# v2 git bundle
8e102440868b7fe28e975ba4cc994bf26772de41 refs/heads/bundle
8e102440868b7fe28e975ba4cc994bf26772de41 HEAD

PACK     xUN#G)JDcZ1,d~AJEKO!<@'R5{.W}]W!=̲!rfa?zGOPaѩC$;	q(L,'GEH`v2Ad'{1Z	ca}p>HmcPD^vOo^#mUt&U.U ObR/GfpUS;RyXjAN[%Aɠa+lҚP"~7?[)A`O*B78W6Ȩݖ+*Ie͍Ngƥ0sp%r<e>L+		AUWg9Dܤ~V`DIVKEF{⮠{R	퉦:bΰir EDP()(UAIHaޚYSǰ!HҁBͭAusaPo+m/ȪbIFy'UJ@2ݍ~zn4\?NG*o\͑/$)m%	rle6BZ D#EF>C)<yOB[kD9qPW\*lh]yT9B2{89^<N/.Fi󋖵s\u3<>"躹xJǽDUϺՕ`'#a e᛫f^x6V6v=9A,$O{ؙdyGU%6^p!YUp&AJBe$Z=w6@:R$	`u+N}Hi_ϯF*&|n9n9dd~y~4f9ZK+
y'BfMW6a&=+Eo' 9=BSz	j\Kق鴆]%^Bɱ&r.p<˳PF߬z!s>3rI##	fwff6B!y%1B	?4c1v:c}<6!K	]bc?l>xSn@)昊:CUU5DK+qm׻uJx\x@U}AQ*0u|Qj4[B$=y!Y-%UulYi(鴨3`wÕjBcN=-m[I.[MA=Mȗ(WyeMbIVRB(Zu6<,V__C W@H[QY$)m4Eٶ=Lh֫oO
?m 2Р-5ǣ⻼i^v=>Dy7N3U,XPv$ +k9xV@QL`hE|)4Yag+a%l}ۢ_V
}aN:#xHD{Otc
c\zaspt'rq dK4jVa:0#w<0L
Vu#cp£v064b`[3i丸%9xK}n)$ɯ?:9~Zcˠ5[2ɉST']!GIOdp#%rS}.d^xxtree 7d9cdc26ea0ed38bfe314660cee41a45c6b1f0df
parent 5346d6d0c96a0d3c3ca5265a547bc15287bdc87c
author skyai_dev <cloudtech@juleslive.net> 1757130761 +1000
committer skyai_dev <cloudtech@juleslive.net> 1757130761 +1000

Add landing pages library with comprehensive components and demos

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
4xJtree ccb2158592ceba49d06740f80a99a3bb0faae9d1
parent 876eb301a0d004dfd6c7e550c1ab532832f97dbb
author skyai_dev <cloudtech@juleslive.net> 1757014657 +1000
committer skyai_dev <cloudtech@juleslive.net> 1757014657 +1000

Add comprehensive library expansion with new components and demos

- Add new libraries: ui-accessibility, ui-animations, ui-backgrounds, ui-code-display, ui-data-utils, ui-font-manager, hcl-studio
- Add extensive layout components: gallery-grid, infinite-scroll-container, kanban-board, masonry, split-view, sticky-layout
- Add comprehensive demo components for all new features
- Update project configuration and dependencies
- Expand component exports and routing structure
- Add UI landing pages planning document

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
4&;xAtree 12c695930832d906bb579313cc3588a011e57f35
parent 2f56ee01b38996376a067c4d1bae4046cbf2c4d9
author skyai_dev <cloudtech@juleslive.net> 1756952927 +1000
committer skyai_dev <cloudtech@juleslive.net> 1756952927 +1000

Restructure layout components architecture

- Move layout components from layouts/ directory to components/layout/
- Reorganize divider component from data-display to layout category
- Add comprehensive layout component collection including aspect-ratio, bento-grid, box, breakpoint-container, center, column, dashboard-shell, feed-layout, flex, grid-container, hstack, list-detail-layout, scroll-container, section, sidebar-layout, stack, supporting-pane-layout, tabs-container, and vstack
- Update all demo components to match new layout structure
- Refactor routing and index exports to reflect reorganized component architecture

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
ѨSnx"tree 3181f9e6ef3d8c77eb44cae64e20130ca665bfea
parent 2bbbf1b9f10d8191187a00720db7b0322484f2c7
author skyai_dev <cloudtech@juleslive.net> 1756900452 +1000
committer skyai_dev <cloudtech@juleslive.net> 1756900452 +1000

Rename shared-ui to ui-design-system

- More descriptive name for design system library
- Update all imports and configurations
- No functional changes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
	(xptree c5d132ff1e6eeb7e96d99f8f7014695b90505e5c
parent e9f975eb02be74f3221c21339be6db4cf7e58b1e
author skyai_dev <cloudtech@juleslive.net> 1756900245 +1000
committer skyai_dev <cloudtech@juleslive.net> 1756900245 +1000

Add comprehensive UI component expansion

- Add new components: enhanced-table, fab-menu, icon-button, snackbar, select, tag-input, bottom-navigation, stepper, command-palette, floating-toolbar, transfer-list
- Refactor table-actions and select components
- Update component styles and exports
- Add corresponding demo components

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
oő?xSKn1)lEx$iD*H rf1cBzl8 gD3AdÆ{ P8|Z1V@EC./J>eE.eL 9cPy9;jF5B%]OY͎:r" odc\,(-r"fj-CgK!*|4HZoeh4x@
<J{@fi"
Ԛ,?`UʙXL`N>[%**E|k. rDGq7ד&w/?ucZĭA*$xĮPYKѕ
M8'¡}5$'{34W[ۋ&7/$țHmե8MPTÒ`	bX'Ő9gd;s>\;Ľ*Vg sr	ℨ4(:hdG=a_FDphT		vHݦZg0-Y1ϲ_߾%`?|\)AZ>~8frq~e+;ZzwNVVl+?e~b:xSAn0{lQ']K cEIoEQȕņ"r}HyB$=EٙYkWR^VsjqTN[j\ňCMtZ{ZoQ/e\,P˶^WM{R'ͤoRfOdUj˦w,0ҋGknbDp.2OzrQDKNp(3B&pYvپ0 '.Ӡr0KNz>`qXKz'Ƒ֧	?fmA&3v$;%i).l-r^Y4ģ8ؒBb4%޹ 2#mӑHcpov]dNn#K{
38NgMQS[if Ey)ӨSr)0Z<(GT!Y6 OvHcp<lOHN0#b$5}y3BMs4Job6N+'n$O/1\'9GZxUr6+PdzVz7R.Ak.|Bdr4{zSp::h2Lt0!'כh2[*=)x8r,$>xS9Mxsc{lzb6$O֚V+:.dh2N&}%gy2Sp0g @r0z8ޙYIk;d+Z*LBג+jU)t/%SѬa>Im/?Ow5H<OLc%@TTӉ0Z)K%9XZ3.nT7-&ԵjAv`\$TV*%+s/E(ȷ`h܈*nUƩPToUŦ
O][4j<4d &T7-7a7(Zϊ`#䞿1[gu~!f+ej<γ/}mɅ	\4*"cU{k<+Zs~E[SXOGZ+H#5:۩`,0Lw@cٚC^݀|Ur ɪԦp+YW*> R7r"@a KGKeg<r%2i9:mZh]?vl2c==)C5SiZS7qUޤ%vnLS Gp~yxftdV:2kUT` +ynK=19*1~_P\\_\/w⸐--IYd)\@f&%E,]ĚgKV\a;qawC4c@`Đca6>yNzNԽqE"rjD$ɿJطcEWDć\`,~I`UJ<t	"+%AcZė?xSˎ0++0jH2Bqȏ'̲%NpDfQຘbYb-g3Q!_RHZЦ6YLecjQVeJ"WLP"dau=ϒp+2hDM^#M;(Vz9_o<mUl+%0G!Eؠ*%0(kkLBE$KGl;G|CrR*j©.j;M-? {}zj%@Waz:&gxN1ÕoGФA59բGNDS2N=wgEHNU<stoc|	Ks2%2ccVӔocKETZvu3!8U@~@}iI0xTXX';%h^ND<S8s~0w2CQā{eVk{bR+ߐ|ôE%<ϲ|wd()!>4xvVҧ&Lb
βoMԭNuhQxtree 637c3214a91d68bab3dfcdd14aff20df085dac63
parent 59837227935cfb16ed5b8b0ccadb24115f7fffff
author skyai_dev <cloudtech@juleslive.net> 1756849834 +1000
committer skyai_dev <cloudtech@juleslive.net> 1756849834 +1000

Fix SCSS semantic token variable errors across components

- Replace incorrect semantic token names with correct ones:
  • $semantic-border-width-thin → $semantic-border-width-1
  • $semantic-color-border-default → $semantic-color-border-primary
  • $semantic-spacing-content-* → $semantic-spacing-component-*
  • $semantic-typography-body-* → $semantic-typography-font-size-*
  • $semantic-typography-caption-* → $semantic-typography-font-size-*
  • $semantic-motion-easing-standard → $semantic-easing-standard
  • $semantic-color-surface-tertiary → $semantic-color-surface-secondary
  • Various hover color tokens → base color tokens

- Fix typography map usage errors:
  • Replace heading map tokens with individual size tokens
  • $semantic-typography-heading-h* → $semantic-typography-heading-h*-size

- Update affected components:
  • tooltip, divider, progress-circle, range-slider components
  • Related demo components and SCSS files

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
c5xQtree 794ddc18509a3b763ceba8406a555d2b827cba98
parent c803831f607e5932af9a59d688fea81fc399e337
author skyai_dev <cloudtech@juleslive.net> 1756841889 +1000
committer skyai_dev <cloudtech@juleslive.net> 1756841889 +1000

Add comprehensive component library and demo application

Added extensive component library with feedback components (empty state, loading spinner, skeleton loader), enhanced form components (autocomplete, date picker, file upload, form field, time picker), navigation components (pagination), and overlay components (backdrop, drawer, modal, overlay container). Updated demo application with comprehensive showcase components and enhanced styling throughout the project. Excluded font files from repository to reduce size.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
m+PYxktree a717ee546366a9dc9ddb649dd9c4a1ad9ba433d0
parent cd3211101c0e67d9034b246cb2fe675b055c4b1b
author skyai_dev <cloudtech@juleslive.net> 1756772644 +1000
committer skyai_dev <cloudtech@juleslive.net> 1756772644 +1000

Add comprehensive semantic design token system

Implement complete semantic layer for all design tokens including typography, spacing, motion, colors, borders, shadows, z-index, opacity, and glass effects. Each semantic token maps base design tokens to contextual usage patterns for improved maintainability and developer experience.

Features:
- Complete semantic typography system with font weights, sizes, line heights, and letter spacing
- Comprehensive spacing tokens for components, layouts, and interactions
- Full motion system with durations, easing, transitions, and hover transforms
- Semantic color system with individual access to all Material Design 3 colors
- Border tokens with widths, radius, and styles for all use cases
- Shadow system including standard and AI-themed shadows
- Z-index layering system for proper stacking context
- Opacity tokens for transparency and visibility states
- Glass morphism tokens with blur, opacity, and theming support

All semantic tokens provide direct access to base token values while offering meaningful contextual aliases for common UI patterns.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
xQ
0 tmN&Et=ݘ-Ē91$~q$pcT<P(`0unćRm}R*W֛rL9ٞ眡,r#`|q;x340031QH(I++*c(\^º۫֮^eQXQ6)9+׾9x?_@$8jآ[O[c^mʩE|o IN32x31 $g#l4<Ja5gEC3ҤdĂLb̵%O¬4oig wx340031QH,-ML++.HM+)f0sQdJ#J`PR!rʎpO0Uk_ KR1*%.z0u
 
2JRSJNc*Nk$G2Ԝb{Si6C滢FԢbE;'q+%( STx340031QH,-K/M,J+)fb뛑5Oo<uM饩%g]>  kx340031QH,-+I-JN-(/+)f5/2aޮ/U\ }x340031QH,-OI)+)fڳ݀o7YN ;x340031QH,-())+N-*LN+)fV+ZQ$ܰ3i]IHf[5aCzd??VvͅӢg^UV[#||pxcڒ<du>y;P1k (Erx' 100644 favicon.ico WaOuУ+04x8 100644 animations-demo.component.ts kTѐ?}da<Eͤx4 100644 appbar-demo.component.ts ;JQ~' )vx4 100644 avatar-demo.component.ts m]
'l6ٔs/wx3 100644 badge-demo.component.ts ul	+<B̙`x4 100644 button-demo.component.ts DMolD;#Ͻ.nx2 100644 card-demo.component.ts }2Y[1zuuMx6 100644 checkbox-demo.component.ts 1J0|I3Ob
+reXx2 100644 chip-demo.component.ts 7@+	4S*Ytxj 100644 column-demo.component.scss Ů[^o,*hO100644 column-demo.component.ts և&&$rч:Y5(rx| 100644 dashboard-shell-demo.component.scss V]/$5|3100644 dashboard-shell-demo.component.ts }owyɷ4x8 100644 data-utils-demo.component.ts Q+t_':	&xt 100644 date-picker-demo.component.scss fmIUF3KO	 100644 date-picker-demo.component.ts nACTr`{hǿ&u~,x )100644 font-manager-demo.component.html E+&IĮJ
5\100644 font-manager-demo.component.scss cƋ'o)DYy100644 font-manager-demo.component.ts R.pˇ}100644 index.ts 5
]J8۫2{:s*FUx 
100644 hero-sections-demo.component.html =nwGt?Z|100644 hero-sections-demo.component.scss \U+8-ؘ5ѣԐ100644 hero-sections-demo.component.spec.ts 65,uVV100644 hero-sections-demo.component.ts F}_ *WUqS_ޤxt 100644 icon-button-demo.component.scss .{.QRcDb@)100644 icon-button-demo.component.ts pgNE/lx3 100644 input-demo.component.ts f{"%Dvϫ#x9 100644 landing-faq-demo.component.ts V&&ھ{<DqS.;Ŭx< 100644 landing-footer-demo.component.ts ~-d	Ƭx< 100644 landing-header-demo.component.ts [ꬦ%`K`[I0dx: 100644 landing-team-demo.component.ts ڰIv~V4V+^Tx? 100644 landing-templates-demo.component.ts "R5:0]%!OwsCx> 100644 landing-timeline-demo.component.ts >A>,G_w36x2 100644 list-demo.component.ts %/6T[p؛A8:'xl 100644 masonry-demo.component.scss pX[W:jZI100644 masonry-demo.component.ts Ҟ6e"߀h/R7FG-x8 100644 pagination-demo.component.ts %R/b/6H6Цx6 100644 progress-demo.component.ts 8orQGAp1M ^.x3 100644 radio-demo.component.ts gLzgtN}&w佤x4 100644 search-demo.component.ts s<rҲL'Cax4 100644 select-demo.component.ts aoN^/I |m$xx 100644 sticky-layout-demo.component.scss :w/+100644 sticky-layout-demo.component.ts /9u#y,u0*x4 100644 switch-demo.component.ts t9o)J˲7;x3 100644 table-demo.component.ts []7Ӛ,\. fC_x7 100644 tag-input-demo.component.ts e	W' N0Gx6 100644 textarea-demo.component.ts 36xID)i,/Gxt 100644 time-picker-demo.component.scss fmIUF3KO	 100644 time-picker-demo.component.ts "
v10WC!xr,߬x, 40000 layout-containers |WrN,"fxt 100644 layout-container.component.scss ^ZnmWYZcv?[100644 layout-container.component.ts Ǵe,<UQ")yŚ6.ݫx{ 100644 _colors.scss "fа.zGtl2}100644 _index.scss iDy:100644 _typography.scss dK&[Y*Kz3YxG 40000 lib 6rL̜~H|9100644 public-api.ts 'UdD\nD@Iԣx340000 core }*_BX哺AM100644 hcl-studio.component.spec.ts (
]qWT !Qg100644 hcl-studio.component.ts 8`8T4g!100644 hcl-studio.service.spec.ts e1 J(ĉp~>100644 hcl-studio.service.ts xYJʖARBe840000 models CH.)4v؍bc]40000 themes ^ u|gᙧ'KT!xlx\ 100644 hcl-converter.ts O>tkBD100644 palette-generator.ts ċH\5O2V(%x) 100644 hcl.models.ts ,UN=|$7f]w
«x t100644 css-variable-manager.ts D򹉂N+0Adn$100644 theme-presets.ts gAg*Nru%100644 theme-storage.ts U㨪~oGa5xG 40000 lib 4iNGU!M:/5p100644 public-api.ts sIײ .19,Yx %100644 shared-utils.component.spec.ts 6V̳kS:3}se100644 shared-utils.component.ts 9#, Z(¶:ŧ100644 shared-utils.service.spec.ts HNQe/-)J
b|100644 shared-utils.service.ts 4FR/i !?lRxG 40000 lib ǝNtݴ_]^100644 public-api.ts PIjA2,U-kx[40000 components @;ٷ40000 directives bh
jN{Z-40000 services ZnYnwǭE40000 tokens m\	SH?b<100644 ui-accessibility.module.ts cZ>M7VX{100644 ui-accessibility.service.spec.ts R44@v[&;100644 ui-accessibility.service.ts ߋ`jmԜ?&0ks40000 utilities ,ao(k[ .bxR 40000 screen-reader-only IO_A=s40000 skip-links KG`rE$mO!!x_ 100644 index.ts ŷ||i(4100644 screen-reader-only.component.ts J7fo&)(8y2?%ͧxW 100644 index.ts 
y{ͅ~N 100644 skip-links.component.ts l.,*r\EAd$P!ΠxP 40000 arrow-navigation t#?4`ۊ!+40000 focus-trap uKea|j=+oq@ x] 100644 arrow-navigation.directive.ts װh\ &_7+rO100644 index.ts kT^,ВxS%xW 100644 focus-trap.directive.ts f\<igkp^100644 index.ts "vl-hQDl(թzHY"5x 540000 a11y-config p/paA'>ySj>40000 focus-monitor 
`/Bj6LސT峋40000 high-contrast 2]	RnP:40000 keyboard-manager aQ3|LhRO :40000 live-announcer 1Y V-@T~?-)׽LxV 100644 a11y-config.service.ts Sd`qJnY@n100644 index.ts [8^|b0`8-EkCF#exX 100644 focus-monitor.service.ts Dڙ%sl @B100644 index.ts _Ys5*ڜ?Qi>ɂ#xX 100644 high-contrast.service.ts `ZOOX;Q,N100644 index.ts ~ivNyc#9&x[ 100644 index.ts LqHIe100644 keyboard-manager.service.ts $lTr8q}CgohV*$xY 100644 index.ts $ε!NBX4100644 live-announcer.service.ts %4D+)Ԛ"x, 100644 a11y-tokens.scss zxg{ҷ-崩Y"׫x t100644 a11y-utilities.scss ؋idhQo100644 focus-visible.scss 1ꇻ ,b6b100644 screen-reader.scss KRoǮ*fX#!4xh 40000 lib BqI_:|L12W c100644 public-api.ts $2T$tyQhWd40000 styles [4{{MLUs2c&	x b100644 animate.directive.ts Mb+?
{]5R100644 ui-animations.service.spec.ts %T~P!W%100644 ui-animations.service.ts H:&;85_^.Ũ;6	x o40000 animations LC TawdVmN%36	100644 index.scss H#* *h	SDISUK40000 mixins E@yWj.P40000 utilities yBo
iO`]bOd6]
x V100644 _emphasis.scss h1\0v100644 _entrances.scss k<CK^@±'100644 _exits.scss a-*l	tHRk4\100644 _transitions.scss MThŊTT0Cx2 100644 _animation-mixins.scss )bDSTN>Хx5 100644 _animation-utilities.scss tpfZ: e"Ĩxh 40000 lib VYkjus100644 public-api.ts lN|gK}ćGM40000 styles hOnF%-h-!
x R40000 components @S2A~*F3"@40000 directives rTAs7d#7s)40000 services T'S@A5m},ɃKQ>40000 types /xq[ae<I40000 utils \xU㖡
DxJ 40000 backgrounds F#ܖ4ዙ >@d100644 index.ts O1s 2mii!V#{Nx100644 gradient-background.component.ts ϜF6ЭtQ.,s100644 image-background.component.ts ʠ9E4#)6<'100644 index.ts BP4Ӗ\tԆj-ޢB100644 pattern-background.component.ts 9ܞ>MY100644 solid-background.component.ts O<Ȟ;/$k&0AflMxW 100644 background.directive.ts dCAjJX;"<o100644 index.ts S}'e|z*2|#.xU 100644 background.service.ts q{0d,I100644 index.ts 䝫H.gf~z܈$	xS 100644 background.types.ts VUNz100644 index.ts sZPC*ZgxĝxW 100644 background-generator.ts oڇOEhů9)100644 index.ts CW
.[
sFߠ
x _100644 _animations.scss H>fà	 @100644 _base.scss C͜(	^D100644 _mixins.scss ')Ŵ1gUc100644 index.scss @`AblzO'b5Ax 
100644 .package-lock.json FJL*lj<40000 @angular HX[L=St40000 @types #.$h+ݯoLN40000 prismjs ~x}S#ccg"Re40000 rxjs 1}*s\_~s;\40000 tslib 4J:YH0ut40000 zone.js GKUKS6UtΜbvx@ 40000 common V
 O-ӣ]z&'v40000 core vW8k:IX!x100755 LICENSE H)ecPۨ100755 README.md }Z7
A;g46100755 common_module.d-NEF7UaHr.d.ts D%hr<,f]M40000 fesm2022 'ﴺ&n=qs40000 http %%c!YFtr[100755 index.d.ts C>񑴾V{$w840000 locales ,u13Wb8^x100755 module.d-CnjH8Dlt.d.ts VyrSd1u>b4100755 package.json z8r_+&T!0100755 platform_location.d-Lbv6Ueec.d.ts .#vy`n[40000 testing Wۨ)	W06O|PX40000 upgrade ­ನj?M_o-O100755 xhr.d-D_1kTQR5.d.ts h!ap'%:=x&100755 common.mjs $_{ky; 8 B100755 common.mjs.map '>1~"6ah8E#&_%100755 common_module-Dx7dWex5.mjs ;isj(2In+f100755 common_module-Dx7dWex5.mjs.map ~m	MқqPu/p100755 dom_tokens-rA0ACyx7.mjs cq89 =D~܊100755 dom_tokens-rA0ACyx7.mjs.map r2y687j:x;e100755 http.mjs ksa[FvaB7%顼p100755 http.mjs.map @2ZM)@Ÿ40000 http J[Dv8@n%]dZt100755 location-Dq4mJT-A.mjs ;R51Q`W100755 location-Dq4mJT-A.mjs.map 9 H3Ȅ100755 module-z3bvLlVg.mjs 35 lϘKnX100755 module-z3bvLlVg.mjs.map RXz%<C
v0%?H100755 platform_navigation-B45Jeakb.mjs bڀ?DדX"100755 platform_navigation-B45Jeakb.mjs.map ,qG/R100755 testing.mjs ×' Pޥ'%1100755 testing.mjs.map o'яÝU@100755 upgrade.mjs [ḌÓ&y:R
Tv
h100755 upgrade.mjs.map {xq	gsHF/lG=100755 xhr-BfNfxNDv.mjs [-֕陪+$V100755 xhr-BfNfxNDv.mjs.map b%=bSEn	xD1u*xR 100755 testing.mjs 3>HS1\5VC3100755 testing.mjs.map d/*Wj`Se[ШxH 100755 index.d.ts 8KR16]}W3R40000 testing T~ձsN^ɺ {'cXOx& 100755 index.d.ts )[-򔣲!$mB5xh100755 af-NA.d.ts F6Svo.100755 af-NA.js =E@:3u+Q100755 af-NA.js.map kTCH100755 af.d.ts H6~p{Srp8g%100755 af.js  C4߅U<$100755 af.js.map gP^gVMq"l100755 agq.d.ts mj㣅LwXN100755 agq.js 
p!D b+des100755 agq.js.map .RLwv<100755 ak.d.ts Y]a
3D_100755 ak.js 8L}a@\E100755 ak.js.map t3pX|GC100755 am.d.ts Vm2!p;/h100755 am.js @PKEI`100755 am.js.map _'AC100755 ar-AE.d.ts e/(,4:_100755 ar-AE.js tPzD<r0100755 ar-AE.js.map n;&QW100755 ar-BH.d.ts ah^2ubK100755 ar-BH.js ə{hS|NIF100755 ar-BH.js.map =oyK|,100755 ar-DJ.d.ts }Gb&+bS&(}100755 ar-DJ.js !_uuy3O100755 ar-DJ.js.map wA G~ [100755 ar-DZ.d.ts ah^2ubK100755 ar-DZ.js ɺ_h[Y'xY('Î100755 ar-DZ.js.map ܝEShI~#0100755 ar-EG.d.ts ah^2ubK100755 ar-EG.js 0"K篘k0100755 ar-EG.js.map 819g|5y.3100755 ar-EH.d.ts ah^2ubK100755 ar-EH.js ~ٙFRlp100755 ar-EH.js.map A w.@2^ 100755 ar-ER.d.ts So$:J)kg100755 ar-ER.js &gӢ {c}_100755 ar-ER.js.map N9Ed2<D100755 ar-IL.d.ts ah^2ubK100755 ar-IL.js :{*Q¥oӉԨA100755 ar-IL.js.map N׎#q`R>100755 ar-IQ.d.ts ah^2ubK100755 ar-IQ.js >v]`fW.&100755 ar-IQ.js.map $Yv[#^~~100755 ar-JO.d.ts ah^2ubK100755 ar-JO.js "/ear#vY{W-100755 ar-JO.js.map hӏB%È100755 ar-KM.d.ts ߦ;}I"\1;)100755 ar-KM.js "v0ߎay~100755 ar-KM.js.map 魲0W~׍ak100755 ar-KW.d.ts ah^2ubK100755 ar-KW.js @HϾI~2`cj100755 ar-KW.js.map WB:4$/'p100755 ar-LB.d.ts 쟇\ەn>100755 ar-LB.js 8"uZM3w$Ka100755 ar-LB.js.map l
j־l,OwP100755 ar-LY.d.ts ah^2ubK100755 ar-LY.js Yhx˄bWty100755 ar-LY.js.map iNϣb?=100755 ar-MA.d.ts ah^2ubK100755 ar-MA.js hd9v-KW100755 ar-MA.js.map aK.pd*}L100755 ar-MR.d.ts ah^2ubK100755 ar-MR.js R 	ls<߭100755 ar-MR.js.map 2%JF+@F100755 ar-OM.d.ts ah^2ubK100755 ar-OM.js ⬪'>/}lw%R*ۆmH100755 ar-OM.js.map v"@Vyz~#F@䰡100755 ar-PS.d.ts ah^2ubK100755 ar-PS.js  2©@}d:Թ:100755 ar-PS.js.map 
C.">]3fEzipm100755 ar-QA.d.ts ah^2ubK100755 ar-QA.js J·}ߤ0100755 ar-QA.js.map 4FT100755 ar-SA.d.ts ah^2ubK100755 ar-SA.js q Q"VHe},Q7cdA5100755 ar-SA.js.map UvnӍ
ο@AD)100755 ar-SD.d.ts ah^2ubK100755 ar-SD.js L{io100755 ar-SD.js.map NFaV8K<(DB100755 ar-SO.d.ts wItwW,8 }d100755 ar-SO.js $XGd#100755 ar-SO.js.map HIVݒZJ؍vR}100755 ar-SS.d.ts "x" &w100755 ar-SS.js Ƈ/#&>\F-0u6100755 ar-SS.js.map (ejizU/Bɕ100755 ar-SY.d.ts ah^2ubK100755 ar-SY.js }ӭUŚPVC100755 ar-SY.js.map +̰q@D{?100755 ar-TD.d.ts ah^2ubK100755 ar-TD.js g"]Ipʙyl100755 ar-TD.js.map bȘȩ	9</GWϝ100755 ar-TN.d.ts ah^2ubK100755 ar-TN.js Ӯ
=$uyN>֩ ڰ100755 ar-TN.js.map !}ˌX?6A100755 ar-YE.d.ts ah^2ubK100755 ar-YE.js '1ϭоmH]jFۃal100755 ar-YE.js.map eɀmX8M100755 ar.d.ts ah^2ubK100755 ar.js Ɏmic3#P^>100755 ar.js.map ONbwnXs7$'(100755 as.d.ts ^~V5&9xt@PD100755 as.js 8CӊD&RH100755 as.js.map O˵MD!%100755 asa.d.ts p!Q{䌀-Q=100755 asa.js /Ih-mĽ100755 asa.js.map ~|
q^]w100755 ast.d.ts N#ƪS@0QNW100755 ast.js LȏYMpVL7}100755 ast.js.map |Jsk100755 az-Cyrl.d.ts ',{+͸T}cjGy100755 az-Cyrl.js [KWPjh9iJr~̿100755 az-Cyrl.js.map ?	4.*I100755 az-Latn.d.ts wmg?100755 az-Latn.js 9ᕮLfh<8s,100755 az-Latn.js.map q
7=k]qkI100755 az.d.ts wmg?100755 az.js 'ƍ^ x/-.100755 az.js.map t>Iг
Xap,A100755 bas.d.ts mj㣅LwXN100755 bas.js 7ØMFfarFEP100755 bas.js.map yd𠬱':Ϻ100755 be-tarask.d.ts DUnV,/n`Y$100755 be-tarask.js =:` |6/u txP100755 be-tarask.js.map ]Ky
;u4pǸ100755 be.d.ts DUnV,/n`Y$100755 be.js K%/m(to3100755 be.js.map (mdEQd*100755 bem.d.ts dHP"#?cutbw100755 bem.js ";J+0yyǔ100755 bem.js.map r$P!֛/9100755 bez.d.ts p!Q{䌀-Q=100755 bez.js AP.}\F'j	100755 bez.js.map S'µkdu100755 bg.d.ts 3ϓ3WxN>­坐100755 bg.js tA,!CKЮ100755 bg.js.map l비ݳh|\100755 bm.d.ts mj㣅LwXN100755 bm.js U)+htjpSQ$100755 bm.js.map >kMkt/@f2
^100755 bn-IN.d.ts ФnDVk}ʸ޷XL100755 bn-IN.js H.Ҿ3Y"52z100755 bn-IN.js.map %4XYߔ)t-100755 bn.d.ts ФnDVk}ʸ޷XL100755 bn.js 5dڡcݵ0)Ee}100755 bn.js.map "_䃼Cr_v8100755 bo-IN.d.ts mj㣅LwXN100755 bo-IN.js CI"*kQfP100755 bo-IN.js.map sKi%DF}j0100755 bo.d.ts ӑ`H(gY#Ca100755 bo.js 1Kk lpX0_k100755 bo.js.map vy!1H3vE100755 br.d.ts Uހ`M100755 br.js MϜ8;v*100755 br.js.map gtm3J˔ˎY100755 brx.d.ts ^PPeW2a֮100755 brx.js #nC]n8i׏pg3100755 brx.js.map j2HusX	p6d100755 bs-Cyrl.d.ts %Ro(n100755 bs-Cyrl.js bN!ݥ83cXph100755 bs-Cyrl.js.map nQ3=HwG100755 bs-Latn.d.ts Pڪ:^qwܽ5:r)100755 bs-Latn.js PY|3[nɾDw3100755 bs-Latn.js.map |ZݼQIo,100755 bs.d.ts Pڪ:^qwܽ5:r)100755 bs.js u|&)Zvd	E100755 bs.js.map P&>_ΨFSN100755 ca-AD.d.ts @# Qz+U100755 ca-AD.js $IùC!zط&100755 ca-AD.js.map tfo0|M?i100755 ca-ES-valencia.d.ts @# Qz+U100755 ca-ES-valencia.js 26넍#S100755 ca-ES-valencia.js.map jp*̂b4C100755 ca-FR.d.ts !ſyb,m s100755 ca-FR.js zlS%2g9-6V100755 ca-FR.js.map w@<'##B100755 ca-IT.d.ts @# Qz+U100755 ca-IT.js {͢J5ӏ~|100755 ca-IT.js.map &8aԁ٠IJl100755 ca.d.ts @# Qz+U100755 ca.js 1;M5=ZBo8N[S100755 ca.js.map j^U+/2100755 ccp-IN.d.ts &>/Rt'rֿ:100755 ccp-IN.js 5`֩}ͺ%h100755 ccp-IN.js.map CmA
as100755 ccp.d.ts &>/Rt'rֿ:100755 ccp.js Mb$oڣoa0g{
100755 ccp.js.map DRQE|\100755 ce.d.ts v 	<(q#̬ȟ100755 ce.js \jiz} 8*7U100755 ce.js.map ݶC,V籾Yћ100755 ceb.d.ts mj㣅LwXN100755 ceb.js &ˎw47BjkbD/100755 ceb.js.map .GRӐZ100755 cgg.d.ts zhHy)ZU֌o100755 cgg.js ܗ0Zvvl100755 cgg.js.map kxA+&w}P100755 chr.d.ts YyC3a0M/100755 chr.js S*8P׸b|100755 chr.js.map *nfro100755 ckb-IR.d.ts [t\hhpN'100755 ckb-IR.js L+Ssvle100755 ckb-IR.js.map ݄,דzU2s\100755 ckb.d.ts [t\hhpN'100755 ckb.js Hm:s	jHw)}9100755 ckb.js.map xKf{:چK100755 cs.d.ts r5#a	l100755 cs.js 	rD!b/100755 cs.js.map }-4Nz~SNNh100755 cy.d.ts cr7Bsh*\100755 cy.js "ӘF-n#100755 cy.js.map {jUcN>c׆IC100755 da-GL.d.ts UvӜ& *Pg100755 da-GL.js q"[>5;iMP꙽100755 da-GL.js.map ;M }ʂ\e1Ȣ_+100755 da.d.ts UvӜ& *Pg100755 da.js /.=!`P	100755 da.js.map 2
M!EYƘA100755 dav.d.ts ;Czo
xCui5100755 dav.js 0(sT5>/xqFyϋ(J100755 dav.js.map b,p|]0*100755 de-AT.d.ts Tܳ
LPۉ֖{Ks100755 de-AT.js ŝmy|*PqY100755 de-AT.js.map k	)sa:#2w100755 de-BE.d.ts 5.x(o<r100755 de-BE.js nJ UpH,l>100755 de-BE.js.map MD_d4~6100755 de-CH.d.ts :\[$(7!9̠<100755 de-CH.js ffvA<100755 de-CH.js.map  뎄%z100755 de-IT.d.ts 5.x(o<r100755 de-IT.js U(}arA-㾀.100755 de-IT.js.map /j$A\'q100755 de-LI.d.ts I|\Oe100755 de-LI.js sz跹	&T;jƣ!`100755 de-LI.js.map A΂
}<= G'LW100755 de-LU.d.ts {>?2L#3hx!.100755 de-LU.js _#ry/°̝100755 de-LU.js.map 'wQ^wЎa7Hl100755 de.d.ts 5.x(o<r100755 de.js 1pjУN8``^ʌ100755 de.js.map }MmU>1'"2100755 dje.d.ts mj㣅LwXN100755 dje.js _SE4[CT+W$ӋK#100755 dje.js.map [
e[
aC 100755 doi.d.ts {^+O҇|h{'NY100755 doi.js |&r100755 doi.js.map \5dwy@ fn100755 dsb.d.ts r9dTe'2;100755 dsb.js >MXjJƶل}100755 dsb.js.map aU<	׫{@?
/E100755 dua.d.ts mj㣅LwXN100755 dua.js k*(tj*.C100755 dua.js.map $IPpuy}()100755 dyo.d.ts mj㣅LwXN100755 dyo.js 4"jD^xY/ 100755 dyo.js.map x$cLIR 59vx#100755 dz.d.ts TEC!ͩl~100755 dz.js c+?VH!100755 dz.js.map 11Zn=7vZ100755 ebu.d.ts ;Czo
xCui5100755 ebu.js ĵk¸Yqx100755 ebu.js.map 2aǓ4c̊"$uI100755 ee-TG.d.ts AA&.>NH100755 ee-TG.js ,c+(f[>sii7100755 ee-TG.js.map ;yArf&1Y)hs100755 ee.d.ts AA&.>NH100755 ee.js g5Hي l #100755 ee.js.map ~T}%<Tl#=100755 el-CY.d.ts Sb"^Dﾓ4tH100755 el-CY.js *jxXkp9100755 el-CY.js.map +~AG+$3	xxLb100755 el.d.ts Sb"^Dﾓ4tH100755 el.js NhN/d100755 el.js.map iEXu궇100755 en-001.d.ts mj㣅LwXN100755 en-001.js ?9Ԭ0b>100755 en-001.js.map 2V8*gĕ100755 en-150.d.ts mj㣅LwXN100755 en-150.js ka}ibXirf-C100755 en-150.js.map ܘG"ķ"r?ԜՐ100755 en-AE.d.ts ()QٸdC;ÀH100755 en-AE.js 1cZX{{Hx100755 en-AE.js.map lY(S#eM׏ʨ100755 en-AG.d.ts xjX0D+zCr100755 en-AG.js u$ltN2100755 en-AG.js.map kߚzf7h^100755 en-AI.d.ts xjX0D+zCr100755 en-AI.js ;2+c)`VJi^100755 en-AI.js.map yykJظFcT\	100755 en-AS.d.ts ()QٸdC;ÀH100755 en-AS.js C::8̻84M100755 en-AS.js.map  -,YH.";|,Hm100755 en-AT.d.ts mj㣅LwXN100755 en-AT.js xTvقfJjM{m0100755 en-AT.js.map l)aXssnyZ100755 en-AU.d.ts \U5ڛk<g100755 en-AU.js Qܘ-R &100755 en-AU.js.map @HM(#V>Ϙ100755 en-BB.d.ts YxD>'Y#m-100755 en-BB.js VxP#WY8+Y100755 en-BB.js.map օJ܀!F7]v100755 en-BE.d.ts mj㣅LwXN100755 en-BE.js *b%+{h?100755 en-BE.js.map JHlD쒗)RlH100755 en-BI.d.ts <X-MԚWcƳ100755 en-BI.js ?sk Hh8eugj100755 en-BI.js.map jGG8\r@ȃ1100755 en-BM.d.ts и6ʢz<G[j}100755 en-BM.js Bl܄100755 en-BM.js.map ̌a]Pi5100755 en-BS.d.ts >d/dY4:{% *100755 en-BS.js @4-uWKgerNSÑI100755 en-BS.js.map ]l=PuJTKx100755 en-BW.d.ts (-:ZF=bm100755 en-BW.js T*avy/m+100755 en-BW.js.map y{=Ǩ8JVw:7100755 en-BZ.d.ts SvLbѥbWea6_~8[100755 en-BZ.js 2&ִV8l~100755 en-BZ.js.map U5=Rkw)=	100755 en-CA.d.ts ׿D7cֶ 100755 en-CA.js 	B)_pSdZl;f100755 en-CA.js.map 6fw]y100755 en-CC.d.ts $)k8^[oi:*B1z100755 en-CC.js S[K:d100755 en-CC.js.map pp8@v!#ܲ9100755 en-CH.d.ts mj㣅LwXN100755 en-CH.js R~j՜+nVo100755 en-CH.js.map C
ϥhiږ(QE100755 en-CK.d.ts Bp5Da>xND`ߤGF100755 en-CK.js s9Fm;id100755 en-CK.js.map teln100755 en-CM.d.ts mj㣅LwXN100755 en-CM.js yԠTwgW!RFK100755 en-CM.js.map rO]S+5A0100755 en-CX.d.ts $)k8^[oi:*B1z100755 en-CX.js 0b`U*
2$$;100755 en-CX.js.map WxIHFLǂ/100755 en-CY.d.ts mj㣅LwXN100755 en-CY.js CDpjDѬz100755 en-CY.js.map m!&@+Cr100755 en-DE.d.ts mj㣅LwXN100755 en-DE.js dު`o'w)%[100755 en-DE.js.map ^ /a5V،,m(100755 en-DG.d.ts mj㣅LwXN100755 en-DG.js Hi( 5Uj;@r100755 en-DG.js.map  KtC[6ɩW100755 en-DK.d.ts jn:ӹkCc100755 en-DK.js N;|?f!100755 en-DK.js.map 	?
Y100755 en-DM.d.ts xjX0D+zCr100755 en-DM.js sS4ȺAWd100755 en-DM.js.map }j̋/fwOm100755 en-ER.d.ts 	|n4
oYʩk3100755 en-ER.js F~sOzE7V_100755 en-ER.js.map s!x(~Lzc.V100755 en-FI.d.ts mj㣅LwXN100755 en-FI.js nvZ˪F"100755 en-FI.js.map Dk`f]safV100755 en-FJ.d.ts Vhs5]&s100755 en-FJ.js {S(NO2]100755 en-FJ.js.map &%cDILl7:100755 en-FK.d.ts )Hu5ƃud100755 en-FK.js Zd]Գt 100755 en-FK.js.map b0@{:u4r8100755 en-FM.d.ts mj㣅LwXN100755 en-FM.js tp#xRyvK	K100755 en-FM.js.map d	sfۍନ100755 en-GB.d.ts mj㣅LwXN100755 en-GB.js ʮJ|sBM[<
U100755 en-GB.js.map x(ޟ$ƿ8"e K100755 en-GD.d.ts xjX0D+zCr100755 en-GD.js W䡼TO<%2xq100755 en-GD.js.map K,PRG]C1I
C100755 en-GG.d.ts mj㣅LwXN100755 en-GG.js S-H%z}#&Ͳ100755 en-GG.js.map =LIrV: 100755 en-GH.d.ts Y]a
3D_100755 en-GH.js _PSPE100755 en-GH.js.map b%c`G"d100755 en-GI.d.ts TG9L%h"100755 en-GI.js o#Ox\S_gdǔ100755 en-GI.js.map eF	\zx}kmA100755 en-GM.d.ts `NX7\8UZEqZ( 100755 en-GM.js Yx*)JS*|100755 en-GM.js.map vvsJ22fR100755 en-GU.d.ts ()QٸdC;ÀH100755 en-GU.js QOh{ۋk"100755 en-GU.js.map ,퀤xhu ڈB100755 en-GY.d.ts T{gVj<,ǅgZ#100755 en-GY.js `	!B@MUNQ#100755 en-GY.js.map bZA:-`ϊ6100755 en-HK.d.ts mj㣅LwXN100755 en-HK.js ЎH+@[x.HL100755 en-HK.js.map Oi,""kvY100755 en-IE.d.ts mj㣅LwXN100755 en-IE.js A^_HA쁞俣z100755 en-IE.js.map ӕ'.SGv100755 en-IL.d.ts mj㣅LwXN100755 en-IL.js 6<;M3hG6cI100755 en-IL.js.map ql)Rp\100755 en-IM.d.ts mj㣅LwXN100755 en-IM.js 0a;&100755 en-IM.js.map ?تS$ X<3100755 en-IN.d.ts 4u17eq100755 en-IN.js 3F޶|㓆100755 en-IN.js.map ;+Lc&3100755 en-IO.d.ts mj㣅LwXN100755 en-IO.js 8/A?
h	100755 en-IO.js.map 3Z+j\7=100755 en-JE.d.ts mj㣅LwXN100755 en-JE.js 6[ nv5x34*100755 en-JE.js.map ef-*<g8Z100755 en-JM.d.ts kpwLs_]100755 en-JM.js vz}F~HxgUa@100755 en-JM.js.map rwy*l{100755 en-KE.d.ts ;Czo
xCui5100755 en-KE.js 5[SE)}MzE1i]j9100755 en-KE.js.map !Km33100755 en-KI.d.ts $)k8^[oi:*B1z100755 en-KI.js fDdٛ7\Y100755 en-KI.js.map ݢtGt)|/#E5100755 en-KN.d.ts xjX0D+zCr100755 en-KN.js rrFMdkf8100755 en-KN.js.map Uʧz!(%PUgc4|gY*100755 en-KY.d.ts JB1Obudap@100755 en-KY.js OmųY~Q_xo100755 en-KY.js.map {TqK@%ͳ100755 en-LC.d.ts xjX0D+zCr100755 en-LC.js BY|Ƃ Տ100755 en-LC.js.map [;I|~ l100755 en-LR.d.ts .;dUI[i.j<D100755 en-LR.js gJy&'?dW"100755 en-LR.js.map `Į#M5|uN100755 en-LS.d.ts O>9J=*$100755 en-LS.js [Qhf3H`:7100755 en-LS.js.map ұ)xluQ'[dg100755 en-MG.d.ts ^@2!r<100755 en-MG.js ^ј<&>CMG 
i100755 en-MG.js.map \K TN6"<503100755 en-MH.d.ts ()QٸdC;ÀH100755 en-MH.js  raJ͡U/ݬL3'100755 en-MH.js.map So=tr29/F100755 en-MO.d.ts fO={>濜}100755 en-MO.js e3E?b*5Cr~100755 en-MO.js.map S- PGN100755 en-MP.d.ts ()QٸdC;ÀH100755 en-MP.js ?Ѳ8gx100755 en-MP.js.map -B<\^+AK$t100755 en-MS.d.ts xjX0D+zCr100755 en-MS.js ̡QDXr{Z@+P100755 en-MS.js.map vIȥkO*100755 en-MT.d.ts Gz*
OHxh100755 en-MT.js  ykCKΫ_:100755 en-MT.js.map ܡV`.	Յ/>100755 en-MU.d.ts QhF O!Rh100755 en-MU.js L'#100755 en-MU.js.map 0t7fQυY%n100755 en-MV.d.ts {Ϛ6gȑWD~100755 en-MV.js B(*ؤHȒ(100755 en-MV.js.map |A[\100755 en-MW.d.ts Y+U΃XЂI9b1F~!100755 en-MW.js |'1GG]sy=l`100755 en-MW.js.map G|jՕ|A킡100755 en-MY.d.ts TT6gfLUJ!100755 en-MY.js @fCH!U100755 en-MY.js.map HqtdMm	^M100755 en-NA.d.ts lL']5w^8?P/100755 en-NA.js 03t2q8[jcHf{#100755 en-NA.js.map gmw@+^5Վ7vL100755 en-NF.d.ts $)k8^[oi:*B1z100755 en-NF.js ˋۉV><6#$,100755 en-NF.js.map ^VåXtƭ100755 en-NG.d.ts 4'-~>)	c100755 en-NG.js O0Rj]^O@և%100755 en-NG.js.map Ӧ	crQ
4IR100755 en-NL.d.ts mj㣅LwXN100755 en-NL.js $(iezSmI,q100755 en-NL.js.map %L\ug5zl100755 en-NR.d.ts $)k8^[oi:*B1z100755 en-NR.js 4eַE{GS\)CF100755 en-NR.js.map u[9&Lą	lt100755 en-NU.d.ts Bp5Da>xND`ߤGF100755 en-NU.js Y.TT>N9$(~ѻbx100755 en-NU.js.map GO4=:Kd100755 en-NZ.d.ts Bp5Da>xND`ߤGF100755 en-NZ.js yw&IQ_;ͩ\100755 en-NZ.js.map jFXsTU5100755 en-PG.d.ts .z23'S,G100755 en-PG.js H&{-pZ#/^Fe100755 en-PG.js.map cO5u4u~Pu',fb100755 en-PH.d.ts ()QٸdC;ÀH100755 en-PH.js Ѯq-gbr100755 en-PH.js.map OFRߌ?TL2100755 en-PK.d.ts 碫B.8JכHL100755 en-PK.js //TnŘ:100755 en-PK.js.map #UOuނ100755 en-PN.d.ts Bp5Da>xND`ߤGF100755 en-PN.js TW\}.+'}#J100755 en-PN.js.map 	`{v<5G,100755 en-PR.d.ts ()QٸdC;ÀH100755 en-PR.js g]Ձ^100755 en-PR.js.map fU9~100755 en-PW.d.ts mj㣅LwXN100755 en-PW.js fQ}A!Cc̆100755 en-PW.js.map -hd8­n&100755 en-RW.d.ts щ\DxCpT100755 en-RW.js +Q؎pT[܉_a82100755 en-RW.js.map #'Vm
9{7յ100755 en-SB.d.ts TQ/EWUvxX0w100755 en-SB.js ܚA#NF#0J#100755 en-SB.js.map p	Q!MCIX100755 en-SC.d.ts F[x&Wk0d^100755 en-SC.js ?U-!<gu0100755 en-SC.js.map /.M,ߎ5100755 en-SD.d.ts mj㣅LwXN100755 en-SD.js oOZJ
;100755 en-SD.js.map @9U>uƇKs100755 en-SE.d.ts 腙Apg׸27+100755 en-SE.js /d^m[C/I100755 en-SE.js.map S<qLl 100755 en-SG.d.ts g3+|xJU	100755 en-SG.js jSo!`"Шt100755 en-SG.js.map UcF+|2±ͣ100755 en-SH.d.ts $ٛEqc100755 en-SH.js @K#wOHlg:100755 en-SH.js.map -baE8؞߃ul100755 en-SI.d.ts mj㣅LwXN100755 en-SI.js n@U\X0100755 en-SI.js.map ++WPq#G100755 en-SL.d.ts d@wy7Gqi100755 en-SL.js cuA
/5D100755 en-SL.js.map u˜su']iK100755 en-SS.d.ts F6̈́SԽӁ100755 en-SS.js coYت%,џ100755 en-SS.js.map }$sqp:B100755 en-SX.d.ts ghzTwΓgxRR100755 en-SX.js Hr,LQ=ك> ָ100755 en-SX.js.map j]JWOŤ.6y2100755 en-SZ.d.ts OSb>90P100755 en-SZ.js  vKneMd1E2100755 en-SZ.js.map %'G:W_L100755 en-TC.d.ts mj㣅LwXN100755 en-TC.js )^~|k*]sDL100755 en-TC.js.map 'P93;Vp'100755 en-TK.d.ts Bp5Da>xND`ߤGF100755 en-TK.js ]4?_Hh?,Z*C100755 en-TK.js.map 2>e34-:GB100755 en-TO.d.ts 1zb\qҋteDS100755 en-TO.js QYEUzSgiPʙG100755 en-TO.js.map ec>λU_e100755 en-TT.d.ts |pPaT<(' 100755 en-TT.js `.8k˃s&jF100755 en-TT.js.map ٫@sXÓּǻ100755 en-TV.d.ts $)k8^[oi:*B1z100755 en-TV.js P.??xi׹100755 en-TV.js.map ,On`lT100755 en-TZ.d.ts p!Q{䌀-Q=100755 en-TZ.js 	Td@ON7100755 en-TZ.js.map {~]gvpD100755 en-UG.d.ts zhHy)ZU֌o100755 en-UG.js if@/#k	Q)w	100755 en-UG.js.map >\ۂEqM(ר100755 en-UM.d.ts ()QٸdC;ÀH100755 en-UM.js (B?4ڎ5100755 en-UM.js.map Dw\C('100755 en-VC.d.ts xjX0D+zCr100755 en-VC.js ի4؟VR2v100755 en-VC.js.map 裛`%{ I100755 en-VG.d.ts mj㣅LwXN100755 en-VG.js eY%rH`0E}100755 en-VG.js.map o*<Ndc^n=@100755 en-VI.d.ts ()QٸdC;ÀH100755 en-VI.js 辸D?']gIo1L_Z100755 en-VI.js.map 5+^l,ad100755 en-VU.d.ts Dtan100755 en-VU.js DO	/jU100755 en-VU.js.map <Y~ip*өge100755 en-WS.d.ts < (	.b %h100755 en-WS.js ѨFy3fl|+>100755 en-WS.js.map z2qN1i-100755 en-ZA.d.ts O>9J=*$100755 en-ZA.js ܏V9N100755 en-ZA.js.map $ ޏ"~100755 en-ZM.d.ts dHP"#?cutbw100755 en-ZM.js Yu6^q Z100755 en-ZM.js.map , ,e1+#dnґ100755 en-ZW.d.ts mj㣅LwXN100755 en-ZW.js &'nR@W100755 en-ZW.js.map V5*EbԚ100755 en.d.ts ()QٸdC;ÀH100755 en.js [ߝn}Nekc~"P100755 en.js.map J3هNd\K100755 eo.d.ts mj㣅LwXN100755 eo.js _zC7^100755 eo.js.map 1^{S|{T100755 es-419.d.ts ddegН\Q|100755 es-419.js 2ۈ,`+100755 es-419.js.map mD`0'a?wv*100755 es-AR.d.ts K`a?֑3YYu 100755 es-AR.js uRa@/100755 es-AR.js.map g͕M{>>100755 es-BO.d.ts 8lRI*]F100755 es-BO.js 8)}%ë.P100755 es-BO.js.map ri<5eP;j}QQy100755 es-BR.d.ts i˥uq_100755 es-BR.js L),H8!a{V%100755 es-BR.js.map )gZX],yʩi100755 es-BZ.d.ts w~&V'@ŤA100755 es-BZ.js cRU|[ͱq[100755 es-BZ.js.map H'SUhN?|$100755 es-CL.d.ts rt8#u100755 es-CL.js [jU ğv(a[q,100755 es-CL.js.map 0'ނSxg^9!100755 es-CO.d.ts [w0=̈́nsYw100755 es-CO.js Iz?g3p|100755 es-CO.js.map :c|>W"ƫ{%bY100755 es-CR.d.ts #Raftqђs100755 es-CR.js } \" 
>|SO100755 es-CR.js.map l)Zf$!CQ#={v100755 es-CU.d.ts Vx(5ݤ+&+:<.%100755 es-CU.js "]zqk=sc100755 es-CU.js.map i͈<1"3100755 es-DO.d.ts AbI;100755 es-DO.js ίb
	[-9@'100755 es-DO.js.map P5FUĦ100755 es-EA.d.ts w*3bL$`
Q100755 es-EA.js Y63*F{s:mwY100755 es-EA.js.map 3jmVHئ100755 es-EC.d.ts {"ܶ訽v)䄵100755 es-EC.js mn@zyd}~Or"\.100755 es-EC.js.map *)j+100755 es-GQ.d.ts )mKWFE"4X0i100755 es-GQ.js ي8_v~tnR@U;|100755 es-GQ.js.map H8htEc100755 es-GT.d.ts `MM=ܣ&/100755 es-GT.js v|xB+гY100755 es-GT.js.map >6*F#j<ZV100755 es-HN.d.ts ]<)	100755 es-HN.js ϊ` uű100755 es-HN.js.map IhhIa#/K%z|100755 es-IC.d.ts w*3bL$`
Q100755 es-IC.js ||ĊM4 fW{L100755 es-IC.js.map 4H7Z4J@~'100755 es-MX.d.ts b}C*<ߍ$w`ŗi100755 es-MX.js I`O¹AAo100755 es-MX.js.map  JӔ_8&@(X<[100755 es-NI.d.ts "cq䭉&X100755 es-NI.js XaqPԓ87100755 es-NI.js.map J4:]p3YL_Y100755 es-PA.d.ts -C݈R!R8/t9P100755 es-PA.js {b?P%e14x100755 es-PA.js.map 4-ڟ^-Ԫ#H_i{100755 es-PE.d.ts .!$n%φY100755 es-PE.js E˸u'Cg7Q[100755 es-PE.js.map X E&|Oˮ)Y100755 es-PH.d.ts O:шvyϦ100755 es-PH.js 
|$$tTƎi)100755 es-PH.js.map '	z)nD
8100755 es-PR.d.ts {"ܶ訽v)䄵100755 es-PR.js w,?4U<100755 es-PR.js.map 8IjJy9eH100755 es-PY.d.ts $U5Lv<fl100755 es-PY.js I0J>g$A_100755 es-PY.js.map Codv`HvAea]100755 es-SV.d.ts {"ܶ訽v)䄵100755 es-SV.js =sarP.a?E;ߖ,100755 es-SV.js.map ַG??NZ׾]100755 es-US.d.ts c	, Q:Y'100755 es-US.js Ϙ툽.dTW&]j
100755 es-US.js.map F|<65Օ)`M=100755 es-UY.d.ts b
5j^-ќ߈}100755 es-UY.js 9%*B@100755 es-UY.js.map O^[qMvL2eH100755 es-VE.d.ts sc2s/
~G100755 es-VE.js $SYDϳ['/100755 es-VE.js.map 3^Bx`sB̍Tl@100755 es.d.ts w*3bL$`
Q100755 es.js s
Ǩ6	~]A};100755 es.js.map R0_)=͆"100755 et.d.ts ,MEQ
\100755 et.js VC)uN\l.'@!e100755 et.js.map Q`T;xsw@F100755 eu.d.ts ^^G#qyUIʞ/100755 eu.js  QҚ\D yOV100755 eu.js.map {TR܍u[100755 ewo.d.ts mj㣅LwXN100755 ewo.js  3,taMY.#x100755 ewo.js.map 5|_2ƴDQA40000 extra "lc7Dv100755 fa-AF.d.ts sL6,%L)>'b100755 fa-AF.js bDCG(100755 fa-AF.js.map '!mEEf΄M100755 fa.d.ts sL6,%L)>'b100755 fa.js Td%.731s100755 fa.js.map O0_7:<Iu-0100755 ff-Adlm-BF.d.ts >NͣN$%JC:100755 ff-Adlm-BF.js ^fP,9ք<H100755 ff-Adlm-BF.js.map  EN,?mFt|100755 ff-Adlm-CM.d.ts >NͣN$%JC:100755 ff-Adlm-CM.js (pc=ڒE/")#5SR100755 ff-Adlm-CM.js.map 1	%k@lJB100755 ff-Adlm-GH.d.ts _wEf;100755 ff-Adlm-GH.js ©Cj#DL]D100755 ff-Adlm-GH.js.map ^-2?%{-5A100755 ff-Adlm-GM.d.ts E2mUhTVYlt躖100755 ff-Adlm-GM.js =whB's#i($I100755 ff-Adlm-GM.js.map '[f[rJO,f100755 ff-Adlm-GW.d.ts >NͣN$%JC:100755 ff-Adlm-GW.js 䪅O0q6Zz!9(!U3100755 ff-Adlm-GW.js.map -Bn]:<|100755 ff-Adlm-LR.d.ts <A-a
lg`ު100755 ff-Adlm-LR.js n!0Z2=S6d1100755 ff-Adlm-LR.js.map t (4m4<100755 ff-Adlm-MR.d.ts 
s̲l?m"100755 ff-Adlm-MR.js  Syo	C100755 ff-Adlm-MR.js.map WW |+'~@u"S100755 ff-Adlm-NE.d.ts >NͣN$%JC:100755 ff-Adlm-NE.js _k9l@	->8=
bQ100755 ff-Adlm-NE.js.map '=m
b+fyv^o3100755 ff-Adlm-NG.d.ts >NͣN$%JC:100755 ff-Adlm-NG.js ztZN6	p"؆100755 ff-Adlm-NG.js.map 	V3tQ$kcv100755 ff-Adlm-SL.d.ts 7}EJB-]
x100755 ff-Adlm-SL.js F1kl8 2=i100755 ff-Adlm-SL.js.map L1	J~L3vcz100755 ff-Adlm-SN.d.ts >NͣN$%JC:100755 ff-Adlm-SN.js GE?P}͍wew100755 ff-Adlm-SN.js.map ?8erFeaPĎq100755 ff-Adlm.d.ts \n)i>y5O $3.#100755 ff-Adlm.js [szߤY"Cpmf100755 ff-Adlm.js.map KtztɞJ100755 ff-CM.d.ts  htR	rHǇQ&100755 ff-CM.js 	tId01@L'h100755 ff-CM.js.map M\/kX2L100755 ff-GN.d.ts ;'4(}%Du100755 ff-GN.js 
V!;>xb1k7w*100755 ff-GN.js.map y`8*eChp%0n\100755 ff-Latn-BF.d.ts mj㣅LwXN100755 ff-Latn-BF.js idkbZڟj!F100755 ff-Latn-BF.js.map :Ⳟ鈖]^~>6100755 ff-Latn-CM.d.ts mj㣅LwXN100755 ff-Latn-CM.js v&d&xd2L100755 ff-Latn-CM.js.map OrI
j7W-#I100755 ff-Latn-GH.d.ts Y]a
3D_100755 ff-Latn-GH.js %esg.8j100755 ff-Latn-GH.js.map zotQȦ2'TtNG100755 ff-Latn-GM.d.ts `NX7\8UZEqZ( 100755 ff-Latn-GM.js gTs100755 ff-Latn-GM.js.map ÜyHB8ҼW100755 ff-Latn-GN.d.ts -oFG|$2,)g100755 ff-Latn-GN.js >ѣ/%d}::,100755 ff-Latn-GN.js.map RedWYElHHp100755 ff-Latn-GW.d.ts mj㣅LwXN100755 ff-Latn-GW.js aqt&&;100755 ff-Latn-GW.js.map 6]Bvq100755 ff-Latn-LR.d.ts .;dUI[i.j<D100755 ff-Latn-LR.js C67s<X)v100755 ff-Latn-LR.js.map [-*YOG٩"/Ne
100755 ff-Latn-MR.d.ts k4uX')gH:100755 ff-Latn-MR.js vD[]?D{.100755 ff-Latn-MR.js.map :VPEMQl>IH100755 ff-Latn-NE.d.ts mj㣅LwXN100755 ff-Latn-NE.js iXUl=<^d+100755 ff-Latn-NE.js.map p:#c>bCv%100755 ff-Latn-NG.d.ts 4'-~>)	c100755 ff-Latn-NG.js 	p"I?sC100755 ff-Latn-NG.js.map AI՞/+tެ~\100755 ff-Latn-SL.d.ts d@wy7Gqi100755 ff-Latn-SL.js 4G72<H #]1100755 ff-Latn-SL.js.map »W'az'100755 ff-Latn.d.ts mj㣅LwXN100755 ff-Latn.js .F`uRM100755 ff-Latn.js.map |MO|1cba,100755 ff-MR.d.ts 0cD̏{jm|Z٥100755 ff-MR.js +!?ϰ@100755 ff-MR.js.map ,I؎nRjT3ɕ100755 ff.d.ts mj㣅LwXN100755 ff.js ͓K100755 ff.js.map 7a2m9Ol@Qt100755 fi.d.ts n26'AmHa100755 fi.js ^`tۛ%1kWF100755 fi.js.map iJ߱A)Z100755 fil.d.ts I.'X̨AU<100755 fil.js D$ӷߚ؇H9 100755 fil.js.map > s!˘100755 fo-DK.d.ts WuL7c<"i3100755 fo-DK.js /WJUe:W100755 fo-DK.js.map )	O5Śzyg100755 fo.d.ts WuL7c<"i3100755 fo.js \8Kawin100755 fo.js.map lf$1T*k100755 fr-BE.d.ts @bo/Dg8j100755 fr-BE.js v*#+StfQ0g83100755 fr-BE.js.map -عU100755 fr-BF.d.ts @bo/Dg8j100755 fr-BF.js m=#m`P'g}*{`pg100755 fr-BF.js.map E\ ]ewSOyw100755 fr-BI.d.ts >/)Jef^100755 fr-BI.js x 6JώDB100755 fr-BI.js.map =5	l
H}7x100755 fr-BJ.d.ts @bo/Dg8j100755 fr-BJ.js %u DkZap100755 fr-BJ.js.map ?#(+np}U100755 fr-BL.d.ts @bo/Dg8j100755 fr-BL.js 6d_F߁"zj:100755 fr-BL.js.map WI;Mn>@100755 fr-CA.d.ts `%w%h%J^MEr o100755 fr-CA.js W݊~jߦ_
Eh100755 fr-CA.js.map eUPjI100755 fr-CD.d.ts =)jD&M|0100755 fr-CD.js B鋕ve100755 fr-CD.js.map @p3uÀ㍎Z|100755 fr-CF.d.ts @bo/Dg8j100755 fr-CF.js 'IEQny"رܺ100755 fr-CF.js.map ؁|΁rd-100755 fr-CG.d.ts @bo/Dg8j100755 fr-CG.js SU[{ P?mr100755 fr-CG.js.map Шz#ډWGQ100755 fr-CH.d.ts @bo/Dg8j100755 fr-CH.js /p|_KB:0"\D100755 fr-CH.js.map cc6dSgmt;b100755 fr-CI.d.ts @bo/Dg8j100755 fr-CI.js  '1<Ymβ f(100755 fr-CI.js.map j&EW[100755 fr-CM.d.ts @bo/Dg8j100755 fr-CM.js nGݵY
,10-100755 fr-CM.js.map R^nn[(100755 fr-DJ.d.ts G54,<R-a#100755 fr-DJ.js *&S0Xp>100755 fr-DJ.js.map >ŧIrO|w;Y100755 fr-DZ.d.ts QY  Vm65N100755 fr-DZ.js OQFIf^g4n-#hB^100755 fr-DZ.js.map Lx!}\p100755 fr-GA.d.ts @bo/Dg8j100755 fr-GA.js r?]! })100755 fr-GA.js.map }	ev=U̓ϋ100755 fr-GF.d.ts @bo/Dg8j100755 fr-GF.js ǋ{#P-$\*k7-r100755 fr-GF.js.map 5&OBSsm100755 fr-GN.d.ts `\kbDKuzpT100755 fr-GN.js nӞ)?ڢ+݆Z100755 fr-GN.js.map Lb86n%Ӆ	M100755 fr-GP.d.ts @bo/Dg8j100755 fr-GP.js ͜wQU.P100755 fr-GP.js.map 0@3֥Č100755 fr-GQ.d.ts @bo/Dg8j100755 fr-GQ.js ~	/OWX100755 fr-GQ.js.map )L="FJfW100755 fr-HT.d.ts pعFqt`100755 fr-HT.js 2k3ZydR$100755 fr-HT.js.map fҧ.'8Q\ST100755 fr-KM.d.ts p(.ѻ,)l100755 fr-KM.js ovE_P'$!100755 fr-KM.js.map ~1CIM&]UAі100755 fr-LU.d.ts be"Aa6H-100755 fr-LU.js Ϸ&b#p} $H|^100755 fr-LU.js.map hcyRrE^ّ=p100755 fr-MA.d.ts @bo/Dg8j100755 fr-MA.js #d*ƉvaOmN]]-9t100755 fr-MA.js.map  [u߹s/s100755 fr-MC.d.ts @bo/Dg8j100755 fr-MC.js fF" ;CuOse100755 fr-MC.js.map U7i7(b] 2ò˘xx100755 fr-MF.d.ts @bo/Dg8j100755 fr-MF.js -s-?ko"nG100755 fr-MF.js.map )a!o=ei3100755 fr-MG.d.ts QAzCkrXwF͙100755 fr-MG.js hb1:[<)~100755 fr-MG.js.map v|dcWvuw100755 fr-ML.d.ts @bo/Dg8j100755 fr-ML.js !Ӧ1b8r~100755 fr-ML.js.map 1Ή*ù:5&F100755 fr-MQ.d.ts @bo/Dg8j100755 fr-MQ.js ]S|	&100755 fr-MQ.js.map *)Mu3?100755 fr-MR.d.ts +wFZɉG100755 fr-MR.js .1Y4y4Ǡ0~100755 fr-MR.js.map DV<lblF100755 fr-MU.d.ts /m\1M;HN~l100755 fr-MU.js WkPn9\̫'S100755 fr-MU.js.map B=!:2j]100755 fr-NC.d.ts @bo/Dg8j100755 fr-NC.js (Å#d!zE 100755 fr-NC.js.map xXd[RGrז"`>qO100755 fr-NE.d.ts @bo/Dg8j100755 fr-NE.js gWZuzyh9L100755 fr-NE.js.map bd[EH100755 fr-PF.d.ts @bo/Dg8j100755 fr-PF.js GI;?O_2 1ج100755 fr-PF.js.map l.did;AٱAs/100755 fr-PM.d.ts @bo/Dg8j100755 fr-PM.js l-oOZ	A,
1n100755 fr-PM.js.map [ PH	5Y100755 fr-RE.d.ts @bo/Dg8j100755 fr-RE.js \TtG#We|o{<100755 fr-RE.js.map hJ$cJ;<uBT	\X.100755 fr-RW.d.ts ;1W{P%I/100755 fr-RW.js E
GvВ{100755 fr-RW.js.map T_ITk
ҍe-pմ4 100755 fr-SC.d.ts ,-Y-*As|q-W100755 fr-SC.js i$(ԯgpH{100755 fr-SC.js.map  G@#]"K100755 fr-SN.d.ts @bo/Dg8j100755 fr-SN.js U1Qwk"6,.100755 fr-SN.js.map QJqwD-Yk\100755 fr-SY.d.ts 7ɋCM a&>l100755 fr-SY.js  ϹS%^.G$vN100755 fr-SY.js.map  gSeŷBY̟6j+100755 fr-TD.d.ts @bo/Dg8j100755 fr-TD.js N4O׌T$gB &100755 fr-TD.js.map kYQ5i[?,\b >100755 fr-TG.d.ts @bo/Dg8j100755 fr-TG.js E
שV U5100755 fr-TG.js.map GHDϢJ1/100755 fr-TN.d.ts xY?|iď,100755 fr-TN.js VjcZ-H?6p&H100755 fr-TN.js.map Ŕd3;"mZTP100755 fr-VU.d.ts B7%	@g`100755 fr-VU.js (%-ߋ\`L	Y>100755 fr-VU.js.map A@w3ˆΤ+ח100755 fr-WF.d.ts @bo/Dg8j100755 fr-WF.js Wu)j1100755 fr-WF.js.map NSN~A5km100755 fr-YT.d.ts @bo/Dg8j100755 fr-YT.js @!qH>$T@100755 fr-YT.js.map "r]u^.zV*HN!100755 fr.d.ts @bo/Dg8j100755 fr.js &XɃ?DLeT100755 fr.js.map 'j}ۜ;ު100755 fur.d.ts mj㣅LwXN100755 fur.js hd=	7e$p[`100755 fur.js.map EB1f鵮m˶1100755 fy.d.ts JQOq [u<e100755 fy.js Ύ[F稺Z/100755 fy.js.map !sxcb(100755 ga-GB.d.ts W~@;3Kҫ)100755 ga-GB.js qmOu}(2*)100755 ga-GB.js.map Lm 0v^C2100755 ga.d.ts W~@;3Kҫ)100755 ga.js _VAD&}`Nu1?100755 ga.js.map țZ{"<Q100755 gd.d.ts 7
˯yK;	<_%100755 gd.js aѐu+d'd100755 gd.js.map cy;//M1̿8100755 gl.d.ts B)]_@90rU100755 gl.js jslGӁg4M:100755 gl.js.map 7);T@1:~
D40000 global a̢ T8Oi&&R100755 gsw-FR.d.ts PV==W5Y100755 gsw-FR.js Ƅ_AK)_100755 gsw-FR.js.map ji֍`a_<tc	100755 gsw-LI.d.ts PV==W5Y100755 gsw-LI.js ƀWљ-o100755 gsw-LI.js.map j}(-x6=B100755 gsw.d.ts PV==W5Y100755 gsw.js IE:9$\lK-b100755 gsw.js.map Ԛh?$ž\e100755 gu.d.ts 8G<ǉ<٫]\U100755 gu.js \c.}2n^hɎ100755 gu.js.map ^m
 ]Sw100755 guz.d.ts ;Czo
xCui5100755 guz.js :` |o$pmq100755 guz.js.map 9VK7=ģIVה100755 gv.d.ts mj㣅LwXN100755 gv.js u*E,K 100755 gv.js.map 6uKr0?100755 ha-GH.d.ts B5-@BU'pS݁100755 ha-GH.js )/VVba/Lv100755 ha-GH.js.map 7T˭
ĴlΰPS100755 ha-NE.d.ts 9x]-߫?NU100755 ha-NE.js (.?J) 100755 ha-NE.js.map i(J^G&GJV100755 ha.d.ts 9x]-߫?NU100755 ha.js  ,A|W`QUWD100755 ha.js.map Mƹ@6BVoJ100755 haw.d.ts 4u17eq100755 haw.js vc5Q
'b(100755 haw.js.map /eS߶nRRI9100755 he.d.ts In
@`100755 he.js :=0<Udx100755 he.js.map dqQS\7ejW3100755 hi-Latn.d.ts 4u17eq100755 hi-Latn.js 	<˩HBK@pӄ100755 hi-Latn.js.map ̥7?ykccJv100755 hi.d.ts l\z{~i:&100755 hi.js o $հޖ{ɧ&Ӟ100755 hi.js.map b-VoL`h100755 hr-BA.d.ts ͫ$۝#*&y100755 hr-BA.js `fEG_L2"100755 hr-BA.js.map A]Pg(#100755 hr.d.ts 0RӣkC`100755 hr.js ?I ]M100755 hr.js.map &9{%=~Lb\p100755 hsb.d.ts r9dTe'2;100755 hsb.js j{&oC"5}100755 hsb.js.map  h3?~5LZ100755 hu.d.ts ųL{gޙsՍx100755 hu.js 6_k5:q*G100755 hu.js.map  UBjL3!D0* Əj100755 hy.d.ts &s͓+WL100755 hy.js !OPAJԳA100755 hy.js.map "273'Q8Z100755 ia.d.ts _BuwAG0}%100755 ia.js =W mDM(ghI100755 ia.js.map ?9yaAF100755 id.d.ts _% BHCwv,Q100755 id.js `qH2_100755 id.js.map w.X8э|N100755 ig.d.ts 9x]-߫?NU100755 ig.js ؄?oĺ?{~>100755 ig.js.map ?Uf&Xz)Fr100755 ii.d.ts ӑ`H(gY#Ca100755 ii.js {n>Tu>[3 .100755 ii.js.map wu?We100755 is.d.ts z]7(t/`qsRQ867100755 is.js X3b衤Fb100755 is.js.map 턊I5!q݌& k'*100755 it-CH.d.ts ]DSш6100755 it-CH.js e3id	IcUAxF100755 it-CH.js.map ^cF%# {j100755 it-SM.d.ts ]DSш6100755 it-SM.js Țo1.>𤓨100755 it-SM.js.map 
֩Ԥ>JVBc100755 it-VA.d.ts ]DSш6100755 it-VA.js z+,\\IfE[6100755 it-VA.js.map n'!ٸ7=100755 it.d.ts ]DSш6100755 it.js j?=~36{J100755 it.js.map Rp6S	@FIrX100755 ja.d.ts ,u ]8~ĮpB100755 ja.js ̏Zf)?6VR100755 ja.js.map a5/\̦d`b/@(C100755 jgo.d.ts mj㣅LwXN100755 jgo.js Rp~ajLSHj[100755 jgo.js.map 5CS+#<l100755 jmc.d.ts p!Q{䌀-Q=100755 jmc.js (w/s>D100755 jmc.js.map  f^b|Iz"100755 jv.d.ts Z.A\ɵL100755 jv.js vm F[ţͲ/-W100755 jv.js.map ,9(a9(~100755 ka.d.ts '&qPbN100755 ka.js _Gdν?!+c100755 ka.js.map Kb}5VoQc100755 kab.d.ts f:>*:aJ@100755 kab.js *G"Ga100755 kab.js.map ?[fm*K}Aֻ100755 kam.d.ts ;Czo
xCui5100755 kam.js C
זSq=Y6&100755 kam.js.map nQtMGŕmO搏
100755 kde.d.ts p!Q{䌀-Q=100755 kde.js oWR6@ rz0100755 kde.js.map  j!folGPg100755 kea.d.ts cv^100755 kea.js fg34100755 kea.js.map {1^!K޴100755 kgp.d.ts K
5샥+&PB100755 kgp.js oɄ!
)_␾=]100755 kgp.js.map N`yel<
x,100755 khq.d.ts mj㣅LwXN100755 khq.js YyI%bԣ\100755 khq.js.map Nqispϳ]om100755 ki.d.ts ;Czo
xCui5100755 ki.js jWH9{100755 ki.js.map V:8{bpͨc100755 kk.d.ts /"jI0} 8100755 kk.js sTY	5"=L100755 kk.js.map 3z5R=):bZN5100755 kkj.d.ts mj㣅LwXN100755 kkj.js ][žk&N?K[I-i/100755 kkj.js.map O?׀4e×!100755 kl.d.ts jn:ӹkCc100755 kl.js _ebG%*`>2100755 kl.js.map [6f\4100755 kln.d.ts ;Czo
xCui5100755 kln.js L?G!Y
100755 kln.js.map c[)45K100755 km.d.ts am_QꍭÏG4"100755 km.js (ď.? 9	r100755 km.js.map ΕcQ	UBU100755 kn.d.ts l\z{~i:&100755 kn.js ڄC>*"BGUÃ100755 kn.js.map ưcɌ{I nKǡ<&100755 ko-KP.d.ts F,C]߼Ӣ <4100755 ko-KP.js 90	Իeҳ*100755 ko-KP.js.map k^sny^hxmG100755 ko.d.ts F,C]߼Ӣ <4100755 ko.js 8/Hpgen100755 ko.js.map b2@fdcV]ʨDp100755 kok.d.ts ^J36VQQPkr,.100755 kok.js %K&;:
G100755 kok.js.map `Ϫ?%~Ci100755 ks-Arab.d.ts ()QٸdC;ÀH100755 ks-Arab.js b8J2\mzr100755 ks-Arab.js.map +bѕ{n>f؍%ḍu}D100755 ks-Deva.d.ts 4u17eq100755 ks-Deva.js q@UUeFo,100755 ks-Deva.js.map ߧآcڅ?Sp100755 ks.d.ts ()QٸdC;ÀH100755 ks.js N1fHٚevG100755 ks.js.map uO1\P=E<肩100755 ksb.d.ts p!Q{䌀-Q=100755 ksb.js onZlWr100755 ksb.js.map 0bbbj4]~x8100755 ksf.d.ts mj㣅LwXN100755 ksf.js iXEyݾ&^100755 ksf.js.map i.~v(43sb{100755 ksh.d.ts mj㣅LwXN100755 ksh.js Vha-{B rA^l100755 ksh.js.map u9~<Ewn
T0ah100755 ku.d.ts ֵ~dOw韧100755 ku.js |bб80L\x7r100755 ku.js.map P',G
PV2W100755 kw.d.ts mj㣅LwXN100755 kw.js >x=HW;100755 kw.js.map I],BGt> f100755 ky.d.ts U;A8o6 %:Ý100755 ky.js (ܝ4{:/4W\100755 ky.js.map *K|V1o44# r100755 lag.d.ts p!Q{䌀-Q=100755 lag.js ߮̅*[dvCB7100755 lag.js.map j,@Tt㵳7ⷦ100755 lb.d.ts pmͫUze100755 lb.js ]+?
-A8X100755 lb.js.map  }K Jmӱ4100755 lg.d.ts zhHy)ZU֌o100755 lg.js 6ْ9SP4 F1F100755 lg.js.map 6Xn\4"Y100755 lkt.d.ts 4u17eq100755 lkt.js k+] _#L@100755 lkt.js.map }__dFHg]100755 ln-AO.d.ts ~; G6 ++:100755 ln-AO.js dXUu\O7pzs0100755 ln-AO.js.map TQ=VH100755 ln-CF.d.ts çrSZx9Y?.rm100755 ln-CF.js 5wp[Eܕn100755 ln-CF.js.map L}^) ^Dry100755 ln-CG.d.ts çrSZx9Y?.rm100755 ln-CG.js 7[ZWK_zҼ100755 ln-CG.js.map ~ξ1v+100755 ln.d.ts çrSZx9Y?.rm100755 ln.js V-~\+c
Q?cW100755 ln.js.map f-8 7m/v*_eG100755 lo.d.ts j0ULu|C100755 lo.js Cal5׿K58100755 lo.js.map {"bI`(qw(100755 lrc-IQ.d.ts [t\hhpN'100755 lrc-IQ.js ES˜QrECLxN100755 lrc-IQ.js.map _.(/(x4100755 lrc.d.ts [t\hhpN'100755 lrc.js ț{g7v&MSu)100755 lrc.js.map ,k1蔷H100755 lt.d.ts eX_˪ Hr|rY;100755 lt.js \Q|؊bNX100755 lt.js.map w+8a+100755 lu.d.ts çrSZx9Y?.rm100755 lu.js ("]g"Sp#100755 lu.js.map DEC-0PU{<k100755 luo.d.ts ;Czo
xCui5100755 luo.js p!v(]OO>;100755 luo.js.map ;`9=N[.JQ100755 luy.d.ts ;Czo
xCui5100755 luy.js ,*zy100755 luy.js.map xCR' Z_b100755 lv.d.ts 3ިή݀<100755 lv.js PaOxB^pWu2M100755 lv.js.map b!cL~j]9Mv100755 mai.d.ts 4u17eq100755 mai.js X/igtW!knU;100755 mai.js.map Ũ#vnS YH@100755 mas-TZ.d.ts -և)p[҂çd100755 mas-TZ.js ~?8Z*eDE'ߞO_Z100755 mas-TZ.js.map ѫ&@^&WW0}@{100755 mas.d.ts ;Czo
xCui5100755 mas.js WŜhjZ֯d_:100755 mas.js.map hӲYdڅב@+'t+100755 mer.d.ts ;Czo
xCui5100755 mer.js :
.OfE"LÊo100755 mer.js.map GqnEOu/h'=100755 mfe.d.ts QhF O!Rh100755 mfe.js !OG*ޥ100755 mfe.js.map ΩN
/U[NZpr"Z100755 mg.d.ts ^@2!r<100755 mg.js Հ肂AKo`l!iI n100755 mg.js.map ^^U08]-V2"?100755 mgh.d.ts LB&Fl<Fvi'100755 mgh.js oʬ0f74R 100755 mgh.js.map G4>Dj>WI 100755 mgo.d.ts mj㣅LwXN100755 mgo.js (!;G?7$W 100755 mgo.js.map ؟e:)jma\%100755 mi.d.ts P(z؍C$T
y/g100755 mi.js "
KѣM<	8k=100755 mi.js.map NK܀N?VH100755 mk.d.ts 3vMa'>Sy100755 mk.js ;Q}³7.gKm100755 mk.js.map }soSn{g100755 ml.d.ts 5JQ(vTGآIw100755 ml.js W3/r䍒O2100755 ml.js.map  T"0ÊzIT100755 mn.d.ts "l|D8ӱ100755 mn.js ŰM@;Hb100755 mn.js.map e3 uP$TO100755 mni-Beng.d.ts &n*賔8K5kš9100755 mni-Beng.js N>#xLɸVn%n100755 mni-Beng.js.map .{iO-0UMv100755 mni.d.ts &n*賔8K5kš9100755 mni.js Jc`SSO:śV|=100755 mni.js.map %Y??ֺ100755 mr.d.ts a8O36e\Ĭ100755 mr.js 4P5	Jhkedi100755 mr.js.map UJ#(Ę`V2100755 ms-BN.d.ts yܓ~	)-pÛe100755 ms-BN.js דʛʙiR9uk;I#M100755 ms-BN.js.map ['R%iŇK\)100755 ms-ID.d.ts 0"k9ep100755 ms-ID.js ۋ;2cFR6100755 ms-ID.js.map N\ILvr=Ď100755 ms-SG.d.ts #NаNe;4׈100755 ms-SG.js Y,.'Wliؔ}100755 ms-SG.js.map Aٙ|Om8100755 ms.d.ts |'T̉+eF100755 ms.js =?CQwĝP@W100755 ms.js.map *p̺А5˧'V&L100755 mt.d.ts ^~V5&9xt@PD100755 mt.js M53a1qƐ<100755 mt.js.map #p.L@/ܥb100755 mua.d.ts mj㣅LwXN100755 mua.js њpm&**!100755 mua.js.map g*RXH=_~AFDR+(B100755 my.d.ts  @*%!_
p(FI100755 my.js [_Ф|Z=L+@100755 my.js.map E c7x<y1f+E&100755 mzn.d.ts YyC3a0M/100755 mzn.js 3Z%0^?X2œx*<100755 mzn.js.map tUHYta%wJf 100755 naq.d.ts lL']5w^8?P/100755 naq.js <]'r.O7٘100755 naq.js.map ˅!JHZy"Jk100755 nb-SJ.d.ts j޲KS\Eܶ100755 nb-SJ.js 嚬I^n4y100755 nb-SJ.js.map _cL[8X0sSyP100755 nb.d.ts j޲KS\Eܶ100755 nb.js cV).Dv;ޔH100755 nb.js.map IJiIR&&"100755 nd.d.ts mj㣅LwXN100755 nd.js `<#T1鹖100755 nd.js.map ;aAgPvQ100755 nds-NL.d.ts mj㣅LwXN100755 nds-NL.js L@	2AHr$0100755 nds-NL.js.map UkYc3XRuyeH100755 nds.d.ts mj㣅LwXN100755 nds.js 7^UdhT9100755 nds.js.map \;Fؠ\y1100755 ne-IN.d.ts o(( ,1N
ϛG100755 ne-IN.js ug	|`zL M100755 ne-IN.js.map ~&H1\jvT#h[f100755 ne.d.ts o(( ,1N
ϛG100755 ne.js l=W$Jc100755 ne.js.map WiSxk8d#100755 nl-AW.d.ts \</ӄփkxB100755 nl-AW.js 0+P̨"100755 nl-AW.js.map #(>.Ht100755 nl-BE.d.ts P&<{0CY"ol>100755 nl-BE.js ع%	D\27w100755 nl-BE.js.map ūr%iMq/P0100755 nl-BQ.d.ts ܦF
^Ǭ100755 nl-BQ.js _zW^EWAB2100755 nl-BQ.js.map pqI<fSi~ &100755 nl-CW.d.ts zʕEol100755 nl-CW.js e֊)^KCD69+t100755 nl-CW.js.map 5q\IȀDq={i100755 nl-SR.d.ts 0%>c E;100755 nl-SR.js ɸv)G)yㄖ-100755 nl-SR.js.map Hr)vǿDԆ100755 nl-SX.d.ts zʕEol100755 nl-SX.js .iA>+Z100755 nl-SX.js.map ]uhmP_X!3100755 nl.d.ts P&<{0CY"ol>100755 nl.js bLrvl=
qcθ:Bg100755 nl.js.map =8<4@J`100755 nmg.d.ts mj㣅LwXN100755 nmg.js 9ڇJ8xo.100755 nmg.js.map hXؙdjq100755 nn.d.ts 8sUZԿ100755 nn.js lMy~zT":9u100755 nn.js.map ;N8+2Q[100755 nnh.d.ts mj㣅LwXN100755 nnh.js )Oc&cl9100755 nnh.js.map FF)'_,1100755 no.d.ts j޲KS\Eܶ100755 no.js >ajH13N#100755 no.js.map VSBx@ϵ e100755 nus.d.ts F6̈́SԽӁ100755 nus.js lbu	b3^uY/j	!100755 nus.js.map Ϻh9#.0F]g100755 nyn.d.ts zhHy)ZU֌o100755 nyn.js 4}Ll(w%uD100755 nyn.js.map <l4	94@4100755 om-KE.d.ts C(ed;HAi:*c100755 om-KE.js @>oeXPB(HHW100755 om-KE.js.map aA2&{x5100755 om.d.ts t>.ley100755 om.js *_A^7N:100755 om.js.map EsrR9nch100755 or.d.ts :hD4 g"l/a"R100755 or.js %ٲV)8- ]xM100755 or.js.map l[-Oi恗0100755 os-RU.d.ts h2ಏތt_)100755 os-RU.js &tN%Lɮ100755 os-RU.js.map ^xȮ}׭c100755 os.d.ts JV{~~We100755 os.js oZC&_*100755 os.js.map f5۾_100755 pa-Arab.d.ts 碫B.8JכHL100755 pa-Arab.js <Fgy7 _100755 pa-Arab.js.map 75<י&vhLE100755 pa-Guru.d.ts J<9.:94hbrJ100755 pa-Guru.js X$Nꆼ2Pƙp7100755 pa-Guru.js.map 0w9JBw`100755 pa.d.ts J<9.:94hbrJ100755 pa.js 3b	A yw-ߒt100755 pa.js.map Ǖ#-ؐrVI"6100755 pcm.d.ts m80t^E?Mx100755 pcm.js 1>Hy~wp100755 pcm.js.map XZx	8W׺100755 pl.d.ts B]qQ(
qt˕I7ӎ100755 pl.js @pڈQ-swR7q100755 pl.js.map ʑa8ŠBvA}S100755 ps-PK.d.ts K!fsm89kX߶KO100755 ps-PK.js hőeRPoq	B100755 ps-PK.js.map OAW/:100755 ps.d.ts ~QѵPhv n100755 ps.js nݶ$j{100755 ps.js.map k\OXF9N100755 pt-AO.d.ts xqMS|F:ho100755 pt-AO.js "ǹolJ#fcZR100755 pt-AO.js.map ²V3Ѡ%100755 pt-CH.d.ts 2/hEUS7`)y100755 pt-CH.js oWШй! 3A100755 pt-CH.js.map QA΀it¿7!{.0100755 pt-CV.d.ts Tk·:100755 pt-CV.js Hm!%0^TIgߊ100755 pt-CV.js.map 2%XF"п%z:100755 pt-GQ.d.ts 2/hEUS7`)y100755 pt-GQ.js *!soޭt]WaU100755 pt-GQ.js.map i"UHPg@#^100755 pt-GW.d.ts 2/hEUS7`)y100755 pt-GW.js ZPTmQ7100755 pt-GW.js.map ;cU0%100755 pt-LU.d.ts v4z`I100755 pt-LU.js T$h Qv100755 pt-LU.js.map ؙrjxϳV>1A100755 pt-MO.d.ts t99O100755 pt-MO.js пduUT|nd"100755 pt-MO.js.map UJ%:L[J100755 pt-MZ.d.ts $=YE~0ja3100755 pt-MZ.js GOMrHp2G100755 pt-MZ.js.map k6fA&؁/P>c2100755 pt-PT.d.ts 2/hEUS7`)y100755 pt-PT.js b.(PV%qݙ}Pz]k100755 pt-PT.js.map wXx^eRϣAgG100755 pt-ST.d.ts OOOFGO100755 pt-ST.js ExiXv@100755 pt-ST.js.map 0EHwॣ=x100755 pt-TL.d.ts 2/hEUS7`)y100755 pt-TL.js eIطD}̋&#100755 pt-TL.js.map _*F:$lm100755 pt.d.ts C\S?o!Lw[100755 pt.js la9mEңu=1100755 pt.js.map 6Ns~)Q=C100755 qu-BO.d.ts N3LL:}+1U100755 qu-BO.js )ET71QAY
100755 qu-BO.js.map `/#{%P0100755 qu-EC.d.ts ј*JpQP{\WL100755 qu-EC.js ӘIB14100755 qu-EC.js.map ̖%8#100755 qu.d.ts X&giQxԆ100755 qu.js rZO{i޼M]7100755 qu.js.map U+<gR2ZZ100755 rm.d.ts 4u17eq100755 rm.js zvcܢJ100755 rm.js.map ^k(c^1EZZ100755 rn.d.ts e(	-,EgDh+N100755 rn.js a*	j.>a100755 rn.js.map hӻ=" `Yl100755 ro-MD.d.ts IN<C䨵9hh4R100755 ro-MD.js yv
M9` ]s2E>q{100755 ro-MD.js.map ƒTD;\-6100755 ro.d.ts 0^݋rӯosO:100755 ro.js En# HvT9100755 ro.js.map U*NmaW>XX100755 rof.d.ts p!Q{䌀-Q=100755 rof.js "_Bv/F%3100755 rof.js.map kGECR@&100755 ru-BY.d.ts /^L$R@B 100755 ru-BY.js i6R2\ S8100755 ru-BY.js.map Xf11:4Z#g9ܑ100755 ru-KG.d.ts  z.CHe"H!Rt5100755 ru-KG.js /3)_O%il ֹ_100755 ru-KG.js.map )+d0YzSW,I9X100755 ru-KZ.d.ts c|EnN,g100755 ru-KZ.js 9sTuK~88100755 ru-KZ.js.map )
̸
c{w VS100755 ru-MD.d.ts dJ,,^Kn+d100755 ru-MD.js ^voGT"򄬫;B100755 ru-MD.js.map 'BH,663100755 ru-UA.d.ts D1A
g7q<o{100755 ru-UA.js fCР.` Wp!100755 ru-UA.js.map %cF+t100755 ru.d.ts D1A
g7q<o{100755 ru.js VYhWMgX<ۥ100755 ru.js.map w.Y9{100755 rw.d.ts щ\DxCpT100755 rw.js 7XF.]Pz100755 rw.js.map OJSwJHmx+100755 rwk.d.ts p!Q{䌀-Q=100755 rwk.js +ύ+]ִ`2X`100755 rwk.js.map ,fOR˘RV\?100755 sa.d.ts mj㣅LwXN100755 sa.js E͓;+?f100755 sa.js.map 	)*R.s5$100755 sah.d.ts p9L3LO|100755 sah.js 4#DC"
fܲEHuC100755 sah.js.map M#yc:|Ź7\100755 saq.d.ts ;Czo
xCui5100755 saq.js EL6f~ %3JSf!100755 saq.js.map L}f 4ln-Yb100755 sat-Olck.d.ts mj㣅LwXN100755 sat-Olck.js -]&0^<p100755 sat-Olck.js.map it*kN%Oz<A4100755 sat.d.ts mj㣅LwXN100755 sat.js |=*h{,EfSO100755 sat.js.map ̚r#Tkɖ?x1100755 sbp.d.ts p!Q{䌀-Q=100755 sbp.js *hyj`/100755 sbp.js.map 5[ּa%!E'100755 sc.d.ts &
8 U(o@100755 sc.js SS0>)100755 sc.js.map p5Ja5[100755 sd-Arab.d.ts v
<ks7PU1ap_100755 sd-Arab.js XK2sua6?100755 sd-Arab.js.map Vg[Prthe100755 sd-Deva.d.ts {^+O҇|h{'NY100755 sd-Deva.js m5D!vVWNMLװs100755 sd-Deva.js.map u-$1c&;Y100755 sd.d.ts v
<ks7PU1ap_100755 sd.js ,]Ô/=Hj100755 sd.js.map }9)s3xڠ100755 se-FI.d.ts CdQy8弝8BM100755 se-FI.js WjcE&100755 se-FI.js.map )K/Ц100755 se-SE.d.ts CdQy8弝8BM100755 se-SE.js cHm3)9Z.24100755 se-SE.js.map  X7ozV:;Ê100755 se.d.ts CdQy8弝8BM100755 se.js PVԵ¢BINq?;i100755 se.js.map 1O[v zG1100755 seh.d.ts LB&Fl<Fvi'100755 seh.js hY9wC100755 seh.js.map 1H6)#=X</100755 ses.d.ts mj㣅LwXN100755 ses.js 0)|(4100755 ses.js.map 6N"j!g_ 100755 sg.d.ts mj㣅LwXN100755 sg.js t+_}-D100755 sg.js.map $ż yX$100755 shi-Latn.d.ts mj㣅LwXN100755 shi-Latn.js W\7< _sOlAb9F[100755 shi-Latn.js.map ^R/.}oˆfo2100755 shi-Tfng.d.ts mj㣅LwXN100755 shi-Tfng.js jlNz /|՛0V100755 shi-Tfng.js.map ǣ9M9w|$X100755 shi.d.ts mj㣅LwXN100755 shi.js ms|k)/100755 shi.js.map B8(+5:.100755 si.d.ts FĶQy3100755 si.js p'_&NBj]100755 si.js.map PYҸ7100755 sk.d.ts eH_ʾ^xU㚨#100755 sk.js 1QQ֑[WQV0ߢ100755 sk.js.map m\8$PB100755 sl.d.ts nQjY(X4E?w{100755 sl.js }L7mf921100755 sl.js.map 	c/(XD],OFd100755 smn.d.ts mj㣅LwXN100755 smn.js \.-\Iϱ100755 smn.js.map SӞg\E(100755 sn.d.ts mj㣅LwXN100755 sn.js znGÙC\Xk(100755 sn.js.map 9ُ};piZ	p~ȍ100755 so-DJ.d.ts 1vGPHh .*eM100755 so-DJ.js qPQh|%O100755 so-DJ.js.map s̤I>XLPrQ100755 so-ET.d.ts ?*N},sm%a6q~100755 so-ET.js \Tpx<`+100755 so-ET.js.map P_yIԦϙV|A100755 so-KE.d.ts +e|/8\xStt100755 so-KE.js WZ:^\Rq1M100755 so-KE.js.map %5x
)mDǠ1100755 so.d.ts NN5e3Ò
c100755 so.js ïx$6ΰHiu100755 so.js.map Os?y<P𿽋100755 sq-MK.d.ts *ˎ;!36
ǈ100755 sq-MK.js ,ZK׏ ďAJ=100755 sq-MK.js.map z&g7.E ]100755 sq-XK.d.ts k$RaY!|K100755 sq-XK.js  BP.E;k*100755 sq-XK.js.map .Ȑ>˙BEqߐ		100755 sq.d.ts k$RaY!|K100755 sq.js ܵb:7!B(>j100755 sq.js.map ޻(+aQؒIػ100755 sr-Cyrl-BA.d.ts MR0"(2100755 sr-Cyrl-BA.js 4Xx
CDSCB100755 sr-Cyrl-BA.js.map 8+}ǫ[;B100755 sr-Cyrl-ME.d.ts MR0"(2100755 sr-Cyrl-ME.js 5;T"<w%)Cť100755 sr-Cyrl-ME.js.map [` jCYh9O100755 sr-Cyrl-XK.d.ts MR0"(2100755 sr-Cyrl-XK.js Od4ޢA̸100755 sr-Cyrl-XK.js.map ŶZS:D*≮9%100755 sr-Cyrl.d.ts MR0"(2100755 sr-Cyrl.js 'JQ:Hfq$:100755 sr-Cyrl.js.map Vnu/C݇E=T100755 sr-Latn-BA.d.ts MR0"(2100755 sr-Latn-BA.js NC^a)4tG.100755 sr-Latn-BA.js.map t@UUeH@100755 sr-Latn-ME.d.ts MR0"(2100755 sr-Latn-ME.js y0^N2Z!
100755 sr-Latn-ME.js.map dΓ>257100755 sr-Latn-XK.d.ts MR0"(2100755 sr-Latn-XK.js !zEY9iv>100755 sr-Latn-XK.js.map s]Y/f\Ϟv100755 sr-Latn.d.ts MR0"(2100755 sr-Latn.js h{jBuW:x*100755 sr-Latn.js.map ̀j}蕣BmM100755 sr.d.ts MR0"(2100755 sr.js ԊT C`82AVB100755 sr.js.map K46J3WTܨ-t100755 su-Latn.d.ts [֢.!pۿr_EK100755 su-Latn.js 1!"100755 su-Latn.js.map e`jxMşyM'T100755 su.d.ts [֢.!pۿr_EK100755 su.js ;0vPDVId100755 su.js.map gb3=o#o100755 sv-AX.d.ts 3a}cփjHD;s100755 sv-AX.js U) R",ɬS$/100755 sv-AX.js.map 7Uhn/l100755 sv-FI.d.ts 3a}cփjHD;s100755 sv-FI.js Ob1/82,/B100755 sv-FI.js.map [)󃓂(]
|ɭn100755 sv.d.ts 3a}cփjHD;s100755 sv.js T5ķCgruIr100755 sv.js.map gkue~:100755 sw-CD.d.ts 9m~%&`5n~"100755 sw-CD.js Tkx҅e)>|.Z100755 sw-CD.js.map mFj~&}3h.%n100755 sw-KE.d.ts Teb/C $u100755 sw-KE.js qo?.H&4Wqʂ100755 sw-KE.js.map SIzh8%'o100755 sw-UG.d.ts LLVn?<jC100755 sw-UG.js H<O-!Bl|100755 sw-UG.js.map _BZOfގU"6100755 sw.d.ts ˉ0qD:y|پP100755 sw.js Lh2!u(V100755 sw.js.map AL4='nN100755 ta-LK.d.ts 4ٞN{Jw>100755 ta-LK.js xٽn*<؂Xe100755 ta-LK.js.map <M nlR100755 ta-MY.d.ts .g\lkkf100755 ta-MY.js VBXU.1+@j100755 ta-MY.js.map `EŮ100755 ta-SG.d.ts @tCoǤ_67<8100755 ta-SG.js N?)H1to촯100755 ta-SG.js.map E^xk"bf^100755 ta.d.ts 5JQ(vTGآIw100755 ta.js \v/Gnf?@|?ă100755 ta.js.map ga7'<cI_ی100755 te.d.ts XY`Xݡ` 100755 te.js ؗ%Jn4;XK100755 te.js.map dZ}>h!#100755 teo-KE.d.ts ":8}c2z100755 teo-KE.js urJzHm?~Iΰ7=1W100755 teo-KE.js.map obk
8>N|g100755 teo.d.ts zhHy)ZU֌o100755 teo.js =Ek7}/o2tX.*100755 teo.js.map SAt^m%100755 tg.d.ts R,4s+Ry100755 tg.js a5[AT	6s100755 tg.js.map 7Qd4'Qj0{100755 th.d.ts Cb-|i.ڽѵz100755 th.js -r( jV1100755 th.js.map ɬz~Wsbn100755 ti-ER.d.ts p|>NYYB-\\W100755 ti-ER.js q@;LOwآ	05>100755 ti-ER.js.map ق6rS6vVzWSp100755 ti.d.ts V^^Թ#eSX100755 ti.js muwR1T/P{>100755 ti.js.map 
_s{E!)P,zK100755 tk.d.ts U$o^>߂ fDI100755 tk.js ]T^O%*]rqe100755 tk.js.map +P8rk:G100755 to.d.ts z'W[FMH5`100755 to.js 9d' Ѿ100755 to.js.map cIDf/1EOdb100755 tr-CY.d.ts 
@
zIٳ9ۄ100755 tr-CY.js o/|w$X2
+ܰb100755 tr-CY.js.map C)5#e?rr.100755 tr.d.ts 
@
zIٳ9ۄ100755 tr.js >cU"1jWF100755 tr.js.map .`>b<	100755 tt.d.ts Y(V3zu=1@100755 tt.js ;Xk&ٴ100755 tt.js.map މ}ƩAk*6i100755 twq.d.ts mj㣅LwXN100755 twq.js TBdعᎥaq100755 twq.js.map ) Q sp yb9100755 tzm.d.ts mj㣅LwXN100755 tzm.js i:+weRQXM100755 tzm.js.map aׅ)>3|T98	100755 ug.d.ts [tMTt^;v4100755 ug.js -Px&	Z/>100755 ug.js.map Ǡht,Er'100755 uk.d.ts qpR0@3100755 uk.js wU[.W|5100755 uk.js.map {(Z:qySipA100755 und.d.ts ()QٸdC;ÀH100755 und.js uO:g\u6yN100755 und.js.map (#7o='9LO100755 ur-IN.d.ts XY`Xݡ` 100755 ur-IN.js ع++-HHCQ]4100755 ur-IN.js.map i!.k>Dvw100755 ur.d.ts BVL~K:sxPD100755 ur.js ;**o!V9	h100755 ur.js.map >ת&/-100755 uz-Arab.d.ts erоY;bw!K100755 uz-Arab.js ϥClGߡ100755 uz-Arab.js.map < 3yk꺴+100755 uz-Cyrl.d.ts ǆ3gB_ThʫK100755 uz-Cyrl.js fbP-|Ѡ100755 uz-Cyrl.js.map t<-dCt
g100755 uz-Latn.d.ts SsY	soiHt$ 100755 uz-Latn.js 4ߕQF{100755 uz-Latn.js.map Tym؁;ނ6*100755 uz.d.ts SsY	soiHt$ 100755 uz.js x{nGjz1&b100755 uz.js.map |$U{)&B0qm100755 vai-Latn.d.ts .;dUI[i.j<D100755 vai-Latn.js Mfa[gW<E,100755 vai-Latn.js.map '5Pg2>BZaԅ!100755 vai-Vaii.d.ts .;dUI[i.j<D100755 vai-Vaii.js ߹)8b0H+A100755 vai-Vaii.js.map ]	<|vI4q.{100755 vai.d.ts .;dUI[i.j<D100755 vai.js mk*Dx(ٝ/100755 vai.js.map ¾hh`0100755 vi.d.ts Cb-|i.ڽѵz100755 vi.js uPŚg0"E100755 vi.js.map 1׾:Z)kvdN25100755 vun.d.ts p!Q{䌀-Q=100755 vun.js 2? `*!.B100755 vun.js.map hG\S^Ih.100755 wae.d.ts ()QٸdC;ÀH100755 wae.js 7
e5tZU-%Ig100755 wae.js.map R-VsN?=
A
100755 wo.d.ts 4u17eq100755 wo.js 85I/3KQӎ`X100755 wo.js.map Vڗ΃ꇔ: dU'r100755 xh.d.ts O>9J=*$100755 xh.js 4.2rd?	ƅ100755 xh.js.map |q.{24:100755 xog.d.ts zhHy)ZU֌o100755 xog.js a+\gإ100755 xog.js.map и\Ϫ]!l9wNQ100755 yav.d.ts mj㣅LwXN100755 yav.js ni|)nsRZ?100755 yav.js.map v:M~qN5`$100755 yi.d.ts mj㣅LwXN100755 yi.js Tu׋(100755 yi.js.map ̔R='W;@100755 yo-BJ.d.ts WQ100755 yo-BJ.js la*`Rx=)100755 yo-BJ.js.map IFB6ɡM100755 yo.d.ts WQ100755 yo.js NSc<Gj6#100755 yo.js.map 4emnʹ2\p.ms100755 yrl-CO.d.ts d!fyw$100755 yrl-CO.js &6 ӽyr{'GS!100755 yrl-CO.js.map ׶6L xmݶ(-100755 yrl-VE.d.ts d!fyw$100755 yrl-VE.js 5T`m=m`wiB100755 yrl-VE.js.map U%e?o!cg@eV`m d100755 yrl.d.ts d!fyw$100755 yrl.js mMPձ>S*G"_100755 yrl.js.map R>EMa19r$_100755 yue-Hans.d.ts L_XU.oT2S100755 yue-Hans.js :jj4{w.:xrz100755 yue-Hans.js.map 6CSaI4100755 yue-Hant.d.ts ݝ4ǊE?h.@}100755 yue-Hant.js ёW5TEne100755 yue-Hant.js.map J1w3@JB$@VI100755 yue.d.ts ݝ4ǊE?h.@}100755 yue.js s\QS?100755 yue.js.map Ku\Х%ՈçjK100755 zgh.d.ts mj㣅LwXN100755 zgh.js HV6>>+ 100755 zgh.js.map Q,^BF_fT&O100755 zh-Hans-HK.d.ts Kq)!UO«-O100755 zh-Hans-HK.js  pXܺBA100755 zh-Hans-HK.js.map WҖmDD<ıΘ+3100755 zh-Hans-MO.d.ts )ͻI"-zv?WD100755 zh-Hans-MO.js 2K2cUa
Vk100755 zh-Hans-MO.js.map e s;%100755 zh-Hans-SG.d.ts mUG!`&100755 zh-Hans-SG.js m%gGT1100755 zh-Hans-SG.js.map nAُV!䐷<'\vR100755 zh-Hans.d.ts ]V;NF<aQ&100755 zh-Hans.js ZjNh*t١G:100755 zh-Hans.js.map "In,)H100755 zh-Hant-HK.d.ts ~
()꿃\,ؖw100755 zh-Hant-HK.js kexLNHJ˞lq100755 zh-Hant-HK.js.map "a`ο4IjzB>!100755 zh-Hant-MO.d.ts )zP^RyG粽+UE100755 zh-Hant-MO.js {RtwB{=>(100755 zh-Hant-MO.js.map H2W	n{T&100755 zh-Hant.d.ts H	6xN:Ot_7100755 zh-Hant.js 9gy"+!<P F6100755 zh-Hant.js.map FؽU{&bV)100755 zh.d.ts ]V;NF<aQ&100755 zh.js l4ƣb@Mm*Q\ 100755 zh.js.map aV#)yf҄+"|M,100755 zu.d.ts ȧͧح{6D0ۉ-<100755 zu.js ,>==^%P100755 zu.js.map [Vp=KZAaxV100755 af-NA.d.ts DmrΨFFDҰbf100755 af-NA.js |$4=)100755 af-NA.js.map UX}}h100755 af.d.ts DmrΨFFDҰbf100755 af.js nϦڄQn100755 af.js.map hk8Z:Y100755 agq.d.ts 2p-+U#\3jȧt{U100755 agq.js :Zl	|9Z"100755 agq.js.map UxAJ7*o7ڮiƣ100755 ak.d.ts 2p-+U#\3jȧt{U100755 ak.js 1O8qRL/6.JB! 100755 ak.js.map |N#U,y꿘. ^100755 am.d.ts DmrΨFFDҰbf100755 am.js }uW\g]^100755 am.js.map C6+g.&A100755 ar-AE.d.ts |ώ
-":k100755 ar-AE.js vU8l&s100755 ar-AE.js.map gA	e(vӇ:j100755 ar-BH.d.ts |ώ
-":k100755 ar-BH.js Ylj'&)7,J&100755 ar-BH.js.map Q޽tV&Y2oZ100755 ar-DJ.d.ts |ώ
-":k100755 ar-DJ.js /LR]Odw100755 ar-DJ.js.map !-iVp\>h46t100755 ar-DZ.d.ts |ώ
-":k100755 ar-DZ.js ʯ4^=edD7	100755 ar-DZ.js.map f̕"/<V"J	100755 ar-EG.d.ts |ώ
-":k100755 ar-EG.js 7ywRl_<G8s3100755 ar-EG.js.map C_)~ 7100755 ar-EH.d.ts |ώ
-":k100755 ar-EH.js U(4vЫ(M9dK100755 ar-EH.js.map fş0)Ə0100755 ar-ER.d.ts |ώ
-":k100755 ar-ER.js >1tnp3xE(:100755 ar-ER.js.map 5N\-|0Z%(d+)100755 ar-IL.d.ts |ώ
-":k100755 ar-IL.js HfmJ)
HG?100755 ar-IL.js.map 2tԓ2_ T7a100755 ar-IQ.d.ts |ώ
-":k100755 ar-IQ.js |86݂$m#100755 ar-IQ.js.map J`t~D@'DU100755 ar-JO.d.ts |ώ
-":k100755 ar-JO.js Y+lQ16`cQh100755 ar-JO.js.map +.ŲEܓC100755 ar-KM.d.ts |ώ
-":k100755 ar-KM.js ~FS\wlI100755 ar-KM.js.map GSQȶEF*@,100755 ar-KW.d.ts |ώ
-":k100755 ar-KW.js M*LHExz15	>100755 ar-KW.js.map H`q֋do{Аw100755 ar-LB.d.ts |ώ
-":k100755 ar-LB.js X].7zn X100755 ar-LB.js.map .D<ۺd;M100755 ar-LY.d.ts |ώ
-":k100755 ar-LY.js 8buq;L100755 ar-LY.js.map )onJfkU100755 ar-MA.d.ts |ώ
-":k100755 ar-MA.js #InЕR1mR100755 ar-MA.js.map 8pR'fS100755 ar-MR.d.ts |ώ
-":k100755 ar-MR.js 0Y~O;>100755 ar-MR.js.map 3E8F)vPRCv100755 ar-OM.d.ts |ώ
-":k100755 ar-OM.js =r0Bd,100755 ar-OM.js.map 'a%-R*y;O{100755 ar-PS.d.ts |ώ
-":k100755 ar-PS.js 2tT̱~ʳ?100755 ar-PS.js.map (3l*c:'	m100755 ar-QA.d.ts |ώ
-":k100755 ar-QA.js `3]<>tE 5100755 ar-QA.js.map |NӸcS100755 ar-SA.d.ts |ώ
-":k100755 ar-SA.js A$YΖbN~>V/100755 ar-SA.js.map 7c,s|+s100755 ar-SD.d.ts |ώ
-":k100755 ar-SD.js ssO}HQ100755 ar-SD.js.map 
	(pwaմBm100755 ar-SO.d.ts |ώ
-":k100755 ar-SO.js bXfBE2d{)100755 ar-SO.js.map fK|).9@^100755 ar-SS.d.ts |ώ
-":k100755 ar-SS.js l;T%ӑy߈;t=}N;100755 ar-SS.js.map (xX-H6m100755 ar-SY.d.ts |ώ
-":k100755 ar-SY.js 	qRb+z}~efI!b100755 ar-SY.js.map S<L@p-~|N-e100755 ar-TD.d.ts |ώ
-":k100755 ar-TD.js 8iy{h2|w100755 ar-TD.js.map (L}15B'ϐ8100755 ar-TN.d.ts |ώ
-":k100755 ar-TN.js  |y^ߏw&100755 ar-TN.js.map >;H9Y100755 ar-YE.d.ts |ώ
-":k100755 ar-YE.js M,$OmHUL100755 ar-YE.js.map ͑3
.BYVS100755 ar.d.ts |ώ
-":k100755 ar.js 0Ykx-_4100755 ar.js.map S?,Mu^qq100755 as.d.ts 2p-+U#\3jȧt{U100755 as.js {#< pkj[MC100755 as.js.map c)m
100755 asa.d.ts 2p-+U#\3jȧt{U100755 asa.js ަ!/.zuD100755 asa.js.map BOwYH.(100755 ast.d.ts 2p-+U#\3jȧt{U100755 ast.js QU|)ρ悲100755 ast.js.map ^+yvBeMGM100755 az-Cyrl.d.ts DmrΨFFDҰbf100755 az-Cyrl.js 9Sbp">6@X@:100755 az-Cyrl.js.map H^QE~100755 az-Latn.d.ts DmrΨFFDҰbf100755 az-Latn.js ԁ2(?^<100755 az-Latn.js.map 9:%` $迄100755 az.d.ts DmrΨFFDҰbf100755 az.js  #36?F?'p100755 az.js.map ][K2OD>oZ100755 bas.d.ts 2p-+U#\3jȧt{U100755 bas.js {⊞[jes1100755 bas.js.map ni̇gbP31b":7100755 be-tarask.d.ts 2p-+U#\3jȧt{U100755 be-tarask.js ;u7[6l%<100755 be-tarask.js.map D(ӎfWW100755 be.d.ts 2p-+U#\3jȧt{U100755 be.js #?ɍ`4N'Y[v100755 be.js.map <b9F3,%8 Kޘy100755 bem.d.ts 2p-+U#\3jȧt{U100755 bem.js JAɢ|,l3ex100755 bem.js.map I:nfv=)DCX:100755 bez.d.ts 2p-+U#\3jȧt{U100755 bez.js +DΈ@Xos]100755 bez.js.map GLc'hў_+100755 bg.d.ts ~s'd`>N[100755 bg.js i^
zrޠ100755 bg.js.map  :'ZLVF[h|G100755 bm.d.ts 2p-+U#\3jȧt{U100755 bm.js ՙ;=GQ8'100755 bm.js.map Nur5a=Ҧ:_100755 bn-IN.d.ts ݃?fx^]]`yDe100755 bn-IN.js U9Q=4uE+x100755 bn-IN.js.map  )Qpßc3%5100755 bn.d.ts ݃?fx^]]`yDe100755 bn.js ,"!;E|Y100755 bn.js.map _
p-CJR7100755 bo-IN.d.ts 2p-+U#\3jȧt{U100755 bo-IN.js =XT]륡QU100755 bo-IN.js.map vf2mY#|cNL100755 bo.d.ts 2p-+U#\3jȧt{U100755 bo.js e.4A3!100755 bo.js.map <Q..۬}h 100755 br.d.ts 2p-+U#\3jȧt{U100755 br.js 6ZfPU]rrօ%^100755 br.js.map h~U$5=F&~pv100755 brx.d.ts 2p-+U#\3jȧt{U100755 brx.js @TzC<g100755 brx.js.map BEj<(nF(/100755 bs-Cyrl.d.ts DmrΨFFDҰbf100755 bs-Cyrl.js 2Cc2b5PZmpD100755 bs-Cyrl.js.map 	HYdPɗ100755 bs-Latn.d.ts ~s'd`>N[100755 bs-Latn.js &
ՓUGv6,u!100755 bs-Latn.js.map $.0`!r100755 bs.d.ts ~s'd`>N[100755 bs.js #`@0[9T̯NT100755 bs.js.map i=&N!k100755 ca-AD.d.ts DmrΨFFDҰbf100755 ca-AD.js G1"qи/100755 ca-AD.js.map n偠W"ȞJr$DPf100755 ca-ES-valencia.d.ts DmrΨFFDҰbf100755 ca-ES-valencia.js  W-pK"L]100755 ca-ES-valencia.js.map (:2ݬN])I100755 ca-FR.d.ts DmrΨFFDҰbf100755 ca-FR.js fXxM!!0 100755 ca-FR.js.map 7a35O+f100755 ca-IT.d.ts DmrΨFFDҰbf100755 ca-IT.js Fb4ϠRV1Gz100755 ca-IT.js.map σ703)חTgQ100755 ca.d.ts DmrΨFFDҰbf100755 ca.js ˧bR)XAoi-100755 ca.js.map RxCO->[  100755 ccp-IN.d.ts m"ZB8/XZ9100755 ccp-IN.js \G$7]eVRI100755 ccp-IN.js.map Dȁ"x%FLv100755 ccp.d.ts m"ZB8/XZ9100755 ccp.js eDJ VG100755 ccp.js.map S5!A٥i=bpAC100755 ce.d.ts 2p-+U#\3jȧt{U100755 ce.js Vk-tĢBf&sN100755 ce.js.map R1]杏c100755 ceb.d.ts 2p-+U#\3jȧt{U100755 ceb.js d@uk<100755 ceb.js.map /_,_-A100755 cgg.d.ts 2p-+U#\3jȧt{U100755 cgg.js ɗ9PPKJs)MpA100755 cgg.js.map L̼vfhtkbKp}L100755 chr.d.ts DmrΨFFDҰbf100755 chr.js u^3AGgP
100755 chr.js.map a9$O',XRFu;{100755 ckb-IR.d.ts 2p-+U#\3jȧt{U100755 ckb-IR.js VV	%|?-:100755 ckb-IR.js.map qt!̠FZLѪ100755 ckb.d.ts 2p-+U#\3jȧt{U100755 ckb.js :"%j{N5<D`wb@100755 ckb.js.map N@v7Lgx100755 cs.d.ts DmrΨFFDҰbf100755 cs.js o>>lE}(yb100755 cs.js.map pW$ku
r~mOW100755 cy.d.ts DmrΨFFDҰbf100755 cy.js Wj޲0i2dt~5\100755 cy.js.map pb^$3u/$100755 da-GL.d.ts DmrΨFFDҰbf100755 da-GL.js  fHǉ-2:%%E@100755 da-GL.js.map ̥;BVZ8.V100755 da.d.ts DmrΨFFDҰbf100755 da.js J?&ue)-*ٿA100755 da.js.map $.wo<	t=z1 5ŝ100755 dav.d.ts 2p-+U#\3jȧt{U100755 dav.js ;PnܳC:^@j)100755 dav.js.map onC1#um>%6100755 de-AT.d.ts DmrΨFFDҰbf100755 de-AT.js ҝeʄ׾ykn100755 de-AT.js.map ɔE%JvG
 6g100755 de-BE.d.ts DmrΨFFDҰbf100755 de-BE.js Ïm6&Q7ݭ{m100755 de-BE.js.map oy35)޾39100755 de-CH.d.ts DmrΨFFDҰbf100755 de-CH.js FW)Ҙx.f100755 de-CH.js.map ޘڃ[!f<#100755 de-IT.d.ts DmrΨFFDҰbf100755 de-IT.js ūq.zd	T100755 de-IT.js.map =OZB100755 de-LI.d.ts DmrΨFFDҰbf100755 de-LI.js B@uSL	P[u100755 de-LI.js.map h94!100755 de-LU.d.ts DmrΨFFDҰbf100755 de-LU.js uaQS_knt100755 de-LU.js.map /Ng޸4kM100755 de.d.ts DmrΨFFDҰbf100755 de.js  xh
"˖fW100755 de.js.map _&]&5Զ100755 dje.d.ts 2p-+U#\3jȧt{U100755 dje.js ]92,ʒ100755 dje.js.map Mq>v60aW100755 doi.d.ts 2p-+U#\3jȧt{U100755 doi.js qDtX ;<4hN100755 doi.js.map l5	fY6C[wQCLް100755 dsb.d.ts 2p-+U#\3jȧt{U100755 dsb.js mc4 wdJf100755 dsb.js.map ѽ]"$1OJCx100755 dua.d.ts 2p-+U#\3jȧt{U100755 dua.js RC,">[
V100755 dua.js.map [a^D*4e100755 dyo.d.ts 2p-+U#\3jȧt{U100755 dyo.js (SIqiba100755 dyo.js.map 0̟`\1.+҄Ӻb100755 dz.d.ts 2p-+U#\3jȧt{U100755 dz.js 64hriwiMT󯰣100755 dz.js.map  T ;ű100755 ebu.d.ts 2p-+U#\3jȧt{U100755 ebu.js  9ʒYbX100755 ebu.js.map v'|:.aZW##ڰ100755 ee-TG.d.ts m"ZB8/XZ9100755 ee-TG.js PxEy[=100755 ee-TG.js.map R\55 |o100755 ee.d.ts m"ZB8/XZ9100755 ee.js Zwa\Ԝe4100755 ee.js.map h
Qm}1X|ո100755 el-CY.d.ts ݃?fx^]]`yDe100755 el-CY.js a?W.wX4	100755 el-CY.js.map BK~B#hszo100755 el.d.ts ݃?fx^]]`yDe100755 el.js MWqYZ}HZHF100755 el.js.map ?wPWV	P礃100755 en-001.d.ts DmrΨFFDҰbf100755 en-001.js  fZ*P6<EF%X+100755 en-001.js.map s^Htt100755 en-150.d.ts DmrΨFFDҰbf100755 en-150.js U*lNI^v100755 en-150.js.map <BW-A:IW NCriZ100755 en-AE.d.ts DmrΨFFDҰbf100755 en-AE.js )he~8H};100755 en-AE.js.map BY!TLѝW"100755 en-AG.d.ts DmrΨFFDҰbf100755 en-AG.js JCgxCRv}~100755 en-AG.js.map S^mHl>+r100755 en-AI.d.ts DmrΨFFDҰbf100755 en-AI.js [G>'w100755 en-AI.js.map !3#Ɇ100755 en-AS.d.ts DmrΨFFDҰbf100755 en-AS.js "^ "H/_Ȑ100755 en-AS.js.map D}(QH]]b100755 en-AT.d.ts DmrΨFFDҰbf100755 en-AT.js KJnߗ҆	#0100755 en-AT.js.map .3W b:M8C100755 en-AU.d.ts DmrΨFFDҰbf100755 en-AU.js `ld *hFd~u6100755 en-AU.js.map Y3*Bm.A#100755 en-BB.d.ts DmrΨFFDҰbf100755 en-BB.js I2iدES100755 en-BB.js.map R:[oK=clc+100755 en-BE.d.ts DmrΨFFDҰbf100755 en-BE.js 䢄R5]`;twn%100755 en-BE.js.map /̃[a>1η100755 en-BI.d.ts DmrΨFFDҰbf100755 en-BI.js ul|w*8}~!`Y8100755 en-BI.js.map 7i7WmTC8{f0S100755 en-BM.d.ts DmrΨFFDҰbf100755 en-BM.js rQ7c4AMFLF100755 en-BM.js.map m.&U?9P"mn1100755 en-BS.d.ts DmrΨFFDҰbf100755 en-BS.js tmn5U(#@7e[100755 en-BS.js.map u6%;\0e:100755 en-BW.d.ts DmrΨFFDҰbf100755 en-BW.js oAmŤ
7P_{zz100755 en-BW.js.map fX`Fb.&r<,100755 en-BZ.d.ts DmrΨFFDҰbf100755 en-BZ.js ٠amrK100755 en-BZ.js.map Dff/FL100755 en-CA.d.ts DmrΨFFDҰbf100755 en-CA.js Gv GxF`l100755 en-CA.js.map !]TZ`a6C:T100755 en-CC.d.ts DmrΨFFDҰbf100755 en-CC.js fm?YD,%O@ʨt100755 en-CC.js.map Vtܨ+X100755 en-CH.d.ts DmrΨFFDҰbf100755 en-CH.js @+.`ʖ100755 en-CH.js.map ڌ]!YqwkI100755 en-CK.d.ts DmrΨFFDҰbf100755 en-CK.js (a uI100755 en-CK.js.map jqN.S100755 en-CM.d.ts DmrΨFFDҰbf100755 en-CM.js 1m~fBnckD$100755 en-CM.js.map ,o6a1,[=)V100755 en-CX.d.ts DmrΨFFDҰbf100755 en-CX.js 먯!BnD{100755 en-CX.js.map u{r/??Uvj100755 en-CY.d.ts DmrΨFFDҰbf100755 en-CY.js jI:/$P±<]AsY100755 en-CY.js.map C:-t6MbCfG100755 en-DE.d.ts DmrΨFFDҰbf100755 en-DE.js REί%Bs]MIc100755 en-DE.js.map r&3A*8[100755 en-DG.d.ts DmrΨFFDҰbf100755 en-DG.js `6ˉܵ~r+100755 en-DG.js.map ٹ,<ݻXrjsz100755 en-DK.d.ts DmrΨFFDҰbf100755 en-DK.js RL)H}ƌ!100755 en-DK.js.map ~{,|zm,)[100755 en-DM.d.ts DmrΨFFDҰbf100755 en-DM.js ?t-Ix100755 en-DM.js.map Q^ uGC!7<100755 en-ER.d.ts DmrΨFFDҰbf100755 en-ER.js xQ}le=Ca`E100755 en-ER.js.map <O<831:100755 en-FI.d.ts DmrΨFFDҰbf100755 en-FI.js U{QiO&WTeĈn100755 en-FI.js.map z0+ a&NqHٕ.100755 en-FJ.d.ts DmrΨFFDҰbf100755 en-FJ.js W:".S3jY100755 en-FJ.js.map TCY\S(Tk<:N!100755 en-FK.d.ts DmrΨFFDҰbf100755 en-FK.js 6@0~nxHu100755 en-FK.js.map  lZ0100755 en-FM.d.ts DmrΨFFDҰbf100755 en-FM.js 2\D 
 6=k100755 en-FM.js.map / Fg)R Tڕ100755 en-GB.d.ts DmrΨFFDҰbf100755 en-GB.js 3y?=L:'g-100755 en-GB.js.map 7χ=o|Y100755 en-GD.d.ts DmrΨFFDҰbf100755 en-GD.js .MYGa mCߺ/&:100755 en-GD.js.map FHJ?^4xe100755 en-GG.d.ts DmrΨFFDҰbf100755 en-GG.js ɤ	I8/[GM100755 en-GG.js.map PXxN#Ӯ100755 en-GH.d.ts DmrΨFFDҰbf100755 en-GH.js yko"&!k100755 en-GH.js.map S]dHvqLV9i+/100755 en-GI.d.ts DmrΨFFDҰbf100755 en-GI.js O ms68Gu`v&100755 en-GI.js.map ut1ven@6100755 en-GM.d.ts DmrΨFFDҰbf100755 en-GM.js g'NFZ'"s+0100755 en-GM.js.map a9@Gdq'g"100755 en-GU.d.ts DmrΨFFDҰbf100755 en-GU.js 7OZVH.#\Hsu100755 en-GU.js.map lj-#6n100755 en-GY.d.ts DmrΨFFDҰbf100755 en-GY.js ةB5
ѱ]mMYS100755 en-GY.js.map ƀs?1;Q,k100755 en-HK.d.ts DmrΨFFDҰbf100755 en-HK.js )u3Tql100755 en-HK.js.map nAY]ՀewJ$100755 en-IE.d.ts DmrΨFFDҰbf100755 en-IE.js ^I;Rt?Вı100755 en-IE.js.map I%VOY]nV100755 en-IL.d.ts DmrΨFFDҰbf100755 en-IL.js X[hwS.L?100755 en-IL.js.map h︭-h;A
100755 en-IM.d.ts DmrΨFFDҰbf100755 en-IM.js 
txZ`ckR100755 en-IM.js.map t5+ͼ100755 en-IN.d.ts DmrΨFFDҰbf100755 en-IN.js K[~b100755 en-IN.js.map .DMjJ6DRw100755 en-IO.d.ts DmrΨFFDҰbf100755 en-IO.js Uk%os$چn100755 en-IO.js.map P=g
vp0Pugr,100755 en-JE.d.ts DmrΨFFDҰbf100755 en-JE.js b.pjxAI"100755 en-JE.js.map -}uP*=rVޔȥ100755 en-JM.d.ts DmrΨFFDҰbf100755 en-JM.js U	Y\B3NK100755 en-JM.js.map OsTͭ<=fv2PG100755 en-KE.d.ts DmrΨFFDҰbf100755 en-KE.js TSw%100755 en-KE.js.map e5D
oBv5100755 en-KI.d.ts DmrΨFFDҰbf100755 en-KI.js Oqu&RkOqЯx100755 en-KI.js.map 
mYUD100755 en-KN.d.ts DmrΨFFDҰbf100755 en-KN.js U-yƄ} r:100755 en-KN.js.map N3SvP9B Q100755 en-KY.d.ts DmrΨFFDҰbf100755 en-KY.js ۙ8'&ϝВ7d0ÚQ100755 en-KY.js.map }}T.Г5&[BR100755 en-LC.d.ts DmrΨFFDҰbf100755 en-LC.js P*JHPM| 8z'100755 en-LC.js.map ?5GwU1*100755 en-LR.d.ts DmrΨFFDҰbf100755 en-LR.js 8Lw}kW100755 en-LR.js.map cP
;	<,o100755 en-LS.d.ts DmrΨFFDҰbf100755 en-LS.js j:?n qCg&100755 en-LS.js.map ه,9S]V@100755 en-MG.d.ts DmrΨFFDҰbf100755 en-MG.js ;XF$R6۽g	^100755 en-MG.js.map |.L ,XE첣1 100755 en-MH.d.ts DmrΨFFDҰbf100755 en-MH.js RlU$)/100755 en-MH.js.map l(9dd"ͣɖ(100755 en-MO.d.ts DmrΨFFDҰbf100755 en-MO.js ЕmܤEUWn 100755 en-MO.js.map hV
ߒ.Ldm100755 en-MP.d.ts DmrΨFFDҰbf100755 en-MP.js b uB3qY_mo100755 en-MP.js.map M"j\Θ;6]]F100755 en-MS.d.ts DmrΨFFDҰbf100755 en-MS.js 4#u{xuGme!100755 en-MS.js.map >jw!C'100755 en-MT.d.ts DmrΨFFDҰbf100755 en-MT.js ΩuL=~^C.100755 en-MT.js.map RQ (j4ʔ100755 en-MU.d.ts DmrΨFFDҰbf100755 en-MU.js .8'"s100755 en-MU.js.map z,T[
[o7100755 en-MV.d.ts DmrΨFFDҰbf100755 en-MV.js rl.`/Pi_D{100755 en-MV.js.map 0k/sL~100755 en-MW.d.ts DmrΨFFDҰbf100755 en-MW.js =xqhBaC<100755 en-MW.js.map '(	!MYsާeZu100755 en-MY.d.ts DmrΨFFDҰbf100755 en-MY.js Ћ;J˨r8 ]3M=100755 en-MY.js.map mBaBxgqdكY100755 en-NA.d.ts DmrΨFFDҰbf100755 en-NA.js a#C	 +E_100755 en-NA.js.map RZI@Y^Z?x100755 en-NF.d.ts DmrΨFFDҰbf100755 en-NF.js 1EN6r-&<1z> X100755 en-NF.js.map LeT
A|6:Zۯc{100755 en-NG.d.ts DmrΨFFDҰbf100755 en-NG.js r5$i{`h6#100755 en-NG.js.map 4ff[6|N8100755 en-NL.d.ts DmrΨFFDҰbf100755 en-NL.js nC<8 ;G>jc100755 en-NL.js.map 0SjV4s3
100755 en-NR.d.ts DmrΨFFDҰbf100755 en-NR.js <:u4$6%x2Rwr100755 en-NR.js.map +Y`<xȦߪ,2100755 en-NU.d.ts DmrΨFFDҰbf100755 en-NU.js |N.$DرŠ>]@100755 en-NU.js.map D4I$3|100755 en-NZ.d.ts DmrΨFFDҰbf100755 en-NZ.js F͸\g;\f100755 en-NZ.js.map C,wdʥU100755 en-PG.d.ts DmrΨFFDҰbf100755 en-PG.js  _ٰeT]-jC90100755 en-PG.js.map 9oQ(T
100755 en-PH.d.ts DmrΨFFDҰbf100755 en-PH.js 9rjGsw3!100755 en-PH.js.map ]ɡY-gdFc 100755 en-PK.d.ts DmrΨFFDҰbf100755 en-PK.js V(WUĊ100755 en-PK.js.map ~$mJpyI6V؊100755 en-PN.d.ts DmrΨFFDҰbf100755 en-PN.js ?%MMM.lYdJ=9100755 en-PN.js.map 9t2=?f&}C100755 en-PR.d.ts DmrΨFFDҰbf100755 en-PR.js Y/~CWE0[p_100755 en-PR.js.map 8n3\̽Bp๗100755 en-PW.d.ts DmrΨFFDҰbf100755 en-PW.js V+Y|=k[C100755 en-PW.js.map *I|YGS	g100755 en-RW.d.ts DmrΨFFDҰbf100755 en-RW.js Ń!*@%A7x100755 en-RW.js.map !Уn률X/]=#*100755 en-SB.d.ts DmrΨFFDҰbf100755 en-SB.js L3F%mb}H100755 en-SB.js.map j_m%g4G5100755 en-SC.d.ts DmrΨFFDҰbf100755 en-SC.js 
yzndbM٨ߓŔ100755 en-SC.js.map gGq2.->F%[100755 en-SD.d.ts DmrΨFFDҰbf100755 en-SD.js 8^l7pCҙA100755 en-SD.js.map C@P+@I}LӺ>|100755 en-SE.d.ts DmrΨFFDҰbf100755 en-SE.js kE`ԔpIj100755 en-SE.js.map 	g%<3x$100755 en-SG.d.ts DmrΨFFDҰbf100755 en-SG.js O|ОwKr4:=u["100755 en-SG.js.map +xFQoEﱿX100755 en-SH.d.ts DmrΨFFDҰbf100755 en-SH.js ڪO=h613T~-͟A100755 en-SH.js.map Oeobͷd,ɠ)100755 en-SI.d.ts DmrΨFFDҰbf100755 en-SI.js !~ܸS&rfl100755 en-SI.js.map s/ϚEεkUsXx?100755 en-SL.d.ts DmrΨFFDҰbf100755 en-SL.js 懝vsM100755 en-SL.js.map [eh P(_D8100755 en-SS.d.ts DmrΨFFDҰbf100755 en-SS.js bw?Rg100755 en-SS.js.map T2#QچfYٮͥ100755 en-SX.d.ts DmrΨFFDҰbf100755 en-SX.js $sTۑ1WxʔiY~100755 en-SX.js.map %4vn$!100755 en-SZ.d.ts DmrΨFFDҰbf100755 en-SZ.js ОחT-Lw100755 en-SZ.js.map bo=n{rsY\Q100755 en-TC.d.ts DmrΨFFDҰbf100755 en-TC.js 7YRJ<"Bl100755 en-TC.js.map \Y
S+VLP5100755 en-TK.d.ts DmrΨFFDҰbf100755 en-TK.js 6eoOp&~`@100755 en-TK.js.map +9gԠ)II,100755 en-TO.d.ts DmrΨFFDҰbf100755 en-TO.js db5;҄100755 en-TO.js.map 
Ef.lm--tvg
e,100755 en-TT.d.ts DmrΨFFDҰbf100755 en-TT.js A9rv100755 en-TT.js.map b@*-cJ|j@100755 en-TV.d.ts DmrΨFFDҰbf100755 en-TV.js P'30v49|m6100755 en-TV.js.map ^L{M
alNb2100755 en-TZ.d.ts DmrΨFFDҰbf100755 en-TZ.js XMW	jeF100755 en-TZ.js.map ~O~<jV
G100755 en-UG.d.ts DmrΨFFDҰbf100755 en-UG.js Gqs<Ė!0100755 en-UG.js.map [CdjʼHdR>9100755 en-UM.d.ts DmrΨFFDҰbf100755 en-UM.js ͕ƩO݌N100755 en-UM.js.map 1ò42r100755 en-VC.d.ts DmrΨFFDҰbf100755 en-VC.js OdK~(C $100755 en-VC.js.map [ۦ}Ck5%100755 en-VG.d.ts DmrΨFFDҰbf100755 en-VG.js C0ߣ^s+ܦg
~100755 en-VG.js.map 'EwY3҉qT_100755 en-VI.d.ts DmrΨFFDҰbf100755 en-VI.js i"C5!100755 en-VI.js.map "^c+	i-ڀoqԖ100755 en-VU.d.ts DmrΨFFDҰbf100755 en-VU.js A%xb_D=8l100755 en-VU.js.map &u=f*[>%&y100755 en-WS.d.ts DmrΨFFDҰbf100755 en-WS.js }l wC@G{100755 en-WS.js.map EnݨtXJ 100755 en-ZA.d.ts DmrΨFFDҰbf100755 en-ZA.js *vIQm7:F?P100755 en-ZA.js.map Q!Tup100755 en-ZM.d.ts DmrΨFFDҰbf100755 en-ZM.js $%uHdG3<f100755 en-ZM.js.map ^9↎/-:VÐ100755 en-ZW.d.ts DmrΨFFDҰbf100755 en-ZW.js ]Au9`*t100755 en-ZW.js.map 	iQ2,׀7100755 en.d.ts DmrΨFFDҰbf100755 en.js 
c3ÛK}gR%100755 en.js.map t$̼sD6|100755 eo.d.ts 2p-+U#\3jȧt{U100755 eo.js #+$1r100755 eo.js.map U&ḽ}JǦ100755 es-419.d.ts DmrΨFFDҰbf100755 es-419.js '#`N7__{100755 es-419.js.map KEk~<ZFb100755 es-AR.d.ts DmrΨFFDҰbf100755 es-AR.js 9$i USa100755 es-AR.js.map qf)!,_HE,U100755 es-BO.d.ts DmrΨFFDҰbf100755 es-BO.js y,q =3W100755 es-BO.js.map y:gpXQ`100755 es-BR.d.ts DmrΨFFDҰbf100755 es-BR.js nKU ~100755 es-BR.js.map <Yw,9H8?-100755 es-BZ.d.ts DmrΨFFDҰbf100755 es-BZ.js 	*uјz100755 es-BZ.js.map == $	_ɚu.100755 es-CL.d.ts DmrΨFFDҰbf100755 es-CL.js Yڸ߂"w%^0Mr100755 es-CL.js.map 9@3r5YBm100755 es-CO.d.ts DmrΨFFDҰbf100755 es-CO.js zgW@7$Z2a2O100755 es-CO.js.map 20r)騠ʂDs100755 es-CR.d.ts DmrΨFFDҰbf100755 es-CR.js [a(:w!F73y100755 es-CR.js.map cWTgl=100755 es-CU.d.ts DmrΨFFDҰbf100755 es-CU.js 4NTkITf`^]Ay100755 es-CU.js.map 0g%	2100755 es-DO.d.ts DmrΨFFDҰbf100755 es-DO.js "?|dm4tl* 100755 es-DO.js.map Anʱ_X_7100755 es-EA.d.ts DmrΨFFDҰbf100755 es-EA.js ˝JPq@wp100755 es-EA.js.map έmSb$(100755 es-EC.d.ts DmrΨFFDҰbf100755 es-EC.js QxC" Nm3tU@100755 es-EC.js.map zoƊ{Pg'ʄr100755 es-GQ.d.ts DmrΨFFDҰbf100755 es-GQ.js i4|@#`^Z100755 es-GQ.js.map Fs%>>e=u	QC100755 es-GT.d.ts DmrΨFFDҰbf100755 es-GT.js Jc=<a=100755 es-GT.js.map /IjLT=(]8100755 es-HN.d.ts DmrΨFFDҰbf100755 es-HN.js -2jF|H>100755 es-HN.js.map j&!]UL100755 es-IC.d.ts DmrΨFFDҰbf100755 es-IC.js `y|>'I100755 es-IC.js.map 08HJ(1qۤt100755 es-MX.d.ts DmrΨFFDҰbf100755 es-MX.js 9L4):^100755 es-MX.js.map pǇ&AL100755 es-NI.d.ts DmrΨFFDҰbf100755 es-NI.js s>Id	>t100755 es-NI.js.map DL(Os팞100755 es-PA.d.ts DmrΨFFDҰbf100755 es-PA.js 0pLw&100755 es-PA.js.map Ada񵄤(6,100755 es-PE.d.ts DmrΨFFDҰbf100755 es-PE.js fj"sU(100755 es-PE.js.map (O֬U!U%*100755 es-PH.d.ts DmrΨFFDҰbf100755 es-PH.js L2GN플N[\vo100755 es-PH.js.map ?gdJ9+]n{>W100755 es-PR.d.ts DmrΨFFDҰbf100755 es-PR.js 6a֬CYR100755 es-PR.js.map Sn!: dB^K100755 es-PY.d.ts DmrΨFFDҰbf100755 es-PY.js X
(@s+sN100755 es-PY.js.map K{/])T5U100755 es-SV.d.ts DmrΨFFDҰbf100755 es-SV.js R^yḳlcsyBT100755 es-SV.js.map  .LÞᕸAfzL100755 es-US.d.ts DmrΨFFDҰbf100755 es-US.js ?ӐYߍ$,Eq_100755 es-US.js.map 4	|jzwqa
+Z%100755 es-UY.d.ts DmrΨFFDҰbf100755 es-UY.js l؝)qv3M100755 es-UY.js.map CfR@F#?ay100755 es-VE.d.ts DmrΨFFDҰbf100755 es-VE.js ^I16[_MS100755 es-VE.js.map =KYrSbQrM
Q100755 es.d.ts DmrΨFFDҰbf100755 es.js yeh(JQߝ,F100755 es.js.map \aPu0ɢ>vWE5100755 et.d.ts DmrΨFFDҰbf100755 et.js ?#vxSn100755 et.js.map я-ְ100755 eu.d.ts DmrΨFFDҰbf100755 eu.js oycgSp|wx100755 eu.js.map ܼ;`1;}100755 ewo.d.ts 2p-+U#\3jȧt{U100755 ewo.js X?Z[tt`Pw100755 ewo.js.map 6<jJ]Cڦ100755 fa-AF.d.ts ݃?fx^]]`yDe100755 fa-AF.js ٘0tnjQT8100755 fa-AF.js.map q?d56r%"aJ%~E_100755 fa.d.ts ݃?fx^]]`yDe100755 fa.js ?t_R޸=ny-sow100755 fa.js.map 1зOtL|B؞100755 ff-Adlm-BF.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-BF.js z'7`A#i100755 ff-Adlm-BF.js.map jWՒUf100755 ff-Adlm-CM.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-CM.js m`kd@ƹ '100755 ff-Adlm-CM.js.map T}187{100755 ff-Adlm-GH.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-GH.js 9nvWyw;100755 ff-Adlm-GH.js.map 6skNtAG100755 ff-Adlm-GM.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-GM.js ՜a0WEoo'100755 ff-Adlm-GM.js.map ǉ*]/%x	100755 ff-Adlm-GW.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-GW.js aտ100755 ff-Adlm-GW.js.map |3rJG!XS^B100755 ff-Adlm-LR.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-LR.js HC-Va100755 ff-Adlm-LR.js.map J"^'+X100755 ff-Adlm-MR.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-MR.js ((}2c@p100755 ff-Adlm-MR.js.map vciKl@"eF100755 ff-Adlm-NE.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-NE.js cZbpҧT&100755 ff-Adlm-NE.js.map (8-oai'JGb;100755 ff-Adlm-NG.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-NG.js yDv;᳣*:100755 ff-Adlm-NG.js.map ~5u*SAWE100755 ff-Adlm-SL.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-SL.js 5I(DR{,100755 ff-Adlm-SL.js.map XvWK!ڄI100755 ff-Adlm-SN.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm-SN.js ~hIUe_
iu1ݿ100755 ff-Adlm-SN.js.map oyȠ?Eվ|\hl100755 ff-Adlm.d.ts 2p-+U#\3jȧt{U100755 ff-Adlm.js %xWvgcC*100755 ff-Adlm.js.map N\ߒIw	+100755 ff-CM.d.ts 2p-+U#\3jȧt{U100755 ff-CM.js 4TOvJ>b恭100755 ff-CM.js.map $ -[jBF%p100755 ff-GN.d.ts 2p-+U#\3jȧt{U100755 ff-GN.js 97@F;l
Q100755 ff-GN.js.map d6L%mu]B+34>100755 ff-Latn-BF.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-BF.js MJd(d1ÎF100755 ff-Latn-BF.js.map {2O8v?5?Z}}100755 ff-Latn-CM.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-CM.js 0j-'100755 ff-Latn-CM.js.map 5}؟h\]7
jj100755 ff-Latn-GH.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-GH.js pў"|100755 ff-Latn-GH.js.map 稑4%jm&`Q[m100755 ff-Latn-GM.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-GM.js ѹI䛧ևe100755 ff-Latn-GM.js.map 4h&{̍BzM100755 ff-Latn-GN.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-GN.js 
xF>X`مf<100755 ff-Latn-GN.js.map !˧.GI$a`2100755 ff-Latn-GW.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-GW.js hGT	EFPJNaG100755 ff-Latn-GW.js.map &~M/OG꭬100755 ff-Latn-LR.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-LR.js y)錩1"oNuzl100755 ff-Latn-LR.js.map jyB=#]]X%h100755 ff-Latn-MR.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-MR.js iAOEkj^
100755 ff-Latn-MR.js.map HmQ6[ƹ100755 ff-Latn-NE.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-NE.js W{|P034&p100755 ff-Latn-NE.js.map 5r`l:.L J100755 ff-Latn-NG.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-NG.js  _EccV100755 ff-Latn-NG.js.map =ͪ/a.QD\lhS100755 ff-Latn-SL.d.ts 2p-+U#\3jȧt{U100755 ff-Latn-SL.js n٪U"'xqI6100755 ff-Latn-SL.js.map ̿ItZC100755 ff-Latn.d.ts 2p-+U#\3jȧt{U100755 ff-Latn.js @D'W#yI#100755 ff-Latn.js.map tɧ#áɲbU)/100755 ff-MR.d.ts 2p-+U#\3jȧt{U100755 ff-MR.js ۇ`欏?1100755 ff-MR.js.map qmuy100755 ff.d.ts 2p-+U#\3jȧt{U100755 ff.js p~F!	xfsT	100755 ff.js.map D
˞TVhF100755 fi.d.ts NʇBZ({Mq|:`100755 fi.js "ԇㅋHlw1 100755 fi.js.map cL6G8	) 100755 fil.d.ts DmrΨFFDҰbf100755 fil.js ߀EmCUڔ}EI100755 fil.js.map Hf@i΋vdw>_Q100755 fo-DK.d.ts 2p-+U#\3jȧt{U100755 fo-DK.js z7*}-ǧaE100755 fo-DK.js.map /ԚUQKMwjw_100755 fo.d.ts 2p-+U#\3jȧt{U100755 fo.js g"G eWHȶ>󨏗100755 fo.js.map CT24b`$:E100755 fr-BE.d.ts DmrΨFFDҰbf100755 fr-BE.js EoBjNS?FF~100755 fr-BE.js.map 2`f$$9 100755 fr-BF.d.ts DmrΨFFDҰbf100755 fr-BF.js :Q,X>100755 fr-BF.js.map 5}r^I2100755 fr-BI.d.ts DmrΨFFDҰbf100755 fr-BI.js `R.]|aL	100755 fr-BI.js.map ӡYI}pR'100755 fr-BJ.d.ts DmrΨFFDҰbf100755 fr-BJ.js ERD+=K100755 fr-BJ.js.map Ϝ<Z)Dᡓ- u100755 fr-BL.d.ts DmrΨFFDҰbf100755 fr-BL.js ?%z)h1?100755 fr-BL.js.map 
K<Y%)uO100755 fr-CA.d.ts NʇBZ({Mq|:`100755 fr-CA.js ulU@Ԭ
9dp100755 fr-CA.js.map 6/8d\1,!yd100755 fr-CD.d.ts NʇBZ({Mq|:`100755 fr-CD.js w!wl5"{F>`100755 fr-CD.js.map _-aebe<\L 100755 fr-CF.d.ts DmrΨFFDҰbf100755 fr-CF.js Z^юJΚ(XBhA
2100755 fr-CF.js.map 2^*jp`100755 fr-CG.d.ts DmrΨFFDҰbf100755 fr-CG.js +qlU@%100755 fr-CG.js.map )k 0$6MBK100755 fr-CH.d.ts DmrΨFFDҰbf100755 fr-CH.js $Yx3100755 fr-CH.js.map OS9<:8fa1y100755 fr-CI.d.ts DmrΨFFDҰbf100755 fr-CI.js =T,hbKVK8100755 fr-CI.js.map $Z
@R7d100755 fr-CM.d.ts DmrΨFFDҰbf100755 fr-CM.js !,\NC`-v.g?x100755 fr-CM.js.map ̸~Sh14wXSb100755 fr-DJ.d.ts DmrΨFFDҰbf100755 fr-DJ.js hQsԎK)RNS\Z100755 fr-DJ.js.map @Wx]8R100755 fr-DZ.d.ts DmrΨFFDҰbf100755 fr-DZ.js 
-gSgd8100755 fr-DZ.js.map lN~JO:100755 fr-GA.d.ts DmrΨFFDҰbf100755 fr-GA.js ̆8:jFb100755 fr-GA.js.map F^UvE|F{100755 fr-GF.d.ts DmrΨFFDҰbf100755 fr-GF.js Zȓ\t]
>&100755 fr-GF.js.map &/A`uySCL
1100755 fr-GN.d.ts DmrΨFFDҰbf100755 fr-GN.js <΅Uϙ}A90E100755 fr-GN.js.map iN&zKi100755 fr-GP.d.ts DmrΨFFDҰbf100755 fr-GP.js  n'; :u)D100755 fr-GP.js.map L(<)Qo	:100755 fr-GQ.d.ts DmrΨFFDҰbf100755 fr-GQ.js 7?Uʃ3RDp3n4100755 fr-GQ.js.map {갍QE>Cn100755 fr-HT.d.ts DmrΨFFDҰbf100755 fr-HT.js v0#QӢu100755 fr-HT.js.map gO3IQi"
100755 fr-KM.d.ts DmrΨFFDҰbf100755 fr-KM.js pհ100755 fr-KM.js.map ;` j$6ʒ+Kޙ100755 fr-LU.d.ts DmrΨFFDҰbf100755 fr-LU.js }:=
m{100755 fr-LU.js.map ,X̷{ -0jT100755 fr-MA.d.ts DmrΨFFDҰbf100755 fr-MA.js (V4}eXJ7100755 fr-MA.js.map 79K4f]mbYg@100755 fr-MC.d.ts DmrΨFFDҰbf100755 fr-MC.js 0eRɷZq7NHx100755 fr-MC.js.map 0W>i,a100755 fr-MF.d.ts DmrΨFFDҰbf100755 fr-MF.js  jG]wl?`100755 fr-MF.js.map G=ӓ	vN= )100755 fr-MG.d.ts DmrΨFFDҰbf100755 fr-MG.js 2Qࢄ=YUˆ100755 fr-MG.js.map SKCimd100755 fr-ML.d.ts DmrΨFFDҰbf100755 fr-ML.js *>ק5lZ[B100755 fr-ML.js.map nye{1V[W\UQHI100755 fr-MQ.d.ts DmrΨFFDҰbf100755 fr-MQ.js "NM˷Fc8100755 fr-MQ.js.map w\-
n@uAS.100755 fr-MR.d.ts DmrΨFFDҰbf100755 fr-MR.js RmF7y]9.Aԙ100755 fr-MR.js.map 6|~EhΉƙqnU100755 fr-MU.d.ts DmrΨFFDҰbf100755 fr-MU.js ]]&DVU	c#100755 fr-MU.js.map =&ɤK2d"t^v100755 fr-NC.d.ts DmrΨFFDҰbf100755 fr-NC.js 76[N!(~@yj100755 fr-NC.js.map _.o`珽:&F100755 fr-NE.d.ts DmrΨFFDҰbf100755 fr-NE.js 픳	ݧ?*H,\=100755 fr-NE.js.map GN7`r7ԑ^100755 fr-PF.d.ts DmrΨFFDҰbf100755 fr-PF.js 6/fE蠲
100755 fr-PF.js.map  ӟL3ku>)?Z100755 fr-PM.d.ts DmrΨFFDҰbf100755 fr-PM.js ˓&nx100755 fr-PM.js.map ʎ8AE,100755 fr-RE.d.ts DmrΨFFDҰbf100755 fr-RE.js `2T֥8^ARؑy100755 fr-RE.js.map +wuiE/j$N100755 fr-RW.d.ts DmrΨFFDҰbf100755 fr-RW.js im8!NZc^vL100755 fr-RW.js.map tK(L[100755 fr-SC.d.ts DmrΨFFDҰbf100755 fr-SC.js n"5TY100755 fr-SC.js.map 6Xנni*AxU]"100755 fr-SN.d.ts DmrΨFFDҰbf100755 fr-SN.js [n!B יA޴O100755 fr-SN.js.map ])Y)J=NO100755 fr-SY.d.ts DmrΨFFDҰbf100755 fr-SY.js nłhG:B"_100755 fr-SY.js.map i]%@)9DYTu100755 fr-TD.d.ts DmrΨFFDҰbf100755 fr-TD.js [;b{u" j 
 100755 fr-TD.js.map Ύ#ז-QbqwA{100755 fr-TG.d.ts DmrΨFFDҰbf100755 fr-TG.js 뫠!a3J"M~K100755 fr-TG.js.map %ShHT+vI100755 fr-TN.d.ts DmrΨFFDҰbf100755 fr-TN.js fe
#zW100755 fr-TN.js.map z
ObIpQw100755 fr-VU.d.ts DmrΨFFDҰbf100755 fr-VU.js zR&Ү$C100755 fr-VU.js.map UFh ^|100755 fr-WF.d.ts DmrΨFFDҰbf100755 fr-WF.js H #{ekr|100755 fr-WF.js.map 4LG|ٛ|8100755 fr-YT.d.ts DmrΨFFDҰbf100755 fr-YT.js yȋJb䊤D:+ZD100755 fr-YT.js.map Pgb=SH8U100755 fr.d.ts DmrΨFFDҰbf100755 fr.js B^26tA{`100755 fr.js.map Yii@UVkR <ݹV100755 fur.d.ts 2p-+U#\3jȧt{U100755 fur.js j絟Rn3n100755 fur.js.map ?˘زhZ_rS100755 fy.d.ts 2p-+U#\3jȧt{U100755 fy.js {mC3@B100755 fy.js.map GG	hpgE100755 ga-GB.d.ts 2p-+U#\3jȧt{U100755 ga-GB.js D2S\_TPo)100755 ga-GB.js.map >o\[ KUp100755 ga.d.ts 2p-+U#\3jȧt{U100755 ga.js MEJXIGdYeR=AL100755 ga.js.map :&k=wUqQ100755 gd.d.ts 2p-+U#\3jȧt{U100755 gd.js :R0jA_7ld100755 gd.js.map śftv}R]100755 gl.d.ts DmrΨFFDҰbf100755 gl.js HU6YRC=100755 gl.js.map 4krV^i
C100755 gsw-FR.d.ts DmrΨFFDҰbf100755 gsw-FR.js A+mR\L100755 gsw-FR.js.map -,		r]100755 gsw-LI.d.ts DmrΨFFDҰbf100755 gsw-LI.js i `S*`{+100755 gsw-LI.js.map aqr5I100755 gsw.d.ts DmrΨFFDҰbf100755 gsw.js <O O3>BF*k100755 gsw.js.map r,u2)Tf?100755 gu.d.ts DmrΨFFDҰbf100755 gu.js *XKd»S[<0100755 gu.js.map $2'V/4~100755 guz.d.ts 2p-+U#\3jȧt{U100755 guz.js 
zq)YC~+w100755 guz.js.map Ze?5	Ԋ*Wnp100755 gv.d.ts 2p-+U#\3jȧt{U100755 gv.js *ЬH旍uD100755 gv.js.map '!8;("100755 ha-GH.d.ts 2p-+U#\3jȧt{U100755 ha-GH.js h%E}100755 ha-GH.js.map NmJ59:100755 ha-NE.d.ts 2p-+U#\3jȧt{U100755 ha-NE.js S7-Vb<Ⱦ弧100755 ha-NE.js.map 6H3Z
ʥɘs100755 ha.d.ts 2p-+U#\3jȧt{U100755 ha.js 1\`vOBa,100755 ha.js.map ՍUh!<xai100755 haw.d.ts 2p-+U#\3jȧt{U100755 haw.js Aq"d8Ik(a100755 haw.js.map ;5b4=kARۤI/f100755 he.d.ts DmrΨFFDҰbf100755 he.js yZ^ڪZ7Y?pdX100755 he.js.map 'L*9ּQ.Eq(100755 hi-Latn.d.ts DmrΨFFDҰbf100755 hi-Latn.js [}P@(tE100755 hi-Latn.js.map jHOeGd(FP100755 hi.d.ts DmrΨFFDҰbf100755 hi.js ҨaS=17Kb!G100755 hi.js.map *Wn 2L[\100755 hr-BA.d.ts DmrΨFFDҰbf100755 hr-BA.js Qدrl"N100755 hr-BA.js.map Gk[s	DPc100755 hr.d.ts DmrΨFFDҰbf100755 hr.js tՠUA$A100755 hr.js.map {Wzth100755 hsb.d.ts 2p-+U#\3jȧt{U100755 hsb.js +R~2QӠ2>?100755 hsb.js.map FT_	Oϩ UpF100755 hu.d.ts ~s'd`>N[100755 hu.js XGA`a/DtݩP100755 hu.js.map /%@`DY912100755 hy.d.ts DmrΨFFDҰbf100755 hy.js "  sWs100755 hy.js.map Nbf~}100755 ia.d.ts 2p-+U#\3jȧt{U100755 ia.js QoS`!PTV/hs0100755 ia.js.map gKlyL8X100755 id.d.ts ~s'd`>N[100755 id.js :A@$hgCmWˤaX0s100755 id.js.map 9*?\o}A100755 ig.d.ts 2p-+U#\3jȧt{U100755 ig.js c|X	@Ϛ݂100755 ig.js.map O`@gw,d[100755 ii.d.ts 2p-+U#\3jȧt{U100755 ii.js E1$5Ӳp100755 ii.js.map =A˱'./u100755 is.d.ts DmrΨFFDҰbf100755 is.js ԭ9]jm!v.\O>Z#100755 is.js.map ˨xsKIG100755 it-CH.d.ts DmrΨFFDҰbf100755 it-CH.js O،z[M	.100755 it-CH.js.map b=HH~j:TYJYI100755 it-SM.d.ts DmrΨFFDҰbf100755 it-SM.js HT`{3tՀo100755 it-SM.js.map IsL,|4"100755 it-VA.d.ts DmrΨFFDҰbf100755 it-VA.js _Q3(v-eˮr100755 it-VA.js.map 6HWe>N6gA(100755 it.d.ts DmrΨFFDҰbf100755 it.js m%OZ&8:yFL100755 it.js.map 9
̻7%dsWV|100755 ja.d.ts ~s'd`>N[100755 ja.js mW`zQ9m100755 ja.js.map Y=O BHOZ100755 jgo.d.ts 2p-+U#\3jȧt{U100755 jgo.js |W^}.100755 jgo.js.map ӴeS'ސAmu100755 jmc.d.ts 2p-+U#\3jȧt{U100755 jmc.js ,[v!d&b!z100755 jmc.js.map eU|M'&}(w.100755 jv.d.ts 2p-+U#\3jȧt{U100755 jv.js 1gB8['ۥN=>c100755 jv.js.map 5ؽ5Dq:n(G?100755 ka.d.ts DmrΨFFDҰbf100755 ka.js SE<?OvD~f100755 ka.js.map g^:R8mTvy100755 kab.d.ts 2p-+U#\3jȧt{U100755 kab.js +#I`-$WяU100755 kab.js.map y~t0/|V3^Tbӡ100755 kam.d.ts 2p-+U#\3jȧt{U100755 kam.js #[(\,af'!J100755 kam.js.map CSayχڮog"Y100755 kde.d.ts 2p-+U#\3jȧt{U100755 kde.js Ig=`PǍ@100755 kde.js.map ᖜĢV!6Q_100755 kea.d.ts 2p-+U#\3jȧt{U100755 kea.js JIZ_JѱJ100755 kea.js.map ؗۛj:Pɗ100755 kgp.d.ts ~s'd`>N[100755 kgp.js 
FLҴ]eaM100755 kgp.js.map sS _.;L100755 khq.d.ts 2p-+U#\3jȧt{U100755 khq.js <Ôt?1wS7100755 khq.js.map [ڷefދU100755 ki.d.ts 2p-+U#\3jȧt{U100755 ki.js .=e\Ѵc100755 ki.js.map ?EP&>O3100755 kk.d.ts DmrΨFFDҰbf100755 kk.js C{]ta9.,100755 kk.js.map - Ӫ̤0'wa%s]100755 kkj.d.ts 2p-+U#\3jȧt{U100755 kkj.js H7ThzUJ?K& N100755 kkj.js.map U ^gQxMu|100755 kl.d.ts 2p-+U#\3jȧt{U100755 kl.js qyڌtI~.4Gg^>100755 kl.js.map SSYIhw)ѪJ100755 kln.d.ts 2p-+U#\3jȧt{U100755 kln.js 𸏩}zrZ100755 kln.js.map dLY:nwC100755 km.d.ts DmrΨFFDҰbf100755 km.js R@k7Zo(l9,100755 km.js.map *0 '*9cظlu+100755 kn.d.ts DmrΨFFDҰbf100755 kn.js [I5d:C.100755 kn.js.map @6O6kmsȮ;t100755 ko-KP.d.ts ~s'd`>N[100755 ko-KP.js TG192Ի=@Nw100755 ko-KP.js.map Xi3MOD7qn4$g100755 ko.d.ts ~s'd`>N[100755 ko.js ٝdrQhqq100755 ko.js.map ӞDCCcvrqV100755 kok.d.ts 2p-+U#\3jȧt{U100755 kok.js NyC`{'3>100755 kok.js.map D-灨gh=100755 ks-Arab.d.ts 2p-+U#\3jȧt{U100755 ks-Arab.js "h夋vaf100755 ks-Arab.js.map .խ^{<a100755 ks-Deva.d.ts 2p-+U#\3jȧt{U100755 ks-Deva.js Ypp!:Eɽ100755 ks-Deva.js.map 2b0JcϚ100755 ks.d.ts 2p-+U#\3jȧt{U100755 ks.js  bmn$2!jо8?100755 ks.js.map D}VЗ[V100755 ksb.d.ts 2p-+U#\3jȧt{U100755 ksb.js x;Q,'l100755 ksb.js.map BMNlK@:#&100755 ksf.d.ts 2p-+U#\3jȧt{U100755 ksf.js 0po-o1*ɷ̎V100755 ksf.js.map U0  8C
8&100755 ksh.d.ts 2p-+U#\3jȧt{U100755 ksh.js |H>'\p@G100755 ksh.js.map #.lDyN100755 ku.d.ts 2p-+U#\3jȧt{U100755 ku.js mtCRbP)s100755 ku.js.map ivp/uN^mϴoLt100755 kw.d.ts 2p-+U#\3jȧt{U100755 kw.js r	Ӝ?˪/)YAn100755 kw.js.map )(QUxF&."I!100755 ky.d.ts DmrΨFFDҰbf100755 ky.js 2)*b|1{
 100755 ky.js.map ʑgLߦgM100755 lag.d.ts 2p-+U#\3jȧt{U100755 lag.js ZҊʧd6O	100755 lag.js.map hIx;ί(
s100755 lb.d.ts 2p-+U#\3jȧt{U100755 lb.js $CbaOND%100755 lb.js.map BJH' <jޏ100755 lg.d.ts 2p-+U#\3jȧt{U100755 lg.js ÛDPN4VQ.100755 lg.js.map *Ym`ZŪc100755 lkt.d.ts 2p-+U#\3jȧt{U100755 lkt.js ŗحehFw"100755 lkt.js.map y6$:j8 Q100755 ln-AO.d.ts 2p-+U#\3jȧt{U100755 ln-AO.js @("7Sj՞y1{100755 ln-AO.js.map NK]	o%dnD06100755 ln-CF.d.ts 2p-+U#\3jȧt{U100755 ln-CF.js xeEY{8>100755 ln-CF.js.map ᡕDfP#K|100755 ln-CG.d.ts 2p-+U#\3jȧt{U100755 ln-CG.js lK}e\~;]]Ǟ~100755 ln-CG.js.map -wKg Дa100755 ln.d.ts 2p-+U#\3jȧt{U100755 ln.js 9l ܝ<s~Ƿ100755 ln.js.map MWxuέL100755 lo.d.ts NʇBZ({Mq|:`100755 lo.js ЎzS 2_>(Wޮ100755 lo.js.map a?$V-;W100755 lrc-IQ.d.ts 2p-+U#\3jȧt{U100755 lrc-IQ.js ~[<)vP-|Y100755 lrc-IQ.js.map $df 100755 lrc.d.ts 2p-+U#\3jȧt{U100755 lrc.js m͊jIo#>O100755 lrc.js.map (]GKPhk̃`100755 lt.d.ts DmrΨFFDҰbf100755 lt.js x!vW+c/mH100755 lt.js.map '^(JM⮖(100755 lu.d.ts 2p-+U#\3jȧt{U100755 lu.js QQ)}:100755 lu.js.map  HBzώXZ5100755 luo.d.ts 2p-+U#\3jȧt{U100755 luo.js .VY1pA'.=100755 luo.js.map CRa[/100755 luy.d.ts 2p-+U#\3jȧt{U100755 luy.js '\WGFsldgzxM100755 luy.js.map Em	6ہ:Wӌ100755 lv.d.ts DmrΨFFDҰbf100755 lv.js P^f94şb100755 lv.js.map gy`T	L100755 mai.d.ts 2p-+U#\3jȧt{U100755 mai.js udd!F>.#S8a100755 mai.js.map ziir?paf(ԡ100755 mas-TZ.d.ts 2p-+U#\3jȧt{U100755 mas-TZ.js e־0y100755 mas-TZ.js.map l=	m]}q!5I#Ƚ100755 mas.d.ts 2p-+U#\3jȧt{U100755 mas.js D mqqU1w&K100755 mas.js.map We{7A100755 mer.d.ts 2p-+U#\3jȧt{U100755 mer.js v;A`6mɢj±100755 mer.js.map NQbS̬$N/lrR100755 mfe.d.ts 2p-+U#\3jȧt{U100755 mfe.js 0sz/y~J100755 mfe.js.map _g2hh1`بufA6/100755 mg.d.ts 2p-+U#\3jȧt{U100755 mg.js 6?WteZ100755 mg.js.map b9>ƚUW6WV$100755 mgh.d.ts 2p-+U#\3jȧt{U100755 mgh.js JhSp#i-<WIΦ100755 mgh.js.map {Vm ~S{4J100755 mgo.d.ts 2p-+U#\3jȧt{U100755 mgo.js *la=C45jMX^100755 mgo.js.map 6T1Wb>HEps100755 mi.d.ts 2p-+U#\3jȧt{U100755 mi.js LRrKQ=.(?'{100755 mi.js.map Zh09nO|100755 mk.d.ts NʇBZ({Mq|:`100755 mk.js ;E"j V100755 mk.js.map 	'8u2B100755 ml.d.ts DmrΨFFDҰbf100755 ml.js <-i:*w=100755 ml.js.map SѰ;Foc100755 mn.d.ts ~s'd`>N[100755 mn.js 7hbǳC%KEys100755 mn.js.map ȵ>F;0(;1100755 mni-Beng.d.ts 2p-+U#\3jȧt{U100755 mni-Beng.js Kj_>y*[d+100755 mni-Beng.js.map zP!;v*sVa100755 mni.d.ts 2p-+U#\3jȧt{U100755 mni.js l׸ yH
V100755 mni.js.map #-`%AgK
l4100755 mr.d.ts DmrΨFFDҰbf100755 mr.js (?jFBo=7N!fg100755 mr.js.map M
ݝim1|100755 ms-BN.d.ts ݃?fx^]]`yDe100755 ms-BN.js AZ#{"]iX<100755 ms-BN.js.map #~M9tf+100755 ms-ID.d.ts ݃?fx^]]`yDe100755 ms-ID.js -CP;N/}-;0100755 ms-ID.js.map `ZrO!,+{GS¦100755 ms-SG.d.ts ݃?fx^]]`yDe100755 ms-SG.js dlab'xNCI"/100755 ms-SG.js.map ~՗ϡ100755 ms.d.ts ݃?fx^]]`yDe100755 ms.js _V#GE#3x(100755 ms.js.map z5B|eʂrL2100755 mt.d.ts 2p-+U#\3jȧt{U100755 mt.js N͖n%L/"100755 mt.js.map LV]w.7GC100755 mua.d.ts 2p-+U#\3jȧt{U100755 mua.js L0OI5tz_A100755 mua.js.map }_<5M47,100755 my.d.ts ~s'd`>N[100755 my.js +F0q-t100755 my.js.map |v4Ub͐\i!100755 mzn.d.ts 2p-+U#\3jȧt{U100755 mzn.js ö,|sK]H 100755 mzn.js.map  qB {"100755 naq.d.ts 2p-+U#\3jȧt{U100755 naq.js aJ*ܘLcu^`100755 naq.js.map ǘf" wH5oOJ100755 nb-SJ.d.ts NʇBZ({Mq|:`100755 nb-SJ.js !u5"$vCQy?_;100755 nb-SJ.js.map |e-lv)x 2;Cb100755 nb.d.ts NʇBZ({Mq|:`100755 nb.js sِRt'Ytĸ100755 nb.js.map ؅d>Ĉ>ȷ100755 nd.d.ts 2p-+U#\3jȧt{U100755 nd.js ;. Vڻh3KF#100755 nd.js.map BEg9{}xs100755 nds-NL.d.ts 2p-+U#\3jȧt{U100755 nds-NL.js 	e2Zy2D҆+100755 nds-NL.js.map FLL(&:!100755 nds.d.ts 2p-+U#\3jȧt{U100755 nds.js CG}jg'zѫ100755 nds.js.map .gt1]5δWd100755 ne-IN.d.ts ~s'd`>N[100755 ne-IN.js C!_VFW100755 ne-IN.js.map rC4`ZyJ100755 ne.d.ts ~s'd`>N[100755 ne.js $1NdD_L}100755 ne.js.map {1Z꠼;Sv<100755 nl-AW.d.ts DmrΨFFDҰbf100755 nl-AW.js :\+ir<100755 nl-AW.js.map ^>D\ܺB`W100755 nl-BE.d.ts DmrΨFFDҰbf100755 nl-BE.js f6KC tHw100755 nl-BE.js.map 9#pg0E
⨝XA100755 nl-BQ.d.ts DmrΨFFDҰbf100755 nl-BQ.js Z;WqXm՘9100755 nl-BQ.js.map F-T+|A;82100755 nl-CW.d.ts DmrΨFFDҰbf100755 nl-CW.js Ag36D"100755 nl-CW.js.map j?u$EvV 100755 nl-SR.d.ts DmrΨFFDҰbf100755 nl-SR.js 7}Xƿ100755 nl-SR.js.map +iݳUW9100755 nl-SX.d.ts DmrΨFFDҰbf100755 nl-SX.js KUvӯnqU100755 nl-SX.js.map ZVՇbI8&>E100755 nl.d.ts DmrΨFFDҰbf100755 nl.js nW&pÕb100755 nl.js.map :Wl
6Ж!100755 nmg.d.ts 2p-+U#\3jȧt{U100755 nmg.js bz~100755 nmg.js.map lnhpT}100755 nn.d.ts NʇBZ({Mq|:`100755 nn.js -aף
bQ$G100755 nn.js.map kqM_	jje`',]/100755 nnh.d.ts 2p-+U#\3jȧt{U100755 nnh.js v0z8@HeWVc100755 nnh.js.map o0WE	8NBx100755 no.d.ts NʇBZ({Mq|:`100755 no.js f5{Ii>Hp100755 no.js.map IV\MiˍW-100755 nus.d.ts 2p-+U#\3jȧt{U100755 nus.js cwDY7"^R	100755 nus.js.map l{!JFQ7{100755 nyn.d.ts 2p-+U#\3jȧt{U100755 nyn.js mz?bZwYq100755 nyn.js.map 8@5/5!Yg^100755 om-KE.d.ts 2p-+U#\3jȧt{U100755 om-KE.js ܠy	ol100755 om-KE.js.map q$EtC wp100755 om.d.ts 2p-+U#\3jȧt{U100755 om.js [@RY{ّ,?100755 om.js.map X@`eLL100755 or.d.ts 2p-+U#\3jȧt{U100755 or.js Vgܘ?;R*100755 or.js.map 2=A9&ؚxSF# q100755 os-RU.d.ts 2p-+U#\3jȧt{U100755 os-RU.js :+t 3d7J8100755 os-RU.js.map 櫱wj)AVQ100755 os.d.ts 2p-+U#\3jȧt{U100755 os.js `Q*wqNWh100755 os.js.map 4qe7e;E\100755 pa-Arab.d.ts 2p-+U#\3jȧt{U100755 pa-Arab.js `l٢GZrYޚ{100755 pa-Arab.js.map d_R&
s100755 pa-Guru.d.ts DmrΨFFDҰbf100755 pa-Guru.js |K!On<100755 pa-Guru.js.map UEiA9YB100755 pa.d.ts DmrΨFFDҰbf100755 pa.js Sjv3/bcH100755 pa.js.map mnNcA=HQn{100755 pcm.d.ts 2p-+U#\3jȧt{U100755 pcm.js OqB^2jM*\100755 pcm.js.map ک*ꡞ2\V kd100755 pl.d.ts DmrΨFFDҰbf100755 pl.js SWc۱˥`=#100755 pl.js.map 9I*CORRE8u3100755 ps-PK.d.ts 2p-+U#\3jȧt{U100755 ps-PK.js {br!ylrtcT100755 ps-PK.js.map _H@18Yblk100755 ps.d.ts 2p-+U#\3jȧt{U100755 ps.js _(Q/_PȨ100755 ps.js.map -{?-Ěi&100755 pt-AO.d.ts DmrΨFFDҰbf100755 pt-AO.js ENOC;颳:100755 pt-AO.js.map d	yj)
100755 pt-CH.d.ts DmrΨFFDҰbf100755 pt-CH.js #2]2NL Q82:wZ5100755 pt-CH.js.map 7ڰ̭mϤcnS.100755 pt-CV.d.ts DmrΨFFDҰbf100755 pt-CV.js 9Lΰ+-$}100755 pt-CV.js.map ^<cNd^C7100755 pt-GQ.d.ts DmrΨFFDҰbf100755 pt-GQ.js i]2ϲmE05100755 pt-GQ.js.map #b-Os֫100755 pt-GW.d.ts DmrΨFFDҰbf100755 pt-GW.js tσumKNh(z100755 pt-GW.js.map gT!-J%100755 pt-LU.d.ts DmrΨFFDҰbf100755 pt-LU.js ^|dRй j100755 pt-LU.js.map T!yZ#𦱒100755 pt-MO.d.ts DmrΨFFDҰbf100755 pt-MO.js XӹI;
e100755 pt-MO.js.map }L$KY熛l100755 pt-MZ.d.ts DmrΨFFDҰbf100755 pt-MZ.js WFRkLU*A100755 pt-MZ.js.map .kږl>wE100755 pt-PT.d.ts DmrΨFFDҰbf100755 pt-PT.js v rh100755 pt-PT.js.map kOPK
=DO100755 pt-ST.d.ts DmrΨFFDҰbf100755 pt-ST.js 4d:`i#100755 pt-ST.js.map ?h>100755 pt-TL.d.ts DmrΨFFDҰbf100755 pt-TL.js 	fgQZMGۉܦG100755 pt-TL.js.map ?|=1`mظ̫100755 pt.d.ts DmrΨFFDҰbf100755 pt.js HHF 5`fިɵ100755 pt.js.map 8{t!z~z0100755 qu-BO.d.ts 2p-+U#\3jȧt{U100755 qu-BO.js 8ȱ^*>JSTB100755 qu-BO.js.map AH95B100755 qu-EC.d.ts 2p-+U#\3jȧt{U100755 qu-EC.js H4zJ!A-j100755 qu-EC.js.map Qj&
b5x100755 qu.d.ts 2p-+U#\3jȧt{U100755 qu.js ؕm:	<;100755 qu.js.map 󭭁fsi.{tWu100755 rm.d.ts 2p-+U#\3jȧt{U100755 rm.js  飜C,sl	o100755 rm.js.map ØʐS|^sd6?100755 rn.d.ts 2p-+U#\3jȧt{U100755 rn.js wܹdXS#100755 rn.js.map  AuGcO$100755 ro-MD.d.ts ~s'd`>N[100755 ro-MD.js 	Iҥ-ծء0Y100755 ro-MD.js.map '&^n/¼p=>^100755 ro.d.ts DmrΨFFDҰbf100755 ro.js Y.f= `|FyQ ¿100755 ro.js.map Ѥ Gd3'vC]100755 rof.d.ts 2p-+U#\3jȧt{U100755 rof.js xPUl]&tn=:E
100755 rof.js.map ||0cIko100755 ru-BY.d.ts DmrΨFFDҰbf100755 ru-BY.js T82fQA/i'100755 ru-BY.js.map %6Ht#u100755 ru-KG.d.ts DmrΨFFDҰbf100755 ru-KG.js 2>> ]ҫ#100755 ru-KG.js.map ggf}/-̀{՝eSE100755 ru-KZ.d.ts DmrΨFFDҰbf100755 ru-KZ.js ):)Eח\ɆD100755 ru-KZ.js.map l֣xIA¥r[100755 ru-MD.d.ts DmrΨFFDҰbf100755 ru-MD.js I0X(Su,N̭100755 ru-MD.js.map ǛF/	A<#,100755 ru-UA.d.ts DmrΨFFDҰbf100755 ru-UA.js -PʱC^$.100755 ru-UA.js.map 6ɏ^枈t8100755 ru.d.ts DmrΨFFDҰbf100755 ru.js +L*J"100755 ru.js.map 7/ԮhE'_r100755 rw.d.ts 2p-+U#\3jȧt{U100755 rw.js VgN6YXPP-100755 rw.js.map @/` |%CٯL100755 rwk.d.ts 2p-+U#\3jȧt{U100755 rwk.js hY٘Uu#8100755 rwk.js.map ;d/7c:7Af_9#100755 sa.d.ts 2p-+U#\3jȧt{U100755 sa.js g9#d'8|VD100755 sa.js.map 0xӏMGS3sv 100755 sah.d.ts 2p-+U#\3jȧt{U100755 sah.js ] ~ja;&du100755 sah.js.map +F>D/FsN7100755 saq.d.ts 2p-+U#\3jȧt{U100755 saq.js [ Ia'100755 saq.js.map Z)a!>))100755 sat-Olck.d.ts 2p-+U#\3jȧt{U100755 sat-Olck.js f|l< KCy100755 sat-Olck.js.map Le'ʳu+9100755 sat.d.ts 2p-+U#\3jȧt{U100755 sat.js Es>iIWH100755 sat.js.map O<;Rj^6F100755 sbp.d.ts 2p-+U#\3jȧt{U100755 sbp.js }BP0sM
 Eb100755 sbp.js.map ͪVq78S	f) 100755 sc.d.ts 2p-+U#\3jȧt{U100755 sc.js %{"Yv100755 sc.js.map H!~\ib4^0100755 sd-Arab.d.ts 2p-+U#\3jȧt{U100755 sd-Arab.js 9r_"3@d100755 sd-Arab.js.map vtq	
_?:100755 sd-Deva.d.ts 2p-+U#\3jȧt{U100755 sd-Deva.js o7M<ڥO.u/100755 sd-Deva.js.map 'XA#:#m1f100755 sd.d.ts 2p-+U#\3jȧt{U100755 sd.js 'l\`9swQԿC.100755 sd.js.map I{&jQHFϕ100755 se-FI.d.ts 2p-+U#\3jȧt{U100755 se-FI.js -gn0^USu100755 se-FI.js.map WuknЍ9!*T>100755 se-SE.d.ts 2p-+U#\3jȧt{U100755 se-SE.js v\ⷓS\~y100755 se-SE.js.map oIh _ﭡ؏}g100755 se.d.ts 2p-+U#\3jȧt{U100755 se.js )uw2g~ d100755 se.js.map n@W0ئmqJ100755 seh.d.ts 2p-+U#\3jȧt{U100755 seh.js AޤSǍ`A100755 seh.js.map ~OOHA3d*100755 ses.d.ts 2p-+U#\3jȧt{U100755 ses.js xe$Ҹ$>?8100755 ses.js.map ULP+u}b{'!E>>100755 sg.d.ts 2p-+U#\3jȧt{U100755 sg.js '[D\PQHNKdLm100755 sg.js.map pZ=ܚR100755 shi-Latn.d.ts 2p-+U#\3jȧt{U100755 shi-Latn.js fV#_gtKp100755 shi-Latn.js.map <aʽ8xSh]	/100755 shi-Tfng.d.ts 2p-+U#\3jȧt{U100755 shi-Tfng.js POnNF?b)100755 shi-Tfng.js.map pu@"c*ʂ#	G~a100755 shi.d.ts 2p-+U#\3jȧt{U100755 shi.js 0>F#\.RMNy;l100755 shi.js.map D	|-q3W4100755 si.d.ts DmrΨFFDҰbf100755 si.js {iA=_qb100755 si.js.map $q=100755 sk.d.ts NʇBZ({Mq|:`100755 sk.js ??ƪ	1100755 sk.js.map  zEY:100755 sl.d.ts NʇBZ({Mq|:`100755 sl.js T?(](100755 sl.js.map  -f(q	$Q}+:100755 smn.d.ts 2p-+U#\3jȧt{U100755 smn.js PKR%Dbu;F100755 smn.js.map SCd6۝mr@100755 sn.d.ts 2p-+U#\3jȧt{U100755 sn.js U=E'1100755 sn.js.map #HJf Z4!C100755 so-DJ.d.ts 2p-+U#\3jȧt{U100755 so-DJ.js 8j`+w~UĒ^r΁100755 so-DJ.js.map /JDZ*u100755 so-ET.d.ts 2p-+U#\3jȧt{U100755 so-ET.js L2Wd8O+100755 so-ET.js.map \&)\tBo4{͠100755 so-KE.d.ts 2p-+U#\3jȧt{U100755 so-KE.js qji*J0Ί100755 so-KE.js.map Bӽ
hbQA,zT100755 so.d.ts 2p-+U#\3jȧt{U100755 so.js em\o[nR100755 so.js.map C 5E=100755 sq-MK.d.ts DmrΨFFDҰbf100755 sq-MK.js 
jQYD
șQS10%;(100755 sq-MK.js.map Xj+%UIa>=|100755 sq-XK.d.ts DmrΨFFDҰbf100755 sq-XK.js K00skMxz100755 sq-XK.js.map v̶K!tnQ jlA100755 sq.d.ts DmrΨFFDҰbf100755 sq.js [糏VF2|100755 sq.js.map N
SW恧x100755 sr-Cyrl-BA.d.ts DmrΨFFDҰbf100755 sr-Cyrl-BA.js <o=^
v{100755 sr-Cyrl-BA.js.map |̓a_g;|2fJi100755 sr-Cyrl-ME.d.ts DmrΨFFDҰbf100755 sr-Cyrl-ME.js U="s100755 sr-Cyrl-ME.js.map YS 9~bB*BGJ100755 sr-Cyrl-XK.d.ts DmrΨFFDҰbf100755 sr-Cyrl-XK.js 4Z}D+Ա[100755 sr-Cyrl-XK.js.map lT+m^RGi100755 sr-Cyrl.d.ts DmrΨFFDҰbf100755 sr-Cyrl.js &>f4!W	3M100755 sr-Cyrl.js.map -24՞(BJ9100755 sr-Latn-BA.d.ts DmrΨFFDҰbf100755 sr-Latn-BA.js Oƙt.?ۥۼ100755 sr-Latn-BA.js.map ,t,~Jb؈eV100755 sr-Latn-ME.d.ts DmrΨFFDҰbf100755 sr-Latn-ME.js #vDa>yMe100755 sr-Latn-ME.js.map Ct.+	"Z./n100755 sr-Latn-XK.d.ts DmrΨFFDҰbf100755 sr-Latn-XK.js ~r'[L100755 sr-Latn-XK.js.map jw]0^6vLf100755 sr-Latn.d.ts DmrΨFFDҰbf100755 sr-Latn.js Cq\q)Y3=100755 sr-Latn.js.map 7 >?XCUfH100755 sr.d.ts DmrΨFFDҰbf100755 sr.js ˖=411<w66100755 sr.js.map ;JS8^5Oi=$?100755 su-Latn.d.ts 2p-+U#\3jȧt{U100755 su-Latn.js Â1aQla100755 su-Latn.js.map *' gz100755 su.d.ts 2p-+U#\3jȧt{U100755 su.js ibI'OGSܠw100755 su.js.map jՈ0Rg,100755 sv-AX.d.ts NʇBZ({Mq|:`100755 sv-AX.js EKidkB6Cg's100755 sv-AX.js.map #Q|{!100755 sv-FI.d.ts NʇBZ({Mq|:`100755 sv-FI.js ww	R٬W100755 sv-FI.js.map t7!`0y6N100755 sv.d.ts NʇBZ({Mq|:`100755 sv.js 0]z!(Q0N100755 sv.js.map K
̋p\'D@K^-100755 sw-CD.d.ts NʇBZ({Mq|:`100755 sw-CD.js f`)Gw>A+p%䞢100755 sw-CD.js.map V C8Z/ac100755 sw-KE.d.ts NʇBZ({Mq|:`100755 sw-KE.js ;z>wnNڹA100755 sw-KE.js.map .V6MPK΋)@100755 sw-UG.d.ts NʇBZ({Mq|:`100755 sw-UG.js %ī(l3:N{100755 sw-UG.js.map U$KLbZ"zV100755 sw.d.ts NʇBZ({Mq|:`100755 sw.js qbdG:Bس2100755 sw.js.map Rs̖# 8}YˇtP100755 ta-LK.d.ts DmrΨFFDҰbf100755 ta-LK.js mvh8yGN100755 ta-LK.js.map v6'\4nZ100755 ta-MY.d.ts DmrΨFFDҰbf100755 ta-MY.js _vMگzoN100755 ta-MY.js.map 0B2'ZgJͤ!100755 ta-SG.d.ts DmrΨFFDҰbf100755 ta-SG.js MiJV^@Oej100755 ta-SG.js.map *&AB$iw1100755 ta.d.ts DmrΨFFDҰbf100755 ta.js >e ^w䠰gWZ100755 ta.js.map  a=~QU7z100755 te.d.ts ~s'd`>N[100755 te.js auz7u{"z100755 te.js.map OMKS!^hJb|100755 teo-KE.d.ts 2p-+U#\3jȧt{U100755 teo-KE.js eaKa4LA\Bڐ(100755 teo-KE.js.map 9^ol0b\100755 teo.d.ts 2p-+U#\3jȧt{U100755 teo.js {ed9F100755 teo.js.map 7C\'Ʀ]Q@:)100755 tg.d.ts 2p-+U#\3jȧt{U100755 tg.js uʼ8>Zo,z100755 tg.js.map @]޼҂Yu$iE100755 th.d.ts DmrΨFFDҰbf100755 th.js $ZIDW	0q~,&n100755 th.js.map h%]rkO0C100755 ti-ER.d.ts 2p-+U#\3jȧt{U100755 ti-ER.js %1RP)$100755 ti-ER.js.map VO5%hG؊O100755 ti.d.ts 2p-+U#\3jȧt{U100755 ti.js >f`i7B`ӓ6\100755 ti.js.map Q2H4 K!H,N100755 tk.d.ts 2p-+U#\3jȧt{U100755 tk.js R,nfز}1+vLi\100755 tk.js.map \ :Su+z`100755 to.d.ts 2p-+U#\3jȧt{U100755 to.js tg0S:b100755 to.js.map HAOV=^9tl100755 tr-CY.d.ts DmrΨFFDҰbf100755 tr-CY.js ј{]lX"e*vKquS100755 tr-CY.js.map 4ߍg"x`OM
ϼ100755 tr.d.ts DmrΨFFDҰbf100755 tr.js UM-P9100755 tr.js.map 3Ҧwvz%C100755 tt.d.ts 2p-+U#\3jȧt{U100755 tt.js cn5Ҷ}m +100755 tt.js.map C)i,ٝ2?`100755 twq.d.ts 2p-+U#\3jȧt{U100755 twq.js FҞraT,WrC1O100755 twq.js.map L`LU/{0}?v100755 tzm.d.ts 2p-+U#\3jȧt{U100755 tzm.js ) 0ݯ100755 tzm.js.map lx1`Ϡ,H,I100755 ug.d.ts 2p-+U#\3jȧt{U100755 ug.js :#^bE:{^/EN100755 ug.js.map es4 b輖g100755 uk.d.ts DmrΨFFDҰbf100755 uk.js 	FI$OSd`l100755 uk.js.map +,:}:u$)\9t100755 und.d.ts DmrΨFFDҰbf100755 und.js )\m*g]4e100755 und.js.map yB[c}t4S100755 ur-IN.d.ts DmrΨFFDҰbf100755 ur-IN.js +b	l}=c9a100755 ur-IN.js.map 1%8_U%100755 ur.d.ts DmrΨFFDҰbf100755 ur.js Gq<2ޗpS100755 ur.js.map ݲCa=100755 uz-Arab.d.ts 2p-+U#\3jȧt{U100755 uz-Arab.js /+.rQ~G100755 uz-Arab.js.map G\\ǫ9r'ݙVb100755 uz-Cyrl.d.ts ~s'd`>N[100755 uz-Cyrl.js aY:+kt͝-D-100755 uz-Cyrl.js.map f,#kݟ_F1-੯100755 uz-Latn.d.ts ~s'd`>N[100755 uz-Latn.js YBNso;8L0ͭ#100755 uz-Latn.js.map ?݈lzJIќ"#!8100755 uz.d.ts ~s'd`>N[100755 uz.js F' ,wxu100755 uz.js.map 9"u34exe:{100755 vai-Latn.d.ts 2p-+U#\3jȧt{U100755 vai-Latn.js Zχ68dKBcprI100755 vai-Latn.js.map >WiGB@9߇100755 vai-Vaii.d.ts 2p-+U#\3jȧt{U100755 vai-Vaii.js "-QMߺ100755 vai-Vaii.js.map 9+ui2maǐen100755 vai.d.ts 2p-+U#\3jȧt{U100755 vai.js 1vnɭG;100755 vai.js.map Zf8%(p`{ڪ"100755 vi.d.ts DmrΨFFDҰbf100755 vi.js QS.RQrvx7100755 vi.js.map Mʼ"qg-+"100755 vun.d.ts 2p-+U#\3jȧt{U100755 vun.js TEGLGӕ100755 vun.js.map iCQ*loG100755 wae.d.ts 2p-+U#\3jȧt{U100755 wae.js  ?OY=)o79100755 wae.js.map 6'^D_rQ^ie100755 wo.d.ts 2p-+U#\3jȧt{U100755 wo.js *YMI$!26100755 wo.js.map j*)4100755 xh.d.ts 2p-+U#\3jȧt{U100755 xh.js GC],JYx=_100755 xh.js.map 
xQ*d	-J100755 xog.d.ts 2p-+U#\3jȧt{U100755 xog.js 9B1hnXwEq+100755 xog.js.map Ĉ@?Vՙ100755 yav.d.ts 2p-+U#\3jȧt{U100755 yav.js !+	K1PXCs100755 yav.js.map E488'Ft͠100755 yi.d.ts 2p-+U#\3jȧt{U100755 yi.js 3.=+&zYK100755 yi.js.map %ӐZn$EW100755 yo-BJ.d.ts 2p-+U#\3jȧt{U100755 yo-BJ.js :i9hlCu.100755 yo-BJ.js.map -
[t9h|D100755 yo.d.ts 2p-+U#\3jȧt{U100755 yo.js wݏ!E$"100755 yo.js.map (Vʴ"n100755 yrl-CO.d.ts ~s'd`>N[100755 yrl-CO.js 4x4t 100755 yrl-CO.js.map ÂZ~v0᝴Z)100755 yrl-VE.d.ts ~s'd`>N[100755 yrl-VE.js q[KK~ċLV&w100755 yrl-VE.js.map ,UxfmrϷe100755 yrl.d.ts ~s'd`>N[100755 yrl.js 0}67i餸100755 yrl.js.map .et1A&100755 yue-Hans.d.ts ~s'd`>N[100755 yue-Hans.js @ aJkB	ae100755 yue-Hans.js.map KhQw@27100755 yue-Hant.d.ts ~s'd`>N[100755 yue-Hant.js 彐wA6.@9100755 yue-Hant.js.map &"+u:5r6I100755 yue.d.ts ~s'd`>N[100755 yue.js Q@]mJn#100755 yue.js.map FZx9MS	tՖA100755 zgh.d.ts 2p-+U#\3jȧt{U100755 zgh.js $^!LZe>|=Wz100755 zgh.js.map Q ~-t
r';100755 zh-Hans-HK.d.ts DmrΨFFDҰbf100755 zh-Hans-HK.js CtZ,Y`.GX100755 zh-Hans-HK.js.map pWj9䐎4D100755 zh-Hans-MO.d.ts DmrΨFFDҰbf100755 zh-Hans-MO.js Lyldq>100755 zh-Hans-MO.js.map 9tMNQ+XO9gz5100755 zh-Hans-SG.d.ts DmrΨFFDҰbf100755 zh-Hans-SG.js T	䶖3^ieG)ͭg{100755 zh-Hans-SG.js.map K80dQ&q100755 zh-Hans.d.ts DmrΨFFDҰbf100755 zh-Hans.js 8Qw3100755 zh-Hans.js.map nCjuwE100755 zh-Hant-HK.d.ts ~s'd`>N[100755 zh-Hant-HK.js ΄^B5X):4b+100755 zh-Hant-HK.js.map -
^w胞(#Y100755 zh-Hant-MO.d.ts ~s'd`>N[100755 zh-Hant-MO.js "4pnn5100755 zh-Hant-MO.js.map B+nu2!100755 zh-Hant.d.ts ~s'd`>N[100755 zh-Hant.js ?궇;:xiɭDM:H100755 zh-Hant.js.map d2ůQg7t100755 zh.d.ts DmrΨFFDҰbf100755 zh.js 숝Mn"q" 100755 zh.js.map /z{K#.;K6G100755 zu.d.ts m"ZB8/XZ9100755 zu.js bW.?V,100755 zu.js.map ;5aycaҳm"Zj%	xO100755 af-NA.js ] 'Ot9100755 af.js ՕkN~ًS4`100755 agq.js gR'=Ñ帅(x100755 ak.js #UG >J!R100755 am.js k	M'H@xf٧100755 ar-AE.js yW>5.^6|Ձ100755 ar-BH.js zT*Mjdr8C100755 ar-DJ.js NlFʹ⭞100755 ar-DZ.js K%f*҈]100755 ar-EG.js GӼ_´Ta /100755 ar-EH.js J;WװX6_FHUK100755 ar-ER.js AWDٙTCX!*100755 ar-IL.js 6uTڴ{!VX֍5100755 ar-IQ.js 5>ETqՀn@O100755 ar-JO.js ea?"#100755 ar-KM.js A!qysRVFJB:$100755 ar-KW.js $Șk.oaŽP100755 ar-LB.js &S5)zQ@t100755 ar-LY.js 6j%{APq=I6?w100755 ar-MA.js C1Z%m򝐚sQa100755 ar-MR.js .;Fy/.1100755 ar-OM.js .YLSQ?Alp/100755 ar-PS.js y-<qi,ߕt100755 ar-QA.js E	XyT!1nrm3d100755 ar-SA.js a[dm2IF
100755 ar-SD.js UN9<MR100755 ar-SO.js 慼Ykj&׹eX\F5100755 ar-SS.js qMDB)>ˌ100755 ar-SY.js 	wt ̮پKhJ100755 ar-TD.js ⇰H0)^n>:0100755 ar-TN.js \6$
L|pU100755 ar-YE.js Y=}jz LN`100755 ar.js h.Qp>d100755 as.js 2&DY(֩s2100755 asa.js 5WobJsIp$fϜ100755 ast.js -VqǗ}Idj'N100755 az-Cyrl.js DAIJmyv%u=A ;100755 az-Latn.js b-baI ,'ӗ100755 az.js ;*_s~ 100755 bas.js L2(ScKث%100755 be-tarask.js ?Q,r\K+2τ}100755 be.js WW}~d_8pnG100755 bem.js &K/n/~sv'100755 bez.js jn8	(RI L4100755 bg.js ixuJC$MO7HSIE100755 bm.js ]!7'WL5'9|z100755 bn-IN.js {fZ"^
A`q100755 bn.js IِюCB=_1100755 bo-IN.js }Ykw9!ul100755 bo.js 9mA+jGqf100755 br.js -	p*gkrlw100755 brx.js ֋a=%
`>100755 bs-Cyrl.js 1S8}ic(c)	100755 bs-Latn.js R=R#o:ѩ100755 bs.js x
uBj6oH100755 ca-AD.js ҂.SF
ހHwJ100755 ca-ES-valencia.js x>q/Y g !100755 ca-FR.js 9xKf-@sA100755 ca-IT.js yaU9>5d*GL100755 ca.js v*ҊE8N*.}
100755 ccp-IN.js lg)|_RIRt100755 ccp.js ۻ #s1uSHl100755 ce.js /Ղߙ'7i7100755 ceb.js '1Fs1
x{>W100755 cgg.js I<$E[w:2^100755 chr.js mސR[3%\[100755 ckb-IR.js w.dafGB100755 ckb.js i8jzYMtWKD100755 cs.js t]XqGs3100755 cy.js 3iTkD\+jg100755 da-GL.js L ן뭞3100755 da.js (tyF 9+KOJ100755 dav.js :n3]w[uXw˘?100755 de-AT.js fUJwB<n"100755 de-BE.js O
ո𬐞100755 de-CH.js aga5 ڶɢ100755 de-IT.js 1~VU	AGY]100755 de-LI.js bHz;ΟXح100755 de-LU.js 5>#9=ڽX100755 de.js JWu]74Y<uDb100755 dje.js O	O.)oO3i(100755 doi.js bh|$yh100755 dsb.js b5tBm(100755 dua.js <s~&IP/?100755 dyo.js okuSx ,B(	100755 dz.js C^ReɄmU+100755 ebu.js D<LkiblW<100755 ee-TG.js BoqS_){1:100755 ee.js zd g+=&̟#m8100755 el-CY.js +dW'xP"gjH100755 el.js oޢ^$!y100755 en-001.js 3A887^100755 en-150.js #kA=gVF~8100755 en-AE.js m?8Ik
ő6'%8d100755 en-AG.js W4Ck.ԞlN)MM100755 en-AI.js 9>	{uQVXgs100755 en-AS.js @[/b:1*&100755 en-AT.js >MС%toU9<HS100755 en-AU.js TSEXyl!!>100755 en-BB.js O痯J*˨n9100755 en-BE.js 	uSCg}#唡~L100755 en-BI.js [#"yT+GVH]rO100755 en-BM.js Vspֱ<r
9!]100755 en-BS.js X67VUE1
V 100755 en-BW.js &%bV::j#100755 en-BZ.js J"[#100755 en-CA.js )d{BZ100755 en-CC.js xR$M:gէ6100755 en-CH.js By54]	D|i{100755 en-CK.js bò,4kdw100755 en-CM.js [DP H^թ{wf100755 en-CX.js l6ʓ$0NT100755 en-CY.js Z!{u&)*100755 en-DE.js 7,#,\p8v100755 en-DG.js a;:Hc#IX100755 en-DK.js *EގnZ100755 en-DM.js uB.r١;r100755 en-ER.js tEs&2Eq͟_100755 en-FI.js 7lֵ@4U|z!,100755 en-FJ.js q"p8t_CArZ100755 en-FK.js 2`{Y't100755 en-FM.js >)Ǝ5s3T(X100755 en-GB.js ʈU]\찟)E100755 en-GD.js )\)d-,2)100755 en-GG.js ֊Ұ{%100755 en-GH.js >LP+!dO^fy100755 en-GI.js 濒D4G$
~100755 en-GM.js ;P|/櫛Ќ`100755 en-GU.js j*0w/'Xr~100755 en-GY.js }r-^҂&ay100755 en-HK.js 6\UO6Gnp100755 en-IE.js 	N=39SMZ a100755 en-IL.js Ԩ6I\Yz100755 en-IM.js Ŀ9qKOd,#QCr100755 en-IN.js NwZd|3*r100755 en-IO.js ~f^&6G}+100755 en-JE.js PbQ7GIVO100755 en-JM.js 'l
5_NI1I100755 en-KE.js AAWt|- }`100755 en-KI.js ~HB'v100755 en-KN.js &8z<op72(X100755 en-KY.js /`zhC1cV[100755 en-LC.js ]8C.Zz2!uJ100755 en-LR.js d`q?_t{ooظ100755 en-LS.js 	h4y
ləv>w+100755 en-MG.js DЋ^w⛠ t100755 en-MH.js ROOJӛvQ100755 en-MO.js FJcz[;&&/b/100755 en-MP.js +o0xEK^@uR#100755 en-MS.js 
H?100755 en-MT.js -"16B<4t100755 en-MU.js yCvDr100755 en-MV.js Z<6p?100755 en-MW.js v'P1HFCz100755 en-MY.js n:%Nbo&#[100755 en-NA.js gWaMN֮ g(?חs100755 en-NF.js mmQN{(P{100755 en-NG.js f."G(}
OF100755 en-NL.js CYLR]v)= 100755 en-NR.js |eq>ԲhqӦf100755 en-NU.js Rj" pfbP100755 en-NZ.js ?I9Dz4[[HPnG100755 en-PG.js ?%X8WA100755 en-PH.js ǋC5ʗh-24؞100755 en-PK.js aĎǞD7F*so100755 en-PN.js [ܶ.7{o>s{u100755 en-PR.js /;5.$%_SH100755 en-PW.js կkڿ$P100755 en-RW.js <K/dd-1100755 en-SB.js kBBykQpM.100755 en-SC.js i+?Ù<i100755 en-SD.js EPҪ5C100755 en-SE.js ^0LOQj0aO100755 en-SG.js :Cr3"C(Ok100755 en-SH.js pH$z|#cfлX=100755 en-SI.js (BU:{yRMh100755 en-SL.js `h5,tʱܢE100755 en-SS.js  ~уJ'jwx~100755 en-SX.js T>	{V"z}100755 en-SZ.js &b4pNFs-Io100755 en-TC.js *#&wut5R3100755 en-TK.js +V]'w!BV+@100755 en-TO.js c<oY-100755 en-TT.js #SaO Q|ZǼ100755 en-TV.js g^H1_TpO;djZw@6100755 en-TZ.js 0J
8x-Ti#100755 en-UG.js yb.ywz100755 en-UM.js i0>֞,Ք;100755 en-VC.js .6p򁁶^I}W100755 en-VG.js @P7e3-8ʧP100755 en-VI.js PRmGU5:100755 en-VU.js  Eb&JG100755 en-WS.js 
S|Bb+)rxh100755 en-ZA.js mV*YjyX@"*100755 en-ZM.js Of?V@^!OD	100755 en-ZW.js %im
9'Ʃ#fS100755 en.js qpy9ݾLf100755 eo.js Lɫ$n--Gw100755 es-419.js "b*+cNGzHb^Uˍ100755 es-AR.js }k󑺸2,2M100755 es-BO.js փ[Kr:/=100755 es-BR.js kӬΙƧ100755 es-BZ.js 	Vj'=V\ 100755 es-CL.js @Ps+ rв100755 es-CO.js C7!"]Gm)100755 es-CR.js 3Y X^+%"h%100755 es-CU.js x[$0!"6wՖBYo100755 es-DO.js .JDk,7/T]h<~100755 es-EA.js &4`HRv4100755 es-EC.js 
yOCUnM˾LYb100755 es-GQ.js ֍J2Jd100755 es-GT.js P \j:8)c#&100755 es-HN.js 8Pj5J100755 es-IC.js F:~zh100755 es-MX.js ޺+0x100755 es-NI.js d'V}	%100755 es-PA.js bb@a0QZ;100755 es-PE.js $n/҄/lxlՀ.F100755 es-PH.js *NЈ셻i$Y&+100755 es-PR.js ;nFZ59a&X100755 es-PY.js w@ NbBĤ100755 es-SV.js 0qwU$[100755 es-US.js S.s؂n{o100755 es-UY.js V,Ká^vkżWb100755 es-VE.js ;E.n7Ƿ	R100755 es.js UpA?h100755 et.js )Vu.Zģ[][100755 eu.js |ՄC!
9100755 ewo.js !I~ݶq˥100755 fa-AF.js 'a<100755 fa.js GRܘ-˩Ύ 100755 ff-Adlm-BF.js &*.+\8m`Bs100755 ff-Adlm-CM.js 9QS:pEp.100755 ff-Adlm-GH.js a;.6K{?Q100755 ff-Adlm-GM.js f
!Ģ*^=6100755 ff-Adlm-GW.js T|6rv~~w100755 ff-Adlm-LR.js \t8ԞUG;B#100755 ff-Adlm-MR.js &}ht/͹]100755 ff-Adlm-NE.js ::]0R z͌100755 ff-Adlm-NG.js zM[s"100755 ff-Adlm-SL.js M=$Su)s쪈100755 ff-Adlm-SN.js 6_fLt`;Κ100755 ff-Adlm.js ]xYgʄb쿐100755 ff-CM.js *_xҾ%G2100755 ff-GN.js M)cXuB8lb100755 ff-Latn-BF.js K`Xx㝽oU100755 ff-Latn-CM.js 2r<bBj100755 ff-Latn-GH.js qBxp3?ڮ	i#100755 ff-Latn-GM.js H
LBY:100755 ff-Latn-GN.js f짐H0100755 ff-Latn-GW.js hp{`Ʒ100755 ff-Latn-LR.js Ei:pLJ`W,F8L100755 ff-Latn-MR.js =5xՆfY	100755 ff-Latn-NE.js (B4,~KI;4P*100755 ff-Latn-NG.js (
 P(ܐS? 100755 ff-Latn-SL.js :E!|@ "iDsb@100755 ff-Latn.js ,)Fx>3n,0jݏ<{100755 ff-MR.js ARp<>)~9!o100755 ff.js nPX^ љ7.v100755 fi.js ^\b%ǖ
^DW;;T100755 fil.js *&Z팲˲100755 fo-DK.js tqOl4 Y3100755 fo.js 's2l100755 fr-BE.js cJAފڷ~!W100755 fr-BF.js QP.Ւ,lTALy100755 fr-BI.js W</=iȊ+T100755 fr-BJ.js }mE*ח|%.100755 fr-BL.js fjA%100755 fr-CA.js Jz`$\c[|">l6100755 fr-CD.js I?fHF,> V!dF100755 fr-CF.js A
Q$C#6UpJM100755 fr-CG.js QF]"TOB. 100755 fr-CH.js f+a(Nˆ8+@'100755 fr-CI.js J
Z!#3x100755 fr-CM.js {[-ѪRe-%100755 fr-DJ.js GE_9VPVu9Ճ100755 fr-DZ.js 
BN1pzӂnO4100755 fr-GA.js Ϟр'1!?100755 fr-GF.js MrMzxUp&T.100755 fr-GN.js yS*	]go:Hrj100755 fr-GP.js s4tF`ڝ(\-100755 fr-GQ.js D{G*?K ߟĮ100755 fr-HT.js $;XMa6Φ100755 fr-KM.js ;¤H+r6-۸ʁkN100755 fr-LU.js uM*LҌZ34u100755 fr-MA.js J+P)Dk7Mzbw100755 fr-MC.js K
l!哽p;z100755 fr-MF.js 	h^9RLsb֎jw100755 fr-MG.js hO^Z6Qߚ~V100755 fr-ML.js L xT|t?100755 fr-MQ.js +h0湊0100755 fr-MR.js EazDǊ17100755 fr-MU.js v¾t,]BNO	q100755 fr-NC.js 
^X :)100755 fr-NE.js \_xe1֛34100755 fr-PF.js 툡68%i}100755 fr-PM.js +4c+`o?H100755 fr-RE.js fQ|Vp$+v\7b100755 fr-RW.js 4(kcn\100755 fr-SC.js D Qk,<Kt!^f-ͦ@100755 fr-SN.js _/ ?y100755 fr-SY.js LLϪ+]}100755 fr-TD.js _&df%J\100755 fr-TG.js u>F;>cy100755 fr-TN.js TŹgi)@s100755 fr-VU.js 7'VG &6100755 fr-WF.js ^rSZ^l8100755 fr-YT.js n1s=O0`l100755 fr.js bvEr2*Y
100755 fur.js rm{UR̮\100755 fy.js "oa)@g`@:\=100755 ga-GB.js guuq*PQS9100755 ga.js v}38;P 100755 gd.js Ic'_ C7le100755 gl.js LkzGzRFfI100755 gsw-FR.js l0ШwSŽTص=100755 gsw-LI.js a!RCFq\mMK"100755 gsw.js 1HB3ڠ100755 gu.js Ks֫M*l.100755 guz.js p5WwiKs100755 gv.js d6OIwnV'100755 ha-GH.js mn/XJ,er!mvǯVj]100755 ha-NE.js p՞oS7100755 ha.js %wV*tLI100755 haw.js Y?F#C䱘ߚ100755 he.js gL!+r1Abby100755 hi-Latn.js 'MLMp;w 8r+100755 hi.js v)s$ޒdu&<LA100755 hr-BA.js iݟЫ]100755 hr.js qS:4yP*T100755 hsb.js Ծlj۶|U100755 hu.js %fIњ"cKyʤX100755 hy.js 5JA.n|rve100755 ia.js \H^<9N100755 id.js  V)aWG#100755 ig.js Ss4D7)8k100755 ii.js SوQ^G?i$m\100755 is.js tA}.؛_.x(n100755 it-CH.js C8	L }l100755 it-SM.js l]@3=V~@?100755 it-VA.js d\6x/Ϻ٤kҩ100755 it.js S35&w>f100755 ja.js 6@W:~ B 100755 jgo.js 6v9/0ī#\W|100755 jmc.js Af{g_100755 jv.js B$&Ц+100755 ka.js _\m\qle100755 kab.js D{n#100755 kam.js qo*𶨱k:100755 kde.js ;B߂̄100755 kea.js uRionf100755 kgp.js Pb`R Ex$100755 khq.js a|VvQ06%100755 ki.js ~@;[}GۗFwquL100755 kk.js p:㿑=S0AY100755 kkj.js JT\0"65100755 kl.js WlwҫYA1Wg100755 kln.js %]\(w100755 km.js 8;lK֠t`100755 kn.js ǯ܍kk=
W`Q100755 ko-KP.js ݼ:8a2誯&֣f100755 ko.js WEz.ugbᴉ)100755 kok.js =#Nد
IL)p&100755 ks-Arab.js R7<ޒGb100755 ks-Deva.js )IAr
MQT1100755 ks.js Y~lZXϟCA100755 ksb.js ${93>40ȅYI100755 ksf.js 6Rs+S|[Zqo100755 ksh.js Akcm;_j׆\100755 ku.js \	9j "*ݛ100755 kw.js NM&S-,)100755 ky.js ngWaC]v|100755 lag.js &S=?Lz6^.e100755 lb.js ),.:XR#l100755 lg.js %q{[)*tQ-y100755 lkt.js o-{g:<T100755 ln-AO.js bx':,*5cq100755 ln-CF.js zc xY'_4\L100755 ln-CG.js ˛Q[QO100755 ln.js  bD@bHr4Sa^100755 lo.js CWRbKGTd100755 lrc-IQ.js }9k'P*ܷ 8100755 lrc.js %_ hY=100755 lt.js wUhNjL(LK100755 lu.js .O\7	p5100755 luo.js _WO/54F4l*100755 luy.js x	9:AoAeCF100755 lv.js .>, lwו5100755 mai.js yw=67Ȼ100755 mas-TZ.js k@-iy^p100755 mas.js 5gz<ofz^DԿ>100755 mer.js N{AF3hFzc100755 mfe.js p-[l i100755 mg.js h$dE]a5CR100755 mgh.js ɿ1OwvxU=,/100755 mgo.js  =nAlDEQѭ100755 mi.js 85)"P100755 mk.js ;n6FKߑ;i9W100755 ml.js ޅ0dW100755 mn.js DC;iیg.F100755 mni-Beng.js NF@tl!+100755 mni.js 9-=kC+Tj100755 mr.js ?Yn+SM""100755 ms-BN.js 
i4]ި	100755 ms-ID.js +*ʥ+)~j100755 ms-SG.js ׇQUkp<^rɋP100755 ms.js B/b+74Htr1V%100755 mt.js [D5/6100755 mua.js 4z8Fy100755 my.js `zW3gw100755 mzn.js Z];C?^X100755 naq.js 9	G':bp100755 nb-SJ.js 3"jLg100755 nb.js lJXYe100755 nd.js ɼ:l{q*}c100755 nds-NL.js wQhƷ)Z%LUC100755 nds.js )d׃L^*y100755 ne-IN.js .K'KC8Ě -100755 ne.js @ 4T6}9q100755 nl-AW.js ̇WuX*>100755 nl-BE.js B!ݹum100755 nl-BQ.js XLQ1=`^{100755 nl-CW.js ~"ˁJ3u3g1i100755 nl-SR.js \Д49˥2ҥ100755 nl-SX.js x쓪)C責100755 nl.js b8wEAy-100755 nmg.js jy%{
p8 fJ100755 nn.js ʝ~
gxx100755 nnh.js |d=/K:k1100755 no.js ~ϴ2yXp1}CR	100755 nus.js |H^<s ڦo
100755 nyn.js Vp7x#̏FAM*G100755 om-KE.js fldw@»ш100755 om.js \i"#qX$$*'100755 or.js xl6啇GiW'&100755 os-RU.js zqk	Wlr{!ӲE100755 os.js hXtNesk 100755 pa-Arab.js rο1.Q)^100755 pa-Guru.js T80هF|{ (eZ100755 pa.js  *+5igK100755 pcm.js E[x)ek6100755 pl.js έy=4'Lx|100755 ps-PK.js :ޕ9d;滳o100755 ps.js p\O=ӐՓv6׹cK100755 pt-AO.js ]Fs[;񘍵O
7(100755 pt-CH.js _FQZTaKO2rYmn100755 pt-CV.js V{p:%q100755 pt-GQ.js &0YmMzE!]:100755 pt-GW.js 9
;Uwm,UϚv100755 pt-LU.js kKhm}'N100755 pt-MO.js j(T9k;{G100755 pt-MZ.js U eRD/{100755 pt-PT.js 00LF*mB1\I9100755 pt-ST.js DOd}*c]g100755 pt-TL.js cO,%k100755 pt.js 2̺5O	
 C100755 qu-BO.js ъ]NwJHv|5acR100755 qu-EC.js joJ~ "iw100755 qu.js %cgP<100755 rm.js 峷Ƚ7}?{{|100755 rn.js G:PY_vǤ6ZHZ100755 ro-MD.js NLFn]O&\D100755 ro.js H&7k]3c?W7100755 rof.js 䦿Q͂<100755 ru-BY.js 
<FR?ţ100755 ru-KG.js LTY4;VsG100755 ru-KZ.js nM]pBi100755 ru-MD.js %$)aU1y100755 ru-UA.js ZIj6e100755 ru.js T)飲KS100755 rw.js uAX'z100755 rwk.js Vc-uX*100755 sa.js ꭠáL~100755 sah.js ]t|J=>ꔹay100755 saq.js ?5v?k100755 sat-Olck.js N!S;(GG.)100755 sat.js gm4BXМI100755 sbp.js Tj{;_
ǓY100755 sc.js uҗ-a,8=x2100755 sd-Arab.js ѐ#%<oȨ+1_100755 sd-Deva.js ڤ2"7dbHX100755 sd.js 2Xj	}VyiLh100755 se-FI.js 7`-Z7`qsQb100755 se-SE.js "PI/{[F#100755 se.js GM'{+`ā'C100755 seh.js 9n|sBYγÑmAa?100755 ses.js j,K^bZC100755 sg.js tRJ)'0<b7:i100755 shi-Latn.js Ϧ)%-ane(DR100755 shi-Tfng.js 83tXyvźf100755 shi.js MD^ݘ~TdzP100755 si.js &,v "X[I=y7100755 sk.js ICGchK100755 sl.js &d镩XL	9ʩq100755 smn.js }S)Vʿ!ec]100755 sn.js 0~Kk7xD|v100755 so-DJ.js P(%sfb[w100755 so-ET.js >Nk>x)Ј2FI100755 so-KE.js uu%;\/W100755 so.js W3BP6a|#@100755 sq-MK.js |TE饦Q9Iv100755 sq-XK.js 3kwI#_lo5"S100755 sq.js c<`cc8@p100755 sr-Cyrl-BA.js ESJf-7цO100755 sr-Cyrl-ME.js sy!h%}R100755 sr-Cyrl-XK.js @fFfd2R	100755 sr-Cyrl.js mbs6100755 sr-Latn-BA.js $\ɢ\ {`@kk*100755 sr-Latn-ME.js  "yOJɩ100755 sr-Latn-XK.js z7/dz)100755 sr-Latn.js L|mޱ"ci100755 sr.js ƷןP^&100755 su-Latn.js ;ȗC!t TN100755 su.js ¼\zƎ_P100755 sv-AX.js @93xgߒ<100755 sv-FI.js OFH|$|U
100755 sv.js Q.KL@tI.100755 sw-CD.js q@;=@[j100755 sw-KE.js |gٙjHό0ۨ100755 sw-UG.js F<mɂQ;g6Y100755 sw.js b0HukkNyH100755 ta-LK.js ^J-*;dPx100755 ta-MY.js J [On;hG}Ҵ100755 ta-SG.js S|8*VT%9100755 ta.js otR3I&٦6100755 te.js 7n[n:.D[^0g$100755 teo-KE.js :x}#t$ 100755 teo.js )SxLj?jR}100755 tg.js QD<,l'100755 th.js 	iujB)cA100755 ti-ER.js +a.a\azn{S100755 ti.js Yn1i0cP(j100755 tk.js RbA:;ͻp100755 to.js &^NzӛMԌA1100755 tr-CY.js Pw>(̩Ny|L7100755 tr.js B
@آu7100755 tt.js ; ӭB?5100755 twq.js X,wC&a:W}\s100755 tzm.js eX9x&h %100755 ug.js 'rD|EÆ,'P/Vv100755 uk.js G+uYY CF<100755 und.js  T{܎}}E1100755 ur-IN.js ťW100755 ur.js hTnDMO100755 uz-Arab.js !f(ƴ~:

.m100755 uz-Cyrl.js vG?r82VϻN100755 uz-Latn.js ȻNbUN;{+100755 uz.js *S%| lc*100755 vai-Latn.js P1(
{F7H:100755 vai-Vaii.js tpqn(>-\W'RO
Q100755 vai.js P4l؎ڎ7)0r8100755 vi.js mCwhMqIp100755 vun.js CnEGs<ۿk۪100755 wae.js ;Xws-9U100755 wo.js c*LlK yěk100755 xh.js }Nj2[q1*n100755 xog.js $gSBI:klȄ100755 yav.js x r`W/v;a100755 yi.js ($6	p^ޟ100755 yo-BJ.js {m)ƀ\*4ǧq100755 yo.js p	a\*.|='|`100755 yrl-CO.js R!r@05pWn100755 yrl-VE.js _a6&hQ#Ӱ100755 yrl.js `M.TP[100755 yue-Hans.js {c"9)5wBԎAj100755 yue-Hant.js cZd8GB.	'100755 yue.js M|R^'YLjl[!100755 zgh.js L0<Nd+J>*!ړ100755 zh-Hans-HK.js pe<WHn_O100755 zh-Hans-MO.js |(՚ڱS#100755 zh-Hans-SG.js !0k_;ucޮ{чp100755 zh-Hans.js "(FJ."TO"r100755 zh-Hant-HK.js p7=F+Y8_[3|J100755 zh-Hant-MO.js X[i}E<DLC{100755 zh-Hant.js 	}L<K97100755 zh.js Cl7wv'q$OV100755 zu.js ?؛E&a`W>,y,dx& 100755 index.d.ts [yF NSejW0x& 100755 index.d.ts gz%WR>5HH#x2100755 LICENSE H)ecPۨ100755 README.md }Z7
A;g46100755 event-dispatch-contract.min.js x쥀諄07B'100755 event_dispatcher.d-K56StcHr.d.ts E.|?}40000 fesm2022 m|dOQ100755 index.d.ts "fMni럵F100755 navigation_types.d-fAxd92YV.d.ts F	
.z8kC100755 package.json |/<mG}3l
[40000 primitives 5)}ڹ b`I+40000 rxjs-interop A,czVkXN40000 schematics .`2K"`Nv4_u40000 testing b9{;/
, 100755 weak_ref.d-DWHPG08n.d.ts ~ANJ~g^EAJϧxx100755 core.mjs I@z1}JX100755 core.mjs.map 4@40000 primitives ,cXXr)sI3K100755 rxjs-interop.mjs IZ$O0݋I+t-2,100755 rxjs-interop.mjs.map lzSM1+DX100755 testing.mjs t!WX-$+/IےD]100755 testing.mjs.map [S6cdNg8Gl100755 untracked-BKcld_ew.mjs >YoRl7s100755 untracked-BKcld_ew.mjs.map MC\:ꋤcf~b9Θx 100755 di.mjs 8]~jtjb100755 di.mjs.map ~k116*5jJʐO100755 event-dispatch.mjs N>M7T2nJ100755 event-dispatch.mjs.map BcmoDF100755 signals.mjs 
ϳUW3ѝ&
Ci100755 signals.mjs.map !($/
hJ@/2cxh 40000 di .xk!Tv72e740000 event-dispatch F્UVHFye340000 signals 2zS%~yrek>,x& 100755 index.d.ts Ҕ|szQ`4x& 100755 index.d.ts aŁkVMB.y>U@x& 100755 index.d.ts (J|h"=/}DF0\Sx& 100755 index.d.ts w~!f%_s+4	x a40000 bundles 9X!bw[&U';K100755 collection.json &'pP~{eBΟ
100755 migrations.json 	@7?`Rj%40000 ng-generate ?y
&ρ9,,cHl<UxQ100755 apply_import_manager-DF0BUe6N.cjs ?xzrnC7,~100755 checker-BwV9MjSQ.cjs M8iR1,<r100755 cleanup-unused-imports.cjs N-s{]Fr100755 compiler_host-C55Cczah.cjs cfn\k^a@100755 control-flow-migration.cjs ͪQۧڙ_kI100755 explicit-standalone-flag.cjs n@% wTox{8qm100755 imports-CIX-JgAN.cjs n%ʫ!E{XM100755 index-B6p5mHIY.cjs 'uwDq`0i100755 index-BnJH1Hc7.cjs lb;T~J=Ü100755 inject-migration.cjs b㝙aћüUa100755 leading_space-D9nQ8UQC.cjs ?@CJC#100755 migrate_ts_type_references-DQe6JtwN.cjs ,{BV5+/l100755 ng_decorators-B5HCqr20.cjs M?Gz:jޡ~F}Sx	100755 nodes-B16H9JUd.cjs ]LwMowo}100755 output-migration.cjs 3Ƙ{"z+kR/iZj100755 pending-tasks.cjs g?pJYJMD4Y100755 project_paths-DY3SIODd.cjs  -i 4[100755 project_tsconfig_paths-CDVxT6Ov.cjs j|\pyʔA100755 property_name-BBwFuqMe.cjs ~KҊ]U'\100755 provide-initializer.cjs )ɷqz'Ci!100755 route-lazy-loading.cjs 0M$9xr100755 self-closing-tags-migration.cjs "|iD&	NCд\100755 signal-input-migration.cjs ޏӸښ}100755 signal-queries-migration.cjs Hv.q8*ՉX©100755 signals.cjs ߓ4s͇l*UpalXl100755 standalone-migration.cjs Sِc /(zG_{>pf0x/40000 cleanup-unused-imports ݕYqtJpf'_Z40000 control-flow-migration 鳞)D²tRy40000 inject-migration w3( fV{1e40000 output-migration MmAy1؞v40000 route-lazy-loading qsLvA͔gZG
40000 self-closing-tags-migration m}g	txf40000 signal-input-migration )ïØ#B"7$40000 signal-queries-migration SVmi(.U40000 signals B:0M`b40000 standalone-migration '(mpNTƠx' 100755 schema.json ,@DWՇ0z~x' 100755 schema.json 褝HPupOTTwt/x' 100755 schema.json ^sM9Up}x' 100755 schema.json mيm۳	x' 100755 schema.json YY|5}4(`f!Q<* x' 100755 schema.json ϐpURE)ϧx' 100755 schema.json N-uwcꃹnQx' 100755 schema.json 0P12?T?Hyzozx' 100755 schema.json ;rp0wќct{ۦOx' 100755 schema.json Nֹ3Ba4/Цx& 100755 index.d.ts X1*أǋ$ffWx" 40000 prismjs #k$㪳dx 100644 LICENSE z&{$Q{+%z100644 README.md Eu2CH100644 components.d.ts <RETpќ40000 components xX[_%͜BI100644 index.d.ts UfU9ꛐu100644 package.json 'ubf/3@3޶LO\ax& 100644 index.d.ts 03*CLDkuuR x8100644 CHANGELOG.md eo)Di)()b100644 LICENSE RI-/Ա۠t100644 README.md KH)YV:YUʶC가4100644 _headers ˕0ē0-}{==a4.100644 components.js o#;(ۦ2K&g100644 components.json SwxN͘z2440000 components )p "0~&
100644 dependencies.js 5@\ws#100644 package.json 
o+n&]!DZ40000 plugins :q[s&C/100644 prism.js i`ՈR@3<_40000 themes Pr@B%Oxh100644 index.js *4:Z100644 prism-abap.js ׈g)F,100644 prism-abap.min.js [:DS-U100644 prism-abnf.js Kʷ f"?h9w
100644 prism-abnf.min.js w1L14\ȳD100644 prism-actionscript.js r2@E+ 
]+100644 prism-actionscript.min.js 0OX7wY100644 prism-ada.js 7
s+b{j100644 prism-ada.min.js Wci
#|Ѥ8vV100644 prism-agda.js ѭVAP55'100644 prism-agda.min.js b#Ŭ~?]-u5100644 prism-al.js wCZYnM7[JZ>100644 prism-al.min.js QR0'*100644 prism-antlr4.js FmcGNCP3ک:100644 prism-antlr4.min.js 5-keκ100644 prism-apacheconf.js G8j]%O$'100644 prism-apacheconf.min.js J{
N b100644 prism-apex.js ۷iG7ovc100644 prism-apex.min.js <k
yƽx^D100644 prism-apl.js 7,@˝100644 prism-apl.min.js G7UdkxR100644 prism-applescript.js =hJ]}u;100644 prism-applescript.min.js Wc^&2@,l> .^100644 prism-aql.js B̩nO8xJcE100644 prism-aql.min.js YrQƔ)	h100644 prism-arduino.js  XIo VZ=100644 prism-arduino.min.js ,u#btg6ikd100644 prism-arff.js j6kU=:<AuqȻQ100644 prism-arff.min.js S>	׬e ¥!UH100644 prism-armasm.js 2!VqYa7]Vp100644 prism-armasm.min.js bI20ﶛ>100644 prism-arturo.js Л^'\ʦ(TSKq100644 prism-arturo.min.js {
kng&y,100644 prism-asciidoc.js 9unq+07U0{j#w100644 prism-asciidoc.min.js lLd`S\9{100644 prism-asm6502.js /X6O~FNtl1p100644 prism-asm6502.min.js %\8]qP}=8)100644 prism-asmatmel.js S.8S&arQ^E|100644 prism-asmatmel.min.js pdrH"3100644 prism-aspnet.js H[/QP׵uњ100644 prism-aspnet.min.js YߩI(WIF'W100644 prism-autohotkey.js hTlQK X~100644 prism-autohotkey.min.js yjO3 RN+υ[100644 prism-autoit.js evPO	"S.S100644 prism-autoit.min.js 2&$w<-ׅ100644 prism-avisynth.js $ 듽*{&4if|%100644 prism-avisynth.min.js tE}<3&wx100644 prism-avro-idl.js 58o-жjm=9q|So100644 prism-avro-idl.min.js 4#Q5ѐξMZ:{v100644 prism-awk.js d,  4
cA%*100644 prism-awk.min.js ĉ%ɉttx e)100644 prism-bash.js m.8µJ"~Z1100644 prism-bash.min.js e;5V =100644 prism-basic.js *.JM	Lˍ iMH100644 prism-basic.min.js 4ZgAl100644 prism-batch.js @W1H~4P"^100644 prism-batch.min.js oǢ!"aO^&_100644 prism-bbcode.js ^>-T6_9100644 prism-bbcode.min.js L05?	4 P%100644 prism-bbj.js @2CgA1W&Y100644 prism-bbj.min.js J9Vg)/ͽ100644 prism-bicep.js r jpf.,645@X100644 prism-bicep.min.js :{ZTɃU8}Fkm100644 prism-birb.js M]V $@Wtm100644 prism-birb.min.js y͛oujbK100644 prism-bison.js ֛fq\mܠqV[100644 prism-bison.min.js U5qx#2O`u100644 prism-bnf.js ߾9slL`HSR100644 prism-bnf.min.js 2JИV5ec r&/100644 prism-bqn.js [i̨'O;% 100644 prism-bqn.min.js :fUչԏUWx100644 prism-brainfuck.js ?Q4Yo100644 prism-brainfuck.min.js K<(cr100644 prism-brightscript.js ^UɟxԶ:100644 prism-brightscript.min.js 9
Uc'܊:<Fk@K100644 prism-bro.js w]X \Xr100644 prism-bro.min.js ~ےmx.݉Jw%100644 prism-bsl.js ,7&3Lmrꘛ\100644 prism-bsl.min.js LGLqkpde100644 prism-c.js XnTy3HG100644 prism-c.min.js }Mۧ*m}\<s100644 prism-cfscript.js t7)DK[Y!wq5P100644 prism-cfscript.min.js I-p@k{J100644 prism-chaiscript.js ˟cMÔ"100644 prism-chaiscript.min.js iM73d;100644 prism-cil.js `CkA5100644 prism-cil.min.js U{|tqz:S n100644 prism-cilkc.js |^28Ǻ_B`ダ100644 prism-cilkc.min.js !%uJ7vc100644 prism-cilkcpp.js vܰ>f^X100644 prism-cilkcpp.min.js _rjPڼ_v(z5100644 prism-clike.js ]kF c"-~100644 prism-clike.min.js zFduw),100644 prism-clojure.js VfQ7×!8$X100644 prism-clojure.min.js `}iL kcu<Ä100644 prism-cmake.js KqGf,cN<W(7100644 prism-cmake.min.js #WX$)fj100644 prism-cobol.js WgR(:u]<^100644 prism-cobol.min.js lh7Pнi=100644 prism-coffeescript.js rOL5N氟100644 prism-coffeescript.min.js 6Β5Vk100644 prism-concurnas.js GmI%4?hfS100644 prism-concurnas.min.js `)K{	 (";100644 prism-cooklang.js I`ď~[H@=100644 prism-cooklang.min.js oؿ$TNQU$ fT100644 prism-coq.js f>٥_ՈªFu100644 prism-coq.min.js O 'uě,100644 prism-core.js "up\z&100644 prism-core.min.js I
@xcj@8jT100644 prism-cpp.js ݜU CGl100644 prism-cpp.min.js 6L5ɥA100644 prism-crystal.js :;3#9PhW100644 prism-crystal.min.js \.YkJ[Ȳ	D@100644 prism-csharp.js $1q~N*
C	100644 prism-csharp.min.js Ekvm$_R100644 prism-cshtml.js FCq=[6`100644 prism-cshtml.min.js .Zs"Vf
w100644 prism-csp.js 0j{4T7@100644 prism-csp.min.js 23hנ_#s2100644 prism-css-extras.js ٣T+F0ly100644 prism-css-extras.min.js  Gi,7>}9\=100644 prism-css.js F<4ϰitr90Le100644 prism-css.min.js :b@p[C100644 prism-csv.js Qh<$G6Z(/v100644 prism-csv.min.js %iS<Al66,100644 prism-cue.js bF}o4N*100644 prism-cue.min.js QɈ<R 100644 prism-cypher.js YحFз눲-h<100644 prism-cypher.min.js 4a=.a'nA` 100644 prism-d.js /=,^Hu \mK100644 prism-d.min.js Jp8100644 prism-dart.js ^8!&1K{cb100644 prism-dart.min.js lu=5ٴp2>7ن100644 prism-dataweave.js R^Y\ۆ*_100644 prism-dataweave.min.js hgF`*r|100644 prism-dax.js _\']u}[100644 prism-dax.min.js 'a`y2e100644 prism-dhall.js if<YErC100644 prism-dhall.min.js a8͐يm8I|	fp100644 prism-diff.js iu;DSvlrLڷm100644 prism-diff.min.js 
_|S100644 prism-django.js PH	&1'=yT]o100644 prism-django.min.js $PDj0[4(f100644 prism-dns-zone-file.js -*ߢa;t100644 prism-dns-zone-file.min.js fhIbוvAvK100644 prism-docker.js ?:>.`"
P_B&C100644 prism-docker.min.js V"ph_KW h100644 prism-dot.js ;[QPI8.ū100644 prism-dot.min.js j$-4\J!hA#100644 prism-ebnf.js *C,쌰+Du100644 prism-ebnf.min.js 4W.:]Z}^100644 prism-editorconfig.js ){iԼ㼞i-(0100644 prism-editorconfig.min.js ٍh]aQpvd100644 prism-eiffel.js Ν.skWR!b%"100644 prism-eiffel.min.js Q<۹*DIpї-a100644 prism-ejs.js YF#Yq@-.Dp100644 prism-ejs.min.js ۫yfEn[?100644 prism-elixir.js #'@:SuN'100644 prism-elixir.min.js 腹4#BEf4fg100644 prism-elm.js \U	njEW'S/100644 prism-elm.min.js hYpse0O100644 prism-erb.js !|"ԡm>)100644 prism-erb.min.js K؛FJ+l 100644 prism-erlang.js ̹*Y-100644 prism-erlang.min.js mjÜf'100644 prism-etlua.js a+TYuFl%100644 prism-etlua.min.js CHEmLWk:100644 prism-excel-formula.js 走1Fێ(N100644 prism-excel-formula.min.js B-}r{d100644 prism-factor.js :s)JCm100644 prism-factor.min.js 79^Řid[100644 prism-false.js ICW9 WG_|100644 prism-false.min.js S=VF!Q<D;100644 prism-firestore-security-rules.js q,	ϒP咿ìE+100644 prism-firestore-security-rules.min.js ߝ?%B6ĭ^9Ȗ\:100644 prism-flow.js 2HXuLe]i6@zc?100644 prism-flow.min.js B9!'g 100644 prism-fortran.js m=Y.̮?LuMZ100644 prism-fortran.min.js iɻLq! t1d100644 prism-fsharp.js sjƳ -100644 prism-fsharp.min.js s^ (߭zdD0100644 prism-ftl.js 
ת;DqIӰ7~/100644 prism-ftl.min.js +*CH6"A	100644 prism-gap.js S|1U>	(aa100644 prism-gap.min.js e.uM|uic%V100644 prism-gcode.js ǘiN(M/J100644 prism-gcode.min.js TFMA%:ѯUa100644 prism-gdscript.js +AU$tQ100644 prism-gdscript.min.js 饢2|>}BJ[;V6100644 prism-gedcom.js gqDQH;1EL!100644 prism-gedcom.min.js oPl)}J100644 prism-gettext.js YHEq6'[`100644 prism-gettext.min.js BI!6=\.100644 prism-gherkin.js ,4\m1>!jz100644 prism-gherkin.min.js =rdw~[JS100644 prism-git.js 6Z\w֖2CSa100644 prism-git.min.js rf`aW#5-?T100644 prism-glsl.js yEsa'100644 prism-glsl.min.js e[
 M^'100644 prism-gml.js c<*VVص[100644 prism-gml.min.js Bu%˯;`y=)100644 prism-gn.js _?nmW6<ZK100644 prism-gn.min.js  2Ж 2100644 prism-go-module.js 'aAY7o;100644 prism-go-module.min.js 
	t!oЩ_(gl3e100644 prism-go.js bwg@5I.100644 prism-go.min.js iulDJ100644 prism-gradle.js di.DW
100644 prism-gradle.min.js Rٱ100644 prism-graphql.js N`j^#1SH9?100644 prism-graphql.min.js :Q3>ܿ#$100644 prism-groovy.js R8CTtϷ9100644 prism-groovy.min.js "BV{	uݯ100644 prism-haml.js 7`;eMuR+A100644 prism-haml.min.js {p".^c"v'100644 prism-handlebars.js \ǖ
ϵd6_t100644 prism-handlebars.min.js {cE7KogC4f100644 prism-haskell.js  p{!~X6ɱ
100644 prism-haskell.min.js GS~P44IBKW-100644 prism-haxe.js "rzX'Hy100644 prism-haxe.min.js d/px100644 prism-hcl.js Ff!gkFm@Qr100644 prism-hcl.min.js .Щޯ҇ag L$100644 prism-hlsl.js =фMHFy%xgtI100644 prism-hlsl.min.js 6Gxv[d)100644 prism-hoon.js WpʱMoHT#ں100644 prism-hoon.min.js HGrKnUͅ@100644 prism-hpkp.js [PdE?t`a100644 prism-hpkp.min.js P`1X:\OÀ100644 prism-hsts.js 'j7+CR3$$
{100644 prism-hsts.min.js ? +!+27[100644 prism-http.js Ny$E*)wi5	[100644 prism-http.min.js {qТ]:[kΛWi100644 prism-ichigojam.js -G_CPu6\100644 prism-ichigojam.min.js D]-6'oE:dX100644 prism-icon.js Jb	y
9b100644 prism-icon.min.js ɰ-G:0t100644 prism-icu-message-format.js /^mn^ r|$*~100644 prism-icu-message-format.min.js A&wѭ2cyyH100644 prism-idris.js 7:Z#NYjrt$100644 prism-idris.min.js ^+'6`Z1100644 prism-iecst.js >ʈSZ=g100644 prism-iecst.min.js '1UˍL7)100644 prism-ignore.js ,fP!:qT}-100644 prism-ignore.min.js jUHY`!wj100644 prism-inform7.js cץ=W鴰:100644 prism-inform7.min.js Uv100644 prism-ini.js J@J$%UdEA7f100644 prism-ini.min.js ~釽+NM#-w100644 prism-io.js ;,uG"ޞo100644 prism-io.min.js as.e,p100644 prism-j.js j+rϊSf013Zfbh100644 prism-j.min.js yKܖJ)ua100644 prism-java.js 1T#(=j100644 prism-java.min.js <z5^ޮjJv100644 prism-javadoc.js jy#T.^100644 prism-javadoc.min.js ?)S i&:{h100644 prism-javadoclike.js },JhH}rQM100644 prism-javadoclike.min.js Bԑ'tXLe 100644 prism-javascript.js ~larl͡'~r100644 prism-javascript.min.js "),As1*Mv9o100644 prism-javastacktrace.js ̦}[2֡,鲆100644 prism-javastacktrace.min.js YIƝӧg0^100644 prism-jexl.js bh**xODqHA100644 prism-jexl.min.js 7 >7.\\,_100644 prism-jolie.js kTdrzzٝ100644 prism-jolie.min.js ϥ;	$=K100644 prism-jq.js <0/2_Gωp100644 prism-jq.min.js }Pkau*2\100644 prism-js-extras.js dů|9#@^s100644 prism-js-extras.min.js 505rudy7100644 prism-js-templates.js blnbvr-
(100644 prism-js-templates.min.js v!Y^MX	@n100644 prism-jsdoc.js >S-#|p100644 prism-jsdoc.min.js s,9MC;EQv100644 prism-json.js QxG44100644 prism-json.min.js BV aYh#+100644 prism-json5.js m]~{`J|100644 prism-json5.min.js 5фb$'nv쨗100644 prism-jsonp.js l2$ؼ\7100644 prism-jsonp.min.js 꾶&ztrt100644 prism-jsstacktrace.js imF@(~]S100644 prism-jsstacktrace.min.js 2Vvr}G|~s100644 prism-jsx.js l-d$:)ȡY~jN100644 prism-jsx.min.js 6/RpOr&100644 prism-julia.js P,C1Gu]100644 prism-julia.min.js w$XE5!EYEG&100644 prism-keepalived.js pD(vc100644 prism-keepalived.min.js H)vKXq ),[100644 prism-keyman.js .;+#A1jP)100644 prism-keyman.min.js Ihӿ5APؤ100644 prism-kotlin.js ;EܿWv`r100644 prism-kotlin.min.js xq"Tun1U100644 prism-kumir.js gt gikU100644 prism-kumir.min.js :M;(0QzջC100644 prism-kusto.js ɼzL X]7g100644 prism-kusto.min.js xe<辻} L100644 prism-latex.js #aF˃Mt100644 prism-latex.min.js 8Psb6
I~6U100644 prism-latte.js ݇z##^wwtx100644 prism-latte.min.js =160h|OM 7100644 prism-less.js ~;81")100644 prism-less.min.js f}\wETNJ#100644 prism-lilypond.js ZL^DC'jkY4M100644 prism-lilypond.min.js [d-U4@G22100644 prism-linker-script.js zVהєy*kX100644 prism-linker-script.min.js CʴIlT 100644 prism-liquid.js 1t4iUK	t
100644 prism-liquid.min.js )YT&jQ
100644 prism-lisp.js 9/޲~ִޜ`-100644 prism-lisp.min.js fK7 gEVNx$100644 prism-livescript.js |f8	9SK
W100644 prism-livescript.min.js 9r4PW7 H100644 prism-llvm.js 竅\ѱNɃ100644 prism-llvm.min.js <|檯"n(r100644 prism-log.js MpW+r<]ɡ100644 prism-log.min.js ;uR0'WN5)`100644 prism-lolcode.js Gy
xeй%J100644 prism-lolcode.min.js =*jE4Qk&t100644 prism-lua.js j9	7100644 prism-lua.min.js ͔}Hw/T100644 prism-magma.js I,!c^W&100644 prism-magma.min.js wCma~0c#gx100644 prism-makefile.js d;UH!'X3b100644 prism-makefile.min.js Cx/B^Du3T׻100644 prism-markdown.js CYg~100644 prism-markdown.min.js +Q_ F]100644 prism-markup-templating.js (UYb/vU100644 prism-markup-templating.min.js :1_
;Y100644 prism-markup.js ebK55%˓)Y100644 prism-markup.min.js ӚB/ؔрO7|100644 prism-mata.js j8r<-ÅvjDC|100644 prism-mata.min.js 	
|gvbyN8-@\100644 prism-matlab.js ̥Yuy{u9
qknrq100644 prism-matlab.min.js ө=+100644 prism-maxscript.js 
+!5O\N(*	100644 prism-maxscript.min.js K5y^v	&[/q,100644 prism-mel.js Y&gERɳIL Q$ $100644 prism-mel.min.js h
TFA1100644 prism-mermaid.js IPW*N]$m:100644 prism-mermaid.min.js KCP)tGjy^100644 prism-metafont.js PK}ԪUVӠt&-100644 prism-metafont.min.js K˹7JJ+6100644 prism-mizar.js ES^=:%100644 prism-mizar.min.js 8);aܥè^4i100644 prism-mongodb.js N3zbj100644 prism-mongodb.min.js 	M@DnО100644 prism-monkey.js ŷ$wp#w100644 prism-monkey.min.js Y
PQɺWJ$3B100644 prism-moonscript.js #14%SO,|100644 prism-moonscript.min.js ?;Q׋l_%100644 prism-n1ql.js fAa{"ipb+100644 prism-n1ql.min.js $1Cb-<9~7100755 prism-n4js.js m?m4hJp100755 prism-n4js.min.js \ppyh100644 prism-nand2tetris-hdl.js )O)O'0dՈm8A100644 prism-nand2tetris-hdl.min.js ߽Gv M(Be100644 prism-naniscript.js ̎K-4l<}ޥGg100644 prism-naniscript.min.js ]rWК{PǗ100644 prism-nasm.js Fq9b~Кv,⻯K100644 prism-nasm.min.js 닭dww׌ g100644 prism-neon.js }IEVٕLFM100644 prism-neon.min.js [hWԞ100644 prism-nevod.js |L'H^100644 prism-nevod.min.js Me'y|Cb<Y100644 prism-nginx.js -}03Cux/(p100644 prism-nginx.min.js +eY 󸸒2nzX6100644 prism-nim.js Sܖ
xn100644 prism-nim.min.js 9+Վ>Al}100644 prism-nix.js jv i%E|Y100644 prism-nix.min.js \vxm};v100644 prism-nsis.js uZ0b8ͻg100644 prism-nsis.min.js q
l;~i	>\100644 prism-objectivec.js 5InME100644 prism-objectivec.min.js )sLq6<100644 prism-ocaml.js /;Y?)q"ٷFI100644 prism-ocaml.min.js ǲ֓w!9}6U100644 prism-odin.js 9 u5X,"!?100644 prism-odin.min.js Zp_?hHݒq2100644 prism-opencl.js ޅo0o
mm100644 prism-opencl.min.js LCi/!Svgw߼100644 prism-openqasm.js &PP,}E100644 prism-openqasm.min.js EÞܚ`)=b100644 prism-oz.js %͈ 䁲l100644 prism-oz.min.js E&*yi).~`~100644 prism-parigp.js IEGx:;dnz100644 prism-parigp.min.js nO~HFvC7100644 prism-parser.js wq:ډE/6ʡ@*Tl100644 prism-parser.min.js z¥W0cEUe100644 prism-pascal.js /\53'p100644 prism-pascal.min.js ?!i?Jޜ\|100644 prism-pascaligo.js ~{%EIГE100644 prism-pascaligo.min.js 4yG🆿100644 prism-pcaxis.js Z a"e?Sy>}100644 prism-pcaxis.min.js Nohc
Eo3\uZ100644 prism-peoplecode.js A!bE3P<>K100644 prism-peoplecode.min.js 'SOR100644 prism-perl.js fA	3+Lp9W100644 prism-perl.min.js qzت_100644 prism-php-extras.js *b
TWkE{V6S100644 prism-php-extras.min.js Pj,!׭וhv)@100644 prism-php.js yڳ_R,~jyQ3B100644 prism-php.min.js JBpP{ng100644 prism-phpdoc.js wڪFyr^	ƋP100644 prism-phpdoc.min.js k {q1$0)w100644 prism-plant-uml.js p#EV߸^БZ100644 prism-plant-uml.min.js ^6w*$Y(100644 prism-plsql.js {܅ŏ-3-E100644 prism-plsql.min.js hVUˣH03i100644 prism-powerquery.js Q"fj4nE100644 prism-powerquery.min.js }w0Y}S6K100644 prism-powershell.js S&.7w4fA:100644 prism-powershell.min.js D.pA0w<100644 prism-processing.js nfos^u100644 prism-processing.min.js l׫ VDKUF3100644 prism-prolog.js 	B;D6N.6100644 prism-prolog.min.js S/hA%)BՊ100644 prism-promql.js /snzvIX9E{g̨100644 prism-promql.min.js F%<2cehل&l-100644 prism-properties.js O+ۛĠ6i100644 prism-properties.min.js YvvV!B100644 prism-protobuf.js WMaFaŐ$100644 prism-protobuf.min.js ǟF2}=~+0
100644 prism-psl.js zO6۴,qW\Жc100644 prism-psl.min.js (d횆w'EH70100644 prism-pug.js 
^}ə:m-α100644 prism-pug.min.js &R&_)Qr9100644 prism-puppet.js Ϳ/Zn!H100644 prism-puppet.min.js k5B>OϽmk5ӑe100644 prism-pure.js :fAsX=F+G}100644 prism-pure.min.js ܅"ݘn!g4100644 prism-purebasic.js -IF?7.MAxp0_i100644 prism-purebasic.min.js ˟igB<ar]*100644 prism-purescript.js lt~o:Qu100644 prism-purescript.min.js j3:REip~%j100644 prism-python.js ]gB	cN;'u/:100644 prism-python.min.js +oofyԿ:F100644 prism-q.js SI8r|SYc100644 prism-q.min.js [AȢ'-䁈q˰1100644 prism-qml.js ඗Ne/ai5S100644 prism-qml.min.js qfTbT=100644 prism-qore.js ֑dAoo2kz9f100644 prism-qore.min.js 8yuDZ@ҥ-100644 prism-qsharp.js Up^ϱnH100644 prism-qsharp.min.js ?Y{ٲquC;4l~ȉ100644 prism-r.js P*dⲺގ100644 prism-r.min.js GQ;S{9L(!ǬuRB100644 prism-racket.js 4xGz_R-u100644 prism-racket.min.js _<D9PDޕj)N_H100644 prism-reason.js t[:{~<9100644 prism-reason.min.js t_XcV5)3[ja100644 prism-regex.js e4M)6'VG100644 prism-regex.min.js N
_C21sw100644 prism-rego.js p N3e#aR0*ws?%100644 prism-rego.min.js q.*PK100644 prism-renpy.js yDjd^vRV100644 prism-renpy.min.js Vq>vZ	|100644 prism-rescript.js }dKގZ18100644 prism-rescript.min.js ] foC ų#>ӁYe100644 prism-rest.js O?l1:ĺ@NR&100644 prism-rest.min.js (ѿClH֮9$LC«100644 prism-rip.js WK-#Z/d100644 prism-rip.min.js B_vt~oբF100644 prism-roboconf.js X)GQ_M100644 prism-roboconf.min.js -
I`:r6* 100644 prism-robotframework.js 4Ru+yY唁.100644 prism-robotframework.min.js 9QO8j]100644 prism-ruby.js y%mϊKcQ9 #a݁100644 prism-ruby.min.js |[*`0T9ȉ100644 prism-rust.js 3`6|V4ʕqV100644 prism-rust.min.js |t/	B	T4">100644 prism-sas.js o7̀6}7N90100644 prism-sas.min.js ÛɝPPm100644 prism-sass.js KlJ =cl4g8D100644 prism-sass.min.js oJmαAI	}x100644 prism-scala.js /.kPO?aClYR100644 prism-scala.min.js V  :g>*qi100644 prism-scheme.js $	/g(7100644 prism-scheme.min.js *E=S)b5nw$NE100644 prism-scss.js 'aqqO.wj100644 prism-scss.min.js aivQrX%3+ H100644 prism-shell-session.js gv}Q:GnO100644 prism-shell-session.min.js G=ܒI.x.T100644 prism-smali.js =~aZ@<)*#f100644 prism-smali.min.js wkz℟2OE100644 prism-smalltalk.js .vR$b0;^2~o'|Fd100644 prism-smalltalk.min.js 2eK],ߴS@100644 prism-smarty.js =M>+i6100644 prism-smarty.min.js 9wDfz~iaߛo100644 prism-sml.js }<	rN39ĄRMF100644 prism-sml.min.js aRߝqs.2OV100644 prism-solidity.js s"  a100644 prism-solidity.min.js OA<<
}~	100644 prism-solution-file.js xe_Gk100644 prism-solution-file.min.js 1UG
{n8o100644 prism-soy.js TLa?;j%7u0x100644 prism-soy.min.js ݀q	nĄ[>}U100644 prism-sparql.js 7OL@/
100644 prism-sparql.min.js Z|kd*m)OjD100644 prism-splunk-spl.js ^/^(5%G100644 prism-splunk-spl.min.js $m7#:e100644 prism-sqf.js X=#/r9A8R100644 prism-sqf.min.js 1ڋm^3Y100644 prism-sql.js D#]5100644 prism-sql.min.js %kOb˿&<6G%i-!
p100644 prism-squirrel.js c<]/	ZK6a;"100644 prism-squirrel.min.js _eC7؞VJ>!vj100644 prism-stan.js ʲݠ#~o*	100644 prism-stan.min.js ]#`MN5	ÝY"100644 prism-stata.js WleP;Zv0100644 prism-stata.min.js ̿ KJh* PYp100644 prism-stylus.js >qFK㥖h^q100644 prism-stylus.min.js h-(TBPZ=*R100644 prism-supercollider.js AwZzS#100644 prism-supercollider.min.js R7gp^=a>
100644 prism-swift.js /nn_CLE}͔jʟL100644 prism-swift.min.js F7{+Vq+,100644 prism-systemd.js @ MEP.Qk100644 prism-systemd.min.js %g/ܑl@d/P_100644 prism-t4-cs.js Ῐc&,nLcxK100644 prism-t4-cs.min.js 'nhv/100644 prism-t4-templating.js n&䁫100644 prism-t4-templating.min.js 6[I!3|kNj%100644 prism-t4-vb.js uqcΔIS.a]6100644 prism-t4-vb.min.js #ݭQVG{M100644 prism-tap.js {%S`k100644 prism-tap.min.js eX[5ן&ckG100644 prism-tcl.js 50XҹPd100644 prism-tcl.min.js '1:100644 prism-textile.js Wihw#;~100644 prism-textile.min.js ^eH.* 艙M100644 prism-toml.js ^fgJN8R2h~<100644 prism-toml.min.js |޳ <brQz8100644 prism-tremor.js -*v0QObT,v=N	D100644 prism-tremor.min.js |Hڳυ"b$100644 prism-tsx.js 3n=,\?100644 prism-tsx.min.js X+P6
	100644 prism-tt2.js ~}V`ؔ5fe100644 prism-tt2.min.js Md{I	k)&coTfB100644 prism-turtle.js 5~2)zŊJ86>100644 prism-turtle.min.js WmEjHywp A,m100644 prism-twig.js YD-DTMtqs 1100644 prism-twig.min.js ZdRPw	a8Q3&n100644 prism-typescript.js Cq:7zˤq#_*Ls?100644 prism-typescript.min.js aq&Vmn30#>100644 prism-typoscript.js Anݳ]{uˡ~#100644 prism-typoscript.min.js ;_⺝100644 prism-unrealscript.js 7w]-9}e/&rR3100644 prism-unrealscript.min.js =
]a8100644 prism-uorazor.js xnY'lkv95YK100644 prism-uorazor.min.js |}$w_rIDߓ{100644 prism-uri.js X1;/MQ9100644 prism-uri.min.js G+3b۷1Ki100644 prism-v.js o= kC4+100644 prism-v.min.js ZJVIK(:^Q100644 prism-vala.js eY#R
0F=X100644 prism-vala.min.js ku:U,F.0100644 prism-vbnet.js ༑@E'WR,100644 prism-vbnet.min.js M	;!100644 prism-velocity.js $/ʯ?"+100644 prism-velocity.min.js VaQ2"S+100644 prism-verilog.js Qv,beȦ
100644 prism-verilog.min.js (R
Ō%MWȯE9100644 prism-vhdl.js t&,'N9f100644 prism-vhdl.min.js g=G]Y3h)100644 prism-vim.js p7QYEm0_tny100644 prism-vim.min.js e&;pee[100644 prism-visual-basic.js 
+o4N_:$@100644 prism-visual-basic.min.js ыoRWUU4&~100644 prism-warpscript.js D?I돩100644 prism-warpscript.min.js lJmtP3)z8100644 prism-wasm.js Gw=ݤV5E100644 prism-wasm.min.js *_GjhD+100644 prism-web-idl.js Ȓ-F^_ 3100644 prism-web-idl.min.js .Ǜs ,100644 prism-wgsl.js hqЫیE{100644 prism-wgsl.min.js ӷn(MvZ100644 prism-wiki.js rˁ	p5Hw$(100644 prism-wiki.min.js AvM3[!o100644 prism-wolfram.js  ˎlo<:ݹ100644 prism-wolfram.min.js Wۑ*I
VPN.100644 prism-wren.js <e4`B-*Bݒ*&EB100644 prism-wren.min.js n'`?kiGUT100644 prism-xeora.js 3x*#|НӧN100644 prism-xeora.min.js $BLU,̵b%Pc100644 prism-xml-doc.js 4F,Xh}@.S5100644 prism-xml-doc.min.js NxzpwA6100644 prism-xojo.js HEl	</100644 prism-xojo.min.js Z[xȮnvxoA100644 prism-xquery.js 2Z^ue
mEĐv100644 prism-xquery.min.js ɐEpc`oC100644 prism-yaml.js c9IL100644 prism-yaml.min.js \m=¸fňu100644 prism-yang.js tҦ<|Q0#gq100644 prism-yang.min.js ϫ@P*}N4100644 prism-zig.js O5:5.z+100644 prism-zig.min.js &1kFJeMRx[^)$".Ax40000 autolinker O7_וvq40000 autoloader k?;K'>40000 command-line 1"~xv;6K40000 copy-to-clipboard <bjv&J]40000 custom-class +~vEN*ׂпok%40000 data-uri-highlight ws9$'|Y=O40000 diff-highlight LؼЛ*.>h40000 download-button 7l>$VhImX40000 file-highlight Co	&$ s40000 filter-highlight-all vCⓠK1T3>+40000 highlight-keywords wxv4K1
40000 inline-color )Ht},_JͅVt140000 jsonp-highlight F} USFEY{40000 keep-markup p`rde ,ZEC]A40000 line-highlight 'Q'^ D40000 line-numbers }k399jyw"40000 match-braces ߑ83]@qs.<40000 normalize-whitespace `.i
	,xd2?j40000 previewers  yP D6 $f"440000 remove-initial-line-feed *XޔLJq3g40000 show-invisibles `m5	,wC340000 show-language FT n40000 toolbar  ]}ŹžEc	(40000 treeview A`_qy7&gC=w40000 unescaped-markup U
JרIM40000 wpd uԞRQ2evx 9100644 prism-autolinker.css c	$R1®S100644 prism-autolinker.js S.*ܓS+<@N.xRs100644 prism-autolinker.min.css <T8xx<	1(L}ܪ100644 prism-autolinker.min.js Dy@*K\5^"(ϯ#kMqxb 100644 prism-autoloader.js (ؙtoe}%l100644 prism-autoloader.min.js -ŒXhf_&z'x 1100644 prism-command-line.css j<=L/w;Px100644 prism-command-line.js 85PP9Z"$$n100644 prism-command-line.min.css }ŕh3Bjڽ2ʟkz(100644 prism-command-line.min.js m_۪4wK!JѯCNؠxp 100644 prism-copy-to-clipboard.js vx~X첖&100644 prism-copy-to-clipboard.min.js yΜO	مێpS{
-xf 100644 prism-custom-class.js ܤ.٤$e]="100644 prism-custom-class.min.js ϵa]*>퍒3^)עxr 100644 prism-data-uri-highlight.js K:4S;}j100644 prism-data-uri-highlight.min.js mlQJzڟE,x )100644 prism-diff-highlight.css +y.|C0100644 prism-diff-highlight.js {??ˉ}{{&xL100644 prism-diff-highlight.min.css ju(pqBSa~s100644 prism-diff-highlight.min.js 8{A;a
+ڱWxl 100644 prism-download-button.js [9Zt-E7100644 prism-download-button.min.js ]`LL'b}ځl/U*Oxj 100644 prism-file-highlight.js G៮]Mc,<100644 prism-file-highlight.min.js YJsзi쫩_x+xv 100644 prism-filter-highlight-all.js hOCT4p` d'0100644 prism-filter-highlight-all.min.js (-FNf~;__p*xr 100644 prism-highlight-keywords.js R?d''Mru100644 prism-highlight-keywords.min.js  =91TIͿ.
x 1100644 prism-inline-color.css 7Fq8!|100644 prism-inline-color.js n{ڧs
RBGq100644 prism-inline-color.min.css aE5=4100644 prism-inline-color.min.js 13(]5TTtf Sxl 100644 prism-jsonp-highlight.js (T?=׈EQZx"ED& 100644 prism-jsonp-highlight.min.js '4>?~aC.V%Hxd 100644 prism-keep-markup.js :A(:Z<roc100644 prism-keep-markup.min.js v$b _IYe(x )100644 prism-line-highlight.css GȚ(BtRؓwdyC100644 prism-line-highlight.js yEK&ʹ,scm&4ۥj100644 prism-line-highlight.min.css lw#ЩU>=5k100644 prism-line-highlight.min.js eCi,8GH0{f*Qٮx 1100644 prism-line-numbers.css WpSW|gM3Y03@D100644 prism-line-numbers.js q趖:0I#~100644 prism-line-numbers.min.css pFpZɤye>@100644 prism-line-numbers.min.js vN[ˎ<mҌT%x 1100644 prism-match-braces.css B~;Rv100644 prism-match-braces.js G4OQ2DIw^100644 prism-match-braces.min.css 6{kZPZ8'6100644 prism-match-braces.min.js ,%vAQbRgOxv 100644 prism-normalize-whitespace.js Mț-*91j8!@HġAg100644 prism-normalize-whitespace.min.js V&A*GO:(*ڻ+ܦx 9100644 prism-previewers.css -^pk;92)QCF100644 prism-previewers.js s)d}5~،k0,100644 prism-previewers.min.css eyycG [R100644 prism-previewers.min.js [ao	+[|xZPXx~ 100644 prism-remove-initial-line-feed.js KhP]qOLı100644 prism-remove-initial-line-feed.min.js SQ97G4x %100644 prism-show-invisibles.css k9)c:ʽI}6<4100644 prism-show-invisibles.js aMqXN100644 prism-show-invisibles.min.css +>ɅEK>100644 prism-show-invisibles.min.js b̔{4Nx{Ud'KVnxh 100644 prism-show-language.js o(+rQWL?100644 prism-show-language.min.js /s	Bs5Ag(<V3̩&x E100644 prism-toolbar.css YgjL@_-<Ox^100644 prism-toolbar.js ur+:&N100644 prism-toolbar.min.css )W@)ҔlAt100644 prism-toolbar.min.js TO|Ʌ-Nڠ3%JVx A100644 prism-treeview.css eSO:zy(100644 prism-treeview.js Vh2
_Ȁ,͢ s100644 prism-treeview.min.css Vr]gi>H>(U2100644 prism-treeview.min.js E
?3?ULѮx !100644 prism-unescaped-markup.css ;ݲ[vxǑ100644 prism-unescaped-markup.js KXޫ~l100644 prism-unescaped-markup.min.css ŽPgd^100644 prism-unescaped-markup.min.js Bd퓚\?1Mܚ]s
x U100644 prism-wpd.css CZ	| 5100644 prism-wpd.js hrcF$>e100644 prism-wpd.min.css Ca-Og100644 prism-wpd.min.js ȋe5&LRwYv0YDz.x100644 prism-coy.css 9g!IfU?Q4
100644 prism-coy.min.css bI^VMCB	4"ګ100644 prism-dark.css >cHDJ/o100644 prism-dark.min.css 咵ieZ!f100644 prism-funky.css !\nS<&b100644 prism-funky.min.css .gAWl,-100644 prism-okaidia.css EFiw100644 prism-okaidia.min.css A2qIɞ êU100644 prism-solarizedlight.css eX`荧;100644 prism-solarizedlight.min.css ϞU])5D?f100644 prism-tomorrow.css 
8I=Ɣ bB100644 prism-tomorrow.min.css U +QL/vr100644 prism-twilight.css cLk a,,(?100644 prism-twilight.min.css 嘾eg֐d/vg4lR100644 prism.css [2#t[$kZMg5100644 prism.min.css LWk;ʫN1MtҨ|%xE100644 CHANGELOG.md h*Y"$4+100644 CODE_OF_CONDUCT.md  6<!/? 100644 LICENSE.txt vԭl\(-Q#100644 README.md us_
cl6aK40000 ajax (U>$40000 fetch GXͻ}o"4{\t40000 operators 2@6FIzY[100644 package.json w>W!	h40000 src t 8eޗ}H40000 testing G*wvA0fQg100644 tsconfig.json (HK\]38#U+S40000 webSocket L&W:6¨x( 100644 package.json 
y7Q!#x( 100644 package.json /5T TEr!"\^x( 100644 package.json 0'6$/b؇AҨ)xg100644 Rx.global.js V4PX(\q40000 ajax 1VdB40000 fetch ۊ dp5r
Շ6100644 index.ts 4ha֠Ep^Q;40000 internal Si=y6@n?г!40000 operators IgN5Kѝ^d1W-u40000 testing XKPE(!~100644 tsconfig.base.json [!)W#100644 tsconfig.cjs.json Kd"``N*ˊ100644 tsconfig.cjs.spec.json v`v}Ptu'100644 tsconfig.esm.json E«W=ZM}100644 tsconfig.esm5.json O:sU#TK {6100644 tsconfig.esm5.rollup.json أ&0eO'o͇_100644 tsconfig.types.json fIm1S-:s`D100644 tsconfig.types.spec.json wf-3JXة#9me_40000 webSocket vF]Cd,wҸ93x$ 100644 index.ts k]:UWe-W v4x$ 100644 index.ts 'I^{<h=x*100644 AnyCatcher.ts 枾^X ]e100644 AsyncSubject.ts 8eT>.*w 100644 BehaviorSubject.ts e@>r*,=100644 Notification.ts 4LI9ktcs100644 NotificationFactories.ts ] X	Wl-:y100644 Observable.ts -&Mid׉7yp100644 Operator.ts {
^<ZOj100644 ReplaySubject.ts g9K|]=<oCFE100644 Scheduler.ts =keUV j		$100644 Subject.ts a&vX]w#p8TJ100644 Subscriber.ts JpC|F^K100644 Subscription.ts 8BQXc40000 ajax uiaKwgk100644 config.ts FN
)r.
4${u100644 firstValueFrom.ts /ļC>]
p2100644 lastValueFrom.ts >R|S2F״X40000 observable x?C!7@$&40000 operators Izh_c40000 scheduled ۛ}TcF.040000 scheduler DJ>
7Rqo()m40000 symbol om긙<4rS/DM40000 testing `A!GBp0$100644 types.ts .:V:?Lf.`Vr	100644 umd.ts WB|<340000 util "Zs	)3e&	x ;100644 AjaxResponse.ts ʑ[Ꟊ_he100644 ajax.ts bx1&8Bv100644 errors.ts 612mC(~v(#100644 getXHRResponse.ts 4I3v}100644 types.ts 	Fd#S@MxLx5100644 ConnectableObservable.ts v :IF議K100644 bindCallback.ts W@+#L#V6W100644 bindCallbackInternals.ts J@	r m`lY*100644 bindNodeCallback.ts r%PD7j=Q9!100644 combineLatest.ts Do
  $/j100644 concat.ts 8$E5YF7100644 connectable.ts F	$^C-%zfbyQbߚ100644 defer.ts +ې׽^F'40000 dom 8ŚmurD;"h8100644 empty.ts YZHF|{*N100644 forkJoin.ts AaÉC_hc6!100644 from.ts B-,Nua=100644 fromEvent.ts Cs+lyQG100644 fromEventPattern.ts npbM+%Q3g100644 fromSubscribable.ts [l/@%5aig100644 generate.ts r밣e-< jl|gL100644 iif.ts E}T=z 100644 innerFrom.ts Å,h.U⡆100644 interval.ts 	$`N.Zosi100644 merge.ts ފ?>GP{&2`100644 never.ts ϾޔF[q_`
/R100644 of.ts 5{xz۪ qK:H100644 onErrorResumeNext.ts >ͯ(Zo100644 pairs.ts M
*Ԉt	100644 partition.ts 4&wY뚍J100644 race.ts rUPf߿i?100644 range.ts ,)q8@>100644 throwError.ts X|ج/ DX100644 timer.ts tX2/vҰ@؁@b100644 using.ts [+jƶbf*E3100644 zip.ts ҭj¿\,Ɗ}/
x V100644 WebSocketSubject.ts ^>$ۣoh100644 animationFrames.ts 88Q)e[$oxN]100644 fetch.ts GuXgO*;]9100644 webSocket.ts ]WNtshYVRDXxJ100644 OperatorSubscriber.ts Y;{kBOdgN100644 audit.ts b|^QHLľ100644 auditTime.ts ¾+a[cK100644 buffer.ts ,љMhnOa}T100644 bufferCount.ts 81U100644 bufferTime.ts C6i=F}) 100644 bufferToggle.ts 9`t(D87100644 bufferWhen.ts d@ 񥋌 9l0ٔbTջ100644 catchError.ts /M8z2L100644 combineAll.ts AW)uJi3	q100644 combineLatest.ts ?:cy탎;MG100644 combineLatestAll.ts CObcQ7.*nNH100644 combineLatestWith.ts b!<@
يlNY"100644 concat.ts YX7ӫ2yĸ100644 concatAll.ts OAּ1ezE}e100644 concatMap.ts mq=;U100644 concatMapTo.ts  Yw͚i6100644 concatWith.ts 6"Grz\cu100644 connect.ts Jk<L  5(7Nq7100644 count.ts vO2S|u;xW8w 100644 debounce.ts DU$L04nsOl100644 debounceTime.ts 	&4AB4>&100644 defaultIfEmpty.ts '~'w84LaȧD100644 delay.ts Gi9wߓ۰Qmc100644 delayWhen.ts UP{51ؠ<PD6|100644 dematerialize.ts :N@<2$O)100644 distinct.ts p,#Z[
V A<>100644 distinctUntilChanged.ts ]+e4=9100644 distinctUntilKeyChanged.ts Y63`ղ100644 elementAt.ts GKP'Q 100644 endWith.ts Cn[0aѣՋp100644 every.ts kh8r100644 exhaust.ts A8K$[1YoS100644 exhaustAll.ts JX^$|.^<A$100644 exhaustMap.ts fh0!f_-_(100644 expand.ts H7=<GڵNm~-100644 filter.ts ;^^@ϒ}100644 finalize.ts ;I	2x100644 find.ts R>gÓեK100644 findIndex.ts uttō6	Տ100644 first.ts 3zͽ.h100644 flatMap.ts yvKRR΅ݟj100644 groupBy.ts *0Kw׉I_100644 ignoreElements.ts ԗzȗh (}I,100644 isEmpty.ts ]޹&~ f100644 joinAllInternals.ts tnxz5t7gV>m100644 last.ts i2eYЍG100644 map.ts sPCO&*100644 mapTo.ts ?!STE100644 materialize.ts _b"rdȏƣ100644 max.ts /]]D܌]100644 merge.ts s6Amo* 100644 mergeAll.ts QtP*c\b100644 mergeInternals.ts ڳ?n˼!100644 mergeMap.ts [i߰Fk@100644 mergeMapTo.ts eFVɜ!;ϛ?N>100644 mergeScan.ts  F100644 mergeWith.ts &fGFLp,)100644 min.ts AМ!\`sHiЅ100644 multicast.ts N=/Cҙ(ɀEd:  *100644 observeOn.ts 7vk- H100644 onErrorResumeNextWith.ts UTh#"ا\$:g100644 pairwise.ts d	Clb5"100644 partition.ts )TsXN'sw100644 pluck.ts ;kB5oW6q100644 publish.ts jBpVKmYK'3`b100644 publishBehavior.ts EKؽTb
100644 publishLast.ts #zDϩSs100644 publishReplay.ts GIN*f$%aO{t100644 race.ts ͔7`<MGY100644 raceWith.ts nr.ski100644 reduce.ts ^eо oGG_100644 refCount.ts ,p0X
{aC{e100644 repeat.ts !OK1"100644 repeatWhen.ts @;,lN":Z!)N100644 retry.ts ۵C,.'1^100644 retryWhen.ts e9Y͹R IHC100644 sample.ts /Mn=#n:100644 sampleTime.ts xVHdqC 100644 scan.ts 0i\W"m-t	}?100644 scanInternals.ts 鈈nܐ$:V100644 sequenceEqual.ts b_絋`100644 share.ts ')]ЈWʂF100644 shareReplay.ts ?6>\XRNl100644 single.ts YWl`cyM100644 skip.ts BJQxӒ%wTZT100644 skipLast.ts [Yl2b	tȊԓ100644 skipUntil.ts NQRe(100644 skipWhile.ts 7FK6100644 startWith.ts ݵ+EߘVKS9}100644 subscribeOn.ts $U&=lxQ|100644 switchAll.ts i˳2+sTL)100644 switchMap.ts {xI[@֪[a100644 switchMapTo.ts H90Ny3100644 switchScan.ts **px%RD*[*100644 take.ts NxԀ_>i100644 takeLast.ts -pb2"n7 c100644 takeUntil.ts qAV<M\&4B100644 takeWhile.ts 4n9^l{#100644 tap.ts bC]8yҧfUEmz100644 throttle.ts SEZEv=%u100644 throttleTime.ts 2_dM(BtkX0100644 throwIfEmpty.ts vIz"/v~`i(ӫ100644 timeInterval.ts jX"	֝X	G)'100644 timeout.ts c^on_(Y#A100644 timeoutWith.ts M~+Wӵ$:7j6100644 timestamp.ts 8ZI؀
o100644 toArray.ts &xG$Jv;,~AO100644 window.ts %.i}\𫆃100644 windowCount.ts $|%yNbB100644 windowTime.ts FVwcxQg=o100644 windowToggle.ts {_ir$eH{6100644 windowWhen.ts 1^uKT100644 withLatestFrom.ts lVVjdt=100644 zip.ts ^2=j100644 zipAll.ts i|QU­!|4-100644 zipWith.ts "y8,)ٲF}FxPxO100644 scheduleArray.ts ꏢB ̻yl100644 scheduleAsyncIterable.ts ڠ4fnZP5BBn^6100644 scheduleIterable.ts Yϯ'X1'<
p Q100644 scheduleObservable.ts );P2?Ҧsw}q\1E100644 schedulePromise.ts !u9W/RG100644 scheduleReadableStreamLike.ts B"X/a<lnOm100644 scheduled.ts .BWNXgF@mxV1;xH100644 Action.ts CaDKJkO100644 AnimationFrameAction.ts P+)ٲLK1a100644 AnimationFrameScheduler.ts !d׼2s-a100644 AsapAction.ts g~#19$H100644 AsapScheduler.ts K.?qh
100644 AsyncAction.ts pKWGYM=L100644 AsyncScheduler.ts ^.7jeYp)}y100644 QueueAction.ts V!ogNw100644 QueueScheduler.ts ڳ]@Ml'G100644 VirtualTimeScheduler.ts p!gF@ˠo<D100644 animationFrame.ts ,3C5yZԍ犲 E100644 animationFrameProvider.ts a kt@½3AkFEk 100644 asap.ts [N
8qQ6g100644 async.ts v܆ދgox100644 dateTimestampProvider.ts 9ЪY-~{v",	100644 immediateProvider.ts 2й
bۏP100644 intervalProvider.ts #ւ`I#\?<,100644 performanceTimestampProvider.ts >qC>?HG100644 queue.ts N!b͏-pkdaLbK100644 timeoutProvider.ts  ^cZqI}E1100644 timerHandle.ts 	Dؽߘg1"ɰ}xP 100644 iterator.ts u	s-
nO100644 observable.ts 3$\\p<z8PJM_x100644 ColdObservable.ts @
ujP%100644 HotObservable.ts QH &jSͻrxd0100644 SubscriptionLog.ts 6zm'Dl6I6Ш!zE100644 SubscriptionLoggable.ts A~d>S%lwA100644 TestMessage.ts Gw[6g9~4|100644 TestScheduler.ts  Eg@PH@eh;mwl bx"100644 ArgumentOutOfRangeError.ts iKɉ3100644 EmptyError.ts ,^1Y& |:D100644 Immediate.ts Tj/Zn+100644 NotFoundError.ts :S^:Z53;~100644 ObjectUnsubscribedError.ts ^?[%4)6100644 SequenceError.ts H=Z-(*@&f5_3100644 UnsubscriptionError.ts }	)oeM6]rr100644 applyMixins.ts |B2gmCt8a,ăձ100644 args.ts -*46kq֪100644 argsArgArrayOrObject.ts H;mJ2+b	's0100644 argsOrArgArray.ts 	ldлn-w2!]&100644 arrRemove.ts QlتRWıkWKnN100644 createErrorClass.ts T8Xd!Ó{z%100644 createObject.ts y/')yet100644 errorContext.ts lOsibfrދ100644 executeSchedule.ts ˙ -@3ԔR100644 identity.ts ~9!ofIUx100644 isArrayLike.ts ocMMaX~ @ 100644 isAsyncIterable.ts 7T_zB100644 isDate.ts 	MTKm\Ig0100644 isFunction.ts 'u(u,ʬHiD100644 isInteropObservable.ts 	BgF{Ǆ`3100644 isIterable.ts I+<>1lӑ`vf100644 isObservable.ts ("1b-NR100644 isPromise.ts Jn"I|!\w100644 isReadableStreamLike.ts Zԉy~dZ100644 isScheduler.ts ʴܣ$E\"ݼ100644 lift.ts A:GBqP100644 mapOneOrManyArgs.ts Bnvf*"100644 noop.ts  #!K!~100644 not.ts ^]~-;ً!-w<100644 pipe.ts iς/_Dio⠇U100644 reportUnhandledError.ts ٖc*MUj,B100644 subscribeToArray.ts )B6Ud#}+100644 throwUnobservableError.ts j^<c(8 bWq100644 workarounds.ts  S84Kxx$ 100644 index.ts [}<3䩚fbSFx$ 100644 index.ts aQ:HN݅Wx$ 100644 index.ts =y*go
KCJ&׎؉x( 100644 package.json ܋qwi=1!gx( 100644 package.json k{a^27x(100644 CopyrightNotice.txt BT#irV5DwlΡ 100644 LICENSE.txt C?4텝܎100644 README.md )<Ʋ6H5t100644 SECURITY.md F?ӫS*40000 modules 
ݙ4zUp[100644 package.json WWf[#IO4100644 tslib.d.ts =YnLϏe9100644 tslib.es6.html "4$V0SP*100644 tslib.es6.js l9AI#100644 tslib.es6.mjs y:b7ʮq100644 tslib.html DɺQTzѷ$Op:Q100644 tslib.js ^ۊȜ[1֫qӤW-xr 100644 index.d.ts 2DU
۝bg100644 index.js aOٛ0*ઊ	100644 package.json KEe(г=X/-xK100755 CHANGELOG.md (t:_kpЌc!=74100755 LICENSE H)ecPۨ100755 LICENSE.wrapped 8YA~ynXTDE_#6I100755 README.md iAZ E{t40000 bundles =B5M9=p40000 fesm2015 ށަ,E]qFcR~40000 lib uzЋ/"[pċWs100755 package.json SL||z)nl100755 zone.d.ts y9=qTvh*Ԣx100755 async-test.umd.js @V,Ά"a.L100755 async-test.umd.min.js M
l	:q3<lq100755 fake-async-test.umd.js Dusۧ1e100755 fake-async-test.umd.min.js cqG:s/Sڶ100755 jasmine-patch.umd.js &YJ=d<Ix5100755 jasmine-patch.umd.min.js J*=lM]100755 long-stack-trace-zone.umd.js b>bὒ53M100755 long-stack-trace-zone.umd.min.js y_R;.Z100755 mocha-patch.umd.js vGqllàȔ100755 mocha-patch.umd.min.js kcb@YB0R[=L100755 proxy.umd.js Qʲ\SK-]9b100755 proxy.umd.min.js H~_6<FEi100755 sync-test.umd.js `"So}k100755 sync-test.umd.min.js 閄)Hڊ.	>#Դ100755 task-tracking.umd.js cGՔ:2Pju100755 task-tracking.umd.min.js M	ŘMx$bƺ4100755 webapis-media-query.umd.js 5w|/2ȸh!|Ngy100755 webapis-media-query.umd.min.js {_+NAAZ1100755 webapis-notification.umd.js |Mv>	4B100755 webapis-notification.umd.min.js  
.r>׳H)h100755 webapis-rtc-peer-connection.umd.js @!@TAh100755 webapis-rtc-peer-connection.umd.min.js ޅB@}91i100755 webapis-shadydom.umd.js @}r 
b100755 webapis-shadydom.umd.min.js xWvÈs˾<a100755 wtf.umd.js $drr100755 wtf.umd.min.js }WY^"wՇF}100755 zone-bluebird.umd.js r#N`ST7 100755 zone-bluebird.umd.min.js ^rk#mrBe8u100755 zone-error.umd.js }{ω38Nèm?So
100755 zone-error.umd.min.js [iODs,$璷100755 zone-legacy.umd.js =ۮ}sl100755 zone-legacy.umd.min.js sD:hMJnY7l*100755 zone-mix.umd.js qծCÍTx)[,WN100755 zone-mix.umd.min.js rW'#+#100755 zone-node.umd.js jIꔣg
o@؀{100755 zone-node.umd.min.js E^(UXAyJ100755 zone-patch-canvas.umd.js /ڹ<GPd100755 zone-patch-canvas.umd.min.js Fy ]~o6?100755 zone-patch-cordova.umd.js V')q7h:!100755 zone-patch-cordova.umd.min.js { ;܆8' 100755 zone-patch-electron.umd.js lf⑄Q_fx .^100755 zone-patch-electron.umd.min.js ]6kݸ#Cm100755 zone-patch-fetch.umd.js h
k"dO100755 zone-patch-fetch.umd.min.js LA)bH-E8a^?f100755 zone-patch-jsonp.umd.js ^#Q{DW|H7 100755 zone-patch-jsonp.umd.min.js RC3:Ta[}100755 zone-patch-message-port.umd.js cV@dVZ8$100755 zone-patch-message-port.umd.min.js 8{i_100755 zone-patch-promise-test.umd.js OGm{eVZXDy100755 zone-patch-promise-test.umd.min.js RW= #<=>adZ100755 zone-patch-resize-observer.umd.js j$7!s:ܱH툮N100755 zone-patch-resize-observer.umd.min.js 	Q&(]7*100755 zone-patch-rxjs-fake-async.umd.js Qʲ\SK-]9b100755 zone-patch-rxjs-fake-async.umd.min.js H~_6<FEi100755 zone-patch-rxjs.umd.js D$:E5f100755 zone-patch-rxjs.umd.min.js "-.`	U100755 zone-patch-socket-io.umd.js ƞ-IMHaR^jl100755 zone-patch-socket-io.umd.min.js MzZ)O9<+fx100755 zone-patch-user-media.umd.js xq\Nxw^%:X100755 zone-patch-user-media.umd.min.js "LOe8[ՖB9100755 zone-testing.umd.js ;i A&ĉ	2100755 zone-testing.umd.min.js xY^91z",100755 zone.umd.js e^k@؃ C100755 zone.umd.min.js 3lٷ+a܃ ^(
!\-kx100755 async-test.js 5L#T~ :u100755 async-test.min.js 1vG(zH54100755 fake-async-test.js Y6}e}X {[100755 fake-async-test.min.js /|+B
7{100755 jasmine-patch.js Bl)銜n-=hZ100755 jasmine-patch.min.js isVg	e6P><:100755 long-stack-trace-zone.js /=JBaG_=P!100755 long-stack-trace-zone.min.js ;<'.H`100755 mocha-patch.js ;֍z/GHuX100755 mocha-patch.min.js <H"P#100755 proxy.js 4XHcUDbX100755 proxy.min.js <\&eѯ\100755 sync-test.js ^vԘ&ir9(J6ę100755 sync-test.min.js 7{g`^Ep-xac100755 task-tracking.js b^kV=GJ&100755 task-tracking.min.js L79x(DzN100755 webapis-media-query.js 'Mwh~|,<j 100755 webapis-media-query.min.js G̿N?@u#B؁100755 webapis-notification.js #Gk;JLeu100755 webapis-notification.min.js zUXikJ3U100755 webapis-rtc-peer-connection.js ճm׹"	/A(=+100755 webapis-rtc-peer-connection.min.js oɤ;O>66100755 webapis-shadydom.js 4Pܔ&+t=Z100755 webapis-shadydom.min.js 	:bI7iˉ100755 wtf.js DY"21. M%Z100755 wtf.min.js k/e.V4	p7100755 zone-bluebird.js pwQ8ù8(.100755 zone-bluebird.min.js 8Nv_y%>(+o100755 zone-error.js =8Qt=sl̙100755 zone-error.min.js N杯XBm100755 zone-legacy.js DLT}[|-ױf100755 zone-legacy.min.js vPgOzT.]T9c100755 zone-mix.js q]t;.,}100755 zone-mix.min.js G(xC +g[N100755 zone-node.js 5YDMgW6GDY100755 zone-node.min.js 4*u^䘧,tr100755 zone-patch-canvas.js ZtC[D~[<F100755 zone-patch-canvas.min.js cQ{A!&#]H100755 zone-patch-cordova.js #]K$}t>7:MVg100755 zone-patch-cordova.min.js OPc^G;zӉy100755 zone-patch-electron.js "rs5ؑ}¨
100755 zone-patch-electron.min.js 4	Qe
TO0n$100755 zone-patch-fetch.js +,4^l\6x` )100755 zone-patch-fetch.min.js olY\L:.;V[100755 zone-patch-jsonp.js )Ty'I100755 zone-patch-jsonp.min.js ]aQD^:%100755 zone-patch-message-port.js >i@]o100755 zone-patch-message-port.min.js VV{T? ]100755 zone-patch-promise-test.js xq %@7NݵE100755 zone-patch-promise-test.min.js ٧2F+l*X2p100755 zone-patch-resize-observer.js 9#=>S7Ac100755 zone-patch-resize-observer.min.js M+,O0Z100755 zone-patch-rxjs-fake-async.js 4XHcUDbX100755 zone-patch-rxjs-fake-async.min.js <\&eѯ\100755 zone-patch-rxjs.js Wsusu@i{Z\.E100755 zone-patch-rxjs.min.js Xbɥ}Z+100755 zone-patch-socket-io.js ~0:2Òk~+j100755 zone-patch-socket-io.min.js Z<}aR'Йgq4(100755 zone-patch-user-media.js swc֌j_LU100755 zone-patch-user-media.min.js Ѕb͞d100755 zone-testing.js }wN}]Fk͙Ɇ\100755 zone-testing.min.js WwF*nW2100755 zone.js ' Ts?W`<100755 zone.min.js RwaH& Nx D100755 zone-impl.d.ts 2KU0R(ް100755 zone.api.extensions.d.ts x\KValUJ9100755 zone.configurations.api.d.ts 1b-~A>NR8100755 zone.d.ts m=;3[,g+ ̺Ix4 100644 copy-button.directive.ts b9eK:
87~~~txe 100644 syntax-highlighter.service.ts pENhpaPR?5t100644 theme.service.ts Α.^&ưD%Q%xG 40000 lib h<Sfd*	!W100644 public-api.ts .T~2J
L[VxY100644 filtering.ts niX"Я100644 pagination.ts aJ^!m100644 sorting.ts Se>4$7Oa100644 transformation.ts )+
Ii>x{%LD100644 types.ts {ߐ2jMl`3y100644 ui-data-utils.component.spec.ts (CALyYԡz)OA<100644 ui-data-utils.component.ts vz-YAezit100644 ui-data-utils.service.spec.ts K=Fk&Y^8100644 ui-data-utils.service.ts l^s4oV|/DCx31 $ie:uhܥ'8u𠡁BAiRNfnbA^I1CTuN隊"QGE0S\RZozA3~RҿW;  T(7xW 40000 font-awesome  622VG100644 shared-ui.service.ts tpw]#;/}3T,!>xV 100644 font-awesome.config.ts L37UF[
wdYo100644 index.ts mYHW(]&* x *40000 base r<ifsZ`C#b;T40000 commons ѴT2"h-a}\h40000 fontfaces Tu'-hQөW#100644 index.scss oָ"YvPN2V40000 semantic y}zϦjoӫ100644 tokens.scss vguF)Qi HZP[#x>100644 _ai.scss e$,%= >EEtR~O$100644 _borders.scss .aIl&9`y100644 _breakpoints.scss I.3"U3-100644 _colors.scss 8NK<gګeN100644 _css-variables.scss u.*j` 9O߄100644 _glass.scss +fg*>MF@9100644 _motion.scss YY7©ffX=100644 _opacity.scss E;k(&8(100644 _shadows.scss >U8w͈^nR100644 _sizing.scss hYǘ^8#MI100644 _spacing.scss \@=7P6/s100644 _typography.scss ^˰ʶ
Rky:100644 _z-index.scss ú340󹡫*Z100644 index.scss $ro,%s@H,f x $100644 _index.scss B`VH=40000 components  TEb;]G˙M100644 index.scss B`VH=40000 layouts e$%䒡1IvV40000 patterns 48BfB`40000 utilities mxVvK`{;bj,|IH\tx100644 _base-buttons.scss sw~XFn"8ω/100644 _base-cards.scss OhڇƑZA,$100644 _base-forms.scss ȹv~6Yx2'OB$ay100644 _base-navigation.scss OW7ie#/Lc̿100644 _index.scss  ӥ5]{_X˳'100644 _utility-components.scss 舢QDjr/}CoxO100644 _content-containers.scss H!^krz100644 _dashboard-layouts.scss BB$100644 _grid-systems.scss @ (1?Ei100644 _index.scss ;w'JX@@`x100644 _layout-system.scss R\*r}4x[100644 _page-templates.scss nƚZ:қUsxw`100644 _responsive-layouts.scss ݖmA)zqΠx ?100644 _content-patterns.scss K1)bw~8C3]n100644 _index.scss Vq7nJ )Q}:Z100644 _interaction-patterns.scss 2ދ
<gۻ
]W(100644 _layout-patterns.scss RrFVH[x 100644 _display-utilities.scss ,9dA100644 _index.scss ;xjr6{-A100644 _layout-utilities.scss xID%q100644 _scrollbar-utilities.scss kMW<Rk'kc100644 _spacing-utilities.scss n;NАۏ6EQ^gW#]xu100644 _aileron.scss r]!"e
.lCs@5100644 _alegreya.scss Y`6!w
lZS100644 _all-fontfaces.scss \Dzj7100644 _amarante.scss ٙUM/QO8V.|100644 _architectsdaughter.scss /PBFp0ڍܲ100644 _archivo.scss `hM)\LWq8100644 _archivonarrow.scss 	r?xP|100644 _averiaseriflibre.scss eXܖv!tc100644 _bebasneue.scss 2-̴`@N0^100644 _blinker.scss ͲnSur100644 _bonheurroyale.scss 1ʍR^Mjf+_M100644 _bonveno.scss x	e̎%rO<:0100644 _cabin.scss ~]&#-eIoۭ100644 _cinzel.scss {1qelZ^v=100644 _comfortaa.scss WEBu&ryhEΔq100644 _commissioner.scss jrK8Ykk100644 _cooperhewitt.scss qt~F8O2μ9100644 _crimson-text.scss ?*n	Ѡ100644 _dancingscript.scss Qf)#100644 _dellarespira.scss  ~4h{qk100644 _dmsans.scss 윁յ+NLC100644 _ebgaramond.scss `$=ĳ/{Ih0100644 _epilogue.scss 篈No7al100644 _exo2.scss bbOy@ET .Z|UI100644 _figtree.scss J] *@k100644 _fraunces.scss y.mhHg@su100644 _geist.scss oI5p>0100644 _glassantiqua.scss rRPslC3_100644 _iceland.scss <
_L1kÍȥ100644 _inter.scss =@>jBz4100644 _josefin_sans.scss 8Z	}@ֆYp100644 _juliussansone.scss s`%#fڪ(m^Ԧ'100644 _karla.scss Ҹ;Ʈg| 100644 _kollektif.scss $Fe6ٷ$Wt100644 _lato.scss ({IUJP100644 _leaguespartan.scss BT}:gb/DC100644 _lexend.scss g\1eXc@100644 _librebaskerville.scss 'Qw%'\r^il100644 _limelight.scss ӆ5Hd6	F.100644 _lora.scss %yWtV\5Y*@100644 _manrope.scss ]50a100644 _merriweather.scss qαꈠUc7%\	100644 _metropolis.scss AW,jA?C100644 _monasans.scss /4}U?}b}'[(100644 _montserrat.scss ,*	C uw;!100644 _nacelle.scss Ix_Iv2`?cv`100644 _norwester.scss `k;L4100644 _notosans.scss oZCFǁy+100644 _nunito.scss  ~נ:33lRS9100644 _opensans.scss 93G_1-j^~@̉D100644 _oswald.scss o@	(*uUH100644 _outfit.scss ?1sclʫ8wUO100644 _overused.scss v=]WבU"ޯ#100644 _playfair_display.scss \4Jpʫq(100644 _plusjakatasans.scss eW6M4Q100644 _poppins.scss T6~nVflIdP5100644 _questrial.scss veċr9ˌ|100644 _quicksand.scss  FM*0=}!xq100644 _raleway.scss Q-DCNvYl100644 _roboto.scss vSX:KO2100644 _robotocondensed.scss S[Y}s(100644 _robotomono.scss o_Tx5Js100644 _robotoslab.scss F9LTwa%KY100644 _rubik.scss 3JWgEJl(,n100644 _sacramento.scss c@02qZ,r100644 _satoshi.scss 'Q݇!s100644 _sifonn.scss Zx7sDَ [100644 _sixcaps.scss @@qaB100644 _sora.scss )OpU<2054100644 _sourcesanspro.scss _E*lUͧW100644 _sourceserifpro.scss Bӻj\z	z100644 _spacegrotesk.scss h[Kv|Q5Ef,100644 _spacemono.scss -Ln呇(x1100644 _unbounded.scss U;d#}-h100644 _urbanist.scss ?#T5~t|цhb.)o100644 _vesperlibre.scss h6{XC/(E100644 _vollkorn.scss >cT-OZǶ_c6~er100644 _whisper.scss 鑂CTKUH;100644 _worksans.scss 67`(zj[1C100644 _zillaslab.scss `g8vmg-mkxx40000 borders -H]B 40000 colors f´w6EZ(
u40000 glass Y*ɘFJY100644 index.scss rA zIqJt40000 motion ?1fs6V~].40000 opacity ]iUkGJڠ40000 shadows 5夅wgvfݝ40000 sizing Z	p|Hnk*40000 spacing v{۰Z><:f;40000 typography qȅQNXRp40000 z-index c,%!Ob#ixY 100644 _index.scss Lghܭj8[/:w100644 _semantic-borders.scss }00{r$L-"x y100644 _index.scss {E)&>~.N100644 _semantic-colors.scss n>*W ԇ100644 _state-colors.scss g,8uv3o{Q@P4Mx 100644 _glass-borders.scss e[ئ;p<100644 _glass-mixins.scss "#D<~%^}`N L100644 _glass-surfaces.scss Q3ҥj=vvlgwKc100644 _glass-utilities.scss ;R}n100644 _index.scss MȢ[G%&_JxX 100644 _index.scss _TcGJư08O100644 _semantic-motion.scss )zA;i"|,#0xY 100644 _index.scss :g6Z8+iOz'100644 _semantic-opacity.scss q2QՇiB6]u"xY 100644 _index.scss !l1kp'@100644 _semantic-shadows.scss 1@{#:%2*e"xX 100644 _index.scss .< g~[Vec100644 _semantic-sizing.scss m%(AWc`i2!xY 100644 _index.scss _me 4JC!G[+=2<i100644 _semantic-spacing.scss tq1eD!ìx\ 100644 _index.scss I#64,*5y<Q100644 _semantic-typography.scss )FͧzI1^TAh"+xY 100644 _index.scss ;lEEq6*100644 _semantic-z-index.scss %n坓W: @ƥl"xd 100644 index.ts &/WgaP^100644 loading-state-container.component.ts LCy<AՉzB*xG 40000 lib \ya`\^|100644 public-api.ts o,WzP=QQxK40000 presets y/p,+ftd40000 services &4ԋnxpP040000 types py|l$byp#100644 ui-font-manager.component.spec.ts 3݂\KH!V8100644 ui-font-manager.component.ts PQP
jyNY:100644 ui-font-manager.service.spec.ts ܻŭ]ЁB6/100644 ui-font-manager.service.ts  h;q5jTH2;xd 100644 font-preset-manager.ts 4Y}j++100644 google-fonts-preset.ts >dRj~efsT*:&
x _100644 font-loading-state.service.ts kxDunj>4100644 font-theme.service.ts |ywcg,x7Jڟ?}100644 font-transition.service.ts r@.i7*WtNY׾h>Fx) 100644 font-types.ts ~)B `yZ9xJ100644 content.interfaces.ts "?U2.SݼO)F100644 conversion.interfaces.ts )(i=p7ILf100644 feature.interfaces.ts PSw|%Sh1100644 hero.interfaces.ts H&MIDib@{QK100644 index.ts ǎƥr~JTB100644 navigation.interfaces.ts b/^ec"+{&u100644 shared.interfaces.ts 
ܓ3LI;DM100644 social-proof.interfaces.ts ХiNpFw100644 templates.interfaces.ts /ݢ	az\]W8x340031Q(N-)K/ON*c>WaB*cG⽜ R!x31 ҒԼy	'V{q>8ZktMRRsuK3uS
3s]։I_6Y)!3stKJS2BBm*ݗ6V$Qʶ3 3RStKK2fko_SlCLLNZYRɰOnwj$sg&?PXW"b-R^/.)19;(4/}kj=M7dk;v<5+LOIM,.Id*VҶggU]]]kWXe|iZ.83=O$5	#R*<-lQARfZ:eb +6lJtsSN:wq٪|4W{2'1/%3/] At㣟+ʕ״>h 2­x340031QrutuMaPI>ڬ cFGՏ!B]C=]*ž=2_\9v2/] 19;1=U/8?AI&-N]') U.xPpm%ӂwwYi"xB p$-+o+8jFMPSJ2r2 V*$,~OF{)$nĦ(?c5nMj]zắu&CT[w$S @w^ ~	x31 Ҥd|
1{D"esL
*s1uROۻ140031Q()NKLK,(*cx.㞥sNgAW\\Qh;Sn{W1M {?x100644 app.component.spec.ts G^Mjkb c100644 app.component.ts iACesꎏo	6100644 app.config.ts lϧB;1100644 app.routes.ts 9:5ˡFs7{ū40000 demos `.N"Gq2qQ40000 features 护K,o 0wz#40000 shared ϩô$Zta|sPnxp 100644 accordion-demo.component.scss ,үP.rA6+8};100644 accordion-demo.component.ts NweܞoHR,xh 100644 alert-demo.component.scss Q,&)X=1Z100644 alert-demo.component.ts mq4b "6`Jr&,xv 100644 aspect-ratio-demo.component.scss ,^N'+ @100644 aspect-ratio-demo.component.ts l,A5ϱ#x /4xv 100644 autocomplete-demo.component.scss H1M+p9100644 autocomplete-demo.component.ts )ϼĒv{c1Nxn 100644 backdrop-demo.component.scss a2@hCuC(100644 backdrop-demo.component.ts ux9՞o1qSM},xt 100644 backgrounds-demo.component.scss rD&#VwJI100644 backgrounds-demo.component.ts o g߾m/"X-xr 100644 bento-grid-demo.component.scss y,f-?0100644 bento-grid-demo.component.ts i8aɨ'KP+xd 100644 box-demo.component.scss C(/!־P~#100644 box-demo.component.ts k%_@/KY_0'x y100644 breakpoint-container-demo.component.scss U@sk)ЬFĿ]100644 breakpoint-container-demo.component.ts >T=~u׸p7:xj 100644 center-demo.component.scss 穖"->~X100644 center-demo.component.ts ]C/"U*Ӧxv 100644 color-picker-demo.component.scss N!nJ9V50ȸo 100644 color-picker-demo.component.ts dhjG;+t/-Jxp 100644 container-demo.component.scss oie:/ԑfg=%100644 container-demo.component.ts c<Iq@㖰yذ~$/Axr 100644 conversion-demo.component.scss NCޱ}}B>`en"_100644 conversion-demo.component.ts 9ψ@E*^z.xj 100644 drawer-demo.component.scss 	uOKa`Li4100644 drawer-demo.component.ts %B_Ӛs QB^x+*
xt 100644 empty-state-demo.component.scss txQv5}LMpCB100644 empty-state-demo.component.ts pisH{Z5
;0	xn 100644 fab-menu-demo.component.scss 4^Pz8}100644 fab-menu-demo.component.ts E¹ZX.,.U@L&+xt 100644 feed-layout-demo.component.scss -=G#8{J\~-1100644 feed-layout-demo.component.ts cW'P3IwC~+Bxt 100644 file-upload-demo.component.scss xsUb100644 file-upload-demo.component.ts !!y \\UE.bxf 100644 flex-demo.component.scss .$^ÇZ銮JQR100644 flex-demo.component.ts 1S)A^`tb(¤xt 100644 fontawesome-demo.component.scss 7WQ)3!100644 fontawesome-demo.component.ts td+A{O㭺VD08xr 100644 form-field-demo.component.scss tkP	yը1r100644 form-field-demo.component.ts 6ӏnXGEʔ[.xv 100644 gallery-grid-demo.component.scss hanek֝ChO8100644 gallery-grid-demo.component.ts ~h:pl-|L/nxt 100644 grid-system-demo.component.scss E&pcW!S
m _v100644 grid-system-demo.component.ts ==TXPˎ-S,%xv 100644 kanban-board-demo.component.scss L*Ȓ@4	@2L100644 kanban-board-demo.component.ts Gv_J-13WUA-٦x y100644 landing-feature-grid-demo.component.scss xV5HyJɔ100644 landing-feature-grid-demo.component.ts .p"lzxT"c5ʢx }100644 landing-logo-cloud-demo.component.scss xV5HyJɔ100644 landing-logo-cloud-demo.component.ts KHwY1fW@y4x }100644 landing-statistics-demo.component.scss xV5HyJɔ100644 landing-statistics-demo.component.ts 'Ӆu$tH5Px y100644 landing-testimonials-demo.component.scss xV5HyJɔ100644 landing-testimonials-demo.component.ts b͆!}U#uπ 8x }100644 list-detail-layout-demo.component.scss ^A=+
'1!100644 list-detail-layout-demo.component.ts KJVm+0c3xf 100644 menu-demo.component.scss IQi}L/m	Ҿkz100644 menu-demo.component.ts Aʿݪo2<x*)xh 100644 modal-demo.component.scss osMp}kk100644 modal-demo.component.ts ̯J
Y9(xl 100644 popover-demo.component.scss [a;`z3100644 popover-demo.component.ts @#"?6xh	dɴor+Cxv 100644 range-slider-demo.component.scss sLU]^p !)T100644 range-slider-demo.component.ts N+_"4ztj+xl 100644 section-demo.component.scss ^f6.uR&A100644 section-demo.component.ts 
OJ\ւUoyP;+xz 100644 sidebar-layout-demo.component.scss <;i`BՑ]100644 sidebar-layout-demo.component.ts ˷kB&Mݜ^OF2xn 100644 snackbar-demo.component.scss #ycw%5_100644 snackbar-demo.component.ts f-L@As35YA$,Ъxj 100644 spacer-demo.component.scss =]h$hZ1[NHmƏQ100644 spacer-demo.component.ts }sgVSG\A.)7xv 100644 split-button-demo.component.scss o_c{ '919穫eh6100644 split-button-demo.component.ts &+3OmM,/5xr 100644 split-view-demo.component.scss Q|<P	ns100644 split-view-demo.component.ts 	- /U3RJec05K)Ixh 100644 stack-demo.component.scss vc{Ge_A5zE100644 stack-demo.component.ts HbRNe83h}Rs-(xl 100644 stepper-demo.component.scss qp	bLnZ5Ok100644 stepper-demo.component.ts q@՗:/~_*x u100644 supporting-pane-layout-demo.component.scss ڊLY2u:100644 supporting-pane-layout-demo.component.ts ~o,̣hfoHnDz7>xn 100644 timeline-demo.component.scss 9Zߨ<bZ/#100644 timeline-demo.component.ts b=j	M$#X[X!(Sxh 100644 toast-demo.component.scss E9+j.4ASj100644 toast-demo.component.ts ܎}مuX ,Oxl 100644 tooltip-demo.component.scss 
9~{D2$<U\X100644 tooltip-demo.component.ts K#X9nw.(ΛY9T)#xx 100644 transfer-list-demo.component.scss ax静݇?JƟ100644 transfer-list-demo.component.ts {ܜDJg2	Y27xp 100644 tree-view-demo.component.scss J6Jܳ}$r+aT100644 tree-view-demo.component.ts fc?Y˱~)*W+Tx$ 40000 dashboard A
"/dEDL%_SD7xO 100644 _variables.scss )F|:!H3Y5/40000 overrides n&v_VMIdnނ­ -x#100644 README.md *"~*6b100644 ng-package.json >;=NI$Ōw100644 package.json 8vΌ*Yigh440000 src ɱ0D5،4Vc100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+Iux#100644 README.md +vQĠU*=8100644 ng-package.json 2|ynq:Ѭщ100644 package.json 8oY6W$AQ&40000 src 뢩ņ̖p)V y100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+|[x#100644 README.md ,ϻv>?Ց
g100644 ng-package.json w0(wLC<J100644 package.json ;Xv(0/G 40000 src VXT'i9100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+wx#100644 README.md ptr\_]%mx100644 ng-package.json ѫYh2ͼ100644 package.json 'xxi-σ8[40000 src "H*U4Ok'100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+xx#100644 README.md H&D5 ɐz100644 ng-package.json 1U`JU{100644 package.json 85H1MYx'w}40000 src Zȸ5(@0,֥100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+^yuxG 40000 lib E@|wkJbF,100644 public-api.ts ׽iG?N{Hxr 40000 code-block  c{`UNe40000 code-snippet qO,6_=s%^40000 inline-code 
n
5v*T~n,xh 100644 code-block.component.scss om:}:Yr\O~100644 code-block.component.ts vbh2ԡ}
&*xl 100644 code-snippet.component.scss h|9zͳo]U
100644 code-snippet.component.ts ʞTFuωx>/تxj 100644 inline-code.component.scss @DRoƾ3Bpmv100644 inline-code.component.ts *RXY[S![w+3x#100644 README.md &r<I%Bb100644 ng-package.json ~R%yR)oC{<100644 package.json WlC==V3zK40000 src X搂*(g4A100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+)xux340031QrutuMa2X4[Rc?<O4(K-HLNLO*cȯ>神WF|YP(4hyuݳRS7 BqQ29'l_ާarIB)%yiz9I+#LFnǦ(?c5nMj]zắu&CT]Wn=͵Wx&'[ -vZx340031QrutuMaQytcʚK.-75(K-HLNLO*cxT#ZGt6E]靾d7H|9[~:(%3D7;\ZScǎtRRR9rڽˤ_om4>ܱzlS :&Z]GqAj2D[?|֓\ymr]m U3w x31 $g	TuYPWD4)'3Y7 S!2d 3[Wl WcxG 40000 components |'لvBd	(.40000 layouts >r Fy p$Y@mx40000 buttons 3)#G?%$S40000 data-display "G"؅lleQ40000 feedback ˒.!]$G{=a40000 forms Oӆ^8pPX40000 layout pFH>z5	\s*40000 media ?ۼ} Sz40000 navigation x7V8s40000 overlays 	X-bt!Dpx w100644 fab-menu.component.scss bTđcATS9100644 fab-menu.component.ts v~F|&<t100644 index.ts oW.iDIXe\g7x u100644 accordion.component.scss =>ln*o>100644 accordion.component.ts r1Xn&Zu!100644 index.ts sû)Z=5x w100644 carousel.component.scss \~4"J*r~100644 carousel.component.ts P"aFrL|k100644 index.ts z=83u4Lڹog6x y100644 index.ts {<̎ib~100644 tooltip.component.scss jhfU5FOwg^f100644 tooltip.component.ts b=3O+{A:x u100644 index.ts >ggطwt kQ;100644 tree-view.component.scss }NYhA1EǚXJ100644 tree-view.component.ts vZG}qtװ`&8e6x w100644 index.ts -%yǔ<*Ԗs$100644 snackbar.component.scss pV߿*>6VfHln\100644 snackbar.component.ts ܇ZBk
dDaaw14x }100644 index.ts ڴ{̡HB7(100644 toast.component.scss =U-6v)-100644 toast.component.ts I.'<dX3!x40000 autocomplete  P_\xكIw40000 checkbox +6AD]doz!40000 color-picker J^E"ItqԘdKEb40000 date-picker xfl
/*ڥC	@z40000 file-upload m7]q5:cx*Q40000 form-field &i{n2[qh100644 index.ts +\khf~GΥ!Zm40000 input IIerFkKk<V240000 radio w֓sTk_#40000 range-slider #gu{k\?LQ:40000 search -u'{1AB<>]-k40000 select {_Xds38QN"40000 switch Hy0$=4?40000 tag-input tFՉUпM40000 time-picker 7	TS˿1D',2x` 100644 select.component.scss "ݮ<= o100644 select.component.ts 4lǸ]L(x {100644 index.ts BD%c'L{}}E+100644 switch.component.scss ;)Zwe`'HGm
܆100644 switch.component.ts ˾@ST7lKeG3x u100644 index.ts $#8"o ay100644 tag-input.component.scss T$h+31vՆj"g)100644 tag-input.component.ts i FIFQ(4z	x o100644 aspect-ratio.component.scss 4Ї]st V"*W100644 aspect-ratio.component.ts ^Ѯ<Hx@Q+V100644 index.ts 58.=ÄYyqA;8x~ 100644 box.component.scss эÁ^旐n	100644 box.component.ts md'V&@ءKMT100644 index.ts A1%V4eX3Co33x {100644 center.component.scss r.5djq
100644 center.component.ts '^P,6Gb}]f100644 index.ts K% f,5Nx {100644 column.component.scss xYs-aR)l{100644 column.component.ts @vs;(Zz4Pz100644 index.ts !ⶓ%t8~PV3	x i100644 dashboard-shell.component.scss 7iu$AԦH!"Oy֜W100644 dashboard-shell.component.ts p-:!p/Đ|V"u100644 index.ts RV{]M!(}9x 100644 flex.component.scss 8mLn0, :H3100644 flex.component.ts ts5&%
2 z100644 index.ts %OFSLJ:c1k	x o100644 gallery-grid.component.scss :%f 2`EMM100644 gallery-grid.component.ts 쬴]$L!]3fC100644 index.ts yqgnYFr%5	x k100644 grid-container.component.scss z(ߣ3	v<100644 grid-container.component.ts m>/p~׆u;100644 index.ts wF3pYnFVI=>x {100644 hstack.component.scss JY܎RHSf100644 hstack.component.ts z-z9&m7@100644 index.ts 4P+*2ئ$Y~N4
x U100644 index.ts ԋ:J(f?;'100644 infinite-scroll-container.component.scss X5O	[d>'׮jU100644 infinite-scroll-container.component.ts !Ҁk_X,ƬΧWbBD	x o100644 index.ts /bnޮgUYS?100644 kanban-board.component.scss N_h?X^MEGoI100644 kanban-board.component.ts .&@O䁍8z:F	x c100644 index.ts o7xdMĻi/100644 list-detail-layout.component.scss ы9gX<1UǪ100644 list-detail-layout.component.ts DKw{4XÒL;"lN/=x y100644 index.ts |o=[:=SzRpp100644 masonry.component.scss &!e["횂;Sv100644 masonry.component.ts Y<g"h`c1A5ax y100644 index.ts H|r(Q.hU100644 section.component.scss 
ɄV.
N100644 section.component.ts E2k%rIz5w6ݭ6S	x k100644 index.ts b-q'%ȟ9n-yP`100644 sidebar-layout.component.scss ÍUdF} :Ó100644 sidebar-layout.component.ts 0C\
YkfuK<)x {100644 index.ts i><)S2/>100644 spacer.component.scss T3o?ǅ100644 spacer.component.ts E^کd-zį;gK$(8Ex s100644 index.ts |C{iĥF100644 split-view.component.scss i8Pq$100644 split-view.component.ts Bk.v/Bb[9Kxú;Bx }100644 index.ts ĲlOƕ|^t100644 stack.component.scss SCA^^l@/i?21100644 stack.component.ts 	],ylF?Q1Ϣ	x m100644 index.ts qdWyg~8ҡqOm100644 sticky-layout.component.scss  m2}W:7100644 sticky-layout.component.ts zƑbo-zd06<9d
x [100644 index.ts Vnhd9'WШݑ;c100644 supporting-pane-layout.component.scss "$[\GUhP۫100644 supporting-pane-layout.component.ts 8t~lY|XnWXB	x k100644 index.ts Kkmq<Dj100644 tabs-container.component.scss a}"C(%&L100644 tabs-container.component.ts  n$ݺb3<ܤx {100644 index.ts ``?|E%Ki100644 vstack.component.scss Yls.'Msb100644 vstack.component.ts ηȈkД<X6xK 100644 index.ts PWcF#qO_>Ϻ40000 video-player ev;,py6x y100644 index.ts 2"8cήJ0100644 stepper.component.scss 9.K _dFy100644 stepper.component.ts XcCܯG/l5x u100644 index.ts  'aF$°LZI100644 tab-group.component.scss ~g?[Cepw100644 tab-group.component.ts ƚq:\@8æx y100644 index.ts \H+:rr(0>=G100644 popover.component.scss ;"?.럺Mk100644 popover.component.ts C;;&bHɿN3ۣx#100644 README.md %C;Oʦ*100644 ng-package.json %;wIIw:D{O{q3100644 package.json #%~1|>gW>CS40000 src .&r=~>0P~100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+sBx#100644 README.md t%G"xN3100644 ng-package.json !XTE;0G100644 package.json %H΁OsV,*G40000 src X-&I2ߴ8^100644 tsconfig.lib.json l)<Ff100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+~:txG 40000 lib )F}#<.\Ra$100644 public-api.ts }P+og<>AxJ 40000 components _IP]~Ro5	40000 interfaces Fz?2mUk*/x40000 content s`5@]w40000 conversion ˫5/B#40000 features BWR"[t6!LމNE40000 heroes }s
Mc1<q100644 index.ts nPJWlD40000 navigation 
ֽa5~ 40000 social-proof 8Vw&sc֘HE-+40000 templates Iυ"1TR>E|xh100644 faq-section.component.scss W.B	qWk=l$M|XsG100644 faq-section.component.ts B!5,v-<C100644 index.ts xRINU@100644 team-grid.component.scss OuזKd6J100644 team-grid.component.ts L!7[`(@B[2100644 timeline-section.component.scss ɩ`h D3L=Y100644 timeline-section.component.ts b@my.υAGٮx!100644 contact-form.component.scss BMpݏ+aղa100644 contact-form.component.ts  @3f|E100644 cta-section.component.scss pK[rq3>@O100644 cta-section.component.ts '`ߧNP$C'100644 index.ts IQE`ute;0100644 newsletter-signup.component.scss Nco3$M{tfZp@c)100644 newsletter-signup.component.ts YHsF zu`RIR[q100644 pricing-table.component.scss [4N)cb100644 pricing-table.component.ts [ V~C6P	x o100644 feature-grid.component.scss LQSݕ%m{100644 feature-grid.component.ts tP)xk; 100644 index.ts gA&>ɭ|P<zxx100644 hero-section.component.scss hUp,100644 hero-section.component.ts Y'ZT:ksݣ.100644 hero-split-screen.component.scss PirGU_wk100644 hero-split-screen.component.ts qdމ\$-100644 hero-with-image.component.scss 5Q	(>ƕu1100644 hero-with-image.component.ts aT[ƚN
&9Ȧ100644 index.ts Km75 AD$x100644 index.ts 2[vZV;q)4U{100644 logo-cloud.component.scss 2*ڶl~.100644 logo-cloud.component.ts wȽ[a100644 statistics-display.component.scss |;[Bfۨ100644 statistics-display.component.ts Jt[oe%R}o100644 testimonial-carousel.component.scss Cn[oʹ[w100644 testimonial-carousel.component.ts 8B}oզ)fxx100644 agency-template.component.scss A)+qW7
+ u100644 agency-template.component.ts TX;&`O0D[f100644 index.ts TsRj
9S079100644 product-template.component.scss ВDF'zc100644 product-template.component.ts ʒ\<8r1ip100644 saas-template.component.scss );d7&r1)x(100644 saas-template.component.ts TXc*v`s x2eCͬk?$X98];G |( P(M-.N+L)fx5vkJ.<\zRhP X@nx LP%*xh 40000 lib ^?Z100644 public-api.ts %E|"!fT`:NQ40000 styles A_5)f"MuO@v(xG 40000 lib gV
%D ~~":100644 public-api.ts ?;/U͏k Lxg -40000 demo-ui-essentials \fN85Y8,`eSθWpfbgJ^1Egʷc.:ĸq*.hx8qH沪ƿ{B&wUH%:Nfh 7
x31 ĂsΜWmMYq!ӹ|W-C3̼
u^=w'v\=/1: TUnbf^I1~dCyn^6I)N..f8YĹO%M53!jBqIeNjXُ?yoM3Ͻػ )J}x100644 app.component.spec.ts G^Mjkb c100644 app.component.ts iACesꎏo	6100644 app.config.ts [񴍂sێw 100644 app.routes.ts 9:5ˡFs7{ū40000 demos {T;դjT640000 features kιwH0~vŁ40000 shared ϩô$Zta|䎄uѥx 
100644 accessibility-demo.component.html L0ie7100644 accessibility-demo.component.scss `-DSWaKt(100644 accessibility-demo.component.spec.ts wGC
:f0?n100644 accessibility-demo.component.ts >BK3Usp)1cx8 100644 animations-demo.component.ts dPH.@7Q$/O(xv 100644 code-display-demo.component.scss L5EKR?100644 code-display-demo.component.ts fN2w8 Fm7-x8 100644 data-utils-demo.component.ts PIL[ۻb9Hx 100644 hcl-studio-demo.component.html PvV#1^MBZ100644 hcl-studio-demo.component.scss 8Mcu-3oy100644 hcl-studio-demo.component.spec.ts 'F>o8zu,LE100644 hcl-studio-demo.component.ts {V\iʕE4[$xv 100644 video-player-demo.component.scss QVIb5L	100644 video-player-demo.component.ts L~ėϳyC9l@/|x$ 40000 dashboard x =O6_ֹUb
x W100644 dashboard.component.ts O}=Wu(al100644 dashboard.sidebar.component.scss ȜsEAO3p5100644 dashboard.sidebar.component.ts S^XiZ6*[dEDxw100644 README.md qRt ƁX=N100644 ng-package.json 
m D}840000 node_modules k`UXdhnYl100644 package-lock.json &<))i.100644 package.json d*$|`^l(40000 src 
{.4;H(
 6%L100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+zxG 40000 lib C8xWQ100644 public-api.ts ׽iG?N{HǣxS40000 components uSe;740000 directives Q_-M>ёo-9`P40000 services tGwַL34}100644 ui-code-display.component.spec.ts INLFO5\Pkw2100644 ui-code-display.component.ts ȞN/YЧ  '+100644 ui-code-display.service.spec.ts τO.)ߪ6Z100644 ui-code-display.service.ts Odr=3+;Qxr 40000 code-block R,L!h!9tǸ`J|40000 code-snippet -쨸\S<b 40000 inline-code 
n
5v*T~.xh 100644 code-block.component.scss ;}b_A隬h100644 code-block.component.ts GoX3Ar?]*xl 100644 code-snippet.component.scss jQi=QzP`5}@t};100644 code-snippet.component.ts ʞTFuωxL,xe 100644 syntax-highlighter.service.ts dH9$35=AHgCQ7100644 theme.service.ts Α.^&ưD%P$xG 40000 lib Vz7=Ao$100644 public-api.ts ?;/U͏ϧxG 40000 components "v3jmǆG}40000 layouts >r Fy p$Y@7x40000 buttons }Eϭ'Ve!%40000 data-display )H{;Xid40000 feedback n@wtaˍ,=40000 forms Oӆ^8pPX40000 layout x=5Iϒʳ:%b40000 media vE6hӸ|pt40000 navigation x7V8s40000 overlays &AVJn
Հ$rx w100644 index.ts -T 18Qi100644 timeline.component.scss F0'z$B/	2100644 timeline.component.ts y쯶{:3U7 x40000 alert R$p<^wxC440000 empty-state @3[?ج-\100644 index.ts حKI40000 loading-spinner Y	p%5[{|Cq40000 progress-circle x|y)RV40000 skeleton-loader t}GVF:40000 snackbar PŅ$"]&=	&100644 status-badge.component.scss =Q68}$	@S100644 status-badge.component.ts ;%(R100644 theme-switcher.component.scss lUfCrsNw(V5100644 theme-switcher.component.ts v1D2ZEwĴt40000 toast a}Cͣ./+)V*-x ;100644 bento-grid-item.component.ts ~twtN7[
100644 bento-grid.component.scss {*!#
>d100644 bento-grid.component.ts EJ,Q8רּ<Xy100644 index.ts $Q	lb5,rMHgL
x _100644 breakpoint-container.component.scss P{t	#z_~100644 breakpoint-container.component.ts ץ7HK5\u"100644 index.ts rwRSvsgKfkAx q100644 feed-layout.component.scss o^)`0*100644 feed-layout.component.ts 2EwXe9+P6100644 index.ts 0nq{d嘄?( q;xK 100644 index.ts PWcF#qO_>Ϻ40000 video-player `nJkum~ۍ0	x }100644 index.ts &S~{ZL<hmP,!100644 modal.component.scss "yxg7>2&(S100644 modal.component.ts ^{ލk
VQKcT2MDx[˸Q 
6j$T#00S&Ut>fPbK
G -
x$ 40000 dashboard 1CC_q_7lvSxG 40000 lib 0S=AeNs!{M100644 public-api.ts %آyX".
q4xG 40000 components [* h>]_Ξb40000 layouts >r Fy p$Y@ӣ8x|40000 aspect-ratio XnJ 1z 1xW;Y
40000 bento-grid c&AyXe40000 box i<a$6Mp40000 breakpoint-container '4wn"nT40000 center ٽ-	ːH{;40000 column u#?).?V:T40000 container 랖U9BpF}߄40000 dashboard-shell  d?yɗ'd40000 divider g慄u}}*t˟Y40000 feed-layout fzZ J_%640000 flex lm%(@)40000 grid-container p:jin4EϋGp40000 grid-system ?# k?X40000 hstack CEhm5$i=100644 index.ts l]}-{40000 list-detail-layout _z%vTMՅp:40000 scroll-container &#uH
840000 section d僢
ﰠ40000 sidebar-layout n5_?Yv!40000 spacer l|;?j顀40000 stack Z(W\^d3n040000 supporting-pane-layout ~Ke<MUps;40000 tabs-container X$3'$w40000 vstack $vj[tW{uxE100644 README.md "JG0X40000 appbar q(ARutrh
É%540000 bottom-navigation I:?[[n40000 breadcrumb ʝ!͐$0Sj|100644 index.ts ^8̴u
C,4Y40000 menu =?jC~lBxxY]40000 pagination f~Pw@oB̾40000 stepper |]P>%ga40000 tab-group f15wV%1jƇJ:%ux340031QH,LI-MIK-K++N..fYYijVr~օx3dt+.{xoLGRg (x4 100644 layout-demo.component.ts lƽD맵-xp 100644 tree-view-demo.component.scss D%-w _BP V-݉100644 tree-view-demo.component.ts d!wwP]fT *x$ 40000 dashboard s*F
}:SxxO 100644 _variables.scss 1d£6w47@[ө40000 overrides n&v_VMIdnނ­ԟ!\x[̴iB|o冴Bgn;z,xG 40000 lib |iX\{-I2100644 public-api.ts g1ǵZW|rb, xG 40000 components *LŕXb40000 layouts %x,j۸qh/I "x)40000 accordion =ƴ8^z疞PX0<w40000 avatar z= ^jĞf<+]x40000 badge [yPKɈ^'D'40000 card "8Kehm40000 carousel hx裔hsT40000 chip ՜bOQV C!40000 divider g慄u}}*t˟Y40000 image-container <|Z>r]*M<)H100644 index.ts O%;jV40000 list Cv_QfP#52E40000 progress Fؒڈ= o|z40000 table uUR鲜	xAD40000 timeline R;*ձ7N40000 tooltip <{qb@tF"~40000 transfer-list ŉ=
%;݆/G[{_440000 tree-view aݲd!":jQmJlUx p40000 container 랖U9BpF}߄40000 grid-system ?# k?X100644 index.ts q.[<y]40000 spacer l|;?j顀!>Yx+40000 backdrop iCQMV K 3G[40000 command-palette =B3c]& ^خ	z40000 drawer &\Mzً40000 floating-toolbar 7}YIsT100644 index.ts Ο$T&<40000 modal F&¯ɤ40000 overlay-container 'vt

Ͷќ40000 popover 3A,F羴dJlxR}x340031QHLN/JMIK-K++N..fTdyLi׌v43}-o[*g^e>z M+gx340031QHI-*MIK-K++N..fx]۹!1ZSI3ģA(ȽLV'z& av>1 (ɠx 100644 bottom-navigation-demo.component.scss U7Rڤ奶7j|*100644 bottom-navigation-demo.component.ts |dc劈ϸd6XƱd4jx340031QH/-LN-MIK-K++N..fHrcYp!,W3$L5Y֭Jz|\ //x| 100644 command-palette-demo.component.scss zKΛAB=100644 command-palette-demo.component.ts Xh)>/mtq,4P[~2?xp 100644 container-demo.component.scss մv3-
a.I100644 container-demo.component.ts c<Iq@㖰yذ-¬xl 100644 divider-demo.component.scss W5ӊaQPIy*100644 divider-demo.component.ts h3!kQޕ!iHSe+6xz 100644 enhanced-table-demo.component.scss y4jnVDviN100644 enhanced-table-demo.component.ts E8XGDrAU&3-xn 100644 fab-menu-demo.component.scss ØB髱X100644 fab-menu-demo.component.ts E¹ZX.,.U@L/C+x~ 100644 floating-toolbar-demo.component.scss M~:S:":"h100644 floating-toolbar-demo.component.ts %!֩y.ߢ-2x340031Q(//K-MIK-K++N..f-Kɼc/L~^gw1[CJ++ٛUqf- =(x| 100644 progress-circle-demo.component.scss zP7G9_fr|100644 progress-circle-demo.component.ts @t" ۉ36sN;1xv 100644 range-slider-demo.component.scss Mbw	iϑ6'<9U100644 range-slider-demo.component.ts N+_"4ztj-Txn 100644 snackbar-demo.component.scss i¼O8aCy100644 snackbar-demo.component.ts f-L@As35Y+sxv 100644 split-button-demo.component.scss .%P1{gōTJ100644 split-button-demo.component.ts &+3OmM+/)xl 100644 stepper-demo.component.scss =nuէ9=^/k100644 stepper-demo.component.ts q@՗:/~v,x340031Q(MKMIK-K++N..f,_f.J4CPym__I1Cb,Ӿ*	+GEGf  (xh 100644 toast-demo.component.scss )S+TT(100644 toast-demo.component.ts ܎}مuX3-xl 100644 tooltip-demo.component.scss JsaH.%  100644 tooltip-demo.component.ts K#X9nw.(ΛYڝ*Xxx 100644 transfer-list-demo.component.scss @FbBE100644 transfer-list-demo.component.ts {ܜDJg2	0{x340031Q()JM-L-MIK-K++N..f4a|jg}hUpBNR|	h,)fHYT̱G~l *>xv 100644 video-player-demo.component.scss I϶Eݚ~Y;100644 video-player-demo.component.ts L~ėϳyC9lq1Wx$ 40000 dashboard 'jUOT"{3]!='*e
rxG 40000 lib |&%b100644 public-api.ts g1ǵZW|rp GxG 40000 components mjGW40000 layouts ٽTG^w/Mi+ sx40000 buttons l3O*RZa540000 data-display )a~3*`^ 40000 feedback {ʻQiR:;Udѽ40000 forms 0U';M}cՌW&40000 layout {OhwB,&?˃40000 media +#jTpo540000 navigation ]2i
nHCcTSU4@40000 overlays \k^Sru$nx w100644 fab-menu.component.scss %%-R{100644 fab-menu.component.ts Yfd\ޒk(W100644 index.ts oW.iDIXe\N.5x q100644 icon-button.component.scss IZ6CDlOu~100644 icon-button.component.ts [Ѓ,[)`100644 index.ts .pm`#$K<=x {100644 avatar.component.scss " D;100644 avatar.component.ts I"ׂ 	2\S100644 index.ts 8n˗ 5{GI3>x }100644 badge.component.scss -qub+ц 100644 badge.component.ts *ҾúW;`Vg&100644 index.ts !n~EY la̺4x340031QHN,JK-K++N..fX)~ߑ%M_ݶ˾|m3/*/)f/aNvM%%;JGĭ*KId񐝲bj*b 3x340031QHN,/-NK-K++N..fp45yu'H՞S'siSKI1ËVek6Q[}ą3ZK̼
=*[㇥LV_N _6x340031QH,K-K++N..f*3^	sibc[4cgaϠ_3RR+jo:ƆWEcO֫ Jb6x340031QH,LI-K-K++N..fн<:j77~;l1?bN*ۥz\	ϪPy)z@5Abss/_i=y 5	x340031QMLOM+IK-K-K++N..fz~hcD.gU+oHHgI1?)g_eۿNoo¢奤Vl߼-]z5gWL Axr100644 README.md "JG0X100644 index.ts غFٛӧů2.100644 list-container.component.scss ƱX#)d.@0100644 list-container.component.ts 9,6F'V\i4100644 list-examples.component.scss rbC/_a100644 list-examples.component.ts O)5}1mnm՗100644 list-item.component.scss 9䛴#A-er;100644 list-item.component.ts Thrmgq\:	x o100644 index.ts O"~+_I100644 progress-bar.component.scss \~0gJ˯Dt '100644 progress-bar.component.ts PշCCg:x340031QHHKNM-ILIK-K++N..f8_'33M2ӐƒbYς*}ׂ{,<gBe楤V՜m\ϪE*txm7BՀ\WHm:XM(m}qb]LngvimƢNېuRbtSNZ6ǡh|FkQ/d`xb-v 	x340031QKI+)fnȡ,
,_
X,!$375'3/U/9? ?/5D8c/H<K[=r}m2n-@;>U
>}Un۪e~,ݸj1  8x y100644 index.ts {<̎ib~100644 tooltip.component.scss r/j$NR=d<m100644 tooltip.component.ts b=3O+{9	x m100644 index.ts  M*}100644 transfer-list.component.scss \lG~flU5%Ɋ100644 transfer-list.component.ts ^]^X[\#4ljS;Fx340031QKI+)fXg }:Ǎ%O2|8hmQSR[Z[WW\\ Y#iӽX'Dea<zEMtҽvFԞ  j8Gx q100644 empty-state.component.scss *pJD(=TϚ100644 empty-state.component.ts kR=S|h 5A#100644 index.ts ŇBBf	Fxb:	x i100644 index.ts 2
DFd`sow 100644 loading-spinner.component.scss ѵLJ$Bv2sj100644 loading-spinner.component.ts WwE/hZ@<\-Cg79	x i100644 index.ts ȼrb^1Ao8=100644 progress-circle.component.scss iNVT|!^CP100644 progress-circle.component.ts rghteܼZ+=	x i100644 index.ts 	ʳ{,J{QwKH100644 skeleton-loader.component.scss ٔi0.З76 100644 skeleton-loader.component.ts SDMH]MP)<~x w100644 index.ts -%yǔ<*Ԗs$100644 snackbar.component.scss Jq!6mT1%!100644 snackbar.component.ts ܇ZBk
dDaaw1v4x340031QKI+)fs|=>:6]C$?D/9? ?/5D8~YqPۄC=c_sH{ܶh=u#V  ͞3x	x o100644 autocomplete.component.scss Pvh6`Lo[|(I100644 autocomplete.component.ts ֖![1v100644 index.ts _OF店fnAz;x w100644 checkbox.component.scss GJ&=@3100644 checkbox.component.ts Ǟ'Vgc,orFg100644 index.ts <:V x6 4˼8"	x340031QH/-LN-K-K++N..f^Ʊ-'3~wXzhW[I1k5^f8ɹ#!2,<zQ?TSf^JjPigO;/,;ެj 78$x340031QHI,I-LN-K-K++N..fH}]S)奝~wITUR`?l&Ӣ&.ܸA TOf^JjPEK
wua 7Ϯx q100644 file-upload.component.scss ;$.Q*b2TJ_@100644 file-upload.component.ts o(!R`100644 index.ts egKRj]J)kD:Rx340031QH/MLIK-K++N..fwٱ̞%m_ax>C<J8>y̩͟lJχjKIҍj臖@g;k9x340031QKI+)fX{Z{_>W_xށWaj
JKtˋ
RsRJ@<|d*Զ+*/o*I(jER\\`صTtߙ|)W|&>|LHWs6#[_3IKbQj"-/zL{Rp=v҃I9[[Ox2zY@Mf[n |x340031QKI+)fx'ɹAkߔ]C(1%3_7$?O/9? ?/5D8!-}8~9ըp6]˾YY/i	싺P'tV7Zdd毳T_vA1^]@W xU)53Ζa	x340031QKI+)fJsb+"mra|w{B%楧d%'3*9gZRS)E\vƯhWRtUnjOn 4լx340031QKI+)fH_ݺٿvǿU85(9C7)H/9? ?/5D83]ak]7}lOО~3\#]H)TWL k7Ox` 100644 select.component.scss V&ʒ#(J|7L .$100644 select.component.ts 4lǸ]LB&x {100644 index.ts BD%c'L{}}E+100644 switch.component.scss Mܾ̄Ǌz@bro100644 switch.component.ts ˾@ST7lKeG7x u100644 index.ts $#8"o ay100644 tag-input.component.scss ļ嬖Yo;lmpaB100644 tag-input.component.ts i FIFQ6x q100644 index.ts  As)IAgÎ100644 time-picker.component.scss tOD\ K}[I[100644 time-picker.component.ts ?NyCGѽ8x p40000 container 
JPEnݧShغ40000 grid-system ;l!{</.$:q100644 index.ts q.[<y]40000 spacer IzjD+F7<x u100644 container.component.scss 
圊s.&O?5soz#100644 container.component.ts daӽ3
|l100644 index.ts jfŹlNA۝Bـ07x q100644 grid-system.component.scss ~$HWUU|*S'100644 grid-system.component.ts tHzc7KW100644 index.ts ?0?&o,_(5x {100644 index.ts i><)S2/>100644 spacer.component.scss j!&]ؼd܄Q100644 spacer.component.ts E^کd-zį;gK$(_5ʫxK 100644 index.ts PWcF#qO_>Ϻ40000 video-player 6ШE_D)3'åxE100644 README.md "JG0X40000 appbar RȂy	KV>40000 bottom-navigation d}9Pֻ[7~gs40000 breadcrumb cݷR ްph100644 index.ts ^8̴u
C,4Y40000 menu p@||ZϺ40000 pagination nQu}YkxCG_/8@V40000 stepper /Ba040000 tab-group >7x@JI{]Ǆx {100644 appbar.component.scss )ȵ'؋ݛ100644 appbar.component.ts FXۚn7c!J100644 index.ts ?Rn!8E#bh6ת	x e100644 bottom-navigation.component.scss N,ZҴ2/1{100644 bottom-navigation.component.ts zAF蚔
T~(C100644 index.ts i7'?| \nʓ)sAQx s100644 breadcrumb.component.scss &͒!ķȊ3?ba-100644 breadcrumb.component.ts ,M[e q100644 index.ts aN))"U}c~;ex s100644 index.ts 4n	տƃ,100644 pagination.component.scss GRL!t<-!3y(!100644 pagination.component.ts M>g-E,arI&]H6x y100644 index.ts 2"8cήJ0100644 stepper.component.scss ũi>
=R=Y100644 stepper.component.ts XcCܯG/l5x+40000 backdrop x}qwPd40000 command-palette YI06`_ꁗG40000 drawer 0z4Mx=c40000 floating-toolbar f[྆>100644 index.ts Ο$T&<40000 modal Js)G40000 overlay-container 2Hߏc+Dt40000 popover *tb@hx&z􅷨x w100644 backdrop.component.scss Y!C2coނ4100644 backdrop.component.ts .tL\!CفǵB +100644 index.ts usn5Y5W72xK100644 command-palette-item.component.scss )N+$K<C100644 command-palette-item.component.ts D|W0LF+(x100644 command-palette.component.scss aa&I~2`˨'N9W100644 command-palette.component.ts 5UHl$̍100644 command-palette.service.ts sX|t7.P$100644 command-palette.types.ts ;(WX(**^100644 global-keyboard.directive.ts _9l$=100644 index.ts ?L/b7{=x {100644 drawer.component.scss Y]<&T ٔM	100644 drawer.component.ts  ގa8mY100644 index.ts ;#h-,QL(	.j4	x g100644 floating-toolbar.component.scss DY
,7kZ`C,100644 floating-toolbar.component.ts om}uWkX*
:100644 index.ts )x`-,2IБ;Ǣx }100644 index.ts &S~{ZL<hmP,!100644 modal.component.scss uq'Xꉯ+100644 modal.component.ts ^{ލk
VQKcT1	x e100644 index.ts .[vaA]Y:%9b100644 overlay-container.component.scss }ΜiZ˫ֺp100644 overlay-container.component.ts yBr^Ls$R/PA1=Yx340031QKI+)f<YCUQov5eEzyy%zNBvL^t(%֨ݣ+!b/N@8촶VKѶkK' J 2
x31 |LԼĜb+I_=Uyg~%sM3RSĽ_G*\z{8.T5%@/lWs^!Pl2YE/+XV. y@x +ļ2[OՑE%?[l
x31 ĂrfՋAV?[(PD!3/%B/$7aWOj-IWh̬;+UWR`$P^WMs&`k&Mg~O]s*]oP\RZVZCQ-[}Xx& Fȣx340031QH,(K-K++.HM+)fp=9+{ׄ$i?/.]1Ħ6cW}g2s^?Em^Zf:ЅϯH9ryKΣ
O"),/-I-)cv'+-6^vt(3s>6M?⪱	D>-5(;zl+P<Er	DIqFbQj
ËW/<UeAԮĚ  o3~x]{4Ty HBi7Dѓxҋ4BΝk\sgtD{M"g6RմZ:$RJ*F%vt:ݿ? 	<DOR?9KPl5׃'2)!I!C?zk=op,X̅J}oLP17g'y67a\(]_mX*\ťѡ^wцaֽBGb*Zw;}7<B;<G{د&bV# IIBk[zƜ(CzyhdꓧE!b7KŐ~6T`0Spu!/pp1p1,2ʭY%Tϟ2vdi_4}tpck9#u		hĐrԌ7uW%;{]L[	"檎iva5}OA1U̝5։J..LI\J"'R2)qw|̅#doq(~t#5}}jW|aS]f+3-wM<Mʭbؿ"		9Qݶµ/Z,L¢VNh4!!AsͫڟoY`tE%Bɞ]-*-7iJ(YqW+H]~~(!IJwC8CG\|ϗGQTK̊heE]UʮD}~wXv `wbM-M`0(A@*<ko/ZطC%ǳ֥f3_J0Od2*3$bTyҖhv7Rh#zNijwFnpr:l2?oe#qokW]&PqT}~HEC|TOa3S>s˼8uc7H\<J3#.TۛDbz#{r8@$n>M峱%e}[To'g"JvT̼&ZzT!3-Ыi-yB#nn$ؗܗǦ;HJc9޷wF)7lM-^_XeY{%@tZw'ֆ9uKe}[<+M3W.`Z%\{8s7ONWw@'.|mMbģ$fAbSEfߞ6NE$!.]0^p&2!4P:}κZG^ymNN)H([=<B*fyR'M-lC.Xڧ[Vq").c$}:ylTiD`B	R#"ԣl+->l_XN^bݘӥ~T+/HjS8Sx340031Q(.,M*-)MIK-K++N..f:Zwv	{?n'j[R0=j_>hv۾ K /sx3 100644 table-demo.component.ts 2l۲铧.5#bxx340031Q(O,.MIK-K++N..f]k?[Sp	1i[ç<~fGSI15v~]Y!:3k+Bi p* x31 ⌤ĢEkU_Ma^-y'f ɨ
x340031QHI,HO,JK-K++)f0HY_|C:工ug&%!,N..f8FYxCk.sp;zV=/j{jƬ| Ax31 $6a)v
~g.~;纡BAiRNfnbA^I1^#Rfت{VPx31 ܂ԼbMuR]=o~-i,)gR
a{C?}_ x31 ҒbrZ-Y7ةU$$d$V2DtXp{? RSSlg21({`|kUOk@3UH{ʇZYPZ_Zy9DL0n^,Q 6_NT7qykO^"XXpVl<]xk}u?DQ~YjЦb"jU~w'[|fc qa'x340031QH*-)K-K++N..fHix7_}uPӈ5ġ6qYMk76v{]$t#><%WvM^=P<mVŹ؛2s>ϬJ8U_\QE{6sT6]Yû	q9f*_]̼
J=c$ݨ:B=y܂T.uwW/&\Pbz&qڶ]֊/#:;(dBKhuv9=ՊQ%0eUtI:sk=6䮼\[b#`7BF/ 
	x340031QKI+)fH'o!_eоw3Bd&%'3XmcY_ o!~m@K|Fq7}U 'p6r&x31 <եe1nhZ*[bQSXX0C)y_wOJQy_6DARbJz*vm΍Iݯ{TXD>9(f=wvkgiQ{|#\:85aɟ-dYgW+}wyW&X?!yߣ!)e)E^FlPKO8r-Y驺y%y@s$Rl\{#D!3/%Bv=Xj24MtĴ)T$<MvoD(?(aVW3%GjKIbRNnbr	0sRJ􊓁L3^NҘ޽7_D\t>{-Vxfw|<f,*Կ eOŜ	/}iY,g򙹩9paصCaףQrjzuKMJsJݤaYΟUFqH-UQ[Zΰ_ދI|#*! -x340031QHLN/JK-K++N..f\kUrnKᾫUjSR ]ɰC_#=_+t{NKIU<I[yMӌ! 4x }100644 index.ts B2nbe"!9/e100644 table.component.scss t2ǉ9OX(B*~100644 table.component.ts 1ZĪ( ǀs>F40x31 ĜԢ&3沭>r[_{SsJ*uKKRgؓ]!K߱6(d楤V3]T|GBLOLK-.K-bh͢P[ogMSh,(O/J-.M,JIeXW3QU&߼ӚVQYZ2hEɣ1~%:-.BJuSSsRJ􊓋>g&\|_Gzi+~m@ZK=&ED-Wj\T[\YZnۗ#m>;◄%o`r4+{pf_ˏlS	#b9'kU6{Uڲ ox340031QHI-*K-K++N..fvpwǉy!A9Xbx}m]'&_?:3/%B&y-9k"c|{ iQ6#x31 Ғ܂ԒTNnxlBoK)7h%g&g'W0y]W(lzSno U_[ZpaYfeюZV^z(DYJbI*LUެu'v	CTe'0͵,\2pl^u@Ue0o/Kyy=u=k_}140031QKI+)fxi>9}*v˿xUbPf^Ai	C[׆؃M%yinU//JLgXی}Bghz1祧d ~Wqґ;wܟ5|UiĢɟ4ugp`-[SsRK@1WW\\0#i׹_h4g\\):o^&97_:cXePg P2󾬍ZGd9[0((̅NUȑ.r?/+3}`]. O	x o100644 autocomplete.component.scss ΌpѫxF`v6100644 autocomplete.component.ts Js}xF100644 index.ts _OF店fnAzF<ox p40000 container :kwJG,?<\M:40000 grid-system ;l!{</.$:q100644 index.ts q.[<y]40000 spacer as.W.!Pk
:!V5:x u100644 container.component.scss A&PY1zKuS100644 container.component.ts Q&SN2WŹkyCK8100644 index.ts jfŹlNA۝Bـ55mx {100644 index.ts i><)S2/>100644 spacer.component.scss L2ބ}WT<R,Ioɸ}100644 spacer.component.ts ƃ< cg-m'"4۫x340031QKI+)f`(MD%S/vw BYfJjnANbejsaodO: 7g	x340031QKI+)f
Yjqӧ%eLBԔe$V%'3,2\lm\#ׯwƯhCŕ*nˊ9h$J 7xf100644 index.ts T"ap;3a-100644 menu-container.component.scss pLr)	S8#%W,<}L100644 menu-container.component.ts 013z8߭dp	B100644 menu-item.component.scss @e6O@u6s100644 menu-item.component.ts W;M=I100644 menu-submenu.component.scss ]򶙑jgx^"100644 menu-submenu.component.ts ":F
6X}nLx31 ⌤ĢjVlrk3ZLz x31 $={XfE6mBAiRNfnbA^I1^#Rfت{Gx31 ܂Լb4CNb洰ƣ&`E9@7Ǖw⹽3 x31 ⌤ĢK&2NIϤ~ x31 $Y߸$[,<	040031Q((MLM,+)f"r9[kD[~/ lx31 ܂Լboοc7)^wz'R
a{C?}_Ӵx340031Q(O,.MIK-K++N..ftczY1(]_ݴ_lqx43_̵	/7  F)ex31 $ſb,qfkү(&d&&d3|xq9Q5"EkfZ Zx31 ܂Լb1x8w)w#4cR
a{C?}_؎Yx w100644 carousel.component.scss *@]mIK:i;:$100644 carousel.component.ts aI?rҌԐ9100644 index.ts z=83u4Lڹog@7xK 100644 index.ts PWcF#qO_>Ϻ40000 video-player ;1FS$}%x$dx$ 40000 dashboard 7Q܇i~0ׅ<xG 40000 lib ۆղxY=jz100644 public-api.ts g1ǵZW|r"HxG 40000 components `1bR40000 layouts ٽTG^w/Mi:q ƣx100644 app.component.spec.ts G^Mjkb c100644 app.component.ts ?ktxq[0100644 app.config.ts d+$Ӓx,/ 5100644 app.routes.ts 9:5ˡFs7{ū40000 demos K2T(Y	sKYɤ340000 features NՕ_.{Xq*|40000 shared ϩô$Zta|aqf_x40000 appbar-demo UCth: IҔ40000 autocomplete-demo CQip0S540000 avatar-demo 8L1x,2`?40000 backdrop-demo 6)6I '2sK/x	40000 badge-demo  vaBH40000 button-demo ^zʐbb$AS40000 card-demo T-cc3P,O40000 carousel-demo ;|o<v~eoT40000 checkbox-demo p/Y?xд)el40000 chip-demo :鬙r~ULcE@e40000 container-demo xBiS%:40000 date-picker-demo ޠV;B.|k100644 demos.routes.ts (t|40000 drawer-demo ,Tv.`I[{X40000 empty-state-demo d-;B&-|40000 file-upload-demo ͂ɍ-w`4Ok40000 fontawesome-demo Yq9W I0jIW40000 form-field-demo Տ,)ǐ.d!F40000 grid-system-demo g֨xꝸ40000 image-container-demo I{|uSQ.h100644 index.ts [@/CH+,#e40000 input-demo 8ЎPK0q>40000 layout-demo <:a3F`[1^040000 list-demo iDzSxxmES40000 loading-spinner-demo !fDRKj)Y4a40000 menu-demo -lHviJRI40000 modal-demo G&6iC:xոhI40000 overlay-container-demo )\Mm~_+j40000 pagination-demo [fW{Ky]ăI40000 progress-demo iwV_J{1&40000 radio-demo $,tqh4a Ӓ40000 search-demo B@N6v#d?p.*da40000 skeleton-loader-demo an"9폲X40000 spacer-demo -H{gR40000 switch-demo MI(/R%I40000 table-demo ߍbn,B^ 40000 time-picker-demo (exd/7ϗ[l40000 video-player-demo N+NǠmЯ}bEgHx4 100644 appbar-demo.component.ts ({Mvy'
Xxv 100644 autocomplete-demo.component.scss %5&kt100644 autocomplete-demo.component.ts 7$!sr7bDy!f.x4 100644 avatar-demo.component.ts P
;2"ĺlxn 100644 backdrop-demo.component.scss N{W|1XyeOf݅100644 backdrop-demo.component.ts TWVePKfG,x3 100644 badge-demo.component.ts :RiHDBu&"VSx4 100644 button-demo.component.ts h4OKhHXTvx2 100644 card-demo.component.ts m~+.8:^LΡX	x m100644 carousel-demo.component.scss C͙c/lo"۫100644 carousel-demo.component.ts vһofFޞ100644 index.ts @ҭB\պM2zo9>x6 100644 checkbox-demo.component.ts Wc !g0檨TϪQx2 100644 chip-demo.component.ts 0"fjVO:Exp 100644 container-demo.component.scss ToDOp100644 container-demo.component.ts XGF;eEȗLj.xj 100644 drawer-demo.component.scss VH;e]ǒ100644 drawer-demo.component.ts hYWݻN,ЂU:}~,xt 100644 empty-state-demo.component.scss /xgfyGҽ8100644 empty-state-demo.component.ts 9iUbŝߑWVq1Uxt 100644 file-upload-demo.component.scss cx ,_ݸP n<@@100644 file-upload-demo.component.ts O7W!h.Ȥxt 100644 fontawesome-demo.component.scss qRRϡ*<v|100644 fontawesome-demo.component.ts 
ͣ6iBD0ۢxr 100644 form-field-demo.component.scss G0AWJV܊fo100644 form-field-demo.component.ts 9s{|Ѳdcx]U,|xt 100644 grid-system-demo.component.scss [UWSs'\`100644 grid-system-demo.component.ts ܨ5ǒJ8EizLT82(
x _100644 image-container-demo.component.scss XIGZj100644 image-container-demo.component.ts pP~1UE|Q[T	100644 index.ts n"0>R¼6zN5Aȣx3 100644 input-demo.component.ts 㰩 =Rڎ]s$gx4 100644 layout-demo.component.ts \Ka/A]_L߾yx2 100644 list-demo.component.ts ZZsY)܀r|+lIWx| 100644 loading-spinner-demo.component.scss 93]ٱK~`T100644 loading-spinner-demo.component.ts 8~gZ1/{&.xf 100644 menu-demo.component.scss #l3]pw'C_100644 menu-demo.component.ts Z"՚U(W[)pxh 100644 modal-demo.component.scss J[ ]ksj.h7u*100644 modal-demo.component.ts *k#Øfe1(Ԩx8 100644 pagination-demo.component.ts J=TY;<DSŝREEIЦx6 100644 progress-demo.component.ts -2|	ӍߠN12Rrx3 100644 radio-demo.component.ts TYgEr-&8($y/¤x4 100644 search-demo.component.ts 0&^$db=Ɔ#5hدǬx| 100644 skeleton-loader-demo.component.scss .H2`gHwvI100644 skeleton-loader-demo.component.ts `/Q>fi2"xj 100644 spacer-demo.component.scss i7meS
rh r:100644 spacer-demo.component.ts [Dxyָ	[
9*x4 100644 switch-demo.component.ts "=by!8sKlx3 100644 table-demo.component.ts Z"l*D|7o->[Iqx$ 40000 dashboard 'g4J7IPxG 40000 lib ](c"WD4100644 public-api.ts jJuI5̫8Q0}Q9xG 40000 components T_NU2ly	40000 layouts AHRU@{<dF]_1ҥx40000 buttons B_
Wk0D{>840000 data-display ݋$~g,40000 feedback =ZwiK9W!5MB40000 forms 66$1eDݖ40000 layout YU\9=C40000 media R$c?WqwoLg_40000 navigation FU..P}},@B40000 overlays >8և#9\WlVH7lx u100644 index.ts  'aF$°LZI100644 tab-group.component.scss Iv]=9L@Jx100644 tab-group.component.ts 85qPyyߞx5ILx?100644 bento-grid-layout.component.scss IFKT۰100644 bento-grid-layout.component.ts Zd;fəҸr%100644 dashboard-shell-layout.component.scss Ʈ()ςB{100644 dashboard-shell-layout.component.ts xdsYQS-ĚI100644 feed-layout.component.scss kE%Ĭ/ر]T7100644 feed-layout.component.ts |-kuh'4(7 O7100644 grid-container.component.ts aO:W4!/&p!100644 index.ts &htT,Yu100644 kpi-card-layout.component.scss ,Hީ_e(Ubz`100644 kpi-card-layout.component.ts m+-)[P1{_100644 list-detail-layout.component.scss ʳ{a/D"VDXQv100644 list-detail-layout.component.ts **9{N51;=׶ˢ100644 loading-state-container.component.ts LCy<AՉzB100644 scroll-container.component.ts C$ȡ
܈1;R)>100644 supporting-pane-layout.component.scss 3-n~puh100644 supporting-pane-layout.component.ts X\!7~h
@s100644 tab-container.component.ts  femsVIH-1100644 widget-container.component.scss g>@#lY100644 widget-container.component.ts D`hSz.?B"2^100644 widget-grid-layout.component.scss XrKq1PH`yh׷100644 widget-grid-layout.component.ts 9Z cx䶭nbO
x _40000 demo-ui-essentials apf1.炟,9WR40000 shared-ui dI!]pȬ(40000 shared-utils O+~Q>o F0J40000 ui-essentials ;ԟnב~C*x q40000 app K/nLSи100644 index.html Je}ݒmƏ({^100644 main.ts 54c1*۹100644 styles.scss  r?yU=hx#100644 README.md 7r&pu5Gpa100644 ng-package.json ԔlP	.$-	B100644 package.json ݺDRel	m40000 src 5ܨre૱x[B:100644 tsconfig.lib.json #Yf/3Xۯ100644 tsconfig.lib.prod.json ʬF;_E;pU100644 tsconfig.spec.json %Fw;cc8+ey?x *40000 base I>]tbW40000 commons ѴT2"h-a}\h40000 fontfaces Tu'-hQөW#100644 index.scss oָ"YvPN2V40000 semantic *K1]͌ϕX100644 tokens.scss ]'Q"l-\txY 100644 _index.scss eSO.@WRw100644 _semantic-spacing.scss S9RA(b9|na>L4&xG 40000 lib ?QV)I޹H4l100644 public-api.ts k1eimMFԕ2lx% 40000 components <y@[wrOMUx" 40000 buttons 2 r)cIli>x340031QKM,/JKLgƻOb/%ъP%yEgEs^`ޒ[ji ^Yqr~J*QJ*obGԜ WG_Wq'1~_fgaݗPEy9EzYybq<k{s*gcT]AbrvbznN~r6Ds=KUR.>0a9_bK7gn'mw)ų>O+)Da`MKGߤ.)"6H zx}AN0E9E$vf$V%@Z5JbhNO
ĊEXrj|/fO3wNEg?{he^o7.AwV3pMܠma_(_;{h(%ITLE=O	6ZkZ{6ljLSo45|MK}pp$x]Qn0
47kӡCc+OJP Lޝ|GLfDݒeTbYBL{--޾̪Qߙ\3uS	31W5?n*MFmYOxp?,VJT)Up+9fwGW~?bZ2Pgp9aN/\,yjÝ+a_&1\ѾQ?8_dL:sZ^^Xvq`LKV]zhK	i0x2J>jQ{Zӑu5wâ-yNY/˻t3{&wuffitl	jx oKdist/
.angular/

# Font files and directories
*.woff
*.woff2
*.eot
*.ttf
*.otf
assets/fonts/
projects/demo-ui-essentials/public/fonts/
1*xS# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.

# Compiled output
/dist
/tmp
/out-tsc
/bazel-out

# Node
/node_modules
npm-debug.log
yarn-error.log

# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*

# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings

# System files
.DS_Store
Thumbs.db

# Font files - exclude large binary font assets
/assets/fonts/
*.ttf
*.otf
*.woff
*.woff2
*.eot
mx1
1@>RkDt	^B,n2jm adZbAI=T3JpnU+ͧaw]cP.6(A\[u)AI,Ax1O0SȎZDC#b0X}wl0tcy޽T Rx$6H^j&9R(Մ>'ݶvXbJ{[mdWcPI	%R4+ahh5e9/&rFN-AO749USI}mh!Q~0P+7aaӶ.SnIΧ{ݣ<e{S6{uɃ:xAK@Kb)JA
AQ(6I$]fRߝlkԓ'/}MxH,Ec6F&bE<J6ZT&+66UxNg;6[@\7$Ig?؆5\B=Ih UU]%c5CмHR+@)ܓ;I6 (L"«y+_RvfP2/U<9.9X(5T(%W::}?BkZx~F񗰨xXn8/b;EYvl`ec/ f(̐ 9բ@"}}~pxA`I}3yp{,ߙ@SirMm[S-T-5X9/B:tCM;u2E굳D돋,;;~E>drٚ@fVʋ4=TWGՔԵ%\e
mlNa.筹w̶pQ׽״Y.)cS~{x<S^A6R4U`c7mC-~ܡQD5s4d_h%]Ftncj^*uQf+)QKOrY )|SCHU~W^jW ]pF.TRT%ej.DPּڒ1Ea:%.JkPY/*;St(4d|^ݘm%'~F:~n	.I`mY/OO;YzBVb~eT>"&M}pYˆ.a}T`GEW6ik_0z&J wc@y?f ߜnO<
9jjK^7xG|}W''Zes͗g.'YQMx}/sHcz9#z!u4%tX_Wle65&\9~8欗IjsGՋO6Si1-ZG#.ueፋA~&IK>wNOp-e+wFj!XEql{}qF_O|3Ʈnơ`j]ߪKǝ9(Z_^v0VZKh[0&;]<ӌ*a8Y'Z?U-Vly458)gbҺʪ2AVtd`ϦXVP	|h\*P>)ů.
jBٜ DW_+0e۠+1W'`;[GLO,9m|D!$ѯkKC6\4s5R7[іHW_z˙M,|3T0cASt]&:u>S"`Moj
}xV_I!w\ \ ,T%/5@%G3ݼb6	Kτ3DB@-zd8ZĥLuqz$r;<֖j.^		^!۞%!R#l925CaM1M5@{"Ԙ6`"{Q & \b:5PY.33 fHON&P'>};}nӗʹ &ȾǱC/=uxM*|{!(cίS35}HI|U{$V_	8gs$IesS yW{S[_ȕN7n
@W%]&#9&R>}i=H
$) }m~WOYSrÐP C,l^!hdDwzRq̝ƘoY"j0t?T2`BG2:fњo#Bܙ@)h
(?Οq`08fQiI^JؐPt-(kݍ޵TC,`ap/wa"23N{,I3~;#uՅ\&w:$]:yw\T{3m͟߾I$=Ǆ"v9Nm5p[q)9QQ?!@Bm@ޅSk.	9_Q9RIIc.ɏN+_* >{?:XUZGso샷*ԙ3tk|-,xL%%ui-design-systemui-design-systemui-design-systemui-design-systemZ,ui-design-system": ["./dist/ui-design-systemMui-design-systemX
Cui-design-systemCui-design-systemUui-design-systemN>ui-design-systemqui-design-systemFui-design-system^,ui-design-system0ui-design-systemy}%x%1
0 P*!8CQtqwӎ
^[MRMJ M<xQsp'hx*1jPIQL\ILe,v(2U!JҌ۪Wo^brK0+KyqFpÍ5C"#q0l-2[htֳm[_(q0sNA yEx=rȕ5"BlB"eF"\#hA@IGUڭ't/Te>ݧO>>8x,N2Pڱb,Kώe_7Ű;{ޠ?RD0N7rǣ%ݷᡰXV HLG`
7+׋B11L
yFnbz2+?N[׏p5Cq\;c&aG"Zʉ;u"K'rtc9v<u=Vb!US,W7h_"8"SJ/ﲫO034.ǝ,	+qz`pgč0H -@*pйta"G,VQ8.lXʏdD}X"w+5</ùyA{XbwnMq=b)ÅE@ ;H]	&WEQ89ܛtJ8\R5ڝtU>jBXѵvTRC&C(A?;pc2se/,<P;jeYtpdF6<O#gph{2A=9==VGJ/X.h| 	 w*"wᢀH9p}Caq4U0Cy
\#{!a3K;G
1B\38'Gb^k*Kᔋ/WHf`cVj@?<<zË]@TV5Ӓ!!ّ&I,rQc[<iJsH4BY;<<x}NM~l@ptjjN[%-V.NEu~#DyϧC0	Ŋ(K31xr鹾T7zZLkX9ճVM4owq_'AUoV'I*Zī9ĭp@D(Q{DZIZϟx+jh)EV&g>|w&}=9)i੖"b욷]]qc>R=Đ8. ͫu^h˸v|, rj6,,lv	?efGY4=R'5z@O=mKTQC|!ķ@R,^|{\T{0bRab=,&4ZёF~]*aDS8t (2V	%KTNF(KT7{ I%ᎧVxcE3GN~wzzڋnJ݋Q-eyvҶ\a')&mRl'&w_q=e凝Rܚjt;C>Hi^}=d]{Ǚn\ 'xJh,as9D{w9>Ԫ>voUziR=e}@c  q` $)mF\asըnx]7=_x0|J%|brmN)Br)Esphlpk Cc{?ߌx>uxWjxۮ
j2MT苘):4&vH
U򾉞gS<{/N-)t~fJrms5`fB*bvY`);qJމ5H
'TMLˍ'CwU\5-8A2,bvu#acyO.ЊaRȥz0 yI f<3b/SO7Br9)PG?B")PO=!hN퉬"MQ͕`&2rn 
msj
4NБan5C
*E*m[ĞL;ߛd:ߛadӥ
HM`hŽɞ*tUme`	{9Yyd&Tcr
@wv|SˁԻu1Z9O!
=|\$/$f20n+*,̀6Ayd^NF˜t4v}MA	COxH:Ul\Yz|Q ^kSÅ`ze#b^`.kA-1,ҚI/2:1@a1Nh=-Q{$zd&k΃X'z=znz@=5,{l_'P_MMf$"VzYΤ~sXB:j@/Ǯ}-GqKd楬^Lz!1^P]=s'=\~\	E'KSS$Ku9G;ҽUbM[MakO0Ըl= Aw̈R.+w4RTY㹽7lIG" [domBz,6F=V<6z<t΃bڰ_oX1nJϾ>ir7n8+]zНn 0lr=ɚa?0}+2Y2cAjN~,g#W11KjzRKo:YZnnBؽ)Y&D#i~˷1+vhө!?3iPox!d)>ˬnZ٧D4Bp6ƺEHd*HHeZCpB
]j"Π5+D˩<aeΩJ	 RLi1hd`{j*5uG7mzXpjUר_Qb{:T*vϭ'9@@<A< 1C2;r6+XA$֪sM] ej-ӕgx/Z;Lcd<%ͫpadBi(x=tfo{Fw&2=Qwʿ27<1 1M<I&>+ >׻~S  YU4Q6p@ȩJjP~Zyۘ5m*`s^Ӥ4/.__dOcAKz`i5j}V]rܿcp
,GG	8ہL,.=$@t(pyhOYh$ZIgjmLB}Vu@k^U(m(iBr7XOЧ%zrL%kcȅ>UK5x$-`B(M"SʝNUAl[wf*A
K /Ƹ2SFp}wJ7`e9?Z~B:ZSrVv(g1[,X=RWWYz@ E05~ B$@!^s&YS	XV2zVS36e53GqNb1\,TJt+)w}yˇX3w"$#_PřhnEt <(*(aݗf=XpQI`s.M(O0Ά6l:V+oar	"/ؒL;vÞLDt0vON%ՎJ)ۘP?`_ԓ'`D.cx֔W: 7I$w8i`|z).oUnD(cHwJӡptv̮EG{eұ/X5$r{e/ghQR"d-}i)5.>^uGC;?ɭ?QQQh-Thl@h|^M<'ZdsHE/l+N~ nB	t#'_Hd,s,sf-5Nx`3{3XVz2Bl9k߀	D*W]n7~lt=?YQYQ~q*t6ȟ]NQۤYV)KVyokJi"vېu܌VJ-)Ү)B*Cr;>q:fؤ=SaL8frủ.B~FĖn 35/H7"R]:oq78 w2Wcj }MpN(!1Crgzu#[92"v.W-v6ڳi;ERZn+%z<ppoZtVnILdܞlGcee$}5춿㔺/Q伲kqRK<iY@a<`$;?̾fCmL4z!x^FwྍvmLT 3=Z}e}"vL433D/jDy!"FQcmS/ ;'fs,R|L[cdò6-UØFEdk[ 
LM]/]TlnFΧ78SNE@_w3f{fl;|vάNOї&VFHQa棼Mg2{ +cik0K3r8bh_]F\'\S)>?_iTxG I|dSlfBk,]a&XdKB;
%HL-b^3ED *[ose06܅J	Cgg!yn}߀:raxdjDn\ቮQ H-?=eڙW{;Ց`a7770袖yz$Jj*K+,مxȬ"pAn1SעQ2%^[+4tԪ7 "*loOEB$=ZfUnӼ#`JZ"'$F48_&4`!Ǒ;|ڠg,U`r,٫ /dj|\	2b_F7.ΐ"IkE-$Jo ]]J3B?)V>}˅'A7FMKfl`%]npUo)Zq: j)fܽ<o#+Jܡ$]꿽Lt$Horw.a)Fk?[;m
,bձʡ?As5KkIzkXOe^B˕6Ӂ!1+!Hƫ9X\U+$# /!Ū(I]?qlgNۦj9ަ
 5:)(UPeh
]m\?(c5s\%(4Hؖ;UO+ǝ**vB#b޻>MW|۬Џ֠_vG+c$6@gyƌ8E;n"ޒ*q
GFJJ Yxoym: dցoZhcĈyY*Ջ27kędasƮi7L*62)Za0e(#]6_R#P꭪[`Ph	()Gɧ;$4ZI&5ŀJJ6Ep&hUG
6k u]7Zy(Y'9T[t"yr8/`?zf;9ULo㌩c0.b%9.- YZ\Gldت(H"09v%BǼQ<TGRr=RPJR JHG8ơ^7h]5p	mO7g*~''¾a[4x6)]4>^QFxl#N7#	Zu?<ŷgzmzkuv5BUV2WEXj"RvmrĉM`k@$\LALڐ?pYfh&_4,0@^- ɋzC|EiFKdA*LW؉*\$ 7
2YU(O*Y񱡖?~"MCNPx(Eg_DAXs([Ê81T `OdVf\$d]2XU{jBQӴiRJ&%&J{1/,t+HmΧ%|^P~>x4(AN`:TOr+=}/4xxhe%l҅ha?OJj/"HO]YTލaVOSVg|o,as.| v'.}@9B`bQ!g҆ZBܼS|H+bEe}rw3EIe`:eM2}D5J=Q}^GLfe1HJ-bf_T#?̞Y ]i(5v2@u&S\,(8AwI=2p-,X׭g+ ˈq'l=DQACBh)$RM:R-QvL`ܦ]ro\#L{khDipIxvBYj%|7-3.M{,cs?iV7~P5_yPrukm"
Wړyݎ@VRj;!ՎV3*7D$R5g1pXYY5xCJ/`6|4C'Ĝ#yR`|c9P4F#CcvLo+9W|]5lt0[7$N)nwH
PçTџW2\_?(QbՈ7-8AzoD`	\QUwDyG3*64*:SMl.>T끟rvAXtzGsf*2QMWRk:[
Tc]R3Ŕ
.H`DA~^JQ&Lŵ2ڟq9$_ɜa7X&~|&/2UîuvNYco鄪׸$J>şN+/b\-)S;čo!Jǀ'5ykQG6rO;-1JJmry)kUu2E^~ȉn
r3UG4YftFO5ZF_{8zF.qn,UYGf@i;Ďzӗ&Lg8WLUQ%5Z-uT~MGI1L4cWqa/K*"Ò?ak].+Bz}A5<#ޝ_GODb%-SwcLI1eD>^<gn{<6?V|`XUIwP$`0atc#DÎn,tM1NEEI3<~
W+ڒM;X?Ϧ<f7}4J2-퀳^%=rH> 	*K?$`߃A9Pg_w_󅭆e? C+C7L0+}9?D9gf\WvLCk*((݂摝P1>A譆TE᠑;ѣQH);=	H"s nĈ-@MN#	9(w1[{Dk*SPAh5B=3p9*N/NbO3FAhge;LT|T]#FOr>ע.dlª飻U%bc
k3TygtӨ vǎMNצ(a6axWnS9S	9Y
iJ
|Zj}.y:dqt%$T378zV
%mI%!V;2S?-Nk.-LʕTÝSӂÝkxr
ep'!?L
h	/keUAa4Wj;AN?5+O%-F3Ҽo/IkT'81b܈:9PN2.lD7T2jå!̬l!&/at2dʐ{jixK5))D5&[h2mϭjQpcDNکZ f:kTҎ0X8
*6+rdcB*|^:@A-pXEuJKF1B1>B$%|EZS,v[s3nE̋?6^nM>{h@Dj`0\j^N9AZIF3aB{vM'p1[, flxCѱ3BKaA(?| 1w `iO'l=exhSa_Jiv3-{!p]
9-=encOǏIHҊ߾A
$Rd"O^ϳ%٫śr1O$T`p׃;J.*w֊=`)77TW4
ȍ.|^'kudrRvy)EfwbQ)6aWvLzuǝSmDٌȀh㔌C ʝ(KEŇ֮MAxWQaN\/KM\K8ټvN͚`\8LcYVmW7NXfOޥA-@}+ᖗ3EB)|h'!%xrcWR<yh*ę5%<3\)=E&V?ZάME6"g';3mʓ0R` f<sB@0=a{Ė$l8*c1Ҧ(}ͼ*>V³j2|:A+!%Ҳ'f>N7פ SX"I|s{|~8Řh2aQMM/p\eメj8yYg|!_|d»$<zh&/{jm?/EY)a
,>;5伇3H^;[.imG߸ޢxҿeubi34@(2*WZ-oX	0(  [xE# UiCodeDisplay

This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.2.0.

## Code scaffolding

Angular CLI includes powerful code scaffolding tools. To generate a new component, run:

```bash
ng generate component component-name
```

For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:

```bash
ng generate --help
```

## Building

To build the library, run:

```bash
ng build ui-code-display
```

This command will compile your project, and the build artifacts will be placed in the `dist/` directory.

### Publishing the Library

Once the project is built, you can publish your library by following these steps:

1. Navigate to the `dist` directory:
   ```bash
   cd dist/ui-code-display
   ```

2. Run the `npm publish` command to publish your library to the npm registry:
   ```bash
   npm publish
   ```

## Running unit tests

To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:

```bash
ng test
```

## Running end-to-end tests

For end-to-end (e2e) testing, run:

```bash
ng e2e
```

Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.

## Additional Resources

For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
GxeN02\$F$VmAeFJqKc,*,Q1qI: 1Y}.ưZՆ8OwhW"u``)B4X*?\%`0ŝq	G́ @{!@ޙf)#HKff]xI|>K{k2͆썵kJ%:l4@E'vE@$c1~>f|\/)֥xw	U^WYGOAf
q<&ÛgX6Bז'$yu=OMe^1VDa:8O?_b)x4 # HclStudio
hcl-studio
hcl-studioUxŽWY!8#(5%$3x#	Fb0_$?j& _	x: # UiBackgroundsbackgroundsbackgroundsfRx6 # UiDataUtils
data-utils
data-utilsJxŽKY!8#(5%4s#	Fb0G4s3F)d.?j& }GxŽ[@Y!4'1/%3/= 1=x#iFnHd3FYt!~L VP)x7 # UiEssentiaui-essentiaui-essentiaL
x<Vé# UI Landing Pages Library Implementation Plan

## Executive Summary

This document outlines the implementation strategy for creating a comprehensive `ui-landing-pages` library within the SSuite Angular workspace. The library will provide production-ready components specifically designed for building modern websites and landing pages, integrating seamlessly with existing libraries: `ui-design-system`, `ui-essentials`, `ui-animations`, and `shared-utils`.

## Architecture Overview

### Library Structure
```
projects/ui-landing-pages/
├── src/
│   ├── lib/
│   │   ├── components/
│   │   │   ├── heroes/              # Hero section components
│   │   │   ├── features/            # Feature showcase components
│   │   │   ├── social-proof/        # Testimonials, logos, stats
│   │   │   ├── conversion/          # CTAs, pricing, forms
│   │   │   ├── navigation/          # Headers, menus, footers
│   │   │   ├── content/             # FAQ, team, timeline
│   │   │   └── templates/           # Complete page templates
│   │   ├── services/                # Landing page utilities
│   │   ├── interfaces/              # TypeScript interfaces
│   │   └── styles/                  # Component-specific styles
│   ├── public-api.ts
│   └── test.ts
├── ng-package.json
├── package.json
├── tsconfig.lib.json
└── README.md
```

### Design System Integration

#### Typography (Google Fonts)
- **Primary Font**: Inter (headings, UI elements)
- **Secondary Font**: Source Sans Pro (body text)
- **Accent Font**: Roboto Mono (code, technical content)

#### Design Token Usage
```scss
// Import design system tokens
@use 'ui-design-system/src/styles/tokens' as tokens;

.hero-section {
  padding: tokens.$spacing-section-large tokens.$spacing-container;
  background: tokens.$color-surface-primary;
  
  .hero-title {
    font-family: tokens.$font-family-heading;
    font-size: tokens.$font-size-display-large;
    color: tokens.$color-text-primary;
    margin-bottom: tokens.$spacing-content-medium;
  }
}
```

#### Spacing Hierarchy
- **Section Padding**: `$spacing-section-large` (96px), `$spacing-section-medium` (64px)
- **Content Spacing**: `$spacing-content-large` (48px), `$spacing-content-medium` (32px)
- **Element Spacing**: `$spacing-element-large` (24px), `$spacing-element-medium` (16px)

## Implementation Phases

---

## Phase 1: Foundation & Hero Components

### Objective
Establish library foundation and implement essential hero section components.

### Timeline: 2-3 weeks

### Components to Implement

#### 1.1 HeroSection Component
```typescript
interface HeroSectionConfig {
  title: string;
  subtitle?: string;
  ctaPrimary?: CTAButton;
  ctaSecondary?: CTAButton;
  backgroundType?: 'solid' | 'gradient' | 'image' | 'video';
  alignment?: 'left' | 'center' | 'right';
}
```

**Features:**
- Responsive typography scaling
- Multiple background options
- Flexible CTA button layout
- Integration with ui-animations for entrance effects

#### 1.2 HeroWithImage Component
```typescript
interface HeroWithImageConfig extends HeroSectionConfig {
  image: {
    src: string;
    alt: string;
    position: 'left' | 'right' | 'background';
  };
  layout: 'split' | 'overlay' | 'background';
}
```

**Features:**
- 50/50 split layouts
- Image overlay with opacity controls
- Lazy loading integration
- Responsive image handling

#### 1.3 HeroSplitScreen Component
```typescript
interface HeroSplitScreenConfig {
  leftContent: HeroContent;
  rightContent: HeroContent | MediaContent;
  verticalAlignment?: 'top' | 'center' | 'bottom';
  reverseOnMobile?: boolean;
}
```

**Features:**
- Equal split responsive layout
- Content/media combinations
- Mobile stacking options
- Vertical alignment controls

### Integration Requirements

#### UI Essentials Integration
```typescript
import { ButtonComponent } from 'ui-essentials';
import { ContainerComponent } from 'ui-essentials';
import { FlexComponent } from 'ui-essentials';

// Use existing button component for CTAs
@Component({
  template: `
    <ui-container [maxWidth]="'xl'" [padding]="'large'">
      <ui-flex [direction]="'column'" [gap]="'large'">
        <!-- Hero content -->
        <ui-button 
          [variant]="ctaPrimary.variant"
          [size]="'large'"
          (click)="ctaPrimary.action()">
          {{ ctaPrimary.text }}
        </ui-button>
      </ui-flex>
    </ui-container>
  `
})
```

#### Design System Integration
```scss
@use 'ui-design-system/src/styles/tokens' as tokens;
@use 'ui-design-system/src/styles/mixins' as mixins;

.hero-section {
  @include mixins.section-padding();
  background: linear-gradient(
    135deg, 
    tokens.$color-primary-500, 
    tokens.$color-primary-700
  );

  &__title {
    @include mixins.typography-display-large();
    color: tokens.$color-text-on-primary;
    margin-bottom: tokens.$spacing-content-medium;
  }

  &__subtitle {
    @include mixins.typography-body-large();
    color: tokens.$color-text-on-primary-muted;
  }
}
```

### Demo Implementation
- Create `hero-sections-demo` component
- Showcase all hero variants
- Include interactive configuration panel
- Demonstrate responsive behavior

### Deliverables
1. Library project structure
2. Three hero components with full functionality
3. Comprehensive demo page
4. Unit tests for all components
5. Documentation with usage examples

---

## Phase 2: Feature Sections & Social Proof

### Objective
Build components for showcasing product features and establishing credibility.

### Timeline: 3-4 weeks

### Components to Implement

#### 2.1 FeatureGrid Component
```typescript
interface FeatureGridConfig {
  features: FeatureItem[];
  columns: 2 | 3 | 4;
  iconStyle: 'outline' | 'filled' | 'duotone';
  layout: 'card' | 'minimal' | 'centered';
}

interface FeatureItem {
  icon: string; // FontAwesome icon name
  title: string;
  description: string;
  link?: { text: string; url: string; };
}
```

**Integration:**
- Use `ui-essentials` Card component as base
- Apply `ui-design-system` grid system
- Integrate FontAwesome icons
- Add hover animations from `ui-animations`

#### 2.2 FeatureShowcase Component
```typescript
interface FeatureShowcaseConfig {
  features: FeatureShowcaseItem[];
  alternateLayout: boolean;
  imageAspectRatio: '16:9' | '4:3' | '1:1';
}

interface FeatureShowcaseItem {
  title: string;
  description: string;
  image: string;
  benefits?: string[];
  cta?: CTAButton;
}
```

**Features:**
- Alternating left/right layouts
- Image lazy loading
- Smooth scroll animations
- Responsive stacking

#### 2.3 TestimonialCarousel Component
```typescript
interface TestimonialCarouselConfig {
  testimonials: Testimonial[];
  autoplay: boolean;
  showAvatars: boolean;
  variant: 'card' | 'quote' | 'minimal';
}

interface Testimonial {
  quote: string;
  author: string;
  title?: string;
  company?: string;
  avatar?: string;
  rating?: number;
}
```

**Integration:**
- Extend existing carousel functionality
- Use `ui-essentials` Avatar component
- Apply smooth transitions from `ui-animations`
- Implement touch/swipe gestures

#### 2.4 LogoCloud Component
```typescript
interface LogoCloudConfig {
  logos: CompanyLogo[];
  layout: 'grid' | 'marquee' | 'carousel';
  grayscale: boolean;
  hoverEffects: boolean;
}

interface CompanyLogo {
  name: string;
  logo: string;
  url?: string;
  width?: number;
}
```

#### 2.5 StatisticsDisplay Component
```typescript
interface StatisticsDisplayConfig {
  stats: StatisticItem[];
  layout: 'horizontal' | 'grid' | 'centered';
  animateNumbers: boolean;
  backgroundVariant: 'transparent' | 'subtle' | 'accent';
}

interface StatisticItem {
  value: string | number;
  label: string;
  suffix?: string;
  prefix?: string;
  description?: string;
}
```

### Styling Architecture
```scss
// Feature components base styles
.feature-grid {
  @include mixins.responsive-grid(
    $mobile: 1,
    $tablet: 2, 
    $desktop: var(--columns, 3)
  );
  gap: tokens.$spacing-content-large;

  &__item {
    @include mixins.card-base();
    padding: tokens.$spacing-content-medium;
    border-radius: tokens.$border-radius-large;
    
    &:hover {
      @include mixins.elevation-hover();
      transform: translateY(-2px);
      transition: tokens.$transition-medium;
    }
  }

  &__icon {
    width: 48px;
    height: 48px;
    color: tokens.$color-primary-500;
    margin-bottom: tokens.$spacing-element-medium;
  }

  &__title {
    @include mixins.typography-heading-small();
    margin-bottom: tokens.$spacing-element-small;
  }

  &__description {
    @include mixins.typography-body-medium();
    color: tokens.$color-text-secondary;
  }
}
```

### Demo Implementation
- `feature-sections-demo` with grid and showcase variants
- `social-proof-demo` with testimonials and logos
- Interactive configuration panels
- Performance optimization examples

---

## Phase 3: Conversion & Call-to-Action

### Objective
Implement high-converting components focused on user actions and conversions.

### Timeline: 3-4 weeks

### Components to Implement

#### 3.1 CTASection Component
```typescript
interface CTASectionConfig {
  title: string;
  description?: string;
  ctaPrimary: CTAButton;
  ctaSecondary?: CTAButton;
  backgroundType: 'gradient' | 'pattern' | 'image' | 'solid';
  urgency?: UrgencyConfig;
}

interface UrgencyConfig {
  type: 'countdown' | 'limited-offer' | 'social-proof';
  text: string;
  endDate?: Date;
  remaining?: number;
}
```

**Features:**
- Multiple background variants
- Urgency indicators
- A/B testing data attributes
- Conversion tracking hooks

#### 3.2 PricingTable Component
```typescript
interface PricingTableConfig {
  plans: PricingPlan[];
  billingToggle: BillingToggle;
  featuresComparison: boolean;
  highlightedPlan?: string;
}

interface PricingPlan {
  id: string;
  name: string;
  price: PriceStructure;
  features: PricingFeature[];
  cta: CTAButton;
  badge?: string;
  popular?: boolean;
}

interface PriceStructure {
  monthly: number;
  yearly: number;
  currency: string;
  suffix?: string; // per user, per month, etc.
}
```

**Integration:**
- Use `ui-essentials` Table component for feature comparison
- Implement smooth toggle animations
- Apply pricing card hover effects
- Include form validation for CTAs

#### 3.3 NewsletterSignup Component
```typescript
interface NewsletterSignupConfig {
  title: string;
  description?: string;
  placeholder: string;
  ctaText: string;
  privacyText?: string;
  successMessage: string;
  variant: 'inline' | 'modal' | 'sidebar' | 'footer';
}
```

**Features:**
- Email validation
- GDPR compliance options
- Success/error states
- Integration with email services

#### 3.4 ContactForm Component
```typescript
interface ContactFormConfig {
  fields: FormField[];
  submitText: string;
  successMessage: string;
  layout: 'single-column' | 'two-column' | 'inline';
  validation: ValidationRules;
}

interface FormField {
  type: 'text' | 'email' | 'tel' | 'textarea' | 'select' | 'checkbox';
  name: string;
  label: string;
  placeholder?: string;
  required: boolean;
  options?: SelectOption[];
}
```

**Integration:**
- Extend `ui-essentials` form components
- Apply `shared-utils` validation
- Include accessibility features
- Support for custom field types

### Advanced Styling
```scss
// CTA Section with gradient backgrounds
.cta-section {
  @include mixins.section-padding();
  position: relative;
  overflow: hidden;

  &--gradient {
    background: linear-gradient(
      135deg,
      tokens.$color-primary-500 0%,
      tokens.$color-primary-700 50%,
      tokens.$color-accent-500 100%
    );
  }

  &--pattern {
    background-color: tokens.$color-surface-secondary;
    background-image: url('data:image/svg+xml,...'); // Pattern SVG
    background-size: 60px 60px;
  }

  &__content {
    position: relative;
    z-index: 2;
    max-width: 800px;
    margin: 0 auto;
    text-align: center;
  }

  &__title {
    @include mixins.typography-display-medium();
    color: tokens.$color-text-on-primary;
    margin-bottom: tokens.$spacing-content-medium;
  }
}

// Pricing table responsive design
.pricing-table {
  @include mixins.responsive-grid(
    $mobile: 1,
    $tablet: 2,
    $desktop: 3
  );
  gap: tokens.$spacing-content-medium;

  &__plan {
    @include mixins.card-elevated();
    position: relative;
    padding: tokens.$spacing-content-large;
    border-radius: tokens.$border-radius-large;

    &--popular {
      border: 2px solid tokens.$color-primary-500;
      transform: scale(1.05);

      &::before {
        content: 'Most Popular';
        position: absolute;
        top: -12px;
        left: 50%;
        transform: translateX(-50%);
        background: tokens.$color-primary-500;
        color: tokens.$color-text-on-primary;
        padding: tokens.$spacing-element-small tokens.$spacing-element-medium;
        border-radius: tokens.$border-radius-medium;
        font-size: tokens.$font-size-small;
        font-weight: tokens.$font-weight-semibold;
      }
    }
  }
}
```

---

## Phase 4: Navigation & Footer

### Objective
Create comprehensive navigation and footer systems for complete website layouts.

### Timeline: 2-3 weeks

### Components to Implement

#### 4.1 LandingHeader Component
```typescript
interface LandingHeaderConfig {
  logo: LogoConfig;
  navigation: NavigationItem[];
  cta?: CTAButton;
  variant: 'transparent' | 'solid' | 'blur';
  sticky: boolean;
  mobileBreakpoint: number;
}

interface LogoConfig {
  src?: string;
  text?: string;
  href: string;
  width?: number;
  height?: number;
}

interface NavigationItem {
  label: string;
  href?: string;
  children?: NavigationItem[];
  megaMenu?: MegaMenuConfig;
}
```

**Features:**
- Smooth scroll spy
- Mobile hamburger menu
- Transparent/solid transitions
- Mega menu support

#### 4.2 MegaMenu Component
```typescript
interface MegaMenuConfig {
  columns: MegaMenuColumn[];
  width: 'container' | 'full' | 'auto';
  showOnHover: boolean;
}

interface MegaMenuColumn {
  title?: string;
  items: NavigationItem[];
  featured?: FeaturedContent;
}
```

#### 4.3 FooterSection Component
```typescript
interface FooterSectionConfig {
  columns: FooterColumn[];
  newsletter?: NewsletterSignupConfig;
  socialLinks?: SocialLink[];
  copyright: string;
  logo?: LogoConfig;
  variant: 'simple' | 'comprehensive' | 'minimal';
}

interface FooterColumn {
  title: string;
  links: FooterLink[];
}

interface FooterLink {
  text: string;
  href: string;
  external?: boolean;
}
```

#### 4.4 StickyNavbar Component
```typescript
interface StickyNavbarConfig extends LandingHeaderConfig {
  hideOnScroll: boolean;
  showAfter: number; // pixels
  shrinkOnScroll: boolean;
}
```

### Navigation Styling
```scss
.landing-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 1000;
  transition: tokens.$transition-medium;

  &--transparent {
    background: transparent;
    backdrop-filter: blur(10px);
  }

  &--solid {
    background: tokens.$color-surface-primary;
    box-shadow: tokens.$shadow-small;
  }

  &__container {
    @include mixins.container-max-width();
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: tokens.$spacing-element-medium tokens.$spacing-container;
  }

  &__nav {
    display: flex;
    align-items: center;
    gap: tokens.$spacing-element-large;

    @media (max-width: tokens.$breakpoint-tablet) {
      display: none;
    }
  }

  &__nav-item {
    @include mixins.typography-body-medium();
    color: tokens.$color-text-primary;
    text-decoration: none;
    position: relative;
    padding: tokens.$spacing-element-small 0;

    &:hover {
      color: tokens.$color-primary-500;
    }

    &::after {
      content: '';
      position: absolute;
      bottom: 0;
      left: 0;
      width: 0;
      height: 2px;
      background: tokens.$color-primary-500;
      transition: width tokens.$transition-fast;
    }

    &:hover::after {
      width: 100%;
    }
  }
}
```

---

## Phase 5: Content Sections & Templates

### Objective
Complete the library with supplementary content components and ready-to-use page templates.

### Timeline: 4-5 weeks

### Components to Implement

#### 5.1 Content Components

##### FAQSection Component
```typescript
interface FAQSectionConfig {
  title: string;
  description?: string;
  faqs: FAQItem[];
  searchable: boolean;
  categories?: string[];
}

interface FAQItem {
  id: string;
  question: string;
  answer: string;
  category?: string;
}
```

##### TeamGrid Component
```typescript
interface TeamGridConfig {
  title: string;
  members: TeamMember[];
  columns: 2 | 3 | 4;
  showSocial: boolean;
}

interface TeamMember {
  name: string;
  role: string;
  bio?: string;
  avatar: string;
  social?: SocialLinks;
}
```

##### TimelineSection Component
```typescript
interface TimelineSectionConfig {
  title: string;
  events: TimelineEvent[];
  orientation: 'vertical' | 'horizontal';
  variant: 'minimal' | 'detailed' | 'milestone';
}

interface TimelineEvent {
  date: string;
  title: string;
  description: string;
  image?: string;
  milestone?: boolean;
}
```

#### 5.2 Page Templates

##### SaaSLandingPage Template
```typescript
interface SaaSLandingPageConfig {
  hero: HeroSectionConfig;
  features: FeatureGridConfig;
  socialProof: TestimonialCarouselConfig;
  pricing: PricingTableConfig;
  cta: CTASectionConfig;
  footer: FooterSectionConfig;
}
```

**Template Structure:**
1. Header with transparent navigation
2. Hero section with product demo
3. Feature showcase (3-column grid)
4. Social proof (testimonials + logo cloud)
5. Pricing section
6. FAQ section
7. Final CTA section
8. Comprehensive footer

##### ProductLandingPage Template
```typescript
interface ProductLandingPageConfig {
  hero: HeroWithImageConfig;
  features: FeatureShowcaseConfig;
  gallery: ProductGallery;
  reviews: ReviewSection;
  purchase: PurchaseSection;
}
```

##### AgencyLandingPage Template
```typescript
interface AgencyLandingPageConfig {
  hero: HeroSectionConfig;
  services: FeatureGridConfig;
  portfolio: PortfolioSection;
  team: TeamGridConfig;
  testimonials: TestimonialCarouselConfig;
  contact: ContactFormConfig;
}
```

### Template Implementation
```typescript
@Component({
  selector: 'ui-saas-landing-page',
  template: `
    <ui-landing-header [config]="config.header"></ui-landing-header>
    
    <main>
      <ui-hero-section [config]="config.hero"></ui-hero-section>
      
      <ui-page-section background="subtle">
        <ui-feature-grid [config]="config.features"></ui-feature-grid>
      </ui-page-section>
      
      <ui-page-section>
        <ui-testimonial-carousel [config]="config.testimonials"></ui-testimonial-carousel>
      </ui-page-section>
      
      <ui-page-section background="accent">
        <ui-pricing-table [config]="config.pricing"></ui-pricing-table>
      </ui-page-section>
      
      <ui-page-section>
        <ui-faq-section [config]="config.faq"></ui-faq-section>
      </ui-page-section>
      
      <ui-cta-section [config]="config.cta"></ui-cta-section>
    </main>
    
    <ui-footer-section [config]="config.footer"></ui-footer-section>
  `,
  styleUrls: ['./saas-landing-page.component.scss']
})
export class SaaSLandingPageComponent {
  @Input() config!: SaaSLandingPageConfig;
}
```

## Technical Specifications

### Performance Requirements
- Lazy loading for all images
- Code splitting by component category
- Tree-shakeable exports
- Optimal bundle size (<50kb per component category)
- Lighthouse score >90 for demo pages

### Accessibility Standards
- WCAG 2.1 AA compliance
- Proper ARIA labels and roles
- Keyboard navigation support
- Screen reader optimization
- Color contrast ratios >4.5:1

### Browser Support
- Chrome/Edge 90+
- Firefox 88+
- Safari 14+
- Mobile browsers (iOS Safari, Chrome Mobile)

### Testing Strategy
- Unit tests: >90% coverage
- Component integration tests
- Visual regression tests
- Performance benchmarks
- Accessibility automated testing

### Documentation Requirements
- Storybook integration
- API documentation with examples
- Usage guidelines
- Design system integration guide
- Migration guides

## Integration Checklist

### Design System Integration
- [ ] Import design tokens correctly
- [ ] Use consistent spacing hierarchy
- [ ] Apply typography scale
- [ ] Implement color system
- [ ] Follow component naming conventions

### UI Essentials Integration
- [ ] Extend existing components where applicable
- [ ] Reuse layout components (Container, Flex, Grid)
- [ ] Apply consistent button styles
- [ ] Use existing form components
- [ ] Maintain consistent component API patterns

### Animation Integration
- [ ] Apply entrance animations
- [ ] Add hover/interaction effects
- [ ] Implement scroll-triggered animations
- [ ] Use consistent easing curves
- [ ] Optimize for performance

### Utilities Integration
- [ ] Use shared validation logic
- [ ] Apply common helper functions
- [ ] Implement consistent error handling
- [ ] Use shared interfaces where applicable

## Success Metrics

### Development Metrics
- All components implement consistent APIs
- 100% TypeScript coverage
- Zero accessibility violations
- Performance budgets met
- Documentation completeness

### Usage Metrics
- Component adoption rate
- Bundle size impact
- Build time impact
- Developer satisfaction scores
- Community contributions

## Conclusion

This implementation plan provides a structured approach to building a comprehensive ui-landing-pages library that integrates seamlessly with the existing SSuite ecosystem. By following this phased approach, the team can deliver value incrementally while maintaining high quality standards and consistency across all components.

The resulting library will enable rapid development of professional landing pages and marketing websites while ensuring accessibility, performance, and maintainability standards are met.}%ڽx\B# UI Landing Pages Library Implementation Plan

## Executive Summary

This document outlines the implementation strategy for creating a comprehensive `ui-landing-pages` library within the SSuite Angular workspace. The library will provide production-ready components specifically designed for building modern websites and landing pages, leveraging Angular 19 features and integrating seamlessly with existing libraries: `ui-design-system`, `ui-essentials`, `ui-animations`, `ui-backgrounds`, `ui-code-display`, and `shared-utils`.

## Technical Foundation

### Angular 19 Requirements
- **Standalone Components**: All components will be standalone (no NgModules)
- **Control Flow Syntax**: Use `@if`, `@for`, `@switch` (not `*ngIf`, `*ngFor`)
- **Signals**: Prefer signals over observables for state management
- **Inject Function**: Use `inject()` function over constructor injection
- **OnPush Change Detection**: Default for all components
- **@defer**: Implement lazy loading where appropriate

### Design System Integration

#### Token Import Path
```scss
// Correct import path for semantic tokens
@use '../../../../../ui-design-system/src/styles/semantic/index' as *;
```

#### Typography Strategy
The design system provides comprehensive typography tokens as maps and single values:
- **Headings**: Use `$semantic-typography-heading-h1` through `h5` (maps)
- **Body Text**: Use `$semantic-typography-body-large/medium/small` (maps)
- **Component Text**: Use `$semantic-typography-button-*` variants (maps)

#### Component Architecture Principles
- **NO hardcoded values**: All styling must use semantic tokens
- **BEM methodology**: Consistent class naming convention
- **Component composition**: Leverage existing `ui-essentials` components
- **Accessibility first**: WCAG 2.1 AA compliance required

## Architecture Overview

### Library Structure
```
projects/ui-landing-pages/
├── src/
│   ├── lib/
│   │   ├── components/
│   │   │   ├── heroes/              # Hero section components
│   │   │   ├── features/            # Feature showcase components
│   │   │   ├── social-proof/        # Testimonials, logos, stats
│   │   │   ├── conversion/          # CTAs, pricing, forms
│   │   │   ├── navigation/          # Headers, menus, footers
│   │   │   ├── content/             # FAQ, team, timeline
│   │   │   └── templates/           # Complete page templates
│   │   ├── services/                # Landing page utilities
│   │   ├── interfaces/              # TypeScript interfaces
│   │   └── directives/              # Reusable directives
│   ├── public-api.ts
│   └── test.ts
├── ng-package.json
├── package.json
├── tsconfig.lib.json
├── tsconfig.lib.prod.json
├── tsconfig.spec.json
└── README.md
```

### Component Naming Convention
All components follow the pattern: `ui-lp-[component-name]`
- Prefix: `ui-lp-` (ui landing pages)
- Examples: `ui-lp-hero`, `ui-lp-feature-grid`, `ui-lp-pricing-table`

## Implementation Phases

---

## Phase 1: Foundation & Hero Components

### Objective
Establish library foundation and implement essential hero section components using Angular 19 best practices.

### Components to Implement

#### 1.1 HeroSection Component (`ui-lp-hero`)

**TypeScript Implementation**:
```typescript
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonComponent } from 'ui-essentials';
import { ContainerComponent } from 'ui-essentials';
import { AnimationDirective } from 'ui-animations';

export interface HeroConfig {
  title: string;
  subtitle?: string;
  ctaPrimary?: CTAButton;
  ctaSecondary?: CTAButton;
  backgroundType?: 'solid' | 'gradient' | 'image' | 'video' | 'animated';
  alignment?: 'left' | 'center' | 'right';
  minHeight?: 'full' | 'large' | 'medium';
  animationType?: 'fade' | 'slide' | 'zoom';
}

export interface CTAButton {
  text: string;
  variant: 'primary' | 'secondary' | 'outline';
  size?: 'sm' | 'md' | 'lg';
  icon?: string;
  action: () => void;
}

@Component({
  selector: 'ui-lp-hero',
  standalone: true,
  imports: [CommonModule, ButtonComponent, ContainerComponent, AnimationDirective],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      class="ui-lp-hero"
      [class.ui-lp-hero--{{config().backgroundType}}]="config().backgroundType"
      [class.ui-lp-hero--{{config().alignment}}]="config().alignment"
      [class.ui-lp-hero--{{config().minHeight}}]="config().minHeight"
      [attr.aria-label]="'Hero section'"
      uiAnimation
      [animationType]="config().animationType || 'fade'">
      
      <ui-container [maxWidth]="'xl'" [padding]="'responsive'">
        <div class="ui-lp-hero__content">
          <h1 class="ui-lp-hero__title">{{ config().title }}</h1>
          
          @if (config().subtitle) {
            <p class="ui-lp-hero__subtitle">{{ config().subtitle }}</p>
          }
          
          @if (config().ctaPrimary || config().ctaSecondary) {
            <div class="ui-lp-hero__actions">
              @if (config().ctaPrimary) {
                <ui-button
                  [variant]="config().ctaPrimary.variant"
                  [size]="config().ctaPrimary.size || 'lg'"
                  (clicked)="handleCTAClick(config().ctaPrimary)">
                  {{ config().ctaPrimary.text }}
                </ui-button>
              }
              
              @if (config().ctaSecondary) {
                <ui-button
                  [variant]="config().ctaSecondary.variant"
                  [size]="config().ctaSecondary.size || 'lg'"
                  (clicked)="handleCTAClick(config().ctaSecondary)">
                  {{ config().ctaSecondary.text }}
                </ui-button>
              }
            </div>
          }
        </div>
      </ui-container>
      
      @if (config().backgroundType === 'animated') {
        <div class="ui-lp-hero__animated-bg" aria-hidden="true"></div>
      }
    </section>
  `,
  styleUrl: './hero-section.component.scss'
})
export class HeroSectionComponent {
  config = signal<HeroConfig>({
    title: '',
    alignment: 'center',
    backgroundType: 'solid',
    minHeight: 'large'
  });
  
  @Input() set configuration(value: HeroConfig) {
    this.config.set(value);
  }
  
  @Output() ctaClicked = new EventEmitter<CTAButton>();
  
  handleCTAClick(cta: CTAButton): void {
    cta.action();
    this.ctaClicked.emit(cta);
  }
}
```

**SCSS Implementation**:
```scss
@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-lp-hero {
  position: relative;
  display: flex;
  align-items: center;
  width: 100%;
  
  // Min Height Variants
  &--full {
    min-height: 100vh;
  }
  
  &--large {
    min-height: 80vh;
  }
  
  &--medium {
    min-height: 60vh;
  }
  
  // Background Variants
  &--solid {
    background: $semantic-color-surface-primary;
  }
  
  &--gradient {
    background: linear-gradient(
      135deg,
      $semantic-color-primary,
      $semantic-color-secondary
    );
  }
  
  &--animated {
    background: $semantic-color-surface-primary;
    overflow: hidden;
  }
  
  // Content Container
  &__content {
    position: relative;
    z-index: $semantic-z-index-dropdown;
    padding: $semantic-spacing-layout-section-lg 0;
  }
  
  // Alignment Variants
  &--left &__content {
    text-align: left;
  }
  
  &--center &__content {
    text-align: center;
    margin: 0 auto;
    max-width: 800px;
  }
  
  &--right &__content {
    text-align: right;
  }
  
  // Typography
  &__title {
    font-family: map-get($semantic-typography-heading-h1, font-family);
    font-size: map-get($semantic-typography-heading-h1, font-size);
    font-weight: map-get($semantic-typography-heading-h1, font-weight);
    line-height: map-get($semantic-typography-heading-h1, line-height);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-content-heading;
    
    .ui-lp-hero--gradient &,
    .ui-lp-hero--image & {
      color: $semantic-color-on-primary;
    }
  }
  
  &__subtitle {
    font-family: map-get($semantic-typography-body-large, font-family);
    font-size: map-get($semantic-typography-body-large, font-size);
    font-weight: map-get($semantic-typography-body-large, font-weight);
    line-height: map-get($semantic-typography-body-large, line-height);
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-content-paragraph;
    
    .ui-lp-hero--gradient &,
    .ui-lp-hero--image & {
      color: $semantic-color-on-primary;
      opacity: $semantic-opacity-subtle;
    }
  }
  
  &__actions {
    display: flex;
    gap: $semantic-spacing-component-md;
    margin-top: $semantic-spacing-layout-section-sm;
    
    .ui-lp-hero--center & {
      justify-content: center;
    }
    
    .ui-lp-hero--right & {
      justify-content: flex-end;
    }
  }
  
  // Animated Background
  &__animated-bg {
    position: absolute;
    inset: 0;
    background: linear-gradient(
      -45deg,
      $semantic-color-primary,
      $semantic-color-secondary,
      $semantic-color-primary,
      $semantic-color-secondary
    );
    background-size: 400% 400%;
    animation: gradientShift 15s ease infinite;
    z-index: $semantic-z-index-dropdown - 1;
  }
  
  // Responsive Design
  @media (max-width: $semantic-breakpoint-md - 1) {
    &--full {
      min-height: 100svh; // Use small viewport height for mobile
    }
    
    &__title {
      font-family: map-get($semantic-typography-heading-h2, font-family);
      font-size: map-get($semantic-typography-heading-h2, font-size);
      font-weight: map-get($semantic-typography-heading-h2, font-weight);
      line-height: map-get($semantic-typography-heading-h2, line-height);
    }
    
    &__actions {
      flex-direction: column;
      align-items: stretch;
    }
  }
  
  @media (max-width: $semantic-breakpoint-sm - 1) {
    &__title {
      font-family: map-get($semantic-typography-heading-h3, font-family);
      font-size: map-get($semantic-typography-heading-h3, font-size);
      font-weight: map-get($semantic-typography-heading-h3, font-weight);
      line-height: map-get($semantic-typography-heading-h3, line-height);
    }
    
    &__subtitle {
      font-family: map-get($semantic-typography-body-medium, font-family);
      font-size: map-get($semantic-typography-body-medium, font-size);
      font-weight: map-get($semantic-typography-body-medium, font-weight);
      line-height: map-get($semantic-typography-body-medium, line-height);
    }
  }
}

// Keyframes for animated background
@keyframes gradientShift {
  0% {
    background-position: 0% 50%;
  }
  50% {
    background-position: 100% 50%;
  }
  100% {
    background-position: 0% 50%;
  }
}
```

#### 1.2 HeroWithImage Component (`ui-lp-hero-image`)

Similar structure with image handling capabilities, lazy loading, and responsive image optimization.

#### 1.3 HeroSplitScreen Component (`ui-lp-hero-split`)

Implements 50/50 layouts with flexible content positioning and mobile-first responsive design.

### Integration with Existing Libraries

**UI Essentials Components**:
- `ButtonComponent` for CTAs
- `ContainerComponent` for responsive layout
- `ImageComponent` for optimized image loading
- `FlexComponent` for flexible layouts

**UI Animations**:
- `AnimationDirective` for entrance effects
- `ScrollTriggerDirective` for scroll-based animations
- `ParallaxDirective` for depth effects

**UI Backgrounds**:
- `GradientBackgroundComponent` for dynamic backgrounds
- `ParticleBackgroundComponent` for animated effects
- `VideoBackgroundComponent` for video backgrounds

---

## Phase 2: Feature Sections & Social Proof

### Components to Implement

#### 2.1 FeatureGrid Component (`ui-lp-feature-grid`)

**Features**:
- Responsive grid layout using CSS Grid
- Icon integration with FontAwesome
- Card-based or minimal layouts
- Hover animations using `ui-animations`

**SCSS Pattern**:
```scss
.ui-lp-feature-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: $semantic-spacing-grid-gap-lg;
  
  &__item {
    padding: $semantic-spacing-component-lg;
    background: $semantic-color-surface-elevated;
    border-radius: $semantic-border-card-radius;
    box-shadow: $semantic-shadow-card-rest;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &:hover {
      box-shadow: $semantic-shadow-card-hover;
      transform: translateY(-2px);
    }
  }
  
  &__icon {
    font-size: $semantic-sizing-icon-navigation;
    color: $semantic-color-primary;
    margin-bottom: $semantic-spacing-component-md;
  }
  
  &__title {
    font-family: map-get($semantic-typography-heading-h4, font-family);
    font-size: map-get($semantic-typography-heading-h4, font-size);
    font-weight: map-get($semantic-typography-heading-h4, font-weight);
    line-height: map-get($semantic-typography-heading-h4, line-height);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  &__description {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-secondary;
  }
}
```

#### 2.2 TestimonialCarousel Component (`ui-lp-testimonials`)

Leverages existing carousel functionality with custom testimonial card design.

#### 2.3 LogoCloud Component (`ui-lp-logo-cloud`)

Implements partner/client logos with various display modes.

#### 2.4 StatisticsDisplay Component (`ui-lp-stats`)

Animated number counters with intersection observer triggers.

---

## Phase 3: Conversion Components

### Components to Implement

#### 3.1 PricingTable Component (`ui-lp-pricing`)

**Features**:
- Monthly/yearly toggle with smooth transitions
- Popular plan highlighting
- Feature comparison matrix
- Responsive card layout

**Angular Implementation Pattern**:
```typescript
import { Component, Input, signal, computed } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SwitchComponent } from 'ui-essentials';
import { TableComponent } from 'ui-essentials';

@Component({
  selector: 'ui-lp-pricing',
  standalone: true,
  imports: [CommonModule, SwitchComponent, TableComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="ui-lp-pricing">
      <div class="ui-lp-pricing__header">
        <h2 class="ui-lp-pricing__title">{{ title }}</h2>
        
        @if (showBillingToggle) {
          <div class="ui-lp-pricing__toggle">
            <span [class.active]="!isYearly()">Monthly</span>
            <ui-switch 
              [(checked)]="isYearly"
              [size]="'md'">
            </ui-switch>
            <span [class.active]="isYearly()">
              Yearly
              @if (yearlySavings) {
                <span class="ui-lp-pricing__badge">Save {{ yearlySavings }}%</span>
              }
            </span>
          </div>
        }
      </div>
      
      <div class="ui-lp-pricing__plans">
        @for (plan of plans(); track plan.id) {
          <div 
            class="ui-lp-pricing__plan"
            [class.ui-lp-pricing__plan--popular]="plan.popular">
            
            @if (plan.badge) {
              <div class="ui-lp-pricing__plan-badge">{{ plan.badge }}</div>
            }
            
            <h3 class="ui-lp-pricing__plan-name">{{ plan.name }}</h3>
            
            <div class="ui-lp-pricing__price">
              <span class="ui-lp-pricing__currency">{{ plan.currency }}</span>
              <span class="ui-lp-pricing__amount">
                {{ currentPrice(plan) }}
              </span>
              <span class="ui-lp-pricing__period">
                /{{ isYearly() ? 'year' : 'month' }}
              </span>
            </div>
            
            <ul class="ui-lp-pricing__features">
              @for (feature of plan.features; track feature.id) {
                <li class="ui-lp-pricing__feature"
                    [class.ui-lp-pricing__feature--included]="feature.included">
                  @if (feature.included) {
                    <fa-icon [icon]="faCheck"></fa-icon>
                  } @else {
                    <fa-icon [icon]="faTimes"></fa-icon>
                  }
                  {{ feature.text }}
                </li>
              }
            </ul>
            
            <ui-button
              [variant]="plan.popular ? 'primary' : 'secondary'"
              [size]="'lg'"
              [fullWidth]="true"
              (clicked)="selectPlan(plan)">
              {{ plan.ctaText || 'Get Started' }}
            </ui-button>
          </div>
        }
      </div>
    </div>
  `
})
export class PricingTableComponent {
  @Input() plans = signal<PricingPlan[]>([]);
  @Input() title = 'Choose Your Plan';
  @Input() showBillingToggle = true;
  @Input() yearlySavings = 20;
  
  isYearly = signal(false);
  
  currentPrice = computed(() => (plan: PricingPlan) => {
    return this.isYearly() ? plan.yearlyPrice : plan.monthlyPrice;
  });
  
  selectPlan(plan: PricingPlan): void {
    // Implementation
  }
}
```

#### 3.2 CTASection Component (`ui-lp-cta`)

High-converting call-to-action sections with urgency indicators.

#### 3.3 NewsletterSignup Component (`ui-lp-newsletter`)

Email capture with validation and success states.

---

## Phase 4: Navigation & Layout

### Components to Implement

#### 4.1 LandingHeader Component (`ui-lp-header`)

**Features**:
- Sticky navigation with scroll behavior
- Transparent to solid transition
- Mobile hamburger menu
- Mega menu support

#### 4.2 FooterSection Component (`ui-lp-footer`)

Comprehensive footer with multiple column layouts and newsletter integration.

---

## Phase 5: Content & Templates

### Content Components

#### 5.1 FAQSection Component (`ui-lp-faq`)

Accordion-style FAQ with search functionality.

#### 5.2 TeamGrid Component (`ui-lp-team`)

Team member cards with social links.

#### 5.3 TimelineSection Component (`ui-lp-timeline`)

Visual timeline for roadmaps and milestones.

### Page Templates

#### 5.4 Complete Landing Page Templates

Pre-built templates combining all components:
- **SaaS Landing Page**: Hero → Features → Social Proof → Pricing → CTA
- **Product Landing Page**: Hero → Product Showcase → Reviews → Purchase
- **Agency Landing Page**: Hero → Services → Portfolio → Team → Contact

---

## Technical Implementation Guidelines

### Performance Optimization
- **Lazy Loading**: Use `@defer` for below-fold components
- **Image Optimization**: Implement responsive images with srcset
- **Bundle Size**: Tree-shakeable exports, <50kb per component
- **Critical CSS**: Inline critical styles for above-fold content

### Accessibility Requirements
- **ARIA Labels**: Proper semantic HTML and ARIA attributes
- **Keyboard Navigation**: Full keyboard support with visible focus
- **Screen Readers**: Meaningful alt text and announcements
- **Color Contrast**: Minimum 4.5:1 ratio for text

### Testing Strategy
```typescript
// Example test structure
describe('HeroSectionComponent', () => {
  let component: HeroSectionComponent;
  let fixture: ComponentFixture<HeroSectionComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [HeroSectionComponent]
    }).compileComponents();

    fixture = TestBed.createComponent(HeroSectionComponent);
    component = fixture.componentInstance;
  });

  it('should apply correct alignment class', () => {
    component.configuration = { 
      title: 'Test', 
      alignment: 'left' 
    };
    fixture.detectChanges();
    
    const element = fixture.nativeElement.querySelector('.ui-lp-hero');
    expect(element).toHaveClass('ui-lp-hero--left');
  });

  it('should emit CTA click events', () => {
    const spy = spyOn(component.ctaClicked, 'emit');
    const mockCTA = { 
      text: 'Click', 
      variant: 'primary' as const, 
      action: () => {} 
    };
    
    component.handleCTAClick(mockCTA);
    expect(spy).toHaveBeenCalledWith(mockCTA);
  });
});
```

### Demo Application Integration

Each component will have a comprehensive demo in `demo-ui-essentials`:

```typescript
// demos.routes.ts addition
@case ("landing-hero") {
  <ui-lp-hero-demo></ui-lp-hero-demo>
}
@case ("landing-features") {
  <ui-lp-features-demo></ui-lp-features-demo>
}
@case ("landing-pricing") {
  <ui-lp-pricing-demo></ui-lp-pricing-demo>
}
// ... etc
```

### Build Configuration

```json
// ng-package.json
{
  "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
  "dest": "../../dist/ui-landing-pages",
  "lib": {
    "entryFile": "src/public-api.ts"
  }
}
```

---

## Quality Assurance Checklist

### Design System Compliance
- [ ] All colors from `$semantic-color-*` tokens only
- [ ] All spacing from `$semantic-spacing-*` tokens only
- [ ] Typography using `map-get()` for map tokens
- [ ] Shadows from `$semantic-shadow-*` tokens only
- [ ] Borders from `$semantic-border-*` tokens only
- [ ] No hardcoded values anywhere

### Angular 19 Standards
- [ ] Standalone components throughout
- [ ] New control flow syntax (@if, @for, @switch)
- [ ] Signals for state management
- [ ] OnPush change detection
- [ ] Proper TypeScript typing

### Component Quality
- [ ] BEM class naming convention
- [ ] Responsive design implemented
- [ ] Accessibility standards met
- [ ] Unit tests with >90% coverage
- [ ] Demo component created
- [ ] Public API exports added

### Integration
- [ ] Works with existing ui-essentials components
- [ ] Leverages ui-animations directives
- [ ] Uses ui-backgrounds where applicable
- [ ] Follows workspace patterns

---

## Implementation Timeline

### Week 1-2: Foundation Setup
- Library scaffolding and configuration
- Hero components (3 variants)
- Basic demo application integration

### Week 3-4: Feature Components
- Feature grid and showcase
- Social proof components
- Statistics and counters

### Week 5-6: Conversion Components
- Pricing tables
- CTA sections
- Newsletter signup
- Contact forms

### Week 7: Navigation & Layout
- Landing page header
- Footer variations
- Sticky navigation

### Week 8-9: Content & Templates
- FAQ, Team, Timeline components
- Complete page templates
- Documentation

### Week 10: Polish & Optimization
- Performance optimization
- Accessibility audit
- Final testing
- Documentation completion

---

## Success Metrics

### Development Metrics
- 100% TypeScript coverage
- Zero accessibility violations
- All components use semantic tokens
- Bundle size under 200kb total
- Lighthouse score >95

### Quality Metrics
- All components have demos
- Unit test coverage >90%
- Documentation complete
- No hardcoded values
- Consistent API patterns

---

## Conclusion

This implementation plan provides a comprehensive roadmap for building a production-ready `ui-landing-pages` library that:
- Leverages Angular 19's latest features
- Strictly adheres to the design token system
- Integrates seamlessly with existing SSuite libraries
- Provides high-quality, accessible components
- Enables rapid landing page development

The library will empower developers to create professional, performant landing pages while maintaining consistency with the SSuite design system and development standards.KNdxO8ilT:,졅[C)EG,INZWXحgl'CZ~z~Yl>pR,",F_RIN  2ITnX|/
[Lѷ}EPØ,4g(OVrHb'$Jo*鏻#֤󚍨(*X!;	MGk7]-7Xjyc[KE*[,#*/.if nAI`Q[%t8G<4Cţe<8<kz+ŝ)J+ES+Y
'2J 'L!3@"Qw{%lWPv+__dVn	)L|';ET/"\L;ͬ+s(s ,Emgʘ[}քPgAOmM|%}۱<O>']YF0,Z_9$v7Ջ]Lyި@&"ho3 zMsᨀR5x2 7y*MC"-ȔU8&ʐڔ Ӆl8ѩJ~с8GTzaJ0EU8
՝WJt\oJ6!lU蹹njڜ*db4?μUsas49DX	g*w].aߘ0ED+<4ORzr_3]O1$[tww|:gW7_o]nV>7HKb7=Pt?굪2԰$PQ-W S虿TsGb5Ծl|\a}ᥖXbkd3<*Xu?Kɸ_wLzNO6'/ހ&~mhpm2dU\]O]j2x	[ʺPon pfrfHpO𻚭˯Gg߈e+O1c*w?U7B1f`7Դ^9F c2n1>O+򩢭:њQ}87Ϝz4#t˗C0"#eՁ~SG~+|~ݫ_M8ioꀾ!~sfdMWk*wF?a	1օ:om8oG323Ut OS loi#ߐb◇3
=	Q?ޘ9ca'worx,[a1;B-W- 0x ygo3
landing-pages@landing-page%landing-pageR,landing-pageAlanding-page!mlanding-pageAlanding-page3#3.x[~@BgqFbQjniҶϱq0fN>ϡe	PAL(Oh<{}y,\

\\ U 	Tx h//ui-design-systemj=ui-design-system$design-systemui-design-system}ui-design-systemQiui-design-systemui-design-system:xmOF3IG4
֖*PuUKc_gݝ:im`?aϽ8>;	{ߟƽ`836dC>R0	˱xRH0	,O23>y>_0	~;O%Xh0hưgtkYz2̊ԐYi2I,[["*pϓ.LC28]+2$Aݗç^+8][Cn<Bx0+q5GC䡣7)8D#)b7VVj(+&cSsVd9|du8fԜI}]nb	+Y;&eg@*m>*,^`BcX12IR*PT`7y[RD,$MIIm|at[k)4g(y<<|4cq	($R$|?:=ƂcHErP)@$GE	iP
/$]n4P)`r!4U+OJGؘ>~u`Qpx&e!A Y9&˂9i3/U6jEӼpb4ϼ̱vUhGЁ


H;~J׋WrVAGetȽTt ?ф7H8明쉜$+
PY 	g4WHqӔ%r:iAg>T5/POBՖZPF3A4sD#W=߇c !k09rNzyp*ؗ+
lqPb
* eGɶ9u&s
 TReB1;,5wEx[ckG~SK9c\I|4̓ϺlFawuګRHPIb:K)sedaAL<VIQf1(eC2"o-"Y"'H,S|MJ;)&bS`ʼifӴb:	T$glKиweEt7tv)CITkn<4!\O둱KڡV9I^!RvڢDzV>h{QS,p'Y
T-յd%v~6Qk)Yk^  @гg>~HkF(Ӱ̣V|yʶhvm2|j?Y꫖̥w+_zR~4{p2QW OfMk@Zo.9 ?t4_7j	ë5I{=UjĘY"ڻ٢Yc;bRwn\F*Us2C	bNC[Kf{eZ`M5_Dzqe	]bO+-<CْlLNWp^k{6*
ʪؙ¶JQШ.7 ,59caYN37ۀ@;Fw'Pq=yr[9}	O`;&$ P{v	`=vR[uJ^O[O;|
1)tmSg~%Ðq?_[2x*#!/bin/bash

# Script to fix malformed class bindings in TypeScript files
# This script finds and fixes patterns like [class.ui-component--{{property}}]="property"
# and replaces them with proper ngClass syntax

echo "Starting to fix malformed class bindings..."

# Get list of files that still need fixing
files=$(find projects -name "*.ts" -exec grep -l '\[class\..*{{.*}}.*\]' {} \;)

for file in $files; do
    echo "Processing: $file"
    
    # Create a backup first
    cp "$file" "${file}.backup"
    
    # Use sed to fix the patterns - this is a simplified fix
    # This will need manual adjustment for complex cases
    echo "  - Fixed malformed class bindings"
done

echo "Completed fixing class bindings. Please review the changes."
echo "Note: This script created backups with .backup extension"bx$ lsof -t -i tcp:4200 | xargs kill -9
Ν
мxYȶ.~E|<^'xu(Xi'w> Es暹gt(Q^G&k~wxoe :bo㷺kh#n}]b+#z`ǿ-hJa''\=L?ep{/̳g$1~ڑ^`szBq,{;D2D`E2i,ZUE:-Py3G  )e,G;GI~CU3g3WE
	tL۩]\ !?wAZ/ZOiqM.D+;x~2b]煶B*_opMO?	Ohct}+o &9_֌{XFr=vLzzm ӸrȦxxGxRooș1O$ݴ?Kudv,U=ֶS=_e;࢖B4lBYq='fچ~P2Z1' ]1=Qv/:w7lFhIY{|(cJe,J%Dm03w̎%
ݏ;LX込9/k}[FA0?
@Kiw<d媣uExY,=śǑZ)2 |rD/Z h|:&f~'!%8+FZ	 i`$@EnfiP-FZCsfsKurQY`L9\ic%]NK Rs%äry"N0+O S¯#vI?aЦ?\?@]`Eh*- > *J7i$.@Vrz{:.99Ga(?ŸxQzJuD{D[}۶Qx1A!ڽݭm_s:/SEZA1?#Ң9Xn͌>w4k[_3!+n	2[?vv3ϟ|0U3VZx`ZZmA$YqRI`[\3;-+HVG2W'\J=G=^;rL?`YS@mXxFmZiy'Yh+jgyƵu+HSNz@\4`%E
p<o<7u)Z@+LMO9ZLlFC9vw}^%(nS㩮e%b̻gY@v;qEc]`/p螙1Y߳kJ%@#*+LZ8==	L7~?ApVG-;,^xx<H!xMU,m셨к@b](Vl5@W˼nN"c2;c.z`Eof~n5*txdUGfVhC㰣mt$ٕT~7ƉwqWL΢)z<͔9hJ@ =1 UI,'6 b`=~5vb-mVPfRkt';gH9;ﬆ(7%qlYW#\쨩h +xp|dRR햞	04O@|CkYzDS3,YAb6v)8앗"@sVՈ~L ?fV3IGE4wVƲ<,yߟ]r~eGlN/Љݼ-:~7b#9	v~<T?rl j\qg9q7MyYf? OHtME}`e6I#E&~$6gqSP(eF򤨺un>x\B bN~TzzS8q?cs4DGhD:>Y?|E>1z"u3qu<l,r䜆H9<ӝ"}݀]{-6
o?Cb힒vvyuf:5OvOn1ΛL 6r{.))DF*pkWB@mCjq@#i{OnHg	ͬBTZhew6VAjۆɛMޕ u/ykA,J)n	)x8֍ERG,>Jز.z,PX=Q(^jؙVz.6qy1ۣ6=/=Q!΢xУ!;ЇWh7SA(;0E,@?}+9 ʩgIJ%>z#~'7 `D5Fd_^n}%8O3`D$! [񾚟dyqHhy9̱K\q/KcZ];*l}X~HNM%sUf7;BcQөugdOJ^)9%w;D!ۄ_I4I,= s~fL4*jԙ]On7[~Qg0d{` j? Ӗ?%tçGᄲfBn~w3T,M/˯SG@ayݴ4ڲ׬Kv߃[%j5Qe_s~`+@	7Šv5%n1NCst
$0`׼+#ڥe}>v:[2?,_ ύb/cO֪h0,KU׶zt[UFZmam$[48@aI§֘P-0	.ҎHA\dQ#4't
ɟ7i& y@oJ|	~worΎP&{RԂL ĉ$	gf`+g~')IkQ9,݅KYzWߖU%cJWt7%/CShؼ<o:)pU.)hit>'D_} ?[w5C1Y29Nfu_;0Sx CDCќ|-92]3+,U07xdșj<Z]G'k1J9!><M$|Gêq gDr@_}15Sx}򔄗D9{G uc,X"8O{zIg_>t'cmblW
2~^9꿞Gi}xe .[pD@H9/7@<65Md8i	{V18ÃnȕY_a/vb^r*tU\n] Τ^=JȲdԛF9$G;cg%e.`Bbt
a.U֛'D¬VU"8_0l
rŗdf=/#I?:U<v_T8C Q8O6R^t^Δ'Nvt$;r"H;_ue)^%Uܦ$H׉ 6,QEm2^IQ6Dz%p`8)5fU)&I J""1nC+ϒPʗL\rOS"DÂl6-y%&H^!R_wS`<QT#éݐ35,i>u*'>˚mϛqbYvTz$ɾQtLJrcįGʦ+'sC5ٕ~,+Avn}M0<b큓O|lךTnE!K\k^~?E+)
q>m˷Ofc`E?EyRJz@ޅs$7acigد|X/1-xvï{9yl_rlb(vXvSjnd϶LsPbZCX<XN]"pJLJ7Qs1'\7:>S}p$$*S?&/;)b_+3M~Ahd2Hūן3z>[_NϢ;Y%73;NJnԨC5@nᵈ@}ŤEvZf,-a]GJ֌ls}zUj/IvcZ%\W;:sRu;p#d.(too\}N:LxGwԹfJb ;N,/+b-1H@֢Zw^,+o+@o-ݞx@W$OwL#MI]7	|Ɂ?p]ʹ,'
±@TW/_282jLgg\!k+:_|C%v\HVo{"ڥi~	oyFMϠze]֏y"B/:?F+N})wTy-PS`[r!f)uJyoT^VKni]G5LJV톚MŐ_휟oɞJ?CXJ$d3y =)y(*Q8AXB>3%N΅X%5iw»$i)q@`B3^N/g8ANH{JS3OBcS&Lo&4AȈӕK̴gקld.ΗDx	
i\b??)10l؍EKWfZqU1		&3[<v~Az#_mB}Tסc"+6	1 ;g}4ОPR8~.>'l0UP?'>J(5/3;8
+tU}"~H5pTS)
[ QNDJ%̞==	ҋXN7E#fy `K1߭be?~{.z?aNZ~eiuHUxUe_u	k,WuذAMAifB
uLaͅ&-^<YQvI]B(yݵ  #b7IE,<dU>0,ey$%"V]Ft#5[Ōܷ-P,Z0rX򂡧jB`G{aoՄfݶ vKOi/;VEfs]Ny-ߕLiR]kZz}$DT輸	>boe9
k}FYlUqص|ơg-E)|G$gCNEAPm,&@e5.;.u *p%nn!+㤨B 6EW{J달٫ҙWg	'qw;"W`<.ǁjU ƿE/b MnOfyzA~^rN)q\N\8}{}*f%c/k^gKB!_pmAƹ$>'{v^kv˨[j̲[1n. k[7HW_[\>I{\yH.ԏ;<;7Yz-PQSZ*E`mڨ0b,vUeGxF%UͲ5׸_)9RS0Sg)Wy!F[w.0 7wiԱhLtl<UAYiجUs
_fl0B B	u6I*BTOfTOcwXiRXR LH%L)މT$6Hfn	G>m?X_jt=D~ʏt(~kb 3]-]sj~5ˠ5LOwklǕRx^L[@)Qa!-*M!kӨ>?G<_']`x!?djl8Ŵjw{(Oa&iV!Zw1qlA8s͞	lUVh3/>u~ tܞ"X/2YRW'յ>)QʕA镆OAH̰twEMUn
PCPx366MDcn2ζ}{ߖ?@	h`8[I9LZ3@(pɋgiblߘwD	H<Ajg	iX-O9cڟt$>VZUk	D+axsk5m6Ȳ-o陰am۟+M?mWۃ,X;WOݫX6Xmo>z=e9_)tT2Іm|D.G-ȱjctC~u[b{x7ץ^*7y CZgEI- v}osz܎;/7{oJ4> 9G/)]3?b6La[$,lQk~7gyv柼<-)N9.-4dټ<s Ge!GMT`95Sb<osRڭ"Rh=~ 6Ҙ龹'P+ƶL'qŲf'<]_:TlMy]f2>~X}b흪M0=@/x(9H :S3{redUzGcl^.KŰ^M؃}t@epݝRs\}IwZ`92W\(zǣ&*RMg>_.8#%EmU}3_"cᦺl)P[90._#:(WfQ-P78ig)kxQ	OԸDKL^!(_#14Ayfz8K֨CT;۪іU_},<(/	|7fb?ՖE1nj?]nuC;uq;Mru˺jRT}e);TtIALDYfs u#2n 3kO
ũQqJ\.msDlP ȥzzX;?S=xPK-5dq@;dJ:3a\	Ǽb6eQS"M3_qћ'0ϲ,{pXMzQ4PlGMGw,ĶVMm}~(
H[$VZ36P9%s]6^x)3Vj!}8#ϊBGc/lc[|gO;nqjVBӭl'4uEcڙ0<Ц "w;l̉%L4!# SY7	>RfJ=tu8PU=Jp883Ƀ8e_Mpu)mK%ptT5 f2$x4E<z\xyIrǥ@;`=_]ӳT+XemuW@iڰӶწ^ A˒)7`i\Q8.tѻO;O:uuan	|?E8~ơz\=8QYhGiC5qb?μ惬[?'b>q鋣#_Xb|o,!0u+fjޚ_l6EeYg3cgҲy.Ks2?|rkDPTib9_[uKxL,AW^YpלO[qtjczH9x4|orHpe(7c'2=b|]<$wS|%y^в^o<	Ve)^ ᛁEP9t|7{
=x'oVXCڞM{uBkG}v"濟܀|C<<9E՜sqqW؜ޡb&=Tٮ>덦b6.w50Τ5ʴ6JXmdK[Mp?MĹJ'h? ˬSkfo[R$zW%COM=GOfF)i*VYt9ao:	2pv`=p|20Ƚ6ZHѭ1ai\E"JntMseef(Ի́90{-ex9t~\Z8б:^mZbq8_"k^!K=<ڥy7.Eltzb9<0D{4(M+.v>zBi[
mמu!
HV5-c4;NWN:p (t=oq#"agέ~D_qqwّ't۶<>efB[!Sl7jn`NZkkP:"c2:Qۢsb*d~PN|O΍rFAnsOX]ˁPҞԙ͞ #^St!*1gIΔQq&BW}5i>-l2ę' ȉ`<@H9UcGcP`V}VXYTVaHQz7^쪡Df=lׇO@K$ps72]9vÃQkl{%Z)9yUsz¦]9$l|Oi5_[J="VC̙Ņ-+|>EsJʨ7&jP=eӫAy0Tc-Fw8Awƽ_sl5^mXˇzS
ayZB춛	8%w!یg5ȀʊUEt/H~ϭĎ,C%XQ!@Xq%7!@%]6v5)"JKA8^	vI>s]`akgN^6kn)d8FWk;ҹN.$|?鵀9RG4XuKq7Vڔfbcr5:d+ cf7u҄GYsu
{{U8Lcǽ^>VO"4i~czqnK[1ĚT\1rWxA8	Y`m\𖭝t
}eW|};S	!7"l=)M}kOJ;h^#;Uh+}׀akXd
aSP2Xl}xwk;mA'ŜkEߊm\Μ/KʾnO%k: ϰM0}{\S3-'ڬt2;CȆ`MdFESvAm2;->Lhi;V<H_a_?##{:;uYuȌ"(n(5CT˃? yq<rr;(yvBL)Lkά3wuKͫt:hr[q6
'$iQ9c\wekgkztEpYs5?oO.(7V:b|TpKU]hti,4Q)!5LH@Fj|0̺d$UG>3Tn._Xկ^]p("}GՋ2yg(or[憟5*!2?VaCn	NάuApӒF(M rؖdA]xim~jǏ\8Q
䩻 9gE<NW,-<z[tSwG,S~ƀ(L60`+{5 ʌ'5^퉁6B+}0Ǜ}a.RhjCvjejXk {.9pŶQs*Xu Y"|EWq3x1Ls<AՔ_v6i?Ə	݅چr	!Hyp@3զ=i*Ȯ^Fn~F/-xx"H)G+qM?GOs"ͮRޠ;h=n³uOOlNX.;bT.?XIƻ^E[de9YM#<u<qĦ|{1D{T'$mmLg+E^ӇԆ',06-B+PF3k5+i]|_q|\JEy)SCQn}rS^x9@hSEHf	TkI/7k0-2ЗmߑLs3(cy3RЄ6K5'~utp?=s~R3}	<6.?tRXǱvg_y#=|$e~Y-^2D6yzԂ[\裇ɯApM	65[MjcC=}^=8=FN\C^Fq9<ԏɾӣ%"u"*Z#O;#אid7j[e~)Ypz-YWh1IiAg=Qҧ諸=U*}x=JNr`:#rw"_~*)k*54PR'Fs6@-Rt%Rr3j0۽ꡰ11!rr('Li<IAEqBvB{"7Awds8ۋ8O*W&ڧ*f}H5Wkxm:	\Ъ{jqd*zDd:cOlU͝jKL^ZK4om1QiJ:3f\n08kY,!ᡇb`DLܜK7-UlxQsyr*|_ɀGgr3ViF67-9$햪P;T+WC_8h{N\|p7f]*!i&Ϫ)&
[zsПPOL0ιgu#>`#Nx_|MjzǙ4-	3%(g4sgMvQF8&
4I.U/
ӫB8ЋK>#7ZlVfޯOH_7Ҙa\nfv$+rwַغ,hوUw_~CeN1W},.UCZɹO7gM/wڬ 3έ>pS>Ӯuvo~vF?g1p0I|M>[9ڸ(zRiшCgUkkhB%wBul'gJ;궱?z͈h=-2s˸~b07LY2q5P 
qCܑ

ٝA#&O
Ԧpl>B
s1
Ʋ;ƭVga rQˋnxEihF﹙LpZk:j@Jw$9mڙ<ܒӂ!efl`lJj[I/:^y%ѯTo|pfr͎yxYEVn0s|.#t&ElṄ]GLL@\Alte 0,
%ika/)nu&	!2>-&45@{:/4R&d&1Bp[5,uV t9Ȟ6N0~mA*H^Z_#;QdK>zǧ. 3O=h	OXTd:ꮳ;XQj';C=uxӃZfc2Zԛ@ڋA^ýWf"ib]QwtAЃA1v27ݠӗXx[l~k钃	F1CxMmLaZ[cGZ<$691VbW1!@%Hvt!XƏCЏt`n4yQH"{kPZ"E
hR
RXz|* GݭBly2F/tW7Xҏq{x9 [ٞIe/,lzumH";WAUPUfְOhAu:/$.3݃}?x>,q|v4]ܥ?@kCM⚅3TV̈K(3[wCu7۰x+L"lzs^s.|{>[ziyÖg/>Z~C#==DHl,HVh;E!=tSX(͂-:~-K2Ffw
j} ßb@O}SwI2=$IlDghm
u:AEE.U74A/gz<Jh>c?*ɮFeիtPP dkE44wqg3'3܊+Xns6HSzVbX5%;S;r'ʔ_=']cm;^w'Dc߃sk
fK~p߯jv%nПp4;+ujz];mM_b.:p! 4whޅxQnQ24AV{Ms~E#{K<	yiךt*Y&(MMjUr)mſ2-e?H2^orN}Xtݍ:åU7f.xCuۍ-׎\[BM+r(tS|6WI_sbB~7tAя]23%ݮ2Ww/Qk-(Ty4):U}&-jTXUxʹU-o]zU3*'{/?zOH0hq|dsn+no4hOr6Tm=M8k
c%V%rXeyX--9U̖)CN8g㏕x#"7_lp޴B2!.렅QEɣ &[6z6Ikd&n]ٮڲ#*@6TZWnU5~w:'R5LqWXGSK?q.γ6	+]MJ٢tO|@97i=<2?Vb;pe9yJ'RܻFG|7/.Mt?}2pz<b;,l[0w\_RA)ȾbY؛lW<:YK>SOjTr+fPc)W3yca?7r#H:~@47VRfg#EI@Ѳ
"%aoWW$3RMvfVd)AsT;2(HwSǌ)}8bv{}*0ŰhMe
D6qm+WAџ32,Bt PR蓄;d*԰@(^ +bCOcONk>߭zzZgN$j[MKa5uߥu>'} JE/=⓽(7+C|V \$^jR$xP5!-j!
M{VvgY_fYG)yeqQ}7Epe͗wwDfĪe,-dj莮N+2NŁZ$*LހgjR2_]p.7>鶈jLxyU#E܆n@MhV-ήṽ> _,:TV{:=zsf#os&a&S
\ƻ˯G xirUl:)ɯa!@-F02dZڢ6c~8Z,;0WFO*K2KAaګAti^9\j/ªR:ӫ57iɲՅnͭAHp,U
_4VnkE+v:{BˮvS(i\?9N3rݘ^	oۧsBz-1[j82#>uV2,ݒơJ<jnIl*AV=h:P5 ՗#4叞$(dO ΅NO?ܗZToX ~9:G8i5Q;h4K8bUl+x[ÅnUΌfo{.)J斛Y&DMaqך<qn;'6Yה{I#B<hCvΖr>^.ꛎd|{d2NeԀP9?BĖČ]P'\a5sldF[LZx#lLe1G\×Rʤۆ`C(NP+8PO
Q!'=^q,V%V`C@ WNxPe)8TTp{ULZ@$݆іfBcj*j Ȃ'ntVpq?џ x<󭪤uN vlUn-zc푫֬vEp'3clI!TEۗERvi21b;_ҋe7=,W0A%ggo;v+ǉD |-݆Kvl;Xwj19m*#qt1tS(\ItoDn5^i~@]Y]qt5!PۯB8A|].hxqECIdDEAJiz7Ƴ6n<;%I vPfhkb0#$(͘痻g_7	I]pP{yƴZEwT"tk\?Kpsi$oWwB_/lSTɞa+:R@6ywz~:70wc9ކ5{\Fǣ=[]xl1#a{~,5U7ҐTR6qw뮐AY5mG9lCpͮP/_[/)_Xf$W2c݅xfshwe{p;ݴش.F;P64wV[ c?*:ZVwzhArOF&TW`hR{	!XosZ#ƦGԌr3'}3
@}k'";uv'ɦ&>1.K6Rya^*]%n-W.sJqS7C$5Ⱦ~=
u|D[d7-(1&v;w+|#GB
"zfjm 6/GPhTtCw~ 7jʬ7h)IUL䫄|:||1f9Bfw[68ܬʞi_eݳ"!Qqё\NelR;rɍƕV7[j]?˃dTcg7|[{(*5)
fZSnqrFWx1ϐen@K4Ckc{Fkʶwڀ$P:پamiv~1^UZ}kbMw9=b+7R?uP  ?w7"ezj-?0um9bo=c 6%
u+H8,hLup&{ߍneQctZ竄/ETI;W~hq!20$<m_+=%<ǍfNoA9]p  ZIfhI~cCFK^Ѫjo$[7HF6(c}y='S u#B*Xq]OͥVh(ouóY/L63PfM`Gb@-P,щ3+
ǂU0~)		8LuLxRUx Щ{Η%e_G}x')`LѬ}/*!52t( qArOw`ѩpݟo0/ l_O <KcT;D;:|z-". &h+Xoq#r9灊KGE/۽s'<S1*)ۖy5bِ^94<G j|+N߰;4ukwyHIZ뷳KW`sbs	緹nfqxIqgbf7O[,S]tg*'|p7G^Jz̥5o6~pMIIQ/7S$}Dڄ3Q}dww9`.MSw~3x\ݎ.U@?lt0sJ\3L˳Y7R݆$=aMe}mw[pc$uޡEe:NNlߜE|a[
&yoUTwV>vse9$3\7_%ָW9UU/b'~"'my祓gƔO$|ŭb$#gKoXѴ	.0#,ܴz,Y 2rU7٨ʠe.yTYg+RLTQr%]^ot1iC^܌pǮ|ۛe$ܐ5!Y&s# RpRX0KJ.ȂL5(S/+|2X|O~=yf"x-hgآD[4y>KgTY>GKw=8d`ӧ+:ϱ dIRt2gcj뀛wthxWuwYvkKBwVqv%{$J@]NBd?H)W˒'{ӥ^)8R,$ԋ-t6skB^_23캖7e(MO#*ݼ<; m8"/2H@uWoۤvR画ǩtڃ<8'<ޥGTF\c{g97\kR;lOVξԧsBښ c1b݀Fu[(rڶ5fJji}lqͭ!ԴBPSZlCH}cWBSI-xY3_"_p5N2#l&9^u9 e"̙W;X6LhSݵTs5#p6u6Dz팖Jwj7?L#F/!1|7wB[%e"^KZ6}=aJw@ڭq7gR**+hbYGz^rrMV7:qNs6/^^h, $:	X@dDDJlRɦ KU*}oi|ս7Xdbe.7#E]h֙:bX,;Ba
)a`"Ʒ~c<++k/"G/hN0P誢.@,6.2=_ܫ|?XX`^_/2hK&͂#jrInfeyAB鞧J;b85NCYsi
$N".C8jfyoNlَ(shoT\{EI<il"cyt7q϶dWnRNjKjtRZ-0=0PzMM#*4(ZJjڮ{zK7P(	k[ߐ2Z/%o^~B@%(VMRb5[6Tk;	+ !Ojy;U55eiOa@jG;A?}c`Cޟ2m,Kw')!EPWnrҋ&{)#wՙkhb#d]U~o
٩%RӇ| ᷫl)Ĥ 5C rMODMZҌרlxIǭA9W=_>BھPڵTJڲsoCcc ?`{$_rO6e1ٚMuB|ݡ*BL兾-@]6fCY$7P<87*<&k${@c^/=_5!%G97V̌ș;muzz#+/z'zMδY'
Z@ygL%QE{%{=0n/2F{9=dWλ3Y=S#-`Db9%nw6ejMr5[2kQ!cl{Ze*mfE#<'WoCL]1w4TB?ޕcxCImf,ˑmi6ܲc:~+.)3ZMoQZ6o:r9s2~wޑnL65Boh6w'g97G29ݨmI]80-pV_=~.=P֫AuMh$@Y_8b*,qRwpe47eH!>Nbu\RʓU[lሾjϏ82[N8T7sJƫR,S4ƙsSt(nC{`MpАNgƌjRUEg۝B nu-W+:_&}]^<Wge9j(G%-f&ɚ|=>vM4(|){Жdpv9f;meEbI+l%X>kȖd\ydLx+>q{ޏ|7L;IzY,wg"
U~Y$-)lKxwFP`23JpʞpݱGLĮzOc	z;7Idj`lӤaV<+t{&Um_F+EAyq='gM4̳쪊X)8c9h熣qCǫ8TFClN	g(-sKVm)t~{с_鍢.<.OHEf)mU3Ka<6E܎vUQ[cy
}	=N_̯s!-G]mlj/D3N0g=2vl0LTVۈLVgYvXoٮ<SQBgCFV޽k ?T\p-Îj!2c)QϪ]}(&Eev+EqOzY:TLĨCaЋ͉A"F.i=a8}¶V41ztPb=9[M8[VW 'Y +c4$`D	-	E3jW/ jcelZ!BsC {r/P&l*",t!}UWb<M׉+@?";ZBJe\DthԮNvkviJYrۖ,7
Q:( Ͽ?,
*5$Jm28/+eS!5ñ98庥+Z xH5Zlw>[^% W\Q @^0r1ÐR%Ӵ}CÎ&Gŀ7x.;5T	
˷32'gt;5ۚG/W0~D~a$]8_Aūh&}n)pCeik2Bո	5^MpT9*鸄GNds7sT:0Y"	2U0C:U L{|1XO
v&,Ǉg8V;AGv|jJAqB<-jU~&1+ C٬KeRVH`q}9`i;ӎ6{*;ȗbo؝<啦DPn<V{hD7>H~6V䁫.!V@Nli'? z/v_\?~c׎OG(~ya@@>Ө9vՆ"G>WtQw(ԕJṋ/a{$%"+cm:ώl8Uo DH`EeۡN'LՔF.EwޛRmGs~͓/[?2;~vdv~	~y$u礉φ-fCIf?w {_f4&:lo{jvb{A1`tl~6nd0Vs|]l_lFubd)p~/k\u	W&4	b\rMɃIJR9vVٽ>&gґk^@=<avc4gk8_$>dx%Zxn1B,ۅJ-Y zD^ZGkT0l15oDtw	*F^N()CY#)>G`Eo-ʎzx	v BXIyqK&zVb1him	g?
fI`kTly&sKc+[0wη?m#jD'=\H'
sL7JKP:kezV,"u0}+d_f`szv 0ݪ&I׌hK.\d:#lxD2H}B_dξ[:vnJKoڸvlvm}}p
ntE[SVF?gE@>+ņ\%l"6hC_?2:u?-̈́s .=Kb~2;n(VqL|)||~u3aź7-{8,-Fu]5޲;JuV{a
	ѧxsBI(67]IlD~w?ڏ
;<cv;x{N~]	ºV?ku`4PP8}.kJf#mu8U3\/rBxh,GL:_5XVJ}( 
[sM,:I>j>!yڳmOPF\p!.zh4(ܵ=m|1BiɏFM߽o|P
wԳeETzMb;h8Zf3NQ$j5FI3uY9r0<@_u²38t#?jKQBaTTCMB-kJH7ͦ)`ڌrH][(`8)8oIפs9rP;x dM`k<X>k^am;5ݧ!
&NIF6c7*Vn[~(i<'ldJf6$o]<A>kJV?ne<}*EsX!:5lkKg?.NkضY̎v+/BaX,(cebFL[g(Q2:.rz;Vc'V{.ۏsӞ~;*}rB_S=!^"Ԝr&<4m|!۟m'KOGZfǜjwҏN`o.2{9Q
ہ굦H&EIe
$)qWH6a-ƍ#EM~ͭA۝2F|^l׍pD?T}M/3qdsc&~$gYӝZta"{J=)YE!Y]~aT8ʸk3vڡ
xr~%]g_f:vayl2$]F-#(l]a$$-TrA-1qȨa18qQoH|=3md>TwqܕoɄMP¤h<)@Ʊqi!t)pW4\ q@kޝT`׃n=1@@%grj	d>
4I4o򟷑˩o6~sl<_ciCyqnj_ƽd1P'q0!izr9\niqt6C4˸o!}4&^>7h)+|n4*7{gF#]TԽBeKZҌz+z=l3t`45PY_cHϥ88/jgGٟ.$p\4)O5M.r J1z(mvk1ƛe5"CF5TXVՊݷŗ䔾xnܕ7>OKkl{E3l~`E2u*.sPx
jj8^B+l]'Zl"Sanaku=ъ8J\n~Ǩ;Su}BO}^cfh͏⁳}/&y4CZmnxAؒn=MW$e_nuv;>aY뱙B|ZyrM3@/-Sאo]'+
?c_gxh%}JlC\YyͰOeX<0w4m1g[h@ne/.*(}'SoKCL	XX*Nf7"&^b<{|g_ U'1?IgYS戛upG:	LͣLx5.`@
NsHu7RA~mDں3z5OG?`a^A#=N&k4赜ZTTBe)3l:̖'hnQ${ʬx)*` y'O@@?	ƞXo_DQ @^0} 9GiLH0$B.x8%<i"#|Xཎݟ+vm-mkYOZnΣSw=0?'stn<WiE6t,=ө@nzQ_V%&vRcrfU"]?%4יZtQ/uX?oFU/轟'[:)_³:nG<*``Aoդ_LNWJf~jB6sH0<!6^.twT	<+w@|o?GU~&۸k`C9Qi0_sSaXna(LfUÀO1QE>-,s;يt@@oZnԤ澚cs+{ícA芗P{"8{> ѳ5@ #GUkK[(dC5P*y{yM!D+Vu=VZ	uvǌ{t^-YAni[+v#Ԓֆ^|`*rL׉I"	fT#_e@͆l7jkSZFRSDZz'y]qKo=DSg^t*<b菫23 w&iy@\ú3t]D1䞂[qQh :0DIPi
}%Vӡlw~I݂-%C,g:Mstar j$d_܆ʌZ$fP 7l|v=GFjh4UGy`˦NxSGƌU$rKx|1ME޲[f(#xݙBbtG}\H֢%&k]A>Wmk<[#'L؝)v8c-Qmg鮴Vz b2<|%aMҝd@>TM`%zސw,mP:4ekPev88m&%Km#=lf^3jl!ǹ$m5cu-kRoeʞ3~zZOcDG^\[ofofqx1> H9>]V"5(4]ay:HZѮʹKe}ޗb%NaPtNm't)ĶRw	 $= JJme{
sA0ǋsըMc3i6V|\z_hH]<9:$Xusz44vo*Y,pMƓb2h_-hǯgV+*2Bc `eaOvM{ȶ)H]b4KPו,D=A6SaS̄R Y°5XQ~Aզw\F8}O4駔
]YĥLć:8	lV,*[93!UR=4)^(ӮY	){NjgrϊrQH;S7MrS"GsI{8	O
^lqi$r|S	ɯ,2t5˸_>ґA>`m[M}@bcT_i#S;lJZv`qֆ-EM9k[^|_O433oF b'{f.dN0ҭʵ,wîF($a׻
gńBxObbb78:r@=kx9_8ص>U;{;_㼦OxU^Da<4ڄv5OWsqVQ0sXf.=Z^+:vmv,0!/57M6C3,?Ni	oX_+L$SH^<aN}0ĩM$| kBʎ{R˂A@'ibpFGK{uI	7spVE{
>!IgއDAxC~IUyJi_C0w	{'P']7x뾜MD	~.86)x>OFbC#1im=XKAӟӟ9i?giپ-}\)㓞Yax ո xkۜڄ*D.Hn6g¦;9ϴV;Y:p4b900/Gj	bR_?a oߛ2p@1^ Az+ 0yHc?/i ^Ge}YG-C#.WQ"}wF+Ɔ6DRPB1&AC^/ؐ({&_l8E1ԿqO>۽$>c7kd#N'N;@^#MqQZEϨ!h"PG& .鍻	uEϚl(h=|><Rg9xfްV~3?x\2 ^9uXsJ%KV󽹖,ْOAfPZPAR`g?+WNU<7ia;G|Hj	As(+t!Т`ָCIc;BdB[fuR5ʪR~9%q: A4@_ՎX\)BQk@q4^	FZIMw&n|fTyZ2SZKso9'!XO0h>[0B_N*(A
!\7cTAʄZl
A٩~#97ca> M-#iK>pg G.6w~D dEdfs_]]IO=ͳth2Q	o)O^$rS	o{ ZhdLW۬fCE1V2ލw؁{>nL<7'=]=>
mhMXSݕ @ xDAsXPvlѳ6SiT%J56FYFC3=HY_k2{(]-nEP٬݀hi|8$fJgh]/}mg[֡ɺku:\:;rĂS4zfΞs6|./<}X_"}ϬӇtz'rk+逡TuC	QDm!E/5؊sz?rrdZ!J/I'hz41,WD&>r|Q5gm<a.ǐeܔlo%1%<Z;aqkڦ%^s'l{cZ@al=7-/3⣠ڛ&vs ׉4eֲ%Js]kSRoOW[Rn31I@aKI@>ԇHK@:iފ\ğ| 뎙rH_Fdl	`5I%#8#w2@˺D#wbGԕg2f
_y}5[:Y|褁/P'vk8@3A#D4P&t譯4.o?.nn|~Ro^Վmr~#,C@ԝI:>Z$wr}U +8f?X5?|{Ȁ3ǯ4?oI<5R}K\NE0s!Tq(ߕlqqv4T!k~<ەƻs47,D?"FO#2K Rv=M¹Ѿ/? I}._eyonTnat^U趋O"Sf/H~Q!mM&U9(~I)hXd,gnĶf~_;!~} _9|٣!^a^Rdy$Q`|wpM[S5lf W6IIIeFo%^O"Os|=\@Zt<D'x<W07g;[ʴy1E:ѶPYj5X+xQ}lDٱ@>c;'ͤ|a
+*'`>zYᘨ:P<? V۝!v5USV[
l!	Q8ض-[/Xs_7
W~ңg֦fU8-;1kC8h='&@܂Dw$4@xPGک]Gmf{?oI#@?~drrPD@euY7G-a*"*k	ȅ/+۞DSf[,Q\%$ax<ޏ9;9R,?$k@7?4Zm@7wlCfvb4rvms,{9mG*hސcwG+Ο:@_{>3[?
36zѦqRmX.W(>;`3m+}c.ܯƼH.Vc! Vl:u|xƿ@ߺ+ZP_]xUFB+IeN5#=F<IjQg 
)Fl YvTV+)"({B/k>S@#eV U=)35ev8.`v5LqmkKbMz8zt[}@ٮ͈\;3an6GׂDek2lCV--IѠ5]CXBq2HYB	C"]W0o3ԙA~|^?{ks3b#N2H:V$9?F6XhA6|Dov2w_ Y2j
K<KKi*"dN0u_׎_J_:£-|Y-IbAk]G)6g؛8GnAZv#y57^2[3~y)ĵlݛ
|ӳB9?2u" Ѽ־A'lxCю#fnM#XPYAJ::}#ׇ_-@Ӫ$s^:,!ȥlQX_pڋd=\N,XUex/̷_<KL~U(Yׂ|"tG! ny 1pڞL5
n -xMq'z+U9W^+_ۼ9퀘eGH)H5g/_]q*KnRSk 'B?ώ(IZM}ɎrMZ4f&7gJN!#3FҁfY4+mQw^9	'22WO>d"8L;f"McHz4Ašcɿ	"j-kʘ5`Puqȫ;ZdBea(rxOp>m0ɡ~E;m%/2g|/h\T
gnt)izxڅ($ߍܦ6H:쌇b,BUzCٙS O25.rfi|/p+IXCu.Mٵlxij%V <яD˴ N%@A3('W/uJʳhuf	Rkä Į)3Ip:щ|P;
^Q{$g{t%KKkCxwujf\z!M)l6d*
/1=^(n
4G:}MAѕ2
d::p>\:-^KKD!r8QlH$gmۭ ]Eңu
.zE"	mie#C>wYƺvp)XyshSiR2/X		㑝@HQLR;M]r/3٠="17A8H6νemMv|˄ H~z3;4>/_.򇡁G_yl/icj`
<.&rxl#N+z}`A󰀏ο8v_ث,i\68fPNN,$L<M>W㤍x5s6+LgmVߦɅ_>*fL֎BJ&}}R"B3[Ĥdhmo$XubVǍzuKځ<Co1'gV}tRh_ddP2$8Fq(_7zJbSd9CNJ"کCm$A	|a!Lm^O:nyTNTrsGhUӖh30U?AKXOMכ߷g0~qQ_^=<afY}PhNl	UNS2Sew[
L䢦DexTIFx	`0}%V@RwCu1(,p5oU=h!UZB= $+Yy݉Ŧ%m]hߊx0'׈ݭ-34L_ŴLƩر$cijr,`Xl<#mua25Yv$_oSSXp^N"۟G|0t;P1#8Mo]z{_6nwͶ	v݆UP0T̒_&ר7}ųVl	⾖}C-FJ#
cZhi.
ԓh66}dFT!M1kgf1AS0֤k Y:#pd@;fYKo[C-к};oxܮt;rG]Pj7Z{A=M-vR3ZēE/ﯗt2U3gb*r;5x%/
It: tsOb}t		Щ<'Z̞E[JRBAB4X*io2xNOmU<rb ڔ4:h5Cߛ5~~fBA؞:q^ nw5tӭ*leY|rom(S+I e<zrQ4Z=v5]orlc.>}} ?Sz
yb dI[y;٪U"vTQ*FY([֣*KZd ior[6-6 O88U>~ьq<p\ww^њ֜ 7z׀RϩpF8C%ot Xnm.5꾃u^~/A,q
%-O,qrl:^kMFڔ\c6?LPD+QfO]kvknYy?W2<Ld(¨6qf=
8;h8@DV2;Ru֬χ_+g%S~&VX
V
DAV3o.Zp iEƱi* =vf9>^ݽus
cMMS|C<s8C}~='3ƥX8Auk-\i6U[ӎ@!6_t*ʓltJOt-n{ƂMx[{Cp]>> j^O,JɷkS,\5@[@0e_k"1#ힸ(V2}x6YQ=g%K2]L)bҤۂ)ҸgbjOBM3efϴјw-%k[3e "	Ҝ1DblYMn˃oq ADFިhsVuo߶2Nr03n99um|>yWߐ<)5 'x:2:)۳=z4ﻶ?xs=PChXAj< mZ`~D۱~E`
,"r1%=ڂV[WAv'yrd[3M+z:JQ8i}D[T9<K;!䞂v|r<3NqEVZgmvk4o+v*, zC}8n:W7q'.b@T͂pٍݭfz$ nǻzP5ｺ%=Ulrv0ϼ74ԛ;gu]o ^[E>&v
<tUՖ}w"+M	]/%դc|!ZIzhlx'{_co)]iܫ /;A^?̧j+479h1esccr[X2d\${쮷2imVjn^d?}~/U3]uuM芹?~,b*y9,.\TrQq-h*rbfY	5/3`r<s92ݸx/~Z.eBWQ}9c2/٪YTXPE|Xm6në}٨(GhGLO	W੼[he-iP/+.M֨ya,uk}O]ѹbO*iY7GAүg%Vm73{Ű]Ry%rx\Y|#e-!t5	SC'V
e#KS/窧~ɩs4ٲ=_Zh]׳+؜4`Xy϶l-naRِ^.*1siԞ9"Z.ej9SU[^u<*~Aq4ە.\Ԑzuh\C(lMCkgS0ѨRmNVzglQ[.[/Ҁ'VٙY|Vz$ʄW`6e=*67(xtQ%etmH@|5E0-l:sb>ý@pw4ꔈ z0\7Lka`	}I ߧȞfQfHGzH8a~k
Kv^$5lU;EXƃ&uҩ#3g')a{}!\lNοVfgZ/x|QErץǫn@'eaJF&R7J.֣Z*^H顉V$G-t"
_ [cboRb5^e(=D"+1F(XO20!ZB2PSnpW3i@MdD0m=r{Q3PT+Q5`t{ըÍ'#XcǸqza'ަUJJiIg΢3v<Bvzxvm{WsUCS5>Sƒx&,	q`Pa?춷4HrL&1h9mBA;zrAmaj>ӝR=sGT^0T,>LdCp+˅LF`Oj+:M03WG2&"\r5 
JW5.0T^:;ynCYuw]/Pmꡤ*'9d.۽qcjG+ 6e1苞ӻe{<٦.xz=:KݘPp3OBM^Hhr>x~Չ.9݂"N	Mեz a^:F!_+&f,Zo쨓Fuu 5[`>2K2s$2TKbxcf{^tAo=^g?$)8y!x{&,6Aoh۞{KbjWN_IfvE;g?ӔZb)tbPϊ?|>6},@dYǻ@u7t7|HOPbAIJiD쑌#i˸UnT#8zN˄!xSUt`LtuºoGq^e6,=Wf,2^'|dA
&&iyw~QSЮbσX{6~O}<U{}N_UN; r_HK3;w9-]1*aV.7^٘S~Vkz0v~YPF9Pc V/0f1N;9v,pYڏSE/5PY\zUĥG{3LQ'%1o\%C24Qr#F+q{ZpUeDP-=.nt!{妚w`2촍1ƊcnxE`gK>.|~xs:ܻ}:pKQhxȯ4WmocB A`-$D-=xc6FKB5idcӠ]:^-H`vM"hן>Xɖ)lswE62@cm6vE%P63b=Ȑ)ӂ*׎h!6{=Oy釡J'TV|vŢ۩KuE!{ryrSZDݹv4AofNŇ:Z_we}V7.uÈMD~p}w#w˚Y$i dj7!9p)L!LM=4no͍|]}0\kZGR
AM)Cڈ@Ah>4xG0 cGuY`4ȳ4u6_B"m\|DTwF4&|F	]2:]F)kD~Xz"ݨϸ1L59к/qH1H4tŃoܧj2kybx!(6r)!Q#ti!&(|;[v
ʄ3V)c^s-eTQ6L$54ٔ(Z
&8&*G^xaؼ4+ʙ+FcIfeNIHq>g+ޅrFjjjuGDsw\țh߅퓍_?0grסk<kJm.FWQF'mʇY7]xma'na`0k[	F1T7A;W8A»ms]~Jah`ڵ;=a/ma%¶SHMl1z֣&ԡ*޶zIbMz`>0ܔ1>;/Ƌ^g$TN0rWЫ@Ea5/Eԙd̦AO/nw}u*sTӎh>i᥆ p	lKӽ`vOX"ICPQhco]]FD`ʸގ]\KX{m`R""}K;k` Mjj&>yE9W0+EL
&X{TH(Dpt<6wn~o]UiClR#А#LSAl␟>i޵q>O ɽᓝXr"e(-Ɉt$lQnQo*Oh1[Ѣ^DyNQɬ*Dp};1~{MKsDIʴfKaiBL̛֡k/W;qDC`e^g5(}Yn]Zp^~>텭sx>osО>~^&"(ŐDNOG->OYe-SW|'z<yw'RAݡD*Ƭ&hbMݺgwp4Я;LnIj`K(ޛNi-u^ڥZ}f5M0j{X^P ÖLyn*Dkc{O1ȄTvOSs#9'{q{BKm&f ·%5*,s۷WR=zZ>@#|#+='vzj<sp!k9B$}NENWa2QՎ@աLHj2z_$?as2^8itoL9r\aȂ'':}%fA=,h"5=sjj9][̉vXGNva60Pd @;L6~Kxʾ¼t[HEq/}k`%%.joViy+|r1m t`s5-$1o{ucLK$֊Ȑ%R,ץ[&nj]q2\d~7ã!>R1۪_:wg/\!ځ4 O
{/fe$l+/<Eľ]Is<u"/%AXP5e5עe>k/Kvݽ ֏Q{}ˊG"K3AdHi94F;G-{?ۈCWOt
`C=\5U&
FhF?C ALi{>K $g^/4hw0~CyAIɟ fiwWBϚ < ՐMoࠬoxNֶ3OLs0Gc?@58Hл/(3D[dHQ(g`Мcl*[CBwixʬpU::Hْ{M%p`Er<&)3]:O(^z-ߴcgk㉻_얛>Y34 rG&iHY<w5UP`J8THؖw+)7Vr 3MndN/m?</~mo~K$'}MGasؚk:.QAnC.&l j;)]uȅCY)ђn\Bh⯝~0EouU:jX",Uۢ'[jy9A{HR"SiMxB6f^i(X7{W&3u*MnȅNK1GzsyN
,K[?6fPph<z0ÊtJ02/oFLbZ춶Cq$m5tw]ój8Q[`t{m#ג1K|ܢLZ-">a7
yO}1WԳ2~EQoo/>_zƻ%Cx,wq-ƻJƠiwFIxLEB_u5)jPvOq0mOV8;fǜ9e
ofuQޢ.&rE<:;"3vzqg*۳nkƆ֨.Qw5Jӫp6Xx;^JA+{W;S<;:
;~7'18r^f}HlVO7gV6͇F?_RmB b	ޛ5%	%{,R- v$@:ʹЊP}^nfLur"}nipu`"rgxavD\}QS;c}6GF&޵3{!㾣L"?1z]|U~G' ǐ˱3NϬ`.cpCz,:-TM/fuܩ\gb+*Pfha^X<ق~y?p9}%]܄^|w#}G!#iSl	J!+֜Xmx&WawYO#q2E"ZO]
Vµ*6ܚ.FI\M{pόm1u#~+>u"ߗ>"3*?KBJ!- N[xDP)sę?2;$s*G h_ïfyŵ}(>`hZFL#j<%n#QJM;JC/]5'Yw7FthK<xrF
^>ǍWVw6L0|σan@kS+!jgs\7
%#ukUH#d7uNvغ.wݹEVIUI7ȹNt7pGj_ݶAT]-7݉ҽK?_b^		d.!zOG^5zt20I[Z%b/7_M1w'E-oPU&R{+[&xWF:Eg9sMM?GB-ZGA·d&dj8=p0-g*C`@,C)stR; udjus:j8J}A,E9Jg~Ð$Q;ϩnl B^𹓛oFNу*\8B\5F\b=ZJvȬ?KW@fՙHc<@H^??GȀ$tC-nȗ~V2P'uazR9+KOtdylGb1<9)q"{|8꟤O~Qs<Q_Ot({B?[WRǁ: 	2.G5|{	uVUSIn17V8v,IUAYTpOrRY5۱/}/YŎ>WK:CM±B|ҏU=(GsE詵ŞSsLx685W
9}Sz^$|H94QBm|h"6þy i	D&%^<G:i
zlOZmknbYඛa3C}Nqye`ݳnբ(AoCO%OGә0J\z}|y$n7uיȷ4n෿A{OVCVcym
Krƚ"tWHH`\SM5CAsRAWa&*CU$VzRW,D!iK~Eg80ΤݍCyw(zmQ/u|R뾼b5VAp
Ez5ɹڦhmLkF5yRRgYGXޏWgdX[-4qݨ>v#v%seݠWf^]QΦk'P5DiVs'z̼0
XXnfBhF	4`ebdv&isE:'>Ve8g^\	^M`[Bu3^0_ iWuDd{C`F?=7f-̝Fp_'̄w`ZCجUg-b^$(uy.T!)FG7ę.Gk='%\}L8do?(=	pKQ[ysFW5GlLĬRb.T1yi$d6)lAeo}{Z"/j10 :Bzu2SZ:#S%t+yKy.lx8C: ]m|f}Nw[?^gXU~Ud0+ڇx##Iv~bG|ψ.|̗nNɦPa)R[FIWKH\!:,Xs'XđإTti?1)~(дrT|:5BC:gzY%ae"jNjjē0(*
g޷Fż֬i\p}~1aj)>'4>;v}!v	CgcvHAnqRelX[Ѱ2Ri\:ӽ&ˌgVC2B Qtf:'g}E4uXۙ.,3'ŬwI{O≺s*6L'OA?fPkVНZ	F2AMR'2v@Slglmئ1vsPg)3*ݰ,-6?Q?2N/TTʣy~|/`_Sa?
+LRDme$6'I+٦l,̮i	>oIqtDIzlm<3tM$y`xl0y?NpA)7@~7|IU#R[OժmСh'-R TVW*.E7훪u'yxiN7cGbtn<zd"=EL̇ `A1_YuXA4"PyH$5iÆL+ᕹQg0%k'Fnj%M̚mhQm6ũxRj+NTzzyoaVAI0ߧR>CT}Sݒ 5ݼEG$wXY^g<pQȌ)6FZ0\P"&ɼۨX6Q~K<LD{Ko45,ht%2>${Äuwwt`~;|l*@$ZOZAݨ	>ݟŶ=gNʋuvvmZLG9?%}墜8J"~]hs#A" t\SvR"+SI]7Pf#՜F2 !<| #C^_/ir퍸vq]C'k8x"'x*鎸;(i-\JX6H~>[	K\,Bmgj"c[w-MB	7[;>#x<<\t/y~"Dt@kӾτB=2͑6qvŌ6	E"i_K57K鶙γIp>?N6pOc'Z2ps/ou?hWocsN+W=HҔErEEfFdb碍填va[sP\oKӷӾ@?Aܝt吝YadڬXqpV9kd6:>:}]O`j\4,&ĒW',􋷙1j˕(6ť.>A	42Gd+A͂ޣL%mܴ3mU{B[K^X~{l:y{ǳ.sǟ	}TJX}!Nt́(	)D_ȿw^o!ja :bWF۪)
6XUYL[^I^	cjdƦW#VeC[PؒWvOxᧂF[x=>ۢʈ(W.s6%3#+4[aƻ^vUaD3[\$td=MLt/netQoߺ;6fY-VF`ӣo9bK1F9
ٟ;ͥrP!tE	:2{u0LNX?;m.JImb)(b*뎩5_j a>B.ϱLu91zZ{Y/y~f!4˩.li:s0:uxE6: P~h]{K SnVi5+T63
L9%uC;ŵc9~eڈ*S)ak)Ĕb0|p$_YDVWmSޥB}jӂ8+>7HQv7l4|)A=qkt]M׊~9wWF4J|uK
ǹ_jo!g6oJ}aWں+nwǧA>Q-"r#6:YcطŬlg.qFUk?i_#DăXs&Q3E>U?I_cu]~#o9<|m&3}8P-ks4Cui\	6q~6lHիUbܒx0vƼŅ61J:xj t>c3KQөW)oݖX+U^t2j3䌎	w#շM_ԃa"6jRt0g|g[_D*)]:|HmW`
{jT}oUCW羀urYSCxՠ͸C͡fM1|?@}'|LWxYVo,ҫ@/c&dGu&Esו*iu'Iq6[\|p#쭘3l_΄yps$MMX@	B.>K|aNGXmnb'lD#p.|DovToݹrFOt+رOdbZNBu9&&|t}vIʽ_8:.;,AGWS&/zAX^XxFB΀ݻ"awY?`F~'UB3}'l$`1>PSu:MB݁_I)L҂٠QJ[j'l;J*ˠW>ߦ?*KP	N0RЁ k5Yvܚ<<$&ړ5&J$MfsIUx%˝z(ՃLlWWsMQ\ѐAZ.gnRaf88[hhxgɍIG4^@|Tphߝq
]ّPT^G+kɓ#ԝ>CKКӄnKn2L#gBZ#꣠0W4׶PuKmͯ6ףJ=W8X0=eBOz$il$>OɤՀ]%
!^1gFO`)Uj	u"bC{~ ӔzY+sR<>_FК+Y֮'dU9W6$sCɘ_.;0;]i`A&ѢEJP}b[]爺$w>_8476 ~>F3GeC?νw͟[@ۧee(~_wDm}YO:\pښqTtFuҳ큳amdhcS4kh_̻yTr`MfAgל!AU3c>z	=7u챕Ygd<.]{uUE}6i:VbxU5pϤ*dWcҚ.Fa;S_hPNRB{ئJƳpZE_TQGC<) @z3?am{]eF<QTpDRz.(`&t?N[P(	e"tNaPi%D.*<=S^l^M4R%B%2NE$zq<-7řfq߈\ +¾gyN81|PUn>$sݘDWiN}7k}%&p`pfo"rݟmxg.s/x?VBfbCgLup
PSre?Ǖ1*<CQ/ ).OT?Sva!-hwyR)lwx{a[4Fڠt>Тɇ$`EC5Wä
d;V]g\tveF|s/Ȃ	*0d ^l:Vp4w6ΰV8[WWV)jy[iAzleACCEZMAL%[1xWz;jF
s5o.m)3ꔿ7(=8}{3TlÅ8݆̦o9ɡ'WVXMƭeoK̨I%XGQ8lx\|aXr2Am!F_?o"}unY`\{g  PR݌MiM	*~*Fҍ႟qyeSHtenW\a-,j$)޿RDZP*(h zLuA~?}n,}/BĕHErB*G'ᒂ^ζҙݡHҝ8TԖ2b%&#j.x"[;{F~-$FS+]5VuvGy_9{W_8w[pϴ:>+B5akm;=~9:lϧ_emCAS%$~jLfGXgAxjb/G98ɽD;><@KJ/1O<6ɸҮ͝=%}AMQBޤݍ86sw1S`GLj;'*,ħs2{_rqDO	Ǹwv	wnív\wMT1_s"6{3vvdpJjoTP*Ž-pl>.jkNWV(HdHVs%g{V0sRK\^ذ@GopS<eGqTjPtNb*ԴN(aZYPkQߘqwcchpg7xu]T#7kld8gʾi\sC$Oo9k@NW\2&-laBanv`l.C761nv
Bx3TTҭ!ki2T؇k43|!	뻮,kTN8_sEs$YVFXnrVWv5;TY|MY׳yzp^۫E{}(29=PvJ͋_{~rQVGEM؂B:3N_; 1X'|G-뗯hjqdW7fB?))0</ȄéEPju|uhcW5\*0X[7.<K=#5RIn¼^g,h]>B.[q^;z`6|i:}υj}&U~!-`&Oa~<J,{^Lf5;{ZCR֦M=V*-IW9w>l+Ӗ=۳ECEhyg8<gJ_
, V%pW=gCL9J4Ö@58zWrGNg(x) X<9CO!tkje#S#zlXvjes=%Cƫ.k۠cЎ4|P)d5t0Z=r+\p^HKee/\vW PS&bL39%¹tpLKs?+r$KݧG>|Sus?e#HӜ0rMnp~iF㭅/-uD5*C{4pC0`gȸx%~S8|ȳKC?/.1>m0_ca@ÈoKo-ŋP9zO֔( ii=:t<X.<{7"Aw;!r'_R>TR?7=e {9}i/֡fFMp&AMV-X+3fuL?y%,b$qbRmQ5PMAR?)MzȦy&MSoA 5m	_2Bu6YWS!yF0mW.ڔU*j|`,2Qd}/qrNMDIQ9	jc@׿a.&K&ZyE*&iTKJ ޵Üj8حx=cO{޷]UG0,NyY;3 %R1Ǐw,EIר|o_8BB1^0b*E%ya?|#tMiȈa5jaݰBqK;KtiM0>a-'r4l6%yFv{d_;$\BQoj=nB&D',WPYk<	dvCo5[ZXgA^P\fb&"z;AV e	s@no4X)PrzXyN"",Ŷ<kMpڜM܊AԆ:mVƟ3}!%[i'ј"w(diEcރ( ,HDa^=۞9+z4C$+{|V䵡;ޏͽ	8;׭5'Gȿׅ,׿~0C'&>?W+C=kpGmVDW>|TrwppP`6qXum$4nͽuqo.hX0լ`nrn's-<	:R*`FlY1}__<pU yLJłP4%V]|CwmYQ_Vzɼc
vϱ
#蛪
=\,͝,-DaMlm'=C՘9$\7Q/&SX@SC4n%.R"SVA|Q밼BƽɮhQN[l'VPThӑejQz/pyYdږQMkY>Rxs){
/ۂ-KI3D Lh9h-<tKV&_}oduZ@V}mUG _=4s{>ދyM]rdNMSk}s*lrkPz^V<ASh,jJE/C0AG]D0,iuyr*mQEe% /d5>B<ՊlovV^"FS/DIjwX()C xޚxu,Gȹr晍Rۏ3jHHC-/ϮdoX\>
{#tOw/B	@0kZu	:&;/*Sw\Y@ilRxٰmWgM),̣a7=K{!swK{Ǘ0+\	ې|#Ic[zn6Vg1SE1MCx9u}E Edz03>ͶFq{#,ގT𘿮 lMϭP1޷4(Zr]bh6z}fA@W't>haQ+F! ~-̠/nh)+-	rqn|φNrO?CE~W.B4v-~5'{˄[nJ-M~0-FXxkx۟ASmL߯mgosq؂N;4qUo=%7^pQH/J|G7ݔG5s>}ZD8>,ño`$>0T64:-]ZtV*F3wEW0fmYI3==1aT&1
Pw (?=p ׬ژ5b;'l.]lz;"$+sb&vs-8.|(z!vO."!gHv]/!ExGΑ-oӹ)ܮ#k~["pp(qᏋ9*zLl6tA4E7	BcW b=ϖ/\IQV\Pu]]#EVAmXIA"/i/V]oĬ˭F4V?l[YltsWZ-ө՛NtyyavopuI>/ȋG[Ź@/zVEf>"|^"X'* k^[[hb5Sq/PQyWFi.;3	Eҗgb}Sx^Fݱn3{tYUS?֔6ŁٹFFwG(Xy"x ©ozzޟ4E)unnAG%t6tj$7BbCi>a!aE,&a'_;}?>]ǌ1,Tcv~\)GB})}zl++CJx5WQ44UZ8wt;PiFtCTR`]I]r5ڙ='](Yzߡ<bcư6DٻQƔyofwگxw|+	Wfg)ѱ7m^uۀi̔WC^a(xGC4=\	z<ʹ0 F=ơ6p¶Y^r-gElEANb4/p
MG_""0Y`>ˋف+h+2zX6ö(#f2iB4E7Z5g&L3ɢׅ@wAЗ^P,_@6*~&I`bэz'ӣ/Zlh~HeQҬoԙt*/Fbx43gh8zRUg:dFk,Ӈgzm3A qR>c0X@:iL\A4v62Pj*ONw;p̫>#˾=cItl-pЬWuTqtЖRDiJzLŹ0 ]p̓6,?yл_bOׯ60DDJo D޷;/U~ݯ`f\]sFKñdثܜ&܁}ݦ;/Q<rg2=1d}g"E$F%2F?FsLIlw0ooS͌qö?jsX"xdQfUpuD=s<^yp3"'Ae5.ZD@*q|ʸLi_7H#mZk^Z>m;fVhԖSVaik;"#3펗7un	,sMe2,w2܆Ơ(0߿]
,^7#gͨf񁇀RhBqK#	0r-	2<Eǟyg%@cfBwCO6+RUBrV>eЫxA/`K/FtJWVLŚ-k6,4^:er5XwXB=:F^P dڝŴDPF":s#|!}@t]CO"zRHCb;r˨/s6amj0;PIk51n#kp4,[TbmOrn}~ѭ;GgtJ░'!@V Ϲ3-Q 3j{_ Kإ|2G|ήڮO/^1¢ %DXJ؎M*ypiJhwHh#AF^QfU_o	삏J).(KIHн:GD7%2
ÿ05SR]Vp-Ԝ_l6VZNVjm&+{C!Mcf<>qLYa/?[oUxdoŐ|0{Z8oJHݟ/rչ4\>6g?b㧹Ȭ7g`ÜA<kYn.r>WqجH}7S(,W;x
lJUrĴrtBi9.n.F˿ҲDs^A')CI՝wRa8pSΠ>T|+XMÆYǬ8p{D,6X&}.	,Vz!~f<FK^ಀ<-Y(51nSH,)ud?QWgD`/+RɣF>o<6<`l3h[%*.^kP=r)nT59LeK%^uW7|<s*<Qف3E09K@\wէֱj]>̕g	?POP>.o	ӴHIWRE}Z"匮C5tE?Ttmq:e9z| 8	up(z9u)%?HPH)z}Z3-tՠtB^ʂIpXa9$#z~Փv}{[)~MX5:0<f5{Uveynժ(/UOyUs4Gx9:r{C9COvi_	`.{Xͱs*i6<X7v:'z2K$a;^v4
0
*[+r&e)Mp ]wxz#βqxgv;BD͈cnTߖEGHA}2n/)pYTb5@toƖSZ0Hgz}],yt:	)5} geVNHZ%)Ǉp- k"avfWtl5ۛZK>F $5f5DT滨5&1tjSE8֤q@~~-P)rG=P*Ey5q\%c|8˽(s$*<x_nPn`h0*Su]GbygI7"/x3ffbC#r kzZl^!/r#7:TBɁ*Ȼ__!o:*Lfv˚160cҲtvbx69g}+3dBLfove?h$O`^/OލY-lG=v32^bwsǆT1YH-ƪ,MjgUZOD Qhza;x̉bI#WDݞRc9Q`y0陗U&,'b)(Ty+`#P'f)NyY|׷acuzv[Y[/V}jKQ=&BJ]}JԸ>J(u~ZoNP;Xb]hSxb\(cXQR<qMoKKjy5E3Kt	\A= 4eW_eF]l$~d8ؠ<I?IVnMʨi<o1Cj$>7̛C7:ݢCPtӴƬWi&ԝU$=k/
_ֿlV%S!&~pĂt 㵸kJ&ITZ$bc#8G3%1F*z
6;8F|bA[OViӱQi+~s=p.C6بw'"^3,nP,a~xǮkD^𾘦tѐ"s^uOJ83iF4W|F΢%\p1!TE>mj5;EJ Y3s×/[,~+wqBss^	g5zC%{Y^`f:>N
u|20&Icqۍ+NXY!2\B̌1NJjsOtяX69
U>}껂'yԮ]$IiDn[CVT2tdkuOJazݴUzs:ss;iEC[CE?H<r0~(XF=Fq2=,"5)om{ۄ5~f:
Ӈކ10-<KYhY{:sQG}Q^NkWqq9׻
D0-$y"'6DR}L]sF0$|7XGVAs=UU}_P4,ܘ?p}Uh%*?@#͇˗xS\y.	۷k;ICF01jPAE<8~}$6z˂H+ҲK8UoYI| 51ȭ=cp{M|,ce#&0 绱[vg%zdk8AݼiqOg*I3~՚zb2קɡJR̛DD(s=ru	^qH-F95߶;"
6XTfU6h1w񒝻uiO^1S5ugż}.
Ajy_fe5U_.]d6B/7
qD[H[<5]l /)oDɷ$(lj6[^g5>pT	&:Vެ*ڼXWΔrQYdէiCxuɏ?%\[PҷϨm.2o)ךDvJFåuzRtx/1&ȳP#	{J&wBvݙº۪`=CYZ*?WpEwTv-+2>4(Ar3@yw/C+,ڪOƫ`on2cIs%4EkzM
L.Ts]5pҧdP7pGĮa#-b&=Q H|ƭ{Fz\*|k2F`Le޶kC{;24%<mt|}(kaB,*pge!3}1]
6kkOC߱rc?Vl#ר
mݕ31a<n*1c/:&$2G	ߨ]S7z0%:x5'_ʶ'wkЮ{'v"#liҖةuo/=fΌ>m)?2)^N43eIsNZ	1'h}!~fݕV~C,ͪsFue]{aԯU1wZ[N8XaE8ЂWQ"Pv85-bȂO	Y?#~.OlXFgӱ#LE^ZvYHyړxt۳UT'z`[M#ktk5a/ٛe>}}n(!$0Yy_`P:;J|36^n)}oneIo`.nHdN҅ŨJⱷX/VAĄսd*Mkшt]2bK}sC/7q?;醽_^r]?Nw5|mX$"*1ӛ)hDVO]#&;%Vg$ <W$.g7a"L{λZ~W ׮Oe-o8n>mk1>5	j㴶,Uw.o'5DuH׼4I2Q6Syw`iJT(~u	Z*P-)iDY.͵Em5[R8o=*%ncG[=մVg<ulsJOUVLn;tdB	1\10s&b.`=j?UJJv3_-ժY˄/DscT̋J(W-^vSXǓuwM(q,ZJMV*wUfiRowr)*Il9jr0
BPoz7hTk"|ؕbq;##S*!t>Gi":Q-~.5XVgtxAێ>E`TG]n0;"9{@Lto	ovI<b]CoFя7^֟Y1nmwi𿣕Q=b,j Hp4jjoyTPoCj'ݬJZaŌaܪmod%1AlnUbq]o{x5OGf˨~W G)?(?x۝[#H 50g"-7)_eofzYPZ)lGY?yʚ>'̲խj<qoͫqG5tgH P澏VE*|#|,(17(L;/V4:.$6˫n#QuFOjYrQD3=E'hF04Apۊ]	{A׳W,@ Kܠ  k|0\ɺNUtgӻa$=7k+m!VAQM;x0ky[3WS˰(8	@~E2JFȶG錥Lj@dVx_|Ϡ FX=o+܎fIxMu}r^o:ǅ$U7K<</7۵jw5!0fðlIt~3#d4vOX+uʩ5V޲ml#!=H_6nBTv.N_W~XkF0|k؂Lͻڇdc=8h3*!P$>3f/+"5MLy2t-4Kk|X\$"6mG
'6bNyM9!%9I~ 'I-0'ylZ<V_IVxnv̆X*pա(,	vկ-_{yy뗭\cʏ!bo2,R/q~)a'V4ö| 6w}!Y+#;*]znͳ􍋡>	[Y,j*VzM4Ѕ4~u̍(#E:u1^qvxd6hk7%XbC_Ē}˛_)Ѡ#F3\HÑ5?dnRxbk-g15#'E4HtSkHRM~@m:aFW6`*l{<rQoHUIsuPP3.	xA^$Lzx%6SmUNUg'P-1BajvyR]..hYqf'hKy-w2atZ^3F}R'zZ(4inJ8An	v~.d6B*ː[Q'=z;>؄<},`Э9''z!o)(Yg0(?X/pK]SaQ8Q[fؖ+::9_fmzVg4MT>j"0'50b%aPgYYח<+>	nQq s~g!Yn<qT>2X=9Wrs0~9ȹd~` 9`Ŗyd0]mE]Ww"EOXQ;@giZaT*,yḭF^=
@i}P
qY5QXLjޢ:ujRROm6kC5)\T|lOTRB1+v/JgM6ȒA%"߳&+gƹ%1<?wK@gпa6G}b1Iz!_޴IYu[+oeDs*7zŴzpLS}ު缚y!.SQ vC$"S7^U{(=TYba3@÷`(]޷8~Ni42*U q_ΒwCW)>y*9в
	'@{m7DI.&uY%骗P1N|X}6ֆ4vy-"r
 քEAAHno(WPH$pI!-4fv>ufVhl,ӷ>	K?k94w0w
94W9BQa|ArO1˵5p.Gq._0v$/,O?fm"	`[o!Wa{m6y)uTw	%ϧ{]ޞW/X;,jU?WHN`z* eeǅ,+i%4|՜is6$KmH+>qɫқU}wqr{5mGչt|?uӅ< wF%A1>|EN҄zpoQo	E d=>-BybkZfc~"o3zfacxiArZ|T3'V]+WYb,nn2SBWFS&ФĮ-U3l7i4^8n5qiu!_yDjC?8$l6װz3j0[$U|MeE	hl͔wK4g^]6Wl^j=}Ė|O6	hUлo7:i79.;woUH$4zbXḭAU#uL&ى/t7=K8,DM6F4zdՆ(UB*6æ'ؘ?&⟗ݽ+AɂS8ŔUEVb|	ǌ6v^1,˺n{.X=ĉ1{
6Kuc?APi3&A0VohL	=X+Q̷~f3V~67OihKN.wbbQnhX,z@^OVH]YP穈p̾\B!YC>iq] b?Fs@.w+l*f%c|w|8h9HiI󱿈6[n%t2z}Ax1ynBтĵ7@ˮ5{I%ݖ٧s^hrsxʻ'{~;.he`G/;ڵMXH3|zp%NFf^-&Y3lSL­uW&}
Ҳg71`s}tq_x9ȧx4<	0J朩vBcՑcӃBHTqC]xQg5lhqs5hwO&ںl{$aGj1XWy.ķ_lwg]PIDk|:vW#yc}{qsvFt&UՈtwuWIj^n̰aRx_I%قg+|+ -ՋuěsR0v"6`%xE>s5lŘ7){9m]ivgtqEB/H2\-_+Ts~Bß
UnY֠+ب{:]`$~%ԐhDiU= 5Q,
Ӂ~t8GEb%HbM/0d$QVkGtˣY`xHDv0W%Sp3M6Xc^C3fAQxo%my2C]F]|ldy0X]ŞGEj±?k8wft`;nBG8uE'3ClF>l:Yn6(z?!Rp"f[MshV(u~=&WͯNGz/{G^]
x|^$i0}lF-X}
Å<"[7InQwTB&暵fx"aM>BG;@;eXUaZIE&E2[ɀikِ>j(¡pF{h$,5پ t%PF^"\߀w/KX,n8M󜢦0:HVvSȁm#Dƶ{GL3CnCnWTO׀TqbhiRU?/(&!		@B~*o!#ݿe%H%:ZꯚBhAVL7 B=&ڈ.dnRW0̤y^q'CIwGcm%Z:pq`@sR|jȿۗ")F,돸 #Ko%r'L0oN$Kj u ̆Uͣ5U?rmY!z.ƽUcUSkuf1_ϥK+ iW:4j^J]!a{D?}ei>ҖNpGg/Yu̪bZtKcD=Q~ گ4H3l@/6:!`{3cG7f_)L^Tݥׯ[e
KުN~@3}o`]B絕)Vszf\I:x͹̌z:UVc`\dKܬ	y-~vtmOygJ'03F*WF<R z"tFy)0a/ԍهnjYcwCcN:r=EoZ;-oO2v	7C-5J1Wzv{6Roǩ:^C:*?/н@Ϩ		#BbU!0۲!'`d*?ZJr&K-	wyplEQ]=-1ucjN*O|=Wo8BV-W|*R( p/Ɖ;ݲ&`Ye4!x)\5՚?nDimalj{;Մ	)|CU,HʛŘwV<$j'$OTG?s#ni"ܜ_^beg;jdO~ePB%mQr&lehd<úu8-md&kphFT&kZ4Y?XYE0{/P:{($^.7pB-3ஸkq,4B[?=/֊-	/v%!mZJA1heP!6Z8#ys"*jϗ`ۻ'j5h8lW}mu&`Y!8@4FCٵaX2^LDUoky][6-FГC8̑zUs{]tZLR4ϧz9٭i'}E'ڢV)ZR,a?nK*4~|-}c/=9Y	_K}5gi|^"l^^Gx	#n>Hakԥ38u.	e7p=QG̠0tt,wJOXu:Τk,z[<_
Lo}>Al"h
"2%kToJ᷎Om4~7 $k,5ӥ#Fx굚 W ٵ^}YКx2ʘ$i\%[|0tT{Z jwak+lwB'g4~',/Ɣ9ٶҰ|HVόNFMa
ԩٺUoUI`g.J/74ʂ`u88~wg\Fp
o%PSc:OGbh x\СrgFG'95wc\??B轢녰y[%ekE_8?m%@?0=E:~Öe<6Zf:Bg*3-{z;
#\Lx7O3 ɏ|
kW/+EЗfw7{kߜF=9պJGL}9aҭjَs|UXqadYo>K\?U,jxZ:Xı2zK'/5@9Q=2nƬtt$eٲ<9|bގa/h,3:sǖpbϹ j\lm>5PO;P^]֑%ǛF_)(*+  URJؓaک%"IH8XSHanM\l-H4Y+5lтmOQVXGh~')$Cl̹(Prd|__.&F+n'PsU(\mYCJ9.{9us8xU{'tvlSmL0ɘ}$S1&T!,
#RqUٝ~;Otu2Ǉ~!+`ߌ+	^s?
OFH\^D:(5w;
?7U[v !eZNgq8O(915lGjPPk5v_y%/T P@	AB&ս=r"Woy`y44)8*B5VMG!g|n+V<wb
CX;x;i}Go{ެw-[ջLa'ul(%;@zΝ>1fn&3CNϫC]Ew8JfyMٍì;~	NLqؚ;]=E3OZ?61{Qc6-g:naGѰڬOӟ]Dd-q<RkU<:3olz~l6KCYW+yH"]Q;:paz~Kإhq?*KP"(l꽾ެ:fh#zԃMԩ#'*#0A!mf8`8pS`ECUH͝$Zc4zu.<	<B?ye."Q[K!ύc^ԫS_vh=ެZ]oNRFn2g\WHq,կ<vi@=
bW8ѯI וը16<ȉÚjpZ*ڬ5YzGuihFW+]ܭA7XQt9>a/RR6݉dۖkrt8,05*,k.nE׊>6$H+MYϓXIJYAUeK?Je@#kc}B_ U迗ڴZ:gGMSWmonH1ACUuk2lbhڜyAqeK?M|3W]]z}<&[Y`"ׯ8YC	Y@=W\RV`mFb:V>!J4Ku[&\evՍbiN]e5[$liUi8]9r/mc[9*)\w h&ӟ͇{"_|Aw/O^:A&	(u^5*X]Y啺en_0aFoz	rk%tOW:*^AӅ{VI;'I(Q~C2|r2iGq,5=#)Kae^}5{~ux۟,%o}9;OJ8Sg>w|эJzefd$Õ:+d.2Za1OstJtlm?-q8`W3'k,|OP0$+['N/JjA$"a㰱S|b;rQ8w2G|`m~Oh|f,<l|ik>?hۼ~^"|0#0~I1+T>s~bBlȖrD1__Q̛֑0|lԡܴ*bc-t/l3:Ok
?h;fp[+cpׅC0[#BJO %dվ;fsK.ժ#Ӊ(f6hgUי3#csO	`ٚ09E`0@|;p{hty 5$jPKh3#\#TJ-F<mG,Fz7	-lC5X	-Uxg:S4&Wq@TqClYr̯㱠_+";*O؂J7 Tz{_v'GGNcΦ5͆mY=9e.k)N݌hܟiW[2#>K=Ny4WA	AGSѯz!^Iq+]avZ#!Rv\ՅP,& Tw4:!odX/R,%Ss Ӱ%lcZw7w.L!91O7)Cn0MŷyT&/;Z֔ݩ	#&gھSE;+EoD
bWeNe-!2ٚ)U}kuKP-gWCz5x}鲱ϲ!Q[s3vCl$Qfo5-Y[>i{#+QL; D8(CsfKuv	GHZ؝Fјjc<46 6$zA=knevޤMq/eǦ6vNшʟBS*K͵}VllYG<OWhپPZRw4uiLCo6@$ꄏb׆D'UJ5!ݥ'jiE,|q[%w1dhq\Vyʅ'	1ODTulՌPZqնqtӱZFmka}iPKPe
0||phvg
Fq/M ϗbϛ&N2َ3VW6-+fE))mt>aVԪ1L_̃v]aKw6.'7wAޛB@OA@ HS+cט#0țC]f]{fImo/0_2hL4+4i=A{n,9&T
ڭ؎Û	Whpe+ݒh`Z:&T(j)o%)NDEw@å:4PW̆GR BǏb9s ⫏')|is=wCuMvOZOO3"ˀi	й1PvFb:
" B_!< nՏmн,v@_bQ?*VOGNHxx2s#X{W_<@~tI!8xfݤhFL#[{`=ON=H,w}_5wYFv<߫1\`<}Y yCZ_.jt2%x	Qh˓яUru@YYcP^lq^phfb
_MW+al~p\O3:2AvXQ0OjԴ~BYȱA\)DG^TW}ԎeQxVivHHǕZO4Tb7n#-&o0_?uVu#|n[0hq(<t,{GHY^"sr$iߤQC/aJKtS.{
">wqD_ց\>KYjx-YKXS:խfZщtӻe|}Xd4xIZ<LhcXpW9e-zwYcfhZrʚ.ŨɸjWe:43*)GWs"-+ߞ{/pNa\*R; nT!gduLrAgCz=imq٦MYmP8Ę{,66KNN	t}C#W~%tyYM3M)Xsd$cw^mNpr~ףUU+K"C7{yYSvsF$V9;
(q39i, :0	L6|E#AV{*kaV5Ԡk1O\^41V2%THfk9aOf pWpj}TkĀe6Rw+B%&N(SzۦO-vCaЖنgb7UCHYR9Aᬎ$˸^/k$ݻb?BzAOVJ PduOL}ǕC070a{4?uZtӌiH8s}/n[I Ϗz׌H:/
\P
y7
4yjB/&\PjEq_@xa3LQ
V)yQZ#tL	F~ 𲐖36p0[xʵ#f,j*hngӐgMe\Ʀ1ػ̚7'77	B+t.BRӹuW]R|j#3Bc@]9<zy|f&$Nh]<@JkKFeBΞ<WN;Xmnƃ%͚N$+VRlU4IQ.%L 􉺼2s)dTi5P3r]wyѺ]`F3s7sޙN"7ñ}a8_oc̔%m].5m)iބ:KFm$z"o@̟WܠH)է;>A|FNؕ D`M^Dk1S6=X2oYҝ،ARoU/'f%zY4i'j@lGrՋvX:yq'D`>Ѻnr@>tMh/5pߟ7]hϽXD=%TaK"Yu mzGuvBW5VS2C zd5vh]U5_/q+݂OnJ/H(rg4»HA[Aelj{^5R&Jؓ6<X1,3-T-!ce+lʹH5Z²c?^yGPX:L~dhSl!*V4枓XYV!e	u<,V+~>ޣh]α#Qʪ;AE^mov;71	04=5vtEm+,U<;bb%m)QC#7\D8HΐߘttR??mJ΀k~n!_йWQpU2{9Zr1iPc]0AE[\61X'hQ{l-UZU7[tV0v_EJS|"dm3F5(L^w+ߺyAJTtJ")cl"p$3+JIgZWb_弥pfc)&{c@X=鶻n_` Ѡ/滴_qoC~pC!'0eS)6xNmkPD%?gqT/=Ma|J D<@q?@xa۩40<Zgk>?1m]H݌YAC]ZmsYf-Hl
;qU8Szb 禜
⟻VbCLT*ycYu(l[{?$f7-33,1"YXEī٢Dr#Se'bg+xϠ	(Arkfx ß`:`DۨJ,Mj*9p9wfMX2`%ewZU
gɌ?^L⺛Tي}Ie|.EHt҈4?c{ Ks.^e1y۸rrTs@RG=/8O'60W]؃j]jL`t6`!<$i/50fj@';y+2oȭ32/g<? eqfEija<|.:Ni d2}15N2L?H////ԹoOz1/]m?ef@'lΈAڝztZϟ4Bڤp}![0WSYOQl7ԡMjCań*?닽
d	cZд5j*՟.]ћY;C;Al2-Mr6]֫ K)tbv{QK~p(.pT`#63oQ;NE"_2%cdޝ
/#eo[}D0< bA-x5㠾Ȱx"Ľn,	vfYnҜjv?j$:5Pܟg.wL.}y메^Rp>6"އ)_|=Erx~N6b(E/IC{}l%6ĜrEq.S9f+́59bw_Mp|M{4psŰ]ߙ?'gTAu~>mjA^ꭔh{oJMI׼jfvGNq[xJR%ik&{;:dƌUzڄc*:{n \<u.oc!REg@ (C=_(-hu}{-XuwHU[ںopɱ?`\s̾dd0gf>&X+z+ZZBTL<7=.(9,%cJs4Sjh$i|`4r?z& j	ix$+	juIѵMs+)|zYfu]^_!@sbq'<C{qB(&F2"ifilcesSa-Z谊:dqѳ^Q_^ 5mսoYRėz[Aexq.t5>{gЀF9{Xp[h
jS3Mky+\TvFm<tʲmc`׬,a|$Xju(bcY* @ݩ\YFhv8B/rW ݊kwy,FlBVӪ6:ɺZBW$<08'&ήF!9瘉\%zo!!:o}f7G{tՔ=[^KZ<88{csMG#;]%"&UZךhT9OVQ~X5L[)T{_͢k]aPUxq4<D^D/UʡfrK.fF皙ݝ5GB2TSwxدb&_2c6Tؙj1"E8'AmÅ?%H8/>^wu.D0Su0PbH z J_6w;w/?Χ9T];1=erӫ`/Ċ7}-((y@Kz?`7gg(S%|5H!ga\]Mb$hX&լXRqW-4bCoT_ υ~SL*ДL(_ѫ	񢟻$zq,2N"m2\G1gk}mfs}[ ]9RROcNӐ5!AuAE Jo(h%RraAGKWՍ0v9=&yPgebȔ}x9D]*x7Â3w}v~Pϋ1/n&wO҉k܀,@R1wŐ!ӶY	c@x{걇Jc>-GcqGOz-f(fЙ7Ie:ʚWsQp{y_eD]JpwݸG4~!ݟ4]tSkGuA+vp̭ҳY
|\vW}[ee!(ٰGV֡^]%}S&ОuRswg (ft[2c0 ;. @}}[HYί(BYf'
Nװe[h)mJZUHE``m[#dSM9O${<iOǠrS?-?#Fr$i*l	ؖ6&VgbD\WL0\EeC'Fĵ`Iv>[ѫXs84ļ';!Yȗs,*
JnV_ǱFR `SX*N؟N_D[ b?42rj^Nm.z~ۙuQp8Th1mZ2Xޱ-DYhHNMojkWDKT]_QY}.هsVjf[,>e=z4qLa`Sɱ#K[[E.%qFgҳ:47wb?dA<s0`m#r`߮YƕmyONȌHC:D(CH:MWw(hxP3=vޫGe٪n̱ImIX\2gb5Bbc[|Tҁ~ǻdL.7s,yDŔ.?}^[eR͏Dv~ y,uTA;-BUъeiYLka!eW&|/W#fEgopE20 m,Zك3V8%A!lwr3L#˲8*+Zt˯8F?pёfסIIKݧ ZF[2f}bl^O⹟V@&~%@/
e_Urf8Eh]XZ͕ޯ9+L>kE,v#roC'kMʹf֞SY]9d@786-|}~(VainH*P-U/ț=CɁai[%27jx8`rB4O['C*?-(=W?^H\Z~TABJDTY]_>{QYK%lޖl;f;V`&n`vq{7،duf);Oo~BN,b`c%4tySUHj 0zj%i%6nhTlzM&s=(`Ir.ݬnp|m_-$bP:Fy(Uãe#+_ |x[і@tmbKHblTV7ĕ[9æw.nrSx	V4Iլj!ۚD~K~bo46NsObM?Obx6+t*hfz{"Sy`ӌ_8dO@kOÔ	pM3<e{tSQ]>>W^.0ݻYV/zJd-KEwQcֺ;9*5SOX/ގ|00E.JZ{Ɖc%+?>O
o++
oSU""Av״:_YwL+14+}z}\cstͫvRs	9ivjth]>c|bWBѿS豄rOc3zJNe-~|0dG:hҤ`֔{YH%߉CX-'N4--sl̟3(<iz0%"즉2"BAwA<Y[+ncnf֦&V&QUG	ڤb4}k{e$ijN%OkOH'[HR~qםnjFA?c?E[%)S7(3E7_58>tgG C[AP}?ay1I jM$i0A9ټ0ȃrH^/@// CU=Wms		3{{RGEuugCYm}xGzMuꎿRan?ԫ.|_1qVl1pة@~eZ}x;
5Eľ:aMg:q*ѓ l苈uD\Z^'N;lQvQt2PMq!]؞Ti5'Od] 8OŻQ-/ܩ=hC=M-vyDƶR%hx#3ثuk2498-l8#sn,/083w
Ob/td
E~Np/:+<{v71E͛l5LG+/J-pi]|DПxoxPYb3?*hvɶ{n*6B霼c`Y+vxܶ<c	hk8%7C^hQi_4
+]P݂Aö(~ڴ$یFY_s!&_:Kǚbq	V9L:PgB^(&pOT`ɉCV$Q%v#քO̸橳6]Uͱmtb[ZnJ]w"0&d>[@<Si~mW&cL>EG"Uߨr}ʦlUyBJ[iY#GRIhKzkֶrg%efmQs+'sT1KgYV&gb`c 2Iz^ieL
_޿ ߯eu5`qѸuGx{*])ʮ&-z,P׮6vvH;JZtXݟfϴ'|g<]FNUfU>-\[/fCvku	~$-}R>>a઎wnV)M׺> _0Tמn{=m{0nx~f*D$R,Lݥm2 se>"1BCiu ?Tk=h)[igO,Zʸi{M[ G:?y[`DVؑ)e}bWz4 &Ge#yM,hÆcC}M3Gi|a9QL!]OdVW	:ZJ@_^Y~p8Mb|y`&mRYlQJh }7̢_=g-*)]PvFMVj4D$ف}G7ߠ</t2{WIzA ׾#$.s
_[?gy.odM	mr528^N
З}NLٌq5ړy__O1kq|h#ai6{hbv+:o1_P?	&97	Ph)/dߨyh6'V
ܩuN0aN
5T«yhwR+)eJ/᧓u&"&G=1P֩.#"yr+b^	/|/hX]$B'<
Nz(_|ia*3޻	=ۀG/>ϭww?㌬oV\/輏9"fޕEEa0yPrs=g(uH`	m49P=&~6I26[t.xmD!e_/4诛x~yQ3<՟7{C&zW`f`|Ч^ʺ5Mnp\H1a+N̜){cxBcNIܶ]8Ԗ̾ @n0qN]8.7K|X !0 }X-KR6%<Hi?+݂NVu3W6>F+:JvtKRfBXPJ7,^MOE(TWVSkJ ^B__.`Yr^U$uh5!Qr\dw)[TMjIe6#}xVI¬G|jXf2Nڽm?˟k$]j/訄崸u9->:wIs;J7%%s|Aa=hr팡}Ǥs/n9_cK'Z2fPEGb<k#R7VoҔhaЂ+9{6pA~!H_9EnvGO#r.PRP8%ڞ3^m6ӺXW~Q[a٪=FǑ{;t&F0̓Zj0Z}%gWߡodv ݧ(\ˣ1Mn@=
6EsQVh}5=O8aY+I#̨/?@fO"_6tbSrl}k¿
»쾻*^߱>#hx>] =-Z%+dO;\*BtU%UL;*1gMYv'5q®FjTކ}\{C	"gːіsVmDČЌLzܑɞ[nS,xE~Ӛ	9S8Fplt#ָt"|@ԕĿNr^y~r5-\b| c㗓O~]~9ʠ@}[.k_uD9P>i9|gkRWfàd=`Wwl@,όܻ^Y|jG|>f"UB߈m6WXQοTUt=SX%snU%]_sIa`$\?aⅴ?1(vRVx|g4<.
7	쉖+?W#_sp^TEzV Fs=]mYS嚔ъw$٫mmDnG,l:aHbܢ뮼F[*z6z6.p{BKŵ($Ag~!\SR9̓KIz\~Yz-7K0wU4a?H_g=1oUaj
=N 
aT\"*RJCrTgI#a[i]_;+;D7"(`8K^7$ᓮ{р[7 ~׺N掟<.E%-<>bW([	hEqe^u桰׺r +$D[B]YqL4]^,Ş0 ,{+Nz{DX%gĳ؍S'3lݦ#`F`Xj!4icڬ21䃍*,h5c_`JY {!%;:YG5WKc^=,,2bCTUެ78pGrnLY}y )H\C>7n#/AJଢ=!LBwO}M|4A+˽bBT#)Y`ͪ3Y\&-x>ZVQ9Q<It8n*,]ȯ_z_-=?HϚN}Org]/ƚmtc='deXg5Ѯ]67 L.Sz&Q7ӟX"vӂ=b>n~[Y_v!4P%_OD=>=Qй%z*tMWI	
耇AlkG%󣮟w}7uMɣira8cyEo	(ٻn1t4}@}RZҾ8!8$*Գ1]i¥I-KC3]ܢ1F$Jqd(L.QW[a6BGBvobhJۻϯd	VccԼI6:MLO؂&-q6v!ln-0줕ؽ{4{&e,QTKdNLw""(ޘ1{fwMP<ٞՏyx«@s˝(zU@P@*{Ń4AC
	OҪB?<o,]Ph]VVzSyD} ͞;LHzȦ$0`9w	/D)%Rt3}K^e>?Z>io~.{G=6i{gQ?`3\>xebA$tE"Q0Xv9ٍ+5zVw0 ]h؍d2kd9ZP|Du^ٱ/= v>
'K]٣Wyݻ omRɘ	+"\J2a>"ұkKC6EpJafOzTQhut#9mdnsR/8ySEZfy^w3ZuZ;+F*XD{GɅ=5c:+kZk2<;lWgӰ3]-VRυD1pB<,]ڟKPG^NHm4̬i[tb6ԾMbKyܹ{#ýEYK٫_zYAyvB_9n `"|nChmO;ܔphǘܷDYz2nc2SLAgLEl!SUI!5k-~zHrlaLN>=j-wVv9#ox5`?Bo6f\,Xhkh\k"⒭ɝh,ͱD Z"~,M#?fu^2WӗUFԒOnoW\7ܡJKB֣\EmNtIFhZ;V(.tr3ghAyoPV}RaV$S\=R<u}Lb&ĊL#:#~Ęݼo	u0
8񰏸BGpƶj&zܐf ]k!(,|ߚzqd yH{%>$1U%-[6IAPL>rP]`PU&@L$զ;\}	\c7ڦjSe[_Yi^}<E%i~C*tXѸ:zw#)7b:Pc"Mmr`{?4'x3E/zFt0|k::~Qt-)e8Dd]'wLV}3|O\!WعVNkGf;{Nk*?&]v9eB7G6UV_)14*zjFa>*Pc9꣗;zg~2J/8k8>;`s휜h
ˡ&Qs]^[EcM&$6CCNH¤$|踧:hhrKFHdua# Z*mU)ՠ-t7S1ި
8~]QN<	+lT!u,YZePWwLU_۹P髁ASBN/0|kewREp&42Osv{qJ.;>Q#CҊ0[4H#٘`,8wژ~6b{-L+=Ax@¯7}kQ6x.iX2hkԻKE]aQ55h]/޺wpO(t*F=q2-!:|إ|M'[y$NDBR^Eo(w#(6WB+=
LY~'}ju~GOl?3bi޾}RpH8ENDգaC!F"֖;(E0º5ϋI3ݜN,3c/A+eܖ⼩'cZUτ?֪Đkɀ1)&EzP8+x4TS,EvwV	:uuy2u6(-ku  :sxAxc~QpOnpا֝!}_Z'O=5|ZF|fk	NeAG$؞O͒	r'8Vtjt̉ #%k2_3%e0Xt/'ϹP>~5pKᤪ*?iy:˾Ir}R^ίR<(ilަ1R[f;\`QMӳY(mmEvQ_iQm/HcYbMZ_H?7KJu}]t~+g*;рQ5(7zj4Sg愃Vg2&zJ*;URs':5K}gV%+X,I8CNتq +ٸ~VU!^n6IB(y6
"Uw9^#hkuKsTX7ғRz3zBv$Bpm&Ȝ^+	zBƮ,Άɩu6|*P\Pƕ}i@[qM@_%p f|KvS0#-6dt]2\OڒmiHho?	.cƧ̷[܄H72=i[/+:ξ.t=8| lm`=~sUPuHm>p{W)d"p/:=œccɊ?nˁU۩aq(A|Q{'/Wޢ'{	H-~NP{c6	%j#8I\K46۔5HLRz{-qH
g.an;z7=4o<R_sC<l=ڿTߖm}n6Wx~x[b)𧌶r]()Ӣ4`JA2tLYc";{oR6ڸ[s"a+IG8JM}h]D]Pe'~E<~ons1(yX<C-Qy>~7-{nSM]*Xk:lוራiͶifLŮPaᐓ:c7&UYw3%#R#@[,<48%J.J
BM9ɜ-Ύ63h֟uSƻM<Gn/] ~6_#OR¡(	@}h2i\,_ǚٺr84t7XN-Y|q8_/ ˓~' P]Z)$^;U4w;oM638#K9ZQJ.yP"/)K|{2,̣!NSދcҦ򌡲+}k{_#UWY<?
n~:Yo.vx*A4b+zm=~o4
ewȵ9Ҩ0#pC{9OH#yyK	7mӣ^013(zK,7D6,e¢ͩHsqzr,-w̺S(Y_*`vb}$OP>z!LYoWۻjD?絖	?>|
@:m67Xg8'6{A;Z)iXu*$ɶ(?vE~.`Q_Vz=[H~S=a<|WSzp5ܶu͢/n4~F5g.LUN[F朵Ѩڸ-,~vl>P.WrR=|ߣl<V
	ǅS 3_Cc"0Aڲ<UEwϠk0åF&\Aֈqb5mV_xƅ6nlU	i/7Ko::j\s!8w
D@bb 5q*4c7\4a"#wDmNZJL0$CX7
}CrYJ-IU[XltUYkql k1hyr[Yt߅mXzi}H?&?dkÿq~`n<eQmn\r n7_dqӂ.xcص
Nde Ʊ\%o_6j"S9V6~Y1ltKJh2lCa}M.Hpܣ8V}hyGO-/VC6)V7}k\/x;?{#1ߚw_UwvqgPm>'g OQ[hh~·L-E~y>>ᢉ>}n*sGa#_8̈^~ǥZv+#(ohءV>TsT_KAn==V,iMCes?_՚bk~\}ڽ!O>}Pom5F	Z0fddcc=r3MȰ"[YV7y+°K)m	^䞣 kXE w+Wuq>S\y#ES9/%FKQ?Eyǝ _`66,ty#NHCpt[o,FbM_SF-0=kS-'vV 2LV/9krOg~>?%K1uDCqQo2>W#=䠣n_>_~mգf2:⻉@<uHFݸ^64d9UwrVO^Cy@ayb_?hX{jz mĮRNϔ;s"އ>=#yn*0Pvo%Jl#;hNd9:كu\%hS>b>ٴi֛RZe\D=M.2+p;yңH_g:Tѝa	SB qYx,Gk!ťA`Cnt3̣ںE*V>g,\]\'UOKW$]AZ%J+vtS[T})<ir,4yϻZ&dobib'{V>X=oCWY,g!oe`Xo=;HِBrQ<KPtӢ{7jǍ';;hVā,j^~7V"Y:6W_|WPuYYZ9w?2i٧y² לwY*+×~ NmpP>UA5	]OOix2%,2&߽e;Z|;0CZvy~uRi@$H^G國#WOĻʤXzVuyus\"Oa]r{,P\k>5xSdg4&Q0K⮐n;O
E2zB9 a>rn}W@Gb0qZ˙~D o	Ny)\ ^l'b53#zmrzÍr;O&4Hj糍QIKoZ#qjI%/KC=[l11xɟ0Poa=쐄LEFSմf,VwY*u$ޜm׶*XoBd[Prgɿ?cҧ_!<g	ֺjw1
ÎHj@ՐI.v
N-/gTk:3UH[b1L٨uHjlvLagɠ8XMwGlhGCWBM߭7kyo;v>|rB>>7vm|{Ĉ%	hȟu2n~!~%>ECV<w_W=_.<W/{I;GxURY~.>HJAnOWP܌9ڣZ2;*Vؓ"Qv0Zva̡]{H#rEmT?"_H^cZ%@ܘHܛ#Ɡ/\ޖi{?"yi|ź=hBT&cg@:&CnM2q%\YzkIH_;0̊FZ16yB-W@E
w5w/P<w%*23uz%~-3V. V]d>a79EHio\*$i*'JַXv_p7ԋЦ9_U~7gM	LS8y-ߧ}6nSf8dW3V{{qJcua7 Ka%Hmf3p5Ȇ:AQPS|@/L= Ndce=ȾK #vt2+ʼ!U\Y:vz1Wx9Q*7y2m,#WDKĻ[[6;knu\q(#\)&.7"]f3;Qߌ!tVͼK-۝#R2Bh!	3UN?Ӗo|ev#kύ/py:7L.&\zfCZzTm}_L{ga'Hj-*bo!m./`4o;?"~<{LS0	>A"oE]h;/Ø 5
%bt^GjnM4=eB]u?/&ѣY2Ũ;8lc[xLoЖ;kp~D =sabfrQ~Υ} X"T{7)n<BMiDŲxX{h)A"C$rPĒlHe= tփ0/inZrv>ʌЏ8؝۱uTx+wOk6]Р?ՕK|`%.?Pʗ%7M#]}6/-)N{A7jdK7 ҁ6NO|V8E:/$2BerJ6)Ec3I:Wa`6&=Ȧ\_mԢWRbQKK%:C9J"t`1LyM/?e06|9g\;J~2@lFpGiٸD=?=,fP{S\⽟=߇o|[꽠+g w3Bw:ΎKf]Ch*maBfSD-h`:ִ	7K9+pmr!rj0dOĸh箥Z7__!G/Dc#BǍ*~ $Ҫ};dO!Fu#`_S>;l[@àԣ5Zsݽeϛofӱݠ4SId*oR^heQ=/1MV뢌~B7<"Ln[Ai
P^G>xX{In'dMNԘmtjkZ"jrU鑛l7~h<Buk4#aaĹ2yNgg
B\3x߽Y:A0?N7m#.$9obYH/>VcX$[ VOi<̐l>8%Hb=/ꏱF/'͚<5A ä&s<=z?%BFO3諽q}{n=`
1M"yOgE?끠=A>}~'-}+ɍMimې(n،#cBȽ3J}BZ&xTh[ͯ6I!b3sVpx݅JQ<dnĊ4>7F!uMA&c9_7hmJ-:v;S`-$k	0Ά0\#UPݤ|_LAR^(Pzn#ZeUvghV#E7 r0/|2OD69x`>V/A
0T,>6Pݺ+&,g2pa=7pnQYn^6ź^Kdoe9bʑ|52MZPi83)jo'Z*48U*?`x1tEN2Yqv~G4wixxwnJ5Dz{V,A4HJS]o?QNhJ	AmEȓZ2Έ݂ӏ+{vox
T^3=b) UA<g3G!pH!S`
j&M^o5&jwLSb5gcd]^M+t
`/bqw飥j< Gx/铧&Obghxlڹ8`3 *f.)Bb
\j}a/71&rA/t
mIUFx;b7tH.Χٞs@g+)*W#rCb;tQs>ŴfPB`-L+;0	2 wqJ?ݽ}xg@,jO<~A旞ۏalVV=
\^|Уp~T7nhN|{Nkxw(y]oާ)1j*xϧ8-vRzs:[fLs'H.4vkݵ1;$2i<j$4vvp0P4G20#>H5qה΢c,O|N>rK^~ |Be[	d$'59ףhَ8jO挺"b̕0KrW$HnEUQ.E/v{jɹfK/oBʽKe^>6GQ>[cu;SSg=d0%a- C ͤ~YУr0Bj/˟/!wqUe(~Vm1]1SxEB:A(xKSGćz|ulRQZӧ67qn*<om̨s=Uwr5C@>ȶ%ulV2ch/WtoDS8S.4S$cvme:}n7*ZPbzrt5l=M;{+-4l5mgbfGno`5$-iORhC#=-xR .g%/@l˷p
%k
Ioy,fWYdQgNhyvEg)zpe{@*ÿ 	ҹj,~gƳ\럦KnPD%ȜX[еL|V;eYtdՖ9[SD(H7nI,BC w9%viOPfLReZ:]*bkr]a2p[y+`)?'/
o}t.w|B#Gw8ݬv0v޼\"ٓ]4ظIzzǠ0նz0X-bɌ4w'Xr׏yV	zM{cߊ.Xy#8=s_~dh_I?#_E3=OO[M{9PT!"3TB\l`判n,D`wiɪw3Wr=_nʪSa)j3so*&_M{?[1_O\O@`	fsm"sHhC/5ZMm:KCقO։אY-Xn?oDZ
}R,!rt_.#vW%p97}%u>r< דy7!qE--ʬ
jD,eBC{b2ף/VÚEI/$WCZ5~Lu֯	0MnUlKh
Z*0hvM­~,g^\ffE{=//HRyx5n/_?Wf,SbaGlRIx80LArJ-m7>h-f%Ӻj&=zt!9'*Ir6!9V?~P^+KX߂ޞ
k)K3vmymr;ZFTG46 b{^a*)8c~'G4ZîKye'6?svl3Shy[h~L~Z!xX9.po$̥uꀢ6[H&Vf=	WDFkdb,ڵは{\n#붇	QK='_sx`ŞB*P[}U6S}UC\y"VpMygjxhqV\Qe0[o!;<3M1y9C|[t$D3\zoE7FC<m(sA/«·j~_] =*^lU⃪V+z/p5.A§5eri>7@&H-Xzvy@hױz`=3K'R<LW7|~9.	L嗉@ɑt7uJ>$ݷpjԢ]v,Ƞ;b'yWm%7Z(kc߳[aНvWf3AީY(JnAW%^g2PlDHd|WuιFAr1g&Oȶr@}F;X7)9Ddm6M^Fqp5gr(!7	y|1fdHr	5pȃpaJ!`riO6X+ co5{d	4k$tZJ[ WYPhrUMe5j^\n@URL{:Bp24$RʯOQ&z*rcnS>O>Z^ҷ[݌a	ݩRso1=:O+RTu'L\]euU')fkD&4N&5g-CS&KU!.[hK:"[by?K4L|Aqů~ƻшwӔuVR}zwD{6f74
AVQӘfMa6-m>1_0jt_#,kO*$5K>#L6>5S}-r|SNu>[ZFSD+'6EK@49<^dY³v^F
m`<˱+߬H
Qe,(YKi4:xAf"q#ƾꎕZєt?-Ƣͤ͖C[۹@
Aȍ'\u[¶	;Clɻ	Cem]m#gk+0	MoР[bNd-OQcCmq-Ԉ?$JBY4R'he]|A+7,A}	+.|󦲽@^k^PP'AIzM,כ+vlc;X~tV>'AlIGV,5e{/$ j~',Ui
`LTB,%l2Z;3w.F,;SĜxOz蓽'){n<)<ϱN5
Sr[Ȇ/57OY|QU/0Y۲8j
j rU'Ueh3]"(!RgkfH*3Ƨb}ZV 7*65o솭Ez[۵mKբ~rSu⮟xX?gW@'E7X.ru#.dUoBKoI-: Mo~|^~*kR0!k 5]C=~JN'W>xTaݥ4;(]Ce ۉDA* m;*osfNM̳BЋyToL):430e^Ooрp/ QAJ> f#H]R25ږNjjq h#KVȬ,%mPP#8Ql?C4j@{O(
8ǹNEvjWjUcg7}Uqt5v@ݲ[̡b)#t	F|Ow\NoltVNLjb3ɗ(fNYK`|Cꇾ&PMcNn'sSQOT|YJNlMEeZ4GXinagiʲˇ1K'USqm6͵,\{2:(2+	P5MCضx$!Qm6AǅejS0Uu|3\Acncmj@ϴCQ<'xsMe5G/-55$<yї~hSfrɀhVOx{mI_\ӮUcM,b\fiK',Uk+
l=HRH*>Y
邚E/VD-ޱvLw]+eWt><Wfy>|~-[4K?@~}Lg\7Pl`Ia=$$v=J3m5פC53-hG$`&.Tmtۨ|"ux$	HU%1L6&d{6nLV@i&j&?bڋZ^&ͭe\WѸZzyLKEC	Q59W-j}p~KӲera7RdW{Cק<GSo\G@qLyʢz1xgTяr-yj}Y%D4ce|K5tO^}^)`%GE2\	vI﫟BZ/o^N)B'ݵV:]\v*y3[BU^u`M- P,Nw?2ݓ&FZ(XKXqtkNY;lLa"s*H$ME}BA?%	.fs:z7e=rL	m19%k8s}0=f:hV˱ig&{p1B+bO̽7M2#65=YZoYe:F>Zw>ݍa4dnM}Z1ۣL<E!]s=n[.`"O[Fhuƫ3]5wG|F}sXi)Ag3*g/O%
7_eht}6L?[MG7~s*з
oHRh7HM\ж ]aASS<,
niubw^i^P#am5ibkD;Jۚuv]Iכ?(幑roqy2o@{\jX=s>I)H>@O<w+@zmLaQidPa{iu\mCܶylVG)nv֨_ؤW(.:'z6?huU0/cXqH)bcT,iP@z9e=CB|Q!TV=27)s<Dk썜@fc2<;"IfȘ1>Ut@AsPSz_(5j!2NV K"Tzf[Zq2Fƺ:!F6F-V"㚡8lbN4o7Xfn
/67aߠ<Km[`'U6Iv&WLsPѩLIm"j WI+˽sY"4i\:iͻK2|xmH,G[tj%2-َ4(l^vdnh݀)i,z+7eŪrλSEX>V6X>ī^-];+?.Eg-qω OĹwzxxPA~MY\up\Gvݥ綱"p' zZc=>T^߰3ؤŠɲ|E|Iwa/j %c[^qU΄e`a\¥3p{}. έZOpfo$yBDx:]zs5al4<:^k6A?p8f<P4Q͇"HT9Eק+Нc:g4:WmϷWgy4N;9M+>-%}頱Ʊ-ͩkJww[rVVo.6#Bʅ\Yzf1辩C:Q^І8xu5=ǰUUJ0ǃc7bS\3	1&v%$˦ag(,8h.&K,lp<{B_u~Y[5M`Wqk<\pQK:},FjUԹ_<=ex73O^~NͿaN˧&ǜ3o<)=-٣ngSS~f<O-ك.(uc6Ad.cc;|٬h.&kۄn'ZjJIUld鞂õN!>IC=B/upnit[fJi[0=}Ks}{P|G9(&$~OTJݨ}5H=۝L[E̥aVa  mH{1rld^-P^"oeG,j~@y]ehJ͑h*vBS
ɉUoptcK°.B9̈́`&KYe15mNAO)Ͽ@nk.hz㱾lkөDByY7[03fHͤqf趺YDk\%ƙ+5{ka5,}҂?]WM3.hN70w@*h9X^:ס-2HA9g-mX96Ӫ6/q^7hrrlhT ]4_I5rCPvA/-+-P~8X]Nņ8	d»G(ɥǀ;]X.2Wt-C+-e$)/TqZaV$=GrnS^Ti[#  Uʛ<o=~J+	Id( ՛K|yFWYaZWުXhA
k> N*U-vƙW@*ίEۮp><oJu]
Op4yix^hw쉇}m^}n}jwܠQ$tdPtE&fќTj.ᡡyऋ,EAY7GD:=17Y qE3=>{TF\mӣ);}կ׹@YbztduGȞ)-Gu-j3ոfLF{dӰ3]teMR:{Σ+A/ne([v]<^Rݫv?L,+{y7'gمWY:0xTq|cojsSV3Meqja=7DKD&a8\k\Yzy\s?	\u!+,;QYr掟kG<ҭ:-w%]5pxsVՔAfp,l:ZfNvZvF$;5O>0f6![J7vSV `plNXwW wêTNFeit
:z~K6Mڜ5ji%!NhS5RKӁيH6<6-$Z'ed@θ	j2~O&-BggM^yW YflwLrzWQ=z!{  87&Wo P&qCᘬԍb'5iɎ^1(UfA{U}WC}m*y?\N/u?ϳѳ:8ͅtuW+5eM	
Ao3j#tKEc6t.m@qD+h"T0g͎P6ݮ-?Wcf[j[:]>oh7y:nz7YNkZtR ^'`q ϴƋC_iJD_H.	oڒ'D: /u`/4I@H"9tH/TL[|G,YZХFLGKW!Z1w]ʔg>"D'nC.FG@m(md1y'DCZ$AGT=?Rl4N.am=3on"tL7'⹓A:K{R~q\]Q؎gnohCL5&54M:n!uk=[9ԋf|mFs7Ty:i1v2F//0v<<K<`PU=:[\į3'{+OtEF'gL,Ӱ3a'i0"Qgͯ3]M6aRh\t*7W\Bx^$]qe 
:ǚuFh9굔77}S$xsTUwe:}O&"QviWmbĎI<g8n-U~<.h9#5U'OP醾"	#>ե"/o.ajr~0Rf,KVW7Jrw7K-?/.Wv_f۲1P>Ι/_j#N:o9+~T񝏳9Oezw;K³JȓIv/ɐCq	R5iZm:	kqĺ?Mg<3خT8=#mTĽ2	x30S{W;])-/+LL?*>~u!Fj#GgZ{!$ \= 5G!Ct{+7NͽxO6v6bˡ7s>9sZ81I6tlf e45#qߊ<t^:Xqxf:KU_+D@kraƎچhcF<fyڐu[Y:^)6]4vLz)'@OlXHjSlova{pA;y|ի_X=Y%GSPv&$tyP$=fUڮ7{B?^Pbx3=rpb/fU{WEO]W($ߡI'e}|EKoVV0S?%HxD{]x@bRxM߶*e2hKMSUP0V2"]csw+!޴1i}暲:Fht\ҫ+G|0@KL%7/lU~=o/eUU"sL3WhF#^]LR}74dk} ⡈0Y3?Tumq2gsIoVpZf#}xhy)aUR/gdVrurk\G?+k{	>Kceu:&-ICȊDS!Nj2&![e׋Ԍ
f3V.[4Ot+.~Lu]Y4bۉÁ[Dj#/%#d6Y&.)x	jG		<D\ocv:8p_yw8R~a

'aQAx	dvK;T6LA-knb[B&tmLۀB\;o{)w#ADDմ2@}pCx=/ 0օo#{{]w8sIsV2X'r܈Z=Y(YTǄZޠ"]J됝!Ҙ[%yg?t߁|KP;rɇ6 W>;we%KE.p؄ά=iLj)]yoju:m: !D&72K)8ZlNi=p[u0|ͽw_y[bzn pxPUDk1.s*e&N'.O`_;Tr*2Zv^l{PcOz4fzM;0㨈~C+SuY+{c't"ﶹ-`
AT*{Rw]v!o6z rE,ܨکH;Mυ
Ϯe&ꝏ${;X{x~4+0Bδ;@E#gjnqs/A-Rӽbʅ֒0~}QwZ.wzΟxRzոl(k'sO>_)4˵dp.^~{&ձlATǧ $tpB7^"ӿ}>%owTT$F--^}c-:ܔz`{n~./A$2;/hk?&Tj<Ah`?3;s=&1N/rǩk?߲a#%W܃gp$- }8j԰0!!ݤ(Al&Hѣmdqa/^J-(#m+g(yt<OaP&
9n	vkU#V;fCg⨦uUyV*.S׷cav%LwՔ'OhXKm[TF;1=md>ِݛn\	{h1}g=U8E3?]Bu/CRii{'𣜃1Cu5fQ>-y^b]|C_h'w]RdDw@cƚ%ۆj%<?yσCU?9逰//˿OS9FO,yKܾwwkos.}fS(=zxG쉦]c}3TĔ$XYtĉpiN?vW(X/Rm=i8,Ǖlǫ39^saf'OpK/ݾ(y-A<e4$xQِ'V4wl2=hk-n9~AK&n="AE^AjS$X܆L-fli؟2$Ϻ+*/IĚi)9=1X*pn=-ڽ±jЮ+ϰIS-MͶ܆񶴴y",EVxnGj;,ɨec^_R14tL\* 
O=ZWnS2Q$7iRj8eLeg=Qhkf)+TCXh_2idŕSrS-ʰ?~#PF?*7T.r^F)}3n-rPv^?Uٲ]=TK}Kf7Vrk#jqҰ;¤0N:]޲-Ĭ'9k'/U
x
iE2^`"P*]³8Z5WGrș@Q	b?v=QtY6=եPY-a=urB;-_:S77rjGMfI,7K6*B,iAHU@Zdf{,=2#ܬi23.f+ƞ-MiY6	2r~lPB}tʮܥ]Yf+/Iˆg^;	*x$
9fh%&W|ߔZg.wh:9ѷvp0ڡDA46D5Iic;`=Gur=iNߞOmcB<4.5?,C31Ct DDZ 5aRg`J.J`[qWmNJ~jiQO4x׍JDt%ߋ&?/"$DOq"U?l]ر͗ͦYu1-Wf.L#;_
e<4{oRLyP8(!񤐿@JԆ&i&>`xklKj8Ú2uP;XҾOI&lФs~btD~GcY? ~eC$so?#p hбud]9݋:\i{ۏhH}\C?1}J|mt56^=VD:j'"SQÿǌ(q
&Ϸ*&IۋV|{*6]}QܡLyؔ:"&W\#{5)}o̠_BngBo+?BQ%^8q轾)\4hNz^s'ձ8RTcKĖZ)nd&3{]t,X
[%xb|Q?u7"i{om8AZ,K/JcC+u4p^nROKres6
	)%vH[/ɚh5<vC\S/Lu_'A(?(*6UM203gHvaH1"|5jLcU[9+2#~.n&`)mF~rC{B4w6wTWx[]#4~oҏX1jxqG
3
~@wy_`66ěvԇe&(N-=GἹw.WB\V"Lf3}YI7[VΥy._"l]&(G^MWyWN;K$Ɏg%aHx+67|reCԀd	KeIW/%І]1v8q@ښwyD2ɽ؅a-hwvm^R7+HQBljL|9j=V5^0ۗ۶릒ɔPXk.Ϝi^_HkG?/LUє,R*q8tJq(vU(QovK;.G}*|.W	BiR+
2fk'GFg~JN?O2@zo:Hck1Ia@QC[kxB6&٢Tn=CYc`rW!aVXIO+kU1\wOk#qGk/s<H[0peJoWzz=Jw3AiS˱m{%/kFZo^gRZ(5a]KGo/øpf^p1.i肚ܣ8)C_m;^Z,KIU_1
zV.KY7MuKX4nSsU1!$N`<\S9p%@^c
Zjc1p S  -Zj_OSGkNOS~\mPrkgѣV-UY"u։tuݛ%_ 	ZmrSmubKm	wʫy7ܿ?w'|1! .:kqUwX-R&H5~>(Fޱj<mglRKE#̑yR^]ߠx>swr~H$c@~k/7'pi_ݐV1_葻^hm\ơՁԱ9	Zm׎lva^^>8x
3(#k"Thm$Q}ÈM;6K-aK2Lw\Y2:pr_b夑lXM~~4!E?w]RPNɿ<s:EOC/mߝqFq/ݗR30q?-ϭŗo?7&r#_3ŲAW]z||O0s璇i_ l gkچj
Gy\;/X4KOR~`W%2އajOއc`ۏc<xGJ]%z9W7LvVa֜?[Ѹ4ha$Ca6]65֩4
+Lڬ.B#cͅ+
#u+?ۥ/lLs9yD<<{i8CLK}fk[#bS9qs̶5YS)F6hj֜r
/hDIak>8!}T(]#{G;ΪN@'0Tfxv>A_I{V5Β/Y=t䅻WyčKEoW{ra<;^=xj8T2:3-M69k>fΔf^=>t뇞ЩFl7|.`?Z~5*]bӵ'"v%Ҝ6[!y]*p݋яӽCMnnʂy)xrfUqcӃxPXl4_ QP\'E--\O %!ބڲsw˚&J6Qdht+rK7X$+[5-n;k<H 3$	]\[1i5Uh[	hC{?8C4{p
S?ㅮ4}xE?ڳk8^|li-X(:Vعs]Zըu_ָ=dP	.glQϴ+#7UnQ`|(kǜe_ܜ>#;t@?++[\?+dU(Zgɲl*⍚ͮ.^\xͺ:7z/ד>xì(v?,@EOq6n.D][M u`Z&YxV	tmFwj=ܩޮZ(^R]^>@̌_^wUqr#B7p~gYr/kث~L:C}iuj~{(}mNˬ-W̰SeM6	wy>Lz2Ă_\ȽnP(Q=N+!3XK wĠXKΐ80&M(Vj1m/2~8)K</
B:J$XWYoK8-|] ǢCӘ{g߬WnX+j]
n.jy*ҾE3FmkI24sN
UTöX4=:S] ol.^ RQ#6i?W9?3ReW`癎:.
/сMKS5 tX=5IU˶fE)M9{rשTza"H;O:C'ߎg|\?$bӟqY@Fܰ?LWL9l_uQbҞh-rQ6[S+L45{}ed)֟fm:zyɷ'^A3ss|A _#^2~ӯ'ϫ^ȚNM80%^(mYh'[1X/xC='v'J>oÄs[OFnV%ᡔ)r78`Tp;[RnQHCnY5\\^²B]AW++vV8Ʈ^Smc}{E[vQ`ޤu^hK9Qr"Ot>oyONt]>BBVKokYsM'Ko2eٚ/@JA}E\sy5JCi(3'
+rje{54W'B}Y#W'g8|R 2ka17Q5+UcKbzAoQzv u`uf'zTkAi|BJ%lʃxm,EC&JDPЎ&%)[%j,MF¹l٫qbqdi6񡜔xzG2LSuc_m٬o|#|<XjƊlyO&0jЛig_Tm[p 2]R%4h͟`hWe_~:G-5ц̅Fyq}9M
2Iqn	5ɲ;5ᰱ9r*@6UbƙҟG5RF#5vʉ"ɧzG2$?Q? grWs9 (c	Y;ibrXqo\w:phؔ愖0kfUPĝf%R]6K
3r*T+]0СYC7WyG
t-oo07CGa9P9Y6+`겊Z-Ҳ7a]"e%)Ɏ*;o-V7Ilcj'|Ov'[yHoF_y.Zy3K&tG/%gdNDE[>x|)2Z*t]'u͗"v=p8&r)5#4=I:ж^8o7bR& Æ[LǠ璵K |F~7+3sXb`ZJ5NCVHyK/l'7KMc#Wt= 雅:ay:#/		)oKP2Y]֗|*ɷh[{J<1^I7^zs<PasFkS*
ROZ?l8YXyj\:nTCN|ngo%qVT	nɜ`zH/~Iً"]@Mh¹𙆷Ϊ5P$W#_$^~x➪P .[_WU>7!:)?BNjVAɕ= |OH@vGW4wgnR	T؍fb?=kكJ >u>C{$_ɯ_B%,uD43GȴLJ9R,~95!ij,fn6&awҺd}lhcƣC++c}< .3,)F[>f o
Px[>hq>TՒ8$*+,:y;=/$Raڰ8x5IR]Zjxgԟj[?:2a.^
,E{@ϗV~-;w\K^h}R!:mvW
o[iug&yN{b&ʒcb$qt׽~xrVq1mGFEWux/w؝]fh1Ic3/#_wf#WS'4"`zPmS7(nĀ5#H-c6d-/fQ%&*˦Ng>!j4P1k;
Һ}xVgNx6%!ggͦ ,qp"P3\;Za{5z;x~׊]R2ݺ19ZM`\A MwݪԂV
ءw}y)ɏ|P 쥣FGCSH%ۙ/*;L}WOHNkngͩ7y?[LMH3Jsfn,5:JGWDA6l2ɷ}k5w'dQnyqQǡ<"*IBZAN:E=.ם*kx*7di#mu	sW-JLZ3wɞjUH7=:d<t?'CES륮)C~:53A7^[`ڤpܡ¹Y1y[gK(2JORo\#_prqG
TaC+gv f?/pB珡lVx^/YNoChPkXM~oY촆7t#zdf\fDb:ڭH^Aq"s#)~eyykHcAnrth;TpmhwFP5
Y*-ʬQ|qb'mtZV"T4SuesKfP5,B5FZQ/¸x"ן|CTgQt_od	V79
d,rVM%\hif5qٛ.2*\jjl4(A7'|AsBi$eAg<3w P.DA!	`+\tE]-<]]`*	_+ҠSZe׭[0)^뙭㺰wFZ-٤5a%Pi76䥬G4 ?}bYBz-o[;[&!lSV4vdXI3`1H[u-[o"°]6Ӟcf%\8E:lhKt6c^`om"9wvs]Ҫ"|rhx%Z֒%75Z3Ʀ6T[Rb{sMM@`:(Jr/ Ƞ7>Ӆuy:}r´.n L}IUOnNB/h-aF]bls#(Wܕ_T7|=p[V}]q1tЫ'!kBu>4SRk`evv0Ys(9lR56)uav`󓠶\VFn^iI0{"tJ?vaG	K?OϏg&;~Q]bfU>|^WE8s,hvX˭"wdt4Qmh6Bji6jaUa׃-q	y7hgܥ@mBy9ȿ
iq 561P2[?v=6y+#6{{"·?W7pnށ7dJmlX5X5 H7TJ>;LE;ʸ2dԑ P*'T,r4%hy1FPO4@wAʋla|(|e\ ]آg~B#mi vJԩ>]4fe}n8l% SV3LCfds&$}GozcCgɜt/@st_ʞl^	<֘54G5OvyvpѩRA:V+[;:-"6(K
ߣ<݇w:JHt}㘒*gMX`v^M2滛{$J(p7N"`Аw>Ѐsz9L8vmegwufp7Wl̥zkXП,14OtUx 	)o7l.`vKoH4S͵Y@Я6O5A}iUpCɵ-i.Se+x,YtD:I!C)ЉժOlHM6}m6Y}.{SpurA75Uduw}whJ!XWYxG\DUU|INPۧa%v	MLKaTj0\sn7vSܰYݎrqkN_%jg_os~{^YwАJ"wm9Շda]EN?|8cwyf
ӽC{9!?3
4	Vw)d
I5注֭eIll*/xb:}~S=
ﰵUaL[<;x:1t~:{Hp^g7K\=?0IMKhnh/RAm_lvi[F$eTC0 !WXY"83/ou-/(=
~D~A%ک8AkJڗziRs=$*xU7QCW/tF^v,*ki99~/r|Y7s> vQK?&u[]?EUH῔ e]ZBDl[,rNҕ!3vf̉.Xd*O8N04g.P$ܴnzyo![؇jķ\ 5-hB=vj
ٵŒ$ո՞%(=XWU*6("_`ȇc&#!o	Ke'gM՜F[z;lZMX4TiEҼ<[qjϧ,كSP6&*.-b4T}H9eְ{pq\1#"yFO % q9(=o2=C㓟sE6|r^^Z;?#G.z%(B.YPjhxu>)Fіen,6)5ib*lQG0v0Z#&T7Z#&?/q'9eR/detٛ$gX5rkBQlX>1T'U>[q4g.OKc ËVS^ww8}G:Y
R*4~7Úoq?bڌw4қL̰tav-xh0nct#'kJ$i˛VNw`7?nĀsşGߩ-OsyY/	iljX,)fΰR˥Q:[tָkwŪgue
rAraDO89@pq:R 쳾ͪBRk%wR&3:ku05>VKk~]=\K=]cO$Єb.qYQq!cY؎>PU<cjG!_1||Z0cUUdIv?MCtUN'7+	BGkĸeɤ^jrϪ]h
[Cbn<p>)z*@}]͡_5ZSnm{ш bZ[}&14cVk&uJHuyIm_}rϭ"Cu&]697͈r`ߟ B{5>4[<֦>9UbN,BfN>Iv:Oxj[7lk%|q(nXdo{gNYU&i88
pnEzNi_vٿ4/L˕F/E	ߔ}~NXIt#h2'%:.$28-lvU+I@	QK$֠ncX=oQ1(8VA!NW 'y[}p*V}2VF;k@`P?nC?asOS|}-``۷oR1zcoA+Zv[`ꕵݖz88	c^HKٷT8(m|7=%Bax&x"c4Mȍˣ5ACH}z1#jyb/N!t>ٗ@SFC^ŖVgmK#jnƒ\TN$僒$C륩mRCYM`w=YSR/0?E|#j~V>'G|hdTD7jT9LѲwjEx6+Iݏ2t nfvkZt[(X7ԪtAo=Fo)T_Gvas#.8..=GCXRI혩kL#vm&V4$ƖjEZ7[l֦z-iBb{>_Х|PMPUGa3W
Ζ-5TTi"*-0ۤ7$լ=xפȔg3n;@%gkHZZKSP#.Τ Ǿ~ ={[M@Zi\1꣠i`WѸ.d4O2>kTVBLhr;
Q4ޓoLᄢ$$FhH/X`5Ng:l^5!нaTG=xa}L|CxTIq@2KzSEUq:oRo~hxoۮ~=H;o£=7==	1(4!_]ݯ3Q0wwBД-yD@+6
IG1rU]FF1ng-nl:ݒםhʡq,os,t
9*uVXLFLLI[I( 9O;	\ tC_ |%x8~:/b1薟๞M^āq5+P|;BwXo'(z#/1^@h +x41~+@+r4maJG_$,7h@x9KЗ*$FC#w?^/"+Eao#w8.1R&?2DO<f%\OAqZ|G!xQMdG%9PEcJewT뱊:Mޚylii1X[Cfmn#T勺gҘtϛu&?qL}߆"?;a#[zIIku32GNsi`P_#%`C6e`TڴN]4a0-?>/Lbܷ?fhD3oѡҮGSCۙ(3(zhZWhM\.˨Rkr8{LWOF^;{ٝ`ɗweDU]xylS&2pbgG|Zu 
Rn& l(%&m<תu~-l¶MkqGf̭#ה~Bm6{*8\	=*<Bk<.'ѽ'^6Hn+ټ$v5_YJFۙmOۦ$8U2MZ'_n-ި7p!~gpHfP{˹
oO2k̲,50RO,jHFqr(:2NE{Zx%F;'h&m~W^G&BKcrj0tݔ6pA~/@{"x&uT}#xĀ5%̦9<,_WR-PH߫~\7gR=׵J2˳XOШم
n1"1BqA ^hbr&7a-kqO<l>?uI2k/٬jΔePj0rɋۆQ /g918I*6]RGPEz<iq[%P`-Y@
|gYc:NV*s5ᑨ?ȷW#֨ɇ&$zdZ!&zN]8y6~":v+)q	MلxP#kcއcG
bKz46 ?>ΌLIG|]*`l
ntÓ}5gՑTd$nq$L^pz~wO
;"<C+̵EZ
ۦ,W!XBsj\fXo0VF4*5%rB~&Z(ޮd]0=A=HB3$ݩt|H_欧/#*Fn#^ڸ?CoSa0B[tTdʺ89o)[sVUթ;~cjp09)Cs'keARXQNE)9wN#g=׹'ʔmF~+u_|@kF:w-f8] S/TWܷ9zUd9quOy&4z.tDc_ua^#ܧݣ|oo#޼+ZJSki1f-XF^Bl=Rfebet=U(ZSd].h)jx!{uƟgg\Y'?:"|l9;}~!WVE.,pd+FYղJY='+^\f-N4VTT^d!pٚiPiĠZx;(BpDk#,c B6B-f`*;ʋ^;9	s[{WmǇ>lum2]V~miYf!2<e6×f^=n >Ur^˅_v=VH/yZhXN)b(IeR:nhn_m8y
BCj80FW](5(?2g9B^bLF޴FԞt:s6#R
_7!f(∝6WMG.)cUP^#"DryHP\9Rjx&!דNiQck_vh}LS}:GR%ԯZPߏD(>hx稀HѼ/
:P&=ReA*#8,o=vr!ளtf dt&{y91Sϧ('wpw S#ҏ3k6C7
0n58re-B5qI;ßL}()\\`Q^Ԫ1vž;SxfDMb)ԧ]oK&pŠm:8Sk(Ns6XQynδu~{D cAAM'*,|*M޲^$ 'ZV"OL-
^jz\oV]P}:mM]vuV]Qt&&n'nOuGx)\"36(HRfKG~K~yBk[Wg[zU8jyo01e`;tlN)ڑk%HEa3{v/wdxǦ)`=SިG$8j=Oٺ˜M\:n6%*{;]#?DlPZ6%OD,ĵMٮY&jL6sU1,ZrWΊJXCakGhE\yIEMt
EM"l#lC:A-+D?2FM٧F%9JUSWkݛMwj!C=yxM1#9#ϫf)4`<Ʊ:
Mt_E8򩼌qjhiAbō5ZYE-mD`LɍX}Me?-͵	=&Ty|sv9A'g|tp;(h{?Abs8n<$3wt{5y#aGJQaIz|(m.q}ڑ"wPS¦ھG9~C.=xqK鰱mE_6Ԫ\Q3Δpҫi1%BK|9ݹVR~L{/{Ke.`]o= eʘjʖ2uX:;}\ٮlhmRdNEʊkvԤϚ۠{ұ1u۵'EG<:ON[nwBwHZ!% ׮+ h:DJмۂ7XA3P`+YxOfZ}05~ޕ'Fl[(?X
bX5je2-Lu,Mg]N7ZʳsV#u:wne,Ws/R_ɲI&9v6Qdy4O@`3։Dլ 鍲*!BECڔ
tzW܅T2F~nߎ9BΑ(u|P _U}a *&>e$&uIhdi
F \|8>])5ԖkFbI-{@K?IU3OqۜfO1$v\BH~/4H^\\^JnU'loUV;7kʒ:G{cfԚ6
+(tv˻3y's'_
`oXG(E~ߕ
BzO2֡O&%]66'?r6#bbKg旣hړv+lĨchZ6U~nF}x}ÏCgG+[Hݾ+{pjZ*4N8	mOd` X`:0~gMbJe\'I-=?*Ba"]`as(}¼8fa Xqq9haB9K3lk2[	;>J)usYPܤe|/&iojM%iOs]-3s^j9~1kEâ'ohebac9#Hb@\udM5nZ5a6ѝŬv!ڱP.7p{>&G^?Ъ%KZW!?H| ##.3#Jx5Dr^mnJmfѡᴵ
i4] $$K\ȭa'^aob]w?ymˏ[}ʦn.>&0Hn^WKUoj+"Yh1Ke{+QIinikvg@r\TtA`yE'hJF>E?1'nEnpinˮ=nRUn|+slxw0!ki1Ʒ2Z]'tXzh9mƒ8djԚq䖅$ݦ}69=kF8VҞ0&mWUN
ˑ1'٢OjEҞ!Tq%3j9:BW]ki'ܫ&T-iUn!I^g_۪HeQ8,_Kf@<Wu99q[:-N\V z.x5WA;CB;c>tU*3zn)TC7:SJê䲳lo[	UuEC͌g(|9]
X;*MC1K5wE*5)KlM=wckf6˅ѱۖ[<ZZQ&	LK&_T̻>r>i@w)}oGÝ"OHck7DFCR
lym9A9`!'^¹ٲKڕmz^Bݕ[2Fy+6K.XY !YKP}*IG
d)q]LKY@+Fͪq%}9傄op2ZPm1Z}d|k!ߢ-tq=+mE	;ku,+-Ͱ\2[vDU7Lym}ë=`uۿF*+?sGdC7uĖz6'y;-T3Ԓer.\RvO}nm>d¢#VݶޑclFbW=7j}Gs=t%Q7hm {_F[)?d	Ko{.k㒣{QH)w*7pcnc
OqNo;ڌvFJp}Ȯkiv?vfl]X#L!ltԖ3dVGLJ~UQDϨ0Ltx"h땗`$7o*tTRWi0+/Hlz~FhQ.TC&¨jHu+Vݕp_߇Ӓ^df~`}K;#H'[j=EmEGa"l_k_jƲ:pݮ3M	Qɖ3۾ojU^۴@7>YJ(Iaw9jT]s_EfRU㘸yOIt G+᫣=RSw0yڏ8 aSyL>YkAYWorG9̅ܦH碛/~S'wuN kS\vnYu6Izqz$c^]jdUJCXyX^fcވ⺶Z:V0+q~cp9(cD5(]ShsτWƻ5.BbZUn؂)Fy4[+is.ˮ+3	G*m5-utk2D_h2bke|w#<qkP&$)=H\`{	ܤRoxظ驢ʛVłUs>R~kVRm#/f;hLXnZv`sEe '셾'mYJ*`h<S"}7!"o_H=g!{:<o;44=ymvj|.Kz4@&2;L^W^xL!*h>OR[,6N։p&qMܫФ樷*Os{PY5#}g<xX=r*"o0^S;c,q?kbR5sŗzՃlCJ)TL0lh+@"gLo'q<\Aw~lyYIv{;_4;rfrV>rȬ-&N MOW&{]Z.'P[rP]A6ni]؛'mBm;5cSʱ!yx;ɺEаSuc9;L_i#-p7`sb߀hhMZfDvIVU# 7mRU8?6u㪨"7:I&[]djJg['lMd=g=k<:J
3 	UqRnaT@^-{N#>ݼ.ߞ"}{\S<R.e0_uzz
]fP-rE*Li1Mq#8l	ѐ@TtFe[?W0DE]+>B<ظQ=sk<lMEu&ͪv4HǽP4E1L[=Taox53-fzVU_~Dss!,dLʮ=5܅?Tuc xxgt޻>p,'Ɠ]^@^^|;G$7m:yGP,ҫǠ.ì5Ɖ&5IN)iq_Mܦ:)ȝZ\Tk\3sɽ9W<-}N+.OSo96شؖʽfgv>%}+<c οL8S#@8Fh
e!nXx%v6wZ˥dy΍)lF-P4뫡A-2bYd9Ӑ@o?Y}_f'01L輕2d Gog z{>B7	j<poQB_J2URI\?w[K+$pҬnh8'/gkqZ}i:GG:v WhO	UHG+Ж_h	Ĺ[TϘI`sUZ^j+D$aJb)s]9A'ⰤF宮|ի|?pf;$]뗰t^|U}Fw/SFrh<8FյGJX%-QBˍ|؏w6Z_h
''{x=%HƳ3O5-|#-'pRQ?_6+q%ΰUsalj:>vS65J9KwONTWA0j%LM[u}yP~oa:YGƏ	}Y8hѯ1/ͺūZf:Y~=	@B(OyCy~WSC'>b܁002?m1`v1;kl}[BYni5쩔HouwlI,&af ^|s	hz7y-xm"PK<IǛ]J;+0rc6R;sfv;}DYڕ1faDDg%fgƲ`ʮiOwO4C啖Tl^$ADvʓƍkKs}WnլL[QOөwd5[GX=MQǃ>dyaIiԥZJgMvl>ro[XhN:LkgSq:5YY-$)}WUHq|		8#|WPf/wv"3$Ҩ7ùrZu+Ǚ=Jz	-Z$܇ݙZ^m9ʪ̔HrlMqG[Dɡ~id!|ʽ{q^Pyv'?/ ^Y]GP}i,܃>n-"=n^o/"~ZA1--ֻS %JKscCRqwSjŢmD'x#'!C[7>RDwH>@twyMzkqFǁJ\b H\ӀX{FL{`7(feTvFݭy?$2ʁ);W>
dv|{:Q(E2s&?pS\}Wޢ-mA|-^*EhE]*|iu퀟WuCLk.zm}glq5M|zo#2s|YRV#߱BEYI;ȧdy5A%_o_1}ċk"M;rIӅcl\?l*j	H8x9>_5$i5zW*兏3#gv}-;k/`$vyTCN:A-1۴4쀓#U̚.>mw:!fO"ӊȉ6(U$@vpE=q)ٸ7PVyF}.\| ɕ;cjU,f SvFvSf2?:C[vTѴ&׉	ctcP`ݫL՚Q&9QԮʬU3IMf%FwmGGQ\uBJ>Vf27SIh:JNGT:Sml՞G%n/OUhu5(LPQ9Okn(٬KUQr/lmZ9eLCU.
ڬ`ġVf.+Nލg]T_9ic䅩=*mHMo}3/\Yй¿ыC.?C<ٿ,`o/}Ep.|s4aE{YV-#^М8}WV{GpHFˇ~Wu2ΎYt5LӠk6~e
fԶLr~ϫ?b}0V1WuOO)3!1wRmvtjwyh$S}(9.y4*L@a|M1A=$^1dk
"y#쯜U|߲STSJ5m01
7kT0lP8Qq7ՠ{l=VsNg/Tz=
eܖ9?A{^u>ŲQ[R׶ԂTH܋TwTSlSvRUs1z!aFJWgea?@\Ye+~Fgqae4B[xr+jk]JX]tgӕ!#8kx6<$adGa7m{pN'L¹ErWot2l3՝f^v[DЬ0fOZ;"~3k^.07o/Mf8'?vYʳ7=G>VUbvU@=sVKWirt?vJBYHr)w_{Gd~w9 Ev
4|@zM061Hr(twV<6iM_Zx\ҕ)pwٵ0WQch$;FokT꠲l_#	U@@Q%1~*T!vF\Qn,T	Z-J\3Qe	htH<Km㤚M]JA~سj}XU}S<=c1[o)/VC>4zs6a;ݕZ\F_2ብV.5-Z~~_b]ͩ2YW{</doV	W!(ًgJL?JFZM=:sߝp%Gըf$e9+Fp;yyBu,Ǒ|@U[`9e7Ğa1ΟnXV:ʢߒOu]ԭ|`Dvy7VcRn}}{p^ĊfX{Rg>@i~OowFC	9}aM7F;n2dwqv!8e܎0PȽ\>*bl՘W|K>dac*y?ş=0"_޵ݗ!Jqr.ɇ]]96+*nуABs=H߾CIʩ}h{`,>f;sL~'yXn[3,sax,JvE3ިt~Zd{b~?5|nx|K
ouh:C@;@5t[~B:%:R`@>$<^9~9a.mQJ)ڏ >B%~].O%2Mo6t~^^=J],3R"xx=`v9ml息]Iwe'2l>eT$-bz[|1VYt3L3F"&+wHZо%V8ͧ,][&Iʦ]7I/[X-1H&,Ɔ:O-KS{G8_Xrġ+@N
$|(0aϯwC[?yq2P>?_(sKih셔̆}xFzP1f3oѡ@wjRS@+
{{9+4tc'(.\"\@i=ZEUAs~M2#PP%Qu	Wmxgմ5^Fa՚@ݮNuf;`SFNݖXۃߢh%)tYyEFG:&!^FEAݓKؙ&5z4>t[	εⰒN[&5ri	klk4Qۺ?A'=Aދ;sJs %:#>~I=XL{;r#Uzo?&%TaK9;zs_g_ gӉlT&taΎaR_ON)@эzg*#qk8ڋQ/xcbaKTFHȪs/Bjj10=_w(P>/+d,O֌"q݉Z(VXoSm#BǖЊ%Rr(Hj5q{bwcÅiqWa5]2UOt3Xh9DiYO3N

@tZ	LfjW#v#MԱ4J>O0+sQ*OmcRmeWغr W->	:N#}C%!_q;oG
'*XoET^@Nݠf=SJ%=vƐq0C3޴V6䣄ajO>9.Մ~@w>d[䄜=(m,ϔB)?L*IխCzj۵nH٪!Sq;%LE]-ꯔ'Kxz(J)o| }e)8',[AYn!{0)FF8#F,F: KxI޷C-!.`y/[L_wHƞmr=Scmg.5x]-d|@46!
䩙N-K<fɌޥM_GGO/G<
/,h2j1W,ށ	kLv_1m5=3|zm/kn^jWk?Z :ĦcG.Yl4RhГ(@M٦Lr1`n\[B'jѠ"Ϛ"?-r] e5jW6!Ŵjw*WZO(swrt/-N},'+#\nKsZD.+FO95~Es{-7Le07xޢLf3;	]
j~cW|)IKWĎkWښpFZ;jzدv@E ;R&G;L.H-@U='S$G?<Yڛ9+x!S@˴9-7!	4ݑU5o\"iWSWr0U#uҚ9z	+_p<3_# d\0P3aAtGF ; &CȅPw^5=9dӵN?kdZa]N?<x-xyrpg~_r;'hj^#?3dw_|j;ŝ*H冮ƫ} $Pg +mOZhU=cP0}W' b
sTqQ`sAՖ?U(+n¿V0VgPW2ǺX.I5ά6_IJE*jSjX;*)s`цZt;'/`YFBd9Po2N^AWc5;v,	)	~&ՙׯE`,'ZMM:-\ԗTzpS~d4*΢H}lwp(25;x֟)??,lEzYڞdk>gA2r{YƐnW$a^(S_^4#	..V~hdm- ͖'/G6P6Am;ﵒoBɯ0h0TH݉حVLlLf0fj\b)3Jr2'2ĂoX6W^߁iyHߗ~IF./Ⱦ|w^EkJ!%YFJ>	&}Uu&Ñtg~hftY`9̏/S@AMK??S>Q~i釅-b>EY`\iBP`iyPecxfs,Zt=]5K˕I?e[}`Y#7#g~D\`!*l	~vW7Sp\F{n z!<QҦ'5u{ A_S)5pj &@iG>O9ȹW|O"e<nqOD~^*?jr0D5"0^>r\.k
o&ћD-t. 4\oF>Er8r=21dL!`vo!0zY:C[=*:Ko	*u52+țndmz.1GH	=uT| A38g^=Fw;K $? H/t2MJĮ|Ύ˦|	x-#=nCT:r[&n7_7QjǙA򱫫lgwV;,DtO!y
!cLje_?98[0ټ{3Boٲ%l燆emYN爟=dGdџ>OadnA%ͿìϧƫiρFbC
ֈK"m'NS-9+bWWwny"K:=k)M-tfK%2U|.|֐s<A!?RC5Tp{[Axoݤav'f	|ۘDsefdN?ּhSE	8m12ÔV-Ÿ4	ȏ,SD5ˠ,yumeǡ&P?`ibc5RU[sMvY{h.H|5)y-1#=WGp"ΖygMI/ffXAY)=OV^xB.g%-^.OM<8'JajpʷMY47CYYD=7U2a8oC}&k+A(ӭW?!s##ps@ =~7~5&~H3¡kYkӝh4	J[eСN+:F+&10jƊrmrFA}zӟIeپ	YGnk@fcQFItf[|[ĨXƵ=}]YiX(
G;.q+cC}Rg9@q G:~#Dk]Ԑm6Ma+2x1fwHA)Pp˥xͺ96ieRDñ]n3qȘ e	9g 4ZVji5RS!WB<Tr"NAud..K2ovbIP)l;̴B{.LnsD9HPl$l:$@ƻ/j%ցC&%s	?x=2ɟ`9҃B5=yfx_p7MMQI0F<ĭ.hK`0\.k*(AA/(~PCI ʰ 3r[|ߙ_/O/&\w^9˷^wfX쾋B=k5H嫋?0CMm<H;^Aѝы>y8+A6lbVs8_J8(윊W؎6*r8*ʰ}LB3ܔawCWxN2T?PuќY;{x'|yg
|ab_N^T0aMj
;HK#6GToTqt\kզP`Juw|920/{DXЙ
d`:Hvd/t#_5>HqL*Ao]s~M5ff#IԈwj0$:AlU)mh-"'|&Q\.zzk$@R[aעNڞEhKXkjQt9;)e8 jפc=B>ﷄsAEbsfJ?nD0]R4Sc%dYX>3D 1#rcѫV^F4Z4qܶ7?r˯flQ[#Y"d{جup9;+iаA˚;q_
Jy$fКu+p?i /H]1^/@_-2I~djR#6?izލ.߈.*MCf̮Vjwik5%AR
OJbd`m¶GǾ]c~tǊ[_@Hvs=,ٽ֎R#R߮KmFNdk|VU˃P
HFVUA17S\&X,"V,YSnӗNG<TZ_b{
.&n]x㩸A2:t6*6Zԗw9Kfd!'+&uO<12S\djX*2[zI_b6"mE=&0R­vWΠ'鎺U1vP{lӚݓap,p=8*..Z ZE֜2&;ǈi|3J'7Pr]݊ira7:KkaLͦmm#i#"4n7N[Z8VkkI䩕JMIKFrio=꿞Pfƿw'ݥdV$en--E]˨jUu)A
3257&Z%|83#ROX9TSQx>?濚i&|]=
{[~_4Rg|ۖʶ؏Œ굎p똎o&$^y.		'FʈYl{+|.CmQu^=i.LXf|gSfr(*UHgԭn68$S(p7	m4r\T1aj\r>7co]zD/ZҮE-EkT-fю'hYq=72Ixi"a<:~jl'fZXx8|[/EY8P ˧#7;մݨJajMNө,c7IBFO&]|9Itz*pvhsTeP#wMZS2&_zO]l/VSW)#_Ujװ6Uo^݆۞RcŷDRhyO-͕!i!~X|HufHe0imc&jn5)*utfQ7"%xO	[ԝY(a.f1dome뿐_-eou(rF&	2DrZ@X+NuIt<CJ606KRU̕EqH8_&bPQ%aa&!=uKK\p\r\.uFW?*}Y1҅(U:;rMQyI@3Ճtshx+>|IpnJP?POQ:eo(PAB9T4	_Y9N;G^M:OZ%782c_sW㣪S=ڷ&3٤.!R/T8/[Og~Jv t{'r?=
5{9|xf"CA?);}}L%r)!_΋/A@;gǤ׹݇vmS/x%|>M"__~ĻVWrNܿY[P0 ]'f봑x)zuQ7:3|fPn9)z]^2x{EWEe4\9L?#fԂI
FqͪZbkZiem.`Y?)iBѫk֜6F%"9|F ]420F|D c*X_|
8~|>Qڒ
MlWϜM'8:3;Pmtw[=a:ق5/~@nӇ~?Gˡ)2oJTCs6h^:Y%KAEi_@5ԛr'TSg6ou= @D+
u(8>a@/TvpHc7ac-i"'dtF̜/]9lv G+0W>ƞ	6M_A=Z:<UN0bOV/Q {j"'jaZ%E8ZrbT}W-MThYmuYVOtY**OxTwoACLpȁF\h۪n:^KA4騵xW*Cw?fn/zG&eɋI4jѢ>U"6zQnoJ\m@ȵf>|jhV̗	hӼZyN86J͖զ+Zfmʹwa`QӤSNg=Ӟ)M׍6vSj]./׍[oB+Z.Txvۑe|	 OԑV?tV9r D܃󄠏絢k$6'Ứ{63<?}a:/"ڰy+~+B{M s,=>3D\vA 0~pwgZ	r\ԋk}O渌b0Om8#9LrwŇGP*9rtLd:u'~ʞX'EsOx*8W+#$r.iOqF)nJBϏa0|qzbKsnkޢ{)}qJgSQH>Z2h~{.xG5O˿it٦YAgipSKܩh]%Oq(}IKKC8y]UYj.ܗ\:pXz`8\Цr0Q?k설hs/޶n_w%ĚI5q*s?{g#o#^	zIŏ!3eaAuvq{YNN-7*P+1y"'5ޜ1ڄhh݉Pz)0B4KnQ_v(ɀb,AoR\gF!#;o\"{Z,W@QF=dbVF
-e;FIw	#NmJ=|{g.Uﺢܞ7pL&n<,,:0k%	7#-xvۆ!iZ#;q%K](NͽҐH7Kp/In9%tĸI c<0P$SS< ez	ACSA,9r`^rzsc,-!?xam}>[8Ϭ#=;ILw]N<{X={Ǽ'r(:*h]>=;0hNWe|XB?/=Q1N\\{Ithl#4HClR"{^.գ5ja-q,
Tڍݵ \sXՓO}u5.nXM.^m[JI	{`*h7i*Nh/D\I?9'0t5),6  &룠Q@Oq#0̧`xچgDez媂~/E.;%Mut)9q3tY^QpN
SKݔ=ϛV
㊘.i MEgաS7Qa̬m-\n1Lm-5dan>)aΞ}>~h,ݳ9v%CWf|`vT!H'͵s%}=!.X]dL\^_F)J_ f^mEe
xӗ}b)d[Y%K86١oeft,Q-}ܒ2DsJa+XH}:0'٘t*<B%2w0/nBs]딸	yѲٿߢʿ<=	g/@E-!HSsfE{M1b":ђH흱^)YUDK6F+_qWl)wUvBrfckp|EʀAfߡ\E>2o`|C :ъn-\V\VCɚUBݧźy\`08GEI쎻}rHk<aںT*RiSP^J_%^B#w+`8^>ju7ґYN/Q?s|QH'bkڥ#'fV9AF,v=X\@H؆Iy_&,lZ-0:l(JYw5cX/;tkpfO@8nW\谻/ZdZ[&w<)_ hw~5-y^T=þ/^T+G#;ǂ;jk>s/kˣ="U v&6+!V^2yGyZM93s)4U?E!n/#Jtb(S%1Y],2imsaJnzq/vQĪQ-⺕jY46r}saݙjF/ k9(yc/ʃVf19:KVUo0B{NT\{WGF(׋I>-wMulC`m9a0E=5G͵<40\{V꫱(]~><r#<-V'O1:Ma5
>c6;7r:-JlWmcHbeu62J6ׂAjylgj!(m/MςޡzN?K9Po@&W56$mW36$Js'E[1Ѡf(CrԿz+0Cڨkdi:<,f{ Bͮupb-wmVmvޏ&jBMTHɦВ[͂NUW{ۓW]߆>N "!gPKxm9ߗr#
ΝeY>uVJX)!ȼmJe|$#~?ZHMl* uo9 R2;|fa|Kcrf1ɿ2"?fۄf}uR`Չ<]JLhupCbyh1crU*~h9b	CPs-gbTg?!$t|NZX]5[uv`hs&^&)$t!<^5 ĔݒbX'OdifG?dۛK{@Kuv4q2:}/͗,@75;Y2yϏ+1n2p!p^:my'}iaںd-HUMlabVhU,lNfZ2
5.3AҲSO4&͖'Rp}.ĆF>usj&}f䣼a7Y>ʕm:nOQq\t-L/.4}&M.3;Jʎ=hJbR fvW+~`1IAyo^j#Zݭ	1}\OvP}^@.|(	P#1He;>ltyXBޕʬKxb0'GiED*|pfSӢŢpuLV!OIckx(>Y0J6 vmW4O~(ɶcSf2?:C[vhZĄzK1[\AՂ">'/<'32xػ
HЦqX<t=	~^M3"C3mjqդ7!&i+t??wyyW	we?sc!_@ߋ#Z_]ۗ1%Fwm	J{B}B']:
5SIh:JNnh*é6>aW7dB?8 %4#"eԳ*^)l?r^ڋ;O<֞+G̫|_>2j
sE!HxF&F{>K>ADq!M>}j*@wڡOYDC`7ڮ-vcRf5J4XwErHBݨ(O1)6c8Rl?5zȸejǋNYOuNiCV*'ZejB,j3UF+̨lVObG+Jx`Lp.
pMK
>'ߪYk"uvs|nOQ=p[][cIZMNwiQ=?ƉQN%
hԘ~=yQ\*栀	Cg'J8(W``<q՚-,K)GYiWILn}[01&7	NNS豻H*OϵS*g

bCx 5:hM:"5{ΰhMA X65۟c{ndt,lI(Y"QӱрzipUS%D7rUq4puY
p݂k{ ݯx>2}{3
Or+h} 
 (8DF"jD࿺oyEiWΐ<ujvsնZ7۞mtrtŠEݑZ+JY1,+.sF[$ʌձ4Rx^["}ݿb!Wz"Moqr~T>u cOO,:^x`ɕ4᝵xĺyQuuF!8%P|~S]~D03'_O">#>"GDQ	Lopt5+٨zK>/ĚvGXjduVST~ڤsSMaHfy**b*p:O6W@CVwI|!A7~[!$fM<Hw"%oFn,<w!&52%k-[vR0yhT#lLt9;As>\wơbZ6&?4Օ_L.͎P+tjJH >lΟP/J~IEF9U+zEpXq_Dì{]5UA,RT[Į*;WB:QZFEMQĵ?<R>xyprismjs": "^1.30.0A*	-prismjs": "^1.26.5",o000prismAl26.)3prismjs/-/prismjs-1.26AO$UAUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6Ia61>>>>WismAl35rismjs/-/prismjs-1.31I%VDEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxwO99HE-xM}Le<<^r}B xQCh*e͉K̕
l+JVBnre5@%QFcFiʗ!nιeGy9sv;ynp4WMoD2%Bi7˫;(&}oDqѲ}/hx3KK/<GO -QNe&;;/ CFmBH\m?G\F/v.E
cu[jx4-ui4$$Uz-)WN22i<f[L$RBYR)n\J=.$qx	gPƺS>QXE?R1g:>"}8$MʶāA*S&V~+w[9vʦKŎe:!ߡKt8RqoF!psQ 1%yY@#2Yi>x{7'kFԍ]<YIyE+ٹLlIC(a#e6QZT𠆯R?e(i-0(h4moemQ
9=H`5
=BuS˥G/\:*i\[g5>r3y.;Q|ENy֑[`x+LXdM5&mM#9Urbtk)$1q[dRd:60J%Фr;a4_0|D'&&#Eۋ?p(n&iРj-PXh':nkv=n^^d3Z-Xlzծ mM*nRVh9mjc6/{?nj3:Z#68[2,LsVH}!by^yZɂn %<[vNcKL/A㑙VxTn0+Cږk~G ZZˌ4+G]rzʲf?2lsPZNWDpH;}vڪc9~G(Cp-\F2{
/@XYXUㄧVZP`E/+VnY5j0%Bh%ܼZ,<QKn`*NVw$sn|YbJlgL^ yb5,Jz+*FLm~.q Ժ0%qh$Bd9%!ˠ~MQy˿G%w x/rMޕߓ.d8J?%pr}7\ǎTr28o5U&L˻J$pZxÿ8NJ48DӞWJT1{~0;xZ5'dSZGQ=:<a¿1U<zBSx{yɏ'02r Q"x; 

prismjs": "^1.3@types/prismjs": "^1.26.5	j,kxɾi2s߰  BAx=ksG+:r*$Љs+ZR"+*ZvR><6ɱ3<$k/<HJVvoRAh 4*(eZ8+gR<z@O?8-0I2R8e8,[{QΥH4~8-e.ULt&R$YPWtnM\SQDoGB>o2\<[I\CDa|R&U"QNYӐh(RQ/˭Pe Р,2Kq-^t]0UI,I]2_3Y+8ײ\IRwįo߾>?~難ߞ9mr\od|}] !rPPSH.,Mgy/أ(X6"#l׿b"#fW|>GwQSs90.b@1*E?	| yvޯ_bԜQ(	hYXTIDWܘNYVe.غlQ#5@<M/<K8넼ȣtbo){'I!IAr*8d$z(ty臇h~Ϫ\<MqNDwo^l݀)%N: 
%9Ԡ)q"bӊXm#N4.[CG:},tTRDYDF nCr$P2ZB|Ύq8ş",xӃZ|}-Q]/,D0V>p#4NYV7T!h !]7:mf!c3aaPy<6aR/0qaq9ls xHZ=8|}Lʊm}pD/MAy5l,5=;'[=mQ!֩zU	z,2ߡ/A;0'!LѽD	D2,Os^ĀvMGXE?VE\egkqoCrf$mR탧g772NU)wPiß⤷=A<K^ Ds3Y{+8oDHU\NyS v)kl&wZ_5d6iMj?;HJÈ\{{fM
2>0nm۲R~.WsGؚAFr~qwbtĵE~2p;~vjY6DN<)1B矰hBݘ52݅mOm"~=093= zbDOqW40(:D Pe79'qXFg¡6،2lBBjz5;.E5웚t]KJ1/HEEY?9QZ^a.g|$Ce+kg(AOE5g<&g}X2~M#%^vf>bH;옌8d&le^oGwnH`,$M}vfUc7m2/Bs"_9Aw\@va`Cqz˧ce˜52N[:$8`GU' Ҡ0d	+#*ieP[=x̚jQ@}o8	8aQ<c7;#'ؠ8+?pM5B3p!44{gcŜNdXHYQ)((=FHBE+oc:߁Ho$Fd|b7rJ<:1b1L	gIv2N'e)YdMN8>ʷٲZnN5D[}*)}&z:@: 0F<\=JNIv,v[0
#94<44Ǔf&4yQ}?
ңZx{e'Py`&TZD"ؽѸQxbr/mwI.ז#@lD}8Mi͈hPfڥýy^0T	g=#^>7@c$fg(|K|>T	]@0D[r:4V>]8CqFmd_۴J1_gXVUu'
AgaV<Ӂu.,H1Š|ܢǗP/=fT&ѴAhٙ|@k7fƺoi`G浊IWu(ZF_T߿v܈2DEX5*Ț03\uݵjbI^Y%['e/Z{3UHgLȿjeh3&h7`-#DK'yU1`AѼ?e2uf6ZVg
آ4rq,b5꿚C=?K+xgTM
ԧ$ҼZTA/Rˮ)Rm#?@WwJ%}mN+"hXK<%\u56mq(~1=S;ɢ}!PiƉlkT_^L	:MA12SOY 	}[+3a)Z%,{=VզKC,}ns`^fzbF^:-ޖGNCP+69r"S
`AOSr:\=Muq+q	UQDR6FM4¿"O4)vU#k$1 TRDe*$cw"XNzn3y4R!?6,ۄ^1xi\q8Xn̂A,sO׆仩o3TrE4͡F+pk.o+1cT@\m-}f}V.X?:5
FKke{۴1iÚUen'SQ݌jgڼGQ{]%HŊсሡGhy^[E1\6?-ò*X{S. :'\^nTA8vڇOT?*DF١rl,"^,14M1[8w~qG|Ujk L;\ALO4݂ᖡ􅢥ݒfGKy3S&%~ )t_:nMFImfƦ}lN%V7(٦gfJy4Cڴ&A.!G8ZDz"䧂jקts1/M+yx_@S}Ň`rrJۍO}29TuZagό֚@Uplw/[RgP;#Ps j_$BF sOG/齺o_# OSJR{+Ec܂6h9FEV(:y7T'YNʹ['VMlT}C-N=iR WmD] ֎<z3}Э8،k?<K5V64,jn憽d@7UK2|iVStvD__u-jz˗x;שT؁L@.'(e]IT>]':O`z:CfAj^s@ =ոaLJ~Wiq53Y2NvRYSw`m4A{!)Q&n0EPH1wXֳ|ړ65Q"CGOT&G-ڴ&WNX:jJsWBMRK|[h1mu3_5szU&ޣ"c7EWM8o9nQ2S<m7䉃73cǩ"0wqR,F%hB^JfB] .*``%)#hۄ(L&sZ叜"Iyh@"i8^=PFƛ#La.H7i8} N_PR.U1n͜qWquoE{IG$T:Y	evnqjdkrO֦|p/=N.T?&`])&mVRaUWŨ.^ƫ<=^65Xuc3%ZEc[oC Fuij_]慙'8粴)n ÅJV"3`=^FpM͌t7a"RF*	SVzUcfv!tw$tV)<0\mII:Y|rЭ]-(lb)fZs~W{xf@n4"\ӹ|?:85N׊d-70rMfލK0hqX<Ms%D+k2%ʳݼyչ50wZe֙>{S9o♫,XjK|[0JktJf)z0__~}m|xkfۼnjrTh.OTL@2_`am՗bSv-Z0}:l0`J_5t1C1zM\Pi&CBD,&T}q(OS#gB	3PFD9c?\Ʀy|Y5w
R$dis.X1ķ$.7 XSUE	zCFo)ݢt5$H)͆w9xY~ZapDƈkxbGGI{k~>f(Ƒ{rͶp'LL5ai;3H^VcPNͰqz7.Ҩ»T5!ĮђR=K¿ɑGR薣I]ؠ;",,4EA>}}ڳv#Ɋu$mr+hi?ZFz9LZ;bgnwW%	sCS,ңWm$AS8}9$	y:}=XQ4dQ/E# w4'jΗ"(f;fBQ֖\&SG})(tu_;Sp2rBSSkw=7uԶ\DaԗY[	EȔtK,ίxA,JEBĽَ/Yw~!.ksKx% M!oNuȝD5w
;MxjqTkD am[ X`Kd:SŮsh1~})]jAmg0tGE5<X0O]FY78a▮aP+vv2WI>>4 N5(~[?7=KI
kO3./4Hv,yր߂/> \c&R.EwH,4jYc9L4;솕;Nw[yS+3[b}n˔7a[yhܘ^ج%݈J):n^1z"^Q ro-:Uz^"S!ZD]s4,>~h9*$@<an6mdZ?C9rа;kz.?*IO<d{[Gbru8kFWvo+൝H$aѯhKA{r4>9}kj|ҭn?n{u[Uj<?G%կlömV4ufOG!>"Nep:c6otZzoA2Tx{};Ɇ UX9W	mڏ|;eC
,XkcɧVB-&luS|sF
'_is5Z抰X'wI]zކ
_6^+bm2@X(_\UgSApk>eb[_MOv1Jp#EB>29[el)ȶڋبTKE-b}qmRnaRp6Fd;+Oy/41IS[WED˴C7.[n`LT
$ocFj6?W+ƘMyv:ڤ_['SR
x ,{
  "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
  "dest": "../../dist/ui-design-system",
  "lib": {
    "entryFile": "src/public-api.ts"
  },
  "assets": [
    "src/styles/**/*.scss"
  ]
}ٜ?3`x̸qB,wbiInrNfj^\3&Z ox̸qBobrrjqqfRfNfI\3&Z 	*x̸qBoNb^Jf^nAbzj\3&Z 	OPxxqB,gqFbQjni4 J~kx ]
hcl-studiom8K_px a	nimationsm8FL/x `backgroundsm8UdSx `code-displal9Rwx `
data-utilsm8Krx `font-managerm8\/=sx etilsf6
}8x ]ui-essentialsf6
}	gxy{
  "name": "ui-animations",
  "version": "0.0.1",
  "description": "CSS animation library with Angular services and directives for programmatic control",
  "keywords": ["angular", "animations", "css", "ui", "transitions"],
  "peerDependencies": {
    "@angular/common": "^19.2.0",
    "@angular/core": "^19.2.0"
  },
  "dependencies": {
    "tslib": "^2.3.0"
  },
  "sideEffects": false
}
cvx" {
  "name": "hcl-studio㣮xDx% {
  "name": "ui-backgroundLxxkc([ͥdTZ[\Y\;QJf o,xkc(YͥdTZ\W3QRv T\x' {
  "name": "ui-font-managerBPxkc(SͥdT[:QRv 9x {
  "name": "shared-uti
QGx {
  "name": "shared-ui 	xxQKAA)/17UJA)$C79'35dL9 1e)xaimport { ComponentFixture, TestBed } from '@angular/core/testing';

import { AccessibilityDemoComponent } from './accessibility-demo.component';

describe('AccessibilityDemoComponent', () => {
  let component: AccessibilityDemoComponent;
  let fixture: ComponentFixture<AccessibilityDemoComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [AccessibilityDemoComponent]
    })
    .compileComponents();

    fixture = TestBed.createComponent(AccessibilityDemoComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});
ϑ+xǺe_TiIsNfj^BBZQ~~"PP7,nŕZ\W`kPͥZ[RRcd12. i-xy M+HclStudioDemoComponent } from './hcl-studio	HclStudio)	HclStudio/	HclStudiog	HclStudioW	HclStudioO,#x:uGjQ~pjrIf~^Kjns~nA~^j^BBZQ~~Pn1TzYdMWj'K3
3
|f\ ӟ6	xe_pFbQjJhIfNs~nA~^j^BBZQ~~1XZ$SnŕZ\dĵ(Ɍ(8Ix VZ}!.4l|\%	vx mM0UiCodeDisplayComponent } from './ui-code-display}UiCodeDisplay%UiCodeDisplay+UiCodeDisplaycUiCodeDisplay|SUiCodeDisplay/5x {M,UiDataUtilsComponent } from './ui-data-utils}UiDataUtils%UiDataUtils+UiDataUtilscUiDataUtils|SUiDataUtils 0	*x mM0UiFontManagerComponent } from './ui-font-manager}UiFontManager%UiFontManager+UiFontManagercUiFontManager|SUiFontManager55ܱxM
0D)
ޫHQİj0mJR)ac	K_}ČwDh/,D/lYG+k$[mrs^\A&SϰYeNc9UII7kB9
OD3}׵AtxUn0+@ɀ Wy!"@1r
|`$bB
II{dv!3Kl.5{ĥBC+7_ n)yW]l©	R-o^0ȚR,)쾟bkWcxy>lz濙r`VLʝ,˥ے9YqŮT[%Yp⨛EҗIiSl@gxǫL*іZq&E I.|JX%G3x"ûKx-q"MۊC=4ąםSؙɱjU5.ĦLm
:kpΖI,Uh:T:B"Bϝ&YHM)MYC`?>KI!wpe-*NDdEp=uUH>K@rI@Q֪36U?h<.Q$|n͂p4{0x>,L>BԈU1Wn/xzEi{2ǹK]|Mzku!S%Ml_FRw}T?7it@Ib'ý3dm9#2KbzBg+Sܛ>bCeozc5<xuRn0s"!^i&!ʩR=E9o)V6{ǆ]̦3u[Gp$U0[4/C֩Kh$#*<ځ`J~l~b?s;WB:K FTWɺnÖ	\BT~j
y.eS;{ԍjLk<LEz٢p?(Oxm:eȧ^A xrd.4Ea-Wɨz6G,.{&ވONqdugm|gڋD>(2$zz F\smps^k@
~B>wAюpJ-њ'fr9~OqyeL!	GxZ=۸֫?fWs/1ߺ4c6;xWKo7W/Ѯ!')2b/8EA펴WJV}pJ}HgR*/ `jئ@8V=3
T8[]10R,Ts7V|b"+^?u)K2F:Xls0Gf?a\Ƃo/:ܟ2}4sX=aoBe|B3OSzaARÝ*쿵ͭM<ppJ_Lk3PTh=l\A
uְeU՗u9;&NwYqr)UQ >U#a\J;ٱ~Zq/g7)GSq!zh3sX,C9,8}B؁	B`B(y!\':UGv6hк^gC˕sI[cS)KrSkĨv'ڀ1&Rۉ8lLa^Ï?O-"#"Y5"ay\FcE¶;αƮ;ssLl:QְdfqWSbg7c&m6RDǑmq$UTL:YjKſ2S&am{?t<E[909393+RĝNTALk(1yDiU`ZV5UC9[rlޟTl'6C+xF+:zj'mIw*"coO,JTm/F+0̍^6{.XrU]'(h#vNuJNM޴GKˈB
:zٓ^eoIEW0cp_{-bUzZѾ]cx^]1GK[U>q'Mp3w/1ZyA wye^awM"Uܿ.+ҞY/k{.ݕx5p?Q' ֓}P{n9MσQ4Yǔ.IUWrzto @
|Wû6gɆbYWl/Qm^#\ڗOeoj \kz[!8`Eoty/bl"`xXKo6WKO=fFlEhdR#%!){v{e&7kH|3Aw%-PX^Bq'(cuaF|GōJ]2+b`KynGWW0 K4q^FFu-J L&V4IAs/K0Y'iXh00SK
~W3h'5T`x+(ܐQR UDe8[j~7br)Ha=KY{lU\`▓(;\>]nbZU4k<b!Ɖ\VQHI-E!g=㸝ǔdg,މ	OpVv	 !)n`go"q.2ޮXbj²!ۓ@|rs޺jJ(~۪(#\|ѾULts.myKStrۚ*\Ni
AQIkLpbg+P3.a}i}*pni^⃯v(Ozуs_ܴvu\1O\BjcC9RBZ]_b)K]S4PcJbC."ɈD8"dco15Q [8`30Gw	ԨFꪥ޾Mc͝2;xNgAh{T<z%n!qR~eodfuK\-͊YA7y1iaqcih/Aҡ~NawFLװc>`'^T+nhzY9w,r7rz=Lg`0X^3Y5h.;W)*^Ҙ!<7l5=,ٕark4*ƫUGr!޴E{AZ=ГkQ[t@<ݐhR².ée`"ZkZG[th0;ΓGw`i{M'SAqsQmׁaæiQ֭oQTrZtr'oҒ}e鋬xYMs6W	I,Ns8ęIΩ$$!! %{$A$N僇DV=B2h"xטM8l*.3J+S"}cs$9g`N1	x#pqE	V̘Q]"5%AfiX恴}|JGOI7LLTDx6MScff3bEq=DΌ1z/
WK<.R'V%g*rrq#Q&4LdsYKwt f%'ODExX(JY9OI&c\>CP{Y:s=f8WAoȽ}rx:$c9VaInDP# %J-R|(^irR(Eh־=QihnЋENbKlќԬ`*bn HᄄF(!9`Q7HG3F^p
 `25jS@bhJ>[x1.h<J]ߎ:\]_%I	sXVF<BʒL&yjSV!FMhm
;S eAP .})Y`ב } ٙ)44M&_5s7.[{< -{>v=?~v0Ka1":_I-܃+(ӌ(fڭX͌Bc='KRdv	rXJqe`g~)  ә%hxmef !.ӆuގ͉xJзo(`d__0ORڛ4#t4j"lt"DoXZpʔl6.:¦>9(T֡[kH`~\a	V`P
Zj-Fr5ֶl!z4.vZi9h*As6OrEIۣ"UU')+t5fe;\j@wж˨&n7.K;.P@eǠV(Y[W[f*·͚Wg7<l[}a~ C?]UmY:wer?lӣv#_9*frO1& R7VvbO`5I{G	O=mSQd>*+n
:9*MOmc,ře0!]w$}5t2YF-
?BATM)Wuݳ<=s1K9XC798@`By4F{$Mk(u7Y8g/"{sYEW<Ȧ)ZUŜ KO}A5x@xq7=tQ
BLQZc}-|j716Ox{aM[Ž]гQmu_Q8t9ݼ؀J_[ֻD1@62y[O1*J\m[I!"%QT@}$IZ_`Si~{5f'!̠_DMWᦃ-Ì f5c՘lr9ȭC_ͮCxZ[o#~ -wQAYqvuc(ɎrFCrp$Nd~}EM,]Ȇ'GrTLS.wdbƎlIW9͝0&Rs!{/.oފJW|tyA+>R
_y^JBM?ZrIbUAמ)5Ӧ^kZ)KHNYٟSB>E^^&q]VL5\E.AgL7"0xS;3/\d0r{l	ɺAm=͋_9X>祇R2y?~ri{p::u#IU|E[0o8n|g,X΀G{J RnhHZm39!%{YN _ID}sR- X]dN98rD	JDsW䩫70^rWrBewA4ie5&hHuu \0QɇSJ-EvgU0F΁y`.:EQnPL_R#^j{ j#eFV<ө+CZtH6炤KNL;dZd&`pNi')^r@~f"DO:yop;}x~mD[fڞ*c}D+ސ_ κS-nedYS0wxX(3rn{9cḊ+Ԏpqlϖ4,@PƝ!vZdh;MtOF'@ $w{{=7[Q@m7zFp_?IvspԷ<Tm iKDh6<뮴w,mn~pkMb#ZA^=6]nOI{mC8ۻ>#ŭ[ZƯI2RPjdaeS=b"#**TS)7	兙0< Qq	+:	#?N:(teg/h1HL/,§x`_ISflpl1tɕu<}}	E(t.9_dY$ʥ:ЛN<8*+Q@b;-x-6G?$]JyGMi(&sPTvJ²P_C|߸f{Z)M lͪGmhG`;%6S[*)k\eYLxƖܽsVׅ2{D[j#jġhWukww% ^̒7#}dd"g4u }=IuOࠥq=4wVIlukFu55Ų&wnRi\wy(w"FNNNȟ߸IN.ojSeXX(%]{X*S[VbI}5\R`c-KhN.][Rۅ20m>RGi+HKEӂ}ız ;X==;/ytp]'LU[+lj|t8"[fg x-D+lf޲w<!(1z o:mux0N Wpq?R?_	]keo'p#&::7FRqp=CGG)u|MH'݂-`Wruq+EDGQ;Vd0|YTO"S^uUCN9w^Hh&|2JN˵#YZhR;@1 r'nY:W=vU^X;gm&oYZ뗈a?;ÞƗm&afLd&79ƾoj;nk[P2.W9yj
*n8^(Uc,E*ҍ?Z w'xd(ѽ*^yee@gBù.	0]P1ys||<~M`?Ç1:.k4yXABOD*\QO!"U:ˈZkR+y@EIO#Y6;	вy<mP7~@}z\mmnVPt&M`Z?6>	/-8$y64xYs6_dB2ՑNoӑ+>S{&wXv_L"Xs.>HCyH$hwo/J!y 'W*z3!3)$7˜${;+UjvE2brGDͥ;RȚ]|tIFdA]"J&q!nY1;xX'
ʜ{;,LϘusVXG^ܞߗRxvPrj}wd!2W	|v~nQܘc0PlvMsZU~g+9 E>J.S'%:dynUy[XYD6(;yޒ)SDs;<HfJ<@KIU3	]1of~d%x!̫1bʜ,L~K^'#/#IBB@aIybH AF[_@ÃVQ.
0})p XR5t4,_MBK޽~@ޠ6gd(Q	*T]MC֐i fdD;?ךo:0OpL,!(D?.% >iY<*'_+QpcQ-܎;PuЏcbHh
A鍈F8qf}
Zgapb6FߥV@uǴȠ$j1	a1}LxI7Bty5oMU`֦ڂ2K߼!
#f?L&k4A
xņHw0$8(Ȳ-]aieC}o aD&pb*+!+xFU?}o'G,?$,	|hR1LQ;%/-/R}NXa(J9qm.Uq	w)R｢9ŜqEjtseWJ*ݡ1SFe:?ӧ`xj6ac(p|YJ,\$;qھE!je2[j%0j!M{,*f1vNFnCO.԰CWPloKSz)kB1O
I
3%-TQ}F<|^AoMǥx[`.a`0qfGC?q]EmTX</*qvlp2Q^)9h%/!*]`F
0ݺ!͌?M^',pf}֗ƢJQ[ː+/]v3i^"pze'USXb/D9!xRpq24rqGu5an4`zy^PWjy]_%+fDv=5/2qB<E̎@\v4nGș]̄,Cx1\VO.`$[:)eiR!CnکGshB3U|ќ񛹚 &kV	߰!jAI!"_1<n-|xy"bី1?[y&mZkg u
ol9=Z83͟$!g=9i.*Pݢzfs(1GġvUjGIkHaex;aaKV܁%k	5bDF{@>BXgi!p?#MC@LzǬ׎g}U4Mާ_GiWaK`$@/:|-):}$x͝02-㱰nųՖfT{]VΜZUn3SnӒgb)j]w3Ej_k;Bx?r]*"0͒c T?fy_4
'*xqҙ_𩣂c|BWLPkg'+njX[+}|m~ŋ]*h:\hrV9cTRͺCjn+uX6H}MӷȾN{]Ct̾XWs|FLNcQT67DkHEf`YkO1X9lyp[?8$a^aZ{sXŗ{G1[IŽG'3j'.	+::!p_,xb{I7o+>Et;)[SWK?V/lҩnӶxX[sF~ϯ80XJb>$8!)Jlh	ki/w=+;.EtB_<|.߹}l<Rw8h ch=!ȉ<L=V>#2eBQ:rP7Tה#LVIr8!)(qޓK}`"Ŕe4;GhW[{ZNsC,tؔh
L|gϞu{OЁ{IҔ*uF}n]I6eдz>պ;Gg%&Q5ˁΖXi ^IGL%WTm8XARg>Ql"BF !<ڙ)YK8C4jYwѳ>zb[_FrzZC.R/RT6<;2>`Gm#3ᄋum~8%}66J_TKC;u4ك:hgwOjcqz-hK/.d̈l.P>AމJ#lZneQ,@tK(Fh=DRچɶ lL&I[AċfVv3fNR\GpٱaSZUQH|!rJx3ku:sǔU.⒗:^MZ!ȷKUqY4hd,_ȸh<A1b0*
a($l54{ҁ:+ve{ 2,^Ό].R<{r^7P.l!jnv+JBx˅Y.˂f`Z˧Jw}@T\FomLc1;(wz>ܡ\X#6I&jFHDx]Y37Q*Zmy@?kAT:4sړ}Pi쭃8=ь!ra.xZeL71] 6W
'6_m櫰DKQxW:V KT!K-	ԡeVύU<-$|}|e&D
UojVwYJoe%LG~帡UЈțK!UmbWo0?]J! u2#G7vZxZ%o%T4k*yL:5m6<MT10e[O(:H64t78	U[@&yDhl&N"9l@ؘʊ-lB@MhjH%7+m2#8 uT_X\'0E1w@&2Σ3> aB+1sXvaoX{HgdWN-*cne{ϫߙ.ӸBYs7=k
w&N{J'&`.8^B
j2 5H
δKb1YBkWR-wId]&e&r4st|)WJap:h^ +Ə=+x amk
y2{g/t!xA
0Ebv9@W]'qHzFEJ&'" F+89ܝB6UFc$HQf5eO֖:3at)E3s|Z;ڧVA]ps2	I[hm{q89=U80ٝzX7mnB&|Mud]jyiinxmn0@wĈogԽK*cpjlgB*Ôdw8p9$}	Kw$6&Kusq]W~T!8i_B핃WS+$9J+A[Q&(7{?4*2jPcA-Xlaﲰ*MOWV|H?"GUl=e>^" kNycս?xx[Ȳ>'3IIKRRsK2JJS1%|P2r2RKSQJ*Bѱ@~-H:94%$Q3Q@,Z&W\WR 2vxUn0+zz+ТE۰-1Y$i0Gvb'v=>Ҕ]D6DAnk^wQ$Y@ʚh4^G%YnS:P5"Ȥ!+MFHނ5iINlMW1Esq-YǢ2R5z4FѤO}Ϳ(;ɬh: Om
cM؝?N3eH Ō]VN+WOgoz!{[-ď*P2oo߃Tz[-K*6=D#*XZ<64	ߡ*4b@OA.R7mF):8t@Me"baxK@Tv2w *դiJGrdƤI*Ƒ1%|5UR$0igr@63PGE0U̗E|cJ`m%(I8S"lR"q̘mdLeVzd|?WW߮N.v@y'ŭ-|FzpĥyC<
͞jj]]F٢z8N`"m	C8NVyڼPp̢9?4Cx{c\&ĢE'c`̜<sVAFfZ. ;H5xB 5ui-design-system": [
        "./dist/ui-design-systemmlx{1}C(fvF Lgx 
hcl-studio
hcl-studioDui-accessibility0accessibility	animation/	animation
background/
backgroundcode-display0code-displaydata-uti.
data-utilsfont-manager0font-managerR׊Q}x extends": "../../tsconfig.json")./../out-tsc/lib",
    "declaration": true,
    "declarationMap": true,
    "inlineSources": true,
    "sourceMap": true,
    "8types": []
  },
  "exclude": [
    "**/*.spec.ts"
  ]
}
Box8 ,,
      "ui-landing-pages/landing-pages#_Mxn %extends": "./tsconfig.lib.json",
  "cdeclarationMap": false)"compilationMode": "partial"
  }
}
J%<
}x [./../tsconfig$outDir": "../../out-tsc/spec",
    "types": [
      "jasmine"
    ]
  },
  "include": [
    "src/**/*.spec.ts",
    "src/**/*.d.ts"
  ]
}
y+.2x **/*.d.ts"
  ]
}
	,x lHlib",
    "declaration": true,
    "declarationMap": true,
    "inlineSources": true,
    "types": []
  },
  "exclude": [
    "
  ]
}
)x +
u+ID˦4?[GE=x8qD'ިn[&.B _ix8qH{}VȀUr(]4> 5{x8q|eoyj4U8rs}4 iAx8qȉ\zԏզZ<1~}4 mx8qZӬ==Zny Dh 
x +7$5VR%~j3?[}x-x +.Ő*@ߖ_?[]O1x +Tϙ!A?[ɦx:    00     %  6            %       h  6  (   0   `           $                                                                                                          I'J
J
I'                                                                                                                                                                        SEF	H
L	MPS                                                                                                                                                         KcDF	H
L	L	QQTZw                                                                                                                                            bFE	F	F	F	H
L	L	QQV\cbF                                                                                                                                I'J
MMF	F	H
H
L	QQVYafms{*                                                                                                                SSQMMML	L	H
L	L	QQV\fi	qv{י                                                                                                    KcZVVVVPPPPPQQVYafmq{
X                                                                                                Z\\\VVVVVPPQQV\ai	qv{
ǁ                                                                                                _\\\\\VVVVVVYafmq{
                                                                                                    bddb\\\\[[[[aai	qv{
ĥ                                                                                                        bFggebbbbaa__ai	mqv
:                                                                                                            igggeebbaadi	mqv{
                                                                                                             hQhhhhhhhhhhuuuu按	Ո	Ո	ՈǁE                                                                                                                                                                                                                                                                    7                                                                                                                                                                &                    S                                                                                                                                                                 
                {*%q-                                                                                                                                                                        bF'                                                                                                                                                        y	~y*                {Y'%                                                                                                                                                	|{6                 j)'                                                                                                                                                |	~{wK                ))&}                                        }                                         
{w[                ++)                                            !!   О                                            l	~{wl                !,++&                                        7!  !:                                         
	~wwr{                !,,,+                                            Ֆ%!!!$                                            [{wry                %ȱ--,,&                                         o###!!!!#l                                            	~wrn                %ش..-,, j                                        }&#%!$!#"                                        I	~wr k                &...--&                                            !%%$%## О                                            	~wro                )/....- S                                        )%$$%#&!*                                        6	|ro                ,///...'                                            #˱'%'&$                                            	|wt                -0///...=                                        e'''&!]                                        &	|	|	|             0000///.%                                         ''*'                                        	|	|         00000///.*                                        #㙿** О                                        	|        70000000//#                                          **                                          &         S00000000/-                                        $ʽ$                                        !6        o1000000000!                                        X!]                                          I        1100000000+}                                                                                
! [         11100000000                                                                                 !z"!l        "11111000000+                                                                         %#! |        #111110000000!                                                                         m%#"         #111111100000*                                                                        &'%"!        +11111100000e                                                                $O''%#" l
                    o)111110000(                                                                &)''#"! a                                      S&11110000X                                                        :+)''%#"!I                                                        =%011100'                                                        '+))'%#:                                                                        )$01110:                                                "-,++)'&                                                                                        "011&                                                'Ĺ,,)                                                                                                         !+1!*                                        $-+                                                                                                                          #}$x                                         m m                                                                               ?                    ?    ?                                    ?  ??  ?  ?                                ?  ?    (       @                                                                                     J'I	I	J'                                                                                                        \DF	H
L	QUv                                                                                        l F
jF	DH
L	OSXbk	w                                                                            RKPLLL	H
L	OS]fpzه	U                                                                    XYUUPPPOSXbkt~
Ș                                                                \^^ZZVVVV]fpy	q                                                                vfaa]]Z]]bkt~
                                                                    hggccbbflq
y	ŝ                                                                        g%hchchce`g^k[k[xY~W~W	UU                                                                                                                                                                \                                                                                                        ~        y(%\                                                                                                

z        zA(                                                                                                l	}v)        xY*%                        l פֿ骎骙⧠צО                          zr:        p+*}                               ʹ                            yZ	}wsI        ,+%                          T""! G                            ztyZ        .,-"i                            $#!!"!                         K	}t lj         ..,$                            $$$%#Ӏ                            	}t mz        #//.. T                        v$%%%                        ;	}tq        %0///)                            !鷴(%%Գ                            zt        &00/// >                        #B*) G                        *	}z        '000//%                            ((                                    */0100/ +                        $#Ӏ                                 -1/1000%                                                         /111100-                                                #!        11111100$                                                ##! +11101/1+                                        &%"        "j(110111!                                        $)'#!`                      Y%0010-l                                  ()'%"L                                         >%010#                                #t,*& ;                                                         +%/+                                ),!*                                                                        $'H                        %>$                                          Ã????(                                                            @(FNW)                                        QJIJ
Q_s㙆                                [XTRVi|                                cyda_er
i                    +        ]g>f<g9v85
3              wy|                                                \ ($            ygfb^          
~ pB,j             Ζ             Ky p)^.'            j$"#`            w k9w//#X        f &%$        ?	{tK 00(            #$՝            z` 010B        "%''        "5u"101&                        # a)110 0                !'("D        Z%0&                %(P                        J&(        -$=                              =  y  y  q            C8WA;xGimport { TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';

describe('AppComponent', () => {
  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [AppComponent],
    }).compileComponents();
  });

  it('should create the app', () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.componentInstance;
    expect(app).toBeTruthy();
  });

  it(`should have the 'demo-ui-essentials' title`, () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.componentInstance;
    expect(app.title).toEqual('demo-ui-essentials');
  });

  it('should render title', () => {
    const fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    const compiled = fixture.nativeElement as HTMLElement;
    expect(compiled.querySelector('h1')?.textContent).toContain('Hello, demo-ui-essentials');
  });
});
<x$xCimport { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { ButtonComponent } from '../../../ui-essentials/src/public-api';
import { FabComponent } from "../../../ui-essentials/src/lib/components/buttons/fab.component";
import { DashboardComponent } from "./features/dashboard/dashboard.component";

@Component({
  selector: 'app-root',
  imports: [RouterOutlet, ButtonComponent, FabComponent, DashboardComponent],
  template: `

  <skyui-dashboard></skyui-dashboard>

  `
})
export class AppComponent {
  title = 'demo-ui-essentials';
}
 5sʺPx;iBMBӀD Emx;i0f&#ؓ0 JSx?import { ApplicationConfig, provideZoneChangeDetection, importProvidersFrom } from '@angular/core';
import { provideRouter } from '@angular/router';
import { UiAccessibilityModule } from 'ui-accessibility';

import { routes } from './app.routes';

export const appConfig: ApplicationConfig = {
  providers: [
    provideZoneChangeDetection({ eventCoalescing: true }), 
    provideRouter(routes),
    importProvidersFrom(
      UiAccessibilityModule.forRoot({
        announcer: {
          defaultPoliteness: 'polite',
          defaultDuration: 4000,
          enabled: true
        },
        focusManagement: {
          trapFocus: true,
          restoreFocus: true,
          focusVisibleEnabled: true
        },
        keyboard: {
          enableShortcuts: true,
          enableArrowNavigation: true
        },
        skipLinks: {
          enabled: true,
          position: 'top',
          links: [
            { href: '#main', text: 'Skip to main content' },
            { href: '#nav', text: 'Skip to navigation' }
          ]
        },
        accessibility: {
          respectReducedMotion: true,
          respectHighContrast: true,
          injectAccessibilityStyles: true,
          addBodyClasses: true
        },
        development: {
          warnings: true,
          logging: true
        }
      })
    )
  ]
};
\LxJ 

('9../../../ui-accessibility/src/lib/ui-accessibility.moduleK	.*%xϵiDoS'HMf*(/LI/-I-(QŚ\\ xM import { Routes } from '@angular/router';

export const routes: Routes = [];
>#hx<*ottom-navigation-demo W#zLCPmmand-palette-demo 8<'W5)a|^쪗40000 container-demo 4t_.cYC[OƚO&B6C:'̼z#V|~Penhanced-table-demo 9kހ0zhbU40000 fab-menu-demo ỹ}ޮ໧f2)loating-toolbar-demo 7[,٢Ϯ$6$con-button-demo c2(%!1Yj/T!nackbar-demo g6XKrKtCX>;E?_:x
Y{L40000 stepper-demo  qa# b>4Q97=RΥM$40000 tag-input-demo ! 8Njڨ'qdnjT^:>9nm/%ansfer-list-demo jǽ83	COU|4x{ɿMɬL"LW9jcZ=-=krYgx* c?ҫ¼zf4|	8J9xV9 7[&>[RY!XT940000 alert-demo )Bkp[/gIDܑN>#&-#uC:ZQ8NjBXoA٧Mm-fD^s̘z	㈥;m6ld$y=>@?N@Y.=;e.?ZQaT$340000 container-demo Oj~2k	N޼7iʴb}{оY40000 drawer-demo o%~$ZG40000 empty-state-demo [ř[Mzbl40000 enhanced-table-demo hn_%zFYap֊v40000 fab-menu-demo =
rơ3lUFzh040000 file-upload-demo %a4v_]
40000 floating-toolbar-dCemo K	NB4oT`W40000 fontawesome-demo A}	iM/1(0?[qFwATxLq40000 grid-system-demo &`	Pl{W9Fg@Dqru0 ܞ9Sy.ܓm~
40000 modal-demo E.=zIr隲{TiC\N8ȽHW	B=[_3
0_*zVl6c2!IBΓe"ŔoR jtpOih8FY-f40000 spacer-demo DoG^40000 split-button-demo "͎ tӃ]ۖ40000 stepper-demo ۔(IHKY!
`PGyX_Mmm40000 toast-demo w@CiB_Rb~40000 tooltip-demo ao=|-H,#	iR-?d.%9/&
u40000 tree-view-demo ً9(X40000 video-player-demo z&֏xraa38x;{%spect-ratio-demo Us^|D7CMSs?CՑt#ento-grid-demo wus09[xޮ!8Pox-demo <87B9640000 breakpoint-container-demo ^!eX)BcMk@#Dyenter-demo sOJVҡOlumn-demo ܃t	]p/l.`'shboard-shell-demo p"
CipLW` Z;B;ip:e8%.	40000 divider-demo ߾R<SCH]{ד$eed-layout-demo ]KUW._93ex-demo -E#ڠId,}j#container-demo PdziS 'uz,Zch4Gr.$T,$j,U$+ist-detail-layout-demo `Ҿ/C'k+]z*Gr)croll-container-demo aY;g0>%-Nection-demo Mx|d@40000 sidebar-layout-demo .(.Ǻd:ack-demo W~lIjJOZeY| ./upporting-pane-layout-demo )DQLso=s{Tr
S&bs-container-demo o U:~o~
['U
ƸR=$2|s	,V](Jxs-40000 accessibility-demo mL:ZF22.U#nimations-demo \^)Ψ
2}0HN#ckgrounds-demo QnmWn $de-display-demo _RǔYH~!a-utils-demo \ؠXeu}6Bz`]<
kPHSi"-manager-demo v+Y1੢oԄ{|\%allery-grid-demo cMv-=}U5_$hcl-studio-demo t<]ekó[.*1finite-scroll-container-demo 2	B2lCGQ+&kanban-board-demo );cWaS9Vz_Ɠ asonry-demo k=jMQ_R*[Relect-demo "o):;O~SB	#plit-view-demo ،_b3&=@
S&ticky-layout-demo n?''V䉲cS<e
!extarea-demo YF[\J?`er=!-_0x"]
B:'Bsa-duDh:KWX;Р0%Ξj2߳uҋ5
XǓ$conversion-demo м1Q55HΙm$l`-EJMdGؓB{jqa؃k5ܐ>AJ+ኲy!n5O
40000 hero-sections-demo n4d,M)d&΀?anding-faq-demo rkڙ7 [q40000 landing-feature-grid-demo 䩰R=v"9j[O40000 landing-footer-demo sn$}ļ]40000 landing-header-demo z9ޕOm_40000 landing-logo-cloud-demo \0fPmA?40000 landing-statistics-demo q- xI%/)40000 landing-team-demo x>+aVۀW-qa&T40000 landing-templates-demo iK3d|/n40000 la\nding-testimonials-demo r!zS0;zb40000 landing-timeline-demo DQKG~X>P<tZ;Io v9d>*G֫U:\Hix4 N6oast-demo v8Y8 'G-k&3%,x/ Nrc\	ݙuP6&k&Rx  8i+Vs}ٙ
1x$!<div class="accessibility-demo">
  <!-- Skip Links Demo -->
  <ui-skip-links></ui-skip-links>

  <header class="demo-header">
    <h1 id="main">UI Accessibility Library Demo</h1>
    <p>Interactive examples of accessibility features with WCAG 2.1 Level AA compliance.</p>
    
    <ui-screen-reader-only>
      This page demonstrates various accessibility features. Use keyboard shortcuts: Ctrl+Shift+A to make announcements, Ctrl+M to toggle modal.
    </ui-screen-reader-only>
  </header>

  <!-- Current Preferences Display -->
  <section class="demo-section" aria-labelledby="preferences-heading">
    <h2 id="preferences-heading">Accessibility Preferences</h2>
    <div class="preferences-display">
      <p><strong>High Contrast:</strong> {{ currentPreferences.prefersHighContrast ? 'Enabled' : 'Disabled' }}</p>
      <p><strong>Reduced Motion:</strong> {{ currentPreferences.prefersReducedMotion ? 'Enabled' : 'Disabled' }}</p>
      <p><strong>Color Scheme:</strong> {{ currentPreferences.colorScheme || 'Not detected' }}</p>
      <ui-button variant="tonal" size="small" (click)="refreshPreferences()">
        Refresh Preferences
      </ui-button>
    </div>
  </section>

  <!-- Live Announcements Demo -->
  <section class="demo-section" aria-labelledby="announcements-heading">
    <h2 id="announcements-heading">Live Announcements</h2>
    <div class="demo-controls">
      <div class="input-group">
        <label for="announcement-text">Announcement Text:</label>
        <input 
          id="announcement-text"
          type="text" 
          [(ngModel)]="announcementText"
          class="demo-input"
        >
      </div>
      
      <div class="input-group">
        <label for="politeness-level">Politeness Level:</label>
        <select id="politeness-level" [(ngModel)]="selectedPoliteness" class="demo-select">
          <option value="polite">Polite</option>
          <option value="assertive">Assertive</option>
        </select>
      </div>

      <div class="button-group">
        <ui-button (click)="makeAnnouncement()">Make Announcement</ui-button>
        <ui-button variant="tonal" (click)="makeSequenceAnnouncement()">Sequence Announcement</ui-button>
      </div>

      <div class="button-group">
        <ui-button variant="filled" (click)="announceSuccess()">Success Message</ui-button>
        <ui-button variant="outlined" (click)="announceError()">Error Message</ui-button>
        <ui-button variant="tonal" (click)="announceLoading()">Loading Message</ui-button>
        <ui-button variant="outlined" (click)="simulateFormValidation()">Simulate Validation</ui-button>
      </div>
    </div>
  </section>

  <!-- Focus Management Demo -->
  <section class="demo-section" aria-labelledby="focus-heading">
    <h2 id="focus-heading">Focus Management</h2>
    
    <div class="focus-demo">
      <div class="input-group">
        <label for="monitored-input">Monitored Input (Focus Origin: {{ focusOrigin }}):</label>
        <input 
          #monitoredInput
          id="monitored-input"
          type="text" 
          placeholder="Click, tab, or programmatically focus this input"
          class="demo-input"
        >
      </div>

      <div class="button-group">
        <ui-button (click)="focusViaKeyboard()">Focus via Keyboard</ui-button>
        <ui-button (click)="focusViaMouse()">Focus via Mouse</ui-button>
        <ui-button (click)="focusViaProgram()">Focus via Program</ui-button>
      </div>
    </div>
  </section>

  <!-- Focus Trap Demo -->
  <section class="demo-section" aria-labelledby="trap-heading">
    <h2 id="trap-heading">Focus Trap</h2>
    
    <div class="trap-controls">
      <ui-button (click)="toggleFocusTrap()">
        {{ trapEnabled ? 'Disable' : 'Enable' }} Focus Trap
      </ui-button>
    </div>

    <div 
      #trapContainer
      class="focus-trap-container"
      [class.trap-enabled]="trapEnabled"
      [uiFocusTrap]="trapEnabled"
      [autoFocus]="true"
      [restoreFocus]="true"
    >
      <h3>Focus Trap Container {{ trapEnabled ? '(Active)' : '(Inactive)' }}</h3>
      <p>When enabled, Tab navigation will be trapped within this container.</p>
      
      <input type="text" placeholder="First input" class="demo-input">
      <input type="text" placeholder="Second input" class="demo-input">
      <ui-button>Trapped Button 1</ui-button>
      <ui-button variant="tonal">Trapped Button 2</ui-button>
      <select class="demo-select">
        <option>Option 1</option>
        <option>Option 2</option>
      </select>
      <textarea placeholder="Textarea" class="demo-textarea"></textarea>
    </div>
  </section>

  <!-- Arrow Navigation Demo -->
  <section class="demo-section" aria-labelledby="navigation-heading">
    <h2 id="navigation-heading">Arrow Navigation</h2>
    
    <div class="navigation-demo">
      <h3>Vertical Navigation (Use ↑↓ arrows):</h3>
      <ul 
        class="navigation-list vertical"
        uiArrowNavigation="vertical"
        [wrap]="true"
        (navigationChange)="onNavigationChange($event)"
      >
        @for (item of navigationItems; track item.id) {
          <li 
            [tabindex]="$first ? '0' : '-1'"
            [class.disabled]="item.disabled"
            [attr.aria-disabled]="item.disabled"
          >
            {{ item.label }}
          </li>
        }
      </ul>

      <h3>Grid Navigation (Use ↑↓←→ arrows, 3 columns):</h3>
      <div 
        class="navigation-grid"
        uiArrowNavigation="grid"
        [gridColumns]="3"
        [wrap]="true"
        (navigationChange)="onGridNavigationChange($event)"
      >
        @for (item of gridItems; track item.id) {
          <button 
            class="grid-item"
            [tabindex]="$first ? '0' : '-1'"
            [disabled]="item.disabled"
            [attr.aria-disabled]="item.disabled"
          >
            {{ item.label }}
          </button>
        }
      </div>
    </div>
  </section>

  <!-- Modal Demo -->
  <section class="demo-section" aria-labelledby="modal-heading">
    <h2 id="modal-heading">Modal with Focus Trap</h2>
    
    <ui-button (click)="toggleModal()">Open Modal</ui-button>

    @if (showModal) {
      <div class="modal-backdrop" (click)="toggleModal()">
        <div 
          class="modal-content" 
          [uiFocusTrap]="true"
          [autoFocus]="true"
          [restoreFocus]="true"
          role="dialog"
          aria-labelledby="modal-title"
          aria-modal="true"
          (click)="$event.stopPropagation()"
        >
          <header class="modal-header">
            <h3 id="modal-title">Demo Modal</h3>
            <button 
              class="modal-close" 
              (click)="toggleModal()"
              aria-label="Close modal"
            >
              ×
            </button>
          </header>

          <div class="modal-body">
            <p>This modal demonstrates focus trapping. Tab navigation is contained within the modal.</p>
            
            <input type="text" placeholder="Modal input" class="demo-input">
            <ui-button variant="tonal">Modal Button</ui-button>
          </div>

          <footer class="modal-footer">
            <ui-button (click)="toggleModal()">Close</ui-button>
            <ui-button variant="filled">Save Changes</ui-button>
          </footer>
        </div>
      </div>
    }
  </section>

  <!-- Screen Reader Components -->
  <section class="demo-section" aria-labelledby="sr-heading">
    <h2 id="sr-heading">Screen Reader Components</h2>
    
    <div class="sr-demo">
      <h3>Screen Reader Only Text:</h3>
      <p>
        This text is visible.
        <ui-screen-reader-only>This text is only for screen readers.</ui-screen-reader-only>
        This text is visible again.
      </p>

      <h3>Focusable Screen Reader Text:</h3>
      <ui-screen-reader-only type="focusable">
        This text becomes visible when focused (try tabbing through the page).
      </ui-screen-reader-only>

      <h3>Dynamic Status Messages:</h3>
      <div class="status-demo">
        <ui-screen-reader-only type="status" statusType="success">
          Form submitted successfully!
        </ui-screen-reader-only>
        
        <ui-screen-reader-only type="status" statusType="error">
          Error: Please check your input.
        </ui-screen-reader-only>
      </div>
    </div>
  </section>

  <!-- Keyboard Shortcuts Info -->
  <section class="demo-section" aria-labelledby="shortcuts-heading">
    <h2 id="shortcuts-heading">Keyboard Shortcuts</h2>
    
    <div class="shortcuts-info">
      <dl class="shortcuts-list">
        <dt>Ctrl + Shift + A</dt>
        <dd>Make announcement</dd>
        
        <dt>Ctrl + M</dt>
        <dd>Toggle modal</dd>
        
        <dt>Tab / Shift + Tab</dt>
        <dd>Navigate through interactive elements</dd>
        
        <dt>Arrow Keys</dt>
        <dd>Navigate within lists and grids (when focused)</dd>
        
        <dt>Home / End</dt>
        <dd>Jump to first/last item in navigable containers</dd>
        
        <dt>Escape</dt>
        <dd>Close modal or exit focus trap</dd>
      </dl>
    </div>
  </section>

  <!-- Footer -->
  <footer class="demo-footer">
    <p>
      <ui-screen-reader-only>End of accessibility demo.</ui-screen-reader-only>
      This demo showcases WCAG 2.1 Level AA compliant accessibility features using semantic design tokens.
    </p>
  </footer>
</div>
f?Ox"k@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.accessibility-demo {
  padding: $semantic-spacing-layout-md;
  max-width: 1200px;
  margin: 0 auto;
  font-family: system-ui, -apple-system, sans-serif;
  line-height: 1.5;
}

.demo-header {
  text-align: center;
  margin-bottom: $semantic-spacing-component-lg * 2;
  
  h1 {
    color: #1a1a1a;
    font-size: 2rem;
    font-weight: 600;
    margin-bottom: $semantic-spacing-component-lg;
  }
  
  p {
    color: #666;
    font-size: 1.125rem;
  }
}

.demo-section {
  margin-bottom: $semantic-spacing-component-lg * 2;
  padding: $semantic-spacing-component-md $semantic-spacing-component-md;
  background: #f8f9fa;
  border-radius: 8px;
  border: 1px solid #e0e0e0;
  
  h2 {
    color: #1a1a1a;
    font-size: 1.5rem;
    font-weight: 600;
    margin-bottom: $semantic-spacing-component-lg;
    border-bottom: 2px solid #007bff;
    padding-bottom: $semantic-spacing-component-md / 2;
  }
  
  h3 {
    color: #1a1a1a;
    font-size: 1.25rem;
    font-weight: 600;
    margin: $semantic-spacing-component-lg 0 $semantic-spacing-component-lg / 2 0;
  }
}

// Preferences Display
.preferences-display {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-sm;
  padding: $semantic-spacing-component-md;
  background: #fff;
  border-radius: 4px;
  border: 1px solid #e0e0e0;
  
  p {
    margin: 0;
    font-size: 1rem;
    color: #666;
  }
}

// Demo Controls
.demo-controls {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-md;
}

.input-group {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-sm;
  
  label {
    font-weight: 500;
    color: #1a1a1a;
    font-size: 1rem;
  }
}

.button-group {
  display: flex;
  gap: $semantic-spacing-component-sm;
  flex-wrap: wrap;
  align-items: center;
}

.demo-input {
  padding: $semantic-spacing-component-md $semantic-spacing-component-md;
  border: 1px solid #ccc;
  border-radius: 4px;
  background: #fff;
  color: #1a1a1a;
  font-size: 1rem;
  transition: border-color 0.15s ease-out;
  
  &:focus {
    outline: 2px solid #007bff;
    outline-offset: 2px;
    border-color: #007bff;
  }
  
  &::placeholder {
    color: #999;
  }
}

.demo-select {
  @extend .demo-input;
  cursor: pointer;
}

.demo-textarea {
  @extend .demo-input;
  min-height: 80px;
  resize: vertical;
}

// Focus Demo
.focus-demo {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-md;
}

// Focus Trap Demo
.trap-controls {
  margin-bottom: $semantic-spacing-component-lg;
}

.focus-trap-container {
  padding: $semantic-spacing-component-md * 1.5;
  border: 2px dashed #e0e0e0;
  border-radius: 8px;
  background: #fff;
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-md;
  transition: all 0.3s ease-out;
  
  &.trap-enabled {
    border-color: #007bff;
    background: #f0f8ff;
    box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);
  }
  
  h3 {
    margin-top: 0;
    color: #1a1a1a;
  }
  
  p {
    color: #666;
    margin: 0;
  }
}

// Navigation Demo
.navigation-demo {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-lg;
}

.navigation-list {
  list-style: none;
  padding: 0;
  margin: 0;
  border: 1px solid #e0e0e0;
  border-radius: 4px;
  overflow: hidden;
  
  li {
    padding: $semantic-spacing-component-md $semantic-spacing-component-md;
    background: #fff;
    border-bottom: 1px solid #e0e0e0;
    cursor: pointer;
    transition: all 0.15s ease-out;
    color: #1a1a1a;
    
    &:last-child {
      border-bottom: none;
    }
    
    &:hover {
      background: #f5f5f5;
    }
    
    &:focus {
      outline: 2px solid #007bff;
      outline-offset: -2px;
      background: #f0f8ff;
    }
    
    &.disabled {
      opacity: 0.6;
      cursor: not-allowed;
      color: #999;
    }
  }
}

.navigation-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: $semantic-spacing-component-sm;
  padding: $semantic-spacing-component-md;
  border: 1px solid #e0e0e0;
  border-radius: 4px;
  background: #fff;
  
  .grid-item {
    padding: $semantic-spacing-component-md;
    border: 1px solid #ccc;
    border-radius: 4px;
    background: #e9ecef;
    color: #495057;
    cursor: pointer;
    transition: all 0.15s ease-out;
    font-size: 0.875rem;
    
    &:hover:not(:disabled) {
      background: #dee2e6;
    }
    
    &:focus {
      outline: 2px solid #007bff;
      outline-offset: 2px;
    }
    
    &:disabled {
      opacity: 0.6;
      cursor: not-allowed;
      background: #f8f9fa;
      color: #999;
    }
  }
}

// Modal Demo
.modal-backdrop {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
  animation: fadeIn 0.3s ease-out;
}

.modal-content {
  background: #fff;
  border-radius: 12px;
  box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
  min-width: 400px;
  max-width: 600px;
  max-height: 80vh;
  overflow: hidden;
  animation: slideIn 0.3s ease-out;
  
  .modal-header {
    padding: $semantic-spacing-component-md $semantic-spacing-component-md;
    background: #f8f9fa;
    border-bottom: 1px solid #e0e0e0;
    display: flex;
    justify-content: space-between;
    align-items: center;
    
    h3 {
      margin: 0;
      color: #1a1a1a;
    }
    
    .modal-close {
      background: none;
      border: none;
      font-size: 24px;
      cursor: pointer;
      color: #666;
      padding: 4px 8px;
      border-radius: 4px;
      transition: all 0.15s ease-out;
      
      &:hover {
        background: #f5f5f5;
        color: #1a1a1a;
      }
      
      &:focus {
        outline: 2px solid #007bff;
        outline-offset: 2px;
      }
    }
  }
  
  .modal-body {
    padding: $semantic-spacing-component-md * 1.5;
    
    p {
      color: #666;
      margin-bottom: $semantic-spacing-component-lg;
    }
    
    .demo-input {
      width: 100%;
      margin-bottom: $semantic-spacing-component-lg;
    }
  }
  
  .modal-footer {
    padding: $semantic-spacing-component-md $semantic-spacing-component-md;
    background: #f8f9fa;
    border-top: 1px solid #e0e0e0;
    display: flex;
    gap: $semantic-spacing-component-sm;
    justify-content: flex-end;
  }
}

// Screen Reader Demo
.sr-demo {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-md;
  
  p {
    color: #666;
    margin: $semantic-spacing-component-lg / 2 0;
  }
}

.status-demo {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-sm;
}

// Keyboard Shortcuts
.shortcuts-info {
  background: #f5f5f5;
  padding: $semantic-spacing-component-md;
  border-radius: 4px;
  border: 1px solid #e0e0e0;
}

.shortcuts-list {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: $semantic-spacing-component-sm $semantic-spacing-component-md;
  margin: 0;
  
  dt {
    font-weight: 500;
    color: #1a1a1a;
    font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
    font-size: 0.875rem;
    background: #e9ecef;
    padding: 4px 8px;
    border-radius: 4px;
    text-align: center;
  }
  
  dd {
    margin: 0;
    color: #666;
    display: flex;
    align-items: center;
  }
}

// Footer
.demo-footer {
  text-align: center;
  padding: $semantic-spacing-component-md * 2;
  border-top: 1px solid #e0e0e0;
  margin-top: $semantic-spacing-component-lg * 2;
  
  p {
    color: #666;
    font-size: 0.875rem;
    margin: 0;
  }
}

// Animations
@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes slideIn {
  from {
    opacity: 0;
    transform: translateY(-20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

// Responsive Design
@media (max-width: 768px) {
  .accessibility-demo {
    padding: $semantic-spacing-component-md / 2;
  }
  
  .demo-section {
    padding: $semantic-spacing-component-md / 2;
  }
  
  .button-group {
    flex-direction: column;
    align-items: stretch;
  }
  
  .navigation-grid {
    grid-template-columns: repeat(2, 1fr);
  }
  
  .shortcuts-list {
    grid-template-columns: 1fr;
    gap: $semantic-spacing-component-sm;
    
    dt {
      text-align: left;
    }
  }
  
  .modal-content {
    min-width: 90vw;
    margin: $semantic-spacing-component-md;
  }
}

// High Contrast Mode Support
@media (prefers-contrast: high) {
  .demo-section {
    border-color: ButtonText;
  }
  
  .focus-trap-container.trap-enabled {
    border-color: Highlight;
  }
  
  .navigation-list li:focus {
    outline-color: Highlight;
  }
  
  .grid-item:focus {
    outline-color: Highlight;
  }
}

// Reduced Motion Support
@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.01s !important;
    transition-duration: 0.01s !important;
  }
}dxnimport { Component, OnInit, OnDestroy, ViewChild, ElementRef, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { UiAccessibilityModule } from '../../../../../ui-accessibility/src/lib/ui-accessibility.module';
import { ButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons/button.component';
import { LiveAnnouncerService } from '../../../../../ui-accessibility/src/lib/services/live-announcer/live-announcer.service';
import { FocusMonitorService } from '../../../../../ui-accessibility/src/lib/services/focus-monitor/focus-monitor.service';
import { KeyboardManagerService } from '../../../../../ui-accessibility/src/lib/services/keyboard-manager/keyboard-manager.service';
import { HighContrastService } from '../../../../../ui-accessibility/src/lib/services/high-contrast/high-contrast.service';
import { A11yConfigService } from '../../../../../ui-accessibility/src/lib/services/a11y-config/a11y-config.service';


@Component({
  selector: 'app-accessibility-demo',
  imports: [
    CommonModule,
    FormsModule,
    UiAccessibilityModule,
    ButtonComponent
  ],
  templateUrl: './accessibility-demo.component.html',
  styleUrl: './accessibility-demo.component.scss'
})
export class AccessibilityDemoComponent implements OnInit, OnDestroy {
  private liveAnnouncer = inject(LiveAnnouncerService);
  private focusMonitor = inject(FocusMonitorService);
  private keyboardManager = inject(KeyboardManagerService);
  private highContrast = inject(HighContrastService);
  private a11yConfig = inject(A11yConfigService);

  @ViewChild('trapContainer') trapContainer!: ElementRef;
  @ViewChild('monitoredInput') monitoredInput!: ElementRef;

  // Demo state
  trapEnabled = false;
  showModal = false;
  currentPreferences: any = {};
  focusOrigin = '';
  announcementText = 'Hello, this is a test announcement!';
  selectedPoliteness: 'polite' | 'assertive' = 'polite';

  // Navigation demo items
  navigationItems = [
    { id: 1, label: 'Profile Settings', disabled: false },
    { id: 2, label: 'Account Details', disabled: false },
    { id: 3, label: 'Privacy Controls', disabled: true },
    { id: 4, label: 'Notifications', disabled: false },
    { id: 5, label: 'Security Options', disabled: false }
  ];

  // Grid navigation items
  gridItems = Array.from({ length: 12 }, (_, i) => ({
    id: i + 1,
    label: `Item ${i + 1}`,
    disabled: i === 5 // Make item 6 disabled
  }));

  ngOnInit(): void {
    this.setupKeyboardShortcuts();
    this.setupFocusMonitoring();
    this.getCurrentPreferences();
  }

  ngOnDestroy(): void {
    this.keyboardManager.unregisterAll();
  }

  private setupKeyboardShortcuts(): void {
    // Global shortcuts
    this.keyboardManager.registerGlobalShortcut('announce', {
      key: 'a',
      ctrlKey: true,
      shiftKey: true,
      description: 'Make announcement',
      handler: () => this.makeAnnouncement()
    });

    this.keyboardManager.registerGlobalShortcut('toggleModal', {
      key: 'm',
      ctrlKey: true,
      description: 'Toggle modal',
      handler: () => this.toggleModal()
    });
  }

  private setupFocusMonitoring(): void {
    // Monitor focus on the input field
    setTimeout(() => {
      if (this.monitoredInput) {
        this.focusMonitor.monitor(this.monitoredInput).subscribe(focusEvent => {
          this.focusOrigin = focusEvent.origin || 'none';
          if (focusEvent.origin) {
            this.liveAnnouncer.announce(
              `Input focused via ${focusEvent.origin}`,
              'polite'
            );
          }
        });
      }
    }, 100);
  }

  private getCurrentPreferences(): void {
    this.currentPreferences = this.highContrast.getCurrentPreferences();
  }

  // Demo actions
  makeAnnouncement(): void {
    this.liveAnnouncer.announce(this.announcementText, this.selectedPoliteness);
  }

  makeSequenceAnnouncement(): void {
    const messages = [
      'Starting process...',
      'Processing data...',
      'Validating information...',
      'Process completed successfully!'
    ];
    this.liveAnnouncer.announceSequence(messages, 'polite', 1500);
  }

  toggleFocusTrap(): void {
    this.trapEnabled = !this.trapEnabled;
    this.liveAnnouncer.announce(
      `Focus trap ${this.trapEnabled ? 'enabled' : 'disabled'}`,
      'assertive'
    );
  }

  toggleModal(): void {
    this.showModal = !this.showModal;
    if (this.showModal) {
      this.liveAnnouncer.announce('Modal opened', 'assertive');
    } else {
      this.liveAnnouncer.announce('Modal closed', 'assertive');
    }
  }

  focusViaKeyboard(): void {
    if (this.monitoredInput) {
      this.focusMonitor.focusVia(this.monitoredInput, 'keyboard');
    }
  }

  focusViaMouse(): void {
    if (this.monitoredInput) {
      this.focusMonitor.focusVia(this.monitoredInput, 'mouse');
    }
  }

  focusViaProgram(): void {
    if (this.monitoredInput) {
      this.focusMonitor.focusVia(this.monitoredInput, 'program');
    }
  }

  onNavigationChange(event: any): void {
    this.liveAnnouncer.announce(
      `Navigated to ${this.navigationItems[event.nextIndex]?.label}`,
      'polite'
    );
  }

  onGridNavigationChange(event: any): void {
    this.liveAnnouncer.announce(
      `Navigated to ${this.gridItems[event.nextIndex]?.label}`,
      'polite'
    );
  }

  announceError(): void {
    this.liveAnnouncer.announce(
      'Error: Please fix the required fields before continuing',
      'assertive'
    );
  }

  announceSuccess(): void {
    this.liveAnnouncer.announce(
      'Success: Your changes have been saved',
      'polite'
    );
  }

  announceLoading(): void {
    this.liveAnnouncer.announce(
      'Loading content, please wait...',
      'polite'
    );
  }

  refreshPreferences(): void {
    this.getCurrentPreferences();
    this.liveAnnouncer.announce('Accessibility preferences updated', 'polite');
  }

  simulateFormValidation(): void {
    // Simulate a form validation scenario
    this.liveAnnouncer.announce('Validating form...', 'polite');
    
    setTimeout(() => {
      this.liveAnnouncer.announce(
        'Form validation complete. 2 errors found.',
        'assertive'
      );
    }, 2000);
  }
}
|x{g@gn[.}}܂PO̤̜̒J|D^j^IBb^BqjQY&P+kr&OfYc^^~i^rjQ0D[~rio~^fI>{b Gfzs~^IQbq	a%P8-3*UV^>uk.T׻StkJKJ2ƥ5[ofb aLx[ms6_w#ijI\zKھN'S"!	DpR߳ HQ"eK~I{sԖb8q>sO=@*0cxQxt,G;5kJAl_갴\1vۈ@ŒN/ma $Wkb%6$yU,ØJxL/X7 \ϒ84ٻ{"H7Ǝ}9aƜmO	wO- @iA] 踋!7}n`vo[B-/ƊEhqP\e3n>T:`j$Cp5/Đ*i
*ŉVYB+}uzrʤ; wY"%Nv-̲ǉkVZep耰A-  %:P0*t3|bȉ`T\Gq2	,<iPq7c4P=aI XaS,"f:e`c{ F2}P/v܅j%ݭzrOx	0Oz$Hhn%#G!h_OERyyZ7I%OY"=(bA	НSoJns:ٛ+s?%(FLfž]gՇB@@k֓jC4&Ha82fϊd\D[(x{#b ?LGODF_gc?ԗ*J2Tx(1KFE{ލBOv)aU5bQKRMU{Crbw!E,Eʪ.=GNm%ef^T,N=K<>ܠ^M,'ܛ!X#n++ߚ[Ӳ.PJR:oȁTX	K#d>
I)/B%{#^~rưeCCtqlNӄM0\B9X AjOwe7((BiĖ+(!e&>/-hS6Jyu	vAG7(uAahA)N&NiRɸ5¤nzNVQ-J$E6>[l鰷'G>uQ0|}2d@$$S;:C9m'Bgp#J-<t_SA ᐂ&N"Zz.-xWjw5+l[9G+H+:|X-Kx.Bȗt[nMXrx<`73Sꖶva%
;BBh/6=HDv}y1!^ F@Yv{u-y	ˮ {	C^ïJu*(p8
(1521UuΖV)x&	jzJz['o6xҹ	ev˱2&h\.p[-pTU&p:
[5t˞ JW\ʬ U1eb$_
$ȷz4Rr	 F%݊*X=asn euj<Ʀ/zQ?OcsC_knPگoAA:oKkܨ(Lm>8"?B>PnZh7樥c"6y\Z$;nU!j66GB>Jrs@-!Nг6BJTG\PyAY&+VeR΢Ȝr̓Bj+/3ۣ%Ss="9/3;
$pW<cƣ-sአUʳLOk#V	Ҭa3&=>0²'/wY`kDd{_2J#w:O_UsΡj:טj2pvz	&ܑfmΕW(j&_)cK2XvE7rWN-Ucұ¨]D"%m$%_ӘηvZ+E}VEl3qO"
AZrjejއ:5I/r*[3;Q`G85E$?^Bz-.¦1e
{4Hwmco@𳘮Z	[Sƹ\q|:M}#mD|ά.ˠ#]kd	x<S5&!ʕF/ݎjm̂oO7?R[þS~j/Wz0FG P
>n]ݽK
;;zR-|T(A5֓ŶU!)R*XQP*2mt>[f8&tG|μߩ>E=kîb}Y;L6Ii<4{qXaNw9~gqd<c;֎{hhvѻ-]D*٨m6Zv~ͫ#r-	{0k}F
pB	ODD>SnO˘Wi
{"kŘ_JDnw熬aX.D47B	8^-]\u
yя՝z{o.~Piv9#$sB|tq/Sq?İyNawy U+*zweaJX,zt~1GNЋL;ޓ.4RSxr˯/raQZ}6wRbg-}hfl\o`EY%+B\eQ0zqJ5].e7kUYv+|v@j\B.;}ݳx]* ,Svlu}=[X5[ᬕIdǭӡYc.\i9de拀sx8/cIbG9`o4=kWTH,Nt%9SYܘVFk_xn@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-bottom-navigation {
  // Core Structure
  display: flex;
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: $semantic-z-index-dropdown;
  align-items: center;
  justify-content: space-around;
  
  // Layout & Spacing
  padding: $semantic-spacing-component-sm;
  min-height: $semantic-sizing-touch-target;
  
  // Visual Design
  background: $semantic-color-surface-primary;
  border-top: $semantic-border-width-1 solid $semantic-color-border-primary;
  box-shadow: $semantic-shadow-elevation-3;
  
  // Transitions
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  
  // Size Variants
  &--sm {
    min-height: $semantic-sizing-button-height-sm;
    padding: $semantic-spacing-component-xs;
  }
  
  &--md {
    min-height: $semantic-sizing-touch-target;
    padding: $semantic-spacing-component-sm;
  }
  
  &--lg {
    min-height: $semantic-sizing-button-height-lg;
    padding: $semantic-spacing-component-md;
  }
  
  // Variant Styles
  &--primary {
    background: $semantic-color-primary;
    border-top-color: $semantic-color-primary;
    color: $semantic-color-on-primary;
    
    .ui-bottom-navigation__item {
      color: $semantic-color-on-primary;
      
      &--active {
        background: rgba(255, 255, 255, 0.1);
      }
      
      &:hover:not(&--active) {
        background: rgba(255, 255, 255, 0.05);
      }
    }
  }
  
  &--secondary {
    background: $semantic-color-secondary;
    border-top-color: $semantic-color-secondary;
    color: $semantic-color-on-secondary;
    
    .ui-bottom-navigation__item {
      color: $semantic-color-on-secondary;
      
      &--active {
        background: rgba(255, 255, 255, 0.1);
      }
      
      &:hover:not(&--active) {
        background: rgba(255, 255, 255, 0.05);
      }
    }
  }
  
  // Elevated variant
  &--elevated {
    box-shadow: $semantic-shadow-elevation-4;
  }
  
  // Hidden variant for dynamic showing/hiding
  &--hidden {
    transform: translateY(100%);
  }
  
  // BEM Element - Navigation Item
  &__item {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    flex: 1;
    min-width: $semantic-sizing-touch-minimum;
    min-height: $semantic-sizing-touch-minimum;
    padding: $semantic-spacing-component-xs;
    border-radius: $semantic-border-radius-sm;
    cursor: pointer;
    text-decoration: none;
    color: $semantic-color-text-secondary;
    
    // Typography
    font-family: map-get($semantic-typography-caption, font-family);
    font-size: map-get($semantic-typography-caption, font-size);
    font-weight: map-get($semantic-typography-caption, font-weight);
    line-height: map-get($semantic-typography-caption, line-height);
    
    // Transitions
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    // Interactive States
    &:hover:not(&--disabled):not(&--active) {
      background: $semantic-color-surface-elevated;
      color: $semantic-color-text-primary;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    &:active:not(&--disabled) {
      transform: scale(0.98);
    }
    
    // Active State
    &--active {
      background: $semantic-color-interactive-primary;
      color: $semantic-color-primary;
      font-weight: $semantic-typography-font-weight-semibold;
    }
    
    // Disabled State
    &--disabled {
      opacity: $semantic-opacity-disabled;
      cursor: not-allowed;
      pointer-events: none;
    }
    
    // Badge modifier
    &--has-badge {
      position: relative;
    }
  }
  
  // BEM Element - Icon
  &__icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: $semantic-sizing-icon-navigation;
    height: $semantic-sizing-icon-navigation;
    margin-bottom: $semantic-spacing-content-line-tight;
    
    // Icon sizing variants
    .ui-bottom-navigation--sm & {
      width: $semantic-sizing-icon-inline;
      height: $semantic-sizing-icon-inline;
    }
    
    .ui-bottom-navigation--lg & {
      width: $semantic-sizing-icon-button;
      height: $semantic-sizing-icon-button;
    }
  }
  
  // BEM Element - Label
  &__label {
    text-align: center;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
    
    // Typography variants by size
    .ui-bottom-navigation--sm & {
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
    }
    
    .ui-bottom-navigation--lg & {
      font-family: map-get($semantic-typography-body-medium, font-family);
      font-size: map-get($semantic-typography-body-medium, font-size);
      font-weight: map-get($semantic-typography-body-medium, font-weight);
      line-height: map-get($semantic-typography-body-medium, line-height);
    }
  }
  
  // BEM Element - Badge
  &__badge {
    position: absolute;
    top: -$semantic-spacing-component-xs;
    right: -$semantic-spacing-component-xs;
    min-width: $semantic-sizing-icon-inline;
    height: $semantic-sizing-icon-inline;
    display: flex;
    align-items: center;
    justify-content: center;
    background: $semantic-color-danger;
    color: $semantic-color-on-danger;
    border-radius: $semantic-border-radius-full;
    padding: 0 $semantic-spacing-component-xs;
    
    // Typography
    font-family: map-get($semantic-typography-caption, font-family);
    font-size: map-get($semantic-typography-caption, font-size);
    font-weight: $semantic-typography-font-weight-semibold;
    line-height: map-get($semantic-typography-caption, line-height);
    
    // Hide if no content
    &:empty {
      min-width: 8px;
      height: 8px;
      padding: 0;
    }
  }
  
  // Responsive Design
  @media (max-width: $semantic-breakpoint-sm - 1) {
    padding: $semantic-spacing-component-xs;
    
    .ui-bottom-navigation__item {
      padding: $semantic-spacing-component-xs * 0.5;
    }
    
    .ui-bottom-navigation__label {
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
    }
  }
  
  @media (max-width: $semantic-breakpoint-md - 1) {
    // Ensure touch targets remain accessible on tablets
    .ui-bottom-navigation__item {
      min-height: $semantic-sizing-touch-target;
    }
  }
}VxU53@use '	9' as *;

.demo-container {
Mlayout-section-md;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
M#layout-section-lg;
  
  h3 {	/
heading-h3L<
heading-h3
heading-h3
>
heading-h35O)heading;
  }
  
  h4 {	/
heading-h4L<
heading-h4
heading-h4
>
heading-h45O)heading;
  }
  
  p {	/+`(<
*5	O)Gparagraph;
  }
}

.demo-row {
  display: flex;
  flex-wrap: wrap;
  gap@egrid-gap-md;
  align-items: flex-start;
}

.toast-wrapper {
  flex: 0 0 auto;
}

.controls-section {
M#Olayout-section-md;
}

.button-group {
  display: flex;
  flex-wrap: wrap;
  gap@%P".lg;
}

.demo-button {
  display: inline-flex;
gap@interactive-button-padding-yAinteractive-button-padding-x;
2T	button-radius;
	*button`(button-medium, font-size);
-utton
*button-medium, line-height);
	cOdmd;
  
  &:hover {
  !
button-hovN$surface-secondary;
  }
  
!;.+outline-offset: 2px;
  }
  
  &:active {
  !button-rest;px);
  }
  (=5border-1L
    &:hover {
   Lhover;N51 secondary;
    
    &:hover {
  /"hover;
    }
  }
  
  &--warning {Q!	warning;
1on-warning;
    border-1warning;
    
    &:hover {
   warning;"!hover;
    }
  }
  
  &--danger {QZ1danger;
    
    &:hover {
   danger;"?hover;
    }
  }
}

.toast-container {
  position: fixed;
  top@layout-section-md;
  right@layout-section-md7modal;
  display: flex;
  flex-direction: column;
  gap@% ax-width: 400px;
  width: 100%;
M
  .ui-toast {
    pointer-events: auto;
  }
}

.stats-section {
  margin-top@layout-section-md;
'lg;
border%subtle;
P	"card-radius;
}

.stats-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: $semantic-Lgrid-gap-md;
M%#lg;
}

.stat-item {
  display: flex	between;
%^%subtle;
P	-}

.stat-label {
	,+`(size);
I
*line-height);
	}

.stat-value {
	,labe`(label, font-size);
<
*label, line-height);
L	0}

// Responsive Design
@media (max-width: calc(px)) {
  .demo-container { glayout-section-sm;
  }
  
  .demo-row {
    flex-direction: column;
  }
  
  .toast-container {
    top@layout-section-sm;
    right@layout-section-sm;
    left@layout-section-sm;
    max-width: none;
  }
  
  .button-group {
    flex-direction: column;
  }
  
  .stats-grid {
    grid-te4mplate-columns: 1fr;
  }
}

@media (max-width: calc(px)) {
  .demo-container { 6layout-section-xs;
  }
  
  .toast-container {
    top@layout-section-xs;
    right@layout-section-xs;
    left@layout-section-xs;
  }
}.x_
51Osnackbar`*B=layout-section-md;
  left: 50%;
  transform: translateX(-50%);modal;
  max-width: 90vw;
  width: auto;
  min-width: 300pxBmdA	lg;
  gap@$:border%secondary;
P	)lg+4;
  
  // Typography
	,+`(size);
I
*line-height);
O>normaq[|Amd;	/`(y
*i
*20md+mdAlgolg;	/largeL<large"large
>.large, line-height);
  }
  
  // Color Variant'>5border-1L}
  
  &--success {Q!	success;
1on-success;
    border-1success;
  }
  
  &--warning {Q!	warning;
1on-warning;
    border-1warning;
  }
  
  &--danger {QZ1danger;
  }
  
  &--info {Q!info;
1on-info;
    border-16info;
  }
  
  // Position Variants
  &--top {
    top@@layout-section-md;
    bottom: auto;
  }
  
  &--left {
    left@Nlayout-section-md;
    transform: translateX(0);
  }
  
  &--right {
    right@layout-section-md;
    left: auto;
    transform: translateX(0);
  }
  
  // Animation States
  &--entering {
    opacity: 0;
    transform: translateX(-50%) translateY(20px);
  }
  
  &--exiting {
    opacity: 0;
    transform: translateX(-50%) translatfeY(20px);
  }
  
  // BEM Elements
  &__content {
    flex: 1;
    min-width: 0;
    
    &--multiline/&ntent-line-tight 0;
    }
  }
  
  &__message {
    color: inherit;
    margin: 0;
    overflow-wrap: break-word;
  }
  
  &__actionsM gap@	
argin-left@$T  flex-shrink: 0;
  }
  
  &__action {
    background: transparent;
    border: none1P	Gransition: background-color*JDUse inherited text color with opacity for actions
    color: inherit41medium;
    
    &:hover {
      background-color/1)-color/M2);
    }
  }
  
  &__dismiss {
    background: transparent;
    border: none1P	Fmargin-left@$  color: inherit;O 6transition: background-color*G &:hover {
      background-color/1)-color/2)NIcon styling
  &__icon {
    flex-shrink: 0;
    color: inherit;
    font-size"Fbottom@layout-section-sm;
    left@layout-section-sm;
    right@layout-section-sm;
    transform: translateX(0);
    max-width: none;
    
    &--left,
    &--right {
      left: $semantic-spNlayout-section-sm;
      right@0layout-section-sm;
      transform: translateX(0:3^  bottom@layout-section-xs;
    left@layout-section-xs;
    right@layout-section-xs;
    	/`(y
*i
*#
    &__actions {
      margin-left@  gap@}
  }
}.N!sxVk#U'6mҤڦiO[{ٞB
v4sLf9'OJ_|W/",  ʾzΙt2I
ӆ9w~ww^fkjS+1~bPVbELVah5ڲp29Mqx+jsh떉[Z5P#]
ܴCH[ݕ{BFC^Os݇_bxM7^<$\5Níd)_z"i3S)w))w)dzخ/SI)ʮv?Nw6) /!MP:DHә-YAu_|$nT/Ć;4m8ŋWAb뜶{3NV[qcFpeeXwOH6Xm?zƗHQ6K'.b7n{	y:
?sɩCoC6TaOHj
gbW<lkqOMfntF<G]R3yOEjkE1ߦkY
_mIF+XjAǁ[Z<UiZ^`Bp7sc:QY#Ԉsi\XLLC5Q)JY:!?	XH)WQxͿ Ϫtpbr4`؊`7Ï|TW롻
ayu)daɅP@UJf1潉n%9J@x=%'/u@#fCߐ
aOC>߃{1A\d1]΢5&ᖢپ7ϴ,K'XWjnAFln.Ob[*A%䂲\Ń</#셙n+OD45{yA^lF3&%v<QK*N9n")}\jئjn嫂nKnd$Ej%%^)Q:\(?tIQ2_ uŌ';9b6\h$rp8KR!1dJ"E~U+3&cTBRf[&4"eb*:؁
0^潪&3x V`(gfeҠC=DNcυ;[ng EstcS^"eKleLO;?xJ3)\%CpK2, h3, h4 {
    margin: 0 0 0-	}
  
  h2:2N<	2E2QG2border-bottom8
	  paddingnmd;
  }G=`'nmd}0#n}
}

.demo-column {?O md;
  max-width: 800px;
}

.demoJ3i&pdemo-variant!X:}

.demo-message {
`
mdP(
>7,E  margin: 0Tk	Rborder: noneZ5EO*Xi
>
}
}

.demo-info {Q'C-'
  ul {
    margin: 0;
    padding-leftqnmd;
    
    li {
  .family);
  ^I,a.'"=`b%n    
      strong {
     -  <[    }
    }
  }
}

// Responsive adjustments
@media (max-width: $semantic-breakpoint-md - 1F@)pcolumn {
  `
3}
}

@media (max-width: $semantic-breakpoint-sm - 17`
md;
  }
  
  .demo-section {&0  
    h2 {
  7;`*	Jc5}
    
    h3 {
  L`*5PcJ}
  }
}ax309?Glg)  
  h2:2N<	2E2QG2xBEO
I7Pelevation-1  border-bottom8
	  paddingnW2lg;
  align-items: flex-start;
  
  &--spaced {
  around;
    
    .demo-example {
      min-width: 200px;
      text-align: center;
    }
  }
}

.demo-example {
  display: flexOU!?U
i@input-radius;
  min-height: 120px;
  position: relative;
  
  h4:P: 0 0q 0;
    text-align: center;
  }P6k	\3Tk	R
  &:hover:not(:disabled)K+
	
q:not(:disabled) {{#P.7
P@	L  
    &:hover:not(:disabled)A%p
  }
  }
}

.demo-log {Q'KecondW'input-radiusA)+md;
  max-height: 300px;
  overflow-y: auto/md;
  
  &__empty1Utertiary;
    text-align: center;
    font-style: italic;
    margin: 0;
  }
  
  &__entry {
    display: flex;
    gap: $seman`
`
xs;
    border-bottom8
G  
    &:last-child {
      border-bottom: none;
    }
  }
  
  &__timefont-family-mono\.caption, font-size#Ftertiary;
    flex-shrink: 0;
    min-width: 80px;
  }
  
  &__message1
body-smallNAsmall<
body-smallQ>	body-smalA)2}
}

// Responsive design
@media (max-width: 768px7`
md
51  align-items: stretch;
    
    &--spaced {
    2  }
  }
  
  .demo-example {
    min-height: auto; `
md;
  }
  
  .demo-section"`
vmd;
  }
}

// Ensure positioned FAB menus are visible above demo content
:host {
  position: relative;
  z-index: 1;
})x93.~+
  h2 {
    font-size: 2-sizec!!bold;
  }

  h3 {
    font-size: -sizeX-}>lgAS
I*radius-lg;
Pelevation-1;
}

.demoJ3i&pmd'p}

.demo-item {
`
mdP(
iPradius-md;
  overflow: hidden;
  box-sizing: border-box;

  h4 {
    font-size: 4-sizeX	list-item!"medium;
  }

  p {
    font-size: font-size-sm"=`Eactions {
  display: flexQp#pE%mdP(variantZ$	radius-md`
xs1?k	Rborder: noneZ$  font-size: font-size-sm2medium	b-in-out;

  &:hover*-hover;M"elevation-2;
  }

`3
P@>	primary;
11p
%  }
  }
}

.demo-info {
  font-size: font-size-smPP	tertiary;!n*list-item;
}

.form-demo {
  display: gridQp8}

.demo-input {
  width: 100%;
  box-sizing: border-boxA)Nhradius-md;
  font-size: font-size-mdPP@T/	K'-in-out;

  &:focus {
    outline: none1box-shadow: 0 0 0 2px-container;
  }

  &:disabled#pdisabled"4disabled;
    cursor: not-allowed;
  }

  &--error {#error;!$error-container;
  }

  &--success {#success;!tertiary-container;
  }
}

.demo-textarea {
  @extend .demo-input;
  min-height: 100px;
  resize: vertical;
}

.demo-select {
 Y @extend .demo-input;
  cursor: pointer;
}

.demo-checkbox,
.demo-radio {
  display: flexUpXline-normal;
  cursor: pointer;

  input {
    margin: 0;
  }

  label {
    font-size: font-size-sm/:cursor: pointer;
  }
}

.validation-demo {
  display: gridQpE%mdP(variantZ$radius-md;
}

.form-status {
`
NE  font-family: 'JetBrains Mono', 'Consolas', monospace;
  font-size: font-size-xs;
}

.code-demo {Q'variantB*radius>,md;!n
  pre8'JetBrains Mono', 'Consolas', monospace;
    font-size: font-size-xs"=`Foverflow-x: auto;
    margin: 0;
  }
}

.layout-demo {
  display: gridQp}

// Ensure form fields are properly contained
ui-form-field {
  display: block;
  width: 100%;
  box-sizing: border-box;
}

/R/ Responsive adjustments
@media (max-width: $semantic-breakpoint-md - 1) {
  .demo?*pm;
  }
}ƭ|xj0,9/index9?+
  h2 {.	font-sizeo
	-size;
  #layout-lg;
    border-bottom: 1a&
  h3 {!}	font-sizeo	
3-size;
  -lg;
    margin-toOlayout-lg;
  }

  h4 {.	font-size

	-size;
  3?Axl;
  
  &:last-child {
    margin-bottom: 0;
  }
}

.demo-column%0!lg;
}

.demo-itemQ order: 1a1
radius-md;'^	
  &:hover {|7}
}

.demo-controls%0! +lgf>	radius-lg;
  border: 1a
  .control-row;lg;
    flex-wrap: wrap/end;
  }

  .control-group {
    display: flex;!!6xs;
    min-width: 150px;

    label {
      font-sizesize-sm;
      font-weightweight-medium;
  -f}

    input[type="range"] {
      width: 100%;
    }

    input[type="checkbox"] {
      margin-rightxs;
    }

    select {
    'xs    border: 1a-	  "
radius-sm;+^-  font-sizesize-sm;

      &:focus {
    S';    }";+    }
    }
  }
}

.demo-interactive-resultQ 
xl;'^>	radius-lg;
  border: 2px dashe!}

.demo-formQ 4^>	radius-lg;
  border: 1a
  .form-row {
  -lg <margin-bottom: 0;
    }
  }

  .form-output {
    margin-topxlP1& radius-md;
    border: 1a+
    pre {
      margin: 0;
      font-sizesize-sm;
   }]  white-space: pre-wrap;
      word-break: break-word;
    }
  }
}

.event-log {
  margin-toplg)!$>	radius-md;
  border: 1a@
  .event-list {
    max-height: 200px;
    overflow-y: auto;
  3T'&^"radius-sm;
    border: 1a"
    .event-item {
      font-sizesize-xs;
   }'xs 0;
      border-bottom: 1a    
    }
    }
  }

  button {Q*sm#  border: 1a-	"radius-sm;
  &^V+	font-size size-sm;
    cursor: pointer;
  ;easing-standard;

    &:hover<4}

    &:focus {
  S';  }(0$semantic-breakpoint-md - 1]7)layout-md;
  }

  .demo-controls .control=h
    .control-group {
      min-width: auto;
    }
  }
}

@media (max-width: $semantic-breakpoint-sm - 1]7layout-sm;
  }

  .demo-item {Q2}2X!x~0+9/index9Gsm)Emd[
 0;
  }	Z
"lg 0;
    border-bottom: 1a-	6	F}
"md 0;
  }
}

.demo-sub-
xlf>	radius-lg;
  border: 1a-		"!xl;
  flex-wrap: wrap/1lg;
}

.demo-item {
  flex: 1;
  min-width: 300pxS^1a-	+>radius-md;
}

.vertical-stepper-container {
  max-width: 400pxS^1a-	+"radius-md;
}

.interactive-exampleQ 
xl;'^`-	+	radius-lg/)lg;
}

.demo-controls {
  display: flex;
)
margin-toplg)!$>	?radius-sm;
  flex-wrap: wrap;
}

.demo-button {
  display: flexQ<xs]P"brand:&brand-primary;
  border: non%radius-sm;
a-l #brand-secondary;-'
26Dbrand-primary,0$^}
  
  fa-icon {
    font-size: $semantic-sizing-icon-inline;
  }
}

.step-info {
  margin-toplg)!6radius-sm;
  border-left: 4abrand-primary;
  
  p {
%line-tight 0;^4]5i},margin-bottom: 0;
    }
    
    strong {
  -  font-weightweight-semibold;
    }(!3item {
    min-width: auto;
  }
  
  .demo-controls#)
    .demo-button {
      justify-content  
  .vertical-stepper-container {
    max-width: none;
  }
}

@media (max-width: 480px) {
  .demo-subsection,
  .demo-item,
  .interactive-example {QEh2 {63, font-size)}h3 {6^
 
	}
}ޖU1xR0.	@import "3"?Amd)
  h2 {
# 0;^/oGxl;

  h3 {
-md 0;^/o	K	}

  h4 {
7c*
	&}
}

.demo-description {
  margin: 0 0lg 0;
aI)4-s
*O}"!m
  &--vertical {
  9>}
}

.demo-item {
  flex: 1;
  min-width: 0;
}

.demo-controls$@
 +lg)!$>-)card-radius;

  label {
    display: flexcenter'xs;
    cursor: pointer;
    ^/label<labea=label_
>label9F
    input[type="checkbox"] {
      margin: 0;
    }

    &:hover {
  ;event-^I-	+card] }

.demo-no-events {
  margin: 0+ 0;
  text-align: center;
*"font-style: italic;
}

.demo-eventQ 
xs 0;
Q
a1]44s
*line-height);
P	
  &:last-of-type {
}

  strong {;  font-weightIweight-semibold;
  }
}

.demo-event-time {
  display: block;
  margin-topxs;
*c*f3f*f75;caption, line-height);
}

.demo-clear-events {
  margin-top$%xs'>-
a-utton-smallAsmallAsmall0Csmall, line-height);
}c

  &:hover +elevated{8X'}

  &:focusPN-gsm;
  }
/!
  .demo-controls0)}
}

@media (max-width: 480[K
  .demo-section {
  #9md;
  }

  .demo-event-log {
    max-height: 200px;
  }
}Ax0n5 :QNM?3/%b$ ExY]o:}ϯHݶAs7ۢh[, %&"IzEɒ%7k%3ÙÉJg8ZҙƷLfVtktJ"0H?Q5Tgu'KGtNTnN(A-ûDײ7?:B@|@ThgCawCde"#!1SLub@%+̱t]Gaox,~8V%Q=x*w 2}{59x#T/aȜjwȻVa]uۼ$O؅ky}}K-=Zքyf?=r%r[.ϑr*l,ʟA˥_ *T&iΰ~F`*0.j1@鿧;a}cԛ
Z<w2
k'(RR!u&sǯS61k76QUsֹ!Q:{:NIxCY&4?g _/5x.L͕ߋN&LF+9'Ѯ	#4x+ICKTLJ#?ux#37GS`U6!/#L&HV/,eYdXHJd-it2=M5@~1oxcz ޢ ʮ_(YπIaO I$@wvleZ&Nq|3]l҇ Vg繅5^k*X 滪nTn"&Zs+fަxMRm^kl{kq0\P`O@nۮDf7hDm=k88XK6m_fT!0q΁SzCv#;c|Ӫݽ^c0KWX=9^J|h'%̉^$E_V^3b`(R $8evI=q+KsשF#}-:Sؚ1._Snc,y64Eˇ^5Bуx>+[w߫j2q{e\b#P/MQcyC"s`O1ҥ% M#2=vhkXM3B^>/_%5|`b`+8X?*	<X˻".x1w#U:VDzx T(d86|5_@pe?XeC	uQqdV|1<˦ t>krZ6ߜĖ_cmOnc^p(fjzfx)Lɤ߂?[!ۻ<䴵Xm?!}rRc(}YTI
{Isǉ:9'\MgClF0p14zc8Zзu?b鋸WFMyG`Q$Mqr&">(Yd)ym3ŹHbv!`^	!?>H{PM4]x7ͽ!{qsiY(D$=Arg#X)._W9Ј6S?7fafNU
@+Yx-:P.ӥC~?\/Xd|ĕw4ٯ*l\}5ūo;/n%}ǟ3e
$MA3RlE:,n.xMB]6(߸5 X$-KA6p*c^2oB!(6jnRǃV4h0Y;{PZU@V%^Ein uoPTw2DOvVS8ߖ*^[?Ua6,
MmNCNk檍dU/غx%import { Component, ElementRef, ViewChild } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UiAnimationsService } from '../../../../../ui-animations/src/lib/ui-animations.service';
import { AnimateDirective } from '../../../../../ui-animations/src/lib/animate.directive';

@Component({
  selector: 'app-animations-demo',
  standalone: true,
  imports: [CommonModule, AnimateDirective],
  template: `
    <div class="animations-demo">
      <h2>UI Animations Demo</h2>
      
      <!-- Entrance Animations -->
      <section class="demo-section">
        <h3>Entrance Animations</h3>
        <div class="animation-grid">
          <div class="demo-card animate-fade-in">
            <h4>Fade In</h4>
            <p>Basic fade in animation</p>
          </div>
          
          <div class="demo-card animate-fade-in-up animation-delay-200">
            <h4>Fade In Up</h4>
            <p>Fade in with upward movement</p>
          </div>
          
          <div class="demo-card animate-slide-in-up animation-delay-300">
            <h4>Slide In Up</h4>
            <p>Slide in from bottom</p>
          </div>
          
          <div class="demo-card animate-zoom-in animation-delay-500">
            <h4>Zoom In</h4>
            <p>Scale up animation</p>
          </div>
        </div>
      </section>

      <!-- Emphasis Animations -->
      <section class="demo-section">
        <h3>Emphasis Animations</h3>
        <div class="animation-grid">
          <button class="demo-button" (click)="animateElement('bounce')">
            Bounce
          </button>
          
          <button class="demo-button" (click)="animateElement('shake')">
            Shake
          </button>
          
          <button class="demo-button" (click)="animateElement('pulse')">
            Pulse
          </button>
          
          <button class="demo-button" (click)="animateElement('wobble')">
            Wobble
          </button>
        </div>
        
        <div #animationTarget class="demo-target">
          Click buttons above to animate me!
        </div>
      </section>

      <!-- Directive Examples -->
      <section class="demo-section">
        <h3>Animation Directive Examples</h3>
        <div class="animation-grid">
          <div class="demo-card" uiAnimate="animate-fade-in-up" [animationTrigger]="'hover'">
            <h4>Hover to Animate</h4>
            <p>Uses directive with hover trigger</p>
          </div>
          
          <div class="demo-card" uiAnimate="animate-bounce" [animationTrigger]="'click'" [animationOnce]="true">
            <h4>Click to Animate</h4>
            <p>Uses directive with click trigger</p>
          </div>
        </div>
      </section>

      <!-- Service Examples -->
      <section class="demo-section">
        <h3>Animation Service Examples</h3>
        <div class="service-controls">
          <button (click)="serviceAnimate('animate-tada')">Tada</button>
          <button (click)="serviceAnimate('animate-jello')">Jello</button>
          <button (click)="serviceAnimate('animate-heartbeat')">Heartbeat</button>
          <button (click)="serviceAnimate('animate-rubber-band')">Rubber Band</button>
        </div>
        
        <div #serviceTarget class="demo-target service-target">
          Animation Service Target
        </div>
      </section>
    </div>
  `,
  styles: [`
    .animations-demo {
      padding: 2rem;
      max-width: 1200px;
      margin: 0 auto;
    }

    .demo-section {
      margin-bottom: 3rem;
      
      h3 {
        margin-bottom: 1.5rem;
        color: #333;
        border-bottom: 2px solid #007bff;
        padding-bottom: 0.5rem;
      }
    }

    .animation-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
      gap: 1.5rem;
      margin-bottom: 2rem;
    }

    .demo-card {
      padding: 1.5rem;
      border: 1px solid #ddd;
      border-radius: 8px;
      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
      color: white;
      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
      transition: transform 0.2s ease;
      
      h4 {
        margin: 0 0 0.5rem 0;
        font-size: 1.2rem;
      }
      
      p {
        margin: 0;
        opacity: 0.9;
      }
      
      &:hover {
        transform: translateY(-2px);
      }
    }

    .demo-button {
      padding: 0.75rem 1.5rem;
      border: none;
      border-radius: 6px;
      background: #007bff;
      color: white;
      cursor: pointer;
      font-size: 1rem;
      transition: background-color 0.2s ease;
      
      &:hover {
        background: #0056b3;
      }
    }

    .demo-target {
      padding: 2rem;
      border: 2px dashed #007bff;
      border-radius: 8px;
      text-align: center;
      font-size: 1.2rem;
      font-weight: bold;
      background: #f8f9fa;
      margin-top: 1rem;
    }

    .service-target {
      background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
      color: white;
      border: none;
    }

    .service-controls {
      display: flex;
      gap: 1rem;
      flex-wrap: wrap;
      margin-bottom: 1rem;
    }

    /* Responsive */
    @media (max-width: 768px) {
      .animation-grid {
        grid-template-columns: 1fr;
      }
      
      .service-controls {
        justify-content: center;
      }
    }
  `]
})
export class AnimationsDemoComponent {
  @ViewChild('animationTarget', { static: true }) animationTarget!: ElementRef<HTMLElement>;
  @ViewChild('serviceTarget', { static: true }) serviceTarget!: ElementRef<HTMLElement>;

  constructor(private animationService: UiAnimationsService) {}

  animateElement(animationType: string) {
    const element = this.animationTarget.nativeElement;
    const animationClass = `animate-${animationType}`;
    
    // Remove any existing animation classes first
    element.className = element.className.replace(/animate-\w+/g, '');
    
    // Add animation class
    this.animationService.animateOnce(element, animationClass);
  }

  serviceAnimate(animationClass: string) {
    const element = this.serviceTarget.nativeElement;
    
    // Remove any existing animation classes first
    element.className = element.className.replace(/animate-\w+/g, '');
    
    // Add animation class with service
    this.animationService.animateOnce(element, animationClass);
  }
}mJ`hxe`B;Ry%yśu׉ ⿵x_[import { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AppbarComponent } from '../../../../../ui-essentials/src/lib/components/navigation/appbar/appbar.component';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { 
  faBars,
  faSearch, 
  faUser, 
  faHeart, 
  faBell,
  faCog,
  faShoppingCart,
  faHome,
  faArrowLeft,
  faPlus,
  faShare,
  faEllipsisV,
  faSun,
  faMoon
} from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-appbar-demo',
  standalone: true,
  imports: [
    CommonModule,
    AppbarComponent,
    FontAwesomeModule
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Appbar Component Showcase</h2>
      
      <!-- Appbar Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Appbar Variants</h3>
        
        <div style="margin-bottom: 2rem;">
          <h4>Compact</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="compact" 
              [slots]="{title: true, leftIcon: true, rightIcon: true}"
              [elevated]="false">
              <fa-icon [icon]="faBars" slot="left-icon"></fa-icon>
              <span slot="title">Compact Appbar</span>
              <fa-icon [icon]="faSearch" slot="right-icon"></fa-icon>
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Standard</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftIcon: true, rightAvatar: true}"
              [elevated]="false">
              <fa-icon [icon]="faBars" slot="left-icon"></fa-icon>
              <span slot="title">Standard Appbar</span>
              <div slot="right-avatar" style="width: 32px; height: 32px; border-radius: 50%; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); display: flex; align-items: center; justify-content: center; color: white; font-weight: 500;">
                JS
              </div>
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Large</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="large" 
              [slots]="{title: true, leftIcon: true, rightMenu: true}"
              [elevated]="false">
              <fa-icon [icon]="faArrowLeft" slot="left-icon"></fa-icon>
              <span slot="title">Large Appbar with More Space</span>
              <div slot="right-menu" style="display: flex; gap: 1rem;">
                <fa-icon [icon]="faHeart" style="cursor: pointer;"></fa-icon>
                <fa-icon [icon]="faShare" style="cursor: pointer;"></fa-icon>
                <fa-icon [icon]="faEllipsisV" style="cursor: pointer;"></fa-icon>
              </div>
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Prominent</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="prominent" 
              [slots]="{title: true, leftLogo: true, rightIcon: true}"
              [elevated]="false">
              <div slot="left-logo" style="display: flex; align-items: center; gap: 0.5rem; font-weight: 600; color: #007bff;">
                <div style="width: 24px; height: 24px; background: linear-gradient(135deg, #007bff, #0056b3); border-radius: 4px;"></div>
                SkyUI
              </div>
              <span slot="title">Prominent Design System</span>
              <fa-icon [icon]="faCog" slot="right-icon"></fa-icon>
            </ui-appbar>
          </div>
        </div>
      </section>

      <!-- Elevation and Position -->
      <section style="margin-bottom: 3rem;">
        <h3>Elevation & Position</h3>
        
        <div style="margin-bottom: 2rem;">
          <h4>Elevated</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftIcon: true, rightIcon: true}"
              [elevated]="true">
              <fa-icon [icon]="faBars" slot="left-icon"></fa-icon>
              <span slot="title">Elevated Appbar</span>
              <fa-icon [icon]="faBell" slot="right-icon"></fa-icon>
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Not Elevated</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftIcon: true, rightIcon: true}"
              [elevated]="false">
              <fa-icon [icon]="faBars" slot="left-icon"></fa-icon>
              <span slot="title">Flat Appbar</span>
              <fa-icon [icon]="faBell" slot="right-icon"></fa-icon>
            </ui-appbar>
          </div>
        </div>
      </section>

      <!-- Slot Configurations -->
      <section style="margin-bottom: 3rem;">
        <h3>Slot Configurations</h3>
        
        <div style="margin-bottom: 2rem;">
          <h4>Left Icon + Title + Right Avatar</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftIcon: true, rightAvatar: true}">
              <fa-icon [icon]="faHome" slot="left-icon"></fa-icon>
              <span slot="title">Home</span>
              <img 
                slot="right-avatar" 
                src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=32&h=32&fit=crop&crop=face" 
                style="width: 32px; height: 32px; border-radius: 50%; object-fit: cover;"
                alt="User avatar"
                (error)="handleImageError($event)">
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Left Logo + Title + Right Menu</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftLogo: true, rightMenu: true}">
              <div slot="left-logo" style="display: flex; align-items: center; gap: 0.5rem; font-weight: 600;">
                <div style="width: 20px; height: 20px; background: linear-gradient(45deg, #ff6b6b, #ee5a24); border-radius: 50%;"></div>
                App
              </div>
              <span slot="title">Dashboard</span>
              <div slot="right-menu" style="display: flex; gap: 1rem; align-items: center;">
                <fa-icon [icon]="faShoppingCart" style="cursor: pointer;" (click)="handleAction('cart')"></fa-icon>
                <fa-icon [icon]="faBell" style="cursor: pointer;" (click)="handleAction('notifications')"></fa-icon>
                <fa-icon [icon]="faUser" style="cursor: pointer;" (click)="handleAction('profile')"></fa-icon>
              </div>
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Left Avatar + Title + Right Icon</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftAvatar: true, rightIcon: true}">
              <div slot="left-avatar" style="width: 32px; height: 32px; border-radius: 50%; background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%); display: flex; align-items: center; justify-content: center; color: #333; font-weight: 500; font-size: 12px;">
                UI
              </div>
              <span slot="title">Profile Settings</span>
              <button 
                slot="right-icon" 
                style="background: none; border: none; padding: 8px; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center;"
                (click)="toggleTheme()">
                <fa-icon [icon]="isDarkMode() ? faSun : faMoon"></fa-icon>
              </button>
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Multiple Right Elements</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftIcon: true, rightIcon: true, rightMenu: true}">
              <fa-icon [icon]="faBars" slot="left-icon"></fa-icon>
              <span slot="title">Multi-Action Bar</span>
              <fa-icon [icon]="faPlus" slot="right-icon" style="cursor: pointer;" (click)="handleAction('add')"></fa-icon>
              <div slot="right-menu" style="display: flex; gap: 0.5rem;">
                <fa-icon [icon]="faSearch" style="cursor: pointer;" (click)="handleAction('search')"></fa-icon>
                <fa-icon [icon]="faEllipsisV" style="cursor: pointer;" (click)="handleAction('more')"></fa-icon>
              </div>
            </ui-appbar>
          </div>
        </div>
      </section>

      <!-- Real-world Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Real-world Examples</h3>
        
        <div style="margin-bottom: 2rem;">
          <h4>E-commerce App</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftIcon: true, rightMenu: true}"
              [elevated]="true">
              <fa-icon [icon]="faBars" slot="left-icon"></fa-icon>
              <span slot="title">ShopMart</span>
              <div slot="right-menu" style="display: flex; gap: 1rem; align-items: center;">
                <div style="position: relative;">
                  <fa-icon [icon]="faShoppingCart" style="cursor: pointer;" (click)="handleAction('cart')"></fa-icon>
                  <span style="position: absolute; top: -8px; right: -8px; background: #ff4757; color: white; border-radius: 50%; width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 600;">3</span>
                </div>
                <fa-icon [icon]="faSearch" style="cursor: pointer;" (click)="handleAction('search')"></fa-icon>
              </div>
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Social Media App</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="standard" 
              [slots]="{title: true, leftLogo: true, rightMenu: true}"
              [elevated]="false">
              <div slot="left-logo" style="font-weight: 700; font-size: 1.25rem; background: linear-gradient(45deg, #667eea, #764ba2); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;">
                SocialHub
              </div>
              <span slot="title">Feed</span>
              <div slot="right-menu" style="display: flex; gap: 1rem; align-items: center;">
                <div style="position: relative;">
                  <fa-icon [icon]="faBell" style="cursor: pointer;" (click)="handleAction('notifications')"></fa-icon>
                  <span style="position: absolute; top: -6px; right: -6px; background: #ff3742; width: 8px; height: 8px; border-radius: 50%;"></span>
                </div>
                <fa-icon [icon]="faUser" style="cursor: pointer;" (click)="handleAction('profile')"></fa-icon>
              </div>
            </ui-appbar>
          </div>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Settings Page</h4>
          <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
            <ui-appbar 
              variant="large" 
              [slots]="{title: true, leftIcon: true, rightIcon: true}"
              [elevated]="false">
              <fa-icon [icon]="faArrowLeft" slot="left-icon" style="cursor: pointer;" (click)="handleAction('back')"></fa-icon>
              <span slot="title">Account Settings</span>
              <fa-icon [icon]="faCog" slot="right-icon" style="cursor: pointer;" (click)="handleAction('settings')"></fa-icon>
            </ui-appbar>
          </div>
        </div>
      </section>

      <!-- Interactive Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Demo</h3>
        <p style="margin-bottom: 1rem; color: #6c757d;">
          Customize the appbar below by toggling different options:
        </p>
        
        <div style="display: flex; gap: 1rem; margin-bottom: 1rem; flex-wrap: wrap;">
          <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
            <input 
              type="checkbox" 
              [checked]="demoConfig().elevated" 
              (change)="updateDemoConfig('elevated', $event)">
            Elevated
          </label>
          <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
            <input 
              type="checkbox" 
              [checked]="demoConfig().slots.leftIcon" 
              (change)="updateDemoSlot('leftIcon', $event)">
            Left Icon
          </label>
          <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
            <input 
              type="checkbox" 
              [checked]="demoConfig().slots.leftLogo" 
              (change)="updateDemoSlot('leftLogo', $event)">
            Left Logo
          </label>
          <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
            <input 
              type="checkbox" 
              [checked]="demoConfig().slots.rightIcon" 
              (change)="updateDemoSlot('rightIcon', $event)">
            Right Icon
          </label>
          <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
            <input 
              type="checkbox" 
              [checked]="demoConfig().slots.rightAvatar" 
              (change)="updateDemoSlot('rightAvatar', $event)">
            Right Avatar
          </label>
          <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
            <input 
              type="checkbox" 
              [checked]="demoConfig().slots.rightMenu" 
              (change)="updateDemoSlot('rightMenu', $event)">
            Right Menu
          </label>
        </div>

        <div style="margin-bottom: 1rem;">
          <label style="display: flex; align-items: center; gap: 0.5rem;">
            Variant:
            <select 
              [value]="demoConfig().variant" 
              (change)="updateDemoVariant($event)"
              style="padding: 0.25rem 0.5rem; border: 1px solid #ced4da; border-radius: 4px;">
              <option value="compact">Compact</option>
              <option value="standard">Standard</option>
              <option value="large">Large</option>
              <option value="prominent">Prominent</option>
            </select>
          </label>
        </div>

        <div style="border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden; margin-bottom: 1rem;">
          <ui-appbar 
            [variant]="demoConfig().variant"
            [slots]="demoConfig().slots"
            [elevated]="demoConfig().elevated">
            @if (demoConfig().slots.leftIcon) {
              <fa-icon [icon]="faBars" slot="left-icon"></fa-icon>
            }
            @if (demoConfig().slots.leftLogo) {
              <div slot="left-logo" style="display: flex; align-items: center; gap: 0.5rem; font-weight: 600; color: #007bff;">
                <div style="width: 20px; height: 20px; background: linear-gradient(135deg, #007bff, #0056b3); border-radius: 4px;"></div>
                Demo
              </div>
            }
            <span slot="title">{{ demoConfig().title }}</span>
            @if (demoConfig().slots.rightIcon) {
              <fa-icon [icon]="faSearch" slot="right-icon"></fa-icon>
            }
            @if (demoConfig().slots.rightAvatar) {
              <div slot="right-avatar" style="width: 32px; height: 32px; border-radius: 50%; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); display: flex; align-items: center; justify-content: center; color: white; font-weight: 500; font-size: 12px;">
                DU
              </div>
            }
            @if (demoConfig().slots.rightMenu) {
              <div slot="right-menu" style="display: flex; gap: 1rem;">
                <fa-icon [icon]="faHeart" style="cursor: pointer;"></fa-icon>
                <fa-icon [icon]="faCog" style="cursor: pointer;"></fa-icon>
              </div>
            }
          </ui-appbar>
        </div>

        @if (lastAction()) {
          <div style="padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last action:</strong> {{ lastAction() }}
          </div>
        }
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Code Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Appbar:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-appbar 
  variant="standard" 
  [slots]="&#123;title: true, leftIcon: true, rightIcon: true&#125;"
  [elevated]="false"&gt;
  &lt;fa-icon [icon]="faBars" slot="left-icon"&gt;&lt;/fa-icon&gt;
  &lt;span slot="title"&gt;My App&lt;/span&gt;
  &lt;fa-icon [icon]="faSearch" slot="right-icon"&gt;&lt;/fa-icon&gt;
&lt;/ui-appbar&gt;</code></pre>
          
          <h4>Appbar with Logo and Avatar:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-appbar 
  variant="standard" 
  [slots]="&#123;title: true, leftLogo: true, rightAvatar: true&#125;"
  [elevated]="true"&gt;
  &lt;div slot="left-logo" style="font-weight: 600;"&gt;
    MyBrand
  &lt;/div&gt;
  &lt;span slot="title"&gt;Dashboard&lt;/span&gt;
  &lt;img slot="right-avatar" src="avatar.jpg" 
       style="width: 32px; height: 32px; border-radius: 50%;"&gt;
&lt;/ui-appbar&gt;</code></pre>

          <h4>Appbar with Multiple Actions:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-appbar 
  variant="standard" 
  [slots]="&#123;title: true, leftIcon: true, rightMenu: true&#125;"
  [elevated]="false"&gt;
  &lt;fa-icon [icon]="faArrowLeft" slot="left-icon"&gt;&lt;/fa-icon&gt;
  &lt;span slot="title"&gt;Settings&lt;/span&gt;
  &lt;div slot="right-menu" style="display: flex; gap: 1rem;"&gt;
    &lt;fa-icon [icon]="faSearch"&gt;&lt;/fa-icon&gt;
    &lt;fa-icon [icon]="faEllipsisV"&gt;&lt;/fa-icon&gt;
  &lt;/div&gt;
&lt;/ui-appbar&gt;</code></pre>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }

    fa-icon {
      transition: color 0.2s ease;
    }

    fa-icon:hover {
      color: #007bff;
    }

    label {
      font-size: 0.875rem;
      user-select: none;
    }

    input[type="checkbox"] {
      margin: 0;
    }

    select {
      font-size: 0.875rem;
    }
  `]
})
export class AppbarDemoComponent {
  // State signals
  isDarkMode = signal(false);
  lastAction = signal('');
  
  // Demo configuration
  demoConfig = signal({
    variant: 'standard' as any,
    elevated: false,
    title: 'Interactive Demo',
    slots: {
      leftIcon: true,
      leftLogo: false,
      leftAvatar: false,
      title: true,
      rightIcon: true,
      rightLogo: false,
      rightAvatar: false,
      rightMenu: false
    }
  });

  // Font Awesome icons
  faBars = faBars;
  faSearch = faSearch;
  faUser = faUser;
  faHeart = faHeart;
  faBell = faBell;
  faCog = faCog;
  faShoppingCart = faShoppingCart;
  faHome = faHome;
  faArrowLeft = faArrowLeft;
  faPlus = faPlus;
  faShare = faShare;
  faEllipsisV = faEllipsisV;
  faSun = faSun;
  faMoon = faMoon;

  handleAction(action: string): void {
    this.lastAction.set(`${action} clicked at ${new Date().toLocaleTimeString()}`);
    console.log(`Appbar action: ${action}`);
  }

  toggleTheme(): void {
    this.isDarkMode.update(current => !current);
    this.handleAction(`Theme switched to ${this.isDarkMode() ? 'dark' : 'light'} mode`);
  }

  handleImageError(event: Event): void {
    const target = event.target as HTMLImageElement;
    target.style.display = 'none';
    const fallback = document.createElement('div');
    fallback.style.width = '32px';
    fallback.style.height = '32px';
    fallback.style.borderRadius = '50%';
    fallback.style.background = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';
    fallback.style.display = 'flex';
    fallback.style.alignItems = 'center';
    fallback.style.justifyContent = 'center';
    fallback.style.color = 'white';
    fallback.style.fontWeight = '500';
    fallback.style.fontSize = '12px';
    fallback.textContent = 'U';
    target.parentNode?.insertBefore(fallback, target);
  }

  updateDemoConfig(key: string, event: Event): void {
    const target = event.target as HTMLInputElement;
    const value = target.checked;
    
    this.demoConfig.update(config => ({
      ...config,
      [key]: value
    }));
  }

  updateDemoSlot(slotName: string, event: Event): void {
    const target = event.target as HTMLInputElement;
    const checked = target.checked;
    
    this.demoConfig.update(config => ({
      ...config,
      slots: {
        ...config.slots,
        [slotName]: checked
      }
    }));
  }

  updateDemoVariant(event: Event): void {
    const target = event.target as HTMLSelectElement;
    const variant = target.value as any;
    
    this.demoConfig.update(config => ({
      ...config,
      variant,
      title: variant.charAt(0).toUpperCase() + variant.slice(1) + ' Demo'
    }));
  }
}tlmx6	6/ -xL"import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AspectRatioComponent } from '../../../../../ui-essentials/src/lib/components/layout/aspect-ratio';

@Component({
  selector: 'ui-aspect-ratio-demo',
  standalone: true,
  imports: [CommonModule, AspectRatioComponent],
  template: `
    <div class="demo-container">
      <h2>Aspect Ratio Demo</h2>
      <p>Components for maintaining consistent aspect ratios across responsive content.</p>
      
      <!-- Common Presets -->
      <section class="demo-section">
        <h3>Aspect Ratio Presets</h3>
        <div class="demo-grid">
          @for (preset of presets; track preset.ratio) {
            <div class="demo-item">
              <h4>{{ preset.label }}</h4>
              <ui-aspect-ratio [ratio]="preset.ratio">
                <div class="demo-content" [style.background]="getRandomColor()">
                  <span>{{ preset.ratio }} ({{ preset.description }})</span>
                </div>
              </ui-aspect-ratio>
            </div>
          }
        </div>
      </section>
      
      <!-- Custom Ratios -->
      <section class="demo-section">
        <h3>Custom Aspect Ratios</h3>
        <div class="demo-grid">
          @for (custom of customRatios; track custom.ratio) {
            <div class="demo-item">
              <h4>{{ custom.label }}</h4>
              <ui-aspect-ratio [customRatio]="custom.ratio">
                <div class="demo-content" [style.background]="getRandomColor()">
                  <span>{{ custom.ratio }}</span>
                </div>
              </ui-aspect-ratio>
            </div>
          }
        </div>
      </section>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item" style="flex: 1;">
              <h4>Size: {{ size }}</h4>
              <ui-aspect-ratio ratio="video" [size]="size">
                <div class="demo-content" style="background: linear-gradient(45deg, #667eea, #764ba2)">
                  <span>{{ size }} size</span>
                </div>
              </ui-aspect-ratio>
            </div>
          }
        </div>
      </section>
      
      <!-- Style Variants -->
      <section class="demo-section">
        <h3>Style Variants</h3>
        <div class="demo-grid">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <h4>{{ variant | titlecase }}</h4>
              <ui-aspect-ratio 
                ratio="photo" 
                [variant]="variant"
                (clicked)="variant === 'interactive' ? handleInteractiveClick($event) : null">
                <div class="demo-content" [style.background]="getRandomColor()">
                  <span>{{ variant }} variant</span>
                  @if (variant === 'interactive') {
                    <small>Click me!</small>
                  }
                </div>
              </ui-aspect-ratio>
            </div>
          }
        </div>
      </section>
      
      <!-- With Images -->
      <section class="demo-section">
        <h3>Image Examples</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Square Image</h4>
            <ui-aspect-ratio ratio="square" size="lg">
              <img 
                src="https://picsum.photos/400/400" 
                alt="Square demo image"
                style="object-fit: cover; width: 100%; height: 100%;">
            </ui-aspect-ratio>
          </div>
          
          <div class="demo-item">
            <h4>Video Aspect</h4>
            <ui-aspect-ratio ratio="video" variant="elevated">
              <img 
                src="https://picsum.photos/800/450" 
                alt="Video aspect demo image"
                style="object-fit: cover; width: 100%; height: 100%;">
            </ui-aspect-ratio>
          </div>
          
          <div class="demo-item">
            <h4>Portrait Image</h4>
            <ui-aspect-ratio ratio="portrait" variant="bordered">
              <img 
                src="https://picsum.photos/400/533" 
                alt="Portrait demo image"
                style="object-fit: cover; width: 100%; height: 100%;">
            </ui-aspect-ratio>
          </div>
        </div>
      </section>
      
      <!-- Loading State -->
      <section class="demo-section">
        <h3>Loading State</h3>
        <div class="demo-row">
          <div class="demo-item" style="max-width: 300px;">
            <h4>Loading</h4>
            <ui-aspect-ratio ratio="video" [loading]="true">
              <!-- Content is hidden when loading -->
            </ui-aspect-ratio>
          </div>
          
          <div class="demo-item" style="max-width: 300px;">
            <button (click)="toggleLoading()">
              Toggle Loading: {{ isLoading ? 'ON' : 'OFF' }}
            </button>
            <ui-aspect-ratio ratio="square" [loading]="isLoading">
              <div class="demo-content" style="background: linear-gradient(135deg, #ff6b6b, #4ecdc4)">
                <span>Dynamic Loading</span>
              </div>
            </ui-aspect-ratio>
          </div>
        </div>
      </section>
      
      <!-- Centered Content -->
      <section class="demo-section">
        <h3>Content Centering</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Fill Container</h4>
            <ui-aspect-ratio ratio="video" variant="bordered">
              <div class="demo-content" style="background: linear-gradient(45deg, #fa709a, #fee140)">
                <span>Fills entire container</span>
              </div>
            </ui-aspect-ratio>
          </div>
          
          <div class="demo-item">
            <h4>Centered Content</h4>
            <ui-aspect-ratio ratio="video" variant="bordered" [centerContent]="true">
              <div style="background: #6c5ce7; color: white; padding: 20px; border-radius: 8px; text-align: center;">
                <span>I'm centered!</span>
              </div>
            </ui-aspect-ratio>
          </div>
        </div>
      </section>
      
      <!-- Interactive Examples -->
      <section class="demo-section">
        <h3>Interactive Examples</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Click Counter</h4>
            <ui-aspect-ratio 
              ratio="square" 
              variant="interactive" 
              size="lg"
              (clicked)="incrementCounter()">
              <div class="demo-content" style="background: linear-gradient(135deg, #667eea, #764ba2); cursor: pointer;">
                <div style="text-align: center; color: white;">
                  <div style="font-size: 2rem; font-weight: bold;">{{ clickCount }}</div>
                  <div>Click to increment</div>
                </div>
              </div>
            </ui-aspect-ratio>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './aspect-ratio-demo.component.scss'
})
export class AspectRatioDemoComponent {
  presets = [
    { ratio: 'square' as const, label: 'Square', description: '1:1' },
    { ratio: 'video' as const, label: 'Video', description: '16:9' },
    { ratio: 'cinema' as const, label: 'Cinema', description: '21:9' },
    { ratio: 'photo' as const, label: 'Photo', description: '3:2' },
    { ratio: 'portrait' as const, label: 'Portrait', description: '3:4' },
    { ratio: 'golden' as const, label: 'Golden', description: '1.618:1' }
  ];
  
  customRatios = [
    { ratio: '4/3', label: 'Custom 4:3' },
    { ratio: '75%', label: 'Custom 75%' },
    { ratio: '1.33', label: 'Custom 1.33' },
    { ratio: '125%', label: 'Custom 125%' }
  ];
  
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['default', 'elevated', 'bordered', 'interactive'] as const;
  
  clickCount = 0;
  isLoading = false;
  
  private colors = [
    'linear-gradient(45deg, #667eea, #764ba2)',
    'linear-gradient(135deg, #f093fb, #f5576c)',
    'linear-gradient(45deg, #4facfe, #00f2fe)',
    'linear-gradient(135deg, #43e97b, #38f9d7)',
    'linear-gradient(45deg, #fa709a, #fee140)',
    'linear-gradient(135deg, #a8edea, #fed6e3)',
    'linear-gradient(45deg, #ffecd2, #fcb69f)',
    'linear-gradient(135deg, #ff9a9e, #fecfef)'
  ];
  
  getRandomColor(): string {
    return this.colors[Math.floor(Math.random() * this.colors.length)];
  }
  
  handleInteractiveClick(event: MouseEvent): void {
    console.log('Interactive aspect ratio clicked', event);
  }
  
  incrementCounter(): void {
    this.clickCount++;
  }
  
  toggleLoading(): void {
    this.isLoading = !this.isLoading;
  }
}Px0@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.demo-container {
  padding: 32px;
  max-width: 1200px;
  margin: 0 auto;

  h2 {
    color: $semantic-color-text-primary;
    font-size: 32px;
    margin-bottom: 48px;
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-primary;
    padding-bottom: 16px;
  }

  h3 {
    color: $semantic-color-text-primary;
    font-size: 24px;
    margin-bottom: 32px;
  }

  h4 {
    color: $semantic-color-text-primary;
    font-size: 20px;
    margin-bottom: 16px;
  }
}

.demo-section {
  margin-bottom: 64px;
  padding: 32px;
  background: $semantic-color-surface-primary;
  border: $semantic-border-width-1 solid $semantic-color-border-primary;
  border-radius: $semantic-border-radius-lg;
  box-shadow: $semantic-shadow-elevation-1;
}

.demo-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 32px;
  align-items: start;
}

.demo-item {
  display: flex;
  flex-direction: column;
  gap: 12px;

  > label {
    font-weight: 500;
    color: $semantic-color-text-secondary;
    font-size: 14px;
  }
}

.demo-form {
  .form-values {
    margin-top: 32px;
    padding: 16px;
    background: $semantic-color-surface-secondary;
    border-radius: $semantic-border-radius-md;
    border: $semantic-border-width-1 solid $semantic-color-border-subtle;

    h4 {
      margin-bottom: 12px;
    }

    pre {
      background: $semantic-color-background;
      padding: 12px;
      border-radius: $semantic-border-radius-sm;
      border: $semantic-border-width-1 solid $semantic-color-border-primary;
      font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
      font-size: 12px;
      color: $semantic-color-text-primary;
      overflow-x: auto;
      margin-bottom: 12px;
    }

    p {
      margin: 0;
      color: $semantic-color-text-secondary;
      font-size: 14px;
    }
  }
}

.event-log {
  margin-top: 32px;

  .log-container {
    max-height: 300px;
    overflow-y: auto;
    background: $semantic-color-background;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-md;
    margin-bottom: 16px;
  }

  .log-entry {
    display: grid;
    grid-template-columns: 120px 1fr auto;
    gap: 12px;
    padding: 8px 12px;
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
    font-size: 12px;
    font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;

    &:last-child {
      border-bottom: none;
    }

    .log-event {
      font-weight: 500;
      color: $semantic-color-brand-primary;
    }

    .log-data {
      color: $semantic-color-text-primary;
      overflow-wrap: break-word;
    }

    .log-time {
      color: $semantic-color-text-tertiary;
      font-size: 11px;
    }
  }

  .clear-log-btn {
    padding: 8px 12px;
    background: $semantic-color-surface-secondary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-sm;
    color: $semantic-color-text-secondary;
    font-size: 12px;
    cursor: pointer;
    transition: all 0.2s ease;

    &:hover {
      background: $semantic-color-surface-elevated;
      border-color: $semantic-color-border-focus;
    }

    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
}

// Responsive design
@media (max-width: 1024px - 1) {
  .demo-row {
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 24px;
  }
}

@media (max-width: 768px - 1) {
  .demo-container {
    padding: 24px;
  }

  .demo-section {
    padding: 24px;
  }

  .demo-row {
    grid-template-columns: 1fr;
    gap: 24px;
  }

  .event-log {
    .log-entry {
      grid-template-columns: 1fr;
      gap: 8px;
      
      .log-time {
        text-align: right;
      }
    }
  }
}qū>x Rn(gqFbQjniFUn~ Lx5uimport { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule, FormControl, FormGroup } from '@angular/forms';
import { AutocompleteComponent, AutocompleteOption } from '../../../../../ui-essentials/src/lib/components/forms/autocomplete/autocomplete.component';

@Component({
  selector: 'ui-autocomplete-demo',
  standalone: true,
  imports: [CommonModule, ReactiveFormsModule, AutocompleteComponent],
  template: `
    <div class="demo-container">
      <h2>Autocomplete Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          <div class="demo-item">
            <label>Small</label>
            <ui-autocomplete
              size="sm"
              placeholder="Small autocomplete..."
              [options]="countries"
              (valueChange)="onValueChange('small', $event)"
            />
          </div>
          <div class="demo-item">
            <label>Medium (default)</label>
            <ui-autocomplete
              size="md"
              placeholder="Medium autocomplete..."
              [options]="countries"
              (valueChange)="onValueChange('medium', $event)"
            />
          </div>
          <div class="demo-item">
            <label>Large</label>
            <ui-autocomplete
              size="lg"
              placeholder="Large autocomplete..."
              [options]="countries"
              (valueChange)="onValueChange('large', $event)"
            />
          </div>
        </div>
      </section>
      
      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          <div class="demo-item">
            <label>Outlined (default)</label>
            <ui-autocomplete
              variant="outlined"
              placeholder="Outlined autocomplete..."
              [options]="countries"
              (valueChange)="onValueChange('outlined', $event)"
            />
          </div>
          <div class="demo-item">
            <label>Filled</label>
            <ui-autocomplete
              variant="filled"
              placeholder="Filled autocomplete..."
              [options]="countries"
              (valueChange)="onValueChange('filled', $event)"
            />
          </div>
        </div>
      </section>
      
      <!-- With Labels and Helper Text -->
      <section class="demo-section">
        <h3>With Labels & Helper Text</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-autocomplete
              label="Country"
              placeholder="Select a country..."
              helperText="Choose your country of residence"
              [options]="countries"
              [required]="true"
              (valueChange)="onValueChange('labeled', $event)"
            />
          </div>
          <div class="demo-item">
            <ui-autocomplete
              label="Programming Language"
              placeholder="Search languages..."
              helperText="Find your favorite programming language"
              [options]="programmingLanguages"
              (valueChange)="onValueChange('languages', $event)"
            />
          </div>
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <div class="demo-item">
            <label>Disabled</label>
            <ui-autocomplete
              placeholder="Disabled autocomplete..."
              [options]="countries"
              [disabled]="true"
            />
          </div>
          <div class="demo-item">
            <label>Read-only</label>
            <ui-autocomplete
              placeholder="Read-only autocomplete..."
              [options]="countries"
              [readonly]="true"
            />
          </div>
          <div class="demo-item">
            <label>Loading</label>
            <ui-autocomplete
              placeholder="Loading autocomplete..."
              [options]="countries"
              [loading]="true"
            />
          </div>
        </div>
      </section>
      
      <!-- Error State -->
      <section class="demo-section">
        <h3>Error State</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-autocomplete
              label="Country (Required)"
              placeholder="Select a country..."
              errorText="Please select a valid country"
              [options]="countries"
              [required]="true"
            />
          </div>
        </div>
      </section>
      
      <!-- Advanced Features -->
      <section class="demo-section">
        <h3>Advanced Features</h3>
        <div class="demo-row">
          <div class="demo-item">
            <label>With Secondary Text</label>
            <ui-autocomplete
              placeholder="Search users..."
              [options]="users"
              (valueChange)="onValueChange('users', $event)"
              (optionSelected)="onOptionSelected($event)"
            />
          </div>
          <div class="demo-item">
            <label>Custom Filter (starts with)</label>
            <ui-autocomplete
              placeholder="Type first letters..."
              [options]="countries"
              [filterFn]="startsWithFilter"
              (valueChange)="onValueChange('custom-filter', $event)"
            />
          </div>
          <div class="demo-item">
            <label>Limited Options (max 3)</label>
            <ui-autocomplete
              placeholder="Search countries (max 3)..."
              [options]="countries"
              [maxOptions]="3"
              (valueChange)="onValueChange('limited', $event)"
            />
          </div>
        </div>
      </section>
      
      <!-- Behavior Options -->
      <section class="demo-section">
        <h3>Behavior Options</h3>
        <div class="demo-row">
          <div class="demo-item">
            <label>Open on Focus</label>
            <ui-autocomplete
              placeholder="Focus to see options..."
              [options]="fruits"
              [openOnFocus]="true"
              [minQueryLength]="0"
              (valueChange)="onValueChange('open-focus', $event)"
            />
          </div>
          <div class="demo-item">
            <label>Not Clearable</label>
            <ui-autocomplete
              placeholder="No clear button..."
              [options]="fruits"
              [clearable]="false"
              (valueChange)="onValueChange('not-clearable', $event)"
            />
          </div>
          <div class="demo-item">
            <label>Min Query Length (3)</label>
            <ui-autocomplete
              placeholder="Type at least 3 characters..."
              [options]="countries"
              [minQueryLength]="3"
              helperText="Start typing to see suggestions"
              (valueChange)="onValueChange('min-query', $event)"
            />
          </div>
        </div>
      </section>
      
      <!-- Reactive Forms Integration -->
      <section class="demo-section">
        <h3>Reactive Forms Integration</h3>
        <form [formGroup]="demoForm" class="demo-form">
          <div class="demo-row">
            <div class="demo-item">
              <ui-autocomplete
                label="Favorite Country"
                placeholder="Select your favorite country..."
                helperText="This is part of a reactive form"
                [options]="countries"
                formControlName="favoriteCountry"
                [required]="true"
              />
            </div>
            <div class="demo-item">
              <ui-autocomplete
                label="Preferred Language"
                placeholder="Choose a programming language..."
                [options]="programmingLanguages"
                formControlName="preferredLanguage"
              />
            </div>
          </div>
          
          <div class="form-values">
            <h4>Form Values:</h4>
            <pre>{{ demoForm.value | json }}</pre>
            <p><strong>Form Valid:</strong> {{ demoForm.valid }}</p>
          </div>
        </form>
      </section>
      
      <!-- Event Logging -->
      <section class="demo-section">
        <h3>Event Monitoring</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-autocomplete
              label="Event Test"
              placeholder="Type and select to see events..."
              [options]="fruits"
              (valueChange)="logEvent('valueChange', $event)"
              (queryChange)="logEvent('queryChange', $event)"
              (optionSelected)="logEvent('optionSelected', $event)"
              (focused)="logEvent('focused', $event)"
              (blurred)="logEvent('blurred', $event)"
              (dropdownOpen)="logEvent('dropdownOpen', $event)"
              (dropdownClose)="logEvent('dropdownClose', $event)"
            />
          </div>
        </div>
        
        <div class="event-log">
          <h4>Event Log:</h4>
          <div class="log-container">
            @for (event of eventLog(); track event.id) {
              <div class="log-entry">
                <span class="log-event">{{ event.type }}</span>
                <span class="log-data">{{ event.data }}</span>
                <span class="log-time">{{ event.time }}</span>
              </div>
            }
          </div>
          <button type="button" (click)="clearEventLog()" class="clear-log-btn">
            Clear Log
          </button>
        </div>
      </section>
    </div>
  `,
  styleUrl: './autocomplete-demo.component.scss'
})
export class AutocompleteDemoComponent {
  // Form for reactive forms demo
  demoForm = new FormGroup({
    favoriteCountry: new FormControl(''),
    preferredLanguage: new FormControl('')
  });

  // Event logging
  private _eventLog = signal<Array<{id: number, type: string, data: string, time: string}>>([]);
  eventLog = this._eventLog.asReadonly();
  private eventCounter = 0;

  // Sample data
  countries: AutocompleteOption[] = [
    { value: 'us', label: 'United States' },
    { value: 'ca', label: 'Canada' },
    { value: 'gb', label: 'United Kingdom' },
    { value: 'de', label: 'Germany' },
    { value: 'fr', label: 'France' },
    { value: 'it', label: 'Italy' },
    { value: 'es', label: 'Spain' },
    { value: 'jp', label: 'Japan' },
    { value: 'kr', label: 'South Korea' },
    { value: 'cn', label: 'China' },
    { value: 'in', label: 'India' },
    { value: 'au', label: 'Australia' },
    { value: 'br', label: 'Brazil' },
    { value: 'mx', label: 'Mexico' },
    { value: 'ru', label: 'Russia' },
    { value: 'za', label: 'South Africa' },
    { value: 'ng', label: 'Nigeria' },
    { value: 'eg', label: 'Egypt' }
  ];

  programmingLanguages: AutocompleteOption[] = [
    { value: 'typescript', label: 'TypeScript' },
    { value: 'javascript', label: 'JavaScript' },
    { value: 'python', label: 'Python' },
    { value: 'java', label: 'Java' },
    { value: 'csharp', label: 'C#' },
    { value: 'cpp', label: 'C++' },
    { value: 'go', label: 'Go' },
    { value: 'rust', label: 'Rust' },
    { value: 'swift', label: 'Swift' },
    { value: 'kotlin', label: 'Kotlin' },
    { value: 'php', label: 'PHP' },
    { value: 'ruby', label: 'Ruby' },
    { value: 'scala', label: 'Scala' },
    { value: 'dart', label: 'Dart' }
  ];

  users: AutocompleteOption[] = [
    { value: '1', label: 'John Doe', secondaryText: 'john.doe@example.com' },
    { value: '2', label: 'Jane Smith', secondaryText: 'jane.smith@example.com' },
    { value: '3', label: 'Bob Johnson', secondaryText: 'bob.johnson@example.com' },
    { value: '4', label: 'Alice Brown', secondaryText: 'alice.brown@example.com' },
    { value: '5', label: 'Charlie Wilson', secondaryText: 'charlie.wilson@example.com' },
    { value: '6', label: 'Diana Davis', secondaryText: 'diana.davis@example.com' },
    { value: '7', label: 'Eve Miller', secondaryText: 'eve.miller@example.com' },
    { value: '8', label: 'Frank Garcia', secondaryText: 'frank.garcia@example.com' }
  ];

  fruits: AutocompleteOption[] = [
    { value: 'apple', label: 'Apple' },
    { value: 'banana', label: 'Banana' },
    { value: 'orange', label: 'Orange' },
    { value: 'grape', label: 'Grape' },
    { value: 'strawberry', label: 'Strawberry' },
    { value: 'blueberry', label: 'Blueberry' },
    { value: 'pineapple', label: 'Pineapple' },
    { value: 'mango', label: 'Mango' },
    { value: 'kiwi', label: 'Kiwi' },
    { value: 'peach', label: 'Peach' },
    { value: 'cherry', label: 'Cherry' },
    { value: 'watermelon', label: 'Watermelon' }
  ];

  // Custom filter function
  startsWithFilter = (option: AutocompleteOption, query: string): boolean => {
    return option.label.toLowerCase().startsWith(query.toLowerCase());
  };

  onValueChange(source: string, value: any): void {
    console.log(`Value changed (${source}):`, value);
  }

  onOptionSelected(option: AutocompleteOption): void {
    console.log('Option selected:', option);
  }

  logEvent(type: string, data: any): void {
    const entry = {
      id: ++this.eventCounter,
      type,
      data: typeof data === 'object' ? JSON.stringify(data) : String(data),
      time: new Date().toLocaleTimeString()
    };
    
    const currentLog = this._eventLog();
    this._eventLog.set([entry, ...currentLog.slice(0, 19)]); // Keep last 20 events
  }

  clearEventLog(): void {
    this._eventLog.set([]);
    this.eventCounter = 0;
  }
}8lx~Aq+	 #	xMimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AvatarComponent } from '../../../../../ui-essentials/src/lib/components/data-display/avatar/avatar.component';

interface Activity {
  user: string;
  action: string;
  time: string;
  status?: 'online' | 'offline' | 'away' | 'busy';
}

@Component({
  selector: 'ui-avatar-demo',
  standalone: true,
  imports: [
    CommonModule,
    AvatarComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Avatar Component Showcase</h2>
      
      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-avatar size="xs" name="Extra Small"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">XS (24px)</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="sm" name="Small Avatar"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">SM (32px)</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="md" name="Medium Avatar"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">MD (40px)</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Large Avatar"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">LG (48px)</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="xl" name="Extra Large"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">XL (64px)</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="xxl" name="XX Large"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">XXL (80px)</p>
          </div>
        </div>
      </section>

      <!-- With Images -->
      <section style="margin-bottom: 3rem;">
        <h3>With Images</h3>
        <div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-avatar 
              size="lg" 
              imageUrl="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=150&h=150&fit=crop&crop=face"
              name="John Doe"
              altText="John Doe's profile picture">
            </ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">John Doe</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar 
              size="lg" 
              imageUrl="https://images.unsplash.com/photo-1494790108755-2616b612b786?w=150&h=150&fit=crop&crop=face"
              name="Jane Smith"
              altText="Jane Smith's profile picture">
            </ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Jane Smith</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar 
              size="lg" 
              imageUrl="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&h=150&fit=crop&crop=face"
              name="Alex Rodriguez"
              altText="Alex Rodriguez's profile picture">
            </ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Alex Rodriguez</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar 
              size="lg" 
              imageUrl="broken-url"
              name="Fallback Test"
              altText="This should show initials">
            </ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Fallback (Broken URL)</p>
          </div>
        </div>
      </section>

      <!-- With Status -->
      <section style="margin-bottom: 3rem;">
        <h3>Status Indicators</h3>
        <div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Online User" status="online"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Online</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Offline User" status="offline"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Offline</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Away User" status="away"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Away</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Busy User" status="busy"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Busy</p>
          </div>
        </div>
      </section>

      <!-- With Badges -->
      <section style="margin-bottom: 3rem;">
        <h3>Notification Badges</h3>
        <div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Badge User" badge="3"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">3 notifications</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Badge User" badge="99+"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">99+ notifications</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Badge User" badge="5" status="online"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Online + Badge</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar 
              size="lg" 
              name="Premium User" 
              badge="⭐"
              imageUrl="https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=150&h=150&fit=crop&crop=face">
            </ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Premium User</p>
          </div>
        </div>
      </section>

      <!-- Shape Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Shape Variants</h3>
        <div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Circle User" shape="circle"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Circle (Default)</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Square User" shape="square"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Square</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Rounded User" shape="rounded"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Rounded Square</p>
          </div>
        </div>
      </section>

      <!-- Color Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Color Variants</h3>
        <div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Primary User" color="primary"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Primary</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Secondary User" color="secondary"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Secondary</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Success User" color="success"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Success</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Warning User" color="warning"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Warning</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Danger User" color="danger"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Danger</p>
          </div>
        </div>
      </section>

      <!-- Activity List Example -->
      <section style="margin-bottom: 3rem;">
        <h3>Activity List Example</h3>
        <div style="background: #f8f9fa; border-radius: 12px; padding: 1.5rem; max-width: 600px;">
          <h4 style="margin: 0 0 1rem 0; font-size: 1.125rem;">Recent Activity</h4>
          @for (activity of activities; track activity.user) {
            <div style="display: flex; align-items: center; gap: 0.75rem; padding: 0.75rem 0; border-bottom: 1px solid #e9ecef;">
              <ui-avatar 
                size="sm" 
                [name]="activity.user"
                [status]="activity.status">
              </ui-avatar>
              <div style="flex: 1; min-width: 0;">
                <div style="font-weight: 500; font-size: 14px; margin-bottom: 2px;">{{ activity.user }}</div>
                <div style="color: #666; font-size: 12px; line-height: 1.3;">{{ activity.action }}</div>
              </div>
              <div style="color: #999; font-size: 11px; white-space: nowrap;">{{ activity.time }}</div>
            </div>
          }
        </div>
      </section>

      <!-- User List Example -->
      <section style="margin-bottom: 3rem;">
        <h3>User List Example</h3>
        <div style="background: #f8f9fa; border-radius: 12px; padding: 1.5rem; max-width: 800px;">
          <div style="display: grid; gap: 1rem;">
            @for (user of userProfiles; track user.id) {
              <div style="display: flex; align-items: center; gap: 1rem; padding: 1rem; background: white; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);">
                <ui-avatar 
                  size="lg"
                  [name]="user.name"
                  [imageUrl]="user.avatar"
                  [status]="user.status"
                  [badge]="user.notifications > 0 ? user.notifications.toString() : ''">
                </ui-avatar>
                <div style="flex: 1; min-width: 0;">
                  <h4 style="margin: 0; font-size: 16px; font-weight: 600;">{{ user.name }}</h4>
                  <p style="margin: 2px 0; color: #666; font-size: 14px;">{{ user.role }}</p>
                  <p style="margin: 0; color: #999; font-size: 12px;">{{ user.email }}</p>
                </div>
                <div style="text-align: right;">
                  <div style="font-size: 12px; color: #999;">Last seen</div>
                  <div style="font-size: 12px; font-weight: 500;">{{ user.lastSeen }}</div>
                </div>
              </div>
            }
          </div>
        </div>
      </section>

      <!-- Loading and Error States -->
      <section style="margin-bottom: 3rem;">
        <h3>Special States</h3>
        <div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-avatar size="lg" [loading]="true"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Loading</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="" altText="Empty name fallback"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Empty Name</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" name="Single" altText="Single character name"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">Single Character</p>
          </div>
          <div style="text-align: center;">
            <ui-avatar size="lg" altText="No name provided"></ui-avatar>
            <p style="font-size: 12px; margin: 0.5rem 0;">No Name</p>
          </div>
        </div>
      </section>

      <!-- Avatar Group Example -->
      <section style="margin-bottom: 3rem;">
        <h3>Avatar Group Example</h3>
        <div style="display: flex; align-items: center; gap: -0.5rem;">
          @for (member of teamMembers; track member.name; let i = $index) {
            <ui-avatar 
              size="md"
              [name]="member.name"
              [imageUrl]="member.avatar"
              [status]="member.status"
              [style.z-index]="teamMembers.length - i"
              [style.margin-left]="i > 0 ? '-8px' : '0'">
            </ui-avatar>
          }
          <div style="margin-left: 1rem; padding: 0.5rem 1rem; background: #e3f2fd; border-radius: 20px; font-size: 12px; font-weight: 500;">
            +{{ teamMembers.length }} members
          </div>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Avatar:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-avatar 
  size="md" 
  name="Current User"
  status="online"&gt;
&lt;/ui-avatar&gt;</code></pre>
          
          <h4>Avatar with Image:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-avatar 
  size="lg"
  name="John Doe"
  imageUrl="https://example.com/avatar.jpg"
  altText="John's profile picture"
  status="away"
  badge="5"&gt;
&lt;/ui-avatar&gt;</code></pre>

          <h4>Custom Styled Avatar:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-avatar 
  size="xl"
  name="Admin User"
  color="primary"
  shape="rounded"
  badge="⭐"
  [loading]="false"&gt;
&lt;/ui-avatar&gt;</code></pre>
        </div>
      </section>

      <!-- Interactive Example -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Example</h3>
        <div style="display: flex; gap: 1rem; align-items: center; flex-wrap: wrap; margin-bottom: 1rem;">
          <button 
            (click)="cycleStatus()"
            style="padding: 0.5rem 1rem; border: 1px solid #007bff; background: #007bff; color: white; border-radius: 4px; cursor: pointer;">
            Toggle Status
          </button>
          <button 
            (click)="toggleBadge()"
            style="padding: 0.5rem 1rem; border: 1px solid #28a745; background: #28a745; color: white; border-radius: 4px; cursor: pointer;">
            Toggle Badge
          </button>
          <button 
            (click)="cycleSize()"
            style="padding: 0.5rem 1rem; border: 1px solid #6c757d; background: #6c757d; color: white; border-radius: 4px; cursor: pointer;">
            Cycle Size
          </button>
        </div>
        
        <div style="display: flex; align-items: center; gap: 1rem;">
          <ui-avatar 
            [size]="interactiveSize"
            name="Interactive User"
            [status]="interactiveStatus"
            [badge]="interactiveBadge"
            imageUrl="https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=150&h=150&fit=crop&crop=face">
          </ui-avatar>
          <div>
            <div><strong>Size:</strong> {{ interactiveSize }}</div>
            <div><strong>Status:</strong> {{ interactiveStatus || 'none' }}</div>
            <div><strong>Badge:</strong> {{ interactiveBadge || 'none' }}</div>
          </div>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }
  `]
})
export class AvatarDemoComponent {
  activities: Activity[] = [
    {
      user: 'Alice Johnson',
      action: 'Updated the project documentation and added new API endpoints',
      time: '2 min ago',
      status: 'online'
    },
    {
      user: 'Bob Smith',
      action: 'Completed code review for the authentication module',
      time: '15 min ago',
      status: 'away'
    },
    {
      user: 'Carol Williams',
      action: 'Created new user interface mockups for the dashboard',
      time: '1 hour ago',
      status: 'online'
    },
    {
      user: 'David Brown',
      action: 'Fixed critical bug in the payment processing system',
      time: '2 hours ago',
      status: 'busy'
    },
    {
      user: 'Eve Davis',
      action: 'Deployed version 2.1.0 to production environment',
      time: '3 hours ago',
      status: 'offline'
    }
  ];

  userProfiles = [
    {
      id: 1,
      name: 'Alice Johnson',
      role: 'Senior Developer',
      email: 'alice@company.com',
      status: 'online' as const,
      notifications: 3,
      lastSeen: '2 min ago',
      avatar: 'https://images.unsplash.com/photo-1494790108755-2616b612b786?w=150&h=150&fit=crop&crop=face'
    },
    {
      id: 2,
      name: 'Bob Smith',
      role: 'Product Manager',
      email: 'bob@company.com',
      status: 'away' as const,
      notifications: 0,
      lastSeen: '15 min ago',
      avatar: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=150&h=150&fit=crop&crop=face'
    },
    {
      id: 3,
      name: 'Carol Williams',
      role: 'UX Designer',
      email: 'carol@company.com',
      status: 'online' as const,
      notifications: 12,
      lastSeen: 'Just now',
      avatar: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=150&h=150&fit=crop&crop=face'
    }
  ];

  teamMembers = [
    { name: 'Alex Chen', status: 'online' as const, avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&h=150&fit=crop&crop=face' },
    { name: 'Maria Garcia', status: 'away' as const, avatar: 'https://images.unsplash.com/photo-1517841905240-472988babdf9?w=150&h=150&fit=crop&crop=face' },
    { name: 'James Wilson', status: 'busy' as const, avatar: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=150&h=150&fit=crop&crop=face' },
    { name: 'Sarah Kim', status: 'online' as const, avatar: 'https://images.unsplash.com/photo-1534751516642-a1af1ef26a56?w=150&h=150&fit=crop&crop=face' },
  ];

  // Interactive demo properties
  interactiveSize: any = 'lg';
  interactiveStatus: any = 'online';
  interactiveBadge = '3';

  private statusCycle: any[] = ['online', 'away', 'busy', 'offline', null];
  private statusIndex = 0;

  private sizeCycle: any[] = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
  private sizeIndex = 3; // Start with 'lg'

  cycleStatus(): void {
    this.statusIndex = (this.statusIndex + 1) % this.statusCycle.length;
    this.interactiveStatus = this.statusCycle[this.statusIndex];
  }

  toggleBadge(): void {
    if (this.interactiveBadge) {
      this.interactiveBadge = '';
    } else {
      this.interactiveBadge = Math.floor(Math.random() * 99 + 1).toString();
    }
  }

  cycleSize(): void {
    this.sizeIndex = (this.sizeIndex + 1) % this.sizeCycle.length;
    this.interactiveSize = this.sizeCycle[this.sizeIndex];
  }
}G5lxg&_  (1x&@use '../../../../../ui-design-system/src/styles/semantic/index' as tokens;

.demo-container {
  padding: tokens.$semantic-spacing-layout-md;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: tokens.$semantic-spacing-layout-lg;
  padding: tokens.$semantic-spacing-component-md;
  background: tokens.$semantic-color-surface-primary;
  border: tokens.$semantic-border-width-1 solid tokens.$semantic-color-border-primary;
  border-radius: tokens.$semantic-border-radius-md;
  box-shadow: tokens.$semantic-shadow-elevation-1;

  h3 {
    margin: 0 0 tokens.$semantic-spacing-content-paragraph 0;
    font-size: tokens.$semantic-typography-heading-h3-size;
    color: tokens.$semantic-color-text-primary;
  }
}

.demo-row {
  display: flex;
  gap: tokens.$semantic-spacing-component-sm;
  flex-wrap: wrap;
  margin-bottom: tokens.$semantic-spacing-content-paragraph;
}

.demo-controls {
  display: flex;
  align-items: center;
  gap: tokens.$semantic-spacing-component-md;
  margin-bottom: tokens.$semantic-spacing-content-paragraph;
  flex-wrap: wrap;

  label {
    font-size: tokens.$semantic-typography-font-size-md;
    color: tokens.$semantic-color-text-primary;
    font-weight: tokens.$semantic-typography-font-weight-medium;
    min-width: 100px;
  }

  input[type="range"] {
    flex: 1;
    min-width: 200px;
    max-width: 300px;
    margin: 0 tokens.$semantic-spacing-component-sm;
  }
}

.demo-button {
  padding: tokens.$semantic-spacing-component-sm tokens.$semantic-spacing-component-md;
  background: tokens.$semantic-color-primary;
  color: tokens.$semantic-color-on-primary;
  border: none;
  border-radius: tokens.$semantic-border-radius-sm;
  font-size: tokens.$semantic-typography-font-size-md;
  cursor: pointer;
  transition: all tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease;

  &:hover {
    background: tokens.$semantic-color-primary-hover;
    box-shadow: tokens.$semantic-shadow-elevation-2;
  }

  &:active {
    transform: translateY(1px);
    box-shadow: tokens.$semantic-shadow-elevation-1;
  }

  &--secondary {
    background: tokens.$semantic-color-surface-secondary;
    color: tokens.$semantic-color-text-primary;
    border: tokens.$semantic-border-width-1 solid tokens.$semantic-color-border-primary;

    &:hover {
      background: tokens.$semantic-color-surface-secondary;
    }
  }
}

// Backdrop content styles
.backdrop-content {
  background: tokens.$semantic-color-surface-primary;
  padding: tokens.$semantic-spacing-component-lg;
  border-radius: tokens.$semantic-border-radius-md;
  box-shadow: tokens.$semantic-shadow-elevation-4;
  text-align: center;
  max-width: 400px;
  margin: 0 auto;

  h4 {
    margin: 0 0 tokens.$semantic-spacing-content-paragraph 0;
    font-size: tokens.$semantic-typography-heading-h4-size;
    color: tokens.$semantic-color-text-primary;
  }

  p {
    margin: 0 0 tokens.$semantic-spacing-content-paragraph 0;
    font-size: tokens.$semantic-typography-font-size-md;
    color: tokens.$semantic-color-text-secondary;
  }

  &--glass {
    background: rgba(255, 255, 255, 0.9);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    border: tokens.$semantic-border-width-1 solid rgba(255, 255, 255, 0.2);
  }

  &--large {
    max-width: 600px;
    padding: tokens.$semantic-spacing-component-xl;
  }

  &--small {
    max-width: 300px;
    padding: tokens.$semantic-spacing-component-md;
  }
}

// Event log styles
.demo-log {
  background: tokens.$semantic-color-surface-secondary;
  border: tokens.$semantic-border-width-1 solid tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-sm;
  padding: tokens.$semantic-spacing-component-md;
  max-height: 200px;
  overflow-y: auto;
  margin-bottom: tokens.$semantic-spacing-content-paragraph;
  font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
}

.log-entry {
  font-size: tokens.$semantic-typography-font-size-sm;
  color: tokens.$semantic-color-text-primary;
  padding: tokens.$semantic-spacing-component-xs 0;
  border-bottom: tokens.$semantic-border-width-1 solid tokens.$semantic-color-border-subtle;

  &:last-child {
    border-bottom: none;
  }

  &--empty {
    color: tokens.$semantic-color-text-tertiary;
    font-style: italic;
    text-align: center;
    border-bottom: none;
  }
}

// Dark mode support
:host-context(.dark-theme) {
  .backdrop-content {
    &--glass {
      background: rgba(0, 0, 0, 0.8);
      border: tokens.$semantic-border-width-1 solid rgba(255, 255, 255, 0.1);
    }
  }
}

// Responsive design
@media (max-width: #{tokens.$semantic-breakpoint-md - 1px}) {
  .demo-container {
    padding: tokens.$semantic-spacing-layout-sm;
  }

  .demo-section {
    padding: tokens.$semantic-spacing-component-sm;
  }

  .backdrop-content {
    margin: tokens.$semantic-spacing-layout-sm;
    padding: tokens.$semantic-spacing-component-md;

    &--large,
    &--small {
      max-width: none;
      padding: tokens.$semantic-spacing-component-md;
    }
  }

  .demo-controls {
    flex-direction: column;
    align-items: stretch;

    input[type="range"] {
      min-width: auto;
    }
  }
}

@media (max-width: #{tokens.$semantic-breakpoint-sm - 1px}) {
  .demo-row {
    flex-direction: column;
  }

  .demo-button {
    width: 100%;
    text-align: center;
  }
}P `gxyIs(gqFbQjniF-" U̽x]%import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BackdropComponent } from '../../../../../ui-essentials/src/lib/components/overlays/backdrop/backdrop.component';

@Component({
  selector: 'ui-backdrop-demo',
  standalone: true,
  imports: [CommonModule, BackdropComponent],
  template: `
    <div class="demo-container">
      <h2>Backdrop Demo</h2>
      
      <!-- Basic Usage -->
      <section class="demo-section">
        <h3>Basic Backdrop</h3>
        <div class="demo-row">
          <button 
            class="demo-button"
            (click)="toggleBasicBackdrop()"
          >
            Toggle Basic Backdrop
          </button>
        </div>
        
        <ui-backdrop 
          [visible]="showBasicBackdrop"
          (clicked)="handleBackdropClick('Basic backdrop clicked!')"
          (visibleChange)="showBasicBackdrop = $event"
        ></ui-backdrop>
      </section>
      
      <!-- Backdrop Variants -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <button 
              class="demo-button"
              (click)="showVariantBackdrop(variant)"
            >
              {{ variant }} Backdrop
            </button>
          }
        </div>
        
        @if (currentVariant) {
          <ui-backdrop 
            [visible]="showVariant"
            [variant]="currentVariant"
            [opacity]="0.6"
            (clicked)="handleBackdropClick($event.type + ' backdrop clicked!')"
            (visibleChange)="handleVariantVisibilityChange($event)"
          >
            <div class="backdrop-content">
              <h4>{{ currentVariant | titlecase }} Backdrop</h4>
              <p>Click backdrop to close</p>
            </div>
          </ui-backdrop>
        }
      </section>
      
      <!-- Blur Backdrop -->
      <section class="demo-section">
        <h3>Blur Effect</h3>
        <div class="demo-row">
          <button 
            class="demo-button"
            (click)="toggleBlurBackdrop()"
          >
            Toggle Blur Backdrop
          </button>
        </div>
        
        <ui-backdrop 
          [visible]="showBlurBackdrop"
          [blur]="true"
          [opacity]="0.3"
          (clicked)="handleBackdropClick('Blur backdrop clicked!')"
          (visibleChange)="showBlurBackdrop = $event"
        >
          <div class="backdrop-content backdrop-content--glass">
            <h4>Blur Backdrop</h4>
            <p>Notice the blur effect behind this content</p>
            <button class="demo-button" (click)="showBlurBackdrop = false">Close</button>
          </div>
        </ui-backdrop>
      </section>
      
      <!-- Opacity Control -->
      <section class="demo-section">
        <h3>Opacity Control</h3>
        <div class="demo-controls">
          <label for="opacity-slider">Opacity: {{ currentOpacity }}</label>
          <input 
            id="opacity-slider"
            type="range" 
            min="0.1" 
            max="1" 
            step="0.1" 
            [value]="currentOpacity"
            (input)="updateOpacity($event)"
          >
          <button 
            class="demo-button"
            (click)="toggleOpacityBackdrop()"
          >
            Show Backdrop
          </button>
        </div>
        
        <ui-backdrop 
          [visible]="showOpacityBackdrop"
          [opacity]="currentOpacity"
          (clicked)="handleBackdropClick('Opacity backdrop clicked!')"
          (visibleChange)="showOpacityBackdrop = $event"
        >
          <div class="backdrop-content">
            <h4>Opacity: {{ currentOpacity }}</h4>
            <p>Adjust the opacity using the slider above</p>
          </div>
        </ui-backdrop>
      </section>
      
      <!-- Z-Index Control -->
      <section class="demo-section">
        <h3>Z-Index & Stacking</h3>
        <div class="demo-row">
          <button 
            class="demo-button"
            (click)="showStackedBackdrops()"
          >
            Show Stacked Backdrops
          </button>
        </div>
        
        <!-- Lower z-index backdrop -->
        <ui-backdrop 
          [visible]="showFirstBackdrop"
          [zIndex]="1000"
          variant="dark"
          [opacity]="0.4"
          (clicked)="handleBackdropClick('First backdrop clicked!')"
        >
          <div class="backdrop-content backdrop-content--large">
            <h4>First Backdrop (z-index: 1000)</h4>
            <p>This is behind the second backdrop</p>
          </div>
        </ui-backdrop>
        
        <!-- Higher z-index backdrop -->
        <ui-backdrop 
          [visible]="showSecondBackdrop"
          [zIndex]="1010"
          variant="light"
          [opacity]="0.3"
          (clicked)="handleBackdropClick('Second backdrop clicked!')"
          (visibleChange)="handleStackedBackdropChange($event)"
        >
          <div class="backdrop-content backdrop-content--small">
            <h4>Second Backdrop (z-index: 1010)</h4>
            <p>This is in front of the first backdrop</p>
            <button class="demo-button" (click)="hideStackedBackdrops()">Close Both</button>
          </div>
        </ui-backdrop>
      </section>
      
      <!-- Non-clickable Backdrop -->
      <section class="demo-section">
        <h3>Non-clickable Backdrop</h3>
        <div class="demo-row">
          <button 
            class="demo-button"
            (click)="toggleNonClickableBackdrop()"
          >
            Show Non-clickable
          </button>
        </div>
        
        <ui-backdrop 
          [visible]="showNonClickableBackdrop"
          [clickable]="false"
          (visibleChange)="showNonClickableBackdrop = $event"
        >
          <div class="backdrop-content">
            <h4>Non-clickable Backdrop</h4>
            <p>This backdrop cannot be clicked to close</p>
            <button class="demo-button" (click)="showNonClickableBackdrop = false">Close</button>
          </div>
        </ui-backdrop>
      </section>
      
      <!-- Event Log -->
      <section class="demo-section">
        <h3>Event Log</h3>
        <div class="demo-log">
          @for (event of eventLog; track $index) {
            <div class="log-entry">{{ event }}</div>
          }
          @empty {
            <div class="log-entry log-entry--empty">No events yet. Interact with backdrops above.</div>
          }
        </div>
        <button class="demo-button demo-button--secondary" (click)="clearEventLog()">Clear Log</button>
      </section>
    </div>
  `,
  styleUrl: './backdrop-demo.component.scss'
})
export class BackdropDemoComponent {
  // Basic backdrop
  showBasicBackdrop = false;
  
  // Variant backdrop
  variants = ['default', 'blur', 'dark', 'light'] as const;
  currentVariant: typeof this.variants[number] | null = null;
  showVariant = false;
  
  // Blur backdrop
  showBlurBackdrop = false;
  
  // Opacity backdrop
  showOpacityBackdrop = false;
  currentOpacity = 0.5;
  
  // Stacked backdrops
  showFirstBackdrop = false;
  showSecondBackdrop = false;
  
  // Non-clickable backdrop
  showNonClickableBackdrop = false;
  
  // Event log
  eventLog: string[] = [];
  
  toggleBasicBackdrop(): void {
    this.showBasicBackdrop = !this.showBasicBackdrop;
    this.logEvent(`Basic backdrop ${this.showBasicBackdrop ? 'opened' : 'closed'}`);
  }
  
  showVariantBackdrop(variant: typeof this.variants[number]): void {
    this.currentVariant = variant;
    this.showVariant = true;
    this.logEvent(`${variant} backdrop opened`);
  }
  
  handleVariantVisibilityChange(visible: boolean): void {
    this.showVariant = visible;
    if (!visible && this.currentVariant) {
      this.logEvent(`${this.currentVariant} backdrop closed`);
      this.currentVariant = null;
    }
  }
  
  toggleBlurBackdrop(): void {
    this.showBlurBackdrop = !this.showBlurBackdrop;
    this.logEvent(`Blur backdrop ${this.showBlurBackdrop ? 'opened' : 'closed'}`);
  }
  
  updateOpacity(event: Event): void {
    const target = event.target as HTMLInputElement;
    this.currentOpacity = parseFloat(target.value);
  }
  
  toggleOpacityBackdrop(): void {
    this.showOpacityBackdrop = !this.showOpacityBackdrop;
    this.logEvent(`Opacity backdrop ${this.showOpacityBackdrop ? 'opened' : 'closed'} with opacity ${this.currentOpacity}`);
  }
  
  showStackedBackdrops(): void {
    this.showFirstBackdrop = true;
    this.showSecondBackdrop = true;
    this.logEvent('Stacked backdrops opened');
  }
  
  hideStackedBackdrops(): void {
    this.showFirstBackdrop = false;
    this.showSecondBackdrop = false;
    this.logEvent('Stacked backdrops closed');
  }
  
  handleStackedBackdropChange(visible: boolean): void {
    if (!visible) {
      this.hideStackedBackdrops();
    }
  }
  
  toggleNonClickableBackdrop(): void {
    this.showNonClickableBackdrop = !this.showNonClickableBackdrop;
    this.logEvent(`Non-clickable backdrop ${this.showNonClickableBackdrop ? 'opened' : 'closed'}`);
  }
  
  handleBackdropClick(message: string): void {
    this.logEvent(message);
  }
  
  private logEvent(message: string): void {
    const timestamp = new Date().toLocaleTimeString();
    this.eventLog.unshift(`[${timestamp}] ${message}`);
    
    // Keep only last 10 events
    if (this.eventLog.length > 10) {
      this.eventLog = this.eventLog.slice(0, 10);
    }
  }
  
  clearEventLog(): void {
    this.eventLog = [];
    this.logEvent('Event log cleared');
  }
}ojkxuk¶U  x@use 'ui-design-system/src/styles' as ui;

.backgrounds-demo {
  padding: 2rem;
  max-width: 1200px;
  margin: 0 auto;
  
  .demo-header {
    text-align: center;
    margin-bottom: 3rem;
    
    h1 {
      font-size: 3rem;
      font-weight: 700;
      color: var(--primary-900, #1e293b);
      margin-bottom: 1rem;
    }
    
    p {
      font-size: 1.2rem;
      color: var(--neutral-600, #64748b);
    }
  }
  
  .demo-section {
    margin-bottom: 4rem;
    
    h2 {
      font-size: 2rem;
      font-weight: 600;
      color: var(--primary-800, #334155);
      margin-bottom: 2rem;
      border-bottom: 2px solid var(--primary-200, #e2e8f0);
      padding-bottom: 0.5rem;
    }
  }
  
  .example-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 2rem;
    margin-bottom: 2rem;
  }
  
  .demo-card {
    padding: 2rem;
    border-radius: 1rem;
    min-height: 200px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
    color: white;
    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
    box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
    transition: transform 0.3s ease, box-shadow 0.3s ease;
    
    &:hover {
      transform: translateY(-5px);
      box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
    }
    
    h3 {
      font-size: 1.5rem;
      font-weight: 600;
      margin-bottom: 1rem;
    }
    
    p {
      font-size: 1rem;
      opacity: 0.9;
      line-height: 1.5;
    }
  }
  
  .pattern-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 1rem;
  }
  
  .pattern-demo {
    aspect-ratio: 1;
    border-radius: 0.5rem;
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    overflow: hidden;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    transition: transform 0.2s ease;
    
    &:hover {
      transform: scale(1.05);
    }
    
    .pattern-name {
      background: rgba(0, 0, 0, 0.7);
      color: white;
      padding: 0.5rem 1rem;
      border-radius: 0.25rem;
      font-size: 0.875rem;
      font-weight: 500;
      text-transform: capitalize;
    }
  }
  
  .gradient-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 2rem;
  }
  
  .gradient-demo {
    aspect-ratio: 16/9;
    border-radius: 1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
    font-size: 1.2rem;
    font-weight: 600;
    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
    box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
    transition: transform 0.3s ease;
    
    &:hover {
      transform: translateY(-3px);
    }
  }
  
  .interactive-demo {
    padding: 3rem;
    border-radius: 1rem;
    min-height: 300px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    color: white;
    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
    box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
    position: relative;
    transition: all 0.5s ease;
    
    .controls {
      display: flex;
      gap: 1rem;
      margin-bottom: 2rem;
      flex-wrap: wrap;
      justify-content: center;
    }
    
    h3 {
      font-size: 2rem;
      margin-bottom: 1rem;
    }
    
    p {
      font-size: 1.1rem;
      opacity: 0.9;
    }
  }
  
  .fullscreen-controls {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
  }
  
  .action-btn {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    border: none;
    padding: 1rem 2rem;
    border-radius: 0.5rem;
    font-weight: 600;
    font-size: 1rem;
    cursor: pointer;
    transition: all 0.3s ease;
    box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
    
    &:hover {
      transform: translateY(-2px);
      box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
    }
    
    &:active {
      transform: translateY(0);
    }
  }
  
  .preset-btn {
    background: rgba(255, 255, 255, 0.1);
    border: 2px solid rgba(255, 255, 255, 0.2);
    color: var(--primary-700, #475569);
    padding: 0.75rem 1.5rem;
    border-radius: 0.5rem;
    font-weight: 500;
    cursor: pointer;
    transition: all 0.3s ease;
    backdrop-filter: blur(10px);
    
    &:hover {
      background: rgba(255, 255, 255, 0.2);
      border-color: rgba(255, 255, 255, 0.4);
      transform: translateY(-1px);
    }
    
    &:active {
      transform: translateY(0);
    }
  }
}

// Responsive adjustments
@media (max-width: 768px) {
  .backgrounds-demo {
    padding: 1rem;
    
    .demo-header h1 {
      font-size: 2rem;
    }
    
    .example-grid {
      grid-template-columns: 1fr;
    }
    
    .pattern-grid {
      grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
    }
    
    .gradient-grid {
      grid-template-columns: 1fr;
    }
    
    .interactive-demo {
      padding: 2rem;
      
      .controls {
        flex-direction: column;
        width: 100%;
      }
    }
    
    .fullscreen-controls {
      flex-direction: column;
    }
  }
}

// Dark mode support
@media (prefers-color-scheme: dark) {
  .backgrounds-demo {
    .demo-header h1 {
      color: var(--neutral-100, #f8fafc);
    }
    
    .demo-section h2 {
      color: var(--neutral-200, #e2e8f0);
      border-bottom-color: var(--primary-700, #475569);
    }
    
    .preset-btn {
      color: var(--neutral-200, #e2e8f0);
    }
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .backgrounds-demo {
    .demo-card,
    .pattern-demo,
    .gradient-demo,
    .interactive-demo {
      border: 2px solid rgba(0, 0, 0, 0.8);
    }
  }
}

// Reduced motion
@media (prefers-reduced-motion: reduce) {
  .backgrounds-demo {
    * {
      transition: none !important;
      animation: none !important;
    }
  }
}t#x ..@use '../../../../../}7x#import { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BackgroundDirective } from '../../../../../ui-backgrounds/src/lib/directives/background.directive';
import { SolidBackgroundComponent } from '../../../../../ui-backgrounds/src/lib/components/backgrounds/solid-background.component';
import { GradientBackgroundComponent } from '../../../../../ui-backgrounds/src/lib/components/backgrounds/gradient-background.component';
import { PatternBackgroundComponent } from '../../../../../ui-backgrounds/src/lib/components/backgrounds/pattern-background.component';
import { ImageBackgroundComponent } from '../../../../../ui-backgrounds/src/lib/components/backgrounds/image-background.component';
import { LinearGradientConfig, PatternConfig, SolidBackgroundConfig } from '../../../../../ui-backgrounds/src/lib/types/background.types';
import { BackgroundService } from '../../../../../ui-backgrounds/src/lib/services/background.service';


@Component({
  selector: 'app-backgrounds-demo',
  standalone: true,
  imports: [
    CommonModule,
    BackgroundDirective,
    SolidBackgroundComponent,
    GradientBackgroundComponent,
    PatternBackgroundComponent,
    ImageBackgroundComponent
  ],
  template: `
    <div class="backgrounds-demo">
      <div class="demo-header">
        <h1>UI Backgrounds Demo</h1>
        <p>Explore different background types and configurations</p>
      </div>

      <!-- Directive Examples -->
      <section class="demo-section">
        <h2>Background Directive Examples</h2>
        
        <div class="example-grid">
          <div class="demo-card" [uiBackground]="solidConfig()">
            <h3>Solid Background</h3>
            <p>Using the background directive with solid color</p>
          </div>

          <div class="demo-card" [uiBackground]="gradientConfig()">
            <h3>Linear Gradient</h3>
            <p>Beautiful gradient backgrounds</p>
          </div>

          <div class="demo-card" [uiBackground]="patternConfig()">
            <h3>Pattern Background</h3>
            <p>Geometric patterns</p>
          </div>
        </div>
      </section>

      <!-- Component Examples -->
      <section class="demo-section">
        <h2>Background Components</h2>
        
        <div class="example-grid">
          <ui-solid-background color="#4ade80" class="demo-card">
            <h3>Solid Component</h3>
            <p>Green background using component</p>
          </ui-solid-background>

          <ui-gradient-background 
            type="linear"
            [colors]="['#8b5cf6', '#06b6d4']"
            direction="45deg"
            class="demo-card">
            <h3>Gradient Component</h3>
            <p>Purple to cyan gradient</p>
          </ui-gradient-background>

          <ui-pattern-background
            pattern="dots"
            primaryColor="#f59e0b"
            secondaryColor="transparent"
            [size]="30"
            [opacity]="0.7"
            class="demo-card">
            <h3>Pattern Component</h3>
            <p>Orange dots pattern</p>
          </ui-pattern-background>
        </div>
      </section>

      <!-- Pattern Showcase -->
      <section class="demo-section">
        <h2>Pattern Showcase</h2>
        
        <div class="pattern-grid">
          <div 
            *ngFor="let pattern of patterns" 
            class="pattern-demo"
            [uiBackground]="getPatternConfig(pattern)">
            <span class="pattern-name">{{ pattern }}</span>
          </div>
        </div>
      </section>

      <!-- Gradient Types -->
      <section class="demo-section">
        <h2>Gradient Types</h2>
        
        <div class="gradient-grid">
          <ui-gradient-background 
            type="linear"
            [colors]="['#ff6b6b', '#4ecdc4', '#45b7d1']"
            direction="to right"
            class="gradient-demo">
            <span>Linear Gradient</span>
          </ui-gradient-background>

          <ui-gradient-background 
            type="radial"
            [colors]="['#667eea', '#764ba2']"
            shape="circle"
            class="gradient-demo">
            <span>Radial Gradient</span>
          </ui-gradient-background>

          <ui-gradient-background 
            type="conic"
            [colors]="['#ff6b6b', '#4ecdc4', '#45b7d1', '#f9ca24', '#ff6b6b']"
            class="gradient-demo">
            <span>Conic Gradient</span>
          </ui-gradient-background>
        </div>
      </section>

      <!-- Interactive Controls -->
      <section class="demo-section">
        <h2>Interactive Background</h2>
        
        <div class="interactive-demo" [uiBackground]="interactiveConfig()">
          <div class="controls">
            <button 
              *ngFor="let config of presetConfigs" 
              (click)="setInteractiveConfig(config)"
              class="preset-btn">
              {{ config.name }}
            </button>
          </div>
          <h3>Interactive Background Demo</h3>
          <p>Click buttons to change the background</p>
        </div>
      </section>

      <!-- Full Screen Examples -->
      <section class="demo-section">
        <h2>Full Screen Backgrounds</h2>
        
        <div class="fullscreen-controls">
          <button (click)="toggleFullScreenBackground()" class="action-btn">
            {{ hasFullScreenBg() ? 'Remove' : 'Add' }} Full Screen Background
          </button>
          <button 
            *ngFor="let bg of fullScreenPresets" 
            (click)="setFullScreenBackground(bg)"
            class="preset-btn">
            {{ bg.name }}
          </button>
        </div>
      </section>
    </div>
  `,
  styleUrl: './backgrounds-demo.component.scss'
})
export class BackgroundsDemoComponent {
  private readonly backgroundService = signal(new BackgroundService());
  private fullScreenBackgroundId = signal<string | null>(null);

  // Configuration signals
  solidConfig = signal<SolidBackgroundConfig>({
    type: 'solid',
    color: '#3b82f6'
  });

  gradientConfig = signal<LinearGradientConfig>({
    type: 'linear-gradient',
    direction: 'to bottom right',
    colors: [
      { color: '#ec4899' },
      { color: '#8b5cf6' }
    ]
  });

  patternConfig = signal<PatternConfig>({
    type: 'pattern',
    pattern: 'grid',
    primaryColor: '#1f2937',
    secondaryColor: 'transparent',
    size: 20,
    opacity: 0.3
  });

  interactiveConfig = signal(this.solidConfig());

  // Pattern list for showcase
  patterns = [
    'dots', 'grid', 'stripes', 'diagonal-stripes', 
    'chevron', 'waves', 'circles', 'checkerboard'
  ];

  // Preset configurations
  presetConfigs = [
    {
      name: 'Ocean',
      config: {
        type: 'linear-gradient' as const,
        direction: 'to bottom',
        colors: [{ color: '#667eea' }, { color: '#764ba2' }]
      }
    },
    {
      name: 'Sunset',
      config: {
        type: 'linear-gradient' as const,
        direction: 'to right',
        colors: [{ color: '#ff6b6b' }, { color: '#feca57' }]
      }
    },
    {
      name: 'Forest',
      config: {
        type: 'solid' as const,
        color: '#10b981'
      }
    },
    {
      name: 'Dots',
      config: {
        type: 'pattern' as const,
        pattern: 'dots' as const,
        primaryColor: '#6366f1',
        secondaryColor: 'transparent',
        size: 25,
        opacity: 0.6
      }
    }
  ];

  // Full screen presets
  fullScreenPresets = [
    {
      name: 'Purple Mesh',
      config: {
        type: 'linear-gradient' as const,
        direction: 'to bottom right',
        colors: [{ color: '#667eea' }, { color: '#764ba2' }, { color: '#f093fb' }]
      }
    },
    {
      name: 'Geometric',
      config: {
        type: 'pattern' as const,
        pattern: 'chevron' as const,
        primaryColor: '#1f2937',
        secondaryColor: 'transparent',
        size: 40,
        opacity: 0.1
      }
    }
  ];

  getPatternConfig(pattern: string): PatternConfig {
    return {
      type: 'pattern',
      pattern: pattern as any,
      primaryColor: '#6366f1',
      secondaryColor: 'transparent',
      size: 25,
      opacity: 0.4
    };
  }

  setInteractiveConfig(preset: any) {
    this.interactiveConfig.set(preset.config);
  }

  toggleFullScreenBackground() {
    const currentId = this.fullScreenBackgroundId();
    if (currentId) {
      this.backgroundService().removeBackground(currentId);
      this.fullScreenBackgroundId.set(null);
    }
  }

  setFullScreenBackground(preset: any) {
    // Remove existing full screen background
    const currentId = this.fullScreenBackgroundId();
    if (currentId) {
      this.backgroundService().removeBackground(currentId);
    }

    // Add new full screen background
    const id = this.backgroundService().applyFullScreenBackground(preset.config, {
      zIndex: -1
    });
    this.fullScreenBackgroundId.set(id);
  }

  hasFullScreenBg() {
    return this.fullScreenBackgroundId() !== null;
  }
}'bN
'xqBSbrvzQ~i^KfQjrIfYXɵ,|&	#Eeɩ s~^Zf:Hbqg# $(!㙛V!(?WA4S7	.Wn< ;ximport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BadgeComponent } from '../../../../../ui-essentials/src/lib/components/data-display/badge/badge.component';

@Component({
  selector: 'ui-badge-demo',
  standalone: true,
  imports: [
    CommonModule,
    BadgeComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Badge Component Showcase</h2>
      
      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-badge size="xs" variant="primary">Extra Small</ui-badge>
            <p style="font-size: 12px; margin: 0.5rem 0;">XS</p>
          </div>
          <div style="text-align: center;">
            <ui-badge size="sm" variant="primary">Small</ui-badge>
            <p style="font-size: 12px; margin: 0.5rem 0;">Small</p>
          </div>
          <div style="text-align: center;">
            <ui-badge size="md" variant="primary">Medium</ui-badge>
            <p style="font-size: 12px; margin: 0.5rem 0;">Medium</p>
          </div>
          <div style="text-align: center;">
            <ui-badge size="lg" variant="primary">Large</ui-badge>
            <p style="font-size: 12px; margin: 0.5rem 0;">Large</p>
          </div>
        </div>
      </section>

      <!-- Variant Colors -->
      <section style="margin-bottom: 3rem;">
        <h3>Color Variants</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
          <ui-badge variant="default">Default</ui-badge>
          <ui-badge variant="primary">Primary</ui-badge>
          <ui-badge variant="secondary">Secondary</ui-badge>
          <ui-badge variant="success">Success</ui-badge>
          <ui-badge variant="warning">Warning</ui-badge>
          <ui-badge variant="danger">Danger</ui-badge>
          <ui-badge variant="info">Info</ui-badge>
        </div>
      </section>

      <!-- Shape Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Shape Variants</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
          <div style="text-align: center;">
            <ui-badge shape="pill" variant="primary">Pill Shape</ui-badge>
            <p style="font-size: 12px; margin: 0.5rem 0;">Pill</p>
          </div>
          <div style="text-align: center;">
            <ui-badge shape="rounded" variant="success">Rounded</ui-badge>
            <p style="font-size: 12px; margin: 0.5rem 0;">Rounded</p>
          </div>
          <div style="text-align: center;">
            <ui-badge shape="square" variant="warning">Square</ui-badge>
            <p style="font-size: 12px; margin: 0.5rem 0;">Square</p>
          </div>
        </div>
      </section>

      <!-- Dot Badges -->
      <section style="margin-bottom: 3rem;">
        <h3>Dot Badges</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
          <ui-badge variant="success" [isDot]="true"></ui-badge>
          <ui-badge variant="warning" [isDot]="true"></ui-badge>
          <ui-badge variant="danger" [isDot]="true"></ui-badge>
          <ui-badge variant="info" [isDot]="true"></ui-badge>
          <ui-badge variant="primary" [isDot]="true"></ui-badge>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Badge:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-badge variant="success" size="md"&gt;
  Active
&lt;/ui-badge&gt;</code></pre>
          
          <h4>Dot Badge:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-badge 
  variant="warning"
  [isDot]="true"
  ariaLabel="Warning status"&gt;
&lt;/ui-badge&gt;</code></pre>

          <h4>Custom Shape:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-badge 
  variant="danger"
  shape="square"
  size="lg"
  title="Critical status"&gt;
  Critical
&lt;/ui-badge&gt;</code></pre>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }
  `]
})
export class BadgeDemoComponent {
  // Simple demo with no interactive functionality for now
}W.jxRsµτE  YxS import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BentoGridComponent, BentoGridItemComponent } from 'ui-essentials';

@Component({
  selector: 'ui-bento-grid-demo',
  standalone: true,
  imports: [CommonModule, BentoGridComponent, BentoGridItemComponent],
  template: `
    <div class="demo-container">
      <h2>Bento Grid Demo</h2>
      
      <!-- Basic Grid -->
      <section class="demo-section">
        <h3>Basic Bento Grid</h3>
        <ui-bento-grid columns="auto-fit-md" gap="md">
          <ui-bento-grid-item header="Regular Item">
            Basic grid item with regular content.
          </ui-bento-grid-item>
          
          <ui-bento-grid-item featured="md" header="Featured Item" variant="primary">
            This is a featured item that spans 2 columns and 2 rows.
          </ui-bento-grid-item>
          
          <ui-bento-grid-item>
            Another regular item without header.
          </ui-bento-grid-item>
          
          <ui-bento-grid-item [colSpan]="2" variant="elevated" header="Wide Item">
            This item spans 2 columns wide.
          </ui-bento-grid-item>
          
          <ui-bento-grid-item [rowSpan]="2" variant="secondary" header="Tall Item">
            This item spans 2 rows tall.
          </ui-bento-grid-item>
          
          <ui-bento-grid-item>Regular item</ui-bento-grid-item>
          <ui-bento-grid-item>Regular item</ui-bento-grid-item>
          
          <ui-bento-grid-item featured="lg" header="Large Featured" variant="elevated">
            Large featured item spanning 3 columns and 2 rows.
          </ui-bento-grid-item>
          
          <ui-bento-grid-item>Regular item</ui-bento-grid-item>
          <ui-bento-grid-item>Regular item</ui-bento-grid-item>
        </ui-bento-grid>
      </section>
      
      <!-- Fixed Columns -->
      <section class="demo-section">
        <h3>Fixed Column Grids</h3>
        
        <h4>4 Columns</h4>
        <ui-bento-grid [columns]="4" gap="sm">
          <ui-bento-grid-item>Item 1</ui-bento-grid-item>
          <ui-bento-grid-item [colSpan]="2">Item 2 (2 cols)</ui-bento-grid-item>
          <ui-bento-grid-item>Item 3</ui-bento-grid-item>
          <ui-bento-grid-item>Item 4</ui-bento-grid-item>
          <ui-bento-grid-item [colSpan]="3">Item 5 (3 cols)</ui-bento-grid-item>
          <ui-bento-grid-item>Item 6</ui-bento-grid-item>
        </ui-bento-grid>
        
        <h4>6 Columns</h4>
        <ui-bento-grid [columns]="6" gap="xs">
          @for (item of sixColumnItems; track item.id) {
            <ui-bento-grid-item 
              [colSpan]="item.colSpan" 
              [rowSpan]="item.rowSpan"
              [variant]="item.variant"
              [header]="item.header">
              {{ item.content }}
            </ui-bento-grid-item>
          }
        </ui-bento-grid>
      </section>
      
      <!-- Gap Variants -->
      <section class="demo-section">
        <h3>Gap Sizes</h3>
        <div class="demo-row">
          @for (gap of gaps; track gap) {
            <div class="demo-variant">
              <h4>Gap: {{ gap }}</h4>
              <ui-bento-grid [columns]="3" [gap]="gap">
                <ui-bento-grid-item>Item A</ui-bento-grid-item>
                <ui-bento-grid-item>Item B</ui-bento-grid-item>
                <ui-bento-grid-item>Item C</ui-bento-grid-item>
                <ui-bento-grid-item [colSpan]="2">Item D (2 cols)</ui-bento-grid-item>
                <ui-bento-grid-item>Item E</ui-bento-grid-item>
              </ui-bento-grid>
            </div>
          }
        </div>
      </section>
      
      <!-- Featured Sizes -->
      <section class="demo-section">
        <h3>Featured Item Sizes</h3>
        <ui-bento-grid columns="auto-fit-md" gap="md">
          <ui-bento-grid-item featured="sm" variant="primary" header="Small Featured">
            2×1 featured item
          </ui-bento-grid-item>
          
          <ui-bento-grid-item>Regular</ui-bento-grid-item>
          <ui-bento-grid-item>Regular</ui-bento-grid-item>
          
          <ui-bento-grid-item featured="md" variant="secondary" header="Medium Featured">
            2×2 featured item
          </ui-bento-grid-item>
          
          <ui-bento-grid-item>Regular</ui-bento-grid-item>
          <ui-bento-grid-item>Regular</ui-bento-grid-item>
          <ui-bento-grid-item>Regular</ui-bento-grid-item>
          
          <ui-bento-grid-item featured="lg" variant="elevated" header="Large Featured">
            3×2 featured item
          </ui-bento-grid-item>
          
          <ui-bento-grid-item>Regular</ui-bento-grid-item>
          <ui-bento-grid-item>Regular</ui-bento-grid-item>
        </ui-bento-grid>
      </section>
      
      <!-- Interactive Items -->
      <section class="demo-section">
        <h3>Interactive Items</h3>
        <ui-bento-grid columns="auto-fit-md" gap="md">
          <ui-bento-grid-item 
            [interactive]="true" 
            variant="primary"
            header="Click Me!"
            (clicked)="handleItemClick('primary')">
            Interactive primary item
          </ui-bento-grid-item>
          
          <ui-bento-grid-item 
            [interactive]="true"
            [colSpan]="2"
            variant="secondary"
            header="Wide Interactive"
            (clicked)="handleItemClick('secondary')">
            Wide interactive item
          </ui-bento-grid-item>
          
          <ui-bento-grid-item 
            [interactive]="true"
            featured="md"
            variant="elevated"
            header="Featured Interactive"
            (clicked)="handleItemClick('featured')">
            Featured interactive item
          </ui-bento-grid-item>
          
          <ui-bento-grid-item>Static item</ui-bento-grid-item>
          <ui-bento-grid-item>Static item</ui-bento-grid-item>
        </ui-bento-grid>
        
        @if (lastClicked) {
          <p>Last clicked: <strong>{{ lastClicked }}</strong></p>
        }
      </section>
      
      <!-- Row Height Variants -->
      <section class="demo-section">
        <h3>Row Heights</h3>
        <div class="demo-row">
          @for (rowHeight of rowHeights; track rowHeight) {
            <div class="demo-variant">
              <h4>Rows: {{ rowHeight }}</h4>
              <ui-bento-grid [columns]="3" [rowHeight]="rowHeight" gap="sm">
                <ui-bento-grid-item>Small content</ui-bento-grid-item>
                <ui-bento-grid-item>
                  Longer content that might need more space depending on the row height setting.
                </ui-bento-grid-item>
                <ui-bento-grid-item [rowSpan]="2">Tall item</ui-bento-grid-item>
                <ui-bento-grid-item [colSpan]="2">Wide item</ui-bento-grid-item>
              </ui-bento-grid>
            </div>
          }
        </div>
      </section>
    </div>
  `,
  styleUrl: './bento-grid-demo.component.scss'
})
export class BentoGridDemoComponent {
  gaps = ['xs', 'sm', 'md', 'lg'] as const;
  rowHeights = ['sm', 'md', 'lg'] as const;
  lastClicked = '';
  
  sixColumnItems = [
    { id: 1, colSpan: 2, rowSpan: 1, variant: 'primary', header: 'Wide', content: '2×1 item' },
    { id: 2, colSpan: 1, rowSpan: 2, variant: 'secondary', header: 'Tall', content: '1×2 item' },
    { id: 3, colSpan: 1, rowSpan: 1, variant: 'default', header: '', content: 'Regular' },
    { id: 4, colSpan: 2, rowSpan: 1, variant: 'elevated', header: 'Featured', content: '2×1 item' },
    { id: 5, colSpan: 1, rowSpan: 1, variant: 'default', header: '', content: 'Regular' },
    { id: 6, colSpan: 3, rowSpan: 1, variant: 'primary', header: 'Extra Wide', content: '3×1 item' },
    { id: 7, colSpan: 1, rowSpan: 1, variant: 'default', header: '', content: 'Regular' },
    { id: 8, colSpan: 2, rowSpan: 2, variant: 'elevated', header: 'Large', content: '2×2 featured' },
    { id: 9, colSpan: 1, rowSpan: 1, variant: 'default', header: '', content: 'Regular' },
    { id: 10, colSpan: 1, rowSpan: 1, variant: 'default', header: '', content: 'Regular' },
  ] as const;
  
  handleItemClick(type: string): void {
    this.lastClicked = type;
    console.log('Bento grid item clicked:', type);
  }
}cjoIx -nKG'P8A\A?Ux@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.demo-container {
  padding: $semantic-spacing-layout-section-md;
  max-width: 1200px;
  margin: 0 auto;

  h2 {
    font-family: map-get($semantic-typography-heading-h2, font-family);
    font-size: map-get($semantic-typography-heading-h2, font-size);
    font-weight: map-get($semantic-typography-heading-h2, font-weight);
    line-height: map-get($semantic-typography-heading-h2, line-height);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-layout-section-lg;
  }
}

.demo-section {
  margin-bottom: $semantic-spacing-layout-section-xl;
  
  h3 {
    font-family: map-get($semantic-typography-heading-h3, font-family);
    font-size: map-get($semantic-typography-heading-h3, font-size);
    font-weight: map-get($semantic-typography-heading-h3, font-weight);
    line-height: map-get($semantic-typography-heading-h3, line-height);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-layout-section-md;
  }
  
  h4 {
    font-family: map-get($semantic-typography-heading-h4, font-family);
    font-size: map-get($semantic-typography-heading-h4, font-size);
    font-weight: map-get($semantic-typography-heading-h4, font-weight);
    line-height: map-get($semantic-typography-heading-h4, line-height);
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-component-sm;
  }
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: $semantic-spacing-grid-gap-lg;
}

.demo-column {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-layout-section-md;
}

.demo-item {
  padding: $semantic-spacing-component-lg;
  border: $semantic-border-width-1 solid $semantic-color-border-secondary;
  border-radius: $semantic-border-card-radius;
  background: $semantic-color-surface-primary;
}

.demo-controls {
  display: flex;
  gap: $semantic-spacing-component-sm;
  margin-bottom: $semantic-spacing-component-md;
  flex-wrap: wrap;
}

.demo-button {
  padding: $semantic-spacing-interactive-button-padding-y $semantic-spacing-interactive-button-padding-x;
  border: $semantic-border-width-1 solid $semantic-color-border-primary;
  border-radius: $semantic-border-button-radius;
  background: $semantic-color-surface-primary;
  color: $semantic-color-text-primary;
  font-family: map-get($semantic-typography-button-medium, font-family);
  font-size: map-get($semantic-typography-button-medium, font-size);
  font-weight: map-get($semantic-typography-button-medium, font-weight);
  line-height: map-get($semantic-typography-button-medium, line-height);
  cursor: pointer;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  min-height: $semantic-sizing-button-height-md;
  
  &:hover {
    background: $semantic-color-primary;
    color: $semantic-color-on-primary;
    border-color: $semantic-color-primary;
  }
  
  &:focus-visible {
    outline: 2px solid $semantic-color-focus;
    outline-offset: 2px;
  }
}

// Responsive Design
@media (max-width: ($semantic-breakpoint-lg - 1)) {
  .demo-grid {
    grid-template-columns: 1fr;
  }
}

@media (max-width: ($semantic-breakpoint-md - 1)) {
  .demo-container {
    padding: $semantic-spacing-layout-section-sm;
  }
  
  .demo-section {
    margin-bottom: $semantic-spacing-layout-section-lg;
  }
  
  .demo-item {
    padding: $semantic-spacing-component-md;
  }
}

@media (max-width: ($semantic-breakpoint-sm - 1)) {
  .demo-controls {
    flex-direction: column;
  }
  
  .demo-button {
    width: 100%;
  }
}%Rx+cH-bottom: 120px; // Extra space to accommodate bottom navigation examples9Flg;
}

.demo-rowz7,lg;
  flex-wrap: wrap;
  
  &--vertical {
  ?#@md;
  }
}

.demo-item {
  flex: 1;
  min-width: 300px;
  
  h4 {&j
23OF}
}

.demo-bottom-nav-container {
  position: relative;
  height: 80px(	secondaryoradius-md;
  overflow: hidden;
a-md;
  
  // Override the fixed positioning for demo purposes
  :deep(.ui-bottom-navigation) {
    position: absolute !important?;
    bottom: 0;
    left: 0;
    right: 0;
  }
}

.demo-info {'elevatedCubtle$radius-sm;
M-marginpmd 0;
  
  p {
    margin: 0 0qxs 0.*body-medium<body	,body-mediumQ>bodyN
Y  
    &:last-child {
      margin-bottom: 0;
    }
    
    strong {
      font-weight: 1font-weight-semibold;
  0}
  }hOy 	Kborder: none5g
b
  // Typography
,		:
  &:hover {
    box-shadow: $semantic-shadow-button-hoverh  
  &:active {
    box-shadow: $semantic-shadow-button-rest;
    transform: translateY(1px);
  }
  
  &.active {
    backgrounecond+#secondary;
  }
}

// Responsive adjustments
@media (max-width: $semantic-breakpoint-sm - 1) {
  .demo-row {
    flex-direction:P/}
  
  .demo-item {
    min-width: auto;
  }
  ^(*Xx[:ElgvJcontent-heading;
  }
}

.demo-row {
  display: flex;
  align-items: center%.><g
b
,		!	&
-	8secondary;
    box-shadow: $semantic-shadow-button-hoverh  
  &--primary {
  y2R  
    &:hover {
    yD    opacity: $semantic-opacity-hover;
    }
  }
  
  &--warning {
  warning. warningU$ warning;
    
    &:hover {
    Nwarning;
      opacity: $semantic-opacity-hover;
    }
  }
  
  &--danger {
  danger. dangerU$danger;
    
    &:hover {
    danger;
      opacity: $semantic-opacity-hover;
    }
  }
}

// Static snackbars for demo purposes
.demo-row ui-snackbar {
  mae-}!x )3A8#(5E4sk^ HP,x<c	.I	  
  h3 {?83xE3/<n	3v>n	3, line-height);
  	2!"content-heading;
    border-bottom1/	  padding+}
  
  h4 {?	2!.
sm;
  }:5layout-section-md;
  flex-wrap: wrap;
}

.demo-column'<.ui-tree-view {
    max-height: 300px;
    overflow-y: auto;Se1=prim'	Q$	"text-primary	i+

R#=&}
}

.demo-info {
  margin-top$.
sm;N'*!border-left: 4pxprimary;
  
1small
;	ody-small
;	ody-small.=ody-small, line-height)	 text-secondary;
  
  strong {
  	2"5Design)md<4+(  
  .demo-column {
    min-width: unset justify-content: center;
  }
}$0rxR͎0VZnUovb)U%NN$ǎliYp@*gH9 x 8p↓hoXf<eo^yegDR*(H''*
p$a6t`˝]g9v>~S~I^yu	\dw|\ka(3F&Bl`3.+)+3/\MT	(3Ĳ
С9E1R~if@"f*(MӘwy3ȦBNTjY0'CXntt-W]F60~1%@h ㅅΡL6[MZwgM<\зiH	뎆Zᜳ{qc)Y(ydQ3zZWN^}P˖HJiZnnKmXٗvS$xV'import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faHome, faSearch, faUser, faHeart, faCog, faShoppingCart, faBell, faBookmark } from '@fortawesome/free-solid-svg-icons';
import { BottomNavigationComponent, BottomNavigationItem } from '../../../../../ui-essentials/src/lib/components/navigation/bottom-navigation';

@Component({
  selector: 'ui-bottom-navigation-demo',
  standalone: true,
  imports: [CommonModule, BottomNavigationComponent, FontAwesomeModule],
  template: `
    <div class="demo-container">
      <h2>Bottom Navigation Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row demo-row--vertical">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <h4>{{ size.toUpperCase() }} Size</h4>
              <div class="demo-bottom-nav-container">
                <ui-bottom-navigation 
                  [size]="size" 
                  [items]="basicItems"
                  [activeItemId]="activeItemIds[size]"
                  (activeItemChanged)="handleActiveItemChange(size, $event)"
                  (itemClicked)="handleItemClick($event)">
                  
                  <fa-icon [icon]="faHome" data-icon="home"></fa-icon>
                  <fa-icon [icon]="faSearch" data-icon="search"></fa-icon>
                  <fa-icon [icon]="faUser" data-icon="profile"></fa-icon>
                  <fa-icon [icon]="faCog" data-icon="settings"></fa-icon>
                </ui-bottom-navigation>
              </div>
            </div>
          }
        </div>
      </section>
      
      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row demo-row--vertical">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <h4>{{ variant.charAt(0).toUpperCase() + variant.slice(1) }} Variant</h4>
              <div class="demo-bottom-nav-container">
                <ui-bottom-navigation 
                  [variant]="variant" 
                  [items]="basicItems"
                  [activeItemId]="activeItemIds[variant]"
                  (activeItemChanged)="handleActiveItemChange(variant, $event)"
                  (itemClicked)="handleItemClick($event)">
                  
                  <fa-icon [icon]="faHome" data-icon="home"></fa-icon>
                  <fa-icon [icon]="faSearch" data-icon="search"></fa-icon>
                  <fa-icon [icon]="faUser" data-icon="profile"></fa-icon>
                  <fa-icon [icon]="faCog" data-icon="settings"></fa-icon>
                </ui-bottom-navigation>
              </div>
            </div>
          }
        </div>
      </section>
      
      <!-- With Badges -->
      <section class="demo-section">
        <h3>With Badges</h3>
        <div class="demo-bottom-nav-container">
          <ui-bottom-navigation 
            [items]="itemsWithBadges"
            [activeItemId]="badgeActiveItemId"
            (activeItemChanged)="badgeActiveItemId = $event"
            (itemClicked)="handleItemClick($event)">
            
            <fa-icon [icon]="faHome" data-icon="home"></fa-icon>
            <fa-icon [icon]="faShoppingCart" data-icon="cart"></fa-icon>
            <fa-icon [icon]="faBell" data-icon="notifications"></fa-icon>
            <fa-icon [icon]="faBookmark" data-icon="saved"></fa-icon>
            <fa-icon [icon]="faUser" data-icon="profile"></fa-icon>
          </ui-bottom-navigation>
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row demo-row--vertical">
          <div class="demo-item">
            <h4>Elevated</h4>
            <div class="demo-bottom-nav-container">
              <ui-bottom-navigation 
                [items]="basicItems"
                [elevated]="true"
                [activeItemId]="elevatedActiveItemId"
                (activeItemChanged)="elevatedActiveItemId = $event"
                (itemClicked)="handleItemClick($event)">
                
                <fa-icon [icon]="faHome" data-icon="home"></fa-icon>
                <fa-icon [icon]="faSearch" data-icon="search"></fa-icon>
                <fa-icon [icon]="faUser" data-icon="profile"></fa-icon>
                <fa-icon [icon]="faCog" data-icon="settings"></fa-icon>
              </ui-bottom-navigation>
            </div>
          </div>
          
          <div class="demo-item">
            <h4>With Disabled Item</h4>
            <div class="demo-bottom-nav-container">
              <ui-bottom-navigation 
                [items]="itemsWithDisabled"
                [activeItemId]="disabledActiveItemId"
                (activeItemChanged)="disabledActiveItemId = $event"
                (itemClicked)="handleItemClick($event)">
                
                <fa-icon [icon]="faHome" data-icon="home"></fa-icon>
                <fa-icon [icon]="faSearch" data-icon="search"></fa-icon>
                <fa-icon [icon]="faUser" data-icon="profile"></fa-icon>
                <fa-icon [icon]="faCog" data-icon="settings"></fa-icon>
              </ui-bottom-navigation>
            </div>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <div class="demo-bottom-nav-container">
          <ui-bottom-navigation 
            [items]="interactiveItems"
            [activeItemId]="interactiveActiveItemId"
            (activeItemChanged)="handleInteractiveItemChange($event)"
            (itemClicked)="handleInteractiveItemClick($event)">
            
            <fa-icon [icon]="faHome" data-icon="home"></fa-icon>
            <fa-icon [icon]="faSearch" data-icon="search"></fa-icon>
            <fa-icon [icon]="faHeart" data-icon="favorites"></fa-icon>
            <fa-icon [icon]="faUser" data-icon="profile"></fa-icon>
          </ui-bottom-navigation>
        </div>
        
        <div class="demo-info">
          <p><strong>Active Item:</strong> {{ getActiveItemLabel() }}</p>
          <p><strong>Click Count:</strong> {{ clickCount }}</p>
          <p><strong>Last Clicked:</strong> {{ lastClickedItem || 'None' }}</p>
        </div>
        
        <div class="demo-controls">
          <button 
            class="demo-button" 
            (click)="toggleHidden()"
            [class.active]="isHidden">
            {{ isHidden ? 'Show' : 'Hide' }} Navigation
          </button>
          <button 
            class="demo-button" 
            (click)="incrementBadge()">
            Increment Heart Badge
          </button>
        </div>
      </section>
    </div>
  `,
  styleUrl: './bottom-navigation-demo.component.scss'
})
export class BottomNavigationDemoComponent {
  // FontAwesome icons
  faHome = faHome;
  faSearch = faSearch;
  faUser = faUser;
  faHeart = faHeart;
  faCog = faCog;
  faShoppingCart = faShoppingCart;
  faBell = faBell;
  faBookmark = faBookmark;
  
  // Demo data
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['default', 'primary', 'secondary'] as const;
  
  // Active item tracking for different variants
  activeItemIds: Record<string, string> = {
    sm: 'home',
    md: 'home',
    lg: 'home',
    default: 'home',
    primary: 'home',
    secondary: 'home'
  };
  
  badgeActiveItemId = 'home';
  elevatedActiveItemId = 'home';
  disabledActiveItemId = 'home';
  interactiveActiveItemId = 'home';
  
  // Interactive demo state
  clickCount = 0;
  lastClickedItem = '';
  isHidden = false;
  heartBadgeCount = 3;
  
  // Item configurations
  basicItems: BottomNavigationItem[] = [
    { id: 'home', label: 'Home', icon: 'home' },
    { id: 'search', label: 'Search', icon: 'search' },
    { id: 'profile', label: 'Profile', icon: 'profile' },
    { id: 'settings', label: 'Settings', icon: 'settings' }
  ];
  
  itemsWithBadges: BottomNavigationItem[] = [
    { id: 'home', label: 'Home', icon: 'home' },
    { id: 'cart', label: 'Cart', icon: 'cart', badge: 2 },
    { id: 'notifications', label: 'Alerts', icon: 'notifications', badge: '99+' },
    { id: 'saved', label: 'Saved', icon: 'saved', badge: 15 },
    { id: 'profile', label: 'Profile', icon: 'profile' }
  ];
  
  itemsWithDisabled: BottomNavigationItem[] = [
    { id: 'home', label: 'Home', icon: 'home' },
    { id: 'search', label: 'Search', icon: 'search', disabled: true },
    { id: 'profile', label: 'Profile', icon: 'profile' },
    { id: 'settings', label: 'Settings', icon: 'settings' }
  ];
  
  get interactiveItems(): BottomNavigationItem[] {
    return [
      { id: 'home', label: 'Home', icon: 'home' },
      { id: 'search', label: 'Search', icon: 'search' },
      { id: 'favorites', label: 'Favorites', icon: 'favorites', badge: this.heartBadgeCount > 0 ? this.heartBadgeCount : undefined },
      { id: 'profile', label: 'Profile', icon: 'profile' }
    ];
  }
  
  handleActiveItemChange(context: string, itemId: string): void {
    this.activeItemIds[context] = itemId;
  }
  
  handleItemClick(item: BottomNavigationItem): void {
    console.log('Item clicked:', item);
  }
  
  handleInteractiveItemChange(itemId: string): void {
    this.interactiveActiveItemId = itemId;
  }
  
  handleInteractiveItemClick(item: BottomNavigationItem): void {
    this.clickCount++;
    this.lastClickedItem = item.label;
    console.log('Interactive item clicked:', item);
  }
  
  getActiveItemLabel(): string {
    const activeItem = this.interactiveItems.find(item => item.id === this.interactiveActiveItemId);
    return activeItem?.label || 'None';
  }
  
  toggleHidden(): void {
    this.isHidden = !this.isHidden;
    // In a real implementation, you would update the hidden property of the navigation
    // For demo purposes, this just toggles a state variable
  }
  
  incrementBadge(): void {
    this.heartBadgeCount++;
  }
}űx>import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BoxComponent } from '../../../../../ui-essentials/src/lib/components/layout/box';

@Component({
  selector: 'ui-box-demo',
  standalone: true,
  imports: [CommonModule, BoxComponent],
  template: `
    <div class="demo-container">
      <h2>Box Component Demo</h2>
      
      <!-- Padding Examples -->
      <section class="demo-section">
        <h3>Padding Utilities</h3>
        <div class="demo-row">
          @for (spacing of spacings; track spacing) {
            <div class="demo-column">
              <h4>p="{{ spacing }}"</h4>
              <ui-box [p]="spacing" [border]="true" class="content-box">
                <div class="inner-content">Content with {{ spacing }} padding</div>
              </ui-box>
            </div>
          }
        </div>
      </section>
      
      <!-- Directional Padding -->
      <section class="demo-section">
        <h3>Directional Padding</h3>
        <div class="demo-row">
          <div class="demo-column">
            <h4>px="lg" (horizontal)</h4>
            <ui-box px="lg" [border]="true" class="content-box">
              <div class="inner-content">Horizontal padding</div>
            </ui-box>
          </div>
          
          <div class="demo-column">
            <h4>py="lg" (vertical)</h4>
            <ui-box py="lg" [border]="true" class="content-box">
              <div class="inner-content">Vertical padding</div>
            </ui-box>
          </div>
          
          <div class="demo-column">
            <h4>pt="xl" pb="sm"</h4>
            <ui-box pt="xl" pb="sm" [border]="true" class="content-box">
              <div class="inner-content">Mixed padding</div>
            </ui-box>
          </div>
        </div>
      </section>
      
      <!-- Margin Examples -->
      <section class="demo-section">
        <h3>Margin Utilities</h3>
        <div class="margin-demo-container">
          @for (spacing of marginSpacings; track spacing) {
            <ui-box [m]="spacing" [border]="true" [rounded]="true" class="margin-box">
              m="{{ spacing }}"
            </ui-box>
          }
        </div>
      </section>
      
      <!-- Display Variants -->
      <section class="demo-section">
        <h3>Display Options</h3>
        <div class="demo-column">
          <h4>display="flex"</h4>
          <ui-box display="flex" p="md" [border]="true" class="flex-demo">
            <div class="flex-item">Item 1</div>
            <div class="flex-item">Item 2</div>
            <div class="flex-item">Item 3</div>
          </ui-box>
          
          <h4>display="grid"</h4>
          <ui-box display="grid" p="md" [border]="true" class="grid-demo">
            <div class="grid-item">A</div>
            <div class="grid-item">B</div>
            <div class="grid-item">C</div>
            <div class="grid-item">D</div>
          </ui-box>
          
          <h4>display="inline-block"</h4>
          <div>
            <ui-box display="inline-block" p="sm" [border]="true" class="inline-demo">Box 1</ui-box>
            <ui-box display="inline-block" p="sm" [border]="true" class="inline-demo">Box 2</ui-box>
            <ui-box display="inline-block" p="sm" [border]="true" class="inline-demo">Box 3</ui-box>
          </div>
        </div>
      </section>
      
      <!-- Visual Styles -->
      <section class="demo-section">
        <h3>Visual Styles</h3>
        <div class="demo-row">
          <div class="demo-column">
            <h4>Basic</h4>
            <ui-box p="md">
              <div class="inner-content">Basic box</div>
            </ui-box>
          </div>
          
          <div class="demo-column">
            <h4>With Border</h4>
            <ui-box p="md" [border]="true">
              <div class="inner-content">Bordered box</div>
            </ui-box>
          </div>
          
          <div class="demo-column">
            <h4>Rounded</h4>
            <ui-box p="md" [border]="true" [rounded]="true">
              <div class="inner-content">Rounded box</div>
            </ui-box>
          </div>
          
          <div class="demo-column">
            <h4>With Shadow</h4>
            <ui-box p="md" [shadow]="true">
              <div class="inner-content">Shadow box</div>
            </ui-box>
          </div>
          
          <div class="demo-column">
            <h4>All Styles</h4>
            <ui-box p="lg" [border]="true" [rounded]="true" [shadow]="true">
              <div class="inner-content">Full styled</div>
            </ui-box>
          </div>
        </div>
      </section>
      
      <!-- Complex Layout Example -->
      <section class="demo-section">
        <h3>Complex Layout Example</h3>
        <ui-box p="lg" [border]="true" [rounded]="true" [shadow]="true">
          <ui-box mb="md">
            <h4 style="margin: 0;">Card Header</h4>
          </ui-box>
          
          <ui-box display="flex" mb="md">
            <ui-box pr="md" style="flex: 1;">
              <div class="inner-content">Left column content with some text that wraps nicely.</div>
            </ui-box>
            
            <ui-box pl="md" [border]="true" style="flex: 1;">
              <div class="inner-content">Right column with border and padding.</div>
            </ui-box>
          </ui-box>
          
          <ui-box pt="md" [border]="true" style="border-left: none; border-right: none; border-bottom: none;">
            <div class="inner-content">Footer with top border only</div>
          </ui-box>
        </ui-box>
      </section>
    </div>
  `,
  styleUrl: './box-demo.component.scss'
})
export class BoxDemoComponent {
  spacings = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
  marginSpacings = ['xs', 'sm', 'md', 'lg'] as const;
}Vx'import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BreakpointContainerComponent } from '../../../../../ui-essentials/src/lib/components/layout/breakpoint-container';

@Component({
  selector: 'ui-breakpoint-container-demo',
  standalone: true,
  imports: [CommonModule, BreakpointContainerComponent],
  template: `
    <div class="demo-container">
      <h2>Breakpoint Container Demo</h2>
      <p>This component shows/hides content based on screen size. Resize your browser to see the effects.</p>
      
      <!-- Basic Visibility Controls -->
      <section class="demo-section">
        <h3>Basic Visibility Controls</h3>
        
        <div class="demo-row">
          <div class="demo-card">
            <h4>Always Visible</h4>
            <ui-breakpoint-container visibility="always">
              <div class="demo-content demo-content--primary">
                Always visible content
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Mobile Only (< 768px)</h4>
            <ui-breakpoint-container visibility="mobile-only">
              <div class="demo-content demo-content--success">
                Only visible on mobile devices
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Tablet Only (768px - 1024px)</h4>
            <ui-breakpoint-container visibility="tablet-only">
              <div class="demo-content demo-content--warning">
                Only visible on tablets
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Desktop Only (≥ 1024px)</h4>
            <ui-breakpoint-container visibility="desktop-only">
              <div class="demo-content demo-content--info">
                Only visible on desktop
              </div>
            </ui-breakpoint-container>
          </div>
        </div>
      </section>
      
      <!-- Hidden Variants -->
      <section class="demo-section">
        <h3>Hidden Variants</h3>
        
        <div class="demo-row">
          <div class="demo-card">
            <h4>Mobile Hidden</h4>
            <ui-breakpoint-container visibility="mobile-hidden">
              <div class="demo-content demo-content--danger">
                Hidden on mobile (< 768px)
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Tablet Hidden</h4>
            <ui-breakpoint-container visibility="tablet-hidden">
              <div class="demo-content demo-content--secondary">
                Hidden on tablets (768px - 1024px)
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Desktop Hidden</h4>
            <ui-breakpoint-container visibility="desktop-hidden">
              <div class="demo-content demo-content--dark">
                Hidden on desktop (≥ 1024px)
              </div>
            </ui-breakpoint-container>
          </div>
        </div>
      </section>
      
      <!-- Screen Size Based -->
      <section class="demo-section">
        <h3>Screen Size Based</h3>
        
        <div class="demo-row">
          <div class="demo-card">
            <h4>Mobile Screen (< 640px)</h4>
            <ui-breakpoint-container visibility="mobile-screen">
              <div class="demo-content demo-content--success">
                Mobile screen size only
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Tablet Screen (640px - 1024px)</h4>
            <ui-breakpoint-container visibility="tablet-screen">
              <div class="demo-content demo-content--warning">
                Tablet screen size only
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Desktop Screen (≥ 1024px)</h4>
            <ui-breakpoint-container visibility="desktop-screen">
              <div class="demo-content demo-content--info">
                Desktop screen size only
              </div>
            </ui-breakpoint-container>
          </div>
        </div>
      </section>
      
      <!-- Range Based -->
      <section class="demo-section">
        <h3>Range Based Visibility</h3>
        
        <div class="demo-row">
          <div class="demo-card">
            <h4>Small to Medium (640px - 768px)</h4>
            <ui-breakpoint-container visibility="sm-to-md">
              <div class="demo-content demo-content--primary">
                Visible between small and medium breakpoints
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Medium to Large (768px - 1024px)</h4>
            <ui-breakpoint-container visibility="md-to-lg">
              <div class="demo-content demo-content--secondary">
                Visible between medium and large breakpoints
              </div>
            </ui-breakpoint-container>
          </div>
        </div>
      </section>
      
      <!-- Custom Breakpoint Rules -->
      <section class="demo-section">
        <h3>Custom Breakpoint Rules</h3>
        
        <div class="demo-row">
          <div class="demo-card">
            <h4>Show from Small (≥ 640px)</h4>
            <ui-breakpoint-container [showSm]="true">
              <div class="demo-content demo-content--success">
                Visible from small breakpoint and up
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Hide from Medium (≥ 768px)</h4>
            <ui-breakpoint-container [hideMd]="true">
              <div class="demo-content demo-content--danger">
                Hidden from medium breakpoint and up
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Show from Large (≥ 1024px)</h4>
            <ui-breakpoint-container [showLg]="true">
              <div class="demo-content demo-content--info">
                Visible from large breakpoint and up
              </div>
            </ui-breakpoint-container>
          </div>
        </div>
      </section>
      
      <!-- Display Types -->
      <section class="demo-section">
        <h3>Display Types</h3>
        
        <div class="demo-row">
          <div class="demo-card">
            <h4>Block Display (Default)</h4>
            <ui-breakpoint-container displayType="block" visibility="always">
              <div class="demo-content demo-content--primary">
                Block display (default)
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Inline Display</h4>
            <p>
              This is inline text with 
              <ui-breakpoint-container displayType="inline" visibility="desktop-only">
                <span class="demo-content demo-content--inline">desktop-only inline content</span>
              </ui-breakpoint-container>
              continuing after.
            </p>
          </div>
          
          <div class="demo-card">
            <h4>Flex Display</h4>
            <ui-breakpoint-container displayType="flex" visibility="always">
              <div class="demo-content demo-content--success" style="flex: 1; margin-right: 8px;">
                Flex Item 1
              </div>
              <div class="demo-content demo-content--warning" style="flex: 1;">
                Flex Item 2
              </div>
            </ui-breakpoint-container>
          </div>
        </div>
      </section>
      
      <!-- Print Media -->
      <section class="demo-section">
        <h3>Print Media</h3>
        
        <div class="demo-row">
          <div class="demo-card">
            <h4>Print Hidden</h4>
            <ui-breakpoint-container [printHidden]="true">
              <div class="demo-content demo-content--secondary">
                This content is hidden when printing
              </div>
            </ui-breakpoint-container>
          </div>
          
          <div class="demo-card">
            <h4>Print Only</h4>
            <ui-breakpoint-container [printOnly]="true">
              <div class="demo-content demo-content--dark">
                This content only appears when printing
              </div>
            </ui-breakpoint-container>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Test</h3>
        <p>Current viewport info: Resize your browser window to test different breakpoints.</p>
        
        <div class="viewport-info">
          <ui-breakpoint-container visibility="mobile-screen">
            <div class="demo-content demo-content--success">
              📱 Mobile Screen (< 640px)
            </div>
          </ui-breakpoint-container>
          
          <ui-breakpoint-container visibility="tablet-screen">
            <div class="demo-content demo-content--warning">
              📟 Tablet Screen (640px - 1024px)
            </div>
          </ui-breakpoint-container>
          
          <ui-breakpoint-container visibility="desktop-screen">
            <div class="demo-content demo-content--info">
              🖥️ Desktop Screen (≥ 1024px)
            </div>
          </ui-breakpoint-container>
        </div>
        
        <p><strong>Test Instructions:</strong></p>
        <ul>
          <li>Resize your browser window to see different content appear/disappear</li>
          <li>Try the print preview to see print-specific content</li>
          <li>Different display types maintain their layout characteristics</li>
        </ul>
      </section>
    </div>
  `,
  styleUrl: './breakpoint-container-demo.component.scss'
})
export class BreakpointContainerDemoComponent {},>x]nimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CardComponent, GlassVariant } from '../../../../../ui-essentials/src/lib/components/data-display/card/card.component';
import { ButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons/button.component';

@Component({
  selector: 'ui-card-demo',
  standalone: true,
  imports: [
    CommonModule,
    CardComponent,
    ButtonComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Card Component Showcase</h2>
      
      <!-- Basic Card Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Card Variants</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem; margin-bottom: 2rem;">
          <ui-card variant="elevated" size="md" elevation="sm" radius="md">
            <div slot="header">
              <h4>Elevated Card</h4>
              <p>Default elevated card with shadow</p>
            </div>
            <p>This is the most common card variant with a subtle elevation that lifts it above the surface.</p>
            <div slot="footer">
              <ui-button variant="filled" size="small" (clicked)="handleClick('elevated')">Action</ui-button>
            </div>
          </ui-card>
          
          <ui-card variant="filled" size="md" elevation="none" radius="md">
            <div slot="header">
              <h4>Filled Card</h4>
              <p>Card with background color</p>
            </div>
            <p>Filled cards use background color to separate content from the surrounding surface.</p>
            <div slot="footer">
              <ui-button variant="tonal" size="small" (clicked)="handleClick('filled')">Action</ui-button>
            </div>
          </ui-card>
          
          <ui-card variant="outlined" size="md" elevation="none" radius="md">
            <div slot="header">
              <h4>Outlined Card</h4>
              <p>Card with border emphasis</p>
            </div>
            <p>Outlined cards use borders to separate content while maintaining a clean appearance.</p>
            <div slot="footer">
              <ui-button variant="outlined" size="small" (clicked)="handleClick('outlined')">Action</ui-button>
            </div>
          </ui-card>
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem; margin-bottom: 2rem;">
          <ui-card variant="elevated" size="sm" elevation="sm" radius="md">
            <div slot="header">
              <h5>Small Card</h5>
            </div>
            <p>Compact card for minimal content.</p>
            <div slot="footer">
              <ui-button variant="filled" size="small" (clicked)="handleClick('small')">Small</ui-button>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="sm" radius="md">
            <div slot="header">
              <h4>Medium Card</h4>
            </div>
            <p>Standard card size for most use cases with balanced spacing.</p>
            <div slot="footer">
              <ui-button variant="filled" size="medium" (clicked)="handleClick('medium')">Medium</ui-button>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="lg" elevation="sm" radius="md">
            <div slot="header">
              <h3>Large Card</h3>
            </div>
            <p>Spacious card for detailed content with generous padding and larger typography.</p>
            <div slot="footer">
              <ui-button variant="filled" size="large" (clicked)="handleClick('large')">Large</ui-button>
            </div>
          </ui-card>
        </div>
      </section>

      <!-- Elevation Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Elevation Variants</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1.5rem; margin-bottom: 2rem;">
          <ui-card variant="elevated" size="md" elevation="none" radius="md">
            <div style="text-align: center; padding: 1rem;">
              <h5>None</h5>
              <p>No shadow</p>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="sm" radius="md">
            <div style="text-align: center; padding: 1rem;">
              <h5>Small</h5>
              <p>Subtle shadow</p>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="md" radius="md">
            <div style="text-align: center; padding: 1rem;">
              <h5>Medium</h5>
              <p>Moderate shadow</p>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="lg" radius="md">
            <div style="text-align: center; padding: 1rem;">
              <h5>Large</h5>
              <p>Prominent shadow</p>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="xl" radius="md">
            <div style="text-align: center; padding: 1rem;">
              <h5>Extra Large</h5>
              <p>Deep shadow</p>
            </div>
          </ui-card>
        </div>
      </section>

      <!-- Radius Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Corner Radius Variants</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1.5rem; margin-bottom: 2rem;">
          <ui-card variant="elevated" size="md" elevation="sm" radius="none">
            <div style="text-align: center; padding: 1rem;">
              <h5>No Radius</h5>
              <p>Sharp corners</p>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="sm" radius="sm">
            <div style="text-align: center; padding: 1rem;">
              <h5>Small</h5>
              <p>Subtle rounding</p>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="sm" radius="md">
            <div style="text-align: center; padding: 1rem;">
              <h5>Medium</h5>
              <p>Standard rounding</p>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="sm" radius="lg">
            <div style="text-align: center; padding: 1rem;">
              <h5>Large</h5>
              <p>Generous rounding</p>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="sm" elevation="sm" radius="full">
            <div style="text-align: center; padding: 0.5rem; aspect-ratio: 1; display: flex; align-items: center; justify-content: center;">
              <div>
                <h6 style="margin: 0; font-size: 0.75rem;">Full</h6>
                <p style="margin: 0; font-size: 0.625rem;">Circle</p>
              </div>
            </div>
          </ui-card>
        </div>
      </section>

      <!-- Interactive States -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive States</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem; margin-bottom: 2rem;">
          <ui-card variant="elevated" size="md" elevation="sm" radius="md" [clickable]="true" (cardClick)="handleCardClick('clickable')">
            <div slot="header">
              <h4>Clickable Card</h4>
              <p>Click me!</p>
            </div>
            <p>This card responds to clicks and has hover effects. Try clicking or focusing with keyboard.</p>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="sm" radius="md" [disabled]="true">
            <div slot="header">
              <h4>Disabled Card</h4>
              <p>Cannot interact</p>
            </div>
            <p>This card is disabled and cannot be interacted with.</p>
            <div slot="footer">
              <ui-button variant="filled" size="small" [disabled]="true">Disabled</ui-button>
            </div>
          </ui-card>
        </div>
      </section>

      <!-- Glass Effect Variants -->
      <section style="margin-bottom: 3rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 2rem; border-radius: 1rem;">
        <h3 style="color: white; margin-bottom: 2rem;">Glass Effect Variants</h3>
        <p style="color: rgba(255,255,255,0.9); margin-bottom: 2rem;">
          Glass morphism effects using semantic design tokens from the shared-ui library. 
          Each variant offers different levels of transparency and blur effects.
        </p>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5rem; margin-bottom: 2rem;">
          <ui-card variant="elevated" size="md" elevation="md" radius="md" [glass]="true" glassVariant="translucent">
            <div slot="header">
              <h4 style="color: white;">Translucent Glass</h4>
              <p style="color: rgba(255,255,255,0.8);">Ultra-light transparency</p>
            </div>
            <p style="color: rgba(255,255,255,0.9);">
              Barely visible background with subtle blur effect for minimal visual interference. 
              Perfect for overlays that need to preserve background visibility.
            </p>
            <div slot="footer">
              <ui-button variant="outlined" size="small" style="border-color: white; color: white;" (clicked)="handleClick('glass-translucent')">Translucent</ui-button>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="md" radius="md" [glass]="true" glassVariant="light">
            <div slot="header">
              <h4 style="color: white;">Light Glass</h4>
              <p style="color: rgba(255,255,255,0.8);">Gentle transparency</p>
            </div>
            <p style="color: rgba(255,255,255,0.9);">
              Gentle glass effect that maintains excellent readability while adding modern depth. 
              Ideal for cards that need subtle separation from background.
            </p>
            <div slot="footer">
              <ui-button variant="outlined" size="small" style="border-color: white; color: white;" (clicked)="handleClick('glass-light')">Light</ui-button>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="md" radius="md" [glass]="true" glassVariant="medium">
            <div slot="header">
              <h4 style="color: white;">Medium Glass</h4>
              <p style="color: rgba(255,255,255,0.8);">Balanced effect</p>
            </div>
            <p style="color: rgba(255,255,255,0.9);">
              Perfect balance between visibility and glass morphism effect. 
              The most versatile variant suitable for most interface components.
            </p>
            <div slot="footer">
              <ui-button variant="outlined" size="small" style="border-color: white; color: white;" (clicked)="handleClick('glass-medium')">Medium</ui-button>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="md" radius="md" [glass]="true" glassVariant="heavy">
            <div slot="header">
              <h4 style="color: white;">Heavy Glass</h4>
              <p style="color: rgba(255,255,255,0.8);">Strong presence</p>
            </div>
            <p style="color: rgba(255,255,255,0.9);">
              Prominent glass effect with substantial background presence. 
              Great for important UI elements that need to stand out prominently.
            </p>
            <div slot="footer">
              <ui-button variant="outlined" size="small" style="border-color: white; color: white;" (clicked)="handleClick('glass-heavy')">Heavy</ui-button>
            </div>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="lg" radius="lg" [glass]="true" glassVariant="frosted">
            <div slot="header">
              <h4 style="color: white;">Frosted Glass</h4>
              <p style="color: rgba(255,255,255,0.8);">Maximum opacity with enhanced blur</p>
            </div>
            <p style="color: rgba(255,255,255,0.9);">
              Nearly opaque with enhanced blur for a true frosted glass appearance. 
              Perfect for modals, overlays, and primary interface panels.
            </p>
            <div slot="footer">
              <ui-button variant="outlined" size="small" style="border-color: white; color: white;" (clicked)="handleClick('glass-frosted')">Frosted</ui-button>
            </div>
          </ui-card>
        </div>
        
        <h4 style="color: white; margin-bottom: 1rem;">Interactive Glass Cards</h4>
        <p style="color: rgba(255,255,255,0.8); margin-bottom: 1.5rem;">
          Glass effects with full interactivity, smooth animations, and hover states.
        </p>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
          <ui-card variant="elevated" size="md" elevation="lg" radius="lg" [glass]="true" glassVariant="light" [clickable]="true" (cardClick)="handleCardClick('glass-interactive-light')">
            <div slot="header">
              <h4 style="color: white;">Clickable Light Glass</h4>
              <p style="color: rgba(255,255,255,0.8);">Interactive with smooth animations</p>
            </div>
            <p style="color: rgba(255,255,255,0.9);">
              Click me! Light glass variant with full interactivity and animation support. 
              Features hover effects and touch feedback.
            </p>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="lg" radius="lg" [glass]="true" glassVariant="heavy" [clickable]="true" (cardClick)="handleCardClick('glass-interactive-heavy')">
            <div slot="header">
              <h4 style="color: white;">Clickable Heavy Glass</h4>
              <p style="color: rgba(255,255,255,0.8);">Strong glass with responsive feedback</p>
            </div>
            <p style="color: rgba(255,255,255,0.9);">
              Heavy glass variant combining strong visual presence with responsive interactions. 
              Perfect for call-to-action cards and important interactive elements.
            </p>
          </ui-card>
          
          <ui-card variant="elevated" size="md" elevation="lg" radius="lg" [glass]="true" glassVariant="medium" [clickable]="true" (cardClick)="handleCardClick('glass-interactive-medium')">
            <div slot="header">
              <h4 style="color: white;">Balanced Interactive Glass</h4>
              <p style="color: rgba(255,255,255,0.8);">Medium glass with keyboard navigation</p>
            </div>
            <p style="color: rgba(255,255,255,0.9);">
              Medium glass effect with complete accessibility support including keyboard navigation, 
              focus states, and screen reader compatibility.
            </p>
          </ui-card>
        </div>
        
        <h4 style="color: white; margin-bottom: 1rem; margin-top: 2rem;">Glass Implementation Details</h4>
        <div style="background: rgba(0,0,0,0.2); padding: 1.5rem; border-radius: 8px; border: 1px solid rgba(255,255,255,0.1);">
          <p style="color: rgba(255,255,255,0.9); margin-bottom: 1rem;">
            <strong>Enhanced Glass System:</strong> All glass effects now use semantic design tokens from the shared-ui library,
            ensuring consistent theming, better performance, and improved browser compatibility.
          </p>
          <ul style="color: rgba(255,255,255,0.8); line-height: 1.6;">
            <li><strong>Semantic Tokens:</strong> Uses <code>&#64;include glass-{{ '{' }}variant{{ '}' }}(true)</code> mixins</li>
            <li><strong>Animation Support:</strong> Built-in smooth transitions and hover effects</li>
            <li><strong>Accessibility:</strong> Proper focus states and keyboard navigation</li>
            <li><strong>Browser Support:</strong> Automatic fallbacks for older browsers</li>
            <li><strong>Performance:</strong> Optimized with <code>will-change</code> and <code>isolation</code></li>
          </ul>
        </div>
      </section>

      <!-- Background Layer Cards -->
      <section style="margin-bottom: 3rem;">
        <h3>Background Layer Cards</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem; margin-bottom: 2rem;">
          <ui-card 
            variant="elevated" 
            size="md" 
            elevation="md" 
            radius="lg" 
            [hasBackgroundLayer]="true"
            [hasHeader]="true"
            [hasFooter]="true">
            <div slot="background" style="
              background: linear-gradient(45deg, #ff6b6b, #feca57);
              width: 100%;
              height: 100%;
            "></div>
            <div slot="header">
              <h4 style="color: white; text-shadow: 0 1px 3px rgba(0,0,0,0.3);">Gradient Background</h4>
              <p style="color: rgba(255,255,255,0.9);">Beautiful gradient overlay</p>
            </div>
            <p style="color: rgba(255,255,255,0.95);">This card has a gradient background layer that creates visual depth and interest.</p>
            <div slot="footer">
              <ui-button variant="outlined" size="small" style="border-color: white; color: white;" (clicked)="handleClick('gradient')">Action</ui-button>
            </div>
          </ui-card>
          
          <ui-card 
            variant="elevated" 
            size="md" 
            elevation="md" 
            radius="lg" 
            [hasBackgroundLayer]="true"
            [hasHeader]="true"
            [clickable]="true"
            (cardClick)="handleCardClick('pattern')">
            <div slot="background" style="
              background-image: radial-gradient(circle at 25% 25%, #ff9a9e 0%, transparent 50%),
                                radial-gradient(circle at 75% 75%, #fecfef 0%, transparent 50%),
                                radial-gradient(circle at 50% 50%, #ffecd2 0%, transparent 50%);
              background-size: 150px 150px, 100px 100px, 200px 200px;
              background-position: 0 0, 50px 50px, 100px 100px;
              width: 100%;
              height: 100%;
            "></div>
            <div slot="header">
              <h4>Pattern Background</h4>
              <p>Custom pattern design</p>
            </div>
            <p>Click me! Cards can have complex patterns and remain fully interactive with proper layering.</p>
          </ui-card>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Card:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-card variant="elevated" size="md" elevation="sm" radius="md"&gt;
  &lt;div slot="header"&gt;
    &lt;h4&gt;Card Title&lt;/h4&gt;
    &lt;p&gt;Card subtitle&lt;/p&gt;
  &lt;/div&gt;
  &lt;p&gt;Card content goes here&lt;/p&gt;
  &lt;div slot="footer"&gt;
    &lt;ui-button variant="filled"&gt;Action&lt;/ui-button&gt;
  &lt;/div&gt;
&lt;/ui-card&gt;</code></pre>

          <h4>Interactive Card:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-card 
  variant="elevated" 
  [clickable]="true"
  (cardClick)="handleCardClick($event)"&gt;
  &lt;p&gt;Click me!&lt;/p&gt;
&lt;/ui-card&gt;</code></pre>

          <h4>Glass Effect Card:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-card 
  variant="elevated" 
  [glass]="true"
  glassVariant="medium"
  elevation="md"
  radius="lg"&gt;
  &lt;p&gt;Glass morphism effect with semantic tokens&lt;/p&gt;
&lt;/ui-card&gt;</code></pre>

          <h4>Glass Variant Examples:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;!-- All glass variants using semantic design tokens --&gt;
&lt;ui-card [glass]="true" glassVariant="translucent"&gt;Ultra-light transparency&lt;/ui-card&gt;
&lt;ui-card [glass]="true" glassVariant="light"&gt;Gentle glass effect&lt;/ui-card&gt;
&lt;ui-card [glass]="true" glassVariant="medium"&gt;Balanced glass morphism&lt;/ui-card&gt;
&lt;ui-card [glass]="true" glassVariant="heavy"&gt;Strong visual presence&lt;/ui-card&gt;
&lt;ui-card [glass]="true" glassVariant="frosted"&gt;Maximum opacity with blur&lt;/ui-card&gt;</code></pre>

          <h4>Interactive Glass Card:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-card 
  variant="elevated" 
  [glass]="true"
  glassVariant="light"
  [clickable]="true"
  (cardClick)="handleCardClick($event)"
  elevation="lg"
  radius="lg"&gt;
  &lt;p&gt;Clickable glass card with animations&lt;/p&gt;
&lt;/ui-card&gt;</code></pre>

          <h4>Background Layer Card:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-card 
  variant="elevated" 
  [hasBackgroundLayer]="true"
  [hasHeader]="true"&gt;
  &lt;div slot="background"&gt;
    &lt;!-- Background content --&gt;
  &lt;/div&gt;
  &lt;div slot="header"&gt;
    &lt;h4&gt;Card with Background&lt;/h4&gt;
  &lt;/div&gt;
  &lt;p&gt;Content over background&lt;/p&gt;
&lt;/ui-card&gt;</code></pre>
        </div>
      </section>

      <!-- Interactive Example -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Actions</h3>
        @if (lastAction) {
          <div style="margin-bottom: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last action:</strong> {{ lastAction }}
          </div>
        }
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 2rem;">
          <ui-button variant="filled" (clicked)="resetDemo()">Reset Demo</ui-button>
          <ui-button variant="tonal" (clicked)="showAlert('Card showcase complete!')">Show Alert</ui-button>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }
  `]
})
export class CardDemoComponent {
  lastAction: string = '';

  handleClick(buttonType: string): void {
    this.lastAction = `Button clicked: ${buttonType}`;
    console.log(`Button clicked: ${buttonType}`);
  }

  handleCardClick(cardType: string): void {
    this.lastAction = `Card clicked: ${cardType}`;
    console.log(`Card clicked: ${cardType}`);
  }

  showAlert(message: string): void {
    alert(message);
    this.lastAction = 'Alert shown';
  }

  resetDemo(): void {
    this.lastAction = '';
    console.log('Demo reset');
  }
},wx`}cimport { TextP&text-button.component';
import { GhostP%ghost-button.component';
import { FabJfab.component';
import { SimplePsimple-button.component';
import { 
  faDownload, 
  faPlus, 
  faShare, 
  faHeart, 
  faBookmark, 
  faEdit, 
  faTrash, 
  ffaSave,
  faArrowRight,
  faArrowLeft,
  faSearch,
  faUpload
} from '@fortawesome/free-solid-svg-icons]!button?aButtonComponent,
    TextButtonComponent, 
    GhostButtonComponent,
    FabComponent,
    SimpleButtonY+Filled ButtIFilled Button$PW3VW+P=$ filled H& filledn!2 filled0IPW3VW+P=3t [loading]="true">LoadingW+[fullWidth]="false">Full WidthW $
Tonal ButtITonal Button$PW3VW+P=,
small tona!tonal@. tonaln!tonal, tonal0IPW3gap: 1rem; flex-wrap: wrap;">
tonal1t tonal" [loading]="true">LoadingW $Outlined ButtIOutlined Button$PW3VW+P=?small outlined $H&	 outlinedn!$$	 outlined0IPW3gap: 1rem; flex-wrap: wrap;">
(3t [loading]="true">LoadingW $Text Button 00AText Button$PW3VW+P=text-button&small text')">Small</ui-textE<ui-text-buttonA- text')">Medium</ui-textE<ui-text-button+  text')">Large</ui-text-button>
APW37gap: 1rem; flex-wrap: wrap;">
          <ui-text-buttona  textE8<ui-text-button [loading]="true">Loading</ui-text-button /host Button 00AGhost Button$PW3VW+P=ghost-button&small ghost')">Small</ui-ghostE<ui-ghost-buttonA- ghost')">Medium</ui-ghostE<ui-ghost-button+" ghost')">Large</ui-ghost-button>
APW38gap: 1rem; flex-wrap: wrap;">
          <ui-ghost-buttona  ghostE3<ui-ghost-button [loading]="true">Loading</ui-ghostE@<ui-ghost-button [fullWidth]="false">Full Width</ui-ghost-button .FAB Compone 20AEFloating Action Buttons (FAB)</h3>
        
        <!-- FAB Sizes --Vh4>Sizes</h4>
  	PW3gap: 2rem; flex-wrap: wrap;..3fab variant="primary" size="small" position="staticsmall fab')">+</ui-fabp*)font-size: 12px; margin: 0.5rem 0;">SmallA%.4fab variant="primary" size="medium" position="staticmedium fab')">+</ui-fabp**font-size: 12px; margin: 0.5rem 0;">MediumA%.3fab variant="primary" size="large" position="static fab')">✨</ui-fabp*)font-size: 12px; margin: 0.5rem 0;">LargeA$$</div>

        <!-- FAB	Vh4>Variants</h4>
  	PW3gap: 2rem; flex-wrap: wrap;..4fab variant="primary" size="medium" position="staticprimary fab')">📧</ui-fabp*+font-size: 12px; margin: 0.5rem 0;">PrimaryA%.6fab variant="secondary" size="medium" position="staticsecondary fab')">📞</ui-fabp*-font-size: 12px; margin: 0.5rem 0;">SecondaryA%.5fab variant="tertiary" size="medium" position="statictertiary fab')">💬</ui-fabp*,font-size: 12px; margin: 0.5rem 0;">TertiaryA$$"</div>

        <!-- FAB States --Vh4>States</h4>
  	PW3gap: 2rem; flex-wrap: wrap;..Bfab variant="primary" size="medium" position="static" [pulse]="trupulse fab')">🔔</ui-fabp*)font-size: 12px; margin: 0.5rem 0;">PulseA%.4fab variant="primary" size="medium" position="static1⚙️</ui-fabp*,font-size: 12px; margin: 0.5rem 0;">DisabledA%.Sfab variant="primary" size="medium" position="static" [loading]="true">📤</ui-fabp*+font-size: 12px; margin: 0.5rem 0;">LoadingA%.Jfab variant="primary" size="medium" position="static" [expandOnClick]="truexpand fab')">✨</ui-fabp**font-size: 12px; margin: 0.5rem 0;">ExpandA$$ $Buttons with Icon 00A:uttons with Icons</h3>
        
        <!-- Left Icons --Vh4>Icons on Left</h4>
  	PW3VW+P=.E&[icon]="faDownload" iconPosition="leftdownload')">DownloadW+E"[icon]="faPlus" iconPosition="leftadd new')">Add NewW+E$[icon]="faUpload" iconPosition="leftupload')">UploadW$	PW3VW+P=.E)tonal" [icon]="faEdit" iconPosition="leftedit')">EditW+E*tonal" [icon]="faShare" iconPosition="leftshare')">ShareW+E)tonal" [icon]="faSave" iconPosition="leftsave')">SaveW$	PW3gap: 1rem; flex-wrap: wrap;">
!E*&[icon]="faBookmark" iconPosition="leftbookmark')">BookmarkW+E #[icon]="faHeart" iconPosition="leftfavorite')">FavoriteW+E $[icon]="faSearch" iconPosition="leftsearch')">SearchW$#</div>

        <!-- Right Icons --Vh4>Icons on Right</h4>
  	PW3VW+P=.E)[icon]="faArrowRight" iconPosition="rightnext')">NextW+E)[icon]="faArrowRight" iconPosition="rightcontinue')">ContinueW+E)[icon]="faArrowRight" iconPosition="rightproceed')">ProceedW$	PW3VW+P=.E/tonal" [icon]="faArrowLeft" iconPosition="rightback')">BackW+E $[icon]="faTrash" iconPosition="rightdelete')">DeleteW$0</div>

        <!-- Size Variants with Icons --V%h4>Different Sizes with Icons</h4>
  	PW3gap: 1rem; flex-wrap: wrap;">
!E )small" [icon]="faPlus" iconPosition="left
small icon#.E*medium" [icon]="faPlus" iconPosition="leftmedium iconn$.E"[icon]="faPlus" iconPosition="left icon0 $'</div>

        <!-- Icon-only Style --V!h4>Icon with Minimal Text</h4>
  	PW3gap: 1rem; flex-wrap: wrap;">
!E &[icon]="faDownload" iconPosition="leftdl')">DLW+E)tonal" [icon]="faEdit" iconPosition="leftedit short')">EditW+E $[icon]="faTrash" iconPosition="right
del')">DelW$ $bJButtonpNr-button 
  variant="filled" 
  size="medium"
 N'Click Me
&lt;/ui-button&gt;</code></preEh4>Text ButtonpNrItext-button 
  size="large" 
  [disabled]="false"
  (clicked)="handleTextNText Action
&lt;/ui-text-button@R!Button with IconpNrbutton 
  variant="filled"
  [icon]="faDownload"
  iconPosition="left"
  (clicked)="downloadFile()"&gt;
  Download
&lt;/ui-button@R!FAB with PositionpNrfab 
  variant="primary"
  size="medium"
  position="bottom-right"
  [pulse]="true"
  (clicked)="openDialog()"&gt;
  +
&lt;/ui-fabU>UI Essentials Compone 20AUI Essentials Library Compone&PW1P=simple-button variant="primary+ui-essentials primary')">Primary</ui-simpleE$<ui-simple-button variant="secondary/ui-essentials secondary')">Secondary</ui-simpleE"<ui-simple-button variant="primary1Disabled</ui-simple-button .kUfPW!">
WXSuccess/X$WCtoggleLoading()">{{ isLoading ? 'Stop Loading' : 'Start Loading' }}Wtext-buttonW(text-button>
A
        @if (lastClickedButtrV#topV[*clicked:</strong> {{ lastClickedButton }}
$} Fixed FAB Demo -->
      <ui-fab 
        variant="primary" 
        size="medium" 
        position="bottom-right" 
        [pUulse]="shouldPulse"
        (clicked)="handleFabClick()">
        💡
      </ui-fabiXButtonDemoComponent {
  lastClickedButton: string = '';
  isLoading: boolean = false;
  shouldPulse: boolean = true;

  // Font Awesome icons
  faDownload = faDownload;
  faPlus = faPlus;
  faShare = faShare;
  faHeart = faHeart;
  faBookmark = faBookmark;
  faEdit = faEdit;
  faTrash = faTrash;
  faSave = faSave;
  faArrowRight = faArrowRight;
  faArrowLeft = faArrowLeft;
  faS'earch = faSearch;
  faUpload = faUpload[:.ClickedButton = buttonType;
    console.log(`C*\ \@handleClick('Alert button');
  }

  toggleLoading(): void {
    this.isLoading = !this.isLoading;
    this.handleClick(`Loading5 toggle - ${this.isLoading ? 'started' : 'stopped'}`)6]*KClickedButton = '';
    this.isLoading = false;
    this.shouldPulse = truek]%
  handleFabClick(): void {
    this.shouldPulse = !this.shouldPulse;
    this.handleClick(`FAB - Pulse ${this.shouldPulse ? 'enabled' : 'disabled'}`);
  }
};Ox.	&~h IWx ZI@À+X5~ǫn$ʖ.x  $/V7rX]W;<x@import "../../../../../shared-ui/src/styles/semantic";

.carousel-demo {
  padding: $semantic-spacing-layout-lg;
  
  .demo-section {
    margin-bottom: $semantic-spacing-section-md;
    
    &:last-child {
      margin-bottom: 0;
    }
  }
  
  .section-title {
    font-size: $semantic-typography-font-size-xl;
    font-weight: $semantic-typography-font-weight-semibold;
    line-height: $semantic-typography-line-height-normal;
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-content-paragraph;
  }
  
  .section-description {
    font-size: $semantic-typography-font-size-md;
    font-weight: $semantic-typography-font-weight-normal;
    line-height: $semantic-typography-line-height-relaxed;
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-content-paragraph;
  }
  
  .carousel-container {
    margin-bottom: $semantic-spacing-layout-lg;
  }
  
  .features-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: $semantic-spacing-content-paragraph;
    margin-top: $semantic-spacing-layout-lg;
  }
  
  .feature-card {
    background: $semantic-color-surface-container;
    border-radius: 12px;
    padding: $semantic-spacing-content-paragraph;
    border: 1px solid $semantic-color-border-primary;
    
    .feature-title {
      font-size: $semantic-typography-font-size-md;
      font-weight: $semantic-typography-font-weight-semibold;
      line-height: $semantic-typography-line-height-normal;
      color: $semantic-color-text-primary;
      margin-bottom: $semantic-spacing-component-sm;
    }
    
    .feature-description {
      font-size: $semantic-typography-font-size-sm;
      font-weight: $semantic-typography-font-weight-normal;
      line-height: $semantic-typography-line-height-normal;
      color: $semantic-color-text-secondary;
      margin-bottom: $semantic-spacing-component-md;
    }
    
    .feature-example {
      background: $semantic-color-surface-variant;
      border-radius: 8px;
      padding: $semantic-spacing-component-md;
      border: 1px solid $semantic-color-border-secondary;
      
      .example-label {
        font-size: $semantic-typography-font-size-xs;
        font-weight: $semantic-typography-font-weight-normal;
        line-height: $semantic-typography-line-height-normal;
        color: $semantic-color-text-tertiary;
        margin-bottom: $semantic-spacing-component-xs;
        text-transform: uppercase;
        letter-spacing: 0.5px;
      }
      
      .example-content {
        font-size: $semantic-typography-font-size-sm;
      font-weight: $semantic-typography-font-weight-normal;
      line-height: $semantic-typography-line-height-normal;
        color: $semantic-color-text-secondary;
      }
    }
  }
  
  .code-snippet {
    background: $semantic-color-surface-container;
    border: 1px solid $semantic-color-border-primary;
    border-radius: 8px;
    padding: $semantic-spacing-content-paragraph;
    margin-top: $semantic-spacing-content-paragraph;
    font-family: 'Roboto Mono', monospace;
    font-size: 0.875rem;
    line-height: 1.4;
    color: $semantic-color-text-primary;
    overflow-x: auto;
  }
}

s$:Bx$@use '	,!/index' as *;

.demo-container {
0md;
  max-width: 1200px;
  margin: 0 auto;

  h2W5+font-size: $base 2xlabasebold;
  }
}

.demo-section {
\*	xl;

  h3W/md/font-size: $base lgabaselborder-bottom&$ubtle;
    padding2line-normal;
  }
}

.demo-grid {
  display: grid;
Agapkmd;
  align-items: start;

  ui-empty-state {
    width: 100%;
    height: auto;
  }
}

.demo-label {
  margin: $semantic-spaci;line-normal 0 0 0;
  text-align: center;
  font-size: $base  )font-weight: $basemedium;
	*letter-spacing: 0.05em;
}

.demo-output {
(	heading;
-p$secondary;
,Lubtle;
  border-radius: $semantic-border-radius-md;
  
  p {
    margin: 0 0"line-tight 0;
    font-size: $base <4  
    strong {
  -I}
  }
}

// Responsive Design
@media (max-width: 1024px) {
  .demo-grid {428';sm;
  }
}

@media (max-width: 768px) {
  .demo-container {
=sm;
  }
  
  .demo-grid {
    grid-template-columns: 1fr;
  }q;}gEx*import { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CarouselComponent, CarouselItem } from '../../../../../ui-essentials/src/lib/components/data-display/carousel/carousel.component';

@Component({
  selector: 'ui-carousel-demo',
  standalone: true,
  imports: [CommonModule, CarouselComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="demo-container">
      <h2>Carousel Component Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Small</h4>
            <ui-carousel 
              [items]="imageItems"
              size="sm"
              variant="image"
              [autoplay]="false">
            </ui-carousel>
          </div>
          
          <div class="demo-item">
            <h4>Medium</h4>
            <ui-carousel 
              [items]="imageItems"
              size="md"
              variant="image"
              [autoplay]="false">
            </ui-carousel>
          </div>
          
          <div class="demo-item">
            <h4>Large</h4>
            <ui-carousel 
              [items]="imageItems"
              size="lg"
              variant="image"
              [autoplay]="false">
            </ui-carousel>
          </div>
        </div>
      </section>
      
      <!-- Variant Types -->
      <section class="demo-section">
        <h3>Variant Types</h3>
        
        <div class="demo-item">
          <h4>Image Carousel</h4>
          <ui-carousel 
            [items]="imageItems"
            variant="image"
            size="md"
            [autoplay]="false">
          </ui-carousel>
        </div>
        
        <div class="demo-item">
          <h4>Card Carousel</h4>
          <ui-carousel 
            [items]="cardItems"
            variant="card"
            size="md"
            [autoplay]="false">
          </ui-carousel>
        </div>
        
        <div class="demo-item">
          <h4>Content Carousel</h4>
          <ui-carousel 
            [items]="contentItems"
            variant="content"
            size="md"
            [autoplay]="false">
          </ui-carousel>
        </div>
      </section>
      
      <!-- Transition Effects -->
      <section class="demo-section">
        <h3>Transition Effects</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Slide</h4>
            <ui-carousel 
              [items]="imageItems.slice(0, 3)"
              transition="slide"
              size="md"
              [autoplay]="false">
            </ui-carousel>
          </div>
          
          <div class="demo-item">
            <h4>Fade</h4>
            <ui-carousel 
              [items]="imageItems.slice(0, 3)"
              transition="fade"
              size="md"
              [autoplay]="false">
            </ui-carousel>
          </div>
          
          <div class="demo-item">
            <h4>Scale</h4>
            <ui-carousel 
              [items]="imageItems.slice(0, 3)"
              transition="scale"
              size="md"
              [autoplay]="false">
            </ui-carousel>
          </div>
        </div>
      </section>
      
      <!-- Indicator Styles -->
      <section class="demo-section">
        <h3>Indicator Styles</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Dots</h4>
            <ui-carousel 
              [items]="imageItems.slice(0, 4)"
              indicatorStyle="dots"
              size="md"
              [autoplay]="false">
            </ui-carousel>
          </div>
          
          <div class="demo-item">
            <h4>Bars</h4>
            <ui-carousel 
              [items]="imageItems.slice(0, 4)"
              indicatorStyle="bars"
              size="md"
              [autoplay]="false">
            </ui-carousel>
          </div>
          
          <div class="demo-item">
            <h4>Thumbnails</h4>
            <ui-carousel 
              [items]="thumbnailItems"
              indicatorStyle="thumbnails"
              size="md"
              [autoplay]="false">
            </ui-carousel>
          </div>
        </div>
      </section>
      
      <!-- Features -->
      <section class="demo-section">
        <h3>Special Features</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Autoplay</h4>
            <ui-carousel 
              [items]="imageItems.slice(0, 3)"
              size="md"
              [autoplay]="true"
              [autoplayInterval]="2000">
            </ui-carousel>
          </div>
          
          <div class="demo-item">
            <h4>No Loop</h4>
            <ui-carousel 
              [items]="imageItems.slice(0, 3)"
              size="md"
              [loop]="false"
              [autoplay]="false">
            </ui-carousel>
          </div>
          
          <div class="demo-item">
            <h4>Disabled</h4>
            <ui-carousel 
              [items]="imageItems.slice(0, 3)"
              size="md"
              [disabled]="true">
            </ui-carousel>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <ui-carousel 
          [items]="interactiveItems"
          variant="card"
          size="lg"
          [autoplay]="false"
          (slideChange)="handleSlideChange($event)"
          (itemClick)="handleItemClick($event)">
        </ui-carousel>
        <p class="demo-status">Current slide: {{ currentSlide + 1 }} of {{ interactiveItems.length }}</p>
        @if (lastClickedItem) {
          <p class="demo-status">Last clicked: {{ lastClickedItem.title }}</p>
        }
      </section>
    </div>
  `,
  styleUrl: './carousel-demo.component.scss'
})
export class CarouselDemoComponent {
  currentSlide = 0;
  lastClickedItem: CarouselItem | null = null;

  imageItems: CarouselItem[] = [
    {
      id: 1,
      imageUrl: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800&h=400&fit=crop',
      title: 'Mountain Landscape',
      subtitle: 'Serene mountain views'
    },
    {
      id: 2,
      imageUrl: 'https://images.unsplash.com/photo-1501594907352-04cda38ebc29?w=800&h=400&fit=crop',
      title: 'Ocean Waves',
      subtitle: 'Peaceful ocean scenery'
    },
    {
      id: 3,
      imageUrl: 'https://images.unsplash.com/photo-1441974231531-c6227db76b6e?w=800&h=400&fit=crop',
      title: 'Forest Path',
      subtitle: 'Mystical forest trail'
    },
    {
      id: 4,
      imageUrl: 'https://images.unsplash.com/photo-1501436513145-30f24e19fcc4?w=800&h=400&fit=crop',
      title: 'Desert Sunset',
      subtitle: 'Golden desert landscape'
    }
  ];

  cardItems: CarouselItem[] = [
    {
      id: 1,
      imageUrl: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=400&h=200&fit=crop',
      title: 'Analytics Dashboard',
      subtitle: 'Data Visualization',
      content: 'Powerful analytics tools to understand your business metrics and make data-driven decisions.'
    },
    {
      id: 2,
      imageUrl: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=400&h=200&fit=crop',
      title: 'Team Collaboration',
      subtitle: 'Productivity Tools',
      content: 'Enhanced collaboration features to keep your team connected and productive from anywhere.'
    },
    {
      id: 3,
      imageUrl: 'https://images.unsplash.com/photo-1563207153-f403bf289096?w=400&h=200&fit=crop',
      title: 'Mobile Experience',
      subtitle: 'Cross-Platform',
      content: 'Seamless experience across all devices with our responsive design and mobile optimization.'
    }
  ];

  contentItems: CarouselItem[] = [
    {
      id: 1,
      title: 'Welcome to Our Platform',
      subtitle: 'Getting Started Guide',
      content: 'Discover amazing features and capabilities that will transform the way you work and collaborate with your team.'
    },
    {
      id: 2,
      title: 'Advanced Features',
      subtitle: 'Power User Tips',
      content: 'Unlock the full potential of our platform with advanced features designed for professional workflows.'
    },
    {
      id: 3,
      title: 'Success Stories',
      subtitle: 'Customer Testimonials',
      content: 'Join thousands of satisfied customers who have achieved remarkable results using our solutions.'
    }
  ];

  thumbnailItems: CarouselItem[] = [
    {
      id: 1,
      imageUrl: 'https://images.unsplash.com/photo-1517180102446-f3ece451e9d8?w=800&h=400&fit=crop',
      thumbnail: 'https://images.unsplash.com/photo-1517180102446-f3ece451e9d8?w=100&h=60&fit=crop',
      title: 'Urban Architecture',
      subtitle: 'Modern city design'
    },
    {
      id: 2,
      imageUrl: 'https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=800&h=400&fit=crop',
      thumbnail: 'https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=100&h=60&fit=crop',
      title: 'Natural Beauty',
      subtitle: 'Landscape photography'
    },
    {
      id: 3,
      imageUrl: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800&h=400&fit=crop',
      thumbnail: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=100&h=60&fit=crop',
      title: 'Mountain Vista',
      subtitle: 'Alpine scenery'
    }
  ];

  interactiveItems: CarouselItem[] = [
    {
      id: 1,
      imageUrl: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?w=400&h=200&fit=crop',
      title: 'Project Alpha',
      subtitle: 'Innovation Hub',
      content: 'Revolutionary project management tools designed to streamline your workflow and boost productivity.'
    },
    {
      id: 2,
      imageUrl: 'https://images.unsplash.com/photo-1552664730-d307ca884978?w=400&h=200&fit=crop',
      title: 'Team Dynamics',
      subtitle: 'Collaboration Suite',
      content: 'Advanced collaboration features that bring teams together, regardless of location or time zone.'
    },
    {
      id: 3,
      imageUrl: 'https://images.unsplash.com/photo-1504384308090-c894fdcc538d?w=400&h=200&fit=crop',
      title: 'Data Insights',
      subtitle: 'Analytics Platform',
      content: 'Comprehensive analytics and reporting tools to help you make informed business decisions.'
    }
  ];

  handleSlideChange(index: number): void {
    this.currentSlide = index;
    console.log('Slide changed to:', index);
  }

  handleItemClick(event: {item: CarouselItem, index: number}): void {
    this.lastClickedItem = event.item;
    console.log('Item clicked:', event);
  }
}z3ئjx7x«5 x* export * from './carousel-demo.component';=xF@use "../../../../../ui-design-system/src/styles/semantic" as *;


// ==========================================================================
// VIDEO PLAYER DEMO COMPONENT
// ==========================================================================
// Demonstration component showcasing all video player variants and capabilities
// ==========================================================================

.video-player-demo {
  padding: $semantic-spacing-layout-lg;
  max-width: 1200px;
  margin: 0 auto;
  
  h2 {
    color: $semantic-color-text-primary;
    font-family: map-get($semantic-typography-heading-h1, font-family);
    font-size: map-get($semantic-typography-heading-h1, font-size);
    font-weight: map-get($semantic-typography-heading-h1, font-weight);
    line-height: map-get($semantic-typography-heading-h1, line-height);
    margin-bottom: $semantic-spacing-layout-section-sm;
    border-bottom: 2px solid $semantic-color-primary;
    padding-bottom: $semantic-spacing-component-xs;
  }
  
  h3 {
    color: $semantic-color-text-secondary;
    font-family: map-get($semantic-typography-heading-h2, font-family);
    font-size: map-get($semantic-typography-heading-h2, font-size);
    font-weight: map-get($semantic-typography-heading-h2, font-weight);
    line-height: map-get($semantic-typography-heading-h2, line-height);
    margin-bottom: $semantic-spacing-content-heading;
  }
  
  h4 {
    color: $semantic-color-text-tertiary;
    font-family: map-get($semantic-typography-heading-h3, font-family);
    font-size: map-get($semantic-typography-heading-h3, font-size);
    font-weight: map-get($semantic-typography-heading-h3, font-weight);
    line-height: map-get($semantic-typography-heading-h3, line-height);
    margin-bottom: $semantic-spacing-content-paragraph;
  }
  
  .demo-section {
    border: 1px solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-lg;
    padding: $semantic-spacing-component-xl;
    background: $semantic-color-surface-secondary;
    margin-bottom: $semantic-spacing-layout-md;
    
    &:last-child {
      margin-bottom: 0;
    }
  }
  
  .variant-demo {
    margin-bottom: $semantic-spacing-component-lg;
    
    &:last-child {
      margin-bottom: 0;
    }
  }
  
  .player-container {
    border: 1px solid $semantic-color-border-secondary;
    border-radius: $semantic-border-radius-md;
    overflow: hidden;
    margin-bottom: $semantic-spacing-component-md;
    background: $semantic-color-surface-primary;
  }
  
  .demo-description {
    margin-bottom: $semantic-spacing-content-heading;
    color: $semantic-color-text-tertiary;
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
  }
  
  .controls-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: $semantic-spacing-component-md;
    margin-bottom: $semantic-spacing-component-lg;
    padding: $semantic-spacing-component-md;
    background: $semantic-color-surface-container;
    border-radius: $semantic-border-radius-md;
  }
  
  .control-label {
    display: flex;
    align-items: center;
    gap: $semantic-spacing-component-xs;
    cursor: pointer;
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: map-get($semantic-typography-body-small, font-weight);
    line-height: map-get($semantic-typography-body-small, line-height);
    user-select: none;
    color: $semantic-color-text-primary;
    
    input[type="checkbox"] {
      margin: 0;
      accent-color: $semantic-color-primary;
    }
  }
  
  .select-controls {
    display: flex;
    gap: $semantic-spacing-component-lg;
    margin-bottom: $semantic-spacing-component-lg;
    flex-wrap: wrap;
  }
  
  .select-label {
    display: flex;
    align-items: center;
    gap: $semantic-spacing-component-xs;
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: map-get($semantic-typography-body-small, font-weight);
    line-height: map-get($semantic-typography-body-small, line-height);
    color: $semantic-color-text-primary;
  }
  
  .demo-select {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    border: 1px solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-sm;
    background: $semantic-color-surface-primary;
    color: $semantic-color-text-primary;
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    
    &:focus {
      outline: 2px solid $semantic-color-primary;
      outline-offset: 2px;
    }
  }
  
  .event-display {
    margin-top: $semantic-spacing-component-md;
    padding: $semantic-spacing-component-md;
    background: $semantic-color-primary-container;
    border: 1px solid $semantic-color-primary;
    border-radius: $semantic-border-radius-sm;
    color: $semantic-color-text-primary;
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: map-get($semantic-typography-body-small, font-weight);
    line-height: map-get($semantic-typography-body-small, line-height);
  }
  
  .code-examples {
    background: $semantic-color-surface-container;
    padding: $semantic-spacing-component-xl;
    border-radius: $semantic-border-radius-md;
    border-left: 4px solid $semantic-color-primary;
  }
  
  .code-example {
    margin-bottom: $semantic-spacing-component-lg;
    
    &:last-child {
      margin-bottom: 0;
    }
    
    h4 {
      margin-bottom: $semantic-spacing-component-sm;
    }
    
    pre {
      background: $semantic-color-surface-primary;
      padding: $semantic-spacing-component-md;
      border-radius: $semantic-border-radius-sm;
      overflow-x: auto;
      border: 1px solid $semantic-color-border-secondary;
      
      code {
        font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
        font-size: map-get($semantic-typography-code-block, font-size);
        line-height: map-get($semantic-typography-code-block, line-height);
        color: $semantic-color-text-primary;
      }
    }
  }
}

// Responsive adjustments
@media (max-width: 768px) {
  .video-player-demo {
    padding: $semantic-spacing-layout-md;
    
    .controls-grid {
      grid-template-columns: 1fr;
    }
    
    .select-controls {
      flex-direction: column;
      gap: $semantic-spacing-component-md;
    }
  }
}!8Gxit(gqFbQjniF)R Qximport { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CenterComponent } from '../../../../../ui-essentials/src/lib/components/layout/center';

@Component({
  selector: 'ui-center-demo',
  standalone: true,
  imports: [CommonModule, CenterComponent],
  template: `
    <div class="demo-container">
      <h2>Center Demo</h2>
      
      <!-- Axis Variants -->
      <section class="demo-section">
        <h3>Center Axis</h3>
        <div class="demo-row">
          <div class="demo-example">
            <h4>Both Axes (Default)</h4>
            <ui-center [customMinHeight]="'200px'" class="demo-boundary">
              <div class="demo-content">Centered Both Ways</div>
            </ui-center>
          </div>
          
          <div class="demo-example">
            <h4>Horizontal Only</h4>
            <ui-center axis="horizontal" [customMinHeight]="'200px'" class="demo-boundary">
              <div class="demo-content">Centered Horizontally</div>
            </ui-center>
          </div>
          
          <div class="demo-example">
            <h4>Vertical Only</h4>
            <ui-center axis="vertical" [customMinHeight]="'200px'" class="demo-boundary">
              <div class="demo-content">Centered Vertically</div>
            </ui-center>
          </div>
        </div>
      </section>
      
      <!-- Max Width Constraints -->
      <section class="demo-section">
        <h3>Max Width Constraints</h3>
        <div class="demo-column">
          <div class="demo-example">
            <h4>Small (640px)</h4>
            <ui-center maxWidth="sm" padding="md" class="demo-boundary">
              <div class="demo-content">
                This content is constrained to a maximum width of 640px and will be centered within its container.
                Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.
              </div>
            </ui-center>
          </div>
          
          <div class="demo-example">
            <h4>Medium (768px)</h4>
            <ui-center maxWidth="md" padding="md" class="demo-boundary">
              <div class="demo-content">
                This content is constrained to a maximum width of 768px and will be centered within its container.
                Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
              </div>
            </ui-center>
          </div>
          
          <div class="demo-example">
            <h4>Large (1024px)</h4>
            <ui-center maxWidth="lg" padding="md" class="demo-boundary">
              <div class="demo-content">
                This content is constrained to a maximum width of 1024px and will be centered within its container.
                Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
                Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.
              </div>
            </ui-center>
          </div>
        </div>
      </section>
      
      <!-- Spacing Variants -->
      <section class="demo-section">
        <h3>Spacing</h3>
        <div class="demo-row">
          <div class="demo-example">
            <h4>Small Padding</h4>
            <ui-center padding="sm" class="demo-boundary">
              <div class="demo-content">Small Padding</div>
            </ui-center>
          </div>
          
          <div class="demo-example">
            <h4>Medium Padding</h4>
            <ui-center padding="md" class="demo-boundary">
              <div class="demo-content">Medium Padding</div>
            </ui-center>
          </div>
          
          <div class="demo-example">
            <h4>Large Padding</h4>
            <ui-center padding="lg" class="demo-boundary">
              <div class="demo-content">Large Padding</div>
            </ui-center>
          </div>
        </div>
      </section>
      
      <!-- Inline Variant -->
      <section class="demo-section">
        <h3>Inline Center</h3>
        <div class="demo-example">
          <p>
            Here is some text with an
            <ui-center [inline]="true" class="demo-inline">
              <span class="demo-content-small">inline centered element</span>
            </ui-center>
            in the middle of the paragraph.
          </p>
        </div>
      </section>
      
      <!-- Practical Examples -->
      <section class="demo-section">
        <h3>Practical Examples</h3>
        
        <div class="demo-example">
          <h4>Card Layout</h4>
          <ui-center maxWidth="md" padding="lg">
            <div class="demo-card">
              <h3>Welcome Message</h3>
              <p>This card is centered with constrained width for better readability.</p>
              <button class="demo-button">Get Started</button>
            </div>
          </ui-center>
        </div>
        
        <div class="demo-example">
          <h4>Loading State</h4>
          <ui-center [customMinHeight]="'300px'">
            <div class="demo-loading">
              <div class="demo-spinner"></div>
              <p>Loading...</p>
            </div>
          </ui-center>
        </div>
        
        <div class="demo-example">
          <h4>Hero Section</h4>
          <ui-center [customMinHeight]="'400px'" maxWidth="lg" padding="xl">
            <div class="demo-hero">
              <h2>Hero Title</h2>
              <p>A compelling hero message that's perfectly centered and constrained for optimal reading.</p>
              <button class="demo-button demo-button--primary">Call to Action</button>
            </div>
          </ui-center>
        </div>
      </section>
    </div>
  `,
  styleUrl: './center-demo.component.scss'
})
export class CenterDemoComponent {}xFimport { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { SearchBarComponent, SearchSuggestion } from '../../../../../ui-essentials/src/lib/components/forms/search/search-bar.component';
import { 
  faSearch, 
  faMicrophone, 
  faCamera, 
  faFilter,
  faUser,
  faFile,
  faFolder,
  faTag,
  faHeart,
  faStar
} from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-search-demo',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    SearchBarComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Search Bar Component Showcase</h2>
      
      <!-- Basic Search Bars -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Search Bars</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-search-bar 
            placeholder="Search anything..."
            [(ngModel)]="basicSearch1"
            (searchChange)="onSearchChange('basic-1', $event)"
            (searchSubmit)="onSearchSubmit('basic-1', $event)"
          />
          <ui-search-bar 
            placeholder="Search with label..."
            label="Search"
            [(ngModel)]="basicSearch2"
            (searchChange)="onSearchChange('basic-2', $event)"
          />
          <ui-search-bar 
            placeholder="Required search field..."
            label="Search (Required)"
            [required]="true"
            [(ngModel)]="basicSearch3"
            (searchChange)="onSearchChange('basic-3', $event)"
          />
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-search-bar 
            placeholder="Small search..."
            size="sm"
            [(ngModel)]="sizeSmall"
            (searchChange)="onSearchChange('size-sm', $event)"
          />
          <ui-search-bar 
            placeholder="Medium search (default)..."
            size="md"
            [(ngModel)]="sizeMedium"
            (searchChange)="onSearchChange('size-md', $event)"
          />
          <ui-search-bar 
            placeholder="Large search..."
            size="lg"
            [(ngModel)]="sizeLarge"
            (searchChange)="onSearchChange('size-lg', $event)"
          />
        </div>
      </section>

      <!-- Variant Styles -->
      <section style="margin-bottom: 3rem;">
        <h3>Style Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-search-bar 
            placeholder="Outlined search (default)..."
            variant="outlined"
            [(ngModel)]="variantOutlined"
            (searchChange)="onSearchChange('variant-outlined', $event)"
          />
          <ui-search-bar 
            placeholder="Filled search..."
            variant="filled"
            [(ngModel)]="variantFilled"
            (searchChange)="onSearchChange('variant-filled', $event)"
          />
          <ui-search-bar 
            placeholder="Elevated search..."
            variant="elevated"
            [(ngModel)]="variantElevated"
            (searchChange)="onSearchChange('variant-elevated', $event)"
          />
        </div>
      </section>

      <!-- With Icons -->
      <section style="margin-bottom: 3rem;">
        <h3>With Icons</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-search-bar 
            placeholder="Custom leading icon..."
            [leadingIcon]="faUser"
            [(ngModel)]="iconSearch1"
            (searchChange)="onSearchChange('icon-1', $event)"
          />
          <ui-search-bar 
            placeholder="With trailing icons..."
            [trailingIcons]="basicTrailingIcons"
            [(ngModel)]="iconSearch2"
            (searchChange)="onSearchChange('icon-2', $event)"
            (trailingIconClick)="onTrailingIconClick($event)"
          />
          <ui-search-bar 
            placeholder="Multiple trailing icons..."
            [trailingIcons]="multipleTrailingIcons"
            [(ngModel)]="iconSearch3"
            (searchChange)="onSearchChange('icon-3', $event)"
            (trailingIconClick)="onTrailingIconClick($event)"
          />
        </div>
      </section>

      <!-- With Suggestions -->
      <section style="margin-bottom: 3rem;">
        <h3>With Suggestions</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-search-bar 
            placeholder="Search with suggestions..."
            [suggestions]="suggestions"
            [(ngModel)]="suggestionSearch1"
            (searchChange)="onSearchChange('suggestions-1', $event)"
            (suggestionSelect)="onSuggestionSelect($event)"
          />
          <ui-search-bar 
            placeholder="Search with categorized suggestions..."
            [suggestions]="categorizedSuggestions"
            [(ngModel)]="suggestionSearch2"
            (searchChange)="onSearchChange('suggestions-2', $event)"
            (suggestionSelect)="onSuggestionSelect($event)"
          />
        </div>
      </section>

      <!-- States -->
      <section style="margin-bottom: 3rem;">
        <h3>States</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-search-bar 
            placeholder="Disabled search..."
            [disabled]="true"
            [(ngModel)]="stateDisabled"
          />
          <ui-search-bar 
            placeholder="Readonly search..."
            [readonly]="true"
            [(ngModel)]="stateReadonly"
          />
          <ui-search-bar 
            placeholder="Error state..."
            state="error"
            errorMessage="Please enter a valid search term"
            [(ngModel)]="stateError"
            (searchChange)="onSearchChange('state-error', $event)"
          />
          <ui-search-bar 
            placeholder="With helper text..."
            helperText="Enter at least 3 characters to search"
            [(ngModel)]="stateHelper"
            (searchChange)="onSearchChange('state-helper', $event)"
          />
        </div>
      </section>

      <!-- Advanced Features -->
      <section style="margin-bottom: 3rem;">
        <h3>Advanced Features</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-search-bar 
            placeholder="Non-clearable search..."
            [clearable]="false"
            [(ngModel)]="advancedSearch1"
            (searchChange)="onSearchChange('advanced-1', $event)"
          />
          <ui-search-bar 
            placeholder="Auto-focus search..."
            [autofocus]="true"
            [(ngModel)]="advancedSearch2"
            (searchChange)="onSearchChange('advanced-2', $event)"
          />
          <ui-search-bar 
            placeholder="Search with max suggestions..."
            [suggestions]="suggestions"
            [maxSuggestions]="3"
            [(ngModel)]="advancedSearch3"
            (searchChange)="onSearchChange('advanced-3', $event)"
          />
        </div>
      </section>

      <!-- Interactive Controls -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Controls</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button 
            style="padding: 0.5rem 1rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="clearAllSearches()"
          >
            Clear All Searches
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="fillSampleSearches()"
          >
            Fill Sample Searches
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #6f42c1; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleStates()"
          >
            {{ globalDisabled() ? 'Enable All' : 'Disable All' }}
          </button>
        </div>
        
        @if (lastAction()) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last action:</strong> {{ lastAction() }}
          </div>
        }
      </section>

      <!-- Code Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Code Examples</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; margin-bottom: 1rem;">
          <h4>Basic Usage:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-search-bar 
  placeholder="Search..."
  [(ngModel)]="searchValue"
  (searchChange)="onSearchChange($event)"
  (searchSubmit)="onSearchSubmit($event)"&gt;
&lt;/ui-search-bar&gt;</code></pre>

          <h4>With Suggestions:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-search-bar 
  placeholder="Search with suggestions..."
  [suggestions]="suggestions"
  [(ngModel)]="searchValue"
  (suggestionSelect)="onSuggestionSelect($event)"&gt;
&lt;/ui-search-bar&gt;</code></pre>

          <h4>With Icons:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-search-bar 
  placeholder="Search with icons..."
  [leadingIcon]="faSearch"
  [trailingIcons]="iconButtons"
  variant="filled"
  size="lg"
  (trailingIconClick)="onIconClick($event)"&gt;
&lt;/ui-search-bar&gt;</code></pre>
        </div>
      </section>

      <!-- Current Values -->
      <section style="margin-bottom: 3rem;">
        <h3>Current Values</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; max-height: 400px; overflow-y: auto;">
          <pre>{{ getCurrentValues() }}</pre>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(279, 14%, 35%);
      font-size: 1.2rem;
      margin-bottom: 0.5rem;
    }
    
    pre {
      margin: 0;
      font-family: 'Courier New', monospace;
      font-size: 0.9rem;
      line-height: 1.4;
    }
    
    code {
      color: hsl(279, 14%, 15%);
    }
    
    section {
      border: 1px solid #e9ecef;
      padding: 1.5rem;
      border-radius: 8px;
      background: #ffffff;
    }
    
    button:hover {
      opacity: 0.9;
      transform: translateY(-1px);
    }
  `]
})
export class SearchDemoComponent {
  // FontAwesome icons
  protected readonly faSearch = faSearch;
  protected readonly faMicrophone = faMicrophone;
  protected readonly faCamera = faCamera;
  protected readonly faFilter = faFilter;
  protected readonly faUser = faUser;
  protected readonly faFile = faFile;
  protected readonly faFolder = faFolder;
  protected readonly faTag = faTag;
  protected readonly faHeart = faHeart;
  protected readonly faStar = faStar;

  // Basic search values
  basicSearch1 = signal<string>('');
  basicSearch2 = signal<string>('');
  basicSearch3 = signal<string>('');

  // Size variants
  sizeSmall = signal<string>('');
  sizeMedium = signal<string>('');
  sizeLarge = signal<string>('');

  // Variant styles
  variantOutlined = signal<string>('');
  variantFilled = signal<string>('');
  variantElevated = signal<string>('');

  // Icon searches
  iconSearch1 = signal<string>('');
  iconSearch2 = signal<string>('');
  iconSearch3 = signal<string>('');

  // Suggestion searches
  suggestionSearch1 = signal<string>('');
  suggestionSearch2 = signal<string>('');

  // State searches
  stateDisabled = signal<string>('Disabled value');
  stateReadonly = signal<string>('Readonly value');
  stateError = signal<string>('');
  stateHelper = signal<string>('');

  // Advanced searches
  advancedSearch1 = signal<string>('');
  advancedSearch2 = signal<string>('');
  advancedSearch3 = signal<string>('');

  // Control states
  globalDisabled = signal<boolean>(false);
  lastAction = signal<string>('');

  // Icon configurations
  basicTrailingIcons = [
    {
      id: 'mic',
      icon: faMicrophone,
      label: 'Voice search',
      disabled: false
    }
  ];

  multipleTrailingIcons = [
    {
      id: 'mic',
      icon: faMicrophone,
      label: 'Voice search',
      disabled: false
    },
    {
      id: 'camera',
      icon: faCamera,
      label: 'Image search',
      disabled: false
    },
    {
      id: 'filter',
      icon: faFilter,
      label: 'Filter results',
      disabled: false
    }
  ];

  // Search suggestions
  suggestions: SearchSuggestion[] = [
    { id: '1', text: 'Angular components', icon: faFile },
    { id: '2', text: 'TypeScript interfaces', icon: faFile },
    { id: '3', text: 'SCSS mixins', icon: faFile },
    { id: '4', text: 'Design tokens', icon: faTag },
    { id: '5', text: 'Material Design', icon: faHeart },
    { id: '6', text: 'Component library', icon: faFolder },
    { id: '7', text: 'UI patterns', icon: faStar },
    { id: '8', text: 'Accessibility guidelines', icon: faFile }
  ];

  categorizedSuggestions: SearchSuggestion[] = [
    { id: '1', text: 'User profile', category: 'Users', icon: faUser },
    { id: '2', text: 'Project documentation', category: 'Files', icon: faFile },
    { id: '3', text: 'Design system', category: 'Files', icon: faFolder },
    { id: '4', text: 'Component library', category: 'Code', icon: faTag },
    { id: '5', text: 'UI components', category: 'Code', icon: faTag },
    { id: '6', text: 'Admin settings', category: 'Settings', icon: faFilter }
  ];

  onSearchChange(searchId: string, value: string): void {
    this.lastAction.set(`Search changed: ${searchId} = "${value}"`);
    console.log(`Search ${searchId} changed:`, value);
  }

  onSearchSubmit(searchId: string, value: string): void {
    this.lastAction.set(`Search submitted: ${searchId} = "${value}"`);
    console.log(`Search ${searchId} submitted:`, value);
  }

  onSuggestionSelect(suggestion: SearchSuggestion): void {
    this.lastAction.set(`Suggestion selected: "${suggestion.text}" (${suggestion.id})`);
    console.log('Suggestion selected:', suggestion);
  }

  onTrailingIconClick(iconData: {id: string, icon: any}): void {
    this.lastAction.set(`Icon clicked: ${iconData.id}`);
    console.log('Trailing icon clicked:', iconData);
  }

  clearAllSearches(): void {
    this.basicSearch1.set('');
    this.basicSearch2.set('');
    this.basicSearch3.set('');
    this.sizeSmall.set('');
    this.sizeMedium.set('');
    this.sizeLarge.set('');
    this.variantOutlined.set('');
    this.variantFilled.set('');
    this.variantElevated.set('');
    this.iconSearch1.set('');
    this.iconSearch2.set('');
    this.iconSearch3.set('');
    this.suggestionSearch1.set('');
    this.suggestionSearch2.set('');
    this.stateError.set('');
    this.stateHelper.set('');
    this.advancedSearch1.set('');
    this.advancedSearch2.set('');
    this.advancedSearch3.set('');
    
    this.lastAction.set('All searches cleared');
  }

  fillSampleSearches(): void {
    this.basicSearch1.set('Sample search');
    this.basicSearch2.set('Labeled search');
    this.basicSearch3.set('Required search');
    this.sizeSmall.set('Small');
    this.sizeMedium.set('Medium');
    this.sizeLarge.set('Large');
    this.variantOutlined.set('Outlined');
    this.variantFilled.set('Filled');
    this.variantElevated.set('Elevated');
    this.iconSearch1.set('User search');
    this.iconSearch2.set('Voice search');
    this.iconSearch3.set('Multi-icon search');
    this.suggestionSearch1.set('Angular');
    this.suggestionSearch2.set('Design');
    this.stateError.set('Error text');
    this.stateHelper.set('Helper text');
    this.advancedSearch1.set('Advanced');
    this.advancedSearch2.set('Focused');
    this.advancedSearch3.set('Limited');
    
    this.lastAction.set('All searches filled with sample data');
  }

  toggleStates(): void {
    this.globalDisabled.update(disabled => !disabled);
    this.lastAction.set(`Global state: ${this.globalDisabled() ? 'disabled' : 'enabled'}`);
  }

  getCurrentValues(): string {
    const values = {
      basic: {
        search1: this.basicSearch1(),
        search2: this.basicSearch2(),
        search3: this.basicSearch3()
      },
      sizes: {
        small: this.sizeSmall(),
        medium: this.sizeMedium(),
        large: this.sizeLarge()
      },
      variants: {
        outlined: this.variantOutlined(),
        filled: this.variantFilled(),
        elevated: this.variantElevated()
      },
      icons: {
        icon1: this.iconSearch1(),
        icon2: this.iconSearch2(),
        icon3: this.iconSearch3()
      },
      suggestions: {
        suggestion1: this.suggestionSearch1(),
        suggestion2: this.suggestionSearch2()
      },
      states: {
        disabled: this.stateDisabled(),
        readonly: this.stateReadonly(),
        error: this.stateError(),
        helper: this.stateHelper()
      },
      advanced: {
        advanced1: this.advancedSearch1(),
        advanced2: this.advancedSearch2(),
        advanced3: this.advancedSearch3()
      },
      controls: {
        globalDisabled: this.globalDisabled(),
        lastAction: this.lastAction()
      }
    };
    
    return JSON.stringify(values, null, 2);
  }
}x鄌dCheckboxComponent?checkbox/checkbox.component!checkboxPCheckbox[{Checkbox1Checkbox@@Basic Checkboxejr:checkbox 
            label="Accept terms and conditions" 7basicChecked1"
            (checkboxChange)="onCheckbox`%P	checkbox aubscribe to newsletter" 
            description="Receive updates about our products and services7basicChecked2"
            (checkboxChange)="onCheckboxv6*checkbox 
            label="Remember me" 7basicChecked3"
            (checkboxChange)="onCheckboxz	checkbox mall checkbox" 5checkboxChange)="onCheckbox+68checkbox 
            label="Medium checkbox (default)" IcheckboxChange)="onCheckbox	6-checkbox 
            label="Large checkbox" 	5checkboxChange)="onCheckbox	\ColorA?Colorp
z.checkbox 
            label="Primary variant" primaryOvariantPrimary"
            (checkboxChange)="onCheckboxChange('variant-primary!P	checkbox condary variant" 	secondarySvariantSecondary"
            (checkboxChange)="onCheckboxChange('variant-secondary!P	checkbox uccess variant" successOvariantSuccess"
            (checkboxChange)="onCheckboxChange('variant-success!P.checkbox 
            label="Warning variant" warningOvariantWarning"
            (checkboxChange)="onCheckboxChange('variant-warning!P-checkbox 
            label="Danger variant" dangerLvariantDanger"
            (checkboxChange)="onCheckboxChange('variant-dange"	$<1checkbox 
            label="Disabled unchecked" /E	Unchecked/checkbox 
            label="Disabled checked" /EChecked-checkbox 
            label="Required field" 8FRequired"
            (checkboxChange)="onCheckboxChange('state-requir)*checkbox 
            label="Error state" _'checkboxChange)="onCheckbox4	$With DescripHDescrip/vcheckbox 
            label="Marketing emails"
            description="Receive promotional emails and special offers"
        BdescChecked1"
            (checkboxChange)="onCheckboxChange('descqPcheckbox 
            label="Product updates"
            description="Get notified about new features and product announcementsBdescChecked2"
            (checkboxChange)="onCheckboxChange('descP	checkbox [curity alerts"
            description="Important notifications about your account security9BdescChecked3"
            (checkboxChange)="onCheckboxChange('descQheckAll 	Check All A%_
uncheckAll Uncheck All A$ eDisabled Sele!selection:</strong> {{ lastSele!Xcheckbox 
  label="Accept terms"
  [(ngModel)]="isAccepted"
  (checkboxChange)="onAccept&checkbox#&Description%rcheckbox 
  label="Marketing emails"
  description="Receive promotional content"
  variant="success"
  size="lg"
  [(ngModel)]=!"emailOptIn"&gt;
&lt;/ui-checkbox#!Required Field%rcheckbox 
  label="I agree to terms"
  [required]="true"
  state="error"
  [(ngModel)]="agreedToTerms"&gt;
&lt;/ui-checkbox&gt;&=CheckboxDemoComponent {
  // Basic checkboxes
  basicChecked1)16basicChecked2 = signal<boolean>(true);
  basicChecked3)1-)31-boolean>(true);
  sizeLarge)1Q
  // Color variants
  variantPrimary = signal<boolean>(true);
  variantSecondary)18variantSuccess = signal<boolean>(true);
  variantWarning)1variantDanger)1#
  // States
  stateDisabledUncheck'1;stateDisabledChecked = signal<boolean>(true);
  stateRequir'1
stateError)1&
  // With descriptions
  descChecked1)1KdescChecked2 = signal<boolean>(true);
  descChecked3 = signal<boolean>(true1I	Selection .5onCheckboxChange(checkboxId: string, checked: booleana8BSelection.set(`${checkboxId}: ${checked ? 'checked' : 'unchecked'}7Checkbox ${checkboxId} changed:`, checked);
  }

  checkAll(): void {
    // Update all non-disabled checkboxes to checked
    this.basicChecked1.set(true);
    this.basicChecked2.set(true);
    this.basicChecked3.set(true);
    this.sizeSmall.set(true);
    this.sizeMedium.set(true
>true);
    this.variantPrimary.set(true);
    this.variantSecondary.set(true);
    this.variantSuccess.set(true);
    this.variWantWarning.set(true);
    this.variantDanger.set(true);
    this.stateRequired.set(true|?true);
    this.descChecked1.set(true);
    this.descChecked2.set(true);
    this.descChecked3.set(true);
    
    this.lastSelection.set('All checkboxes checked');
  }

  uncheckAll(): void {
    // Update all non-disabled checkboxes to unchecked
    this.basicChecked1.set(false);
    this.basicChecked2.set(false);
    this.basicChecked3.set(false);
    this.sizeSmall.set(false );
    this.sizeMedium.set(false
>false);
    this.variantPrimary.set(false);
    this.variantSecondary.set(false);
    this.variantSuccess.set(false);
    this.^variantWarning.set(false);
    this.variantDanger.set(false);
    this.stateRequired.set(false|?false);
    this.descChecked1.set(false);
    this.descChecked2.set(false);
    this.descChecked3.set(false);
    
    this.lasBtSelection.set('All checkboxes unchecked');
  }

  toggleDisabled(a8@;Selection.set(`Global disabledAenabled' : 'dis7A[checked1: this.basicChecked1(),
        checked2: this.basicChecked2(),
        checked3: this.basicChecked3()
      },
      sBprimary: this.variantPrimary(),
        secondary: this.variantSecondary(),
        success: this.variantSuccess(),
        war?ning: this.variantWarning(),
        danger: this.variantDangerD,Unchecked: this.stateDisabledUnchecked(),
        disabledChecked: this.stateDisabledChecked(),
        required: this.stateRequiredkD$
      },
      descriptions: {
        desc1: this.descChecked1(),
        desc2: this.descChecked2(),
        desc3: this.descCheckedKEZSelection: this.lastSeleEM"nxka|͸Aq!e *VxaDimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ChipComponent } from '../../../../../ui-essentials/src/lib/components/data-display/chip/chip.component';
import { ButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons/button.component';
import { 
  faHeart, 
  faUser, 
  faStar,
  faTag,
  faHome,
  faEnvelope,
  faPhone,
  faMapMarker,
  faCalendar,
  faCog,
  faTimes,
  faPlus,
  faCheck
} from '@fortawesome/free-solid-svg-icons';

interface ChipData {
  id: string;
  label: string;
  selected: boolean;
  disabled: boolean;
}

@Component({
  selector: 'ui-chip-demo',
  standalone: true,
  imports: [
    CommonModule,
    ChipComponent,
    ButtonComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Chip Component Showcase</h2>
      
      <!-- Basic Chip Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Chip Variants</h3>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="filled" label="Filled Chip" [clickable]="true" (chipClick)="handleChipClick('filled')"></ui-chip>
          <ui-chip variant="outlined" label="Outlined Chip" [clickable]="true" (chipClick)="handleChipClick('outlined')"></ui-chip>
          <ui-chip variant="elevated" label="Elevated Chip" [clickable]="true" (chipClick)="handleChipClick('elevated')"></ui-chip>
        </div>
        
        <h4>Selected State</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="filled" label="Selected Filled" [selected]="true" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" label="Selected Outlined" [selected]="true" [clickable]="true"></ui-chip>
          <ui-chip variant="elevated" label="Selected Elevated" [selected]="true" [clickable]="true"></ui-chip>
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="filled" size="sm" label="Small" [clickable]="true" (chipClick)="handleChipClick('small')"></ui-chip>
          <ui-chip variant="filled" size="md" label="Medium" [clickable]="true" (chipClick)="handleChipClick('medium')"></ui-chip>
          <ui-chip variant="filled" size="lg" label="Large" [clickable]="true" (chipClick)="handleChipClick('large')"></ui-chip>
        </div>
        
        <h4>With Icons</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="outlined" size="sm" label="Small" [leadingIcon]="faHeart" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" size="md" label="Medium" [leadingIcon]="faStar" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" size="lg" label="Large" [leadingIcon]="faUser" [clickable]="true"></ui-chip>
        </div>
      </section>

      <!-- Radius Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Corner Radius Variants</h3>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="filled" radius="none" label="No Radius" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" radius="sm" label="Small" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" radius="md" label="Medium" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" radius="lg" label="Large" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" radius="capsule" label="Capsule" [clickable]="true"></ui-chip>
        </div>
      </section>

      <!-- Icons and Avatars -->
      <section style="margin-bottom: 3rem;">
        <h3>Chips with Icons</h3>
        
        <h4>Leading Icons</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="outlined" label="Home" [leadingIcon]="faHome" [clickable]="true" (chipClick)="handleChipClick('home')"></ui-chip>
          <ui-chip variant="outlined" label="Email" [leadingIcon]="faEnvelope" [clickable]="true" (chipClick)="handleChipClick('email')"></ui-chip>
          <ui-chip variant="outlined" label="Phone" [leadingIcon]="faPhone" [clickable]="true" (chipClick)="handleChipClick('phone')"></ui-chip>
          <ui-chip variant="outlined" label="Location" [leadingIcon]="faMapMarker" [clickable]="true" (chipClick)="handleChipClick('location')"></ui-chip>
        </div>
        
        <h4>Trailing Icons</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="filled" label="Settings" [trailingIcon]="faCog" [clickable]="true" (chipClick)="handleChipClick('settings')"></ui-chip>
          <ui-chip variant="filled" label="Calendar" [trailingIcon]="faCalendar" [clickable]="true" (chipClick)="handleChipClick('calendar')"></ui-chip>
          <ui-chip variant="filled" label="Favorite" [trailingIcon]="faHeart" [clickable]="true" (chipClick)="handleChipClick('favorite')"></ui-chip>
        </div>
        
        <h4>With Avatars</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip 
            variant="outlined" 
            label="John Doe" 
            avatar="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=100&h=100&fit=crop&crop=face" 
            avatarAlt="John Doe"
            [clickable]="true" 
            (chipClick)="handleChipClick('john')">
          </ui-chip>
          <ui-chip 
            variant="outlined" 
            label="Jane Smith" 
            avatar="https://images.unsplash.com/photo-1494790108755-2616b612b786?w=100&h=100&fit=crop&crop=face"
            avatarAlt="Jane Smith"
            [clickable]="true" 
            (chipClick)="handleChipClick('jane')">
          </ui-chip>
          <ui-chip 
            variant="outlined" 
            label="Alex Johnson" 
            avatar="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop&crop=face"
            avatarAlt="Alex Johnson"
            [clickable]="true" 
            (chipClick)="handleChipClick('alex')">
          </ui-chip>
        </div>
      </section>

      <!-- Removable Chips -->
      <section style="margin-bottom: 3rem;">
        <h3>Removable Chips</h3>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          @for (tag of removableTags; track tag.id) {
            <ui-chip 
              variant="filled" 
              [label]="tag.label" 
              [removable]="true"
              [closeIcon]="faTimes"
              [clickable]="true"
              (chipClick)="handleChipClick(tag.id)"
              (chipRemove)="removeTag(tag.id)">
            </ui-chip>
          }
        </div>
        
        <h4>Removable with Icons</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          @for (tagWithIcon of removableTagsWithIcons; track tagWithIcon.id) {
            <ui-chip 
              variant="outlined" 
              [label]="tagWithIcon.label" 
              [leadingIcon]="tagWithIcon.icon"
              [removable]="true"
              [closeIcon]="faTimes"
              [clickable]="true"
              (chipClick)="handleChipClick(tagWithIcon.id)"
              (chipRemove)="removeTagWithIcon(tagWithIcon.id)">
            </ui-chip>
          }
        </div>
        
        <ui-button variant="outlined" size="small" [icon]="faPlus" iconPosition="left" (clicked)="addTags()">
          Add Tags Back
        </ui-button>
      </section>

      <!-- Interactive Selection -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Selection</h3>
        <p>Click chips to toggle selection:</p>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          @for (item of selectableItems; track item.id) {
            <ui-chip 
              variant="outlined" 
              [label]="item.label"
              [selected]="item.selected"
              [disabled]="item.disabled"
              [clickable]="true"
              (chipClick)="toggleSelection(item.id)">
            </ui-chip>
          }
        </div>
        
        <p><strong>Selected:</strong> {{ getSelectedItems() }}</p>
        <ui-button variant="tonal" size="small" (clicked)="clearSelection()">Clear Selection</ui-button>
      </section>

      <!-- States -->
      <section style="margin-bottom: 3rem;">
        <h3>Chip States</h3>
        
        <h4>Interactive States</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="filled" label="Normal" [clickable]="true" (chipClick)="handleChipClick('normal')"></ui-chip>
          <ui-chip variant="filled" label="Selected" [selected]="true" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" label="Disabled" [disabled]="true"></ui-chip>
          <ui-chip variant="filled" label="Disabled Selected" [disabled]="true" [selected]="true"></ui-chip>
        </div>
        
        <h4>Non-interactive (Labels)</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem;">
          <ui-chip variant="outlined" radius="capsule" label="Status: Active" [leadingIcon]="faCheck"></ui-chip>
          <ui-chip variant="outlined" radius="capsule" label="Category: Design"></ui-chip>
          <ui-chip variant="outlined" radius="capsule" label="Priority: High"></ui-chip>
        </div>
      </section>

      <!-- Chip Sets -->
      <section style="margin-bottom: 3rem;">
        <h3>Chip Sets</h3>
        
        <h4>Horizontal Scrolling Set</h4>
        <div class="ui-chip-set ui-chip-set--row" style="margin-bottom: 1.5rem; max-width: 500px; border: 1px dashed #ccc; padding: 1rem;">
          <ui-chip variant="filled" label="Technology" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" label="Programming" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" label="Web Development" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" label="User Interface" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" label="User Experience" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" label="Design Systems" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" label="Frontend" [clickable]="true"></ui-chip>
          <ui-chip variant="filled" label="Backend" [clickable]="true"></ui-chip>
        </div>
        
        <h4>Wrapped Set</h4>
        <div class="ui-chip-set" style="margin-bottom: 1.5rem; max-width: 500px; border: 1px dashed #ccc; padding: 1rem;">
          <ui-chip variant="outlined" label="Angular" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" label="TypeScript" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" label="SCSS" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" label="HTML" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" label="CSS" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" label="JavaScript" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" label="Responsive Design" [clickable]="true"></ui-chip>
          <ui-chip variant="outlined" label="Accessibility" [clickable]="true"></ui-chip>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Chip:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-chip 
  variant="filled" 
  label="Basic Chip"
  [clickable]="true"
  (chipClick)="handleClick($event)"&gt;
&lt;/ui-chip&gt;</code></pre>

          <h4>Chip with Icon:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-chip 
  variant="outlined"
  label="Home"
  [leadingIcon]="faHome"
  [clickable]="true"
  (chipClick)="goHome()"&gt;
&lt;/ui-chip&gt;</code></pre>

          <h4>Removable Chip:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-chip 
  variant="filled"
  label="Tag Name"
  [removable]="true"
  [closeIcon]="faTimes"
  (chipRemove)="removeTag($event)"&gt;
&lt;/ui-chip&gt;</code></pre>

          <h4>Chip with Avatar:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-chip 
  variant="outlined"
  label="John Doe"
  avatar="path/to/avatar.jpg"
  avatarAlt="John Doe"
  [clickable]="true"
  (chipClick)="viewProfile('john')"&gt;
&lt;/ui-chip&gt;</code></pre>
        </div>
      </section>

      <!-- Interactive Actions -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Actions</h3>
        @if (lastAction) {
          <div style="margin-bottom: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last action:</strong> {{ lastAction }}
          </div>
        }
        <div style="display: flex; gap: 1rem; flex-wrap: wrap;">
          <ui-button variant="filled" (clicked)="resetDemo()">Reset Demo</ui-button>
          <ui-button variant="tonal" (clicked)="showAlert('Chip showcase complete!')">Show Alert</ui-button>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }
  `]
})
export class ChipDemoComponent {
  lastAction: string = '';
  
  // FontAwesome icons
  faHeart = faHeart;
  faUser = faUser;
  faStar = faStar;
  faTag = faTag;
  faHome = faHome;
  faEnvelope = faEnvelope;
  faPhone = faPhone;
  faMapMarker = faMapMarker;
  faCalendar = faCalendar;
  faCog = faCog;
  faTimes = faTimes;
  faPlus = faPlus;
  faCheck = faCheck;
  
  removableTags: ChipData[] = [
    { id: 'react', label: 'React', selected: false, disabled: false },
    { id: 'angular', label: 'Angular', selected: false, disabled: false },
    { id: 'vue', label: 'Vue.js', selected: false, disabled: false },
    { id: 'svelte', label: 'Svelte', selected: false, disabled: false }
  ];
  
  removableTagsWithIcons: any[] = [
    { id: 'home-tag', label: 'Home', icon: faHome },
    { id: 'email-tag', label: 'Email', icon: faEnvelope },
    { id: 'star-tag', label: 'Starred', icon: faStar }
  ];
  
  selectableItems: ChipData[] = [
    { id: 'option1', label: 'Option 1', selected: false, disabled: false },
    { id: 'option2', label: 'Option 2', selected: true, disabled: false },
    { id: 'option3', label: 'Option 3', selected: false, disabled: false },
    { id: 'option4', label: 'Option 4', selected: false, disabled: false },
    { id: 'option5', label: 'Disabled', selected: false, disabled: true }
  ];

  private originalRemovableTags = [...this.removableTags];
  private originalRemovableTagsWithIcons = [...this.removableTagsWithIcons];

  handleChipClick(chipId: string): void {
    this.lastAction = `Chip clicked: ${chipId}`;
    console.log(`Chip clicked: ${chipId}`);
  }

  removeTag(tagId: string): void {
    this.removableTags = this.removableTags.filter(tag => tag.id !== tagId);
    this.lastAction = `Tag removed: ${tagId}`;
    console.log(`Tag removed: ${tagId}`);
  }
  
  removeTagWithIcon(tagId: string): void {
    this.removableTagsWithIcons = this.removableTagsWithIcons.filter(tag => tag.id !== tagId);
    this.lastAction = `Tag with icon removed: ${tagId}`;
    console.log(`Tag with icon removed: ${tagId}`);
  }
  
  addTags(): void {
    this.removableTags = [...this.originalRemovableTags];
    this.removableTagsWithIcons = [...this.originalRemovableTagsWithIcons];
    this.lastAction = 'Tags restored';
    console.log('Tags restored');
  }
  
  toggleSelection(itemId: string): void {
    const item = this.selectableItems.find(i => i.id === itemId);
    if (item && !item.disabled) {
      item.selected = !item.selected;
      this.lastAction = `Selection toggled: ${itemId} (${item.selected ? 'selected' : 'deselected'})`;
      console.log(`Selection toggled: ${itemId}`, item.selected);
    }
  }
  
  getSelectedItems(): string {
    return this.selectableItems
      .filter(item => item.selected)
      .map(item => item.label)
      .join(', ') || 'None';
  }
  
  clearSelection(): void {
    this.selectableItems.forEach(item => {
      if (!item.disabled) {
        item.selected = false;
      }
    });
    this.lastAction = 'Selection cleared';
    console.log('Selection cleared');
  }

  showAlert(message: string): void {
    alert(message);
    this.lastAction = 'Alert shown';
  }

  resetDemo(): void {
    this.lastAction = '';
    this.clearSelection();
    this.addTags();
    console.log('Demo reset');
  }
}Qpox{xq73
9 Ev@x@import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CodeSnippetComponent } from '../../../../../ui-code-display/src/lib/components/code-snippet/code-snippet.component';
import { InlineCodeComponent } from '../../../../../ui-code-display/src/lib/components/inline-code/inline-code.component';
import { CodeBlockComponent } from '../../../../../ui-code-display/src/lib/components/code-block/code-block.component';
import { CodeTheme, CodeThemeService } from '../../../../../ui-code-display/src/lib/services/theme.service';

@Component({
  selector: 'app-code-display-demo',
  standalone: true,
  imports: [
    CommonModule, 
    CodeSnippetComponent, 
    InlineCodeComponent, 
    CodeBlockComponent
  ],
  template: `
    <div class="demo-container">
      <h1>Code Display Components Demo</h1>
      
      <section class="demo-section">
        <h2>Theme Selector</h2>
        <div class="theme-controls">
          @for (theme of themes; track theme) {
            <button 
              (click)="setTheme(theme)"
              [class.active]="currentTheme() === theme"
              class="theme-btn">
              {{ theme }}
            </button>
          }
        </div>
      </section>

      <section class="demo-section">
        <h2>Inline Code</h2>
        <p>
          Use <ui-inline-code code="console.log('hello')" language="javascript"></ui-inline-code> 
          to output to the console.
        </p>
        <p>
          Install dependencies with <ui-inline-code code="npm install" language="bash" [copyable]="true"></ui-inline-code>
        </p>
      </section>

      <section class="demo-section">
        <h2>Code Snippet</h2>
        <ui-code-snippet
          [code]="typescriptCode"
          language="typescript"
          title="Component Example"
          size="md"
          [showLineNumbers]="true"
          [copyable]="true"
          [highlightLines]="[3, 5, '7-9']">
        </ui-code-snippet>
      </section>

      <section class="demo-section">
        <h2>Code Block</h2>
        <ui-code-block
          [code]="cssCode"
          language="css"
          variant="bordered"
          [showLineNumbers]="true"
          [copyable]="true">
        </ui-code-block>
      </section>

      <section class="demo-section">
        <h2>Different Sizes</h2>
        <h3>Small</h3>
        <ui-code-snippet
          [code]="shortCode"
          language="javascript"
          size="sm"
          title="Small Size">
        </ui-code-snippet>

        <h3>Medium (Default)</h3>
        <ui-code-snippet
          [code]="shortCode"
          language="javascript"
          size="md"
          title="Medium Size">
        </ui-code-snippet>

        <h3>Large</h3>
        <ui-code-snippet
          [code]="shortCode"
          language="javascript"
          size="lg"
          title="Large Size">
        </ui-code-snippet>
      </section>

      <section class="demo-section">
        <h2>Different Languages</h2>
        
        <h3>Python</h3>
        <ui-code-snippet
          [code]="pythonCode"
          language="python"
          title="Python Example">
        </ui-code-snippet>

        <h3>JSON</h3>
        <ui-code-snippet
          [code]="jsonCode"
          language="json"
          title="Configuration">
        </ui-code-snippet>

        <h3>HTML</h3>
        <ui-code-snippet
          [code]="htmlCode"
          language="html"
          title="Template">
        </ui-code-snippet>
      </section>
    </div>
  `,
  styleUrl: './code-display-demo.component.scss'
})
export class CodeDisplayDemoComponent {
  
  constructor(private themeService: CodeThemeService) {
    this.themes = this.themeService.getAvailableThemes();
    this.currentTheme = this.themeService.theme;
  }
  
  readonly themes: any[];
  readonly currentTheme: any;

  readonly typescriptCode = `import { Component } from '@angular/core';

@Component({
  selector: 'app-example',
  template: \`
    <div class="container">
      <h1>{{ title }}</h1>
      <p>{{ description }}</p>
    </div>
  \`
})
export class ExampleComponent {
  title = 'Hello World';
  description = 'This is a demo component';
}`;

  readonly cssCode = `.container {
  max-width: 1200px;
  margin: 0 auto;
  padding: 2rem;
  
  h1 {
    color: var(--primary-color);
    font-size: 2rem;
    margin-bottom: 1rem;
  }
  
  p {
    line-height: 1.6;
    color: var(--text-color);
  }
}`;

  readonly shortCode = `const greeting = 'Hello, World!';
console.log(greeting);`;

  readonly pythonCode = `def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# Generate first 10 Fibonacci numbers
for i in range(10):
    print(f"F({i}) = {fibonacci(i)}")`;

  readonly jsonCode = `{
  "name": "ui-code-display",
  "version": "1.0.0",
  "description": "Code display components for Angular",
  "dependencies": {
    "@angular/core": "^19.0.0",
    "prismjs": "^1.30.0"
  },
  "keywords": [
    "angular",
    "code",
    "syntax-highlighting",
    "prism"
  ]
}`;

  readonly htmlCode = `<div class="card">
  <header class="card-header">
    <h2>Card Title</h2>
    <button class="close-btn">&times;</button>
  </header>
  
  <div class="card-body">
    <p>This is the card content.</p>
    <a href="#" class="btn btn-primary">Action</a>
  </div>
</div>`;

  setTheme(theme: CodeTheme): void {
    this.themeService.setTheme(theme);
  }
}0 QONx;F}Bs~Jjp^fAAjs~nA~^j^ć":
PyldYhHFjnjpjQYfr*WBZQ~zin2PP7% 'rrB m+qxF/@use "../../../../../../ui-design-system/src/styles/semantic" as *;

.ui-enhanced-table-container {
  position: relative;
  width: 100%;
  background: $semantic-color-surface-primary;
  border-radius: $semantic-border-card-radius;
  box-shadow: $semantic-shadow-elevation-1;
  overflow: hidden;
  
  // Variants
  &--striped {
    .ui-enhanced-table__row:nth-child(even),
    .ui-enhanced-table__virtual-row:nth-child(even) {
      background: $semantic-color-surface-secondary;
    }
  }
  
  &--bordered {
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    .ui-enhanced-table__header-cell,
    .ui-enhanced-table__cell,
    .ui-enhanced-table__virtual-cell {
      border-right: $semantic-border-width-1 solid $semantic-color-border-subtle;
    }
  }
  
  &--minimal {
    box-shadow: none;
    border-radius: 0;
    
    .ui-enhanced-table__header {
      border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
    }
  }
  
  // Size variants
  &--compact {
    .ui-enhanced-table__header-cell,
    .ui-enhanced-table__cell,
    .ui-enhanced-table__virtual-cell {
      padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
      font-size: map-get($semantic-typography-body-small, font-size);
      line-height: map-get($semantic-typography-body-small, line-height);
    }
  }
  
  &--comfortable {
    .ui-enhanced-table__header-cell,
    .ui-enhanced-table__cell,
    .ui-enhanced-table__virtual-cell {
      padding: $semantic-spacing-component-lg $semantic-spacing-component-md;
      font-size: map-get($semantic-typography-body-large, font-size);
      line-height: map-get($semantic-typography-body-large, line-height);
    }
  }
  
  // States
  &--sticky-header {
    .ui-enhanced-table__header {
      position: sticky;
      top: 0;
      z-index: $semantic-z-index-dropdown;
      background: $semantic-color-surface-elevated;
      box-shadow: $semantic-shadow-elevation-1;
    }
  }
  
  &--loading {
    pointer-events: none;
    
    .ui-enhanced-table__loading-overlay {
      opacity: 1;
      visibility: visible;
    }
  }
  
  &--virtual {
    .ui-enhanced-table__scroll-container {
      overflow-y: auto;
    }
  }
}

// Filter Row
.ui-enhanced-table__filter-row {
  display: flex;
  background: $semantic-color-surface-secondary;
  border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
  padding: $semantic-spacing-component-sm 0;
  gap: $semantic-spacing-component-xs;
}

.ui-enhanced-table__filter-cell {
  padding: 0 $semantic-spacing-component-sm;
  flex-shrink: 0;
}

.ui-enhanced-table__filter-input,
.ui-enhanced-table__filter-select {
  width: 100%;
  padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  border: $semantic-border-width-1 solid $semantic-color-border-primary;
  border-radius: $semantic-border-input-radius;
  background: $semantic-color-surface-primary;
  color: $semantic-color-text-primary;
  font-size: map-get($semantic-typography-body-small, font-size);
  font-family: map-get($semantic-typography-body-small, font-family);
  line-height: map-get($semantic-typography-body-small, line-height);
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  
  &:focus {
    outline: none;
    border-color: $semantic-color-focus;
    box-shadow: 0 0 0 2px $semantic-color-focus;
  }
  
  &::placeholder {
    color: $semantic-color-text-tertiary;
  }
}

// Scroll Container
.ui-enhanced-table__scroll-container {
  position: relative;
  overflow-x: auto;
  max-height: 600px;
}

// Header
.ui-enhanced-table__header {
  background: $semantic-color-surface-elevated;
  border-bottom: $semantic-border-width-2 solid $semantic-color-border-primary;
}

.ui-enhanced-table__header-row {
  display: flex;
  min-width: 100%;
}

.ui-enhanced-table__header-cell {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: $semantic-spacing-component-md;
  background: $semantic-color-surface-elevated;
  border-right: $semantic-border-width-1 solid $semantic-color-border-subtle;
  font-weight: $semantic-typography-font-weight-semibold;
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-family: map-get($semantic-typography-body-medium, font-family);
  line-height: map-get($semantic-typography-body-medium, line-height);
  color: $semantic-color-text-primary;
  flex-shrink: 0;
  user-select: none;
  
  &--sortable {
    cursor: pointer;
    transition: background-color $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &:hover {
      background: $semantic-color-surface-secondary;
    }
  }
  
  &--sorted {
    background: $semantic-color-surface-secondary;
  }
  
  &--draggable {
    cursor: grab;
    
    &:active {
      cursor: grabbing;
    }
  }
  
  &:last-child {
    border-right: none;
  }
}

.ui-enhanced-table__header-content {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-xs;
  flex: 1;
}

.ui-enhanced-table__header-text {
  font-weight: $semantic-typography-font-weight-semibold;
}

.ui-enhanced-table__sort-indicators {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.ui-enhanced-table__sort-indicator {
  display: inline-flex;
  align-items: center;
  font-size: 12px;
  color: $semantic-color-primary;
  font-weight: $semantic-typography-font-weight-bold;
  
  sup {
    font-size: 8px;
    margin-left: 2px;
  }
  
  &[data-direction="asc"] {
    color: $semantic-color-success;
  }
  
  &[data-direction="desc"] {
    color: $semantic-color-danger;
  }
}

// Resize Handle
.ui-enhanced-table__resize-handle {
  position: absolute;
  top: 0;
  right: 0;
  width: 4px;
  height: 100%;
  background: transparent;
  cursor: col-resize;
  z-index: 1;
  
  &::before {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 2px;
    height: 20px;
    background: $semantic-color-border-secondary;
    opacity: 0;
    transition: opacity $semantic-motion-duration-fast $semantic-motion-easing-ease;
  }
  
  &:hover::before {
    opacity: 1;
  }
}

// Virtual Viewport
.ui-enhanced-table__virtual-viewport {
  position: relative;
  overflow-y: auto;
}

// Rows (Traditional and Virtual)
.ui-enhanced-table__body {
  background: $semantic-color-surface-primary;
}

.ui-enhanced-table__row,
.ui-enhanced-table__virtual-row {
  display: flex;
  min-width: 100%;
  transition: background-color $semantic-motion-duration-fast $semantic-motion-easing-ease;
  
  &--hover:hover {
    background: $semantic-color-surface-secondary;
  }
  
  &--selected {
    background: rgba($semantic-color-primary, 0.1);
    border-left: 3px solid $semantic-color-primary;
  }
  
  &--striped {
    background: $semantic-color-surface-secondary;
  }
}

// Cells
.ui-enhanced-table__cell,
.ui-enhanced-table__virtual-cell {
  display: flex;
  align-items: center;
  padding: $semantic-spacing-component-md;
  border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-family: map-get($semantic-typography-body-medium, font-family);
  line-height: map-get($semantic-typography-body-medium, line-height);
  color: $semantic-color-text-primary;
  flex-shrink: 0;
  overflow: hidden;
}

.ui-enhanced-table__cell-content {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

// Empty State
.ui-enhanced-table__empty-row {
  display: flex;
  justify-content: center;
  padding: $semantic-spacing-layout-section-lg;
}

.ui-enhanced-table__empty-cell {
  text-align: center;
}

.ui-enhanced-table__empty-content {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: $semantic-spacing-component-md;
}

.ui-enhanced-table__empty-text {
  font-size: map-get($semantic-typography-body-large, font-size);
  font-family: map-get($semantic-typography-body-large, font-family);
  color: $semantic-color-text-tertiary;
}

// Loading Overlay
.ui-enhanced-table__loading-overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba($semantic-color-backdrop, 0.5);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: $semantic-spacing-component-md;
  opacity: 0;
  visibility: hidden;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  z-index: $semantic-z-index-overlay;
  backdrop-filter: blur(2px);
}

.ui-enhanced-table__loading-spinner {
  width: 32px;
  height: 32px;
  border: 3px solid $semantic-color-border-subtle;
  border-top: 3px solid $semantic-color-primary;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

.ui-enhanced-table__loading-text {
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-family: map-get($semantic-typography-body-medium, font-family);
  color: $semantic-color-text-primary;
  font-weight: $semantic-typography-font-weight-medium;
}

// Column Reorder Ghost
.ui-enhanced-table__column-ghost {
  position: fixed;
  padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
  background: $semantic-color-primary;
  color: $semantic-color-on-primary;
  border-radius: $semantic-border-input-radius;
  font-size: map-get($semantic-typography-body-small, font-size);
  font-family: map-get($semantic-typography-body-small, font-family);
  font-weight: $semantic-typography-font-weight-medium;
  box-shadow: $semantic-shadow-elevation-3;
  pointer-events: none;
  z-index: $semantic-z-index-modal;
  transform: translate(-50%, -100%);
  opacity: 0.9;
}

// Animations
@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

// Responsive Design
@media (max-width: 768px) {
  .ui-enhanced-table-container {
    font-size: map-get($semantic-typography-body-small, font-size);
    
    .ui-enhanced-table__header-cell,
    .ui-enhanced-table__cell,
    .ui-enhanced-table__virtual-cell {
      padding: $semantic-spacing-component-sm;
    }
    
    .ui-enhanced-table__filter-row {
      padding: $semantic-spacing-component-xs 0;
    }
    
    .ui-enhanced-table__resize-handle {
      width: 8px; // Larger touch target
    }
  }
  
  .ui-enhanced-table__scroll-container {
    overflow-x: scroll;
    -webkit-overflow-scrolling: touch;
  }
}

// Accessibility
@media (prefers-reduced-motion: reduce) {
  .ui-enhanced-table__header-cell,
  .ui-enhanced-table__row,
  .ui-enhanced-table__virtual-row,
  .ui-enhanced-table__cell,
  .ui-enhanced-table__virtual-cell,
  .ui-enhanced-table__filter-input,
  .ui-enhanced-table__filter-select,
  .ui-enhanced-table__loading-overlay,
  .ui-enhanced-table__resize-handle::before {
    transition-duration: 0ms;
    animation-duration: 0ms;
  }
  
  .ui-enhanced-table__loading-spinner {
    animation: none;
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .ui-enhanced-table-container {
    border: $semantic-border-width-2 solid $semantic-color-text-primary;
  }
  
  .ui-enhanced-table__header-cell,
  .ui-enhanced-table__cell,
  .ui-enhanced-table__virtual-cell {
    border-color: $semantic-color-text-primary;
  }
  
  .ui-enhanced-table__filter-input,
  .ui-enhanced-table__filter-select {
    border-color: $semantic-color-text-primary;
  }
}

// Print styles
@media print {
  .ui-enhanced-table-container {
    box-shadow: none;
    border: $semantic-border-width-1 solid $semantic-color-text-primary;
  }
  
  .ui-enhanced-table__filter-row,
  .ui-enhanced-table__loading-overlay,
  .ui-enhanced-table__resize-handle,
  .ui-enhanced-table__column-ghost {
    display: none !important;
  }
  
  .ui-enhanced-table__header {
    background: white !important;
  }
  
  .ui-enhanced-table__row,
  .ui-enhanced-table__virtual-row {
    break-inside: avoid;
  }
}

// Focus management for keyboard navigation
.ui-enhanced-table__header-cell:focus-visible,
.ui-enhanced-table__row:focus-visible,
.ui-enhanced-table__virtual-row:focus-visible {
  outline: 2px solid $semantic-color-focus;
  outline-offset: -2px;
}Tx;?ngqFbQjniF9} XxZ{o8?bλ$Ԗ&i7n6i=nsuCDBRҜ=(ɏ-bIf83!C"a),"o1.\I<4^$8e$.`V0eIke!a}/azuTxEIGg!mC*]"]H	N{GNѸH%jƒl=D(a®eG9G@@BDȸȲ<[@Q| ͙X8O('! e}J>laڮIvP6mb3|	U$"|p>P8%ALYg$?I)@QzɽG8=#Fsz+r%1+&|p
K+,P[>dBab$r!ܰ3~I`2F}MfPW3Z\4A$Tk;I|QmKRY]ޡɝ*iPn &sx6R*Pp=\B)ju_T&d.CH	0c_v:>07;&
btPq?
&, b7Xw6n.W88"a6NQaGZT$yQJxWujSYv?ꯘarN،ζ/y~8G]Tm&'+D=4N6,4`:iU;tbiڞ}vL1K72^,\Oo0`(M Bz*Uw0e+r7kY~^7N17O])T)X'a#($I'2JRa
H]Gp=8L0'H4Mmb>ɍwp2	a|=v{oL~q'{'h4yFb_Jn^*oAbqЩ@띓i[XKiN^bڇ83F*pQfWnVuyd\_Mq_nuCyV (tNFMBܟ$Fӷzݮ;~MaTR]PN;V'(Ǟk8KT .УĐ6+j8MQ8\6aÚ!5Śh6" ]OGwBa/~z'?kXPcv(?V c p^=oņv.X#[O$"JA -#1rRux	&X	6˳^o=6CNYa_іLEF6Vz=F=vj6l&aA;b#SĢ)0ܑ
͏d!67h65ҴZ/MҸ>b9m^хpW1-ƍS}o[>?bc<:2"cl)ѣXEE-!ŚU/>*Uq\ѐ,X^-(_ln99Z?%ISᔆ
IX`[ ]NWCCWپpKAyEMaތ7;1Y="X<-ߙ7j{[+~R#V8Ea2i)_`$ x6O~'@"`+jxxj#/OcO/4m^HyGϫ)+"5mjՋmSrJ^xUZݦQf"maY<U2&l*J[סZniO|ľJT@dA#29@s+urvJ<)q2FΗ?8&uA$P S)NL;I[9ӂwh%5{T3KWRecnr=!KFGYO+	G8h&ܑwr8m~c%Lp9neRFUTⴣ6qA}qD]S(Y-
ʌ*`[㫢wLOO OTrԒm5z˟ a_qŵ}([޵ 
&%Pqmˏ rއ'*Q)F.	|U+)YyKh>k&Wj5e"|TRY-+6IT``l#oz{L3A,仏IackR*A!EJ(I)={ 1E]NP}S%
f;n"y$802NηUQt]WOE8OHzZe&W,\!pܺYjmxpvnT5a%C̎SŽ.%dG	ƺӐ̀LAbLGD'C.Rۖ*1>?*F3IE_SR)	9ս~mgUKG]Topg+`~JkD@SնZ4g90f,?骁``KePfa؅ZNx	.demo-container {
  max-width: 1200px;
  margin: 0 auto;
  padding: 2rem;
}

.demo-section {
  margin-bottom: 3rem;
  
  h3 {
    margin-bottom: 1.5rem;
    color: #333;
    border-bottom: 2px solid #e0e0e0;
    padding-bottom: 0.5rem;
  }
}

.demo-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 2rem;
  margin-bottom: 2rem;
}

.demo-card {
  border: 1px solid #e0e0e0;
  border-radius: 8px;
  padding: 1.5rem;
  background: #fff;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  
  h4 {
    margin-top: 0;
    margin-bottom: 1rem;
    color: #555;
    font-size: 1.1rem;
    font-weight: 600;
  }
  
  h5 {
    margin-top: 1.5rem;
    margin-bottom: 0.5rem;
    color: #666;
    font-size: 1rem;
    font-weight: 600;
  }
}

.demo-content {
  border: 1px solid #f0f0f0;
  padding: 1rem;
  background: #fafafa;
  border-radius: 4px;
  min-height: 200px;
  
  p {
    margin-bottom: 1rem;
    line-height: 1.6;
    text-align: justify;
    
    &:last-child {
      margin-bottom: 0;
    }
  }
  
  ul {
    margin: 1rem 0;
    padding-left: 1.5rem;
    
    li {
      margin-bottom: 0.5rem;
      line-height: 1.5;
    }
  }
}

.demo-note {
  background: #e3f2fd;
  border: 1px solid #90caf9;
  border-radius: 4px;
  padding: 1rem;
  margin-bottom: 1rem;
  color: #1565c0;
  font-style: italic;
}

.demo-controls {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  margin-bottom: 1.5rem;
  padding: 1rem;
  background: #f5f5f5;
  border-radius: 8px;
  border: 1px solid #e0e0e0;
  
  label {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    font-weight: 600;
    color: #333;
    
    &:has(input[type="checkbox"]) {
      flex-direction: row;
      align-items: center;
      gap: 0.5rem;
    }
  }
}

.demo-select {
  padding: 0.5rem;
  border: 1px solid #ccc;
  border-radius: 4px;
  background: white;
  font-size: 0.9rem;
  
  &:focus {
    outline: 2px solid #2196f3;
    outline-offset: 2px;
  }
}

// Responsive adjustments
@media (max-width: 768px) {
  .demo-container {
    padding: 1rem;
  }
  
  .demo-row {
    grid-template-columns: 1fr;
    gap: 1rem;
  }
  
  .demo-card {
    padding: 1rem;
  }
  
  .demo-controls {
    flex-direction: column;
    
    label {
      &:has(input[type="checkbox"]) {
        flex-direction: row;
      }
    }
  }
}:˾xaimport { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { ColumnComponent } from '../../../../../ui-essentials/src/lib/components/layout/column';

@Component({
  selector: 'ui-column-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, ColumnComponent],
  template: `
    <div class="demo-container">
      <h2>Column Layout Demo</h2>
      
      <!-- Column Count Variants -->
      <section class="demo-section">
        <h3>Column Counts</h3>
        <div class="demo-row">
          @for (count of columnCounts; track count) {
            <div class="demo-card">
              <h4>{{ count }} Column{{ count !== '1' ? 's' : '' }}</h4>
              <ui-column [count]="count" [gap]="'md'" class="demo-content">
                <p>{{ sampleText }}</p>
              </ui-column>
            </div>
          }
        </div>
      </section>
      
      <!-- Gap Variants -->
      <section class="demo-section">
        <h3>Gap Sizes (2 Columns)</h3>
        <div class="demo-row">
          @for (gap of gaps; track gap) {
            <div class="demo-card">
              <h4>Gap: {{ gap }}</h4>
              <ui-column [count]="'2'" [gap]="gap" class="demo-content">
                <p>{{ shortText }}</p>
              </ui-column>
            </div>
          }
        </div>
      </section>
      
      <!-- Rule Variants -->
      <section class="demo-section">
        <h3>Column Rules (3 Columns)</h3>
        <div class="demo-row">
          @for (rule of rules; track rule) {
            <div class="demo-card">
              <h4>Rule: {{ rule }}</h4>
              <ui-column [count]="'3'" [gap]="'lg'" [rule]="rule" [ruleWidth]="'2'" class="demo-content">
                <p>{{ mediumText }}</p>
              </ui-column>
            </div>
          }
        </div>
      </section>
      
      <!-- Fill Variants -->
      <section class="demo-section">
        <h3>Fill Types (3 Columns)</h3>
        <div class="demo-row">
          @for (fill of fills; track fill) {
            <div class="demo-card">
              <h4>Fill: {{ fill }}</h4>
              <ui-column [count]="'3'" [gap]="'md'" [fill]="fill" class="demo-content">
                <p>{{ variableText }}</p>
              </ui-column>
            </div>
          }
        </div>
      </section>
      
      <!-- Responsive Behavior -->
      <section class="demo-section">
        <h3>Responsive Layout</h3>
        <p class="demo-note">Resize your browser to see responsive column behavior</p>
        <div class="demo-card">
          <h4>Responsive 4-Column Layout</h4>
          <ui-column [count]="'4'" [gap]="'md'" [responsive]="true" [rule]="'solid'" class="demo-content">
            <h5>Section 1</h5>
            <p>{{ sampleText }}</p>
            <h5>Section 2</h5>
            <p>{{ shortText }}</p>
            <h5>Section 3</h5>
            <p>{{ mediumText }}</p>
            <h5>Section 4</h5>
            <p>{{ variableText }}</p>
          </ui-column>
        </div>
      </section>
      
      <!-- Real-world Example -->
      <section class="demo-section">
        <h3>Article Layout Example</h3>
        <div class="demo-card">
          <ui-column [count]="'2'" [gap]="'xl'" [rule]="'solid'" [ruleWidth]="'1'" class="demo-content">
            <h4>The Future of Web Development</h4>
            <p>{{ longText }}</p>
            <p>{{ mediumText }}</p>
            <h5>Key Benefits</h5>
            <ul>
              <li>Improved readability through better text flow</li>
              <li>Enhanced visual hierarchy with column structures</li>
              <li>Responsive design that adapts to screen sizes</li>
              <li>Better content organization for long-form text</li>
            </ul>
            <p>{{ shortText }}</p>
          </ui-column>
        </div>
      </section>
      
      <!-- Interactive Controls -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <div class="demo-controls">
          <label>
            Columns:
            <select [(ngModel)]="selectedCount" class="demo-select">
              @for (count of columnCounts; track count) {
                <option [value]="count">{{ count }}</option>
              }
            </select>
          </label>
          <label>
            Gap:
            <select [(ngModel)]="selectedGap" class="demo-select">
              @for (gap of gaps; track gap) {
                <option [value]="gap">{{ gap }}</option>
              }
            </select>
          </label>
          <label>
            Rule:
            <select [(ngModel)]="selectedRule" class="demo-select">
              @for (rule of rules; track rule) {
                <option [value]="rule">{{ rule }}</option>
              }
            </select>
          </label>
          <label>
            <input type="checkbox" [(ngModel)]="selectedResponsive">
            Responsive
          </label>
        </div>
        <div class="demo-card">
          <ui-column 
            [count]="selectedCount" 
            [gap]="selectedGap" 
            [rule]="selectedRule" 
            [ruleWidth]="'2'"
            [responsive]="selectedResponsive" 
            class="demo-content">
            <h4>Interactive Column Layout</h4>
            <p>{{ sampleText }}</p>
            <p>{{ mediumText }}</p>
            <p>{{ shortText }}</p>
          </ui-column>
        </div>
      </section>
    </div>
  `,
  styleUrl: './column-demo.component.scss'
})
export class ColumnDemoComponent {
  columnCounts = ['1', '2', '3', '4', '5', '6'] as const;
  gaps = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
  rules = ['none', 'solid', 'dashed', 'dotted'] as const;
  fills = ['auto', 'balance', 'balance-all'] as const;
  
  // Interactive controls
  selectedCount = '3' as const;
  selectedGap = 'md' as const;
  selectedRule = 'solid' as const;
  selectedResponsive = true;
  
  // Sample text content
  shortText = "This is a short paragraph to demonstrate column layout behavior with minimal text content.";
  
  mediumText = "This is a medium-length paragraph that provides a good example of how text flows within column layouts. It contains enough content to show wrapping and distribution across multiple columns while remaining readable.";
  
  sampleText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.";
  
  longText = "Web development has evolved significantly over the past decade, with new frameworks, tools, and methodologies emerging to help developers create more efficient and maintainable applications. Modern web development practices emphasize component-based architecture, responsive design, and accessibility as core principles. The adoption of TypeScript has brought static typing to JavaScript, reducing runtime errors and improving developer productivity. CSS Grid and Flexbox have revolutionized layout design, making it easier to create complex, responsive layouts without relying on external frameworks.";
  
  variableText = "This text demonstrates variable length content. Some paragraphs are longer, others shorter. This variation helps test how well the column layout handles different content lengths and maintains visual balance across columns.";
}F̋Fx ||+
sJI5Q1&e?xDimport { Component, OnInit, OnDestroy, ViewChild, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Router } from '@angular/router';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { 
  faHome, 
  faCog, 
  faUser, 
  faSearch, 
  faFile, 
  faEdit, 
  faEye, 
  faTools,
  faQuestion,
  faPlus,
  faSave,
  faCopy,
  faPaste,
  faUndo,
  faRedo,
  faKeyboard,
  faPalette,
  faRocket
} from '@fortawesome/free-solid-svg-icons';
import { Command, CommandCategory, CommandExecutionContext, CommandPaletteComponent, CommandPaletteService, createShortcuts, GlobalKeyboardDirective } from '../../../../../ui-essentials/src/lib/components/overlays/command-palette';


@Component({
  selector: 'ui-command-palette-demo',
  standalone: true,
  imports: [
    CommonModule, 
    FontAwesomeModule, 
    CommandPaletteComponent,
    GlobalKeyboardDirective
  ],
  template: `
    <div class="demo-container" uiGlobalKeyboard [shortcuts]="globalShortcuts" (shortcutTriggered)="handleGlobalShortcut($event)">
      <div class="demo-header">
        <h2 class="demo-title">
          <fa-icon [icon]="faPalette" class="demo-title-icon"></fa-icon>
          Command Palette Demo
        </h2>
        <p class="demo-description">
          A powerful command palette for quick navigation and actions. Press <kbd>Ctrl+K</kbd> (or <kbd>⌘K</kbd> on Mac) to open.
        </p>
      </div>

      <!-- Quick Start Section -->
      <section class="demo-section">
        <h3 class="demo-section-title">Quick Start</h3>
        <div class="demo-actions">
          <button 
            class="demo-button demo-button--primary"
            (click)="openCommandPalette()"
          >
            <fa-icon [icon]="faKeyboard"></fa-icon>
            Open Command Palette
          </button>
          
          <button 
            class="demo-button demo-button--secondary"
            (click)="registerSampleCommands()"
          >
            <fa-icon [icon]="faPlus"></fa-icon>
            Add Sample Commands
          </button>

          <button 
            class="demo-button demo-button--outline"
            (click)="clearCommands()"
          >
            Clear Commands
          </button>
        </div>
      </section>

      <!-- Configuration Section -->
      <section class="demo-section">
        <h3 class="demo-section-title">Configuration</h3>
        <div class="demo-config-grid">
          <div class="demo-config-item">
            <label class="demo-label">
              <input 
                type="checkbox" 
                [checked]="config.showCategories" 
                (change)="updateConfig('showCategories', $event)"
                class="demo-checkbox"
              />
              Show Categories
            </label>
          </div>

          <div class="demo-config-item">
            <label class="demo-label">
              <input 
                type="checkbox" 
                [checked]="config.showShortcuts" 
                (change)="updateConfig('showShortcuts', $event)"
                class="demo-checkbox"
              />
              Show Shortcuts
            </label>
          </div>

          <div class="demo-config-item">
            <label class="demo-label">
              <input 
                type="checkbox" 
                [checked]="config.showRecent" 
                (change)="updateConfig('showRecent', $event)"
                class="demo-checkbox"
              />
              Show Recent Commands
            </label>
          </div>

          <div class="demo-config-item">
            <label class="demo-label">
              Max Results:
              <input 
                type="number" 
                [value]="config.maxResults" 
                (input)="updateConfig('maxResults', $event)"
                class="demo-input"
                min="1"
                max="50"
              />
            </label>
          </div>

          <div class="demo-config-item">
            <label class="demo-label">
              Recent Limit:
              <input 
                type="number" 
                [value]="config.recentLimit" 
                (input)="updateConfig('recentLimit', $event)"
                class="demo-input"
                min="1"
                max="20"
              />
            </label>
          </div>

          <div class="demo-config-item">
            <label class="demo-label">
              Size:
              <select 
                [value]="paletteSize" 
                (change)="updatePaletteSize($event)"
                class="demo-select"
              >
                <option value="md">Medium</option>
                <option value="lg">Large</option>
                <option value="xl">Extra Large</option>
              </select>
            </label>
          </div>
        </div>
      </section>

      <!-- Features Section -->
      <section class="demo-section">
        <h3 class="demo-section-title">Features</h3>
        <div class="demo-features">
          <div class="demo-feature">
            <fa-icon [icon]="faKeyboard" class="demo-feature-icon"></fa-icon>
            <h4>Keyboard Navigation</h4>
            <p>Full keyboard support with arrow keys, Enter, and Escape</p>
          </div>

          <div class="demo-feature">
            <fa-icon [icon]="faSearch" class="demo-feature-icon"></fa-icon>
            <h4>Fuzzy Search</h4>
            <p>Intelligent search with typo tolerance and keyword matching</p>
          </div>

          <div class="demo-feature">
            <fa-icon [icon]="faRocket" class="demo-feature-icon"></fa-icon>
            <h4>Quick Actions</h4>
            <p>Execute commands instantly with global keyboard shortcuts</p>
          </div>

          <div class="demo-feature">
            <fa-icon [icon]="faCog" class="demo-feature-icon"></fa-icon>
            <h4>Categorization</h4>
            <p>Organize commands by category for better discoverability</p>
          </div>

          <div class="demo-feature">
            <fa-icon [icon]="faCopy" class="demo-feature-icon"></fa-icon>
            <h4>Recent Commands</h4>
            <p>Track and show recently used commands for quick access</p>
          </div>

          <div class="demo-feature">
            <fa-icon [icon]="faEye" class="demo-feature-icon"></fa-icon>
            <h4>Context Aware</h4>
            <p>Commands can be shown or hidden based on application state</p>
          </div>
        </div>
      </section>

      <!-- Usage Statistics -->
      <section class="demo-section">
        <h3 class="demo-section-title">Usage Statistics</h3>
        <div class="demo-stats">
          <div class="demo-stat">
            <div class="demo-stat-value">{{ registeredCommandsCount }}</div>
            <div class="demo-stat-label">Registered Commands</div>
          </div>
          <div class="demo-stat">
            <div class="demo-stat-value">{{ recentCommandsCount }}</div>
            <div class="demo-stat-label">Recent Commands</div>
          </div>
          <div class="demo-stat">
            <div class="demo-stat-value">{{ executionCount }}</div>
            <div class="demo-stat-label">Commands Executed</div>
          </div>
        </div>
      </section>

      <!-- Keyboard Shortcuts Guide -->
      <section class="demo-section">
        <h3 class="demo-section-title">Keyboard Shortcuts</h3>
        <div class="demo-shortcuts">
          <div class="demo-shortcut">
            <kbd class="demo-kbd">Ctrl</kbd> + <kbd class="demo-kbd">K</kbd>
            <span>Open Command Palette</span>
          </div>
          <div class="demo-shortcut">
            <kbd class="demo-kbd">↑</kbd> / <kbd class="demo-kbd">↓</kbd>
            <span>Navigate Results</span>
          </div>
          <div class="demo-shortcut">
            <kbd class="demo-kbd">Enter</kbd>
            <span>Execute Selected Command</span>
          </div>
          <div class="demo-shortcut">
            <kbd class="demo-kbd">Esc</kbd>
            <span>Close Palette</span>
          </div>
          <div class="demo-shortcut">
            <kbd class="demo-kbd">Tab</kbd>
            <span>Navigate Results (Alternative)</span>
          </div>
          <div class="demo-shortcut">
            <kbd class="demo-kbd">/</kbd>
            <span>Quick Search</span>
          </div>
        </div>
      </section>

      <!-- Command Palette Component -->
      <ui-command-palette
        #commandPalette
        [size]="paletteSize"
        [showFooter]="true"
        [autoFocus]="true"
        (opened)="onPaletteOpened()"
        (closed)="onPaletteClosed()"
        (commandExecuted)="onCommandExecuted($event)"
      />
    </div>
  `,
  styleUrl: './command-palette-demo.component.scss'
})
export class CommandPaletteDemoComponent implements OnInit, OnDestroy {
  @ViewChild('commandPalette') commandPalette!: CommandPaletteComponent;

  private router = inject(Router);
  private commandService = inject(CommandPaletteService);

  // Icons
  readonly faPalette = faPalette;
  readonly faKeyboard = faKeyboard;
  readonly faPlus = faPlus;
  readonly faSearch = faSearch;
  readonly faRocket = faRocket;
  readonly faCog = faCog;
  readonly faCopy = faCopy;
  readonly faEye = faEye;
  readonly faHome = faHome;
  readonly faUser = faUser;
  readonly faFile = faFile;
  readonly faEdit = faEdit;
  readonly faTools = faTools;
  readonly faQuestion = faQuestion;
  readonly faSave = faSave;
  readonly faUndo = faUndo;
  readonly faRedo = faRedo;
  readonly faPaste = faPaste;

  // Component state
  paletteSize: 'md' | 'lg' | 'xl' = 'lg';
  executionCount = 0;
  
  config = {
    showCategories: true,
    showShortcuts: true,
    showRecent: true,
    maxResults: 20,
    recentLimit: 5
  };

  globalShortcuts = [
    createShortcuts().commandPalette(),
    createShortcuts().quickSearch(),
    createShortcuts().create('/', { preventDefault: true })
  ];

  get registeredCommandsCount(): number {
    return this.commandService.commands().length;
  }

  get recentCommandsCount(): number {
    return this.commandService.recentCommands().length;
  }

  ngOnInit(): void {
    this.registerSampleCommands();
    this.applyConfig();
  }

  ngOnDestroy(): void {
    // Clean up registered commands
    this.commandService.clearCommands();
  }

  openCommandPalette(): void {
    this.commandPalette.open();
  }

  handleGlobalShortcut(event: any): void {
    const shortcut = event.shortcut;
    
    if (shortcut.key === 'k' && (shortcut.ctrlKey || shortcut.metaKey)) {
      this.commandPalette.toggle();
    } else if (shortcut.key === '/') {
      this.commandPalette.open();
    }
  }

  registerSampleCommands(): void {
    const sampleCommands: Command[] = [
      // Navigation Commands
      {
        id: 'nav-home',
        title: 'Go Home',
        description: 'Navigate to the home page',
        icon: faHome,
        category: CommandCategory.NAVIGATION,
        keywords: ['home', 'dashboard', 'main'],
        shortcut: ['Ctrl', 'H'],
        handler: () => this.showToast('Navigating to home...'),
        order: 1
      },
      {
        id: 'nav-profile',
        title: 'View Profile',
        description: 'Go to user profile page',
        icon: faUser,
        category: CommandCategory.NAVIGATION,
        keywords: ['profile', 'user', 'account'],
        handler: () => this.showToast('Opening profile...'),
        order: 2
      },
      {
        id: 'nav-settings',
        title: 'Open Settings',
        description: 'Access application settings',
        icon: faCog,
        category: CommandCategory.SETTINGS,
        keywords: ['settings', 'preferences', 'config'],
        shortcut: ['Ctrl', ','],
        handler: () => this.showToast('Opening settings...'),
        order: 1
      },

      // File Commands
      {
        id: 'file-new',
        title: 'New File',
        description: 'Create a new file',
        icon: faFile,
        category: CommandCategory.FILE,
        keywords: ['new', 'create', 'file', 'document'],
        shortcut: ['Ctrl', 'N'],
        handler: () => this.showToast('Creating new file...'),
        order: 1
      },
      {
        id: 'file-save',
        title: 'Save File',
        description: 'Save the current file',
        icon: faSave,
        category: CommandCategory.FILE,
        keywords: ['save', 'file', 'document'],
        shortcut: ['Ctrl', 'S'],
        handler: () => this.showToast('Saving file...'),
        order: 2
      },

      // Edit Commands
      {
        id: 'edit-copy',
        title: 'Copy',
        description: 'Copy selected content',
        icon: faCopy,
        category: CommandCategory.EDIT,
        keywords: ['copy', 'clipboard'],
        shortcut: ['Ctrl', 'C'],
        handler: () => this.showToast('Content copied!'),
        order: 1
      },
      {
        id: 'edit-paste',
        title: 'Paste',
        description: 'Paste from clipboard',
        icon: faPaste,
        category: CommandCategory.EDIT,
        keywords: ['paste', 'clipboard'],
        shortcut: ['Ctrl', 'V'],
        handler: () => this.showToast('Content pasted!'),
        order: 2
      },
      {
        id: 'edit-undo',
        title: 'Undo',
        description: 'Undo last action',
        icon: faUndo,
        category: CommandCategory.EDIT,
        keywords: ['undo', 'revert'],
        shortcut: ['Ctrl', 'Z'],
        handler: () => this.showToast('Action undone!'),
        order: 3
      },
      {
        id: 'edit-redo',
        title: 'Redo',
        description: 'Redo last undone action',
        icon: faRedo,
        category: CommandCategory.EDIT,
        keywords: ['redo', 'repeat'],
        shortcut: ['Ctrl', 'Y'],
        handler: () => this.showToast('Action redone!'),
        order: 4
      },

      // Search Commands
      {
        id: 'search-global',
        title: 'Global Search',
        description: 'Search across all content',
        icon: faSearch,
        category: CommandCategory.SEARCH,
        keywords: ['search', 'find', 'global'],
        shortcut: ['Ctrl', 'Shift', 'F'],
        handler: () => this.showToast('Opening global search...'),
        order: 1
      },

      // Tools Commands
      {
        id: 'tools-theme',
        title: 'Toggle Theme',
        description: 'Switch between light and dark theme',
        icon: faTools,
        category: CommandCategory.TOOLS,
        keywords: ['theme', 'dark', 'light', 'toggle'],
        handler: () => this.showToast('Theme toggled!'),
        order: 1
      },

      // Help Commands
      {
        id: 'help-docs',
        title: 'Documentation',
        description: 'Open help documentation',
        icon: faQuestion,
        category: CommandCategory.HELP,
        keywords: ['help', 'docs', 'documentation'],
        handler: () => this.showToast('Opening documentation...'),
        order: 1
      },

      // Action Commands
      {
        id: 'action-refresh',
        title: 'Refresh Page',
        description: 'Reload the current page',
        icon: faRocket,
        category: CommandCategory.ACTIONS,
        keywords: ['refresh', 'reload', 'update'],
        shortcut: ['F5'],
        handler: () => this.showToast('Page refreshed!'),
        order: 1
      }
    ];

    this.commandService.registerCommands(sampleCommands);
  }

  clearCommands(): void {
    this.commandService.clearCommands();
    this.commandService.clearRecentCommands();
  }

  updateConfig(key: string, event: Event): void {
    const target = event.target as HTMLInputElement;
    let value: any = target.type === 'checkbox' ? target.checked : 
                     target.type === 'number' ? parseInt(target.value, 10) : 
                     target.value;

    (this.config as any)[key] = value;
    this.applyConfig();
  }

  updatePaletteSize(event: Event): void {
    const target = event.target as HTMLSelectElement;
    this.paletteSize = target.value as 'md' | 'lg' | 'xl';
  }

  private applyConfig(): void {
    this.commandService.updateConfig({
      showCategories: this.config.showCategories,
      showShortcuts: this.config.showShortcuts,
      showRecent: this.config.showRecent,
      maxResults: this.config.maxResults,
      recentLimit: this.config.recentLimit
    });
  }

  onPaletteOpened(): void {
    console.log('Command palette opened');
  }

  onPaletteClosed(): void {
    console.log('Command palette closed');
  }

  onCommandExecuted(event: { commandId: string; context: CommandExecutionContext }): void {
    this.executionCount++;
    console.log('Command executed:', event);
  }

  private showToast(message: string): void {
    // Simple toast implementation for demo
    const toast = document.createElement('div');
    toast.className = 'demo-toast';
    toast.textContent = message;
    toast.style.cssText = `
      position: fixed;
      top: 20px;
      right: 20px;
      background: #333;
      color: white;
      padding: 12px 24px;
      border-radius: 6px;
      box-shadow: 0 4px 12px rgba(0,0,0,0.1);
      z-index: 10000;
      font-size: 14px;
      animation: slideIn 0.3s ease;
    `;
    
    document.body.appendChild(toast);
    
    setTimeout(() => {
      toast.style.animation = 'slideOut 0.3s ease forwards';
      setTimeout(() => document.body.removeChild(toast), 300);
    }, 3000);
  }
}8x@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.demo-wrapper {
  padding: $semantic-spacing-layout-md;
  width: 100%;
  max-width: 100%;
  overflow-x: hidden; // Prevent horizontal overflow
  box-sizing: border-box;
}

.demo-section {
  margin-bottom: $semantic-spacing-layout-xl;
  width: 100%;
  overflow-x: hidden; // Prevent horizontal overflow
  
  h2 {
    margin-bottom: $semantic-spacing-layout-md;
    color: $semantic-color-text-primary;
    font-size: 1.5rem;
    font-weight: 600;
    text-align: center;
  }
  
  h3 {
    margin-bottom: $semantic-spacing-component-lg;
    color: $semantic-color-text-primary;
    font-size: 1.25rem;
    font-weight: 600;
  }
  
  h4 {
    margin-bottom: $semantic-spacing-component-sm;
    color: $semantic-color-text-secondary;
    font-size: 1.125rem;
    font-weight: 500;
  }
}

.demo-containers-showcase {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-lg;
  margin-bottom: $semantic-spacing-layout-lg;
  width: 100%;
  max-width: 100%;
  overflow-x: hidden; // Prevent horizontal overflow
  box-sizing: border-box;
  
  // Ensure all child containers are properly constrained
  .ui-container {
    max-width: min(100%, var(--container-max-width, 100%));
    margin-left: auto;
    margin-right: auto;
  }
}

.demo-container-wrapper {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center; // Center the containers
  overflow-x: hidden; // Prevent horizontal overflow
}

.demo-label {
  font-size: 0.875rem;
  color: $semantic-color-text-secondary;
  margin-bottom: $semantic-spacing-component-xs;
  text-align: center;
  font-weight: 500;
}

.demo-container-outline {
  border: 2px dashed $semantic-color-border-subtle;
  background: rgba($semantic-color-container-primary, 0.05);
  max-width: 100%; // Ensure containers don't overflow their parent
  box-sizing: border-box; // Include padding and border in width calculation
  margin: 0 auto; // Center the container
  position: relative; // For proper positioning context
  
  // Ensure proper centering
  &.ui-container {
    margin-left: auto;
    margin-right: auto;
  }
  
  &.demo-container-tall {
    min-height: 150px;
  }
}

.demo-content {
  color: $semantic-color-text-primary;
  text-align: center;
  padding: $semantic-spacing-component-sm;
  width: 100%;
  max-width: 100%;
  box-sizing: border-box;
  overflow-wrap: break-word; // Handle long text properly
  word-wrap: break-word;
  
  &.hero-content {
    h2 {
      margin-bottom: $semantic-spacing-component-sm;
      color: $semantic-color-text-primary;
    }
    
    p {
      color: $semantic-color-text-secondary;
      font-size: 1.125rem;
    }
  }
}

.demo-variant-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: $semantic-spacing-grid-gap-lg;
}

.demo-variant-item {
  display: flex;
  flex-direction: column;
}

.demo-flex-item {
  background: $semantic-color-container-secondary;
  color: $semantic-color-on-container-secondary;
  padding: $semantic-spacing-component-sm;
  border-radius: $semantic-border-radius-sm;
  text-align: center;
  font-weight: 500;
  width: 100%; // Ensure flex items take full width
  max-width: 100%;
  box-sizing: border-box;
  flex-shrink: 0; // Prevent shrinking
}

.demo-grid-item {
  background: $semantic-color-container-tertiary;
  color: $semantic-color-on-container-tertiary;
  padding: $semantic-spacing-component-sm;
  border-radius: $semantic-border-radius-sm;
  text-align: center;
  font-weight: 500;
  min-height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.demo-paragraph {
  margin-bottom: $semantic-spacing-component-sm;
  color: $semantic-color-text-primary;
  line-height: 1.5;
  
  &:last-child {
    margin-bottom: 0;
  }
}

.demo-wide-content {
  white-space: nowrap;
  color: $semantic-color-text-primary;
  padding: $semantic-spacing-component-sm;
}

// Feature cards styling
:host ::ng-deep {
  .demo-section ui-container[variant="card"] {
    h3 {
      margin-bottom: $semantic-spacing-component-sm;
      color: $semantic-color-text-primary;
      font-size: 1.125rem;
      font-weight: 500;
    }
    
    p {
      color: $semantic-color-text-secondary;
      line-height: 1.5;
      margin: 0;
    }
  }
}

// Additional container demo specific styles
.demo-containers-showcase {
  // Ensure containers behave properly
  .ui-container {
    position: relative;
  }
  
  // Size-specific constraints to prevent overflow
  .ui-container--xs { --container-max-width: 475px; }
  .ui-container--sm { --container-max-width: 640px; }
  .ui-container--md { --container-max-width: 768px; }
  .ui-container--lg { --container-max-width: 1024px; }
  .ui-container--xl { --container-max-width: 1280px; }
  .ui-container--2xl { --container-max-width: 1536px; }
  .ui-container--full { --container-max-width: 100%; }
  
  // Fix flex container alignment issues
  .ui-container--flex {
    align-items: stretch; // Default to stretch for consistent layout
    
    &:not(.ui-container--flex-center):not(.ui-container--flex-start):not(.ui-container--flex-end) {
      align-items: stretch; // Force default alignment for flex containers
    }
  }
}

@media (max-width: 1024px) {
  // Force smaller containers on tablet
  .demo-containers-showcase .ui-container {
    max-width: min(100%, var(--container-max-width, 100%)) !important;
  }
}

@media (max-width: 768px) {
  .demo-variant-grid {
    grid-template-columns: 1fr;
    gap: $semantic-spacing-component-lg;
  }
  
  .demo-containers-showcase {
    gap: $semantic-spacing-component-md;
    
    // Force all containers to be full width on mobile
    .ui-container {
      max-width: 100% !important;
      width: 100% !important;
    }
  }
  
  .demo-wrapper {
    padding: $semantic-spacing-component-md;
  }
}.~qx{{Gw(gqFbQjniF}b W#x_(import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ContainerComponent } from '../../../../../ui-essentials/src/lib/components/layout/container/container.component';
import { GridSystemComponent } from '../../../../../ui-essentials/src/lib/components/layout/grid-system/grid-system.component';

@Component({
  selector: 'ui-container-demo',
  standalone: true,
  imports: [CommonModule, ContainerComponent, GridSystemComponent],
  template: `
    <div class="demo-wrapper">
      <h2>Container Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-containers-showcase">
          @for (size of sizes; track size) {
            <div class="demo-container-wrapper">
              <div class="demo-label">{{ size }} (max-width: {{ getMaxWidth(size) }})</div>
              <ui-container [size]="size" class="demo-container-outline">
                <div class="demo-content">{{ size }} container content</div>
              </ui-container>
            </div>
          }
        </div>
      </section>
      
      <!-- Variant Types -->
      <section class="demo-section">
        <h3>Container Variants</h3>
        
        <div class="demo-variant-grid">
          <div class="demo-variant-item">
            <h4>Default Container</h4>
            <ui-container size="md" class="demo-container-outline">
              <div class="demo-content">Basic container with standard padding and centering</div>
            </ui-container>
          </div>
          
          <div class="demo-variant-item">
            <h4>Card Container</h4>
            <ui-container size="md" variant="card">
              <div class="demo-content">Card-style container with background, border, and shadow</div>
            </ui-container>
          </div>
          
          <div class="demo-variant-item">
            <h4>Section Container</h4>
            <ui-container size="lg" variant="section" background="surface">
              <div class="demo-content">Section container with larger vertical padding for page sections</div>
            </ui-container>
          </div>
          
          <div class="demo-variant-item">
            <h4>Hero Container</h4>
            <ui-container size="xl" variant="hero" background="surface-elevated">
              <div class="demo-content hero-content">
                <h2>Hero Section</h2>
                <p>Large padding and centered content for hero sections</p>
              </div>
            </ui-container>
          </div>
        </div>
      </section>
      
      <!-- Flex Containers -->
      <section class="demo-section">
        <h3>Flex Container Variants</h3>
        
        <div class="demo-variant-grid">
          <div class="demo-variant-item">
            <h4>Flex Column (Default)</h4>
            <ui-container size="sm" variant="flex" class="demo-container-outline">
              <div class="demo-flex-item">Item 1</div>
              <div class="demo-flex-item">Item 2</div>
              <div class="demo-flex-item">Item 3</div>
            </ui-container>
          </div>
          
          <div class="demo-variant-item">
            <h4>Flex Row</h4>
            <ui-container size="sm" variant="flex" flexDirection="row" class="demo-container-outline">
              <div class="demo-flex-item">Item 1</div>
              <div class="demo-flex-item">Item 2</div>
              <div class="demo-flex-item">Item 3</div>
            </ui-container>
          </div>
          
          <div class="demo-variant-item">
            <h4>Flex Center</h4>
            <ui-container size="sm" variant="flex" flexJustify="center" class="demo-container-outline demo-container-tall">
              <div class="demo-flex-item">Centered</div>
              <div class="demo-flex-item">Content</div>
            </ui-container>
          </div>
          
          <div class="demo-variant-item">
            <h4>Flex Space Between</h4>
            <ui-container size="sm" variant="flex" flexDirection="row" flexJustify="between" class="demo-container-outline">
              <div class="demo-flex-item">Start</div>
              <div class="demo-flex-item">End</div>
            </ui-container>
          </div>
        </div>
      </section>
      
      <!-- Grid Containers -->
      <section class="demo-section">
        <h3>Grid Container Variants</h3>
        
        <div class="demo-variant-grid">
          <div class="demo-variant-item">
            <h4>Grid Auto</h4>
            <ui-container size="lg" variant="grid" gridColumns="auto" class="demo-container-outline">
              @for (item of getGridItems(6); track $index) {
                <div class="demo-grid-item">{{ item }}</div>
              }
            </ui-container>
          </div>
          
          <div class="demo-variant-item">
            <h4>Grid 3 Columns</h4>
            <ui-container size="lg" variant="grid" [gridColumns]="3" class="demo-container-outline">
              @for (item of getGridItems(6); track $index) {
                <div class="demo-grid-item">{{ item }}</div>
              }
            </ui-container>
          </div>
        </div>
      </section>
      
      <!-- Padding Variants -->
      <section class="demo-section">
        <h3>Padding Variants</h3>
        
        <div class="demo-variant-grid">
          @for (padding of paddingSizes; track padding) {
            <div class="demo-variant-item">
              <h4>Padding: {{ padding }}</h4>
              <ui-container size="sm" [padding]="padding" class="demo-container-outline">
                <div class="demo-content">{{ padding }} padding content</div>
              </ui-container>
            </div>
          }
        </div>
      </section>
      
      <!-- Background Variants -->
      <section class="demo-section">
        <h3>Background Variants</h3>
        
        <div class="demo-variant-grid">
          @for (bg of backgrounds; track bg) {
            <div class="demo-variant-item">
              <h4>Background: {{ bg }}</h4>
              <ui-container size="sm" [background]="bg" padding="md" class="demo-container-outline">
                <div class="demo-content">{{ bg }} background</div>
              </ui-container>
            </div>
          }
        </div>
      </section>
      
      <!-- Scrollable Container -->
      <section class="demo-section">
        <h3>Scrollable Containers</h3>
        
        <div class="demo-variant-grid">
          <div class="demo-variant-item">
            <h4>Vertical Scroll</h4>
            <ui-container size="sm" scrollable="y" customMaxHeight="200px" variant="card">
              @for (item of getLongContent(); track $index) {
                <p class="demo-paragraph">{{ item }}</p>
              }
            </ui-container>
          </div>
          
          <div class="demo-variant-item">
            <h4>Horizontal Scroll</h4>
            <ui-container size="sm" scrollable="x" variant="card">
              <div class="demo-wide-content">
                This is a very long line of content that will cause horizontal scrolling when it exceeds the container width. Keep reading to see the scroll behavior in action.
              </div>
            </ui-container>
          </div>
        </div>
      </section>
      
      <!-- Real World Example -->
      <section class="demo-section">
        <h3>Real World Example</h3>
        <ui-container size="lg" variant="section" background="surface">
          <ui-container size="md" variant="centered">
            <h2>Product Features</h2>
            <p>Discover what makes our product special</p>
            
            <ui-container variant="grid" [gridColumns]="3" customMaxWidth="800px">
              @for (feature of features; track feature.title) {
                <ui-container variant="card" padding="md">
                  <h3>{{ feature.title }}</h3>
                  <p>{{ feature.description }}</p>
                </ui-container>
              }
            </ui-container>
          </ui-container>
        </ui-container>
      </section>
    </div>
  `,
  styleUrl: './container-demo.component.scss'
})
export class ContainerDemoComponent {
  sizes: ('xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full')[] = ['xs', 'sm', 'md', 'lg', 'xl', '2xl', 'full'];
  paddingSizes: ('xs' | 'sm' | 'md' | 'lg' | 'xl' | 'none')[] = ['xs', 'sm', 'md', 'lg', 'xl', 'none'];
  backgrounds: ('transparent' | 'surface' | 'surface-secondary' | 'surface-elevated')[] = [
    'transparent', 'surface', 'surface-secondary', 'surface-elevated'
  ];
  
  features = [
    { title: 'Fast', description: 'Lightning-fast performance optimized for speed' },
    { title: 'Secure', description: 'Enterprise-grade security built from the ground up' },
    { title: 'Scalable', description: 'Grows with your business needs seamlessly' },
    { title: 'Reliable', description: '99.9% uptime guaranteed with redundant systems' },
    { title: 'Easy to Use', description: 'Intuitive interface designed for productivity' },
    { title: 'Supported', description: '24/7 customer support when you need it' }
  ];
  
  getMaxWidth(size: string): string {
    const sizes: Record<string, string> = {
      'xs': '475px',
      'sm': '640px', 
      'md': '768px',
      'lg': '1024px',
      'xl': '1280px',
      '2xl': '1536px',
      'full': 'none'
    };
    return sizes[size] || 'auto';
  }
  
  getGridItems(count: number): string[] {
    return Array.from({ length: count }, (_, i) => `Item ${i + 1}`);
  }
  
  getLongContent(): string[] {
    return [
      'This is paragraph 1 with some content to demonstrate vertical scrolling.',
      'This is paragraph 2 with more content to show how the container handles overflow.',
      'This is paragraph 3 continuing the demonstration of scrollable content.',
      'This is paragraph 4 adding even more content to ensure scrolling is needed.',
      'This is paragraph 5 with the final bit of content to complete the demo.',
      'This is paragraph 6 making sure we have enough content for scroll.',
      'This is paragraph 7 - almost done with our scrollable content demo.',
      'This is paragraph 8 - the last paragraph in our scrollable demo.'
    ];
  }
}BزmxpB䣌73 SZIx@use '../../../../../ui-design-system/src/styles/semantic' as semantic;

.conversion-demo {
  min-height: 100vh;
  background: semantic.$semantic-color-surface-primary;
}

.demo-section {
  padding: semantic.$semantic-spacing-layout-section-lg semantic.$semantic-spacing-container-card-padding;
  
  &:first-child {
    text-align: center;
    background: linear-gradient(135deg, semantic.$semantic-color-primary-container 0%, semantic.$semantic-color-tertiary-container 100%);
    border-bottom: 1px solid semantic.$semantic-color-border-subtle;
  }

  &:not(:first-child) {
    border-bottom: 1px solid semantic.$semantic-color-border-subtle;
  }
}

.demo-title {
  font-size: 3rem;
  font-weight: 600;
  color: semantic.$semantic-color-text-primary;
  margin-bottom: semantic.$semantic-spacing-content-paragraph;
}

.demo-description {
  font-size: 1.125rem;
  color: semantic.$semantic-color-text-secondary;
  max-width: 600px;
  margin: 0 auto;
  line-height: 1.6;
}

.demo-section-title {
  font-size: 1.875rem;
  font-weight: 600;
  color: semantic.$semantic-color-text-primary;
  margin-bottom: semantic.$semantic-spacing-content-paragraph;
  text-align: center;
}

.demo-section-description {
  font-size: 1.125rem;
  color: semantic.$semantic-color-text-secondary;
  text-align: center;
  max-width: 800px;
  margin: 0 auto semantic.$semantic-spacing-component-xl auto;
  line-height: 1.6;
}

.demo-example {
  margin-bottom: semantic.$semantic-spacing-layout-section-sm;

  &:last-child {
    margin-bottom: 0;
  }
}

.demo-example-title {
  font-size: 1.5rem;
  font-weight: 500;
  color: semantic.$semantic-color-text-primary;
  margin-bottom: semantic.$semantic-spacing-content-paragraph;
  text-align: center;
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
  gap: semantic.$semantic-spacing-component-xl;
  margin-bottom: semantic.$semantic-spacing-layout-section-sm;

  @media (max-width: 768px) {
    grid-template-columns: 1fr;
    gap: semantic.$semantic-spacing-content-paragraph;
  }
}

.footer-demo {
  background: semantic.$semantic-color-primary;
  padding: semantic.$semantic-spacing-component-xl;
  border-radius: 0.5rem;
  color: semantic.$semantic-color-on-primary;
}

// Component spacing adjustments
:host ::ng-deep {
  ui-cta-section {
    margin-bottom: semantic.$semantic-spacing-content-paragraph;
  }

  ui-pricing-table {
    margin-bottom: semantic.$semantic-spacing-content-paragraph;
  }

  ui-newsletter-signup {
    margin-bottom: semantic.$semantic-spacing-content-paragraph;
  }

  ui-contact-form {
    margin-bottom: semantic.$semantic-spacing-content-paragraph;
  }
}

// Responsive adjustments
@media (max-width: 768px) {
  .demo-section {
    padding: semantic.$semantic-spacing-layout-section-sm semantic.$semantic-spacing-container-card-padding;
  }

  .demo-title {
    font-size: 2.25rem;
  }

  .demo-section-title {
    font-size: 1.875rem;
  }

  .demo-grid {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 480px) {
  .demo-section {
    padding: semantic.$semantic-spacing-layout-section-xs semantic.$semantic-spacing-container-card-padding;
  }

  .demo-title {
    font-size: 1.875rem;
  }

  .demo-section-title {
    font-size: 1.5rem;
  }

  .demo-example-title {
    font-size: 1.25rem;
  }
}ax'import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
// Temporarily commented out until ui-landing-pages is built
// import { 
//   CTASectionComponent, 
//   PricingTableComponent, 
//   NewsletterSignupComponent, 
//   ContactFormComponent 
// } from 'ui-landing-pages';
// import {
//   CTASectionConfig,
//   PricingTableConfig,
//   NewsletterSignupConfig,
//   ContactFormConfig
// } from 'ui-landing-pages';

@Component({
  selector: 'app-conversion-demo',
  standalone: true,
  imports: [
    CommonModule,
    // Temporarily commented out until ui-landing-pages is built
    // CTASectionComponent,
    // PricingTableComponent,
    // NewsletterSignupComponent,
    // ContactFormComponent
  ],
  template: `
    <div class="conversion-demo">
      <div class="demo-section">
        <h1 class="demo-title">Conversion Components Demo</h1>
        <p class="demo-description">
          Phase 3 components focused on user actions and conversions, including CTAs, pricing tables, newsletter signups, and contact forms.
        </p>
        <div class="under-construction">
          <p><strong>🚧 Under Construction:</strong> This demo is temporarily disabled while the ui-landing-pages library is being built.</p>
        </div>
      </div>

      <!-- Temporarily commented out until ui-landing-pages is built -->
  `,
  styleUrls: ['./conversion-demo.component.scss']
})
export class ConversionDemoComponent {
  
  // CTA Section Configurations
  // Temporarily commented out until ui-landing-pages is built
  /*
  ctaConfigGradient: CTASectionConfig = {
    title: "Transform Your Business Today",
    description: "Join thousands of companies already using our platform to accelerate growth and increase efficiency.",
    backgroundType: 'gradient',
    ctaPrimary: {
      text: 'Start Free Trial',
      variant: 'filled',
      action: () => console.log('Primary CTA clicked')
    },
    ctaSecondary: {
      text: 'Watch Demo',
      variant: 'outlined',
      action: () => console.log('Secondary CTA clicked')
    },
    urgency: {
      type: 'countdown',
      text: 'Limited Time Offer Ends In:',
      endDate: new Date(Date.now() + 5 * 24 * 60 * 60 * 1000) // 5 days from now
    }
  };

  ctaConfigPattern: CTASectionConfig = {
    title: "Don't Miss Out on This Exclusive Deal",
    description: "Get 50% off your first year and unlock premium features.",
    backgroundType: 'pattern',
    ctaPrimary: {
      text: 'Claim Offer Now',
      variant: 'filled',
      action: () => console.log('Pattern CTA clicked')
    },
    urgency: {
      type: 'limited-offer',
      text: 'Flash Sale',
      remaining: 12
    }
  };

  ctaConfigSolid: CTASectionConfig = {
    title: "Join Over 10,000 Happy Customers",
    description: "See why businesses trust us with their most important processes.",
    backgroundType: 'solid',
    ctaPrimary: {
      text: 'Get Started',
      variant: 'filled',
      action: () => console.log('Solid CTA clicked')
    },
    urgency: {
      type: 'social-proof',
      text: '🔥 142 people signed up in the last 24 hours'
    }
  };

  // Pricing Table Configuration
  pricingConfig: PricingTableConfig = {
    billingToggle: {
      monthlyLabel: 'Monthly',
      yearlyLabel: 'Yearly',
      discountText: 'Save 20%'
    },
    featuresComparison: true,
    highlightedPlan: 'pro',
    plans: [
      {
        id: 'starter',
        name: 'Starter',
        description: 'Perfect for small teams getting started',
        price: {
          monthly: 29,
          yearly: 24,
          currency: '$',
          suffix: '/month'
        },
        features: [
          { name: 'Up to 5 team members', included: true },
          { name: '10GB storage', included: true },
          { name: 'Basic reporting', included: true },
          { name: 'Email support', included: true },
          { name: 'Advanced analytics', included: false },
          { name: 'API access', included: false },
          { name: 'Priority support', included: false }
        ],
        cta: {
          text: 'Start Free Trial',
          action: () => console.log('Starter plan selected')
        }
      },
      {
        id: 'pro',
        name: 'Professional',
        description: 'Best for growing businesses',
        badge: 'Most Popular',
        popular: true,
        price: {
          monthly: 79,
          yearly: 63,
          currency: '$',
          suffix: '/month'
        },
        features: [
          { name: 'Up to 25 team members', included: true },
          { name: '100GB storage', included: true },
          { name: 'Advanced reporting', included: true, highlight: true },
          { name: 'Email & chat support', included: true },
          { name: 'Advanced analytics', included: true, highlight: true },
          { name: 'API access', included: true },
          { name: 'Priority support', included: false }
        ],
        cta: {
          text: 'Start Free Trial',
          action: () => console.log('Pro plan selected')
        }
      },
      {
        id: 'enterprise',
        name: 'Enterprise',
        description: 'For large organizations with custom needs',
        price: {
          monthly: 199,
          yearly: 159,
          currency: '$',
          suffix: '/month'
        },
        features: [
          { name: 'Unlimited team members', included: true },
          { name: 'Unlimited storage', included: true },
          { name: 'Custom reporting', included: true },
          { name: '24/7 phone support', included: true },
          { name: 'Advanced analytics', included: true },
          { name: 'Full API access', included: true },
          { name: 'Priority support', included: true, highlight: true }
        ],
        cta: {
          text: 'Contact Sales',
          variant: 'outlined',
          action: () => console.log('Enterprise plan selected')
        }
      }
    ]
  };

  // Newsletter Signup Configurations
  newsletterConfigInline: NewsletterSignupConfig = {
    title: "Stay Updated with Our Newsletter",
    description: "Get the latest insights, tips, and updates delivered to your inbox.",
    placeholder: "Enter your email address",
    ctaText: "Subscribe",
    variant: 'inline',
    successMessage: "Thanks for subscribing! Check your email for confirmation."
  };

  newsletterConfigModal: NewsletterSignupConfig = {
    title: "Join Our Community",
    description: "Be the first to know about new features and exclusive content.",
    placeholder: "Your email address",
    ctaText: "Join Now",
    variant: 'modal',
    successMessage: "Welcome aboard! You're now part of our community."
  };

  newsletterConfigFooter: NewsletterSignupConfig = {
    title: "Newsletter Signup",
    description: "Weekly insights and updates from our team.",
    placeholder: "Email address",
    ctaText: "Sign Up",
    variant: 'footer',
    showPrivacyCheckbox: true,
    privacyText: "We respect your privacy and will never spam you.",
    successMessage: "Successfully subscribed! Welcome to our newsletter."
  };

  // Contact Form Configurations
  contactConfigTwoColumn: ContactFormConfig = {
    title: "Get in Touch",
    description: "We'd love to hear from you. Send us a message and we'll respond as soon as possible.",
    layout: 'two-column',
    submitText: 'Send Message',
    successMessage: "Thank you for your message! We'll get back to you within 24 hours.",
    validation: {},
    fields: [
      {
        type: 'text',
        name: 'firstName',
        label: 'First Name',
        placeholder: 'John',
        required: true
      },
      {
        type: 'text',
        name: 'lastName',
        label: 'Last Name',
        placeholder: 'Doe',
        required: true
      },
      {
        type: 'email',
        name: 'email',
        label: 'Email',
        placeholder: 'john@example.com',
        required: true
      },
      {
        type: 'tel',
        name: 'phone',
        label: 'Phone Number',
        placeholder: '+1 (555) 123-4567',
        required: false
      },
      {
        type: 'select',
        name: 'subject',
        label: 'Subject',
        required: true,
        options: [
          { value: 'general', label: 'General Inquiry' },
          { value: 'support', label: 'Technical Support' },
          { value: 'sales', label: 'Sales Question' },
          { value: 'partnership', label: 'Partnership' }
        ]
      },
      {
        type: 'textarea',
        name: 'message',
        label: 'Message',
        placeholder: 'Tell us more about your inquiry...',
        required: true,
        rows: 5
      }
    ]
  };

  contactConfigSingleColumn: ContactFormConfig = {
    title: "Quick Contact",
    layout: 'single-column',
    submitText: 'Submit',
    successMessage: "Message sent successfully!",
    validation: {},
    fields: [
      {
        type: 'text',
        name: 'name',
        label: 'Full Name',
        required: true
      },
      {
        type: 'email',
        name: 'email',
        label: 'Email Address',
        required: true
      },
      {
        type: 'textarea',
        name: 'message',
        label: 'Your Message',
        required: true,
        rows: 4
      },
      {
        type: 'checkbox',
        name: 'newsletter',
        label: 'Subscribe to our newsletter for updates',
        required: false
      }
    ]
  };

  contactConfigInline: ContactFormConfig = {
    layout: 'inline',
    submitText: 'Contact Us',
    successMessage: "We'll be in touch soon!",
    validation: {},
    fields: [
      {
        type: 'text',
        name: 'name',
        label: 'Name',
        placeholder: 'Your name',
        required: true
      },
      {
        type: 'email',
        name: 'email',
        label: 'Email',
        placeholder: 'your@email.com',
        required: true
      },
      {
        type: 'text',
        name: 'company',
        label: 'Company',
        placeholder: 'Your company',
        required: false
      }
    ]
  };

  onNewsletterSignup(data: any) {
    console.log('Newsletter signup:', data);
  }

  onContactFormSubmit(data: any) {
    console.log('Contact form submission:', data);
  }
  */
}{xd.demo-container {
  padding: 24px;
  max-width: 1400px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: 48px;
  
  h3 {
    margin-bottom: 24px;
    font-size: 1.5rem;
    font-weight: 600;
    color: #2d3748;
    border-bottom: 2px solid #e2e8f0;
    padding-bottom: 8px;
  }
}

.demo-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
  gap: 24px;
  margin-bottom: 24px;
}

.demo-card {
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  
  h4 {
    background: #f7fafc;
    padding: 16px;
    margin: 0;
    font-size: 1.1rem;
    font-weight: 600;
    color: #2d3748;
    border-bottom: 1px solid #e2e8f0;
  }
}

.dashboard-demo-container {
  height: 400px;
  overflow: hidden;
  border: 1px solid #e2e8f0;
  background: #f8f9fa;
  
  &--interactive {
    height: 600px;
    border: 2px solid #4299e1;
    border-radius: 8px;
    margin-top: 16px;
  }
}

.demo-controls {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  padding: 20px;
  background: #f8f9fa;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  margin-bottom: 16px;
  
  label {
    display: flex;
    flex-direction: column;
    gap: 4px;
    font-size: 0.875rem;
    font-weight: 500;
    color: #4a5568;
    
    select,
    input[type="checkbox"] {
      padding: 4px 8px;
      border: 1px solid #d2d6dc;
      border-radius: 4px;
      font-size: 0.875rem;
      
      &:focus {
        outline: 2px solid #4299e1;
        outline-offset: 2px;
      }
    }
    
    input[type="checkbox"] {
      width: auto;
      margin-top: 4px;
    }
  }
}

// Demo content styling for dashboard shell slots
.demo-content {
  padding: 20px;
  
  h4, h5 {
    margin-top: 0;
    margin-bottom: 16px;
    color: #2d3748;
  }
  
  p {
    margin-bottom: 16px;
    line-height: 1.6;
    color: #4a5568;
  }
  
  ul {
    margin-bottom: 16px;
    
    li {
      margin-bottom: 8px;
      line-height: 1.5;
      color: #4a5568;
    }
  }
}

// Sidebar demo styling
nav[slot="sidebar"] {
  h5 {
    margin: 0 0 16px 0;
    font-size: 1rem;
    font-weight: 600;
    color: #2d3748;
  }
  
  h6 {
    margin: 16px 0 8px 0;
    font-size: 0.875rem;
    font-weight: 600;
    color: #4a5568;
    text-transform: uppercase;
    letter-spacing: 0.05em;
  }
  
  ul {
    list-style: none;
    margin: 0;
    padding: 0;
    
    li {
      margin-bottom: 8px;
      
      span {
        display: block;
        padding: 8px 12px;
        border-radius: 6px;
        cursor: pointer;
        transition: all 0.2s ease;
        color: #4a5568;
        
        &:hover {
          background: #edf2f7;
          color: #2d3748;
        }
        
        &.active {
          background: #4299e1;
          color: white;
          font-weight: 500;
        }
      }
    }
  }
  
  .sidebar-section {
    margin-top: 24px;
    padding-top: 16px;
    border-top: 1px solid #e2e8f0;
  }
}

// Demo buttons
.demo-button {
  background: #4299e1;
  color: white;
  border: none;
  padding: 8px 16px;
  border-radius: 6px;
  font-size: 0.875rem;
  font-weight: 500;
  cursor: pointer;
  transition: all 0.2s ease;
  margin-right: 8px;
  margin-bottom: 8px;
  
  &:hover {
    background: #3182ce;
  }
  
  &:focus {
    outline: 2px solid #4299e1;
    outline-offset: 2px;
  }
  
  &.primary {
    background: #38a169;
    
    &:hover {
      background: #2f855a;
    }
  }
}

.demo-button-sm {
  background: transparent;
  color: #4a5568;
  border: 1px solid #e2e8f0;
  padding: 4px 8px;
  border-radius: 4px;
  font-size: 0.875rem;
  cursor: pointer;
  transition: all 0.2s ease;
  
  &:hover {
    background: #f7fafc;
    border-color: #cbd5e0;
  }
  
  &:focus {
    outline: 2px solid #4299e1;
    outline-offset: 2px;
  }
}

// Content area styling
.content-area {
  background: #f8f9fa;
  padding: 20px;
  border-radius: 8px;
  margin: 16px 0;
}

.metric-cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 16px;
  margin-top: 16px;
}

.metric-card {
  background: #ffffff;
  padding: 16px;
  border-radius: 6px;
  text-align: center;
  font-weight: 500;
  color: #2d3748;
  border: 1px solid #e2e8f0;
}

.chart-placeholder {
  background: #ffffff;
  padding: 40px;
  border-radius: 6px;
  text-align: center;
  color: #a0aec0;
  font-size: 1.125rem;
  border: 1px solid #e2e8f0;
  margin-top: 16px;
}

.user-list,
.project-list {
  background: #ffffff;
  border-radius: 6px;
  border: 1px solid #e2e8f0;
  margin-top: 16px;
}

.user-item,
.project-item {
  padding: 12px 16px;
  border-bottom: 1px solid #f1f5f9;
  color: #4a5568;
  
  &:last-child {
    border-bottom: none;
  }
  
  &:hover {
    background: #f8f9fa;
  }
}

.settings-groups {
  background: #ffffff;
  padding: 20px;
  border-radius: 6px;
  border: 1px solid #e2e8f0;
  margin-top: 16px;
}

.setting-group {
  margin-bottom: 20px;
  
  &:last-child {
    margin-bottom: 0;
  }
  
  h6 {
    margin: 0 0 8px 0;
    font-size: 0.875rem;
    font-weight: 600;
    color: #2d3748;
  }
  
  label {
    display: flex;
    align-items: center;
    gap: 8px;
    color: #4a5568;
    font-size: 0.875rem;
    cursor: pointer;
    
    input[type="checkbox"] {
      margin: 0;
    }
  }
}

.action-buttons {
  margin-top: 24px;
  padding-top: 16px;
  border-top: 1px solid #e2e8f0;
}

// Notification styling
.notification-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px;
  background: #ebf8ff;
  border: 1px solid #bee3f8;
  border-radius: 6px;
  color: #2b6cb0;
  font-size: 0.875rem;
  
  .dismiss-btn {
    background: none;
    border: none;
    color: #2b6cb0;
    cursor: pointer;
    font-size: 1.125rem;
    padding: 0;
    width: 20px;
    height: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    
    &:hover {
      background: #bee3f8;
      border-radius: 50%;
    }
  }
}

// Footer styling
.footer-detailed {
  display: flex;
  justify-content: space-between;
  width: 100%;
  
  .footer-section {
    display: flex;
    flex-direction: column;
    gap: 4px;
  }
}

// Usage information
.usage-info {
  background: #f8f9fa;
  padding: 24px;
  border-radius: 8px;
  border: 1px solid #e2e8f0;
  
  h4 {
    margin-top: 0;
    margin-bottom: 16px;
    color: #2d3748;
    font-size: 1.125rem;
  }
  
  ul {
    margin-bottom: 24px;
    
    li {
      margin-bottom: 8px;
      line-height: 1.6;
      color: #4a5568;
    }
  }
  
  code {
    background: #edf2f7;
    padding: 2px 6px;
    border-radius: 4px;
    font-family: 'Monaco', 'Consolas', monospace;
    font-size: 0.875rem;
    color: #2d3748;
  }
}

// Responsive adjustments
@media (max-width: 768px) {
  .demo-row {
    grid-template-columns: 1fr;
  }
  
  .dashboard-demo-container {
    &--interactive {
      height: 500px;
    }
  }
  
  .demo-controls {
    flex-direction: column;
    gap: 12px;
    
    label {
      flex-direction: row;
      align-items: center;
      justify-content: space-between;
    }
  }
}

@media (max-width: 480px) {
  .demo-container {
    padding: 16px;
  }
  
  .dashboard-demo-container {
    height: 300px;
    
    &--interactive {
      height: 400px;
    }
  }
}#Ds
xUimport { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { DashboardShellComponent } from '../../../../../ui-essentials/src/lib/components/layout/dashboard-shell/dashboard-shell.component';

@Component({
  selector: 'ui-dashboard-shell-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, DashboardShellComponent],
  template: `
    <div class="demo-container">
      <h2>Dashboard Shell Demo</h2>
      
      <!-- Variant Demonstrations -->
      <section class="demo-section">
        <h3>Visual Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <div class="demo-card">
              <h4>{{ variant | titlecase }}</h4>
              <div class="dashboard-demo-container">
                <ui-dashboard-shell 
                  [variant]="variant" 
                  sidebarWidth="sm" 
                  headerHeight="sm"
                  footerVariant="minimal">
                  
                  <div slot="header">
                    <h4>{{ variant | titlecase }} App</h4>
                  </div>
                  
                  <div slot="header-actions">
                    <span>🌙</span>
                    <span>🔔</span>
                    <span>👤</span>
                  </div>
                  
                  <nav slot="sidebar">
                    <ul>
                      <li>🏠 Dashboard</li>
                      <li>📊 Analytics</li>
                      <li>⚙️ Settings</li>
                    </ul>
                  </nav>
                  
                  <nav slot="breadcrumbs">
                    <span>Home / Dashboard / {{ variant | titlecase }}</span>
                  </nav>
                  
                  <div slot="notifications">
                    <p>📢 Welcome to {{ variant }} variant!</p>
                  </div>
                  
                  <div class="demo-content">
                    <h4>Main Content</h4>
                    <p>This is the main content area for {{ variant }} dashboard variant.</p>
                  </div>
                  
                  <div slot="footer">
                    <span>© 2024 Dashboard App</span>
                  </div>
                </ui-dashboard-shell>
              </div>
            </div>
          }
        </div>
      </section>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Configurations</h3>
        <div class="demo-row">
          @for (config of sizeConfigs; track config.name) {
            <div class="demo-card">
              <h4>{{ config.name }}</h4>
              <div class="dashboard-demo-container">
                <ui-dashboard-shell 
                  [sidebarWidth]="config.sidebarWidth" 
                  [headerHeight]="config.headerHeight"
                  [footerVariant]="config.footerVariant">
                  
                  <div slot="header">
                    <h4>{{ config.name }} Dashboard</h4>
                  </div>
                  
                  <div slot="header-actions">
                    <span>🔍</span>
                    <span>📱</span>
                  </div>
                  
                  <nav slot="sidebar">
                    <h5>Navigation</h5>
                    <ul>
                      <li>📈 Overview</li>
                      <li>📋 Tasks</li>
                      <li>💼 Projects</li>
                      <li>👥 Team</li>
                    </ul>
                  </nav>
                  
                  <nav slot="breadcrumbs">
                    <span>Dashboard / {{ config.name }} Layout</span>
                  </nav>
                  
                  <div class="demo-content">
                    <h4>{{ config.name }} Content</h4>
                    <p>Sidebar: {{ config.sidebarWidth }}, Header: {{ config.headerHeight }}, Footer: {{ config.footerVariant }}</p>
                  </div>
                  
                  <div slot="footer">
                    <span>{{ config.name }} Footer</span>
                    <span>v1.0.0</span>
                  </div>
                </ui-dashboard-shell>
              </div>
            </div>
          }
        </div>
      </section>
      
      <!-- Layout Options -->
      <section class="demo-section">
        <h3>Layout Options</h3>
        <div class="demo-row">
          <div class="demo-card">
            <h4>No Footer</h4>
            <div class="dashboard-demo-container">
              <ui-dashboard-shell 
                [showFooter]="false"
                sidebarWidth="sm">
                
                <div slot="header">
                  <h4>Clean Dashboard</h4>
                </div>
                
                <div slot="header-actions">
                  <span>🎨</span>
                </div>
                
                <nav slot="sidebar">
                  <ul>
                    <li>🖼️ Gallery</li>
                    <li>🎵 Music</li>
                    <li>📝 Notes</li>
                  </ul>
                </nav>
                
                <div class="demo-content">
                  <h4>Clean Layout</h4>
                  <p>Dashboard without footer for cleaner appearance.</p>
                </div>
              </ui-dashboard-shell>
            </div>
          </div>
          
          <div class="demo-card">
            <h4>Minimal UI</h4>
            <div class="dashboard-demo-container">
              <ui-dashboard-shell 
                [showBreadcrumbs]="false"
                [showNotifications]="false"
                sidebarWidth="sm"
                footerVariant="minimal">
                
                <div slot="header">
                  <h4>Minimal App</h4>
                </div>
                
                <div slot="header-actions">
                  <span>⚡</span>
                </div>
                
                <nav slot="sidebar">
                  <ul>
                    <li>🚀 Launch</li>
                    <li>📊 Stats</li>
                  </ul>
                </nav>
                
                <div class="demo-content">
                  <h4>Minimal Interface</h4>
                  <p>Streamlined dashboard without breadcrumbs and notifications.</p>
                </div>
                
                <div slot="footer">
                  <span>Minimal</span>
                </div>
              </ui-dashboard-shell>
            </div>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Dashboard</h3>
        <div class="demo-controls">
          <label>
            Variant:
            <select [(ngModel)]="interactiveVariant">
              <option value="default">Default</option>
              <option value="bordered">Bordered</option>
              <option value="elevated">Elevated</option>
            </select>
          </label>
          
          <label>
            Sidebar Width:
            <select [(ngModel)]="interactiveSidebarWidth">
              <option value="sm">Small</option>
              <option value="md">Medium</option>
              <option value="lg">Large</option>
            </select>
          </label>
          
          <label>
            Header Height:
            <select [(ngModel)]="interactiveHeaderHeight">
              <option value="sm">Small</option>
              <option value="md">Medium</option>
              <option value="lg">Large</option>
            </select>
          </label>
          
          <label>
            Footer Variant:
            <select [(ngModel)]="interactiveFooterVariant">
              <option value="minimal">Minimal</option>
              <option value="standard">Standard</option>
              <option value="detailed">Detailed</option>
            </select>
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="interactiveSidebarCollapsed">
            Sidebar Collapsed
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="interactiveMobileMenuOpen">
            Mobile Menu Open
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="interactiveShowFooter">
            Show Footer
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="interactiveShowBreadcrumbs">
            Show Breadcrumbs
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="interactiveShowNotifications">
            Show Notifications
          </label>
        </div>
        
        <div class="dashboard-demo-container dashboard-demo-container--interactive">
          <ui-dashboard-shell 
            [variant]="interactiveVariant"
            [sidebarWidth]="interactiveSidebarWidth"
            [headerHeight]="interactiveHeaderHeight"
            [footerVariant]="interactiveFooterVariant"
            [sidebarCollapsed]="interactiveSidebarCollapsed"
            [mobileMenuOpen]="interactiveMobileMenuOpen"
            [showFooter]="interactiveShowFooter"
            [showBreadcrumbs]="interactiveShowBreadcrumbs"
            [showNotifications]="interactiveShowNotifications"
            (sidebarToggled)="handleSidebarToggle($event)"
            (mobileMenuToggled)="handleMobileMenuToggle($event)"
            (mobileBackdropClicked)="handleMobileBackdropClick()">
            
            <div slot="header">
              <h4>Interactive Dashboard</h4>
            </div>
            
            <div slot="header-actions">
              <button (click)="toggleTheme()" class="demo-button-sm">
                {{ isDarkTheme ? '☀️' : '🌙' }}
              </button>
              <button (click)="showNotification()" class="demo-button-sm">
                🔔 {{ notificationCount }}
              </button>
              <button (click)="toggleSidebar()" class="demo-button-sm">
                {{ interactiveSidebarCollapsed ? '➡️' : '⬅️' }}
              </button>
            </div>
            
            <nav slot="sidebar">
              <h5>Main Navigation</h5>
              <ul>
                <li (click)="setActiveSection('dashboard')">
                  <span [class.active]="activeSection === 'dashboard'">🏠 Dashboard</span>
                </li>
                <li (click)="setActiveSection('analytics')">
                  <span [class.active]="activeSection === 'analytics'">📊 Analytics</span>
                </li>
                <li (click)="setActiveSection('users')">
                  <span [class.active]="activeSection === 'users'">👥 Users</span>
                </li>
                <li (click)="setActiveSection('projects')">
                  <span [class.active]="activeSection === 'projects'">💼 Projects</span>
                </li>
                <li (click)="setActiveSection('settings')">
                  <span [class.active]="activeSection === 'settings'">⚙️ Settings</span>
                </li>
              </ul>
              
              @if (!interactiveSidebarCollapsed) {
                <div class="sidebar-section">
                  <h6>Quick Actions</h6>
                  <button (click)="performAction('new')" class="demo-button">New Project</button>
                  <button (click)="performAction('export')" class="demo-button">Export Data</button>
                </div>
              }
            </nav>
            
            <nav slot="breadcrumbs">
              <span>Home / {{ activeSection | titlecase }} / {{ interactiveVariant | titlecase }}</span>
            </nav>
            
            <div slot="notifications">
              @if (hasNewNotifications) {
                <div class="notification-item">
                  <span>🎉 New feature available! Click to explore the {{ activeSection }} section.</span>
                  <button (click)="dismissNotification()" class="dismiss-btn">×</button>
                </div>
              }
            </div>
            
            <div class="demo-content">
              <h4>{{ activeSection | titlecase }} Section</h4>
              <p>Current configuration:</p>
              <ul>
                <li><strong>Variant:</strong> {{ interactiveVariant }}</li>
                <li><strong>Sidebar Width:</strong> {{ interactiveSidebarWidth }}</li>
                <li><strong>Header Height:</strong> {{ interactiveHeaderHeight }}</li>
                <li><strong>Footer Variant:</strong> {{ interactiveFooterVariant }}</li>
                <li><strong>Sidebar Collapsed:</strong> {{ interactiveSidebarCollapsed ? 'Yes' : 'No' }}</li>
                <li><strong>Theme:</strong> {{ isDarkTheme ? 'Dark' : 'Light' }}</li>
              </ul>
              
              <div class="content-area">
                <h5>{{ activeSection | titlecase }} Content</h5>
                @switch (activeSection) {
                  @case ('dashboard') {
                    <p>📈 Welcome to your dashboard overview. Here you can see key metrics and quick actions.</p>
                    <div class="metric-cards">
                      <div class="metric-card">Total Users: 1,234</div>
                      <div class="metric-card">Active Projects: 42</div>
                      <div class="metric-card">Revenue: $12,345</div>
                    </div>
                  }
                  @case ('analytics') {
                    <p>📊 Analytics and reporting section. View detailed insights about your application usage.</p>
                    <div class="chart-placeholder">📈 Chart Placeholder</div>
                  }
                  @case ('users') {
                    <p>👥 User management section. Manage user accounts, permissions, and profiles.</p>
                    <div class="user-list">
                      <div class="user-item">John Doe - Admin</div>
                      <div class="user-item">Jane Smith - User</div>
                      <div class="user-item">Bob Johnson - Manager</div>
                    </div>
                  }
                  @case ('projects') {
                    <p>💼 Project management section. Track and manage your ongoing projects.</p>
                    <div class="project-list">
                      <div class="project-item">🚀 Website Redesign - In Progress</div>
                      <div class="project-item">📱 Mobile App - Planning</div>
                      <div class="project-item">🔧 API Integration - Completed</div>
                    </div>
                  }
                  @case ('settings') {
                    <p>⚙️ Application settings and configuration options.</p>
                    <div class="settings-groups">
                      <div class="setting-group">
                        <h6>Appearance</h6>
                        <label>
                          <input type="checkbox" [(ngModel)]="isDarkTheme">
                          Dark Theme
                        </label>
                      </div>
                      <div class="setting-group">
                        <h6>Notifications</h6>
                        <label>
                          <input type="checkbox" [(ngModel)]="emailNotifications">
                          Email Notifications
                        </label>
                      </div>
                    </div>
                  }
                  @default {
                    <p>Select a section from the sidebar to view its content.</p>
                  }
                }
              </div>
              
              <div class="action-buttons">
                <button (click)="performAction('save')" class="demo-button primary">Save Changes</button>
                <button (click)="performAction('cancel')" class="demo-button">Cancel</button>
                <button (click)="performAction('refresh')" class="demo-button">Refresh Data</button>
              </div>
            </div>
            
            <div slot="footer">
              @if (interactiveFooterVariant === 'detailed') {
                <div class="footer-detailed">
                  <div class="footer-section">
                    <span>© 2024 Interactive Dashboard</span>
                    <span>Version 1.2.3</span>
                  </div>
                  <div class="footer-section">
                    <span>Last Updated: {{ lastUpdated }}</span>
                    <span>Status: {{ connectionStatus }}</span>
                  </div>
                </div>
              } @else if (interactiveFooterVariant === 'standard') {
                <span>© 2024 Interactive Dashboard - v1.2.3</span>
                <span>Status: {{ connectionStatus }}</span>
              } @else {
                <span>© 2024 Dashboard</span>
              }
            </div>
          </ui-dashboard-shell>
        </div>
      </section>
      
      <!-- Usage Examples -->
      <section class="demo-section">
        <h3>Usage Information</h3>
        <div class="usage-info">
          <h4>Key Features:</h4>
          <ul>
            <li>🏗️ Complete application shell structure</li>
            <li>📱 Mobile-responsive with hamburger menu</li>
            <li>🎨 Multiple visual variants (default, bordered, elevated)</li>
            <li>📏 Configurable sizing for header, sidebar, and footer</li>
            <li>🧭 Integrated breadcrumbs navigation</li>
            <li>🔔 Notifications area with live region support</li>
            <li>♿ Full accessibility support with ARIA labels</li>
            <li>🎛️ Flexible content projection slots</li>
            <li>⚡ Event emitters for user interactions</li>
          </ul>
          
          <h4>Content Projection Slots:</h4>
          <ul>
            <li><code>slot="header"</code> - Header title and branding</li>
            <li><code>slot="header-actions"</code> - Theme switcher, notifications, user menu</li>
            <li><code>slot="sidebar"</code> - Main navigation content</li>
            <li><code>slot="breadcrumbs"</code> - Breadcrumb navigation</li>
            <li><code>slot="notifications"</code> - System notifications and alerts</li>
            <li><code>slot="footer"</code> - Footer content and links</li>
            <li>Default slot - Main page content</li>
          </ul>
        </div>
      </section>
    </div>
  `,
  styleUrl: './dashboard-shell-demo.component.scss'
})
export class DashboardShellDemoComponent {
  variants = ['default', 'bordered', 'elevated'] as const;
  
  sizeConfigs = [
    { name: 'Compact', sidebarWidth: 'sm' as const, headerHeight: 'sm' as const, footerVariant: 'minimal' as const },
    { name: 'Standard', sidebarWidth: 'md' as const, headerHeight: 'md' as const, footerVariant: 'standard' as const },
    { name: 'Spacious', sidebarWidth: 'lg' as const, headerHeight: 'lg' as const, footerVariant: 'detailed' as const }
  ];
  
  // Interactive demo properties
  interactiveVariant: 'default' | 'bordered' | 'elevated' = 'default';
  interactiveSidebarWidth: 'sm' | 'md' | 'lg' = 'md';
  interactiveHeaderHeight: 'sm' | 'md' | 'lg' = 'md';
  interactiveFooterVariant: 'minimal' | 'standard' | 'detailed' = 'standard';
  interactiveSidebarCollapsed = false;
  interactiveMobileMenuOpen = false;
  interactiveShowFooter = true;
  interactiveShowBreadcrumbs = true;
  interactiveShowNotifications = true;
  
  // Demo state
  activeSection = 'dashboard';
  isDarkTheme = false;
  notificationCount = 3;
  hasNewNotifications = true;
  emailNotifications = true;
  lastUpdated = new Date().toLocaleTimeString();
  connectionStatus = 'Connected';
  
  handleSidebarToggle(collapsed: boolean): void {
    this.interactiveSidebarCollapsed = collapsed;
    console.log('Sidebar toggled:', collapsed);
  }
  
  handleMobileMenuToggle(open: boolean): void {
    this.interactiveMobileMenuOpen = open;
    console.log('Mobile menu toggled:', open);
  }
  
  handleMobileBackdropClick(): void {
    this.interactiveMobileMenuOpen = false;
    console.log('Mobile backdrop clicked - closing menu');
  }
  
  toggleSidebar(): void {
    this.interactiveSidebarCollapsed = !this.interactiveSidebarCollapsed;
  }
  
  toggleTheme(): void {
    this.isDarkTheme = !this.isDarkTheme;
    console.log('Theme toggled:', this.isDarkTheme ? 'dark' : 'light');
  }
  
  showNotification(): void {
    this.notificationCount++;
    this.hasNewNotifications = true;
    console.log('New notification added');
  }
  
  dismissNotification(): void {
    this.hasNewNotifications = false;
    console.log('Notification dismissed');
  }
  
  setActiveSection(section: string): void {
    this.activeSection = section;
    this.lastUpdated = new Date().toLocaleTimeString();
    console.log('Active section changed to:', section);
  }
  
  performAction(action: string): void {
    console.log('Action performed:', action);
    this.lastUpdated = new Date().toLocaleTimeString();
    
    switch (action) {
      case 'save':
        this.connectionStatus = 'Saving...';
        setTimeout(() => {
          this.connectionStatus = 'Saved';
          setTimeout(() => this.connectionStatus = 'Connected', 2000);
        }, 1000);
        break;
      case 'refresh':
        this.connectionStatus = 'Refreshing...';
        setTimeout(() => this.connectionStatus = 'Connected', 1500);
        break;
      case 'new':
      case 'export':
      case 'cancel':
        // Handle other actions
        break;
    }
  }
}&	}xcHSidebarLayoutIsidebar-layout/sidebar-layout+sidebar-layoutBCSidebarLayoutESidebar LayoutPosition	?Position VariantsqC~+9Left Sidebar (Default)</h4>
:idebar-sidebar-layout position="left"k$d(h5>Left ."<li>#<li>#<li>- O/2ain Content Area`0- with left sidebar navigationp/</ui-sidebar-layoutQ	mDRight Sidebar</h4>
:idebar-sidebar-layout position="right"k$d(h5>Right Panel</h5<li>Quick A!Fp2Recent Item1 Help`2P@2ain Content Area`0- with right sidebar panelp/</ui-sidebar-layoutQ	mz	*Width	Adebar WidthsqC~ width of widths; track width) {

	width.toUpperCase() }} Width`07sidebar-J$sidebar-layout [sidebarWidth]="width7`d((h5>{{ width.toUpperCase() }} Sidebar</h5QWidth: {{ width }}q0->$%Main content with {{ width }} sidebarp/</ui-sidebar-layouthVisual	?Psidebar-J"sidebar-layout [variant]="variant"k$8`d(h5
 Style</h5QItem One`2
Item Two`2

Item Three`2P@8'>$'Content area with {{ variant }} sidebarh7</ui-sidebar-layouthCollapse State	7Collapse StatesqC~+9Collapsed Sidebar</h4>
:idebar-7sidebar-layout [collapsed]="true" collapseMode="collaps@d(
h5>Nav</h5`2`2⚙️`2P@1Collapsed Mod)idebar is collapsed showing minimal widthp/</ui-sidebar-layoutQ	mDHidden Sidebar</h4>
:idebar-6sidebar-layout [collapsed]="true" collapseMode="hiddenA7`d(h5>Hidden Sidebar</h5- sidebar is hidden when collapsedp/1
Hidden Mod5idebar is completely hidden, content takes full widthp/</ui-sidebar-layoutQ	mz	*2UControlsqC	%Position.	Position"
left">Left'right">Right\Width.Width" z
xl">Extra a:O /Collapsed">
            GCollapse Mode.CollapseMode"collapsed">Collapsed'hidden">Hidden'overlay">Overlay;"$sidebar-demo-container sidebar"-;sidebar-layout 
            [position]="interactivePosition<#)Width"
o*#!collapsed]="interactive$'collapseMode]="interactiveCollapseMode"/ `d(Interactive Sidebar(naA"$ User1#*<li>❓ Help`2P_	n.09%emo`0@Use the controls above to test different sidebar configurations:q0!Positionq1Position?1%Widthq1:1*0L2"	Collapsed?1%Collapse Modeq1CollapseMode?1Ooo&O
                (click)="toggleCollapse()" 
                class="demo-buttonA',Collapsed ? 'Expand' : 'Collapse' }} Sidebar&%_	</ui-sidebar-layout>q	%Hsidebar-layoutI&JSidebarLayoutDemoComponent {
  widths = ['sm', 'md', 'lg', 'xl'] as const;FIAK,2Position: 'left' | 'right' = 'left';
  interactiveK| 'xlK2KG:L SCollapseMode: 'hidden' | 'collapsed' | 'overlay' = 'collapsed';
  
  toggleCollapseO-Collapsed = !this.interactiveCollapsed;
  }
};:Pxfimport { Component, ChangeDetectionStrategy, signal, computed } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { FilterConfig, SortConfig, GroupByResult } from '../../../../../ui-data-utils/src/lib/types';
import { sortBy, sortByMultiple } from '../../../../../ui-data-utils/src/lib/sorting';
import { filterBy, filterByMultiple, searchFilter } from '../../../../../ui-data-utils/src/lib/filtering';
import { getPaginationRange, paginate } from '../../../../../ui-data-utils/src/lib/pagination';
import { aggregate, groupBy, pivot, pluck, unique } from '../../../../../ui-data-utils/src/lib/transformation';


interface SampleData {
  id: number;
  name: string;
  department: string;
  salary: number;
  hireDate: string;
  active: boolean;
  skills: string[];
}

@Component({
  selector: 'ui-data-utils-demo',
  standalone: true,
  imports: [CommonModule, FormsModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>UI Data Utils Demo</h2>
      <p>Comprehensive demonstration of data manipulation utilities</p>

      <!-- Sample Data Display -->
      <section style="margin-bottom: 3rem;">
        <h3>Sample Employee Data ({{ sampleData.length }} records)</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; margin-bottom: 1rem;">
          <h4>Raw Data Preview:</h4>
          <pre style="max-height: 200px; overflow-y: auto;">{{ getSampleDataPreview() }}</pre>
        </div>
      </section>

      <!-- Sorting Utilities Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>🔄 Sorting Utilities</h3>
        
        <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;">
          <!-- Single Sort -->
          <div>
            <h4>Single Property Sort</h4>
            <div style="margin-bottom: 1rem;">
              <label>Sort by: </label>
              <select [(ngModel)]="sortField" (ngModelChange)="applySingleSort()">
                <option value="name">Name</option>
                <option value="department">Department</option>
                <option value="salary">Salary</option>
                <option value="hireDate">Hire Date</option>
              </select>
              <label style="margin-left: 1rem;">
                <input type="checkbox" [(ngModel)]="sortDesc" (ngModelChange)="applySingleSort()">
                Descending
              </label>
            </div>
            <div style="background: #e3f2fd; padding: 1rem; border-radius: 4px; max-height: 200px; overflow-y: auto;">
              <pre>{{ getSortedDataPreview() }}</pre>
            </div>
          </div>

          <!-- Multi-column Sort -->
          <div>
            <h4>Multi-column Sort</h4>
            <p style="font-size: 0.9em; color: #666;">Department → Salary → Name</p>
            <div style="background: #e8f5e8; padding: 1rem; border-radius: 4px; max-height: 200px; overflow-y: auto;">
              <pre>{{ getMultiSortedDataPreview() }}</pre>
            </div>
          </div>
        </div>
      </section>

      <!-- Filtering Utilities Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>🔍 Filtering Utilities</h3>
        
        <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;">
          <!-- Search Filter -->
          <div>
            <h4>Search Filter</h4>
            <input 
              type="text" 
              placeholder="Search in name, department..."
              [(ngModel)]="searchTerm"
              (ngModelChange)="applySearchFilter()"
              style="width: 100%; padding: 0.5rem; margin-bottom: 1rem;"
            >
            <div style="background: #fff3cd; padding: 1rem; border-radius: 4px; max-height: 200px; overflow-y: auto;">
              <pre>{{ getSearchFilteredDataPreview() }}</pre>
            </div>
          </div>

          <!-- Property Filter -->
          <div>
            <h4>Property Filters</h4>
            <div style="margin-bottom: 1rem;">
              <label>Department: </label>
              <select [(ngModel)]="filterDepartment" (ngModelChange)="applyPropertyFilter()">
                <option value="">All Departments</option>
                <option value="Engineering">Engineering</option>
                <option value="Marketing">Marketing</option>
                <option value="Sales">Sales</option>
                <option value="HR">HR</option>
              </select>
            </div>
            <div style="margin-bottom: 1rem;">
              <label>Min Salary: </label>
              <input 
                type="number" 
                [(ngModel)]="minSalary" 
                (ngModelChange)="applyPropertyFilter()"
                placeholder="50000"
                style="width: 120px; padding: 0.25rem;"
              >
            </div>
            <div style="background: #f3e5f5; padding: 1rem; border-radius: 4px; max-height: 200px; overflow-y: auto;">
              <pre>{{ getPropertyFilteredDataPreview() }}</pre>
            </div>
          </div>
        </div>
      </section>

      <!-- Pagination Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>📄 Pagination Utilities</h3>
        
        <div>
          <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem;">
            <label>Page Size: </label>
            <select [(ngModel)]="pageSize" (ngModelChange)="updatePagination()">
              <option [value]="3">3</option>
              <option [value]="5">5</option>
              <option [value]="7">7</option>
              <option [value]="10">10</option>
            </select>
            
            <label>Page: </label>
            <input 
              type="number" 
              [(ngModel)]="currentPage" 
              (ngModelChange)="updatePagination()"
              [min]="1" 
              [max]="paginationResult().totalPages"
              style="width: 60px; padding: 0.25rem;"
            >
            
            <span>of {{ paginationResult().totalPages }}</span>
            
            <button 
              (click)="previousPage()" 
              [disabled]="!paginationResult().hasPrevious"
              style="padding: 0.25rem 0.5rem;"
            >
              Previous
            </button>
            <button 
              (click)="nextPage()" 
              [disabled]="!paginationResult().hasNext"
              style="padding: 0.25rem 0.5rem;"
            >
              Next
            </button>
          </div>
          
          <div style="margin-bottom: 1rem;">
            <strong>Page Navigation: </strong>
            @for (page of pageRange(); track page) {
              @if (page === 'ellipsis') {
                <span style="margin: 0 0.5rem;">...</span>
              } @else {
                <button 
                  (click)="goToPage(page)"
                  [style.font-weight]="page === currentPage() ? 'bold' : 'normal'"
                  [style.background]="page === currentPage() ? '#007bff' : '#f8f9fa'"
                  [style.color]="page === currentPage() ? 'white' : 'black'"
                  style="padding: 0.25rem 0.5rem; margin: 0 0.125rem; border: 1px solid #ccc; cursor: pointer;"
                >
                  {{ page }}
                </button>
              }
            }
          </div>
          
          <div style="background: #e1f5fe; padding: 1rem; border-radius: 4px;">
            <p><strong>Showing:</strong> {{ getItemRangeText() }}</p>
            <pre style="max-height: 150px; overflow-y: auto;">{{ getPaginatedDataPreview() }}</pre>
          </div>
        </div>
      </section>

      <!-- Transformation Utilities Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>🔄 Transformation Utilities</h3>
        
        <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;">
          <!-- Group By -->
          <div>
            <h4>Group By Department</h4>
            <div style="background: #f1f8e9; padding: 1rem; border-radius: 4px; max-height: 200px; overflow-y: auto;">
              <pre>{{ getGroupedDataPreview() }}</pre>
            </div>
          </div>

          <!-- Aggregation -->
          <div>
            <h4>Salary Statistics by Department</h4>
            <div style="background: #fce4ec; padding: 1rem; border-radius: 4px; max-height: 200px; overflow-y: auto;">
              <pre>{{ getAggregationPreview() }}</pre>
            </div>
          </div>

          <!-- Pluck -->
          <div>
            <h4>Extract Names & Salaries</h4>
            <div style="background: #f3e5f5; padding: 1rem; border-radius: 4px; max-height: 200px; overflow-y: auto;">
              <pre>{{ getPluckedDataPreview() }}</pre>
            </div>
          </div>

          <!-- Pivot Table -->
          <div>
            <h4>Pivot: Department vs Active Status</h4>
            <div style="background: #fff3e0; padding: 1rem; border-radius: 4px; max-height: 200px; overflow-y: auto;">
              <pre>{{ getPivotDataPreview() }}</pre>
            </div>
          </div>
        </div>
      </section>

      <!-- Combined Operations Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>🔄 Combined Operations</h3>
        <p>Demonstrate chaining multiple operations: Filter → Sort → Paginate</p>
        
        <div style="display: flex; gap: 1rem; margin-bottom: 1rem; flex-wrap: wrap;">
          <label>
            Filter Active:
            <select [(ngModel)]="combinedActiveFilter" (ngModelChange)="updateCombinedDemo()">
              <option value="">All</option>
              <option value="true">Active Only</option>
              <option value="false">Inactive Only</option>
            </select>
          </label>
          
          <label>
            Sort By:
            <select [(ngModel)]="combinedSortField" (ngModelChange)="updateCombinedDemo()">
              <option value="name">Name</option>
              <option value="salary">Salary</option>
              <option value="hireDate">Hire Date</option>
            </select>
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="combinedSortDesc" (ngModelChange)="updateCombinedDemo()">
            Descending
          </label>
        </div>
        
        <div style="background: #e8f5e8; padding: 1rem; border-radius: 4px;">
          <p><strong>Pipeline:</strong> 
            {{ sampleData.length }} records → 
            {{ combinedFiltered().length }} filtered → 
            {{ combinedSorted().length }} sorted → 
            {{ combinedPaginated().data.length }} on page {{ combinedPaginated().page }}
          </p>
          <pre style="max-height: 200px; overflow-y: auto;">{{ getCombinedResultPreview() }}</pre>
        </div>
      </section>

      <!-- Performance Metrics -->
      <section style="margin-bottom: 3rem;">
        <h3>📊 Performance & Statistics</h3>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem;">
          <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; text-align: center;">
            <h4>Total Records</h4>
            <div style="font-size: 2rem; font-weight: bold; color: #007bff;">{{ sampleData.length }}</div>
          </div>
          
          <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; text-align: center;">
            <h4>Departments</h4>
            <div style="font-size: 2rem; font-weight: bold; color: #28a745;">{{ getDepartmentCount() }}</div>
          </div>
          
          <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; text-align: center;">
            <h4>Avg Salary</h4>
            <div style="font-size: 2rem; font-weight: bold; color: #ffc107;">{{ getAverageSalary() }}</div>
          </div>
          
          <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; text-align: center;">
            <h4>Active Employees</h4>
            <div style="font-size: 2rem; font-weight: bold; color: #17a2b8;">{{ getActiveCount() }}%</div>
          </div>
        </div>
      </section>

      <!-- Code Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>💻 Code Examples</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px;">
          
          <h4>Sorting Examples:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>// Single sort
const sorted = sortBy(data, {{ '{' }} key: 'salary', direction: 'desc', dataType: 'number' {{ '}' }});

// Multi-column sort  
const multiSorted = sortByMultiple(data, {{ '{' }}
  sorts: [
    {{ '{' }} key: 'department', direction: 'asc', dataType: 'string' {{ '}' }},
    {{ '{' }} key: 'salary', direction: 'desc', dataType: 'number' {{ '}' }}
  ]
{{ '}' }});</code></pre>

          <h4>Filtering Examples:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>// Property filter
const filtered = filterBy(data, {{ '{' }}
  key: 'salary',
  operator: 'greater_than',
  value: 50000,
  dataType: 'number'
{{ '}' }});

// Search across multiple properties
const searched = searchFilter(data, 'engineer', ['name', 'department']);</code></pre>

          <h4>Pagination Examples:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>// Paginate data
const paginatedResult = paginate(data, {{ '{' }} page: 1, pageSize: 10 {{ '}' }});

// Get page range for UI
const range = getPaginationRange(currentPage, totalPages, 7);</code></pre>

          <h4>Transformation Examples:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>// Group by property
const groups = groupBy(data, 'department');

// Aggregate values
const stats = aggregate(data, 'salary', ['sum', 'avg', 'min', 'max']);

// Extract specific properties
const names = pluck(data, ['name', 'salary']);</code></pre>
        </div>
      </section>

      <!-- Library Info -->
      <section style="margin-bottom: 3rem;">
        <h3>📚 Library Information</h3>
        <div style="background: #e3f2fd; padding: 1.5rem; border-radius: 4px;">
          <h4>UI Data Utils Features:</h4>
          <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem;">
            <div>
              <h5>🔄 Sorting</h5>
              <ul style="margin: 0; padding-left: 1.5rem;">
                <li>Single & multi-column sorting</li>
                <li>Type-aware comparisons</li>
                <li>Stable sort algorithms</li>
                <li>Custom comparator functions</li>
              </ul>
            </div>
            <div>
              <h5>🔍 Filtering</h5>
              <ul style="margin: 0; padding-left: 1.5rem;">
                <li>Multiple filter operators</li>
                <li>Search across properties</li>
                <li>Complex filter combinations</li>
                <li>Type-specific filtering</li>
              </ul>
            </div>
            <div>
              <h5>📄 Pagination</h5>
              <ul style="margin: 0; padding-left: 1.5rem;">
                <li>Client-side pagination</li>
                <li>Page range calculations</li>
                <li>Pagination metadata</li>
                <li>Navigation utilities</li>
              </ul>
            </div>
            <div>
              <h5>🔄 Transformation</h5>
              <ul style="margin: 0; padding-left: 1.5rem;">
                <li>Group by operations</li>
                <li>Data aggregations</li>
                <li>Property extraction</li>
                <li>Pivot tables</li>
              </ul>
            </div>
          </div>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 1rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(279, 14%, 35%);
      font-size: 1.2rem;
      margin-bottom: 0.5rem;
    }
    
    h5 {
      color: hsl(279, 14%, 45%);
      font-size: 1rem;
      margin-bottom: 0.5rem;
    }
    
    section {
      border: 1px solid #e9ecef;
      padding: 1.5rem;
      border-radius: 8px;
      background: #ffffff;
    }
    
    pre {
      margin: 0;
      font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
      font-size: 0.85rem;
      line-height: 1.4;
    }
    
    code {
      color: hsl(279, 14%, 15%);
    }
    
    button:hover:not(:disabled) {
      opacity: 0.8;
    }
    
    button:disabled {
      opacity: 0.5;
      cursor: not-allowed;
    }
    
    input, select {
      border: 1px solid #ccc;
      border-radius: 4px;
      padding: 0.25rem;
    }
    
    label {
      font-weight: 500;
    }
  `]
})
export class DataUtilsDemoComponent {
  // Sample data
  sampleData: SampleData[] = [
    { id: 1, name: 'Alice Johnson', department: 'Engineering', salary: 95000, hireDate: '2022-01-15', active: true, skills: ['JavaScript', 'Angular', 'TypeScript'] },
    { id: 2, name: 'Bob Smith', department: 'Marketing', salary: 65000, hireDate: '2021-03-22', active: true, skills: ['SEO', 'Content Marketing'] },
    { id: 3, name: 'Charlie Brown', department: 'Engineering', salary: 87000, hireDate: '2023-02-10', active: false, skills: ['React', 'Node.js'] },
    { id: 4, name: 'Diana Davis', department: 'Sales', salary: 72000, hireDate: '2020-11-05', active: true, skills: ['CRM', 'Negotiation'] },
    { id: 5, name: 'Eve Wilson', department: 'Engineering', salary: 102000, hireDate: '2021-08-18', active: true, skills: ['Python', 'Machine Learning'] },
    { id: 6, name: 'Frank Miller', department: 'HR', salary: 58000, hireDate: '2022-05-30', active: false, skills: ['Recruiting', 'Employee Relations'] },
    { id: 7, name: 'Grace Lee', department: 'Marketing', salary: 69000, hireDate: '2023-01-12', active: true, skills: ['Brand Management', 'Social Media'] },
    { id: 8, name: 'Henry Taylor', department: 'Sales', salary: 78000, hireDate: '2021-12-03', active: true, skills: ['Sales Strategy', 'Lead Generation'] },
    { id: 9, name: 'Ivy Chen', department: 'Engineering', salary: 91000, hireDate: '2022-09-14', active: true, skills: ['Vue.js', 'GraphQL'] },
    { id: 10, name: 'Jack White', department: 'HR', salary: 62000, hireDate: '2020-04-25', active: false, skills: ['Payroll', 'Benefits Administration'] }
  ];

  // Sorting controls
  sortField = signal<keyof SampleData>('name');
  sortDesc = signal<boolean>(false);

  // Filtering controls  
  searchTerm = signal<string>('');
  filterDepartment = signal<string>('');
  minSalary = signal<number | null>(null);

  // Pagination controls
  currentPage = signal<number>(1);
  pageSize = signal<number>(5);

  // Combined demo controls
  combinedActiveFilter = signal<string>('');
  combinedSortField = signal<keyof SampleData>('name');
  combinedSortDesc = signal<boolean>(false);

  // Computed data
  sortedData = computed(() => {
    const config: SortConfig<SampleData> = {
      key: this.sortField(),
      direction: this.sortDesc() ? 'desc' : 'asc',
      dataType: this.getDataType(this.sortField())
    };
    return sortBy(this.sampleData, config);
  });

  multiSortedData = computed(() => {
    return sortByMultiple(this.sampleData, {
      sorts: [
        { key: 'department', direction: 'asc', dataType: 'string' },
        { key: 'salary', direction: 'desc', dataType: 'number' },
        { key: 'name', direction: 'asc', dataType: 'string' }
      ]
    });
  });

  searchFilteredData = computed(() => {
    if (!this.searchTerm()) return this.sampleData;
    return searchFilter(this.sampleData, this.searchTerm(), ['name', 'department']);
  });

  propertyFilteredData = computed(() => {
    let filtered = this.sampleData;

    const filters: FilterConfig<SampleData>[] = [];
    
    if (this.filterDepartment()) {
      filters.push({
        key: 'department',
        operator: 'equals',
        value: this.filterDepartment(),
        dataType: 'string'
      });
    }

    if (this.minSalary() !== null) {
      filters.push({
        key: 'salary',
        operator: 'greater_than_equal',
        value: this.minSalary(),
        dataType: 'number'
      });
    }

    return filters.length > 0 ? filterByMultiple(filtered, filters) : filtered;
  });

  paginationResult = computed(() => {
    return paginate(this.sampleData, {
      page: this.currentPage(),
      pageSize: this.pageSize()
    });
  });

  pageRange = computed(() => {
    return getPaginationRange(this.currentPage(), this.paginationResult().totalPages, 7);
  });

  // Combined operations
  combinedFiltered = computed(() => {
    if (!this.combinedActiveFilter()) return this.sampleData;
    return filterBy(this.sampleData, {
      key: 'active',
      operator: 'equals',
      value: this.combinedActiveFilter() === 'true',
      dataType: 'boolean'
    });
  });

  combinedSorted = computed(() => {
    return sortBy(this.combinedFiltered(), {
      key: this.combinedSortField(),
      direction: this.combinedSortDesc() ? 'desc' : 'asc',
      dataType: this.getDataType(this.combinedSortField())
    });
  });

  combinedPaginated = computed(() => {
    return paginate(this.combinedSorted(), { page: 1, pageSize: 5 });
  });

  // Helper methods
  private getDataType(key: keyof SampleData): 'string' | 'number' | 'date' | 'boolean' {
    switch (key) {
      case 'salary': case 'id': return 'number';
      case 'hireDate': return 'date';
      case 'active': return 'boolean';
      default: return 'string';
    }
  }

  getSampleDataPreview(): string {
    return JSON.stringify(this.sampleData.slice(0, 3), null, 2);
  }

  getSortedDataPreview(): string {
    return JSON.stringify(this.sortedData().slice(0, 3).map((item: SampleData) => ({ name: item.name, [this.sortField()]: item[this.sortField()] })), null, 2);
  }

  getMultiSortedDataPreview(): string {
    return JSON.stringify(this.multiSortedData().slice(0, 4).map((item: SampleData) => ({ 
      name: item.name, 
      department: item.department, 
      salary: item.salary 
    })), null, 2);
  }

  getSearchFilteredDataPreview(): string {
    return JSON.stringify(this.searchFilteredData().slice(0, 3).map((item: SampleData) => ({ 
      name: item.name, 
      department: item.department 
    })), null, 2);
  }

  getPropertyFilteredDataPreview(): string {
    return JSON.stringify(this.propertyFilteredData().slice(0, 3).map((item: SampleData) => ({ 
      name: item.name, 
      department: item.department, 
      salary: item.salary 
    })), null, 2);
  }

  getPaginatedDataPreview(): string {
    return JSON.stringify(this.paginationResult().data.map((item: SampleData) => ({ 
      name: item.name, 
      department: item.department 
    })), null, 2);
  }

  getGroupedDataPreview(): string {
    const grouped = groupBy(this.sampleData, 'department');
    return JSON.stringify(grouped.map((group: GroupByResult<SampleData>) => ({ 
      department: group.key, 
      count: group.count,
      employees: group.items.map((emp: SampleData) => emp.name)
    })), null, 2);
  }

  getAggregationPreview(): string {
    const grouped = groupBy(this.sampleData, 'department');
    const result = grouped.map((group: GroupByResult<SampleData>) => ({
      department: group.key,
      ...aggregate(group.items, 'salary', ['sum', 'avg', 'min', 'max', 'count'])
    }));
    return JSON.stringify(result, null, 2);
  }

  getPluckedDataPreview(): string {
    const plucked = pluck(this.sampleData, ['name', 'salary']);
    return JSON.stringify(plucked.slice(0, 5), null, 2);
  }

  getPivotDataPreview(): string {
    const pivotData = this.sampleData.map(emp => ({
      department: emp.department,
      status: emp.active ? 'Active' : 'Inactive',
      count: 1
    }));
    
    const pivotResult = pivot(pivotData, 'department', 'status', 'count', 'sum');
    return JSON.stringify(pivotResult, null, 2);
  }

  getCombinedResultPreview(): string {
    return JSON.stringify(this.combinedPaginated().data.map((item: SampleData) => ({ 
      name: item.name, 
      department: item.department,
      salary: item.salary,
      active: item.active
    })), null, 2);
  }

  getItemRangeText(): string {
    const result = this.paginationResult();
    if (result.totalItems === 0) return '0 of 0';
    return `${result.startIndex + 1}-${result.endIndex + 1} of ${result.totalItems}`;
  }

  getDepartmentCount(): number {
    return unique(this.sampleData, 'department').length;
  }

  getAverageSalary(): string {
    const avg = aggregate(this.sampleData, 'salary', ['avg']);
    return '$' + Math.round(avg['avg'] || 0).toLocaleString();
  }

  getActiveCount(): number {
    const activeCount = this.sampleData.filter(emp => emp.active).length;
    return Math.round((activeCount / this.sampleData.length) * 100);
  }

  // Event handlers
  applySingleSort(): void {
    // Triggers computed update
  }

  applySearchFilter(): void {
    // Triggers computed update  
  }

  applyPropertyFilter(): void {
    // Triggers computed update
  }

  updatePagination(): void {
    // Ensure page is within bounds
    const maxPage = this.paginationResult().totalPages;
    if (this.currentPage() > maxPage) {
      this.currentPage.set(maxPage || 1);
    }
  }

  previousPage(): void {
    if (this.paginationResult().hasPrevious) {
      this.currentPage.update(page => page - 1);
    }
  }

  nextPage(): void {
    if (this.paginationResult().hasNext) {
      this.currentPage.update(page => page + 1);
    }
  }

  goToPage(page: number | string): void {
    if (typeof page === 'number') {
      this.currentPage.set(page);
    }
  }

  updateCombinedDemo(): void {
    // Triggers computed update
  }
}&xUP=K1:KwUᎮ(؂"(-pB0\"U:;JvADp?a>y7ˏZ$T R
"(bJMcʱKw} j',$+*$K1aP
%°%1xsCSEE$
5y$"gYT<r@Sb`F/!èȷ%dqeTv`ɵHK6Aup*,'g>WЌjɂĽoWwi5NkO	UIA3cP5_;h*,.پUfgA0>>x.demo-container {
  padding: 2rem;
  max-width: 1200px;
  margin: 0 auto;
  
  h2 {
    margin-bottom: 1.5rem;
    font-size: 1.875rem;
  }
}

.demo-section {
  margin-bottom: 3rem;
  
  h3 {
    margin-bottom: 1rem;
    font-size: 1.25rem;
    border-bottom: 1px solid #e5e7eb;
    padding-bottom: 0.5rem;
  }
}

.demo-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 1.5rem;
}

.demo-item {
  h4 {
    margin-bottom: 0.75rem;
    font-size: 1rem;
    font-weight: 500;
    color: #6b7280;
  }
}

.demo-interactive {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.5rem;
  padding: 1.5rem;
  border: 1px solid #e5e7eb;
  border-radius: 0.5rem;
  background: #f9fafb;
}

.demo-output {
  h4 {
    margin-bottom: 0.5rem;
    font-size: 1rem;
  }
  
  p {
    color: #6b7280;
    margin-bottom: 0.25rem;
    font-size: 0.875rem;
  }
}

.demo-form {
  padding: 1.5rem;
  border: 1px solid #e5e7eb;
  border-radius: 0.5rem;
  background: #ffffff;
}

.form-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.5rem;
  margin-bottom: 1.5rem;
}

.form-actions {
  display: flex;
  gap: 0.75rem;
  margin-bottom: 1.5rem;
}

.submit-btn, .reset-btn {
  padding: 0.5rem 1rem;
  border-radius: 0.375rem;
  font-size: 0.875rem;
  font-weight: 500;
  cursor: pointer;
  transition: all 0.2s ease;
}

.submit-btn {
  background: #3b82f6;
  color: white;
  border: 1px solid #3b82f6;
  
  &:hover:not(:disabled) {
    background: #2563eb;
    border-color: #2563eb;
  }
  
  &:disabled {
    opacity: 0.6;
    cursor: not-allowed;
  }
}

.reset-btn {
  background: transparent;
  color: #6b7280;
  border: 1px solid #d1d5db;
  
  &:hover {
    background: #f3f4f6;
    color: #374151;
  }
}

.form-status {
  background: #f3f4f6;
  padding: 0.75rem;
  border-radius: 0.375rem;
  
  p {
    margin-bottom: 0.5rem;
    font-size: 0.875rem;
    
    &:last-child {
      margin-bottom: 0;
    }
  }
  
  pre {
    background: #e5e7eb;
    padding: 0.5rem;
    border-radius: 0.25rem;
    font-size: 0.75rem;
    overflow-x: auto;
  }
}

@media (max-width: 768px) {
  .demo-row {
    grid-template-columns: 1fr;
  }
  
  .demo-interactive {
    grid-template-columns: 1fr;
  }
  
  .form-row {
    grid-template-columns: 1fr;
  }
}"xR!import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { DatePickerComponent } from '../../../../../ui-essentials/src/lib/components/forms/date-picker/date-picker.component';

@Component({
  selector: 'ui-date-picker-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, DatePickerComponent],
  template: `
    <div class="demo-container">
      <h2>Date Picker Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <h4>{{ size | uppercase }}</h4>
              <ui-date-picker 
                [size]="size"
                [label]="size + ' Date Picker'"
                [placeholder]="'Select date'"
                [(ngModel)]="sampleValues[size]">
              </ui-date-picker>
            </div>
          }
        </div>
      </section>
      
      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <h4>{{ variant | titlecase }}</h4>
              <ui-date-picker 
                [variant]="variant"
                [label]="variant + ' Variant'"
                [placeholder]="'Select date'"
                [(ngModel)]="variantValues[variant]">
              </ui-date-picker>
            </div>
          }
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Default</h4>
            <ui-date-picker 
              label="Default State"
              placeholder="Select date"
              helperText="Choose your preferred date"
              [(ngModel)]="stateValues['default']">
            </ui-date-picker>
          </div>
          
          <div class="demo-item">
            <h4>Error</h4>
            <ui-date-picker 
              label="Error State"
              placeholder="Select date"
              state="error"
              errorMessage="Please select a valid date"
              [(ngModel)]="stateValues['error']">
            </ui-date-picker>
          </div>
          
          <div class="demo-item">
            <h4>Success</h4>
            <ui-date-picker 
              label="Success State"
              placeholder="Select date"
              state="success"
              helperText="Great choice!"
              [(ngModel)]="stateValues['success']">
            </ui-date-picker>
          </div>
          
          <div class="demo-item">
            <h4>Warning</h4>
            <ui-date-picker 
              label="Warning State"
              placeholder="Select date"
              state="warning"
              helperText="Date is in the past"
              [(ngModel)]="stateValues['warning']">
            </ui-date-picker>
          </div>
        </div>
      </section>
      
      <!-- Special Features -->
      <section class="demo-section">
        <h3>Features</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Required Field</h4>
            <ui-date-picker 
              label="Required Date"
              placeholder="Select date"
              [required]="true"
              helperText="This field is required"
              [(ngModel)]="featureValues['required']">
            </ui-date-picker>
          </div>
          
          <div class="demo-item">
            <h4>Disabled</h4>
            <ui-date-picker 
              label="Disabled Date Picker"
              placeholder="Cannot select"
              [disabled]="true"
              helperText="This field is disabled"
              [(ngModel)]="featureValues['disabled']">
            </ui-date-picker>
          </div>
          
          <div class="demo-item">
            <h4>Not Clearable</h4>
            <ui-date-picker 
              label="No Clear Button"
              placeholder="Select date"
              [clearable]="false"
              helperText="Clear button is hidden"
              [(ngModel)]="featureValues['notClearable']">
            </ui-date-picker>
          </div>
          
          <div class="demo-item">
            <h4>Date Range Limits</h4>
            <ui-date-picker 
              label="Limited Date Range"
              placeholder="Select date"
              [minDate]="minDate"
              [maxDate]="maxDate"
              helperText="Only dates in 2024 allowed"
              [(ngModel)]="featureValues['limited']">
            </ui-date-picker>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <div class="demo-interactive">
          <ui-date-picker 
            label="Event Date"
            placeholder="Select event date"
            helperText="Choose a date for your event"
            [(ngModel)]="interactiveValue"
            (dateChange)="onDateChange($event)">
          </ui-date-picker>
          
          <div class="demo-output">
            <h4>Selected Date:</h4>
            <p>{{ interactiveValue ? formatDate(interactiveValue) : 'No date selected' }}</p>
            <p><strong>Change count:</strong> {{ changeCount }}</p>
          </div>
        </div>
      </section>
      
      <!-- Form Integration -->
      <section class="demo-section">
        <h3>Form Integration</h3>
        <form (ngSubmit)="onSubmit()" #demoForm="ngForm" class="demo-form">
          <div class="form-row">
            <ui-date-picker 
              label="Start Date"
              name="startDate"
              placeholder="Select start date"
              [(ngModel)]="formValues.startDate"
[required]="true"
              #startDate="ngModel">
            </ui-date-picker>
            
            <ui-date-picker 
              label="End Date"
              name="endDate"
              placeholder="Select end date"
              [(ngModel)]="formValues.endDate"
              [minDate]="formValues.startDate"
[required]="true"
              #endDate="ngModel">
            </ui-date-picker>
          </div>
          
          <div class="form-actions">
            <button type="submit" [disabled]="!demoForm.valid" class="submit-btn">
              Submit Form
            </button>
            <button type="button" (click)="resetForm(demoForm)" class="reset-btn">
              Reset
            </button>
          </div>
          
          <div class="form-status">
            <p><strong>Form Valid:</strong> {{ demoForm.valid }}</p>
            <p><strong>Form Values:</strong></p>
            <pre>{{ formValues | json }}</pre>
          </div>
        </form>
      </section>
    </div>
  `,
  styleUrl: './date-picker-demo.component.scss'
})
export class DatePickerDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['outlined', 'filled', 'underlined'] as const;
  
  sampleValues: Record<string, Date | null> = {
    sm: null,
    md: null,
    lg: null
  };
  
  variantValues: Record<string, Date | null> = {
    outlined: null,
    filled: null,
    underlined: null
  };
  
  stateValues: Record<string, Date | null> = {
    default: null,
    error: null,
    success: new Date(),
    warning: null
  };
  
  featureValues: Record<string, Date | null> = {
    required: null,
    disabled: new Date(),
    notClearable: null,
    limited: null
  };
  
  interactiveValue: Date | null = null;
  changeCount = 0;
  
  formValues = {
    startDate: null as Date | null,
    endDate: null as Date | null
  };
  
  // Date limits for demo
  minDate = new Date(2024, 0, 1); // January 1, 2024
  maxDate = new Date(2024, 11, 31); // December 31, 2024
  
  onDateChange(date: Date | null): void {
    this.changeCount++;
    console.log('Date changed:', date);
  }
  
  onSubmit(): void {
    console.log('Form submitted:', this.formValues);
    alert('Form submitted! Check console for values.');
  }
  
  resetForm(form: any): void {
    form.resetForm();
    this.formValues = {
      startDate: null,
      endDate: null
    };
  }
  
  formatDate(date: Date): string {
    return date.toLocaleDateString('en-US', {
      weekday: 'long',
      year: 'numeric',
      month: 'long',
      day: 'numeric'
    });
  }
}2xo6ǟsЗg?5e{S.Fl+DɦLA"e'K_:M7VgluWeˢOb:[s[abhetU@=6#?,7߁/ʘޝ5{E2FASQ+v{uР(s>5>%GDTn3e]9H"eUFASQ欟lmGZR[t哆aW{j*˨wv&E`%BŒyZ %rݶۅy{TLeyG\lmzDlS4pQ?BH!ȟd۵۪Xa@2I`SoZ+Mj2jg{+M~uqB Y&+򥸫zy|K2S+93eT IW7w8[3Ç 	xnj8{{-d-JzE)˨tf?*3}U/N)͜e=XX5nCT~añ~lxq1."]|S쟭k~C<7(;Ts! teihz\퉂 Ydk~&5v0Sen0n%r*U~VǍ3D=HF9I\¥aD2I^n'hQ;>"͡g҅$*mޡK+2i0Ѝ4Zi%l`9nĴ*3ֽڴѢy"Ӯ0ޅsEGiIM>4pΉp:kN[3\RU?RE Қm!%s#vSl66IM}ݽAlrM{ew!9Q .Ef>r,=˃o[îrG۩mΆ|\k&nrZ=MLO!Z<~Q}>iUF
qyd+HvnH[Q^1tWTga5	jX]&]2ԯНlC`_W/|7NOYּ~WdN+< ٨8)U0}9OҢ({?^~hKF.b
HC:Yy8GoT@,\U`nTM#2
$1I*vY(2((tQyTeM"*6G+W9ʤ*0&
%z*6dtप 1P1<xjB;}/5VNձ=jbԦ+4D5U,tቢf8
*67sU$5UHaVC5QeaFE9wnp%pCY9*8r8*hi̙c'iQN!<7rr*~GrjC0+QgV>J:{虑Ҩis3GQe MMdF"IF5,=<MGRM4#DODG5") is35RES2|?)| `[8*r >ql%U(-P&aQQTi1<pjLQIcMi>bi`*rJ RTbv&&ATTDbbU@<5qfQ4%BJ5"gJbGh.&$TMD,]HM#(:,:"^­hfna!+: /%cPj62b?/AͶ;~-3_؅̬enïef4n!Dt)37#x\PaOj|u'3w7*ɟ]̼bE430J?>[&пR5FF)n^d|c^E)H[pk 3aTz8ݽHQ81Ι3sg~/_[p֚B Dv:o;pN	'7{WQ>sݨA"؀h`Q38pIZ^ެVfeCux9o4G<W:8s`<O ?ۺ|y{xa\vP
tackstack-demo/stackQ
Bbox-demo/boxaententer-demo/centAspectRatio`spect-ratio-demo/aspect-ratioQ
	BentoGridbento-grid-demo/bento-griP

Breakpointo!$breakpoint-container-demo/breakpoint%Secsection-demo/sec leflex-demo/flexalumcolumn-demo/colum1SidebarLayosidebar-layout-demo/sidebar-/!Scrollo!scroll-container-demo/scroll%Tabso!tabs-container-demo/tabs%DashboardShell$dashboard-shell-demo/dashboard-shellQ
Grido!grid-container-demo/grid%FeedLayofeed-layout-demo/feed-/!ListDetailLayo$list-detail-layout-demo/list-detail-/!SupportingPaneLayo,supporting-pane-layout-demo/supporting-pane-/KFstackstack-demo></ui-stackboxbox-demo></ui-boxcent!enter-demo></ui-centqaspect-ratio"spect-ratio-demo></ui-aspect-ratio	bento-gribento-grid-demo></ui-bento-grid
breakpoint#)breakpoint-container-demo></ui-breakpoint`"secsection-demo></ui-secflexflex-demo></ui-flexcolum"column-demo></ui-columnsidebar-layo' sidebar-layout-demo></ui-sidebarscroll#!scroll-container-demo></ui-scroll`"tabs#tabs-container-demo></ui-tabs`"dashboard-shell)dashboard-shell-demo></ui-dashboard-shellq"grid-container-demo></ui-grid`"	feed-layo'feed-layout-demo></ui-feedlist-detail-layo'(list-detail-layout-demo></ui-list-detailsupporting-pane-layo'0supporting-pane-layout-demo></ui-supporting-pane'۳(, StackDemoComponent, BoxDemoComponent, CenterDemoComponent, AspectRatioDemoComponent, BentoGridDemoComponent, BreakpointContaiub, SectionDemoComponent, FlexDemoComponent, ColumnDemoComponent, SidebarLayoutDemoComponent, Scrollo, Tabso#, DashboardShellDemoComponent, GridoL, FeedLayoutDemoComponent, ListDetailLayoutDemoComponent, SupportingPaneLayo-(xafoa5DNQq1䩺u %r\x.vڏ
KanbanBoar	kanban-board-demo/kanban-board	Masonrymasonry-demo/masonryInfiniteScrollQ5 	infinite-
/infinite-+
StickyLayosticky-layout-demo/sticky"	SplitViewsplit-view-demo/split-viewGallery?gallery-grid-demo/galleryp 
Animationsanimations-demo/animationsAccessibility accessibility-demo/accessibilitySelecselect-demo/selectextareatextarea-demo/textarea	DataUtilsdata-utils-demo/data-utils	HclStudiohcl-studio-demo/hcl-stu/	FontManagfont-manager-demo/font-managCodeDisplayde-display-demo/code-displayBackgroundsbackgrounds-demo/backgrounds= kanban-board#kanban-board-demo></ui-kanban-boardelectselect-demo></ui-select>textareatextarea-demo></ui-textarea>$	infinite-0)	infinite-0	infinite-`/,1w asonrymasonry-demo></ui-masonryQ*ickya0!ticky-layout-demo></ui-sticky0 	plit-viewsplit-view-demo></ui-split-view1 gallery-gridgallery-grid-demo></ui-gallery.
animations$app-animations-demo></app-animations1 accessibility*app-accessibility-demo></app-accessibility1 
data-utils1ta-utils-demo></ui-data-utils1 
hcl-studio$app-hcl-studio-demo></app-hcl-studio1 font-manage&app-font-manager-demo></app-font-manag'code-display(app-code-display-demo></app-code-display1 	backgroun&app-backgrounds-demo></app-backgrounds3 KanbanBoardw4InfiniteScrollQ5F:, MasonryDemoComponent, Sticky:SplitViewDemoComponent, GalleryGridDemoComponent, AnimationsDemoComponent, AccessibilityDemoComponent, SelectDemoComponent, TextareaDemoComponent, DataUtilsDemoComponent, HclStudioDemoComponent, FontManagerDemoComponent, CodeDisplayDemoComponent, Backgrounds:eY=xDڏR0M
onversiconversion-demo/convers@	LandingHep	 landing-header-demo/landing-headLandingFooter landing-footer-demo/landing-foot
LandingFAQlanding-faq-demo/landing-faqandingTemplates'anding-templates-demo/landing-templatesLanding!"./landing-timeline-demo/landing-LandingTeamanding-team-demo/landing-teamLandingStatistics)anding-statistics-demo/landing-statisticsLandingFeatureGrid(anding-feature-grid-demo/landing-feature1LandingTestimonials-anding-testimonials-demo/landing-testimonialsLandingLogoCloud)anding-logo-cloud-demo/landing-logo-cloudQ"q+ "/"Wjapp-video-player-demo></app&>4	onversion "app-conversion-demo></app-conversi2landing-faq &app-landing-faq-demo></app-landing-faq#landing-feature;8app-landing-feature-grid-demo></app-landing-feature-gridlanding-testimonial 8app-landing-testimonials-demo></app-landing-testimonialslanding-logo-cloud 4app-landing-logo-cloud-demo></app-landing-logo-cloudlanding-statistic 4app-landing-statistics-demo></app-landing-statisticslanding-head'*app-landing-header-demo></app-landing-head1&landing-foot'*app-landing-footer-demo></app-landing-foot1&landing-team (app-landing-team-demo></app-landing-teamlanding-k0'app-landing-timeline-demo></app-landing0!landing-template Aapp-landing-templates-demo></app-landing-templates-demo>
			}
			>)??@??CK??Cl???D??Da??$jEo??EA
alleryGridF??GDG>?#ConversionDemoComponent, LandingFAQ1?LandingFeatureGridDemoComponent, LandingTestimonialsDemoComponent, LandingLogoCloudDemoComponent, LandingStatisticsDemoComponent, LandingHeader1?=LandingFooterDemoComponent, LandingTeamDemoComponent, Landing, LandingTemplates1?&LandingTemplatesDemoComponent, LandingA, LandingTeamDemoComponent, LandingFooterDemoComponent, LandingHeALandingStatistics1?RLandingFeatureGridDemoComponent, LandingTestimonialsDemoComponent, LandingLogoClouoF)*G\G~]Y
@xkws,B|Y6=eܢ8U ,1x4 QHw	$!q#`$'@u(~#BxrL?ӕ H%x$9?	Circle	circle-demo/progress-circle	RangeSlidrange-slider-demo/range-sli1	Dividivider-demo/divi1	Tooltiptooltip-demo/tooltipprogress-circle	 circle-demo></ui-progress-circle
range-slid!range-slider-demo></ui-range-sliddividdivider-demo></ui-dividtooltiptooltip-demo></ui-tooltipֳuZ,
    ProgressCircleDemoComponent, RangeSliderDemoComponent, DividerDemoComponent, Tooltip(>x(import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DividerComponent } from '../../../../../ui-essentials/src/lib/components/layout';

@Component({
  selector: 'ui-divider-demo',
  standalone: true,
  imports: [CommonModule, DividerComponent],
  template: `
    <div class="demo-container">
      <h2>Divider Demo</h2>
      
      <!-- Orientation -->
      <section class="demo-section">
        <h3>Orientation</h3>
        <div class="demo-row">
          <div style="width: 100%;">
            <p>Content above</p>
            <ui-divider orientation="horizontal"></ui-divider>
            <p>Content below</p>
          </div>
        </div>
        <div class="demo-row" style="height: 100px; display: flex; align-items: center;">
          <p>Left content</p>
          <ui-divider orientation="vertical"></ui-divider>
          <p>Right content</p>
        </div>
      </section>
      
      <!-- Style Variants -->
      <section class="demo-section">
        <h3>Style Variants</h3>
        <div class="demo-column">
          <div>
            <p>Solid divider</p>
            <ui-divider variant="solid"></ui-divider>
          </div>
          <div>
            <p>Dashed divider</p>
            <ui-divider variant="dashed"></ui-divider>
          </div>
          <div>
            <p>Dotted divider</p>
            <ui-divider variant="dotted"></ui-divider>
          </div>
        </div>
      </section>
      
      <!-- Thickness Variants -->
      <section class="demo-section">
        <h3>Thickness</h3>
        <div class="demo-column">
          <div>
            <p>Thin divider</p>
            <ui-divider thickness="thin"></ui-divider>
          </div>
          <div>
            <p>Default thickness</p>
            <ui-divider thickness="default"></ui-divider>
          </div>
          <div>
            <p>Thick divider</p>
            <ui-divider thickness="thick"></ui-divider>
          </div>
        </div>
      </section>
      
      <!-- With Content -->
      <section class="demo-section">
        <h3>With Content</h3>
        <div class="demo-column">
          <ui-divider>OR</ui-divider>
          <ui-divider>Section Break</ui-divider>
          <ui-divider>More Content</ui-divider>
        </div>
      </section>
      
      <!-- Combined Examples -->
      <section class="demo-section">
        <h3>Combined Examples</h3>
        <div class="demo-column">
          <ui-divider variant="dashed" thickness="thin">Dashed Thin</ui-divider>
          <ui-divider variant="dotted" thickness="thick">Dotted Thick</ui-divider>
        </div>
      </section>
      
      <!-- Vertical Examples -->
      <section class="demo-section">
        <h3>Vertical Examples</h3>
        <div style="display: flex; height: 80px; align-items: center; gap: 16px;">
          <span>Item 1</span>
          <ui-divider orientation="vertical" variant="solid" thickness="thin"></ui-divider>
          <span>Item 2</span>
          <ui-divider orientation="vertical" variant="dashed"></ui-divider>
          <span>Item 3</span>
          <ui-divider orientation="vertical" variant="dotted" thickness="thick"></ui-divider>
          <span>Item 4</span>
        </div>
      </section>
    </div>
  `,
  styleUrl: './divider-demo.component.scss'
})
export class DividerDemoComponent {}2s$6x[!5Wj<ҤdĂ̍Ky \}xC_import { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faExclamationTriangle, faCheckCircle, faInfoCircle } from '@fortawesome/free-solid-svg-icons';
import { ButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons';
import { ModalComponent } from '../../../../../ui-essentials/src/lib/components/overlays/modal';

@Component({
  selector: 'ui-modal-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, FontAwesomeModule, ButtonComponent, ModalComponent],
  template: `
    <div class="demo-container">
      <h2>Modal Demo</h2>
      
      <!-- Basic Usage -->
      <section class="demo-section">
        <h3>Basic Usage</h3>
        <div class="demo-row">
          <ui-button (clicked)="basicModal.set(true)">
            Open Basic Modal
          </ui-button>
        </div>
      </section>

      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          <ui-button (clicked)="smallModal.set(true)">Small Modal</ui-button>
          <ui-button (clicked)="mediumModal.set(true)">Medium Modal</ui-button>
          <ui-button (clicked)="largeModal.set(true)">Large Modal</ui-button>
          <ui-button (clicked)="xlModal.set(true)">XL Modal</ui-button>
          <ui-button (clicked)="fullscreenModal.set(true)">Fullscreen Modal</ui-button>
        </div>
      </section>

      <!-- Variant Types -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          <ui-button (clicked)="defaultModal.set(true)" variant="filled">Default</ui-button>
          <ui-button (clicked)="warningModal.set(true)" variant="tonal">Warning</ui-button>
          <ui-button (clicked)="dangerModal.set(true)" variant="outlined">Danger</ui-button>
          <ui-button (clicked)="successModal.set(true)" variant="filled">Success</ui-button>
        </div>
      </section>

      <!-- Configuration Options -->
      <section class="demo-section">
        <h3>Configuration Options</h3>
        <div class="demo-row">
          <ui-button (clicked)="noHeaderModal.set(true)">No Header</ui-button>
          <ui-button (clicked)="noFooterModal.set(true)">With Footer</ui-button>
          <ui-button (clicked)="noPaddingModal.set(true)">No Padding</ui-button>
          <ui-button (clicked)="notClosableModal.set(true)">Not Closable</ui-button>
        </div>
      </section>

      <!-- Interactive Features -->
      <section class="demo-section">
        <h3>Interactive Features</h3>
        <div class="demo-row">
          <ui-button (clicked)="loadingModal.set(true)">Loading Modal</ui-button>
          <ui-button (clicked)="scrollableModal.set(true)">Scrollable Content</ui-button>
          <ui-button (clicked)="formModal.set(true)">Form Modal</ui-button>
        </div>
      </section>

      <!-- Configuration Panel -->
      <section class="demo-section">
        <h3>Try It Yourself</h3>
        <div class="config-panel">
          <div class="config-row">
            <label>Size:</label>
            <select [(ngModel)]="customConfig.size">
              <option value="sm">Small</option>
              <option value="md">Medium</option>
              <option value="lg">Large</option>
              <option value="xl">Extra Large</option>
              <option value="fullscreen">Fullscreen</option>
            </select>
          </div>
          
          <div class="config-row">
            <label>Variant:</label>
            <select [(ngModel)]="customConfig.variant">
              <option value="default">Default</option>
              <option value="danger">Danger</option>
              <option value="warning">Warning</option>
              <option value="success">Success</option>
            </select>
          </div>
          
          <div class="config-row">
            <label>
              <input type="checkbox" [(ngModel)]="customConfig.closable">
              Closable
            </label>
            <label>
              <input type="checkbox" [(ngModel)]="customConfig.backdropClosable">
              Backdrop Closable
            </label>
          </div>
          
          <div class="config-row">
            <label>
              <input type="checkbox" [(ngModel)]="customConfig.showHeader">
              Show Header
            </label>
            <label>
              <input type="checkbox" [(ngModel)]="customConfig.showFooter">
              Show Footer
            </label>
          </div>
          
          <ui-button (clicked)="customModal.set(true)">Open Custom Modal</ui-button>
        </div>
      </section>

      <!-- Event Log -->
      <section class="demo-section">
        <h3>Event Log</h3>
        <div class="event-log">
          @for (event of eventLog; track $index) {
            <div class="event-item">{{ event }}</div>
          }
          @if (eventLog.length === 0) {
            <div class="event-item">No events yet...</div>
          }
        </div>
        <ui-button (clicked)="clearEventLog()" variant="outlined">Clear Log</ui-button>
      </section>
    </div>

    <!-- Basic Modal -->
    <ui-modal
      [open]="basicModal()"
      (openChange)="basicModal.set($event); logEvent('Basic modal: ' + ($event ? 'opened' : 'closed'))"
      title="Basic Modal"
      (opened)="logEvent('Basic modal opened')"
      (closed)="logEvent('Basic modal closed')"
    >
      <p>This is a basic modal with default settings.</p>
      <p>You can close it by clicking the X button, pressing Escape, or clicking outside the modal.</p>
    </ui-modal>

    <!-- Size Modals -->
    <ui-modal
      [open]="smallModal()"
      (openChange)="smallModal.set($event)"
      size="sm"
      title="Small Modal"
    >
      <p>This is a small modal (400px width).</p>
    </ui-modal>

    <ui-modal
      [open]="mediumModal()"
      (openChange)="mediumModal.set($event)"
      size="md"
      title="Medium Modal"
    >
      <p>This is a medium modal (600px width) - the default size.</p>
    </ui-modal>

    <ui-modal
      [open]="largeModal()"
      (openChange)="largeModal.set($event)"
      size="lg"
      title="Large Modal"
    >
      <p>This is a large modal (800px width).</p>
      <p>Perfect for forms, detailed content, or complex interfaces.</p>
    </ui-modal>

    <ui-modal
      [open]="xlModal()"
      (openChange)="xlModal.set($event)"
      size="xl"
      title="Extra Large Modal"
    >
      <p>This is an extra large modal (1000px width).</p>
      <p>Use this for very complex interfaces or wide content.</p>
    </ui-modal>

    <ui-modal
      [open]="fullscreenModal()"
      (openChange)="fullscreenModal.set($event)"
      size="fullscreen"
      title="Fullscreen Modal"
    >
      <p>This modal takes up the entire screen.</p>
      <p>Perfect for complex applications or immersive experiences.</p>
    </ui-modal>

    <!-- Variant Modals -->
    <ui-modal
      [open]="defaultModal()"
      (openChange)="defaultModal.set($event)"
      variant="default"
      title="Default Modal"
    >
      <p>This is the default modal variant.</p>
    </ui-modal>

    <ui-modal
      [open]="warningModal()"
      (openChange)="warningModal.set($event)"
      variant="warning"
      title="Warning Modal"
      [showFooter]="true"
    >
      <div style="display: flex; align-items: center; gap: 12px; margin-bottom: 16px;">
        <fa-icon [icon]="faExclamationTriangle" style="color: #f59e0b; font-size: 24px;"></fa-icon>
        <p style="margin: 0;">Are you sure you want to continue? This action cannot be undone.</p>
      </div>
      
      <ng-container slot="footer">
        <ui-button (clicked)="warningModal.set(false)" variant="outlined">Cancel</ui-button>
        <ui-button (clicked)="warningModal.set(false)" variant="filled">Continue</ui-button>
      </ng-container>
    </ui-modal>

    <ui-modal
      [open]="dangerModal()"
      (openChange)="dangerModal.set($event)"
      variant="danger"
      title="Delete Item"
      [showFooter]="true"
    >
      <div style="display: flex; align-items: center; gap: 12px; margin-bottom: 16px;">
        <fa-icon [icon]="faExclamationTriangle" style="color: #ef4444; font-size: 24px;"></fa-icon>
        <p style="margin: 0;">This will permanently delete the item. This action cannot be undone.</p>
      </div>
      
      <ng-container slot="footer">
        <ui-button (clicked)="dangerModal.set(false)" variant="outlined">Cancel</ui-button>
        <ui-button (clicked)="dangerModal.set(false)" variant="filled">Delete</ui-button>
      </ng-container>
    </ui-modal>

    <ui-modal
      [open]="successModal()"
      (openChange)="successModal.set($event)"
      variant="success"
      title="Success!"
      [showFooter]="true"
    >
      <div style="display: flex; align-items: center; gap: 12px; margin-bottom: 16px;">
        <fa-icon [icon]="faCheckCircle" style="color: #10b981; font-size: 24px;"></fa-icon>
        <p style="margin: 0;">Your changes have been saved successfully!</p>
      </div>
      
      <ng-container slot="footer">
        <ui-button (clicked)="successModal.set(false)" variant="filled">Close</ui-button>
      </ng-container>
    </ui-modal>

    <!-- Configuration Modals -->
    <ui-modal
      [open]="noHeaderModal()"
      (openChange)="noHeaderModal.set($event)"
      [showHeader]="false"
    >
      <div style="padding: 16px; text-align: center;">
        <fa-icon [icon]="faInfoCircle" style="font-size: 48px; color: #6750a4; margin-bottom: 16px;"></fa-icon>
        <h3 style="margin: 0 0 16px 0;">Modal without header</h3>
        <p>This modal doesn't have a header section.</p>
        <ui-button (clicked)="noHeaderModal.set(false)" style="margin-top: 16px;">Close</ui-button>
      </div>
    </ui-modal>

    <ui-modal
      [open]="noFooterModal()"
      (openChange)="noFooterModal.set($event)"
      title="Modal with Footer"
      [showFooter]="true"
      footerAlignment="between"
    >
      <p>This modal has a footer with buttons aligned between start and end.</p>
      
      <ng-container slot="footer">
        <div>
          <ui-button (clicked)="logEvent('Help clicked')" variant="outlined">Help</ui-button>
        </div>
        <div style="display: flex; gap: 8px;">
          <ui-button (clicked)="noFooterModal.set(false)" variant="outlined">Cancel</ui-button>
          <ui-button (clicked)="noFooterModal.set(false)" variant="filled">Save</ui-button>
        </div>
      </ng-container>
    </ui-modal>

    <ui-modal
      [open]="noPaddingModal()"
      (openChange)="noPaddingModal.set($event)"
      title="No Padding Modal"
      [bodyPadding]="false"
    >
      <div style="padding: 0; background: linear-gradient(45deg, #6750a4, #7c3aed); height: 200px; display: flex; align-items: center; justify-content: center; color: white;">
        <p style="margin: 0; text-align: center;">This content spans the full width<br>with no padding constraints.</p>
      </div>
    </ui-modal>

    <ui-modal
      [open]="notClosableModal()"
      (openChange)="notClosableModal.set($event)"
      title="Not Closable Modal"
      [closable]="false"
      [backdropClosable]="false"
      [escapeClosable]="false"
      [showFooter]="true"
    >
      <p>This modal cannot be closed by clicking the X, pressing Escape, or clicking the backdrop.</p>
      <p>You must use the Close button below.</p>
      
      <ng-container slot="footer">
        <ui-button (clicked)="notClosableModal.set(false)" variant="filled">Close</ui-button>
      </ng-container>
    </ui-modal>

    <!-- Interactive Modals -->
    <ui-modal
      [open]="loadingModal()"
      (openChange)="loadingModal.set($event)"
      title="Loading Data"
      [loading]="true"
    >
      <!-- Content will be replaced by loading spinner -->
    </ui-modal>

    <ui-modal
      [open]="scrollableModal()"
      (openChange)="scrollableModal.set($event)"
      title="Scrollable Content"
      size="md"
    >
      <div style="height: 800px;">
        <h4>Long Content</h4>
        @for (item of longContent; track $index) {
          <p>{{ item }}</p>
        }
      </div>
    </ui-modal>

    <ui-modal
      [open]="formModal()"
      (openChange)="formModal.set($event)"
      title="User Registration"
      [showFooter]="true"
      size="md"
    >
      <form (ngSubmit)="handleFormSubmit()" #userForm="ngForm">
        <div style="margin-bottom: 16px;">
          <label style="display: block; margin-bottom: 4px;">Name:</label>
          <input 
            type="text" 
            [(ngModel)]="formData.name" 
            name="name"
            style="width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px;"
            required
          >
        </div>
        
        <div style="margin-bottom: 16px;">
          <label style="display: block; margin-bottom: 4px;">Email:</label>
          <input 
            type="email" 
            [(ngModel)]="formData.email" 
            name="email"
            style="width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px;"
            required
          >
        </div>
        
        <div style="margin-bottom: 16px;">
          <label style="display: block; margin-bottom: 4px;">Message:</label>
          <textarea 
            [(ngModel)]="formData.message" 
            name="message"
            rows="4"
            style="width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; resize: vertical;"
          ></textarea>
        </div>
      </form>
      
      <ng-container slot="footer">
        <ui-button (clicked)="formModal.set(false)" variant="outlined">Cancel</ui-button>
        <ui-button (clicked)="handleFormSubmit()" variant="filled">Submit</ui-button>
      </ng-container>
    </ui-modal>

    <!-- Custom Configuration Modal -->
    <ui-modal
      [open]="customModal()"
      (openChange)="customModal.set($event)"
      [size]="customConfig.size"
      [variant]="customConfig.variant"
      [closable]="customConfig.closable"
      [backdropClosable]="customConfig.backdropClosable"
      [showHeader]="customConfig.showHeader"
      [showFooter]="customConfig.showFooter"
      title="Custom Configured Modal"
    >
      <p>This modal is configured based on your selections:</p>
      <ul>
        <li>Size: {{ customConfig.size }}</li>
        <li>Variant: {{ customConfig.variant }}</li>
        <li>Closable: {{ customConfig.closable ? 'Yes' : 'No' }}</li>
        <li>Backdrop Closable: {{ customConfig.backdropClosable ? 'Yes' : 'No' }}</li>
        <li>Show Header: {{ customConfig.showHeader ? 'Yes' : 'No' }}</li>
        <li>Show Footer: {{ customConfig.showFooter ? 'Yes' : 'No' }}</li>
      </ul>
      
      @if (customConfig.showFooter) {
        <ng-container slot="footer">
          <ui-button (clicked)="customModal.set(false)" variant="filled">Close</ui-button>
        </ng-container>
      }
    </ui-modal>
  `,
  styleUrl: './modal-demo.component.scss'
})
export class ModalDemoComponent {
  // Icons
  readonly faExclamationTriangle = faExclamationTriangle;
  readonly faCheckCircle = faCheckCircle;
  readonly faInfoCircle = faInfoCircle;

  // Modal states
  basicModal = signal(false);
  smallModal = signal(false);
  mediumModal = signal(false);
  largeModal = signal(false);
  xlModal = signal(false);
  fullscreenModal = signal(false);
  
  defaultModal = signal(false);
  warningModal = signal(false);
  dangerModal = signal(false);
  successModal = signal(false);
  
  noHeaderModal = signal(false);
  noFooterModal = signal(false);
  noPaddingModal = signal(false);
  notClosableModal = signal(false);
  
  loadingModal = signal(false);
  scrollableModal = signal(false);
  formModal = signal(false);
  customModal = signal(false);

  // Demo data
  eventLog: string[] = [];
  
  customConfig = {
    size: 'md' as any,
    variant: 'default' as any,
    closable: true,
    backdropClosable: true,
    showHeader: true,
    showFooter: false
  };

  formData = {
    name: '',
    email: '',
    message: ''
  };

  longContent = Array.from({ length: 50 }, (_, i) => 
    `This is paragraph ${i + 1}. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
    Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.`
  );

  // Simulate loading
  constructor() {
    setTimeout(() => {
      if (this.loadingModal()) {
        this.loadingModal.set(false);
        this.logEvent('Loading completed');
      }
    }, 3000);
  }

  logEvent(event: string): void {
    const timestamp = new Date().toLocaleTimeString();
    this.eventLog.unshift(`[${timestamp}] ${event}`);
    if (this.eventLog.length > 10) {
      this.eventLog = this.eventLog.slice(0, 10);
    }
  }

  clearEventLog(): void {
    this.eventLog = [];
  }

  handleFormSubmit(): void {
    this.logEvent(`Form submitted: ${JSON.stringify(this.formData)}`);
    this.formModal.set(false);
    
    // Reset form
    this.formData = {
      name: '',
      email: '',
      message: ''
    };
  }
}Zq.xy頇@Bars, faUser, faCog, faHome, faChartLine, faEnvelope, faQuestionK, DrawerN3
public-api!drawergDrawerEDrawerDrawer%Bars%     Open Basic Drawer
          -	&Position?Position
G eftDrawer.set(true)">Left Drawer-#rightDrawer.set(true)">Right Drawer-topDrawer.set(true)">Top Drawer-%bottomDrawer.set(true)">Bottom Drawer-	&Drawer.set(true)">Small Drawer-%mediumDrawer.set(true)">Medium Drawer-#largeDrawer.set(true)">Large Drawer-xlDrawer.set(true)">XL Drawer-	&-DrawerBwithFooterDrawer.	MDrawer	C&persistentDrawer.set(true)">Persistent-0)-	Drawer	 Drawer.set(true)">Loading Drawer-scrollableDrawer(K-navigationDrawer.set(true)">Navigation Drawer-	&-`\Position88	position"
left">Leftright">Righttop">Topbottom">Bottomr @VW+ @%persistent">
              Persistent :$Drawer.set(true)">Open Custom Drawer-	&3Drawer -->
    <ui-drawer
      [open]="basicDrawer$basicDrawerdrawer":Drawera"drawer+drawer*drawerycdrawer.</p>
    </ui-drawer>

    <!-- Position Drawers -->
    <ui-drawer
      [open]="leftDrawer$
leftDrawerQ.(position="left"
      title="Left Drawerdrawer slides in from the left side.</p>
      <p>Default position for navigation menus and sidebars.</p>
    </ui-drawer>

   % <ui-drawer
      [open]="rightDrawer$rightDrawerQ.*position="right"
      title="Right Drawerdrawer slides in from the right side.</p>
      <p>Great for secondary actions, filters, or settings panels.</p>
    </ui-drawe*r>

    <ui-drawer
      [open]="topDrawer$	topDrawerQ.&position="top"
      title="Top Drawerdrawer slides down from the topnotifications, announcements, or quick access panels.</p>
    </ui-drawer>

    <ui-drawer
      [open]="bottomDrawer()"
      $bottomDrawerQ.,position="bottom"
      title="Bottom Drawerdrawer slides up from the bottom.</p>
      <p>Commonly used for mobile interfaces and action sheets.</p>
    </ui-drawer>

   ? <!-- Size Drawers -->
    <ui-drawer
      [open]="smallDrawer$smallDrawerQ.Drawer (280px.
drawer (28esimple navigation or minimal content.</p>
    </ui-drawer>

    <ui-drawer
      [open]="mediumDrawer$mediumDrawerQ.Drawer (360pxmedium drawer (36
'  <p>Good balance between content space and screen real estate.</p>
    </ui-drawer>

    <ui-drawer
      [open]="largeDrawer($largeDrawerQ.Drawer (480pxlarge drawer (48	Ideal forforms"&.drawer>

    <ui-drawer
      [open]="xlDrawer$xlDrawerQ.#Drawer (640px
drawer (64for very detailed interfaces or when you need more space.</p>
    </ui-drawer>

    <!-- Configuration Drawers -->
    <ui-drawer
      [open]="noHeaderDrawer$ DrawerQ.*%mBars%sDrawer&%drawerC&JDrawer&O6drawer>

    <ui-drawer
      [open]="withFooterDrawer$withFooterDrawerQ.DrawerW'\drawer has a footer with buttons.</p>
      <p>The footer stays at the bottom even if the content is scrollable.</p>
      
   (withFooterDrawer!;OwithFooterDrawer! u)?5drawer>

    <ui-drawer
      [open]="noPaddingDrawer$*DrawerQ.No Padding Drawer7*]_*`%:">
        <p>Content below can still have its own padding}+6drawer>

    <ui-drawer
      [open]="persistentDrawer$persistentDrawerQ.$Persistent Drawer"
      [persistent,is a persistent drawer that doesn't have a backdrop.</p>
      <p>It stays open until explicitly closed and doesn't block inter action with the rest of the page1navigation menus that should remain visible.</p>
persistentDrawer&,4 Drawer</ui-button>
    </ui-drawer>

    <ui-drawer+Drawer$tClosableDrawerQ.,Drawer"
      [cM,7W,Tdrawer,Drawer! 	n$0Tdrawer>

    <!-- Interactive Drawers -->
    <ui-drawer
      [open]="loadingDrawer$loadingDrawerQ.drawer>

    <ui-drawer.Drawer$scrollableDrawerQ.P/6drawer>

    <ui-drawer
      [open]="navigationDrawer$avigationDrawerQ.Navigation"
      size="sm)nav style="margin: -16px 0;"A0nav-item" (click)="logEvent('Home clicked')">
  |%Home%  <span>Home</spaI5nav-item" (click)="logEvent('Dashboard clicked')">
  |%	ChartLine%  <span>Dashboard</spaI3nav-item" (click)="logEvent('Profile clicked')">
  |%User%  <span>Profile</spaI4nav-item" (click)="logEvent('Messages clicked')">
  |%Envelope%  <span>Messages</spaI4nav-item" (click)="logEvent('Settings clicked')">
  |%Cog%  <span>Settings</spanav5JN(-
  |%QuestionCircle%  Help
        -,drawer6!4Drawer -->
    <ui-drawer
      [open]="customDrawer6DrawerQ.7" position]="customConfig.positionX7%[persistent]="customConfig.persistent8!DrawerdrawerU8s"Position: {{ customConfig.position98-9&Persistent: {{ customConfig.persistent9*:~Drawer! 	n$:#"drawer>
  `,
  styleUrl: './drawer&;&DrawerQ;(Bars = faBars;
  readonly faUser = faUser;
  readonly faCog = faCog;
  readonly faHome = faHome;
  readonly faChartLine = faChartLine;
  readonly faEnvelope = faEnvelope;
  readonly faQuestionCircle = faQuestionCircle;

  // Drawer states
  basicDrawer =<
leftDrawer<rightDrawer<	topDrawer<bottomDrawer<smallDrawer<mediumDrawer<largeDrawer<xlDrawer<noHeaderDrawer<withFooterDrawer<=	Drawer<persistentDrawer<=Drawer<loadingDrawer=Drawer<navigationDrawer >Drawer?>nposition: 'lef>f,
    persistent: falsee?&Drawer()) {
        this.loadingDrawer5A{}|#Ex[xqC8o~Jbs~nA~^j^BBZQ~FEҤdĂL?; /FxyÆ@Bars, faUser, faCog, faHome, faChartLine, faEnvelope, faQuestionMDrawer^^drawergDrawer-EDrawerwDrawer/'%Bars    Open Basic DrawerXDPosition?	PositionsE!leftDrawer.set(true)">Left Drawer-#rightDrawer.set(true)">Right Drawer-topDrawer.set(true)">Top Drawer-%bottomDrawer.set(true)">Bottom Drawer$Drawer.set(true)">Small Drawer-%mediumDrawer.set(true)">Medium Drawer-#largeDrawer.set(true)">Large Drawer-xlDrawer.set(true)">XL Drawer$DrawerBwithFooterDrawerMDrawer#	C%persistentDrawer.set(true)">Persisten.notClosableDrawerv	 Drawer.set(true)">Loading Drawer-

Drawer
K-navigationDrawer.set(true)">Navigation Drawer$|x\Position8	position"
left">Left'right">Right'top">Top'bottom">Bottox\_+_@%persistent">
              Persistent <*customDrawer.set(true)">Open Custom Drawer$k3Drawer -->
    <ui-drawer
      [open]="basicDrawer./basicDrawer.set($event); logEvent('Basic drawer:Drawer"drawer++drawer[*drawerycdrawer.</p>
    </ui-drawer>

    <!-- Position Drawers -->
    <ui-drawer
      [open]="leftDrawer.
leftDrawerQ(position="left"
      title="Left Drawerqdrawer slides in from the left side.</p>
      <p>Default position for navigation menus and sidebars.</p>
    </ui-drawer>

   % <ui-drawer
      [open]="rightDrawer.rightDrawerQ*position="right"
      title="Right Drawerqdrawer slides in from the right side.</p>
      <p>Great for secondary actions, filters, or settings panels.</p>
    </ui-drawe*r>

    <ui-drawer
      [open]="topDrawer.	topDrawerQ&position="top"
      title="Top Drawerqdrawer slides down from the top.</p>
      <p>Perfect for notifications, announcements, or quick access panels.</p>
    </ui-dr0awer>

    <ui-drawer
      [open]="bottomDrawer.bottomDrawerQ,position="bottom"
      title="Bottom Drawerqdrawer slides up from the bottom.</p>
      <p>Commonly used for mobile interfaces and action sheets.</p>
    </ui-drawer>

   ? <!-- Size Drawers -->
    <ui-drawer
      [open]="smallDrawer.
mallDrawerQ_Drawer (280px)q
drawer (28esimple navigation or minimal content.</p>
    </ui-drawer>

    <ui-drawer
      [open]="mediumDrawer.@DrawerQ_Drawer (360px)q
drawer (36'  <p>Good balance between content space and screen real estate.</p>
    </ui-drawer>

    <ui-drawer
      [open]="largeDrawer(.DrawerQ_CDrawer (480px)q large drawer (48&  <p>Ideal for detailed content, forms&.drawer>

    <ui-drawer
      [open]="xlDrawer.xlDrawerQ_ODrawer (640px)q(
drawer (64  <p>Use for very detailed interfaces or when you need more space.</p>
    </ui-drawer>

    <!-- Configuration Drawers -->
   ( <ui-drawer
      [open]="noHeaderDrawer.$DrawerQ$mBarsD%sDrawer%%drawer%JDrawer5&O6drawer>

    <ui-drawer
      [open]="withFooterDrawer.withFooterDrawerQ/0Drawer&\drawer['S.</p>
      <p>The footer stays at the bottom even if the content is scrollable.</p 5'withFooterDrawer1-(=withFooterDrawer1-)?drawer>

    <ui-drawerl)Drawer.noPaddingDrawerQ/0)Drawer)]*?16px;">
        <p>Content below can still have its own padding +6drawer>

    <ui-drawer
      [open]="persistentDrawer.persistentDrawerQ/0$Persistent Drawer"
      [persistent1,is a persistent drawer that doesn't have a backdrop.</p>
      <p>It stays open until explicitly closed and doesn't block interlaction with the rest of the page.</p>
      <p>Perfect for navigation menus that should remain visible.</p>
ApersistentDrawer5&,4 Drawer</ui-button>
    </ui-drawer>

    <ui-drawerQ+Drawer.notClosableDrawerQ/0Not Closable Drawer"
      [c++gdrawerS,Drawer1-OTdrawer>

    <!-- Interactive Drawers -->
    <ui-drawer
      [open]="loadingDrawer.loadingDrawerQ/0.o6drawer>

    <ui-drawer
      [open]="scrollableDrawer."DrawerQ/0.6drawer>

    <ui-drawer
      [open]="navigationDrawer.navigationDrawerQ/0
Navigation!nav style="margin: -16px 0;"0nav-item" (click)="logEvent('Home clicked')">
  %Home  <span>Home</spa5nav-item" (click)="logEvent('Dashboard clicked')">
  %	ChartLine  <span>Dashboard</spa3nav-item" (click)="logEvent('Profile clicked')">
  %User  <span>Profile</spa4nav-item" (click)="logEvent('Messages clicked')">
  %Envelope  <span>Messages</spa4nav-item" (click)="logEvent('Settings clicked')">
  %Cog  <span>Settings</spana K'-
  %QuestionCircle  Help
[($[drawer>

    <!-- Custom Configuration Drawer -->
    <ui-drawer
      [open]="customDrawer.customDrawerQ6" position]="customConfig.position6%[persistent]="customConfig.persistent7!Drawerqdrawer7s"Position: {{ customConfig.position88-8Persistep8
persistent9Drawer1-6:#drawer:drawer:&Drawer:(Bars = faBars;
  readonly faUser = faUser;
  readonly faCog = faCog;
  readonly faHome = faHome;
  readonly faChartLine = faChartLine;
  readonly faEnvelope = faEnvelope;
  readonly faQuestionCircle = faQuestionCircle;

  // Drawer states
  basicDrawer =b=	eftDrawer0<rightDrawer0<	topDrawer0<bottomDrawer`=smallDrawer0<mediumDrawer0<largeDrawer0<xlDrawer`=<Drawer0<withFooterDrawer0<.=	Drawer0<persistentDrawer0<P=Drawer`=Drawer0<scrollableDrawer0<navigationDrawer0<customDrawer=nposition: 'lef`>f,
    persistent: false?&Drawer()) {
        this.loadingDrawer@{}]Zx!<import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { EmptyStateComponent } from '../../../../../ui-essentials/src/lib/components/feedback/empty-state/empty-state.component';

@Component({
  selector: 'ui-empty-state-demo',
  standalone: true,
  imports: [CommonModule, EmptyStateComponent],
  template: `
    <div class="demo-container">
      <h2>Empty State Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-grid">
          @for (size of sizes; track size) {
            <ui-empty-state 
              [size]="size"
              title="No items found"
              description="There are no items to display at the moment."
              actionLabel="Add Item"
              icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2 2v-5m16 0h-5.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 009.586 13H4' /></svg>"
              (action)="handleDemoClick('Size: ' + size)">
            </ui-empty-state>
            <p class="demo-label">{{ size }} size</p>
          }
        </div>
      </section>
      
      <!-- Variant Types -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-grid">
          <ui-empty-state 
            variant="default"
            title="No data available"
            description="There's nothing here yet. Start by adding some content."
            actionLabel="Get Started"
            icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z' /></svg>"
            (action)="handleDemoClick('Default variant')">
          </ui-empty-state>
          <p class="demo-label">Default</p>

          <ui-empty-state 
            variant="search"
            title="No search results"
            description="We couldn't find anything matching your search. Try adjusting your filters or search terms."
            actionLabel="Clear Filters"
            icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z' /></svg>"
            (action)="handleDemoClick('Search variant')">
          </ui-empty-state>
          <p class="demo-label">Search</p>

          <ui-empty-state 
            variant="error"
            title="Something went wrong"
            description="We encountered an error while loading your content. Please try again."
            actionLabel="Retry"
            icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z' /></svg>"
            (action)="handleDemoClick('Error variant')">
          </ui-empty-state>
          <p class="demo-label">Error</p>

          <ui-empty-state 
            variant="loading"
            title="Loading content..."
            description="Please wait while we fetch your data.">
          </ui-empty-state>
          <p class="demo-label">Loading</p>

          <ui-empty-state 
            variant="success"
            title="All done!"
            description="You've completed all tasks. Great work!"
            actionLabel="Start Over"
            icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z' /></svg>"
            (action)="handleDemoClick('Success variant')">
          </ui-empty-state>
          <p class="demo-label">Success</p>
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-grid">
          <ui-empty-state 
            title="Normal state"
            description="This is a normal empty state with an action button."
            actionLabel="Take Action"
            icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M13 10V3L4 14h7v7l9-11h-7z' /></svg>"
            (action)="handleDemoClick('Normal state')">
          </ui-empty-state>
          <p class="demo-label">Normal</p>

          <ui-empty-state 
            title="Disabled action"
            description="This empty state has a disabled action button."
            actionLabel="Disabled Action"
            [disabled]="true"
            icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728L5.636 5.636m12.728 12.728L18.364 5.636M5.636 18.364l12.728-12.728' /></svg>"
            (action)="handleDemoClick('Disabled state')">
          </ui-empty-state>
          <p class="demo-label">Disabled</p>

          <ui-empty-state 
            title="No action button"
            description="This empty state doesn't have an action button."
            icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z' /></svg>">
          </ui-empty-state>
          <p class="demo-label">No Action</p>
        </div>
      </section>

      <!-- Content Projection -->
      <section class="demo-section">
        <h3>Custom Content</h3>
        <div class="demo-grid">
          <ui-empty-state 
            title="Custom content"
            description="You can add custom content inside the empty state."
            icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zM7 21h10a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4z' /></svg>">
            <div style="margin: 16px 0; padding: 16px; background: var(--semantic-color-surface-secondary, #f8f9fa); border-radius: 8px;">
              <p style="margin: 0; color: var(--semantic-color-text-secondary, #6c757d); font-size: 14px;">
                This is custom content projected into the empty state component.
                You can add any HTML or Angular components here.
              </p>
            </div>
          </ui-empty-state>
          <p class="demo-label">With Content Projection</p>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <ui-empty-state 
          title="Interactive Demo"
          description="Click the button below to see the interaction in action."
          actionLabel="Click Me!"
          icon="<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122' /></svg>"
          (action)="handleDemoClick('Interactive example')">
        </ui-empty-state>
        <div class="demo-output">
          <p><strong>Action clicked:</strong> {{ lastAction || 'None' }}</p>
          <p><strong>Click count:</strong> {{ clickCount }}</p>
        </div>
      </section>
    </div>
  `,
  styleUrl: './empty-state-demo.component.scss'
})
export class EmptyStateDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['default', 'search', 'error', 'loading', 'success'] as const;
  clickCount = 0;
  lastAction: string | null = null;
  
  handleDemoClick(action: string): void {
    this.clickCount++;
    this.lastAction = action;
    console.log('Empty state action clicked:', action);
  }
}I=jQx;y^*  Jx zz*ap\ѼJZr9ͺ%ce5xjRimport { Component, ChangeDetectionStrategy, OnInit, TemplateRef, ViewChild, AfterViewInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { 
  EnhancedTableComponent, 
  EnhancedTableColumn, 
  EnhancedTableVariant,
  TableSort, 
  TableFilter, 
  EnhancedTableSortEvent,
  EnhancedTableFilterEvent,
  EnhancedTableColumnResizeEvent,
  EnhancedTableColumnReorderEvent,
  VirtualScrollConfig
} from '../../../../../ui-essentials/src/lib/components/data-display/table/enhanced-table.component';
import { StatusBadgeComponent } from '../../../../../ui-essentials/src/lib/components/feedback/status-badge.component';

interface Employee {
  id: number;
  name: string;
  email: string;
  department: string;
  position: string;
  salary: number;
  status: 'active' | 'inactive' | 'pending';
  joinDate: string;
  performance: number;
  location: string;
}

@Component({
  selector: 'ui-enhanced-table-demo',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    EnhancedTableComponent,
    StatusBadgeComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Enhanced Table Component Showcase</h2>
      <p style="margin-bottom: 2rem; color: #6c757d;">Enterprise-grade data table with virtual scrolling, column resizing/reordering, and advanced filtering.</p>
      
      <!-- Basic Enhanced Table -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Enhanced Table</h3>
        <ui-enhanced-table
          [data]="smallDataset"
          [columns]="basicColumns"
          variant="default"
          [virtualScrolling]="{ enabled: false, itemHeight: 48, buffer: 5 }"
          [showFilterRow]="true"
          [maxHeight]="'400px'"
          (sortChange)="handleSort($event)"
          (filterChange)="handleFilter($event)"
          (columnResize)="handleColumnResize($event)"
          (columnReorder)="handleColumnReorder($event)"
          (rowClick)="handleRowClick($event)">
        </ui-enhanced-table>
      </section>

      <!-- Table Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Table Variants</h3>
        
        <div style="margin-bottom: 2rem;">
          <h4>Striped Enhanced Table</h4>
          <ui-enhanced-table
            [data]="smallDataset.slice(0, 5)"
            [columns]="basicColumns"
            variant="striped"
            [virtualScrolling]="{ enabled: false, itemHeight: 48, buffer: 5 }"
            [showFilterRow]="false"
            [maxHeight]="'300px'">
          </ui-enhanced-table>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Bordered Enhanced Table</h4>
          <ui-enhanced-table
            [data]="smallDataset.slice(0, 5)"
            [columns]="basicColumns"
            variant="bordered"
            [virtualScrolling]="{ enabled: false, itemHeight: 48, buffer: 5 }"
            [showFilterRow]="false"
            [maxHeight]="'300px'">
          </ui-enhanced-table>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Minimal Enhanced Table</h4>
          <ui-enhanced-table
            [data]="smallDataset.slice(0, 5)"
            [columns]="basicColumns"
            variant="minimal"
            [virtualScrolling]="{ enabled: false, itemHeight: 48, buffer: 5 }"
            [showFilterRow]="false"
            [maxHeight]="'300px'">
          </ui-enhanced-table>
        </div>
      </section>

      <!-- Virtual Scrolling Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>Virtual Scrolling ({{ largeDataset.length.toLocaleString() }} Records)</h3>
        <p style="margin-bottom: 1rem; color: #6c757d;">
          Virtual scrolling efficiently handles large datasets by only rendering visible rows.
          Performance metrics are displayed below the table.
        </p>
        
        <ui-enhanced-table
          [data]="largeDataset"
          [columns]="performanceColumns"
          variant="default"
          [virtualScrolling]="virtualConfig"
          [showFilterRow]="true"
          [maxHeight]="'500px'"
          [cellTemplates]="cellTemplates"
          (sortChange)="handleSort($event)"
          (filterChange)="handleFilter($event)"
          (columnResize)="handleColumnResize($event)"
          (columnReorder)="handleColumnReorder($event)">
        </ui-enhanced-table>

        @if (performanceMetrics) {
          <div style="margin-top: 1rem; padding: 1rem; background: #f8f9fa; border-radius: 8px; border-left: 4px solid #007bff;">
            <h4>Performance Metrics:</h4>
            <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-top: 0.5rem;">
              <div><strong>Render Time:</strong> {{ performanceMetrics.renderTime }}ms</div>
              <div><strong>Sort Time:</strong> {{ performanceMetrics.sortTime }}ms</div>
              <div><strong>Filter Time:</strong> {{ performanceMetrics.filterTime }}ms</div>
              <div><strong>Visible Rows:</strong> {{ performanceMetrics.visibleRows }}</div>
            </div>
          </div>
        }
      </section>

      <!-- Advanced Features -->
      <section style="margin-bottom: 3rem;">
        <h3>Advanced Features with Custom Cell Templates</h3>
        <ui-enhanced-table
          [data]="smallDataset"
          [columns]="advancedColumns"
          variant="default"
          [virtualScrolling]="{ enabled: false, itemHeight: 48, buffer: 5 }"
          [showFilterRow]="true"
          [maxHeight]="'400px'"
          [cellTemplates]="cellTemplates"
          (sortChange)="handleSort($event)"
          (filterChange)="handleFilter($event)"
          (rowClick)="handleRowClick($event)">
        </ui-enhanced-table>

        <!-- Templates -->
        <ng-template #statusTemplate let-value let-row="row">
          <ui-status-badge 
            [variant]="getStatusVariant(value)"
            [dot]="true"
            size="medium">
            {{ value | titlecase }}
          </ui-status-badge>
        </ng-template>

        <ng-template #salaryTemplate let-value>
          <span style="font-weight: 600; color: #28a745;">
            {{ value | currency:'USD':'symbol':'1.0-0' }}
          </span>
        </ng-template>

        <ng-template #performanceTemplate let-value>
          <div style="display: flex; align-items: center; gap: 0.5rem;">
            <div style="flex: 1; background: #e9ecef; border-radius: 4px; height: 8px; overflow: hidden;">
              <div 
                [style.width.%]="value"
                [style.background-color]="getPerformanceColor(value)"
                style="height: 100%; transition: width 0.3s ease;">
              </div>
            </div>
            <span style="font-size: 0.875rem; min-width: 35px;">{{ value }}%</span>
          </div>
        </ng-template>

        <ng-template #actionsTemplate let-row="row" let-index="index">
          <div style="display: flex; gap: 0.5rem; justify-content: center;">
            <button 
              (click)="editEmployee(row)" 
              style="padding: 0.25rem 0.5rem; border: 1px solid #007bff; background: #007bff; color: white; border-radius: 4px; cursor: pointer; font-size: 0.75rem;">
              Edit
            </button>
            <button 
              (click)="deleteEmployee(row.id)" 
              style="padding: 0.25rem 0.5rem; border: 1px solid #dc3545; background: #dc3545; color: white; border-radius: 4px; cursor: pointer; font-size: 0.75rem;">
              Delete
            </button>
          </div>
        </ng-template>
      </section>

      <!-- Column Configuration Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Column Configuration</h3>
        <div style="display: flex; gap: 2rem; margin-bottom: 1.5rem; flex-wrap: wrap;">
          <label style="display: flex; align-items: center; gap: 0.5rem;">
            <input type="checkbox" [(ngModel)]="enableResize" (change)="updateTableConfig()">
            Enable Column Resizing
          </label>
          <label style="display: flex; align-items: center; gap: 0.5rem;">
            <input type="checkbox" [(ngModel)]="enableReorder" (change)="updateTableConfig()">
            Enable Column Reordering
          </label>
          <label style="display: flex; align-items: center; gap: 0.5rem;">
            <input type="checkbox" [(ngModel)]="showTableFilters" (change)="updateTableConfig()">
            Show Filters
          </label>
          <label style="display: flex; align-items: center; gap: 0.5rem;">
            <input type="checkbox" [(ngModel)]="enableVirtual" (change)="updateTableConfig()">
            Enable Virtual Scrolling
          </label>
        </div>

        <ui-enhanced-table
          [data]="configDataset"
          [columns]="configColumns"
          variant="default"
          [virtualScrolling]="configVirtualConfig"
          [showFilterRow]="showTableFilters"
          [maxHeight]="'400px'"
          (sortChange)="handleSort($event)"
          (filterChange)="handleFilter($event)"
          (columnResize)="handleColumnResize($event)"
          (columnReorder)="handleColumnReorder($event)">
        </ui-enhanced-table>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Enhanced Table:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-enhanced-table 
  [data]="employees"
  [columns]="columns"
  variant="default"
  [enableColumnResize]="true"
  [enableColumnReorder]="true"
  [showFilters]="true"
  [height]="500"
  (sort)="handleSort($event)"
  (filter)="handleFilter($event)"&gt;
&lt;/ui-enhanced-table&gt;</code></pre>
          
          <h4>With Virtual Scrolling:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-enhanced-table 
  [data]="largeDataset"
  [columns]="columns"
  [virtualScrollConfig]="{{ '{' }} 
    enabled: true, 
    itemHeight: 48, 
    bufferSize: 10 
  {{ '}' }}"
  [height]="600"&gt;
&lt;/ui-enhanced-table&gt;</code></pre>

          <h4>Column Configuration:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>columns: EnhancedTableColumn[] = [
  {{ '{' }} 
    key: 'name', 
    label: 'Name', 
    width: 150,
    sortable: true,
    filterable: true,
    filterType: 'text',
    resizable: true,
    draggable: true
  {{ '}' }},
  {{ '{' }} 
    key: 'salary', 
    label: 'Salary', 
    width: 120,
    sortable: true,
    filterable: true,
    filterType: 'number',
    resizable: true
  {{ '}' }}
];</code></pre>
        </div>
      </section>

      <!-- Interactive Controls -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Demo Controls</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button (click)="addRandomEmployee()" style="padding: 0.5rem 1rem; border: 1px solid #28a745; background: #28a745; color: white; border-radius: 4px; cursor: pointer;">
            Add Random Employee
          </button>
          <button (click)="generateLargeDataset()" style="padding: 0.5rem 1rem; border: 1px solid #17a2b8; background: #17a2b8; color: white; border-radius: 4px; cursor: pointer;">
            Generate Large Dataset (10k)
          </button>
          <button (click)="clearAllEmployees()" style="padding: 0.5rem 1rem; border: 1px solid #dc3545; background: #dc3545; color: white; border-radius: 4px; cursor: pointer;">
            Clear All Data
          </button>
          <button (click)="resetDemo()" style="padding: 0.5rem 1rem; border: 1px solid #6c757d; background: #6c757d; color: white; border-radius: 4px; cursor: pointer;">
            Reset Demo
          </button>
        </div>
        
        @if (lastAction) {
          <div style="padding: 1rem; background: #d4edda; border: 1px solid #c3e6cb; border-radius: 4px; color: #155724;">
            <strong>Last Action:</strong> {{ lastAction }}
          </div>
        }
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }

    label {
      cursor: pointer;
      font-weight: 500;
    }
    
    input[type="checkbox"] {
      cursor: pointer;
    }
  `]
})
export class EnhancedTableDemoComponent implements OnInit, AfterViewInit {
  @ViewChild('statusTemplate') statusTemplate!: TemplateRef<any>;
  @ViewChild('salaryTemplate') salaryTemplate!: TemplateRef<any>;
  @ViewChild('performanceTemplate') performanceTemplate!: TemplateRef<any>;
  @ViewChild('actionsTemplate') actionsTemplate!: TemplateRef<any>;

  // Demo state
  lastAction = '';
  performanceMetrics: any = null;
  
  // Configuration
  enableResize = true;
  enableReorder = true;
  showTableFilters = true;
  enableVirtual = false;

  // Cell templates
  cellTemplates: Record<string, TemplateRef<any>> = {};

  // Virtual scroll config
  virtualConfig: VirtualScrollConfig = {
    enabled: true,
    itemHeight: 48,
    buffer: 10
  };

  configVirtualConfig: VirtualScrollConfig = {
    enabled: false,
    itemHeight: 48,
    buffer: 10
  };

  // Sample data
  smallDataset: Employee[] = [];
  largeDataset: Employee[] = [];
  configDataset: Employee[] = [];

  // Column definitions
  basicColumns: EnhancedTableColumn[] = [
    { key: 'name', label: 'Name', width: 150, sortable: true, filterable: true, filterType: 'text', resizable: true, draggable: true },
    { key: 'email', label: 'Email', width: 200, sortable: true, filterable: true, filterType: 'text', resizable: true, draggable: true },
    { key: 'department', label: 'Department', width: 140, sortable: true, filterable: true, filterType: 'select', filterOptions: this.getDepartmentOptions(), resizable: true, draggable: true },
    { key: 'position', label: 'Position', width: 160, sortable: true, filterable: true, filterType: 'text', resizable: true, draggable: true },
    { key: 'joinDate', label: 'Join Date', width: 120, sortable: true, filterable: true, filterType: 'date', resizable: true, draggable: true }
  ];

  performanceColumns: EnhancedTableColumn[] = [
    { key: 'name', label: 'Name', width: 120, sortable: true, filterable: true, filterType: 'text', resizable: true, draggable: true, sticky: true },
    { key: 'department', label: 'Department', width: 120, sortable: true, filterable: true, filterType: 'select', filterOptions: this.getDepartmentOptions(), resizable: true, draggable: true },
    { key: 'position', label: 'Position', width: 140, sortable: true, filterable: true, filterType: 'text', resizable: true, draggable: true },
    { key: 'salary', label: 'Salary', width: 100, sortable: true, filterable: true, filterType: 'number', resizable: true, draggable: true, align: 'right' },
    { key: 'performance', label: 'Performance', width: 120, sortable: true, filterable: true, filterType: 'number', resizable: true, draggable: true },
    { key: 'location', label: 'Location', width: 120, sortable: true, filterable: true, filterType: 'select', filterOptions: this.getLocationOptions(), resizable: true, draggable: true }
  ];

  advancedColumns: EnhancedTableColumn[] = [
    { key: 'name', label: 'Name', width: 150, sortable: true, filterable: true, filterType: 'text', resizable: true, draggable: true },
    { key: 'email', label: 'Email', width: 200, sortable: true, filterable: true, filterType: 'text', resizable: true, draggable: true },
    { key: 'status', label: 'Status', width: 100, sortable: true, filterable: true, filterType: 'select', filterOptions: this.getStatusOptions(), resizable: true, draggable: true, align: 'center' },
    { key: 'salary', label: 'Salary', width: 120, sortable: true, filterable: true, filterType: 'number', resizable: true, draggable: true, align: 'right' },
    { key: 'performance', label: 'Performance', width: 140, sortable: true, filterable: true, filterType: 'number', resizable: true, draggable: true },
    { key: 'actions', label: 'Actions', width: 100, resizable: true, align: 'center' }
  ];

  configColumns: EnhancedTableColumn[] = [
    { key: 'name', label: 'Name', width: 150, sortable: true, filterable: true, filterType: 'text', resizable: true, draggable: true },
    { key: 'department', label: 'Department', width: 140, sortable: true, filterable: true, filterType: 'select', filterOptions: this.getDepartmentOptions(), resizable: true, draggable: true },
    { key: 'salary', label: 'Salary', width: 120, sortable: true, filterable: true, filterType: 'number', resizable: true, draggable: true, align: 'right' },
    { key: 'joinDate', label: 'Join Date', width: 120, sortable: true, filterable: true, filterType: 'date', resizable: true, draggable: true }
  ];

  ngOnInit(): void {
    this.initializeData();
  }

  ngAfterViewInit(): void {
    // Set up cell templates after view init
    setTimeout(() => {
      this.cellTemplates = {
        'status': this.statusTemplate,
        'salary': this.salaryTemplate,
        'performance': this.performanceTemplate,
        'actions': this.actionsTemplate
      };
    });
  }

  // Event handlers
  handleSort(event: EnhancedTableSortEvent): void {
    this.lastAction = `Sorted by ${event.sorting.map(s => `${s.column} (${s.direction})`).join(', ')}`;
    console.log('Sort event:', event);
  }

  handleFilter(event: EnhancedTableFilterEvent): void {
    this.lastAction = `Filtered: ${event.filters.length} filters active`;
    console.log('Filter event:', event);
  }

  handleColumnResize(event: EnhancedTableColumnResizeEvent): void {
    this.lastAction = `Resized column "${event.column}" to ${event.width}px`;
    console.log('Column resize event:', event);
  }

  handleColumnReorder(event: EnhancedTableColumnReorderEvent): void {
    this.lastAction = `Reordered columns from index ${event.fromIndex} to ${event.toIndex}`;
    console.log('Column reorder event:', event);
  }

  handleRowClick(event: {row: Employee, index: number}): void {
    this.lastAction = `Clicked row: ${event.row.name} (index: ${event.index})`;
    console.log('Row click:', event);
  }

  editEmployee(employee: Employee): void {
    this.lastAction = `Editing employee: ${employee.name}`;
    console.log('Edit employee:', employee);
  }

  // Configuration updates
  updateTableConfig(): void {
    this.configVirtualConfig = {
      ...this.configVirtualConfig,
      enabled: this.enableVirtual
    };
    this.lastAction = `Updated table configuration`;
  }

  // Template helpers
  getStatusVariant(status: string): 'success' | 'warning' | 'danger' | 'info' | 'neutral' | 'primary' | 'secondary' {
    switch (status?.toLowerCase()) {
      case 'active':
        return 'success';
      case 'pending':
        return 'warning';
      case 'inactive':
        return 'danger';
      default:
        return 'neutral';
    }
  }

  getPerformanceColor(performance: number): string {
    if (performance >= 90) return '#28a745';
    if (performance >= 80) return '#17a2b8';
    if (performance >= 70) return '#ffc107';
    return '#dc3545';
  }


  // Filter options
  getDepartmentOptions() {
    return [
      { label: 'Engineering', value: 'Engineering' },
      { label: 'Marketing', value: 'Marketing' },
      { label: 'Sales', value: 'Sales' },
      { label: 'HR', value: 'HR' },
      { label: 'Finance', value: 'Finance' }
    ];
  }

  getStatusOptions() {
    return [
      { label: 'Active', value: 'active' },
      { label: 'Inactive', value: 'inactive' },
      { label: 'Pending', value: 'pending' }
    ];
  }

  getLocationOptions() {
    return [
      { label: 'New York', value: 'New York' },
      { label: 'San Francisco', value: 'San Francisco' },
      { label: 'London', value: 'London' },
      { label: 'Toronto', value: 'Toronto' },
      { label: 'Sydney', value: 'Sydney' }
    ];
  }

  // Demo actions
  addRandomEmployee(): void {
    const names = ['John Doe', 'Jane Smith', 'Mike Johnson', 'Sarah Wilson', 'Tom Anderson', 'Lisa Brown', 'David Clark', 'Emma Davis'];
    const departments = ['Engineering', 'Marketing', 'Sales', 'HR', 'Finance'];
    const positions = ['Manager', 'Developer', 'Analyst', 'Coordinator', 'Specialist'];
    const statuses: ('active' | 'inactive' | 'pending')[] = ['active', 'inactive', 'pending'];
    const locations = ['New York', 'San Francisco', 'London', 'Toronto', 'Sydney'];
    
    const newEmployee: Employee = {
      id: Math.max(...this.smallDataset.map(e => e.id), 0) + 1,
      name: names[Math.floor(Math.random() * names.length)],
      email: `user${Date.now()}@company.com`,
      department: departments[Math.floor(Math.random() * departments.length)],
      position: positions[Math.floor(Math.random() * positions.length)],
      salary: Math.floor(Math.random() * 100000) + 50000,
      status: statuses[Math.floor(Math.random() * statuses.length)],
      joinDate: new Date(2020 + Math.floor(Math.random() * 5), Math.floor(Math.random() * 12), Math.floor(Math.random() * 28) + 1).toISOString().split('T')[0],
      performance: Math.floor(Math.random() * 41) + 60,
      location: locations[Math.floor(Math.random() * locations.length)]
    };
    
    this.smallDataset = [...this.smallDataset, newEmployee];
    this.configDataset = [...this.configDataset, newEmployee];
    this.lastAction = `Added new employee: ${newEmployee.name}`;
  }

  generateLargeDataset(): void {
    this.largeDataset = this.createLargeDataset(10000);
    this.performanceMetrics = {
      renderTime: Math.floor(Math.random() * 50) + 10,
      sortTime: 0,
      filterTime: 0,
      visibleRows: Math.min(10, this.largeDataset.length)
    };
    this.lastAction = `Generated ${this.largeDataset.length.toLocaleString()} employee records`;
  }

  clearAllEmployees(): void {
    this.smallDataset = [];
    this.largeDataset = [];
    this.configDataset = [];
    this.performanceMetrics = null;
    this.lastAction = 'Cleared all employee data';
  }

  resetDemo(): void {
    this.initializeData();
    this.lastAction = 'Demo reset to initial state';
  }

  // Data generation
  private initializeData(): void {
    this.smallDataset = this.createSmallDataset();
    this.configDataset = [...this.smallDataset];
    this.largeDataset = this.createLargeDataset(50000);
    this.performanceMetrics = {
      renderTime: Math.floor(Math.random() * 30) + 10,
      sortTime: 0,
      filterTime: 0,
      visibleRows: Math.min(10, this.largeDataset.length)
    };
  }

  private createSmallDataset(): Employee[] {
    return [
      {
        id: 1,
        name: 'Alice Johnson',
        email: 'alice.johnson@company.com',
        department: 'Engineering',
        position: 'Senior Developer',
        salary: 95000,
        status: 'active',
        joinDate: '2022-01-15',
        performance: 92,
        location: 'San Francisco'
      },
      {
        id: 2,
        name: 'Bob Smith',
        email: 'bob.smith@company.com',
        department: 'Marketing',
        position: 'Marketing Manager',
        salary: 78000,
        status: 'active',
        joinDate: '2021-06-10',
        performance: 85,
        location: 'New York'
      },
      {
        id: 3,
        name: 'Carol Williams',
        email: 'carol.williams@company.com',
        department: 'Sales',
        position: 'Sales Representative',
        salary: 65000,
        status: 'pending',
        joinDate: '2023-03-22',
        performance: 78,
        location: 'London'
      },
      {
        id: 4,
        name: 'David Brown',
        email: 'david.brown@company.com',
        department: 'HR',
        position: 'HR Specialist',
        salary: 58000,
        status: 'active',
        joinDate: '2022-08-05',
        performance: 88,
        location: 'Toronto'
      },
      {
        id: 5,
        name: 'Eve Davis',
        email: 'eve.davis@company.com',
        department: 'Finance',
        position: 'Financial Analyst',
        salary: 72000,
        status: 'active',
        joinDate: '2021-11-18',
        performance: 91,
        location: 'Sydney'
      },
      {
        id: 6,
        name: 'Frank Miller',
        email: 'frank.miller@company.com',
        department: 'Engineering',
        position: 'DevOps Engineer',
        salary: 88000,
        status: 'inactive',
        joinDate: '2020-04-12',
        performance: 82,
        location: 'San Francisco'
      }
    ];
  }

  private createLargeDataset(count: number): Employee[] {
    const dataset: Employee[] = [];
    const firstNames = ['Alice', 'Bob', 'Carol', 'David', 'Eve', 'Frank', 'Grace', 'Henry', 'Ivy', 'Jack'];
    const lastNames = ['Johnson', 'Smith', 'Williams', 'Brown', 'Davis', 'Miller', 'Wilson', 'Moore', 'Taylor', 'Anderson'];
    const departments = ['Engineering', 'Marketing', 'Sales', 'HR', 'Finance'];
    const positions = ['Manager', 'Senior Developer', 'Developer', 'Analyst', 'Coordinator', 'Specialist', 'Representative'];
    const statuses: ('active' | 'inactive' | 'pending')[] = ['active', 'inactive', 'pending'];
    const locations = ['New York', 'San Francisco', 'London', 'Toronto', 'Sydney'];

    for (let i = 0; i < count; i++) {
      const firstName = firstNames[Math.floor(Math.random() * firstNames.length)];
      const lastName = lastNames[Math.floor(Math.random() * lastNames.length)];
      
      dataset.push({
        id: i + 1000,
        name: `${firstName} ${lastName}`,
        email: `${firstName.toLowerCase()}.${lastName.toLowerCase()}@company.com`,
        department: departments[Math.floor(Math.random() * departments.length)],
        position: positions[Math.floor(Math.random() * positions.length)],
        salary: Math.floor(Math.random() * 100000) + 50000,
        status: statuses[Math.floor(Math.random() * statuses.length)],
        joinDate: new Date(2020 + Math.floor(Math.random() * 5), Math.floor(Math.random() * 12), Math.floor(Math.random() * 28) + 1).toISOString().split('T')[0],
        performance: Math.floor(Math.random() * 41) + 60,
        location: locations[Math.floor(Math.random() * locations.length)]
      });
    }

    return dataset;
  }

  deleteEmployee(id: number): void {
    this.smallDataset = this.smallDataset.filter(emp => emp.id !== id);
    this.configDataset = this.configDataset.filter(emp => emp.id !== id);
    this.lastAction = `Deleted employee with ID: ${id}`;
  }
}ɚ;x"Tݭ-TemplateRef, ViewChildZRTablNC)TableAction, TableActionsOB3table-actions.component';
import type { TableColumnX9+table.component';
import type { TableSortEvU<)interface User46-!role: string;
  lastLogin: string_ D&(,
    TableActionsE{
      <!-- Basic TableP>#Basic Table</h3>
        <ui-table !userData@Ksize	hoverable&@	y1Γ
#table 
            [data]="userDataH	size$  [hoverable]="true">
          </uip"
\
9
#table 
            [data]="userDataH.size$  [hoverable]="true">
          </uip"
\
0Minimal
#table 
            [data]="userData]size$  [hoverable]="true">
          </ui4SizFHSize Variants</h3A$%NCompact Size</h4>
          <ui-table 
            [data]="userData.slice(0, 4
=&"?  size="compact"
            [hoverable]="true">
          </uip"
\
0RComfortable Size</h4>
          <ui-table 
            [data]="userData.slice(0, 4
=&"C  size="comfortable"
            [hoverable]="true">
          </ui4\	Table with Status and ActionO?	<Table with Status Badges and Actions</h3>
        <ui-table !userData@-7size	hoverableE)[sortColumn]="currentSortColumn"
          [sortDirection]="currentSortDirection"
          (sort)="handleAdvancedSort($event)"=yAdvanced table>

        <!-- Cell<&<ui-table-actions 
            [actions]="getActionsForUser(row)"
            [data]="row"
            [index]="index"
         (   size="medium"
            [showLabelsB(actionClick)="handleAction($event)">
          </ui-table-actions6Sticky Header TableP>Sticky Header Table>+#max-height: 300px; overflow-y: auto2ddd; border-radius: 8px;">
          <ui-table 
  g*0&"*  size="compact"
            [stickyHeader$  [hoverable]="true">
          </ui4Loading StateP>%Loading State</h3>
        <ui-table ![]@Ksizeloading]="isLoading"
          loadingMessage="Loading user data...">
        </ui-table>
        <button 
          (click)="toggleLoading()"
         ~#+ %O.3{{ isLoading ? 'Stop Loading' : 'Start Loading' }}
A.Empty StateP>#Empty State</h3>
        <ui-table ![]@KsizeshowEmptyStateIemptyMessage="No users found. Try adding some users first.">
        </ui%Selectable TableP>'Selectable Rows</h3>
        <ui-table !userData.slice(0, 6)@Ksize
selectable	hoverable((selectionChange)="handleSelectionChange/table>
        @if (selectedUsers.length > 0) {'e3f2fda'M">
            <strong>Selected users:</strong> {{ selectedUsers.length }}
  4@for (user of selectedUsers; track user.id) {
      (display: inline-block; margin: 0.25rem; ackground: #fffa'L">
                  {{ user.name }}
                </span>
              }Lr$_%wtable 
  [data]="tableData'6variant="striped"
  size="default"
  [hoverable]="true&#"&&5%'rtable 
  [data]="userData'&gt;
&lt;/ui-table&gt;

&lt;%&gt;
  &lt;ui-status-badge [variant]="getVariant(value)"&gt;
    {{ "{{ value }}" }}
  &lt;/ui-status-badge&gt;
&lt;/ng-templatm(B	{{ '{' }}?sortable: true)?sortable: true)$@ align: 'center')!B"align: 'right'*2User,4+iUser
].-Users,4:O.0.
Users
].&  `]
})
export class TableDemoComponen4T49isLoading = false;
  selectedUsers: User[] = [];
  lastAction = '';
  currentSortColumn = '';
  currentSortDirection: 'asc' | 'desc' | null = null;
5<(userData: User[] = [
    {
      id: 1,
[#email: 'alice@example.com',
~\role: 'Admin',
      lastLogin: '2024-01-15',
      joinDate: '2023-01-15'
    },
    {
      id: 2,
      name: 'Bob Smith',
      email: 'bob@example.com',
b role: 'User',
      lastLogin: '2024-01-10',
      joinDate: '2023-02-20'
    },
    {
      id: 3,
      name: 'Carol Williams`^	email: 'carol@example.com',
^/role: 'Editor',
      lastLogin: '2024-01-14',
_10'
    },
    {
      id: 4,
_!email: 'david@example.com',
~\drole: 'User',
      lastLogin: '2024-01-16',
      joinDate: '2023-04-05'
    },
    {
      id: 5,
`email: 'eve@example.com',
~\erole: 'Admin',
      lastLogin: '2024-01-16',
      joinDate: '2023-05-12'
    },
    {
      id: 6,
a"email: 'frank@example.com',
b frole: 'User',
      lastLogin: '2024-01-08',
      joinDate: '2023-06-18'
    }
  ];

  basicColumns: B4sortP82sortP8role', label: 'Role', sort>$astLogin', label: 'Last Login', sortmD
  ];

  advancedColumns: B4sortP82sort@4@role', label: 'Role', sortP8'BCalign: 'right', width: '120px' }
  ];

  largeDataset: User[] = [];TE[F05
    // Generate large dataset for sticky header demoNW0W50);
  }

  handleSort(event: FA&column} (${event.direction || 'none'})=G7AdvancedSort(event: F!currentSortColumn = event.column;
    this.currentSortDirection = event.direction;
    this.handleSort(event);
    
    // Actually sort the data
    if (event.direction) {
      this.userData.sort((a, b) => {
        const aVal = this.getCellValue(a, event.column);
        const bVal = this.getCellValue(b, event.column);
        
        if (event.direction === 'asc') {
          return aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
        } else {
          return aVal > bVal ? -1 : aVal < bVal ? 1 : 0;
        }
      });
    }I$UserInG"AdvancedRowClick(event: {row: UserI1CAdvanced row click: ${event.row.name}`;
    console.log('Advanced r^JnG%SelectionChange(selectedUsers: User[]XelectedUsers = selectedUsers;JSelection changed: ${selectedUsers.length} users selected`;
  }

  handleAction(event: any): void {
    const { action, data, index } = event;JAction "${action.id}" on user ${data.name} (index: ${index})`;
    
    switch (action.id) {
      case 'edit':
        consoleJuser:', data);
        break;
      case 'delete':
        this.deleteUser(data.id);
        break;
      case 'view':
        :console.log('View user:', data);
        break;
    }
  }
L%any {
    const variants: any = {
      'active': 'success',
      'inactive': 'danger', 
      'pending': 'warning'
    };
    return variants[status] || 'neutral';
  }

  getActionsForUser(user: User): TableAction[] {
    const baseActions: TableAction[] = [
      { id: 'view', label: 'View', variant: 'view', icon: '👁️' },
      { id: 'edit', label: 'Edit', variant: 'edit', icon: '✏️' }
    ];

    if (user.status !== 'active') {
      baseActions.push({ 
        id: 'delete', 
        label: 'Delete', 
        variant: 'delete', 
        icon: '🗑️',
        confirmMessage: `Are you sure you want to delete ${use	r.name}?`i!baseActions;
  }

  toggleLoadingXisLoading = !this.isLoading;JHLoading ${this.isLoading ? 'started' : 'stopped'}`;
  }

  addRandomUserfQf;];
    const roles = ['Admin', 'User', 'Editor', 'ModeratorRgYS
User: UseryS userData.map(u => u.id)Sdexample.com`TM
role: roleT*roles.length)],
      lastLogin: new Date(U%FUU_V'userData = [...this.userData, newUser];JV
+user: ${newUser.name}`;
  }

  clearAllUserX+userData = [];
    this.selectedUsers = [];JZYuserstY'DngOnInit();
    this.selectedUsers = [];
    this.isLoading = false;JY&private deleteUseriuserData = this.userData.filter(user => user.id !== id);
    this.selectedUsers = this.selectedUsers.filter(user => user.id !== id);JDeleted user with ID: ${id}`;
  }

  private getCellValue(row: any, key: string): any {
    return key.split('.').reduce((obj, 0prop) => obj?.[prop], row) ?? '';
  }

  private/W%cUser=cUser[] = [];pQAlex', 'Morgan', 'Casey', 'Jordan', 'Taylor', 'Riley', 'Avery', 'Quinn'];
    const domains = ['example.com', 'test.com', 'demoX.com', 'sample.com'];
    const roles = ['Admin', 'User', 'Editor', 'Moderator', 'ViewerRce-f",
        name: `${names[i % names.length]} ${i + 1}`,
        email: `user${i + 100}@${domains[i % domains.length]}`,
        )hii % statuses.length],
        role: roles[i % roles.length],
        lastLogin: new Date(2024, 0, (i % 30U*8`PU3, (i % 12), (i %U%i-#E.// Reset to initial data
    this.userData = [`[7@example.com']$-role: 'Admin',
        lastLogin: '2024-01-15/`3-01-15!^]1@example.com']b,role: 'User',
        lastLogin: '2024-01-10/`3-02-20!^W@example.com']^.role: 'Editor',
        lastLogin: '2024-01-14/`_10!^z_5@example.com']$,role: 'User',
        lastLogin: '2024-01-16/`3-04-05!^`1@example.com']$-role: 'Admin',
        lastLogin: '2024-01-16/`3-05-12!^a6@example.com']b,role: 'User',
        lastLogin: '2024-01-08/`3-06-18'
      }
    ];
  }
}yۜx]'import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FabMenuComponent, FabMenuDirection, FabMenuItem, FabMenuPosition, FabMenuSize, FabMenuVariant } from '../../../../../ui-essentials/src/lib/components/buttons/fab-menu';

@Component({
  selector: 'ui-fab-menu-demo',
  standalone: true,
  imports: [CommonModule, FabMenuComponent],
  template: `
    <div class="demo-container">
      <h2>Floating Action Button Menu Demo</h2>
      <p>An interactive floating action button menu that expands to reveal multiple action items.</p>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-example">
              <h4>{{ size | titlecase }}</h4>
              <ui-fab-menu 
                [size]="size"
                [menuItems]="basicMenuItems"
                [triggerIcon]="plusIcon"
                [closeIcon]="closeIcon"
                triggerLabel="Open {{ size }} menu"
                (itemClicked)="handleItemClick($event)">
              </ui-fab-menu>
            </div>
          }
        </div>
      </section>
      
      <!-- Color Variants -->
      <section class="demo-section">
        <h3>Color Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <div class="demo-example">
              <h4>{{ variant | titlecase }}</h4>
              <ui-fab-menu 
                [variant]="variant"
                [menuItems]="getVariantMenuItems(variant)"
                [triggerIcon]="plusIcon"
                [closeIcon]="closeIcon"
                [triggerLabel]="variant + ' menu'"
                (itemClicked)="handleItemClick($event)">
              </ui-fab-menu>
            </div>
          }
        </div>
      </section>
      
      <!-- Direction Variants -->
      <section class="demo-section">
        <h3>Direction Variants</h3>
        <div class="demo-row demo-row--spaced">
          @for (direction of directions; track direction) {
            <div class="demo-example">
              <h4>{{ direction | titlecase }}</h4>
              <ui-fab-menu 
                [direction]="direction"
                [menuItems]="basicMenuItems"
                [triggerIcon]="plusIcon"
                [closeIcon]="closeIcon"
                [triggerLabel]="direction + ' direction menu'"
                (itemClicked)="handleItemClick($event)">
              </ui-fab-menu>
            </div>
          }
        </div>
      </section>
      
      <!-- Position Variants (Fixed Positioning) -->
      <section class="demo-section">
        <h3>Fixed Positions</h3>
        <p>These examples show fixed positioning variants (click to activate):</p>
        <div class="demo-row">
          @for (position of positions; track position) {
            <button 
              class="demo-button"
              (click)="togglePositionDemo(position)">
              Show {{ position | titlecase }} FAB Menu
            </button>
          }
        </div>
        
        @if (activePositionDemo) {
          <ui-fab-menu 
            [position]="activePositionDemo"
            [menuItems]="positionMenuItems"
            [triggerIcon]="menuIcon"
            [closeIcon]="closeIcon"
            [triggerLabel]="activePositionDemo + ' positioned menu'"
            (opened)="onMenuOpened()"
            (closed)="onMenuClosed()"
            (itemClicked)="handlePositionItemClick($event)">
          </ui-fab-menu>
        }
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <div class="demo-example">
            <h4>Disabled</h4>
            <ui-fab-menu 
              [disabled]="true"
              [menuItems]="basicMenuItems"
              [triggerIcon]="plusIcon"
              triggerLabel="Disabled menu">
            </ui-fab-menu>
          </div>
          
          <div class="demo-example">
            <h4>No Backdrop</h4>
            <ui-fab-menu 
              [backdrop]="false"
              [menuItems]="basicMenuItems"
              [triggerIcon]="plusIcon"
              [closeIcon]="closeIcon"
              triggerLabel="Menu without backdrop"
              (itemClicked)="handleItemClick($event)">
            </ui-fab-menu>
          </div>
          
          <div class="demo-example">
            <h4>Stay Open</h4>
            <ui-fab-menu 
              [closeOnItemClick]="false"
              [menuItems]="basicMenuItems"
              [triggerIcon]="plusIcon"
              [closeIcon]="closeIcon"
              triggerLabel="Menu stays open"
              (itemClicked)="handleItemClick($event)">
            </ui-fab-menu>
          </div>
        </div>
      </section>
      
      <!-- Advanced Examples -->
      <section class="demo-section">
        <h3>Advanced Examples</h3>
        
        <div class="demo-example">
          <h4>Mixed Item Variants</h4>
          <ui-fab-menu 
            [menuItems]="mixedMenuItems"
            [triggerIcon]="settingsIcon"
            [closeIcon]="closeIcon"
            triggerLabel="Settings menu"
            (itemClicked)="handleItemClick($event)">
          </ui-fab-menu>
        </div>
        
        <div class="demo-example">
          <h4>Large Menu with Icons</h4>
          <ui-fab-menu 
            size="lg"
            [menuItems]="iconMenuItems"
            [triggerIcon]="appsIcon"
            [closeIcon]="closeIcon"
            triggerLabel="App launcher"
            (itemClicked)="handleItemClick($event)">
          </ui-fab-menu>
        </div>
      </section>
      
      <!-- Interactive Feedback -->
      <section class="demo-section">
        <h3>Event Log</h3>
        <div class="demo-log">
          @if (eventLog.length === 0) {
            <p class="demo-log__empty">No events yet. Interact with the FAB menus above.</p>
          } @else {
            @for (event of eventLog.slice(-10); track $index) {
              <div class="demo-log__entry">
                <span class="demo-log__time">{{ event.timestamp | date:'HH:mm:ss' }}</span>
                <span class="demo-log__message">{{ event.message }}</span>
              </div>
            }
          }
        </div>
        <button class="demo-button demo-button--secondary" (click)="clearLog()">Clear Log</button>
      </section>
    </div>
  `,
  styleUrl: './fab-menu-demo.component.scss'
})
export class FabMenuDemoComponent {
  sizes: FabMenuSize[] = ['sm', 'md', 'lg'];
  variants: FabMenuVariant[] = ['primary', 'secondary', 'success', 'danger'];
  directions: FabMenuDirection[] = ['up', 'down', 'left', 'right'];
  positions: FabMenuPosition[] = ['bottom-right', 'bottom-left', 'top-right', 'top-left'];
  
  activePositionDemo: FabMenuPosition | null = null;
  eventLog: Array<{timestamp: Date, message: string}> = [];
  
  // Icons (using simple text for demo - could be replaced with FontAwesome or other icon library)
  plusIcon = '<span>+</span>';
  closeIcon = '<span>×</span>';
  menuIcon = '<span>☰</span>';
  settingsIcon = '<span>⚙</span>';
  appsIcon = '<span>⊞</span>';
  
  basicMenuItems: FabMenuItem[] = [
    { id: 'action1', label: 'Action 1', icon: '<span>📝</span>' },
    { id: 'action2', label: 'Action 2', icon: '<span>📁</span>' },
    { id: 'action3', label: 'Action 3', icon: '<span>📊</span>' }
  ];
  
  positionMenuItems: FabMenuItem[] = [
    { id: 'close', label: 'Close Menu', icon: '<span>×</span>' },
    { id: 'home', label: 'Go Home', icon: '<span>🏠</span>' },
    { id: 'profile', label: 'Profile', icon: '<span>👤</span>' },
    { id: 'settings', label: 'Settings', icon: '<span>⚙</span>' }
  ];
  
  mixedMenuItems: FabMenuItem[] = [
    { id: 'save', label: 'Save', variant: 'success', icon: '<span>💾</span>' },
    { id: 'edit', label: 'Edit', variant: 'primary', icon: '<span>✏️</span>' },
    { id: 'delete', label: 'Delete', variant: 'danger', icon: '<span>🗑️</span>' },
    { id: 'disabled', label: 'Disabled', disabled: true, icon: '<span>🚫</span>' }
  ];
  
  iconMenuItems: FabMenuItem[] = [
    { id: 'email', label: 'Email', icon: '<span>📧</span>' },
    { id: 'calendar', label: 'Calendar', icon: '<span>📅</span>' },
    { id: 'documents', label: 'Documents', icon: '<span>📄</span>' },
    { id: 'photos', label: 'Photos', icon: '<span>📸</span>' },
    { id: 'music', label: 'Music', icon: '<span>🎵</span>' },
    { id: 'videos', label: 'Videos', icon: '<span>🎬</span>' }
  ];
  
  getVariantMenuItems(variant: FabMenuVariant): FabMenuItem[] {
    return [
      { id: `${variant}1`, label: `${variant} Item 1`, variant },
      { id: `${variant}2`, label: `${variant} Item 2`, variant },
      { id: `${variant}3`, label: `${variant} Item 3`, variant }
    ];
  }
  
  handleItemClick(event: {item: FabMenuItem, event: Event}): void {
    this.logEvent(`Item clicked: ${event.item.label} (${event.item.id})`);
  }
  
  togglePositionDemo(position: FabMenuPosition): void {
    if (this.activePositionDemo === position) {
      this.activePositionDemo = null;
      this.logEvent(`Closed ${position} positioned menu`);
    } else {
      this.activePositionDemo = position;
      this.logEvent(`Opened ${position} positioned menu`);
    }
  }
  
  handlePositionItemClick(event: {item: FabMenuItem, event: Event}): void {
    if (event.item.id === 'close') {
      this.activePositionDemo = null;
      this.logEvent('Closed positioned menu via menu item');
    } else {
      this.logEvent(`Position menu item clicked: ${event.item.label}`);
    }
  }
  
  onMenuOpened(): void {
    this.logEvent('Menu opened');
  }
  
  onMenuClosed(): void {
    this.logEvent('Menu closed');
  }
  
  logEvent(message: string): void {
    this.eventLog.push({
      timestamp: new Date(),
      message
    });
  }
  
  clearLog(): void {
    this.eventLog = [];
    this.logEvent('Event log cleared');
  }
}ɓ&x/import { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { FeedLayoutComponent, FeedItem } from 'ui-essentials';

interface DemoFeedItem extends FeedItem {
  title: string;
  content: string;
  timestamp: Date;
  author: string;
  likes: number;
  type: 'text' | 'image' | 'video';
}

@Component({
  selector: 'ui-feed-layout-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, FeedLayoutComponent],
  template: `
    <div class="demo-container">
      <h2>Feed Layout Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-feed-wrapper">
              <h4>{{ size | titlecase }}</h4>
              <ui-feed-layout 
                [size]="size"
                [loading]="false"
                [enableInfiniteScroll]="false"
                [enableRefresh]="false"
                class="demo-feed demo-feed--preview">
                @for (item of sampleItems.slice(0, 2); track item.id) {
                  <div class="demo-feed-item">
                    <div class="demo-feed-item__header">
                      <strong>{{ item.author }}</strong>
                      <span class="demo-feed-item__timestamp">{{ item.timestamp | date:'short' }}</span>
                    </div>
                    <h5 class="demo-feed-item__title">{{ item.title }}</h5>
                    <p class="demo-feed-item__content">{{ item.content }}</p>
                    <div class="demo-feed-item__actions">
                      <button class="demo-feed-item__action">♡ {{ item.likes }}</button>
                      <button class="demo-feed-item__action">💬 Comment</button>
                      <button class="demo-feed-item__action">↗ Share</button>
                    </div>
                  </div>
                }
              </ui-feed-layout>
            </div>
          }
        </div>
      </section>
      
      <!-- Interactive Feed -->
      <section class="demo-section">
        <h3>Interactive Feed with Infinite Scroll</h3>
        <div class="demo-controls">
          <button (click)="resetFeed()" [disabled]="isLoading()">Reset Feed</button>
          <button (click)="toggleError()">
            {{ hasError() ? 'Clear Error' : 'Simulate Error' }}
          </button>
          <label>
            <input type="checkbox" [(ngModel)]="enableRefreshControl" />
            Enable Pull to Refresh
          </label>
        </div>
        
        <ui-feed-layout 
          size="md"
          [loading]="isLoading()"
          [hasError]="hasError()"
          [errorMessage]="errorMessage"
          [isEmpty]="feedItems().length === 0 && !isLoading()"
          [enableInfiniteScroll]="true"
          [enableRefresh]="enableRefreshControl"
          (loadMore)="loadMoreItems()"
          (refresh)="refreshFeed()"
          (retry)="retryLoad()"
          class="demo-feed demo-feed--interactive"
          #interactiveFeed>
          
          @for (item of feedItems(); track item.id) {
            <div class="demo-feed-item">
              <div class="demo-feed-item__header">
                <strong>{{ item.author }}</strong>
                <span class="demo-feed-item__badge demo-feed-item__badge--{{item.type}}">
                  {{ item.type }}
                </span>
                <span class="demo-feed-item__timestamp">{{ item.timestamp | date:'short' }}</span>
              </div>
              <h5 class="demo-feed-item__title">{{ item.title }}</h5>
              <p class="demo-feed-item__content">{{ item.content }}</p>
              <div class="demo-feed-item__actions">
                <button 
                  class="demo-feed-item__action"
                  (click)="toggleLike(item)">
                  {{ item.likes > 0 ? '❤️' : '♡' }} {{ item.likes }}
                </button>
                <button class="demo-feed-item__action">💬 Comment</button>
                <button class="demo-feed-item__action">↗ Share</button>
              </div>
            </div>
          }
          
          <!-- Empty state slot -->
          <div slot="empty" class="demo-empty-state">
            <div class="demo-empty-state__icon">📝</div>
            <h4>No posts yet</h4>
            <p>Be the first to share something!</p>
            <button (click)="addSampleContent()" class="demo-empty-state__button">
              Add Sample Content
            </button>
          </div>
        </ui-feed-layout>
      </section>
      
      <!-- States Demo -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <div class="demo-feed-wrapper">
            <h4>Loading State</h4>
            <ui-feed-layout 
              size="sm"
              [loading]="true"
              [enableInfiniteScroll]="false"
              [enableRefresh]="false"
              class="demo-feed demo-feed--preview">
              @for (item of sampleItems.slice(0, 1); track item.id) {
                <div class="demo-feed-item demo-feed-item--loading">
                  <div class="demo-feed-item__header">
                    <strong>{{ item.author }}</strong>
                  </div>
                  <h5 class="demo-feed-item__title">{{ item.title }}</h5>
                  <p class="demo-feed-item__content">{{ item.content }}</p>
                </div>
              }
            </ui-feed-layout>
          </div>
          
          <div class="demo-feed-wrapper">
            <h4>Error State</h4>
            <ui-feed-layout 
              size="sm"
              [loading]="false"
              [hasError]="true"
              errorMessage="Network connection failed"
              [enableInfiniteScroll]="false"
              [enableRefresh]="false"
              class="demo-feed demo-feed--preview">
            </ui-feed-layout>
          </div>
          
          <div class="demo-feed-wrapper">
            <h4>Empty State</h4>
            <ui-feed-layout 
              size="sm"
              [loading]="false"
              [isEmpty]="true"
              [enableInfiniteScroll]="false"
              [enableRefresh]="false"
              class="demo-feed demo-feed--preview">
              <div slot="empty" class="demo-empty-state demo-empty-state--small">
                <div class="demo-empty-state__icon">📭</div>
                <p>No content available</p>
              </div>
            </ui-feed-layout>
          </div>
        </div>
      </section>
      
      <!-- Usage Statistics -->
      <section class="demo-section">
        <h3>Usage Statistics</h3>
        <div class="demo-stats">
          <div class="demo-stat">
            <span class="demo-stat__label">Total Items:</span>
            <span class="demo-stat__value">{{ feedItems().length }}</span>
          </div>
          <div class="demo-stat">
            <span class="demo-stat__label">Load More Calls:</span>
            <span class="demo-stat__value">{{ loadMoreCount }}</span>
          </div>
          <div class="demo-stat">
            <span class="demo-stat__label">Refresh Calls:</span>
            <span class="demo-stat__value">{{ refreshCount }}</span>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './feed-layout-demo.component.scss'
})
export class FeedLayoutDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  
  protected readonly feedItems = signal<DemoFeedItem[]>([]);
  protected readonly isLoading = signal(false);
  protected readonly hasError = signal(false);
  
  protected errorMessage = '';
  protected enableRefreshControl = true;
  protected loadMoreCount = 0;
  protected refreshCount = 0;
  
  protected sampleItems: DemoFeedItem[] = [
    {
      id: '1',
      title: 'Getting Started with Angular 19',
      content: 'Angular 19 brings exciting new features including improved SSR, better performance, and enhanced developer experience.',
      timestamp: new Date(Date.now() - 3600000),
      author: 'Sarah Chen',
      likes: 42,
      type: 'text'
    },
    {
      id: '2',
      title: 'Building Responsive Layouts',
      content: 'Learn how to create flexible, mobile-first designs that work beautifully across all devices.',
      timestamp: new Date(Date.now() - 7200000),
      author: 'Mike Rodriguez',
      likes: 28,
      type: 'image'
    },
    {
      id: '3',
      title: 'TypeScript Best Practices',
      content: 'Discover advanced TypeScript patterns and techniques to write more maintainable code.',
      timestamp: new Date(Date.now() - 10800000),
      author: 'Alex Kim',
      likes: 35,
      type: 'video'
    }
  ];
  
  constructor() {
    this.addSampleContent();
  }
  
  loadMoreItems(): void {
    if (this.isLoading() || this.hasError()) return;
    
    this.loadMoreCount++;
    this.isLoading.set(true);
    
    // Simulate API call delay
    setTimeout(() => {
      const currentItems = this.feedItems();
      const nextBatch = this.generateItems(3, currentItems.length);
      this.feedItems.set([...currentItems, ...nextBatch]);
      this.isLoading.set(false);
    }, 1500);
  }
  
  refreshFeed(): void {
    this.refreshCount++;
    this.isLoading.set(true);
    this.hasError.set(false);
    
    // Simulate refresh delay
    setTimeout(() => {
      const newItems = this.generateItems(5, 0);
      this.feedItems.set(newItems);
      this.isLoading.set(false);
    }, 1000);
  }
  
  retryLoad(): void {
    this.hasError.set(false);
    this.loadMoreItems();
  }
  
  resetFeed(): void {
    this.feedItems.set([]);
    this.hasError.set(false);
    this.isLoading.set(false);
    this.loadMoreCount = 0;
    this.refreshCount = 0;
    this.addSampleContent();
  }
  
  toggleError(): void {
    if (this.hasError()) {
      this.hasError.set(false);
      this.errorMessage = '';
    } else {
      this.hasError.set(true);
      this.errorMessage = 'Failed to load more content. Please check your connection.';
    }
  }
  
  toggleLike(item: DemoFeedItem): void {
    const items = this.feedItems();
    const index = items.findIndex(i => i.id === item.id);
    if (index !== -1) {
      const updatedItems = [...items];
      updatedItems[index] = { ...item, likes: item.likes > 0 ? 0 : 1 };
      this.feedItems.set(updatedItems);
    }
  }
  
  addSampleContent(): void {
    const items = this.generateItems(5, 0);
    this.feedItems.set(items);
  }
  
  private generateItems(count: number, startId: number): DemoFeedItem[] {
    const contentTemplates = [
      {
        title: 'Web Development Trends',
        content: 'Exploring the latest trends in modern web development and what they mean for developers.',
        author: 'Jane Doe',
        type: 'text' as const
      },
      {
        title: 'UI/UX Design Principles',
        content: 'Understanding the fundamental principles that make great user interfaces and experiences.',
        author: 'John Smith',
        type: 'image' as const
      },
      {
        title: 'Performance Optimization',
        content: 'Tips and techniques for optimizing web application performance and user experience.',
        author: 'Emma Wilson',
        type: 'video' as const
      },
      {
        title: 'Accessibility Matters',
        content: 'Why web accessibility is crucial and how to implement it in your projects.',
        author: 'David Brown',
        type: 'text' as const
      },
      {
        title: 'Mobile-First Design',
        content: 'Best practices for designing mobile-first responsive web applications.',
        author: 'Lisa Garcia',
        type: 'image' as const
      }
    ];
    
    return Array.from({ length: count }, (_, index) => {
      const template = contentTemplates[index % contentTemplates.length];
      const id = startId + index + 1;
      
      return {
        id: id.toString(),
        title: `${template.title} #${id}`,
        content: template.content,
        timestamp: new Date(Date.now() - (index + 1) * 1800000),
        author: template.author,
        likes: Math.floor(Math.random() * 50),
        type: template.type
      };
    });
  }
}\gXx3:import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { FileUploadComponent, UploadedFile } from '../../../../../ui-essentials/src/lib/components/forms/file-upload/file-upload.component';

@Component({
  selector: 'ui-file-upload-demo',
  standalone: true,
  imports: [CommonModule, ReactiveFormsModule, FileUploadComponent],
  template: `
    <div class="demo-container">
      <h2>File Upload Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-grid">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <h4>{{ size.toUpperCase() }} Size</h4>
              <p>File upload with {{ size }} sizing.</p>
              <ui-file-upload 
                [size]="size"
                label="Upload Files ({{ size }})"
                [multiple]="true"
                helperText="Select one or more files to upload"
                (filesSelected)="onFilesSelected('size-' + size, $event)"
              >
              </ui-file-upload>
            </div>
          }
        </div>
      </section>
      
      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-grid">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <h4>{{ variant | titlecase }} Variant</h4>
              <p>File upload with {{ variant }} styling.</p>
              <ui-file-upload 
                [variant]="variant"
                label="Upload Files ({{ variant }})"
                [multiple]="true"
                helperText="Drag & drop or browse to select files"
                (filesSelected)="onFilesSelected('variant-' + variant, $event)"
              >
              </ui-file-upload>
            </div>
          }
        </div>
      </section>
      
      <!-- File Type Restrictions -->
      <section class="demo-section">
        <h3>File Type Restrictions</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Images Only</h4>
            <p>Accepts only image files (JPEG, PNG, GIF, WebP).</p>
            <ui-file-upload 
              label="Upload Images"
              [acceptedTypes]="['image/jpeg', 'image/png', 'image/gif', 'image/webp']"
              accept="image/*"
              [multiple]="true"
              helperText="Only image files are accepted"
              (filesSelected)="onFilesSelected('images', $event)"
            >
            </ui-file-upload>
          </div>
          
          <div class="demo-item">
            <h4>Documents Only</h4>
            <p>Accepts PDF, Word, and Excel documents.</p>
            <ui-file-upload 
              label="Upload Documents"
              [acceptedTypes]="['.pdf', '.doc', '.docx', '.xls', '.xlsx']"
              accept=".pdf,.doc,.docx,.xls,.xlsx"
              [multiple]="true"
              helperText="PDF, Word, and Excel files only"
              (filesSelected)="onFilesSelected('documents', $event)"
            >
            </ui-file-upload>
          </div>
        </div>
      </section>
      
      <!-- Size Limits -->
      <section class="demo-section">
        <h3>Size & File Limits</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Size Limit (5MB)</h4>
            <p>Maximum file size of 5MB per file.</p>
            <ui-file-upload 
              label="Upload Files (5MB limit)"
              [maxFileSize]="5242880"
              [multiple]="true"
              helperText="Max file size: 5MB"
              (filesSelected)="onFilesSelected('size-limit', $event)"
            >
            </ui-file-upload>
          </div>
          
          <div class="demo-item">
            <h4>File Count Limit</h4>
            <p>Maximum of 3 files can be selected.</p>
            <ui-file-upload 
              label="Upload Files (3 max)"
              [maxFiles]="3"
              [multiple]="true"
              helperText="Maximum 3 files allowed"
              (filesSelected)="onFilesSelected('file-limit', $event)"
            >
            </ui-file-upload>
          </div>
          
          <div class="demo-item">
            <h4>Single File</h4>
            <p>Only one file can be selected.</p>
            <ui-file-upload 
              label="Upload Single File"
              [multiple]="false"
              helperText="Select a single file to upload"
              (filesSelected)="onFilesSelected('single-file', $event)"
            >
            </ui-file-upload>
          </div>
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Disabled State</h4>
            <p>File upload in disabled state.</p>
            <ui-file-upload 
              label="Disabled Upload"
              [disabled]="true"
              helperText="This upload is disabled"
              (filesSelected)="onFilesSelected('disabled', $event)"
            >
            </ui-file-upload>
          </div>
          
          <div class="demo-item">
            <h4>Error State</h4>
            <p>File upload showing error state.</p>
            <ui-file-upload 
              label="Upload with Error"
              state="error"
              errorMessage="Please select valid files"
              [multiple]="true"
              (filesSelected)="onFilesSelected('error', $event)"
            >
            </ui-file-upload>
          </div>
          
          <div class="demo-item">
            <h4>Success State</h4>
            <p>File upload showing success state.</p>
            <ui-file-upload 
              label="Successful Upload"
              state="success"
              helperText="Files uploaded successfully!"
              [multiple]="true"
              (filesSelected)="onFilesSelected('success', $event)"
            >
            </ui-file-upload>
          </div>
        </div>
      </section>
      
      <!-- Reactive Form Integration -->
      <section class="demo-section">
        <h3>Reactive Form Integration</h3>
        <div class="demo-item">
          <h4>Form with Validation</h4>
          <p>File upload integrated with Angular reactive forms and validation.</p>
          
          <form [formGroup]="uploadForm" (ngSubmit)="onSubmit()">
            <ui-file-upload 
              label="Required File Upload"
              formControlName="files"
              [multiple]="true"
              [required]="true"
              [acceptedTypes]="['.pdf', '.doc', '.docx', 'image/*']"
              [maxFileSize]="10485760"
              [maxFiles]="5"
              helperText="Required field - select 1-5 files (PDF, Word, or images, max 10MB each)"
              [state]="getFormFieldState('files')"
              [errorMessage]="getFormFieldError('files')"
              (filesSelected)="onFormFilesSelected($event)"
            >
            </ui-file-upload>
            
            <div class="demo-actions">
              <button 
                type="submit" 
                class="demo-button"
                [disabled]="uploadForm.invalid"
              >
                Submit Form
              </button>
              <button 
                type="button" 
                class="demo-button demo-button--secondary"
                (click)="resetForm()"
              >
                Reset
              </button>
              <div class="demo-info">
                Form Status: {{ uploadForm.status }} | 
                Form Valid: {{ uploadForm.valid }} |
                Files Count: {{ uploadForm.get('files')?.value?.length || 0 }}
              </div>
            </div>
          </form>
          
          @if (submittedFiles.length > 0) {
            <div class="file-list-demo">
              <h5>Submitted Files:</h5>
              @for (file of submittedFiles; track file.id) {
                <div class="file-item">
                  <div>
                    <div class="file-info">{{ file.name }}</div>
                    <div class="file-size">{{ formatFileSize(file.size) }}</div>
                  </div>
                </div>
              }
            </div>
          }
        </div>
      </section>
      
      <!-- Event Handling -->
      <section class="demo-section">
        <h3>Event Handling</h3>
        <div class="demo-item">
          <h4>Event Monitoring</h4>
          <p>Monitor file upload events in real-time.</p>
          
          <ui-file-upload 
            label="Event Demo Upload"
            [multiple]="true"
            [maxFiles]="3"
            helperText="Add/remove files to see events below"
            (filesSelected)="onEventFilesSelected($event)"
            (fileAdded)="onFileAdded($event)"
            (fileRemoved)="onFileRemoved($event)"
          >
          </ui-file-upload>
          
          <div class="file-list-demo">
            <h5>Recent Events:</h5>
            @if (recentEvents.length === 0) {
              <p class="demo-info">No events yet. Add or remove files to see events.</p>
            } @else {
              @for (event of recentEvents.slice(-5).reverse(); track $index) {
                <div class="file-item">
                  <div>
                    <div class="file-info">{{ event.type }}: {{ event.fileName }}</div>
                    <div class="file-size">{{ event.timestamp | date:'medium' }}</div>
                  </div>
                </div>
              }
            }
          </div>
        </div>
      </section>
      
      <!-- Code Example -->
      <section class="demo-section">
        <h3>Usage Example</h3>
        <div class="code-demo">
          <pre><code>{{ codeExample }}</code></pre>
        </div>
      </section>
    </div>
  `,
  styleUrl: './file-upload-demo.component.scss'
})
export class FileUploadDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['outlined', 'filled', 'underlined'] as const;
  
  uploadForm = new FormGroup({
    files: new FormControl<UploadedFile[]>([], [Validators.required])
  });
  
  submittedFiles: UploadedFile[] = [];
  recentEvents: Array<{type: string, fileName: string, timestamp: Date}> = [];
  
  readonly codeExample = `import { FileUploadComponent, UploadedFile } from '../../../../../ui-essentials/src/lib/components/forms/file-upload/file-upload.component';

// Basic usage
<ui-file-upload 
  label="Upload Files"
  [multiple]="true"
  [acceptedTypes]="['image/*', '.pdf']"
  [maxFileSize]="5242880"
  [maxFiles]="5"
  helperText="Select up to 5 files (images or PDF, max 5MB each)"
  (filesSelected)="onFilesSelected($event)"
>
</ui-file-upload>

// With reactive forms
<ui-file-upload 
  formControlName="files"
  [required]="true"
  [state]="getFieldState('files')"
  [errorMessage]="getFieldError('files')"
>
</ui-file-upload>

// Event handling
onFilesSelected(files: UploadedFile[]): void {
  console.log('Selected files:', files);
  files.forEach(file => {
    console.log(file.name, file.size, file.type);
  });
}`;

  onFilesSelected(context: string, files: UploadedFile[]): void {
    console.log(`Files selected in ${context}:`, files);
  }

  onFormFilesSelected(files: UploadedFile[]): void {
    this.uploadForm.patchValue({ files });
    this.uploadForm.get('files')?.markAsTouched();
  }

  onEventFilesSelected(files: UploadedFile[]): void {
    this.addEvent('filesSelected', `${files.length} files total`);
  }

  onFileAdded(file: UploadedFile): void {
    this.addEvent('fileAdded', file.name);
  }

  onFileRemoved(file: UploadedFile): void {
    this.addEvent('fileRemoved', file.name);
  }

  private addEvent(type: string, fileName: string): void {
    this.recentEvents.push({
      type,
      fileName,
      timestamp: new Date()
    });
  }

  onSubmit(): void {
    if (this.uploadForm.valid) {
      this.submittedFiles = this.uploadForm.get('files')?.value || [];
      console.log('Form submitted with files:', this.submittedFiles);
    }
  }

  resetForm(): void {
    this.uploadForm.reset();
    this.uploadForm.get('files')?.setValue([]);
    this.submittedFiles = [];
  }

  getFormFieldState(fieldName: string): 'default' | 'error' | 'success' {
    const control = this.uploadForm.get(fieldName);
    if (control?.invalid && control?.touched) {
      return 'error';
    }
    if (control?.valid && control?.value?.length > 0) {
      return 'success';
    }
    return 'default';
  }

  getFormFieldError(fieldName: string): string {
    const control = this.uploadForm.get(fieldName);
    if (control?.invalid && control?.touched) {
      if (control.errors?.['required']) {
        return 'Please select at least one file';
      }
    }
    return '';
  }

  formatFileSize(bytes: number): string {
    if (bytes === 0) return '0 Bytes';
    const k = 1024;
    const sizes = ['Bytes', 'KB', 'MB', 'GB'];
    const i = Math.floor(Math.log(bytes) / Math.log(k));
    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
  }
}Sx;1mwn==ߌ73>U-M-.N+L)\ Hºx!%@use '../../../../../ui-design-system/src/styles/semantic' as *;

.demo-container {
  padding: $semantic-spacing-component-lg;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: $semantic-spacing-layout-section-xl;
  
  h3 {
    font-family: map-get($semantic-typography-heading-h3, font-family);
    font-size: map-get($semantic-typography-heading-h3, font-size);
    font-weight: map-get($semantic-typography-heading-h3, font-weight);
    line-height: map-get($semantic-typography-heading-h3, line-height);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-md;
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
    padding-bottom: $semantic-spacing-component-sm;
  }
  
  h4 {
    font-family: map-get($semantic-typography-heading-h4, font-family);
    font-size: map-get($semantic-typography-heading-h4, font-size);
    font-weight: map-get($semantic-typography-heading-h4, font-weight);
    line-height: map-get($semantic-typography-heading-h4, line-height);
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  p {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-component-md;
  }
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: $semantic-spacing-grid-gap-lg;
  margin-bottom: $semantic-spacing-layout-section-md;
}

.demo-item {
  padding: $semantic-spacing-component-md;
  background: $semantic-color-surface-secondary;
  border-radius: $semantic-border-radius-md;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
}

.demo-controls {
  display: flex;
  flex-wrap: wrap;
  gap: $semantic-spacing-component-sm;
  margin-bottom: $semantic-spacing-component-lg;
  padding: $semantic-spacing-component-md;
  background: $semantic-color-surface-elevated;
  border-radius: $semantic-border-radius-md;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  
  button {
    padding: $semantic-spacing-interactive-button-padding-y $semantic-spacing-interactive-button-padding-x;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-sm;
    background: $semantic-color-surface-primary;
    color: $semantic-color-text-primary;
    cursor: pointer;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    font-family: map-get($semantic-typography-button-medium, font-family);
    font-size: map-get($semantic-typography-button-medium, font-size);
    font-weight: map-get($semantic-typography-button-medium, font-weight);
    line-height: map-get($semantic-typography-button-medium, line-height);
    
    &:hover {
      background: $semantic-color-surface-elevated;
      box-shadow: $semantic-shadow-button-hover;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    &.active {
      background: $semantic-color-primary;
      color: $semantic-color-on-primary;
      border-color: $semantic-color-primary;
    }
    
    &:disabled {
      opacity: $semantic-opacity-disabled;
      cursor: not-allowed;
      pointer-events: none;
    }
  }
}

.selection-info {
  margin-top: $semantic-spacing-component-lg;
  padding: $semantic-spacing-component-md;
  background: $semantic-color-surface-elevated;
  border-radius: $semantic-border-radius-md;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  
  p {
    font-weight: $semantic-typography-font-weight-semibold;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  ul {
    list-style: none;
    padding: 0;
    margin: 0;
    
    li {
      padding: $semantic-spacing-content-line-tight 0;
      border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
      
      &:last-child {
        border-bottom: none;
      }
    }
  }
}

.event-log {
  background: $semantic-color-surface-elevated;
  border-radius: $semantic-border-radius-md;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  overflow: hidden;
  
  .event-controls {
    padding: $semantic-spacing-component-md;
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
    background: $semantic-color-surface-secondary;
    
    button {
      padding: $semantic-spacing-interactive-button-padding-y $semantic-spacing-interactive-button-padding-x;
      border: $semantic-border-width-1 solid $semantic-color-border-primary;
      border-radius: $semantic-border-radius-sm;
      background: $semantic-color-surface-primary;
      color: $semantic-color-text-primary;
      cursor: pointer;
      transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
      
      font-family: map-get($semantic-typography-button-small, font-family);
      font-size: map-get($semantic-typography-button-small, font-size);
      font-weight: map-get($semantic-typography-button-small, font-weight);
      line-height: map-get($semantic-typography-button-small, line-height);
      
      &:hover {
        background: $semantic-color-surface-elevated;
        box-shadow: $semantic-shadow-button-hover;
      }
      
      &:focus-visible {
        outline: 2px solid $semantic-color-focus;
        outline-offset: 2px;
      }
    }
  }
  
  .event-list {
    max-height: 300px;
    overflow-y: auto;
    
    .no-events {
      padding: $semantic-spacing-component-lg;
      text-align: center;
      color: $semantic-color-text-tertiary;
      font-style: italic;
    }
    
    .event-item {
      display: grid;
      grid-template-columns: 120px 1fr auto;
      gap: $semantic-spacing-component-sm;
      padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
      border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
      
      &:last-child {
        border-bottom: none;
      }
      
      .event-type {
        font-weight: $semantic-typography-font-weight-semibold;
        color: $semantic-color-primary;
        font-family: map-get($semantic-typography-body-small, font-family);
        font-size: map-get($semantic-typography-body-small, font-size);
        line-height: map-get($semantic-typography-body-small, line-height);
      }
      
      .event-details {
        color: $semantic-color-text-primary;
        font-family: map-get($semantic-typography-body-small, font-family);
        font-size: map-get($semantic-typography-body-small, font-size);
        font-weight: map-get($semantic-typography-body-small, font-weight);
        line-height: map-get($semantic-typography-body-small, line-height);
      }
      
      .event-time {
        color: $semantic-color-text-tertiary;
        font-family: map-get($semantic-typography-body-small, font-family);
        font-size: map-get($semantic-typography-body-small, font-size);
        font-weight: map-get($semantic-typography-body-small, font-weight);
        line-height: map-get($semantic-typography-body-small, line-height);
        white-space: nowrap;
      }
    }
  }
}

// Responsive Design
@media (max-width: $semantic-breakpoint-md - 1) {
  .demo-container {
    padding: $semantic-spacing-component-md;
  }
  
  .demo-grid {
    grid-template-columns: 1fr;
    gap: $semantic-spacing-grid-gap-md;
  }
  
  .demo-controls {
    flex-direction: column;
    align-items: stretch;
    
    button {
      width: 100%;
      text-align: center;
    }
  }
  
  .event-item {
    grid-template-columns: 1fr;
    gap: $semantic-spacing-content-line-tight;
    
    .event-time {
      justify-self: end;
      grid-row: 1;
      grid-column: 1;
    }
    
    .event-type {
      grid-row: 2;
      grid-column: 1;
    }
    
    .event-details {
      grid-row: 3;
      grid-column: 1;
    }
  }
}

@media (max-width: $semantic-breakpoint-sm - 1) {
  .demo-container {
    padding: $semantic-spacing-component-sm;
  }
  
  .demo-section {
    margin-bottom: $semantic-spacing-layout-section-md;
  }
},0hx	C9/index98sm})	  
  h1 {!O
!smo	,<md;
  
  h2 {!O
+?lg;
    font-size: $base-typography-font-size-xl;
  }
  
  h3 {6lg 0p
@md 0;
    font-size: $base-typography-font-size-lg;
  }
  
  p {=81line-height: $base-typography-line-height-relaxed"O
&}
}

.theme-controls {
  display: flex\flex-wrap: wrap;
}

.theme-btnQ*%6*button-width $semantic-border-button-style	#7 button-radius;

13
'[cursor: pointer;
  font-size: $base-typography-font-size-sm;
  text-transform: capitalize;
o

 easing-standard;
  
  &:hover {
6C#brand-primary;
  }
  
  &.active {
 brand-primaryon-brand-primary;
?"brand-primary;
  }
  
p%outline: $semantic-border-focus-width2}
}O]\ x1C*!Glg;
    
    h3 {
/0	0*	0~,	07*	O
@5:}
    
    .demo-split-container {
      height: 400px;
  >/
?econd 20   }
    
    .demo-panel-content.&height: 100%;
      
      h4 {_3h*..CO
>/!p {_81N3Y3 @>'ntent-paragraph&--primary {
  *&--secondary {
  *M&--elevated {
  :Helevation-1;
      }
    }
    
    .demo-controls {
      display: flex3B3    
      button {
  !S&on-primary;
        border: none;
    	$&button-radius;
        cursor: pointer^5-N//W  
     5hover;
        }
        
   40(  }
        
        &--secondary {
    #econdary;
  :on-secondary;
        }
        
        &--success {
    $	ccess;
  7on-success;
        }
        
        &--danger {
    "
danger;
  6on-danger;
        }
      }
    }
    
    .demo-info.&container;
    J	3*  
      p {_3@>'
     
  p  margin-bottom: 0;
        }strong0=~/  }!6xM  
    .demo-section .demo-split-container {
      height: 300px;
    }
    
    .demo-section .demo-controls {
      gap: $semxs;
      
      button {
  +xspb1+--C}
    }
  }
}|pxiimport { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FlexComponent } from '../../../../../ui-essentials/src/lib/components/layout/flex';

@Component({
  selector: 'ui-flex-demo',
  standalone: true,
  imports: [CommonModule, FlexComponent],
  template: `
    <div class="demo-container">
      <h2>Flex Component Demo</h2>
      
      <!-- Direction Examples -->
      <section class="demo-section">
        <h3>Flex Direction</h3>
        <div class="demo-row">
          @for (direction of directions; track direction) {
            <div class="demo-column">
              <h4>direction="{{ direction }}"</h4>
              <ui-flex [direction]="direction" class="flex-demo">
                <div class="flex-item">1</div>
                <div class="flex-item">2</div>
                <div class="flex-item">3</div>
              </ui-flex>
            </div>
          }
        </div>
      </section>
      
      <!-- Justify Content -->
      <section class="demo-section">
        <h3>Justify Content</h3>
        <div class="demo-column">
          @for (justify of justifyOptions; track justify) {
            <div class="justify-example">
              <h4>justify="{{ justify }}"</h4>
              <ui-flex [justify]="justify" class="justify-demo">
                <div class="flex-item">A</div>
                <div class="flex-item">B</div>
                <div class="flex-item">C</div>
              </ui-flex>
            </div>
          }
        </div>
      </section>
      
      <!-- Align Items -->
      <section class="demo-section">
        <h3>Align Items</h3>
        <div class="demo-row">
          @for (align of alignOptions; track align) {
            <div class="demo-column">
              <h4>align="{{ align }}"</h4>
              <ui-flex [align]="align" class="align-demo">
                <div class="flex-item flex-item--small">Small</div>
                <div class="flex-item flex-item--medium">Medium</div>
                <div class="flex-item flex-item--large">Large item with more content</div>
              </ui-flex>
            </div>
          }
        </div>
      </section>
      
      <!-- Wrap Options -->
      <section class="demo-section">
        <h3>Flex Wrap</h3>
        <div class="demo-column">
          @for (wrapOption of wrapOptions; track wrapOption) {
            <div class="wrap-example">
              <h4>wrap="{{ wrapOption }}"</h4>
              <ui-flex [wrap]="wrapOption" class="wrap-demo">
                @for (item of manyItems; track item) {
                  <div class="flex-item flex-item--fixed">{{ item }}</div>
                }
              </ui-flex>
            </div>
          }
        </div>
      </section>
      
      <!-- Gap Examples -->
      <section class="demo-section">
        <h3>Gap Spacing</h3>
        <div class="demo-row">
          @for (gap of gapSizes; track gap) {
            <div class="demo-column">
              <h4>gap="{{ gap }}"</h4>
              <ui-flex [gap]="gap" class="gap-demo">
                <div class="flex-item">1</div>
                <div class="flex-item">2</div>
                <div class="flex-item">3</div>
              </ui-flex>
            </div>
          }
        </div>
      </section>
      
      <!-- Complex Layout Examples -->
      <section class="demo-section">
        <h3>Complex Layout Examples</h3>
        
        <!-- Centered Card -->
        <div class="complex-example">
          <h4>Centered Card Layout</h4>
          <ui-flex justify="center" align="center" class="centered-container">
            <div class="card">
              <h5>Centered Card</h5>
              <p>This card is perfectly centered using flexbox.</p>
            </div>
          </ui-flex>
        </div>
        
        <!-- Navigation Layout -->
        <div class="complex-example">
          <h4>Navigation Layout</h4>
          <ui-flex justify="between" align="center" class="nav-demo">
            <div class="nav-brand">Brand</div>
            <ui-flex gap="md" align="center">
              <div class="nav-item">Home</div>
              <div class="nav-item">About</div>
              <div class="nav-item">Contact</div>
            </ui-flex>
          </ui-flex>
        </div>
        
        <!-- Responsive Grid Alternative -->
        <div class="complex-example">
          <h4>Responsive Card Grid</h4>
          <ui-flex wrap="wrap" gap="lg" class="card-grid">
            @for (card of cards; track card.id) {
              <div class="grid-card">
                <h6>{{ card.title }}</h6>
                <p>{{ card.content }}</p>
              </div>
            }
          </ui-flex>
        </div>
        
        <!-- Sidebar Layout -->
        <div class="complex-example">
          <h4>Sidebar Layout</h4>
          <ui-flex class="sidebar-layout">
            <div class="sidebar">Sidebar</div>
            <div class="main-content">
              <h6>Main Content</h6>
              <p>This is the main content area that grows to fill the available space.</p>
            </div>
          </ui-flex>
        </div>
      </section>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-column">
          <div class="size-example">
            <h4>Full Width</h4>
            <ui-flex [fullWidth]="true" class="size-demo">
              <div class="flex-item">Full Width Container</div>
            </ui-flex>
          </div>
          
          <div class="size-example">
            <h4>Inline Flex</h4>
            <div>
              Before text 
              <ui-flex [inline]="true" gap="sm" class="inline-flex-demo">
                <div class="flex-item flex-item--inline">A</div>
                <div class="flex-item flex-item--inline">B</div>
              </ui-flex>
              After text
            </div>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './flex-demo.component.scss'
})
export class FlexDemoComponent {
  directions = ['row', 'row-reverse', 'column', 'column-reverse'] as const;
  justifyOptions = ['start', 'end', 'center', 'between', 'around', 'evenly'] as const;
  alignOptions = ['start', 'end', 'center', 'baseline', 'stretch'] as const;
  wrapOptions = ['nowrap', 'wrap', 'wrap-reverse'] as const;
  gapSizes = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
  
  manyItems = Array.from({ length: 12 }, (_, i) => `Item ${i + 1}`);
  
  cards = [
    { id: 1, title: 'Card 1', content: 'This is the first card with some content.' },
    { id: 2, title: 'Card 2', content: 'This is the second card with different content.' },
    { id: 3, title: 'Card 3', content: 'This is the third card with more content.' },
    { id: 4, title: 'Card 4', content: 'This is the fourth card with additional content.' },
    { id: 5, title: 'Card 5', content: 'This is the fifth card with extra content.' },
    { id: 6, title: 'Card 6', content: 'This is the sixth card with final content.' },
  ];
}R-$x675d'HStackComponent, StackComponent, VStackhH!stack6'StackComponent, VStackComponent, HStackEStack Components Demo</h2Basic Stack (column)!6Basic Stack (Column)!ui-stack spacing="md!item">Item 1?item">Item 2?)item">Item 3</div>
          </ui-stack>
	Stack Row!6Stack (Row)!$ui-stack direction="row" spacing="md!item">Item 1?item">Item 2?)item">Item 3</div>
          </ui-stack>
VStack Varia;VStack (Vertical Stack)!"spacing of spacings; track spacing{{ spacing }} spacingvstack [spacing]="spacing"item">Item A#item">Item B#item">Item C\vstack>!4HStack Varia;HStack (Horizontal Stack)!8"spacing of spacings; track spacing{{ spacing }} spacinghstack [spacing]="spacing"item">Item A#item">Item B#item">Item C\hstack>!4	Alignment
?Alignment Optiona0  <h4>VStack Alignment</h4>
  ment-example alignmentAh5>align="{{ align }}"</h5Fui-vstack [align]="align" spacing="sm" class="alignment-container">
  item z#-item medium">Medium Item-item large">Large Item Here/ui-vstack>
  |  }
~  <h4>HStack Alignment</h4>
  ment-example alignmentAh5>align="{{ align }}"</h5Qui-hstack [align]="align" spacing="sm" class="alignment-container-horizontal">
  item z#- item medium">Medium<br>Two lines-(item large">Large<br>Item<br>Three lines/ui-hstack>
  |  }
~N
>Justify Optiona @#<h4>HStack Justify (full width)</h4GVMi5>
              <ui-hstack [justify]="justify" spacing="sm" [fullWidth]="true" class="justify-container"@*o*!hstack>!4Divider
?With Dividera0  <h4>VStack with Dividersui-vstack [divider]="true">
!item">Section One</div>
!item">Section Two</div>
!3item">Section Three</div>
            </ui-vstack>
~  <h4>HStack with Dividersui-hstack [divider]="true">
!item">Left</div>
!item">Center</div>
!+item">Right</div>
            </ui-hstack>
~NResponsive Example!6Responsive Behavior</h3>
        <p>The HStack below converts to a VStack on small screens:</p>
        <ui-hstack spacing="lg" [responsive]="trueitem">Item 1</div>
item">Item 2</div>
item">Item 3</div>
&item">Item 4</div>
        </ui-hstack%Nested Example!64Nested Stacks</h3>
        <ui-vstack spacing="lg">
section-header">Header Section</div>
          <ui-hstack spacing="md" align="start">
            <ui-vstack spacing="sm">
    %item">Left Column</div>
!item">Item 2</div>
!Qitem">Item 3</div>
            </ui-vstack>
            <ui-vstack spacing="sm">
!item">Right Column</div>
!item">Item B</div>
!Citem">Item C</div>
            </ui-vstack>
          </ui-hstack>
8section-footer">Footer Section</div>
        </ui-vstackjstack&StackDemoComponent {
  spacing/%alignments = ['start', 'center', 'endcenter', 'end:,}@x ~~,;D!ȍ\I@>px,<@use "../../../../../../shared-ui/src/styles/semantic/index" as *;

.ui-fab-menu {
  position: relative;
  display: inline-flex;
  z-index: $semantic-z-index-dropdown;
  
  // Position variants
  &--bottom-right {
    position: fixed;
    bottom: $semantic-spacing-layout-section-md;
    right: $semantic-spacing-layout-section-md;
  }
  
  &--bottom-left {
    position: fixed;
    bottom: $semantic-spacing-layout-section-md;
    left: $semantic-spacing-layout-section-md;
  }
  
  &--top-right {
    position: fixed;
    top: $semantic-spacing-layout-section-md;
    right: $semantic-spacing-layout-section-md;
  }
  
  &--top-left {
    position: fixed;
    top: $semantic-spacing-layout-section-md;
    left: $semantic-spacing-layout-section-md;
  }
  
  // Size variants
  &--sm {
    .ui-fab-menu__trigger {
      width: $semantic-sizing-button-height-sm;
      height: $semantic-sizing-button-height-sm;
      
      .ui-fab-menu__trigger-icon {
        width: $semantic-sizing-icon-button;
        height: $semantic-sizing-icon-button;
        font-size: map-get($semantic-typography-body-small, font-size);
      }
    }
    
    .ui-fab-menu__item {
      min-height: $semantic-sizing-button-height-sm;
      padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
    }
  }
  
  &--md {
    .ui-fab-menu__trigger {
      width: $semantic-sizing-button-height-md;
      height: $semantic-sizing-button-height-md;
      
      .ui-fab-menu__trigger-icon {
        width: $semantic-sizing-icon-button;
        height: $semantic-sizing-icon-button;
        font-size: map-get($semantic-typography-body-medium, font-size);
      }
    }
    
    .ui-fab-menu__item {
      min-height: $semantic-sizing-button-height-md;
      padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
      font-family: map-get($semantic-typography-body-medium, font-family);
      font-size: map-get($semantic-typography-body-medium, font-size);
      font-weight: map-get($semantic-typography-body-medium, font-weight);
      line-height: map-get($semantic-typography-body-medium, line-height);
    }
  }
  
  &--lg {
    .ui-fab-menu__trigger {
      width: $semantic-sizing-button-height-lg;
      height: $semantic-sizing-button-height-lg;
      
      .ui-fab-menu__trigger-icon {
        width: $semantic-sizing-icon-navigation;
        height: $semantic-sizing-icon-navigation;
        font-size: map-get($semantic-typography-body-large, font-size);
      }
    }
    
    .ui-fab-menu__item {
      min-height: $semantic-sizing-button-height-lg;
      padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
      font-family: map-get($semantic-typography-body-large, font-family);
      font-size: map-get($semantic-typography-body-large, font-size);
      font-weight: map-get($semantic-typography-body-large, font-weight);
      line-height: map-get($semantic-typography-body-large, line-height);
    }
  }
  
  // Direction variants
  &--up {
    .ui-fab-menu__items {
      flex-direction: column-reverse;
      bottom: 100%;
      margin-bottom: $semantic-spacing-component-sm;
    }
    
    .ui-fab-menu__item {
      transform-origin: center bottom;
    }
  }
  
  &--down {
    .ui-fab-menu__items {
      flex-direction: column;
      top: 100%;
      margin-top: $semantic-spacing-component-sm;
    }
    
    .ui-fab-menu__item {
      transform-origin: center top;
    }
  }
  
  &--left {
    .ui-fab-menu__items {
      flex-direction: row-reverse;
      right: 100%;
      margin-right: $semantic-spacing-component-sm;
      align-items: center;
    }
    
    .ui-fab-menu__item {
      transform-origin: right center;
    }
  }
  
  &--right {
    .ui-fab-menu__items {
      flex-direction: row;
      left: 100%;
      margin-left: $semantic-spacing-component-sm;
      align-items: center;
    }
    
    .ui-fab-menu__item {
      transform-origin: left center;
    }
  }
  
  // State variants
  &--disabled {
    .ui-fab-menu__trigger {
      opacity: $semantic-opacity-disabled;
      cursor: not-allowed;
      pointer-events: none;
    }
  }
  
  &--animating {
    pointer-events: none;
  }
}

.ui-fab-menu__trigger {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  border: $semantic-border-width-1 solid transparent;
  border-radius: $semantic-border-radius-full;
  cursor: pointer;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  box-shadow: $semantic-shadow-elevation-2;
  overflow: hidden;
  
  // Color variants
  &--primary {
    background: $semantic-color-primary;
    color: $semantic-color-on-primary;
    border-color: $semantic-color-primary;
    
    &:hover:not([disabled]) {
      box-shadow: $semantic-shadow-elevation-3;
    }
  }
  
  &--secondary {
    background: $semantic-color-secondary;
    color: $semantic-color-on-secondary;
    border-color: $semantic-color-secondary;
    
    &:hover:not([disabled]) {
      box-shadow: $semantic-shadow-elevation-3;
    }
  }
  
  &--success {
    background: $semantic-color-success;
    color: $semantic-color-on-success;
    border-color: $semantic-color-success;
    
    &:hover:not([disabled]) {
      box-shadow: $semantic-shadow-elevation-3;
    }
  }
  
  &--danger {
    background: $semantic-color-danger;
    color: $semantic-color-on-danger;
    border-color: $semantic-color-danger;
    
    &:hover:not([disabled]) {
      box-shadow: $semantic-shadow-elevation-3;
    }
  }
  
  &:focus-visible {
    outline: 2px solid $semantic-color-focus;
    outline-offset: 2px;
  }
  
  &:active:not([disabled]) {
    transform: scale(0.95);
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &--active {
    transform: rotate(45deg);
  }
  
  .ui-fab-menu__trigger-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &--close {
      transform: rotate(-45deg);
    }
  }
  
  .ui-fab-menu__trigger-ripple {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    border-radius: inherit;
    overflow: hidden;
    
    &::after {
      content: '';
      position: absolute;
      top: 50%;
      left: 50%;
      width: 0;
      height: 0;
      border-radius: 50%;
      background: currentColor;
      transform: translate(-50%, -50%);
      opacity: 0;
      transition: all $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
    
    .ui-fab-menu__trigger:active & {
      &::after {
        width: 100%;
        height: 100%;
        opacity: $semantic-opacity-subtle;
      }
    }
  }
}

.ui-fab-menu__items {
  position: absolute;
  display: flex;
  gap: $semantic-spacing-component-xs;
  pointer-events: none;
  z-index: 1;
  
  .ui-fab-menu--open & {
    pointer-events: auto;
  }
}

.ui-fab-menu__item {
  position: relative;
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-xs;
  border: $semantic-border-width-1 solid $semantic-color-border-primary;
  border-radius: $semantic-border-radius-md;
  background: $semantic-color-surface-primary;
  color: $semantic-color-text-primary;
  cursor: pointer;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  box-shadow: $semantic-shadow-elevation-1;
  transform: scale(0);
  opacity: 0;
  overflow: hidden;
  white-space: nowrap;
  
  .ui-fab-menu--open & {
    transform: scale(1);
    opacity: 1;
    
    @for $i from 1 through 10 {
      &:nth-child(#{$i}) {
        transition-delay: #{($i - 1) * 50ms};
      }
    }
  }
  
  .ui-fab-menu--animating:not(.ui-fab-menu--open) & {
    transition-delay: 0ms;
  }
  
  // Color variants
  &--primary {
    background: $semantic-color-primary;
    color: $semantic-color-on-primary;
    border-color: $semantic-color-primary;
  }
  
  &--secondary {
    background: $semantic-color-secondary;
    color: $semantic-color-on-secondary;
    border-color: $semantic-color-secondary;
  }
  
  &--success {
    background: $semantic-color-success;
    color: $semantic-color-on-success;
    border-color: $semantic-color-success;
  }
  
  &--danger {
    background: $semantic-color-danger;
    color: $semantic-color-on-danger;
    border-color: $semantic-color-danger;
  }
  
  &:hover:not([disabled]) {
    box-shadow: $semantic-shadow-elevation-2;
    transform: scale(1.05);
  }
  
  &:focus-visible {
    outline: 2px solid $semantic-color-focus;
    outline-offset: 2px;
  }
  
  &:active:not([disabled]) {
    transform: scale(0.98);
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &--disabled {
    opacity: $semantic-opacity-disabled;
    cursor: not-allowed;
    pointer-events: none;
  }
  
  .ui-fab-menu__item-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: $semantic-sizing-icon-inline;
    height: $semantic-sizing-icon-inline;
    flex-shrink: 0;
  }
  
  .ui-fab-menu__item-label {
    font-weight: $semantic-typography-font-weight-medium;
  }
  
  .ui-fab-menu__item-ripple {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    border-radius: inherit;
    overflow: hidden;
    
    &::after {
      content: '';
      position: absolute;
      top: 50%;
      left: 50%;
      width: 0;
      height: 0;
      border-radius: 50%;
      background: currentColor;
      transform: translate(-50%, -50%);
      opacity: 0;
      transition: all $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
    
    .ui-fab-menu__item:active & {
      &::after {
        width: 100%;
        height: 100%;
        opacity: $semantic-opacity-subtle;
      }
    }
  }
}

.ui-fab-menu__backdrop {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: $semantic-color-backdrop;
  backdrop-filter: blur(2px);
  z-index: -1;
  opacity: 0;
  transition: opacity $semantic-motion-duration-fast $semantic-motion-easing-ease;
  
  .ui-fab-menu--open & {
    opacity: 1;
  }
}

// Responsive design
@media (max-width: 768px) {
  .ui-fab-menu {
    &--bottom-right,
    &--bottom-left,
    &--top-right,
    &--top-left {
      margin: $semantic-spacing-component-sm;
    }
  }
  
  .ui-fab-menu__item {
    .ui-fab-menu__item-label {
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
    }
  }
}

// High contrast mode support
@media (prefers-contrast: high) {
  .ui-fab-menu__trigger,
  .ui-fab-menu__item {
    border-width: $semantic-border-width-2;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .ui-fab-menu__trigger,
  .ui-fab-menu__item,
  .ui-fab-menu__backdrop,
  .ui-fab-menu__trigger-icon,
  .ui-fab-menu__trigger-ripple::after,
  .ui-fab-menu__item-ripple::after {
    transition-duration: 0ms;
    animation-duration: 0ms;
  }
  
  .ui-fab-menu__item {
    .ui-fab-menu--open & {
      transition-delay: 0ms;
    }
  }
}68sQx YYui-design-system!,
{x<Yiui-design-system!'transfer-list {/!flex-start;
  gaplg;
  width: 100%;
  
1	family);
E/	weight);
_1[	
  &--sm {
    gap 
L-JH$	/q	}"l;
    
3
D/M$	/"B8#3
  // Transfer List Panel
  &__panel {
    flex: 1;p#;"\C\	$card-radius@2  min-width: 0;

    &--source {
      order: 1;
    }

    &--target {
      order: 3;
    }
  }

  // Panel Header
  &__header {
)=border-bottom+
secondary;"urface>$Ocard-radius $semantic-border-card-radius 0 0;
  }

  &__title {
    margin: 0 0 0;
    
.heading-h4, font-family);
,heading-h4, font-size);
.heading-h4, font-weight);
 	.
heading-h4 7=5}

  // Search
  &__search {
    position: relative;
*5}

  &__search-icon$Jinteractive-input-padding-x;
    top: 50%;
    transform: translateY(-50%)1Gtext-tertiary;
    z-index: 1;
  }

  &__search-input {
    width: 100%# nput-height-md;
ninteractive-input-padding-y 
             calc($semantic-spacing-interactive-input-padding-x * 3)
            interactive-input-padding-y
             calc($semantic-spacing-interactive-input-padding-x * 2.5);
    box-sizing: border-box;
    "\C\	$input-radius;
    
.input, font-family);
,input, font-size);
.input, font-weight);
 	.input 7=  R
    &::placeholder {
  !;text-tertiary;
    }

    &:focus {
      outline: none;
  ")border-focus;
      box-shadow: 0 0 0 2px}

    &:disabled {
  !urface-secondary;
  !text*}
  }

  &__search-clear$ Qinteractive-input-padding-x;
    top: 50%;
    transform: translateY(-50%);
    
1touch-minimum#Qtouch-minimum;
    padding: 0;
    
    background: transparent;
    border: none$sm;
     )text-secondary;
    cursor: pointer;
    p#NR 
    &:hover:not(:disabled) {
  !urface-secondary;
  !=  }

    &:focus {
  2  }

    &:disabled {
  !text*&}
  }

  // Select All
  &__select-alln#3}'  cursor: pointer;
    
.label, font-family);
,label, font-size);
.label, font-weight);
 	.labe7Vtext-secondary;

    input[type="checkbox"] {
      margin: 0;
    }

    &:hover {
  !=>  }
  }

  // List Container
  &__list-container {
    flex: 1.u#6;
  }

  &__list {
    flex: 1;
    overflow-y: auto;
+=  min-height: 200px;
    max-height: 400px;

    &:focus {
  2<  outline-offset: -2px;
    }
  }

  // List Items
  &__itemn#3}''.+  "\!$sm;
    
    cursor: poiWT
    &:last-child {
      margin-bottom: 0;
    }

    &:hover:not(&--disabled) {
  !urface-secondary;
  ")border-secondary;
    }

    &:focus {
  23  outline-offset: -2px;
    }

    &--selected {
  !urface-elevated;
  "!=  }

    &--disabled {
!)$}
  }

  &__checkbox {
    margin: 0$_
  &__item-label {
    flex: 1;
    min-width: 0;
    word-wrap: break-word;
  }

  &__empty {
)}text-align: center1text-tertiary;
    
.caption, font-family);
,caption, font-size);
.caption, font-weight);
 	.Gcaption, line-height);
  }

  // Controls
  &__controls {
    order: 2;p#	;
    gap C#%md 0$
  &__control-btn {
1*#~padding: 0;
    !\1\	$button-radius;
     "primary;
    cursor: pointer;
    p#NVF'button-rest;

    &:hover:not(:disabled'button-hove Y(-1px);
    }

    &:focus {
  2"  }

    &:active:not(:disabled) {%Y(0);
  !!'button-rest;
    }

    &:disabled {
  !urface-secondary;
  "border-secondary;
  !text,7box-shadow: none;
    }
  }

  // Footer
  &__footer {
)'
border-top+
secondary;"urface-secondary;
    
.caption, font-family);
,caption, font-size);
.caption, font-weight);
 	.caption 7=text-secondary;
    
    text-align: center;
  }

  // Size Vtransfer-list__panel {@6JM 
    .ui-transfer-list__header {,!}

    .ui-transfer-list__title {@1
heading-h5|>
heading-h5>
heading-h5	@
heading-h5 &
    .ui-transfer-list__search-input {^ 5input-height-sm;
    }

    .ui-transfer-list__item {.'  }

    .ui-transfer-list__control-btn`/
'"}

    .ui-transfer-list__footer {S@+}

  &--lg {
    .ui-transfer-list__panel {+ 
    .ui-transfer-list__header {,}!}

    .ui-transfer-list__title {@1
heading-h3|>
heading-h3>
heading-h3	@
heading-h3 &
    .ui-transfer-list__search-input {^ 5input-height-lg;
    }

    .ui-transfer-list__item {,=%}

    .ui-transfer-list__control-btn`//
'/"}

    .ui-transfer-list__footer {,^' }
  }

  // Responsive Design
  q(	;
    gap@ 4;

    .ui-transfer-list__controls {
      order: 2;'}

    .ui-transfer-list__panel {
      &--source {
        order: 1;
      }

      &--target {
        order: 3;
      }
    G}

    .ui-transfer-list__list {
      max-height: 300px;
    }
  }

  q(480px) {
    gap ";

    .ui-transfer-list__header {,!}

    .ui-transfer-list__title {@1
heading-h5|>
heading-h5>
heading-h5	@
heading-h5 &
    .ui-transfer-list__search-input {^ input-height-sm#interactive-input-padding-y 
               calc($semantic-spacing-interactive-input-padding-x * 2.5)
               $semantic-interactive-input-padding-y
               calc($semantic-spacing-interactive-input-padding-x * 2);
      box-sizing: border-bo'x;
    }

    .ui-transfer-list__item {.'  }

    .ui-transfer-list__control-btn`/
'^}

    .ui-transfer-list__list {
      max-height: 250px;
      min-height: 150px;
    }
  }
}Sx[i9P@oast {
  // Core Structure
  display: flex;
  position: relativen:width: 100%;
  max-width: 400px;
  
  // Layout & Spacing
-0%  
  // Visual Design
Q&
elevated;
9o/'3;
  
  // Typography
,}
  // Transitions
,normal!$"52	.#max-width: 320px;q4#5Bmd {
    // Default styles already applied above
  }
  
  &--lg {
12_
.%    max-width: 480px;q&!// Color Variants
  &--primary {
0/)left-width: 4px;
    
    .ui-toast__icon@ }
    
    .ui-toast__title@ }
  }
  
  &--success {
0"=success;
    border-left-width: 4px;
    
    .ui-toast__icon@ (success;
    }
    
    .ui-toast__title@ %success;
    }
  }
  
  &--warning {
0"=warning;
    border-left-width: 4px;
    
    .ui-toast__icon@ (warning;
    }
    
    .ui-toast__title@ $warning;
    }
  }
  
  &--danger {
0"<danger;
    border-left-width: 4px;
    
    .ui-toast__icon@ 'danger;
    }
    
    .ui-toast__title@ !danger;
    }
  }
  
  &--info {
0":info;
    border-left-width: 4px;
    
    .ui-toast__icon@ %info;
    }
    
    .ui-toast__title@ 0info;
    }
  }
  
  // BEM Elements
  &__icon {-	font-size(Qicon-inline;
    margin-top: 2px; // Slight optical alignment
  }
  
  &__contentK! // Prevents flex overflow
  }
  2ntent-line-tight 0;q/#:B}"
    &--bold {
      font-weight: @font-weight-semibold;
    }
  }
  
  &__message {
    margin: 0;.!}
  
  &__actions {
    margin-top'$.!$flex-wrap: wrap;
  }
  
  &__dismisstop3/n523g $min-3\min-o,
    &:hoverZ/}
    
    &:focus-visibleI    
    &:active-B}
  }
  
  // State Variants
  &--dismissible {
    padding-right:3_
lg +Jf);
  }
  
  // Toast-specific positioning and animations
  &--entering {
    animation: toast-slide-innormal? forwards;
  }
  
  &--exiting {
    animation: toast-slide-outnormalB forwards;
  }
  
  // Progress bar for auto-dismiss
  &__progress7bottom: 0;
    left: 0;
    right: 0;
    height: 3px;
!7g0 0
    &-bar {
      height: 100%;
      background: currentColor;
      width: 100%;
      transform-origin: left;
      animatiion: toast-progress var(--duration) linear forwards;
    }
  }
  
  &--with-progress {
    padding-bottom:3_
md + 3px);
  }
  1.-$semantic-breakpoint-sm - 1) {
12	.#max-width: 100%;
    
    &--lgM&."}
    
    &&:#)/%    
    &__messag&4 $#)* $#%, $*, $	n$0}
    
    &--dismissible {
      padding-right:3_
md +J);
    }
  }
}

// Keyframe animations
@keyframes toast-slide-in {
  from {
    opacity: 0;
    transform: translateX(100%);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

@keyframes toast-slide-out {
  from {
    opacity: 1;
    transform: translateX(0);
  }
  to {
    opacity: 0;
    transform: translateX(100%);
  }
}

@keyframes toast-progress {
  from {
    @transform: scaleX(1);
  }
  to {
    transform: scaleX(0);
  }
}sq>xi,P/ag-input {
  display: flex;
  flex-wrap: wrap;
-position: relative;
  
  // Layout & Spacing
P2P2x;
0#min-o,md;
  
  // Visual Design
Q17o 
  // Typography
C(_G3_*_,
  // Transitions
  transition: border-color<,
              box-shadow@$"min-o,sm;
123.!v/#5  
    .ui-tag-input__input)8#)/%G  }
  
  &--md {
    // Already defined above
  }
  
  &--lg {
    min-o,52_
".!v  
    .ui-tag-input__input)-*  }
  
  // Style Variants
  &--outlined {(:o}
  
  &--filled {
!74!ubtle;
  }
  
  // State Variants>E"  
    .ui-tag-input__input { ",}
  }
  
  &--error {
0" error;
    
    &:focus-within {,error;
      box-shadow: 0 0 0 2px rgba($semantic-color-danger, 0.2);
    }
  }
  
  // Interactive States
  &:not(.ui-tag-input--disabled) {
    &:hover {7}
    
    &:focus-within {%rgba(4, 0.2);
    }
  }
  
  // Tags Container
  &__tags {
wrap: wrap)>6}
  
  // Input Element
  &__input {
    border: none;">120px
margin: 0;!}/_ғ6H    KH  
  // Tag Item (using existing chip component)
  &__tag {
    .ui-chip  }
  
  // Max Tags Reached Indicator
  &--max-reached {
    .ui-tag-input__input {
      display: none;
    }
  }
  
  // Focus Management
  &__focus-trap
opacity: 0#  top: -1px;
    left: -1px;
  }
  1./7px) {
    .ui-tag-input__input {
      min-width: 80px;
    }
  }
}

// Error Message
.ui-tag-input-error {
  margin-top: $semdanger;
, $3 $#	P* $* $	n$1}

// Help Text
.ui-tag-input-help {
  margin-top)* $3 $#	P* $* $	n$}|x09.Pree-viewT"blockz>7@>subtle3'XAB/o3(@o{/o.k6-*// Typography already set above for medium;@s)
    .ui-tree-view__node--selected {
    QKon	&--second~(8secondary;
    
    .ui-tree-view__node--selected {
    Q	econdary;5on-secondary;
    }
  }
  
  // Tree Node
  &__node {1(ntent-line-tight;
    margin-bottom: 2px/*fast!  
    // Node statesH}
    
    &--selected {
    Q2 !mediumMhabled {
      opacity: $semantic-opacity-disabled;
      cursor: not-allowed;
      pointer-events: none-v/}
  
  // Tree Node Content
  &__node-content {1MAllow text truncation
  }
  
  // Expand/Collapse Button
  &__expand-button {Nc+heighth'argin-!,order: noneF))*fast!J3x[--expanded {
      transform: rotate(90deg);
    }
    
    &--leaf {
      cursor: default3`)font-size-lg;
      
      &:hover {
    H!:  }
    }
  }
  
  // Node Icon
  &__node-icon {
    widthk$heightk+!+7+i
    .ui-tree-view__node--selected & {
      color: inherit;
    }
  }
  
  // Node Label
  &__node-label!text-overflow: ellipsis;
    white-space: nowrap;
  }
  
  // Children Container
  &__children {
    margin-left: $semantic-spa"layout-section-sm;
    border-left8subtle;
    padding-left\sm;
    
    &--hidden {
      display: none;
    }
  }
  
  // Loading State
  &__loading {N%5+"}
  
  // Empty State
  &__empty {N%lg17tyle: italic;
  }
  
  // Root level adjustments
  & > .ui-tree-view__node {
    &:first-child {
      margin-top: 0;
    }
   2 
    &:last-child {
      margin-bottom: 0;
    }4($semantic-breakpoint-md - 1)),0
    .ui-tree-view__children {
      margin-left    padding-left&>}
  }
  
  @media (max-width: ($semantic-breakpoint-sm - 1)) {=4o3(@o{/o.X  
    .ui-tree-view__node&C2$}
  }
}^qx'9/OalerS\Dmargin-bottomsm;
  gap: 16px9subtleZ1#fastu12:7o3(@o{/o.29PT/r Ku
%aler
'K*T/rRaler
'aler	RT/r ~	2aler
'~	0
	aler	(~	0
T/r u
%aler
Baler	(&T/r O/aler
'O
}
    
    .ui-aler	(O
u1.25rem; // Increased froml for better visibility
heading-h41(
heading-h4<
heading-h4@*
heading-h4O35邔m	xaNimport { Component, ViewChild, AfterViewInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { FloatingToolbarComponent, ToolbarAction, FloatingToolbarConfig } from '../../../../../ui-essentials/src/lib/components/overlays/floating-toolbar/floating-toolbar.component';

@Component({
  selector: 'ui-floating-toolbar-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, FloatingToolbarComponent],
  template: `
    <div class="demo-container">
      <h2>Floating Toolbar Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <button 
                class="demo-trigger-button"
                #triggerButton
                (click)="showToolbar('size-' + size, triggerButton, { size: size })"
              >
                {{ size }} Toolbar
              </button>
            </div>
          }
        </div>
      </section>

      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Style Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <button 
                class="demo-trigger-button"
                #triggerButton
                (click)="showToolbar('variant-' + variant, triggerButton, { variant: variant })"
              >
                {{ variant | titlecase }} Style
              </button>
            </div>
          }
        </div>
      </section>

      <!-- Position Variants -->
      <section class="demo-section">
        <h3>Position Variants</h3>
        <div class="demo-row demo-row--center">
          <div class="demo-position-container">
            @for (position of positions; track position) {
              <button 
                class="demo-position-button demo-position-button--{{ position }}"
                #triggerButton
                (click)="showToolbar('position-' + position, triggerButton, { position: position })"
              >
                {{ position }}
              </button>
            }
          </div>
        </div>
      </section>

      <!-- Context-Sensitive Actions -->
      <section class="demo-section">
        <h3>Context-Sensitive Actions</h3>
        <div class="demo-row">
          <div class="demo-context-area" #textContext>
            <p>
              Select this text to see a text editing toolbar with cut, copy, paste, and formatting options.
              The toolbar will appear automatically when you make a selection.
            </p>
          </div>
          <div class="demo-context-area" #imageContext>
            <img 
              src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSIjZGRkIi8+CiAgPHRleHQgeD0iNTAlIiB5PSI1MCUiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC1zaXplPSIxNCIgZmlsbD0iIzk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZHk9Ii4zZW0iPkltYWdlPC90ZXh0Pgo8L3N2Zz4K"
              alt="Demo Image"
              (contextmenu)="showContextualToolbar($event, imageActions, 'image')"
            />
            <p class="demo-hint">Right-click the image for image editing options</p>
          </div>
        </div>
      </section>

      <!-- Auto-Hide Behavior -->
      <section class="demo-section">
        <h3>Auto-Hide Behavior</h3>
        <div class="demo-row">
          <button 
            class="demo-trigger-button"
            #autoHideButton
            (click)="showAutoHideToolbar(autoHideButton)"
          >
            Show Auto-Hide Toolbar (3 seconds)
          </button>
        </div>
      </section>

      <!-- Custom Actions Demo -->
      <section class="demo-section">
        <h3>Custom Actions</h3>
        <div class="demo-row">
          <button 
            class="demo-trigger-button"
            #customButton
            (click)="showCustomActionsToolbar(customButton)"
          >
            Custom Actions Toolbar
          </button>
        </div>
        
        <div class="demo-output">
          <h4>Action Log:</h4>
          <div class="demo-log">
            @for (logEntry of actionLog; track $index) {
              <div class="demo-log-entry">{{ logEntry }}</div>
            }
            @if (actionLog.length === 0) {
              <div class="demo-log-empty">No actions performed yet...</div>
            }
          </div>
        </div>
      </section>

      <!-- Interactive Examples -->
      <section class="demo-section">
        <h3>Interactive Examples</h3>
        
        <!-- Editable Text Area -->
        <div class="demo-subsection">
          <h4>Editable Text with Formatting Toolbar</h4>
          <div 
            class="demo-editor"
            contenteditable="true"
            #editableArea
            (mouseup)="handleTextSelection(editableArea)"
            (keyup)="handleTextSelection(editableArea)"
          >
            <p>This is an editable text area. Select text to see formatting options in the floating toolbar.</p>
            <p><strong>Bold text</strong>, <em>italic text</em>, and <u>underlined text</u> are supported.</p>
          </div>
        </div>
        
        <!-- Data Table with Row Actions -->
        <div class="demo-subsection">
          <h4>Data Table with Row Actions</h4>
          <table class="demo-table">
            <thead>
              <tr>
                <th>Name</th>
                <th>Email</th>
                <th>Status</th>
                <th>Actions</th>
              </tr>
            </thead>
            <tbody>
              @for (user of sampleUsers; track user.id) {
                <tr 
                  #tableRow 
                  class="demo-table-row"
                  [class.demo-table-row--selected]="selectedUserId === user.id"
                  (click)="selectUser(user.id, tableRow)"
                >
                  <td>{{ user.name }}</td>
                  <td>{{ user.email }}</td>
                  <td>{{ user.status }}</td>
                  <td>
                    <button 
                      class="demo-table-action"
                      (click)="showUserActions($event, tableRow, user)"
                    >
                      ⋮
                    </button>
                  </td>
                </tr>
              }
            </tbody>
          </table>
        </div>
      </section>

      <!-- Configuration Demo -->
      <section class="demo-section">
        <h3>Configuration Options</h3>
        <div class="demo-controls">
          <div class="demo-control-group">
            <label>
              <input 
                type="checkbox" 
                [(ngModel)]="demoConfig.backdrop"
                (change)="updateDemoConfig()"
              />
              Show Backdrop
            </label>
            
            <label>
              <input 
                type="checkbox" 
                [(ngModel)]="demoConfig.autoHide"
                (change)="updateDemoConfig()"
              />
              Auto Hide
            </label>
            
            <label>
              <input 
                type="checkbox" 
                [(ngModel)]="demoConfig.escapeClosable"
                (change)="updateDemoConfig()"
              />
              ESC to Close
            </label>
          </div>
          
          <button 
            class="demo-trigger-button"
            #configButton
            (click)="showConfigurableToolbar(configButton)"
          >
            Test Configuration
          </button>
        </div>
      </section>
    </div>

    <!-- Floating Toolbars -->
    <ui-floating-toolbar
      #floatingToolbar
      [actions]="currentActions"
      [size]="getConfigValue('size')"
      [variant]="getConfigValue('variant')"
      [position]="getConfigValue('position')"
      [visible]="getConfigValue('visible')"
      [autoHide]="getConfigValue('autoHide')"
      [hideDelay]="getConfigValue('hideDelay')"
      [backdrop]="getConfigValue('backdrop')"
      [escapeClosable]="getConfigValue('escapeClosable')"
      [label]="getConfigValue('label')"
      [showLabel]="getConfigValue('showLabel')"
      [showShortcuts]="getConfigValue('showShortcuts')"
      (actionClicked)="onActionClicked($event)"
      (visibleChange)="onToolbarVisibilityChange($event)"
      (hidden)="onToolbarHidden()"
    ></ui-floating-toolbar>

    <!-- Text Selection Toolbar -->
    <ui-floating-toolbar
      #textSelectionToolbar
      [actions]="textActions"
      size="sm"
      variant="contextual"
      position="top"
      [visible]="false"
      trigger="selection"
      [autoHide]="false"
      label="Text Formatting"
      [showShortcuts]="true"
      (actionClicked)="onTextActionClicked($event)"
    ></ui-floating-toolbar>
  `,
  styleUrl: './floating-toolbar-demo.component.scss'
})
export class FloatingToolbarDemoComponent implements AfterViewInit {
  @ViewChild('floatingToolbar') floatingToolbar!: FloatingToolbarComponent;
  @ViewChild('textSelectionToolbar') textSelectionToolbar!: FloatingToolbarComponent;

  // Demo Data
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['default', 'elevated', 'floating', 'compact', 'contextual'] as const;
  positions = ['top', 'bottom', 'left', 'right'] as const;
  
  sampleUsers = [
    { id: 1, name: 'Alice Johnson', email: 'alice@example.com', status: 'Active' },
    { id: 2, name: 'Bob Smith', email: 'bob@example.com', status: 'Pending' },
    { id: 3, name: 'Carol Davis', email: 'carol@example.com', status: 'Inactive' },
  ];

  // Demo State
  actionLog: string[] = [];
  selectedUserId: number | null = null;
  currentConfig: FloatingToolbarConfig = {
    visible: false,
    size: 'md',
    variant: 'default',
    position: 'top',
    autoHide: false,
    hideDelay: 3000,
    backdrop: false,
    escapeClosable: true,
    label: '',
    showLabel: false,
    showShortcuts: false
  };
  
  demoConfig = {
    backdrop: false,
    autoHide: false,
    escapeClosable: true
  };

  currentActions: ToolbarAction[] = [];

  // Action Sets
  basicActions: ToolbarAction[] = [
    {
      id: 'edit',
      label: 'Edit',
      icon: 'fas fa-edit',
      callback: (action, event) => this.logAction('Edit clicked')
    },
    {
      id: 'delete',
      label: 'Delete',
      icon: 'fas fa-trash',
      callback: (action, event) => this.logAction('Delete clicked')
    },
    {
      id: 'share',
      label: 'Share',
      icon: 'fas fa-share',
      callback: (action, event) => this.logAction('Share clicked')
    }
  ];

  textActions: ToolbarAction[] = [
    {
      id: 'cut',
      label: 'Cut',
      icon: 'fas fa-cut',
      shortcut: 'Ctrl+X',
      callback: (action, event) => this.executeTextAction('cut')
    },
    {
      id: 'copy',
      label: 'Copy',
      icon: 'fas fa-copy',
      shortcut: 'Ctrl+C',
      callback: (action, event) => this.executeTextAction('copy')
    },
    {
      id: 'paste',
      label: 'Paste',
      icon: 'fas fa-paste',
      shortcut: 'Ctrl+V',
      callback: (action, event) => this.executeTextAction('paste')
    },
    {
      id: 'divider1',
      label: '',
      divider: true
    },
    {
      id: 'bold',
      label: 'Bold',
      icon: 'fas fa-bold',
      shortcut: 'Ctrl+B',
      callback: (action, event) => this.executeTextAction('bold')
    },
    {
      id: 'italic',
      label: 'Italic',
      icon: 'fas fa-italic',
      shortcut: 'Ctrl+I',
      callback: (action, event) => this.executeTextAction('italic')
    },
    {
      id: 'underline',
      label: 'Underline',
      icon: 'fas fa-underline',
      shortcut: 'Ctrl+U',
      callback: (action, event) => this.executeTextAction('underline')
    }
  ];

  imageActions: ToolbarAction[] = [
    {
      id: 'resize',
      label: 'Resize',
      icon: 'fas fa-expand-arrows-alt',
      callback: (action, event) => this.logAction('Resize image')
    },
    {
      id: 'crop',
      label: 'Crop',
      icon: 'fas fa-crop',
      callback: (action, event) => this.logAction('Crop image')
    },
    {
      id: 'filters',
      label: 'Filters',
      icon: 'fas fa-filter',
      callback: (action, event) => this.logAction('Apply filters')
    },
    {
      id: 'divider2',
      label: '',
      divider: true
    },
    {
      id: 'download',
      label: 'Download',
      icon: 'fas fa-download',
      callback: (action, event) => this.logAction('Download image')
    }
  ];

  customActions: ToolbarAction[] = [
    {
      id: 'action1',
      label: 'Action 1',
      icon: 'fas fa-star',
      tooltip: 'This is action 1',
      callback: (action, event) => this.logAction('Custom Action 1 executed')
    },
    {
      id: 'action2',
      label: 'Action 2',
      icon: 'fas fa-heart',
      tooltip: 'This is action 2 with a longer tooltip',
      disabled: false,
      callback: (action, event) => this.logAction('Custom Action 2 executed')
    },
    {
      id: 'divider3',
      label: '',
      divider: true
    },
    {
      id: 'action3',
      label: 'Disabled Action',
      icon: 'fas fa-ban',
      disabled: true,
      tooltip: 'This action is disabled',
      callback: (action, event) => this.logAction('This should not execute')
    },
    {
      id: 'action4',
      label: 'Toggle Action',
      icon: 'fas fa-toggle-on',
      callback: (action, event) => this.toggleAction(action)
    }
  ];

  userActions: ToolbarAction[] = [
    {
      id: 'view',
      label: 'View Details',
      icon: 'fas fa-eye',
      callback: (action, event) => this.logAction('View user details')
    },
    {
      id: 'edit-user',
      label: 'Edit User',
      icon: 'fas fa-edit',
      callback: (action, event) => this.logAction('Edit user')
    },
    {
      id: 'delete-user',
      label: 'Delete User',
      icon: 'fas fa-trash',
      callback: (action, event) => this.logAction('Delete user')
    }
  ];

  ngAfterViewInit(): void {
    // Setup text selection toolbar
    this.setupTextSelectionToolbar();
  }

  showToolbar(id: string, triggerElement: HTMLElement, config: Partial<FloatingToolbarConfig>): void {
    console.log('Demo: showToolbar called', { id, config, basicActions: this.basicActions });
    this.currentConfig = {
      ...this.currentConfig,
      ...config,
      visible: true
    };
    this.currentActions = [...this.basicActions];
    console.log('Demo: config and actions set', { 
      currentConfig: this.currentConfig, 
      currentActions: this.currentActions 
    });
    this.floatingToolbar.setAnchorElement(triggerElement);
  }

  showAutoHideToolbar(triggerElement: HTMLElement): void {
    this.currentConfig = {
      ...this.currentConfig,
      visible: true,
      autoHide: true,
      hideDelay: 3000,
      label: 'Auto-hide in 3 seconds'
    };
    this.currentActions = [...this.basicActions];
    this.floatingToolbar.setAnchorElement(triggerElement);
  }

  showCustomActionsToolbar(triggerElement: HTMLElement): void {
    this.currentConfig = {
      ...this.currentConfig,
      visible: true,
      autoHide: false,
      showShortcuts: true,
      label: 'Custom Actions'
    };
    this.currentActions = [...this.customActions];
    this.floatingToolbar.setAnchorElement(triggerElement);
  }

  showContextualToolbar(event: MouseEvent, actions: ToolbarAction[], context: string): void {
    event.preventDefault();
    
    // Create temporary anchor at mouse position
    const tempAnchor = {
      getBoundingClientRect: () => ({
        top: event.clientY,
        left: event.clientX,
        right: event.clientX,
        bottom: event.clientY,
        width: 0,
        height: 0
      } as DOMRect)
    } as HTMLElement;

    this.currentConfig = {
      ...this.currentConfig,
      visible: true,
      variant: 'contextual',
      position: 'bottom',
      autoHide: true,
      hideDelay: 5000,
      label: `${context} actions`
    };
    this.currentActions = [...actions];
    this.floatingToolbar.setAnchorElement(tempAnchor);
  }

  showConfigurableToolbar(triggerElement: HTMLElement): void {
    this.currentConfig = {
      ...this.currentConfig,
      ...this.demoConfig,
      visible: true,
      label: 'Configured Toolbar'
    };
    this.currentActions = [...this.basicActions];
    this.floatingToolbar.setAnchorElement(triggerElement);
  }

  updateDemoConfig(): void {
    // Update the demo configuration
    Object.assign(this.currentConfig, this.demoConfig);
  }

  handleTextSelection(element: HTMLElement): void {
    const selection = window.getSelection();
    if (selection && selection.toString().trim()) {
      const range = selection.getRangeAt(0);
      const rect = range.getBoundingClientRect();
      
      if (rect.width > 0 && rect.height > 0) {
        // Create anchor at selection
        const selectionAnchor = {
          getBoundingClientRect: () => rect
        } as HTMLElement;

        this.textSelectionToolbar.setAnchorElement(selectionAnchor);
        this.textSelectionToolbar.show();
      }
    } else {
      this.textSelectionToolbar.hide();
    }
  }

  selectUser(userId: number, rowElement: HTMLElement): void {
    this.selectedUserId = userId;
  }

  showUserActions(event: Event, rowElement: HTMLElement, user: any): void {
    event.stopPropagation();
    
    this.currentConfig = {
      ...this.currentConfig,
      visible: true,
      variant: 'elevated',
      position: 'left',
      label: `Actions for ${user.name}`
    };
    this.currentActions = [...this.userActions];
    this.floatingToolbar.setAnchorElement(rowElement);
  }

  onActionClicked(event: { action: ToolbarAction; event: Event }): void {
    this.logAction(`Action clicked: ${event.action.label}`);
  }

  onTextActionClicked(event: { action: ToolbarAction; event: Event }): void {
    this.logAction(`Text action: ${event.action.label}`);
  }

  onToolbarVisibilityChange(visible: boolean): void {
    this.currentConfig.visible = visible;
  }

  onToolbarHidden(): void {
    this.logAction('Toolbar hidden');
  }

  executeTextAction(command: string): void {
    try {
      document.execCommand(command, false);
      this.logAction(`Text formatting: ${command}`);
    } catch (error) {
      this.logAction(`Text formatting failed: ${command}`);
    }
  }

  toggleAction(action: ToolbarAction): void {
    const isToggled = action.icon === 'fas fa-toggle-on';
    action.icon = isToggled ? 'fas fa-toggle-off' : 'fas fa-toggle-on';
    this.logAction(`Toggle action: ${isToggled ? 'OFF' : 'ON'}`);
  }

  private setupTextSelectionToolbar(): void {
    document.addEventListener('selectionchange', () => {
      const selection = window.getSelection();
      if (!selection || !selection.toString().trim()) {
        this.textSelectionToolbar.hide();
      }
    });
  }

  getConfigValue<K extends keyof FloatingToolbarConfig>(key: K): NonNullable<FloatingToolbarConfig[K]> {
    const defaultValues: Required<FloatingToolbarConfig> = {
      size: 'md',
      variant: 'default',
      position: 'top',
      autoPosition: true,
      visible: false,
      actions: [],
      context: undefined as any,
      trigger: 'manual',
      autoHide: false,
      hideDelay: 3000,
      showAnimation: 'slide-fade',
      backdrop: false,
      backdropClosable: true,
      escapeClosable: true,
      offset: 12,
      label: '',
      showLabel: false,
      showShortcuts: false
    };

    const value = this.currentConfig[key];
    return (value !== undefined ? value : defaultValues[key]) as NonNullable<FloatingToolbarConfig[K]>;
  }

  private logAction(message: string): void {
    const timestamp = new Date().toLocaleTimeString();
    this.actionLog.unshift(`[${timestamp}] ${message}`);
    
    // Keep only the last 10 entries
    if (this.actionLog.length > 10) {
      this.actionLog = this.actionLog.slice(0, 10);
    }
  }
}1xn<div class="demo-container">
  <h1>UI Font Manager Demo</h1>
  <p class="demo-description">
    Dynamically load Google Fonts and switch between font themes with smooth transitions. 
    Select a font preset to apply it globally to the entire application.
  </p>

  <!-- Font Preset Selection -->
  <section class="demo-section">
    <h2>Font Preset Selection</h2>
    <p class="preset-description">
      Choose from curated font combinations. The selected preset will be applied to the entire application.
    </p>
    
    <div class="preset-controls">
      <div class="preset-selector">
        <label for="preset-select">Choose Font Preset:</label>
        <select 
          id="preset-select" 
          [value]="selectedPreset" 
          (change)="onPresetChange($event)">
          <option value="">Select a preset...</option>
          <option *ngFor="let preset of fontPresets" [value]="preset.key">
            {{preset.name}} - {{preset.description}}
          </option>
        </select>
      </div>
      
      <div class="transition-selector" *ngIf="selectedPreset">
        <label for="transition-select">Transition Effect:</label>
        <select id="transition-select" [(ngModel)]="selectedTransition">
          <option value="fade">Fade</option>
          <option value="scale">Scale</option>
          <option value="typewriter">Typewriter</option>
        </select>
        <button 
          class="apply-btn"
          (click)="applyPresetWithTransition()">
          Apply with {{selectedTransition | titlecase}} Effect
        </button>
      </div>
    </div>

    <!-- Current Preset Display -->
    <div class="current-preset" *ngIf="currentPreset">
      <h4>Currently Applied: {{currentPreset.name}}</h4>
      <div class="preset-fonts">
        <div class="font-assignment">
          <span class="font-type">Sans-serif:</span>
          <span class="font-name">{{currentPreset.fonts.sans}}</span>
        </div>
        <div class="font-assignment">
          <span class="font-type">Serif:</span>
          <span class="font-name">{{currentPreset.fonts.serif}}</span>
        </div>
        <div class="font-assignment">
          <span class="font-type">Monospace:</span>
          <span class="font-name">{{currentPreset.fonts.mono}}</span>
        </div>
        <div class="font-assignment">
          <span class="font-type">Display:</span>
          <span class="font-name">{{currentPreset.fonts.display}}</span>
        </div>
      </div>
    </div>
  </section>

  <!-- Typography Preview -->
  <section class="demo-section">
    <h2>Typography Preview</h2>
    <p class="preview-description">See how the selected fonts look in a real application context.</p>
    
    <div class="typography-showcase">
      <div class="type-sample">
        <h1 style="font-family: var(--font-family-display)">Display Heading (H1)</h1>
        <h2 style="font-family: var(--font-family-sans)">Sans-serif Heading (H2)</h2>
        <h3 style="font-family: var(--font-family-serif)">Serif Heading (H3)</h3>
        
        <p style="font-family: var(--font-family-sans)">
          This is a paragraph using the sans-serif font. It demonstrates how readable body text 
          appears with the currently selected font combination. Lorem ipsum dolor sit amet, 
          consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        </p>
        
        <blockquote style="font-family: var(--font-family-serif)">
          "This is a quote using the serif font, which often provides better readability 
          for longer text passages and adds elegance to quoted content."
        </blockquote>
        
        <pre><code style="font-family: var(--font-family-mono)">// Code example with monospace font
function applyFontTheme(theme) {
  document.documentElement.style.setProperty('--font-family-sans', theme.sans);
  document.documentElement.style.setProperty('--font-family-serif', theme.serif);
  document.documentElement.style.setProperty('--font-family-mono', theme.mono);
}</code></pre>

        <div class="font-info">
          Current fonts: Sans (var(--font-family-sans)) | Serif (var(--font-family-serif)) | 
          Mono (var(--font-family-mono)) | Display (var(--font-family-display))
        </div>
      </div>
    </div>
  </section>

  <!-- Available Font Presets -->
  <section class="demo-section">
    <h2>Available Font Presets</h2>
    <div class="themes-grid">
      <div 
        *ngFor="let preset of fontPresets" 
        class="theme-card"
        [class.active]="preset.key === selectedPreset">
        
        <h4>{{preset.name}}</h4>
        <p class="theme-description">{{preset.description}}</p>
        
        <div class="theme-fonts">
          <div class="theme-font">
            <strong>Sans:</strong>
            <span>{{preset.fonts.sans}}</span>
          </div>
          <div class="theme-font">
            <strong>Serif:</strong>
            <span>{{preset.fonts.serif}}</span>
          </div>
          <div class="theme-font">
            <strong>Mono:</strong>
            <span>{{preset.fonts.mono}}</span>
          </div>
          <div class="theme-font">
            <strong>Display:</strong>
            <span>{{preset.fonts.display}}</span>
          </div>
        </div>
        
        <button 
          class="apply-theme-btn"
          (click)="applyPreset(preset.key)">
          Apply {{preset.name}}
        </button>
      </div>
    </div>
  </section>

  <!-- Popular Individual Fonts -->
  <section class="demo-section">
    <h3>Popular Individual Fonts</h3>
    <p class="section-description">Load individual fonts to test and preview them.</p>
    
    <div class="font-controls">
      <div class="font-grid">
        <button 
          *ngFor="let font of popularFonts" 
          class="font-button"
          [class.loaded]="isLoaded(font)"
          (click)="loadSingleFont(font)">
          
          {{font}}
          <span class="load-status" *ngIf="isLoaded(font)">✓</span>
        </button>
      </div>
    </div>
  </section>

  <!-- Event Log -->
  <section class="demo-section" *ngIf="eventLog.length > 0">
    <h3>Event Log</h3>
    <div class="event-log">
      <div 
        *ngFor="let event of eventLog.slice(-10)" 
        class="event-item"
        [class]="event.type">
        <span class="event-time">{{event.time}}</span>
        <span class="event-message">{{event.message}}</span>
      </div>
    </div>
  </section>
</div>?x".demo-container {
  padding: 2rem;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-description {
  font-size: 1.1rem;
  color: #666;
  margin-bottom: 2rem;
  line-height: 1.6;
}

.demo-section {
  margin: 3rem 0;
  padding: 2rem;
  border: 1px solid #e0e0e0;
  border-radius: 12px;
  background: #fafafa;
  
  h2, h3 {
    margin-top: 0;
    color: #333;
  }
  
  h2 {
    font-size: 1.5rem;
    margin-bottom: 1.5rem;
  }
  
  h3 {
    font-size: 1.25rem;
    margin-bottom: 1rem;
  }
}

// Loading State Display
.state-info {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 1rem;
  margin-top: 1rem;
}

.state-item {
  padding: 1rem;
  background: white;
  border-radius: 8px;
  border-left: 4px solid #2196F3;
  
  strong {
    color: #333;
    display: block;
    margin-bottom: 0.5rem;
  }
  
  .loading {
    color: #FF9800;
    font-weight: 500;
  }
  
  .idle {
    color: #4CAF50;
    font-weight: 500;
  }
}

// Manual Font Controls
.font-controls {
  margin-top: 1rem;
}

.font-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 1rem;
}

.font-button {
  position: relative;
  padding: 1rem;
  border: 2px solid #e0e0e0;
  border-radius: 8px;
  background: white;
  cursor: pointer;
  transition: all 0.3s ease;
  font-size: 0.9rem;
  
  &:hover {
    border-color: #2196F3;
    background: #f5f5f5;
  }
  
  &.loaded {
    border-color: #4CAF50;
    background: #e8f5e8;
    color: #2e7d32;
    font-weight: 500;
  }
}

.load-status {
  position: absolute;
  top: 0.5rem;
  right: 0.5rem;
  color: #4CAF50;
  font-weight: bold;
}

// Transition Controls
.transition-controls {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 1rem;
  margin-top: 1rem;
}

.transition-btn {
  padding: 1rem;
  border: 2px solid #2196F3;
  border-radius: 8px;
  background: white;
  color: #2196F3;
  cursor: pointer;
  transition: all 0.3s ease;
  font-weight: 500;
  
  &:hover {
    background: #2196F3;
    color: white;
  }
  
  &.scale {
    border-color: #FF9800;
    color: #FF9800;
    
    &:hover {
      background: #FF9800;
      color: white;
    }
  }
  
  &.typewriter {
    border-color: #9C27B0;
    color: #9C27B0;
    
    &:hover {
      background: #9C27B0;
      color: white;
    }
  }
}

// Typography Showcase
.typography-showcase {
  display: grid;
  gap: 2rem;
  margin-top: 1.5rem;
}

.type-sample {
  padding: 2rem;
  background: white;
  border-radius: 12px;
  border: 1px solid #e0e0e0;
  transition: all 0.3s ease;
  
  h1, h2, h3, h4 {
    margin: 0 0 1rem 0;
    line-height: 1.3;
  }
  
  h1 {
    font-size: 2.5rem;
    font-weight: 700;
  }
  
  h2 {
    font-size: 2rem;
    font-weight: 600;
  }
  
  h3 {
    font-size: 1.75rem;
    font-weight: 500;
  }
  
  h4 {
    font-size: 1.5rem;
    font-weight: 500;
  }
  
  p {
    line-height: 1.6;
    margin-bottom: 1rem;
  }
  
  pre {
    background: #f5f5f5;
    padding: 1rem;
    border-radius: 8px;
    overflow-x: auto;
    margin: 1rem 0;
    
    code {
      font-size: 0.9rem;
      line-height: 1.5;
    }
  }
}

.font-info {
  font-size: 0.8rem;
  color: #666;
  font-style: italic;
  margin-top: 1rem;
  padding-top: 1rem;
  border-top: 1px solid #e0e0e0;
}

// Available Themes
.themes-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 1.5rem;
  margin-top: 1.5rem;
}

.theme-card {
  padding: 1.5rem;
  background: white;
  border: 1px solid #e0e0e0;
  border-radius: 12px;
  transition: all 0.3s ease;
  
  &:hover {
    border-color: #2196F3;
    box-shadow: 0 4px 12px rgba(33, 150, 243, 0.1);
  }
  
  h4 {
    margin: 0 0 0.5rem 0;
    color: #333;
    font-size: 1.1rem;
  }
}

.theme-description {
  color: #666;
  font-size: 0.9rem;
  margin-bottom: 1rem;
  line-height: 1.4;
}

.theme-fonts {
  margin-bottom: 1.5rem;
}

.theme-font {
  display: flex;
  justify-content: space-between;
  padding: 0.25rem 0;
  font-size: 0.85rem;
  
  strong {
    color: #333;
    min-width: 60px;
  }
  
  & + .theme-font {
    border-top: 1px solid #f0f0f0;
  }
}

.apply-theme-btn {
  width: 100%;
  padding: 0.75rem;
  border: 1px solid #2196F3;
  border-radius: 6px;
  background: #2196F3;
  color: white;
  cursor: pointer;
  transition: all 0.3s ease;
  font-weight: 500;
  
  &:hover {
    background: #1976D2;
    border-color: #1976D2;
  }
}

// Event Log
.event-log {
  max-height: 300px;
  overflow-y: auto;
  background: white;
  border: 1px solid #e0e0e0;
  border-radius: 8px;
  padding: 1rem;
}

.event-item {
  display: flex;
  gap: 1rem;
  padding: 0.5rem 0;
  font-size: 0.9rem;
  border-bottom: 1px solid #f0f0f0;
  
  &:last-child {
    border-bottom: none;
  }
  
  &.success {
    color: #4CAF50;
  }
  
  &.error {
    color: #f44336;
  }
  
  &.info {
    color: #2196F3;
  }
}

.event-time {
  color: #666;
  font-size: 0.8rem;
  min-width: 80px;
  font-family: var(--font-family-mono, 'Courier New', monospace);
}

.event-message {
  flex: 1;
}

// Font Preset Controls
.preset-controls {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
  margin-top: 1rem;
}

.preset-selector {
  label {
    display: block;
    margin-bottom: 0.5rem;
    font-weight: 600;
    color: #333;
  }

  select {
    width: 100%;
    padding: 0.75rem;
    border: 2px solid #e0e0e0;
    border-radius: 8px;
    font-size: 1rem;
    background: white;
    transition: border-color 0.3s ease;

    &:focus {
      outline: none;
      border-color: #2196F3;
    }

    &:disabled {
      opacity: 0.6;
      cursor: not-allowed;
    }
  }
}

.transition-selector {
  display: flex;
  gap: 1rem;
  align-items: end;
  flex-wrap: wrap;

  label {
    font-weight: 600;
    color: #333;
    margin-bottom: 0.5rem;
    display: block;
  }

  select {
    padding: 0.5rem;
    border: 1px solid #ccc;
    border-radius: 6px;
    font-size: 0.9rem;
    min-width: 120px;
  }
}

.apply-btn {
  padding: 0.75rem 1.5rem;
  background: #2196F3;
  color: white;
  border: none;
  border-radius: 8px;
  font-weight: 500;
  cursor: pointer;
  transition: all 0.3s ease;
  white-space: nowrap;

  &:hover:not(:disabled) {
    background: #1976D2;
    transform: translateY(-2px);
  }

  &:disabled {
    opacity: 0.6;
    cursor: not-allowed;
    transform: none;
  }
}

// Current Preset Display
.current-preset {
  margin-top: 2rem;
  padding: 1.5rem;
  background: #e8f5e8;
  border: 1px solid #4CAF50;
  border-radius: 12px;

  h4 {
    margin: 0 0 1rem 0;
    color: #2e7d32;
    font-size: 1.1rem;
  }
}

.preset-fonts {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 0.5rem;
}

.font-assignment {
  display: flex;
  justify-content: space-between;
  padding: 0.5rem;
  background: white;
  border-radius: 6px;
  font-size: 0.9rem;

  .font-type {
    font-weight: 600;
    color: #333;
  }

  .font-name {
    color: #666;
    font-style: italic;
  }
}

// Theme card active state
.theme-card.active {
  border-color: #4CAF50;
  background: #f1f8e9;
  
  h4 {
    color: #2e7d32;
  }
}

// Section descriptions
.preset-description,
.preview-description,
.section-description {
  color: #666;
  font-size: 1rem;
  margin-bottom: 1rem;
  line-height: 1.5;
}

// Font transition animations
:global(html.font-transition-fade) {
  * {
    transition: font-family 0.8s ease-in-out;
  }
}

:global(html.font-transition-scale) {
  * {
    transition: font-family 0.6s ease-in-out, transform 0.6s ease-in-out;
  }
  
  body {
    transform: scale(1.02);
    transition: transform 0.3s ease-in-out;
  }
  
  &.font-transition-scale body {
    transform: scale(1);
  }
}

:global(html.font-transition-typewriter) {
  * {
    transition: font-family 0.5s steps(10, end);
  }
}

// Enhanced blockquote styling
blockquote {
  margin: 1.5rem 0;
  padding: 1rem 1.5rem;
  border-left: 4px solid #2196F3;
  background: #f8f9fa;
  font-style: italic;
  position: relative;

  &::before {
    content: '"';
    font-size: 3rem;
    color: #2196F3;
    position: absolute;
    top: -0.5rem;
    left: 1rem;
    opacity: 0.3;
  }
}

// Responsive Design
@media (max-width: 768px) {
  .demo-container {
    padding: 1rem;
  }
  
  .demo-section {
    padding: 1.5rem;
  }
  
  .font-grid {
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
  }
  
  .transition-controls {
    grid-template-columns: 1fr;
  }
  
  .themes-grid {
    grid-template-columns: 1fr;
  }
  
  .state-info {
    grid-template-columns: 1fr;
  }
  
  .type-sample {
    padding: 1.5rem;
    
    h1 { font-size: 2rem; }
    h2 { font-size: 1.75rem; }
    h3 { font-size: 1.5rem; }
    h4 { font-size: 1.25rem; }
  }

  .preset-controls {
    gap: 1rem;
  }

  .transition-selector {
    flex-direction: column;
    align-items: stretch;
    gap: 1rem;

    select,
    .apply-btn {
      width: 100%;
    }
  }

  .preset-fonts {
    grid-template-columns: 1fr;
  }
}Ncx>import { Component, OnInit, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Subject, takeUntil } from 'rxjs';

// Mock font combinations since ui-font-manager is not yet available
const FONT_COMBINATIONS = {
  'Modern Clean': {
    sans: 'Inter',
    serif: 'Playfair Display', 
    mono: 'JetBrains Mono',
    display: 'Inter'
  },
  'Classic Editorial': {
    sans: 'Source Sans Pro',
    serif: 'Lora',
    mono: 'Source Code Pro', 
    display: 'Source Sans Pro'
  },
  'Friendly Modern': {
    sans: 'Poppins',
    serif: 'Merriweather',
    mono: 'Fira Code',
    display: 'Poppins'
  },
  'Professional': {
    sans: 'Roboto',
    serif: 'EB Garamond', 
    mono: 'Roboto Mono',
    display: 'Roboto'
  }
};

@Component({
  selector: 'app-font-manager-demo',
  standalone: true,
  imports: [CommonModule, FormsModule],
  template: `
    <div class="demo-container">
      <h1>UI Font Manager Demo</h1>
      <p class="demo-description">
        Dynamically load Google Fonts and switch between font themes with smooth transitions. 
        Select a font preset to apply it globally to the entire application.
      </p>

      <!-- Font Preset Selection -->
      <section class="demo-section">
        <h2>Font Preset Selection</h2>
        <p class="preset-description">
          Choose from curated font combinations. The selected preset will be applied to the entire application.
        </p>
        
        <div class="preset-controls">
          <div class="preset-selector">
            <label for="preset-select">Choose Font Preset:</label>
            <select 
              id="preset-select" 
              [value]="selectedPreset" 
              (change)="onPresetChange($event)">
              <option value="">Select a preset...</option>
              <option *ngFor="let preset of fontPresets" [value]="preset.key">
                {{preset.name}} - {{preset.description}}
              </option>
            </select>
          </div>
          
          <div class="transition-selector" *ngIf="selectedPreset">
            <label for="transition-select">Transition Effect:</label>
            <select id="transition-select" [(ngModel)]="selectedTransition">
              <option value="fade">Fade</option>
              <option value="scale">Scale</option>
              <option value="typewriter">Typewriter</option>
            </select>
            <button 
              class="apply-btn"
              (click)="applyPresetWithTransition()">
              Apply with {{selectedTransition | titlecase}} Effect
            </button>
          </div>
        </div>

        <!-- Current Preset Display -->
        <div class="current-preset" *ngIf="currentPreset">
          <h4>Currently Applied: {{currentPreset.name}}</h4>
          <div class="preset-fonts">
            <div class="font-assignment">
              <span class="font-type">Sans-serif:</span>
              <span class="font-name">{{currentPreset.fonts.sans}}</span>
            </div>
            <div class="font-assignment">
              <span class="font-type">Serif:</span>
              <span class="font-name">{{currentPreset.fonts.serif}}</span>
            </div>
            <div class="font-assignment">
              <span class="font-type">Monospace:</span>
              <span class="font-name">{{currentPreset.fonts.mono}}</span>
            </div>
            <div class="font-assignment">
              <span class="font-type">Display:</span>
              <span class="font-name">{{currentPreset.fonts.display}}</span>
            </div>
          </div>
        </div>
      </section>

      <!-- Typography Preview -->
      <section class="demo-section">
        <h2>Typography Preview</h2>
        <p class="preview-description">See how the selected fonts look in a real application context.</p>
        
        <div class="typography-showcase">
          <div class="type-sample">
            <h1 style="font-family: var(--font-family-display)">Display Heading (H1)</h1>
            <h2 style="font-family: var(--font-family-sans)">Sans-serif Heading (H2)</h2>
            <h3 style="font-family: var(--font-family-serif)">Serif Heading (H3)</h3>
            
            <p style="font-family: var(--font-family-sans)">
              This is a paragraph using the sans-serif font. It demonstrates how readable body text 
              appears with the currently selected font combination. Lorem ipsum dolor sit amet, 
              consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
            </p>
            
            <blockquote style="font-family: var(--font-family-serif)">
              "This is a quote using the serif font, which often provides better readability 
              for longer text passages and adds elegance to quoted content."
            </blockquote>

            <div class="font-info">
              Current fonts: Sans (var(--font-family-sans)) | Serif (var(--font-family-serif)) | 
              Mono (var(--font-family-mono)) | Display (var(--font-family-display))
            </div>
          </div>
        </div>
      </section>

      <!-- Available Font Presets -->
      <section class="demo-section">
        <h2>Available Font Presets</h2>
        <div class="themes-grid">
          <div 
            *ngFor="let preset of fontPresets" 
            class="theme-card"
            [class.active]="preset.key === selectedPreset">
            
            <h4>{{preset.name}}</h4>
            <p class="theme-description">{{preset.description}}</p>
            
            <div class="theme-fonts">
              <div class="theme-font">
                <strong>Sans:</strong>
                <span>{{preset.fonts.sans}}</span>
              </div>
              <div class="theme-font">
                <strong>Serif:</strong>
                <span>{{preset.fonts.serif}}</span>
              </div>
              <div class="theme-font">
                <strong>Mono:</strong>
                <span>{{preset.fonts.mono}}</span>
              </div>
              <div class="theme-font">
                <strong>Display:</strong>
                <span>{{preset.fonts.display}}</span>
              </div>
            </div>
            
            <button 
              class="apply-theme-btn"
              (click)="applyPreset(preset.key)">
              Apply {{preset.name}}
            </button>
          </div>
        </div>
      </section>

      <!-- Popular Individual Fonts -->
      <section class="demo-section">
        <h3>Popular Individual Fonts</h3>
        <p class="section-description">Load individual fonts to test and preview them.</p>
        
        <div class="font-controls">
          <div class="font-grid">
            <button 
              *ngFor="let font of popularFonts" 
              class="font-button"
              [class.loaded]="isLoaded(font)"
              (click)="loadSingleFont(font)">
              
              {{font}}
              <span class="load-status" *ngIf="isLoaded(font)">✓</span>
            </button>
          </div>
        </div>
      </section>

      <!-- Event Log -->
      <section class="demo-section" *ngIf="eventLog.length > 0">
        <h3>Event Log</h3>
        <div class="event-log">
          <div 
            *ngFor="let event of eventLog.slice(-10)" 
            class="event-item"
            [class]="event.type">
            <span class="event-time">{{event.time}}</span>
            <span class="event-message">{{event.message}}</span>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './font-manager-demo.component.scss'
})
export class FontManagerDemoComponent implements OnInit, OnDestroy {
  popularFonts = ['Inter', 'Roboto', 'Playfair Display', 'JetBrains Mono', 'Montserrat', 'Lora'];
  loadedFonts = new Set<string>();
  
  // Font preset management
  fontPresets = [
    {
      key: 'modern-clean',
      name: 'Modern Clean',
      description: 'Contemporary and minimal design with Inter and Playfair Display',
      fonts: FONT_COMBINATIONS['Modern Clean']
    },
    {
      key: 'classic-editorial',
      name: 'Classic Editorial',
      description: 'Traditional publishing style with Source Sans Pro and Lora',
      fonts: FONT_COMBINATIONS['Classic Editorial']
    },
    {
      key: 'friendly-modern',
      name: 'Friendly Modern',
      description: 'Approachable and warm with Poppins and Merriweather',
      fonts: FONT_COMBINATIONS['Friendly Modern']
    },
    {
      key: 'professional',
      name: 'Professional',
      description: 'Corporate and reliable with Roboto and EB Garamond',
      fonts: FONT_COMBINATIONS['Professional']
    },
    {
      key: 'system',
      name: 'System Default',
      description: 'Use system fonts for optimal performance',
      fonts: {
        sans: 'system-ui',
        serif: 'ui-serif',
        mono: 'ui-monospace',
        display: 'system-ui'
      }
    }
  ];
  
  selectedPreset: string = '';
  selectedTransition: 'fade' | 'scale' | 'typewriter' = 'fade';
  currentPreset: any = null;
  
  eventLog: Array<{time: string, message: string, type: 'success' | 'error' | 'info'}> = [];
  
  private destroy$ = new Subject<void>();

  constructor() {}

  ngOnInit(): void {
    this.logEvent('Component initialized', 'info');
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  onThemeChanged(themeName: string): void {
    this.logEvent(`Theme changed to: ${themeName}`, 'success');
  }

  onFontLoaded(fontName: string): void {
    this.logEvent(`Font loaded: ${fontName}`, 'success');
    this.loadedFonts.add(fontName);
  }

  onFontError(event: {fontName: string, error: string}): void {
    this.logEvent(`Font error - ${event.fontName}: ${event.error}`, 'error');
  }

  loadSingleFont(fontName: string): void {
    this.logEvent(`Loading font: ${fontName}`, 'info');
    
    // Load font via Google Fonts API
    this.loadGoogleFont(fontName);
    this.loadedFonts.add(fontName);
    this.logEvent(`Successfully loaded: ${fontName}`, 'success');
  }

  applyTheme(themeName: string): void {
    this.logEvent(`Applying theme: ${themeName}`, 'info');
    this.logEvent(`Successfully applied theme: ${themeName}`, 'success');
  }

  isLoaded(fontName: string): boolean {
    return this.loadedFonts.has(fontName);
  }

  private loadGoogleFont(fontName: string): void {
    const link = document.createElement('link');
    link.href = `https://fonts.googleapis.com/css2?family=${fontName.replace(' ', '+')}&display=swap`;
    link.rel = 'stylesheet';
    document.head.appendChild(link);
  }

  onPresetChange(event: Event): void {
    const target = event.target as HTMLSelectElement;
    this.selectedPreset = target.value;
    
    if (this.selectedPreset) {
      const preset = this.fontPresets.find(p => p.key === this.selectedPreset);
      if (preset) {
        this.logEvent(`Selected preset: ${preset.name}`, 'info');
      }
    }
  }

  applyPreset(presetKey: string): void {
    const preset = this.fontPresets.find(p => p.key === presetKey);
    if (!preset) {
      this.logEvent(`Preset not found: ${presetKey}`, 'error');
      return;
    }

    this.selectedPreset = presetKey;
    this.logEvent(`Applying preset: ${preset.name}`, 'info');

    // Apply fonts to document root for global effect
    this.applyFontsGlobally(preset.fonts);
    this.currentPreset = preset;
  }

  applyPresetWithTransition(): void {
    const preset = this.fontPresets.find(p => p.key === this.selectedPreset);
    if (!preset) return;

    this.logEvent(`Applying preset "${preset.name}" with ${this.selectedTransition} transition`, 'info');

    // Apply fonts with transition effect
    const fontVariables = {
      '--font-family-sans': this.buildGlobalFontStack(preset.fonts.sans),
      '--font-family-serif': this.buildGlobalFontStack(preset.fonts.serif),
      '--font-family-mono': this.buildGlobalFontStack(preset.fonts.mono),
      '--font-family-display': this.buildGlobalFontStack(preset.fonts.display)
    };

    this.applyFontsWithTransition(fontVariables, this.selectedTransition);
    this.currentPreset = preset;
  }

  private applyFontsGlobally(fonts: any): void {
    const root = document.documentElement;
    
    // Set CSS custom properties on the document root
    root.style.setProperty('--font-family-sans', this.buildGlobalFontStack(fonts.sans));
    root.style.setProperty('--font-family-serif', this.buildGlobalFontStack(fonts.serif));
    root.style.setProperty('--font-family-mono', this.buildGlobalFontStack(fonts.mono));
    root.style.setProperty('--font-family-display', this.buildGlobalFontStack(fonts.display));

    // Also load the fonts if they're Google Fonts
    if (fonts.sans && fonts.sans !== 'system-ui') {
      this.loadSingleFont(fonts.sans);
    }
    if (fonts.serif && fonts.serif !== 'ui-serif') {
      this.loadSingleFont(fonts.serif);
    }
    if (fonts.mono && fonts.mono !== 'ui-monospace') {
      this.loadSingleFont(fonts.mono);
    }
    if (fonts.display && fonts.display !== 'system-ui') {
      this.loadSingleFont(fonts.display);
    }

    this.logEvent(`Applied fonts globally to document root`, 'success');
  }

  private applyFontsWithTransition(fontVariables: Record<string, string>, transitionType: 'fade' | 'scale' | 'typewriter'): void {
    const root = document.documentElement;
    
    // Add transition class
    root.classList.add(`font-transition-${transitionType}`);

    // Apply font changes
    Object.entries(fontVariables).forEach(([property, value]) => {
      root.style.setProperty(property, value);
    });

    // Remove transition class after animation
    setTimeout(() => {
      root.classList.remove(`font-transition-${transitionType}`);
      this.logEvent(`${transitionType} transition completed`, 'success');
    }, 1000);
  }

  private buildGlobalFontStack(fontName: string): string {
    // Handle system fonts
    if (fontName === 'system-ui') {
      return 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif';
    }
    if (fontName === 'ui-serif') {
      return 'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif';
    }
    if (fontName === 'ui-monospace') {
      return 'ui-monospace, SFMono-Regular, Monaco, Consolas, "Liberation Mono", "Courier New", monospace';
    }

    // For Google Fonts, add appropriate fallbacks
    const fontMap: Record<string, string> = {
      'Inter': `"Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,
      'Roboto': `"Roboto", Arial, Helvetica, sans-serif`,
      'Poppins': `"Poppins", Arial, Helvetica, sans-serif`,
      'Source Sans Pro': `"Source Sans Pro", Arial, Helvetica, sans-serif`,
      'Montserrat': `"Montserrat", Arial, Helvetica, sans-serif`,
      
      'Playfair Display': `"Playfair Display", Georgia, "Times New Roman", serif`,
      'Lora': `"Lora", Georgia, "Times New Roman", serif`,
      'Merriweather': `"Merriweather", Georgia, "Times New Roman", serif`,
      'EB Garamond': `"EB Garamond", Georgia, "Times New Roman", serif`,
      
      'JetBrains Mono': `"JetBrains Mono", Consolas, Monaco, "Courier New", monospace`,
      'Source Code Pro': `"Source Code Pro", Consolas, Monaco, "Courier New", monospace`,
      'Fira Code': `"Fira Code", Consolas, Monaco, "Courier New", monospace`,
      'Roboto Mono': `"Roboto Mono", Consolas, Monaco, "Courier New", monospace`,
      
      'Oswald': `"Oswald", Impact, "Arial Black", sans-serif`,
      'Raleway': `"Raleway", Arial, Helvetica, sans-serif`
    };

    return fontMap[fontName] || `"${fontName}", sans-serif`;
  }

  private logEvent(message: string, type: 'success' | 'error' | 'info'): void {
    const time = new Date().toLocaleTimeString();
    this.eventLog.push({ time, message, type });
    
    // Keep only last 50 events
    if (this.eventLog.length > 50) {
      this.eventLog = this.eventLog.slice(-50);
    }
  }
}bkx. export * from './font-manager-demo.component';zYxu@import "../../../../../ui-design-system/src/styles/semantic";
.demo-container {
  padding: 2rem;
  max-width: 1200px;
  margin: 0 auto;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}

h2 {
  color: #2c3e50;
  font-size: 2rem;
  margin-bottom: 2rem;
  border-bottom: 2px solid #6366f1;
  padding-bottom: 0.5rem;
}

h3 {
  color: #374151;
  font-size: 1.5rem;
  margin-bottom: 1rem;
}

h4 {
  color: #6b7280;
  font-size: 1.125rem;
  margin-bottom: 0.75rem;
}

// Sections
.demo-section {
  border: 1px solid #e5e7eb;
  border-radius: 8px;
  padding: 1.5rem;
  margin-bottom: 2rem;
  background: #ffffff;
}

.intro-section {
  border: 1px solid #e5e7eb;
  border-radius: 8px;
  padding: 1.5rem;
  margin-bottom: 2rem;
  background: #f8fafc;

  p {
    margin-bottom: 1rem;
    color: #6b7280;
  }
}

.info-box {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 1rem;
  background: #dbeafe;
  border-radius: 6px;
  border-left: 4px solid #3b82f6;

  .info-icon {
    color: #3b82f6;
  }

  span {
    color: #1f2937;
  }
}

// Icon Grid
.icon-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 1rem;
  margin: 1rem 0;
}

.icon-example {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 1rem;
  border: 1px solid #e5e7eb;
  border-radius: 6px;
  background: #ffffff;
  cursor: pointer;
  transition: all 0.2s ease;

  &:hover {
    background: #f3f4f6;
    border-color: #6366f1;
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  }

  .icon-name {
    font-weight: 600;
    color: #1f2937;
    margin: 0.5rem 0 0.25rem;
    font-family: 'JetBrains Mono', 'Courier New', monospace;
  }

  .icon-usage {
    font-size: 0.875rem;
    color: #6b7280;
    text-align: center;
    margin-bottom: 0.5rem;
  }

  code {
    font-size: 0.75rem;
    background: #f3f4f6;
    padding: 0.25rem 0.5rem;
    border-radius: 4px;
    color: #6b7280;
    font-family: 'JetBrains Mono', 'Courier New', monospace;
    text-align: center;
  }
}

// Size Demo
.size-demo {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.size-row {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 0.5rem;
  background: #f8fafc;
  border-radius: 6px;

  .size-label {
    font-weight: 600;
    min-width: 30px;
    color: #1f2937;
  }

  fa-icon {
    color: #6366f1;
    min-width: 80px;
    text-align: center;
  }

  code {
    background: #ffffff;
    padding: 0.25rem 0.5rem;
    border-radius: 4px;
    color: #6b7280;
    font-family: 'JetBrains Mono', 'Courier New', monospace;
    font-size: 0.875rem;
  }
}

// Styling Demo
.styling-demo {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

.style-example {
  padding: 1rem;
  background: #f8fafc;
  border-radius: 6px;

  h4 {
    margin-bottom: 1rem;
  }
}

.color-row,
.animation-row {
  display: flex;
  gap: 1rem;
  align-items: center;
  margin-bottom: 1rem;

  fa-icon {
    flex-shrink: 0;
  }
}

// Use Cases
.use-cases {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

.use-case {
  padding: 1rem;
  background: #f8fafc;
  border-radius: 6px;
}

.nav-example {
  display: flex;
  gap: 2rem;
  align-items: center;
  flex-wrap: wrap;

  fa-icon {
    margin-right: 0.5rem;
    color: #6366f1;
  }
}

.action-buttons {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
}

.status-row {
  display: flex;
  gap: 2rem;
  flex-wrap: wrap;
}

.status-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.5rem 1rem;
  border-radius: 6px;

  &.success {
    background: #dcfce7;
    color: #166534;
    
    fa-icon {
      color: #22c55e;
    }
  }

  &.warning {
    background: #fef3c7;
    color: #92400e;
    
    fa-icon {
      color: #f59e0b;
    }
  }

  &.error {
    background: #fee2e2;
    color: #991b1b;
    
    fa-icon {
      color: #ef4444;
    }
  }

  &.info {
    background: #dbeafe;
    color: #1e40af;
    
    fa-icon {
      color: #3b82f6;
    }
  }
}

// Code Examples
.code-examples {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.code-example {
  padding: 1rem;
  background: #f8fafc;
  border-radius: 6px;

  h4 {
    margin-bottom: 0.5rem;
    color: #6366f1;
  }

  pre {
    margin: 0;
    background: #ffffff;
    padding: 1rem;
    border-radius: 4px;
    overflow-x: auto;
    border: 1px solid #e5e7eb;

    code {
      font-family: 'JetBrains Mono', 'Courier New', monospace;
      color: #1f2937;
      font-size: 0.875rem;
      line-height: 1.5;
    }
  }
}

// Selected Icon Details
.selected-icon {
  background: #ede9fe;
  border-color: #6366f1;
}

.icon-details {
  display: flex;
  gap: 2rem;
  margin-bottom: 1.5rem;
  align-items: flex-start;

  @media (max-width: 768px) {
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 1rem;
  }
}

.icon-display {
  flex-shrink: 0;
  padding: 2rem;
  background: #ffffff;
  border-radius: 8px;
  border: 2px solid #6366f1;

  fa-icon {
    color: #6366f1;
  }
}

.icon-info {
  flex: 1;

  h4 {
    color: #5b21b6;
    font-size: 1.5rem;
    margin-bottom: 1rem;
    font-family: 'JetBrains Mono', 'Courier New', monospace;
  }

  p {
    margin-bottom: 0.75rem;
    color: #1f2937;
  }
}

.copy-code {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1rem;
  background: #ffffff;
  border-radius: 6px;
  border: 1px solid #e5e7eb;

  code {
    flex: 1;
    background: none;
    color: #1f2937;
    font-family: 'JetBrains Mono', 'Courier New', monospace;
    font-size: 0.875rem;
  }
}

// Interactive Demo
.action-feedback {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 1rem;
  padding: 1rem;
  background: #dbeafe;
  border-radius: 6px;
  border-left: 4px solid #3b82f6;

  fa-icon {
    color: #3b82f6;
  }

  span {
    color: #1f2937;
  }
}

.interactive-buttons {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
}

// Best Practices
.best-practices {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
}

.practice-item {
  display: flex;
  gap: 1rem;
  padding: 1rem;
  background: #ffffff;
  border-radius: 6px;
  border: 1px solid #e5e7eb;

  .practice-icon {
    flex-shrink: 0;
    margin-top: 0.25rem;

    &.success {
      color: #22c55e;
    }

    &.warning {
      color: #f59e0b;
    }
  }

  .practice-content {
    flex: 1;

    h4 {
      color: #1f2937;
      margin-bottom: 0.5rem;
    }

    p {
      color: #6b7280;
      margin-bottom: 0.75rem;
      line-height: 1.5;
    }

    code {
      background: #f3f4f6;
      padding: 0.25rem 0.5rem;
      border-radius: 4px;
      color: #374151;
      font-family: 'JetBrains Mono', 'Courier New', monospace;
      font-size: 0.875rem;
    }
  }
}

// Quick Reference
.reference-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1.5rem;
}

.reference-category {
  padding: 1rem;
  background: #ffffff;
  border-radius: 6px;
  border: 1px solid #e5e7eb;

  h4 {
    color: #6366f1;
    margin-bottom: 1rem;
    font-weight: 600;
  }
}

.reference-list {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  font-size: 0.875rem;
  line-height: 1.4;

  code {
    background: #f3f4f6;
    padding: 0.25rem 0.5rem;
    border-radius: 4px;
    color: #6366f1;
    font-family: 'JetBrains Mono', 'Courier New', monospace;
    font-weight: 600;
    margin-right: 0.5rem;
  }
}

// Responsive Design
@media (max-width: 768px) {
  .demo-container {
    padding: 1rem;
  }

  .icon-grid {
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    gap: 0.75rem;
  }

  .action-buttons,
  .interactive-buttons {
    flex-direction: column;
    align-items: stretch;
  }

  .nav-example {
    flex-direction: column;
    align-items: flex-start;
    gap: 1rem;
  }

  .status-row {
    flex-direction: column;
    gap: 1rem;
  }

  .size-row {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.5rem;
  }

  .color-row,
  .animation-row {
    justify-content: center;
  }
}adxjngqFbQjniF_y [ؼ
xUSimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
import { ButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons/button.component';
import {
  // Solid icons from shared-ui
  faUser,
  faHome,
  faCog,
  faSearch,
  faPlus,
  faEdit,
  faTrash,
  faSave,
  faCancel,
  faCheck,
  faTimes,
  faArrowLeft,
  faArrowRight,
  faChevronLeft,
  faChevronRight,
  faChevronUp,
  faChevronDown,
  faBars,
  faEllipsisV,
  faEye,
  faEyeSlash,
  faDownload,
  faUpload,
  faRefresh,
  faSpinner,
  faExclamationTriangle,
  faInfoCircle,
  faCheckCircle,
  faTimesCircle,
  faEnvelope
} from '@fortawesome/free-solid-svg-icons';
import {
  // Regular icons from shared-ui  
  faHeart,
  faBookmark,
  faComment,
  faThumbsUp
} from '@fortawesome/free-regular-svg-icons';
import {
  // Brand icons from shared-ui
  faGithub,
  faTwitter,
  faLinkedin,
  faGoogle
} from '@fortawesome/free-brands-svg-icons';

@Component({
  selector: 'ui-fontawesome-demo',
  standalone: true,
  imports: [
    CommonModule,
    FaIconComponent,
    ButtonComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="demo-container">
      <h2>Font Awesome Icons Showcase</h2>
      
      <!-- Introduction -->
      <section class="intro-section">
        <h3>Font Awesome Integration</h3>
        <p>This demo showcases the Font Awesome icons available in the shared-ui library. Icons are pre-configured and ready to use across the application.</p>
        <div class="info-box">
          <fa-icon [icon]="faInfoCircle" class="info-icon"></fa-icon>
          <span><strong>Available Categories:</strong> Solid, Regular, and Brand icons from Font Awesome</span>
        </div>
      </section>

      <!-- Basic Usage -->
      <section class="demo-section">
        <h3>Basic Usage</h3>
        <div class="icon-grid">
          <div class="icon-example">
            <fa-icon [icon]="faUser" size="2x"></fa-icon>
            <span class="icon-name">faUser</span>
            <code>fa-icon [icon]="faUser"</code>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faHome" size="2x"></fa-icon>
            <span class="icon-name">faHome</span>
            <code>fa-icon [icon]="faHome"</code>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faCog" size="2x"></fa-icon>
            <span class="icon-name">faCog</span>
            <code>fa-icon [icon]="faCog"</code>
          </div>
        </div>
      </section>

      <!-- Icon Sizes -->
      <section class="demo-section">
        <h3>Icon Sizes</h3>
        <div class="size-demo">
          <div class="size-row">
            <span class="size-label">xs:</span>
            <fa-icon [icon]="faCheck" size="xs"></fa-icon>
            <code>size="xs"</code>
          </div>
          <div class="size-row">
            <span class="size-label">sm:</span>
            <fa-icon [icon]="faCheck" size="sm"></fa-icon>
            <code>size="sm"</code>
          </div>
          <div class="size-row">
            <span class="size-label">lg:</span>
            <fa-icon [icon]="faCheck" size="lg"></fa-icon>
            <code>size="lg"</code>
          </div>
          <div class="size-row">
            <span class="size-label">2x:</span>
            <fa-icon [icon]="faCheck" size="2x"></fa-icon>
            <code>size="2x"</code>
          </div>
          <div class="size-row">
            <span class="size-label">3x:</span>
            <fa-icon [icon]="faCheck" size="3x"></fa-icon>
            <code>size="3x"</code>
          </div>
        </div>
      </section>

      <!-- Solid Icons -->
      <section class="demo-section">
        <h3>Solid Icons (free-solid-svg-icons)</h3>
        <p>Most commonly used icons for UI elements, actions, and navigation.</p>
        <div class="icon-grid">
          <div class="icon-example">
            <fa-icon [icon]="faUser" size="2x"></fa-icon>
            <span class="icon-name">faUser</span>
            <span class="icon-usage">User profiles, accounts</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faHome" size="2x"></fa-icon>
            <span class="icon-name">faHome</span>
            <span class="icon-usage">Home navigation</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faCog" size="2x"></fa-icon>
            <span class="icon-name">faCog</span>
            <span class="icon-usage">Settings</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faSearch" size="2x"></fa-icon>
            <span class="icon-name">faSearch</span>
            <span class="icon-usage">Search functionality</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faPlus" size="2x"></fa-icon>
            <span class="icon-name">faPlus</span>
            <span class="icon-usage">Add new items</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faEdit" size="2x"></fa-icon>
            <span class="icon-name">faEdit</span>
            <span class="icon-usage">Edit content</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faTrash" size="2x"></fa-icon>
            <span class="icon-name">faTrash</span>
            <span class="icon-usage">Delete items</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faSave" size="2x"></fa-icon>
            <span class="icon-name">faSave</span>
            <span class="icon-usage">Save changes</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faCheck" size="2x"></fa-icon>
            <span class="icon-name">faCheck</span>
            <span class="icon-usage">Confirm, success</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faTimes" size="2x"></fa-icon>
            <span class="icon-name">faTimes</span>
            <span class="icon-usage">Close, dismiss</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faArrowLeft" size="2x"></fa-icon>
            <span class="icon-name">faArrowLeft</span>
            <span class="icon-usage">Back navigation</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faArrowRight" size="2x"></fa-icon>
            <span class="icon-name">faArrowRight</span>
            <span class="icon-usage">Forward navigation</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faDownload" size="2x"></fa-icon>
            <span class="icon-name">faDownload</span>
            <span class="icon-usage">Download files</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faUpload" size="2x"></fa-icon>
            <span class="icon-name">faUpload</span>
            <span class="icon-usage">Upload files</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faRefresh" size="2x"></fa-icon>
            <span class="icon-name">faRefresh</span>
            <span class="icon-usage">Refresh content</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faSpinner" size="2x"></fa-icon>
            <span class="icon-name">faSpinner</span>
            <span class="icon-usage">Loading states</span>
          </div>
        </div>
      </section>

      <!-- Regular Icons -->
      <section class="demo-section">
        <h3>Regular Icons (free-regular-svg-icons)</h3>
        <p>Outlined versions of icons, great for secondary actions and states.</p>
        <div class="icon-grid">
          <div class="icon-example">
            <fa-icon [icon]="faHeart" size="2x"></fa-icon>
            <span class="icon-name">faHeart</span>
            <span class="icon-usage">Favorites, likes</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faBookmark" size="2x"></fa-icon>
            <span class="icon-name">faBookmark</span>
            <span class="icon-usage">Saved items</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faComment" size="2x"></fa-icon>
            <span class="icon-name">faComment</span>
            <span class="icon-usage">Comments</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faThumbsUp" size="2x"></fa-icon>
            <span class="icon-name">faThumbsUp</span>
            <span class="icon-usage">Approval</span>
          </div>
        </div>
      </section>

      <!-- Brand Icons -->
      <section class="demo-section">
        <h3>Brand Icons (free-brands-svg-icons)</h3>
        <p>Social media and company logos for external integrations.</p>
        <div class="icon-grid">
          <div class="icon-example">
            <fa-icon [icon]="faGithub" size="2x"></fa-icon>
            <span class="icon-name">faGithub</span>
            <span class="icon-usage">GitHub integration</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faTwitter" size="2x"></fa-icon>
            <span class="icon-name">faTwitter</span>
            <span class="icon-usage">Twitter sharing</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faLinkedin" size="2x"></fa-icon>
            <span class="icon-name">faLinkedin</span>
            <span class="icon-usage">LinkedIn integration</span>
          </div>
          <div class="icon-example">
            <fa-icon [icon]="faGoogle" size="2x"></fa-icon>
            <span class="icon-name">faGoogle</span>
            <span class="icon-usage">Google services</span>
          </div>
        </div>
      </section>

      <!-- Icon Styling -->
      <section class="demo-section">
        <h3>Icon Styling & Transformations</h3>
        <div class="styling-demo">
          <div class="style-example">
            <h4>Colors</h4>
            <div class="color-row">
              <fa-icon [icon]="faHeart" size="2x" style="color: #dc3545;"></fa-icon>
              <fa-icon [icon]="faHeart" size="2x" style="color: #28a745;"></fa-icon>
              <fa-icon [icon]="faHeart" size="2x" style="color: #007bff;"></fa-icon>
              <fa-icon [icon]="faHeart" size="2x" style="color: #ffc107;"></fa-icon>
            </div>
            <code>style="color: #dc3545;"</code>
          </div>
          
          <div class="style-example">
            <h4>Different Sizes</h4>
            <div class="animation-row">
              <fa-icon [icon]="faSpinner" size="lg"></fa-icon>
              <fa-icon [icon]="faRefresh" size="2x"></fa-icon>
              <fa-icon [icon]="faCog" size="3x"></fa-icon>
            </div>
            <code>size="lg", size="2x", size="3x"</code>
          </div>
        </div>
      </section>

      <!-- Common Use Cases -->
      <section class="demo-section">
        <h3>Common Use Cases</h3>
        <div class="use-cases">
          <div class="use-case">
            <h4>Navigation</h4>
            <div class="nav-example">
              <div><fa-icon [icon]="faHome"></fa-icon> Home</div>
              <div><fa-icon [icon]="faUser"></fa-icon> Profile</div>
              <div><fa-icon [icon]="faCog"></fa-icon> Settings</div>
              <div><fa-icon [icon]="faSearch"></fa-icon> Search</div>
            </div>
          </div>

          <div class="use-case">
            <h4>Action Buttons</h4>
            <div class="action-buttons">
              <ui-button variant="filled" [icon]="faPlus" iconPosition="left">Add Item</ui-button>
              <ui-button variant="outlined" [icon]="faEdit" iconPosition="left">Edit</ui-button>
              <ui-button variant="outlined" [icon]="faTrash" iconPosition="left">Delete</ui-button>
              <ui-button variant="tonal" [icon]="faSave" iconPosition="left">Save</ui-button>
            </div>
          </div>

          <div class="use-case">
            <h4>Status Indicators</h4>
            <div class="status-row">
              <div class="status-item success">
                <fa-icon [icon]="faCheckCircle"></fa-icon>
                <span>Success</span>
              </div>
              <div class="status-item warning">
                <fa-icon [icon]="faExclamationTriangle"></fa-icon>
                <span>Warning</span>
              </div>
              <div class="status-item error">
                <fa-icon [icon]="faTimesCircle"></fa-icon>
                <span>Error</span>
              </div>
              <div class="status-item info">
                <fa-icon [icon]="faInfoCircle"></fa-icon>
                <span>Info</span>
              </div>
            </div>
          </div>
        </div>
      </section>

      <!-- Code Examples -->
      <section class="demo-section">
        <h3>Implementation Examples</h3>
        <div class="code-examples">
          <div class="code-example">
            <h4>1. Import the Icon</h4>
            <pre><code>import &#123; faUser &#125; from '&#64;fortawesome/free-solid-svg-icons';</code></pre>
          </div>

          <div class="code-example">
            <h4>2. Add to Component</h4>
            <pre><code>export class MyComponent &#123;
  faUser = faUser;
  faHome = faHome;
  faCog = faCog;
&#125;</code></pre>
          </div>

          <div class="code-example">
            <h4>3. Basic Icon Usage</h4>
            <pre><code>&lt;fa-icon [icon]="faUser"&gt;&lt;/fa-icon&gt;
&lt;fa-icon [icon]="faHome" size="lg"&gt;&lt;/fa-icon&gt;
&lt;fa-icon [icon]="faCog" size="2x"&gt;&lt;/fa-icon&gt;</code></pre>
          </div>

          <div class="code-example">
            <h4>4. Styled Icons</h4>
            <pre><code>&lt;fa-icon 
  [icon]="faHeart" 
  size="2x" 
  style="color: #dc3545;"&gt;
&lt;/fa-icon&gt;</code></pre>
          </div>

          <div class="code-example">
            <h4>5. Icons in Buttons</h4>
            <pre><code>&lt;ui-button 
  variant="filled" 
  [icon]="faPlus" 
  iconPosition="left"&gt;
  Add Item
&lt;/ui-button&gt;</code></pre>
          </div>

          <div class="code-example">
            <h4>6. Navigation with Icons</h4>
            <pre><code>&lt;nav class="nav-menu"&gt;
  &lt;a href="/home"&gt;
    &lt;fa-icon [icon]="faHome"&gt;&lt;/fa-icon&gt; Home
  &lt;/a&gt;
  &lt;a href="/profile"&gt;
    &lt;fa-icon [icon]="faUser"&gt;&lt;/fa-icon&gt; Profile
  &lt;/a&gt;
&lt;/nav&gt;</code></pre>
          </div>

          <div class="code-example">
            <h4>7. Status Messages</h4>
            <pre><code>&lt;div class="status-success"&gt;
  &lt;fa-icon [icon]="faCheckCircle"&gt;&lt;/fa-icon&gt;
  Operation completed successfully!
&lt;/div&gt;

&lt;div class="status-error"&gt;
  &lt;fa-icon [icon]="faTimesCircle"&gt;&lt;/fa-icon&gt;
  Something went wrong.
&lt;/div&gt;</code></pre>
          </div>

          <div class="code-example">
            <h4>8. Loading States</h4>
            <pre><code>&lt;div class="loading-container"&gt;
  &lt;fa-icon [icon]="faSpinner"&gt;&lt;/fa-icon&gt;
  Loading...
&lt;/div&gt;

&lt;ui-button 
  [disabled]="isLoading" 
  [icon]="isLoading ? faSpinner : faSave"&gt;
  &#123;&#123; isLoading ? 'Saving...' : 'Save' &#125;&#125;
&lt;/ui-button&gt;</code></pre>
          </div>
        </div>
      </section>

      <!-- Best Practices -->
      <section class="demo-section">
        <h3>Best Practices</h3>
        <div class="best-practices">
          <div class="practice-item">
            <fa-icon [icon]="faCheckCircle" class="practice-icon success"></fa-icon>
            <div class="practice-content">
              <h4>Import Only What You Need</h4>
              <p>Only import the specific icons you're using to keep bundle size small.</p>
              <code>import &#123; faUser, faHome &#125; from '&#64;fortawesome/free-solid-svg-icons';</code>
            </div>
          </div>

          <div class="practice-item">
            <fa-icon [icon]="faCheckCircle" class="practice-icon success"></fa-icon>
            <div class="practice-content">
              <h4>Use Semantic Naming</h4>
              <p>Choose icons that clearly represent their function or meaning.</p>
              <code>faTrash for delete, faEdit for edit, faPlus for add</code>
            </div>
          </div>

          <div class="practice-item">
            <fa-icon [icon]="faCheckCircle" class="practice-icon success"></fa-icon>
            <div class="practice-content">
              <h4>Consistent Sizing</h4>
              <p>Use consistent icon sizes throughout your application.</p>
              <code>size="sm" for inline text, size="lg" for buttons</code>
            </div>
          </div>

          <div class="practice-item">
            <fa-icon [icon]="faExclamationTriangle" class="practice-icon warning"></fa-icon>
            <div class="practice-content">
              <h4>Accessibility</h4>
              <p>Add aria-labels for screen readers when icons convey important information.</p>
              <code>&lt;fa-icon [icon]="faUser" aria-label="User profile"&gt;&lt;/fa-icon&gt;</code>
            </div>
          </div>
        </div>
      </section>

      <!-- Available Icon Reference -->
      <section class="demo-section">
        <h3>Quick Reference</h3>
        <div class="reference-grid">
          <div class="reference-category">
            <h4>Actions</h4>
            <div class="reference-list">
              <code>faPlus</code> - Add/Create
              <code>faEdit</code> - Edit/Modify  
              <code>faTrash</code> - Delete/Remove
              <code>faSave</code> - Save/Confirm
              <code>faCancel</code> - Cancel/Dismiss
              <code>faRefresh</code> - Reload/Update
            </div>
          </div>

          <div class="reference-category">
            <h4>Navigation</h4>
            <div class="reference-list">
              <code>faHome</code> - Home page
              <code>faArrowLeft</code> - Go back
              <code>faArrowRight</code> - Go forward
              <code>faChevronUp</code> - Expand up
              <code>faChevronDown</code> - Expand down
              <code>faBars</code> - Menu toggle
            </div>
          </div>

          <div class="reference-category">
            <h4>Status</h4>
            <div class="reference-list">
              <code>faCheckCircle</code> - Success
              <code>faTimesCircle</code> - Error
              <code>faExclamationTriangle</code> - Warning
              <code>faInfoCircle</code> - Information
              <code>faSpinner</code> - Loading
            </div>
          </div>

          <div class="reference-category">
            <h4>User Interface</h4>
            <div class="reference-list">
              <code>faUser</code> - User/Profile
              <code>faCog</code> - Settings
              <code>faSearch</code> - Search
              <code>faEye</code> - View/Show
              <code>faEyeSlash</code> - Hide
              <code>faDownload</code> - Download
            </div>
          </div>
        </div>
      </section>

      <!-- Interactive Demo -->
      <section class="demo-section">
        <h3>Interactive Demo</h3>
        <div class="interactive-buttons">
          <ui-button 
            variant="filled" 
            [icon]="faRefresh" 
            iconPosition="left"
            (clicked)="refreshDemo()">
            Refresh Demo
          </ui-button>
          <ui-button 
            variant="tonal" 
            [icon]="faDownload" 
            iconPosition="left"
            (clicked)="downloadDemo()">
            Download Examples
          </ui-button>
          <ui-button 
            variant="outlined" 
            [icon]="faGithub" 
            iconPosition="left"
            (clicked)="viewSource()">
            View Source
          </ui-button>
        </div>
        
        @if (lastAction) {
          <div class="action-feedback">
            <fa-icon [icon]="faInfoCircle"></fa-icon>
            <span>{{ lastAction }}</span>
          </div>
        }
      </section>
    </div>
  `,
  styleUrl: './fontawesome-demo.component.scss'
})
export class FontAwesomeDemoComponent {
  lastAction: string = '';
  isLoading: boolean = false;

  // Export icons for template use
  faInfoCircle = faInfoCircle;
  faUser = faUser;
  faHome = faHome;
  faCog = faCog;
  faSearch = faSearch;
  faPlus = faPlus;
  faEdit = faEdit;
  faTrash = faTrash;
  faSave = faSave;
  faCancel = faCancel;
  faCheck = faCheck;
  faTimes = faTimes;
  faArrowLeft = faArrowLeft;
  faArrowRight = faArrowRight;
  faChevronLeft = faChevronLeft;
  faChevronRight = faChevronRight;
  faChevronUp = faChevronUp;
  faChevronDown = faChevronDown;
  faBars = faBars;
  faEllipsisV = faEllipsisV;
  faEye = faEye;
  faEyeSlash = faEyeSlash;
  faDownload = faDownload;
  faUpload = faUpload;
  faRefresh = faRefresh;
  faSpinner = faSpinner;
  faExclamationTriangle = faExclamationTriangle;
  faCheckCircle = faCheckCircle;
  faTimesCircle = faTimesCircle;
  faEnvelope = faEnvelope;

  // Regular icons
  faHeart = faHeart;
  faBookmark = faBookmark;
  faComment = faComment;
  faThumbsUp = faThumbsUp;

  // Brand icons
  faGithub = faGithub;
  faTwitter = faTwitter;
  faLinkedin = faLinkedin;
  faGoogle = faGoogle;

  refreshDemo(): void {
    this.lastAction = 'Demo refreshed - all selections cleared';
    console.log('Demo refreshed');
  }

  downloadDemo(): void {
    this.lastAction = 'Demo download initiated (simulated)';
    console.log('Download demo');
  }

  viewSource(): void {
    this.lastAction = 'Opening source code (simulated)';
    console.log('View source');
  }
}1װn:x[qjC *
xSimport { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormControl, FormGroup, ReactiveFormsModule, Validators, AbstractControl, ValidationErrors } from '@angular/forms';
import { FormFieldComponent } from '../../../../../ui-essentials/src/lib/components/forms/form-field/form-field.component';

@Component({
  selector: 'ui-form-field-demo',
  standalone: true,
  imports: [CommonModule, ReactiveFormsModule, FormFieldComponent],
  template: `
    <div class="demo-container">
      <h2>Form Field Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-grid">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <h4>{{ size.toUpperCase() }} Size</h4>
              <p>Form field with {{ size }} sizing.</p>
              <ui-form-field 
                [size]="size"
                label="Label ({{ size }})"
                helperText="This is helper text"
              >
                <input 
                  class="demo-input"
                  type="text" 
                  placeholder="Enter text..."
                />
              </ui-form-field>
            </div>
          }
        </div>
      </section>
      
      <!-- Layout Variants -->
      <section class="demo-section">
        <h3>Layout Options</h3>
        <div class="layout-demo">
          <div class="demo-item">
            <h4>Vertical Layout (Default)</h4>
            <p>Standard vertical layout with label above the control.</p>
            <ui-form-field 
              label="Vertical Label"
              helperText="Helper text appears below the control"
              layout="vertical"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Enter text..."
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Horizontal Layout</h4>
            <p>Horizontal layout with label beside the control.</p>
            <ui-form-field 
              label="Horizontal Label"
              helperText="Helper text appears below the control"
              layout="horizontal"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Enter text..."
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Compact Layout</h4>
            <p>Compact spacing for tighter layouts.</p>
            <ui-form-field 
              label="Compact Label"
              helperText="Reduced spacing"
              [compact]="true"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Enter text..."
              />
            </ui-form-field>
          </div>
        </div>
      </section>
      
      <!-- State Variants -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Default State</h4>
            <p>Normal state with no validation.</p>
            <ui-form-field 
              label="Default Field"
              helperText="This is in default state"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Enter text..."
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Error State</h4>
            <p>Error state with error message.</p>
            <ui-form-field 
              label="Error Field"
              state="error"
              errorMessage="This field has an error"
            >
              <input 
                class="demo-input demo-input--error"
                type="text" 
                placeholder="Enter text..."
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Success State</h4>
            <p>Success state with success message.</p>
            <ui-form-field 
              label="Success Field"
              state="success"
              successMessage="This field is valid"
            >
              <input 
                class="demo-input demo-input--success"
                type="text" 
                value="Valid input"
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Warning State</h4>
            <p>Warning state with warning message.</p>
            <ui-form-field 
              label="Warning Field"
              state="warning"
              warningMessage="This is a warning message"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Enter text..."
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Info State</h4>
            <p>Info state with informational message.</p>
            <ui-form-field 
              label="Info Field"
              state="info"
              infoMessage="This is informational text"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Enter text..."
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Disabled State</h4>
            <p>Disabled field with disabled styling.</p>
            <ui-form-field 
              label="Disabled Field"
              helperText="This field is disabled"
              [disabled]="true"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Disabled input"
                disabled
              />
            </ui-form-field>
          </div>
        </div>
      </section>
      
      <!-- Required and Optional -->
      <section class="demo-section">
        <h3>Required and Optional Fields</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Required Field</h4>
            <p>Field marked as required with asterisk.</p>
            <ui-form-field 
              label="Required Field"
              [required]="true"
              helperText="This field is required"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Required input"
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Optional Field</h4>
            <p>Field marked as optional with (optional) text.</p>
            <ui-form-field 
              label="Optional Field"
              [showOptional]="true"
              helperText="This field is optional"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Optional input"
              />
            </ui-form-field>
          </div>
        </div>
      </section>
      
      <!-- Different Input Types -->
      <section class="demo-section">
        <h3>Input Types</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Text Input</h4>
            <ui-form-field 
              label="Text Input"
              helperText="Enter any text"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Text input"
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Email Input</h4>
            <ui-form-field 
              label="Email Input"
              helperText="Enter a valid email address"
            >
              <input 
                class="demo-input"
                type="email" 
                placeholder="email@example.com"
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Number Input</h4>
            <ui-form-field 
              label="Number Input"
              helperText="Enter a number"
            >
              <input 
                class="demo-input"
                type="number" 
                placeholder="123"
              />
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Textarea</h4>
            <ui-form-field 
              label="Textarea"
              helperText="Enter multiple lines of text"
            >
              <textarea 
                class="demo-textarea"
                placeholder="Multi-line text input"
              ></textarea>
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Select</h4>
            <ui-form-field 
              label="Select"
              helperText="Choose an option"
            >
              <select class="demo-select">
                <option value="">Choose an option</option>
                <option value="option1">Option 1</option>
                <option value="option2">Option 2</option>
                <option value="option3">Option 3</option>
              </select>
            </ui-form-field>
          </div>
          
          <div class="demo-item">
            <h4>Checkbox Group</h4>
            <ui-form-field 
              label="Preferences"
              helperText="Select your preferences"
              [group]="true"
            >
              <div class="demo-checkbox">
                <input type="checkbox" id="pref1" />
                <label for="pref1">Option 1</label>
              </div>
              <div class="demo-checkbox">
                <input type="checkbox" id="pref2" />
                <label for="pref2">Option 2</label>
              </div>
              <div class="demo-checkbox">
                <input type="checkbox" id="pref3" />
                <label for="pref3">Option 3</label>
              </div>
            </ui-form-field>
          </div>
        </div>
      </section>
      
      <!-- Character Count -->
      <section class="demo-section">
        <h3>Character Count</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>With Character Counter</h4>
            <p>Shows character count with maximum limit.</p>
            <ui-form-field 
              label="Limited Text"
              helperText="Maximum 50 characters"
              [showCharacterCount]="true"
              [maxLength]="50"
              [currentLength]="characterCountText.length"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="Type here..."
                [value]="characterCountText"
                (input)="updateCharacterCount($event)"
                maxlength="50"
              />
            </ui-form-field>
          </div>
        </div>
      </section>
      
      <!-- Hint Text -->
      <section class="demo-section">
        <h3>Hint Text</h3>
        <div class="demo-grid">
          <div class="demo-item">
            <h4>With Hint</h4>
            <p>Additional helpful information with icon.</p>
            <ui-form-field 
              label="Password"
              helperText="Enter a secure password"
              hintText="Password should be at least 8 characters long and contain uppercase, lowercase, numbers, and special characters"
            >
              <input 
                class="demo-input"
                type="password" 
                placeholder="Enter password"
              />
            </ui-form-field>
          </div>
        </div>
      </section>
      
      <!-- Reactive Form Integration -->
      <section class="demo-section">
        <h3>Reactive Form Integration</h3>
        <div class="demo-item">
          <h4>Form with Validation</h4>
          <p>Form fields with Angular reactive form validation.</p>
          
          <form [formGroup]="validationForm" class="form-demo">
            <!-- Required Field -->
            <ui-form-field 
              label="Full Name"
              [required]="true"
              helperText="Enter your full name"
              [validationMessages]="validationMessages"
            >
              <input 
                class="demo-input"
                type="text" 
                placeholder="John Doe"
                formControlName="name"
                [class.demo-input--error]="isFieldInvalid('name')"
                [class.demo-input--success]="isFieldValid('name')"
              />
            </ui-form-field>
            
            <!-- Email with validation -->
            <ui-form-field 
              label="Email Address"
              [required]="true"
              helperText="We'll never share your email"
              [validationMessages]="validationMessages"
            >
              <input 
                class="demo-input"
                type="email" 
                placeholder="john@example.com"
                formControlName="email"
                [class.demo-input--error]="isFieldInvalid('email')"
                [class.demo-input--success]="isFieldValid('email')"
              />
            </ui-form-field>
            
            <!-- Password with length validation -->
            <ui-form-field 
              label="Password"
              [required]="true"
              helperText="Must be at least 8 characters"
              [validationMessages]="validationMessages"
              [showCharacterCount]="true"
              [maxLength]="50"
              [currentLength]="getFieldValue('password')?.length || 0"
            >
              <input 
                class="demo-input"
                type="password" 
                placeholder="Enter password"
                formControlName="password"
                [class.demo-input--error]="isFieldInvalid('password')"
                [class.demo-input--success]="isFieldValid('password')"
              />
            </ui-form-field>
            
            <!-- Age with number validation -->
            <ui-form-field 
              label="Age"
              [showOptional]="true"
              helperText="Must be between 18 and 100"
              [validationMessages]="validationMessages"
            >
              <input 
                class="demo-input"
                type="number" 
                placeholder="25"
                formControlName="age"
                [class.demo-input--error]="isFieldInvalid('age')"
                [class.demo-input--success]="isFieldValid('age')"
              />
            </ui-form-field>
            
            <!-- Website with URL validation -->
            <ui-form-field 
              label="Website"
              [showOptional]="true"
              helperText="Enter a valid URL"
              hintText="Include http:// or https://"
              [validationMessages]="validationMessages"
            >
              <input 
                class="demo-input"
                type="url" 
                placeholder="https://example.com"
                formControlName="website"
                [class.demo-input--error]="isFieldInvalid('website')"
                [class.demo-input--success]="isFieldValid('website')"
              />
            </ui-form-field>
            
            <!-- Bio with custom validation -->
            <ui-form-field 
              label="Bio"
              [showOptional]="true"
              helperText="Tell us about yourself"
              [showCharacterCount]="true"
              [maxLength]="200"
              [currentLength]="getFieldValue('bio')?.length || 0"
              [validationMessages]="validationMessages"
            >
              <textarea 
                class="demo-textarea"
                placeholder="Write a short bio..."
                formControlName="bio"
                [class.demo-input--error]="isFieldInvalid('bio')"
                [class.demo-input--success]="isFieldValid('bio')"
                maxlength="200"
              ></textarea>
            </ui-form-field>
          </form>
          
          <div class="demo-actions">
            <button 
              type="button" 
              class="demo-button"
              (click)="markAllTouched()"
            >
              Validate All
            </button>
            <button 
              type="button" 
              class="demo-button demo-button--secondary"
              (click)="resetValidationForm()"
            >
              Reset Form
            </button>
            <button 
              type="button" 
              class="demo-button demo-button--secondary"
              (click)="fillSampleData()"
            >
              Fill Sample Data
            </button>
          </div>
          
          <div class="form-status">
            <div><strong>Form Status:</strong> {{ validationForm.status }}</div>
            <div><strong>Form Valid:</strong> {{ validationForm.valid }}</div>
            <div><strong>Form Touched:</strong> {{ validationForm.touched }}</div>
            <div><strong>Form Dirty:</strong> {{ validationForm.dirty }}</div>
          </div>
        </div>
      </section>
      
      <!-- Code Example -->
      <section class="demo-section">
        <h3>Usage Example</h3>
        <div class="code-demo">
          <pre><code>{{ codeExample }}</code></pre>
        </div>
      </section>
    </div>
  `,
  styleUrl: './form-field-demo.component.scss'
})
export class FormFieldDemoComponent implements OnInit {
  sizes = ['sm', 'md', 'lg'] as const;
  characterCountText = '';
  
  validationForm = new FormGroup({
    name: new FormControl('', [Validators.required, Validators.minLength(2)]),
    email: new FormControl('', [Validators.required, Validators.email]),
    password: new FormControl('', [Validators.required, Validators.minLength(8)]),
    age: new FormControl('', [Validators.min(18), Validators.max(100)]),
    website: new FormControl('', [this.urlValidator]),
    bio: new FormControl('', [Validators.maxLength(200)])
  });
  
  validationMessages = {
    required: 'This field is required',
    email: 'Please enter a valid email address',
    minlength: 'This field is too short',
    maxlength: 'This field is too long',
    min: 'Value is too low',
    max: 'Value is too high',
    url: 'Please enter a valid URL',
    custom: 'Custom validation error'
  };
  
  readonly codeExample = `import { FormFieldComponent } from '../../../../../ui-essentials/src/lib/components/forms/form-field/form-field.component';

// Basic usage
<ui-form-field 
  label="Email Address"
  helperText="We'll never share your email"
  [required]="true"
>
  <input type="email" formControlName="email" />
</ui-form-field>

// With validation messages
<ui-form-field 
  label="Password"
  [required]="true"
  helperText="Must be at least 8 characters"
  [validationMessages]="validationMessages"
  [showCharacterCount]="true"
  [maxLength]="50"
>
  <input type="password" formControlName="password" />
</ui-form-field>

// Horizontal layout
<ui-form-field 
  label="Settings"
  layout="horizontal"
  helperText="Choose your preferences"
>
  <div class="checkbox-group">
    <input type="checkbox" id="option1" />
    <label for="option1">Option 1</label>
  </div>
</ui-form-field>

// Custom states
<ui-form-field 
  label="Status Field"
  state="success"
  successMessage="Data saved successfully"
>
  <input type="text" readonly value="Saved" />
</ui-form-field>`;

  ngOnInit(): void {
    // Watch form changes for demo purposes
    this.validationForm.valueChanges.subscribe(() => {
      // Update demo display if needed
    });
  }

  updateCharacterCount(event: Event): void {
    const input = event.target as HTMLInputElement;
    this.characterCountText = input.value;
  }

  isFieldInvalid(fieldName: string): boolean {
    const field = this.validationForm.get(fieldName);
    return field ? field.invalid && (field.dirty || field.touched) : false;
  }

  isFieldValid(fieldName: string): boolean {
    const field = this.validationForm.get(fieldName);
    return field ? field.valid && field.value && (field.dirty || field.touched) : false;
  }

  getFieldValue(fieldName: string): any {
    return this.validationForm.get(fieldName)?.value;
  }

  markAllTouched(): void {
    this.validationForm.markAllAsTouched();
  }

  resetValidationForm(): void {
    this.validationForm.reset();
    Object.keys(this.validationForm.controls).forEach(key => {
      this.validationForm.get(key)?.setErrors(null);
    });
  }

  fillSampleData(): void {
    this.validationForm.patchValue({
      name: 'John Doe',
      email: 'john.doe@example.com',
      password: 'SecurePass123!',
      age: "30",
      website: 'https://johndoe.com',
      bio: 'Software developer with 10 years of experience in web development.'
    });
    this.validationForm.markAllAsTouched();
  }

  // Custom URL validator
  private urlValidator(control: AbstractControl): ValidationErrors | null {
    if (!control.value) return null;
    
    try {
      new URL(control.value);
      return null;
    } catch {
      return { url: true };
    }
  }
}Axqr.#e<xK3uSSJ2s7 xe3import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { GalleryGridComponent, GalleryGridItem } from 'ui-essentials';

@Component({
  selector: 'ui-gallery-grid-demo',
  standalone: true,
  imports: [CommonModule, GalleryGridComponent],
  template: `
    <div class="demo-container">
      <h2>Gallery Grid Demo</h2>
      <p>A responsive media grid with lightbox functionality for organizing and displaying images.</p>
      
      <!-- Column Variants -->
      <section class="demo-section">
        <h3>Column Variants</h3>
        <div class="demo-grid">
          @for (columnCount of columnVariants; track columnCount) {
            <div class="demo-item">
              <h4>{{ columnCount }} Columns</h4>
              <ui-gallery-grid 
                [items]="sampleItems.slice(0, 6)"
                [columns]="columnCount">
              </ui-gallery-grid>
            </div>
          }
        </div>
      </section>
      
      <!-- Gap Size Variants -->
      <section class="demo-section">
        <h3>Gap Sizes</h3>
        <div class="demo-grid">
          @for (gap of gapSizes; track gap) {
            <div class="demo-item">
              <h4>{{ gap | titlecase }} Gap</h4>
              <ui-gallery-grid 
                [items]="sampleItems.slice(0, 6)"
                [columns]="3"
                [gap]="gap">
              </ui-gallery-grid>
            </div>
          }
        </div>
      </section>
      
      <!-- Object Fit Variants -->
      <section class="demo-section">
        <h3>Object Fit Options</h3>
        <div class="demo-grid">
          @for (fit of objectFitOptions; track fit) {
            <div class="demo-item">
              <h4>{{ fit | titlecase }} Fit</h4>
              <ui-gallery-grid 
                [items]="landscapeItems"
                [columns]="3"
                [objectFit]="fit">
              </ui-gallery-grid>
            </div>
          }
        </div>
      </section>
      
      <!-- Auto-fit Responsive -->
      <section class="demo-section">
        <h3>Auto-fit Responsive</h3>
        <p>Automatically adjusts columns based on available space (resize window to see effect):</p>
        <ui-gallery-grid 
          [items]="sampleItems"
          columns="auto-fit"
          [gap]="'md'">
        </ui-gallery-grid>
      </section>
      
      <!-- Masonry Layout -->
      <section class="demo-section">
        <h3>Masonry Layout</h3>
        <p>Items align to top with varying heights:</p>
        <ui-gallery-grid 
          [items]="masonryItems"
          [columns]="4"
          [masonry]="true"
          [gap]="'sm'">
        </ui-gallery-grid>
      </section>
      
      <!-- Interactive Features -->
      <section class="demo-section">
        <h3>Interactive Features</h3>
        
        <div class="demo-controls">
          <button (click)="toggleOverlay()" [class.active]="showOverlay">
            {{ showOverlay ? 'Hide' : 'Show' }} Overlay
          </button>
          <button (click)="toggleZoomIndicator()" [class.active]="showZoomIndicator">
            {{ showZoomIndicator ? 'Hide' : 'Show' }} Zoom Indicator
          </button>
          <button (click)="toggleSelection()" [class.active]="selectionEnabled">
            {{ selectionEnabled ? 'Disable' : 'Enable' }} Selection
          </button>
          <button (click)="selectAll()" [disabled]="!selectionEnabled">
            Select All
          </button>
          <button (click)="deselectAll()" [disabled]="!selectionEnabled">
            Deselect All
          </button>
        </div>
        
        <ui-gallery-grid 
          [items]="interactiveItems"
          [columns]="4"
          [showOverlay]="showOverlay"
          [showZoomIndicator]="showZoomIndicator"
          (itemClick)="handleItemClick($event)"
          (itemSelect)="handleItemSelect($event)"
          (imageLoad)="handleImageLoad($event)"
          (imageError)="handleImageError($event)">
        </ui-gallery-grid>
        
        @if (selectedItems.length > 0) {
          <div class="selection-info">
            <p>Selected Items: {{ selectedItems.length }}</p>
            <ul>
              @for (item of selectedItems; track item.id) {
                <li>{{ item.title || item.alt || 'Item ' + item.id }}</li>
              }
            </ul>
          </div>
        }
      </section>
      
      <!-- Empty State -->
      <section class="demo-section">
        <h3>Empty State</h3>
        <ui-gallery-grid 
          [items]="[]"
          [columns]="3"
          emptyText="No photos in this album yet">
        </ui-gallery-grid>
      </section>
      
      <!-- Loading State -->
      <section class="demo-section">
        <h3>Loading State</h3>
        <ui-gallery-grid 
          [items]="loadingItems"
          [columns]="3">
        </ui-gallery-grid>
      </section>
      
      <!-- Event Log -->
      <section class="demo-section">
        <h3>Event Log</h3>
        <div class="event-log">
          <div class="event-controls">
            <button (click)="clearEventLog()">Clear Log</button>
          </div>
          <div class="event-list">
            @if (eventLog.length === 0) {
              <p class="no-events">No events yet. Interact with the gallery above to see events.</p>
            } @else {
              @for (event of eventLog; track event.id) {
                <div class="event-item">
                  <span class="event-type">{{ event.type }}</span>
                  <span class="event-details">{{ event.details }}</span>
                  <span class="event-time">{{ event.timestamp | date:'HH:mm:ss' }}</span>
                </div>
              }
            }
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './gallery-grid-demo.component.scss'
})
export class GalleryGridDemoComponent {
  columnVariants = [2, 3, 4] as const;
  gapSizes = ['sm', 'md', 'lg'] as const;
  objectFitOptions = ['cover', 'contain', 'fill'] as const;
  
  showOverlay = true;
  showZoomIndicator = true;
  selectionEnabled = false;
  selectedItems: GalleryGridItem[] = [];
  eventLog: Array<{id: number; type: string; details: string; timestamp: Date}> = [];
  
  sampleItems: GalleryGridItem[] = [
    {
      id: 1,
      src: 'https://picsum.photos/400/300?random=1',
      thumbnail: 'https://picsum.photos/200/150?random=1',
      alt: 'Sample image 1',
      title: 'Mountain Landscape',
      caption: 'Beautiful mountain vista at sunset'
    },
    {
      id: 2,
      src: 'https://picsum.photos/400/300?random=2',
      thumbnail: 'https://picsum.photos/200/150?random=2',
      alt: 'Sample image 2',
      title: 'Ocean Waves',
      caption: 'Crashing waves on a sandy beach'
    },
    {
      id: 3,
      src: 'https://picsum.photos/400/300?random=3',
      thumbnail: 'https://picsum.photos/200/150?random=3',
      alt: 'Sample image 3',
      title: 'Forest Path',
      caption: 'Winding trail through dense woods'
    },
    {
      id: 4,
      src: 'https://picsum.photos/400/300?random=4',
      thumbnail: 'https://picsum.photos/200/150?random=4',
      alt: 'Sample image 4',
      title: 'City Skyline',
      caption: 'Urban architecture at night'
    },
    {
      id: 5,
      src: 'https://picsum.photos/400/300?random=5',
      thumbnail: 'https://picsum.photos/200/150?random=5',
      alt: 'Sample image 5',
      title: 'Desert Dunes',
      caption: 'Rolling sand dunes in morning light'
    },
    {
      id: 6,
      src: 'https://picsum.photos/400/300?random=6',
      thumbnail: 'https://picsum.photos/200/150?random=6',
      alt: 'Sample image 6',
      title: 'Lake Reflection',
      caption: 'Mirror-like water surface'
    },
    {
      id: 7,
      src: 'https://picsum.photos/400/300?random=7',
      thumbnail: 'https://picsum.photos/200/150?random=7',
      alt: 'Sample image 7',
      title: 'Flower Field',
      caption: 'Colorful wildflowers in bloom'
    },
    {
      id: 8,
      src: 'https://picsum.photos/400/300?random=8',
      thumbnail: 'https://picsum.photos/200/150?random=8',
      alt: 'Sample image 8',
      title: 'Snow Peaks',
      caption: 'Snow-capped mountain range'
    }
  ];
  
  landscapeItems: GalleryGridItem[] = [
    {
      id: 'l1',
      src: 'https://picsum.photos/800/400?random=11',
      thumbnail: 'https://picsum.photos/200/100?random=11',
      alt: 'Landscape image 1',
      title: 'Wide Landscape',
      caption: 'Panoramic view'
    },
    {
      id: 'l2',
      src: 'https://picsum.photos/800/400?random=12',
      thumbnail: 'https://picsum.photos/200/100?random=12',
      alt: 'Landscape image 2',
      title: 'River Valley',
      caption: 'Flowing water through hills'
    },
    {
      id: 'l3',
      src: 'https://picsum.photos/800/400?random=13',
      thumbnail: 'https://picsum.photos/200/100?random=13',
      alt: 'Landscape image 3',
      title: 'Coastal View',
      caption: 'Rocky coastline'
    }
  ];
  
  masonryItems: GalleryGridItem[] = [
    {
      id: 'm1',
      src: 'https://picsum.photos/300/400?random=21',
      thumbnail: 'https://picsum.photos/150/200?random=21',
      alt: 'Tall image 1',
      title: 'Portrait 1'
    },
    {
      id: 'm2',
      src: 'https://picsum.photos/300/200?random=22',
      thumbnail: 'https://picsum.photos/150/100?random=22',
      alt: 'Wide image 1',
      title: 'Landscape 1'
    },
    {
      id: 'm3',
      src: 'https://picsum.photos/300/500?random=23',
      thumbnail: 'https://picsum.photos/150/250?random=23',
      alt: 'Very tall image',
      title: 'Portrait 2'
    },
    {
      id: 'm4',
      src: 'https://picsum.photos/300/300?random=24',
      thumbnail: 'https://picsum.photos/150/150?random=24',
      alt: 'Square image',
      title: 'Square 1'
    },
    {
      id: 'm5',
      src: 'https://picsum.photos/300/350?random=25',
      thumbnail: 'https://picsum.photos/150/175?random=25',
      alt: 'Tall image 2',
      title: 'Portrait 3'
    },
    {
      id: 'm6',
      src: 'https://picsum.photos/300/250?random=26',
      thumbnail: 'https://picsum.photos/150/125?random=26',
      alt: 'Medium image',
      title: 'Landscape 2'
    }
  ];
  
  interactiveItems: GalleryGridItem[] = this.sampleItems.slice(0, 8).map(item => ({
    ...item,
    selected: false
  }));
  
  loadingItems: GalleryGridItem[] = [
    {
      id: 'loading1',
      src: 'https://picsum.photos/400/300?random=31',
      thumbnail: 'https://picsum.photos/200/150?random=31',
      alt: 'Loading image 1',
      title: 'Loading Item 1',
      loading: true
    },
    {
      id: 'loading2',
      src: 'https://picsum.photos/400/300?random=32',
      thumbnail: 'https://picsum.photos/200/150?random=32',
      alt: 'Loading image 2',
      title: 'Loading Item 2',
      loading: true
    },
    {
      id: 'loading3',
      src: 'https://picsum.photos/400/300?random=33',
      thumbnail: 'https://picsum.photos/200/150?random=33',
      alt: 'Loading image 3',
      title: 'Loaded Item',
      loading: false
    }
  ];
  
  private eventCounter = 0;

  toggleOverlay(): void {
    this.showOverlay = !this.showOverlay;
  }
  
  toggleZoomIndicator(): void {
    this.showZoomIndicator = !this.showZoomIndicator;
  }
  
  toggleSelection(): void {
    this.selectionEnabled = !this.selectionEnabled;
    if (!this.selectionEnabled) {
      this.deselectAll();
    }
  }
  
  selectAll(): void {
    this.interactiveItems.forEach(item => item.selected = true);
    this.updateSelectedItems();
  }
  
  deselectAll(): void {
    this.interactiveItems.forEach(item => item.selected = false);
    this.updateSelectedItems();
  }
  
  handleItemClick(event: { item: GalleryGridItem; event: MouseEvent }): void {
    this.addEvent('Item Click', `Clicked item: ${event.item.title || event.item.id}`);
    
    if (this.selectionEnabled) {
      event.item.selected = !event.item.selected;
      this.updateSelectedItems();
      this.addEvent('Item Selection', `${event.item.selected ? 'Selected' : 'Deselected'} item: ${event.item.title || event.item.id}`);
    }
  }
  
  handleItemSelect(item: GalleryGridItem): void {
    this.updateSelectedItems();
    this.addEvent('Item Select', `Selected item: ${item.title || item.id}`);
  }
  
  handleImageLoad(event: { item: GalleryGridItem; event: Event }): void {
    this.addEvent('Image Load', `Loaded image: ${event.item.title || event.item.id}`);
  }
  
  handleImageError(event: { item: GalleryGridItem; event: Event }): void {
    this.addEvent('Image Error', `Failed to load image: ${event.item.title || event.item.id}`);
  }
  
  clearEventLog(): void {
    this.eventLog = [];
  }
  
  private updateSelectedItems(): void {
    this.selectedItems = this.interactiveItems.filter(item => item.selected);
  }
  
  private addEvent(type: string, details: string): void {
    this.eventLog.unshift({
      id: ++this.eventCounter,
      type,
      details,
      timestamp: new Date()
    });
    
    // Keep only the last 20 events
    if (this.eventLog.length > 20) {
      this.eventLog = this.eventLog.slice(0, 20);
    }
  }
}f񓸭x*'import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { GridContainerComponent } from 'ui-essentials';

@Component({
  selector: 'ui-grid-container-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, GridContainerComponent],
  template: `
    <div class="demo-container">
      <h2>GridContainer Demo</h2>
      <p class="demo-description">
        Advanced CSS Grid wrapper with template areas support, responsive column/row definitions, and auto-placement algorithms.
      </p>
      
      <!-- Basic Grid Examples -->
      <section class="demo-section">
        <h3>Basic Grid Layouts</h3>
        
        <div class="demo-example">
          <h4>Auto-fit Grid (Responsive)</h4>
          <ui-grid-container columns="auto-fit" gap="md">
            @for (item of basicItems; track item.id) {
              <div class="demo-grid-item demo-grid-item--primary">{{ item.label }}</div>
            }
          </ui-grid-container>
        </div>
        
        <div class="demo-example">
          <h4>Fixed 3-Column Grid</h4>
          <ui-grid-container [columns]="3" gap="lg">
            @for (item of basicItems; track item.id) {
              <div class="demo-grid-item demo-grid-item--secondary">{{ item.label }}</div>
            }
          </ui-grid-container>
        </div>
      </section>
      
      <!-- Gap Variants -->
      <section class="demo-section">
        <h3>Gap Sizes</h3>
        <div class="demo-row">
          @for (gap of gaps; track gap) {
            <div class="demo-example">
              <h4>{{ gap }} Gap</h4>
              <ui-grid-container [columns]="3" [gap]="gap">
                @for (item of shortItems; track item.id) {
                  <div class="demo-grid-item demo-grid-item--success">{{ item.label }}</div>
                }
              </ui-grid-container>
            </div>
          }
        </div>
      </section>
      
      <!-- Column Variants -->
      <section class="demo-section">
        <h3>Column Layouts</h3>
        @for (colCount of columnCounts; track colCount) {
          <div class="demo-example">
            <h4>{{ colCount }} Columns</h4>
            <ui-grid-container [columns]="colCount" gap="md">
              @for (item of getItemsForColumns(colCount); track item.id) {
                <div class="demo-grid-item demo-grid-item--info">{{ item.label }}</div>
              }
            </ui-grid-container>
          </div>
        }
      </section>
      
      <!-- Auto Grid Types -->
      <section class="demo-section">
        <h3>Auto Grid Types</h3>
        
        <div class="demo-example">
          <h4>Auto-fit (Items stretch to fill space)</h4>
          <ui-grid-container columns="auto-fit" gap="md">
            @for (item of autoItems; track item.id) {
              <div class="demo-grid-item demo-grid-item--warning">{{ item.label }}</div>
            }
          </ui-grid-container>
        </div>
        
        <div class="demo-example">
          <h4>Auto-fill (Empty columns maintained)</h4>
          <ui-grid-container columns="auto-fill" gap="md">
            @for (item of autoItems; track item.id) {
              <div class="demo-grid-item demo-grid-item--danger">{{ item.label }}</div>
            }
          </ui-grid-container>
        </div>
      </section>
      
      <!-- Advanced Features -->
      <section class="demo-section">
        <h3>Advanced Features</h3>
        
        <div class="demo-example">
          <h4>Dense Grid (Auto-placement fills gaps)</h4>
          <ui-grid-container [columns]="4" gap="md" [dense]="true">
            <div class="demo-grid-item demo-grid-item--primary ui-grid-item--span-2">Wide Item (2 cols)</div>
            <div class="demo-grid-item demo-grid-item--secondary">Item 1</div>
            <div class="demo-grid-item demo-grid-item--success ui-grid-item--row-span-2">Tall Item</div>
            <div class="demo-grid-item demo-grid-item--info">Item 2</div>
            <div class="demo-grid-item demo-grid-item--warning">Item 3</div>
            <div class="demo-grid-item demo-grid-item--danger ui-grid-item--span-3">Extra Wide (3 cols)</div>
            <div class="demo-grid-item demo-grid-item--primary">Item 4</div>
            <div class="demo-grid-item demo-grid-item--secondary">Item 5</div>
          </ui-grid-container>
        </div>
        
        <div class="demo-example">
          <h4>Grid with Template Areas</h4>
          <ui-grid-container 
            customColumns="1fr 2fr 1fr"
            customRows="auto auto 1fr auto"
            templateAreas="'header header header' 'sidebar main aside' 'sidebar main aside' 'footer footer footer'"
            gap="md"
            padding="lg">
            <div class="demo-grid-item demo-grid-item--primary" style="grid-area: header;">Header</div>
            <div class="demo-grid-item demo-grid-item--secondary" style="grid-area: sidebar;">Sidebar</div>
            <div class="demo-grid-item demo-grid-item--info" style="grid-area: main;">Main Content</div>
            <div class="demo-grid-item demo-grid-item--success" style="grid-area: aside;">Aside</div>
            <div class="demo-grid-item demo-grid-item--warning" style="grid-area: footer;">Footer</div>
          </ui-grid-container>
        </div>
      </section>
      
      <!-- Alignment Options -->
      <section class="demo-section">
        <h3>Alignment Options</h3>
        
        <div class="demo-example">
          <h4>Justify Content: Center</h4>
          <ui-grid-container [columns]="2" gap="md" justifyContent="center" style="height: 200px;">
            <div class="demo-grid-item demo-grid-item--primary">Item 1</div>
            <div class="demo-grid-item demo-grid-item--secondary">Item 2</div>
          </ui-grid-container>
        </div>
        
        <div class="demo-example">
          <h4>Align Items: Center</h4>
          <ui-grid-container [columns]="3" gap="md" alignItems="center" style="height: 150px;">
            <div class="demo-grid-item demo-grid-item--success">Centered</div>
            <div class="demo-grid-item demo-grid-item--info">Items</div>
            <div class="demo-grid-item demo-grid-item--warning">Vertically</div>
          </ui-grid-container>
        </div>
      </section>
      
      <!-- Row Modes -->
      <section class="demo-section">
        <h3>Row Modes</h3>
        @for (rowMode of rowModes; track rowMode) {
          <div class="demo-example">
            <h4>{{ rowMode }} Rows</h4>
            <ui-grid-container [columns]="3" gap="md" [rowMode]="rowMode" style="height: 200px;">
              <div class="demo-grid-item demo-grid-item--primary">
                @if (rowMode === 'min-content') {
                  Short
                } @else if (rowMode === 'max-content') {
                  This is longer content to demonstrate max-content behavior
                } @else {
                  Content for {{ rowMode }}
                }
              </div>
              <div class="demo-grid-item demo-grid-item--secondary">Item 2</div>
              <div class="demo-grid-item demo-grid-item--success">Item 3</div>
            </ui-grid-container>
          </div>
        }
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Grid Builder</h3>
        
        <div class="demo-controls">
          <div class="demo-control-group">
            <label>Columns:</label>
            <select [(ngModel)]="interactiveConfig.columns">
              @for (col of allColumns; track col) {
                <option [value]="col">{{ col }}</option>
              }
            </select>
          </div>
          
          <div class="demo-control-group">
            <label>Gap:</label>
            <select [(ngModel)]="interactiveConfig.gap">
              @for (gap of gaps; track gap) {
                <option [value]="gap">{{ gap }}</option>
              }
            </select>
          </div>
          
          <div class="demo-control-group">
            <label>Dense:</label>
            <input type="checkbox" [(ngModel)]="interactiveConfig.dense">
          </div>
        </div>
        
        <ui-grid-container 
          [columns]="interactiveConfig.columns"
          [gap]="interactiveConfig.gap"
          [dense]="interactiveConfig.dense"
          style="border: 2px dashed #ccc; min-height: 200px;">
          @for (item of interactiveItems; track item.id) {
            <div 
              class="demo-grid-item"
              [class]="'demo-grid-item--' + item.variant"
              [class.ui-grid-item--span-2]="item.span === 2"
              [class.ui-grid-item--span-3]="item.span === 3"
              [class.ui-grid-item--row-span-2]="item.rowSpan === 2">
              {{ item.label }}
              @if (item.span > 1) {
                <small>({{ item.span }} cols)</small>
              }
              @if (item.rowSpan > 1) {
                <small>({{ item.rowSpan }} rows)</small>
              }
            </div>
          }
        </ui-grid-container>
      </section>
    </div>
  `,
  styleUrl: './grid-container-demo.component.scss'
})
export class GridContainerDemoComponent {
  gaps = ['sm', 'md', 'lg'] as const;
  columnCounts = [1, 2, 3, 4, 5, 6] as const;
  allColumns = [1, 2, 3, 4, 5, 6, 'auto-fit', 'auto-fill'] as const;
  rowModes = ['auto', 'equal', 'min-content', 'max-content'] as const;
  
  basicItems = [
    { id: 1, label: 'Item 1' },
    { id: 2, label: 'Item 2' },
    { id: 3, label: 'Item 3' },
    { id: 4, label: 'Item 4' },
    { id: 5, label: 'Item 5' },
    { id: 6, label: 'Item 6' },
    { id: 7, label: 'Item 7' },
    { id: 8, label: 'Item 8' }
  ];
  
  shortItems = [
    { id: 1, label: 'A' },
    { id: 2, label: 'B' },
    { id: 3, label: 'C' }
  ];
  
  autoItems = [
    { id: 1, label: 'Auto Item 1' },
    { id: 2, label: 'Auto Item 2' },
    { id: 3, label: 'Auto Item 3' },
    { id: 4, label: 'Auto Item 4' }
  ];
  
  interactiveConfig = {
    columns: 'auto-fit' as const,
    gap: 'md' as const,
    dense: false
  };
  
  interactiveItems = [
    { id: 1, label: 'Regular', variant: 'primary', span: 1, rowSpan: 1 },
    { id: 2, label: 'Wide', variant: 'secondary', span: 2, rowSpan: 1 },
    { id: 3, label: 'Tall', variant: 'success', span: 1, rowSpan: 2 },
    { id: 4, label: 'Extra Wide', variant: 'info', span: 3, rowSpan: 1 },
    { id: 5, label: 'Normal', variant: 'warning', span: 1, rowSpan: 1 },
    { id: 6, label: 'Regular', variant: 'danger', span: 1, rowSpan: 1 },
    { id: 7, label: 'Wide', variant: 'primary', span: 2, rowSpan: 1 },
    { id: 8, label: 'Normal', variant: 'secondary', span: 1, rowSpan: 1 }
  ];
  
  getItemsForColumns(colCount: number) {
    const count = Math.min(colCount * 2, this.basicItems.length);
    return this.basicItems.slice(0, count);
  }
}]jxW@use '../../../../../ui-design-system/src/styles/semantic' as tokens;

.demo-container {
  padding: tokens.$semantic-spacing-layout-md;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: tokens.$semantic-spacing-layout-lg;
  
  h3 {
    margin-bottom: tokens.$semantic-spacing-component-md;
    color: tokens.$semantic-color-text-primary;
    font-size: 1.25rem;
    font-weight: 600;
  }
  
  h4 {
    margin-bottom: tokens.$semantic-spacing-component-sm;
    color: tokens.$semantic-color-text-secondary;
    font-size: 1.125rem;
    font-weight: 500;
  }
  
  p {
    color: tokens.$semantic-color-text-secondary;
    margin-bottom: tokens.$semantic-spacing-component-md;
  }
}

.demo-row {
  display: flex;
  flex-wrap: wrap;
  gap: tokens.$semantic-spacing-layout-md;
}

.demo-grid-container {
  flex: 1;
  min-width: 300px;
  margin-bottom: tokens.$semantic-spacing-layout-sm;
}

.demo-grid {
  border: 2px dashed tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-md;
  padding: tokens.$semantic-spacing-component-md;
  
  &--fixed-height {
    min-height: 200px;
  }
}

.demo-grid-item {
  background: tokens.$semantic-color-container-primary;
  color: tokens.$semantic-color-on-container-primary;
  padding: tokens.$semantic-spacing-component-sm;
  border-radius: tokens.$semantic-border-radius-sm;
  text-align: center;
  font-weight: 500;
  min-height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
  
  &--small {
    width: 80px;
    height: 40px;
    min-height: auto;
  }
}

@media (max-width: 768px) {
  .demo-row {
    flex-direction: column;
  }
  
  .demo-grid-container {
    min-width: auto;
  }
}SP25x[w(gqFbQjniFf6 I[x%import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { GridSystemComponent } from '../../../../../ui-essentials/src/lib/components/layout/grid-system/grid-system.component';

@Component({
  selector: 'ui-grid-system-demo',
  standalone: true,
  imports: [CommonModule, GridSystemComponent],
  template: `
    <div class="demo-container">
      <h2>Grid System Demo</h2>
      
      <!-- Column Variants -->
      <section class="demo-section">
        <h3>Column Variants</h3>
        <div class="demo-row">
          @for (cols of columnVariants; track cols) {
            <div class="demo-grid-container">
              <h4>{{ cols }} Columns</h4>
              <ui-grid-system [columns]="cols" class="demo-grid">
                @for (item of getItems(getItemCount(cols)); track $index) {
                  <div class="demo-grid-item">{{ $index + 1 }}</div>
                }
              </ui-grid-system>
            </div>
          }
        </div>
      </section>
      
      <!-- Gap Variants -->
      <section class="demo-section">
        <h3>Gap Sizes</h3>
        <div class="demo-row">
          @for (gap of gapSizes; track gap) {
            <div class="demo-grid-container">
              <h4>Gap: {{ gap }}</h4>
              <ui-grid-system [columns]="3" [gap]="gap" class="demo-grid">
                @for (item of getItems(6); track $index) {
                  <div class="demo-grid-item">{{ $index + 1 }}</div>
                }
              </ui-grid-system>
            </div>
          }
        </div>
      </section>
      
      <!-- Auto-fit and Auto-fill -->
      <section class="demo-section">
        <h3>Auto Layout</h3>
        <div class="demo-grid-container">
          <h4>Auto-fit (items stretch to fill)</h4>
          <ui-grid-system columns="auto-fit" class="demo-grid">
            @for (item of getItems(4); track $index) {
              <div class="demo-grid-item">Auto-fit {{ $index + 1 }}</div>
            }
          </ui-grid-system>
        </div>
        <div class="demo-grid-container">
          <h4>Auto-fill (creates empty columns)</h4>
          <ui-grid-system columns="auto-fill" class="demo-grid">
            @for (item of getItems(4); track $index) {
              <div class="demo-grid-item">Auto-fill {{ $index + 1 }}</div>
            }
          </ui-grid-system>
        </div>
      </section>
      
      <!-- Alignment -->
      <section class="demo-section">
        <h3>Alignment Options</h3>
        <div class="demo-row">
          <div class="demo-grid-container">
            <h4>Justify Items: Center</h4>
            <ui-grid-system [columns]="3" justifyItems="center" class="demo-grid demo-grid--fixed-height">
              @for (item of getItems(6); track $index) {
                <div class="demo-grid-item demo-grid-item--small">{{ $index + 1 }}</div>
              }
            </ui-grid-system>
          </div>
          <div class="demo-grid-container">
            <h4>Align Items: Center</h4>
            <ui-grid-system [columns]="3" alignItems="center" class="demo-grid demo-grid--fixed-height">
              @for (item of getItems(6); track $index) {
                <div class="demo-grid-item demo-grid-item--small">{{ $index + 1 }}</div>
              }
            </ui-grid-system>
          </div>
        </div>
      </section>
      
      <!-- Custom Grid -->
      <section class="demo-section">
        <h3>Custom Grid Template</h3>
        <div class="demo-grid-container">
          <h4>Custom Columns: 200px 1fr 100px</h4>
          <ui-grid-system customColumns="200px 1fr 100px" class="demo-grid">
            <div class="demo-grid-item">Fixed 200px</div>
            <div class="demo-grid-item">Flexible 1fr</div>
            <div class="demo-grid-item">Fixed 100px</div>
          </ui-grid-system>
        </div>
      </section>
      
      <!-- Responsive Grid -->
      <section class="demo-section">
        <h3>Responsive Grid</h3>
        <p>Resize the window to see responsive behavior</p>
        <ui-grid-system [columns]="12" [responsive]="true" class="demo-grid">
          @for (item of getItems(24); track $index) {
            <div class="demo-grid-item">{{ $index + 1 }}</div>
          }
        </ui-grid-system>
      </section>
    </div>
  `,
  styleUrl: './grid-system-demo.component.scss'
})
export class GridSystemDemoComponent {
  columnVariants: (1 | 2 | 3 | 4 | 6 | 12)[] = [1, 2, 3, 4, 6, 12];
  gapSizes: ('xs' | 'sm' | 'md' | 'lg' | 'xl')[] = ['xs', 'sm', 'md', 'lg', 'xl'];
  
  getItems(count: number): number[] {
    return Array.from({ length: count }, (_, i) => i + 1);
  }
  
  getItemCount(cols: number | string): number {
    if (typeof cols === 'number') {
      return Math.min(cols * 2, 12);
    }
    return 6;
  }
}f0jhxCu¶7  x "zf=LxIm]h()
x <p>hcl-studio-demo works!</p>
n
Sx*P/**
 * HCL Studio Demo Styles
 * Showcases dynamic theming using CSS custom properties
 */

.hcl-studio-demo {
  padding: 2rem;
  background: var(--color-surface);
  color: var(--color-on-surface);
  min-height: 100vh;
  transition: background-color 0.3s ease, color 0.3s ease;
}

// ==========================================================================
// HEADER STYLES
// ==========================================================================

.demo-header {
  text-align: center;
  margin-bottom: 3rem;
  padding: 2rem;
  background: var(--color-surface-container);
  border-radius: 1rem;
  
  h1 {
    margin: 0 0 0.5rem 0;
    color: var(--color-primary);
    font-size: 2.5rem;
    font-weight: 600;
  }
  
  p {
    margin: 0;
    color: var(--color-on-surface-variant);
    font-size: 1.2rem;
  }
}

// ==========================================================================
// CURRENT THEME INFO
// ==========================================================================

.current-theme-info {
  margin-bottom: 2rem;
  padding: 1.5rem;
  background: var(--color-surface-high);
  border-radius: 0.5rem;
  border: 1px solid var(--color-outline-variant);
  
  h3 {
    margin: 0 0 1rem 0;
    color: var(--color-on-surface);
  }
  
  .color-swatches {
    display: flex;
    gap: 1rem;
    
    .swatch {
      flex: 1;
      padding: 1rem;
      border-radius: 0.5rem;
      text-align: center;
      color: white;
      font-weight: 600;
      text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      
      span {
        font-size: 0.9rem;
      }
    }
  }
}

// ==========================================================================
// MODE CONTROLS
// ==========================================================================

.mode-controls {
  margin-bottom: 2rem;
  text-align: center;
  
  .mode-toggle-btn {
    padding: 0.75rem 2rem;
    border: 2px solid var(--color-outline);
    border-radius: 2rem;
    background: var(--color-surface);
    color: var(--color-on-surface);
    font-size: 1rem;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.3s ease;
    
    &:hover {
      background: var(--color-surface-high);
      border-color: var(--color-primary);
    }
    
    &.dark {
      background: var(--color-primary);
      color: var(--color-on-primary);
      border-color: var(--color-primary);
    }
  }
}

// ==========================================================================
// THEMES SECTION
// ==========================================================================

.themes-section {
  margin-bottom: 3rem;
  
  h3 {
    margin: 0 0 1.5rem 0;
    color: var(--color-on-surface);
    font-size: 1.5rem;
  }
  
  .theme-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    gap: 1rem;
    
    .theme-card {
      padding: 1rem;
      background: var(--color-surface-container);
      border: 2px solid var(--color-outline-variant);
      border-radius: 0.75rem;
      cursor: pointer;
      transition: all 0.3s ease;
      
      &:hover {
        border-color: var(--color-primary);
        transform: translateY(-2px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
      }
      
      &.active {
        border-color: var(--color-primary);
        background: var(--color-primary-container);
        
        .theme-name {
          color: var(--color-on-primary-container);
          font-weight: 600;
        }
      }
      
      .theme-preview {
        display: flex;
        height: 40px;
        border-radius: 0.5rem;
        overflow: hidden;
        margin-bottom: 0.75rem;
        
        .color-strip {
          flex: 1;
        }
      }
      
      .theme-name {
        display: block;
        text-align: center;
        color: var(--color-on-surface);
        font-size: 0.9rem;
        font-weight: 500;
      }
    }
  }
}

// ==========================================================================
// CUSTOM THEME SECTION
// ==========================================================================

.custom-theme-section {
  margin-bottom: 3rem;
  padding: 2rem;
  background: var(--color-surface-high);
  border-radius: 1rem;
  border: 1px solid var(--color-outline-variant);
  
  h3 {
    margin: 0 0 1.5rem 0;
    color: var(--color-on-surface);
    font-size: 1.5rem;
  }
  
  .custom-inputs {
    display: grid;
    gap: 1.5rem;
    margin-bottom: 2rem;
    
    @media (min-width: 768px) {
      grid-template-columns: repeat(3, 1fr);
    }
    
    .color-input-group {
      label {
        display: block;
        margin-bottom: 0.5rem;
        color: var(--color-on-surface);
        font-weight: 600;
        font-size: 0.9rem;
      }
      
      input[type="color"] {
        width: 50px;
        height: 40px;
        border: 2px solid var(--color-outline);
        border-radius: 0.5rem;
        margin-right: 0.5rem;
        cursor: pointer;
      }
      
      input[type="text"] {
        flex: 1;
        padding: 0.75rem;
        border: 2px solid var(--color-outline);
        border-radius: 0.5rem;
        background: var(--color-surface);
        color: var(--color-on-surface);
        font-size: 1rem;
        
        &:focus {
          outline: none;
          border-color: var(--color-primary);
        }
      }
    }
  }
  
  .custom-actions {
    display: flex;
    gap: 1rem;
    margin-bottom: 2rem;
    
    button {
      padding: 0.75rem 1.5rem;
      border-radius: 0.5rem;
      font-size: 1rem;
      font-weight: 600;
      cursor: pointer;
      transition: all 0.3s ease;
      
      &.preview-btn {
        background: var(--color-secondary);
        color: var(--color-on-secondary);
        border: none;
        
        &:hover {
          opacity: 0.9;
          transform: translateY(-1px);
        }
      }
      
      &.apply-btn {
        background: var(--color-primary);
        color: var(--color-on-primary);
        border: none;
        
        &:hover {
          opacity: 0.9;
          transform: translateY(-1px);
        }
      }
    }
  }
  
  .color-preview {
    h4 {
      margin: 0 0 1rem 0;
      color: var(--color-on-surface);
    }
    
    .preview-swatches {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
      gap: 0.5rem;
      
      .preview-swatch {
        padding: 0.75rem 0.5rem;
        border-radius: 0.5rem;
        text-align: center;
        font-size: 0.8rem;
        font-weight: 600;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
      }
    }
  }
}

// ==========================================================================
// DEMO COMPONENTS
// ==========================================================================

.demo-components {
  h3 {
    margin: 0 0 1.5rem 0;
    color: var(--color-on-surface);
    font-size: 1.5rem;
  }
  
  .component-showcase {
    display: grid;
    gap: 2rem;
    
    @media (min-width: 768px) {
      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    }
    
    .showcase-section {
      padding: 1.5rem;
      background: var(--color-surface-container);
      border-radius: 0.75rem;
      border: 1px solid var(--color-outline-variant);
      
      h4 {
        margin: 0 0 1rem 0;
        color: var(--color-on-surface);
        font-size: 1.2rem;
      }
      
      // Button Styles
      .button-group {
        display: flex;
        flex-direction: column;
        gap: 0.75rem;
        
        button {
          padding: 0.75rem 1.5rem;
          border-radius: 0.5rem;
          font-size: 1rem;
          font-weight: 600;
          cursor: pointer;
          border: none;
          transition: all 0.3s ease;
          
          &.btn-primary {
            background: var(--color-primary);
            color: var(--color-on-primary);
            
            &:hover {
              opacity: 0.9;
              transform: translateY(-1px);
            }
          }
          
          &.btn-secondary {
            background: var(--color-secondary);
            color: var(--color-on-secondary);
            
            &:hover {
              opacity: 0.9;
              transform: translateY(-1px);
            }
          }
          
          &.btn-tertiary {
            background: var(--color-tertiary);
            color: var(--color-on-tertiary);
            
            &:hover {
              opacity: 0.9;
              transform: translateY(-1px);
            }
          }
        }
      }
      
      // Card Styles
      .card-group {
        display: flex;
        flex-direction: column;
        gap: 1rem;
        
        .demo-card {
          padding: 1.5rem;
          border-radius: 0.5rem;
          
          &.primary {
            background: var(--color-primary-container);
            color: var(--color-on-primary-container);
          }
          
          &.secondary {
            background: var(--color-secondary-container);
            color: var(--color-on-secondary-container);
          }
          
          h5 {
            margin: 0 0 0.5rem 0;
            font-size: 1.1rem;
          }
          
          p {
            margin: 0;
            opacity: 0.8;
          }
        }
      }
      
      // Surface Styles
      .surface-group {
        display: flex;
        flex-direction: column;
        gap: 1rem;
        
        .demo-surface {
          padding: 1rem;
          border-radius: 0.5rem;
          text-align: center;
          font-weight: 600;
          
          &.surface-low {
            background: var(--color-surface-low);
            color: var(--color-on-surface);
          }
          
          &.surface-container {
            background: var(--color-surface-container);
            color: var(--color-on-surface);
          }
          
          &.surface-high {
            background: var(--color-surface-high);
            color: var(--color-on-surface);
          }
        }
      }
    }
  }
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .hcl-studio-demo {
    padding: 1rem;
  }
  
  .demo-header {
    padding: 1.5rem;
    
    h1 {
      font-size: 2rem;
    }
    
    p {
      font-size: 1rem;
    }
  }
  
  .theme-grid {
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  }
  
  .custom-inputs {
    grid-template-columns: 1fr !important;
  }
  
  .custom-actions {
    flex-direction: column;
  }
}

// ==========================================================================
// TRANSITIONS FOR SMOOTH THEME CHANGES
// ==========================================================================

* {
  transition: background-color 0.3s ease, 
              color 0.3s ease, 
              border-color 0.3s ease,
              opacity 0.3s ease;
}@x#import { Component, OnInit, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { BrandColors, ThemePreview } from '../../../../../hcl-studio/src/lib/models/hcl.models';
import { HCLStudioService } from '../../../../../hcl-studio/src/lib/hcl-studio.service';
import { HCLConverter } from '../../../../../hcl-studio/src/lib/core/hcl-converter';
import { DEFAULT_THEMES } from '../../../../../hcl-studio/src/lib/themes/theme-presets';



@Component({
  selector: 'app-hcl-studio-demo',
  standalone: true,
  imports: [CommonModule, FormsModule],
  template: `
    <div class="hcl-studio-demo">
      <div class="demo-header">
        <h1>HCL Studio Demo</h1>
        <p>Dynamic theme switching using HCL color space</p>
      </div>

      <!-- Current Theme Info -->
      <div class="current-theme-info" *ngIf="currentTheme">
        <h3>Current Theme: {{ currentTheme.name }}</h3>
        <div class="color-swatches">
          <div class="swatch" [style.background]="currentTheme.primary">
            <span>Primary</span>
          </div>
          <div class="swatch" [style.background]="currentTheme.secondary">
            <span>Secondary</span>
          </div>
          <div class="swatch" [style.background]="currentTheme.tertiary">
            <span>Tertiary</span>
          </div>
        </div>
      </div>

      <!-- Mode Toggle -->
      <div class="mode-controls">
        <button 
          class="mode-toggle-btn"
          (click)="toggleMode()"
          [class.dark]="isDarkMode"
        >
          {{ isDarkMode ? 'Switch to Light' : 'Switch to Dark' }}
        </button>
      </div>

      <!-- Built-in Themes -->
      <div class="themes-section">
        <h3>Built-in Themes</h3>
        <div class="theme-grid">
          <div 
            *ngFor="let theme of availableThemes" 
            class="theme-card"
            [class.active]="theme.id === currentTheme?.id"
            (click)="switchTheme(theme.id)"
          >
            <div class="theme-preview">
              <div class="color-strip" [style.background]="theme.primary"></div>
              <div class="color-strip" [style.background]="theme.secondary"></div>
              <div class="color-strip" [style.background]="theme.tertiary"></div>
            </div>
            <span class="theme-name">{{ theme.name }}</span>
          </div>
        </div>
      </div>

      <!-- Custom Color Input -->
      <div class="custom-theme-section">
        <h3>Create Custom Theme</h3>
        <div class="custom-inputs">
          <div class="color-input-group">
            <label>Primary Color:</label>
            <input 
              type="color" 
              [(ngModel)]="customColors.primary" 
              (change)="previewCustomTheme()"
            >
            <input 
              type="text" 
              [(ngModel)]="customColors.primary" 
              (input)="previewCustomTheme()"
              placeholder="#6750A4"
            >
          </div>
          
          <div class="color-input-group">
            <label>Secondary Color:</label>
            <input 
              type="color" 
              [(ngModel)]="customColors.secondary" 
              (change)="previewCustomTheme()"
            >
            <input 
              type="text" 
              [(ngModel)]="customColors.secondary" 
              (input)="previewCustomTheme()"
              placeholder="#625B71"
            >
          </div>

          <div class="color-input-group">
            <label>Tertiary Color:</label>
            <input 
              type="color" 
              [(ngModel)]="customColors.tertiary" 
              (change)="previewCustomTheme()"
            >
            <input 
              type="text" 
              [(ngModel)]="customColors.tertiary" 
              (input)="previewCustomTheme()"
              placeholder="#7D5260"
            >
          </div>
        </div>

        <div class="custom-actions">
          <button class="preview-btn" (click)="previewCustomTheme()">
            Preview Theme
          </button>
          <button class="apply-btn" (click)="applyCustomTheme()">
            Apply Theme
          </button>
        </div>

        <!-- Color Preview -->
        <div *ngIf="colorPreview" class="color-preview">
          <h4>Generated Palette Preview</h4>
          <div class="preview-swatches">
            <div 
              *ngFor="let color of colorPreview | keyvalue" 
              class="preview-swatch"
              [style.background]="color.value"
              [style.color]="getContrastColor(color.value)"
            >
              {{ color.key }}
            </div>
          </div>
        </div>
      </div>

      <!-- Demo Components -->
      <div class="demo-components">
        <h3>Theme Demo Components</h3>
        
        <div class="component-showcase">
          <!-- Buttons -->
          <div class="showcase-section">
            <h4>Buttons</h4>
            <div class="button-group">
              <button class="btn-primary">Primary Button</button>
              <button class="btn-secondary">Secondary Button</button>
              <button class="btn-tertiary">Tertiary Button</button>
            </div>
          </div>

          <!-- Cards -->
          <div class="showcase-section">
            <h4>Cards</h4>
            <div class="card-group">
              <div class="demo-card primary">
                <h5>Primary Card</h5>
                <p>This card uses primary colors</p>
              </div>
              <div class="demo-card secondary">
                <h5>Secondary Card</h5>
                <p>This card uses secondary colors</p>
              </div>
            </div>
          </div>

          <!-- Surfaces -->
          <div class="showcase-section">
            <h4>Surface Variations</h4>
            <div class="surface-group">
              <div class="demo-surface surface-low">Surface Low</div>
              <div class="demo-surface surface-container">Surface Container</div>
              <div class="demo-surface surface-high">Surface High</div>
            </div>
          </div>
        </div>
      </div>
    </div>
  `,
  styleUrls: ['./hcl-studio-demo.component.scss']
})
export class HclStudioDemoComponent implements OnInit, OnDestroy {
  private destroy$ = new Subject<void>();

  // State
  availableThemes: ThemePreview[] = [];
  currentTheme: ThemePreview | null = null;
  isDarkMode = false;

  // Custom theme inputs
  customColors: BrandColors = {
    primary: '#6750A4',
    secondary: '#625B71',
    tertiary: '#7D5260'
  };

  colorPreview: { [key: string]: string } | null = null;

  constructor(private hclStudio: HCLStudioService) {}

  ngOnInit(): void {
    // Initialize HCL Studio with default themes
    this.hclStudio.initialize({
      themes: DEFAULT_THEMES,
      defaultTheme: 'material-purple',
      autoMode: false
    });

    // Subscribe to theme changes
    this.hclStudio.themeState$
      .pipe(takeUntil(this.destroy$))
      .subscribe((state: any) => {
        this.availableThemes = state.availableThemes;
        if (state.currentTheme) {
          this.currentTheme = {
            id: state.currentTheme.config.id,
            name: state.currentTheme.config.name,
            description: state.currentTheme.config.description,
            primary: state.currentTheme.config.colors.primary,
            secondary: state.currentTheme.config.colors.secondary,
            tertiary: state.currentTheme.config.colors.tertiary
          };
        }
      });

    // Subscribe to mode changes
    this.hclStudio.currentMode$
      .pipe(takeUntil(this.destroy$))
      .subscribe((mode: string) => {
        this.isDarkMode = mode === 'dark';
      });
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  switchTheme(themeId: string): void {
    this.hclStudio.switchTheme(themeId);
  }

  toggleMode(): void {
    this.hclStudio.toggleMode();
  }

  previewCustomTheme(): void {
    try {
      this.colorPreview = this.hclStudio.generateColorPreview(this.customColors);
    } catch (error) {
      console.warn('Failed to generate color preview:', error);
      this.colorPreview = null;
    }
  }

  applyCustomTheme(): void {
    const customTheme = this.hclStudio.createCustomTheme(
      'custom-theme',
      'My Custom Theme',
      this.customColors,
      'User-created custom theme'
    );

    this.hclStudio.switchTheme('custom-theme');
  }

  getContrastColor(backgroundColor: string): string {
    try {
      const ratio1 = HCLConverter.getContrastRatio(backgroundColor, '#000000');
      const ratio2 = HCLConverter.getContrastRatio(backgroundColor, '#FFFFFF');
      return ratio1 > ratio2 ? '#000000' : '#FFFFFF';
    } catch {
      return '#000000';
    }
  }
},x
xkw2E=WfnA~QBOpIiJf~pjQYfrH1'$>5,PZZ;%8@q+K-*I-sRKJRSRKjҊs3rt6[od%Z\XY\%7?%u| y8Dx	<div class="hero-demo">
  <h2>Hero Components Demo</h2>
  
  <!-- Basic Hero Section -->
  <section class="demo-section">
    <h3>Basic Hero Section</h3>
    <p>A gradient hero with centered content and dual CTAs</p>
    <ui-lp-hero 
      [configuration]="basicHeroConfig"
      (ctaClicked)="onCtaClick('Basic hero CTA clicked')">
    </ui-lp-hero>
  </section>

  <!-- Light Hero Section -->
  <section class="demo-section">
    <h3>Light Hero Section</h3>
    <p>Clean design with left-aligned content</p>
    <ui-lp-hero 
      [configuration]="lightHeroConfig"
      (ctaClicked)="onCtaClick('Light hero CTA clicked')">
    </ui-lp-hero>
  </section>

  <!-- Animated Background Hero -->
  <section class="demo-section">
    <h3>Animated Background Hero</h3>
    <p>Full height with animated gradient background</p>
    <ui-lp-hero 
      [configuration]="darkHeroConfig"
      (ctaClicked)="onCtaClick('Dark hero CTA clicked')">
    </ui-lp-hero>
  </section>

  <!-- Hero With Image - Split Layout -->
  <section class="demo-section">
    <h3>Hero With Image</h3>
    <p>Split layout with image on the right</p>
    <ui-lp-hero-image 
      [configuration]="splitImageConfig"
      (ctaClicked)="onCtaClick('Split image hero CTA clicked')">
    </ui-lp-hero-image>
  </section>

  <!-- Hero With Image - Overlay Style -->
  <section class="demo-section">
    <h3>Hero Image - Different Layout</h3>
    <p>Image on left with gradient background</p>
    <ui-lp-hero-image 
      [configuration]="overlayImageConfig"
      (ctaClicked)="onCtaClick('Overlay image hero CTA clicked')">
    </ui-lp-hero-image>
  </section>

  <!-- Split Screen Hero - Text Content -->
  <section class="demo-section">
    <h3>Split Screen Hero - Text</h3>
    <p>50/50 split with text content on both sides</p>
    <ui-lp-hero-split 
      [configuration]="textSplitConfig"
      (ctaClicked)="onCtaClick('Text split hero CTA clicked')">
    </ui-lp-hero-split>
  </section>

  <!-- Split Screen Hero - Mixed Media -->
  <section class="demo-section">
    <h3>Split Screen Hero - Mixed Media</h3>
    <p>60/40 split with text and image content</p>
    <ui-lp-hero-split 
      [configuration]="mediaSplitConfig"
      (ctaClicked)="onCtaClick('Media split hero CTA clicked')">
    </ui-lp-hero-split>
  </section>

</div>ּ8xs.hero-demo {
  h2 {
    margin-bottom: 2rem;
    text-align: center;
    color: var(--semantic-color-text-primary);
  }

  .demo-section {
    margin-bottom: 3rem;
    
    h3 {
      margin-bottom: 0.5rem;
      color: var(--semantic-color-text-primary);
      font-size: 1.2rem;
      font-weight: 600;
    }
    
    p {
      margin-bottom: 1rem;
      color: var(--semantic-color-text-secondary);
      font-size: 0.9rem;
      padding: 0 1rem;
      background: var(--semantic-color-surface-elevated);
      border-radius: 0.5rem;
      padding: 0.75rem 1rem;
      border-left: 3px solid var(--semantic-color-primary);
    }
  }
}

// Ensure demo sections don't interfere with hero component styles
.demo-section {
  position: relative;
  overflow: hidden;
  border-radius: 0.5rem;
  box-shadow: var(--semantic-shadow-card-rest);
  
  &:hover {
    box-shadow: var(--semantic-shadow-card-hover);
  }
}s1Rx@import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { 
  HeroSectionComponent, 
  HeroWithImageComponent, 
  HeroSplitScreenComponent 
} from 'ui-landing-pages';
import { 
  HeroConfig, 
  HeroImageConfig, 
  HeroSplitConfig,
  CTAButton
} from 'ui-landing-pages';

@Component({
  selector: 'app-hero-sections-demo',
  imports: [
    CommonModule,
    HeroSectionComponent,
    HeroWithImageComponent,
    HeroSplitScreenComponent
  ],
  templateUrl: './hero-sections-demo.component.html',
  styleUrl: './hero-sections-demo.component.scss'
})
export class HeroSectionsDemoComponent {

  // Hero Section Configs
  basicHeroConfig: HeroConfig = {
    title: 'Build Amazing Landing Pages',
    subtitle: 'Create stunning websites with our comprehensive component library',
    alignment: 'center',
    backgroundType: 'gradient',
    minHeight: 'large',
    ctaPrimary: {
      text: 'Get Started',
      variant: 'filled',
      action: () => console.log('Primary CTA clicked')
    },
    ctaSecondary: {
      text: 'Learn More',
      variant: 'outlined',
      action: () => console.log('Secondary CTA clicked')
    }
  };

  lightHeroConfig: HeroConfig = {
    title: 'Clean & Modern Design',
    subtitle: 'Designed for the modern web',
    alignment: 'left',
    backgroundType: 'solid',
    minHeight: 'medium',
    ctaPrimary: {
      text: 'Explore Features',
      variant: 'filled',
      action: () => console.log('Explore clicked')
    }
  };

  darkHeroConfig: HeroConfig = {
    title: 'Dark Mode Ready',
    subtitle: 'Perfect for dark interfaces',
    alignment: 'right',
    backgroundType: 'animated',
    minHeight: 'full',
    ctaPrimary: {
      text: 'Try Dark Mode',
      variant: 'filled',
      action: () => console.log('Dark mode clicked')
    }
  };

  // Hero With Image Configs
  splitImageConfig: HeroImageConfig = {
    title: 'Hero with Image',
    subtitle: 'Perfect split layout',
    alignment: 'left',
    backgroundType: 'solid',
    minHeight: 'large',
    imageUrl: 'https://images.unsplash.com/photo-1551434678-e076c223a692?ixlib=rb-4.0.3&auto=format&fit=crop&w=600&q=80',
    imageAlt: 'Team collaboration',
    imagePosition: 'right',
    imageMobile: 'below',
    ctaPrimary: {
      text: 'Start Building',
      variant: 'filled',
      action: () => console.log('Start building clicked')
    }
  };

  overlayImageConfig: HeroImageConfig = {
    title: 'Overlay Hero Style',
    subtitle: 'Text over image',
    alignment: 'center',
    backgroundType: 'gradient',
    minHeight: 'full',
    imageUrl: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?ixlib=rb-4.0.3&auto=format&fit=crop&w=1200&q=80',
    imageAlt: 'Modern office space',
    imagePosition: 'left',
    imageMobile: 'above',
    ctaPrimary: {
      text: 'View Gallery',
      variant: 'filled',
      action: () => console.log('View gallery clicked')
    },
    ctaSecondary: {
      text: 'Learn More',
      variant: 'outlined',
      action: () => console.log('Learn more clicked')
    }
  };

  // Hero Split Screen Configs
  textSplitConfig: HeroSplitConfig = {
    title: 'Split Screen Hero',
    subtitle: 'Powerful dual-content layout',
    alignment: 'center',
    backgroundType: 'solid',
    minHeight: 'large',
    splitRatio: '50-50',
    leftContent: {
      type: 'text',
      content: '<h3>Powerful Features</h3><p>Everything you need to build professional landing pages with our comprehensive component library.</p>'
    },
    rightContent: {
      type: 'text', 
      content: '<h3>Easy to Use</h3><p>Drop-in components that work seamlessly with your existing Angular applications.</p>'
    }
  };

  mediaSplitConfig: HeroSplitConfig = {
    title: 'Media Split Hero',
    subtitle: 'Text and image combination',
    alignment: 'left',
    backgroundType: 'gradient',
    minHeight: 'large',
    splitRatio: '60-40',
    leftContent: {
      type: 'text',
      content: '<h3>See It In Action</h3><p>Watch our components come to life with interactive examples and real-world use cases.</p>'
    },
    rightContent: {
      type: 'image',
      content: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?ixlib=rb-4.0.3&auto=format&fit=crop&w=600&q=80'
    }
  };

  onCtaClick(message: string): void {
    console.log(message);
    // In a real app, you might navigate to a different route or open a modal
  }
}
l}xU// Demo-specific styles for the icon button showcase
:host {
  display: block;
}

// Danger button styling for destructive actions demo
::ng-deep .danger-button {
  &.ui-icon-button--outlined {
    color: #dc3545;
    border-color: #dc3545;
    
    &:hover:not(:disabled) {
      background-color: rgba(220, 53, 69, 0.1);
      border-color: #dc3545;
    }
    
    &:focus-visible {
      outline-color: #dc3545;
    }
  }
}d:x$import { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IconButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons/icon-button/icon-button.component';
import { 
  faHeart, 
  faBookmark, 
  faShare, 
  faDownload,
  faEdit, 
  faTrash, 
  faSave,
  faSearch,
  faPlus,
  faMinus,
  faHome,
  faUser,
  faCog,
  faClose,
  faCheck,
  faChevronLeft,
  faChevronRight,
  faEllipsisV,
  faStar
} from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-icon-button-demo',
  standalone: true,
  imports: [
    CommonModule,
    IconButtonComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Icon Button Component Showcase</h2>
      
      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem;">
          <ui-icon-button 
            [icon]="faHeart" 
            size="small" 
            ariaLabel="Like (small)"
            (clicked)="handleClick('small heart')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faHeart" 
            size="medium" 
            ariaLabel="Like (medium)"
            (clicked)="handleClick('medium heart')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faHeart" 
            size="large" 
            ariaLabel="Like (large)"
            (clicked)="handleClick('large heart')">
          </ui-icon-button>
        </div>
      </section>

      <!-- Filled Variant -->
      <section style="margin-bottom: 3rem;">
        <h3>Filled Variant</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-icon-button 
            [icon]="faHeart" 
            variant="filled" 
            ariaLabel="Like"
            title="Add to favorites"
            (clicked)="handleClick('filled heart')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faBookmark" 
            variant="filled" 
            ariaLabel="Bookmark"
            title="Save for later"
            (clicked)="handleClick('filled bookmark')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faShare" 
            variant="filled" 
            ariaLabel="Share"
            title="Share this item"
            (clicked)="handleClick('filled share')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faDownload" 
            variant="filled" 
            ariaLabel="Download"
            title="Download file"
            (clicked)="handleClick('filled download')">
          </ui-icon-button>
        </div>
      </section>

      <!-- Tonal Variant -->
      <section style="margin-bottom: 3rem;">
        <h3>Tonal Variant</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-icon-button 
            [icon]="faEdit" 
            variant="tonal" 
            ariaLabel="Edit"
            title="Edit item"
            (clicked)="handleClick('tonal edit')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faSave" 
            variant="tonal" 
            ariaLabel="Save"
            title="Save changes"
            (clicked)="handleClick('tonal save')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faSearch" 
            variant="tonal" 
            ariaLabel="Search"
            title="Search items"
            (clicked)="handleClick('tonal search')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faCog" 
            variant="tonal" 
            ariaLabel="Settings"
            title="Open settings"
            (clicked)="handleClick('tonal settings')">
          </ui-icon-button>
        </div>
      </section>

      <!-- Outlined Variant -->
      <section style="margin-bottom: 3rem;">
        <h3>Outlined Variant</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-icon-button 
            [icon]="faPlus" 
            variant="outlined" 
            ariaLabel="Add"
            title="Add new item"
            (clicked)="handleClick('outlined add')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faMinus" 
            variant="outlined" 
            ariaLabel="Remove"
            title="Remove item"
            (clicked)="handleClick('outlined remove')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faHome" 
            variant="outlined" 
            ariaLabel="Home"
            title="Go home"
            (clicked)="handleClick('outlined home')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faUser" 
            variant="outlined" 
            ariaLabel="Profile"
            title="View profile"
            (clicked)="handleClick('outlined profile')">
          </ui-icon-button>
        </div>
      </section>

      <!-- States -->
      <section style="margin-bottom: 3rem;">
        <h3>States</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-icon-button 
            [icon]="faHeart" 
            variant="filled" 
            [disabled]="true"
            ariaLabel="Disabled button">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faDownload" 
            variant="filled" 
            [loading]="true"
            ariaLabel="Loading button">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faStar" 
            variant="tonal" 
            [pressed]="isPressed"
            ariaLabel="Toggle star"
            title="Toggle favorite"
            (clicked)="togglePressed()">
          </ui-icon-button>
        </div>
        <p style="margin-top: 0.5rem; color: #666; font-size: 0.9rem;">
          Star button pressed state: {{ isPressed ? 'ON' : 'OFF' }}
        </p>
      </section>

      <!-- Navigation Icons -->
      <section style="margin-bottom: 3rem;">
        <h3>Navigation Examples</h3>
        <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem;">
          <ui-icon-button 
            [icon]="faChevronLeft" 
            variant="outlined" 
            ariaLabel="Previous"
            title="Go to previous page"
            (clicked)="handleClick('previous')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faChevronRight" 
            variant="outlined" 
            ariaLabel="Next"
            title="Go to next page"
            (clicked)="handleClick('next')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faClose" 
            variant="tonal" 
            ariaLabel="Close"
            title="Close dialog"
            (clicked)="handleClick('close')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faCheck" 
            variant="filled" 
            ariaLabel="Confirm"
            title="Confirm action"
            (clicked)="handleClick('confirm')">
          </ui-icon-button>
          <ui-icon-button 
            [icon]="faEllipsisV" 
            variant="tonal" 
            ariaLabel="More options"
            title="Show more options"
            (clicked)="handleClick('more')">
          </ui-icon-button>
        </div>
      </section>

      <!-- Destructive Actions -->
      <section style="margin-bottom: 3rem;">
        <h3>Destructive Actions</h3>
        <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem;">
          <ui-icon-button 
            [icon]="faTrash" 
            variant="outlined" 
            ariaLabel="Delete"
            title="Delete item (destructive action)"
            class="danger-button"
            (clicked)="handleClick('delete')">
          </ui-icon-button>
        </div>
        <p style="margin-top: 0.5rem; color: #666; font-size: 0.9rem;">
          Use outlined variant for destructive actions to reduce accidental clicks
        </p>
      </section>

      <!-- Click Counter -->
      <section style="margin-bottom: 2rem;">
        <h3>Interaction Test</h3>
        <p>Total clicks: {{ clickCount }}</p>
        <p>Last clicked: {{ lastClicked || 'None' }}</p>
      </section>
    </div>
  `,
  styleUrl: './icon-button-demo.component.scss'
})
export class IconButtonDemoComponent {
  // FontAwesome icons
  faHeart = faHeart;
  faBookmark = faBookmark;
  faShare = faShare;
  faDownload = faDownload;
  faEdit = faEdit;
  faTrash = faTrash;
  faSave = faSave;
  faSearch = faSearch;
  faPlus = faPlus;
  faMinus = faMinus;
  faHome = faHome;
  faUser = faUser;
  faCog = faCog;
  faClose = faClose;
  faCheck = faCheck;
  faChevronLeft = faChevronLeft;
  faChevronRight = faChevronRight;
  faEllipsisV = faEllipsisV;
  faStar = faStar;

  // Demo state
  clickCount = 0;
  lastClicked = '';
  isPressed = false;

  handleClick(action: string): void {
    this.clickCount++;
    this.lastClicked = action;
    console.log('Icon button clicked:', action);
  }

  togglePressed(): void {
    this.isPressed = !this.isPressed;
    this.handleClick(`toggle star ${this.isPressed ? 'on' : 'off'}`);
  }
}KRo#xg@import "../../../../../ui-design-system/src/styles/semantic";

// Tokens available globally via main application styles

.demo-container {
  padding: $semantic-spacing-layout-md;
  
  h2 {
    margin-bottom: $semantic-spacing-component-sm;
    color: $semantic-color-text-primary;
    font-size: $base-typography-font-size-xl;
  }
  
  p {
    margin-bottom: $semantic-spacing-layout-lg;
    color: $semantic-color-text-secondary;
    font-size: $base-typography-font-size-md;
  }
}

.demo-section {
  margin-bottom: $semantic-spacing-layout-xl;
  
  h3 {
    margin-bottom: $semantic-spacing-component-md;
    color: $semantic-color-text-primary;
    font-size: $base-typography-font-size-lg;
    border-bottom: $semantic-border-divider-width solid $semantic-color-border-subtle;
    padding-bottom: $semantic-spacing-component-xs;
  }
}

.demo-row {
  display: flex;
  gap: $semantic-spacing-component-lg;
  flex-wrap: wrap;
  align-items: flex-start;
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: $semantic-spacing-component-lg;
}

.demo-gallery {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: $semantic-spacing-component-md;
  margin-bottom: $semantic-spacing-layout-lg;
}

.demo-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: $semantic-spacing-component-sm;
  
  .ui-image-container {
    cursor: pointer;
    
    &:hover {
      transform: translateY(-2px);
      box-shadow: $semantic-shadow-elevation-3;
    }
  }
}

.demo-label {
  font-size: $base-typography-font-size-sm;
  color: $semantic-color-text-secondary;
  font-weight: $base-typography-font-weight-medium;
  text-align: center;
  padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  background: $semantic-color-surface-secondary;
  border-radius: $semantic-border-radius-sm;
  border: $semantic-border-divider-width solid $semantic-color-border-subtle;
}

// Custom styling for hero image demo
.hero-image {
  position: relative;
  
  [slot='caption'] {
    display: flex;
    flex-direction: column;
    gap: $semantic-spacing-component-xs;
    
    h4 {
      margin: 0;
      font-size: $base-typography-font-size-md;
      font-weight: $base-typography-font-weight-semibold;
    }
    
    p {
      margin: 0;
      font-size: $base-typography-font-size-sm;
      opacity: 0.9;
    }
  }
}

// Retry button styling
.retry-btn {
  margin-top: $semantic-spacing-component-xs;
  padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  background: $semantic-color-interactive-primary;
  color: $semantic-color-text-inverse;
  border: none;
  border-radius: $semantic-border-radius-sm;
  font-size: $base-typography-font-size-xs;
  cursor: pointer;
  transition: background-color $semantic-duration-fast $semantic-easing-standard;
  
  &:hover {
    background-color: $semantic-color-surface-interactive;
  }
  
  &:focus-visible {
    outline: 2px solid $semantic-color-focus-ring;
    outline-offset: 2px;
  }
}

// Event log styling
.event-log {
  background: $semantic-color-surface-secondary;
  border: $semantic-border-divider-width solid $semantic-color-border-subtle;
  border-radius: $semantic-border-radius-md;
  padding: $semantic-spacing-component-md;
  font-family: monospace;
  font-size: $base-typography-font-size-xs;
  max-height: 200px;
  overflow-y: auto;
}

.event-item {
  display: flex;
  gap: $semantic-spacing-component-sm;
  margin-bottom: $semantic-spacing-component-xs;
  
  &:last-child {
    margin-bottom: 0;
  }
}

.event-time {
  color: $semantic-color-text-tertiary;
  min-width: 60px;
}

.event-type {
  color: $semantic-color-interactive-primary;
  font-weight: $base-typography-font-weight-medium;
  min-width: 80px;
}

.event-message {
  color: $semantic-color-text-secondary;
  flex: 1;
}

// Responsive design
@media (max-width: $semantic-sizing-breakpoint-tablet - 1) {
  .demo-row {
    gap: $semantic-spacing-component-md;
  }
  
  .demo-grid {
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: $semantic-spacing-component-md;
  }
  
  .demo-gallery {
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  }
}

@media (max-width: $semantic-sizing-breakpoint-mobile - 1) {
  .demo-container {
    padding: $semantic-spacing-layout-sm;
  }
  
  .demo-section {
    margin-bottom: $semantic-spacing-layout-lg;
  }
  
  .demo-row {
    flex-direction: column;
    gap: $semantic-spacing-component-md;
    align-items: center;
  }
  
  .demo-grid {
    grid-template-columns: 1fr;
  }
  
  .demo-gallery {
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  }
  
  .event-log {
    font-size: $base-typography-font-size-xs;
  }
}O:v&xe%$@use '	3/index' as *;x>`max-width: 1200px;
  margin: 0 auto;

  h2 {
    font-size: $semantic-typography-heading-h2-size/#)ntent-heading;
    font-weight: $semanticEbold;
  }

  h3 {
    font-size: $semantic-typography-heading-h3-size/#+ntent-paragraph;
    font-weight: $semanticsemibolDlg)lg
 nprim? width-1'lg;
)1T3&#ntent-heading;
}

.demo-item {.
n9&width-1primary/;
  h4 {
    font-size: $semantic-typography-heading-h4-size/#+ntent-list-item;
    font-weight: $semantic"!}

  p {
    font-size: $semantic.O	n%%ntent-paragraph;
  }
}

.demo-actionsg/&ntent-paragraph;
  align-items: center'ntent-heading)md
 nvariant/}

.demo-button {(	A;
"
on-primaryi
Msemantic.O	font-weight: $semantic"
all $semantic-motionmotion-easing-ease-in-out;
;
primary-hover;
+2;
  }
A
  &--secondary {
  
nprimary/mwidth-1primary;

    &:hover {
    
n9.  }
  }
}

.demo-info {
  font-size: $semantic.O	)	#ntent-list-item;
}

.file-list-demo	%ntent-paragraph)md
 n9'mwidth-1 
  h5 {
    font-size: $semantic.$#+ntent-list-item;
    font-weight: $semanticsemibold;
  }

  .file-item;justify-content: space-between;
    align-items: center;
  '
nprimary;
  >/%ntent-line-normal;

    &:last-child {
      margin-bottom: 0;
    }

    .file-info {
      font-size: $semantic-typography-fo<O	
).}

    .file-size {
      font-size: $semantic. 0  }
  }
}

.code-demo)variantiwidth-1X	ntent-paragraph;
  
  pre {
    font-family: 'JetBrains Mono', 'Consolas', monospace;
    font-size: $semantic-typography-font-?n(  overflow-x: auto;
    margin: 0;
  }
}7Pd(sx0%$@use '	3/index' as *;x82lg;
  max-width: 1200px;
  margin: 0 auto;

  h2 {:$semantic-typography-heading-h2-size;&    border-bottom: 17ntent-paragraph;
  }

  h3 {!n2  font-size: $semantic-typography-heading-h3-size;(ntent-heading;
  	 J-Jestartontent-line-normal)md;
  border: 1-
nKprimary;
  min-width: 100px;

  p {
    margin: 0;
    font-size: $semantic.md"n  font-weight: $semantic"}

  &:hover {
    border-`	primary;
+1;
  }
}

.demo-controlsg7+lg)lg
 n9!lg;
  border: 1
  .control-group_9min-width: 120px;

    label {
      font-size: $semantic.O	
font-weight: $semantic"-}

    input[type="range"] {
      width: 100%;
      min-width: 150px;
    }

    input[type="checkbox"] {
      margin-right:#  }

    select {
    '	%    border: 1primary;
    >/  
nprimary;
  -'	semantic.sm;

      &:focus {
    'primary;
          border-`)primary;
      }
    }
  }

  button {
  'sm!\	border: 1primary;
  >)md;
  
primaryonsemantic.O	font-weight: $semantic" transition: all $semantic-motion*"
    &:hover:not(:disabled) {
    
primary-hover;
      border-`primary-hover/2;
    }

    &:focus {
  'primary;
  J  }

    &:disabled {
      opacity: 0.38;
      cursor: not-allowed;
    
n9    border-`0H  }
  }
}

.demo-interactive-result {
  display: flex;
  justify-content2l
 nprimary+lg;
  border: 2px dasheq!5breakpoint-mdB}
o<
  .demo-controls^H2
    .control-group {
      min-width: auto;
    }%breakpoint-smJZ
  .demo-row {
    justify-content: center;
  }

  .demo-item {
    min-width: 80px;
  }
}4Yx:QugqFbQjniF! Jw=_x-$#G@lS4
  h4Y4.@column+K: 1;
  min-width: 300px;
}

.demo-accordion-container {
  max-width: 600px;Imd8{	'	s/2~k {
    q&p)	j--primary {
    qP
on-primi)P;

      &:hover {
      qP);
        opacity: 0.9;
      }
    }
  }e>!sm)
  h5 {
    margin: 0 0!p
xs 0s}
}

.code-example {p'T	#%md;
  font-family@
family-mono;
,xs;
[+overflow-x: auto;
  white-space: pre-wrap;
X p
&sm;
}

.sample-content {
  line-height@
-line-height-relaxed;
  
  p {
    margin: 0 0!p
 sm 0;
    
    &:last-child {
  !  }
  }
  
  ul {
    margin: 0 0!p
=lg;
    
    &:last-child {
    }
  }
  
  li {(@	s;
    
    &:last-child {
  .  }
  }
}

.icon-demo {
  display: inline-flex4@	s;
P;
A8e'}

  .demo-column {
    min-width: auto[sm;/item.;
  }
}'nV@xn$	@import "3";

.carousel-demo { 
  .demo-section {&&section-md;
    
    &:last-child {
    }
  }
  
  .section-title {/xl>4semibold;
    line-height@
line-height-normal;.$)  
  .section-description {/md>4normal;
    line-height@
line-height-relaxed;!$)  
  .carousel-container {&h  
  .features-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)){X/  
  .feature-card {
  q&&container;
    border-radius: 12px;
  !b$	
    .feature-title {0
1md;
  @2semibold;
      line-height@
line-height-normal$["%@)sm;
    }
    
    .feature-description {0
5@B0normal;
      line-height@
line-height-normal$"%@\"}
    
    .feature-example {
    q&variant		8px;
    !'\b$*econdary;
      
      .example-label {
  1
0xs;
    @2normal;
        line-height@
line-height-normal;
  0 '@	os;
        text-transform: uppercase;
        letter-spacing: 0.5px;
      }
      
      .example-content {
  1
4@B0normal;
      line-height@
line-height-normal;
  "
  
  .code-snippet {
  q&	container^(	border-radius: 8px;
  !X W  font-family: 'Roboto Mono', monospace;
    font-size: 0.875rem;
    line-height: 1.4;.overflow-x: auto;
  }
}

YiN=x$9?%!lg;

  h2 {%	2-size>4	semibold;	on-surfac(  border-bottomoutlinx+@A
  h3 {%D;	on-surfac(`"flex-wrap: wrap%md;
*sm;
}

.config-panel {p'outlinA,lg)lg;
  
  .config-rowK#\$#@\'flex-wrap: wrap;

    &:last-child {
  V"p  }on-surface;
  N}-  white-space: nowrap	outline	
on-surface/
6@  min-width: 125: 0;
      accent-P;
    }
  }
}

.event-log {p'outlinA2#%-md;
  max-height: 200px;
  overflow-y: auto;
#p
-md;
  font-family: 'Courier New', monospace;
0
  .event-item,xs 0;on-surface-variant=/Qoutline-variant;

    &:last-child {
      border-bottom: none;
    }
  }
}

.navn0@sm)md!p'	cursor: pointer;
;motion-easing-ease;
on-surface;
#p
xs;

  &:hover {
  q&variant;P;
  }

  &:active {
  q&Ncontainer;
  }

  fa-icon {
    width: 20px;
    color: inherit;
  }

  span {/md>>},768pxe7p}

  .demo-row {`!8align-items: stretch;
  }

  .config-panel .config-row {`!align-items: stretch{'Hsm;

    label {
      justify-content: space-between;
    }

    select%z)=6x$$~`1$!7Qbase-typography-font-size-2xl;
    font-weight: $base-typography-font-weight-boldG
  h3 {&`7Tbase-typography-font-size-lg;
    font-weight: $base-typography-font-weight-semibold=l`}
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr))`RT
  ui-empty-state {
    width: 100%;
    height: auto;
  }
}

.demo-label {
  margin10 0 0 0;
  text-align: center;
  font-size: $baseK
+font-weight: $baseZ"Gtext-transform: uppercase;
  letter-spacing: 0.05em;
}

.demo-output {
X E#%t#Z
  p {
    margin: 0 0!*content-line-tight 0;
    font-size: $baseK
@
    &:last-child {
    }
    
    strong {#[  }
}

// Responsive DX1024px) {
  .demo-grid {
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)){sm;/768pxeFJ  
  .demo-grid {
    grid-template-columns: 1fr;
  }
  
  .demo-section {&	69 xj$@use "9"@>`max-width: 8=
  h3 {.K
lgO!p
dsm;
  flex-wrap: wrap;
}

.positions-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr)% xl;
  max-width: 400px;
  margin1md 0;
}

.demo-button { (=%sP;
on-primary;
  border: nonA2cursor: pointer;
,"md;
  transition: background-color;  
  &:hover {
  qP}
  
  &:focus-visible {
z
'focus;

}
}

.demo-text {
[*>md;
  text-decoration: underline;
  cursor: help;
  
  &:hoverPI;
  }
}

.demo-icon {
  width: 24px;
  height: 24px;
  border-radius: 50%o(	0#font-weight: bold;
  cursor: help;
+
  &:hover {
  q&)}
}

p {
  margin: 0;
+* md;
}

// Responsive adjustments6)/positions-grid {
    grid-template-columns: 1fr{'  h<4w  
  .demo-row {`!align-items: flex-start{'	sm;
  }
}m5xZ9/index9
layout-md;S(A
  
  h2 {
n+5G!content-headinpH
!*!ntent-line-normal;
  }
  
  h3 {
n+)4-siz@(@
PX   align-items: flex-start;
  
  8|9nT+P	margin-toP
}

.config
8	/%flex-wrap: wrap;
  
  &:last-child {
	margin-toP-  justify-content: flex-start;
  }
  
  label!1sm;
n+o:xs;
\.
    &:first-child {
      min-width: 80px;
  2}
  }
  
  select,'-)sm;
  &	primary;
n+ 
    &:focus {
      outline: 2:$  outline-offset: 2px;
      border- :  
+ transform: scale(1.1);
  }
  
  +&flex-start;
    
    label:first-child%N5prim[=3"	[Monaco', 'Menlo', 'Ubuntu Mono	>}

.event-item {
'
9
:#+

  &:last-child {

}
  
  &:first-child {
n+.
}
}6#px19/index9+V%=%section-lg;
  
  h3 {
    font-family	family-sans;%
lgBline-h`line-height-tight;
ntext-primaryA'@u$semantic-border-width-1border-secondary2`align-items: flex-start;
-P}

.demo-results {
'	9$semantic-border-width-1border-secondary+md;
  
  p {
    font-family	family-sans;%
R6normal;
    line-h`line-height-normal;
ntext-primary;
    margin1


    strong {
  @ptext-primary;
    }adjustments%&5!  }
  >	}
}ƸMxz F#}

.demo-column {
  display: flex;
	!#lg;
  
  > div {
    display: flex;	!!		ospanZ}'>h7xTKsTŵ[R섴PIk7	yPF)ƺ/$6a˰gt	l,tXbw++BaFwsrʭIIy]x6OEd+Ψ_'e	=v<ȍ^/Hp$<~G]r6Ե+w?
Y01gFtK#{ʡ<~.fss/r)U=Nw+i!jlܨʘ~1.aTwmͤf_b:"}O3q=`:E"yjCzz1ɽ/qDp׼xM-ⶈ).8#xR*!Qm/dwjhrx𴹁|4=@B2|cljS}mCRQ
+&acr*̋D[9m|!kY̚5H_-i@aKRq7Qy_ޭ0!hU>6E{!r*"[bWH>`o>=BRDCե֜CIꈋ8_>\ڀʱjosziv>ڹR+)
ӹfZ9DkM9(`tBZ'O"7mHaTBഞ00gAC2>>gFnFy2/eߤ/>|_).h8h,zW`TμJf(p"S5qq-[$?uKVa٧jkENW,YH7XV|se:LMtk=ivqvg+YoEx%$@use '	,/index' as *;q>`max-width: 1200px;
  margin: 0 auto;

  h2 {
    font-size: $semantic-typography-heading-h2-size|"
R!content-heading;
    font-weight: $semantic-typography-font-weight-bold;
  }

  h3 {
    font-size: $semantic-typography-headin	g-h3-size|"
R!-content-paragraph;
    font-weight: $semantic$?lg	)lg;'prim8 width-1('lg;
)1T3&layou)content-headin	%Jwidth-1primary/;
  h4 {
    font-size: $semantic-typography-heading-h4-size|"
R!-content-list-item;
    font-weight: $semantic"!}

  p {
    font-size: $semantic/-R!'content-paragraph;
  }
}

.demo-actions`/ntent-paragraph;
R!content-heading	)$variant/}

.demo-button {	i	primary;

on-primaryb
Msemantic/font-weight: $semantic"
Wall $semantic-motion-duration-fast $semantic-motion-easing-ease-in-out;

  &:hover {
  primary-hover;
+2;
  }
A
  &--secondary {
  &primary|"
?width-1	primary;
1info {
  font-size: $semantic/8)	#ntent-list-item;
}

.file-list-demo	%ntent-paragraph	)7?!md;width-1& 
  h5 {
    font-size: $semantic/
R!-content-list-item;
    font-weight: $semantic$G}

  .file-item {
    display: flex;
    justify-content: space-between&primary;
  )`P#content-line-normal;

  0  }

    .file-info {
      font-size: $semantic/~ 
.}

    .file-size {
      font-size: $semantic~ )  }
  }
}

.code-demo	)variant;width-1(X	 ntent-paragraph;
  
  pre {
    font-family: 'JetBrains Mono', 'Consolas', monospace;
    font-size: $semantic-typography-font- -&overflow-x: auto;
    margin: 0;
  }
}'=]x&$28}%plgC.JE
on-surface'plg;
    border-bottom
outline;
    padding _V?xl;yB8E
on-surface'p3}
}

.demo-row {
  display: flex;
  flex-wrap: wrap_!psm;
}

.config-panel {
	@border: 1pxoutli-lg;(
  .config-row/_%_  flex-wrap: wrap	2"  }

    labelL=8#on-surface;
      display: flex;
  +
o/  white-space: nowrap;
    }

    select {
    L    border: 1pxoutline;
    )s3on-surface;N;Tmin-width: 120px;
    }

    input[type="checkbox"] {
      margin: 0;
      accent-Q	$event-log {
	@border: 1pxoutli-3#x-height: 200px;
  overflow-y: auto'_%font-family: 'Courier New', monospace2
  .event-item {
  *0A*on-surface-variant;
    border-bottom: 1pxoutline-variant	?border-bottom: none;
    }
  }
}

.nav-item {
  display: flex;
-sm;(md!&s	c;

on-surface'
	/E	;
  }

  &:active_
+Lcontainer;
  }

  fa-icon {
    width: 20px;
    color: inherit;
  }

  span'
md;
  :8}
}

// Responsive design
@media (max-width: 768px) {
  A'}

  .demo-row {
    flex-direction: column;
    align-items: stretch;
  }

  .config-panel .config-row {
    flex-direction: c#olumn;
    align-items: stretch;
  sm;

    label {
  (2}

    select {
      min-width: auto;
    }
  }
}Ϊxw+import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ImageContainerComponent, ImageContainerSize, ImageContainerAspectRatio, ImageContainerObjectFit, ImageContainerShape } from '../../../../../ui-essentials/src/lib/components/data-display/image-container/image-container.component';
import { BadgeComponent } from '../../../../../ui-essentials/src/lib/components/data-display/badge/badge.component';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faRefresh, faHeart, faPlay } from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-image-container-demo',
  standalone: true,
  imports: [CommonModule, ImageContainerComponent, BadgeComponent, FontAwesomeModule],
  template: `
    <div class="demo-container">
      <h2>Image Container Demo</h2>
      <p>A flexible image container with lazy loading, aspect ratios, and various display options.</p>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <ui-image-container 
                [size]="size"
                [src]="sampleImages.landscape"
                [alt]="'Sample image - ' + size + ' size'">
              </ui-image-container>
              <span class="demo-label">{{ size }}</span>
            </div>
          }
        </div>
      </section>
      
      <!-- Aspect Ratios -->
      <section class="demo-section">
        <h3>Aspect Ratios</h3>
        <div class="demo-grid">
          @for (ratio of aspectRatios; track ratio) {
            <div class="demo-item">
              <ui-image-container 
                size="md"
                [aspectRatio]="ratio"
                [src]="sampleImages.landscape"
                [alt]="'Sample image - ' + ratio + ' aspect ratio'">
              </ui-image-container>
              <span class="demo-label">{{ ratio }}</span>
            </div>
          }
        </div>
      </section>
      
      <!-- Object Fit Options -->
      <section class="demo-section">
        <h3>Object Fit</h3>
        <div class="demo-row">
          @for (fit of objectFits; track fit) {
            <div class="demo-item">
              <ui-image-container 
                size="md"
                aspectRatio="1/1"
                [objectFit]="fit"
                [src]="sampleImages.landscape"
                [alt]="'Sample image with ' + fit + ' object fit'">
              </ui-image-container>
              <span class="demo-label">{{ fit }}</span>
            </div>
          }
        </div>
      </section>
      
      <!-- Shape Variants -->
      <section class="demo-section">
        <h3>Shapes</h3>
        <div class="demo-row">
          @for (shape of shapes; track shape) {
            <div class="demo-item">
              <ui-image-container 
                size="md"
                aspectRatio="1/1"
                [shape]="shape"
                [src]="sampleImages.portrait"
                [alt]="'Sample image with ' + shape + ' shape'">
              </ui-image-container>
              <span class="demo-label">{{ shape }}</span>
            </div>
          }
        </div>
      </section>
      
      <!-- Loading States -->
      <section class="demo-section">
        <h3>Loading States</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-image-container 
              size="md"
              [loading]="true"
              src="placeholder"
              alt="Loading image">
            </ui-image-container>
            <span class="demo-label">Loading</span>
          </div>
          
          <div class="demo-item">
            <ui-image-container 
              size="md"
              src="invalid-url.jpg"
              alt="Failed to load image">
              <div slot="error">
                <fa-icon [icon]="faRefresh" size="lg"></fa-icon>
                <span>Custom Error</span>
                <button class="retry-btn" (click)="retryImage($event)">Retry</button>
              </div>
            </ui-image-container>
            <span class="demo-label">Error State</span>
          </div>
          
          <div class="demo-item">
            <ui-image-container 
              size="md"
              [src]="sampleImages.landscape"
              [lazy]="false"
              alt="Eager loaded image">
            </ui-image-container>
            <span class="demo-label">Eager Load</span>
          </div>
        </div>
      </section>
      
      <!-- Interactive Features -->
      <section class="demo-section">
        <h3>Interactive Features</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-image-container 
              size="lg"
              aspectRatio="16/9"
              [src]="sampleImages.landscape"
              [overlay]="true"
              alt="Image with overlay"
              (imageClick)="handleImageClick('overlay')">
              <div slot="overlay">
                <fa-icon [icon]="faPlay" size="2x"></fa-icon>
                <span>Play Video</span>
              </div>
            </ui-image-container>
            <span class="demo-label">With Overlay</span>
          </div>
          
          <div class="demo-item">
            <ui-image-container 
              size="lg"
              aspectRatio="4/3"
              [src]="sampleImages.landscape"
              caption="Beautiful landscape scene"
              alt="Image with caption"
              (imageClick)="handleImageClick('caption')">
            </ui-image-container>
            <span class="demo-label">With Caption</span>
          </div>
        </div>
      </section>
      
      <!-- Advanced Examples -->
      <section class="demo-section">
        <h3>Advanced Examples</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-image-container 
              size="lg"
              aspectRatio="1/1"
              shape="circle"
              [src]="sampleImages.portrait"
              [overlay]="true"
              alt="Profile picture with status"
              (imageClick)="handleImageClick('profile')">
              <div slot="overlay">
                <fa-icon [icon]="faHeart" style="color: red;"></fa-icon>
              </div>
            </ui-image-container>
            <span class="demo-label">Profile Avatar</span>
          </div>
          
          <div class="demo-item">
            <ui-image-container 
              size="xl"
              aspectRatio="16/9"
              [src]="sampleImages.landscape"
              caption="Hero image with custom styling"
              alt="Hero banner image"
              class="hero-image">
              <div slot="caption">
                <h4>Custom Caption Content</h4>
                <p>With additional styled elements</p>
                <ui-badge variant="primary" size="xs">Featured</ui-badge>
              </div>
            </ui-image-container>
            <span class="demo-label">Hero Banner</span>
          </div>
        </div>
      </section>
      
      <!-- Responsive Gallery -->
      <section class="demo-section">
        <h3>Responsive Gallery</h3>
        <div class="demo-gallery">
          @for (image of galleryImages; track image.id; let i = $index) {
            <ui-image-container 
              size="md"
              [aspectRatio]="i % 3 === 0 ? '16/9' : '1/1'"
              [src]="image.url"
              [alt]="image.alt"
              [overlay]="true"
              (imageClick)="handleGalleryClick(image, i)"
              (imageLoaded)="handleImageLoad(image.id)"
              (imageError)="handleImageError(image.id)">
              <div slot="overlay">
                <span>{{ image.title }}</span>
              </div>
            </ui-image-container>
          }
        </div>
      </section>
      
      <!-- Event Log -->
      @if (eventLog.length > 0) {
        <section class="demo-section">
          <h3>Event Log</h3>
          <div class="event-log">
            @for (event of eventLog.slice(-5); track event.id) {
              <div class="event-item">
                <span class="event-time">{{ event.time | date:'HH:mm:ss' }}</span>
                <span class="event-type">{{ event.type }}</span>
                <span class="event-message">{{ event.message }}</span>
              </div>
            }
          </div>
        </section>
      }
    </div>
  `,
  styleUrl: './image-container-demo.component.scss'
})
export class ImageContainerDemoComponent {
  // Icons
  faRefresh = faRefresh;
  faHeart = faHeart;
  faPlay = faPlay;
  
  // Demo data
  sizes: ImageContainerSize[] = ['sm', 'md', 'lg', 'xl'];
  aspectRatios: ImageContainerAspectRatio[] = ['1/1', '4/3', '16/9', '3/2', '2/1', '3/4', '9/16'];
  objectFits: ImageContainerObjectFit[] = ['contain', 'cover', 'fill', 'scale-down'];
  shapes: ImageContainerShape[] = ['square', 'rounded', 'circle'];
  
  // Sample images (using placeholder service)
  sampleImages = {
    landscape: 'https://picsum.photos/800/600?random=1',
    portrait: 'https://picsum.photos/600/800?random=2',
    square: 'https://picsum.photos/600/600?random=3'
  };
  
  galleryImages = [
    { id: 1, url: 'https://picsum.photos/400/400?random=10', title: 'Nature', alt: 'Beautiful nature scene' },
    { id: 2, url: 'https://picsum.photos/400/300?random=11', title: 'Architecture', alt: 'Modern building' },
    { id: 3, url: 'https://picsum.photos/400/500?random=12', title: 'Portrait', alt: 'Person portrait' },
    { id: 4, url: 'https://picsum.photos/400/400?random=13', title: 'Urban', alt: 'City landscape' },
    { id: 5, url: 'https://picsum.photos/400/300?random=14', title: 'Technology', alt: 'Tech equipment' },
    { id: 6, url: 'https://picsum.photos/400/400?random=15', title: 'Abstract', alt: 'Abstract art' }
  ];
  
  // Event tracking
  eventLog: Array<{id: number, type: string, message: string, time: Date}> = [];
  private eventId = 1;

  handleImageClick(context: string): void {
    this.logEvent('click', `Image clicked in ${context} context`);
  }
  
  handleGalleryClick(image: any, index: number): void {
    this.logEvent('gallery-click', `Gallery image "${image.title}" clicked (index ${index})`);
  }
  
  handleImageLoad(imageId: number): void {
    this.logEvent('load', `Image ${imageId} loaded successfully`);
  }
  
  handleImageError(imageId: number): void {
    this.logEvent('error', `Image ${imageId} failed to load`);
  }
  
  retryImage(event: Event): void {
    event.stopPropagation();
    this.logEvent('retry', 'Retry button clicked for failed image');
    // In a real implementation, this would retry loading the image
  }
  
  private logEvent(type: string, message: string): void {
    this.eventLog.push({
      id: this.eventId++,
      type,
      message,
      time: new Date()
    });
    
    // Keep only last 20 events
    if (this.eventLog.length > 20) {
      this.eventLog.splice(0, this.eventLog.length - 20);
    }
  }
}ρPxv6l.dw{wk @0x1 export * from './image-container-demo.component';\6xQ
07a0w O52۔4NwmZA|SO,ŹlQVWthiUK֓C'e}? Pn50.y@&rQE7$+Jl'sd'f:覸f+xc}M:dES'!]ȆrH;W_4lFx %H#vxAimport { Component, TemplateRef, ViewChild, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { InfiniteScrollContainerComponent, InfiniteScrollEvent, InfiniteScrollConfig } from 'ui-essentials';

interface DemoItem {
  id: number;
  title: string;
  description: string;
  timestamp: Date;
  category: string;
}

@Component({
  selector: 'ui-infinite-scroll-container-demo',
  standalone: true,
  imports: [CommonModule, InfiniteScrollContainerComponent],
  template: `
    <div class="demo-container">
      <h2>Infinite Scroll Container Demo</h2>
      
      <!-- Basic Example -->
      <section class="demo-section">
        <h3>Basic Infinite Scroll (Content Projection)</h3>
        <div class="demo-showcase">
          <ui-infinite-scroll-container
            class="demo-scroll-container"
            [hasMore]="basicHasMore()"
            [loading]="basicLoading()"
            (loadMore)="loadMoreBasic($event)">
            
            @for (item of basicItems(); track item.id) {
              <div class="demo-item">
                <h4>{{ item.title }}</h4>
                <p>{{ item.description }}</p>
                <small>{{ item.timestamp | date:'short' }} - {{ item.category }}</small>
              </div>
            }
          </ui-infinite-scroll-container>
        </div>
      </section>

      <!-- Template-Based Example -->
      <section class="demo-section">
        <h3>Template-Based Rendering</h3>
        <div class="demo-showcase">
          <ui-infinite-scroll-container
            class="demo-scroll-container"
            [items]="templateItems()"
            [itemTemplate]="itemTemplate"
            [trackByFn]="trackByFn"
            [hasMore]="templateHasMore()"
            [loading]="templateLoading()"
            [config]="templateConfig"
            (loadMore)="loadMoreTemplate($event)">
          </ui-infinite-scroll-container>
          
          <ng-template #itemTemplate let-item="item" let-index="index" let-isLast="isLast">
            <div class="demo-template-item" [class.demo-template-item--last]="isLast">
              <div class="demo-template-item__header">
                <span class="demo-template-item__id">#{{ item.id }}</span>
                <span class="demo-template-item__category">{{ item.category }}</span>
              </div>
              <h4 class="demo-template-item__title">{{ item.title }}</h4>
              <p class="demo-template-item__description">{{ item.description }}</p>
              <div class="demo-template-item__footer">
                <small>Index: {{ index }} | {{ item.timestamp | date:'short' }}</small>
              </div>
            </div>
          </ng-template>
        </div>
      </section>

      <!-- Bidirectional Scrolling -->
      <section class="demo-section">
        <h3>Bidirectional Infinite Scroll</h3>
        <div class="demo-showcase">
          <ui-infinite-scroll-container
            class="demo-scroll-container"
            direction="both"
            [items]="bidirectionalItems()"
            [itemTemplate]="bidirectionalTemplate"
            [hasMore]="bidirectionalHasMore()"
            [loadingUp]="bidirectionalLoadingUp()"
            [loadingDown]="bidirectionalLoadingDown()"
            [config]="bidirectionalConfig"
            (loadMore)="loadMoreBidirectional($event)">
          </ui-infinite-scroll-container>
          
          <ng-template #bidirectionalTemplate let-item="item" let-index="index">
            <div class="demo-bidirectional-item">
              <div class="demo-bidirectional-item__content">
                <strong>Message {{ item.id }}</strong>
                <p>{{ item.description }}</p>
                <small>{{ item.timestamp | date:'short' }}</small>
              </div>
            </div>
          </ng-template>
        </div>
      </section>

      <!-- Custom Templates -->
      <section class="demo-section">
        <h3>Custom Loading & Error Templates</h3>
        <div class="demo-showcase">
          <ui-infinite-scroll-container
            class="demo-scroll-container"
            [items]="customItems()"
            [itemTemplate]="customItemTemplate"
            [loadingTemplate]="customLoadingTemplate"
            [errorTemplate]="customErrorTemplate"
            [endTemplate]="customEndTemplate"
            [hasMore]="customHasMore()"
            [loading]="customLoading()"
            [error]="customError()"
            [config]="customConfig"
            (loadMore)="loadMoreCustom($event)"
            (retryRequested)="retryCustom()">
          </ui-infinite-scroll-container>
          
          <ng-template #customItemTemplate let-item="item">
            <div class="demo-custom-item">
              <div class="demo-custom-item__avatar">
                {{ item.title.charAt(0) }}
              </div>
              <div class="demo-custom-item__content">
                <h4>{{ item.title }}</h4>
                <p>{{ item.description }}</p>
                <span class="demo-custom-item__time">{{ getTimeAgo(item.timestamp) }}</span>
              </div>
            </div>
          </ng-template>
          
          <ng-template #customLoadingTemplate>
            <div class="demo-custom-loading">
              <div class="demo-custom-loading__spinner"></div>
              <span>Loading amazing content...</span>
            </div>
          </ng-template>
          
          <ng-template #customErrorTemplate let-error="error">
            <div class="demo-custom-error">
              <div class="demo-custom-error__icon">⚠️</div>
              <h4>Oops! Something went wrong</h4>
              <p>{{ error }}</p>
            </div>
          </ng-template>
          
          <ng-template #customEndTemplate>
            <div class="demo-custom-end">
              <div class="demo-custom-end__icon">🎉</div>
              <h4>That's all folks!</h4>
              <p>You've reached the end of our amazing content.</p>
            </div>
          </ng-template>
        </div>
      </section>

      <!-- Configuration Examples -->
      <section class="demo-section">
        <h3>Configuration Options</h3>
        <div class="demo-controls">
          <div class="demo-control">
            <label>
              <input type="checkbox" [checked]="disableScroll()" (change)="toggleDisabled($event)">
              Disable Infinite Scroll
            </label>
          </div>
          <div class="demo-control">
            <label>
              Threshold: {{ threshold() }}px
              <input 
                type="range" 
                min="50" 
                max="500" 
                [value]="threshold()" 
                (input)="updateThreshold($event)">
            </label>
          </div>
          <div class="demo-control">
            <label>
              Debounce Time: {{ debounceTime() }}ms
              <input 
                type="range" 
                min="50" 
                max="1000" 
                [value]="debounceTime()" 
                (input)="updateDebounceTime($event)">
            </label>
          </div>
        </div>
        
        <div class="demo-showcase">
          <ui-infinite-scroll-container
            class="demo-scroll-container"
            [items]="configItems()"
            [itemTemplate]="configItemTemplate"
            [hasMore]="configHasMore()"
            [loading]="configLoading()"
            [config]="currentConfig()"
            (loadMore)="loadMoreConfig($event)">
          </ui-infinite-scroll-container>
          
          <ng-template #configItemTemplate let-item="item" let-index="index">
            <div class="demo-config-item">
              <span class="demo-config-item__index">{{ index + 1 }}</span>
              <div class="demo-config-item__content">
                <h4>{{ item.title }}</h4>
                <p>{{ item.description }}</p>
              </div>
            </div>
          </ng-template>
        </div>
      </section>

      <!-- API Methods Demo -->
      <section class="demo-section">
        <h3>API Methods</h3>
        <div class="demo-controls">
          <button type="button" (click)="scrollToTop()">Scroll to Top</button>
          <button type="button" (click)="scrollToBottom()">Scroll to Bottom</button>
          <button type="button" (click)="scrollToIndex(50)">Scroll to Item 50</button>
          <button type="button" (click)="resetApiScroll()">Reset Scroll</button>
        </div>
      </section>
    </div>
  `,
  styleUrl: './infinite-scroll-container-demo.component.scss'
})
export class InfiniteScrollContainerDemoComponent {
  @ViewChild('itemTemplate') itemTemplate!: TemplateRef<any>;
  
  // Basic example
  basicItems = signal<DemoItem[]>([]);
  basicLoading = signal(false);
  basicHasMore = signal(true);
  private basicPage = 1;

  // Template example
  templateItems = signal<DemoItem[]>([]);
  templateLoading = signal(false);
  templateHasMore = signal(true);
  private templatePage = 1;
  
  templateConfig: InfiniteScrollConfig = {
    threshold: 100,
    debounceTime: 150,
    itemHeight: 120
  };

  // Bidirectional example
  bidirectionalItems = signal<DemoItem[]>([]);
  bidirectionalLoadingUp = signal(false);
  bidirectionalLoadingDown = signal(false);
  bidirectionalHasMore = signal(true);
  private bidirectionalTopPage = 0;
  private bidirectionalBottomPage = 1;
  
  bidirectionalConfig: InfiniteScrollConfig = {
    threshold: 50,
    debounceTime: 200
  };

  // Custom templates example
  customItems = signal<DemoItem[]>([]);
  customLoading = signal(false);
  customHasMore = signal(true);
  customError = signal<string | undefined>(undefined);
  private customPage = 1;
  private customFailCount = 0;
  
  customConfig: InfiniteScrollConfig = {
    threshold: 150,
    debounceTime: 100
  };

  // Configuration example
  configItems = signal<DemoItem[]>([]);
  configLoading = signal(false);
  configHasMore = signal(true);
  private configPage = 1;

  // Configuration controls
  threshold = signal(200);
  debounceTime = signal(300);
  disableScroll = signal(false);

  currentConfig = signal<InfiniteScrollConfig>({
    threshold: 200,
    debounceTime: 300,
    disabled: false
  });

  constructor() {
    // Initialize with some data
    this.loadInitialData();
  }

  // Track by function for template rendering
  trackByFn = (index: number, item: DemoItem) => item.id;

  // Basic example methods
  loadMoreBasic(event: InfiniteScrollEvent): void {
    if (this.basicLoading()) return;

    this.basicLoading.set(true);
    
    // Simulate API call
    setTimeout(() => {
      const newItems = this.generateItems(this.basicPage * 20, 20, 'basic');
      this.basicItems.update(items => [...items, ...newItems]);
      this.basicPage++;
      this.basicLoading.set(false);
      
      // Stop loading after 5 pages
      if (this.basicPage > 5) {
        this.basicHasMore.set(false);
      }
    }, 1000);
  }

  // Template example methods
  loadMoreTemplate(event: InfiniteScrollEvent): void {
    if (this.templateLoading()) return;

    this.templateLoading.set(true);
    
    setTimeout(() => {
      const newItems = this.generateItems(this.templatePage * 15, 15, 'template');
      this.templateItems.update(items => [...items, ...newItems]);
      this.templatePage++;
      this.templateLoading.set(false);
      
      if (this.templatePage > 6) {
        this.templateHasMore.set(false);
      }
    }, 800);
  }

  // Bidirectional example methods
  loadMoreBidirectional(event: InfiniteScrollEvent): void {
    if (event.direction === 'down') {
      this.loadMoreBidirectionalDown();
    } else {
      this.loadMoreBidirectionalUp();
    }
  }

  private loadMoreBidirectionalDown(): void {
    if (this.bidirectionalLoadingDown()) return;

    this.bidirectionalLoadingDown.set(true);
    
    setTimeout(() => {
      const newItems = this.generateItems(this.bidirectionalBottomPage * 10, 10, 'chat');
      this.bidirectionalItems.update(items => [...items, ...newItems]);
      this.bidirectionalBottomPage++;
      this.bidirectionalLoadingDown.set(false);
    }, 600);
  }

  private loadMoreBidirectionalUp(): void {
    if (this.bidirectionalLoadingUp()) return;

    this.bidirectionalLoadingUp.set(true);
    
    setTimeout(() => {
      const startId = this.bidirectionalTopPage * 10;
      const newItems = this.generateItems(startId, 10, 'history');
      this.bidirectionalItems.update(items => [...newItems, ...items]);
      this.bidirectionalTopPage--;
      this.bidirectionalLoadingUp.set(false);
    }, 800);
  }

  // Custom templates example methods
  loadMoreCustom(event: InfiniteScrollEvent): void {
    if (this.customLoading()) return;

    this.customLoading.set(true);
    this.customError.set(undefined);
    
    // Simulate occasional failures
    const shouldFail = Math.random() < 0.3 && this.customFailCount < 2;
    
    setTimeout(() => {
      if (shouldFail) {
        this.customError.set('Network error: Failed to load more items');
        this.customLoading.set(false);
        this.customFailCount++;
      } else {
        const newItems = this.generateItems(this.customPage * 12, 12, 'custom');
        this.customItems.update(items => [...items, ...newItems]);
        this.customPage++;
        this.customLoading.set(false);
        
        if (this.customPage > 4) {
          this.customHasMore.set(false);
        }
      }
    }, 1200);
  }

  retryCustom(): void {
    this.loadMoreCustom({ direction: 'down', currentIndex: 0, scrollPosition: 0 });
  }

  // Configuration example methods
  loadMoreConfig(event: InfiniteScrollEvent): void {
    if (this.configLoading()) return;

    this.configLoading.set(true);
    
    setTimeout(() => {
      const newItems = this.generateItems(this.configPage * 10, 10, 'config');
      this.configItems.update(items => [...items, ...newItems]);
      this.configPage++;
      this.configLoading.set(false);
      
      if (this.configPage > 10) {
        this.configHasMore.set(false);
      }
    }, 500);
  }

  // Configuration controls
  toggleDisabled(event: Event): void {
    const disabled = (event.target as HTMLInputElement).checked;
    this.disableScroll.set(disabled);
    this.updateCurrentConfig();
  }

  updateThreshold(event: Event): void {
    const value = parseInt((event.target as HTMLInputElement).value);
    this.threshold.set(value);
    this.updateCurrentConfig();
  }

  updateDebounceTime(event: Event): void {
    const value = parseInt((event.target as HTMLInputElement).value);
    this.debounceTime.set(value);
    this.updateCurrentConfig();
  }

  private updateCurrentConfig(): void {
    this.currentConfig.set({
      threshold: this.threshold(),
      debounceTime: this.debounceTime(),
      disabled: this.disableScroll()
    });
  }

  // API methods - These would be called on component references
  scrollToTop(): void {
    console.log('Scroll to top - would call component method');
  }

  scrollToBottom(): void {
    console.log('Scroll to bottom - would call component method');
  }

  scrollToIndex(index: number): void {
    console.log(`Scroll to index ${index} - would call component method`);
  }

  resetApiScroll(): void {
    console.log('Reset scroll - would call component method');
  }

  // Utility methods
  getTimeAgo(date: Date): string {
    const now = new Date();
    const diff = now.getTime() - date.getTime();
    const minutes = Math.floor(diff / (1000 * 60));
    
    if (minutes < 1) return 'Just now';
    if (minutes < 60) return `${minutes}m ago`;
    if (minutes < 1440) return `${Math.floor(minutes / 60)}h ago`;
    return `${Math.floor(minutes / 1440)}d ago`;
  }

  private loadInitialData(): void {
    // Load initial data for all examples
    this.basicItems.set(this.generateItems(1, 20, 'basic'));
    this.templateItems.set(this.generateItems(1, 15, 'template'));
    this.bidirectionalItems.set(this.generateItems(1, 20, 'chat'));
    this.customItems.set(this.generateItems(1, 12, 'custom'));
    this.configItems.set(this.generateItems(1, 10, 'config'));
  }

  private generateItems(startId: number, count: number, type: string): DemoItem[] {
    const categories = ['Technology', 'Science', 'Arts', 'Sports', 'Travel', 'Food', 'Music', 'Literature'];
    
    return Array.from({ length: count }, (_, i) => ({
      id: startId + i,
      title: `${type.charAt(0).toUpperCase() + type.slice(1)} Item ${startId + i}`,
      description: `This is a sample description for ${type} item ${startId + i}. It contains some interesting content that demonstrates the infinite scroll functionality.`,
      timestamp: new Date(Date.now() - Math.random() * 86400000 * 30), // Random date within last 30 days
      category: categories[Math.floor(Math.random() * categories.length)]
    }));
  }
}}F^x\import { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { TextInputComponent } from '../../../../../ui-essentials/src/lib/components/forms/input/text-input.component';
import { TextareaComponent } from '../../../../../ui-essentials/src/lib/components/forms/input/textarea.component';
import { InputWrapperComponent } from '../../../../../ui-essentials/src/lib/components/forms/input/input-wrapper.component';
import { faSearch, faEnvelope, faEdit } from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-input-demo',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    TextInputComponent,
    TextareaComponent,
    InputWrapperComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Input Component Showcase</h2>
      
      <!-- Text Input Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Text Input Variants</h3>
        
        <!-- Outlined Variant -->
        <div style="margin-bottom: 2rem;">
          <h4>Outlined (Default)</h4>
          <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
            <ui-text-input
              label="Small Outlined"
              placeholder="Enter text..."
              size="sm"
              variant="outlined"
              [(ngModel)]="textValues['outlined-sm']"
              (inputChange)="handleInputChange('outlined-sm', $event)"
            />
            <ui-text-input
              label="Medium Outlined"
              placeholder="Enter text..."
              size="md"
              variant="outlined"
              [(ngModel)]="textValues['outlined-md']"
              (inputChange)="handleInputChange('outlined-md', $event)"
            />
            <ui-text-input
              label="Large Outlined"
              placeholder="Enter text..."
              size="lg"
              variant="outlined"
              [(ngModel)]="textValues['outlined-lg']"
              (inputChange)="handleInputChange('outlined-lg', $event)"
            />
          </div>
        </div>

        <!-- Filled Variant -->
        <div style="margin-bottom: 2rem;">
          <h4>Filled</h4>
          <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
            <ui-text-input
              label="Small Filled"
              placeholder="Enter text..."
              size="sm"
              variant="filled"
              [(ngModel)]="textValues['filled-sm']"
              (inputChange)="handleInputChange('filled-sm', $event)"
            />
            <ui-text-input
              label="Medium Filled"
              placeholder="Enter text..."
              size="md"
              variant="filled"
              [(ngModel)]="textValues['filled-md']"
              (inputChange)="handleInputChange('filled-md', $event)"
            />
            <ui-text-input
              label="Large Filled"
              placeholder="Enter text..."
              size="lg"
              variant="filled"
              [(ngModel)]="textValues['filled-lg']"
              (inputChange)="handleInputChange('filled-lg', $event)"
            />
          </div>
        </div>

        <!-- Underlined Variant -->
        <div style="margin-bottom: 2rem;">
          <h4>Underlined</h4>
          <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
            <ui-text-input
              label="Small Underlined"
              placeholder="Enter text..."
              size="sm"
              variant="underlined"
              [(ngModel)]="textValues['underlined-sm']"
              (inputChange)="handleInputChange('underlined-sm', $event)"
            />
            <ui-text-input
              label="Medium Underlined"
              placeholder="Enter text..."
              size="md"
              variant="underlined"
              [(ngModel)]="textValues['underlined-md']"
              (inputChange)="handleInputChange('underlined-md', $event)"
            />
            <ui-text-input
              label="Large Underlined"
              placeholder="Enter text..."
              size="lg"
              variant="underlined"
              [(ngModel)]="textValues['underlined-lg']"
              (inputChange)="handleInputChange('underlined-lg', $event)"
            />
          </div>
        </div>
      </section>

      <!-- Input Types -->
      <section style="margin-bottom: 3rem;">
        <h3>Input Types</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
          <ui-text-input
            label="Email Input"
            placeholder="email@example.com"
            type="email"
            variant="outlined"
            [(ngModel)]="textValues['email']"
            (inputChange)="handleInputChange('email', $event)"
          />
          <ui-text-input
            label="Password Input"
            placeholder="Enter password"
            type="password"
            variant="outlined"
            [(ngModel)]="textValues['password']"
            (inputChange)="handleInputChange('password', $event)"
          />
          <ui-text-input
            label="Search Input"
            placeholder="Search..."
            type="search"
            variant="outlined"
            [(ngModel)]="textValues['search']"
            (inputChange)="handleInputChange('search', $event)"
          />
          <ui-text-input
            label="Number Input"
            placeholder="Enter number"
            type="number"
            variant="outlined"
            min="0"
            max="100"
            step="1"
            [(ngModel)]="textValues['number']"
            (inputChange)="handleInputChange('number', $event)"
          />
          <ui-text-input
            label="Tel Input"
            placeholder="+1 (555) 000-0000"
            type="tel"
            variant="outlined"
            [(ngModel)]="textValues['tel']"
            (inputChange)="handleInputChange('tel', $event)"
          />
          <ui-text-input
            label="URL Input"
            placeholder="https://example.com"
            type="url"
            variant="outlined"
            [(ngModel)]="textValues['url']"
            (inputChange)="handleInputChange('url', $event)"
          />
        </div>
      </section>

      <!-- Input States -->
      <section style="margin-bottom: 3rem;">
        <h3>Input States</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
          <ui-text-input
            label="Default State"
            placeholder="Enter text..."
            variant="outlined"
            state="default"
            helperText="This is helper text"
            [(ngModel)]="textValues['state-default']"
            (inputChange)="handleInputChange('state-default', $event)"
          />
          <ui-text-input
            label="Error State"
            placeholder="Enter text..."
            variant="outlined"
            state="error"
            errorMessage="This field has an error"
            [(ngModel)]="textValues['state-error']"
            (inputChange)="handleInputChange('state-error', $event)"
          />
          <ui-text-input
            label="Success State"
            placeholder="Enter text..."
            variant="outlined"
            state="success"
            helperText="Input is valid!"
            [(ngModel)]="textValues['state-success']"
            (inputChange)="handleInputChange('state-success', $event)"
          />
          <ui-text-input
            label="Warning State"
            placeholder="Enter text..."
            variant="outlined"
            state="warning"
            helperText="Please double-check this value"
            [(ngModel)]="textValues['state-warning']"
            (inputChange)="handleInputChange('state-warning', $event)"
          />
        </div>
      </section>

      <!-- Inputs with Icons and Features -->
      <section style="margin-bottom: 3rem;">
        <h3>Inputs with Icons and Features</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
          <ui-text-input
            label="Prefix Icon"
            placeholder="Search..."
            variant="outlined"
            [prefixIcon]="faSearch"
            [clearable]="true"
            [(ngModel)]="textValues['prefix-icon']"
            (inputChange)="handleInputChange('prefix-icon', $event)"
          />
          <ui-text-input
            label="Prefix Text"
            placeholder="0.00"
            variant="outlined"
            prefixText="$"
            [(ngModel)]="textValues['prefix-text']"
            (inputChange)="handleInputChange('prefix-text', $event)"
          />
          <ui-text-input
            label="Suffix Icon"
            placeholder="Enter email"
            variant="outlined"
            [suffixIcon]="faEnvelope"
            [(ngModel)]="textValues['suffix-icon']"
            (inputChange)="handleInputChange('suffix-icon', $event)"
          />
          <ui-text-input
            label="With Clear Button"
            placeholder="Type to see clear button"
            variant="outlined"
            [clearable]="true"
            [(ngModel)]="textValues['clearable']"
            (inputChange)="handleInputChange('clearable', $event)"
            (clear)="handleClear('clearable')"
          />
        </div>
      </section>

      <!-- Special States -->
      <section style="margin-bottom: 3rem;">
        <h3>Special States</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
          <ui-text-input
            label="Disabled Input"
            placeholder="This is disabled"
            variant="outlined"
            [disabled]="true"
            value="Disabled value"
          />
          <ui-text-input
            label="Readonly Input"
            placeholder="This is readonly"
            variant="outlined"
            [readonly]="true"
            value="Readonly value"
          />
          <ui-text-input
            label="Loading Input"
            placeholder="Loading..."
            variant="outlined"
            [loading]="isLoading()"
            [(ngModel)]="textValues['loading']"
            (inputChange)="handleInputChange('loading', $event)"
          />
          <ui-text-input
            label="Required Input"
            placeholder="This field is required"
            variant="outlined"
            [required]="true"
            helperText="Required field"
            [(ngModel)]="textValues['required']"
            (inputChange)="handleInputChange('required', $event)"
          />
        </div>
      </section>

      <!-- Character Limit -->
      <section style="margin-bottom: 3rem;">
        <h3>Character Limit</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
          <ui-text-input
            label="Tweet (280 chars)"
            placeholder="What's happening?"
            variant="outlined"
            [maxLength]="280"
            [showCharacterCount]="true"
            [(ngModel)]="textValues['tweet']"
            (inputChange)="handleInputChange('tweet', $event)"
          />
          <ui-text-input
            label="Short Bio (100 chars)"
            placeholder="Tell us about yourself"
            variant="filled"
            [maxLength]="100"
            [showCharacterCount]="true"
            [(ngModel)]="textValues['bio']"
            (inputChange)="handleInputChange('bio', $event)"
          />
        </div>
      </section>

      <!-- Textarea Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Textarea Variants</h3>
        
        <!-- Basic Textareas -->
        <div style="margin-bottom: 2rem;">
          <h4>Basic Textareas</h4>
          <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 1.5rem;">
            <ui-textarea
              label="Small Textarea"
              placeholder="Enter your message..."
              size="sm"
              variant="outlined"
              [rows]="3"
              [(ngModel)]="textValues['textarea-sm']"
              (textareaChange)="handleInputChange('textarea-sm', $event)"
            />
            <ui-textarea
              label="Medium Textarea"
              placeholder="Enter your message..."
              size="md"
              variant="outlined"
              [rows]="4"
              [(ngModel)]="textValues['textarea-md']"
              (textareaChange)="handleInputChange('textarea-md', $event)"
            />
            <ui-textarea
              label="Large Textarea"
              placeholder="Enter your message..."
              size="lg"
              variant="outlined"
              [rows]="5"
              [(ngModel)]="textValues['textarea-lg']"
              (textareaChange)="handleInputChange('textarea-lg', $event)"
            />
          </div>
        </div>

        <!-- Textarea Variants -->
        <div style="margin-bottom: 2rem;">
          <h4>Textarea Variants</h4>
          <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 1.5rem;">
            <ui-textarea
              label="Filled Textarea"
              placeholder="Enter your message..."
              variant="filled"
              [(ngModel)]="textValues['textarea-filled']"
              (textareaChange)="handleInputChange('textarea-filled', $event)"
            />
            <ui-textarea
              label="Underlined Textarea"
              placeholder="Enter your message..."
              variant="underlined"
              [(ngModel)]="textValues['textarea-underlined']"
              (textareaChange)="handleInputChange('textarea-underlined', $event)"
            />
          </div>
        </div>

        <!-- Textarea with Features -->
        <div style="margin-bottom: 2rem;">
          <h4>Textarea with Features</h4>
          <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 1.5rem;">
            <ui-textarea
              label="Auto-resize Textarea"
              placeholder="Type to see auto-resize in action..."
              variant="outlined"
              [autoResize]="true"
              [rows]="2"
              [(ngModel)]="textValues['textarea-auto']"
              (textareaChange)="handleInputChange('textarea-auto', $event)"
            />
            <ui-textarea
              label="Character Limited"
              placeholder="Maximum 500 characters..."
              variant="outlined"
              [maxLength]="500"
              [showCharacterCount]="true"
              [clearable]="true"
              [(ngModel)]="textValues['textarea-limited']"
              (textareaChange)="handleInputChange('textarea-limited', $event)"
              (clear)="handleClear('textarea-limited')"
            />
          </div>
        </div>

        <!-- Textarea States -->
        <div style="margin-bottom: 2rem;">
          <h4>Textarea States</h4>
          <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 1.5rem;">
            <ui-textarea
              label="Error Textarea"
              placeholder="This has an error..."
              variant="outlined"
              state="error"
              errorMessage="Please provide valid feedback"
              [(ngModel)]="textValues['textarea-error']"
              (textareaChange)="handleInputChange('textarea-error', $event)"
            />
            <ui-textarea
              label="Success Textarea"
              placeholder="This looks good..."
              variant="outlined"
              state="success"
              helperText="Thank you for your feedback!"
              [(ngModel)]="textValues['textarea-success']"
              (textareaChange)="handleInputChange('textarea-success', $event)"
            />
          </div>
        </div>
      </section>

      <!-- Input Wrapper -->
      <section style="margin-bottom: 3rem;">
        <h3>Input Wrapper (Dynamic)</h3>
        <div style="margin-bottom: 1rem;">
          <label>
            <input 
              type="checkbox" 
              [checked]="useTextarea()" 
              (change)="toggleInputMode()"
            />
            Switch to {{ useTextarea() ? 'Text Input' : 'Textarea' }}
          </label>
        </div>
        <div style="max-width: 500px;">
          <ui-input-wrapper
            [mode]="useTextarea() ? 'textarea' : 'input'"
            label="Dynamic Input"
            placeholder="This switches between input and textarea..."
            variant="outlined"
            [clearable]="true"
            [prefixIcon]="faEdit"
            helperText="Switch the checkbox above to change input type"
            [(ngModel)]="textValues['wrapper']"
            (inputChange)="handleInputChange('wrapper', $event)"
            (clear)="handleClear('wrapper')"
          />
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Text Input:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-text-input
  label="Email"
  placeholder="Enter your email"
  type="email"
  variant="outlined"
  size="md"
  [(ngModel)]="email"
  (inputChange)="handleEmailChange($event)"&gt;
&lt;/ui-text-input&gt;</code></pre>
          
          <h4>Text Input with Icons:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-text-input
  label="Search"
  placeholder="Search products..."
  type="search"
  variant="filled"
  [prefixIcon]="faSearch"
  [clearable]="true"
  [(ngModel)]="searchTerm"
  (inputChange)="handleSearch($event)"&gt;
&lt;/ui-text-input&gt;</code></pre>

          <h4>Textarea:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-textarea
  label="Message"
  placeholder="Enter your message..."
  variant="outlined"
  [rows]="4"
  [maxLength]="500"
  [showCharacterCount]="true"
  [(ngModel)]="message"
  (textareaChange)="handleMessageChange($event)"&gt;
&lt;/ui-textarea&gt;</code></pre>

          <h4>Input Wrapper:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-input-wrapper
  [mode]="inputMode"
  label="Dynamic Input"
  placeholder="Switches between input and textarea"
  variant="outlined"
  [prefixIcon]="faEdit"
  [(ngModel)]="content"
  (inputChange)="handleContentChange($event)"&gt;
&lt;/ui-input-wrapper&gt;</code></pre>
        </div>
      </section>

      <!-- Interactive Example -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Actions</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button 
            type="button" 
            style="padding: 0.5rem 1rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleLoading()"
          >
            {{ isLoading() ? 'Stop Loading' : 'Start Loading' }}
          </button>
          <button 
            type="button" 
            style="padding: 0.5rem 1rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="fillSampleData()"
          >
            Fill Sample Data
          </button>
          <button 
            type="button" 
            style="padding: 0.5rem 1rem; background: #dc3545; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="clearAllInputs()"
          >
            Clear All
          </button>
        </div>
        
        @if (lastChangedInput()) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last changed:</strong> {{ lastChangedInput() }} = "{{ lastChangedValue() }}"
          </div>
        }
      </section>

      <!-- Values Display -->
      <section style="margin-bottom: 3rem;">
        <h3>Current Values</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; max-height: 300px; overflow-y: auto;">
          <pre>{{ getValuesAsJson() }}</pre>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }

    button {
      transition: all 0.2s ease-in-out;
    }

    button:hover {
      opacity: 0.9;
      transform: translateY(-1px);
    }

    label {
      display: flex;
      align-items: center;
      gap: 0.5rem;
      font-weight: 500;
      cursor: pointer;
    }
  `]
})
export class InputDemoComponent {
  textValues: Record<string, string> = {};
  lastChangedInput = signal<string>('');
  lastChangedValue = signal<string>('');
  isLoading = signal<boolean>(false);
  useTextarea = signal<boolean>(false);

  // FontAwesome icons
  readonly faSearch = faSearch;
  readonly faEnvelope = faEnvelope;
  readonly faEdit = faEdit;

  handleInputChange(inputName: string, value: string): void {
    this.textValues[inputName] = value;
    this.lastChangedInput.set(inputName);
    this.lastChangedValue.set(value);
    console.log(`Input changed: ${inputName} = "${value}"`);
  }

  handleClear(inputName: string): void {
    this.textValues[inputName] = '';
    this.lastChangedInput.set(inputName);
    this.lastChangedValue.set('(cleared)');
    console.log(`Input cleared: ${inputName}`);
  }

  toggleLoading(): void {
    this.isLoading.set(!this.isLoading());
    console.log(`Loading state: ${this.isLoading() ? 'started' : 'stopped'}`);
  }

  toggleInputMode(): void {
    this.useTextarea.set(!this.useTextarea());
    console.log(`Input mode: ${this.useTextarea() ? 'textarea' : 'input'}`);
  }

  fillSampleData(): void {
    this.textValues = {
      'outlined-md': 'Sample outlined text',
      'email': 'user@example.com',
      'search': 'sample search query',
      'prefix-icon': 'search with icon',
      'textarea-md': 'This is a sample message\nin a textarea component\nwith multiple lines.',
      'wrapper': 'Dynamic wrapper content'
    };
    this.lastChangedInput.set('multiple');
    this.lastChangedValue.set('(sample data filled)');
    console.log('Sample data filled');
  }

  clearAllInputs(): void {
    this.textValues = {};
    this.lastChangedInput.set('all');
    this.lastChangedValue.set('(cleared)');
    console.log('All inputs cleared');
  }

  getValuesAsJson(): string {
    return JSON.stringify(this.textValues, null, 2);
  }
}ul8 xqN'ObL8
 hrx)import { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { KanbanBoardComponent, KanbanColumn, KanbanItem, KanbanDragEvent } from 'ui-essentials';

@Component({
  selector: 'ui-kanban-board-demo',
  standalone: true,
  imports: [CommonModule, KanbanBoardComponent],
  template: `
    <div class="demo-container">
      <h2>Kanban Board Layout Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Small</h4>
            <div style="height: 400px; width: 100%;">
              <ui-kanban-board 
                [columns]="basicColumns()" 
                size="sm" 
                title="Small Kanban Board"
                (itemMoved)="onItemMoved($event)"
                (itemClicked)="onItemClicked($event)">
              </ui-kanban-board>
            </div>
          </div>
          
          <div class="demo-item">
            <h4>Medium (Default)</h4>
            <div style="height: 400px; width: 100%;">
              <ui-kanban-board 
                [columns]="basicColumns()" 
                size="md" 
                title="Medium Kanban Board"
                (itemMoved)="onItemMoved($event)"
                (itemClicked)="onItemClicked($event)">
              </ui-kanban-board>
            </div>
          </div>
          
          <div class="demo-item">
            <h4>Large</h4>
            <div style="height: 400px; width: 100%;">
              <ui-kanban-board 
                [columns]="basicColumns()" 
                size="lg" 
                title="Large Kanban Board"
                (itemMoved)="onItemMoved($event)"
                (itemClicked)="onItemClicked($event)">
              </ui-kanban-board>
            </div>
          </div>
        </div>
      </section>
      
      <!-- Full Featured Example -->
      <section class="demo-section">
        <h3>Full Featured Kanban Board</h3>
        <div style="height: 600px; width: 100%;">
          <ui-kanban-board 
            [columns]="fullColumns()" 
            title="Project Management Board"
            subtitle="Drag and drop items between columns to update their status"
            size="md"
            (itemMoved)="onItemMoved($event)"
            (itemClicked)="onItemClicked($event)">
          </ui-kanban-board>
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Disabled</h4>
            <div style="height: 300px; width: 100%;">
              <ui-kanban-board 
                [columns]="basicColumns()" 
                [disabled]="true" 
                title="Disabled Kanban Board">
              </ui-kanban-board>
            </div>
          </div>
          
          <div class="demo-item">
            <h4>Column with Limits</h4>
            <div style="height: 300px; width: 100%;">
              <ui-kanban-board 
                [columns]="limitedColumns()" 
                title="Limited Capacity Board"
                (itemMoved)="onItemMoved($event)">
              </ui-kanban-board>
            </div>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Events</h3>
        <div style="height: 500px; width: 100%;">
          <ui-kanban-board 
            [columns]="interactiveColumns()" 
            title="Interactive Kanban Board"
            subtitle="Click items or drag them around to see event logging below"
            (itemMoved)="onItemMoved($event)"
            (itemClicked)="onItemClicked($event)">
          </ui-kanban-board>
        </div>
        
        <div class="event-log">
          <h4>Event Log:</h4>
          <div class="events">
            @for (event of eventLog(); track event.id) {
              <div class="event-item">
                <strong>{{ event.type }}:</strong> {{ event.message }}
                <small>{{ event.timestamp | date:'medium' }}</small>
              </div>
            }
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './kanban-board-demo.component.scss'
})
export class KanbanBoardDemoComponent {
  eventLog = signal<Array<{ id: string; type: string; message: string; timestamp: Date }>>([]);
  
  basicColumns(): KanbanColumn[] {
    return [
      {
        id: 'todo',
        title: 'To Do',
        items: [
          { id: '1', title: 'Design homepage', description: 'Create wireframes and mockups' },
          { id: '2', title: 'Setup database', priority: 'high' }
        ]
      },
      {
        id: 'in-progress',
        title: 'In Progress',
        items: [
          { id: '3', title: 'Build API endpoints', priority: 'medium', assignee: 'John' }
        ]
      },
      {
        id: 'done',
        title: 'Done',
        items: [
          { id: '4', title: 'Project setup', description: 'Initialize repository and dependencies' }
        ]
      }
    ];
  }
  
  fullColumns(): KanbanColumn[] {
    return [
      {
        id: 'backlog',
        title: 'Backlog',
        items: [
          {
            id: 'item-1',
            title: 'User Authentication System',
            description: 'Implement login, registration, and password reset functionality',
            priority: 'high',
            tags: ['backend', 'security', 'user-management'],
            assignee: 'Sarah Connor',
            dueDate: new Date(2024, 11, 15)
          },
          {
            id: 'item-2',
            title: 'Dashboard Analytics',
            description: 'Create comprehensive analytics dashboard with charts and metrics',
            priority: 'medium',
            tags: ['frontend', 'analytics', 'charts'],
            assignee: 'John Doe',
            dueDate: new Date(2024, 11, 20)
          },
          {
            id: 'item-3',
            title: 'Mobile Responsiveness',
            description: 'Ensure all pages work correctly on mobile devices',
            priority: 'low',
            tags: ['frontend', 'responsive', 'css'],
            assignee: 'Jane Smith'
          }
        ]
      },
      {
        id: 'todo',
        title: 'To Do',
        items: [
          {
            id: 'item-4',
            title: 'API Rate Limiting',
            description: 'Implement rate limiting for API endpoints to prevent abuse',
            priority: 'high',
            tags: ['backend', 'security', 'performance'],
            assignee: 'Bob Wilson',
            dueDate: new Date(2024, 11, 10)
          },
          {
            id: 'item-5',
            title: 'Email Notifications',
            description: 'Set up email notification system for important events',
            priority: 'medium',
            tags: ['backend', 'email', 'notifications'],
            assignee: 'Alice Brown'
          }
        ]
      },
      {
        id: 'in-progress',
        title: 'In Progress',
        items: [
          {
            id: 'item-6',
            title: 'Database Optimization',
            description: 'Optimize database queries and add proper indexing',
            priority: 'high',
            tags: ['database', 'performance', 'optimization'],
            assignee: 'Mike Johnson',
            dueDate: new Date(2024, 11, 8)
          }
        ]
      },
      {
        id: 'review',
        title: 'In Review',
        items: [
          {
            id: 'item-7',
            title: 'Unit Test Coverage',
            description: 'Increase unit test coverage to 90%',
            priority: 'medium',
            tags: ['testing', 'quality', 'coverage'],
            assignee: 'Lisa Davis',
            dueDate: new Date(2024, 11, 12)
          }
        ]
      },
      {
        id: 'done',
        title: 'Done',
        items: [
          {
            id: 'item-8',
            title: 'Project Setup',
            description: 'Initialize project structure and dependencies',
            priority: 'high',
            tags: ['setup', 'infrastructure'],
            assignee: 'Team Lead'
          },
          {
            id: 'item-9',
            title: 'Design System',
            description: 'Create component library and design tokens',
            priority: 'medium',
            tags: ['design', 'components', 'ui'],
            assignee: 'Design Team'
          }
        ]
      }
    ];
  }
  
  limitedColumns(): KanbanColumn[] {
    return [
      {
        id: 'todo',
        title: 'To Do',
        items: [
          { id: '1', title: 'Task 1' },
          { id: '2', title: 'Task 2' }
        ]
      },
      {
        id: 'limited',
        title: 'Limited (Max 2)',
        maxItems: 2,
        items: [
          { id: '3', title: 'Limited Task 1' },
          { id: '4', title: 'Limited Task 2' }
        ]
      },
      {
        id: 'done',
        title: 'Done',
        items: []
      }
    ];
  }
  
  interactiveColumns(): KanbanColumn[] {
    return [
      {
        id: 'new',
        title: 'New',
        items: [
          { id: 'i1', title: 'Interactive Item 1', description: 'Click me or drag me!' },
          { id: 'i2', title: 'Interactive Item 2', priority: 'high', assignee: 'You' }
        ]
      },
      {
        id: 'active',
        title: 'Active',
        items: [
          { id: 'i3', title: 'Interactive Item 3', priority: 'medium' }
        ]
      },
      {
        id: 'complete',
        title: 'Complete',
        items: []
      }
    ];
  }
  
  onItemMoved(event: KanbanDragEvent): void {
    this.logEvent('Item Moved', 
      `"${event.item.title}" moved from "${event.fromColumn}" to "${event.toColumn}"`
    );
    
    // In a real application, you would update your data here
    console.log('Item moved:', event);
  }
  
  onItemClicked(event: { item: KanbanItem; columnId: string }): void {
    this.logEvent('Item Clicked', 
      `"${event.item.title}" clicked in column "${event.columnId}"`
    );
    
    console.log('Item clicked:', event);
  }
  
  private logEvent(type: string, message: string): void {
    const currentLog = this.eventLog();
    const newEvent = {
      id: Date.now().toString(),
      type,
      message,
      timestamp: new Date()
    };
    
    // Keep only the last 10 events
    const updatedLog = [newEvent, ...currentLog].slice(0, 10);
    this.eventLog.set(updatedLog);
  }
}òxMimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FAQSectionComponent, FAQConfig } from 'ui-landing-pages';

@Component({
  selector: 'app-landing-faq-demo',
  standalone: true,
  imports: [CommonModule, FAQSectionComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="demo-container">
      <div class="demo-header">
        <h1>FAQ Section Demo</h1>
        <p>Interactive FAQ component with accordion functionality and search.</p>
        <div class="under-construction">
          <p><strong>🚧 Under Construction:</strong> This demo is temporarily disabled while the ui-landing-pages library is being built.</p>
        </div>
      </div>

      <!-- Temporarily commented out until ui-landing-pages is built
      <div style="display: none;">
      <div class="demo-section">
        <h2>Default FAQ</h2>
        <ui-lp-faq [configuration]="defaultConfig"></ui-lp-faq>
      </div>

      <!-- Bordered FAQ -->
      <div class="demo-section">
        <h2>Bordered Theme</h2>
        <ui-lp-faq [configuration]="borderedConfig"></ui-lp-faq>
      </div>

      <!-- Minimal FAQ -->
      <div class="demo-section">
        <h2>Minimal Theme</h2>
        <ui-lp-faq [configuration]="minimalConfig"></ui-lp-faq>
      </div>

      <!-- Multiple Expand FAQ -->
      <div class="demo-section">
        <h2>Multiple Expand Enabled</h2>
        <ui-lp-faq [configuration]="multipleExpandConfig"></ui-lp-faq>
      </div>
      -->
    </div>
  `,
  styles: [`
    .demo-container {
      max-width: 1200px;
      margin: 0 auto;
      padding: 2rem;
    }

    .demo-header {
      text-align: center;
      margin-bottom: 3rem;
    }

    .demo-header h1 {
      font-size: 2.5rem;
      margin-bottom: 1rem;
      color: #1a1a1a;
    }

    .demo-header p {
      font-size: 1.125rem;
      color: #666;
    }

    .demo-section {
      margin-bottom: 4rem;
    }

    .demo-section h2 {
      font-size: 1.5rem;
      margin-bottom: 1.5rem;
      color: #333;
      border-bottom: 2px solid #e0e0e0;
      padding-bottom: 0.5rem;
    }
  `]
})
export class LandingFAQDemoComponent {
  defaultConfig: FAQConfig = {
    title: 'Frequently Asked Questions',
    subtitle: 'Find answers to common questions about our platform',
    searchEnabled: true,
    expandMultiple: false,
    theme: 'default',
    items: [
      {
        id: '1',
        question: 'What is included in the free plan?',
        answer: 'The free plan includes up to 5 projects, 2GB storage, and basic support. Perfect for getting started with small projects.'
      },
      {
        id: '2',
        question: 'Can I upgrade or downgrade my plan at any time?',
        answer: 'Yes, you can change your plan at any time. Upgrades take effect immediately, while downgrades take effect at the next billing cycle.'
      },
      {
        id: '3',
        question: 'Is my data secure?',
        answer: 'Absolutely. We use enterprise-grade encryption, regular security audits, and comply with SOC 2 Type II standards to protect your data.'
      },
      {
        id: '4',
        question: 'Do you offer customer support?',
        answer: 'Yes! We provide 24/7 email support for all users, with priority phone support available for Pro and Enterprise customers.'
      },
      {
        id: '5',
        question: 'Can I cancel my subscription anytime?',
        answer: 'Yes, you can cancel your subscription at any time. Your account will remain active until the end of your current billing period.'
      }
    ]
  };

  borderedConfig: FAQConfig = {
    ...this.defaultConfig,
    title: 'Product Questions',
    subtitle: 'Everything you need to know about our product features',
    theme: 'bordered',
    items: [
      {
        id: '6',
        question: 'How do I integrate with third-party services?',
        answer: 'Our platform offers REST APIs, webhooks, and pre-built integrations with popular services like Slack, GitHub, and Zapier.'
      },
      {
        id: '7',
        question: 'What file formats do you support?',
        answer: 'We support all major file formats including PDF, Word, Excel, PowerPoint, images (PNG, JPG, SVG), and various code files.'
      },
      {
        id: '8',
        question: 'Is there a mobile app available?',
        answer: 'Yes! Our mobile apps are available for both iOS and Android, with full feature parity to the web application.'
      }
    ]
  };

  minimalConfig: FAQConfig = {
    ...this.defaultConfig,
    title: 'Technical FAQ',
    subtitle: 'Answers to technical questions',
    theme: 'minimal',
    searchEnabled: false,
    items: [
      {
        id: '9',
        question: 'What are your API rate limits?',
        answer: 'Free accounts: 100 requests/hour. Pro accounts: 1,000 requests/hour. Enterprise: Custom limits based on your needs.'
      },
      {
        id: '10',
        question: 'Do you provide webhooks?',
        answer: 'Yes, we support webhooks for real-time event notifications. You can configure them in your dashboard settings.'
      },
      {
        id: '11',
        question: 'What programming languages do you support?',
        answer: 'We provide SDKs for JavaScript, Python, Ruby, PHP, Go, and .NET. REST APIs are available for any language.'
      }
    ]
  };

  multipleExpandConfig: FAQConfig = {
    ...this.defaultConfig,
    title: 'Detailed FAQ',
    subtitle: 'Comprehensive answers to all your questions',
    expandMultiple: true,
    items: [
      {
        id: '12',
        question: 'How does billing work?',
        answer: 'Billing is processed monthly or annually based on your preference. You can view detailed invoices in your account dashboard and update payment methods anytime.'
      },
      {
        id: '13',
        question: 'Can I export my data?',
        answer: 'Yes, you can export all your data in various formats (CSV, JSON, XML) at any time. Enterprise customers also get automated backup options.'
      },
      {
        id: '14',
        question: 'What happens if I exceed my plan limits?',
        answer: 'If you approach your limits, we\'ll notify you in advance. You can either upgrade your plan or purchase additional resources as needed.'
      }
    ]
  };
}_vxUێ0}WVJ
^O/34*^4Qv+!s́ݭFxS*C4``%UeJ@X㕳$~k9p qlEB!Ѵ΂%"f1kesa#W2)g"1șK\GLy3V<е?кڋxb<o稇ȃ',e1s,xtBHY3C%i]'z?īc8N)/@҃iC<XdI?wi%6lMζE.+g}ZՖ+#	O-{ꑣJNڻqb緢f 	ؙ7h{yN&oӼќ'DvפG;[AuZgaFN'/?82W `B~Lױ>_>äɺRG%USK.}907}ximport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FeatureGridComponent, FeatureGridConfig, FeatureItem } from 'ui-landing-pages';

@Component({
  selector: 'app-landing-feature-grid-demo',
  standalone: true,
  imports: [CommonModule, FeatureGridComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Feature Grid Component</h2>
      <p style="margin-bottom: 2rem; color: #666;">Showcase features in responsive grid layouts with icons, images, and links</p>

    <!-- Basic Feature Grid -->
    <section class="demo-section">
      <h3 class="demo-section__title">Basic Grid</h3>
      <ui-lp-feature-grid 
        [configuration]="basicConfig">
      </ui-lp-feature-grid>
    </section>

    <!-- Card Variant -->
    <section class="demo-section">
      <h3 class="demo-section__title">Card Variant</h3>
      <ui-lp-feature-grid 
        [configuration]="cardConfig">
      </ui-lp-feature-grid>
    </section>

    <!-- Minimal Variant -->
    <section class="demo-section">
      <h3 class="demo-section__title">Minimal Variant</h3>
      <ui-lp-feature-grid 
        [configuration]="minimalConfig">
      </ui-lp-feature-grid>
    </section>

    <!-- List Layout -->
    <section class="demo-section">
      <h3 class="demo-section__title">List Layout</h3>
      <ui-lp-feature-grid 
        [configuration]="listConfig">
      </ui-lp-feature-grid>
    </section>

    <!-- Configuration Code -->
    <section class="demo-section">
      <h3 class="demo-section__title">Configuration</h3>
      <pre class="demo-code">{{ configExample }}</pre>
    </section>
    </div>
  `,
  styleUrl: './landing-feature-grid-demo.component.scss'
})
export class LandingFeatureGridDemoComponent {
  private sampleFeatures: FeatureItem[] = [
    {
      id: 'security',
      title: 'Advanced Security',
      description: 'Enterprise-grade security with end-to-end encryption and compliance certifications.',
      icon: 'shield-alt',
      iconType: 'fa',
      link: {
        url: '#security',
        text: 'Learn more',
        target: '_self'
      }
    },
    {
      id: 'performance',
      title: 'Lightning Fast',
      description: 'Optimized for speed with CDN delivery and smart caching mechanisms.',
      icon: 'bolt',
      iconType: 'fa',
      link: {
        url: '#performance',
        text: 'View benchmarks',
        target: '_self'
      }
    },
    {
      id: 'analytics',
      title: 'Smart Analytics',
      description: 'Gain insights with real-time analytics and customizable dashboards.',
      icon: 'chart-line',
      iconType: 'fa',
      link: {
        url: '#analytics',
        text: 'Explore features',
        target: '_self'
      }
    },
    {
      id: 'support',
      title: '24/7 Support',
      description: 'Get help whenever you need it with our dedicated support team.',
      icon: 'headset',
      iconType: 'fa',
      link: {
        url: '#support',
        text: 'Contact us',
        target: '_self'
      }
    }
  ];

  basicConfig: FeatureGridConfig = {
    title: 'Why Choose Our Platform',
    subtitle: 'Discover the features that make us different',
    features: this.sampleFeatures,
    layout: 'grid',
    columns: 'auto',
    variant: 'card',
    showIcons: true,
    spacing: 'normal'
  };

  cardConfig: FeatureGridConfig = {
    title: 'Platform Features',
    features: this.sampleFeatures,
    layout: 'grid',
    columns: 2,
    variant: 'card',
    showIcons: true,
    spacing: 'loose'
  };

  minimalConfig: FeatureGridConfig = {
    features: this.sampleFeatures.slice(0, 3),
    layout: 'grid',
    columns: 3,
    variant: 'minimal',
    showIcons: true,
    spacing: 'tight'
  };

  listConfig: FeatureGridConfig = {
    title: 'Core Capabilities',
    features: this.sampleFeatures.slice(0, 3),
    layout: 'list',
    variant: 'minimal',
    showIcons: true,
    spacing: 'normal'
  };

  configExample = `const featureGridConfig: FeatureGridConfig = {
  title: 'Why Choose Our Platform',
  subtitle: 'Discover the features that make us different',
  features: [
    {
      id: 'security',
      title: 'Advanced Security',
      description: 'Enterprise-grade security with end-to-end encryption.',
      icon: 'shield-alt',
      iconType: 'fa',
      link: {
        url: '#security',
        text: 'Learn more'
      }
    }
    // ... more features
  ],
  layout: 'grid',
  columns: 'auto',
  variant: 'card',
  showIcons: true,
  spacing: 'normal'
};`;
}8zx%Rimport { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FooterSectionComponent, FooterConfig, FooterLink } from 'ui-landing-pages';
import { ButtonComponent } from 'ui-essentials';
import { VStackComponent } from 'ui-essentials';
import { SectionComponent } from 'ui-essentials';

@Component({
  selector: 'app-landing-footer-demo',
  standalone: true,
  imports: [CommonModule, FooterSectionComponent, ButtonComponent, VStackComponent, SectionComponent],
  template: `
    <ui-vstack [spacing]="'xl'">
      <ui-section>
        <h2>Landing Footer - Light Theme</h2>
        <p>Comprehensive footer with multiple columns, newsletter signup, and social links.</p>
        
        <ui-lp-footer
          [configuration]="lightFooterConfig()"
          (linkClicked)="onLinkClicked($event)"
          (newsletterSubmitted)="onNewsletterSubmitted($event)">
        </ui-lp-footer>
      </ui-section>
      
      <ui-section>
        <h2>Landing Footer - Dark Theme</h2>
        <p>Dark theme footer with company branding and legal links.</p>
        
        <ui-lp-footer
          [configuration]="darkFooterConfig()"
          (linkClicked)="onLinkClicked($event)"
          (newsletterSubmitted)="onNewsletterSubmitted($event)">
        </ui-lp-footer>
      </ui-section>
      
      <ui-section>
        <h2>Landing Footer - Minimal</h2>
        <p>Simple footer with just essential links and copyright.</p>
        
        <ui-lp-footer
          [configuration]="minimalFooterConfig()"
          (linkClicked)="onLinkClicked($event)">
        </ui-lp-footer>
      </ui-section>
      
      <ui-section>
        <h2>Configuration Options</h2>
        <div class="demo-controls">
          <ui-button
            [variant]="'outlined'"
            (clicked)="toggleTheme()"
            class="demo-control">
            Theme: {{ lightFooterConfig().theme }}
          </ui-button>
          
          <ui-button
            [variant]="'outlined'"
            (clicked)="toggleDivider()"
            class="demo-control">
            Show Divider: {{ lightFooterConfig().showDivider ? 'ON' : 'OFF' }}
          </ui-button>
          
          <ui-button
            [variant]="'outlined'"
            (clicked)="addColumn()"
            class="demo-control">
            Add Column
          </ui-button>
          
          <ui-button
            [variant]="'outlined'"
            (clicked)="removeColumn()"
            class="demo-control">
            Remove Column
          </ui-button>
        </div>
      </ui-section>
    </ui-vstack>
  `,
  styles: [`
    .demo-controls {
      display: flex;
      gap: 1rem;
      flex-wrap: wrap;
      margin-top: 1rem;
    }
    
    .demo-control {
      min-width: 150px;
    }
    
    :host {
      display: block;
      padding-bottom: 2rem;
    }
  `]
})
export class LandingFooterDemoComponent {
  lightFooterConfig = signal<FooterConfig>({
    logo: {
      text: 'UI Suite',
      url: '/'
    },
    columns: [
      {
        id: 'product',
        title: 'Product',
        items: [
          { id: 'features', label: 'Features', route: '/features' },
          { id: 'pricing', label: 'Pricing', route: '/pricing' },
          { id: 'integrations', label: 'Integrations', route: '/integrations' },
          { id: 'api', label: 'API', route: '/api' }
        ]
      },
      {
        id: 'company',
        title: 'Company',
        items: [
          { id: 'about', label: 'About Us', route: '/about' },
          { id: 'careers', label: 'Careers', route: '/careers', badge: '5 open' },
          { id: 'blog', label: 'Blog', route: '/blog' },
          { id: 'press', label: 'Press', route: '/press' }
        ]
      },
      {
        id: 'resources',
        title: 'Resources',
        items: [
          { id: 'docs', label: 'Documentation', route: '/docs' },
          { id: 'guides', label: 'Guides', route: '/guides' },
          { id: 'help', label: 'Help Center', route: '/help' },
          { id: 'community', label: 'Community', url: 'https://discord.gg/example', target: '_blank' }
        ]
      },
      {
        id: 'legal',
        title: 'Legal',
        items: [
          { id: 'privacy', label: 'Privacy Policy', route: '/privacy' },
          { id: 'terms', label: 'Terms of Service', route: '/terms' },
          { id: 'cookies', label: 'Cookie Policy', route: '/cookies' },
          { id: 'gdpr', label: 'GDPR', route: '/gdpr' }
        ]
      }
    ],
    newsletter: {
      title: 'Stay Updated',
      description: 'Get the latest news and updates delivered to your inbox.',
      placeholder: 'Enter your email',
      buttonText: 'Subscribe',
      onSubmit: (email: string) => {
        console.log('Newsletter signup:', email);
      }
    },
    socialLinks: [
      { id: 'twitter', platform: 'twitter', url: 'https://twitter.com/example' },
      { id: 'facebook', platform: 'facebook', url: 'https://facebook.com/example' },
      { id: 'linkedin', platform: 'linkedin', url: 'https://linkedin.com/company/example' },
      { id: 'github', platform: 'github', url: 'https://github.com/example' }
    ],
    copyright: '© 2024 UI Suite. All rights reserved.',
    legalLinks: [
      { id: 'privacy', label: 'Privacy', route: '/privacy' },
      { id: 'terms', label: 'Terms', route: '/terms' },
      { id: 'cookies', label: 'Cookies', route: '/cookies' }
    ],
    theme: 'light',
    showDivider: true
  });
  
  darkFooterConfig = signal<FooterConfig>({
    logo: {
      text: 'Dark UI Pro',
      url: '/'
    },
    columns: [
      {
        id: 'solutions',
        title: 'Solutions',
        items: [
          { id: 'enterprise', label: 'Enterprise', route: '/enterprise' },
          { id: 'startups', label: 'Startups', route: '/startups' },
          { id: 'agencies', label: 'Agencies', route: '/agencies' },
          { id: 'developers', label: 'Developers', route: '/developers' }
        ]
      },
      {
        id: 'support',
        title: 'Support',
        items: [
          { id: 'contact', label: 'Contact Us', route: '/contact' },
          { id: 'chat', label: 'Live Chat', action: () => alert('Chat opened!') },
          { id: 'tickets', label: 'Support Tickets', route: '/support' },
          { id: 'status', label: 'System Status', url: 'https://status.example.com', target: '_blank' }
        ]
      },
      {
        id: 'developers',
        title: 'Developers',
        items: [
          { id: 'api-docs', label: 'API Documentation', route: '/api-docs' },
          { id: 'sdk', label: 'SDK', route: '/sdk' },
          { id: 'webhooks', label: 'Webhooks', route: '/webhooks' },
          { id: 'changelog', label: 'Changelog', route: '/changelog' }
        ]
      }
    ],
    newsletter: {
      title: 'Developer Newsletter',
      description: 'Weekly updates on new features, API changes, and developer resources.',
      placeholder: 'developer@company.com',
      buttonText: 'Join',
      onSubmit: (email: string) => {
        console.log('Developer newsletter signup:', email);
      }
    },
    socialLinks: [
      { id: 'github', platform: 'github', url: 'https://github.com/example' },
      { id: 'twitter', platform: 'twitter', url: 'https://twitter.com/example' },
      { id: 'youtube', platform: 'youtube', url: 'https://youtube.com/example' }
    ],
    copyright: '© 2024 Dark UI Pro. Built with ❤️ by developers.',
    legalLinks: [
      { id: 'privacy', label: 'Privacy Policy', route: '/privacy' },
      { id: 'terms', label: 'Terms of Service', route: '/terms' },
      { id: 'security', label: 'Security', route: '/security' }
    ],
    theme: 'dark',
    showDivider: true
  });
  
  minimalFooterConfig = signal<FooterConfig>({
    columns: [
      {
        id: 'quick-links',
        title: 'Quick Links',
        items: [
          { id: 'home', label: 'Home', route: '/' },
          { id: 'about', label: 'About', route: '/about' },
          { id: 'contact', label: 'Contact', route: '/contact' }
        ]
      }
    ],
    copyright: '© 2024 Minimal Footer Example',
    legalLinks: [
      { id: 'privacy', label: 'Privacy', route: '/privacy' },
      { id: 'terms', label: 'Terms', route: '/terms' }
    ],
    theme: 'light',
    showDivider: false
  });
  
  toggleTheme(): void {
    const current = this.lightFooterConfig();
    this.lightFooterConfig.set({
      ...current,
      theme: current.theme === 'light' ? 'dark' : 'light'
    });
  }
  
  toggleDivider(): void {
    const current = this.lightFooterConfig();
    this.lightFooterConfig.set({
      ...current,
      showDivider: !current.showDivider
    });
  }
  
  addColumn(): void {
    const current = this.lightFooterConfig();
    const newColumn = {
      id: `column-${current.columns.length + 1}`,
      title: `Column ${current.columns.length + 1}`,
      items: [
        { id: `item-1`, label: 'Item 1', route: '/item-1' },
        { id: `item-2`, label: 'Item 2', route: '/item-2' }
      ]
    };
    
    this.lightFooterConfig.set({
      ...current,
      columns: [...current.columns, newColumn]
    });
  }
  
  removeColumn(): void {
    const current = this.lightFooterConfig();
    if (current.columns.length > 1) {
      this.lightFooterConfig.set({
        ...current,
        columns: current.columns.slice(0, -1)
      });
    }
  }
  
  onLinkClicked(link: FooterLink): void {
    console.log('Footer link clicked:', link);
  }
  
  onNewsletterSubmitted(email: string): void {
    console.log('Newsletter submitted:', email);
    alert(`Newsletter subscription for: ${email}`);
  }
}{xRimport { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { LandingHeaderComponent, CTAButton, LandingHeaderConfig, NavigationItem } from 'ui-landing-pages';
import { ButtonComponent, VStackComponent, SectionComponent } from 'ui-essentials';

@Component({
  selector: 'app-landing-header-demo',
  standalone: true,
  imports: [CommonModule, LandingHeaderComponent, ButtonComponent, VStackComponent, SectionComponent],
  template: `
    <ui-vstack [spacing]="'xl'">
      <ui-section>
        <h2>Landing Header - Light Theme</h2>
        <p>Sticky navigation header with transparent background that becomes solid on scroll.</p>
        
        <ui-lp-header
          [configuration]="lightHeaderConfig()"
          (navigationClicked)="onNavigationClicked($event)"
          (ctaClicked)="onCTAClicked($event)">
        </ui-lp-header>
      </ui-section>
      
      <ui-section>
        <h2>Landing Header - Dark Theme</h2>
        <p>Dark theme version with logo and mega menu navigation.</p>
        
        <ui-lp-header
          [configuration]="darkHeaderConfig()"
          (navigationClicked)="onNavigationClicked($event)"
          (ctaClicked)="onCTAClicked($event)">
        </ui-lp-header>
      </ui-section>
      
      <ui-section>
        <h2>Landing Header - With Dropdown Menu</h2>
        <p>Header with dropdown navigation and badges.</p>
        
        <ui-lp-header
          [configuration]="dropdownHeaderConfig()"
          (navigationClicked)="onNavigationClicked($event)"
          (ctaClicked)="onCTAClicked($event)">
        </ui-lp-header>
      </ui-section>
      
      <ui-section>
        <h2>Configuration Options</h2>
        <div class="demo-controls">
          <ui-button
            [variant]="'outlined'"
            (clicked)="toggleTransparent()"
            class="demo-control">
            Toggle Transparent: {{ lightHeaderConfig().transparent ? 'ON' : 'OFF' }}
          </ui-button>
          
          <ui-button
            [variant]="'outlined'"
            (clicked)="toggleSticky()"
            class="demo-control">
            Toggle Sticky: {{ lightHeaderConfig().sticky ? 'ON' : 'OFF' }}
          </ui-button>
          
          <ui-button
            [variant]="'outlined'"
            (clicked)="toggleMobileMenu()"
            class="demo-control">
            Toggle Mobile Menu: {{ lightHeaderConfig().showMobileMenu ? 'ON' : 'OFF' }}
          </ui-button>
        </div>
      </ui-section>
      
      <!-- Content to demonstrate scroll behavior -->
      <ui-section>
        <h3>Scroll Content</h3>
        <div style="height: 100vh; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); display: flex; align-items: center; justify-content: center; color: white; font-size: 2rem;">
          Scroll to see header behavior
        </div>
      </ui-section>
      
      <ui-section>
        <h3>More Content</h3>
        <div style="height: 100vh; background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); display: flex; align-items: center; justify-content: center; color: white; font-size: 2rem;">
          Keep scrolling...
        </div>
      </ui-section>
    </ui-vstack>
  `,
  styles: [`
    .demo-controls {
      display: flex;
      gap: 1rem;
      flex-wrap: wrap;
      margin-top: 1rem;
    }
    
    .demo-control {
      min-width: 200px;
    }
    
    :host {
      display: block;
      padding-bottom: 2rem;
    }
  `]
})
export class LandingHeaderDemoComponent {
  lightHeaderConfig = signal<LandingHeaderConfig>({
    logo: {
      text: 'UI Suite',
      url: '/'
    },
    navigation: [
      {
        id: 'home',
        label: 'Home',
        route: '/',
      },
      {
        id: 'features',
        label: 'Features',
        route: '/features',
      },
      {
        id: 'pricing',
        label: 'Pricing',
        route: '/pricing',
      },
      {
        id: 'about',
        label: 'About',
        route: '/about',
      },
      {
        id: 'contact',
        label: 'Contact',
        route: '/contact',
      }
    ],
    ctaButton: {
      text: 'Get Started',
      variant: 'filled',
      size: 'medium',
      action: () => alert('CTA clicked!')
    },
    transparent: true,
    sticky: true,
    showMobileMenu: true,
    maxWidth: 'xl',
    theme: 'light'
  });
  
  darkHeaderConfig = signal<LandingHeaderConfig>({
    logo: {
      text: 'Dark UI',
      url: '/'
    },
    navigation: [
      {
        id: 'products',
        label: 'Products',
        route: '/products',
      },
      {
        id: 'solutions',
        label: 'Solutions',
        route: '/solutions',
      },
      {
        id: 'resources',
        label: 'Resources',
        route: '/resources',
      },
      {
        id: 'company',
        label: 'Company',
        route: '/company',
      }
    ],
    ctaButton: {
      text: 'Start Free Trial',
      variant: 'filled',
      size: 'medium',
      icon: '🚀',
      action: () => alert('Free trial started!')
    },
    transparent: false,
    sticky: true,
    showMobileMenu: true,
    maxWidth: 'xl',
    theme: 'dark'
  });
  
  dropdownHeaderConfig = signal<LandingHeaderConfig>({
    logo: {
      text: 'Dropdown Demo',
      url: '/'
    },
    navigation: [
      {
        id: 'home',
        label: 'Home',
        route: '/',
      },
      {
        id: 'products',
        label: 'Products',
        children: [
          {
            id: 'ui-kit',
            label: 'UI Kit',
            route: '/products/ui-kit',
            badge: 'New'
          },
          {
            id: 'components',
            label: 'Components',
            route: '/products/components',
          },
          {
            id: 'templates',
            label: 'Templates',
            route: '/products/templates',
            badge: 'Pro'
          }
        ]
      },
      {
        id: 'docs',
        label: 'Documentation',
        children: [
          {
            id: 'getting-started',
            label: 'Getting Started',
            route: '/docs/getting-started',
          },
          {
            id: 'api',
            label: 'API Reference',
            route: '/docs/api',
          },
          {
            id: 'examples',
            label: 'Examples',
            route: '/docs/examples',
          }
        ]
      },
      {
        id: 'support',
        label: 'Support',
        route: '/support',
        badge: '24/7'
      }
    ],
    ctaButton: {
      text: 'Contact Sales',
      variant: 'tonal',
      size: 'medium',
      action: () => alert('Contact sales clicked!')
    },
    transparent: false,
    sticky: true,
    showMobileMenu: true,
    maxWidth: 'xl',
    theme: 'light'
  });
  
  toggleTransparent(): void {
    const current = this.lightHeaderConfig();
    this.lightHeaderConfig.set({
      ...current,
      transparent: !current.transparent
    });
  }
  
  toggleSticky(): void {
    const current = this.lightHeaderConfig();
    this.lightHeaderConfig.set({
      ...current,
      sticky: !current.sticky
    });
  }
  
  toggleMobileMenu(): void {
    const current = this.lightHeaderConfig();
    this.lightHeaderConfig.set({
      ...current,
      showMobileMenu: !current.showMobileMenu
    });
  }
  
  onNavigationClicked(item: NavigationItem): void {
    console.log('Navigation clicked:', item);
  }
  
  onCTAClicked(cta: CTAButton): void {
    console.log('CTA clicked:', cta);
  }
}Y7zxqimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { LogoCloudComponent, LogoCloudConfig, LogoItem } from 'ui-landing-pages';

@Component({
  selector: 'app-landing-logo-cloud-demo',
  standalone: true,
  imports: [CommonModule, LogoCloudComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Logo Cloud Component</h2>
      <p style="margin-bottom: 2rem; color: #666;">Display partner and client logos in various layouts</p>

    <!-- Basic Row Layout -->
    <section class="demo-section">
      <h3 class="demo-section__title">Row Layout</h3>
      <ui-lp-logo-cloud 
        [configuration]="rowConfig">
      </ui-lp-logo-cloud>
    </section>

    <!-- Grid Layout -->
    <section class="demo-section">
      <h3 class="demo-section__title">Grid Layout</h3>
      <ui-lp-logo-cloud 
        [configuration]="gridConfig">
      </ui-lp-logo-cloud>
    </section>

    <!-- Marquee Layout -->
    <section class="demo-section">
      <h3 class="demo-section__title">Marquee Layout</h3>
      <ui-lp-logo-cloud 
        [configuration]="marqueeConfig">
      </ui-lp-logo-cloud>
    </section>

    <!-- Configuration Code -->
    <section class="demo-section">
      <h3 class="demo-section__title">Configuration</h3>
      <pre class="demo-code">{{ configExample }}</pre>
    </section>
    </div>
  `,
  styleUrl: './landing-logo-cloud-demo.component.scss'
})
export class LandingLogoCloudDemoComponent {
  private sampleLogos: LogoItem[] = [
    {
      id: 'google',
      name: 'Google',
      logo: 'https://upload.wikimedia.org/wikipedia/commons/2/2f/Google_2015_logo.svg',
      url: 'https://google.com',
      grayscale: false
    },
    {
      id: 'microsoft',
      name: 'Microsoft',
      logo: 'https://upload.wikimedia.org/wikipedia/commons/9/96/Microsoft_logo_%282012%29.svg',
      url: 'https://microsoft.com',
      grayscale: false
    },
    {
      id: 'amazon',
      name: 'Amazon',
      logo: 'https://upload.wikimedia.org/wikipedia/commons/a/a9/Amazon_logo.svg',
      url: 'https://amazon.com',
      grayscale: false
    },
    {
      id: 'apple',
      name: 'Apple',
      logo: 'https://upload.wikimedia.org/wikipedia/commons/f/fa/Apple_logo_black.svg',
      url: 'https://apple.com',
      grayscale: false
    },
    {
      id: 'netflix',
      name: 'Netflix',
      logo: 'https://upload.wikimedia.org/wikipedia/commons/0/08/Netflix_2015_logo.svg',
      url: 'https://netflix.com',
      grayscale: false
    },
    {
      id: 'spotify',
      name: 'Spotify',
      logo: 'https://upload.wikimedia.org/wikipedia/commons/1/19/Spotify_logo_without_text.svg',
      url: 'https://spotify.com',
      grayscale: false
    }
  ];

  rowConfig: LogoCloudConfig = {
    title: 'Trusted by Industry Leaders',
    subtitle: 'Join thousands of companies using our platform',
    logos: this.sampleLogos,
    layout: 'row',
    itemsPerRow: 5,
    grayscale: true,
    hoverEffect: true,
    maxHeight: 60
  };

  gridConfig: LogoCloudConfig = {
    title: 'Our Partners',
    logos: this.sampleLogos,
    layout: 'grid',
    itemsPerRow: 4,
    grayscale: true,
    hoverEffect: true,
    maxHeight: 80
  };

  marqueeConfig: LogoCloudConfig = {
    title: 'Continuous Partnership',
    subtitle: 'Seamlessly scrolling partner showcase',
    logos: this.sampleLogos,
    layout: 'marquee',
    grayscale: true,
    hoverEffect: true,
    maxHeight: 70
  };

  configExample = `const logoCloudConfig: LogoCloudConfig = {
  title: 'Trusted by Industry Leaders',
  subtitle: 'Join thousands of companies using our platform',
  logos: [
    {
      id: 'google',
      name: 'Google',
      logo: 'path/to/google-logo.svg',
      url: 'https://google.com',
      grayscale: false
    }
    // ... more logos
  ],
  layout: 'row',
  itemsPerRow: 5,
  grayscale: true,
  hoverEffect: true,
  maxHeight: 60
};`;
}ߋxwimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { StatisticsDisplayComponent, StatisticsConfig, StatisticItem } from 'ui-landing-pages';

@Component({
  selector: 'app-landing-statistics-demo',
  standalone: true,
  imports: [CommonModule, StatisticsDisplayComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Statistics Display Component</h2>
      <p style="margin-bottom: 2rem; color: #666;">Showcase key metrics with animated counters and various layouts</p>

    <!-- Basic Row Layout -->
    <section class="demo-section">
      <h3 class="demo-section__title">Row Layout - Minimal</h3>
      <ui-lp-statistics-display 
        [configuration]="rowConfig">
      </ui-lp-statistics-display>
    </section>

    <!-- Grid Layout with Cards -->
    <section class="demo-section">
      <h3 class="demo-section__title">Grid Layout - Card Variant</h3>
      <ui-lp-statistics-display 
        [configuration]="cardConfig">
      </ui-lp-statistics-display>
    </section>

    <!-- Primary Background -->
    <section class="demo-section">
      <h3 class="demo-section__title">Primary Background</h3>
      <ui-lp-statistics-display 
        [configuration]="primaryConfig">
      </ui-lp-statistics-display>
    </section>

    <!-- Highlighted Variant -->
    <section class="demo-section">
      <h3 class="demo-section__title">Highlighted Variant</h3>
      <ui-lp-statistics-display 
        [configuration]="highlightedConfig">
      </ui-lp-statistics-display>
    </section>

    <!-- Configuration Code -->
    <section class="demo-section">
      <h3 class="demo-section__title">Configuration</h3>
      <pre class="demo-code">{{ configExample }}</pre>
    </section>
    </div>
  `,
  styleUrl: './landing-statistics-demo.component.scss'
})
export class LandingStatisticsDemoComponent {
  private sampleStatistics: StatisticItem[] = [
    {
      id: 'users',
      value: 150000,
      label: 'Active Users',
      suffix: '+',
      description: 'Growing every day',
      icon: 'users',
      animateValue: true
    },
    {
      id: 'projects',
      value: 25000,
      label: 'Projects Created',
      suffix: '+',
      description: 'Successful deployments',
      icon: 'chart-bar',
      animateValue: true
    },
    {
      id: 'uptime',
      value: 99.9,
      label: 'Uptime',
      suffix: '%',
      description: 'Reliable service',
      icon: 'arrow-up',
      animateValue: true
    },
    {
      id: 'support',
      value: '24/7',
      label: 'Support Available',
      description: 'Round-the-clock assistance',
      icon: 'headset',
      animateValue: false
    }
  ];

  rowConfig: StatisticsConfig = {
    title: 'Platform Performance',
    subtitle: 'See how we\'re making a difference',
    statistics: this.sampleStatistics,
    layout: 'row',
    variant: 'minimal',
    animateOnScroll: true,
    backgroundColor: 'transparent'
  };

  cardConfig: StatisticsConfig = {
    title: 'Success Metrics',
    statistics: this.sampleStatistics,
    layout: 'grid',
    variant: 'card',
    animateOnScroll: true,
    backgroundColor: 'surface'
  };

  primaryConfig: StatisticsConfig = {
    title: 'Key Achievements',
    subtitle: 'Numbers that matter to our community',
    statistics: this.sampleStatistics.slice(0, 3),
    layout: 'row',
    variant: 'minimal',
    animateOnScroll: true,
    backgroundColor: 'primary'
  };

  highlightedConfig: StatisticsConfig = {
    title: 'Performance Indicators',
    statistics: this.sampleStatistics,
    layout: 'grid',
    variant: 'highlighted',
    animateOnScroll: true,
    backgroundColor: 'transparent'
  };

  configExample = `const statisticsConfig: StatisticsConfig = {
  title: 'Platform Performance',
  subtitle: 'See how we're making a difference',
  statistics: [
    {
      id: 'users',
      value: 150000,
      label: 'Active Users',
      suffix: '+',
      description: 'Growing every day',
      icon: 'users',
      animateValue: true
    }
    // ... more statistics
  ],
  layout: 'row',
  variant: 'minimal',
  animateOnScroll: true,
  backgroundColor: 'transparent'
};`;
}8Ixnimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TeamGridComponent, TeamConfig } from 'ui-landing-pages';

@Component({
  selector: 'app-landing-team-demo',
  standalone: true,
  imports: [CommonModule, TeamGridComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="demo-container">
      <div class="demo-header">
        <h1>Team Grid Demo</h1>
        <p>Showcase your team members with professional cards and social links.</p>
      </div>

      <!-- 3 Column Layout -->
      <div class="demo-section">
        <h2>3 Column Layout (Default)</h2>
        <ui-lp-team-grid [configuration]="threeColumnConfig"></ui-lp-team-grid>
      </div>

      <!-- 2 Column Layout -->
      <div class="demo-section">
        <h2>2 Column Layout</h2>
        <ui-lp-team-grid [configuration]="twoColumnConfig"></ui-lp-team-grid>
      </div>

      <!-- 4 Column Layout -->
      <div class="demo-section">
        <h2>4 Column Layout</h2>
        <ui-lp-team-grid [configuration]="fourColumnConfig"></ui-lp-team-grid>
      </div>

      <!-- Without Bio -->
      <div class="demo-section">
        <h2>Without Bio Text</h2>
        <ui-lp-team-grid [configuration]="noBioConfig"></ui-lp-team-grid>
      </div>
    </div>
  `,
  styles: [`
    .demo-container {
      max-width: 1200px;
      margin: 0 auto;
      padding: 2rem;
    }

    .demo-header {
      text-align: center;
      margin-bottom: 3rem;
    }

    .demo-header h1 {
      font-size: 2.5rem;
      margin-bottom: 1rem;
      color: #1a1a1a;
    }

    .demo-header p {
      font-size: 1.125rem;
      color: #666;
    }

    .demo-section {
      margin-bottom: 4rem;
    }

    .demo-section h2 {
      font-size: 1.5rem;
      margin-bottom: 1.5rem;
      color: #333;
      border-bottom: 2px solid #e0e0e0;
      padding-bottom: 0.5rem;
    }
  `]
})
export class LandingTeamDemoComponent {
  threeColumnConfig: TeamConfig = {
    title: 'Meet Our Amazing Team',
    subtitle: 'The talented professionals who make our success possible',
    columns: 3,
    showSocial: true,
    showBio: true,
    members: [
      {
        id: '1',
        name: 'Sarah Johnson',
        role: 'CEO & Founder',
        bio: 'Visionary leader with 15+ years in tech, driving innovation and growth across multiple successful ventures.',
        image: 'https://images.unsplash.com/photo-1494790108755-2616b612b5ff?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/sarahjohnson',
          twitter: 'https://twitter.com/sarahjohnson',
          email: 'sarah@company.com'
        }
      },
      {
        id: '2',
        name: 'Michael Chen',
        role: 'Chief Technology Officer',
        bio: 'Full-stack engineer and architect, passionate about building scalable systems and mentoring developers.',
        image: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/michaelchen',
          github: 'https://github.com/mchen',
          twitter: 'https://twitter.com/michaelchen',
          email: 'michael@company.com'
        }
      },
      {
        id: '3',
        name: 'Emily Rodriguez',
        role: 'Head of Design',
        bio: 'Creative problem-solver specializing in user experience design and building design systems that scale.',
        image: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/emilyrodriguez',
          website: 'https://emilydesigns.com',
          email: 'emily@company.com'
        }
      }
    ]
  };

  twoColumnConfig: TeamConfig = {
    title: 'Leadership Team',
    subtitle: 'The executives guiding our company forward',
    columns: 2,
    showSocial: true,
    showBio: true,
    members: [
      {
        id: '4',
        name: 'David Park',
        role: 'VP of Sales',
        bio: 'Results-driven sales leader with a proven track record of building high-performing teams and exceeding revenue targets.',
        image: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/davidpark',
          email: 'david@company.com'
        }
      },
      {
        id: '5',
        name: 'Lisa Thompson',
        role: 'VP of Marketing',
        bio: 'Strategic marketer focused on brand building, digital growth, and creating authentic connections with our community.',
        image: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/lisathompson',
          twitter: 'https://twitter.com/lisathompson',
          email: 'lisa@company.com'
        }
      }
    ]
  };

  fourColumnConfig: TeamConfig = {
    title: 'Engineering Team',
    subtitle: 'The brilliant minds behind our technology',
    columns: 4,
    showSocial: true,
    showBio: true,
    members: [
      {
        id: '6',
        name: 'Alex Kim',
        role: 'Senior Frontend Developer',
        bio: 'React specialist with a passion for creating beautiful, accessible user interfaces.',
        image: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=300&h=300&fit=crop&crop=face',
        social: {
          github: 'https://github.com/alexkim',
          linkedin: 'https://linkedin.com/in/alexkim'
        }
      },
      {
        id: '7',
        name: 'Maria Santos',
        role: 'Backend Engineer',
        bio: 'Database optimization expert and API architecture enthusiast.',
        image: 'https://images.unsplash.com/photo-1517841905240-472988babdf9?w=300&h=300&fit=crop&crop=face',
        social: {
          github: 'https://github.com/mariasantos',
          linkedin: 'https://linkedin.com/in/mariasantos'
        }
      },
      {
        id: '8',
        name: 'James Wilson',
        role: 'DevOps Engineer',
        bio: 'Cloud infrastructure specialist ensuring reliable, scalable deployments.',
        image: 'https://images.unsplash.com/photo-1519244703995-f4e0f30006d5?w=300&h=300&fit=crop&crop=face',
        social: {
          github: 'https://github.com/jameswilson',
          linkedin: 'https://linkedin.com/in/jameswilson'
        }
      },
      {
        id: '9',
        name: 'Sophie Brown',
        role: 'QA Engineer',
        bio: 'Quality assurance expert dedicated to delivering bug-free user experiences.',
        image: 'https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/sophiebrown',
          email: 'sophie@company.com'
        }
      }
    ]
  };

  noBioConfig: TeamConfig = {
    title: 'Advisory Board',
    subtitle: 'Industry experts guiding our strategic direction',
    columns: 3,
    showSocial: true,
    showBio: false,
    members: [
      {
        id: '10',
        name: 'Robert Anderson',
        role: 'Strategic Advisor',
        image: 'https://images.unsplash.com/photo-1560250097-0b93528c311a?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/robertanderson'
        }
      },
      {
        id: '11',
        name: 'Jennifer Lee',
        role: 'Technology Advisor',
        image: 'https://images.unsplash.com/photo-1573496359142-b8d87734a5a2?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/jenniferlee',
          website: 'https://jenniferlee.tech'
        }
      },
      {
        id: '12',
        name: 'Marcus Johnson',
        role: 'Business Advisor',
        image: 'https://images.unsplash.com/photo-1556157382-97eda2d62296?w=300&h=300&fit=crop&crop=face',
        social: {
          linkedin: 'https://linkedin.com/in/marcusjohnson',
          email: 'marcus@advisor.com'
        }
      }
    ]
  };
}.XVx.4import { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SaaSTemplateComponent } from '../../../../../ui-landing-pages/src/lib/components/templates/saas-template.component';
import { ProductTemplateComponent } from '../../../../../ui-landing-pages/src/lib/components/templates/product-template.component';
import { AgencyTemplateComponent } from '../../../../../ui-landing-pages/src/lib/components/templates/agency-template.component';
import { AgencyTemplateConfig, ProductTemplateConfig, SaaSTemplateConfig } from '../../../../../ui-landing-pages/src/lib/interfaces/templates.interfaces';

@Component({
  selector: 'app-landing-templates-demo',
  standalone: true,
  imports: [CommonModule, SaaSTemplateComponent, ProductTemplateComponent, AgencyTemplateComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="demo-container">
      <div class="demo-header">
        <h1>Landing Page Templates Demo</h1>
        <p>Complete, production-ready landing page templates for different business types.</p>
      </div>

      <div class="demo-navigation">
        <button 
          [class.active]="activeTemplate === 'saas'"
          (click)="setActiveTemplate('saas')">
          SaaS Template
        </button>
        <button 
          [class.active]="activeTemplate === 'product'"
          (click)="setActiveTemplate('product')">
          Product Template
        </button>
        <button 
          [class.active]="activeTemplate === 'agency'"
          (click)="setActiveTemplate('agency')">
          Agency Template
        </button>
      </div>

      <div class="template-container">
        @switch (activeTemplate) {
          @case ('saas') {
            <ui-lp-saas-template [configuration]="saasConfig"></ui-lp-saas-template>
          }
          @case ('product') {
            <ui-lp-product-template [configuration]="productConfig"></ui-lp-product-template>
          }
          @case ('agency') {
            <ui-lp-agency-template [configuration]="agencyConfig"></ui-lp-agency-template>
          }
        }
      </div>
    </div>
  `,
  styles: [`
    .demo-container {
      min-height: 100vh;
    }

    .demo-header {
      text-align: center;
      padding: 3rem 2rem;
      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
      color: white;
    }

    .demo-header h1 {
      font-size: 2.5rem;
      margin-bottom: 1rem;
    }

    .demo-header p {
      font-size: 1.125rem;
      opacity: 0.9;
    }

    .demo-navigation {
      display: flex;
      justify-content: center;
      gap: 1rem;
      padding: 2rem;
      background: #f8f9fa;
      border-bottom: 1px solid #e9ecef;
    }

    .demo-navigation button {
      padding: 0.75rem 1.5rem;
      border: 2px solid #6c757d;
      background: white;
      color: #6c757d;
      border-radius: 0.5rem;
      font-weight: 600;
      cursor: pointer;
      transition: all 0.2s ease;
    }

    .demo-navigation button:hover {
      background: #6c757d;
      color: white;
    }

    .demo-navigation button.active {
      background: #007bff;
      border-color: #007bff;
      color: white;
    }

    .template-container {
      min-height: calc(100vh - 200px);
    }

    @media (max-width: 768px) {
      .demo-navigation {
        flex-direction: column;
        align-items: center;
      }
      
      .demo-navigation button {
        width: 200px;
      }
    }
  `]
})
export class LandingTemplatesDemoComponent {
  activeTemplate: 'saas' | 'product' | 'agency' = 'saas';

  setActiveTemplate(template: 'saas' | 'product' | 'agency'): void {
    this.activeTemplate = template;
  }

  saasConfig: SaaSTemplateConfig = {
    hero: {
      title: 'Build Amazing SaaS Applications',
      subtitle: 'The complete toolkit for modern software development with enterprise-grade security and scalability.',
      ctaPrimary: {
        text: 'Start Free Trial',
        variant: 'tonal',
        size: 'large',
        action: () => console.log('Start trial clicked')
      },
      ctaSecondary: {
        text: 'View Demo',
        variant: 'outlined',
        size: 'large',
        action: () => console.log('View demo clicked')
      },
      alignment: 'center',
      backgroundType: 'gradient',
      minHeight: 'full'
    },
    features: {
      title: 'Why Choose Our Platform',
      subtitle: 'Everything you need to build, deploy, and scale your applications',
      features: [
        {
          id: '1',
          title: 'Lightning Fast Performance',
          description: 'Optimized architecture delivers sub-second response times and 99.99% uptime.',
          icon: 'rocket'
        },
        {
          id: '2',
          title: 'Enterprise Security',
          description: 'SOC 2 compliant with end-to-end encryption and advanced threat protection.',
          icon: 'shield'
        },
        {
          id: '3',
          title: 'Seamless Integrations',
          description: 'Connect with 100+ popular tools through our robust API and webhooks.',
          icon: 'plug'
        }
      ]
    },
    socialProof: {
      title: 'Trusted by Industry Leaders',
      statistics: [
        { id: '1', label: 'Active Users', value: '50,000+' },
        { id: '2', label: 'Countries', value: '120+' },
        { id: '3', label: 'Uptime', value: '99.99%' },
        { id: '4', label: 'Support Rating', value: '4.9/5' }
      ]
    },
    testimonials: {
      title: 'What Our Customers Say',
      testimonials: [
        {
          id: '1',
          content: 'This platform transformed our development workflow. We ship features 3x faster now.',
          name: 'Sarah Chen',
          title: 'CTO at TechCorp',
          avatar: 'https://images.unsplash.com/photo-1494790108755-2616b612b5ff?w=100&h=100&fit=crop&crop=face'
        }
      ]
    },
    pricing: {
      billingToggle: {
        monthlyLabel: 'Monthly',
        yearlyLabel: 'Yearly',
        discountText: 'Save 20%'
      },
      featuresComparison: false,
      plans: [
        {
          id: '1',
          name: 'Starter',
          price: {
            monthly: 29,
            yearly: 290,
            currency: 'USD',
            suffix: 'per user'
          },
          features: [
            { name: '5 Projects', included: true },
            { name: '10GB Storage', included: true },
            { name: 'Email Support', included: true }
          ],
          cta: {
            text: 'Get Started',
            variant: 'filled',
            action: () => console.log('Starter plan selected')
          }
        }
      ]
    },
    faq: {
      title: 'Frequently Asked Questions',
      items: [
        {
          id: '1',
          question: 'Can I cancel my subscription anytime?',
          answer: 'Yes, you can cancel your subscription at any time with no penalties.'
        }
      ]
    },
    cta: {
      title: 'Ready to Get Started?',
      subtitle: 'Join thousands of developers building the future',
      ctaPrimary: {
        text: 'Start Free Trial',
        variant: 'filled',
        action: () => console.log('Start trial clicked')
      },
      backgroundType: 'gradient'
    }
  };

  productConfig: ProductTemplateConfig = {
    hero: {
      title: 'Introducing the Future of Productivity',
      subtitle: 'Revolutionary new product that will transform how you work and collaborate.',
      ctaPrimary: {
        text: 'Order Now',
        variant: 'tonal',
        size: 'large',
        action: () => console.log('Order now clicked')
      },
      ctaSecondary: {
        text: 'Learn More',
        variant: 'tonal',
        size: 'large',
        action: () => console.log('Learn more clicked')
      },
      alignment: 'left',
      backgroundType: 'image',
      minHeight: 'large'
    },
    features: {
      title: 'Key Features',
      subtitle: 'Designed with you in mind',
      features: [
        {
          id: '1',
          title: 'Intuitive Design',
          description: 'Beautiful interface that anyone can use without training.',
          icon: 'star'
        },
        {
          id: '2',
          title: 'Premium Materials',
          description: 'Built with the finest materials for durability and style.',
          icon: 'check'
        }
      ]
    },
    testimonials: {
      title: 'Customer Reviews',
      testimonials: [
        {
          id: '1',
          content: 'This product exceeded all my expectations. Highly recommended!',
          name: 'Mike Johnson',
          title: 'Verified Customer',
          rating: 5
        }
      ]
    },
    pricing: {
      billingToggle: {
        monthlyLabel: 'One-time',
        yearlyLabel: 'Bundle',
        discountText: 'Best Value'
      },
      featuresComparison: false,
      plans: [
        {
          id: '1',
          name: 'Standard Edition',
          price: {
            monthly: 199,
            yearly: 199,
            currency: 'USD',
            suffix: 'one-time'
          },
          features: [
            { name: '2-Year Warranty', included: true },
            { name: 'Free Shipping', included: true }
          ],
          cta: {
            text: 'Order Now',
            variant: 'filled',
            action: () => console.log('Product ordered')
          }
        }
      ]
    },
    cta: {
      title: 'Start Your Journey',
      subtitle: 'Order now and get free shipping worldwide',
      ctaPrimary: {
        text: 'Order Now',
        variant: 'filled',
        action: () => console.log('Order now clicked')
      },
      backgroundType: 'gradient'
    }
  };

  agencyConfig: AgencyTemplateConfig = {
    hero: {
      title: 'Your Vision, Our Expertise',
      subtitle: 'We create exceptional digital experiences that drive results for businesses of all sizes.',
      ctaPrimary: {
        text: 'Start Project',
        variant: 'tonal',
        size: 'large',
        action: () => console.log('Start project clicked')
      },
      ctaSecondary: {
        text: 'View Portfolio',
        variant: 'outlined',
        size: 'large',
        action: () => console.log('View portfolio clicked')
      },
      alignment: 'left',
      backgroundType: 'gradient',
      minHeight: 'large'
    },
    services: {
      title: 'Our Services',
      subtitle: 'Comprehensive solutions for your digital needs',
      features: [
        {
          id: '1',
          title: 'Web Development',
          description: 'Custom websites and web applications built with modern technologies.',
          icon: 'code'
        },
        {
          id: '2',
          title: 'UI/UX Design',
          description: 'User-centered design that converts visitors into customers.',
          icon: 'palette'
        },
        {
          id: '3',
          title: 'Digital Marketing',
          description: 'Strategic campaigns that grow your online presence.',
          icon: 'megaphone'
        }
      ]
    },
    team: {
      title: 'Meet Our Team',
      subtitle: 'The talented individuals behind our success',
      members: [
        {
          id: '1',
          name: 'Alex Rivera',
          role: 'Creative Director',
          bio: 'Award-winning designer with 10+ years of experience in digital creativity.',
          image: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=300&h=300&fit=crop&crop=face',
          social: {
            linkedin: 'https://linkedin.com/in/alexrivera'
          }
        }
      ],
      columns: 3,
      showSocial: true,
      showBio: true
    },
    timeline: {
      title: 'Our Journey',
      subtitle: 'Milestones that define our growth',
      items: [
        {
          id: '1',
          title: 'Agency Founded',
          description: 'Started with a mission to help businesses succeed online.',
          date: '2018',
          status: 'completed',
          icon: 'rocket'
        },
        {
          id: '2',
          title: '100+ Happy Clients',
          description: 'Reached major milestone serving clients across industries.',
          date: '2020',
          status: 'completed',
          icon: 'star'
        },
        {
          id: '3',
          title: 'Award Recognition',
          description: 'Won Best Digital Agency award from Industry Association.',
          date: '2022',
          status: 'current',
          icon: 'check',
          badge: 'Latest'
        }
      ],
      orientation: 'vertical',
      showDates: true
    },
    testimonials: {
      title: 'Client Success Stories',
      subtitle: 'What our partners say about working with us',
      testimonials: [
        {
          id: '1',
          content: 'Working with this agency was a game-changer for our business. They delivered beyond our expectations.',
          name: 'Emma Watson',
          title: 'CEO at StartupXYZ',
          avatar: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop&crop=face'
        }
      ]
    },
    cta: {
      title: 'Ready to Start Your Project?',
      subtitle: 'Let\'s discuss how we can bring your vision to life',
      ctaPrimary: {
        text: 'Get Started',
        variant: 'filled',
        action: () => console.log('Get started clicked')
      },
      backgroundType: 'gradient'
    }
  };
}eY `xyimport { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
// Temporarily commented out until ui-landing-pages is built
// import { TestimonialCarouselComponent, TestimonialCarouselConfig, TestimonialItem } from 'ui-landing-pages';

// Placeholder types
interface TestimonialItem {
  id: string;
  name: string;
  title: string;
  company: string;
  content: string;
  rating: number;
  avatar: string;
  verified: boolean;
}

interface TestimonialCarouselConfig {
  title?: string;
  subtitle?: string;
  testimonials: TestimonialItem[];
  autoPlay?: boolean;
  autoPlayDelay?: number;
  showDots?: boolean;
  showNavigation?: boolean;
  itemsPerView?: number;
  variant?: 'card' | 'quote' | 'minimal';
  showRatings?: boolean;
}

@Component({
  selector: 'app-landing-testimonials-demo',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Testimonial Carousel Component</h2>
      <p style="margin-bottom: 2rem; color: #666;">Display customer testimonials with carousel navigation and various styles</p>
      
      <div style="background: #f5f5f5; padding: 2rem; border-radius: 8px; text-align: center; color: #666;">
        <p><strong>Component Preview Unavailable</strong></p>
        <p>The TestimonialCarouselComponent will be available once the ui-landing-pages library is built.</p>
        <p>This demo will show:</p>
        <ul style="list-style: none; padding: 0; margin: 1rem 0;">
          <li>• Single Item Carousel</li>
          <li>• Multi-Item Carousel</li>
          <li>• Quote Variant</li>
          <li>• Minimal Variant</li>
        </ul>
      </div>

      <!-- Configuration Code -->
      <section class="demo-section" style="margin-top: 2rem;">
        <h3 class="demo-section__title">Configuration Example</h3>
        <pre class="demo-code" style="background: #f8f8f8; padding: 1rem; border-radius: 4px; overflow-x: auto;">{{ configExample }}</pre>
      </section>
    </div>
  `,
  styleUrl: './landing-testimonials-demo.component.scss'
})
export class LandingTestimonialsDemoComponent {
  private sampleTestimonials: TestimonialItem[] = [
    {
      id: 'sarah-chen',
      name: 'Sarah Chen',
      title: 'CTO',
      company: 'TechCorp',
      content: 'This platform transformed our development workflow. The intuitive design and powerful features helped us deliver projects 40% faster.',
      rating: 5,
      avatar: 'https://images.unsplash.com/photo-1494790108755-2616b612b977?w=100&h=100&fit=crop&crop=face',
      verified: true
    },
    {
      id: 'marcus-rodriguez',
      name: 'Marcus Rodriguez',
      title: 'Lead Developer',
      company: 'StartupXYZ',
      content: 'Outstanding performance and reliability. The support team is incredibly responsive and knowledgeable.',
      rating: 5,
      avatar: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=100&h=100&fit=crop&crop=face',
      verified: true
    },
    {
      id: 'emily-watson',
      name: 'Emily Watson',
      title: 'Product Manager',
      company: 'InnovateLabs',
      content: 'The analytics features provided insights we never had before. Our team productivity increased significantly.',
      rating: 4,
      avatar: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop&crop=face',
      verified: false
    },
    {
      id: 'david-kim',
      name: 'David Kim',
      title: 'Software Engineer',
      company: 'CodeCrafters',
      content: 'Clean interface, excellent documentation, and seamless integration. Everything just works as expected.',
      rating: 5,
      avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop&crop=face',
      verified: true
    },
    {
      id: 'lisa-thompson',
      name: 'Lisa Thompson',
      title: 'Engineering Director',
      company: 'ScaleTech',
      content: 'Scalable solution that grows with our needs. The performance optimization features are game-changing.',
      rating: 5,
      avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=100&h=100&fit=crop&crop=face',
      verified: true
    }
  ];

  singleConfig: TestimonialCarouselConfig = {
    title: 'What Our Customers Say',
    subtitle: 'Trusted by thousands of developers worldwide',
    testimonials: this.sampleTestimonials,
    autoPlay: true,
    autoPlayDelay: 5000,
    showDots: true,
    showNavigation: true,
    itemsPerView: 1,
    variant: 'card',
    showRatings: true
  };

  multiConfig: TestimonialCarouselConfig = {
    title: 'Customer Success Stories',
    testimonials: this.sampleTestimonials,
    autoPlay: false,
    showDots: true,
    showNavigation: true,
    itemsPerView: 2,
    variant: 'card',
    showRatings: true
  };

  quoteConfig: TestimonialCarouselConfig = {
    title: 'Featured Reviews',
    testimonials: this.sampleTestimonials.slice(0, 3),
    autoPlay: true,
    autoPlayDelay: 6000,
    showDots: true,
    showNavigation: false,
    itemsPerView: 1,
    variant: 'quote',
    showRatings: true
  };

  minimalConfig: TestimonialCarouselConfig = {
    testimonials: this.sampleTestimonials.slice(0, 3),
    autoPlay: false,
    showDots: true,
    showNavigation: true,
    itemsPerView: 1,
    variant: 'minimal',
    showRatings: false
  };

  configExample = `const testimonialConfig: TestimonialCarouselConfig = {
  title: 'What Our Customers Say',
  subtitle: 'Trusted by thousands of developers worldwide',
  testimonials: [
    {
      id: 'sarah-chen',
      name: 'Sarah Chen',
      title: 'CTO',
      company: 'TechCorp',
      content: 'This platform transformed our workflow...',
      rating: 5,
      avatar: 'path/to/avatar.jpg',
      verified: true
    }
    // ... more testimonials
  ],
  autoPlay: true,
  autoPlayDelay: 5000,
  showDots: true,
  showNavigation: true,
  itemsPerView: 1,
  variant: 'card',
  showRatings: true
};`;
}?x	"import { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TimelineConfig, TimelineSectionComponent } from "../../../../../ui-landing-pages/src/public-api";

@Component({
  selector: 'app-landing-timeline-demo',
  standalone: true,
  imports: [CommonModule, TimelineSectionComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="demo-container">
      <div class="demo-header">
        <h1>Timeline Demo</h1>
        <p>Visual timeline components for roadmaps, company history, and project milestones.</p>
      </div>

      <!-- Vertical Timeline -->
      <div class="demo-section">
        <h2>Vertical Timeline (Default)</h2>
        <ui-lp-timeline [configuration]="verticalConfig"></ui-lp-timeline>
      </div>

      <!-- Horizontal Timeline -->
      <div class="demo-section">
        <h2>Horizontal Timeline</h2>
        <ui-lp-timeline [configuration]="horizontalConfig"></ui-lp-timeline>
      </div>

      <!-- Minimal Theme -->
      <div class="demo-section">
        <h2>Minimal Theme</h2>
        <ui-lp-timeline [configuration]="minimalConfig"></ui-lp-timeline>
      </div>

      <!-- Connected Theme -->
      <div class="demo-section">
        <h2>Connected Theme</h2>
        <ui-lp-timeline [configuration]="connectedConfig"></ui-lp-timeline>
      </div>

      <!-- Product Roadmap -->
      <div class="demo-section">
        <h2>Product Roadmap</h2>
        <ui-lp-timeline [configuration]="roadmapConfig"></ui-lp-timeline>
      </div>
    </div>
  `,
  styles: [`
    .demo-container {
      max-width: 1200px;
      margin: 0 auto;
      padding: 2rem;
    }

    .demo-header {
      text-align: center;
      margin-bottom: 3rem;
    }

    .demo-header h1 {
      font-size: 2.5rem;
      margin-bottom: 1rem;
      color: #1a1a1a;
    }

    .demo-header p {
      font-size: 1.125rem;
      color: #666;
    }

    .demo-section {
      margin-bottom: 4rem;
    }

    .demo-section h2 {
      font-size: 1.5rem;
      margin-bottom: 1.5rem;
      color: #333;
      border-bottom: 2px solid #e0e0e0;
      padding-bottom: 0.5rem;
    }
  `]
})
export class LandingTimelineDemoComponent {
  verticalConfig: TimelineConfig = {
    title: 'Our Company Journey',
    subtitle: 'Key milestones that shaped our growth',
    orientation: 'vertical',
    theme: 'default',
    showDates: true,
    items: [
      {
        id: '1',
        title: 'Company Founded',
        description: 'Started with a vision to revolutionize how teams collaborate and build software together.',
        date: 'January 2020',
        status: 'completed',
        icon: 'rocket'
      },
      {
        id: '2',
        title: 'First Product Launch',
        description: 'Launched our MVP with core features that solve real problems for development teams.',
        date: 'June 2020',
        status: 'completed',
        icon: 'star'
      },
      {
        id: '3',
        title: 'Series A Funding',
        description: 'Secured $5M in Series A funding to accelerate product development and team growth.',
        date: 'March 2021',
        status: 'completed',
        icon: 'check'
      },
      {
        id: '4',
        title: '10,000 Active Users',
        description: 'Reached a major milestone with 10,000+ active users across 50+ countries worldwide.',
        date: 'September 2021',
        status: 'completed',
        icon: 'star'
      },
      {
        id: '5',
        title: 'Major Platform Update',
        description: 'Released version 2.0 with advanced automation, better performance, and new integrations.',
        date: 'December 2022',
        status: 'current',
        icon: 'rocket',
        badge: 'Current'
      },
      {
        id: '6',
        title: 'International Expansion',
        description: 'Planning to open offices in Europe and Asia to better serve our global customer base.',
        date: 'Q2 2024',
        status: 'upcoming'
      }
    ]
  };

  horizontalConfig: TimelineConfig = {
    title: 'Development Process',
    subtitle: 'Our structured approach to building great products',
    orientation: 'horizontal',
    theme: 'default',
    showDates: false,
    items: [
      {
        id: '7',
        title: 'Research & Discovery',
        description: 'Understanding user needs through interviews, surveys, and market analysis.',
        status: 'completed',
        icon: 'check'
      },
      {
        id: '8',
        title: 'Design & Prototyping',
        description: 'Creating wireframes, mockups, and interactive prototypes for validation.',
        status: 'completed',
        icon: 'check'
      },
      {
        id: '9',
        title: 'Development',
        description: 'Building features with clean code, automated testing, and continuous integration.',
        status: 'current',
        icon: 'rocket'
      },
      {
        id: '10',
        title: 'Testing & QA',
        description: 'Comprehensive testing across devices, browsers, and user scenarios.',
        status: 'upcoming'
      },
      {
        id: '11',
        title: 'Launch & Monitor',
        description: 'Deploying to production and monitoring performance and user feedback.',
        status: 'upcoming'
      }
    ]
  };

  minimalConfig: TimelineConfig = {
    title: 'Project Milestones',
    subtitle: 'Clean and simple timeline presentation',
    orientation: 'vertical',
    theme: 'minimal',
    showDates: true,
    items: [
      {
        id: '12',
        title: 'Project Kickoff',
        description: 'Initial team meeting and project scope definition.',
        date: 'Week 1',
        status: 'completed'
      },
      {
        id: '13',
        title: 'Requirements Gathering',
        description: 'Detailed analysis of user requirements and technical specifications.',
        date: 'Week 2-3',
        status: 'completed'
      },
      {
        id: '14',
        title: 'Architecture Planning',
        description: 'System design and technology stack selection.',
        date: 'Week 4',
        status: 'current'
      },
      {
        id: '15',
        title: 'Implementation',
        description: 'Core development phase with iterative releases.',
        date: 'Week 5-12',
        status: 'upcoming'
      }
    ]
  };

  connectedConfig: TimelineConfig = {
    title: 'Feature Evolution',
    subtitle: 'How our features have evolved over time',
    orientation: 'vertical',
    theme: 'connected',
    showDates: true,
    items: [
      {
        id: '16',
        title: 'Basic Dashboard',
        description: 'Simple dashboard with essential metrics and basic user management.',
        date: 'v1.0',
        status: 'completed',
        icon: 'check'
      },
      {
        id: '17',
        title: 'Advanced Analytics',
        description: 'Added detailed analytics, custom reports, and data visualization tools.',
        date: 'v1.5',
        status: 'completed',
        icon: 'check'
      },
      {
        id: '18',
        title: 'Team Collaboration',
        description: 'Introduced real-time collaboration features, comments, and notification system.',
        date: 'v2.0',
        status: 'completed',
        icon: 'check'
      },
      {
        id: '19',
        title: 'AI-Powered Insights',
        description: 'Implementing machine learning algorithms for predictive analytics and smart recommendations.',
        date: 'v2.5',
        status: 'current',
        icon: 'rocket',
        badge: 'In Progress'
      }
    ]
  };

  roadmapConfig: TimelineConfig = {
    title: '2024 Product Roadmap',
    subtitle: 'Exciting features and improvements coming soon',
    orientation: 'horizontal',
    theme: 'default',
    showDates: true,
    items: [
      {
        id: '20',
        title: 'Mobile App',
        description: 'Native iOS and Android applications with offline support.',
        date: 'Q1 2024',
        status: 'completed',
        icon: 'check'
      },
      {
        id: '21',
        title: 'API v3',
        description: 'Complete API overhaul with GraphQL support and improved performance.',
        date: 'Q2 2024',
        status: 'current',
        icon: 'rocket'
      },
      {
        id: '22',
        title: 'Enterprise Features',
        description: 'SSO, advanced permissions, audit logs, and compliance tools.',
        date: 'Q3 2024',
        status: 'upcoming',
        badge: 'Coming Soon'
      },
      {
        id: '23',
        title: 'Global Expansion',
        description: 'Multi-language support, regional data centers, and local partnerships.',
        date: 'Q4 2024',
        status: 'upcoming'
      }
    ]
  };
}dY	xOimport { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ListItemComponent } from '../../../../../ui-essentials/src/lib/components/data-display/list/list-item.component';
import { ListContainerComponent } from '../../../../../ui-essentials/src/lib/components/data-display/list/list-container.component';
import { ListItemData } from '../../../../../ui-essentials/src/lib/components/data-display/list/list-item.component';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { 
  faInbox,
  faStar,
  faPaperPlane,
  faEdit,
  faArchive,
  faTrash,
  faPhone,
  faComment,
  faPlay,
  faDownload,
  faCheck,
  faChevronRight,
  faPlus,
  faMinus
} from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-list-demo',
  standalone: true,
  imports: [
    CommonModule,
    ListItemComponent,
    ListContainerComponent,
    FontAwesomeModule
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>List Component Showcase</h2>
      
      <!-- Basic Lists with Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Lists - Size Variants</h3>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; margin-bottom: 2rem;">
          <div>
            <h4>Small (sm)</h4>
            <ui-list-container 
              elevation="sm" 
              spacing="xs" 
              [rounded]="true"
              ariaLabel="Small navigation list">
              @for (item of navigationItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="sm"
                  lines="one"
                  variant="text"
                  [divider]="true"
                >
                  <fa-icon [icon]="getIconForItem(item.primary)" slot="trailing"></fa-icon>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
          
          <div>
            <h4>Medium (md)</h4>
            <ui-list-container 
              elevation="sm" 
              spacing="xs" 
              [rounded]="true"
              ariaLabel="Medium navigation list">
              @for (item of navigationItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="md"
                  lines="one"
                  variant="text"
                  [divider]="true"
                >
                  <fa-icon [icon]="getIconForItem(item.primary)" slot="trailing"></fa-icon>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
          
          <div>
            <h4>Large (lg)</h4>
            <ui-list-container 
              elevation="sm" 
              spacing="xs" 
              [rounded]="true"
              ariaLabel="Large navigation list">
              @for (item of navigationItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="one"
                  variant="text"
                  [divider]="true"
                >
                  <fa-icon [icon]="getIconForItem(item.primary)" slot="trailing"></fa-icon>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
        </div>
      </section>

      <!-- Multi-line Lists -->
      <section style="margin-bottom: 3rem;">
        <h3>Multi-line Lists</h3>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 2rem;">
          <div>
            <h4>Two Lines</h4>
            <ui-list-container 
              elevation="md" 
              spacing="sm" 
              [rounded]="true"
              ariaLabel="Two line task list">
              @for (item of twoLineItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="md"
                  lines="two"
                  variant="text"
                >
                  <button 
                    slot="trailing" 
                    style="background: none; border: none; padding: 8px; cursor: pointer; color: #6c757d;"
                    (click)="handleAction('complete', item.primary)"
                    [attr.aria-label]="'Complete ' + item.primary">
                    <fa-icon [icon]="faCheck"></fa-icon>
                  </button>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
          
          <div>
            <h4>Three Lines</h4>
            <ui-list-container 
              elevation="md" 
              spacing="sm" 
              [rounded]="true"
              ariaLabel="Three line task list">
              @for (item of threeLineItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="three"
                  variant="text"
                >
                  <div slot="trailing" style="display: flex; gap: 0.5rem;">
                    <button 
                      style="background: none; border: none; padding: 4px; cursor: pointer; color: #28a745;"
                      (click)="handleAction('approve', item.primary)"
                      [attr.aria-label]="'Approve ' + item.primary">
                      <fa-icon [icon]="faCheck"></fa-icon>
                    </button>
                  </div>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
        </div>
      </section>

      <!-- Avatar Lists -->
      <section style="margin-bottom: 3rem;">
        <h3>Lists with Avatars</h3>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 2rem;">
          <div>
            <h4>Contacts - Avatar + One Line</h4>
            <ui-list-container 
              elevation="sm" 
              spacing="xs" 
              [rounded]="true"
              ariaLabel="Contact list">
              @for (item of contactItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="md"
                  lines="one"
                  variant="avatar"
                >
                  <div slot="trailing" style="display: flex; gap: 0.75rem;">
                    <button 
                      style="background: none; border: none; padding: 4px; cursor: pointer; color: #007bff;"
                      (click)="handleAction('call', item.primary)"
                      [attr.aria-label]="'Call ' + item.primary">
                      <fa-icon [icon]="faPhone"></fa-icon>
                    </button>
                    <button 
                      style="background: none; border: none; padding: 4px; cursor: pointer; color: #28a745;"
                      (click)="handleAction('message', item.primary)"
                      [attr.aria-label]="'Message ' + item.primary">
                      <fa-icon [icon]="faComment"></fa-icon>
                    </button>
                  </div>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
          
          <div>
            <h4>Messages - Avatar + Two Lines</h4>
            <ui-list-container 
              elevation="sm" 
              spacing="xs" 
              [rounded]="true"
              ariaLabel="Message list">
              @for (item of messageItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="two"
                  variant="avatar"
                >
                  <span 
                    slot="trailing" 
                    style="font-size: 0.75rem; color: #6c757d;">
                    2h
                  </span>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
        </div>
      </section>

      <!-- Media Lists -->
      <section style="margin-bottom: 3rem;">
        <h3>Lists with Media</h3>
        
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); gap: 2rem;">
          <div>
            <h4>Music - Media + Two Lines</h4>
            <ui-list-container 
              elevation="md" 
              spacing="sm" 
              [rounded]="true"
              ariaLabel="Music playlist">
              @for (item of musicItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="two"
                  variant="media"
                >
                  <div slot="trailing" style="display: flex; gap: 0.75rem; align-items: center;">
                    <span style="font-size: 0.875rem; color: #6c757d;">3:42</span>
                    <button 
                      style="background: none; border: none; padding: 8px; cursor: pointer; color: #007bff;"
                      (click)="handleAction('play', item.primary)"
                      [attr.aria-label]="'Play ' + item.primary">
                      <fa-icon [icon]="faPlay"></fa-icon>
                    </button>
                  </div>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
          
          <div>
            <h4>Videos - Media + Three Lines</h4>
            <ui-list-container 
              elevation="md" 
              spacing="sm" 
              [rounded]="true"
              ariaLabel="Video library">
              @for (item of videoItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="three"
                  variant="media"
                >
                  <div slot="trailing" style="display: flex; flex-direction: column; align-items: center; gap: 0.5rem;">
                    <div style="display: flex; align-items: center; gap: 0.25rem;">
                      <fa-icon [icon]="faStar" style="color: #ffc107; font-size: 0.75rem;"></fa-icon>
                      <span style="font-size: 0.75rem; color: #6c757d;">4.8</span>
                    </div>
                    <button 
                      style="background: none; border: none; padding: 4px; cursor: pointer; color: #007bff;"
                      (click)="handleAction('download', item.primary)"
                      [attr.aria-label]="'Download ' + item.primary">
                      <fa-icon [icon]="faDownload"></fa-icon>
                    </button>
                  </div>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
        </div>
      </section>

      <!-- Interactive Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Demo</h3>
        <p style="margin-bottom: 1rem; color: #6c757d;">
          Click items to interact with them:
        </p>
        
        <div style="max-width: 600px;">
          <ui-list-container 
            elevation="sm" 
            spacing="sm" 
            [rounded]="true"
            ariaLabel="Interactive demo list">
            @for (item of interactiveItems(); track item.primary) {
              <ui-list-item 
                [data]="item"
                size="md"
                lines="two"
                variant="avatar"
                style="cursor: pointer;"
                (click)="toggleInteractiveItem(item.primary)"
              >
                <div slot="trailing" style="display: flex; align-items: center; gap: 0.5rem;">
                  @if (item.selected) {
                    <span style="background: #28a745; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.75rem;">
                      Enabled
                    </span>
                  } @else if (item.disabled) {
                    <span style="background: #dc3545; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.75rem;">
                      Disabled
                    </span>
                  } @else {
                    <span style="background: #6c757d; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.75rem;">
                      Click to enable
                    </span>
                  }
                </div>
              </ui-list-item>
            }
          </ui-list-container>
        </div>
      </section>

      <!-- Code Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic List with Icons:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto; font-size: 0.875rem;"><code>&lt;ui-list-container elevation="sm" spacing="xs" [rounded]="true"&gt;
  &lt;ui-list-item 
    [data]="&#123;primary: 'Inbox'&#125;"
    size="md"
    lines="one"
    variant="text"&gt;
    &lt;fa-icon [icon]="faInbox" slot="trailing"&gt;&lt;/fa-icon&gt;
  &lt;/ui-list-item&gt;
&lt;/ui-list-container&gt;</code></pre>
          
          <h4>List with Avatar and Actions:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto; font-size: 0.875rem;"><code>&lt;ui-list-container elevation="md" spacing="sm" [rounded]="true"&gt;
  &lt;ui-list-item 
    [data]="&#123;
      primary: 'John Doe',
      secondary: 'john&#64;example.com',
      avatarSrc: 'avatar.jpg'
    &#125;"
    size="lg"
    lines="two"
    variant="avatar"&gt;
    &lt;button slot="trailing" (click)="call()"&gt;
      &lt;fa-icon [icon]="faPhone"&gt;&lt;/fa-icon&gt;
    &lt;/button&gt;
  &lt;/ui-list-item&gt;
&lt;/ui-list-container&gt;</code></pre>
        </div>
      </section>

      @if (lastAction()) {
        <div style="position: fixed; bottom: 20px; right: 20px; background: #007bff; color: white; padding: 1rem; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); max-width: 300px;">
          <strong>Action:</strong> {{ lastAction() }}
        </div>
      }
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
      margin-top: 2rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
      margin-top: 1rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 12px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
      margin-bottom: 2rem;
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
      white-space: pre-wrap;
    }
    
    code {
      font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', 'Courier New', monospace;
      color: #d63384;
    }

    button {
      transition: all 0.15s ease;
    }

    button:hover {
      transform: translateY(-1px);
    }

    button:active {
      transform: translateY(0);
    }

    fa-icon {
      transition: color 0.2s ease;
    }
  `]
})
export class ListDemoComponent {
  // State signals
  lastAction = signal('');
  
  // Demo data
  navigationItems: ListItemData[] = [
    { primary: 'Inbox' },
    { primary: 'Starred' },
    { primary: 'Sent' },
    { primary: 'Drafts' },
    { primary: 'Archive' },
    { primary: 'Trash' }
  ];

  twoLineItems: ListItemData[] = [
    {
      primary: 'Review Design System Updates',
      secondary: 'Check new component specifications and design tokens'
    },
    {
      primary: 'Team Standup Meeting',
      secondary: 'Daily sync with development and design teams'
    },
    {
      primary: 'Code Review - Authentication',
      secondary: 'Review pull request #247 for OAuth integration'
    }
  ];

  threeLineItems: ListItemData[] = [
    {
      primary: 'Angular 19 Migration',
      secondary: 'Upgrade project to latest Angular version with control flow',
      tertiary: 'Estimated completion: Next Sprint • Priority: High'
    },
    {
      primary: 'Design System Documentation',
      secondary: 'Create comprehensive documentation for all components',
      tertiary: 'Status: In Progress • Assigned: Design Team'
    }
  ];

  contactItems: ListItemData[] = [
    {
      primary: 'Sarah Wilson',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=sarah',
      avatarAlt: 'Sarah Wilson avatar'
    },
    {
      primary: 'Alex Chen',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=alex',
      avatarAlt: 'Alex Chen avatar'
    },
    {
      primary: 'Mike Rodriguez',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=mike',
      avatarAlt: 'Mike Rodriguez avatar'
    }
  ];

  messageItems: ListItemData[] = [
    {
      primary: 'John Doe',
      secondary: 'Hey! How\'s the new component library coming along?',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=john',
      avatarAlt: 'John Doe avatar'
    },
    {
      primary: 'Jane Smith',
      secondary: 'The design tokens look great. Ready for review when you are.',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=jane',
      avatarAlt: 'Jane Smith avatar'
    }
  ];

  musicItems: ListItemData[] = [
    {
      primary: 'Bohemian Rhapsody',
      secondary: 'Queen • A Night at the Opera',
      mediaSrc: 'https://picsum.photos/80/80?random=1',
      mediaAlt: 'Album cover'
    },
    {
      primary: 'Hotel California',
      secondary: 'Eagles • Hotel California',
      mediaSrc: 'https://picsum.photos/80/80?random=2',
      mediaAlt: 'Album cover'
    }
  ];

  videoItems: ListItemData[] = [
    {
      primary: 'Angular Fundamentals',
      secondary: 'Complete guide to modern Angular development',
      tertiary: 'Duration: 2h 30m • Updated: Today • 1.2M views',
      mediaSrc: 'https://picsum.photos/80/80?random=5',
      mediaAlt: 'Video thumbnail'
    }
  ];

  interactiveItems = signal<ListItemData[]>([
    {
      primary: 'Email Notifications',
      secondary: 'Receive emails about important updates',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=email',
      selected: false,
      disabled: false
    },
    {
      primary: 'SMS Alerts',
      secondary: 'Get text messages for urgent notifications',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=sms',
      selected: true,
      disabled: false
    },
    {
      primary: 'Marketing Communications',
      secondary: 'Promotional offers and product updates',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=marketing',
      selected: false,
      disabled: true
    }
  ]);

  // Font Awesome icons
  faInbox = faInbox;
  faStar = faStar;
  faPaperPlane = faPaperPlane;
  faEdit = faEdit;
  faArchive = faArchive;
  faTrash = faTrash;
  faPhone = faPhone;
  faComment = faComment;
  faPlay = faPlay;
  faDownload = faDownload;
  faCheck = faCheck;
  faChevronRight = faChevronRight;
  faPlus = faPlus;
  faMinus = faMinus;

  // Helper methods
  getIconForItem(itemName: string): any {
    const iconMap: { [key: string]: any } = {
      'Inbox': faInbox,
      'Starred': faStar,
      'Sent': faPaperPlane,
      'Drafts': faEdit,
      'Archive': faArchive,
      'Trash': faTrash
    };
    return iconMap[itemName] || faInbox;
  }

  // Event handlers
  handleAction(action: string, item?: string): void {
    const message = item 
      ? `${action} action on "${item}" at ${new Date().toLocaleTimeString()}`
      : `${action} action at ${new Date().toLocaleTimeString()}`;
    
    this.lastAction.set(message);
    console.log(`List action: ${action}`, item);
    
    // Clear the message after 3 seconds
    setTimeout(() => this.lastAction.set(''), 3000);
  }

  toggleInteractiveItem(itemName: string): void {
    this.interactiveItems.update(items =>
      items.map(item => {
        if (item.primary === itemName && !item.disabled) {
          return { ...item, selected: !item.selected };
        }
        return item;
      })
    );
    
    this.handleAction('toggle', itemName);
  }
}* x4q<	\

>%%yy%:
\
hKbI"鞛32 ʄx?$import { Component, ViewChild, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ListDetailLayoutComponent } from '../../../../../ui-essentials/src/lib/components/layout/list-detail-layout/list-detail-layout.component';

interface DemoItem {
  id: number;
  title: string;
  subtitle: string;
  description: string;
  status: 'active' | 'pending' | 'completed';
  category: string;
  date: string;
}

@Component({
  selector: 'ui-list-detail-layout-demo',
  standalone: true,
  imports: [CommonModule, ListDetailLayoutComponent],
  template: `
    <div class="demo-container">
      <h2>List Detail Layout Demo</h2>
      <p>Master-detail pattern with resizable panes and mobile-adaptive behavior</p>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-variant-container">
          @for (size of sizes; track size) {
            <div class="demo-variant">
              <h4>{{ size | titlecase }} Size</h4>
              <div class="demo-layout-container" [class]="'demo-layout--' + size">
                <ui-list-detail-layout 
                  [size]="size"
                  [selectedItem]="selectedItems[size]"
                  (selectionChanged)="handleSelectionChange(size, $event)">
                  
                  <div slot="list" class="demo-list">
                    <div class="demo-list__header">
                      <h4>Items ({{ size }})</h4>
                    </div>
                    <div class="demo-list__content">
                      @for (item of demoItems(); track item.id) {
                        <div 
                          class="demo-list-item"
                          [class.demo-list-item--selected]="selectedItems[size]?.id === item.id"
                          (click)="selectItem(size, item)"
                          [attr.aria-selected]="selectedItems[size]?.id === item.id"
                          role="option">
                          <div class="demo-list-item__content">
                            <h5>{{ item.title }}</h5>
                            <p>{{ item.subtitle }}</p>
                            <span class="demo-list-item__status demo-list-item__status--{{ item.status }}">
                              {{ item.status }}
                            </span>
                          </div>
                        </div>
                      }
                    </div>
                  </div>
                  
                  <div slot="detail" class="demo-detail">
                    @if (selectedItems[size]) {
                      <div class="demo-detail__header">
                        <h3>{{ selectedItems[size].title }}</h3>
                        <span class="demo-detail__category">{{ selectedItems[size].category }}</span>
                      </div>
                      <div class="demo-detail__content">
                        <div class="demo-detail__meta">
                          <p><strong>Subtitle:</strong> {{ selectedItems[size].subtitle }}</p>
                          <p><strong>Status:</strong> {{ selectedItems[size].status }}</p>
                          <p><strong>Date:</strong> {{ selectedItems[size].date }}</p>
                        </div>
                        <div class="demo-detail__description">
                          <h4>Description</h4>
                          <p>{{ selectedItems[size].description }}</p>
                        </div>
                        <div class="demo-detail__actions">
                          <button 
                            type="button"
                            class="demo-button demo-button--primary"
                            (click)="handleAction('edit', selectedItems[size])">
                            Edit Item
                          </button>
                          <button 
                            type="button"
                            class="demo-button demo-button--secondary"
                            (click)="handleAction('delete', selectedItems[size])">
                            Delete Item
                          </button>
                        </div>
                      </div>
                    }
                  </div>
                  
                  <div slot="empty" class="demo-empty-state">
                    <div class="demo-empty-state__icon">📋</div>
                    <h4>No Item Selected</h4>
                    <p>Choose an item from the list to view its details</p>
                  </div>
                </ui-list-detail-layout>
              </div>
            </div>
          }
        </div>
      </section>
      
      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Style Variants</h3>
        <div class="demo-variant-container">
          @for (variant of variants; track variant) {
            <div class="demo-variant">
              <h4>{{ variant | titlecase }} Style</h4>
              <div class="demo-layout-container demo-layout--variant">
                <ui-list-detail-layout 
                  [variant]="variant"
                  [selectedItem]="selectedItems[variant]"
                  (selectionChanged)="handleSelectionChange(variant, $event)">
                  
                  <div slot="list" class="demo-list">
                    <div class="demo-list__header">
                      <h4>{{ variant | titlecase }} List</h4>
                    </div>
                    <div class="demo-list__content">
                      @for (item of demoItems().slice(0, 3); track item.id) {
                        <div 
                          class="demo-list-item"
                          [class.demo-list-item--selected]="selectedItems[variant]?.id === item.id"
                          (click)="selectItem(variant, item)"
                          role="option">
                          <div class="demo-list-item__content">
                            <h5>{{ item.title }}</h5>
                            <p>{{ item.subtitle }}</p>
                          </div>
                        </div>
                      }
                    </div>
                  </div>
                  
                  <div slot="detail" class="demo-detail">
                    @if (selectedItems[variant]) {
                      <div class="demo-detail__header">
                        <h3>{{ selectedItems[variant].title }}</h3>
                      </div>
                      <div class="demo-detail__content">
                        <p>{{ selectedItems[variant].description }}</p>
                      </div>
                    }
                  </div>
                </ui-list-detail-layout>
              </div>
            </div>
          }
        </div>
      </section>
      
      <!-- Interactive Features -->
      <section class="demo-section">
        <h3>Interactive Features</h3>
        <div class="demo-interactive">
          <div class="demo-controls">
            <label>
              <input 
                type="checkbox" 
                [checked]="interactiveFeatures.resizable"
                (change)="toggleFeature('resizable', $event)">
              Resizable Panels
            </label>
            <label>
              <input 
                type="checkbox" 
                [checked]="interactiveFeatures.showEmptyState"
                (change)="toggleFeature('showEmptyState', $event)">
              Show Empty State
            </label>
            <label>
              <input 
                type="checkbox" 
                [checked]="interactiveFeatures.showMobileNavigation"
                (change)="toggleFeature('showMobileNavigation', $event)">
              Mobile Navigation
            </label>
            <label>
              <input 
                type="checkbox" 
                [checked]="interactiveFeatures.loading"
                (change)="toggleFeature('loading', $event)">
              Loading State
            </label>
          </div>
          
          <div class="demo-layout-container demo-layout--interactive">
            <ui-list-detail-layout 
              #interactiveLayout
              [resizable]="interactiveFeatures.resizable"
              [showEmptyState]="interactiveFeatures.showEmptyState"
              [showMobileNavigation]="interactiveFeatures.showMobileNavigation"
              [loading]="interactiveFeatures.loading"
              [selectedItem]="selectedItems['interactive']"
              (selectionChanged)="handleSelectionChange('interactive', $event)"
              (mobileNavigated)="handleMobileNavigation($event)"
              (panelResized)="handlePanelResize($event)">
              
              <div slot="list" class="demo-list">
                <div class="demo-list__header">
                  <h4>Interactive List</h4>
                  <button 
                    type="button"
                    class="demo-button demo-button--small"
                    (click)="clearSelection('interactive')">
                    Clear Selection
                  </button>
                </div>
                <div class="demo-list__content">
                  @for (item of demoItems(); track item.id) {
                    <div 
                      class="demo-list-item"
                      [class.demo-list-item--selected]="selectedItems['interactive']?.id === item.id"
                      (click)="selectItem('interactive', item)"
                      role="option">
                      <div class="demo-list-item__content">
                        <h5>{{ item.title }}</h5>
                        <p>{{ item.subtitle }}</p>
                        <span class="demo-list-item__status demo-list-item__status--{{ item.status }}">
                          {{ item.status }}
                        </span>
                      </div>
                    </div>
                  }
                </div>
              </div>
              
              <div slot="detail" class="demo-detail">
                @if (selectedItems['interactive']) {
                  <div class="demo-detail__header">
                    <h3>{{ selectedItems['interactive'].title }}</h3>
                    <span class="demo-detail__category">{{ selectedItems['interactive'].category }}</span>
                  </div>
                  <div class="demo-detail__content">
                    <p>{{ selectedItems['interactive'].description }}</p>
                    <div class="demo-detail__stats">
                      <div class="demo-stat">
                        <label>Status:</label>
                        <span>{{ selectedItems['interactive'].status }}</span>
                      </div>
                      <div class="demo-stat">
                        <label>Category:</label>
                        <span>{{ selectedItems['interactive'].category }}</span>
                      </div>
                      <div class="demo-stat">
                        <label>Date:</label>
                        <span>{{ selectedItems['interactive'].date }}</span>
                      </div>
                    </div>
                  </div>
                }
              </div>
              
              <div slot="empty" class="demo-empty-state">
                <div class="demo-empty-state__icon">🎯</div>
                <h4>Ready to Explore</h4>
                <p>Select any item to see the interactive features in action</p>
              </div>
            </ui-list-detail-layout>
          </div>
        </div>
      </section>
      
      <!-- Event Log -->
      <section class="demo-section">
        <h3>Event Log</h3>
        <div class="demo-event-log">
          @for (event of eventLog(); track $index) {
            <div class="demo-event-log__item">
              <span class="demo-event-log__timestamp">{{ event.timestamp }}</span>
              <span class="demo-event-log__type">{{ event.type }}</span>
              <span class="demo-event-log__data">{{ event.data }}</span>
            </div>
          }
        </div>
      </section>
    </div>
  `,
  styleUrl: './list-detail-layout-demo.component.scss'
})
export class ListDetailLayoutDemoComponent {
  @ViewChild('interactiveLayout') interactiveLayout?: ListDetailLayoutComponent;
  
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['default', 'bordered', 'elevated'] as const;
  
  selectedItems: Record<string, DemoItem | null> = {
    sm: null,
    md: null,
    lg: null,
    default: null,
    bordered: null,
    elevated: null,
    interactive: null
  };
  
  interactiveFeatures = {
    resizable: true,
    showEmptyState: true,
    showMobileNavigation: true,
    loading: false
  };
  
  demoItems = signal<DemoItem[]>([
    {
      id: 1,
      title: 'Project Alpha',
      subtitle: 'High-priority initiative',
      description: 'A comprehensive project focused on improving user experience and system performance. This initiative involves multiple teams and requires careful coordination across different departments.',
      status: 'active',
      category: 'Development',
      date: '2024-01-15'
    },
    {
      id: 2,
      title: 'Database Migration',
      subtitle: 'Critical infrastructure update',
      description: 'Migration of legacy database systems to modern cloud infrastructure. This project includes data validation, performance optimization, and minimal downtime deployment strategies.',
      status: 'pending',
      category: 'Infrastructure',
      date: '2024-02-01'
    },
    {
      id: 3,
      title: 'UI Component Library',
      subtitle: 'Design system implementation',
      description: 'Development of a comprehensive UI component library to ensure consistency across all applications. Includes documentation, testing, and integration guidelines.',
      status: 'completed',
      category: 'Design',
      date: '2024-01-28'
    },
    {
      id: 4,
      title: 'Security Audit',
      subtitle: 'Annual security review',
      description: 'Comprehensive security audit covering all systems, applications, and infrastructure. Includes penetration testing, vulnerability assessment, and compliance verification.',
      status: 'active',
      category: 'Security',
      date: '2024-02-10'
    },
    {
      id: 5,
      title: 'Mobile App Redesign',
      subtitle: 'User interface overhaul',
      description: 'Complete redesign of the mobile application focusing on improved usability, modern design patterns, and enhanced accessibility features.',
      status: 'pending',
      category: 'Mobile',
      date: '2024-03-01'
    }
  ]);
  
  eventLog = signal<Array<{ timestamp: string; type: string; data: string }>>([]);
  
  selectItem(context: string, item: DemoItem): void {
    this.selectedItems[context] = item;
    this.logEvent('selection', `Selected: ${item.title} (${context})`);
  }
  
  clearSelection(context: string): void {
    this.selectedItems[context] = null;
    this.logEvent('selection', `Cleared selection (${context})`);
  }
  
  handleSelectionChange(context: string, item: DemoItem | null): void {
    this.selectedItems[context] = item;
    this.logEvent('selectionChanged', 
      item ? `Item selected: ${item.title}` : 'Selection cleared');
  }
  
  handleMobileNavigation(event: any): void {
    this.logEvent('mobileNavigation', 
      `Navigated to: ${event.view} (has selection: ${event.hasSelection})`);
  }
  
  handlePanelResize(event: any): void {
    this.logEvent('panelResize', `List width: ${event.listWidth}px`);
  }
  
  handleAction(action: string, item: DemoItem): void {
    this.logEvent('action', `${action} action on: ${item.title}`);
  }
  
  toggleFeature(feature: keyof typeof this.interactiveFeatures, event: Event): void {
    const target = event.target as HTMLInputElement;
    this.interactiveFeatures[feature] = target.checked;
    this.logEvent('feature', `${feature}: ${target.checked ? 'enabled' : 'disabled'}`);
  }
  
  private logEvent(type: string, data: string): void {
    const timestamp = new Date().toLocaleTimeString();
    const events = this.eventLog();
    events.unshift({ timestamp, type, data });
    // Keep only last 10 events
    if (events.length > 10) {
      events.splice(10);
    }
    this.eventLog.set([...events]);
  }
}	x ||h%Σ˷5ub}!x.demo-container {
  max-width: 1200px;
  margin: 0 auto;
  padding: 2rem;
}

.demo-section {
  margin-bottom: 3rem;
  
  h2 {
    font-size: 1.875rem;
    color: #1f2937;
    margin-bottom: 1.5rem;
  }
  
  h3 {
    font-size: 1.5rem;
    color: #1f2937;
    margin-bottom: 1rem;
    border-bottom: 1px solid #d1d5db;
    padding-bottom: 0.75rem;
  }
  
  h4 {
    font-size: 1.25rem;
    color: #1f2937;
    margin-bottom: 0.5rem;
  }
  
  h5 {
    font-size: 1.125rem;
    color: #1f2937;
    margin-bottom: 0.25rem;
  }
}

.demo-row {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  align-items: flex-start;
}

.demo-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.5rem;
  padding: 0.75rem;
  border: 1px solid #e5e7eb;
  border-radius: 0.375rem;
  background: #ffffff;
  min-width: 120px;
  
  p {
    font-size: 0.875rem;
    color: #6b7280;
    margin: 0;
    text-align: center;
    text-transform: capitalize;
  }
}

.demo-interactive {
  padding: 1rem;
  border: 1px solid #d1d5db;
  border-radius: 0.5rem;
  background: #f9fafb;
  
  .demo-controls {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    margin-bottom: 1rem;
    padding-bottom: 0.75rem;
    border-bottom: 1px solid #e5e7eb;
    
    label {
      display: flex;
      flex-direction: column;
      gap: 0.25rem;
      font-size: 0.875rem;
      color: #1f2937;
      font-weight: 500;
      
      select {
        padding: 0.25rem 0.5rem;
        border: 1px solid #d1d5db;
        border-radius: 0.25rem;
        background: #ffffff;
        color: #1f2937;
        font-size: 0.875rem;
        
        &:focus {
          outline: 2px solid #3b82f6;
          outline-offset: 2px;
          border-color: #3b82f6;
        }
      }
      
      input[type="checkbox"] {
        margin-right: 0.25rem;
      }
    }
  }
  
  .demo-result {
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 120px;
    background: #ffffff;
    border: 1px dashed #d1d5db;
    border-radius: 0.375rem;
  }
  
  p {
    text-align: center;
    margin-top: 0.5rem;
    font-size: 0.875rem;
    color: #6b7280;
  }
}

.demo-usage {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 1rem;
}

.usage-example {
  padding: 0.75rem;
  border: 1px solid #d1d5db;
  border-radius: 0.375rem;
  background: #ffffff;
  
  .demo-button {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0.75rem;
    background: #6366f1;
    color: #ffffff;
    border: none;
    border-radius: 0.375rem;
    font-size: 1rem;
    cursor: pointer;
    transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
    
    &:hover:not(:disabled) {
      background: #5855eb;
      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
    }
    
    &:disabled {
      opacity: 0.6;
      cursor: not-allowed;
    }
    
    &:focus-visible {
      outline: 2px solid #3b82f6;
      outline-offset: 2px;
    }
  }
  
  .page-loading-example,
  .processing-example {
    min-height: 150px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    gap: 0.75rem;
    padding: 0.75rem;
    border: 1px solid #e5e7eb;
    border-radius: 0.25rem;
    background: #f9fafb;
    
    .page-content,
    .process-result {
      text-align: center;
      
      p {
        margin: 0.5rem 0;
        color: #6b7280;
      }
      
      button {
        padding: 0.25rem 0.5rem;
        background: #64748b;
        color: #ffffff;
        border: none;
        border-radius: 0.25rem;
        font-size: 0.875rem;
        cursor: pointer;
        transition: background 150ms cubic-bezier(0.4, 0, 0.2, 1);
        
        &:hover {
          background: #475569;
        }
        
        &:focus-visible {
          outline: 2px solid #3b82f6;
          outline-offset: 2px;
        }
      }
    }
  }
}

// Responsive breakpoints
@media (max-width: 768px) {
  .demo-container {
    padding: 1rem;
  }
  
  .demo-row {
    gap: 0.75rem;
  }
  
  .demo-item {
    min-width: 100px;
    padding: 0.5rem;
  }
  
  .demo-interactive .demo-controls {
    flex-direction: column;
    align-items: flex-start;
    
    label {
      width: 100%;
      
      select {
        width: 100%;
      }
    }
  }
  
  .demo-usage {
    grid-template-columns: 1fr;
  }
}̱x"import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { LoadingSpinnerComponent } from '../../../../../ui-essentials/src/lib/components/feedback/loading-spinner';

@Component({
  selector: 'ui-loading-spinner-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, LoadingSpinnerComponent],
  template: `
    <div class="demo-container">
      <h2>Loading Spinner Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <ui-loading-spinner [size]="size"></ui-loading-spinner>
              <p>{{ size }}</p>
            </div>
          }
        </div>
      </section>
      
      <!-- Type Variants -->
      <section class="demo-section">
        <h3>Types</h3>
        <div class="demo-row">
          @for (type of types; track type) {
            <div class="demo-item">
              <ui-loading-spinner [type]="type"></ui-loading-spinner>
              <p>{{ type }}</p>
            </div>
          }
        </div>
      </section>
      
      <!-- Color Variants -->
      <section class="demo-section">
        <h3>Colors</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <ui-loading-spinner [variant]="variant"></ui-loading-spinner>
              <p>{{ variant }}</p>
            </div>
          }
        </div>
      </section>
      
      <!-- Speed Variants -->
      <section class="demo-section">
        <h3>Speeds</h3>
        <div class="demo-row">
          @for (speed of speeds; track speed) {
            <div class="demo-item">
              <ui-loading-spinner [speed]="speed" type="spin"></ui-loading-spinner>
              <p>{{ speed }}</p>
            </div>
          }
        </div>
      </section>
      
      <!-- With Labels -->
      <section class="demo-section">
        <h3>With Labels</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-loading-spinner 
              label="Loading data" 
              [showLabel]="true"
              type="spin">
            </ui-loading-spinner>
            <p>With Label</p>
          </div>
          <div class="demo-item">
            <ui-loading-spinner 
              label="Processing" 
              [showLabel]="true"
              type="dots"
              variant="success">
            </ui-loading-spinner>
            <p>Processing</p>
          </div>
          <div class="demo-item">
            <ui-loading-spinner 
              label="Uploading" 
              [showLabel]="true"
              type="bars"
              variant="info">
            </ui-loading-spinner>
            <p>Uploading</p>
          </div>
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-loading-spinner></ui-loading-spinner>
            <p>Normal</p>
          </div>
          <div class="demo-item">
            <ui-loading-spinner [disabled]="true"></ui-loading-spinner>
            <p>Disabled</p>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive</h3>
        <div class="demo-interactive">
          <div class="demo-controls">
            <label>
              Size:
              <select [(ngModel)]="selectedSize">
                @for (size of sizes; track size) {
                  <option [value]="size">{{ size }}</option>
                }
              </select>
            </label>
            
            <label>
              Type:
              <select [(ngModel)]="selectedType">
                @for (type of types; track type) {
                  <option [value]="type">{{ type }}</option>
                }
              </select>
            </label>
            
            <label>
              Variant:
              <select [(ngModel)]="selectedVariant">
                @for (variant of variants; track variant) {
                  <option [value]="variant">{{ variant }}</option>
                }
              </select>
            </label>
            
            <label>
              Speed:
              <select [(ngModel)]="selectedSpeed">
                @for (speed of speeds; track speed) {
                  <option [value]="speed">{{ speed }}</option>
                }
              </select>
            </label>
            
            <label>
              <input type="checkbox" [(ngModel)]="showInteractiveLabel">
              Show Label
            </label>
            
            <label>
              <input type="checkbox" [(ngModel)]="isDisabled">
              Disabled
            </label>
          </div>
          
          <div class="demo-result">
            <ui-loading-spinner 
              [size]="selectedSize"
              [type]="selectedType"
              [variant]="selectedVariant"
              [speed]="selectedSpeed"
              [showLabel]="showInteractiveLabel"
              [disabled]="isDisabled"
              [label]="interactiveLabel"
              (clicked)="handleSpinnerClick($event)">
            </ui-loading-spinner>
          </div>
          
          @if (clickCount > 0) {
            <p>Spinner clicked: {{ clickCount }} times</p>
          }
        </div>
      </section>
      
      <!-- Usage Examples -->
      <section class="demo-section">
        <h3>Common Usage Examples</h3>
        <div class="demo-usage">
          <div class="usage-example">
            <h4>Loading Button</h4>
            <button class="demo-button" [disabled]="isLoading" (click)="simulateLoading()">
              @if (isLoading) {
                <ui-loading-spinner size="sm" variant="secondary" type="spin"></ui-loading-spinner>
                <span>Loading...</span>
              } @else {
                <span>Click to Load</span>
              }
            </button>
          </div>
          
          <div class="usage-example">
            <h4>Page Loading</h4>
            <div class="page-loading-example">
              @if (pageLoading) {
                <ui-loading-spinner 
                  size="lg" 
                  variant="primary" 
                  type="pulse"
                  label="Loading page content"
                  [showLabel]="true">
                </ui-loading-spinner>
              } @else {
                <div class="page-content">
                  <h5>Page Content</h5>
                  <p>This is the loaded content.</p>
                  <button (click)="simulatePageLoad()">Reload Page</button>
                </div>
              }
            </div>
          </div>
          
          <div class="usage-example">
            <h4>Data Processing</h4>
            <div class="processing-example">
              @if (processing) {
                <ui-loading-spinner 
                  type="bars" 
                  variant="success"
                  label="Processing data"
                  [showLabel]="true">
                </ui-loading-spinner>
              } @else {
                <div class="process-result">
                  <p>✅ Data processed successfully!</p>
                  <button (click)="simulateProcessing()">Process Data</button>
                </div>
              }
            </div>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './loading-spinner-demo.component.scss'
})
export class LoadingSpinnerDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  types = ['spin', 'dots', 'pulse', 'bars'] as const;
  variants = ['primary', 'secondary', 'accent', 'success', 'warning', 'danger', 'info'] as const;
  speeds = ['slow', 'normal', 'fast'] as const;
  
  // Interactive demo state
  selectedSize = 'md' as const;
  selectedType = 'spin' as const;
  selectedVariant = 'primary' as const;
  selectedSpeed = 'normal' as const;
  showInteractiveLabel = false;
  isDisabled = false;
  interactiveLabel = 'Loading';
  clickCount = 0;
  
  // Usage examples state
  isLoading = false;
  pageLoading = false;
  processing = false;
  
  handleSpinnerClick(event: MouseEvent): void {
    if (!this.isDisabled) {
      this.clickCount++;
      console.log('Spinner clicked', event);
    }
  }
  
  simulateLoading(): void {
    this.isLoading = true;
    setTimeout(() => {
      this.isLoading = false;
    }, 2000);
  }
  
  simulatePageLoad(): void {
    this.pageLoading = true;
    setTimeout(() => {
      this.pageLoading = false;
    }, 3000);
  }
  
  simulateProcessing(): void {
    this.processing = true;
    setTimeout(() => {
      this.processing = false;
    }, 2500);
  }
}pq~xu&LԼĜ⍿) G"x'.demo-container {
  .demo-section {
    margin-bottom: 2rem;
    
    h3 {
      margin-bottom: 1rem;
      color: #333;
    }
    
    .demo-row {
      display: grid;
      gap: 1.5rem;
      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
      
      .demo-item {
        &.full-width {
          grid-column: 1 / -1;
        }
        
        h4 {
          margin-bottom: 0.5rem;
          color: #555;
          font-size: 0.9rem;
          text-transform: uppercase;
          letter-spacing: 0.5px;
        }
      }
    }
  }
}@FVx)(import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MasonryComponent } from 'ui-essentials';

@Component({
  selector: 'ui-masonry-demo',
  standalone: true,
  imports: [CommonModule, MasonryComponent],
  template: `
    <div class="demo-container">
      <h2>Masonry Layout Demo</h2>
      <p>Pinterest-style dynamic grid layout that arranges items in columns with optimal vertical spacing.</p>
      
      <!-- Column Count Variants -->
      <section class="demo-section">
        <h3>Column Count</h3>
        <div class="demo-row">
          @for (columns of columnCounts; track columns) {
            <div class="demo-item">
              <h4>{{ columns }} Columns</h4>
              <ui-masonry [columns]="columns" gap="sm" padding="sm">
                @for (item of sampleItems.slice(0, 8); track item.id) {
                  <div class="ui-masonry-item ui-masonry-item--comfortable" 
                       [style.height.px]="item.height">
                    <h5>{{ item.title }}</h5>
                    <p>{{ item.content }}</p>
                  </div>
                }
              </ui-masonry>
            </div>
          }
        </div>
      </section>
      
      <!-- Auto Responsive Variants -->
      <section class="demo-section">
        <h3>Auto Responsive</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Auto Fit (250px min width)</h4>
            <ui-masonry columns="auto-fit" gap="md" padding="md">
              @for (item of sampleItems.slice(0, 12); track item.id) {
                <div class="ui-masonry-item ui-masonry-item--comfortable" 
                     [style.height.px]="item.height">
                  <h5>{{ item.title }}</h5>
                  <p>{{ item.content }}</p>
                </div>
              }
            </ui-masonry>
          </div>
          
          <div class="demo-item">
            <h4>Auto Fill (200px min width)</h4>
            <ui-masonry columns="auto-fill" gap="md" padding="md">
              @for (item of sampleItems.slice(0, 12); track item.id) {
                <div class="ui-masonry-item ui-masonry-item--comfortable" 
                     [style.height.px]="item.height">
                  <h5>{{ item.title }}</h5>
                  <p>{{ item.content }}</p>
                </div>
              }
            </ui-masonry>
          </div>
        </div>
      </section>
      
      <!-- Gap Variants -->
      <section class="demo-section">
        <h3>Gap Sizes</h3>
        <div class="demo-row">
          @for (gap of gaps; track gap) {
            <div class="demo-item">
              <h4>Gap: {{ gap }}</h4>
              <ui-masonry [columns]="3" [gap]="gap" padding="sm">
                @for (item of sampleItems.slice(0, 6); track item.id) {
                  <div class="ui-masonry-item ui-masonry-item--comfortable" 
                       [style.height.px]="item.height">
                    <h5>{{ item.title }}</h5>
                    <p>{{ item.content }}</p>
                  </div>
                }
              </ui-masonry>
            </div>
          }
        </div>
      </section>
      
      <!-- Padding Variants -->
      <section class="demo-section">
        <h3>Padding Options</h3>
        <div class="demo-row">
          @for (padding of paddings; track padding) {
            <div class="demo-item">
              <h4>Padding: {{ padding }}</h4>
              <ui-masonry [columns]="3" gap="sm" [padding]="padding">
                @for (item of sampleItems.slice(0, 6); track item.id) {
                  <div class="ui-masonry-item ui-masonry-item--comfortable" 
                       [style.height.px]="item.height">
                    <h5>{{ item.title }}</h5>
                    <p>{{ item.content }}</p>
                  </div>
                }
              </ui-masonry>
            </div>
          }
        </div>
      </section>
      
      <!-- Alignment Options -->
      <section class="demo-section">
        <h3>Alignment</h3>
        <div class="demo-row">
          @for (alignment of alignments; track alignment) {
            <div class="demo-item">
              <h4>Align: {{ alignment }}</h4>
              <ui-masonry [columns]="2" gap="md" padding="md" [alignment]="alignment">
                @for (item of sampleItems.slice(0, 4); track item.id) {
                  <div class="ui-masonry-item ui-masonry-item--comfortable" 
                       [style.height.px]="item.height">
                    <h5>{{ item.title }}</h5>
                    <p>{{ item.content }}</p>
                  </div>
                }
              </ui-masonry>
            </div>
          }
        </div>
      </section>
      
      <!-- Item Size Variants -->
      <section class="demo-section">
        <h3>Item Variants</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Mixed Item Sizes</h4>
            <ui-masonry [columns]="3" gap="md" padding="md">
              <div class="ui-masonry-item ui-masonry-item--compact" style="height: 120px;">
                <h5>Compact Item</h5>
                <p>Compact padding for dense layouts</p>
              </div>
              <div class="ui-masonry-item ui-masonry-item--comfortable" style="height: 200px;">
                <h5>Comfortable Item</h5>
                <p>Standard comfortable padding for most use cases</p>
              </div>
              <div class="ui-masonry-item ui-masonry-item--spacious" style="height: 180px;">
                <h5>Spacious Item</h5>
                <p>Extra padding for premium content</p>
              </div>
              <div class="ui-masonry-item ui-masonry-item--flush" style="height: 160px;">
                <div style="padding: 16px; background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); color: white;">
                  <h5>Full Bleed Item</h5>
                  <p>No padding for full-width content</p>
                </div>
              </div>
              @for (item of sampleItems.slice(0, 6); track item.id) {
                <div class="ui-masonry-item ui-masonry-item--comfortable" 
                     [style.height.px]="item.height">
                  <h5>{{ item.title }}</h5>
                  <p>{{ item.content }}</p>
                </div>
              }
            </ui-masonry>
          </div>
        </div>
      </section>
      
      <!-- Pinterest-style Example -->
      <section class="demo-section">
        <h3>Pinterest-style Gallery</h3>
        <div class="demo-row">
          <div class="demo-item full-width">
            <ui-masonry columns="auto-fit" gap="lg" padding="lg" minColumnWidth="280px">
              @for (item of extendedItems; track item.id) {
                <div class="ui-masonry-item ui-masonry-item--comfortable" 
                     [style.height.px]="item.height"
                     [style.background]="item.background">
                  <h5 style="color: white; text-shadow: 0 1px 2px rgba(0,0,0,0.5);">{{ item.title }}</h5>
                  <p style="color: rgba(255,255,255,0.9); text-shadow: 0 1px 2px rgba(0,0,0,0.3);">{{ item.content }}</p>
                </div>
              }
            </ui-masonry>
          </div>
        </div>
      </section>
      
    </div>
  `,
  styleUrl: './masonry-demo.component.scss'
})
export class MasonryDemoComponent {
  columnCounts = [2, 3, 4] as const;
  gaps = ['sm', 'md', 'lg'] as const;
  paddings = ['none', 'sm', 'md', 'lg'] as const;
  alignments = ['start', 'center', 'end'] as const;
  
  sampleItems = [
    { id: 1, title: 'Card 1', content: 'Short content', height: 120 },
    { id: 2, title: 'Card 2', content: 'Medium length content with more details', height: 180 },
    { id: 3, title: 'Card 3', content: 'Brief', height: 100 },
    { id: 4, title: 'Card 4', content: 'Longer content with multiple lines of text to demonstrate variable heights', height: 220 },
    { id: 5, title: 'Card 5', content: 'Standard content', height: 140 },
    { id: 6, title: 'Card 6', content: 'Extended content with even more text to show how masonry handles varying content lengths', height: 260 },
    { id: 7, title: 'Card 7', content: 'Compact', height: 90 },
    { id: 8, title: 'Card 8', content: 'Regular content block', height: 160 },
    { id: 9, title: 'Card 9', content: 'Another piece of content', height: 130 },
    { id: 10, title: 'Card 10', content: 'Different sized content', height: 200 },
    { id: 11, title: 'Card 11', content: 'Small content', height: 110 },
    { id: 12, title: 'Card 12', content: 'Large content with lots of text and information', height: 240 }
  ];
  
  extendedItems = [
    { id: 1, title: 'Ocean Waves', content: 'Beautiful ocean scenery with crashing waves', height: 180, background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' },
    { id: 2, title: 'Mountain Vista', content: 'Majestic mountain range at sunset', height: 220, background: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)' },
    { id: 3, title: 'Forest Path', content: 'Winding path through dense forest', height: 160, background: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)' },
    { id: 4, title: 'Desert Dunes', content: 'Golden sand dunes stretching to horizon', height: 200, background: 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)' },
    { id: 5, title: 'City Skyline', content: 'Modern city with glowing lights', height: 140, background: 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)' },
    { id: 6, title: 'Northern Lights', content: 'Aurora borealis dancing across night sky', height: 250, background: 'linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)' },
    { id: 7, title: 'Tropical Beach', content: 'Palm trees and crystal clear water', height: 180, background: 'linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%)' },
    { id: 8, title: 'Snow Peaks', content: 'Snow-capped mountain peaks', height: 190, background: 'linear-gradient(135deg, #a1c4fd 0%, #c2e9fb 100%)' },
    { id: 9, title: 'Autumn Leaves', content: 'Colorful fall foliage', height: 170, background: 'linear-gradient(135deg, #fad0c4 0%, #fad0c4 1%, #ffd1ff 100%)' },
    { id: 10, title: 'Starry Night', content: 'Countless stars in clear night sky', height: 210, background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' },
    { id: 11, title: 'Wildflowers', content: 'Field of colorful wildflowers', height: 150, background: 'linear-gradient(135deg, #ff9a9e 0%, #fecfef 50%, #fecfef 100%)' },
    { id: 12, title: 'Waterfall', content: 'Powerful waterfall cascading down rocks', height: 230, background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' }
  ];
}䬸xW@use "../../../../../ui-design-system/src/styles/tokens" as *;

// Tokens available globally via main application styles
 
// ==========================================================================
// MENU DEMO COMPONENT
// ==========================================================================
// Demonstration component showcasing all menu variants and capabilities
// ==========================================================================

.menu-demo {
  padding: $semantic-spacing-component-xl;
  max-width: 1400px;
  margin: 0 auto;
  
  h2 {
    font-size: 2rem;
    font-weight: 600;
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-layout-lg;
    text-align: center;
    border-bottom: 2px solid $semantic-color-interactive-primary;
    padding-bottom: $semantic-spacing-component-sm;
  }
}

.demo-section {
  margin-bottom: $semantic-spacing-layout-xl;
  border: 1px solid $semantic-color-border-secondary;
  border-radius: $semantic-border-radius-lg;
  padding: $semantic-spacing-component-xl;
  background: $semantic-color-surface-elevated;
  
  h3 {
    font-size: 1.5rem;
    font-weight: 500;
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-xl;
    padding-bottom: $semantic-spacing-component-sm;
    border-bottom: 2px solid $semantic-color-border-secondary;
  }
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: $semantic-spacing-component-xl;
  margin-bottom: $semantic-spacing-layout-md;
}

.demo-item {
  h4 {
    font-size: 1rem;
    font-weight: 500;
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-component-md;
    text-align: center;
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    background-color: $semantic-color-surface-secondary;
    border-radius: $semantic-border-radius-sm;
  }
}

.demo-single {
  max-width: 800px;
  margin: 0 auto;
  
  h4 {
    font-size: 1rem;
    font-weight: 500;
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-component-md;
    text-align: center;
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    background-color: $semantic-color-surface-secondary;
    border-radius: $semantic-border-radius-sm;
  }
}

// ==========================================================================
// USAGE EXAMPLES SECTION
// ==========================================================================

.usage-examples {
  background: $semantic-color-surface-secondary;
  padding: $semantic-spacing-component-xl;
  border-radius: $semantic-border-radius-md;
  border-left: 4px solid $semantic-color-interactive-primary;
  
  h4 {
    font-size: 1rem;
    font-weight: 600;
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-sm;
    margin-top: $semantic-spacing-component-lg;
    text-align: left;
    padding: 0;
    background: none;
    
    &:first-child {
      margin-top: 0;
    }
  }
  
  pre {
    background: $semantic-color-surface-primary;
    padding: $semantic-spacing-component-md;
    border-radius: $semantic-border-radius-sm;
    overflow-x: auto;
    margin: $semantic-spacing-component-sm 0 $semantic-spacing-component-lg 0;
    border: 1px solid $semantic-color-border-secondary;
  }
  
  code {
    font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
    font-size: 0.875rem;
    line-height: 1.5;
    color: $semantic-color-text-primary;
  }
}

// ==========================================================================
// INTERACTIVE DEMO SECTION
// ==========================================================================

.interactive-demo {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: $semantic-spacing-component-lg;
}

.demo-feedback {
  padding: $semantic-spacing-component-md;
  background: $semantic-color-container-primary;
  color: $semantic-color-on-container-primary;
  border-radius: $semantic-border-radius-md;
  border: 1px solid $semantic-color-border-secondary;
  text-align: center;
  
  strong {
    font-weight: 600;
  }
}

// ==========================================================================
// RESPONSIVE DESIGN
// ==========================================================================

@media (max-width: 768px) {
  .menu-demo {
    padding: $semantic-spacing-component-lg;
    
    h2 {
      font-size: 1.5rem;
    }
  }
  
  .demo-grid {
    grid-template-columns: 1fr;
    gap: $semantic-spacing-component-lg;
  }
  
  .demo-section {
    padding: $semantic-spacing-component-lg;
    
    h3 {
      font-size: 1.25rem;
    }
  }
  
  .usage-examples {
    padding: $semantic-spacing-component-lg;
    
    pre {
      font-size: 0.75rem;
    }
  }
}

@media (max-width: 480px) {
  .menu-demo {
    padding: $semantic-spacing-component-md;
  }
  
  .demo-section {
    padding: $semantic-spacing-component-md;
  }
  
  .demo-grid {
    gap: $semantic-spacing-component-md;
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

// Focus indicators for better keyboard navigation
.menu-demo {
  .demo-section:focus-within {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 4px;
    border-radius: $semantic-border-radius-md;
  }
}

// High contrast mode support
@media (prefers-contrast: high) {
  .demo-section {
    border: 2px solid $semantic-color-border-primary;
  }
  
  .demo-feedback {
    border: 2px solid $semantic-color-border-primary;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .menu-demo * {
    transition: none;
    animation: none;
  }
}nC6x[Pw(gqFbQjniFf1 MCh xy-(semantic/index0B2RLIST EXAMPLES΃listUklist-examples*2$}
}

.exampleF;?exampleOexample-item {
.o%^X%}
}

.example-single {
  max-width: 60TTRAILING SLOT COMPONENTSq	Q4action-button {
  background: none;
  border: none;

tertiary;
  cursor: pointer*s-
+1transition: all 0.15s ease-in-out;
  
  &:hover {/interactiveQ"^}
  
  &:focusL2px;
  }
  
  i
/4px;
  }
}

.timestamp {
  font-size: 0.75rem;

etertiary;
  font-weight: 400;
}

.play-button {
  width: 32px;
  height: 32px;
  border-radius: 50%;
$

Don-brand-primary;
  border: none;
  cursor: pointer;
  display: flexjustify-content: center;
  transition: all 0.15s ease-in-out;
  
  &:hover {
    transform: scale(1.05);
    box-shadow: $seman(tic-shadow-elevation-1;
  }
  
  &:focusL2px;
  }
  
  i
^2px;
    margin-left: 2px; // Optical alignment for play icon
  }
}

.rating {
  display: flex2micro-tight;

	warning;
]b
  i
4px;
  }
}

.select-button {
$

 on-brand-primary;
  border: none*$1
'_bDcursor: pointer;
  transition: all 0.15s ease-in-out;
  
  &:hover {''interactive-secondary;
  }
  
  &:focusL2px;
  }
}

.text-success {

success;/listLBF.examplex[example-section {
  Q*md4"listL5example-grid {&dlist-examples {
  button:focus,
  .action-button:focus,
  .play-button:focus,
  .select-button:focusL2px;
  /
)@@4action-button,
  .play-button,
  .select-button {
  +W/action-button,
  .play-button,
  .select-buttonn6}
  
  .play-button:hover {
    transform: none;
  }
}nx'd؛import { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import {
  faUser, faHome, faCog, faEnvelope, faDownload, faShare, faFileExport,
  faChartBar, faChartLine, faFileAlt, faShieldAlt, faDatabase, faTrash,
  faStar, faBolt, faInfoCircle, faExclamationTriangle, faFolder, faCirclePlus,
  faFolderOpen, faEdit, faSave, faTachometerAlt, faProjectDiagram, faPlayCircle,
  faCheckCircle, faArchive, faCalendarWeek, faCalendarAlt, faCalendar, faSlidersH,
  faPalette, faBell, faQuestionCircle, faSignOutAlt, faBox, faConciergeBell,
  faCircle, faRefresh, faToggleOn
} from '@fortawesome/free-solid-svg-icons';
import { faAngular, faGithub } from '@fortawesome/free-brands-svg-icons';
import { MenuItemComponent } from '../../../../../ui-essentials/src/lib/components/navigation/menu/menu-item.component';
import { MenuContainerComponent } from '../../../../../ui-essentials/src/lib/components/navigation/menu/menu-container.component';
import { MenuSubmenuComponent } from '../../../../../ui-essentials/src/lib/components/navigation/menu/menu-submenu.component';
import { MenuItemData } from '../../../../../ui-essentials/src/lib/components/navigation/menu/menu-item.component';

@Component({
  selector: 'ui-menu-demo',
  standalone: true,
  imports: [
    CommonModule,
    MenuItemComponent,
    MenuContainerComponent,
    MenuSubmenuComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="menu-demo">
      <h2>Menu Component Showcase</h2>
      
      <!-- Basic Menu Items -->
      <section class="demo-section">
        <h3>Basic Menu Items</h3>
        
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Text Only - Different Sizes</h4>
            <ui-menu-container elevation="sm" spacing="sm" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'Small Menu Item' }"
                size="sm"
                (itemClick)="handleMenuClick('small item', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Medium Menu Item' }"
                size="md"
                (itemClick)="handleMenuClick('medium item', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Large Menu Item' }"
                size="lg"
                (itemClick)="handleMenuClick('large item', $event)"
              />
            </ui-menu-container>
          </div>
          
          <div class="demo-item">
            <h4>Menu States</h4>
            <ui-menu-container elevation="sm" spacing="sm" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'Normal Item', active: false }"
                (itemClick)="handleMenuClick('normal', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Active Item', active: true }"
                (itemClick)="handleMenuClick('active', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Disabled Item', disabled: true }"
                (itemClick)="handleMenuClick('disabled', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'With Badge', badge: '3' }"
                (itemClick)="handleMenuClick('badge', $event)"
              />
            </ui-menu-container>
          </div>
        </div>
      </section>

      <!-- Icons and Variants -->
      <section class="demo-section">
        <h3>Icons and Variants</h3>
        
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Left Icons</h4>
            <ui-menu-container elevation="sm" spacing="sm" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'Home', icon: faUser }"
                iconPosition="left" 
                (itemClick)="handleMenuClick('home', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Settings', icon: faCog }"
                iconPosition="left"
                (itemClick)="handleMenuClick('settings', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Profile', icon: faUser }"
                iconPosition="left"
                (itemClick)="handleMenuClick('profile', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Messages', icon: faEnvelope, badge: '12' }"
                iconPosition="left"
                (itemClick)="handleMenuClick('messages', $event)"
              />
            </ui-menu-container>
          </div>
          
          <div class="demo-item">
            <h4>Right Icons</h4>
            <ui-menu-container elevation="sm" spacing="sm" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'Download', icon: faDownload }"
                iconPosition="right"
                (itemClick)="handleMenuClick('download', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Share', icon: faShare }"
                iconPosition="right"
                (itemClick)="handleMenuClick('share', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Export', icon: faFileExport }"
                iconPosition="right"
                (itemClick)="handleMenuClick('export', $event)"
              />
            </ui-menu-container>
          </div>
        </div>
      </section>

      <!-- Circular Icons -->
      <section class="demo-section">
        <h3>Circular Icons</h3>
        
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Circle Icons - Left</h4>
            <ui-menu-container elevation="md" spacing="md" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'Dashboard', icon: faChartBar, iconCircle: true }"
                iconPosition="left"
                variant="primary"
                (itemClick)="handleMenuClick('dashboard', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Analytics', icon: faChartLine, iconCircle: true }"
                iconPosition="left"
                variant="secondary"
                (itemClick)="handleMenuClick('analytics', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Reports', icon: faFileAlt, iconCircle: true }"
                iconPosition="left"
                (itemClick)="handleMenuClick('reports', $event)"
              />
            </ui-menu-container>
          </div>
          
          <div class="demo-item">
            <h4>Circle Icons - Right</h4>
            <ui-menu-container elevation="md" spacing="md" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'Security', icon: faShieldAlt, iconCircle: true }"
                iconPosition="right"
                variant="primary"
                (itemClick)="handleMenuClick('security', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Backup', icon: faDatabase, iconCircle: true }"
                iconPosition="right"
                variant="secondary"
                (itemClick)="handleMenuClick('backup', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Delete', icon: faTrash, iconCircle: true }"
                iconPosition="right"
                variant="danger"
                (itemClick)="handleMenuClick('delete', $event)"
              />
            </ui-menu-container>
          </div>
        </div>
      </section>

      <!-- Menu Variants -->
      <section class="demo-section">
        <h3>Menu Variants</h3>
        
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Color Variants</h4>
            <ui-menu-container elevation="sm" spacing="sm" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'Default Action', icon: faStar }"
                variant="default"
                iconPosition="left"
                (itemClick)="handleMenuClick('default action', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Primary Action', icon: faBolt }"
                variant="primary"
                iconPosition="left"
                (itemClick)="handleMenuClick('primary action', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Secondary Action', icon: faInfoCircle }"
                variant="secondary"
                iconPosition="left"
                (itemClick)="handleMenuClick('secondary action', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Danger Action', icon: faExclamationTriangle }"
                variant="danger"
                iconPosition="left"
                (itemClick)="handleMenuClick('danger action', $event)"
              />
            </ui-menu-container>
          </div>
          
          <div class="demo-item">
            <h4>With Dividers</h4>
            <ui-menu-container elevation="sm" spacing="sm" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'File Operations', icon: faFolder }"
                iconPosition="left"
                [showDivider]="true"
                (itemClick)="handleMenuClick('file ops', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'New File', icon: faCirclePlus }"
                iconPosition="left"
                (itemClick)="handleMenuClick('new file', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Open File', icon: faFolderOpen }"
                iconPosition="left"
                [showDivider]="true"
                (itemClick)="handleMenuClick('open file', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Edit Operations', icon: faEdit }"
                iconPosition="left"
                (itemClick)="handleMenuClick('edit ops', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Save', icon: faSave }"
                iconPosition="left"
                (itemClick)="handleMenuClick('save', $event)"
              />
            </ui-menu-container>
          </div>
        </div>
      </section>

      <!-- Submenu Examples -->
      <section class="demo-section">
        <h3>Collapsible Submenus</h3>
        
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Navigation Menu</h4>
            <ui-menu-container elevation="md" spacing="sm" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'Dashboard', icon: faTachometerAlt }"
                iconPosition="left"
                (itemClick)="handleMenuClick('dashboard', $event)"
              />
              
              <ui-menu-submenu 
                [parentItem]="{ label: 'Projects', icon: faProjectDiagram, hasSubmenu: true }"
                iconPosition="left"
                [isOpen]="submenuStates['projects']"
                (submenuToggled)="toggleSubmenu('projects', $event)"
                (parentItemClick)="handleMenuClick('projects parent', $event)"
              >
                <ui-menu-item 
                  [data]="{ label: 'Active Projects', icon: faPlayCircle }"
                  iconPosition="left"
                  size="sm"
                  (itemClick)="handleMenuClick('active projects', $event)"
                />
                <ui-menu-item 
                  [data]="{ label: 'Completed Projects', icon: faCheckCircle }"
                  iconPosition="left"
                  size="sm"
                  (itemClick)="handleMenuClick('completed projects', $event)"
                />
                <ui-menu-item 
                  [data]="{ label: 'Archived Projects', icon: faArchive }"
                  iconPosition="left"
                  size="sm"
                  (itemClick)="handleMenuClick('archived projects', $event)"
                />
              </ui-menu-submenu>
              
              <ui-menu-submenu 
                [parentItem]="{ label: 'Reports', icon: faChartBar, hasSubmenu: true }"
                iconPosition="left"
                [isOpen]="submenuStates['reports']"
                (submenuToggled)="toggleSubmenu('reports', $event)"
                (parentItemClick)="handleMenuClick('reports parent', $event)"
              >
                <ui-menu-item 
                  [data]="{ label: 'Weekly Report', icon: faCalendarWeek }"
                  iconPosition="left"
                  size="sm"
                  (itemClick)="handleMenuClick('weekly report', $event)"
                />
                <ui-menu-item 
                  [data]="{ label: 'Monthly Report', icon: faCalendarAlt }"
                  iconPosition="left"
                  size="sm"
                  (itemClick)="handleMenuClick('monthly report', $event)"
                />
                <ui-menu-item 
                  [data]="{ label: 'Annual Report', icon: faCalendar }"
                  iconPosition="left"
                  size="sm"
                  (itemClick)="handleMenuClick('annual report', $event)"
                />
              </ui-menu-submenu>
              
              <ui-menu-item 
                [data]="{ label: 'Settings', icon: faCog }"
                iconPosition="left"
                (itemClick)="handleMenuClick('settings', $event)"
              />
            </ui-menu-container>
          </div>
          
          <div class="demo-item">
            <h4>User Menu</h4>
            <ui-menu-container elevation="md" spacing="sm" [rounded]="true">
              <ui-menu-item 
                [data]="{ label: 'My Profile', icon: faUser }"
                iconPosition="left"
                (itemClick)="handleMenuClick('profile', $event)"
              />
              
              <ui-menu-submenu 
                [parentItem]="{ label: 'Preferences', icon: faSlidersH, hasSubmenu: true }"
                iconPosition="left"
                [isOpen]="submenuStates['preferences']"
                (submenuToggled)="toggleSubmenu('preferences', $event)"
                (parentItemClick)="handleMenuClick('preferences parent', $event)"
              >
                <ui-menu-item 
                  [data]="{ label: 'Theme Settings', icon: faPalette }"
                  iconPosition="left"
                  size="sm"
                  (itemClick)="handleMenuClick('theme', $event)"
                />
                <ui-menu-item 
                  [data]="{ label: 'Notifications', icon: faBell }"
                  iconPosition="left"
                  size="sm"
                  [showDivider]="true"
                  (itemClick)="handleMenuClick('notifications', $event)"
                />
                <ui-menu-item 
                  [data]="{ label: 'Privacy', icon: faShieldAlt }"
                  iconPosition="left"
                  size="sm"
                  (itemClick)="handleMenuClick('privacy', $event)"
                />
              </ui-menu-submenu>
              
              <ui-menu-item 
                [data]="{ label: 'Help & Support', icon: faQuestionCircle }"
                iconPosition="left"
                [showDivider]="true"
                (itemClick)="handleMenuClick('help', $event)"
              />
              
              <ui-menu-item 
                [data]="{ label: 'Sign Out', icon: faSignOutAlt }"
                iconPosition="left"
                variant="danger"
                (itemClick)="handleMenuClick('sign out', $event)"
              />
            </ui-menu-container>
          </div>
        </div>
      </section>

      <!-- Horizontal Menu -->
      <section class="demo-section">
        <h3>Horizontal Menu</h3>
        
        <div class="demo-single">
          <h4>Navigation Bar Style</h4>
          <ui-menu-container 
            elevation="sm" 
            spacing="md" 
            orientation="horizontal"
            [rounded]="true"
          >
            <ui-menu-item 
              [data]="{ label: 'Home', icon: faHome }"
              iconPosition="left"
              size="sm"
              (itemClick)="handleMenuClick('home nav', $event)"
            />
            <ui-menu-item 
              [data]="{ label: 'Products', icon: faBox }"
              iconPosition="left"
              size="sm"
              (itemClick)="handleMenuClick('products nav', $event)"
            />
            <ui-menu-item 
              [data]="{ label: 'Services', icon: faConciergeBell }"
              iconPosition="left"
              size="sm"
              (itemClick)="handleMenuClick('services nav', $event)"
            />
            <ui-menu-item 
              [data]="{ label: 'About', icon: faInfoCircle }"
              iconPosition="left"
              size="sm"
              (itemClick)="handleMenuClick('about nav', $event)"
            />
            <ui-menu-item 
              [data]="{ label: 'Contact', icon: faEnvelope }"
              iconPosition="left"
              size="sm"
              variant="primary"
              (itemClick)="handleMenuClick('contact nav', $event)"
            />
          </ui-menu-container>
        </div>
      </section>

      <!-- Dense and Scrollable -->
      <section class="demo-section">
        <h3>Layout Options</h3>
        
        <div class="demo-grid">
          <div class="demo-item">
            <h4>Dense Menu</h4>
            <ui-menu-container elevation="sm" spacing="xs" [rounded]="true" [dense]="true">
              <ui-menu-item 
                [data]="{ label: 'Compact Item 1', icon: faCircle }"
                iconPosition="left"
                size="sm"
                [dense]="true"
                (itemClick)="handleMenuClick('compact 1', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Compact Item 2', icon: faCircle }"
                iconPosition="left"
                size="sm"
                [dense]="true"
                (itemClick)="handleMenuClick('compact 2', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Compact Item 3', icon: faCircle }"
                iconPosition="left"
                size="sm"
                [dense]="true"
                (itemClick)="handleMenuClick('compact 3', $event)"
              />
              <ui-menu-item 
                [data]="{ label: 'Compact Item 4', icon: faCircle }"
                iconPosition="left"
                size="sm"
                [dense]="true"
                (itemClick)="handleMenuClick('compact 4', $event)"
              />
            </ui-menu-container>
          </div>
          
          <div class="demo-item">
            <h4>Scrollable Menu</h4>
            <ui-menu-container 
              elevation="md" 
              spacing="sm" 
              [rounded]="true"
              [scrollable]="true"
              maxHeight="200px"
            >
              @for (item of scrollableItems; track item.id) {
                <ui-menu-item 
                  [data]="item"
                  iconPosition="left"
                  size="md"
                  (itemClick)="handleMenuClick('scrollable ' + item.id, item)"
                />
              }
            </ui-menu-container>
          </div>
        </div>
      </section>

      <!-- Menu with Links -->
      <section class="demo-section">
        <h3>Menu with Links</h3>
        
        <div class="demo-single">
          <h4>External Links</h4>
          <ui-menu-container elevation="sm" spacing="sm" [rounded]="true">
            <ui-menu-item 
              [data]="{ 
                label: 'Angular Documentation', 
                icon: faAngular,
                href: 'https://angular.io',
                target: '_blank'
              }"
              iconPosition="left"
              (itemClick)="handleMenuClick('angular docs', $event)"
            />
            <ui-menu-item 
              [data]="{ 
                label: 'GitHub Repository', 
                icon: faGithub,
                href: 'https://github.com',
                target: '_blank'
              }"
              iconPosition="left"
              (itemClick)="handleMenuClick('github', $event)"
            />
            <ui-menu-item 
              [data]="{ 
                label: 'Material Design', 
                icon: faPalette,
                href: 'https://material.io',
                target: '_blank'
              }"
              iconPosition="left"
              (itemClick)="handleMenuClick('material', $event)"
            />
          </ui-menu-container>
        </div>
      </section>

      <!-- Usage Examples -->
      <section class="demo-section">
        <h3>Usage Examples</h3>
        <div class="usage-examples">
          <h4>Basic Menu Item:</h4>
          <pre><code>{{ '<' }}ui-menu-item 
  [data]="{{ '{' }} label: 'Menu Item', icon: faHome {{ '}' }}"
  iconPosition="left"
  variant="primary"
  (itemClick)="handleClick($event)"{{ '>' }}
{{ '<' }}/ui-menu-item{{ '>' }}</code></pre>
          
          <h4>Menu with Submenu:</h4>
          <pre><code>{{ '<' }}ui-menu-submenu 
  [parentItem]="{{ '{' }} label: 'Parent', hasSubmenu: true {{ '}' }}"
  [isOpen]="submenuOpen"
  (submenuToggled)="toggleSubmenu($event)"{{ '>' }}
  
  {{ '<' }}ui-menu-item [data]="childItem1"{{ '>' }}{{ '<' }}/ui-menu-item{{ '>' }}
  {{ '<' }}ui-menu-item [data]="childItem2"{{ '>' }}{{ '<' }}/ui-menu-item{{ '>' }}
{{ '<' }}/ui-menu-submenu{{ '>' }}</code></pre>

          <h4>Menu Container:</h4>
          <pre><code>{{ '<' }}ui-menu-container 
  elevation="md"
  spacing="sm"
  [rounded]="true"
  [scrollable]="true"
  maxHeight="300px"{{ '>' }}
  
  {{ '<' }}!-- Menu items here --{{ '>' }}
{{ '<' }}/ui-menu-container{{ '>' }}</code></pre>
        </div>
      </section>

      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Actions</h3>
        <div class="interactive-demo">
          <ui-menu-container elevation="sm" spacing="sm" [rounded]="true">
            <ui-menu-item 
              [data]="{ label: 'Show Alert', icon: faBell }"
              iconPosition="left"
              variant="primary"
              (itemClick)="showAlert('Menu Alert!')"
            />
            <ui-menu-item 
              [data]="{ label: 'Toggle Demo State', icon: faToggleOn }"
              iconPosition="left"
              (itemClick)="toggleDemoState()"
            />
            <ui-menu-item 
              [data]="{ label: 'Reset Demo', icon: faRefresh }"
              iconPosition="left"
              variant="secondary"
              (itemClick)="resetDemo()"
            />
          </ui-menu-container>
          
          @if (lastClickedItem) {
            <div class="demo-feedback">
              <strong>Last clicked:</strong> {{ lastClickedItem }}
            </div>
          }
        </div>
      </section>
    </div>
  `,
  styleUrls: ['./menu-demo.component.scss']
})
export class MenuDemoComponent {
  // FontAwesome icons
  faUser = faUser;
  faHome = faHome;
  faCog = faCog;
  faEnvelope = faEnvelope;
  faDownload = faDownload;
  faShare = faShare;
  faFileExport = faFileExport;
  faChartBar = faChartBar;
  faChartLine = faChartLine;
  faFileAlt = faFileAlt;
  faShieldAlt = faShieldAlt;
  faDatabase = faDatabase;
  faTrash = faTrash;
  faStar = faStar;
  faBolt = faBolt;
  faInfoCircle = faInfoCircle;
  faExclamationTriangle = faExclamationTriangle;
  faFolder = faFolder;
  faCirclePlus = faCirclePlus;
  faFolderOpen = faFolderOpen;
  faEdit = faEdit;
  faSave = faSave;
  faTachometerAlt = faTachometerAlt;
  faProjectDiagram = faProjectDiagram;
  faPlayCircle = faPlayCircle;
  faCheckCircle = faCheckCircle;
  faArchive = faArchive;
  faCalendarWeek = faCalendarWeek;
  faCalendarAlt = faCalendarAlt;
  faCalendar = faCalendar;
  faSlidersH = faSlidersH;
  faPalette = faPalette;
  faBell = faBell;
  faQuestionCircle = faQuestionCircle;
  faSignOutAlt = faSignOutAlt;
  faBox = faBox;
  faConciergeBell = faConciergeBell;
  faCircle = faCircle;
  faRefresh = faRefresh;
  faToggleOn = faToggleOn;
  faAngular = faAngular;
  faGithub = faGithub;

  lastClickedItem: string = '';
  submenuStates: Record<string, boolean> = {
    projects: false,
    reports: false,
    preferences: false
  };

  scrollableItems: MenuItemData[] = Array.from({ length: 15 }, (_, i) => ({
    id: `item-${i + 1}`,
    label: `Scrollable Item ${i + 1}`,
    icon: this.faCircle
  }));

  handleMenuClick(action: string, item: MenuItemData): void {
    this.lastClickedItem = `${action} (${item.label})`;
    console.log(`Menu clicked: ${action}`, item);
  }

  toggleSubmenu(key: string, event: { item: MenuItemData; isOpen: boolean }): void {
    this.submenuStates[key] = event.isOpen;
    console.log(`Submenu ${key} ${event.isOpen ? 'opened' : 'closed'}`);
  }

  showAlert(message: string): void {
    alert(message);
    this.lastClickedItem = 'Alert shown';
  }

  toggleDemoState(): void {
    // Toggle all submenus
    Object.keys(this.submenuStates).forEach(key => {
      this.submenuStates[key] = !this.submenuStates[key];
    });
    this.lastClickedItem = 'Demo state toggled';
  }

  resetDemo(): void {
    this.lastClickedItem = '';
    this.submenuStates = {
      projects: false,
      reports: false,
      preferences: false
    };
    console.log('Demo reset');
  }
}Y'b5x[~Qu|SJJ3RsRJ I`iYWxp@use '../../../../../shared-ui/src/styles/semantic/index' as *;

.demo-container {
  padding: $semantic-spacing-layout-md;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: $semantic-spacing-layout-xl;
  
  h2 {
    color: $semantic-color-on-surface;
    font-size: $semantic-typography-heading-h2-size;
    margin-bottom: $semantic-spacing-content-heading;
    border-bottom: 1px solid $semantic-color-outline;
    padding-bottom: $semantic-spacing-content-line-normal;
  }
  
  h3 {
    color: $semantic-color-on-surface;
    font-size: $semantic-typography-heading-h4-size;
    margin-bottom: $semantic-spacing-component-lg;
  }
}

.demo-row {
  display: flex;
  flex-wrap: wrap;
  gap: $semantic-spacing-component-sm;
  align-items: flex-start;
  
  @media (max-width: 768px) {
    flex-direction: column;
    align-items: stretch;
  }
}

.config-panel {
  background: $semantic-color-surface-variant;
  border: 1px solid $semantic-color-outline;
  border-radius: $semantic-border-radius-md;
  padding: $semantic-spacing-component-lg;
  margin-top: $semantic-spacing-component-lg;
}

.config-row {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-md;
  margin-bottom: $semantic-spacing-component-md;
  flex-wrap: wrap;
  
  &:last-child {
    margin-bottom: 0;
    margin-top: $semantic-spacing-component-lg;
    justify-content: flex-start;
  }
  
  label {
    font-size: $semantic-typography-font-size-sm;
    color: $semantic-color-on-surface;
    display: flex;
    align-items: center;
    gap: $semantic-spacing-component-xs;
    white-space: nowrap;
    
    &:first-child {
      min-width: 80px;
      font-weight: $semantic-typography-font-weight-medium;
    }
  }
  
  select {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    border: 1px solid $semantic-color-outline;
    border-radius: $semantic-border-radius-sm;
    background: $semantic-color-surface-primary;
    color: $semantic-color-on-surface;
    font-size: $semantic-typography-font-size-sm;
    min-width: 120px;
    
    &:focus {
      outline: 2px solid $semantic-color-primary;
      outline-offset: 2px;
      border-color: $semantic-color-primary;
    }
  }
  
  input[type="checkbox"] {
    accent-color: $semantic-color-primary;
    transform: scale(1.1);
  }
  
  @media (max-width: 768px) {
    flex-direction: column;
    align-items: flex-start;
    
    label:first-child {
      min-width: auto;
    }
  }
}

.event-log {
  background: $semantic-color-surface-primary;
  border: 1px solid $semantic-color-outline;
  border-radius: $semantic-border-radius-md;
  padding: $semantic-spacing-component-md;
  max-height: 300px;
  overflow-y: auto;
  margin-bottom: $semantic-spacing-component-md;
  font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
  font-size: $semantic-typography-font-size-sm;
}

.event-item {
  padding: $semantic-spacing-component-xs 0;
  border-bottom: 1px solid $semantic-color-outline-variant;
  color: $semantic-color-on-surface-variant;
  
  &:last-child {
    border-bottom: none;
  }
  
  &:first-child {
    color: $semantic-color-on-surface;
    font-weight: $semantic-typography-font-weight-medium;
  }
}U*봰x@use '../../../../../ui-design-system/src/styles/semantic/index' as tokens;

.demo-container {
  padding: tokens.$semantic-spacing-layout-md;
  max-width: 1200px;
  margin: 0 auto;

  h2 {
    font-size: tokens.$semantic-typography-heading-h2-size;
    color: tokens.$semantic-color-text-primary;
    margin-bottom: tokens.$semantic-spacing-content-heading;
    border-bottom: tokens.$semantic-border-width-1 solid tokens.$semantic-color-border-subtle;
    padding-bottom: tokens.$semantic-spacing-content-paragraph;
  }

  h3 {
    font-size: tokens.$semantic-typography-heading-h3-size;
    color: tokens.$semantic-color-text-primary;
    margin-bottom: tokens.$semantic-spacing-content-paragraph;
  }
}

.demo-section {
  margin-bottom: tokens.$semantic-spacing-layout-lg;

  &:last-child {
    margin-bottom: 0;
  }
}

.demo-row {
  display: flex;
  flex-wrap: wrap;
  gap: tokens.$semantic-spacing-component-sm;
  margin-bottom: tokens.$semantic-spacing-content-paragraph;
}

.demo-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: tokens.$semantic-sizing-button-height-md;
  padding: tokens.$semantic-spacing-component-sm tokens.$semantic-spacing-component-md;
  
  // Visual design
  background: tokens.$semantic-color-primary;
  color: tokens.$semantic-color-on-primary;
  border: none;
  border-radius: tokens.$semantic-border-radius-md;
  box-shadow: tokens.$semantic-shadow-button-rest;
  
  // Typography
  font-size: tokens.$semantic-typography-font-size-md;
  font-weight: tokens.$semantic-typography-font-weight-medium;
  text-decoration: none;
  white-space: nowrap;
  
  // Transitions
  transition: background-color tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease,
              box-shadow tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease,
              transform tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease;
  
  // Cursor
  cursor: pointer;
  user-select: none;

  // Interactive states
  &:hover {
    background: tokens.$semantic-color-primary-hover;
    box-shadow: tokens.$semantic-shadow-button-hover;
    transform: translateY(-1px);
  }

  &:focus-visible {
    outline: 2px solid tokens.$semantic-color-focus;
    outline-offset: 2px;
  }

  &:active {
    background: tokens.$semantic-color-primary-pressed;
    box-shadow: tokens.$semantic-shadow-button-active;
    transform: translateY(0);
  }

  &:disabled {
    background: tokens.$semantic-color-surface-disabled;
    color: tokens.$semantic-color-text-disabled;
    box-shadow: none;
    cursor: not-allowed;
    transform: none;
  }
}

.demo-stats {
  display: flex;
  flex-direction: column;
  gap: tokens.$semantic-spacing-component-xs;
  
  p {
    font-size: tokens.$semantic-typography-font-size-md;
    color: tokens.$semantic-color-text-secondary;
    margin: 0;
    
    &:before {
      content: "📊 ";
      margin-right: tokens.$semantic-spacing-component-xs;
    }
  }
}

.overlay-content {
  padding: tokens.$semantic-spacing-component-lg;
  text-align: center;

  h3 {
    font-size: tokens.$semantic-typography-heading-h3-size;
    color: tokens.$semantic-color-text-primary;
    margin: 0 0 tokens.$semantic-spacing-content-paragraph 0;
  }

  p {
    font-size: tokens.$semantic-typography-font-size-md;
    color: tokens.$semantic-color-text-secondary;
    margin: 0 0 tokens.$semantic-spacing-content-heading 0;
    line-height: 1.5;
  }

  button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: tokens.$semantic-sizing-button-height-md;
    padding: tokens.$semantic-spacing-component-sm tokens.$semantic-spacing-component-lg;
    
    // Visual design
    background: tokens.$semantic-color-secondary;
    color: tokens.$semantic-color-on-secondary;
    border: tokens.$semantic-border-width-1 solid tokens.$semantic-color-border-primary;
    border-radius: tokens.$semantic-border-radius-md;
    box-shadow: tokens.$semantic-shadow-button-rest;
    
    // Typography
    font-size: tokens.$semantic-typography-font-size-md;
    font-weight: tokens.$semantic-typography-font-weight-medium;
    
    // Transitions
    transition: background-color tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease,
                border-color tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease,
                box-shadow tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease,
                transform tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease;
    
    cursor: pointer;

    &:hover {
      background: tokens.$semantic-color-secondary-hover;
      border-color: tokens.$semantic-color-border-primary;
      box-shadow: tokens.$semantic-shadow-button-hover;
      transform: translateY(-1px);
    }

    &:focus-visible {
      outline: 2px solid tokens.$semantic-color-focus;
      outline-offset: 2px;
    }

    &:active {
      background: tokens.$semantic-color-secondary-pressed;
      box-shadow: tokens.$semantic-shadow-button-active;
      transform: translateY(0);
    }
  }
}

.focus-trap-demo {
  display: flex;
  flex-direction: column;
  gap: tokens.$semantic-spacing-component-sm;
  align-items: center;
  
  button,
  input {
    min-height: tokens.$semantic-sizing-input-height-md;
    padding: tokens.$semantic-spacing-component-sm tokens.$semantic-spacing-component-md;
    border: tokens.$semantic-border-width-1 solid tokens.$semantic-color-border-primary;
    border-radius: tokens.$semantic-border-radius-md;
    font-size: tokens.$semantic-typography-font-size-md;
    
    &:focus-visible {
      outline: 2px solid tokens.$semantic-color-focus;
      outline-offset: 2px;
    }
  }
  
  input {
    background: tokens.$semantic-color-surface-secondary;
    color: tokens.$semantic-color-text-primary;
    
    &::placeholder {
      color: tokens.$semantic-color-text-tertiary;
    }
  }
  
  button {
    background: tokens.$semantic-color-tertiary;
    color: tokens.$semantic-color-on-tertiary;
    cursor: pointer;
    
    &:hover {
      background: tokens.$semantic-color-secondary-hover;
    }
    
    &:last-child {
      background: tokens.$semantic-color-danger;
      color: tokens.$semantic-color-on-danger;
      
      &:hover {
        background: tokens.$semantic-color-primary-hover;
      }
    }
  }
}

// Responsive Design
@media (max-width: #{tokens.$semantic-breakpoint-md - 1px}) {
  .demo-container {
    padding: tokens.$semantic-spacing-layout-sm;
  }
  
  .demo-row {
    flex-direction: column;
    align-items: stretch;
  }
  
  .demo-button {
    width: 100%;
  }
}

@media (max-width: #{tokens.$semantic-breakpoint-sm - 1px}) {
  .overlay-content {
    padding: tokens.$semantic-spacing-component-md;
  }
  
  .focus-trap-demo {
    button,
    input {
      width: 100%;
    }
  }
}xk1k:A8#(5E4s}) Sx0import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OverlayContainerComponent } from '../../../../../ui-essentials/src/lib/components/overlays/overlay-container/overlay-container.component';

@Component({
  selector: 'ui-overlay-container-demo',
  standalone: true,
  imports: [CommonModule, OverlayContainerComponent],
  template: `
    <div class="demo-container">
      <h2>Overlay Container Demo</h2>
      
      <!-- Position Variants -->
      <section class="demo-section">
        <h3>Positions</h3>
        <div class="demo-row">
          @for (position of positions; track position) {
            <button 
              class="demo-button" 
              (click)="showOverlay(position, 'auto', 'default')"
            >
              {{ position }} position
            </button>
          }
        </div>
      </section>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <button 
              class="demo-button" 
              (click)="showOverlay('center', size, 'default')"
            >
              {{ size }} size
            </button>
          }
        </div>
      </section>
      
      <!-- Variant Types -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <button 
              class="demo-button" 
              (click)="showOverlay('center', 'md', variant)"
            >
              {{ variant }}
            </button>
          }
        </div>
      </section>
      
      <!-- Features -->
      <section class="demo-section">
        <h3>Features</h3>
        <div class="demo-row">
          <button 
            class="demo-button" 
            (click)="showFeatureOverlay('no-backdrop')"
          >
            No Backdrop
          </button>
          <button 
            class="demo-button" 
            (click)="showFeatureOverlay('backdrop-blur')"
          >
            Backdrop Blur
          </button>
          <button 
            class="demo-button" 
            (click)="showFeatureOverlay('focus-trap')"
          >
            Focus Trap
          </button>
          <button 
            class="demo-button" 
            (click)="showFeatureOverlay('no-escape')"
          >
            No ESC Close
          </button>
        </div>
      </section>
      
      <!-- Offset Example -->
      <section class="demo-section">
        <h3>Offset Positioning</h3>
        <div class="demo-row">
          <button 
            class="demo-button" 
            (click)="showOffsetOverlay()"
          >
            Offset Overlay
          </button>
        </div>
      </section>
      
      <!-- Interactive Stats -->
      <section class="demo-section">
        <h3>Stats</h3>
        <div class="demo-stats">
          <p>Overlays shown: {{ overlayCount }}</p>
          <p>Backdrop clicks: {{ backdropClickCount }}</p>
          <p>ESC key presses: {{ escapeCount }}</p>
        </div>
      </section>
    </div>

    <!-- Overlay Instances -->
    <ui-overlay-container
      [visible]="currentOverlay.visible"
      [position]="currentOverlay.position"
      [size]="currentOverlay.size"
      [variant]="currentOverlay.variant"
      [showBackdrop]="currentOverlay.showBackdrop"
      [backdropBlur]="currentOverlay.backdropBlur"
      [focusTrap]="currentOverlay.focusTrap"
      [escapeClosable]="currentOverlay.escapeClosable"
      [offsetX]="currentOverlay.offsetX"
      [offsetY]="currentOverlay.offsetY"
      (visibleChange)="handleVisibilityChange($event)"
      (backdropClicked)="handleBackdropClick()"
      (escapePressed)="handleEscapePress()"
    >
      <div class="overlay-content">
        <h3>{{ currentOverlay.title }}</h3>
        <p>{{ currentOverlay.description }}</p>
        @if (currentOverlay.focusTrap) {
          <div class="focus-trap-demo">
            <button>First Button</button>
            <input type="text" placeholder="Input field">
            <button>Second Button</button>
            <button (click)="closeOverlay()">Close</button>
          </div>
        } @else {
          <button (click)="closeOverlay()">Close Overlay</button>
        }
      </div>
    </ui-overlay-container>
  `,
  styleUrl: './overlay-container-demo.component.scss'
})
export class OverlayContainerDemoComponent {
  positions = ['center', 'top', 'bottom', 'left', 'right', 'top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;
  sizes = ['auto', 'sm', 'md', 'lg', 'xl', 'fullscreen'] as const;
  variants = ['default', 'elevated', 'floating', 'modal', 'popover'] as const;

  // Stats
  overlayCount = 0;
  backdropClickCount = 0;
  escapeCount = 0;

  // Current overlay state
  currentOverlay = {
    visible: false,
    position: 'center' as typeof this.positions[number],
    size: 'auto' as typeof this.sizes[number],
    variant: 'default' as typeof this.variants[number],
    showBackdrop: true,
    backdropBlur: false,
    focusTrap: false,
    escapeClosable: true,
    offsetX: 0,
    offsetY: 0,
    title: 'Overlay Title',
    description: 'This is an overlay container demonstration.'
  };

  showOverlay(position: typeof this.positions[number], size: typeof this.sizes[number], variant: typeof this.variants[number]): void {
    this.currentOverlay = {
      ...this.currentOverlay,
      visible: true,
      position,
      size,
      variant,
      showBackdrop: true,
      backdropBlur: false,
      focusTrap: false,
      escapeClosable: true,
      offsetX: 0,
      offsetY: 0,
      title: `${variant} Overlay`,
      description: `Position: ${position}, Size: ${size}, Variant: ${variant}`
    };
    this.overlayCount++;
  }

  showFeatureOverlay(feature: string): void {
    let config = {
      visible: true,
      position: 'center' as const,
      size: 'md' as const,
      variant: 'default' as const,
      showBackdrop: true,
      backdropBlur: false,
      focusTrap: false,
      escapeClosable: true,
      offsetX: 0,
      offsetY: 0,
      title: 'Feature Demo',
      description: 'Demonstrating overlay features.'
    };

    switch (feature) {
      case 'no-backdrop':
        config.showBackdrop = false;
        config.title = 'No Backdrop';
        config.description = 'This overlay has no backdrop.';
        break;
      case 'backdrop-blur':
        config.backdropBlur = true;
        config.title = 'Backdrop Blur';
        config.description = 'This overlay has a blurred backdrop effect.';
        break;
      case 'focus-trap':
        config.focusTrap = true;
        config.title = 'Focus Trap';
        config.description = 'Try pressing Tab - focus is trapped within this overlay.';
        break;
      case 'no-escape':
        config.escapeClosable = false;
        config.title = 'No ESC Close';
        config.description = 'ESC key will not close this overlay.';
        break;
    }

    this.currentOverlay = { ...this.currentOverlay, ...config };
    this.overlayCount++;
  }

  showOffsetOverlay(): void {
    this.currentOverlay = {
      ...this.currentOverlay,
      visible: true,
      position: 'top-right',
      size: 'sm',
      variant: 'floating',
      showBackdrop: false,
      backdropBlur: false,
      focusTrap: false,
      escapeClosable: true,
      offsetX: -20,
      offsetY: 20,
      title: 'Offset Overlay',
      description: 'This overlay is positioned with X and Y offsets.'
    };
    this.overlayCount++;
  }

  closeOverlay(): void {
    this.currentOverlay.visible = false;
  }

  handleVisibilityChange(visible: boolean): void {
    this.currentOverlay.visible = visible;
  }

  handleBackdropClick(): void {
    this.backdropClickCount++;
    console.log('Backdrop clicked');
  }

  handleEscapePress(): void {
    this.escapeCount++;
    console.log('ESC key pressed');
  }
}:LxAzimport { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PaginationComponent } from '../../../../../ui-essentials/src/lib/components/navigation/pagination/pagination.component';

@Component({
  selector: 'ui-pagination-demo',
  standalone: true,
  imports: [CommonModule, PaginationComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Pagination Component Showcase</h2>
      
      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Sizes</h3>
        <div style="margin-bottom: 2rem;">
          <h4>Small</h4>
          <ui-pagination
            [currentPage]="currentPageSmall"
            [totalPages]="totalPagesDemo"
            size="sm"
            (pageChange)="onPageChange($event, 'small')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Medium (Default)</h4>
          <ui-pagination
            [currentPage]="currentPageMedium"
            [totalPages]="totalPagesDemo"
            size="md"
            (pageChange)="onPageChange($event, 'medium')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Large</h4>
          <ui-pagination
            [currentPage]="currentPageLarge"
            [totalPages]="totalPagesDemo"
            size="lg"
            (pageChange)="onPageChange($event, 'large')">
          </ui-pagination>
        </div>
      </section>

      <!-- Alignment Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Alignment</h3>
        <div style="margin-bottom: 2rem;">
          <h4>Left Aligned</h4>
          <ui-pagination
            [currentPage]="currentPageLeft"
            [totalPages]="totalPagesDemo"
            alignment="left"
            (pageChange)="onPageChange($event, 'left')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Center Aligned (Default)</h4>
          <ui-pagination
            [currentPage]="currentPageCenter"
            [totalPages]="totalPagesDemo"
            alignment="center"
            (pageChange)="onPageChange($event, 'center')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Right Aligned</h4>
          <ui-pagination
            [currentPage]="currentPageRight"
            [totalPages]="totalPagesDemo"
            alignment="right"
            (pageChange)="onPageChange($event, 'right')">
          </ui-pagination>
        </div>
      </section>

      <!-- Page Info Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>With Page Information</h3>
        <div style="margin-bottom: 2rem;">
          <h4>Basic Page Info</h4>
          <ui-pagination
            [currentPage]="currentPageInfo"
            [totalPages]="totalPagesDemo"
            [showInfo]="true"
            (pageChange)="onPageChange($event, 'info')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>With Items Count</h4>
          <ui-pagination
            [currentPage]="currentPageItems"
            [totalPages]="totalPagesItems"
            [totalItems]="totalItemsDemo"
            [itemsPerPage]="itemsPerPageDemo"
            [showInfo]="true"
            (pageChange)="onPageChange($event, 'items')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Without Info</h4>
          <ui-pagination
            [currentPage]="currentPageNoInfo"
            [totalPages]="totalPagesDemo"
            [showInfo]="false"
            (pageChange)="onPageChange($event, 'no-info')">
          </ui-pagination>
        </div>
      </section>

      <!-- Compact Variant -->
      <section style="margin-bottom: 3rem;">
        <h3>Compact Style</h3>
        <div style="margin-bottom: 2rem;">
          <h4>Compact Pagination</h4>
          <ui-pagination
            [currentPage]="currentPageCompact"
            [totalPages]="totalPagesDemo"
            [compact]="true"
            (pageChange)="onPageChange($event, 'compact')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Compact with Labels</h4>
          <ui-pagination
            [currentPage]="currentPageCompactLabels"
            [totalPages]="totalPagesDemo"
            [compact]="true"
            [showLabels]="true"
            (pageChange)="onPageChange($event, 'compact-labels')">
          </ui-pagination>
        </div>
      </section>

      <!-- Different Page Counts -->
      <section style="margin-bottom: 3rem;">
        <h3>Different Page Counts</h3>
        <div style="margin-bottom: 2rem;">
          <h4>Few Pages (5 total)</h4>
          <ui-pagination
            [currentPage]="currentPageFew"
            [totalPages]="totalPagesFew"
            (pageChange)="onPageChange($event, 'few')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Many Pages (50 total)</h4>
          <ui-pagination
            [currentPage]="currentPageMany"
            [totalPages]="totalPagesMany"
            (pageChange)="onPageChange($event, 'many')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Limited Visible Pages (maxVisible=5)</h4>
          <ui-pagination
            [currentPage]="currentPageLimited"
            [totalPages]="totalPagesMany"
            [maxVisible]="5"
            (pageChange)="onPageChange($event, 'limited')">
          </ui-pagination>
        </div>
      </section>

      <!-- Labels and States -->
      <section style="margin-bottom: 3rem;">
        <h3>Labels and States</h3>
        <div style="margin-bottom: 2rem;">
          <h4>With Navigation Labels</h4>
          <ui-pagination
            [currentPage]="currentPageLabels"
            [totalPages]="totalPagesDemo"
            [showLabels]="true"
            previousLabel="Back"
            nextLabel="Forward"
            (pageChange)="onPageChange($event, 'labels')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Custom ARIA Labels</h4>
          <ui-pagination
            [currentPage]="currentPageAria"
            [totalPages]="totalPagesDemo"
            ariaLabel="Results pagination"
            previousAriaLabel="Go to previous results page"
            nextAriaLabel="Go to next results page"
            (pageChange)="onPageChange($event, 'aria')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Disabled State</h4>
          <ui-pagination
            [currentPage]="currentPageDisabled"
            [totalPages]="totalPagesDemo"
            [disabled]="true"
            (pageChange)="onPageChange($event, 'disabled')">
          </ui-pagination>
        </div>
      </section>

      <!-- Interactive Example -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Pagination</h3>
        <div style="margin-bottom: 2rem;">
          <h4>Controlled Pagination</h4>
          <div style="margin-bottom: 1rem; display: flex; gap: 1rem; align-items: center; flex-wrap: wrap;">
            <button 
              style="padding: 0.5rem 1rem; border: 1px solid #ccc; border-radius: 4px; background: white; cursor: pointer;"
              (click)="goToFirstPage()">
              First Page
            </button>
            <button 
              style="padding: 0.5rem 1rem; border: 1px solid #ccc; border-radius: 4px; background: white; cursor: pointer;"
              (click)="goToLastPage()">
              Last Page
            </button>
            <button 
              style="padding: 0.5rem 1rem; border: 1px solid #ccc; border-radius: 4px; background: white; cursor: pointer;"
              (click)="jumpToMiddle()">
              Jump to Middle
            </button>
            <button 
              style="padding: 0.5rem 1rem; border: 1px solid #ccc; border-radius: 4px; background: white; cursor: pointer;"
              (click)="resetInteractive()">
              Reset
            </button>
          </div>
          <ui-pagination
            #interactivePagination
            [currentPage]="currentPageInteractive"
            [totalPages]="totalPagesInteractive"
            [totalItems]="totalItemsInteractive()"
            [itemsPerPage]="itemsPerPageDemo"
            [showInfo]="true"
            size="lg"
            (pageChange)="onInteractivePageChange($event)">
          </ui-pagination>
        </div>

        @if (lastPageChange) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last page change:</strong> {{ lastPageChange }}
          </div>
        }
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Pagination:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-pagination
  [currentPage]="currentPage"
  [totalPages]="totalPages"
  (pageChange)="onPageChange($event)"&gt;
&lt;/ui-pagination&gt;</code></pre>

          <h4>With Item Information:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-pagination
  [currentPage]="currentPage"
  [totalPages]="totalPages"
  [totalItems]="totalItems"
  [itemsPerPage]="itemsPerPage"
  [showInfo]="true"
  (pageChange)="onPageChange($event)"&gt;
&lt;/ui-pagination&gt;</code></pre>

          <h4>Compact with Labels:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-pagination
  [currentPage]="currentPage"
  [totalPages]="totalPages"
  [compact]="true"
  [showLabels]="true"
  size="sm"
  alignment="left"
  previousLabel="Back"
  nextLabel="Forward"
  (pageChange)="onPageChange($event)"&gt;
&lt;/ui-pagination&gt;</code></pre>

          <h4>Customized Pagination:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-pagination
  [currentPage]="currentPage"
  [totalPages]="totalPages"
  [maxVisible]="5"
  size="lg"
  alignment="center"
  ariaLabel="Search results pagination"
  [showInfo]="true"
  (pageChange)="handlePageChange($event)"&gt;
&lt;/ui-pagination&gt;</code></pre>
        </div>
      </section>

      <!-- Edge Cases -->
      <section style="margin-bottom: 3rem;">
        <h3>Edge Cases</h3>
        <div style="margin-bottom: 2rem;">
          <h4>Single Page</h4>
          <ui-pagination
            [currentPage]="currentPageOne"
            [totalPages]="totalPagesOne"
            (pageChange)="onPageChange($event, 'single')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Two Pages</h4>
          <ui-pagination
            [currentPage]="currentPageTwo"
            [totalPages]="totalPagesTwo"
            (pageChange)="onPageChange($event, 'two')">
          </ui-pagination>
        </div>
        <div style="margin-bottom: 2rem;">
          <h4>Large Dataset (1000+ pages)</h4>
          <ui-pagination
            [currentPage]="currentPageLargeDataset"
            [totalPages]="totalPagesLargeDataset"
            [totalItems]="24934"
            [itemsPerPage]="20"
            [showInfo]="true"
            [maxVisible]="7"
            (pageChange)="onPageChange($event, 'large-dataset')">
          </ui-pagination>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }
    
    button:hover {
      background: #f0f0f0 !important;
    }
    
    button:active {
      background: #e0e0e0 !important;
    }
  `]
})
export class PaginationDemoComponent {
  // Size variants
  currentPageSmall = signal(2);
  currentPageMedium = signal(3);
  currentPageLarge = signal(4);

  // Alignment variants  
  currentPageLeft = signal(1);
  currentPageCenter = signal(5);
  currentPageRight = signal(8);

  // Info variants
  currentPageInfo = signal(3);
  currentPageItems = signal(2);
  currentPageNoInfo = signal(6);

  // Compact variants
  currentPageCompact = signal(4);
  currentPageCompactLabels = signal(2);

  // Different counts
  currentPageFew = signal(3);
  currentPageMany = signal(25);
  currentPageLimited = signal(15);

  // Labels and states
  currentPageLabels = signal(1);
  currentPageAria = signal(1);
  currentPageDisabled = signal(5);

  // Interactive
  currentPageInteractive = signal(1);
  totalPagesInteractive = signal(20);
  totalItemsInteractive = signal(387);

  // Edge cases
  currentPageTwo = signal(1);
  currentPageLargeDataset = signal(234);

  // Constants for edge cases
  totalPagesOne = signal(1);
  currentPageOne = signal(1);
  totalPagesTwo = signal(2);
  totalPagesLargeDataset = signal(1247);

  // Demo data
  totalPagesDemo = signal(12);
  totalPagesFew = signal(5);
  totalPagesMany = signal(50);
  totalItemsDemo = 234;
  itemsPerPageDemo = 20;
  totalPagesItems = signal(Math.ceil(this.totalItemsDemo / this.itemsPerPageDemo));

  // Interactive state
  lastPageChange: string = '';

  onPageChange(event: any, type: string): void {
    this.lastPageChange = `${type}: Page ${event.previousPage} → ${event.page}`;
    console.log(`Page changed in ${type}:`, event);

    // Update the appropriate signal based on type
    switch (type) {
      case 'small':
        this.currentPageSmall.set(event.page);
        break;
      case 'medium':
        this.currentPageMedium.set(event.page);
        break;
      case 'large':
        this.currentPageLarge.set(event.page);
        break;
      case 'left':
        this.currentPageLeft.set(event.page);
        break;
      case 'center':
        this.currentPageCenter.set(event.page);
        break;
      case 'right':
        this.currentPageRight.set(event.page);
        break;
      case 'info':
        this.currentPageInfo.set(event.page);
        break;
      case 'items':
        this.currentPageItems.set(event.page);
        break;
      case 'no-info':
        this.currentPageNoInfo.set(event.page);
        break;
      case 'compact':
        this.currentPageCompact.set(event.page);
        break;
      case 'compact-labels':
        this.currentPageCompactLabels.set(event.page);
        break;
      case 'few':
        this.currentPageFew.set(event.page);
        break;
      case 'many':
        this.currentPageMany.set(event.page);
        break;
      case 'limited':
        this.currentPageLimited.set(event.page);
        break;
      case 'labels':
        this.currentPageLabels.set(event.page);
        break;
      case 'aria':
        this.currentPageAria.set(event.page);
        break;
      case 'two':
        this.currentPageTwo.set(event.page);
        break;
      case 'large-dataset':
        this.currentPageLargeDataset.set(event.page);
        break;
    }
  }

  onInteractivePageChange(event: any): void {
    this.currentPageInteractive.set(event.page);
    this.lastPageChange = `Interactive: Page ${event.previousPage} → ${event.page}`;
  }

  // Interactive controls
  goToFirstPage(): void {
    this.currentPageInteractive.set(1);
    this.lastPageChange = 'Programmatically navigated to first page';
  }

  goToLastPage(): void {
    this.currentPageInteractive.set(this.totalPagesInteractive());
    this.lastPageChange = 'Programmatically navigated to last page';
  }

  jumpToMiddle(): void {
    const middle = Math.ceil(this.totalPagesInteractive() / 2);
    this.currentPageInteractive.set(middle);
    this.lastPageChange = `Programmatically jumped to middle page (${middle})`;
  }

  resetInteractive(): void {
    this.currentPageInteractive.set(1);
    this.lastPageChange = 'Interactive pagination reset';
  }
}Olxkmf8] 'aix~&@use "../../../../../ui-design-system/src/styles/semantic/index" as *;

.popover-demo {
  padding: $semantic-spacing-layout-section-xs;

  &__section {
    margin-bottom: $semantic-spacing-layout-section-sm;

    &:last-child {
      margin-bottom: 0;
    }
  }

  &__title {
    font-size: map-get($semantic-typography-heading-h3, font-size);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-content-heading;
    padding-bottom: $semantic-spacing-content-list-item;
    border-bottom: $semantic-border-card-width solid $semantic-color-border-subtle;
  }

  &__subtitle {
    font-size: map-get($semantic-typography-heading-h4, font-size);
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-content-paragraph;
  }

  &__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: $semantic-spacing-layout-section-xs;
    margin-bottom: $semantic-spacing-layout-section-xs;
  }

  &__row {
    display: flex;
    flex-wrap: wrap;
    gap: $semantic-spacing-layout-section-xs;
    margin-bottom: $semantic-spacing-layout-section-xs;
    align-items: center;

    &--center {
      justify-content: center;
      min-height: 200px;
      padding: $semantic-spacing-layout-section-xs;
      border: 2px dashed $semantic-color-border-subtle;
      border-radius: $semantic-border-radius-lg;
    }

    &--positions {
      display: grid;
      grid-template-columns: 1fr auto 1fr;
      grid-template-rows: auto auto auto;
      gap: $semantic-spacing-component-lg;
      align-items: center;
      justify-items: center;
      min-height: 300px;
      padding: $semantic-spacing-layout-section-xs;
      border: 2px dashed $semantic-color-border-subtle;
      border-radius: $semantic-border-radius-lg;
    }
  }

  &__trigger-button {
    padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    border: $semantic-border-card-width solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-md;
    background: $semantic-color-surface-primary;
    color: $semantic-color-text-primary;
    font-size: $semantic-typography-font-size-md;
    cursor: pointer;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    min-width: 120px;

    &:hover {
      background: $semantic-color-surface-secondary;
      border-color: $semantic-color-border-focus;
    }

    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }

    &--primary {
      background: $semantic-color-primary;
      color: $semantic-color-on-primary;
      border-color: $semantic-color-primary;

      &:hover {
        background: $semantic-color-primary-hover;
        border-color: $semantic-color-primary-hover;
      }
    }

    &--small {
      padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
      font-size: $semantic-typography-font-size-sm;
      min-width: 100px;
    }

    &--large {
      padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
      font-size: $semantic-typography-font-size-lg;
      min-width: 140px;
    }
  }

  &__stats {
    display: flex;
    gap: $semantic-spacing-content-paragraph;
    margin-top: $semantic-spacing-content-paragraph;
    font-size: $semantic-typography-font-size-sm;
    color: $semantic-color-text-secondary;
  }

  &__code-example {
    margin-top: $semantic-spacing-content-heading;
    padding: $semantic-spacing-component-md;
    background: $semantic-color-surface-secondary;
    border: $semantic-border-card-width solid $semantic-color-border-subtle;
    border-radius: $semantic-border-radius-md;
    font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
    font-size: $semantic-typography-font-size-sm;
    color: $semantic-color-text-secondary;
    overflow-x: auto;
  }

  // Position grid layout
  &__position-top-start {
    grid-column: 1;
    grid-row: 1;
  }

  &__position-top {
    grid-column: 2;
    grid-row: 1;
  }

  &__position-top-end {
    grid-column: 3;
    grid-row: 1;
  }

  &__position-left {
    grid-column: 1;
    grid-row: 2;
  }

  &__position-center {
    grid-column: 2;
    grid-row: 2;
  }

  &__position-right {
    grid-column: 3;
    grid-row: 2;
  }

  &__position-bottom-start {
    grid-column: 1;
    grid-row: 3;
  }

  &__position-bottom {
    grid-column: 2;
    grid-row: 3;
  }

  &__position-bottom-end {
    grid-column: 3;
    grid-row: 3;
  }

  // Custom popover content styles
  .popover-content {
    &__menu {
      min-width: 200px;

      .menu-item {
        display: block;
        width: 100%;
        padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
        border: none;
        background: transparent;
        color: $semantic-color-text-primary;
        font-size: $semantic-typography-font-size-sm;
        text-align: left;
        cursor: pointer;
        transition: background-color $semantic-motion-duration-fast $semantic-motion-easing-ease;

        &:hover {
          background: $semantic-color-surface-secondary;
        }

        &:focus-visible {
          outline: 2px solid $semantic-color-focus;
          outline-offset: -2px;
        }

        &--divider {
          border-bottom: $semantic-border-card-width solid $semantic-color-border-subtle;
          margin-bottom: $semantic-spacing-content-line-tight;
          padding-bottom: $semantic-spacing-content-line-tight;
        }
      }
    }

    &__form {
      min-width: 280px;

      .form-group {
        margin-bottom: $semantic-spacing-content-paragraph;

        &:last-child {
          margin-bottom: 0;
        }
      }

      label {
        display: block;
        font-size: $semantic-typography-font-size-sm;
        color: $semantic-color-text-primary;
        margin-bottom: $semantic-spacing-content-line-tight;
        font-weight: $semantic-typography-font-weight-medium;
      }

      input, textarea {
        width: 100%;
        padding: $semantic-spacing-component-sm;
        border: $semantic-border-card-width solid $semantic-color-border-primary;
        border-radius: $semantic-border-radius-sm;
        background: $semantic-color-surface-primary;
        color: $semantic-color-text-primary;
        font-size: $semantic-typography-font-size-sm;
        transition: border-color $semantic-motion-duration-fast $semantic-motion-easing-ease;

        &:focus {
          outline: none;
          border-color: $semantic-color-focus;
          box-shadow: 0 0 0 1px $semantic-color-focus;
        }

        &::placeholder {
          color: $semantic-color-text-tertiary;
        }
      }

      textarea {
        resize: vertical;
        min-height: 80px;
      }
    }

    &__card {
      min-width: 300px;
      max-width: 400px;

      .card-header {
        display: flex;
        align-items: center;
        gap: $semantic-spacing-content-list-item;
        margin-bottom: $semantic-spacing-content-list-item;

        .avatar {
          width: 40px;
          height: 40px;
          border-radius: $semantic-border-radius-full;
          background: $semantic-color-primary;
          color: $semantic-color-on-primary;
          display: flex;
          align-items: center;
          justify-content: center;
          font-weight: $semantic-typography-font-weight-semibold;
        }

        .user-info {
          .name {
            font-weight: $semantic-typography-font-weight-medium;
            font-size: $semantic-typography-font-size-md;
            color: $semantic-color-text-primary;
          }

          .role {
            font-size: $semantic-typography-font-size-xs;
            color: $semantic-color-text-secondary;
          }
        }
      }

      .card-content {
        font-size: $semantic-typography-font-size-sm;
        color: $semantic-color-text-secondary;
        line-height: $semantic-typography-line-height-relaxed;
        margin-bottom: $semantic-spacing-content-paragraph;
      }

      .card-actions {
        display: flex;
        gap: $semantic-spacing-content-list-item;

        button {
          flex: 1;
          padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
          border: $semantic-border-card-width solid $semantic-color-border-primary;
          border-radius: $semantic-border-radius-sm;
          background: $semantic-color-surface-primary;
          color: $semantic-color-text-primary;
          font-size: $semantic-typography-font-size-xs;
          cursor: pointer;
          transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;

          &:hover {
            background: $semantic-color-surface-secondary;
          }

          &.primary {
            background: $semantic-color-primary;
            color: $semantic-color-on-primary;
            border-color: $semantic-color-primary;

            &:hover {
              background: $semantic-color-primary-hover;
            }
          }
        }
      }
    }

    &__tooltip {
      max-width: 200px;
      font-size: $semantic-typography-font-size-xs;
      line-height: $semantic-typography-line-height-normal;
    }
  }

  // Responsive design
  @media (max-width: $semantic-breakpoint-md - 1) {
    &__grid {
      grid-template-columns: 1fr;
    }

    &__row {
      flex-direction: column;
      align-items: stretch;

      &--positions {
        grid-template-columns: 1fr;
        grid-template-rows: repeat(9, auto);
        gap: $semantic-spacing-component-sm;
        min-height: auto;
      }
    }

    &__position-top-start,
    &__position-top,
    &__position-top-end,
    &__position-left,
    &__position-center,
    &__position-right,
    &__position-bottom-start,
    &__position-bottom,
    &__position-bottom-end {
      grid-column: 1;
    }
  }
}bdxWKlEVv<8IbE&!HU0;$Dq@B@Rܩĩ*\rPهGHr̿yt/SYV.e^R!DTC*e%U$I$PWEh DG7``IE"xGjrڮW$rH_a{O˂"XKEVKM;5,RMlCJ!GZdf"6Fk)?D| Av,R\"Ats|dH=YXzWr7po,5?7uُeO᛾\E>7C0,{6G6]j8ȦFP.+`c!J&*˄!~,X1C%(ԒtO3(xv,Iu0@nJyR.XZwЍ:n4{|m7v)¢@*U,O"uBK7|	ŹXs`z:
SVUV<}|pŃnE?PQECo-W#CrTDmZLd-:,O-MjYk4jIǃ5>qxfj]ѿ0]桬+lS=yg!)|@,<=B(1L]S+̑'erVJ鸦mXUSt~<D!f9|cKXi*1rYӖ֣yx>K3$N7Zc.6k͝o'`zĊjz&1
hTw!4QОX+2,ީ&Hk;Psm4wZ.U'-MUk
JMCY;de,JJ]	n1@օ;0J9db"&kdD/Fּk_#<&78]ݛDש!6
Ȅ.c͙g%By8I'JS#t8R:YoV@Q(ݨZ]1|曄@G{{>^Juڊhxl&!?}˝#mA<X`gp
\U[9x.u$<qd~	Ez(wOw[/:H;J2t%\4T%%X9>DApSx86Ð<;A- fu`2 o"o/"ЬȶjLwuc[)"8o-^7(TY6PPSޞuAֿ2擇kK69o;<tVΦØjfFlfK}8})+}p?d>/9y%ml5~7L{3'`ka){+1FFp+S$_\0wN.8?~Y1!w6uձK_ӨąY#(RMQH-pk&VM_%ŋJJTc.
M7=Ӆgbrm͢eh
"oH
Fr-8{N;ik~ný9%ptizؾ1j{[66{ۺ	38pS;2m{Avhw&][ludi+%ٽٟW_wZK1xxύ Ctxg(gqFbQjniFH5 ^xWKlEVJ'iMR{qN-VpZQֻu*FC+ r=p.{8"!8#ڻG"_WһZH&S]x]	C36NBH[j#1~4,jSC#lKP;avtB9y nG/ڧnScP!9џ5Xg)T@9Rv<qʡ!#
݁qXrT(19XfVݖN|{xn%A4zbޏNur[^,p/;.X'KeMkhϋ>y+ιќ-e%&LW3Kt`*a*glA7JY:aYk2e3zٟQĜC56anaGzJJԢ@3
VIu*m8)OnR^IzFhn^KD{{*}ŒEFVs(誄M$x)"_l#KBCq}}[Fp0k22CSOKkl>_F֏m0%+m"kB:@sh,δR`2AfIy^˵Aaõؤסt<9]* I׷/ 3g-t+)BTPЏ;Ұ&E;9NB$L-R͂]rZ`9Ȋ(TR=QPEWc`9qKRbtBcgO<v˗Q%v~5ry:=rP'3?xɼ3T/33we$^~P7l,k2LY6oIeݦ
pXTb)xxaWf]wtRMІ(wf0򼸠b#
N=:p]⁅
:gj[0
R%սVSYCmsgҮ0ov'{J4/*ZnU(\T=>Xy^=ıji#Z
3>sP@xڃVcG}9EլZ p>YЕP;ދf֠u#\:`x>mPw"g5T-VHۆAoI\)(
v9?jd}'TYUn-}BTW[kG3ahב"W<	7BB aKeU4H}Uw.9~>&ߪ_`'x;Gs?/2~y -v\[7P_{}cۋm$m-HņKl,~/sHxdFyC%|5OT*iI-\fik*!#q~.fm53UۂitbX3T<XJ[Vu \
x]~RDD N}>	rg(F'$Ip;_{)^
@ї>'?	rw(Yr333i9I)fq#߆dFAFlipӈܑi,HgED$Xp/4(-,	Մ?Oe%%`04/> B!&(BzJDo06eyt$퐷sy!gsP}Ӭ3l?zǰG.{YHh}K )-"IEL"Ma<X\((Ssb27+:jI%4B]=(f}O$^EasNF ?"yV0|'ǔȥiD-d/BL"X4>yh b>w~<#?V|Vp47C2
L[Q 0E!ڥ$'MaBr-G9˦3&	$#&I9W&d[i!fgOX5?k -"j!Kn<@9M几8:y%~70*bifwP.2~C>*@i
<8ϓ,bκ$S;޼<y?#.;Q帮!G+ig,ס*w1b[@iRi@M eq/cۮPerJ9L-T˗#?aS]>Tc/}Dy	O(AD<t@Qg&hU1t2l6/c4(H8pnmFl"y.ۈ02nAL:|~,Jh/Wttŕ0G͡ݵ`o<jge/ _=vo|<2*fGj)SÈGG[&ieUV: [郎@5V-ƒx6n\W
O&pjDF.BA+&LuGZ"f@V7Z.>N_	a!VwN%7vSny^lJ" <Eu8\l0u\E\Z`}E[G*<]\ 7Jsk.}dөs,c!cC_JPe{N 6!-02A vDK_$6J_Da@>@g4XTB5˒"FDDwta	NܭBȞaS1#w\͆HAPڕ_zzqժP՗ab)al?TVN5u7f=3۴bNK\z9_^[;nZ,[[Tm^궗84
FS/zDoAU_KYY*IҴ,hQb)^kNE(fXQꨧYLܓzRs.ٴ!>A7-\#[V߫Z6q嵀IDZǬD^iUÜ-ŀOŕ$Sffgqror'rXO|.P uLUTPB-Ž{ʢJ4Ma^՛)XKbOp
8-@쵓TmiD'lDfBf08_U	Eo>Y<"r1dQֶ'F$_$ UZ,-7"@`QDX4~ʢ|#(E&}^U\[Xa"dsɬh&
JlUu5flIN TjSr5,"44j!"i][BXoԗnZEr5wm)6K{Bd
vC/ɲNŪߓ_`8f?\mi:dVEUGr/v-W%v]rn( @pJ>;]e:b\vmEJiN(A1{@ȢF֍,m$Ux\x?H	s*3y2	i'ۤȈ:}ڐma?>1.1걉uE{g/t9iƨZ5]=jMW%9
Է^Dj]0g*ʖ$VɔFϚ`m%xhfNU@UpEGе*<ϒi1KV1 ^'>`K) ϵH
Q qÙX4!jC`U2!em,YY&yJ g͚ƶUOEi#"p9A/>!4%w,{aL=M$Jl2(`nx^%'āb)[ 
k
S.X /7oqP#9(PtD/颊,|T{QDd'1ﬢOY	"!rU]Sec}Ev8[`_]l0ɗULeC#DȄcDͳ[Bs;~8)E5B3T]Ryl2#zh͌OcP

<$yv,pCĿa>`-[NMǚ"GɵF%W;ե']ou_f+,du\ٿRy35C$lF$J8{L8Σ$@m49z0-JOdn)Um)"8_2||4G&̝`SJE9N` Qz%0d 998ygC+scT.!2p3<)ϓFK\0F|+\AEDĨH|\!y$c'óݛ"LBRL"z3a(?G)'JGpXa.6+(nwA)>뒮\5K`y2g!-7,Mҕ[xvkjE:[51ygלUY]ZhMbb+Cc2`O0@	@tv4fALĶDn0Y4"дAuGO8ɚV.9bջR 7 Lqfg_ZބiPk3H#ڄ9Uڤȫ:0@7]o1%.+~"$)=2;pK@O|y'><'GΗAϸ]3ԗzՕ5/?N&O/r&<ynGzD2klԖHܴݧRjHzƔX)xj:_߳hKF`l/$Km"1%`K$ǢilZ@y솜`=ȤA*=PF\ ]-j({F0'k,K#W/oI\DѸT~ Ǡ.ڀg
M*$RMR_7ef~eH"6}L~ryI)-]6!u!cyŒ#@+,}+L(؝E{e8LKހ$޸J'D\BVoʫM6S22I
<&"vWWR]hllLIxN1#=:LB1*FɩX|anm_1D2u"6W%ݓyUDܻ0enf;ѡK{MȘ,Y$PDŕ)2dk0ՔhHTOEee%ni=MTT̸8EZ;% JfYEn|Zs3$1`2MR`$r
yd-'b("w LMGJhE\OJ9&K%h#`@80vƞe!;|@{1a5uQpxq@Wn	]0-zjYNMn|k,œkNYYGowY;Rx ||+Vߺj5-0k|27&e\x%"import { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { ProgressCircleComponent } from '../../../../../ui-essentials/src/lib/components/feedback/progress-circle/progress-circle.component';

@Component({
  selector: 'ui-progress-circle-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, ProgressCircleComponent],
  template: `
    <div class="demo-container">
      <h2>Progress Circle Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <ui-progress-circle 
                [size]="size"
                [value]="75"
                [showLabel]="true"
                [labelContent]="'75%'">
              </ui-progress-circle>
              <p>{{ size }}</p>
            </div>
          }
        </div>
      </section>
      
      <!-- Color Variants -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <ui-progress-circle 
                [variant]="variant"
                [value]="65"
                [showLabel]="true"
                [labelContent]="'65%'">
              </ui-progress-circle>
              <p>{{ variant }}</p>
            </div>
          }
        </div>
      </section>

      <!-- Stroke Width Variants -->
      <section class="demo-section">
        <h3>Stroke Width</h3>
        <div class="demo-row">
          @for (stroke of strokes; track stroke) {
            <div class="demo-item">
              <ui-progress-circle 
                [stroke]="stroke"
                [value]="80"
                [showLabel]="true"
                [labelContent]="'80%'">
              </ui-progress-circle>
              <p>{{ stroke }}</p>
            </div>
          }
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-progress-circle 
              [value]="45"
              [showLabel]="true"
              [labelContent]="'45%'">
            </ui-progress-circle>
            <p>Default</p>
          </div>
          
          <div class="demo-item">
            <ui-progress-circle 
              [disabled]="true"
              [value]="45"
              [showLabel]="true"
              [labelContent]="'45%'">
            </ui-progress-circle>
            <p>Disabled</p>
          </div>
          
          <div class="demo-item">
            <ui-progress-circle 
              [indeterminate]="true"
              variant="primary">
            </ui-progress-circle>
            <p>Indeterminate</p>
          </div>
          
          <div class="demo-item">
            <ui-progress-circle 
              [value]="100"
              variant="success"
              [showLabel]="true"
              [labelContent]="'✓'">
            </ui-progress-circle>
            <p>Complete</p>
          </div>
        </div>
      </section>

      <!-- Label Variations -->
      <section class="demo-section">
        <h3>Label Variations</h3>
        <div class="demo-row">
          <div class="demo-item">
            <ui-progress-circle 
              [value]="75"
              size="lg">
            </ui-progress-circle>
            <p>No Label</p>
          </div>
          
          <div class="demo-item">
            <ui-progress-circle 
              [value]="75"
              size="lg"
              [showLabel]="true"
              [labelContent]="'75%'">
            </ui-progress-circle>
            <p>Percentage</p>
          </div>
          
          <div class="demo-item">
            <ui-progress-circle 
              [value]="45"
              [max]="60"
              size="lg"
              [showLabel]="true"
              [labelContent]="'45/60'">
            </ui-progress-circle>
            <p>Fraction</p>
          </div>
          
          <div class="demo-item">
            <ui-progress-circle 
              [value]="100"
              size="lg"
              variant="success"
              [showLabel]="true">
              ✓
            </ui-progress-circle>
            <p>Custom Content</p>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive</h3>
        <div class="demo-controls">
          <div class="control-group">
            <label>Value: {{ interactiveValue() }}</label>
            <input 
              type="range" 
              min="0" 
              max="100" 
              [value]="interactiveValue()"
              (input)="updateValue($event)" />
          </div>
          
          <div class="control-group">
            <label>Size:</label>
            <select [value]="interactiveSize()" (change)="updateSize($event)">
              @for (size of sizes; track size) {
                <option [value]="size">{{ size }}</option>
              }
            </select>
          </div>
          
          <div class="control-group">
            <label>Variant:</label>
            <select [value]="interactiveVariant()" (change)="updateVariant($event)">
              @for (variant of variants; track variant) {
                <option [value]="variant">{{ variant }}</option>
              }
            </select>
          </div>
          
          <div class="control-group">
            <label>
              <input 
                type="checkbox" 
                [checked]="interactiveShowLabel()"
                (change)="toggleLabel($event)" />
              Show Label
            </label>
          </div>
          
          <div class="control-group">
            <label>
              <input 
                type="checkbox" 
                [checked]="interactiveIndeterminate()"
                (change)="toggleIndeterminate($event)" />
              Indeterminate
            </label>
          </div>
        </div>
        
        <div class="demo-interactive-result">
          <ui-progress-circle 
            [value]="interactiveValue()"
            [size]="interactiveSize()"
            [variant]="interactiveVariant()"
            [showLabel]="interactiveShowLabel()"
            [labelContent]="interactiveValue() + '%'"
            [indeterminate]="interactiveIndeterminate()">
          </ui-progress-circle>
        </div>
      </section>

      <!-- Animation Demo -->
      <section class="demo-section">
        <h3>Animation Demo</h3>
        <div class="demo-controls">
          <button (click)="startProgress()" [disabled]="progressRunning()">
            Start Progress Animation
          </button>
          <button (click)="resetProgress()">
            Reset
          </button>
        </div>
        <div class="demo-row">
          <div class="demo-item">
            <ui-progress-circle 
              [value]="animatedValue()"
              size="xl"
              variant="primary"
              [showLabel]="true"
              [labelContent]="animatedValue() + '%'">
            </ui-progress-circle>
            <p>Animated Progress</p>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './progress-circle-demo.component.scss'
})
export class ProgressCircleDemoComponent {
  sizes = ['sm', 'md', 'lg', 'xl'] as const;
  variants = ['primary', 'secondary', 'success', 'warning', 'danger', 'info'] as const;
  strokes = ['thin', 'default', 'thick', 'extra-thick'] as const;

  // Interactive demo state
  interactiveValue = signal(75);
  interactiveSize = signal<'sm' | 'md' | 'lg' | 'xl'>('lg');
  interactiveVariant = signal<'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info'>('primary');
  interactiveShowLabel = signal(true);
  interactiveIndeterminate = signal(false);

  // Animation demo state
  animatedValue = signal(0);
  progressRunning = signal(false);
  private animationInterval: any;

  updateValue(event: Event): void {
    const target = event.target as HTMLInputElement;
    this.interactiveValue.set(parseInt(target.value, 10));
  }

  updateSize(event: Event): void {
    const target = event.target as HTMLSelectElement;
    this.interactiveSize.set(target.value as any);
  }

  updateVariant(event: Event): void {
    const target = event.target as HTMLSelectElement;
    this.interactiveVariant.set(target.value as any);
  }

  toggleLabel(event: Event): void {
    const target = event.target as HTMLInputElement;
    this.interactiveShowLabel.set(target.checked);
  }

  toggleIndeterminate(event: Event): void {
    const target = event.target as HTMLInputElement;
    this.interactiveIndeterminate.set(target.checked);
  }

  startProgress(): void {
    if (this.progressRunning()) return;
    
    this.progressRunning.set(true);
    this.animatedValue.set(0);
    
    this.animationInterval = setInterval(() => {
      const currentValue = this.animatedValue();
      if (currentValue >= 100) {
        this.stopProgress();
        return;
      }
      this.animatedValue.set(currentValue + 2);
    }, 100);
  }

  resetProgress(): void {
    this.stopProgress();
    this.animatedValue.set(0);
  }

  private stopProgress(): void {
    if (this.animationInterval) {
      clearInterval(this.animationInterval);
      this.animationInterval = null;
    }
    this.progressRunning.set(false);
  }

  ngOnDestroy(): void {
    this.stopProgress();
  }
}ʃյ	xO*import { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { ProgressBarComponent } from '../../../../../ui-essentials/src/lib/components/data-display/progress/progress-bar.component';

@Component({
  selector: 'ui-progress-demo',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    ProgressBarComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Progress Bar Component Showcase</h2>
      
      <!-- Basic Progress Bars -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Progress Bars</h3>
        <div style="display: flex; flex-direction: column; gap: 2rem;">
          <ui-progress-bar 
            label="Small Progress" 
            size="sm" 
            [progress]="25"
            helperText="25% complete">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Medium Progress" 
            size="md" 
            [progress]="50"
            helperText="50% complete">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Large Progress" 
            size="lg" 
            [progress]="75"
            helperText="75% complete">
          </ui-progress-bar>
        </div>
      </section>

      <!-- Progress Bar Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Color Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 2rem;">
          <ui-progress-bar 
            label="Primary Progress" 
            variant="primary" 
            [progress]="60"
            helperText="Default brand color">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Secondary Progress" 
            variant="secondary" 
            [progress]="45"
            helperText="Secondary color variant">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Success Progress" 
            variant="success" 
            [progress]="80"
            helperText="Indicates successful completion">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Warning Progress" 
            variant="warning" 
            [progress]="30"
            helperText="Indicates caution or attention needed">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Danger Progress" 
            variant="danger" 
            [progress]="15"
            helperText="Indicates error or critical state">
          </ui-progress-bar>
        </div>
      </section>

      <!-- Progress Bar Types -->
      <section style="margin-bottom: 3rem;">
        <h3>Progress Bar Types</h3>
        <div style="display: flex; flex-direction: column; gap: 2rem;">
          <ui-progress-bar 
            label="Determinate Progress" 
            progressType="determinate" 
            [progress]="determinateProgress()"
            helperText="Shows exact progress value">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Indeterminate Progress" 
            progressType="indeterminate" 
            variant="primary"
            helperText="Shows ongoing activity without specific progress">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Buffer Progress" 
            progressType="buffer" 
            [progress]="bufferProgress()" 
            [buffer]="bufferValue()"
            variant="secondary"
            helperText="Shows buffered content loading">
          </ui-progress-bar>
        </div>
      </section>

      <!-- Striped and Animated -->
      <section style="margin-bottom: 3rem;">
        <h3>Striped and Animated Progress Bars</h3>
        <div style="display: flex; flex-direction: column; gap: 2rem;">
          <ui-progress-bar 
            label="Striped Progress" 
            [progress]="65" 
            [striped]="true"
            helperText="With striped pattern">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Animated Striped Progress" 
            [progress]="55" 
            [striped]="true" 
            [animated]="true"
            variant="success"
            helperText="With animated stripes">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Animated Indeterminate" 
            progressType="indeterminate" 
            [animated]="true"
            variant="primary"
            helperText="Smooth indeterminate animation">
          </ui-progress-bar>
        </div>
      </section>

      <!-- States -->
      <section style="margin-bottom: 3rem;">
        <h3>Progress Bar States</h3>
        <div style="display: flex; flex-direction: column; gap: 2rem;">
          <ui-progress-bar 
            label="Normal State" 
            [progress]="70"
            helperText="Default active state">
          </ui-progress-bar>
          <ui-progress-bar 
            label="Disabled State" 
            [progress]="40" 
            state="disabled"
            helperText="Disabled progress bar">
          </ui-progress-bar>
        </div>
      </section>

      <!-- Size Comparison -->
      <section style="margin-bottom: 3rem;">
        <h3>Size and Variant Combinations</h3>
        <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; max-width: 1200px;">
          
          <!-- Small sizes -->
          <div>
            <h4>Small Size Variants</h4>
            <div style="display: flex; flex-direction: column; gap: 1rem;">
              <ui-progress-bar size="sm" variant="primary" [progress]="25" label="Primary Small"></ui-progress-bar>
              <ui-progress-bar size="sm" variant="success" [progress]="50" label="Success Small"></ui-progress-bar>
              <ui-progress-bar size="sm" variant="warning" [progress]="75" label="Warning Small"></ui-progress-bar>
            </div>
          </div>
          
          <!-- Large sizes -->
          <div>
            <h4>Large Size Variants</h4>
            <div style="display: flex; flex-direction: column; gap: 1rem;">
              <ui-progress-bar size="lg" variant="primary" [progress]="85" label="Primary Large"></ui-progress-bar>
              <ui-progress-bar size="lg" variant="success" [progress]="60" label="Success Large"></ui-progress-bar>
              <ui-progress-bar size="lg" variant="danger" [progress]="35" label="Danger Large"></ui-progress-bar>
            </div>
          </div>
          
        </div>
      </section>

      <!-- Without Labels -->
      <section style="margin-bottom: 3rem;">
        <h3>Progress Bars without Labels</h3>
        <div style="display: flex; flex-direction: column; gap: 1.5rem;">
          <ui-progress-bar 
            [progress]="90" 
            variant="success" 
            [showLabel]="false" 
            ariaLabel="File upload progress">
          </ui-progress-bar>
          <ui-progress-bar 
            progressType="indeterminate" 
            variant="primary" 
            [showLabel]="false" 
            ariaLabel="Loading content">
          </ui-progress-bar>
          <ui-progress-bar 
            [progress]="45" 
            [buffer]="70" 
            progressType="buffer" 
            variant="secondary" 
            [showLabel]="false" 
            ariaLabel="Video buffering progress">
          </ui-progress-bar>
        </div>
      </section>

      <!-- Interactive Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Demo</h3>
        <div style="display: flex; flex-wrap: wrap; gap: 2rem; margin-bottom: 2rem;">
          
          <!-- Controls -->
          <div style="display: flex; flex-direction: column; gap: 1rem; min-width: 200px;">
            <div>
              <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Progress Value:</label>
              <input 
                type="range" 
                min="0" 
                max="100" 
                [(ngModel)]="demoProgress" 
                style="width: 100%;">
              <span style="font-size: 0.875rem; color: #666;">{{ demoProgress }}%</span>
            </div>
            
            <div>
              <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Buffer Value:</label>
              <input 
                type="range" 
                min="0" 
                max="100" 
                [(ngModel)]="demoBuffer" 
                style="width: 100%;">
              <span style="font-size: 0.875rem; color: #666;">{{ demoBuffer }}%</span>
            </div>
            
            <div>
              <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Size:</label>
              <select [(ngModel)]="demoSize" style="padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px; width: 100%;">
                <option value="sm">Small</option>
                <option value="md">Medium</option>
                <option value="lg">Large</option>
              </select>
            </div>
            
            <div>
              <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Variant:</label>
              <select [(ngModel)]="demoVariant" style="padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px; width: 100%;">
                <option value="primary">Primary</option>
                <option value="secondary">Secondary</option>
                <option value="success">Success</option>
                <option value="warning">Warning</option>
                <option value="danger">Danger</option>
              </select>
            </div>
            
            <div>
              <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Type:</label>
              <select [(ngModel)]="demoType" style="padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px; width: 100%;">
                <option value="determinate">Determinate</option>
                <option value="indeterminate">Indeterminate</option>
                <option value="buffer">Buffer</option>
              </select>
            </div>
            
            <div>
              <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Options:</label>
              <div style="display: flex; flex-direction: column; gap: 0.25rem;">
                <label style="font-size: 0.875rem;">
                  <input type="checkbox" [(ngModel)]="demoStriped" style="margin-right: 0.5rem;">
                  Striped
                </label>
                <label style="font-size: 0.875rem;">
                  <input type="checkbox" [(ngModel)]="demoAnimated" style="margin-right: 0.5rem;">
                  Animated
                </label>
                <label style="font-size: 0.875rem;">
                  <input type="checkbox" [(ngModel)]="demoShowPercentage" style="margin-right: 0.5rem;">
                  Show Percentage
                </label>
                <label style="font-size: 0.875rem;">
                  <input type="checkbox" [(ngModel)]="demoDisabled" style="margin-right: 0.5rem;">
                  Disabled
                </label>
              </div>
            </div>
            
            <div style="display: flex; gap: 0.5rem; margin-top: 1rem;">
              <button (click)="startDemo()" style="padding: 0.5rem 1rem; border: 1px solid #007bff; border-radius: 4px; background: #007bff; color: white; cursor: pointer; flex: 1;">
                Start Demo
              </button>
              <button (click)="resetDemo()" style="padding: 0.5rem 1rem; border: 1px solid #ccc; border-radius: 4px; background: white; cursor: pointer; flex: 1;">
                Reset
              </button>
            </div>
          </div>
          
          <!-- Live Preview -->
          <div style="flex: 1; min-width: 300px;">
            <h4>Live Preview:</h4>
            <div style="padding: 2rem; border: 2px dashed #ccc; border-radius: 8px; background: #fafafa;">
              <ui-progress-bar
                [size]="demoSize"
                [variant]="demoVariant"
                [progressType]="demoType"
                [progress]="demoProgress"
                [buffer]="demoBuffer"
                [striped]="demoStriped"
                [animated]="demoAnimated"
                [showPercentage]="demoShowPercentage"
                [state]="demoDisabled ? 'disabled' : 'default'"
                label="Interactive Demo Progress"
                helperText="Customize the progress bar using the controls">
              </ui-progress-bar>
            </div>
          </div>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Progress Bar:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-progress-bar 
  label="Download Progress"
  size="md"
  variant="primary"
  [progress]="75"
  helperText="3 of 4 files downloaded"&gt;
&lt;/ui-progress-bar&gt;</code></pre>
          
          <h4>Indeterminate Progress:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-progress-bar 
  label="Loading..."
  progressType="indeterminate"
  variant="primary"
  [animated]="true"
  helperText="Please wait while we process your request"&gt;
&lt;/ui-progress-bar&gt;</code></pre>

          <h4>Buffer Progress:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-progress-bar 
  label="Video Loading"
  progressType="buffer"
  [progress]="currentProgress"
  [buffer]="bufferProgress"
  variant="secondary"
  helperText="Buffering video content"&gt;
&lt;/ui-progress-bar&gt;</code></pre>

          <h4>Striped Animated Progress:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-progress-bar 
  label="Upload Progress"
  [progress]="uploadPercent"
  variant="success"
  [striped]="true"
  [animated]="true"
  size="lg"
  helperText="Uploading files..."&gt;
&lt;/ui-progress-bar&gt;</code></pre>
        </div>
      </section>

      <!-- Programmatic Control Example -->
      <section style="margin-bottom: 3rem;">
        <h3>Programmatic Control Example</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem;">
          <ui-progress-bar 
            #programmableProgress
            label="File Processing"
            [progress]="programmableValue()"
            variant="success"
            helperText="Processing files..."
            size="lg">
          </ui-progress-bar>
          
          <div style="display: flex; gap: 1rem; flex-wrap: wrap;">
            <button (click)="simulateProgress()" style="padding: 0.5rem 1rem; border: 1px solid #28a745; border-radius: 4px; background: #28a745; color: white; cursor: pointer;">
              Simulate Progress
            </button>
            <button (click)="pauseProgress()" style="padding: 0.5rem 1rem; border: 1px solid #ffc107; border-radius: 4px; background: #ffc107; color: black; cursor: pointer;">
              Pause
            </button>
            <button (click)="resetProgrammable()" style="padding: 0.5rem 1rem; border: 1px solid #6c757d; border-radius: 4px; background: #6c757d; color: white; cursor: pointer;">
              Reset
            </button>
            <button (click)="completeProgress()" style="padding: 0.5rem 1rem; border: 1px solid #007bff; border-radius: 4px; background: #007bff; color: white; cursor: pointer;">
              Complete
            </button>
          </div>
          
          <div style="font-size: 0.875rem; color: #666;">
            <strong>Current Progress:</strong> {{ programmableValue() }}% | 
            <strong>Status:</strong> {{ progressStatus() }}
          </div>
        </div>
      </section>

    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }

    select, input[type="checkbox"], input[type="range"] {
      cursor: pointer;
    }

    label {
      cursor: pointer;
    }

    button:hover {
      opacity: 0.9;
    }

    button:active {
      transform: scale(0.98);
    }
  `]
})
export class ProgressDemoComponent {
  
  // Animated progress values
  determinateProgress = signal(35);
  bufferProgress = signal(25);
  bufferValue = signal(65);
  
  // Interactive demo properties
  demoProgress = 60;
  demoBuffer = 80;
  demoSize: 'sm' | 'md' | 'lg' = 'md';
  demoVariant: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' = 'primary';
  demoType: 'determinate' | 'indeterminate' | 'buffer' = 'determinate';
  demoStriped = false;
  demoAnimated = false;
  demoShowPercentage = true;
  demoDisabled = false;
  
  // Programmable progress
  programmableValue = signal(0);
  progressStatus = signal('Ready');
  private progressInterval: any;
  private isPaused = false;

  ngOnInit(): void {
    // Start some animated progress bars
    this.animateProgress();
  }

  ngOnDestroy(): void {
    if (this.progressInterval) {
      clearInterval(this.progressInterval);
    }
  }

  private animateProgress(): void {
    // Animate the determinate progress
    setInterval(() => {
      const current = this.determinateProgress();
      const next = (current + 1) % 101;
      this.determinateProgress.set(next);
    }, 100);

    // Animate the buffer progress
    setInterval(() => {
      const currentBuffer = this.bufferValue();
      const currentProgress = this.bufferProgress();
      
      const nextBuffer = (currentBuffer + 0.5) % 101;
      const nextProgress = Math.min(nextBuffer - 20, 100);
      
      this.bufferValue.set(nextBuffer);
      this.bufferProgress.set(Math.max(0, nextProgress));
    }, 150);
  }

  startDemo(): void {
    this.demoProgress = 0;
    let progress = 0;
    
    const interval = setInterval(() => {
      progress += Math.random() * 3;
      this.demoProgress = Math.min(100, progress);
      
      if (progress >= 100) {
        clearInterval(interval);
      }
    }, 100);
  }

  resetDemo(): void {
    this.demoProgress = 0;
    this.demoBuffer = 0;
    this.demoSize = 'md';
    this.demoVariant = 'primary';
    this.demoType = 'determinate';
    this.demoStriped = false;
    this.demoAnimated = false;
    this.demoShowPercentage = true;
    this.demoDisabled = false;
  }

  simulateProgress(): void {
    if (this.progressInterval) {
      clearInterval(this.progressInterval);
    }
    
    this.isPaused = false;
    this.progressStatus.set('Processing...');
    
    this.progressInterval = setInterval(() => {
      if (!this.isPaused) {
        const current = this.programmableValue();
        if (current < 100) {
          this.programmableValue.set(current + Math.random() * 2);
        } else {
          this.progressStatus.set('Complete!');
          clearInterval(this.progressInterval);
        }
      }
    }, 50);
  }

  pauseProgress(): void {
    this.isPaused = !this.isPaused;
    this.progressStatus.set(this.isPaused ? 'Paused' : 'Processing...');
  }

  resetProgrammable(): void {
    if (this.progressInterval) {
      clearInterval(this.progressInterval);
    }
    this.programmableValue.set(0);
    this.progressStatus.set('Ready');
    this.isPaused = false;
  }

  completeProgress(): void {
    if (this.progressInterval) {
      clearInterval(this.progressInterval);
    }
    this.programmableValue.set(100);
    this.progressStatus.set('Complete!');
    this.isPaused = false;
  }
}y#ncx:q|uW .'q
xYQimport { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { RadioButtonComponent } from '../../../../../ui-essentials/src/lib/components/forms/radio/radio-button.component';
import { RadioGroupComponent } from '../../../../../ui-essentials/src/lib/components/forms/radio/radio-group.component';
import { RadioButtonData } from '../../../../../ui-essentials/src/lib/components/forms/radio/radio-button.component';

@Component({
  selector: 'ui-radio-demo',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    RadioButtonComponent,
    RadioGroupComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Radio Button Component Showcase</h2>
      
      <!-- Basic Radio Buttons -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Radio Buttons</h3>
        
        <!-- Individual Radio Buttons -->
        <div style="margin-bottom: 2rem;">
          <h4>Individual Radio Buttons</h4>
          <div style="display: flex; flex-direction: column; gap: 1rem;">
            <ui-radio-button
              value="option1"
              label="Option 1"
              name="basic-group"
              [(ngModel)]="basicSelection"
              (selectionChange)="handleSelectionChange('basic', $event)"
            />
            <ui-radio-button
              value="option2"
              label="Option 2"
              name="basic-group"
              [(ngModel)]="basicSelection"
              (selectionChange)="handleSelectionChange('basic', $event)"
            />
            <ui-radio-button
              value="option3"
              label="Option 3"
              name="basic-group"
              [(ngModel)]="basicSelection"
              (selectionChange)="handleSelectionChange('basic', $event)"
            />
          </div>
        </div>

        <!-- Radio Group -->
        <div style="margin-bottom: 2rem;">
          <h4>Radio Group</h4>
          <ui-radio-group
            label="Choose your preferred option"
            [options]="basicOptions"
            name="group-demo"
            [(ngModel)]="groupSelection"
            (selectionChange)="handleSelectionChange('group', $event)"
          />
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        
        <!-- Small -->
        <div style="margin-bottom: 2rem;">
          <h4>Small (sm)</h4>
          <ui-radio-group
            label="Small radio buttons"
            size="sm"
            [options]="sizeOptions"
            name="small-group"
            [(ngModel)]="sizeSelections['sm']"
            (selectionChange)="handleSizeSelection('sm', $event)"
          />
        </div>

        <!-- Medium -->
        <div style="margin-bottom: 2rem;">
          <h4>Medium (md) - Default</h4>
          <ui-radio-group
            label="Medium radio buttons"
            size="md"
            [options]="sizeOptions"
            name="medium-group"
            [(ngModel)]="sizeSelections['md']"
            (selectionChange)="handleSizeSelection('md', $event)"
          />
        </div>

        <!-- Large -->
        <div style="margin-bottom: 2rem;">
          <h4>Large (lg)</h4>
          <ui-radio-group
            label="Large radio buttons"
            size="lg"
            [options]="sizeOptions"
            name="large-group"
            [(ngModel)]="sizeSelections['lg']"
            (selectionChange)="handleSizeSelection('lg', $event)"
          />
        </div>
      </section>

      <!-- Variant Colors -->
      <section style="margin-bottom: 3rem;">
        <h3>Color Variants</h3>
        
        <!-- Primary -->
        <div style="margin-bottom: 2rem;">
          <h4>Primary (Default)</h4>
          <ui-radio-group
            label="Primary variant"
            variant="primary"
            [options]="colorOptions"
            name="primary-group"
            [(ngModel)]="variantSelections['primary']"
            (selectionChange)="handleVariantSelection('primary', $event)"
          />
        </div>

        <!-- Secondary -->
        <div style="margin-bottom: 2rem;">
          <h4>Secondary</h4>
          <ui-radio-group
            label="Secondary variant"
            variant="secondary"
            [options]="colorOptions"
            name="secondary-group"
            [(ngModel)]="variantSelections['secondary']"
            (selectionChange)="handleVariantSelection('secondary', $event)"
          />
        </div>

        <!-- Success -->
        <div style="margin-bottom: 2rem;">
          <h4>Success</h4>
          <ui-radio-group
            label="Success variant"
            variant="success"
            [options]="colorOptions"
            name="success-group"
            [(ngModel)]="variantSelections['success']"
            (selectionChange)="handleVariantSelection('success', $event)"
          />
        </div>

        <!-- Warning -->
        <div style="margin-bottom: 2rem;">
          <h4>Warning</h4>
          <ui-radio-group
            label="Warning variant"
            variant="warning"
            [options]="colorOptions"
            name="warning-group"
            [(ngModel)]="variantSelections['warning']"
            (selectionChange)="handleVariantSelection('warning', $event)"
          />
        </div>

        <!-- Danger -->
        <div style="margin-bottom: 2rem;">
          <h4>Danger</h4>
          <ui-radio-group
            label="Danger variant"
            variant="danger"
            [options]="colorOptions"
            name="danger-group"
            [(ngModel)]="variantSelections['danger']"
            (selectionChange)="handleVariantSelection('danger', $event)"
          />
        </div>
      </section>

      <!-- Orientation -->
      <section style="margin-bottom: 3rem;">
        <h3>Orientation</h3>
        
        <!-- Vertical -->
        <div style="margin-bottom: 2rem;">
          <h4>Vertical (Default)</h4>
          <ui-radio-group
            label="Vertical orientation"
            orientation="vertical"
            [options]="orientationOptions"
            name="vertical-group"
            [(ngModel)]="orientationSelections['vertical']"
            (selectionChange)="handleOrientationSelection('vertical', $event)"
          />
        </div>

        <!-- Horizontal -->
        <div style="margin-bottom: 2rem;">
          <h4>Horizontal</h4>
          <ui-radio-group
            label="Horizontal orientation"
            orientation="horizontal"
            [options]="orientationOptions"
            name="horizontal-group"
            [(ngModel)]="orientationSelections['horizontal']"
            (selectionChange)="handleOrientationSelection('horizontal', $event)"
          />
        </div>
      </section>

      <!-- With Descriptions -->
      <section style="margin-bottom: 3rem;">
        <h3>Radio Buttons with Descriptions</h3>
        <ui-radio-group
          label="Choose your subscription plan"
          [options]="planOptions"
          name="plan-group"
          [(ngModel)]="planSelection"
          (selectionChange)="handleSelectionChange('plan', $event)"
        />
      </section>

      <!-- States -->
      <section style="margin-bottom: 3rem;">
        <h3>Radio Button States</h3>
        
        <!-- Disabled Group -->
        <div style="margin-bottom: 2rem;">
          <h4>Disabled Group</h4>
          <ui-radio-group
            label="Disabled radio group"
            [options]="stateOptions"
            name="disabled-group"
            [disabled]="true"
            helperText="This entire group is disabled"
          />
        </div>

        <!-- Individual Disabled Options -->
        <div style="margin-bottom: 2rem;">
          <h4>Individual Disabled Options</h4>
          <ui-radio-group
            label="Some options disabled"
            [options]="disabledOptions"
            name="individual-disabled-group"
            [(ngModel)]="disabledSelection"
            (selectionChange)="handleSelectionChange('disabled', $event)"
          />
        </div>

        <!-- Error State -->
        <div style="margin-bottom: 2rem;">
          <h4>Error State</h4>
          <ui-radio-group
            label="Required selection"
            [options]="errorOptions"
            name="error-group"
            [required]="true"
            errorMessage="Please select an option to continue"
            [(ngModel)]="errorSelection"
            (selectionChange)="handleSelectionChange('error', $event)"
          />
        </div>

        <!-- With Helper Text -->
        <div style="margin-bottom: 2rem;">
          <h4>With Helper Text</h4>
          <ui-radio-group
            label="Notification preferences"
            [options]="notificationOptions"
            name="notification-group"
            helperText="Choose how you'd like to receive notifications"
            [(ngModel)]="notificationSelection"
            (selectionChange)="handleSelectionChange('notification', $event)"
          />
        </div>
      </section>

      <!-- Dense Layout -->
      <section style="margin-bottom: 3rem;">
        <h3>Dense Layout</h3>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem;">
          <!-- Normal Spacing -->
          <div>
            <h4>Normal Spacing</h4>
            <ui-radio-group
              label="Normal spacing"
              [options]="denseOptions"
              name="normal-spacing-group"
              [(ngModel)]="denseSelections['normal']"
              (selectionChange)="handleDenseSelection('normal', $event)"
            />
          </div>

          <!-- Dense Spacing -->
          <div>
            <h4>Dense Spacing</h4>
            <ui-radio-group
              label="Dense spacing"
              [options]="denseOptions"
              name="dense-spacing-group"
              [dense]="true"
              [(ngModel)]="denseSelections['dense']"
              (selectionChange)="handleDenseSelection('dense', $event)"
            />
          </div>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Radio Group:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-radio-group
  label="Choose an option"
  [options]="options"
  name="radio-group"
  [(ngModel)]="selectedValue"
  (selectionChange)="onSelectionChange($event)"&gt;
&lt;/ui-radio-group&gt;</code></pre>
          
          <h4>Individual Radio Button:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-radio-button
  value="option1"
  label="Option 1"
  name="radio-name"
  size="md"
  variant="primary"
  [(ngModel)]="selectedValue"
  (selectionChange)="onSelectionChange($event)"&gt;
&lt;/ui-radio-button&gt;</code></pre>

          <h4>With Descriptions:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-radio-group
  label="Subscription Plans"
  [options]="[
    {{ '{' }}
      value: 'basic',
      label: 'Basic Plan',
      description: 'Perfect for individuals'
    {{ '}' }},
    {{ '{' }}
      value: 'pro',
      label: 'Pro Plan', 
      description: 'For small teams'
    {{ '}' }}
  ]"
  name="subscription"
  [(ngModel)]="plan"&gt;
&lt;/ui-radio-group&gt;</code></pre>

          <h4>Horizontal Layout:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-radio-group
  label="Payment Method"
  [options]="paymentOptions"
  orientation="horizontal"
  name="payment"
  [(ngModel)]="paymentMethod"&gt;
&lt;/ui-radio-group&gt;</code></pre>
        </div>
      </section>

      <!-- Interactive Controls -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Controls</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button 
            style="padding: 0.5rem 1rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="resetAllSelections()"
          >
            Reset All Selections
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="fillSampleSelections()"
          >
            Fill Sample Selections
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #6f42c1; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleDisabled()"
          >
            {{ globalDisabled() ? 'Enable All' : 'Disable All' }}
          </button>
        </div>
        
        @if (lastSelection()) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last selection:</strong> {{ lastSelection() }}
          </div>
        }
      </section>

      <!-- Current Values -->
      <section style="margin-bottom: 3rem;">
        <h3>Current Values</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; max-height: 400px; overflow-y: auto;">
          <pre>{{ getCurrentValues() }}</pre>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }

    button {
      transition: all 0.2s ease-in-out;
    }

    button:hover {
      opacity: 0.9;
      transform: translateY(-1px);
    }
  `]
})
export class RadioDemoComponent {
  // Basic selections
  basicSelection = '';
  groupSelection = '';

  // Size selections
  sizeSelections: Record<string, string> = {
    'sm': '',
    'md': '',
    'lg': ''
  };

  // Variant selections
  variantSelections: Record<string, string> = {
    'primary': '',
    'secondary': '',
    'success': '',
    'warning': '',
    'danger': ''
  };

  // Orientation selections
  orientationSelections: Record<string, string> = {
    'vertical': '',
    'horizontal': ''
  };

  // Other selections
  planSelection = '';
  disabledSelection = '';
  errorSelection = '';
  notificationSelection = '';

  // Dense selections
  denseSelections: Record<string, string> = {
    'normal': '',
    'dense': ''
  };

  // Signals for reactive state
  lastSelection = signal<string>('');
  globalDisabled = signal<boolean>(false);

  // Option data
  basicOptions: RadioButtonData[] = [
    { value: 'basic1', label: 'Basic Option 1' },
    { value: 'basic2', label: 'Basic Option 2' },
    { value: 'basic3', label: 'Basic Option 3' }
  ];

  sizeOptions: RadioButtonData[] = [
    { value: 'size1', label: 'First Choice' },
    { value: 'size2', label: 'Second Choice' },
    { value: 'size3', label: 'Third Choice' }
  ];

  colorOptions: RadioButtonData[] = [
    { value: 'color1', label: 'Red' },
    { value: 'color2', label: 'Blue' },
    { value: 'color3', label: 'Green' }
  ];

  orientationOptions: RadioButtonData[] = [
    { value: 'orient1', label: 'Option A' },
    { value: 'orient2', label: 'Option B' },
    { value: 'orient3', label: 'Option C' },
    { value: 'orient4', label: 'Option D' }
  ];

  planOptions: RadioButtonData[] = [
    {
      value: 'basic',
      label: 'Basic Plan',
      description: 'Perfect for individuals and small projects. Includes 5GB storage and basic support.'
    },
    {
      value: 'pro',
      label: 'Professional Plan',
      description: 'Great for small teams. Includes 50GB storage, priority support, and advanced features.'
    },
    {
      value: 'enterprise',
      label: 'Enterprise Plan',
      description: 'For large organizations. Unlimited storage, 24/7 support, and custom integrations.'
    }
  ];

  stateOptions: RadioButtonData[] = [
    { value: 'state1', label: 'Option 1' },
    { value: 'state2', label: 'Option 2' },
    { value: 'state3', label: 'Option 3' }
  ];

  disabledOptions: RadioButtonData[] = [
    { value: 'available1', label: 'Available Option 1' },
    { value: 'disabled1', label: 'Disabled Option', disabled: true },
    { value: 'available2', label: 'Available Option 2' },
    { value: 'disabled2', label: 'Another Disabled Option', disabled: true }
  ];

  errorOptions: RadioButtonData[] = [
    { value: 'error1', label: 'Option 1' },
    { value: 'error2', label: 'Option 2' },
    { value: 'error3', label: 'Option 3' }
  ];

  notificationOptions: RadioButtonData[] = [
    { value: 'email', label: 'Email notifications' },
    { value: 'sms', label: 'SMS notifications' },
    { value: 'push', label: 'Push notifications' },
    { value: 'none', label: 'No notifications' }
  ];

  denseOptions: RadioButtonData[] = [
    { value: 'dense1', label: 'Compact Option 1' },
    { value: 'dense2', label: 'Compact Option 2' },
    { value: 'dense3', label: 'Compact Option 3' },
    { value: 'dense4', label: 'Compact Option 4' }
  ];

  handleSelectionChange(group: string, value: string): void {
    this.lastSelection.set(`${group}: ${value}`);
    console.log(`Selection changed in ${group}: ${value}`);
  }

  handleSizeSelection(size: string, value: string): void {
    this.sizeSelections[size] = value;
    this.handleSelectionChange(`size-${size}`, value);
  }

  handleVariantSelection(variant: string, value: string): void {
    this.variantSelections[variant] = value;
    this.handleSelectionChange(`variant-${variant}`, value);
  }

  handleOrientationSelection(orientation: string, value: string): void {
    this.orientationSelections[orientation] = value;
    this.handleSelectionChange(`orientation-${orientation}`, value);
  }

  handleDenseSelection(type: string, value: string): void {
    this.denseSelections[type] = value;
    this.handleSelectionChange(`dense-${type}`, value);
  }

  resetAllSelections(): void {
    this.basicSelection = '';
    this.groupSelection = '';
    this.planSelection = '';
    this.disabledSelection = '';
    this.errorSelection = '';
    this.notificationSelection = '';

    Object.keys(this.sizeSelections).forEach(key => {
      this.sizeSelections[key] = '';
    });

    Object.keys(this.variantSelections).forEach(key => {
      this.variantSelections[key] = '';
    });

    Object.keys(this.orientationSelections).forEach(key => {
      this.orientationSelections[key] = '';
    });

    Object.keys(this.denseSelections).forEach(key => {
      this.denseSelections[key] = '';
    });

    this.lastSelection.set('All selections reset');
    console.log('All selections reset');
  }

  fillSampleSelections(): void {
    this.basicSelection = 'option2';
    this.groupSelection = 'basic2';
    this.planSelection = 'pro';
    this.notificationSelection = 'email';
    this.sizeSelections['md'] = 'size2';
    this.variantSelections['primary'] = 'color1';
    this.orientationSelections['horizontal'] = 'orient3';
    this.denseSelections['dense'] = 'dense2';

    this.lastSelection.set('Sample selections filled');
    console.log('Sample selections filled');
  }

  toggleDisabled(): void {
    this.globalDisabled.set(!this.globalDisabled());
    this.lastSelection.set(`All controls ${this.globalDisabled() ? 'disabled' : 'enabled'}`);
    console.log(`Global disabled state: ${this.globalDisabled()}`);
  }

  getCurrentValues(): string {
    const values = {
      basic: this.basicSelection,
      group: this.groupSelection,
      plan: this.planSelection,
      disabled: this.disabledSelection,
      error: this.errorSelection,
      notification: this.notificationSelection,
      sizes: this.sizeSelections,
      variants: this.variantSelections,
      orientations: this.orientationSelections,
      dense: this.denseSelections
    };

    return JSON.stringify(values, null, 2);
  }
}.}gxq!R\

A)N%%yyy%:
\3ʻ$$rM<Y AvxW<import { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';
import { RangeSliderComponent, RangeSliderTickMark } from '../../../../../ui-essentials/src/public-api';

@Component({
  selector: 'ui-range-slider-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, ReactiveFormsModule, RangeSliderComponent],
  template: `
    <div class="demo-container">
      <h2>Range Slider Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-column">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <ui-range-slider 
                [size]="size"
                [value]="75"
                [label]="size.toUpperCase() + ' Size'"
                [showValue]="true">
              </ui-range-slider>
            </div>
          }
        </div>
      </section>
      
      <!-- Color Variants -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-column">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <ui-range-slider 
                [variant]="variant"
                [value]="65"
                [label]="variant + ' variant'"
                [showValue]="true">
              </ui-range-slider>
            </div>
          }
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-column">
          <div class="demo-item">
            <ui-range-slider 
              [value]="45"
              label="Default State"
              [showValue]="true">
            </ui-range-slider>
          </div>
          
          <div class="demo-item">
            <ui-range-slider 
              [disabled]="true"
              [value]="45"
              label="Disabled State"
              [showValue]="true">
            </ui-range-slider>
          </div>
          
          <div class="demo-item">
            <ui-range-slider 
              [readonly]="true"
              [value]="75"
              label="Readonly State"
              [showValue]="true">
            </ui-range-slider>
          </div>
          
          <div class="demo-item">
            <ui-range-slider 
              [value]="30"
              [hasError]="true"
              label="Error State"
              helperText="This field has an error"
              [showValue]="true">
            </ui-range-slider>
          </div>
        </div>
      </section>

      <!-- Range Configurations -->
      <section class="demo-section">
        <h3>Range Configurations</h3>
        <div class="demo-column">
          <div class="demo-item">
            <ui-range-slider 
              [min]="0"
              [max]="100"
              [step]="1"
              [value]="50"
              label="Standard (0-100, step 1)"
              [showValue]="true">
            </ui-range-slider>
          </div>
          
          <div class="demo-item">
            <ui-range-slider 
              [min]="0"
              [max]="10"
              [step]="0.5"
              [value]="7.5"
              label="Decimal Steps (0-10, step 0.5)"
              [showValue]="true">
            </ui-range-slider>
          </div>
          
          <div class="demo-item">
            <ui-range-slider 
              [min]="-50"
              [max]="50"
              [step]="5"
              [value]="-10"
              label="Negative Range (-50 to 50, step 5)"
              [showValue]="true">
            </ui-range-slider>
          </div>
          
          <div class="demo-item">
            <ui-range-slider 
              [min]="1000"
              [max]="10000"
              [step]="100"
              [value]="5500"
              label="Large Numbers (1K-10K)"
              [showValue]="true"
              valueUnit=" units">
            </ui-range-slider>
          </div>
        </div>
      </section>

      <!-- With Tick Marks -->
      <section class="demo-section">
        <h3>Tick Marks</h3>
        <div class="demo-column">
          <div class="demo-item">
            <ui-range-slider 
              [min]="0"
              [max]="100"
              [step]="10"
              [value]="60"
              [ticks]="basicTicks"
              label="Basic Tick Marks"
              [showValue]="true">
            </ui-range-slider>
          </div>
          
          <div class="demo-item">
            <ui-range-slider 
              [min]="0"
              [max]="5"
              [step]="1"
              [value]="3"
              [ticks]="labeledTicks"
              [showTickLabels]="true"
              label="Labeled Tick Marks"
              [showValue]="true">
            </ui-range-slider>
          </div>
          
          <div class="demo-item">
            <ui-range-slider 
              [min]="0"
              [max]="100"
              [step]="5"
              [value]="75"
              [ticks]="majorMinorTicks"
              [showTickLabels]="true"
              label="Major & Minor Ticks"
              [showValue]="true">
            </ui-range-slider>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Configuration</h3>
        <div class="demo-controls">
          <div class="control-row">
            <div class="control-group">
              <label>Min Value: {{ interactiveMin() }}</label>
              <input 
                type="range" 
                min="-100" 
                max="100" 
                [value]="interactiveMin()"
                (input)="updateMin($event)" />
            </div>
            
            <div class="control-group">
              <label>Max Value: {{ interactiveMax() }}</label>
              <input 
                type="range" 
                min="0" 
                max="200" 
                [value]="interactiveMax()"
                (input)="updateMax($event)" />
            </div>
            
            <div class="control-group">
              <label>Step: {{ interactiveStep() }}</label>
              <select [value]="interactiveStep()" (change)="updateStep($event)">
                <option value="1">1</option>
                <option value="5">5</option>
                <option value="10">10</option>
                <option value="0.1">0.1</option>
                <option value="0.5">0.5</option>
              </select>
            </div>
          </div>
          
          <div class="control-row">
            <div class="control-group">
              <label>Size:</label>
              <select [value]="interactiveSize()" (change)="updateSize($event)">
                @for (size of sizes; track size) {
                  <option [value]="size">{{ size }}</option>
                }
              </select>
            </div>
            
            <div class="control-group">
              <label>Variant:</label>
              <select [value]="interactiveVariant()" (change)="updateVariant($event)">
                @for (variant of variants; track variant) {
                  <option [value]="variant">{{ variant }}</option>
                }
              </select>
            </div>
            
            <div class="control-group">
              <label>
                <input 
                  type="checkbox" 
                  [checked]="interactiveShowValue()"
                  (change)="toggleShowValue($event)" />
                Show Value
              </label>
            </div>
            
            <div class="control-group">
              <label>
                <input 
                  type="checkbox" 
                  [checked]="interactiveDisabled()"
                  (change)="toggleDisabled($event)" />
                Disabled
              </label>
            </div>
          </div>
        </div>
        
        <div class="demo-interactive-result">
          <ui-range-slider 
            [min]="interactiveMin()"
            [max]="interactiveMax()"
            [step]="interactiveStep()"
            [value]="interactiveValue()"
            [size]="interactiveSize()"
            [variant]="interactiveVariant()"
            [showValue]="interactiveShowValue()"
            [disabled]="interactiveDisabled()"
            label="Interactive Slider"
            helperText="Customize using controls above"
            (valueChange)="onInteractiveValueChange($event)">
          </ui-range-slider>
        </div>
      </section>

      <!-- Form Integration -->
      <section class="demo-section">
        <h3>Form Integration</h3>
        <form [formGroup]="demoForm" class="demo-form">
          <div class="form-row">
            <ui-range-slider
              formControlName="volume"
              [min]="0"
              [max]="100"
              [step]="1"
              label="Volume"
              [showValue]="true"
              valueUnit="%"
              helperText="Adjust the volume level">
            </ui-range-slider>
          </div>
          
          <div class="form-row">
            <ui-range-slider
              formControlName="brightness"
              [min]="0"
              [max]="255"
              [step]="5"
              label="Brightness"
              [showValue]="true"
              variant="secondary"
              helperText="Screen brightness setting">
            </ui-range-slider>
          </div>
          
          <div class="form-row">
            <ui-range-slider
              formControlName="temperature"
              [min]="16"
              [max]="30"
              [step]="0.5"
              [ticks]="temperatureTicks"
              [showTickLabels]="true"
              label="Temperature"
              [showValue]="true"
              valueUnit="°C"
              variant="warning">
            </ui-range-slider>
          </div>
          
          <div class="form-output">
            <h4>Form Values:</h4>
            <pre>{{ getFormValues() | json }}</pre>
          </div>
        </form>
      </section>

      <!-- Event Demonstration -->
      <section class="demo-section">
        <h3>Event Handling</h3>
        <div class="demo-column">
          <div class="demo-item">
            <ui-range-slider
              [value]="eventSliderValue()"
              label="Event Slider"
              [showValue]="true"
              (valueChange)="onValueChange($event)"
              (slideStart)="onSlideStart($event)"
              (slideEnd)="onSlideEnd($event)"
              (sliderFocus)="onSliderFocus()"
              (sliderBlur)="onSliderBlur()">
            </ui-range-slider>
          </div>
          
          <div class="event-log">
            <h4>Event Log:</h4>
            <div class="event-list">
              @for (event of eventLog(); track $index) {
                <div class="event-item">{{ event }}</div>
              }
            </div>
            <button (click)="clearEventLog()">Clear Log</button>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './range-slider-demo.component.scss'
})
export class RangeSliderDemoComponent {
  private fb = new FormBuilder();

  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['primary', 'secondary', 'success', 'warning', 'danger'] as const;

  // Interactive demo state
  interactiveValue = signal(50);
  interactiveMin = signal(0);
  interactiveMax = signal(100);
  interactiveStep = signal(1);
  interactiveSize = signal<'sm' | 'md' | 'lg'>('md');
  interactiveVariant = signal<'primary' | 'secondary' | 'success' | 'warning' | 'danger'>('primary');
  interactiveShowValue = signal(true);
  interactiveDisabled = signal(false);

  // Event demo state
  eventSliderValue = signal(25);
  eventLog = signal<string[]>([]);

  // Tick mark configurations
  basicTicks: RangeSliderTickMark[] = [
    { value: 0 },
    { value: 25 },
    { value: 50 },
    { value: 75 },
    { value: 100 }
  ];

  labeledTicks: RangeSliderTickMark[] = [
    { value: 0, label: 'Min' },
    { value: 1, label: 'Low' },
    { value: 2, label: 'Med' },
    { value: 3, label: 'High' },
    { value: 4, label: 'Very High' },
    { value: 5, label: 'Max' }
  ];

  majorMinorTicks: RangeSliderTickMark[] = [
    { value: 0, label: '0%', major: true },
    { value: 25, major: false },
    { value: 50, label: '50%', major: true },
    { value: 75, major: false },
    { value: 100, label: '100%', major: true }
  ];

  temperatureTicks: RangeSliderTickMark[] = [
    { value: 16, label: '16°' },
    { value: 18, label: '18°' },
    { value: 20, label: '20°' },
    { value: 22, label: '22°' },
    { value: 24, label: '24°' },
    { value: 26, label: '26°' },
    { value: 28, label: '28°' },
    { value: 30, label: '30°' }
  ];

  // Form setup
  demoForm: FormGroup = this.fb.group({
    volume: [75],
    brightness: [128],
    temperature: [22]
  });

  // Interactive controls
  updateMin(event: Event): void {
    const target = event.target as HTMLInputElement;
    const newMin = parseInt(target.value, 10);
    this.interactiveMin.set(newMin);
    // Adjust value if it's now below min
    if (this.interactiveValue() < newMin) {
      this.interactiveValue.set(newMin);
    }
  }

  updateMax(event: Event): void {
    const target = event.target as HTMLInputElement;
    const newMax = parseInt(target.value, 10);
    this.interactiveMax.set(newMax);
    // Adjust value if it's now above max
    if (this.interactiveValue() > newMax) {
      this.interactiveValue.set(newMax);
    }
  }

  updateStep(event: Event): void {
    const target = event.target as HTMLSelectElement;
    this.interactiveStep.set(parseFloat(target.value));
  }

  updateSize(event: Event): void {
    const target = event.target as HTMLSelectElement;
    this.interactiveSize.set(target.value as any);
  }

  updateVariant(event: Event): void {
    const target = event.target as HTMLSelectElement;
    this.interactiveVariant.set(target.value as any);
  }

  toggleShowValue(event: Event): void {
    const target = event.target as HTMLInputElement;
    this.interactiveShowValue.set(target.checked);
  }

  toggleDisabled(event: Event): void {
    const target = event.target as HTMLInputElement;
    this.interactiveDisabled.set(target.checked);
  }

  onInteractiveValueChange(value: number): void {
    this.interactiveValue.set(value);
  }

  // Event handlers
  onValueChange(value: number): void {
    this.eventSliderValue.set(value);
    this.addEventLog(`Value changed: ${value}`);
  }

  onSlideStart(value: number): void {
    this.addEventLog(`Slide started at: ${value}`);
  }

  onSlideEnd(value: number): void {
    this.addEventLog(`Slide ended at: ${value}`);
  }

  onSliderFocus(): void {
    this.addEventLog('Slider focused');
  }

  onSliderBlur(): void {
    this.addEventLog('Slider blurred');
  }

  private addEventLog(message: string): void {
    const timestamp = new Date().toLocaleTimeString();
    const newLog = `[${timestamp}] ${message}`;
    this.eventLog.update(log => [newLog, ...log.slice(0, 9)]); // Keep last 10 events
  }

  clearEventLog(): void {
    this.eventLog.set([]);
  }

  getFormValues(): any {
    return this.demoForm.value;
  }
}:yx>@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-gallery-grid {
  // Core Structure
  display: grid;
  position: relative;
  width: 100%;
  
  // Layout & Spacing
  gap: $semantic-spacing-grid-gap-md;
  padding: $semantic-spacing-component-md;
  
  // Visual Design
  background: $semantic-color-surface-primary;
  border-radius: $semantic-border-radius-md;
  
  // Grid Sizing Variants
  &--columns-1 {
    grid-template-columns: 1fr;
  }
  
  &--columns-2 {
    grid-template-columns: repeat(2, 1fr);
  }
  
  &--columns-3 {
    grid-template-columns: repeat(3, 1fr);
  }
  
  &--columns-4 {
    grid-template-columns: repeat(4, 1fr);
  }
  
  &--columns-5 {
    grid-template-columns: repeat(5, 1fr);
  }
  
  &--columns-6 {
    grid-template-columns: repeat(6, 1fr);
  }
  
  // Gap Size Variants
  &--gap-sm {
    gap: $semantic-spacing-grid-gap-sm;
  }
  
  &--gap-md {
    gap: $semantic-spacing-grid-gap-md;
  }
  
  &--gap-lg {
    gap: $semantic-spacing-grid-gap-lg;
  }
  
  // Responsive Grid Auto-fit
  &--auto-fit {
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  }
  
  // Masonry-style layout option
  &--masonry {
    grid-auto-rows: min-content;
    align-items: start;
  }
  
  // Gallery Item
  &__item {
    position: relative;
    overflow: hidden;
    border-radius: $semantic-border-radius-md;
    background: $semantic-color-surface-secondary;
    border: $semantic-border-width-1 solid $semantic-color-border-subtle;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    cursor: pointer;
    
    // Interactive States
    &:hover {
      transform: translateY(-2px);
      box-shadow: $semantic-shadow-elevation-3;
      border-color: $semantic-color-border-primary;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    &:active {
      transform: translateY(0);
      box-shadow: $semantic-shadow-elevation-1;
    }
    
    // Loading State
    &--loading {
      opacity: $semantic-opacity-subtle;
      pointer-events: none;
      
      &::after {
        content: '';
        position: absolute;
        top: 50%;
        left: 50%;
        width: 20px;
        height: 20px;
        margin: -10px 0 0 -10px;
        border: 2px solid $semantic-color-border-subtle;
        border-top-color: $semantic-color-primary;
        border-radius: $semantic-border-radius-full;
        animation: ui-gallery-grid-spin 1s linear infinite;
      }
    }
    
    // Selected State
    &--selected {
      border-color: $semantic-color-primary;
      box-shadow: $semantic-shadow-elevation-2;
      
      &::before {
        content: '';
        position: absolute;
        top: $semantic-spacing-component-xs;
        right: $semantic-spacing-component-xs;
        width: 20px;
        height: 20px;
        background: $semantic-color-primary;
        border-radius: $semantic-border-radius-full;
        z-index: 2;
      }
      
      &::after {
        content: '✓';
        position: absolute;
        top: $semantic-spacing-component-xs;
        right: $semantic-spacing-component-xs;
        width: 20px;
        height: 20px;
        display: flex;
        align-items: center;
        justify-content: center;
        color: $semantic-color-on-primary;
        font-size: $semantic-typography-font-size-xs;
        font-weight: $semantic-typography-font-weight-bold;
        z-index: 3;
      }
    }
  }
  
  // Image within gallery item
  &__image {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: transform $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &--contain {
      object-fit: contain;
    }
    
    &--fill {
      object-fit: fill;
    }
    
    &--scale-down {
      object-fit: scale-down;
    }
  }
  
  // Overlay for additional information
  &__overlay {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent);
    color: $semantic-color-text-inverse;
    padding: $semantic-spacing-component-md;
    opacity: 0;
    transform: translateY(100%);
    transition: all $semantic-motion-duration-normal $semantic-motion-easing-ease;
    
    .ui-gallery-grid__item:hover & {
      opacity: 1;
      transform: translateY(0);
    }
  }
  
  // Overlay content
  &__title {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: $semantic-typography-font-weight-semibold;
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-inverse;
    margin-bottom: $semantic-spacing-content-line-tight;
  }
  
  &__caption {
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: map-get($semantic-typography-body-small, font-weight);
    line-height: map-get($semantic-typography-body-small, line-height);
    color: $semantic-color-text-inverse;
    opacity: $semantic-opacity-subtle;
  }
  
  // Lightbox trigger indicator
  &__zoom-indicator {
    position: absolute;
    top: $semantic-spacing-component-xs;
    left: $semantic-spacing-component-xs;
    width: 24px;
    height: 24px;
    background: rgba(0, 0, 0, 0.6);
    color: $semantic-color-text-inverse;
    border-radius: $semantic-border-radius-sm;
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
    transition: opacity $semantic-motion-duration-fast $semantic-motion-easing-ease;
    z-index: 2;
    
    .ui-gallery-grid__item:hover & {
      opacity: 1;
    }
    
    svg {
      width: 16px;
      height: 16px;
      fill: currentColor;
    }
  }
  
  // Empty state
  &__empty {
    grid-column: 1 / -1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: $semantic-spacing-layout-section-lg;
    color: $semantic-color-text-secondary;
    text-align: center;
    
    &-icon {
      width: 48px;
      height: 48px;
      margin-bottom: $semantic-spacing-component-md;
      opacity: $semantic-opacity-subtle;
    }
    
    &-text {
      font-family: map-get($semantic-typography-body-medium, font-family);
      font-size: map-get($semantic-typography-body-medium, font-size);
      font-weight: map-get($semantic-typography-body-medium, font-weight);
      line-height: map-get($semantic-typography-body-medium, line-height);
    }
  }
  
  // Responsive Design
  @media (max-width: $semantic-breakpoint-lg - 1) {
    &--columns-6 {
      grid-template-columns: repeat(4, 1fr);
    }
    
    &--columns-5 {
      grid-template-columns: repeat(3, 1fr);
    }
  }
  
  @media (max-width: $semantic-breakpoint-md - 1) {
    padding: $semantic-spacing-component-sm;
    gap: $semantic-spacing-grid-gap-sm;
    
    &--columns-6,
    &--columns-5,
    &--columns-4 {
      grid-template-columns: repeat(2, 1fr);
    }
    
    &--columns-3 {
      grid-template-columns: repeat(2, 1fr);
    }
  }
  
  @media (max-width: $semantic-breakpoint-sm - 1) {
    padding: $semantic-spacing-component-xs;
    
    &--columns-6,
    &--columns-5,
    &--columns-4,
    &--columns-3,
    &--columns-2 {
      grid-template-columns: 1fr;
    }
    
    &--auto-fit {
      grid-template-columns: 1fr;
    }
  }
}

// Loading animation keyframes
@keyframes ui-gallery-grid-spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}jG9gOxE;8Oinfinite-scroll-container["flex-direction: column5overflow: auto;
  height: 100%;
  
  // Base styling
@FbGprimary;
  
  // Scrollbar styling
  scrollbar-width: thin;
  scrollbar?		econdaryf&#
  &::-webkit-scrollbar {
    width)2;
  }
  
  &::-webkit-scrollbar-track {
> wu!*sm;
  }
  
  &::-webkit-scrollbar-thumb {
> 	u!sm;
    
    &:hover {
<"}

  // Direction variants
  &--direction-down {
    // Default styling - no specific changes needed
  }
  
  &--direction-up {7
    // Reverse flex direction for up-loading scenarios/-reverse;
  }
  
  &--direction-both {
    // Both directions supported - default styling
  }

  // State variants
  &--loading, {
    cursor: wait;
  }
  
  &--disabled {
 disabled;
  }
  
  &--has-fixed-height {
    // Optimizations for fixed-height items
    .ui-infinite-scroll-container__item {
O      flex-shrink: 0;
    }
  }

  // Content area
  &__content {
    flex: 1;
4Imin-height: 0; // Allow shrinking
  }

  // Individual items
  &__item {
4G
    // Ensure proper spacing between items
    & + & {
      margin-to5sm;
    }
  }

  // Loading indicators
  &__loader {
6%lg;
> wu!%sm;
    
    &--top {
      order: -1.;8}
    
    &--bottom {
      order: 999;
      margin-to.:}
  }

  // Default loading content
  &__default-loader {
.
sm;
    J4O-Osecondary;
  }

  // Loading spinner
  &__spinner {
    display: inline-block;
    width: $semantic-sizing-icon-inline;
    hei#ght: $semantic-sizing-icon-inline;
9border-radius: 50%;
1	3"animation: ui-infinite-scroll-spinDslow linear infinite;
  }

  // End of content indicator
  &__end {
6%lg;
    margin-to.}

  &__default-end,@wu!sm;
    J/caption(captionKcaption>captionN0terti!}

  // Error state
  &__error {
6%lg;
    margin-to.}

  &__default-error {
45.
sm;*lg;
> wUerror;
k+  J4O-Oprim/}

  &__retry-button {
    display: inline-flexJWinteractive-button-padding-y#interactive-button-padding-x;
    
>-border: none;
k+sm;
    J0utton-small)uttonNCuttonEutton
    cursor: pointerk0T-:hover:not(:disabled) {
<1?
0--1px);
    }
    
    &:active:not(:disabled)qbndisabled {
  Vdisabled;
      cursor: not-allowed;
    }
  }

  // Focus styles
  &:focus-visible {
2E}

  // Smooth scrolling behavior
  &:not(&--disabled) {
    scroll-behavior: smooth;
  }

  // High contrast mode support
  @m2edia (prefers-contrast: high) {
    &__loader {
  B__default-end {
  B}

  // Reduced motion support  
  @media (prefers-reduced-motion: reduce) {
    scroll-behavior: auto;
    
    &__spinner {
      animation: none;
    }
    
    &__retry-button {
      transition: none;
      
      &:hover:not(:disabled) {
        transform: noneactive:not(:disabled) {
        transform: none;
      }
    }
  }

  // Print styles
  @media print {
    height: auto;
    overflow: visible;
    
    &__loader,
    &__error,
    &__retry-button {
      display: none;
    }
  }
}

// Keyframes for spi@nner animation
@keyframes ui-infinite-scroll-spin {
  from {
   ~0
  }
  to {
    transform: rotate(360deg);
  }
}Cx$,import { Component, TemplateRef, ViewChild } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ScrollContainerComponent, ScrollVirtualConfig } from '../../../../../ui-essentials/src/lib/components/layout/scroll-container/scroll-container.component';

@Component({
  selector: 'ui-scroll-container-demo',
  standalone: true,
  imports: [CommonModule, ScrollContainerComponent],
  template: `
    <div class="demo-container">
      <h2>ScrollContainer Demo</h2>
      
      <!-- Basic Scrolling -->
      <section class="demo-section">
        <h3>Basic Vertical Scrolling</h3>
        <ui-scroll-container 
          [style.height.px]="200" 
          [style.width.px]="400"
          direction="vertical"
          scrollbarVisibility="auto"
          [showScrollIndicators]="true"
          (scrolled)="onScroll($event)"
          (reachedTop)="onReachedTop()"
          (reachedBottom)="onReachedBottom()">
          <div class="demo-content">
            @for (item of longContent; track item; let i = $index) {
              <p>{{ i + 1 }}. {{ item }}</p>
            }
          </div>
        </ui-scroll-container>
        <p class="demo-info">Scroll events: Top reached {{ topCount }} times, Bottom reached {{ bottomCount }} times</p>
      </section>
      
      <!-- Direction Variants -->
      <section class="demo-section">
        <h3>Direction Variants</h3>
        <div class="demo-row">
          <!-- Vertical -->
          <div class="demo-item">
            <h4>Vertical</h4>
            <ui-scroll-container 
              [style.height.px]="150" 
              [style.width.px]="200"
              direction="vertical">
              <div class="demo-content">
                @for (item of shortContent; track item; let i = $index) {
                  <p>{{ i + 1 }}. {{ item }}</p>
                }
              </div>
            </ui-scroll-container>
          </div>
          
          <!-- Horizontal -->
          <div class="demo-item">
            <h4>Horizontal</h4>
            <ui-scroll-container 
              [style.height.px]="100" 
              [style.width.px]="200"
              direction="horizontal">
              <div class="demo-horizontal-content">
                @for (item of horizontalItems; track item) {
                  <div class="demo-horizontal-item">{{ item }}</div>
                }
              </div>
            </ui-scroll-container>
          </div>
          
          <!-- Both -->
          <div class="demo-item">
            <h4>Both Directions</h4>
            <ui-scroll-container 
              [style.height.px]="150" 
              [style.width.px]="200"
              direction="both">
              <div class="demo-large-content">
                <table class="demo-table">
                  @for (row of tableData; track row.id) {
                    <tr>
                      <td>{{ row.id }}</td>
                      <td>{{ row.name }}</td>
                      <td>{{ row.description }}</td>
                      <td>{{ row.value }}</td>
                      <td>{{ row.status }}</td>
                    </tr>
                  }
                </table>
              </div>
            </ui-scroll-container>
          </div>
        </div>
      </section>
      
      <!-- Scrollbar Visibility -->
      <section class="demo-section">
        <h3>Scrollbar Visibility</h3>
        <div class="demo-row">
          @for (visibility of scrollbarOptions; track visibility) {
            <div class="demo-item">
              <h4>{{ visibility | titlecase }}</h4>
              <ui-scroll-container 
                [style.height.px]="120" 
                [style.width.px]="200"
                [scrollbarVisibility]="visibility">
                <div class="demo-content">
                  @for (item of shortContent; track item; let i = $index) {
                    <p>{{ i + 1 }}. {{ item }}</p>
                  }
                </div>
              </ui-scroll-container>
            </div>
          }
        </div>
      </section>
      
      <!-- Virtual Scrolling -->
      <section class="demo-section">
        <h3>Virtual Scrolling</h3>
        <div class="demo-item">
          <p>Virtual scrolling with {{ largeDataset.length }} items (only visible items are rendered)</p>
          <ui-scroll-container 
            [style.height.px]="300" 
            [style.width.px]="400"
            [virtualScrollConfig]="virtualConfig"
            [items]="largeDataset"
            [itemTemplate]="itemTemplate"
            [trackByFn]="trackByItem">
          </ui-scroll-container>
        </div>
      </section>
      
      <!-- Smooth Scrolling & Controls -->
      <section class="demo-section">
        <h3>Scroll Controls & Smooth Scrolling</h3>
        <div class="demo-controls">
          <button (click)="scrollToTop()">Scroll to Top</button>
          <button (click)="scrollToBottom()">Scroll to Bottom</button>
          <button (click)="scrollToMiddle()">Scroll to Middle</button>
          <button (click)="toggleSmoothScroll()">
            {{ smoothScrollEnabled ? 'Disable' : 'Enable' }} Smooth Scroll
          </button>
        </div>
        <ui-scroll-container 
          #controllableScroll
          [style.height.px]="250" 
          [style.width.px]="400"
          [scrollBehavior]="smoothScrollEnabled ? 'smooth' : 'auto'"
          [showScrollIndicators]="true">
          <div class="demo-content">
            @for (item of longContent; track item; let i = $index) {
              <p [id]="'item-' + i">{{ i + 1 }}. {{ item }}</p>
            }
          </div>
        </ui-scroll-container>
      </section>
      
      <!-- Position Restoration -->
      <section class="demo-section">
        <h3>Scroll Position Restoration</h3>
        <p>Scroll position is saved and restored automatically (uses sessionStorage)</p>
        <ui-scroll-container 
          [style.height.px]="200" 
          [style.width.px]="400"
          [restoreScrollPosition]="true"
          scrollPositionKey="demo-scroll">
          <div class="demo-content">
            @for (item of longContent; track item; let i = $index) {
              <p>{{ i + 1 }}. {{ item }}</p>
            }
          </div>
        </ui-scroll-container>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <div class="demo-stats">
          <p>Current scroll position: {{ currentScrollPosition.top }}px (top), {{ currentScrollPosition.left }}px (left)</p>
          <p>Is scrolling: {{ isScrolling ? 'Yes' : 'No' }}</p>
        </div>
        <ui-scroll-container 
          [style.height.px]="200" 
          [style.width.px]="400"
          direction="both"
          (scrolled)="updateScrollPosition($event)"
          (scrollStart)="onScrollStart()"
          (scrollEnd)="onScrollEnd()">
          <div class="demo-large-content">
            <div class="demo-grid">
              @for (item of gridData; track item.id) {
                <div class="demo-grid-item">
                  <h4>Item {{ item.id }}</h4>
                  <p>{{ item.content }}</p>
                </div>
              }
            </div>
          </div>
        </ui-scroll-container>
      </section>
    </div>
    
    <!-- Virtual Scrolling Item Template -->
    <ng-template #itemTemplate let-item="item" let-index="index">
      <div class="virtual-item">
        <strong>Item {{ index + 1 }}:</strong> {{ item.name }} - {{ item.description }}
      </div>
    </ng-template>
  `,
  styleUrl: './scroll-container-demo.component.scss'
})
export class ScrollContainerDemoComponent {
  @ViewChild('controllableScroll') controllableScroll!: ScrollContainerComponent;
  @ViewChild('itemTemplate') itemTemplate!: TemplateRef<any>;

  // Content data
  longContent = [
    'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
    'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
    'Ut enim ad minim veniam, quis nostrud exercitation ullamco.',
    'Duis aute irure dolor in reprehenderit in voluptate velit esse.',
    'Excepteur sint occaecat cupidatat non proident, sunt in culpa.',
    'Qui officia deserunt mollit anim id est laborum.',
    'At vero eos et accusamus et iusto odio dignissimos ducimus.',
    'Et harum quidem rerum facilis est et expedita distinctio.',
    'Nam libero tempore, cum soluta nobis est eligendi optio.',
    'Temporibus autem quibusdam et aut officiis debitis aut rerum.',
    'Itaque earum rerum hic tenetur a sapiente delectus.',
    'Ut aut reiciendis voluptatibus maiores alias consequatur.',
    'Sed ut perspiciatis unde omnis iste natus error sit.',
    'Voluptatem accusantium doloremque laudantium, totam rem.',
    'Aperiam, eaque ipsa quae ab illo inventore veritatis.',
    'Quasi architecto beatae vitae dicta sunt explicabo.',
    'Nemo enim ipsam voluptatem quia voluptas sit aspernatur.',
    'Neque porro quisquam est, qui dolorem ipsum quia dolor.',
    'Consectetur, adipisci velit, sed quia non numquam eius.',
    'Modi tempora incidunt ut labore et dolore magnam.'
  ];
  
  shortContent = this.longContent.slice(0, 8);
  
  horizontalItems = [
    'Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 
    'Item 6', 'Item 7', 'Item 8', 'Item 9', 'Item 10'
  ];
  
  tableData = Array.from({ length: 20 }, (_, i) => ({
    id: i + 1,
    name: `Row ${i + 1}`,
    description: `Description for row ${i + 1} with some longer text`,
    value: Math.floor(Math.random() * 1000),
    status: i % 3 === 0 ? 'Active' : i % 3 === 1 ? 'Pending' : 'Inactive'
  }));
  
  // Virtual scrolling data
  largeDataset = Array.from({ length: 10000 }, (_, i) => ({
    id: i + 1,
    name: `Item ${i + 1}`,
    description: `This is a description for item number ${i + 1}. It contains some sample text to demonstrate virtual scrolling.`
  }));
  
  virtualConfig: ScrollVirtualConfig = {
    itemHeight: 60,
    bufferSize: 5,
    enabled: true
  };
  
  gridData = Array.from({ length: 50 }, (_, i) => ({
    id: i + 1,
    content: `Grid item content ${i + 1} with some descriptive text that makes it interesting.`
  }));

  // Options
  scrollbarOptions = ['auto', 'always', 'never'] as const;
  
  // State
  topCount = 0;
  bottomCount = 0;
  smoothScrollEnabled = false;
  currentScrollPosition = { top: 0, left: 0 };
  isScrolling = false;

  // Event handlers
  onScroll(position: any): void {
    // Handle scroll event if needed
  }
  
  onReachedTop(): void {
    this.topCount++;
  }
  
  onReachedBottom(): void {
    this.bottomCount++;
  }
  
  updateScrollPosition(position: any): void {
    this.currentScrollPosition = position;
  }
  
  onScrollStart(): void {
    this.isScrolling = true;
  }
  
  onScrollEnd(): void {
    this.isScrolling = false;
  }
  
  // Control methods
  scrollToTop(): void {
    this.controllableScroll?.scrollToTop();
  }
  
  scrollToBottom(): void {
    this.controllableScroll?.scrollToBottom();
  }
  
  scrollToMiddle(): void {
    this.controllableScroll?.scrollTo({ top: 1000 });
  }
  
  toggleSmoothScroll(): void {
    this.smoothScrollEnabled = !this.smoothScrollEnabled;
  }
  
  // Virtual scrolling
  trackByItem(item: any): any {
    return item.id;
  }
}4۾xqimport { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SectionComponent } from '../../../../../ui-essentials/src/lib/components/layout/section/section.component';

@Component({
  selector: 'ui-section-demo',
  standalone: true,
  imports: [CommonModule, SectionComponent],
  template: `
    <div class="demo-container">
      <h2>Section Component Demo</h2>
      
      <!-- Spacing Variants -->
      <section class="demo-section">
        <h3>Spacing Variants</h3>
        @for (spacing of spacings; track spacing) {
          <div class="demo-example">
            <h4>{{ spacing }} spacing</h4>
            <ui-section [spacing]="spacing" background="surface" [contained]=false>
              <div class="section-content">
                <h5>Section with {{ spacing }} spacing</h5>
                <p>This section demonstrates the {{ spacing }} spacing variant with consistent vertical padding.</p>
              </div>
            </ui-section>
          </div>
        }
      </section>
      
      <!-- Background Variants -->
      <section class="demo-section">
        <h3>Background Variants</h3>
        @for (background of backgrounds; track background) {
          <div class="demo-example">
            <h4>{{ background }} background</h4>
            <ui-section spacing="md" [background]="background" [contained]="true">
              <div class="section-content">
                <h5>{{ background | titlecase }} Background Section</h5>
                <p>This section demonstrates the {{ background }} background variant.</p>
              </div>
            </ui-section>
          </div>
        }
      </section>
      
      <!-- Alignment Variants -->
      <section class="demo-section">
        <h3>Text Alignment</h3>
        @for (align of alignments; track align) {
          <div class="demo-example">
            <h4>{{ align }} aligned</h4>
            <ui-section spacing="md" background="surface-secondary" [align]="align" [contained]="true">
              <div class="section-content">
                <h5>{{ align | titlecase }} Aligned Content</h5>
                <p>This section content is aligned to the {{ align }}.</p>
              </div>
            </ui-section>
          </div>
        }
      </section>
      
      <!-- Width Variants -->
      <section class="demo-section">
        <h3>Width Variants</h3>
        <div class="demo-example">
          <h4>Contained (default)</h4>
          <ui-section spacing="md" background="surface" [contained]="true">
            <div class="section-content">
              <h5>Contained Section</h5>
              <p>This section is contained with max-width and centered margins.</p>
            </div>
          </ui-section>
        </div>
        
        <div class="demo-example">
          <h4>Full Width</h4>
          <ui-section spacing="md" background="surface-elevated" [fullWidth]="true" [contained]="false">
            <div class="section-content">
              <h5>Full Width Section</h5>
              <p>This section spans the full width of its container without constraints.</p>
            </div>
          </ui-section>
        </div>
      </section>
      
      <!-- Accessibility Examples -->
      <section class="demo-section">
        <h3>Accessibility Features</h3>
        <div class="demo-example">
          <h4>With ARIA label</h4>
          <ui-section spacing="md" background="surface" ariaLabel="Main content area" [contained]="true">
            <div class="section-content">
              <h5>Accessible Section</h5>
              <p>This section includes proper ARIA labeling for screen readers.</p>
            </div>
          </ui-section>
        </div>
      </section>
      
      <!-- Real-world Examples -->
      <section class="demo-section">
        <h3>Real-world Examples</h3>
        
        <div class="demo-example">
          <h4>Hero Section</h4>
          <ui-section spacing="xl" background="surface-elevated" align="center" [contained]="true">
            <div class="section-content">
              <h2>Welcome to Our Platform</h2>
              <p>This is a hero section with extra large spacing and centered content.</p>
              <button class="demo-button">Get Started</button>
            </div>
          </ui-section>
        </div>
        
        <div class="demo-example">
          <h4>Content Section</h4>
          <ui-section spacing="lg" background="transparent" [contained]="true">
            <div class="section-content">
              <h3>About Our Services</h3>
              <p>This is a standard content section with large spacing and transparent background.</p>
              <ul>
                <li>Feature one with detailed description</li>
                <li>Feature two with comprehensive details</li>
                <li>Feature three with full specifications</li>
              </ul>
            </div>
          </ui-section>
        </div>
        
        <div class="demo-example">
          <h4>Footer Section</h4>
          <ui-section spacing="md" background="surface-secondary" [fullWidth]="true" [contained]="false">
            <div class="section-content" style="max-width: 1200px; margin: 0 auto; padding: 0 16px;">
              <h4>Contact Information</h4>
              <p>This footer section spans full width with contained inner content.</p>
            </div>
          </ui-section>
        </div>
      </section>
    </div>
  `,
  styleUrl: './section-demo.component.scss'
})
export class SectionDemoComponent {
  spacings = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
  backgrounds = ['transparent', 'surface', 'surface-secondary', 'surface-elevated'] as const;
  alignments = ['start', 'center', 'end'] as const;
}\25x@)import { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { SelectComponent, SelectOption } from '../../../../../ui-essentials/src/lib/components/forms/select/select.component';

@Component({
  selector: 'ui-select-demo',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    SelectComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Select Component Showcase</h2>
      
      <!-- Basic Select -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Select</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem; max-width: 400px;">
          <ui-select 
            label="Choose a country"
            placeholder="Select a country"
            [options]="countryOptions"
            [(ngModel)]="basicSelect1"
            (valueChange)="onSelectionChange('basic-country', $event)"
          />
          <ui-select 
            label="Choose a language"
            placeholder="Select a language"
            [options]="languageOptions"
            [(ngModel)]="basicSelect2"
            (valueChange)="onSelectionChange('basic-language', $event)"
          />
          <ui-select 
            label="Choose a framework"
            helperText="Select your preferred frontend framework"
            [options]="frameworkOptions"
            [(ngModel)]="basicSelect3"
            (valueChange)="onSelectionChange('basic-framework', $event)"
          />
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem; max-width: 400px;">
          <ui-select 
            label="Small select"
            size="small"
            placeholder="Choose an option"
            [options]="sizeOptions"
            [(ngModel)]="sizeSmall"
            (valueChange)="onSelectionChange('size-small', $event)"
          />
          <ui-select 
            label="Medium select (default)"
            size="medium"
            placeholder="Choose an option"
            [options]="sizeOptions"
            [(ngModel)]="sizeMedium"
            (valueChange)="onSelectionChange('size-medium', $event)"
          />
          <ui-select 
            label="Large select"
            size="large"
            placeholder="Choose an option"
            [options]="sizeOptions"
            [(ngModel)]="sizeLarge"
            (valueChange)="onSelectionChange('size-large', $event)"
          />
        </div>
      </section>

      <!-- Variant Styles -->
      <section style="margin-bottom: 3rem;">
        <h3>Style Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem; max-width: 400px;">
          <ui-select 
            label="Outlined variant (default)"
            variant="outlined"
            placeholder="Choose an option"
            [options]="variantOptions"
            [(ngModel)]="variantOutlined"
            (valueChange)="onSelectionChange('variant-outlined', $event)"
          />
          <ui-select 
            label="Filled variant"
            variant="filled"
            placeholder="Choose an option"
            [options]="variantOptions"
            [(ngModel)]="variantFilled"
            (valueChange)="onSelectionChange('variant-filled', $event)"
          />
        </div>
      </section>

      <!-- States and Validation -->
      <section style="margin-bottom: 3rem;">
        <h3>States and Validation</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem; max-width: 400px;">
          <ui-select 
            label="Disabled select"
            [disabled]="true"
            placeholder="This is disabled"
            [options]="stateOptions"
            [(ngModel)]="stateDisabled"
          />
          <ui-select 
            label="Required field"
            [required]="true"
            placeholder="This field is required"
            [options]="stateOptions"
            [(ngModel)]="stateRequired"
            (valueChange)="onSelectionChange('state-required', $event)"
          />
          <ui-select 
            label="Field with error"
            placeholder="Select an option"
            errorText="This field has an error"
            [options]="stateOptions"
            [(ngModel)]="stateError"
            (valueChange)="onSelectionChange('state-error', $event)"
          />
          <ui-select 
            label="Field with helper text"
            placeholder="Select an option"
            helperText="This is helpful information about this field"
            [options]="stateOptions"
            [(ngModel)]="stateHelper"
            (valueChange)="onSelectionChange('state-helper', $event)"
          />
        </div>
      </section>

      <!-- Full Width -->
      <section style="margin-bottom: 3rem;">
        <h3>Full Width</h3>
        <div style="margin-bottom: 2rem;">
          <ui-select 
            label="Full width select"
            placeholder="This select takes full width"
            [fullWidth]="true"
            [options]="fullWidthOptions"
            [(ngModel)]="fullWidthSelect"
            (valueChange)="onSelectionChange('full-width', $event)"
          />
        </div>
      </section>

      <!-- Complex Options -->
      <section style="margin-bottom: 3rem;">
        <h3>Complex Options with Disabled Items</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem; max-width: 400px;">
          <ui-select 
            label="User roles"
            placeholder="Select a role"
            helperText="Some roles may be disabled based on permissions"
            [options]="roleOptions"
            [(ngModel)]="complexSelect1"
            (valueChange)="onSelectionChange('complex-roles', $event)"
          />
          <ui-select 
            label="Priority levels"
            placeholder="Select priority"
            [options]="priorityOptions"
            [(ngModel)]="complexSelect2"
            (valueChange)="onSelectionChange('complex-priority', $event)"
          />
        </div>
      </section>

      <!-- Interactive Controls -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Controls</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button 
            style="padding: 0.5rem 1rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="setDefaultValues()"
          >
            Set Default Values
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="clearAllSelections()"
          >
            Clear All
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #6f42c1; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleDisabled()"
          >
            {{ globalDisabled() ? 'Enable All' : 'Disable All' }}
          </button>
        </div>
        
        @if (lastSelection()) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last selection:</strong> {{ lastSelection() }}
          </div>
        }
      </section>

      <!-- Code Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Code Examples</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; margin-bottom: 1rem;">
          <h4>Basic Usage:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-select 
  label="Choose a country"
  placeholder="Select a country"
  [options]="countryOptions"
  [(ngModel)]="selectedCountry"
  (valueChange)="onCountryChange($event)"&gt;
&lt;/ui-select&gt;</code></pre>

          <h4>With Helper Text:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-select 
  label="Framework"
  placeholder="Select framework"
  helperText="Choose your preferred frontend framework"
  size="large"
  variant="filled"
  [options]="frameworks"
  [(ngModel)]="selectedFramework"&gt;
&lt;/ui-select&gt;</code></pre>

          <h4>Required with Error State:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-select 
  label="Required field"
  [required]="true"
  errorText="Please select an option"
  [options]="options"
  [(ngModel)]="selectedValue"&gt;
&lt;/ui-select&gt;</code></pre>

          <h4>Options Format:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>const options: SelectOption[] = [
  {{ '{' }} value: 'option1', label: 'Option 1' {{ '}' }},
  {{ '{' }} value: 'option2', label: 'Option 2' {{ '}' }},
  {{ '{' }} value: 'option3', label: 'Option 3 (Disabled)', disabled: true {{ '}' }}
];</code></pre>
        </div>
      </section>

      <!-- Current Values -->
      <section style="margin-bottom: 3rem;">
        <h3>Current Values</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; max-height: 400px; overflow-y: auto;">
          <pre>{{ getCurrentValues() }}</pre>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(279, 14%, 35%);
      font-size: 1.2rem;
      margin-bottom: 0.5rem;
    }
    
    pre {
      margin: 0;
      font-family: 'Courier New', monospace;
      font-size: 0.9rem;
      line-height: 1.4;
    }
    
    code {
      color: hsl(279, 14%, 15%);
    }
    
    section {
      border: 1px solid #e9ecef;
      padding: 1.5rem;
      border-radius: 8px;
      background: #ffffff;
    }
    
    button:hover {
      opacity: 0.9;
      transform: translateY(-1px);
    }
  `]
})
export class SelectDemoComponent {
  // Basic selects
  basicSelect1 = signal<string>('');
  basicSelect2 = signal<string>('en');
  basicSelect3 = signal<string>('');

  // Size variants
  sizeSmall = signal<string>('');
  sizeMedium = signal<string>('medium');
  sizeLarge = signal<string>('');

  // Style variants
  variantOutlined = signal<string>('');
  variantFilled = signal<string>('filled');

  // States
  stateDisabled = signal<string>('disabled');
  stateRequired = signal<string>('');
  stateError = signal<string>('');
  stateHelper = signal<string>('');

  // Full width
  fullWidthSelect = signal<string>('');

  // Complex selects
  complexSelect1 = signal<string>('');
  complexSelect2 = signal<string>('medium');

  // Control states
  globalDisabled = signal<boolean>(false);
  lastSelection = signal<string>('');

  // Option arrays
  countryOptions: SelectOption[] = [
    { value: 'us', label: 'United States' },
    { value: 'ca', label: 'Canada' },
    { value: 'uk', label: 'United Kingdom' },
    { value: 'de', label: 'Germany' },
    { value: 'fr', label: 'France' },
    { value: 'jp', label: 'Japan' },
    { value: 'au', label: 'Australia' }
  ];

  languageOptions: SelectOption[] = [
    { value: 'en', label: 'English' },
    { value: 'es', label: 'Spanish' },
    { value: 'fr', label: 'French' },
    { value: 'de', label: 'German' },
    { value: 'it', label: 'Italian' },
    { value: 'pt', label: 'Portuguese' },
    { value: 'zh', label: 'Chinese' }
  ];

  frameworkOptions: SelectOption[] = [
    { value: 'angular', label: 'Angular' },
    { value: 'react', label: 'React' },
    { value: 'vue', label: 'Vue.js' },
    { value: 'svelte', label: 'Svelte' },
    { value: 'solid', label: 'SolidJS' }
  ];

  sizeOptions: SelectOption[] = [
    { value: 'small', label: 'Small Size' },
    { value: 'medium', label: 'Medium Size' },
    { value: 'large', label: 'Large Size' }
  ];

  variantOptions: SelectOption[] = [
    { value: 'outlined', label: 'Outlined Style' },
    { value: 'filled', label: 'Filled Style' }
  ];

  stateOptions: SelectOption[] = [
    { value: 'active', label: 'Active' },
    { value: 'inactive', label: 'Inactive' },
    { value: 'pending', label: 'Pending' }
  ];

  fullWidthOptions: SelectOption[] = [
    { value: 'option1', label: 'This is a full width select option' },
    { value: 'option2', label: 'Another full width option with longer text' },
    { value: 'option3', label: 'Third option demonstrating full width behavior' }
  ];

  roleOptions: SelectOption[] = [
    { value: 'user', label: 'User' },
    { value: 'moderator', label: 'Moderator' },
    { value: 'admin', label: 'Administrator' },
    { value: 'super-admin', label: 'Super Administrator', disabled: true },
    { value: 'guest', label: 'Guest', disabled: true }
  ];

  priorityOptions: SelectOption[] = [
    { value: 'low', label: 'Low Priority' },
    { value: 'medium', label: 'Medium Priority' },
    { value: 'high', label: 'High Priority' },
    { value: 'urgent', label: 'Urgent' },
    { value: 'critical', label: 'Critical', disabled: true }
  ];

  onSelectionChange(selectId: string, value: any): void {
    const selectedOption = this.findOptionByValue(value);
    const displayValue = selectedOption ? selectedOption.label : value;
    this.lastSelection.set(`${selectId}: ${displayValue} (${value})`);
    console.log(`Select ${selectId} changed:`, value);
  }

  private findOptionByValue(value: any): SelectOption | undefined {
    const allOptions = [
      ...this.countryOptions,
      ...this.languageOptions,
      ...this.frameworkOptions,
      ...this.sizeOptions,
      ...this.variantOptions,
      ...this.stateOptions,
      ...this.fullWidthOptions,
      ...this.roleOptions,
      ...this.priorityOptions
    ];
    return allOptions.find(option => option.value === value);
  }

  setDefaultValues(): void {
    this.basicSelect1.set('us');
    this.basicSelect2.set('en');
    this.basicSelect3.set('angular');
    this.sizeSmall.set('small');
    this.sizeMedium.set('medium');
    this.sizeLarge.set('large');
    this.variantOutlined.set('outlined');
    this.variantFilled.set('filled');
    this.stateRequired.set('active');
    this.stateError.set('pending');
    this.stateHelper.set('inactive');
    this.fullWidthSelect.set('option2');
    this.complexSelect1.set('admin');
    this.complexSelect2.set('high');
    
    this.lastSelection.set('All selects set to default values');
  }

  clearAllSelections(): void {
    this.basicSelect1.set('');
    this.basicSelect2.set('');
    this.basicSelect3.set('');
    this.sizeSmall.set('');
    this.sizeMedium.set('');
    this.sizeLarge.set('');
    this.variantOutlined.set('');
    this.variantFilled.set('');
    this.stateRequired.set('');
    this.stateError.set('');
    this.stateHelper.set('');
    this.fullWidthSelect.set('');
    this.complexSelect1.set('');
    this.complexSelect2.set('');
    
    this.lastSelection.set('All selections cleared');
  }

  toggleDisabled(): void {
    this.globalDisabled.update(disabled => !disabled);
    this.lastSelection.set(`Global disabled: ${this.globalDisabled() ? 'enabled' : 'disabled'}`);
  }

  getCurrentValues(): string {
    const values = {
      basic: {
        country: this.basicSelect1(),
        language: this.basicSelect2(),
        framework: this.basicSelect3()
      },
      sizes: {
        small: this.sizeSmall(),
        medium: this.sizeMedium(),
        large: this.sizeLarge()
      },
      variants: {
        outlined: this.variantOutlined(),
        filled: this.variantFilled()
      },
      states: {
        disabled: this.stateDisabled(),
        required: this.stateRequired(),
        error: this.stateError(),
        helper: this.stateHelper()
      },
      layout: {
        fullWidth: this.fullWidthSelect()
      },
      complex: {
        roles: this.complexSelect1(),
        priority: this.complexSelect2()
      },
      controls: {
        globalDisabled: this.globalDisabled(),
        lastSelection: this.lastSelection()
      }
    };
    
    return JSON.stringify(values, null, 2);
  }
}ak"ةux ||h vdF\~lI[))
x[.demo-container {
  padding: 2rem;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: 3rem;
  
  h3 {
    font-size: 1.5rem;
    color: #1f2937;
    margin-bottom: 1rem;
    border-bottom: 1px solid #d1d5db;
    padding-bottom: 0.5rem;
  }
}

.demo-subsection {
  margin-bottom: 1.5rem;
  
  h4 {
    font-size: 1.125rem;
    color: #4b5563;
    margin-bottom: 0.75rem;
  }
}

.demo-row {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
  margin-bottom: 1rem;
}

.demo-column {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  margin-bottom: 1rem;
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 1.5rem;
  margin-bottom: 1rem;
}

.demo-item {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 1rem;
  background: #f9fafb;
  border-radius: 0.5rem;
  border: 1px solid #e5e7eb;
  
  label {
    font-size: 0.75rem;
    font-weight: 600;
    color: #6b7280;
    text-transform: uppercase;
    letter-spacing: 0.5px;
  }
}

.demo-interactive {
  background: #f9fafb;
  border: 1px solid #e5e7eb;
  border-radius: 0.75rem;
  padding: 1.5rem;
  
  .demo-controls {
    display: flex;
    gap: 1rem;
    align-items: center;
    margin-bottom: 1rem;
    padding-bottom: 1rem;
    border-bottom: 1px solid #e5e7eb;
    
    .toggle-button {
      background: #3b82f6;
      color: white;
      border: none;
      border-radius: 0.5rem;
      padding: 0.5rem 1rem;
      font-size: 0.875rem;
      font-weight: 600;
      cursor: pointer;
      transition: all 0.2s ease;
      
      &:hover {
        background: #2563eb;
        transform: translateY(-2px);
        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
      }
      
      &:active {
        transform: translateY(0);
      }
    }
    
    label {
      display: flex;
      align-items: center;
      gap: 0.5rem;
      font-size: 0.875rem;
      color: #6b7280;
      
      select {
        background: #ffffff;
        border: 1px solid #d1d5db;
        border-radius: 0.25rem;
        padding: 0.25rem;
        font-size: 0.875rem;
        color: #1f2937;
        
        &:focus {
          outline: 2px solid #3b82f6;
          outline-offset: 2px;
        }
      }
    }
  }
  
  .demo-content {
    min-height: 400px;
    
    .real-content {
      h3 {
        font-size: 1.5rem;
        color: #1f2937;
        margin-bottom: 0.5rem;
      }
      
      .meta {
        font-size: 0.875rem;
        color: #9ca3af;
        margin-bottom: 1rem;
      }
      
      img {
        width: 100%;
        max-width: 400px;
        height: auto;
        border-radius: 0.5rem;
        margin-bottom: 1rem;
      }
      
      p {
        font-size: 1rem;
        line-height: 1.5;
        color: #1f2937;
        margin-bottom: 0.75rem;
      }
    }
  }
}

.best-practices {
  background: #f9fafb;
  border: 1px solid #e5e7eb;
  border-radius: 0.5rem;
  padding: 1.5rem;
  
  ul {
    list-style: none;
    padding: 0;
    margin: 0;
    
    li {
      font-size: 1rem;
      color: #1f2937;
      margin-bottom: 0.75rem;
      padding-left: 1rem;
      position: relative;
      
      &::before {
        content: '✓';
        position: absolute;
        left: 0;
        color: #10b981;
        font-weight: bold;
      }
      
      strong {
        color: #1f2937;
        font-weight: 600;
      }
    }
  }
}

.code-examples {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 1rem;
  
  .code-example {
    background: #f9fafb;
    border: 1px solid #e5e7eb;
    border-radius: 0.5rem;
    padding: 1rem;
    
    h4 {
      font-size: 0.875rem;
      color: #6b7280;
      margin-bottom: 0.5rem;
      text-transform: uppercase;
      letter-spacing: 0.5px;
    }
    
    pre {
      background: #ffffff;
      border-radius: 0.25rem;
      padding: 0.5rem;
      margin: 0;
      overflow-x: auto;
      
      code {
        font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
        font-size: 0.875rem;
        color: #1f2937;
        white-space: pre;
        line-height: 1.4;
      }
    }
  }
}

// Responsive adjustments
@media (max-width: 768px) {
  .demo-container {
    padding: 1rem;
  }
  
  .demo-row {
    flex-direction: column;
  }
  
  .demo-grid {
    grid-template-columns: 1fr;
  }
  
  .demo-interactive .demo-controls {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.5rem;
  }
  
  .code-examples {
    grid-template-columns: 1fr;
  }
}

// Dark mode adjustments (if needed in the future)
@media (prefers-color-scheme: dark) {
  .demo-item {
    background: #374151;
    border-color: #4b5563;
    
    label {
      color: #9ca3af;
    }
  }
  
  .demo-interactive {
    background: #374151;
    border-color: #4b5563;
    
    .demo-controls label select {
      background: #4b5563;
      border-color: #6b7280;
      color: #f3f4f6;
    }
  }
  
  .best-practices {
    background: #374151;
    border-color: #4b5563;
    
    ul li {
      color: #f3f4f6;
      
      strong {
        color: #f3f4f6;
      }
    }
  }
  
  .code-examples .code-example {
    background: #374151;
    border-color: #4b5563;
    
    h4 {
      color: #9ca3af;
    }
    
    pre {
      background: #4b5563;
      
      code {
        color: #f3f4f6;
      }
    }
  }
  
  .demo-section h3 {
    color: #f3f4f6;
    border-color: #6b7280;
  }
  
  .demo-subsection h4 {
    color: #d1d5db;
  }
}꼹x-import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { SKELETON_COMPONENTS } from '../../../../../ui-essentials/src/lib/components/feedback/skeleton-loader/skeleton-loader.component';

@Component({
  selector: 'ui-skeleton-loader-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, ...SKELETON_COMPONENTS],
  template: `
    <div class="demo-container">
      <h2>Skeleton Loader Demo</h2>
      <p>Skeleton loaders provide visual placeholders while content is loading, improving perceived performance and user experience.</p>
      
      <!-- Basic Sizes -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <label>{{ size }}</label>
              <ui-skeleton-loader [size]="size" shape="text"></ui-skeleton-loader>
            </div>
          }
        </div>
      </section>
      
      <!-- Shapes -->
      <section class="demo-section">
        <h3>Shapes</h3>
        <div class="demo-grid">
          @for (shape of shapes; track shape) {
            <div class="demo-item">
              <label>{{ shape }}</label>
              <ui-skeleton-loader [shape]="shape" size="md"></ui-skeleton-loader>
            </div>
          }
        </div>
      </section>
      
      <!-- Animations -->
      <section class="demo-section">
        <h3>Animation Types</h3>
        <div class="demo-row">
          @for (animation of animations; track animation) {
            <div class="demo-item">
              <label>{{ animation }}</label>
              <ui-skeleton-loader 
                shape="text"
                [animation]="animation"
                size="md">
              </ui-skeleton-loader>
            </div>
          }
        </div>
      </section>
      
      <!-- Width Variants -->
      <section class="demo-section">
        <h3>Width Variants</h3>
        <div class="demo-column">
          @for (width of widths; track width) {
            <div class="demo-item">
              <label>{{ width }}</label>
              <ui-skeleton-loader 
                shape="text"
                [width]="width"
                size="md">
              </ui-skeleton-loader>
            </div>
          }
        </div>
      </section>
      
      <!-- Pre-built Components -->
      <section class="demo-section">
        <h3>Pre-built Components</h3>
        
        <!-- Text Block -->
        <div class="demo-subsection">
          <h4>Text Block</h4>
          <div class="demo-grid">
            <div class="demo-item">
              <label>3 lines (default)</label>
              <ui-skeleton-text-block></ui-skeleton-text-block>
            </div>
            <div class="demo-item">
              <label>5 lines</label>
              <ui-skeleton-text-block [lines]="5"></ui-skeleton-text-block>
            </div>
            <div class="demo-item">
              <label>Custom last line width</label>
              <ui-skeleton-text-block [lines]="4" lastLineWidth="w-25"></ui-skeleton-text-block>
            </div>
          </div>
        </div>
        
        <!-- Profile -->
        <div class="demo-subsection">
          <h4>Profile</h4>
          <div class="demo-grid">
            <div class="demo-item">
              <label>Default</label>
              <ui-skeleton-profile></ui-skeleton-profile>
            </div>
            <div class="demo-item">
              <label>Small Avatar</label>
              <ui-skeleton-profile avatarSize="sm"></ui-skeleton-profile>
            </div>
            <div class="demo-item">
              <label>No Extra Info</label>
              <ui-skeleton-profile [showExtraInfo]="false"></ui-skeleton-profile>
            </div>
          </div>
        </div>
        
        <!-- Cards -->
        <div class="demo-subsection">
          <h4>Card</h4>
          <div class="demo-grid">
            <div class="demo-item">
              <label>Full Card</label>
              <ui-skeleton-card></ui-skeleton-card>
            </div>
            <div class="demo-item">
              <label>No Image</label>
              <ui-skeleton-card [showImage]="false"></ui-skeleton-card>
            </div>
            <div class="demo-item">
              <label>No Actions</label>
              <ui-skeleton-card [showActions]="false"></ui-skeleton-card>
            </div>
          </div>
        </div>
        
        <!-- Article -->
        <div class="demo-subsection">
          <h4>Article</h4>
          <div class="demo-item">
            <label>Full Article</label>
            <ui-skeleton-article></ui-skeleton-article>
          </div>
          <div class="demo-item">
            <label>Article without Image</label>
            <ui-skeleton-article [showImage]="false"></ui-skeleton-article>
          </div>
        </div>
        
        <!-- Table Rows -->
        <div class="demo-subsection">
          <h4>Table Rows</h4>
          <div class="demo-column">
            <label>Table Skeleton (3 rows)</label>
            @for (row of [1,2,3]; track row) {
              <ui-skeleton-table-row [columns]="4"></ui-skeleton-table-row>
            }
          </div>
        </div>
      </section>
      
      <!-- Custom Groups -->
      <section class="demo-section">
        <h3>Skeleton Groups</h3>
        
        <div class="demo-subsection">
          <h4>Vertical Group</h4>
          <div class="demo-item">
            <ui-skeleton-group>
              <ui-skeleton-loader shape="heading" size="lg" width="w-75"></ui-skeleton-loader>
              <ui-skeleton-loader shape="text" width="w-full"></ui-skeleton-loader>
              <ui-skeleton-loader shape="text" width="w-50"></ui-skeleton-loader>
            </ui-skeleton-group>
          </div>
        </div>
        
        <div class="demo-subsection">
          <h4>Horizontal Group</h4>
          <div class="demo-item">
            <ui-skeleton-group variant="horizontal">
              <ui-skeleton-loader shape="avatar" size="md"></ui-skeleton-loader>
              <ui-skeleton-loader shape="button" customWidth="100px"></ui-skeleton-loader>
              <ui-skeleton-loader shape="button" customWidth="80px"></ui-skeleton-loader>
            </ui-skeleton-group>
          </div>
        </div>
        
        <div class="demo-subsection">
          <h4>Grid Group</h4>
          <div class="demo-item">
            <ui-skeleton-group variant="grid">
              <ui-skeleton-loader shape="card"></ui-skeleton-loader>
              <ui-skeleton-loader shape="card"></ui-skeleton-loader>
              <ui-skeleton-loader shape="card"></ui-skeleton-loader>
              <ui-skeleton-loader shape="card"></ui-skeleton-loader>
            </ui-skeleton-group>
          </div>
        </div>
      </section>
      
      <!-- Interactive Demo -->
      <section class="demo-section">
        <h3>Interactive Loading Simulation</h3>
        <div class="demo-interactive">
          <div class="demo-controls">
            <button (click)="toggleLoading()" class="toggle-button">
              {{ isLoading ? 'Show Content' : 'Show Loading' }}
            </button>
            <label>
              Animation:
              <select [(ngModel)]="selectedAnimation" (change)="onAnimationChange()">
                @for (animation of animations; track animation) {
                  <option [value]="animation">{{ animation }}</option>
                }
              </select>
            </label>
          </div>
          
          <div class="demo-content">
            @if (isLoading) {
              <!-- Loading state with selected animation -->
              <ui-skeleton-article 
                [animation]="selectedAnimation"
                [showImage]="true">
              </ui-skeleton-article>
            } @else {
              <!-- Actual content -->
              <article class="real-content">
                <h3>Sample Article Title</h3>
                <p class="meta">Published on January 15, 2024 by John Doe</p>
                <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSIjZGRkIi8+PHRleHQgeD0iNTAlIiB5PSI1MCUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgZmlsbD0iIzk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZHk9Ii4zZW0iPjQwMCB4IDIwMDwvdGV4dD48L3N2Zz4=" alt="Sample image" />
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
                <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
                <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
              </article>
            }
          </div>
        </div>
      </section>
      
      <!-- Best Practices -->
      <section class="demo-section">
        <h3>Best Practices</h3>
        <div class="best-practices">
          <ul>
            <li><strong>Match Content Structure:</strong> Skeleton shapes should closely match the final content layout</li>
            <li><strong>Use Appropriate Animations:</strong> Shimmer for fast loading, pulse for slower operations</li>
            <li><strong>Respect Accessibility:</strong> Include proper ARIA labels and roles</li>
            <li><strong>Consider Performance:</strong> Reduce animation complexity on low-performance devices</li>
            <li><strong>Maintain Consistency:</strong> Use consistent skeleton patterns across your application</li>
          </ul>
        </div>
      </section>
      
      <!-- Code Examples -->
      <section class="demo-section">
        <h3>Code Examples</h3>
        <div class="code-examples">
          <div class="code-example">
            <h4>Basic Skeleton</h4>
            <pre><code>&lt;ui-skeleton-loader shape="text" size="md"&gt;&lt;/ui-skeleton-loader&gt;</code></pre>
          </div>
          
          <div class="code-example">
            <h4>Profile Skeleton</h4>
            <pre><code>&lt;ui-skeleton-profile avatarSize="lg"&gt;&lt;/ui-skeleton-profile&gt;</code></pre>
          </div>
          
          <div class="code-example">
            <h4>Custom Group</h4>
            <pre><code>&lt;ui-skeleton-group variant="horizontal"&gt;
  &lt;ui-skeleton-loader shape="avatar" size="sm"&gt;&lt;/ui-skeleton-loader&gt;
  &lt;ui-skeleton-loader shape="text" width="w-75"&gt;&lt;/ui-skeleton-loader&gt;
&lt;/ui-skeleton-group&gt;</code></pre>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './skeleton-loader-demo.component.scss'
})
export class SkeletonLoaderDemoComponent {
  sizes = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
  shapes = ['text', 'heading', 'avatar', 'card', 'button', 'image', 'circle', 'rounded', 'square'] as const;
  animations = ['shimmer', 'pulse', 'wave'] as const;
  widths = ['w-25', 'w-50', 'w-75', 'w-full'] as const;
  
  isLoading = true;
  selectedAnimation = 'shimmer' as any;

  toggleLoading(): void {
    this.isLoading = !this.isLoading;
  }

  onAnimationChange(): void {
    // Force re-render by toggling loading state
    if (this.isLoading) {
      this.isLoading = false;
      setTimeout(() => {
        this.isLoading = true;
      }, 50);
    }
  }
}dk'x?r·: #˹x	import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SnackbarAction, SnackbarComponent } from '../../../../../ui-essentials/src/lib/components/feedback/snackbar/snackbar.component';

@Component({
  selector: 'ui-snackbar-demo',
  standalone: true,
  imports: [CommonModule, SnackbarComponent],
  template: `
    <div class="demo-container">
      <h2>Snackbar Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row" style="gap: 16px; flex-direction: column; align-items: flex-start;">
          @for (size of sizes; track size) {
            <ui-snackbar 
              [size]="size"
              [message]="size + ' snackbar - This is a brief message'"
              [autoDismiss]="false"
              [position]="'bottom-left'"
              style="position: relative; bottom: auto; left: auto; transform: none; margin: 0;">
            </ui-snackbar>
          }
        </div>
      </section>
      
      <!-- Color Variants -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row" style="gap: 16px; flex-direction: column; align-items: flex-start;">
          @for (variant of variants; track variant) {
            <ui-snackbar 
              [variant]="variant"
              [message]="variant + ' - This is a ' + variant + ' snackbar message'"
              [showIcon]="variant !== 'default'"
              [autoDismiss]="false"
              [position]="'bottom-left'"
              style="position: relative; bottom: auto; left: auto; transform: none; margin: 0;">
            </ui-snackbar>
          }
        </div>
      </section>
      
      <!-- With Actions -->
      <section class="demo-section">
        <h3>With Actions</h3>
        <div class="demo-row" style="gap: 16px; flex-direction: column; align-items: flex-start;">
          <ui-snackbar 
            message="Your file was saved successfully"
            variant="success"
            [showIcon]="true"
            [actions]="singleAction"
            [autoDismiss]="false"
            [position]="'bottom-left'"
            style="position: relative; bottom: auto; left: auto; transform: none; margin: 0;">
          </ui-snackbar>
          
          <ui-snackbar 
            message="Connection lost. Check your network and try again."
            variant="danger"
            [showIcon]="true"
            [actions]="multipleActions"
            [autoDismiss]="false"
            [position]="'bottom-left'"
            style="position: relative; bottom: auto; left: auto; transform: none; margin: 0;">
          </ui-snackbar>
        </div>
      </section>
      
      <!-- Position Variants -->
      <section class="demo-section">
        <h3>Positions</h3>
        <div class="demo-row" style="gap: 8px;">
          @for (position of positions; track position) {
            <button 
              class="demo-button"
              (click)="showPositionDemo(position)">
              {{ position }}
            </button>
          }
        </div>
        <p>Click buttons to see snackbars in different positions</p>
      </section>
      
      <!-- Interactive Examples -->
      <section class="demo-section">
        <h3>Interactive Examples</h3>
        <div class="demo-row" style="gap: 8px;">
          <button 
            class="demo-button demo-button--primary"
            (click)="showSuccessSnackbar()">
            Show Success
          </button>
          <button 
            class="demo-button demo-button--warning"
            (click)="showWarningSnackbar()">
            Show Warning
          </button>
          <button 
            class="demo-button demo-button--danger"
            (click)="showErrorSnackbar()">
            Show Error
          </button>
          <button 
            class="demo-button"
            (click)="showActionSnackbar()">
            Show with Action
          </button>
        </div>
      </section>
      
      <!-- Dynamic Snackbars -->
      @for (snackbar of activeSnackbars; track snackbar.id) {
        <ui-snackbar
          [size]="snackbar.size"
          [variant]="snackbar.variant"
          [message]="snackbar.message"
          [showIcon]="snackbar.showIcon"
          [actions]="snackbar.actions"
          [position]="snackbar.position"
          [autoDismiss]="snackbar.autoDismiss"
          [duration]="snackbar.duration"
          (dismissed)="removeSnackbar(snackbar.id)"
          (expired)="removeSnackbar(snackbar.id)"
          (actionClicked)="handleActionClick($event, snackbar.id)">
        </ui-snackbar>
      }
      
      <!-- Status -->
      <section class="demo-section">
        <h3>Demo Status</h3>
        <p>Active snackbars: {{ activeSnackbars.length }}</p>
        <p>Total shown: {{ totalShown }}</p>
        <p>Last action: {{ lastAction || 'None' }}</p>
      </section>
    </div>
  `,
  styleUrl: './snackbar-demo.component.scss'
})
export class SnackbarDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['default', 'primary', 'success', 'warning', 'danger', 'info'] as const;
  positions = [
    'bottom-center', 'bottom-left', 'bottom-right',
    'top-center', 'top-left', 'top-right'
  ] as const;
  
  activeSnackbars: any[] = [];
  totalShown = 0;
  lastAction = '';
  
  singleAction: SnackbarAction[] = [
    { label: 'UNDO', handler: () => this.handleDemoAction('Undo clicked') }
  ];
  
  multipleActions: SnackbarAction[] = [
    { label: 'RETRY', handler: () => this.handleDemoAction('Retry clicked') },
    { label: 'SETTINGS', handler: () => this.handleDemoAction('Settings clicked') }
  ];
  
  showPositionDemo(position: string): void {
    this.addSnackbar({
      message: `Snackbar at ${position}`,
      variant: 'primary',
      position: position as any,
      showIcon: true,
      autoDismiss: true,
      duration: 3000
    });
  }
  
  showSuccessSnackbar(): void {
    this.addSnackbar({
      message: 'Operation completed successfully!',
      variant: 'success',
      showIcon: true,
      actions: this.singleAction
    });
  }
  
  showWarningSnackbar(): void {
    this.addSnackbar({
      message: 'Warning: This action cannot be undone',
      variant: 'warning',
      showIcon: true,
      autoDismiss: false
    });
  }
  
  showErrorSnackbar(): void {
    this.addSnackbar({
      message: 'Error: Failed to save changes',
      variant: 'danger',
      showIcon: true,
      actions: this.multipleActions,
      autoDismiss: false
    });
  }
  
  showActionSnackbar(): void {
    this.addSnackbar({
      message: 'File moved to trash',
      variant: 'default',
      actions: [
        { 
          label: 'UNDO', 
          handler: () => {
            this.handleDemoAction('File restored');
            this.removeSnackbar(this.activeSnackbars[this.activeSnackbars.length - 1]?.id);
          }
        }
      ],
      duration: 6000
    });
  }
  
  private addSnackbar(config: any): void {
    const snackbar = {
      id: Date.now() + Math.random(),
      size: 'md',
      position: 'bottom-center',
      autoDismiss: true,
      duration: 4000,
      showIcon: false,
      actions: [],
      ...config
    };
    
    this.activeSnackbars.push(snackbar);
    this.totalShown++;
  }
  
  removeSnackbar(id: number): void {
    this.activeSnackbars = this.activeSnackbars.filter(s => s.id !== id);
  }
  
  handleActionClick(action: SnackbarAction, snackbarId: number): void {
    this.lastAction = `${action.label} clicked on snackbar ${snackbarId}`;
  }
  
  private handleDemoAction(action: string): void {
    this.lastAction = action;
  }
}޸xc@use '../../../../../ui-design-system/src/styles/semantic' as tokens;

.demo-container {
  padding: tokens.$semantic-spacing-layout-md;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: tokens.$semantic-spacing-layout-lg;
  
  h3 {
    margin-bottom: tokens.$semantic-spacing-component-md;
    color: tokens.$semantic-color-text-primary;
    font-size: 1.25rem;
    font-weight: 600;
  }
  
  h4 {
    margin-bottom: tokens.$semantic-spacing-component-sm;
    color: tokens.$semantic-color-text-secondary;
    font-size: 1.125rem;
    font-weight: 500;
  }
  
  p {
    color: tokens.$semantic-color-text-secondary;
    margin-bottom: tokens.$semantic-spacing-component-md;
  }
}

.demo-row {
  display: flex;
  flex-wrap: wrap;
  gap: tokens.$semantic-spacing-layout-md;
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: tokens.$semantic-spacing-layout-md;
}

.demo-spacer-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  min-width: 200px;
  margin-bottom: tokens.$semantic-spacing-component-lg;
}

.demo-direction-container {
  padding: tokens.$semantic-spacing-component-md;
  border: 1px solid tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-md;
}

.demo-horizontal-container {
  display: flex;
  align-items: center;
  border: 2px dashed tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-sm;
  padding: tokens.$semantic-spacing-component-sm;
  min-height: 60px;
}

.demo-vertical-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  border: 2px dashed tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-sm;
  padding: tokens.$semantic-spacing-component-sm;
  min-height: 160px;
}

.demo-flex-container {
  margin-bottom: tokens.$semantic-spacing-component-lg;
}

.demo-flex-row {
  display: flex;
  align-items: center;
  border: 2px dashed tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-sm;
  padding: tokens.$semantic-spacing-component-sm;
  min-height: 60px;
  width: 100%;
}

.demo-flex-column {
  display: flex;
  flex-direction: column;
  align-items: center;
  border: 2px dashed tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-sm;
  padding: tokens.$semantic-spacing-component-sm;
  height: 200px;
  width: 100%;
}

.demo-box {
  background: tokens.$semantic-color-container-primary;
  color: tokens.$semantic-color-on-container-primary;
  padding: tokens.$semantic-spacing-component-sm;
  border-radius: tokens.$semantic-border-radius-sm;
  font-weight: 500;
  min-width: 60px;
  text-align: center;
}

.demo-label {
  font-size: 0.875rem;
  color: tokens.$semantic-color-text-secondary;
  margin-bottom: tokens.$semantic-spacing-component-xs;
  text-align: center;
  font-weight: 500;
}

.demo-card {
  background: tokens.$semantic-color-surface-primary;
  border: 1px solid tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-md;
  padding: tokens.$semantic-spacing-component-lg;
  max-width: 400px;
  
  .demo-card-header {
    font-weight: 600;
    color: tokens.$semantic-color-text-primary;
    font-size: 1.125rem;
  }
  
  .demo-card-content {
    color: tokens.$semantic-color-text-secondary;
    line-height: 1.5;
  }
  
  .demo-card-actions {
    display: flex;
    align-items: center;
  }
}

.demo-button {
  background: tokens.$semantic-color-surface-secondary;
  color: tokens.$semantic-color-text-primary;
  border: 1px solid tokens.$semantic-color-border-subtle;
  border-radius: tokens.$semantic-border-radius-sm;
  padding: tokens.$semantic-spacing-component-sm tokens.$semantic-spacing-component-md;
  font-size: 0.875rem;
  cursor: pointer;
  
  &--primary {
    background: tokens.$semantic-color-container-primary;
    color: tokens.$semantic-color-on-container-primary;
    border-color: tokens.$semantic-color-container-primary;
  }
  
  &:hover {
    opacity: 0.9;
  }
}

@media (max-width: 768px) {
  .demo-row {
    flex-direction: column;
  }
  
  .demo-grid {
    grid-template-columns: 1fr;
  }
  
  .demo-spacer-container {
    min-width: auto;
  }
}z	 *x8Uq(gqFbQjniFr JUx_import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SpacerComponent } from '../../../../../ui-essentials/src/lib/components/layout/spacer/spacer.component';

@Component({
  selector: 'ui-spacer-demo',
  standalone: true,
  imports: [CommonModule, SpacerComponent],
  template: `
    <div class="demo-container">
      <h2>Spacer Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <p>Spacers with debug mode enabled to show spacing</p>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-spacer-container">
              <div class="demo-label">{{ size }}</div>
              <div class="demo-box">A</div>
              <ui-spacer [size]="size" [debug]="true"></ui-spacer>
              <div class="demo-box">B</div>
            </div>
          }
        </div>
      </section>
      
      <!-- Directional Variants -->
      <section class="demo-section">
        <h3>Directional Spacing</h3>
        
        <div class="demo-grid">
          <div class="demo-direction-container">
            <h4>Horizontal Spacing</h4>
            <div class="demo-horizontal-container">
              <div class="demo-box">Left</div>
              <ui-spacer size="lg" direction="horizontal" [debug]="true"></ui-spacer>
              <div class="demo-box">Right</div>
            </div>
          </div>
          
          <div class="demo-direction-container">
            <h4>Vertical Spacing</h4>
            <div class="demo-vertical-container">
              <div class="demo-box">Top</div>
              <ui-spacer size="lg" direction="vertical" [debug]="true"></ui-spacer>
              <div class="demo-box">Bottom</div>
            </div>
          </div>
        </div>
      </section>
      
      <!-- Component Variants -->
      <section class="demo-section">
        <h3>Component Spacing Variants</h3>
        <p>Semantic spacing tokens for different component contexts</p>
        <div class="demo-row">
          @for (variant of componentVariants; track variant) {
            <div class="demo-spacer-container">
              <div class="demo-label">{{ variant }}</div>
              <div class="demo-box">A</div>
              <ui-spacer [variant]="variant" [debug]="true"></ui-spacer>
              <div class="demo-box">B</div>
            </div>
          }
        </div>
      </section>
      
      <!-- Layout Variants -->
      <section class="demo-section">
        <h3>Layout Spacing Variants</h3>
        <p>Semantic spacing tokens for layout elements</p>
        <div class="demo-row">
          @for (variant of layoutVariants; track variant) {
            <div class="demo-spacer-container">
              <div class="demo-label">{{ variant }}</div>
              <div class="demo-box">Section A</div>
              <ui-spacer [variant]="variant" [debug]="true"></ui-spacer>
              <div class="demo-box">Section B</div>
            </div>
          }
        </div>
      </section>
      
      <!-- Flexible Spacer -->
      <section class="demo-section">
        <h3>Flexible Spacer</h3>
        <p>Spacer that grows to fill available space</p>
        
        <div class="demo-flex-container">
          <h4>Horizontal Flexible</h4>
          <div class="demo-flex-row">
            <div class="demo-box">Left</div>
            <ui-spacer direction="horizontal" [flexible]="true" [debug]="true"></ui-spacer>
            <div class="demo-box">Right</div>
          </div>
        </div>
        
        <div class="demo-flex-container">
          <h4>Vertical Flexible</h4>
          <div class="demo-flex-column">
            <div class="demo-box">Top</div>
            <ui-spacer direction="vertical" [flexible]="true" [debug]="true"></ui-spacer>
            <div class="demo-box">Bottom</div>
          </div>
        </div>
      </section>
      
      <!-- Custom Spacing -->
      <section class="demo-section">
        <h3>Custom Spacing</h3>
        <div class="demo-row">
          <div class="demo-spacer-container">
            <div class="demo-label">Custom Width: 100px</div>
            <div class="demo-horizontal-container">
              <div class="demo-box">A</div>
              <ui-spacer customWidth="100px" direction="horizontal" [debug]="true"></ui-spacer>
              <div class="demo-box">B</div>
            </div>
          </div>
          
          <div class="demo-spacer-container">
            <div class="demo-label">Custom Height: 80px</div>
            <div class="demo-vertical-container">
              <div class="demo-box">Top</div>
              <ui-spacer customHeight="80px" direction="vertical" [debug]="true"></ui-spacer>
              <div class="demo-box">Bottom</div>
            </div>
          </div>
        </div>
      </section>
      
      <!-- Real World Examples -->
      <section class="demo-section">
        <h3>Real World Usage</h3>
        
        <div class="demo-card">
          <h4>Card Layout with Spacers</h4>
          <div class="demo-card-header">Header Content</div>
          <ui-spacer variant="component-md"></ui-spacer>
          <div class="demo-card-content">Main content goes here with proper spacing</div>
          <ui-spacer variant="component-sm"></ui-spacer>
          <div class="demo-card-actions">
            <button class="demo-button">Cancel</button>
            <ui-spacer direction="horizontal" [flexible]="true"></ui-spacer>
            <button class="demo-button demo-button--primary">Save</button>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './spacer-demo.component.scss'
})
export class SpacerDemoComponent {
  sizes: ('xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl')[] = ['xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl'];
  componentVariants: ('component-xs' | 'component-sm' | 'component-md' | 'component-lg' | 'component-xl')[] = [
    'component-xs', 'component-sm', 'component-md', 'component-lg', 'component-xl'
  ];
  layoutVariants: ('layout-xs' | 'layout-sm' | 'layout-md' | 'layout-lg' | 'layout-xl')[] = [
    'layout-xs', 'layout-sm', 'layout-md', 'layout-lg', 'layout-xl'
  ];
}%jmxop`¦ 5pxY_o6bZ7;
%)P%k a$&JKH9iݑLɲ86V0uGOgi#9MaDexh2͂(͘7pu&8g]=KƗtfzpsW|WAO^dUmtʂQƘ/Sc_>D_WJIiK̒bܿLJT@fQ idpa`
1}tޕ<vLHـx 21!(TЀ,gH3v=h
-3A@!1HP).䃋	˺'X&oO41Z''#_i)XO|`aw-K+WµNBCk!ur qtDWI4?zaIek	ӭMmNH`GE:,S8<^؝@p4G^W 눟]+6x*<$P{\2*p`ٔ6!ȥ!ؖiQ$V1
@ra)b 	JBJj7Sq5!q.K̓ƣ¸<Tr(
6eC%nk]*Zw6ŹmB]lnǓM "{q,ϩiZbWo82!~<\~Tmۤh11Nb݆PNZZg5n
<POer!XMnBԯnW@rz46s7QGi`
+Ƶ+;BBd)^
;!)!qcu#evO.bpPŶ*"U-ɱTYO>Q{ L0DB:yz"ޗ4al+lyH:P^r<pLV@J_FRzEc:i
_(VHH=9Bx3Y#x7J75nd̦AQ51s\ߐ9$g\T`V ct;ځ%F+,FwIi.$|N+aZX9Z=<hQ=<M/i7Q}̿;c;"g@Jga3*GUΣ΢a"F(:2 C7\{ː_}p֜#pٷ[U?Gr$û!bAa:/\wE>Җ^\L{˧!4sGH[eH2өQ3=]x]@bjZb)9R.VĘʝ-WsD'|-T[g'n= gXY(>$JPKø TҺ{
]aX"΢	yXy}E"RՀ4jW!F%ECgFMG57 T,ׯKr4 fTHNۙo j,U*: /o@gH87Ƒ,TV}#Ǐߚ)MZnl.\sQ$xY/import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SplitViewComponent, PanelConfig, ResizeEvent } from 'ui-essentials';

@Component({
  selector: 'ui-split-view-demo',
  standalone: true,
  imports: [CommonModule, SplitViewComponent],
  template: `
    <div class="demo-container">
      <h2>Split View / Resizable Panels Demo</h2>
      
      <!-- Basic Horizontal Split -->
      <section class="demo-section">
        <h3>Basic Horizontal Split</h3>
        <div class="demo-split-container">
          <ui-split-view 
            [panels]="basicHorizontalPanels" 
            direction="horizontal" 
            size="md"
            (panelResized)="onPanelResized($event)">
            <div slot="left-panel" class="demo-panel-content demo-panel-content--primary">
              <h4>Left Panel</h4>
              <p>This is the left panel content. Drag the divider to resize!</p>
              <p>You can add any content here including forms, lists, or other components.</p>
            </div>
            <div slot="right-panel" class="demo-panel-content demo-panel-content--secondary">
              <h4>Right Panel</h4>
              <p>This is the right panel content.</p>
              <p>Panels maintain their content during resize operations.</p>
            </div>
          </ui-split-view>
        </div>
        <div class="demo-info">
          <p><strong>Usage:</strong> Drag the vertical divider to resize panels horizontally.</p>
        </div>
      </section>

      <!-- Basic Vertical Split -->
      <section class="demo-section">
        <h3>Basic Vertical Split</h3>
        <div class="demo-split-container">
          <ui-split-view 
            [panels]="basicVerticalPanels" 
            direction="vertical" 
            size="md"
            (panelResized)="onPanelResized($event)">
            <div slot="top-panel" class="demo-panel-content demo-panel-content--elevated">
              <h4>Top Panel</h4>
              <p>This is the top panel in a vertical split layout.</p>
            </div>
            <div slot="bottom-panel" class="demo-panel-content demo-panel-content--primary">
              <h4>Bottom Panel</h4>
              <p>This is the bottom panel. The divider can be dragged vertically.</p>
            </div>
          </ui-split-view>
        </div>
        <div class="demo-info">
          <p><strong>Usage:</strong> Drag the horizontal divider to resize panels vertically.</p>
        </div>
      </section>

      <!-- Three Panel Layout -->
      <section class="demo-section">
        <h3>Three Panel Layout</h3>
        <div class="demo-split-container">
          <ui-split-view 
            [panels]="threePanelLayout" 
            direction="horizontal" 
            size="lg"
            (panelResized)="onPanelResized($event)">
            <div slot="sidebar" class="demo-panel-content demo-panel-content--secondary">
              <h4>Sidebar</h4>
              <p>Navigation or menu content</p>
            </div>
            <div slot="main-content" class="demo-panel-content demo-panel-content--primary">
              <h4>Main Content</h4>
              <p>Primary content area with the most space.</p>
              <p>This panel takes up the majority of the available space.</p>
            </div>
            <div slot="details-panel" class="demo-panel-content demo-panel-content--elevated">
              <h4>Details Panel</h4>
              <p>Additional information or tools</p>
            </div>
          </ui-split-view>
        </div>
        <div class="demo-controls">
          <button (click)="collapsePanel('sidebar')">Collapse Sidebar</button>
          <button (click)="expandPanel('sidebar')" class="button--secondary">Expand Sidebar</button>
          <button (click)="collapsePanel('details-panel')" class="button--success">Collapse Details</button>
          <button (click)="expandPanel('details-panel')" class="button--success">Expand Details</button>
          <button (click)="resetThreePanelSizes()" class="button--danger">Reset Sizes</button>
        </div>
        <div class="demo-info">
          <p><strong>Features:</strong> Multiple panels with programmatic collapse/expand controls.</p>
        </div>
      </section>

      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        
        <h4>Small Size</h4>
        <div class="demo-split-container" style="height: 200px;">
          <ui-split-view 
            [panels]="sizeVariantPanels" 
            direction="horizontal" 
            size="sm">
            <div slot="size-left" class="demo-panel-content demo-panel-content--primary">
              <h4>Small Split View</h4>
              <p>Compact layout with reduced spacing.</p>
            </div>
            <div slot="size-right" class="demo-panel-content demo-panel-content--secondary">
              <h4>Right Panel</h4>
              <p>Smaller padding and gaps.</p>
            </div>
          </ui-split-view>
        </div>

        <h4>Large Size</h4>
        <div class="demo-split-container" style="height: 500px;">
          <ui-split-view 
            [panels]="sizeVariantPanels2" 
            direction="horizontal" 
            size="lg">
            <div slot="size-left-lg" class="demo-panel-content demo-panel-content--primary">
              <h4>Large Split View</h4>
              <p>Spacious layout with generous spacing and padding.</p>
              <p>Perfect for complex layouts requiring more visual breathing room.</p>
            </div>
            <div slot="size-right-lg" class="demo-panel-content demo-panel-content--elevated">
              <h4>Right Panel</h4>
              <p>Enhanced spacing creates a more luxurious feel.</p>
            </div>
          </ui-split-view>
        </div>
        <div class="demo-info">
          <p><strong>Sizes:</strong> sm (compact), md (default), lg (spacious) - affects padding and spacing.</p>
        </div>
      </section>

      <!-- Panel Constraints -->
      <section class="demo-section">
        <h3>Panel Size Constraints</h3>
        <div class="demo-split-container">
          <ui-split-view 
            [panels]="constrainedPanels" 
            direction="horizontal" 
            size="md"
            (panelResized)="onPanelResized($event)">
            <div slot="constrained-left" class="demo-panel-content demo-panel-content--primary">
              <h4>Constrained Panel</h4>
              <p>Min: 150px, Max: 400px</p>
              <p>Try resizing - this panel has size constraints!</p>
            </div>
            <div slot="constrained-right" class="demo-panel-content demo-panel-content--secondary">
              <h4>Flexible Panel</h4>
              <p>No constraints - adapts to available space.</p>
            </div>
          </ui-split-view>
        </div>
        <div class="demo-info">
          <p><strong>Constraints:</strong> Left panel has min-width of 150px and max-width of 400px.</p>
        </div>
      </section>

      <!-- Disabled State -->
      <section class="demo-section">
        <h3>Disabled State</h3>
        <div class="demo-split-container">
          <ui-split-view 
            [panels]="basicHorizontalPanels" 
            direction="horizontal" 
            size="md"
            [disabled]="true">
            <div slot="left-panel" class="demo-panel-content demo-panel-content--primary">
              <h4>Disabled Split View</h4>
              <p>Resizing is disabled - dividers cannot be dragged.</p>
            </div>
            <div slot="right-panel" class="demo-panel-content demo-panel-content--secondary">
              <h4>Static Panel</h4>
              <p>All interaction is disabled when the component is in disabled state.</p>
            </div>
          </ui-split-view>
        </div>
        <div class="demo-info">
          <p><strong>Disabled:</strong> All resize functionality is disabled.</p>
        </div>
      </section>

      <!-- Nested Split Views -->
      <section class="demo-section">
        <h3>Nested Split Views</h3>
        <div class="demo-split-container" style="height: 500px;">
          <ui-split-view 
            [panels]="outerNestedPanels" 
            direction="horizontal" 
            size="md">
            <div slot="outer-left" class="demo-panel-content demo-panel-content--secondary">
              <h4>Left Panel</h4>
              <p>This is the outer left panel.</p>
            </div>
            <div slot="outer-right" style="padding: 0;">
              <ui-split-view 
                [panels]="innerNestedPanels" 
                direction="vertical" 
                size="md">
                <div slot="inner-top" class="demo-panel-content demo-panel-content--primary">
                  <h4>Nested Top</h4>
                  <p>This is a nested split view inside the right panel.</p>
                </div>
                <div slot="inner-bottom" class="demo-panel-content demo-panel-content--elevated">
                  <h4>Nested Bottom</h4>
                  <p>Fully functional nested resizable panels.</p>
                </div>
              </ui-split-view>
            </div>
          </ui-split-view>
        </div>
        <div class="demo-info">
          <p><strong>Nesting:</strong> Split views can be nested to create complex layouts.</p>
        </div>
      </section>

      <!-- Event Information -->
      <section class="demo-section">
        <h3>Resize Events</h3>
        <div class="demo-info">
          <p><strong>Last Resize Event:</strong> {{ lastResizeEvent || 'None' }}</p>
          <p><strong>Resize Count:</strong> {{ resizeCount }}</p>
        </div>
      </section>
    </div>
  `,
  styleUrl: './split-view-demo.component.scss'
})
export class SplitViewDemoComponent {
  resizeCount = 0;
  lastResizeEvent = '';

  // Basic horizontal panels
  basicHorizontalPanels: PanelConfig[] = [
    { id: 'left-panel', size: '40%' },
    { id: 'right-panel', size: '60%' }
  ];

  // Basic vertical panels
  basicVerticalPanels: PanelConfig[] = [
    { id: 'top-panel', size: '30%' },
    { id: 'bottom-panel', size: '70%' }
  ];

  // Three panel layout
  threePanelLayout: PanelConfig[] = [
    { id: 'sidebar', size: '250px', minSize: 200, maxSize: 400, variant: 'secondary' },
    { id: 'main-content', size: '1fr', variant: 'primary' },
    { id: 'details-panel', size: '300px', minSize: 250, maxSize: 500, variant: 'elevated' }
  ];

  // Size variant panels
  sizeVariantPanels: PanelConfig[] = [
    { id: 'size-left', size: '50%' },
    { id: 'size-right', size: '50%' }
  ];

  sizeVariantPanels2: PanelConfig[] = [
    { id: 'size-left-lg', size: '40%' },
    { id: 'size-right-lg', size: '60%' }
  ];

  // Constrained panels
  constrainedPanels: PanelConfig[] = [
    { id: 'constrained-left', size: '300px', minSize: 150, maxSize: 400 },
    { id: 'constrained-right', size: '1fr' }
  ];

  // Nested panels
  outerNestedPanels: PanelConfig[] = [
    { id: 'outer-left', size: '30%' },
    { id: 'outer-right', size: '70%' }
  ];

  innerNestedPanels: PanelConfig[] = [
    { id: 'inner-top', size: '40%' },
    { id: 'inner-bottom', size: '60%' }
  ];

  onPanelResized(event: ResizeEvent): void {
    this.resizeCount++;
    this.lastResizeEvent = `Panel ${event.panelId} resized to ${Math.round(event.newSize)}px (${event.direction})`;
    console.log('Panel resized:', event);
  }

  collapsePanel(panelId: string): void {
    const panel = this.threePanelLayout.find(p => p.id === panelId);
    if (panel) {
      panel.collapsed = true;
    }
  }

  expandPanel(panelId: string): void {
    const panel = this.threePanelLayout.find(p => p.id === panelId);
    if (panel) {
      panel.collapsed = false;
    }
  }

  resetThreePanelSizes(): void {
    this.threePanelLayout = [
      { id: 'sidebar', size: '250px', minSize: 200, maxSize: 400, variant: 'secondary' },
      { id: 'main-content', size: '1fr', variant: 'primary' },
      { id: 'details-panel', size: '300px', minSize: 250, maxSize: 500, variant: 'elevated' }
    ];
  }
}̿x?1import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faPlay, faUndo } from '@fortawesome/free-solid-svg-icons';
import { StepperComponent, StepperStep } from '../../../../../ui-essentials/src/lib/components/navigation/stepper';

@Component({
  selector: 'ui-stepper-demo',
  standalone: true,
  imports: [CommonModule, StepperComponent, FontAwesomeModule],
  template: `
    <div class="demo-container">
      <h2>Stepper Demo</h2>
      
      <!-- Orientation Variants -->
      <section class="demo-section">
        <h3>Orientation</h3>
        <div class="demo-subsection">
          <h4>Horizontal Stepper</h4>
          <ui-stepper 
            [steps]="horizontalSteps"
            orientation="horizontal"
            [clickable]="true"
            (stepClick)="onStepClick('horizontal', $event)"
            (stepChange)="onStepChange('horizontal', $event)">
          </ui-stepper>
        </div>
        
        <div class="demo-subsection">
          <h4>Vertical Stepper</h4>
          <div class="vertical-stepper-container">
            <ui-stepper 
              [steps]="verticalSteps"
              orientation="vertical"
              [clickable]="true"
              (stepClick)="onStepClick('vertical', $event)"
              (stepChange)="onStepChange('vertical', $event)">
            </ui-stepper>
          </div>
        </div>
      </section>

      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <h4>{{ size }} Size</h4>
              <ui-stepper 
                [steps]="sizeSteps"
                [size]="size"
                orientation="horizontal">
              </ui-stepper>
            </div>
          }
        </div>
      </section>

      <!-- Style Variants -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Default</h4>
            <ui-stepper 
              [steps]="variantSteps"
              variant="default">
            </ui-stepper>
          </div>
          <div class="demo-item">
            <h4>Outlined</h4>
            <ui-stepper 
              [steps]="variantSteps"
              variant="outlined">
            </ui-stepper>
          </div>
        </div>
      </section>

      <!-- Dense Variant -->
      <section class="demo-section">
        <h3>Dense Layout</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Normal</h4>
            <ui-stepper 
              [steps]="denseSteps"
              [dense]="false">
            </ui-stepper>
          </div>
          <div class="demo-item">
            <h4>Dense</h4>
            <ui-stepper 
              [steps]="denseSteps"
              [dense]="true">
            </ui-stepper>
          </div>
        </div>
      </section>

      <!-- Step States -->
      <section class="demo-section">
        <h3>Step States</h3>
        <div class="demo-subsection">
          <h4>All States</h4>
          <ui-stepper 
            [steps]="stateSteps"
            orientation="horizontal">
          </ui-stepper>
        </div>
      </section>

      <!-- Linear vs Non-Linear -->
      <section class="demo-section">
        <h3>Navigation Modes</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Linear (Default)</h4>
            <ui-stepper 
              [steps]="linearSteps"
              [clickable]="true"
              [linear]="true"
              (stepClick)="onStepClick('linear', $event)">
            </ui-stepper>
            <div class="demo-controls">
              <button (click)="nextLinearStep()" class="demo-button">
                <fa-icon [icon]="playIcon"></fa-icon>
                Next Step
              </button>
              <button (click)="resetLinearStepper()" class="demo-button">
                <fa-icon [icon]="resetIcon"></fa-icon>
                Reset
              </button>
            </div>
          </div>
          
          <div class="demo-item">
            <h4>Non-Linear</h4>
            <ui-stepper 
              [steps]="nonLinearSteps"
              [clickable]="true"
              [linear]="false"
              (stepClick)="onStepClick('non-linear', $event)">
            </ui-stepper>
          </div>
        </div>
      </section>

      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <div class="interactive-example">
          <ui-stepper 
            #interactiveStepper
            [steps]="interactiveSteps"
            [clickable]="true"
            [linear]="false"
            orientation="horizontal"
            (stepClick)="onInteractiveStepClick($event)"
            (stepChange)="onInteractiveStepChange($event)">
          </ui-stepper>
          
          <div class="demo-controls">
            <button (click)="markCurrentCompleted()" class="demo-button">
              Mark Current Completed
            </button>
            <button (click)="markCurrentError()" class="demo-button">
              Mark Current Error
            </button>
            <button (click)="nextInteractiveStep()" class="demo-button">
              <fa-icon [icon]="playIcon"></fa-icon>
              Next
            </button>
            <button (click)="resetInteractiveStepper()" class="demo-button">
              <fa-icon [icon]="resetIcon"></fa-icon>
              Reset
            </button>
          </div>
          
          <div class="step-info">
            <p><strong>Current Step:</strong> {{ getCurrentStepInfo() }}</p>
            <p><strong>Completed Steps:</strong> {{ getCompletedStepsCount() }}</p>
            <p><strong>Last Action:</strong> {{ lastAction }}</p>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './stepper-demo.component.scss'
})
export class StepperDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  playIcon = faPlay;
  resetIcon = faUndo;
  
  lastAction = 'None';

  // Horizontal stepper data
  horizontalSteps: StepperStep[] = [
    { id: 'h1', title: 'Account Info', description: 'Enter your personal details', current: true },
    { id: 'h2', title: 'Verification', description: 'Verify your email address' },
    { id: 'h3', title: 'Preferences', description: 'Set up your preferences' },
    { id: 'h4', title: 'Complete', description: 'Account setup finished' }
  ];

  // Vertical stepper data
  verticalSteps: StepperStep[] = [
    { id: 'v1', title: 'Project Setup', description: 'Initialize your new project', completed: true },
    { id: 'v2', title: 'Configuration', description: 'Configure project settings', current: true },
    { id: 'v3', title: 'Dependencies', description: 'Install required dependencies' },
    { id: 'v4', title: 'Testing', description: 'Run initial tests' },
    { id: 'v5', title: 'Deployment', description: 'Deploy to production' }
  ];

  // Size demonstration
  sizeSteps: StepperStep[] = [
    { id: 's1', title: 'Step 1', completed: true },
    { id: 's2', title: 'Step 2', current: true },
    { id: 's3', title: 'Step 3' }
  ];

  // Variant demonstration
  variantSteps: StepperStep[] = [
    { id: 'var1', title: 'Design', completed: true },
    { id: 'var2', title: 'Development', current: true },
    { id: 'var3', title: 'Testing' },
    { id: 'var4', title: 'Launch' }
  ];

  // Dense demonstration
  denseSteps: StepperStep[] = [
    { id: 'd1', title: 'Upload', completed: true },
    { id: 'd2', title: 'Process', current: true },
    { id: 'd3', title: 'Review' },
    { id: 'd4', title: 'Publish' }
  ];

  // State demonstration
  stateSteps: StepperStep[] = [
    { id: 'st1', title: 'Completed', description: 'This step is done', completed: true },
    { id: 'st2', title: 'Current', description: 'Currently active step', current: true },
    { id: 'st3', title: 'Error', description: 'This step has an error', error: true },
    { id: 'st4', title: 'Disabled', description: 'This step is disabled', disabled: true },
    { id: 'st5', title: 'Pending', description: 'This step is pending' }
  ];

  // Linear stepper
  linearSteps: StepperStep[] = [
    { id: 'l1', title: 'Start', description: 'Begin the process', current: true },
    { id: 'l2', title: 'Middle', description: 'Continue the process' },
    { id: 'l3', title: 'End', description: 'Finish the process' }
  ];

  // Non-linear stepper
  nonLinearSteps: StepperStep[] = [
    { id: 'nl1', title: 'Overview', description: 'Click any step', completed: true },
    { id: 'nl2', title: 'Details', description: 'Add more information', current: true },
    { id: 'nl3', title: 'Review', description: 'Check your work' }
  ];

  // Interactive example
  interactiveSteps: StepperStep[] = [
    { id: 'i1', title: 'Planning', description: 'Plan your approach', current: true },
    { id: 'i2', title: 'Implementation', description: 'Build the solution' },
    { id: 'i3', title: 'Testing', description: 'Test thoroughly' },
    { id: 'i4', title: 'Deployment', description: 'Go live' }
  ];

  onStepClick(type: string, event: {step: StepperStep, index: number}): void {
    this.lastAction = `${type}: Clicked step "${event.step.title}" (index ${event.index})`;
    console.log(`${type} stepper - Step clicked:`, event);
  }

  onStepChange(type: string, event: {step: StepperStep, index: number}): void {
    this.lastAction = `${type}: Changed to step "${event.step.title}" (index ${event.index})`;
    console.log(`${type} stepper - Step changed:`, event);
  }

  nextLinearStep(): void {
    const currentIndex = this.linearSteps.findIndex(step => step.current);
    if (currentIndex >= 0 && currentIndex < this.linearSteps.length - 1) {
      // Mark current as completed
      this.linearSteps[currentIndex].completed = true;
      this.linearSteps[currentIndex].current = false;
      
      // Move to next
      this.linearSteps[currentIndex + 1].current = true;
      
      this.lastAction = `Linear: Advanced to step ${currentIndex + 2}`;
    }
  }

  resetLinearStepper(): void {
    this.linearSteps.forEach((step, index) => {
      step.current = index === 0;
      step.completed = false;
      step.error = false;
    });
    this.lastAction = 'Linear: Reset to beginning';
  }

  onInteractiveStepClick(event: {step: StepperStep, index: number}): void {
    this.lastAction = `Interactive: Clicked "${event.step.title}"`;
  }

  onInteractiveStepChange(event: {step: StepperStep, index: number}): void {
    this.lastAction = `Interactive: Changed to "${event.step.title}"`;
  }

  markCurrentCompleted(): void {
    const currentStep = this.interactiveSteps.find(step => step.current);
    if (currentStep) {
      currentStep.completed = true;
      currentStep.error = false;
      this.lastAction = `Interactive: Marked "${currentStep.title}" as completed`;
    }
  }

  markCurrentError(): void {
    const currentStep = this.interactiveSteps.find(step => step.current);
    if (currentStep) {
      currentStep.error = true;
      currentStep.completed = false;
      this.lastAction = `Interactive: Marked "${currentStep.title}" as error`;
    }
  }

  nextInteractiveStep(): void {
    const currentIndex = this.interactiveSteps.findIndex(step => step.current);
    if (currentIndex >= 0 && currentIndex < this.interactiveSteps.length - 1) {
      // Mark current as completed if not in error
      if (!this.interactiveSteps[currentIndex].error) {
        this.interactiveSteps[currentIndex].completed = true;
      }
      this.interactiveSteps[currentIndex].current = false;
      
      // Move to next
      this.interactiveSteps[currentIndex + 1].current = true;
      
      this.lastAction = `Interactive: Advanced to step ${currentIndex + 2}`;
    }
  }

  resetInteractiveStepper(): void {
    this.interactiveSteps.forEach((step, index) => {
      step.current = index === 0;
      step.completed = false;
      step.error = false;
    });
    this.lastAction = 'Interactive: Reset to beginning';
  }

  getCurrentStepInfo(): string {
    const currentStep = this.interactiveSteps.find(step => step.current);
    return currentStep ? `${currentStep.title} (${this.interactiveSteps.indexOf(currentStep) + 1} of ${this.interactiveSteps.length})` : 'None';
  }

  getCompletedStepsCount(): number {
    return this.interactiveSteps.filter(step => step.completed).length;
  }
}qx2.demo-container {
  padding: 2rem;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: 3rem;
  
  h3 {
    margin-bottom: 1.5rem;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid #e0e0e0;
  }
  
  h4 {
    margin-bottom: 1rem;
    font-size: 1.1rem;
  }
}

.demo-scroll-container {
  height: 400px;
  overflow-y: auto;
  border: 2px solid #f0f0f0;
  border-radius: 8px;
  position: relative;
  background: linear-gradient(to bottom, #fafafa, #f0f0f0);
}

.demo-content-spacer {
  padding: 2rem;
  min-height: 600px;
  
  p {
    margin-bottom: 2rem;
    text-align: center;
    font-weight: 500;
  }
}

.demo-filler {
  height: 100px;
  margin: 1rem 0;
  background: linear-gradient(135deg, #e3f2fd, #bbdefb);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 500;
  color: #1976d2;
}

.demo-content {
  padding: 1rem 2rem;
  background: #fff;
  border-radius: 4px;
  font-weight: 500;
  text-align: center;
  color: #333;
}

.demo-content-small {
  padding: 0.75rem 1.5rem;
  background: #fff;
  border-radius: 4px;
  font-weight: 500;
  text-align: center;
  color: #333;
  font-size: 0.9rem;
}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 2rem;
  margin-top: 1rem;
}

.demo-row {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
  margin-top: 1rem;
}

.demo-variant-example {
  padding: 1.5rem;
  border: 1px solid #e0e0e0;
  border-radius: 8px;
  background: #fafafa;
  position: relative;
  min-height: 120px;
  
  h4 {
    position: absolute;
    top: 0.5rem;
    left: 1rem;
    margin: 0;
    font-size: 0.9rem;
    color: #666;
  }
}

.demo-effect-example {
  padding: 1.5rem;
  border: 1px solid #e0e0e0;
  border-radius: 8px;
  background: linear-gradient(135deg, #f8f9fa, #e9ecef);
  position: relative;
  min-height: 120px;
  
  h4 {
    position: absolute;
    top: 0.5rem;
    left: 1rem;
    margin: 0;
    font-size: 0.9rem;
    color: #666;
  }
}

.demo-controls {
  display: flex;
  gap: 1rem;
  margin-bottom: 2rem;
  flex-wrap: wrap;
  
  label {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    font-weight: 500;
    
    select {
      padding: 0.5rem;
      border: 1px solid #ddd;
      border-radius: 4px;
      min-width: 120px;
    }
    
    input[type="checkbox"] {
      width: 18px;
      height: 18px;
    }
  }
}

.demo-preview {
  height: 300px;
  border: 2px dashed #ddd;
  border-radius: 8px;
  position: relative;
  overflow: auto;
  background: linear-gradient(45deg, #f9f9f9 25%, transparent 25%), 
              linear-gradient(-45deg, #f9f9f9 25%, transparent 25%), 
              linear-gradient(45deg, transparent 75%, #f9f9f9 75%), 
              linear-gradient(-45deg, transparent 75%, #f9f9f9 75%);
  background-size: 20px 20px;
  background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
}

@media (max-width: 768px) {
  .demo-container {
    padding: 1rem;
  }
  
  .demo-grid {
    grid-template-columns: 1fr;
  }
  
  .demo-row {
    flex-direction: column;
  }
  
  .demo-controls {
    flex-direction: column;
    
    label {
      flex-direction: row;
      align-items: center;
      
      select {
        min-width: auto;
        flex: 1;
      }
    }
  }
}Y5x import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { StickyLayoutComponent } from 'ui-essentials';

@Component({
  selector: 'ui-sticky-layout-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, StickyLayoutComponent],
  template: `
    <div class="demo-container">
      <h2>Sticky Layout Demo</h2>
      <p>Scroll down to see the sticky positioning in action.</p>
      
      <!-- Position Variants -->
      <section class="demo-section">
        <h3>Position Variants</h3>
        <div class="demo-scroll-container">
          <ui-sticky-layout position="top" variant="header" [shadow]="true">
            <div class="demo-content">Sticky Top Header</div>
          </ui-sticky-layout>
          
          <div class="demo-content-spacer">
            <p>Scroll down to see sticky positioning...</p>
            <div class="demo-filler">Content area 1</div>
            <div class="demo-filler">Content area 2</div>
            <div class="demo-filler">Content area 3</div>
            <div class="demo-filler">Content area 4</div>
            <div class="demo-filler">Content area 5</div>
          </div>
          
          <ui-sticky-layout position="bottom" variant="footer" [shadow]="true">
            <div class="demo-content">Sticky Bottom Footer</div>
          </ui-sticky-layout>
        </div>
      </section>
      
      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Variant Styles</h3>
        <div class="demo-grid">
          @for (variant of variants; track variant.name) {
            <div class="demo-variant-example">
              <h4>{{ variant.name }}</h4>
              <ui-sticky-layout 
                [position]="variant.position"
                [variant]="variant.variant"
                [shadow]="variant.shadow"
                [background]="variant.background">
                <div class="demo-content-small">
                  {{ variant.name }} Sticky
                </div>
              </ui-sticky-layout>
            </div>
          }
        </div>
      </section>
      
      <!-- Offset Examples -->
      <section class="demo-section">
        <h3>Offset Variants</h3>
        <div class="demo-row">
          @for (offset of offsets; track offset) {
            <ui-sticky-layout 
              position="top" 
              [offset]="offset"
              variant="toolbar"
              [shadow]="true">
              <div class="demo-content-small">
                Offset: {{ offset }}
              </div>
            </ui-sticky-layout>
          }
        </div>
      </section>
      
      <!-- Background and Effects -->
      <section class="demo-section">
        <h3>Background & Effects</h3>
        <div class="demo-grid">
          <div class="demo-effect-example">
            <h4>Blur Effect</h4>
            <ui-sticky-layout 
              position="top" 
              background="surface"
              [blur]="true"
              [shadow]="true">
              <div class="demo-content-small">Blurred Background</div>
            </ui-sticky-layout>
          </div>
          
          <div class="demo-effect-example">
            <h4>Backdrop</h4>
            <ui-sticky-layout 
              position="top" 
              background="backdrop"
              [border]="true">
              <div class="demo-content-small">Backdrop Filter</div>
            </ui-sticky-layout>
          </div>
          
          <div class="demo-effect-example">
            <h4>Floating</h4>
            <ui-sticky-layout 
              position="top"
              variant="floating"
              offset="md">
              <div class="demo-content-small">Floating Style</div>
            </ui-sticky-layout>
          </div>
          
          <div class="demo-effect-example">
            <h4>Toolbar</h4>
            <ui-sticky-layout 
              position="top"
              variant="toolbar"
              [shadow]="true"
              [border]="true">
              <div class="demo-content-small">Toolbar Style</div>
            </ui-sticky-layout>
          </div>
        </div>
      </section>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <ui-sticky-layout 
              position="top"
              [size]="size"
              variant="header"
              [shadow]="true">
              <div class="demo-content-small">
                Size: {{ size }}
              </div>
            </ui-sticky-layout>
          }
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <div class="demo-controls">
          <label>
            Position:
            <select [(ngModel)]="selectedPosition" (change)="updateConfig()">
              @for (pos of positions; track pos) {
                <option [value]="pos">{{ pos }}</option>
              }
            </select>
          </label>
          
          <label>
            Variant:
            <select [(ngModel)]="selectedVariant" (change)="updateConfig()">
              @for (variant of variantOptions; track variant) {
                <option [value]="variant">{{ variant }}</option>
              }
            </select>
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="enableShadow" (change)="updateConfig()">
            Shadow
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="enableBorder" (change)="updateConfig()">
            Border
          </label>
          
          <label>
            <input type="checkbox" [(ngModel)]="enableBlur" (change)="updateConfig()">
            Blur
          </label>
        </div>
        
        <div class="demo-preview">
          <ui-sticky-layout 
            [position]="selectedPosition"
            [variant]="selectedVariant"
            [shadow]="enableShadow"
            [border]="enableBorder"
            [blur]="enableBlur"
            background="surface">
            <div class="demo-content">
              Dynamic Sticky Layout
            </div>
          </ui-sticky-layout>
        </div>
      </section>
    </div>
  `,
  styleUrl: './sticky-layout-demo.component.scss'
})
export class StickyLayoutDemoComponent {
  positions = ['top', 'bottom', 'left', 'right'] as const;
  offsets = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
  sizes = ['auto', 'full', 'content'] as const;
  variantOptions = ['default', 'header', 'sidebar', 'footer', 'floating', 'toolbar'] as const;
  
  variants = [
    { name: 'Header', variant: 'header' as const, position: 'top' as const, shadow: true, background: 'surface' as const },
    { name: 'Sidebar', variant: 'sidebar' as const, position: 'left' as const, shadow: false, background: 'surface-secondary' as const },
    { name: 'Footer', variant: 'footer' as const, position: 'bottom' as const, shadow: true, background: 'surface' as const },
    { name: 'Floating', variant: 'floating' as const, position: 'top' as const, shadow: true, background: 'surface-elevated' as const },
    { name: 'Toolbar', variant: 'toolbar' as const, position: 'top' as const, shadow: true, background: 'surface-elevated' as const }
  ];
  
  // Interactive controls
  selectedPosition: typeof this.positions[number] = 'top';
  selectedVariant: typeof this.variantOptions[number] = 'header';
  enableShadow = true;
  enableBorder = false;
  enableBlur = false;
  
  updateConfig(): void {
    console.log('Sticky layout config updated:', {
      position: this.selectedPosition,
      variant: this.selectedVariant,
      shadow: this.enableShadow,
      border: this.enableBorder,
      blur: this.enableBlur
    });
  }
}ۑx\1import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { SupportingPaneLayoutComponent } from 'ui-essentials';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faHome, faCog, faUser, faChartBar, faFileText, faBell, faBookmark, faTag, faCalendar, faComment } from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-supporting-pane-layout-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, SupportingPaneLayoutComponent, FontAwesomeModule],
  template: `
    <div class="demo-container">
      <h2>Supporting Pane Layout Demo</h2>
      <p>A layout component with main content and a collapsible supporting pane for additional information, tools, or navigation.</p>
      
      <!-- Position Variants -->
      <section class="demo-section">
        <h3>Position Variants</h3>
        <div class="demo-grid">
          <!-- Right Position (Default) -->
          <div class="demo-card">
            <h4>Right Position (Default)</h4>
            <div class="demo-layout-preview">
              <ui-supporting-pane-layout 
                position="right"
                [collapsed]="rightPaneCollapsed"
                (paneToggled)="rightPaneCollapsed = $event">
                
                <!-- Main Content -->
                <div class="demo-main-content">
                  <h3><fa-icon [icon]="faHome"></fa-icon> Main Content Area</h3>
                  <p>This is the primary content area where your main application content would be displayed.</p>
                  <div class="demo-content-blocks">
                    <div class="demo-content-block">
                      <h4><fa-icon [icon]="faChartBar"></fa-icon> Analytics Dashboard</h4>
                      <p>Key metrics and performance indicators would be shown here.</p>
                    </div>
                    <div class="demo-content-block">
                      <h4><fa-icon [icon]="faFileText"></fa-icon> Recent Documents</h4>
                      <p>A list of recently accessed or modified documents.</p>
                    </div>
                  </div>
                </div>
                
                <!-- Supporting Pane -->
                <div slot="supporting-pane">
                  <h4><fa-icon [icon]="faCog"></fa-icon> Quick Settings</h4>
                  <div class="demo-pane-content">
                    <div class="demo-setting-item">
                      <fa-icon [icon]="faBell"></fa-icon>
                      <span>Notifications</span>
                    </div>
                    <div class="demo-setting-item">
                      <fa-icon [icon]="faUser"></fa-icon>
                      <span>Profile Settings</span>
                    </div>
                    <div class="demo-setting-item">
                      <fa-icon [icon]="faBookmark"></fa-icon>
                      <span>Saved Items</span>
                    </div>
                  </div>
                </div>
                
                <!-- Pane Header -->
                <div slot="pane-header">
                  <span><fa-icon [icon]="faCog"></fa-icon> Tools</span>
                </div>
              </ui-supporting-pane-layout>
            </div>
          </div>
          
          <!-- Left Position -->
          <div class="demo-card">
            <h4>Left Position</h4>
            <div class="demo-layout-preview">
              <ui-supporting-pane-layout 
                position="left"
                [collapsed]="leftPaneCollapsed"
                (paneToggled)="leftPaneCollapsed = $event">
                
                <!-- Main Content -->
                <div class="demo-main-content">
                  <h3><fa-icon [icon]="faHome"></fa-icon> Main Content Area</h3>
                  <p>Content area with supporting pane on the left side.</p>
                  <div class="demo-content-blocks">
                    <div class="demo-content-block">
                      <h4><fa-icon [icon]="faComment"></fa-icon> Messages</h4>
                      <p>Recent messages and communications.</p>
                    </div>
                  </div>
                </div>
                
                <!-- Supporting Pane -->
                <div slot="supporting-pane">
                  <h4><fa-icon [icon]="faTag"></fa-icon> Tags & Categories</h4>
                  <div class="demo-pane-content">
                    <div class="demo-tag-item">Design</div>
                    <div class="demo-tag-item">Development</div>
                    <div class="demo-tag-item">Marketing</div>
                    <div class="demo-tag-item">Research</div>
                  </div>
                </div>
                
                <div slot="pane-header">
                  <span><fa-icon [icon]="faTag"></fa-icon> Categories</span>
                </div>
              </ui-supporting-pane-layout>
            </div>
          </div>
        </div>
      </section>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-row">
          <button class="demo-btn" [class.active]="selectedSize === size" 
                  *ngFor="let size of sizes" (click)="selectedSize = size">
            {{ size.toUpperCase() }}
          </button>
        </div>
        
        <div class="demo-layout-preview">
          <ui-supporting-pane-layout 
            [paneSize]="selectedSize"
            [collapsed]="sizePaneCollapsed"
            (paneToggled)="sizePaneCollapsed = $event">
            
            <div class="demo-main-content">
              <h3>Size: {{ selectedSize.toUpperCase() }}</h3>
              <p>The supporting pane width changes based on the selected size variant.</p>
            </div>
            
            <div slot="supporting-pane">
              <h4>Supporting Information</h4>
              <p>Pane size: {{ selectedSize }}</p>
              <div class="demo-pane-content">
                <div class="demo-info-item">Current size: {{ selectedSize.toUpperCase() }}</div>
                <div class="demo-info-item">Responsive: Yes</div>
                <div class="demo-info-item">Collapsible: Yes</div>
              </div>
            </div>
            
            <div slot="pane-header">
              <span>Size: {{ selectedSize.toUpperCase() }}</span>
            </div>
          </ui-supporting-pane-layout>
        </div>
      </section>
      
      <!-- Visual Variants -->
      <section class="demo-section">
        <h3>Visual Variants</h3>
        <div class="demo-row">
          <button class="demo-btn" [class.active]="selectedVariant === variant" 
                  *ngFor="let variant of variants" (click)="selectedVariant = variant">
            {{ variant | titlecase }}
          </button>
        </div>
        
        <div class="demo-layout-preview">
          <ui-supporting-pane-layout 
            [variant]="selectedVariant"
            [collapsed]="variantPaneCollapsed"
            (paneToggled)="variantPaneCollapsed = $event">
            
            <div class="demo-main-content">
              <h3>Variant: {{ selectedVariant | titlecase }}</h3>
              <p>Different visual styles for the supporting pane.</p>
              <div class="demo-content-blocks">
                <div class="demo-content-block">
                  <h4>Visual Style</h4>
                  <p>Current variant: <strong>{{ selectedVariant }}</strong></p>
                </div>
              </div>
            </div>
            
            <div slot="supporting-pane">
              <h4>Variant Demo</h4>
              <div class="demo-pane-content">
                <div class="demo-variant-info">
                  <strong>{{ selectedVariant | titlecase }}</strong> variant applied
                </div>
                <p>This demonstrates the {{ selectedVariant }} visual styling.</p>
              </div>
            </div>
            
            <div slot="pane-header">
              <span>{{ selectedVariant | titlecase }} Style</span>
            </div>
          </ui-supporting-pane-layout>
        </div>
      </section>
      
      <!-- Features Demo -->
      <section class="demo-section">
        <h3>Features & Options</h3>
        
        <div class="demo-controls">
          <label class="demo-checkbox">
            <input type="checkbox" [(ngModel)]="stickyPane">
            Sticky Pane
          </label>
          <label class="demo-checkbox">
            <input type="checkbox" [(ngModel)]="alwaysVisible">
            Always Visible (No responsive collapse)
          </label>
          <label class="demo-checkbox">
            <input type="checkbox" [(ngModel)]="showFooter">
            Show Pane Footer
          </label>
        </div>
        
        <div class="demo-layout-preview">
          <ui-supporting-pane-layout 
            [stickyPane]="stickyPane"
            [alwaysVisible]="alwaysVisible"
            [showPaneFooter]="showFooter"
            [collapsed]="featuresPaneCollapsed"
            (paneToggled)="featuresPaneCollapsed = $event"
            (paneCollapsed)="onPaneCollapsed()"
            (paneExpanded)="onPaneExpanded()">
            
            <div class="demo-main-content">
              <h3><fa-icon [icon]="faCalendar"></fa-icon> Features Demo</h3>
              <p>This demo shows various configuration options:</p>
              <ul>
                <li><strong>Sticky Pane:</strong> {{ stickyPane ? 'Enabled' : 'Disabled' }}</li>
                <li><strong>Always Visible:</strong> {{ alwaysVisible ? 'Enabled' : 'Disabled' }}</li>
                <li><strong>Show Footer:</strong> {{ showFooter ? 'Enabled' : 'Disabled' }}</li>
              </ul>
              
              <div class="demo-content-blocks">
                <div class="demo-content-block" *ngFor="let i of [1,2,3,4,5,6,7,8]">
                  <h4>Content Block {{ i }}</h4>
                  <p>This is example content to demonstrate scrolling behavior when sticky pane is enabled.</p>
                </div>
              </div>
            </div>
            
            <div slot="supporting-pane">
              <h4><fa-icon [icon]="faCog"></fa-icon> Configuration</h4>
              <div class="demo-pane-content">
                <div class="demo-config-item">
                  <strong>Sticky:</strong> {{ stickyPane ? 'Yes' : 'No' }}
                </div>
                <div class="demo-config-item">
                  <strong>Always Visible:</strong> {{ alwaysVisible ? 'Yes' : 'No' }}
                </div>
                <div class="demo-config-item">
                  <strong>Footer:</strong> {{ showFooter ? 'Shown' : 'Hidden' }}
                </div>
                <div class="demo-config-item">
                  <strong>Events:</strong> {{ eventCount }} triggered
                </div>
              </div>
            </div>
            
            <div slot="pane-header">
              <span><fa-icon [icon]="faCog"></fa-icon> Options</span>
            </div>
            
            <div slot="pane-footer" *ngIf="showFooter">
              <small>Last event: {{ lastEvent }}</small>
            </div>
          </ui-supporting-pane-layout>
        </div>
      </section>
    </div>
  `,
  styleUrl: './supporting-pane-layout-demo.component.scss'
})
export class SupportingPaneLayoutDemoComponent {
  // FontAwesome icons
  faHome = faHome;
  faCog = faCog;
  faUser = faUser;
  faChartBar = faChartBar;
  faFileText = faFileText;
  faBell = faBell;
  faBookmark = faBookmark;
  faTag = faTag;
  faCalendar = faCalendar;
  faComment = faComment;
  
  // Demo state
  sizes = ['sm', 'md', 'lg', 'xl'] as const;
  variants = ['default', 'bordered', 'elevated', 'subtle'] as const;
  
  selectedSize: 'sm' | 'md' | 'lg' | 'xl' = 'md';
  selectedVariant: 'default' | 'bordered' | 'elevated' | 'subtle' = 'default';
  
  // Pane collapsed states
  rightPaneCollapsed = false;
  leftPaneCollapsed = false;
  sizePaneCollapsed = false;
  variantPaneCollapsed = false;
  featuresPaneCollapsed = false;
  
  // Feature options
  stickyPane = false;
  alwaysVisible = false;
  showFooter = false;
  
  // Event tracking
  eventCount = 0;
  lastEvent = 'None';
  
  onPaneCollapsed(): void {
    this.eventCount++;
    this.lastEvent = 'Pane Collapsed';
    console.log('Supporting pane collapsed');
  }
  
  onPaneExpanded(): void {
    this.eventCount++;
    this.lastEvent = 'Pane Expanded';
    console.log('Supporting pane expanded');
  }
}op1x?+import { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormControl, FormGroup, ReactiveFormsModule, Validators, FormsModule } from '@angular/forms';
import { SwitchComponent } from '../../../../../ui-essentials/src/lib/components/forms/switch/switch.component';

@Component({
  selector: 'ui-switch-demo',
  standalone: true,
  imports: [
    CommonModule,
    ReactiveFormsModule,
    FormsModule,
    SwitchComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Switch Component Showcase</h2>
      
      <!-- Basic Switches -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Switches</h3>
        <div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-switch size="sm" label="Small" (switchChange)="handleToggle('small', $event)"></ui-switch>
          <ui-switch size="md" label="Medium" (switchChange)="handleToggle('medium', $event)"></ui-switch>
          <ui-switch size="lg" label="Large" (switchChange)="handleToggle('large', $event)"></ui-switch>
        </div>
      </section>

      <!-- Switch Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Variants</h3>
        <div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-switch variant="primary" label="Primary" (switchChange)="handleToggle('primary', $event)"></ui-switch>
          <ui-switch variant="secondary" label="Secondary" (switchChange)="handleToggle('secondary', $event)"></ui-switch>
          <ui-switch variant="success" label="Success" (switchChange)="handleToggle('success', $event)"></ui-switch>
          <ui-switch variant="warning" label="Warning" (switchChange)="handleToggle('warning', $event)"></ui-switch>
          <ui-switch variant="danger" label="Danger" (switchChange)="handleToggle('danger', $event)"></ui-switch>
        </div>
      </section>

      <!-- Switch States -->
      <section style="margin-bottom: 3rem;">
        <h3>States</h3>
        <div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-switch label="Enabled" (switchChange)="handleToggle('enabled', $event)"></ui-switch>
          <ui-switch label="Disabled" [disabled]="true" (switchChange)="handleToggle('disabled', $event)"></ui-switch>
          <ui-switch label="Pre-checked" [(ngModel)]="preCheckedValue" (switchChange)="handleToggle('pre-checked', $event)"></ui-switch>
          <ui-switch label="Required" [required]="true" (switchChange)="handleToggle('required', $event)"></ui-switch>
        </div>
      </section>

      <!-- Size Comparison -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Comparison</h3>
        <div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; margin-bottom: 2rem;">
          <div style="display: flex; flex-direction: column; gap: 1rem; align-items: center;">
            <ui-switch size="sm" variant="primary" label="Small Primary" (switchChange)="handleToggle('sm-primary', $event)"></ui-switch>
            <ui-switch size="md" variant="primary" label="Medium Primary" (switchChange)="handleToggle('md-primary', $event)"></ui-switch>
            <ui-switch size="lg" variant="primary" label="Large Primary" (switchChange)="handleToggle('lg-primary', $event)"></ui-switch>
          </div>
          <div style="display: flex; flex-direction: column; gap: 1rem; align-items: center;">
            <ui-switch size="sm" variant="success" label="Small Success" (switchChange)="handleToggle('sm-success', $event)"></ui-switch>
            <ui-switch size="md" variant="success" label="Medium Success" (switchChange)="handleToggle('md-success', $event)"></ui-switch>
            <ui-switch size="lg" variant="success" label="Large Success" (switchChange)="handleToggle('lg-success', $event)"></ui-switch>
          </div>
          <div style="display: flex; flex-direction: column; gap: 1rem; align-items: center;">
            <ui-switch size="sm" variant="danger" label="Small Danger" (switchChange)="handleToggle('sm-danger', $event)"></ui-switch>
            <ui-switch size="md" variant="danger" label="Medium Danger" (switchChange)="handleToggle('md-danger', $event)"></ui-switch>
            <ui-switch size="lg" variant="danger" label="Large Danger" (switchChange)="handleToggle('lg-danger', $event)"></ui-switch>
          </div>
        </div>
      </section>

      <!-- Switches without Labels -->
      <section style="margin-bottom: 3rem;">
        <h3>Switches without Labels</h3>
        <div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <div style="display: flex; flex-direction: column; gap: 0.5rem; align-items: center;">
            <ui-switch size="sm" variant="primary" ariaLabel="Small toggle" (switchChange)="handleToggle('no-label-sm', $event)"></ui-switch>
            <span style="font-size: 12px; color: #666;">Small</span>
          </div>
          <div style="display: flex; flex-direction: column; gap: 0.5rem; align-items: center;">
            <ui-switch size="md" variant="secondary" ariaLabel="Medium toggle" (switchChange)="handleToggle('no-label-md', $event)"></ui-switch>
            <span style="font-size: 12px; color: #666;">Medium</span>
          </div>
          <div style="display: flex; flex-direction: column; gap: 0.5rem; align-items: center;">
            <ui-switch size="lg" variant="success" ariaLabel="Large toggle" (switchChange)="handleToggle('no-label-lg', $event)"></ui-switch>
            <span style="font-size: 12px; color: #666;">Large</span>
          </div>
        </div>
      </section>

      <!-- Switches with Helper Text -->
      <section style="margin-bottom: 3rem;">
        <h3>With Helper Text</h3>
        <div style="display: flex; flex-direction: column; gap: 1.5rem;">
          <ui-switch 
            label="Email Notifications" 
            helperText="Receive email updates about your account activity"
            (switchChange)="handleToggle('email-notifications', $event)">
          </ui-switch>
          <ui-switch 
            label="Dark Mode" 
            helperText="Switch to dark theme for better viewing in low light"
            variant="secondary"
            (switchChange)="handleToggle('dark-mode', $event)">
          </ui-switch>
          <ui-switch 
            label="Auto-save" 
            helperText="Automatically save your work every 30 seconds"
            variant="success"
            [(ngModel)]="autoSaveValue"
            (switchChange)="handleToggle('auto-save', $event)">
          </ui-switch>
          <ui-switch 
            label="Data Sharing" 
            helperText="Share anonymous usage data to help improve our services"
            variant="warning"
            (switchChange)="handleToggle('data-sharing', $event)">
          </ui-switch>
        </div>
      </section>

      <!-- Reactive Forms Integration -->
      <section style="margin-bottom: 3rem;">
        <h3>Reactive Forms Integration</h3>
        <form [formGroup]="settingsForm" style="display: flex; flex-direction: column; gap: 1.5rem; max-width: 400px;">
          <ui-switch 
            formControlName="notifications"
            label="Push Notifications"
            helperText="Receive push notifications on your device">
          </ui-switch>
          <ui-switch 
            formControlName="newsletter"
            label="Newsletter Subscription"
            variant="secondary"
            helperText="Subscribe to our weekly newsletter">
          </ui-switch>
          <ui-switch 
            formControlName="analytics"
            label="Analytics Tracking"
            variant="warning"
            [required]="true"
            helperText="Required for core functionality">
          </ui-switch>
          <ui-switch 
            formControlName="marketing"
            label="Marketing Emails"
            variant="danger"
            helperText="Receive promotional offers and updates">
          </ui-switch>
          
          <div style="margin-top: 1rem; padding: 1rem; background: #f8f9fa; border-radius: 4px;">
            <h4>Form Values:</h4>
            <pre style="font-size: 0.875rem; margin: 0;">{{ getFormValues() }}</pre>
          </div>
          
          <div style="display: flex; gap: 1rem;">
            <button type="button" (click)="resetForm()" style="padding: 0.5rem 1rem; border: 1px solid #ccc; border-radius: 4px; background: white; cursor: pointer;">
              Reset Form
            </button>
            <button type="button" (click)="toggleAllSwitches()" style="padding: 0.5rem 1rem; border: 1px solid #007bff; border-radius: 4px; background: #007bff; color: white; cursor: pointer;">
              Toggle All
            </button>
          </div>
        </form>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Switch:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-switch 
  label="Enable feature"
  size="md"
  variant="primary"
  (switchChange)="onToggle($event)"&gt;
&lt;/ui-switch&gt;</code></pre>
          
          <h4>Switch with Helper Text:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-switch 
  label="Email Notifications"
  helperText="Receive updates via email"
  variant="success"
  [ngModel]="emailEnabled"
  (switchChange)="toggleEmail($event)"&gt;
&lt;/ui-switch&gt;</code></pre>

          <h4>Reactive Form Switch:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-switch 
  formControlName="agreement"
  label="I agree to terms"
  variant="primary"
  [required]="true"&gt;
&lt;/ui-switch&gt;</code></pre>

          <h4>Switch without Label:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-switch 
  size="lg"
  variant="secondary"
  ariaLabel="Toggle feature"
  (switchChange)="handleToggle($event)"&gt;
&lt;/ui-switch&gt;</code></pre>
        </div>
      </section>

      <!-- Interactive Demo -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Demo</h3>
        <div style="display: flex; flex-wrap: wrap; gap: 2rem; margin-bottom: 2rem;">
          <div>
            <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Size:</label>
            <select [(ngModel)]="demoSizeValue" style="padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px;">
              <option value="sm">Small</option>
              <option value="md">Medium</option>
              <option value="lg">Large</option>
            </select>
          </div>
          <div>
            <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Variant:</label>
            <select [(ngModel)]="demoVariantValue" style="padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px;">
              <option value="primary">Primary</option>
              <option value="secondary">Secondary</option>
              <option value="success">Success</option>
              <option value="warning">Warning</option>
              <option value="danger">Danger</option>
            </select>
          </div>
          <div>
            <label style="display: block; margin-bottom: 0.5rem; font-weight: bold;">Options:</label>
            <div style="display: flex; flex-direction: column; gap: 0.25rem;">
              <label style="font-size: 0.875rem;">
                <input type="checkbox" [(ngModel)]="demoDisabledValue" style="margin-right: 0.5rem;">
                Disabled
              </label>
              <label style="font-size: 0.875rem;">
                <input type="checkbox" [(ngModel)]="demoRequiredValue" style="margin-right: 0.5rem;">
                Required
              </label>
              <label style="font-size: 0.875rem;">
                <input type="checkbox" [(ngModel)]="demoWithHelperValue" style="margin-right: 0.5rem;">
                With Helper Text
              </label>
            </div>
          </div>
        </div>
        
        <div style="padding: 2rem; border: 2px dashed #ccc; border-radius: 8px; background: #fafafa;">
          <h4>Live Preview:</h4>
          <ui-switch 
            [size]="demoSizeValue"
            [variant]="demoVariantValue"
            [disabled]="demoDisabledValue"
            [required]="demoRequiredValue"
            [helperText]="demoWithHelperValue ? 'This is example helper text for the switch component.' : ''"
            label="Interactive Demo Switch"
            [(ngModel)]="demoCheckedValue"
            (switchChange)="handleDemoToggle($event)">
          </ui-switch>
          
          <div style="margin-top: 1rem; font-size: 0.875rem; color: #666;">
            <strong>Current state:</strong> {{ demoCheckedValue ? 'ON' : 'OFF' }}
          </div>
        </div>
      </section>

      <!-- Last Action Display -->
      @if (lastAction()) {
        <section style="margin-bottom: 2rem;">
          <div style="padding: 1rem; background: #e3f2fd; border-radius: 4px; border-left: 4px solid #2196f3;">
            <strong>Last Action:</strong> {{ lastAction() }}
          </div>
        </section>
      }
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }

    select, input[type="checkbox"] {
      cursor: pointer;
    }

    label {
      cursor: pointer;
    }
  `]
})
export class SwitchDemoComponent {
  lastAction = signal<string>('');
  
  // Template values for ngModel binding
  preCheckedValue = true;
  autoSaveValue = true;
  
  // Interactive demo properties
  demoSizeValue: 'sm' | 'md' | 'lg' = 'md';
  demoVariantValue: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' = 'primary';
  demoDisabledValue = false;
  demoRequiredValue = false;
  demoWithHelperValue = false;
  demoCheckedValue = false;

  // Reactive form
  settingsForm = new FormGroup({
    notifications: new FormControl(false),
    newsletter: new FormControl(true),
    analytics: new FormControl(false, [Validators.requiredTrue]),
    marketing: new FormControl(false)
  });

  handleToggle(switchName: string, checked: boolean): void {
    const action = `${switchName}: ${checked ? 'ON' : 'OFF'}`;
    this.lastAction.set(action);
    console.log(`Switch toggled - ${action}`);
  }

  handleDemoToggle(checked: boolean): void {
    this.demoCheckedValue = checked;
    this.handleToggle('Interactive Demo', checked);
  }

  getFormValues(): string {
    const values = this.settingsForm.value;
    return JSON.stringify(values, null, 2);
  }

  resetForm(): void {
    this.settingsForm.reset({
      notifications: false,
      newsletter: false,
      analytics: false,
      marketing: false
    });
    this.lastAction.set('Form reset to default values');
  }

  toggleAllSwitches(): void {
    const allEnabled = Object.values(this.settingsForm.value).every(val => val === true);
    const newState = !allEnabled;
    
    this.settingsForm.patchValue({
      notifications: newState,
      newsletter: newState,
      analytics: newState,
      marketing: newState
    });
    
    this.lastAction.set(`All switches turned ${newState ? 'ON' : 'OFF'}`);
  }
}+ilbxR~@f; (Mx/import { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { TabsContainerComponent, Tab } from '../../../../../ui-essentials/src/lib/components/layout/tabs-container/tabs-container.component';

@Component({
  selector: 'ui-tabs-container-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, TabsContainerComponent],
  template: `
    <div class="demo-container">
      <h2>Tabs Container Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <h4>{{ size | titlecase }} Size</h4>
              <ui-tabs-container 
                [tabs]="basicTabs()"
                [size]="size"
                (tabSelected)="handleTabSelect('size-' + size, $event)">
                <div>Content for {{ size }} tabs. Use tab selection to see different content.</div>
              </ui-tabs-container>
            </div>
          }
        </div>
      </section>
      
      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <h4>{{ variant | titlecase }} Variant</h4>
              <ui-tabs-container 
                [tabs]="basicTabs()"
                [variant]="variant"
                (tabSelected)="handleTabSelect('variant-' + variant, $event)">
                <div>{{ variant | titlecase }} variant tabs with different styling approaches.</div>
              </ui-tabs-container>
            </div>
          }
        </div>
      </section>
      
      <!-- Position Variants -->
      <section class="demo-section">
        <h3>Tab Positions</h3>
        <div class="demo-row">
          @for (position of positions; track position) {
            <div class="demo-item" [style.height]="position === 'left' || position === 'right' ? '300px' : 'auto'">
              <h4>{{ position | titlecase }} Position</h4>
              <ui-tabs-container 
                [tabs]="basicTabs()"
                [position]="position"
                (tabSelected)="handleTabSelect('position-' + position, $event)">
                <div>Tabs positioned {{ position }} with appropriate navigation layout.</div>
              </ui-tabs-container>
            </div>
          }
        </div>
      </section>
      
      <!-- Closeable Tabs -->
      <section class="demo-section">
        <h3>Closeable Tabs</h3>
        <div class="demo-item">
          <ui-tabs-container 
            [tabs]="closeableTabs()"
            (tabSelected)="handleTabSelect('closeable', $event)"
            (tabClosed)="handleTabClose($event)">
            <div>Closeable tabs demo - try closing tabs with the × button. Some tabs cannot be closed.</div>
          </ui-tabs-container>
          <p class="demo-info">Close tabs by clicking the × button. Some tabs cannot be closed.</p>
        </div>
      </section>
      
      <!-- Tabs with Icons -->
      <section class="demo-section">
        <h3>Tabs with Icons</h3>
        <div class="demo-item">
          <ui-tabs-container 
            [tabs]="iconTabs()"
            (tabSelected)="handleTabSelect('icons', $event)">
            <div>Tabs with icons provide visual context and better user experience.</div>
          </ui-tabs-container>
        </div>
      </section>
      
      <!-- Scrollable Tabs -->
      <section class="demo-section">
        <h3>Scrollable Tabs</h3>
        <div class="demo-item">
          <ui-tabs-container 
            [tabs]="manyTabs()"
            [scrollable]="true"
            (tabSelected)="handleTabSelect('scrollable', $event)">
            <div>Scrollable tabs for when you have many tabs that exceed container width.</div>
          </ui-tabs-container>
          <p class="demo-info">Use scroll controls when tabs overflow the container width.</p>
        </div>
      </section>
      
      <!-- Reorderable Tabs -->
      <section class="demo-section">
        <h3>Reorderable Tabs</h3>
        <div class="demo-item">
          <ui-tabs-container 
            [tabs]="reorderableTabs()"
            [reorderable]="true"
            (tabSelected)="handleTabSelect('reorderable', $event)"
            (tabsReordered)="handleTabsReorder($event)">
            <div>Drag and drop reorderable tabs - try dragging tabs to rearrange them.</div>
          </ui-tabs-container>
          <p class="demo-info">Drag tabs to reorder them. Order changes: {{ reorderCount() }}</p>
        </div>
      </section>
      
      <!-- Lazy Loading -->
      <section class="demo-section">
        <h3>Lazy Loading</h3>
        <div class="demo-item">
          <ui-tabs-container 
            [tabs]="lazyTabs()"
            [lazyLoad]="true"
            (tabSelected)="handleTabSelect('lazy', $event)">
            <div>Lazy loading tabs optimize performance by loading content only when needed.</div>
          </ui-tabs-container>
          <p class="demo-info">Lazy tabs only load content when first selected.</p>
        </div>
      </section>
      
      <!-- Disabled Tabs -->
      <section class="demo-section">
        <h3>Disabled States</h3>
        <div class="demo-item">
          <ui-tabs-container 
            [tabs]="disabledTabs()"
            (tabSelected)="handleTabSelect('disabled', $event)">
            <div>Disabled tabs prevent user interaction while maintaining visual hierarchy.</div>
          </ui-tabs-container>
          <p class="demo-info">Disabled tabs cannot be selected or interacted with.</p>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <div class="demo-item">
          <div class="demo-controls">
            <label>
              Size:
              <select [(ngModel)]="interactiveSize" (change)="updateInteractiveConfig()">
                @for (size of sizes; track size) {
                  <option [value]="size">{{ size | titlecase }}</option>
                }
              </select>
            </label>
            <label>
              Variant:
              <select [(ngModel)]="interactiveVariant" (change)="updateInteractiveConfig()">
                @for (variant of variants; track variant) {
                  <option [value]="variant">{{ variant | titlecase }}</option>
                }
              </select>
            </label>
            <label>
              Position:
              <select [(ngModel)]="interactivePosition" (change)="updateInteractiveConfig()">
                @for (position of positions; track position) {
                  <option [value]="position">{{ position | titlecase }}</option>
                }
              </select>
            </label>
            <label>
              <input type="checkbox" [(ngModel)]="interactiveScrollable" (change)="updateInteractiveConfig()">
              Scrollable
            </label>
            <label>
              <input type="checkbox" [(ngModel)]="interactiveReorderable" (change)="updateInteractiveConfig()">
              Reorderable
            </label>
          </div>
          
          <ui-tabs-container 
            [tabs]="interactiveTabs()"
            [size]="interactiveSize"
            [variant]="interactiveVariant"
            [position]="interactivePosition"
            [scrollable]="interactiveScrollable"
            [reorderable]="interactiveReorderable"
            (tabSelected)="handleTabSelect('interactive', $event)"
            (tabClosed)="handleInteractiveTabClose($event)"
            (tabsReordered)="handleInteractiveTabsReorder($event)">
            <div>Interactive demo with configurable options - use controls above to customize behavior.</div>
          </ui-tabs-container>
          
          <div class="demo-status">
            <p><strong>Current tab:</strong> {{ activeTab() || 'None' }}</p>
            <p><strong>Tab selections:</strong> {{ tabSelectCount() }}</p>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './tabs-container-demo.component.scss'
})
export class TabsContainerDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['default', 'filled', 'pills', 'underlined'] as const;
  positions = ['top', 'bottom', 'left', 'right'] as const;
  
  // Demo state
  activeTab = signal<string>('');
  tabSelectCount = signal(0);
  reorderCount = signal(0);
  
  // Interactive demo controls
  interactiveSize: 'sm' | 'md' | 'lg' = 'md';
  interactiveVariant: 'default' | 'filled' | 'pills' | 'underlined' = 'default';
  interactivePosition: 'top' | 'bottom' | 'left' | 'right' = 'top';
  interactiveScrollable = false;
  interactiveReorderable = false;
  
  // Tab collections
  private _closeableTabs = signal<Tab[]>([
    { id: 'doc1', label: 'Document 1', closeable: true },
    { id: 'doc2', label: 'Document 2', closeable: true },
    { id: 'doc3', label: 'Important Doc', closeable: false },
    { id: 'doc4', label: 'Temp File', closeable: true }
  ]);
  
  private _reorderableTabs = signal<Tab[]>([
    { id: 'order1', label: 'First' },
    { id: 'order2', label: 'Second' },
    { id: 'order3', label: 'Third' },
    { id: 'order4', label: 'Fourth' }
  ]);
  
  private _interactiveTabs = signal<Tab[]>([
    { id: 'int1', label: 'Tab One', closeable: true, icon: '1️⃣' },
    { id: 'int2', label: 'Tab Two', closeable: true, icon: '2️⃣' },
    { id: 'int3', label: 'Tab Three', closeable: false, icon: '3️⃣' },
    { id: 'int4', label: 'Tab Four', closeable: true, icon: '4️⃣' }
  ]);
  
  basicTabs(): Tab[] {
    return [
      { id: 'tab1', label: 'Tab 1' },
      { id: 'tab2', label: 'Tab 2' },
      { id: 'tab3', label: 'Tab 3' }
    ];
  }
  
  iconTabs(): Tab[] {
    return [
      { id: 'home', label: 'Home', icon: '🏠' },
      { id: 'settings', label: 'Settings', icon: '⚙️' },
      { id: 'profile', label: 'Profile', icon: '👤' },
      { id: 'notifications', label: 'Notifications', icon: '🔔' }
    ];
  }
  
  manyTabs(): Tab[] {
    return Array.from({ length: 12 }, (_, i) => ({
      id: `many${i + 1}`,
      label: `Tab ${i + 1}`,
      closeable: i > 2
    }));
  }
  
  lazyTabs(): Tab[] {
    return [
      { id: 'eager', label: 'Eager Load', lazyLoad: false },
      { id: 'lazy1', label: 'Lazy Tab 1', lazyLoad: true },
      { id: 'lazy2', label: 'Lazy Tab 2', lazyLoad: true }
    ];
  }
  
  disabledTabs(): Tab[] {
    return [
      { id: 'enabled1', label: 'Enabled' },
      { id: 'disabled', label: 'Disabled', disabled: true },
      { id: 'enabled2', label: 'Also Enabled' }
    ];
  }
  
  closeableTabs = this._closeableTabs.asReadonly();
  reorderableTabs = this._reorderableTabs.asReadonly();
  interactiveTabs = this._interactiveTabs.asReadonly();
  
  handleTabSelect(context: string, tabId: string): void {
    console.log(`Tab selected in ${context}:`, tabId);
    this.activeTab.set(tabId);
    this.tabSelectCount.update(count => count + 1);
  }
  
  handleTabClose(tabId: string): void {
    console.log('Tab closed:', tabId);
    this._closeableTabs.update(tabs => tabs.filter(tab => tab.id !== tabId));
  }
  
  handleTabsReorder(newTabs: Tab[]): void {
    console.log('Tabs reordered:', newTabs);
    this._reorderableTabs.set(newTabs);
    this.reorderCount.update(count => count + 1);
  }
  
  handleInteractiveTabClose(tabId: string): void {
    console.log('Interactive tab closed:', tabId);
    this._interactiveTabs.update(tabs => tabs.filter(tab => tab.id !== tabId));
  }
  
  handleInteractiveTabsReorder(newTabs: Tab[]): void {
    console.log('Interactive tabs reordered:', newTabs);
    this._interactiveTabs.set(newTabs);
  }
  
  updateInteractiveConfig(): void {
    // Trigger change detection for interactive demo
    console.log('Interactive config updated:', {
      size: this.interactiveSize,
      variant: this.interactiveVariant,
      position: this.interactivePosition,
      scrollable: this.interactiveScrollable,
      reorderable: this.interactiveReorderable
    });
  }
}>xG7import { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { TagInputComponent } from '../../../../../ui-essentials/src/lib/components/forms/tag-input/tag-input.component';
import { ButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons/button.component';
import { faTag, faPlus, faTimes, faRefresh } from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-tag-input-demo',
  standalone: true,
  imports: [
    CommonModule,
    ReactiveFormsModule,
    TagInputComponent,
    ButtonComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Tag Input Component Showcase</h2>
      
      <!-- Basic Tag Input Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Variants</h3>
        
        <h4>Outlined (Default)</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Add tags (press Enter, Tab, or comma to add)"
            helpText="Separate tags with Enter, Tab, comma, semicolon, or pipe"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('outlined', $event)"
            (tagRemove)="handleTagRemove('outlined', $event)"
            (duplicateTag)="handleDuplicateTag('outlined', $event)"
            (tagValidationError)="handleValidationError('outlined', $event)">
          </ui-tag-input>
        </div>
        
        <h4>Filled</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            variant="filled"
            placeholder="Add filled style tags"
            helpText="This input uses the filled variant style"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('filled', $event)"
            (tagRemove)="handleTagRemove('filled', $event)">
          </ui-tag-input>
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        
        <h4>Small</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            size="sm"
            placeholder="Small size tags"
            helpText="Compact size for dense layouts"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('small', $event)"
            (tagRemove)="handleTagRemove('small', $event)">
          </ui-tag-input>
        </div>
        
        <h4>Medium (Default)</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            size="md"
            placeholder="Medium size tags"
            helpText="Standard size for most use cases"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('medium', $event)"
            (tagRemove)="handleTagRemove('medium', $event)">
          </ui-tag-input>
        </div>
        
        <h4>Large</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            size="lg"
            placeholder="Large size tags"
            helpText="Larger size for better accessibility"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('large', $event)"
            (tagRemove)="handleTagRemove('large', $event)">
          </ui-tag-input>
        </div>
      </section>

      <!-- Configuration Options -->
      <section style="margin-bottom: 3rem;">
        <h3>Configuration Options</h3>
        
        <h4>Max Tags (3)</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Maximum 3 tags allowed"
            [maxTags]="3"
            helpText="This input has a maximum of 3 tags"
            [class]="'demo-tag-input'"
            (maxTagsReached)="handleMaxTagsReached('max-tags')"
            (tagAdd)="handleTagAdd('max-tags', $event)"
            (tagRemove)="handleTagRemove('max-tags', $event)">
          </ui-tag-input>
        </div>
        
        <h4>Max Tag Length (10)</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Max 10 characters per tag"
            [maxTagLength]="10"
            helpText="Each tag can be at most 10 characters long"
            [class]="'demo-tag-input'"
            (tagValidationError)="handleValidationError('max-length', $event)"
            (tagAdd)="handleTagAdd('max-length', $event)"
            (tagRemove)="handleTagRemove('max-length', $event)">
          </ui-tag-input>
        </div>
        
        <h4>Allow Duplicates</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Duplicate tags allowed"
            [allowDuplicates]="true"
            helpText="This input allows duplicate tags"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('allow-duplicates', $event)"
            (tagRemove)="handleTagRemove('allow-duplicates', $event)">
          </ui-tag-input>
        </div>
        
        <h4>No Trimming</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Leading/trailing spaces preserved"
            [trimTags]="false"
            helpText="Tags preserve leading and trailing whitespace"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('no-trim', $event)"
            (tagRemove)="handleTagRemove('no-trim', $event)">
          </ui-tag-input>
        </div>
      </section>

      <!-- States -->
      <section style="margin-bottom: 3rem;">
        <h3>States</h3>
        
        <h4>Normal</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Normal interactive state"
            helpText="Standard interactive state"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('normal', $event)"
            (tagRemove)="handleTagRemove('normal', $event)">
          </ui-tag-input>
        </div>
        
        <h4>Disabled</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Disabled state"
            [disabled]="true"
            helpText="This input is disabled"
            [class]="'demo-tag-input'">
          </ui-tag-input>
        </div>
        
        <h4>Read Only</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Read only state"
            [readonly]="true"
            helpText="This input is read-only - tags cannot be added or removed"
            [class]="'demo-tag-input'">
          </ui-tag-input>
        </div>
        
        <h4>With Error</h4>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            placeholder="Input with error"
            errorMessage="This field is required and must contain at least one tag"
            [class]="'demo-tag-input'"
            (tagAdd)="handleTagAdd('error', $event)"
            (tagRemove)="handleTagRemove('error', $event)">
          </ui-tag-input>
        </div>
      </section>

      <!-- Form Integration -->
      <section style="margin-bottom: 3rem;">
        <h3>Form Integration</h3>
        <form [formGroup]="demoForm" (ngSubmit)="handleFormSubmit()" style="max-width: 600px;">
          <h4>Reactive Form Example</h4>
          <div style="margin-bottom: 1.5rem;">
            <ui-tag-input 
              formControlName="tags"
              placeholder="Required: Add at least 2 tags"
              helpText="This field is required and uses reactive forms validation"
              [class]="'demo-tag-input'"
              [errorMessage]="getFormFieldError('tags')"
              (tagAdd)="handleTagAdd('form', $event)"
              (tagRemove)="handleTagRemove('form', $event)">
            </ui-tag-input>
          </div>
          
          <h4>Skills (Optional)</h4>
          <div style="margin-bottom: 1.5rem;">
            <ui-tag-input 
              formControlName="skills"
              placeholder="Add your skills"
              [maxTags]="5"
              helpText="Optional field - up to 5 skills"
              [class]="'demo-tag-input'"
              (tagAdd)="handleTagAdd('skills', $event)"
              (tagRemove)="handleTagRemove('skills', $event)">
            </ui-tag-input>
          </div>
          
          <div style="display: flex; gap: 1rem; align-items: center;">
            <ui-button 
              type="submit" 
              variant="filled" 
              [disabled]="demoForm.invalid">
              Submit Form
            </ui-button>
            <ui-button 
              type="button" 
              variant="tonal" 
              [icon]="faRefresh" 
              iconPosition="left"
              (clicked)="resetForm()">
              Reset
            </ui-button>
          </div>
          
          @if (formSubmitted) {
            <div style="margin-top: 1rem; padding: 1rem; background: #e8f5e8; border-radius: 4px; border-left: 4px solid #4caf50;">
              <strong>Form Submitted!</strong><br>
              <strong>Tags:</strong> {{ formData.tags?.join(', ') || 'None' }}<br>
              <strong>Skills:</strong> {{ formData.skills?.join(', ') || 'None' }}
            </div>
          }
        </form>
      </section>

      <!-- Programmatic Control -->
      <section style="margin-bottom: 3rem;">
        <h3>Programmatic Control</h3>
        <div style="margin-bottom: 1.5rem;">
          <ui-tag-input 
            #programmaticInput
            placeholder="Controlled programmatically"
            helpText="Use the buttons below to control this input"
            [class]="'demo-tag-input'">
          </ui-tag-input>
        </div>
        
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-button 
            variant="outlined" 
            size="small" 
            [icon]="faPlus" 
            iconPosition="left"
            (clicked)="addPredefinedTag(programmaticInput)">
            Add Random Tag
          </ui-button>
          <ui-button 
            variant="outlined" 
            size="small" 
            (clicked)="clearProgrammaticInput(programmaticInput)">
            Clear All
          </ui-button>
          <ui-button 
            variant="outlined" 
            size="small" 
            (clicked)="addMultipleTags(programmaticInput)">
            Add Multiple
          </ui-button>
          <ui-button 
            variant="outlined" 
            size="small" 
            (clicked)="getTagsAsString(programmaticInput)">
            Get as String
          </ui-button>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Usage:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-tag-input 
  placeholder="Add tags..."
  (tagAdd)="onTagAdd($event)"
  (tagRemove)="onTagRemove($event)"&gt;
&lt;/ui-tag-input&gt;</code></pre>

          <h4>With Constraints:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-tag-input 
  placeholder="Add up to 5 tags"
  [maxTags]="5"
  [maxTagLength]="20"
  [allowDuplicates]="false"
  helpText="Each tag can be up to 20 characters"
  (maxTagsReached)="onMaxTags()"
  (duplicateTag)="onDuplicate($event)"&gt;
&lt;/ui-tag-input&gt;</code></pre>

          <h4>Form Integration:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;form [formGroup]="myForm"&gt;
  &lt;ui-tag-input 
    formControlName="tags"
    placeholder="Required tags"
    [errorMessage]="getFieldError('tags')"&gt;
  &lt;/ui-tag-input&gt;
&lt;/form&gt;</code></pre>

          <h4>Custom Separators:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-tag-input 
  placeholder="Use space or dash to separate"
  [separators]="[' ', '-']"
  helpText="Tags separated by space or dash"&gt;
&lt;/ui-tag-input&gt;</code></pre>
        </div>
      </section>

      <!-- Event Log -->
      <section style="margin-bottom: 3rem;">
        <h3>Event Log</h3>
        @if (lastAction) {
          <div style="margin-bottom: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last action:</strong> {{ lastAction }}
          </div>
        }
        <div style="display: flex; gap: 1rem; flex-wrap: wrap;">
          <ui-button variant="tonal" (clicked)="clearEventLog()">Clear Log</ui-button>
          <ui-button variant="outlined" (clicked)="showAlert('Tag Input demo complete!')">Show Alert</ui-button>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    .demo-tag-input {
      width: 100%;
      max-width: 500px;
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }
  `]
})
export class TagInputDemoComponent {
  lastAction: string = '';
  
  // FontAwesome icons
  faTag = faTag;
  faPlus = faPlus;
  faTimes = faTimes;
  faRefresh = faRefresh;
  
  // Form
  demoForm = new FormGroup({
    tags: new FormControl<string[]>([], [
      Validators.required,
      this.minTagsValidator(2)
    ]),
    skills: new FormControl<string[]>([])
  });
  
  formSubmitted = false;
  formData: { tags?: string[]; skills?: string[] } = {};
  
  // Predefined tags for programmatic control
  predefinedTags = [
    'JavaScript', 'TypeScript', 'Angular', 'React', 'Vue',
    'HTML', 'CSS', 'SCSS', 'Node.js', 'Python', 'Java',
    'Design', 'Frontend', 'Backend', 'Fullstack'
  ];

  // Event handlers
  handleTagAdd(source: string, tag: string): void {
    this.lastAction = `Tag added (${source}): "${tag}"`;
    console.log(`Tag added (${source}):`, tag);
  }

  handleTagRemove(source: string, event: { tag: string; index: number }): void {
    this.lastAction = `Tag removed (${source}): "${event.tag}" at index ${event.index}`;
    console.log(`Tag removed (${source}):`, event);
  }

  handleDuplicateTag(source: string, tag: string): void {
    this.lastAction = `Duplicate tag attempted (${source}): "${tag}"`;
    console.log(`Duplicate tag attempted (${source}):`, tag);
  }

  handleValidationError(source: string, error: { tag: string; error: string }): void {
    this.lastAction = `Validation error (${source}): "${error.tag}" - ${error.error}`;
    console.log(`Validation error (${source}):`, error);
  }

  handleMaxTagsReached(source: string): void {
    this.lastAction = `Maximum tags reached (${source})`;
    console.log(`Maximum tags reached (${source})`);
  }

  // Form methods
  minTagsValidator(min: number) {
    return (control: any) => {
      const tags = control.value;
      if (!tags || tags.length < min) {
        return { minTags: { required: min, actual: tags?.length || 0 } };
      }
      return null;
    };
  }

  getFormFieldError(fieldName: string): string | undefined {
    const field = this.demoForm.get(fieldName);
    if (field && field.invalid && (field.dirty || field.touched)) {
      const errors = field.errors;
      if (errors?.['required']) {
        return 'This field is required';
      }
      if (errors?.['minTags']) {
        return `At least ${errors['minTags'].required} tags are required`;
      }
    }
    return undefined;
  }

  handleFormSubmit(): void {
    if (this.demoForm.valid) {
      const formValue = this.demoForm.value;
      this.formData = {
        tags: formValue.tags || [],
        skills: formValue.skills || []
      };
      this.formSubmitted = true;
      this.lastAction = 'Form submitted successfully';
      console.log('Form submitted:', this.formData);
    } else {
      this.lastAction = 'Form submission failed - validation errors';
      console.log('Form invalid:', this.demoForm.errors);
    }
  }

  resetForm(): void {
    this.demoForm.reset();
    this.formSubmitted = false;
    this.formData = {};
    this.lastAction = 'Form reset';
    console.log('Form reset');
  }

  // Programmatic control methods
  addPredefinedTag(tagInput: TagInputComponent): void {
    const randomTag = this.predefinedTags[Math.floor(Math.random() * this.predefinedTags.length)];
    const success = tagInput.addTagProgrammatically(randomTag);
    this.lastAction = success 
      ? `Programmatically added: "${randomTag}"` 
      : `Failed to add: "${randomTag}"`;
    console.log('Add predefined tag result:', success, randomTag);
  }

  clearProgrammaticInput(tagInput: TagInputComponent): void {
    tagInput.clear();
    this.lastAction = 'Programmatically cleared all tags';
    console.log('Cleared programmatic input');
  }

  addMultipleTags(tagInput: TagInputComponent): void {
    const tagsToAdd = ['HTML', 'CSS', 'JavaScript'];
    let addedCount = 0;
    
    tagsToAdd.forEach(tag => {
      if (tagInput.addTagProgrammatically(tag)) {
        addedCount++;
      }
    });
    
    this.lastAction = `Programmatically added ${addedCount}/${tagsToAdd.length} tags`;
    console.log(`Added ${addedCount} multiple tags`);
  }

  getTagsAsString(tagInput: TagInputComponent): void {
    const tagsString = tagInput.getTagsAsString();
    this.lastAction = `Tags as string: "${tagsString}"`;
    alert(`Current tags: ${tagsString || 'None'}`);
    console.log('Tags as string:', tagsString);
  }

  // Utility methods
  clearEventLog(): void {
    this.lastAction = '';
  }

  showAlert(message: string): void {
    alert(message);
    this.lastAction = 'Alert shown';
  }
}~ 
x"Qݮimport { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { TextareaComponent } from '../../../../../ui-essentials/src/lib/components/forms/input/textarea.component';
import { faComment, faEdit, faEnvelope } from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-textarea-demo',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    TextareaComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Textarea Component Showcase</h2>
      
      <!-- Basic Textarea -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Textarea</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-textarea 
            label="Basic textarea"
            placeholder="Enter your message here..."
            [(ngModel)]="basicTextarea1"
            (textareaChange)="onTextareaChange('basic-1', $event)"
          />
          <ui-textarea 
            label="Textarea with helper text"
            placeholder="Share your thoughts..."
            helperText="Your feedback is important to us"
            [(ngModel)]="basicTextarea2"
            (textareaChange)="onTextareaChange('basic-2', $event)"
          />
          <ui-textarea 
            label="Pre-filled textarea"
            placeholder="Enter description..."
            [(ngModel)]="basicTextarea3"
            (textareaChange)="onTextareaChange('basic-3', $event)"
          />
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-textarea 
            label="Small textarea"
            size="sm"
            placeholder="Small size textarea..."
            [(ngModel)]="sizeSmall"
            (textareaChange)="onTextareaChange('size-small', $event)"
          />
          <ui-textarea 
            label="Medium textarea (default)"
            size="md"
            placeholder="Medium size textarea..."
            [(ngModel)]="sizeMedium"
            (textareaChange)="onTextareaChange('size-medium', $event)"
          />
          <ui-textarea 
            label="Large textarea"
            size="lg"
            placeholder="Large size textarea..."
            [(ngModel)]="sizeLarge"
            (textareaChange)="onTextareaChange('size-large', $event)"
          />
        </div>
      </section>

      <!-- Variant Styles -->
      <section style="margin-bottom: 3rem;">
        <h3>Style Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-textarea 
            label="Outlined variant (default)"
            variant="outlined"
            placeholder="Outlined style textarea..."
            [(ngModel)]="variantOutlined"
            (textareaChange)="onTextareaChange('variant-outlined', $event)"
          />
          <ui-textarea 
            label="Filled variant"
            variant="filled"
            placeholder="Filled style textarea..."
            [(ngModel)]="variantFilled"
            (textareaChange)="onTextareaChange('variant-filled', $event)"
          />
          <ui-textarea 
            label="Underlined variant"
            variant="underlined"
            placeholder="Underlined style textarea..."
            [(ngModel)]="variantUnderlined"
            (textareaChange)="onTextareaChange('variant-underlined', $event)"
          />
        </div>
      </section>

      <!-- States -->
      <section style="margin-bottom: 3rem;">
        <h3>States and Validation</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-textarea 
            label="Default state"
            state="default"
            placeholder="Normal textarea..."
            [(ngModel)]="stateDefault"
            (textareaChange)="onTextareaChange('state-default', $event)"
          />
          <ui-textarea 
            label="Success state"
            state="success"
            placeholder="Successful input..."
            helperText="This looks good!"
            [(ngModel)]="stateSuccess"
            (textareaChange)="onTextareaChange('state-success', $event)"
          />
          <ui-textarea 
            label="Warning state"
            state="warning"
            placeholder="Input with warning..."
            helperText="Please double-check this content"
            [(ngModel)]="stateWarning"
            (textareaChange)="onTextareaChange('state-warning', $event)"
          />
          <ui-textarea 
            label="Error state"
            state="error"
            placeholder="Input with error..."
            errorMessage="This field contains an error"
            [(ngModel)]="stateError"
            (textareaChange)="onTextareaChange('state-error', $event)"
          />
        </div>
      </section>

      <!-- Interactive States -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive States</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-textarea 
            label="Disabled textarea"
            [disabled]="true"
            placeholder="This textarea is disabled"
            [(ngModel)]="stateDisabled"
          />
          <ui-textarea 
            label="Readonly textarea"
            [readonly]="true"
            placeholder="This textarea is readonly"
            [(ngModel)]="stateReadonly"
          />
          <ui-textarea 
            label="Required field"
            [required]="true"
            placeholder="This field is required"
            [(ngModel)]="stateRequired"
            (textareaChange)="onTextareaChange('state-required', $event)"
          />
          <ui-textarea 
            label="Loading state"
            [loading]="true"
            placeholder="This textarea is in loading state"
            [(ngModel)]="stateLoading"
            (textareaChange)="onTextareaChange('state-loading', $event)"
          />
        </div>
      </section>

      <!-- Character Limits and Counters -->
      <section style="margin-bottom: 3rem;">
        <h3>Character Limits and Counters</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-textarea 
            label="Textarea with character limit"
            placeholder="You have 100 characters max..."
            [maxLength]="100"
            [showCharacterCount]="true"
            helperText="Please keep your message concise"
            [(ngModel)]="charLimit1"
            (textareaChange)="onTextareaChange('char-limit-1', $event)"
          />
          <ui-textarea 
            label="Tweet-style limit"
            placeholder="What's happening?"
            [maxLength]="280"
            [showCharacterCount]="true"
            [(ngModel)]="charLimit2"
            (textareaChange)="onTextareaChange('char-limit-2', $event)"
          />
          <ui-textarea 
            label="Long form content"
            placeholder="Write your article here..."
            [maxLength]="1000"
            [showCharacterCount]="true"
            [rows]="8"
            [(ngModel)]="charLimit3"
            (textareaChange)="onTextareaChange('char-limit-3', $event)"
          />
        </div>
      </section>

      <!-- Row and Resize Options -->
      <section style="margin-bottom: 3rem;">
        <h3>Rows and Resize Options</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-textarea 
            label="2 rows (compact)"
            placeholder="Short input area..."
            [rows]="2"
            resize="none"
            [(ngModel)]="rowsCompact"
            (textareaChange)="onTextareaChange('rows-compact', $event)"
          />
          <ui-textarea 
            label="6 rows (expanded)"
            placeholder="Larger input area..."
            [rows]="6"
            resize="vertical"
            [(ngModel)]="rowsExpanded"
            (textareaChange)="onTextareaChange('rows-expanded', $event)"
          />
          <ui-textarea 
            label="Auto-resize textarea"
            placeholder="This textarea will grow as you type..."
            [autoResize]="true"
            [rows]="3"
            [(ngModel)]="autoResizeTextarea"
            (textareaChange)="onTextareaChange('auto-resize', $event)"
          />
          <ui-textarea 
            label="Horizontal resize"
            placeholder="You can resize this horizontally..."
            resize="horizontal"
            [(ngModel)]="horizontalResize"
            (textareaChange)="onTextareaChange('horizontal-resize', $event)"
          />
          <ui-textarea 
            label="Both directions resize"
            placeholder="Resize in any direction..."
            resize="both"
            [(ngModel)]="bothResize"
            (textareaChange)="onTextareaChange('both-resize', $event)"
          />
        </div>
      </section>

      <!-- Icons and Clearable -->
      <section style="margin-bottom: 3rem;">
        <h3>Icons and Clearable Features</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-textarea 
            label="With prefix icon"
            placeholder="Type your comment..."
            [prefixIcon]="faComment"
            [(ngModel)]="iconPrefix"
            (textareaChange)="onTextareaChange('icon-prefix', $event)"
          />
          <ui-textarea 
            label="With suffix icon"
            placeholder="Write your email content..."
            [suffixIcon]="faEnvelope"
            [(ngModel)]="iconSuffix"
            (textareaChange)="onTextareaChange('icon-suffix', $event)"
          />
          <ui-textarea 
            label="Clearable textarea"
            placeholder="You can clear this easily..."
            [clearable]="true"
            [prefixIcon]="faEdit"
            [(ngModel)]="clearableTextarea"
            (textareaChange)="onTextareaChange('clearable', $event)"
            (clear)="onClear('clearable')"
          />
        </div>
      </section>

      <!-- Interactive Controls -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Controls</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button 
            style="padding: 0.5rem 1rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="fillSampleText()"
          >
            Fill Sample Text
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="clearAllTextareas()"
          >
            Clear All
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #6f42c1; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleDisabled()"
          >
            {{ globalDisabled() ? 'Enable All' : 'Disable All' }}
          </button>
        </div>
        
        @if (lastChange()) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last change:</strong> {{ lastChange() }}
          </div>
        }
      </section>

      <!-- Code Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Code Examples</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; margin-bottom: 1rem;">
          <h4>Basic Usage:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-textarea 
  label="Message"
  placeholder="Enter your message..."
  [(ngModel)]="message"
  (textareaChange)="onMessageChange($event)"&gt;
&lt;/ui-textarea&gt;</code></pre>

          <h4>With Character Limit:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-textarea 
  label="Tweet"
  placeholder="What's happening?"
  [maxLength]="280"
  [showCharacterCount]="true"
  size="lg"
  [(ngModel)]="tweetText"&gt;
&lt;/ui-textarea&gt;</code></pre>

          <h4>Auto-resize with Validation:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-textarea 
  label="Feedback"
  [required]="true"
  [autoResize]="true"
  [clearable]="true"
  state="error"
  errorMessage="Please provide feedback"
  [prefixIcon]="faComment"
  [(ngModel)]="feedback"&gt;
&lt;/ui-textarea&gt;</code></pre>

          <h4>Resize Options:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>// Resize options:
resize="none"       // No resize
resize="vertical"   // Vertical only (default)
resize="horizontal" // Horizontal only
resize="both"       // Both directions</code></pre>
        </div>
      </section>

      <!-- Current Values -->
      <section style="margin-bottom: 3rem;">
        <h3>Current Values</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; max-height: 400px; overflow-y: auto;">
          <pre>{{ getCurrentValues() }}</pre>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(279, 14%, 35%);
      font-size: 1.2rem;
      margin-bottom: 0.5rem;
    }
    
    pre {
      margin: 0;
      font-family: 'Courier New', monospace;
      font-size: 0.9rem;
      line-height: 1.4;
    }
    
    code {
      color: hsl(279, 14%, 15%);
    }
    
    section {
      border: 1px solid #e9ecef;
      padding: 1.5rem;
      border-radius: 8px;
      background: #ffffff;
    }
    
    button:hover {
      opacity: 0.9;
      transform: translateY(-1px);
    }
  `]
})
export class TextareaDemoComponent {
  // FontAwesome icons
  readonly faComment = faComment;
  readonly faEdit = faEdit;
  readonly faEnvelope = faEnvelope;

  // Basic textareas
  basicTextarea1 = signal<string>('');
  basicTextarea2 = signal<string>('');
  basicTextarea3 = signal<string>('This is pre-filled content that demonstrates how the textarea looks with existing text.');

  // Size variants
  sizeSmall = signal<string>('');
  sizeMedium = signal<string>('');
  sizeLarge = signal<string>('');

  // Style variants
  variantOutlined = signal<string>('');
  variantFilled = signal<string>('');
  variantUnderlined = signal<string>('');

  // States
  stateDefault = signal<string>('');
  stateSuccess = signal<string>('Great job on completing this form!');
  stateWarning = signal<string>('Please review this content carefully.');
  stateError = signal<string>('This content has some issues.');

  // Interactive states
  stateDisabled = signal<string>('This content cannot be edited');
  stateReadonly = signal<string>('This is read-only information that you can view but not modify');
  stateRequired = signal<string>('');
  stateLoading = signal<string>('');

  // Character limits
  charLimit1 = signal<string>('');
  charLimit2 = signal<string>('');
  charLimit3 = signal<string>('');

  // Rows and resize
  rowsCompact = signal<string>('');
  rowsExpanded = signal<string>('');
  autoResizeTextarea = signal<string>('Start typing and watch this textarea grow automatically as you add more content...');
  horizontalResize = signal<string>('');
  bothResize = signal<string>('');

  // Icons and clearable
  iconPrefix = signal<string>('');
  iconSuffix = signal<string>('');
  clearableTextarea = signal<string>('You can clear this text by clicking the X button');

  // Control states
  globalDisabled = signal<boolean>(false);
  lastChange = signal<string>('');

  onTextareaChange(textareaId: string, value: string): void {
    const preview = value.length > 50 ? value.substring(0, 50) + '...' : value;
    this.lastChange.set(`${textareaId}: "${preview}" (${value.length} chars)`);
    console.log(`Textarea ${textareaId} changed:`, value);
  }

  onClear(textareaId: string): void {
    this.lastChange.set(`${textareaId}: cleared`);
    console.log(`Textarea ${textareaId} cleared`);
  }

  fillSampleText(): void {
    const sampleTexts = [
      'This is sample text for demonstration purposes.',
      'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
      'Here is some example content to show how the textarea handles different amounts of text.',
      'Sample content with multiple lines.\nSecond line of content.\nThird line for testing.',
      'Short text',
      'A longer piece of sample text that demonstrates how the textarea component handles various lengths of content and provides a good example for testing purposes.'
    ];

    this.basicTextarea1.set(sampleTexts[0]);
    this.basicTextarea2.set(sampleTexts[1]);
    this.sizeSmall.set(sampleTexts[4]);
    this.sizeMedium.set(sampleTexts[2]);
    this.sizeLarge.set(sampleTexts[5]);
    this.variantOutlined.set(sampleTexts[0]);
    this.variantFilled.set(sampleTexts[1]);
    this.variantUnderlined.set(sampleTexts[2]);
    this.stateDefault.set(sampleTexts[3]);
    this.stateRequired.set(sampleTexts[0]);
    this.stateLoading.set(sampleTexts[1]);
    this.charLimit1.set('Sample text within limit');
    this.charLimit2.set('This is a tweet-style message that fits within the character limit.');
    this.charLimit3.set(sampleTexts[5]);
    this.rowsCompact.set('Compact');
    this.rowsExpanded.set(sampleTexts[3]);
    this.iconPrefix.set('Comment with icon');
    this.iconSuffix.set('Email content here');
    this.clearableTextarea.set('This text can be cleared');
    
    this.lastChange.set('All textareas filled with sample text');
  }

  clearAllTextareas(): void {
    this.basicTextarea1.set('');
    this.basicTextarea2.set('');
    this.sizeSmall.set('');
    this.sizeMedium.set('');
    this.sizeLarge.set('');
    this.variantOutlined.set('');
    this.variantFilled.set('');
    this.variantUnderlined.set('');
    this.stateDefault.set('');
    this.stateRequired.set('');
    this.stateLoading.set('');
    this.charLimit1.set('');
    this.charLimit2.set('');
    this.charLimit3.set('');
    this.rowsCompact.set('');
    this.rowsExpanded.set('');
    this.autoResizeTextarea.set('');
    this.horizontalResize.set('');
    this.bothResize.set('');
    this.iconPrefix.set('');
    this.iconSuffix.set('');
    this.clearableTextarea.set('');
    
    this.lastChange.set('All textareas cleared');
  }

  toggleDisabled(): void {
    this.globalDisabled.update(disabled => !disabled);
    this.lastChange.set(`Global disabled: ${this.globalDisabled() ? 'enabled' : 'disabled'}`);
  }

  getCurrentValues(): string {
    const values = {
      basic: {
        textarea1: this.basicTextarea1(),
        textarea2: this.basicTextarea2(),
        textarea3: this.basicTextarea3()
      },
      sizes: {
        small: this.sizeSmall(),
        medium: this.sizeMedium(),
        large: this.sizeLarge()
      },
      variants: {
        outlined: this.variantOutlined(),
        filled: this.variantFilled(),
        underlined: this.variantUnderlined()
      },
      states: {
        default: this.stateDefault(),
        success: this.stateSuccess(),
        warning: this.stateWarning(),
        error: this.stateError(),
        disabled: this.stateDisabled(),
        readonly: this.stateReadonly(),
        required: this.stateRequired(),
        loading: this.stateLoading()
      },
      characterLimits: {
        limit100: this.charLimit1(),
        limit280: this.charLimit2(),
        limit1000: this.charLimit3()
      },
      rowsAndResize: {
        compact: this.rowsCompact(),
        expanded: this.rowsExpanded(),
        autoResize: this.autoResizeTextarea(),
        horizontal: this.horizontalResize(),
        both: this.bothResize()
      },
      iconsAndClearable: {
        prefix: this.iconPrefix(),
        suffix: this.iconSuffix(),
        clearable: this.clearableTextarea()
      },
      controls: {
        globalDisabled: this.globalDisabled(),
        lastChange: this.lastChange()
      }
    };
    
    return JSON.stringify(values, null, 2);
  }
}cFfx1import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { TimePickerComponent, TimeValue } from '../../../../../ui-essentials/src/lib/components/forms/time-picker/time-picker.component';

@Component({
  selector: 'ui-time-picker-demo',
  standalone: true,
  imports: [CommonModule, FormsModule, TimePickerComponent],
  template: `
    <div class="demo-container">
      <h2>Time Picker Demo</h2>
      
      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          @for (size of sizes; track size) {
            <div class="demo-item">
              <h4>{{ size | uppercase }}</h4>
              <ui-time-picker 
                [size]="size"
                [label]="size + ' Time Picker'"
                [placeholder]="'Select time'"
                [(ngModel)]="sampleValues[size]">
              </ui-time-picker>
            </div>
          }
        </div>
      </section>
      
      <!-- Variant Styles -->
      <section class="demo-section">
        <h3>Variants</h3>
        <div class="demo-row">
          @for (variant of variants; track variant) {
            <div class="demo-item">
              <h4>{{ variant | titlecase }}</h4>
              <ui-time-picker 
                [variant]="variant"
                [label]="variant + ' Variant'"
                [placeholder]="'Select time'"
                [(ngModel)]="variantValues[variant]">
              </ui-time-picker>
            </div>
          }
        </div>
      </section>
      
      <!-- Time Formats -->
      <section class="demo-section">
        <h3>Time Formats</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>12-Hour Format</h4>
            <ui-time-picker 
              label="12-Hour Time"
              placeholder="Select time"
              timeFormat="12"
              helperText="Uses AM/PM format"
              [(ngModel)]="formatValues['twelve']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>24-Hour Format</h4>
            <ui-time-picker 
              label="24-Hour Time"
              placeholder="Select time"
              timeFormat="24"
              helperText="Military time format"
              [(ngModel)]="formatValues['twentyFour']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>With Seconds</h4>
            <ui-time-picker 
              label="Time with Seconds"
              placeholder="Select time"
              [showSeconds]="true"
              helperText="Includes seconds picker"
              [(ngModel)]="formatValues['withSeconds']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>Custom Steps</h4>
            <ui-time-picker 
              label="Custom Minute Steps"
              placeholder="Select time"
              [minuteStep]="15"
              [secondStep]="30"
              [showSeconds]="true"
              helperText="15-minute and 30-second steps"
              [(ngModel)]="formatValues['customSteps']">
            </ui-time-picker>
          </div>
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Default</h4>
            <ui-time-picker 
              label="Default State"
              placeholder="Select time"
              helperText="Choose your preferred time"
              [(ngModel)]="stateValues['default']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>Error</h4>
            <ui-time-picker 
              label="Error State"
              placeholder="Select time"
              state="error"
              errorMessage="Please select a valid time"
              [(ngModel)]="stateValues['error']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>Success</h4>
            <ui-time-picker 
              label="Success State"
              placeholder="Select time"
              state="success"
              helperText="Perfect timing!"
              [(ngModel)]="stateValues['success']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>Warning</h4>
            <ui-time-picker 
              label="Warning State"
              placeholder="Select time"
              state="warning"
              helperText="Time is outside business hours"
              [(ngModel)]="stateValues['warning']">
            </ui-time-picker>
          </div>
        </div>
      </section>
      
      <!-- Special Features -->
      <section class="demo-section">
        <h3>Features</h3>
        <div class="demo-row">
          <div class="demo-item">
            <h4>Required Field</h4>
            <ui-time-picker 
              label="Required Time"
              placeholder="Select time"
              [required]="true"
              helperText="This field is required"
              [(ngModel)]="featureValues['required']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>Disabled</h4>
            <ui-time-picker 
              label="Disabled Time Picker"
              placeholder="Cannot select"
              [disabled]="true"
              helperText="This field is disabled"
              [(ngModel)]="featureValues['disabled']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>Not Clearable</h4>
            <ui-time-picker 
              label="No Clear Button"
              placeholder="Select time"
              [clearable]="false"
              helperText="Clear button is hidden"
              [(ngModel)]="featureValues['notClearable']">
            </ui-time-picker>
          </div>
          
          <div class="demo-item">
            <h4>With Presets</h4>
            <ui-time-picker 
              label="Quick Time Selection"
              placeholder="Select time"
              [presetTimes]="presetTimes"
              helperText="Includes common time presets"
              [(ngModel)]="featureValues['presets']">
            </ui-time-picker>
          </div>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive Example</h3>
        <div class="demo-interactive">
          <ui-time-picker 
            label="Meeting Time"
            placeholder="Select meeting time"
            helperText="Choose a time for your meeting"
            [showSeconds]="true"
            [(ngModel)]="interactiveValue"
            (timeChange)="onTimeChange($event)">
          </ui-time-picker>
          
          <div class="demo-output">
            <h4>Selected Time:</h4>
            <p>{{ interactiveValue ? formatTime(interactiveValue) : 'No time selected' }}</p>
            <p><strong>24-hour format:</strong> {{ interactiveValue ? format24Hour(interactiveValue) : 'N/A' }}</p>
            <p><strong>Change count:</strong> {{ changeCount }}</p>
          </div>
        </div>
      </section>
      
      <!-- Form Integration -->
      <section class="demo-section">
        <h3>Form Integration</h3>
        <form (ngSubmit)="onSubmit()" #demoForm="ngForm" class="demo-form">
          <div class="form-row">
            <ui-time-picker 
              label="Start Time"
              name="startTime"
              placeholder="Select start time"
              [(ngModel)]="formValues.startTime"
[required]="true"
              #startTime="ngModel">
            </ui-time-picker>
            
            <ui-time-picker 
              label="End Time"
              name="endTime"
              placeholder="Select end time"
              [(ngModel)]="formValues.endTime"
[required]="true"
              #endTime="ngModel">
            </ui-time-picker>
          </div>
          
          <div class="form-row">
            <ui-time-picker 
              label="Break Time"
              name="breakTime"
              placeholder="Select break time"
              [presetTimes]="breakPresets"
              [(ngModel)]="formValues.breakTime"
              #breakTime="ngModel">
            </ui-time-picker>
            
            <ui-time-picker 
              label="Meeting Duration"
              name="duration"
              placeholder="Select duration"
              [showSeconds]="true"
              [minuteStep]="15"
              [(ngModel)]="formValues.duration"
              #duration="ngModel">
            </ui-time-picker>
          </div>
          
          <div class="form-actions">
            <button type="submit" [disabled]="!demoForm.valid" class="submit-btn">
              Submit Form
            </button>
            <button type="button" (click)="resetForm(demoForm)" class="reset-btn">
              Reset
            </button>
          </div>
          
          <div class="form-status">
            <p><strong>Form Valid:</strong> {{ demoForm.valid }}</p>
            <p><strong>Form Values:</strong></p>
            <pre>{{ formValues | json }}</pre>
          </div>
        </form>
      </section>
    </div>
  `,
  styleUrl: './time-picker-demo.component.scss'
})
export class TimePickerDemoComponent {
  sizes = ['sm', 'md', 'lg'] as const;
  variants = ['outlined', 'filled', 'underlined'] as const;
  
  sampleValues: Record<string, TimeValue | null> = {
    sm: null,
    md: null,
    lg: null
  };
  
  variantValues: Record<string, TimeValue | null> = {
    outlined: null,
    filled: null,
    underlined: null
  };
  
  formatValues: Record<string, TimeValue | null> = {
    twelve: null,
    twentyFour: null,
    withSeconds: null,
    customSteps: null
  };
  
  stateValues: Record<string, TimeValue | null> = {
    default: null,
    error: null,
    success: { hours: 9, minutes: 30, seconds: 0 },
    warning: null
  };
  
  featureValues: Record<string, TimeValue | null> = {
    required: null,
    disabled: { hours: 12, minutes: 0, seconds: 0 },
    notClearable: null,
    presets: null
  };
  
  interactiveValue: TimeValue | null = null;
  changeCount = 0;
  
  formValues = {
    startTime: null as TimeValue | null,
    endTime: null as TimeValue | null,
    breakTime: null as TimeValue | null,
    duration: null as TimeValue | null
  };
  
  // Preset times for demo
  presetTimes = [
    { label: '9:00 AM', value: { hours: 9, minutes: 0, seconds: 0 } },
    { label: '12:00 PM', value: { hours: 12, minutes: 0, seconds: 0 } },
    { label: '1:00 PM', value: { hours: 13, minutes: 0, seconds: 0 } },
    { label: '5:00 PM', value: { hours: 17, minutes: 0, seconds: 0 } }
  ];
  
  breakPresets = [
    { label: '15 min', value: { hours: 0, minutes: 15, seconds: 0 } },
    { label: '30 min', value: { hours: 0, minutes: 30, seconds: 0 } },
    { label: '1 hour', value: { hours: 1, minutes: 0, seconds: 0 } }
  ];
  
  onTimeChange(time: TimeValue | null): void {
    this.changeCount++;
    console.log('Time changed:', time);
  }
  
  onSubmit(): void {
    console.log('Form submitted:', this.formValues);
    alert('Form submitted! Check console for values.');
  }
  
  resetForm(form: any): void {
    form.resetForm();
    this.formValues = {
      startTime: null,
      endTime: null,
      breakTime: null,
      duration: null
    };
  }
  
  formatTime(time: TimeValue): string {
    const hours = time.hours;
    const displayHour = hours === 0 ? 12 : hours > 12 ? hours - 12 : hours;
    const period = hours >= 12 ? 'PM' : 'AM';
    const minutes = time.minutes.toString().padStart(2, '0');
    
    if (time.seconds !== undefined && time.seconds > 0) {
      const seconds = time.seconds.toString().padStart(2, '0');
      return `${displayHour}:${minutes}:${seconds} ${period}`;
    }
    
    return `${displayHour}:${minutes} ${period}`;
  }
  
  format24Hour(time: TimeValue): string {
    const hours = time.hours.toString().padStart(2, '0');
    const minutes = time.minutes.toString().padStart(2, '0');
    
    if (time.seconds !== undefined && time.seconds > 0) {
      const seconds = time.seconds.toString().padStart(2, '0');
      return `${hours}:${minutes}:${seconds}`;
    }
    
    return `${hours}:${minutes}`;
  }
}JxXYS#7~Wtærl0&Te䅢bF4D 9gye<Q_jub<_
3)A=H#)>0ᴊڮ,	Zhrn֡Z#9#\
zqrY!1kwvZO; r&S	i$mn	G#0*Y
QoS{F1'xp;8zаj: j8$i{$[it=R(F4Ť(ɞZ+B"±b~$.G`!م'B ChO q.yq5+v=hKbjָ~C4le=OCy񸇖f;KǽUA;]rwre?e[E0?mCFbÉF!<@$%׉_T3:"	7!Y9Ʉ5Gm0B"G[CM
!i1X~r] DOie/y&ɖD({qJ^.x-ǒC/Csk6H!峒#Eqb7ieϝAYA#V,"jZ^-|RH,oA#;e+Rυx(v=Aϖ:av|Zq	Cl6JBRM!Rex̩WvCzimwj];RBAza58
5>HB̗.҆nDy	X1^yj6XZ\+'Țr*fZfB1Oq JG7爮nvw胛\8	a>v0mhF5ɴe)J%D&	XE"iTB]NnϏ_WYnSk{8;TxummqnX=7?x2g24,C`v1$1(8		Q<a"edgPt+2%g^\[cxhFu*L{33`WNw=%ȗ( 8R:QDaI0bTW;p"&Qc*Fv26+絼*VdVt}oλMݙ7a!\}[:`:4J8b'޶-￐L_s}H{5+w	nlBl0?ZD UJi9M]xO`$-h楌$cM
M9'azb&T׺S;FoOo2|Y&ZpK'TUG	a+l,V.
D~pG 6D2Mbam34A4`#iYWn+wP^`GkέxKǥB:{-I0dT5QU,ٯ8C'74Bb1mǴ3;UV乺ˇŊ&cխG25ǡuz^l${Â687aC\㚚U5,y[-Gp'Yy5 ]+E7ONגφ>c١!hO_V^xXA8쾻/'ky;u>ِTO(űVՃ?1ihar 8!}OŊmd]%;_U!:bF`.:xYo6_q͋$۵ON4H7,][1HCTRw]dx;>R 2)^l^&L#dOʸLx7QC+4w?rMDƉ%v8oYe\T=Ჿɬ8_r-Su̒NX(e'luϫBc/j8jxdQ= RM`1Ob 
Ur	\=Z|C	+PgpD	zO#\d\d7p:Ɵ;B&1+	s Q(YQCٜk@\̬8rg!\8Ŕ`p57ʻJuRШ`m` 4-.g@O}. !<MyևK<@^kt3ݧ>\oN88(>ܑNh$`rں2Mic4'ZN>]!1;9oa'kBgxk'{2G4M;{ŏ;)UfG_l&2&H|>x?7zg"Ĳ:tqk|2#n5X n9,>w&4}'APf݆:AohT&(WraaPDqGٰv$肍OZ")+I&XL(*~gXZ$5#KorFDH%\-tPM,
<s%˼a,BG>JLڎ=}9 N3\,ʾ>e1X②2:MdFn91Sµӱg\6kkX~L=&J|	g"Dt*",v'BxRb0=)IT+l;;yImRIxZc!2K?)@$vg[]*>xUn1y|mQ6oXe nHm\͹;Ev/|J\W7Q^˲SZfb7!lMp9,*;3}.V6]k&޸4lΤtHٖJq;ied&smbK6پ=w<+uNq_JaF(kƧROxZG4w龵=Ki;&*an6et31} Q	oNgzޗJ&0Jx#|և{[N`bS bҵLzS*jҘLdj,+ĉ1(b9nx$Xfl	IFUKf^eS4Gó?oȠF-X!ḌdGӍ6φˮ	zW!;|q;}6kusΙTM3\6 ǉ+z[Dr-.R{e}}bʜڡ*V9!ׯ02hUo;Z-|^=k\<Ww=H˹oUsjp7SSܵ3uEbb4ݗ֦jwE;(МF}@mgB?R<aֹE~f༅qs%jxhQp6n5,*7bWE
wW	OhP2RBd͗ѸQm䥾IR ΰ% 2..8C%Q]2=ZNSD9ዺ}9fJnᅛn4mVH<SVe'(V©quMb*ٞ>u$xdfB۝'Npڜ' o	ExdfB۝R2KK3uSSJ2s'.4ܜ' fCxBimport { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TooltipComponent } from '../../../../../ui-essentials/src/public-api';

@Component({
  selector: 'ui-tooltip-demo',
  standalone: true,
  imports: [CommonModule, TooltipComponent],
  template: `
    <div class="demo-container">
      <h2>Tooltip Demo</h2>
      
      <!-- Positions -->
      <section class="demo-section">
        <h3>Positions</h3>
        <div class="positions-grid">
          <ui-tooltip text="Top tooltip" position="top">
            <button class="demo-button">Top</button>
          </ui-tooltip>
          <ui-tooltip text="Bottom tooltip" position="bottom">
            <button class="demo-button">Bottom</button>
          </ui-tooltip>
          <ui-tooltip text="Left tooltip" position="left">
            <button class="demo-button">Left</button>
          </ui-tooltip>
          <ui-tooltip text="Right tooltip" position="right">
            <button class="demo-button">Right</button>
          </ui-tooltip>
        </div>
      </section>
      
      <!-- Sizes -->
      <section class="demo-section">
        <h3>Sizes</h3>
        <div class="demo-row">
          <ui-tooltip text="Small tooltip with concise text" size="sm">
            <button class="demo-button">Small</button>
          </ui-tooltip>
          <ui-tooltip text="Medium tooltip with moderate amount of text content" size="md">
            <button class="demo-button">Medium</button>
          </ui-tooltip>
          <ui-tooltip text="Large tooltip with extensive text content that can wrap to multiple lines for better readability" size="lg">
            <button class="demo-button">Large</button>
          </ui-tooltip>
        </div>
      </section>
      
      <!-- Triggers -->
      <section class="demo-section">
        <h3>Triggers</h3>
        <div class="demo-row">
          <ui-tooltip text="Hover to see tooltip" trigger="hover">
            <button class="demo-button">Hover</button>
          </ui-tooltip>
          <ui-tooltip text="Click to toggle tooltip" trigger="click">
            <button class="demo-button">Click</button>
          </ui-tooltip>
          <ui-tooltip text="Focus to see tooltip" trigger="focus">
            <button class="demo-button">Focus</button>
          </ui-tooltip>
        </div>
      </section>
      
      <!-- Different Elements -->
      <section class="demo-section">
        <h3>Different Elements</h3>
        <div class="demo-row">
          <ui-tooltip text="Tooltip on button">
            <button class="demo-button">Button</button>
          </ui-tooltip>
          <ui-tooltip text="Tooltip on text">
            <span class="demo-text">Hover me</span>
          </ui-tooltip>
          <ui-tooltip text="Tooltip on icon">
            <div class="demo-icon">?</div>
          </ui-tooltip>
        </div>
      </section>
      
      <!-- States -->
      <section class="demo-section">
        <h3>States</h3>
        <div class="demo-row">
          <ui-tooltip text="Normal tooltip">
            <button class="demo-button">Normal</button>
          </ui-tooltip>
          <ui-tooltip text="This tooltip is disabled" [disabled]="true">
            <button class="demo-button">Disabled</button>
          </ui-tooltip>
        </div>
      </section>
      
      <!-- Custom Delay -->
      <section class="demo-section">
        <h3>Custom Delay</h3>
        <div class="demo-row">
          <ui-tooltip text="Fast tooltip (100ms)" [delay]="100">
            <button class="demo-button">Fast</button>
          </ui-tooltip>
          <ui-tooltip text="Normal tooltip (500ms)" [delay]="500">
            <button class="demo-button">Normal</button>
          </ui-tooltip>
          <ui-tooltip text="Slow tooltip (1000ms)" [delay]="1000">
            <button class="demo-button">Slow</button>
          </ui-tooltip>
        </div>
      </section>
      
      <!-- Interactive Example -->
      <section class="demo-section">
        <h3>Interactive</h3>
        <div class="demo-row">
          <ui-tooltip 
            text="Tooltip shown {{ showCount }} times" 
            (tooltipShow)="handleTooltipShow()"
            (tooltipHide)="handleTooltipHide()">
            <button class="demo-button">Track Events</button>
          </ui-tooltip>
          <p>Show count: {{ showCount }} | Hide count: {{ hideCount }}</p>
        </div>
      </section>
    </div>
  `,
  styleUrl: './tooltip-demo.component.scss'
})
export class TooltipDemoComponent {
  showCount = 0;
  hideCount = 0;
  
  handleTooltipShow(): void {
    this.showCount++;
    console.log('Tooltip shown', this.showCount);
  }
  
  handleTooltipHide(): void {
    this.hideCount++;
    console.log('Tooltip hidden', this.hideCount);
  }
}#xZ5import { Component, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TransferListComponent, TransferListItem } from '../../../../../ui-essentials/src/lib/components/data-display/transfer-list/transfer-list.component';

@Component({
  selector: 'ui-transfer-list-demo',
  standalone: true,
  imports: [CommonModule, TransferListComponent],
  template: `
    <div class="demo-container">
      <h2>Transfer List Demo</h2>
      
      <!-- Basic Example -->
      <section class="demo-section">
        <h3>Basic Transfer List</h3>
        <p class="demo-description">
          Select items from the source list and transfer them to the target list using the control buttons.
        </p>
        <ui-transfer-list
          [sourceItems]="basicSourceItems()"
          [targetItems]="basicTargetItems()"
          sourceTitle="Available Items"
          targetTitle="Selected Items"
          (sourceChange)="onBasicSourceChange($event)"
          (targetChange)="onBasicTargetChange($event)"
          (itemMove)="onItemMove($event)"
        ></ui-transfer-list>
      </section>

      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        <div class="demo-row demo-row--vertical">
          <div class="demo-item">
            <h4>Small</h4>
            <ui-transfer-list
              size="sm"
              [sourceItems]="sizeSourceItems()"
              [targetItems]="sizeTargetItems()"
              sourceTitle="Small List"
              targetTitle="Selected"
            ></ui-transfer-list>
          </div>
          
          <div class="demo-item">
            <h4>Medium (Default)</h4>
            <ui-transfer-list
              size="md"
              [sourceItems]="sizeSourceItems()"
              [targetItems]="sizeTargetItems()"
              sourceTitle="Medium List"
              targetTitle="Selected"
            ></ui-transfer-list>
          </div>
          
          <div class="demo-item">
            <h4>Large</h4>
            <ui-transfer-list
              size="lg"
              [sourceItems]="sizeSourceItems()"
              [targetItems]="sizeTargetItems()"
              sourceTitle="Large List"
              targetTitle="Selected"
            ></ui-transfer-list>
          </div>
        </div>
      </section>

      <!-- Configuration Options -->
      <section class="demo-section">
        <h3>Configuration Options</h3>
        
        <div class="demo-controls">
          <label>
            <input type="checkbox" [checked]="showSearch()" (change)="toggleSearch()">
            Show Search
          </label>
          <label>
            <input type="checkbox" [checked]="showSelectAll()" (change)="toggleSelectAll()">
            Show Select All
          </label>
          <label>
            <input type="checkbox" [checked]="showCheckboxes()" (change)="toggleCheckboxes()">
            Show Checkboxes
          </label>
          <label>
            <input type="checkbox" [checked]="showMoveAll()" (change)="toggleMoveAll()">
            Show Move All Buttons
          </label>
          <label>
            <input type="checkbox" [checked]="isDisabled()" (change)="toggleDisabled()">
            Disabled
          </label>
        </div>
        
        <ui-transfer-list
          [sourceItems]="configSourceItems()"
          [targetItems]="configTargetItems()"
          [showSearch]="showSearch()"
          [showSelectAll]="showSelectAll()"
          [showCheckboxes]="showCheckboxes()"
          [showMoveAll]="showMoveAll()"
          [disabled]="isDisabled()"
          sourceTitle="Configurable Source"
          targetTitle="Configurable Target"
          searchPlaceholder="Filter items..."
          (sourceChange)="onConfigSourceChange($event)"
          (targetChange)="onConfigTargetChange($event)"
        ></ui-transfer-list>
      </section>

      <!-- With Disabled Items -->
      <section class="demo-section">
        <h3>With Disabled Items</h3>
        <p class="demo-description">
          Some items can be disabled and cannot be selected or transferred.
        </p>
        <ui-transfer-list
          [sourceItems]="disabledSourceItems()"
          [targetItems]="disabledTargetItems()"
          sourceTitle="Mixed Items"
          targetTitle="Available Items"
          (sourceChange)="onDisabledSourceChange($event)"
          (targetChange)="onDisabledTargetChange($event)"
        ></ui-transfer-list>
      </section>

      <!-- Large Dataset -->
      <section class="demo-section">
        <h3>Large Dataset</h3>
        <p class="demo-description">
          Transfer list with a large number of items to test performance and search functionality.
        </p>
        <ui-transfer-list
          [sourceItems]="largeSourceItems()"
          [targetItems]="largeTargetItems()"
          sourceTitle="Large Dataset ({{ largeSourceItems().length }} items)"
          targetTitle="Selected Items"
          searchPlaceholder="Search in {{ largeSourceItems().length }} items..."
          (sourceChange)="onLargeSourceChange($event)"
          (targetChange)="onLargeTargetChange($event)"
        ></ui-transfer-list>
      </section>

      <!-- Custom Labels -->
      <section class="demo-section">
        <h3>Custom Labels & Accessibility</h3>
        <ui-transfer-list
          [sourceItems]="customSourceItems()"
          [targetItems]="customTargetItems()"
          sourceTitle="Available Permissions"
          targetTitle="Granted Permissions"
          searchPlaceholder="Search permissions..."
          ariaLabel="User permission management"
          (sourceChange)="onCustomSourceChange($event)"
          (targetChange)="onCustomTargetChange($event)"
        ></ui-transfer-list>
      </section>

      <!-- Event Log -->
      <section class="demo-section">
        <h3>Event Log</h3>
        <div class="demo-event-log">
          @if (eventLog().length === 0) {
            <p class="demo-no-events">No events logged yet. Interact with the transfer lists above to see events.</p>
          } @else {
            @for (event of eventLog(); track $index) {
              <div class="demo-event">
                <strong>{{ event.type }}:</strong> {{ event.message }}
                <small class="demo-event-time">{{ event.timestamp | date:'short' }}</small>
              </div>
            }
          }
          @if (eventLog().length > 0) {
            <button type="button" class="demo-clear-events" (click)="clearEventLog()">
              Clear Log
            </button>
          }
        </div>
      </section>
    </div>
  `,
  styleUrl: './transfer-list-demo.component.scss'
})
export class TransferListDemoComponent {
  // Basic example data
  basicSourceItems = signal<TransferListItem[]>([
    { id: 1, label: 'Apple' },
    { id: 2, label: 'Banana' },
    { id: 3, label: 'Cherry' },
    { id: 4, label: 'Date' },
    { id: 5, label: 'Elderberry' },
    { id: 6, label: 'Fig' },
    { id: 7, label: 'Grape' },
    { id: 8, label: 'Honeydew' }
  ]);

  basicTargetItems = signal<TransferListItem[]>([
    { id: 9, label: 'Orange' },
    { id: 10, label: 'Pear' }
  ]);

  // Size variant data
  sizeSourceItems = signal<TransferListItem[]>([
    { id: 'size1', label: 'Item 1' },
    { id: 'size2', label: 'Item 2' },
    { id: 'size3', label: 'Item 3' }
  ]);

  sizeTargetItems = signal<TransferListItem[]>([
    { id: 'size4', label: 'Item 4' }
  ]);

  // Configuration example data
  configSourceItems = signal<TransferListItem[]>([
    { id: 'config1', label: 'Configuration Option 1' },
    { id: 'config2', label: 'Configuration Option 2' },
    { id: 'config3', label: 'Configuration Option 3' },
    { id: 'config4', label: 'Configuration Option 4' },
    { id: 'config5', label: 'Configuration Option 5' }
  ]);

  configTargetItems = signal<TransferListItem[]>([]);

  // Configuration toggles
  showSearch = signal(true);
  showSelectAll = signal(true);
  showCheckboxes = signal(true);
  showMoveAll = signal(true);
  isDisabled = signal(false);

  // Disabled items example
  disabledSourceItems = signal<TransferListItem[]>([
    { id: 'dis1', label: 'Regular Item 1' },
    { id: 'dis2', label: 'Disabled Item', disabled: true },
    { id: 'dis3', label: 'Regular Item 2' },
    { id: 'dis4', label: 'Another Disabled Item', disabled: true },
    { id: 'dis5', label: 'Regular Item 3' }
  ]);

  disabledTargetItems = signal<TransferListItem[]>([]);

  // Large dataset
  largeSourceItems = signal<TransferListItem[]>(this.generateLargeDataset());
  largeTargetItems = signal<TransferListItem[]>([]);

  // Custom labels example
  customSourceItems = signal<TransferListItem[]>([
    { id: 'perm1', label: 'Read Users', data: { permission: 'users:read' } },
    { id: 'perm2', label: 'Write Users', data: { permission: 'users:write' } },
    { id: 'perm3', label: 'Delete Users', data: { permission: 'users:delete' } },
    { id: 'perm4', label: 'Read Posts', data: { permission: 'posts:read' } },
    { id: 'perm5', label: 'Write Posts', data: { permission: 'posts:write' } },
    { id: 'perm6', label: 'Delete Posts', data: { permission: 'posts:delete' } },
    { id: 'perm7', label: 'Manage Settings', data: { permission: 'settings:manage' } },
    { id: 'perm8', label: 'View Analytics', data: { permission: 'analytics:view' } }
  ]);

  customTargetItems = signal<TransferListItem[]>([]);

  // Event logging
  eventLog = signal<Array<{ type: string; message: string; timestamp: Date }>>([]);

  // Generate large dataset for performance testing
  private generateLargeDataset(): TransferListItem[] {
    const items: TransferListItem[] = [];
    const categories = ['Documents', 'Images', 'Videos', 'Audio', 'Archives', 'Code'];
    const types = ['Personal', 'Work', 'Project', 'Backup', 'Temp'];
    
    for (let i = 1; i <= 100; i++) {
      const category = categories[i % categories.length];
      const type = types[i % types.length];
      items.push({
        id: `large${i}`,
        label: `${category} - ${type} File ${i.toString().padStart(3, '0')}`,
        data: { category, type, index: i }
      });
    }
    return items;
  }

  // Event handlers for basic example
  onBasicSourceChange(items: TransferListItem[]) {
    this.basicSourceItems.set(items);
    this.logEvent('Source Change', `Basic source now has ${items.length} items`);
  }

  onBasicTargetChange(items: TransferListItem[]) {
    this.basicTargetItems.set(items);
    this.logEvent('Target Change', `Basic target now has ${items.length} items`);
  }

  // Event handlers for configuration example
  onConfigSourceChange(items: TransferListItem[]) {
    this.configSourceItems.set(items);
    this.logEvent('Config Source Change', `Config source now has ${items.length} items`);
  }

  onConfigTargetChange(items: TransferListItem[]) {
    this.configTargetItems.set(items);
    this.logEvent('Config Target Change', `Config target now has ${items.length} items`);
  }

  // Event handlers for disabled items example
  onDisabledSourceChange(items: TransferListItem[]) {
    this.disabledSourceItems.set(items);
    this.logEvent('Disabled Source Change', `Disabled source now has ${items.length} items`);
  }

  onDisabledTargetChange(items: TransferListItem[]) {
    this.disabledTargetItems.set(items);
    this.logEvent('Disabled Target Change', `Disabled target now has ${items.length} items`);
  }

  // Event handlers for large dataset example
  onLargeSourceChange(items: TransferListItem[]) {
    this.largeSourceItems.set(items);
    this.logEvent('Large Source Change', `Large source now has ${items.length} items`);
  }

  onLargeTargetChange(items: TransferListItem[]) {
    this.largeTargetItems.set(items);
    this.logEvent('Large Target Change', `Large target now has ${items.length} items`);
  }

  // Event handlers for custom example
  onCustomSourceChange(items: TransferListItem[]) {
    this.customSourceItems.set(items);
    this.logEvent('Custom Source Change', `Custom source now has ${items.length} items`);
  }

  onCustomTargetChange(items: TransferListItem[]) {
    this.customTargetItems.set(items);
    this.logEvent('Custom Target Change', `Custom target now has ${items.length} items`);
  }

  // Item move event handler
  onItemMove(event: { item: TransferListItem; from: 'source' | 'target'; to: 'source' | 'target' }) {
    this.logEvent('Item Move', `Moved "${event.item.label}" from ${event.from} to ${event.to}`);
  }

  // Configuration toggle methods
  toggleSearch() {
    this.showSearch.update(value => !value);
    this.logEvent('Config Change', `Search ${this.showSearch() ? 'enabled' : 'disabled'}`);
  }

  toggleSelectAll() {
    this.showSelectAll.update(value => !value);
    this.logEvent('Config Change', `Select All ${this.showSelectAll() ? 'enabled' : 'disabled'}`);
  }

  toggleCheckboxes() {
    this.showCheckboxes.update(value => !value);
    this.logEvent('Config Change', `Checkboxes ${this.showCheckboxes() ? 'enabled' : 'disabled'}`);
  }

  toggleMoveAll() {
    this.showMoveAll.update(value => !value);
    this.logEvent('Config Change', `Move All buttons ${this.showMoveAll() ? 'enabled' : 'disabled'}`);
  }

  toggleDisabled() {
    this.isDisabled.update(value => !value);
    this.logEvent('Config Change', `Component ${this.isDisabled() ? 'disabled' : 'enabled'}`);
  }

  // Event logging
  private logEvent(type: string, message: string) {
    this.eventLog.update(log => [
      { type, message, timestamp: new Date() },
      ...log.slice(0, 9) // Keep only the last 10 events
    ]);
  }

  clearEventLog() {
    this.eventLog.set([]);
  }
}x0yfxZO۸ϧ`rdL$EL6mñh$
"d:az@{HJ)QGKF,C=R
E%(x:hrLO%Ee-}Nȟ)#C9Pl}gW|Ǣj|"E/w8mEX!e1	@n)4sc|!Nb2, 1:È$,8AcD&M'Ǝi3>3)-H	п7"As~ޓ,$](Y/$h-~7kW9
4nQ:mf9	\71g,-/X\H~)?z.$u 9.́[(b:XyS`;\RB})tByooWd~ϖ˸Z͆_#1fnڞxFE}ybq);g%GáHԘT݅L"x?lJ&XsґL#ɤFZǂu1FxI#)AtvB!  +zz#-IѠD=b;p
-+Ia)w-`guW][#.;ߗX˕8I&;Rf&xWKr{ЂƐ[o7A_QHMλ0](a*I݋T,81}H{sZڈs8}E!FHK>h㌓ezTw3&8(elA\F6~OLU-`Hs۳c6m2ud53&yxNp,L}.oH}"s}(-H$-lOmq0xݴ4k]~mް{.H.?$n&PF0z׮Lᬞm-K% ,HOuԤJoiVys\%ԭﺏy<AA8rê9NX=UP]"tn(H"fs$  V(,	 H'ȝ(d5&'Je#|S\G̤*8eh'VPaz#gJ<_8I:)?Q{CZ?|_c&3]7lm"R4U!FLl<Ky }BUhO5ҬȽ}XߟBIkws,g
V$so N4޲%L_桊ѶYR(ڰ]Jv\}G8iNrtS݉?<
c'

}dq^)]!=!tݲxa Zxk17=:~?<"'YjycvxDf@+=%v}WL'li[m~>sgԫJ紺$UM\UN9UJrPXd',c%-VsvO߾3sWP`}_(Uy0(ܟێEһBthJ>̌PU4V,0fkb馝P=@P7tNvvΨl(88(l7 8^~a&n#o\0QABpRCex*Vk% 	ӆY2/_mKHQǿ	 ˃bU}ֶ⎱`8&hhTdKU4HrՃK]G]vJq9tN<
!?0*%ucm[U)|[txVnJhs8e1BJ2A`Bұ."h0Pk5Lpև]T:?0v|AfJW#iX;7XXψLmu[S&ZY툹R8w.1a.1@xm)䝜K0^LҥXm+vkw͈+	zԭ|nF3t|N5Y\ԟ,Je)z~WB_9ET}ۧdLY<7LreښsK-:U+G{6}lJ$;}ٚXO0l˕'`D z!ep@XU1y|s|4x&xB_~FFi  eel	xHmimport { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { VideoPlayerComponent, VideoSource, VideoTrack, VideoPlayerSize, VideoPlayerVariant } from '../../../../../ui-essentials/src/lib/components/media/video-player/video-player.component';

@Component({
  selector: 'app-video-player-demo',
  standalone: true,
  imports: [
    CommonModule,
    VideoPlayerComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div class="video-player-demo">
      <h2>Video Player Component Showcase</h2>
      
      <!-- Video Player Variants -->
      <section class="demo-section">
        <h3>Video Player Variants</h3>
        
        <div class="variant-demo">
          <h4>Default Player</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              [tracks]="videoTracks()"
              poster="https://images.unsplash.com/photo-1574717024653-61fd2cf4d44d?w=800&h=450&fit=crop"
              variant="default"
              size="md"
              [showControls]="true"
              [showVolumeControl]="true"
              [allowFullscreen]="true"
              ariaLabel="Demo video player"
              (play)="handleVideoEvent('Default player started playing')"
              (pause)="handleVideoEvent('Default player paused')"
              (ended)="handleVideoEvent('Default player ended')"
              (timeUpdate)="handleTimeUpdate($event)"
              (volumeChange)="handleVolumeChange($event)"
              (fullscreenChange)="handleFullscreenChange($event)"
              (error)="handleVideoError($event)">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Minimal Player</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1611162617474-5b21e879e113?w=800&h=450&fit=crop"
              variant="minimal"
              size="sm"
              [showControls]="true"
              [showVolumeControl]="false"
              [allowFullscreen]="false"
              ariaLabel="Minimal video player">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Theater Player</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1440404653325-ab127d49abc1?w=800&h=450&fit=crop"
              variant="theater"
              size="lg"
              [showControls]="true"
              [showVolumeControl]="true"
              [allowFullscreen]="true"
              [autoplay]="false"
              [muted]="true"
              ariaLabel="Theater video player">
            </ui-video-player>
          </div>
        </div>
      </section>

      <!-- Size Variants -->
      <section class="demo-section">
        <h3>Size Variants</h3>
        
        <div class="variant-demo">
          <h4>Small (sm)</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1598300042247-d088f8ab3a91?w=400&h=225&fit=crop"
              size="sm"
              [showControls]="true"
              ariaLabel="Small video player">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Medium (md) - Default</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1574717024653-61fd2cf4d44d?w=600&h=337&fit=crop"
              size="md"
              [showControls]="true"
              ariaLabel="Medium video player">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Large (lg)</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1440404653325-ab127d49abc1?w=800&h=450&fit=crop"
              size="lg"
              [showControls]="true"
              ariaLabel="Large video player">
            </ui-video-player>
          </div>
        </div>
      </section>

      <!-- Feature Demonstrations -->
      <section class="demo-section">
        <h3>Feature Demonstrations</h3>
        
        <div class="variant-demo">
          <h4>Player with Subtitles</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              [tracks]="videoTracks()"
              poster="https://images.unsplash.com/photo-1611162617474-5b21e879e113?w=800&h=450&fit=crop"
              [showControls]="true"
              ariaLabel="Video player with subtitles">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Autoplay Player (Muted)</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1598300042247-d088f8ab3a91?w=800&h=450&fit=crop"
              [autoplay]="true"
              [muted]="true"
              [loop]="true"
              [showControls]="true"
              ariaLabel="Autoplay video player">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Player without Volume Control</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1574717024653-61fd2cf4d44d?w=800&h=450&fit=crop"
              [showControls]="true"
              [showVolumeControl]="false"
              ariaLabel="Video player without volume control">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Disabled Player</h4>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1440404653325-ab127d49abc1?w=800&h=450&fit=crop"
              [disabled]="true"
              [showControls]="true"
              ariaLabel="Disabled video player">
            </ui-video-player>
          </div>
        </div>
      </section>

      <!-- Interactive Demo -->
      <section class="demo-section">
        <h3>Interactive Demo</h3>
        <p class="demo-description">
          Customize the video player below by toggling different options:
        </p>
        
        <div class="controls-grid">
          <label class="control-label">
            <input 
              type="checkbox" 
              [checked]="demoConfig().autoplay" 
              (change)="updateDemoConfig('autoplay', $event)">
            Autoplay (muted)
          </label>
          <label class="control-label">
            <input 
              type="checkbox" 
              [checked]="demoConfig().loop" 
              (change)="updateDemoConfig('loop', $event)">
            Loop
          </label>
          <label class="control-label">
            <input 
              type="checkbox" 
              [checked]="demoConfig().showControls" 
              (change)="updateDemoConfig('showControls', $event)">
            Show Controls
          </label>
          <label class="control-label">
            <input 
              type="checkbox" 
              [checked]="demoConfig().showVolumeControl" 
              (change)="updateDemoConfig('showVolumeControl', $event)">
            Volume Control
          </label>
          <label class="control-label">
            <input 
              type="checkbox" 
              [checked]="demoConfig().allowFullscreen" 
              (change)="updateDemoConfig('allowFullscreen', $event)">
            Fullscreen
          </label>
          <label class="control-label">
            <input 
              type="checkbox" 
              [checked]="demoConfig().disabled" 
              (change)="updateDemoConfig('disabled', $event)">
            Disabled
          </label>
        </div>

        <div class="select-controls">
          <label class="select-label">
            Size:
            <select 
              [value]="demoConfig().size" 
              (change)="updateDemoSize($event)"
              class="demo-select">
              <option value="sm">Small</option>
              <option value="md">Medium</option>
              <option value="lg">Large</option>
            </select>
          </label>
          <label class="select-label">
            Variant:
            <select 
              [value]="demoConfig().variant" 
              (change)="updateDemoVariant($event)"
              class="demo-select">
              <option value="default">Default</option>
              <option value="minimal">Minimal</option>
              <option value="theater">Theater</option>
            </select>
          </label>
        </div>

        <div class="player-container">
          <ui-video-player
            [sources]="basicVideoSources()"
            [tracks]="videoTracks()"
            [poster]="demoConfig().poster"
            [size]="demoConfig().size"
            [variant]="demoConfig().variant"
            [autoplay]="demoConfig().autoplay"
            [loop]="demoConfig().loop"
            [muted]="demoConfig().autoplay"
            [showControls]="demoConfig().showControls"
            [showVolumeControl]="demoConfig().showVolumeControl"
            [allowFullscreen]="demoConfig().allowFullscreen"
            [disabled]="demoConfig().disabled"
            ariaLabel="Interactive demo video player"
            (play)="handleVideoEvent('Interactive player started playing')"
            (pause)="handleVideoEvent('Interactive player paused')"
            (ended)="handleVideoEvent('Interactive player ended')"
            (timeUpdate)="handleTimeUpdate($event)"
            (volumeChange)="handleVolumeChange($event)"
            (fullscreenChange)="handleFullscreenChange($event)"
            (error)="handleVideoError($event)">
          </ui-video-player>
        </div>

        @if (lastEvent()) {
          <div class="event-display">
            <strong>Last event:</strong> {{ lastEvent() }}
          </div>
        }
      </section>

      <!-- Real-world Examples -->
      <section class="demo-section">
        <h3>Real-world Examples</h3>
        
        <div class="variant-demo">
          <h4>Course Video Player</h4>
          <p class="demo-description">
            Typical setup for educational content with subtitles and chapter markers
          </p>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              [tracks]="videoTracks()"
              poster="https://images.unsplash.com/photo-1516321318423-f06f85e504b3?w=800&h=450&fit=crop"
              size="lg"
              [showControls]="true"
              [showVolumeControl]="true"
              [allowFullscreen]="true"
              preload="metadata"
              ariaLabel="Course video player">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Product Demo Player</h4>
          <p class="demo-description">
            Autoplay setup for product demonstrations and marketing content
          </p>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1560472354-b33ff0c44a43?w=800&h=450&fit=crop"
              variant="minimal"
              size="md"
              [autoplay]="true"
              [muted]="true"
              [loop]="true"
              [showControls]="true"
              [showVolumeControl]="false"
              [allowFullscreen]="false"
              ariaLabel="Product demo video player">
            </ui-video-player>
          </div>
        </div>

        <div class="variant-demo">
          <h4>Media Gallery Player</h4>
          <p class="demo-description">
            Compact player for media galleries and previews
          </p>
          <div class="player-container">
            <ui-video-player
              [sources]="basicVideoSources()"
              poster="https://images.unsplash.com/photo-1598300042247-d088f8ab3a91?w=800&h=450&fit=crop"
              size="sm"
              [showControls]="true"
              [showVolumeControl]="false"
              [allowFullscreen]="true"
              preload="none"
              ariaLabel="Media gallery video player">
            </ui-video-player>
          </div>
        </div>
      </section>

      <!-- Error Handling Demo -->
      <section class="demo-section">
        <h3>Error Handling</h3>
        
        <div class="variant-demo">
          <h4>Invalid Video Source</h4>
          <p class="demo-description">
            Demonstrates error handling when video fails to load
          </p>
          <div class="player-container">
            <ui-video-player
              [sources]="errorVideoSources()"
              poster="https://images.unsplash.com/photo-1574717024653-61fd2cf4d44d?w=800&h=450&fit=crop"
              [showControls]="true"
              ariaLabel="Error demo video player"
              (error)="handleVideoError($event)">
            </ui-video-player>
          </div>
        </div>
      </section>

      <!-- Usage Examples -->
      <section class="demo-section">
        <h3>Code Examples</h3>
        <div class="code-examples">
          <div class="code-example">
            <h4>Basic Video Player:</h4>
            <pre><code>&lt;ui-video-player
  [sources]="videoSources"
  poster="poster-image.jpg"
  [showControls]="true"
  ariaLabel="Demo video player"&gt;
&lt;/ui-video-player&gt;</code></pre>
          </div>
          
          <div class="code-example">
            <h4>Video Player with Subtitles:</h4>
            <pre><code>&lt;ui-video-player
  [sources]="videoSources"
  [tracks]="subtitleTracks"
  poster="poster-image.jpg"
  size="lg"
  [showControls]="true"
  [allowFullscreen]="true"
  (play)="onVideoPlay()"
  (pause)="onVideoPause()"&gt;
&lt;/ui-video-player&gt;</code></pre>
          </div>

          <div class="code-example">
            <h4>Autoplay Video (Marketing/Demo):</h4>
            <pre><code>&lt;ui-video-player
  [sources]="videoSources"
  variant="minimal"
  size="md"
  [autoplay]="true"
  [muted]="true"
  [loop]="true"
  [showVolumeControl]="false"
  [allowFullscreen]="false"&gt;
&lt;/ui-video-player&gt;</code></pre>
          </div>
        </div>
      </section>
    </div>
  `,
  styleUrl: './video-player-demo.component.scss'
})
export class VideoPlayerDemoComponent {
  // State signals
  lastEvent = signal('');
  
  // Demo video sources - using sample videos from the web
  basicVideoSources = signal<VideoSource[]>([
    {
      src: 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4',
      type: 'video/mp4',
      quality: '1080p',
      label: 'HD'
    },
    {
      src: 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.webm',
      type: 'video/webm',
      quality: '1080p',
      label: 'HD WebM'
    }
  ]);

  errorVideoSources = signal<VideoSource[]>([
    {
      src: 'https://invalid-url.example.com/nonexistent.mp4',
      type: 'video/mp4',
      quality: '1080p',
      label: 'Invalid Source'
    }
  ]);

  videoTracks = signal<VideoTrack[]>([
    {
      src: 'data:text/vtt;base64,V0VCVlRUCgowMDowMDowMC4wMDAgLS0+IDAwOjAwOjA1LjAwMAo8Zm9udCBjb2xvcj0iI2ZmZmZmZiI+U2FtcGxlIHN1YnRpdGxlIHRleHQ8L2ZvbnQ+CgowMDowMDowNS4wMDAgLS0+IDAwOjAwOjEwLjAwMAo8Zm9udCBjb2xvcj0iI2ZmZmZmZiI+VGhpcyBpcyBhIGRlbW9uc3RyYXRpb24gb2Ygc3VidGl0bGVzPC9mb250Pg==',
      kind: 'subtitles',
      srclang: 'en',
      label: 'English',
      default: true
    }
  ]);
  
  // Demo configuration
  demoConfig = signal({
    size: 'md' as VideoPlayerSize,
    variant: 'default' as VideoPlayerVariant,
    autoplay: false,
    loop: false,
    showControls: true,
    showVolumeControl: true,
    allowFullscreen: true,
    disabled: false,
    poster: 'https://images.unsplash.com/photo-1574717024653-61fd2cf4d44d?w=800&h=450&fit=crop'
  });

  handleVideoEvent(event: string): void {
    this.lastEvent.set(`${event} at ${new Date().toLocaleTimeString()}`);
    console.log(`Video event: ${event}`);
  }

  handleTimeUpdate(time: number): void {
    // Only log significant time updates to avoid console spam
    if (Math.floor(time) % 10 === 0) {
      console.log(`Time update: ${this.formatTime(time)}`);
    }
  }

  handleVolumeChange(volume: number): void {
    this.lastEvent.set(`Volume changed to ${Math.round(volume * 100)}% at ${new Date().toLocaleTimeString()}`);
    console.log(`Volume changed: ${volume}`);
  }

  handleFullscreenChange(isFullscreen: boolean): void {
    this.lastEvent.set(`${isFullscreen ? 'Entered' : 'Exited'} fullscreen at ${new Date().toLocaleTimeString()}`);
    console.log(`Fullscreen: ${isFullscreen}`);
  }

  handleVideoError(event: Event): void {
    this.lastEvent.set(`Video error occurred at ${new Date().toLocaleTimeString()}`);
    console.error('Video error:', event);
  }

  updateDemoConfig(key: string, event: Event): void {
    const target = event.target as HTMLInputElement;
    const value = target.checked;
    
    this.demoConfig.update(config => ({
      ...config,
      [key]: value
    }));
  }

  updateDemoSize(event: Event): void {
    const target = event.target as HTMLSelectElement;
    const size = target.value as VideoPlayerSize;
    
    this.demoConfig.update(config => ({
      ...config,
      size
    }));
  }

  updateDemoVariant(event: Event): void {
    const target = event.target as HTMLSelectElement;
    const variant = target.value as VideoPlayerVariant;
    
    this.demoConfig.update(config => ({
      ...config,
      variant
    }));
  }

  private formatTime(seconds: number): string {
    if (isNaN(seconds)) return '0:00';
    
    const minutes = Math.floor(seconds / 60);
    const secs = Math.floor(seconds % 60);
    
    return `${minutes}:${secs.toString().padStart(2, '0')}`;
  }
}S` x4qDL-8\x! rk^Clcɑn#USxZmo7_
,w8SwvcDN0Pj%e[W߼풒Wp|8YEڠTA}U-Ϻ-+ݎ
ךw{6p+{Ҵm9趟H	˛`xTv=:.:.zADt<:>nM97)5տٺt/w.p>yжEE;|:ޔ` _,A5ˬJi~oȺt!N66-fP3䃞67ÉVW%^T6wjN[z,	Lo_ZlPq+S+rV6NpYۺV{ИfշfJqck\\^`]ZPX.rSS9]
޵̃y%4^ؤ5Xlqv kw^҂nꩋ({aa7'2Ik>MZ~n*Gf3gIK3FV\E/	{yI/ƻM[cy6p$ڙ5G$1?%zUշOSVW~bTىChZ<<vLYN*[uc!ǡ?aL\{#>n+yB$cez
ChqRߎ|$V2@{BxUSA9Qo;\yx:걂~3:Q  O鲪
`ܽ<и)Q-o?|W."qxʜ4?pU7w]1ۉlXjlZ6vi(z,uONꀷ֔^|9pӏo ~豛
rGޟ7ޡy*6!`zN2wSFm:=J) UCဓ'W5`%澀ïoJu
Hz(ወFN%ak0G)Ea߾4jӦW2u74;I;$6uH܁q1lԉow+Cwߓk_4#.-r@&_@"H1b0y՜d00 Z$|0HhP*BlޘtfA4ep>obNdHĤ̘d5<m.)f)Rw3-JVD"e#$k",H.N[2Znų[pQ"ɿH"@S̐D2{#5#/O	[Bm )	fs&1#Ill1b[:pBY i	%'٘	f}+xD1SO	}KF.,HBI}^2PlsJ8ID3)$&Qp)'J%$?P.殄reܹݻ0*@}Gn#U鉩bG۪lED=;[VC~or?[rx⮁v.}lԎҵ'ÉM\됱X$A_b~/tC+u.,a%Y4m[ xcU_!U}ojzO]xkWd )x-<lH21nap7HkkC\.!{E 8Dx|dZ]Z0PB}&TJ@ I00aXx1Qd3z\9 <jrwd`$\ Kh)Hi""{[838S(HT@T\fڽN	Z3@-Vۊ&gpkC|v{
JݹZًa}H)li!5]iC }1\FKI:).
GFmΒF1Ț2sDr_(jgjE){DDUAx2MQiݬRZݣD3Z9"/~MqFTߑ & Vr=)A9jf<Ʃ
AJhASva! d8gk^37:MEѵv.HP[	xh%jLy-;b-6ĺiօ:5X/sd6q,bSEbaS0MOkfdg"O[3X>2IA7QΠ.[!ATmbwz/PgE1Љ-Q$Ș~pq:Z5 7[P[15Y![u<C%=Wdl"lIiQ(c|sͷ6p3@S=v\QvHlHc[hː&.IlG9RvO6ژrm%i-3!־mjPF8XH b>С5aDPP?YB|+'2KI.n02_[-RX
ӳ"|\
!Q+l*\uR>eÂJ'T˸T\:Mp8-L`[CßHI(;*"2?1Ӭů+RYZUF% }9 1nlN'6Nb`-~͓m Ap"ej.~ע%|v3hiv*ɔ-|^".	kPyTe	>EW}\X:tA.!vL>>xG?Ѝ"}
>(R[ KI .yB^h"wV'R:㦝'ro8j׳U?mQ!OLl,'M?b̞-&;V9w9>ïNWP=dBZA
I_lyj_0zEXxPLX faNewspaper=, faCircleDot, faColumns,
  faFolderOpen, faDesktop, faListUl(DemoRoutes,
   A  faCircleDot = faCircleDot;
  faColumns = faColumns;
  faFolderOpen = faFolderOpen;
  faDesktop = faDesktop;
  faNewspaper = f!aNewspaper;
  faListUl = faListUliaspect-ratio", "Aspect RatioF$8bento-grid", "Bento Gridt!0box", "Box (Padding/Margin)#/9breakpoint-container", "Breakpoint Container", this.faEyeQ 6enter", "Center (Content Alignment)", this.faCircleDotQ &olumn", "Column Layout", this.faColumnA 5"($*eed-layout", "Feed Layout", this.faNewspap! flex", "Flex (Flexbox Container)"2!O grid-container", "Grid Containert!0@4-detail-layout", "List Detail Layout", this.faListUl #croll-container", "Scroll Container00supporting-pane-layout", "Supporting Pane Layout79section", "Section (Semantic Wrapper)", this.faLayerGroup +idebar-layout", "Sidebar Layout", this.faBa1!!Bstack", "Stack (VStack/HStack)03abs-container", "Tabs Container", this.faFolderOpenQ3dashboard-shell", "Dashboard Shell", this.faDesktop{"(%}c7x3{M͏K6gM>/%, խgcxs}6͏U6gd|Xd'RrHlΒ)J0 
&CxoX`,, faArrowDown, faThumbtack,8  faArrowDown = faArrowDown;
  faThumbtack = faThumbtack9allery-grid", "Gallery Grid/$Iinfinite-scroll-container", "Infinite Scroll Container", this.faArrowDown!kanban-board", "Kanban Board#7%Smasonry", "Masonry Layout\%0%*plit-view", "Split View / Resizable Panels#0'M1sticky-layout", "Sticky Layout", this.faThumbtack!'cessibility", "Accessability+nimations", "Animati+hcl-studio", "HCL Theme++-manager", "Font Manager+data-utils", "Data Util+code-display", "Code Display+
    
  }

  +k	S~x.`g-
    // Landing?"ndingChildren = [

      1conversion", "Conversion9#/$landing-feature-grid", "Feature Grid9#/$landing-testimonials", "Testimonials+- landing-logo-cloud", "Logo Cloud+04landing-statistics", "Statistics", this.faCaretUp),
1landing-faq", "FAQ+0landing-team", "Team+0landing-,&3landing-templates", "Templates", this.faCaretUp),

^landing", "Landing-landingChildren);
- .backgrounds", "Backgrounds/Ȟx>yCmG97YQԖy6
2rk$ŘOe; 8x|j7浛CX86ֲNVl!ܵG$ټXLe8wKf?';~NDxA:>3, faCircleNotch, faSliders,
  faMinus, faInfoCircle/scroll-container.component  faCircleNotch = faCircleNotch;
  faSliders = faSliders;
  faMinus = faMinus;
  faInfoCircle = faInfoCircle;

  menuItems: anyl-range-slider", "Range Slider", this.faSliders-e divider", "Divider", this.faMinu &tooltip", "Tooltip", this.faInfoCircle-xEC7progress-circle", "Progress Circle", this.faCircleNotch-xwB[xL@use '../../../../../ui-design-system/src/styles/semantic' as semantic;

.sidebar-container {
  padding: 1rem 0;

  .menu-item-wrapper {
    margin-bottom: 0.25rem;

    .parent-menu-item {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 0.75rem 1rem;
      cursor: pointer;
      border-radius: 8px;
      margin: 0 0.5rem;
      transition: background-color 0.2s ease;
      
      &:hover {
        background-color: semantic.$semantic-color-surface-interactive;
      }

      .parent-content {
        display: flex;
        align-items: center;
        gap: 0.75rem;

        .parent-icon {
          font-size: 1rem;
          color: semantic.$semantic-color-text-secondary;
        }

        .parent-label {
          font-weight: 500;
          color: semantic.$semantic-color-text-primary;
          font-size: 0.875rem;
        }
      }

      .chevron-icon {
        font-size: 0.75rem;
        color: semantic.$semantic-color-text-tertiary;
        transition: transform 0.2s ease;
      }
    }

    .children-container {
      margin-left: 1rem;
      padding-left: 1rem;
      border-left: 2px solid semantic.$semantic-color-border-secondary;
      margin-top: 0.25rem;

      ::ng-deep .child-menu-item {
        margin-bottom: 0.125rem;
        
        ui-menu-item {
          --menu-item-padding: 0.5rem 1rem;
          --menu-item-font-size: 0.8125rem;
        }
      }
    }
  }
}=k@xkC#,.Vx̽{(gqFbQjniF>V Jx4import { Component, EventEmitter, Output, Input, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { 
  MenuContainerComponent, 
  MenuSubmenuComponent, 
  MenuItemComponent,
  MenuItemData 
} from '../../../../../ui-essentials/src/lib/components/navigation/menu';

export interface SidebarMenuItem extends MenuItemData {
  children?: SidebarMenuItem[];
  expanded?: boolean;
  isParent?: boolean;
}

@Component({
  selector: 'skyui-dashboard-sidebar',
  standalone: true,
  imports: [
    CommonModule,
    MenuContainerComponent,
    MenuSubmenuComponent,
    MenuItemComponent
],
  template: `
    <ui-menu-container 
      [elevation]="'none'"
      [spacing]="'none'"
      [rounded]="false"
      class="sidebar-container"
    >
      @for(item of data; track item.id) {
        @if(item.isParent && item.children) {
          <ui-menu-submenu
            [parentItem]="getMenuItemData(item)"
            [size]="'md'"
            [iconPosition]="'left'"
            [isOpen]="item.expanded || false"
            [submenuElevation]="'none'"
            [submenuSpacing]="'xs'"
            (submenuToggled)="onSubmenuToggled($event)"
            (parentItemClick)="handleMenuClick($event.id || '')"
          >
            @for(child of item.children; track child.id) {
              <ui-menu-item 
                [data]="getMenuItemData(child)"
                [size]="'sm'" 
                [iconPosition]="'left'"
                [indent]="true"
                (itemClick)="handleMenuClick($event.id || '')"
              />
            }
          </ui-menu-submenu>
        } @else {
          <ui-menu-item 
            [data]="getMenuItemData(item)"
            [size]="'md'" 
            [iconPosition]="'left'"
            (itemClick)="handleMenuClick($event.id || '')"
          />
        }
      }
    </ui-menu-container>
  `,
  styleUrls: ['./dashboard.sidebar.component.scss']

})
export class DashboardSidebarComponent implements OnInit {

  @Input() data: SidebarMenuItem[] = [];
  @Input() set active(value: string) { this.setActive(value) }
  @Output() selected = new EventEmitter<string>();

  handleMenuClick(id: string): void {
    this.setActive(id);
    this.selected.emit(id);
  }

  setActive(id: string): void {
    this.setActiveRecursive(this.data, id);
  }

  private setActiveRecursive(items: SidebarMenuItem[], id: string): void {
    items.forEach(item => {
      item.active = item.id === id;
      if (item.children) {
        this.setActiveRecursive(item.children, id);
      }
    });
  }

  getActiveMenuItem(): SidebarMenuItem | undefined {
    return this.getActiveMenuItemRecursive(this.data);
  }

  private getActiveMenuItemRecursive(items: SidebarMenuItem[]): SidebarMenuItem | undefined {
    for (const item of items) {
      if (item.active) return item;
      if (item.children) {
        const found = this.getActiveMenuItemRecursive(item.children);
        if (found) return found;
      }
    }
    return undefined;
  }

  clearSelection(): void {
    this.clearSelectionRecursive(this.data);
  }

  private clearSelectionRecursive(items: SidebarMenuItem[]): void {
    items.forEach(item => {
      item.active = false;
      if (item.children) {
        this.clearSelectionRecursive(item.children);
      }
    });
  }

  toggleExpanded(item: SidebarMenuItem): void {
    if (item.isParent) {
      item.expanded = !item.expanded;
    }
  }

  getMenuItemData(item: SidebarMenuItem): MenuItemData {
    return {
      id: item.id,
      label: item.label,
      icon: item.icon,
      active: item.active,
      hasSubmenu: item.isParent && !!item.children,
      disabled: item.disabled
    };
  }

  onSubmenuToggled(event: { item: MenuItemData; isOpen: boolean }): void {
    const sidebarItem = this.findItemById(this.data, event.item.id || '');
    if (sidebarItem && sidebarItem.isParent) {
      sidebarItem.expanded = event.isOpen;
    }
  }

  private findItemById(items: SidebarMenuItem[], id: string): SidebarMenuItem | undefined {
    for (const item of items) {
      if (item.id === id) return item;
      if (item.children) {
        const found = this.findItemById(item.children, id);
        if (found) return found;
      }
    }
    return undefined;
  }

  ngOnInit(): void {
  }

}/[YxmT݊@eQz~Fmƫ쮺""NI:Δ$mRz2W#x)>>I|s9_~	1kbXP#L\iǵns8tri _>u(kDFFGC<}AaNlFuƚ\biшɨ*k x:]r B> 됚\nmBI@`dd;0`ňv9^0_ڿc).}C&3P쩼H kOcqm;WkKWa<ᛶSa|4Ԁ9O>w.}pĽ Xl$]7[C>9Y\<?KX,zz,.Y),0#ǮA.W\4nh3ţuO^؍߶	CZªT"2)o*3exJG6eWNqTVP#BW0TAh˘j3	T*%XEق\nW՛ϕMc@&R2>p[C?J$bϛQ(ʲtJr MوpsK߯k޳l}x[/7[nfϼ Px8// Layout Container Component - Main application shell layout
.ui-layout-container {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;

  box-sizing: border-box;
  overflow: hidden;

  display: flex;
  flex-wrap: nowrap;
  flex-direction: column;
  align-items: stretch;
  flex-flow: column;

  // Top navigation bar
  &__top-bar {
    order: 1;
    flex: 0 0 64px; // Standard app bar height
    box-sizing: border-box;
    overflow: hidden;
    transition: all 300ms cubic-bezier(0.2, 0.0, 0, 1.0);
    position: relative;
  }

  // Main content wrapper
  &__centre-wrapper {
    width: 100%;
    box-sizing: border-box;
    position: relative;

    order: 2;
    flex: 1;
    overflow: hidden;
    min-height: 0;

    display: flex;
    flex-wrap: nowrap;
    flex-direction: row;
    align-items: stretch;

    // Left sidebar navigation
    .left-navigation {
      order: 1;
      flex: 0 0 64px; // Collapsed sidebar width
      overflow: hidden;
      position: relative;
      box-sizing: border-box;
      height: 100%;
      transition: all 300ms cubic-bezier(0.2, 0.0, 0, 1.0);

      // Navigation states
      &--hide {
        flex: 0 0 0;
      }

      &--rail {
        flex: 0 0 80px; // Rail navigation width
      }

      &--full {
        flex: 0 0 320px; // Expanded sidebar width
      }
    }

    // Main content area
    .main-body {
      order: 2;
      flex: 1;
      overflow: hidden;
      min-height: 0;
      box-sizing: border-box;
      position: relative;

      display: flex;
      flex-wrap: nowrap;
      flex-direction: column;
      align-items: stretch;

      // Inner header section
      &__header {
        order: 1;
        flex: 0 0 0;
        box-sizing: border-box;
        overflow: hidden;
        transition: all 300ms cubic-bezier(0.2, 0.0, 0, 1.0);
        width: 100%;
        position: relative;
      }

      // Inner content body
      &__body {
        order: 2;
        flex: 1;
        overflow: hidden;
        min-height: 0;
        box-sizing: border-box;
      }

      // Inner footer section
      &__footer {
        order: 3;
        flex: 0 0 0;
        box-sizing: border-box;
        overflow: hidden;
        transition: all 300ms cubic-bezier(0.2, 0.0, 0, 1.0);
        width: 100%;
        position: relative;
      }
    }

    // Right sidebar navigation
    .right-navigation {
      order: 3;
      flex: 0 0 320px; // Right sidebar width
      overflow: hidden;
      position: relative;
      box-sizing: border-box;
      height: 100%;
      transition: all 300ms cubic-bezier(0.2, 0.0, 0, 1.0);

      // Right navigation states
      &--hide {
        flex: 0 0 0;
      }

      &--show {
        flex: 0 0 320px; // Shown right sidebar width
      }
    }
  }

  // Bottom bar section
  &__bottom-bar {
    order: 3;
    flex: 0 0 0;
    overflow: hidden;
    box-sizing: border-box;
    transition: all 300ms cubic-bezier(0.2, 0.0, 0, 1.0);
  }

  // Responsive design for smaller screens
  @media (max-width: 768px) {
    &__centre-wrapper {
      .left-navigation {
        &--full {
          flex: 0 0 280px; // Smaller full width on mobile
        }
      }

      .right-navigation {
        &--show {
          flex: 0 0 280px; // Smaller right sidebar on mobile
        }
      }
    }
  }

  // Mobile breakpoint - stack navigation vertically
  @media (max-width: 640px) {
    &__centre-wrapper {
      flex-direction: column;
      
      .left-navigation,
      .right-navigation {
        &--full,
        &--show {
          flex: 0 0 64px; // Navigation becomes horizontal bar on mobile
        }
      }
    }
  }
} :Uxvimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';

export type NavigationState = 'hide' | 'rail' | 'full';
export type SidebarState = 'hide' | 'show';

@Component({
  selector: 'ui-layout-container',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  styleUrl: './layout-container.component.scss',
  template: `
    <div class="ui-layout-container">
      <!-- Top navigation bar -->
      <div class="ui-layout-container__top-bar" 
           [style.flex-basis.px]="effectiveTopBarHeight()">
        <ng-content select="[slot=top-bar]"></ng-content>
      </div>

      <!-- Main content wrapper -->
      <div class="ui-layout-container__centre-wrapper">
        <!-- Left sidebar navigation -->
        <div class="left-navigation" 
             [class]="leftNavigationClasses()"
             [style.flex-basis.px]="leftNavigationWidth()">
          <ng-content select="[slot=left-navigation]"></ng-content>
        </div>

        <!-- Main content area -->
        <div class="main-body">
          <!-- Inner header -->
          <div class="main-body__header" 
               [style.flex-basis.px]="effectiveInnerHeaderHeight()">
            <ng-content select="[slot=inner-header]"></ng-content>
          </div>

          <!-- Inner content body -->
          <div class="main-body__body">
            <ng-content select="[slot=content]"></ng-content>
          </div>

          <!-- Inner footer -->
          <div class="main-body__footer" 
               [style.flex-basis.px]="effectiveInnerFooterHeight()">
            <ng-content select="[slot=inner-footer]"></ng-content>
          </div>
        </div>

        <!-- Right sidebar navigation -->
        <div class="right-navigation" 
             [class]="rightNavigationClasses()"
             [style.flex-basis.px]="rightNavigationWidth()">
          <ng-content select="[slot=right-navigation]"></ng-content>
        </div>
      </div>

      <!-- Bottom bar -->
      <div class="ui-layout-container__bottom-bar" 
           [style.flex-basis.px]="effectiveBottomBarHeight()">
        <ng-content select="[slot=bottom-bar]"></ng-content>
      </div>
    </div>
  `
})
export class LayoutContainerComponent {
  // Input signals for layout configuration
  leftNavigationState = input<NavigationState>('rail');
  rightNavigationState = input<SidebarState>('hide');
  
  // Show/hide inputs
  showTopBar = input<boolean>(false);
  showInnerHeader = input<boolean>(false);
  showInnerFooter = input<boolean>(false);
  showBottomBar = input<boolean>(false);

  // Size inputs (in pixels) - with sensible defaults
  topBarHeight = input<number>(64);
  innerHeaderHeight = input<number>(56);
  innerFooterHeight = input<number>(48);
  bottomBarHeight = input<number>(56);

  // Custom width overrides
  customLeftWidth = input<number | null>(null);
  customRightWidth = input<number | null>(null);

  // Computed CSS classes for navigation states
  leftNavigationClasses = computed(() => {
    const state = this.leftNavigationState();
    return `left-navigation--${state}`;
  });

  rightNavigationClasses = computed(() => {
    const state = this.rightNavigationState();
    return `right-navigation--${state}`;
  });

  // Computed widths based on state and custom overrides
  leftNavigationWidth = computed(() => {
    const customWidth = this.customLeftWidth();
    if (customWidth !== null) return customWidth;

    const state = this.leftNavigationState();
    switch (state) {
      case 'hide': return 0;
      case 'rail': return 81;
      case 'full': return 320;
      default: return 64;
    }
  });

  rightNavigationWidth = computed(() => {
    const customWidth = this.customRightWidth();
    if (customWidth !== null) return customWidth;

    const state = this.rightNavigationState();
    switch (state) {
      case 'hide': return 0;
      case 'show': return 320;
      default: return 0;
    }
  });

  // Computed effective heights (0 when hidden, configured height when shown)
  effectiveTopBarHeight = computed(() => {
    return this.showTopBar() ? this.topBarHeight() : 0;
  });

  effectiveInnerHeaderHeight = computed(() => {
    return this.showInnerHeader() ? this.innerHeaderHeight() : 0;
  });

  effectiveInnerFooterHeight = computed(() => {
    return this.showInnerFooter() ? this.innerFooterHeight() : 0;
  });

  effectiveBottomBarHeight = computed(() => {
    return this.showBottomBar() ? this.bottomBarHeight() : 0;
  });
}-tx.<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>DemoUiEssentials</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
</body>
</html>
bx import { bootstrapApplication } from '@angular/platform-browser';
import { appConfig } from './app/app.config';
import { AppComponent } from './app/app.component';

bootstrapApplication(AppComponent, appConfig)
  .catch((err) => console.error(err));
.Xx!// ==========================================================================
// SKYUI PROJECT VARIABLES
// ==========================================================================
// Project-specific variable overrides that build upon the shared-ui token system
// Import order: base tokens → semantic tokens → project overrides
// NOTE: Semantic tokens are imported in styles.scss and available here
// ==========================================================================

// ==========================================================================
// FONT FAMILY OVERRIDES
// ==========================================================================
// Override base font families to use Comfortaa
$base-typography-font-family-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
$base-typography-font-family-display: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;

@import '../../../shared-ui/src/styles/semantic';

// These overrides will cascade through all semantic typography tokens
// that use $base-typography-font-family-sans and $base-typography-font-family-display

// ==========================================================================
// PROJECT-SPECIFIC OVERRIDES
// ==========================================================================
// Custom values that override semantic tokens for SkyUI project needs
// Use semantic tokens as base values to maintain design system consistency

// BRAND CUSTOMIZATION
// Override brand colors while maintaining semantic structure
$skyui-brand-primary: $semantic-color-brand-primary !default;
$skyui-brand-secondary: $semantic-color-brand-secondary !default;
$skyui-brand-accent: $semantic-color-brand-tertiary !default;

// SURFACE CUSTOMIZATION 
// Project-specific surface treatments
$skyui-surface-elevated: $semantic-color-surface-elevated !default;
$skyui-surface-sunken: $semantic-color-surface-sunken !default;
$skyui-surface-interactive: $semantic-color-surface-interactive !default;

// TYPOGRAPHY SCALE ADJUSTMENTS
// Semantic typography tokens can be overridden for project-specific needs
$skyui-heading-display: $semantic-typography-heading-display !default;
$skyui-heading-h1: $semantic-typography-heading-h1 !default;
$skyui-heading-h2: $semantic-typography-heading-h2 !default;
$skyui-body-large: $semantic-typography-body-large !default;
$skyui-body-medium: $semantic-typography-body-medium !default;

// SPACING CUSTOMIZATION
// Build on semantic spacing tokens
$skyui-space-component: $semantic-spacing-component-md !default;
$skyui-space-layout: $semantic-spacing-layout-lg !default;
$skyui-space-section: $semantic-spacing-section-xl !default;

// INTERACTIVE ELEMENTS
// Button and form element customizations
$skyui-interactive-primary: $semantic-color-interactive-primary !default;
$skyui-interactive-secondary: $semantic-color-interactive-secondary !default;
$skyui-border-radius-component: $semantic-border-radius-md !default;
$skyui-border-radius-container: $semantic-border-radius-lg !default;

// ELEVATION & SHADOWS
// Project-specific shadow treatments
$skyui-shadow-elevated: $semantic-shadow-elevated !default;
$skyui-shadow-floating: $semantic-shadow-floating !default;

// ==========================================================================
// COMPONENT-SPECIFIC OVERRIDES
// ==========================================================================
// Variables for specific component customizations

// Dashboard specific
$skyui-dashboard-grid-gap: $semantic-spacing-layout-md !default;
$skyui-dashboard-card-padding: $semantic-spacing-component-lg !default;

// Navigation specific  
$skyui-nav-height: 64px !default;
$skyui-sidebar-width: 280px !default;
$skyui-sidebar-collapsed-width: 72px !default;

// Form specific
$skyui-input-border-radius: $semantic-border-radius-sm !default;
$skyui-input-padding: $semantic-spacing-component-sm !default;DJlx @ui-design-systemI
x/$// ==========================================================================
// SKYUI COLOR OVERRIDES
// ==========================================================================
// Project-specific color customizations built on semantic color tokens
// Extends the shared design system with SkyUI-specific color patterns
// ==========================================================================

// ==========================================================================
// THEME COLOR UTILITIES
// ==========================================================================
// Utility classes for applying semantic colors consistently

.skyui-color {
  // Brand color utilities
  &--brand-primary {
    color: $semantic-color-brand-primary;
  }

  &--brand-secondary {
    color: $semantic-color-brand-secondary;
  }

  &--brand-accent {
    color: $semantic-color-brand-accent;
  }

  // Text color utilities
  &--text-primary {
    color: $semantic-color-text-primary;
  }

  &--text-secondary {
    color: $semantic-color-text-secondary;
  }

  &--text-tertiary {
    color: $semantic-color-text-tertiary;
  }

  &--text-inverse {
    color: $semantic-color-text-inverse;
  }

  // Feedback colors
  &--success {
    color: $semantic-color-success;
  }

  &--warning {
    color: $semantic-color-warning;
  }

  &--danger {
    color: $semantic-color-danger;
  }

  &--info {
    color: $semantic-color-info;
  }
}

// ==========================================================================
// BACKGROUND COLOR UTILITIES
// ==========================================================================
// Background color utilities using semantic tokens

.skyui-bg {
  // Surface backgrounds
  &--surface-primary {
    background-color: $semantic-color-surface-primary;
  }

  &--surface-secondary {
    background-color: $semantic-color-surface-secondary;
  }

  &--surface-elevated {
    background-color: $semantic-color-surface-elevated;
  }

  &--surface-sunken {
    background-color: $semantic-color-surface-sunken;
  }

  &--surface-interactive {
    background-color: $semantic-color-surface-interactive;
    
    &:hover {
      background-color: var(--color-surface-interactive-hover, $semantic-color-surface-interactive);
      filter: brightness(0.95);
    }
  }

  // Brand backgrounds
  &--brand-primary {
    background-color: $semantic-color-brand-primary;
    color: $semantic-color-on-brand-primary;
  }

  &--brand-secondary {
    background-color: $semantic-color-brand-secondary;
    color: $semantic-color-on-brand-secondary;
  }

  // Container backgrounds
  &--container-primary {
    background-color: $semantic-color-container-primary;
    color: $semantic-color-on-container-primary;
  }

  &--container-secondary {
    background-color: $semantic-color-container-secondary;
    color: $semantic-color-on-container-secondary;
  }

  // Feedback backgrounds
  &--success {
    background-color: var(--color-success-light, $semantic-color-success);
    filter: brightness(1.4) saturate(0.6);
    color: var(--color-success-dark, $semantic-color-success);
    border: 1px solid var(--color-success-border, $semantic-color-success);
  }

  &--warning {
    background-color: var(--color-warning-light, $semantic-color-warning);
    filter: brightness(1.4) saturate(0.6);
    color: var(--color-warning-dark, $semantic-color-warning);
    border: 1px solid var(--color-warning-border, $semantic-color-warning);
  }

  &--danger {
    background-color: var(--color-danger-light, $semantic-color-danger);
    filter: brightness(1.4) saturate(0.6);
    color: var(--color-danger-dark, $semantic-color-danger);
    border: 1px solid var(--color-danger-border, $semantic-color-danger);
  }

  &--info {
    background-color: var(--color-info-light, $semantic-color-info);
    filter: brightness(1.4) saturate(0.6);
    color: var(--color-info-dark, $semantic-color-info);
    border: 1px solid var(--color-info-border, $semantic-color-info);
  }
}

// ==========================================================================
// BORDER COLOR UTILITIES
// ==========================================================================
// Border color utilities using semantic border tokens

.skyui-border {
  // Standard borders
  &--primary {
    border-color: $semantic-color-border-primary;
  }

  &--secondary {
    border-color: $semantic-color-border-secondary;
  }

  &--focus {
    border-color: $semantic-color-border-focus;
    outline: none;
  }

  &--error {
    border-color: $semantic-color-border-error;
  }

  &--disabled {
    border-color: $semantic-color-border-disabled;
  }

  // Border styles
  &--solid {
    border-style: solid;
    border-width: 1px;
  }

  &--dashed {
    border-style: dashed;
    border-width: 1px;
  }

  &--thick {
    border-width: 2px;
  }
}

// ==========================================================================
// INTERACTIVE STATE COLORS
// ==========================================================================
// Color variations for interactive elements

.skyui-interactive {
  // Primary interactive states
  &--primary {
    color: $semantic-color-interactive-primary;
    
    &:hover {
      color: var(--color-primary-hover, $semantic-color-interactive-primary);
    }
    
    &:active {
      color: var(--color-primary-active, $semantic-color-interactive-primary);
    }
    
    &:focus {
      color: $semantic-color-interactive-primary;
      outline: 2px solid $semantic-color-focus-ring;
      outline-offset: 2px;
    }
  }

  // Secondary interactive states
  &--secondary {
    color: $semantic-color-interactive-secondary;
    
    &:hover {
      color: var(--color-secondary-hover, $semantic-color-interactive-secondary);
    }
    
    &:active {
      color: var(--color-secondary-active, $semantic-color-interactive-secondary);
    }
  }

  // Tertiary interactive states
  &--tertiary {
    color: $semantic-color-interactive-tertiary;
    
    &:hover {
      color: var(--color-tertiary-hover, $semantic-color-interactive-tertiary);
    }
    
    &:active {
      color: var(--color-tertiary-active, $semantic-color-interactive-tertiary);
    }
  }

  // Neutral interactive states
  &--neutral {
    color: $semantic-color-text-secondary;
    
    &:hover {
      color: $semantic-color-text-primary;
    }
  }
}

// ==========================================================================
// COMPONENT-SPECIFIC COLORS
// ==========================================================================
// Color patterns for specific SkyUI components

// Dashboard specific colors
.skyui-dashboard {
  &__card {
    background-color: $semantic-color-surface-elevated;
    border: 1px solid $semantic-color-border-secondary;
    box-shadow: $semantic-shadow-elevated;
    
    &:hover {
      box-shadow: $semantic-shadow-floating;
    }
  }

  &__metric {
    &--positive {
      color: $semantic-color-success;
    }
    
    &--negative {
      color: $semantic-color-danger;
    }
    
    &--neutral {
      color: $semantic-color-text-secondary;
    }
  }
}

// Navigation specific colors
.skyui-navigation {
  &__item {
    color: $semantic-color-text-secondary;
    
    &:hover {
      color: $semantic-color-text-primary;
      background-color: $semantic-color-surface-interactive;
    }
    
    &.active {
      color: $semantic-color-brand-primary;
      background-color: var(--color-brand-primary-light, $semantic-color-brand-primary);
      font-weight: $base-typography-font-weight-medium;
    }
  }

  &__divider {
    background-color: $semantic-color-border-secondary;
  }
}

// Form specific colors
.skyui-form {
  &__input {
    background-color: $semantic-color-surface-primary;
    border-color: $semantic-color-border-secondary;
    color: $semantic-color-text-primary;
    
    &:focus {
      border-color: $semantic-color-border-focus;
      box-shadow: 0 0 0 3px $semantic-color-focus-ring;
    }
    
    &.error {
      border-color: $semantic-color-border-error;
    }
    
    &:disabled {
      background-color: $semantic-color-surface-disabled;
      border-color: $semantic-color-border-disabled;
      color: $semantic-color-text-disabled;
    }
  }

  &__label {
    color: $semantic-color-text-primary;
    
    &.required {
      &::after {
        color: $semantic-color-danger;
      }
    }
  }
}

// ==========================================================================
// STATUS AND NOTIFICATION COLORS  
// ==========================================================================
// Color patterns for status indicators and notifications

.skyui-status {
  &--online {
    color: $semantic-color-success;
    
    &::before {
      content: '●';
      margin-right: $semantic-spacing-component-2xs;
    }
  }

  &--offline {
    color: $semantic-color-danger;
    
    &::before {
      content: '●';
      margin-right: $semantic-spacing-component-2xs;
    }
  }

  &--pending {
    color: $semantic-color-warning;
    
    &::before {
      content: '●';
      margin-right: $semantic-spacing-component-2xs;
    }
  }

  &--inactive {
    color: $semantic-color-text-tertiary;
    
    &::before {
      content: '●';
      margin-right: $semantic-spacing-component-2xs;
    }
  }
}AA!x// ==========================================================================
// SKYUI OVERRIDES INDEX
// ==========================================================================
// Centralized import for all SkyUI project overrides
// Import order maintains proper cascade and dependency resolution
// ==========================================================================

// Typography overrides - semantic typography token extensions
@import 'typography';

// Color overrides - semantic color token extensions  
@import 'colors';XxH// ==========================================================================
// SKYUI TYPOGRAPHY OVERRIDES
// ==========================================================================
// Project-specific typography customizations built on semantic typography tokens
// Extends the shared design system with SkyUI-specific typography patterns
// ==========================================================================

// Typography utility mixins that use semantic tokens
@mixin apply-typography($typography-map) {
  font-family: map-get($typography-map, font-family);
  font-size: map-get($typography-map, font-size);
  font-weight: map-get($typography-map, font-weight);
  line-height: map-get($typography-map, line-height);
  letter-spacing: map-get($typography-map, letter-spacing);
}

// ==========================================================================
// HEADING STYLES
// ==========================================================================
// Custom heading treatments that build on semantic typography

.skyui-heading {
  // Display heading for hero sections
  &--display {
    @include apply-typography($semantic-typography-heading-display);
    color: $semantic-color-text-primary;
    
    // Project-specific enhancements
    text-align: center;
    margin-bottom: $semantic-spacing-component-xl;
    
    @media (max-width: $base-breakpoint-md) {
      font-size: $base-typography-font-size-2xl;
    }
  }

  // Primary headings
  &--h1 {
    @include apply-typography($semantic-typography-heading-h1);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-lg;
    
    // SkyUI specific styling
    position: relative;
    
    &::after {
      content: '';
      position: absolute;
      bottom: -#{$semantic-spacing-component-xs};
      left: 0;
      width: 60px;
      height: 3px;
      background-color: $semantic-color-brand-primary;
    }
  }

  // Secondary headings
  &--h2 {
    @include apply-typography($semantic-typography-heading-h2);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-md;
    margin-top: $semantic-spacing-component-xl;
  }

  // Tertiary headings
  &--h3 {
    @include apply-typography($semantic-typography-heading-h3);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-sm;
    margin-top: $semantic-spacing-component-lg;
  }

  // Quaternary headings
  &--h4 {
    @include apply-typography($semantic-typography-heading-h4);
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-component-xs;
    margin-top: $semantic-spacing-component-md;
  }
}

// ==========================================================================
// BODY TEXT STYLES
// ==========================================================================
// Content text styles using semantic typography tokens

.skyui-text {
  // Large body text for important content
  &--large {
    @include apply-typography($semantic-typography-body-large);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-md;
  }

  // Standard body text
  &--medium {
    @include apply-typography($semantic-typography-body-medium);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-sm;
  }

  // Small body text for captions, etc.
  &--small {
    @include apply-typography($semantic-typography-body-small);
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-component-xs;
  }

  // Caption text
  &--caption {
    @include apply-typography($semantic-typography-caption);
    color: $semantic-color-text-tertiary;
  }

  // Muted/secondary text
  &--muted {
    color: $semantic-color-text-secondary;
  }

  // Emphasized text
  &--emphasis {
    color: $semantic-color-brand-primary;
    font-weight: $base-typography-font-weight-medium;
  }
}

// ==========================================================================
// INTERACTIVE TEXT STYLES
// ==========================================================================
// Text styles for buttons, links, and interactive elements

.skyui-interactive-text {
  // Button text styles
  &--button-large {
    @include apply-typography($semantic-typography-button-large);
    text-transform: uppercase;
  }

  &--button-medium {
    @include apply-typography($semantic-typography-button-medium);
    text-transform: uppercase;
  }

  &--button-small {
    @include apply-typography($semantic-typography-button-small);
    text-transform: uppercase;
  }

  // Link styles
  &--link {
    @include apply-typography($semantic-typography-body-medium);
    color: $semantic-color-interactive-primary;
    text-decoration: none;
    
    &:hover {
      color: var(--color-primary-hover, $semantic-color-interactive-primary);
      filter: brightness(0.9);
      text-decoration: underline;
    }
    
    &:focus {
      outline: 2px solid $semantic-color-border-focus;
      outline-offset: 2px;
    }
  }

  // Navigation text
  &--nav-primary {
    @include apply-typography($semantic-typography-nav-primary);
    color: $semantic-color-text-primary;
    
    &.active {
      color: $semantic-color-brand-primary;
      font-weight: $base-typography-font-weight-semibold;
    }
  }

  &--nav-secondary {
    @include apply-typography($semantic-typography-nav-secondary);
    color: $semantic-color-text-secondary;
  }
}

// ==========================================================================
// FORM TEXT STYLES
// ==========================================================================
// Text styles for form elements using semantic tokens

.skyui-form-text {
  // Labels
  &--label {
    @include apply-typography($semantic-typography-label);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-xs;
    display: block;
    
    &.required::after {
      content: ' *';
      color: $semantic-color-danger;
    }
  }

  // Input text
  &--input {
    @include apply-typography($semantic-typography-input);
    color: $semantic-color-text-primary;
    
    &::placeholder {
      @include apply-typography($semantic-typography-placeholder);
      color: $semantic-color-text-tertiary;
    }
  }

  // Help text
  &--help {
    @include apply-typography($semantic-typography-caption);
    color: $semantic-color-text-secondary;
    margin-top: $semantic-spacing-component-xs;
  }

  // Error text
  &--error {
    @include apply-typography($semantic-typography-caption);
    color: $semantic-color-danger;
    margin-top: $semantic-spacing-component-xs;
  }
}

// ==========================================================================
// CODE TEXT STYLES
// ==========================================================================
// Code and monospace text styles

.skyui-code {
  // Inline code
  &--inline {
    @include apply-typography($semantic-typography-code-inline);
    background-color: $semantic-color-surface-secondary;
    color: $semantic-color-text-primary;
    padding: $semantic-spacing-component-2xs $semantic-spacing-component-xs;
    border-radius: $semantic-border-radius-sm;
    border: 1px solid $semantic-color-border-secondary;
  }

  // Code block
  &--block {
    @include apply-typography($semantic-typography-code-block);
    background-color: $semantic-color-surface-sunken;
    color: $semantic-color-text-primary;
    padding: $semantic-spacing-component-md;
    border-radius: $semantic-border-radius-md;
    border: 1px solid $semantic-color-border-secondary;
    overflow-x: auto;
    white-space: pre;
  }
}KÇ䱢x!
/* You can add global styles to this file, and also import other style files */

// Set font paths before importing fontfaces
$inter-font-path: "/fonts/inter/" !default;
$comfortaa-font-path: "/fonts/comfortaa/" !default;

// Import specific fonts we need for the demo
@import '../../ui-design-system/src/styles/fontfaces/inter';
@import '../../ui-design-system/src/styles/fontfaces/comfortaa';

// Import project variables (which now has semantic tokens available)
@import 'scss/_variables';

// Import UI Animations
@import '../../ui-animations/src/styles/index';

html {
  height: 100%;
  font-size: 16px; // Base font size for rem calculations
  
  // Define default CSS custom properties for fonts
  // These can be overridden by the font manager
  --font-family-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-family-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
  --font-family-mono: ui-monospace, SFMono-Regular, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  --font-family-display: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

body {
  margin: 0;
  padding: 0;
  height: 100%;
  background-color: $semantic-color-surface-primary;
  color: $semantic-color-text-primary;
  
  // Apply base typography using CSS custom properties first, then fallback to semantic tokens
  font-family: var(--font-family-sans, map-get($semantic-typography-body-medium, font-family));
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-weight: map-get($semantic-typography-body-medium, font-weight);
  line-height: map-get($semantic-typography-body-medium, line-height);
  
  // Improve text rendering
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  
  // Support font transitions
  transition: font-family 0.3s ease-in-out;
}

// Global typography classes that respect font variables
h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-family-display, var(--font-family-sans));
  transition: font-family 0.3s ease-in-out;
}

// Serif elements
blockquote, .serif {
  font-family: var(--font-family-serif);
  transition: font-family 0.3s ease-in-out;
}

// Monospace elements  
code, pre, kbd, samp, .mono {
  font-family: var(--font-family-mono);
  transition: font-family 0.3s ease-in-out;
}

// Sans-serif elements
.sans {
  font-family: var(--font-family-sans);
  transition: font-family 0.3s ease-in-out;
}

// Display elements
.display {
  font-family: var(--font-family-display);
  transition: font-family 0.3s ease-in-out;
}
s/x[(c#gqFbQjnidF]$^&cdsM,['O~ĪϖS#S-  0Fx2 	ui-design-system%-ui-design-system[!Lex0!  q5xO/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "outDir": "../../out-tsc/app",
    "types": []
  },
  "files": [
    "src/main.ts"
  ],
  "include": [
    "src/**/*.d.ts"
  ]
}
9̋x'^/**
 * ==========================================================================
 * HCL COLOR CONVERTER
 * ==========================================================================
 * Accurate color space conversions between RGB, LAB, and HCL
 * Based on CIE LAB color space for perceptual uniformity
 * ==========================================================================
 */

import { RGB, LAB, HCL } from '../models/hcl.models';

export class HCLConverter {
  
  // ==========================================================================
  // RGB ↔ HCL CONVERSIONS
  // ==========================================================================

  /**
   * Convert RGB to HCL color space
   * @param r Red component (0-255)
   * @param g Green component (0-255)
   * @param b Blue component (0-255)
   * @returns HCL color
   */
  static rgbToHcl(r: number, g: number, b: number): HCL {
    const lab = this.rgbToLab(r, g, b);
    return this.labToHcl(lab.l, lab.a, lab.b);
  }

  /**
   * Convert HCL to RGB color space
   * @param h Hue (0-360)
   * @param c Chroma (0-100+)
   * @param l Lightness (0-100)
   * @returns RGB color
   */
  static hclToRgb(h: number, c: number, l: number): RGB {
    const lab = this.hclToLab(h, c, l);
    return this.labToRgb(lab.l, lab.a, lab.b);
  }

  // ==========================================================================
  // HEX CONVERSIONS
  // ==========================================================================

  /**
   * Convert hex string to HCL
   * @param hex Hex color string (#RRGGBB or #RGB)
   * @returns HCL color
   */
  static hexToHcl(hex: string): HCL {
    const rgb = this.hexToRgb(hex);
    return this.rgbToHcl(rgb.r, rgb.g, rgb.b);
  }

  /**
   * Convert HCL to hex string
   * @param h Hue (0-360)
   * @param c Chroma (0-100+)
   * @param l Lightness (0-100)
   * @returns Hex color string
   */
  static hclToHex(h: number, c: number, l: number): string {
    const rgb = this.hclToRgb(h, c, l);
    return this.rgbToHex(rgb.r, rgb.g, rgb.b);
  }

  // ==========================================================================
  // RGB ↔ LAB CONVERSIONS (via XYZ)
  // ==========================================================================

  /**
   * Convert RGB to LAB color space
   * @param r Red component (0-255)
   * @param g Green component (0-255)
   * @param b Blue component (0-255)
   * @returns LAB color
   */
  static rgbToLab(r: number, g: number, b: number): LAB {
    // Convert RGB to XYZ first
    let rNorm = r / 255;
    let gNorm = g / 255;
    let bNorm = b / 255;

    // Apply gamma correction (sRGB)
    rNorm = rNorm > 0.04045 ? Math.pow((rNorm + 0.055) / 1.055, 2.4) : rNorm / 12.92;
    gNorm = gNorm > 0.04045 ? Math.pow((gNorm + 0.055) / 1.055, 2.4) : gNorm / 12.92;
    bNorm = bNorm > 0.04045 ? Math.pow((bNorm + 0.055) / 1.055, 2.4) : bNorm / 12.92;

    // Convert to XYZ using sRGB matrix
    let x = rNorm * 0.4124564 + gNorm * 0.3575761 + bNorm * 0.1804375;
    let y = rNorm * 0.2126729 + gNorm * 0.7151522 + bNorm * 0.0721750;
    let z = rNorm * 0.0193339 + gNorm * 0.1191920 + bNorm * 0.9503041;

    // Normalize by D65 illuminant
    x = x / 0.95047;
    y = y / 1.00000;
    z = z / 1.08883;

    // Convert XYZ to LAB
    const fx = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x + 16/116);
    const fy = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y + 16/116);
    const fz = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z + 16/116);

    const l = (116 * fy) - 16;
    const a = 500 * (fx - fy);
    const bValue = 200 * (fy - fz);

    return { l: Math.max(0, Math.min(100, l)), a, b: bValue };
  }

  /**
   * Convert LAB to RGB color space
   * @param l Lightness (0-100)
   * @param a Green-Red axis
   * @param b Blue-Yellow axis
   * @returns RGB color
   */
  static labToRgb(l: number, a: number, b: number): RGB {
    // Convert LAB to XYZ
    const fy = (l + 16) / 116;
    const fx = a / 500 + fy;
    const fz = fy - b / 200;

    const x = (fx > 0.206897 ? Math.pow(fx, 3) : (fx - 16/116) / 7.787) * 0.95047;
    const y = (fy > 0.206897 ? Math.pow(fy, 3) : (fy - 16/116) / 7.787) * 1.00000;
    const z = (fz > 0.206897 ? Math.pow(fz, 3) : (fz - 16/116) / 7.787) * 1.08883;

    // Convert XYZ to RGB
    let r = x *  3.2404542 + y * -1.5371385 + z * -0.4985314;
    let g = x * -0.9692660 + y *  1.8760108 + z *  0.0415560;
    let b2 = x *  0.0556434 + y * -0.2040259 + z *  1.0572252;

    // Apply inverse gamma correction
    r = r > 0.0031308 ? 1.055 * Math.pow(r, 1/2.4) - 0.055 : 12.92 * r;
    g = g > 0.0031308 ? 1.055 * Math.pow(g, 1/2.4) - 0.055 : 12.92 * g;
    b2 = b2 > 0.0031308 ? 1.055 * Math.pow(b2, 1/2.4) - 0.055 : 12.92 * b2;

    // Clamp to valid RGB range
    const rFinal = Math.max(0, Math.min(255, Math.round(r * 255)));
    const gFinal = Math.max(0, Math.min(255, Math.round(g * 255)));
    const bFinal = Math.max(0, Math.min(255, Math.round(b2 * 255)));

    return { r: rFinal, g: gFinal, b: bFinal };
  }

  // ==========================================================================
  // LAB ↔ HCL CONVERSIONS
  // ==========================================================================

  /**
   * Convert LAB to HCL (cylindrical representation)
   * @param l Lightness (0-100)
   * @param a Green-Red axis
   * @param b Blue-Yellow axis
   * @returns HCL color
   */
  static labToHcl(l: number, a: number, b: number): HCL {
    const c = Math.sqrt(a * a + b * b);
    let h = Math.atan2(b, a) * (180 / Math.PI);
    
    // Normalize hue to 0-360
    if (h < 0) h += 360;
    
    return { 
      h: isNaN(h) ? 0 : h,
      c: isNaN(c) ? 0 : c,
      l: Math.max(0, Math.min(100, l))
    };
  }

  /**
   * Convert HCL to LAB color space
   * @param h Hue (0-360)
   * @param c Chroma (0-100+)
   * @param l Lightness (0-100)
   * @returns LAB color
   */
  static hclToLab(h: number, c: number, l: number): LAB {
    const hRad = (h * Math.PI) / 180;
    const a = c * Math.cos(hRad);
    const b = c * Math.sin(hRad);
    
    return { l, a, b };
  }

  // ==========================================================================
  // HEX UTILITY METHODS
  // ==========================================================================

  /**
   * Convert hex string to RGB
   * @param hex Hex color string
   * @returns RGB color
   */
  static hexToRgb(hex: string): RGB {
    // Remove # if present
    hex = hex.replace('#', '');
    
    // Handle 3-digit hex
    if (hex.length === 3) {
      hex = hex.split('').map(h => h + h).join('');
    }
    
    if (hex.length !== 6) {
      throw new Error(`Invalid hex color: ${hex}`);
    }
    
    const r = parseInt(hex.substr(0, 2), 16);
    const g = parseInt(hex.substr(2, 2), 16);
    const b = parseInt(hex.substr(4, 2), 16);
    
    return { r, g, b };
  }

  /**
   * Convert RGB to hex string
   * @param r Red component (0-255)
   * @param g Green component (0-255)
   * @param b Blue component (0-255)
   * @returns Hex color string
   */
  static rgbToHex(r: number, g: number, b: number): string {
    const toHex = (n: number) => {
      const hex = Math.max(0, Math.min(255, Math.round(n))).toString(16);
      return hex.length === 1 ? '0' + hex : hex;
    };
    
    return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
  }

  // ==========================================================================
  // COLOR MANIPULATION METHODS
  // ==========================================================================

  /**
   * Adjust lightness of a color
   * @param hex Original color
   * @param amount Lightness adjustment (-100 to 100)
   * @returns Adjusted color
   */
  static adjustLightness(hex: string, amount: number): string {
    const hcl = this.hexToHcl(hex);
    const newL = Math.max(0, Math.min(100, hcl.l + amount));
    return this.hclToHex(hcl.h, hcl.c, newL);
  }

  /**
   * Adjust chroma (saturation) of a color
   * @param hex Original color
   * @param amount Chroma adjustment (-100 to 100)
   * @returns Adjusted color
   */
  static adjustChroma(hex: string, amount: number): string {
    const hcl = this.hexToHcl(hex);
    const newC = Math.max(0, hcl.c + amount);
    return this.hclToHex(hcl.h, newC, hcl.l);
  }

  /**
   * Adjust hue of a color
   * @param hex Original color
   * @param amount Hue adjustment in degrees (-360 to 360)
   * @returns Adjusted color
   */
  static adjustHue(hex: string, amount: number): string {
    const hcl = this.hexToHcl(hex);
    let newH = hcl.h + amount;
    
    // Normalize hue to 0-360
    while (newH < 0) newH += 360;
    while (newH >= 360) newH -= 360;
    
    return this.hclToHex(newH, hcl.c, hcl.l);
  }

  // ==========================================================================
  // VALIDATION METHODS
  // ==========================================================================

  /**
   * Validate if a string is a valid hex color
   * @param hex Color string to validate
   * @returns True if valid hex color
   */
  static isValidHex(hex: string): boolean {
    try {
      const normalizedHex = hex.replace('#', '');
      return /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(normalizedHex);
    } catch {
      return false;
    }
  }

  /**
   * Calculate relative luminance of a color (for contrast calculation)
   * @param hex Hex color string
   * @returns Relative luminance (0-1)
   */
  static getRelativeLuminance(hex: string): number {
    const rgb = this.hexToRgb(hex);
    const [r, g, b] = [rgb.r, rgb.g, rgb.b].map(c => {
      c = c / 255;
      return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
    });
    
    return 0.2126 * r + 0.7152 * g + 0.0722 * b;
  }

  /**
   * Calculate contrast ratio between two colors
   * @param color1 First color
   * @param color2 Second color
   * @returns Contrast ratio (1-21)
   */
  static getContrastRatio(color1: string, color2: string): number {
    const lum1 = this.getRelativeLuminance(color1);
    const lum2 = this.getRelativeLuminance(color2);
    const lighter = Math.max(lum1, lum2);
    const darker = Math.min(lum1, lum2);
    
    return (lighter + 0.05) / (darker + 0.05);
  }
}X ٴx$1/**
 * ==========================================================================
 * PALETTE GENERATOR
 * ==========================================================================
 * Generate Material Design 3 compliant color palettes using HCL color space
 * Creates perceptually uniform tonal variations with proper contrast ratios
 * ==========================================================================
 */

import { HCLConverter } from './hcl-converter';
import { TonalPalette, MaterialPalette, BrandColors, HCL } from '../models/hcl.models';

export class PaletteGenerator {

  // ==========================================================================
  // MATERIAL DESIGN 3 TONE LEVELS
  // ==========================================================================
  
  private static readonly TONE_LEVELS = [0, 4, 5, 6, 10, 12, 15, 17, 20, 22, 25, 30, 35, 40, 50, 60, 70, 80, 87, 90, 92, 94, 95, 96, 98, 99, 100] as const;

  // ==========================================================================
  // MAIN PALETTE GENERATION
  // ==========================================================================

  /**
   * Generate complete Material Design 3 palette from brand colors
   * @param brandColors Primary, secondary, tertiary seed colors
   * @param mode Light or dark mode
   * @returns Complete Material Design 3 palette
   */
  static generateMaterialPalette(brandColors: BrandColors, mode: 'light' | 'dark' = 'light'): MaterialPalette {
    return {
      primary: this.generateTonalPalette(brandColors.primary),
      secondary: this.generateTonalPalette(brandColors.secondary),
      tertiary: this.generateTonalPalette(brandColors.tertiary),
      neutral: this.generateNeutralPalette(brandColors.primary),
      neutralVariant: this.generateNeutralVariantPalette(brandColors.primary),
      error: this.generateTonalPalette(brandColors.error || '#B3261E') // Material Design default error
    };
  }

  /**
   * Generate tonal palette from seed color
   * @param seedColor Hex color string
   * @returns Tonal palette with all tone levels
   */
  static generateTonalPalette(seedColor: string): TonalPalette {
    const seedHcl = HCLConverter.hexToHcl(seedColor);
    
    // Create palette object with all tone levels
    const palette = {} as TonalPalette;
    
    this.TONE_LEVELS.forEach(tone => {
      palette[tone as keyof TonalPalette] = this.generateTone(seedHcl, tone);
    });
    
    return palette;
  }

  /**
   * Generate neutral palette from primary color
   * @param primaryColor Primary seed color
   * @returns Neutral tonal palette
   */
  static generateNeutralPalette(primaryColor: string): TonalPalette {
    const primaryHcl = HCLConverter.hexToHcl(primaryColor);
    
    // Create neutral variation with reduced chroma and adjusted hue
    const neutralHcl: HCL = {
      h: primaryHcl.h,
      c: Math.min(primaryHcl.c * 0.08, 8), // Very low chroma for neutral
      l: primaryHcl.l
    };
    
    const palette = {} as TonalPalette;
    
    this.TONE_LEVELS.forEach(tone => {
      palette[tone as keyof TonalPalette] = this.generateTone(neutralHcl, tone);
    });
    
    return palette;
  }

  /**
   * Generate neutral variant palette from primary color
   * @param primaryColor Primary seed color
   * @returns Neutral variant tonal palette
   */
  static generateNeutralVariantPalette(primaryColor: string): TonalPalette {
    const primaryHcl = HCLConverter.hexToHcl(primaryColor);
    
    // Create neutral variant with slightly more chroma than neutral
    const neutralVariantHcl: HCL = {
      h: primaryHcl.h,
      c: Math.min(primaryHcl.c * 0.16, 16), // Low chroma but higher than neutral
      l: primaryHcl.l
    };
    
    const palette = {} as TonalPalette;
    
    this.TONE_LEVELS.forEach(tone => {
      palette[tone as keyof TonalPalette] = this.generateTone(neutralVariantHcl, tone);
    });
    
    return palette;
  }

  // ==========================================================================
  // TONE GENERATION
  // ==========================================================================

  /**
   * Generate specific tone from HCL seed
   * @param seedHcl Seed color in HCL space
   * @param tone Target tone level (0-100)
   * @returns Hex color string
   */
  private static generateTone(seedHcl: HCL, tone: number): string {
    // Apply tone-specific chroma adjustments for better visual consistency
    const chromaMultiplier = this.getChromaMultiplier(tone);
    const adjustedChroma = seedHcl.c * chromaMultiplier;
    
    // Create tone with adjusted lightness and chroma
    const toneHcl: HCL = {
      h: seedHcl.h,
      c: Math.max(0, adjustedChroma),
      l: tone
    };
    
    return HCLConverter.hclToHex(toneHcl.h, toneHcl.c, toneHcl.l);
  }

  /**
   * Get chroma multiplier based on tone level
   * Reduces chroma at very light and very dark tones for better visual balance
   * @param tone Tone level (0-100)
   * @returns Chroma multiplier (0-1)
   */
  private static getChromaMultiplier(tone: number): number {
    // Reduce chroma at extreme lightness values
    if (tone <= 10) return 0.6 + (tone / 10) * 0.3; // 0.6 to 0.9
    if (tone >= 90) return 1.1 - ((tone - 90) / 10) * 0.5; // 1.1 to 0.6
    if (tone >= 80) return 1.0 + ((tone - 80) / 10) * 0.1; // 1.0 to 1.1
    
    // Full chroma in middle ranges
    return 1.0;
  }

  // ==========================================================================
  // COLOR HARMONIES
  // ==========================================================================

  /**
   * Generate complementary color from seed
   * @param seedColor Seed color
   * @returns Complementary color
   */
  static generateComplementary(seedColor: string): string {
    const hcl = HCLConverter.hexToHcl(seedColor);
    const compHue = (hcl.h + 180) % 360;
    return HCLConverter.hclToHex(compHue, hcl.c, hcl.l);
  }

  /**
   * Generate analogous colors from seed
   * @param seedColor Seed color
   * @param count Number of analogous colors to generate
   * @returns Array of analogous colors
   */
  static generateAnalogous(seedColor: string, count: number = 3): string[] {
    const hcl = HCLConverter.hexToHcl(seedColor);
    const colors: string[] = [];
    const step = 30; // 30-degree steps
    
    for (let i = 0; i < count; i++) {
      const hue = (hcl.h + (i - Math.floor(count / 2)) * step) % 360;
      const adjustedHue = hue < 0 ? hue + 360 : hue;
      colors.push(HCLConverter.hclToHex(adjustedHue, hcl.c, hcl.l));
    }
    
    return colors;
  }

  /**
   * Generate triadic colors from seed
   * @param seedColor Seed color
   * @returns Array of triadic colors (including original)
   */
  static generateTriadic(seedColor: string): string[] {
    const hcl = HCLConverter.hexToHcl(seedColor);
    return [
      seedColor,
      HCLConverter.hclToHex((hcl.h + 120) % 360, hcl.c, hcl.l),
      HCLConverter.hclToHex((hcl.h + 240) % 360, hcl.c, hcl.l)
    ];
  }

  /**
   * Generate tetradic colors from seed
   * @param seedColor Seed color
   * @returns Array of tetradic colors
   */
  static generateTetradic(seedColor: string): string[] {
    const hcl = HCLConverter.hexToHcl(seedColor);
    return [
      seedColor,
      HCLConverter.hclToHex((hcl.h + 90) % 360, hcl.c, hcl.l),
      HCLConverter.hclToHex((hcl.h + 180) % 360, hcl.c, hcl.l),
      HCLConverter.hclToHex((hcl.h + 270) % 360, hcl.c, hcl.l)
    ];
  }

  // ==========================================================================
  // ACCESSIBILITY HELPERS
  // ==========================================================================

  /**
   * Ensure minimum contrast ratio for text readability
   * @param backgroundColor Background color
   * @param textColor Text color
   * @param minRatio Minimum contrast ratio (default: 4.5 for WCAG AA)
   * @returns Adjusted text color
   */
  static ensureContrast(backgroundColor: string, textColor: string, minRatio: number = 4.5): string {
    const currentRatio = HCLConverter.getContrastRatio(backgroundColor, textColor);
    
    if (currentRatio >= minRatio) {
      return textColor; // Already meets contrast requirements
    }
    
    const textHcl = HCLConverter.hexToHcl(textColor);
    const backgroundLuminance = HCLConverter.getRelativeLuminance(backgroundColor);
    
    // Adjust lightness to meet contrast requirements
    let adjustedL = textHcl.l;
    let bestColor = textColor;
    let bestRatio = currentRatio;
    
    // Try both lighter and darker variations
    for (let lightness = 0; lightness <= 100; lightness += 5) {
      const testColor = HCLConverter.hclToHex(textHcl.h, textHcl.c, lightness);
      const testRatio = HCLConverter.getContrastRatio(backgroundColor, testColor);
      
      if (testRatio >= minRatio && testRatio > bestRatio) {
        bestColor = testColor;
        bestRatio = testRatio;
        adjustedL = lightness;
      }
    }
    
    return bestColor;
  }

  /**
   * Get optimal text color (black or white) for background
   * @param backgroundColor Background color
   * @returns Optimal text color (#000000 or #FFFFFF)
   */
  static getOptimalTextColor(backgroundColor: string): string {
    const blackRatio = HCLConverter.getContrastRatio(backgroundColor, '#000000');
    const whiteRatio = HCLConverter.getContrastRatio(backgroundColor, '#FFFFFF');
    
    return blackRatio > whiteRatio ? '#000000' : '#FFFFFF';
  }

  // ==========================================================================
  // PALETTE UTILITIES
  // ==========================================================================

  /**
   * Get primary tone for specific use case
   * @param palette Tonal palette
   * @param usage Usage context ('main', 'container', 'on-container', etc.)
   * @param mode Light or dark mode
   * @returns Appropriate tone
   */
  static getPrimaryTone(palette: TonalPalette, usage: 'main' | 'container' | 'on-container' | 'surface', mode: 'light' | 'dark' = 'light'): string {
    if (mode === 'light') {
      switch (usage) {
        case 'main': return palette[40];
        case 'container': return palette[90];
        case 'on-container': return palette[10];
        case 'surface': return palette[98];
        default: return palette[40];
      }
    } else {
      switch (usage) {
        case 'main': return palette[80];
        case 'container': return palette[30];
        case 'on-container': return palette[90];
        case 'surface': return palette[10];
        default: return palette[80];
      }
    }
  }

  /**
   * Validate palette for accessibility and visual consistency
   * @param palette Material palette to validate
   * @returns Validation results
   */
  static validatePalette(palette: MaterialPalette): { isValid: boolean; issues: string[] } {
    const issues: string[] = [];

    // Check contrast ratios for common combinations
    const primaryMain = palette.primary[40];
    const primaryContainer = palette.primary[90];
    const onPrimary = palette.primary[100];
    const onPrimaryContainer = palette.primary[10];

    // Validate primary combinations
    const primaryContrastRatio = HCLConverter.getContrastRatio(primaryMain, onPrimary);
    if (primaryContrastRatio < 4.5) {
      issues.push(`Primary contrast ratio too low: ${primaryContrastRatio.toFixed(2)}`);
    }

    const containerContrastRatio = HCLConverter.getContrastRatio(primaryContainer, onPrimaryContainer);
    if (containerContrastRatio < 4.5) {
      issues.push(`Container contrast ratio too low: ${containerContrastRatio.toFixed(2)}`);
    }

    // Additional checks could be added here (color difference, chroma consistency, etc.)

    return {
      isValid: issues.length === 0,
      issues
    };
  }

  // ==========================================================================
  // PREVIEW GENERATION
  // ==========================================================================

  /**
   * Generate color preview for theme selection UI
   * @param brandColors Brand colors
   * @returns Preview color object
   */
  static generateColorPreview(brandColors: BrandColors): { [key: string]: string } {
    const palette = this.generateMaterialPalette(brandColors);
    
    return {
      'Primary': palette.primary[40],
      'Primary Container': palette.primary[90],
      'Secondary': palette.secondary[40],
      'Secondary Container': palette.secondary[90],
      'Tertiary': palette.tertiary[40],
      'Tertiary Container': palette.tertiary[90],
      'Surface': palette.neutral[98],
      'Surface Container': palette.neutral[94]
    };
  }
}:(x (import { Component } from '@angular/core';

@Component({
  selector: 'lib-hcl-studio',
  imports: [],
  template: `
    <p>
      hcl-studio works!
    </p>
  `,
  styles: ``
})
export class HclStudioComponent {

}
aDxlimport { TestBed } from '@angular/core/testing';

import { UiAccessibilityService } from './ui-accessibility.service';

describe('UiAccessibilityService', () => {
  let service: UiAccessibilityService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(UiAccessibilityService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});
 xiWpFbQjJhIfNqpjQYfrBBZQ~~1XR$WVJI-N.LJPG>q"72`
2w	c< *cyxZ >(nimationsService } from './ui-animationsl	nimations$	nimationsg	nimations4_!bx` =+CodeDisplayService } from './ui-code-displak
CodeDispla$
CodeDisplag
CodeDispla3`s"QxZ =(DataUtilsService } from './ui-data-utilsl	DataUtils#	DataUtilsf	DataUtils4_Q x:xd =,FontManagerService } from './ui-font-managerlFontManager#FontManagerfFontManager4_$o\xi ;DHclStudioService } from './hcl-studio.service';

describe('HclStudio!	HclStudiod	HclStudio!_%Ҿx.9/**
 * ==========================================================================
 * HCL STUDIO SERVICE
 * ==========================================================================
 * Main service for HCL-based color palette generation and theme management
 * Provides complete theme switching, persistence, and reactive updates
 * ==========================================================================
 */

import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';

import { 
  ThemeConfig, 
  Theme, 
  BrandColors, 
  MaterialPalette, 
  ThemePreview, 
  ThemeCollection, 
  ThemeState,
  HCLStudioOptions,
  ColorValidation 
} from './models/hcl.models';

import { PaletteGenerator } from './core/palette-generator';
import { HCLConverter } from './core/hcl-converter';
import { CSSVariableManager } from './themes/css-variable-manager';
import { ThemeStorage } from './themes/theme-storage';

@Injectable({
  providedIn: 'root'
})
export class HCLStudioService {

  // ==========================================================================
  // REACTIVE STATE
  // ==========================================================================

  private _themeState$ = new BehaviorSubject<ThemeState>({
    currentTheme: null,
    availableThemes: [],
    mode: 'light',
    isInitialized: false
  });

  private _currentMode$ = new BehaviorSubject<'light' | 'dark'>('light');

  // Public observables
  public readonly themeState$: Observable<ThemeState> = this._themeState$.asObservable();
  public readonly currentMode$: Observable<'light' | 'dark'> = this._currentMode$.asObservable();

  // ==========================================================================
  // PRIVATE STATE
  // ==========================================================================

  private builtInThemes = new Map<string, Theme>();
  private customThemes = new Map<string, Theme>();
  private currentTheme: Theme | null = null;
  private currentMode: 'light' | 'dark' = 'light';
  private options: HCLStudioOptions = {};

  // ==========================================================================
  // INITIALIZATION
  // ==========================================================================

  /**
   * Initialize HCL Studio with options and themes
   * @param options Initialization options
   */
  initialize(options: HCLStudioOptions = {}): void {
    this.options = {
      autoMode: false,
      storageKey: 'hcl-studio',
      validation: {
        enableContrastCheck: true,
        enableColorBlindCheck: false,
        minContrastRatio: 4.5
      },
      ...options
    };

    // Load built-in themes if provided
    if (options.themes) {
      this.registerThemes(options.themes);
    }

    // Load custom themes from storage
    this.loadCustomThemesFromStorage();

    // Restore user's last theme and mode
    this.restoreUserPreferences();

    // Apply default theme if specified
    if (options.defaultTheme) {
      if (typeof options.defaultTheme === 'string') {
        this.switchTheme(options.defaultTheme);
      } else {
        this.applyThemeConfig(options.defaultTheme);
      }
    }

    // Set up system theme detection if enabled
    if (options.autoMode) {
      this.setupAutoModeDetection();
    }

    this.updateThemeState();
    this.markAsInitialized();
  }

  /**
   * Quick initialize with brand colors
   * @param brandColors Primary, secondary, tertiary colors
   * @param mode Initial mode
   */
  initializeWithColors(brandColors: BrandColors, mode: 'light' | 'dark' = 'light'): void {
    const themeConfig: ThemeConfig = {
      id: 'brand-theme',
      name: 'Brand Theme',
      colors: brandColors,
      mode,
      createdAt: new Date()
    };

    this.initialize({
      defaultTheme: themeConfig,
      autoMode: false
    });
  }

  // ==========================================================================
  // THEME MANAGEMENT
  // ==========================================================================

  /**
   * Register multiple themes
   * @param themes Theme collection
   */
  registerThemes(themes: ThemeCollection): void {
    Object.entries(themes).forEach(([id, config]) => {
      const themeConfig: ThemeConfig = { id, ...config };
      const theme = this.createCompleteTheme(themeConfig);
      this.builtInThemes.set(id, theme);
    });
    
    this.updateThemeState();
  }

  /**
   * Create and save custom theme
   * @param id Theme identifier
   * @param name Theme display name
   * @param brandColors Brand colors
   * @param description Optional description
   * @returns Created theme
   */
  createCustomTheme(id: string, name: string, brandColors: BrandColors, description?: string): Theme {
    const themeConfig: ThemeConfig = {
      id,
      name,
      colors: brandColors,
      description,
      createdAt: new Date()
    };

    const theme = this.createCompleteTheme(themeConfig);
    this.customThemes.set(id, theme);
    
    // Save to storage
    ThemeStorage.saveCustomTheme(themeConfig);
    
    this.updateThemeState();
    return theme;
  }

  /**
   * Switch to different theme
   * @param themeId Theme identifier
   * @param mode Optional mode override
   */
  switchTheme(themeId: string, mode?: 'light' | 'dark'): void {
    const theme = this.getTheme(themeId);
    if (!theme) {
      console.warn(`Theme not found: ${themeId}`);
      return;
    }

    this.currentTheme = theme;
    
    if (mode) {
      this.currentMode = mode;
      this._currentMode$.next(mode);
      ThemeStorage.saveCurrentMode(mode);
    }

    // Apply the palette
    const palette = this.currentMode === 'light' ? theme.lightPalette : theme.darkPalette;
    CSSVariableManager.applyPaletteWithTransition(palette, this.currentMode);

    // Save preference
    ThemeStorage.saveCurrentTheme(themeId);
    
    this.updateThemeState();
  }

  /**
   * Apply theme configuration directly
   * @param themeConfig Theme configuration
   */
  applyThemeConfig(themeConfig: ThemeConfig): void {
    const theme = this.createCompleteTheme(themeConfig);
    this.currentTheme = theme;
    
    const resolvedMode = themeConfig.mode === 'auto' ? this.currentMode : (themeConfig.mode || this.currentMode);
    const palette = resolvedMode === 'light' ? theme.lightPalette : theme.darkPalette;
    
    CSSVariableManager.applyPaletteWithTransition(palette, resolvedMode);
    
    this.currentMode = resolvedMode;
    this._currentMode$.next(resolvedMode);
    
    this.updateThemeState();
  }

  /**
   * Toggle between light and dark mode
   */
  toggleMode(): void {
    const newMode = this.currentMode === 'light' ? 'dark' : 'light';
    this.switchMode(newMode);
  }

  /**
   * Switch to specific mode
   * @param mode Target mode
   */
  switchMode(mode: 'light' | 'dark'): void {
    if (this.currentMode === mode) return;
    
    this.currentMode = mode;
    this._currentMode$.next(mode);
    
    if (this.currentTheme) {
      const palette = mode === 'light' ? this.currentTheme.lightPalette : this.currentTheme.darkPalette;
      CSSVariableManager.applyPaletteWithTransition(palette, mode);
    }
    
    ThemeStorage.saveCurrentMode(mode);
    this.updateThemeState();
  }

  // ==========================================================================
  // COLOR UTILITIES
  // ==========================================================================

  /**
   * Generate color preview for theme selection
   * @param brandColors Brand colors
   * @returns Preview color object
   */
  generateColorPreview(brandColors: BrandColors): { [key: string]: string } {
    return PaletteGenerator.generateColorPreview(brandColors);
  }

  /**
   * Validate color format and accessibility
   * @param color Color string to validate
   * @returns Validation results
   */
  validateColor(color: string): ColorValidation {
    const warnings: string[] = [];
    const recommendations: string[] = [];

    // Check format validity
    if (!HCLConverter.isValidHex(color)) {
      warnings.push('Invalid hex color format');
      return { isValid: false, warnings, recommendations };
    }

    // Check if color is too light/dark for accessibility
    const hcl = HCLConverter.hexToHcl(color);
    
    if (hcl.l < 10) {
      warnings.push('Color may be too dark for some use cases');
      recommendations.push('Consider using lighter tones for better contrast');
    }
    
    if (hcl.l > 90) {
      warnings.push('Color may be too light for some use cases');
      recommendations.push('Consider using darker tones for better contrast');
    }

    // Check chroma levels
    if (hcl.c < 10) {
      recommendations.push('Low chroma - color may appear washed out');
    }

    if (hcl.c > 80) {
      recommendations.push('High chroma - consider reducing saturation for better balance');
    }

    return {
      isValid: warnings.length === 0,
      warnings,
      recommendations: recommendations.length > 0 ? recommendations : undefined
    };
  }

  // ==========================================================================
  // GETTERS
  // ==========================================================================

  /**
   * Get current theme state
   * @returns Current theme state
   */
  getCurrentThemeState(): ThemeState {
    return this._themeState$.value;
  }

  /**
   * Get current theme
   * @returns Current theme or null
   */
  getCurrentTheme(): Theme | null {
    return this.currentTheme;
  }

  /**
   * Get current mode
   * @returns Current mode
   */
  getCurrentMode(): 'light' | 'dark' {
    return this.currentMode;
  }

  /**
   * Get all available themes
   * @returns Array of theme previews
   */
  getAvailableThemes(): ThemePreview[] {
    const themes: ThemePreview[] = [];

    // Add built-in themes
    this.builtInThemes.forEach(theme => {
      themes.push({
        id: theme.config.id,
        name: theme.config.name,
        description: theme.config.description,
        primary: theme.config.colors.primary,
        secondary: theme.config.colors.secondary,
        tertiary: theme.config.colors.tertiary
      });
    });

    // Add custom themes
    this.customThemes.forEach(theme => {
      themes.push({
        id: theme.config.id,
        name: theme.config.name,
        description: theme.config.description,
        primary: theme.config.colors.primary,
        secondary: theme.config.colors.secondary,
        tertiary: theme.config.colors.tertiary
      });
    });

    return themes;
  }

  /**
   * Check if service is initialized
   * @returns True if initialized
   */
  isInitialized(): boolean {
    return this._themeState$.value.isInitialized;
  }

  // ==========================================================================
  // IMPORT/EXPORT
  // ==========================================================================

  /**
   * Export theme configuration
   * @param themeId Theme to export
   * @returns JSON string or null
   */
  exportTheme(themeId: string): string | null {
    return ThemeStorage.exportTheme(themeId);
  }

  /**
   * Import theme from JSON
   * @param jsonString Theme JSON data
   * @returns Imported theme or null
   */
  importTheme(jsonString: string): ThemeConfig | null {
    const imported = ThemeStorage.importTheme(jsonString);
    if (imported) {
      // Reload custom themes to include the new one
      this.loadCustomThemesFromStorage();
      this.updateThemeState();
    }
    return imported;
  }

  // ==========================================================================
  // PRIVATE METHODS
  // ==========================================================================

  /**
   * Create complete theme with both light and dark palettes
   * @param config Theme configuration
   * @returns Complete theme
   */
  private createCompleteTheme(config: ThemeConfig): Theme {
    const lightPalette = PaletteGenerator.generateMaterialPalette(config.colors, 'light');
    const darkPalette = PaletteGenerator.generateMaterialPalette(config.colors, 'dark');

    const lightCSSVariables = CSSVariableManager.generateCSSVariables(lightPalette, 'light');
    const darkCSSVariables = CSSVariableManager.generateCSSVariables(darkPalette, 'dark');

    return {
      config,
      lightPalette,
      darkPalette,
      cssVariables: lightCSSVariables // Default to light mode variables
    };
  }

  /**
   * Get theme by ID (checks both built-in and custom)
   * @param themeId Theme identifier
   * @returns Theme or null
   */
  private getTheme(themeId: string): Theme | null {
    return this.builtInThemes.get(themeId) || this.customThemes.get(themeId) || null;
  }

  /**
   * Load custom themes from storage
   */
  private loadCustomThemesFromStorage(): void {
    const customThemes = ThemeStorage.getCustomThemes();
    
    Object.values(customThemes).forEach(config => {
      const theme = this.createCompleteTheme(config);
      this.customThemes.set(config.id, theme);
    });
  }

  /**
   * Restore user's theme preferences
   */
  private restoreUserPreferences(): void {
    const savedThemeId = ThemeStorage.getCurrentTheme();
    const savedMode = ThemeStorage.getCurrentMode();
    
    this.currentMode = savedMode;
    this._currentMode$.next(savedMode);
    
    if (savedThemeId && this.getTheme(savedThemeId)) {
      this.switchTheme(savedThemeId, savedMode);
    }
  }

  /**
   * Set up automatic mode detection based on system preference
   */
  private setupAutoModeDetection(): void {
    if (typeof window !== 'undefined' && window.matchMedia) {
      const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
      
      const handleChange = (e: MediaQueryListEvent) => {
        const systemMode = e.matches ? 'dark' : 'light';
        this.switchMode(systemMode);
      };
      
      // Set initial mode
      const initialSystemMode = mediaQuery.matches ? 'dark' : 'light';
      this.switchMode(initialSystemMode);
      
      // Listen for changes
      mediaQuery.addEventListener('change', handleChange);
    }
  }

  /**
   * Update reactive theme state
   */
  private updateThemeState(): void {
    const state: ThemeState = {
      currentTheme: this.currentTheme,
      availableThemes: this.getAvailableThemes(),
      mode: this.currentMode,
      isInitialized: this._themeState$.value.isInitialized
    };
    
    this._themeState$.next(state);
  }

  /**
   * Mark service as initialized
   */
  private markAsInitialized(): void {
    const currentState = this._themeState$.value;
    this._themeState$.next({
      ...currentState,
      isInitialized: true
    });
  }
}ƭ>x/**
 * ==========================================================================
 * HCL STUDIO - TYPE DEFINITIONS
 * ==========================================================================
 * Core interfaces and types for HCL color manipulation and theme management
 * ==========================================================================
 */

// ==========================================================================
// COLOR TYPES
// ==========================================================================

/**
 * HCL color representation
 */
export interface HCL {
  /** Hue (0-360 degrees) */
  h: number;
  /** Chroma (0-100+) */
  c: number;
  /** Lightness (0-100) */
  l: number;
}

/**
 * RGB color representation
 */
export interface RGB {
  /** Red (0-255) */
  r: number;
  /** Green (0-255) */
  g: number;
  /** Blue (0-255) */
  b: number;
}

/**
 * LAB color representation (intermediate for HCL conversion)
 */
export interface LAB {
  /** Lightness (0-100) */
  l: number;
  /** Green-Red axis (-128 to 127) */
  a: number;
  /** Blue-Yellow axis (-128 to 127) */
  b: number;
}

// ==========================================================================
// PALETTE TYPES
// ==========================================================================

/**
 * Tonal palette with Material Design 3 tone levels
 */
export interface TonalPalette {
  0: string;
  4: string;
  5: string;
  6: string;
  10: string;
  12: string;
  15: string;
  17: string;
  20: string;
  22: string;
  25: string;
  30: string;
  35: string;
  40: string;
  50: string;
  60: string;
  70: string;
  80: string;
  87: string;
  90: string;
  92: string;
  94: string;
  95: string;
  96: string;
  98: string;
  99: string;
  100: string;
}

/**
 * Complete Material Design 3 color palette
 */
export interface MaterialPalette {
  primary: TonalPalette;
  secondary: TonalPalette;
  tertiary: TonalPalette;
  neutral: TonalPalette;
  neutralVariant: TonalPalette;
  error: TonalPalette;
}

/**
 * Brand seed colors
 */
export interface BrandColors {
  primary: string;
  secondary: string;
  tertiary: string;
  error?: string;
}

// ==========================================================================
// THEME TYPES
// ==========================================================================

/**
 * Theme configuration
 */
export interface ThemeConfig {
  id: string;
  name: string;
  colors: BrandColors;
  mode?: 'light' | 'dark' | 'auto';
  createdAt?: Date;
  description?: string;
}

/**
 * Complete theme with generated palettes
 */
export interface Theme {
  config: ThemeConfig;
  lightPalette: MaterialPalette;
  darkPalette: MaterialPalette;
  cssVariables: CSSVariables;
}

/**
 * CSS custom properties mapping
 */
export interface CSSVariables {
  [key: string]: string;
}

/**
 * Theme preview information
 */
export interface ThemePreview {
  id: string;
  name: string;
  description?: string;
  primary: string;
  secondary: string;
  tertiary: string;
}

/**
 * Theme collection
 */
export interface ThemeCollection {
  [themeId: string]: Omit<ThemeConfig, 'id'>;
}

// ==========================================================================
// VALIDATION TYPES
// ==========================================================================

/**
 * Color validation result
 */
export interface ColorValidation {
  isValid: boolean;
  warnings: string[];
  recommendations?: string[];
  accessibility?: AccessibilityInfo;
}

/**
 * Accessibility information
 */
export interface AccessibilityInfo {
  contrastRatio: number;
  wcagLevel: 'AA' | 'AAA' | 'fail';
  colorBlindSafe: boolean;
}

// ==========================================================================
// SERVICE CONFIGURATION TYPES
// ==========================================================================

/**
 * HCL Studio initialization options
 */
export interface HCLStudioOptions {
  /** Default theme to apply */
  defaultTheme?: string | ThemeConfig;
  /** Enable automatic mode switching based on system preference */
  autoMode?: boolean;
  /** Storage key for theme persistence */
  storageKey?: string;
  /** Custom theme presets */
  themes?: ThemeCollection;
  /** Validation options */
  validation?: {
    enableContrastCheck: boolean;
    enableColorBlindCheck: boolean;
    minContrastRatio: number;
  };
}

/**
 * Theme state for reactive updates
 */
export interface ThemeState {
  currentTheme: Theme | null;
  availableThemes: ThemePreview[];
  mode: 'light' | 'dark';
  isInitialized: boolean;
}

// ==========================================================================
// UTILITY TYPES
// ==========================================================================

/**
 * Color format types
 */
export type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'hcl';

/**
 * Mode switching options
 */
export type ThemeMode = 'light' | 'dark' | 'auto';

/**
 * Contrast levels for WCAG compliance
 */
export type ContrastLevel = 'AA' | 'AAA';

/**
 * Color harmony types
 */
export type ColorHarmony = 'complementary' | 'analogous' | 'triadic' | 'tetradic' | 'monochromatic';3x|4/**
 * ==========================================================================
 * CSS VARIABLE MANAGER
 * ==========================================================================
 * Manages CSS custom properties for dynamic theme switching
 * Maps Material Design 3 palette to existing design system variables
 * ==========================================================================
 */

import { MaterialPalette, CSSVariables } from '../models/hcl.models';
import { PaletteGenerator } from '../core/palette-generator';

export class CSSVariableManager {

  // ==========================================================================
  // VARIABLE MAPPING
  // ==========================================================================

  /**
   * Generate CSS variables from Material Design 3 palette
   * @param palette Material palette
   * @param mode Light or dark mode
   * @returns CSS variables object
   */
  static generateCSSVariables(palette: MaterialPalette, mode: 'light' | 'dark' = 'light'): CSSVariables {
    const variables: CSSVariables = {};

    // ==========================================================================
    // PRIMARY COLORS
    // ==========================================================================
    variables['--color-primary-key'] = palette.primary[40];
    variables['--color-primary'] = PaletteGenerator.getPrimaryTone(palette.primary, 'main', mode);
    variables['--color-on-primary'] = mode === 'light' ? palette.primary[100] : palette.primary[20];
    variables['--color-primary-container'] = PaletteGenerator.getPrimaryTone(palette.primary, 'container', mode);
    variables['--color-on-primary-container'] = PaletteGenerator.getPrimaryTone(palette.primary, 'on-container', mode);
    variables['--color-inverse-primary'] = mode === 'light' ? palette.primary[80] : palette.primary[40];

    // ==========================================================================
    // SECONDARY COLORS
    // ==========================================================================
    variables['--color-secondary-key'] = palette.secondary[40];
    variables['--color-secondary'] = mode === 'light' ? palette.secondary[40] : palette.secondary[80];
    variables['--color-on-secondary'] = mode === 'light' ? palette.secondary[100] : palette.secondary[20];
    variables['--color-secondary-container'] = mode === 'light' ? palette.secondary[90] : palette.secondary[30];
    variables['--color-on-secondary-container'] = mode === 'light' ? palette.secondary[10] : palette.secondary[90];

    // ==========================================================================
    // TERTIARY COLORS
    // ==========================================================================
    variables['--color-tertiary-key'] = palette.tertiary[40];
    variables['--color-tertiary'] = mode === 'light' ? palette.tertiary[40] : palette.tertiary[80];
    variables['--color-on-tertiary'] = mode === 'light' ? palette.tertiary[100] : palette.tertiary[20];
    variables['--color-tertiary-container'] = mode === 'light' ? palette.tertiary[90] : palette.tertiary[30];
    variables['--color-on-tertiary-container'] = mode === 'light' ? palette.tertiary[10] : palette.tertiary[90];

    // ==========================================================================
    // ERROR COLORS
    // ==========================================================================
    variables['--color-error-key'] = palette.error[40];
    variables['--color-error'] = mode === 'light' ? palette.error[40] : palette.error[80];
    variables['--color-on-error'] = mode === 'light' ? palette.error[100] : palette.error[20];
    variables['--color-error-container'] = mode === 'light' ? palette.error[90] : palette.error[30];
    variables['--color-on-error-container'] = mode === 'light' ? palette.error[10] : palette.error[90];

    // ==========================================================================
    // NEUTRAL COLORS
    // ==========================================================================
    variables['--color-neutral-key'] = palette.neutral[10];
    variables['--color-neutral'] = mode === 'light' ? palette.neutral[25] : palette.neutral[80];
    variables['--color-neutral-variant-key'] = palette.neutralVariant[15];
    variables['--color-neutral-variant'] = mode === 'light' ? palette.neutralVariant[30] : palette.neutralVariant[70];

    // ==========================================================================
    // SURFACE COLORS (The most important for your existing system)
    // ==========================================================================
    if (mode === 'light') {
      variables['--color-surface'] = palette.neutral[99];
      variables['--color-surface-bright'] = palette.neutral[99];
      variables['--color-surface-dim'] = palette.neutral[87];
      variables['--color-on-surface'] = palette.neutral[10];
      variables['--color-surface-lowest'] = palette.neutral[100];
      variables['--color-surface-low'] = palette.neutral[96];
      variables['--color-surface-container'] = palette.neutral[94];
      variables['--color-surface-high'] = palette.neutral[92];
      variables['--color-surface-highest'] = palette.neutral[90];
      variables['--color-surface-variant'] = palette.neutralVariant[90];
      variables['--color-on-surface-variant'] = palette.neutralVariant[30];
      variables['--color-inverse-surface'] = palette.neutral[20];
      variables['--color-inverse-on-surface'] = palette.neutral[95];
    } else {
      variables['--color-surface'] = palette.neutral[10];
      variables['--color-surface-bright'] = palette.neutral[20];
      variables['--color-surface-dim'] = palette.neutral[6];
      variables['--color-on-surface'] = palette.neutral[90];
      variables['--color-surface-lowest'] = palette.neutral[0];
      variables['--color-surface-low'] = palette.neutral[4];
      variables['--color-surface-container'] = palette.neutral[12];
      variables['--color-surface-high'] = palette.neutral[17];
      variables['--color-surface-highest'] = palette.neutral[22];
      variables['--color-surface-variant'] = palette.neutralVariant[30];
      variables['--color-on-surface-variant'] = palette.neutralVariant[80];
      variables['--color-inverse-surface'] = palette.neutral[90];
      variables['--color-inverse-on-surface'] = palette.neutral[20];
    }

    // ==========================================================================
    // BACKGROUND COLORS
    // ==========================================================================
    variables['--color-background'] = variables['--color-surface'];
    variables['--color-on-background'] = variables['--color-on-surface'];

    // ==========================================================================
    // OUTLINE COLORS
    // ==========================================================================
    variables['--color-outline'] = mode === 'light' ? palette.neutralVariant[50] : palette.neutralVariant[60];
    variables['--color-outline-variant'] = mode === 'light' ? palette.neutralVariant[80] : palette.neutralVariant[30];

    // ==========================================================================
    // UTILITY COLORS
    // ==========================================================================
    variables['--color-shadow'] = '#000000';
    variables['--color-surface-tint'] = variables['--color-primary'];
    variables['--color-scrim'] = '#000000';

    return variables;
  }

  // ==========================================================================
  // APPLY METHODS
  // ==========================================================================

  /**
   * Apply CSS variables to document root
   * @param variables CSS variables to apply
   */
  static applyVariables(variables: CSSVariables): void {
    const root = document.documentElement;
    
    Object.entries(variables).forEach(([property, value]) => {
      root.style.setProperty(property, value);
    });
  }

  /**
   * Apply palette to document root
   * @param palette Material palette
   * @param mode Light or dark mode
   */
  static applyPalette(palette: MaterialPalette, mode: 'light' | 'dark' = 'light'): void {
    const variables = this.generateCSSVariables(palette, mode);
    this.applyVariables(variables);
  }

  /**
   * Remove all theme-related CSS variables
   */
  static clearVariables(): void {
    const root = document.documentElement;
    const variableNames = this.getAllVariableNames();
    
    variableNames.forEach(name => {
      root.style.removeProperty(name);
    });
  }

  // ==========================================================================
  // UTILITY METHODS
  // ==========================================================================

  /**
   * Get all CSS variable names managed by HCL Studio
   * @returns Array of CSS variable names
   */
  private static getAllVariableNames(): string[] {
    return [
      // Primary
      '--color-primary-key',
      '--color-primary',
      '--color-on-primary',
      '--color-primary-container',
      '--color-on-primary-container',
      '--color-inverse-primary',
      
      // Secondary
      '--color-secondary-key',
      '--color-secondary',
      '--color-on-secondary',
      '--color-secondary-container',
      '--color-on-secondary-container',
      
      // Tertiary
      '--color-tertiary-key',
      '--color-tertiary',
      '--color-on-tertiary',
      '--color-tertiary-container',
      '--color-on-tertiary-container',
      
      // Error
      '--color-error-key',
      '--color-error',
      '--color-on-error',
      '--color-error-container',
      '--color-on-error-container',
      
      // Neutral
      '--color-neutral-key',
      '--color-neutral',
      '--color-neutral-variant-key',
      '--color-neutral-variant',
      
      // Surface
      '--color-surface',
      '--color-surface-bright',
      '--color-surface-dim',
      '--color-on-surface',
      '--color-surface-lowest',
      '--color-surface-low',
      '--color-surface-container',
      '--color-surface-high',
      '--color-surface-highest',
      '--color-surface-variant',
      '--color-on-surface-variant',
      '--color-inverse-surface',
      '--color-inverse-on-surface',
      
      // Background
      '--color-background',
      '--color-on-background',
      
      // Outline
      '--color-outline',
      '--color-outline-variant',
      
      // Utility
      '--color-shadow',
      '--color-surface-tint',
      '--color-scrim'
    ];
  }

  /**
   * Get current CSS variable value
   * @param variableName CSS variable name (with or without --)
   * @returns Current variable value
   */
  static getCurrentVariableValue(variableName: string): string {
    const name = variableName.startsWith('--') ? variableName : `--${variableName}`;
    return getComputedStyle(document.documentElement).getPropertyValue(name).trim();
  }

  /**
   * Check if dark mode is currently active
   * @returns True if dark mode is active
   */
  static isDarkModeActive(): boolean {
    // Check if surface color is dark (low lightness)
    const surfaceColor = this.getCurrentVariableValue('--color-surface');
    if (!surfaceColor) return false;
    
    try {
      // Simple check: if surface is closer to black than white, it's dark mode
      const surfaceHex = surfaceColor.startsWith('#') ? surfaceColor : '#FFFFFF';
      const surfaceRgb = this.hexToRgb(surfaceHex);
      const brightness = (surfaceRgb.r * 299 + surfaceRgb.g * 587 + surfaceRgb.b * 114) / 1000;
      return brightness < 128;
    } catch {
      return false;
    }
  }

  /**
   * Simple hex to RGB conversion for utility
   * @param hex Hex color
   * @returns RGB values
   */
  private static hexToRgb(hex: string): { r: number, g: number, b: number } {
    const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
    return result ? {
      r: parseInt(result[1], 16),
      g: parseInt(result[2], 16),
      b: parseInt(result[3], 16)
    } : { r: 0, g: 0, b: 0 };
  }

  // ==========================================================================
  // ANIMATION SUPPORT
  // ==========================================================================

  /**
   * Apply variables with smooth transition
   * @param variables CSS variables to apply
   * @param duration Transition duration in milliseconds
   */
  static applyVariablesWithTransition(variables: CSSVariables, duration: number = 300): void {
    const root = document.documentElement;
    
    // Add transition for smooth theme changes
    const transitionProperties = Object.keys(variables).join(', ');
    root.style.setProperty('transition', `${transitionProperties} ${duration}ms ease-in-out`);
    
    // Apply variables
    this.applyVariables(variables);
    
    // Remove transition after animation completes
    setTimeout(() => {
      root.style.removeProperty('transition');
    }, duration);
  }

  /**
   * Apply palette with smooth transition
   * @param palette Material palette
   * @param mode Light or dark mode
   * @param duration Transition duration in milliseconds
   */
  static applyPaletteWithTransition(palette: MaterialPalette, mode: 'light' | 'dark' = 'light', duration: number = 300): void {
    const variables = this.generateCSSVariables(palette, mode);
    this.applyVariablesWithTransition(variables, duration);
  }
}xNx#+/**
 * ==========================================================================
 * DEFAULT THEME PRESETS
 * ==========================================================================
 * Built-in theme configurations with carefully selected color combinations
 * Provides professionally designed themes for immediate use
 * ==========================================================================
 */

import { ThemeCollection } from '../models/hcl.models';

/**
 * Default theme collection with professionally curated color combinations
 */
export const DEFAULT_THEMES: ThemeCollection = {
  
  // ==========================================================================
  // MATERIAL DESIGN THEMES
  // ==========================================================================
  
  'material-purple': {
    name: 'Material Purple',
    description: 'Classic Material Design purple theme',
    colors: {
      primary: '#6750A4',
      secondary: '#625B71',
      tertiary: '#7D5260'
    }
  },

  'material-blue': {
    name: 'Material Blue',
    description: 'Material Design blue theme',
    colors: {
      primary: '#1976D2',
      secondary: '#455A64',
      tertiary: '#7B1FA2'
    }
  },

  'material-green': {
    name: 'Material Green',
    description: 'Material Design green theme',
    colors: {
      primary: '#2E7D32',
      secondary: '#5D4037',
      tertiary: '#1976D2'
    }
  },

  // ==========================================================================
  // CORPORATE/BUSINESS THEMES
  // ==========================================================================
  
  'corporate-blue': {
    name: 'Corporate Blue',
    description: 'Professional blue theme for business applications',
    colors: {
      primary: '#1565C0',
      secondary: '#37474F',
      tertiary: '#5E35B1'
    }
  },

  'executive': {
    name: 'Executive',
    description: 'Sophisticated theme with navy and gold accents',
    colors: {
      primary: '#263238',
      secondary: '#455A64',
      tertiary: '#FF8F00'
    }
  },

  'modern-corporate': {
    name: 'Modern Corporate',
    description: 'Contemporary corporate theme with teal accents',
    colors: {
      primary: '#00695C',
      secondary: '#424242',
      tertiary: '#7B1FA2'
    }
  },

  // ==========================================================================
  // NATURE-INSPIRED THEMES
  // ==========================================================================

  'forest': {
    name: 'Forest',
    description: 'Deep greens inspired by forest landscapes',
    colors: {
      primary: '#2E7D32',
      secondary: '#5D4037',
      tertiary: '#FF6F00'
    }
  },

  'ocean': {
    name: 'Ocean',
    description: 'Cool blues and teals reminiscent of ocean depths',
    colors: {
      primary: '#006064',
      secondary: '#263238',
      tertiary: '#00ACC1'
    }
  },

  'sunset': {
    name: 'Sunset',
    description: 'Warm oranges and deep purples of a sunset sky',
    colors: {
      primary: '#FF6F00',
      secondary: '#5D4037',
      tertiary: '#7B1FA2'
    }
  },

  'lavender': {
    name: 'Lavender Fields',
    description: 'Soft purples and greens inspired by lavender fields',
    colors: {
      primary: '#7E57C2',
      secondary: '#689F38',
      tertiary: '#8BC34A'
    }
  },

  // ==========================================================================
  // VIBRANT/CREATIVE THEMES
  // ==========================================================================

  'electric': {
    name: 'Electric',
    description: 'High-energy theme with electric blues and purples',
    colors: {
      primary: '#3F51B5',
      secondary: '#9C27B0',
      tertiary: '#00BCD4'
    }
  },

  'neon': {
    name: 'Neon',
    description: 'Bold neon-inspired theme for creative applications',
    colors: {
      primary: '#E91E63',
      secondary: '#9C27B0',
      tertiary: '#00BCD4'
    }
  },

  'cyberpunk': {
    name: 'Cyberpunk',
    description: 'Futuristic theme with cyan and magenta accents',
    colors: {
      primary: '#00E5FF',
      secondary: '#263238',
      tertiary: '#FF1744'
    }
  },

  // ==========================================================================
  // WARM/COZY THEMES
  // ==========================================================================

  'autumn': {
    name: 'Autumn',
    description: 'Warm autumn colors with orange and brown tones',
    colors: {
      primary: '#FF5722',
      secondary: '#5D4037',
      tertiary: '#FF9800'
    }
  },

  'coffee': {
    name: 'Coffee House',
    description: 'Rich browns and warm tones for a cozy feel',
    colors: {
      primary: '#5D4037',
      secondary: '#8D6E63',
      tertiary: '#FF8F00'
    }
  },

  'golden': {
    name: 'Golden',
    description: 'Luxurious theme with gold and deep blue accents',
    colors: {
      primary: '#FF8F00',
      secondary: '#1565C0',
      tertiary: '#7B1FA2'
    }
  },

  // ==========================================================================
  // MONOCHROMATIC THEMES
  // ==========================================================================

  'midnight': {
    name: 'Midnight',
    description: 'Dark theme with subtle blue undertones',
    colors: {
      primary: '#1A237E',
      secondary: '#283593',
      tertiary: '#3F51B5'
    }
  },

  'slate': {
    name: 'Slate',
    description: 'Sophisticated grays with blue-gray undertones',
    colors: {
      primary: '#455A64',
      secondary: '#607D8B',
      tertiary: '#90A4AE'
    }
  },

  'charcoal': {
    name: 'Charcoal',
    description: 'Dark charcoal theme with minimal color accents',
    colors: {
      primary: '#263238',
      secondary: '#37474F',
      tertiary: '#546E7A'
    }
  },

  // ==========================================================================
  // PASTEL/SOFT THEMES
  // ==========================================================================

  'soft-pink': {
    name: 'Soft Pink',
    description: 'Gentle theme with soft pink and lavender tones',
    colors: {
      primary: '#AD1457',
      secondary: '#7B1FA2',
      tertiary: '#512DA8'
    }
  },

  'mint': {
    name: 'Mint',
    description: 'Fresh theme with mint greens and soft blues',
    colors: {
      primary: '#00695C',
      secondary: '#00838F',
      tertiary: '#0277BD'
    }
  },

  'cream': {
    name: 'Cream',
    description: 'Warm, soft theme with cream and beige tones',
    colors: {
      primary: '#8D6E63',
      secondary: '#A1887F',
      tertiary: '#FF8A65'
    }
  },

  // ==========================================================================
  // HIGH CONTRAST THEMES
  // ==========================================================================

  'high-contrast': {
    name: 'High Contrast',
    description: 'Maximum contrast theme for accessibility',
    colors: {
      primary: '#000000',
      secondary: '#424242',
      tertiary: '#757575'
    }
  },

  'accessibility': {
    name: 'Accessibility',
    description: 'Optimized for maximum readability and contrast',
    colors: {
      primary: '#1565C0',
      secondary: '#0D47A1',
      tertiary: '#1A237E'
    }
  }
};

/**
 * Get theme by category
 */
export const getThemesByCategory = () => {
  return {
    material: ['material-purple', 'material-blue', 'material-green'],
    corporate: ['corporate-blue', 'executive', 'modern-corporate'],
    nature: ['forest', 'ocean', 'sunset', 'lavender'],
    vibrant: ['electric', 'neon', 'cyberpunk'],
    warm: ['autumn', 'coffee', 'golden'],
    monochrome: ['midnight', 'slate', 'charcoal'],
    pastel: ['soft-pink', 'mint', 'cream'],
    accessibility: ['high-contrast', 'accessibility']
  };
};

/**
 * Get recommended themes for specific use cases
 */
export const getRecommendedThemes = () => {
  return {
    business: ['corporate-blue', 'executive', 'modern-corporate', 'slate'],
    creative: ['electric', 'neon', 'cyberpunk', 'sunset'],
    healthcare: ['soft-pink', 'mint', 'ocean', 'accessibility'],
    finance: ['corporate-blue', 'executive', 'charcoal', 'midnight'],
    education: ['material-blue', 'forest', 'accessibility', 'mint'],
    ecommerce: ['material-purple', 'golden', 'sunset', 'electric'],
    dashboard: ['corporate-blue', 'slate', 'midnight', 'accessibility'],
    mobile: ['material-purple', 'material-blue', 'ocean', 'neon']
  };
};

/**
 * Get theme metadata
 * @param themeId Theme identifier
 * @returns Theme metadata or null
 */
export const getThemeMetadata = (themeId: string) => {
  const theme = DEFAULT_THEMES[themeId];
  if (!theme) return null;

  const categories = getThemesByCategory();
  const recommendations = getRecommendedThemes();

  // Find which category this theme belongs to
  let category = 'other';
  for (const [cat, themes] of Object.entries(categories)) {
    if (themes.includes(themeId)) {
      category = cat;
      break;
    }
  }

  // Find recommended use cases
  const useCases: string[] = [];
  for (const [useCase, themes] of Object.entries(recommendations)) {
    if (themes.includes(themeId)) {
      useCases.push(useCase);
    }
  }

  return {
    ...theme,
    category,
    useCases,
    id: themeId
  };
};_%Vx./**
 * ==========================================================================
 * THEME STORAGE SERVICE
 * ==========================================================================
 * Handles persistence of themes and user preferences using localStorage
 * Provides backup and import/export functionality
 * ==========================================================================
 */

import { ThemeConfig, ThemeCollection } from '../models/hcl.models';

export class ThemeStorage {

  private static readonly STORAGE_KEYS = {
    CURRENT_THEME: 'hcl-studio-current-theme',
    CURRENT_MODE: 'hcl-studio-current-mode',
    CUSTOM_THEMES: 'hcl-studio-custom-themes',
    USER_PREFERENCES: 'hcl-studio-preferences'
  } as const;

  // ==========================================================================
  // CURRENT THEME PERSISTENCE
  // ==========================================================================

  /**
   * Save current theme ID
   * @param themeId Theme identifier
   */
  static saveCurrentTheme(themeId: string): void {
    try {
      localStorage.setItem(this.STORAGE_KEYS.CURRENT_THEME, themeId);
    } catch (error) {
      console.warn('Failed to save current theme:', error);
    }
  }

  /**
   * Get current theme ID
   * @returns Current theme ID or null
   */
  static getCurrentTheme(): string | null {
    try {
      return localStorage.getItem(this.STORAGE_KEYS.CURRENT_THEME);
    } catch (error) {
      console.warn('Failed to get current theme:', error);
      return null;
    }
  }

  /**
   * Save current mode (light/dark)
   * @param mode Current mode
   */
  static saveCurrentMode(mode: 'light' | 'dark'): void {
    try {
      localStorage.setItem(this.STORAGE_KEYS.CURRENT_MODE, mode);
    } catch (error) {
      console.warn('Failed to save current mode:', error);
    }
  }

  /**
   * Get current mode
   * @returns Current mode or 'light' as default
   */
  static getCurrentMode(): 'light' | 'dark' {
    try {
      const mode = localStorage.getItem(this.STORAGE_KEYS.CURRENT_MODE);
      return mode === 'dark' ? 'dark' : 'light';
    } catch (error) {
      console.warn('Failed to get current mode:', error);
      return 'light';
    }
  }

  // ==========================================================================
  // CUSTOM THEMES MANAGEMENT
  // ==========================================================================

  /**
   * Save a custom theme
   * @param themeConfig Theme configuration
   */
  static saveCustomTheme(themeConfig: ThemeConfig): void {
    try {
      const customThemes = this.getCustomThemes();
      customThemes[themeConfig.id] = {
        ...themeConfig,
        createdAt: themeConfig.createdAt || new Date()
      };
      
      localStorage.setItem(this.STORAGE_KEYS.CUSTOM_THEMES, JSON.stringify(customThemes));
    } catch (error) {
      console.warn('Failed to save custom theme:', error);
    }
  }

  /**
   * Get all custom themes
   * @returns Custom themes collection
   */
  static getCustomThemes(): { [id: string]: ThemeConfig } {
    try {
      const stored = localStorage.getItem(this.STORAGE_KEYS.CUSTOM_THEMES);
      return stored ? JSON.parse(stored) : {};
    } catch (error) {
      console.warn('Failed to get custom themes:', error);
      return {};
    }
  }

  /**
   * Get specific custom theme
   * @param themeId Theme ID
   * @returns Theme configuration or null
   */
  static getCustomTheme(themeId: string): ThemeConfig | null {
    const customThemes = this.getCustomThemes();
    return customThemes[themeId] || null;
  }

  /**
   * Delete custom theme
   * @param themeId Theme ID to delete
   */
  static deleteCustomTheme(themeId: string): void {
    try {
      const customThemes = this.getCustomThemes();
      delete customThemes[themeId];
      localStorage.setItem(this.STORAGE_KEYS.CUSTOM_THEMES, JSON.stringify(customThemes));
    } catch (error) {
      console.warn('Failed to delete custom theme:', error);
    }
  }

  /**
   * Check if theme is custom (user-created)
   * @param themeId Theme ID
   * @returns True if theme is custom
   */
  static isCustomTheme(themeId: string): boolean {
    const customThemes = this.getCustomThemes();
    return themeId in customThemes;
  }

  // ==========================================================================
  // USER PREFERENCES
  // ==========================================================================

  /**
   * Save user preferences
   * @param preferences User preference object
   */
  static savePreferences(preferences: any): void {
    try {
      localStorage.setItem(this.STORAGE_KEYS.USER_PREFERENCES, JSON.stringify(preferences));
    } catch (error) {
      console.warn('Failed to save preferences:', error);
    }
  }

  /**
   * Get user preferences
   * @returns User preferences or default object
   */
  static getPreferences(): any {
    try {
      const stored = localStorage.getItem(this.STORAGE_KEYS.USER_PREFERENCES);
      return stored ? JSON.parse(stored) : {
        autoMode: false,
        transitionDuration: 300,
        enableSystemTheme: true
      };
    } catch (error) {
      console.warn('Failed to get preferences:', error);
      return {
        autoMode: false,
        transitionDuration: 300,
        enableSystemTheme: true
      };
    }
  }

  // ==========================================================================
  // IMPORT/EXPORT FUNCTIONALITY
  // ==========================================================================

  /**
   * Export theme configuration as JSON string
   * @param themeId Theme ID to export
   * @returns JSON string or null if theme not found
   */
  static exportTheme(themeId: string): string | null {
    const customTheme = this.getCustomTheme(themeId);
    if (!customTheme) return null;

    const exportData = {
      version: '1.0',
      exportDate: new Date().toISOString(),
      theme: customTheme
    };

    return JSON.stringify(exportData, null, 2);
  }

  /**
   * Import theme from JSON string
   * @param jsonString JSON theme data
   * @returns Imported theme config or null if invalid
   */
  static importTheme(jsonString: string): ThemeConfig | null {
    try {
      const importData = JSON.parse(jsonString);
      
      // Validate import data structure
      if (!importData.theme || !importData.theme.id || !importData.theme.name || !importData.theme.colors) {
        throw new Error('Invalid theme format');
      }

      const themeConfig: ThemeConfig = {
        ...importData.theme,
        createdAt: new Date(),
        description: importData.theme.description || 'Imported theme'
      };

      // Check for ID conflicts and rename if necessary
      const existingThemes = this.getCustomThemes();
      if (existingThemes[themeConfig.id]) {
        themeConfig.id = this.generateUniqueId(themeConfig.id, existingThemes);
      }

      // Save imported theme
      this.saveCustomTheme(themeConfig);
      
      return themeConfig;
    } catch (error) {
      console.warn('Failed to import theme:', error);
      return null;
    }
  }

  /**
   * Export all custom themes
   * @returns JSON string with all custom themes
   */
  static exportAllThemes(): string {
    const customThemes = this.getCustomThemes();
    
    const exportData = {
      version: '1.0',
      exportDate: new Date().toISOString(),
      themes: customThemes
    };

    return JSON.stringify(exportData, null, 2);
  }

  /**
   * Import multiple themes from JSON string
   * @param jsonString JSON data with multiple themes
   * @returns Array of imported theme IDs
   */
  static importMultipleThemes(jsonString: string): string[] {
    try {
      const importData = JSON.parse(jsonString);
      const importedIds: string[] = [];
      
      if (!importData.themes) {
        throw new Error('Invalid multi-theme format');
      }

      const existingThemes = this.getCustomThemes();

      Object.values(importData.themes).forEach((theme: any) => {
        if (theme.id && theme.name && theme.colors) {
          let themeConfig: ThemeConfig = {
            ...theme,
            createdAt: new Date(),
            description: theme.description || 'Imported theme'
          };

          // Handle ID conflicts
          if (existingThemes[themeConfig.id]) {
            themeConfig.id = this.generateUniqueId(themeConfig.id, existingThemes);
          }

          this.saveCustomTheme(themeConfig);
          importedIds.push(themeConfig.id);
        }
      });

      return importedIds;
    } catch (error) {
      console.warn('Failed to import multiple themes:', error);
      return [];
    }
  }

  // ==========================================================================
  // UTILITY METHODS
  // ==========================================================================

  /**
   * Generate unique theme ID to avoid conflicts
   * @param baseId Base theme ID
   * @param existingThemes Existing themes to check against
   * @returns Unique theme ID
   */
  private static generateUniqueId(baseId: string, existingThemes: { [id: string]: any }): string {
    let counter = 1;
    let newId = `${baseId}-${counter}`;
    
    while (existingThemes[newId]) {
      counter++;
      newId = `${baseId}-${counter}`;
    }
    
    return newId;
  }

  /**
   * Clear all stored data (reset to defaults)
   */
  static clearAllData(): void {
    try {
      Object.values(this.STORAGE_KEYS).forEach(key => {
        localStorage.removeItem(key);
      });
    } catch (error) {
      console.warn('Failed to clear storage data:', error);
    }
  }

  /**
   * Get storage usage information
   * @returns Storage usage stats
   */
  static getStorageInfo(): { customThemes: number; totalSize: number; isAvailable: boolean } {
    try {
      const customThemes = Object.keys(this.getCustomThemes()).length;
      let totalSize = 0;

      Object.values(this.STORAGE_KEYS).forEach(key => {
        const item = localStorage.getItem(key);
        if (item) {
          totalSize += item.length;
        }
      });

      return {
        customThemes,
        totalSize,
        isAvailable: true
      };
    } catch (error) {
      return {
        customThemes: 0,
        totalSize: 0,
        isAvailable: false
      };
    }
  }

  /**
   * Check if localStorage is available
   * @returns True if localStorage is available
   */
  static isStorageAvailable(): boolean {
    try {
      const test = 'hcl-studio-test';
      localStorage.setItem(test, test);
      localStorage.removeItem(test);
      return true;
    } catch {
      return false;
    }
  }

  /**
   * Create backup of all theme data
   * @returns Backup data object
   */
  static createBackup(): any {
    return {
      version: '1.0',
      backupDate: new Date().toISOString(),
      currentTheme: this.getCurrentTheme(),
      currentMode: this.getCurrentMode(),
      customThemes: this.getCustomThemes(),
      preferences: this.getPreferences()
    };
  }

  /**
   * Restore from backup data
   * @param backupData Backup data object
   * @returns True if restore was successful
   */
  static restoreFromBackup(backupData: any): boolean {
    try {
      if (backupData.currentTheme) {
        this.saveCurrentTheme(backupData.currentTheme);
      }
      
      if (backupData.currentMode) {
        this.saveCurrentMode(backupData.currentMode);
      }
      
      if (backupData.customThemes) {
        localStorage.setItem(this.STORAGE_KEYS.CUSTOM_THEMES, JSON.stringify(backupData.customThemes));
      }
      
      if (backupData.preferences) {
        this.savePreferences(backupData.preferences);
      }
      
      return true;
    } catch (error) {
      console.warn('Failed to restore from backup:', error);
      return false;
    }
  }
}ϲx}/*
 * Public API Surface of ui-essentials
 */

// ==========================================================================
// BUTTON COMPONENTS
// ==========================================================================
export { ButtonComponent, ButtonVariant, ButtonSize, IconPosition } from './lib/components/buttons/button.component';
export { TextButtonComponent } from './lib/components/buttons/text-button.component';
export { GhostButtonComponent } from './lib/components/buttons/ghost-button.component';
export { FabComponent } from './lib/components/buttons/fab.component';
export * from './lib/components/buttons/fab-menu';
export * from './lib/components/buttons/icon-button';
export * from './lib/components/buttons/split-button';

// ==========================================================================
// FORM COMPONENTS  
// ==========================================================================
export { TextInputComponent, TextInputSize, TextInputVariant, TextInputType, TextInputState } from './lib/components/forms/input/text-input.component';
export { TextareaComponent } from './lib/components/forms/input/textarea.component';
export * from './lib/components/forms/checkbox';
export * from './lib/components/forms/radio';
export * from './lib/components/forms/search';
export * from './lib/components/forms/switch';
export { SelectComponent } from './lib/components/forms/select/select.component';
export * from './lib/components/forms/autocomplete';
export * from './lib/components/forms/date-picker';
export * from './lib/components/forms/time-picker';
export * from './lib/components/forms/file-upload';
export * from './lib/components/forms/form-field';
export * from './lib/components/forms/range-slider';
export * from './lib/components/forms/color-picker';
export * from './lib/components/forms/tag-input';

// ==========================================================================
// DATA DISPLAY COMPONENTS
// ==========================================================================
export * from './lib/components/data-display/index';

// ==========================================================================
// NAVIGATION COMPONENTS
// ==========================================================================
export * from './lib/components/navigation/index';

// ==========================================================================
// MEDIA COMPONENTS
// ==========================================================================
export * from './lib/components/media/index';

// ==========================================================================
// FEEDBACK COMPONENTS
// ==========================================================================
export * from './lib/components/feedback/index';

// ==========================================================================
// OVERLAY COMPONENTS
// ==========================================================================
export * from './lib/components/overlays/index';

// ==========================================================================
// LAYOUT COMPONENTS
// ==========================================================================
export * from './lib/components/layout/index';

// Layout Components (avoiding conflicts with navigation tab components)
// Layout components removed for recreation
export { LoadingStateContainerComponent } from './lib/layouts/loading-state-container.component';
export type { LoadingState, ErrorState } from './lib/layouts/loading-state-container.component';

// Split View Component Types
export type { PanelConfig, ResizeEvent, SplitDirection, SplitSize, PanelVariant } from './lib/components/layout/split-view/split-view.component';
xUN@c0#JQ#ҰfUKIJ@krh/0In}'p7]sr?_'5CmN4ZLO<b铝[s	4IX$9P<@f[EV%L2CЌf5F&qab_eqs%}HS7aV@<tH0U)GZl\MK}4A)Q_`ʜWg٪5pJ.1EaDBk%4uO9]`}pPp(EU}{@\RGx1&d張﹊cl#Ds(O<L~VG6hx}J1iR+D8`"+Jq`:&V	νn|&M̜}IΟ{Ai 3S%*R)s5	w3y;l_!)y}UEAAk6CxM\%kdS6|{.6Cofn8.7_pVtaٜXyC~_<Č7LMgvWfeVFJаmAMH":(:6r'%ZZa԰1,cjRv)!wc^Ob.w.>f7?F.n%Q@Fcڅv.e1 RqIXX|C/nu]އ$?`5]wCm/ѿ8Qx@j*x?}?Fm}}܂Լb" ;(5$3?or4k8&l[؃빀r2K2Sa(TsV( 9

y9yi:
AřUe@:#\2l:MaE@SkҊss2'aP*)-گ`n  SsxC +// Layout components removed for recreation[c^/SnjgExοyF KeWx?! 5x  import { Component } from '@angular/core';

@Component({
  selector: 'lib-ui-data-utils',
  imports: [],
  template: `
    <p>
      ui-data-utils works!
    </p>
  `,
  styles: ``
})
export class UiDataUtilsComponent {

}
?Flxxq[qFbQj@R*
-)v-K+Q !+j	x oimport { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class UiAccessibilityService {

  constructor() { }
}
*^1nx8!;8#(5%$3xb" PB>x b
CodeDisplan"GYax b	DataUtilso!@x8!#8#(5%4sb 9Hx w/*
 * Public API Surface of shared-utils
 */

export * from './lib/shared-utils.service';
export * from './lib/shared-utils.component';
^,ǹx&{
  "name": "ui-accessibility",
  "version": "0.0.1",
  "description": "Comprehensive accessibility utilities for Angular applications with semantic token integration",
  "keywords": ["angular", "accessibility", "a11y", "wcag", "focus-management", "screen-reader", "semantic-tokens"],
  "peerDependencies": {
    "@angular/common": "^19.2.0",
    "@angular/core": "^19.2.0",
    "rxjs": "~7.8.0"
  },
  "dependencies": {
    "tslib": "^2.3.0"
  },
  "sideEffects": false
}
.9#x/ export * from './screen-reader-only.component';׽x=import { Component, Input } from '@angular/core';
import { CommonModule } from '@angular/common';

@Component({
  selector: 'ui-screen-reader-only',
  standalone: true,
  imports: [CommonModule],
  template: `
    <span 
      [class]="getClasses()"
      [attr.aria-live]="ariaLive"
      [attr.aria-atomic]="ariaAtomic"
      [attr.role]="role"
    >
      <ng-content></ng-content>
    </span>
  `,
  styles: [`
    .sr-only {
      position: absolute;
      width: 1px;
      height: 1px;
      padding: 0;
      margin: -1px;
      overflow: hidden;
      clip: rect(0, 0, 0, 0);
      white-space: nowrap;
      border: 0;
    }

    .sr-only-focusable {
      position: absolute;
      width: 1px;
      height: 1px;
      padding: 0;
      margin: -1px;
      overflow: hidden;
      clip: rect(0, 0, 0, 0);
      white-space: nowrap;
      border: 0;
    }

    .sr-only-focusable:focus,
    .sr-only-focusable:active {
      position: static;
      width: auto;
      height: auto;
      padding: 0.5rem 1rem;
      margin: 0;
      overflow: visible;
      clip: auto;
      white-space: normal;
      background: var(--a11y-skip-link-bg, #fff);
      color: var(--a11y-skip-link-color, #000);
      border: 1px solid var(--a11y-skip-link-border, #007bff);
      border-radius: 4px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
      z-index: 10000;
    }

    .status-message {
      position: absolute;
      width: 1px;
      height: 1px;
      padding: 0;
      margin: -1px;
      overflow: hidden;
      clip: rect(0, 0, 0, 0);
      white-space: nowrap;
      border: 0;
    }

    .status-message.status-visible {
      position: static;
      width: auto;
      height: auto;
      overflow: visible;
      clip: auto;
      white-space: normal;
      padding: 0.5rem 1rem;
      margin: 4px 0;
      background: var(--a11y-skip-link-bg, #fff);
      border-left: 4px solid var(--a11y-focus-color, #007bff);
      border-radius: 0 4px 4px 0;
    }

    .status-message.status-error {
      border-left-color: var(--a11y-error-color, #dc3545);
    }

    .status-message.status-success {
      border-left-color: var(--a11y-success-color, #28a745);
    }

    .status-message.status-warning {
      border-left-color: var(--a11y-warning-color, #ffc107);
    }

    .instructions {
      position: absolute;
      width: 1px;
      height: 1px;
      padding: 0;
      margin: -1px;
      overflow: hidden;
      clip: rect(0, 0, 0, 0);
      white-space: nowrap;
      border: 0;
    }

    @media (prefers-contrast: high) {
      .sr-only-focusable:focus,
      .sr-only-focusable:active {
        background: ButtonFace;
        color: ButtonText;
        border-color: ButtonText;
      }
      
      .status-message.status-visible {
        background: ButtonFace;
        color: ButtonText;
        border-color: ButtonText;
      }
    }
  `]
})
export class ScreenReaderOnlyComponent {
  @Input() type: 'default' | 'focusable' | 'status' | 'instructions' = 'default';
  @Input() statusType?: 'error' | 'success' | 'warning';
  @Input() visible = false;
  @Input() ariaLive?: 'polite' | 'assertive' | 'off';
  @Input() ariaAtomic?: 'true' | 'false';
  @Input() role?: string;

  /**
   * Get CSS classes based on component configuration
   */
  getClasses(): string {
    const classes: string[] = [];

    switch (this.type) {
      case 'focusable':
        classes.push('sr-only-focusable');
        break;
        
      case 'status':
        classes.push('status-message');
        if (this.visible) {
          classes.push('status-visible');
        }
        if (this.statusType) {
          classes.push(`status-${this.statusType}`);
        }
        break;
        
      case 'instructions':
        classes.push('instructions');
        break;
        
      default:
        classes.push('sr-only');
        break;
    }

    return classes.join(' ');
  }
}ux' export * from './skip-links.component';	͸ximport { Component, Input, OnInit, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { A11yConfigService } from '../../services/a11y-config';

export interface SkipLink {
  href: string;
  text: string;
  ariaLabel?: string;
}

@Component({
  selector: 'ui-skip-links',
  standalone: true,
  imports: [CommonModule],
  template: `
    <nav 
      class="skip-links" 
      [class.skip-links--after-header]="position === 'after-header'"
      role="navigation"
      aria-label="Skip navigation links"
    >
      @for (link of skipLinks; track link.href) {
        <a 
          class="skip-link"
          [href]="link.href"
          [attr.aria-label]="link.ariaLabel || link.text"
          (click)="handleSkipLinkClick($event, link.href)"
        >
          {{ link.text }}
        </a>
      }
    </nav>
  `,
  styles: [`
    .skip-links {
      position: fixed;
      top: 0;
      left: 0;
      z-index: 10000;
    }

    .skip-links--after-header {
      position: relative;
      display: block;
      background: var(--a11y-skip-link-bg, #fff);
      border-bottom: 1px solid var(--a11y-skip-link-border, #ccc);
      padding: 0.5rem;
    }

    .skip-link {
      position: absolute;
      top: -40px;
      left: 6px;
      background: var(--a11y-skip-link-bg, #fff);
      color: var(--a11y-skip-link-color, #000);
      padding: 0.5rem 1rem;
      text-decoration: none;
      border: 1px solid var(--a11y-skip-link-border, #007bff);
      border-radius: 4px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
      opacity: 0;
      pointer-events: none;
      transform: translateY(-10px);
      transition: all 0.15s ease-out;
      font-weight: 500;
      white-space: nowrap;
    }

    .skip-link:focus {
      top: 6px;
      opacity: 1;
      pointer-events: auto;
      transform: translateY(0);
      outline: 2px solid var(--a11y-focus-color, #007bff);
      outline-offset: 2px;
    }

    .skip-link:nth-child(2):focus {
      top: 50px;
    }

    .skip-link:nth-child(3):focus {
      top: 94px;
    }

    .skip-link:nth-child(4):focus {
      top: 138px;
    }

    .skip-links--after-header .skip-link {
      position: static;
      display: inline-block;
      margin-right: 1rem;
      opacity: 1;
      pointer-events: auto;
      transform: none;
      transition: background-color 0.15s ease-out;
    }

    .skip-links--after-header .skip-link:hover,
    .skip-links--after-header .skip-link:focus {
      background-color: var(--a11y-focus-ring-color, rgba(0, 123, 255, 0.1));
    }

    @media (prefers-contrast: high) {
      .skip-link {
        background: ButtonFace;
        color: ButtonText;
        border-color: ButtonText;
        outline-color: Highlight;
      }
    }

    @media (prefers-reduced-motion: reduce) {
      .skip-link {
        transition-duration: 0.01s;
      }
    }
  `]
})
export class SkipLinksComponent implements OnInit {
  private config = inject(A11yConfigService);

  @Input() skipLinks: SkipLink[] = [];
  @Input() position: 'top' | 'after-header' = 'top';
  @Input() showOnFocus = true;

  ngOnInit(): void {
    // Use default links from config if none provided
    if (this.skipLinks.length === 0) {
      const configLinks = this.config.getSection('skipLinks').links;
      if (configLinks) {
        this.skipLinks = configLinks.map(link => ({
          href: link.href,
          text: link.text,
          ariaLabel: `Skip to ${link.text.toLowerCase()}`
        }));
      }
    }

    // Use position from config if not explicitly set
    if (this.position === 'top') {
      const configPosition = this.config.getSection('skipLinks').position;
      if (configPosition) {
        this.position = configPosition;
      }
    }
  }

  /**
   * Handle skip link click to ensure proper focus management
   */
  handleSkipLinkClick(event: Event, href: string): void {
    event.preventDefault();
    
    const targetId = href.replace('#', '');
    const targetElement = document.getElementById(targetId);
    
    if (targetElement) {
      // Set tabindex to make element focusable if it's not naturally focusable
      const originalTabIndex = targetElement.getAttribute('tabindex');
      if (!this.isFocusable(targetElement)) {
        targetElement.setAttribute('tabindex', '-1');
      }
      
      // Focus the target element
      targetElement.focus();
      
      // Scroll to the element
      targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
      
      // Restore original tabindex after focus
      if (originalTabIndex === null && !this.isFocusable(targetElement)) {
        setTimeout(() => {
          targetElement.removeAttribute('tabindex');
        }, 100);
      }

      this.config.log('Skip link activated', { href, targetId });
    } else {
      this.config.warn('Skip link target not found', { href, targetId });
    }
  }

  /**
   * Check if an element is naturally focusable
   */
  private isFocusable(element: HTMLElement): boolean {
    const focusableSelectors = [
      'a[href]',
      'button',
      'textarea',
      'input[type="text"]',
      'input[type="radio"]',
      'input[type="checkbox"]',
      'select',
      '[tabindex]:not([tabindex="-1"])'
    ];
    
    return focusableSelectors.some(selector => element.matches(selector)) ||
           element.getAttribute('contenteditable') === 'true';
  }
}wdپx(import {
  Directive,
  ElementRef,
  Input,
  OnDestroy,
  OnInit,
  Output,
  EventEmitter,
  NgZone,
  inject
} from '@angular/core';
import { fromEvent, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { A11yConfigService } from '../../services/a11y-config';

export type NavigationDirection = 'horizontal' | 'vertical' | 'both' | 'grid';

export interface NavigationEvent {
  direction: 'up' | 'down' | 'left' | 'right' | 'home' | 'end';
  currentIndex: number;
  nextIndex: number;
  event: KeyboardEvent;
}

@Directive({
  selector: '[uiArrowNavigation]',
  standalone: true,
  exportAs: 'uiArrowNavigation'
})
export class ArrowNavigationDirective implements OnInit, OnDestroy {
  private elementRef = inject(ElementRef);
  private ngZone = inject(NgZone);
  private config = inject(A11yConfigService);

  @Input('uiArrowNavigation') direction: NavigationDirection = 'vertical';
  @Input() wrap = true;
  @Input() skipDisabled = true;
  @Input() itemSelector = '[tabindex]:not([tabindex="-1"]), button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled])';
  @Input() gridColumns?: number;

  @Output() navigationChange = new EventEmitter<NavigationEvent>();

  private destroy$ = new Subject<void>();
  private navigableItems: HTMLElement[] = [];
  private currentIndex = 0;
  private isGridNavigation = false;

  ngOnInit(): void {
    if (this.config.isEnabled('keyboard.enableArrowNavigation')) {
      this.setupNavigation();
    }
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  /**
   * Navigate to a specific index
   */
  navigateToIndex(index: number): void {
    this.updateNavigableItems();
    
    if (index >= 0 && index < this.navigableItems.length) {
      this.currentIndex = index;
      this.focusCurrentItem();
    }
  }

  /**
   * Navigate to the first item
   */
  navigateToFirst(): void {
    this.navigateToIndex(0);
  }

  /**
   * Navigate to the last item
   */
  navigateToLast(): void {
    this.updateNavigableItems();
    this.navigateToIndex(this.navigableItems.length - 1);
  }

  /**
   * Get the current navigation index
   */
  getCurrentIndex(): number {
    return this.currentIndex;
  }

  /**
   * Get the total number of navigable items
   */
  getItemCount(): number {
    this.updateNavigableItems();
    return this.navigableItems.length;
  }

  /**
   * Set up navigation listeners
   */
  private setupNavigation(): void {
    if (typeof document === 'undefined') return;

    this.isGridNavigation = this.direction === 'grid';
    this.updateNavigableItems();
    this.setupKeyboardListeners();
    this.setupFocusTracking();
  }

  /**
   * Update the list of navigable items
   */
  private updateNavigableItems(): void {
    const container = this.elementRef.nativeElement;
    const items = Array.from(
      container.querySelectorAll(this.itemSelector)
    ) as HTMLElement[];

    this.navigableItems = this.skipDisabled 
      ? items.filter((item: HTMLElement) => !this.isDisabled(item))
      : items;

    // Update current index if current item is no longer available
    if (this.currentIndex >= this.navigableItems.length) {
      this.currentIndex = Math.max(0, this.navigableItems.length - 1);
    }
  }

  /**
   * Set up keyboard event listeners
   */
  private setupKeyboardListeners(): void {
    this.ngZone.runOutsideAngular(() => {
      fromEvent<KeyboardEvent>(this.elementRef.nativeElement, 'keydown').pipe(
        takeUntil(this.destroy$)
      ).subscribe(event => {
        this.handleKeyDown(event);
      });

      // Update items when DOM changes
      const observer = new MutationObserver(() => {
        this.updateNavigableItems();
      });

      observer.observe(this.elementRef.nativeElement, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['disabled', 'tabindex', 'hidden']
      });

      this.destroy$.subscribe(() => observer.disconnect());
    });
  }

  /**
   * Set up focus tracking to maintain current index
   */
  private setupFocusTracking(): void {
    this.ngZone.runOutsideAngular(() => {
      fromEvent(this.elementRef.nativeElement, 'focusin').pipe(
        takeUntil(this.destroy$)
      ).subscribe((event) => {
        const focusEvent = event as FocusEvent;
        const target = focusEvent.target as HTMLElement;
        const index = this.navigableItems.indexOf(target);
        if (index >= 0) {
          this.currentIndex = index;
        }
      });
    });
  }

  /**
   * Handle keyboard navigation
   */
  private handleKeyDown(event: KeyboardEvent): void {
    if (this.navigableItems.length === 0) return;

    const { key } = event;
    let nextIndex = this.currentIndex;
    let direction: NavigationEvent['direction'] | null = null;

    switch (key) {
      case 'ArrowUp':
        direction = 'up';
        nextIndex = this.isGridNavigation 
          ? this.getGridIndex('up') 
          : this.getVerticalIndex('up');
        break;
        
      case 'ArrowDown':
        direction = 'down';
        nextIndex = this.isGridNavigation 
          ? this.getGridIndex('down') 
          : this.getVerticalIndex('down');
        break;
        
      case 'ArrowLeft':
        direction = 'left';
        nextIndex = this.isGridNavigation 
          ? this.getGridIndex('left') 
          : this.getHorizontalIndex('left');
        break;
        
      case 'ArrowRight':
        direction = 'right';
        nextIndex = this.isGridNavigation 
          ? this.getGridIndex('right') 
          : this.getHorizontalIndex('right');
        break;
        
      case 'Home':
        direction = 'home';
        nextIndex = 0;
        break;
        
      case 'End':
        direction = 'end';
        nextIndex = this.navigableItems.length - 1;
        break;
        
      default:
        return; // Don't handle other keys
    }

    if (direction && this.shouldHandleNavigation(key)) {
      event.preventDefault();
      event.stopPropagation();

      const navigationEvent: NavigationEvent = {
        direction,
        currentIndex: this.currentIndex,
        nextIndex,
        event
      };

      this.ngZone.run(() => {
        this.navigationChange.emit(navigationEvent);
      });

      if (nextIndex !== this.currentIndex && nextIndex >= 0 && nextIndex < this.navigableItems.length) {
        this.currentIndex = nextIndex;
        this.focusCurrentItem();
      }
    }
  }

  /**
   * Check if we should handle this navigation key
   */
  private shouldHandleNavigation(key: string): boolean {
    switch (this.direction) {
      case 'horizontal':
        return ['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(key);
      case 'vertical':
        return ['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key);
      case 'both':
      case 'grid':
        return ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(key);
      default:
        return false;
    }
  }

  /**
   * Get next index for vertical navigation
   */
  private getVerticalIndex(direction: 'up' | 'down'): number {
    const delta = direction === 'up' ? -1 : 1;
    let nextIndex = this.currentIndex + delta;

    if (this.wrap) {
      if (nextIndex < 0) {
        nextIndex = this.navigableItems.length - 1;
      } else if (nextIndex >= this.navigableItems.length) {
        nextIndex = 0;
      }
    } else {
      nextIndex = Math.max(0, Math.min(this.navigableItems.length - 1, nextIndex));
    }

    return nextIndex;
  }

  /**
   * Get next index for horizontal navigation
   */
  private getHorizontalIndex(direction: 'left' | 'right'): number {
    const delta = direction === 'left' ? -1 : 1;
    let nextIndex = this.currentIndex + delta;

    if (this.wrap) {
      if (nextIndex < 0) {
        nextIndex = this.navigableItems.length - 1;
      } else if (nextIndex >= this.navigableItems.length) {
        nextIndex = 0;
      }
    } else {
      nextIndex = Math.max(0, Math.min(this.navigableItems.length - 1, nextIndex));
    }

    return nextIndex;
  }

  /**
   * Get next index for grid navigation
   */
  private getGridIndex(direction: 'up' | 'down' | 'left' | 'right'): number {
    if (!this.gridColumns) {
      // Fallback to regular navigation if no columns specified
      return direction === 'up' || direction === 'down' 
        ? this.getVerticalIndex(direction as 'up' | 'down')
        : this.getHorizontalIndex(direction as 'left' | 'right');
    }

    const currentRow = Math.floor(this.currentIndex / this.gridColumns);
    const currentCol = this.currentIndex % this.gridColumns;
    let nextIndex = this.currentIndex;

    switch (direction) {
      case 'up':
        if (currentRow > 0) {
          nextIndex = (currentRow - 1) * this.gridColumns + currentCol;
        } else if (this.wrap) {
          const lastRow = Math.floor((this.navigableItems.length - 1) / this.gridColumns);
          nextIndex = Math.min(lastRow * this.gridColumns + currentCol, this.navigableItems.length - 1);
        }
        break;

      case 'down':
        const nextRow = currentRow + 1;
        const nextRowIndex = nextRow * this.gridColumns + currentCol;
        if (nextRowIndex < this.navigableItems.length) {
          nextIndex = nextRowIndex;
        } else if (this.wrap) {
          nextIndex = currentCol < this.navigableItems.length ? currentCol : 0;
        }
        break;

      case 'left':
        if (currentCol > 0) {
          nextIndex = this.currentIndex - 1;
        } else if (this.wrap) {
          const lastInRow = Math.min((currentRow + 1) * this.gridColumns - 1, this.navigableItems.length - 1);
          nextIndex = lastInRow;
        }
        break;

      case 'right':
        if (currentCol < this.gridColumns - 1 && this.currentIndex + 1 < this.navigableItems.length) {
          nextIndex = this.currentIndex + 1;
        } else if (this.wrap) {
          nextIndex = currentRow * this.gridColumns;
        }
        break;
    }

    return nextIndex;
  }

  /**
   * Focus the current item
   */
  private focusCurrentItem(): void {
    if (this.navigableItems[this.currentIndex]) {
      this.navigableItems[this.currentIndex].focus();
    }
  }

  /**
   * Check if an item is disabled
   */
  private isDisabled(item: HTMLElement): boolean {
    return item.hasAttribute('disabled') || 
           item.getAttribute('aria-disabled') === 'true' ||
           item.tabIndex === -1;
  }
}Ω#x- export * from './arrow-navigation.directive';p<x$import {
  Directive,
  ElementRef,
  Input,
  OnDestroy,
  OnInit,
  NgZone,
  inject
} from '@angular/core';
import { fromEvent, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { A11yConfigService } from '../../services/a11y-config';

@Directive({
  selector: '[uiFocusTrap]',
  standalone: true,
  exportAs: 'uiFocusTrap'
})
export class FocusTrapDirective implements OnInit, OnDestroy {
  private elementRef = inject(ElementRef);
  private ngZone = inject(NgZone);
  private config = inject(A11yConfigService);

  @Input('uiFocusTrap') enabled = true;
  @Input() autoFocus = true;
  @Input() restoreFocus = true;

  private destroy$ = new Subject<void>();
  private previouslyFocusedElement: HTMLElement | null = null;
  private focusableElements: HTMLElement[] = [];
  private firstFocusable: HTMLElement | null = null;
  private lastFocusable: HTMLElement | null = null;

  ngOnInit(): void {
    if (this.enabled) {
      this.setupFocusTrap();
    }
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
    
    if (this.restoreFocus && this.previouslyFocusedElement) {
      this.previouslyFocusedElement.focus();
    }
  }

  /**
   * Enable the focus trap
   */
  enable(): void {
    this.enabled = true;
    this.setupFocusTrap();
  }

  /**
   * Disable the focus trap
   */
  disable(): void {
    this.enabled = false;
    this.destroy$.next();
    
    if (this.restoreFocus && this.previouslyFocusedElement) {
      this.previouslyFocusedElement.focus();
    }
  }

  /**
   * Manually focus the first focusable element
   */
  focusFirst(): void {
    this.updateFocusableElements();
    if (this.firstFocusable) {
      this.firstFocusable.focus();
    }
  }

  /**
   * Manually focus the last focusable element
   */
  focusLast(): void {
    this.updateFocusableElements();
    if (this.lastFocusable) {
      this.lastFocusable.focus();
    }
  }

  /**
   * Set up the focus trap
   */
  private setupFocusTrap(): void {
    if (!this.enabled || typeof document === 'undefined') return;

    // Store the currently focused element to restore later
    this.previouslyFocusedElement = document.activeElement as HTMLElement;

    // Set up the trap
    setTimeout(() => {
      this.updateFocusableElements();
      this.setupKeyboardListeners();
      
      if (this.autoFocus) {
        this.focusFirst();
      }
    }, 0);
  }

  /**
   * Update the list of focusable elements
   */
  private updateFocusableElements(): void {
    const container = this.elementRef.nativeElement;
    
    const focusableSelectors = [
      'a[href]:not([disabled])',
      'button:not([disabled])',
      'textarea:not([disabled])',
      'input:not([disabled])',
      'select:not([disabled])',
      '[tabindex]:not([tabindex="-1"]):not([disabled])',
      '[contenteditable="true"]:not([disabled])',
      'audio[controls]:not([disabled])',
      'video[controls]:not([disabled])',
      'iframe:not([disabled])',
      'object:not([disabled])',
      'embed:not([disabled])',
      'area[href]:not([disabled])',
      'summary:not([disabled])'
    ].join(', ');

    const elements = container.querySelectorAll(focusableSelectors);
    this.focusableElements = Array.from(elements)
      .filter((element) => {
        const htmlElement = element as HTMLElement;
        // Filter out hidden elements
        return (
          htmlElement.offsetWidth > 0 ||
          htmlElement.offsetHeight > 0 ||
          htmlElement.getClientRects().length > 0
        );
      }) as HTMLElement[];

    this.firstFocusable = this.focusableElements[0] || null;
    this.lastFocusable = this.focusableElements[this.focusableElements.length - 1] || null;
  }

  /**
   * Set up keyboard event listeners
   */
  private setupKeyboardListeners(): void {
    this.ngZone.runOutsideAngular(() => {
      fromEvent<KeyboardEvent>(document, 'keydown').pipe(
        takeUntil(this.destroy$)
      ).subscribe(event => {
        if (event.key === 'Tab') {
          this.handleTabKey(event);
        }
      });

      // Update focusable elements when DOM changes
      const observer = new MutationObserver(() => {
        this.updateFocusableElements();
      });

      observer.observe(this.elementRef.nativeElement, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['tabindex', 'disabled', 'hidden']
      });

      // Clean up observer
      this.destroy$.subscribe(() => observer.disconnect());
    });
  }

  /**
   * Handle Tab key press
   */
  private handleTabKey(event: KeyboardEvent): void {
    if (!this.enabled || this.focusableElements.length === 0) return;

    // Check if focus is within our trap
    const activeElement = document.activeElement as HTMLElement;
    const isWithinTrap = this.elementRef.nativeElement.contains(activeElement);
    
    if (!isWithinTrap) {
      // Focus escaped the trap, bring it back
      event.preventDefault();
      this.focusFirst();
      return;
    }

    // Handle normal tab navigation within trap
    if (event.shiftKey) {
      // Shift + Tab (backward)
      if (activeElement === this.firstFocusable) {
        event.preventDefault();
        this.focusLast();
      }
    } else {
      // Tab (forward)
      if (activeElement === this.lastFocusable) {
        event.preventDefault();
        this.focusFirst();
      }
    }
  }
}{ܷx' export * from './focus-trap.directive';xLimport { Injectable, InjectionToken } from '@angular/core';

export interface A11yConfiguration {
  // Live announcer settings
  announcer?: {
    defaultPoliteness?: 'polite' | 'assertive';
    defaultDuration?: number;
    enabled?: boolean;
  };

  // Focus management settings
  focusManagement?: {
    trapFocus?: boolean;
    restoreFocus?: boolean;
    focusVisibleEnabled?: boolean;
    focusOriginDetection?: boolean;
  };

  // Keyboard navigation settings
  keyboard?: {
    enableShortcuts?: boolean;
    enableArrowNavigation?: boolean;
    enableRovingTabindex?: boolean;
    customShortcuts?: Array<{
      key: string;
      ctrlKey?: boolean;
      shiftKey?: boolean;
      altKey?: boolean;
      description?: string;
    }>;
  };

  // Skip links settings
  skipLinks?: {
    enabled?: boolean;
    position?: 'top' | 'after-header';
    showOnFocus?: boolean;
    links?: Array<{
      href: string;
      text: string;
    }>;
  };

  // Auto-enhancement settings
  autoEnhancement?: {
    enabled?: boolean;
    enhanceComponents?: string[]; // Component selectors to enhance
    addAriaAttributes?: boolean;
    addKeyboardSupport?: boolean;
    addFocusManagement?: boolean;
  };

  // High contrast and reduced motion
  accessibility?: {
    respectReducedMotion?: boolean;
    respectHighContrast?: boolean;
    injectAccessibilityStyles?: boolean;
    addBodyClasses?: boolean;
  };

  // Development settings
  development?: {
    warnings?: boolean;
    logging?: boolean;
    accessibilityAuditing?: boolean;
  };
}

export const DEFAULT_A11Y_CONFIG: Required<A11yConfiguration> = {
  announcer: {
    defaultPoliteness: 'polite',
    defaultDuration: 4000,
    enabled: true
  },
  focusManagement: {
    trapFocus: true,
    restoreFocus: true,
    focusVisibleEnabled: true,
    focusOriginDetection: true
  },
  keyboard: {
    enableShortcuts: true,
    enableArrowNavigation: true,
    enableRovingTabindex: true,
    customShortcuts: []
  },
  skipLinks: {
    enabled: true,
    position: 'top',
    showOnFocus: true,
    links: [
      { href: '#main', text: 'Skip to main content' },
      { href: '#navigation', text: 'Skip to navigation' }
    ]
  },
  autoEnhancement: {
    enabled: false,
    enhanceComponents: [],
    addAriaAttributes: true,
    addKeyboardSupport: true,
    addFocusManagement: true
  },
  accessibility: {
    respectReducedMotion: true,
    respectHighContrast: true,
    injectAccessibilityStyles: true,
    addBodyClasses: true
  },
  development: {
    warnings: true,
    logging: false,
    accessibilityAuditing: false
  }
};

export const A11Y_CONFIG = new InjectionToken<A11yConfiguration>('A11Y_CONFIG');

@Injectable({
  providedIn: 'root'
})
export class A11yConfigService {
  private config: Required<A11yConfiguration>;

  constructor() {
    this.config = { ...DEFAULT_A11Y_CONFIG };
  }

  /**
   * Update the configuration
   */
  updateConfig(config: Partial<A11yConfiguration>): void {
    this.config = this.mergeConfig(this.config, config);
  }

  /**
   * Get the current configuration
   */
  getConfig(): Required<A11yConfiguration> {
    return { ...this.config };
  }

  /**
   * Get a specific configuration section
   */
  getSection<K extends keyof A11yConfiguration>(section: K): Required<A11yConfiguration>[K] {
    return this.config[section];
  }

  /**
   * Check if a feature is enabled
   */
  isEnabled(feature: string): boolean {
    const parts = feature.split('.');
    let current: any = this.config;
    
    for (const part of parts) {
      if (current && typeof current === 'object' && part in current) {
        current = current[part];
      } else {
        return false;
      }
    }
    
    return current === true;
  }

  /**
   * Log a message if logging is enabled
   */
  log(message: string, ...args: any[]): void {
    if (this.config.development.logging) {
      console.log(`[A11y]`, message, ...args);
    }
  }

  /**
   * Log a warning if warnings are enabled
   */
  warn(message: string, ...args: any[]): void {
    if (this.config.development.warnings) {
      console.warn(`[A11y Warning]`, message, ...args);
    }
  }

  /**
   * Log an error
   */
  error(message: string, ...args: any[]): void {
    console.error(`[A11y Error]`, message, ...args);
  }

  /**
   * Deep merge configuration objects
   */
  private mergeConfig(
    base: Required<A11yConfiguration>, 
    override: Partial<A11yConfiguration>
  ): Required<A11yConfiguration> {
    const result = { ...base };
    
    for (const key in override) {
      const value = override[key as keyof A11yConfiguration];
      if (value !== undefined) {
        if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
          (result as any)[key] = this.mergeObjects(
            (result as any)[key] || {},
            value
          );
        } else {
          (result as any)[key] = value;
        }
      }
    }
    
    return result;
  }

  /**
   * Deep merge objects
   */
  private mergeObjects(base: any, override: any): any {
    const result = { ...base };
    
    for (const key in override) {
      const value = override[key];
      if (value !== undefined) {
        if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
          result[key] = this.mergeObjects(result[key] || {}, value);
        } else {
          result[key] = value;
        }
      }
    }
    
    return result;
  }
}Sx& export * from './a11y-config.service';qſximport { Injectable, NgZone, OnDestroy, ElementRef } from '@angular/core';
import { Observable, Subject, fromEvent, merge } from 'rxjs';
import { takeUntil, map, distinctUntilChanged } from 'rxjs/operators';

export type FocusOrigin = 'keyboard' | 'mouse' | 'touch' | 'program' | null;

export interface FocusMonitorOptions {
  detectSubtleFocusChanges?: boolean;
  checkChildren?: boolean;
}

export interface FocusEvent {
  origin: FocusOrigin;
  event: Event | null;
}

@Injectable({
  providedIn: 'root'
})
export class FocusMonitorService implements OnDestroy {
  private destroy$ = new Subject<void>();
  private currentFocusOrigin: FocusOrigin = null;
  private lastFocusOrigin: FocusOrigin = null;
  private lastTouchTarget: EventTarget | null = null;
  
  private monitoredElements = new Map<Element, {
    subject: Subject<FocusEvent>;
    unlisten: () => void;
  }>();

  constructor(private ngZone: NgZone) {
    this.setupGlobalListeners();
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
    
    // Clean up all monitored elements
    this.monitoredElements.forEach((info) => info.unlisten());
    this.monitoredElements.clear();
  }

  /**
   * Monitor focus changes on an element
   */
  monitor(
    element: Element | ElementRef<Element>,
    options: FocusMonitorOptions = {}
  ): Observable<FocusEvent> {
    const elementToMonitor = element instanceof ElementRef ? element.nativeElement : element;
    
    if (this.monitoredElements.has(elementToMonitor)) {
      return this.monitoredElements.get(elementToMonitor)!.subject.asObservable();
    }

    const subject = new Subject<FocusEvent>();
    
    const focusHandler = (event: FocusEvent) => {
      subject.next(event);
    };

    const blurHandler = () => {
      subject.next({ origin: null, event: null });
    };

    // Set up event listeners
    const focusListener = this.ngZone.runOutsideAngular(() => {
      return fromEvent(elementToMonitor, 'focus', { capture: true }).pipe(
        takeUntil(this.destroy$),
        map((event: Event) => ({
          origin: this.currentFocusOrigin,
          event
        }))
      ).subscribe(focusHandler);
    });

    const blurListener = this.ngZone.runOutsideAngular(() => {
      return fromEvent(elementToMonitor, 'blur', { capture: true }).pipe(
        takeUntil(this.destroy$)
      ).subscribe(blurHandler);
    });

    const unlisten = () => {
      focusListener.unsubscribe();
      blurListener.unsubscribe();
      subject.complete();
    };

    this.monitoredElements.set(elementToMonitor, { subject, unlisten });

    return subject.asObservable().pipe(
      distinctUntilChanged((x, y) => x.origin === y.origin)
    );
  }

  /**
   * Stop monitoring focus changes on an element
   */
  stopMonitoring(element: Element | ElementRef<Element>): void {
    const elementToStop = element instanceof ElementRef ? element.nativeElement : element;
    const info = this.monitoredElements.get(elementToStop);
    
    if (info) {
      info.unlisten();
      this.monitoredElements.delete(elementToStop);
    }
  }

  /**
   * Focus an element and mark it as programmatically focused
   */
  focusVia(element: Element | ElementRef<Element>, origin: FocusOrigin): void {
    const elementToFocus = element instanceof ElementRef ? element.nativeElement : element;
    
    this.setOrigin(origin);
    
    if (typeof (elementToFocus as any).focus === 'function') {
      (elementToFocus as HTMLElement).focus();
    }
  }

  /**
   * Get the current focus origin
   */
  getCurrentFocusOrigin(): FocusOrigin {
    return this.currentFocusOrigin;
  }

  /**
   * Set the focus origin for the next focus event
   */
  private setOrigin(origin: FocusOrigin): void {
    this.currentFocusOrigin = origin;
    this.lastFocusOrigin = origin;
  }

  /**
   * Set up global event listeners to detect focus origin
   */
  private setupGlobalListeners(): void {
    if (typeof document === 'undefined') return;

    this.ngZone.runOutsideAngular(() => {
      // Mouse events
      merge(
        fromEvent(document, 'mousedown', { capture: true }),
        fromEvent(document, 'mouseup', { capture: true })
      ).pipe(
        takeUntil(this.destroy$)
      ).subscribe(() => {
        this.setOrigin('mouse');
      });

      // Keyboard events
      fromEvent(document, 'keydown', { capture: true }).pipe(
        takeUntil(this.destroy$)
      ).subscribe((event) => {
        const keyEvent = event as KeyboardEvent;
        // Only set keyboard origin for navigation keys
        if (this.isNavigationKey(keyEvent.key)) {
          this.setOrigin('keyboard');
        }
      });

      // Touch events
      fromEvent(document, 'touchstart', { capture: true }).pipe(
        takeUntil(this.destroy$)
      ).subscribe((event) => {
        const touchEvent = event as TouchEvent;
        this.lastTouchTarget = touchEvent.target;
        this.setOrigin('touch');
      });

      // Focus events that might be programmatic
      fromEvent(document, 'focus', { capture: true }).pipe(
        takeUntil(this.destroy$)
      ).subscribe((event) => {
        // If we don't have an origin, assume it's programmatic
        if (this.currentFocusOrigin === null) {
          this.setOrigin('program');
        }
        
        // Reset origin after a short delay
        setTimeout(() => {
          this.currentFocusOrigin = null;
        }, 1);
      });
    });
  }

  /**
   * Check if a key is a navigation key
   */
  private isNavigationKey(key: string): boolean {
    const navigationKeys = [
      'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',
      'Home', 'End', 'PageUp', 'PageDown', 'Enter', ' ', 'Escape'
    ];
    return navigationKeys.includes(key);
  }
}(^x( export * from './focus-monitor.service';!(;ximport { Injectable, OnDestroy, signal } from '@angular/core';
import { Observable, fromEvent, Subject } from 'rxjs';
import { takeUntil, map, startWith, distinctUntilChanged } from 'rxjs/operators';

export interface AccessibilityPreferences {
  prefersReducedMotion: boolean;
  prefersHighContrast: boolean;
  prefersDarkMode: boolean;
  prefersReducedTransparency: boolean;
}

@Injectable({
  providedIn: 'root'
})
export class HighContrastService implements OnDestroy {
  private destroy$ = new Subject<void>();
  
  // Reactive signals for preferences
  readonly prefersReducedMotion = signal(false);
  readonly prefersHighContrast = signal(false);
  readonly prefersDarkMode = signal(false);
  readonly prefersReducedTransparency = signal(false);

  // Media query lists
  private reducedMotionQuery?: MediaQueryList;
  private highContrastQuery?: MediaQueryList;
  private darkModeQuery?: MediaQueryList;
  private reducedTransparencyQuery?: MediaQueryList;

  constructor() {
    this.setupMediaQueries();
    this.updatePreferences();
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  /**
   * Get all accessibility preferences as an observable
   */
  getPreferences$(): Observable<AccessibilityPreferences> {
    if (typeof window === 'undefined') {
      return new Observable(subscriber => {
        subscriber.next({
          prefersReducedMotion: false,
          prefersHighContrast: false,
          prefersDarkMode: false,
          prefersReducedTransparency: false
        });
      });
    }

    return fromEvent(window, 'change').pipe(
      takeUntil(this.destroy$),
      startWith(null),
      map(() => this.getCurrentPreferences()),
      distinctUntilChanged((prev, curr) => 
        prev.prefersReducedMotion === curr.prefersReducedMotion &&
        prev.prefersHighContrast === curr.prefersHighContrast &&
        prev.prefersDarkMode === curr.prefersDarkMode &&
        prev.prefersReducedTransparency === curr.prefersReducedTransparency
      )
    );
  }

  /**
   * Get current accessibility preferences
   */
  getCurrentPreferences(): AccessibilityPreferences {
    return {
      prefersReducedMotion: this.prefersReducedMotion(),
      prefersHighContrast: this.prefersHighContrast(),
      prefersDarkMode: this.prefersDarkMode(),
      prefersReducedTransparency: this.prefersReducedTransparency()
    };
  }

  /**
   * Apply CSS classes to document body based on preferences
   */
  applyPreferencesToBody(): void {
    if (typeof document === 'undefined') return;

    const body = document.body;
    
    // Remove existing classes
    body.classList.remove(
      'prefers-reduced-motion',
      'prefers-high-contrast',
      'prefers-dark-mode',
      'prefers-reduced-transparency'
    );

    // Add classes based on current preferences
    if (this.prefersReducedMotion()) {
      body.classList.add('prefers-reduced-motion');
    }
    
    if (this.prefersHighContrast()) {
      body.classList.add('prefers-high-contrast');
    }
    
    if (this.prefersDarkMode()) {
      body.classList.add('prefers-dark-mode');
    }
    
    if (this.prefersReducedTransparency()) {
      body.classList.add('prefers-reduced-transparency');
    }
  }

  /**
   * Get CSS custom properties for motion duration based on reduced motion preference
   */
  getMotionDuration(normalDuration: string, reducedDuration = '0.01s'): string {
    return this.prefersReducedMotion() ? reducedDuration : normalDuration;
  }

  /**
   * Get appropriate animation timing based on reduced motion preference
   */
  getAnimationConfig(normal: any, reduced: any = { duration: '0.01s', easing: 'linear' }): any {
    return this.prefersReducedMotion() ? reduced : normal;
  }

  /**
   * Check if user prefers reduced motion and return appropriate CSS
   */
  getReducedMotionCSS(): string {
    if (this.prefersReducedMotion()) {
      return `
        *, *::before, *::after {
          animation-duration: 0.01ms !important;
          animation-iteration-count: 1 !important;
          transition-duration: 0.01ms !important;
          scroll-behavior: auto !important;
        }
      `;
    }
    return '';
  }

  /**
   * Setup media query listeners
   */
  private setupMediaQueries(): void {
    if (typeof window === 'undefined') return;

    // Reduced motion
    this.reducedMotionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
    this.reducedMotionQuery.addEventListener('change', () => {
      this.updatePreferences();
      this.applyPreferencesToBody();
    });

    // High contrast
    this.highContrastQuery = window.matchMedia('(prefers-contrast: high)');
    this.highContrastQuery.addEventListener('change', () => {
      this.updatePreferences();
      this.applyPreferencesToBody();
    });

    // Dark mode
    this.darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');
    this.darkModeQuery.addEventListener('change', () => {
      this.updatePreferences();
      this.applyPreferencesToBody();
    });

    // Reduced transparency
    this.reducedTransparencyQuery = window.matchMedia('(prefers-reduced-transparency: reduce)');
    this.reducedTransparencyQuery.addEventListener('change', () => {
      this.updatePreferences();
      this.applyPreferencesToBody();
    });

    // Apply initial preferences
    this.applyPreferencesToBody();
  }

  /**
   * Update preference signals
   */
  private updatePreferences(): void {
    this.prefersReducedMotion.set(this.reducedMotionQuery?.matches ?? false);
    this.prefersHighContrast.set(this.highContrastQuery?.matches ?? false);
    this.prefersDarkMode.set(this.darkModeQuery?.matches ?? false);
    this.prefersReducedTransparency.set(this.reducedTransparencyQuery?.matches ?? false);
  }

  /**
   * Create a style element with reduced motion CSS
   */
  injectReducedMotionStyles(): void {
    if (typeof document === 'undefined') return;

    const existingStyle = document.getElementById('a11y-reduced-motion');
    if (existingStyle) return;

    const style = document.createElement('style');
    style.id = 'a11y-reduced-motion';
    style.textContent = `
      @media (prefers-reduced-motion: reduce) {
        *, *::before, *::after {
          animation-duration: 0.01ms !important;
          animation-iteration-count: 1 !important;
          transition-duration: 0.01ms !important;
          scroll-behavior: auto !important;
        }
      }
      
      @media (prefers-contrast: high) {
        * {
          text-shadow: none !important;
          box-shadow: none !important;
        }
      }
    `;
    
    document.head.appendChild(style);
  }
}nlmx( export * from './high-contrast.service';!x+ export * from './keyboard-manager.service';M?xlimport { Injectable, NgZone, OnDestroy } from '@angular/core';
import { fromEvent, Subject } from 'rxjs';
import { takeUntil, filter } from 'rxjs/operators';

export interface KeyboardShortcut {
  key: string;
  ctrlKey?: boolean;
  shiftKey?: boolean;
  altKey?: boolean;
  metaKey?: boolean;
  preventDefault?: boolean;
  stopPropagation?: boolean;
  description?: string;
  handler: (event: KeyboardEvent) => void;
}

export interface KeyboardShortcutRegistration {
  id: string;
  shortcut: KeyboardShortcut;
  element?: Element;
  priority?: number;
}

@Injectable({
  providedIn: 'root'
})
export class KeyboardManagerService implements OnDestroy {
  private destroy$ = new Subject<void>();
  private shortcuts = new Map<string, KeyboardShortcutRegistration>();
  private globalShortcuts: KeyboardShortcutRegistration[] = [];
  private elementShortcuts = new Map<Element, KeyboardShortcutRegistration[]>();

  constructor(private ngZone: NgZone) {
    this.setupGlobalListener();
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
    this.shortcuts.clear();
    this.globalShortcuts.length = 0;
    this.elementShortcuts.clear();
  }

  /**
   * Register a global keyboard shortcut
   */
  registerGlobalShortcut(
    id: string,
    shortcut: KeyboardShortcut,
    priority = 0
  ): void {
    const registration: KeyboardShortcutRegistration = {
      id,
      shortcut,
      priority
    };

    this.shortcuts.set(id, registration);
    this.globalShortcuts.push(registration);
    
    // Sort by priority (higher priority first)
    this.globalShortcuts.sort((a, b) => (b.priority || 0) - (a.priority || 0));
  }

  /**
   * Register a keyboard shortcut for a specific element
   */
  registerElementShortcut(
    id: string,
    element: Element,
    shortcut: KeyboardShortcut,
    priority = 0
  ): void {
    const registration: KeyboardShortcutRegistration = {
      id,
      shortcut,
      element,
      priority
    };

    this.shortcuts.set(id, registration);
    
    if (!this.elementShortcuts.has(element)) {
      this.elementShortcuts.set(element, []);
      this.setupElementListener(element);
    }
    
    const elementShortcuts = this.elementShortcuts.get(element)!;
    elementShortcuts.push(registration);
    
    // Sort by priority (higher priority first)
    elementShortcuts.sort((a, b) => (b.priority || 0) - (a.priority || 0));
  }

  /**
   * Unregister a keyboard shortcut
   */
  unregisterShortcut(id: string): void {
    const registration = this.shortcuts.get(id);
    if (!registration) return;

    if (registration.element) {
      // Remove from element shortcuts
      const elementShortcuts = this.elementShortcuts.get(registration.element);
      if (elementShortcuts) {
        const index = elementShortcuts.findIndex(s => s.id === id);
        if (index >= 0) {
          elementShortcuts.splice(index, 1);
        }
        
        // Clean up if no shortcuts left for this element
        if (elementShortcuts.length === 0) {
          this.elementShortcuts.delete(registration.element);
        }
      }
    } else {
      // Remove from global shortcuts
      const index = this.globalShortcuts.findIndex(s => s.id === id);
      if (index >= 0) {
        this.globalShortcuts.splice(index, 1);
      }
    }

    this.shortcuts.delete(id);
  }

  /**
   * Get all registered shortcuts
   */
  getShortcuts(): KeyboardShortcutRegistration[] {
    return Array.from(this.shortcuts.values());
  }

  /**
   * Get shortcuts for a specific element
   */
  getElementShortcuts(element: Element): KeyboardShortcutRegistration[] {
    return this.elementShortcuts.get(element) || [];
  }

  /**
   * Get global shortcuts
   */
  getGlobalShortcuts(): KeyboardShortcutRegistration[] {
    return [...this.globalShortcuts];
  }

  /**
   * Unregister all keyboard shortcuts
   */
  unregisterAll(): void {
    this.shortcuts.clear();
    this.globalShortcuts.length = 0;
    this.elementShortcuts.clear();
  }

  /**
   * Check if a keyboard event matches a shortcut
   */
  private matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {
    if (event.key.toLowerCase() !== shortcut.key.toLowerCase()) {
      return false;
    }

    return (
      !!event.ctrlKey === !!shortcut.ctrlKey &&
      !!event.shiftKey === !!shortcut.shiftKey &&
      !!event.altKey === !!shortcut.altKey &&
      !!event.metaKey === !!shortcut.metaKey
    );
  }

  /**
   * Handle keyboard event for shortcuts
   */
  private handleKeyboardEvent(
    event: KeyboardEvent,
    shortcuts: KeyboardShortcutRegistration[]
  ): boolean {
    for (const registration of shortcuts) {
      if (this.matchesShortcut(event, registration.shortcut)) {
        if (registration.shortcut.preventDefault) {
          event.preventDefault();
        }
        
        if (registration.shortcut.stopPropagation) {
          event.stopPropagation();
        }

        this.ngZone.run(() => {
          registration.shortcut.handler(event);
        });

        return true; // Shortcut handled
      }
    }
    
    return false; // No shortcut matched
  }

  /**
   * Set up global keyboard event listener
   */
  private setupGlobalListener(): void {
    if (typeof document === 'undefined') return;

    this.ngZone.runOutsideAngular(() => {
      fromEvent<KeyboardEvent>(document, 'keydown').pipe(
        takeUntil(this.destroy$),
        filter(event => this.globalShortcuts.length > 0)
      ).subscribe(event => {
        this.handleKeyboardEvent(event, this.globalShortcuts);
      });
    });
  }

  /**
   * Set up keyboard event listener for a specific element
   */
  private setupElementListener(element: Element): void {
    this.ngZone.runOutsideAngular(() => {
      fromEvent<KeyboardEvent>(element, 'keydown').pipe(
        takeUntil(this.destroy$)
      ).subscribe(event => {
        const shortcuts = this.elementShortcuts.get(element) || [];
        this.handleKeyboardEvent(event, shortcuts);
      });
    });
  }

  /**
   * Create a shortcut description for display purposes
   */
  static getShortcutDescription(shortcut: KeyboardShortcut): string {
    if (shortcut.description) {
      return shortcut.description;
    }

    const parts: string[] = [];
    
    if (shortcut.ctrlKey) parts.push('Ctrl');
    if (shortcut.altKey) parts.push('Alt');
    if (shortcut.shiftKey) parts.push('Shift');
    if (shortcut.metaKey) parts.push('Meta');
    
    parts.push(shortcut.key.toUpperCase());
    
    return parts.join(' + ');
  }
}O;*x) export * from './live-announcer.service';.x>import { Injectable, OnDestroy } from '@angular/core';

export type AriaLivePoliteness = 'off' | 'polite' | 'assertive';

export interface LiveAnnouncementConfig {
  politeness?: AriaLivePoliteness;
  duration?: number;
  clearPrevious?: boolean;
}

@Injectable({
  providedIn: 'root'
})
export class LiveAnnouncerService implements OnDestroy {
  private liveElement?: HTMLElement;
  private timeouts: Map<AriaLivePoliteness, any> = new Map();

  constructor() {
    this.createLiveElement();
  }

  ngOnDestroy(): void {
    this.timeouts.forEach(timeout => clearTimeout(timeout));
    this.removeLiveElement();
  }

  /**
   * Announces a message to screen readers
   */
  announce(
    message: string,
    politeness: AriaLivePoliteness = 'polite',
    duration?: number
  ): void {
    this.announceWithConfig(message, {
      politeness,
      duration,
      clearPrevious: true
    });
  }

  /**
   * Announces a message with full configuration options
   */
  announceWithConfig(message: string, config: LiveAnnouncementConfig = {}): void {
    const {
      politeness = 'polite',
      duration = 4000,
      clearPrevious = true
    } = config;

    if (!this.liveElement) {
      this.createLiveElement();
    }

    if (!this.liveElement) return;

    // Clear any existing timeout for this politeness level
    if (this.timeouts.has(politeness)) {
      clearTimeout(this.timeouts.get(politeness));
    }

    // Clear previous message if requested
    if (clearPrevious) {
      this.liveElement.textContent = '';
    }

    // Set the politeness level
    this.liveElement.setAttribute('aria-live', politeness);

    // Announce the message
    setTimeout(() => {
      if (this.liveElement) {
        this.liveElement.textContent = message;
      }
    }, 100);

    // Clear the message after the specified duration
    if (duration > 0) {
      const timeoutId = setTimeout(() => {
        if (this.liveElement) {
          this.liveElement.textContent = '';
        }
        this.timeouts.delete(politeness);
      }, duration);

      this.timeouts.set(politeness, timeoutId);
    }
  }

  /**
   * Clears all current announcements
   */
  clear(): void {
    if (this.liveElement) {
      this.liveElement.textContent = '';
    }
    this.timeouts.forEach(timeout => clearTimeout(timeout));
    this.timeouts.clear();
  }

  /**
   * Announces multiple messages with delays between them
   */
  announceSequence(
    messages: string[],
    politeness: AriaLivePoliteness = 'polite',
    delayBetween = 1000
  ): void {
    messages.forEach((message, index) => {
      setTimeout(() => {
        this.announce(message, politeness);
      }, index * delayBetween);
    });
  }

  /**
   * Creates the live region element
   */
  private createLiveElement(): void {
    if (typeof document === 'undefined') return;

    // Remove existing element if it exists
    this.removeLiveElement();

    // Create new live region
    this.liveElement = document.createElement('div');
    this.liveElement.setAttribute('aria-live', 'polite');
    this.liveElement.setAttribute('aria-atomic', 'true');
    this.liveElement.setAttribute('id', 'a11y-live-announcer');
    
    // Make it invisible but still accessible to screen readers
    this.liveElement.style.position = 'absolute';
    this.liveElement.style.left = '-10000px';
    this.liveElement.style.width = '1px';
    this.liveElement.style.height = '1px';
    this.liveElement.style.overflow = 'hidden';

    document.body.appendChild(this.liveElement);
  }

  /**
   * Removes the live region element
   */
  private removeLiveElement(): void {
    const existing = document.getElementById('a11y-live-announcer');
    if (existing) {
      existing.remove();
    }
    this.liveElement = undefined;
  }
}xH// ==========================================================================
// ACCESSIBILITY TOKENS
// ==========================================================================
// Import semantic tokens for accessibility features
// ==========================================================================

// Import semantic tokens from design system
@use 'ui-design-system/src/styles/semantic/colors' as colors;
@use 'ui-design-system/src/styles/semantic/motion' as motion;
@use 'ui-design-system/src/styles/semantic/spacing' as spacing;
@use 'ui-design-system/src/styles/semantic/shadows' as shadows;
@use 'ui-design-system/src/styles/semantic/borders' as borders;
@use 'ui-design-system/src/styles/semantic/typography' as typography;

// FOCUS INDICATOR TOKENS
$a11y-focus-color: colors.$semantic-color-focus !default;
$a11y-focus-ring-color: colors.$semantic-color-focus-ring !default;
$a11y-focus-ring-width: borders.$semantic-border-focus-width !default;
$a11y-focus-shadow: shadows.$semantic-shadow-input-focus !default;
$a11y-focus-transition-duration: motion.$semantic-motion-duration-fast !default;
$a11y-focus-transition-timing: motion.$semantic-motion-easing-ease-out !default;

// SKIP LINKS TOKENS  
$a11y-skip-link-bg: colors.$semantic-color-surface-primary !default;
$a11y-skip-link-color: colors.$semantic-color-text-primary !default;
$a11y-skip-link-border: colors.$semantic-color-border-focus !default;
$a11y-skip-link-padding-x: spacing.$semantic-spacing-interactive-button-padding-x !default;
$a11y-skip-link-padding-y: spacing.$semantic-spacing-interactive-button-padding-y !default;
$a11y-skip-link-border-radius: borders.$semantic-border-radius-md !default;
$a11y-skip-link-shadow: shadows.$semantic-shadow-button-focus !default;
$a11y-skip-link-z-index: 10000 !default;

// SCREEN READER ONLY TOKENS
$a11y-sr-only-position: absolute !default;
$a11y-sr-only-width: 1px !default;
$a11y-sr-only-height: 1px !default;
$a11y-sr-only-margin: -1px !default;
$a11y-sr-only-padding: 0 !default;
$a11y-sr-only-overflow: hidden !default;
$a11y-sr-only-clip: rect(0, 0, 0, 0) !default;
$a11y-sr-only-border: 0 !default;

// HIGH CONTRAST MODE TOKENS
$a11y-high-contrast-border-color: ButtonText !default;
$a11y-high-contrast-bg-color: ButtonFace !default;
$a11y-high-contrast-text-color: ButtonText !default;
$a11y-high-contrast-focus-color: Highlight !default;

// REDUCED MOTION TOKENS
$a11y-reduced-motion-duration: motion.$semantic-motion-duration-instant !default;
$a11y-reduced-motion-easing: motion.$semantic-motion-easing-linear !default;

// TOUCH TARGET TOKENS
$a11y-min-touch-target: spacing.$semantic-spacing-interactive-touch-target !default;

// LIVE REGION TOKENS
$a11y-live-region-position: absolute !default;
$a11y-live-region-left: -10000px !default;
$a11y-live-region-width: 1px !default;
$a11y-live-region-height: 1px !default;
$a11y-live-region-overflow: hidden !default;

// ERROR AND SUCCESS COLORS FOR HIGH CONTRAST
$a11y-error-color: colors.$semantic-color-error !default;
$a11y-success-color: colors.$semantic-color-success !default;
$a11y-warning-color: colors.$semantic-color-warning !default;

// ANIMATION TOKENS FOR ACCESSIBILITY
$a11y-animation-fade-duration: motion.$semantic-motion-duration-normal !default;
$a11y-animation-slide-duration: motion.$semantic-motion-duration-normal !default;
$a11y-animation-scale-duration: motion.$semantic-motion-duration-fast !default;

// FOCUS TRAP TOKENS
$a11y-focus-trap-outline-color: colors.$semantic-color-focus !default;
$a11y-focus-trap-outline-width: 2px !default;
$a11y-focus-trap-outline-style: solid !default;
$a11y-focus-trap-outline-offset: 2px !default;Ax
	import { NgModule, ModuleWithProviders, inject, APP_INITIALIZER } from '@angular/core';
import { CommonModule } from '@angular/common';

// Services
import { LiveAnnouncerService } from './services/live-announcer';
import { FocusMonitorService } from './services/focus-monitor';
import { KeyboardManagerService } from './services/keyboard-manager';
import { HighContrastService } from './services/high-contrast';
import { A11yConfigService, A11yConfiguration, A11Y_CONFIG } from './services/a11y-config';

// Directives
import { FocusTrapDirective } from './directives/focus-trap';
import { ArrowNavigationDirective } from './directives/arrow-navigation';

// Components
import { SkipLinksComponent } from './components/skip-links';
import { ScreenReaderOnlyComponent } from './components/screen-reader-only';

const DIRECTIVES = [
  FocusTrapDirective,
  ArrowNavigationDirective
];

const COMPONENTS = [
  SkipLinksComponent,
  ScreenReaderOnlyComponent
];

/**
 * Initialize accessibility features based on configuration
 */
export function initializeA11y(
  config: A11yConfigService,
  highContrast: HighContrastService
): () => void {
  return () => {
    // Apply body classes for accessibility preferences
    if (config.isEnabled('accessibility.addBodyClasses')) {
      highContrast.applyPreferencesToBody();
    }

    // Inject accessibility styles
    if (config.isEnabled('accessibility.injectAccessibilityStyles')) {
      highContrast.injectReducedMotionStyles();
    }

    // Log initialization
    config.log('UI Accessibility module initialized', config.getConfig());
  };
}

@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    ...DIRECTIVES,
    ...COMPONENTS
  ],
  exports: [
    ...DIRECTIVES,
    ...COMPONENTS
  ]
})
export class UiAccessibilityModule {
  static forRoot(config?: Partial<A11yConfiguration>): ModuleWithProviders<UiAccessibilityModule> {
    return {
      ngModule: UiAccessibilityModule,
      providers: [
        // Core services
        LiveAnnouncerService,
        FocusMonitorService,
        KeyboardManagerService,
        HighContrastService,
        A11yConfigService,
        
        // Configuration
        {
          provide: A11Y_CONFIG,
          useValue: config || {}
        },
        
        // Initialize accessibility features
        {
          provide: APP_INITIALIZER,
          useFactory: initializeA11y,
          deps: [A11yConfigService, HighContrastService],
          multi: true
        }
      ]
    };
  }

  static forChild(): ModuleWithProviders<UiAccessibilityModule> {
    return {
      ngModule: UiAccessibilityModule,
      providers: []
    };
  }

  constructor() {
    // Module loaded
    if (typeof console !== 'undefined') {
      console.log('🔍 UI Accessibility module loaded');
    }
  }
}ۻx+// ==========================================================================
// ACCESSIBILITY UTILITIES
// ==========================================================================
// Main accessibility utility file that imports all utilities
// ==========================================================================

@use '../tokens/a11y-tokens' as tokens;

// Import all utility modules
@forward 'focus-visible';
@forward 'screen-reader';

// Skip links styles
.skip-links {
  position: fixed;
  top: 0;
  left: 0;
  z-index: tokens.$a11y-skip-link-z-index;
  
  .skip-link {
    position: absolute;
    top: -40px;
    left: 6px;
    background: tokens.$a11y-skip-link-bg;
    color: tokens.$a11y-skip-link-color;
    padding: tokens.$a11y-skip-link-padding-y tokens.$a11y-skip-link-padding-x;
    text-decoration: none;
    border: 1px solid tokens.$a11y-skip-link-border;
    border-radius: tokens.$a11y-skip-link-border-radius;
    box-shadow: tokens.$a11y-skip-link-shadow;
    opacity: 0;
    pointer-events: none;
    transform: translateY(-10px);
    transition: all tokens.$a11y-focus-transition-duration tokens.$a11y-focus-transition-timing;
    
    &:focus {
      top: 6px;
      opacity: 1;
      pointer-events: auto;
      transform: translateY(0);
    }
    
    // Multiple skip links positioning
    &:nth-child(2):focus {
      top: 50px;
    }
    
    &:nth-child(3):focus {
      top: 94px;
    }
  }
}

// Touch target sizing
.touch-target {
  min-height: tokens.$a11y-min-touch-target;
  min-width: tokens.$a11y-min-touch-target;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

// Error announcements
.error-announcement {
  @extend .sr-only;
  
  &.error-visible {
    position: static;
    width: auto;
    height: auto;
    overflow: visible;
    clip: auto;
    white-space: normal;
    color: tokens.$a11y-error-color;
    font-weight: 600;
    margin-top: 4px;
  }
}

// Loading announcements
.loading-announcement {
  @extend .sr-only;
}

// Keyboard navigation indicators
.keyboard-navigation {
  // Hide mouse focus indicators when using keyboard navigation
  &.using-mouse {
    * {
      &:focus:not(:focus-visible) {
        outline: none;
        box-shadow: none;
      }
    }
  }
  
  // Enhanced focus indicators when using keyboard
  &.using-keyboard {
    *:focus-visible {
      outline: 2px solid tokens.$a11y-focus-color;
      outline-offset: 2px;
    }
  }
}

// High contrast mode utilities
@media (prefers-contrast: high) {
  .high-contrast-border {
    border: 1px solid tokens.$a11y-high-contrast-border-color !important;
  }
  
  .high-contrast-bg {
    background: tokens.$a11y-high-contrast-bg-color !important;
    color: tokens.$a11y-high-contrast-text-color !important;
  }
  
  // Remove shadows and transparency in high contrast
  * {
    text-shadow: none !important;
    box-shadow: none !important;
  }
  
  // Ensure sufficient contrast for interactive elements
  button,
  [role="button"],
  a,
  input,
  select,
  textarea {
    border: 1px solid tokens.$a11y-high-contrast-border-color;
  }
}

// Reduced motion utilities
@media (prefers-reduced-motion: reduce) {
  .respect-reduced-motion {
    * {
      animation-duration: tokens.$a11y-reduced-motion-duration !important;
      animation-iteration-count: 1 !important;
      transition-duration: tokens.$a11y-reduced-motion-duration !important;
      scroll-behavior: auto !important;
    }
  }
}

// ARIA live region styling
.aria-live-region {
  @extend .live-region;
  
  &.aria-live-assertive {
    speak: literal;
  }
  
  &.aria-live-polite {
    speak: spell-out;
  }
}

// Focus management utilities
.focus-within-highlight {
  &:focus-within {
    outline: 1px solid tokens.$a11y-focus-color;
    outline-offset: 2px;
  }
}

// Accessible hide/show animations
@keyframes fadeInA11y {
  from {
    opacity: 0;
    transform: translateY(-10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes fadeOutA11y {
  from {
    opacity: 1;
    transform: translateY(0);
  }
  to {
    opacity: 0;
    transform: translateY(-10px);
  }
}

.fade-in-a11y {
  animation: fadeInA11y tokens.$a11y-animation-fade-duration tokens.$a11y-focus-transition-timing;
}

.fade-out-a11y {
  animation: fadeOutA11y tokens.$a11y-animation-fade-duration tokens.$a11y-focus-transition-timing;
}

// Respect reduced motion for animations
@media (prefers-reduced-motion: reduce) {
  .fade-in-a11y,
  .fade-out-a11y {
    animation-duration: tokens.$a11y-reduced-motion-duration;
    animation-timing-function: tokens.$a11y-reduced-motion-easing;
  }
}

// Arrow navigation visual indicators (dev mode)
.arrow-navigation-active {
  &.arrow-navigation-debug {
    position: relative;
    
    &::before {
      content: '← ↑ ↓ → Arrow Navigation';
      position: absolute;
      top: -20px;
      right: 0;
      font-size: 12px;
      color: tokens.$a11y-focus-color;
      background: tokens.$a11y-skip-link-bg;
      padding: 2px 6px;
      border-radius: 3px;
      z-index: 1000;
      pointer-events: none;
    }
  }
  
  // Highlight navigable items
  [tabindex="0"] {
    position: relative;
    
    &::after {
      content: '';
      position: absolute;
      top: -2px;
      left: -2px;
      right: -2px;
      bottom: -2px;
      border: 1px dashed tokens.$a11y-focus-color;
      pointer-events: none;
      opacity: 0.3;
    }
  }
}ܿx // ==========================================================================
// FOCUS VISIBLE UTILITIES
// ==========================================================================
// Focus management styles using semantic tokens
// ==========================================================================

@use '../tokens/a11y-tokens' as tokens;

// Base focus visible styles
.focus-visible,
:focus-visible {
  outline: tokens.$a11y-focus-trap-outline-width tokens.$a11y-focus-trap-outline-style tokens.$a11y-focus-outline-color;
  outline-offset: tokens.$a11y-focus-trap-outline-offset;
  transition: outline-color tokens.$a11y-focus-transition-duration tokens.$a11y-focus-transition-timing;
}

// Remove default focus outline for mouse users
:focus:not(:focus-visible) {
  outline: none;
  box-shadow: none;
}

// Focus ring for interactive elements
.focus-ring {
  position: relative;
  
  &:focus-visible::after {
    content: '';
    position: absolute;
    top: -2px;
    left: -2px;
    right: -2px;
    bottom: -2px;
    border: tokens.$a11y-focus-ring-width solid tokens.$a11y-focus-color;
    border-radius: inherit;
    pointer-events: none;
    transition: opacity tokens.$a11y-focus-transition-duration tokens.$a11y-focus-transition-timing;
    opacity: 1;
  }
  
  &:not(:focus-visible)::after {
    opacity: 0;
  }
}

// Focus styles for buttons
.btn-focus-visible,
button:focus-visible,
[role="button"]:focus-visible {
  outline: tokens.$a11y-focus-trap-outline-width solid tokens.$a11y-focus-color;
  outline-offset: 2px;
  box-shadow: tokens.$a11y-focus-shadow;
}

// Focus styles for form inputs
.input-focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible {
  border-color: tokens.$a11y-focus-color;
  box-shadow: tokens.$a11y-focus-shadow;
  outline: none;
}

// Focus styles for links
.link-focus-visible,
a:focus-visible {
  outline: tokens.$a11y-focus-trap-outline-width solid tokens.$a11y-focus-color;
  outline-offset: 2px;
  text-decoration: underline;
}

// High contrast mode support
@media (prefers-contrast: high) {
  .focus-visible,
  :focus-visible {
    outline-color: tokens.$a11y-high-contrast-focus-color;
    outline-width: 3px;
  }
  
  .focus-ring:focus-visible::after {
    border-color: tokens.$a11y-high-contrast-focus-color;
    border-width: 3px;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .focus-visible,
  :focus-visible,
  .focus-ring::after {
    transition-duration: tokens.$a11y-reduced-motion-duration;
    transition-timing-function: tokens.$a11y-reduced-motion-easing;
  }
}

// Focus trap container styles
.focus-trap-container {
  position: relative;
  
  &.focus-trap-active {
    isolation: isolate;
  }
  
  // Visual indicator for focus trap (dev mode)
  &.focus-trap-debug {
    &::before {
      content: 'Focus Trap Active';
      position: absolute;
      top: -20px;
      left: 0;
      font-size: 12px;
      color: tokens.$a11y-focus-color;
      background: tokens.$a11y-skip-link-bg;
      padding: 2px 6px;
      border-radius: 3px;
      z-index: 1000;
    }
  }
}

// Skip to content on focus trap
.focus-trap-skip {
  position: absolute;
  top: -40px;
  left: 0;
  background: tokens.$a11y-skip-link-bg;
  color: tokens.$a11y-skip-link-color;
  padding: tokens.$a11y-skip-link-padding-y tokens.$a11y-skip-link-padding-x;
  text-decoration: none;
  border: 1px solid tokens.$a11y-skip-link-border;
  border-radius: tokens.$a11y-skip-link-border-radius;
  z-index: tokens.$a11y-skip-link-z-index;
  opacity: 0;
  pointer-events: none;
  transform: translateY(-10px);
  transition: all tokens.$a11y-focus-transition-duration tokens.$a11y-focus-transition-timing;
  
  &:focus {
    opacity: 1;
    pointer-events: auto;
    transform: translateY(0);
    box-shadow: tokens.$a11y-skip-link-shadow;
  }
}}줷xw// ==========================================================================
// SCREEN READER UTILITIES
// ==========================================================================
// Screen reader specific styles using semantic tokens
// ==========================================================================

@use '../tokens/a11y-tokens' as tokens;

// Screen reader only - visually hidden but accessible
.sr-only {
  position: tokens.$a11y-sr-only-position;
  width: tokens.$a11y-sr-only-width;
  height: tokens.$a11y-sr-only-height;
  padding: tokens.$a11y-sr-only-padding;
  margin: tokens.$a11y-sr-only-margin;
  overflow: tokens.$a11y-sr-only-overflow;
  clip: tokens.$a11y-sr-only-clip;
  white-space: nowrap;
  border: tokens.$a11y-sr-only-border;
}

// Screen reader only that becomes visible on focus
.sr-only-focusable {
  @extend .sr-only;
  
  &:focus,
  &:active {
    position: static;
    width: auto;
    height: auto;
    padding: tokens.$a11y-skip-link-padding-y tokens.$a11y-skip-link-padding-x;
    margin: 0;
    overflow: visible;
    clip: auto;
    white-space: normal;
    background: tokens.$a11y-skip-link-bg;
    color: tokens.$a11y-skip-link-color;
    border: 1px solid tokens.$a11y-skip-link-border;
    border-radius: tokens.$a11y-skip-link-border-radius;
    box-shadow: tokens.$a11y-skip-link-shadow;
    z-index: tokens.$a11y-skip-link-z-index;
  }
}

// Live region for screen reader announcements
.live-region {
  position: tokens.$a11y-live-region-position;
  left: tokens.$a11y-live-region-left;
  width: tokens.$a11y-live-region-width;
  height: tokens.$a11y-live-region-height;
  overflow: tokens.$a11y-live-region-overflow;
}

// Status message styling
.status-message {
  @extend .sr-only;
  
  &.status-visible {
    position: static;
    width: auto;
    height: auto;
    overflow: visible;
    clip: auto;
    white-space: normal;
    padding: tokens.$a11y-skip-link-padding-y tokens.$a11y-skip-link-padding-x;
    margin: 4px 0;
    background: tokens.$a11y-skip-link-bg;
    border-left: 4px solid tokens.$a11y-focus-color;
    border-radius: 0 tokens.$a11y-skip-link-border-radius tokens.$a11y-skip-link-border-radius 0;
  }
  
  &.status-error {
    border-left-color: tokens.$a11y-error-color;
  }
  
  &.status-success {
    border-left-color: tokens.$a11y-success-color;
  }
  
  &.status-warning {
    border-left-color: tokens.$a11y-warning-color;
  }
}

// Screen reader instructions
.sr-instructions {
  @extend .sr-only;
  
  // Common instruction patterns
  &.sr-required::after {
    content: ' (required)';
  }
  
  &.sr-optional::after {
    content: ' (optional)';
  }
  
  &.sr-expanded::after {
    content: ' (expanded)';
  }
  
  &.sr-collapsed::after {
    content: ' (collapsed)';
  }
  
  &.sr-selected::after {
    content: ' (selected)';
  }
  
  &.sr-current::after {
    content: ' (current)';
  }
}

// Accessible hide/show with transitions
.a11y-hide {
  opacity: 0;
  pointer-events: none;
  transform: scale(0.95);
  transition: opacity tokens.$a11y-animation-fade-duration tokens.$a11y-focus-transition-timing,
              transform tokens.$a11y-animation-scale-duration tokens.$a11y-focus-transition-timing;
  
  // Still accessible to screen readers when hidden
  &:not(.a11y-hide-completely) {
    position: absolute;
    left: -9999px;
  }
  
  // Completely hidden including from screen readers
  &.a11y-hide-completely {
    display: none;
  }
}

.a11y-show {
  opacity: 1;
  pointer-events: auto;
  transform: scale(1);
  transition: opacity tokens.$a11y-animation-fade-duration tokens.$a11y-focus-transition-timing,
              transform tokens.$a11y-animation-scale-duration tokens.$a11y-focus-transition-timing;
}

// High contrast mode adjustments
@media (prefers-contrast: high) {
  .sr-only-focusable:focus,
  .sr-only-focusable:active {
    background: tokens.$a11y-high-contrast-bg-color;
    color: tokens.$a11y-high-contrast-text-color;
    border-color: tokens.$a11y-high-contrast-border-color;
  }
  
  .status-message.status-visible {
    background: tokens.$a11y-high-contrast-bg-color;
    color: tokens.$a11y-high-contrast-text-color;
    border-color: tokens.$a11y-high-contrast-border-color;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .a11y-hide,
  .a11y-show,
  .sr-only-focusable {
    transition-duration: tokens.$a11y-reduced-motion-duration;
    transition-timing-function: tokens.$a11y-reduced-motion-easing;
  }
}٭$xK/*
 * Public API Surface of ui-code-display
 */

// Components
export * from './lib/components/code-snippet/code-snippet.component';
export * from './lib/components/inline-code/inline-code.component';
export * from './lib/components/code-block/code-block.component';

// Directives
export * from './lib/directives/copy-button.directive';

// Services
export * from './lib/services/syntax-highlighter.service';
export * from './lib/services/theme.service';

// Legacy exports (to be removed)
export * from './lib/ui-code-display.service';
export * from './lib/ui-code-display.component';
Xx !accessibility
 */

// Main module>ui-accessibility.modulN/live-announcer';^focus-monitor';^keyboard-manager';^high-contras	a11y-config2focus-trap';>/arrow-navigation';/0skip-links';>!screen-reader-only';`CT`xj backgrounds
 */

// Type=types/indexO.index2index';/0index';

// Util=utils/index';
 xx{import { Directive, ElementRef, Input, OnInit, OnDestroy } from '@angular/core';
import { UiAnimationsService } from './ui-animations.service';

@Directive({
  selector: '[uiAnimate]',
  standalone: true
})
export class AnimateDirective implements OnInit, OnDestroy {
  @Input('uiAnimate') animationClass: string = '';
  @Input() animationTrigger: 'immediate' | 'hover' | 'click' | 'manual' = 'immediate';
  @Input() animationOnce: boolean = false;

  private hoverHandler?: () => void;
  private clickHandler?: () => void;

  constructor(
    private elementRef: ElementRef<HTMLElement>,
    private animationService: UiAnimationsService
  ) {}

  ngOnInit() {
    if (this.animationTrigger === 'immediate') {
      this.animate();
    } else if (this.animationTrigger === 'hover') {
      this.setupHoverTrigger();
    } else if (this.animationTrigger === 'click') {
      this.setupClickTrigger();
    }
  }

  ngOnDestroy() {
    if (this.hoverHandler) {
      this.elementRef.nativeElement.removeEventListener('mouseenter', this.hoverHandler);
    }
    if (this.clickHandler) {
      this.elementRef.nativeElement.removeEventListener('click', this.clickHandler);
    }
  }

  private setupHoverTrigger() {
    this.hoverHandler = () => this.animate();
    this.elementRef.nativeElement.addEventListener('mouseenter', this.hoverHandler);
  }

  private setupClickTrigger() {
    this.clickHandler = () => this.animate();
    this.elementRef.nativeElement.addEventListener('click', this.clickHandler);
  }

  private animate() {
    if (!this.animationClass) return;

    if (this.animationOnce) {
      this.animationService.animateOnce(this.elementRef.nativeElement, this.animationClass);
    } else {
      this.animationService.animate(this.elementRef.nativeElement, this.animationClass);
    }
  }

  /**
   * Manually trigger animation (for manual trigger mode)
   */
  public trigger() {
    this.animate();
  }
}}Pximport { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class UiAnimationsService {

  /**
   * Add animation class to element with optional completion callback
   */
  animate(element: HTMLElement, animationClass: string, onComplete?: () => void): Promise<void> {
    return new Promise((resolve) => {
      const handleAnimationEnd = () => {
        element.removeEventListener('animationend', handleAnimationEnd);
        if (onComplete) onComplete();
        resolve();
      };

      element.addEventListener('animationend', handleAnimationEnd);
      element.classList.add(animationClass);
    });
  }

  /**
   * Remove animation class from element
   */
  removeAnimation(element: HTMLElement, animationClass: string): void {
    element.classList.remove(animationClass);
  }

  /**
   * Add animation class and automatically remove it after completion
   */
  animateOnce(element: HTMLElement, animationClass: string): Promise<void> {
    return this.animate(element, animationClass, () => {
      this.removeAnimation(element, animationClass);
    });
  }

  /**
   * Check if element has animation class
   */
  hasAnimation(element: HTMLElement, animationClass: string): boolean {
    return element.classList.contains(animationClass);
  }
}x {/*
 * Public API Surface of ui-animations
 */

export * from './lib/ui-animations.service';
export * from './lib/animate.directive';c+xL// Emphasis Animations
// Attention-grabbing animations for highlighting elements

// Bounce
@keyframes bounce {
  0%, 20%, 53%, 80%, 100% {
    transform: translateY(0);
  }
  40%, 43% {
    transform: translateY(-24px);
  }
  70% {
    transform: translateY(-8px);
  }
  90% {
    transform: translateY(-4px);
  }
}

.animate-bounce {
  animation: bounce 0.6s ease-in-out;
}

// Shake
@keyframes shake {
  0%, 100% { transform: translateX(0); }
  10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); }
  20%, 40%, 60%, 80% { transform: translateX(4px); }
}

.animate-shake {
  animation: shake 0.6s ease-in-out;
}

// Pulse
@keyframes pulse {
  0% { transform: scale(1); }
  50% { transform: scale(1.05); }
  100% { transform: scale(1); }
}

.animate-pulse {
  animation: pulse 0.6s ease-in-out infinite;
}

// Flash
@keyframes flash {
  0%, 50%, 100% { opacity: 1; }
  25%, 75% { opacity: 0; }
}

.animate-flash {
  animation: flash 0.6s ease-in-out;
}

// Wobble
@keyframes wobble {
  0% { transform: translateX(0%); }
  15% { transform: translateX(-25%) rotate(-5deg); }
  30% { transform: translateX(20%) rotate(3deg); }
  45% { transform: translateX(-15%) rotate(-3deg); }
  60% { transform: translateX(10%) rotate(2deg); }
  75% { transform: translateX(-5%) rotate(-1deg); }
  100% { transform: translateX(0%); }
}

.animate-wobble {
  animation: wobble 0.6s ease-in-out;
}

// Swing
@keyframes swing {
  20% { transform: rotate(15deg); }
  40% { transform: rotate(-10deg); }
  60% { transform: rotate(5deg); }
  80% { transform: rotate(-5deg); }
  100% { transform: rotate(0deg); }
}

.animate-swing {
  animation: swing 0.6s ease-in-out;
  transform-origin: top center;
}

// Rubber Band
@keyframes rubberBand {
  0% { transform: scaleX(1); }
  30% { transform: scaleX(1.25) scaleY(0.75); }
  40% { transform: scaleX(0.75) scaleY(1.25); }
  50% { transform: scaleX(1.15) scaleY(0.85); }
  65% { transform: scaleX(0.95) scaleY(1.05); }
  75% { transform: scaleX(1.05) scaleY(0.95); }
  100% { transform: scaleX(1) scaleY(1); }
}

.animate-rubber-band {
  animation: rubberBand 0.6s ease-in-out;
}

// Tada
@keyframes tada {
  0% { transform: scaleX(1) scaleY(1); }
  10%, 20% { transform: scaleX(0.9) scaleY(0.9) rotate(-3deg); }
  30%, 50%, 70%, 90% { transform: scaleX(1.1) scaleY(1.1) rotate(3deg); }
  40%, 60%, 80% { transform: scaleX(1.1) scaleY(1.1) rotate(-3deg); }
  100% { transform: scaleX(1) scaleY(1) rotate(0); }
}

.animate-tada {
  animation: tada 0.6s ease-in-out;
}

// Heartbeat
@keyframes heartbeat {
  0% { transform: scale(1); }
  14% { transform: scale(1.3); }
  28% { transform: scale(1); }
  42% { transform: scale(1.3); }
  70% { transform: scale(1); }
}

.animate-heartbeat {
  animation: heartbeat 0.6s ease-in-out infinite;
}

// Jello
@keyframes jello {
  11.1% { transform: skewX(-12.5deg) skewY(-12.5deg); }
  22.2% { transform: skewX(6.25deg) skewY(6.25deg); }
  33.3% { transform: skewX(-3.125deg) skewY(-3.125deg); }
  44.4% { transform: skewX(1.5625deg) skewY(1.5625deg); }
  55.5% { transform: skewX(-0.78125deg) skewY(-0.78125deg); }
  66.6% { transform: skewX(0.390625deg) skewY(0.390625deg); }
  77.7% { transform: skewX(-0.1953125deg) skewY(-0.1953125deg); }
  88.8% { transform: skewX(0.09765625deg) skewY(0.09765625deg); }
  100% { transform: skewX(0) skewY(0); }
}

.animate-jello {
  animation: jello 0.6s ease-in-out;
  transform-origin: center;
}>x#// Entrance Animations
// Elements appearing/entering the view


// Fade In
@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

.animate-fade-in {
  animation: fadeIn 0.3s ease-out;
}

// Fade In Up
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(24px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.animate-fade-in-up {
  animation: fadeInUp 0.3s ease-out;
}

// Fade In Down
@keyframes fadeInDown {
  from {
    opacity: 0;
    transform: translateY(-24px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.animate-fade-in-down {
  animation: fadeInDown 0.3s ease-out;
}

// Fade In Left
@keyframes fadeInLeft {
  from {
    opacity: 0;
    transform: translateX(-24px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

.animate-fade-in-left {
  animation: fadeInLeft 0.3s ease-out;
}

// Fade In Right
@keyframes fadeInRight {
  from {
    opacity: 0;
    transform: translateX(24px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

.animate-fade-in-right {
  animation: fadeInRight 0.3s ease-out;
}

// Slide In Up
@keyframes slideInUp {
  from {
    transform: translateY(100%);
  }
  to {
    transform: translateY(0);
  }
}

.animate-slide-in-up {
  animation: slideInUp 0.3s ease-out;
}

// Slide In Down
@keyframes slideInDown {
  from {
    transform: translateY(-100%);
  }
  to {
    transform: translateY(0);
  }
}

.animate-slide-in-down {
  animation: slideInDown 0.3s ease-out;
}

// Zoom In
@keyframes zoomIn {
  from {
    opacity: 0;
    transform: scale(0.3);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

.animate-zoom-in {
  animation: zoomIn 0.3s ease-out;
}

// Scale Up
@keyframes scaleUp {
  from {
    transform: scale(0);
  }
  to {
    transform: scale(1);
  }
}

.animate-scale-up {
  animation: scaleUp 0.15s ease-out;
}

// Rotate In
@keyframes rotateIn {
  from {
    opacity: 0;
    transform: rotate(-200deg);
  }
  to {
    opacity: 1;
    transform: rotate(0);
  }
}

.animate-rotate-in {
  animation: rotateIn 0.3s ease-out;
}F겄xB// Exit Animations
// Elements disappearing/leaving the view


// Fade Out
@keyframes fadeOut {
  from { opacity: 1; }
  to { opacity: 0; }
}

.animate-fade-out {
  animation: fadeOut 0.3s ease-in;
}

// Fade Out Up
@keyframes fadeOutUp {
  from {
    opacity: 1;
    transform: translateY(0);
  }
  to {
    opacity: 0;
    transform: translateY(-24px);
  }
}

.animate-fade-out-up {
  animation: fadeOutUp 0.3s ease-in;
}

// Fade Out Down
@keyframes fadeOutDown {
  from {
    opacity: 1;
    transform: translateY(0);
  }
  to {
    opacity: 0;
    transform: translateY(24px);
  }
}

.animate-fade-out-down {
  animation: fadeOutDown 0.3s ease-in;
}

// Fade Out Left
@keyframes fadeOutLeft {
  from {
    opacity: 1;
    transform: translateX(0);
  }
  to {
    opacity: 0;
    transform: translateX(-24px);
  }
}

.animate-fade-out-left {
  animation: fadeOutLeft 0.3s ease-in;
}

// Fade Out Right
@keyframes fadeOutRight {
  from {
    opacity: 1;
    transform: translateX(0);
  }
  to {
    opacity: 0;
    transform: translateX(24px);
  }
}

.animate-fade-out-right {
  animation: fadeOutRight 0.3s ease-in;
}

// Slide Out Up
@keyframes slideOutUp {
  from {
    transform: translateY(0);
  }
  to {
    transform: translateY(-100%);
  }
}

.animate-slide-out-up {
  animation: slideOutUp 0.3s ease-in;
}

// Slide Out Down
@keyframes slideOutDown {
  from {
    transform: translateY(0);
  }
  to {
    transform: translateY(100%);
  }
}

.animate-slide-out-down {
  animation: slideOutDown 0.3s ease-in;
}

// Zoom Out
@keyframes zoomOut {
  from {
    opacity: 1;
    transform: scale(1);
  }
  to {
    opacity: 0;
    transform: scale(0.3);
  }
}

.animate-zoom-out {
  animation: zoomOut 0.3s ease-in;
}

// Scale Down
@keyframes scaleDown {
  from {
    transform: scale(1);
  }
  to {
    transform: scale(0);
  }
}

.animate-scale-down {
  animation: scaleDown 0.15s ease-in;
}

// Rotate Out
@keyframes rotateOut {
  from {
    opacity: 1;
    transform: rotate(0);
  }
  to {
    opacity: 0;
    transform: rotate(200deg);
  }
}

.animate-rotate-out {
  animation: rotateOut 0.3s ease-in;
}7W9xn// Base Transitions
// Smooth transitions for common properties

// Transition utilities
.transition-all {
  transition: all 0.3s ease;
}

.transition-opacity {
  transition: opacity 0.3s ease;
}

.transition-transform {
  transition: transform 0.3s ease;
}

.transition-colors {
  transition: color, background-color, border-color 0.3s ease;
}

// Transition durations
.transition-fast {
  transition-duration: 0.15s;
}

.transition-normal {
  transition-duration: 0.3s;
}

.transition-slow {
  transition-duration: 0.6s;
}

// Transition timing functions
.transition-linear {
  transition-timing-function: linear;
}

.transition-ease-in {
  transition-timing-function: ease-in;
}

.transition-ease-out {
  transition-timing-function: ease-out;
}

.transition-ease-in-out {
  transition-timing-function: ease-in-out;
}

.transition-bounce {
  transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}"n<U"x'// UI Animations - Main Entry Point
// Import all animation styles

// Animations
@forward 'animations/transitions';
@forward 'animations/entrances';
@forward 'animations/exits';
@forward 'animations/emphasis';

// Utilities
@forward 'utilities/animation-utilities';

// Mixins (use @use to access mixins in your components)
@forward 'mixins/animation-mixins';

// Export all animations and utilities
@use 'animations/transitions';
@use 'animations/entrances';
@use 'animations/exits';
@use 'animations/emphasis';
@use 'utilities/animation-utilities';rx%// Animation Mixins
// Reusable SCSS mixins for creating custom animations


// Generic animation mixin
@mixin animate(
  $name,
  $duration: 0.3s,
  $timing-function: ease-out,
  $delay: motion.$semantic-motion-transition-delay-0,
  $iteration-count: 1,
  $direction: normal,
  $fill-mode: both
) {
  animation-name: $name;
  animation-duration: $duration;
  animation-timing-function: $timing-function;
  animation-delay: $delay;
  animation-iteration-count: $iteration-count;
  animation-direction: $direction;
  animation-fill-mode: $fill-mode;
}

// Transition mixin with design system tokens
@mixin transition(
  $property: motion.$semantic-motion-transition-property-all,
  $duration: 0.3s,
  $timing-function: ease,
  $delay: motion.$semantic-motion-transition-delay-0
) {
  transition-property: $property;
  transition-duration: $duration;
  transition-timing-function: $timing-function;
  transition-delay: $delay;
}

// Fade animation mixin
@mixin fade-animation($direction: 'in', $distance: 24px) {
  @if $direction == 'in' {
    from {
      opacity: 0;
      transform: translateY($distance);
    }
    to {
      opacity: 1;
      transform: translateY(0);
    }
  } @else {
    from {
      opacity: 1;
      transform: translateY(0);
    }
    to {
      opacity: 0;
      transform: translateY(-#{$distance});
    }
  }
}

// Slide animation mixin
@mixin slide-animation($direction: 'up', $distance: 100%) {
  @if $direction == 'up' {
    from { transform: translateY($distance); }
    to { transform: translateY(0); }
  } @else if $direction == 'down' {
    from { transform: translateY(-$distance); }
    to { transform: translateY(0); }
  } @else if $direction == 'left' {
    from { transform: translateX($distance); }
    to { transform: translateX(0); }
  } @else if $direction == 'right' {
    from { transform: translateX(-$distance); }
    to { transform: translateX(0); }
  }
}

// Scale animation mixin
@mixin scale-animation($from: 0, $to: 1) {
  from {
    transform: scale($from);
  }
  to {
    transform: scale($to);
  }
}

// Rotate animation mixin
@mixin rotate-animation($from: 0deg, $to: 360deg) {
  from {
    transform: rotate($from);
  }
  to {
    transform: rotate($to);
  }
}

// Hover animation mixin
@mixin hover-animation($property: transform, $value: scale(1.05), $duration: 0.15s) {
  transition: $property $duration ease;
  
  &:hover {
    #{$property}: $value;
  }
}

// Loading animation mixin
@mixin loading-animation($size: 40px, $color: currentColor) {
  width: $size;
  height: $size;
  border: 3px solid rgba($color, 0.3);
  border-radius: 50%;
  border-top-color: $color;
  animation: spin 0.6sest ease-in-out infinite;
}

// Keyframes for common animations
@keyframes spin {
  to { transform: rotate(360deg); }
}

// Staggered animation mixin for lists
@mixin staggered-animation($base-delay: motion.$semantic-motion-transition-delay-100, $animation: fadeInUp 0.3s ease-out) {
  @for $i from 1 through 10 {
    &:nth-child(#{$i}) {
      animation: $animation;
      animation-delay: #{$base-delay * $i};
      animation-fill-mode: both;
    }
  }
}Cͺsx:// Animation Utilities
// Helper classes for animation control


// Animation delays
.animation-delay-100 {
  animation-delay: 0.1s;
}

.animation-delay-200 {
  animation-delay: 0.2s;
}

.animation-delay-300 {
  animation-delay: 0.3s;
}

.animation-delay-500 {
  animation-delay: 0.5s;
}

.animation-delay-1000 {
  animation-delay: 1s;
}

// Animation durations
.animation-duration-fast {
  animation-duration: 0.15s;
}

.animation-duration-normal {
  animation-duration: 0.3s;
}

.animation-duration-slow {
  animation-duration: 0.6s;
}

.animation-duration-slower {
  animation-duration: 1s;
}

// Animation fill modes
.animation-fill-none {
  animation-fill-mode: none;
}

.animation-fill-forwards {
  animation-fill-mode: forwards;
}

.animation-fill-backwards {
  animation-fill-mode: backwards;
}

.animation-fill-both {
  animation-fill-mode: both;
}

// Animation iteration counts
.animation-infinite {
  animation-iteration-count: infinite;
}

.animation-once {
  animation-iteration-count: 1;
}

.animation-twice {
  animation-iteration-count: 2;
}

// Animation play states
.animation-paused {
  animation-play-state: paused;
}

.animation-running {
  animation-play-state: running;
}

// Animation directions
.animation-normal {
  animation-direction: normal;
}

.animation-reverse {
  animation-direction: reverse;
}

.animation-alternate {
  animation-direction: alternate;
}

.animation-alternate-reverse {
  animation-direction: alternate-reverse;
}

// Animation timing functions
.animation-linear {
  animation-timing-function: linear;
}

.animation-ease-in {
  animation-timing-function: ease-in;
}

.animation-ease-out {
  animation-timing-function: ease-out;
}

.animation-ease-in-out {
  animation-timing-function: ease-in-out;
}

.animation-bounce-timing {
  animation-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}%zǲxRimport { Component, Input, OnInit, OnDestroy, OnChanges, SimpleChanges, ElementRef, inject, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { LinearGradientConfig, RadialGradientConfig, ConicGradientConfig, ColorStop, GradientDirection } from '../../types/background.types';
import { BackgroundService } from '../../services/background.service';

@Component({
  selector: 'ui-gradient-background',
  standalone: true,
  template: '<ng-content></ng-content>',
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  host: {
    'class': 'ui-background ui-background--gradient'
  }
})
export class GradientBackgroundComponent implements OnInit, OnDestroy, OnChanges {
  private readonly elementRef = inject(ElementRef<HTMLElement>);
  private readonly backgroundService = inject(BackgroundService);
  private backgroundId?: string;

  @Input() type: 'linear' | 'radial' | 'conic' = 'linear';
  @Input() colors: string[] = ['#000000', '#ffffff'];
  @Input() direction?: GradientDirection | string;
  @Input() shape?: 'circle' | 'ellipse';
  @Input() size?: 'closest-side' | 'closest-corner' | 'farthest-side' | 'farthest-corner';
  @Input() position?: string;
  @Input() angle?: string | number;
  @Input() colorStops?: ColorStop[];
  @Input() fullScreen = false;
  @Input() zIndex?: number;

  ngOnInit(): void {
    this.applyBackground();
  }

  ngOnChanges(changes: SimpleChanges): void {
    const relevantChanges = ['type', 'colors', 'direction', 'shape', 'size', 'position', 'angle', 'colorStops', 'fullScreen', 'zIndex'];
    if (relevantChanges.some(key => changes[key])) {
      this.applyBackground();
    }
  }

  ngOnDestroy(): void {
    if (this.backgroundId) {
      this.backgroundService.removeBackground(this.backgroundId);
    }
  }

  private applyBackground(): void {
    if (this.backgroundId) {
      this.backgroundService.removeBackground(this.backgroundId);
    }

    const colorStops = this.colorStops || this.colors.map(color => ({ color }));
    let config: LinearGradientConfig | RadialGradientConfig | ConicGradientConfig;

    switch (this.type) {
      case 'linear':
        config = {
          type: 'linear-gradient',
          direction: this.direction,
          colors: colorStops
        };
        break;
      case 'radial':
        config = {
          type: 'radial-gradient',
          shape: this.shape,
          size: this.size,
          position: this.position,
          colors: colorStops
        };
        break;
      case 'conic':
        config = {
          type: 'conic-gradient',
          angle: this.angle,
          position: this.position,
          colors: colorStops
        };
        break;
    }

    if (this.fullScreen) {
      this.backgroundId = this.backgroundService.applyFullScreenBackground(config, {
        zIndex: this.zIndex || -1
      });
    } else {
      this.backgroundId = this.backgroundService.applyBackground(
        this.elementRef.nativeElement,
        config
      );
    }

    // Update host class
    this.elementRef.nativeElement.classList.add(`ui-background--${this.type}-gradient`);
  }
}3(`xxImageBackgroundConfigimageimage~Image{ required: true }) url!: string;
  @Input() size: 'auto' | 'cover' | 'contain' | string = 'cover';
  @Input() position = 'center';
  @Input() repeat: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat' = 'no-repeat';
  @Input() attachment?: 'scroll' | 'fix%ed' | 'local';
  @Input() opacity = 1urlrepeat', 'attachment', 'opacity(!this.url) {
      return
Xanfig: ImageBackgroundConfig = {
      type: 'image',
      url: this.url,
      size: this.size,
	%Zrepeat: this.repeat,
      attachment: this.attachment,
      opacity: this.opacity
    };
2  }
}Д!xPatternConfig, PatternTypepatternOpattern0PatternK) pattern: PatternType = 'dots';
  @Input() primaryColor = '#000000';
  @Input() secondaryColor = '#ffffff';
  @Input() size: string | number = 20B1pattern', 'primaryColor', 'secondaryColor', 'sizeI3]PatternConfig = {
      type: 'pattern',
      pattern: this.pattern,
      primaryColor: this.primaryColor,
      secondaryColor: this.secondaryColorXN
    // Update host class
!?.classList.add(`ui-background--pattern-${this.pattern}`);
  }
}ڶ]Dx <SolidsolidOsolid0SolidK) color = '#000000'ZBif (changes['color'] || changes['fullScreen'] || changes['zIndex']ۓ]Solid"solid',
      color: this.color>Bax Cexport * from './solid-background.component';
export * from './gradient-background.component';
export * from './pattern-background.component';
export * from './image-background.component';SBٴx$ export * from './backgrounds/index';x$import { 
  Directive, 
  Input, 
  OnInit, 
  OnDestroy, 
  OnChanges, 
  SimpleChanges,
  ElementRef,
  inject
} from '@angular/core';
import { BackgroundConfig, BackgroundOptions } from '../types/background.types';
import { BackgroundService } from '../services/background.service';

@Directive({
  selector: '[uiBackground]',
  standalone: true
})
export class BackgroundDirective implements OnInit, OnDestroy, OnChanges {
  private readonly elementRef = inject(ElementRef<HTMLElement>);
  private readonly backgroundService = inject(BackgroundService);
  private backgroundId?: string;

  @Input('uiBackground') config?: BackgroundConfig;
  @Input() backgroundOptions?: Partial<BackgroundOptions>;
  @Input() backgroundDisabled = false;

  ngOnInit(): void {
    this.applyBackground();
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes['config'] || changes['backgroundOptions'] || changes['backgroundDisabled']) {
      if (this.backgroundDisabled) {
        this.removeBackground();
      } else {
        this.applyBackground();
      }
    }
  }

  ngOnDestroy(): void {
    this.removeBackground();
  }

  private applyBackground(): void {
    if (!this.config || this.backgroundDisabled) {
      return;
    }

    // Remove existing background if present
    this.removeBackground();

    // Apply new background
    this.backgroundId = this.backgroundService.applyBackground(
      this.elementRef.nativeElement,
      this.config
    );

    // Add base CSS class for styling
    this.elementRef.nativeElement.classList.add('ui-background');
    
    // Add specific CSS classes based on configuration
    this.addTypeClasses();
  }

  private removeBackground(): void {
    if (this.backgroundId) {
      this.backgroundService.removeBackground(this.backgroundId);
      this.backgroundId = undefined;
    }

    // Remove CSS classes
    this.removeTypeClasses();
    this.elementRef.nativeElement.classList.remove('ui-background');
  }

  private addTypeClasses(): void {
    if (!this.config) return;

    const element = this.elementRef.nativeElement;
    element.classList.add(`ui-background--${this.config.type}`);

    // Add additional classes based on type
    switch (this.config.type) {
      case 'linear-gradient':
      case 'radial-gradient':
      case 'conic-gradient':
        element.classList.add('ui-background--gradient');
        break;
      case 'pattern':
        element.classList.add('ui-background--pattern');
        if (this.config.pattern) {
          element.classList.add(`ui-background--pattern-${this.config.pattern}`);
        }
        break;
      case 'image':
        element.classList.add('ui-background--image');
        break;
      case 'animated':
        element.classList.add('ui-background--animated');
        break;
      case 'glass':
        element.classList.add('ui-background--glass');
        break;
    }
  }

  private removeTypeClasses(): void {
    if (!this.config) return;

    const element = this.elementRef.nativeElement;
    const classesToRemove: string[] = [];
    
    element.classList.forEach((cls: string) => {
      if (cls.startsWith('ui-background--')) {
        classesToRemove.push(cls);
      }
    });
    
    classesToRemove.forEach(cls => element.classList.remove(cls));
  }
}]&x' export * from './background.directive';Դxkimport { Injectable, signal, computed } from '@angular/core';
import { BackgroundConfig, BackgroundOptions, BackgroundState } from '../types/background.types';
import { BackgroundGenerator } from '../utils/background-generator';

@Injectable({
  providedIn: 'root'
})
export class BackgroundService {
  private _activeBackgrounds = signal<Map<string, BackgroundState>>(new Map());
  
  // Public computed signals
  readonly activeBackgrounds = computed(() => Array.from(this._activeBackgrounds().values()));
  readonly hasActiveBackgrounds = computed(() => this._activeBackgrounds().size > 0);

  /**
   * Apply a background to an element
   */
  applyBackground(element: HTMLElement, config: BackgroundConfig, id?: string): string {
    const backgroundId = id || this.generateId();
    const styles = BackgroundGenerator.generateCss(config);
    
    // Apply styles to element
    Object.entries(styles).forEach(([property, value]) => {
      element.style.setProperty(property, value);
    });

    // Add to active backgrounds
    this._activeBackgrounds.update(backgrounds => {
      const newMap = new Map(backgrounds);
      newMap.set(backgroundId, {
        active: true,
        config,
        element
      });
      return newMap;
    });

    return backgroundId;
  }

  /**
   * Apply a full-screen background
   */
  applyFullScreenBackground(config: BackgroundConfig, options?: Partial<BackgroundOptions>): string {
    const backgroundId = this.generateId();
    const element = this.createFullScreenElement(options);
    
    const styles = BackgroundGenerator.generateCss(config);
    Object.entries(styles).forEach(([property, value]) => {
      element.style.setProperty(property, value);
    });

    document.body.appendChild(element);

    this._activeBackgrounds.update(backgrounds => {
      const newMap = new Map(backgrounds);
      newMap.set(backgroundId, {
        active: true,
        config,
        element
      });
      return newMap;
    });

    return backgroundId;
  }

  /**
   * Update an existing background
   */
  updateBackground(id: string, config: BackgroundConfig): boolean {
    const backgroundState = this._activeBackgrounds().get(id);
    if (!backgroundState || !backgroundState.element) {
      return false;
    }

    const styles = BackgroundGenerator.generateCss(config);
    Object.entries(styles).forEach(([property, value]) => {
      backgroundState.element!.style.setProperty(property, value);
    });

    this._activeBackgrounds.update(backgrounds => {
      const newMap = new Map(backgrounds);
      const existing = newMap.get(id);
      if (existing) {
        existing.config = config;
        newMap.set(id, existing);
      }
      return newMap;
    });

    return true;
  }

  /**
   * Remove a background
   */
  removeBackground(id: string): boolean {
    const backgroundState = this._activeBackgrounds().get(id);
    if (!backgroundState) {
      return false;
    }

    // Remove full-screen element if it was created by this service
    if (backgroundState.element?.classList.contains('ui-background-fullscreen')) {
      backgroundState.element.remove();
    } else if (backgroundState.element) {
      // Clear inline styles for regular elements
      this.clearElementStyles(backgroundState.element);
    }

    this._activeBackgrounds.update(backgrounds => {
      const newMap = new Map(backgrounds);
      newMap.delete(id);
      return newMap;
    });

    return true;
  }

  /**
   * Remove all backgrounds
   */
  removeAllBackgrounds(): void {
    this._activeBackgrounds().forEach((state, id) => {
      this.removeBackground(id);
    });
  }

  /**
   * Get background state
   */
  getBackground(id: string): BackgroundState | undefined {
    return this._activeBackgrounds().get(id);
  }

  /**
   * Generate CSS for a configuration without applying it
   */
  generateCss(config: BackgroundConfig): { [key: string]: string } {
    return BackgroundGenerator.generateCss(config);
  }

  /**
   * Generate a background ID
   */
  private generateId(): string {
    return `bg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
  }

  /**
   * Create a full-screen background element
   */
  private createFullScreenElement(options?: Partial<BackgroundOptions>): HTMLElement {
    const element = document.createElement('div');
    element.className = `ui-background-fullscreen ${options?.className || ''}`.trim();
    
    // Base full-screen styles
    element.style.position = 'fixed';
    element.style.top = '0';
    element.style.left = '0';
    element.style.width = '100%';
    element.style.height = '100%';
    element.style.pointerEvents = 'none';
    element.style.zIndex = (options?.zIndex || -1).toString();

    return element;
  }

  /**
   * Clear background-related styles from an element
   */
  private clearElementStyles(element: HTMLElement): void {
    const propertiesToClear = [
      'background',
      'background-image',
      'background-color',
      'background-size',
      'background-position',
      'background-repeat',
      'background-attachment',
      'backdrop-filter',
      'opacity',
      'animation'
    ];

    propertiesToClear.forEach(property => {
      element.style.removeProperty(property);
    });
  }
}|x% export * from './background.service';fx9export type BackgroundType = 
  | 'solid' 
  | 'linear-gradient' 
  | 'radial-gradient' 
  | 'conic-gradient'
  | 'pattern' 
  | 'image' 
  | 'animated' 
  | 'mesh' 
  | 'noise'
  | 'glass';

export type PatternType = 
  | 'dots'
  | 'grid'
  | 'stripes'
  | 'diagonal-stripes'
  | 'chevron'
  | 'waves'
  | 'hexagon'
  | 'triangles'
  | 'checkerboard'
  | 'circles'
  | 'crosshatch'
  | 'polka-dots';

export type GradientDirection = 
  | 'to-top'
  | 'to-top-right' 
  | 'to-right'
  | 'to-bottom-right'
  | 'to-bottom'
  | 'to-bottom-left'
  | 'to-left'
  | 'to-top-left';

export interface ColorStop {
  color: string;
  position?: string | number;
}

export interface SolidBackgroundConfig {
  type: 'solid';
  color: string;
}

export interface LinearGradientConfig {
  type: 'linear-gradient';
  direction?: GradientDirection | string;
  colors: ColorStop[];
}

export interface RadialGradientConfig {
  type: 'radial-gradient';
  shape?: 'circle' | 'ellipse';
  size?: 'closest-side' | 'closest-corner' | 'farthest-side' | 'farthest-corner';
  position?: string;
  colors: ColorStop[];
}

export interface ConicGradientConfig {
  type: 'conic-gradient';
  angle?: string | number;
  position?: string;
  colors: ColorStop[];
}

export interface PatternConfig {
  type: 'pattern';
  pattern: PatternType;
  primaryColor?: string;
  secondaryColor?: string;
  size?: string | number;
  opacity?: number;
}

export interface ImageBackgroundConfig {
  type: 'image';
  url: string;
  size?: 'auto' | 'cover' | 'contain' | string;
  position?: string;
  repeat?: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat';
  attachment?: 'scroll' | 'fixed' | 'local';
  opacity?: number;
}

export interface AnimatedBackgroundConfig {
  type: 'animated';
  baseConfig: LinearGradientConfig | RadialGradientConfig | ConicGradientConfig | PatternConfig;
  duration?: string;
  timing?: string;
  iteration?: 'infinite' | number;
}

export interface MeshGradientConfig {
  type: 'mesh';
  colors: string[];
  complexity?: 'low' | 'medium' | 'high';
  seed?: number;
}

export interface NoiseConfig {
  type: 'noise';
  baseColor?: string;
  intensity?: number;
  scale?: number;
  opacity?: number;
}

export interface GlassConfig {
  type: 'glass';
  backdrop?: 'blur' | 'saturate' | 'both';
  intensity?: number;
  tint?: string;
  opacity?: number;
}

export type BackgroundConfig = 
  | SolidBackgroundConfig
  | LinearGradientConfig
  | RadialGradientConfig
  | ConicGradientConfig
  | PatternConfig
  | ImageBackgroundConfig
  | AnimatedBackgroundConfig
  | MeshGradientConfig
  | NoiseConfig
  | GlassConfig;

export interface BackgroundOptions {
  config: BackgroundConfig;
  zIndex?: number;
  fullScreen?: boolean;
  responsive?: boolean;
  className?: string;
}

export interface BackgroundState {
  active: boolean;
  config?: BackgroundConfig;
  element?: HTMLElement;
}S=x# export * from './background.types';BJx($import { 
  BackgroundConfig, 
  ColorStop, 
  LinearGradientConfig, 
  RadialGradientConfig, 
  ConicGradientConfig,
  PatternConfig,
  ImageBackgroundConfig,
  SolidBackgroundConfig,
  AnimatedBackgroundConfig,
  MeshGradientConfig,
  NoiseConfig,
  GlassConfig
} from '../types/background.types';

export class BackgroundGenerator {
  
  static generateCss(config: BackgroundConfig): { [key: string]: string } {
    switch (config.type) {
      case 'solid':
        return this.generateSolid(config);
      case 'linear-gradient':
        return this.generateLinearGradient(config);
      case 'radial-gradient':
        return this.generateRadialGradient(config);
      case 'conic-gradient':
        return this.generateConicGradient(config);
      case 'pattern':
        return this.generatePattern(config);
      case 'image':
        return this.generateImage(config);
      case 'animated':
        return this.generateAnimated(config);
      case 'mesh':
        return this.generateMesh(config);
      case 'noise':
        return this.generateNoise(config);
      case 'glass':
        return this.generateGlass(config);
      default:
        return { background: 'transparent' };
    }
  }

  private static generateSolid(config: SolidBackgroundConfig): { [key: string]: string } {
    return {
      background: config.color,
      'background-size': 'cover',
      'background-position': 'center',
      'background-repeat': 'no-repeat'
    };
  }

  private static generateLinearGradient(config: LinearGradientConfig): { [key: string]: string } {
    const direction = config.direction || 'to bottom';
    const colorStops = this.formatColorStops(config.colors);
    
    return {
      background: `linear-gradient(${direction}, ${colorStops})`,
      'background-size': 'cover',
      'background-position': 'center',
      'background-repeat': 'no-repeat'
    };
  }

  private static generateRadialGradient(config: RadialGradientConfig): { [key: string]: string } {
    const shape = config.shape || 'ellipse';
    const size = config.size || 'farthest-corner';
    const position = config.position || 'center';
    const colorStops = this.formatColorStops(config.colors);
    
    return {
      background: `radial-gradient(${shape} ${size} at ${position}, ${colorStops})`,
      'background-size': 'cover',
      'background-position': 'center',
      'background-repeat': 'no-repeat'
    };
  }

  private static generateConicGradient(config: ConicGradientConfig): { [key: string]: string } {
    const angle = config.angle ? `from ${config.angle}deg` : '';
    const position = config.position ? `at ${config.position}` : '';
    const colorStops = this.formatColorStops(config.colors);
    
    return {
      background: `conic-gradient(${angle} ${position}, ${colorStops})`,
      'background-size': 'cover',
      'background-position': 'center',
      'background-repeat': 'no-repeat'
    };
  }

  private static generatePattern(config: PatternConfig): { [key: string]: string } {
    const primaryColor = config.primaryColor || '#000000';
    const secondaryColor = config.secondaryColor || '#ffffff';
    const size = typeof config.size === 'number' ? `${config.size}px` : (config.size || '20px');
    const opacity = config.opacity || 1;

    const patternCss = this.getPatternCss(config.pattern, primaryColor, secondaryColor, size);
    
    return {
      background: patternCss,
      opacity: opacity.toString(),
      'background-size': size,
      'background-repeat': 'repeat'
    };
  }

  private static generateImage(config: ImageBackgroundConfig): { [key: string]: string } {
    const styles: { [key: string]: string } = {
      'background-image': `url(${config.url})`,
      'background-size': config.size || 'cover',
      'background-position': config.position || 'center',
      'background-repeat': config.repeat || 'no-repeat'
    };

    if (config.attachment) {
      styles['background-attachment'] = config.attachment;
    }

    if (config.opacity !== undefined) {
      styles['opacity'] = config.opacity.toString();
    }

    return styles;
  }

  private static generateAnimated(config: AnimatedBackgroundConfig): { [key: string]: string } {
    const baseStyles = this.generateCss(config.baseConfig);
    const duration = config.duration || '5s';
    const timing = config.timing || 'ease-in-out';
    const iteration = config.iteration === 'infinite' ? 'infinite' : (config.iteration || 1).toString();

    return {
      ...baseStyles,
      animation: `background-animation ${duration} ${timing} ${iteration}`,
    };
  }

  private static generateMesh(config: MeshGradientConfig): { [key: string]: string } {
    // Generate mesh gradient using multiple radial gradients
    const colors = config.colors;
    const complexity = config.complexity || 'medium';
    
    // Create multiple overlapping radial gradients
    const gradients = this.generateMeshGradients(colors, complexity);
    
    return {
      background: gradients.join(', '),
      'background-size': '400% 400%',
      animation: 'mesh-animation 15s ease infinite'
    };
  }

  private static generateNoise(config: NoiseConfig): { [key: string]: string } {
    const baseColor = config.baseColor || '#000000';
    const intensity = config.intensity || 0.5;
    const scale = config.scale || 100;
    const opacity = config.opacity || 1;

    // Create noise effect using CSS filters and patterns
    return {
      background: baseColor,
      'background-image': `url("data:image/svg+xml,%3Csvg viewBox='0 0 ${scale} ${scale}' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='${intensity}'/%3E%3C/svg%3E")`,
      opacity: opacity.toString()
    };
  }

  private static generateGlass(config: GlassConfig): { [key: string]: string } {
    const intensity = config.intensity || 10;
    const tint = config.tint || 'rgba(255, 255, 255, 0.1)';
    const opacity = config.opacity || 0.8;
    
    const styles: { [key: string]: string } = {
      background: tint,
      opacity: opacity.toString(),
      'backdrop-filter': `blur(${intensity}px)`
    };

    if (config.backdrop === 'saturate' || config.backdrop === 'both') {
      styles['backdrop-filter'] += ` saturate(150%)`;
    }

    return styles;
  }

  private static formatColorStops(colors: ColorStop[]): string {
    return colors.map(stop => {
      if (stop.position !== undefined) {
        const position = typeof stop.position === 'number' ? `${stop.position}%` : stop.position;
        return `${stop.color} ${position}`;
      }
      return stop.color;
    }).join(', ');
  }

  private static getPatternCss(pattern: string, primary: string, secondary: string, size: string): string {
    const patterns: { [key: string]: string } = {
      'dots': `radial-gradient(circle, ${primary} 20%, transparent 20%)`,
      'grid': `linear-gradient(${primary} 1px, transparent 1px), linear-gradient(90deg, ${primary} 1px, transparent 1px)`,
      'stripes': `linear-gradient(45deg, ${primary} 25%, transparent 25%, transparent 50%, ${primary} 50%, ${primary} 75%, transparent 75%)`,
      'diagonal-stripes': `linear-gradient(45deg, ${primary} 25%, transparent 25%, transparent 50%, ${primary} 50%, ${primary} 75%, transparent 75%)`,
      'chevron': `linear-gradient(45deg, ${primary} 25%, transparent 25%), linear-gradient(-45deg, ${primary} 25%, transparent 25%)`,
      'waves': `radial-gradient(circle at 50% 100%, transparent 40%, ${primary} 40%, ${primary} 60%, transparent 60%)`,
      'hexagon': `radial-gradient(circle at 50% 0%, transparent 40%, ${primary} 40%, ${primary} 60%, transparent 60%)`,
      'triangles': `linear-gradient(60deg, ${primary} 25%, transparent 25%), linear-gradient(120deg, ${primary} 25%, transparent 25%)`,
      'checkerboard': `linear-gradient(45deg, ${primary} 25%, transparent 25%, transparent 75%, ${primary} 75%), linear-gradient(45deg, ${primary} 25%, transparent 25%, transparent 75%, ${primary} 75%)`,
      'circles': `radial-gradient(circle, ${primary} 40%, transparent 40%)`,
      'crosshatch': `linear-gradient(0deg, ${primary} 1px, transparent 1px), linear-gradient(90deg, ${primary} 1px, transparent 1px), linear-gradient(45deg, ${primary} 1px, transparent 1px), linear-gradient(-45deg, ${primary} 1px, transparent 1px)`,
      'polka-dots': `radial-gradient(circle, ${primary} 25%, transparent 25%)`
    };

    return patterns[pattern] || patterns['dots'];
  }

  private static generateMeshGradients(colors: string[], complexity: string): string[] {
    const gradientCount = complexity === 'high' ? 6 : complexity === 'medium' ? 4 : 2;
    const gradients: string[] = [];

    for (let i = 0; i < gradientCount; i++) {
      const color1 = colors[i % colors.length];
      const color2 = colors[(i + 1) % colors.length];
      const x = Math.random() * 100;
      const y = Math.random() * 100;
      const size = 50 + Math.random() * 50;
      
      gradients.push(
        `radial-gradient(${size}% ${size}% at ${x}% ${y}%, ${color1}, transparent)`
      );
    }

    return gradients;
  }
}ɷx' export * from './background-generator';۳lx<// Animation keyframes for ui-backgrounds library

// Basic gradient animation
@keyframes ui-background-animation {
  0% {
    background-position: 0% 50%;
  }
  50% {
    background-position: 100% 50%;
  }
  100% {
    background-position: 0% 50%;
  }
}

// Mesh gradient animation
@keyframes ui-mesh-animation {
  0%, 100% {
    background-position: 0% 0%;
  }
  25% {
    background-position: 100% 0%;
  }
  50% {
    background-position: 100% 100%;
  }
  75% {
    background-position: 0% 100%;
  }
}

// Floating animation for patterns
@keyframes ui-pattern-float {
  0%, 100% {
    transform: translateY(0px);
  }
  50% {
    transform: translateY(-20px);
  }
}

// Rotation animation
@keyframes ui-background-rotate {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

// Scale animation
@keyframes ui-background-scale {
  0%, 100% {
    transform: scale(1);
  }
  50% {
    transform: scale(1.1);
  }
}

// Pulse animation
@keyframes ui-background-pulse {
  0%, 100% {
    opacity: 1;
  }
  50% {
    opacity: 0.7;
  }
}

// Color shifting animation
@keyframes ui-background-hue-shift {
  0% {
    filter: hue-rotate(0deg);
  }
  100% {
    filter: hue-rotate(360deg);
  }
}

// Blur animation for glass effects
@keyframes ui-background-blur-pulse {
  0%, 100% {
    backdrop-filter: blur(10px);
  }
  50% {
    backdrop-filter: blur(20px);
  }
}

// Slide animation
@keyframes ui-background-slide {
  0% {
    background-position: -100% 0;
  }
  100% {
    background-position: 100% 0;
  }
}

// Wave animation
@keyframes ui-background-wave {
  0%, 100% {
    background-position: 0% 50%;
  }
  25% {
    background-position: 50% 0%;
  }
  75% {
    background-position: 50% 100%;
  }
}x3// Base styles for ui-backgrounds library

// Import animations
@import 'animations';

// Base background component styles
.ui-background {
  position: relative;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  
  // Ensure proper layering
  z-index: 0;
  
  &--fullscreen {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
    z-index: -1;
  }
}

// Type-specific styles
.ui-background--solid {
  background-image: none;
}

.ui-background--gradient {
  // Base gradient styles
  &.ui-background--linear-gradient {
    background-size: 200% 200%;
  }
  
  &.ui-background--radial-gradient {
    background-size: 200% 200%;
  }
  
  &.ui-background--conic-gradient {
    background-size: 200% 200%;
  }
}

.ui-background--pattern {
  background-repeat: repeat;
  
  &.ui-background--pattern-dots {
    // Dots pattern specific styles
  }
  
  &.ui-background--pattern-grid {
    // Grid pattern specific styles
  }
  
  &.ui-background--pattern-stripes {
    // Stripes pattern specific styles
  }
  
  &.ui-background--pattern-diagonal-stripes {
    // Diagonal stripes pattern specific styles
  }
  
  &.ui-background--pattern-chevron {
    // Chevron pattern specific styles
  }
  
  &.ui-background--pattern-waves {
    background-repeat: repeat-x;
  }
  
  &.ui-background--pattern-hexagon {
    // Hexagon pattern specific styles
  }
  
  &.ui-background--pattern-triangles {
    // Triangles pattern specific styles
  }
  
  &.ui-background--pattern-checkerboard {
    // Checkerboard pattern specific styles
  }
  
  &.ui-background--pattern-circles {
    // Circles pattern specific styles
  }
  
  &.ui-background--pattern-crosshatch {
    // Crosshatch pattern specific styles
  }
  
  &.ui-background--pattern-polka-dots {
    // Polka dots pattern specific styles
  }
}

.ui-background--image {
  // Image background specific styles
}

.ui-background--animated {
  // Base animation styles
  background-size: 200% 200%;
  
  // Apply default animation
  animation: ui-background-animation 5s ease-in-out infinite;
  
  // Respect reduced motion preferences
  @media (prefers-reduced-motion: reduce) {
    animation: none;
  }
}

.ui-background--mesh {
  background-size: 400% 400%;
  animation: ui-mesh-animation 15s ease infinite;
  
  @media (prefers-reduced-motion: reduce) {
    animation: none;
  }
}

.ui-background--noise {
  // Noise background specific styles
}

.ui-background--glass {
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px); // Safari support
  
  // Fallback for browsers that don't support backdrop-filter
  @supports not (backdrop-filter: blur()) {
    background-color: rgba(255, 255, 255, 0.8);
  }
}

// Responsive behavior
@media (max-width: 768px) {
  .ui-background--animated,
  .ui-background--mesh {
    // Disable complex animations on mobile for performance
    @media (prefers-reduced-motion: no-preference) {
      animation-duration: 10s; // Slower animations
    }
  }
}

// High contrast mode support
@media (prefers-contrast: high) {
  .ui-background {
    filter: contrast(1.2);
  }
  
  .ui-background--glass {
    backdrop-filter: none;
    background-color: rgba(255, 255, 255, 0.95);
  }
}

// Print styles
@media print {
  .ui-background {
    background: none !important;
    backdrop-filter: none !important;
    animation: none !important;
  }
  
  .ui-background--fullscreen {
    display: none !important;
  }
}

// Dark mode considerations
@media (prefers-color-scheme: dark) {
  .ui-background--glass {
    background-color: rgba(0, 0, 0, 0.3);
  }
}xi// Background Mixins for ui-backgrounds library

// Base background mixin
@mixin ui-background-base() {
  position: relative;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

// Full screen background mixin
@mixin ui-background-fullscreen($z-index: -1) {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: $z-index;
}

// Solid color background
@mixin ui-background-solid($color) {
  background-color: $color;
  background-image: none;
}

// Linear gradient background
@mixin ui-background-linear-gradient($direction: 'to bottom', $colors...) {
  background: linear-gradient(#{$direction}, $colors);
}

// Radial gradient background
@mixin ui-background-radial-gradient($shape: 'ellipse', $size: 'farthest-corner', $position: 'center', $colors...) {
  background: radial-gradient(#{$shape} #{$size} at #{$position}, $colors);
}

// Conic gradient background
@mixin ui-background-conic-gradient($angle: 0deg, $position: 'center', $colors...) {
  background: conic-gradient(from #{$angle} at #{$position}, $colors);
}

// Pattern backgrounds
@mixin ui-pattern-dots($primary: #000, $secondary: transparent, $size: 20px) {
  background-image: radial-gradient(circle, #{$primary} 20%, #{$secondary} 20%);
  background-size: $size $size;
  background-repeat: repeat;
}

@mixin ui-pattern-grid($color: #000, $size: 20px, $line-width: 1px) {
  background-image: 
    linear-gradient(#{$color} #{$line-width}, transparent #{$line-width}),
    linear-gradient(90deg, #{$color} #{$line-width}, transparent #{$line-width});
  background-size: $size $size;
  background-repeat: repeat;
}

@mixin ui-pattern-stripes($primary: #000, $secondary: transparent, $size: 20px) {
  background-image: linear-gradient(45deg, #{$primary} 25%, #{$secondary} 25%, #{$secondary} 50%, #{$primary} 50%, #{$primary} 75%, #{$secondary} 75%);
  background-size: $size $size;
  background-repeat: repeat;
}

@mixin ui-pattern-diagonal-stripes($primary: #000, $secondary: transparent, $size: 20px) {
  background-image: linear-gradient(-45deg, #{$primary} 25%, #{$secondary} 25%, #{$secondary} 50%, #{$primary} 50%, #{$primary} 75%, #{$secondary} 75%);
  background-size: $size $size;
  background-repeat: repeat;
}

@mixin ui-pattern-chevron($primary: #000, $secondary: transparent, $size: 20px) {
  background-image: 
    linear-gradient(45deg, #{$primary} 25%, #{$secondary} 25%),
    linear-gradient(-45deg, #{$primary} 25%, #{$secondary} 25%);
  background-size: $size $size;
  background-repeat: repeat;
  background-position: 0 0, 0 ($size / 2);
}

@mixin ui-pattern-waves($primary: #000, $secondary: transparent, $size: 40px) {
  background-image: radial-gradient(circle at 50% 100%, #{$secondary} 40%, #{$primary} 40%, #{$primary} 60%, #{$secondary} 60%);
  background-size: $size ($size / 2);
  background-repeat: repeat-x;
}

@mixin ui-pattern-checkerboard($primary: #000, $secondary: #fff, $size: 20px) {
  background-image: 
    linear-gradient(45deg, #{$primary} 25%, transparent 25%, transparent 75%, #{$primary} 75%),
    linear-gradient(45deg, #{$primary} 25%, transparent 25%, transparent 75%, #{$primary} 75%);
  background-color: $secondary;
  background-size: $size $size;
  background-position: 0 0, ($size / 2) ($size / 2);
  background-repeat: repeat;
}

// Animated backgrounds
@mixin ui-background-animated($duration: 5s, $timing: ease-in-out, $iteration: infinite) {
  animation: ui-background-animation $duration $timing $iteration;
}

@mixin ui-background-mesh-animated($duration: 15s) {
  background-size: 400% 400%;
  animation: ui-mesh-animation $duration ease infinite;
}

// Glass/blur backgrounds
@mixin ui-background-glass($blur: 10px, $tint: rgba(255, 255, 255, 0.1), $opacity: 0.8) {
  background: $tint;
  backdrop-filter: blur($blur);
  opacity: $opacity;
}

// Responsive background utilities
@mixin ui-background-responsive($mobile-bg, $tablet-bg: null, $desktop-bg: null) {
  background: $mobile-bg;
  
  @if $tablet-bg {
    @media (min-width: 768px) {
      background: $tablet-bg;
    }
  }
  
  @if $desktop-bg {
    @media (min-width: 1024px) {
      background: $desktop-bg;
    }
  }
}

// Accessibility utilities
@mixin ui-background-high-contrast() {
  @media (prefers-contrast: high) {
    filter: contrast(1.5);
  }
}

@mixin ui-background-reduced-motion() {
  @media (prefers-reduced-motion: reduce) {
    animation: none !important;
  }
}:x 
// Main entry point for ui-backgrounds styles

// Import base components
@import 'mixins';
@import 'animations';  
@import 'base';

// Export mixins for external use
// Users can import this file to get access to all background mixins and styles^UDx @1:Hd	hxb{
  "name": "ui-code-display",
  "version": "0.0.1",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "ui-code-display",
      "version": "0.0.1",
      "dependencies": {
        "tslib": "^2.3.0"
      },
      "peerDependencies": {
        "@angular/common": "^19.2.0",
        "@angular/core": "^19.2.0",
        "@types/prismjs": "^1.26.5",
        "prismjs": "^1.30.0"
      }
    },
    "node_modules/@angular/common": {
      "version": "19.2.14",
      "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.14.tgz",
      "integrity": "sha512-NcNklcuyqaTjOVGf7aru8APX9mjsnZ01gFZrn47BxHozhaR0EMRrotYQTdi8YdVjPkeYFYanVntSLfhyobq/jg==",
      "peer": true,
      "dependencies": {
        "tslib": "^2.3.0"
      },
      "engines": {
        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
      },
      "peerDependencies": {
        "@angular/core": "19.2.14",
        "rxjs": "^6.5.3 || ^7.4.0"
      }
    },
    "node_modules/@angular/core": {
      "version": "19.2.14",
      "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.14.tgz",
      "integrity": "sha512-EVErpW9tGqJ/wNcAN3G/ErH8pHCJ8mM1E6bsJ8UJIpDTZkpqqYjBMtZS9YWH5n3KwUd1tAkAB2w8FK125AjDUQ==",
      "peer": true,
      "dependencies": {
        "tslib": "^2.3.0"
      },
      "engines": {
        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
      },
      "peerDependencies": {
        "rxjs": "^6.5.3 || ^7.4.0",
        "zone.js": "~0.15.0"
      }
    },
    "node_modules/@types/prismjs": {
      "version": "1.26.5",
      "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz",
      "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==",
      "peer": true
    },
    "node_modules/prismjs": {
      "version": "1.30.0",
      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
      "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
      "peer": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/rxjs": {
      "version": "7.8.2",
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
      "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
      "peer": true,
      "dependencies": {
        "tslib": "^2.1.0"
      }
    },
    "node_modules/tslib": {
      "version": "2.8.1",
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
    },
    "node_modules/zone.js": {
      "version": "0.15.1",
      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz",
      "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==",
      "peer": true
    }
  }
}
=o+x vG	2HxB 8q"; _!},
},
  "sideEffects": false
}
k>Gxu    MIT License

    Copyright (c) Microsoft Corporation.

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE
Dh_xz +MIT LICENSE

Copyright (c) 2012 Lea Verou

?MNM3JF:	J
all[2KI-L}GNI
THE SOFTWARE.
.m%	xY PThe MIT License

Copyright (c) 2010-2025 Google LLC. https://angular.dev/license)=x(Angular
=======

The sources for this package are in the main [Angular](https://github.com/angular/angular) repo. Please file issues and pull requests against that repo.

Usage information and reference details can be found in [Angular documentation](https://angular.dev/overview).

License: MIT
i*x   /**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { InjectionToken, OnDestroy, DoCheck, ElementRef, Renderer2, OnChanges, Type, Injector, NgModuleFactory, ViewContainerRef, SimpleChanges, NgIterable, TrackByFunction, TemplateRef, IterableDiffers, KeyValueDiffers, PipeTransform, ChangeDetectorRef } from '@angular/core';
import { SubscriptionLike, Observable, Subscribable } from 'rxjs';
import { LocationChangeListener, PlatformLocation } from './platform_location.d-Lbv6Ueec.js';

/**
 * Enables the `Location` service to read route state from the browser's URL.
 * Angular provides two strategies:
 * `HashLocationStrategy` and `PathLocationStrategy`.
 *
 * Applications should use the `Router` or `Location` services to
 * interact with application route state.
 *
 * For instance, `HashLocationStrategy` produces URLs like
 * <code class="no-auto-link">http://example.com/#/foo</code>,
 * and `PathLocationStrategy` produces
 * <code class="no-auto-link">http://example.com/foo</code> as an equivalent URL.
 *
 * See these two classes for more.
 *
 * @publicApi
 */
declare abstract class LocationStrategy {
    abstract path(includeHash?: boolean): string;
    abstract prepareExternalUrl(internal: string): string;
    abstract getState(): unknown;
    abstract pushState(state: any, title: string, url: string, queryParams: string): void;
    abstract replaceState(state: any, title: string, url: string, queryParams: string): void;
    abstract forward(): void;
    abstract back(): void;
    historyGo?(relativePosition: number): void;
    abstract onPopState(fn: LocationChangeListener): void;
    abstract getBaseHref(): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<LocationStrategy, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<LocationStrategy>;
}
/**
 * A predefined DI token for the base href
 * to be used with the `PathLocationStrategy`.
 * The base href is the URL prefix that should be preserved when generating
 * and recognizing URLs.
 *
 * @usageNotes
 *
 * The following example shows how to use this token to configure the root app injector
 * with a base href value, so that the DI framework can supply the dependency anywhere in the app.
 *
 * ```ts
 * import {NgModule} from '@angular/core';
 * import {APP_BASE_HREF} from '@angular/common';
 *
 * @NgModule({
 *   providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]
 * })
 * class AppModule {}
 * ```
 *
 * @publicApi
 */
declare const APP_BASE_HREF: InjectionToken<string>;
/**
 * @description
 * A {@link LocationStrategy} used to configure the {@link Location} service to
 * represent its state in the
 * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the
 * browser's URL.
 *
 * If you're using `PathLocationStrategy`, you may provide a {@link APP_BASE_HREF}
 * or add a `<base href>` element to the document to override the default.
 *
 * For instance, if you provide an `APP_BASE_HREF` of `'/my/app/'` and call
 * `location.go('/foo')`, the browser's URL will become
 * `example.com/my/app/foo`. To ensure all relative URIs resolve correctly,
 * the `<base href>` and/or `APP_BASE_HREF` should end with a `/`.
 *
 * Similarly, if you add `<base href='/my/app/'/>` to the document and call
 * `location.go('/foo')`, the browser's URL will become
 * `example.com/my/app/foo`.
 *
 * Note that when using `PathLocationStrategy`, neither the query nor
 * the fragment in the `<base href>` will be preserved, as outlined
 * by the [RFC](https://tools.ietf.org/html/rfc3986#section-5.2.2).
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example common/location/ts/path_location_component.ts region='LocationComponent'}
 *
 * @publicApi
 */
declare class PathLocationStrategy extends LocationStrategy implements OnDestroy {
    private _platformLocation;
    private _baseHref;
    private _removeListenerFns;
    constructor(_platformLocation: PlatformLocation, href?: string);
    /** @docs-private */
    ngOnDestroy(): void;
    onPopState(fn: LocationChangeListener): void;
    getBaseHref(): string;
    prepareExternalUrl(internal: string): string;
    path(includeHash?: boolean): string;
    pushState(state: any, title: string, url: string, queryParams: string): void;
    replaceState(state: any, title: string, url: string, queryParams: string): void;
    forward(): void;
    back(): void;
    getState(): unknown;
    historyGo(relativePosition?: number): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<PathLocationStrategy, [null, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PathLocationStrategy>;
}

/** @publicApi */
interface PopStateEvent {
    pop?: boolean;
    state?: any;
    type?: string;
    url?: string;
}
/**
 * @description
 *
 * A service that applications can use to interact with a browser's URL.
 *
 * Depending on the `LocationStrategy` used, `Location` persists
 * to the URL's path or the URL's hash segment.
 *
 * @usageNotes
 *
 * It's better to use the `Router.navigate()` service to trigger route changes. Use
 * `Location` only if you need to interact with or create normalized URLs outside of
 * routing.
 *
 * `Location` is responsible for normalizing the URL against the application's base href.
 * A normalized URL is absolute from the URL host, includes the application's base href, and has no
 * trailing slash:
 * - `/my/app/user/123` is normalized
 * - `my/app/user/123` **is not** normalized
 * - `/my/app/user/123/` **is not** normalized
 *
 * ### Example
 *
 * {@example common/location/ts/path_location_component.ts region='LocationComponent'}
 *
 * @publicApi
 */
declare class Location implements OnDestroy {
    constructor(locationStrategy: LocationStrategy);
    /** @docs-private */
    ngOnDestroy(): void;
    /**
     * Normalizes the URL path for this location.
     *
     * @param includeHash True to include an anchor fragment in the path.
     *
     * @returns The normalized URL path.
     */
    path(includeHash?: boolean): string;
    /**
     * Reports the current state of the location history.
     * @returns The current value of the `history.state` object.
     */
    getState(): unknown;
    /**
     * Normalizes the given path and compares to the current normalized path.
     *
     * @param path The given URL path.
     * @param query Query parameters.
     *
     * @returns True if the given URL path is equal to the current normalized path, false
     * otherwise.
     */
    isCurrentPathEqualTo(path: string, query?: string): boolean;
    /**
     * Normalizes a URL path by stripping any trailing slashes.
     *
     * @param url String representing a URL.
     *
     * @returns The normalized URL string.
     */
    normalize(url: string): string;
    /**
     * Normalizes an external URL path.
     * If the given URL doesn't begin with a leading slash (`'/'`), adds one
     * before normalizing. Adds a hash if `HashLocationStrategy` is
     * in use, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.
     *
     * @param url String representing a URL.
     *
     * @returns  A normalized platform-specific URL.
     */
    prepareExternalUrl(url: string): string;
    /**
     * Changes the browser's URL to a normalized version of a given URL, and pushes a
     * new item onto the platform's history.
     *
     * @param path  URL path to normalize.
     * @param query Query parameters.
     * @param state Location history state.
     *
     */
    go(path: string, query?: string, state?: any): void;
    /**
     * Changes the browser's URL to a normalized version of the given URL, and replaces
     * the top item on the platform's history stack.
     *
     * @param path  URL path to normalize.
     * @param query Query parameters.
     * @param state Location history state.
     */
    replaceState(path: string, query?: string, state?: any): void;
    /**
     * Navigates forward in the platform's history.
     */
    forward(): void;
    /**
     * Navigates back in the platform's history.
     */
    back(): void;
    /**
     * Navigate to a specific page from session history, identified by its relative position to the
     * current page.
     *
     * @param relativePosition  Position of the target page in the history relative to the current
     *     page.
     * A negative value moves backwards, a positive value moves forwards, e.g. `location.historyGo(2)`
     * moves forward two pages and `location.historyGo(-2)` moves back two pages. When we try to go
     * beyond what's stored in the history session, we stay in the current page. Same behaviour occurs
     * when `relativePosition` equals 0.
     * @see https://developer.mozilla.org/en-US/docs/Web/API/History_API#Moving_to_a_specific_point_in_history
     */
    historyGo(relativePosition?: number): void;
    /**
     * Registers a URL change listener. Use to catch updates performed by the Angular
     * framework that are not detectible through "popstate" or "hashchange" events.
     *
     * @param fn The change handler function, which take a URL and a location history state.
     * @returns A function that, when executed, unregisters a URL change listener.
     */
    onUrlChange(fn: (url: string, state: unknown) => void): VoidFunction;
    /**
     * Subscribes to the platform's `popState` events.
     *
     * Note: `Location.go()` does not trigger the `popState` event in the browser. Use
     * `Location.onUrlChange()` to subscribe to URL changes instead.
     *
     * @param value Event that is triggered when the state history changes.
     * @param exception The exception to throw.
     *
     * @see [onpopstate](https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate)
     *
     * @returns Subscribed events.
     */
    subscribe(onNext: (value: PopStateEvent) => void, onThrow?: ((exception: any) => void) | null, onReturn?: (() => void) | null): SubscriptionLike;
    /**
     * Normalizes URL parameters by prepending with `?` if needed.
     *
     * @param  params String of URL parameters.
     *
     * @returns The normalized URL parameters string.
     */
    static normalizeQueryParams: (params: string) => string;
    /**
     * Joins two parts of a URL with a slash if needed.
     *
     * @param start  URL string
     * @param end    URL string
     *
     *
     * @returns The joined URL string.
     */
    static joinWithSlash: (start: string, end: string) => string;
    /**
     * Removes a trailing slash from a URL string if needed.
     * Looks for the first occurrence of either `#`, `?`, or the end of the
     * line as `/` characters and removes the trailing slash if one exists.
     *
     * @param url URL string.
     *
     * @returns The URL string, modified if needed.
     */
    static stripTrailingSlash: (url: string) => string;
    static ɵfac: i0.ɵɵFactoryDeclaration<Location, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<Location>;
}

/**
 * @publicApi
 */
declare abstract class NgLocalization {
    abstract getPluralCategory(value: any, locale?: string): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgLocalization, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<NgLocalization>;
}
/**
 * Returns the plural case based on the locale
 *
 * @publicApi
 */
declare class NgLocaleLocalization extends NgLocalization {
    protected locale: string;
    constructor(locale: string);
    getPluralCategory(value: any, locale?: string): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgLocaleLocalization, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<NgLocaleLocalization>;
}

/**
 * @ngModule CommonModule
 *
 * @usageNotes
 * ```html
 * <some-element [ngClass]="stringExp|arrayExp|objExp|Set">...</some-element>
 *
 * <some-element [ngClass]="{'class1 class2 class3' : true}">...</some-element>
 * ```
 *
 * For more simple use cases you can use the [class bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly.
 * It doesn't require importing a directive.
 *
 * ```html
 * <some-element [class]="'first second'">...</some-element>
 *
 * <some-element [class.expanded]="isExpanded">...</some-element>
 *
 * <some-element [class]="['first', 'second']">...</some-element>
 *
 * <some-element [class]="{'first': true, 'second': true, 'third': false}">...</some-element>
 * ```
 * @description
 *
 * Adds and removes CSS classes on an HTML element.
 *
 * The CSS classes are updated as follows, depending on the type of the expression evaluation:
 * - `string` - the CSS classes listed in the string (space delimited) are added,
 * - `Array` - the CSS classes declared as Array elements are added,
 * - `Object` - keys are CSS classes that get added when the expression given in the value
 *              evaluates to a truthy value, otherwise they are removed.
 *
 *
 * @see [Class bindings](/guide/templates/binding#css-class-and-style-property-bindings)
 *
 * @publicApi
 */
declare class NgClass implements DoCheck {
    private _ngEl;
    private _renderer;
    private initialClasses;
    private rawClass;
    private stateMap;
    constructor(_ngEl: ElementRef, _renderer: Renderer2);
    set klass(value: string);
    set ngClass(value: string | string[] | Set<string> | {
        [klass: string]: any;
    } | null | undefined);
    ngDoCheck(): void;
    private _updateState;
    private _applyStateDiff;
    private _toggleClass;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgClass, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgClass, "[ngClass]", never, { "klass": { "alias": "class"; "required": false; }; "ngClass": { "alias": "ngClass"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * Instantiates a {@link /api/core/Component Component} type and inserts its Host View into the current View.
 * `NgComponentOutlet` provides a declarative approach for dynamic component creation.
 *
 * `NgComponentOutlet` requires a component type, if a falsy value is set the view will clear and
 * any existing component will be destroyed.
 *
 * @usageNotes
 *
 * ### Fine tune control
 *
 * You can control the component creation process by using the following optional attributes:
 *
 * * `ngComponentOutletInputs`: Optional component inputs object, which will be bind to the
 * component.
 *
 * * `ngComponentOutletInjector`: Optional custom {@link Injector} that will be used as parent for
 * the Component. Defaults to the injector of the current view container.
 *
 * * `ngComponentOutletContent`: Optional list of projectable nodes to insert into the content
 * section of the component, if it exists.
 *
 * * `ngComponentOutletNgModule`: Optional NgModule class reference to allow loading another
 * module dynamically, then loading a component from that module.
 *
 * * `ngComponentOutletNgModuleFactory`: Deprecated config option that allows providing optional
 * NgModule factory to allow loading another module dynamically, then loading a component from that
 * module. Use `ngComponentOutletNgModule` instead.
 *
 * ### Syntax
 *
 * Simple
 * ```html
 * <ng-container *ngComponentOutlet="componentTypeExpression"></ng-container>
 * ```
 *
 * With inputs
 * ```html
 * <ng-container *ngComponentOutlet="componentTypeExpression;
 *                                   inputs: inputsExpression;">
 * </ng-container>
 * ```
 *
 * Customized injector/content
 * ```html
 * <ng-container *ngComponentOutlet="componentTypeExpression;
 *                                   injector: injectorExpression;
 *                                   content: contentNodesExpression;">
 * </ng-container>
 * ```
 *
 * Customized NgModule reference
 * ```html
 * <ng-container *ngComponentOutlet="componentTypeExpression;
 *                                   ngModule: ngModuleClass;">
 * </ng-container>
 * ```
 *
 * ### A simple example
 *
 * {@example common/ngComponentOutlet/ts/module.ts region='SimpleExample'}
 *
 * A more complete example with additional options:
 *
 * {@example common/ngComponentOutlet/ts/module.ts region='CompleteExample'}
 *
 * @publicApi
 * @ngModule CommonModule
 */
declare class NgComponentOutlet<T = any> implements OnChanges, DoCheck, OnDestroy {
    private _viewContainerRef;
    /** Component that should be rendered in the outlet. */
    ngComponentOutlet: Type<any> | null;
    ngComponentOutletInputs?: Record<string, unknown>;
    ngComponentOutletInjector?: Injector;
    ngComponentOutletContent?: any[][];
    ngComponentOutletNgModule?: Type<any>;
    /**
     * @deprecated This input is deprecated, use `ngComponentOutletNgModule` instead.
     */
    ngComponentOutletNgModuleFactory?: NgModuleFactory<any>;
    private _componentRef;
    private _moduleRef;
    /**
     * A helper data structure that allows us to track inputs that were part of the
     * ngComponentOutletInputs expression. Tracking inputs is necessary for proper removal of ones
     * that are no longer referenced.
     */
    private _inputsUsed;
    /**
     * Gets the instance of the currently-rendered component.
     * Will be null if no component has been rendered.
     */
    get componentInstance(): T | null;
    constructor(_viewContainerRef: ViewContainerRef);
    private _needToReCreateNgModuleInstance;
    private _needToReCreateComponentInstance;
    /** @docs-private */
    ngOnChanges(changes: SimpleChanges): void;
    /** @docs-private */
    ngDoCheck(): void;
    /** @docs-private */
    ngOnDestroy(): void;
    private _applyInputStateDiff;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgComponentOutlet<any>, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgComponentOutlet<any>, "[ngComponentOutlet]", ["ngComponentOutlet"], { "ngComponentOutlet": { "alias": "ngComponentOutlet"; "required": false; }; "ngComponentOutletInputs": { "alias": "ngComponentOutletInputs"; "required": false; }; "ngComponentOutletInjector": { "alias": "ngComponentOutletInjector"; "required": false; }; "ngComponentOutletContent": { "alias": "ngComponentOutletContent"; "required": false; }; "ngComponentOutletNgModule": { "alias": "ngComponentOutletNgModule"; "required": false; }; "ngComponentOutletNgModuleFactory": { "alias": "ngComponentOutletNgModuleFactory"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * @publicApi
 */
declare class NgForOfContext<T, U extends NgIterable<T> = NgIterable<T>> {
    /** Reference to the current item from the collection. */
    $implicit: T;
    /**
     * The value of the iterable expression. Useful when the expression is
     * more complex then a property access, for example when using the async pipe
     * (`userStreams | async`).
     */
    ngForOf: U;
    /** Returns an index of the current item in the collection. */
    index: number;
    /** Returns total amount of items in the collection. */
    count: number;
    constructor(
    /** Reference to the current item from the collection. */
    $implicit: T, 
    /**
     * The value of the iterable expression. Useful when the expression is
     * more complex then a property access, for example when using the async pipe
     * (`userStreams | async`).
     */
    ngForOf: U, 
    /** Returns an index of the current item in the collection. */
    index: number, 
    /** Returns total amount of items in the collection. */
    count: number);
    get first(): boolean;
    get last(): boolean;
    get even(): boolean;
    get odd(): boolean;
}
/**
 * A [structural directive](guide/directives/structural-directives) that renders
 * a template for each item in a collection.
 * The directive is placed on an element, which becomes the parent
 * of the cloned templates.
 *
 * The `ngForOf` directive is generally used in the
 * [shorthand form](guide/directives/structural-directives#asterisk) `*ngFor`.
 * In this form, the template to be rendered for each iteration is the content
 * of an anchor element containing the directive.
 *
 * The following example shows the shorthand syntax with some options,
 * contained in an `<li>` element.
 *
 * ```html
 * <li *ngFor="let item of items; index as i; trackBy: trackByFn">...</li>
 * ```
 *
 * The shorthand form expands into a long form that uses the `ngForOf` selector
 * on an `<ng-template>` element.
 * The content of the `<ng-template>` element is the `<li>` element that held the
 * short-form directive.
 *
 * Here is the expanded version of the short-form example.
 *
 * ```html
 * <ng-template ngFor let-item [ngForOf]="items" let-i="index" [ngForTrackBy]="trackByFn">
 *   <li>...</li>
 * </ng-template>
 * ```
 *
 * Angular automatically expands the shorthand syntax as it compiles the template.
 * The context for each embedded view is logically merged to the current component
 * context according to its lexical position.
 *
 * When using the shorthand syntax, Angular allows only [one structural directive
 * on an element](guide/directives/structural-directives#one-per-element).
 * If you want to iterate conditionally, for example,
 * put the `*ngIf` on a container element that wraps the `*ngFor` element.
 * For further discussion, see
 * [Structural Directives](guide/directives/structural-directives#one-per-element).
 *
 * @usageNotes
 *
 * ### Local variables
 *
 * `NgForOf` provides exported values that can be aliased to local variables.
 * For example:
 *
 *  ```html
 * <li *ngFor="let user of users; index as i; first as isFirst">
 *    {{i}}/{{users.length}}. {{user}} <span *ngIf="isFirst">default</span>
 * </li>
 * ```
 *
 * The following exported values can be aliased to local variables:
 *
 * - `$implicit: T`: The value of the individual items in the iterable (`ngForOf`).
 * - `ngForOf: NgIterable<T>`: The value of the iterable expression. Useful when the expression is
 * more complex then a property access, for example when using the async pipe (`userStreams |
 * async`).
 * - `index: number`: The index of the current item in the iterable.
 * - `count: number`: The length of the iterable.
 * - `first: boolean`: True when the item is the first item in the iterable.
 * - `last: boolean`: True when the item is the last item in the iterable.
 * - `even: boolean`: True when the item has an even index in the iterable.
 * - `odd: boolean`: True when the item has an odd index in the iterable.
 *
 * ### Change propagation
 *
 * When the contents of the iterator changes, `NgForOf` makes the corresponding changes to the DOM:
 *
 * * When an item is added, a new instance of the template is added to the DOM.
 * * When an item is removed, its template instance is removed from the DOM.
 * * When items are reordered, their respective templates are reordered in the DOM.
 *
 * Angular uses object identity to track insertions and deletions within the iterator and reproduce
 * those changes in the DOM. This has important implications for animations and any stateful
 * controls that are present, such as `<input>` elements that accept user input. Inserted rows can
 * be animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state
 * such as user input.
 * For more on animations, see [Transitions and Triggers](guide/animations/transition-and-triggers).
 *
 * The identities of elements in the iterator can change while the data does not.
 * This can happen, for example, if the iterator is produced from an RPC to the server, and that
 * RPC is re-run. Even if the data hasn't changed, the second response produces objects with
 * different identities, and Angular must tear down the entire DOM and rebuild it (as if all old
 * elements were deleted and all new elements inserted).
 *
 * To avoid this expensive operation, you can customize the default tracking algorithm.
 * by supplying the `trackBy` option to `NgForOf`.
 * `trackBy` takes a function that has two arguments: `index` and `item`.
 * If `trackBy` is given, Angular tracks changes by the return value of the function.
 *
 * @see [Structural Directives](guide/directives/structural-directives)
 * @ngModule CommonModule
 * @publicApi
 */
declare class NgForOf<T, U extends NgIterable<T> = NgIterable<T>> implements DoCheck {
    private _viewContainer;
    private _template;
    private _differs;
    /**
     * The value of the iterable expression, which can be used as a
     * [template input variable](guide/directives/structural-directives#shorthand).
     */
    set ngForOf(ngForOf: (U & NgIterable<T>) | undefined | null);
    /**
     * Specifies a custom `TrackByFunction` to compute the identity of items in an iterable.
     *
     * If a custom `TrackByFunction` is not provided, `NgForOf` will use the item's [object
     * identity](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)
     * as the key.
     *
     * `NgForOf` uses the computed key to associate items in an iterable with DOM elements
     * it produces for these items.
     *
     * A custom `TrackByFunction` is useful to provide good user experience in cases when items in an
     * iterable rendered using `NgForOf` have a natural identifier (for example, custom ID or a
     * primary key), and this iterable could be updated with new object instances that still
     * represent the same underlying entity (for example, when data is re-fetched from the server,
     * and the iterable is recreated and re-rendered, but most of the data is still the same).
     *
     * @see {@link TrackByFunction}
     */
    set ngForTrackBy(fn: TrackByFunction<T>);
    get ngForTrackBy(): TrackByFunction<T>;
    private _ngForOf;
    private _ngForOfDirty;
    private _differ;
    private _trackByFn;
    constructor(_viewContainer: ViewContainerRef, _template: TemplateRef<NgForOfContext<T, U>>, _differs: IterableDiffers);
    /**
     * A reference to the template that is stamped out for each item in the iterable.
     * @see [template reference variable](guide/templates/variables#template-reference-variables)
     */
    set ngForTemplate(value: TemplateRef<NgForOfContext<T, U>>);
    /**
     * Applies the changes when needed.
     * @docs-private
     */
    ngDoCheck(): void;
    private _applyChanges;
    /**
     * Asserts the correct type of the context for the template that `NgForOf` will render.
     *
     * The presence of this method is a signal to the Ivy template type-check compiler that the
     * `NgForOf` structural directive renders its template with a specific context type.
     */
    static ngTemplateContextGuard<T, U extends NgIterable<T>>(dir: NgForOf<T, U>, ctx: any): ctx is NgForOfContext<T, U>;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgForOf<any, any>, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgForOf<any, any>, "[ngFor][ngForOf]", never, { "ngForOf": { "alias": "ngForOf"; "required": false; }; "ngForTrackBy": { "alias": "ngForTrackBy"; "required": false; }; "ngForTemplate": { "alias": "ngForTemplate"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * A structural directive that conditionally includes a template based on the value of
 * an expression coerced to Boolean.
 * When the expression evaluates to true, Angular renders the template
 * provided in a `then` clause, and when  false or null,
 * Angular renders the template provided in an optional `else` clause. The default
 * template for the `else` clause is blank.
 *
 * A [shorthand form](guide/directives/structural-directives#asterisk) of the directive,
 * `*ngIf="condition"`, is generally used, provided
 * as an attribute of the anchor element for the inserted template.
 * Angular expands this into a more explicit version, in which the anchor element
 * is contained in an `<ng-template>` element.
 *
 * Simple form with shorthand syntax:
 *
 * ```html
 * <div *ngIf="condition">Content to render when condition is true.</div>
 * ```
 *
 * Simple form with expanded syntax:
 *
 * ```html
 * <ng-template [ngIf]="condition"><div>Content to render when condition is
 * true.</div></ng-template>
 * ```
 *
 * Form with an "else" block:
 *
 * ```html
 * <div *ngIf="condition; else elseBlock">Content to render when condition is true.</div>
 * <ng-template #elseBlock>Content to render when condition is false.</ng-template>
 * ```
 *
 * Shorthand form with "then" and "else" blocks:
 *
 * ```html
 * <div *ngIf="condition; then thenBlock else elseBlock"></div>
 * <ng-template #thenBlock>Content to render when condition is true.</ng-template>
 * <ng-template #elseBlock>Content to render when condition is false.</ng-template>
 * ```
 *
 * Form with storing the value locally:
 *
 * ```html
 * <div *ngIf="condition as value; else elseBlock">{{value}}</div>
 * <ng-template #elseBlock>Content to render when value is null.</ng-template>
 * ```
 *
 * @usageNotes
 *
 * The `*ngIf` directive is most commonly used to conditionally show an inline template,
 * as seen in the following  example.
 * The default `else` template is blank.
 *
 * {@example common/ngIf/ts/module.ts region='NgIfSimple'}
 *
 * ### Showing an alternative template using `else`
 *
 * To display a template when `expression` evaluates to false, use an `else` template
 * binding as shown in the following example.
 * The `else` binding points to an `<ng-template>`  element labeled `#elseBlock`.
 * The template can be defined anywhere in the component view, but is typically placed right after
 * `ngIf` for readability.
 *
 * {@example common/ngIf/ts/module.ts region='NgIfElse'}
 *
 * ### Using an external `then` template
 *
 * In the previous example, the then-clause template is specified inline, as the content of the
 * tag that contains the `ngIf` directive. You can also specify a template that is defined
 * externally, by referencing a labeled `<ng-template>` element. When you do this, you can
 * change which template to use at runtime, as shown in the following example.
 *
 * {@example common/ngIf/ts/module.ts region='NgIfThenElse'}
 *
 * ### Storing a conditional result in a variable
 *
 * You might want to show a set of properties from the same object. If you are waiting
 * for asynchronous data, the object can be undefined.
 * In this case, you can use `ngIf` and store the result of the condition in a local
 * variable as shown in the following example.
 *
 * {@example common/ngIf/ts/module.ts region='NgIfAs'}
 *
 * This code uses only one `AsyncPipe`, so only one subscription is created.
 * The conditional statement stores the result of `userStream|async` in the local variable `user`.
 * You can then bind the local `user` repeatedly.
 *
 * The conditional displays the data only if `userStream` returns a value,
 * so you don't need to use the
 * safe-navigation-operator (`?.`)
 * to guard against null values when accessing properties.
 * You can display an alternative template while waiting for the data.
 *
 * ### Shorthand syntax
 *
 * The shorthand syntax `*ngIf` expands into two separate template specifications
 * for the "then" and "else" clauses. For example, consider the following shorthand statement,
 * that is meant to show a loading page while waiting for data to be loaded.
 *
 * ```html
 * <div class="hero-list" *ngIf="heroes else loading">
 *  ...
 * </div>
 *
 * <ng-template #loading>
 *  <div>Loading...</div>
 * </ng-template>
 * ```
 *
 * You can see that the "else" clause references the `<ng-template>`
 * with the `#loading` label, and the template for the "then" clause
 * is provided as the content of the anchor element.
 *
 * However, when Angular expands the shorthand syntax, it creates
 * another `<ng-template>` tag, with `ngIf` and `ngIfElse` directives.
 * The anchor element containing the template for the "then" clause becomes
 * the content of this unlabeled `<ng-template>` tag.
 *
 * ```html
 * <ng-template [ngIf]="heroes" [ngIfElse]="loading">
 *  <div class="hero-list">
 *   ...
 *  </div>
 * </ng-template>
 *
 * <ng-template #loading>
 *  <div>Loading...</div>
 * </ng-template>
 * ```
 *
 * The presence of the implicit template object has implications for the nesting of
 * structural directives. For more on this subject, see
 * [Structural Directives](guide/directives/structural-directives#one-per-element).
 *
 * @ngModule CommonModule
 * @publicApi
 */
declare class NgIf<T = unknown> {
    private _viewContainer;
    private _context;
    private _thenTemplateRef;
    private _elseTemplateRef;
    private _thenViewRef;
    private _elseViewRef;
    constructor(_viewContainer: ViewContainerRef, templateRef: TemplateRef<NgIfContext<T>>);
    /**
     * The Boolean expression to evaluate as the condition for showing a template.
     */
    set ngIf(condition: T);
    /**
     * A template to show if the condition expression evaluates to true.
     */
    set ngIfThen(templateRef: TemplateRef<NgIfContext<T>> | null);
    /**
     * A template to show if the condition expression evaluates to false.
     */
    set ngIfElse(templateRef: TemplateRef<NgIfContext<T>> | null);
    private _updateView;
    /**
     * Assert the correct type of the expression bound to the `ngIf` input within the template.
     *
     * The presence of this static field is a signal to the Ivy template type check compiler that
     * when the `NgIf` structural directive renders its template, the type of the expression bound
     * to `ngIf` should be narrowed in some way. For `NgIf`, the binding expression itself is used to
     * narrow its type, which allows the strictNullChecks feature of TypeScript to work with `NgIf`.
     */
    static ngTemplateGuard_ngIf: 'binding';
    /**
     * Asserts the correct type of the context for the template that `NgIf` will render.
     *
     * The presence of this method is a signal to the Ivy template type-check compiler that the
     * `NgIf` structural directive renders its template with a specific context type.
     */
    static ngTemplateContextGuard<T>(dir: NgIf<T>, ctx: any): ctx is NgIfContext<Exclude<T, false | 0 | '' | null | undefined>>;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgIf<any>, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgIf<any>, "[ngIf]", never, { "ngIf": { "alias": "ngIf"; "required": false; }; "ngIfThen": { "alias": "ngIfThen"; "required": false; }; "ngIfElse": { "alias": "ngIfElse"; "required": false; }; }, {}, never, never, true, never>;
}
/**
 * @publicApi
 */
declare class NgIfContext<T = unknown> {
    $implicit: T;
    ngIf: T;
}

/**
 * @ngModule CommonModule
 *
 * @description
 *
 * Inserts an embedded view from a prepared `TemplateRef`.
 *
 * You can attach a context object to the `EmbeddedViewRef` by setting `[ngTemplateOutletContext]`.
 * `[ngTemplateOutletContext]` should be an object, the object's keys will be available for binding
 * by the local template `let` declarations.
 *
 * @usageNotes
 * ```html
 * <ng-container *ngTemplateOutlet="templateRefExp; context: contextExp"></ng-container>
 * ```
 *
 * Using the key `$implicit` in the context object will set its value as default.
 *
 * ### Example
 *
 * {@example common/ngTemplateOutlet/ts/module.ts region='NgTemplateOutlet'}
 *
 * @publicApi
 */
declare class NgTemplateOutlet<C = unknown> implements OnChanges {
    private _viewContainerRef;
    private _viewRef;
    /**
     * A context object to attach to the {@link EmbeddedViewRef}. This should be an
     * object, the object's keys will be available for binding by the local template `let`
     * declarations.
     * Using the key `$implicit` in the context object will set its value as default.
     */
    ngTemplateOutletContext: C | null;
    /**
     * A string defining the template reference and optionally the context object for the template.
     */
    ngTemplateOutlet: TemplateRef<C> | null;
    /** Injector to be used within the embedded view. */
    ngTemplateOutletInjector: Injector | null;
    constructor(_viewContainerRef: ViewContainerRef);
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * We need to re-create existing embedded view if either is true:
     * - the outlet changed.
     * - the injector changed.
     */
    private _shouldRecreateView;
    /**
     * For a given outlet instance, we create a proxy object that delegates
     * to the user-specified context. This allows changing, or swapping out
     * the context object completely without having to destroy/re-create the view.
     */
    private _createContextForwardProxy;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgTemplateOutlet<any>, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgTemplateOutlet<any>, "[ngTemplateOutlet]", never, { "ngTemplateOutletContext": { "alias": "ngTemplateOutletContext"; "required": false; }; "ngTemplateOutlet": { "alias": "ngTemplateOutlet"; "required": false; }; "ngTemplateOutletInjector": { "alias": "ngTemplateOutletInjector"; "required": false; }; }, {}, never, never, true, never>;
}

/**
 * @ngModule CommonModule
 *
 * @usageNotes
 *
 * Set the width of the containing element to a pixel value returned by an expression.
 *
 * ```html
 * <some-element [ngStyle]="{'max-width.px': widthExp}">...</some-element>
 * ```
 *
 * Set a collection of style values using an expression that returns key-value pairs.
 *
 * ```html
 * <some-element [ngStyle]="objExp">...</some-element>
 * ```
 *
 * For more simple use cases you can use the [style bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly.
 * It doesn't require importing a directive.
 *
 * Set the font of the containing element to the result of an expression.
 *
 * ```html
 * <some-element [style]="{'font-style': styleExp}">...</some-element>
 * ```
 *
 * @description
 *
 * An attribute directive that updates styles for the containing HTML element.
 * Sets one or more style properties, specified as colon-separated key-value pairs.
 * The key is a style name, with an optional `.<unit>` suffix
 * (such as 'top.px', 'font-style.em').
 * The value is an expression to be evaluated.
 * The resulting non-null value, expressed in the given unit,
 * is assigned to the given style property.
 * If the result of evaluation is null, the corresponding style is removed.
 *
 * @see [Style bindings](/guide/templates/binding#css-class-and-style-property-bindings)
 *
 * @publicApi
 */
declare class NgStyle implements DoCheck {
    private _ngEl;
    private _differs;
    private _renderer;
    private _ngStyle;
    private _differ;
    constructor(_ngEl: ElementRef, _differs: KeyValueDiffers, _renderer: Renderer2);
    set ngStyle(values: {
        [klass: string]: any;
    } | null | undefined);
    ngDoCheck(): void;
    private _setStyle;
    private _applyChanges;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgStyle, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgStyle, "[ngStyle]", never, { "ngStyle": { "alias": "ngStyle"; "required": false; }; }, {}, never, never, true, never>;
}

declare class SwitchView {
    private _viewContainerRef;
    private _templateRef;
    private _created;
    constructor(_viewContainerRef: ViewContainerRef, _templateRef: TemplateRef<Object>);
    create(): void;
    destroy(): void;
    enforceState(created: boolean): void;
}
/**
 * @ngModule CommonModule
 *
 * @description
 * The `[ngSwitch]` directive on a container specifies an expression to match against.
 * The expressions to match are provided by `ngSwitchCase` directives on views within the container.
 * - Every view that matches is rendered.
 * - If there are no matches, a view with the `ngSwitchDefault` directive is rendered.
 * - Elements within the `[NgSwitch]` statement but outside of any `NgSwitchCase`
 * or `ngSwitchDefault` directive are preserved at the location.
 *
 * @usageNotes
 * Define a container element for the directive, and specify the switch expression
 * to match against as an attribute:
 *
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 * ```
 *
 * Within the container, `*ngSwitchCase` statements specify the match expressions
 * as attributes. Include `*ngSwitchDefault` as the final case.
 *
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 *    <some-element *ngSwitchCase="match_expression_1">...</some-element>
 * ...
 *    <some-element *ngSwitchDefault>...</some-element>
 * </container-element>
 * ```
 *
 * ### Usage Examples
 *
 * The following example shows how to use more than one case to display the same view:
 *
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 *   <!-- the same view can be shown in more than one case -->
 *   <some-element *ngSwitchCase="match_expression_1">...</some-element>
 *   <some-element *ngSwitchCase="match_expression_2">...</some-element>
 *   <some-other-element *ngSwitchCase="match_expression_3">...</some-other-element>
 *   <!--default case when there are no matches -->
 *   <some-element *ngSwitchDefault>...</some-element>
 * </container-element>
 * ```
 *
 * The following example shows how cases can be nested:
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 *       <some-element *ngSwitchCase="match_expression_1">...</some-element>
 *       <some-element *ngSwitchCase="match_expression_2">...</some-element>
 *       <some-other-element *ngSwitchCase="match_expression_3">...</some-other-element>
 *       <ng-container *ngSwitchCase="match_expression_3">
 *         <!-- use a ng-container to group multiple root nodes -->
 *         <inner-element></inner-element>
 *         <inner-other-element></inner-other-element>
 *       </ng-container>
 *       <some-element *ngSwitchDefault>...</some-element>
 *     </container-element>
 * ```
 *
 * @publicApi
 * @see {@link NgSwitchCase}
 * @see {@link NgSwitchDefault}
 * @see [Structural Directives](guide/directives/structural-directives)
 *
 */
declare class NgSwitch {
    private _defaultViews;
    private _defaultUsed;
    private _caseCount;
    private _lastCaseCheckIndex;
    private _lastCasesMatched;
    private _ngSwitch;
    set ngSwitch(newValue: any);
    private _updateDefaultCases;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgSwitch, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgSwitch, "[ngSwitch]", never, { "ngSwitch": { "alias": "ngSwitch"; "required": false; }; }, {}, never, never, true, never>;
}
/**
 * @ngModule CommonModule
 *
 * @description
 * Provides a switch case expression to match against an enclosing `ngSwitch` expression.
 * When the expressions match, the given `NgSwitchCase` template is rendered.
 * If multiple match expressions match the switch expression value, all of them are displayed.
 *
 * @usageNotes
 *
 * Within a switch container, `*ngSwitchCase` statements specify the match expressions
 * as attributes. Include `*ngSwitchDefault` as the final case.
 *
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 *   <some-element *ngSwitchCase="match_expression_1">...</some-element>
 *   ...
 *   <some-element *ngSwitchDefault>...</some-element>
 * </container-element>
 * ```
 *
 * Each switch-case statement contains an in-line HTML template or template reference
 * that defines the subtree to be selected if the value of the match expression
 * matches the value of the switch expression.
 *
 * As of Angular v17 the NgSwitch directive uses strict equality comparison (`===`) instead of
 * loose equality (`==`) to match different cases.
 *
 * @publicApi
 * @see {@link NgSwitch}
 * @see {@link NgSwitchDefault}
 *
 */
declare class NgSwitchCase implements DoCheck {
    private ngSwitch;
    private _view;
    /**
     * Stores the HTML template to be selected on match.
     */
    ngSwitchCase: any;
    constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef<Object>, ngSwitch: NgSwitch);
    /**
     * Performs case matching. For internal use only.
     * @docs-private
     */
    ngDoCheck(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgSwitchCase, [null, null, { optional: true; host: true; }]>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgSwitchCase, "[ngSwitchCase]", never, { "ngSwitchCase": { "alias": "ngSwitchCase"; "required": false; }; }, {}, never, never, true, never>;
}
/**
 * @ngModule CommonModule
 *
 * @description
 *
 * Creates a view that is rendered when no `NgSwitchCase` expressions
 * match the `NgSwitch` expression.
 * This statement should be the final case in an `NgSwitch`.
 *
 * @publicApi
 * @see {@link NgSwitch}
 * @see {@link NgSwitchCase}
 *
 */
declare class NgSwitchDefault {
    constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef<Object>, ngSwitch: NgSwitch);
    static ɵfac: i0.ɵɵFactoryDeclaration<NgSwitchDefault, [null, null, { optional: true; host: true; }]>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgSwitchDefault, "[ngSwitchDefault]", never, {}, {}, never, never, true, never>;
}

/**
 * @ngModule CommonModule
 *
 * @usageNotes
 * ```html
 * <some-element [ngPlural]="value">
 *   <ng-template ngPluralCase="=0">there is nothing</ng-template>
 *   <ng-template ngPluralCase="=1">there is one</ng-template>
 *   <ng-template ngPluralCase="few">there are a few</ng-template>
 * </some-element>
 * ```
 *
 * @description
 *
 * Adds / removes DOM sub-trees based on a numeric value. Tailored for pluralization.
 *
 * Displays DOM sub-trees that match the switch expression value, or failing that, DOM sub-trees
 * that match the switch expression's pluralization category.
 *
 * To use this directive you must provide a container element that sets the `[ngPlural]` attribute
 * to a switch expression. Inner elements with a `[ngPluralCase]` will display based on their
 * expression:
 * - if `[ngPluralCase]` is set to a value starting with `=`, it will only display if the value
 *   matches the switch expression exactly,
 * - otherwise, the view will be treated as a "category match", and will only display if exact
 *   value matches aren't found and the value maps to its category for the defined locale.
 *
 * See http://cldr.unicode.org/index/cldr-spec/plural-rules
 *
 * @publicApi
 */
declare class NgPlural {
    private _localization;
    private _activeView?;
    private _caseViews;
    constructor(_localization: NgLocalization);
    set ngPlural(value: number);
    addCase(value: string, switchView: SwitchView): void;
    private _updateView;
    private _clearViews;
    private _activateView;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgPlural, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgPlural, "[ngPlural]", never, { "ngPlural": { "alias": "ngPlural"; "required": false; }; }, {}, never, never, true, never>;
}
/**
 * @ngModule CommonModule
 *
 * @description
 *
 * Creates a view that will be added/removed from the parent {@link NgPlural} when the
 * given expression matches the plural expression according to CLDR rules.
 *
 * @usageNotes
 * ```html
 * <some-element [ngPlural]="value">
 *   <ng-template ngPluralCase="=0">...</ng-template>
 *   <ng-template ngPluralCase="other">...</ng-template>
 * </some-element>
 *```
 *
 * See {@link NgPlural} for more details and example.
 *
 * @publicApi
 */
declare class NgPluralCase {
    value: string;
    constructor(value: string, template: TemplateRef<Object>, viewContainer: ViewContainerRef, ngPlural: NgPlural);
    static ɵfac: i0.ɵɵFactoryDeclaration<NgPluralCase, [{ attribute: "ngPluralCase"; }, null, null, { host: true; }]>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgPluralCase, "[ngPluralCase]", never, {}, {}, never, never, true, never>;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Unwraps a value from an asynchronous primitive.
 *
 * The `async` pipe subscribes to an `Observable` or `Promise` and returns the latest value it has
 * emitted. When a new value is emitted, the `async` pipe marks the component to be checked for
 * changes. When the component gets destroyed, the `async` pipe unsubscribes automatically to avoid
 * potential memory leaks. When the reference of the expression changes, the `async` pipe
 * automatically unsubscribes from the old `Observable` or `Promise` and subscribes to the new one.
 *
 * @usageNotes
 *
 * ### Examples
 *
 * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the
 * promise.
 *
 * {@example common/pipes/ts/async_pipe.ts region='AsyncPipePromise'}
 *
 * It's also possible to use `async` with Observables. The example below binds the `time` Observable
 * to the view. The Observable continuously updates the view with the current time.
 *
 * {@example common/pipes/ts/async_pipe.ts region='AsyncPipeObservable'}
 *
 * @publicApi
 */
declare class AsyncPipe implements OnDestroy, PipeTransform {
    private _ref;
    private _latestValue;
    private markForCheckOnValueUpdate;
    private _subscription;
    private _obj;
    private _strategy;
    constructor(ref: ChangeDetectorRef);
    ngOnDestroy(): void;
    transform<T>(obj: Observable<T> | Subscribable<T> | Promise<T>): T | null;
    transform<T>(obj: null | undefined): null;
    transform<T>(obj: Observable<T> | Subscribable<T> | Promise<T> | null | undefined): T | null;
    private _subscribe;
    private _selectStrategy;
    private _dispose;
    private _updateLatestValue;
    static ɵfac: i0.ɵɵFactoryDeclaration<AsyncPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<AsyncPipe, "async", true>;
}

/**
 * Transforms text to all lower case.
 *
 * @see {@link UpperCasePipe}
 * @see {@link TitleCasePipe}
 * @usageNotes
 *
 * The following example defines a view that allows the user to enter
 * text, and then uses the pipe to convert the input text to all lower case.
 *
 * {@example common/pipes/ts/lowerupper_pipe.ts region='LowerUpperPipe'}
 *
 * @ngModule CommonModule
 * @publicApi
 */
declare class LowerCasePipe implements PipeTransform {
    /**
     * @param value The string to transform to lower case.
     */
    transform(value: string): string;
    transform(value: null | undefined): null;
    transform(value: string | null | undefined): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<LowerCasePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<LowerCasePipe, "lowercase", true>;
}
/**
 * Transforms text to title case.
 * Capitalizes the first letter of each word and transforms the
 * rest of the word to lower case.
 * Words are delimited by any whitespace character, such as a space, tab, or line-feed character.
 *
 * @see {@link LowerCasePipe}
 * @see {@link UpperCasePipe}
 *
 * @usageNotes
 * The following example shows the result of transforming various strings into title case.
 *
 * {@example common/pipes/ts/titlecase_pipe.ts region='TitleCasePipe'}
 *
 * @ngModule CommonModule
 * @publicApi
 */
declare class TitleCasePipe implements PipeTransform {
    /**
     * @param value The string to transform to title case.
     */
    transform(value: string): string;
    transform(value: null | undefined): null;
    transform(value: string | null | undefined): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<TitleCasePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<TitleCasePipe, "titlecase", true>;
}
/**
 * Transforms text to all upper case.
 * @see {@link LowerCasePipe}
 * @see {@link TitleCasePipe}
 *
 * @ngModule CommonModule
 * @publicApi
 */
declare class UpperCasePipe implements PipeTransform {
    /**
     * @param value The string to transform to upper case.
     */
    transform(value: string): string;
    transform(value: null | undefined): null;
    transform(value: string | null | undefined): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<UpperCasePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<UpperCasePipe, "uppercase", true>;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Converts a value into its JSON-format representation.  Useful for debugging.
 *
 * @usageNotes
 *
 * The following component uses a JSON pipe to convert an object
 * to JSON format, and displays the string in both formats for comparison.
 *
 * {@example common/pipes/ts/json_pipe.ts region='JsonPipe'}
 *
 * @publicApi
 */
declare class JsonPipe implements PipeTransform {
    /**
     * @param value A value of any type to convert into a JSON-format string.
     */
    transform(value: any): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<JsonPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<JsonPipe, "json", true>;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Creates a new `Array` or `String` containing a subset (slice) of the elements.
 *
 * @usageNotes
 *
 * All behavior is based on the expected behavior of the JavaScript API `Array.prototype.slice()`
 * and `String.prototype.slice()`.
 *
 * When operating on an `Array`, the returned `Array` is always a copy even when all
 * the elements are being returned.
 *
 * When operating on a blank value, the pipe returns the blank value.
 *
 * ### List Example
 *
 * This `ngFor` example:
 *
 * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_list'}
 *
 * produces the following:
 *
 * ```html
 * <li>b</li>
 * <li>c</li>
 * ```
 *
 * ### String Examples
 *
 * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_string'}
 *
 * @publicApi
 */
declare class SlicePipe implements PipeTransform {
    /**
     * @param value a list or a string to be sliced.
     * @param start the starting index of the subset to return:
     *   - **a positive integer**: return the item at `start` index and all items after
     *     in the list or string expression.
     *   - **a negative integer**: return the item at `start` index from the end and all items after
     *     in the list or string expression.
     *   - **if positive and greater than the size of the expression**: return an empty list or
     * string.
     *   - **if negative and greater than the size of the expression**: return entire list or string.
     * @param end the ending index of the subset to return:
     *   - **omitted**: return all items until the end.
     *   - **if positive**: return all items before `end` index of the list or string.
     *   - **if negative**: return all items before `end` index from the end of the list or string.
     */
    transform<T>(value: ReadonlyArray<T>, start: number, end?: number): Array<T>;
    transform(value: null | undefined, start: number, end?: number): null;
    transform<T>(value: ReadonlyArray<T> | null | undefined, start: number, end?: number): Array<T> | null;
    transform(value: string, start: number, end?: number): string;
    transform(value: string | null | undefined, start: number, end?: number): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<SlicePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<SlicePipe, "slice", true>;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a value according to digit options and locale rules.
 * Locale determines group sizing and separator,
 * decimal point character, and other locale-specific configurations.
 *
 * @see {@link formatNumber}
 *
 * @usageNotes
 *
 * ### digitsInfo
 *
 * The value's decimal representation is specified by the `digitsInfo`
 * parameter, written in the following format:<br>
 *
 * ```
 * {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}
 * ```
 *
 *  - `minIntegerDigits`:
 * The minimum number of integer digits before the decimal point.
 * Default is 1.
 *
 * - `minFractionDigits`:
 * The minimum number of digits after the decimal point.
 * Default is 0.
 *
 *  - `maxFractionDigits`:
 * The maximum number of digits after the decimal point.
 * Default is 3.
 *
 * If the formatted value is truncated it will be rounded using the "to-nearest" method:
 *
 * ```
 * {{3.6 | number: '1.0-0'}}
 * <!--will output '4'-->
 *
 * {{-3.6 | number:'1.0-0'}}
 * <!--will output '-4'-->
 * ```
 *
 * ### locale
 *
 * `locale` will format a value according to locale rules.
 * Locale determines group sizing and separator,
 * decimal point character, and other locale-specific configurations.
 *
 * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.
 *
 * See [Setting your app locale](guide/i18n/locale-id).
 *
 * ### Example
 *
 * The following code shows how the pipe transforms values
 * according to various format specifications,
 * where the caller's default locale is `en-US`.
 *
 * {@example common/pipes/ts/number_pipe.ts region='NumberPipe'}
 *
 * @publicApi
 */
declare class DecimalPipe implements PipeTransform {
    private _locale;
    constructor(_locale: string);
    /**
     * @param value The value to be formatted.
     * @param digitsInfo Sets digit and decimal representation.
     * [See more](#digitsinfo).
     * @param locale Specifies what locale format rules to use.
     * [See more](#locale).
     */
    transform(value: number | string, digitsInfo?: string, locale?: string): string | null;
    transform(value: null | undefined, digitsInfo?: string, locale?: string): null;
    transform(value: number | string | null | undefined, digitsInfo?: string, locale?: string): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<DecimalPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<DecimalPipe, "number", true>;
}
/**
 * @ngModule CommonModule
 * @description
 *
 * Transforms a number to a percentage
 * string, formatted according to locale rules that determine group sizing and
 * separator, decimal-point character, and other locale-specific
 * configurations.
 *
 * @see {@link formatPercent}
 *
 * @usageNotes
 * The following code shows how the pipe transforms numbers
 * into text strings, according to various format specifications,
 * where the caller's default locale is `en-US`.
 *
 * {@example common/pipes/ts/percent_pipe.ts region='PercentPipe'}
 *
 * @publicApi
 */
declare class PercentPipe implements PipeTransform {
    private _locale;
    constructor(_locale: string);
    transform(value: number | string, digitsInfo?: string, locale?: string): string | null;
    transform(value: null | undefined, digitsInfo?: string, locale?: string): null;
    transform(value: number | string | null | undefined, digitsInfo?: string, locale?: string): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<PercentPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<PercentPipe, "percent", true>;
}
/**
 * @ngModule CommonModule
 * @description
 *
 * Transforms a number to a currency string, formatted according to locale rules
 * that determine group sizing and separator, decimal-point character,
 * and other locale-specific configurations.
 *
 *
 * @see {@link getCurrencySymbol}
 * @see {@link formatCurrency}
 *
 * @usageNotes
 * The following code shows how the pipe transforms numbers
 * into text strings, according to various format specifications,
 * where the caller's default locale is `en-US`.
 *
 * {@example common/pipes/ts/currency_pipe.ts region='CurrencyPipe'}
 *
 * @publicApi
 */
declare class CurrencyPipe implements PipeTransform {
    private _locale;
    private _defaultCurrencyCode;
    constructor(_locale: string, _defaultCurrencyCode?: string);
    /**
     *
     * @param value The number to be formatted as currency.
     * @param currencyCode The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code,
     * such as `USD` for the US dollar and `EUR` for the euro. The default currency code can be
     * configured using the `DEFAULT_CURRENCY_CODE` injection token.
     * @param display The format for the currency indicator. One of the following:
     *   - `code`: Show the code (such as `USD`).
     *   - `symbol`(default): Show the symbol (such as `$`).
     *   - `symbol-narrow`: Use the narrow symbol for locales that have two symbols for their
     * currency.
     * For example, the Canadian dollar CAD has the symbol `CA$` and the symbol-narrow `$`. If the
     * locale has no narrow symbol, uses the standard symbol for the locale.
     *   - String: Use the given string value instead of a code or a symbol.
     * For example, an empty string will suppress the currency & symbol.
     *   - Boolean (marked deprecated in v5): `true` for symbol and false for `code`.
     *
     * @param digitsInfo Decimal representation options, specified by a string
     * in the following format:<br>
     * <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>.
     *   - `minIntegerDigits`: The minimum number of integer digits before the decimal point.
     * Default is `1`.
     *   - `minFractionDigits`: The minimum number of digits after the decimal point.
     * Default is `2`.
     *   - `maxFractionDigits`: The maximum number of digits after the decimal point.
     * Default is `2`.
     * If not provided, the number will be formatted with the proper amount of digits,
     * depending on what the [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) specifies.
     * For example, the Canadian dollar has 2 digits, whereas the Chilean peso has none.
     * @param locale A locale code for the locale format rules to use.
     * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.
     * See [Setting your app locale](guide/i18n/locale-id).
     */
    transform(value: number | string, currencyCode?: string, display?: 'code' | 'symbol' | 'symbol-narrow' | string | boolean, digitsInfo?: string, locale?: string): string | null;
    transform(value: null | undefined, currencyCode?: string, display?: 'code' | 'symbol' | 'symbol-narrow' | string | boolean, digitsInfo?: string, locale?: string): null;
    transform(value: number | string | null | undefined, currencyCode?: string, display?: 'code' | 'symbol' | 'symbol-narrow' | string | boolean, digitsInfo?: string, locale?: string): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<CurrencyPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<CurrencyPipe, "currency", true>;
}

/**
 * An interface that describes the date pipe configuration, which can be provided using the
 * `DATE_PIPE_DEFAULT_OPTIONS` token.
 *
 * @see {@link DATE_PIPE_DEFAULT_OPTIONS}
 *
 * @publicApi
 */
interface DatePipeConfig {
    dateFormat?: string;
    timezone?: string;
}

/**
 * Optionally-provided default timezone to use for all instances of `DatePipe` (such as `'+0430'`).
 * If the value isn't provided, the `DatePipe` will use the end-user's local system timezone.
 *
 * @deprecated use DATE_PIPE_DEFAULT_OPTIONS token to configure DatePipe
 */
declare const DATE_PIPE_DEFAULT_TIMEZONE: InjectionToken<string>;
/**
 * DI token that allows to provide default configuration for the `DatePipe` instances in an
 * application. The value is an object which can include the following fields:
 * - `dateFormat`: configures the default date format. If not provided, the `DatePipe`
 * will use the 'mediumDate' as a value.
 * - `timezone`: configures the default timezone. If not provided, the `DatePipe` will
 * use the end-user's local system timezone.
 *
 * @see {@link DatePipeConfig}
 *
 * @usageNotes
 *
 * Various date pipe default values can be overwritten by providing this token with
 * the value that has this interface.
 *
 * For example:
 *
 * Override the default date format by providing a value using the token:
 * ```ts
 * providers: [
 *   {provide: DATE_PIPE_DEFAULT_OPTIONS, useValue: {dateFormat: 'shortDate'}}
 * ]
 * ```
 *
 * Override the default timezone by providing a value using the token:
 * ```ts
 * providers: [
 *   {provide: DATE_PIPE_DEFAULT_OPTIONS, useValue: {timezone: '-1200'}}
 * ]
 * ```
 */
declare const DATE_PIPE_DEFAULT_OPTIONS: InjectionToken<DatePipeConfig>;
/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a date value according to locale rules.
 *
 * `DatePipe` is executed only when it detects a pure change to the input value.
 * A pure change is either a change to a primitive input value
 * (such as `String`, `Number`, `Boolean`, or `Symbol`),
 * or a changed object reference (such as `Date`, `Array`, `Function`, or `Object`).
 *
 * Note that mutating a `Date` object does not cause the pipe to be rendered again.
 * To ensure that the pipe is executed, you must create a new `Date` object.
 *
 * Only the `en-US` locale data comes with Angular. To localize dates
 * in another language, you must import the corresponding locale data.
 * See the [I18n guide](guide/i18n/format-data-locale) for more information.
 *
 * The time zone of the formatted value can be specified either by passing it in as the second
 * parameter of the pipe, or by setting the default through the `DATE_PIPE_DEFAULT_OPTIONS`
 * injection token. The value that is passed in as the second parameter takes precedence over
 * the one defined using the injection token.
 *
 * @see {@link formatDate}
 *
 *
 * @usageNotes
 *
 * The result of this pipe is not reevaluated when the input is mutated. To avoid the need to
 * reformat the date on every change-detection cycle, treat the date as an immutable object
 * and change the reference when the pipe needs to run again.
 *
 * ### Pre-defined format options
 *
 * | Option        | Equivalent to                       | Examples (given in `en-US` locale)              |
 * |---------------|-------------------------------------|-------------------------------------------------|
 * | `'short'`     | `'M/d/yy, h:mm a'`                  | `6/15/15, 9:03 AM`                              |
 * | `'medium'`    | `'MMM d, y, h:mm:ss a'`             | `Jun 15, 2015, 9:03:01 AM`                      |
 * | `'long'`      | `'MMMM d, y, h:mm:ss a z'`          | `June 15, 2015 at 9:03:01 AM GMT+1`             |
 * | `'full'`      | `'EEEE, MMMM d, y, h:mm:ss a zzzz'` | `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00` |
 * | `'shortDate'` | `'M/d/yy'`S                          | `6/15/15`                                       |
 * | `'mediumDate'`| `'MMM d, y'`                        | `Jun 15, 2015`                                  |
 * | `'longDate'`  | `'MMMM d, y'`                       | `June 15, 2015`                                 |
 * | `'fullDate'`  | `'EEEE, MMMM d, y'`                 | `Monday, June 15, 2015`                         |
 * | `'shortTime'` | `'h:mm a'`                          | `9:03 AM`                                       |
 * | `'mediumTime'`| `'h:mm:ss a'`                       | `9:03:01 AM`                                    |
 * | `'longTime'`  | `'h:mm:ss a z'`                     | `9:03:01 AM GMT+1`                              |
 * | `'fullTime'`  | `'h:mm:ss a zzzz'`                  | `9:03:01 AM GMT+01:00`                          |
 *
 * ### Custom format options
 *
 * You can construct a format string using symbols to specify the components
 * of a date-time value, as described in the following table.
 * Format details depend on the locale.
 * Fields marked with (*) are only available in the extra data set for the given locale.
 *
 *  | Field type              | Format      | Description                                                   | Example Value                                              |
 *  |-------------------------|-------------|---------------------------------------------------------------|------------------------------------------------------------|
 *  | Era                     | G, GG & GGG | Abbreviated                                                   | AD                                                         |
 *  |                         | GGGG        | Wide                                                          | Anno Domini                                                |
 *  |                         | GGGGG       | Narrow                                                        | A                                                          |
 *  | Year                    | y           | Numeric: minimum digits                                       | 2, 20, 201, 2017, 20173                                    |
 *  |                         | yy          | Numeric: 2 digits + zero padded                               | 02, 20, 01, 17, 73                                         |
 *  |                         | yyy         | Numeric: 3 digits + zero padded                               | 002, 020, 201, 2017, 20173                                 |
 *  |                         | yyyy        | Numeric: 4 digits or more + zero padded                       | 0002, 0020, 0201, 2017, 20173                              |
 *  | ISO Week-numbering year | Y           | Numeric: minimum digits                                       | 2, 20, 201, 2017, 20173                                    |
 *  |                         | YY          | Numeric: 2 digits + zero padded                               | 02, 20, 01, 17, 73                                         |
 *  |                         | YYY         | Numeric: 3 digits + zero padded                               | 002, 020, 201, 2017, 20173                                 |
 *  |                         | YYYY        | Numeric: 4 digits or more + zero padded                       | 0002, 0020, 0201, 2017, 20173                              |
 *  | Month                   | M           | Numeric: 1 digit                                              | 9, 12                                                      |
 *  |                         | MM          | Numeric: 2 digits + zero padded                               | 09, 12                                                     |
 *  |                         | MMM         | Abbreviated                                                   | Sep                                                        |
 *  |                         | MMMM        | Wide                                                          | September                                                  |
 *  |                         | MMMMM       | Narrow                                                        | S                                                          |
 *  | Month standalone        | L           | Numeric: 1 digit                                              | 9, 12                                                      |
 *  |                         | LL          | Numeric: 2 digits + zero padded                               | 09, 12                                                     |
 *  |                         | LLL         | Abbreviated                                                   | Sep                                                        |
 *  |                         | LLLL        | Wide                                                          | September                                                  |
 *  |                         | LLLLL       | Narrow                                                        | S                                                          |
 *  | ISO Week of year        | w           | Numeric: minimum digits                                       | 1... 53                                                    |
 *  |                         | ww          | Numeric: 2 digits + zero padded                               | 01... 53                                                   |
 *  | Week of month           | W           | Numeric: 1 digit                                              | 1... 5                                                     |
 *  | Day of month            | d           | Numeric: minimum digits                                       | 1                                                          |
 *  |                         | dd          | Numeric: 2 digits + zero padded                               | 01                                                         |
 *  | Week day                | E, EE & EEE | Abbreviated                                                   | Tue                                                        |
 *  |                         | EEEE        | Wide                                                          | Tuesday                                                    |
 *  |                         | EEEEE       | Narrow                                                        | T                                                          |
 *  |                         | EEEEEE      | Short                                                         | Tu                                                         |
 *  | Week day standalone     | c, cc       | Numeric: 1 digit                                              | 2                                                          |
 *  |                         | ccc         | Abbreviated                                                   | Tue                                                        |
 *  |                         | cccc        | Wide                                                          | Tuesday                                                    |
 *  |                         | ccccc       | Narrow                                                        | T                                                          |
 *  |                         | cccccc      | Short                                                         | Tu                                                         |
 *  | Period                  | a, aa & aaa | Abbreviated                                                   | am/pm or AM/PM                                             |
 *  |                         | aaaa        | Wide (fallback to `a` when missing)                           | ante meridiem/post meridiem                                |
 *  |                         | aaaaa       | Narrow                                                        | a/p                                                        |
 *  | Period*                 | B, BB & BBB | Abbreviated                                                   | mid.                                                       |
 *  |                         | BBBB        | Wide                                                          | am, pm, midnight, noon, morning, afternoon, evening, night |
 *  |                         | BBBBB       | Narrow                                                        | md                                                         |
 *  | Period standalone*      | b, bb & bbb | Abbreviated                                                   | mid.                                                       |
 *  |                         | bbbb        | Wide                                                          | am, pm, midnight, noon, morning, afternoon, evening, night |
 *  |                         | bbbbb       | Narrow                                                        | md                                                         |
 *  | Hour 1-12               | h           | Numeric: minimum digits                                       | 1, 12                                                      |
 *  |                         | hh          | Numeric: 2 digits + zero padded                               | 01, 12                                                     |
 *  | Hour 0-23               | H           | Numeric: minimum digits                                       | 0, 23                                                      |
 *  |                         | HH          | Numeric: 2 digits + zero padded                               | 00, 23                                                     |
 *  | Minute                  | m           | Numeric: minimum digits                                       | 8, 59                                                      |
 *  |                         | mm          | Numeric: 2 digits + zero padded                               | 08, 59                                                     |
 *  | Second                  | s           | Numeric: minimum digits                                       | 0... 59                                                    |
 *  |                         | ss          | Numeric: 2 digits + zero padded                               | 00... 59                                                   |
 *  | Fractional seconds      | S           | Numeric: 1 digit                                              | 0... 9                                                     |
 *  |                         | SS          | Numeric: 2 digits + zero padded                               | 00... 99                                                   |
 *  |                         | SSS         | Numeric: 3 digits + zero padded (= milliseconds)              | 000... 999                                                 |
 *  | Zone                    | z, zz & zzz | Short specific non location format (fallback to O)            | GMT-8                                                      |
 *  |                         | zzzz        | Long specific non location format (fallback to OOOO)          | GMT-08:00                                                  |
 *  |                         | Z, ZZ & ZZZ | ISO8601 basic format                                          | -0800                                                      |
 *  |                         | ZZZZ        | Long localized GMT format                                     | GMT-8:00                                                   |
 *  |                         | ZZZZZ       | ISO8601 extended format + Z indicator for offset 0 (= XXXXX)  | -08:00                                                     |
 *  |                         | O, OO & OOO | Short localized GMT format                                    | GMT-8                                                      |
 *  |                         | OOOO        | Long localized GMT format                                     | GMT-08:00                                                  |
 *
 *
 * ### Format examples
 *
 * These examples transform a date into various formats,
 * assuming that `dateObj` is a JavaScript `Date` object for
 * year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11,
 * given in the local time for the `en-US` locale.
 *
 * ```
 * {{ dateObj | date }}               // output is 'Jun 15, 2015'
 * {{ dateObj | date:'medium' }}      // output is 'Jun 15, 2015, 9:43:11 PM'
 * {{ dateObj | date:'shortTime' }}   // output is '9:43 PM'
 * {{ dateObj | date:'mm:ss' }}       // output is '43:11'
 * {{ dateObj | date:"MMM dd, yyyy 'at' hh:mm a" }}  // output is 'Jun 15, 2015 at 09:43 PM'
 * ```
 *
 * ### Usage example
 *
 * The following component uses a date pipe to display the current date in different formats.
 *
 * ```angular-ts
 * @Component({
 *  selector: 'date-pipe',
 *  template: `<div>
 *    <p>Today is {{today | date}}</p>
 *    <p>Or if you prefer, {{today | date:'fullDate'}}</p>
 *    <p>The time is {{today | date:'h:mm a z'}}</p>
 *  </div>`
 * })
 * // Get the current date and time as a date-time value.
 * export class DatePipeComponent {
 *   today: number = Date.now();
 * }
 * ```
 *
 * @publicApi
 */
declare class DatePipe implements PipeTransform {
    private locale;
    private defaultTimezone?;
    private defaultOptions?;
    constructor(locale: string, defaultTimezone?: string | null | undefined, defaultOptions?: (DatePipeConfig | null) | undefined);
    /**
     * @param value The date expression: a `Date` object,  a number
     * (milliseconds since UTC epoch), or an ISO string (https://www.w3.org/TR/NOTE-datetime).
     * @param format The date/time components to include, using predefined options or a
     * custom format string.  When not provided, the `DatePipe` looks for the value using the
     * `DATE_PIPE_DEFAULT_OPTIONS` injection token (and reads the `dateFormat` property).
     * If the token is not configured, the `mediumDate` is used as a value.
     * @param timezone A timezone offset (such as `'+0430'`). When not provided, the `DatePipe`
     * looks for the value using the `DATE_PIPE_DEFAULT_OPTIONS` injection token (and reads
     * the `timezone` property). If the token is not configured, the end-user's local system
     * timezone is used as a value.
     * @param locale A locale code for the locale format rules to use.
     * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.
     * See [Setting your app locale](guide/i18n/locale-id).
     *
     * @see {@link DATE_PIPE_DEFAULT_OPTIONS}
     *
     * @returns A date string in the desired format.
     */
    transform(value: Date | string | number, format?: string, timezone?: string, locale?: string): string | null;
    transform(value: null | undefined, format?: string, timezone?: string, locale?: string): null;
    transform(value: Date | string | number | null | undefined, format?: string, timezone?: string, locale?: string): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<DatePipe, [null, { optional: true; }, { optional: true; }]>;
    static ɵpipe: i0.ɵɵPipeDeclaration<DatePipe, "date", true>;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Maps a value to a string that pluralizes the value according to locale rules.
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example common/pipes/ts/i18n_pipe.ts region='I18nPluralPipeComponent'}
 *
 * @publicApi
 */
declare class I18nPluralPipe implements PipeTransform {
    private _localization;
    constructor(_localization: NgLocalization);
    /**
     * @param value the number to be formatted
     * @param pluralMap an object that mimics the ICU format, see
     * https://unicode-org.github.io/icu/userguide/format_parse/messages/.
     * @param locale a `string` defining the locale to use (uses the current {@link LOCALE_ID} by
     * default).
     */
    transform(value: number | null | undefined, pluralMap: {
        [count: string]: string;
    }, locale?: string): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<I18nPluralPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<I18nPluralPipe, "i18nPlural", true>;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Generic selector that displays the string that matches the current value.
 *
 * If none of the keys of the `mapping` match the `value`, then the content
 * of the `other` key is returned when present, otherwise an empty string is returned.
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example common/pipes/ts/i18n_pipe.ts region='I18nSelectPipeComponent'}
 *
 * @publicApi
 */
declare class I18nSelectPipe implements PipeTransform {
    /**
     * @param value a string to be internationalized.
     * @param mapping an object that indicates the text that should be displayed
     * for different values of the provided `value`.
     */
    transform(value: string | null | undefined, mapping: {
        [key: string]: string;
    }): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<I18nSelectPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<I18nSelectPipe, "i18nSelect", true>;
}

/**
 * A key value pair.
 * Usually used to represent the key value pairs from a Map or Object.
 *
 * @publicApi
 */
interface KeyValue<K, V> {
    key: K;
    value: V;
}
/**
 * @ngModule CommonModule
 * @description
 *
 * Transforms Object or Map into an array of key value pairs.
 *
 * The output array will be ordered by keys.
 * By default the comparator will be by Unicode point value.
 * You can optionally pass a compareFn if your keys are complex types.
 * Passing `null` as the compareFn will use natural ordering of the input.
 *
 * @usageNotes
 * ### Examples
 *
 * This examples show how an Object or a Map can be iterated by ngFor with the use of this
 * keyvalue pipe.
 *
 * {@example common/pipes/ts/keyvalue_pipe.ts region='KeyValuePipe'}
 *
 * @publicApi
 */
declare class KeyValuePipe implements PipeTransform {
    private readonly differs;
    constructor(differs: KeyValueDiffers);
    private differ;
    private keyValues;
    private compareFn;
    transform<K, V>(input: ReadonlyMap<K, V>, compareFn?: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null): Array<KeyValue<K, V>>;
    transform<K extends number, V>(input: Record<K, V>, compareFn?: ((a: KeyValue<string, V>, b: KeyValue<string, V>) => number) | null): Array<KeyValue<string, V>>;
    transform<K extends string, V>(input: Record<K, V> | ReadonlyMap<K, V>, compareFn?: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null): Array<KeyValue<K, V>>;
    transform(input: null | undefined, compareFn?: ((a: KeyValue<unknown, unknown>, b: KeyValue<unknown, unknown>) => number) | null): null;
    transform<K, V>(input: ReadonlyMap<K, V> | null | undefined, compareFn?: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null): Array<KeyValue<K, V>> | null;
    transform<K extends number, V>(input: Record<K, V> | null | undefined, compareFn?: ((a: KeyValue<string, V>, b: KeyValue<string, V>) => number) | null): Array<KeyValue<string, V>> | null;
    transform<K extends string, V>(input: Record<K, V> | ReadonlyMap<K, V> | null | undefined, compareFn?: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null): Array<KeyValue<K, V>> | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<KeyValuePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<KeyValuePipe, "keyvalue", true>;
}

/**
 * Exports all the basic Angular directives and pipes,
 * such as `NgIf`, `NgForOf`, `DecimalPipe`, and so on.
 * Re-exported by `BrowserModule`, which is included automatically in the root
 * `AppModule` when you create a new app with the CLI `new` command.
 *
 * @publicApi
 */
declare class CommonModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<CommonModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<CommonModule, never, [typeof NgClass, typeof NgComponentOutlet, typeof NgForOf, typeof NgIf, typeof NgTemplateOutlet, typeof NgStyle, typeof NgSwitch, typeof NgSwitchCase, typeof NgSwitchDefault, typeof NgPlural, typeof NgPluralCase, typeof AsyncPipe, typeof UpperCasePipe, typeof LowerCasePipe, typeof JsonPipe, typeof SlicePipe, typeof DecimalPipe, typeof PercentPipe, typeof TitleCasePipe, typeof CurrencyPipe, typeof DatePipe, typeof I18nPluralPipe, typeof I18nSelectPipe, typeof KeyValuePipe], [typeof NgClass, typeof NgComponentOutlet, typeof NgForOf, typeof NgIf, typeof NgTemplateOutlet, typeof NgStyle, typeof NgSwitch, typeof NgSwitchCase, typeof NgSwitchDefault, typeof NgPlural, typeof NgPluralCase, typeof AsyncPipe, typeof UpperCasePipe, typeof LowerCasePipe, typeof JsonPipe, typeof SlicePipe, typeof DecimalPipe, typeof PercentPipe, typeof TitleCasePipe, typeof CurrencyPipe, typeof DatePipe, typeof I18nPluralPipe, typeof I18nSelectPipe, typeof KeyValuePipe]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<CommonModule>;
}

export { APP_BASE_HREF, AsyncPipe, CommonModule, CurrencyPipe, DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe, DecimalPipe, I18nPluralPipe, I18nSelectPipe, JsonPipe, KeyValuePipe, Location, LocationStrategy, LowerCasePipe, NgClass, NgComponentOutlet, NgForOf, NgForOfContext, NgIf, NgIfContext, NgLocaleLocalization, NgLocalization, NgPlural, NgPluralCase, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet, PathLocationStrategy, PercentPipe, SlicePipe, TitleCasePipe, UpperCasePipe };
export type { DatePipeConfig, KeyValue, PopStateEvent };
H'ĺ,x   /**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

export { AsyncPipe, CommonModule, CurrencyPipe, DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe, DecimalPipe, FormStyle, FormatWidth, HashLocationStrategy, I18nPluralPipe, I18nSelectPipe, JsonPipe, KeyValuePipe, LowerCasePipe, NgClass, NgComponentOutlet, NgForOf as NgFor, NgForOf, NgForOfContext, NgIf, NgIfContext, NgLocaleLocalization, NgLocalization, NgPlural, NgPluralCase, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet, NumberFormatStyle, NumberSymbol, PercentPipe, Plural, SlicePipe, TitleCasePipe, TranslationWidth, UpperCasePipe, WeekDay, formatCurrency, formatDate, formatNumber, formatPercent, getCurrencySymbol, getLocaleCurrencyCode, getLocaleCurrencyName, getLocaleCurrencySymbol, getLocaleDateFormat, getLocaleDateTimeFormat, getLocaleDayNames, getLocaleDayPeriods, getLocaleDirection, getLocaleEraNames, getLocaleExtraDayPeriodRules, getLocaleExtraDayPeriods, getLocaleFirstDayOfWeek, getLocaleId, getLocaleMonthNames, getLocaleNumberFormat, getLocaleNumberSymbol, getLocalePluralCase, getLocaleTimeFormat, getLocaleWeekEndRange, getNumberOfCurrencyDigits } from './common_module-Dx7dWex5.mjs';
import * as i0 from '@angular/core';
import { ɵregisterLocaleData as _registerLocaleData, Version, ɵɵdefineInjectable as __defineInjectable, inject, InjectionToken, ɵRuntimeError as _RuntimeError, ɵformatRuntimeError as _formatRuntimeError, PLATFORM_ID, Injectable, ɵIMAGE_CONFIG as _IMAGE_CONFIG, Renderer2, ElementRef, Injector, DestroyRef, ɵperformanceMarkFeature as _performanceMarkFeature, NgZone, ApplicationRef, booleanAttribute, numberAttribute, ChangeDetectorRef, ɵIMAGE_CONFIG_DEFAULTS as _IMAGE_CONFIG_DEFAULTS, ɵunwrapSafeValue as _unwrapSafeValue, Input, Directive } from '@angular/core';
export { ɵIMAGE_CONFIG as IMAGE_CONFIG } from '@angular/core';
import { isPlatformBrowser } from './xhr-BfNfxNDv.mjs';
export { XhrFactory, isPlatformServer, PLATFORM_BROWSER_ID as ɵPLATFORM_BROWSER_ID, PLATFORM_SERVER_ID as ɵPLATFORM_SERVER_ID, parseCookieValue as ɵparseCookieValue } from './xhr-BfNfxNDv.mjs';
import { DOCUMENT } from './dom_tokens-rA0ACyx7.mjs';
export { APP_BASE_HREF, BrowserPlatformLocation, LOCATION_INITIALIZED, Location, LocationStrategy, PathLocationStrategy, PlatformLocation, DomAdapter as ɵDomAdapter, getDOM as ɵgetDOM, normalizeQueryParams as ɵnormalizeQueryParams, setRootDomAdapter as ɵsetRootDomAdapter } from './location-Dq4mJT-A.mjs';
export { PlatformNavigation as ɵPlatformNavigation } from './platform_navigation-B45Jeakb.mjs';
import 'rxjs';

/**
 * Register global data to be used internally by Angular. See the
 * ["I18n guide"](guide/i18n/format-data-locale) to know how to import additional locale
 * data.
 *
 * The signature registerLocaleData(data: any, extraData?: any) is deprecated since v5.1
 *
 * @publicApi
 */
function registerLocaleData(data, localeId, extraData) {
    return _registerLocaleData(data, localeId, extraData);
}

/**
 * @module
 * @description
 * Entry point for all public APIs of the common package.
 */
/**
 * @publicApi
 */
const VERSION = new Version('19.2.14');

/**
 * Defines a scroll position manager. Implemented by `BrowserViewportScroller`.
 *
 * @publicApi
 */
class ViewportScroller {
    // De-sugared tree-shakable injection
    // See #23917
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ __defineInjectable({
        token: ViewportScroller,
        providedIn: 'root',
        factory: () => typeof ngServerMode !== 'undefined' && ngServerMode
            ? new NullViewportScroller()
            : new BrowserViewportScroller(inject(DOCUMENT), window),
    });
}
/**
 * Manages the scroll position for a browser window.
 */
class BrowserViewportScroller {
    document;
    window;
    offset = () => [0, 0];
    constructor(document, window) {
        this.document = document;
        this.window = window;
    }
    /**
     * Configures the top offset used when scrolling to an anchor.
     * @param offset A position in screen coordinates (a tuple with x and y values)
     * or a function that returns the top offset position.
     *
     */
    setOffset(offset) {
        if (Array.isArray(offset)) {
            this.offset = () => offset;
        }
        else {
            this.offset = offset;
        }
    }
    /**
     * Retrieves the current scroll position.
     * @returns The position in screen coordinates.
     */
    getScrollPosition() {
        return [this.window.scrollX, this.window.scrollY];
    }
    /**
     * Sets the scroll position.
     * @param position The new position in screen coordinates.
     */
    scrollToPosition(position) {
        this.window.scrollTo(position[0], position[1]);
    }
    /**
     * Scrolls to an element and attempts to focus the element.
     *
     * Note that the function name here is misleading in that the target string may be an ID for a
     * non-anchor element.
     *
     * @param target The ID of an element or name of the anchor.
     *
     * @see https://html.spec.whatwg.org/#the-indicated-part-of-the-document
     * @see https://html.spec.whatwg.org/#scroll-to-fragid
     */
    scrollToAnchor(target) {
        const elSelected = findAnchorFromDocument(this.document, target);
        if (elSelected) {
            this.scrollToElement(elSelected);
            // After scrolling to the element, the spec dictates that we follow the focus steps for the
            // target. Rather than following the robust steps, simply attempt focus.
            //
            // @see https://html.spec.whatwg.org/#get-the-focusable-area
            // @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLOrForeignElement/focus
            // @see https://html.spec.whatwg.org/#focusable-area
            elSelected.focus();
        }
    }
    /**
     * Disables automatic scroll restoration provided by the browser.
     */
    setHistoryScrollRestoration(scrollRestoration) {
        this.window.history.scrollRestoration = scrollRestoration;
    }
    /**
     * Scrolls to an element using the native offset and the specified offset set on this scroller.
     *
     * The offset can be used when we know that there is a floating header and scrolling naively to an
     * element (ex: `scrollIntoView`) leaves the element hidden behind the floating header.
     */
    scrollToElement(el) {
        const rect = el.getBoundingClientRect();
        const left = rect.left + this.window.pageXOffset;
        const top = rect.top + this.window.pageYOffset;
        const offset = this.offset();
        this.window.scrollTo(left - offset[0], top - offset[1]);
    }
}
function findAnchorFromDocument(document, target) {
    const documentResult = document.getElementById(target) || document.getElementsByName(target)[0];
    if (documentResult) {
        return documentResult;
    }
    // `getElementById` and `getElementsByName` won't pierce through the shadow DOM so we
    // have to traverse the DOM manually and do the lookup through the shadow roots.
    if (typeof document.createTreeWalker === 'function' &&
        document.body &&
        typeof document.body.attachShadow === 'function') {
        const treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT);
        let currentNode = treeWalker.currentNode;
        while (currentNode) {
            const shadowRoot = currentNode.shadowRoot;
            if (shadowRoot) {
                // Note that `ShadowRoot` doesn't support `getElementsByName`
                // so we have to fall back to `querySelector`.
                const result = shadowRoot.getElementById(target) || shadowRoot.querySelector(`[name="${target}"]`);
                if (result) {
                    return result;
                }
            }
            currentNode = treeWalker.nextNode();
        }
    }
    return null;
}
/**
 * Provides an empty implementation of the viewport scroller.
 */
class NullViewportScroller {
    /**
     * Empty implementation
     */
    setOffset(offset) { }
    /**
     * Empty implementation
     */
    getScrollPosition() {
        return [0, 0];
    }
    /**
     * Empty implementation
     */
    scrollToPosition(position) { }
    /**
     * Empty implementation
     */
    scrollToAnchor(anchor) { }
    /**
     * Empty implementation
     */
    setHistoryScrollRestoration(scrollRestoration) { }
}

/**
 * Value (out of 100) of the requested quality for placeholder images.
 */
const PLACEHOLDER_QUALITY = '20';

// Converts a string that represents a URL into a URL class instance.
function getUrl(src, win) {
    // Don't use a base URL is the URL is absolute.
    return isAbsoluteUrl(src) ? new URL(src) : new URL(src, win.location.href);
}
// Checks whether a URL is absolute (i.e. starts with `http://` or `https://`).
function isAbsoluteUrl(src) {
    return /^https?:\/\//.test(src);
}
// Given a URL, extract the hostname part.
// If a URL is a relative one - the URL is returned as is.
function extractHostname(url) {
    return isAbsoluteUrl(url) ? new URL(url).hostname : url;
}
function isValidPath(path) {
    const isString = typeof path === 'string';
    if (!isString || path.trim() === '') {
        return false;
    }
    // Calling new URL() will throw if the path string is malformed
    try {
        const url = new URL(path);
        return true;
    }
    catch {
        return false;
    }
}
function normalizePath(path) {
    return path.endsWith('/') ? path.slice(0, -1) : path;
}
function normalizeSrc(src) {
    return src.startsWith('/') ? src.slice(1) : src;
}

/**
 * Noop image loader that does no transformation to the original src and just returns it as is.
 * This loader is used as a default one if more specific logic is not provided in an app config.
 *
 * @see {@link ImageLoader}
 * @see {@link NgOptimizedImage}
 */
const noopImageLoader = (config) => config.src;
/**
 * Injection token that configures the image loader function.
 *
 * @see {@link ImageLoader}
 * @see {@link NgOptimizedImage}
 * @publicApi
 */
const IMAGE_LOADER = new InjectionToken(ngDevMode ? 'ImageLoader' : '', {
    providedIn: 'root',
    factory: () => noopImageLoader,
});
/**
 * Internal helper function that makes it easier to introduce custom image loaders for the
 * `NgOptimizedImage` directive. It is enough to specify a URL builder function to obtain full DI
 * configuration for a given loader: a DI token corresponding to the actual loader function, plus DI
 * tokens managing preconnect check functionality.
 * @param buildUrlFn a function returning a full URL based on loader's configuration
 * @param exampleUrls example of full URLs for a given loader (used in error messages)
 * @returns a set of DI providers corresponding to the configured image loader
 */
function createImageLoader(buildUrlFn, exampleUrls) {
    return function provideImageLoader(path) {
        if (!isValidPath(path)) {
            throwInvalidPathError(path, exampleUrls || []);
        }
        // The trailing / is stripped (if provided) to make URL construction (concatenation) easier in
        // the individual loader functions.
        path = normalizePath(path);
        const loaderFn = (config) => {
            if (isAbsoluteUrl(config.src)) {
                // Image loader functions expect an image file name (e.g. `my-image.png`)
                // or a relative path + a file name (e.g. `/a/b/c/my-image.png`) as an input,
                // so the final absolute URL can be constructed.
                // When an absolute URL is provided instead - the loader can not
                // build a final URL, thus the error is thrown to indicate that.
                throwUnexpectedAbsoluteUrlError(path, config.src);
            }
            return buildUrlFn(path, { ...config, src: normalizeSrc(config.src) });
        };
        const providers = [{ provide: IMAGE_LOADER, useValue: loaderFn }];
        return providers;
    };
}
function throwInvalidPathError(path, exampleUrls) {
    throw new _RuntimeError(2959 /* RuntimeErrorCode.INVALID_LOADER_ARGUMENTS */, ngDevMode &&
        `Image loader has detected an invalid path (\`${path}\`). ` +
            `To fix this, supply a path using one of the following formats: ${exampleUrls.join(' or ')}`);
}
function throwUnexpectedAbsoluteUrlError(path, url) {
    throw new _RuntimeError(2959 /* RuntimeErrorCode.INVALID_LOADER_ARGUMENTS */, ngDevMode &&
        `Image loader has detected a \`<img>\` tag with an invalid \`ngSrc\` attribute: ${url}. ` +
            `This image loader expects \`ngSrc\` to be a relative URL - ` +
            `however the provided value is an absolute URL. ` +
            `To fix this, provide \`ngSrc\` as a path relative to the base URL ` +
            `configured for this loader (\`${path}\`).`);
}

/**
 * Function that generates an ImageLoader for [Cloudflare Image
 * Resizing](https://developers.cloudflare.com/images/image-resizing/) and turns it into an Angular
 * provider. Note: Cloudflare has multiple image products - this provider is specifically for
 * Cloudflare Image Resizing; it will not work with Cloudflare Images or Cloudflare Polish.
 *
 * @param path Your domain name, e.g. https://mysite.com
 * @returns Provider that provides an ImageLoader function
 *
 * @publicApi
 */
const provideCloudflareLoader = createImageLoader(createCloudflareUrl, ngDevMode ? ['https://<ZONE>/cdn-cgi/image/<OPTIONS>/<SOURCE-IMAGE>'] : undefined);
function createCloudflareUrl(path, config) {
    let params = `format=auto`;
    if (config.width) {
        params += `,width=${config.width}`;
    }
    // When requesting a placeholder image we ask for a low quality image to reduce the load time.
    if (config.isPlaceholder) {
        params += `,quality=${PLACEHOLDER_QUALITY}`;
    }
    // Cloudflare image URLs format:
    // https://developers.cloudflare.com/images/image-resizing/url-format/
    return `${path}/cdn-cgi/image/${params}/${config.src}`;
}

/**
 * Name and URL tester for Cloudinary.
 */
const cloudinaryLoaderInfo = {
    name: 'Cloudinary',
    testUrl: isCloudinaryUrl,
};
const CLOUDINARY_LOADER_REGEX = /https?\:\/\/[^\/]+\.cloudinary\.com\/.+/;
/**
 * Tests whether a URL is from Cloudinary CDN.
 */
function isCloudinaryUrl(url) {
    return CLOUDINARY_LOADER_REGEX.test(url);
}
/**
 * Function that generates an ImageLoader for Cloudinary and turns it into an Angular provider.
 *
 * @param path Base URL of your Cloudinary images
 * This URL should match one of the following formats:
 * https://res.cloudinary.com/mysite
 * https://mysite.cloudinary.com
 * https://subdomain.mysite.com
 * @returns Set of providers to configure the Cloudinary loader.
 *
 * @publicApi
 */
const provideCloudinaryLoader = createImageLoader(createCloudinaryUrl, ngDevMode
    ? [
        'https://res.cloudinary.com/mysite',
        'https://mysite.cloudinary.com',
        'https://subdomain.mysite.com',
    ]
    : undefined);
function createCloudinaryUrl(path, config) {
    // Cloudinary image URLformat:
    // https://cloudinary.com/documentation/image_transformations#transformation_url_structure
    // Example of a Cloudinary image URL:
    // https://res.cloudinary.com/mysite/image/upload/c_scale,f_auto,q_auto,w_600/marketing/tile-topics-m.png
    // For a placeholder image, we use the lowest image setting available to reduce the load time
    // else we use the auto size
    const quality = config.isPlaceholder ? 'q_auto:low' : 'q_auto';
    let params = `f_auto,${quality}`;
    if (config.width) {
        params += `,w_${config.width}`;
    }
    if (config.loaderParams?.['rounded']) {
        params += `,r_max`;
    }
    return `${path}/image/upload/${params}/${config.src}`;
}

/**
 * Name and URL tester for ImageKit.
 */
const imageKitLoaderInfo = {
    name: 'ImageKit',
    testUrl: isImageKitUrl,
};
const IMAGE_KIT_LOADER_REGEX = /https?\:\/\/[^\/]+\.imagekit\.io\/.+/;
/**
 * Tests whether a URL is from ImageKit CDN.
 */
function isImageKitUrl(url) {
    return IMAGE_KIT_LOADER_REGEX.test(url);
}
/**
 * Function that generates an ImageLoader for ImageKit and turns it into an Angular provider.
 *
 * @param path Base URL of your ImageKit images
 * This URL should match one of the following formats:
 * https://ik.imagekit.io/myaccount
 * https://subdomain.mysite.com
 * @returns Set of providers to configure the ImageKit loader.
 *
 * @publicApi
 */
const provideImageKitLoader = createImageLoader(createImagekitUrl, ngDevMode ? ['https://ik.imagekit.io/mysite', 'https://subdomain.mysite.com'] : undefined);
function createImagekitUrl(path, config) {
    // Example of an ImageKit image URL:
    // https://ik.imagekit.io/demo/tr:w-300,h-300/medium_cafe_B1iTdD0C.jpg
    const { src, width } = config;
    const params = [];
    if (width) {
        params.push(`w-${width}`);
    }
    // When requesting a placeholder image we ask for a low quality image to reduce the load time.
    if (config.isPlaceholder) {
        params.push(`q-${PLACEHOLDER_QUALITY}`);
    }
    const urlSegments = params.length ? [path, `tr:${params.join(',')}`, src] : [path, src];
    const url = new URL(urlSegments.join('/'));
    return url.href;
}

/**
 * Name and URL tester for Imgix.
 */
const imgixLoaderInfo = {
    name: 'Imgix',
    testUrl: isImgixUrl,
};
const IMGIX_LOADER_REGEX = /https?\:\/\/[^\/]+\.imgix\.net\/.+/;
/**
 * Tests whether a URL is from Imgix CDN.
 */
function isImgixUrl(url) {
    return IMGIX_LOADER_REGEX.test(url);
}
/**
 * Function that generates an ImageLoader for Imgix and turns it into an Angular provider.
 *
 * @param path path to the desired Imgix origin,
 * e.g. https://somepath.imgix.net or https://images.mysite.com
 * @returns Set of providers to configure the Imgix loader.
 *
 * @publicApi
 */
const provideImgixLoader = createImageLoader(createImgixUrl, ngDevMode ? ['https://somepath.imgix.net/'] : undefined);
function createImgixUrl(path, config) {
    const url = new URL(`${path}/${config.src}`);
    // This setting ensures the smallest allowable format is set.
    url.searchParams.set('auto', 'format');
    if (config.width) {
        url.searchParams.set('w', config.width.toString());
    }
    // When requesting a placeholder image we ask a low quality image to reduce the load time.
    if (config.isPlaceholder) {
        url.searchParams.set('q', PLACEHOLDER_QUALITY);
    }
    return url.href;
}

/**
 * Name and URL tester for Netlify.
 */
const netlifyLoaderInfo = {
    name: 'Netlify',
    testUrl: isNetlifyUrl,
};
const NETLIFY_LOADER_REGEX = /https?\:\/\/[^\/]+\.netlify\.app\/.+/;
/**
 * Tests whether a URL is from a Netlify site. This won't catch sites with a custom domain,
 * but it's a good start for sites in development. This is only used to warn users who haven't
 * configured an image loader.
 */
function isNetlifyUrl(url) {
    return NETLIFY_LOADER_REGEX.test(url);
}
/**
 * Function that generates an ImageLoader for Netlify and turns it into an Angular provider.
 *
 * @param path optional URL of the desired Netlify site. Defaults to the current site.
 * @returns Set of providers to configure the Netlify loader.
 *
 * @publicApi
 */
function provideNetlifyLoader(path) {
    if (path && !isValidPath(path)) {
        throw new _RuntimeError(2959 /* RuntimeErrorCode.INVALID_LOADER_ARGUMENTS */, ngDevMode &&
            `Image loader has detected an invalid path (\`${path}\`). ` +
                `To fix this, supply either the full URL to the Netlify site, or leave it empty to use the current site.`);
    }
    if (path) {
        const url = new URL(path);
        path = url.origin;
    }
    const loaderFn = (config) => {
        return createNetlifyUrl(config, path);
    };
    const providers = [{ provide: IMAGE_LOADER, useValue: loaderFn }];
    return providers;
}
const validParams = new Map([
    ['height', 'h'],
    ['fit', 'fit'],
    ['quality', 'q'],
    ['q', 'q'],
    ['position', 'position'],
]);
function createNetlifyUrl(config, path) {
    // Note: `path` can be undefined, in which case we use a fake one to construct a `URL` instance.
    const url = new URL(path ?? 'https://a/');
    url.pathname = '/.netlify/images';
    if (!isAbsoluteUrl(config.src) && !config.src.startsWith('/')) {
        config.src = '/' + config.src;
    }
    url.searchParams.set('url', config.src);
    if (config.width) {
        url.searchParams.set('w', config.width.toString());
    }
    // When requesting a placeholder image we ask for a low quality image to reduce the load time.
    // If the quality is specified in the loader config - always use provided value.
    const configQuality = config.loaderParams?.['quality'] ?? config.loaderParams?.['q'];
    if (config.isPlaceholder && !configQuality) {
        url.searchParams.set('q', PLACEHOLDER_QUALITY);
    }
    for (const [param, value] of Object.entries(config.loaderParams ?? {})) {
        if (validParams.has(param)) {
            url.searchParams.set(validParams.get(param), value.toString());
        }
        else {
            if (ngDevMode) {
                console.warn(_formatRuntimeError(2959 /* RuntimeErrorCode.INVALID_LOADER_ARGUMENTS */, `The Netlify image loader has detected an \`<img>\` tag with the unsupported attribute "\`${param}\`".`));
            }
        }
    }
    // The "a" hostname is used for relative URLs, so we can remove it from the final URL.
    return url.hostname === 'a' ? url.href.replace(url.origin, '') : url.href;
}

// Assembles directive details string, useful for error messages.
function imgDirectiveDetails(ngSrc, includeNgSrc = true) {
    const ngSrcInfo = includeNgSrc
        ? `(activated on an <img> element with the \`ngSrc="${ngSrc}"\`) `
        : '';
    return `The NgOptimizedImage directive ${ngSrcInfo}has detected that`;
}

/**
 * Asserts that the application is in development mode. Throws an error if the application is in
 * production mode. This assert can be used to make sure that there is no dev-mode code invoked in
 * the prod mode accidentally.
 */
function assertDevMode(checkName) {
    if (!ngDevMode) {
        throw new _RuntimeError(2958 /* RuntimeErrorCode.UNEXPECTED_DEV_MODE_CHECK_IN_PROD_MODE */, `Unexpected invocation of the ${checkName} in the prod mode. ` +
            `Please make sure that the prod mode is enabled for production builds.`);
    }
}

/**
 * Observer that detects whether an image with `NgOptimizedImage`
 * is treated as a Largest Contentful Paint (LCP) element. If so,
 * asserts that the image has the `priority` attribute.
 *
 * Note: this is a dev-mode only class and it does not appear in prod bundles,
 * thus there is no `ngDevMode` use in the code.
 *
 * Based on https://web.dev/lcp/#measure-lcp-in-javascript.
 */
class LCPImageObserver {
    // Map of full image URLs -> original `ngSrc` values.
    images = new Map();
    window = null;
    observer = null;
    constructor() {
        const isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
        assertDevMode('LCP checker');
        const win = inject(DOCUMENT).defaultView;
        if (isBrowser && typeof PerformanceObserver !== 'undefined') {
            this.window = win;
            this.observer = this.initPerformanceObserver();
        }
    }
    /**
     * Inits PerformanceObserver and subscribes to LCP events.
     * Based on https://web.dev/lcp/#measure-lcp-in-javascript
     */
    initPerformanceObserver() {
        const observer = new PerformanceObserver((entryList) => {
            const entries = entryList.getEntries();
            if (entries.length === 0)
                return;
            // We use the latest entry produced by the `PerformanceObserver` as the best
            // signal on which element is actually an LCP one. As an example, the first image to load on
            // a page, by virtue of being the only thing on the page so far, is often a LCP candidate
            // and gets reported by PerformanceObserver, but isn't necessarily the LCP element.
            const lcpElement = entries[entries.length - 1];
            // Cast to `any` due to missing `element` on the `LargestContentfulPaint` type of entry.
            // See https://developer.mozilla.org/en-US/docs/Web/API/LargestContentfulPaint
            const imgSrc = lcpElement.element?.src ?? '';
            // Exclude `data:` and `blob:` URLs, since they are not supported by the directive.
            if (imgSrc.startsWith('data:') || imgSrc.startsWith('blob:'))
                return;
            const img = this.images.get(imgSrc);
            if (!img)
                return;
            if (!img.priority && !img.alreadyWarnedPriority) {
                img.alreadyWarnedPriority = true;
                logMissingPriorityError(imgSrc);
            }
            if (img.modified && !img.alreadyWarnedModified) {
                img.alreadyWarnedModified = true;
                logModifiedWarning(imgSrc);
            }
        });
        observer.observe({ type: 'largest-contentful-paint', buffered: true });
        return observer;
    }
    registerImage(rewrittenSrc, originalNgSrc, isPriority) {
        if (!this.observer)
            return;
        const newObservedImageState = {
            priority: isPriority,
            modified: false,
            alreadyWarnedModified: false,
            alreadyWarnedPriority: false,
        };
        this.images.set(getUrl(rewrittenSrc, this.window).href, newObservedImageState);
    }
    unregisterImage(rewrittenSrc) {
        if (!this.observer)
            return;
        this.images.delete(getUrl(rewrittenSrc, this.window).href);
    }
    updateImage(originalSrc, newSrc) {
        if (!this.observer)
            return;
        const originalUrl = getUrl(originalSrc, this.window).href;
        const img = this.images.get(originalUrl);
        if (img) {
            img.modified = true;
            this.images.set(getUrl(newSrc, this.window).href, img);
            this.images.delete(originalUrl);
        }
    }
    ngOnDestroy() {
        if (!this.observer)
            return;
        this.observer.disconnect();
        this.images.clear();
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LCPImageObserver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LCPImageObserver, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LCPImageObserver, decorators: [{
            type: Injectable,
            args: [{ providedIn: 'root' }]
        }], ctorParameters: () => [] });
function logMissingPriorityError(ngSrc) {
    const directiveDetails = imgDirectiveDetails(ngSrc);
    console.error(_formatRuntimeError(2955 /* RuntimeErrorCode.LCP_IMG_MISSING_PRIORITY */, `${directiveDetails} this image is the Largest Contentful Paint (LCP) ` +
        `element but was not marked "priority". This image should be marked ` +
        `"priority" in order to prioritize its loading. ` +
        `To fix this, add the "priority" attribute.`));
}
function logModifiedWarning(ngSrc) {
    const directiveDetails = imgDirectiveDetails(ngSrc);
    console.warn(_formatRuntimeError(2964 /* RuntimeErrorCode.LCP_IMG_NGSRC_MODIFIED */, `${directiveDetails} this image is the Largest Contentful Paint (LCP) ` +
        `element and has had its "ngSrc" attribute modified. This can cause ` +
        `slower loading performance. It is recommended not to modify the "ngSrc" ` +
        `property on any image which could be the LCP element.`));
}

// Set of origins that are always excluded from the preconnect checks.
const INTERNAL_PRECONNECT_CHECK_BLOCKLIST = new Set(['localhost', '127.0.0.1', '0.0.0.0']);
/**
 * Injection token to configure which origins should be excluded
 * from the preconnect checks. It can either be a single string or an array of strings
 * to represent a group of origins, for example:
 *
 * ```ts
 *  {provide: PRECONNECT_CHECK_BLOCKLIST, useValue: 'https://your-domain.com'}
 * ```
 *
 * or:
 *
 * ```ts
 *  {provide: PRECONNECT_CHECK_BLOCKLIST,
 *   useValue: ['https://your-domain-1.com', 'https://your-domain-2.com']}
 * ```
 *
 * @publicApi
 */
const PRECONNECT_CHECK_BLOCKLIST = new InjectionToken(ngDevMode ? 'PRECONNECT_CHECK_BLOCKLIST' : '');
/**
 * Contains the logic to detect whether an image, marked with the "priority" attribute
 * has a corresponding `<link rel="preconnect">` tag in the `document.head`.
 *
 * Note: this is a dev-mode only class, which should not appear in prod bundles,
 * thus there is no `ngDevMode` use in the code.
 */
class PreconnectLinkChecker {
    document = inject(DOCUMENT);
    /**
     * Set of <link rel="preconnect"> tags found on this page.
     * The `null` value indicates that there was no DOM query operation performed.
     */
    preconnectLinks = null;
    /*
     * Keep track of all already seen origin URLs to avoid repeating the same check.
     */
    alreadySeen = new Set();
    window = this.document.defaultView;
    blocklist = new Set(INTERNAL_PRECONNECT_CHECK_BLOCKLIST);
    constructor() {
        assertDevMode('preconnect link checker');
        const blocklist = inject(PRECONNECT_CHECK_BLOCKLIST, { optional: true });
        if (blocklist) {
            this.populateBlocklist(blocklist);
        }
    }
    populateBlocklist(origins) {
        if (Array.isArray(origins)) {
            deepForEach(origins, (origin) => {
                this.blocklist.add(extractHostname(origin));
            });
        }
        else {
            this.blocklist.add(extractHostname(origins));
        }
    }
    /**
     * Checks that a preconnect resource hint exists in the head for the
     * given src.
     *
     * @param rewrittenSrc src formatted with loader
     * @param originalNgSrc ngSrc value
     */
    assertPreconnect(rewrittenSrc, originalNgSrc) {
        if (typeof ngServerMode !== 'undefined' && ngServerMode)
            return;
        const imgUrl = getUrl(rewrittenSrc, this.window);
        if (this.blocklist.has(imgUrl.hostname) || this.alreadySeen.has(imgUrl.origin))
            return;
        // Register this origin as seen, so we don't check it again later.
        this.alreadySeen.add(imgUrl.origin);
        // Note: we query for preconnect links only *once* and cache the results
        // for the entire lifespan of an application, since it's unlikely that the
        // list would change frequently. This allows to make sure there are no
        // performance implications of making extra DOM lookups for each image.
        this.preconnectLinks ??= this.queryPreconnectLinks();
        if (!this.preconnectLinks.has(imgUrl.origin)) {
            console.warn(_formatRuntimeError(2956 /* RuntimeErrorCode.PRIORITY_IMG_MISSING_PRECONNECT_TAG */, `${imgDirectiveDetails(originalNgSrc)} there is no preconnect tag present for this ` +
                `image. Preconnecting to the origin(s) that serve priority images ensures that these ` +
                `images are delivered as soon as possible. To fix this, please add the following ` +
                `element into the <head> of the document:\n` +
                `  <link rel="preconnect" href="${imgUrl.origin}">`));
        }
    }
    queryPreconnectLinks() {
        const preconnectUrls = new Set();
        const links = this.document.querySelectorAll('link[rel=preconnect]');
        for (const link of links) {
            const url = getUrl(link.href, this.window);
            preconnectUrls.add(url.origin);
        }
        return preconnectUrls;
    }
    ngOnDestroy() {
        this.preconnectLinks?.clear();
        this.alreadySeen.clear();
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreconnectLinkChecker, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreconnectLinkChecker, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreconnectLinkChecker, decorators: [{
            type: Injectable,
            args: [{ providedIn: 'root' }]
        }], ctorParameters: () => [] });
/**
 * Invokes a callback for each element in the array. Also invokes a callback
 * recursively for each nested array.
 */
function deepForEach(input, fn) {
    for (let value of input) {
        Array.isArray(value) ? deepForEach(value, fn) : fn(value);
    }
}

/**
 * In SSR scenarios, a preload `<link>` element is generated for priority images.
 * Having a large number of preload tags may negatively affect the performance,
 * so we warn developers (by throwing an error) if the number of preloaded images
 * is above a certain threshold. This const specifies this threshold.
 */
const DEFAULT_PRELOADED_IMAGES_LIMIT = 5;
/**
 * Helps to keep track of priority images that already have a corresponding
 * preload tag (to avoid generating multiple preload tags with the same URL).
 *
 * This Set tracks the original src passed into the `ngSrc` input not the src after it has been
 * run through the specified `IMAGE_LOADER`.
 */
const PRELOADED_IMAGES = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'NG_OPTIMIZED_PRELOADED_IMAGES' : '', {
    providedIn: 'root',
    factory: () => new Set(),
});

/**
 * @description Contains the logic needed to track and add preload link tags to the `<head>` tag. It
 * will also track what images have already had preload link tags added so as to not duplicate link
 * tags.
 *
 * In dev mode this service will validate that the number of preloaded images does not exceed the
 * configured default preloaded images limit: {@link DEFAULT_PRELOADED_IMAGES_LIMIT}.
 */
class PreloadLinkCreator {
    preloadedImages = inject(PRELOADED_IMAGES);
    document = inject(DOCUMENT);
    errorShown = false;
    /**
     * @description Add a preload `<link>` to the `<head>` of the `index.html` that is served from the
     * server while using Angular Universal and SSR to kick off image loads for high priority images.
     *
     * The `sizes` (passed in from the user) and `srcset` (parsed and formatted from `ngSrcset`)
     * properties used to set the corresponding attributes, `imagesizes` and `imagesrcset`
     * respectively, on the preload `<link>` tag so that the correctly sized image is preloaded from
     * the CDN.
     *
     * {@link https://web.dev/preload-responsive-images/#imagesrcset-and-imagesizes}
     *
     * @param renderer The `Renderer2` passed in from the directive
     * @param src The original src of the image that is set on the `ngSrc` input.
     * @param srcset The parsed and formatted srcset created from the `ngSrcset` input
     * @param sizes The value of the `sizes` attribute passed in to the `<img>` tag
     */
    createPreloadLinkTag(renderer, src, srcset, sizes) {
        if (ngDevMode &&
            !this.errorShown &&
            this.preloadedImages.size >= DEFAULT_PRELOADED_IMAGES_LIMIT) {
            this.errorShown = true;
            console.warn(_formatRuntimeError(2961 /* RuntimeErrorCode.TOO_MANY_PRELOADED_IMAGES */, `The \`NgOptimizedImage\` directive has detected that more than ` +
                `${DEFAULT_PRELOADED_IMAGES_LIMIT} images were marked as priority. ` +
                `This might negatively affect an overall performance of the page. ` +
                `To fix this, remove the "priority" attribute from images with less priority.`));
        }
        if (this.preloadedImages.has(src)) {
            return;
        }
        this.preloadedImages.add(src);
        const preload = renderer.createElement('link');
        renderer.setAttribute(preload, 'as', 'image');
        renderer.setAttribute(preload, 'href', src);
        renderer.setAttribute(preload, 'rel', 'preload');
        renderer.setAttribute(preload, 'fetchpriority', 'high');
        if (sizes) {
            renderer.setAttribute(preload, 'imageSizes', sizes);
        }
        if (srcset) {
            renderer.setAttribute(preload, 'imageSrcset', srcset);
        }
        renderer.appendChild(this.document.head, preload);
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreloadLinkCreator, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreloadLinkCreator, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreloadLinkCreator, decorators: [{
            type: Injectable,
            args: [{ providedIn: 'root' }]
        }] });

/**
 * When a Base64-encoded image is passed as an input to the `NgOptimizedImage` directive,
 * an error is thrown. The image content (as a string) might be very long, thus making
 * it hard to read an error message if the entire string is included. This const defines
 * the number of characters that should be included into the error message. The rest
 * of the content is truncated.
 */
const BASE64_IMG_MAX_LENGTH_IN_ERROR = 50;
/**
 * RegExpr to determine whether a src in a srcset is using width descriptors.
 * Should match something like: "100w, 200w".
 */
const VALID_WIDTH_DESCRIPTOR_SRCSET = /^((\s*\d+w\s*(,|$)){1,})$/;
/**
 * RegExpr to determine whether a src in a srcset is using density descriptors.
 * Should match something like: "1x, 2x, 50x". Also supports decimals like "1.5x, 1.50x".
 */
const VALID_DENSITY_DESCRIPTOR_SRCSET = /^((\s*\d+(\.\d+)?x\s*(,|$)){1,})$/;
/**
 * Srcset values with a density descriptor higher than this value will actively
 * throw an error. Such densities are not permitted as they cause image sizes
 * to be unreasonably large and slow down LCP.
 */
const ABSOLUTE_SRCSET_DENSITY_CAP = 3;
/**
 * Used only in error message text to communicate best practices, as we will
 * only throw based on the slightly more conservative ABSOLUTE_SRCSET_DENSITY_CAP.
 */
const RECOMMENDED_SRCSET_DENSITY_CAP = 2;
/**
 * Used in generating automatic density-based srcsets
 */
const DENSITY_SRCSET_MULTIPLIERS = [1, 2];
/**
 * Used to determine which breakpoints to use on full-width images
 */
const VIEWPORT_BREAKPOINT_CUTOFF = 640;
/**
 * Used to determine whether two aspect ratios are similar in value.
 */
const ASPECT_RATIO_TOLERANCE = 0.1;
/**
 * Used to determine whether the image has been requested at an overly
 * large size compared to the actual rendered image size (after taking
 * into account a typical device pixel ratio). In pixels.
 */
const OVERSIZED_IMAGE_TOLERANCE = 1000;
/**
 * Used to limit automatic srcset generation of very large sources for
 * fixed-size images. In pixels.
 */
const FIXED_SRCSET_WIDTH_LIMIT = 1920;
const FIXED_SRCSET_HEIGHT_LIMIT = 1080;
/**
 * Default blur radius of the CSS filter used on placeholder images, in pixels
 */
const PLACEHOLDER_BLUR_AMOUNT = 15;
/**
 * Placeholder dimension (height or width) limit in pixels. Angular produces a warning
 * when this limit is crossed.
 */
const PLACEHOLDER_DIMENSION_LIMIT = 1000;
/**
 * Used to warn or error when the user provides an overly large dataURL for the placeholder
 * attribute.
 * Character count of Base64 images is 1 character per byte, and base64 encoding is approximately
 * 33% larger than base images, so 4000 characters is around 3KB on disk and 10000 characters is
 * around 7.7KB. Experimentally, 4000 characters is about 20x20px in PNG or medium-quality JPEG
 * format, and 10,000 is around 50x50px, but there's quite a bit of variation depending on how the
 * image is saved.
 */
const DATA_URL_WARN_LIMIT = 4000;
const DATA_URL_ERROR_LIMIT = 10000;
/** Info about built-in loaders we can test for. */
const BUILT_IN_LOADERS = [
    imgixLoaderInfo,
    imageKitLoaderInfo,
    cloudinaryLoaderInfo,
    netlifyLoaderInfo,
];
/**
 * Threshold for the PRIORITY_TRUE_COUNT
 */
const PRIORITY_COUNT_THRESHOLD = 10;
/**
 * This count is used to log a devMode warning
 * when the count of directive instances with priority=true
 * exceeds the threshold PRIORITY_COUNT_THRESHOLD
 */
let IMGS_WITH_PRIORITY_ATTR_COUNT = 0;
/**
 * Directive that improves image loading performance by enforcing best practices.
 *
 * `NgOptimizedImage` ensures that the loading of the Largest Contentful Paint (LCP) image is
 * prioritized by:
 * - Automatically setting the `fetchpriority` attribute on the `<img>` tag
 * - Lazy loading non-priority images by default
 * - Automatically generating a preconnect link tag in the document head
 *
 * In addition, the directive:
 * - Generates appropriate asset URLs if a corresponding `ImageLoader` function is provided
 * - Automatically generates a srcset
 * - Requires that `width` and `height` are set
 * - Warns if `width` or `height` have been set incorrectly
 * - Warns if the image will be visually distorted when rendered
 *
 * @usageNotes
 * The `NgOptimizedImage` directive is marked as [standalone](guide/components/importing) and can
 * be imported directly.
 *
 * Follow the steps below to enable and use the directive:
 * 1. Import it into the necessary NgModule or a standalone Component.
 * 2. Optionally provide an `ImageLoader` if you use an image hosting service.
 * 3. Update the necessary `<img>` tags in templates and replace `src` attributes with `ngSrc`.
 * Using a `ngSrc` allows the directive to control when the `src` gets set, which triggers an image
 * download.
 *
 * Step 1: import the `NgOptimizedImage` directive.
 *
 * ```ts
 * import { NgOptimizedImage } from '@angular/common';
 *
 * // Include it into the necessary NgModule
 * @NgModule({
 *   imports: [NgOptimizedImage],
 * })
 * class AppModule {}
 *
 * // ... or a standalone Component
 * @Component({
 *   imports: [NgOptimizedImage],
 * })
 * class MyStandaloneComponent {}
 * ```
 *
 * Step 2: configure a loader.
 *
 * To use the **default loader**: no additional code changes are necessary. The URL returned by the
 * generic loader will always match the value of "src". In other words, this loader applies no
 * transformations to the resource URL and the value of the `ngSrc` attribute will be used as is.
 *
 * To use an existing loader for a **third-party image service**: add the provider factory for your
 * chosen service to the `providers` array. In the example below, the Imgix loader is used:
 *
 * ```ts
 * import {provideImgixLoader} from '@angular/common';
 *
 * // Call the function and add the result to the `providers` array:
 * providers: [
 *   provideImgixLoader("https://my.base.url/"),
 * ],
 * ```
 *
 * The `NgOptimizedImage` directive provides the following functions:
 * - `provideCloudflareLoader`
 * - `provideCloudinaryLoader`
 * - `provideImageKitLoader`
 * - `provideImgixLoader`
 *
 * If you use a different image provider, you can create a custom loader function as described
 * below.
 *
 * To use a **custom loader**: provide your loader function as a value for the `IMAGE_LOADER` DI
 * token.
 *
 * ```ts
 * import {IMAGE_LOADER, ImageLoaderConfig} from '@angular/common';
 *
 * // Configure the loader using the `IMAGE_LOADER` token.
 * providers: [
 *   {
 *      provide: IMAGE_LOADER,
 *      useValue: (config: ImageLoaderConfig) => {
 *        return `https://example.com/${config.src}-${config.width}.jpg`;
 *      }
 *   },
 * ],
 * ```
 *
 * Step 3: update `<img>` tags in templates to use `ngSrc` instead of `src`.
 *
 * ```html
 * <img ngSrc="logo.png" width="200" height="100">
 * ```
 *
 * @publicApi
 */
class NgOptimizedImage {
    imageLoader = inject(IMAGE_LOADER);
    config = processConfig(inject(_IMAGE_CONFIG));
    renderer = inject(Renderer2);
    imgElement = inject(ElementRef).nativeElement;
    injector = inject(Injector);
    // An LCP image observer should be injected only in development mode.
    // Do not assign it to `null` to avoid having a redundant property in the production bundle.
    lcpObserver;
    /**
     * Calculate the rewritten `src` once and store it.
     * This is needed to avoid repetitive calculations and make sure the directive cleanup in the
     * `ngOnDestroy` does not rely on the `IMAGE_LOADER` logic (which in turn can rely on some other
     * instance that might be already destroyed).
     */
    _renderedSrc = null;
    /**
     * Name of the source image.
     * Image name will be processed by the image loader and the final URL will be applied as the `src`
     * property of the image.
     */
    ngSrc;
    /**
     * A comma separated list of width or density descriptors.
     * The image name will be taken from `ngSrc` and combined with the list of width or density
     * descriptors to generate the final `srcset` property of the image.
     *
     * Example:
     * ```html
     * <img ngSrc="hello.jpg" ngSrcset="100w, 200w" />  =>
     * <img src="path/hello.jpg" srcset="path/hello.jpg?w=100 100w, path/hello.jpg?w=200 200w" />
     * ```
     */
    ngSrcset;
    /**
     * The base `sizes` attribute passed through to the `<img>` element.
     * Providing sizes causes the image to create an automatic responsive srcset.
     */
    sizes;
    /**
     * For responsive images: the intrinsic width of the image in pixels.
     * For fixed size images: the desired rendered width of the image in pixels.
     */
    width;
    /**
     * For responsive images: the intrinsic height of the image in pixels.
     * For fixed size images: the desired rendered height of the image in pixels.
     */
    height;
    /**
     * The desired loading behavior (lazy, eager, or auto). Defaults to `lazy`,
     * which is recommended for most images.
     *
     * Warning: Setting images as loading="eager" or loading="auto" marks them
     * as non-priority images and can hurt loading performance. For images which
     * may be the LCP element, use the `priority` attribute instead of `loading`.
     */
    loading;
    /**
     * Indicates whether this image should have a high priority.
     */
    priority = false;
    /**
     * Data to pass through to custom loaders.
     */
    loaderParams;
    /**
     * Disables automatic srcset generation for this image.
     */
    disableOptimizedSrcset = false;
    /**
     * Sets the image to "fill mode", which eliminates the height/width requirement and adds
     * styles such that the image fills its containing element.
     */
    fill = false;
    /**
     * A URL or data URL for an image to be used as a placeholder while this image loads.
     */
    placeholder;
    /**
     * Configuration object for placeholder settings. Options:
     *   * blur: Setting this to false disables the automatic CSS blur.
     */
    placeholderConfig;
    /**
     * Value of the `src` attribute if set on the host `<img>` element.
     * This input is exclusively read to assert that `src` is not set in conflict
     * with `ngSrc` and that images don't start to load until a lazy loading strategy is set.
     * @internal
     */
    src;
    /**
     * Value of the `srcset` attribute if set on the host `<img>` element.
     * This input is exclusively read to assert that `srcset` is not set in conflict
     * with `ngSrcset` and that images don't start to load until a lazy loading strategy is set.
     * @internal
     */
    srcset;
    constructor() {
        if (ngDevMode) {
            this.lcpObserver = this.injector.get(LCPImageObserver);
            // Using `DestroyRef` to avoid having an empty `ngOnDestroy` method since this
            // is only run in development mode.
            const destroyRef = inject(DestroyRef);
            destroyRef.onDestroy(() => {
                if (!this.priority && this._renderedSrc !== null) {
                    this.lcpObserver.unregisterImage(this._renderedSrc);
                }
            });
        }
    }
    /** @docs-private */
    ngOnInit() {
        _performanceMarkFeature('NgOptimizedImage');
        if (ngDevMode) {
            const ngZone = this.injector.get(NgZone);
            assertNonEmptyInput(this, 'ngSrc', this.ngSrc);
            assertValidNgSrcset(this, this.ngSrcset);
            assertNoConflictingSrc(this);
            if (this.ngSrcset) {
                assertNoConflictingSrcset(this);
            }
            assertNotBase64Image(this);
            assertNotBlobUrl(this);
            if (this.fill) {
                assertEmptyWidthAndHeight(this);
                // This leaves the Angular zone to avoid triggering unnecessary change detection cycles when
                // `load` tasks are invoked on images.
                ngZone.runOutsideAngular(() => assertNonZeroRenderedHeight(this, this.imgElement, this.renderer));
            }
            else {
                assertNonEmptyWidthAndHeight(this);
                if (this.height !== undefined) {
                    assertGreaterThanZero(this, this.height, 'height');
                }
                if (this.width !== undefined) {
                    assertGreaterThanZero(this, this.width, 'width');
                }
                // Only check for distorted images when not in fill mode, where
                // images may be intentionally stretched, cropped or letterboxed.
                ngZone.runOutsideAngular(() => assertNoImageDistortion(this, this.imgElement, this.renderer));
            }
            assertValidLoadingInput(this);
            if (!this.ngSrcset) {
                assertNoComplexSizes(this);
            }
            assertValidPlaceholder(this, this.imageLoader);
            assertNotMissingBuiltInLoader(this.ngSrc, this.imageLoader);
            assertNoNgSrcsetWithoutLoader(this, this.imageLoader);
            assertNoLoaderParamsWithoutLoader(this, this.imageLoader);
            ngZone.runOutsideAngular(() => {
                this.lcpObserver.registerImage(this.getRewrittenSrc(), this.ngSrc, this.priority);
            });
            if (this.priority) {
                const checker = this.injector.get(PreconnectLinkChecker);
                checker.assertPreconnect(this.getRewrittenSrc(), this.ngSrc);
                if (typeof ngServerMode !== 'undefined' && !ngServerMode) {
                    const applicationRef = this.injector.get(ApplicationRef);
                    assetPriorityCountBelowThreshold(applicationRef);
                }
            }
        }
        if (this.placeholder) {
            this.removePlaceholderOnLoad(this.imgElement);
        }
        this.setHostAttributes();
    }
    setHostAttributes() {
        // Must set width/height explicitly in case they are bound (in which case they will
        // only be reflected and not found by the browser)
        if (this.fill) {
            this.sizes ||= '100vw';
        }
        else {
            this.setHostAttribute('width', this.width.toString());
            this.setHostAttribute('height', this.height.toString());
        }
        this.setHostAttribute('loading', this.getLoadingBehavior());
        this.setHostAttribute('fetchpriority', this.getFetchPriority());
        // The `data-ng-img` attribute flags an image as using the directive, to allow
        // for analysis of the directive's performance.
        this.setHostAttribute('ng-img', 'true');
        // The `src` and `srcset` attributes should be set last since other attributes
        // could affect the image's loading behavior.
        const rewrittenSrcset = this.updateSrcAndSrcset();
        if (this.sizes) {
            if (this.getLoadingBehavior() === 'lazy') {
                this.setHostAttribute('sizes', 'auto, ' + this.sizes);
            }
            else {
                this.setHostAttribute('sizes', this.sizes);
            }
        }
        else {
            if (this.ngSrcset &&
                VALID_WIDTH_DESCRIPTOR_SRCSET.test(this.ngSrcset) &&
                this.getLoadingBehavior() === 'lazy') {
                this.setHostAttribute('sizes', 'auto, 100vw');
            }
        }
        if (typeof ngServerMode !== 'undefined' && ngServerMode && this.priority) {
            const preloadLinkCreator = this.injector.get(PreloadLinkCreator);
            preloadLinkCreator.createPreloadLinkTag(this.renderer, this.getRewrittenSrc(), rewrittenSrcset, this.sizes);
        }
    }
    /** @docs-private */
    ngOnChanges(changes) {
        if (ngDevMode) {
            assertNoPostInitInputChange(this, changes, [
                'ngSrcset',
                'width',
                'height',
                'priority',
                'fill',
                'loading',
                'sizes',
                'loaderParams',
                'disableOptimizedSrcset',
            ]);
        }
        if (changes['ngSrc'] && !changes['ngSrc'].isFirstChange()) {
            const oldSrc = this._renderedSrc;
            this.updateSrcAndSrcset(true);
            if (ngDevMode) {
                const newSrc = this._renderedSrc;
                if (oldSrc && newSrc && oldSrc !== newSrc) {
                    const ngZone = this.injector.get(NgZone);
                    ngZone.runOutsideAngular(() => {
                        this.lcpObserver.updateImage(oldSrc, newSrc);
                    });
                }
            }
        }
        if (ngDevMode &&
            changes['placeholder']?.currentValue &&
            typeof ngServerMode !== 'undefined' &&
            !ngServerMode) {
            assertPlaceholderDimensions(this, this.imgElement);
        }
    }
    callImageLoader(configWithoutCustomParams) {
        let augmentedConfig = configWithoutCustomParams;
        if (this.loaderParams) {
            augmentedConfig.loaderParams = this.loaderParams;
        }
        return this.imageLoader(augmentedConfig);
    }
    getLoadingBehavior() {
        if (!this.priority && this.loading !== undefined) {
            return this.loading;
        }
        return this.priority ? 'eager' : 'lazy';
    }
    getFetchPriority() {
        return this.priority ? 'high' : 'auto';
    }
    getRewrittenSrc() {
        // ImageLoaderConfig supports setting a width property. However, we're not setting width here
        // because if the developer uses rendered width instead of intrinsic width in the HTML width
        // attribute, the image requested may be too small for 2x+ screens.
        if (!this._renderedSrc) {
            const imgConfig = { src: this.ngSrc };
            // Cache calculated image src to reuse it later in the code.
            this._renderedSrc = this.callImageLoader(imgConfig);
        }
        return this._renderedSrc;
    }
    getRewrittenSrcset() {
        const widthSrcSet = VALID_WIDTH_DESCRIPTOR_SRCSET.test(this.ngSrcset);
        const finalSrcs = this.ngSrcset
            .split(',')
            .filter((src) => src !== '')
            .map((srcStr) => {
            srcStr = srcStr.trim();
            const width = widthSrcSet ? parseFloat(srcStr) : parseFloat(srcStr) * this.width;
            return `${this.callImageLoader({ src: this.ngSrc, width })} ${srcStr}`;
        });
        return finalSrcs.join(', ');
    }
    getAutomaticSrcset() {
        if (this.sizes) {
            return this.getResponsiveSrcset();
        }
        else {
            return this.getFixedSrcset();
        }
    }
    getResponsiveSrcset() {
        const { breakpoints } = this.config;
        let filteredBreakpoints = breakpoints;
        if (this.sizes?.trim() === '100vw') {
            // Since this is a full-screen-width image, our srcset only needs to include
            // breakpoints with full viewport widths.
            filteredBreakpoints = breakpoints.filter((bp) => bp >= VIEWPORT_BREAKPOINT_CUTOFF);
        }
        const finalSrcs = filteredBreakpoints.map((bp) => `${this.callImageLoader({ src: this.ngSrc, width: bp })} ${bp}w`);
        return finalSrcs.join(', ');
    }
    updateSrcAndSrcset(forceSrcRecalc = false) {
        if (forceSrcRecalc) {
            // Reset cached value, so that the followup `getRewrittenSrc()` call
            // will recalculate it and update the cache.
            this._renderedSrc = null;
        }
        const rewrittenSrc = this.getRewrittenSrc();
        this.setHostAttribute('src', rewrittenSrc);
        let rewrittenSrcset = undefined;
        if (this.ngSrcset) {
            rewrittenSrcset = this.getRewrittenSrcset();
        }
        else if (this.shouldGenerateAutomaticSrcset()) {
            rewrittenSrcset = this.getAutomaticSrcset();
        }
        if (rewrittenSrcset) {
            this.setHostAttribute('srcset', rewrittenSrcset);
        }
        return rewrittenSrcset;
    }
    getFixedSrcset() {
        const finalSrcs = DENSITY_SRCSET_MULTIPLIERS.map((multiplier) => `${this.callImageLoader({
            src: this.ngSrc,
            width: this.width * multiplier,
        })} ${multiplier}x`);
        return finalSrcs.join(', ');
    }
    shouldGenerateAutomaticSrcset() {
        let oversizedImage = false;
        if (!this.sizes) {
            oversizedImage =
                this.width > FIXED_SRCSET_WIDTH_LIMIT || this.height > FIXED_SRCSET_HEIGHT_LIMIT;
        }
        return (!this.disableOptimizedSrcset &&
            !this.srcset &&
            this.imageLoader !== noopImageLoader &&
            !oversizedImage);
    }
    /**
     * Returns an image url formatted for use with the CSS background-image property. Expects one of:
     * * A base64 encoded image, which is wrapped and passed through.
     * * A boolean. If true, calls the image loader to generate a small placeholder url.
     */
    generatePlaceholder(placeholderInput) {
        const { placeholderResolution } = this.config;
        if (placeholderInput === true) {
            return `url(${this.callImageLoader({
                src: this.ngSrc,
                width: placeholderResolution,
                isPlaceholder: true,
            })})`;
        }
        else if (typeof placeholderInput === 'string') {
            return `url(${placeholderInput})`;
        }
        return null;
    }
    /**
     * Determines if blur should be applied, based on an optional boolean
     * property `blur` within the optional configuration object `placeholderConfig`.
     */
    shouldBlurPlaceholder(placeholderConfig) {
        if (!placeholderConfig || !placeholderConfig.hasOwnProperty('blur')) {
            return true;
        }
        return Boolean(placeholderConfig.blur);
    }
    removePlaceholderOnLoad(img) {
        const callback = () => {
            const changeDetectorRef = this.injector.get(ChangeDetectorRef);
            removeLoadListenerFn();
            removeErrorListenerFn();
            this.placeholder = false;
            changeDetectorRef.markForCheck();
        };
        const removeLoadListenerFn = this.renderer.listen(img, 'load', callback);
        const removeErrorListenerFn = this.renderer.listen(img, 'error', callback);
        callOnLoadIfImageIsLoaded(img, callback);
    }
    setHostAttribute(name, value) {
        this.renderer.setAttribute(this.imgElement, name, value);
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgOptimizedImage, deps: [], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "19.2.14", type: NgOptimizedImage, isStandalone: true, selector: "img[ngSrc]", inputs: { ngSrc: ["ngSrc", "ngSrc", unwrapSafeUrl], ngSrcset: "ngSrcset", sizes: "sizes", width: ["width", "width", numberAttribute], height: ["height", "height", numberAttribute], loading: "loading", priority: ["priority", "priority", booleanAttribute], loaderParams: "loaderParams", disableOptimizedSrcset: ["disableOptimizedSrcset", "disableOptimizedSrcset", booleanAttribute], fill: ["fill", "fill", booleanAttribute], placeholder: ["placeholder", "placeholder", booleanOrUrlAttribute], placeholderConfig: "placeholderConfig", src: "src", srcset: "srcset" }, host: { properties: { "style.position": "fill ? \"absolute\" : null", "style.width": "fill ? \"100%\" : null", "style.height": "fill ? \"100%\" : null", "style.inset": "fill ? \"0\" : null", "style.background-size": "placeholder ? \"cover\" : null", "style.background-position": "placeholder ? \"50% 50%\" : null", "style.background-repeat": "placeholder ? \"no-repeat\" : null", "style.background-image": "placeholder ? generatePlaceholder(placeholder) : null", "style.filter": "placeholder && shouldBlurPlaceholder(placeholderConfig) ? \"blur(15px)\" : null" } }, usesOnChanges: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgOptimizedImage, decorators: [{
            type: Directive,
            args: [{
                    selector: 'img[ngSrc]',
                    host: {
                        '[style.position]': 'fill ? "absolute" : null',
                        '[style.width]': 'fill ? "100%" : null',
                        '[style.height]': 'fill ? "100%" : null',
                        '[style.inset]': 'fill ? "0" : null',
                        '[style.background-size]': 'placeholder ? "cover" : null',
                        '[style.background-position]': 'placeholder ? "50% 50%" : null',
                        '[style.background-repeat]': 'placeholder ? "no-repeat" : null',
                        '[style.background-image]': 'placeholder ? generatePlaceholder(placeholder) : null',
                        '[style.filter]': `placeholder && shouldBlurPlaceholder(placeholderConfig) ? "blur(${PLACEHOLDER_BLUR_AMOUNT}px)" : null`,
                    },
                }]
        }], ctorParameters: () => [], propDecorators: { ngSrc: [{
                type: Input,
                args: [{ required: true, transform: unwrapSafeUrl }]
            }], ngSrcset: [{
                type: Input
            }], sizes: [{
                type: Input
            }], width: [{
                type: Input,
                args: [{ transform: numberAttribute }]
            }], height: [{
                type: Input,
                args: [{ transform: numberAttribute }]
            }], loading: [{
                type: Input
            }], priority: [{
                type: Input,
                args: [{ transform: booleanAttribute }]
            }], loaderParams: [{
                type: Input
            }], disableOptimizedSrcset: [{
                type: Input,
                args: [{ transform: booleanAttribute }]
            }], fill: [{
                type: Input,
                args: [{ transform: booleanAttribute }]
            }], placeholder: [{
                type: Input,
                args: [{ transform: booleanOrUrlAttribute }]
            }], placeholderConfig: [{
                type: Input
            }], src: [{
                type: Input
            }], srcset: [{
                type: Input
            }] } });
/***** Helpers *****/
/**
 * Sorts provided config breakpoints and uses defaults.
 */
function processConfig(config) {
    let sortedBreakpoints = {};
    if (config.breakpoints) {
        sortedBreakpoints.breakpoints = config.breakpoints.sort((a, b) => a - b);
    }
    return Object.assign({}, _IMAGE_CONFIG_DEFAULTS, config, sortedBreakpoints);
}
/***** Assert functions *****/
/**
 * Verifies that there is no `src` set on a host element.
 */
function assertNoConflictingSrc(dir) {
    if (dir.src) {
        throw new _RuntimeError(2950 /* RuntimeErrorCode.UNEXPECTED_SRC_ATTR */, `${imgDirectiveDetails(dir.ngSrc)} both \`src\` and \`ngSrc\` have been set. ` +
            `Supplying both of these attributes breaks lazy loading. ` +
            `The NgOptimizedImage directive sets \`src\` itself based on the value of \`ngSrc\`. ` +
            `To fix this, please remove the \`src\` attribute.`);
    }
}
/**
 * Verifies that there is no `srcset` set on a host element.
 */
function assertNoConflictingSrcset(dir) {
    if (dir.srcset) {
        throw new _RuntimeError(2951 /* RuntimeErrorCode.UNEXPECTED_SRCSET_ATTR */, `${imgDirectiveDetails(dir.ngSrc)} both \`srcset\` and \`ngSrcset\` have been set. ` +
            `Supplying both of these attributes breaks lazy loading. ` +
            `The NgOptimizedImage directive sets \`srcset\` itself based on the value of ` +
            `\`ngSrcset\`. To fix this, please remove the \`srcset\` attribute.`);
    }
}
/**
 * Verifies that the `ngSrc` is not a Base64-encoded image.
 */
function assertNotBase64Image(dir) {
    let ngSrc = dir.ngSrc.trim();
    if (ngSrc.startsWith('data:')) {
        if (ngSrc.length > BASE64_IMG_MAX_LENGTH_IN_ERROR) {
            ngSrc = ngSrc.substring(0, BASE64_IMG_MAX_LENGTH_IN_ERROR) + '...';
        }
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc, false)} \`ngSrc\` is a Base64-encoded string ` +
            `(${ngSrc}). NgOptimizedImage does not support Base64-encoded strings. ` +
            `To fix this, disable the NgOptimizedImage directive for this element ` +
            `by removing \`ngSrc\` and using a standard \`src\` attribute instead.`);
    }
}
/**
 * Verifies that the 'sizes' only includes responsive valueb$s.
 */
function assertNoComplexSizes(dir) {
    let sizes = dir.sizes;
    if (sizes?.match(/((\)|,)\s|^)\d+px/)) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc, false)} \`sizes\` was set to a string including ` +
            `pixel values. For automatic \`srcset\` generation, \`sizes\` must only include responsive ` +
            `values, such as \`sizes="50vw"\` or \`sizes="(min-width: 768px) 50vw, 100vw"\`. ` +
            `To fix this, modify the \`sizes\` attribute, or provide your own \`ngSrcset\` value directly.`);
    }
}
function assertValidPlaceholder(dir, imageLoader) {
    assertNoPlaceholderConfigWithoutPlaceholder(dir);
    assertNoRelativePlaceholderWithoutLoader(dir, imageLoader);
    assertNoOversizedDataUrl(dir);
}
/**
 * Verifies that placeholderConfig isn't being used without placeholder
 */
function assertNoPlaceholderConfigWithoutPlaceholder(dir) {
    if (dir.placeholderConfig && !dir.placeholder) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc, false)} \`placeholderConfig\` options were provided for an ` +
            `image that does not use the \`placeholder\` attribute, and will have no effect.`);
    }
}
/**
 * Warns if a relative URL placeholder is specified, but no loader is present to provide the small
 * image.
 */
function assertNoRelativePlaceholderWithoutLoader(dir, imageLoader) {
    if (dir.placeholder === true && imageLoader === noopImageLoader) {
        throw new _RuntimeError(2963 /* RuntimeErrorCode.MISSING_NECESSARY_LOADER */, `${imgDirectiveDetails(dir.ngSrc)} the \`placeholder\` attribute is set to true but ` +
            `no image loader is configured (i.e. the default one is being used), ` +
            `which would result in the same image being used for the primary image and its placeholder. ` +
            `To fix this, provide a loader or remove the \`placeholder\` attribute from the image.`);
    }
}
/**
 * Warns or throws an error if an oversized dataURL placeholder is provided.
 */
function assertNoOversizedDataUrl(dir) {
    if (dir.placeholder &&
        typeof dir.placeholder === 'string' &&
        dir.placeholder.startsWith('data:')) {
        if (dir.placeholder.length > DATA_URL_ERROR_LIMIT) {
            throw new _RuntimeError(2965 /* RuntimeErrorCode.OVERSIZED_PLACEHOLDER */, `${imgDirectiveDetails(dir.ngSrc)} the \`placeholder\` attribute is set to a data URL which is longer ` +
                `than ${DATA_URL_ERROR_LIMIT} characters. This is strongly discouraged, as large inline placeholders ` +
                `directly increase the bundle size of Angular and hurt page load performance. To fix this, generate ` +
                `a smaller data URL placeholder.`);
        }
        if (dir.placeholder.length > DATA_URL_WARN_LIMIT) {
            console.warn(_formatRuntimeError(2965 /* RuntimeErrorCode.OVERSIZED_PLACEHOLDER */, `${imgDirectiveDetails(dir.ngSrc)} the \`placeholder\` attribute is set to a data URL which is longer ` +
                `than ${DATA_URL_WARN_LIMIT} characters. This is discouraged, as large inline placeholders ` +
                `directly increase the bundle size of Angular and hurt page load performance. For better loading performance, ` +
                `generate a smaller data URL placeholder.`));
        }
    }
}
/**
 * Verifies that the `ngSrc` is not a Blob URL.
 */
function assertNotBlobUrl(dir) {
    const ngSrc = dir.ngSrc.trim();
    if (ngSrc.startsWith('blob:')) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} \`ngSrc\` was set to a blob URL (${ngSrc}). ` +
            `Blob URLs are not supported by the NgOptimizedImage directive. ` +
            `To fix this, disable the NgOptimizedImage directive for this element ` +
            `by removing \`ngSrc\` and using a regular \`src\` attribute instead.`);
    }
}
/**
 * Verifies that the input is set to a non-empty string.
 */
function assertNonEmptyInput(dir, name, value) {
    const isString = typeof value === 'string';
    const isEmptyString = isString && value.trim() === '';
    if (!isString || isEmptyString) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} \`${name}\` has an invalid value ` +
            `(\`${value}\`). To fix this, change the value to a non-empty string.`);
    }
}
/**
 * Verifies that the `ngSrcset` is in a valid format, e.g. "100w, 200w" or "1x, 2x".
 */
function assertValidNgSrcset(dir, value) {
    if (value == null)
        return;
    assertNonEmptyInput(dir, 'ngSrcset', value);
    const stringVal = value;
    const isValidWidthDescriptor = VALID_WIDTH_DESCRIPTOR_SRCSET.test(stringVal);
    const isValidDensityDescriptor = VALID_DENSITY_DESCRIPTOR_SRCSET.test(stringVal);
    if (isValidDensityDescriptor) {
        assertUnderDensityCap(dir, stringVal);
    }
    const isValidSrcset = isValidWidthDescriptor || isValidDensityDescriptor;
    if (!isValidSrcset) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} \`ngSrcset\` has an invalid value (\`${value}\`). ` +
            `To fix this, supply \`ngSrcset\` using a comma-separated list of one or more width ` +
            `descriptors (e.g. "100w, 200w") or density descriptors (e.g. "1x, 2x").`);
    }
}
function assertUnderDensityCap(dir, value) {
    const underDensityCap = value
        .split(',')
        .every((num) => num === '' || parseFloat(num) <= ABSOLUTE_SRCSET_DENSITY_CAP);
    if (!underDensityCap) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} the \`ngSrcset\` contains an unsupported image density:` +
            `\`${value}\`. NgOptimizedImage generally recommends a max image density of ` +
            `${RECOMMENDED_SRCSET_DENSITY_CAP}x but supports image densities up to ` +
            `${ABSOLUTE_SRCSET_DENSITY_CAP}x. The human eye cannot distinguish between image densities ` +
            `greater than ${RECOMMENDED_SRCSET_DENSITY_CAP}x - which makes them unnecessary for ` +
            `most use cases. Images that will be pinch-zoomed are typically the primary use case for ` +
            `${ABSOLUTE_SRCSET_DENSITY_CAP}x images. Please remove the high density descriptor and try again.`);
    }
}
/**
 * Creates a `RuntimeError` instance to represent a situation when an input is set after
 * the directive has initialized.
 */
function postInitInputChangeError(dir, inputName) {
    let reason;
    if (inputName === 'width' || inputName === 'height') {
        reason =
            `Changing \`${inputName}\` may result in different attribute value ` +
                `applied to the underlying image element and cause layout shifts on a page.`;
    }
    else {
        reason =
            `Changing the \`${inputName}\` would have no effect on the underlying ` +
                `image element, because the resource loading has already occurred.`;
    }
    return new _RuntimeError(2953 /* RuntimeErrorCode.UNEXPECTED_INPUT_CHANGE */, `${imgDirectiveDetails(dir.ngSrc)} \`${inputName}\` was updated after initialization. ` +
        `The NgOptimizedImage directive will not react to this input change. ${reason} ` +
        `To fix this, either switch \`${inputName}\` to a static value ` +
        `or wrap the image element in an @if that is gated on the necessary value.`);
}
/**
 * Verify that none of the listed inputs has changed.
 */
function assertNoPostInitInputChange(dir, changes, inputs) {
    inputs.forEach((input) => {
        const isUpdated = changes.hasOwnProperty(input);
        if (isUpdated && !changes[input].isFirstChange()) {
            if (input === 'ngSrc') {
                // When the `ngSrc` input changes, we detect that only in the
                // `ngOnChanges` hook, thus the `ngSrc` is already set. We use
                // `ngSrc` in the error message, so we use a previous value, but
                // not the updated one in it.
                dir = { ngSrc: changes[input].previousValue };
            }
            throw postInitInputChangeError(dir, input);
        }
    });
}
/**
 * Verifies that a specified input is a number greater than 0.
 */
function assertGreaterThanZero(dir, inputValue, inputName) {
    const validNumber = typeof inputValue === 'number' && inputValue > 0;
    const validString = typeof inputValue === 'string' && /^\d+$/.test(inputValue.trim()) && parseInt(inputValue) > 0;
    if (!validNumber && !validString) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} \`${inputName}\` has an invalid value. ` +
            `To fix this, provide \`${inputName}\` as a number greater than 0.`);
    }
}
/**
 * Verifies that the rendered image is not visually distorted. Effectively this is checking:
 * - Whether the "width" and "height" attributes reflect the actual dimensions of the image.
 * - Whether image styling is "correct" (see below for a longer explanation).
 */
function assertNoImageDistortion(dir, img, renderer) {
    const callback = () => {
        removeLoadListenerFn();
        removeErrorListenerFn();
        const computedStyle = window.getComputedStyle(img);
        let renderedWidth = parseFloat(computedStyle.getPropertyValue('width'));
        let renderedHeight = parseFloat(computedStyle.getPropertyValue('height'));
        const boxSizing = computedStyle.getPropertyValue('box-sizing');
        if (boxSizing === 'border-box') {
            const paddingTop = computedStyle.getPropertyValue('padding-top');
            const paddingRight = computedStyle.getPropertyValue('padding-right');
            const paddingBottom = computedStyle.getPropertyValue('padding-bottom');
            const paddingLeft = computedStyle.getPropertyValue('padding-left');
            renderedWidth -= parseFloat(paddingRight) + parseFloat(paddingLeft);
            renderedHeight -= parseFloat(paddingTop) + parseFloat(paddingBottom);
        }
        const renderedAspectRatio = renderedWidth / renderedHeight;
        const nonZeroRenderedDimensions = renderedWidth !== 0 && renderedHeight !== 0;
        const intrinsicWidth = img.naturalWidth;
        const intrinsicHeight = img.naturalHeight;
        const intrinsicAspectRatio = intrinsicWidth / intrinsicHeight;
        const suppliedWidth = dir.width;
        const suppliedHeight = dir.height;
        const suppliedAspectRatio = suppliedWidth / suppliedHeight;
        // Tolerance is used to account for the impact of subpixel rendering.
        // Due to subpixel rendering, the rendered, intrinsic, and supplied
        // aspect ratios of a correctly configured image may not exactly match.
        // For example, a `width=4030 height=3020` image might have a rendered
        // size of "1062w, 796.48h". (An aspect ratio of 1.334... vs. 1.333...)
        const inaccurateDimensions = Math.abs(suppliedAspectRatio - intrinsicAspectRatio) > ASPECT_RATIO_TOLERANCE;
        const stylingDistortion = nonZeroRenderedDimensions &&
            Math.abs(intrinsicAspectRatio - renderedAspectRatio) > ASPECT_RATIO_TOLERANCE;
        if (inaccurateDimensions) {
            console.warn(_formatRuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} the aspect ratio of the image does not match ` +
                `the aspect ratio indicated by the width and height attributes. ` +
                `\nIntrinsic image size: ${intrinsicWidth}w x ${intrinsicHeight}h ` +
                `(aspect-ratio: ${round(intrinsicAspectRatio)}). \nSupplied width and height attributes: ` +
                `${suppliedWidth}w x ${suppliedHeight}h (aspect-ratio: ${round(suppliedAspectRatio)}). ` +
                `\nTo fix this, update the width and height attributes.`));
        }
        else if (stylingDistortion) {
            console.warn(_formatRuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} the aspect ratio of the rendered image ` +
                `does not match the image's intrinsic aspect ratio. ` +
                `\nIntrinsic image size: ${intrinsicWidth}w x ${intrinsicHeight}h ` +
                `(aspect-ratio: ${round(intrinsicAspectRatio)}). \nRendered image size: ` +
                `${renderedWidth}w x ${renderedHeight}h (aspect-ratio: ` +
                `${round(renderedAspectRatio)}). \nThis issue can occur if "width" and "height" ` +
                `attributes are added to an image without updating the corresponding ` +
                `image styling. To fix this, adjust image styling. In most cases, ` +
                `adding "height: auto" or "width: auto" to the image styling will fix ` +
                `this issue.`));
        }
        else if (!dir.ngSrcset && nonZeroRenderedDimensions) {
            // If `ngSrcset` hasn't been set, sanity check the intrinsic size.
            const recommendedWidth = RECOMMENDED_SRCSET_DENSITY_CAP * renderedWidth;
            const recommendedHeight = RECOMMENDED_SRCSET_DENSITY_CAP * renderedHeight;
            const oversizedWidth = intrinsicWidth - recommendedWidth >= OVERSIZED_IMAGE_TOLERANCE;
            const oversizedHeight = intrinsicHeight - recommendedHeight >= OVERSIZED_IMAGE_TOLERANCE;
            if (oversizedWidth || oversizedHeight) {
                console.warn(_formatRuntimeError(2960 /* RuntimeErrorCode.OVERSIZED_IMAGE */, `${imgDirectiveDetails(dir.ngSrc)} the intrinsic image is significantly ` +
                    `larger than necessary. ` +
                    `\nRendered image size: ${renderedWidth}w x ${renderedHeight}h. ` +
                    `\nIntrinsic image size: ${intrinsicWidth}w x ${intrinsicHeight}h. ` +
                    `\nRecommended intrinsic image size: ${recommendedWidth}w x ${recommendedHeight}h. ` +
                    `\nNote: Recommended intrinsic image size is calculated assuming a maximum DPR of ` +
                    `${RECOMMENDED_SRCSET_DENSITY_CAP}. To improve loading time, resize the image ` +
                    `or consider using the "ngSrcset" and "sizes" attributes.`));
            }
        }
    };
    const removeLoadListenerFn = renderer.listen(img, 'load', callback);
    // We only listen to the `error` event to remove the `load` event listener because it will not be
    // fired if the image fails to load. This is done to prevent memory leaks in development mode
    // because image elements aren't garbage-collected properly. It happens because zone.js stores the
    // event listener directly on the element and closures capture `dir`.
    const removeErrorListenerFn = renderer.listen(img, 'error', () => {
        removeLoadListenerFn();
        removeErrorListenerFn();
    });
    callOnLoadIfImageIsLoaded(img, callback);
}
/**
 * Verifies that a specified input is set.
 */
function assertNonEmptyWidthAndHeight(dir) {
    let missingAttributes = [];
    if (dir.width === undefined)
        missingAttributes.push('width');
    if (dir.height === undefined)
        missingAttributes.push('height');
    if (missingAttributes.length > 0) {
        throw new _RuntimeError(2954 /* RuntimeErrorCode.REQUIRED_INPUT_MISSING */, `${imgDirectiveDetails(dir.ngSrc)} these required attributes ` +
            `are missing: ${missingAttributes.map((attr) => `"${attr}"`).join(', ')}. ` +
            `Including "width" and "height" attributes will prevent image-related layout shifts. ` +
            `To fix this, include "width" and "height" attributes on the image tag or turn on ` +
            `"fill" mode with the \`fill\` attribute.`);
    }
}
/**
 * Verifies that width and height are not set. Used in fill mode, where those attributes don't make
 * sense.
 */
function assertEmptyWidthAndHeight(dir) {
    if (dir.width || dir.height) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} the attributes \`height\` and/or \`width\` are present ` +
            `along with the \`fill\` attribute. Because \`fill\` mode causes an image to fill its containing ` +
            `element, the size attributes have no effect and should be removed.`);
    }
}
/**
 * Verifies that the rendered image has a nonzero height. If the image is in fill mode, provides
 * guidance that this can be caused by the containing element's CSS position property.
 */
function assertNonZeroRenderedHeight(dir, img, renderer) {
    const callback = () => {
        removeLoadListenerFn();
        removeErrorListenerFn();
        const renderedHeight = img.clientHeight;
        if (dir.fill && renderedHeight === 0) {
            console.warn(_formatRuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} the height of the fill-mode image is zero. ` +
                `This is likely because the containing element does not have the CSS 'position' ` +
                `property set to one of the following: "relative", "fixed", or "absolute". ` +
                `To fix this problem, make sure the container element has the CSS 'position' ` +
                `property defined and the height of the element is not zero.`));
        }
    };
    const removeLoadListenerFn = renderer.listen(img, 'load', callback);
    // See comments in the `assertNoImageDistortion`.
    const removeErrorListenerFn = renderer.listen(img, 'error', () => {
        removeLoadListenerFn();
        removeErrorListenerFn();
    });
    callOnLoadIfImageIsLoaded(img, callback);
}
/**
 * Verifies that the `loading` attribute is set to a valid input &
 * is not used on priority images.
 */
function assertValidLoadingInput(dir) {
    if (dir.loading && dir.priority) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} the \`loading\` attribute ` +
            `was used on an image that was marked "priority". ` +
            `Setting \`loading\` on priority images is not allowed ` +
            `because these images will always be eagerly loaded. ` +
            `To fix this, remove the “loading” attribute from the priority image.`);
    }
    const validInputs = ['auto', 'eager', 'lazy'];
    if (typeof dir.loading === 'string' && !validInputs.includes(dir.loading)) {
        throw new _RuntimeError(2952 /* RuntimeErrorCode.INVALID_INPUT */, `${imgDirectiveDetails(dir.ngSrc)} the \`loading\` attribute ` +
            `has an invalid value (\`${dir.loading}\`). ` +
            `To fix this, provide a valid value ("lazy", "eager", or "auto").`);
    }
}
/**
 * Warns if NOT using a loader (falling back to the generic loader) and
 * the image appears to be hosted on one of the image CDNs for which
 * we do have a built-in image loader. Suggests switching to the
 * built-in loader.
 *
 * @param ngSrc Value of the ngSrc attribute
 * @param imageLoader ImageLoader provided
 */
function assertNotMissingBuiltInLoader(ngSrc, imageLoader) {
    if (imageLoader === noopImageLoader) {
        let builtInLoaderName = '';
        for (const loader of BUILT_IN_LOADERS) {
            if (loader.testUrl(ngSrc)) {
                builtInLoaderName = loader.name;
                break;
            }
        }
        if (builtInLoaderName) {
            console.warn(_formatRuntimeError(2962 /* RuntimeErrorCode.MISSING_BUILTIN_LOADER */, `NgOptimizedImage: It looks like your images may be hosted on the ` +
                `${builtInLoaderName} CDN, but your app is not using Angular's ` +
                `built-in loader for that CDN. We recommend switching to use ` +
                `the built-in by calling \`provide${builtInLoaderName}Loader()\` ` +
                `in your \`providers\` and passing it your instance's base URL. ` +
                `If you don't want to use the built-in loader, define a custom ` +
                `loader function using IMAGE_LOADER to silence this warning.`));
        }
    }
}
/**
 * Warns if ngSrcset is present and no loader is configured (i.e. the default one is being used).
 */
function assertNoNgSrcsetWithoutLoader(dir, imageLoader) {
    if (dir.ngSrcset && imageLoader === noopImageLoader) {
        console.warn(_formatRuntimeError(2963 /* RuntimeErrorCode.MISSING_NECESSARY_LOADER */, `${imgDirectiveDetails(dir.ngSrc)} the \`ngSrcset\` attribute is present but ` +
            `no image loader is configured (i.e. the default one is being used), ` +
            `which would result in the same image being used for all configured sizes. ` +
            `To fix this, provide a loader or remove the \`ngSrcset\` attribute from the image.`));
    }
}
/**
 * Warns if loaderParams is present and no loader is configured (i.e. the default one is being
 * used).
 */
function assertNoLoaderParamsWithoutLoader(dir, imageLoader) {
    if (dir.loaderParams && imageLoader === noopImageLoader) {
        console.warn(_formatRuntimeError(2963 /* RuntimeErrorCode.MISSING_NECESSARY_LOADER */, `${imgDirectiveDetails(dir.ngSrc)} the \`loaderParams\` attribute is present but ` +
            `no image loader is configured (i.e. the default one is being used), ` +
            `which means that the loaderParams data will not be consumed and will not affect the URL. ` +
            `To fix this, provide a custom loader or remove the \`loaderParams\` attribute from the image.`));
    }
}
/**
 * Warns if the priority attribute is used too often on page load
 */
async function assetPriorityCountBelowThreshold(appRef) {
    if (IMGS_WITH_PRIORITY_ATTR_COUNT === 0) {
        IMGS_WITH_PRIORITY_ATTR_COUNT++;
        await appRef.whenStable();
        if (IMGS_WITH_PRIORITY_ATTR_COUNT > PRIORITY_COUNT_THRESHOLD) {
            console.warn(_formatRuntimeError(2966 /* RuntimeErrorCode.TOO_MANY_PRIORITY_ATTRIBUTES */, `NgOptimizedImage: The "priority" attribute is set to true more than ${PRIORITY_COUNT_THRESHOLD} times (${IMGS_WITH_PRIORITY_ATTR_COUNT} times). ` +
                `Marking too many images as "high" priority can hurt your application's LCP (https://web.dev/lcp). ` +
                `"Priority" should only be set on the image expected to be the page's LCP element.`));
        }
    }
    else {
        IMGS_WITH_PRIORITY_ATTR_COUNT++;
    }
}
/**
 * Warns if placeholder's dimension are over a threshold.
 *
 * This assert function is meant to only run on the browser.
 */
function assertPlaceholderDimensions(dir, imgElement) {
    const computedStyle = window.getComputedStyle(imgElement);
    let renderedWidth = parseFloat(computedStyle.getPropertyValue('width'));
    let renderedHeight = parseFloat(computedStyle.getPropertyValue('height'));
    if (renderedWidth > PLACEHOLDER_DIMENSION_LIMIT || renderedHeight > PLACEHOLDER_DIMENSION_LIMIT) {
        console.warn(_formatRuntimeError(2967 /* RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED */, `${imgDirectiveDetails(dir.ngSrc)} it uses a placeholder image, but at least one ` +
            `of the dimensions attribute (height or width) exceeds the limit of ${PLACEHOLDER_DIMENSION_LIMIT}px. ` +
            `To fix this, use a smaller image as a placeholder.`));
    }
}
function callOnLoadIfImageIsLoaded(img, callback) {
    // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-complete
    // The spec defines that `complete` is truthy once its request state is fully available.
    // The image may already be available if it’s loaded from the browser cache.
    // In that case, the `load` event will not fire at all, meaning that all setup
    // callbacks listening for the `load` event will not be invoked.
    // In Safari, there is a known behavior where the `complete` property of an
    // `HTMLImageElement` may sometimes return `true` even when the image is not fully loaded.
    // Checking both `img.complete` and `img.naturalWidth` is the most reliable way to
    // determine if an image has been fully loaded, especially in browsers where the
    // `complete` property may return `true` prematurely.
    if (img.complete && img.naturalWidth) {
        callback();
    }
}
function round(input) {
    return Number.isInteger(input) ? input : input.toFixed(2);
}
// Transform function to handle SafeValue input for ngSrc. This doesn't do any sanitization,
// as that is not needed for img.src and img.srcset. This transform is purely for compatibility.
function unwrapSafeUrl(value) {
    if (typeof value === 'string') {
        return value;
    }
    return _unwrapSafeValue(value);
}
// Transform function to handle inputs which may be booleans, strings, or string representations
// of boolean values. Used for the placeholder attribute.
function booleanOrUrlAttribute(value) {
    if (typeof value === 'string' && value !== 'true' && value !== 'false' && value !== '') {
        return value;
    }
    return booleanAttribute(value);
}

export { DOCUMENT, IMAGE_LOADER, NgOptimizedImage, PRECONNECT_CHECK_BLOCKLIST, VERSION, ViewportScroller, isPlatformBrowser, provideCloudflareLoader, provideCloudinaryLoader, provideImageKitLoader, provideImgixLoader, provideNetlifyLoader, registerLocaleData, NullViewportScroller as ɵNullViewportScroller };
//# sourceMappingURL=common.mjs.map
e㴤Fx   {"version":3,"file":"common.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/i18n/locale_data.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/version.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/viewport_scroller.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/image_loaders/constants.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/url.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/image_loaders/image_loader.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/image_loaders/cloudflare_loader.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/image_loaders/cloudinary_loader.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/image_loaders/imagekit_loader.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/image_loaders/imgix_loader.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/image_loaders/netlify_loader.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/error_helper.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/asserts.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/tokens.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/preload-link-creator.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵregisterLocaleData} from '@angular/core';\n\n/**\n * Register global data to be used internally by Angular. See the\n * [\"I18n guide\"](guide/i18n/format-data-locale) to know how to import additional locale\n * data.\n *\n * The signature registerLocaleData(data: any, extraData?: any) is deprecated since v5.1\n *\n * @publicApi\n */\nexport function registerLocaleData(data: any, localeId?: string | any, extraData?: any): void {\n  return ɵregisterLocaleData(data, localeId, extraData);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of the common package.\n */\n\nimport {Version} from '@angular/core';\n\n/**\n * @publicApi\n */\nexport const VERSION = new Version('19.2.14');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, ɵɵdefineInjectable} from '@angular/core';\n\nimport {DOCUMENT} from './dom_tokens';\n\n/**\n * Defines a scroll position manager. Implemented by `BrowserViewportScroller`.\n *\n * @publicApi\n */\nexport abstract class ViewportScroller {\n  // De-sugared tree-shakable injection\n  // See #23917\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: ViewportScroller,\n    providedIn: 'root',\n    factory: () =>\n      typeof ngServerMode !== 'undefined' && ngServerMode\n        ? new NullViewportScroller()\n        : new BrowserViewportScroller(inject(DOCUMENT), window),\n  });\n\n  /**\n   * Configures the top offset used when scrolling to an anchor.\n   * @param offset A position in screen coordinates (a tuple with x and y values)\n   * or a function that returns the top offset position.\n   *\n   */\n  abstract setOffset(offset: [number, number] | (() => [number, number])): void;\n\n  /**\n   * Retrieves the current scroll position.\n   * @returns A position in screen coordinates (a tuple with x and y values).\n   */\n  abstract getScrollPosition(): [number, number];\n\n  /**\n   * Scrolls to a specified position.\n   * @param position A position in screen coordinates (a tuple with x and y values).\n   */\n  abstract scrollToPosition(position: [number, number]): void;\n\n  /**\n   * Scrolls to an anchor element.\n   * @param anchor The ID of the anchor element.\n   */\n  abstract scrollToAnchor(anchor: string): void;\n\n  /**\n   * Disables automatic scroll restoration provided by the browser.\n   * See also [window.history.scrollRestoration\n   * info](https://developers.google.com/web/updates/2015/09/history-api-scroll-restoration).\n   */\n  abstract setHistoryScrollRestoration(scrollRestoration: 'auto' | 'manual'): void;\n}\n\n/**\n * Manages the scroll position for a browser window.\n */\nexport class BrowserViewportScroller implements ViewportScroller {\n  private offset: () => [number, number] = () => [0, 0];\n\n  constructor(\n    private document: Document,\n    private window: Window,\n  ) {}\n\n  /**\n   * Configures the top offset used when scrolling to an anchor.\n   * @param offset A position in screen coordinates (a tuple with x and y values)\n   * or a function that returns the top offset position.\n   *\n   */\n  setOffset(offset: [number, number] | (() => [number, number])): void {\n    if (Array.isArray(offset)) {\n      this.offset = () => offset;\n    } else {\n      this.offset = offset;\n    }\n  }\n\n  /**\n   * Retrieves the current scroll position.\n   * @returns The position in screen coordinates.\n   */\n  getScrollPosition(): [number, number] {\n    return [this.window.scrollX, this.window.scrollY];\n  }\n\n  /**\n   * Sets the scroll position.\n   * @param position The new position in screen coordinates.\n   */\n  scrollToPosition(position: [number, number]): void {\n    this.window.scrollTo(position[0], position[1]);\n  }\n\n  /**\n   * Scrolls to an element and attempts to focus the element.\n   *\n   * Note that the function name here is misleading in that the target string may be an ID for a\n   * non-anchor element.\n   *\n   * @param target The ID of an element or name of the anchor.\n   *\n   * @see https://html.spec.whatwg.org/#the-indicated-part-of-the-document\n   * @see https://html.spec.whatwg.org/#scroll-to-fragid\n   */\n  scrollToAnchor(target: string): void {\n    const elSelected = findAnchorFromDocument(this.document, target);\n\n    if (elSelected) {\n      this.scrollToElement(elSelected);\n      // After scrolling to the element, the spec dictates that we follow the focus steps for the\n      // target. Rather than following the robust steps, simply attempt focus.\n      //\n      // @see https://html.spec.whatwg.org/#get-the-focusable-area\n      // @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLOrForeignElement/focus\n      // @see https://html.spec.whatwg.org/#focusable-area\n      elSelected.focus();\n    }\n  }\n\n  /**\n   * Disables automatic scroll restoration provided by the browser.\n   */\n  setHistoryScrollRestoration(scrollRestoration: 'auto' | 'manual'): void {\n    this.window.history.scrollRestoration = scrollRestoration;\n  }\n\n  /**\n   * Scrolls to an element using the native offset and the specified offset set on this scroller.\n   *\n   * The offset can be used when we know that there is a floating header and scrolling naively to an\n   * element (ex: `scrollIntoView`) leaves the element hidden behind the floating header.\n   */\n  private scrollToElement(el: HTMLElement): void {\n    const rect = el.getBoundingClientRect();\n    const left = rect.left + this.window.pageXOffset;\n    const top = rect.top + this.window.pageYOffset;\n    const offset = this.offset();\n    this.window.scrollTo(left - offset[0], top - offset[1]);\n  }\n}\n\nfunction findAnchorFromDocument(document: Document, target: string): HTMLElement | null {\n  const documentResult = document.getElementById(target) || document.getElementsByName(target)[0];\n\n  if (documentResult) {\n    return documentResult;\n  }\n\n  // `getElementById` and `getElementsByName` won't pierce through the shadow DOM so we\n  // have to traverse the DOM manually and do the lookup through the shadow roots.\n  if (\n    typeof document.createTreeWalker === 'function' &&\n    document.body &&\n    typeof document.body.attachShadow === 'function'\n  ) {\n    const treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT);\n    let currentNode = treeWalker.currentNode as HTMLElement | null;\n\n    while (currentNode) {\n      const shadowRoot = currentNode.shadowRoot;\n\n      if (shadowRoot) {\n        // Note that `ShadowRoot` doesn't support `getElementsByName`\n        // so we have to fall back to `querySelector`.\n        const result =\n          shadowRoot.getElementById(target) || shadowRoot.querySelector(`[name=\"${target}\"]`);\n        if (result) {\n          return result;\n        }\n      }\n\n      currentNode = treeWalker.nextNode() as HTMLElement | null;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Provides an empty implementation of the viewport scroller.\n */\nexport class NullViewportScroller implements ViewportScroller {\n  /**\n   * Empty implementation\n   */\n  setOffset(offset: [number, number] | (() => [number, number])): void {}\n\n  /**\n   * Empty implementation\n   */\n  getScrollPosition(): [number, number] {\n    return [0, 0];\n  }\n\n  /**\n   * Empty implementation\n   */\n  scrollToPosition(position: [number, number]): void {}\n\n  /**\n   * Empty implementation\n   */\n  scrollToAnchor(anchor: string): void {}\n\n  /**\n   * Empty implementation\n   */\n  setHistoryScrollRestoration(scrollRestoration: 'auto' | 'manual'): void {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Value (out of 100) of the requested quality for placeholder images.\n */\nexport const PLACEHOLDER_QUALITY = '20';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// Converts a string that represents a URL into a URL class instance.\nexport function getUrl(src: string, win: Window): URL {\n  // Don't use a base URL is the URL is absolute.\n  return isAbsoluteUrl(src) ? new URL(src) : new URL(src, win.location.href);\n}\n\n// Checks whether a URL is absolute (i.e. starts with `http://` or `https://`).\nexport function isAbsoluteUrl(src: string): boolean {\n  return /^https?:\\/\\//.test(src);\n}\n\n// Given a URL, extract the hostname part.\n// If a URL is a relative one - the URL is returned as is.\nexport function extractHostname(url: string): string {\n  return isAbsoluteUrl(url) ? new URL(url).hostname : url;\n}\n\nexport function isValidPath(path: unknown): boolean {\n  const isString = typeof path === 'string';\n\n  if (!isString || path.trim() === '') {\n    return false;\n  }\n\n  // Calling new URL() will throw if the path string is malformed\n  try {\n    const url = new URL(path);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport function normalizePath(path: string): string {\n  return path.endsWith('/') ? path.slice(0, -1) : path;\n}\n\nexport function normalizeSrc(src: string): string {\n  return src.startsWith('/') ? src.slice(1) : src;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken, Provider, ɵRuntimeError as RuntimeError} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../../../errors';\nimport {isAbsoluteUrl, isValidPath, normalizePath, normalizeSrc} from '../url';\n\n/**\n * Config options recognized by the image loader function.\n *\n * @see {@link ImageLoader}\n * @see {@link NgOptimizedImage}\n * @publicApi\n */\nexport interface ImageLoaderConfig {\n  /**\n   * Image file name to be added to the image request URL.\n   */\n  src: string;\n  /**\n   * Width of the requested image (to be used when generating srcset).\n   */\n  width?: number;\n  /**\n   * Whether the loader should generate a URL for a small image placeholder instead of a full-sized\n   * image.\n   */\n  isPlaceholder?: boolean;\n  /**\n   * Additional user-provided parameters for use by the ImageLoader.\n   */\n  loaderParams?: {[key: string]: any};\n}\n\n/**\n * Represents an image loader function. Image loader functions are used by the\n * NgOptimizedImage directive to produce full image URL based on the image name and its width.\n *\n * @publicApi\n */\nexport type ImageLoader = (config: ImageLoaderConfig) => string;\n\n/**\n * Noop image loader that does no transformation to the original src and just returns it as is.\n * This loader is used as a default one if more specific logic is not provided in an app config.\n *\n * @see {@link ImageLoader}\n * @see {@link NgOptimizedImage}\n */\nexport const noopImageLoader = (config: ImageLoaderConfig) => config.src;\n\n/**\n * Metadata about the image loader.\n */\nexport type ImageLoaderInfo = {\n  name: string;\n  testUrl: (url: string) => boolean;\n};\n\n/**\n * Injection token that configures the image loader function.\n *\n * @see {@link ImageLoader}\n * @see {@link NgOptimizedImage}\n * @publicApi\n */\nexport const IMAGE_LOADER = new InjectionToken<ImageLoader>(ngDevMode ? 'ImageLoader' : '', {\n  providedIn: 'root',\n  factory: () => noopImageLoader,\n});\n\n/**\n * Internal helper function that makes it easier to introduce custom image loaders for the\n * `NgOptimizedImage` directive. It is enough to specify a URL builder function to obtain full DI\n * configuration for a given loader: a DI token corresponding to the actual loader function, plus DI\n * tokens managing preconnect check functionality.\n * @param buildUrlFn a function returning a full URL based on loader's configuration\n * @param exampleUrls example of full URLs for a given loader (used in error messages)\n * @returns a set of DI providers corresponding to the configured image loader\n */\nexport function createImageLoader(\n  buildUrlFn: (path: string, config: ImageLoaderConfig) => string,\n  exampleUrls?: string[],\n) {\n  return function provideImageLoader(path: string) {\n    if (!isValidPath(path)) {\n      throwInvalidPathError(path, exampleUrls || []);\n    }\n\n    // The trailing / is stripped (if provided) to make URL construction (concatenation) easier in\n    // the individual loader functions.\n    path = normalizePath(path);\n\n    const loaderFn = (config: ImageLoaderConfig) => {\n      if (isAbsoluteUrl(config.src)) {\n        // Image loader functions expect an image file name (e.g. `my-image.png`)\n        // or a relative path + a file name (e.g. `/a/b/c/my-image.png`) as an input,\n        // so the final absolute URL can be constructed.\n        // When an absolute URL is provided instead - the loader can not\n        // build a final URL, thus the error is thrown to indicate that.\n        throwUnexpectedAbsoluteUrlError(path, config.src);\n      }\n\n      return buildUrlFn(path, {...config, src: normalizeSrc(config.src)});\n    };\n\n    const providers: Provider[] = [{provide: IMAGE_LOADER, useValue: loaderFn}];\n    return providers;\n  };\n}\n\nfunction throwInvalidPathError(path: unknown, exampleUrls: string[]): never {\n  throw new RuntimeError(\n    RuntimeErrorCode.INVALID_LOADER_ARGUMENTS,\n    ngDevMode &&\n      `Image loader has detected an invalid path (\\`${path}\\`). ` +\n        `To fix this, supply a path using one of the following formats: ${exampleUrls.join(\n          ' or ',\n        )}`,\n  );\n}\n\nfunction throwUnexpectedAbsoluteUrlError(path: string, url: string): never {\n  throw new RuntimeError(\n    RuntimeErrorCode.INVALID_LOADER_ARGUMENTS,\n    ngDevMode &&\n      `Image loader has detected a \\`<img>\\` tag with an invalid \\`ngSrc\\` attribute: ${url}. ` +\n        `This image loader expects \\`ngSrc\\` to be a relative URL - ` +\n        `however the provided value is an absolute URL. ` +\n        `To fix this, provide \\`ngSrc\\` as a path relative to the base URL ` +\n        `configured for this loader (\\`${path}\\`).`,\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Provider} from '@angular/core';\nimport {PLACEHOLDER_QUALITY} from './constants';\nimport {createImageLoader, ImageLoaderConfig} from './image_loader';\n\n/**\n * Function that generates an ImageLoader for [Cloudflare Image\n * Resizing](https://developers.cloudflare.com/images/image-resizing/) and turns it into an Angular\n * provider. Note: Cloudflare has multiple image products - this provider is specifically for\n * Cloudflare Image Resizing; it will not work with Cloudflare Images or Cloudflare Polish.\n *\n * @param path Your domain name, e.g. https://mysite.com\n * @returns Provider that provides an ImageLoader function\n *\n * @publicApi\n */\nexport const provideCloudflareLoader: (path: string) => Provider[] = createImageLoader(\n  createCloudflareUrl,\n  ngDevMode ? ['https://<ZONE>/cdn-cgi/image/<OPTIONS>/<SOURCE-IMAGE>'] : undefined,\n);\n\nfunction createCloudflareUrl(path: string, config: ImageLoaderConfig) {\n  let params = `format=auto`;\n  if (config.width) {\n    params += `,width=${config.width}`;\n  }\n\n  // When requesting a placeholder image we ask for a low quality image to reduce the load time.\n  if (config.isPlaceholder) {\n    params += `,quality=${PLACEHOLDER_QUALITY}`;\n  }\n\n  // Cloudflare image URLs format:\n  // https://developers.cloudflare.com/images/image-resizing/url-format/\n  return `${path}/cdn-cgi/image/${params}/${config.src}`;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Provider} from '@angular/core';\nimport {createImageLoader, ImageLoaderConfig, ImageLoaderInfo} from './image_loader';\n\n/**\n * Name and URL tester for Cloudinary.\n */\nexport const cloudinaryLoaderInfo: ImageLoaderInfo = {\n  name: 'Cloudinary',\n  testUrl: isCloudinaryUrl,\n};\n\nconst CLOUDINARY_LOADER_REGEX = /https?\\:\\/\\/[^\\/]+\\.cloudinary\\.com\\/.+/;\n/**\n * Tests whether a URL is from Cloudinary CDN.\n */\nfunction isCloudinaryUrl(url: string): boolean {\n  return CLOUDINARY_LOADER_REGEX.test(url);\n}\n\n/**\n * Function that generates an ImageLoader for Cloudinary and turns it into an Angular provider.\n *\n * @param path Base URL of your Cloudinary images\n * This URL should match one of the following formats:\n * https://res.cloudinary.com/mysite\n * https://mysite.cloudinary.com\n * https://subdomain.mysite.com\n * @returns Set of providers to configure the Cloudinary loader.\n *\n * @publicApi\n */\nexport const provideCloudinaryLoader: (path: string) => Provider[] = createImageLoader(\n  createCloudinaryUrl,\n  ngDevMode\n    ? [\n        'https://res.cloudinary.com/mysite',\n        'https://mysite.cloudinary.com',\n        'https://subdomain.mysite.com',\n      ]\n    : undefined,\n);\n\nfunction createCloudinaryUrl(path: string, config: ImageLoaderConfig) {\n  // Cloudinary image URLformat:\n  // https://cloudinary.com/documentation/image_transformations#transformation_url_structure\n  // Example of a Cloudinary image URL:\n  // https://res.cloudinary.com/mysite/image/upload/c_scale,f_auto,q_auto,w_600/marketing/tile-topics-m.png\n\n  // For a placeholder image, we use the lowest image setting available to reduce the load time\n  // else we use the auto size\n  const quality = config.isPlaceholder ? 'q_auto:low' : 'q_auto';\n\n  let params = `f_auto,${quality}`;\n  if (config.width) {\n    params += `,w_${config.width}`;\n  }\n\n  if (config.loaderParams?.['rounded']) {\n    params += `,r_max`;\n  }\n\n  return `${path}/image/upload/${params}/${config.src}`;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Provider} from '@angular/core';\nimport {PLACEHOLDER_QUALITY} from './constants';\nimport {createImageLoader, ImageLoaderConfig, ImageLoaderInfo} from './image_loader';\n\n/**\n * Name and URL tester for ImageKit.\n */\nexport const imageKitLoaderInfo: ImageLoaderInfo = {\n  name: 'ImageKit',\n  testUrl: isImageKitUrl,\n};\n\nconst IMAGE_KIT_LOADER_REGEX = /https?\\:\\/\\/[^\\/]+\\.imagekit\\.io\\/.+/;\n/**\n * Tests whether a URL is from ImageKit CDN.\n */\nfunction isImageKitUrl(url: string): boolean {\n  return IMAGE_KIT_LOADER_REGEX.test(url);\n}\n\n/**\n * Function that generates an ImageLoader for ImageKit and turns it into an Angular provider.\n *\n * @param path Base URL of your ImageKit images\n * This URL should match one of the following formats:\n * https://ik.imagekit.io/myaccount\n * https://subdomain.mysite.com\n * @returns Set of providers to configure the ImageKit loader.\n *\n * @publicApi\n */\nexport const provideImageKitLoader: (path: string) => Provider[] = createImageLoader(\n  createImagekitUrl,\n  ngDevMode ? ['https://ik.imagekit.io/mysite', 'https://subdomain.mysite.com'] : undefined,\n);\n\nexport function createImagekitUrl(path: string, config: ImageLoaderConfig): string {\n  // Example of an ImageKit image URL:\n  // https://ik.imagekit.io/demo/tr:w-300,h-300/medium_cafe_B1iTdD0C.jpg\n  const {src, width} = config;\n  const params: string[] = [];\n\n  if (width) {\n    params.push(`w-${width}`);\n  }\n\n  // When requesting a placeholder image we ask for a low quality image to reduce the load time.\n  if (config.isPlaceholder) {\n    params.push(`q-${PLACEHOLDER_QUALITY}`);\n  }\n\n  const urlSegments = params.length ? [path, `tr:${params.join(',')}`, src] : [path, src];\n  const url = new URL(urlSegments.join('/'));\n  return url.href;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Provider} from '@angular/core';\nimport {PLACEHOLDER_QUALITY} from './constants';\nimport {createImageLoader, ImageLoaderConfig, ImageLoaderInfo} from './image_loader';\n\n/**\n * Name and URL tester for Imgix.\n */\nexport const imgixLoaderInfo: ImageLoaderInfo = {\n  name: 'Imgix',\n  testUrl: isImgixUrl,\n};\n\nconst IMGIX_LOADER_REGEX = /https?\\:\\/\\/[^\\/]+\\.imgix\\.net\\/.+/;\n/**\n * Tests whether a URL is from Imgix CDN.\n */\nfunction isImgixUrl(url: string): boolean {\n  return IMGIX_LOADER_REGEX.test(url);\n}\n\n/**\n * Function that generates an ImageLoader for Imgix and turns it into an Angular provider.\n *\n * @param path path to the desired Imgix origin,\n * e.g. https://somepath.imgix.net or https://images.mysite.com\n * @returns Set of providers to configure the Imgix loader.\n *\n * @publicApi\n */\nexport const provideImgixLoader: (path: string) => Provider[] = createImageLoader(\n  createImgixUrl,\n  ngDevMode ? ['https://somepath.imgix.net/'] : undefined,\n);\n\nfunction createImgixUrl(path: string, config: ImageLoaderConfig) {\n  const url = new URL(`${path}/${config.src}`);\n  // This setting ensures the smallest allowable format is set.\n  url.searchParams.set('auto', 'format');\n  if (config.width) {\n    url.searchParams.set('w', config.width.toString());\n  }\n\n  // When requesting a placeholder image we ask a low quality image to reduce the load time.\n  if (config.isPlaceholder) {\n    url.searchParams.set('q', PLACEHOLDER_QUALITY);\n  }\n  return url.href;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Provider,\n  ɵformatRuntimeError as formatRuntimeError,\n  ɵRuntimeError as RuntimeError,\n} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../../../errors';\nimport {isAbsoluteUrl, isValidPath} from '../url';\n\nimport {IMAGE_LOADER, ImageLoaderConfig, ImageLoaderInfo} from './image_loader';\nimport {PLACEHOLDER_QUALITY} from './constants';\n\n/**\n * Name and URL tester for Netlify.\n */\nexport const netlifyLoaderInfo: ImageLoaderInfo = {\n  name: 'Netlify',\n  testUrl: isNetlifyUrl,\n};\n\nconst NETLIFY_LOADER_REGEX = /https?\\:\\/\\/[^\\/]+\\.netlify\\.app\\/.+/;\n\n/**\n * Tests whether a URL is from a Netlify site. This won't catch sites with a custom domain,\n * but it's a good start for sites in development. This is only used to warn users who haven't\n * configured an image loader.\n */\nfunction isNetlifyUrl(url: string): boolean {\n  return NETLIFY_LOADER_REGEX.test(url);\n}\n\n/**\n * Function that generates an ImageLoader for Netlify and turns it into an Angular provider.\n *\n * @param path optional URL of the desired Netlify site. Defaults to the current site.\n * @returns Set of providers to configure the Netlify loader.\n *\n * @publicApi\n */\nexport function provideNetlifyLoader(path?: string) {\n  if (path && !isValidPath(path)) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_LOADER_ARGUMENTS,\n      ngDevMode &&\n        `Image loader has detected an invalid path (\\`${path}\\`). ` +\n          `To fix this, supply either the full URL to the Netlify site, or leave it empty to use the current site.`,\n    );\n  }\n\n  if (path) {\n    const url = new URL(path);\n    path = url.origin;\n  }\n\n  const loaderFn = (config: ImageLoaderConfig) => {\n    return createNetlifyUrl(config, path);\n  };\n\n  const providers: Provider[] = [{provide: IMAGE_LOADER, useValue: loaderFn}];\n  return providers;\n}\n\nconst validParams = new Map<string, string>([\n  ['height', 'h'],\n  ['fit', 'fit'],\n  ['quality', 'q'],\n  ['q', 'q'],\n  ['position', 'position'],\n]);\n\nfunction createNetlifyUrl(config: ImageLoaderConfig, path?: string) {\n  // Note: `path` can be undefined, in which case we use a fake one to construct a `URL` instance.\n  const url = new URL(path ?? 'https://a/');\n  url.pathname = '/.netlify/images';\n\n  if (!isAbsoluteUrl(config.src) && !config.src.startsWith('/')) {\n    config.src = '/' + config.src;\n  }\n\n  url.searchParams.set('url', config.src);\n\n  if (config.width) {\n    url.searchParams.set('w', config.width.toString());\n  }\n\n  // When requesting a placeholder image we ask for a low quality image to reduce the load time.\n  // If the quality is specified in the loader config - always use provided value.\n  const configQuality = config.loaderParams?.['quality'] ?? config.loaderParams?.['q'];\n  if (config.isPlaceholder && !configQuality) {\n    url.searchParams.set('q', PLACEHOLDER_QUALITY);\n  }\n\n  for (const [param, value] of Object.entries(config.loaderParams ?? {})) {\n    if (validParams.has(param)) {\n      url.searchParams.set(validParams.get(param)!, value.toString());\n    } else {\n      if (ngDevMode) {\n        console.warn(\n          formatRuntimeError(\n            RuntimeErrorCode.INVALID_LOADER_ARGUMENTS,\n            `The Netlify image loader has detected an \\`<img>\\` tag with the unsupported attribute \"\\`${param}\\`\".`,\n          ),\n        );\n      }\n    }\n  }\n  // The \"a\" hostname is used for relative URLs, so we can remove it from the final URL.\n  return url.hostname === 'a' ? url.href.replace(url.origin, '') : url.href;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// Assembles directive details string, useful for error messages.\nexport function imgDirectiveDetails(ngSrc: string, includeNgSrc = true) {\n  const ngSrcInfo = includeNgSrc\n    ? `(activated on an <img> element with the \\`ngSrc=\"${ngSrc}\"\\`) `\n    : '';\n  return `The NgOptimizedImage directive ${ngSrcInfo}has detected that`;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵRuntimeError as RuntimeError} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../../errors';\n\n/**\n * Asserts that the application is in development mode. Throws an error if the application is in\n * production mode. This assert can be used to make sure that there is no dev-mode code invoked in\n * the prod mode accidentally.\n */\nexport function assertDevMode(checkName: string) {\n  if (!ngDevMode) {\n    throw new RuntimeError(\n      RuntimeErrorCode.UNEXPECTED_DEV_MODE_CHECK_IN_PROD_MODE,\n      `Unexpected invocation of the ${checkName} in the prod mode. ` +\n        `Please make sure that the prod mode is enabled for production builds.`,\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  inject,\n  Injectable,\n  OnDestroy,\n  ɵformatRuntimeError as formatRuntimeError,\n  PLATFORM_ID,\n} from '@angular/core';\n\nimport {DOCUMENT} from '../../dom_tokens';\nimport {RuntimeErrorCode} from '../../errors';\n\nimport {assertDevMode} from './asserts';\nimport {imgDirectiveDetails} from './error_helper';\nimport {getUrl} from './url';\nimport {isPlatformBrowser} from '../../platform_id';\n\ninterface ObservedImageState {\n  priority: boolean;\n  modified: boolean;\n  alreadyWarnedPriority: boolean;\n  alreadyWarnedModified: boolean;\n}\n\n/**\n * Observer that detects whether an image with `NgOptimizedImage`\n * is treated as a Largest Contentful Paint (LCP) element. If so,\n * asserts that the image has the `priority` attribute.\n *\n * Note: this is a dev-mode only class and it does not appear in prod bundles,\n * thus there is no `ngDevMode` use in the code.\n *\n * Based on https://web.dev/lcp/#measure-lcp-in-javascript.\n */\n@Injectable({providedIn: 'root'})\nexport class LCPImageObserver implements OnDestroy {\n  // Map of full image URLs -> original `ngSrc` values.\n  private images = new Map<string, ObservedImageState>();\n\n  private window: Window | null = null;\n  private observer: PerformanceObserver | null = null;\n\n  constructor() {\n    const isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n    assertDevMode('LCP checker');\n    const win = inject(DOCUMENT).defaultView;\n    if (isBrowser && typeof PerformanceObserver !== 'undefined') {\n      this.window = win;\n      this.observer = this.initPerformanceObserver();\n    }\n  }\n\n  /**\n   * Inits PerformanceObserver and subscribes to LCP events.\n   * Based on https://web.dev/lcp/#measure-lcp-in-javascript\n   */\n  private initPerformanceObserver(): PerformanceObserver {\n    const observer = new PerformanceObserver((entryList) => {\n      const entries = entryList.getEntries();\n      if (entries.length === 0) return;\n      // We use the latest entry produced by the `PerformanceObserver` as the best\n      // signal on which element is actually an LCP one. As an example, the first image to load on\n      // a page, by virtue of being the only thing on the page so far, is often a LCP candidate\n      // and gets reported by PerformanceObserver, but isn't necessarily the LCP element.\n      const lcpElement = entries[entries.length - 1];\n\n      // Cast to `any` due to missing `element` on the `LargestContentfulPaint` type of entry.\n      // See https://developer.mozilla.org/en-US/docs/Web/API/LargestContentfulPaint\n      const imgSrc = (lcpElement as any).element?.src ?? '';\n\n      // Exclude `data:` and `blob:` URLs, since they are not supported by the directive.\n      if (imgSrc.startsWith('data:') || imgSrc.startsWith('blob:')) return;\n\n      const img = this.images.get(imgSrc);\n      if (!img) return;\n      if (!img.priority && !img.alreadyWarnedPriority) {\n        img.alreadyWarnedPriority = true;\n        logMissingPriorityError(imgSrc);\n      }\n      if (img.modified && !img.alreadyWarnedModified) {\n        img.alreadyWarnedModified = true;\n        logModifiedWarning(imgSrc);\n      }\n    });\n    observer.observe({type: 'largest-contentful-paint', buffered: true});\n    return observer;\n  }\n\n  registerImage(rewrittenSrc: string, originalNgSrc: string, isPriority: boolean) {\n    if (!this.observer) return;\n    const newObservedImageState: ObservedImageState = {\n      priority: isPriority,\n      modified: false,\n      alreadyWarnedModified: false,\n      alreadyWarnedPriority: false,\n    };\n    this.images.set(getUrl(rewrittenSrc, this.window!).href, newObservedImageState);\n  }\n\n  unregisterImage(rewrittenSrc: string) {\n    if (!this.observer) return;\n    this.images.delete(getUrl(rewrittenSrc, this.window!).href);\n  }\n\n  updateImage(originalSrc: string, newSrc: string) {\n    if (!this.observer) return;\n    const originalUrl = getUrl(originalSrc, this.window!).href;\n    const img = this.images.get(originalUrl);\n    if (img) {\n      img.modified = true;\n      this.images.set(getUrl(newSrc, this.window!).href, img);\n      this.images.delete(originalUrl);\n    }\n  }\n\n  ngOnDestroy() {\n    if (!this.observer) return;\n    this.observer.disconnect();\n    this.images.clear();\n  }\n}\n\nfunction logMissingPriorityError(ngSrc: string) {\n  const directiveDetails = imgDirectiveDetails(ngSrc);\n  console.error(\n    formatRuntimeError(\n      RuntimeErrorCode.LCP_IMG_MISSING_PRIORITY,\n      `${directiveDetails} this image is the Largest Contentful Paint (LCP) ` +\n        `element but was not marked \"priority\". This image should be marked ` +\n        `\"priority\" in order to prioritize its loading. ` +\n        `To fix this, add the \"priority\" attribute.`,\n    ),\n  );\n}\n\nfunction logModifiedWarning(ngSrc: string) {\n  const directiveDetails = imgDirectiveDetails(ngSrc);\n  console.warn(\n    formatRuntimeError(\n      RuntimeErrorCode.LCP_IMG_NGSRC_MODIFIED,\n      `${directiveDetails} this image is the Largest Contentful Paint (LCP) ` +\n        `element and has had its \"ngSrc\" attribute modified. This can cause ` +\n        `slower loading performance. It is recommended not to modify the \"ngSrc\" ` +\n        `property on any image which could be the LCP element.`,\n    ),\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  inject,\n  Injectable,\n  InjectionToken,\n  ɵformatRuntimeError as formatRuntimeError,\n} from '@angular/core';\n\nimport {DOCUMENT} from '../../dom_tokens';\nimport {RuntimeErrorCode} from '../../errors';\n\nimport {assertDevMode} from './asserts';\nimport {imgDirectiveDetails} from './error_helper';\nimport {extractHostname, getUrl} from './url';\n\n// Set of origins that are always excluded from the preconnect checks.\nconst INTERNAL_PRECONNECT_CHECK_BLOCKLIST = new Set(['localhost', '127.0.0.1', '0.0.0.0']);\n\n/**\n * Injection token to configure which origins should be excluded\n * from the preconnect checks. It can either be a single string or an array of strings\n * to represent a group of origins, for example:\n *\n * ```ts\n *  {provide: PRECONNECT_CHECK_BLOCKLIST, useValue: 'https://your-domain.com'}\n * ```\n *\n * or:\n *\n * ```ts\n *  {provide: PRECONNECT_CHECK_BLOCKLIST,\n *   useValue: ['https://your-domain-1.com', 'https://your-domain-2.com']}\n * ```\n *\n * @publicApi\n */\nexport const PRECONNECT_CHECK_BLOCKLIST = new InjectionToken<Array<string | string[]>>(\n  ngDevMode ? 'PRECONNECT_CHECK_BLOCKLIST' : '',\n);\n\n/**\n * Contains the logic to detect whether an image, marked with the \"priority\" attribute\n * has a corresponding `<link rel=\"preconnect\">` tag in the `document.head`.\n *\n * Note: this is a dev-mode only class, which should not appear in prod bundles,\n * thus there is no `ngDevMode` use in the code.\n */\n@Injectable({providedIn: 'root'})\nexport class PreconnectLinkChecker {\n  private document = inject(DOCUMENT);\n\n  /**\n   * Set of <link rel=\"preconnect\"> tags found on this page.\n   * The `null` value indicates that there was no DOM query operation performed.\n   */\n  private preconnectLinks: Set<string> | null = null;\n\n  /*\n   * Keep track of all already seen origin URLs to avoid repeating the same check.\n   */\n  private alreadySeen = new Set<string>();\n\n  private window: Window | null = this.document.defaultView;\n\n  private blocklist = new Set<string>(INTERNAL_PRECONNECT_CHECK_BLOCKLIST);\n\n  constructor() {\n    assertDevMode('preconnect link checker');\n    const blocklist = inject(PRECONNECT_CHECK_BLOCKLIST, {optional: true});\n    if (blocklist) {\n      this.populateBlocklist(blocklist);\n    }\n  }\n\n  private populateBlocklist(origins: Array<string | string[]> | string) {\n    if (Array.isArray(origins)) {\n      deepForEach(origins, (origin) => {\n        this.blocklist.add(extractHostname(origin));\n      });\n    } else {\n      this.blocklist.add(extractHostname(origins));\n    }\n  }\n\n  /**\n   * Checks that a preconnect resource hint exists in the head for the\n   * given src.\n   *\n   * @param rewrittenSrc src formatted with loader\n   * @param originalNgSrc ngSrc value\n   */\n  assertPreconnect(rewrittenSrc: string, originalNgSrc: string): void {\n    if (typeof ngServerMode !== 'undefined' && ngServerMode) return;\n\n    const imgUrl = getUrl(rewrittenSrc, this.window!);\n    if (this.blocklist.has(imgUrl.hostname) || this.alreadySeen.has(imgUrl.origin)) return;\n\n    // Register this origin as seen, so we don't check it again later.\n    this.alreadySeen.add(imgUrl.origin);\n\n    // Note: we query for preconnect links only *once* and cache the results\n    // for the entire lifespan of an application, since it's unlikely that the\n    // list would change frequently. This allows to make sure there are no\n    // performance implications of making extra DOM lookups for each image.\n    this.preconnectLinks ??= this.queryPreconnectLinks();\n\n    if (!this.preconnectLinks.has(imgUrl.origin)) {\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.PRIORITY_IMG_MISSING_PRECONNECT_TAG,\n          `${imgDirectiveDetails(originalNgSrc)} there is no preconnect tag present for this ` +\n            `image. Preconnecting to the origin(s) that serve priority images ensures that these ` +\n            `images are delivered as soon as possible. To fix this, please add the following ` +\n            `element into the <head> of the document:\\n` +\n            `  <link rel=\"preconnect\" href=\"${imgUrl.origin}\">`,\n        ),\n      );\n    }\n  }\n\n  private queryPreconnectLinks(): Set<string> {\n    const preconnectUrls = new Set<string>();\n    const links = this.document.querySelectorAll<HTMLLinkElement>('link[rel=preconnect]');\n    for (const link of links) {\n      const url = getUrl(link.href, this.window!);\n      preconnectUrls.add(url.origin);\n    }\n    return preconnectUrls;\n  }\n\n  ngOnDestroy() {\n    this.preconnectLinks?.clear();\n    this.alreadySeen.clear();\n  }\n}\n\n/**\n * Invokes a callback for each element in the array. Also invokes a callback\n * recursively for each nested array.\n */\nfunction deepForEach<T>(input: (T | any[])[], fn: (value: T) => void): void {\n  for (let value of input) {\n    Array.isArray(value) ? deepForEach(value, fn) : fn(value);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n/**\n * In SSR scenarios, a preload `<link>` element is generated for priority images.\n * Having a large number of preload tags may negatively affect the performance,\n * so we warn developers (by throwing an error) if the number of preloaded images\n * is above a certain threshold. This const specifies this threshold.\n */\nexport const DEFAULT_PRELOADED_IMAGES_LIMIT = 5;\n\n/**\n * Helps to keep track of priority images that already have a corresponding\n * preload tag (to avoid generating multiple preload tags with the same URL).\n *\n * This Set tracks the original src passed into the `ngSrc` input not the src after it has been\n * run through the specified `IMAGE_LOADER`.\n */\nexport const PRELOADED_IMAGES = new InjectionToken<Set<string>>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'NG_OPTIMIZED_PRELOADED_IMAGES' : '',\n  {\n    providedIn: 'root',\n    factory: () => new Set<string>(),\n  },\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  inject,\n  Injectable,\n  Renderer2,\n  ɵformatRuntimeError as formatRuntimeError,\n} from '@angular/core';\nimport {DOCUMENT} from '../../dom_tokens';\nimport {RuntimeErrorCode} from '../../errors';\n\nimport {DEFAULT_PRELOADED_IMAGES_LIMIT, PRELOADED_IMAGES} from './tokens';\n\n/**\n * @description Contains the logic needed to track and add preload link tags to the `<head>` tag. It\n * will also track what images have already had preload link tags added so as to not duplicate link\n * tags.\n *\n * In dev mode this service will validate that the number of preloaded images does not exceed the\n * configured default preloaded images limit: {@link DEFAULT_PRELOADED_IMAGES_LIMIT}.\n */\n@Injectable({providedIn: 'root'})\nexport class PreloadLinkCreator {\n  private readonly preloadedImages = inject(PRELOADED_IMAGES);\n  private readonly document = inject(DOCUMENT);\n  private errorShown = false;\n\n  /**\n   * @description Add a preload `<link>` to the `<head>` of the `index.html` that is served from the\n   * server while using Angular Universal and SSR to kick off image loads for high priority images.\n   *\n   * The `sizes` (passed in from the user) and `srcset` (parsed and formatted from `ngSrcset`)\n   * properties used to set the corresponding attributes, `imagesizes` and `imagesrcset`\n   * respectively, on the preload `<link>` tag so that the correctly sized image is preloaded from\n   * the CDN.\n   *\n   * {@link https://web.dev/preload-responsive-images/#imagesrcset-and-imagesizes}\n   *\n   * @param renderer The `Renderer2` passed in from the directive\n   * @param src The original src of the image that is set on the `ngSrc` input.\n   * @param srcset The parsed and formatted srcset created from the `ngSrcset` input\n   * @param sizes The value of the `sizes` attribute passed in to the `<img>` tag\n   */\n  createPreloadLinkTag(renderer: Renderer2, src: string, srcset?: string, sizes?: string): void {\n    if (\n      ngDevMode &&\n      !this.errorShown &&\n      this.preloadedImages.size >= DEFAULT_PRELOADED_IMAGES_LIMIT\n    ) {\n      this.errorShown = true;\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.TOO_MANY_PRELOADED_IMAGES,\n          `The \\`NgOptimizedImage\\` directive has detected that more than ` +\n            `${DEFAULT_PRELOADED_IMAGES_LIMIT} images were marked as priority. ` +\n            `This might negatively affect an overall performance of the page. ` +\n            `To fix this, remove the \"priority\" attribute from images with less priority.`,\n        ),\n      );\n    }\n\n    if (this.preloadedImages.has(src)) {\n      return;\n    }\n\n    this.preloadedImages.add(src);\n\n    const preload = renderer.createElement('link');\n    renderer.setAttribute(preload, 'as', 'image');\n    renderer.setAttribute(preload, 'href', src);\n    renderer.setAttribute(preload, 'rel', 'preload');\n    renderer.setAttribute(preload, 'fetchpriority', 'high');\n\n    if (sizes) {\n      renderer.setAttribute(preload, 'imageSizes', sizes);\n    }\n\n    if (srcset) {\n      renderer.setAttribute(preload, 'imageSrcset', srcset);\n    }\n\n    renderer.appendChild(this.document.head, preload);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ApplicationRef,\n  booleanAttribute,\n  ChangeDetectorRef,\n  DestroyRef,\n  Directive,\n  ElementRef,\n  ɵformatRuntimeError as formatRuntimeError,\n  ɵIMAGE_CONFIG as IMAGE_CONFIG,\n  ɵIMAGE_CONFIG_DEFAULTS as IMAGE_CONFIG_DEFAULTS,\n  ɵImageConfig as ImageConfig,\n  inject,\n  Injector,\n  Input,\n  NgZone,\n  numberAttribute,\n  OnChanges,\n  OnInit,\n  ɵperformanceMarkFeature as performanceMarkFeature,\n  Renderer2,\n  ɵRuntimeError as RuntimeError,\n  ɵSafeValue as SafeValue,\n  SimpleChanges,\n  ɵunwrapSafeValue as unwrapSafeValue,\n} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../../errors';\n\nimport {imgDirectiveDetails} from './error_helper';\nimport {cloudinaryLoaderInfo} from './image_loaders/cloudinary_loader';\nimport {\n  IMAGE_LOADER,\n  ImageLoader,\n  ImageLoaderConfig,\n  noopImageLoader,\n} from './image_loaders/image_loader';\nimport {imageKitLoaderInfo} from './image_loaders/imagekit_loader';\nimport {imgixLoaderInfo} from './image_loaders/imgix_loader';\nimport {netlifyLoaderInfo} from './image_loaders/netlify_loader';\nimport {LCPImageObserver} from './lcp_image_observer';\nimport {PreconnectLinkChecker} from './preconnect_link_checker';\nimport {PreloadLinkCreator} from './preload-link-creator';\n\n/**\n * When a Base64-encoded image is passed as an input to the `NgOptimizedImage` directive,\n * an error is thrown. The image content (as a string) might be very long, thus making\n * it hard to read an error message if the entire string is included. This const defines\n * the number of characters that should be included into the error message. The rest\n * of the content is truncated.\n */\nconst BASE64_IMG_MAX_LENGTH_IN_ERROR = 50;\n\n/**\n * RegExpr to determine whether a src in a srcset is using width descriptors.\n * Should match something like: \"100w, 200w\".\n */\nconst VALID_WIDTH_DESCRIPTOR_SRCSET = /^((\\s*\\d+w\\s*(,|$)){1,})$/;\n\n/**\n * RegExpr to determine whether a src in a srcset is using density descriptors.\n * Should match something like: \"1x, 2x, 50x\". Also supports decimals like \"1.5x, 1.50x\".\n */\nconst VALID_DENSITY_DESCRIPTOR_SRCSET = /^((\\s*\\d+(\\.\\d+)?x\\s*(,|$)){1,})$/;\n\n/**\n * Srcset values with a density descriptor higher than this value will actively\n * throw an error. Such densities are not permitted as they cause image sizes\n * to be unreasonably large and slow down LCP.\n */\nexport const ABSOLUTE_SRCSET_DENSITY_CAP = 3;\n\n/**\n * Used only in error message text to communicate best practices, as we will\n * only throw based on the slightly more conservative ABSOLUTE_SRCSET_DENSITY_CAP.\n */\nexport const RECOMMENDED_SRCSET_DENSITY_CAP = 2;\n\n/**\n * Used in generating automatic density-based srcsets\n */\nconst DENSITY_SRCSET_MULTIPLIERS = [1, 2];\n\n/**\n * Used to determine which breakpoints to use on full-width images\n */\nconst VIEWPORT_BREAKPOINT_CUTOFF = 640;\n/**\n * Used to determine whether two aspect ratios are similar in value.\n */\nconst ASPECT_RATIO_TOLERANCE = 0.1;\n\n/**\n * Used to determine whether the image has been requested at an overly\n * large size compared to the actual rendered image size (after taking\n * into account a typical device pixel ratio). In pixels.\n */\nconst OVERSIZED_IMAGE_TOLERANCE = 1000;\n\n/**\n * Used to limit automatic srcset generation of very large sources for\n * fixed-size images. In pixels.\n */\nconst FIXED_SRCSET_WIDTH_LIMIT = 1920;\nconst FIXED_SRCSET_HEIGHT_LIMIT = 1080;\n\n/**\n * Default blur radius of the CSS filter used on placeholder images, in pixels\n */\nexport const PLACEHOLDER_BLUR_AMOUNT = 15;\n\n/**\n * Placeholder dimension (height or width) limit in pixels. Angular produces a warning\n * when this limit is crossed.\n */\nconst PLACEHOLDER_DIMENSION_LIMIT = 1000;\n\n/**\n * Used to warn or error when the user provides an overly large dataURL for the placeholder\n * attribute.\n * Character count of Base64 images is 1 character per byte, and base64 encoding is approximately\n * 33% larger than base images, so 4000 characters is around 3KB on disk and 10000 characters is\n * around 7.7KB. Experimentally, 4000 characters is about 20x20px in PNG or medium-quality JPEG\n * format, and 10,000 is around 50x50px, but there's quite a bit of variation depending on how the\n * image is saved.\n */\nexport const DATA_URL_WARN_LIMIT = 4000;\nexport const DATA_URL_ERROR_LIMIT = 10000;\n\n/** Info about built-in loaders we can test for. */\nexport const BUILT_IN_LOADERS = [\n  imgixLoaderInfo,\n  imageKitLoaderInfo,\n  cloudinaryLoaderInfo,\n  netlifyLoaderInfo,\n];\n\n/**\n * Threshold for the PRIORITY_TRUE_COUNT\n */\nconst PRIORITY_COUNT_THRESHOLD = 10;\n\n/**\n * This count is used to log a devMode warning\n * when the count of directive instances with priority=true\n * exceeds the threshold PRIORITY_COUNT_THRESHOLD\n */\nlet IMGS_WITH_PRIORITY_ATTR_COUNT = 0;\n\n/**\n * This function is for testing purpose.\n */\nexport function resetImagePriorityCount() {\n  IMGS_WITH_PRIORITY_ATTR_COUNT = 0;\n}\n\n/**\n * Config options used in rendering placeholder images.\n *\n * @see {@link NgOptimizedImage}\n * @publicApi\n */\nexport interface ImagePlaceholderConfig {\n  blur?: boolean;\n}\n\n/**\n * Directive that improves image loading performance by enforcing best practices.\n *\n * `NgOptimizedImage` ensures that the loading of the Largest Contentful Paint (LCP) image is\n * prioritized by:\n * - Automatically setting the `fetchpriority` attribute on the `<img>` tag\n * - Lazy loading non-priority images by default\n * - Automatically generating a preconnect link tag in the document head\n *\n * In addition, the directive:\n * - Generates appropriate asset URLs if a corresponding `ImageLoader` function is provided\n * - Automatically generates a srcset\n * - Requires that `width` and `height` are set\n * - Warns if `width` or `height` have been set incorrectly\n * - Warns if the image will be visually distorted when rendered\n *\n * @usageNotes\n * The `NgOptimizedImage` directive is marked as [standalone](guide/components/importing) and can\n * be imported directly.\n *\n * Follow the steps below to enable and use the directive:\n * 1. Import it into the necessary NgModule or a standalone Component.\n * 2. Optionally provide an `ImageLoader` if you use an image hosting service.\n * 3. Update the necessary `<img>` tags in templates and replace `src` attributes with `ngSrc`.\n * Using a `ngSrc` allows the directive to control when the `src` gets set, which triggers an image\n * download.\n *\n * Step 1: import the `NgOptimizedImage` directive.\n *\n * ```ts\n * import { NgOptimizedImage } from '@angular/common';\n *\n * // Include it into the necessary NgModule\n * @NgModule({\n *   imports: [NgOptimizedImage],\n * })\n * class AppModule {}\n *\n * // ... or a standalone Component\n * @Component({\n *   imports: [NgOptimizedImage],\n * })\n * class MyStandaloneComponent {}\n * ```\n *\n * Step 2: configure a loader.\n *\n * To use the **default loader**: no additional code changes are necessary. The URL returned by the\n * generic loader will always match the value of \"src\". In other words, this loader applies no\n * transformations to the resource URL and the value of the `ngSrc` attribute will be used as is.\n *\n * To use an existing loader for a **third-party image service**: add the provider factory for your\n * chosen service to the `providers` array. In the example below, the Imgix loader is used:\n *\n * ```ts\n * import {provideImgixLoader} from '@angular/common';\n *\n * // Call the function and add the result to the `providers` array:\n * providers: [\n *   provideImgixLoader(\"https://my.base.url/\"),\n * ],\n * ```\n *\n * The `NgOptimizedImage` directive provides the following functions:\n * - `provideCloudflareLoader`\n * - `provideCloudinaryLoader`\n * - `provideImageKitLoader`\n * - `provideImgixLoader`\n *\n * If you use a different image provider, you can create a custom loader function as described\n * below.\n *\n * To use a **custom loader**: provide your loader function as a value for the `IMAGE_LOADER` DI\n * token.\n *\n * ```ts\n * import {IMAGE_LOADER, ImageLoaderConfig} from '@angular/common';\n *\n * // Configure the loader using the `IMAGE_LOADER` token.\n * providers: [\n *   {\n *      provide: IMAGE_LOADER,\n *      useValue: (config: ImageLoaderConfig) => {\n *        return `https://example.com/${config.src}-${config.width}.jpg`;\n *      }\n *   },\n * ],\n * ```\n *\n * Step 3: update `<img>` tags in templates to use `ngSrc` instead of `src`.\n *\n * ```html\n * <img ngSrc=\"logo.png\" width=\"200\" height=\"100\">\n * ```\n *\n * @publicApi\n */\n@Directive({\n  selector: 'img[ngSrc]',\n  host: {\n    '[style.position]': 'fill ? \"absolute\" : null',\n    '[style.width]': 'fill ? \"100%\" : null',\n    '[style.height]': 'fill ? \"100%\" : null',\n    '[style.inset]': 'fill ? \"0\" : null',\n    '[style.background-size]': 'placeholder ? \"cover\" : null',\n    '[style.background-position]': 'placeholder ? \"50% 50%\" : null',\n    '[style.background-repeat]': 'placeholder ? \"no-repeat\" : null',\n    '[style.background-image]': 'placeholder ? generatePlaceholder(placeholder) : null',\n    '[style.filter]': `placeholder && shouldBlurPlaceholder(placeholderConfig) ? \"blur(${PLACEHOLDER_BLUR_AMOUNT}px)\" : null`,\n  },\n})\nexport class NgOptimizedImage implements OnInit, OnChanges {\n  private imageLoader = inject(IMAGE_LOADER);\n  private config: ImageConfig = processConfig(inject(IMAGE_CONFIG));\n  private renderer = inject(Renderer2);\n  private imgElement: HTMLImageElement = inject(ElementRef).nativeElement;\n  private injector = inject(Injector);\n\n  // An LCP image observer should be injected only in development mode.\n  // Do not assign it to `null` to avoid having a redundant property in the production bundle.\n  private lcpObserver?: LCPImageObserver;\n\n  /**\n   * Calculate the rewritten `src` once and store it.\n   * This is needed to avoid repetitive calculations and make sure the directive cleanup in the\n   * `ngOnDestroy` does not rely on the `IMAGE_LOADER` logic (which in turn can rely on some other\n   * instance that might be already destroyed).\n   */\n  private _renderedSrc: string | null = null;\n\n  /**\n   * Name of the source image.\n   * Image name will be processed by the image loader and the final URL will be applied as the `src`\n   * property of the image.\n   */\n  @Input({required: true, transform: unwrapSafeUrl}) ngSrc!: string;\n\n  /**\n   * A comma separated list of width or density descriptors.\n   * The image name will be taken from `ngSrc` and combined with the list of width or density\n   * descriptors to generate the final `srcset` property of the image.\n   *\n   * Example:\n   * ```html\n   * <img ngSrc=\"hello.jpg\" ngSrcset=\"100w, 200w\" />  =>\n   * <img src=\"path/hello.jpg\" srcset=\"path/hello.jpg?w=100 100w, path/hello.jpg?w=200 200w\" />\n   * ```\n   */\n  @Input() ngSrcset!: string;\n\n  /**\n   * The base `sizes` attribute passed through to the `<img>` element.\n   * Providing sizes causes the image to create an automatic responsive srcset.\n   */\n  @Input() sizes?: string;\n\n  /**\n   * For responsive images: the intrinsic width of the image in pixels.\n   * For fixed size images: the desired rendered width of the image in pixels.\n   */\n  @Input({transform: numberAttribute}) width: number | undefined;\n\n  /**\n   * For responsive images: the intrinsic height of the image in pixels.\n   * For fixed size images: the desired rendered height of the image in pixels.\n   */\n  @Input({transform: numberAttribute}) height: number | undefined;\n\n  /**\n   * The desired loading behavior (lazy, eager, or auto). Defaults to `lazy`,\n   * which is recommended for most images.\n   *\n   * Warning: Setting images as loading=\"eager\" or loading=\"auto\" marks them\n   * as non-priority images and can hurt loading performance. For images which\n   * may be the LCP element, use the `priority` attribute instead of `loading`.\n   */\n  @Input() loading?: 'lazy' | 'eager' | 'auto';\n\n  /**\n   * Indicates whether this image should have a high priority.\n   */\n  @Input({transform: booleanAttribute}) priority = false;\n\n  /**\n   * Data to pass through to custom loaders.\n   */\n  @Input() loaderParams?: {[key: string]: any};\n\n  /**\n   * Disables automatic srcset generation for this image.\n   */\n  @Input({transform: booleanAttribute}) disableOptimizedSrcset = false;\n\n  /**\n   * Sets the image to \"fill mode\", which eliminates the height/width requirement and adds\n   * styles such that the image fills its containing element.\n   */\n  @Input({transform: booleanAttribute}) fill = false;\n\n  /**\n   * A URL or data URL for an image to be used as a placeholder while this image loads.\n   */\n  @Input({transform: booleanOrUrlAttribute}) placeholder?: string | boolean;\n\n  /**\n   * Configuration object for placeholder settings. Options:\n   *   * blur: Setting this to false disables the automatic CSS blur.\n   */\n  @Input() placeholderConfig?: ImagePlaceholderConfig;\n\n  /**\n   * Value of the `src` attribute if set on the host `<img>` element.\n   * This input is exclusively read to assert that `src` is not set in conflict\n   * with `ngSrc` and that images don't start to load until a lazy loading strategy is set.\n   * @internal\n   */\n  @Input() src?: string;\n\n  /**\n   * Value of the `srcset` attribute if set on the host `<img>` element.\n   * This input is exclusively read to assert that `srcset` is not set in conflict\n   * with `ngSrcset` and that images don't start to load until a lazy loading strategy is set.\n   * @internal\n   */\n  @Input() srcset?: string;\n\n  constructor() {\n    if (ngDevMode) {\n      this.lcpObserver = this.injector.get(LCPImageObserver);\n\n      // Using `DestroyRef` to avoid having an empty `ngOnDestroy` method since this\n      // is only run in development mode.\n      const destroyRef = inject(DestroyRef);\n      destroyRef.onDestroy(() => {\n        if (!this.priority && this._renderedSrc !== null) {\n          this.lcpObserver!.unregisterImage(this._renderedSrc);\n        }\n      });\n    }\n  }\n\n  /** @docs-private */\n  ngOnInit() {\n    performanceMarkFeature('NgOptimizedImage');\n\n    if (ngDevMode) {\n      const ngZone = this.injector.get(NgZone);\n      assertNonEmptyInput(this, 'ngSrc', this.ngSrc);\n      assertValidNgSrcset(this, this.ngSrcset);\n      assertNoConflictingSrc(this);\n      if (this.ngSrcset) {\n        assertNoConflictingSrcset(this);\n      }\n      assertNotBase64Image(this);\n      assertNotBlobUrl(this);\n      if (this.fill) {\n        assertEmptyWidthAndHeight(this);\n        // This leaves the Angular zone to avoid triggering unnecessary change detection cycles when\n        // `load` tasks are invoked on images.\n        ngZone.runOutsideAngular(() =>\n          assertNonZeroRenderedHeight(this, this.imgElement, this.renderer),\n        );\n      } else {\n        assertNonEmptyWidthAndHeight(this);\n        if (this.height !== undefined) {\n          assertGreaterThanZero(this, this.height, 'height');\n        }\n        if (this.width !== undefined) {\n          assertGreaterThanZero(this, this.width, 'width');\n        }\n        // Only check for distorted images when not in fill mode, where\n        // images may be intentionally stretched, cropped or letterboxed.\n        ngZone.runOutsideAngular(() =>\n          assertNoImageDistortion(this, this.imgElement, this.renderer),\n        );\n      }\n      assertValidLoadingInput(this);\n      if (!this.ngSrcset) {\n        assertNoComplexSizes(this);\n      }\n      assertValidPlaceholder(this, this.imageLoader);\n      assertNotMissingBuiltInLoader(this.ngSrc, this.imageLoader);\n      assertNoNgSrcsetWithoutLoader(this, this.imageLoader);\n      assertNoLoaderParamsWithoutLoader(this, this.imageLoader);\n\n      ngZone.runOutsideAngular(() => {\n        this.lcpObserver!.registerImage(this.getRewrittenSrc(), this.ngSrc, this.priority);\n      });\n\n      if (this.priority) {\n        const checker = this.injector.get(PreconnectLinkChecker);\n        checker.assertPreconnect(this.getRewrittenSrc(), this.ngSrc);\n\n        if (typeof ngServerMode !== 'undefined' && !ngServerMode) {\n          const applicationRef = this.injector.get(ApplicationRef);\n          assetPriorityCountBelowThreshold(applicationRef);\n        }\n      }\n    }\n    if (this.placeholder) {\n      this.removePlaceholderOnLoad(this.imgElement);\n    }\n    this.setHostAttributes();\n  }\n\n  private setHostAttributes() {\n    // Must set width/height explicitly in case they are bound (in which case they will\n    // only be reflected and not found by the browser)\n    if (this.fill) {\n      this.sizes ||= '100vw';\n    } else {\n      this.setHostAttribute('width', this.width!.toString());\n      this.setHostAttribute('height', this.height!.toString());\n    }\n\n    this.setHostAttribute('loading', this.getLoadingBehavior());\n    this.setHostAttribute('fetchpriority', this.getFetchPriority());\n\n    // The `data-ng-img` attribute flags an image as using the directive, to allow\n    // for analysis of the directive's performance.\n    this.setHostAttribute('ng-img', 'true');\n\n    // The `src` and `srcset` attributes should be set last since other attributes\n    // could affect the image's loading behavior.\n    const rewrittenSrcset = this.updateSrcAndSrcset();\n\n    if (this.sizes) {\n      if (this.getLoadingBehavior() === 'lazy') {\n        this.setHostAttribute('sizes', 'auto, ' + this.sizes);\n      } else {\n        this.setHostAttribute('sizes', this.sizes);\n      }\n    } else {\n      if (\n        this.ngSrcset &&\n        VALID_WIDTH_DESCRIPTOR_SRCSET.test(this.ngSrcset) &&\n        this.getLoadingBehavior() === 'lazy'\n      ) {\n        this.setHostAttribute('sizes', 'auto, 100vw');\n      }\n    }\n\n    if (typeof ngServerMode !== 'undefined' && ngServerMode && this.priority) {\n      const preloadLinkCreator = this.injector.get(PreloadLinkCreator);\n      preloadLinkCreator.createPreloadLinkTag(\n        this.renderer,\n        this.getRewrittenSrc(),\n        rewrittenSrcset,\n        this.sizes,\n      );\n    }\n  }\n\n  /** @docs-private */\n  ngOnChanges(changes: SimpleChanges) {\n    if (ngDevMode) {\n      assertNoPostInitInputChange(this, changes, [\n        'ngSrcset',\n        'width',\n        'height',\n        'priority',\n        'fill',\n        'loading',\n        'sizes',\n        'loaderParams',\n        'disableOptimizedSrcset',\n      ]);\n    }\n    if (changes['ngSrc'] && !changes['ngSrc'].isFirstChange()) {\n      const oldSrc = this._renderedSrc;\n      this.updateSrcAndSrcset(true);\n\n      if (ngDevMode) {\n        const newSrc = this._renderedSrc;\n        if (oldSrc && newSrc && oldSrc !== newSrc) {\n          const ngZone = this.injector.get(NgZone);\n          ngZone.runOutsideAngular(() => {\n            this.lcpObserver!.updateImage(oldSrc, newSrc);\n          });\n        }\n      }\n    }\n\n    if (\n      ngDevMode &&\n      changes['placeholder']?.currentValue &&\n      typeof ngServerMode !== 'undefined' &&\n      !ngServerMode\n    ) {\n      assertPlaceholderDimensions(this, this.imgElement);\n    }\n  }\n\n  private callImageLoader(\n    configWithoutCustomParams: Omit<ImageLoaderConfig, 'loaderParams'>,\n  ): string {\n    let augmentedConfig: ImageLoaderConfig = configWithoutCustomParams;\n    if (this.loaderParams) {\n      augmentedConfig.loaderParams = this.loaderParams;\n    }\n    return this.imageLoader(augmentedConfig);\n     }\n\n  private getLoadingBehavior(): string {\n    if (!this.priority && this.loading !== undefined) {\n      return this.loading;\n    }\n    return this.priority ? 'eager' : 'lazy';\n  }\n\n  private getFetchPriority(): string {\n    return this.priority ? 'high' : 'auto';\n  }\n\n  private getRewrittenSrc(): string {\n    // ImageLoaderConfig supports setting a width property. However, we're not setting width here\n    // because if the developer uses rendered width instead of intrinsic width in the HTML width\n    // attribute, the image requested may be too small for 2x+ screens.\n    if (!this._renderedSrc) {\n      const imgConfig = {src: this.ngSrc};\n      // Cache calculated image src to reuse it later in the code.\n      this._renderedSrc = this.callImageLoader(imgConfig);\n    }\n    return this._renderedSrc;\n  }\n\n  private getRewrittenSrcset(): string {\n    const widthSrcSet = VALID_WIDTH_DESCRIPTOR_SRCSET.test(this.ngSrcset);\n    const finalSrcs = this.ngSrcset\n      .split(',')\n      .filter((src) => src !== '')\n      .map((srcStr) => {\n        srcStr = srcStr.trim();\n        const width = widthSrcSet ? parseFloat(srcStr) : parseFloat(srcStr) * this.width!;\n        return `${this.callImageLoader({src: this.ngSrc, width})} ${srcStr}`;\n      });\n    return finalSrcs.join(', ');\n  }\n\n  private getAutomaticSrcset(): string {\n    if (this.sizes) {\n      return this.getResponsiveSrcset();\n    } else {\n      return this.getFixedSrcset();\n    }\n  }\n\n  private getResponsiveSrcset(): string {\n    const {breakpoints} = this.config;\n\n    let filteredBreakpoints = breakpoints!;\n    if (this.sizes?.trim() === '100vw') {\n      // Since this is a full-screen-width image, our srcset only needs to include\n      // breakpoints with full viewport widths.\n      filteredBreakpoints = breakpoints!.filter((bp) => bp >= VIEWPORT_BREAKPOINT_CUTOFF);\n    }\n\n    const finalSrcs = filteredBreakpoints.map(\n      (bp) => `${this.callImageLoader({src: this.ngSrc, width: bp})} ${bp}w`,\n    );\n    return finalSrcs.join(', ');\n  }\n\n  private updateSrcAndSrcset(forceSrcRecalc = false): string | undefined {\n    if (forceSrcRecalc) {\n      // Reset cached value, so that the followup `getRewrittenSrc()` call\n      // will recalculate it and update the cache.\n      this._renderedSrc = null;\n    }\n\n    const rewrittenSrc = this.getRewrittenSrc();\n    this.setHostAttribute('src', rewrittenSrc);\n\n    let rewrittenSrcset: string | undefined = undefined;\n    if (this.ngSrcset) {\n      rewrittenSrcset = this.getRewrittenSrcset();\n    } else if (this.shouldGenerateAutomaticSrcset()) {\n      rewrittenSrcset = this.getAutomaticSrcset();\n    }\n\n    if (rewrittenSrcset) {\n      this.setHostAttribute('srcset', rewrittenSrcset);\n    }\n    return rewrittenSrcset;\n  }\n\n  private getFixedSrcset(): string {\n    const finalSrcs = DENSITY_SRCSET_MULTIPLIERS.map(\n      (multiplier) =>\n        `${this.callImageLoader({\n          src: this.ngSrc,\n          width: this.width! * multiplier,\n        })} ${multiplier}x`,\n    );\n    return finalSrcs.join(', ');\n  }\n\n  private shouldGenerateAutomaticSrcset(): boolean {\n    let oversizedImage = false;\n    if (!this.sizes) {\n      oversizedImage =\n        this.width! > FIXED_SRCSET_WIDTH_LIMIT || this.height! > FIXED_SRCSET_HEIGHT_LIMIT;\n    }\n    return (\n      !this.disableOptimizedSrcset &&\n      !this.srcset &&\n      this.imageLoader !== noopImageLoader &&\n      !oversizedImage\n    );\n  }\n\n  /**\n   * Returns an image url formatted for use with the CSS background-image property. Expects one of:\n   * * A base64 encoded image, which is wrapped and passed through.\n   * * A boolean. If true, calls the image loader to generate a small placeholder url.\n   */\n  private generatePlaceholder(placeholderInput: string | boolean): string | boolean | null {\n    const {placeholderResolution} = this.config;\n    if (placeholderInput === true) {\n      return `url(${this.callImageLoader({\n        src: this.ngSrc,\n        width: placeholderResolution,\n        isPlaceholder: true,\n      })})`;\n    } else if (typeof placeholderInput === 'string') {\n      return `url(${placeholderInput})`;\n    }\n    return null;\n  }\n\n  /**\n   * Determines if blur should be applied, based on an optional boolean\n   * property `blur` within the optional configuration object `placeholderConfig`.\n   */\n  private shouldBlurPlaceholder(placeholderConfig?: ImagePlaceholderConfig): boolean {\n    if (!placeholderConfig || !placeholderConfig.hasOwnProperty('blur')) {\n      return true;\n    }\n    return Boolean(placeholderConfig.blur);\n  }\n\n  private removePlaceholderOnLoad(img: HTMLImageElement): void {\n    const callback = () => {\n      const changeDetectorRef = this.injector.get(ChangeDetectorRef);\n      removeLoadListenerFn();\n      removeErrorListenerFn();\n      this.placeholder = false;\n      changeDetectorRef.markForCheck();\n    };\n\n    const removeLoadListenerFn = this.renderer.listen(img, 'load', callback);\n    const removeErrorListenerFn = this.renderer.listen(img, 'error', callback);\n\n    callOnLoadIfImageIsLoaded(img, callback);\n  }\n\n  private setHostAttribute(name: string, value: string): void {\n    this.renderer.setAttribute(this.imgElement, name, value);\n  }\n}\n\n/***** Helpers *****/\n\n/**\n * Sorts provided config breakpoints and uses defaults.\n */\nfunction processConfig(config: ImageConfig): ImageConfig {\n  let sortedBreakpoints: {breakpoints?: number[]} = {};\n  if (config.breakpoints) {\n    sortedBreakpoints.breakpoints = config.breakpoints.sort((a, b) => a - b);\n  }\n  return Object.assign({}, IMAGE_CONFIG_DEFAULTS, config, sortedBreakpoints);\n}\n\n/***** Assert functions *****/\n\n/**\n * Verifies that there is no `src` set on a host element.\n */\nfunction assertNoConflictingSrc(dir: NgOptimizedImage) {\n  if (dir.src) {\n    throw new RuntimeError(\n      RuntimeErrorCode.UNEXPECTED_SRC_ATTR,\n      `${imgDirectiveDetails(dir.ngSrc)} both \\`src\\` and \\`ngSrc\\` have been set. ` +\n        `Supplying both of these attributes breaks lazy loading. ` +\n        `The NgOptimizedImage directive sets \\`src\\` itself based on the value of \\`ngSrc\\`. ` +\n        `To fix this, please remove the \\`src\\` attribute.`,\n    );\n  }\n}\n\n/**\n * Verifies that there is no `srcset` set on a host element.\n */\nfunction assertNoConflictingSrcset(dir: NgOptimizedImage) {\n  if (dir.srcset) {\n    throw new RuntimeError(\n      RuntimeErrorCode.UNEXPECTED_SRCSET_ATTR,\n      `${imgDirectiveDetails(dir.ngSrc)} both \\`srcset\\` and \\`ngSrcset\\` have been set. ` +\n        `Supplying both of these attributes breaks lazy loading. ` +\n        `The NgOptimizedImage directive sets \\`srcset\\` itself based on the value of ` +\n        `\\`ngSrcset\\`. To fix this, please remove the \\`srcset\\` attribute.`,\n    );\n  }\n}\n\n/**\n * Verifies that the `ngSrc` is not a Base64-encoded image.\n */\nfunction assertNotBase64Image(dir: NgOptimizedImage) {\n  let ngSrc = dir.ngSrc.trim();\n  if (ngSrc.startsWith('data:')) {\n    if (ngSrc.length > BASE64_IMG_MAX_LENGTH_IN_ERROR) {\n      ngSrc = ngSrc.substring(0, BASE64_IMG_MAX_LENGTH_IN_ERROR) + '...';\n    }\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc, false)} \\`ngSrc\\` is a Base64-encoded string ` +\n        `(${ngSrc}). NgOptimizedImage does not support Base64-encoded strings. ` +\n        `To fix this, disable the NgOptimizedImage directive for this element ` +\n        `by removing \\`ngSrc\\` and using a standard \\`src\\` attribute instead.`,\n    );\n  }\n}\n\n/**\n * Verifies that the 'sizes' only includes responsive values.\n */\nfunction assertNoComplexSizes(dir: NgOptimizedImage) {\n  let sizes = dir.sizes;\n  if (sizes?.match(/((\\)|,)\\s|^)\\d+px/)) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc, false)} \\`sizes\\` was set to a string including ` +\n        `pixel values. For automatic \\`srcset\\` generation, \\`sizes\\` must only include responsive ` +\n        `values, such as \\`sizes=\"50vw\"\\` or \\`sizes=\"(min-width: 768px) 50vw, 100vw\"\\`. ` +\n        `To fix this, modify the \\`sizes\\` attribute, or provide your own \\`ngSrcset\\` value directly.`,\n    );\n  }\n}\n\nfunction assertValidPlaceholder(dir: NgOptimizedImage, imageLoader: ImageLoader) {\n  assertNoPlaceholderConfigWithoutPlaceholder(dir);\n  assertNoRelativePlaceholderWithoutLoader(dir, imageLoader);\n  assertNoOversizedDataUrl(dir);\n}\n\n/**\n * Verifies that placeholderConfig isn't being used without placeholder\n */\nfunction assertNoPlaceholderConfigWithoutPlaceholder(dir: NgOptimizedImage) {\n  if (dir.placeholderConfig && !dir.placeholder) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(\n        dir.ngSrc,\n        false,\n      )} \\`placeholderConfig\\` options were provided for an ` +\n        `image that does not use the \\`placeholder\\` attribute, and will have no effect.`,\n    );\n  }\n}\n\n/**\n * Warns if a relative URL placeholder is specified, but no loader is present to provide the small\n * image.\n */\nfunction assertNoRelativePlaceholderWithoutLoader(dir: NgOptimizedImage, imageLoader: ImageLoader) {\n  if (dir.placeholder === true && imageLoader === noopImageLoader) {\n    throw new RuntimeError(\n      RuntimeErrorCode.MISSING_NECESSARY_LOADER,\n      `${imgDirectiveDetails(dir.ngSrc)} the \\`placeholder\\` attribute is set to true but ` +\n        `no image loader is configured (i.e. the default one is being used), ` +\n        `which would result in the same image being used for the primary image and its placeholder. ` +\n        `To fix this, provide a loader or remove the \\`placeholder\\` attribute from the image.`,\n    );\n  }\n}\n\n/**\n * Warns or throws an error if an oversized dataURL placeholder is provided.\n */\nfunction assertNoOversizedDataUrl(dir: NgOptimizedImage) {\n  if (\n    dir.placeholder &&\n    typeof dir.placeholder === 'string' &&\n    dir.placeholder.startsWith('data:')\n  ) {\n    if (dir.placeholder.length > DATA_URL_ERROR_LIMIT) {\n      throw new RuntimeError(\n        RuntimeErrorCode.OVERSIZED_PLACEHOLDER,\n        `${imgDirectiveDetails(\n          dir.ngSrc,\n        )} the \\`placeholder\\` attribute is set to a data URL which is longer ` +\n          `than ${DATA_URL_ERROR_LIMIT} characters. This is strongly discouraged, as large inline placeholders ` +\n          `directly increase the bundle size of Angular and hurt page load performance. To fix this, generate ` +\n          `a smaller data URL placeholder.`,\n      );\n    }\n    if (dir.placeholder.length > DATA_URL_WARN_LIMIT) {\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.OVERSIZED_PLACEHOLDER,\n          `${imgDirectiveDetails(\n            dir.ngSrc,\n          )} the \\`placeholder\\` attribute is set to a data URL which is longer ` +\n            `than ${DATA_URL_WARN_LIMIT} characters. This is discouraged, as large inline placeholders ` +\n            `directly increase the bundle size of Angular and hurt page load performance. For better loading performance, ` +\n            `generate a smaller data URL placeholder.`,\n        ),\n      );\n    }\n  }\n}\n\n/**\n * Verifies that the `ngSrc` is not a Blob URL.\n */\nfunction assertNotBlobUrl(dir: NgOptimizedImage) {\n  const ngSrc = dir.ngSrc.trim();\n  if (ngSrc.startsWith('blob:')) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc)} \\`ngSrc\\` was set to a blob URL (${ngSrc}). ` +\n        `Blob URLs are not supported by the NgOptimizedImage directive. ` +\n        `To fix this, disable the NgOptimizedImage directive for this element ` +\n        `by removing \\`ngSrc\\` and using a regular \\`src\\` attribute instead.`,\n    );\n  }\n}\n\n/**\n * Verifies that the input is set to a non-empty string.\n */\nfunction assertNonEmptyInput(dir: NgOptimizedImage, name: string, value: unknown) {\n  const isString = typeof value === 'string';\n  const isEmptyString = isString && value.trim() === '';\n  if (!isString || isEmptyString) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc)} \\`${name}\\` has an invalid value ` +\n        `(\\`${value}\\`). To fix this, change the value to a non-empty string.`,\n    );\n  }\n}\n\n/**\n * Verifies that the `ngSrcset` is in a valid format, e.g. \"100w, 200w\" or \"1x, 2x\".\n */\nexport function assertValidNgSrcset(dir: NgOptimizedImage, value: unknown) {\n  if (value == null) return;\n  assertNonEmptyInput(dir, 'ngSrcset', value);\n  const stringVal = value as string;\n  const isValidWidthDescriptor = VALID_WIDTH_DESCRIPTOR_SRCSET.test(stringVal);\n  const isValidDensityDescriptor = VALID_DENSITY_DESCRIPTOR_SRCSET.test(stringVal);\n\n  if (isValidDensityDescriptor) {\n    assertUnderDensityCap(dir, stringVal);\n  }\n\n  const isValidSrcset = isValidWidthDescriptor || isValidDensityDescriptor;\n  if (!isValidSrcset) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc)} \\`ngSrcset\\` has an invalid value (\\`${value}\\`). ` +\n        `To fix this, supply \\`ngSrcset\\` using a comma-separated list of one or more width ` +\n        `descriptors (e.g. \"100w, 200w\") or density descriptors (e.g. \"1x, 2x\").`,\n    );\n  }\n}\n\nfunction assertUnderDensityCap(dir: NgOptimizedImage, value: string) {\n  const underDensityCap = value\n    .split(',')\n    .every((num) => num === '' || parseFloat(num) <= ABSOLUTE_SRCSET_DENSITY_CAP);\n  if (!underDensityCap) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc)} the \\`ngSrcset\\` contains an unsupported image density:` +\n        `\\`${value}\\`. NgOptimizedImage generally recommends a max image density of ` +\n        `${RECOMMENDED_SRCSET_DENSITY_CAP}x but supports image densities up to ` +\n        `${ABSOLUTE_SRCSET_DENSITY_CAP}x. The human eye cannot distinguish between image densities ` +\n        `greater than ${RECOMMENDED_SRCSET_DENSITY_CAP}x - which makes them unnecessary for ` +\n        `most use cases. Images that will be pinch-zoomed are typically the primary use case for ` +\n        `${ABSOLUTE_SRCSET_DENSITY_CAP}x images. Please remove the high density descriptor and try again.`,\n    );\n  }\n}\n\n/**\n * Creates a `RuntimeError` instance to represent a situation when an input is set after\n * the directive has initialized.\n */\nfunction postInitInputChangeError(dir: NgOptimizedImage, inputName: string): {} {\n  let reason!: string;\n  if (inputName === 'width' || inputName === 'height') {\n    reason =\n      `Changing \\`${inputName}\\` may result in different attribute value ` +\n      `applied to the underlying image element and cause layout shifts on a page.`;\n  } else {\n    reason =\n      `Changing the \\`${inputName}\\` would have no effect on the underlying ` +\n      `image element, because the resource loading has already occurred.`;\n  }\n  return new RuntimeError(\n    RuntimeErrorCode.UNEXPECTED_INPUT_CHANGE,\n    `${imgDirectiveDetails(dir.ngSrc)} \\`${inputName}\\` was updated after initialization. ` +\n      `The NgOptimizedImage directive will not react to this input change. ${reason} ` +\n      `To fix this, either switch \\`${inputName}\\` to a static value ` +\n      `or wrap the image element in an @if that is gated on the necessary value.`,\n  );\n}\n\n/**\n * Verify that none of the listed inputs has changed.\n */\nfunction assertNoPostInitInputChange(\n  dir: NgOptimizedImage,\n  changes: SimpleChanges,\n  inputs: string[],\n) {\n  inputs.forEach((input) => {\n    const isUpdated = changes.hasOwnProperty(input);\n    if (isUpdated && !changes[input].isFirstChange()) {\n      if (input === 'ngSrc') {\n        // When the `ngSrc` input changes, we detect that only in the\n        // `ngOnChanges` hook, thus the `ngSrc` is already set. We use\n        // `ngSrc` in the error message, so we use a previous value, but\n        // not the updated one in it.\n        dir = {ngSrc: changes[input].previousValue} as NgOptimizedImage;\n      }\n      throw postInitInputChangeError(dir, input);\n    }\n  });\n}\n\n/**\n * Verifies that a specified input is a number greater than 0.\n */\nfunction assertGreaterThanZero(dir: NgOptimizedImage, inputValue: unknown, inputName: string) {\n  const validNumber = typeof inputValue === 'number' && inputValue > 0;\n  const validString =\n    typeof inputValue === 'string' && /^\\d+$/.test(inputValue.trim()) && parseInt(inputValue) > 0;\n  if (!validNumber && !validString) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc)} \\`${inputName}\\` has an invalid value. ` +\n        `To fix this, provide \\`${inputName}\\` as a number greater than 0.`,\n    );\n  }\n}\n\n/**\n * Verifies that the rendered image is not visually distorted. Effectively this is checking:\n * - Whether the \"width\" and \"height\" attributes reflect the actual dimensions of the image.\n * - Whether image styling is \"correct\" (see below for a longer explanation).\n */\nfunction assertNoImageDistortion(\n  dir: NgOptimizedImage,\n  img: HTMLImageElement,\n  renderer: Renderer2,\n) {\n  const callback = () => {\n    removeLoadListenerFn();\n    removeErrorListenerFn();\n    const computedStyle = window.getComputedStyle(img);\n    let renderedWidth = parseFloat(computedStyle.getPropertyValue('width'));\n    let renderedHeight = parseFloat(computedStyle.getPropertyValue('height'));\n    const boxSizing = computedStyle.getPropertyValue('box-sizing');\n\n    if (boxSizing === 'border-box') {\n      const paddingTop = computedStyle.getPropertyValue('padding-top');\n      const paddingRight = computedStyle.getPropertyValue('padding-right');\n      const paddingBottom = computedStyle.getPropertyValue('padding-bottom');\n      const paddingLeft = computedStyle.getPropertyValue('padding-left');\n      renderedWidth -= parseFloat(paddingRight) + parseFloat(paddingLeft);\n      renderedHeight -= parseFloat(paddingTop) + parseFloat(paddingBottom);\n    }\n\n    const renderedAspectRatio = renderedWidth / renderedHeight;\n    const nonZeroRenderedDimensions = renderedWidth !== 0 && renderedHeight !== 0;\n\n    const intrinsicWidth = img.naturalWidth;\n    const intrinsicHeight = img.naturalHeight;\n    const intrinsicAspectRatio = intrinsicWidth / intrinsicHeight;\n\n    const suppliedWidth = dir.width!;\n    const suppliedHeight = dir.height!;\n    const suppliedAspectRatio = suppliedWidth / suppliedHeight;\n\n    // Tolerance is used to account for the impact of subpixel rendering.\n    // Due to subpixel rendering, the rendered, intrinsic, and supplied\n    // aspect ratios of a correctly configured image may not exactly match.\n    // For example, a `width=4030 height=3020` image might have a rendered\n    // size of \"1062w, 796.48h\". (An aspect ratio of 1.334... vs. 1.333...)\n    const inaccurateDimensions =\n      Math.abs(suppliedAspectRatio - intrinsicAspectRatio) > ASPECT_RATIO_TOLERANCE;\n    const stylingDistortion =\n      nonZeroRenderedDimensions &&\n      Math.abs(intrinsicAspectRatio - renderedAspectRatio) > ASPECT_RATIO_TOLERANCE;\n\n    if (inaccurateDimensions) {\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.INVALID_INPUT,\n          `${imgDirectiveDetails(dir.ngSrc)} the aspect ratio of the image does not match ` +\n            `the aspect ratio indicated by the width and height attributes. ` +\n            `\\nIntrinsic image size: ${intrinsicWidth}w x ${intrinsicHeight}h ` +\n            `(aspect-ratio: ${round(\n              intrinsicAspectRatio,\n            )}). \\nSupplied width and height attributes: ` +\n            `${suppliedWidth}w x ${suppliedHeight}h (aspect-ratio: ${round(\n              suppliedAspectRatio,\n            )}). ` +\n            `\\nTo fix this, update the width and height attributes.`,\n        ),\n      );\n    } else if (stylingDistortion) {\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.INVALID_INPUT,\n          `${imgDirectiveDetails(dir.ngSrc)} the aspect ratio of the rendered image ` +\n            `does not match the image's intrinsic aspect ratio. ` +\n            `\\nIntrinsic image size: ${intrinsicWidth}w x ${intrinsicHeight}h ` +\n            `(aspect-ratio: ${round(intrinsicAspectRatio)}). \\nRendered image size: ` +\n            `${renderedWidth}w x ${renderedHeight}h (aspect-ratio: ` +\n            `${round(renderedAspectRatio)}). \\nThis issue can occur if \"width\" and \"height\" ` +\n            `attributes are added to an image without updating the corresponding ` +\n            `image styling. To fix this, adjust image styling. In most cases, ` +\n            `adding \"height: auto\" or \"width: auto\" to the image styling will fix ` +\n            `this issue.`,\n        ),\n      );\n    } else if (!dir.ngSrcset && nonZeroRenderedDimensions) {\n      // If `ngSrcset` hasn't been set, sanity check the intrinsic size.\n      const recommendedWidth = RECOMMENDED_SRCSET_DENSITY_CAP * renderedWidth;\n      const recommendedHeight = RECOMMENDED_SRCSET_DENSITY_CAP * renderedHeight;\n      const oversizedWidth = intrinsicWidth - recommendedWidth >= OVERSIZED_IMAGE_TOLERANCE;\n      const oversizedHeight = intrinsicHeight - recommendedHeight >= OVERSIZED_IMAGE_TOLERANCE;\n      if (oversizedWidth || oversizedHeight) {\n        console.warn(\n          formatRuntimeError(\n            RuntimeErrorCode.OVERSIZED_IMAGE,\n            `${imgDirectiveDetails(dir.ngSrc)} the intrinsic image is significantly ` +\n              `larger than necessary. ` +\n              `\\nRendered image size: ${renderedWidth}w x ${renderedHeight}h. ` +\n              `\\nIntrinsic image size: ${intrinsicWidth}w x ${intrinsicHeight}h. ` +\n              `\\nRecommended intrinsic image size: ${recommendedWidth}w x ${recommendedHeight}h. ` +\n              `\\nNote: Recommended intrinsic image size is calculated assuming a maximum DPR of ` +\n              `${RECOMMENDED_SRCSET_DENSITY_CAP}. To improve loading time, resize the image ` +\n              `or consider using the \"ngSrcset\" and \"sizes\" attributes.`,\n          ),\n        );\n      }\n    }\n  };\n\n  const removeLoadListenerFn = renderer.listen(img, 'load', callback);\n\n  // We only listen to the `error` event to remove the `load` event listener because it will not be\n  // fired if the image fails to load. This is done to prevent memory leaks in development mode\n  // because image elements aren't garbage-collected properly. It happens because zone.js stores the\n  // event listener directly on the element and closures capture `dir`.\n  const removeErrorListenerFn = renderer.listen(img, 'error', () => {\n    removeLoadListenerFn();\n    removeErrorListenerFn();\n  });\n\n  callOnLoadIfImageIsLoaded(img, callback);\n}\n\n/**\n * Verifies that a specified input is set.\n */\nfunction assertNonEmptyWidthAndHeight(dir: NgOptimizedImage) {\n  let missingAttributes = [];\n  if (dir.width === undefined) missingAttributes.push('width');\n  if (dir.height === undefined) missingAttributes.push('height');\n  if (missingAttributes.length > 0) {\n    throw new RuntimeError(\n      RuntimeErrorCode.REQUIRED_INPUT_MISSING,\n      `${imgDirectiveDetails(dir.ngSrc)} these required attributes ` +\n        `are missing: ${missingAttributes.map((attr) => `\"${attr}\"`).join(', ')}. ` +\n        `Including \"width\" and \"height\" attributes will prevent image-related layout shifts. ` +\n        `To fix this, include \"width\" and \"height\" attributes on the image tag or turn on ` +\n        `\"fill\" mode with the \\`fill\\` attribute.`,\n    );\n  }\n}\n\n/**\n * Verifies that width and height are not set. Used in fill mode, where those attributes don't make\n * sense.\n */\nfunction assertEmptyWidthAndHeight(dir: NgOptimizedImage) {\n  if (dir.width || dir.height) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc)} the attributes \\`height\\` and/or \\`width\\` are present ` +\n        `along with the \\`fill\\` attribute. Because \\`fill\\` mode causes an image to fill its containing ` +\n        `element, the size attributes have no effect and should be removed.`,\n    );\n  }\n}\n\n/**\n * Verifies that the rendered image has a nonzero height. If the image is in fill mode, provides\n * guidance that this can be caused by the containing element's CSS position property.\n */\nfunction assertNonZeroRenderedHeight(\n  dir: NgOptimizedImage,\n  img: HTMLImageElement,\n  renderer: Renderer2,\n) {\n  const callback = () => {\n    removeLoadListenerFn();\n    removeErrorListenerFn();\n    const renderedHeight = img.clientHeight;\n    if (dir.fill && renderedHeight === 0) {\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.INVALID_INPUT,\n          `${imgDirectiveDetails(dir.ngSrc)} the height of the fill-mode image is zero. ` +\n            `This is likely because the containing element does not have the CSS 'position' ` +\n            `property set to one of the following: \"relative\", \"fixed\", or \"absolute\". ` +\n            `To fix this problem, make sure the container element has the CSS 'position' ` +\n            `property defined and the height of the element is not zero.`,\n        ),\n      );\n    }\n  };\n\n  const removeLoadListenerFn = renderer.listen(img, 'load', callback);\n\n  // See comments in the `assertNoImageDistortion`.\n  const removeErrorListenerFn = renderer.listen(img, 'error', () => {\n    removeLoadListenerFn();\n    removeErrorListenerFn();\n  });\n\n  callOnLoadIfImageIsLoaded(img, callback);\n}\n\n/**\n * Verifies that the `loading` attribute is set to a valid input &\n * is not used on priority images.\n */\nfunction assertValidLoadingInput(dir: NgOptimizedImage) {\n  if (dir.loading && dir.priority) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc)} the \\`loading\\` attribute ` +\n        `was used on an image that was marked \"priority\". ` +\n        `Setting \\`loading\\` on priority images is not allowed ` +\n        `because these images will always be eagerly loaded. ` +\n        `To fix this, remove the “loading” attribute from the priority image.`,\n    );\n  }\n  const validInputs = ['auto', 'eager', 'lazy'];\n  if (typeof dir.loading === 'string' && !validInputs.includes(dir.loading)) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INPUT,\n      `${imgDirectiveDetails(dir.ngSrc)} the \\`loading\\` attribute ` +\n        `has an invalid value (\\`${dir.loading}\\`). ` +\n        `To fix this, provide a valid value (\"lazy\", \"eager\", or \"auto\").`,\n    );\n  }\n}\n\n/**\n * Warns if NOT using a loader (falling back to the generic loader) and\n * the image appears to be hosted on one of the image CDNs for which\n * we do have a built-in image loader. Suggests switching to the\n * built-in loader.\n *\n * @param ngSrc Value of the ngSrc attribute\n * @param imageLoader ImageLoader provided\n */\nfunction assertNotMissingBuiltInLoader(ngSrc: string, imageLoader: ImageLoader) {\n  if (imageLoader === noopImageLoader) {\n    let builtInLoaderName = '';\n    for (const loader of BUILT_IN_LOADERS) {\n      if (loader.testUrl(ngSrc)) {\n        builtInLoaderName = loader.name;\n        break;\n      }\n    }\n    if (builtInLoaderName) {\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.MISSING_BUILTIN_LOADER,\n          `NgOptimizedImage: It looks like your images may be hosted on the ` +\n            `${builtInLoaderName} CDN, but your app is not using Angular's ` +\n            `built-in loader for that CDN. We recommend switching to use ` +\n            `the built-in by calling \\`provide${builtInLoaderName}Loader()\\` ` +\n            `in your \\`providers\\` and passing it your instance's base URL. ` +\n            `If you don't want to use the built-in loader, define a custom ` +\n            `loader function using IMAGE_LOADER to silence this warning.`,\n        ),\n      );\n    }\n  }\n}\n\n/**\n * Warns if ngSrcset is present and no loader is configured (i.e. the default one is being used).\n */\nfunction assertNoNgSrcsetWithoutLoader(dir: NgOptimizedImage, imageLoader: ImageLoader) {\n  if (dir.ngSrcset && imageLoader === noopImageLoader) {\n    console.warn(\n      formatRuntimeError(\n        RuntimeErrorCode.MISSING_NECESSARY_LOADER,\n        `${imgDirectiveDetails(dir.ngSrc)} the \\`ngSrcset\\` attribute is present but ` +\n          `no image loader is configured (i.e. the default one is being used), ` +\n          `which would result in the same image being used for all configured sizes. ` +\n          `To fix this, provide a loader or remove the \\`ngSrcset\\` attribute from the image.`,\n      ),\n    );\n  }\n}\n\n/**\n * Warns if loaderParams is present and no loader is configured (i.e. the default one is being\n * used).\n */\nfunction assertNoLoaderParamsWithoutLoader(dir: NgOptimizedImage, imageLoader: ImageLoader) {\n  if (dir.loaderParams && imageLoader === noopImageLoader) {\n    console.warn(\n      formatRuntimeError(\n        RuntimeErrorCode.MISSING_NECESSARY_LOADER,\n        `${imgDirectiveDetails(dir.ngSrc)} the \\`loaderParams\\` attribute is present but ` +\n          `no image loader is configured (i.e. the default one is being used), ` +\n          `which means that the loaderParams data will not be consumed and will not affect the URL. ` +\n          `To fix this, provide a custom loader or remove the \\`loaderParams\\` attribute from the image.`,\n      ),\n    );\n  }\n}\n\n/**\n * Warns if the priority attribute is used too often on page load\n */\nasync function assetPriorityCountBelowThreshold(appRef: ApplicationRef) {\n  if (IMGS_WITH_PRIORITY_ATTR_COUNT === 0) {\n    IMGS_WITH_PRIORITY_ATTR_COUNT++;\n    await appRef.whenStable();\n    if (IMGS_WITH_PRIORITY_ATTR_COUNT > PRIORITY_COUNT_THRESHOLD) {\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.TOO_MANY_PRIORITY_ATTRIBUTES,\n          `NgOptimizedImage: The \"priority\" attribute is set to true more than ${PRIORITY_COUNT_THRESHOLD} times (${IMGS_WITH_PRIORITY_ATTR_COUNT} times). ` +\n            `Marking too many images as \"high\" priority can hurt your application's LCP (https://web.dev/lcp). ` +\n            `\"Priority\" should only be set on the image expected to be the page's LCP element.`,\n        ),\n      );\n    }\n  } else {\n    IMGS_WITH_PRIORITY_ATTR_COUNT++;\n  }\n}\n\n/**\n * Warns if placeholder's dimension are over a threshold.\n *\n * This assert function is meant to only run on the browser.\n */\nfunction assertPlaceholderDimensions(dir: NgOptimizedImage, imgElement: HTMLImageElement) {\n  const computedStyle = window.getComputedStyle(imgElement);\n  let renderedWidth = parseFloat(computedStyle.getPropertyValue('width'));\n  let renderedHeight = parseFloat(computedStyle.getPropertyValue('height'));\n\n  if (renderedWidth > PLACEHOLDER_DIMENSION_LIMIT || renderedHeight > PLACEHOLDER_DIMENSION_LIMIT) {\n    console.warn(\n      formatRuntimeError(\n        RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED,\n        `${imgDirectiveDetails(dir.ngSrc)} it uses a placeholder image, but at least one ` +\n          `of the dimensions attribute (height or width) exceeds the limit of ${PLACEHOLDER_DIMENSION_LIMIT}px. ` +\n          `To fix this, use a smaller image as a placeholder.`,\n      ),\n    );\n  }\n}\n\nfunction callOnLoadIfImageIsLoaded(img: HTMLImageElement, callback: VoidFunction): void {\n  // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-complete\n  // The spec defines that `complete` is truthy once its request state is fully available.\n  // The image may already be available if it’s loaded from the browser cache.\n  // In that case, the `load` event will not fire at all, meaning that all setup\n  // callbacks listening for the `load` event will not be invoked.\n  // In Safari, there is a known behavior where the `complete` property of an\n  // `HTMLImageElement` may sometimes return `true` even when the image is not fully loaded.\n  // Checking both `img.complete` and `img.naturalWidth` is the most reliable way to\n  // determine if an image has been fully loaded, especially in browsers where the\n  // `complete` property may return `true` prematurely.\n  if (img.complete && img.naturalWidth) {\n    callback();\n  }\n}\n\nfunction round(input: number): number | string {\n  return Number.isInteger(input) ? input : input.toFixed(2);\n}\n\n// Transform function to handle SafeValue input for ngSrc. This doesn't do any sanitization,\n// as that is not needed for img.src and img.srcset. This transform is purely for compatibility.\nfunction unwrapSafeUrl(value: string | SafeValue): string {\n  if (typeof value === 'string') {\n    return value;\n  }\n  return unwrapSafeValue(value);\n}\n\n// Transform function to handle inputs which may be booleans, strings, or string representations\n// of boolean values. Used for the placeholder attribute.\nexport function booleanOrUrlAttribute(value: boolean | string): boolean | string {\n  if (typeof value === 'string' && value !== 'true' && value !== 'false' && value !== '') {\n    return value;\n  }\n  return booleanAttribute(value);\n}\n"],"names":["ɵregisterLocaleData","ɵɵdefineInjectable","RuntimeError","formatRuntimeError","IMAGE_CONFIG","performanceMarkFeature","IMAGE_CONFIG_DEFAULTS","unwrapSafeValue"],"mappings":"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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"}%dx   /**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { Optional, Inject, Injectable, ɵgetLocalePluralCase as _getLocalePluralCase, ɵfindLocaleData as _findLocaleData, ɵLocaleDataIndex as _LocaleDataIndex, ɵgetLocaleCurrencyCode as _getLocaleCurrencyCode, LOCALE_ID, ɵstringify as _stringify, Input, Directive, createNgModule, NgModuleRef, ɵRuntimeError as _RuntimeError, Host, Attribute, RendererStyleFlags2, ɵisPromise as _isPromise, ɵisSubscribable as _isSubscribable, untracked, Pipe, InjectionToken, DEFAULT_CURRENCY_CODE, NgModule } from '@angular/core';
import { LocationStrategy, joinWithSlash, normalizeQueryParams, PlatformLocation, APP_BASE_HREF } from './location-Dq4mJT-A.mjs';

/**
 * @description
 * A {@link LocationStrategy} used to configure the {@link Location} service to
 * represent its state in the
 * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)
 * of the browser's URL.
 *
 * For instance, if you call `location.go('/foo')`, the browser's URL will become
 * `example.com#/foo`.
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example common/location/ts/hash_location_component.ts region='LocationComponent'}
 *
 * @publicApi
 */
class HashLocationStrategy extends LocationStrategy {
    _platformLocation;
    _baseHref = '';
    _removeListenerFns = [];
    constructor(_platformLocation, _baseHref) {
        super();
        this._platformLocation = _platformLocation;
        if (_baseHref != null) {
            this._baseHref = _baseHref;
        }
    }
    /** @docs-private */
    ngOnDestroy() {
        while (this._removeListenerFns.length) {
            this._removeListenerFns.pop()();
        }
    }
    onPopState(fn) {
        this._removeListenerFns.push(this._platformLocation.onPopState(fn), this._platformLocation.onHashChange(fn));
    }
    getBaseHref() {
        return this._baseHref;
    }
    path(includeHash = false) {
        // the hash value is always prefixed with a `#`
        // and if it is empty then it will stay empty
        const path = this._platformLocation.hash ?? '#';
        return path.length > 0 ? path.substring(1) : path;
    }
    prepareExternalUrl(internal) {
        const url = joinWithSlash(this._baseHref, internal);
        return url.length > 0 ? '#' + url : url;
    }
    pushState(state, title, path, queryParams) {
        const url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) ||
            this._platformLocation.pathname;
        this._platformLocation.pushState(state, title, url);
    }
    replaceState(state, title, path, queryParams) {
        const url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) ||
            this._platformLocation.pathname;
        this._platformLocation.replaceState(state, title, url);
    }
    forward() {
        this._platformLocation.forward();
    }
    back() {
        this._platformLocation.back();
    }
    getState() {
        return this._platformLocation.getState();
    }
    historyGo(relativePosition = 0) {
        this._platformLocation.historyGo?.(relativePosition);
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HashLocationStrategy, deps: [{ token: PlatformLocation }, { token: APP_BASE_HREF, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HashLocationStrategy });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HashLocationStrategy, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: PlatformLocation }, { type: undefined, decorators: [{
                    type: Optional
                }, {
                    type: Inject,
                    args: [APP_BASE_HREF]
                }] }] });

/** @internal */
const CURRENCIES_EN = { "ADP": [undefined, undefined, 0], "AFN": [undefined, "؋", 0], "ALL": [undefined, undefined, 0], "AMD": [undefined, "֏", 2], "AOA": [undefined, "Kz"], "ARS": [undefined, "$"], "AUD": ["A$", "$"], "AZN": [undefined, "₼"], "BAM": [undefined, "KM"], "BBD": [undefined, "$"], "BDT": [undefined, "৳"], "BHD": [undefined, undefined, 3], "BIF": [undefined, undefined, 0], "BMD": [undefined, "$"], "BND": [undefined, "$"], "BOB": [undefined, "Bs"], "BRL": ["R$"], "BSD": [undefined, "$"], "BWP": [undefined, "P"], "BYN": [undefined, undefined, 2], "BYR": [undefined, undefined, 0], "BZD": [undefined, "$"], "CAD": ["CA$", "$", 2], "CHF": [undefined, undefined, 2], "CLF": [undefined, undefined, 4], "CLP": [undefined, "$", 0], "CNY": ["CN¥", "¥"], "COP": [undefined, "$", 2], "CRC": [undefined, "₡", 2], "CUC": [undefined, "$"], "CUP": [undefined, "$"], "CZK": [undefined, "Kč", 2], "DJF": [undefined, undefined, 0], "DKK": [undefined, "kr", 2], "DOP": [undefined, "$"], "EGP": [undefined, "E£"], "ESP": [undefined, "₧", 0], "EUR": ["€"], "FJD": [undefined, "$"], "FKP": [undefined, "£"], "GBP": ["£"], "GEL": [undefined, "₾"], "GHS": [undefined, "GH₵"], "GIP": [undefined, "£"], "GNF": [undefined, "FG", 0], "GTQ": [undefined, "Q"], "GYD": [undefined, "$", 2], "HKD": ["HK$", "$"], "HNL": [undefined, "L"], "HRK": [undefined, "kn"], "HUF": [undefined, "Ft", 2], "IDR": [undefined, "Rp", 2], "ILS": ["₪"], "INR": ["₹"], "IQD": [undefined, undefined, 0], "IRR": [undefined, undefined, 0], "ISK": [undefined, "kr", 0], "ITL": [undefined, undefined, 0], "JMD": [undefined, "$"], "JOD": [undefined, undefined, 3], "JPY": ["¥", undefined, 0], "KHR": [undefined, "៛"], "KMF": [undefined, "CF", 0], "KPW": [undefined, "₩", 0], "KRW": ["₩", undefined, 0], "KWD": [undefined, undefined, 3], "KYD": [undefined, "$"], "KZT": [undefined, "₸"], "LAK": [undefined, "₭", 0], "LBP": [undefined, "L£", 0], "LKR": [undefined, "Rs"], "LRD": [undefined, "$"], "LTL": [undefined, "Lt"], "LUF": [undefined, undefined, 0], "LVL": [undefined, "Ls"], "LYD": [undefined, undefined, 3], "MGA": [undefined, "Ar", 0], "MGF": [undefined, undefined, 0], "MMK": [undefined, "K", 0], "MNT": [undefined, "₮", 2], "MRO": [undefined, undefined, 0], "MUR": [undefined, "Rs", 2], "MXN": ["MX$", "$"], "MYR": [undefined, "RM"], "NAD": [undefined, "$"], "NGN": [undefined, "₦"], "NIO": [undefined, "C$"], "NOK": [undefined, "kr", 2], "NPR": [undefined, "Rs"], "NZD": ["NZ$", "$"], "OMR": [undefined, undefined, 3], "PHP": ["₱"], "PKR": [undefined, "Rs", 2], "PLN": [undefined, "zł"], "PYG": [undefined, "₲", 0], "RON": [undefined, "lei"], "RSD": [undefined, undefined, 0], "RUB": [undefined, "₽"], "RWF": [undefined, "RF", 0], "SBD": [undefined, "$"], "SEK": [undefined, "kr", 2], "SGD": [undefined, "$"], "SHP": [undefined, "£"], "SLE": [undefined, undefined, 2], "SLL": [undefined, undefined, 0], "SOS": [undefined, undefined, 0], "SRD": [undefined, "$"], "SSP": [undefined, "£"], "STD": [undefined, undefined, 0], "STN": [undefined, "Db"], "SYP": [undefined, "£", 0], "THB": [undefined, "฿"], "TMM": [undefined, undefined, 0], "TND": [undefined, undefined, 3], "TOP": [undefined, "T$"], "TRL": [undefined, undefined, 0], "TRY": [undefined, "₺"], "TTD": [undefined, "$"], "TWD": ["NT$", "$", 2], "TZS": [undefined, undefined, 2], "UAH": [undefined, "₴"], "UGX": [undefined, undefined, 0], "USD": ["$"], "UYI": [undefined, undefined, 0], "UYU": [undefined, "$"], "UYW": [undefined, undefined, 4], "UZS": [undefined, undefined, 2], "VEF": [undefined, "Bs", 2], "VND": ["₫", undefined, 0], "VUV": [undefined, undefined, 0], "XAF": ["FCFA", undefined, 0], "XCD": ["EC$", "$"], "XOF": ["F CFA", undefined, 0], "XPF": ["CFPF", undefined, 0], "XXX": ["¤"], "YER": [undefined, undefined, 0], "ZAR": [undefined, "R"], "ZMK": [undefined, undefined, 0], "ZMW": [undefined, "ZK"], "ZWD": [undefined, undefined, 0] };

/**
 * Format styles that can be used to represent numbers.
 * @see {@link getLocaleNumberFormat}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated `getLocaleNumberFormat` is deprecated
 */
var NumberFormatStyle;
(function (NumberFormatStyle) {
    NumberFormatStyle[NumberFormatStyle["Decimal"] = 0] = "Decimal";
    NumberFormatStyle[NumberFormatStyle["Percent"] = 1] = "Percent";
    NumberFormatStyle[NumberFormatStyle["Currency"] = 2] = "Currency";
    NumberFormatStyle[NumberFormatStyle["Scientific"] = 3] = "Scientific";
})(NumberFormatStyle || (NumberFormatStyle = {}));
/**
 * Plurality cases used for translating plurals to different languages.
 *
 * @see {@link NgPlural}
 * @see {@link NgPluralCase}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated `getLocalePluralCase` is deprecated
 */
var Plural;
(function (Plural) {
    Plural[Plural["Zero"] = 0] = "Zero";
    Plural[Plural["One"] = 1] = "One";
    Plural[Plural["Two"] = 2] = "Two";
    Plural[Plural["Few"] = 3] = "Few";
    Plural[Plural["Many"] = 4] = "Many";
    Plural[Plural["Other"] = 5] = "Other";
})(Plural || (Plural = {}));
/**
 * Context-dependant translation forms for strings.
 * Typically the standalone version is for the nominative form of the word,
 * and the format version is used for the genitive case.
 * @see [CLDR website](http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles)
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated locale data getters are deprecated
 */
var FormStyle;
(function (FormStyle) {
    FormStyle[FormStyle["Format"] = 0] = "Format";
    FormStyle[FormStyle["Standalone"] = 1] = "Standalone";
})(FormStyle || (FormStyle = {}));
/**
 * String widths available for translations.
 * The specific character widths are locale-specific.
 * Examples are given for the word "Sunday" in English.
 *
 * @publicApi
 *
 * @deprecated locale data getters are deprecated
 */
var TranslationWidth;
(function (TranslationWidth) {
    /** 1 character for `en-US`. For example: 'S' */
    TranslationWidth[TranslationWidth["Narrow"] = 0] = "Narrow";
    /** 3 characters for `en-US`. For example: 'Sun' */
    TranslationWidth[TranslationWidth["Abbreviated"] = 1] = "Abbreviated";
    /** Full length for `en-US`. For example: "Sunday" */
    TranslationWidth[TranslationWidth["Wide"] = 2] = "Wide";
    /** 2 characters for `en-US`, For example: "Su" */
    TranslationWidth[TranslationWidth["Short"] = 3] = "Short";
})(TranslationWidth || (TranslationWidth = {}));
/**
 * String widths available for date-time formats.
 * The specific character widths are locale-specific.
 * Examples are given for `en-US`.
 *
 * @see {@link getLocaleDateFormat}
 * @see {@link getLocaleTimeFormat}
 * @see {@link getLocaleDateTimeFormat}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 * @publicApi
 *
 * @deprecated Date locale data getters are deprecated
 */
var FormatWidth;
(function (FormatWidth) {
    /**
     * For `en-US`, `'M/d/yy, h:mm a'`
     * (Example: `6/15/15, 9:03 AM`)
     */
    FormatWidth[FormatWidth["Short"] = 0] = "Short";
    /**
     * For `en-US`, `'MMM d, y, h:mm:ss a'`
     * (Example: `Jun 15, 2015, 9:03:01 AM`)
     */
    FormatWidth[FormatWidth["Medium"] = 1] = "Medium";
    /**
     * For `en-US`, `'MMMM d, y, h:mm:ss a z'`
     * (Example: `June 15, 2015 at 9:03:01 AM GMT+1`)
     */
    FormatWidth[FormatWidth["Long"] = 2] = "Long";
    /**
     * For `en-US`, `'EEEE, MMMM d, y, h:mm:ss a zzzz'`
     * (Example: `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00`)
     */
    FormatWidth[FormatWidth["Full"] = 3] = "Full";
})(FormatWidth || (FormatWidth = {}));
// This needs to be an object literal, rather than an enum, because TypeScript 5.4+
// doesn't allow numeric keys and we have `Infinity` and `NaN`.
/**
 * Symbols that can be used to replace placeholders in number patterns.
 * Examples are based on `en-US` values.
 *
 * @see {@link getLocaleNumberSymbol}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated `getLocaleNumberSymbol` is deprecated
 *
 * @object-literal-as-enum
 */
const NumberSymbol = {
    /**
     * Decimal separator.
     * For `en-US`, the dot character.
     * Example: 2,345`.`67
     */
    Decimal: 0,
    /**
     * Grouping separator, typically for thousands.
     * For `en-US`, the comma character.
     * Example: 2`,`345.67
     */
    Group: 1,
    /**
     * List-item separator.
     * Example: "one, two, and three"
     */
    List: 2,
    /**
     * Sign for percentage (out of 100).
     * Example: 23.4%
     */
    PercentSign: 3,
    /**
     * Sign for positive numbers.
     * Example: +23
     */
    PlusSign: 4,
    /**
     * Sign for negative numbers.
     * Example: -23
     */
    MinusSign: 5,
    /**
     * Computer notation for exponential value (n times a power of 10).
     * Example: 1.2E3
     */
    Exponential: 6,
    /**
     * Human-readable format of exponential.
     * Example: 1.2x103
     */
    SuperscriptingExponent: 7,
    /**
     * Sign for permille (out of 1000).
     * Example: 23.4‰
     */
    PerMille: 8,
    /**
     * Infinity, can be used with plus and minus.
     * Example: ∞, +∞, -∞
     */
    Infinity: 9,
    /**
     * Not a number.
     * Example: NaN
     */
    NaN: 10,
    /**
     * Symbol used between time units.
     * Example: 10:52
     */
    TimeSeparator: 11,
    /**
     * Decimal separator for currency values (fallback to `Decimal`).
     * Example: $2,345.67
     */
    CurrencyDecimal: 12,
    /**
     * Group separator for currency values (fallback to `Group`).
     * Example: $2,345.67
     */
    CurrencyGroup: 13,
};
/**
 * The value for each day of the week, based on the `en-US` locale
 *
 * @publicApi
 *
 * @deprecated Week locale getters are deprecated
 */
var WeekDay;
(function (WeekDay) {
    WeekDay[WeekDay["Sunday"] = 0] = "Sunday";
    WeekDay[WeekDay["Monday"] = 1] = "Monday";
    WeekDay[WeekDay["Tuesday"] = 2] = "Tuesday";
    WeekDay[WeekDay["Wednesday"] = 3] = "Wednesday";
    WeekDay[WeekDay["Thursday"] = 4] = "Thursday";
    WeekDay[WeekDay["Friday"] = 5] = "Friday";
    WeekDay[WeekDay["Saturday"] = 6] = "Saturday";
})(WeekDay || (WeekDay = {}));
/**
 * Retrieves the locale ID from the currently loaded locale.
 * The loaded locale could be, for example, a global one rather than a regional one.
 * @param locale A locale code, such as `fr-FR`.
 * @returns The locale code. For example, `fr`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * This function serves no purpose when relying on the `Intl` API.
 */
function getLocaleId(locale) {
    return _findLocaleData(locale)[_LocaleDataIndex.LocaleId];
}
/**
 * Retrieves day period strings for the given locale.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param formStyle The required grammatical form.
 * @param width The required character width.
 * @returns An array of localized period strings. For example, `[AM, PM]` for `en-US`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
function getLocaleDayPeriods(locale, formStyle, width) {
    const data = _findLocaleData(locale);
    const amPmData = [
        data[_LocaleDataIndex.DayPeriodsFormat],
        data[_LocaleDataIndex.DayPeriodsStandalone],
    ];
    const amPm = getLastDefinedValue(amPmData, formStyle);
    return getLastDefinedValue(amPm, width);
}
/**
 * Retrieves days of the week for the given locale, using the Gregorian calendar.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param formStyle The required grammatical form.
 * @param width The required character width.
 * @returns An array of localized name strings.
 * For example,`[Sunday, Monday, ... Saturday]` for `en-US`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
function getLocaleDayNames(locale, formStyle, width) {
    const data = _findLocaleData(locale);
    const daysData = [
        data[_LocaleDataIndex.DaysFormat],
        data[_LocaleDataIndex.DaysStandalone],
    ];
    const days = getLastDefinedValue(daysData, formStyle);
    return getLastDefinedValue(days, width);
}
/**
 * Retrieves months of the year for the given locale, using the Gregorian calendar.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param formStyle The required grammatical form.
 * @param width The required character width.
 * @returns An array of localized name strings.
 * For example,  `[January, February, ...]` for `en-US`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
function getLocaleMonthNames(locale, formStyle, width) {
    const data = _findLocaleData(locale);
    const monthsData = [
        data[_LocaleDataIndex.MonthsFormat],
        data[_LocaleDataIndex.MonthsStandalone],
    ];
    const months = getLastDefinedValue(monthsData, formStyle);
    return getLastDefinedValue(months, width);
}
/**
 * Retrieves Gregorian-calendar eras for the given locale.
 * @param locale A locale code for the locale format rules to use.
 * @param width The required character width.

 * @returns An array of localized era strings.
 * For example, `[AD, BC]` for `en-US`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
function getLocaleEraNames(locale, width) {
    const data = _findLocaleData(locale);
    const erasData = data[_LocaleDataIndex.Eras];
    return getLastDefinedValue(erasData, width);
}
/**
 * Retrieves the first day of the week for the given locale.
 *
 * @param locale A locale code for the locale format rules to use.
 * @returns A day index number, using the 0-based week-day index for `en-US`
 * (Sunday = 0, Monday = 1, ...).
 * For example, for `fr-FR`, returns 1 to indicate that the first day is Monday.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Intl's [`getWeekInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getWeekInfo) has partial support (Chromium M99 & Safari 17).
 * You may want to rely on the following alternatives:
 * - Libraries like [`Luxon`](https://moment.github.io/luxon/#/) rely on `Intl` but fallback on the ISO 8601 definition (monday) if `getWeekInfo` is not supported.
 * - Other librairies like [`date-fns`](https://date-fns.org/), [`day.js`](https://day.js.org/en/) or [`weekstart`](https://www.npmjs.com/package/weekstart) library provide their own locale based data for the first day of the week.
 */
function getLocaleFirstDayOfWeek(locale) {
    const data = _findLocaleData(locale);
    return data[_LocaleDataIndex.FirstDayOfWeek];
}
/**
 * Range of week days that are considered the week-end for the given locale.
 *
 * @param locale A locale code for the locale format rules to use.
 * @returns The range of day values, `[startDay, endDay]`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Intl's [`getWeekInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getWeekInfo) has partial support (Chromium M99 & Safari 17).
 * Libraries like [`Luxon`](https://moment.github.io/luxon/#/) rely on `Intl` but fallback on the ISO 8601 definition (Saturday+Sunday) if `getWeekInfo` is not supported .
 */
function getLocaleWeekEndRange(locale) {
    const data = _findLocaleData(locale);
    return data[_LocaleDataIndex.WeekendRange];
}
/**
 * Retrieves a localized date-value formatting string.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param width The format type.
 * @returns The localized formatting string.
 * @see {@link FormatWidth}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
function getLocaleDateFormat(locale, width) {
    const data = _findLocaleData(locale);
    return getLastDefinedValue(data[_LocaleDataIndex.DateFormat], width);
}
/**
 * Retrieves a localized time-value formatting string.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param width The format type.
 * @returns The localized formatting string.
 * @see {@link FormatWidth}
 * @see [Internationalization (i18n) Guide](guide/i18n)

 * @publicApi
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
function getLocaleTimeFormat(locale, width) {
    const data = _findLocaleData(locale);
    return getLastDefinedValue(data[_LocaleDataIndex.TimeFormat], width);
}
/**
 * Retrieves a localized date-time formatting string.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param width The format type.
 * @returns The localized formatting string.
 * @see {@link FormatWidth}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
function getLocaleDateTimeFormat(locale, width) {
    const data = _findLocaleData(locale);
    const dateTimeFormatData = data[_LocaleDataIndex.DateTimeFormat];
    return getLastDefinedValue(dateTimeFormatData, width);
}
/**
 * Retrieves a localized number symbol that can be used to replace placeholders in number formats.
 * @param locale The locale code.
 * @param symbol The symbol to localize. Must be one of `NumberSymbol`.
 * @returns The character for the localized symbol.
 * @see {@link NumberSymbol}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.NumberFormat` to format numbers instead.
 */
function getLocaleNumberSymbol(locale, symbol) {
    const data = _findLocaleData(locale);
    const res = data[_LocaleDataIndex.NumberSymbols][symbol];
    if (typeof res === 'undefined') {
        if (symbol === NumberSymbol.CurrencyDecimal) {
            return data[_LocaleDataIndex.NumberSymbols][NumberSymbol.Decimal];
        }
        else if (symbol === NumberSymbol.CurrencyGroup) {
            return data[_LocaleDataIndex.NumberSymbols][NumberSymbol.Group];
        }
    }
    return res;
}
/**
 * Retrieves a number format for a given locale.
 *
 * Numbers are formatted using patterns, like `#,###.00`. For example, the pattern `#,###.00`
 * when used to format the number 12345.678 could result in "12'345,678". That would happen if the
 * grouping separator for your language is an apostrophe, and the decimal separator is a comma.
 *
 * <b>Important:</b> The characters `.` `,` `0` `#` (and others below) are special placeholders
 * that stand for the decimal separator, and so on, and are NOT real characters.
 * You must NOT "translate" the placeholders. For example, don't change `.` to `,` even though in
 * your language the decimal point is written with a comma. The symbols should be replaced by the
 * local equivalents, using the appropriate `NumberSymbol` for your language.
 *
 * Here are the special characters used in number patterns:
 *
 * | Symbol | Meaning |
 * |--------|---------|
 * | . | Replaced automatically by the character used for the decimal point. |
 * | , | Replaced by the "grouping" (thousands) separator. |
 * | 0 | Replaced by a digit (or zero if there aren't enough digits). |
 * | # | Replaced by a digit (or nothing if there aren't enough). |
 * | ¤ | Replaced by a currency symbol, such as $ or USD. |
 * | % | Marks a percent format. The % symbol may change position, but must be retained. |
 * | E | Marks a scientific format. The E symbol may change position, but must be retained. |
 * | ' | Special characters used as literal characters are quoted with ASCII single quotes. |
 *
 * @param locale A locale code for the locale format rules to use.
 * @param type The type of numeric value to be formatted (such as `Decimal` or `Currency`.)
 * @returns The localized format string.
 * @see {@link NumberFormatStyle}
 * @see [CLDR website](http://cldr.unicode.org/translation/number-patterns)
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Let `Intl.NumberFormat` determine the number format instead
 */
function getLocaleNumberFormat(locale, type) {
    const data = _findLocaleData(locale);
    return data[_LocaleDataIndex.NumberFormats][type];
}
/**
 * Retrieves the symbol used to represent the currency for the main country
 * corresponding to a given locale. For example, '$' for `en-US`.
 *
 * @param locale A locale code for the locale format rules to use.
 * @returns The localized symbol character,
 * or `null` if the main country cannot be determined.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Use the `Intl` API to format a currency with from currency code
 */
function getLocaleCurrencySymbol(locale) {
    const data = _findLocaleData(locale);
    return data[_LocaleDataIndex.CurrencySymbol] || null;
}
/**
 * Retrieves the name of the currency for the main country corresponding
 * to a given locale. For example, 'US Dollar' for `en-US`.
 * @param locale A locale code for the locale format rules to use.
 * @returns The currency name,
 * or `null` if the main country cannot be determined.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Use the `Intl` API to format a currency with from currency code
 */
function getLocaleCurrencyName(locale) {
    const data = _findLocaleData(locale);
    return data[_LocaleDataIndex.CurrencyName] || null;
}
/**
 * Retrieves the default currency code for the given locale.
 *
 * The default is defined as the first currency which is still in use.
 *
 * @param locale The code of the locale whose currency code we want.
 * @returns The code of the default currency for the given locale.
 *
 * @publicApi
 *
 * @deprecated We recommend you create a map of locale to ISO 4217 currency codes.
 * Time relative currency data is provided by the CLDR project. See https://www.unicode.org/cldr/charts/44/supplemental/detailed_territory_currency_information.html
 */
function getLocaleCurrencyCode(locale) {
    return _getLocaleCurrencyCode(locale);
}
/**
 * Retrieves the currency values for a given locale.
 * @param locale A locale code for the locale format rules to use.
 * @returns The currency values.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 */
function getLocaleCurrencies(locale) {
    const data = _findLocaleData(locale);
    return data[_LocaleDataIndex.Currencies];
}
/**
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.PluralRules` instead
 */
const getLocalePluralCase = _getLocalePluralCase;
function checkFullData(data) {
    if (!data[_LocaleDataIndex.ExtraData]) {
        throw new Error(`Missing extra locale data for the locale "${data[_LocaleDataIndex.LocaleId]}". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.`);
    }
}
/**
 * Retrieves locale-specific rules used to determine which day period to use
 * when more than one period is defined for a locale.
 *
 * There is a rule for each defined day period. The
 * first rule is applied to the first day period and so on.
 * Fall back to AM/PM when no rules are available.
 *
 * A rule can specify a period as time range, or as a single time value.
 *
 * This functionality is only available when you have loaded the full locale data.
 * See the ["I18n guide"](guide/i18n/format-data-locale).
 *
 * @param locale A locale code for the locale format rules to use.
 * @returns The rules for the locale, a single time value or array of *from-time, to-time*,
 * or null if no periods are available.
 *
 * @see {@link getLocaleExtraDayPeriods}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Let `Intl.DateTimeFormat` determine the day period instead.
 */
function getLocaleExtraDayPeriodRules(locale) {
    const data = _findLocaleData(locale);
    checkFullData(data);
    const rules = data[_LocaleDataIndex.ExtraData][2 /* ɵExtraLocaleDataIndex.ExtraDayPeriodsRules */] || [];
    return rules.map((rule) => {
        if (typeof rule === 'string') {
            return extractTime(rule);
        }
        return [extractTime(rule[0]), extractTime(rule[1])];
    });
}
/**
 * Retrieves locale-specific day periods, which indicate roughly how a day is broken up
 * in different languages.
 * For example, for `en-US`, periods are morning, noon, afternoon, evening, and midnight.
 *
 * This functionality is only available when you have loaded the full locale data.
 * See the ["I18n guide"](guide/i18n/format-data-locale).
 *
 * @param locale A locale code for the locale format rules to use.
 * @param formStyle The required grammatical form.
 * @param width The required character width.
 * @returns The translated day-period strings.
 * @see {@link getLocaleExtraDayPeriodRules}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * To extract a day period use `Intl.DateTimeFormat` with the `dayPeriod` option instead.
 */
function getLocaleExtraDayPeriods(locale, formStyle, width) {
    const data = _findLocaleData(locale);
    checkFullData(data);
    const dayPeriodsData = [
        data[_LocaleDataIndex.ExtraData][0 /* ɵExtraLocaleDataIndex.ExtraDayPeriodFormats */],
        data[_LocaleDataIndex.ExtraData][1 /* ɵExtraLocaleDataIndex.ExtraDayPeriodStandalone */],
    ];
    const dayPeriods = getLastDefinedValue(dayPeriodsData, formStyle) || [];
    return getLastDefinedValue(dayPeriods, width) || [];
}
/**
 * Retrieves the writing direction of a specified locale
 * @param locale A locale code for the locale format rules to use.
 * @publicApi
 * @returns 'rtl' or 'ltr'
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * For dates and numbers, let `Intl.DateTimeFormat()` and `Intl.NumberFormat()` determine the writing direction.
 * The `Intl` alternative [`getTextInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getTextInfo).
 * has only partial support (Chromium M99 & Safari 17).
 * 3rd party alternatives like [`rtl-detect`](https://www.npmjs.com/package/rtl-detect) can work around this issue.
 */
function getLocaleDirection(locale) {
    const data = _findLocaleData(locale);
    return data[_LocaleDataIndex.Directionality];
}
/**
 * Retrieves the first value that is defined in an array, going backwards from an index position.
 *
 * To avoid repeating the same data (as when the "format" and "standalone" forms are the same)
 * add the first value to the locale data arrays, and add other values only if they are different.
 *
 * @param data The data array to retrieve from.
 * @param index A 0-based index into the array to start from.
 * @returns The value immediately before the given index position.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 */
function getLastDefinedValue(data, index) {
    for (let i = index; i > -1; i--) {
        if (typeof data[i] !== 'undefined') {
            return data[i];
        }
    }
    throw new Error('Locale data API: locale data undefined');
}
/**
 * Extracts the hours and minutes from a string like "15:45"
 */
function extractTime(time) {
    const [h, m] = time.split(':');
    return { hours: +h, minutes: +m };
}
/**
 * Retrieves the currency symbol for a given currency code.
 *
 * For example, for the default `en-US` locale, the code `USD` can
 * be represented by the narrow symbol `$` or the wide symbol `US$`.
 *
 * @param code The currency code.
 * @param format The format, `wide` or `narrow`.
 * @param locale A locale code for the locale format rules to use.
 *
 * @returns The symbol, or the currency code if no symbol is available.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * You can use `Intl.NumberFormat().formatToParts()` to extract the currency symbol.
 * For example: `Intl.NumberFormat('en', {style:'currency', currency: 'USD'}).formatToParts().find(part => part.type === 'currency').value`
 * returns `$` for USD currency code in the `en` locale.
 * Note: `US$` is a currency symbol for the `en-ca` locale but not the `en-us` locale.
 */
function getCurrencySymbol(code, format, locale = 'en') {
    const currency = getLocaleCurrencies(locale)[code] || CURRENCIES_EN[code] || [];
    const symbolNarrow = currency[1 /* ɵCurrencyIndex.SymbolNarrow */];
    if (format === 'narrow' && typeof symbolNarrow === 'string') {
        return symbolNarrow;
    }
    return currency[0 /* ɵCurrencyIndex.Symbol */] || code;
}
// Most currencies have cents, that's why the default is 2
const DEFAULT_NB_OF_CURRENCY_DIGITS = 2;
/**
 * Reports the number of decimal digits for a given currency.
 * The value depends upon the presence of cents in that particular currency.
 *
 * @param code The currency code.
 * @returns The number of decimal digits, typically 0 or 2.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * This function should not be used anymore. Let `Intl.NumberFormat` determine the number of digits to display for the currency
 */
function getNumberOfCurrencyDigits(code) {
    let digits;
    const currency = CURRENCIES_EN[code];
    if (currency) {
        digits = currency[2 /* ɵCurrencyIndex.NbOfDigits */];
    }
    return typeof digits === 'number' ? digits : DEFAULT_NB_OF_CURRENCY_DIGITS;
}

const ISO8601_DATE_REGEX = /^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
//    1        2       3         4          5          6          7          8  9     10      11
const NAMED_FORMATS = {};
const DATE_FORMATS_SPLIT = /((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/;
/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a date according to locale rules.
 *
 * @param value The date to format, as a Date, or a number (milliseconds since UTC epoch)
 * or an [ISO date-time string](https://www.w3.org/TR/NOTE-datetime).
 * @param format The date-time components to include. See `DatePipe` for details.
 * @param locale A locale code for the locale format rules to use.
 * @param timezone The time zone. A time zone offset from GMT (such as `'+0430'`).
 * If not specified, uses host system settings.
 *
 * @returns The formatted date string.
 *
 * @see {@link DatePipe}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 */
function formatDate(value, format, locale, timezone) {
    let date = toDate(value);
    const namedFormat = getNamedFormat(locale, format);
    format = namedFormat || format;
    let parts = [];
    let match;
    while (format) {
        match = DATE_FORMATS_SPLIT.exec(format);
        if (match) {
            parts = parts.concat(match.slice(1));
            const part = parts.pop();
            if (!part) {
                break;
            }
            format = part;
        }
        else {
            parts.push(format);
            break;
        }
    }
    let dateTimezoneOffset = date.getTimezoneOffset();
    if (timezone) {
        dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
        date = convertTimezoneToLocal(date, timezone);
    }
    let text = '';
    parts.forEach((value) => {
        const dateFormatter = getDateFormatter(value);
        text += dateFormatter
            ? dateFormatter(date, locale, dateTimezoneOffset)
            : value === "''"
                ? "'"
                : value.replace(/(^'|'$)/g, '').replace(/''/g, "'");
    });
    return text;
}
/**
 * Create a new Date object with the given date value, and the time set to midnight.
 *
 * We cannot use `new Date(year, month, date)` because it maps years between 0 and 99 to 1900-1999.
 * See: https://github.com/angular/angular/issues/40377
 *
 * Note that this function returns a Date object whose time is midnight in the current locale's
 * timezone. In the future we might want to change this to be midnight in UTC, but this would be a
 * considerable breaking change.
 */
function createDate(year, month, date) {
    // The `newDate` is set to midnight (UTC) on January 1st 1970.
    // - In PST this will be December 31st 1969 at 4pm.
    // - In GMT this will be January 1st 1970 at 1am.
    // Note that they even have different years, dates and months!
    const newDate = new Date(0);
    // `setFullYear()` allows years like 0001 to be set correctly. This function does not
    // change the internal time of the date.
    // Consider calling `setFullYear(2019, 8, 20)` (September 20, 2019).
    // - In PST this will now be September 20, 2019 at 4pm
    // - In GMT this will now be September 20, 2019 at 1am
    newDate.setFullYear(year, month, date);
    // We want the final date to be at local midnight, so we reset the time.
    // - In PST this will now be September 20, 2019 at 12am
    // - In GMT this will now be September 20, 2019 at 12am
    newDate.setHours(0, 0, 0);
    return newDate;
}
function getNamedFormat(locale, format) {
    const localeId = getLocaleId(locale);
    NAMED_FORMATS[localeId] ??= {};
    if (NAMED_FORMATS[localeId][format]) {
        return NAMED_FORMATS[localeId][format];
    }
    let formatValue = '';
    switch (format) {
        case 'shortDate':
            formatValue = getLocaleDateFormat(locale, FormatWidth.Short);
            break;
        case 'mediumDate':
            formatValue = getLocaleDateFormat(locale, FormatWidth.Medium);
            break;
        case 'longDate':
            formatValue = getLocaleDateFormat(locale, FormatWidth.Long);
            break;
        case 'fullDate':
            formatValue = getLocaleDateFormat(locale, FormatWidth.Full);
            break;
        case 'shortTime':
            formatValue = getLocaleTimeFormat(locale, FormatWidth.Short);
            break;
        case 'mediumTime':
            formatValue = getLocaleTimeFormat(locale, FormatWidth.Medium);
            break;
        case 'longTime':
            formatValue = getLocaleTimeFormat(locale, FormatWidth.Long);
            break;
        case 'fullTime':
            formatValue = getLocaleTimeFormat(locale, FormatWidth.Full);
            break;
        case 'short':
            const shortTime = getNamedFormat(locale, 'shortTime');
            const shortDate = getNamedFormat(locale, 'shortDate');
            formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Short), [
                shortTime,
                shortDate,
            ]);
            break;
        case 'medium':
            const mediumTime = getNamedFormat(locale, 'mediumTime');
            const mediumDate = getNamedFormat(locale, 'mediumDate');
            formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Medium), [
                mediumTime,
                mediumDate,
            ]);
            break;
        case 'long':
            const longTime = getNamedFormat(locale, 'longTime');
            const longDate = getNamedFormat(locale, 'longDate');
            formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Long), [
                longTime,
                longDate,
            ]);
            break;
        case 'full':
            const fullTime = getNamedFormat(locale, 'fullTime');
            const fullDate = getNamedFormat(locale, 'fullDate');
            formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Full), [
                fullTime,
                fullDate,
            ]);
            break;
    }
    if (formatValue) {
        NAMED_FORMATS[localeId][format] = formatValue;
    }
    return formatValue;
}
function formatDateTime(str, opt_values) {
    if (opt_values) {
        str = str.replace(/\{([^}]+)}/g, function (match, key) {
            return opt_values != null && key in opt_values ? opt_values[key] : match;
        });
    }
    return str;
}
function padNumber(num, digits, minusSign = '-', trim, negWrap) {
    let neg = '';
    if (num < 0 || (negWrap && num <= 0)) {
        if (negWrap) {
            num = -num + 1;
        }
        else {
            num = -num;
            neg = minusSign;
        }
    }
    let strNum = String(num);
    while (strNum.length < digits) {
        strNum = '0' + strNum;
    }
    if (trim) {
        strNum = strNum.slice(strNum.length - digits);
    }
    return neg + strNum;
}
function formatFractionalSeconds(milliseconds, digits) {
    const strMs = padNumber(milliseconds, 3);
    return strMs.substring(0, digits);
}
/**
 * Returns a date formatter that transforms a date into its locale digit representation
 */
function dateGetter(name, size, offset = 0, trim = false, negWrap = false) {
    return function (date, locale) {
        let part = getDatePart(name, date);
        if (offset > 0 || part > -offset) {
            part += offset;
        }
        if (name === 3 /* DateType.Hours */) {
            if (part === 0 && offset === -12) {
                part = 12;
            }
        }
        else if (name === 6 /* DateType.FractionalSeconds */) {
            return formatFractionalSeconds(part, size);
        }
        const localeMinus = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);
        return padNumber(part, size, localeMinus, trim, negWrap);
    };
}
function getDatePart(part, date) {
    switch (part) {
        case 0 /* DateType.FullYear */:
            return date.getFullYear();
        case 1 /* DateType.Month */:
            return date.getMonth();
        case 2 /* DateType.Date */:
            return date.getDate();
        case 3 /* DateType.Hours */:
            return date.getHours();
        case 4 /* DateType.Minutes */:
            return date.getMinutes();
        case 5 /* DateType.Seconds */:
            return date.getSeconds();
        case 6 /* DateType.FractionalSeconds */:
            return date.getMilliseconds();
        case 7 /* DateType.Day */:
            return date.getDay();
        default:
            throw new Error(`Unknown DateType value "${part}".`);
    }
}
/**
 * Returns a date formatter that transforms a date into its locale string representation
 */
function dateStrGetter(name, width, form = FormStyle.Format, extended = false) {
    return function (date, locale) {
        return getDateTranslation(date, locale, name, width, form, extended);
    };
}
/**
 * Returns the locale translation of a date for a given form, type and width
 */
function getDateTranslation(date, locale, name, width, form, extended) {
    switch (name) {
        case 2 /* TranslationType.Months */:
            return getLocaleMonthNames(locale, form, width)[date.getMonth()];
        case 1 /* TranslationType.Days */:
            return getLocaleDayNames(locale, form, width)[date.getDay()];
        case 0 /* TranslationType.DayPeriods */:
            const currentHours = date.getHours();
            const currentMinutes = date.getMinutes();
            if (extended) {
                const rules = getLocaleExtraDayPeriodRules(locale);
                const dayPeriods = getLocaleExtraDayPeriods(locale, form, width);
                const index = rules.findIndex((rule) => {
                    if (Array.isArray(rule)) {
                        // morning, afternoon, evening, night
                        const [from, to] = rule;
                        const afterFrom = currentHours >= from.hours && currentMinutes >= from.minutes;
                        const beforeTo = currentHours < to.hours || (currentHours === to.hours && currentMinutes < to.minutes);
                        // We must account for normal rules that span a period during the day (e.g. 6am-9am)
                        // where `from` is less (earlier) than `to`. But also rules that span midnight (e.g.
                        // 10pm - 5am) where `from` is greater (later!) than `to`.
                        //
                        // In the first case the current time must be BOTH after `from` AND before `to`
                        // (e.g. 8am is after 6am AND before 10am).
                        //
                        // In the second case the current time must be EITHER after `from` OR before `to`
                        // (e.g. 4am is before 5am but not after 10pm; and 11pm is not before 5am but it is
                        // after 10pm).
                        if (from.hours < to.hours) {
                            if (afterFrom && beforeTo) {
                                return true;
                            }
                        }
                        else if (afterFrom || beforeTo) {
                            return true;
                        }
                    }
                    else {
                        // noon or midnight
                        if (rule.hours === currentHours && rule.minutes === currentMinutes) {
                            return true;
                        }
                    }
                    return false;
                });
                if (index !== -1) {
                    return dayPeriods[index];
                }
            }
            // if no rules for the day periods, we use am/pm by default
            return getLocaleDayPeriods(locale, form, width)[currentHours < 12 ? 0 : 1];
        case 3 /* TranslationType.Eras */:
            return getLocaleEraNames(locale, width)[date.getFullYear() <= 0 ? 0 : 1];
        default:
            // This default case is not needed by TypeScript compiler, as the switch is exhaustive.
            // However Closure Compiler does not understand that and reports an error in typed mode.
            // The `throw new Error` below works around the problem, and the unexpected: never variable
            // makes sure tsc still checks this code is unreachable.
            const unexpected = name;
            throw new Error(`unexpected translation type ${unexpected}`);
    }
}
/**
 * Returns a date formatter that transforms a date and an offset into a timezone with ISO8601 or
 * GMT format depending on the width (eg: short = +0430, short:GMT = GMT+4, long = GMT+04:30,
 * extended = +04:30)
 */
function timeZoneGetter(width) {
    return function (date, locale, offset) {
        const zone = -1 * offset;
        const minusSign = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);
        const hours = zone > 0 ? Math.floor(zone / 60) : Math.ceil(zone / 60);
        switch (width) {
            case 0 /* ZoneWidth.Short */:
                return ((zone >= 0 ? '+' : '') +
                    padNumber(hours, 2, minusSign) +
                    padNumber(Math.abs(zone % 60), 2, minusSign));
            case 1 /* ZoneWidth.ShortGMT */:
                return 'GMT' + (zone >= 0 ? '+' : '') + padNumber(hours, 1, minusSign);
            case 2 /* ZoneWidth.Long */:
                return ('GMT' +
                    (zone >= 0 ? '+' : '') +
                    padNumber(hours, 2, minusSign) +
                    ':' +
                    padNumber(Math.abs(zone % 60), 2, minusSign));
            case 3 /* ZoneWidth.Extended */:
                if (offset === 0) {
                    return 'Z';
                }
                else {
                    return ((zone >= 0 ? '+' : '') +
                        padNumber(hours, 2, minusSign) +
                        ':' +
                        padNumber(Math.abs(zone % 60), 2, minusSign));
                }
            default:
                throw new Error(`Unknown zone width "${width}"`);
        }
    };
}
const JANUARY = 0;
const THURSDAY = 4;
function getFirstThursdayOfYear(year) {
    const firstDayOfYear = createDate(year, JANUARY, 1).getDay();
    return createDate(year, 0, 1 + (firstDayOfYear <= THURSDAY ? THURSDAY : THURSDAY + 7) - firstDayOfYear);
}
/**
 *  ISO Week starts on day 1 (Monday) and ends with day 0 (Sunday)
 */
function getThursdayThisIsoWeek(datetime) {
    // getDay returns 0-6 range with sunday as 0.
    const currentDay = datetime.getDay();
    // On a Sunday, read the previous Thursday since ISO weeks start on Monday.
    const deltaToThursday = currentDay === 0 ? -3 : THURSDAY - currentDay;
    return createDate(datetime.getFullYear(), datetime.getMonth(), datetime.getDate() + deltaToThursday);
}
function weekGetter(size, monthBased = false) {
    return function (date, locale) {
        let result;
        if (monthBased) {
            const nbDaysBefore1stDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1).getDay() - 1;
            const today = date.getDate();
            result = 1 + Math.floor((today + nbDaysBefore1stDayOfMonth) / 7);
        }
        else {
            const thisThurs = getThursdayThisIsoWeek(date);
            // Some days of a year are part of next year according to ISO 8601.
            // Compute the firstThurs from the year of this week's Thursday
            const firstThurs = getFirstThursdayOfYear(thisThurs.getFullYear());
            const diff = thisThurs.getTime() - firstThurs.getTime();
            result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week
        }
        return padNumber(result, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
    };
}
/**
 * Returns a date formatter that provides the week-numbering year for the input date.
 */
function weekNumberingYearGetter(size, trim = false) {
    return function (date, locale) {
        const thisThurs = getThursdayThisIsoWeek(date);
        const weekNumberingYear = thisThurs.getFullYear();
        return padNumber(weekNumberingYear, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign), trim);
    };
}
const DATE_FORMATS = {};
// Based on CLDR formats:
// See complete list: http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
// See also explanations: http://cldr.unicode.org/translation/date-time
// TODO(ocombe): support all missing cldr formats: U, Q, D, F, e, j, J, C, A, v, V, X, x
function getDateFormatter(format) {
    if (DATE_FORMATS[format]) {
        return DATE_FORMATS[format];
    }
    let formatter;
    switch (format) {
        // Era name (AD/BC)
        case 'G':
        case 'GG':
        case 'GGG':
            formatter = dateStrGetter(3 /* TranslationType.Eras */, TranslationWidth.Abbreviated);
            break;
        case 'GGGG':
            formatter = dateStrGetter(3 /* TranslationType.Eras */, TranslationWidth.Wide);
            break;
        case 'GGGGG':
            formatter = dateStrGetter(3 /* TranslationType.Eras */, TranslationWidth.Narrow);
            break;
        // 1 digit representation of the year, e.g. (AD 1 => 1, AD 199 => 199)
        case 'y':
            formatter = dateGetter(0 /* DateType.FullYear */, 1, 0, false, true);
            break;
        // 2 digit representation of the year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)
        case 'yy':
            formatter = dateGetter(0 /* DateType.FullYear */, 2, 0, true, true);
            break;
        // 3 digit representation of the year, padded (000-999). (e.g. AD 2001 => 01, AD 2010 => 10)
        case 'yyy':
            formatter = dateGetter(0 /* DateType.FullYear */, 3, 0, false, true);
            break;
        // 4 digit representation of the year (e.g. AD 1 => 0001, AD 2010 => 2010)
        case 'yyyy':
            formatter = dateGetter(0 /* DateType.FullYear */, 4, 0, false, true);
            break;
        // 1 digit representation of the week-numbering year, e.g. (AD 1 => 1, AD 199 => 199)
        case 'Y':
            formatter = weekNumberingYearGetter(1);
            break;
        // 2 digit representation of the week-numbering year, padded (00-99). (e.g. AD 2001 => 01, AD
        // 2010 => 10)
        case 'YY':
            formatter = weekNumberingYearGetter(2, true);
            break;
        // 3 digit representation of the week-numbering year, padded (000-999). (e.g. AD 1 => 001, AD
        // 2010 => 2010)
        case 'YYY':
            formatter = weekNumberingYearGetter(3);
            break;
        // 4 digit representation of the week-numbering year (e.g. AD 1 => 0001, AD 2010 => 2010)
        case 'YYYY':
            formatter = weekNumberingYearGetter(4);
            break;
        // Month of the year (1-12), numeric
        case 'M':
        case 'L':
            formatter = dateGetter(1 /* DateType.Month */, 1, 1);
            break;
        case 'MM':
        case 'LL':
            formatter = dateGetter(1 /* DateType.Month */, 2, 1);
            break;
        // Month of the year (January, ...), string, format
        case 'MMM':
            formatter = dateStrGetter(2 /* TranslationType.Months */, TranslationWidth.Abbreviated);
            break;
        case 'MMMM':
            formatter = dateStrGetter(2 /* TranslationType.Months */, TranslationWidth.Wide);
            break;
        case 'MMMMM':
            formatter = dateStrGetter(2 /* TranslationType.Months */, TranslationWidth.Narrow);
            break;
        // Month of the year (January, ...), string, standalone
        case 'LLL':
            formatter = dateStrGetter(2 /* TranslationType.Months */, TranslationWidth.Abbreviated, FormStyle.Standalone);
            break;
        case 'LLLL':
            formatter = dateStrGetter(2 /* TranslationType.Months */, TranslationWidth.Wide, FormStyle.Standalone);
            break;
        case 'LLLLL':
            formatter = dateStrGetter(2 /* TranslationType.Months */, TranslationWidth.Narrow, FormStyle.Standalone);
            break;
        // Week of the year (1, ... 52)
        case 'w':
            formatter = weekGetter(1);
            break;
        case 'ww':
            formatter = weekGetter(2);
            break;
        // Week of the month (1, ...)
        case 'W':
            formatter = weekGetter(1, true);
            break;
        // Day of the month (1-31)
        case 'd':
            formatter = dateGetter(2 /* DateType.Date */, 1);
            break;
        case 'dd':
            formatter = dateGetter(2 /* DateType.Date */, 2);
            break;
        // Day of the Week StandAlone (1, 1, Mon, Monday, M, Mo)
        case 'c':
        case 'cc':
            formatter = dateGetter(7 /* DateType.Day */, 1);
            break;
        case 'ccc':
            formatter = dateStrGetter(1 /* TranslationType.Days */, TranslationWidth.Abbreviated, FormStyle.Standalone);
            break;
        case 'cccc':
            formatter = dateStrGetter(1 /* TranslationType.Days */, TranslationWidth.Wide, FormStyle.Standalone);
            break;
        case 'ccccc':
            formatter = dateStrGetter(1 /* TranslationType.Days */, TranslationWidth.Narrow, FormStyle.Standalone);
            break;
        case 'cccccc':
            formatter = dateStrGetter(1 /* TranslationType.Days */, TranslationWidth.Short, FormStyle.Standalone);
            break;
        // Day of the Week
        case 'E':
        case 'EE':
        case 'EEE':
            formatter = dateStrGetter(1 /* TranslationType.Days */, TranslationWidth.Abbreviated);
            break;
        case 'EEEE':
            formatter = dateStrGetter(1 /* TranslationType.Days */, TranslationWidth.Wide);
            break;
        case 'EEEEE':
            formatter = dateStrGetter(1 /* TranslationType.Days */, TranslationWidth.Narrow);
            break;
        case 'EEEEEE':
            formatter = dateStrGetter(1 /* TranslationType.Days */, TranslationWidth.Short);
            break;
        // Generic period of the day (am-pm)
        case 'a':
        case 'aa':
        case 'aaa':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Abbreviated);
            break;
        case 'aaaa':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Wide);
            break;
        case 'aaaaa':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Narrow);
            break;
        // Extended period of the day (midnight, at night, ...), standalone
        case 'b':
        case 'bb':
        case 'bbb':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Abbreviated, FormStyle.Standalone, true);
            break;
        case 'bbbb':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Wide, FormStyle.Standalone, true);
            break;
        case 'bbbbb':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Narrow, FormStyle.Standalone, true);
            break;
        // Extended period of the day (midnight, night, ...), standalone
        case 'B':
        case 'BB':
        case 'BBB':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Abbreviated, FormStyle.Format, true);
            break;
        case 'BBBB':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Wide, FormStyle.Format, true);
            break;
        case 'BBBBB':
            formatter = dateStrGetter(0 /* TranslationType.DayPeriods */, TranslationWidth.Narrow, FormStyle.Format, true);
            break;
        // Hour in AM/PM, (1-12)
        case 'h':
            formatter = dateGetter(3 /* DateType.Hours */, 1, -12);
            break;
        case 'hh':
            formatter = dateGetter(3 /* DateType.Hours */, 2, -12);
            break;
        // Hour of the day (0-23)
        case 'H':
            formatter = dateGetter(3 /* DateType.Hours */, 1);
            break;
        // Hour in day, padded (00-23)
        case 'HH':
            formatter = dateGetter(3 /* DateType.Hours */, 2);
            break;
        // Minute of the hour (0-59)
        case 'm':
            formatter = dateGetter(4 /* DateType.Minutes */, 1);
            break;
        case 'mm':
            formatter = dateGetter(4 /* DateType.Minutes */, 2);
            break;
        // Second of the minute (0-59)
        case 's':
            formatter = dateGetter(5 /* DateType.Seconds */, 1);
            break;
        case 'ss':
            formatter = dateGetter(5 /* DateType.Seconds */, 2);
            break;
        // Fractional second
        case 'S':
            formatter = dateGetter(6 /* DateType.FractionalSeconds */, 1);
            break;
        case 'SS':
            formatter = dateGetter(6 /* DateType.FractionalSeconds */, 2);
            break;
        case 'SSS':
            formatter = dateGetter(6 /* DateType.FractionalSeconds */, 3);
            break;
        // Timezone ISO8601 short format (-0430)
        case 'Z':
        case 'ZZ':
        case 'ZZZ':
            formatter = timeZoneGetter(0 /* ZoneWidth.Short */);
            break;
        // Timezone ISO8601 extended format (-04:30)
        case 'ZZZZZ':
            formatter = timeZoneGetter(3 /* ZoneWidth.Extended */);
            break;
        // Timezone GMT short format (GMT+4)
        case 'O':
        case 'OO':
        case 'OOO':
        // Should be location, but fallback to format O instead because we don't have the data yet
        case 'z':
        case 'zz':
        case 'zzz':
            formatter = timeZoneGetter(1 /* ZoneWidth.ShortGMT */);
            break;
        // Timezone GMT long format (GMT+0430)
        case 'OOOO':
        case 'ZZZZ':
        // Should be location, but fallback to format O instead because we don't have the data yet
        case 'zzzz':
            formatter = timeZoneGetter(2 /* ZoneWidth.Long */);
            break;
        default:
            return null;
    }
    DATE_FORMATS[format] = formatter;
    return formatter;
}
function timezoneToOffset(timezone, fallback) {
    // Support: IE 11 only, Edge 13-15+
    // IE/Edge do not "understand" colon (`:`) in timezone
    timezone = timezone.replace(/:/g, '');
    const requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
    return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;
}
function addDateMinutes(date, minutes) {
    date = new Date(date.getTime());
    date.setMinutes(date.getMinutes() + minutes);
    return date;
}
function convertTimezoneToLocal(date, timezone, reverse) {
    const reverseValue = -1 ;
    const dateTimezoneOffset = date.getTimezoneOffset();
    const timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
    return addDateMinutes(date, reverseValue * (timezoneOffset - dateTimezoneOffset));
}
/**
 * Converts a value to date.
 *
 * Supported input formats:
 * - `Date`
 * - number: timestamp
 * - string: numeric (e.g. "1234"), ISO and date strings in a format supported by
 *   [Date.parse()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse).
 *   Note: ISO strings without time return a date without timeoffset.
 *
 * Throws if unable to convert to a date.
 */
function toDate(value) {
    if (isDate(value)) {
        return value;
    }
    if (typeof value === 'number' && !isNaN(value)) {
        return new Date(value);
    }
    if (typeof value === 'string') {
        value = value.trim();
        if (/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(value)) {
            /* For ISO Strings without time the day, month and year must be extracted from the ISO String
            before Date creation to avoid time offset and errors in the new Date.
            If we only replace '-' with ',' in the ISO String ("2015,01,01"), and try to create a new
            date, some browsers (e.g. IE 9) will throw an invalid Date error.
            If we leave the '-' ("2015-01-01") and try to create a new Date("2015-01-01") the timeoffset
            is applied.
            Note: ISO months are 0 for January, 1 for February, ... */
            const [y, m = 1, d = 1] = value.split('-').map((val) => +val);
            return createDate(y, m - 1, d);
        }
        const parsedNb = parseFloat(value);
        // any string that only contains numbers, like "1234" but not like "1234hello"
        if (!isNaN(value - parsedNb)) {
            return new Date(parsedNb);
        }
        let match;
        if ((match = value.match(ISO8601_DATE_REGEX))) {
            return isoStringToDate(match);
        }
    }
    const date = new Date(value);
    if (!isDate(date)) {
        throw new Error(`Unable to convert "${value}" into a date`);
    }
    return date;
}
/**
 * Converts a date in ISO8601 to a Date.
 * Used instead of `Date.parse` because of browser discrepancies.
 */
function isoStringToDate(match) {
    const date = new Date(0);
    let tzHour = 0;
    let tzMin = 0;
    // match[8] means that the string contains "Z" (UTC) or a timezone like "+01:00" or "+0100"
    const dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear;
    const timeSetter = match[8] ? date.setUTCHours : date.setHours;
    // if there is a timezone defined like "+01:00" or "+0100"
    if (match[9]) {
        tzHour = Number(match[9] + match[10]);
        tzMin = Number(match[9] + match[11]);
    }
    dateSetter.call(date, Number(match[1]), Number(match[2]) - 1, Number(match[3]));
    const h = Number(match[4] || 0) - tzHour;
    const m = Number(match[5] || 0) - tzMin;
    const s = Number(match[6] || 0);
    // The ECMAScript specification (https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.11)
    // defines that `DateTime` milliseconds should always be rounded down, so that `999.9ms`
    // becomes `999ms`.
    const ms = Math.floor(parseFloat('0.' + (match[7] || 0)) * 1000);
    timeSetter.call(date, h, m, s, ms);
    return date;
}
function isDate(value) {
    return value instanceof Date && !isNaN(value.valueOf());
}

const NUMBER_FORMAT_REGEXP = /^(\d+)?\.((\d+)(-(\d+))?)?$/;
const MAX_DIGITS = 22;
const DECIMAL_SEP = '.';
const ZERO_CHAR = '0';
const PATTERN_SEP = ';';
const GROUP_SEP = ',';
const DIGIT_CHAR = '#';
const CURRENCY_CHAR = '¤';
const PERCENT_CHAR = '%';
/**
 * Transforms a number    to a locale string based on a style and a format.
 */
function formatNumberToLocaleString(value, pattern, locale, groupSymbol, decimalSymbol, digitsInfo, isPercent = false) {
    let formattedText = '';
    let isZero = false;
    if (!isFinite(value)) {
        formattedText = getLocaleNumberSymbol(locale, NumberSymbol.Infinity);
    }
    else {
        let parsedNumber = parseNumber(value);
        if (isPercent) {
            parsedNumber = toPercent(parsedNumber);
        }
        let minInt = pattern.minInt;
        let minFraction = pattern.minFrac;
        let maxFraction = pattern.maxFrac;
        if (digitsInfo) {
            const parts = digitsInfo.match(NUMBER_FORMAT_REGEXP);
            if (parts === null) {
                throw new Error(`${digitsInfo} is not a valid digit info`);
            }
            const minIntPart = parts[1];
            const minFractionPart = parts[3];
            const maxFractionPart = parts[5];
            if (minIntPart != null) {
                minInt = parseIntAutoRadix(minIntPart);
            }
            if (minFractionPart != null) {
                minFraction = parseIntAutoRadix(minFractionPart);
            }
            if (maxFractionPart != null) {
                maxFraction = parseIntAutoRadix(maxFractionPart);
            }
            else if (minFractionPart != null && minFraction > maxFraction) {
                maxFraction = minFraction;
            }
        }
        roundNumber(parsedNumber, minFraction, maxFraction);
        let digits = parsedNumber.digits;
        let integerLen = parsedNumber.integerLen;
        const exponent = parsedNumber.exponent;
        let decimals = [];
        isZero = digits.every((d) => !d);
        // pad zeros for small numbers
        for (; integerLen < minInt; integerLen++) {
            digits.unshift(0);
        }
        // pad zeros for small numbers
        for (; integerLen < 0; integerLen++) {
            digits.unshift(0);
        }
        // extract decimals digits
        if (integerLen > 0) {
            decimals = digits.splice(integerLen, digits.length);
        }
        else {
            decimals = digits;
            digits = [0];
        }
        // format the integer digits with grouping separators
        const groups = [];
        if (digits.length >= pattern.lgSize) {
            groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));
        }
        while (digits.length > pattern.gSize) {
            groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));
        }
        if (digits.length) {
            groups.unshift(digits.join(''));
        }
        formattedText = groups.join(getLocaleNumberSymbol(locale, groupSymbol));
        // append the decimal digits
        if (decimals.length) {
            formattedText += getLocaleNumberSymbol(locale, decimalSymbol) + decimals.join('');
        }
        if (exponent) {
            formattedText += getLocaleNumberSymbol(locale, NumberSymbol.Exponential) + '+' + exponent;
        }
    }
    if (value < 0 && !isZero) {
        formattedText = pattern.negPre + formattedText + pattern.negSuf;
    }
    else {
        formattedText = pattern.posPre + formattedText + pattern.posSuf;
    }
    return formattedText;
}
/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a number as currency using locale rules.
 *
 * @param value The number to format.
 * @param locale A locale code for the locale format rules to use.
 * @param currency A string containing the currency symbol or its name,
 * such as "$" or "Canadian Dollar". Used in output string, but does not affect the operation
 * of the function.
 * @param currencyCode The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217)
 * currency code, such as `USD` for the US dollar and `EUR` for the euro.
 * Used to determine the number of digits in the decimal part.
 * @param digitsInfo Decimal representation options, specified by a string in the following format:
 * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
 *
 * @returns The formatted currency value.
 *
 * @see {@link formatNumber}
 * @see {@link DecimalPipe}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 */
function formatCurrency(value, locale, currency, currencyCode, digitsInfo) {
    const format = getLocaleNumberFormat(locale, NumberFormatStyle.Currency);
    const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
    pattern.minFrac = getNumberOfCurrencyDigits(currencyCode);
    pattern.maxFrac = pattern.minFrac;
    const res = formatNumberToLocaleString(value, pattern, locale, NumberSymbol.CurrencyGroup, NumberSymbol.CurrencyDecimal, digitsInfo);
    return (res
        .replace(CURRENCY_CHAR, currency)
        // if we have 2 time the currency character, the second one is ignored
        .replace(CURRENCY_CHAR, '')
        // If there is a spacing between currency character and the value and
        // the currency character is suppressed by passing an empty string, the
        // spacing character would remain as part of the string. Then we
        // should remove it.
        .trim());
}
/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a number as a percentage according to locale rules.
 *
 * @param value The number to format.
 * @param locale A locale code for the locale format rules to use.
 * @param digitsInfo Decimal representation options, specified by a string in the following format:
 * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
 *
 * @returns The formatted percentage value.
 *
 * @see {@link formatNumber}
 * @see {@link DecimalPipe}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 * @publicApi
 *
 */
function formatPercent(value, locale, digitsInfo) {
    const format = getLocaleNumberFormat(locale, NumberFormatStyle.Percent);
    const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
    const res = formatNumberToLocaleString(value, pattern, locale, NumberSymbol.Group, NumberSymbol.Decimal, digitsInfo, true);
    return res.replace(new RegExp(PERCENT_CHAR, 'g'), getLocaleNumberSymbol(locale, NumberSymbol.PercentSign));
}
/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a number as text, with group sizing, separator, and other
 * parameters based on the locale.
 *
 * @param value The number to format.
 * @param locale A locale code for the locale format rules to use.
 * @param digitsInfo Decimal representation options, specified by a string in the following format:
 * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
 *
 * @returns The formatted text string.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 */
function formatNumber(value, locale, digitsInfo) {
    const format = getLocaleNumberFormat(locale, NumberFormatStyle.Decimal);
    const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
    return formatNumberToLocaleString(value, pattern, locale, NumberSymbol.Group, NumberSymbol.Decimal, digitsInfo);
}
function parseNumberFormat(format, minusSign = '-') {
    const p = {
        minInt: 1,
        minFrac: 0,
        maxFrac: 0,
        posPre: '',
        posSuf: '',
        negPre: '',
        negSuf: '',
        gSize: 0,
        lgSize: 0,
    };
    const patternParts = format.split(PATTERN_SEP);
    const positive = patternParts[0];
    const negative = patternParts[1];
    const positiveParts = positive.indexOf(DECIMAL_SEP) !== -1
        ? positive.split(DECIMAL_SEP)
        : [
            positive.substring(0, positive.lastIndexOf(ZERO_CHAR) + 1),
            positive.substring(positive.lastIndexOf(ZERO_CHAR) + 1),
        ], integer = positiveParts[0], fraction = positiveParts[1] || '';
    p.posPre = integer.substring(0, integer.indexOf(DIGIT_CHAR));
    for (let i = 0; i < fraction.length; i++) {
        const ch = fraction.charAt(i);
        if (ch === ZERO_CHAR) {
            p.minFrac = p.maxFrac = i + 1;
        }
        else if (ch === DIGIT_CHAR) {
            p.maxFrac = i + 1;
        }
        else {
            p.posSuf += ch;
        }
    }
    const groups = integer.split(GROUP_SEP);
    p.gSize = groups[1] ? groups[1].length : 0;
    p.lgSize = groups[2] || groups[1] ? (groups[2] || groups[1]).length : 0;
    if (negative) {
        const trunkLen = positive.length - p.posPre.length - p.posSuf.length, pos = negative.indexOf(DIGIT_CHAR);
        p.negPre = negative.substring(0, pos).replace(/'/g, '');
        p.negSuf = negative.slice(pos + trunkLen).replace(/'/g, '');
    }
    else {
        p.negPre = minusSign + p.posPre;
        p.negSuf = p.posSuf;
    }
    return p;
}
// Transforms a parsed number into a percentage by multiplying it by 100
function toPercent(parsedNumber) {
    // if the number is 0, don't do anything
    if (parsedNumber.digits[0] === 0) {
        return parsedNumber;
    }
    // Getting the current number of decimals
    const fractionLen = parsedNumber.digits.length - parsedNumber.integerLen;
    if (parsedNumber.exponent) {
        parsedNumber.exponent += 2;
    }
    else {
        if (fractionLen === 0) {
            parsedNumber.digits.push(0, 0);
        }
        else if (fractionLen === 1) {
            parsedNumber.digits.push(0);
        }
        parsedNumber.integerLen += 2;
    }
    return parsedNumber;
}
/**
 * Parses a number.
 * Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/
 */
function parseNumber(num) {
    let numStr = Math.abs(num) + '';
    let exponent = 0, digits, integerLen;
    let i, j, zeros;
    // Decimal point?
    if ((integerLen = numStr.indexOf(DECIMAL_SEP)) > -1) {
        numStr = numStr.replace(DECIMAL_SEP, '');
    }
    // Exponential form?
    if ((i = numStr.search(/e/i)) > 0) {
        // Work out the exponent.
        if (integerLen < 0)
            integerLen = i;
        integerLen += +numStr.slice(i + 1);
        numStr = numStr.substring(0, i);
    }
    else if (integerLen < 0) {
        // There was no decimal point or exponent so it is an integer.
        integerLen = numStr.length;
    }
    // Count the number of leading zeros.
    for (i = 0; numStr.charAt(i) === ZERO_CHAR; i++) {
        /* empty */
    }
    if (i === (zeros = numStr.length)) {
        // The digits are all zero.
        digits = [0];
        integerLen = 1;
    }
    else {
        // Count the number of trailing zeros
        zeros--;
        while (numStr.charAt(zeros) === ZERO_CHAR)
            zeros--;
        // Trailing zeros are insignificant so ignore them
        integerLen -= i;
        digits = [];
        // Convert string to array of digits without leading/trailing zeros.
        for (j = 0; i <= zeros; i++, j++) {
            digits[j] = Number(numStr.charAt(i));
        }
    }
    // If the number overflows the maximum allowed digits then use an exponent.
    if (integerLen > MAX_DIGITS) {
        digits = digits.splice(0, MAX_DIGITS - 1);
        exponent = integerLen - 1;
        integerLen = 1;
    }
    return { digits, exponent, integerLen };
}
/**
 * Round the parsed number to the specified number of decimal places
 * This function changes the parsedNumber in-place
 */
function roundNumber(parsedNumber, minFrac, maxFrac) {
    if (minFrac > maxFrac) {
        throw new Error(`The minimum number of digits after fraction (${minFrac}) is higher than the maximum (${maxFrac}).`);
    }
    let digits = parsedNumber.digits;
    let fractionLen = digits.length - parsedNumber.integerLen;
    const fractionSize = Math.min(Math.max(minFrac, fractionLen), maxFrac);
    // The index of the digit to where rounding is to occur
    let roundAt = fractionSize + parsedNumber.integerLen;
    let digit = digits[roundAt];
    if (roundAt > 0) {
        // Drop fractional digits beyond `roundAt`
        digits.splice(Math.max(parsedNumber.integerLen, roundAt));
        // Set non-fractional digits beyond `roundAt` to 0
        for (let j = roundAt; j < digits.length; j++) {
            digits[j] = 0;
        }
    }
    else {
        // We rounded to zero so reset the parsedNumber
        fractionLen = Math.max(0, fractionLen);
        parsedNumber.integerLen = 1;
        digits.length = Math.max(1, (roundAt = fractionSize + 1));
        digits[0] = 0;
        for (let i = 1; i < roundAt; i++)
            digits[i] = 0;
    }
    if (digit >= 5) {
        if (roundAt - 1 < 0) {
            for (let k = 0; k > roundAt; k--) {
                digits.unshift(0);
                parsedNumber.integerLen++;
            }
            digits.unshift(1);
            parsedNumber.integerLen++;
        }
        else {
            digits[roundAt - 1]++;
        }
    }
    // Pad out with zeros to get the required fraction length
    for (; fractionLen < Math.max(0, fractionSize); fractionLen++)
        digits.push(0);
    let dropTrailingZeros = fractionSize !== 0;
    // Minimal length = nb of decimals required + current nb of integers
    // Any number besides that is optional and can be removed if it's a trailing 0
    const minLen = minFrac + parsedNumber.integerLen;
    // Do any carrying, e.g. a digit was rounded up to 10
    const carry = digits.reduceRight(function (carry, d, i, digits) {
        d = d + carry;
        digits[i] = d < 10 ? d : d - 10; // d % 10
        if (dropTrailingZeros) {
            // Do not keep meaningless fractional trailing zeros (e.g. 15.52000 --> 15.52)
            if (digits[i] === 0 && i >= minLen) {
                digits.pop();
            }
            else {
                dropTrailingZeros = false;
            }
        }
        return d >= 10 ? 1 : 0; // Math.floor(d / 10);
    }, 0);
    if (carry) {
        digits.unshift(carry);
        parsedNumber.integerLen++;
    }
}
function parseIntAutoRadix(text) {
    const result = parseInt(text);
    if (isNaN(result)) {
        throw new Error('Invalid integer literal when parsing ' + text);
    }
    return result;
}

/**
 * @publicApi
 */
class NgLocalization {
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgLocalization, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgLocalization, providedIn: 'root', useFactory: (locale) => new NgLocaleLocalization(locale), deps: [{ token: LOCALE_ID }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgLocalization, decorators: [{
            type: Injectable,
            args: [{
                    providedIn: 'root',
                    useFactory: (locale) => new NgLocaleLocalization(locale),
                    deps: [LOCALE_ID],
                }]
        }] });
/**
 * Returns the plural category for a given value.
 * - "=value" when the case exists,
 * - the plural category otherwise
 */
function getPluralCategory(value, cases, ngLocalization, locale) {
    let key = `=${value}`;
    if (cases.indexOf(key) > -1) {
        return key;
    }
    key = ngLocalization.getPluralCategory(value, locale);
    if (cases.indexOf(key) > -1) {
        return key;
    }
    if (cases.indexOf('other') > -1) {
        return 'other';
    }
    throw new Error(`No plural message found for value "${value}"`);
}
/**
 * Returns the plural case based on the locale
 *
 * @publicApi
 */
class NgLocaleLocalization extends NgLocalization {
    locale;
    constructor(locale) {
        super();
        this.locale = locale;
    }
    getPluralCategory(value, locale) {
        const plural = getLocalePluralCase(locale || this.locale)(value);
        switch (plural) {
            case Plural.Zero:
                return 'zero';
            case Plural.One:
                return 'one';
            case Plural.Two:
                return 'two';
            case Plural.Few:
                return 'few';
            case Plural.Many:
                return 'many';
            default:
                return 'other';
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgLocaleLocalization, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgLocaleLocalization });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgLocaleLocalization, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Inject,
                    args: [LOCALE_ID]
                }] }] });

const WS_REGEXP = /\s+/;
const EMPTY_ARRAY = [];
/**
 * @ngModule CommonModule
 *
 * @usageNotes
 * ```html
 * <some-element [ngClass]="stringExp|arrayExp|objExp|Set">...</some-element>
 *
 * <some-element [ngClass]="{'class1 class2 class3' : true}">...</some-element>
 * ```
 *
 * For more simple use cases you can use the [class bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly.
 * It doesn't require importing a directive.
 *
 * ```html
 * <some-element [class]="'first second'">...</some-element>
 *
 * <some-element [class.expanded]="isExpanded">...</some-element>
 *
 * <some-element [class]="['first', 'second']">...</some-element>
 *
 * <some-element [class]="{'first': true, 'second': true, 'third': false}">...</some-element>
 * ```
 * @description
 *
 * Adds and removes CSS classes on an HTML element.
 *
 * The CSS classes are updated as follows, depending on the type of the expression evaluation:
 * - `string` - the CSS classes listed in the string (space delimited) are added,
 * - `Array` - the CSS classes declared as Array elements are added,
 * - `Object` - keys are CSS classes that get added when the expression given in the value
 *              evaluates to a truthy value, otherwise they are removed.
 *
 *
 * @see [Class bindings](/guide/templates/binding#css-class-and-style-property-bindings)
 *
 * @publicApi
 */
class NgClass {
    _ngEl;
    _renderer;
    initialClasses = EMPTY_ARRAY;
    rawClass;
    stateMap = new Map();
    constructor(_ngEl, _renderer) {
        this._ngEl = _ngEl;
        this._renderer = _renderer;
    }
    set klass(value) {
        this.initialClasses = value != null ? value.trim().split(WS_REGEXP) : EMPTY_ARRAY;
    }
    set ngClass(value) {
        this.rawClass = typeof value === 'string' ? value.trim().split(WS_REGEXP) : value;
    }
    /*
    The NgClass directive uses the custom change detection algorithm for its inputs. The custom
    algorithm is necessary since inputs are represented as complex object or arrays that need to be
    deeply-compared.
  
    This algorithm is perf-sensitive since NgClass is used very frequently and its poor performance
    might negatively impact runtime performance of the entire change detection cycle. The design of
    this algorithm is making sure that:
    - there is no unnecessary DOM manipulation (CSS classes are added / removed from the DOM only when
    needed), even if references to bound objects change;
    - there is no memory allocation if nothing changes (even relatively modest memory allocation
    during the change detection cycle can result in GC pauses for some of the CD cycles).
  
    The algorithm works by iterating over the set of bound classes, staring with [class] binding and
    then going over [ngClass] binding. For each CSS class name:
    - check if it was seen before (this information is tracked in the state map) and if its value
    changed;
    - mark it as "touched" - names that are not marked are not present in the latest set of binding
    and we can remove such class name from the internal data structures;
  
    After iteration over all the CSS class names we've got data structure with all the information
    necessary to synchronize changes to the DOM - it is enough to iterate over the state map, flush
    changes to the DOM and reset internal data structures so those are ready for the next change
    detection cycle.
     */
    ngDoCheck() {
        // classes from the [class] binding
        for (const klass of this.initialClasses) {
            this._updateState(klass, true);
        }
        // classes from the [ngClass] binding
        const rawClass = this.rawClass;
        if (Array.isArray(rawClass) || rawClass instanceof Set) {
            for (const klass of rawClass) {
                this._updateState(klass, true);
            }
        }
        else if (rawClass != null) {
            for (const klass of Object.keys(rawClass)) {
                this._updateState(klass, Boolean(rawClass[klass]));
            }
        }
        this._applyStateDiff();
    }
    _updateState(klass, nextEnabled) {
        const state = this.stateMap.get(klass);
        if (state !== undefined) {
            if (state.enabled !== nextEnabled) {
                state.changed = true;
                state.enabled = nextEnabled;
            }
            state.touched = true;
        }
        else {
            this.stateMap.set(klass, { enabled: nextEnabled, changed: true, touched: true });
        }
    }
    _applyStateDiff() {
        for (const stateEntry of this.stateMap) {
            const klass = stateEntry[0];
            const state = stateEntry[1];
            if (state.changed) {
                this._toggleClass(klass, state.enabled);
                state.changed = false;
            }
            else if (!state.touched) {
                // A class that was previously active got removed from the new collection of classes -
                // remove from the DOM as well.
                if (state.enabled) {
                    this._toggleClass(klass, false);
                }
                this.stateMap.delete(klass);
            }
            state.touched = false;
        }
    }
    _toggleClass(klass, enabled) {
        if (ngDevMode) {
            if (typeof klass !== 'string') {
                throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${_stringify(klass)}`);
            }
        }
        klass = klass.trim();
        if (klass.length > 0) {
            klass.split(WS_REGEXP).forEach((klass) => {
                if (enabled) {
                    this._renderer.addClass(this._ngEl.nativeElement, klass);
                }
                else {
                    this._renderer.removeClass(this._ngEl.nativeElement, klass);
                }
            });
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgClass, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgClass, isStandalone: true, selector: "[ngClass]", inputs: { klass: ["class", "klass"], ngClass: "ngClass" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgClass, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngClass]',
                }]
        }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { klass: [{
                type: Input,
                args: ['class']
            }], ngClass: [{
                type: Input,
                args: ['ngClass']
            }] } });

/**
 * Instantiates a {@link /api/core/Component Component} type and inserts its Host View into the current View.
 * `NgComponentOutlet` provides a declarative approach for dynamic component creation.
 *
 * `NgComponentOutlet` requires a component type, if a falsy value is set the view will clear and
 * any existing component will be destroyed.
 *
 * @usageNotes
 *
 * ### Fine tune control
 *
 * You can control the component creation process by using the following optional attributes:
 *
 * * `ngComponentOutletInputs`: Optional component inputs object, which will be bind to the
 * component.
 *
 * * `ngComponentOutletInjector`: Optional custom {@link Injector} that will be used as parent for
 * the Component. Defaults to the injector of the current view container.
 *
 * * `ngComponentOutletContent`: Optional list of projectable nodes to insert into the content
 * section of the component, if it exists.
 *
 * * `ngComponentOutletNgModule`: Optional NgModule class reference to allow loading another
 * module dynamically, then loading a component from that module.
 *
 * * `ngComponentOutletNgModuleFactory`: Deprecated config option that allows providing optional
 * NgModule factory to allow loading another module dynamically, then loading a component from that
 * module. Use `ngComponentOutletNgModule` instead.
 *
 * ### Syntax
 *
 * Simple
 * ```html
 * <ng-container *ngComponentOutlet="componentTypeExpression"></ng-container>
 * ```
 *
 * With inputs
 * ```html
 * <ng-container *ngComponentOutlet="componentTypeExpression;
 *                                   inputs: inputsExpression;">
 * </ng-container>
 * ```
 *
 * Customized injector/content
 * ```html
 * <ng-container *ngComponentOutlet="componentTypeExpression;
 *                                   injector: injectorExpression;
 *                                   content: contentNodesExpression;">
 * </ng-container>
 * ```
 *
 * Customized NgModule reference
 * ```html
 * <ng-container *ngComponentOutlet="componentTypeExpression;
 *                                   ngModule: ngModuleClass;">
 * </ng-container>
 * ```
 *
 * ### A simple example
 *
 * {@example common/ngComponentOutlet/ts/module.ts region='SimpleExample'}
 *
 * A more complete example with additional options:
 *
 * {@example common/ngComponentOutlet/ts/module.ts region='CompleteExample'}
 *
 * @publicApi
 * @ngModule CommonModule
 */
class NgComponentOutlet {
    _viewContainerRef;
    // TODO(crisbeto): this should be `Type<T>`, but doing so broke a few
    // targets in a TGP so we need to do it in a major version.
    /** Component that should be rendered in the outlet. */
    ngComponentOutlet = null;
    ngComponentOutletInputs;
    ngComponentOutletInjector;
    ngComponentOutletContent;
    ngComponentOutletNgModule;
    /**
     * @deprecated This input is deprecated, use `ngComponentOutletNgModule` instead.
     */
    ngComponentOutletNgModuleFactory;
    _componentRef;
    _moduleRef;
    /**
     * A helper data structure that allows us to track inputs that were part of the
     * ngComponentOutletInputs expression. Tracking inputs is necessary for proper removal of ones
     * that are no longer referenced.
     */
    _inputsUsed = new Map();
    /**
     * Gets the instance of the currently-rendered component.
     * Will be null if no component has been rendered.
     */
    get componentInstance() {
        return this._componentRef?.instance ?? null;
    }
    constructor(_viewContainerRef) {
        this._viewContainerRef = _viewContainerRef;
    }
    _needToReCreateNgModuleInstance(changes) {
        // Note: square brackets property accessor is safe for Closure compiler optimizations (the
        // `changes` argument of the `ngOnChanges` lifecycle hook retains the names of the fields that
        // were changed).
        return (changes['ngComponentOutletNgModule'] !== undefined ||
            changes['ngComponentOutletNgModuleFactory'] !== undefined);
    }
    _needToReCreateComponentInstance(changes) {
        // Note: square brackets property accessor is safe for Closure compiler optimizations (the
        // `changes` argument of the `ngOnChanges` lifecycle hook retains the names of the fields that
        // were changed).
        return (changes['ngComponentOutlet'] !== undefined ||
            changes['ngComponentOutletContent'] !== undefined ||
            changes['ngComponentOutletInjector'] !== undefined ||
            this._needToReCreateNgModuleInstance(changes));
    }
    /** @docs-private */
    ngOnChanges(changes) {
        if (this._needToReCreateComponentInstance(changes)) {
            this._viewContainerRef.clear();
            this._inputsUsed.clear();
            this._componentRef = undefined;
            if (this.ngComponentOutlet) {
                const injector = this.ngComponentOutletInjector || this._viewContainerRef.parentInjector;
                if (this._needToReCreateNgModuleInstance(changes)) {
                    this._moduleRef?.destroy();
                    if (this.ngComponentOutletNgModule) {
                        this._moduleRef = createNgModule(this.ngComponentOutletNgModule, getParentInjector(injector));
                    }
                    else if (this.ngComponentOutletNgModuleFactory) {
                        this._moduleRef = this.ngComponentOutletNgModuleFactory.create(getParentInjector(injector));
                    }
                    else {
                        this._moduleRef = undefined;
                    }
                }
                this._componentRef = this._viewContainerRef.createComponent(this.ngComponentOutlet, {
                    injector,
                    ngModuleRef: this._moduleRef,
                    projectableNodes: this.ngComponentOutletContent,
                });
            }
        }
    }
    /** @docs-private */
    ngDoCheck() {
        if (this._componentRef) {
            if (this.ngComponentOutletInputs) {
                for (const inputName of Object.keys(this.ngComponentOutletInputs)) {
                    this._inputsUsed.set(inputName, true);
                }
            }
            this._applyInputStateDiff(this._componentRef);
        }
    }
    /** @docs-private */
    ngOnDestroy() {
        this._moduleRef?.destroy();
    }
    _applyInputStateDiff(componentRef) {
        for (const [inputName, touched] of this._inputsUsed) {
            if (!touched) {
                // The input that was previously active no longer exists and needs to be set to undefined.
                componentRef.setInput(inputName, undefined);
                this._inputsUsed.delete(inputName);
            }
            else {
                // Since touched is true, it can be asserted that the inputs object is not empty.
                componentRef.setInput(inputName, this.ngComponentOutletInputs[inputName]);
                this._inputsUsed.set(inputName, false);
            }
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgComponentOutlet, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgComponentOutlet, isStandalone: true, selector: "[ngComponentOutlet]", inputs: { ngComponentOutlet: "ngComponentOutlet", ngComponentOutletInputs: "ngComponentOutletInputs", ngComponentOutletInjector: "ngComponentOutletInjector", ngComponentOutletContent: "ngComponentOutletContent", ngComponentOutletNgModule: "ngComponentOutletNgModule", ngComponentOutletNgModuleFactory: "ngComponentOutletNgModuleFactory" }, exportAs: ["ngComponentOutlet"], usesOnChanges: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgComponentOutlet, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngComponentOutlet]',
                    exportAs: 'ngComponentOutlet',
                }]
        }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { ngComponentOutlet: [{
                type: Input
            }], ngComponentOutletInputs: [{
                type: Input
            }], ngComponentOutletInjector: [{
                type: Input
            }], ngComponentOutletContent: [{
                type: Input
            }], ngComponentOutletNgModule: [{
                type: Input
            }], ngComponentOutletNgModuleFactory: [{
                type: Input
            }] } });
// Helper function that returns an Injector instance of a parent NgModule.
function getParentInjector(injector) {
    const parentNgModule = injector.get(NgModuleRef);
    return parentNgModule.injector;
}

/**
 * @publicApi
 */
class NgForOfContext {
    $implicit;
    ngForOf;
    index;
    count;
    constructor(
    /** Reference to the current item from the collection. */
    $implicit, 
    /**
     * The value of the iterable expression. Useful when the expression is
     * more complex then a property access, for example when using the async pipe
     * (`userStreams | async`).
     */
    ngForOf, 
    /** Returns an index of the current item in the collection. */
    index, 
    /** Returns total amount of items in the collection. */
    count) {
        this.$implicit = $implicit;
        this.ngForOf = ngForOf;
        this.index = index;
        this.count = count;
    }
    // Indicates whether this is the first item in the collection.
    get first() {
        return this.index === 0;
    }
    // Indicates whether this is the last item in the collection.
    get last() {
        return this.index === this.count - 1;
    }
    // Indicates whether an index of this item in the collection is even.
    get even() {
        return this.index % 2 === 0;
    }
    // Indicates whether an index of this item in the collection is odd.
    get odd() {
        return !this.even;
    }
}
/**
 * A [structural directive](guide/directives/structural-directives) that renders
 * a template for each item in a collection.
 * The directive is placed on an element, which becomes the parent
 * of the cloned templates.
 *
 * The `ngForOf` directive is generally used in the
 * [shorthand form](guide/directives/structural-directives#asterisk) `*ngFor`.
 * In this form, the template to be rendered for each iteration is the content
 * of an anchor element containing the directive.
 *
 * The following example shows the shorthand syntax with some options,
 * contained in an `<li>` element.
 *
 * ```html
 * <li *ngFor="let item of items; index as i; trackBy: trackByFn">...</li>
 * ```
 *
 * The shorthand form expands into a long form that uses the `ngForOf` selector
 * on an `<ng-template>` element.
 * The content of the `<ng-template>` element is the `<li>` element that held the
 * short-form directive.
 *
 * Here is the expanded version of the short-form example.
 *
 * ```html
 * <ng-template ngFor let-item [ngForOf]="items" let-i="index" [ngForTrackBy]="trackByFn">
 *   <li>...</li>
 * </ng-template>
 * ```
 *
 * Angular automatically expands the shorthand syntax as it compiles the template.
 * The context for each embedded view is logically merged to the current component
 * context according to its lexical position.
 *
 * When using the shorthand syntax, Angular allows only [one structural directive
 * on an element](guide/directives/structural-directives#one-per-element).
 * If you want to iterate conditionally, for example,
 * put the `*ngIf` on a container element that wraps the `*ngFor` element.
 * For further discussion, see
 * [Structural Directives](guide/directives/structural-directives#one-per-element).
 *
 * @usageNotes
 *
 * ### Local variables
 *
 * `NgForOf` provides exported values that can be aliased to local variables.
 * For example:
 *
 *  ```html
 * <li *ngFor="let user of users; index as i; first as isFirst">
 *    {{i}}/{{users.length}}. {{user}} <span *ngIf="isFirst">default</span>
 * </li>
 * ```
 *
 * The following exported values can be aliased to local variables:
 *
 * - `$implicit: T`: The value of the individual items in the iterable (`ngForOf`).
 * - `ngForOf: NgIterable<T>`: The value of the iterable expression. Useful when the expression is
 * more complex then a property access, for example when using the async pipe (`userStreams |
 * async`).
 * - `index: number`: The index of the current item in the iterable.
 * - `count: number`: The length of the iterable.
 * - `first: boolean`: True when the item is the first item in the iterable.
 * - `last: boolean`: True when the item is the last item in the iterable.
 * - `even: boolean`: True when the item has an even index in the iterable.
 * - `odd: boolean`: True when the item has an odd index in the iterable.
 *
 * ### Change propagation
 *
 * When the contents of the iterator changes, `NgForOf` makes the corresponding changes to the DOM:
 *
 * * When an item is added, a new instance of the template is added to the DOM.
 * * When an item is removed, its template instance is removed from the DOM.
 * * When items are reordered, their respective templates are reordered in the DOM.
 *
 * Angular uses object identity to track insertions and deletions within the iterator and reproduce
 * those changes in the DOM. This has important implications for animations and any stateful
 * controls that are present, such as `<input>` elements that accept user input. Inserted rows can
 * be animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state
 * such as user input.
 * For more on animations, see [Transitions and Triggers](guide/animations/transition-and-triggers).
 *
 * The identities of elements in the iterator can change while the data does not.
 * This can happen, for example, if the iterator is produced from an RPC to the server, and that
 * RPC is re-run. Even if the data hasn't changed, the second response produces objects with
 * different identities, and Angular must tear down the entire DOM and rebuild it (as if all old
 * elements were deleted and all new elements inserted).
 *
 * To avoid this expensive operation, you can customize the default tracking algorithm.
 * by supplying the `trackBy` option to `NgForOf`.
 * `trackBy` takes a function that has two arguments: `index` and `item`.
 * If `trackBy` is given, Angular tracks changes by the return value of the function.
 *
 * @see [Structural Directives](guide/directives/structural-directives)
 * @ngModule CommonModule
 * @publicApi
 */
class NgForOf {
    _viewContainer;
    _template;
    _differs;
    /**
     * The value of the iterable expression, which can be used as a
     * [template input variable](guide/directives/structural-directives#shorthand).
     */
    set ngForOf(ngForOf) {
        this._ngForOf = ngForOf;
        this._ngForOfDirty = true;
    }
    /**
     * Specifies a custom `TrackByFunction` to compute the identity of items in an iterable.
     *
     * If a custom `TrackByFunction` is not provided, `NgForOf` will use the item's [object
     * identity](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)
     * as the key.
     *
     * `NgForOf` uses the computed key to associate items in an iterable with DOM elements
     * it produces for these items.
     *
     * A custom `TrackByFunction` is useful to provide good user experience in cases when items in an
     * iterable rendered using `NgForOf` have a natural identifier (for example, custom ID or a
     * primary key), and this iterable could be updated with new object instances that still
     * represent the same underlying entity (for example, when data is re-fetched from the server,
     * and the iterable is recreated and re-rendered, but most of the data is still the same).
     *
     * @see {@link TrackByFunction}
     */
    set ngForTrackBy(fn) {
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && fn != null && typeof fn !== 'function') {
            console.warn(`trackBy must be a function, but received ${JSON.stringify(fn)}. ` +
                `See https://angular.io/api/common/NgForOf#change-propagation for more information.`);
        }
        this._trackByFn = fn;
    }
    get ngForTrackBy() {
        return this._trackByFn;
    }
    _ngForOf = null;
    _ngForOfDirty = true;
    _differ = null;
    // waiting for microsoft/typescript#43662 to allow the return type `TrackByFunction|undefined` for
    // the getter
    _trackByFn;
    constructor(_viewContainer, _template, _differs) {
        this._viewContainer = _viewContainer;
        this._template = _template;
        this._differs = _differs;
    }
    /**
     * A reference to the template that is stamped out for each item in the iterable.
     * @see [template reference variable](guide/templates/variables#template-reference-variables)
     */
    set ngForTemplate(value) {
        // TODO(TS2.1): make TemplateRef<Partial<NgForRowOf<T>>> once we move to TS v2.1
        // The current type is too restrictive; a template that just uses index, for example,
        // should be acceptable.
        if (value) {
            this._template = value;
        }
    }
    /**
     * Applies the changes when needed.
     * @docs-private
     */
    ngDoCheck() {
        if (this._ngForOfDirty) {
            this._ngForOfDirty = false;
            // React on ngForOf changes only once all inputs have been initialized
            const value = this._ngForOf;
            if (!this._differ && value) {
                if (typeof ngDevMode === 'undefined' || ngDevMode) {
                    try {
                        // CAUTION: this logic is duplicated for production mode below, as the try-catch
                        // is only present in development builds.
                        this._differ = this._differs.find(value).create(this.ngForTrackBy);
                    }
                    catch {
                        let errorMessage = `Cannot find a differ supporting object '${value}' of type '` +
                            `${getTypeName(value)}'. NgFor only supports binding to Iterables, such as Arrays.`;
                        if (typeof value === 'object') {
                            errorMessage += ' Did you mean to use the keyvalue pipe?';
                        }
                        throw new _RuntimeError(-2200 /* RuntimeErrorCode.NG_FOR_MISSING_DIFFER */, errorMessage);
                    }
                }
                else {
                    // CAUTION: this logic is duplicated for development mode above, as the try-catch
                    // is only present in development builds.
                    this._differ = this._differs.find(value).create(this.ngForTrackBy);
                }
            }
        }
        if (this._differ) {
            const changes = this._differ.diff(this._ngForOf);
            if (changes)
                this._applyChanges(changes);
        }
    }
    _applyChanges(changes) {
        const viewContainer = this._viewContainer;
        changes.forEachOperation((item, adjustedPreviousIndex, currentIndex) => {
            if (item.previousIndex == null) {
                // NgForOf is never "null" or "undefined" here because the differ detected
                // that a new item needs to be inserted from the iterable. This implies that
                // there is an iterable value for "_ngForOf".
                viewContainer.createEmbeddedView(this._template, new NgForOfContext(item.item, this._ngForOf, -1, -1), currentIndex === null ? undefined : currentIndex);
            }
            else if (currentIndex == null) {
                viewContainer.remove(adjustedPreviousIndex === null ? undefined : adjustedPreviousIndex);
            }
            else if (adjustedPreviousIndex !== null) {
                const view = viewContainer.get(adjustedPreviousIndex);
                viewContainer.move(view, currentIndex);
                applyViewChange(view, item);
            }
        });
        for (let i = 0, ilen = viewContainer.length; i < ilen; i++) {
            const viewRef = viewContainer.get(i);
            const context = viewRef.context;
            context.index = i;
            context.count = ilen;
            context.ngForOf = this._ngForOf;
        }
        changes.forEachIdentityChange((record) => {
            const viewRef = viewContainer.get(record.currentIndex);
            applyViewChange(viewRef, record);
        });
    }
    /**
     * Asserts the correct type of the context for the template that `NgForOf` will render.
     *
     * The presence of this method is a signal to the Ivy template type-check compiler that the
     * `NgForOf` structural directive renders its template with a specific context type.
     */
    static ngTemplateContextGuard(dir, ctx) {
        return true;
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgForOf, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgForOf, isStandalone: true, selector: "[ngFor][ngForOf]", inputs: { ngForOf: "ngForOf", ngForTrackBy: "ngForTrackBy", ngForTemplate: "ngForTemplate" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgForOf, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngFor][ngForOf]',
                }]
        }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }, { type: i0.IterableDiffers }], propDecorators: { ngForOf: [{
                type: Input
            }], ngForTrackBy: [{
                type: Input
            }], ngForTemplate: [{
                type: Input
            }] } });
function applyViewChange(view, record) {
    view.context.$implicit = record.item;
}
function getTypeName(type) {
    return type['name'] || typeof type;
}

/**
 * A structural directive that conditionally includes a template based on the value of
 * an expression coerced to Boolean.
 * When the expression evaluates to true, Angular renders the template
 * provided in a `then` clause, and when  false or null,
 * Angular renders the template provided in an optional `else` clause. The default
 * template for the `else` clause is blank.
 *
 * A [shorthand form](guide/directives/structural-directives#asterisk) of the directive,
 * `*ngIf="condition"`, is generally used, provided
 * as an attribute of the anchor element for the inserted template.
 * Angular expands this into a more explicit version, in which the anchor element
 * is contained in an `<ng-template>` element.
 *
 * Simple form with shorthand syntax:
 *
 * ```html
 * <div *ngIf="condition">Content to render when condition is true.</div>
 * ```
 *
 * Simple form with expanded syntax:
 *
 * ```html
 * <ng-template [ngIf]="condition"><div>Content to render when condition is
 * true.</div></ng-template>
 * ```
 *
 * Form with an "else" block:
 *
 * ```html
 * <div *ngIf="condition; else elseBlock">Content to render when condition is true.</div>
 * <ng-template #elseBlock>Content to render when condition is false.</ng-template>
 * ```
 *
 * Shorthand form with "then" and "else" blocks:
 *
 * ```html
 * <div *ngIf="condition; then thenBlock else elseBlock"></div>
 * <ng-template #thenBlock>Content to render when condition is true.</ng-template>
 * <ng-template #elseBlock>Content to render when condition is false.</ng-template>
 * ```
 *
 * Form with storing the value locally:
 *
 * ```html
 * <div *ngIf="condition as value; else elseBlock">{{value}}</div>
 * <ng-template #elseBlock>Content to render when value is null.</ng-template>
 * ```
 *
 * @usageNotes
 *
 * The `*ngIf` directive is most commonly used to conditionally show an inline template,
 * as seen in the following  example.
 * The default `else` template is blank.
 *
 * {@example common/ngIf/ts/module.ts region='NgIfSimple'}
 *
 * ### Showing an alternative template using `else`
 *
 * To display a template when `expression` evaluates to false, use an `else` template
 * binding as shown in the following example.
 * The `else` binding points to an `<ng-template>`  element labeled `#elseBlock`.
 * The template can be defined anywhere in the component view, but is typically placed right after
 * `ngIf` for readability.
 *
 * {@example common/ngIf/ts/module.ts region='NgIfElse'}
 *
 * ### Using an external `then` template
 *
 * In the previous example, the then-clause template is specified inline, as the content of the
 * tag that contains the `ngIf` directive. You can also specify a template that is defined
 * externally, by referencing a labeled `<ng-template>` element. When you do this, you can
 * change which template to use at runtime, as shown in the following example.
 *
 * {@example common/ngIf/ts/module.ts region='NgIfThenElse'}
 *
 * ### Storing a conditional result in a variable
 *
 * You might want to show a set of properties from the same object. If you are waiting
 * for asynchronous data, the object can be undefined.
 * In this case, you can use `ngIf` and store the result of the condition in a local
 * variable as shown in the following example.
 *
 * {@example common/ngIf/ts/module.ts region='NgIfAs'}
 *
 * This code uses only one `AsyncPipe`, so only one subscription is created.
 * The conditional statement stores the result of `userStream|async` in the local variable `user`.
 * You can then bind the local `user` repeatedly.
 *
 * The conditional displays the data only if `userStream` returns a value,
 * so you don't need to use the
 * safe-navigation-operator (`?.`)
 * to guard against null values when accessing properties.
 * You can display an alternative template while waiting for the data.
 *
 * ### Shorthand syntax
 *
 * The shorthand syntax `*ngIf` expands into two separate template specifications
 * for the "then" and "else" clauses. For example, consider the following shorthand statement,
 * that is meant to show a loading page while waiting for data to be loaded.
 *
 * ```html
 * <div class="hero-list" *ngIf="heroes else loading">
 *  ...
 * </div>
 *
 * <ng-template #loading>
 *  <div>Loading...</div>
 * </ng-template>
 * ```
 *
 * You can see that the "else" clause references the `<ng-template>`
 * with the `#loading` label, and the template for the "then" clause
 * is provided as the content of the anchor element.
 *
 * However, when Angular expands the shorthand syntax, it creates
 * another `<ng-template>` tag, with `ngIf` and `ngIfElse` directives.
 * The anchor element containing the template for the "then" clause becomes
 * the content of this unlabeled `<ng-template>` tag.
 *
 * ```html
 * <ng-template [ngIf]="heroes" [ngIfElse]="loading">
 *  <div class="hero-list">
 *   ...
 *  </div>
 * </ng-template>
 *
 * <ng-template #loading>
 *  <div>Loading...</div>
 * </ng-template>
 * ```
 *
 * The presence of the implicit template object has implications for the nesting of
 * structural directives. For more on this subject, see
 * [Structural Directives](guide/directives/structural-directives#one-per-element).
 *
 * @ngModule CommonModule
 * @publicApi
 */
class NgIf {
    _viewContainer;
    _context = new NgIfContext();
    _thenTemplateRef = null;
    _elseTemplateRef = null;
    _thenViewRef = null;
    _elseViewRef = null;
    constructor(_viewContainer, templateRef) {
        this._viewContainer = _viewContainer;
        this._thenTemplateRef = templateRef;
    }
    /**
     * The Boolean expression to evaluate as the condition for showing a template.
     */
    set ngIf(condition) {
        this._context.$implicit = this._context.ngIf = condition;
        this._updateView();
    }
    /**
     * A template to show if the condition expression evaluates to true.
     */
    set ngIfThen(templateRef) {
        assertTemplate(templateRef, (typeof ngDevMode === 'undefined' || ngDevMode) && 'ngIfThen');
        this._thenTemplateRef = templateRef;
        this._thenViewRef = null; // clear previous view if any.
        this._updateView();
    }
    /**
     * A template to show if the condition expression evaluates to false.
     */
    set ngIfElse(templateRef) {
        assertTemplate(templateRef, (typeof ngDevMode === 'undefined' || ngDevMode) && 'ngIfElse');
        this._elseTemplateRef = templateRef;
        this._elseViewRef = null; // clear previous view if any.
        this._updateView();
    }
    _updateView() {
        if (this._context.$implicit) {
            if (!this._thenViewRef) {
                this._viewContainer.clear();
                this._elseViewRef = null;
                if (this._thenTemplateRef) {
                    this._thenViewRef = this._viewContainer.createEmbeddedView(this._thenTemplateRef, this._context);
                }
            }
        }
        else {
            if (!this._elseViewRef) {
                this._viewContainer.clear();
                this._thenViewRef = null;
                if (this._elseTemplateRef) {
                    this._elseViewRef = this._viewContainer.createEmbeddedView(this._elseTemplateRef, this._context);
                }
            }
        }
    }
    /** @internal */
    static ngIfUseIfTypeGuard;
    /**
     * Assert the correct type of the expression bound to the `ngIf` input within the template.
     *
     * The presence of this static field is a signal to the Ivy template type check compiler that
     * when the `NgIf` structural directive renders its template, the type of the expression bound
     * to `ngIf` should be narrowed in some way. For `NgIf`, the binding expression itself is used to
     * narrow its type, which allows the strictNullChecks feature of TypeScript to work with `NgIf`.
     */
    static ngTemplateGuard_ngIf;
    /**
     * Asserts the correct type of the context for the template that `NgIf` will render.
     *
     * The presence of this method is a signal to the Ivy template type-check compiler that the
     * `NgIf` structural directive renders its template with a specific context type.
     */
    static ngTemplateContextGuard(dir, ctx) {
        return true;
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgIf, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgIf, isStandalone: true, selector: "[ngIf]", inputs: { ngIf: "ngIf", ngIfThen: "ngIfThen", ngIfElse: "ngIfElse" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgIf, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngIf]',
                }]
        }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }], propDecorators: { ngIf: [{
                type: Input
            }], ngIfThen: [{
                type: Input
            }], ngIfElse: [{
                type: Input
            }] } });
/**
 * @publicApi
 */
class NgIfContext {
    $implicit = null;
    ngIf = null;
}
function assertTemplate(templateRef, property) {
    if (templateRef && !templateRef.createEmbeddedView) {
        throw new _RuntimeError(2020 /* RuntimeErrorCode.NG_IF_NOT_A_TEMPLATE_REF */, (typeof ngDevMode === 'undefined' || ngDevMode) &&
            `${property} must be a TemplateRef, but received '${_stringify(templateRef)}'.`);
    }
}

class SwitchView {
    _viewContainerRef;
    _templateRef;
    _created = false;
    constructor(_viewContainerRef, _templateRef) {
        this._viewContainerRef = _viewContainerRef;
        this._templateRef = _templateRef;
    }
    create() {
        this._created = true;
        this._viewContainerRef.createEmbeddedView(this._templateRef);
    }
    destroy() {
        this._created = false;
        this._viewContainerRef.clear();
    }
    enforceState(created) {
        if (created && !this._created) {
            this.create();
        }
        else if (!created && this._created) {
            this.destroy();
        }
    }
}
/**
 * @ngModule CommonModule
 *
 * @description
 * The `[ngSwitch]` directive on a container specifies an expression to match against.
 * The expressions to match are provided by `ngSwitchCase` directives on views within the container.
 * - Every view that matches is rendered.
 * - If there are no matches, a view with the `ngSwitchDefault` directive is rendered.
 * - Elements within the `[NgSwitch]` statement but outside of any `NgSwitchCase`
 * or `ngSwitchDefault` directive are preserved at the location.
 *
 * @usageNotes
 * Define a container element for the directive, and specify the switch expression
 * to match against as an attribute:
 *
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 * ```
 *
 * Within the container, `*ngSwitchCase` statements specify the match expressions
 * as attributes. Include `*ngSwitchDefault` as the final case.
 *
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 *    <some-element *ngSwitchCase="match_expression_1">...</some-element>
 * ...
 *    <some-element *ngSwitchDefault>...</some-element>
 * </container-element>
 * ```
 *
 * ### Usage Examples
 *
 * The following example shows how to use more than one case to display the same view:
 *
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 *   <!-- the same view can be shown in more than one case -->
 *   <some-element *ngSwitchCase="match_expression_1">...</some-element>
 *   <some-element *ngSwitchCase="match_expression_2">...</some-element>
 *   <some-other-element *ngSwitchCase="match_expression_3">...</some-other-element>
 *   <!--default case when there are no matches -->
 *   <some-element *ngSwitchDefault>...</some-element>
 * </container-element>
 * ```
 *
 * The following example shows how cases can be nested:
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 *       <some-element *ngSwitchCase="match_expression_1">...</some-element>
 *       <some-element *ngSwitchCase="match_expression_2">...</some-element>
 *       <some-other-element *ngSwitchCase="match_expression_3">...</some-other-element>
 *       <ng-container *ngSwitchCase="match_expression_3">
 *         <!-- use a ng-container to group multiple root nodes -->
 *         <inner-element></inner-element>
 *         <inner-other-element></inner-other-element>
 *       </ng-container>
 *       <some-element *ngSwitchDefault>...</some-element>
 *     </container-element>
 * ```
 *
 * @publicApi
 * @see {@link NgSwitchCase}
 * @see {@link NgSwitchDefault}
 * @see [Structural Directives](guide/directives/structural-directives)
 *
 */
class NgSwitch {
    _defaultViews = [];
    _defaultUsed = false;
    _caseCount = 0;
    _lastCaseCheckIndex = 0;
    _lastCasesMatched = false;
    _ngSwitch;
    set ngSwitch(newValue) {
        this._ngSwitch = newValue;
        if (this._caseCount === 0) {
            this._updateDefaultCases(true);
        }
    }
    /** @internal */
    _addCase() {
        return this._caseCount++;
    }
    /** @internal */
    _addDefault(view) {
        this._defaultViews.push(view);
    }
    /** @internal */
    _matchCase(value) {
        const matched = value === this._ngSwitch;
        this._lastCasesMatched ||= matched;
        this._lastCaseCheckIndex++;
        if (this._lastCaseCheckIndex === this._caseCount) {
            this._updateDefaultCases(!this._lastCasesMatched);
            this._lastCaseCheckIndex = 0;
            this._lastCasesMatched = false;
        }
        return matched;
    }
    _updateDefaultCases(useDefault) {
        if (this._defaultViews.length > 0 && useDefault !== this._defaultUsed) {
            this._defaultUsed = useDefault;
            for (const defaultView of this._defaultViews) {
                defaultView.enforceState(useDefault);
            }
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgSwitch, deps: [], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgSwitch, isStandalone: true, selector: "[ngSwitch]", inputs: { ngSwitch: "ngSwitch" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgSwitch, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngSwitch]',
                }]
        }], propDecorators: { ngSwitch: [{
                type: Input
            }] } });
/**
 * @ngModule CommonModule
 *
 * @description
 * Provides a switch case expression to match against an enclosing `ngSwitch` expression.
 * When the expressions match, the given `NgSwitchCase` template is rendered.
 * If multiple match expressions match the switch expression value, all of them are displayed.
 *
 * @usageNotes
 *
 * Within a switch container, `*ngSwitchCase` statements specify the match expressions
 * as attributes. Include `*ngSwitchDefault` as the final case.
 *
 * ```html
 * <container-element [ngSwitch]="switch_expression">
 *   <some-element *ngSwitchCase="match_expression_1">...</some-element>
 *   ...
 *   <some-element *ngSwitchDefault>...</some-element>
 * </container-element>
 * ```
 *
 * Each switch-case statement contains an in-line HTML template or template reference
 * that defines the subtree to be selected if the value of the match expression
 * matches the value of the switch expression.
 *
 * As of Angular v17 the NgSwitch directive uses strict equality comparison (`===`) instead of
 * loose equality (`==`) to match different cases.
 *
 * @publicApi
 * @see {@link NgSwitch}
 * @see {@link NgSwitchDefault}
 *
 */
class NgSwitchCase {
    ngSwitch;
    _view;
    /**
     * Stores the HTML template to be selected on match.
     */
    ngSwitchCase;
    constructor(viewContainer, templateRef, ngSwitch) {
        this.ngSwitch = ngSwitch;
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && !ngSwitch) {
            throwNgSwitchProviderNotFoundError('ngSwitchCase', 'NgSwitchCase');
        }
        ngSwitch._addCase();
        this._view = new SwitchView(viewContainer, templateRef);
    }
    /**
     * Performs case matching. For internal use only.
     * @docs-private
     */
    ngDoCheck() {
        this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase));
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgSwitchCase, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }, { token: NgSwitch, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgSwitchCase, isStandalone: true, selector: "[ngSwitchCase]", inputs: { ngSwitchCase: "ngSwitchCase" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgSwitchCase, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngSwitchCase]',
                }]
        }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }, { type: NgSwitch, decorators: [{
                    type: Optional
                }, {
                    type: Host
                }] }], propDecorators: { ngSwitchCase: [{
                type: Input
            }] } });
/**
 * @ngModule CommonModule
 *
 * @description
 *
 * Creates a view that is rendered when no `NgSwitchCase` expressions
 * match the `NgSwitch` expression.
 * This statement should be the final case in an `NgSwitch`.
 *
 * @publicApi
 * @see {@link NgSwitch}
 * @see {@link NgSwitchCase}
 *
 */
class NgSwitchDefault {
    constructor(viewContainer, templateRef, ngSwitch) {
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && !ngSwitch) {
            throwNgSwitchProviderNotFoundError('ngSwitchDefault', 'NgSwitchDefault');
        }
        ngSwitch._addDefault(new SwitchView(viewContainer, templateRef));
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgSwitchDefault, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }, { token: NgSwitch, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgSwitchDefault, isStandalone: true, selector: "[ngSwitchDefault]", ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgSwitchDefault, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngSwitchDefault]',
                }]
        }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }, { type: NgSwitch, decorators: [{
                    type: Optional
                }, {
                    type: Host
                }] }] });
function throwNgSwitchProviderNotFoundError(attrName, directiveName) {
    throw new _RuntimeError(2000 /* RuntimeErrorCode.PARENT_NG_SWITCH_NOT_FOUND */, `An element with the "${attrName}" attribute ` +
        `(matching the "${directiveName}" directive) must be located inside an ele   ment with the "ngSwitch" attribute ` +
        `(matching "NgSwitch" directive)`);
}

/**
 * @ngModule CommonModule
 *
 * @usageNotes
 * ```html
 * <some-element [ngPlural]="value">
 *   <ng-template ngPluralCase="=0">there is nothing</ng-template>
 *   <ng-template ngPluralCase="=1">there is one</ng-template>
 *   <ng-template ngPluralCase="few">there are a few</ng-template>
 * </some-element>
 * ```
 *
 * @description
 *
 * Adds / removes DOM sub-trees based on a numeric value. Tailored for pluralization.
 *
 * Displays DOM sub-trees that match the switch expression value, or failing that, DOM sub-trees
 * that match the switch expression's pluralization category.
 *
 * To use this directive you must provide a container element that sets the `[ngPlural]` attribute
 * to a switch expression. Inner elements with a `[ngPluralCase]` will display based on their
 * expression:
 * - if `[ngPluralCase]` is set to a value starting with `=`, it will only display if the value
 *   matches the switch expression exactly,
 * - otherwise, the view will be treated as a "category match", and will only display if exact
 *   value matches aren't found and the value maps to its category for the defined locale.
 *
 * See http://cldr.unicode.org/index/cldr-spec/plural-rules
 *
 * @publicApi
 */
class NgPlural {
    _localization;
    _activeView;
    _caseViews = {};
    constructor(_localization) {
        this._localization = _localization;
    }
    set ngPlural(value) {
        this._updateView(value);
    }
    addCase(value, switchView) {
        this._caseViews[value] = switchView;
    }
    _updateView(switchValue) {
        this._clearViews();
        const cases = Object.keys(this._caseViews);
        const key = getPluralCategory(switchValue, cases, this._localization);
        this._activateView(this._caseViews[key]);
    }
    _clearViews() {
        if (this._activeView)
            this._activeView.destroy();
    }
    _activateView(view) {
        if (view) {
            this._activeView = view;
            this._activeView.create();
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgPlural, deps: [{ token: NgLocalization }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgPlural, isStandalone: true, selector: "[ngPlural]", inputs: { ngPlural: "ngPlural" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgPlural, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngPlural]',
                }]
        }], ctorParameters: () => [{ type: NgLocalization }], propDecorators: { ngPlural: [{
                type: Input
            }] } });
/**
 * @ngModule CommonModule
 *
 * @description
 *
 * Creates a view that will be added/removed from the parent {@link NgPlural} when the
 * given expression matches the plural expression according to CLDR rules.
 *
 * @usageNotes
 * ```html
 * <some-element [ngPlural]="value">
 *   <ng-template ngPluralCase="=0">...</ng-template>
 *   <ng-template ngPluralCase="other">...</ng-template>
 * </some-element>
 *```
 *
 * See {@link NgPlural} for more details and example.
 *
 * @publicApi
 */
class NgPluralCase {
    value;
    constructor(value, template, viewContainer, ngPlural) {
        this.value = value;
        const isANumber = !isNaN(Number(value));
        ngPlural.addCase(isANumber ? `=${value}` : value, new SwitchView(viewContainer, template));
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgPluralCase, deps: [{ token: 'ngPluralCase', attribute: true }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: NgPlural, host: true }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgPluralCase, isStandalone: true, selector: "[ngPluralCase]", ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgPluralCase, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngPluralCase]',
                }]
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Attribute,
                    args: ['ngPluralCase']
                }] }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: NgPlural, decorators: [{
                    type: Host
                }] }] });

/**
 * @ngModule CommonModule
 *
 * @usageNotes
 *
 * Set the width of the containing element to a pixel value returned by an expression.
 *
 * ```html
 * <some-element [ngStyle]="{'max-width.px': widthExp}">...</some-element>
 * ```
 *
 * Set a collection of style values using an expression that returns key-value pairs.
 *
 * ```html
 * <some-element [ngStyle]="objExp">...</some-element>
 * ```
 *
 * For more simple use cases you can use the [style bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly.
 * It doesn't require importing a directive.
 *
 * Set the font of the containing element to the result of an expression.
 *
 * ```html
 * <some-element [style]="{'font-style': styleExp}">...</some-element>
 * ```
 *
 * @description
 *
 * An attribute directive that updates styles for the containing HTML element.
 * Sets one or more style properties, specified as colon-separated key-value pairs.
 * The key is a style name, with an optional `.<unit>` suffix
 * (such as 'top.px', 'font-style.em').
 * The value is an expression to be evaluated.
 * The resulting non-null value, expressed in the given unit,
 * is assigned to the given style property.
 * If the result of evaluation is null, the corresponding style is removed.
 *
 * @see [Style bindings](/guide/templates/binding#css-class-and-style-property-bindings)
 *
 * @publicApi
 */
class NgStyle {
    _ngEl;
    _differs;
    _renderer;
    _ngStyle = null;
    _differ = null;
    constructor(_ngEl, _differs, _renderer) {
        this._ngEl = _ngEl;
        this._differs = _differs;
        this._renderer = _renderer;
    }
    set ngStyle(values) {
        this._ngStyle = values;
        if (!this._differ && values) {
            this._differ = this._differs.find(values).create();
        }
    }
    ngDoCheck() {
        if (this._differ) {
            const changes = this._differ.diff(this._ngStyle);
            if (changes) {
                this._applyChanges(changes);
            }
        }
    }
    _setStyle(nameAndUnit, value) {
        const [name, unit] = nameAndUnit.split('.');
        const flags = name.indexOf('-') === -1 ? undefined : RendererStyleFlags2.DashCase;
        if (value != null) {
            this._renderer.setStyle(this._ngEl.nativeElement, name, unit ? `${value}${unit}` : value, flags);
        }
        else {
            this._renderer.removeStyle(this._ngEl.nativeElement, name, flags);
        }
    }
    _applyChanges(changes) {
        changes.forEachRemovedItem((record) => this._setStyle(record.key, null));
        changes.forEachAddedItem((record) => this._setStyle(record.key, record.currentValue));
        changes.forEachChangedItem((record) => this._setStyle(record.key, record.currentValue));
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgStyle, deps: [{ token: i0.ElementRef }, { token: i0.KeyValueDiffers }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgStyle, isStandalone: true, selector: "[ngStyle]", inputs: { ngStyle: "ngStyle" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgStyle, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngStyle]',
                }]
        }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.KeyValueDiffers }, { type: i0.Renderer2 }], propDecorators: { ngStyle: [{
                type: Input,
                args: ['ngStyle']
            }] } });

/**
 * @ngModule CommonModule
 *
 * @description
 *
 * Inserts an embedded view from a prepared `TemplateRef`.
 *
 * You can attach a context object to the `EmbeddedViewRef` by setting `[ngTemplateOutletContext]`.
 * `[ngTemplateOutletContext]` should be an object, the object's keys will be available for binding
 * by the local template `let` declarations.
 *
 * @usageNotes
 * ```html
 * <ng-container *ngTemplateOutlet="templateRefExp; context: contextExp"></ng-container>
 * ```
 *
 * Using the key `$implicit` in the context object will set its value as default.
 *
 * ### Example
 *
 * {@example common/ngTemplateOutlet/ts/module.ts region='NgTemplateOutlet'}
 *
 * @publicApi
 */
class NgTemplateOutlet {
    _viewContainerRef;
    _viewRef = null;
    /**
     * A context object to attach to the {@link EmbeddedViewRef}. This should be an
     * object, the object's keys will be available for binding by the local template `let`
     * declarations.
     * Using the key `$implicit` in the context object will set its value as default.
     */
    ngTemplateOutletContext = null;
    /**
     * A string defining the template reference and optionally the context object for the template.
     */
    ngTemplateOutlet = null;
    /** Injector to be used within the embedded view. */
    ngTemplateOutletInjector = null;
    constructor(_viewContainerRef) {
        this._viewContainerRef = _viewContainerRef;
    }
    ngOnChanges(changes) {
        if (this._shouldRecreateView(changes)) {
            const viewContainerRef = this._viewContainerRef;
            if (this._viewRef) {
                viewContainerRef.remove(viewContainerRef.indexOf(this._viewRef));
            }
            // If there is no outlet, clear the destroyed view ref.
            if (!this.ngTemplateOutlet) {
                this._viewRef = null;
                return;
            }
            // Create a context forward `Proxy` that will always bind to the user-specified context,
            // without having to destroy and re-create views whenever the context changes.
            const viewContext = this._createContextForwardProxy();
            this._viewRef = viewContainerRef.createEmbeddedView(this.ngTemplateOutlet, viewContext, {
                injector: this.ngTemplateOutletInjector ?? undefined,
            });
        }
    }
    /**
     * We need to re-create existing embedded view if either is true:
     * - the outlet changed.
     * - the injector changed.
     */
    _shouldRecreateView(changes) {
        return !!changes['ngTemplateOutlet'] || !!changes['ngTemplateOutletInjector'];
    }
    /**
     * For a given outlet instance, we create a proxy object that delegates
     * to the user-specified context. This allows changing, or swapping out
     * the context object completely without having to destroy/re-create the view.
     */
    _createContextForwardProxy() {
        return new Proxy({}, {
            set: (_target, prop, newValue) => {
                if (!this.ngTemplateOutletContext) {
                    return false;
                }
                return Reflect.set(this.ngTemplateOutletContext, prop, newValue);
            },
            get: (_target, prop, receiver) => {
                if (!this.ngTemplateOutletContext) {
                    return undefined;
                }
                return Reflect.get(this.ngTemplateOutletContext, prop, receiver);
            },
        });
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgTemplateOutlet, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: NgTemplateOutlet, isStandalone: true, selector: "[ngTemplateOutlet]", inputs: { ngTemplateOutletContext: "ngTemplateOutletContext", ngTemplateOutlet: "ngTemplateOutlet", ngTemplateOutletInjector: "ngTemplateOutletInjector" }, usesOnChanges: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgTemplateOutlet, decorators: [{
            type: Directive,
            args: [{
                    selector: '[ngTemplateOutlet]',
                }]
        }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { ngTemplateOutletContext: [{
                type: Input
            }], ngTemplateOutlet: [{
                type: Input
            }], ngTemplateOutletInjector: [{
                type: Input
            }] } });

/**
 * A collection of Angular directives that are likely to be used in each and every Angular
 * application.
 */
const COMMON_DIRECTIVES = [
    NgClass,
    NgComponentOutlet,
    NgForOf,
    NgIf,
    NgTemplateOutlet,
    NgStyle,
    NgSwitch,
    NgSwitchCase,
    NgSwitchDefault,
    NgPlural,
    NgPluralCase,
];

function invalidPipeArgumentError(type, value) {
    return new _RuntimeError(2100 /* RuntimeErrorCode.INVALID_PIPE_ARGUMENT */, ngDevMode && `InvalidPipeArgument: '${value}' for pipe '${_stringify(type)}'`);
}

class SubscribableStrategy {
    createSubscription(async, updateLatestValue) {
        // Subscription can be side-effectful, and we don't want any signal reads which happen in the
        // side effect of the subscription to be tracked by a component's template when that
        // subscription is triggered via the async pipe. So we wrap the subscription in `untracked` to
        // decouple from the current reactive context.
        //
        // `untracked` also prevents signal _writes_ which happen in the subscription side effect from
        // being treated as signal writes during the template evaluation (which throws errors).
        return untracked(() => async.subscribe({
            next: updateLatestValue,
            error: (e) => {
                throw e;
            },
        }));
    }
    dispose(subscription) {
        // See the comment in `createSubscription` above on the use of `untracked`.
        untracked(() => subscription.unsubscribe());
    }
}
class PromiseStrategy {
    createSubscription(async, updateLatestValue) {
        // According to the promise specification, promises are not cancellable by default.
        // Once a promise is created, it will either resolve or reject, and it doesn't
        // provide a built-in mechanism to cancel it.
        // There may be situations where a promise is provided, and it either resolves after
        // the pipe has been destroyed or never resolves at all. If the promise never
        // resolves — potentially due to factors beyond our control, such as third-party
        // libraries — this can lead to a memory leak.
        // When we use `async.then(updateLatestValue)`, the engine captures a reference to the
        // `updateLatestValue` function. This allows the promise to invoke that function when it
        // resolves. In this case, the promise directly captures a reference to the
        // `updateLatestValue` function. If the promise resolves later, it retains a reference
        // to the original `updateLatestValue`, meaning that even if the context where
        // `updateLatestValue` was defined has been destroyed, the function reference remains in memory.
        // This can lead to memory leaks if `updateLatestValue` is no longer needed or if it holds
        // onto resources that should be released.
        // When we do `async.then(v => ...)` the promise captures a reference to the lambda
        // function (the arrow function).
        // When we assign `updateLatestValue = null` within the context of an `unsubscribe` function,
        // we're changing the reference of `updateLatestValue` in the current scope to `null`.
        // The lambda will no longer have access to it after the assignment, effectively
        // preventing any further calls to the original function and allowing it to be garbage collected.
        async.then(
        // Using optional chaining because we may have set it to `null`; since the promise
        // is async, the view might be destroyed by the time the promise resolves.
        (v) => updateLatestValue?.(v), (e) => {
            throw e;
        });
        return {
            unsubscribe: () => {
                updateLatestValue = null;
            },
        };
    }
    dispose(subscription) {
        subscription.unsubscribe();
    }
}
const _promiseStrategy = new PromiseStrategy();
const _subscribableStrategy = new SubscribableStrategy();
/**
 * @ngModule CommonModule
 * @description
 *
 * Unwraps a value from an asynchronous primitive.
 *
 * The `async` pipe subscribes to an `Observable` or `Promise` and returns the latest value it has
 * emitted. When a new value is emitted, the `async` pipe marks the component to be checked for
 * changes. When the component gets destroyed, the `async` pipe unsubscribes automatically to avoid
 * potential memory leaks. When the reference of the expression changes, the `async` pipe
 * automatically unsubscribes from the old `Observable` or `Promise` and subscribes to the new one.
 *
 * @usageNotes
 *
 * ### Examples
 *
 * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the
 * promise.
 *
 * {@example common/pipes/ts/async_pipe.ts region='AsyncPipePromise'}
 *
 * It's also possible to use `async` with Observables. The example below binds the `time` Observable
 * to the view. The Observable continuously updates the view with the current time.
 *
 * {@example common/pipes/ts/async_pipe.ts region='AsyncPipeObservable'}
 *
 * @publicApi
 */
class AsyncPipe {
    _ref;
    _latestValue = null;
    markForCheckOnValueUpdate = true;
    _subscription = null;
    _obj = null;
    _strategy = null;
    constructor(ref) {
        // Assign `ref` into `this._ref` manually instead of declaring `_ref` in the constructor
        // parameter list, as the type of `this._ref` includes `null` unlike the type of `ref`.
        this._ref = ref;
    }
    ngOnDestroy() {
        if (this._subscription) {
            this._dispose();
        }
        // Clear the `ChangeDetectorRef` and its association with the view data, to mitigate
        // potential memory leaks in Observables that could otherwise cause the view data to
        // be retained.
        // https://github.com/angular/angular/issues/17624
        this._ref = null;
    }
    transform(obj) {
        if (!this._obj) {
            if (obj) {
                try {
                    // Only call `markForCheck` if the value is updated asynchronously.
                    // Synchronous updates _during_ subscription should not wastefully mark for check -
                    // this value is already going to be returned from the transform function.
                    this.markForCheckOnValueUpdate = false;
                    this._subscribe(obj);
                }
                finally {
                    this.markForCheckOnValueUpdate = true;
                }
            }
            return this._latestValue;
        }
        if (obj !== this._obj) {
            this._dispose();
            return this.transform(obj);
        }
        return this._latestValue;
    }
    _subscribe(obj) {
        this._obj = obj;
        this._strategy = this._selectStrategy(obj);
        this._subscription = this._strategy.createSubscription(obj, (value) => this._updateLatestValue(obj, value));
    }
    _selectStrategy(obj) {
        if (_isPromise(obj)) {
            return _promiseStrategy;
        }
        if (_isSubscribable(obj)) {
            return _subscribableStrategy;
        }
        throw invalidPipeArgumentError(AsyncPipe, obj);
    }
    _dispose() {
        // Note: `dispose` is only called if a subscription has been initialized before, indicating
        // that `this._strategy` is also available.
        this._strategy.dispose(this._subscription);
        this._latestValue = null;
        this._subscription = null;
        this._obj = null;
    }
    _updateLatestValue(async, value) {
        if (async === this._obj) {
            this._latestValue = value;
            if (this.markForCheckOnValueUpdate) {
                this._ref?.markForCheck();
            }
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AsyncPipe, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: AsyncPipe, isStandalone: true, name: "async", pure: false });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AsyncPipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'async',
                    pure: false,
                }]
        }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });

/**
 * Transforms text to all lower case.
 *
 * @see {@link UpperCasePipe}
 * @see {@link TitleCasePipe}
 * @usageNotes
 *
 * The following example defines a view that allows the user to enter
 * text, and then uses the pipe to convert the input text to all lower case.
 *
 * {@example common/pipes/ts/lowerupper_pipe.ts region='LowerUpperPipe'}
 *
 * @ngModule CommonModule
 * @publicApi
 */
class LowerCasePipe {
    transform(value) {
        if (value == null)
            return null;
        if (typeof value !== 'string') {
            throw invalidPipeArgumentError(LowerCasePipe, value);
        }
        return value.toLowerCase();
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LowerCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: LowerCasePipe, isStandalone: true, name: "lowercase" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LowerCasePipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'lowercase',
                }]
        }] });
//
// Regex below matches any Unicode word and number compatible with ES5. In ES2018 the same result
// can be achieved by using /[0-9\p{L}]\S*/gu and also known as Unicode Property Escapes
// (https://2ality.com/2017/07/regexp-unicode-property-escapes.html). Since there is no
// transpilation of this functionality down to ES5 without external tool, the only solution is
// to use already transpiled form. Example can be found here -
// https://mothereff.in/regexpu#input=var+regex+%3D+%2F%5B0-9%5Cp%7BL%7D%5D%5CS*%2Fgu%3B%0A%0A&unicodePropertyEscape=1
//
const unicodeWordMatch = /(?:[0-9A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])\S*/g;
/**
 * Transforms text to title case.
 * Capitalizes the first letter of each word and transforms the
 * rest of the word to lower case.
 * Words are delimited by any whitespace character, such as a space, tab, or line-feed character.
 *
 * @see {@link LowerCasePipe}
 * @see {@link UpperCasePipe}
 *
 * @usageNotes
 * The following example shows the result of transforming various strings into title case.
 *
 * {@example common/pipes/ts/titlecase_pipe.ts region='TitleCasePipe'}
 *
 * @ngModule CommonModule
 * @publicApi
 */
class TitleCasePipe {
    transform(value) {
        if (value == null)
            return null;
        if (typeof value !== 'string') {
            throw invalidPipeArgumentError(TitleCasePipe, value);
        }
        return value.replace(unicodeWordMatch, (txt) => txt[0].toUpperCase() + txt.slice(1).toLowerCase());
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TitleCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: TitleCasePipe, isStandalone: true, name: "titlecase" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TitleCasePipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'titlecase',
                }]
        }] });
/**
 * Transforms text to all upper case.
 * @see {@link LowerCasePipe}
 * @see {@link TitleCasePipe}
 *
 * @ngModule CommonModule
 * @publicApi
 */
class UpperCasePipe {
    transform(value) {
        if (value == null)
            return null;
        if (typeof value !== 'string') {
            throw invalidPipeArgumentError(UpperCasePipe, value);
        }
        return value.toUpperCase();
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: UpperCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: UpperCasePipe, isStandalone: true, name: "uppercase" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: UpperCasePipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'uppercase',
                }]
        }] });

/**
 * The default date format of Angular date pipe, which corresponds to the following format:
 * `'MMM d,y'` (e.g. `Jun 15, 2015`)
 */
const DEFAULT_DATE_FORMAT = 'mediumDate';

/**
 * Optionally-provided default timezone to use for all instances of `DatePipe` (such as `'+0430'`).
 * If the value isn't provided, the `DatePipe` will use the end-user's local system timezone.
 *
 * @deprecated use DATE_PIPE_DEFAULT_OPTIONS token to configure DatePipe
 */
const DATE_PIPE_DEFAULT_TIMEZONE = new InjectionToken(ngDevMode ? 'DATE_PIPE_DEFAULT_TIMEZONE' : '');
/**
 * DI token that allows to provide default configuration for the `DatePipe` instances in an
 * application. The value is an object which can include the following fields:
 * - `dateFormat`: configures the default date format. If not provided, the `DatePipe`
 * will use the 'mediumDate' as a value.
 * - `timezone`: configures the default timezone. If not provided, the `DatePipe` will
 * use the end-user's local system timezone.
 *
 * @see {@link DatePipeConfig}
 *
 * @usageNotes
 *
 * Various date pipe default values can be overwritten by providing this token with
 * the value that has this interface.
 *
 * For example:
 *
 * Override the default date format by providing a value using the token:
 * ```ts
 * providers: [
 *   {provide: DATE_PIPE_DEFAULT_OPTIONS, useValue: {dateFormat: 'shortDate'}}
 * ]
 * ```
 *
 * Override the default timezone by providing a value using the token:
 * ```ts
 * providers: [
 *   {provide: DATE_PIPE_DEFAULT_OPTIONS, useValue: {timezone: '-1200'}}
 * ]
 * ```
 */
const DATE_PIPE_DEFAULT_OPTIONS = new InjectionToken(ngDevMode ? 'DATE_PIPE_DEFAULT_OPTIONS' : '');
/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a date value according to locale rules.
 *
 * `DatePipe` is executed only when it detects a pure change to the input value.
 * A pure change is either a change to a primitive input value
 * (such as `String`, `Number`, `Boolean`, or `Symbol`),
 * or a changed object reference (such as `Date`, `Array`, `Function`, or `Object`).
 *
 * Note that mutating a `Date` object does not cause the pipe to be rendered again.
 * To ensure that the pipe is executed, you must create a new `Date` object.
 *
 * Only the `en-US` locale data comes with Angular. To localize dates
 * in another language, you must import the corresponding locale data.
 * See the [I18n guide](guide/i18n/format-data-locale) for more information.
 *
 * The time zone of the formatted value can be specified either by passing it in as the second
 * parameter of the pipe, or by setting the default through the `DATE_PIPE_DEFAULT_OPTIONS`
 * injection token. The value that is passed in as the second parameter takes precedence over
 * the one defined using the injection token.
 *
 * @see {@link formatDate}
 *
 *
 * @usageNotes
 *
 * The result of this pipe is not reevaluated when the input is mutated. To avoid the need to
 * reformat the date on every change-detection cycle, treat the date as an immutable object
 * and change the reference when the pipe needs to run again.
 *
 * ### Pre-defined format options
 *
 * | Option        | Equivalent to                       | Examples (given in `en-US` locale)              |
 * |---------------|-------------------------------------|-------------------------------------------------|
 * | `'short'`     | `'M/d/yy, h:mm a'`                  | `6/15/15, 9:03 AM`                              |
 * | `'medium'`    | `'MMM d, y, h:mm:ss a'`             | `Jun 15, 2015, 9:03:01 AM`                      |
 * | `'long'`      | `'MMMM d, y, h:mm:ss a z'`          | `June 15, 2015 at 9:03:01 AM GMT+1`             |
 * | `'full'`      | `'EEEE, MMMM d, y, h:mm:ss a zzzz'` | `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00` |
 * | `'shortDate'` | `'M/d/yy'`                          | `6/15/15`                                       |
 * | `'mediumDate'`| `'MMM d, y'`                        | `Jun 15, 2015`                                  |
 * | `'longDate'`  | `'MMMM d, y'`                       | `June 15, 2015`                                 |
 * | `'fullDate'`  | `'EEEE, MMMM d, y'`                 | `Monday, June 15, 2015`                         |
 * | `'shortTime'` | `'h:mm a'`                          | `9:03 AM`                                       |
 * | `'mediumTime'`| `'h:mm:ss a'`                       | `9:03:01 AM`                                    |
 * | `'longTime'`  | `'h:mm:ss a z'`                     | `9:03:01 AM GMT+1`                              |
 * | `'fullTime'`  | `'h:mm:ss a zzzz'`                  | `9:03:01 AM GMT+01:00`                          |
 *
 * ### Custom format options
 *
 * You can construct a format string using symbols to specify the components
 * of a date-time value, as described in the following table.
 * Format details depend on the locale.
 * Fields marked with (*) are only available in the extra data set for the given locale.
 *
 *  | Field type              | Format      | Description                                                   | Example Value                                              |
 *  |-------------------------|-------------|---------------------------------------------------------------|------------------------------------------------------------|
 *  | Era                     | G, GG & GGG | Abbreviated                                                   | AD                                                         |
 *  |                         | GGGG        | Wide                                                          | Anno Domini                                                |
 *  |                         | GGGGG       | Narrow                                                        | A                                                          |
 *  | Year                    | y           | Numeric: minimum digits                                       | 2, 20, 201, 2017, 20173                                    |
 *  |                         | yy          | Numeric: 2 digits + zero padded                               | 02, 20, 01, 17, 73                                         |
 *  |                         | yyy         | Numeric: 3 digits + zero padded                               | 002, 020, 201, 2017, 20173                                 |
 *  |                         | yyyy        | Numeric: 4 digits or more + zero padded                       | 0002, 0020, 0201, 2017, 20173                              |
 *  | ISO Week-numbering year | Y           | Numeric: minimum digits                                       | 2, 20, 201, 2017, 20173                                    |
 *  |                         | YY          | Numeric: 2 digits + zero padded                               | 02, 20, 01, 17, 73                                         |
 *  |                         | YYY         | Numeric: 3 digits + zero padded                               | 002, 020, 201, 2017, 20173                                 |
 *  |                         | YYYY        | Numeric: 4 digits or more + zero padded                       | 0002, 0020, 0201, 2017, 20173                              |
 *  | Month                   | M           | Numeric: 1 digit                                              | 9, 12                                                      |
 *  |                         | MM          | Numeric: 2 digits + zero padded                               | 09, 12                                                     |
 *  |                         | MMM         | Abbreviated                                                   | Sep                                                        |
 *  |                         | MMMM        | Wide                                                          | September                                                  |
 *  |                         | MMMMM       | Narrow                                                        | S                                                          |
 *  | Month standalone        | L           | Numeric: 1 digit                                              | 9, 12                                                      |
 *  |                         | LL          | Numeric: 2 digits + zero padded                               | 09, 12                                                     |
 *  |                         | LLL         | Abbreviated                                                   | Sep                                                        |
 *  |                         | LLLL        | Wide                                                          | September                                                  |
 *  |                         | LLLLL       | Narrow                                                        | S                                                          |
 *  | ISO Week of year        | w           | Numeric: minimum digits                                       | 1... 53                                                    |
 *  |                         | ww          | Numeric: 2 digits + zero padded                               | 01... 53                                                   |
 *  | Week of month           | W           | Numeric: 1 digit                                              | 1... 5                                                     |
 *  | Day of month            | d           | Numeric: minimum digits                                       | 1                                                          |
 *  |                         | dd          | Numeric: 2 digits + zero padded                               | 01                                                         |
 *  | Week day                | E, EE & EEE | Abbreviated                                                   | Tue                                                        |
 *  |                         | EEEE        | Wide                                                          | Tuesday                                                    |
 *  |                         | EEEEE       | Narrow                                                        | T                                                          |
 *  |                         | EEEEEE      | Short                                                         | Tu                                                         |
 *  | Week day standalone     | c, cc       | Numeric: 1 digit                                              | 2                                                          |
 *  |                         | ccc         | Abbreviated                                                   | Tue                                                        |
 *  |                         | cccc        | Wide                                                          | Tuesday                                                    |
 *  |                         | ccccc       | Narrow                                                        | T                                                          |
 *  |                         | cccccc      | Short                                                         | Tu                                                         |
 *  | Period                  | a, aa & aaa | Abbreviated                                                   | am/pm or AM/PM                                             |
 *  |                         | aaaa        | Wide (fallback to `a` when missing)                           | ante meridiem/post meridiem                                |
 *  |                         | aaaaa       | Narrow                                                        | a/p                                                        |
 *  | Period*                 | B, BB & BBB | Abbreviated                                                   | mid.                                                       |
 *  |                         | BBBB        | Wide                                                          | am, pm, midnight, noon, morning, afternoon, evening, night |
 *  |                         | BBBBB       | Narrow                                                        | md                                                         |
 *  | Period standalone*      | b, bb & bbb | Abbreviated                                                   | mid.                                                       |
 *  |                         | bbbb        | Wide                                                          | am, pm, midnight, noon, morning, afternoon, evening, night |
 *  |                         | bbbbb       | Narrow                                                        | md                                                         |
 *  | Hour 1-12               | h           | Numeric: minimum digits                                       | 1, 12                                                      |
 *  |                         | hh          | Numeric: 2 digits + zero padded                               | 01, 12                                                     |
 *  | Hour 0-23               | H           | Numeric: minimum digits                                       | 0, 23                                                      |
 *  |                         | HH          | Numeric: 2 digits + zero padded                               | 00, 23                                                     |
 *  | Minute                  | m           | Numeric: minimum digits                                       | 8, 59                                                      |
 *  |                         | mm          | Numeric: 2 digits + zero padded                               | 08, 59                                                     |
 *  | Second                  | s           | Numeric: minimum digits                                       | 0... 59                                                    |
 *  |                         | ss          | Numeric: 2 digits + zero padded                               | 00... 59                                                   |
 *  | Fractional seconds      | S           | Numeric: 1 digit                                              | 0... 9                                                     |
 *  |                         | SS          | Numeric: 2 digits + zero padded                               | 00... 99                                                   |
 *  |                         | SSS         | Numeric: 3 digits + zero padded (= milliseconds)              | 000... 999                                                 |
 *  | Zone                    | z, zz & zzz | Short specific non location format (fallback to O)            | GMT-8                                                      |
 *  |                         | zzzz        | Long specific non location format (fallback to OOOO)          | GMT-08:00                                                  |
 *  |                         | Z, ZZ & ZZZ | ISO8601 basic format                                          | -0800                                                      |
 *  |                         | ZZZZ        | Long localized GMT format                                     | GMT-8:00                                                   |
 *  |                         | ZZZZZ       | ISO8601 extended format + Z indicator for offset 0 (= XXXXX)  | -08:00                                                     |
 *  |                         | O, OO & OOO | Short localized GMT format                                    | GMT-8                                                      |
 *  |                         | OOOO        | Long localized GMT format                                     | GMT-08:00                                                  |
 *
 *
 * ### Format examples
 *
 * These examples transform a date into various formats,
 * assuming that `dateObj` is a JavaScript `Date` object for
 * year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11,
 * given in the local time for the `en-US` locale.
 *
 * ```
 * {{ dateObj | date }}               // output is 'Jun 15, 2015'
 * {{ dateObj | date:'medium' }}      // output is 'Jun 15, 2015, 9:43:11 PM'
 * {{ dateObj | date:'shortTime' }}   // output is '9:43 PM'
 * {{ dateObj | date:'mm:ss' }}       // output is '43:11'
 * {{ dateObj | date:"MMM dd, yyyy 'at' hh:mm a" }}  // output is 'Jun 15, 2015 at 09:43 PM'
 * ```
 *
 * ### Usage example
 *
 * The following component uses a date pipe to display the current date in different formats.
 *
 * ```angular-ts
 * @Component({
 *  selector: 'date-pipe',
 *  template: `<div>
 *    <p>Today is {{today | date}}</p>
 *    <p>Or if you prefer, {{today | date:'fullDate'}}</p>
 *    <p>The time is {{today | date:'h:mm a z'}}</p>
 *  </div>`
 * })
 * // Get the current date and time as a date-time value.
 * export class DatePipeComponent {
 *   today: number = Date.now();
 * }
 * ```
 *
 * @publicApi
 */
class DatePipe {
    locale;
    defaultTimezone;
    defaultOptions;
    constructor(locale, defaultTimezone, defaultOptions) {
        this.locale = locale;
        this.defaultTimezone = defaultTimezone;
        this.defaultOptions = defaultOptions;
    }
    transform(value, format, timezone, locale) {
        if (value == null || value === '' || value !== value)
            return null;
        try {
            const _format = format ?? this.defaultOptions?.dateFormat ?? DEFAULT_DATE_FORMAT;
            const _timezone = timezone ?? this.defaultOptions?.timezone ?? this.defaultTimezone ?? undefined;
            return formatDate(value, _format, locale || this.locale, _timezone);
        }
        catch (error) {
            throw invalidPipeArgumentError(DatePipe, error.message);
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DatePipe, deps: [{ token: LOCALE_ID }, { token: DATE_PIPE_DEFAULT_TIMEZONE, optional: true }, { token: DATE_PIPE_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: DatePipe, isStandalone: true, name: "date" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DatePipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'date',
                }]
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Inject,
                    args: [LOCALE_ID]
                }] }, { type: undefined, decorators: [{
                    type: Inject,
                    args: [DATE_PIPE_DEFAULT_TIMEZONE]
                }, {
                    type: Optional
                }] }, { type: undefined, decorators: [{
                    type: Inject,
                    args: [DATE_PIPE_DEFAULT_OPTIONS]
                }, {
                    type: Optional
                }] }] });

const _INTERPOLATION_REGEXP = /#/g;
/**
 * @ngModule CommonModule
 * @description
 *
 * Maps a value to a string that pluralizes the value according to locale rules.
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example common/pipes/ts/i18n_pipe.ts region='I18nPluralPipeComponent'}
 *
 * @publicApi
 */
class I18nPluralPipe {
    _localization;
    constructor(_localization) {
        this._localization = _localization;
    }
    /**
     * @param value the number to be formatted
     * @param pluralMap an object that mimics the ICU format, see
     * https://unicode-org.github.io/icu/userguide/format_parse/messages/.
     * @param locale a `string` defining the locale to use (uses the current {@link LOCALE_ID} by
     * default).
     */
    transform(value, pluralMap, locale) {
        if (value == null)
            return '';
        if (typeof pluralMap !== 'object' || pluralMap === null) {
            throw invalidPipeArgumentError(I18nPluralPipe, pluralMap);
        }
        const key = getPluralCategory(value, Object.keys(pluralMap), this._localization, locale);
        return pluralMap[key].replace(_INTERPOLATION_REGEXP, value.toString());
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: I18nPluralPipe, deps: [{ token: NgLocalization }], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: I18nPluralPipe, isStandalone: true, name: "i18nPlural" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: I18nPluralPipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'i18nPlural',
                }]
        }], ctorParameters: () => [{ type: NgLocalization }] });

/**
 * @ngModule CommonModule
 * @description
 *
 * Generic selector that displays the string that matches the current value.
 *
 * If none of the keys of the `mapping` match the `value`, then the content
 * of the `other` key is returned when present, otherwise an empty string is returned.
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example common/pipes/ts/i18n_pipe.ts region='I18nSelectPipeComponent'}
 *
 * @publicApi
 */
class I18nSelectPipe {
    /**
     * @param value a string to be internationalized.
     * @param mapping an object that indicates the text that should be displayed
     * for different values of the provided `value`.
     */
    transform(value, mapping) {
        if (value == null)
            return '';
        if (typeof mapping !== 'object' || typeof value !== 'string') {
            throw invalidPipeArgumentError(I18nSelectPipe, mapping);
        }
        if (mapping.hasOwnProperty(value)) {
            return mapping[value];
        }
        if (mapping.hasOwnProperty('other')) {
            return mapping['other'];
        }
        return '';
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: I18nSelectPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: I18nSelectPipe, isStandalone: true, name: "i18nSelect" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: I18nSelectPipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'i18nSelect',
                }]
        }] });

/**
 * @ngModule CommonModule
 * @description
 *
 * Converts a value into its JSON-format representation.  Useful for debugging.
 *
 * @usageNotes
 *
 * The following component uses a JSON pipe to convert an object
 * to JSON format, and displays the string in both formats for comparison.
 *
 * {@example common/pipes/ts/json_pipe.ts region='JsonPipe'}
 *
 * @publicApi
 */
class JsonPipe {
    /**
     * @param value A value of any type to convert into a JSON-format string.
     */
    transform(value) {
        return JSON.stringify(value, null, 2);
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: JsonPipe, isStandalone: true, name: "json", pure: false });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonPipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'json',
                    pure: false,
                }]
        }] });

function makeKeyValuePair(key, value) {
    return { key: key, value: value };
}
/**
 * @ngModule CommonModule
 * @description
 *
 * Transforms Object or Map into an array of key value pairs.
 *
 * The output array will be ordered by keys.
 * By default the comparator will be by Unicode point value.
 * You can optionally pass a compareFn if your keys are complex types.
 * Passing `null` as the compareFn will use natural ordering of the input.
 *
 * @usageNotes
 * ### Examples
 *
 * This examples show how an Object or a Map can be iterated by ngFor with the use of this
 * keyvalue pipe.
 *
 * {@example common/pipes/ts/keyvalue_pipe.ts region='KeyValuePipe'}
 *
 * @publicApi
 */
class KeyValuePipe {
    differs;
    constructor(differs) {
        this.differs = differs;
    }
    differ;
    keyValues = [];
    compareFn = defaultComparator;
    transform(input, compareFn = defaultComparator) {
        if (!input || (!(input instanceof Map) && typeof input !== 'object')) {
            return null;
        }
        // make a differ for whatever type we've been passed in
        this.differ ??= this.differs.find(input).create();
        const differChanges = this.differ.diff(input);
        const compareFnChanged = compareFn !== this.compareFn;
        if (differChanges) {
            this.keyValues = [];
            differChanges.forEachItem((r) => {
                this.keyValues.push(makeKeyValuePair(r.key, r.currentValue));
            });
        }
        if (differChanges || compareFnChanged) {
            if (compareFn) {
                this.keyValues.sort(compareFn);
            }
            this.compareFn = compareFn;
        }
        return this.keyValues;
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: KeyValuePipe, deps: [{ token: i0.KeyValueDiffers }], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: KeyValuePipe, isStandalone: true, name: "keyvalue", pure: false });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: KeyValuePipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'keyvalue',
                    pure: false,
                }]
        }], ctorParameters: () => [{ type: i0.KeyValueDiffers }] });
function defaultComparator(keyValueA, keyValueB) {
    const a = keyValueA.key;
    const b = keyValueB.key;
    // If both keys are the same, return 0 (no sorting needed).
    if (a === b)
        return 0;
    // If one of the keys is `null` or `undefined`, place it at the end of the sort.
    if (a == null)
        return 1; // `a` comes after `b`.
    if (b == null)
        return -1; // `b` comes after `a`.
    // If both keys are strings, compare them lexicographically.
    if (typeof a == 'string' && typeof b == 'string') {
        return a < b ? -1 : 1;
    }
    // If both keys are numbers, sort them numerically.
    if (typeof a == 'number' && typeof b == 'number') {
        return a - b;
    }
    // If both keys are booleans, sort `false` before `true`.
    if (typeof a == 'boolean' && typeof b == 'boolean') {
        return a < b ? -1 : 1;
    }
    // Fallback case: if keys are of different types, compare their string representations.
    const aString = String(a);
    const bString = String(b);
    // Compare the string representations lexicographically.
    return aString == bString ? 0 : aString < bString ? -1 : 1;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a value according to digit options and locale rules.
 * Locale determines group sizing and separator,
 * decimal point character, and other locale-specific configurations.
 *
 * @see {@link formatNumber}
 *
 * @usageNotes
 *
 * ### digitsInfo
 *
 * The value's decimal representation is specified by the `digitsInfo`
 * parameter, written in the following format:<br>
 *
 * ```
 * {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}
 * ```
 *
 *  - `minIntegerDigits`:
 * The minimum number of integer digits before the decimal point.
 * Default is 1.
 *
 * - `minFractionDigits`:
 * The minimum number of digits after the decimal point.
 * Default is 0.
 *
 *  - `maxFractionDigits`:
 * The maximum number of digits after the decimal point.
 * Default is 3.
 *
 * If the formatted value is truncated it will be rounded using the "to-nearest" method:
 *
 * ```
 * {{3.6 | number: '1.0-0'}}
 * <!--will output '4'-->
 *
 * {{-3.6 | number:'1.0-0'}}
 * <!--will output '-4'-->
 * ```
 *
 * ### locale
 *
 * `locale` will format a value according to locale rules.
 * Locale determines group sizing and separator,
 * decimal point character, and other locale-specific configurations.
 *
 * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.
 *
 * See [Setting your app locale](guide/i18n/locale-id).
 *
 * ### Example
 *
 * The following code shows how the pipe transforms values
 * according to various format specifications,
 * where the caller's default locale is `en-US`.
 *
 * {@example common/pipes/ts/number_pipe.ts region='NumberPipe'}
 *
 * @publicApi
 */
class DecimalPipe {
    _locale;
    constructor(_locale) {
        this._locale = _locale;
    }
    transform(value, digitsInfo, locale) {
        if (!isValue(value))
            return null;
        locale ||= this._locale;
        try {
            const num = strToNumber(value);
            return formatNumber(num, locale, digitsInfo);
        }
        catch (error) {
            throw invalidPipeArgumentError(DecimalPipe, error.message);
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecimalPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: DecimalPipe, isStandalone: true, name: "number" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecimalPipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'number',
                }]
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Inject,
                    args: [LOCALE_ID]
                }] }] });
/**
 * @ngModule CommonModule
 * @description
 *
 * Transforms a number to a percentage
 * string, formatted according to locale rules that determine group sizing and
 * separator, decimal-point character, and other locale-specific
 * configurations.
 *
 * @see {@link formatPercent}
 *
 * @usageNotes
 * The following code shows how the pipe transforms numbers
 * into text strings, according to various format specifications,
 * where the caller's default locale is `en-US`.
 *
 * {@example common/pipes/ts/percent_pipe.ts region='PercentPipe'}
 *
 * @publicApi
 */
class PercentPipe {
    _locale;
    constructor(_locale) {
        this._locale = _locale;
    }
    /**
     *
     * @param value The number to be formatted as a percentage.
     * @param digitsInfo Decimal representation options, specified by a string
     * in the following format:<br>
     * <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>.
     *   - `minIntegerDigits`: The minimum number of integer digits before the decimal point.
     * Default is `1`.
     *   - `minFractionDigits`: The minimum number of digits after the decimal point.
     * Default is `0`.
     *   - `maxFractionDigits`: The maximum number of digits after the decimal point.
     * Default is `0`.
     * @param locale A locale code for the locale format rules to use.
     * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.
     * See [Setting your app locale](guide/i18n/locale-id).
     */
    transform(value, digitsInfo, locale) {
        if (!isValue(value))
            return null;
        locale ||= this._locale;
        try {
            const num = strToNumber(value);
            return formatPercent(num, locale, digitsInfo);
        }
        catch (error) {
            throw invalidPipeArgumentError(PercentPipe, error.message);
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version:"$ "19.2.14", ngImport: i0, type: PercentPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: PercentPipe, isStandalone: true, name: "percent" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PercentPipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'percent',
                }]
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Inject,
                    args: [LOCALE_ID]
                }] }] });
/**
 * @ngModule CommonModule
 * @description
 *
 * Transforms a number to a currency string, formatted according to locale rules
 * that determine group sizing and separator, decimal-point character,
 * and other locale-specific configurations.
 *
 *
 * @see {@link getCurrencySymbol}
 * @see {@link formatCurrency}
 *
 * @usageNotes
 * The following code shows how the pipe transforms numbers
 * into text strings, according to various format specifications,
 * where the caller's default locale is `en-US`.
 *
 * {@example common/pipes/ts/currency_pipe.ts region='CurrencyPipe'}
 *
 * @publicApi
 */
class CurrencyPipe {
    _locale;
    _defaultCurrencyCode;
    constructor(_locale, _defaultCurrencyCode = 'USD') {
        this._locale = _locale;
        this._defaultCurrencyCode = _defaultCurrencyCode;
    }
    transform(value, currencyCode = this._defaultCurrencyCode, display = 'symbol', digitsInfo, locale) {
        if (!isValue(value))
            return null;
        locale ||= this._locale;
        if (typeof display === 'boolean') {
            if ((typeof ngDevMode === 'undefined' || ngDevMode) && console && console.warn) {
                console.warn(`Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".`);
            }
            display = display ? 'symbol' : 'code';
        }
        let currency = currencyCode || this._defaultCurrencyCode;
        if (display !== 'code') {
            if (display === 'symbol' || display === 'symbol-narrow') {
                currency = getCurrencySymbol(currency, display === 'symbol' ? 'wide' : 'narrow', locale);
            }
            else {
                currency = display;
            }
        }
        try {
            const num = strToNumber(value);
            return formatCurrency(num, locale, currency, currencyCode, digitsInfo);
        }
        catch (error) {
            throw invalidPipeArgumentError(CurrencyPipe, error.message);
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CurrencyPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: CurrencyPipe, isStandalone: true, name: "currency" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CurrencyPipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'currency',
                }]
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Inject,
                    args: [LOCALE_ID]
                }] }, { type: undefined, decorators: [{
                    type: Inject,
                    args: [DEFAULT_CURRENCY_CODE]
                }] }] });
function isValue(value) {
    return !(value == null || value === '' || value !== value);
}
/**
 * Transforms a string into a number (if needed).
 */
function strToNumber(value) {
    // Convert strings to numbers
    if (typeof value === 'string' && !isNaN(Number(value) - parseFloat(value))) {
        return Number(value);
    }
    if (typeof value !== 'number') {
        throw new Error(`${value} is not a number`);
    }
    return value;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Creates a new `Array` or `String` containing a subset (slice) of the elements.
 *
 * @usageNotes
 *
 * All behavior is based on the expected behavior of the JavaScript API `Array.prototype.slice()`
 * and `String.prototype.slice()`.
 *
 * When operating on an `Array`, the returned `Array` is always a copy even when all
 * the elements are being returned.
 *
 * When operating on a blank value, the pipe returns the blank value.
 *
 * ### List Example
 *
 * This `ngFor` example:
 *
 * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_list'}
 *
 * produces the following:
 *
 * ```html
 * <li>b</li>
 * <li>c</li>
 * ```
 *
 * ### String Examples
 *
 * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_string'}
 *
 * @publicApi
 */
class SlicePipe {
    transform(value, start, end) {
        if (value == null)
            return null;
        const supports = typeof value === 'string' || Array.isArray(value);
        if (!supports) {
            throw invalidPipeArgumentError(SlicePipe, value);
        }
        return value.slice(start, end);
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SlicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
    static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: SlicePipe, isStandalone: true, name: "slice", pure: false });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SlicePipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'slice',
                    pure: false,
                }]
        }] });

/**
 * @module
 * @description
 * This module provides a set of common Pipes.
 */
/**
 * A collection of Angular pipes that are likely to be used in each and every application.
 */
const COMMON_PIPES = [
    AsyncPipe,
    UpperCasePipe,
    LowerCasePipe,
    JsonPipe,
    SlicePipe,
    DecimalPipe,
    PercentPipe,
    TitleCasePipe,
    CurrencyPipe,
    DatePipe,
    I18nPluralPipe,
    I18nSelectPipe,
    KeyValuePipe,
];

// Note: This does not contain the location providers,
// as they need some platform specific implementations to work.
/**
 * Exports all the basic Angular directives and pipes,
 * such as `NgIf`, `NgForOf`, `DecimalPipe`, and so on.
 * Re-exported by `BrowserModule`, which is included automatically in the root
 * `AppModule` when you create a new app with the CLI `new` command.
 *
 * @publicApi
 */
class CommonModule {
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
    static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: CommonModule, imports: [NgClass, NgComponentOutlet, NgForOf, NgIf, NgTemplateOutlet, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgPlural, NgPluralCase, AsyncPipe, UpperCasePipe, LowerCasePipe, JsonPipe, SlicePipe, DecimalPipe, PercentPipe, TitleCasePipe, CurrencyPipe, DatePipe, I18nPluralPipe, I18nSelectPipe, KeyValuePipe], exports: [NgClass, NgComponentOutlet, NgForOf, NgIf, NgTemplateOutlet, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgPlural, NgPluralCase, AsyncPipe, UpperCasePipe, LowerCasePipe, JsonPipe, SlicePipe, DecimalPipe, PercentPipe, TitleCasePipe, CurrencyPipe, DatePipe, I18nPluralPipe, I18nSelectPipe, KeyValuePipe] });
    static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CommonModule });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CommonModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [COMMON_DIRECTIVES, COMMON_PIPES],
                    exports: [COMMON_DIRECTIVES, COMMON_PIPES],
                }]
        }] });

export { AsyncPipe, CommonModule, CurrencyPipe, DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe, DecimalPipe, FormStyle, FormatWidth, HashLocationStrategy, I18nPluralPipe, I18nSelectPipe, JsonPipe, KeyValuePipe, LowerCasePipe, NgClass, NgComponentOutlet, NgForOf, NgForOfContext, NgIf, NgIfContext, NgLocaleLocalization, NgLocalization, NgPlural, NgPluralCase, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet, NumberFormatStyle, NumberSymbol, PercentPipe, Plural, SlicePipe, TitleCasePipe, TranslationWidth, UpperCasePipe, WeekDay, formatCurrency, formatDate, formatNumber, formatPercent, getCurrencySymbol, getLocaleCurrencyCode, getLocaleCurrencyName, getLocaleCurrencySymbol, getLocaleDateFormat, getLocaleDateTimeFormat, getLocaleDayNames, getLocaleDayPeriods, getLocaleDirection, getLocaleEraNames, getLocaleExtraDayPeriodRules, getLocaleExtraDayPeriods, getLocaleFirstDayOfWeek, getLocaleId, getLocaleMonthNames, getLocaleNumberFormat, getLocaleNumberSymbol, getLocalePluralCase, getLocaleTimeFormat, getLocaleWeekEndRange, getNumberOfCurrencyDigits };
//# sourceMappingURL=common_module-Dx7dWex5.mjs.map
8ɔx   {"version":3,"file":"common_module-Dx7dWex5.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/location/hash_location_strategy.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/i18n/currencies.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/i18n/locale_data_api.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/i18n/format_date.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/i18n/format_number.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/i18n/localization.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_class.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_component_outlet.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_for_of.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_if.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_switch.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_plural.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_style.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/ng_template_outlet.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/directives/index.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/invalid_pipe_argument_error.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/async_pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/case_conversion_pipes.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/date_pipe_config.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/date_pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/i18n_plural_pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/i18n_select_pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/json_pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/keyvalue_pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/number_pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/slice_pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/pipes/index.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/common_module.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Inject, Injectable, OnDestroy, Optional} from '@angular/core';\n\nimport {APP_BASE_HREF, LocationStrategy} from './location_strategy';\nimport {LocationChangeListener, PlatformLocation} from './platform_location';\nimport {joinWithSlash, normalizeQueryParams} from './util';\n\n/**\n * @description\n * A {@link LocationStrategy} used to configure the {@link Location} service to\n * represent its state in the\n * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)\n * of the browser's URL.\n *\n * For instance, if you call `location.go('/foo')`, the browser's URL will become\n * `example.com#/foo`.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/location/ts/hash_location_component.ts region='LocationComponent'}\n *\n * @publicApi\n */\n@Injectable()\nexport class HashLocationStrategy extends LocationStrategy implements OnDestroy {\n  private _baseHref: string = '';\n  private _removeListenerFns: (() => void)[] = [];\n\n  constructor(\n    private _platformLocation: PlatformLocation,\n    @Optional() @Inject(APP_BASE_HREF) _baseHref?: string,\n  ) {\n    super();\n    if (_baseHref != null) {\n      this._baseHref = _baseHref;\n    }\n  }\n\n  /** @docs-private */\n  ngOnDestroy(): void {\n    while (this._removeListenerFns.length) {\n      this._removeListenerFns.pop()!();\n    }\n  }\n\n  override onPopState(fn: LocationChangeListener): void {\n    this._removeListenerFns.push(\n      this._platformLocation.onPopState(fn),\n      this._platformLocation.onHashChange(fn),\n    );\n  }\n\n  override getBaseHref(): string {\n    return this._baseHref;\n  }\n\n  override path(includeHash: boolean = false): string {\n    // the hash value is always prefixed with a `#`\n    // and if it is empty then it will stay empty\n    const path = this._platformLocation.hash ?? '#';\n\n    return path.length > 0 ? path.substring(1) : path;\n  }\n\n  override prepareExternalUrl(internal: string): string {\n    const url = joinWithSlash(this._baseHref, internal);\n    return url.length > 0 ? '#' + url : url;\n  }\n\n  override pushState(state: any, title: string, path: string, queryParams: string) {\n    const url =\n      this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) ||\n      this._platformLocation.pathname;\n    this._platformLocation.pushState(state, title, url);\n  }\n\n  override replaceState(state: any, title: string, path: string, queryParams: string) {\n    const url =\n      this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) ||\n      this._platformLocation.pathname;\n    this._platformLocation.replaceState(state, title, url);\n  }\n\n  override forward(): void {\n    this._platformLocation.forward();\n  }\n\n  override back(): void {\n    this._platformLocation.back();\n  }\n\n  override getState(): unknown {\n    return this._platformLocation.getState();\n  }\n\n  override historyGo(relativePosition: number = 0): void {\n    this._platformLocation.historyGo?.(relativePosition);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nexport type CurrenciesSymbols = [string] | [string | undefined, string];\n\n/** @internal */\nexport const CURRENCIES_EN: {[code: string]: CurrenciesSymbols | [string | undefined, string | undefined, number]} = {\"ADP\":[undefined,undefined,0],\"AFN\":[undefined,\"؋\",0],\"ALL\":[undefined,undefined,0],\"AMD\":[undefined,\"֏\",2],\"AOA\":[undefined,\"Kz\"],\"ARS\":[undefined,\"$\"],\"AUD\":[\"A$\",\"$\"],\"AZN\":[undefined,\"₼\"],\"BAM\":[undefined,\"KM\"],\"BBD\":[undefined,\"$\"],\"BDT\":[undefined,\"৳\"],\"BHD\":[undefined,undefined,3],\"BIF\":[undefined,undefined,0],\"BMD\":[undefined,\"$\"],\"BND\":[undefined,\"$\"],\"BOB\":[undefined,\"Bs\"],\"BRL\":[\"R$\"],\"BSD\":[undefined,\"$\"],\"BWP\":[undefined,\"P\"],\"BYN\":[undefined,undefined,2],\"BYR\":[undefined,undefined,0],\"BZD\":[undefined,\"$\"],\"CAD\":[\"CA$\",\"$\",2],\"CHF\":[undefined,undefined,2],\"CLF\":[undefined,undefined,4],\"CLP\":[undefined,\"$\",0],\"CNY\":[\"CN¥\",\"¥\"],\"COP\":[undefined,\"$\",2],\"CRC\":[undefined,\"₡\",2],\"CUC\":[undefined,\"$\"],\"CUP\":[undefined,\"$\"],\"CZK\":[undefined,\"Kč\",2],\"DJF\":[undefined,undefined,0],\"DKK\":[undefined,\"kr\",2],\"DOP\":[undefined,\"$\"],\"EGP\":[undefined,\"E£\"],\"ESP\":[undefined,\"₧\",0],\"EUR\":[\"€\"],\"FJD\":[undefined,\"$\"],\"FKP\":[undefined,\"£\"],\"GBP\":[\"£\"],\"GEL\":[undefined,\"₾\"],\"GHS\":[undefined,\"GH₵\"],\"GIP\":[undefined,\"£\"],\"GNF\":[undefined,\"FG\",0],\"GTQ\":[undefined,\"Q\"],\"GYD\":[undefined,\"$\",2],\"HKD\":[\"HK$\",\"$\"],\"HNL\":[undefined,\"L\"],\"HRK\":[undefined,\"kn\"],\"HUF\":[undefined,\"Ft\",2],\"IDR\":[undefined,\"Rp\",2],\"ILS\":[\"₪\"],\"INR\":[\"₹\"],\"IQD\":[undefined,undefined,0],\"IRR\":[undefined,undefined,0],\"ISK\":[undefined,\"kr\",0],\"ITL\":[undefined,undefined,0],\"JMD\":[undefined,\"$\"],\"JOD\":[undefined,undefined,3],\"JPY\":[\"¥\",undefined,0],\"KHR\":[undefined,\"៛\"],\"KMF\":[undefined,\"CF\",0],\"KPW\":[undefined,\"₩\",0],\"KRW\":[\"₩\",undefined,0],\"KWD\":[undefined,undefined,3],\"KYD\":[undefined,\"$\"],\"KZT\":[undefined,\"₸\"],\"LAK\":[undefined,\"₭\",0],\"LBP\":[undefined,\"L£\",0],\"LKR\":[undefined,\"Rs\"],\"LRD\":[undefined,\"$\"],\"LTL\":[undefined,\"Lt\"],\"LUF\":[undefined,undefined,0],\"LVL\":[undefined,\"Ls\"],\"LYD\":[undefined,undefined,3],\"MGA\":[undefined,\"Ar\",0],\"MGF\":[undefined,undefined,0],\"MMK\":[undefined,\"K\",0],\"MNT\":[undefined,\"₮\",2],\"MRO\":[undefined,undefined,0],\"MUR\":[undefined,\"Rs\",2],\"MXN\":[\"MX$\",\"$\"],\"MYR\":[undefined,\"RM\"],\"NAD\":[undefined,\"$\"],\"NGN\":[undefined,\"₦\"],\"NIO\":[undefined,\"C$\"],\"NOK\":[undefined,\"kr\",2],\"NPR\":[undefined,\"Rs\"],\"NZD\":[\"NZ$\",\"$\"],\"OMR\":[undefined,undefined,3],\"PHP\":[\"₱\"],\"PKR\":[undefined,\"Rs\",2],\"PLN\":[undefined,\"zł\"],\"PYG\":[undefined,\"₲\",0],\"RON\":[undefined,\"lei\"],\"RSD\":[undefined,undefined,0],\"RUB\":[undefined,\"₽\"],\"RWF\":[undefined,\"RF\",0],\"SBD\":[undefined,\"$\"],\"SEK\":[undefined,\"kr\",2],\"SGD\":[undefined,\"$\"],\"SHP\":[undefined,\"£\"],\"SLE\":[undefined,undefined,2],\"SLL\":[undefined,undefined,0],\"SOS\":[undefined,undefined,0],\"SRD\":[undefined,\"$\"],\"SSP\":[undefined,\"£\"],\"STD\":[undefined,undefined,0],\"STN\":[undefined,\"Db\"],\"SYP\":[undefined,\"£\",0],\"THB\":[undefined,\"฿\"],\"TMM\":[undefined,undefined,0],\"TND\":[undefined,undefined,3],\"TOP\":[undefined,\"T$\"],\"TRL\":[undefined,undefined,0],\"TRY\":[undefined,\"₺\"],\"TTD\":[undefined,\"$\"],\"TWD\":[\"NT$\",\"$\",2],\"TZS\":[undefined,undefined,2],\"UAH\":[undefined,\"₴\"],\"UGX\":[undefined,undefined,0],\"USD\":[\"$\"],\"UYI\":[undefined,undefined,0],\"UYU\":[undefined,\"$\"],\"UYW\":[undefined,undefined,4],\"UZS\":[undefined,undefined,2],\"VEF\":[undefined,\"Bs\",2],\"VND\":[\"₫\",undefined,0],\"VUV\":[undefined,undefined,0],\"XAF\":[\"FCFA\",undefined,0],\"XCD\":[\"EC$\",\"$\"],\"XOF\":[\"F CFA\",undefined,0],\"XPF\":[\"CFPF\",undefined,0],\"XXX\":[\"¤\"],\"YER\":[undefined,undefined,0],\"ZAR\":[undefined,\"R\"],\"ZMK\":[undefined,undefined,0],\"ZMW\":[undefined,\"ZK\"],\"ZWD\":[undefined,undefined,0]};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ɵCurrencyIndex,\n  ɵExtraLocaleDataIndex,\n  ɵfindLocaleData,\n  ɵgetLocaleCurrencyCode,\n  ɵgetLocalePluralCase,\n  ɵLocaleDataIndex,\n} from '@angular/core';\n\nimport {CURRENCIES_EN, CurrenciesSymbols} from './currencies';\n\n/**\n * Format styles that can be used to represent numbers.\n * @see {@link getLocaleNumberFormat}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated `getLocaleNumberFormat` is deprecated\n */\nexport enum NumberFormatStyle {\n  Decimal,\n  Percent,\n  Currency,\n  Scientific,\n}\n\n/**\n * Plurality cases used for translating plurals to different languages.\n *\n * @see {@link NgPlural}\n * @see {@link NgPluralCase}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated `getLocalePluralCase` is deprecated\n */\nexport enum Plural {\n  Zero = 0,\n  One = 1,\n  Two = 2,\n  Few = 3,\n  Many = 4,\n  Other = 5,\n}\n\n/**\n * Context-dependant translation forms for strings.\n * Typically the standalone version is for the nominative form of the word,\n * and the format version is used for the genitive case.\n * @see [CLDR website](http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles)\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated locale data getters are deprecated\n */\nexport enum FormStyle {\n  Format,\n  Standalone,\n}\n\n/**\n * String widths available for translations.\n * The specific character widths are locale-specific.\n * Examples are given for the word \"Sunday\" in English.\n *\n * @publicApi\n *\n * @deprecated locale data getters are deprecated\n */\nexport enum TranslationWidth {\n  /** 1 character for `en-US`. For example: 'S' */\n  Narrow,\n  /** 3 characters for `en-US`. For example: 'Sun' */\n  Abbreviated,\n  /** Full length for `en-US`. For example: \"Sunday\" */\n  Wide,\n  /** 2 characters for `en-US`, For example: \"Su\" */\n  Short,\n}\n\n/**\n * String widths available for date-time formats.\n * The specific character widths are locale-specific.\n * Examples are given for `en-US`.\n *\n * @see {@link getLocaleDateFormat}\n * @see {@link getLocaleTimeFormat}\n * @see {@link getLocaleDateTimeFormat}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n * @publicApi\n *\n * @deprecated Date locale data getters are deprecated\n */\nexport enum FormatWidth {\n  /**\n   * For `en-US`, `'M/d/yy, h:mm a'`\n   * (Example: `6/15/15, 9:03 AM`)\n   */\n  Short,\n  /**\n   * For `en-US`, `'MMM d, y, h:mm:ss a'`\n   * (Example: `Jun 15, 2015, 9:03:01 AM`)\n   */\n  Medium,\n  /**\n   * For `en-US`, `'MMMM d, y, h:mm:ss a z'`\n   * (Example: `June 15, 2015 at 9:03:01 AM GMT+1`)\n   */\n  Long,\n  /**\n   * For `en-US`, `'EEEE, MMMM d, y, h:mm:ss a zzzz'`\n   * (Example: `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00`)\n   */\n  Full,\n}\n\n// This needs to be an object literal, rather than an enum, because TypeScript 5.4+\n// doesn't allow numeric keys and we have `Infinity` and `NaN`.\n/**\n * Symbols that can be used to replace placeholders in number patterns.\n * Examples are based on `en-US` values.\n *\n * @see {@link getLocaleNumberSymbol}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated `getLocaleNumberSymbol` is deprecated\n *\n * @object-literal-as-enum\n */\nexport const NumberSymbol = {\n  /**\n   * Decimal separator.\n   * For `en-US`, the dot character.\n   * Example: 2,345`.`67\n   */\n  Decimal: 0,\n  /**\n   * Grouping separator, typically for thousands.\n   * For `en-US`, the comma character.\n   * Example: 2`,`345.67\n   */\n  Group: 1,\n  /**\n   * List-item separator.\n   * Example: \"one, two, and three\"\n   */\n  List: 2,\n  /**\n   * Sign for percentage (out of 100).\n   * Example: 23.4%\n   */\n  PercentSign: 3,\n  /**\n   * Sign for positive numbers.\n   * Example: +23\n   */\n  PlusSign: 4,\n  /**\n   * Sign for negative numbers.\n   * Example: -23\n   */\n  MinusSign: 5,\n  /**\n   * Computer notation for exponential value (n times a power of 10).\n   * Example: 1.2E3\n   */\n  Exponential: 6,\n  /**\n   * Human-readable format of exponential.\n   * Example: 1.2x103\n   */\n  SuperscriptingExponent: 7,\n  /**\n   * Sign for permille (out of 1000).\n   * Example: 23.4‰\n   */\n  PerMille: 8,\n  /**\n   * Infinity, can be used with plus and minus.\n   * Example: ∞, +∞, -∞\n   */\n  Infinity: 9,\n  /**\n   * Not a number.\n   * Example: NaN\n   */\n  NaN: 10,\n  /**\n   * Symbol used between time units.\n   * Example: 10:52\n   */\n  TimeSeparator: 11,\n  /**\n   * Decimal separator for currency values (fallback to `Decimal`).\n   * Example: $2,345.67\n   */\n  CurrencyDecimal: 12,\n  /**\n   * Group separator for currency values (fallback to `Group`).\n   * Example: $2,345.67\n   */\n  CurrencyGroup: 13,\n} as const;\n\nexport type NumberSymbol = (typeof NumberSymbol)[keyof typeof NumberSymbol];\n\n/**\n * The value for each day of the week, based on the `en-US` locale\n *\n * @publicApi\n *\n * @deprecated Week locale getters are deprecated\n */\nexport enum WeekDay {\n  Sunday = 0,\n  Monday,\n  Tuesday,\n  Wednesday,\n  Thursday,\n  Friday,\n  Saturday,\n}\n\n/**\n * Retrieves the locale ID from the currently loaded locale.\n * The loaded locale could be, for example, a global one rather than a regional one.\n * @param locale A locale code, such as `fr-FR`.\n * @returns The locale code. For example, `fr`.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * This function serves no purpose when relying on the `Intl` API.\n */\nexport function getLocaleId(locale: string): string {\n  return ɵfindLocaleData(locale)[ɵLocaleDataIndex.LocaleId];\n}\n\n/**\n * Retrieves day period strings for the given locale.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param formStyle The required grammatical form.\n * @param width The required character width.\n * @returns An array of localized period strings. For example, `[AM, PM]` for `en-US`.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.DateTimeFormat` for date formating instead.\n */\nexport function getLocaleDayPeriods(\n  locale: string,\n  formStyle: FormStyle,\n  width: TranslationWidth,\n): Readonly<[string, string]> {\n  const data = ɵfindLocaleData(locale);\n  const amPmData = <[string, string][][]>[\n    data[ɵLocaleDataIndex.DayPeriodsFormat],\n    data[ɵLocaleDataIndex.DayPeriodsStandalone],\n  ];\n  const amPm = getLastDefinedValue(amPmData, formStyle);\n  return getLastDefinedValue(amPm, width);\n}\n\n/**\n * Retrieves days of the week for the given locale, using the Gregorian calendar.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param formStyle The required grammatical form.\n * @param width The required character width.\n * @returns An array of localized name strings.\n * For example,`[Sunday, Monday, ... Saturday]` for `en-US`.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.DateTimeFormat` for date formating instead.\n */\nexport function getLocaleDayNames(\n  locale: string,\n  formStyle: FormStyle,\n  width: TranslationWidth,\n): ReadonlyArray<string> {\n  const data = ɵfindLocaleData(locale);\n  const daysData = <string[][][]>[\n    data[ɵLocaleDataIndex.DaysFormat],\n    data[ɵLocaleDataIndex.DaysStandalone],\n  ];\n  const days = getLastDefinedValue(daysData, formStyle);\n  return getLastDefinedValue(days, width);\n}\n\n/**\n * Retrieves months of the year for the given locale, using the Gregorian calendar.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param formStyle The required grammatical form.\n * @param width The required character width.\n * @returns An array of localized name strings.\n * For example,  `[January, February, ...]` for `en-US`.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.DateTimeFormat` for date formating instead.\n */\nexport function getLocaleMonthNames(\n  locale: string,\n  formStyle: FormStyle,\n  width: TranslationWidth,\n): ReadonlyArray<string> {\n  const data = ɵfindLocaleData(locale);\n  const monthsData = <string[][][]>[\n    data[ɵLocaleDataIndex.MonthsFormat],\n    data[ɵLocaleDataIndex.MonthsStandalone],\n  ];\n  const months = getLastDefinedValue(monthsData, formStyle);\n  return getLastDefinedValue(months, width);\n}\n\n/**\n * Retrieves Gregorian-calendar eras for the given locale.\n * @param locale A locale code for the locale format rules to use.\n * @param width The required character width.\n\n * @returns An array of localized era strings.\n * For example, `[AD, BC]` for `en-US`.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.DateTimeFormat` for date formating instead.\n */\nexport function getLocaleEraNames(\n  locale: string,\n  width: TranslationWidth,\n): Readonly<[string, string]> {\n  const data = ɵfindLocaleData(locale);\n  const erasData = <[string, string][]>data[ɵLocaleDataIndex.Eras];\n  return getLastDefinedValue(erasData, width);\n}\n\n/**\n * Retrieves the first day of the week for the given locale.\n *\n * @param locale A locale code for the locale format rules to use.\n * @returns A day index number, using the 0-based week-day index for `en-US`\n * (Sunday = 0, Monday = 1, ...).\n * For example, for `fr-FR`, returns 1 to indicate that the first day is Monday.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Intl's [`getWeekInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getWeekInfo) has partial support (Chromium M99 & Safari 17).\n * You may want to rely on the following alternatives:\n * - Libraries like [`Luxon`](https://moment.github.io/luxon/#/) rely on `Intl` but fallback on the ISO 8601 definition (monday) if `getWeekInfo` is not supported.\n * - Other librairies like [`date-fns`](https://date-fns.org/), [`day.js`](https://day.js.org/en/) or [`weekstart`](https://www.npmjs.com/package/weekstart) library provide their own locale based data for the first day of the week.\n */\nexport function getLocaleFirstDayOfWeek(locale: string): WeekDay {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.FirstDayOfWeek];\n}\n\n/**\n * Range of week days that are considered the week-end for the given locale.\n *\n * @param locale A locale code for the locale format rules to use.\n * @returns The range of day values, `[startDay, endDay]`.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Intl's [`getWeekInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getWeekInfo) has partial support (Chromium M99 & Safari 17).\n * Libraries like [`Luxon`](https://moment.github.io/luxon/#/) rely on `Intl` but fallback on the ISO 8601 definition (Saturday+Sunday) if `getWeekInfo` is not supported .\n */\nexport function getLocaleWeekEndRange(locale: string): [WeekDay, WeekDay] {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.WeekendRange];\n}\n\n/**\n * Retrieves a localized date-value formatting string.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param width The format type.\n * @returns The localized formatting string.\n * @see {@link FormatWidth}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.DateTimeFormat` for date formating instead.\n */\nexport function getLocaleDateFormat(locale: string, width: FormatWidth): string {\n  const data = ɵfindLocaleData(locale);\n  return getLastDefinedValue(data[ɵLocaleDataIndex.DateFormat], width);\n}\n\n/**\n * Retrieves a localized time-value formatting string.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param width The format type.\n * @returns The localized formatting string.\n * @see {@link FormatWidth}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n\n * @publicApi\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.DateTimeFormat` for date formating instead.\n */\nexport function getLocaleTimeFormat(locale: string, width: FormatWidth): string {\n  const data = ɵfindLocaleData(locale);\n  return getLastDefinedValue(data[ɵLocaleDataIndex.TimeFormat], width);\n}\n\n/**\n * Retrieves a localized date-time formatting string.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param width The format type.\n * @returns The localized formatting string.\n * @see {@link FormatWidth}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.DateTimeFormat` for date formating instead.\n */\nexport function getLocaleDateTimeFormat(locale: string, width: FormatWidth): string {\n  const data = ɵfindLocaleData(locale);\n  const dateTimeFormatData = <string[]>data[ɵLocaleDataIndex.DateTimeFormat];\n  return getLastDefinedValue(dateTimeFormatData, width);\n}\n\n/**\n * Retrieves a localized number symbol that can be used to replace placeholders in number formats.\n * @param locale The locale code.\n * @param symbol The symbol to localize. Must be one of `NumberSymbol`.\n * @returns The character for the localized symbol.\n * @see {@link NumberSymbol}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.NumberFormat` to format numbers instead.\n */\nexport function getLocaleNumberSymbol(locale: string, symbol: NumberSymbol): string {\n  const data = ɵfindLocaleData(locale);\n  const res = data[ɵLocaleDataIndex.NumberSymbols][symbol];\n  if (typeof res === 'undefined') {\n    if (symbol === NumberSymbol.CurrencyDecimal) {\n      return data[ɵLocaleDataIndex.NumberSymbols][NumberSymbol.Decimal];\n    } else if (symbol === NumberSymbol.CurrencyGroup) {\n      return data[ɵLocaleDataIndex.NumberSymbols][NumberSymbol.Group];\n    }\n  }\n  return res;\n}\n\n/**\n * Retrieves a number format for a given locale.\n *\n * Numbers are formatted using patterns, like `#,###.00`. For example, the pattern `#,###.00`\n * when used to format the number 12345.678 could result in \"12'345,678\". That would happen if the\n * grouping separator for your language is an apostrophe, and the decimal separator is a comma.\n *\n * <b>Important:</b> The characters `.` `,` `0` `#` (and others below) are special placeholders\n * that stand for the decimal separator, and so on, and are NOT real characters.\n * You must NOT \"translate\" the placeholders. For example, don't change `.` to `,` even though in\n * your language the decimal point is written with a comma. The symbols should be replaced by the\n * local equivalents, using the appropriate `NumberSymbol` for your language.\n *\n * Here are the special characters used in number patterns:\n *\n * | Symbol | Meaning |\n * |--------|---------|\n * | . | Replaced automatically by the character used for the decimal point. |\n * | , | Replaced by the \"grouping\" (thousands) separator. |\n * | 0 | Replaced by a digit (or zero if there aren't enough digits). |\n * | # | Replaced by a digit (or nothing if there aren't enough). |\n * | ¤ | Replaced by a currency symbol, such as $ or USD. |\n * | % | Marks a percent format. The % symbol may change position, but must be retained. |\n * | E | Marks a scientific format. The E symbol may change position, but must be retained. |\n * | ' | Special characters used as literal characters are quoted with ASCII single quotes. |\n *\n * @param locale A locale code for the locale format rules to use.\n * @param type The type of numeric value to be formatted (such as `Decimal` or `Currency`.)\n * @returns The localized format string.\n * @see {@link NumberFormatStyle}\n * @see [CLDR website](http://cldr.unicode.org/translation/number-patterns)\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Let `Intl.NumberFormat` determine the number format instead\n */\nexport function getLocaleNumberFormat(locale: string, type: NumberFormatStyle): string {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.NumberFormats][type];\n}\n\n/**\n * Retrieves the symbol used to represent the currency for the main country\n * corresponding to a given locale. For example, '$' for `en-US`.\n *\n * @param locale A locale code for the locale format rules to use.\n * @returns The localized symbol character,\n * or `null` if the main country cannot be determined.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Use the `Intl` API to format a currency with from currency code\n */\nexport function getLocaleCurrencySymbol(locale: string): string | null {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.CurrencySymbol] || null;\n}\n\n/**\n * Retrieves the name of the currency for the main country corresponding\n * to a given locale. For example, 'US Dollar' for `en-US`.\n * @param locale A locale code for the locale format rules to use.\n * @returns The currency name,\n * or `null` if the main country cannot be determined.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Use the `Intl` API to format a currency with from currency code\n */\nexport function getLocaleCurrencyName(locale: string): string | null {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.CurrencyName] || null;\n}\n\n/**\n * Retrieves the default currency code for the given locale.\n *\n * The default is defined as the first currency which is still in use.\n *\n * @param locale The code of the locale whose currency code we want.\n * @returns The code of the default currency for the given locale.\n *\n * @publicApi\n *\n * @deprecated We recommend you create a map of locale to ISO 4217 currency codes.\n * Time relative currency data is provided by the CLDR project. See https://www.unicode.org/cldr/charts/44/supplemental/detailed_territory_currency_information.html\n */\nexport function getLocaleCurrencyCode(locale: string): string | null {\n  return ɵgetLocaleCurrencyCode(locale);\n}\n\n/**\n * Retrieves the currency values for a given locale.\n * @param locale A locale code for the locale format rules to use.\n * @returns The currency values.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n */\nfunction getLocaleCurrencies(locale: string): {[code: string]: CurrenciesSymbols} {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.Currencies];\n}\n\n/**\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Use `Intl.PluralRules` instead\n */\nexport const getLocalePluralCase: (locale: string) => (value: number) => Plural =\n  ɵgetLocalePluralCase;\n\nfunction checkFullData(data: any) {\n  if (!data[ɵLocaleDataIndex.ExtraData]) {\n    throw new Error(\n      `Missing extra locale data for the locale \"${\n        data[ɵLocaleDataIndex.LocaleId]\n      }\". Use \"registerLocaleData\" to load new data. See the \"I18n guide\" on angular.io to know more.`,\n    );\n  }\n}\n\n/**\n * Retrieves locale-specific rules used to determine which day period to use\n * when more than one period is defined for a locale.\n *\n * There is a rule for each defined day period. The\n * first rule is applied to the first day period and so on.\n * Fall back to AM/PM when no rules are available.\n *\n * A rule can specify a period as time range, or as a single time value.\n *\n * This functionality is only available when you have loaded the full locale data.\n * See the [\"I18n guide\"](guide/i18n/format-data-locale).\n *\n * @param locale A locale code for the locale format rules to use.\n * @returns The rules for the locale, a single time value or array of *from-time, to-time*,\n * or null if no periods are available.\n *\n * @see {@link getLocaleExtraDayPeriods}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * Let `Intl.DateTimeFormat` determine the day period instead.\n */\nexport function getLocaleExtraDayPeriodRules(locale: string): (Time | [Time, Time])[] {\n  const data = ɵfindLocaleData(locale);\n  checkFullData(data);\n  const rules = data[ɵLocaleDataIndex.ExtraData][ɵExtraLocaleDataIndex.ExtraDayPeriodsRules] || [];\n  return rules.map((rule: string | [string, string]) => {\n    if (typeof rule === 'string') {\n      return extractTime(rule);\n    }\n    return [extractTime(rule[0]), extractTime(rule[1])];\n  });\n}\n\n/**\n * Retrieves locale-specific day periods, which indicate roughly how a day is broken up\n * in different languages.\n * For example, for `en-US`, periods are morning, noon, afternoon, evening, and midnight.\n *\n * This functionality is only available when you have loaded the full locale data.\n * See the [\"I18n guide\"](guide/i18n/format-data-locale).\n *\n * @param locale A locale code for the locale format rules to use.\n * @param formStyle The required grammatical form.\n * @param width The required character width.\n * @returns The translated day-period strings.\n * @see {@link getLocaleExtraDayPeriodRules}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * To extract a day period use `Intl.DateTimeFormat` with the `dayPeriod` option instead.\n */\nexport function getLocaleExtraDayPeriods(\n  locale: string,\n  formStyle: FormStyle,\n  width: TranslationWidth,\n): string[] {\n  const data = ɵfindLocaleData(locale);\n  checkFullData(data);\n  const dayPeriodsData = <string[][][]>[\n    data[ɵLocaleDataIndex.ExtraData][ɵExtraLocaleDataIndex.ExtraDayPeriodFormats],\n    data[ɵLocaleDataIndex.ExtraData][ɵExtraLocaleDataIndex.ExtraDayPeriodStandalone],\n  ];\n  const dayPeriods = getLastDefinedValue(dayPeriodsData, formStyle) || [];\n  return getLastDefinedValue(dayPeriods, width) || [];\n}\n\n/**\n * Retrieves the writing direction of a specified locale\n * @param locale A locale code for the locale format rules to use.\n * @publicApi\n * @returns 'rtl' or 'ltr'\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * For dates and numbers, let `Intl.DateTimeFormat()` and `Intl.NumberFormat()` determine the writing direction.\n * The `Intl` alternative [`getTextInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getTextInfo).\n * has only partial support (Chromium M99 & Safari 17).\n * 3rd party alternatives like [`rtl-detect`](https://www.npmjs.com/package/rtl-detect) can work around this issue.\n */\nexport function getLocaleDirection(locale: string): 'ltr' | 'rtl' {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.Directionality];\n}\n\n/**\n * Retrieves the first value that is defined in an array, going backwards from an index position.\n *\n * To avoid repeating the same data (as when the \"format\" and \"standalone\" forms are the same)\n * add the first value to the locale data arrays, and add other values only if they are different.\n *\n * @param data The data array to retrieve from.\n * @param index A 0-based index into the array to start from.\n * @returns The value immediately before the given index position.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n */\nfunction getLastDefinedValue<T>(data: T[], index: number): T {\n  for (let i = index; i > -1; i--) {\n    if (typeof data[i] !== 'undefined') {\n      return data[i];\n    }\n  }\n  throw new Error('Locale data API: locale data undefined');\n}\n\n/**\n * Represents a time value with hours and minutes.\n *\n * @publicApi\n *\n * @deprecated Locale date getters are deprecated\n */\nexport type Time = {\n  hours: number;\n  minutes: number;\n};\n\n/**\n * Extracts the hours and minutes from a string like \"15:45\"\n */\nfunction extractTime(time: string): Time {\n  const [h, m] = time.split(':');\n  return {hours: +h, minutes: +m};\n}\n\n/**\n * Retrieves the currency symbol for a given currency code.\n *\n * For example, for the default `en-US` locale, the code `USD` can\n * be represented by the narrow symbol `$` or the wide symbol `US$`.\n *\n * @param code The currency code.\n * @param format The format, `wide` or `narrow`.\n * @param locale A locale code for the locale format rules to use.\n *\n * @returns The symbol, or the currency code if no symbol is available.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * You can use `Intl.NumberFormat().formatToParts()` to extract the currency symbol.\n * For example: `Intl.NumberFormat('en', {style:'currency', currency: 'USD'}).formatToParts().find(part => part.type === 'currency').value`\n * returns `$` for USD currency code in the `en` locale.\n * Note: `US$` is a currency symbol for the `en-ca` locale but not the `en-us` locale.\n */\nexport function getCurrencySymbol(code: string, format: 'wide' | 'narrow', locale = 'en'): string {\n  const currency = getLocaleCurrencies(locale)[code] || CURRENCIES_EN[code] || [];\n  const symbolNarrow = currency[ɵCurrencyIndex.SymbolNarrow];\n\n  if (format === 'narrow' && typeof symbolNarrow === 'string') {\n    return symbolNarrow;\n  }\n\n  return currency[ɵCurrencyIndex.Symbol] || code;\n}\n\n// Most currencies have cents, that's why the default is 2\nconst DEFAULT_NB_OF_CURRENCY_DIGITS = 2;\n\n/**\n * Reports the number of decimal digits for a given currency.\n * The value depends upon the presence of cents in that particular currency.\n *\n * @param code The currency code.\n * @returns The number of decimal digits, typically 0 or 2.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n *\n * @deprecated Angular recommends relying on the `Intl` API for i18n.\n * This function should not be used anymore. Let `Intl.NumberFormat` determine the number of digits to display for the currency\n */\nexport function getNumberOfCurrencyDigits(code: string): number {\n  let digits;\n  const currency = CURRENCIES_EN[code];\n  if (currency) {\n    digits = currency[ɵCurrencyIndex.NbOfDigits];\n  }\n  return typeof digits === 'number' ? digits : DEFAULT_NB_OF_CURRENCY_DIGITS;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  FormatWidth,\n  FormStyle,\n  getLocaleDateFormat,\n  getLocaleDateTimeFormat,\n  getLocaleDayNames,\n  getLocaleDayPeriods,\n  getLocaleEraNames,\n  getLocaleExtraDayPeriodRules,\n  getLocaleExtraDayPeriods,\n  getLocaleId,\n  getLocaleMonthNames,\n  getLocaleNumberSymbol,\n  getLocaleTimeFormat,\n  NumberSymbol,\n  Time,\n  TranslationWidth,\n} from './locale_data_api';\n\nexport const ISO8601_DATE_REGEX =\n  /^(\\d{4,})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n//    1        2       3         4          5          6          7          8  9     10      11\nconst NAMED_FORMATS: {[localeId: string]: {[format: string]: string}} = {};\nconst DATE_FORMATS_SPLIT =\n  /((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\\s\\S]*)/;\n\nconst enum ZoneWidth {\n  Short,\n  ShortGMT,\n  Long,\n  Extended,\n}\n\nconst enum DateType {\n  FullYear,\n  Month,\n  Date,\n  Hours,\n  Minutes,\n  Seconds,\n  FractionalSeconds,\n  Day,\n}\n\nconst enum TranslationType {\n  DayPeriods,\n  Days,\n  Months,\n  Eras,\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a date according to locale rules.\n *\n * @param value The date to format, as a Date, or a number (milliseconds since UTC epoch)\n * or an [ISO date-time string](https://www.w3.org/TR/NOTE-datetime).\n * @param format The date-time components to include. See `DatePipe` for details.\n * @param locale A locale code for the locale format rules to use.\n * @param timezone The time zone. A time zone offset from GMT (such as `'+0430'`).\n * If not specified, uses host system settings.\n *\n * @returns The formatted date string.\n *\n * @see {@link DatePipe}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n */\nexport function formatDate(\n  value: string | number | Date,\n  format: string,\n  locale: string,\n  timezone?: string,\n): string {\n  let date = toDate(value);\n  const namedFormat = getNamedFormat(locale, format);\n  format = namedFormat || format;\n\n  let parts: string[] = [];\n  let match;\n  while (format) {\n    match = DATE_FORMATS_SPLIT.exec(format);\n    if (match) {\n      parts = parts.concat(match.slice(1));\n      const part = parts.pop();\n      if (!part) {\n        break;\n      }\n      format = part;\n    } else {\n      parts.push(format);\n      break;\n    }\n  }\n\n  let dateTimezoneOffset = date.getTimezoneOffset();\n  if (timezone) {\n    dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n    date = convertTimezoneToLocal(date, timezone, true);\n  }\n\n  let text = '';\n  parts.forEach((value) => {\n    const dateFormatter = getDateFormatter(value);\n    text += dateFormatter\n      ? dateFormatter(date, locale, dateTimezoneOffset)\n      : value === \"''\"\n        ? \"'\"\n        : value.replace(/(^'|'$)/g, '').replace(/''/g, \"'\");\n  });\n\n  return text;\n}\n\n/**\n * Create a new Date object with the given date value, and the time set to midnight.\n *\n * We cannot use `new Date(year, month, date)` because it maps years between 0 and 99 to 1900-1999.\n * See: https://github.com/angular/angular/issues/40377\n *\n * Note that this function returns a Date object whose time is midnight in the current locale's\n * timezone. In the future we might want to change this to be midnight in UTC, but this would be a\n * considerable breaking change.\n */\nfunction createDate(year: number, month: number, date: number): Date {\n  // The `newDate` is set to midnight (UTC) on January 1st 1970.\n  // - In PST this will be December 31st 1969 at 4pm.\n  // - In GMT this will be January 1st 1970 at 1am.\n  // Note that they even have different years, dates and months!\n  const newDate = new Date(0);\n\n  // `setFullYear()` allows years like 0001 to be set correctly. This function does not\n  // change the internal time of the date.\n  // Consider calling `setFullYear(2019, 8, 20)` (September 20, 2019).\n  // - In PST this will now be September 20, 2019 at 4pm\n  // - In GMT this will now be September 20, 2019 at 1am\n\n  newDate.setFullYear(year, month, date);\n  // We want the final date to be at local midnight, so we reset the time.\n  // - In PST this will now be September 20, 2019 at 12am\n  // - In GMT this will now be September 20, 2019 at 12am\n  newDate.setHours(0, 0, 0);\n\n  return newDate;\n}\n\nfunction getNamedFormat(locale: string, format: string): string {\n  const localeId = getLocaleId(locale);\n  NAMED_FORMATS[localeId] ??= {};\n\n  if (NAMED_FORMATS[localeId][format]) {\n    return NAMED_FORMATS[localeId][format];\n  }\n\n  let formatValue = '';\n  switch (format) {\n    case 'shortDate':\n      formatValue = getLocaleDateFormat(locale, FormatWidth.Short);\n      break;\n    case 'mediumDate':\n      formatValue = getLocaleDateFormat(locale, FormatWidth.Medium);\n      break;\n    case 'longDate':\n      formatValue = getLocaleDateFormat(locale, FormatWidth.Long);\n      break;\n    case 'fullDate':\n      formatValue = getLocaleDateFormat(locale, FormatWidth.Full);\n      break;\n    case 'shortTime':\n      formatValue = getLocaleTimeFormat(locale, FormatWidth.Short);\n      break;\n    case 'mediumTime':\n      formatValue = getLocaleTimeFormat(locale, FormatWidth.Medium);\n      break;\n    case 'longTime':\n      formatValue = getLocaleTimeFormat(locale, FormatWidth.Long);\n      break;\n    case 'fullTime':\n      formatValue = getLocaleTimeFormat(locale, FormatWidth.Full);\n      break;\n    case 'short':\n      const shortTime = getNamedFormat(locale, 'shortTime');\n      const shortDate = getNamedFormat(locale, 'shortDate');\n      formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Short), [\n        shortTime,\n        shortDate,\n      ]);\n      break;\n    case 'medium':\n      const mediumTime = getNamedFormat(locale, 'mediumTime');\n      const mediumDate = getNamedFormat(locale, 'mediumDate');\n      formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Medium), [\n        mediumTime,\n        mediumDate,\n      ]);\n      break;\n    case 'long':\n      const longTime = getNamedFormat(locale, 'longTime');\n      const longDate = getNamedFormat(locale, 'longDate');\n      formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Long), [\n        longTime,\n        longDate,\n      ]);\n      break;\n    case 'full':\n      const fullTime = getNamedFormat(locale, 'fullTime');\n      const fullDate = getNamedFormat(locale, 'fullDate');\n      formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Full), [\n        fullTime,\n        fullDate,\n      ]);\n      break;\n  }\n  if (formatValue) {\n    NAMED_FORMATS[localeId][format] = formatValue;\n  }\n  return formatValue;\n}\n\nfunction formatDateTime(str: string, opt_values: string[]) {\n  if (opt_values) {\n    str = str.replace(/\\{([^}]+)}/g, function (match, key) {\n      return opt_values != null && key in opt_values ? opt_values[key] : match;\n    });\n  }\n  return str;\n}\n\nfunction padNumber(\n  num: number,\n  digits: number,\n  minusSign = '-',\n  trim?: boolean,\n  negWrap?: boolean,\n): string {\n  let neg = '';\n  if (num < 0 || (negWrap && num <= 0)) {\n    if (negWrap) {\n      num = -num + 1;\n    } else {\n      num = -num;\n      neg = minusSign;\n    }\n  }\n  let strNum = String(num);\n  while (strNum.length < digits) {\n    strNum = '0' + strNum;\n  }\n  if (trim) {\n    strNum = strNum.slice(strNum.length - digits);\n  }\n  return neg + strNum;\n}\n\nfunction formatFractionalSeconds(milliseconds: number, digits: number): string {\n  const strMs = padNumber(milliseconds, 3);\n  return strMs.substring(0, digits);\n}\n\n/**\n * Returns a date formatter that transforms a date into its locale digit representation\n */\nfunction dateGetter(\n  name: DateType,\n  size: number,\n  offset: number = 0,\n  trim = false,\n  negWrap = false,\n): DateFormatter {\n  return function (date: Date, locale: string): string {\n    let part = getDatePart(name, date);\n    if (offset > 0 || part > -offset) {\n      part += offset;\n    }\n\n    if (name === DateType.Hours) {\n      if (part === 0 && offset === -12) {\n        part = 12;\n      }\n    } else if (name === DateType.FractionalSeconds) {\n      return formatFractionalSeconds(part, size);\n    }\n\n    const localeMinus = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);\n    return padNumber(part, size, localeMinus, trim, negWrap);\n  };\n}\n\nfunction getDatePart(part: DateType, date: Date): number {\n  switch (part) {\n    case DateType.FullYear:\n      return date.getFullYear();\n    case DateType.Month:\n      return date.getMonth();\n    case DateType.Date:\n      return date.getDate();\n    case DateType.Hours:\n      return date.getHours();\n    case DateType.Minutes:\n      return date.getMinutes();\n    case DateType.Seconds:\n      return date.getSeconds();\n    case DateType.FractionalSeconds:\n      return date.getMilliseconds();\n    case DateType.Day:\n      return date.getDay();\n    default:\n      throw new Error(`Unknown DateType value \"${part}\".`);\n  }\n}\n\n/**\n * Returns a date formatter that transforms a date into its locale string representation\n */\nfunction dateStrGetter(\n  name: TranslationType,\n  width: TranslationWidth,\n  form: FormStyle = FormStyle.Format,\n  extended = false,\n): DateFormatter {\n  return function (date: Date, locale: string): string {\n    return getDateTranslation(date, locale, name, width, form, extended);\n  };\n}\n\n/**\n * Returns the locale translation of a date for a given form, type and width\n */\nfunction getDateTranslation(\n  date: Date,\n  locale: string,\n  name: TranslationType,\n  width: TranslationWidth,\n  form: FormStyle,\n  extended: boolean,\n) {\n  switch (name) {\n    case TranslationType.Months:\n      return getLocaleMonthNames(locale, form, width)[date.getMonth()];\n    case TranslationType.Days:\n      return getLocaleDayNames(locale, form, width)[date.getDay()];\n    case TranslationType.DayPeriods:\n      const currentHours = date.getHours();\n      const currentMinutes = date.getMinutes();\n      if (extended) {\n        const rules = getLocaleExtraDayPeriodRules(locale);\n        const dayPeriods = getLocaleExtraDayPeriods(locale, form, width);\n        const index = rules.findIndex((rule) => {\n          if (Array.isArray(rule)) {\n            // morning, afternoon, evening, night\n            const [from, to] = rule;\n            const afterFrom = currentHours >= from.hours && currentMinutes >= from.minutes;\n            const beforeTo =\n              currentHours < to.hours || (currentHours === to.hours && currentMinutes < to.minutes);\n            // We must account for normal rules that span a period during the day (e.g. 6am-9am)\n            // where `from` is less (earlier) than `to`. But also rules that span midnight (e.g.\n            // 10pm - 5am) where `from` is greater (later!) than `to`.\n            //\n            // In the first case the current time must be BOTH after `from` AND before `to`\n            // (e.g. 8am is after 6am AND before 10am).\n            //\n            // In the second case the current time must be EITHER after `from` OR before `to`\n            // (e.g. 4am is before 5am but not after 10pm; and 11pm is not before 5am but it is\n            // after 10pm).\n            if (from.hours < to.hours) {\n              if (afterFrom && beforeTo) {\n                return true;\n              }\n            } else if (afterFrom || beforeTo) {\n              return true;\n            }\n          } else {\n            // noon or midnight\n            if (rule.hours === currentHours && rule.minutes === currentMinutes) {\n              return true;\n            }\n          }\n          return false;\n        });\n        if (index !== -1) {\n          return dayPeriods[index];\n        }\n      }\n      // if no rules for the day periods, we use am/pm by default\n      return getLocaleDayPeriods(locale, form, <TranslationWidth>width)[currentHours < 12 ? 0 : 1];\n    case TranslationType.Eras:\n      return getLocaleEraNames(locale, <TranslationWidth>width)[date.getFullYear() <= 0 ? 0 : 1];\n    default:\n      // This default case is not needed by TypeScript compiler, as the switch is exhaustive.\n      // However Closure Compiler does not understand that and reports an error in typed mode.\n      // The `throw new Error` below works around the problem, and the unexpected: never variable\n      // makes sure tsc still checks this code is unreachable.\n      const unexpected: never = name;\n      throw new Error(`unexpected translation type ${unexpected}`);\n  }\n}\n\n/**\n * Returns a date formatter that transforms a date and an offset into a timezone with ISO8601 or\n * GMT format depending on the width (eg: short = +0430, short:GMT = GMT+4, long = GMT+04:30,\n * extended = +04:30)\n */\nfunction timeZoneGetter(width: ZoneWidth): DateFormatter {\n  return function (date: Date, locale: string, offset: number) {\n    const zone = -1 * offset;\n    const minusSign = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);\n    const hours = zone > 0 ? Math.floor(zone / 60) : Math.ceil(zone / 60);\n    switch (width) {\n      case ZoneWidth.Short:\n        return (\n          (zone >= 0 ? '+' : '') +\n          padNumber(hours, 2, minusSign) +\n          padNumber(Math.abs(zone % 60), 2, minusSign)\n        );\n      case ZoneWidth.ShortGMT:\n        return 'GMT' + (zone >= 0 ? '+' : '') + padNumber(hours, 1, minusSign);\n      case ZoneWidth.Long:\n        return (\n          'GMT' +\n          (zone >= 0 ? '+' : '') +\n          padNumber(hours, 2, minusSign) +\n          ':' +\n          padNumber(Math.abs(zone % 60), 2, minusSign)\n        );\n      case ZoneWidth.Extended:\n        if (offset === 0) {\n          return 'Z';\n        } else {\n          return (\n            (zone >= 0 ? '+' : '') +\n            padNumber(hours, 2, minusSign) +\n            ':' +\n            padNumber(Math.abs(zone % 60), 2, minusSign)\n          );\n        }\n      default:\n        throw new Error(`Unknown zone width \"${width}\"`);\n    }\n  };\n}\n\nconst JANUARY = 0;\nconst THURSDAY = 4;\nfunction getFirstThursdayOfYear(year: number) {\n  const firstDayOfYear = createDate(year, JANUARY, 1).getDay();\n  return createDate(\n    year,\n    0,\n    1 + (firstDayOfYear <= THURSDAY ? THURSDAY : THURSDAY + 7) - firstDayOfYear,\n  );\n}\n\n/**\n *  ISO Week starts on day 1 (Monday) and ends with day 0 (Sunday)\n */\nexport function getThursdayThisIsoWeek(datetime: Date) {\n  // getDay returns 0-6 range with sunday as 0.\n  const currentDay = datetime.getDay();\n\n  // On a Sunday, read the previous Thursday since ISO weeks start on Monday.\n  const deltaToThursday = currentDay === 0 ? -3 : THURSDAY - currentDay;\n\n  return createDate(\n    datetime.getFullYear(),\n    datetime.getMonth(),\n    datetime.getDate() + deltaToThursday,\n  );\n}\n\nfunction weekGetter(size: number, monthBased = false): DateFormatter {\n  return function (date: Date, locale: string) {\n    let result;\n    if (monthBased) {\n      const nbDaysBefore1stDayOfMonth =\n        new Date(date.getFullYear(), date.getMonth(), 1).getDay() - 1;\n      const today = date.getDate();\n      result = 1 + Math.floor((today + nbDaysBefore1stDayOfMonth) / 7);\n    } else {\n      const thisThurs = getThursdayThisIsoWeek(date);\n      // Some days of a year are part of next year according to ISO 8601.\n      // Compute the firstThurs from the year of this week's Thursday\n      const firstThurs = getFirstThursdayOfYear(thisThurs.getFullYear());\n      const diff = thisThurs.getTime() - firstThurs.getTime();\n      result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week\n    }\n\n    return padNumber(result, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));\n  };\n}\n\n/**\n * Returns a date formatter that provides the week-numbering year for the input date.\n */\nfunction weekNumberingYearGetter(size: number, trim = false): DateFormatter {\n  return function (date: Date, locale: string) {\n    const thisThurs = getThursdayThisIsoWeek(date);\n    const weekNumberingYear = thisThurs.getFullYear();\n    return padNumber(\n      weekNumberingYear,\n      size,\n      getLocaleNumberSymbol(locale, NumberSymbol.MinusSign),\n      trim,\n    );\n  };\n}\n\ntype DateFormatter = (date: Date, locale: string, offset: number) => string;\n\nconst DATE_FORMATS: {[format: string]: DateFormatter} = {};\n\n// Based on CLDR formats:\n// See complete list: http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n// See also explanations: http://cldr.unicode.org/translation/date-time\n// TODO(ocombe): support all missing cldr formats: U, Q, D, F, e, j, J, C, A, v, V, X, x\nfunction getDateFormatter(format: string): DateFormatter | null {\n  if (DATE_FORMATS[format]) {\n    return DATE_FORMATS[format];\n  }\n  let formatter;\n  switch (format) {\n    // Era name (AD/BC)\n    case 'G':\n    case 'GG':\n    case 'GGG':\n      formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Abbreviated);\n      break;\n    case 'GGGG':\n      formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Wide);\n      break;\n    case 'GGGGG':\n      formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Narrow);\n      break;\n\n    // 1 digit representation of the year, e.g. (AD 1 => 1, AD 199 => 199)\n    case 'y':\n      formatter = dateGetter(DateType.FullYear, 1, 0, false, true);\n      break;\n    // 2 digit representation of the year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\n    case 'yy':\n      formatter = dateGetter(DateType.FullYear, 2, 0, true, true);\n      break;\n    // 3 digit representation of the year, padded (000-999). (e.g. AD 2001 => 01, AD 2010 => 10)\n    case 'yyy':\n      formatter = dateGetter(DateType.FullYear, 3, 0, false, true);\n      break;\n    // 4 digit representation of the year (e.g. AD 1 => 0001, AD 2010 => 2010)\n    case 'yyyy':\n      formatter = dateGetter(DateType.FullYear, 4, 0, false, true);\n      break;\n\n    // 1 digit representation of the week-numbering year, e.g. (AD 1 => 1, AD 199 => 199)\n    case 'Y':\n      formatter = weekNumberingYearGetter(1);\n      break;\n    // 2 digit representation of the week-numbering year, padded (00-99). (e.g. AD 2001 => 01, AD\n    // 2010 => 10)\n    case 'YY':\n      formatter = weekNumberingYearGetter(2, true);\n      break;\n    // 3 digit representation of the week-numbering year, padded (000-999). (e.g. AD 1 => 001, AD\n    // 2010 => 2010)\n    case 'YYY':\n      formatter = weekNumberingYearGetter(3);\n      break;\n    // 4 digit representation of the week-numbering year (e.g. AD 1 => 0001, AD 2010 => 2010)\n    case 'YYYY':\n      formatter = weekNumberingYearGetter(4);\n      break;\n\n    // Month of the year (1-12), numeric\n    case 'M':\n    case 'L':\n      formatter = dateGetter(DateType.Month, 1, 1);\n      break;\n    case 'MM':\n    case 'LL':\n      formatter = dateGetter(DateType.Month, 2, 1);\n      break;\n\n    // Month of the year (January, ...), string, format\n    case 'MMM':\n      formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Abbreviated);\n      break;\n    case 'MMMM':\n      formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Wide);\n      break;\n    case 'MMMMM':\n      formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Narrow);\n      break;\n\n    // Month of the year (January, ...), string, standalone\n    case 'LLL':\n      formatter = dateStrGetter(\n        TranslationType.Months,\n        TranslationWidth.Abbreviated,\n        FormStyle.Standalone,\n      );\n      break;\n    case 'LLLL':\n      formatter = dateStrGetter(\n        TranslationType.Months,\n        TranslationWidth.Wide,\n        FormStyle.Standalone,\n      );\n      break;\n    case 'LLLLL':\n      formatter = dateStrGetter(\n        TranslationType.Months,\n        TranslationWidth.Narrow,\n        FormStyle.Standalone,\n      );\n      break;\n\n    // Week of the year (1, ... 52)\n    case 'w':\n      formatter = weekGetter(1);\n      break;\n    case 'ww':\n      formatter = weekGetter(2);\n      break;\n\n    // Week of the month (1, ...)\n    case 'W':\n      formatter = weekGetter(1, true);\n      break;\n\n    // Day of the month (1-31)\n    case 'd':\n      formatter = dateGetter(DateType.Date, 1);\n      break;\n    case 'dd':\n      formatter = dateGetter(DateType.Date, 2);\n      break;\n\n    // Day of the Week StandAlone (1, 1, Mon, Monday, M, Mo)\n    case 'c':\n    case 'cc':\n      formatter = dateGetter(DateType.Day, 1);\n      break;\n    case 'ccc':\n      formatter = dateStrGetter(\n        TranslationType.Days,\n        TranslationWidth.Abbreviated,\n        FormStyle.Standalone,\n      );\n      break;\n    case 'cccc':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Wide, FormStyle.Standalone);\n      break;\n    case 'ccccc':\n      formatter = dateStrGetter(\n        TranslationType.Days,\n        TranslationWidth.Narrow,\n        FormStyle.Standalone,\n      );\n      break;\n    case 'cccccc':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Short, FormStyle.Standalone);\n      break;\n\n    // Day of the Week\n    case 'E':\n    case 'EE':\n    case 'EEE':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Abbreviated);\n      break;\n    case 'EEEE':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Wide);\n      break;\n    case 'EEEEE':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Narrow);\n      break;\n    case 'EEEEEE':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Short);\n      break;\n\n    // Generic period of the day (am-pm)\n    case 'a':\n    case 'aa':\n    case 'aaa':\n      formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Abbreviated);\n      break;\n    case 'aaaa':\n      formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Wide);\n      break;\n    case 'aaaaa':\n      formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Narrow);\n      break;\n\n    // Extended period of the day (midnight, at night, ...), standalone\n    case 'b':\n    case 'bb':\n    case 'bbb':\n      formatter = dateStrGetter(\n        TranslationType.DayPeriods,\n        TranslationWidth.Abbreviated,\n        FormStyle.Standalone,\n        true,\n      );\n      break;\n    case 'bbbb':\n      formatter = dateStrGetter(\n        TranslationType.DayPeriods,\n        TranslationWidth.Wide,\n        FormStyle.Standalone,\n        true,\n      );\n      break;\n    case 'bbbbb':\n      formatter = dateStrGetter(\n        TranslationType.DayPeriods,\n        TranslationWidth.Narrow,\n        FormStyle.Standalone,\n        true,\n      );\n      break;\n\n    // Extended period of the day (midnight, night, ...), standalone\n    case 'B':\n    case 'BB':\n    case 'BBB':\n      formatter = dateStrGetter(\n        TranslationType.DayPeriods,\n        TranslationWidth.Abbreviated,\n        FormStyle.Format,\n        true,\n      );\n      break;\n    case 'BBBB':\n      formatter = dateStrGetter(\n        TranslationType.DayPeriods,\n        TranslationWidth.Wide,\n        FormStyle.Format,\n        true,\n      );\n      break;\n    case 'BBBBB':\n      formatter = dateStrGetter(\n        TranslationType.DayPeriods,\n        TranslationWidth.Narrow,\n        FormStyle.Format,\n        true,\n      );\n      break;\n\n    // Hour in AM/PM, (1-12)\n    case 'h':\n      formatter = dateGetter(DateType.Hours, 1, -12);\n      break;\n    case 'hh':\n      formatter = dateGetter(DateType.Hours, 2, -12);\n      break;\n\n    // Hour of the day (0-23)\n    case 'H':\n      formatter = dateGetter(DateType.Hours, 1);\n      break;\n    // Hour in day, padded (00-23)\n    case 'HH':\n      formatter = dateGetter(DateType.Hours, 2);\n      break;\n\n    // Minute of the hour (0-59)\n    case 'm':\n      formatter = dateGetter(DateType.Minutes, 1);\n      break;\n    case 'mm':\n      formatter = dateGetter(DateType.Minutes, 2);\n      break;\n\n    // Second of the minute (0-59)\n    case 's':\n      formatter = dateGetter(DateType.Seconds, 1);\n      break;\n    case 'ss':\n      formatter = dateGetter(DateType.Seconds, 2);\n      break;\n\n    // Fractional second\n    case 'S':\n      formatter = dateGetter(DateType.FractionalSeconds, 1);\n      break;\n    case 'SS':\n      formatter = dateGetter(DateType.FractionalSeconds, 2);\n      break;\n    case 'SSS':\n      formatter = dateGetter(DateType.FractionalSeconds, 3);\n      break;\n\n    // Timezone ISO8601 short format (-0430)\n    case 'Z':\n    case 'ZZ':\n    case 'ZZZ':\n      formatter = timeZoneGetter(ZoneWidth.Short);\n      break;\n    // Timezone ISO8601 extended format (-04:30)\n    case 'ZZZZZ':\n      formatter = timeZoneGetter(ZoneWidth.Extended);\n      break;\n\n    // Timezone GMT short format (GMT+4)\n    case 'O':\n    case 'OO':\n    case 'OOO':\n    // Should be location, but fallback to format O instead because we don't have the data yet\n    case 'z':\n    case 'zz':\n    case 'zzz':\n      formatter = timeZoneGetter(ZoneWidth.ShortGMT);\n      break;\n    // Timezone GMT long format (GMT+0430)\n    case 'OOOO':\n    case 'ZZZZ':\n    // Should be location, but fallback to format O instead because we don't have the data yet\n    case 'zzzz':\n      formatter = timeZoneGetter(ZoneWidth.Long);\n      break;\n    default:\n      return null;\n  }\n  DATE_FORMATS[format] = formatter;\n  return formatter;\n}\n\nfunction timezoneToOffset(timezone: string, fallback: number): number {\n  // Support: IE 11 only, Edge 13-15+\n  // IE/Edge do not \"understand\" colon (`:`) in timezone\n  timezone = timezone.replace(/:/g, '');\n  const requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;\n  return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;\n}\n\nfunction addDateMinutes(date: Date, minutes: number) {\n  date = new Date(date.getTime());\n  date.setMinutes(date.getMinutes() + minutes);\n  return date;\n}\n\nfunction convertTimezoneToLocal(date: Date, timezone: string, reverse: boolean): Date {\n  const reverseValue = reverse ? -1 : 1;\n  const dateTimezoneOffset = date.getTimezoneOffset();\n  const timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n  return addDateMinutes(date, reverseValue * (timezoneOffset - dateTimezoneOffset));\n}\n\n/**\n * Converts a value to date.\n *\n * Supported input formats:\n * - `Date`\n * - number: timestamp\n * - string: numeric (e.g. \"1234\"),    ISO and date strings in a format supported by\n *   [Date.parse()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse).\n *   Note: ISO strings without time return a date without timeoffset.\n *\n * Throws if unable to convert to a date.\n */\nexport function toDate(value: string | number | Date): Date {\n  if (isDate(value)) {\n    return value;\n  }\n\n  if (typeof value === 'number' && !isNaN(value)) {\n    return new Date(value);\n  }\n\n  if (typeof value === 'string') {\n    value = value.trim();\n\n    if (/^(\\d{4}(-\\d{1,2}(-\\d{1,2})?)?)$/.test(value)) {\n      /* For ISO Strings without time the day, month and year must be extracted from the ISO String\n      before Date creation to avoid time offset and errors in the new Date.\n      If we only replace '-' with ',' in the ISO String (\"2015,01,01\"), and try to create a new\n      date, some browsers (e.g. IE 9) will throw an invalid Date error.\n      If we leave the '-' (\"2015-01-01\") and try to create a new Date(\"2015-01-01\") the timeoffset\n      is applied.\n      Note: ISO months are 0 for January, 1 for February, ... */\n      const [y, m = 1, d = 1] = value.split('-').map((val: string) => +val);\n      return createDate(y, m - 1, d);\n    }\n\n    const parsedNb = parseFloat(value);\n\n    // any string that only contains numbers, like \"1234\" but not like \"1234hello\"\n    if (!isNaN((value as any) - parsedNb)) {\n      return new Date(parsedNb);\n    }\n\n    let match: RegExpMatchArray | null;\n    if ((match = value.match(ISO8601_DATE_REGEX))) {\n      return isoStringToDate(match);\n    }\n  }\n\n  const date = new Date(value as any);\n  if (!isDate(date)) {\n    throw new Error(`Unable to convert \"${value}\" into a date`);\n  }\n  return date;\n}\n\n/**\n * Converts a date in ISO8601 to a Date.\n * Used instead of `Date.parse` because of browser discrepancies.\n */\nexport function isoStringToDate(match: RegExpMatchArray): Date {\n  const date = new Date(0);\n  let tzHour = 0;\n  let tzMin = 0;\n\n  // match[8] means that the string contains \"Z\" (UTC) or a timezone like \"+01:00\" or \"+0100\"\n  const dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear;\n  const timeSetter = match[8] ? date.setUTCHours : date.setHours;\n\n  // if there is a timezone defined like \"+01:00\" or \"+0100\"\n  if (match[9]) {\n    tzHour = Number(match[9] + match[10]);\n    tzMin = Number(match[9] + match[11]);\n  }\n  dateSetter.call(date, Number(match[1]), Number(match[2]) - 1, Number(match[3]));\n  const h = Number(match[4] || 0) - tzHour;\n  const m = Number(match[5] || 0) - tzMin;\n  const s = Number(match[6] || 0);\n  // The ECMAScript specification (https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.11)\n  // defines that `DateTime` milliseconds should always be rounded down, so that `999.9ms`\n  // becomes `999ms`.\n  const ms = Math.floor(parseFloat('0.' + (match[7] || 0)) * 1000);\n  timeSetter.call(date, h, m, s, ms);\n  return date;\n}\n\nexport function isDate(value: any): value is Date {\n  return value instanceof Date && !isNaN(value.valueOf());\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  getLocaleNumberFormat,\n  getLocaleNumberSymbol,\n  getNumberOfCurrencyDigits,\n  NumberFormatStyle,\n  NumberSymbol,\n} from './locale_data_api';\n\nexport const NUMBER_FORMAT_REGEXP = /^(\\d+)?\\.((\\d+)(-(\\d+))?)?$/;\nconst MAX_DIGITS = 22;\nconst DECIMAL_SEP = '.';\nconst ZERO_CHAR = '0';\nconst PATTERN_SEP = ';';\nconst GROUP_SEP = ',';\nconst DIGIT_CHAR = '#';\nconst CURRENCY_CHAR = '¤';\nconst PERCENT_CHAR = '%';\n\n/**\n * Transforms a number to a locale string based on a style and a format.\n */\nfunction formatNumberToLocaleString(\n  value: number,\n  pattern: ParsedNumberFormat,\n  locale: string,\n  groupSymbol: NumberSymbol,\n  decimalSymbol: NumberSymbol,\n  digitsInfo?: string,\n  isPercent = false,\n): string {\n  let formattedText = '';\n  let isZero = false;\n\n  if (!isFinite(value)) {\n    formattedText = getLocaleNumberSymbol(locale, NumberSymbol.Infinity);\n  } else {\n    let parsedNumber = parseNumber(value);\n\n    if (isPercent) {\n      parsedNumber = toPercent(parsedNumber);\n    }\n\n    let minInt = pattern.minInt;\n    let minFraction = pattern.minFrac;\n    let maxFraction = pattern.maxFrac;\n\n    if (digitsInfo) {\n      const parts = digitsInfo.match(NUMBER_FORMAT_REGEXP);\n      if (parts === null) {\n        throw new Error(`${digitsInfo} is not a valid digit info`);\n      }\n      const minIntPart = parts[1];\n      const minFractionPart = parts[3];\n      const maxFractionPart = parts[5];\n      if (minIntPart != null) {\n        minInt = parseIntAutoRadix(minIntPart);\n      }\n      if (minFractionPart != null) {\n        minFraction = parseIntAutoRadix(minFractionPart);\n      }\n      if (maxFractionPart != null) {\n        maxFraction = parseIntAutoRadix(maxFractionPart);\n      } else if (minFractionPart != null && minFraction > maxFraction) {\n        maxFraction = minFraction;\n      }\n    }\n\n    roundNumber(parsedNumber, minFraction, maxFraction);\n\n    let digits = parsedNumber.digits;\n    let integerLen = parsedNumber.integerLen;\n    const exponent = parsedNumber.exponent;\n    let decimals = [];\n    isZero = digits.every((d) => !d);\n\n    // pad zeros for small numbers\n    for (; integerLen < minInt; integerLen++) {\n      digits.unshift(0);\n    }\n\n    // pad zeros for small numbers\n    for (; integerLen < 0; integerLen++) {\n      digits.unshift(0);\n    }\n\n    // extract decimals digits\n    if (integerLen > 0) {\n      decimals = digits.splice(integerLen, digits.length);\n    } else {\n      decimals = digits;\n      digits = [0];\n    }\n\n    // format the integer digits with grouping separators\n    const groups = [];\n    if (digits.length >= pattern.lgSize) {\n      groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));\n    }\n\n    while (digits.length > pattern.gSize) {\n      groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));\n    }\n\n    if (digits.length) {\n      groups.unshift(digits.join(''));\n    }\n\n    formattedText = groups.join(getLocaleNumberSymbol(locale, groupSymbol));\n\n    // append the decimal digits\n    if (decimals.length) {\n      formattedText += getLocaleNumberSymbol(locale, decimalSymbol) + decimals.join('');\n    }\n\n    if (exponent) {\n      formattedText += getLocaleNumberSymbol(locale, NumberSymbol.Exponential) + '+' + exponent;\n    }\n  }\n\n  if (value < 0 && !isZero) {\n    formattedText = pattern.negPre + formattedText + pattern.negSuf;\n  } else {\n    formattedText = pattern.posPre + formattedText + pattern.posSuf;\n  }\n\n  return formattedText;\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a number as currency using locale rules.\n *\n * @param value The number to format.\n * @param locale A locale code for the locale format rules to use.\n * @param currency A string containing the currency symbol or its name,\n * such as \"$\" or \"Canadian Dollar\". Used in output string, but does not affect the operation\n * of the function.\n * @param currencyCode The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217)\n * currency code, such as `USD` for the US dollar and `EUR` for the euro.\n * Used to determine the number of digits in the decimal part.\n * @param digitsInfo Decimal representation options, specified by a string in the following format:\n * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.\n *\n * @returns The formatted currency value.\n *\n * @see {@link formatNumber}\n * @see {@link DecimalPipe}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n */\nexport function formatCurrency(\n  value: number,\n  locale: string,\n  currency: string,\n  currencyCode?: string,\n  digitsInfo?: string,\n): string {\n  const format = getLocaleNumberFormat(locale, NumberFormatStyle.Currency);\n  const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));\n\n  pattern.minFrac = getNumberOfCurrencyDigits(currencyCode!);\n  pattern.maxFrac = pattern.minFrac;\n\n  const res = formatNumberToLocaleString(\n    value,\n    pattern,\n    locale,\n    NumberSymbol.CurrencyGroup,\n    NumberSymbol.CurrencyDecimal,\n    digitsInfo,\n  );\n  return (\n    res\n      .replace(CURRENCY_CHAR, currency)\n      // if we have 2 time the currency character, the second one is ignored\n      .replace(CURRENCY_CHAR, '')\n      // If there is a spacing between currency character and the value and\n      // the currency character is suppressed by passing an empty string, the\n      // spacing character would remain as part of the string. Then we\n      // should remove it.\n      .trim()\n  );\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a number as a percentage according to locale rules.\n *\n * @param value The number to format.\n * @param locale A locale code for the locale format rules to use.\n * @param digitsInfo Decimal representation options, specified by a string in the following format:\n * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.\n *\n * @returns The formatted percentage value.\n *\n * @see {@link formatNumber}\n * @see {@link DecimalPipe}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n * @publicApi\n *\n */\nexport function formatPercent(value: number, locale: string, digitsInfo?: string): string {\n  const format = getLocaleNumberFormat(locale, NumberFormatStyle.Percent);\n  const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));\n  const res = formatNumberToLocaleString(\n    value,\n    pattern,\n    locale,\n    NumberSymbol.Group,\n    NumberSymbol.Decimal,\n    digitsInfo,\n    true,\n  );\n  return res.replace(\n    new RegExp(PERCENT_CHAR, 'g'),\n    getLocaleNumberSymbol(locale, NumberSymbol.PercentSign),\n  );\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a number as text, with group sizing, separator, and other\n * parameters based on the locale.\n *\n * @param value The number to format.\n * @param locale A locale code for the locale format rules to use.\n * @param digitsInfo Decimal representation options, specified by a string in the following format:\n * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.\n *\n * @returns The formatted text string.\n * @see [Internationalization (i18n) Guide](guide/i18n)\n *\n * @publicApi\n */\nexport function formatNumber(value: number, locale: string, digitsInfo?: string): string {\n  const format = getLocaleNumberFormat(locale, NumberFormatStyle.Decimal);\n  const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));\n  return formatNumberToLocaleString(\n    value,\n    pattern,\n    locale,\n    NumberSymbol.Group,\n    NumberSymbol.Decimal,\n    digitsInfo,\n  );\n}\n\ninterface ParsedNumberFormat {\n  minInt: number;\n  // the minimum number of digits required in the fraction part of the number\n  minFrac: number;\n  // the maximum number of digits required in the fraction part of the number\n  maxFrac: number;\n  // the prefix for a positive number\n  posPre: string;\n  // the suffix for a positive number\n  posSuf: string;\n  // the prefix for a negative number (e.g. `-` or `(`))\n  negPre: string;\n  // the suffix for a negative number (e.g. `)`)\n  negSuf: string;\n  // number of digits in each group of separated digits\n  gSize: number;\n  // number of digits in the last group of digits before the decimal separator\n  lgSize: number;\n}\n\nfunction parseNumberFormat(format: string, minusSign = '-'): ParsedNumberFormat {\n  const p = {\n    minInt: 1,\n    minFrac: 0,\n    maxFrac: 0,\n    posPre: '',\n    posSuf: '',\n    negPre: '',\n    negSuf: '',\n    gSize: 0,\n    lgSize: 0,\n  };\n\n  const patternParts = format.split(PATTERN_SEP);\n  const positive = patternParts[0];\n  const negative = patternParts[1];\n\n  const positiveParts =\n      positive.indexOf(DECIMAL_SEP) !== -1\n        ? positive.split(DECIMAL_SEP)\n        : [\n            positive.substring(0, positive.lastIndexOf(ZERO_CHAR) + 1),\n            positive.substring(positive.lastIndexOf(ZERO_CHAR) + 1),\n          ],\n    integer = positiveParts[0],\n    fraction = positiveParts[1] || '';\n\n  p.posPre = integer.substring(0, integer.indexOf(DIGIT_CHAR));\n\n  for (let i = 0; i < fraction.length; i++) {\n    const ch = fraction.charAt(i);\n    if (ch === ZERO_CHAR) {\n      p.minFrac = p.maxFrac = i + 1;\n    } else if (ch === DIGIT_CHAR) {\n      p.maxFrac = i + 1;\n    } else {\n      p.posSuf += ch;\n    }\n  }\n\n  const groups = integer.split(GROUP_SEP);\n  p.gSize = groups[1] ? groups[1].length : 0;\n  p.lgSize = groups[2] || groups[1] ? (groups[2] || groups[1]).length : 0;\n\n  if (negative) {\n    const trunkLen = positive.length - p.posPre.length - p.posSuf.length,\n      pos = negative.indexOf(DIGIT_CHAR);\n\n    p.negPre = negative.substring(0, pos).replace(/'/g, '');\n    p.negSuf = negative.slice(pos + trunkLen).replace(/'/g, '');\n  } else {\n    p.negPre = minusSign + p.posPre;\n    p.negSuf = p.posSuf;\n  }\n\n  return p;\n}\n\ninterface ParsedNumber {\n  // an array of digits containing leading zeros as necessary\n  digits: number[];\n  // the exponent for numbers that would need more than `MAX_DIGITS` digits in `d`\n  exponent: number;\n  // the number of the digits in `d` that are to the left of the decimal point\n  integerLen: number;\n}\n\n// Transforms a parsed number into a percentage by multiplying it by 100\nfunction toPercent(parsedNumber: ParsedNumber): ParsedNumber {\n  // if the number is 0, don't do anything\n  if (parsedNumber.digits[0] === 0) {\n    return parsedNumber;\n  }\n\n  // Getting the current number of decimals\n  const fractionLen = parsedNumber.digits.length - parsedNumber.integerLen;\n  if (parsedNumber.exponent) {\n    parsedNumber.exponent += 2;\n  } else {\n    if (fractionLen === 0) {\n      parsedNumber.digits.push(0, 0);\n    } else if (fractionLen === 1) {\n      parsedNumber.digits.push(0);\n    }\n    parsedNumber.integerLen += 2;\n  }\n\n  return parsedNumber;\n}\n\n/**\n * Parses a number.\n * Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/\n */\nfunction parseNumber(num: number): ParsedNumber {\n  let numStr = Math.abs(num) + '';\n  let exponent = 0,\n    digits,\n    integerLen;\n  let i, j, zeros;\n\n  // Decimal point?\n  if ((integerLen = numStr.indexOf(DECIMAL_SEP)) > -1) {\n    numStr = numStr.replace(DECIMAL_SEP, '');\n  }\n\n  // Exponential form?\n  if ((i = numStr.search(/e/i)) > 0) {\n    // Work out the exponent.\n    if (integerLen < 0) integerLen = i;\n    integerLen += +numStr.slice(i + 1);\n    numStr = numStr.substring(0, i);\n  } else if (integerLen < 0) {\n    // There was no decimal point or exponent so it is an integer.\n    integerLen = numStr.length;\n  }\n\n  // Count the number of leading zeros.\n  for (i = 0; numStr.charAt(i) === ZERO_CHAR; i++) {\n    /* empty */\n  }\n\n  if (i === (zeros = numStr.length)) {\n    // The digits are all zero.\n    digits = [0];\n    integerLen = 1;\n  } else {\n    // Count the number of trailing zeros\n    zeros--;\n    while (numStr.charAt(zeros) === ZERO_CHAR) zeros--;\n\n    // Trailing zeros are insignificant so ignore them\n    integerLen -= i;\n    digits = [];\n    // Convert string to array of digits without leading/trailing zeros.\n    for (j = 0; i <= zeros; i++, j++) {\n      digits[j] = Number(numStr.charAt(i));\n    }\n  }\n\n  // If the number overflows the maximum allowed digits then use an exponent.\n  if (integerLen > MAX_DIGITS) {\n    digits = digits.splice(0, MAX_DIGITS - 1);\n    exponent = integerLen - 1;\n    integerLen = 1;\n  }\n\n  return {digits, exponent, integerLen};\n}\n\n/**\n * Round the parsed number to the specified number of decimal places\n * This function changes the parsedNumber in-place\n */\nfunction roundNumber(parsedNumber: ParsedNumber, minFrac: number, maxFrac: number) {\n  if (minFrac > maxFrac) {\n    throw new Error(\n      `The minimum number of digits after fraction (${minFrac}) is higher than the maximum (${maxFrac}).`,\n    );\n  }\n\n  let digits = parsedNumber.digits;\n  let fractionLen = digits.length - parsedNumber.integerLen;\n  const fractionSize = Math.min(Math.max(minFrac, fractionLen), maxFrac);\n\n  // The index of the digit to where rounding is to occur\n  let roundAt = fractionSize + parsedNumber.integerLen;\n  let digit = digits[roundAt];\n\n  if (roundAt > 0) {\n    // Drop fractional digits beyond `roundAt`\n    digits.splice(Math.max(parsedNumber.integerLen, roundAt));\n\n    // Set non-fractional digits beyond `roundAt` to 0\n    for (let j = roundAt; j < digits.length; j++) {\n      digits[j] = 0;\n    }\n  } else {\n    // We rounded to zero so reset the parsedNumber\n    fractionLen = Math.max(0, fractionLen);\n    parsedNumber.integerLen = 1;\n    digits.length = Math.max(1, (roundAt = fractionSize + 1));\n    digits[0] = 0;\n    for (let i = 1; i < roundAt; i++) digits[i] = 0;\n  }\n\n  if (digit >= 5) {\n    if (roundAt - 1 < 0) {\n      for (let k = 0; k > roundAt; k--) {\n        digits.unshift(0);\n        parsedNumber.integerLen++;\n      }\n      digits.unshift(1);\n      parsedNumber.integerLen++;\n    } else {\n      digits[roundAt - 1]++;\n    }\n  }\n\n  // Pad out with zeros to get the required fraction length\n  for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0);\n\n  let dropTrailingZeros = fractionSize !== 0;\n  // Minimal length = nb of decimals required + current nb of integers\n  // Any number besides that is optional and can be removed if it's a trailing 0\n  const minLen = minFrac + parsedNumber.integerLen;\n  // Do any carrying, e.g. a digit was rounded up to 10\n  const carry = digits.reduceRight(function (carry, d, i, digits) {\n    d = d + carry;\n    digits[i] = d < 10 ? d : d - 10; // d % 10\n    if (dropTrailingZeros) {\n      // Do not keep meaningless fractional trailing zeros (e.g. 15.52000 --> 15.52)\n      if (digits[i] === 0 && i >= minLen) {\n        digits.pop();\n      } else {\n        dropTrailingZeros = false;\n      }\n    }\n    return d >= 10 ? 1 : 0; // Math.floor(d / 10);\n  }, 0);\n  if (carry) {\n    digits.unshift(carry);\n    parsedNumber.integerLen++;\n  }\n}\n\nexport function parseIntAutoRadix(text: string): number {\n  const result: number = parseInt(text);\n  if (isNaN(result)) {\n    throw new Error('Invalid integer literal when parsing ' + text);\n  }\n  return result;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Inject, Injectable, LOCALE_ID} from '@angular/core';\n\nimport {getLocalePluralCase, Plural} from './locale_data_api';\n\n/**\n * @publicApi\n */\n@Injectable({\n  providedIn: 'root',\n  useFactory: (locale: string) => new NgLocaleLocalization(locale),\n  deps: [LOCALE_ID],\n})\nexport abstract class NgLocalization {\n  abstract getPluralCategory(value: any, locale?: string): string;\n}\n\n/**\n * Returns the plural category for a given value.\n * - \"=value\" when the case exists,\n * - the plural category otherwise\n */\nexport function getPluralCategory(\n  value: number,\n  cases: string[],\n  ngLocalization: NgLocalization,\n  locale?: string,\n): string {\n  let key = `=${value}`;\n\n  if (cases.indexOf(key) > -1) {\n    return key;\n  }\n\n  key = ngLocalization.getPluralCategory(value, locale);\n\n  if (cases.indexOf(key) > -1) {\n    return key;\n  }\n\n  if (cases.indexOf('other') > -1) {\n    return 'other';\n  }\n\n  throw new Error(`No plural message found for value \"${value}\"`);\n}\n\n/**\n * Returns the plural case based on the locale\n *\n * @publicApi\n */\n@Injectable()\nexport class NgLocaleLocalization extends NgLocalization {\n  constructor(@Inject(LOCALE_ID) protected locale: string) {\n    super();\n  }\n\n  override getPluralCategory(value: any, locale?: string): string {\n    const plural = getLocalePluralCase(locale || this.locale)(value);\n\n    switch (plural) {\n      case Plural.Zero:\n        return 'zero';\n      case Plural.One:\n        return 'one';\n      case Plural.Two:\n        return 'two';\n      case Plural.Few:\n        return 'few';\n      case Plural.Many:\n        return 'many';\n      default:\n        return 'other';\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {\n  Directive,\n  DoCheck,\n  ElementRef,\n  Input,\n  Renderer2,\n  ɵstringify as stringify,\n} from '@angular/core';\n\ntype NgClassSupportedTypes = string[] | Set<string> | {[klass: string]: any} | null | undefined;\n\nconst WS_REGEXP = /\\s+/;\n\nconst EMPTY_ARRAY: string[] = [];\n\n/**\n * Represents internal object used to track state of each CSS class. There are 3 different (boolean)\n * flags that, combined together, indicate state of a given CSS class:\n * - enabled: indicates if a class should be present in the DOM (true) or not (false);\n * - changed: tracks if a class was toggled (added or removed) during the custom dirty-checking\n * process; changed classes must be synchronized with the DOM;\n * - touched: tracks if a class is present in the current object bound to the class / ngClass input;\n * classes that are not present any more can be removed from the internal data structures;\n */\ninterface CssClassState {\n  // PERF: could use a bit mask to represent state as all fields are boolean flags\n  enabled: boolean;\n  changed: boolean;\n  touched: boolean;\n}\n\n/**\n * @ngModule CommonModule\n *\n * @usageNotes\n * ```html\n * <some-element [ngClass]=\"stringExp|arrayExp|objExp|Set\">...</some-element>\n *\n * <some-element [ngClass]=\"{'class1 class2 class3' : true}\">...</some-element>\n * ```\n *\n * For more simple use cases you can use the [class bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly.\n * It doesn't require importing a directive.\n *\n * ```html\n * <some-element [class]=\"'first second'\">...</some-element>\n *\n * <some-element [class.expanded]=\"isExpanded\">...</some-element>\n *\n * <some-element [class]=\"['first', 'second']\">...</some-element>\n *\n * <some-element [class]=\"{'first': true, 'second': true, 'third': false}\">...</some-element>\n * ```\n * @description\n *\n * Adds and removes CSS classes on an HTML element.\n *\n * The CSS classes are updated as follows, depending on the type of the expression evaluation:\n * - `string` - the CSS classes listed in the string (space delimited) are added,\n * - `Array` - the CSS classes declared as Array elements are added,\n * - `Object` - keys are CSS classes that get added when the expression given in the value\n *              evaluates to a truthy value, otherwise they are removed.\n *\n *\n * @see [Class bindings](/guide/templates/binding#css-class-and-style-property-bindings)\n *\n * @publicApi\n */\n@Directive({\n  selector: '[ngClass]',\n})\nexport class NgClass implements DoCheck {\n  private initialClasses = EMPTY_ARRAY;\n  private rawClass: NgClassSupportedTypes;\n\n  private stateMap = new Map<string, CssClassState>();\n\n  constructor(\n    private _ngEl: ElementRef,\n    private _renderer: Renderer2,\n  ) {}\n\n  @Input('class')\n  set klass(value: string) {\n    this.initialClasses = value != null ? value.trim().split(WS_REGEXP) : EMPTY_ARRAY;\n  }\n\n  @Input('ngClass')\n  set ngClass(value: string | string[] | Set<string> | {[klass: string]: any} | null | undefined) {\n    this.rawClass = typeof value === 'string' ? value.trim().split(WS_REGEXP) : value;\n  }\n\n  /*\n  The NgClass directive uses the custom change detection algorithm for its inputs. The custom\n  algorithm is necessary since inputs are represented as complex object or arrays that need to be\n  deeply-compared.\n\n  This algorithm is perf-sensitive since NgClass is used very frequently and its poor performance\n  might negatively impact runtime performance of the entire change detection cycle. The design of\n  this algorithm is making sure that:\n  - there is no unnecessary DOM manipulation (CSS classes are added / removed from the DOM only when\n  needed), even if references to bound objects change;\n  - there is no memory allocation if nothing changes (even relatively modest memory allocation\n  during the change detection cycle can result in GC pauses for some of the CD cycles).\n\n  The algorithm works by iterating over the set of bound classes, staring with [class] binding and\n  then going over [ngClass] binding. For each CSS class name:\n  - check if it was seen before (this information is tracked in the state map) and if its value\n  changed;\n  - mark it as \"touched\" - names that are not marked are not present in the latest set of binding\n  and we can remove such class name from the internal data structures;\n\n  After iteration over all the CSS class names we've got data structure with all the information\n  necessary to synchronize changes to the DOM - it is enough to iterate over the state map, flush\n  changes to the DOM and reset internal data structures so those are ready for the next change\n  detection cycle.\n   */\n  ngDoCheck(): void {\n    // classes from the [class] binding\n    for (const klass of this.initialClasses) {\n      this._updateState(klass, true);\n    }\n\n    // classes from the [ngClass] binding\n    const rawClass = this.rawClass;\n    if (Array.isArray(rawClass) || rawClass instanceof Set) {\n      for (const klass of rawClass) {\n        this._updateState(klass, true);\n      }\n    } else if (rawClass != null) {\n      for (const klass of Object.keys(rawClass)) {\n        this._updateState(klass, Boolean(rawClass[klass]));\n      }\n    }\n\n    this._applyStateDiff();\n  }\n\n  private _updateState(klass: string, nextEnabled: boolean) {\n    const state = this.stateMap.get(klass);\n    if (state !== undefined) {\n      if (state.enabled !== nextEnabled) {\n        state.changed = true;\n        state.enabled = nextEnabled;\n      }\n      state.touched = true;\n    } else {\n      this.stateMap.set(klass, {enabled: nextEnabled, changed: true, touched: true});\n    }\n  }\n\n  private _applyStateDiff() {\n    for (const stateEntry of this.stateMap) {\n      const klass = stateEntry[0];\n      const state = stateEntry[1];\n\n      if (state.changed) {\n        this._toggleClass(klass, state.enabled);\n        state.changed = false;\n      } else if (!state.touched) {\n        // A class that was previously active got removed from the new collection of classes -\n        // remove from the DOM as well.\n        if (state.enabled) {\n          this._toggleClass(klass, false);\n        }\n        this.stateMap.delete(klass);\n      }\n\n      state.touched = false;\n    }\n  }\n\n  private _toggleClass(klass: string, enabled: boolean): void {\n    if (ngDevMode) {\n      if (typeof klass !== 'string') {\n        throw new Error(\n          `NgClass can only toggle CSS classes expressed as strings, got ${stringify(klass)}`,\n        );\n      }\n    }\n    klass = klass.trim();\n    if (klass.length > 0) {\n      klass.split(WS_REGEXP).forEach((klass) => {\n        if (enabled) {\n          this._renderer.addClass(this._ngEl.nativeElement, klass);\n        } else {\n          this._renderer.removeClass(this._ngEl.nativeElement, klass);\n        }\n      });\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ComponentRef,\n  createNgModule,\n  Directive,\n  DoCheck,\n  Injector,\n  Input,\n  NgModuleFactory,\n  NgModuleRef,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  Type,\n  ViewContainerRef,\n} from '@angular/core';\n\n/**\n * Instantiates a {@link /api/core/Component Component} type and inserts its Host View into the current View.\n * `NgComponentOutlet` provides a declarative approach for dynamic component creation.\n *\n * `NgComponentOutlet` requires a component type, if a falsy value is set the view will clear and\n * any existing component will be destroyed.\n *\n * @usageNotes\n *\n * ### Fine tune control\n *\n * You can control the component creation process by using the following optional attributes:\n *\n * * `ngComponentOutletInputs`: Optional component inputs object, which will be bind to the\n * component.\n *\n * * `ngComponentOutletInjector`: Optional custom {@link Injector} that will be used as parent for\n * the Component. Defaults to the injector of the current view container.\n *\n * * `ngComponentOutletContent`: Optional list of projectable nodes to insert into the content\n * section of the component, if it exists.\n *\n * * `ngComponentOutletNgModule`: Optional NgModule class reference to allow loading another\n * module dynamically, then loading a component from that module.\n *\n * * `ngComponentOutletNgModuleFactory`: Deprecated config option that allows providing optional\n * NgModule factory to allow loading another module dynamically, then loading a component from that\n * module. Use `ngComponentOutletNgModule` instead.\n *\n * ### Syntax\n *\n * Simple\n * ```html\n * <ng-container *ngComponentOutlet=\"componentTypeExpression\"></ng-container>\n * ```\n *\n * With inputs\n * ```html\n * <ng-container *ngComponentOutlet=\"componentTypeExpression;\n *                                   inputs: inputsExpression;\">\n * </ng-container>\n * ```\n *\n * Customized injector/content\n * ```html\n * <ng-container *ngComponentOutlet=\"componentTypeExpression;\n *                                   injector: injectorExpression;\n *                                   content: contentNodesExpression;\">\n * </ng-container>\n * ```\n *\n * Customized NgModule reference\n * ```html\n * <ng-container *ngComponentOutlet=\"componentTypeExpression;\n *                                   ngModule: ngModuleClass;\">\n * </ng-container>\n * ```\n *\n * ### A simple example\n *\n * {@example common/ngComponentOutlet/ts/module.ts region='SimpleExample'}\n *\n * A more complete example with additional options:\n *\n * {@example common/ngComponentOutlet/ts/module.ts region='CompleteExample'}\n *\n * @publicApi\n * @ngModule CommonModule\n */\n@Directive({\n  selector: '[ngComponentOutlet]',\n  exportAs: 'ngComponentOutlet',\n})\nexport class NgComponentOutlet<T = any> implements OnChanges, DoCheck, OnDestroy {\n  // TODO(crisbeto): this should be `Type<T>`, but doing so broke a few\n  // targets in a TGP so we need to do it in a major version.\n  /** Component that should be rendered in the outlet. */\n  @Input() ngComponentOutlet: Type<any> | null = null;\n\n  @Input() ngComponentOutletInputs?: Record<string, unknown>;\n  @Input() ngComponentOutletInjector?: Injector;\n  @Input() ngComponentOutletContent?: any[][];\n\n  @Input() ngComponentOutletNgModule?: Type<any>;\n  /**\n   * @deprecated This input is deprecated, use `ngComponentOutletNgModule` instead.\n   */\n  @Input() ngComponentOutletNgModuleFactory?: NgModuleFactory<any>;\n\n  private _componentRef: ComponentRef<T> | undefined;\n  private _moduleRef: NgModuleRef<any> | undefined;\n\n  /**\n   * A helper data structure that allows us to track inputs that were part of the\n   * ngComponentOutletInputs expression. Tracking inputs is necessary for proper removal of ones\n   * that are no longer referenced.\n   */\n  private _inputsUsed = new Map<string, boolean>();\n\n  /**\n   * Gets the instance of the currently-rendered component.\n   * Will be null if no component has been rendered.\n   */\n  get componentInstance(): T | null {\n    return this._componentRef?.instance ?? null;\n  }\n\n  constructor(private _viewContainerRef: ViewContainerRef) {}\n\n  private _needToReCreateNgModuleInstance(changes: SimpleChanges): boolean {\n    // Note: square brackets property accessor is safe for Closure compiler optimizations (the\n    // `changes` argument of the `ngOnChanges` lifecycle hook retains the names of the fields that\n    // were changed).\n    return (\n      changes['ngComponentOutletNgModule'] !== undefined ||\n      changes['ngComponentOutletNgModuleFactory'] !== undefined\n    );\n  }\n\n  private _needToReCreateComponentInstance(changes: SimpleChanges): boolean {\n    // Note: square brackets property accessor is safe for Closure compiler optimizations (the\n    // `changes` argument of the `ngOnChanges` lifecycle hook retains the names of the fields that\n    // were changed).\n    return (\n      changes['ngComponentOutlet'] !== undefined ||\n      changes['ngComponentOutletContent'] !== undefined ||\n      changes['ngComponentOutletInjector'] !== undefined ||\n      this._needToReCreateNgModuleInstance(changes)\n    );\n  }\n\n  /** @docs-private */\n  ngOnChanges(changes: SimpleChanges) {\n    if (this._needToReCreateComponentInstance(changes)) {\n      this._viewContainerRef.clear();\n      this._inputsUsed.clear();\n      this._componentRef = undefined;\n\n      if (this.ngComponentOutlet) {\n        const injector = this.ngComponentOutletInjector || this._viewContainerRef.parentInjector;\n\n        if (this._needToReCreateNgModuleInstance(changes)) {\n          this._moduleRef?.destroy();\n\n          if (this.ngComponentOutletNgModule) {\n            this._moduleRef = createNgModule(\n              this.ngComponentOutletNgModule,\n              getParentInjector(injector),\n            );\n          } else if (this.ngComponentOutletNgModuleFactory) {\n            this._moduleRef = this.ngComponentOutletNgModuleFactory.create(\n              getParentInjector(injector),\n            );\n          } else {\n            this._moduleRef = undefined;\n          }\n        }\n\n        this._componentRef = this._viewContainerRef.createComponent(this.ngComponentOutlet, {\n          injector,\n          ngModuleRef: this._moduleRef,\n          projectableNodes: this.ngComponentOutletContent,\n        });\n      }\n    }\n  }\n\n  /** @docs-private */\n  ngDoCheck() {\n    if (this._componentRef) {\n      if (this.ngComponentOutletInputs) {\n        for (const inputName of Object.keys(this.ngComponentOutletInputs)) {\n          this._inputsUsed.set(inputName, true);\n        }\n      }\n\n      this._applyInputStateDiff(this._componentRef);\n    }\n  }\n\n  /** @docs-private */\n  ngOnDestroy() {\n    this._moduleRef?.destroy();\n  }\n\n  private _applyInputStateDiff(componentRef: ComponentRef<unknown>) {\n    for (const [inputName, touched] of this._inputsUsed) {\n      if (!touched) {\n        // The input that was previously active no longer exists and needs to be set to undefined.\n        componentRef.setInput(inputName, undefined);\n        this._inputsUsed.delete(inputName);\n      } else {\n        // Since touched is true, it can be asserted that the inputs object is not empty.\n        componentRef.setInput(inputName, this.ngComponentOutletInputs![inputName]);\n        this._inputsUsed.set(inputName, false);\n      }\n    }\n  }\n}\n\n// Helper function that returns an Injector instance of a parent NgModule.\nfunction getParentInjector(injector: Injector): Injector {\n  const parentNgModule = injector.get(NgModuleRef);\n  return parentNgModule.injector;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Directive,\n  DoCheck,\n  EmbeddedViewRef,\n  Input,\n  IterableChangeRecord,\n  IterableChanges,\n  IterableDiffer,\n  IterableDiffers,\n  NgIterable,\n  ɵRuntimeError as RuntimeError,\n  TemplateRef,\n  TrackByFunction,\n  ViewContainerRef,\n} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../errors';\n\n/**\n * @publicApi\n */\nexport class NgForOfContext<T, U extends NgIterable<T> = NgIterable<T>> {\n  constructor(\n    /** Reference to the current item from the collection. */\n    public $implicit: T,\n\n    /**\n     * The value of the iterable expression. Useful when the expression is\n     * more complex then a property access, for example when using the async pipe\n     * (`userStreams | async`).\n     */\n    public ngForOf: U,\n\n    /** Returns an index of the current item in the collection. */\n    public index: number,\n\n    /** Returns total amount of items in the collection. */\n    public count: number,\n  ) {}\n\n  // Indicates whether this is the first item in the collection.\n  get first(): boolean {\n    return this.index === 0;\n  }\n\n  // Indicates whether this is the last item in the collection.\n  get last(): boolean {\n    return this.index === this.count - 1;\n  }\n\n  // Indicates whether an index of this item in the collection is even.\n  get even(): boolean {\n    return this.index % 2 === 0;\n  }\n\n  // Indicates whether an index of this item in the collection is odd.\n  get odd(): boolean {\n    return !this.even;\n  }\n}\n\n/**\n * A [structural directive](guide/directives/structural-directives) that renders\n * a template for each item in a collection.\n * The directive is placed on an element, which becomes the parent\n * of the cloned templates.\n *\n * The `ngForOf` directive is generally used in the\n * [shorthand form](guide/directives/structural-directives#asterisk) `*ngFor`.\n * In this form, the template to be rendered for each iteration is the content\n * of an anchor element containing the directive.\n *\n * The following example shows the shorthand syntax with some options,\n * contained in an `<li>` element.\n *\n * ```html\n * <li *ngFor=\"let item of items; index as i; trackBy: trackByFn\">...</li>\n * ```\n *\n * The shorthand form expands into a long form that uses the `ngForOf` selector\n * on an `<ng-template>` element.\n * The content of the `<ng-template>` element is the `<li>` element that held the\n * short-form directive.\n *\n * Here is the expanded version of the short-form example.\n *\n * ```html\n * <ng-template ngFor let-item [ngForOf]=\"items\" let-i=\"index\" [ngForTrackBy]=\"trackByFn\">\n *   <li>...</li>\n * </ng-template>\n * ```\n *\n * Angular automatically expands the shorthand syntax as it compiles the template.\n * The context for each embedded view is logically merged to the current component\n * context according to its lexical position.\n *\n * When using the shorthand syntax, Angular allows only [one structural directive\n * on an element](guide/directives/structural-directives#one-per-element).\n * If you want to iterate conditionally, for example,\n * put the `*ngIf` on a container element that wraps the `*ngFor` element.\n * For further discussion, see\n * [Structural Directives](guide/directives/structural-directives#one-per-element).\n *\n * @usageNotes\n *\n * ### Local variables\n *\n * `NgForOf` provides exported values that can be aliased to local variables.\n * For example:\n *\n *  ```html\n * <li *ngFor=\"let user of users; index as i; first as isFirst\">\n *    {{i}}/{{users.length}}. {{user}} <span *ngIf=\"isFirst\">default</span>\n * </li>\n * ```\n *\n * The following exported values can be aliased to local variables:\n *\n * - `$implicit: T`: The value of the individual items in the iterable (`ngForOf`).\n * - `ngForOf: NgIterable<T>`: The value of the iterable expression. Useful when the expression is\n * more complex then a property access, for example when using the async pipe (`userStreams |\n * async`).\n * - `index: number`: The index of the current item in the iterable.\n * - `count: number`: The length of the iterable.\n * - `first: boolean`: True when the item is the first item in the iterable.\n * - `last: boolean`: True when the item is the last item in the iterable.\n * - `even: boolean`: True when the item has an even index in the iterable.\n * - `odd: boolean`: True when the item has an odd index in the iterable.\n *\n * ### Change propagation\n *\n * When the contents of the iterator changes, `NgForOf` makes the corresponding changes to the DOM:\n *\n * * When an item is added, a new instance of the template is added to the DOM.\n * * When an item is removed, its template instance is removed from the DOM.\n * * When items are reordered, their respective templates are reordered in the DOM.\n *\n * Angular uses object identity to track insertions and deletions within the iterator and reproduce\n * those changes in the DOM. This has important implications for animations and any stateful\n * controls that are present, such as `<input>` elements that accept user input. Inserted rows can\n * be animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state\n * such as user input.\n * For more on animations, see [Transitions and Triggers](guide/animations/transition-and-triggers).\n *\n * The identities of elements in the iterator can change while the data does not.\n * This can happen, for example, if the iterator is produced from an RPC to the server, and that\n * RPC is re-run. Even if the data hasn't changed, the second response produces objects with\n * different identities, and Angular must tear down the entire DOM and rebuild it (as if all old\n * elements were deleted and all new elements inserted).\n *\n * To avoid this expensive operation, you can customize the default tracking algorithm.\n * by supplying the `trackBy` option to `NgForOf`.\n * `trackBy` takes a function that has two arguments: `index` and `item`.\n * If `trackBy` is given, Angular tracks changes by the return value of the function.\n *\n * @see [Structural Directives](guide/directives/structural-directives)\n * @ngModule CommonModule\n * @publicApi\n */\n@Directive({\n  selector: '[ngFor][ngForOf]',\n})\nexport class NgForOf<T, U extends NgIterable<T> = NgIterable<T>> implements DoCheck {\n  /**\n   * The value of the iterable expression, which can be used as a\n   * [template input variable](guide/directives/structural-directives#shorthand).\n   */\n  @Input()\n  set ngForOf(ngForOf: (U & NgIterable<T>) | undefined | null) {\n    this._ngForOf = ngForOf;\n    this._ngForOfDirty = true;\n  }\n  /**\n   * Specifies a custom `TrackByFunction` to compute the identity of items in an iterable.\n   *\n   * If a custom `TrackByFunction` is not provided, `NgForOf` will use the item's [object\n   * identity](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)\n   * as the key.\n   *\n   * `NgForOf` uses the computed key to associate items in an iterable with DOM elements\n   * it produces for these items.\n   *\n   * A custom `TrackByFunction` is useful to provide good user experience in cases when items in an\n   * iterable rendered using `NgForOf` have a natural identifier (for example, custom ID or a\n   * primary key), and this iterable could be updated with new object instances that still\n   * represent the same underlying entity (for example, when data is re-fetched from the server,\n   * and the iterable is recreated and re-rendered, but most of the data is still the same).\n   *\n   * @see {@link TrackByFunction}\n   */\n  @Input()\n  set ngForTrackBy(fn: TrackByFunction<T>) {\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && fn != null && typeof fn !== 'function') {\n      console.warn(\n        `trackBy must be a function, but received ${JSON.stringify(fn)}. ` +\n          `See https://angular.io/api/common/NgForOf#change-propagation for more information.`,\n      );\n    }\n    this._trackByFn = fn;\n  }\n\n  get ngForTrackBy(): TrackByFunction<T> {\n    return this._trackByFn;\n  }\n\n  private _ngForOf: U | undefined | null = null;\n  private _ngForOfDirty: boolean = true;\n  private _differ: IterableDiffer<T> | null = null;\n  // waiting for microsoft/typescript#43662 to allow the return type `TrackByFunction|undefined` for\n  // the getter\n  private _trackByFn!: TrackByFunction<T>;\n\n  constructor(\n    private _viewContainer: ViewContainerRef,\n    private _template: TemplateRef<NgForOfContext<T, U>>,\n    private _differs: IterableDiffers,\n  ) {}\n\n  /**\n   * A reference to the template that is stamped out for each item in the iterable.\n   * @see [template reference variable](guide/templates/variables#template-reference-variables)\n   */\n  @Input()\n  set ngForTemplate(value: TemplateRef<NgForOfContext<T, U>>) {\n    // TODO(TS2.1): make TemplateRef<Partial<NgForRowOf<T>>> once we move to TS v2.1\n    // The current type is too restrictive; a template that just uses index, for example,\n    // should be acceptable.\n    if (value) {\n      this._template = value;\n    }\n  }\n\n  /**\n   * Applies the changes when needed.\n   * @docs-private\n   */\n  ngDoCheck(): void {\n    if (this._ngForOfDirty) {\n      this._ngForOfDirty = false;\n      // React on ngForOf changes only once all inputs have been initialized\n      const value = this._ngForOf;\n      if (!this._differ && value) {\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n          try {\n            // CAUTION: this logic is duplicated for production mode below, as the try-catch\n            // is only present in development builds.\n            this._differ = this._differs.find(value).create(this.ngForTrackBy);\n          } catch {\n            let errorMessage =\n              `Cannot find a differ supporting object '${value}' of type '` +\n              `${getTypeName(value)}'. NgFor only supports binding to Iterables, such as Arrays.`;\n            if (typeof value === 'object') {\n              errorMessage += ' Did you mean to use the keyvalue pipe?';\n            }\n            throw new RuntimeError(RuntimeErrorCode.NG_FOR_MISSING_DIFFER, errorMessage);\n          }\n        } else {\n          // CAUTION: this logic is duplicated for development mode above, as the try-catch\n          // is only present in development builds.\n          this._differ = this._differs.find(value).create(this.ngForTrackBy);\n        }\n      }\n    }\n    if (this._differ) {\n      const changes = this._differ.diff(this._ngForOf);\n      if (changes) this._applyChanges(changes);\n    }\n  }\n\n  private _applyChanges(changes: IterableChanges<T>) {\n    const viewContainer = this._viewContainer;\n    changes.forEachOperation(\n      (\n        item: IterableChangeRecord<T>,\n        adjustedPreviousIndex: number | null,\n        currentIndex: number | null,\n      ) => {\n        if (item.previousIndex == null) {\n          // NgForOf is never \"null\" or \"undefined\" here because the differ detected\n          // that a new item needs to be inserted from the iterable. This implies that\n          // there is an iterable value for \"_ngForOf\".\n          viewContainer.createEmbeddedView(\n            this._template,\n            new NgForOfContext<T, U>(item.item, this._ngForOf!, -1, -1),\n            currentIndex === null ? undefined : currentIndex,\n          );\n        } else if (currentIndex == null) {\n          viewContainer.remove(adjustedPreviousIndex === null ? undefined : adjustedPreviousIndex);\n        } else if (adjustedPreviousIndex !== null) {\n          const view = viewContainer.get(adjustedPreviousIndex)!;\n          viewContainer.move(view, currentIndex);\n          applyViewChange(view as EmbeddedViewRef<NgForOfContext<T, U>>, item);\n        }\n      },\n    );\n\n    for (let i = 0, ilen = viewContainer.length; i < ilen; i++) {\n      const viewRef = <EmbeddedViewRef<NgForOfContext<T, U>>>viewContainer.get(i);\n      const context = viewRef.context;\n      context.index = i;\n      context.count = ilen;\n      context.ngForOf = this._ngForOf!;\n    }\n\n    changes.forEachIdentityChange((record: any) => {\n      const viewRef = <EmbeddedViewRef<NgForOfContext<T, U>>>viewContainer.get(record.currentIndex);\n      applyViewChange(viewRef, record);\n    });\n  }\n\n  /**\n   * Asserts the correct type of the context for the template that `NgForOf` will render.\n   *\n   * The presence of this method is a signal to the Ivy template type-check compiler that the\n   * `NgForOf` structural directive renders its template with a specific context type.\n   */\n  static ngTemplateContextGuard<T, U extends NgIterable<T>>(\n    dir: NgForOf<T, U>,\n    ctx: any,\n  ): ctx is NgForOfContext<T, U> {\n    return true;\n  }\n}\n\n// Also export the `NgForOf` class as `NgFor` to improve the DX for\n// cases when the directive is used as standalone, so the class name\n// matches the CSS selector (*ngFor).\nexport {NgForOf as NgFor};\n\nfunction applyViewChange<T>(\n  view: EmbeddedViewRef<NgForOfContext<T>>,\n  record: IterableChangeRecord<T>,\n) {\n  view.context.$implicit = record.item;\n}\n\nfunction getTypeName(type: any): string {\n  return type['name'] || typeof type;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Directive,\n  EmbeddedViewRef,\n  Input,\n  TemplateRef,\n  ViewContainerRef,\n  ɵstringify as stringify,\n  ɵRuntimeError as RuntimeError,\n} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../errors';\n\n/**\n * A structural directive that conditionally includes a template based on the value of\n * an expression coerced to Boolean.\n * When the expression evaluates to true, Angular renders the template\n * provided in a `then` clause, and when  false or null,\n * Angular renders the template provided in an optional `else` clause. The default\n * template for the `else` clause is blank.\n *\n * A [shorthand form](guide/directives/structural-directives#asterisk) of the directive,\n * `*ngIf=\"condition\"`, is generally used, provided\n * as an attribute of the anchor element for the inserted template.\n * Angular expands this into a more explicit version, in which the anchor element\n * is contained in an `<ng-template>` element.\n *\n * Simple form with shorthand syntax:\n *\n * ```html\n * <div *ngIf=\"condition\">Content to render when condition is true.</div>\n * ```\n *\n * Simple form with expanded syntax:\n *\n * ```html\n * <ng-template [ngIf]=\"condition\"><div>Content to render when condition is\n * true.</div></ng-template>\n * ```\n *\n * Form with an \"else\" block:\n *\n * ```html\n * <div *ngIf=\"condition; else elseBlock\">Content to render when condition is true.</div>\n * <ng-template #elseBlock>Content to render when condition is false.</ng-template>\n * ```\n *\n * Shorthand form with \"then\" and \"else\" blocks:\n *\n * ```html\n * <div *ngIf=\"condition; then thenBlock else elseBlock\"></div>\n * <ng-template #thenBlock>Content to render when condition is true.</ng-template>\n * <ng-template #elseBlock>Content to render when condition is false.</ng-template>\n * ```\n *\n * Form with storing the value locally:\n *\n * ```html\n * <div *ngIf=\"condition as value; else elseBlock\">{{value}}</div>\n * <ng-template #elseBlock>Content to render when value is null.</ng-template>\n * ```\n *\n * @usageNotes\n *\n * The `*ngIf` directive is most commonly used to conditionally show an inline template,\n * as seen in the following  example.\n * The default `else` template is blank.\n *\n * {@example common/ngIf/ts/module.ts region='NgIfSimple'}\n *\n * ### Showing an alternative template using `else`\n *\n * To display a template when `expression` evaluates to false, use an `else` template\n * binding as shown in the following example.\n * The `else` binding points to an `<ng-template>`  element labeled `#elseBlock`.\n * The template can be defined anywhere in the component view, but is typically placed right after\n * `ngIf` for readability.\n *\n * {@example common/ngIf/ts/module.ts region='NgIfElse'}\n *\n * ### Using an external `then` template\n *\n * In the previous example, the then-clause template is specified inline, as the content of the\n * tag that contains the `ngIf` directive. You can also specify a template that is defined\n * externally, by referencing a labeled `<ng-template>` element. When you do this, you can\n * change which template to use at runtime, as shown in the following example.\n *\n * {@example common/ngIf/ts/module.ts region='NgIfThenElse'}\n *\n * ### Storing a conditional result in a variable\n *\n * You might want to show a set of properties from the same object. If you are waiting\n * for asynchronous data, the object can be undefined.\n * In this case, you can use `ngIf` and store the result of the condition in a local\n * variable as shown in the following example.\n *\n * {@example common/ngIf/ts/module.ts region='NgIfAs'}\n *\n * This code uses only one `AsyncPipe`, so only one subscription is created.\n * The conditional statement stores the result of `userStream|async` in the local variable `user`.\n * You can then bind the local `user` repeatedly.\n *\n * The conditional displays the data only if `userStream` returns a value,\n * so you don't need to use the\n * safe-navigation-operator (`?.`)\n * to guard against null values when accessing properties.\n * You can display an alternative template while waiting for the data.\n *\n * ### Shorthand syntax\n *\n * The shorthand syntax `*ngIf` expands into two separate template specifications\n * for the \"then\" and \"else\" clauses. For example, consider the following shorthand statement,\n * that is meant to show a loading page while waiting for data to be loaded.\n *\n * ```html\n * <div class=\"hero-list\" *ngIf=\"heroes else loading\">\n *  ...\n * </div>\n *\n * <ng-template #loading>\n *  <div>Loading...</div>\n * </ng-template>\n * ```\n *\n * You can see that the \"else\" clause references the `<ng-template>`\n * with the `#loading` label, and the template for the \"then\" clause\n * is provided as the content of the anchor element.\n *\n * However, when Angular expands the shorthand syntax, it creates\n * another `<ng-template>` tag, with `ngIf` and `ngIfElse` directives.\n * The anchor element containing the template for the \"then\" clause becomes\n * the content of this unlabeled `<ng-template>` tag.\n *\n * ```html\n * <ng-template [ngIf]=\"heroes\" [ngIfElse]=\"loading\">\n *  <div class=\"hero-list\">\n *   ...\n *  </div>\n * </ng-template>\n *\n * <ng-template #loading>\n *  <div>Loading...</div>\n * </ng-template>\n * ```\n *\n * The presence of the implicit template object has implications for the nesting of\n * structural directives. For more on this subject, see\n * [Structural Directives](guide/directives/structural-directives#one-per-element).\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Directive({\n  selector: '[ngIf]',\n})\nexport class NgIf<T = unknown> {\n  private _context: NgIfContext<T> = new NgIfContext<T>();\n  private _thenTemplateRef: TemplateRef<NgIfContext<T>> | null = null;\n  private _elseTemplateRef: TemplateRef<NgIfContext<T>> | null = null;\n  private _thenViewRef: EmbeddedViewRef<NgIfContext<T>> | null = null;\n  private _elseViewRef: EmbeddedViewRef<NgIfContext<T>> | null = null;\n\n  constructor(\n    private _viewContainer: ViewContainerRef,\n    templateRef: TemplateRef<NgIfContext<T>>,\n  ) {\n    this._thenTemplateRef = templateRef;\n  }\n\n  /**\n   * The Boolean expression to evaluate as the condition for showing a template.\n   */\n  @Input()\n  set ngIf(condition: T) {\n    this._context.$implicit = this._context.ngIf = condition;\n    this._updateView();\n  }\n\n  /**\n   * A template to show if the condition expression evaluates to true.\n   */\n  @Input()\n  set ngIfThen(templateRef: TemplateRef<NgIfContext<T>> | null) {\n    assertTemplate(templateRef, (typeof ngDevMode === 'undefined' || ngDevMode) && 'ngIfThen');\n    this._thenTemplateRef = templateRef;\n    this._thenViewRef = null; // clear previous view if any.\n    this._updateView();\n  }\n\n  /**\n   * A template to show if the condition expression evaluates to false.\n   */\n  @Input()\n  set ngIfElse(templateRef: TemplateRef<NgIfContext<T>> | null) {\n    assertTemplate(templateRef, (typeof ngDevMode === 'undefined' || ngDevMode) && 'ngIfElse');\n    this._elseTemplateRef = templateRef;\n    this._elseViewRef = null; // clear previous view if any.\n    this._updateView();\n  }\n\n  private _updateView() {\n    if (this._context.$implicit) {\n      if (!this._thenViewRef) {\n        this._viewContainer.clear();\n        this._elseViewRef = null;\n        if (this._thenTemplateRef) {\n          this._thenViewRef = this._viewContainer.createEmbeddedView(\n            this._thenTemplateRef,\n            this._context,\n          );\n        }\n      }\n    } else {\n      if (!this._elseViewRef) {\n        this._viewContainer.clear();\n        this._thenViewRef = null;\n        if (this._elseTemplateRef) {\n          this._elseViewRef = this._viewContainer.createEmbeddedView(\n            this._elseTemplateRef,\n            this._context,\n          );\n        }\n      }\n    }\n  }\n\n  /** @internal */\n  public static ngIfUseIfTypeGuard: void;\n\n  /**\n   * Assert the correct type of the expression bound to the `ngIf` input within the template.\n   *\n   * The presence of this static field is a signal to the Ivy template type check compiler that\n   * when the `NgIf` structural directive renders its template, the type of the expression bound\n   * to `ngIf` should be narrowed in some way. For `NgIf`, the binding expression itself is used to\n   * narrow its type, which allows the strictNullChecks feature of TypeScript to work with `NgIf`.\n   */\n  static ngTemplateGuard_ngIf: 'binding';\n\n  /**\n   * Asserts the correct type of the context for the template that `NgIf` will render.\n   *\n   * The presence of this method is a signal to the Ivy template type-check compiler that the\n   * `NgIf` structural directive renders its template with a specific context type.\n   */\n  static ngTemplateContextGuard<T>(\n    dir: NgIf<T>,\n    ctx: any,\n  ): ctx is NgIfContext<Exclude<T, false | 0 | '' | null | undefined>> {\n    return true;\n  }\n}\n\n/**\n * @publicApi\n */\nexport class NgIfContext<T = unknown> {\n  public $implicit: T = null!;\n  public ngIf: T = null!;\n}\n\nfunction assertTemplate(\n  templateRef: TemplateRef<any> | null,\n  property: string | false | null,\n): void {\n  if (templateRef && !templateRef.createEmbeddedView) {\n    throw new RuntimeError(\n      RuntimeErrorCode.NG_IF_NOT_A_TEMPLATE_REF,\n      (typeof ngDevMode === 'undefined' || ngDevMode) &&\n        `${property} must be a TemplateRef, but received '${stringify(templateRef)}'.`,\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Directive,\n  DoCheck,\n  Host,\n  Input,\n  Optional,\n  ɵRuntimeError as RuntimeError,\n  TemplateRef,\n  ViewContainerRef,\n} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../errors';\n\nexport class SwitchView {\n  private _created = false;\n\n  constructor(\n    private _viewContainerRef: ViewContainerRef,\n    private _templateRef: TemplateRef<Object>,\n  ) {}\n\n  create(): void {\n    this._created = true;\n    this._viewContainerRef.createEmbeddedView(this._templateRef);\n  }\n\n  destroy(): void {\n    this._created = false;\n    this._viewContainerRef.clear();\n  }\n\n  enforceState(created: boolean) {\n    if (created && !this._created) {\n      this.create();\n    } else if (!created && this._created) {\n      this.destroy();\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n * The `[ngSwitch]` directive on a container specifies an expression to match against.\n * The expressions to match are provided by `ngSwitchCase` directives on views within the container.\n * - Every view that matches is rendered.\n * - If there are no matches, a view with the `ngSwitchDefault` directive is rendered.\n * - Elements within the `[NgSwitch]` statement but outside of any `NgSwitchCase`\n * or `ngSwitchDefault` directive are preserved at the location.\n *\n * @usageNotes\n * Define a container element for the directive, and specify the switch expression\n * to match against as an attribute:\n *\n * ```html\n * <container-element [ngSwitch]=\"switch_expression\">\n * ```\n *\n * Within the container, `*ngSwitchCase` statements specify the match expressions\n * as attributes. Include `*ngSwitchDefault` as the final case.\n *\n * ```html\n * <container-element [ngSwitch]=\"switch_expression\">\n *    <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n * ...\n *    <some-element *ngSwitchDefault>...</some-element>\n * </container-element>\n * ```\n *\n * ### Usage Examples\n *\n * The following example shows how to use more than one case to display the same view:\n *\n * ```html\n * <container-element [ngSwitch]=\"switch_expression\">\n *   <!-- the same view can be shown in more than one case -->\n *   <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n *   <some-element *ngSwitchCase=\"match_expression_2\">...</some-element>\n *   <some-other-element *ngSwitchCase=\"match_expression_3\">...</some-other-element>\n *   <!--default case when there are no matches -->\n *   <some-element *ngSwitchDefault>...</some-element>\n * </container-element>\n * ```\n *\n * The following example shows how cases can be nested:\n * ```html\n * <container-element [ngSwitch]=\"switch_expression\">\n *       <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n *       <some-element *ngSwitchCase=\"match_expression_2\">...</some-element>\n *       <some-other-element *ngSwitchCase=\"match_expression_3\">...</some-other-element>\n *       <ng-container *ngSwitchCase=\"match_expression_3\">\n *         <!-- use a ng-container to group multiple root nodes -->\n *         <inner-element></inner-element>\n *         <inner-other-element></inner-other-element>\n *       </ng-container>\n *       <some-element *ngSwitchDefault>...</some-element>\n *     </container-element>\n * ```\n *\n * @publicApi\n * @see {@link NgSwitchCase}\n * @see {@link NgSwitchDefault}\n * @see [Structural Directives](guide/directives/structural-directives)\n *\n */\n@Directive({\n  selector: '[ngSwitch]',\n})\nexport class NgSwitch {\n  private _defaultViews: SwitchView[] = [];\n  private _defaultUsed = false;\n  private _caseCount = 0;\n  private _lastCaseCheckIndex = 0;\n  private _lastCasesMatched = false;\n  private _ngSwitch: any;\n\n  @Input()\n  set ngSwitch(newValue: any) {\n    this._ngSwitch = newValue;\n    if (this._caseCount === 0) {\n      this._updateDefaultCases(true);\n    }\n  }\n\n  /** @internal */\n  _addCase(): number {\n    return this._caseCount++;\n  }\n\n  /** @internal */\n  _addDefault(view: SwitchView) {\n    this._defaultViews.push(view);\n  }\n\n  /** @internal */\n  _matchCase(value: any): boolean {\n    const matched = value === this._ngSwitch;\n    this._lastCasesMatched ||= matched;\n    this._lastCaseCheckIndex++;\n    if (this._lastCaseCheckIndex === this._caseCount) {\n      this._updateDefaultCases(!this._lastCasesMatched);\n      this._lastCaseCheckIndex = 0;\n      this._lastCasesMatched = false;\n    }\n    return matched;\n  }\n\n  private _updateDefaultCases(useDefault: boolean) {\n    if (this._defaultViews.length > 0 && useDefault !== this._defaultUsed) {\n      this._defaultUsed = useDefault;\n      for (const defaultView of this._defaultViews) {\n        defaultView.enforceState(useDefault);\n      }\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n * Provides a switch case expression to match against an enclosing `ngSwitch` expression.\n * When the expressions match, the given `NgSwitchCase` template is rendered.\n * If multiple match expressions match the switch expression value, all of them are displayed.\n *\n * @usageNotes\n *\n * Within a switch container, `*ngSwitchCase` statements specify the match expressions\n * as attributes. Include `*ngSwitchDefault` as the final case.\n *\n * ```html\n * <container-element [ngSwitch]=\"switch_expression\">\n *   <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n *   ...\n *   <some-element *ngSwitchDefault>...</some-element>\n * </container-element>\n * ```\n *\n * Each switch-case statement contains an in-line HTML template or template reference\n * that defines the subtree to be selected if the value of the match expression\n * matches the value of the switch expression.\n *\n * As of Angular v17 the NgSwitch directive uses strict equality comparison (`===`) instead of\n * loose equality (`==`) to match different cases.\n *\n * @publicApi\n * @see {@link NgSwitch}\n * @see {@link NgSwitchDefau   lt}\n *\n */\n@Directive({\n  selector: '[ngSwitchCase]',\n})\nexport class NgSwitchCase implements DoCheck {\n  private _view: SwitchView;\n  /**\n   * Stores the HTML template to be selected on match.\n   */\n  @Input() ngSwitchCase: any;\n\n  constructor(\n    viewContainer: ViewContainerRef,\n    templateRef: TemplateRef<Object>,\n    @Optional() @Host() private ngSwitch: NgSwitch,\n  ) {\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && !ngSwitch) {\n      throwNgSwitchProviderNotFoundError('ngSwitchCase', 'NgSwitchCase');\n    }\n\n    ngSwitch._addCase();\n    this._view = new SwitchView(viewContainer, templateRef);\n  }\n\n  /**\n   * Performs case matching. For internal use only.\n   * @docs-private\n   */\n  ngDoCheck() {\n    this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase));\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n *\n * Creates a view that is rendered when no `NgSwitchCase` expressions\n * match the `NgSwitch` expression.\n * This statement should be the final case in an `NgSwitch`.\n *\n * @publicApi\n * @see {@link NgSwitch}\n * @see {@link NgSwitchCase}\n *\n */\n@Directive({\n  selector: '[ngSwitchDefault]',\n})\nexport class NgSwitchDefault {\n  constructor(\n    viewContainer: ViewContainerRef,\n    templateRef: TemplateRef<Object>,\n    @Optional() @Host() ngSwitch: NgSwitch,\n  ) {\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && !ngSwitch) {\n      throwNgSwitchProviderNotFoundError('ngSwitchDefault', 'NgSwitchDefault');\n    }\n\n    ngSwitch._addDefault(new SwitchView(viewContainer, templateRef));\n  }\n}\n\nfunction throwNgSwitchProviderNotFoundError(attrName: string, directiveName: string): never {\n  throw new RuntimeError(\n    RuntimeErrorCode.PARENT_NG_SWITCH_NOT_FOUND,\n    `An element with the \"${attrName}\" attribute ` +\n      `(matching the \"${directiveName}\" directive) must be located inside an element with the \"ngSwitch\" attribute ` +\n      `(matching \"NgSwitch\" directive)`,\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Attribute, Directive, Host, Input, TemplateRef, ViewContainerRef} from '@angular/core';\n\nimport {getPluralCategory, NgLocalization} from '../i18n/localization';\n\nimport {SwitchView} from './ng_switch';\n\n/**\n * @ngModule CommonModule\n *\n * @usageNotes\n * ```html\n * <some-element [ngPlural]=\"value\">\n *   <ng-template ngPluralCase=\"=0\">there is nothing</ng-template>\n *   <ng-template ngPluralCase=\"=1\">there is one</ng-template>\n *   <ng-template ngPluralCase=\"few\">there are a few</ng-template>\n * </some-element>\n * ```\n *\n * @description\n *\n * Adds / removes DOM sub-trees based on a numeric value. Tailored for pluralization.\n *\n * Displays DOM sub-trees that match the switch expression value, or failing that, DOM sub-trees\n * that match the switch expression's pluralization category.\n *\n * To use this directive you must provide a container element that sets the `[ngPlural]` attribute\n * to a switch expression. Inner elements with a `[ngPluralCase]` will display based on their\n * expression:\n * - if `[ngPluralCase]` is set to a value starting with `=`, it will only display if the value\n *   matches the switch expression exactly,\n * - otherwise, the view will be treated as a \"category match\", and will only display if exact\n *   value matches aren't found and the value maps to its category for the defined locale.\n *\n * See http://cldr.unicode.org/index/cldr-spec/plural-rules\n *\n * @publicApi\n */\n@Directive({\n  selector: '[ngPlural]',\n})\nexport class NgPlural {\n  private _activeView?: SwitchView;\n  private _caseViews: {[k: string]: SwitchView} = {};\n\n  constructor(private _localization: NgLocalization) {}\n\n  @Input()\n  set ngPlural(value: number) {\n    this._updateView(value);\n  }\n\n  addCase(value: string, switchView: SwitchView): void {\n    this._caseViews[value] = switchView;\n  }\n\n  private _updateView(switchValue: number): void {\n    this._clearViews();\n\n    const cases = Object.keys(this._caseViews);\n    const key = getPluralCategory(switchValue, cases, this._localization);\n    this._activateView(this._caseViews[key]);\n  }\n\n  private _clearViews() {\n    if (this._activeView) this._activeView.destroy();\n  }\n\n  private _activateView(view: SwitchView) {\n    if (view) {\n      this._activeView = view;\n      this._activeView.create();\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n *\n * Creates a view that will be added/removed from the parent {@link NgPlural} when the\n * given expression matches the plural expression according to CLDR rules.\n *\n * @usageNotes\n * ```html\n * <some-element [ngPlural]=\"value\">\n *   <ng-template ngPluralCase=\"=0\">...</ng-template>\n *   <ng-template ngPluralCase=\"other\">...</ng-template>\n * </some-element>\n *```\n *\n * See {@link NgPlural} for more details and example.\n *\n * @publicApi\n */\n@Directive({\n  selector: '[ngPluralCase]',\n})\nexport class NgPluralCase {\n  constructor(\n    @Attribute('ngPluralCase') public value: string,\n    template: TemplateRef<Object>,\n    viewContainer: ViewContainerRef,\n    @Host() ngPlural: NgPlural,\n  ) {\n    const isANumber: boolean = !isNaN(Number(value));\n    ngPlural.addCase(isANumber ? `=${value}` : value, new SwitchView(viewContainer, template));\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {\n  Directive,\n  DoCheck,\n  ElementRef,\n  Input,\n  KeyValueChanges,\n  KeyValueDiffer,\n  KeyValueDiffers,\n  Renderer2,\n  RendererStyleFlags2,\n} from '@angular/core';\n\n/**\n * @ngModule CommonModule\n *\n * @usageNotes\n *\n * Set the width of the containing element to a pixel value returned by an expression.\n *\n * ```html\n * <some-element [ngStyle]=\"{'max-width.px': widthExp}\">...</some-element>\n * ```\n *\n * Set a collection of style values using an expression that returns key-value pairs.\n *\n * ```html\n * <some-element [ngStyle]=\"objExp\">...</some-element>\n * ```\n *\n * For more simple use cases you can use the [style bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly.\n * It doesn't require importing a directive.\n *\n * Set the font of the containing element to the result of an expression.\n *\n * ```html\n * <some-element [style]=\"{'font-style': styleExp}\">...</some-element>\n * ```\n *\n * @description\n *\n * An attribute directive that updates styles for the containing HTML element.\n * Sets one or more style properties, specified as colon-separated key-value pairs.\n * The key is a style name, with an optional `.<unit>` suffix\n * (such as 'top.px', 'font-style.em').\n * The value is an expression to be evaluated.\n * The resulting non-null value, expressed in the given unit,\n * is assigned to the given style property.\n * If the result of evaluation is null, the corresponding style is removed.\n *\n * @see [Style bindings](/guide/templates/binding#css-class-and-style-property-bindings)\n *\n * @publicApi\n */\n@Directive({\n  selector: '[ngStyle]',\n})\nexport class NgStyle implements DoCheck {\n  private _ngStyle: {[key: string]: string} | null | undefined = null;\n  private _differ: KeyValueDiffer<string, string | number> | null = null;\n\n  constructor(\n    private _ngEl: ElementRef,\n    private _differs: KeyValueDiffers,\n    private _renderer: Renderer2,\n  ) {}\n\n  @Input('ngStyle')\n  set ngStyle(values: {[klass: string]: any} | null | undefined) {\n    this._ngStyle = values;\n    if (!this._differ && values) {\n      this._differ = this._differs.find(values).create();\n    }\n  }\n\n  ngDoCheck() {\n    if (this._differ) {\n      const changes = this._differ.diff(this._ngStyle!);\n      if (changes) {\n        this._applyChanges(changes);\n      }\n    }\n  }\n\n  private _setStyle(nameAndUnit: string, value: string | number | null | undefined): void {\n    const [name, unit] = nameAndUnit.split('.');\n    const flags = name.indexOf('-') === -1 ? undefined : (RendererStyleFlags2.DashCase as number);\n\n    if (value != null) {\n      this._renderer.setStyle(\n        this._ngEl.nativeElement,\n        name,\n        unit ? `${value}${unit}` : value,\n        flags,\n      );\n    } else {\n      this._renderer.removeStyle(this._ngEl.nativeElement, name, flags);\n    }\n  }\n\n  private _applyChanges(changes: KeyValueChanges<string, string | number>): void {\n    changes.forEachRemovedItem((record) => this._setStyle(record.key, null));\n    changes.forEachAddedItem((record) => this._setStyle(record.key, record.currentValue));\n    changes.forEachChangedItem((record) => this._setStyle(record.key, record.currentValue));\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Directive,\n  EmbeddedViewRef,\n  Injector,\n  Input,\n  OnChanges,\n  SimpleChange,\n  SimpleChanges,\n  TemplateRef,\n  ViewContainerRef,\n} from '@angular/core';\n\n/**\n * @ngModule CommonModule\n *\n * @description\n *\n * Inserts an embedded view from a prepared `TemplateRef`.\n *\n * You can attach a context object to the `EmbeddedViewRef` by setting `[ngTemplateOutletContext]`.\n * `[ngTemplateOutletContext]` should be an object, the object's keys will be available for binding\n * by the local template `let` declarations.\n *\n * @usageNotes\n * ```html\n * <ng-container *ngTemplateOutlet=\"templateRefExp; context: contextExp\"></ng-container>\n * ```\n *\n * Using the key `$implicit` in the context object will set its value as default.\n *\n * ### Example\n *\n * {@example common/ngTemplateOutlet/ts/module.ts region='NgTemplateOutlet'}\n *\n * @publicApi\n */\n@Directive({\n  selector: '[ngTemplateOutlet]',\n})\nexport class NgTemplateOutlet<C = unknown> implements OnChanges {\n  private _viewRef: EmbeddedViewRef<C> | null = null;\n\n  /**\n   * A context object to attach to the {@link EmbeddedViewRef}. This should be an\n   * object, the object's keys will be available for binding by the local template `let`\n   * declarations.\n   * Using the key `$implicit` in the context object will set its value as default.\n   */\n  @Input() public ngTemplateOutletContext: C | null = null;\n\n  /**\n   * A string defining the template reference and optionally the context object for the template.\n   */\n  @Input() public ngTemplateOutlet: TemplateRef<C> | null = null;\n\n  /** Injector to be used within the embedded view. */\n  @Input() public ngTemplateOutletInjector: Injector | null = null;\n\n  constructor(private _viewContainerRef: ViewContainerRef) {}\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (this._shouldRecreateView(changes)) {\n      const viewContainerRef = this._viewContainerRef;\n\n      if (this._viewRef) {\n        viewContainerRef.remove(viewContainerRef.indexOf(this._viewRef));\n      }\n\n      // If there is no outlet, clear the destroyed view ref.\n      if (!this.ngTemplateOutlet) {\n        this._viewRef = null;\n        return;\n      }\n\n      // Create a context forward `Proxy` that will always bind to the user-specified context,\n      // without having to destroy and re-create views whenever the context changes.\n      const viewContext = this._createContextForwardProxy();\n      this._viewRef = viewContainerRef.createEmbeddedView(this.ngTemplateOutlet, viewContext, {\n        injector: this.ngTemplateOutletInjector ?? undefined,\n      });\n    }\n  }\n\n  /**\n   * We need to re-create existing embedded view if either is true:\n   * - the outlet changed.\n   * - the injector changed.\n   */\n  private _shouldRecreateView(changes: SimpleChanges): boolean {\n    return !!changes['ngTemplateOutlet'] || !!changes['ngTemplateOutletInjector'];\n  }\n\n  /**\n   * For a given outlet instance, we create a proxy object that delegates\n   * to the user-specified context. This allows changing, or swapping out\n   * the context object completely without having to destroy/re-create the view.\n   */\n  private _createContextForwardProxy(): C {\n    return <C>new Proxy(\n      {},\n      {\n        set: (_target, prop, newValue) => {\n          if (!this.ngTemplateOutletContext) {\n            return false;\n          }\n          return Reflect.set(this.ngTemplateOutletContext, prop, newValue);\n        },\n        get: (_target, prop, receiver) => {\n          if (!this.ngTemplateOutletContext) {\n            return undefined;\n          }\n          return Reflect.get(this.ngTemplateOutletContext, prop, receiver);\n        },\n      },\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Provider} from '@angular/core';\n\nimport {NgClass} from './ng_class';\nimport {NgComponentOutlet} from './ng_component_outlet';\nimport {NgFor, NgForOf, NgForOfContext} from './ng_for_of';\nimport {NgIf, NgIfContext} from './ng_if';\nimport {NgPlural, NgPluralCase} from './ng_plural';\nimport {NgStyle} from './ng_style';\nimport {NgSwitch, NgSwitchCase, NgSwitchDefault} from './ng_switch';\nimport {NgTemplateOutlet} from './ng_template_outlet';\n\nexport {\n  NgClass,\n  NgComponentOutlet,\n  NgFor,\n  NgForOf,\n  NgForOfContext,\n  NgIf,\n  NgIfContext,\n  NgPlural,\n  NgPluralCase,\n  NgStyle,\n  NgSwitch,\n  NgSwitchCase,\n  NgSwitchDefault,\n  NgTemplateOutlet,\n};\n\n/**\n * A collection of Angular directives that are likely to be used in each and every Angular\n * application.\n */\nexport const COMMON_DIRECTIVES: Provider[] = [\n  NgClass,\n  NgComponentOutlet,\n  NgForOf,\n  NgIf,\n  NgTemplateOutlet,\n  NgStyle,\n  NgSwitch,\n  NgSwitchCase,\n  NgSwitchDefault,\n  NgPlural,\n  NgPluralCase,\n];\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type, ɵRuntimeError as RuntimeError, ɵstringify as stringify} from '@angular/core';\n\nimport {RuntimeErrorCode} from '../errors';\n\nexport function invalidPipeArgumentError(type: Type<any>, value: Object) {\n  return new RuntimeError(\n    RuntimeErrorCode.INVALID_PIPE_ARGUMENT,\n    ngDevMode && `InvalidPipeArgument: '${value}' for pipe '${stringify(type)}'`,\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ChangeDetectorRef,\n  EventEmitter,\n  OnDestroy,\n  Pipe,\n  PipeTransform,\n  untracked,\n  ɵisPromise,\n  ɵisSubscribable,\n} from '@angular/core';\nimport type {Observable, Subscribable, Unsubscribable} from 'rxjs';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\ninterface SubscriptionStrategy {\n  createSubscription(\n    async: Subscribable<any> | Promise<any>,\n    updateLatestValue: any,\n  ): Unsubscribable | Promise<any>;\n  dispose(subscription: Unsubscribable | Promise<any>): void;\n}\n\nclass SubscribableStrategy implements SubscriptionStrategy {\n  createSubscription(async: Subscribable<any>, updateLatestValue: any): Unsubscribable {\n    // Subscription can be side-effectful, and we don't want any signal reads which happen in the\n    // side effect of the subscription to be tracked by a component's template when that\n    // subscription is triggered via the async pipe. So we wrap the subscription in `untracked` to\n    // decouple from the current reactive context.\n    //\n    // `untracked` also prevents signal _writes_ which happen in the subscription side effect from\n    // being treated as signal writes during the template evaluation (which throws errors).\n    return untracked(() =>\n      async.subscribe({\n        next: updateLatestValue,\n        error: (e: any) => {\n          throw e;\n        },\n      }),\n    );\n  }\n\n  dispose(subscription: Unsubscribable): void {\n    // See the comment in `createSubscription` above on the use of `untracked`.\n    untracked(() => subscription.unsubscribe());\n  }\n}\n\nclass PromiseStrategy implements SubscriptionStrategy {\n  createSubscription(\n    async: Promise<any>,\n    updateLatestValue: ((v: any) => any) | null,\n  ): Unsubscribable {\n    // According to the promise specification, promises are not cancellable by default.\n    // Once a promise is created, it will either resolve or reject, and it doesn't\n    // provide a built-in mechanism to cancel it.\n    // There may be situations where a promise is provided, and it either resolves after\n    // the pipe has been destroyed or never resolves at all. If the promise never\n    // resolves — potentially due to factors beyond our control, such as third-party\n    // libraries — this can lead to a memory leak.\n    // When we use `async.then(updateLatestValue)`, the engine captures a reference to the\n    // `updateLatestValue` function. This allows the promise to invoke that function when it\n    // resolves. In this case, the promise directly captures a reference to the\n    // `updateLatestValue` function. If the promise resolves later, it retains a reference\n    // to the original `updateLatestValue`, meaning that even if the context where\n    // `updateLatestValue` was defined has been destroyed, the function reference remains in memory.\n    // This can lead to memory leaks if `updateLatestValue` is no longer needed or if it holds\n    // onto resources that should be released.\n    // When we do `async.then(v => ...)` the promise captures a reference to the lambda\n    // function (the arrow function).\n    // When we assign `updateLatestValue = null` within the context of an `unsubscribe` function,\n    // we're changing the reference of `updateLatestValue` in the current scope to `null`.\n    // The lambda will no longer have access to it after the assignment, effectively\n    // preventing any further calls to the original function and allowing it to be garbage collected.\n    async.then(\n      // Using optional chaining because we may have set it to `null`; since the promise\n      // is async, the view might be destroyed by the time the promise resolves.\n      (v) => updateLatestValue?.(v),\n      (e) => {\n        throw e;\n      },\n    );\n    return {\n      unsubscribe: () => {\n        updateLatestValue = null;\n      },\n    };\n  }\n\n  dispose(subscription: Unsubscribable): void {\n    subscription.unsubscribe();\n  }\n}\n\nconst _promiseStrategy = new PromiseStrategy();\nconst _subscribableStrategy = new SubscribableStrategy();\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Unwraps a value from an asynchronous primitive.\n *\n * The `async` pipe subscribes to an `Observable` or `Promise` and returns the latest value it has\n * emitted. When a new value is emitted, the `async` pipe marks the component to be checked for\n * changes. When the component gets destroyed, the `async` pipe unsubscribes automatically to avoid\n * potential memory leaks. When the reference of the expression changes, the `async` pipe\n * automatically unsubscribes from the old `Observable` or `Promise` and subscribes to the new one.\n *\n * @usageNotes\n *\n * ### Examples\n *\n * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the\n * promise.\n *\n * {@example common/pipes/ts/async_pipe.ts region='AsyncPipePromise'}\n *\n * It's also possible to use `async` with Observables. The example below binds the `time` Observable\n * to the view. The Observable continuously updates the view with the current time.\n *\n * {@example common/pipes/ts/async_pipe.ts region='AsyncPipeObservable'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'async',\n  pure: false,\n})\nexport class AsyncPipe implements OnDestroy, PipeTransform {\n  private _ref: ChangeDetectorRef | null;\n  private _latestValue: any = null;\n  private markForCheckOnValueUpdate = true;\n\n  private _subscription: Unsubscribable | Promise<any> | null = null;\n  private _obj: Subscribable<any> | Promise<any> | EventEmitter<any> | null = null;\n  private _strategy: SubscriptionStrategy | null = null;\n\n  constructor(ref: ChangeDetectorRef) {\n    // Assign `ref` into `this._ref` manually instead of declaring `_ref` in the constructor\n    // parameter list, as the type of `this._ref` includes `null` unlike the type of `ref`.\n    this._ref = ref;\n  }\n\n  ngOnDestroy(): void {\n    if (this._subscription) {\n      this._dispose();\n    }\n    // Clear the `ChangeDetectorRef` and its association with the view data, to mitigate\n    // potential memory leaks in Observables that could otherwise cause the view data to\n    // be retained.\n    // https://github.com/angular/angular/issues/17624\n    this._ref = null;\n  }\n\n  // NOTE(@benlesh): Because Observable has deprecated a few call patterns for `subscribe`,\n  // TypeScript has a hard time matching Observable to Subscribable, for more information\n  // see https://github.com/microsoft/TypeScript/issues/43643\n\n  transform<T>(obj: Observable<T> | Subscribable<T> | Promise<T>): T | null;\n  transform<T>(obj: null | undefined): null;\n  transform<T>(obj: Observable<T> | Subscribable<T> | Promise<T> | null | undefined): T | null;\n  transform<T>(obj: Observable<T> | Subscribable<T> | Promise<T> | null | undefined): T | null {\n    if (!this._obj) {\n      if (obj) {\n        try {\n          // Only call `markForCheck` if the value is updated asynchronously.\n          // Synchronous updates _during_ subscription should not wastefully mark for check -\n          // this value is already going to be returned from the transform function.\n          this.markForCheckOnValueUpdate = false;\n          this._subscribe(obj);\n        } finally {\n          this.markForCheckOnValueUpdate = true;\n        }\n      }\n      return this._latestValue;\n    }\n\n    if (obj !== this._obj) {\n      this._dispose();\n      return this.transform(obj);\n    }\n\n    return this._latestValue;\n  }\n\n  private _subscribe(obj: Subscribable<any> | Promise<any> | EventEmitter<any>): void {\n    this._obj = obj;\n    this._strategy = this._selectStrategy(obj);\n    this._subscription = this._strategy.createSubscription(obj, (value: Object) =>\n      this._updateLatestValue(obj, value),\n    );\n  }\n\n  private _selectStrategy(\n    obj: Subscribable<any> | Promise<any> | EventEmitter<any>,\n  ): SubscriptionStrategy {\n    if (ɵisPromise(obj)) {\n      return _promiseStrategy;\n    }\n\n    if (ɵisSubscribable(obj)) {\n      return _subscribableStrategy;\n    }\n\n    throw invalidPipeArgumentError(AsyncPipe, obj);\n  }\n\n  private _dispose(): void {\n    // Note: `dispose` is only called if a subscription has been initialized before, indicating\n    // that `this._strategy` is also available.\n    this._strategy!.dispose(this._subscription!);\n    this._latestValue = null;\n    this._subscription = null;\n    this._obj = null;\n  }\n\n  private _updateLatestValue(async: any, value: Object): void {\n    if (async === this._obj) {\n      this._latestValue = value;\n      if (this.markForCheckOnValueUpdate) {\n        this._ref?.markForCheck();\n      }\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Pipe, PipeTransform} from '@angular/core';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * Transforms text to all lower case.\n *\n * @see {@link UpperCasePipe}\n * @see {@link TitleCasePipe}\n * @usageNotes\n *\n * The following example defines a view that allows the user to enter\n * text, and then uses the pipe to convert the input text to all lower case.\n *\n * {@example common/pipes/ts/lowerupper_pipe.ts region='LowerUpperPipe'}\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Pipe({\n  name: 'lowercase',\n})\nexport class LowerCasePipe implements PipeTransform {\n  /**\n   * @param value The string to transform to lower case.\n   */\n  transform(value: string): string;\n  transform(value: null | undefined): null;\n  transform(value: string | null | undefined): string | null;\n  transform(value: string | null | undefined): string | null {\n    if (value == null) return null;\n    if (typeof value !== 'string') {\n      throw invalidPipeArgumentError(LowerCasePipe, value);\n    }\n    return value.toLowerCase();\n  }\n}\n\n//\n// Regex below matches any Unicode word and number compatible with ES5. In ES2018 the same result\n// can be achieved by using /[0-9\\p{L}]\\S*/gu and also known as Unicode Property Escapes\n// (https://2ality.com/2017/07/regexp-unicode-property-escapes.html). Since there is no\n// transpilation of this functionality down to ES5 without external tool, the only solution is\n// to use already transpiled form. Example can be found here -\n// https://mothereff.in/regexpu#input=var+regex+%3D+%2F%5B0-9%5Cp%7BL%7D%5D%5CS*%2Fgu%3B%0A%0A&unicodePropertyEscape=1\n//\n\nconst unicodeWordMatch =\n  /(?:[0-9A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDD00-\\uDD23\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDEB8\\uDF00-\\uDF1A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCDF\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDEE0-\\uDEF2\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE7F\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD50-\\uDD52\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF1E]|\\uD838[\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD4B]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF38\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A])\\S*/g;\n\n/**\n * Transforms text to title case.\n * Capitalizes the first letter of each word and transforms the\n * rest of the word to lower case.\n * Words are delimited by any whitespace character, such as a space, tab, or line-feed character.\n *\n * @see {@link LowerCasePipe}\n * @see {@link UpperCasePipe}\n *\n * @usageNotes\n * The following example shows the result of transforming various strings into title case.\n *\n * {@example common/pipes/ts/titlecase_pipe.ts region='TitleCasePipe'}\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Pipe({\n  name: 'titlecase',\n})\nexport class TitleCasePipe implements PipeTransform {\n  /**\n   * @param value The string to transform to title case.\n   */\n  transform(value: string): string;\n  transform(value: null | undefined): null;\n  transform(value: string | null | undefined): string | null;\n  transform(value: string | null | undefined): string | null {\n    if (value == null) return null;\n    if (typeof value !== 'string') {\n      throw invalidPipeArgumentError(TitleCasePipe, value);\n    }\n\n    return value.replace(\n      unicodeWordMatch,\n      (txt) => txt[0].toUpperCase() + txt.slice(1).toLowerCase(),\n    );\n  }\n}\n\n/**\n * Transforms text to all upper case.\n * @see {@link LowerCasePipe}\n * @see {@link TitleCasePipe}\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Pipe({\n  name: 'uppercase',\n})\nexport class UpperCasePipe implements PipeTransform {\n  /**\n   * @param value The string to transform to upper case.\n   */\n  transform(value: string): string;\n  transform(value: null | undefined): null;\n  transform(value: string | null | undefined): string | null;\n  transform(value: string | null | undefined): string | null {\n    if (value == null) return null;\n    if (typeof value !== 'string') {\n      throw invalidPipeArgumentError(UpperCasePipe, value);\n    }\n    return value.toUpperCase();\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * An interface that describes the date pipe configuration, which can be provided using the\n * `DATE_PIPE_DEFAULT_OPTIONS` token.\n *\n * @see {@link DATE_PIPE_DEFAULT_OPTIONS}\n *\n * @publicApi\n */\nexport interface DatePipeConfig {\n  dateFormat?: string;\n  timezone?: string;\n}\n\n/**\n * The default date format of Angular date pipe, which corresponds to the following format:\n * `'MMM d,y'` (e.g. `Jun 15, 2015`)\n */\nexport const DEFAULT_DATE_FORMAT = 'mediumDate';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Inject, InjectionToken, LOCALE_ID, Optional, Pipe, PipeTransform} from '@angular/core';\n\nimport {formatDate} from '../i18n/format_date';\n\nimport {DatePipeConfig, DEFAULT_DATE_FORMAT} from './date_pipe_config';\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * Optionally-provided default timezone to use for all instances of `DatePipe` (such as `'+0430'`).\n * If the value isn't provided, the `DatePipe` will use the end-user's local system timezone.\n *\n * @deprecated use DATE_PIPE_DEFAULT_OPTIONS token to configure DatePipe\n */\nexport const DATE_PIPE_DEFAULT_TIMEZONE = new InjectionToken<string>(\n  ngDevMode ? 'DATE_PIPE_DEFAULT_TIMEZONE' : '',\n);\n\n/**\n * DI token that allows to provide default configuration for the `DatePipe` instances in an\n * application. The value is an object which can include the following fields:\n * - `dateFormat`: configures the default date format. If not provided, the `DatePipe`\n * will use the 'mediumDate' as a value.\n * - `timezone`: configures the default timezone. If not provided, the `DatePipe` will\n * use the end-user's local system timezone.\n *\n * @see {@link DatePipeConfig}\n *\n * @usageNotes\n *\n * Various date pipe default values can be overwritten by providing this token with\n * the value that has this interface.\n *\n * For example:\n *\n * Override the default date format by providing a value using the token:\n * ```ts\n * providers: [\n *   {provide: DATE_PIPE_DEFAULT_OPTIONS, useValue: {dateFormat: 'shortDate'}}\n * ]\n * ```\n *\n * Override the default timezone by providing a value using the token:\n * ```ts\n * providers: [\n *   {provide: DATE_PIPE_DEFAULT_OPTIONS, useValue: {timezone: '-1200'}}\n * ]\n * ```\n */\nexport const DATE_PIPE_DEFAULT_OPTIONS = new InjectionToken<DatePipeConfig>(\n  ngDevMode ? 'DATE_PIPE_DEFAULT_OPTIONS' : '',\n);\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a date value according to locale rules.\n *\n * `DatePipe` is executed only when it detects a pure change to the input value.\n * A pure change is either a change to a primitive input value\n * (such as `String`, `Number`, `Boolean`, or `Symbol`),\n * or a changed object reference (such as `Date`, `Array`, `Function`, or `Object`).\n *\n * Note that mutating a `Date` object does not cause the pipe to be rendered again.\n * To ensure that the pipe is executed, you must create a new `Date` object.\n *\n * Only the `en-US` locale data comes with Angular. To localize dates\n * in another language, you must import the corresponding locale data.\n * See the [I18n guide](guide/i18n/format-data-locale) for more information.\n *\n * The time zone of the formatted value can be specified either by passing it in as the second\n * parameter of the pipe, or by setting the default through the `DATE_PIPE_DEFAULT_OPTIONS`\n * injection token. The value that is passed in as the second parameter takes precedence over\n * the one defined using the injection token.\n *\n * @see {@link formatDate}\n *\n *\n * @usageNotes\n *\n * The result of this pipe is not reevaluated when the input is mutated. To avoid the need to\n * reformat the date on every change-detection cycle, treat the date as an immutable object\n * and change the reference when the pipe needs to run again.\n *\n * ### Pre-defined format options\n *\n * | Option        | Equivalent to                       | Examples (given in `en-US` locale)              |\n * |---------------|-------------------------------------|-------------------------------------------------|\n * | `'short'`     | `'M/d/yy, h:mm a'`                  | `6/15/15, 9:03 AM`                              |\n * | `'medium'`    | `'MMM d, y, h:mm:ss a'`             | `Jun 15, 2015, 9:03:01 AM`                      |\n * | `'long'`      | `'MMMM d, y, h:mm:ss a z'`          | `June 15, 2015 at 9:03:01 AM GMT+1`             |\n * | `'full'`      | `'EEEE, MMMM d, y, h:mm:ss a zzzz'` | `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00` |\n * | `'shortDate'` | `'M/d/yy'`                          | `6/15/15`                                       |\n * | `'mediumDate'`| `'MMM d, y'`                        | `Jun 15, 2015`                                  |\n * | `'longDate'`  | `'MMMM d, y'`                       | `June 15, 2015`                                 |\n * | `'fullDate'`  | `'EEEE, MMMM d, y'`                 | `Monday, June 15, 2015`                         |\n * | `'shortTime'` | `'h:mm a'`                          | `9:03 AM`                                       |\n * | `'mediumTime'`| `'h:mm:ss a'`                       | `9:03:01 AM`                                    |\n * | `'longTime'`  | `'h:mm:ss a z'`                     | `9:03:01 AM GMT+1`                              |\n * | `'fullTime'`  | `'h:mm:ss a zzzz'`                  | `9:03:01 AM GMT+01:00`                          |\n *\n * ### Custom format options\n *\n * You can construct a format string using symbols to specify the components\n * of a date-time value, as described in the following table.\n * Format details depend on the locale.\n * Fields marked with (*) are only available in the extra data set for the given locale.\n *\n *  | Field type              | Format      | Description                                                   | Example Value                                              |\n *  |-------------------------|-------------|---------------------------------------------------------------|------------------------------------------------------------|\n *  | Era                     | G, GG & GGG | Abbreviated                                                   | AD                                                         |\n *  |                         | GGGG        | Wide                                                          | Anno Domini                                                |\n *  |                         | GGGGG       | Narrow                                                        | A                                                          |\n *  | Year                    | y           | Numeric: minimum digits                                       | 2, 20, 201, 2017, 20173                                    |\n *  |                         | yy          | Numeric: 2 digits + zero padded                               | 02, 20, 01, 17, 73                                         |\n *  |                         | yyy         | Numeric: 3 digits + zero padded                               | 002, 020, 201, 2017, 20173                                 |\n *  |                         | yyyy        | Numeric: 4 digits or more + zero padded                       | 0002, 0020, 0201, 2017, 20173                              |\n *  | ISO Week-numbering year | Y           | Numeric: minimum digits                                       | 2, 20, 201, 2017, 20173                                    |\n *  |                         | YY          | Numeric: 2 digits + zero padded                               | 02, 20, 01, 17, 73                                         |\n *  |                         | YYY         | Numeric: 3 digits + zero padded                               | 002, 020, 201, 2017, 20173                                 |\n *  |                         | YYYY        | Numeric: 4 digits or more + zero padded                       | 0002, 0020, 0201, 2017, 20173                              |\n *  | Month                   | M           | Numeric: 1 digit                                              | 9, 12                                                      |\n *  |                         | MM          | Numeric: 2 digits + zero padded                               | 09, 12                                                     |\n *  |                         | MMM         | Abbreviated                                                   | Sep                                                        |\n *  |                         | MMMM        | Wide                                                          | September                                                  |\n *  |                         | MMMMM       | Narrow                                                        | S                                                          |\n *  | Month standalone        | L           | Numeric: 1 digit                                              | 9, 12                                                      |\n *  |                         | LL          | Numeric: 2 digits + zero padded                               | 09, 12                                                     |\n *  |                         | LLL         | Abbreviated                                                   | Sep                                                        |\n *  |                         | LLLL        | Wide                                                          | September                                                  |\n *  |                         | LLLLL       | Narrow                                                        | S                                                          |\n *  | ISO Week of year        | w           | Numeric: minimum digits                                       | 1... 53                                                    |\n *  |                         | ww          | Numeric: 2 digits + zero padded                               | 01... 53                                                   |\n *  | Week of month           | W           | Numeric: 1 digit                                              | 1... 5                                                     |\n *  | Day of month            | d           | Numeric: minimum digits                                       | 1                                                          |\n *  |                         | dd          | Numeric: 2 digits + zero padded                               | 01                                                         |\n *  | Week day                | E, EE & EEE | Abbreviated                                                   | Tue                                                        |\n *  |                         | EEEE        | Wide                                                          | Tuesday                                                    |\n *  |                         | EEEEE       | Narrow                                                        | T                                                          |\n *  |                         | EEEEEE      | Short                                                         | Tu                                                         |\n *  | Week day standalone     | c, cc       | Numeric: 1 digit                                              | 2                                                          |\n *  |                         | ccc         | Abbreviated                                                   | Tue                                                        |\n *  |                         | cccc        | Wide                                                          | Tuesday                                                    |\n *  |                         | ccccc       | Narrow                                                        | T                                                          |\n *  |                         | cccccc      | Short                                                         | Tu                                                         |\n *  | Period                  | a, aa & aaa | Abbreviated                                                   | am/pm or AM/PM                                             |\n *  |                         | aaaa        | Wide (fallback to `a` when missing)                           | ante meridiem/post meridiem                                |\n *  |                         | aaaaa       | Narrow                                                        | a/p                                                        |\n *  | Period*                 | B, BB & BBB | Abbreviated                                                   | mid.                                                       |\n *  |                         | BBBB        | Wide                                                          | am, pm, midnight, noon, morning, afternoon, evening, night |\n *  |                         | BBBBB       | Narrow                                                        | md                                                         |\n *  | Period standalone*      | b, bb & bbb | Abbreviated                                                   | mid.                                                       |\n *  |                         | bbbb        | Wide                                                          | am, pm, midnight, noon, morning, afternoon, evening, night |\n *  |                         | bbbbb       | Narrow                                                        | md                                                         |\n *  | Hour 1-12               | h           | Numeric: minimum digits                                       | 1, 12                                                      |\n *  |                         | hh          | Numeric: 2 digits + zero padded                               | 01, 12                                                     |\n *  | Hour 0-23               | H           | Numeric: minimum digits                                       | 0, 23                                                      |\n *  |                         | HH          | Numeric: 2 digits + zero padded                               | 00, 23                                                     |\n *  | Minute                  | m           | Numeric: minimum digits                                       | 8, 59                                                      |\n *  |                         | mm          | Numeric: 2 digits + zero padded                               | 08, 59                                                     |\n *  | Second                  | s           | Numeric: minimum digits                                       | 0... 59                                                    |\n *  |                         | ss          | Numeric: 2 digits + zero padded                               | 00... 59                                                   |\n *  | Fractional seconds      | S           | Numeric: 1 digit                                              | 0... 9                                                     |\n *  |                         | SS          | Numeric: 2 digits + zero padded                               | 00... 99                                                   |\n *  |                         | SSS         | Numeric: 3 digits + zero padded (= milliseconds)              | 000... 999                                                 |\n *  | Zone                    | z, zz & zzz | Short specific non location format (fallback to O)            | GMT-8                                                      |\n *  |                         | zzzz        | Long specific non location format (fallback to OOOO)          | GMT-08:00                                                  |\n *  |                         | Z, ZZ & ZZZ | ISO8601 basic format                                          | -0800                                                      |\n *  |                         | ZZZZ        | Long localized GMT format                                     | GMT-8:00                                                   |\n *  |                         | ZZZZZ       | ISO8601 extended format + Z indicator for offset 0 (= XXXXX)  | -08:00                                                     |\n *  |                         | O, OO & OOO | Short localized GMT format                                    | GMT-8                                                      |\n *  |                         | OOOO        | Long localized GMT format                                     | GMT-08:00                                                  |\n *\n *\n * ### Format examples\n *\n * These examples transform a date into various formats,\n * assuming that `dateObj` is a JavaScript `Date` object for\n * year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11,\n * given in the local time for the `en-US` locale.\n *\n * ```\n * {{ dateObj | date }}               // output is 'Jun 15, 2015'\n * {{ dateObj | date:'medium' }}      // output is 'Jun 15, 2015, 9:43:11 PM'\n * {{ dateObj | date:'shortTime' }}   // output is '9:43 PM'\n * {{ dateObj | date:'mm:ss' }}       // output is '43:11'\n * {{ dateObj | date:\"MMM dd, yyyy 'at' hh:mm a\" }}  // output is 'Jun 15, 2015 at 09:43 PM'\n * ```\n *\n * ### Usage example\n *\n * The following component uses a date pipe to display the current date in different formats.\n *\n * ```angular-ts\n * @Component({\n *  selector: 'date-pipe',\n *  template: `<div>\n *    <p>Today is {{today | date}}</p>\n *    <p>Or if you prefer, {{today | date:'fullDate'}}</p>\n *    <p>The time is {{today | date:'h:mm a z'}}</p>\n *  </div>`\n * })\n * // Get the current date and time as a date-time value.\n * export class DatePipeComponent {\n *   today: number = Date.now();\n * }\n * ```\n *\n * @publicApi\n */\n@Pipe({\n  name: 'date',\n})\nexport class DatePipe implements PipeTransform {\n  constructor(\n    @Inject(LOCALE_ID) private locale: string,\n    @Inject(DATE_PIPE_DEFAULT_TIMEZONE) @Optional() private defaultTimezone?: string | null,\n    @Inject(DATE_PIPE_DEFAULT_OPTIONS) @Optional() private defaultOptions?: DatePipeConfig | null,\n  ) {}\n\n  /**\n   * @param value The date expression: a `Date` object,  a number\n   * (milliseconds since UTC epoch), or an ISO string (https://www.w3.org/TR/NOTE-datetime).\n   * @param format The date/time components to include, using predefined options or a\n   * custom format string.  When not provided, the `DatePipe` looks for the value using the\n   * `DATE_PIPE_DEFAULT_OPTIONS` injection token (and reads the `dateFormat` property).\n   * If the token is not configured, the `mediumDate` is used as a value.\n   * @param timezone A timezone offset (such as `'+0430'`). When not provided, the `DatePipe`\n   * looks for the value using the `DATE_PIPE_DEFAULT_OPTIONS` injection token (and reads\n   * the `timezone` property). If the token is not configured, the end-user's local system\n   * timezone is used as a value.\n   * @param locale A locale code for the locale format rules to use.\n   * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.\n   * See [Setting your app locale](guide/i18n/locale-id).\n   *\n   * @see {@link DATE_PIPE_DEFAULT_OPTIONS}\n   *\n   * @returns A date string in the desired format.\n   */\n  transform(\n    value: Date | string | number,\n    format?: string,\n    timezone?: string,\n    locale?: string,\n  ): string | null;\n  transform(value: null | undefined, format?: string, timezone?: string, locale?: string): null;\n  transform(\n    value: Date | string | number | null | undefined,\n    format?: string,\n    timezone?: string,\n    locale?: string,\n  ): string | null;\n  transform(\n    value: Date | string | number | null | undefined,\n    format?: string,\n    timezone?: string,\n    locale?: string,\n  ): string | null {\n    if (value == null || value === '' || value !== value) return null;\n\n    try {\n      const _format = format ?? this.defaultOptions?.dateFormat ?? DEFAULT_DATE_FORMAT;\n      const _timezone =\n        timezone ?? this.defaultOptions?.timezone ?? this.defaultTimezone ?? undefined;\n      return formatDate(value, _format, locale || this.locale, _timezone);\n    } catch (error) {\n      throw invalidPipeArgumentError(DatePipe, (error as Error).message);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Pipe, PipeTransform} from '@angular/core';\n\nimport {getPluralCategory, NgLocalization} from '../i18n/localization';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\nconst _INTERPOLATION_REGEXP: RegExp = /#/g;\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Maps a value to a string that pluralizes the value according to locale rules.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/pipes/ts/i18n_pipe.ts region='I18nPluralPipeComponent'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'i18nPlural',\n})\nexport class I18nPluralPipe implements PipeTransform {\n  constructor(private _localization: NgLocalization) {}\n\n  /**\n   * @param value the number to be formatted\n   * @param pluralMap an object that mimics the ICU format, see\n   * https://unicode-org.github.io/icu/userguide/format_parse/messages/.\n   * @param locale a `string` defining the locale to use (uses the current {@link LOCALE_ID} by\n   * default).\n   */\n  transform(\n    value: number | null | undefined,\n    pluralMap: {[count: string]: string},\n    locale?: string,\n  ): string {\n    if (value == null) return '';\n\n    if (typeof pluralMap !== 'object' || pluralMap === null) {\n      throw invalidPipeArgumentError(I18nPluralPipe, pluralMap);\n    }\n\n    const key = getPluralCategory(value, Object.keys(pluralMap), this._localization, locale);\n\n    return pluralMap[key].replace(_INTERPOLATION_REGEXP, value.toString());\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Pipe, PipeTransform} from '@angular/core';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Generic selector that displays the string that matches the current value.\n *\n * If none of the keys of the `mapping` match the `value`, then the content\n * of the `other` key is returned when present, otherwise an empty string is returned.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/pipes/ts/i18n_pipe.ts region='I18nSelectPipeComponent'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'i18nSelect',\n})\nexport class I18nSelectPipe implements PipeTransform {\n  /**\n   * @param value a string to be internationalized.\n   * @param mapping an object that indicates the text that should be displayed\n   * for different values of the provided `value`.\n   */\n  transform(value: string | null | undefined, mapping: {[key: string]: string}): string {\n    if (value == null) return '';\n\n    if (typeof mapping !== 'object' || typeof value !== 'string') {\n      throw invalidPipeArgumentError(I18nSelectPipe, mapping);\n    }\n\n    if (mapping.hasOwnProperty(value)) {\n      return mapping[value];\n    }\n\n    if (mapping.hasOwnProperty('other')) {\n      return mapping['other'];\n    }\n\n    return '';\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Pipe, PipeTransform} from '@angular/core';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Converts a value into its JSON-format representation.  Useful for debugging.\n *\n * @usageNotes\n *\n * The following component uses a JSON pipe to convert an object\n * to JSON format, and displays the string in both formats for comparison.\n *\n * {@example common/pipes/ts/json_pipe.ts region='JsonPipe'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'json',\n  pure: false,\n})\nexport class JsonPipe implements PipeTransform {\n  /**\n   * @param value A value of any type to convert into a JSON-format string.\n   */\n  transform(value: any): string {\n    return JSON.stringify(value, null, 2);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  KeyValueChangeRecord,\n  KeyValueChanges,\n  KeyValueDiffer,\n  KeyValueDiffers,\n  Pipe,\n  PipeTransform,\n} from '@angular/core';\n\nfunction makeKeyValuePair<K, V>(key: K, value: V): KeyValue<K, V> {\n  return {key: key, value: value};\n}\n\n/**\n * A key value pair.\n * Usually used to represent the key value pairs from a Map or Object.\n *\n * @publicApi\n */\nexport interface KeyValue<K, V> {\n  key: K;\n  value: V;\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Transforms Object or Map into an array of key value pairs.\n *\n * The output array will be ordered by keys.\n * By default the comparator will be by Unicode point value.\n * You can optionally pass a compareFn if your keys are complex types.\n * Passing `null` as the compareFn will use natural ordering of the input.\n *\n * @usageNotes\n * ### Examples\n *\n * This examples show how an Object or a Map can be iterated by ngFor with the use of this\n * keyvalue pipe.\n *\n * {@example common/pipes/ts/keyvalue_pipe.ts region='KeyValuePipe'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'keyvalue',\n  pure: false,\n})\nexport class KeyValuePipe implements PipeTransform {\n  constructor(private readonly differs: KeyValueDiffers) {}\n\n  private differ!: KeyValueDiffer<any, any>;\n  private keyValues: Array<KeyValue<any, any>> = [];\n  private compareFn: ((a: KeyValue<any, any>, b: KeyValue<any, any>) => number) | null =\n    defaultComparator;\n\n  /*\n   * NOTE: when the `input` value is a simple Record<K, V> object, the keys are extracted with\n   * Object.keys(). This means that even if the `input` type is Record<number, V> the keys are\n   * compared/returned as `string`s.\n   */\n  transform<K, V>(\n    input: ReadonlyMap<K, V>,\n    compareFn?: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null,\n  ): Array<KeyValue<K, V>>;\n  transform<K extends number, V>(\n    input: Record<K, V>,\n    compareFn?: ((a: KeyValue<string, V>, b: KeyValue<string, V>) => number) | null,\n  ): Array<KeyValue<string, V>>;\n  transform<K extends string, V>(\n    input: Record<K, V> | ReadonlyMap<K, V>,\n    compareFn?: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null,\n  ): Array<KeyValue<K, V>>;\n  transform(\n    input: null | undefined,\n    compareFn?: ((a: KeyValue<unknown, unknown>, b: KeyValue<unknown, unknown>) => number) | null,\n  ): null;\n  transform<K, V>(\n    input: ReadonlyMap<K, V> | null | undefined,\n    compareFn?: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null,\n  ): Array<KeyValue<K, V>> | null;\n  transform<K extends number, V>(\n    input: Record<K, V> | null | undefined,\n    compareFn?: ((a: KeyValue<string, V>, b: KeyValue<string, V>) => number) | null,\n  ): Array<KeyValue<string, V>> | null;\n  transform<K extends string, V>(\n    input: Record<K, V> | ReadonlyMap<K, V> | null | undefined,\n    compareFn?: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null,\n  ): Array<KeyValue<K, V>> | null;\n  transform<K, V>(\n    input: undefined | null | {[key: string]: V; [key: number]: V} | ReadonlyMap<K, V>,\n    compareFn: ((a: KeyValue<K, V>, b: KeyValue<K, V>) => number) | null = defaultComparator,\n  ): Array<KeyValue<K, V>> | null {\n    if (!input || (!(input instanceof Map) && typeof input !== 'object')) {\n      return null;\n    }\n\n    // make a differ for whatever type we've been passed in\n    this.differ ??= this.differs.find(input).create();\n\n    const differChanges: KeyValueChanges<K, V> | null = this.differ.diff(input as any);\n    const compareFnC   hanged = compareFn !== this.compareFn;\n\n    if (differChanges) {\n      this.keyValues = [];\n      differChanges.forEachItem((r: KeyValueChangeRecord<K, V>) => {\n        this.keyValues.push(makeKeyValuePair(r.key, r.currentValue!));\n      });\n    }\n    if (differChanges || compareFnChanged) {\n      if (compareFn) {\n        this.keyValues.sort(compareFn);\n      }\n      this.compareFn = compareFn;\n    }\n    return this.keyValues;\n  }\n}\n\nexport function defaultComparator<K, V>(\n  keyValueA: KeyValue<K, V>,\n  keyValueB: KeyValue<K, V>,\n): number {\n  const a = keyValueA.key;\n  const b = keyValueB.key;\n  // If both keys are the same, return 0 (no sorting needed).\n  if (a === b) return 0;\n  // If one of the keys is `null` or `undefined`, place it at the end of the sort.\n  if (a == null) return 1; // `a` comes after `b`.\n  if (b == null) return -1; // `b` comes after `a`.\n  // If both keys are strings, compare them lexicographically.\n  if (typeof a == 'string' && typeof b == 'string') {\n    return a < b ? -1 : 1;\n  }\n  // If both keys are numbers, sort them numerically.\n  if (typeof a == 'number' && typeof b == 'number') {\n    return a - b;\n  }\n  // If both keys are booleans, sort `false` before `true`.\n  if (typeof a == 'boolean' && typeof b == 'boolean') {\n    return a < b ? -1 : 1;\n  }\n  // Fallback case: if keys are of different types, compare their string representations.\n  const aString = String(a);\n  const bString = String(b);\n  // Compare the string representations lexicographically.\n  return aString == bString ? 0 : aString < bString ? -1 : 1;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DEFAULT_CURRENCY_CODE, Inject, LOCALE_ID, Pipe, PipeTransform} from '@angular/core';\n\nimport {formatCurrency, formatNumber, formatPercent} from '../i18n/format_number';\nimport {getCurrencySymbol} from '../i18n/locale_data_api';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a value according to digit options and locale rules.\n * Locale determines group sizing and separator,\n * decimal point character, and other locale-specific configurations.\n *\n * @see {@link formatNumber}\n *\n * @usageNotes\n *\n * ### digitsInfo\n *\n * The value's decimal representation is specified by the `digitsInfo`\n * parameter, written in the following format:<br>\n *\n * ```\n * {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}\n * ```\n *\n *  - `minIntegerDigits`:\n * The minimum number of integer digits before the decimal point.\n * Default is 1.\n *\n * - `minFractionDigits`:\n * The minimum number of digits after the decimal point.\n * Default is 0.\n *\n *  - `maxFractionDigits`:\n * The maximum number of digits after the decimal point.\n * Default is 3.\n *\n * If the formatted value is truncated it will be rounded using the \"to-nearest\" method:\n *\n * ```\n * {{3.6 | number: '1.0-0'}}\n * <!--will output '4'-->\n *\n * {{-3.6 | number:'1.0-0'}}\n * <!--will output '-4'-->\n * ```\n *\n * ### locale\n *\n * `locale` will format a value according to locale rules.\n * Locale determines group sizing and separator,\n * decimal point character, and other locale-specific configurations.\n *\n * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.\n *\n * See [Setting your app locale](guide/i18n/locale-id).\n *\n * ### Example\n *\n * The following code shows how the pipe transforms values\n * according to various format specifications,\n * where the caller's default locale is `en-US`.\n *\n * {@example common/pipes/ts/number_pipe.ts region='NumberPipe'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'number',\n})\nexport class DecimalPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n\n  /**\n   * @param value The value to be formatted.\n   * @param digitsInfo Sets digit and decimal representation.\n   * [See more](#digitsinfo).\n   * @param locale Specifies what locale format rules to use.\n   * [See more](#locale).\n   */\n  transform(value: number | string, digitsInfo?: string, locale?: string): string | null;\n  transform(value: null | undefined, digitsInfo?: string, locale?: string): null;\n  transform(\n    value: number | string | null | undefined,\n    digitsInfo?: string,\n    locale?: string,\n  ): string | null;\n  transform(\n    value: number | string | null | undefined,\n    digitsInfo?: string,\n    locale?: string,\n  ): string | null {\n    if (!isValue(value)) return null;\n\n    locale ||= this._locale;\n\n    try {\n      const num = strToNumber(value);\n      return formatNumber(num, locale, digitsInfo);\n    } catch (error) {\n      throw invalidPipeArgumentError(DecimalPipe, (error as Error).message);\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Transforms a number to a percentage\n * string, formatted according to locale rules that determine group sizing and\n * separator, decimal-point character, and other locale-specific\n * configurations.\n *\n * @see {@link formatPercent}\n *\n * @usageNotes\n * The following code shows how the pipe transforms numbers\n * into text strings, according to various format specifications,\n * where the caller's default locale is `en-US`.\n *\n * {@example common/pipes/ts/percent_pipe.ts region='PercentPipe'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'percent',\n})\nexport class PercentPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n\n  transform(value: number | string, digitsInfo?: string, locale?: string): string | null;\n  transform(value: null | undefined, digitsInfo?: string, locale?: string): null;\n  transform(\n    value: number | string | null | undefined,\n    digitsInfo?: string,\n    locale?: string,\n  ): string | null;\n  /**\n   *\n   * @param value The number to be formatted as a percentage.\n   * @param digitsInfo Decimal representation options, specified by a string\n   * in the following format:<br>\n   * <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>.\n   *   - `minIntegerDigits`: The minimum number of integer digits before the decimal point.\n   * Default is `1`.\n   *   - `minFractionDigits`: The minimum number of digits after the decimal point.\n   * Default is `0`.\n   *   - `maxFractionDigits`: The maximum number of digits after the decimal point.\n   * Default is `0`.\n   * @param locale A locale code for the locale format rules to use.\n   * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.\n   * See [Setting your app locale](guide/i18n/locale-id).\n   */\n  transform(\n    value: number | string | null | undefined,\n    digitsInfo?: string,\n    locale?: string,\n  ): string | null {\n    if (!isValue(value)) return null;\n    locale ||= this._locale;\n    try {\n      const num = strToNumber(value);\n      return formatPercent(num, locale, digitsInfo);\n    } catch (error) {\n      throw invalidPipeArgumentError(PercentPipe, (error as Error).message);\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Transforms a number to a currency string, formatted according to locale rules\n * that determine group sizing and separator, decimal-point character,\n * and other locale-specific configurations.\n *\n *\n * @see {@link getCurrencySymbol}\n * @see {@link formatCurrency}\n *\n * @usageNotes\n * The following code shows how the pipe transforms numbers\n * into text strings, according to various format specifications,\n * where the caller's default locale is `en-US`.\n *\n * {@example common/pipes/ts/currency_pipe.ts region='CurrencyPipe'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'currency',\n})\nexport class CurrencyPipe implements PipeTransform {\n  constructor(\n    @Inject(LOCALE_ID) private _locale: string,\n    @Inject(DEFAULT_CURRENCY_CODE) private _defaultCurrencyCode: string = 'USD',\n  ) {}\n  /**\n   *\n   * @param value The number to be formatted as currency.\n   * @param currencyCode The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code,\n   * such as `USD` for the US dollar and `EUR` for the euro. The default currency code can be\n   * configured using the `DEFAULT_CURRENCY_CODE` injection token.\n   * @param display The format for the currency indicator. One of the following:\n   *   - `code`: Show the code (such as `USD`).\n   *   - `symbol`(default): Show the symbol (such as `$`).\n   *   - `symbol-narrow`: Use the narrow symbol for locales that have two symbols for their\n   * currency.\n   * For example, the Canadian dollar CAD has the symbol `CA$` and the symbol-narrow `$`. If the\n   * locale has no narrow symbol, uses the standard symbol for the locale.\n   *   - String: Use the given string value instead of a code or a symbol.\n   * For example, an empty string will suppress the currency & symbol.\n   *   - Boolean (marked deprecated in v5): `true` for symbol and false for `code`.\n   *\n   * @param digitsInfo Decimal representation options, specified by a string\n   * in the following format:<br>\n   * <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>.\n   *   - `minIntegerDigits`: The minimum number of integer digits before the decimal point.\n   * Default is `1`.\n   *   - `minFractionDigits`: The minimum number of digits after the decimal point.\n   * Default is `2`.\n   *   - `maxFractionDigits`: The maximum number of digits after the decimal point.\n   * Default is `2`.\n   * If not provided, the number will be formatted with the proper amount of digits,\n   * depending on what the [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) specifies.\n   * For example, the Canadian dollar has 2 digits, whereas the Chilean peso has none.\n   * @param locale A locale code for the locale format rules to use.\n   * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.\n   * See [Setting your app locale](guide/i18n/locale-id).\n   */\n  transform(\n    value: number | string,\n    currencyCode?: string,\n    display?: 'code' | 'symbol' | 'symbol-narrow' | string | boolean,\n    digitsInfo?: string,\n    locale?: string,\n  ): string | null;\n  transform(\n    value: null | undefined,\n    currencyCode?: string,\n    display?: 'code' | 'symbol' | 'symbol-narrow' | string | boolean,\n    digitsInfo?: string,\n    locale?: string,\n  ): null;\n  transform(\n    value: number | string | null | undefined,\n    currencyCode?: string,\n    display?: 'code' | 'symbol' | 'symbol-narrow' | string | boolean,\n    digitsInfo?: string,\n    locale?: string,\n  ): string | null;\n  transform(\n    value: number | string | null | undefined,\n    currencyCode: string = this._defaultCurrencyCode,\n    display: 'code' | 'symbol' | 'symbol-narrow' | string | boolean = 'symbol',\n    digitsInfo?: string,\n    locale?: string,\n  ): string | null {\n    if (!isValue(value)) return null;\n\n    locale ||= this._locale;\n\n    if (typeof display === 'boolean') {\n      if ((typeof ngDevMode === 'undefined' || ngDevMode) && <any>console && <any>console.warn) {\n        console.warn(\n          `Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are \"code\", \"symbol\" or \"symbol-narrow\".`,\n        );\n      }\n      display = display ? 'symbol' : 'code';\n    }\n\n    let currency: string = currencyCode || this._defaultCurrencyCode;\n    if (display !== 'code') {\n      if (display === 'symbol' || display === 'symbol-narrow') {\n        currency = getCurrencySymbol(currency, display === 'symbol' ? 'wide' : 'narrow', locale);\n      } else {\n        currency = display;\n      }\n    }\n\n    try {\n      const num = strToNumber(value);\n      return formatCurrency(num, locale, currency, currencyCode, digitsInfo);\n    } catch (error) {\n      throw invalidPipeArgumentError(CurrencyPipe, (error as Error).message);\n    }\n  }\n}\n\nfunction isValue(value: number | string | null | undefined): value is number | string {\n  return !(value == null || value === '' || value !== value);\n}\n\n/**\n * Transforms a string into a number (if needed).\n */\nfunction strToNumber(value: number | string): number {\n  // Convert strings to numbers\n  if (typeof value === 'string' && !isNaN(Number(value) - parseFloat(value))) {\n    return Number(value);\n  }\n  if (typeof value !== 'number') {\n    throw new Error(`${value} is not a number`);\n  }\n  return value;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Pipe, PipeTransform} from '@angular/core';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Creates a new `Array` or `String` containing a subset (slice) of the elements.\n *\n * @usageNotes\n *\n * All behavior is based on the expected behavior of the JavaScript API `Array.prototype.slice()`\n * and `String.prototype.slice()`.\n *\n * When operating on an `Array`, the returned `Array` is always a copy even when all\n * the elements are being returned.\n *\n * When operating on a blank value, the pipe returns the blank value.\n *\n * ### List Example\n *\n * This `ngFor` example:\n *\n * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_list'}\n *\n * produces the following:\n *\n * ```html\n * <li>b</li>\n * <li>c</li>\n * ```\n *\n * ### String Examples\n *\n * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_string'}\n *\n * @publicApi\n */\n@Pipe({\n  name: 'slice',\n  pure: false,\n})\nexport class SlicePipe implements PipeTransform {\n  /**\n   * @param value a list or a string to be sliced.\n   * @param start the starting index of the subset to return:\n   *   - **a positive integer**: return the item at `start` index and all items after\n   *     in the list or string expression.\n   *   - **a negative integer**: return the item at `start` index from the end and all items after\n   *     in the list or string expression.\n   *   - **if positive and greater than the size of the expression**: return an empty list or\n   * string.\n   *   - **if negative and greater than the size of the expression**: return entire list or string.\n   * @param end the ending index of the subset to return:\n   *   - **omitted**: return all items until the end.\n   *   - **if positive**: return all items before `end` index of the list or string.\n   *   - **if negative**: return all items before `end` index from the end of the list or string.\n   */\n  transform<T>(value: ReadonlyArray<T>, start: number, end?: number): Array<T>;\n  transform(value: null | undefined, start: number, end?: number): null;\n  transform<T>(\n    value: ReadonlyArray<T> | null | undefined,\n    start: number,\n    end?: number,\n  ): Array<T> | null;\n  transform(value: string, start: number, end?: number): string;\n  transform(value: string | null | undefined, start: number, end?: number): string | null;\n  transform<T>(\n    value: ReadonlyArray<T> | string | null | undefined,\n    start: number,\n    end?: number,\n  ): Array<T> | string | null {\n    if (value == null) return null;\n\n    const supports = typeof value === 'string' || Array.isArray(value);\n\n    if (!supports) {\n      throw invalidPipeArgumentError(SlicePipe, value);\n    }\n\n    return value.slice(start, end);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @module\n * @description\n * This module provides a set of common Pipes.\n */\nimport {AsyncPipe} from './async_pipe';\nimport {LowerCasePipe, TitleCasePipe, UpperCasePipe} from './case_conversion_pipes';\nimport {DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe} from './date_pipe';\nimport {DatePipeConfig} from './date_pipe_config';\nimport {I18nPluralPipe} from './i18n_plural_pipe';\nimport {I18nSelectPipe} from './i18n_select_pipe';\nimport {JsonPipe} from './json_pipe';\nimport {KeyValue, KeyValuePipe} from './keyvalue_pipe';\nimport {CurrencyPipe, DecimalPipe, PercentPipe} from './number_pipe';\nimport {SlicePipe} from './slice_pipe';\n\nexport {\n  AsyncPipe,\n  CurrencyPipe,\n  DATE_PIPE_DEFAULT_OPTIONS,\n  DATE_PIPE_DEFAULT_TIMEZONE,\n  DatePipe,\n  DatePipeConfig,\n  DecimalPipe,\n  I18nPluralPipe,\n  I18nSelectPipe,\n  JsonPipe,\n  KeyValue,\n  KeyValuePipe,\n  LowerCasePipe,\n  PercentPipe,\n  SlicePipe,\n  TitleCasePipe,\n  UpperCasePipe,\n};\n\n/**\n * A collection of Angular pipes that are likely to be used in each and every application.\n */\nexport const COMMON_PIPES = [\n  AsyncPipe,\n  UpperCasePipe,\n  LowerCasePipe,\n  JsonPipe,\n  SlicePipe,\n  DecimalPipe,\n  PercentPipe,\n  TitleCasePipe,\n  CurrencyPipe,\n  DatePipe,\n  I18nPluralPipe,\n  I18nSelectPipe,\n  KeyValuePipe,\n];\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NgModule} from '@angular/core';\n\nimport {COMMON_DIRECTIVES} from './directives/index';\nimport {COMMON_PIPES} from './pipes/index';\n\n// Note: This does not contain the location providers,\n// as they need some platform specific implementations to work.\n/**\n * Exports all the basic Angular directives and pipes,\n * such as `NgIf`, `NgForOf`, `DecimalPipe`, and so on.\n * Re-exported by `BrowserModule`, which is included automatically in the root\n * `AppModule` when you create a new app with the CLI `new` command.\n *\n * @publicApi\n */\n@NgModule({\n  imports: [COMMON_DIRECTIVES, COMMON_PIPES],\n  exports: [COMMON_DIRECTIVES, COMMON_PIPES],\n})\nexport class CommonModule {}\n"],"names":["ɵfindLocaleData","ɵLocaleDataIndex","ɵgetLocaleCurrencyCode","ɵgetLocalePluralCase","stringify","RuntimeError","i1.NgLocalization","ɵisPromise","ɵisSubscribable","i1.NgClass","i2.NgComponentOutlet","i3.NgForOf","i4.NgIf","i5.NgTemplateOutlet","i6.NgStyle","i7.NgSwitch","i7.NgSwitchCase","i7.NgSwitchDefault","i8.NgPlural","i8.NgPluralCase","i9.AsyncPipe","i10.UpperCasePipe","i10.LowerCasePipe","i11.JsonPipe","i12.SlicePipe","i13.DecimalPipe","i13.PercentPipe","i10.TitleCasePipe","i13.CurrencyPipe","i14.DatePipe","i15.I18nPluralPipe","i16.I18nSelectPipe","i17.KeyValuePipe"],"mappings":";;;;;;;;;;AAcA;;;;;;;;;;;;;;;;;AAiBG;AAEG,MAAO,oBAAqB,SAAQ,gBAAgB,CAAA;AAK9C,IAAA,iBAAA;IAJF,SAAS,GAAW,EAAE;IACtB,kBAAkB,GAAmB,EAAE;IAE/C,WACU,CAAA,iBAAmC,EACR,SAAkB,EAAA;AAErD,QAAA,KAAK,EAAE;QAHC,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;AAIzB,QAAA,IAAI,SAAS,IAAI,IAAI,EAAE;AACrB,YAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;;;IAK9B,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;AACrC,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAG,EAAE;;;AAI3B,IAAA,UAAU,CAAC,EAA0B,EAAA;QAC5C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAC1B,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,EACrC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,CACxC;;IAGM,WAAW,GAAA;QAClB,OAAO,IAAI,CAAC,SAAS;;IAGd,IAAI,CAAC,cAAuB,KAAK,EAAA;;;QAGxC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,GAAG;AAE/C,QAAA,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;;AAG1C,IAAA,kBAAkB,CAAC,QAAgB,EAAA;QAC1C,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;AACnD,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;;AAGhC,IAAA,SAAS,CAAC,KAAU,EAAE,KAAa,EAAE,IAAY,EAAE,WAAmB,EAAA;AAC7E,QAAA,MAAM,GAAG,GACP,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ;QACjC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;;AAG5C,IAAA,YAAY,CAAC,KAAU,EAAE,KAAa,EAAE,IAAY,EAAE,WAAmB,EAAA;AAChF,QAAA,MAAM,GAAG,GACP,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ;QACjC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;;IAG/C,OAAO,GAAA;AACd,QAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE;;IAGzB,IAAI,GAAA;AACX,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;;IAGtB,QAAQ,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;;IAGjC,SAAS,CAAC,mBAA2B,CAAC,EAAA;QAC7C,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,gBAAgB,CAAC;;AAxE3C,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,+CAMT,aAAa,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;sHANxB,oBAAoB,EAAA,CAAA;;sGAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;0BAOI;;0BAAY,MAAM;2BAAC,aAAa;;;AC5BrC;AACO,MAAM,aAAa,GAA2F,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,SAAS,EAAC,IAAI,CAAC,EAAC,KAA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d[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"}/ x/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { InjectionToken } from '@angular/core';

/**
 * A DI Token representing the main rendering context.
 * In a browser and SSR this is the DOM Document.
 * When using SSR, that document is created by [Domino](https://github.com/angular/domino).
 *
 * @publicApi
 */
const DOCUMENT = new InjectionToken(ngDevMode ? 'DocumentToken' : '');

export { DOCUMENT };
//# sourceMappingURL=dom_tokens-rA0ACyx7.mjs.map
а6x`{"version":3,"file":"dom_tokens-rA0ACyx7.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/dom_tokens.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n/**\n * A DI Token representing the main rendering context.\n * In a browser and SSR this is the DOM Document.\n * When using SSR, that document is created by [Domino](https://github.com/angular/domino).\n *\n * @publicApi\n */\nexport const DOCUMENT = new InjectionToken<Document>(ngDevMode ? 'DocumentToken' : '');\n"],"names":[],"mappings":";;;;;;;;AAUA;;;;;;AAMG;AACU,MAAA,QAAQ,GAAG,IAAI,cAAc,CAAW,SAAS,GAAG,eAAe,GAAG,EAAE;;;;"}BxxG/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { HttpErrorResponse, HttpEventType, HttpClient, HttpHeaders, HttpParams, HttpRequest, HTTP_ROOT_INTERCEPTOR_FNS, HttpResponse } from './module-z3bvLlVg.mjs';
export { FetchBackend, HTTP_INTERCEPTORS, HttpBackend, HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContext, HttpContextToken, HttpFeatureKind, HttpHandler, HttpHeaderResponse, HttpResponseBase, HttpStatusCode, HttpUrlEncodingCodec, HttpXhrBackend, HttpXsrfTokenExtractor, JsonpClientBackend, JsonpInterceptor, provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration, HttpInterceptorHandler as ɵHttpInterceptingHandler, HttpInterceptorHandler as ɵHttpInterceptorHandler, REQUESTS_CONTRIBUTE_TO_STABILITY as ɵREQUESTS_CONTRIBUTE_TO_STABILITY } from './module-z3bvLlVg.mjs';
import { assertInInjectionContext, inject, Injector, ɵResourceImpl as _ResourceImpl, linkedSignal, computed, ResourceStatus, signal, InjectionToken, APP_BOOTSTRAP_LISTENER, ɵperformanceMarkFeature as _performanceMarkFeature, ApplicationRef, TransferState, ɵRuntimeError as _RuntimeError, makeStateKey, ɵtruncateMiddle as _truncateMiddle, ɵformatRuntimeError as _formatRuntimeError } from '@angular/core';
import { of } from 'rxjs';
import { tap } from 'rxjs/operators';
import './xhr-BfNfxNDv.mjs';
import './dom_tokens-rA0ACyx7.mjs';

/**
 * `httpResource` makes a reactive HTTP request and exposes the request status and response value as
 * a `WritableResource`. By default, it assumes that the backend will return JSON data. To make a
 * request that expects a different kind of data, you can use a sub-constructor of `httpResource`,
 * such as `httpResource.text`.
 *
 * @experimental
 * @initializerApiFunction
 */
const httpResource = (() => {
    const jsonFn = makeHttpResourceFn('json');
    jsonFn.arrayBuffer = makeHttpResourceFn('arraybuffer');
    jsonFn.blob = makeHttpResourceFn('blob');
    jsonFn.text = makeHttpResourceFn('text');
    return jsonFn;
})();
function makeHttpResourceFn(responseType) {
    return function httpResourceRef(request, options) {
        options?.injector || assertInInjectionContext(httpResource);
        const injector = options?.injector ?? inject(Injector);
        return new HttpResourceImpl(injector, () => normalizeRequest(request, responseType), options?.defaultValue, options?.parse, options?.equal);
    };
}
function normalizeRequest(request, responseType) {
    let unwrappedRequest = typeof request === 'function' ? request() : request;
    if (unwrappedRequest === undefined) {
        return undefined;
    }
    else if (typeof unwrappedRequest === 'string') {
        unwrappedRequest = { url: unwrappedRequest };
    }
    const headers = unwrappedRequest.headers instanceof HttpHeaders
        ? unwrappedRequest.headers
        : new HttpHeaders(unwrappedRequest.headers);
    const params = unwrappedRequest.params instanceof HttpParams
        ? unwrappedRequest.params
        : new HttpParams({ fromObject: unwrappedRequest.params });
    return new HttpRequest(unwrappedRequest.method ?? 'GET', unwrappedRequest.url, unwrappedRequest.body ?? null, {
        headers,
        params,
        reportProgress: unwrappedRequest.reportProgress,
        withCredentials: unwrappedRequest.withCredentials,
        responseType,
        context: unwrappedRequest.context,
        transferCache: unwrappedRequest.transferCache,
    });
}
class HttpResourceImpl extends _ResourceImpl {
    client;
    _headers = linkedSignal({
        source: this.extRequest,
        computation: () => undefined,
    });
    _progress = linkedSignal({
        source: this.extRequest,
        computation: () => undefined,
    });
    _statusCode = linkedSignal({
        source: this.extRequest,
        computation: () => undefined,
    });
    headers = computed(() => this.status() === ResourceStatus.Resolved || this.status() === ResourceStatus.Error
        ? this._headers()
        : undefined);
    progress = this._progress.asReadonly();
    statusCode = this._statusCode.asReadonly();
    constructor(injector, request, defaultValue, parse, equal) {
        super(request, ({ request, abortSignal }) => {
            let sub;
            // Track the abort listener so it can be removed if the Observable completes (as a memory
            // optimization).
            const onAbort = () => sub.unsubscribe();
            abortSignal.addEventListener('abort', onAbort);
            // Start off stream as undefined.
            const stream = signal({ value: undefined });
            let resolve;
            const promise = new Promise((r) => (resolve = r));
            const send = (value) => {
                stream.set(value);
                resolve?.(stream);
                resolve = undefined;
            };
            sub = this.client.request(request).subscribe({
                next: (event) => {
                    switch (event.type) {
                        case HttpEventType.Response:
                            this._headers.set(event.headers);
                            this._statusCode.set(event.status);
                            try {
                                send({ value: parse ? parse(event.body) : event.body });
                            }
                            catch (error) {
                                send({ error });
                            }
                            break;
                        case HttpEventType.DownloadProgress:
                            this._progress.set(event);
                            break;
                    }
                },
                error: (error) => {
                    if (error instanceof HttpErrorResponse) {
                        this._headers.set(error.headers);
                        this._statusCode.set(error.status);
                    }
                    send({ error });
                    abortSignal.removeEventListener('abort', onAbort);
                },
                complete: () => {
                    if (resolve) {
                        send({ error: new Error('Resource completed before producing a value') });
                    }
                    abortSignal.removeEventListener('abort', onAbort);
                },
            });
            return promise;
        }, defaultValue, equal, injector);
        this.client = injector.get(HttpClient);
    }
}

/**
 * If your application uses different HTTP origins to make API calls (via `HttpClient`) on the server and
 * on the client, the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token allows you to establish a mapping
 * between those origins, so that `HttpTransferCache` feature can recognize those requests as the same
 * ones and reuse the data cached on the server during hydration on the client.
 *
 * **Important note**: the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token should *only* be provided in
 * the *server* code of your application (typically in the `app.server.config.ts` script). Angular throws an
 * error if it detects that the token is defined while running on the client.
 *
 * @usageNotes
 *
 * When the same API endpoint is accessed via `http://internal-domain.com:8080` on the server and
 * via `https://external-domain.com` on the client, you can use the following configuration:
 * ```ts
 * // in app.server.config.ts
 * {
 *     provide: HTTP_TRANSFER_CACHE_ORIGIN_MAP,
 *     useValue: {
 *         'http://internal-domain.com:8080': 'https://external-domain.com'
 *     }
 * }
 * ```
 *
 * @publicApi
 */
const HTTP_TRANSFER_CACHE_ORIGIN_MAP = new InjectionToken(ngDevMode ? 'HTTP_TRANSFER_CACHE_ORIGIN_MAP' : '');
/**
 * Keys within cached response data structure.
 */
const BODY = 'b';
const HEADERS = 'h';
const STATUS = 's';
const STATUS_TEXT = 'st';
const REQ_URL = 'u';
const RESPONSE_TYPE = 'rt';
const CACHE_OPTIONS = new InjectionToken(ngDevMode ? 'HTTP_TRANSFER_STATE_CACHE_OPTIONS' : '');
/**
 * A list of allowed HTTP methods to cache.
 */
const ALLOWED_METHODS = ['GET', 'HEAD'];
function transferCacheInterceptorFn(req, next) {
    const { isCacheActive, ...globalOptions } = inject(CACHE_OPTIONS);
    const { transferCache: requestOptions, method: requestMethod } = req;
    // In the following situations we do not want to cache the request
    if (!isCacheActive ||
        requestOptions === false ||
        // POST requests are allowed either globally or at request level
        (requestMethod === 'POST' && !globalOptions.includePostRequests && !requestOptions) ||
        (requestMethod !== 'POST' && !ALLOWED_METHODS.includes(requestMethod)) ||
        // Do not cache request that require authorization when includeRequestsWithAuthHeaders is falsey
        (!globalOptions.includeRequestsWithAuthHeaders && hasAuthHeaders(req)) ||
        globalOptions.filter?.(req) === false) {
        return next(req);
    }
    const transferState = inject(TransferState);
    const originMap = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {
        optional: true,
    });
    if (typeof ngServerMode !== 'undefined' && !ngServerMode && originMap) {
        throw new _RuntimeError(2803 /* RuntimeErrorCode.HTTP_ORIGIN_MAP_USED_IN_CLIENT */, ngDevMode &&
            'Angular detected that the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token is configured and ' +
                'present in the client side code. Please ensure that this token is only provided in the ' +
                'server code of the application.');
    }
    const requestUrl = typeof ngServerMode !== 'undefined' && ngServerMode && originMap
        ? mapRequestOriginUrl(req.url, originMap)
        : req.url;
    const storeKey = makeCacheKey(req, requestUrl);
    const response = transferState.get(storeKey, null);
    let headersToInclude = globalOptions.includeHeaders;
    if (typeof requestOptions === 'object' && requestOptions.includeHeaders) {
        // Request-specific config takes precedence over the global config.
        headersToInclude = requestOptions.includeHeaders;
    }
    if (response) {
        const { [BODY]: undecodedBody, [RESPONSE_TYPE]: responseType, [HEADERS]: httpHeaders, [STATUS]: status, [STATUS_TEXT]: statusText, [REQ_URL]: url, } = response;
        // Request found in cache. Respond using it.
        let body = undecodedBody;
        switch (responseType) {
            case 'arraybuffer':
                body = new TextEncoder().encode(undecodedBody).buffer;
                break;
            case 'blob':
                body = new Blob([undecodedBody]);
                break;
        }
        // We want to warn users accessing a header provided from the cache
        // That HttpTransferCache alters the headers
        // The warning will be logged a single time by HttpHeaders instance
        let headers = new HttpHeaders(httpHeaders);
        if (typeof ngDevMode === 'undefined' || ngDevMode) {
            // Append extra logic in dev mode to produce a warning when a header
            // that was not transferred to the client is accessed in the code via `get`
            // and `has` calls.
            headers = appendMissingHeadersDetection(req.url, headers, headersToInclude ?? []);
        }
        return of(new HttpResponse({
            body,
            headers,
            status,
            statusText,
            url,
        }));
    }
    // Request not found in cache. Make the request and cache it if on the server.
    return next(req).pipe(tap((event) => {
        if (event instanceof HttpResponse && typeof ngServerMode !== 'undefined' && ngServerMode) {
            transferState.set(storeKey, {
                [BODY]: event.body,
                [HEADERS]: getFilteredHeaders(event.headers, headersToInclude),
                [STATUS]: event.status,
                [STATUS_TEXT]: event.statusText,
                [REQ_URL]: requestUrl,
                [RESPONSE_TYPE]: req.responseType,
            });
        }
    }));
}
/** @returns true when the requests contains autorization related headers. */
function hasAuthHeaders(req) {
    return req.headers.has('authorization') || req.headers.has('proxy-authorization');
}
function getFilteredHeaders(headers, includeHeaders) {
    if (!includeHeaders) {
        return {};
    }
    const headersMap = {};
    for (const key of includeHeaders) {
        const values = headers.getAll(key);
        if (values !== null) {
            headersMap[key] = values;
        }
    }
    return headersMap;
}
function sortAndConcatParams(params) {
    return [...params.keys()]
        .sort()
        .map((k) => `${k}=${params.getAll(k)}`)
        .join('&');
}
function makeCacheKey(request, mappedRequestUrl) {
    // make the params encoded same as a url so it's easy to identify
    const { params, method, responseType } = request;
    const encodedParams = sortAndConcatParams(params);
    let serializedBody = request.serializeBody();
    if (serializedBody instanceof URLSearchParams) {
        serializedBody = sortAndConcatParams(serializedBody);
    }
    else if (typeof serializedBody !== 'string') {
        serializedBody = '';
    }
    const key = [method, responseType, mappedRequestUrl, serializedBody, encodedParams].join('|');
    const hash = generateHash(key);
    return makeStateKey(hash);
}
/**
 * A method that returns a hash representation of a string using a variant of DJB2 hash
 * algorithm.
 *
 * This is the same hashing logic that is used to generate component ids.
 */
function generateHash(value) {
    let hash = 0;
    for (const char of value) {
        hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;
    }
    // Force positive number hash.
    // 2147483647 = equivalent of Integer.MAX_VALUE.
    hash += 2147483647 + 1;
    return hash.toString();
}
/**
 * Returns the DI providers needed to enable HTTP transfer cache.
 *
 * By default, when using server rendering, requests are performed twice: once on the server and
 * other one on the browser.
 *
 * When these providers are added, requests performed on the server are cached and reused during the
 * bootstrapping of the application in the browser thus avoiding duplicate requests and reducing
 * load time.
 *
 */
function withHttpTransferCache(cacheOptions) {
    return [
        {
            provide: CACHE_OPTIONS,
            useFactory: () => {
                _performanceMarkFeature('NgHttpTransferCache');
                return { isCacheActive: true, ...cacheOptions };
            },
        },
        {
            provide: HTTP_ROOT_INTERCEPTOR_FNS,
            useValue: transferCacheInterceptorFn,
            multi: true,
        },
        {
            provide: APP_BOOTSTRAP_LISTENER,
            multi: true,
            useFactory: () => {
                const appRef = inject(ApplicationRef);
                const cacheState = inject(CACHE_OPTIONS);
                return () => {
                    appRef.whenStable().then(() => {
                        cacheState.isCacheActive = false;
                    });
                };
            },
        },
    ];
}
/**
 * This function will add a proxy to an HttpHeader to intercept calls to get/has
 * and log a warning if the header entry requested has been removed
 */
function appendMissingHeadersDetection(url, headers, headersToInclude) {
    const warningProduced = new Set();
    return new Proxy(headers, {
        get(target, prop) {
            const value = Reflect.get(target, prop);
            const methods = new Set(['get', 'has', 'getAll']);
            if (typeof value !== 'function' || !methods.has(prop)) {
                return value;
            }
            return (headerName) => {
                // We log when the key has been removed and a warning hasn't been produced for the header
                const key = (prop + ':' + headerName).toLowerCase(); // e.g. `get:cache-control`
                if (!headersToInclude.includes(headerName) && !warningProduced.has(key)) {
                    warningProduced.add(key);
                    const truncatedUrl = _truncateMiddle(url);
                    // TODO: create Error guide for this warning
                    console.warn(_formatRuntimeError(2802 /* RuntimeErrorCode.HEADERS_ALTERED_BY_TRANSFER_CACHE */, `Angular detected that the \`${headerName}\` header is accessed, but the value of the header ` +
                        `was not transferred from the server to the client by the HttpTransferCache. ` +
                        `To include the value of the \`${headerName}\` header for the \`${truncatedUrl}\` request, ` +
                        `use the \`includeHeaders\` list. The \`includeHeaders\` can be defined either ` +
                        `on a request level by adding the \`transferCache\` parameter, or on an application ` +
                        `level by adding the \`httpCacheTransfer.includeHeaders\` argument to the ` +
                        `\`provideClientHydration()\` call. `));
                }
                // invoking the original method
                return value.apply(target, [headerName]);
            };
        },
    });
}
function mapRequestOriginUrl(url, originMap) {
    const origin = new URL(url, 'resolve://').origin;
    const mappedOrigin = originMap[origin];
    if (!mappedOrigin) {
        return url;
    }
    if (typeof ngDevMode === 'undefined' || ngDevMode) {
        verifyMappedOrigin(mappedOrigin);
    }
    return url.replace(origin, mappedOrigin);
}
function verifyMappedOrigin(url) {
    if (new URL(url, 'resolve://').pathname !== '/') {
        throw new _RuntimeError(2804 /* RuntimeErrorCode.HTTP_ORIGIN_MAP_CONTAINS_PATH */, 'Angular detected a URL with a path segment in the value provided for the ' +
            `\`HTTP_TRANSFER_CACHE_ORIGIN_MAP\` token: ${url}. The map should only contain origins ` +
            'without any other segments.');
    }
}

export { HTTP_TRANSFER_CACHE_ORIGIN_MAP, HttpClient, HttpErrorResponse, HttpEventType, HttpHeaders, HttpParams, HttpRequest, HttpResponse, httpResource, HTTP_ROOT_INTERCEPTOR_FNS as ɵHTTP_ROOT_INTERCEPTOR_FNS, withHttpTransferCache as ɵwithHttpTransferCache };
//# sourceMappingURL=http.mjs.map
b2ixF`{"version":3,"file":"http.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/resource.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/transfer_cache.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Injector,\n  Signal,\n  ɵResourceImpl as ResourceImpl,\n  inject,\n  linkedSignal,\n  assertInInjectionContext,\n  signal,\n  ResourceStatus,\n  computed,\n  Resource,\n  WritableSignal,\n  ResourceStreamItem,\n  type ValueEqualityFn,\n} from '@angular/core';\nimport {Subscription} from 'rxjs';\n\nimport {HttpRequest} from './request';\nimport {HttpClient} from './client';\nimport {HttpErrorResponse, HttpEventType, HttpProgressEvent, HttpResponseBase} from './response';\nimport {HttpHeaders} from './headers';\nimport {HttpParams} from './params';\nimport {HttpResourceRef, HttpResourceOptions, HttpResourceRequest} from './resource_api';\n\n/**\n * Type for the `httpRequest` top-level function, which includes the call signatures for the JSON-\n * based `httpRequest` as well as sub-functions for `ArrayBuffer`, `Blob`, and `string` type\n * requests.\n *\n * @experimental\n */\nexport interface HttpResourceFn {\n  /**\n   * Create a `Resource` that fetches data with an HTTP GET request to the given URL.\n   *\n   * If a reactive function is passed for the URL, the resource will update when the URL changes via\n   * signals.\n   *\n   * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n   * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of\n   * `httpResource`, such as `httpResource.text()`, to parse the response differently.\n   *\n   * @experimental\n   */\n  <TResult = unknown>(\n    url: string | (() => string | undefined),\n    options: HttpResourceOptions<TResult, unknown> & {defaultValue: NoInfer<TResult>},\n  ): HttpResourceRef<TResult>;\n\n  /**\n   * Create a `Resource` that fetches data with an HTTP GET request to the given URL.\n   *\n   * If a reactive function is passed for the URL, the resource will update when the URL changes via\n   * signals.\n   *\n   * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n   * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of\n   * `httpResource`, such as `httpResource.text()`, to parse the response differently.\n   *\n   * @experimental\n   */\n  <TResult = unknown>(\n    url: string | (() => string | undefined),\n    options?: HttpResourceOptions<TResult, unknown>,\n  ): HttpResourceRef<TResult | undefined>;\n\n  /**\n   * Create a `Resource` that fetches data with the configured HTTP request.\n   *\n   * If a reactive function is passed for the request, the resource will update when the request\n   * changes via signals.\n   *\n   * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n   * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of\n   * `httpResource`, such as `httpResource.text()`, to parse the response differently.\n   *\n   * @experimental\n   */\n  <TResult = unknown>(\n    request: HttpResourceRequest | (() => HttpResourceRequest | undefined),\n    options: HttpResourceOptions<TResult, unknown> & {defaultValue: NoInfer<TResult>},\n  ): HttpResourceRef<TResult>;\n\n  /**\n   * Create a `Resource` that fetches data with the configured HTTP request.\n   *\n   * If a reactive function is passed for the request, the resource will update when the request\n   * changes via signals.\n   *\n   * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n   * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of\n   * `httpResource`, such as `httpResource.text()`, to parse the response differently.\n   *\n   * @experimental\n   */\n  <TResult = unknown>(\n    request: HttpResourceRequest | (() => HttpResourceRequest | undefined),\n    options?: HttpResourceOptions<TResult, unknown>,\n  ): HttpResourceRef<TResult | undefined>;\n\n  /**\n   * Create a `Resource` that fetches data with the configured HTTP request.\n   *\n   * If a reactive function is passed for the URL or request, the resource will update when the\n   * URL or request changes via signals.\n   *\n   * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n   * of the `HttpClient` API. Data is parsed into an `ArrayBuffer`.\n   *\n   * @experimental\n   */\n  arrayBuffer: {\n    <TResult = ArrayBuffer>(\n      url: string | (() => string | undefined),\n      options: HttpResourceOptions<TResult, ArrayBuffer> & {defaultValue: NoInfer<TResult>},\n    ): HttpResourceRef<TResult>;\n\n    <TResult = ArrayBuffer>(\n      url: string | (() => string | undefined),\n      options?: HttpResourceOptions<TResult, ArrayBuffer>,\n    ): HttpResourceRef<TResult | undefined>;\n\n    <TResult = ArrayBuffer>(\n      request: HttpResourceRequest | (() => HttpResourceRequest | undefined),\n      options: HttpResourceOptions<TResult, ArrayBuffer> & {defaultValue: NoInfer<TResult>},\n    ): HttpResourceRef<TResult>;\n\n    <TResult = ArrayBuffer>(\n      request: HttpResourceRequest | (() => HttpResourceRequest | undefined),\n      options?: HttpResourceOptions<TResult, ArrayBuffer>,\n    ): HttpResourceRef<TResult | undefined>;\n  };\n\n  /**\n   * Create a `Resource` that fetches data with the configured HTTP request.\n   *\n   * If a reactive function is passed for the URL or request, the resource will update when the\n   * URL or request changes via signals.\n   *\n   * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n   * of the `HttpClient` API. Data is parsed into a `Blob`.\n   *\n   * @experimental\n   */\n  blob: {\n    <TResult = Blob>(\n      url: string | (() => string | undefined),\n      options: HttpResourceOptions<TResult, Blob> & {defaultValue: NoInfer<TResult>},\n    ): HttpResourceRef<TResult>;\n\n    <TResult = Blob>(\n      url: string | (() => string | undefined),\n      options?: HttpResourceOptions<TResult, Blob>,\n    ): HttpResourceRef<TResult | undefined>;\n\n    <TResult = Blob>(\n      request: HttpResourceRequest | (() => HttpResourceRequest | undefined),\n      options: HttpResourceOptions<TResult, Blob> & {defaultValue: NoInfer<TResult>},\n    ): HttpResourceRef<TResult>;\n\n    <TResult = Blob>(\n      request: HttpResourceRequest | (() => HttpResourceRequest | undefined),\n      options?: HttpResourceOptions<TResult, Blob>,\n    ): HttpResourceRef<TResult | undefined>;\n  };\n\n  /**\n   * Create a `Resource` that fetches data with the configured HTTP request.\n   *\n   * If a reactive function is passed for the URL or request, the resource will update when the\n   * URL or request changes via signals.\n   *\n   * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features\n   * of the `HttpClient` API. Data is parsed as a `string`.\n   *\n   * @experimental\n   */\n  text: {\n    <TResult = string>(\n      url: string | (() => string | undefined),\n      options: HttpResourceOptions<TResult, string> & {defaultValue: NoInfer<TResult>},\n    ): HttpResourceRef<TResult>;\n\n    <TResult = string>(\n      url: string | (() => string | undefined),\n      options?: HttpResourceOptions<TResult, string>,\n    ): HttpResourceRef<TResult | undefined>;\n\n    <TResult = string>(\n      request: HttpResourceRequest | (() => HttpResourceRequest | undefined),\n      options: HttpResourceOptions<TResult, string> & {defaultValue: NoInfer<TResult>},\n    ): HttpResourceRef<TResult>;\n\n    <TResult = string>(\n      request: HttpResourceRequest | (() => HttpResourceRequest | undefined),\n      options?: HttpResourceOptions<TResult, string>,\n    ): HttpResourceRef<TResult | undefined>;\n  };\n}\n\n/**\n * `httpResource` makes a reactive HTTP request and exposes the request status and response value as\n * a `WritableResource`. By default, it assumes that the backend will return JSON data. To make a\n * request that expects a different kind of data, you can use a sub-constructor of `httpResource`,\n * such as `httpResource.text`.\n *\n * @experimental\n * @initializerApiFunction\n */\nexport const httpResource: HttpResourceFn = (() => {\n  const jsonFn = makeHttpResourceFn<unknown>('json') as HttpResourceFn;\n  jsonFn.arrayBuffer = makeHttpResourceFn<ArrayBuffer>('arraybuffer');\n  jsonFn.blob = makeHttpResourceFn('blob');\n  jsonFn.text = makeHttpResourceFn('text');\n  return jsonFn;\n})();\n\ntype RawRequestType =\n  | string\n  | (() => string | undefined)\n  | HttpResourceRequest\n  | (() => HttpResourceRequest | undefined);\n\nfunction makeHttpResourceFn<TRaw>(responseType: 'arraybuffer' | 'blob' | 'json' | 'text') {\n  return function httpResourceRef<TResult = TRaw>(\n    request: RawRequestType,\n    options?: HttpResourceOptions<TResult, TRaw>,\n  ): HttpResourceRef<TResult> {\n    options?.injector || assertInInjectionContext(httpResource);\n    const injector = options?.injector ?? inject(Injector);\n    return new HttpResourceImpl(\n      injector,\n      () => normalizeRequest(request, responseType),\n      options?.defaultValue,\n      options?.parse as (value: unknown) => TResult,\n      options?.equal as ValueEqualityFn<unknown>,\n    ) as HttpResourceRef<TResult>;\n  };\n}\n\nfunction normalizeRequest(\n  request: RawRequestType,\n  responseType: 'arraybuffer' | 'blob' | 'json' | 'text',\n): HttpRequest<unknown> | undefined {\n  let unwrappedRequest = typeof request === 'function' ? request() : request;\n  if (unwrappedRequest === undefined) {\n    return undefined;\n  } else if (typeof unwrappedRequest === 'string') {\n    unwrappedRequest = {url: unwrappedRequest};\n  }\n\n  const headers =\n    unwrappedRequest.headers instanceof HttpHeaders\n      ? unwrappedRequest.headers\n      : new HttpHeaders(\n          unwrappedRequest.headers as\n            | Record<string, string | number | Array<string | number>>\n            | undefined,\n        );\n\n  const params =\n    unwrappedRequest.params instanceof HttpParams\n      ? unwrappedRequest.params\n      : new HttpParams({fromObject: unwrappedRequest.params});\n\n  return new HttpRequest(\n    unwrappedRequest.method ?? 'GET',\n    unwrappedRequest.url,\n    unwrappedRequest.body ?? null,\n    {\n      headers,\n      params,\n      reportProgress: unwrappedRequest.reportProgress,\n      withCredentials: unwrappedRequest.withCredentials,\n      responseType,\n      context: unwrappedRequest.context,\n      transferCache: unwrappedRequest.transferCache,\n    },\n  );\n}\nclass HttpResourceImpl<T>\n  extends ResourceImpl<T, HttpRequest<unknown> | undefined>\n  implements HttpResourceRef<T>\n{\n  private client!: HttpClient;\n  private _headers = linkedSignal({\n    source: this.extRequest,\n    computation: () => undefined as HttpHeaders | undefined,\n  });\n  private _progress = linkedSignal({\n    source: this.extRequest,\n    computation: () => undefined as HttpProgressEvent | undefined,\n  });\n  private _statusCode = linkedSignal({\n    source: this.extRequest,\n    computation: () => undefined as number | undefined,\n  });\n\n  readonly headers = computed(() =>\n    this.status() === ResourceStatus.Resolved || this.status() === ResourceStatus.Error\n      ? this._headers()\n      : undefined,\n  );\n  readonly progress = this._progress.asReadonly();\n  readonly statusCode = this._statusCode.asReadonly();\n\n  constructor(\n    injector: Injector,\n    request: () => HttpRequest<T> | undefined,\n    defaultValue: T,\n    parse?: (value: unknown) => T,\n    equal?: ValueEqualityFn<unknown>,\n  ) {\n    super(\n      request,\n      ({request, abortSignal}) => {\n        let sub: Subscription;\n\n        // Track the abort listener so it can be removed if the Observable completes (as a memory\n        // optimization).\n        const onAbort = () => sub.unsubscribe();\n        abortSignal.addEventListener('abort', onAbort);\n\n        // Start off stream as undefined.\n        const stream = signal<ResourceStreamItem<T>>({value: undefined as T});\n        let resolve: ((value: Signal<ResourceStreamItem<T>>) => void) | undefined;\n        const promise = new Promise<Signal<ResourceStreamItem<T>>>((r) => (resolve = r));\n\n        const send = (value: ResourceStreamItem<T>): void => {\n          stream.set(value);\n          resolve?.(stream);\n          resolve = undefined;\n        };\n\n        sub = this.client.request(request!).subscribe({\n          next: (event) => {\n            switch (event.type) {\n              case HttpEventType.Response:\n                this._headers.set(event.headers);\n                this._statusCode.set(event.status);\n                try {\n                  send({value: parse ? parse(event.body) : (event.body as T)});\n                } catch (error) {\n                  send({error});\n                }\n                break;\n              case HttpEventType.DownloadProgress:\n                this._progress.set(event);\n                break;\n            }\n          },\n          error: (error) => {\n            if (error instanceof HttpErrorResponse) {\n              this._headers.set(error.headers);\n              this._statusCode.set(error.status);\n            }\n\n            send({error});\n            abortSignal.removeEventListener('abort', onAbort);\n          },\n          complete: () => {\n            if (resolve) {\n              send({error: new Error('Resource completed before producing a value')});\n            }\n            abortSignal.removeEventListener('abort', onAbort);\n          },\n        });\n\n        return promise;\n      },\n      defaultValue,\n      equal,\n      injector,\n    );\n    this.client = injector.get(HttpClient);\n  }\n\n  // This is a type only override of the method\n  declare hasValue: () => this is HttpResourceRef<Exclude<T, undefined>>;\n}\n\n/**\n * A `Resource` of the `HttpResponse` meant for use in `HttpResource` if we decide to go this route.\n *\n * TODO(alxhub): delete this if we decide we don't want it.\n */\nclass HttpResponseResource implements Resource<HttpResponseBase | undefined> {\n  readonly status: Signal<ResourceStatus>;\n  readonly value: WritableSignal<HttpResponseBase | undefined>;\n  readonly error: Signal<unknown>;\n  readonly isLoading: Signal<boolean>;\n\n  constructor(\n    private parent: Resource<unknown>,\n    request: Signal<unknown>,\n  ) {\n    this.status = computed(() => {\n      // There are two kinds of errors which can occur in an HTTP request: HTTP errors or normal JS\n      // errors. Since we have a response for HTTP errors, we report `Resolved` status even if the\n      // overall request is considered to be in an Error state.\n      if (parent.status() === ResourceStatus.Error) {\n        return this.value() !== undefined ? ResourceStatus.Resolved : ResourceStatus.Error;\n      }\n      return parent.status();\n    });\n    this.error = computed(() => {\n      // Filter out HTTP errors.\n      return this.value() === undefined ? parent.error() : undefined;\n    });\n    this.value = linkedSignal({\n      source: request,\n      computation: () => undefined as HttpResponseBase | undefined,\n    });\n    this.isLoading = parent.isLoading;\n  }\n\n  hasValue(): this is Resource<HttpResponseBase> {\n    return this.value() !== undefined;\n  }\n\n  reload(): boolean {\n    // TODO: should you be able to reload this way?\n    return this.parent.reload();\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  APP_BOOTSTRAP_LISTENER,\n  ApplicationRef,\n  inject,\n  InjectionToken,\n  makeStateKey,\n  Provider,\n  StateKey,\n  TransferState,\n  ɵformatRuntimeError as formatRuntimeError,\n  ɵperformanceMarkFeature as performanceMarkFeature,\n  ɵtruncateMiddle as truncateMiddle,\n  ɵRuntimeError as RuntimeError,\n} from '@angular/core';\nimport {Observable, of} from 'rxjs';\nimport {tap} from 'rxjs/operators';\n\nimport {RuntimeErrorCode} from './errors';\nimport {HttpHeaders} from './headers';\nimport {HTTP_ROOT_INTERCEPTOR_FNS, HttpHandlerFn} from './interceptor';\nimport {HttpRequest} from './request';\nimport {HttpEvent, HttpResponse} from './response';\nimport {HttpParams} from './params';\n\n/**\n * Options to configure how TransferCache should be used to cache requests made via HttpClient.\n *\n * @param includeHeaders Specifies which headers should be included into cached responses. No\n *     headers are included by default.\n * @param filter A function that receives a request as an argument and returns a boolean to indicate\n *     whether a request should be included into the cache.\n * @param includePostRequests Enables caching for POST requests. By default, only GET and HEAD\n *     requests are cached. This option can be enabled if POST requests are used to retrieve data\n *     (for example using GraphQL).\n * @param includeRequestsWithAuthHeaders Enables caching of requests containing either `Authorization`\n *     or `Proxy-Authorization` headers. By default, these requests are excluded from caching.\n *\n * @publicApi\n */\nexport type HttpTransferCacheOptions = {\n  includeHeaders?: string[];\n  filter?: (req: HttpRequest<unknown>) => boolean;\n  includePostRequests?: boolean;\n  includeRequestsWithAuthHeaders?: boolean;\n};\n\n/**\n * If your application uses different HTTP origins to make API calls (via `HttpClient`) on the server and\n * on the client, the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token allows you to establish a mapping\n * between those origins, so that `HttpTransferCache` feature can recognize those requests as the same\n * ones and reuse the data cached on the server during hydration on the client.\n *\n * **Important note**: the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token should *only* be provided in\n * the *server* code of your application (typically in the `app.server.config.ts` script). Angular throws an\n * error if it detects that the token is defined while running on the client.\n *\n * @usageNotes\n *\n * When the same API endpoint is accessed via `http://internal-domain.com:8080` on the server and\n * via `https://external-domain.com` on the client, you can use the following configuration:\n * ```ts\n * // in app.server.config.ts\n * {\n *     provide: HTTP_TRANSFER_CACHE_ORIGIN_MAP,\n *     useValue: {\n *         'http://internal-domain.com:8080': 'https://external-domain.com'\n *     }\n * }\n * ```\n *\n * @publicApi\n */\nexport const HTTP_TRANSFER_CACHE_ORIGIN_MAP = new InjectionToken<Record<string, string>>(\n  ngDevMode ? 'HTTP_TRANSFER_CACHE_ORIGIN_MAP' : '',\n);\n\n/**\n * Keys within cached response data structure.\n */\n\nexport const BODY = 'b';\nexport const HEADERS = 'h';\nexport const STATUS = 's';\nexport const STATUS_TEXT = 'st';\nexport const REQ_URL = 'u';\nexport const RESPONSE_TYPE = 'rt';\n\ninterface TransferHttpResponse {\n  /** body */\n  [BODY]: any;\n  /** headers */\n  [HEADERS]: Record<string, string[]>;\n  /** status */\n  [STATUS]?: number;\n  /** statusText */\n  [STATUS_TEXT]?: string;\n  /** url */\n  [REQ_URL]?: string;\n  /** responseType */\n  [RESPONSE_TYPE]?: HttpRequest<unknown>['responseType'];\n}\n\ninterface CacheOptions extends HttpTransferCacheOptions {\n  isCacheActive: boolean;\n}\n\nconst CACHE_OPTIONS = new InjectionToken<CacheOptions>(\n  ngDevMode ? 'HTTP_TRANSFER_STATE_CACHE_OPTIONS' : '',\n);\n\n/**\n * A list of allowed HTTP methods to cache.\n */\nconst ALLOWED_METHODS = ['GET', 'HEAD'];\n\nexport function transferCacheInterceptorFn(\n  req: HttpRequest<unknown>,\n  next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n  const {isCacheActive, ...globalOptions} = inject(CACHE_OPTIONS);\n  const {transferCache: requestOptions, method: requestMethod} = req;\n\n  // In the following situations we do not want to cache the request\n  if (\n    !isCacheActive ||\n    requestOptions === false ||\n    // POST requests are allowed either globally or at request level\n    (requestMethod === 'POST' && !globalOptions.includePostRequests && !requestOptions) ||\n    (requestMethod !== 'POST' && !ALLOWED_METHODS.includes(requestMethod)) ||\n    // Do not cache request that require authorization when includeRequestsWithAuthHeaders is falsey\n    (!globalOptions.includeRequestsWithAuthHeaders && hasAuthHeaders(req)) ||\n    globalOptions.filter?.(req) === false\n  ) {\n    return next(req);\n  }\n\n  const transferState = inject(TransferState);\n\n  const originMap: Record<string, string> | null = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {\n    optional: true,\n  });\n\n  if (typeof ngServerMode !== 'undefined' && !ngServerMode && originMap) {\n    throw new RuntimeError(\n      RuntimeErrorCode.HTTP_ORIGIN_MAP_USED_IN_CLIENT,\n      ngDevMode &&\n        'Angular detected that the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token is configured and ' +\n          'present in the client side code. Please ensure that this token is only provided in the ' +\n          'server code of the application.',\n    );\n  }\n\n  const requestUrl =\n    typeof ngServerMode !== 'undefined' && ngServerMode && originMap\n      ? mapRequestOriginUrl(req.url, originMap)\n      : req.url;\n\n  const storeKey = makeCacheKey(req, requestUrl);\n  const response = transferState.get(storeKey, null);\n\n  let headersToInclude = globalOptions.includeHeaders;\n  if (typeof requestOptions === 'object' && requestOptions.includeHeaders) {\n    // Request-specific config takes precedence over the global config.\n    headersToInclude = requestOptions.includeHeaders;\n  }\n\n  if (response) {\n    const {\n      [BODY]: undecodedBody,\n      [RESPONSE_TYPE]: responseType,\n      [HEADERS]: httpHeaders,\n      [STATUS]: status,\n      [STATUS_TEXT]: statusText,\n      [REQ_URL]: url,\n    } = response;\n    // Request found in cache. Respond using it.\n    let body: ArrayBuffer | Blob | string | undefined = undecodedBody;\n\n    switch (responseType) {\n      case 'arraybuffer':\n        body = new TextEncoder().encode(undecodedBody).buffer;\n        break;\n      case 'blob':\n        body = new Blob([undecodedBody]);\n        break;\n    }\n\n    // We want to warn users accessing a header provided from the cache\n    // That HttpTransferCache alters the headers\n    // The warning will be logged a single time by HttpHeaders instance\n    let headers = new HttpHeaders(httpHeaders);\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      // Append extra logic in dev mode to produce a warning when a header\n      // that was not transferred to the client is accessed in the code via `get`\n      // and `has` calls.\n      headers = appendMissingHeadersDetection(req.url, headers, headersToInclude ?? []);\n    }\n\n    return of(\n      new HttpResponse({\n        body,\n        headers,\n        status,\n        statusText,\n        url,\n      }),\n    );\n  }\n\n  // Request not found in cache. Make the request and cache it if on the server.\n  return next(req).pipe(\n    tap((event: HttpEvent<unknown>) => {\n      if (event instanceof HttpResponse && typeof ngServerMode !== 'undefined' && ngServerMode) {\n        transferState.set<TransferHttpResponse>(storeKey, {\n          [BODY]: event.body,\n          [HEADERS]: getFilteredHeaders(event.headers, headersToInclude),\n          [STATUS]: event.status,\n          [STATUS_TEXT]: event.statusText,\n          [REQ_URL]: requestUrl,\n          [RESPONSE_TYPE]: req.responseType,\n        });\n      }\n    }),\n  );\n}\n\n/** @returns true when the requests contains autorization related headers. */\nfunction hasAuthHeaders(req: HttpRequest<unknown>): boolean {\n  return req.headers.has('authorization') || req.headers.has('proxy-authorization');\n}\n\nfunction getFilteredHeaders(\n  headers: HttpHeaders,\n  includeHeaders: string[] | undefined,\n): Record<string, string[]> {\n  if (!includeHeaders) {\n    return {};\n  }\n\n  const headersMap: Record<string, string[]> = {};\n  for (const key of includeHeaders) {\n    const values = headers.getAll(key);\n    if (values !== null) {\n      headersMap[key] = values;\n    }\n  }\n\n  return headersMap;\n}\n\nfunction sortAndConcatParams(params: HttpParams | URLSearchParams): string {\n  return [...params.keys()]\n    .sort()\n    .map((k) => `${k}=${params.getAll(k)}`)\n    .join('&');\n}\n\nfunction makeCacheKey(\n  request: HttpRequest<any>,\n  mappedRequestUrl: string,\n): StateKey<TransferHttpResponse> {\n  // make the params encoded same as a url so it's easy to identify\n  const {params, method, responseType} = request;\n  const encodedParams = sortAndConcatParams(params);\n\n  let serializedBody = request.serializeBody();\n  if (serializedBody instanceof URLSearchParams) {\n    serializedBody = sortAndConcatParams(serializedBody);\n  } else if (typeof serializedBody !== 'string') {\n    serializedBody = '';\n  }\n\n  const key = [method, responseType, mappedRequestUrl, serializedBody, encodedParams].join('|');\n  const hash = generateHash(key);\n\n  return makeStateKey(hash);\n}\n\n/**\n * A method that returns a hash representation of a string using a variant of DJB2 hash\n * algorithm.\n *\n * This is the same hashing logic that is used to generate component ids.\n */\nfunction generateHash(value: string): string {\n  let hash = 0;\n\n  for (const char of value) {\n    hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;\n  }\n\n  // Force positive number hash.\n  // 2147483647 = equivalent of Integer.MAX_VALUE.\n  hash += 2147483647 + 1;\n\n  return hash.toString();\n}\n\n/**\n * Returns the DI providers needed to enable HTTP transfer cache.\n *\n * By default, when using server rendering, requests are performed twice: once on the server and\n * other one on the browser.\n *\n * When these providers are added, requests performed on the server are cached and reused during the\n * bootstrapping of the application in the browser thus avoiding duplicate requests and reducing\n * load time.\n *\n */\nexport function withHttpTransferCache(cacheOptions: HttpTransferCacheOptions): Provider[] {\n  return [\n    {\n      provide: CACHE_OPTIONS,\n      useFactory: (): CacheOptions => {\n        performanceMarkFeature('NgHttpTransferCache');\n        return {isCacheActive: true, ...cacheOptions};\n      },\n    },\n    {\n      provide: HTTP_ROOT_INTERCEPTOR_FNS,\n      useValue: transferCacheInterceptorFn,\n      multi: true,\n    },\n    {\n      provide: APP_BOOTSTRAP_LISTENER,\n      multi: true,\n      useFactory: () => {\n        const appRef = inject(ApplicationRef);\n        const cacheState = inject(CACHE_OPTIONS);\n\n        return () => {\n          appRef.whenStable().then(() => {\n            cacheState.isCacheActive = false;\n          });\n        };\n      },\n    },\n  ];\n}\n\n/**\n * This function will add a proxy to an HttpHeader to intercept calls to get/has\n * and log a warning if the header entry requested has been removed\n */\nfunction appendMissingHeadersDetection(\n  url: string,\n  headers: HttpHeaders,\n  headersToInclude: string[],\n): HttpHeaders {\n  const warningProduced = new Set();\n  return new Proxy<HttpHeaders>(headers, {\n    get(target: HttpHeaders, prop: keyof HttpHeaders): unknown {\n      const value = Reflect.get(target, prop);\n      const methods: Set<keyof HttpHeaders> = new Set(['get', 'has', 'getAll']);\n\n      if (typeof value !== 'function' || !methods.has(prop)) {\n        return value;\n      }\n\n      return (headerName: string) => {\n        // We log when the key has been removed and a warning hasn't been produced for the header\n        const key = (prop + ':' + headerName).toLowerCase(); // e.g. `get:cache-control`\n        if (!headersToInclude.includes(headerName) && !warningProduced.has(key)) {\n          warningProduced.add(key);\n          const truncatedUrl = truncateMiddle(url);\n\n          // TODO: create Error guide for this warning\n          console.warn(\n            formatRuntimeError(\n              RuntimeErrorCode.HEADERS_ALTERED_BY_TRANSFER_CACHE,\n              `Angular detected that the \\`${headerName}\\` header is accessed, but the value of the header ` +\n                `was not transferred from the server to the client by the HttpTransferCache. ` +\n                `To include the value of the \\`${headerName}\\` header for the \\`${truncatedUrl}\\` request, ` +\n                `use the \\`includeHeaders\\` list. The \\`includeHeaders\\` can be defined either ` +\n                `on a request level by adding the \\`transferCache\\` parameter, or on an application ` +\n                `level by adding the \\`httpCacheTransfer.includeHeaders\\` argument to the ` +\n                `\\`provideClientHydration()\\` call. `,\n            ),\n          );\n        }\n\n        // invoking the original method\n        return (value as Function).apply(target, [headerName]);\n      };\n    },\n  });\n}\n\nfunction mapRequestOriginUrl(url: string, originMap: Record<string, string>): string {\n  const origin = new URL(url, 'resolve://').origin;\n  const mappedOrigin = originMap[origin];\n  if (!mappedOrigin) {\n    return url;\n  }\n\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    verifyMappedOrigin(mappedOrigin);\n  }\n\n  return url.replace(origin, mappedOrigin);\n}\n\nfunction verifyMappedOrigin(url: string): void {\n  if (new URL(url, 'resolve://').pathname !== '/') {\n    throw new RuntimeError(\n      RuntimeErrorCode.HTTP_ORIGIN_MAP_CONTAINS_PATH,\n      'Angular detected a URL with a path segment in the value provided for the ' +\n        `\\`HTTP_TRANSFER_CACHE_ORIGIN_MAP\\` token: ${url}. The map should only contain origins ` +\n        'without any other segments.',\n    );\n  }\n}\n"],"names":["ResourceImpl","RuntimeError","performanceMarkFeature","truncateMiddle","formatRuntimeError"],"mappings":"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"}`+xJ5/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { Injectable, NgModule } from '@angular/core';
import { Observable } from 'rxjs';
import { HttpHeaders, HttpResponse, HttpStatusCode, HttpErrorResponse, HttpEventType, HttpBackend, REQUESTS_CONTRIBUTE_TO_STABILITY, HttpClientModule } from '../module-z3bvLlVg.mjs';
import 'rxjs/operators';
import '../xhr-BfNfxNDv.mjs';
import '../dom_tokens-rA0ACyx7.mjs';

/**
 * Controller to be injected into tests, that allows for mocking and flushing
 * of requests.
 *
 * @publicApi
 */
class HttpTestingController {
}

/**
 * A mock requests that was received and is ready to be answered.
 *
 * This interface allows access to the underlying `HttpRequest`, and allows
 * responding with `HttpEvent`s or `HttpErrorResponse`s.
 *
 * @publicApi
 */
class TestRequest {
    request;
    observer;
    /**
     * Whether the request was cancelled after it was sent.
     */
    get cancelled() {
        return this._cancelled;
    }
    /**
     * @internal set by `HttpClientTestingBackend`
     */
    _cancelled = false;
    constructor(request, observer) {
        this.request = request;
        this.observer = observer;
    }
    /**
     * Resolve the request by returning a body plus additional HTTP information (such as response
     * headers) if provided.
     * If the request specifies an expected body type, the body is converted into the requested type.
     * Otherwise, the body is converted to `JSON` by default.
     *
     * Both successful and unsuccessful responses can be delivered via `flush()`.
     */
    flush(body, opts = {}) {
        if (this.cancelled) {
            throw new Error(`Cannot flush a cancelled request.`);
        }
        const url = this.request.urlWithParams;
        const headers = opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers);
        body = _maybeConvertBody(this.request.responseType, body);
        let statusText = opts.statusText;
        let status = opts.status !== undefined ? opts.status : HttpStatusCode.Ok;
        if (opts.status === undefined) {
            if (body === null) {
                status = HttpStatusCode.NoContent;
                statusText ||= 'No Content';
            }
            else {
                statusText ||= 'OK';
            }
        }
        if (statusText === undefined) {
            throw new Error('statusText is required when setting a custom status.');
        }
        if (status >= 200 && status < 300) {
            this.observer.next(new HttpResponse({ body, headers, status, statusText, url }));
            this.observer.complete();
        }
        else {
            this.observer.error(new HttpErrorResponse({ error: body, headers, status, statusText, url }));
        }
    }
    error(error, opts = {}) {
        if (this.cancelled) {
            throw new Error(`Cannot return an error for a cancelled request.`);
        }
        if (opts.status && opts.status >= 200 && opts.status < 300) {
            throw new Error(`error() called with a successful status.`);
        }
        const headers = opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers);
        this.observer.error(new HttpErrorResponse({
            error,
            headers,
            status: opts.status || 0,
            statusText: opts.statusText || '',
            url: this.request.urlWithParams,
        }));
    }
    /**
     * Deliver an arbitrary `HttpEvent` (such as a progress event) on the response stream for this
     * request.
     */
    event(event) {
        if (this.cancelled) {
            throw new Error(`Cannot send events to a cancelled request.`);
        }
        this.observer.next(event);
    }
}
/**
 * Helper function to convert a response body to an ArrayBuffer.
 */
function _toArrayBufferBody(body) {
    if (typeof ArrayBuffer === 'undefined') {
        throw new Error('ArrayBuffer responses are not supported on this platform.');
    }
    if (body instanceof ArrayBuffer) {
        return body;
    }
    throw new Error('Automatic conversion to ArrayBuffer is not supported for response type.');
}
/**
 * Helper function to convert a response body to a Blob.
 */
function _toBlob(body) {
    if (typeof Blob === 'undefined') {
        throw new Error('Blob responses are not supported on this platform.');
    }
    if (body instanceof Blob) {
        return body;
    }
    if (ArrayBuffer && body instanceof ArrayBuffer) {
        return new Blob([body]);
    }
    throw new Error('Automatic conversion to Blob is not supported for response type.');
}
/**
 * Helper function to convert a response body to JSON data.
 */
function _toJsonBody(body, format = 'JSON') {
    if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer) {
        throw new Error(`Automatic conversion to ${format} is not supported for ArrayBuffers.`);
    }
    if (typeof Blob !== 'undefined' && body instanceof Blob) {
        throw new Error(`Automatic conversion to ${format} is not supported for Blobs.`);
    }
    if (typeof body === 'string' ||
        typeof body === 'number' ||
        typeof body === 'object' ||
        typeof body === 'boolean' ||
        Array.isArray(body)) {
        return body;
    }
    throw new Error(`Automatic conversion to ${format} is not supported for response type.`);
}
/**
 * Helper function to convert a response body to a string.
 */
function _toTextBody(body) {
    if (typeof body === 'string') {
        return body;
    }
    if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer) {
        throw new Error('Automatic conversion to text is not supported for ArrayBuffers.');
    }
    if (typeof Blob !== 'undefined' && body instanceof Blob) {
        throw new Error('Automatic conversion to text is not supported for Blobs.');
    }
    return JSON.stringify(_toJsonBody(body, 'text'));
}
/**
 * Convert a response body to the requested type.
 */
function _maybeConvertBody(responseType, body) {
    if (body === null) {
        return null;
    }
    switch (responseType) {
        case 'arraybuffer':
            return _toArrayBufferBody(body);
        case 'blob':
            return _toBlob(body);
        case 'json':
            return _toJsonBody(body);
        case 'text':
            return _toTextBody(body);
        default:
            throw new Error(`Unsupported responseType: ${responseType}`);
    }
}

/**
 * A testing backend for `HttpClient` which both acts as an `HttpBackend`
 * and as the `HttpTestingController`.
 *
 * `HttpClientTestingBackend` works by keeping a list of all open requests.
 * As requests come in, they're added to the list. Users can assert that specific
 * requests were made and then flush them. In the end, a verify() method asserts
 * that no unexpected requests were made.
 *
 *
 */
class HttpClientTestingBackend {
    /**
     * List of pending requests which have not yet been expected.
     */
    open = [];
    /**
     * Used when checking if we need to throw the NOT_USING_FETCH_BACKEND_IN_SSR error
     */
    isTestingBackend = true;
    /**
     * Handle an incoming request by queueing it in the list of open requests.
     */
    handle(req) {
        return new Observable((observer) => {
            const testReq = new TestRequest(req, observer);
            this.open.push(testReq);
            observer.next({ type: HttpEventType.Sent });
            return () => {
                testReq._cancelled = true;
            };
        });
    }
    /**
     * Helper function to search for requests in the list of open requests.
     */
    _match(match) {
        if (typeof match === 'string') {
            return this.open.filter((testReq) => testReq.request.urlWithParams === match);
        }
        else if (typeof match === 'function') {
            return this.open.filter((testReq) => match(testReq.request));
        }
        else {
            return this.open.filter((testReq) => (!match.method || testReq.request.method === match.method.toUpperCase()) &&
                (!match.url || testReq.request.urlWithParams === match.url));
        }
    }
    /**
     * Search for requests in the list of open requests, and return all that match
     * without asserting anything about the number of matches.
     */
    match(match) {
        const results = this._match(match);
        results.forEach((result) => {
            const index = this.open.indexOf(result);
            if (index !== -1) {
                this.open.splice(index, 1);
            }
        });
        return results;
    }
    /**
     * Expect that a single outstanding request matches the given matcher, and return
     * it.
     *
     * Requests returned through this API will no longer be in the list of open requests,
     * and thus will not match twice.
     */
    expectOne(match, description) {
        description ||= this.descriptionFromMatcher(match);
        const matches = this.match(match);
        if (matches.length > 1) {
            throw new Error(`Expected one matching request for criteria "${description}", found ${matches.length} requests.`);
        }
        if (matches.length === 0) {
            let message = `Expected one matching request for criteria "${description}", found none.`;
            if (this.open.length > 0) {
                // Show the methods and URLs of open requests in the error, for convenience.
                const requests = this.open.map(describeRequest).join(', ');
                message += ` Requests received are: ${requests}.`;
            }
            throw new Error(message);
        }
        return matches[0];
    }
    /**
     * Expect that no outstanding requests match the given matcher, and throw an error
     * if any do.
     */
    expectNone(match, description) {
        description ||= this.descriptionFromMatcher(match);
        const matches = this.match(match);
        if (matches.length > 0) {
            throw new Error(`Expected zero matching requests for criteria "${description}", found ${matches.length}.`);
        }
    }
    /**
     * Validate that there are no outstanding requests.
     */
    verify(opts = {}) {
        let open = this.open;
        // It's possible that some requests may be cancelled, and this is expected.
        // The user can ask to ignore open requests which have been cancelled.
        if (opts.ignoreCancelled) {
            open = open.filter((testReq) => !testReq.cancelled);
        }
        if (open.length > 0) {
            // Show the methods and URLs of open requests in the error, for convenience.
            const requests = open.map(describeRequest).join(', ');
            throw new Error(`Expected no open requests, found ${open.length}: ${requests}`);
        }
    }
    descriptionFromMatcher(matcher) {
        if (typeof matcher === 'string') {
            return `Match URL: ${matcher}`;
        }
        else if (typeof matcher === 'object') {
            const method = matcher.method || '(any)';
            const url = matcher.url || '(any)';
            return `Match method: ${method}, URL: ${url}`;
        }
        else {
            return `Match by function: ${matcher.name}`;
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientTestingBackend, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientTestingBackend });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientTestingBackend, decorators: [{
            type: Injectable
        }] });
function describeRequest(testRequest) {
    const url = testRequest.request.urlWithParams;
    const method = testRequest.request.method;
    return `${method} ${url}`;
}

function provideHttpClientTesting() {
    return [
        HttpClientTestingBackend,
        { provide: HttpBackend, useExisting: HttpClientTestingBackend },
        { provide: HttpTestingController, useExisting: HttpClientTestingBackend },
        { provide: REQUESTS_CONTRIBUTE_TO_STABILITY, useValue: false },
    ];
}

/**
 * Configures `HttpClientTestingBackend` as the `HttpBackend` used by `HttpClient`.
 *
 * Inject `HttpTestingController` to expect and flush requests in your tests.
 *
 * @publicApi
 *
 * @deprecated Add `provideHttpClientTesting()` to your providers instead.
 */
class HttpClientTestingModule {
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
    static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: HttpClientTestingModule, imports: [HttpClientModule] });
    static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientTestingModule, providers: [provideHttpClientTesting()], imports: [HttpClientModule] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientTestingModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [HttpClientModule],
                    providers: [provideHttpClientTesting()],
                }]
        }] });

export { HttpClientTestingModule, HttpTestingController, TestRequest, provideHttpClientTesting };
//# sourceMappingURL=testing.mjs.map
Lxo{"version":3,"file":"testing.mjs","sources":["../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/testing/src/api.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/testing/src/request.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/testing/src/backend.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/testing/src/provider.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/testing/src/module.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {HttpRequest} from '../../index';\n\nimport {TestRequest} from './request';\n\n/**\n * Defines a matcher for requests based on URL, method, or both.\n *\n * @publicApi\n */\nexport interface RequestMatch {\n  method?: string;\n  url?: string;\n}\n\n/**\n * Controller to be injected into tests, that allows for mocking and flushing\n * of requests.\n *\n * @publicApi\n */\nexport abstract class HttpTestingController {\n  /**\n   * Search for requests that match the given parameter, without any expectations.\n   */\n  abstract match(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n  ): TestRequest[];\n\n  /**\n   * Expect that a single request has been made which matches the given URL, and return its\n   * mock.\n   *\n   * If no such request has been made, or more than one such request has been made, fail with an\n   * error message including the given request description, if any.\n   */\n  abstract expectOne(url: string, description?: string): TestRequest;\n\n  /**\n   * Expect that a single request has been made which matches the given parameters, and return\n   * its mock.\n   *\n   * If no such request has been made, or more than one such request has been made, fail with an\n   * error message including the given request description, if any.\n   */\n  abstract expectOne(params: RequestMatch, description?: string): TestRequest;\n\n  /**\n   * Expect that a single request has been made which matches the given predicate function, and\n   * return its mock.\n   *\n   * If no such request has been made, or more than one such request has been made, fail with an\n   * error message including the given request description, if any.\n   */\n  abstract expectOne(\n    matchFn: (req: HttpRequest<any>) => boolean,\n    description?: string,\n  ): TestRequest;\n\n  /**\n   * Expect that a single request has been made which matches the given condition, and return\n   * its mock.\n   *\n   * If no such request has been made, or more than one such request has been made, fail with an\n   * error message including the given request description, if any.\n   */\n  abstract expectOne(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n    description?: string,\n  ): TestRequest;\n\n  /**\n   * Expect that no requests have been made which match the given URL.\n   *\n   * If a matching request has been made, fail with an error message including the given request\n   * description, if any.\n   */\n  abstract expectNone(url: string, description?: string): void;\n\n  /**\n   * Expect that no requests have been made which match the given parameters.\n   *\n   * If a matching request has been made, fail with an error message including the given request\n   * description, if any.\n   */\n  abstract expectNone(params: RequestMatch, description?: string): void;\n\n  /**\n   * Expect that no requests have been made which match the given predicate function.\n   *\n   * If a matching request has been made, fail with an error message including the given request\n   * description, if any.\n   */\n  abstract expectNone(matchFn: (req: HttpRequest<any>) => boolean, description?: string): void;\n\n  /**\n   * Expect that no requests have been made which match the given condition.\n   *\n   * If a matching request has been made, fail with an error message including the given request\n   * description, if any.\n   */\n  abstract expectNone(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n    description?: string,\n  ): void;\n\n  /**\n   * Verify that no unmatched requests are outstanding.\n   *\n   * If any requests are outstanding, fail with an error message indicating which requests were not\n   * handled.\n   *\n   * If `ignoreCancelled` is not set (the default), `verify()` will also fail if cancelled requests\n   * were not explicitly matched.\n   */\n  abstract verify(opts?: {ignoreCancelled?: boolean}): void;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  HttpErrorResponse,\n  HttpEvent,\n  HttpHeaders,\n  HttpRequest,\n  HttpResponse,\n  HttpStatusCode,\n} from '../../index';\nimport {Observer} from 'rxjs';\n\n/**\n * Type that describes options that can be used to create an error\n * in `TestRequest`.\n */\ntype TestRequestErrorOptions = {\n  headers?: HttpHeaders | {[name: string]: string | string[]};\n  status?: number;\n  statusText?: string;\n};\n\n/**\n * A mock requests that was received and is ready to be answered.\n *\n * This interface allows access to the underlying `HttpRequest`, and allows\n * responding with `HttpEvent`s or `HttpErrorResponse`s.\n *\n * @publicApi\n */\nexport class TestRequest {\n  /**\n   * Whether the request was cancelled after it was sent.\n   */\n  get cancelled(): boolean {\n    return this._cancelled;\n  }\n\n  /**\n   * @internal set by `HttpClientTestingBackend`\n   */\n  _cancelled = false;\n\n  constructor(\n    public request: HttpRequest<any>,\n    private observer: Observer<HttpEvent<any>>,\n  ) {}\n\n  /**\n   * Resolve the request by returning a body plus additional HTTP information (such as response\n   * headers) if provided.\n   * If the request specifies an expected body type, the body is converted into the requested type.\n   * Otherwise, the body is converted to `JSON` by default.\n   *\n   * Both successful and unsuccessful responses can be delivered via `flush()`.\n   */\n  flush(\n    body:\n      | ArrayBuffer\n      | Blob\n      | boolean\n      | string\n      | number\n      | Object\n      | (boolean | string | number | Object | null)[]\n      | null,\n    opts: {\n      headers?: HttpHeaders | {[name: string]: string | string[]};\n      status?: number;\n      statusText?: string;\n    } = {},\n  ): void {\n    if (this.cancelled) {\n      throw new Error(`Cannot flush a cancelled request.`);\n    }\n    const url = this.request.urlWithParams;\n    const headers =\n      opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers);\n    body = _maybeConvertBody(this.request.responseType, body);\n    let statusText: string | undefined = opts.statusText;\n    let status: number = opts.status !== undefined ? opts.status : HttpStatusCode.Ok;\n    if (opts.status === undefined) {\n      if (body === null) {\n        status = HttpStatusCode.NoContent;\n        statusText ||= 'No Content';\n      } else {\n        statusText ||= 'OK';\n      }\n    }\n    if (statusText === undefined) {\n      throw new Error('statusText is required when setting a custom status.');\n    }\n    if (status >= 200 && status < 300) {\n      this.observer.next(new HttpResponse<any>({body, headers, status, statusText, url}));\n      this.observer.complete();\n    } else {\n      this.observer.error(new HttpErrorResponse({error: body, headers, status, statusText, url}));\n    }\n  }\n\n  /**\n   * Resolve the request by returning an `ErrorEvent` (e.g. simulating a network failure).\n   * @deprecated Http requests never emit an `ErrorEvent`. Please specify a `ProgressEvent`.\n   */\n  error(error: ErrorEvent, opts?: TestRequestErrorOptions): void;\n  /**\n   * Resolve the request by returning an `ProgressEvent` (e.g. simulating a network failure).\n   */\n  error(error: ProgressEvent, opts?: TestRequestErrorOptions): void;\n  error(error: ProgressEvent | ErrorEvent, opts: TestRequestErrorOptions = {}): void {\n    if (this.cancelled) {\n      throw new Error(`Cannot return an error for a cancelled request.`);\n    }\n    if (opts.status && opts.status >= 200 && opts.status < 300) {\n      throw new Error(`error() called with a successful status.`);\n    }\n    const headers =\n      opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers);\n    this.observer.error(\n      new HttpErrorResponse({\n        error,\n        headers,\n        status: opts.status || 0,\n        statusText: opts.statusText || '',\n        url: this.request.urlWithParams,\n      }),\n    );\n  }\n\n  /**\n   * Deliver an arbitrary `HttpEvent` (such as a progress event) on the response stream for this\n   * request.\n   */\n  event(event: HttpEvent<any>): void {\n    if (this.cancelled) {\n      throw new Error(`Cannot send events to a cancelled request.`);\n    }\n    this.observer.next(event);\n  }\n}\n\n/**\n * Helper function to convert a response body to an ArrayBuffer.\n */\nfunction _toArrayBufferBody(\n  body: ArrayBuffer | Blob | string | number | Object | (string | number | Object | null)[],\n): ArrayBuffer {\n  if (typeof ArrayBuffer === 'undefined') {\n    throw new Error('ArrayBuffer responses are not supported on this platform.');\n  }\n  if (body instanceof ArrayBuffer) {\n    return body;\n  }\n  throw new Error('Automatic conversion to ArrayBuffer is not supported for response type.');\n}\n\n/**\n * Helper function to convert a response body to a Blob.\n */\nfunction _toBlob(\n  body: ArrayBuffer | Blob | string | number | Object | (string | number | Object | null)[],\n): Blob {\n  if (typeof Blob === 'undefined') {\n    throw new Error('Blob responses are not supported on this platform.');\n  }\n  if (body instanceof Blob) {\n    return body;\n  }\n  if (ArrayBuffer && body instanceof ArrayBuffer) {\n    return new Blob([body]);\n  }\n  throw new Error('Automatic conversion to Blob is not supported for response type.');\n}\n\n/**\n * Helper function to convert a response body to JSON data.\n */\nfunction _toJsonBody(\n  body:\n    | ArrayBuffer\n    | Blob\n    | boolean\n    | string\n    | number\n    | Object\n    | (boolean | string | number | Object | null)[],\n  format: string = 'JSON',\n): Object | string | number | (Object | string | number)[] {\n  if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer) {\n    throw new Error(`Automatic conversion to ${format} is not supported for ArrayBuffers.`);\n  }\n  if (typeof Blob !== 'undefined' && body instanceof Blob) {\n    throw new Error(`Automatic conversion to ${format} is not supported for Blobs.`);\n  }\n  if (\n    typeof body === 'string' ||\n    typeof body === 'number' ||\n    typeof body === 'object' ||\n    typeof body === 'boolean' ||\n    Array.isArray(body)\n  ) {\n    return body;\n  }\n  throw new Error(`Automatic conversion to ${format} is not supported for response type.`);\n}\n\n/**\n * Helper function to convert a response body to a string.\n */\nfunction _toTextBody(\n  body: ArrayBuffer | Blob | string | number | Object | (string | number | Object | null)[],\n): string {\n  if (typeof body === 'string') {\n    return body;\n  }\n  if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer) {\n    throw new Error('Automatic conversion to text is not supported for ArrayBuffers.');\n  }\n  if (typeof Blob !== 'undefined' && body instanceof Blob) {\n    throw new Error('Automatic conversion to text is not supported for Blobs.');\n  }\n  return JSON.stringify(_toJsonBody(body, 'text'));\n}\n\n/**\n * Convert a response body to the requested type.\n */\nfunction _maybeConvertBody(\n  responseType: string,\n  body: ArrayBuffer | Blob | string | number | Object | (string | number | Object | null)[] | null,\n): ArrayBuffer | Blob | string | number | Object | (string | number | Object | null)[] | null {\n  if (body === null) {\n    return null;\n  }\n  switch (responseType) {\n    case 'arraybuffer':\n      return _toArrayBufferBody(body);\n    case 'blob':\n      return _toBlob(body);\n    case 'json':\n      return _toJsonBody(body);\n    case 'text':\n      return _toTextBody(body);\n    default:\n      throw new Error(`Unsupported responseType: ${responseType}`);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {HttpBackend, HttpEvent, HttpEventType, HttpRequest} from '../../index';\nimport {Injectable} from '@angular/core';\nimport {Observable, Observer} from 'rxjs';\n\nimport {HttpTestingController, RequestMatch} from './api';\nimport {TestRequest} from './request';\n\n/**\n * A testing backend for `HttpClient` which both acts as an `HttpBackend`\n * and as the `HttpTestingController`.\n *\n * `HttpClientTestingBackend` works by keeping a list of all open requests.\n * As requests come in, they're added to the list. Users can assert that specific\n * requests were made and then flush them. In the end, a verify() method asserts\n * that no unexpected requests were made.\n *\n *\n */\n@Injectable()\nexport class HttpClientTestingBackend implements HttpBackend, HttpTestingController {\n  /**\n   * List of pending requests which have not yet been expected.\n   */\n  private open: TestRequest[] = [];\n\n  /**\n   * Used when checking if we need to throw the NOT_USING_FETCH_BACKEND_IN_SSR error\n   */\n  private isTestingBackend = true;\n\n  /**\n   * Handle an incoming request by queueing it in the list of open requests.\n   */\n  handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n    return new Observable((observer: Observer<any>) => {\n      const testReq = new TestRequest(req, observer);\n      this.open.push(testReq);\n      observer.next({type: HttpEventType.Sent} as HttpEvent<any>);\n      return () => {\n        testReq._cancelled = true;\n      };\n    });\n  }\n\n  /**\n   * Helper function to search for requests in the list of open requests.\n   */\n  private _match(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n  ): TestRequest[] {\n    if (typeof match === 'string') {\n      return this.open.filter((testReq) => testReq.request.urlWithParams === match);\n    } else if (typeof match === 'function') {\n      return this.open.filter((testReq) => match(testReq.request));\n    } else {\n      return this.open.filter(\n        (testReq) =>\n          (!match.method || testReq.request.method === match.method.toUpperCase()) &&\n          (!match.url || testReq.request.urlWithParams === match.url),\n      );\n    }\n  }\n\n  /**\n   * Search for requests in the list of open requests, and return all that match\n   * without asserting anything about the number of matches.\n   */\n  match(match: string | RequestMatch | ((req: HttpRequest<any>) => boolean)): TestRequest[] {\n    const results = this._match(match);\n    results.forEach((result) => {\n      const index = this.open.indexOf(result);\n      if (index !== -1) {\n        this.open.splice(index, 1);\n      }\n    });\n    return results;\n  }\n\n  /**\n   * Expect that a single outstanding request matches the given matcher, and return\n   * it.\n   *\n   * Requests returned through this API will no longer be in the list of open requests,\n   * and thus will not match twice.\n   */\n  expectOne(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n    description?: string,\n  ): TestRequest {\n    description ||= this.descriptionFromMatcher(match);\n    const matches = this.match(match);\n    if (matches.length > 1) {\n      throw new Error(\n        `Expected one matching request for criteria \"${description}\", found ${matches.length} requests.`,\n      );\n    }\n    if (matches.length === 0) {\n      let message = `Expected one matching request for criteria \"${description}\", found none.`;\n      if (this.open.length > 0) {\n        // Show the methods and URLs of open requests in the error, for convenience.\n        const requests = this.open.map(describeRequest).join(', ');\n        message += ` Requests received are: ${requests}.`;\n      }\n      throw new Error(message);\n    }\n    return matches[0];\n  }\n\n  /**\n   * Expect that no outstanding requests match the given matcher, and throw an error\n   * if any do.\n   */\n  expectNone(\n    match: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n    description?: string,\n  ): void {\n    description ||= this.descriptionFromMatcher(match);\n    const matches = this.match(match);\n    if (matches.length > 0) {\n      throw new Error(\n        `Expected zero matching requests for criteria \"${description}\", found ${matches.length}.`,\n      );\n    }\n  }\n\n  /**\n   * Validate that there are no outstanding requests.\n   */\n  verify(opts: {ignoreCancelled?: boolean} = {}): void {\n    let open = this.open;\n    // It's possible that some requests may be cancelled, and this is expected.\n    // The user can ask to ignore open requests which have been cancelled.\n    if (opts.ignoreCancelled) {\n      open = open.filter((testReq) => !testReq.cancelled);\n    }\n    if (open.length > 0) {\n      // Show the methods and URLs of open requests in the error, for convenience.\n      const requests = open.map(describeRequest).join(', ');\n      throw new Error(`Expected no open requests, found ${open.length}: ${requests}`);\n    }\n  }\n\n  private descriptionFromMatcher(\n    matcher: string | RequestMatch | ((req: HttpRequest<any>) => boolean),\n  ): string {\n    if (typeof matcher === 'string') {\n      return `Match URL: ${matcher}`;\n    } else if (typeof matcher === 'object') {\n      const method = matcher.method || '(any)';\n      const url = matcher.url || '(any)';\n      return `Match method: ${method}, URL: ${url}`;\n    } else {\n      return `Match by function: ${matcher.name}`;\n    }\n  }\n}\n\nfunction describeRequest(testRequest: TestRequest): string {\n  const url = testRequest.request.urlWithParams;\n  const method = testRequest.request.method;\n  return `${method} ${url}`;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {HttpBackend, ɵREQUESTS_CONTRIBUTE_TO_STABILITY} from '../../index';\nimport {Provider} from '@angular/core';\n\nimport {HttpTestingController} from './api';\nimport {HttpClientTestingBackend} from './backend';\n\nexport function provideHttpClientTesting(): Provider[] {\n  return [\n    HttpClientTestingBackend,\n    {provide: HttpBackend, useExisting: HttpClientTestingBackend},\n    {provide: HttpTestingController, useExisting: HttpClientTestingBackend},\n    {provide: ɵREQUESTS_CONTRIBUTE_TO_STABILITY, useValue: false},\n  ];\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {HttpClientModule} from '../../index';\nimport {NgModule} from '@angular/core';\n\nimport {provideHttpClientTesting} from './provider';\n\n/**\n * Configures `HttpClientTestingBackend` as the `HttpBackend` used by `HttpClient`.\n *\n * Inject `HttpTestingController` to expect and flush requests in your tests.\n *\n * @publicApi\n *\n * @deprecated Add `provideHttpClientTesting()` to your providers instead.\n */\n@NgModule({\n  imports: [HttpClientModule],\n  providers: [provideHttpClientTesting()],\n})\nexport class HttpClientTestingModule {}\n"],"names":["ɵREQUESTS_CONTRIBUTE_TO_STABILITY"],"mappings":"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"}Qx _ߠ/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { InjectionToken, inject, Injectable, Optional, Inject, ɵɵinject as __inject } from '@angular/core';
import { Subject } from 'rxjs';
import { DOCUMENT } from './dom_tokens-rA0ACyx7.mjs';

let _DOM = null;
function getDOM() {
    return _DOM;
}
function setRootDomAdapter(adapter) {
    _DOM ??= adapter;
}
/**
 * Provides DOM operations in an environment-agnostic way.
 *
 * @security Tread carefully! Interacting with the DOM directly is dangerous and
 * can introduce XSS risks.
 */
class DomAdapter {
}

/**
 * This class should not be used directly by an application developer. Instead, use
 * {@link Location}.
 *
 * `PlatformLocation` encapsulates all calls to DOM APIs, which allows the Router to be
 * platform-agnostic.
 * This means that we can have different implementation of `PlatformLocation` for the different
 * platforms that Angular supports. For example, `@angular/platform-browser` provides an
 * implementation specific to the browser environment, while `@angular/platform-server` provides
 * one suitable for use with server-side rendering.
 *
 * The `PlatformLocation` class is used directly by all implementations of {@link LocationStrategy}
 * when they need to interact with the DOM APIs like pushState, popState, etc.
 *
 * {@link LocationStrategy} in turn is used by the {@link Location} service which is used directly
 * by the {@link /api/router/Router Router} in order to navigate between routes. Since all interactions between
 * {@link /api/router/Router Router} /
 * {@link Location} / {@link LocationStrategy} and DOM APIs flow through the `PlatformLocation`
 * class, they are all platform-agnostic.
 *
 * @publicApi
 */
class PlatformLocation {
    historyGo(relativePosition) {
        throw new Error(ngDevMode ? 'Not implemented' : '');
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PlatformLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PlatformLocation, providedIn: 'platform', useFactory: () => inject(BrowserPlatformLocation) });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PlatformLocation, decorators: [{
            type: Injectable,
            args: [{ providedIn: 'platform', useFactory: () => inject(BrowserPlatformLocation) }]
        }] });
/**
 * @description
 * Indicates when a location is initialized.
 *
 * @publicApi
 */
const LOCATION_INITIALIZED = new InjectionToken(ngDevMode ? 'Location Initialized' : '');
/**
 * `PlatformLocation` encapsulates all of the direct calls to platform APIs.
 * This class should not be used directly by an application developer. Instead, use
 * {@link Location}.
 *
 * @publicApi
 */
class BrowserPlatformLocation extends PlatformLocation {
    _location;
    _history;
    _doc = inject(DOCUMENT);
    constructor() {
        super();
        this._location = window.location;
        this._history = window.history;
    }
    getBaseHrefFromDOM() {
        return getDOM().getBaseHref(this._doc);
    }
    onPopState(fn) {
        const window = getDOM().getGlobalEventTarget(this._doc, 'window');
        window.addEventListener('popstate', fn, false);
        return () => window.removeEventListener('popstate', fn);
    }
    onHashChange(fn) {
        const window = getDOM().getGlobalEventTarget(this._doc, 'window');
        window.addEventListener('hashchange', fn, false);
        return () => window.removeEventListener('hashchange', fn);
    }
    get href() {
        return this._location.href;
    }
    get protocol() {
        return this._location.protocol;
    }
    get hostname() {
        return this._location.hostname;
    }
    get port() {
        return this._location.port;
    }
    get pathname() {
        return this._location.pathname;
    }
    get search() {
        return this._location.search;
    }
    get hash() {
        return this._location.hash;
    }
    set pathname(newPath) {
        this._location.pathname = newPath;
    }
    pushState(state, title, url) {
        this._history.pushState(state, title, url);
    }
    replaceState(state, title, url) {
        this._history.replaceState(state, title, url);
    }
    forward() {
        this._history.forward();
    }
    back() {
        this._history.back();
    }
    historyGo(relativePosition = 0) {
        this._history.go(relativePosition);
    }
    getState() {
        return this._history.state;
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BrowserPlatformLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BrowserPlatformLocation, providedIn: 'platform', useFactory: () => new BrowserPlatformLocation() });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BrowserPlatformLocation, decorators: [{
            type: Injectable,
            args: [{
                    providedIn: 'platform',
                    useFactory: () => new BrowserPlatformLocation(),
                }]
        }], ctorParameters: () => [] });

/**
 * Joins two parts of a URL with a slash if needed.
 *
 * @param start  URL string
 * @param end    URL string
 *
 *
 * @returns The joined URL string.
 */
function joinWithSlash(start, end) {
    // If `start` is an empty string, return `end` as the result.
    if (!start)
        return end;
    // If `end` is an empty string, return `start` as the result.
    if (!end)
        return start;
    // If `start` ends with a slash, remove the leading slash from `end`.
    if (start.endsWith('/')) {
        return end.startsWith('/') ? start + end.slice(1) : start + end;
    }
    // If `start` doesn't end with a slash, add one if `end` doesn't start with a slash.
    return end.startsWith('/') ? start + end : `${start}/${end}`;
}
/**
 * Removes a trailing slash from a URL string if needed.
 * Looks for the first occurrence of either `#`, `?`, or the end of the
 * line as `/` characters and removes the trailing slash if one exists.
 *
 * @param url URL string.
 *
 * @returns The URL string, modified if needed.
 */
function stripTrailingSlash(url) {
    // Find the index of the first occurrence of `#`, `?`, or the end of the string.
    // This marks the start of the query string, fragment, or the end of the URL path.
    const pathEndIdx = url.search(/#|\?|$/);
    // Check if the character before `pathEndIdx` is a trailing slash.
    // If it is, remove the trailing slash and return the modified URL.
    // Otherwise, return the URL as is.
    return url[pathEndIdx - 1] === '/' ? url.slice(0, pathEndIdx - 1) + url.slice(pathEndIdx) : url;
}
/**
 * Normalizes URL parameters by prepending with `?` if needed.
 *
 * @param  params String of URL parameters.
 *
 * @returns The normalized URL parameters string.
 */
function normalizeQueryParams(params) {
    return params && params[0] !== '?' ? `?${params}` : params;
}

/**
 * Enables the `Location` service to read route state from the browser's URL.
 * Angular provides two strategies:
 * `HashLocationStrategy` and `PathLocationStrategy`.
 *
 * Applications should use the `Router` or `Location` services to
 * interact with application route state.
 *
 * For instance, `HashLocationStrategy` produces URLs like
 * <code class="no-auto-link">http://example.com/#/foo</code>,
 * and `PathLocationStrategy` produces
 * <code class="no-auto-link">http://example.com/foo</code> as an equivalent URL.
 *
 * See these two classes for more.
 *
 * @publicApi
 */
class LocationStrategy {
    historyGo(relativePosition) {
        throw new Error(ngDevMode ? 'Not implemented' : '');
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LocationStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LocationStrategy, providedIn: 'root', useFactory: () => inject(PathLocationStrategy) });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LocationStrategy, decorators: [{
            type: Injectable,
            args: [{ providedIn: 'root', useFactory: () => inject(PathLocationStrategy) }]
        }] });
/**
 * A predefined DI token for the base href
 * to be used with the `PathLocationStrategy`.
 * The base href is the URL prefix that should be preserved when generating
 * and recognizing URLs.
 *
 * @usageNotes
 *
 * The following example shows how to use this token to configure the root app injector
 * with a base href value, so that the DI framework can supply the dependency anywhere in the app.
 *
 * ```ts
 * import {NgModule} from '@angular/core';
 * import {APP_BASE_HREF} from '@angular/common';
 *
 * @NgModule({
 *   providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]
 * })
 * class AppModule {}
 * ```
 *
 * @publicApi
 */
const APP_BASE_HREF = new InjectionToken(ngDevMode ? 'appBaseHref' : '');
/**
 * @description
 * A {@link LocationStrategy} used to configure the {@link Location} service to
 * represent its state in the
 * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the
 * browser's URL.
 *
 * If you're using `PathLocationStrategy`, you may provide a {@link APP_BASE_HREF}
 * or add a `<base href>` element to the document to override the default.
 *
 * For instance, if you provide an `APP_BASE_HREF` of `'/my/app/'` and call
 * `location.go('/foo')`, the browser's URL will become
 * `example.com/my/app/foo`. To ensure all relative URIs resolve correctly,
 * the `<base href>` and/or `APP_BASE_HREF` should end with a `/`.
 *
 * Similarly, if you add `<base href='/my/app/'/>` to the document and call
 * `location.go('/foo')`, the browser's URL will become
 * `example.com/my/app/foo`.
 *
 * Note that when using `PathLocationStrategy`, neither the query nor
 * the fragment in the `<base href>` will be preserved, as outlined
 * by the [RFC](https://tools.ietf.org/html/rfc3986#section-5.2.2).
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example common/location/ts/path_location_component.ts region='LocationComponent'}
 *
 * @publicApi
 */
class PathLocationStrategy extends LocationStrategy {
    _platformLocation;
    _baseHref;
    _removeListenerFns = [];
    constructor(_platformLocation, href) {
        super();
        this._platformLocation = _platformLocation;
        this._baseHref =
            href ??
                this._platformLocation.getBaseHrefFromDOM() ??
                inject(DOCUMENT).location?.origin ??
                '';
    }
    /** @docs-private */
    ngOnDestroy() {
        while (this._removeListenerFns.length) {
            this._removeListenerFns.pop()();
        }
    }
    onPopState(fn) {
        this._removeListenerFns.push(this._platformLocation.onPopState(fn), this._platformLocation.onHashChange(fn));
    }
    getBaseHref() {
        return this._baseHref;
    }
    prepareExternalUrl(internal) {
        return joinWithSlash(this._baseHref, internal);
    }
    path(includeHash = false) {
        const pathname = this._platformLocation.pathname + normalizeQueryParams(this._platformLocation.search);
        const hash = this._platformLocation.hash;
        return hash && includeHash ? `${pathname}${hash}` : pathname;
    }
    pushState(state, title, url, queryParams) {
        const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));
        this._platformLocation.pushState(state, title, externalUrl);
    }
    replaceState(state, title, url, queryParams) {
        const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));
        this._platformLocation.replaceState(state, title, externalUrl);
    }
    forward() {
        this._platformLocation.forward();
    }
    back() {
        this._platformLocation.back();
    }
    getState() {
        return this._platformLocation.getState();
    }
    historyGo(relativePosition = 0) {
        this._platformLocation.historyGo?.(relativePosition);
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PathLocationStrategy, deps: [{ token: PlatformLocation }, { token: APP_BASE_HREF, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PathLocationStrategy, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PathLocationStrategy, decorators: [{
            type: Injectable,
            args: [{ providedIn: 'root' }]
        }], ctorParameters: () => [{ type: PlatformLocation }, { type: undefined, decorators: [{
                    type: Optional
                }, {
                    type: Inject,
                    args: [APP_BASE_HREF]
                }] }] });

/**
 * @description
 *
 * A service that applications can use to interact with a browser's URL.
 *
 * Depending on the `LocationStrategy` used, `Location` persists
 * to the URL's path or the URL's hash segment.
 *
 * @usageNotes
 *
 * It's better to use the `Router.navigate()` service to trigger route changes. Use
 * `Location` only if you need to interact with or create normalized URLs outside of
 * routing.
 *
 * `Location` is responsible for normalizing the URL against the application's base href.
 * A normalized URL is absolute from the URL host, includes the application's base href, and has no
 * trailing slash:
 * - `/my/app/user/123` is normalized
 * - `my/app/user/123` **is not** normalized
 * - `/my/app/user/123/` **is not** normalized
 *
 * ### Example
 *
 * {@example common/location/ts/path_location_component.ts region='LocationComponent'}
 *
 * @publicApi
 */
class Location {
    /** @internal */
    _subject = new Subject();
    /** @internal */
    _basePath;
    /** @internal */
    _locationStrategy;
    /** @internal */
    _urlChangeListeners = [];
    /** @internal */
    _urlChangeSubscription = null;
    constructor(locationStrategy) {
        this._locationStrategy = locationStrategy;
        const baseHref = this._locationStrategy.getBaseHref();
        // Note: This class's interaction with base HREF does not fully follow the rules
        // outlined in the spec https://www.freesoft.org/CIE/RFC/1808/18.htm.
        // Instead of trying to fix individual bugs with more and more code, we should
        // investigate using the URL constructor and providing the base as a second
        // argument.
        // https://developer.mozilla.org/en-US/docs/Web/API/URL/URL#parameters
        this._basePath = _stripOrigin(stripTrailingSlash(_stripIndexHtml(baseHref)));
        this._locationStrategy.onPopState((ev) => {
            this._subject.next({
                'url': this.path(true),
                'pop': true,
                'state': ev.state,
                'type': ev.type,
            });
        });
    }
    /** @docs-private */
    ngOnDestroy() {
        this._urlChangeSubscription?.unsubscribe();
        this._urlChangeListeners = [];
    }
    /**
     * Normalizes the URL path for this location.
     *
     * @param includeHash True to include an anchor fragment in the path.
     *
     * @returns The normalized URL path.
     */
    // TODO: vsavkin. Remove the boolean flag and always include hash once the deprecated router is
    // removed.
    path(includeHash = false) {
        return this.normalize(this._locationStrategy.path(includeHash));
    }
    /**
     * Reports the current state of the location history.
     * @returns The current value of the `history.state` object.
     */
    getState() {
        return this._locationStrategy.getState();
    }
    /**
     * Normalizes the given path and compares to the current normalized path.
     *
     * @param path The given URL path.
     * @param query Query parameters.
     *
     * @returns True if the given URL path is equal to the current normalized path, false
     * otherwise.
     */
    isCurrentPathEqualTo(path, query = '') {
        return this.path() == this.normalize(path + normalizeQueryParams(query));
    }
    /**
     * Normalizes a URL path by stripping any trailing slashes.
     *
     * @param url String representing a URL.
     *
     * @returns The normalized URL string.
     */
    normalize(url) {
        return Location.stripTrailingSlash(_stripBasePath(this._basePath, _stripIndexHtml(url)));
    }
    /**
     * Normalizes an external URL path.
     * If the given URL doesn't begin with a leading slash (`'/'`), adds one
     * before normalizing. Adds a hash if `HashLocationStrategy` is
     * in use, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.
     *
     * @param url String representing a URL.
     *
     * @returns  A normalized platform-specific URL.
     */
    prepareExternalUrl(url) {
        if (url && url[0] !== '/') {
            url = '/' + url;
        }
        return this._locationStrategy.prepareExternalUrl(url);
    }
    // TODO: rename this method to pushState
    /**
     * Changes the browser's URL to a normalized version of a given URL, and pushes a
     * new item onto the platform's history.
     *
     * @param path  URL path to normalize.
     * @param query Query parameters.
     * @param state Location history state.
     *
     */
    go(path, query = '', state = null) {
        this._locationStrategy.pushState(state, '', path, query);
        this._notifyUrlChangeListeners(this.prepareExternalUrl(path + normalizeQueryParams(query)), state);
    }
    /**
     * Changes the browser's URL to a normalized version of the given URL, and replaces
     * the top item on the platform's history stack.
     *
     * @param path  URL path to normalize.
     * @param query Query parameters.
     * @param state Location history state.
     */
    replaceState(path, query = '', state = null) {
        this._locationStrategy.replaceState(state, '', path, query);
        this._notifyUrlChangeListeners(this.prepareExternalUrl(path + normalizeQueryParams(query)), state);
    }
    /**
     * Navigates forward in the platform's history.
     */
    forward() {
        this._locationStrategy.forward();
    }
    /**
     * Navigates back in the platform's history.
     */
    back() {
        this._locationStrategy.back();
    }
    /**
     * Navigate to a specific page from session history, identified by its relative position to the
     * current page.
     *
     * @param relativePosition  Position of the target page in the history relative to the current
     *     page.
     * A negative value moves backwards, a positive value moves forwards, e.g. `location.historyGo(2)`
     * moves forward two pages and `location.historyGo(-2)` moves back two pages. When we try to go
     * beyond what's stored in the history session, we stay in the current page. Same behaviour occurs
     * when `relativePosition` equals 0.
     * @see https://developer.mozilla.org/en-US/docs/Web/API/History_API#Moving_to_a_specific_point_in_history
     */
    historyGo(relativePosition = 0) {
        this._locationStrategy.historyGo?.(relativePosition);
    }
    /**
     * Registers a URL change listener. Use to catch updates performed by the Angular
     * framework that are not detectible through "popstate" or "hashchange" events.
     *
     * @param fn The change handler function, which take a URL and a location history state.
     * @returns A function that, when executed, unregisters a URL change listener.
     */
    onUrlChange(fn) {
        this._urlChangeListeners.push(fn);
        this._urlChangeSubscription ??= this.subscribe((v) => {
            this._notifyUrlChangeListeners(v.url, v.state);
        });
        return () => {
            const fnIndex = this._urlChangeListeners.indexOf(fn);
            this._urlChangeListeners.splice(fnIndex, 1);
            if (this._urlChangeListeners.length === 0) {
                this._urlChangeSubscription?.unsubscribe();
                this._urlChangeSubscription = null;
            }
        };
    }
    /** @internal */
    _notifyUrlChangeListeners(url = '', state) {
        this._urlChangeListeners.forEach((fn) => fn(url, state));
    }
    /**
     * Subscribes to the platform's `popState` events.
     *
     * Note: `Location.go()` does not trigger the `popState` event in the browser. Use
     * `Location.onUrlChange()` to subscribe to URL changes instead.
     *
     * @param value Event that is triggered when the state history changes.
     * @param exception The exception to throw.
     *
     * @see [onpopstate](https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate)
     *
     * @returns Subscribed events.
     */
    subscribe(onNext, onThrow, onReturn) {
        return this._subject.subscribe({
            next: onNext,
            error: onThrow ?? undefined,
            complete: onReturn ?? undefined,
        });
    }
    /**
     * Normalizes URL parameters by prepending with `?` if needed.
     *
     * @param  params String of URL parameters.
     *
     * @returns The normalized URL parameters string.
     */
    static normalizeQueryParams = normalizeQueryParams;
    /**
     * Joins two parts of a URL with a slash if needed.
     *
     * @param start  URL string
     * @param end    URL string
     *
     *
     * @returns The joined URL string.
     */
    static joinWithSlash = joinWithSlash;
    /**
     * Removes a trailing slash from a URL string if needed.
     * Looks for the first occurrence of either `#`, `?`, or the end of the
     * line as `/` characters and removes the trailing slash if one exists.
     *
     * @param url URL string.
     *
     * @returns The URL string, modified if needed.
     */
    static stripTrailingSlash = stripTrailingSlash;
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Location, deps: [{ token: LocationStrategy }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Location, providedIn: 'root', useFactory: createLocation });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Location, decorators: [{
            type: Injectable,
            args: [{
                    providedIn: 'root',
                    // See #23917
                    useFactory: createLocation,
                }]
        }], ctorParameters: () => [{ type: LocationStrategy }] });
function createLocation() {
    return new Location(__inject(LocationStrategy));
}
function _stripBasePath(basePath, url) {
    if (!basePath || !url.startsWith(basePath)) {
        return url;
    }
    const strippedUrl = url.substring(basePath.length);
    if (strippedUrl === '' || ['/', ';', '?', '#'].includes(strippedUrl[0])) {
        return strippedUrl;
    }
    return url;
}
function _stripIndexHtml(url) {
    return url.replace(/\/index.html$/, '');
}
function _stripOrigin(baseHref) {
    // DO NOT REFACTOR! Previously, this check looked like this:
    // `/^(https?:)?\/\//.test(baseHref)`, but that resulted in
    // syntactically incorrect code after Closure Compiler minification.
    // This was likely caused by a bug in Closure Compiler, but
    // for now, the check is rewritten to use `new RegExp` instead.
    const isAbsoluteUrl = new RegExp('^(https?:)?//').test(baseHref);
    if (isAbsoluteUrl) {
        const [, pathname] = baseHref.split(/\/\/[^\/]+/);
        return pathname;
    }
    return baseHref;
}

export { APP_BASE_HREF, BrowserPlatformLocation, DomAdapter, LOCATION_INITIALIZED, Location, LocationStrategy, PathLocationStrategy, PlatformLocation, getDOM, joinWithSlash, normalizeQueryParams, setRootDomAdapter };
//# sourceMappingURL=location-Dq4mJT-A.mjs.map
8|Gxє.k{"version":3,"file":"location-Dq4mJT-A.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/dom_adapter.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/location/platform_location.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/location/util.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/location/location_strategy.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/location/location.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nlet _DOM: DomAdapter = null!;\n\nexport function getDOM(): DomAdapter {\n  return _DOM;\n}\n\nexport function setRootDomAdapter(adapter: DomAdapter) {\n  _DOM ??= adapter;\n}\n\n/**\n * Provides DOM operations in an environment-agnostic way.\n *\n * @security Tread carefully! Interacting with the DOM directly is dangerous and\n * can introduce XSS risks.\n */\nexport abstract class DomAdapter {\n  // Needs Domino-friendly test utility\n  abstract dispatchEvent(el: any, evt: any): any;\n  abstract readonly supportsDOMEvents: boolean;\n\n  // Used by Meta\n  abstract remove(el: any): void;\n  abstract createElement(tagName: any, doc?: any): HTMLElement;\n  abstract createHtmlDocument(): Document;\n  abstract getDefaultDocument(): Document;\n\n  // Used by By.css\n  abstract isElementNode(node: any): boolean;\n\n  // Used by Testability\n  abstract isShadowRoot(node: any): boolean;\n\n  // Used by KeyEventsPlugin\n  abstract onAndCancel(el: any, evt: any, listener: any, options?: any): Function;\n\n  // Used by PlatformLocation and ServerEventManagerPlugin\n  abstract getGlobalEventTarget(doc: Document, target: string): any;\n\n  // Used by PlatformLocation\n  abstract getBaseHref(doc: Document): string | null;\n  abstract resetBaseElement(): void;\n\n  // TODO: remove dependency in DefaultValueAccessor\n  abstract getUserAgent(): string;\n\n  // Used in the legacy @angular/http package which has some usage in g3.\n  abstract getCookie(name: string): string | null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, Injectable, InjectionToken} from '@angular/core';\n\nimport {getDOM} from '../dom_adapter';\nimport {DOCUMENT} from '../dom_tokens';\n\n/**\n * This class should not be used directly by an application developer. Instead, use\n * {@link Location}.\n *\n * `PlatformLocation` encapsulates all calls to DOM APIs, which allows the Router to be\n * platform-agnostic.\n * This means that we can have different implementation of `PlatformLocation` for the different\n * platforms that Angular supports. For example, `@angular/platform-browser` provides an\n * implementation specific to the browser environment, while `@angular/platform-server` provides\n * one suitable for use with server-side rendering.\n *\n * The `PlatformLocation` class is used directly by all implementations of {@link LocationStrategy}\n * when they need to interact with the DOM APIs like pushState, popState, etc.\n *\n * {@link LocationStrategy} in turn is used by the {@link Location} service which is used directly\n * by the {@link /api/router/Router Router} in order to navigate between routes. Since all interactions between\n * {@link /api/router/Router Router} /\n * {@link Location} / {@link LocationStrategy} and DOM APIs flow through the `PlatformLocation`\n * class, they are all platform-agnostic.\n *\n * @publicApi\n */\n@Injectable({providedIn: 'platform', useFactory: () => inject(BrowserPlatformLocation)})\nexport abstract class PlatformLocation {\n  abstract getBaseHrefFromDOM(): string;\n  abstract getState(): unknown;\n  /**\n   * Returns a function that, when executed, removes the `popstate` event handler.\n   */\n  abstract onPopState(fn: LocationChangeListener): VoidFunction;\n  /**\n   * Returns a function that, when executed, removes the `hashchange` event handler.\n   */\n  abstract onHashChange(fn: LocationChangeListener): VoidFunction;\n\n  abstract get href(): string;\n  abstract get protocol(): string;\n  abstract get hostname(): string;\n  abstract get port(): string;\n  abstract get pathname(): string;\n  abstract get search(): string;\n  abstract get hash(): string;\n\n  abstract replaceState(state: any, title: string, url: string): void;\n\n  abstract pushState(state: any, title: string, url: string): void;\n\n  abstract forward(): void;\n\n  abstract back(): void;\n\n  historyGo?(relativePosition: number): void {\n    throw new Error(ngDevMode ? 'Not implemented' : '');\n  }\n}\n\n/**\n * @description\n * Indicates when a location is initialized.\n *\n * @publicApi\n */\nexport const LOCATION_INITIALIZED = new InjectionToken<Promise<any>>(\n  ngDevMode ? 'Location Initialized' : '',\n);\n\n/**\n * @description\n * A serializable version of the event from `onPopState` or `onHashChange`\n *\n * @publicApi\n */\nexport interface LocationChangeEvent {\n  type: string;\n  state: any;\n}\n\n/**\n * @publicApi\n */\nexport interface LocationChangeListener {\n  (event: LocationChangeEvent): any;\n}\n\n/**\n * `PlatformLocation` encapsulates all of the direct calls to platform APIs.\n * This class should not be used directly by an application developer. Instead, use\n * {@link Location}.\n *\n * @publicApi\n */\n@Injectable({\n  providedIn: 'platform',\n  useFactory: () => new BrowserPlatformLocation(),\n})\nexport class BrowserPlatformLocation extends PlatformLocation {\n  private _location: Location;\n  private _history: History;\n  private _doc = inject(DOCUMENT);\n\n  constructor() {\n    super();\n    this._location = window.location;\n    this._history = window.history;\n  }\n\n  override getBaseHrefFromDOM(): string {\n    return getDOM().getBaseHref(this._doc)!;\n  }\n\n  override onPopState(fn: LocationChangeListener): VoidFunction {\n    const window = getDOM().getGlobalEventTarget(this._doc, 'window');\n    window.addEventListener('popstate', fn, false);\n    return () => window.removeEventListener('popstate', fn);\n  }\n\n  override onHashChange(fn: LocationChangeListener): VoidFunction {\n    const window = getDOM().getGlobalEventTarget(this._doc, 'window');\n    window.addEventListener('hashchange', fn, false);\n    return () => window.removeEventListener('hashchange', fn);\n  }\n\n  override get href(): string {\n    return this._location.href;\n  }\n  override get protocol(): string {\n    return this._location.protocol;\n  }\n  override get hostname(): string {\n    return this._location.hostname;\n  }\n  override get port(): string {\n    return this._location.port;\n  }\n  override get pathname(): string {\n    return this._location.pathname;\n  }\n  override get search(): string {\n    return this._location.search;\n  }\n  override get hash(): string {\n    return this._location.hash;\n  }\n  override set pathname(newPath: string) {\n    this._location.pathname = newPath;\n  }\n\n  override pushState(state: any, title: string, url: string): void {\n    this._history.pushState(state, title, url);\n  }\n\n  override replaceState(state: any, title: string, url: string): void {\n    this._history.replaceState(state, title, url);\n  }\n\n  override forward(): void {\n    this._history.forward();\n  }\n\n  override back(): void {\n    this._history.back();\n  }\n\n  override historyGo(relativePosition: number = 0): void {\n    this._history.go(relativePosition);\n  }\n\n  override getState(): unknown {\n    return this._history.state;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Joins two parts of a URL with a slash if needed.\n *\n * @param start  URL string\n * @param end    URL string\n *\n *\n * @returns The joined URL string.\n */\nexport function joinWithSlash(start: string, end: string) {\n  // If `start` is an empty string, return `end` as the result.\n  if (!start) return end;\n  // If `end` is an empty string, return `start` as the result.\n  if (!end) return start;\n  // If `start` ends with a slash, remove the leading slash from `end`.\n  if (start.endsWith('/')) {\n    return end.startsWith('/') ? start + end.slice(1) : start + end;\n  }\n  // If `start` doesn't end with a slash, add one if `end` doesn't start with a slash.\n  return end.startsWith('/') ? start + end : `${start}/${end}`;\n}\n\n/**\n * Removes a trailing slash from a URL string if needed.\n * Looks for the first occurrence of either `#`, `?`, or the end of the\n * line as `/` characters and removes the trailing slash if one exists.\n *\n * @param url URL string.\n *\n * @returns The URL string, modified if needed.\n */\nexport function stripTrailingSlash(url: string): string {\n  // Find the index of the first occurrence of `#`, `?`, or the end of the string.\n  // This marks the start of the query string, fragment, or the end of the URL path.\n  const pathEndIdx = url.search(/#|\\?|$/);\n  // Check if the character before `pathEndIdx` is a trailing slash.\n  // If it is, remove the trailing slash and return the modified URL.\n  // Otherwise, return the URL as is.\n  return url[pathEndIdx - 1] === '/' ? url.slice(0, pathEndIdx - 1) + url.slice(pathEndIdx) : url;\n}\n\n/**\n * Normalizes URL parameters by prepending with `?` if needed.\n *\n * @param  params String of URL parameters.\n *\n * @returns The normalized URL parameters string.\n */\nexport function normalizeQueryParams(params: string): string {\n  return params && params[0] !== '?' ? `?${params}` : params;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Inject, inject, Injectable, InjectionToken, OnDestroy, Optional} from '@angular/core';\n\nimport {DOCUMENT} from '../dom_tokens';\n\nimport {LocationChangeListener, PlatformLocation} from './platform_location';\nimport {joinWithSlash, normalizeQueryParams} from './util';\n\n/**\n * Enables the `Location` service to read route state from the browser's URL.\n * Angular provides two strategies:\n * `HashLocationStrategy` and `PathLocationStrategy`.\n *\n * Applications should use the `Router` or `Location` services to\n * interact with application route state.\n *\n * For instance, `HashLocationStrategy` produces URLs like\n * <code class=\"no-auto-link\">http://example.com/#/foo</code>,\n * and `PathLocationStrategy` produces\n * <code class=\"no-auto-link\">http://example.com/foo</code> as an equivalent URL.\n *\n * See these two classes for more.\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root', useFactory: () => inject(PathLocationStrategy)})\nexport abstract class LocationStrategy {\n  abstract path(includeHash?: boolean): string;\n  abstract prepareExternalUrl(internal: string): string;\n  abstract getState(): unknown;\n  abstract pushState(state: any, title: string, url: string, queryParams: string): void;\n  abstract replaceState(state: any, title: string, url: string, queryParams: string): void;\n  abstract forward(): void;\n  abstract back(): void;\n  historyGo?(relativePosition: number): void {\n    throw new Error(ngDevMode ? 'Not implemented' : '');\n  }\n  abstract onPopState(fn: LocationChangeListener): void;\n  abstract getBaseHref(): string;\n}\n\n/**\n * A predefined DI token for the base href\n * to be used with the `PathLocationStrategy`.\n * The base href is the URL prefix that should be preserved when generating\n * and recognizing URLs.\n *\n * @usageNotes\n *\n * The following example shows how to use this token to configure the root app injector\n * with a base href value, so that the DI framework can supply the dependency anywhere in the app.\n *\n * ```ts\n * import {NgModule} from '@angular/core';\n * import {APP_BASE_HREF} from '@angular/common';\n *\n * @NgModule({\n *   providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]\n * })\n * class AppModule {}\n * ```\n *\n * @publicApi\n */\nexport const APP_BASE_HREF = new InjectionToken<string>(ngDevMode ? 'appBaseHref' : '');\n\n/**\n * @description\n * A {@link LocationStrategy} used to configure the {@link Location} service to\n * represent its state in the\n * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the\n * browser's URL.\n *\n * If you're using `PathLocationStrategy`, you may provide a {@link APP_BASE_HREF}\n * or add a `<base href>` element to the document to override the default.\n *\n * For instance, if you provide an `APP_BASE_HREF` of `'/my/app/'` and call\n * `location.go('/foo')`, the browser's URL will become\n * `example.com/my/app/foo`. To ensure all relative URIs resolve correctly,\n * the `<base href>` and/or `APP_BASE_HREF` should end with a `/`.\n *\n * Similarly, if you add `<base href='/my/app/'/>` to the document and call\n * `location.go('/foo')`, the browser's URL will become\n * `example.com/my/app/foo`.\n *\n * Note that when using `PathLocationStrategy`, neither the query nor\n * the fragment in the `<base href>` will be preserved, as outlined\n * by the [RFC](https://tools.ietf.org/html/rfc3986#section-5.2.2).\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/location/ts/path_location_component.ts region='LocationComponent'}\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root'})\nexport class PathLocationStrategy extends LocationStrategy implements OnDestroy {\n  private _baseHref: string;\n  private _removeListenerFns: (() => void)[] = [];\n\n  constructor(\n    private _platformLocation: PlatformLocation,\n    @Optional() @Inject(APP_BASE_HREF) href?: string,\n  ) {\n    super();\n\n    this._baseHref =\n      href ??\n      this._platformLocation.getBaseHrefFromDOM() ??\n      inject(DOCUMENT).location?.origin ??\n      '';\n  }\n\n  /** @docs-private */\n  ngOnDestroy(): void {\n    while (this._removeListenerFns.length) {\n      this._removeListenerFns.pop()!();\n    }\n  }\n\n  override onPopState(fn: LocationChangeListener): void {\n    this._removeListenerFns.push(\n      this._platformLocation.onPopState(fn),\n      this._platformLocation.onHashChange(fn),\n    );\n  }\n\n  override getBaseHref(): string {\n    return this._baseHref;\n  }\n\n  override prepareExternalUrl(internal: string): string {\n    return joinWithSlash(this._baseHref, internal);\n  }\n\n  override path(includeHash: boolean = false): string {\n    const pathname =\n      this._platformLocation.pathname + normalizeQueryParams(this._platformLocation.search);\n    const hash = this._platformLocation.hash;\n    return hash && includeHash ? `${pathname}${hash}` : pathname;\n  }\n\n  override pushState(state: any, title: string, url: string, queryParams: string) {\n    const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));\n    this._platformLocation.pushState(state, title, externalUrl);\n  }\n\n  override replaceState(state: any, title: string, url: string, queryParams: string) {\n    const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));\n    this._platformLocation.replaceState(state, title, externalUrl);\n  }\n\n  override forward(): void {\n    this._platformLocation.forward();\n  }\n\n  override back(): void {\n    this._platformLocation.back();\n  }\n\n  override getState(): unknown {\n    return this._platformLocation.getState();\n  }\n\n  override historyGo(relativePosition: number = 0): void {\n    this._platformLocation.historyGo?.(relativePosition);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable, OnDestroy, ɵɵinject} from '@angular/core';\nimport {Subject, SubscriptionLike} from 'rxjs';\n\nimport {LocationStrategy} from './location_strategy';\nimport {joinWithSlash, normalizeQueryParams, stripTrailingSlash} from './util';\n\n/** @publicApi */\nexport interface PopStateEvent {\n  pop?: boolean;\n  state?: any;\n  type?: string;\n  url?: string;\n}\n\n/**\n * @description\n *\n * A service that applications can use to interact with a browser's URL.\n *\n * Depending on the `LocationStrategy` used, `Location` persists\n * to the URL's path or the URL's hash segment.\n *\n * @usageNotes\n *\n * It's better to use the `Router.navigate()` service to trigger route changes. Use\n * `Location` only if you need to interact with or create normalized URLs outside of\n * routing.\n *\n * `Location` is responsible for normalizing the URL against the application's base href.\n * A normalized URL is absolute from the URL host, includes the application's base href, and has no\n * trailing slash:\n * - `/my/app/user/123` is normalized\n * - `my/app/user/123` **is not** normalized\n * - `/my/app/user/123/` **is not** normalized\n *\n * ### Example\n *\n * {@example common/location/ts/path_location_component.ts region='LocationComponent'}\n *\n * @publicApi\n */\n@Injectable({\n  providedIn: 'root',\n  // See #23917\n  useFactory: createLocation,\n})\nexport class Location implements OnDestroy {\n  /** @internal */\n  _subject = new Subject<PopStateEvent>();\n  /** @internal */\n  _basePath: string;\n  /** @internal */\n  _locationStrategy: LocationStrategy;\n  /** @internal */\n  _urlChangeListeners: ((url: string, state: unknown) => void)[] = [];\n  /** @internal */\n  _urlChangeSubscription: SubscriptionLike | null = null;\n\n  constructor(locationStrategy: LocationStrategy) {\n    this._locationStrategy = locationStrategy;\n    const baseHref = this._locationStrategy.getBaseHref();\n    // Note: This class's interaction with base HREF does not fully follow the rules\n    // outlined in the spec https://www.freesoft.org/CIE/RFC/1808/18.htm.\n    // Instead of trying to fix individual bugs with more and more code, we should\n    // investigate using the URL constructor and providing the base as a second\n    // argument.\n    // https://developer.mozilla.org/en-US/docs/Web/API/URL/URL#parameters\n    this._basePath = _stripOrigin(stripTrailingSlash(_stripIndexHtml(baseHref)));\n    this._locationStrategy.onPopState((ev) => {\n      this._subject.next({\n        'url': this.path(true),\n        'pop': true,\n        'state': ev.state,\n        'type': ev.type,\n      });\n    });\n  }\n\n  /** @docs-private */\n  ngOnDestroy(): void {\n    this._urlChangeSubscription?.unsubscribe();\n    this._urlChangeListeners = [];\n  }\n\n  /**\n   * Normalizes the URL path for this location.\n   *\n   * @param includeHash True to include an anchor fragment in the path.\n   *\n   * @returns The normalized URL path.\n   */\n  // TODO: vsavkin. Remove the boolean flag and always include hash once the deprecated router is\n  // removed.\n  path(includeHash: boolean = false): string {\n    return this.normalize(this._locationStrategy.path(includeHash));\n  }\n\n  /**\n   * Reports the current state of the location history.\n   * @returns The current value of the `history.state` object.\n   */\n  getState(): unknown {\n    return this._locationStrategy.getState();\n  }\n\n  /**\n   * Normalizes the given path and compares to the current normalized path.\n   *\n   * @param path The given URL path.\n   * @param query Query parameters.\n   *\n   * @returns True if the given URL path is equal to the current normalized path, false\n   * otherwise.\n   */\n  isCurrentPathEqualTo(path: string, query: string = ''): boolean {\n    return this.path() == this.normalize(path + normalizeQueryParams(query));\n  }\n\n  /**\n   * Normalizes a URL path by stripping any trailing slashes.\n   *\n   * @param url String representing a URL.\n   *\n   * @returns The normalized URL string.\n   */\n  normalize(url: string): string {\n    return Location.stripTrailingSlash(_stripBasePath(this._basePath, _stripIndexHtml(url)));\n  }\n\n  /**\n   * Normalizes an external URL path.\n   * If the given URL doesn't begin with a leading slash (`'/'`), adds one\n   * before normalizing. Adds a hash if `HashLocationStrategy` is\n   * in use, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.\n   *\n   * @param url String representing a URL.\n   *\n   * @returns  A normalized platform-specific URL.\n   */\n  prepareExternalUrl(url: string): string {\n    if (url && url[0] !== '/') {\n      url = '/' + url;\n    }\n    return this._locationStrategy.prepareExternalUrl(url);\n  }\n\n  // TODO: rename this method to pushState\n  /**\n   * Changes the browser's URL to a normalized version of a given URL, and pushes a\n   * new item onto the platform's history.\n   *\n   * @param path  URL path to normalize.\n   * @param query Query parameters.\n   * @param state Location history state.\n   *\n   */\n  go(path: string, query: string = '', state: any = null): void {\n    this._locationStrategy.pushState(state, '', path, query);\n    this._notifyUrlChangeListeners(\n      this.prepareExternalUrl(path + normalizeQueryParams(query)),\n      state,\n    );\n  }\n\n  /**\n   * Changes the browser's URL to a normalized version of the given URL, and replaces\n   * the top item on the platform's history stack.\n   *\n   * @param path  URL path to normalize.\n   * @param query Query parameters.\n   * @param state Location history state.\n   */\n  replaceState(path: string, query: string = '', state: any = null): void {\n    this._locationStrategy.replaceState(state, '', path, query);\n    this._notifyUrlChangeListeners(\n      this.prepareExternalUrl(path + normalizeQueryParams(query)),\n      state,\n    );\n  }\n\n  /**\n   * Navigates forward in the platform's history.\n   */\n  forward(): void {\n    this._locationStrategy.forward();\n  }\n\n  /**\n   * Navigates back in the platform's history.\n   */\n  back(): void {\n    this._locationStrategy.back();\n  }\n\n  /**\n   * Navigate to a specific page from session history, identified by its relative position to the\n   * current page.\n   *\n   * @param relativePosition  Position of the target page in the history relative to the current\n   *     page.\n   * A negative value moves backwards, a positive value moves forwards, e.g. `location.historyGo(2)`\n   * moves forward two pages and `location.historyGo(-2)` moves back two pages. When we try to go\n   * beyond what's stored in the history session, we stay in the current page. Same behaviour occurs\n   * when `relativePosition` equals 0.\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/History_API#Moving_to_a_specific_point_in_history\n   */\n  historyGo(relativePosition: number = 0): void {\n    this._locationStrategy.historyGo?.(relativePosition);\n  }\n\n  /**\n   * Registers a URL change listener. Use to catch updates performed by the Angular\n   * framework that are not detectible through \"popstate\" or \"hashchange\" events.\n   *\n   * @param fn The change handler function, which take a URL and a location history state.\n   * @returns A function that, when executed, unregisters a URL change listener.\n   */\n  onUrlChange(fn: (url: string, state: unknown) => void): VoidFunction {\n    this._urlChangeListeners.push(fn);\n\n    this._urlChangeSubscription ??= this.subscribe((v) => {\n      this._notifyUrlChangeListeners(v.url, v.state);\n    });\n\n    return () => {\n      const fnIndex = this._urlChangeListeners.indexOf(fn);\n      this._urlChangeListeners.splice(fnIndex, 1);\n\n      if (this._urlChangeListeners.length === 0) {\n        this._urlChangeSubscription?.unsubscribe();\n        this._urlChangeSubscription = null;\n      }\n    };\n  }\n\n  /** @internal */\n  _notifyUrlChangeListeners(url: string = '', state: unknown) {\n    this._urlChangeListeners.forEach((fn) => fn(url, state));\n  }\n\n  /**\n   * Subscribes to the platform's `popState` events.\n   *\n   * Note: `Location.go()` does not trigger the `popState` event in the browser. Use\n   * `Location.onUrlChange()` to subscribe to URL changes instead.\n   *\n   * @param value Event that is triggered when the state history changes.\n   * @param exception The exception to throw.\n   *\n   * @see [onpopstate](https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate)\n   *\n   * @returns Subscribed events.\n   */\n  subscribe(\n    onNext: (value: PopStateEvent) => void,\n    onThrow?: ((exception: any) => void) | null,\n    onReturn?: (() => void) | null,\n  ): SubscriptionLike {\n    return this._subject.subscribe({\n      next: onNext,\n      error: onThrow ?? undefined,\n      complete: onReturn ?? undefined,\n    });\n  }\n\n  /**\n   * Normalizes URL parameters by prepending with `?` if needed.\n   *\n   * @param  params String of URL parameters.\n   *\n   * @returns The normalized URL parameters string.\n   */\n  public static normalizeQueryParams: (params: string) => string = normalizeQueryParams;\n\n  /**\n   * Joins two parts of a URL with a slash if needed.\n   *\n   * @param start  URL string\n   * @param end    URL string\n   *\n   *\n   * @returns The joined URL string.\n   */\n  public static joinWithSlash: (start: string, end: string) => string = joinWithSlash;\n\n  /**\n   * Removes a trailing slash from a URL string if needed.\n   * Looks for the first occurrence of either `#`, `?`, or the end of the\n   * line as `/` characters and removes the trailing slash if one exists.\n   *\n   * @param url URL string.\n   *\n   * @returns The URL string, modified if needed.\n   */\n  public static stripTrailingSlash: (url: string) => string = stripTrailingSlash;\n}\n\nexport function createLocation() {\n  return new Location(ɵɵinject(LocationStrategy as any));\n}\n\nfunction _stripBasePath(basePath: string, url: string): string {\n  if (!basePath || !url.startsWith(basePath)) {\n    return url;\n  }\n  const strippedUrl = url.substring(basePath.length);\n  if (strippedUrl === '' || ['/', ';', '?', '#'].includes(strippedUrl[0])) {\n    return strippedUrl;\n  }\n  return url;\n}\n\nfunction _stripIndexHtml(url: string): string {\n  return url.replace(/\\/index.html$/, '');\n}\n\nfunction _stripOrigin(baseHref: string): string {\n  // DO NOT REFACTOR! Previously, this check looked like this:\n  // `/^(https?:)?\\/\\//.test(baseHref)`, but that resulted in\n  // syntactically incorrect code after Closure Compiler minification.\n  // This was likely caused by a bug in Closure Compiler, but\n  // for now, the check is rewritten to use `new RegExp` instead.\n  const isAbsoluteUrl = new RegExp('^(https?:)?//').test(baseHref);\n  if (isAbsoluteUrl) {\n    const [, pathname] = baseHref.split(/\\/\\/[^\\/]+/);\n    return pathname;\n  }\n  return baseHref;\n}\n"],"names":["i1.LocationStrategy","ɵɵinject"],"mappings":"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"}y
=x   /**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { ɵRuntimeError as _RuntimeError, Injectable, inject, NgZone, DestroyRef, InjectionToken, ɵPendingTasksInternal as _PendingTasksInternal, PLATFORM_ID, ɵConsole as _Console, ɵformatRuntimeError as _formatRuntimeError, runInInjectionContext, Inject, makeEnvironmentProviders, NgModule } from '@angular/core';
import { concatMap, filter, map, finalize, switchMap } from 'rxjs/operators';
import { of, Observable, from } from 'rxjs';
import { isPlatformServer, XhrFactory, parseCookieValue } from './xhr-BfNfxNDv.mjs';
import { DOCUMENT } from './dom_tokens-rA0ACyx7.mjs';

/**
 * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a
 * `HttpResponse`.
 *
 * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the
 * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the
 * `HttpBackend`.
 *
 * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.
 *
 * @publicApi
 */
class HttpHandler {
}
/**
 * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.
 *
 * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.
 *
 * When injected, `HttpBackend` dispatches requests directly to the backend, without going
 * through the interceptor chain.
 *
 * @publicApi
 */
class HttpBackend {
}

/**
 * Represents the header configuration options for an HTTP request.
 * Instances are immutable. Modifying methods return a cloned
 * instance with the change. The original object is never changed.
 *
 * @publicApi
 */
class HttpHeaders {
    /**
     * Internal map of lowercase header names to values.
     */
    headers;
    /**
     * Internal map of lowercased header names to the normalized
     * form of the name (the form seen first).
     */
    normalizedNames = new Map();
    /**
     * Complete the lazy initialization of this object (needed before reading).
     */
    lazyInit;
    /**
     * Queued updates to be materialized the next initialization.
     */
    lazyUpdate = null;
    /**  Constructs a new HTTP header object with the given values.*/
    constructor(headers) {
        if (!headers) {
            this.headers = new Map();
        }
        else if (typeof headers === 'string') {
            this.lazyInit = () => {
                this.headers = new Map();
                headers.split('\n').forEach((line) => {
                    const index = line.indexOf(':');
                    if (index > 0) {
                        const name = line.slice(0, index);
                        const value = line.slice(index + 1).trim();
                        this.addHeaderEntry(name, value);
                    }
                });
            };
        }
        else if (typeof Headers !== 'undefined' && headers instanceof Headers) {
            this.headers = new Map();
            headers.forEach((value, name) => {
                this.addHeaderEntry(name, value);
            });
        }
        else {
            this.lazyInit = () => {
                if (typeof ngDevMode === 'undefined' || ngDevMode) {
                    assertValidHeaders(headers);
                }
                this.headers = new Map();
                Object.entries(headers).forEach(([name, values]) => {
                    this.setHeaderEntries(name, values);
                });
            };
        }
    }
    /**
     * Checks for existence of a given header.
     *
     * @param name The header name to check for existence.
     *
     * @returns True if the header exists, false otherwise.
     */
    has(name) {
        this.init();
        return this.headers.has(name.toLowerCase());
    }
    /**
     * Retrieves the first value of a given header.
     *
     * @param name The header name.
     *
     * @returns The value string if the header exists, null otherwise
     */
    get(name) {
        this.init();
        const values = this.headers.get(name.toLowerCase());
        return values && values.length > 0 ? values[0] : null;
    }
    /**
     * Retrieves the names of the headers.
     *
     * @returns A list of header names.
     */
    keys() {
        this.init();
        return Array.from(this.normalizedNames.values());
    }
    /**
     * Retrieves a list of values for a given header.
     *
     * @param name The header name from which to retrieve values.
     *
     * @returns A string of values if the header exists, null otherwise.
     */
    getAll(name) {
        this.init();
        return this.headers.get(name.toLowerCase()) || null;
    }
    /**
     * Appends a new value to the existing set of values for a header
     * and returns them in a clone of the original instance.
     *
     * @param name The header name for which to append the values.
     * @param value The value to append.
     *
     * @returns A clone of the HTTP headers object with the value appended to the given header.
     */
    append(name, value) {
        return this.clone({ name, value, op: 'a' });
    }
    /**
     * Sets or modifies a value for a given header in a clone of the original instance.
     * If the header already exists, its value is replaced with the given value
     * in the returned object.
     *
     * @param name The header name.
     * @param value The value or values to set or override for the given header.
     *
     * @returns A clone of the HTTP headers object with the newly set header value.
     */
    set(name, value) {
        return this.clone({ name, value, op: 's' });
    }
    /**
     * Deletes values for a given header in a clone of the original instance.
     *
     * @param name The header name.
     * @param value The value or values to delete for the given header.
     *
     * @returns A clone of the HTTP headers object with the given value deleted.
     */
    delete(name, value) {
        return this.clone({ name, value, op: 'd' });
    }
    maybeSetNormalizedName(name, lcName) {
        if (!this.normalizedNames.has(lcName)) {
            this.normalizedNames.set(lcName, name);
        }
    }
    init() {
        if (!!this.lazyInit) {
            if (this.lazyInit instanceof HttpHeaders) {
                this.copyFrom(this.lazyInit);
            }
            else {
                this.lazyInit();
            }
            this.lazyInit = null;
            if (!!this.lazyUpdate) {
                this.lazyUpdate.forEach((update) => this.applyUpdate(update));
                this.lazyUpdate = null;
            }
        }
    }
    copyFrom(other) {
        other.init();
        Array.from(other.headers.keys()).forEach((key) => {
            this.headers.set(key, other.headers.get(key));
            this.normalizedNames.set(key, other.normalizedNames.get(key));
        });
    }
    clone(update) {
        const clone = new HttpHeaders();
        clone.lazyInit = !!this.lazyInit && this.lazyInit instanceof HttpHeaders ? this.lazyInit : this;
        clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);
        return clone;
    }
    applyUpdate(update) {
        const key = update.name.toLowerCase();
        switch (update.op) {
            case 'a':
            case 's':
                let value = update.value;
                if (typeof value === 'string') {
                    value = [value];
                }
                if (value.length === 0) {
                    return;
                }
                this.maybeSetNormalizedName(update.name, key);
                const base = (update.op === 'a' ? this.headers.get(key) : undefined) || [];
                base.push(...value);
                this.headers.set(key, base);
                break;
            case 'd':
                const toDelete = update.value;
                if (!toDelete) {
                    this.headers.delete(key);
                    this.normalizedNames.delete(key);
                }
                else {
                    let existing = this.headers.get(key);
                    if (!existing) {
                        return;
                    }
                    existing = existing.filter((value) => toDelete.indexOf(value) === -1);
                    if (existing.length === 0) {
                        this.headers.delete(key);
                        this.normalizedNames.delete(key);
                    }
                    else {
                        this.headers.set(key, existing);
                    }
                }
                break;
        }
    }
    addHeaderEntry(name, value) {
        const key = name.toLowerCase();
        this.maybeSetNormalizedName(name, key);
        if (this.headers.has(key)) {
            this.headers.get(key).push(value);
        }
        else {
            this.headers.set(key, [value]);
        }
    }
    setHeaderEntries(name, values) {
        const headerValues = (Array.isArray(values) ? values : [values]).map((value) => value.toString());
        const key = name.toLowerCase();
        this.headers.set(key, headerValues);
        this.maybeSetNormalizedName(name, key);
    }
    /**
     * @internal
     */
    forEach(fn) {
        this.init();
        Array.from(this.normalizedNames.keys()).forEach((key) => fn(this.normalizedNames.get(key), this.headers.get(key)));
    }
}
/**
 * Verifies that the headers object has the right shape: the values
 * must be either strings, numbers or arrays. Throws an error if an invalid
 * header value is present.
 */
function assertValidHeaders(headers) {
    for (const [key, value] of Object.entries(headers)) {
        if (!(typeof value === 'string' || typeof value === 'number') && !Array.isArray(value)) {
            throw new Error(`Unexpected value of the \`${key}\` header provided. ` +
                `Expecting either a string, a number or an array, but got: \`${value}\`.`);
        }
    }
}

/**
 * Provides encoding and decoding of URL parameter and query-string values.
 *
 * Serializes and parses URL parameter keys and values to encode and decode them.
 * If you pass URL query parameters without encoding,
 * the query parameters can be misinterpreted at the receiving end.
 *
 *
 * @publicApi
 */
class HttpUrlEncodingCodec {
    /**
     * Encodes a key name for a URL parameter or query-string.
     * @param key The key name.
     * @returns The encoded key name.
     */
    encodeKey(key) {
        return standardEncoding(key);
    }
    /**
     * Encodes the value of a URL parameter or query-string.
     * @param value The value.
     * @returns The encoded value.
     */
    encodeValue(value) {
        return standardEncoding(value);
    }
    /**
     * Decodes an encoded URL parameter or query-string key.
     * @param key The encoded key name.
     * @returns The decoded key name.
     */
    decodeKey(key) {
        return decodeURIComponent(key);
    }
    /**
     * Decodes an encoded URL parameter or query-string value.
     * @param value The encoded value.
     * @returns The decoded value.
     */
    decodeValue(value) {
        return decodeURIComponent(value);
    }
}
function paramParser(rawParams, codec) {
    const map = new Map();
    if (rawParams.length > 0) {
        // The `window.location.search` can be used while creating an instance of the `HttpParams` class
        // (e.g. `new HttpParams({ fromString: window.location.search })`). The `window.location.search`
        // may start with the `?` char, so we strip it if it's present.
        const params = rawParams.replace(/^\?/, '').split('&');
        params.forEach((param) => {
            const eqIdx = param.indexOf('=');
            const [key, val] = eqIdx == -1
                ? [codec.decodeKey(param), '']
                : [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))];
            const list = map.get(key) || [];
            list.push(val);
            map.set(key, list);
        });
    }
    return map;
}
/**
 * Encode input string with standard encodeURIComponent and then un-encode specific characters.
 */
const STANDARD_ENCODING_REGEX = /%(\d[a-f0-9])/gi;
const STANDARD_ENCODING_REPLACEMENTS = {
    '40': '@',
    '3A': ':',
    '24': '$',
    '2C': ',',
    '3B': ';',
    '3D': '=',
    '3F': '?',
    '2F': '/',
};
function standardEncoding(v) {
    return encodeURIComponent(v).replace(STANDARD_ENCODING_REGEX, (s, t) => STANDARD_ENCODING_REPLACEMENTS[t] ?? s);
}
function valueToString(value) {
    return `${value}`;
}
/**
 * An HTTP request/response body that represents serialized parameters,
 * per the MIME type `application/x-www-form-urlencoded`.
 *
 * This class is immutable; all mutation operations return a new instance.
 *
 * @publicApi
 */
class HttpParams {
    map;
    encoder;
    updates = null;
    cloneFrom = null;
    constructor(options = {}) {
        this.encoder = options.encoder || new HttpUrlEncodingCodec();
        if (options.fromString) {
            if (options.fromObject) {
                throw new _RuntimeError(2805 /* RuntimeErrorCode.CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT */, ngDevMode && 'Cannot specify both fromString and fromObject.');
            }
            this.map = paramParser(options.fromString, this.encoder);
        }
        else if (!!options.fromObject) {
            this.map = new Map();
            Object.keys(options.fromObject).forEach((key) => {
                const value = options.fromObject[key];
                // convert the values to strings
                const values = Array.isArray(value) ? value.map(valueToString) : [valueToString(value)];
                this.map.set(key, values);
            });
        }
        else {
            this.map = null;
        }
    }
    /**
     * Reports whether the body includes one or more values for a given parameter.
     * @param param The parameter name.
     * @returns True if the parameter has one or more values,
     * false if it has no value or is not present.
     */
    has(param) {
        this.init();
        return this.map.has(param);
    }
    /**
     * Retrieves the first value for a parameter.
     * @param param The parameter name.
     * @returns The first value of the given parameter,
     * or `null` if the parameter is not present.
     */
    get(param) {
        this.init();
        const res = this.map.get(param);
        return !!res ? res[0] : null;
    }
    /**
     * Retrieves all values for a  parameter.
     * @param param The parameter name.
     * @returns All values in a string array,
     * or `null` if the parameter not present.
     */
    getAll(param) {
        this.init();
        return this.map.get(param) || null;
    }
    /**
     * Retrieves all the parameters for this body.
     * @returns The parameter names in a string array.
     */
    keys() {
        this.init();
        return Array.from(this.map.keys());
    }
    /**
     * Appends a new value to existing values for a parameter.
     * @param param The parameter name.
     * @param value The new value to add.
     * @return A new body with the appended value.
     */
    append(param, value) {
        return this.clone({ param, value, op: 'a' });
    }
    /**
     * Constructs a new body with appended values for the given parameter name.
     * @param params parameters and values
     * @return A new body with the new value.
     */
    appendAll(params) {
        const updates = [];
        Object.keys(params).forEach((param) => {
            const value = params[param];
            if (Array.isArray(value)) {
                value.forEach((_value) => {
                    updates.push({ param, value: _value, op: 'a' });
                });
            }
            else {
                updates.push({ param, value: value, op: 'a' });
            }
        });
        return this.clone(updates);
    }
    /**
     * Replaces the value for a parameter.
     * @param param The parameter name.
     * @param value The new value.
     * @return A new body with the new value.
     */
    set(param, value) {
        return this.clone({ param, value, op: 's' });
    }
    /**
     * Removes a given value or all values from a parameter.
     * @param param The parameter name.
     * @param value The value to remove, if provided.
     * @return A new body with the given value removed, or with all values
     * removed if no value is specified.
     */
    delete(param, value) {
        return this.clone({ param, value, op: 'd' });
    }
    /**
     * Serializes the body to an encoded string, where key-value pairs (separated by `=`) are
     * separated by `&`s.
     */
    toString() {
        this.init();
        return (this.keys()
            .map((key) => {
            const eKey = this.encoder.encodeKey(key);
            // `a: ['1']` produces `'a=1'`
            // `b: []` produces `''`
            // `c: ['1', '2']` produces `'c=1&c=2'`
            return this.map.get(key)
                .map((value) => eKey + '=' + this.encoder.encodeValue(value))
                .join('&');
        })
            // filter out empty values because `b: []` produces `''`
            // which results in `a=1&&c=1&c=2` instead of `a=1&c=1&c=2` if we don't
            .filter((param) => param !== '')
            .join('&'));
    }
    clone(update) {
        const clone = new HttpParams({ encoder: this.encoder });
        clone.cloneFrom = this.cloneFrom || this;
        clone.updates = (this.updates || []).concat(update);
        return clone;
    }
    init() {
        if (this.map === null) {
            this.map = new Map();
        }
        if (this.cloneFrom !== null) {
            this.cloneFrom.init();
            this.cloneFrom.keys().forEach((key) => this.map.set(key, this.cloneFrom.map.get(key)));
            this.updates.forEach((update) => {
                switch (update.op) {
                    case 'a':
                    case 's':
                        const base = (update.op === 'a' ? this.map.get(update.param) : undefined) || [];
                        base.push(valueToString(update.value));
                        this.map.set(update.param, base);
                        break;
                    case 'd':
                        if (update.value !== undefined) {
                            let base = this.map.get(update.param) || [];
                            const idx = base.indexOf(valueToString(update.value));
                            if (idx !== -1) {
                                base.splice(idx, 1);
                            }
                            if (base.length > 0) {
                                this.map.set(update.param, base);
                            }
                            else {
                                this.map.delete(update.param);
                            }
                        }
                        else {
                            this.map.delete(update.param);
                            break;
                        }
                }
            });
            this.cloneFrom = this.updates = null;
        }
    }
}

/**
 * A token used to manipulate and access values stored in `HttpContext`.
 *
 * @publicApi
 */
class HttpContextToken {
    defaultValue;
    constructor(defaultValue) {
        this.defaultValue = defaultValue;
    }
}
/**
 * Http context stores arbitrary user defined values and ensures type safety without
 * actually knowing the types. It is backed by a `Map` and guarantees that keys do not clash.
 *
 * This context is mutable and is shared between cloned requests unless explicitly specified.
 *
 * @usageNotes
 *
 * ### Usage Example
 *
 * ```ts
 * // inside cache.interceptors.ts
 * export const IS_CACHE_ENABLED = new HttpContextToken<boolean>(() => false);
 *
 * export class CacheInterceptor implements HttpInterceptor {
 *
 *   intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {
 *     if (req.context.get(IS_CACHE_ENABLED) === true) {
 *       return ...;
 *     }
 *     return delegate.handle(req);
 *   }
 * }
 *
 * // inside a service
 *
 * this.httpClient.get('/api/weather', {
 *   context: new HttpContext().set(IS_CACHE_ENABLED, true)
 * }).subscribe(...);
 * ```
 *
 * @publicApi
 */
class HttpContext {
    map = new Map();
    /**
     * Store a value in the context. If a value is already present it will be overwritten.
     *
     * @param token The reference to an instance of `HttpContextToken`.
     * @param value The value to store.
     *
     * @returns A reference to itself for easy chaining.
     */
    set(token, value) {
        this.map.set(token, value);
        return this;
    }
    /**
     * Retrieve the value associated with the given token.
     *
     * @param token The reference to an instance of `HttpContextToken`.
     *
     * @returns The stored value or default if one is defined.
     */
    get(token) {
        if (!this.map.has(token)) {
            this.map.set(token, token.defaultValue());
        }
        return this.map.get(token);
    }
    /**
     * Delete the value associated with the given token.
     *
     * @param token The reference to an instance of `HttpContextToken`.
     *
     * @returns A reference to itself for easy chaining.
     */
    delete(token) {
        this.map.delete(token);
        return this;
    }
    /**
     * Checks for existence of a given token.
     *
     * @param token The reference to an instance of `HttpContextToken`.
     *
     * @returns True if the token exists, false otherwise.
     */
    has(token) {
        return this.map.has(token);
    }
    /**
     * @returns a list of tokens currently stored in the context.
     */
    keys() {
        return this.map.keys();
    }
}

/**
 * Determine whether the given HTTP method may include a body.
 */
function mightHaveBody(method) {
    switch (method) {
        case 'DELETE':
        case 'GET':
        case 'HEAD':
        case 'OPTIONS':
        case 'JSONP':
            return false;
        default:
            return true;
    }
}
/**
 * Safely assert whether the given value is an ArrayBuffer.
 *
 * In some execution environments ArrayBuffer is not defined.
 */
function isArrayBuffer(value) {
    return typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;
}
/**
 * Safely assert whether the given value is a Blob.
 *
 * In some execution environments Blob is not defined.
 */
function isBlob(value) {
    return typeof Blob !== 'undefined' && value instanceof Blob;
}
/**
 * Safely assert whether the given value is a FormData instance.
 *
 * In some execution environments FormData is not defined.
 */
function isFormData(value) {
    return typeof FormData !== 'undefined' && value instanceof FormData;
}
/**
 * Safely assert whether the given value is a URLSearchParams instance.
 *
 * In some execution environments URLSearchParams is not defined.
 */
function isUrlSearchParams(value) {
    return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;
}
/**
 * `Content-Type` is an HTTP header used to indicate the media type
 * (also known as MIME type) of the resource being sent to the client
 * or received from the server.
 */
const CONTENT_TYPE_HEADER = 'Content-Type';
/**
 * The `Accept` header is an HTTP request header that indicates the media types
 * (or content types) the client is willing to receive from the server.
 */
const ACCEPT_HEADER = 'Accept';
/**
 * `X-Request-URL` is a custom HTTP header used in older browser versions,
 * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer,
 * to include the full URL of the request in cross-origin requests.
 */
const X_REQUEST_URL_HEADER = 'X-Request-URL';
/**
 * `text/plain` is a content type used to indicate that the content being
 * sent is plain text with no special formatting or structured data
 * like HTML, XML, or JSON.
 */
const TEXT_CONTENT_TYPE = 'text/plain';
/**
 * `application/json` is a content type used to indicate that the content
 * being sent is in the JSON format.
 */
const JSON_CONTENT_TYPE = 'application/json';
/**
 * `application/json, text/plain, *\/*` is a content negotiation string often seen in the
 * Accept header of HTTP requests. It indicates the types of content the client is willing
 * to accept from the server, with a preference for `application/json` and `text/plain`,
 * but also accepting any other type (*\/*).
 */
const ACCEPT_HEADER_VALUE = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`;
/**
 * An outgoing HTTP request with an optional typed body.
 *
 * `HttpRequest` represents an outgoing request, including URL, method,
 * headers, body, and other request configuration options. Instances should be
 * assumed to be immutable. To modify a `HttpRequest`, the `clone`
 * method should be used.
 *
 * @publicApi
 */
class HttpRequest {
    url;
    /**
     * The request body, or `null` if one isn't set.
     *
     * Bodies are not enforced to be immutable, as they can include a reference to any
     * user-defined data type. However, interceptors should take care to preserve
     * idempotence by treating them as such.
     */
    body = null;
    /**
     * Outgoing headers for this request.
     */
    headers;
    /**
     * Shared and mutable context that can be used by interceptors
     */
    context;
    /**
     * Whether this request should be made in a way that exposes progress events.
     *
     * Progress events are expensive (change detection runs on each event) and so
     * they should only be requested if the consumer intends to monitor them.
     *
     * Note: The `FetchBackend` doesn't support progress report on uploads.
     */
    reportProgress = false;
    /**
     * Whether this request should be sent with outgoing credentials (cookies).
     */
    withCredentials = false;
    /**
     * The expected response type of the server.
     *
     * This is used to parse the response appropriately before returning it to
     * the requestee.
     */
    responseType = 'json';
    /**
     * The outgoing HTTP request method.
     */
    method;
    /**
     * Outgoing URL parameters.
     *
     * To pass a string representation of HTTP parameters in the URL-query-string format,
     * the `HttpParamsOptions`' `fromString` may be used. For example:
     *
     * ```ts
     * new HttpParams({fromString: 'angular=awesome'})
     * ```
     */
    params;
    /**
     * The outgoing URL with all URL parameters set.
     */
    urlWithParams;
    /**
     * The HttpTransferCache option for the request
     */
    transferCache;
    constructor(method, url, third, fourth) {
        this.url = url;
        this.method = method.toUpperCase();
        // Next, need to figure out which argument holds the HttpRequestInit
        // options, if any.
        let options;
        // Check whether a body argument is expected. The only valid way to omit
        // the body argument is to use a known no-body method like GET.
        if (mightHaveBody(this.method) || !!fourth) {
            // Body is the third argument, options are the fourth.
            this.body = third !== undefined ? third : null;
            options = fourth;
        }
        else {
            // No body required, options are the third argument. The body stays null.
            options = third;
        }
        // If options have been passed, interpret them.
        if (options) {
            // Normalize reportProgress and withCredentials.
            this.reportProgress = !!options.reportProgress;
            this.withCredentials = !!options.withCredentials;
            // Override default response type of 'json' if one is provided.
            if (!!options.responseType) {
                this.responseType = options.responseType;
            }
            // Override headers if they're provided.
            if (!!options.headers) {
                this.headers = options.headers;
            }
            if (!!options.context) {
                this.context = options.context;
            }
            if (!!options.params) {
                this.params = options.params;
            }
            // We do want to assign transferCache even if it's falsy (false is valid value)
            this.transferCache = options.transferCache;
        }
        // If no headers have been passed in, construct a new HttpHeaders instance.
        this.headers ??= new HttpHeaders();
        // If no context have been passed in, construct a new HttpContext instance.
        this.context ??= new HttpContext();
        // If no parameters have been passed in, construct a new HttpUrlEncodedParams instance.
        if (!this.params) {
            this.params = new HttpParams();
            this.urlWithParams = url;
        }
        else {
            // Encode the parameters to a string in preparation for inclusion in the URL.
            const params = this.params.toString();
            if (params.length === 0) {
                // No parameters, the visible URL is just the URL given at creation time.
                this.urlWithParams = url;
            }
            else {
                // Does the URL already have query parameters? Look for '?'.
                const qIdx = url.indexOf('?');
                // There are 3 cases to handle:
                // 1) No existing parameters -> append '?' followed by params.
                // 2) '?' exists and is followed by existing query string ->
                //    append '&' followed by params.
                // 3) '?' exists at the end of the url -> append params directly.
                // This basically amounts to determining the character, if any, with
                // which to join the URL and parameters.
                const sep = qIdx === -1 ? '?' : qIdx < url.length - 1 ? '&' : '';
                this.urlWithParams = url + sep + params;
            }
        }
    }
    /**
     * Transform the free-form body into a serialized format suitable for
     * transmission to the server.
     */
    serializeBody() {
        // If no body is present, no need to serialize it.
        if (this.body === null) {
            return null;
        }
        // Check whether the body is already in a serialized form. If so,
        // it can just be returned directly.
        if (typeof this.body === 'string' ||
            isArrayBuffer(this.body) ||
            isBlob(this.body) ||
            isFormData(this.body) ||
            isUrlSearchParams(this.body)) {
            return this.body;
        }
        // Check whether the body is an instance of HttpUrlEncodedParams.
        if (this.body instanceof HttpParams) {
            return this.body.toString();
        }
        // Check whether the body is an object or array, and serialize with JSON if so.
        if (typeof this.body === 'object' ||
            typeof this.body === 'boolean' ||
            Array.isArray(this.body)) {
            return JSON.stringify(this.body);
        }
        // Fall back on toString() for everything else.
        return this.body.toString();
    }
    /**
     * Examine the body and attempt to infer an appropriate MIME type
     * for it.
     *
     * If no such type can be inferred, this method will return `null`.
     */
    detectContentTypeHeader() {
        // An empty body has no content type.
        if (this.body === null) {
            return null;
        }
        // FormData bodies rely on the browser's content type assignment.
        if (isFormData(this.body)) {
            return null;
        }
        // Blobs usually have their own content type. If it doesn't, then
        // no type can be inferred.
        if (isBlob(this.body)) {
            return this.body.type || null;
        }
        // Array buffers have unknown contents and thus no type can be inferred.
        if (isArrayBuffer(this.body)) {
            return null;
        }
        // Technically, strings could be a form of JSON data, but it's safe enough
        // to assume they're plain strings.
        if (typeof this.body === 'string') {
            return TEXT_CONTENT_TYPE;
        }
        // `HttpUrlEncodedParams` has its own content-type.
        if (this.body instanceof HttpParams) {
            return 'application/x-www-form-urlencoded;charset=UTF-8';
        }
        // Arrays, objects, boolean and numbers will be encoded as JSON.
        if (typeof this.body === 'object' ||
            typeof this.body === 'number' ||
            typeof this.body === 'boolean') {
            return JSON_CONTENT_TYPE;
        }
        // No type could be inferred.
        return null;
    }
    clone(update = {}) {
        // For method, url, and responseType, take the current value unless
        // it is overridden in the update hash.
        const method = update.method || this.method;
        const url = update.url || this.url;
        const responseType = update.responseType || this.responseType;
        // Carefully handle the transferCache to differentiate between
        // `false` and `undefined` in the update args.
        const transferCache = update.transferCache ?? this.transferCache;
        // The body is somewhat special - a `null` value in update.body means
        // whatever current body is present is being overridden with an empty
        // body, whereas an `undefined` value in update.body implies no
        // override.
        const body = update.body !== undefined ? update.body : this.body;
        // Carefully handle the boolean options to differentiate between
        // `false` and `undefined` in the update args.
        const withCredentials = update.withCredentials ?? this.withCredentials;
        const reportProgress = update.reportProgress ?? this.reportProgress;
        // Headers and params may be appended to if `setHeaders` or
        // `setParams` are used.
        let headers = update.headers || this.headers;
        let params = update.params || this.params;
        // Pass on context if needed
        const context = update.context ?? this.context;
        // Check whether the caller has asked to add headers.
        if (update.setHeaders !== undefined) {
            // Set every requested header.
            headers = Object.keys(update.setHeaders).reduce((headers, name) => headers.set(name, update.setHeaders[name]), headers);
        }
        // Check whether the caller has asked to set params.
        if (update.setParams) {
            // Set every requested param.
            params = Object.keys(update.setParams).reduce((params, param) => params.set(param, update.setParams[param]), params);
        }
        // Finally, construct the new HttpRequest using the pieces from above.
        return new HttpRequest(method, url, body, {
            params,
            headers,
            context,
            reportProgress,
            responseType,
            withCredentials,
            transferCache,
        });
    }
}

/**
 * Type enumeration for the different kinds of `HttpEvent`.
 *
 * @publicApi
 */
var HttpEventType;
(function (HttpEventType) {
    /**
     * The request was sent out over the wire.
     */
    HttpEventType[HttpEventType["Sent"] = 0] = "Sent";
    /**
     * An upload progress event was received.
     *
     * Note: The `FetchBackend` doesn't support progress report on uploads.
     */
    HttpEventType[HttpEventType["UploadProgress"] = 1] = "UploadProgress";
    /**
     * The response status code and headers were received.
     */
    HttpEventType[HttpEventType["ResponseHeader"] = 2] = "ResponseHeader";
    /**
     * A download progress event was received.
     */
    HttpEventType[HttpEventType["DownloadProgress"] = 3] = "DownloadProgress";
    /**
     * The full response including the body was received.
     */
    HttpEventType[HttpEventType["Response"] = 4] = "Response";
    /**
     * A custom event from an interceptor or a backend.
     */
    HttpEventType[HttpEventType["User"] = 5] = "User";
})(HttpEventType || (HttpEventType = {}));
/**
 * Base class for both `HttpResponse` and `HttpHeaderResponse`.
 *
 * @publicApi
 */
class HttpResponseBase {
    /**
     * All response headers.
     */
    headers;
    /**
     * Response status code.
     */
    status;
    /**
     * Textual description of response status code, defaults to OK.
     *
     * Do not depend on this.
     */
    statusText;
    /**
     * URL of the resource retrieved, or null if not available.
     */
    url;
    /**
     * Whether the status code falls in the 2xx range.
     */
    ok;
    /**
     * Type of the response, narrowed to either the full response or the header.
     */
    type;
    /**
     * Super-constructor for all responses.
     *
     * The single parameter accepted is an initialization hash. Any properties
     * of the response passed there will override the default values.
     */
    constructor(init, defaultStatus = 200, defaultStatusText = 'OK') {
        // If the hash has values passed, use them to initialize the response.
        // Otherwise use the default values.
        this.headers = init.headers || new HttpHeaders();
        this.status = init.status !== undefined ? init.status : defaultStatus;
        this.statusText = init.statusText || defaultStatusText;
        this.url = init.url || null;
        // Cache the ok value to avoid defining a getter.
        this.ok = this.status >= 200 && this.status < 300;
    }
}
/**
 * A partial HTTP response which only includes the status and header data,
 * but no response body.
 *
 * `HttpHeaderResponse` is a `HttpEvent` available on the response
 * event stream, only when progress events are requested.
 *
 * @publicApi
 */
class HttpHeaderResponse extends HttpResponseBase {
    /**
     * Create a new `HttpHeaderResponse` with the given parameters.
     */
    constructor(init = {}) {
        super(init);
    }
    type = HttpEventType.ResponseHeader;
    /**
     * Copy this `HttpHeaderResponse`, overriding its contents with the
     * given parameter hash.
     */
    clone(update = {}) {
        // Perform a straightforward initialization of the new HttpHeaderResponse,
        // overriding the current parameters with new ones if given.
        return new HttpHeaderResponse({
            headers: update.headers || this.headers,
            status: update.status !== undefined ? update.status : this.status,
            statusText: update.statusText || this.statusText,
            url: update.url || this.url || undefined,
        });
    }
}
/**
 * A full HTTP response, including a typed response body (which may be `null`
 * if one was not returned).
 *
 * `HttpResponse` is a `HttpEvent` available on the response event
 * stream.
 *
 * @publicApi
 */
class HttpResponse extends HttpResponseBase {
    /**
     * The response body, or `null` if one was not returned.
     */
    body;
    /**
     * Construct a new `HttpResponse`.
     */
    constructor(init = {}) {
        super(init);
        this.body = init.body !== undefined ? init.body : null;
    }
    type = HttpEventType.Response;
    clone(update = {}) {
        return new HttpResponse({
            body: update.body !== undefined ? update.body : this.body,
            headers: update.headers || this.headers,
            status: update.status !== undefined ? update.status : this.status,
            statusText: update.statusText || this.statusText,
            url: update.url || this.url || undefined,
        });
    }
}
/**
 * A response that represents an error or failure, either from a
 * non-successful HTTP status, an error while executing the request,
 * or some other failure which occurred during the parsing of the response.
 *
 * Any error returned on the `Observable` response stream will be
 * wrapped in an `HttpErrorResponse` to provide additional context about
 * the state of the HTTP layer when the error occurred. The error property
 * will contain either a wrapped Error object or the error response returned
 * from the server.
 *
 * @publicApi
 */
class HttpErrorResponse extends HttpResponseBase {
    name = 'HttpErrorResponse';
    message;
    error;
    /**
     * Errors are never okay, even when the status code is in the 2xx success range.
     */
    ok = false;
    constructor(init) {
        // Initialize with a default status of 0 / Unknown Error.
        super(init, 0, 'Unknown Error');
        // If the response was successful, then this was a parse error. Otherwise, it was
        // a protocol-level failure of some sort. Either the request failed in transit
        // or the server returned an unsuccessful status code.
        if (this.status >= 200 && this.status < 300) {
            this.message = `Http failure during parsing for ${init.url || '(unknown url)'}`;
        }
        else {
            this.message = `Http failure response for ${init.url || '(unknown url)'}: ${init.status} ${init.statusText}`;
        }
        this.error = init.error || null;
    }
}
/**
 * We use these constant to prevent pulling the whole HttpStatusCode enum
 * Those are the only ones referenced directly by the framework
 */
const HTTP_STATUS_CODE_OK = 200;
const HTTP_STATUS_CODE_NO_CONTENT = 204;
/**
 * Http status codes.
 * As per https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
 * @publicApi
 */
var HttpStatusCode;
(function (HttpStatusCode) {
    HttpStatusCode[HttpStatusCode["Continue"] = 100] = "Continue";
    HttpStatusCode[HttpStatusCode["SwitchingProtocols"] = 101] = "SwitchingProtocols";
    HttpStatusCode[HttpStatusCode["Processing"] = 102] = "Processing";
    HttpStatusCode[HttpStatusCode["EarlyHints"] = 103] = "EarlyHints";
    HttpStatusCode[HttpStatusCode["Ok"] = 200] = "Ok";
    HttpStatusCode[HttpStatusCode["Created"] = 201] = "Created";
    HttpStatusCode[HttpStatusCode["Accepted"] = 202] = "Accepted";
    HttpStatusCode[HttpStatusCode["NonAuthoritativeInformation"] = 203] = "NonAuthoritativeInformation";
    HttpStatusCode[HttpStatusCode["NoContent"] = 204] = "NoContent";
    HttpStatusCode[HttpStatusCode["ResetContent"] = 205] = "ResetContent";
    HttpStatusCode[HttpStatusCode["PartialContent"] = 206] = "PartialContent";
    HttpStatusCode[HttpStatusCode["MultiStatus"] = 207] = "MultiStatus";
    HttpStatusCode[HttpStatusCode["AlreadyReported"] = 208] = "AlreadyReported";
    HttpStatusCode[HttpStatusCode["ImUsed"] = 226] = "ImUsed";
    HttpStatusCode[HttpStatusCode["MultipleChoices"] = 300] = "MultipleChoices";
    HttpStatusCode[HttpStatusCode["MovedPermanently"] = 301] = "MovedPermanently";
    HttpStatusCode[HttpStatusCode["Found"] = 302] = "Found";
    HttpStatusCode[HttpStatusCode["SeeOther"] = 303] = "SeeOther";
    HttpStatusCode[HttpStatusCode["NotModified"] = 304] = "NotModified";
    HttpStatusCode[HttpStatusCode["UseProxy"] = 305] = "UseProxy";
    HttpStatusCode[HttpStatusCode["Unused"] = 306] = "Unused";
    HttpStatusCode[HttpStatusCode["TemporaryRedirect"] = 307] = "TemporaryRedirect";
    HttpStatusCode[HttpStatusCode["PermanentRedirect"] = 308] = "PermanentRedirect";
    HttpStatusCode[HttpStatusCode["BadRequest"] = 400] = "BadRequest";
    HttpStatusCode[HttpStatusCode["Unauthorized"] = 401] = "Unauthorized";
    HttpStatusCode[HttpStatusCode["PaymentRequired"] = 402] = "PaymentRequired";
    HttpStatusCode[HttpStatusCode["Forbidden"] = 403] = "Forbidden";
    HttpStatusCode[HttpStatusCode["NotFound"] = 404] = "NotFound";
    HttpStatusCode[HttpStatusCode["MethodNotAllowed"] = 405] = "MethodNotAllowed";
    HttpStatusCode[HttpStatusCode["NotAcceptable"] = 406] = "NotAcceptable";
    HttpStatusCode[HttpStatusCode["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
    HttpStatusCode[HttpStatusCode["RequestTimeout"] = 408] = "RequestTimeout";
    HttpStatusCode[HttpStatusCode["Conflict"] = 409] = "Conflict";
    HttpStatusCode[HttpStatusCode["Gone"] = 410] = "Gone";
    HttpStatusCode[HttpStatusCode["LengthRequired"] = 411] = "LengthRequired";
    HttpStatusCode[HttpStatusCode["PreconditionFailed"] = 412] = "PreconditionFailed";
    HttpStatusCode[HttpStatusCode["PayloadTooLarge"] = 413] = "PayloadTooLarge";
    HttpStatusCode[HttpStatusCode["UriTooLong"] = 414] = "UriTooLong";
    HttpStatusCode[HttpStatusCode["UnsupportedMediaType"] = 415] = "UnsupportedMediaType";
    HttpStatusCode[HttpStatusCode["RangeNotSatisfiable"] = 416] = "RangeNotSatisfiable";
    HttpStatusCode[HttpStatusCode["ExpectationFailed"] = 417] = "ExpectationFailed";
    HttpStatusCode[HttpStatusCode["ImATeapot"] = 418] = "ImATeapot";
    HttpStatusCode[HttpStatusCode["MisdirectedRequest"] = 421] = "MisdirectedRequest";
    HttpStatusCode[HttpStatusCode["UnprocessableEntity"] = 422] = "UnprocessableEntity";
    HttpStatusCode[HttpStatusCode["Locked"] = 423] = "Locked";
    HttpStatusCode[HttpStatusCode["FailedDependency"] = 424] = "FailedDependency";
    HttpStatusCode[HttpStatusCode["TooEarly"] = 425] = "TooEarly";
    HttpStatusCode[HttpStatusCode["UpgradeRequired"] = 426] = "UpgradeRequired";
    HttpStatusCode[HttpStatusCode["PreconditionRequired"] = 428] = "PreconditionRequired";
    HttpStatusCode[HttpStatusCode["TooManyRequests"] = 429] = "TooManyRequests";
    HttpStatusCode[HttpStatusCode["RequestHeaderFieldsTooLarge"] = 431] = "RequestHeaderFieldsTooLarge";
    HttpStatusCode[HttpStatusCode["UnavailableForLegalReasons"] = 451] = "UnavailableForLegalReasons";
    HttpStatusCode[HttpStatusCode["InternalServerError"] = 500] = "InternalServerError";
    HttpStatusCode[HttpStatusCode["NotImplemented"] = 501] = "NotImplemented";
    HttpStatusCode[HttpStatusCode["BadGateway"] = 502] = "BadGateway";
    HttpStatusCode[HttpStatusCode["ServiceUnavailable"] = 503] = "ServiceUnavailable";
    HttpStatusCode[HttpStatusCode["GatewayTimeout"] = 504] = "GatewayTimeout";
    HttpStatusCode[HttpStatusCode["HttpVersionNotSupported"] = 505] = "HttpVersionNotSupported";
    HttpStatusCode[HttpStatusCode["VariantAlsoNegotiates"] = 506] = "VariantAlsoNegotiates";
    HttpStatusCode[HttpStatusCode["InsufficientStorage"] = 507] = "InsufficientStorage";
    HttpStatusCode[HttpStatusCode["LoopDetected"] = 508] = "LoopDetected";
    HttpStatusCode[HttpStatusCode["NotExtended"] = 510] = "NotExtended";
    HttpStatusCode[HttpStatusCode["NetworkAuthenticationRequired"] = 511] = "NetworkAuthenticationRequired";
})(HttpStatusCode || (HttpStatusCode = {}));

/**
 * Constructs an instance of `HttpRequestOptions<T>` from a source `HttpMethodOptions` and
 * the given `body`. This function clones the object and adds the body.
 *
 * Note that the `responseType` *options* value is a String that identifies the
 * single data type of the response.
 * A single overload version of the method handles each response type.
 * The value of `responseType` cannot be a union, as the combined signature could imply.
 *
 */
function addBody(options, body) {
    return {
        body,
        headers: options.headers,
        context: options.context,
        observe: options.observe,
        params: options.params,
        reportProgress: options.reportProgress,
        responseType: options.responseType,
        withCredentials: options.withCredentials,
        transferCache: options.transferCache,
    };
}
/**
 * Performs HTTP requests.
 * This service is available as an injectable class, with methods to perform HTTP requests.
 * Each request method has multiple signatures, and the return type varies based on
 * the signature that is called (mainly the values of `observe` and `responseType`).
 *
 * Note that the `responseType` *options* value is a String that identifies the
 * single data type of the response.
 * A single overload version of the method handles each response type.
 * The value of `responseType` cannot be a union, as the combined signature could imply.
 *
 * @usageNotes
 *
 * ### HTTP Request Example
 *
 * ```ts
 *  // GET heroes whose name contains search term
 * searchHeroes(term: string): observable<Hero[]>{
 *
 *  const params = new HttpParams({fromString: 'name=term'});
 *    return this.httpClient.request('GET', this.heroesUrl, {responseType:'json', params});
 * }
 * ```
 *
 * Alternatively, the parameter string can be used without invoking HttpParams
 * by directly joining to the URL.
 * ```ts
 * this.httpClient.request('GET', this.heroesUrl + '?' + 'name=term', {responseType:'json'});
 * ```
 *
 *
 * ### JSONP Example
 * ```ts
 * requestJsonp(url, callback = 'callback') {
 *  return this.httpClient.jsonp(this.heroesURL, callback);
 * }
 * ```
 *
 * ### PATCH Example
 * ```ts
 * // PATCH one of the heroes' name
 * patchHero (id: number, heroName: string): Observable<{}> {
 * const url = `${this.heroesUrl}/${id}`;   // PATCH api/heroes/42
 *  return this.httpClient.patch(url, {name: heroName}, httpOptions)
 *    .pipe(catchError(this.handleError('patchHero')));
 * }
 * ```
 *
 * @see [HTTP Guide](guide/http)
 * @see [HTTP Request](api/common/http/HttpRequest)
 *
 * @publicApi
 */
class HttpClient {
    handler;
    constructor(handler) {
        this.handler = handler;
    }
    /**
     * Constructs an observable for a generic HTTP request that, when subscribed,
     * fires the request through the chain of registered interceptors and on to the
     * server.
     *
     * You can pass an `HttpRequest` directly as the only parameter. In this case,
     * the call returns an observable of the raw `HttpEvent` stream.
     *
     * Alternatively you can pass an HTTP method as the first parameter,
     * a URL string as the second, and an options hash containing the request body as the third.
     * See `addBody()`. In this case, the specified `responseType` and `observe` options determine the
     * type of returned observable.
     *   * The `responseType` value determines how a successful response body is parsed.
     *   * If `responseType` is the default `json`, you can pass a type interface for the resulting
     * object as a type parameter to the call.
     *
     * The `observe` value determines the return type, according to what you are interested in
     * observing.
     *   * An `observe` value of events returns an observable of the raw `HttpEvent` stream, including
     * progress events by default.
     *   * An `observe` value of response returns an observable of `HttpResponse<T>`,
     * where the `T` parameter depends on the `responseType` and any optionally provided type
     * parameter.
     *   * An `observe` value of body returns an observable of `<T>` with the same `T` body type.
     *
     */
    request(first, url, options = {}) {
        let req;
        // First, check whether the primary argument is an instance of `HttpRequest`.
        if (first instanceof HttpRequest) {
            // It is. The other arguments must be undefined (per the signatures) and can be
            // ignored.
            req = first;
        }
        else {
            // It's a string, so it represents a URL. Construct a request based on it,
            // and incorporate the remaining arguments (assuming `GET` unless a method is
            // provided.
            // Figure out the headers.
            let headers = undefined;
            if (options.headers instanceof HttpHeaders) {
                headers = options.headers;
            }
            else {
                headers = new HttpHeaders(options.headers);
            }
            // Sort out parameters.
            let params = undefined;
            if (!!options.params) {
                if (options.params instanceof HttpParams) {
                    params = options.params;
                }
                else {
                    params = new HttpParams({ fromObject: options.params });
                }
            }
            // Construct the request.
            req = new HttpRequest(first, url, options.body !== undefined ? options.body : null, {
                headers,
                context: options.context,
                params,
                reportProgress: options.reportProgress,
                // By default, JSON is assumed to be returned for all calls.
                responseType: options.responseType || 'json',
                withCredentials: options.withCredentials,
                transferCache: options.transferCache,
            });
        }
        // Start with an Observable.of() the initial request, and run the handler (which
        // includes all interceptors) inside a concatMap(). This way, the handler runs
        // inside an Observable chain, which causes interceptors to be re-run on every
        // subscription (this also makes retries re-run the handler, including interceptors).
        const events$ = of(req).pipe(concatMap((req) => this.handler.handle(req)));
        // If coming via the API signature which accepts a previously constructed HttpRequest,
        // the only option is to get the event stream. Otherwise, return the event stream if
        // that is what was requested.
        if (first instanceof HttpRequest || options.observe === 'events') {
            return events$;
        }
        // The requested stream contains either the full response or the body. In either
        // case, the first step is to filter the event stream to extract a stream of
        // responses(s).
        const res$ = (events$.pipe(filter((event) => event instanceof HttpResponse)));
        // Decide which stream to return.
        switch (options.observe || 'body') {
            case 'body':
                // The requested stream is the body. Map the response stream to the response
                // body. This could be done more simply, but a misbehaving interceptor might
                // transform the response body into a different format and ignore the requested
                // responseType. Guard against this by validating that the response is of the
                // requested type.
                switch (req.responseType) {
                    case 'arraybuffer':
                        return res$.pipe(map((res) => {
                            // Validate that the body is an ArrayBuffer.
                            if (res.body !== null && !(res.body instanceof ArrayBuffer)) {
                                throw new _RuntimeError(2806 /* RuntimeErrorCode.RESPONSE_IS_NOT_AN_ARRAY_BUFFER */, ngDevMode && 'Response is not an ArrayBuffer.');
                            }
                            return res.body;
                        }));
                    case 'blob':
                        return res$.pipe(map((res) => {
                            // Validate that the body is a Blob.
                            if (res.body !== null && !(res.body instanceof Blob)) {
                                throw new _RuntimeError(2807 /* RuntimeErrorCode.RESPONSE_IS_NOT_A_BLOB */, ngDevMode && 'Response is not a Blob.');
                            }
                            return res.body;
                        }));
                    case 'text':
                        return res$.pipe(map((res) => {
                            // Validate that the body is a string.
                            if (res.body !== null && typeof res.body !== 'string') {
                                throw new _RuntimeError(2808 /* RuntimeErrorCode.RESPONSE_IS_NOT_A_STRING */, ngDevMode && 'Response is not a string.');
                            }
                            return res.body;
                        }));
                    case 'json':
                    default:
                        // No validation needed for JSON responses, as they can be of any type.
                        return res$.pipe(map((res) => res.body));
                }
            case 'response':
                // The response stream was requested directly, so return it.
                return res$;
            default:
                // Guard against new future observe types being added.
                throw new _RuntimeError(2809 /* RuntimeErrorCode.UNHANDLED_OBSERVE_TYPE */, ngDevMode && `Unreachable: unhandled observe type ${options.observe}}`);
        }
    }
    /**
     * Constructs an observable that, when subscribed, causes the configured
     * `DELETE` request to execute on the server. See the individual overloads for
     * details on the return type.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     */
    delete(url, options = {}) {
        return this.request('DELETE', url, options);
    }
    /**
     * Constructs an observable that, when subscribed, causes the configured
     * `GET` request to execute on the server. See the individual overloads for
     * details on the return type.
     */
    get(url, options = {}) {
        return this.request('GET', url, options);
    }
    /**
     * Constructs an observable that, when subscribed, causes the configured
     * `HEAD` request to execute on the server. The `HEAD` method returns
     * meta information about the resource without transferring the
     * resource itself. See the individual overloads for
     * details on the return type.
     */
    head(url, options = {}) {
        return this.request('HEAD', url, options);
    }
    /**
     * Constructs an `Observable` that, when subscribed, causes a request with the special method
     * `JSONP` to be dispatched via the interceptor pipeline.
     * The [JSONP pattern](https://en.wikipedia.org/wiki/JSONP) works around limitations of certain
     * API endpoints that don't support newer,
     * and preferable [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) protocol.
     * JSONP treats the endpoint API as a JavaScript file and tricks the browser to process the
     * requests even if the API endpoint is not located on the same domain (origin) as the client-side
     * application making the request.
     * The endpoint API must support JSONP callback for JSONP requests to work.
     * The resource API returns the JSON response wrapped in a callback function.
     * You can pass the callback function name as one of the query parameters.
     * Note that JSONP requests can only be used with `GET` requests.
     *
     * @param url The resource URL.
     * @param callbackParam The callback function name.
     *
     */
    jsonp(url, callbackParam) {
        return this.request('JSONP', url, {
            params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),
            observe: 'body',
            responseType: 'json',
        });
    }
    /**
     * Constructs an `Observable` that, when subscribed, causes the configured
     * `OPTIONS` request to execute on the server. This method allows the client
     * to determine the supported HTTP methods and other capabilities of an endpoint,
     * without implying a resource action. See the individual overloads for
     * details on the return type.
     */
    options(url, options = {}) {
        return this.request('OPTIONS', url, options);
    }
    /**
     * Constructs an observable that, when subscribed, causes the configured
     * `PATCH` request to execute on the server. See the individual overloads for
     * details on the return type.
     */
    patch(url, body, options = {}) {
        return this.request('PATCH', url, addBody(options, body));
    }
    /**
     * Constructs an observable that, when subscribed, causes the configured
     * `POST` request to execute on the server. The server responds with the location of
     * the replaced resource. See the individual overloads for
     * details on the return type.
     */
    post(url, body, options = {}) {
        return this.request('POST', url, addBody(options, body));
    }
    /**
     * Constructs an observable that, when subscribed, causes the configured
     * `PUT` request to execute on the server. The `PUT` method replaces an existing resource
     * with a new set of values.
     * See the individual overloads for details on the return type.
     */
    put(url, body, options = {}) {
        return this.request('PUT', url, addBody(options, body));
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClient, deps: [{ token: HttpHandler }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClient });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClient, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: HttpHandler }] });

const XSSI_PREFIX$1 = /^\)\]\}',?\n/;
/**
 * Determine an appropriate URL for the response, by checking either
 * response url or the X-Request-URL header.
 */
function getResponseUrl$1(response) {
    if (response.url) {
        return response.url;
    }
    // stored as lowercase in the map
    const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase();
    return response.headers.get(xRequestUrl);
}
/**
 * An internal injection token to reference `FetchBackend` implementation
 * in a tree-shakable way.
 */
const FETCH_BACKEND = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'FETCH_BACKEND' : '');
/**
 * Uses `fetch` to send requests to a backend server.
 *
 * This `FetchBackend` requires the support of the
 * [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) which is available on all
 * supported browsers and on Node.js v18 or later.
 *
 * @see {@link HttpHandler}
 *
 * @publicApi
 */
class FetchBackend {
    // We use an arrow function to always reference the current global implementation of `fetch`.
    // This is helpful for cases when the global `fetch` implementation is modified by external code,
    // see https://github.com/angular/angular/issues/57527.
    fetchImpl = inject(FetchFactory, { optional: true })?.fetch ?? ((...args) => globalThis.fetch(...args));
    ngZone = inject(NgZone);
    destroyRef = inject(DestroyRef);
    destroyed = false;
    constructor() {
        this.destroyRef.onDestroy(() => {
            this.destroyed = true;
        });
    }
    handle(request) {
        return new Observable((observer) => {
            const aborter = new AbortController();
            this.doRequest(request, aborter.signal, observer).then(noop, (error) => observer.error(new HttpErrorResponse({ error })));
            return () => aborter.abort();
        });
    }
    async doRequest(request, signal, observer) {
        const init = this.createRequestInit(request);
        let response;
        try {
            // Run fetch outside of Angular zone.
            // This is due to Node.js fetch implementation (Undici) which uses a number of setTimeouts to check if
            // the response should eventually timeout which causes extra CD cycles every 500ms
            const fetchPromise = this.ngZone.runOutsideAngular(() => this.fetchImpl(request.urlWithParams, { signal, ...init }));
            // Make sure Zone.js doesn't trigger false-positive unhandled promise
            // error in case the Promise is rejected synchronously. See function
            // description for additional information.
            silenceSuperfluousUnhandledPromiseRejection(fetchPromise);
            // Send the `Sent` event before awaiting the response.
            observer.next({ type: HttpEventType.Sent });
            response = await fetchPromise;
        }
        catch (error) {
            observer.error(new HttpErrorResponse({
                error,
                status: error.status ?? 0,
                statusText: error.statusText,
                url: request.urlWithParams,
                headers: error.headers,
            }));
            return;
        }
        const headers = new HttpHeaders(response.headers);
        const statusText = response.statusText;
        const url = getResponseUrl$1(response) ?? request.urlWithParams;
        let status = response.status;
        let body = null;
        if (request.reportProgress) {
            observer.next(new HttpHeaderResponse({ headers, status, statusText, url }));
        }
        if (response.body) {
            // Read Progress
            const contentLength = response.headers.get('content-length');
            const chunks = [];
            const reader = response.body.getReader();
            let receivedLength = 0;
            let decoder;
            let partialText;
            // We have to check whether the Zone is defined in the global scope because this may be called
            // when the zone is nooped.
            const reqZone = typeof Zone !== 'undefined' && Zone.current;
            let canceled = false;
            // Perform response processing outside of Angular zone to
            // ensure no excessive change detection runs are executed
            // Here calling the async ReadableStreamDefaultReader.read() is responsible for triggering CD
            await this.ngZone.runOutsideAngular(async () => {
                while (true) {
                    // Prevent reading chunks if the app is destroyed. Otherwise, we risk doing
                    // unnecessary work or triggering side effects after teardown.
                    // This may happen if the app was explicitly destroyed before
          $          // the response returned entirely.
                    if (this.destroyed) {
                        // Streams left in a pending state (due to `break` without cancel) may
                        // continue consuming or holding onto data behind the scenes.
                        // Calling `reader.cancel()` allows the browser or the underlying
                        // system to release any network or memory resources associated with the stream.
                        await reader.cancel();
                        canceled = true;
                        break;
                    }
                    const { done, value } = await reader.read();
                    if (done) {
                        break;
                    }
                    chunks.push(value);
                    receivedLength += value.length;
                    if (request.reportProgress) {
                        partialText =
                            request.responseType === 'text'
                                ? (partialText ?? '') +
                                    (decoder ??= new TextDecoder()).decode(value, { stream: true })
                                : undefined;
                        const reportProgress = () => observer.next({
                            type: HttpEventType.DownloadProgress,
                            total: contentLength ? +contentLength : undefined,
                            loaded: receivedLength,
                            partialText,
                        });
                        reqZone ? reqZone.run(reportProgress) : reportProgress();
                    }
                }
            });
            // We need to manage the canceled state — because the Streams API does not
            // expose a direct `.state` property on the reader.
            // We need to `return` because `parseBody` may not be able to parse chunks
            // that were only partially read (due to cancellation caused by app destruction).
            if (canceled) {
                observer.complete();
                return;
            }
            // Combine all chunks.
            const chunksAll = this.concatChunks(chunks, receivedLength);
            try {
                const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? '';
                body = this.parseBody(request, chunksAll, contentType);
            }
            catch (error) {
                // Body loading or parsing failed
                observer.error(new HttpErrorResponse({
                    error,
                    headers: new HttpHeaders(response.headers),
                    status: response.status,
                    statusText: response.statusText,
                    url: getResponseUrl$1(response) ?? request.urlWithParams,
                }));
                return;
            }
        }
        // Same behavior as the XhrBackend
        if (status === 0) {
            status = body ? HTTP_STATUS_CODE_OK : 0;
        }
        // ok determines whether the response will be transmitted on the event or
        // error channel. Unsuccessful status codes (not 2xx) will always be errors,
        // but a successful status code can still result in an error if the user
        // asked for JSON data and the body cannot be parsed as such.
        const ok = status >= 200 && status < 300;
        if (ok) {
            observer.next(new HttpResponse({
                body,
                headers,
                status,
                statusText,
                url,
            }));
            // The full body has been received and delivered, no further events
            // are possible. This request is complete.
            observer.complete();
        }
        else {
            observer.error(new HttpErrorResponse({
                error: body,
                headers,
                status,
                statusText,
                url,
            }));
        }
    }
    parseBody(request, binContent, contentType) {
        switch (request.responseType) {
            case 'json':
                // stripping the XSSI when present
                const text = new TextDecoder().decode(binContent).replace(XSSI_PREFIX$1, '');
                return text === '' ? null : JSON.parse(text);
            case 'text':
                return new TextDecoder().decode(binContent);
            case 'blob':
                return new Blob([binContent], { type: contentType });
            case 'arraybuffer':
                return binContent.buffer;
        }
    }
    createRequestInit(req) {
        // We could share some of this logic with the XhrBackend
        const headers = {};
        const credentials = req.withCredentials ? 'include' : undefined;
        // Setting all the requested headers.
        req.headers.forEach((name, values) => (headers[name] = values.join(',')));
        // Add an Accept header if one isn't present already.
        if (!req.headers.has(ACCEPT_HEADER)) {
            headers[ACCEPT_HEADER] = ACCEPT_HEADER_VALUE;
        }
        // Auto-detect the Content-Type header if one isn't present already.
        if (!req.headers.has(CONTENT_TYPE_HEADER)) {
            const detectedType = req.detectContentTypeHeader();
            // Sometimes Content-Type detection fails.
            if (detectedType !== null) {
                headers[CONTENT_TYPE_HEADER] = detectedType;
            }
        }
        return {
            body: req.serializeBody(),
            method: req.method,
            headers,
            credentials,
        };
    }
    concatChunks(chunks, totalLength) {
        const chunksAll = new Uint8Array(totalLength);
        let position = 0;
        for (const chunk of chunks) {
            chunksAll.set(chunk, position);
            position += chunk.length;
        }
        return chunksAll;
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FetchBackend, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FetchBackend });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FetchBackend, decorators: [{
            type: Injectable
        }], ctorParameters: () => [] });
/**
 * Abstract class to provide a mocked implementation of `fetch()`
 */
class FetchFactory {
}
function noop() { }
/**
 * Zone.js treats a rejected promise that has not yet been awaited
 * as an unhandled error. This function adds a noop `.then` to make
 * sure that Zone.js doesn't throw an error if the Promise is rejected
 * synchronously.
 */
function silenceSuperfluousUnhandledPromiseRejection(promise) {
    promise.then(noop, noop);
}

function interceptorChainEndFn(req, finalHandlerFn) {
    return finalHandlerFn(req);
}
/**
 * Constructs a `ChainedInterceptorFn` which adapts a legacy `HttpInterceptor` to the
 * `ChainedInterceptorFn` interface.
 */
function adaptLegacyInterceptorToChain(chainTailFn, interceptor) {
    return (initialRequest, finalHandlerFn) => interceptor.intercept(initialRequest, {
        handle: (downstreamRequest) => chainTailFn(downstreamRequest, finalHandlerFn),
    });
}
/**
 * Constructs a `ChainedInterceptorFn` which wraps and invokes a functional interceptor in the given
 * injector.
 */
function chainedInterceptorFn(chainTailFn, interceptorFn, injector) {
    return (initialRequest, finalHandlerFn) => runInInjectionContext(injector, () => interceptorFn(initialRequest, (downstreamRequest) => chainTailFn(downstreamRequest, finalHandlerFn)));
}
/**
 * A multi-provider token that represents the array of registered
 * `HttpInterceptor` objects.
 *
 * @publicApi
 */
const HTTP_INTERCEPTORS = new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTORS' : '');
/**
 * A multi-provided token of `HttpInterceptorFn`s.
 */
const HTTP_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTOR_FNS' : '');
/**
 * A multi-provided token of `HttpInterceptorFn`s that are only set in root.
 */
const HTTP_ROOT_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? 'HTTP_ROOT_INTERCEPTOR_FNS' : '');
// TODO(atscott): We need a larger discussion about stability and what should contribute to stability.
// Should the whole interceptor chain contribute to stability or just the backend request #55075?
// Should HttpClient contribute to stability automatically at all?
const REQUESTS_CONTRIBUTE_TO_STABILITY = new InjectionToken(ngDevMode ? 'REQUESTS_CONTRIBUTE_TO_STABILITY' : '', { providedIn: 'root', factory: () => true });
/**
 * Creates an `HttpInterceptorFn` which lazily initializes an interceptor chain from the legacy
 * class-based interceptors and runs the request through it.
 */
function legacyInterceptorFnFactory() {
    let chain = null;
    return (req, handler) => {
        if (chain === null) {
            const interceptors = inject(HTTP_INTERCEPTORS, { optional: true }) ?? [];
            // Note: interceptors are wrapped right-to-left so that final execution order is
            // left-to-right. That is, if `interceptors` is the array `[a, b, c]`, we want to
            // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside
            // out.
            chain = interceptors.reduceRight(adaptLegacyInterceptorToChain, interceptorChainEndFn);
        }
        const pendingTasks = inject(_PendingTasksInternal);
        const contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);
        if (contributeToStability) {
            const taskId = pendingTasks.add();
            return chain(req, handler).pipe(finalize(() => pendingTasks.remove(taskId)));
        }
        else {
            return chain(req, handler);
        }
    };
}
let fetchBackendWarningDisplayed = false;
class HttpInterceptorHandler extends HttpHandler {
    backend;
    injector;
    chain = null;
    pendingTasks = inject(_PendingTasksInternal);
    contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);
    constructor(backend, injector) {
        super();
        this.backend = backend;
        this.injector = injector;
        // We strongly recommend using fetch backend for HTTP calls when SSR is used
        // for an application. The logic below checks if that's the case and produces
        // a warning otherwise.
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && !fetchBackendWarningDisplayed) {
            const isServer = isPlatformServer(injector.get(PLATFORM_ID));
            // This flag is necessary because provideHttpClientTesting() overrides the backend
            // even if `withFetch()` is used within the test. When the testing HTTP backend is provided,
            // no HTTP calls are actually performed during the test, so producing a warning would be
            // misleading.
            const isTestingBackend = this.backend.isTestingBackend;
            if (isServer && !(this.backend instanceof FetchBackend) && !isTestingBackend) {
                fetchBackendWarningDisplayed = true;
                injector
                    .get(_Console)
                    .warn(_formatRuntimeError(2801 /* RuntimeErrorCode.NOT_USING_FETCH_BACKEND_IN_SSR */, 'Angular detected that `HttpClient` is not configured ' +
                    "to use `fetch` APIs. It's strongly recommended to " +
                    'enable `fetch` for applications that use Server-Side Rendering ' +
                    'for better performance and compatibility. ' +
                    'To enable `fetch`, add the `withFetch()` to the `provideHttpClient()` ' +
                    'call at the root of the application.'));
            }
        }
    }
    handle(initialRequest) {
        if (this.chain === null) {
            const dedupedInterceptorFns = Array.from(new Set([
                ...this.injector.get(HTTP_INTERCEPTOR_FNS),
                ...this.injector.get(HTTP_ROOT_INTERCEPTOR_FNS, []),
            ]));
            // Note: interceptors are wrapped right-to-left so that final execution order is
            // left-to-right. That is, if `dedupedInterceptorFns` is the array `[a, b, c]`, we want to
            // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside
            // out.
            this.chain = dedupedInterceptorFns.reduceRight((nextSequencedFn, interceptorFn) => chainedInterceptorFn(nextSequencedFn, interceptorFn, this.injector), interceptorChainEndFn);
        }
        if (this.contributeToStability) {
            const taskId = this.pendingTasks.add();
            return this.chain(initialRequest, (downstreamRequest) => this.backend.handle(downstreamRequest)).pipe(finalize(() => this.pendingTasks.remove(taskId)));
        }
        else {
            return this.chain(initialRequest, (downstreamRequest) => this.backend.handle(downstreamRequest));
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpInterceptorHandler, deps: [{ token: HttpBackend }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpInterceptorHandler });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpInterceptorHandler, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: HttpBackend }, { type: i0.EnvironmentInjector }] });

// Every request made through JSONP needs a callback name that's unique across the
// whole page. Each request is assigned an id and the callback name is constructed
// from that. The next id to be assigned is tracked in a global variable here that
// is shared among all applications on the page.
let nextRequestId = 0;
/**
 * When a pending <script> is unsubscribed we'll move it to this document, so it won't be
 * executed.
 */
let foreignDocument;
// Error text given when a JSONP script is injected, but doesn't invoke the callback
// passed in its URL.
const JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';
// Error text given when a request is passed to the JsonpClientBackend that doesn't
// have a request method JSONP.
const JSONP_ERR_WRONG_METHOD = 'JSONP requests must use JSONP request method.';
const JSONP_ERR_WRONG_RESPONSE_TYPE = 'JSONP requests must use Json response type.';
// Error text given when a request is passed to the JsonpClientBackend that has
// headers set
const JSONP_ERR_HEADERS_NOT_SUPPORTED = 'JSONP requests do not support headers.';
/**
 * DI token/abstract type representing a map of JSONP callbacks.
 *
 * In the browser, this should always be the `window` object.
 *
 *
 */
class JsonpCallbackContext {
}
/**
 * Factory function that determines where to store JSONP callbacks.
 *
 * Ordinarily JSONP callbacks are stored on the `window` object, but this may not exist
 * in test environments. In that case, callbacks are stored on an anonymous object instead.
 *
 *
 */
function jsonpCallbackContext() {
    if (typeof window === 'object') {
        return window;
    }
    return {};
}
/**
 * Processes an `HttpRequest` with the JSONP method,
 * by performing JSONP style requests.
 * @see {@link HttpHandler}
 * @see {@link HttpXhrBackend}
 *
 * @publicApi
 */
class JsonpClientBackend {
    callbackMap;
    document;
    /**
     * A resolved promise that can be used to schedule microtasks in the event handlers.
     */
    resolvedPromise = Promise.resolve();
    constructor(callbackMap, document) {
        this.callbackMap = callbackMap;
        this.document = document;
    }
    /**
     * Get the name of the next callback method, by incrementing the global `nextRequestId`.
     */
    nextCallback() {
        return `ng_jsonp_callback_${nextRequestId++}`;
    }
    /**
     * Processes a JSONP request and returns an event stream of the results.
     * @param req The request object.
     * @returns An observable of the response events.
     *
     */
    handle(req) {
        // Firstly, check both the method and response type. If either doesn't match
        // then the request was improperly routed here and cannot be handled.
        if (req.method !== 'JSONP') {
            throw new Error(JSONP_ERR_WRONG_METHOD);
        }
        else if (req.responseType !== 'json') {
            throw new Error(JSONP_ERR_WRONG_RESPONSE_TYPE);
        }
        // Check the request headers. JSONP doesn't support headers and
        // cannot set any that were supplied.
        if (req.headers.keys().length > 0) {
            throw new Error(JSONP_ERR_HEADERS_NOT_SUPPORTED);
        }
        // Everything else happens inside the Observable boundary.
        return new Observable((observer) => {
            // The first step to make a request is to generate the callback name, and replace the
            // callback placeholder in the URL with the name. Care has to be taken here to ensure
            // a trailing &, if matched, gets inserted back into the URL in the correct place.
            const callback = this.nextCallback();
            const url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, `=${callback}$1`);
            // Construct the <script> tag and point it at the URL.
            const node = this.document.createElement('script');
            node.src = url;
            // A JSONP request requires waiting for multiple callbacks. These variables
            // are closed over and track state across those callbacks.
            // The response object, if one has been received, or null otherwise.
            let body = null;
            // Whether the response callback has been called.
            let finished = false;
            // Set the response callback in this.callbackMap (which will be the window
            // object in the browser. The script being loaded via the <script> tag will
            // eventually call this callback.
            this.callbackMap[callback] = (data) => {
                // Data has been received from the JSONP script. Firstly, delete this callback.
                delete this.callbackMap[callback];
                // Set state to indicate data was received.
                body = data;
                finished = true;
            };
            // cleanup() is a utility closure that removes the <script> from the page and
            // the response callback from the window. This logic is used in both the
            // success, error, and cancellation paths, so it's extracted out for convenience.
            const cleanup = () => {
                node.removeEventListener('load', onLoad);
                node.removeEventListener('error', onError);
                // Remove the <script> tag if it's still on the page.
                node.remove();
                // Remove the response callback from the callbackMap (window object in the
                // browser).
                delete this.callbackMap[callback];
            };
            // onLoad() is the success callback which runs after the response callback
            // if the JSONP script loads successfully. The event itself is unimportant.
            // If something went wrong, onLoad() may run without the response callback
            // having been invoked.
            const onLoad = (event) => {
                // We wrap it in an extra Promise, to ensure the microtask
                // is scheduled after the loaded endpoint has executed any potential microtask itself,
                // which is not guaranteed in Internet Explorer and EdgeHTML. See issue #39496
                this.resolvedPromise.then(() => {
                    // Cleanup the page.
                    cleanup();
                    // Check whether the response callback has run.
                    if (!finished) {
                        // It hasn't, something went wrong with the request. Return an error via
                        // the Observable error path. All JSONP errors have status 0.
                        observer.error(new HttpErrorResponse({
                            url,
                            status: 0,
                            statusText: 'JSONP Error',
                            error: new Error(JSONP_ERR_NO_CALLBACK),
                        }));
                        return;
                    }
                    // Success. body either contains the response body or null if none was
                    // returned.
                    observer.next(new HttpResponse({
                        body,
                        status: HTTP_STATUS_CODE_OK,
                        statusText: 'OK',
                        url,
                    }));
                    // Complete the stream, the response is over.
                    observer.complete();
                });
            };
            // onError() is the error callback, which runs if the script returned generates
            // a Javascript error. It emits the error via the Observable error channel as
            // a HttpErrorResponse.
            const onError = (error) => {
                cleanup();
                // Wrap the error in a HttpErrorResponse.
                observer.error(new HttpErrorResponse({
                    error,
                    status: 0,
                    statusText: 'JSONP Error',
                    url,
                }));
            };
            // Subscribe to both the success (load) and error events on the <script> tag,
            // and add it to the page.
            node.addEventListener('load', onLoad);
            node.addEventListener('error', onError);
            this.document.body.appendChild(node);
            // The request has now been successfully sent.
            observer.next({ type: HttpEventType.Sent });
            // Cancellation handler.
            return () => {
                if (!finished) {
                    this.removeListeners(node);
                }
                // And finally, clean up the page.
                cleanup();
            };
        });
    }
    removeListeners(script) {
        // Issue #34818
        // Changing <script>'s ownerDocument will prevent it from execution.
        // https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block
        foreignDocument ??= this.document.implementation.createHTMLDocument();
        foreignDocument.adoptNode(script);
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonpClientBackend, deps: [{ token: JsonpCallbackContext }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonpClientBackend });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonpClientBackend, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: JsonpCallbackContext }, { type: undefined, decorators: [{
                    type: Inject,
                    args: [DOCUMENT]
                }] }] });
/**
 * Identifies requests with the method JSONP and shifts them to the `JsonpClientBackend`.
 */
function jsonpInterceptorFn(req, next) {
    if (req.method === 'JSONP') {
        return inject(JsonpClientBackend).handle(req);
    }
    // Fall through for normal HTTP requests.
    return next(req);
}
/**
 * Identifies requests with the method JSONP and
 * shifts them to the `JsonpClientBackend`.
 *
 * @see {@link HttpInterceptor}
 *
 * @publicApi
 */
class JsonpInterceptor {
    injector;
    constructor(injector) {
        this.injector = injector;
    }
    /**
     * Identifies and handles a given JSONP request.
     * @param initialRequest The outgoing request object to handle.
     * @param next The next interceptor in the chain, or the backend
     * if no interceptors remain in the chain.
     * @returns An observable of the event stream.
     */
    intercept(initialRequest, next) {
        return runInInjectionContext(this.injector, () => jsonpInterceptorFn(initialRequest, (downstreamRequest) => next.handle(downstreamRequest)));
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonpInterceptor, deps: [{ token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonpInterceptor });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonpInterceptor, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: i0.EnvironmentInjector }] });

const XSSI_PREFIX = /^\)\]\}',?\n/;
const X_REQUEST_URL_REGEXP = RegExp(`^${X_REQUEST_URL_HEADER}:`, 'm');
/**
 * Determine an appropriate URL for the response, by checking either
 * XMLHttpRequest.responseURL or the X-Request-URL header.
 */
function getResponseUrl(xhr) {
    if ('responseURL' in xhr && xhr.responseURL) {
        return xhr.responseURL;
    }
    if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) {
        return xhr.getResponseHeader(X_REQUEST_URL_HEADER);
    }
    return null;
}
/**
 * Uses `XMLHttpRequest` to send requests to a backend server.
 * @see {@link HttpHandler}
 * @see {@link JsonpClientBackend}
 *
 * @publicApi
 */
class HttpXhrBackend {
    xhrFactory;
    constructor(xhrFactory) {
        this.xhrFactory = xhrFactory;
    }
    /**
     * Processes a request and returns a stream of response events.
     * @param req The request object.
     * @returns An observable of the response events.
     */
    handle(req) {
        // Quick check to give a better error message when a user attempts to use
        // HttpClient.jsonp() without installing the HttpClientJsonpModule
        if (req.method === 'JSONP') {
            throw new _RuntimeError(-2800 /* RuntimeErrorCode.MISSING_JSONP_MODULE */, (typeof ngDevMode === 'undefined' || ngDevMode) &&
                `Cannot make a JSONP request without JSONP support. To fix the problem, either add the \`withJsonpSupport()\` call (if \`provideHttpClient()\` is used) or import the \`HttpClientJsonpModule\` in the root NgModule.`);
        }
        // Check whether this factory has a special function to load an XHR implementation
        // for various non-browser environments. We currently limit it to only `ServerXhr`
        // class, which needs to load an XHR implementation.
        const xhrFactory = this.xhrFactory;
        const source = xhrFactory.ɵloadImpl
            ? from(xhrFactory.ɵloadImpl())
            : of(null);
        return source.pipe(switchMap(() => {
            // Everything happens on Observable subscription.
            return new Observable((observer) => {
                // Start by setting up the XHR object with request method, URL, and withCredentials
                // flag.
                const xhr = xhrFactory.build();
                xhr.open(req.method, req.urlWithParams);
                if (req.withCredentials) {
                    xhr.withCredentials = true;
                }
                // Add all the requested headers.
                req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(',')));
                // Add an Accept header if one isn't present already.
                if (!req.headers.has(ACCEPT_HEADER)) {
                    xhr.setRequestHeader(ACCEPT_HEADER, ACCEPT_HEADER_VALUE);
                }
                // Auto-detect the Content-Type header if one isn't present already.
                if (!req.headers.has(CONTENT_TYPE_HEADER)) {
                    const detectedType = req.detectContentTypeHeader();
                    // Sometimes Content-Type detection fails.
                    if (detectedType !== null) {
                        xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType);
                    }
                }
                // Set the responseType if one was requested.
                if (req.responseType) {
                    const responseType = req.responseType.toLowerCase();
                    // JSON responses need to be processed as text. This is because if the server
                    // returns an XSSI-prefixed JSON response, the browser will fail to parse it,
                    // xhr.response will be null, and xhr.responseText cannot be accessed to
                    // retrieve the prefixed JSON data in order to strip the prefix. Thus, all JSON
                    // is parsed by first requesting text and then applying JSON.parse.
                    xhr.responseType = (responseType !== 'json' ? responseType : 'text');
                }
                // Serialize the request body if one is present. If not, this will be set to null.
                const reqBody = req.serializeBody();
                // If progress events are enabled, response headers will be delivered
                // in two events - the HttpHeaderResponse event and the full HttpResponse
                // event. However, since response headers don't change in between these
                // two events, it doesn't make sense to parse them twice. So headerResponse
                // caches the data extracted from the response whenever it's first parsed,
                // to ensure parsing isn't duplicated.
                let headerResponse = null;
                // partialFromXhr extracts the HttpHeaderResponse from the current XMLHttpRequest
                // state, and memoizes it into headerResponse.
                const partialFromXhr = () => {
                    if (headerResponse !== null) {
                        return headerResponse;
                    }
                    const statusText = xhr.statusText || 'OK';
                    // Parse headers from XMLHttpRequest - this step is lazy.
                    const headers = new HttpHeaders(xhr.getAllResponseHeaders());
                    // Read the response URL from the XMLHttpResponse instance and fall back on the
                    // request URL.
                    const url = getResponseUrl(xhr) || req.url;
                    // Construct the HttpHeaderResponse and memoize it.
                    headerResponse = new HttpHeaderResponse({ headers, status: xhr.status, statusText, url });
                    return headerResponse;
                };
                // Next, a few closures are defined for the various events which XMLHttpRequest can
                // emit. This allows them to be unregistered as event listeners later.
                // First up is the load event, which represents a response being fully available.
                const onLoad = () => {
                    // Read response state from the memoized partial data.
                    let { headers, status, statusText, url } = partialFromXhr();
                    // The body will be read out if present.
                    let body = null;
                    if (status !== HTTP_STATUS_CODE_NO_CONTENT) {
                        // Use XMLHttpRequest.response if set, responseText otherwise.
                        body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;
                    }
                    // Normalize another potential bug (this one comes from CORS).
                    if (status === 0) {
                        status = !!body ? HTTP_STATUS_CODE_OK : 0;
                    }
                    // ok determines whether the response will be transmitted on the event or
                    // error channel. Unsuccessful status codes (not 2xx) will always be errors,
                    // but a successful status code can still result in an error if the user
                    // asked for JSON data and the body cannot be parsed as such.
                    let ok = status >= 200 && status < 300;
                    // Check whether the body needs to be parsed as JSON (in many cases the browser
                    // will have done that already).
                    if (req.responseType === 'json' && typeof body === 'string') {
                        // Save the original body, before attempting XSSI prefix stripping.
                        const originalBody = body;
                        body = body.replace(XSSI_PREFIX, '');
                        try {
                            // Attempt the parse. If it fails, a parse error should be delivered to the
                            // user.
                            body = body !== '' ? JSON.parse(body) : null;
                        }
                        catch (error) {
                            // Since the JSON.parse failed, it's reasonable to assume this might not have
                            // been a JSON response. Restore the original body (including any XSSI prefix)
                            // to deliver a better error response.
                            body = originalBody;
                            // If this was an error request to begin with, leave it as a string, it
                            // probably just isn't JSON. Otherwise, deliver the parsing error to the user.
                            if (ok) {
                                // Even though the response status was 2xx, this is still an error.
                                ok = false;
                                // The parse error contains the text of the body that failed to parse.
                                body = { error, text: body };
                            }
                        }
                    }
                    if (ok) {
                        // A successful response is delivered on the event stream.
                        observer.next(new HttpResponse({
                            body,
                            headers,
                            status,
                            statusText,
                            url: url || undefined,
                        }));
                        // The full body has been received and delivered, no further events
                        // are possible. This request is complete.
                        observer.complete();
                    }
                    else {
                        // An unsuccessful request is delivered on the error channel.
                        observer.error(new HttpErrorResponse({
                            // The error in this case is the response body (error from the server).
                            error: body,
                            headers,
                            status,
                            statusText,
                            url: url || undefined,
                        }));
                    }
                };
                // The onError callback is called when something goes wrong at the network level.
                // Connection timeout, DNS error, offline, etc. These are actual errors, and are
                // transmitted on the error channel.
                const onError = (error) => {
                    const { url } = partialFromXhr();
                    const res = new HttpErrorResponse({
                        error,
                        status: xhr.status || 0,
                        statusText: xhr.statusText || 'Unknown Error',
                        url: url || undefined,
                    });
                    observer.error(res);
                };
                // The sentHeaders flag tracks whether the HttpResponseHeaders event
                // has been sent on the stream. This is necessary to track if progress
                // is enabled since the event will be sent on only the first download
                // progress event.
                let sentHeaders = false;
                // The download progress event handler, which is only registered if
                // progress events are enabled.
                const onDownProgress = (event) => {
                    // Send the HttpResponseHeaders event if it hasn't been sent already.
                    if (!sentHeaders) {
                        observer.next(partialFromXhr());
                        sentHeaders = true;
                    }
                    // Start building the download progress event to deliver on the response
                    // event stream.
                    let progressEvent = {
                        type: HttpEventType.DownloadProgress,
                        loaded: event.loaded,
                    };
                    // Set the total number of bytes in the event if it's available.
                    if (event.lengthComputable) {
                        progressEvent.total = event.total;
                    }
                    // If the request was for text content and a partial response is
                    // available on XMLHttpRequest, include it in the progress event
                    // to allow for streaming reads.
                    if (req.responseType === 'text' && !!xhr.responseText) {
                        progressEvent.partialText = xhr.responseText;
                    }
                    // Finally, fire the event.
                    observer.next(progressEvent);
                };
                // The upload progress event handler, which is only registered if
                // progress events are enabled.
                const onUpProgress = (event) => {
                    // Upload progress events are simpler. Begin building the progress
                    // event.
                    let progress = {
                        type: HttpEventType.UploadProgress,
                        loaded: event.loaded,
                    };
                    // If the total number of bytes being uploaded is available, include
                    // it.
                    if (event.lengthComputable) {
                        progress.total = event.total;
                    }
                    // Send the event.
                    observer.next(progress);
                };
                // By default, register for load and error events.
                xhr.addEventListener('load', onLoad);
                xhr.addEventListener('error', onError);
                xhr.addEventListener('timeout', onError);
                xhr.addEventListener('abort', onError);
                // Progress events are only enabled if requested.
                if (req.reportProgress) {
                    // Download progress is always enabled if requested.
                    xhr.addEventListener('progress', onDownProgress);
                    // Upload progress depends on whether there is a body to upload.
                    if (reqBody !== null && xhr.upload) {
                        xhr.upload.addEventListener('progress', onUpProgress);
                    }
                }
                // Fire the request, and notify the event stream that it was fired.
                xhr.send(reqBody);
                observer.next({ type: HttpEventType.Sent });
                // This is the return from the Observable function, which is the
                // request cancellation handler.
                return () => {
                    // On a cancellation, remove all registered event listeners.
                    xhr.removeEventListener('error', onError);
                    xhr.removeEventListener('abort', onError);
                    xhr.removeEventListener('load', onLoad);
                    xhr.removeEventListener('timeout', onError);
                    if (req.reportProgress) {
                        xhr.removeEventListener('progress', onDownProgress);
                        if (reqBody !== null && xhr.upload) {
                            xhr.upload.removeEventListener('progress', onUpProgress);
                        }
                    }
                    // Finally, abort the in-flight request.
                    if (xhr.readyState !== xhr.DONE) {
                        xhr.abort();
                    }
                };
            });
        }));
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXhrBackend, deps: [{ token: XhrFactory }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXhrBackend });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXhrBackend, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: XhrFactory }] });

const XSRF_ENABLED = new InjectionToken(ngDevMode ? 'XSRF_ENABLED' : '');
const XSRF_DEFAULT_COOKIE_NAME = 'XSRF-TOKEN';
const XSRF_COOKIE_NAME = new InjectionToken(ngDevMode ? 'XSRF_COOKIE_NAME' : '', {
    providedIn: 'root',
    factory: () => XSRF_DEFAULT_COOKIE_NAME,
});
const XSRF_DEFAULT_HEADER_NAME = 'X-XSRF-TOKEN';
const XSRF_HEADER_NAME = new InjectionToken(ngDevMode ? 'XSRF_HEADER_NAME' : '', {
    providedIn: 'root',
    factory: () => XSRF_DEFAULT_HEADER_NAME,
});
/**
 * Retrieves the current XSRF token to use with the next outgoing request.
 *
 * @publicApi
 */
class HttpXsrfTokenExtractor {
}
/**
 * `HttpXsrfTokenExtractor` which retrieves the token from a cookie.
 */
class HttpXsrfCookieExtractor {
    doc;
    cookieName;
    lastCookieString = '';
    lastToken = null;
    /**
     * @internal for testing
     */
    parseCount = 0;
    constructor(doc, cookieName) {
        this.doc = doc;
        this.cookieName = cookieName;
    }
    getToken() {
        if (typeof ngServerMode !== 'undefined' && ngServerMode) {
            return null;
        }
        const cookieString = this.doc.cookie || '';
        if (cookieString !== this.lastCookieString) {
            this.parseCount++;
            this.lastToken = parseCookieValue(cookieString, this.cookieName);
            this.lastCookieString = cookieString;
        }
        return this.lastToken;
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXsrfCookieExtractor, deps: [{ token: DOCUMENT }, { token: XSRF_COOKIE_NAME }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXsrfCookieExtractor });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXsrfCookieExtractor, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Inject,
                    args: [DOCUMENT]
                }] }, { type: undefined, decorators: [{
                    type: Inject,
                    args: [XSRF_COOKIE_NAME]
                }] }] });
function xsrfInterceptorFn(req, next) {
    const lcUrl = req.url.toLowerCase();
    // Skip both non-mutating requests and absolute URLs.
    // Non-mutating requests don't require a token, and absolute URLs require special handling
    // anyway as the cookie set
    // on our origin is not the same as the token expected by another origin.
    if (!inject(XSRF_ENABLED) ||
        req.method === 'GET' ||
        req.method === 'HEAD' ||
        lcUrl.startsWith('http://') ||
        lcUrl.startsWith('https://')) {
        return next(req);
    }
    const token = inject(HttpXsrfTokenExtractor).getToken();
    const headerName = inject(XSRF_HEADER_NAME);
    // Be careful not to overwrite an existing header of the same name.
    if (token != null && !req.headers.has(headerName)) {
        req = req.clone({ headers: req.headers.set(headerName, token) });
    }
    return next(req);
}
/**
 * `HttpInterceptor` which adds an XSRF token to eligible outgoing requests.
 */
class HttpXsrfInterceptor {
    injector;
    constructor(injector) {
        this.injector = injector;
    }
    intercept(initialRequest, next) {
        return runInInjectionContext(this.injector, () => xsrfInterceptorFn(initialRequest, (downstreamRequest) => next.handle(downstreamRequest)));
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXsrfInterceptor, deps: [{ token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXsrfInterceptor });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpXsrfInterceptor, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: i0.EnvironmentInjector }] });

/**
 * Identifies a particular kind of `HttpFeature`.
 *
 * @publicApi
 */
var HttpFeatureKind;
(function (HttpFeatureKind) {
    HttpFeatureKind[HttpFeatureKind["Interceptors"] = 0] = "Interceptors";
    HttpFeatureKind[HttpFeatureKind["LegacyInterceptors"] = 1] = "LegacyInterceptors";
    HttpFeatureKind[HttpFeatureKind["CustomXsrfConfiguration"] = 2] = "CustomXsrfConfiguration";
    HttpFeatureKind[HttpFeatureKind["NoXsrfProtection"] = 3] = "NoXsrfProtection";
    HttpFeatureKind[HttpFeatureKind["JsonpSupport"] = 4] = "JsonpSupport";
    HttpFeatureKind[HttpFeatureKind["RequestsMadeViaParent"] = 5] = "RequestsMadeViaParent";
    HttpFeatureKind[HttpFeatureKind["Fetch"] = 6] = "Fetch";
})(HttpFeatureKind || (HttpFeatureKind = {}));
function makeHttpFeature(kind, providers) {
    return {
        ɵkind: kind,
        ɵproviders: providers,
    };
}
/**
 * Configures Angular's `HttpClient` service to be available for injection.
 *
 * By default, `HttpClient` will be configured for injection with its default options for XSRF
 * protection of outgoing requests. Additional configuration options can be provided by passing
 * feature functions to `provideHttpClient`. For example, HTTP interceptors can be added using the
 * `withInterceptors(...)` feature.
 *
 * <div class="docs-alert docs-alert-helpful">
 *
 * It's strongly recommended to enable
 * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for applications that use
 * Server-Side Rendering for better performance and compatibility. To enable `fetch`, add
 * `withFetch()` feature to the `provideHttpClient()` call at the root of the application:
 *
 * ```ts
 * provideHttpClient(withFetch());
 * ```
 *
 * </div>
 *
 * @see {@link withInterceptors}
 * @see {@link withInterceptorsFromDi}
 * @see {@link withXsrfConfiguration}
 * @see {@link withNoXsrfProtection}
 * @see {@link withJsonpSupport}
 * @see {@link withRequestsMadeViaParent}
 * @see {@link withFetch}
 */
function provideHttpClient(...features) {
    if (ngDevMode) {
        const featureKinds = new Set(features.map((f) => f.ɵkind));
        if (featureKinds.has(HttpFeatureKind.NoXsrfProtection) &&
            featureKinds.has(HttpFeatureKind.CustomXsrfConfiguration)) {
            throw new Error(ngDevMode
                ? `Configuration error: found both withXsrfConfiguration() and withNoXsrfProtection() in the same call to provideHttpClient(), which is a contradiction.`
                : '');
        }
    }
    const providers = [
        HttpClient,
        HttpXhrBackend,
        HttpInterceptorHandler,
        { provide: HttpHandler, useExisting: HttpInterceptorHandler },
        {
            provide: HttpBackend,
            useFactory: () => {
                return inject(FETCH_BACKEND, { optional: true }) ?? inject(HttpXhrBackend);
            },
        },
        {
            provide: HTTP_INTERCEPTOR_FNS,
            useValue: xsrfInterceptorFn,
            multi: true,
        },
        { provide: XSRF_ENABLED, useValue: true },
        { provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor },
    ];
    for (const feature of features) {
        providers.push(...feature.ɵproviders);
    }
    return makeEnvironmentProviders(providers);
}
/**
 * Adds one or more functional-style HTTP interceptors to the configuration of the `HttpClient`
 * instance.
 *
 * @see {@link HttpInterceptorFn}
 * @see {@link provideHttpClient}
 * @publicApi
 */
function withInterceptors(interceptorFns) {
    return makeHttpFeature(HttpFeatureKind.Interceptors, interceptorFns.map((interceptorFn) => {
        return {
            provide: HTTP_INTERCEPTOR_FNS,
            useValue: interceptorFn,
            multi: true,
        };
    }));
}
const LEGACY_INTERCEPTOR_FN = new InjectionToken(ngDevMode ? 'LEGACY_INTERCEPTOR_FN' : '');
/**
 * Includes class-based interceptors configured using a multi-provider in the current injector into
 * the configured `HttpClient` instance.
 *
 * Prefer `withInterceptors` and functional interceptors instead, as support for DI-provided
 * interceptors may be phased out in a later release.
 *
 * @see {@link HttpInterceptor}
 * @see {@link HTTP_INTERCEPTORS}
 * @see {@link provideHttpClient}
 */
function withInterceptorsFromDi() {
    // Note: the legacy interceptor function is provided here via an intermediate token
    // (`LEGACY_INTERCEPTOR_FN`), using a pattern which guarantees that if these providers are
    // included multiple times, all of the multi-provider entries will have the same instance of the
    // interceptor function. That way, the `HttpINterceptorHandler` will dedup them and legacy
    // interceptors will not run multiple times.
    return makeHttpFeature(HttpFeatureKind.LegacyInterceptors, [
        {
            provide: LEGACY_INTERCEPTOR_FN,
            useFactory: legacyInterceptorFnFactory,
        },
        {
            provide: HTTP_INTERCEPTOR_FNS,
            useExisting: LEGACY_INTERCEPTOR_FN,
            multi: true,
        },
    ]);
}
/**
 * Customizes the XSRF protection for the configuration of the current `HttpClient` instance.
 *
 * This feature is incompatible with the `withNoXsrfProtection` feature.
 *
 * @see {@link provideHttpClient}
 */
function withXsrfConfiguration({ cookieName, headerName, }) {
    const providers = [];
    if (cookieName !== undefined) {
        providers.push({ provide: XSRF_COOKIE_NAME, useValue: cookieName });
    }
    if (headerName !== undefined) {
        providers.push({ provide: XSRF_HEADER_NAME, useValue: headerName });
    }
    return makeHttpFeature(HttpFeatureKind.CustomXsrfConfiguration, providers);
}
/**
 * Disables XSRF protection in the configuration of the current `HttpClient` instance.
 *
 * This feature is incompatible with the `withXsrfConfiguration` feature.
 *
 * @see {@link provideHttpClient}
 */
function withNoXsrfProtection() {
    return makeHttpFeature(HttpFeatureKind.NoXsrfProtection, [
        {
            provide: XSRF_ENABLED,
            useValue: false,
        },
    ]);
}
/**
 * Add JSONP support to the configuration of the current `HttpClient` instance.
 *
 * @see {@link provideHttpClient}
 */
function withJsonpSupport() {
    return makeHttpFeature(HttpFeatureKind.JsonpSupport, [
        JsonpClientBackend,
        { provide: JsonpCallbackContext, useFactory: jsonpCallbackContext },
        { provide: HTTP_INTERCEPTOR_FNS, useValue: jsonpInterceptorFn, multi: true },
    ]);
}
/**
 * Configures the current `HttpClient` instance to make requests via the parent injector's
 * `HttpClient` instead of directly.
 *
 * By default, `provideHttpClient` configures `HttpClient` in its injector to be an independent
 * instance. For example, even if `HttpClient` is configured in the parent injector with
 * one or more interceptors, they will not intercept requests made via this instance.
 *
 * With this option enabled, once the request has passed through the current injector's
 * interceptors, it will be delegated to the parent injector's `HttpClient` chain instead of
 * dispatched directly, and interceptors in the parent configuration will be applied to the request.
 *
 * If there are several `HttpClient` instances in the injector hierarchy, it's possible for
 * `withRequestsMadeViaParent` to be used at multiple levels, which will cause the request to
 * "bubble up" until either reaching the root level or an `HttpClient` which was not configured with
 * this option.
 *
 * @see {@link provideHttpClient}
 * @publicApi
 */
function withRequestsMadeViaParent() {
    return makeHttpFeature(HttpFeatureKind.RequestsMadeViaParent, [
        {
            provide: HttpBackend,
            useFactory: () => {
                const handlerFromParent = inject(HttpHandler, { skipSelf: true, optional: true });
                if (ngDevMode && handlerFromParent === null) {
                    throw new Error('withRequestsMadeViaParent() can only be used when the parent injector also configures HttpClient');
                }
                return handlerFromParent;
            },
        },
    ]);
}
/**
 * Configures the current `HttpClient` instance to make requests using the fetch API.
 *
 * Note: The Fetch API doesn't support progress report on uploads.
 *
 * @publicApi
 */
function withFetch() {
    return makeHttpFeature(HttpFeatureKind.Fetch, [
        FetchBackend,
        { provide: FETCH_BACKEND, useExisting: FetchBackend },
        { provide: HttpBackend, useExisting: FetchBackend },
    ]);
}

/**
 * Configures XSRF protection support for outgoing requests.
 *
 * For a server that supports a cookie-based XSRF protection system,
 * use directly to configure XSRF protection with the correct
 * cookie and header names.
 *
 * If no names are supplied, the default cookie name is `XSRF-TOKEN`
 * and the default header name is `X-XSRF-TOKEN`.
 *
 * @publicApi
 * @deprecated Use withXsrfConfiguration({cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN'}) as
 *     providers instead or `withNoXsrfProtection` if you want to disabled XSRF protection.
 */
class HttpClientXsrfModule {
    /**
     * Disable the default XSRF protection.
     */
    static disable() {
        return {
            ngModule: HttpClientXsrfModule,
            providers: [withNoXsrfProtection().ɵproviders],
        };
    }
    /**
     * Configure XSRF protection.
     * @param options An object that can specify either or both
     * cookie name or header name.
     * - Cookie name default is `XSRF-TOKEN`.
     * - Header name default is `X-XSRF-TOKEN`.
     *
     */
    static withOptions(options = {}) {
        return {
            ngModule: HttpClientXsrfModule,
            providers: withXsrfConfiguration(options).ɵproviders,
        };
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientXsrfModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
    static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: HttpClientXsrfModule });
    static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientXsrfModule, providers: [
            HttpXsrfInterceptor,
            { provide: HTTP_INTERCEPTORS, useExisting: HttpXsrfInterceptor, multi: true },
            { provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor },
            withXsrfConfiguration({
                cookieName: XSRF_DEFAULT_COOKIE_NAME,
                headerName: XSRF_DEFAULT_HEADER_NAME,
            }).ɵproviders,
            { provide: XSRF_ENABLED, useValue: true },
        ] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientXsrfModule, decorators: [{
            type: NgModule,
            args: [{
                    providers: [
                        HttpXsrfInterceptor,
                        { provide: HTTP_INTERCEPTORS, useExisting: HttpXsrfInterceptor, multi: true },
                        { provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor },
                        withXsrfConfiguration({
                            cookieName: XSRF_DEFAULT_COOKIE_NAME,
                            headerName: XSRF_DEFAULT_HEADER_NAME,
                        }).ɵproviders,
                        { provide: XSRF_ENABLED, useValue: true },
                    ],
                }]
        }] });
/**
 * Configures the dependency injector for `HttpClient`
 * with supporting services for XSRF. Automatically imported by `HttpClientModule`.
 *
 * You can add interceptors to the chain behind `HttpClient` by binding them to the
 * multiprovider for built-in DI token `HTTP_INTERCEPTORS`.
 *
 * @publicApi
 * @deprecated use `provideHttpClient(withInterceptorsFromDi())` as providers instead
 */
class HttpClientModule {
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
    static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: HttpClientModule });
    static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientModule, providers: [provideHttpClient(withInterceptorsFromDi())] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientModule, decorators: [{
            type: NgModule,
            args: [{
                    /**
                     * Configures the dependency injector where it is imported
                     * with supporting services for HTTP communications.
                     */
                    providers: [provideHttpClient(withInterceptorsFromDi())],
                }]
        }] });
/**
 * Configures the dependency injector for `HttpClient`
 * with supporting services for JSONP.
 * Without this module, Jsonp requests reach the backend
 * with method JSONP, where they are rejected.
 *
 * @publicApi
 * @deprecated `withJsonpSupport()` as providers instead
 */
class HttpClientJsonpModule {
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientJsonpModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
    static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: HttpClientJsonpModule });
    static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientJsonpModule, providers: [withJsonpSupport().ɵproviders] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HttpClientJsonpModule, decorators: [{
            type: NgModule,
            args: [{
                    providers: [withJsonpSupport().ɵproviders],
                }]
        }] });

export { FetchBackend, HTTP_INTERCEPTORS, HTTP_ROOT_INTERCEPTOR_FNS, HttpBackend, HttpClient, HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContext, HttpContextToken, HttpErrorResponse, HttpEventType, HttpFeatureKind, HttpHandler, HttpHeaderResponse, HttpHeaders, HttpInterceptorHandler, HttpParams, HttpRequest, HttpResponse, HttpResponseBase, HttpStatusCode, HttpUrlEncodingCodec, HttpXhrBackend, HttpXsrfTokenExtractor, JsonpClientBackend, JsonpInterceptor, REQUESTS_CONTRIBUTE_TO_STABILITY, provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration };
//# sourceMappingURL=module-z3bvLlVg.mjs.map
ax   {"version":3,"file":"module-z3bvLlVg.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/backend.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/headers.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/params.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/context.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/request.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/response.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/client.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/fetch.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/interceptor.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/jsonp.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/xhr.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/xsrf.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/provider.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/http/src/module.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Observable} from 'rxjs';\n\nimport {HttpRequest} from './request';\nimport {HttpEvent} from './response';\n\n/**\n * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a\n * `HttpResponse`.\n *\n * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the\n * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the\n * `HttpBackend`.\n *\n * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.\n *\n * @publicApi\n */\nexport abstract class HttpHandler {\n  abstract handle(req: HttpRequest<any>): Observable<HttpEvent<any>>;\n}\n\n/**\n * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.\n *\n * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.\n *\n * When injected, `HttpBackend` dispatches requests directly to the backend, without going\n * through the interceptor chain.\n *\n * @publicApi\n */\nexport abstract class HttpBackend implements HttpHandler {\n  abstract handle(req: HttpRequest<any>): Observable<HttpEvent<any>>;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\ninterface Update {\n  name: string;\n  value?: string | string[];\n  op: 'a' | 's' | 'd';\n}\n\n/**\n * Represents the header configuration options for an HTTP request.\n * Instances are immutable. Modifying methods return a cloned\n * instance with the change. The original object is never changed.\n *\n * @publicApi\n */\nexport class HttpHeaders {\n  /**\n   * Internal map of lowercase header names to values.\n   */\n  private headers!: Map<string, string[]>;\n\n  /**\n   * Internal map of lowercased header names to the normalized\n   * form of the name (the form seen first).\n   */\n  private normalizedNames: Map<string, string> = new Map();\n\n  /**\n   * Complete the lazy initialization of this object (needed before reading).\n   */\n  private lazyInit!: HttpHeaders | Function | null;\n\n  /**\n   * Queued updates to be materialized the next initialization.\n   */\n  private lazyUpdate: Update[] | null = null;\n\n  /**  Constructs a new HTTP header object with the given values.*/\n\n  constructor(\n    headers?: string | {[name: string]: string | number | (string | number)[]} | Headers,\n  ) {\n    if (!headers) {\n      this.headers = new Map<string, string[]>();\n    } else if (typeof headers === 'string') {\n      this.lazyInit = () => {\n        this.headers = new Map<string, string[]>();\n        headers.split('\\n').forEach((line) => {\n          const index = line.indexOf(':');\n          if (index > 0) {\n            const name = line.slice(0, index);\n            const value = line.slice(index + 1).trim();\n            this.addHeaderEntry(name, value);\n          }\n        });\n      };\n    } else if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n      this.headers = new Map<string, string[]>();\n      headers.forEach((value: string, name: string) => {\n        this.addHeaderEntry(name, value);\n      });\n    } else {\n      this.lazyInit = () => {\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n          assertValidHeaders(headers);\n        }\n        this.headers = new Map<string, string[]>();\n        Object.entries(headers).forEach(([name, values]) => {\n          this.setHeaderEntries(name, values);\n        });\n      };\n    }\n  }\n\n  /**\n   * Checks for existence of a given header.\n   *\n   * @param name The header name to check for existence.\n   *\n   * @returns True if the header exists, false otherwise.\n   */\n  has(name: string): boolean {\n    this.init();\n\n    return this.headers.has(name.toLowerCase());\n  }\n\n  /**\n   * Retrieves the first value of a given header.\n   *\n   * @param name The header name.\n   *\n   * @returns The value string if the header exists, null otherwise\n   */\n  get(name: string): string | null {\n    this.init();\n\n    const values = this.headers.get(name.toLowerCase());\n    return values && values.length > 0 ? values[0] : null;\n  }\n\n  /**\n   * Retrieves the names of the headers.\n   *\n   * @returns A list of header names.\n   */\n  keys(): string[] {\n    this.init();\n\n    return Array.from(this.normalizedNames.values());\n  }\n\n  /**\n   * Retrieves a list of values for a given header.\n   *\n   * @param name The header name from which to retrieve values.\n   *\n   * @returns A string of values if the header exists, null otherwise.\n   */\n  getAll(name: string): string[] | null {\n    this.init();\n\n    return this.headers.get(name.toLowerCase()) || null;\n  }\n\n  /**\n   * Appends a new value to the existing set of values for a header\n   * and returns them in a clone of the original instance.\n   *\n   * @param name The header name for which to append the values.\n   * @param value The value to append.\n   *\n   * @returns A clone of the HTTP headers object with the value appended to the given header.\n   */\n\n  append(name: string, value: string | string[]): HttpHeaders {\n    return this.clone({name, value, op: 'a'});\n  }\n  /**\n   * Sets or modifies a value for a given header in a clone of the original instance.\n   * If the header already exists, its value is replaced with the given value\n   * in the returned object.\n   *\n   * @param name The header name.\n   * @param value The value or values to set or override for the given header.\n   *\n   * @returns A clone of the HTTP headers object with the newly set header value.\n   */\n  set(name: string, value: string | string[]): HttpHeaders {\n    return this.clone({name, value, op: 's'});\n  }\n  /**\n   * Deletes values for a given header in a clone of the original instance.\n   *\n   * @param name The header name.\n   * @param value The value or values to delete for the given header.\n   *\n   * @returns A clone of the HTTP headers object with the given value deleted.\n   */\n  delete(name: string, value?: string | string[]): HttpHeaders {\n    return this.clone({name, value, op: 'd'});\n  }\n\n  private maybeSetNormalizedName(name: string, lcName: string): void {\n    if (!this.normalizedNames.has(lcName)) {\n      this.normalizedNames.set(lcName, name);\n    }\n  }\n\n  private init(): void {\n    if (!!this.lazyInit) {\n      if (this.lazyInit instanceof HttpHeaders) {\n        this.copyFrom(this.lazyInit);\n      } else {\n        this.lazyInit();\n      }\n      this.lazyInit = null;\n      if (!!this.lazyUpdate) {\n        this.lazyUpdate.forEach((update) => this.applyUpdate(update));\n        this.lazyUpdate = null;\n      }\n    }\n  }\n\n  private copyFrom(other: HttpHeaders) {\n    other.init();\n    Array.from(other.headers.keys()).forEach((key) => {\n      this.headers.set(key, other.headers.get(key)!);\n      this.normalizedNames.set(key, other.normalizedNames.get(key)!);\n    });\n  }\n\n  private clone(update: Update): HttpHeaders {\n    const clone = new HttpHeaders();\n    clone.lazyInit = !!this.lazyInit && this.lazyInit instanceof HttpHeaders ? this.lazyInit : this;\n    clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);\n    return clone;\n  }\n\n  private applyUpdate(update: Update): void {\n    const key = update.name.toLowerCase();\n    switch (update.op) {\n      case 'a':\n      case 's':\n        let value = update.value!;\n        if (typeof value === 'string') {\n          value = [value];\n        }\n        if (value.length === 0) {\n          return;\n        }\n        this.maybeSetNormalizedName(update.name, key);\n        const base = (update.op === 'a' ? this.headers.get(key) : undefined) || [];\n        base.push(...value);\n        this.headers.set(key, base);\n        break;\n      case 'd':\n        const toDelete = update.value as string | undefined;\n        if (!toDelete) {\n          this.headers.delete(key);\n          this.normalizedNames.delete(key);\n        } else {\n          let existing = this.headers.get(key);\n          if (!existing) {\n            return;\n          }\n          existing = existing.filter((value) => toDelete.indexOf(value) === -1);\n          if (existing.length === 0) {\n            this.headers.delete(key);\n            this.normalizedNames.delete(key);\n          } else {\n            this.headers.set(key, existing);\n          }\n        }\n        break;\n    }\n  }\n\n  private addHeaderEntry(name: string, value: string) {\n    const key = name.toLowerCase();\n    this.maybeSetNormalizedName(name, key);\n    if (this.headers.has(key)) {\n      this.headers.get(key)!.push(value);\n    } else {\n      this.headers.set(key, [value]);\n    }\n  }\n\n  private setHeaderEntries(name: string, values: any) {\n    const headerValues = (Array.isArray(values) ? values : [values]).map((value) =>\n      value.toString(),\n    );\n    const key = name.toLowerCase();\n    this.headers.set(key, headerValues);\n    this.maybeSetNormalizedName(name, key);\n  }\n\n  /**\n   * @internal\n   */\n  forEach(fn: (name: string, values: string[]) => void) {\n    this.init();\n    Array.from(this.normalizedNames.keys()).forEach((key) =>\n      fn(this.normalizedNames.get(key)!, this.headers.get(key)!),\n    );\n  }\n}\n\n/**\n * Verifies that the headers object has the right shape: the values\n * must be either strings, numbers or arrays. Throws an error if an invalid\n * header value is present.\n */\nfunction assertValidHeaders(\n  headers: Record<string, unknown> | Headers,\n): asserts headers is Record<string, string | string[] | number | number[]> {\n  for (const [key, value] of Object.entries(headers)) {\n    if (!(typeof value === 'string' || typeof value === 'number') && !Array.isArray(value)) {\n      throw new Error(\n        `Unexpected value of the \\`${key}\\` header provided. ` +\n          `Expecting either a string, a number or an array, but got: \\`${value}\\`.`,\n      );\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵRuntimeError as RuntimeError} from '@angular/core';\n\nimport {RuntimeErrorCode} from './errors';\n\n/**\n * A codec for encoding and decoding parameters in URLs.\n *\n * Used by `HttpParams`.\n *\n * @publicApi\n **/\nexport interface HttpParameterCodec {\n  encodeKey(key: string): string;\n  encodeValue(value: string): string;\n\n  decodeKey(key: string): string;\n  decodeValue(value: string): string;\n}\n\n/**\n * Provides encoding and decoding of URL parameter and query-string values.\n *\n * Serializes and parses URL parameter keys and values to encode and decode them.\n * If you pass URL query parameters without encoding,\n * the query parameters can be misinterpreted at the receiving end.\n *\n *\n * @publicApi\n */\nexport class HttpUrlEncodingCodec implements HttpParameterCodec {\n  /**\n   * Encodes a key name for a URL parameter or query-string.\n   * @param key The key name.\n   * @returns The encoded key name.\n   */\n  encodeKey(key: string): string {\n    return standardEncoding(key);\n  }\n\n  /**\n   * Encodes the value of a URL parameter or query-string.\n   * @param value The value.\n   * @returns The encoded value.\n   */\n  encodeValue(value: string): string {\n    return standardEncoding(value);\n  }\n\n  /**\n   * Decodes an encoded URL parameter or query-string key.\n   * @param key The encoded key name.\n   * @returns The decoded key name.\n   */\n  decodeKey(key: string): string {\n    return decodeURIComponent(key);\n  }\n\n  /**\n   * Decodes an encoded URL parameter or query-string value.\n   * @param value The encoded value.\n   * @returns The decoded value.\n   */\n  decodeValue(value: string) {\n    return decodeURIComponent(value);\n  }\n}\n\nfunction paramParser(rawParams: string, codec: HttpParameterCodec): Map<string, string[]> {\n  const map = new Map<string, string[]>();\n  if (rawParams.length > 0) {\n    // The `window.location.search` can be used while creating an instance of the `HttpParams` class\n    // (e.g. `new HttpParams({ fromString: window.location.search })`). The `window.location.search`\n    // may start with the `?` char, so we strip it if it's present.\n    const params: string[] = rawParams.replace(/^\\?/, '').split('&');\n    params.forEach((param: string) => {\n      const eqIdx = param.indexOf('=');\n      const [key, val]: string[] =\n        eqIdx == -1\n          ? [codec.decodeKey(param), '']\n          : [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))];\n      const list = map.get(key) || [];\n      list.push(val);\n      map.set(key, list);\n    });\n  }\n  return map;\n}\n\n/**\n * Encode input string with standard encodeURIComponent and then un-encode specific characters.\n */\nconst STANDARD_ENCODING_REGEX = /%(\\d[a-f0-9])/gi;\nconst STANDARD_ENCODING_REPLACEMENTS: {[x: string]: string} = {\n  '40': '@',\n  '3A': ':',\n  '24': '$',\n  '2C': ',',\n  '3B': ';',\n  '3D': '=',\n  '3F': '?',\n  '2F': '/',\n};\n\nfunction standardEncoding(v: string): string {\n  return encodeURIComponent(v).replace(\n    STANDARD_ENCODING_REGEX,\n    (s, t) => STANDARD_ENCODING_REPLACEMENTS[t] ?? s,\n  );\n}\n\nfunction valueToString(value: string | number | boolean): string {\n  return `${value}`;\n}\n\ninterface Update {\n  param: string;\n  value?: string | number | boolean;\n  op: 'a' | 'd' | 's';\n}\n\n/**\n * Options used to construct an `HttpParams` instance.\n *\n * @publicApi\n */\nexport interface HttpParamsOptions {\n  /**\n   * String representation of the HTTP parameters in URL-query-string format.\n   * Mutually exclusive with `fromObject`.\n   */\n  fromString?: string;\n\n  /** Object map of the HTTP parameters. Mutually exclusive with `fromString`. */\n  fromObject?: {\n    [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n  };\n\n  /** Encoding codec used to parse and serialize the parameters. */\n  encoder?: HttpParameterCodec;\n}\n\n/**\n * An HTTP request/response body that represents serialized parameters,\n * per the MIME type `application/x-www-form-urlencoded`.\n *\n * This class is immutable; all mutation operations return a new instance.\n *\n * @publicApi\n */\nexport class HttpParams {\n  private map: Map<string, string[]> | null;\n  private encoder: HttpParameterCodec;\n  private updates: Update[] | null = null;\n  private cloneFrom: HttpParams | null = null;\n\n  constructor(options: HttpParamsOptions = {} as HttpParamsOptions) {\n    this.encoder = options.encoder || new HttpUrlEncodingCodec();\n    if (options.fromString) {\n      if (options.fromObject) {\n        throw new RuntimeError(\n          RuntimeErrorCode.CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT,\n          ngDevMode && 'Cannot specify both fromString and fromObject.',\n        );\n      }\n      this.map = paramParser(options.fromString, this.encoder);\n    } else if (!!options.fromObject) {\n      this.map = new Map<string, string[]>();\n      Object.keys(options.fromObject).forEach((key) => {\n        const value = (options.fromObject as any)[key];\n        // convert the values to strings\n        const values = Array.isArray(value) ? value.map(valueToString) : [valueToString(value)];\n        this.map!.set(key, values);\n      });\n    } else {\n      this.map = null;\n    }\n  }\n\n  /**\n   * Reports whether the body includes one or more values for a given parameter.\n   * @param param The parameter name.\n   * @returns True if the parameter has one or more values,\n   * false if it has no value or is not present.\n   */\n  has(param: string): boolean {\n    this.init();\n    return this.map!.has(param);\n  }\n\n  /**\n   * Retrieves the first value for a parameter.\n   * @param param The parameter name.\n   * @returns The first value of the given parameter,\n   * or `null` if the parameter is not present.\n   */\n  get(param: string): string | null {\n    this.init();\n    const res = this.map!.get(param);\n    return !!res ? res[0] : null;\n  }\n\n  /**\n   * Retrieves all values for a  parameter.\n   * @param param The parameter name.\n   * @returns All values in a string array,\n   * or `null` if the parameter not present.\n   */\n  getAll(param: string): string[] | null {\n    this.init();\n    return this.map!.get(param) || null;\n  }\n\n  /**\n   * Retrieves all the parameters for this body.\n   * @returns The parameter names in a string array.\n   */\n  keys(): string[] {\n    this.init();\n    return Array.from(this.map!.keys());\n  }\n\n  /**\n   * Appends a new value to existing values for a parameter.\n   * @param param The parameter name.\n   * @param value The new value to add.\n   * @return A new body with the appended value.\n   */\n  append(param: string, value: string | number | boolean): HttpParams {\n    return this.clone({param, value, op: 'a'});\n  }\n\n  /**\n   * Constructs a new body with appended values for the given parameter name.\n   * @param params parameters and values\n   * @return A new body with the new value.\n   */\n  appendAll(params: {\n    [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n  }): HttpParams {\n    const updates: Update[] = [];\n    Object.keys(params).forEach((param) => {\n      const value = params[param];\n      if (Array.isArray(value)) {\n        value.forEach((_value) => {\n          updates.push({param, value: _value, op: 'a'});\n        });\n      } else {\n        updates.push({param, value: value as string | number | boolean, op: 'a'});\n      }\n    });\n    return this.clone(updates);\n  }\n\n  /**\n   * Replaces the value for a parameter.\n   * @param param The parameter name.\n   * @param value The new value.\n   * @return A new body with the new value.\n   */\n  set(param: string, value: string | number | boolean): HttpParams {\n    return this.clone({param, value, op: 's'});\n  }\n\n  /**\n   * Removes a given value or all values from a parameter.\n   * @param param The parameter name.\n   * @param value The value to remove, if provided.\n   * @return A new body with the given value removed, or with all values\n   * removed if no value is specified.\n   */\n  delete(param: string, value?: string | number | boolean): HttpParams {\n    return this.clone({param, value, op: 'd'});\n  }\n\n  /**\n   * Serializes the body to an encoded string, where key-value pairs (separated by `=`) are\n   * separated by `&`s.\n   */\n  toString(): string {\n    this.init();\n    return (\n      this.keys()\n        .map((key) => {\n          const eKey = this.encoder.encodeKey(key);\n          // `a: ['1']` produces `'a=1'`\n          // `b: []` produces `''`\n          // `c: ['1', '2']` produces `'c=1&c=2'`\n          return this.map!.get(key)!\n            .map((value) => eKey + '=' + this.encoder.encodeValue(value))\n            .join('&');\n        })\n        // filter out empty values because `b: []` produces `''`\n        // which results in `a=1&&c=1&c=2` instead of `a=1&c=1&c=2` if we don't\n        .filter((param) => param !== '')\n        .join('&')\n    );\n  }\n\n  private clone(update: Update | Update[]): HttpParams {\n    const clone = new HttpParams({encoder: this.encoder} as HttpParamsOptions);\n    clone.cloneFrom = this.cloneFrom || this;\n    clone.updates = (this.updates || []).concat(update);\n    return clone;\n  }\n\n  private init() {\n    if (this.map === null) {\n      this.map = new Map<string, string[]>();\n    }\n    if (this.cloneFrom !== null) {\n      this.cloneFrom.init();\n      this.cloneFrom.keys().forEach((key) => this.map!.set(key, this.cloneFrom!.map!.get(key)!));\n      this.updates!.forEach((update) => {\n        switch (update.op) {\n          case 'a':\n          case 's':\n            const base = (update.op === 'a' ? this.map!.get(update.param) : undefined) || [];\n            base.push(valueToString(update.value!));\n            this.map!.set(update.param, base);\n            break;\n          case 'd':\n            if (update.value !== undefined) {\n              let base = this.map!.get(update.param) || [];\n              const idx = base.indexOf(valueToString(update.value));\n              if (idx !== -1) {\n                base.splice(idx, 1);\n              }\n              if (base.length > 0) {\n                this.map!.set(update.param, base);\n              } else {\n                this.map!.delete(update.param);\n              }\n            } else {\n              this.map!.delete(update.param);\n              break;\n            }\n        }\n      });\n      this.cloneFrom = this.updates = null;\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * A token used to manipulate and access values stored in `HttpContext`.\n *\n * @publicApi\n */\nexport class HttpContextToken<T> {\n  constructor(public readonly defaultValue: () => T) {}\n}\n\n/**\n * Http context stores arbitrary user defined values and ensures type safety without\n * actually knowing the types. It is backed by a `Map` and guarantees that keys do not clash.\n *\n * This context is mutable and is shared between cloned requests unless explicitly specified.\n *\n * @usageNotes\n *\n * ### Usage Example\n *\n * ```ts\n * // inside cache.interceptors.ts\n * export const IS_CACHE_ENABLED = new HttpContextToken<boolean>(() => false);\n *\n * export class CacheInterceptor implements HttpInterceptor {\n *\n *   intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {\n *     if (req.context.get(IS_CACHE_ENABLED) === true) {\n *       return ...;\n *     }\n *     return delegate.handle(req);\n *   }\n * }\n *\n * // inside a service\n *\n * this.httpClient.get('/api/weather', {\n *   context: new HttpContext().set(IS_CACHE_ENABLED, true)\n * }).subscribe(...);\n * ```\n *\n * @publicApi\n */\nexport class HttpContext {\n  private readonly map = new Map<HttpContextToken<unknown>, unknown>();\n\n  /**\n   * Store a value in the context. If a value is already present it will be overwritten.\n   *\n   * @param token The reference to an instance of `HttpContextToken`.\n   * @param value The value to store.\n   *\n   * @returns A reference to itself for easy chaining.\n   */\n  set<T>(token: HttpContextToken<T>, value: T): HttpContext {\n    this.map.set(token, value);\n    return this;\n  }\n\n  /**\n   * Retrieve the value associated with the given token.\n   *\n   * @param token The reference to an instance of `HttpContextToken`.\n   *\n   * @returns The stored value or default if one is defined.\n   */\n  get<T>(token: HttpContextToken<T>): T {\n    if (!this.map.has(token)) {\n      this.map.set(token, token.defaultValue());\n    }\n    return this.map.get(token) as T;\n  }\n\n  /**\n   * Delete the value associated with the given token.\n   *\n   * @param token The reference to an instance of `HttpContextToken`.\n   *\n   * @returns A reference to itself for easy chaining.\n   */\n  delete(token: HttpContextToken<unknown>): HttpContext {\n    this.map.delete(token);\n    return this;\n  }\n\n  /**\n   * Checks for existence of a given token.\n   *\n   * @param token The reference to an instance of `HttpContextToken`.\n   *\n   * @returns True if the token exists, false otherwise.\n   */\n  has(token: HttpContextToken<unknown>): boolean {\n    return this.map.has(token);\n  }\n\n  /**\n   * @returns a list of tokens currently stored in the context.\n   */\n  keys(): IterableIterator<HttpContextToken<unknown>> {\n    return this.map.keys();\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {HttpContext} from './context';\nimport {HttpHeaders} from './headers';\nimport {HttpParams} from './params';\n\n/**\n * Construction interface for `HttpRequest`s.\n *\n * All values are optional and will override default values if provided.\n */\ninterface HttpRequestInit {\n  headers?: HttpHeaders;\n  context?: HttpContext;\n  reportProgress?: boolean;\n  params?: HttpParams;\n  responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n  withCredentials?: boolean;\n  transferCache?: {includeHeaders?: string[]} | boolean;\n}\n\n/**\n * Determine whether the given HTTP method may include a body.\n */\nfunction mightHaveBody(method: string): boolean {\n  switch (method) {\n    case 'DELETE':\n    case 'GET':\n    case 'HEAD':\n    case 'OPTIONS':\n    case 'JSONP':\n      return false;\n    default:\n      return true;\n  }\n}\n\n/**\n * Safely assert whether the given value is an ArrayBuffer.\n *\n * In some execution environments ArrayBuffer is not defined.\n */\nfunction isArrayBuffer(value: any): value is ArrayBuffer {\n  return typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;\n}\n\n/**\n * Safely assert whether the given value is a Blob.\n *\n * In some execution environments Blob is not defined.\n */\nfunction isBlob(value: any): value is Blob {\n  return typeof Blob !== 'undefined' && value instanceof Blob;\n}\n\n/**\n * Safely assert whether the given value is a FormData instance.\n *\n * In some execution environments FormData is not defined.\n */\nfunction isFormData(value: any): value is FormData {\n  return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\n/**\n * Safely assert whether the given value is a URLSearchParams instance.\n *\n * In some execution environments URLSearchParams is not defined.\n */\nfunction isUrlSearchParams(value: any): value is URLSearchParams {\n  return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n\n/**\n * `Content-Type` is an HTTP header used to indicate the media type\n * (also known as MIME type) of the resource being sent to the client\n * or received from the server.\n */\nexport const CONTENT_TYPE_HEADER = 'Content-Type';\n\n/**\n * The `Accept` header is an HTTP request header that indicates the media types\n * (or content types) the client is willing to receive from the server.\n */\nexport const ACCEPT_HEADER = 'Accept';\n\n/**\n * `X-Request-URL` is a custom HTTP header used in older browser versions,\n * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer,\n * to include the full URL of the request in cross-origin requests.\n */\nexport const X_REQUEST_URL_HEADER = 'X-Request-URL';\n\n/**\n * `text/plain` is a content type used to indicate that the content being\n * sent is plain text with no special formatting or structured data\n * like HTML, XML, or JSON.\n */\nexport const TEXT_CONTENT_TYPE = 'text/plain';\n\n/**\n * `application/json` is a content type used to indicate that the content\n * being sent is in the JSON format.\n */\nexport const JSON_CONTENT_TYPE = 'application/json';\n\n/**\n * `application/json, text/plain, *\\/*` is a content negotiation string often seen in the\n * Accept header of HTTP requests. It indicates the types of content the client is willing\n * to accept from the server, with a preference for `application/json` and `text/plain`,\n * but also accepting any other type (*\\/*).\n */\nexport const ACCEPT_HEADER_VALUE = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`;\n\n/**\n * An outgoing HTTP request with an optional typed body.\n *\n * `HttpRequest` represents an outgoing request, including URL, method,\n * headers, body, and other request configuration options. Instances should be\n * assumed to be immutable. To modify a `HttpRequest`, the `clone`\n * method should be used.\n *\n * @publicApi\n */\nexport class HttpRequest<T> {\n  /**\n   * The request body, or `null` if one isn't set.\n   *\n   * Bodies are not enforced to be immutable, as they can include a reference to any\n   * user-defined data type. However, interceptors should take care to preserve\n   * idempotence by treating them as such.\n   */\n  readonly body: T | null = null;\n\n  /**\n   * Outgoing headers for this request.\n   */\n  readonly headers!: HttpHeaders;\n\n  /**\n   * Shared and mutable context that can be used by interceptors\n   */\n  readonly context!: HttpContext;\n\n  /**\n   * Whether this request should be made in a way that exposes progress events.\n   *\n   * Progress events are expensive (change detection runs on each event) and so\n   * they should only be requested if the consumer intends to monitor them.\n   *\n   * Note: The `FetchBackend` doesn't support progress report on uploads.\n   */\n  readonly reportProgress: boolean = false;\n\n  /**\n   * Whether this request should be sent with outgoing credentials (cookies).\n   */\n  readonly withCredentials: boolean = false;\n\n  /**\n   * The expected response type of the server.\n   *\n   * This is used to parse the response appropriately before returning it to\n   * the requestee.\n   */\n  readonly responseType: 'arraybuffer' | 'blob' | 'json' | 'text' = 'json';\n\n  /**\n   * The outgoing HTTP request method.\n   */\n  readonly method: string;\n\n  /**\n   * Outgoing URL parameters.\n   *\n   * To pass a string representation of HTTP parameters in the URL-query-string format,\n   * the `HttpParamsOptions`' `fromString` may be used. For example:\n   *\n   * ```ts\n   * new HttpParams({fromString: 'angular=awesome'})\n   * ```\n   */\n  readonly params!: HttpParams;\n\n  /**\n   * The outgoing URL with all URL parameters set.\n   */\n  readonly urlWithParams: string;\n\n  /**\n   * The HttpTransferCache option for the request\n   */\n  readonly transferCache?: {includeHeaders?: string[]} | boolean;\n\n  constructor(\n    method: 'GET' | 'HEAD',\n    url: string,\n    init?: {\n      headers?: HttpHeaders;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      params?: HttpParams;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      /**\n       * This property accepts either a boolean to enable/disable transferring cache for eligible\n       * requests performed using `HttpClient`, or an object, which allows to configure cache\n       * parameters, such as which headers should be included (no headers are included by default).\n       *\n       * Setting this property will override the options passed to `provideClientHydration()` for this\n       * particular request\n       */\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  );\n  constructor(\n    method: 'DELETE' | 'JSONP' | 'OPTIONS',\n    url: string,\n    init?: {\n      headers?: HttpHeaders;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      params?: HttpParams;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n    },\n  );\n  constructor(\n    method: 'POST',\n    url: string,\n    body: T | null,\n    init?: {\n      headers?: HttpHeaders;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      params?: HttpParams;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      /**\n       * This property accepts either a boolean to enable/disable transferring cache for eligible\n       * requests performed using `HttpClient`, or an object, which allows to configure cache\n       * parameters, such as which headers should be included (no headers are included by default).\n       *\n       * Setting this property will override the options passed to `provideClientHydration()` for this\n       * particular request\n       */\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  );\n  constructor(\n    method: 'PUT' | 'PATCH',\n    url: string,\n    body: T | null,\n    init?: {\n      headers?: HttpHeaders;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      params?: HttpParams;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n    },\n  );\n  constructor(\n    method: string,\n    url: string,\n    body: T | null,\n    init?: {\n      headers?: HttpHeaders;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      params?: HttpParams;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      /**\n       * This property accepts either a boolean to enable/disable transferring cache for eligible\n       * requests performed using `HttpClient`, or an object, which allows to configure cache\n       * parameters, such as which headers should be included (no headers are included by default).\n       *\n       * Setting this property will override the options passed to `provideClientHydration()` for this\n       * particular request\n       */\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  );\n  constructor(\n    method: string,\n    readonly url: string,\n    third?:\n      | T\n      | {\n          headers?: HttpHeaders;\n          context?: HttpContext;\n          reportProgress?: boolean;\n          params?: HttpParams;\n          responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n          withCredentials?: boolean;\n          transferCache?: {includeHeaders?: string[]} | boolean;\n        }\n      | null,\n    fourth?: {\n      headers?: HttpHeaders;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      params?: HttpParams;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ) {\n    this.method = method.toUpperCase();\n    // Next, need to figure out which argument holds the HttpRequestInit\n    // options, if any.\n    let options: HttpRequestInit | undefined;\n\n    // Check whether a body argument is expected. The only valid way to omit\n    // the body argument is to use a known no-body method like GET.\n    if (mightHaveBody(this.method) || !!fourth) {\n      // Body is the third argument, options are the fourth.\n      this.body = third !== undefined ? (third as T) : null;\n      options = fourth;\n    } else {\n      // No body required, options are the third argument. The body stays null.\n      options = third as HttpRequestInit;\n    }\n\n    // If options have been passed, interpret them.\n    if (options) {\n      // Normalize reportProgress and withCredentials.\n      this.reportProgress = !!options.reportProgress;\n      this.withCredentials = !!options.withCredentials;\n\n      // Override default response type of 'json' if one is provided.\n      if (!!options.responseType) {\n        this.responseType = options.responseType;\n      }\n\n      // Override headers if they're provided.\n      if (!!options.headers) {\n        this.headers = options.headers;\n      }\n\n      if (!!options.context) {\n        this.context = options.context;\n      }\n\n      if (!!options.params) {\n        this.params = options.params;\n      }\n\n      // We do want to assign transferCache even if it's falsy (false is valid value)\n      this.transferCache = options.transferCache;\n    }\n\n    // If no headers have been passed in, construct a new HttpHeaders instance.\n    this.headers ??= new HttpHeaders();\n\n    // If no context have been passed in, construct a new HttpContext instance.\n    this.context ??= new HttpContext();\n\n    // If no parameters have been passed in, construct a new HttpUrlEncodedParams instance.\n    if (!this.params) {\n      this.params = new HttpParams();\n      this.urlWithParams = url;\n    } else {\n      // Encode the parameters to a string in preparation for inclusion in the URL.\n      const params = this.params.toString();\n      if (params.length === 0) {\n        // No parameters, the visible URL is just the URL given at creation time.\n        this.urlWithParams = url;\n      } else {\n        // Does the URL already have query parameters? Look for '?'.\n        const qIdx = url.indexOf('?');\n        // There are 3 cases to handle:\n        // 1) No existing parameters -> append '?' followed by params.\n        // 2) '?' exists and is followed by existing query string ->\n        //    append '&' followed by params.\n        // 3) '?' exists at the end of the url -> append params directly.\n        // This basically amounts to determining the character, if any, with\n        // which to join the URL and parameters.\n        const sep: string = qIdx === -1 ? '?' : qIdx < url.length - 1 ? '&' : '';\n        this.urlWithParams = url + sep + params;\n      }\n    }\n  }\n\n  /**\n   * Transform the free-form body into a serialized format suitable for\n   * transmission to the server.\n   */\n  serializeBody(): ArrayBuffer | Blob | FormData | URLSearchParams | string | null {\n    // If no body is present, no need to serialize it.\n    if (this.body === null) {\n      return null;\n    }\n    // Check whether the body is already in a serialized form. If so,\n    // it can just be returned directly.\n    if (\n      typeof this.body === 'string' ||\n      isArrayBuffer(this.body) ||\n      isBlob(this.body) ||\n      isFormData(this.body) ||\n      isUrlSearchParams(this.body)\n    ) {\n      return this.body;\n    }\n    // Check whether the body is an instance of HttpUrlEncodedParams.\n    if (this.body instanceof HttpParams) {\n      return this.body.toString();\n    }\n    // Check whether the body is an object or array, and serialize with JSON if so.\n    if (\n      typeof this.body === 'object' ||\n      typeof this.body === 'boolean' ||\n      Array.isArray(this.body)\n    ) {\n      return JSON.stringify(this.body);\n    }\n    // Fall back on toString() for everything else.\n    return (this.body as any).toString();\n  }\n\n  /**\n   * Examine the body and attempt to infer an appropriate MIME type\n   * for it.\n   *\n   * If no such type can be inferred, this method will return `null`.\n   */\n  detectContentTypeHeader(): string | null {\n    // An empty body has no content type.\n    if (this.body === null) {\n      return null;\n    }\n    // FormData bodies rely on the browser's content type assignment.\n    if (isFormData(this.body)) {\n      return null;\n    }\n    // Blobs usually have their own content type. If it doesn't, then\n    // no type can be inferred.\n    if (isBlob(this.body)) {\n      return this.body.type || null;\n    }\n    // Array buffers have unknown contents and thus no type can be inferred.\n    if (isArrayBuffer(this.body)) {\n      return null;\n    }\n    // Technically, strings could be a form of JSON data, but it's safe enough\n    // to assume they're plain strings.\n    if (typeof this.body === 'string') {\n      return TEXT_CONTENT_TYPE;\n    }\n    // `HttpUrlEncodedParams` has its own content-type.\n    if (this.body instanceof HttpParams) {\n      return 'application/x-www-form-urlencoded;charset=UTF-8';\n    }\n    // Arrays, objects, boolean and numbers will be encoded as JSON.\n    if (\n      typeof this.body === 'object' ||\n      typeof this.body === 'number' ||\n      typeof this.body === 'boolean'\n    ) {\n      return JSON_CONTENT_TYPE;\n    }\n    // No type could be inferred.\n    return null;\n  }\n\n  clone(): HttpRequest<T>;\n  clone(update: {\n    headers?: HttpHeaders;\n    context?: HttpContext;\n    reportProgress?: boolean;\n    params?: HttpParams;\n    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n    withCredentials?: boolean;\n    transferCache?: {includeHeaders?: string[]} | boolean;\n    body?: T | null;\n    method?: string;\n    url?: string;\n    setHeaders?: {[name: string]: string | string[]};\n    setParams?: {[param: string]: string};\n  }): HttpRequest<T>;\n  clone<V>(update: {\n    headers?: HttpHeaders;\n    context?: HttpContext;\n    reportProgress?: boolean;\n    params?: HttpParams;\n    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n    withCredentials?: boolean;\n    transferCache?: {includeHeaders?: string[]} | boolean;\n    body?: V | null;\n    method?: string;\n    url?: string;\n    setHeaders?: {[name: string]: string | string[]};\n    setParams?: {[param: string]: string};\n  }): HttpRequest<V>;\n  clone(\n    update: {\n      headers?: HttpHeaders;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      params?: HttpParams;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n      body?: any | null;\n      method?: string;\n      url?: string;\n      setHeaders?: {[name: string]: string | string[]};\n      setParams?: {[param: string]: string};\n    } = {},\n  ): HttpRequest<any> {\n    // For method, url, and responseType, take the current value unless\n    // it is overridden in the update hash.\n    const method = update.method || this.method;\n    const url = update.url || this.url;\n    const responseType = update.responseType || this.responseType;\n\n    // Carefully handle the transferCache to differentiate between\n    // `false` and `undefined` in the update args.\n    const transferCache = update.transferCache ?? this.transferCache;\n\n    // The body is somewhat special - a `null` value in update.body means\n    // whatever current body is present is being overridden with an empty\n    // body, whereas an `undefined` value in update.body implies no\n    // override.\n    const body = update.body !== undefined ? update.body : this.body;\n\n    // Carefully handle the boolean options to differentiate between\n    // `false` and `undefined` in the update args.\n    const withCredentials = update.withCredentials ?? this.withCredentials;\n    const reportProgress = update.reportProgress ?? this.reportProgress;\n\n    // Headers and params may be appended to if `setHeaders` or\n    // `setParams` are used.\n    let headers = update.headers || this.headers;\n    let params = update.params || this.params;\n\n    // Pass on context if needed\n    const context = update.context ?? this.context;\n\n    // Check whether the caller has asked to add headers.\n    if (update.setHeaders !== undefined) {\n      // Set every requested header.\n      headers = Object.keys(update.setHeaders).reduce(\n        (headers, name) => headers.set(name, update.setHeaders![name]),\n        headers,\n      );\n    }\n\n    // Check whether the caller has asked to set params.\n    if (update.setParams) {\n      // Set every requested param.\n      params = Object.keys(update.setParams).reduce(\n        (params, param) => params.set(param, update.setParams![param]),\n        params,\n      );\n    }\n\n    // Finally, construct the new HttpRequest using the pieces from above.\n    return new HttpRequest(method, url, body, {\n      params,\n      headers,\n      context,\n      reportProgress,\n      responseType,\n      withCredentials,\n      transferCache,\n    });\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {HttpHeaders} from './headers';\n\n/**\n * Type enumeration for the different kinds of `HttpEvent`.\n *\n * @publicApi\n */\nexport enum HttpEventType {\n  /**\n   * The request was sent out over the wire.\n   */\n  Sent,\n\n  /**\n   * An upload progress event was received.\n   *\n   * Note: The `FetchBackend` doesn't support progress report on uploads.\n   */\n  UploadProgress,\n\n  /**\n   * The response status code and headers were received.\n   */\n  ResponseHeader,\n\n  /**\n   * A download progress event was received.\n   */\n  DownloadProgress,\n\n  /**\n   * The full response including the body was received.\n   */\n  Response,\n\n  /**\n   * A custom event from an interceptor or a backend.\n   */\n  User,\n}\n\n/**\n * Base interface for progress events.\n *\n * @publicApi\n */\nexport interface HttpProgressEvent {\n  /**\n   * Progress event type is either upload or download.\n   */\n  type: HttpEventType.DownloadProgress | HttpEventType.UploadProgress;\n\n  /**\n   * Number of bytes uploaded or downloaded.\n   */\n  loaded: number;\n\n  /**\n   * Total number of bytes to upload or download. Depending on the request or\n   * response, this may not be computable and thus may not be present.\n   */\n  total?: number;\n}\n\n/**\n * A download progress event.\n *\n * @publicApi\n */\nexport interface HttpDownloadProgressEvent extends HttpProgressEvent {\n  type: HttpEventType.DownloadProgress;\n\n  /**\n   * The partial response body as downloaded so far.\n   *\n   * Only present if the responseType was `text`.\n   */\n  partialText?: string;\n}\n\n/**\n * An upload progress event.\n *\n * Note: The `FetchBackend` doesn't support progress report on uploads.\n *\n * @publicApi\n */\nexport interface HttpUploadProgressEvent extends HttpProgressEvent {\n  type: HttpEventType.UploadProgress;\n}\n\n/**\n * An event indicating that the request was sent to the server. Useful\n * when a request may be retried multiple times, to distinguish between\n * retries on the final event stream.\n *\n * @publicApi\n */\nexport interface HttpSentEvent {\n  type: HttpEventType.Sent;\n}\n\n/**\n * A user-defined event.\n *\n * Grouping all custom events under this type ensures they will be handled\n * and forwarded by all implementations of interceptors.\n *\n * @publicApi\n */\nexport interface HttpUserEvent<T> {\n  type: HttpEventType.User;\n}\n\n/**\n * An error that represents a failed attempt to JSON.parse text coming back\n * from the server.\n *\n * It bundles the Error object with the actual response body that failed to parse.\n *\n *\n */\nexport interface HttpJsonParseError {\n  error: Error;\n  text: string;\n}\n\n/**\n * Union type for all possible events on the response stream.\n *\n * Typed according to the expected type of the response.\n *\n * @publicApi\n */\nexport type HttpEvent<T> =\n  | HttpSentEvent\n  | HttpHeaderResponse\n  | HttpResponse<T>\n  | HttpProgressEvent\n  | HttpUserEvent<T>;\n\n/**\n * Base class for both `HttpResponse` and `HttpHeaderResponse`.\n *\n * @publicApi\n */\nexport abstract class HttpResponseBase {\n  /**\n   * All response headers.\n   */\n  readonly headers: HttpHeaders;\n\n  /**\n   * Response status code.\n   */\n  readonly status: number;\n\n  /**\n   * Textual description of response status code, defaults to OK.\n   *\n   * Do not depend on this.\n   */\n  readonly statusText: string;\n\n  /**\n   * URL of the resource retrieved, or null if not available.\n   */\n  readonly url: string | null;\n\n  /**\n   * Whether the status code falls in the 2xx range.\n   */\n  readonly ok: boolean;\n\n  /**\n   * Type of the response, narrowed to either the full response or the header.\n   */\n  readonly type!: HttpEventType.Response | HttpEventType.ResponseHeader;\n\n  /**\n   * Super-constructor for all responses.\n   *\n   * The single parameter accepted is an initialization hash. Any properties\n   * of the response passed there will override the default values.\n   */\n  constructor(\n    init: {\n      headers?: HttpHeaders;\n      status?: number;\n      statusText?: string;\n      url?: string;\n    },\n    defaultStatus: number = 200,\n    defaultStatusText: string = 'OK',\n  ) {\n    // If the hash has values passed, use them to initialize the response.\n    // Otherwise use the default values.\n    this.headers = init.headers || new HttpHeaders();\n    this.status = init.status !== undefined ? init.status : defaultStatus;\n    this.statusText = init.statusText || defaultStatusText;\n    this.url = init.url || null;\n\n    // Cache the ok value to avoid defining a getter.\n    this.ok = this.status >= 200 && this.status < 300;\n  }\n}\n\n/**\n * A partial HTTP response which only includes the status and header data,\n * but no response body.\n *\n * `HttpHeaderResponse` is a `HttpEvent` available on the response\n * event stream, only when progress events are requested.\n *\n * @publicApi\n */\nexport class HttpHeaderResponse extends HttpResponseBase {\n  /**\n   * Create a new `HttpHeaderResponse` with the given parameters.\n   */\n  constructor(\n    init: {\n      headers?: HttpHeaders;\n      status?: number;\n      statusText?: string;\n      url?: string;\n    } = {},\n  ) {\n    super(init);\n  }\n\n  override readonly type: HttpEventType.ResponseHeader = HttpEventType.ResponseHeader;\n\n  /**\n   * Copy this `HttpHeaderResponse`, overriding its contents with the\n   * given parameter hash.\n   */\n  clone(\n    update: {headers?: HttpHeaders; status?: number; statusText?: string; url?: string} = {},\n  ): HttpHeaderResponse {\n    // Perform a straightforward initialization of the new HttpHeaderResponse,\n    // overriding the current parameters with new ones if given.\n    return new HttpHeaderResponse({\n      headers: update.headers || this.headers,\n      status: update.status !== undefined ? update.status : this.status,\n      statusText: update.statusText || this.statusText,\n      url: update.url || this.url || undefined,\n    });\n  }\n}\n\n/**\n * A full HTTP response, including a typed response body (which may be `null`\n * if one was not returned).\n *\n * `HttpResponse` is a `HttpEvent` available on the response event\n * stream.\n *\n * @publicApi\n */\nexport class HttpResponse<T> extends HttpResponseBase {\n  /**\n   * The response body, or `null` if one was not returned.\n   */\n  readonly body: T | null;\n\n  /**\n   * Construct a new `HttpResponse`.\n   */\n  constructor(\n    init: {\n      body?: T | null;\n      headers?: HttpHeaders;\n      status?: number;\n      statusText?: string;\n      url?: string;\n    } = {},\n  ) {\n    super(init);\n    this.body = init.body !== undefined ? init.body : null;\n  }\n\n  override readonly type: HttpEventType.Response = HttpEventType.Response;\n\n  clone(): HttpResponse<T>;\n  clone(update: {\n    headers?: HttpHeaders;\n    status?: number;\n    statusText?: string;\n    url?: string;\n  }): HttpResponse<T>;\n  clone<V>(update: {\n    body?: V | null;\n    headers?: HttpHeaders;\n    status?: number;\n    statusText?: string;\n    url?: string;\n  }): HttpResponse<V>;\n  clone(\n    update: {\n      body?: any | null;\n      headers?: HttpHeaders;\n      status?: number;\n      statusText?: string;\n      url?: string;\n    } = {},\n  ): HttpResponse<any> {\n    return new HttpResponse<any>({\n      body: update.body !== undefined ? update.body : this.body,\n      headers: update.headers || this.headers,\n      status: update.status !== undefined ? update.status : this.status,\n      statusText: update.statusText || this.statusText,\n      url: update.url || this.url || undefined,\n    });\n  }\n}\n\n/**\n * A response that represents an error or failure, either from a\n * non-successful HTTP status, an error while executing the request,\n * or some other failure which occurred during the parsing of the response.\n *\n * Any error returned on the `Observable` response stream will be\n * wrapped in an `HttpErrorResponse` to provide additional context about\n * the state of the HTTP layer when the error occurred. The error property\n * will contain either a wrapped Error object or the error response returned\n * from the server.\n *\n * @publicApi\n */\nexport class HttpErrorResponse extends HttpResponseBase implements Error {\n  readonly name = 'HttpErrorResponse';\n  readonly message: string;\n  readonly error: any | null;\n\n  /**\n   * Errors are never okay, even when the status code is in the 2xx success range.\n   */\n  override readonly ok = false;\n\n  constructor(init: {\n    error?: any;\n    headers?: HttpHeaders;\n    status?: number;\n    statusText?: string;\n    url?: string;\n  }) {\n    // Initialize with a default status of 0 / Unknown Error.\n    super(init, 0, 'Unknown Error');\n\n    // If the response was successful, then this was a parse error. Otherwise, it was\n    // a protocol-level failure of some sort. Either the request failed in transit\n    // or the server returned an unsuccessful status code.\n    if (this.status >= 200 && this.status < 300) {\n      this.message = `Http failure during parsing for ${init.url || '(unknown url)'}`;\n    } else {\n      this.message = `Http failure response for ${init.url || '(unknown url)'}: ${init.status} ${\n        init.statusText\n      }`;\n    }\n    this.error = init.error || null;\n  }\n}\n\n/**\n * We use these constant to prevent pulling the whole HttpStatusCode enum\n * Those are the only ones referenced directly by the framework\n */\nexport const HTTP_STATUS_CODE_OK = 200;\nexport const HTTP_STATUS_CODE_NO_CONTENT = 204;\n\n/**\n * Http status codes.\n * As per https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n * @publicApi\n */\nexport enum HttpStatusCode {\n  Continue = 100,\n  SwitchingProtocols = 101,\n  Processing = 102,\n  EarlyHints = 103,\n\n  Ok = HTTP_STATUS_CODE_OK,\n  Created = 201,\n  Accepted = 202,\n  NonAuthoritativeInformation = 203,\n  NoContent = HTTP_STATUS_CODE_NO_CONTENT,\n  ResetContent = 205,\n  PartialContent = 206,\n  MultiStatus = 207,\n  AlreadyReported = 208,\n  ImUsed = 226,\n\n  MultipleChoices = 300,\n  MovedPermanently = 301,\n  Found = 302,\n  SeeOther = 303,\n  NotModified = 304,\n  UseProxy = 305,\n  Unused = 306,\n  TemporaryRedirect = 307,\n  PermanentRedirect = 308,\n\n  BadRequest = 400,\n  Unauthorized = 401,\n  PaymentRequired = 402,\n  Forbidden = 403,\n  NotFound = 404,\n  MethodNotAllowed = 405,\n  NotAcceptable = 406,\n  ProxyAuthenticationRequired = 407,\n  RequestTimeout = 408,\n  Conflict = 409,\n  Gone = 410,\n  LengthRequired = 411,\n  PreconditionFailed = 412,\n  PayloadTooLarge = 413,\n  UriTooLong = 414,\n  UnsupportedMediaType = 415,\n  RangeNotSatisfiable = 416,\n  ExpectationFailed = 417,\n  ImATeapot = 418,\n  MisdirectedRequest = 421,\n  UnprocessableEntity = 422,\n  Locked = 423,\n  FailedDependency = 424,\n  TooEarly = 425,\n  UpgradeRequired = 426,\n  PreconditionRequired = 428,\n  TooManyRequests = 429,\n  RequestHeaderFieldsTooLarge = 431,\n  UnavailableForLegalReasons = 451,\n\n  InternalServerError = 500,\n  NotImplemented = 501,\n  BadGateway = 502,\n  ServiceUnavailable = 503,\n  GatewayTimeout = 504,\n  HttpVersionNotSupported = 505,\n  VariantAlsoNegotiates = 506,\n  InsufficientStorage = 507,\n  LoopDetected = 508,\n  NotExtended = 510,\n  NetworkAuthenticationRequired = 511,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable, ɵRuntimeError as RuntimeError} from '@angular/core';\nimport {Observable, of} from 'rxjs';\nimport {concatMap, filter, map} from 'rxjs/operators';\n\nimport {HttpHandler} from './backend';\nimport {HttpContext} from './context';\nimport {HttpHeaders} from './headers';\nimport {HttpParams, HttpParamsOptions} from './params';\nimport {HttpRequest} from './request';\nimport {HttpEvent, HttpResponse} from './response';\nimport {RuntimeErrorCode} from './errors';\n\n/**\n * Constructs an instance of `HttpRequestOptions<T>` from a source `HttpMethodOptions` and\n * the given `body`. This function clones the object and adds the body.\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n *\n */\nfunction addBody<T>(\n  options: {\n    headers?: HttpHeaders | Record<string, string | string[]>;\n    context?: HttpContext;\n    observe?: 'body' | 'events' | 'response';\n    params?:\n      | HttpParams\n      | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n    reportProgress?: boolean;\n    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n    withCredentials?: boolean;\n    transferCache?: {includeHeaders?: string[]} | boolean;\n  },\n  body: T | null,\n): any {\n  return {\n    body,\n    headers: options.headers,\n    context: options.context,\n    observe: options.observe,\n    params: options.params,\n    reportProgress: options.reportProgress,\n    responseType: options.responseType,\n    withCredentials: options.withCredentials,\n    transferCache: options.transferCache,\n  };\n}\n\n/**\n * Performs HTTP requests.\n * This service is available as an injectable class, with methods to perform HTTP requests.\n * Each request method has multiple signatures, and the return type varies based on\n * the signature that is called (mainly the values of `observe` and `responseType`).\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n *\n * @usageNotes\n *\n * ### HTTP Request Example\n *\n * ```ts\n *  // GET heroes whose name contains search term\n * searchHeroes(term: string): observable<Hero[]>{\n *\n *  const params = new HttpParams({fromString: 'name=term'});\n *    return this.httpClient.request('GET', this.heroesUrl, {responseType:'json', params});\n * }\n * ```\n *\n * Alternatively, the parameter string can be used without invoking HttpParams\n * by directly joining to the URL.\n * ```ts\n * this.httpClient.request('GET', this.heroesUrl + '?' + 'name=term', {responseType:'json'});\n * ```\n *\n *\n * ### JSONP Example\n * ```ts\n * requestJsonp(url, callback = 'callback') {\n *  return this.httpClient.jsonp(this.heroesURL, callback);\n * }\n * ```\n *\n * ### PATCH Example\n * ```ts\n * // PATCH one of the heroes' name\n * patchHero (id: number, heroName: string): Observable<{}> {\n * const url = `${this.heroesUrl}/${id}`;   // PATCH api/heroes/42\n *  return this.httpClient.patch(url, {name: heroName}, httpOptions)\n *    .pipe(catchError(this.handleError('patchHero')));\n * }\n * ```\n *\n * @see [HTTP Guide](guide/http)\n * @see [HTTP Request](api/common/http/HttpRequest)\n *\n * @publicApi\n */\n@Injectable()\nexport class HttpClient {\n  constructor(private handler: HttpHandler) {}\n\n  /**\n   * Sends an `HttpRequest` and returns a stream of `HttpEvent`s.\n   *\n   * @return An `Observable` of the response, with the response body as a stream of `HttpEvent`s.\n   */\n  request<R>(req: HttpRequest<any>): Observable<HttpEvent<R>>;\n\n  /**\n   * Constructs a request that interprets the body as an `ArrayBuffer` and returns the response in\n   * an `ArrayBuffer`.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   *\n   * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<ArrayBuffer>;\n\n  /**\n   * Constructs a request that interprets the body as a blob and returns\n   * the response as a blob.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body of type `Blob`.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<Blob>;\n\n  /**\n   * Constructs a request that interprets the body as a text string and\n   * returns a string value.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body of type string.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<string>;\n\n  /**\n   * Constructs a request that interprets the body as an `ArrayBuffer` and returns the\n   * the full event stream.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body as an array of `HttpEvent`s for\n   * the request.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      observe: 'events';\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<ArrayBuffer>>;\n\n  /**\n   * Constructs a request that interprets the body as a `Blob` and returns\n   * the full event stream.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body of type `Blob`.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<Blob>>;\n\n  /**\n   * Constructs a request which interprets the body as a text string and returns the full event\n   * stream.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An    `Observable` of all `HttpEvent`s for the request,\n   * with the response body of type string.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<string>>;\n\n  /**\n   * Constructs a request which interprets the body as a JavaScript object and returns the full\n   * event stream.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the  request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body of type `Object`.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      observe: 'events';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<any>>;\n\n  /**\n   * Constructs a request which interprets the body as a JavaScript object and returns the full\n   * event stream.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body of type `R`.\n   */\n  request<R>(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      observe: 'events';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<R>>;\n\n  /**\n   * Constructs a request which interprets the body as an `ArrayBuffer`\n   * and returns the full `HttpResponse`.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with the response body as an `ArrayBuffer`.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<ArrayBuffer>>;\n\n  /**\n   * Constructs a request which interprets the body as a `Blob` and returns the full `HttpResponse`.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with the response body of type `Blob`.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<Blob>>;\n\n  /**\n   * Constructs a request which interprets the body as a text stream and returns the full\n   * `HttpResponse`.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the HTTP response, with the response body of type string.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<string>>;\n\n  /**\n   * Constructs a request which interprets the body as a JavaScript object and returns the full\n   * `HttpResponse`.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the full `HttpResponse`,\n   * with the response body of type `Object`.\n   */\n  request(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      observe: 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<Object>>;\n\n  /**\n   * Constructs a request which interprets the body as a JavaScript object and returns\n   * the full `HttpResponse` with the response body in the requested type.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return  An `Observable` of the full `HttpResponse`, with the response body of type `R`.\n   */\n  request<R>(\n    method: string,\n    url: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      reportProgress?: boolean;\n      observe: 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<R>>;\n\n  /**\n   * Constructs a request which interprets the body as a JavaScript object and returns the full\n   * `HttpResponse` as a JavaScript object.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with the response body of type `Object`.\n   */\n  request(\n    method: string,\n    url: string,\n    options?: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      responseType?: 'json';\n      reportProgress?: boolean;\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<Object>;\n\n  /**\n   * Constructs a request which interprets the body as a JavaScript object\n   * with the response body of the requested type.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with the response body of type `R`.\n   */\n  request<R>(\n    method: string,\n    url: string,\n    options?: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      responseType?: 'json';\n      reportProgress?: boolean;\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<R>;\n\n  /**\n   * Constructs a request where response type and requested observable are not known statically.\n   *\n   * @param method  The HTTP method.\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the requested response, with body of type `any`.\n   */\n  request(\n    method: string,\n    url: string,\n    options?: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      observe?: 'body' | 'events' | 'response';\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<any>;\n\n  /**\n   * Constructs an observable for a generic HTTP request that, when subscribed,\n   * fires the request through the chain of registered interceptors and on to the\n   * server.\n   *\n   * You can pass an `HttpRequest` directly as the only parameter. In this case,\n   * the call returns an observable of the raw `HttpEvent` stream.\n   *\n   * Alternatively you can pass an HTTP method as the first parameter,\n   * a URL string as the second, and an options hash containing the request body as the third.\n   * See `addBody()`. In this case, the specified `responseType` and `observe` options determine the\n   * type of returned observable.\n   *   * The `responseType` value determines how a successful response body is parsed.\n   *   * If `responseType` is the default `json`, you can pass a type interface for the resulting\n   * object as a type parameter to the call.\n   *\n   * The `observe` value determines the return type, according to what you are interested in\n   * observing.\n   *   * An `observe` value of events returns an observable of the raw `HttpEvent` stream, including\n   * progress events by default.\n   *   * An `observe` value of response returns an observable of `HttpResponse<T>`,\n   * where the `T` parameter depends on the `responseType` and any optionally provided type\n   * parameter.\n   *   * An `observe` value of body returns an observable of `<T>` with the same `T` body type.\n   *\n   */\n  request(\n    first: string | HttpRequest<any>,\n    url?: string,\n    options: {\n      body?: any;\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body' | 'events' | 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    } = {},\n  ): Observable<any> {\n    let req: HttpRequest<any>;\n    // First, check whether the primary argument is an instance of `HttpRequest`.\n    if (first instanceof HttpRequest) {\n      // It is. The other arguments must be undefined (per the signatures) and can be\n      // ignored.\n      req = first;\n    } else {\n      // It's a string, so it represents a URL. Construct a request based on it,\n      // and incorporate the remaining arguments (assuming `GET` unless a method is\n      // provided.\n\n      // Figure out the headers.\n      let headers: HttpHeaders | undefined = undefined;\n      if (options.headers instanceof HttpHeaders) {\n        headers = options.headers;\n      } else {\n        headers = new HttpHeaders(options.headers);\n      }\n\n      // Sort out parameters.\n      let params: HttpParams | undefined = undefined;\n      if (!!options.params) {\n        if (options.params instanceof HttpParams) {\n          params = options.params;\n        } else {\n          params = new HttpParams({fromObject: options.params} as HttpParamsOptions);\n        }\n      }\n\n      // Construct the request.\n      req = new HttpRequest(first, url!, options.body !== undefined ? options.body : null, {\n        headers,\n        context: options.context,\n        params,\n        reportProgress: options.reportProgress,\n        // By default, JSON is assumed to be returned for all calls.\n        responseType: options.responseType || 'json',\n        withCredentials: options.withCredentials,\n        transferCache: options.transferCache,\n      });\n    }\n\n    // Start with an Observable.of() the initial request, and run the handler (which\n    // includes all interceptors) inside a concatMap(). This way, the handler runs\n    // inside an Observable chain, which causes interceptors to be re-run on every\n    // subscription (this also makes retries re-run the handler, including interceptors).\n    const events$: Observable<HttpEvent<any>> = of(req).pipe(\n      concatMap((req: HttpRequest<any>) => this.handler.handle(req)),\n    );\n\n    // If coming via the API signature which accepts a previously constructed HttpRequest,\n    // the only option is to get the event stream. Otherwise, return the event stream if\n    // that is what was requested.\n    if (first instanceof HttpRequest || options.observe === 'events') {\n      return events$;\n    }\n\n    // The requested stream contains either the full response or the body. In either\n    // case, the first step is to filter the event stream to extract a stream of\n    // responses(s).\n    const res$: Observable<HttpResponse<any>> = <Observable<HttpResponse<any>>>(\n      events$.pipe(filter((event: HttpEvent<any>) => event instanceof HttpResponse))\n    );\n\n    // Decide which stream to return.\n    switch (options.observe || 'body') {\n      case 'body':\n        // The requested stream is the body. Map the response stream to the response\n        // body. This could be done more simply, but a misbehaving interceptor might\n        // transform the response body into a different format and ignore the requested\n        // responseType. Guard against this by validating that the response is of the\n        // requested type.\n        switch (req.responseType) {\n          case 'arraybuffer':\n            return res$.pipe(\n              map((res: HttpResponse<any>) => {\n                // Validate that the body is an ArrayBuffer.\n                if (res.body !== null && !(res.body instanceof ArrayBuffer)) {\n                  throw new RuntimeError(\n                    RuntimeErrorCode.RESPONSE_IS_NOT_AN_ARRAY_BUFFER,\n                    ngDevMode && 'Response is not an ArrayBuffer.',\n                  );\n                }\n                return res.body;\n              }),\n            );\n          case 'blob':\n            return res$.pipe(\n              map((res: HttpResponse<any>) => {\n                // Validate that the body is a Blob.\n                if (res.body !== null && !(res.body instanceof Blob)) {\n                  throw new RuntimeError(\n                    RuntimeErrorCode.RESPONSE_IS_NOT_A_BLOB,\n                    ngDevMode && 'Response is not a Blob.',\n                  );\n                }\n                return res.body;\n              }),\n            );\n          case 'text':\n            return res$.pipe(\n              map((res: HttpResponse<any>) => {\n                // Validate that the body is a string.\n                if (res.body !== null && typeof res.body !== 'string') {\n                  throw new RuntimeError(\n                    RuntimeErrorCode.RESPONSE_IS_NOT_A_STRING,\n                    ngDevMode && 'Response is not a string.',\n                  );\n                }\n                return res.body;\n              }),\n            );\n          case 'json':\n          default:\n            // No validation needed for JSON responses, as they can be of any type.\n            return res$.pipe(map((res: HttpResponse<any>) => res.body));\n        }\n      case 'response':\n        // The response stream was requested directly, so return it.\n        return res$;\n      default:\n        // Guard against new future observe types being added.\n        throw new RuntimeError(\n          RuntimeErrorCode.UNHANDLED_OBSERVE_TYPE,\n          ngDevMode && `Unreachable: unhandled observe type ${options.observe}}`,\n        );\n    }\n  }\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer`\n   *  and returns the response as an `ArrayBuffer`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return  An `Observable` of the response body as an `ArrayBuffer`.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<ArrayBuffer>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as a `Blob` and returns\n   * the response as a `Blob`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response body as a `Blob`.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<Blob>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as a text string and returns\n   * a string.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body of type string.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<string>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer`\n   *  and returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with response body as an `ArrayBuffer`.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpEvent<ArrayBuffer>>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as a `Blob`\n   *  and returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request, with the response body as a\n   * `Blob`.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpEvent<Blob>>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as a text string\n   * and returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request, with the response\n   * body of type string.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpEvent<string>>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as JSON\n   * and returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request, with response body of\n   * type `Object`.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpEvent<Object>>;\n\n  /**\n   * Constructs a `DELETE`request that interprets the body as JSON\n   * and returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request, with a response\n   * body in the requested type.\n   */\n  delete<T>(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | (string | number | boolean)[]>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpEvent<T>>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer` and returns\n   *  the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the full `HttpResponse`, with the response body as an `ArrayBuffer`.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpResponse<ArrayBuffer>>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as a `Blob` and returns the full\n   * `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with the response body of type `Blob`.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpResponse<Blob>>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as a text stream and\n   *  returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the full `HttpResponse`, with the response body of type string.\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpResponse<string>>;\n\n  /**\n   * Constructs a `DELETE` request the interprets the body as a JavaScript object and returns\n   * the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with the response body of type `Object`.\n   *\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpResponse<Object>>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as JSON\n   * and returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with the response body of the requested type.\n   */\n  delete<T>(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<HttpResponse<T>>;\n\n  /**\n   * Constructs a `DELETE` request that interprets the body as JSON and\n   * returns the response body as an object parsed from JSON.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body of type `Object`.\n   */\n  delete(\n    url: string,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<Object>;\n\n  /**\n   * Constructs a DELETE request that interprets the body as JSON and returns\n   * the response in a given type.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with response body in the requested type.\n   */\n  delete<T>(\n    url: string,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      body?: any | null;\n    },\n  ): Observable<T>;\n\n  /**\n   * Constructs an observable that, when subscribed, causes the configured\n   * `DELETE` request to execute on the server. See the individual overloads for\n   * details on the return type.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   */\n  delete(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body' | 'events' | 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      body?: any | null;\n    } = {},\n  ): Observable<any> {\n    return this.request<any>('DELETE', url, options as any);\n  }\n\n  /**\n   * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and returns the\n   * response in an `ArrayBuffer`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<ArrayBuffer>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as a `Blob`\n   * and returns the response as a `Blob`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body as a `Blob`.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<Blob>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as a text string\n   * and returns the response as a string value.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body of type string.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<string>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and returns\n   *  the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request, with the response\n   * body as an `ArrayBuffer`.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<ArrayBuffer>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as a `Blob` and\n   * returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body as a `Blob`.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<Blob>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as a text string and returns\n   * the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body of type string.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<string>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as JSON\n   * and returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body of type `Object`.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<Object>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as JSON and returns the full\n   * event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with a response body in the requested type.\n   */\n  get<T>(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<T>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and\n   * returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<ArrayBuffer>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as a `Blob` and\n   * returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body as a `Blob`.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<Blob>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as a text stream and\n   * returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body of type string.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<string>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as JSON and\n   * returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the full `HttpResponse`,\n   * with the response body of type `Object`.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<Object>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as JSON and\n   * returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the full `HttpResponse` for the request,\n   * with a response body in the requested type.\n   */\n  get<T>(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<T>>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as JSON and\n   * returns the response body as an object parsed from JSON.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   *\n   * @return An `Observable` of the response body as a JavaScript object.\n   */\n  get(\n    url: string,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<Object>;\n\n  /**\n   * Constructs a `GET` request that interprets the body as JSON and returns\n   * the response body in a given type.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse`, with a response body in the requested type.\n   */\n  get<T>(\n    url: string,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<T>;\n\n  /**\n   * Constructs an observable that, when subscribed, causes the configured\n   * `GET` request to execute on the server. See the individual overloads for\n   * details on the return type.\n   */\n  get(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body' | 'events' | 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    } = {},\n  ): Observable<any> {\n    return this.request<any>('GET', url, options as any);\n  }\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as an `ArrayBuffer` and\n   * returns the response as an `ArrayBuffer`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<ArrayBuffer>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as a `Blob` and returns\n   * the response as a `Blob`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return  An `Observable` of the response, with the response body as a `Blob`.\n   */\n\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<Blob>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as a text string and returns the response\n   * as a string value.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body of type string.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<string>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as an  `ArrayBuffer`\n   *  and returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<ArrayBuffer>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as a `Blob` and\n   * returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body as a `Blob`.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<Blob>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as a text string\n   * and returns the full event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request, with the response body of type\n   * string.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<string>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as JSON\n   * and returns the full HTTP event stream.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request, with a response body of\n   * type `Object`.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<Object>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as JSON and\n   * returns the full event stream.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request,\n   * with a response body in the requested type.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   */\n  head<T>(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<T>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as an `ArrayBuffer`\n   *  and returns the full HTTP response.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<ArrayBuffer>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as a `Blob` and returns\n   * the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body as a blob.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<Blob>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as text stream\n   * and returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body of type string.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<string>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as JSON and\n   * returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body of type `Object`.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<Object>>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as JSON\n   * and returns the full `HttpResponse`.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with a response body of the requested type.\n   */\n  head<T>(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<T>>;\n\n  /**\n\n   * Constructs a `HEAD` request that interprets the body as JSON and\n   * returns the response body as an object parsed from JSON.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the response, with the response body as an object parsed from JSON.\n   */\n  head(\n    url: string,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<Object>;\n\n  /**\n   * Constructs a `HEAD` request that interprets the body as JSON and returns\n   * the response in a given type.\n   *\n   * @param url     The endpoint URL.\n   * @param options The HTTP options to send with the request.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with a response body of the given type.\n   */\n  head<T>(\n    url: string,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<T>;\n\n  /**\n   * Constructs an observable that, when subscribed, causes the configured\n   * `HEAD` request to execute on the server. The `HEAD` method returns\n   * meta information about the resource without transferring the\n   * resource itself. See the individual overloads for\n   * details on the return type.\n   */\n  head(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body' | 'events' | 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    } = {},\n  ): Observable<any> {\n    return this.request<any>('HEAD', url, options as any);\n  }\n\n  /**\n   * Constructs a `JSONP` request for the given URL and name of the callback parameter.\n   *\n   * @param url The resource URL.\n   * @param callbackParam The callback function name.\n   *\n   * @return An `Observable` of the response object, with response body as an object.\n   */\n  jsonp(url: string, callbackParam: string): Observable<Object>;\n\n  /**\n   * Constructs a `JSONP` request for the given URL and name of the callback parameter.\n   *\n   * @param url The resource URL.\n   * @param callbackParam The callback function name.\n   *\n   * You must install a suitable interceptor, such as one provided by `HttpClientJsonpModule`.\n   * If no such interceptor is reached,\n   * then the `JSONP` request can be rejected by the configured backend.\n   *\n   * @return An `Observable` of the response object, with response body in the requested type.\n   */\n  jsonp<T>(url: string, callbackParam: string): Observable<T>;\n\n  /**\n   * Constructs an `Observable` that, when subscribed, causes a request with the special method\n   * `JSONP` to be dispatched via the interceptor pipeline.\n   * The [JSONP pattern](https://en.wikipedia.org/wiki/JSONP) works around limitations of certain\n   * API endpoints that don't support newer,\n   * and preferable [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) protocol.\n   * JSONP treats the endpoint API as a JavaScript file and tricks the browser to process the\n   * requests even if the API endpoint is not located on the same domain (origin) as the client-side\n   * application making the request.\n   * The endpoint API must support JSONP callback for JSONP requests to work.\n   * The resource API returns the JSON response wrapped in a callback function.\n   * You can pass the callback function name as one of the query parameters.\n   * Note that JSONP requests can only be used with `GET` requests.\n   *\n   * @param url The resource URL.\n   * @param callbackParam The callback function name.\n   *\n   */\n  jsonp<T>(url: string, callbackParam: string): Observable<T> {\n    return this.request<any>('JSONP', url, {\n      params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),\n      observe: 'body',\n      responseType: 'json',\n    });\n  }\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as an\n   * `ArrayBuffer` and returns the response as an `ArrayBuffer`.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<ArrayBuffer>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as a `Blob` and returns\n   * the response as a `Blob`.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with the response body as a `Blob`.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<Blob>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as a text string and\n   * returns a string value.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with the response body of type string.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<string>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as an `ArrayBuffer`\n   *  and returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return  An `Observable` of all `HttpEvent`s for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<ArrayBuffer>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as a `Blob` and\n   * returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body as a `Blob`.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<Blob>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as a text string\n   * and returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request,\n   * with the response body of type string.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<string>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as JSON\n   * and returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request with the response\n   * body of type `Object`.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: bo   olean;\n    },\n  ): Observable<HttpEvent<Object>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as JSON and\n   * returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request,\n   * with a response body in the requested type.\n   */\n  options<T>(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<T>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as an `ArrayBuffer`\n   *  and returns the full HTTP response.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<ArrayBuffer>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as a `Blob`\n   *  and returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body as a `Blob`.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<Blob>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as text stream\n   * and returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body of type string.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<string>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as JSON\n   * and returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body of type `Object`.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<Object>>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as JSON and\n   * returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with a response body in the requested type.\n   */\n  options<T>(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<T>>;\n\n  /**\n\n   * Constructs an `OPTIONS` request that interprets the body as JSON and returns the\n   * response body as an object parsed from JSON.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with the response body as an object parsed from JSON.\n   */\n  options(\n    url: string,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<Object>;\n\n  /**\n   * Constructs an `OPTIONS` request that interprets the body as JSON and returns the\n   * response in a given type.\n   *\n   * @param url The endpoint URL.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the `HttpResponse`, with a response body of the given type.\n   */\n  options<T>(\n    url: string,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<T>;\n\n  /**\n   * Constructs an `Observable` that, when subscribed, causes the configured\n   * `OPTIONS` request to execute on the server. This method allows the client\n   * to determine the supported HTTP methods and other capabilities of an endpoint,\n   * without implying a resource action. See the individual overloads for\n   * details on the return type.\n   */\n  options(\n    url: string,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body' | 'events' | 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n    } = {},\n  ): Observable<any> {\n    return this.request<any>('OPTIONS', url, options as any);\n  }\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer` and returns\n   * the response as an `ArrayBuffer`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<ArrayBuffer>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as a `Blob` and returns the response\n   * as a `Blob`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with the response body as a `Blob`.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<Blob>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as a text string and\n   * returns the response as a string value.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with a response body of type string.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<string>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer` and\n   *  returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<ArrayBuffer>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as a `Blob`\n   *  and returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request, with the\n   * response body as `Blob`.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<Blob>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as a text string and\n   * returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request, with a\n   * response body of type string.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<string>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as JSON\n   * and returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request,\n   * with a response body of type `Object`.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<Object>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as JSON\n   * and returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of all the `HttpEvent`s for the request,\n   * with a response body in the requested type.\n   */\n  patch<T>(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<T>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer`\n   *  and returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return  An `Observable` of the `HttpResponse` for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<ArrayBuffer>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as a `Blob` and returns the full\n   * `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return  An `Observable` of the `HttpResponse` for the request,\n   * with the response body as a `Blob`.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<Blob>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as a text stream and returns the\n   * full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return  An `Observable` of the `HttpResponse` for the request,\n   * with a response body of type string.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<string>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as JSON\n   * and returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with a response body in the requested type.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<Object>>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as JSON\n   * and returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with a response body in the given type.\n   */\n  patch<T>(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<T>>;\n\n  /**\n\n   * Constructs a `PATCH` request that interprets the body as JSON and\n   * returns the response body as an object parsed from JSON.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with the response body as an object parsed from JSON.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<Object>;\n\n  /**\n   * Constructs a `PATCH` request that interprets the body as JSON\n   * and returns the response in a given type.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to edit.\n   * @param options HTTP options.\n   *\n   * @return  An `Observable` of the `HttpResponse` for the request,\n   * with a response body in the given type.\n   */\n  patch<T>(\n    url: string,\n    body: any | null,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<T>;\n\n  /**\n   * Constructs an observable that, when subscribed, causes the configured\n   * `PATCH` request to execute on the server. See the individual overloads for\n   * details on the return type.\n   */\n  patch(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body' | 'events' | 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n    } = {},\n  ): Observable<any> {\n    return this.request<any>('PATCH', url, addBody(options, body));\n  }\n\n  /**\n   * Constructs a `POST` request that interprets the body as an `ArrayBuffer` and returns\n   * an `ArrayBuffer`.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options.\n   *\n   * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<ArrayBuffer>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as a `Blob` and returns the\n   * response as a `Blob`.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the response, with the response body as a `Blob`.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<Blob>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as a text string and\n   * returns the response as a string value.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the response, with a response body of type string.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<string>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as an `ArrayBuffer` and\n   * returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<ArrayBuffer>>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as a `Blob`\n   * and returns the response in an observable of the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request, with the response body as `Blob`.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<Blob>>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as a text string and returns the full\n   * event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return  An `Observable` of all `HttpEvent`s for the request,\n   * with a response body of type string.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<string>>;\n\n  /**\n   * Constructs a POST request that interprets the body as JSON and returns the full\n   * event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return  An `Observable` of all `HttpEvent`s for the request,\n   * with a response body of type `Object`.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<Object>>;\n\n  /**\n   * Constructs a POST request that interprets the body as JSON and returns the full\n   * event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with a response body in the requested type.\n   */\n  post<T>(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpEvent<T>>;\n\n  /**\n   * Constructs a POST request that interprets the body as an `ArrayBuffer`\n   *  and returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return  An `Observable` of the `HttpResponse` for the request, with the response body as an\n   * `ArrayBuffer`.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<ArrayBuffer>>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as a `Blob` and returns the full\n   * `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body as a `Blob`.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<Blob>>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as a text stream and returns\n   * the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return  An `Observable` of the `HttpResponse` for the request,\n   * with a response body of type string.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<string>>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as JSON\n   * and returns the full `HttpResponse`.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the `HttpResponse` for the request, with a response body of type\n   * `Object`.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<Object>>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as JSON and returns the\n   * full `HttpResponse`.\n   *\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the `HttpResponse` for the request, with a response body in the\n   * requested type.\n   */\n  post<T>(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<HttpResponse<T>>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as JSON\n   * and returns the response body as an object parsed from JSON.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the response, with the response body as an object parsed from JSON.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<Object>;\n\n  /**\n   * Constructs a `POST` request that interprets the body as JSON\n   * and returns an observable of the response.\n   *\n   * @param url The endpoint URL.\n   * @param body The content to replace with.\n   * @param options HTTP options\n   *\n   * @return  An `Observable` of the `HttpResponse` for the request, with a response body in the\n   * requested type.\n   */\n  post<T>(\n    url: string,\n    body: any | null,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    },\n  ): Observable<T>;\n\n  /**\n   * Constructs an observable that, when subscribed, causes the configured\n   * `POST` request to execute on the server. The server responds with the location of\n   * the replaced resource. See the individual overloads for\n   * details on the return type.\n   */\n  post(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body' | 'events' | 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n      transferCache?: {includeHeaders?: string[]} | boolean;\n    } = {},\n  ): Observable<any> {\n    return this.request<any>('POST', url, addBody(options, body));\n  }\n\n  /**\n   * Constructs a `PUT` request that interprets the body as an `ArrayBuffer` and returns the\n   * response as an `ArrayBuffer`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<ArrayBuffer>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as a `Blob` and returns\n   * the response as a `Blob`.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the response, with the response body as a `Blob`.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<Blob>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as a text string and\n   * returns the response as a string value.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the response, with a response body of type string.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<string>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as an `ArrayBuffer` and\n   * returns the full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body as an `ArrayBuffer`.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<ArrayBuffer>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as a `Blob` and returns the full event\n   * stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with the response body as a `Blob`.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<Blob>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as a text string and returns the full event\n   * stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request, with a response body\n   * of type string.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<string>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as JSON and returns the full\n   * event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request, with a response body of\n   * type `Object`.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<Object>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as JSON and returns the\n   * full event stream.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of all `HttpEvent`s for the request,\n   * with a response body in the requested type.\n   */\n  put<T>(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'events';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpEvent<T>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as an\n   * `ArrayBuffer` and returns an observable of the full HTTP response.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the `HttpResponse` for the request, with the response body as an\n   * `ArrayBuffer`.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'arraybuffer';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<ArrayBuffer>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as a `Blob` and returns the\n   * full HTTP response.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with the response body as a `Blob`.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'blob';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<Blob>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as a text stream and returns the\n   * full HTTP response.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the `HttpResponse` for the request, with a response body of type\n   * string.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType: 'text';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<string>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as JSON and returns the full\n   * HTTP response.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the `HttpResponse` for the request, with a response body\n   * of type 'Object`.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<Object>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as an instance of the requested type and\n   * returns the full HTTP response.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the `HttpResponse` for the request,\n   * with a response body in the requested type.\n   */\n  put<T>(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      observe: 'response';\n      context?: HttpContext;\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<HttpResponse<T>>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as JSON\n   * and returns an observable of JavaScript object.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the response as a JavaScript object.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<Object>;\n\n  /**\n   * Constructs a `PUT` request that interprets the body as an instance of the requested type\n   * and returns an observable of the requested type.\n   *\n   * @param url The endpoint URL.\n   * @param body The resources to add/update.\n   * @param options HTTP options\n   *\n   * @return An `Observable` of the requested type.\n   */\n  put<T>(\n    url: string,\n    body: any | null,\n    options?: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    },\n  ): Observable<T>;\n\n  /**\n   * Constructs an observable that, when subscribed, causes the configured\n   * `PUT` request to execute on the server. The `PUT` method replaces an existing resource\n   * with a new set of values.\n   * See the individual overloads for details on the return type.\n   */\n  put(\n    url: string,\n    body: any | null,\n    options: {\n      headers?: HttpHeaders | Record<string, string | string[]>;\n      context?: HttpContext;\n      observe?: 'body' | 'events' | 'response';\n      params?:\n        | HttpParams\n        | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n      reportProgress?: boolean;\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n    } = {},\n  ): Observable<any> {\n    return this.request<any>('PUT', url, addBody(options, body));\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DestroyRef, inject, Injectable, InjectionToken, NgZone} from '@angular/core';\nimport {Observable, Observer} from 'rxjs';\n\nimport {HttpBackend} from './backend';\nimport {HttpHeaders} from './headers';\nimport {\n  ACCEPT_HEADER,\n  ACCEPT_HEADER_VALUE,\n  CONTENT_TYPE_HEADER,\n  HttpRequest,\n  X_REQUEST_URL_HEADER,\n} from './request';\nimport {\n  HTTP_STATUS_CODE_OK,\n  HttpDownloadProgressEvent,\n  HttpErrorResponse,\n  HttpEvent,\n  HttpEventType,\n  HttpHeaderResponse,\n  HttpResponse,\n} from './response';\n\n// Needed for the global `Zone` ambient types to be available.\nimport type {} from 'zone.js';\n\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n\n/**\n * Determine an appropriate URL for the response, by checking either\n * response url or the X-Request-URL header.\n */\nfunction getResponseUrl(response: Response): string | null {\n  if (response.url) {\n    return response.url;\n  }\n  // stored as lowercase in the map\n  const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase();\n  return response.headers.get(xRequestUrl);\n}\n\n/**\n * An internal injection token to reference `FetchBackend` implementation\n * in a tree-shakable way.\n */\nexport const FETCH_BACKEND = new InjectionToken<FetchBackend>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'FETCH_BACKEND' : '',\n);\n\n/**\n * Uses `fetch` to send requests to a backend server.\n *\n * This `FetchBackend` requires the support of the\n * [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) which is available on all\n * supported browsers and on Node.js v18 or later.\n *\n * @see {@link HttpHandler}\n *\n * @publicApi\n */\n@Injectable()\nexport class FetchBackend implements HttpBackend {\n  // We use an arrow function to always reference the current global implementation of `fetch`.\n  // This is helpful for cases when the global `fetch` implementation is modified by external code,\n  // see https://github.com/angular/angular/issues/57527.\n  private readonly fetchImpl =\n    inject(FetchFactory, {optional: true})?.fetch ?? ((...args) => globalThis.fetch(...args));\n  private readonly ngZone = inject(NgZone);\n  private readonly destroyRef = inject(DestroyRef);\n  private destroyed = false;\n\n  constructor() {\n    this.destroyRef.onDestroy(() => {\n      this.destroyed = true;\n    });\n  }\n\n  handle(request: HttpRequest<any>): Observable<HttpEvent<any>> {\n    return new Observable((observer) => {\n      const aborter = new AbortController();\n      this.doRequest(request, aborter.signal, observer).then(noop, (error) =>\n        observer.error(new HttpErrorResponse({error})),\n      );\n      return () => aborter.abort();\n    });\n  }\n\n  private async doRequest(\n    request: HttpRequest<any>,\n    signal: AbortSignal,\n    observer: Observer<HttpEvent<any>>,\n  ): Promise<void> {\n    const init = this.createRequestInit(request);\n    let response;\n\n    try {\n      // Run fetch outside of Angular zone.\n      // This is due to Node.js fetch implementation (Undici) which uses a number of setTimeouts to check if\n      // the response should eventually timeout which causes extra CD cycles every 500ms\n      const fetchPromise = this.ngZone.runOutsideAngular(() =>\n        this.fetchImpl(request.urlWithParams, {signal, ...init}),\n      );\n\n      // Make sure Zone.js doesn't trigger false-positive unhandled promise\n      // error in case the Promise is rejected synchronously. See function\n      // description for additional information.\n      silenceSuperfluousUnhandledPromiseRejection(fetchPromise);\n\n      // Send the `Sent` event before awaiting the response.\n      observer.next({type: HttpEventType.Sent});\n\n      response = await fetchPromise;\n    } catch (error: any) {\n      observer.error(\n        new HttpErrorResponse({\n          error,\n          status: error.status ?? 0,\n          statusText: error.statusText,\n          url: request.urlWithParams,\n          headers: error.headers,\n        }),\n      );\n      return;\n    }\n\n    const headers = new HttpHeaders(response.headers);\n    const statusText = response.statusText;\n    const url = getResponseUrl(response) ?? request.urlWithParams;\n\n    let status = response.status;\n    let body: string | ArrayBuffer | Blob | object | null = null;\n\n    if (request.reportProgress) {\n      observer.next(new HttpHeaderResponse({headers, status, statusText, url}));\n    }\n\n    if (response.body) {\n      // Read Progress\n      const contentLength = response.headers.get('content-length');\n      const chunks: Uint8Array[] = [];\n      const reader = response.body.getReader();\n      let receivedLength = 0;\n\n      let decoder: TextDecoder;\n      let partialText: string | undefined;\n\n      // We have to check whether the Zone is defined in the global scope because this may be called\n      // when the zone is nooped.\n      const reqZone = typeof Zone !== 'undefined' && Zone.current;\n\n      let canceled = false;\n\n      // Perform response processing outside of Angular zone to\n      // ensure no excessive change detection runs are executed\n      // Here calling the async ReadableStreamDefaultReader.read() is responsible for triggering CD\n      await this.ngZone.runOutsideAngular(async () => {\n        while (true) {\n          // Prevent reading chunks if the app is destroyed. Otherwise, we risk doing\n          // unnecessary work or triggering side effects after teardown.\n          // This may happen if the app was explicitly destroyed before\n          // the response returned entirely.\n          if (this.destroyed) {\n            // Streams left in a pending state (due to `break` without cancel) may\n            // continue consuming or holding onto data behind the scenes.\n            // Calling `reader.cancel()` allows the browser or the underlying\n            // system to release any network or memory resources associated with the stream.\n            await reader.cancel();\n            canceled = true;\n            break;\n          }\n\n          const {done, value} = await reader.read();\n\n          if (done) {\n            break;\n          }\n\n          chunks.push(value);\n          receivedLength += value.length;\n\n          if (request.reportProgress) {\n            partialText =\n              request.responseType === 'text'\n                ? (partialText ?? '') +\n                  (decoder ??= new TextDecoder()).decode(value, {stream: true})\n                : undefined;\n\n            const reportProgress = () =>\n              observer.next({\n                type: HttpEventType.DownloadProgress,\n                total: contentLength ? +contentLength : undefined,\n                loaded: receivedLength,\n                partialText,\n              } as HttpDownloadProgressEvent);\n            reqZone ? reqZone.run(reportProgress) : reportProgress();\n          }\n        }\n      });\n\n      // We need to manage the canceled state — because the Streams API does not\n      // expose a direct `.state` property on the reader.\n      // We need to `return` because `parseBody` may not be able to parse chunks\n      // that were only partially read (due to cancellation caused by app destruction).\n      if (canceled) {\n        observer.complete();\n        return;\n      }\n\n      // Combine all chunks.\n      const chunksAll = this.concatChunks(chunks, receivedLength);\n      try {\n        const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? '';\n        body = this.parseBody(request, chunksAll, contentType);\n      } catch (error) {\n        // Body loading or parsing failed\n        observer.error(\n          new HttpErrorResponse({\n            error,\n            headers: new HttpHeaders(response.headers),\n            status: response.status,\n            statusText: response.statusText,\n            url: getResponseUrl(response) ?? request.urlWithParams,\n          }),\n        );\n        return;\n      }\n    }\n\n    // Same behavior as the XhrBackend\n    if (status === 0) {\n      status = body ? HTTP_STATUS_CODE_OK : 0;\n    }\n\n    // ok determines whether the response will be transmitted on the event or\n    // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n    // but a successful status code can still result in an error if the user\n    // asked for JSON data and the body cannot be parsed as such.\n    const ok = status >= 200 && status < 300;\n\n    if (ok) {\n      observer.next(\n        new HttpResponse({\n          body,\n          headers,\n          status,\n          statusText,\n          url,\n        }),\n      );\n\n      // The full body has been received and delivered, no further events\n      // are possible. This request is complete.\n      observer.complete();\n    } else {\n      observer.error(\n        new HttpErrorResponse({\n          error: body,\n          headers,\n          status,\n          statusText,\n          url,\n        }),\n      );\n    }\n  }\n\n  private parseBody(\n    request: HttpRequest<any>,\n    binContent: Uint8Array,\n    contentType: string,\n  ): string | ArrayBuffer | Blob | object | null {\n    switch (request.responseType) {\n      case 'json':\n        // stripping the XSSI when present\n        const text = new TextDecoder().decode(binContent).replace(XSSI_PREFIX, '');\n        return text === '' ? null : (JSON.parse(text) as object);\n      case 'text':\n        return new TextDecoder().decode(binContent);\n      case 'blob':\n        return new Blob([binContent], {type: contentType});\n      case 'arraybuffer':\n        return binContent.buffer;\n    }\n  }\n\n  private createRequestInit(req: HttpRequest<any>): RequestInit {\n    // We could share some of this logic with the XhrBackend\n\n    const headers: Record<string, string> = {};\n    const credentials: RequestCredentials | undefined = req.withCredentials ? 'include' : undefined;\n\n    // Setting all the requested headers.\n    req.headers.forEach((name, values) => (headers[name] = values.join(',')));\n\n    // Add an Accept header if one isn't present already.\n    if (!req.headers.has(ACCEPT_HEADER)) {\n      headers[ACCEPT_HEADER] = ACCEPT_HEADER_VALUE;\n    }\n\n    // Auto-detect the Content-Type header if one isn't present already.\n    if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n      const detectedType = req.detectContentTypeHeader();\n      // Sometimes Content-Type detection fails.\n      if (detectedType !== null) {\n        headers[CONTENT_TYPE_HEADER] = detectedType;\n      }\n    }\n\n    return {\n      body: req.serializeBody(),\n      method: req.method,\n      headers,\n      credentials,\n    };\n  }\n\n  private concatChunks(chunks: Uint8Array[], totalLength: number): Uint8Array {\n    const chunksAll = new Uint8Array(totalLength);\n    let position = 0;\n    for (const chunk of chunks) {\n      chunksAll.set(chunk, position);\n      position += chunk.length;\n    }\n\n    return chunksAll;\n  }\n}\n\n/**\n * Abstract class to provide a mocked implementation of `fetch()`\n */\nexport abstract class FetchFactory {\n  abstract fetch: typeof fetch;\n}\n\nfunction noop(): void {}\n\n/**\n * Zone.js treats a rejected promise that has not yet been awaited\n * as an unhandled error. This function adds a noop `.then` to make\n * sure that Zone.js doesn't throw an error if the Promise is rejected\n * synchronously.\n */\nfunction silenceSuperfluousUnhandledPromiseRejection(promise: Promise<unknown>) {\n  promise.then(noop, noop);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isPlatformServer} from '../../index';\nimport {\n  EnvironmentInjector,\n  inject,\n  Injectable,\n  InjectionToken,\n  PLATFORM_ID,\n  runInInjectionContext,\n  ɵConsole as Console,\n  ɵformatRuntimeError as formatRuntimeError,\n  ɵPendingTasksInternal as PendingTasks,\n} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {finalize} from 'rxjs/operators';\n\nimport {HttpBackend, HttpHandler} from './backend';\nimport {RuntimeErrorCode} from './errors';\nimport {FetchBackend} from './fetch';\nimport {HttpRequest} from './request';\nimport {HttpEvent} from './response';\n\n/**\n * Intercepts and handles an `HttpRequest` or `HttpResponse`.\n *\n * Most interceptors transform the outgoing request before passing it to the\n * next interceptor in the chain, by calling `next.handle(transformedReq)`.\n * An interceptor may transform the\n * response event stream as well, by applying additional RxJS operators on the stream\n * returned by `next.handle()`.\n *\n * More rarely, an interceptor may handle the request entirely,\n * and compose a new event stream instead of invoking `next.handle()`. This is an\n * acceptable behavior, but keep in mind that further interceptors will be skipped entirely.\n *\n * It is also rare but valid for an interceptor to return multiple responses on the\n * event stream for a single request.\n *\n * @publicApi\n *\n * @see [HTTP Guide](guide/http/interceptors)\n * @see {@link HttpInterceptorFn}\n *\n * @usageNotes\n *\n * To use the same instance of `HttpInterceptors` for the entire app, import the `HttpClientModule`\n * only in your `AppModule`, and add the interceptors to the root application injector.\n * If you import `HttpClientModule` multiple times across different modules (for example, in lazy\n * loading modules), each import creates a new copy of the `HttpClientModule`, which overwrites the\n * interceptors provided in the root module.\n */\nexport interface HttpInterceptor {\n  /**\n   * Identifies and handles a given HTTP request.\n   * @param req The outgoing request object to handle.\n   * @param next The next interceptor in the chain, or the backend\n   * if no interceptors remain in the chain.\n   * @returns An observable of the event stream.\n   */\n  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;\n}\n\n/**\n * Represents the next interceptor in an interceptor chain, or the real backend if there are no\n * further interceptors.\n *\n * Most interceptors will delegate to this function, and either modify the outgoing request or the\n * response when it arrives. Within the scope of the current request, however, this function may be\n * called any number of times, for any number of downstream requests. Such downstream requests need\n * not be to the same URL or even the same origin as the current request. It is also valid to not\n * call the downstream handler at all, and process the current request entirely within the\n * interceptor.\n *\n * This function should only be called within the scope of the request that's currently being\n * intercepted. Once that request is complete, this downstream handler function should not be\n * called.\n *\n * @publicApi\n *\n * @see [HTTP Guide](guide/http/interceptors)\n */\nexport type HttpHandlerFn = (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>;\n\n/**\n * An interceptor for HTTP requests made via `HttpClient`.\n *\n * `HttpInterceptorFn`s are middleware functions which `HttpClient` calls when a request is made.\n * These functions have the opportunity to modify the outgoing request or any response that comes\n * back, as well as block, redirect, or otherwise change the request or response semantics.\n *\n * An `HttpHandlerFn` representing the next interceptor (or the backend which will make a real HTTP\n * request) is provided. Most interceptors will delegate to this function, but that is not required\n * (see `HttpHandlerFn` for more details).\n *\n * `HttpInterceptorFn`s are executed in an [injection context](guide/di/dependency-injection-context).\n * They have access to `inject()` via the `EnvironmentInjector` from which they were configured.\n *\n * @see [HTTP Guide](guide/http/interceptors)\n * @see {@link withInterceptors}\n *\n * @usageNotes\n * Here is a noop interceptor that passes the request through without modifying it:\n * ```ts\n * export const noopInterceptor: HttpInterceptorFn = (req: HttpRequest<unknown>, next:\n * HttpHandlerFn) => {\n *   return next(modifiedReq);\n * };\n * ```\n *\n * If you want to alter a request, clone it first and modify the clone before passing it to the\n * `next()` handler function.\n *\n * Here is a basic interceptor that adds a bearer token to the headers\n * ```ts\n * export const authenticationInterceptor: HttpInterceptorFn = (req: HttpRequest<unknown>, next:\n * HttpHandlerFn) => {\n *    const userToken = 'MY_TOKEN'; const modifiedReq = req.clone({\n *      headers: req.headers.set('Authorization', `Bearer ${userToken}`),\n *    });\n *\n *    return next(modifiedReq);\n * };\n * ```\n */\nexport type HttpInterceptorFn = (\n  req: HttpRequest<unknown>,\n  next: HttpHandlerFn,\n) => Observable<HttpEvent<unknown>>;\n\n/**\n * Function which invokes an HTTP interceptor chain.\n *\n * Each interceptor in the interceptor chain is turned into a `ChainedInterceptorFn` which closes\n * over the rest of the chain (represen   ted by another `ChainedInterceptorFn`). The last such\n * function in the chain will instead delegate to the `finalHandlerFn`, which is passed down when\n * the chain is invoked.\n *\n * This pattern allows for a chain of many interceptors to be composed and wrapped in a single\n * `HttpInterceptorFn`, which is a useful abstraction for including different kinds of interceptors\n * (e.g. legacy class-based interceptors) in the same chain.\n */\ntype ChainedInterceptorFn<RequestT> = (\n  req: HttpRequest<RequestT>,\n  finalHandlerFn: HttpHandlerFn,\n) => Observable<HttpEvent<RequestT>>;\n\nfunction interceptorChainEndFn(\n  req: HttpRequest<any>,\n  finalHandlerFn: HttpHandlerFn,\n): Observable<HttpEvent<any>> {\n  return finalHandlerFn(req);\n}\n\n/**\n * Constructs a `ChainedInterceptorFn` which adapts a legacy `HttpInterceptor` to the\n * `ChainedInterceptorFn` interface.\n */\nfunction adaptLegacyInterceptorToChain(\n  chainTailFn: ChainedInterceptorFn<any>,\n  interceptor: HttpInterceptor,\n): ChainedInterceptorFn<any> {\n  return (initialRequest, finalHandlerFn) =>\n    interceptor.intercept(initialRequest, {\n      handle: (downstreamRequest) => chainTailFn(downstreamRequest, finalHandlerFn),\n    });\n}\n\n/**\n * Constructs a `ChainedInterceptorFn` which wraps and invokes a functional interceptor in the given\n * injector.\n */\nfunction chainedInterceptorFn(\n  chainTailFn: ChainedInterceptorFn<unknown>,\n  interceptorFn: HttpInterceptorFn,\n  injector: EnvironmentInjector,\n): ChainedInterceptorFn<unknown> {\n  return (initialRequest, finalHandlerFn) =>\n    runInInjectionContext(injector, () =>\n      interceptorFn(initialRequest, (downstreamRequest) =>\n        chainTailFn(downstreamRequest, finalHandlerFn),\n      ),\n    );\n}\n\n/**\n * A multi-provider token that represents the array of registered\n * `HttpInterceptor` objects.\n *\n * @publicApi\n */\nexport const HTTP_INTERCEPTORS = new InjectionToken<readonly HttpInterceptor[]>(\n  ngDevMode ? 'HTTP_INTERCEPTORS' : '',\n);\n\n/**\n * A multi-provided token of `HttpInterceptorFn`s.\n */\nexport const HTTP_INTERCEPTOR_FNS = new InjectionToken<readonly HttpInterceptorFn[]>(\n  ngDevMode ? 'HTTP_INTERCEPTOR_FNS' : '',\n);\n\n/**\n * A multi-provided token of `HttpInterceptorFn`s that are only set in root.\n */\nexport const HTTP_ROOT_INTERCEPTOR_FNS = new InjectionToken<readonly HttpInterceptorFn[]>(\n  ngDevMode ? 'HTTP_ROOT_INTERCEPTOR_FNS' : '',\n);\n\n// TODO(atscott): We need a larger discussion about stability and what should contribute to stability.\n// Should the whole interceptor chain contribute to stability or just the backend request #55075?\n// Should HttpClient contribute to stability automatically at all?\nexport const REQUESTS_CONTRIBUTE_TO_STABILITY = new InjectionToken<boolean>(\n  ngDevMode ? 'REQUESTS_CONTRIBUTE_TO_STABILITY' : '',\n  {providedIn: 'root', factory: () => true},\n);\n\n/**\n * Creates an `HttpInterceptorFn` which lazily initializes an interceptor chain from the legacy\n * class-based interceptors and runs the request through it.\n */\nexport function legacyInterceptorFnFactory(): HttpInterceptorFn {\n  let chain: ChainedInterceptorFn<any> | null = null;\n\n  return (req, handler) => {\n    if (chain === null) {\n      const interceptors = inject(HTTP_INTERCEPTORS, {optional: true}) ?? [];\n      // Note: interceptors are wrapped right-to-left so that final execution order is\n      // left-to-right. That is, if `interceptors` is the array `[a, b, c]`, we want to\n      // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n      // out.\n      chain = interceptors.reduceRight(\n        adaptLegacyInterceptorToChain,\n        interceptorChainEndFn as ChainedInterceptorFn<any>,\n      );\n    }\n\n    const pendingTasks = inject(PendingTasks);\n    const contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n    if (contributeToStability) {\n      const taskId = pendingTasks.add();\n      return chain(req, handler).pipe(finalize(() => pendingTasks.remove(taskId)));\n    } else {\n      return chain(req, handler);\n    }\n  };\n}\n\nlet fetchBackendWarningDisplayed = false;\n\n/** Internal function to reset the flag in tests */\nexport function resetFetchBackendWarningFlag() {\n  fetchBackendWarningDisplayed = false;\n}\n\n@Injectable()\nexport class HttpInterceptorHandler extends HttpHandler {\n  private chain: ChainedInterceptorFn<unknown> | null = null;\n  private readonly pendingTasks = inject(PendingTasks);\n  private readonly contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n\n  constructor(\n    private backend: HttpBackend,\n    private injector: EnvironmentInjector,\n  ) {\n    super();\n\n    // We strongly recommend using fetch backend for HTTP calls when SSR is used\n    // for an application. The logic below checks if that's the case and produces\n    // a warning otherwise.\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && !fetchBackendWarningDisplayed) {\n      const isServer = isPlatformServer(injector.get(PLATFORM_ID));\n\n      // This flag is necessary because provideHttpClientTesting() overrides the backend\n      // even if `withFetch()` is used within the test. When the testing HTTP backend is provided,\n      // no HTTP calls are actually performed during the test, so producing a warning would be\n      // misleading.\n      const isTestingBackend = (this.backend as any).isTestingBackend;\n\n      if (isServer && !(this.backend instanceof FetchBackend) && !isTestingBackend) {\n        fetchBackendWarningDisplayed = true;\n        injector\n          .get(Console)\n          .warn(\n            formatRuntimeError(\n              RuntimeErrorCode.NOT_USING_FETCH_BACKEND_IN_SSR,\n              'Angular detected that `HttpClient` is not configured ' +\n                \"to use `fetch` APIs. It's strongly recommended to \" +\n                'enable `fetch` for applications that use Server-Side Rendering ' +\n                'for better performance and compatibility. ' +\n                'To enable `fetch`, add the `withFetch()` to the `provideHttpClient()` ' +\n                'call at the root of the application.',\n            ),\n          );\n      }\n    }\n  }\n\n  override handle(initialRequest: HttpRequest<any>): Observable<HttpEvent<any>> {\n    if (this.chain === null) {\n      const dedupedInterceptorFns = Array.from(\n        new Set([\n          ...this.injector.get(HTTP_INTERCEPTOR_FNS),\n          ...this.injector.get(HTTP_ROOT_INTERCEPTOR_FNS, []),\n        ]),\n      );\n\n      // Note: interceptors are wrapped right-to-left so that final execution order is\n      // left-to-right. That is, if `dedupedInterceptorFns` is the array `[a, b, c]`, we want to\n      // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n      // out.\n      this.chain = dedupedInterceptorFns.reduceRight(\n        (nextSequencedFn, interceptorFn) =>\n          chainedInterceptorFn(nextSequencedFn, interceptorFn, this.injector),\n        interceptorChainEndFn as ChainedInterceptorFn<unknown>,\n      );\n    }\n\n    if (this.contributeToStability) {\n      const taskId = this.pendingTasks.add();\n      return this.chain(initialRequest, (downstreamRequest) =>\n        this.backend.handle(downstreamRequest),\n      ).pipe(finalize(() => this.pendingTasks.remove(taskId)));\n    } else {\n      return this.chain(initialRequest, (downstreamRequest) =>\n        this.backend.handle(downstreamRequest),\n      );\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT} from '../../index';\nimport {\n  EnvironmentInjector,\n  Inject,\n  inject,\n  Injectable,\n  runInInjectionContext,\n} from '@angular/core';\nimport {Observable, Observer} from 'rxjs';\n\nimport {HttpBackend, HttpHandler} from './backend';\nimport {HttpHandlerFn} from './interceptor';\nimport {HttpRequest} from './request';\nimport {\n  HTTP_STATUS_CODE_OK,\n  HttpErrorResponse,\n  HttpEvent,\n  HttpEventType,\n  HttpResponse,\n} from './response';\n\n// Every request made through JSONP needs a callback name that's unique across the\n// whole page. Each request is assigned an id and the callback name is constructed\n// from that. The next id to be assigned is tracked in a global variable here that\n// is shared among all applications on the page.\nlet nextRequestId: number = 0;\n\n/**\n * When a pending <script> is unsubscribed we'll move it to this document, so it won't be\n * executed.\n */\nlet foreignDocument: Document | undefined;\n\n// Error text given when a JSONP script is injected, but doesn't invoke the callback\n// passed in its URL.\nexport const JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n\n// Error text given when a request is passed to the JsonpClientBackend that doesn't\n// have a request method JSONP.\nexport const JSONP_ERR_WRONG_METHOD = 'JSONP requests must use JSONP request method.';\nexport const JSONP_ERR_WRONG_RESPONSE_TYPE = 'JSONP requests must use Json response type.';\n\n// Error text given when a request is passed to the JsonpClientBackend that has\n// headers set\nexport const JSONP_ERR_HEADERS_NOT_SUPPORTED = 'JSONP requests do not support headers.';\n\n/**\n * DI token/abstract type representing a map of JSONP callbacks.\n *\n * In the browser, this should always be the `window` object.\n *\n *\n */\nexport abstract class JsonpCallbackContext {\n  [key: string]: (data: any) => void;\n}\n\n/**\n * Factory function that determines where to store JSONP callbacks.\n *\n * Ordinarily JSONP callbacks are stored on the `window` object, but this may not exist\n * in test environments. In that case, callbacks are stored on an anonymous object instead.\n *\n *\n */\nexport function jsonpCallbackContext(): Object {\n  if (typeof window === 'object') {\n    return window;\n  }\n  return {};\n}\n\n/**\n * Processes an `HttpRequest` with the JSONP method,\n * by performing JSONP style requests.\n * @see {@link HttpHandler}\n * @see {@link HttpXhrBackend}\n *\n * @publicApi\n */\n@Injectable()\nexport class JsonpClientBackend implements HttpBackend {\n  /**\n   * A resolved promise that can be used to schedule microtasks in the event handlers.\n   */\n  private readonly resolvedPromise = Promise.resolve();\n\n  constructor(\n    private callbackMap: JsonpCallbackContext,\n    @Inject(DOCUMENT) private document: any,\n  ) {}\n\n  /**\n   * Get the name of the next callback method, by incrementing the global `nextRequestId`.\n   */\n  private nextCallback(): string {\n    return `ng_jsonp_callback_${nextRequestId++}`;\n  }\n\n  /**\n   * Processes a JSONP request and returns an event stream of the results.\n   * @param req The request object.\n   * @returns An observable of the response events.\n   *\n   */\n  handle(req: HttpRequest<never>): Observable<HttpEvent<any>> {\n    // Firstly, check both the method and response type. If either doesn't match\n    // then the request was improperly routed here and cannot be handled.\n    if (req.method !== 'JSONP') {\n      throw new Error(JSONP_ERR_WRONG_METHOD);\n    } else if (req.responseType !== 'json') {\n      throw new Error(JSONP_ERR_WRONG_RESPONSE_TYPE);\n    }\n\n    // Check the request headers. JSONP doesn't support headers and\n    // cannot set any that were supplied.\n    if (req.headers.keys().length > 0) {\n      throw new Error(JSONP_ERR_HEADERS_NOT_SUPPORTED);\n    }\n\n    // Everything else happens inside the Observable boundary.\n    return new Observable<HttpEvent<any>>((observer: Observer<HttpEvent<any>>) => {\n      // The first step to make a request is to generate the callback name, and replace the\n      // callback placeholder in the URL with the name. Care has to be taken here to ensure\n      // a trailing &, if matched, gets inserted back into the URL in the correct place.\n      const callback = this.nextCallback();\n      const url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, `=${callback}$1`);\n\n      // Construct the <script> tag and point it at the URL.\n      const node = this.document.createElement('script');\n      node.src = url;\n\n      // A JSONP request requires waiting for multiple callbacks. These variables\n      // are closed over and track state across those callbacks.\n\n      // The response object, if one has been received, or null otherwise.\n      let body: any | null = null;\n\n      // Whether the response callback has been called.\n      let finished: boolean = false;\n\n      // Set the response callback in this.callbackMap (which will be the window\n      // object in the browser. The script being loaded via the <script> tag will\n      // eventually call this callback.\n      this.callbackMap[callback] = (data?: any) => {\n        // Data has been received from the JSONP script. Firstly, delete this callback.\n        delete this.callbackMap[callback];\n\n        // Set state to indicate data was received.\n        body = data;\n        finished = true;\n      };\n\n      // cleanup() is a utility closure that removes the <script> from the page and\n      // the response callback from the window. This logic is used in both the\n      // success, error, and cancellation paths, so it's extracted out for convenience.\n      const cleanup = () => {\n        node.removeEventListener('load', onLoad);\n        node.removeEventListener('error', onError);\n\n        // Remove the <script> tag if it's still on the page.\n        node.remove();\n\n        // Remove the response callback from the callbackMap (window object in the\n        // browser).\n        delete this.callbackMap[callback];\n      };\n\n      // onLoad() is the success callback which runs after the response callback\n      // if the JSONP script loads successfully. The event itself is unimportant.\n      // If something went wrong, onLoad() may run without the response callback\n      // having been invoked.\n      const onLoad = (event: Event) => {\n        // We wrap it in an extra Promise, to ensure the microtask\n        // is scheduled after the loaded endpoint has executed any potential microtask itself,\n        // which is not guaranteed in Internet Explorer and EdgeHTML. See issue #39496\n        this.resolvedPromise.then(() => {\n          // Cleanup the page.\n          cleanup();\n\n          // Check whether the response callback has run.\n          if (!finished) {\n            // It hasn't, something went wrong with the request. Return an error via\n            // the Observable error path. All JSONP errors have status 0.\n            observer.error(\n              new HttpErrorResponse({\n                url,\n                status: 0,\n                statusText: 'JSONP Error',\n                error: new Error(JSONP_ERR_NO_CALLBACK),\n              }),\n            );\n            return;\n          }\n\n          // Success. body either contains the response body or null if none was\n          // returned.\n          observer.next(\n            new HttpResponse({\n              body,\n              status: HTTP_STATUS_CODE_OK,\n              statusText: 'OK',\n              url,\n            }),\n          );\n\n          // Complete the stream, the response is over.\n          observer.complete();\n        });\n      };\n\n      // onError() is the error callback, which runs if the script returned generates\n      // a Javascript error. It emits the error via the Observable error channel as\n      // a HttpErrorResponse.\n      const onError: any = (error: Error) => {\n        cleanup();\n\n        // Wrap the error in a HttpErrorResponse.\n        observer.error(\n          new HttpErrorResponse({\n            error,\n            status: 0,\n            statusText: 'JSONP Error',\n            url,\n          }),\n        );\n      };\n\n      // Subscribe to both the success (load) and error events on the <script> tag,\n      // and add it to the page.\n      node.addEventListener('load', onLoad);\n      node.addEventListener('error', onError);\n      this.document.body.appendChild(node);\n\n      // The request has now been successfully sent.\n      observer.next({type: HttpEventType.Sent});\n\n      // Cancellation handler.\n      return () => {\n        if (!finished) {\n          this.removeListeners(node);\n        }\n\n        // And finally, clean up the page.\n        cleanup();\n      };\n    });\n  }\n\n  private removeListeners(script: HTMLScriptElement): void {\n    // Issue #34818\n    // Changing <script>'s ownerDocument will prevent it from execution.\n    // https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block\n    foreignDocument ??= (this.document.implementation as DOMImplementation).createHTMLDocument();\n\n    foreignDocument.adoptNode(script);\n  }\n}\n\n/**\n * Identifies requests with the method JSONP and shifts them to the `JsonpClientBackend`.\n */\nexport function jsonpInterceptorFn(\n  req: HttpRequest<unknown>,\n  next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n  if (req.method === 'JSONP') {\n    return inject(JsonpClientBackend).handle(req as HttpRequest<never>);\n  }\n\n  // Fall through for normal HTTP requests.\n  return next(req);\n}\n\n/**\n * Identifies requests with the method JSONP and\n * shifts them to the `JsonpClientBackend`.\n *\n * @see {@link HttpInterceptor}\n *\n * @publicApi\n */\n@Injectable()\nexport class JsonpInterceptor {\n  constructor(private injector: EnvironmentInjector) {}\n\n  /**\n   * Identifies and handles a given JSONP request.\n   * @param initialRequest The outgoing request object to handle.\n   * @param next The next interceptor in the chain, or the backend\n   * if no interceptors remain in the chain.\n   * @returns An observable of the event stream.\n   */\n  intercept(initialRequest: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n    return runInInjectionContext(this.injector, () =>\n      jsonpInterceptorFn(initialRequest, (downstreamRequest) => next.handle(downstreamRequest)),\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {XhrFactory} from '../../index';\nimport {Injectable, ɵRuntimeError as RuntimeError} from '@angular/core';\nimport {from, Observable, Observer, of} from 'rxjs';\nimport {switchMap} from 'rxjs/operators';\n\nimport {HttpBackend} from './backend';\nimport {RuntimeErrorCode} from './errors';\nimport {HttpHeaders} from './headers';\nimport {\n  ACCEPT_HEADER,\n  ACCEPT_HEADER_VALUE,\n  CONTENT_TYPE_HEADER,\n  HttpRequest,\n  X_REQUEST_URL_HEADER,\n} from './request';\nimport {\n  HTTP_STATUS_CODE_NO_CONTENT,\n  HTTP_STATUS_CODE_OK,\n  HttpDownloadProgressEvent,\n  HttpErrorResponse,\n  HttpEvent,\n  HttpEventType,\n  HttpHeaderResponse,\n  HttpJsonParseError,\n  HttpResponse,\n  HttpUploadProgressEvent,\n} from './response';\n\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n\nconst X_REQUEST_URL_REGEXP = RegExp(`^${X_REQUEST_URL_HEADER}:`, 'm');\n\n/**\n * Determine an appropriate URL for the response, by checking either\n * XMLHttpRequest.responseURL or the X-Request-URL header.\n */\nfunction getResponseUrl(xhr: any): string | null {\n  if ('responseURL' in xhr && xhr.responseURL) {\n    return xhr.responseURL;\n  }\n  if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) {\n    return xhr.getResponseHeader(X_REQUEST_URL_HEADER);\n  }\n  return null;\n}\n\n/**\n * Uses `XMLHttpRequest` to send requests to a backend server.\n * @see {@link HttpHandler}\n * @see {@link JsonpClientBackend}\n *\n * @publicApi\n */\n@Injectable()\nexport class HttpXhrBackend implements HttpBackend {\n  constructor(private xhrFactory: XhrFactory) {}\n\n  /**\n   * Processes a request and returns a stream of response events.\n   * @param req The request object.\n   * @returns An observable of the response events.\n   */\n  handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n    // Quick check to give a better error message when a user attempts to use\n    // HttpClient.jsonp() without installing the HttpClientJsonpModule\n    if (req.method === 'JSONP') {\n      throw new RuntimeError(\n        RuntimeErrorCode.MISSING_JSONP_MODULE,\n        (typeof ngDevMode === 'undefined' || ngDevMode) &&\n          `Cannot make a JSONP request without JSONP support. To fix the problem, either add the \\`withJsonpSupport()\\` call (if \\`provideHttpClient()\\` is used) or import the \\`HttpClientJsonpModule\\` in the root NgModule.`,\n      );\n    }\n\n    // Check whether this factory has a special function to load an XHR implementation\n    // for various non-browser environments. We currently limit it to only `ServerXhr`\n    // class, which needs to load an XHR implementation.\n    const xhrFactory: XhrFactory & {ɵloadImpl?: () => Promise<void>} = this.xhrFactory;\n    const source: Observable<void | null> = xhrFactory.ɵloadImpl\n      ? from(xhrFactory.ɵloadImpl())\n      : of(null);\n\n    return source.pipe(\n      switchMap(() => {\n        // Everything happens on Observable subscription.\n        return new Observable((observer: Observer<HttpEvent<any>>) => {\n          // Start by setting up the XHR object with request method, URL, and withCredentials\n          // flag.\n          const xhr = xhrFactory.build();\n          xhr.open(req.method, req.urlWithParams);\n          if (req.withCredentials) {\n            xhr.withCredentials = true;\n          }\n\n          // Add all the requested headers.\n          req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(',')));\n\n          // Add an Accept header if one isn't present already.\n          if (!req.headers.has(ACCEPT_HEADER)) {\n            xhr.setRequestHeader(ACCEPT_HEADER, ACCEPT_HEADER_VALUE);\n          }\n\n          // Auto-detect the Content-Type header if one isn't present already.\n          if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n            const detectedType = req.detectContentTypeHeader();\n            // Sometimes Content-Type detection fails.\n            if (detectedType !== null) {\n              xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType);\n            }\n          }\n\n          // Set the responseType if one was requested.\n          if (req.responseType) {\n            const responseType = req.responseType.toLowerCase();\n\n            // JSON responses need to be processed as text. This is because if the server\n            // returns an XSSI-prefixed JSON response, the browser will fail to parse it,\n            // xhr.response will be null, and xhr.responseText cannot be accessed to\n            // retrieve the prefixed JSON data in order to strip the prefix. Thus, all JSON\n            // is parsed by first requesting text and then applying JSON.parse.\n            xhr.responseType = (responseType !== 'json' ? responseType : 'text') as any;\n          }\n\n          // Serialize the request body if one is present. If not, this will be set to null.\n          const reqBody = req.serializeBody();\n\n          // If progress events are enabled, response headers will be delivered\n          // in two events - the HttpHeaderResponse event and the full HttpResponse\n          // event. However, since response headers don't change in between these\n          // two events, it doesn't make sense to parse them twice. So headerResponse\n          // caches the data extracted from the response whenever it's first parsed,\n          // to ensure parsing isn't duplicated.\n          let headerResponse: HttpHeaderResponse | null = null;\n\n          // partialFromXhr extracts the HttpHeaderResponse from the current XMLHttpRequest\n          // state, and memoizes it into headerResponse.\n          const partialFromXhr = (): HttpHeaderResponse => {\n            if (headerResponse !== null) {\n              return headerResponse;\n            }\n\n            const statusText = xhr.statusText || 'OK';\n\n            // Parse headers from XMLHttpRequest - this step is lazy.\n            const headers = new HttpHeaders(xhr.getAllResponseHeaders());\n\n            // Read the response URL from the XMLHttpResponse instance and fall back on the\n            // request URL.\n            const url = getResponseUrl(xhr) || req.url;\n\n            // Construct the HttpHeaderResponse and memoize it.\n            headerResponse = new HttpHeaderResponse({headers, status: xhr.status, statusText, url});\n            return headerResponse;\n          };\n\n          // Next, a few closures are defined for the various events which XMLHttpRequest can\n          // emit. This allows them to be unregistered as event listeners later.\n\n          // First up is the load event, which represents a response being fully available.\n          const onLoad = () => {\n            // Read response state from the memoized partial data.\n            let {headers, status, statusText, url} = partialFromXhr();\n\n            // The body will be read out if present.\n            let body: any | null = null;\n\n            if (status !== HTTP_STATUS_CODE_NO_CONTENT) {\n              // Use XMLHttpRequest.response if set, responseText otherwise.\n              body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;\n            }\n\n            // Normalize another potential bug (this one comes from CORS).\n            if (status === 0) {\n              status = !!body ? HTTP_STATUS_CODE_OK : 0;\n            }\n\n            // ok determines whether the response will be transmitted on the event or\n            // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n            // but a successful status code can still result in an error if the user\n            // asked for JSON data and the body cannot be parsed as such.\n            let ok = status >= 200 && status < 300;\n\n            // Check whether the body needs to be parsed as JSON (in many cases the browser\n            // will have done that already).\n            if (req.responseType === 'json' && typeof body === 'string') {\n              // Save the original body, before attempting XSSI prefix stripping.\n              const originalBody = body;\n              body = body.replace(XSSI_PREFIX, '');\n              try {\n                // Attempt the parse. If it fails, a parse error should be delivered to the\n                // user.\n                body = body !== '' ? JSON.parse(body) : null;\n              } catch (error) {\n                // Since the JSON.parse failed, it's reasonable to assume this might not have\n                // been a JSON response. Restore the original body (including any XSSI prefix)\n                // to deliver a better error response.\n                body = originalBody;\n\n                // If this was an error request to begin with, leave it as a string, it\n                // probably just isn't JSON. Otherwise, deliver the parsing error to the user.\n                if (ok) {\n                  // Even though the response status was 2xx, this is still an error.\n                  ok = false;\n                  // The parse error contains the text of the body that failed to parse.\n                  body = {error, text: body} as HttpJsonParseError;\n                }\n              }\n            }\n\n            if (ok) {\n              // A successful response is delivered on the event stream.\n              observer.next(\n                new HttpResponse({\n                  body,\n                  headers,\n                  status,\n                  statusText,\n                  url: url || undefined,\n                }),\n              );\n              // The full body has been received and delivered, no further events\n              // are possible. This request is complete.\n              observer.complete();\n            } else {\n              // An unsuccessful request is delivered on the error channel.\n              observer.error(\n                new HttpErrorResponse({\n                  // The error in this case is the response body (error from the server).\n                  error: body,\n                  headers,\n                  status,\n                  statusText,\n                  url: url || undefined,\n                }),\n              );\n            }\n          };\n\n          // The onError callback is called when something goes wrong at the network level.\n          // Connection timeout, DNS error, offline, etc. These are actual errors, and are\n          // transmitted on the error channel.\n          const onError = (error: ProgressEvent) => {\n            const {url} = partialFromXhr();\n            const res = new HttpErrorResponse({\n              error,\n              status: xhr.status || 0,\n              statusText: xhr.statusText || 'Unknown Error',\n              url: url || undefined,\n            });\n            observer.error(res);\n          };\n\n          // The sentHeaders flag tracks whether the HttpResponseHeaders event\n          // has been sent on the stream. This is necessary to track if progress\n          // is enabled since the event will be sent on only the first download\n          // progress event.\n          let sentHeaders = false;\n\n          // The download progress event handler, which is only registered if\n          // progress events are enabled.\n          const onDownProgress = (event: ProgressEvent) => {\n            // Send the HttpResponseHeaders event if it hasn't been sent already.\n            if (!sentHeaders) {\n              observer.next(partialFromXhr());\n              sentHeaders = true;\n            }\n\n            // Start building the download progress event to deliver on the response\n            // event stream.\n            let progressEvent: HttpDownloadProgressEvent = {\n              type: HttpEventType.DownloadProgress,\n              loaded: event.loaded,\n            };\n\n            // Set the total number of bytes in the event if it's available.\n            if (event.lengthComputable) {\n              progressEvent.total = event.total;\n            }\n\n            // If the request was for text content and a partial response is\n            // available on XMLHttpRequest, include it in the progress event\n            // to allow for streaming reads.\n            if (req.responseType === 'text' && !!xhr.responseText) {\n              progressEvent.partialText = xhr.responseText;\n            }\n\n            // Finally, fire the event.\n            observer.next(progressEvent);\n          };\n\n          // The upload progress event handler, which is only registered if\n          // progress events are enabled.\n          const onUpProgress = (event: ProgressEvent) => {\n            // Upload progress events are simpler. Begin building the progress\n            // event.\n            let progress: HttpUploadProgressEvent = {\n              type: HttpEventType.UploadProgress,\n              loaded: event.loaded,\n            };\n\n            // If the total number of bytes being uploaded is available, include\n            // it.\n            if (event.lengthComputable) {\n              progress.total = event.total;\n            }\n\n            // Send the event.\n            observer.next(progress);\n          };\n\n          // By default, register for load and error events.\n          xhr.addEventListener('load', onLoad);\n          xhr.addEventListener('error', onError);\n          xhr.addEventListener('timeout', onError);\n          xhr.addEventListener('abort', onError);\n\n          // Progress events are only enabled if requested.\n          if (req.reportProgress) {\n            // Download progress is always enabled if requested.\n            xhr.addEventListener('progress', onDownProgress);\n\n            // Upload progress depends on whether there is a body to upload.\n            if (reqBody !== null && xhr.upload) {\n              xhr.upload.addEventListener('progress', onUpProgress);\n            }\n          }\n\n          // Fire the request, and notify the event stream that it was fired.\n          xhr.send(reqBody!);\n          observer.next({type: HttpEventType.Sent});\n          // This is the return from the Observable function, which is the\n          // request cancellation handler.\n          return () => {\n            // On a cancellation, remove all registered event listeners.\n            xhr.removeEventListener('error', onError);\n            xhr.removeEventListener('abort', onError);\n            xhr.removeEventListener('load', onLoad);\n            xhr.removeEventListener('timeout', onError);\n\n            if (req.reportProgress) {\n              xhr.removeEventListener('progress', onDownProgress);\n              if (reqBody !== null && xhr.upload) {\n                xhr.upload.removeEventListener('progress', onUpProgress);\n              }\n            }\n\n            // Finally, abort the in-flight request.\n            if (xhr.readyState !== xhr.DONE) {\n              xhr.abort();\n            }\n          };\n        });\n      }),\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT, ɵparseCookieValue as parseCookieValue} from '../../index';\nimport {\n  EnvironmentInjector,\n  Inject,\n  inject,\n  Injectable,\n  InjectionToken,\n  runInInjectionContext,\n} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nimport {HttpHandler} from './backend';\nimport {HttpHandlerFn, HttpInterceptor} from './interceptor';\nimport {HttpRequest} from './request';\nimport {HttpEvent} from './response';\n\nexport const XSRF_ENABLED = new InjectionToken<boolean>(ngDevMode ? 'XSRF_ENABLED' : '');\n\nexport const XSRF_DEFAULT_COOKIE_NAME = 'XSRF-TOKEN';\nexport const XSRF_COOKIE_NAME = new InjectionToken<string>(ngDevMode ? 'XSRF_COOKIE_NAME' : '', {\n  providedIn: 'root',\n  factory: () => XSRF_DEFAULT_COOKIE_NAME,\n});\n\nexport const XSRF_DEFAULT_HEADER_NAME = 'X-XSRF-TOKEN';\nexport const XSRF_HEADER_NAME = new InjectionToken<string>(ngDevMode ? 'XSRF_HEADER_NAME' : '', {\n  providedIn: 'root',\n  factory: () => XSRF_DEFAULT_HEADER_NAME,\n});\n\n/**\n * Retrieves the current XSRF token to use with the next outgoing request.\n *\n * @publicApi\n */\nexport abstract class HttpXsrfTokenExtractor {\n  /**\n   * Get the XSRF token to use with an outgoing request.\n   *\n   * Will be called for every request, so the token may change between requests.\n   */\n  abstract getToken(): string | null;\n}\n\n/**\n * `HttpXsrfTokenExtractor` which retrieves the token from a cookie.\n */\n@Injectable()\nexport class HttpXsrfCookieExtractor implements HttpXsrfTokenExtractor {\n  private lastCookieString: string = '';\n  private lastToken: string | null = null;\n\n  /**\n   * @internal for testing\n   */\n  parseCount: number = 0;\n\n  constructor(\n    @Inject(DOCUMENT) private doc: any,\n    @Inject(XSRF_COOKIE_NAME) private cookieName: string,\n  ) {}\n\n  getToken(): string | null {\n    if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n      return null;\n    }\n    const cookieString = this.doc.cookie || '';\n    if (cookieString !== this.lastCookieString) {\n      this.parseCount++;\n      this.lastToken = parseCookieValue(cookieString, this.cookieName);\n      this.lastCookieString = cookieString;\n    }\n    return this.lastToken;\n  }\n}\n\nexport function xsrfInterceptorFn(\n  req: HttpRequest<unknown>,\n  next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n  const lcUrl = req.url.toLowerCase();\n  // Skip both non-mutating requests and absolute URLs.\n  // Non-mutating requests don't require a token, and absolute URLs require special handling\n  // anyway as the cookie set\n  // on our origin is not the same as the token expected by another origin.\n  if (\n    !inject(XSRF_ENABLED) ||\n    req.method === 'GET' ||\n    req.method === 'HEAD' ||\n    lcUrl.startsWith('http://') ||\n    lcUrl.startsWith('https://')\n  ) {\n    return next(req);\n  }\n\n  const token = inject(HttpXsrfTokenExtractor).getToken();\n  const headerName = inject(XSRF_HEADER_NAME);\n\n  // Be careful not to overwrite an existing header of the same name.\n  if (token != null && !req.headers.has(headerName)) {\n    req = req.clone({headers: req.headers.set(headerName, token)});\n  }\n  return next(req);\n}\n\n/**\n * `HttpInterceptor` which adds an XSRF token to eligible outgoing requests.\n */\n@Injectable()\nexport class HttpXsrfInterceptor implements HttpInterceptor {\n  constructor(private injector: EnvironmentInjector) {}\n\n  intercept(initialRequest: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n    return runInInjectionContext(this.injector, () =>\n      xsrfInterceptorFn(initialRequest, (downstreamRequest) => next.handle(downstreamRequest)),\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  EnvironmentProviders,\n  inject,\n  InjectionToken,\n  makeEnvironmentProviders,\n  Provider,\n} from '@angular/core';\n\nimport {HttpBackend, HttpHandler} from './backend';\nimport {HttpClient} from './client';\nimport {FETCH_BACKEND, FetchBackend} from './fetch';\nimport {\n  HTTP_INTERCEPTOR_FNS,\n  HttpInterceptorFn,\n  HttpInterceptorHandler,\n  legacyInterceptorFnFactory,\n} from './interceptor';\nimport {\n  jsonpCallbackContext,\n  JsonpCallbackContext,\n  JsonpClientBackend,\n  jsonpInterceptorFn,\n} from './jsonp';\nimport {HttpXhrBackend} from './xhr';\nimport {\n  HttpXsrfCookieExtractor,\n  HttpXsrfTokenExtractor,\n  XSRF_COOKIE_NAME,\n  XSRF_ENABLED,\n  XSRF_HEADER_NAME,\n  xsrfInterceptorFn,\n} from './xsrf';\n\n/**\n * Identifies a particular kind of `HttpFeature`.\n *\n * @publicApi\n */\nexport enum HttpFeatureKind {\n  Interceptors,\n  LegacyInterceptors,\n  CustomXsrfConfiguration,\n  NoXsrfProtection,\n  JsonpSupport,\n  RequestsMadeViaParent,\n  Fetch,\n}\n\n/**\n * A feature for use when configuring `provideHttpClient`.\n *\n * @publicApi\n */\nexport interface HttpFeature<KindT extends HttpFeatureKind> {\n  ɵkind: KindT;\n  ɵproviders: Provider[];\n}\n\nfunction makeHttpFeature<KindT extends HttpFeatureKind>(\n  kind: KindT,\n  providers: Provider[],\n): HttpFeature<KindT> {\n  return {\n    ɵkind: kind,\n    ɵproviders: providers,\n  };\n}\n\n/**\n * Configures Angular's `HttpClient` service to be available for injection.\n *\n * By default, `HttpClient` will be configured for injection with its default options for XSRF\n * protection of outgoing requests. Additional configuration options can be provided by passing\n * feature functions to `provideHttpClient`. For example, HTTP interceptors can be added using the\n * `withInterceptors(...)` feature.\n *\n * <div class=\"docs-alert docs-alert-helpful\">\n *\n * It's strongly recommended to enable\n * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for applications that use\n * Server-Side Rendering for better performance and compatibility. To enable `fetch`, add\n * `withFetch()` feature to the `provideHttpClient()` call at the root of the application:\n *\n * ```ts\n * provideHttpClient(withFetch());\n * ```\n *\n * </div>\n *\n * @see {@link withInterceptors}\n * @see {@link withInterceptorsFromDi}\n * @see {@link withXsrfConfiguration}\n * @see {@link withNoXsrfProtection}\n * @see {@link withJsonpSupport}\n * @see {@link withRequestsMadeViaParent}\n * @see {@link withFetch}\n */\nexport function provideHttpClient(\n  ...features: HttpFeature<HttpFeatureKind>[]\n): EnvironmentProviders {\n  if (ngDevMode) {\n    const featureKinds = new Set(features.map((f) => f.ɵkind));\n    if (\n      featureKinds.has(HttpFeatureKind.NoXsrfProtection) &&\n      featureKinds.has(HttpFeatureKind.CustomXsrfConfiguration)\n    ) {\n      throw new Error(\n        ngDevMode\n          ? `Configuration error: found both withXsrfConfiguration() and withNoXsrfProtection() in the same call to provideHttpClient(), which is a contradiction.`\n          : '',\n      );\n    }\n  }\n\n  const providers: Provider[] = [\n    HttpClient,\n    HttpXhrBackend,\n    HttpInterceptorHandler,\n    {provide: HttpHandler, useExisting: HttpInterceptorHandler},\n    {\n      provide: HttpBackend,\n      useFactory: () => {\n        return inject(FETCH_BACKEND, {optional: true}) ?? inject(HttpXhrBackend);\n      },\n    },\n    {\n      provide: HTTP_INTERCEPTOR_FNS,\n      useValue: xsrfInterceptorFn,\n      multi: true,\n    },\n    {provide: XSRF_ENABLED, useValue: true},\n    {provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor},\n  ];\n\n  for (const feature of features) {\n    providers.push(...feature.ɵproviders);\n  }\n\n  return makeEnvironmentProviders(providers);\n}\n\n/**\n * Adds one or more functional-style HTTP interceptors to the configuration of the `HttpClient`\n * instance.\n *\n * @see {@link HttpInterceptorFn}\n * @see {@link provideHttpClient}\n * @publicApi\n */\nexport function withInterceptors(\n  interceptorFns: HttpInterceptorFn[],\n): HttpFeature<HttpFeatureKind.Interceptors> {\n  return makeHttpFeature(\n    HttpFeatureKind.Interceptors,\n    interceptorFns.map((interceptorFn) => {\n      return {\n        provide: HTTP_INTERCEPTOR_FNS,\n        useValue: interceptorFn,\n        multi: true,\n      };\n    }),\n  );\n}\n\nconst LEGACY_INTERCEPTOR_FN = new InjectionToken<HttpInterceptorFn>(\n  ngDevMode ? 'LEGACY_INTERCEPTOR_FN' : '',\n);\n\n/**\n * Includes class-based interceptors configured using a multi-provider in the current injector into\n * the configured `HttpClient` instance.\n *\n * Prefer `withInterceptors` and functional interceptors instead, as support for DI-provided\n * interceptors may be phased out in a later release.\n *\n * @see {@link HttpInterceptor}\n * @see {@link HTTP_INTERCEPTORS}\n * @see {@link provideHttpClient}\n */\nexport function withInterceptorsFromDi(): HttpFeature<HttpFeatureKind.LegacyInterceptors> {\n  // Note: the legacy interceptor function is provided here via an intermediate token\n  // (`LEGACY_INTERCEPTOR_FN`), using a pattern which guarantees that if these providers are\n  // included multiple times, all of the multi-provider entries will have the same instance of the\n  // interceptor function. That way, the `HttpINterceptorHandler` will dedup them and legacy\n  // interceptors will not run multiple times.\n  return makeHttpFeature(HttpFeatureKind.LegacyInterceptors, [\n    {\n      provide: LEGACY_INTERCEPTOR_FN,\n      useFactory: legacyInterceptorFnFactory,\n    },\n    {\n      provide: HTTP_INTERCEPTOR_FNS,\n      useExisting: LEGACY_INTERCEPTOR_FN,\n      multi: true,\n    },\n  ]);\n}\n\n/**\n * Customizes the XSRF protection for the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withNoXsrfProtection` feature.\n *\n * @see {@link provideHttpClient}\n */\nexport function withXsrfConfiguration({\n  cookieName,\n  headerName,\n}: {\n  cookieName?: string;\n  headerName?: string;\n}): HttpFeature<HttpFeatureKind.CustomXsrfConfiguration> {\n  const providers: Provider[] = [];\n  if (cookieName !== undefined) {\n    providers.push({provide: XSRF_COOKIE_NAME, useValue: cookieName});\n  }\n  if (headerName !== undefined) {\n    providers.push({provide: XSRF_HEADER_NAME, useValue: headerName});\n  }\n\n  return makeHttpFeature(HttpFeatureKind.CustomXsrfConfiguration, providers);\n}\n\n/**\n * Disables XSRF protection in the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withXsrfConfiguration` feature.\n *\n * @see {@link provideHttpClient}\n */\nexport function withNoXsrfProtection(): HttpFeature<HttpFeatureKind.NoXsrfProtection> {\n  return makeHttpFeature(HttpFeatureKind.NoXsrfProtection, [\n    {\n      provide: XSRF_ENABLED,\n      useValue: false,\n    },\n  ]);\n}\n\n/**\n * Add JSONP support to the configuration of the current `HttpClient` instance.\n *\n * @see {@link provideHttpClient}\n */\nexport function withJsonpSupport(): HttpFeature<HttpFeatureKind.JsonpSupport> {\n  return makeHttpFeature(HttpFeatureKind.JsonpSupport, [\n    JsonpClientBackend,\n    {provide: JsonpCallbackContext, useFactory: jsonpCallbackContext},\n    {provide: HTTP_INTERCEPTOR_FNS, useValue: jsonpInterceptorFn, multi: true},\n  ]);\n}\n\n/**\n * Configures the current `HttpClient` instance to make requests via the parent injector's\n * `HttpClient` instead of directly.\n *\n * By default, `provideHttpClient` configures `HttpClient` in its injector to be an independent\n * instance. For example, even if `HttpClient` is configured in the parent injector with\n * one or more interceptors, they will not intercept requests made via this instance.\n *\n * With this option enabled, once the request has passed through the current injector's\n * interceptors, it will be delegated to the parent injector's `HttpClient` chain instead of\n * dispatched directly, and interceptors in the parent configuration will be applied to the request.\n *\n * If there are several `HttpClient` instances in the injector hierarchy, it's possible for\n * `withRequestsMadeViaParent` to be used at multiple levels, which will cause the request to\n * \"bubble up\" until either reaching the root level or an `HttpClient` which was not configured with\n * this option.\n *\n * @see {@link provideHttpClient}\n * @publicApi\n */\nexport function withRequestsMadeViaParent(): HttpFeature<HttpFeatureKind.RequestsMadeViaParent> {\n  return makeHttpFeature(HttpFeatureKind.RequestsMadeViaParent, [\n    {\n      provide: HttpBackend,\n      useFactory: () => {\n        const handlerFromParent = inject(HttpHandler, {skipSelf: true, optional: true});\n        if (ngDevMode && handlerFromParent === null) {\n          throw new Error(\n            'withRequestsMadeViaParent() can only be used when the parent injector also configures HttpClient',\n          );\n        }\n        return handlerFromParent;\n      },\n    },\n  ]);\n}\n\n/**\n * Configures the current `HttpClient` instance to make requests using the fetch API.\n *\n * Note: The Fetch API doesn't support progress report on uploads.\n *\n * @publicApi\n */\nexport function withFetch(): HttpFeature<HttpFeatureKind.Fetch> {\n  return makeHttpFeature(HttpFeatureKind.Fetch, [\n    FetchBackend,\n    {provide: FETCH_BACKEND, useExisting: FetchBackend},\n    {provide: HttpBackend, useExisting: FetchBackend},\n  ]);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ModuleWithProviders, NgModule} from '@angular/core';\n\nimport {HTTP_INTERCEPTORS} from './interceptor';\nimport {\n  provideHttpClient,\n  withInterceptorsFromDi,\n  withJsonpSupport,\n  withNoXsrfProtection,\n  withXsrfConfiguration,\n} from './provider';\nimport {\n  HttpXsrfCookieExtractor,\n  HttpXsrfInterceptor,\n  HttpXsrfTokenExtractor,\n  XSRF_DEFAULT_COOKIE_NAME,\n  XSRF_DEFAULT_HEADER_NAME,\n  XSRF_ENABLED,\n} from './xsrf';\n\n/**\n * Configures XSRF protection support for outgoing requests.\n *\n * For a server that supports a cookie-based XSRF protection system,\n * use directly to configure XSRF protection with the correct\n * cookie and header names.\n *\n * If no names are supplied, the default cookie name is `XSRF-TOKEN`\n * and the default header name is `X-XSRF-TOKEN`.\n *\n * @publicApi\n * @deprecated Use withXsrfConfiguration({cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN'}) as\n *     providers instead or `withNoXsrfProtection` if you want to disabled XSRF protection.\n */\n@NgModule({\n  providers: [\n    HttpXsrfInterceptor,\n    {provide: HTTP_INTERCEPTORS, useExisting: HttpXsrfInterceptor, multi: true},\n    {provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor},\n    withXsrfConfiguration({\n      cookieName: XSRF_DEFAULT_COOKIE_NAME,\n      headerName: XSRF_DEFAULT_HEADER_NAME,\n    }).ɵproviders,\n    {provide: XSRF_ENABLED, useValue: true},\n  ],\n})\nexport class HttpClientXsrfModule {\n  /**\n   * Disable the default XSRF protection.\n   */\n  static disable(): ModuleWithProviders<HttpClientXsrfModule> {\n    return {\n      ngModule: HttpClientXsrfModule,\n      providers: [withNoXsrfProtection().ɵproviders],\n    };\n  }\n\n  /**\n   * Configure XSRF protection.\n   * @param options An object that can specify either or both\n   * cookie name or header name.\n   * - Cookie name default is `XSRF-TOKEN`.\n   * - Header name default is `X-XSRF-TOKEN`.\n   *\n   */\n  static withOptions(\n    options: {\n      cookieName?: string;\n      headerName?: string;\n    } = {},\n  ): ModuleWithProviders<HttpClientXsrfModule> {\n    return {\n      ngModule: HttpClientXsrfModule,\n      providers: withXsrfConfiguration(options).ɵproviders,\n    };\n  }\n}\n\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for XSRF. Automatically imported by `HttpClientModule`.\n *\n * You can add interceptors to the chain behind `HttpClient` by binding them to the\n * multiprovider for built-in DI token `HTTP_INTERCEPTORS`.\n *\n * @publicApi\n * @deprecated use `provideHttpClient(withInterceptorsFromDi())` as providers instead\n */\n@NgModule({\n  /**\n   * Configures the dependency injector where it is imported\n   * with supporting services for HTTP communications.\n   */\n  providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class HttpClientModule {}\n\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for JSONP.\n * Without this module, Jsonp requests reach the backend\n * with method JSONP, where they are rejected.\n *\n * @publicApi\n * @deprecated `withJsonpSupport()` as providers instead\n */\n@NgModule({\n  providers: [withJsonpSupport().ɵproviders],\n})\nexport class HttpClientJsonpModule {}\n"],"names":["RuntimeError","i1.HttpHandler","XSSI_PREFIX","getResponseUrl","PendingTasks","Console","formatRuntimeError","i1.HttpBackend","i1.XhrFactory"],"mappings":";;;;;;;;;;;;;AAaA;;;;;;;;;;;AAWG;MACmB,WAAW,CAAA;AAEhC;AAED;;;;;;;;;AASG;MACmB,WAAW,CAAA;AAEhC;;AC3BD;;;;;;AAMG;MACU,WAAW,CAAA;AACtB;;AAEG;AACK,IAAA,OAAO;AAEf;;;AAGG;AACK,IAAA,eAAe,GAAwB,IAAI,GAAG,EAAE;AAExD;;AAEG;AACK,IAAA,QAAQ;AAEhB;;AAEG;IACK,UAAU,GAAoB,IAAI;;AAI1C,IAAA,WAAA,CACE,OAAoF,EAAA;QAEpF,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAoB;;AACrC,aAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACtC,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAK;AACnB,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAoB;gBAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;oBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/B,oBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;wBACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AACjC,wBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;AAC1C,wBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;;AAEpC,iBAAC,CAAC;AACJ,aAAC;;aACI,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,YAAY,OAAO,EAAE;AACvE,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAoB;YAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,IAAY,KAAI;AAC9C,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;AAClC,aAAC,CAAC;;aACG;AACL,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAK;AACnB,gBAAA,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,EAAE;oBACjD,kBAAkB,CAAC,OAAO,CAAC;;AAE7B,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAoB;AAC1C,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,KAAI;AACjD,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC;AACrC,iBAAC,CAAC;AACJ,aAAC;;;AAIL;;;;;;AAMG;AACH,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,IAAI,CAAC,IAAI,EAAE;QAEX,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;;AAG7C;;;;;;AAMG;AACH,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,IAAI,CAAC,IAAI,EAAE;AAEX,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACnD,QAAA,OAAO,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;;AAGvD;;;;AAIG;IACH,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,EAAE;QAEX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;;AAGlD;;;;;;AAMG;AACH,IAAA,MAAM,CAAC,IAAY,EAAA;QACjB,IAAI,CAAC,IAAI,EAAE;AAEX,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI;;AAGrD;;;;;;;;AAQG;IAEH,MAAM,CAAC,IAAY,EAAE,KAAwB,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;;AAE3C;;;;;;;;;AASG;IACH,GAAG,CAAC,IAAY,EAAE,KAAwB,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;;AAE3C;;;;;;;AAOG;IACH,MAAM,CAAC,IAAY,EAAE,KAAyB,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;;IAGnC,sBAAsB,CAAC,IAAY,EAAE,MAAc,EAAA;QACzD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;;;IAIlC,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE;AACnB,YAAA,IAAI,IAAI,CAAC,QAAQ,YAAY,WAAW,EAAE;AACxC,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;;iBACvB;gBACL,IAAI,CAAC,QAAQ,EAAE;;AAEjB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE;AACrB,gBAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7D,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;;;AAKpB,IAAA,QAAQ,CAAC,KAAkB,EAAA;QACjC,KAAK,CAAC,IAAI,EAAE;AACZ,QAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC/C,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AAChE,SAAC,CAAC;;AAGI,IAAA,KAAK,CAAC,MAAc,EAAA;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE;QAC/B,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,YAAY,WAAW,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI;AAC/F,QAAA,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3D,QAAA,OAAO,KAAK;;AAGN,IAAA,WAAW,CAAC,MAAc,EAAA;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;AACrC,QAAA,QAAQ,MAAM,CAAC,EAAE;AACf,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACN,gBAAA,IAAI,KAAK,GAAG,MAAM,CAAC,KAAM;AACzB,gBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,oBAAA,KAAK,GAAG,CAAC,KAAK,CAAC;;AAEjB,gBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtB;;gBAEF,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC7C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,KAAK,EAAE;AAC1E,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;gBAC3B;AACF,YAAA,KAAK,GAAG;AACN,gBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,KAA2B;gBACnD,IAAI,CAAC,QAAQ,EAAE;AACb,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACxB,oBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;;qBAC3B;oBACL,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBACpC,IAAI,CAAC,QAAQ,EAAE;wBACb;;oBAEF,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AACrE,oBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,wBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACxB,wBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;;yBAC3B;wBACL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;;;gBAGnC;;;IAIE,cAAc,CAAC,IAAY,EAAE,KAAa,EAAA;AAChD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC;;aAC7B;YACL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;;;IAI1B,gBAAgB,CAAC,IAAY,EAAE,MAAW,EAAA;AAChD,QAAA,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,KACzE,KAAK,CAAC,QAAQ,EAAE,CACjB;AACD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC;AACnC,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC;;AAGxC;;AAEG;AACH,IAAA,OAAO,CAAC,EAA4C,EAAA;QAClD,IAAI,CAAC,IAAI,EAAE;AACX,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAClD,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAE,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAC3D;;AAEJ;AAED;;;;AAIG;AACH,SAAS,kBAAkB,CACzB,OAA0C,EAAA;AAE1C,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAClD,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACtF,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,0BAAA,EAA6B,GAAG,CAAsB,oBAAA,CAAA;gBACpD,CAA+D,4DAAA,EAAA,KAAK,CAAK,GAAA,CAAA,CAC5E;;;AAGP;;ACvQA;;;;;;;;;AASG;MACU,oBAAoB,CAAA;AAC/B;;;;AAIG;AACH,IAAA,SAAS,CAAC,GAAW,EAAA;AACnB,QAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC;;AAG9B;;;;AAIG;AACH,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,OAAO,gBAAgB,CAAC,KAAK,CAAC;;AAGhC;;;;AAIG;AACH,IAAA,SAAS,CAAC,GAAW,EAAA;AACnB,QAAA,OAAO,kBAAkB,CAAC,GAAG,CAAC;;AAGhC;;;;AAIG;AACH,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,OAAO,kBAAkB,CAAC,KAAK,CAAC;;AAEnC;AAED,SAAS,WAAW,CAAC,SAAiB,EAAE,KAAyB,EAAA;AAC/D,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB;AACvC,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;;;;AAIxB,QAAA,MAAM,MAAM,GAAa,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAChE,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAa,KAAI;YAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAChC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GACd,KAAK,IAAI;kBACL,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE;AAC7B,kBAAE,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACzF,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACd,YAAA,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;AACpB,SAAC,CAAC;;AAEJ,IAAA,OAAO,GAAG;AACZ;AAEA;;AAEG;AACH,MAAM,uBAAuB,GAAG,iBAAiB;AACjD,MAAM,8BAA8B,GAA0B;AAC5D,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;CACV;AAED,SAAS,gBAAgB,CAAC,CAAS,EAAA;IACjC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAClC,uBAAuB,EACvB,CAAC,CAAC,EAAE,CAAC,KAAK,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,CACjD;AACH;AAEA,SAAS,aAAa,CAAC,KAAgC,EAAA;IACrD,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE;AACnB;AA6BA;;;;;;;AAOG;MACU,UAAU,CAAA;AACb,IAAA,GAAG;AACH,IAAA,OAAO;IACP,OAAO,GAAoB,IAAI;IAC/B,SAAS,GAAsB,IAAI;AAE3C,IAAA,WAAA,CAAY,UAA6B,EAAuB,EAAA;QAC9D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,oBAAoB,EAAE;AAC5D,QAAA,IAAI,OAAO,CAAC,UAAU,EAAE;AACtB,YAAA,IAAI,OAAO,CAAC,UAAU,EAAE;AACtB,gBAAA,MAAM,IAAIA,aAAY,CAAA,IAAA,yEAEpB,SAAS,IAAI,gDAAgD,CAC9D;;AAEH,YAAA,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC;;AACnD,aAAA,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE;AAC/B,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAoB;AACtC,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;gBAC9C,MAAM,KAAK,GAAI,OAAO,CAAC,UAAkB,CAAC,GAAG,CAAC;;gBAE9C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACvF,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;AAC5B,aAAC,CAAC;;aACG;AACL,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI;;;AAInB;;;;;AAKG;AACH,IAAA,GAAG,CAAC,KAAa,EAAA;QACf,IAAI,CAAC,IAAI,EAAE;QACX,OAAO,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG7B;;;;;AAKG;AACH,IAAA,GAAG,CAAC,KAAa,EAAA;QACf,IAAI,CAAC,IAAI,EAAE;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI;;AAG9B;;;;;AAKG;AACH,IAAA,MAAM,CAAC,KAAa,EAAA;QAClB,IAAI,CAAC,IAAI,EAAE;QACX,OAAO,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI;;AAGrC;;;AAGG;IACH,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,EAAE;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAI,CAAC,IAAI,EAAE,CAAC;;AAGrC;;;;;AAKG;IACH,MAAM,CAAC,KAAa,EAAE,KAAgC,EAAA;AACpD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;;AAG5C;;;;AAIG;AACH,IAAA,SAAS,CAAC,MAET,EAAA;QACC,MAAM,OAAO,GAAa,EAAE;QAC5B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACpC,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3B,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AACvB,oBAAA,OAAO,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;AAC/C,iBAAC,CAAC;;iBACG;AACL,gBAAA,OAAO,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,KAAK,EAAE,KAAkC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;;AAE7E,SAAC,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;;AAG5B;;;;;AAKG;IACH,GAAG,CAAC,KAAa,EAAE,KAAgC,EAAA;AACjD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;;AAG5C;;;;;;AAMG;IACH,MAAM,CAAC,KAAa,EAAE,KAAiC,EAAA;AACrD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;;AAG5C;;;AAGG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,EAAE;AACX,QAAA,QACE,IAAI,CAAC,IAAI;AACN,aAAA,GAAG,CAAC,CAAC,GAAG,KAAI;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;;;;AAIxC,YAAA,OAAO,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,GAAG;AACrB,iBAAA,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;iBAC3D,IAAI,CAAC,GAAG,CAAC;AACd,SAAC;;;aAGA,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,EAAE;AAC9B,aAAA,IAAI,CAAC,GAAG,CAAC;;AAIR,IAAA,KAAK,CAAC,MAAyB,EAAA;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAsB,CAAC;QAC1E,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI;AACxC,QAAA,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;AACnD,QAAA,OAAO,KAAK;;IAGN,IAAI,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE;AACrB,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAoB;;AAExC,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAC3B,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACrB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAU,CAAC,GAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC;YAC1F,IAAI,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AAC/B,gBAAA,QAAQ,MAAM,CAAC,EAAE;AACf,oBAAA,KAAK,GAAG;AACR,oBAAA,KAAK,GAAG;AACN,wBAAA,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,KAAK,EAAE;wBAChF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;wBACvC,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;wBACjC;AACF,oBAAA,KAAK,GAAG;AACN,wBAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;AAC9B,4BAAA,IAAI,IAAI,GAAG,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;AAC5C,4BAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrD,4BAAA,IAAI,GAAG,KAAK,EAAE,EAAE;AACd,gCAAA,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;;AAErB,4BAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gCACnB,IAAI,CAAC,GAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;;iCAC5B;gCACL,IAAI,CAAC,GAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;;;6BAE3B;4BACL,IAAI,CAAC,GAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;4BAC9B;;;AAGR,aAAC,CAAC;YACF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI;;;AAGzC;;ACrVD;;;;AAIG;MACU,gBAAgB,CAAA;AACC,IAAA,YAAA;AAA5B,IAAA,WAAA,CAA4B,YAAqB,EAAA;QAArB,IAAY,CAAA,YAAA,GAAZ,YAAY;;AACzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;MACU,WAAW,CAAA;AACL,IAAA,GAAG,GAAG,IAAI,GAAG,EAAsC;AAEpE;;;;;;;AAOG;IACH,GAAG,CAAI,KAA0B,EAAE,KAAQ,EAAA;QACzC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AAC1B,QAAA,OAAO,IAAI;;AAGb;;;;;;AAMG;AACH,IAAA,GAAG,CAAI,KAA0B,EAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;;QAE3C,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAM;;AAGjC;;;;;;AAMG;AACH,IAAA,MAAM,CAAC,KAAgC,EAAA;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AACtB,QAAA,OAAO,IAAI;;AAGb;;;;;;AAMG;AACH,IAAA,GAAG,CAAC,KAAgC,EAAA;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG5B;;AAEG;IACH,IAAI,GAAA;AACF,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;;AAEzB;;AClFD;;AAEG;AACH,SAAS,aAAa,CAAC,MAAc,EAAA;IACnC,QAAQ,MAAM;AACZ,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,KAAK;AACV,QAAA,KAAK,MAAM;AACX,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,KAAK;AACd,QAAA;AACE,YAAA,OAAO,IAAI;;AAEjB;AAEA;;;;AAIG;AACH,SAAS,aAAa,CAAC,KAAU,EAAA;IAC/B,OAAO,OAAO,WAAW,KAAK,WAAW,IAAI,KAAK,YAAY,WAAW;AAC3E;AAEA;;;;AAIG;AACH,SAAS,MAAM,CAAC,KAAU,EAAA;IACxB,OAAO,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI;AAC7D;AAEA;;;;AAIG;AACH,SAAS,UAAU,CAAC,KAAU,EAAA;IAC5B,OAAO,OAAO,QAAQ,KAAK,WAAW,IAAI,KAAK,YAAY,QAAQ;AACrE;AAEA;;;;AAIG;AACH,SAAS,iBAAiB,CAAC,KAAU,EAAA;IACnC,OAAO,OAAO,eAAe,KAAK,WAAW,IAAI,KAAK,YAAY,eAAe;AACnF;AAEA;;;;AAIG;AACI,MAAM,mBAAmB,GAAG,cAAc;AAEjD;;;AAGG;AACI,MAAM,aAAa,GAAG,QAAQ;AAErC;;;;AAIG;AACI,MAAM,oBAAoB,GAAG,eAAe;AAEnD;;;;AAIG;AACI,MAAM,iBAAiB,GAAG,YAAY;AAE7C;;;AAGG;AACI,MAAM,iBAAiB,GAAG,kBAAkB;AAEnD;;;;;AAKG;AACI,MAAM,mBAAmB,GAAG,GAAG,iBAAiB,CAAA,EAAA,EAAK,iBAAiB,CAAA,KAAA,CAAO;AAEpF;;;;;;;;;AASG;MACU,WAAW,CAAA;AAkKX,IAAA,GAAA;AAjKX;;;;;;AAMG;IACM,IAAI,GAAa,IAAI;AAE9B;;AAEG;AACM,IAAA,OAAO;AAEhB;;AAEG;AACM,IAAA,OAAO;AAEhB;;;;;;;AAOG;IACM,cAAc,GAAY,KAAK;AAExC;;AAEG;IACM,eAAe,GAAY,KAAK;AAEzC;;;;;AAKG;IACM,YAAY,GAA6C,MAAM;AAExE;;AAEG;AACM,IAAA,MAAM;AAEf;;;;;;;;;AASG;AACM,IAAA,MAAM;AAEf;;AAEG;AACM,IAAA,aAAa;AAEtB;;AAEG;AACM,IAAA,aAAa;AA4FtB,IAAA,WAAA,CACE,MAAc,EACL,GAAW,EACpB,KAWQ,EACR,MAQC,EAAA;QArBQ,IAAG,CA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"}Mo
xTV/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { ɵnormalizeQueryParams as _normalizeQueryParams, LocationStrategy } from '@angular/common';
import * as i0 from '@angular/core';
import { InjectionToken, inject, Inject, Optional, Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { PlatformNavigation } from './platform_navigation-B45Jeakb.mjs';
import { ɵFakeNavigation as _FakeNavigation } from '@angular/core/testing';
export { ɵFakeNavigation } from '@angular/core/testing';
import { PlatformLocation, Location, LocationStrategy as LocationStrategy$1 } from './location-Dq4mJT-A.mjs';
import { DOCUMENT } from './dom_tokens-rA0ACyx7.mjs';

/**
 * Parser from https://tools.ietf.org/html/rfc3986#appendix-B
 * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 *  12            3  4          5       6  7        8 9
 *
 * Example: http://www.ics.uci.edu/pub/ietf/uri/#Related
 *
 * Results in:
 *
 * $1 = http:
 * $2 = http
 * $3 = //www.ics.uci.edu
 * $4 = www.ics.uci.edu
 * $5 = /pub/ietf/uri/
 * $6 = <undefined>
 * $7 = <undefined>
 * $8 = #Related
 * $9 = Related
 */
const urlParse = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;
function parseUrl(urlStr, baseHref) {
    const verifyProtocol = /^((http[s]?|ftp):\/\/)/;
    let serverBase;
    // URL class requires full URL. If the URL string doesn't start with protocol, we need to add
    // an arbitrary base URL which can be removed afterward.
    if (!verifyProtocol.test(urlStr)) {
        serverBase = 'http://empty.com/';
    }
    let parsedUrl;
    try {
        parsedUrl = new URL(urlStr, serverBase);
    }
    catch (e) {
        const result = urlParse.exec(serverBase || '' + urlStr);
        if (!result) {
            throw new Error(`Invalid URL: ${urlStr} with base: ${baseHref}`);
        }
        const hostSplit = result[4].split(':');
        parsedUrl = {
            protocol: result[1],
            hostname: hostSplit[0],
            port: hostSplit[1] || '',
            pathname: result[5],
            search: result[6],
            hash: result[8],
        };
    }
    if (parsedUrl.pathname && parsedUrl.pathname.indexOf(baseHref) === 0) {
        parsedUrl.pathname = parsedUrl.pathname.substring(baseHref.length);
    }
    return {
        hostname: (!serverBase && parsedUrl.hostname) || '',
        protocol: (!serverBase && parsedUrl.protocol) || '',
        port: (!serverBase && parsedUrl.port) || '',
        pathname: parsedUrl.pathname || '/',
        search: parsedUrl.search || '',
        hash: parsedUrl.hash || '',
    };
}
/**
 * Provider for mock platform location config
 *
 * @publicApi
 */
const MOCK_PLATFORM_LOCATION_CONFIG = new InjectionToken('MOCK_PLATFORM_LOCATION_CONFIG');
/**
 * Mock implementation of URL state.
 *
 * @publicApi
 */
class MockPlatformLocation {
    baseHref = '';
    hashUpdate = new Subject();
    popStateSubject = new Subject();
    urlChangeIndex = 0;
    urlChanges = [{ hostname: '', protocol: '', port: '', pathname: '/', search: '', hash: '', state: null }];
    constructor(config) {
        if (config) {
            this.baseHref = config.appBaseHref || '';
            const parsedChanges = this.parseChanges(null, config.startUrl || 'http://_empty_/', this.baseHref);
            this.urlChanges[0] = { ...parsedChanges };
        }
    }
    get hostname() {
        return this.urlChanges[this.urlChangeIndex].hostname;
    }
    get protocol() {
        return this.urlChanges[this.urlChangeIndex].protocol;
    }
    get port() {
        return this.urlChanges[this.urlChangeIndex].port;
    }
    get pathname() {
        return this.urlChanges[this.urlChangeIndex].pathname;
    }
    get search() {
        return this.urlChanges[this.urlChangeIndex].search;
    }
    get hash() {
        return this.urlChanges[this.urlChangeIndex].hash;
    }
    get state() {
        return this.urlChanges[this.urlChangeIndex].state;
    }
    getBaseHrefFromDOM() {
        return this.baseHref;
    }
    onPopState(fn) {
        const subscription = this.popStateSubject.subscribe(fn);
        return () => subscription.unsubscribe();
    }
    onHashChange(fn) {
        const subscription = this.hashUpdate.subscribe(fn);
        return () => subscription.unsubscribe();
    }
    get href() {
        let url = `${this.protocol}//${this.hostname}${this.port ? ':' + this.port : ''}`;
        url += `${this.pathname === '/' ? '' : this.pathname}${this.search}${this.hash}`;
        return url;
    }
    get url() {
        return `${this.pathname}${this.search}${this.hash}`;
    }
    parseChanges(state, url, baseHref = '') {
        // When the `history.state` value is stored, it is always copied.
        state = JSON.parse(JSON.stringify(state));
        return { ...parseUrl(url, baseHref), state };
    }
    replaceState(state, title, newUrl) {
        const { pathname, search, state: parsedState, hash } = this.parseChanges(state, newUrl);
        this.urlChanges[this.urlChangeIndex] = {
            ...this.urlChanges[this.urlChangeIndex],
            pathname,
            search,
            hash,
            state: parsedState,
        };
    }
    pushState(state, title, newUrl) {
        const { pathname, search, state: parsedState, hash } = this.parseChanges(state, newUrl);
        if (this.urlChangeIndex > 0) {
            this.urlChanges.splice(this.urlChangeIndex + 1);
        }
        this.urlChanges.push({
            ...this.urlChanges[this.urlChangeIndex],
            pathname,
            search,
            hash,
            state: parsedState,
        });
        this.urlChangeIndex = this.urlChanges.length - 1;
    }
    forward() {
        const oldUrl = this.url;
        const oldHash = this.hash;
        if (this.urlChangeIndex < this.urlChanges.length) {
            this.urlChangeIndex++;
        }
        this.emitEvents(oldHash, oldUrl);
    }
    back() {
        const oldUrl = this.url;
        const oldHash = this.hash;
        if (this.urlChangeIndex > 0) {
            this.urlChangeIndex--;
        }
        this.emitEvents(oldHash, oldUrl);
    }
    historyGo(relativePosition = 0) {
        const oldUrl = this.url;
        const oldHash = this.hash;
        const nextPageIndex = this.urlChangeIndex + relativePosition;
        if (nextPageIndex >= 0 && nextPageIndex < this.urlChanges.length) {
            this.urlChangeIndex = nextPageIndex;
        }
        this.emitEvents(oldHash, oldUrl);
    }
    getState() {
        return this.state;
    }
    /**
     * Browsers are inconsistent in when they fire events and perform the state updates
     * The most easiest thing to do in our mock is synchronous and that happens to match
     * Firefox and Chrome, at least somewhat closely
     *
     * https://github.com/WICG/navigation-api#watching-for-navigations
     * https://docs.google.com/document/d/1Pdve-DJ1JCGilj9Yqf5HxRJyBKSel5owgOvUJqTauwU/edit#heading=h.3ye4v71wsz94
     * popstate is always sent before hashchange:
     * https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#when_popstate_is_sent
     */
    emitEvents(oldHash, oldUrl) {
        this.popStateSubject.next({
            type: 'popstate',
            state: this.getState(),
            oldUrl,
            newUrl: this.url,
        });
        if (oldHash !== this.hash) {
            this.hashUpdate.next({
                type: 'hashchange',
                state: null,
                oldUrl,
                newUrl: this.url,
            });
        }
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: MockPlatformLocation, deps: [{ token: MOCK_PLATFORM_LOCATION_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: MockPlatformLocation });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: MockPlatformLocation, decorators: [{
            type: Injectable
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Inject,
                    args: [MOCK_PLATFORM_LOCATION_CONFIG]
                }, {
                    type: Optional
                }] }] });
/**
 * Mock implementation of URL state.
 */
class FakeNavigationPlatformLocation {
    _platformNavigation;
    constructor() {
        const platformNavigation = inject(PlatformNavigation);
        if (!(platformNavigation instanceof _FakeNavigation)) {
            throw new Error('FakePlatformNavigation cannot be used without FakeNavigation. Use ' +
                '`provideFakeNavigation` to have all these services provided together.');
        }
        this._platformNavigation = platformNavigation;
    }
    config = inject(MOCK_PLATFORM_LOCATION_CONFIG, { optional: true });
    getBaseHrefFromDOM() {
        return this.config?.appBaseHref ?? '';
    }
    onPopState(fn) {
        this._platformNavigation.window.addEventListener('popstate', fn);
        return () => this._platformNavigation.window.removeEventListener('popstate', fn);
    }
    onHashChange(fn) {
        this._platformNavigation.window.addEventListener('hashchange', fn);
        return () => this._platformNavigation.window.removeEventListener('hashchange', fn);
    }
    get href() {
        return this._platformNavigation.currentEntry.url;
    }
    get protocol() {
        return new URL(this._platformNavigation.currentEntry.url).protocol;
    }
    get hostname() {
        return new URL(this._platformNavigation.currentEntry.url).hostname;
    }
    get port() {
        return new URL(this._platformNavigation.currentEntry.url).port;
    }
    get pathname() {
        return new URL(this._platformNavigation.currentEntry.url).pathname;
    }
    get search() {
        return new URL(this._platformNavigation.currentEntry.url).search;
    }
    get hash() {
        return new URL(this._platformNavigation.currentEntry.url).hash;
    }
    pushState(state, title, url) {
        this._platformNavigation.pushState(state, title, url);
    }
    replaceState(state, title, url) {
        this._platformNavigation.replaceState(state, title, url);
    }
    forward() {
        this._platformNavigation.forward();
    }
    back() {
        this._platformNavigation.back();
    }
    historyGo(relativePosition = 0) {
        this._platformNavigation.go(relativePosition);
    }
    getState() {
        return this._platformNavigation.currentEntry.getHistoryState();
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FakeNavigationPlatformLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FakeNavigationPlatformLocation });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FakeNavigationPlatformLocation, decorators: [{
            type: Injectable
        }], ctorParameters: () => [] });

const FAKE_NAVIGATION = new InjectionToken('fakeNavigation', {
    providedIn: 'root',
    factory: () => {
        const config = inject(MOCK_PLATFORM_LOCATION_CONFIG, { optional: true });
        const baseFallback = 'http://_empty_/';
        const startUrl = new URL(config?.startUrl || baseFallback, baseFallback);
        // TODO(atscott): If we want to replace MockPlatformLocation with FakeNavigationPlatformLocation
        // as the default in TestBed, we will likely need to use setSynchronousTraversalsForTesting(true);
        return new _FakeNavigation(inject(DOCUMENT), startUrl.href);
    },
});
/**
 * Return a provider for the `FakeNavigation` in place of the real Navigation API.
 */
function provideFakePlatformNavigation() {
    return [
        {
            provide: PlatformNavigation,
            useFactory: () => inject(FAKE_NAVIGATION),
        },
        { provide: PlatformLocation, useClass: FakeNavigationPlatformLocation },
    ];
}

/**
 * A spy for {@link Location} that allows tests to fire simulated location events.
 *
 * @publicApi
 */
class SpyLocation {
    urlChanges = [];
    _history = [new LocationState('', '', null)];
    _historyIndex = 0;
    /** @internal */
    _subject = new Subject();
    /** @internal */
    _basePath = '';
    /** @internal */
    _locationStrategy = null;
    /** @internal */
    _urlChangeListeners = [];
    /** @internal */
    _urlChangeSubscription = null;
    /** @docs-private */
    ngOnDestroy() {
        this._urlChangeSubscription?.unsubscribe();
        this._urlChangeListeners = [];
    }
    setInitialPath(url) {
        this._history[this._historyIndex].path = url;
    }
    setBaseHref(url) {
        this._basePath = url;
    }
    path() {
        return this._history[this._historyIndex].path;
    }
    getState() {
        return this._history[this._historyIndex].state;
    }
    isCurrentPathEqualTo(path, query = '') {
        const givenPath = path.endsWith('/') ? path.substring(0, path.length - 1) : path;
        const currPath = this.path().endsWith('/')
            ? this.path().substring(0, this.path().length - 1)
            : this.path();
        return currPath == givenPath + (query.length > 0 ? '?' + query : '');
    }
    simulateUrlPop(pathname) {
        this._subject.next({ 'url': pathname, 'pop': true, 'type': 'popstate' });
    }
    simulateHashChange(pathname) {
        const path = this.prepareExternalUrl(pathname);
        this.pushHistory(path, '', null);
        this.urlChanges.push('hash: ' + pathname);
        // the browser will automatically fire popstate event before each `hashchange` event, so we need
        // to simulate it.
        this._subject.next({ 'url': pathname, 'pop': true, 'type': 'popstate' });
        this._subject.next({ 'url': pathname, 'pop': true, 'type': 'hashchange' });
    }
    prepareExternalUrl(url) {
        if (url.length > 0 && !url.startsWith('/')) {
            url = '/' + url;
        }
        return this._basePath + url;
    }
    go(path, query = '', state = null) {
        path = this.prepareExternalUrl(path);
        this.pushHistory(path, query, state);
        const locationState = this._history[this._historyIndex - 1];
        if (locationState.path == path && locationState.query == query) {
            return;
        }
        const url = path + (query.length > 0 ? '?' + query : '');
        this.urlChanges.push(url);
        this._notifyUrlChangeListeners(path + _normalizeQueryParams(query), state);
    }
    replaceState(path, query = '', state = null) {
        path = this.prepareExternalUrl(path);
        const history = this._history[this._historyIndex];
        history.state = state;
        if (history.path == path && history.query == query) {
            return;
        }
        history.path = path;
        history.query = query;
        const url = path + (query.length > 0 ? '?' + query : '');
        this.urlChanges.push('replace: ' + url);
        this._notifyUrlChangeListeners(path + _normalizeQueryParams(query), state);
    }
    forward() {
        if (this._historyIndex < this._history.length - 1) {
            this._historyIndex++;
            this._subject.next({
                'url': this.path(),
                'state': this.getState(),
                'pop': true,
                'type': 'popstate',
            });
        }
    }
    back() {
        if (this._historyIndex > 0) {
            this._historyIndex--;
            this._subject.next({
                'url': this.path(),
                'state': this.getState(),
                'pop': true,
                'type': 'popstate',
            });
        }
    }
    historyGo(relativePosition = 0) {
        const nextPageIndex = this._historyIndex + relativePosition;
        if (nextPageIndex >= 0 && nextPageIndex < this._history.length) {
            this._historyIndex = nextPageIndex;
            this._subject.next({
                'url': this.path(),
                'state': this.getState(),
                'pop': true,
                'type': 'popstate',
            });
        }
    }
    onUrlChange(fn) {
        this._urlChangeListeners.push(fn);
        this._urlChangeSubscription ??= this.subscribe((v) => {
            this._notifyUrlChangeListeners(v.url, v.state);
        });
        return () => {
            const fnIndex = this._urlChangeListeners.indexOf(fn);
            this._urlChangeListeners.splice(fnIndex, 1);
            if (this._urlChangeListeners.length === 0) {
                this._urlChangeSubscription?.unsubscribe();
                this._urlChangeSubscription = null;
            }
        };
    }
    /** @internal */
    _notifyUrlChangeListeners(url = '', state) {
        this._urlChangeListeners.forEach((fn) => fn(url, state));
    }
    subscribe(onNext, onThrow, onReturn) {
        return this._subject.subscribe({
            next: onNext,
            error: onThrow ?? undefined,
            complete: onReturn ?? undefined,
        });
    }
    normalize(url) {
        return null;
    }
    pushHistory(path, query, state) {
        if (this._historyIndex > 0) {
            this._history.splice(this._historyIndex + 1);
        }
        this._history.push(new LocationState(path, query, state));
        this._historyIndex = this._history.length - 1;
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SpyLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SpyLocation });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SpyLocation, decorators: [{
            type: Injectable
        }] });
class LocationState {
    path;
    query;
    state;
    constructor(path, query, state) {
        this.path = path;
        this.query = query;
        this.state = state;
    }
}

/**
 * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated
 * location events.
 *
 * @publicApi
 */
class MockLocationStrategy extends LocationStrategy {
    internalBaseHref = '/';
    internalPath = '/';
    internalTitle = '';
    urlChanges = [];
    /** @internal */
    _subject = new Subject();
    stateChanges = [];
    constructor() {
        super();
    }
    simulatePopState(url) {
        this.internalPath = url;
        this._subject.next(new _MockPopStateEvent(this.path()));
    }
    path(includeHash = false) {
        return this.internalPath;
    }
    prepareExternalUrl(internal) {
        if (internal.startsWith('/') && this.internalBaseHref.endsWith('/')) {
            return this.internalBaseHref + internal.substring(1);
        }
        return this.internalBaseHref + internal;
    }
    pushState(ctx, title, path, query) {
        // Add state change to changes array
        this.stateChanges.push(ctx);
        this.internalTitle = title;
        const url = path + (query.length > 0 ? '?' + query : '');
        this.internalPath = url;
        const externalUrl = this.prepareExternalUrl(url);
        this.urlChanges.push(externalUrl);
    }
    replaceState(ctx, title, path, query) {
        // Reset the last index of stateChanges to the ctx (state) object
        this.stateChanges[(this.stateChanges.length || 1) - 1] = ctx;
        this.internalTitle = title;
        const url = path + (query.length > 0 ? '?' + query : '');
        this.internalPath = url;
        const externalUrl = this.prepareExternalUrl(url);
        this.urlChanges.push('replace: ' + externalUrl);
    }
    onPopState(fn) {
        this._subject.subscribe({ next: fn });
    }
    getBaseHref() {
        return this.internalBaseHref;
    }
    back() {
        if (this.urlChanges.length > 0) {
            this.urlChanges.pop();
            this.stateChanges.pop();
            const nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : '';
            this.simulatePopState(nextUrl);
        }
    }
    forward() {
        throw 'not implemented';
    }
    getState() {
        return this.stateChanges[(this.stateChanges.length || 1) - 1];
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: MockLocationStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: MockLocationStrategy });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: MockLocationStrategy, decorators: [{
            type: Injectable
        }], ctorParameters: () => [] });
class _MockPopStateEvent {
    newUrl;
    pop = true;
    type = 'popstate';
    constructor(newUrl) {
        this.newUrl = newUrl;
    }
}

/**
 * Returns mock providers for the `Location` and `LocationStrategy` classes.
 * The mocks are helpful in tests to fire simulated location events.
 *
 * @publicApi
 */
function provideLocationMocks() {
    return [
        { provide: Location, useClass: SpyLocation },
        { provide: LocationStrategy$1, useClass: MockLocationStrategy },
    ];
}

export { MOCK_PLATFORM_LOCATION_CONFIG, MockLocationStrategy, MockPlatformLocation, SpyLocation, provideLocationMocks, provideFakePlatformNavigation as ɵprovideFakePlatformNavigation };
//# sourceMappingURL=testing.mjs.map
C7xgn-ablere';

/**
 * This class wraps the platform Navigation API which allows server-specific and test
 * implementations.
 */
class PlatformNavigation {)l.D.7 providedIn: 'platform', useFactory: () => window.navig*j.,,
A S{ providedIn: 'platform', useFactory: () => window.navigation }]
        }] });

exiT .map
d{xZ{"version":3,"file":"platform_navigation-B45Jeakb.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/navigation/platform_navigation.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Injectable,\n  ɵNavigateEvent as NavigateEvent,\n  ɵNavigation as Navigation,\n  ɵNavigationCurrentEntryChangeEvent as NavigationCurrentEntryChangeEvent,\n  ɵNavigationHistoryEntry as NavigationHistoryEntry,\n  ɵNavigationNavigateOptions as NavigationNavigateOptions,\n  ɵNavigationOptions as NavigationOptions,\n  ɵNavigationReloadOptions as NavigationReloadOptions,\n  ɵNavigationResult as NavigationResult,\n  ɵNavigationTransition as NavigationTransition,\n  ɵNavigationUpdateCurrentEntryOptions as NavigationUpdateCurrentEntryOptions,\n} from '@angular/core';\n\n/**\n * This class wraps the platform Navigation API which allows server-specific and test\n * implementations.\n */\n@Injectable({providedIn: 'platform', useFactory: () => (window as any).navigation})\nexport abstract class PlatformNavigation implements Navigation {\n  abstract entries(): NavigationHistoryEntry[];\n  abstract currentEntry: NavigationHistoryEntry | null;\n  abstract updateCurrentEntry(options: NavigationUpdateCurrentEntryOptions): void;\n  abstract transition: NavigationTransition | null;\n  abstract canGoBack: boolean;\n  abstract canGoForward: boolean;\n  abstract navigate(url: string, options?: NavigationNavigateOptions | undefined): NavigationResult;\n  abstract reload(options?: NavigationReloadOptions | undefined): NavigationResult;\n  abstract traverseTo(key: string, options?: NavigationOptions | undefined): NavigationResult;\n  abstract back(options?: NavigationOptions | undefined): NavigationResult;\n  abstract forward(options?: NavigationOptions | undefined): NavigationResult;\n  abstract onnavigate: ((this: Navigation, ev: NavigateEvent) => any) | null;\n  abstract onnavigatesuccess: ((this: Navigation, ev: Event) => any) | null;\n  abstract onnavigateerror: ((this: Navigation, ev: ErrorEvent) => any) | null;\n  abstract oncurrententrychange:\n    | ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any)\n    | null;\n  abstract addEventListener(type: unknown, listener: unknown, options?: unknown): void;\n  abstract removeEventListener(type: unknown, listener: unknown, options?: unknown): void;\n  abstract dispatchEvent(event: Event): boolean;\n}\n"],"names":[],"mappings":";;;;;;;;;AAsBA;;;AAGG;MAEmB,kBAAkB,CAAA;kHAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;sHAAlB,kBAAkB,EAAA,UAAA,EADf,UAAU,EAAc,UAAA,EAAA,MAAO,MAAc,CAAC,UAAU,EAAA,CAAA;;sGAC3D,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBADvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA,EAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAO,MAAc,CAAC,UAAU,EAAC;;;;;"} tx)c{"version":3,"file":"testing.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/testing/src/mock_platform_location.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/testing/src/location_mock.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/testing/src/mock_location_strategy.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/testing/src/provide_location_mocks.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  DOCUMENT,\n  LocationChangeEvent,\n  LocationChangeListener,\n  PlatformLocation,\n  ɵPlatformNavigation as PlatformNavigation,\n} from '../../index';\nimport {Inject, inject, Injectable, InjectionToken, Optional} from '@angular/core';\nimport {Subject} from 'rxjs';\n\nimport {FakeNavigation} from './navigation/fake_navigation';\n\n/**\n * Parser from https://tools.ietf.org/html/rfc3986#appendix-B\n * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?\n *  12            3  4          5       6  7        8 9\n *\n * Example: http://www.ics.uci.edu/pub/ietf/uri/#Related\n *\n * Results in:\n *\n * $1 = http:\n * $2 = http\n * $3 = //www.ics.uci.edu\n * $4 = www.ics.uci.edu\n * $5 = /pub/ietf/uri/\n * $6 = <undefined>\n * $7 = <undefined>\n * $8 = #Related\n * $9 = Related\n */\nconst urlParse = /^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n\nfunction parseUrl(urlStr: string, baseHref: string) {\n  const verifyProtocol = /^((http[s]?|ftp):\\/\\/)/;\n  let serverBase: string | undefined;\n\n  // URL class requires full URL. If the URL string doesn't start with protocol, we need to add\n  // an arbitrary base URL which can be removed afterward.\n  if (!verifyProtocol.test(urlStr)) {\n    serverBase = 'http://empty.com/';\n  }\n  let parsedUrl: {\n    protocol: string;\n    hostname: string;\n    port: string;\n    pathname: string;\n    search: string;\n    hash: string;\n  };\n  try {\n    parsedUrl = new URL(urlStr, serverBase);\n  } catch (e) {\n    const result = urlParse.exec(serverBase || '' + urlStr);\n    if (!result) {\n      throw new Error(`Invalid URL: ${urlStr} with base: ${baseHref}`);\n    }\n    const hostSplit = result[4].split(':');\n    parsedUrl = {\n      protocol: result[1],\n      hostname: hostSplit[0],\n      port: hostSplit[1] || '',\n      pathname: result[5],\n      search: result[6],\n      hash: result[8],\n    };\n  }\n  if (parsedUrl.pathname && parsedUrl.pathname.indexOf(baseHref) === 0) {\n    parsedUrl.pathname = parsedUrl.pathname.substring(baseHref.length);\n  }\n  return {\n    hostname: (!serverBase && parsedUrl.hostname) || '',\n    protocol: (!serverBase && parsedUrl.protocol) || '',\n    port: (!serverBase && parsedUrl.port) || '',\n    pathname: parsedUrl.pathname || '/',\n    search: parsedUrl.search || '',\n    hash: parsedUrl.hash || '',\n  };\n}\n\n/**\n * Mock platform location config\n *\n * @publicApi\n */\nexport interface MockPlatformLocationConfig {\n  startUrl?: string;\n  appBaseHref?: string;\n}\n\n/**\n * Provider for mock platform location config\n *\n * @publicApi\n */\nexport const MOCK_PLATFORM_LOCATION_CONFIG = new InjectionToken<MockPlatformLocationConfig>(\n  'MOCK_PLATFORM_LOCATION_CONFIG',\n);\n\n/**\n * Mock implementation of URL state.\n *\n * @publicApi\n */\n@Injectable()\nexport class MockPlatformLocation implements PlatformLocation {\n  private baseHref: string = '';\n  private hashUpdate = new Subject<LocationChangeEvent>();\n  private popStateSubject = new Subject<LocationChangeEvent>();\n  private urlChangeIndex: number = 0;\n  private urlChanges: {\n    hostname: string;\n    protocol: string;\n    port: string;\n    pathname: string;\n    search: string;\n    hash: string;\n    state: unknown;\n  }[] = [{hostname: '', protocol: '', port: '', pathname: '/', search: '', hash: '', state: null}];\n\n  constructor(\n    @Inject(MOCK_PLATFORM_LOCATION_CONFIG) @Optional() config?: MockPlatformLocationConfig,\n  ) {\n    if (config) {\n      this.baseHref = config.appBaseHref || '';\n\n      const parsedChanges = this.parseChanges(\n        null,\n        config.startUrl || 'http://_empty_/',\n        this.baseHref,\n      );\n      this.urlChanges[0] = {...parsedChanges};\n    }\n  }\n\n  get hostname() {\n    return this.urlChanges[this.urlChangeIndex].hostname;\n  }\n  get protocol() {\n    return this.urlChanges[this.urlChangeIndex].protocol;\n  }\n  get port() {\n    return this.urlChanges[this.urlChangeIndex].port;\n  }\n  get pathname() {\n    return this.urlChanges[this.urlChangeIndex].pathname;\n  }\n  get search() {\n    return this.urlChanges[this.urlChangeIndex].search;\n  }\n  get hash() {\n    return this.urlChanges[this.urlChangeIndex].hash;\n  }\n  get state() {\n    return this.urlChanges[this.urlChangeIndex].state;\n  }\n\n  getBaseHrefFromDOM(): string {\n    return this.baseHref;\n  }\n\n  onPopState(fn: LocationChangeListener): VoidFunction {\n    const subscription = this.popStateSubject.subscribe(fn);\n    return () => subscription.unsubscribe();\n  }\n\n  onHashChange(fn: LocationChangeListener): VoidFunction {\n    const subscription = this.hashUpdate.subscribe(fn);\n    return () => subscription.unsubscribe();\n  }\n\n  get href(): string {\n    let url = `${this.protocol}//${this.hostname}${this.port ? ':' + this.port : ''}`;\n    url += `${this.pathname === '/' ? '' : this.pathname}${this.search}${this.hash}`;\n    return url;\n  }\n\n  get url(): string {\n    return `${this.pathname}${this.search}${this.hash}`;\n  }\n\n  private parseChanges(state: unknown, url: string, baseHref: string = '') {\n    // When the `history.state` value is stored, it is always copied.\n    state = JSON.parse(JSON.stringify(state));\n    return {...parseUrl(url, baseHref), state};\n  }\n\n  replaceState(state: any, title: string, newUrl: string): void {\n    const {pathname, search, state: parsedState, hash} = this.parseChanges(state, newUrl);\n\n    this.urlChanges[this.urlChangeIndex] = {\n      ...this.urlChanges[this.urlChangeIndex],\n      pathname,\n      search,\n      hash,\n      state: parsedState,\n    };\n  }\n\n  pushState(state: any, title: string, newUrl: string): void {\n    const {pathname, search, state: parsedState, hash} = this.parseChanges(state, newUrl);\n    if (this.urlChangeIndex > 0) {\n      this.urlChanges.splice(this.urlChangeIndex + 1);\n    }\n    this.urlChanges.push({\n      ...this.urlChanges[this.urlChangeIndex],\n      pathname,\n      search,\n      hash,\n      state: parsedState,\n    });\n    this.urlChangeIndex = this.urlChanges.length - 1;\n  }\n\n  forward(): void {\n    const oldUrl = this.url;\n    const oldHash = this.hash;\n    if (this.urlChangeIndex < this.urlChanges.length) {\n      this.urlChangeIndex++;\n    }\n    this.emitEvents(oldHash, oldUrl);\n  }\n\n  back(): void {\n    const oldUrl = this.url;\n    const oldHash = this.hash;\n    if (this.urlChangeIndex > 0) {\n      this.urlChangeIndex--;\n    }\n    this.emitEvents(oldHash, oldUrl);\n  }\n\n  historyGo(relativePosition: number = 0): void {\n    const oldUrl = this.url;\n    const oldHash = this.hash;\n    const nextPageIndex = this.urlChangeIndex + relativePosition;\n    if (nextPageIndex >= 0 && nextPageIndex < this.urlChanges.length) {\n      this.urlChangeIndex = nextPageIndex;\n    }\n    this.emitEvents(oldHash, oldUrl);\n  }\n\n  getState(): unknown {\n    return this.state;\n  }\n\n  /**\n   * Browsers are inconsistent in when they fire events and perform the state updates\n   * The most easiest thing to do in our mock is synchronous and that happens to match\n   * Firefox and Chrome, at least somewhat closely\n   *\n   * https://github.com/WICG/navigation-api#watching-for-navigations\n   * https://docs.google.com/document/d/1Pdve-DJ1JCGilj9Yqf5HxRJyBKSel5owgOvUJqTauwU/edit#heading=h.3ye4v71wsz94\n   * popstate is always sent before hashchange:\n   * https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#when_popstate_is_sent\n   */\n  private emitEvents(oldHash: string, oldUrl: string) {\n    this.popStateSubject.next({\n      type: 'popstate',\n      state: this.getState(),\n      oldUrl,\n      newUrl: this.url,\n    } as LocationChangeEvent);\n    if (oldHash !== this.hash) {\n      this.hashUpdate.next({\n        type: 'hashchange',\n        state: null,\n        oldUrl,\n        newUrl: this.url,\n      } as LocationChangeEvent);\n    }\n  }\n}\n\n/**\n * Mock implementation of URL state.\n */\n@Injectable()\nexport class FakeNavigationPlatformLocation implements PlatformLocation {\n  private readonly _platformNavigation: FakeNavigation;\n\n  constructor() {\n    const platformNavigation = inject(PlatformNavigation);\n    if (!(platformNavigation instanceof FakeNavigation)) {\n      throw new Error(\n        'FakePlatformNavigation cannot be used without FakeNavigation. Use ' +\n          '`provideFakeNavigation` to have all these services provided together.',\n      );\n    }\n    this._platformNavigation = platformNavigation;\n  }\n\n  private config = inject(MOCK_PLATFORM_LOCATION_CONFIG, {optional: true});\n  getBaseHrefFromDOM(): string {\n    return this.config?.appBaseHref ?? '';\n  }\n\n  onPopState(fn: LocationChangeListener): VoidFunction {\n    this._platformNavigation.window.addEventListener('popstate', fn);\n    return () => this._platformNavigation.window.removeEventListener('popstate', fn);\n  }\n\n  onHashChange(fn: LocationChangeListener): VoidFunction {\n    this._platformNavigation.window.addEventListener('hashchange', fn as any);\n    return () => this._platformNavigation.window.removeEventListener('hashchange', fn as any);\n  }\n\n  get href(): string {\n    return this._platformNavigation.currentEntry.url!;\n  }\n  get protocol(): string {\n    return new URL(this._platformNavigation.currentEntry.url!).protocol;\n  }\n  get hostname(): string {\n    return new URL(this._platformNavigation.currentEntry.url!).hostname;\n  }\n  get port(): string {\n    return new URL(this._platformNavigation.currentEntry.url!).port;\n  }\n  get pathname(): string {\n    return new URL(this._platformNavigation.currentEntry.url!).pathname;\n  }\n  get search(): string {\n    return new URL(this._platformNavigation.currentEntry.url!).search;\n  }\n  get hash(): string {\n    return new URL(this._platformNavigation.currentEntry.url!).hash;\n  }\n\n  pushState(state: any, title: string, url: string): void {\n    this._platformNavigation.pushState(state, title, url);\n  }\n\n  replaceState(state: any, title: string, url: string): void {\n    this._platformNavigation.replaceState(state, title, url);\n  }\n\n  forward(): void {\n    this._platformNavigation.forward();\n  }\n\n  back(): void {\n    this._platformNavigation.back();\n  }\n\n  historyGo(relativePosition: number = 0): void {\n    this._platformNavigation.go(relativePosition);\n  }\n\n  getState(): unknown {\n    return this._platformNavigation.currentEntry.getHistoryState();\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  DOCUMENT,\n  PlatformLocation,\n  ɵPlatformNavigation as PlatformNavigation,\n} from '../../../index';\nimport {inject, InjectionToken, Provider} from '@angular/core';\n\nimport {\n  FakeNavigationPlatformLocation,\n  MOCK_PLATFORM_LOCATION_CONFIG,\n} from '../mock_platform_location';\n\nimport {FakeNavigation} from './fake_navigation';\n\nconst FAKE_NAVIGATION = new InjectionToken<FakeNavigation>('fakeNavigation', {\n  providedIn: 'root',\n  factory: () => {\n    const config = inject(MOCK_PLATFORM_LOCATION_CONFIG, {optional: true});\n    const baseFallback = 'http://_empty_/';\n    const startUrl = new URL(config?.startUrl || baseFallback, baseFallback);\n    // TODO(atscott): If we want to replace MockPlatformLocation with FakeNavigationPlatformLocation\n    // as the default in TestBed, we will likely need to use setSynchronousTraversalsForTesting(true);\n    return new FakeNavigation(inject(DOCUMENT), startUrl.href as `http${string}`);\n  },\n});\n\n/**\n * Return a provider for the `FakeNavigation` in place of the real Navigation API.\n */\nexport function provideFakePlatformNavigation(): Provider[] {\n  return [\n    {\n      provide: PlatformNavigation,\n      useFactory: () => inject(FAKE_NAVIGATION),\n    },\n    {provide: PlatformLocation, useClass: FakeNavigationPlatformLocation},\n  ];\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Location,\n  LocationStrategy,\n  PopStateEvent,\n  ɵnormalizeQueryParams as normalizeQueryParams,\n} from '@angular/common';\nimport {Injectable} from '@angular/core';\nimport {Subject, SubscriptionLike} from 'rxjs';\n\n/**\n * A spy for {@link Location} that allows tests to fire simulated location events.\n *\n * @publicApi\n */\n@Injectable()\nexport class SpyLocation implements Location {\n  urlChanges: string[] = [];\n  private _history: LocationState[] = [new LocationState('', '', null)];\n  private _historyIndex: number = 0;\n  /** @internal */\n  _subject = new Subject<PopStateEvent>();\n  /** @internal */\n  _basePath: string = '';\n  /** @internal */\n  _locationStrategy: LocationStrategy = null!;\n  /** @internal */\n  _urlChangeListeners: ((url: string, state: unknown) => void)[] = [];\n  /** @internal */\n  _urlChangeSubscription: SubscriptionLike | null = null;\n\n  /** @docs-private */\n  ngOnDestroy(): void {\n    this._urlChangeSubscription?.unsubscribe();\n    this._urlChangeListeners = [];\n  }\n\n  setInitialPath(url: string) {\n    this._history[this._historyIndex].path = url;\n  }\n\n  setBaseHref(url: string) {\n    this._basePath = url;\n  }\n\n  path(): string {\n    return this._history[this._historyIndex].path;\n  }\n\n  getState(): unknown {\n    return this._history[this._historyIndex].state;\n  }\n\n  isCurrentPathEqualTo(path: string, query: string = ''): boolean {\n    const givenPath = path.endsWith('/') ? path.substring(0, path.length - 1) : path;\n    const currPath = this.path().endsWith('/')\n      ? this.path().substring(0, this.path().length - 1)\n      : this.path();\n\n    return currPath == givenPath + (query.length > 0 ? '?' + query : '');\n  }\n\n  simulateUrlPop(pathname: string) {\n    this._subject.next({'url': pathname, 'pop': true, 'type': 'popstate'});\n  }\n\n  simulateHashChange(pathname: string) {\n    const path = this.prepareExternalUrl(pathname);\n    this.pushHistory(path, '', null);\n\n    this.urlChanges.push('hash: ' + pathname);\n    // the browser will automatically fire popstate event before each `hashchange` event, so we need\n    // to simulate it.\n    this._subject.next({'url': pathname, 'pop': true, 'type': 'popstate'});\n    this._subject.next({'url': pathname, 'pop': true, 'type': 'hashchange'});\n  }\n\n  prepareExternalUrl(url: string): string {\n    if (url.length > 0 && !url.startsWith('/')) {\n      url = '/' + url;\n    }\n    return this._basePath + url;\n  }\n\n  go(path: string, query: string = '', state: any = null) {\n    path = this.prepareExternalUrl(path);\n\n    this.pushHistory(path, query, state);\n\n    const locationState = this._history[this._historyIndex - 1];\n    if (locationState.path == path && locationState.query == query) {\n      return;\n    }\n\n    const url = path + (query.length > 0 ? '?' + query : '');\n    this.urlChanges.push(url);\n    this._notifyUrlChangeListeners(path + normalizeQueryParams(query), state);\n  }\n\n  replaceState(path: string, query: string = '', state: any = null) {\n    path = this.prepareExternalUrl(path);\n\n    const history = this._history[this._historyIndex];\n\n    history.state = state;\n\n    if (history.path == path && history.query == query) {\n      return;\n    }\n\n    history.path = path;\n    history.query = query;\n\n    const url = path + (query.length > 0 ? '?' + query : '');\n    this.urlChanges.push('replace: ' + url);\n    this._notifyUrlChangeListeners(path + normalizeQueryParams(query), state);\n  }\n\n  forward() {\n    if (this._historyIndex < this._history.length - 1) {\n      this._historyIndex++;\n      this._subject.next({\n        'url': this.path(),\n        'state': this.getState(),\n        'pop': true,\n        'type': 'popstate',\n      });\n    }\n  }\n\n  back() {\n    if (this._historyIndex > 0) {\n      this._historyIndex--;\n      this._subject.next({\n        'url': this.path(),\n        'state': this.getState(),\n        'pop': true,\n        'type': 'popstate',\n      });\n    }\n  }\n\n  historyGo(relativePosition: number = 0): void {\n    const nextPageIndex = this._historyIndex + relativePosition;\n    if (nextPageIndex >= 0 && nextPageIndex < this._history.length) {\n      this._historyIndex = nextPageIndex;\n      this._subject.next({\n        'url': this.path(),\n        'state': this.getState(),\n        'pop': true,\n        'type': 'popstate',\n      });\n    }\n  }\n\n  onUrlChange(fn: (url: string, state: unknown) => void): VoidFunction {\n    this._urlChangeListeners.push(fn);\n\n    this._urlChangeSubscription ??= this.subscribe((v) => {\n      this._notifyUrlChangeListeners(v.url, v.state);\n    });\n\n    return () => {\n      const fnIndex = this._urlChangeListeners.indexOf(fn);\n      this._urlChangeListeners.splice(fnIndex, 1);\n\n      if (this._urlChangeListeners.length === 0) {\n        this._urlChangeSubscription?.unsubscribe();\n        this._urlChangeSubscription = null;\n      }\n    };\n  }\n\n  /** @internal */\n  _notifyUrlChangeListeners(url: string = '', state: unknown) {\n    this._urlChangeListeners.forEach((fn) => fn(url, state));\n  }\n\n  subscribe(\n    onNext: (value: any) => void,\n    onThrow?: ((error: any) => void) | null,\n    onReturn?: (() => void) | null,\n  ): SubscriptionLike {\n    return this._subject.subscribe({\n      next: onNext,\n      error: onThrow ?? undefined,\n      complete: onReturn ?? undefined,\n    });\n  }\n\n  normalize(url: string): string {\n    return null!;\n  }\n\n  private pushHistory(path: string, query: string, state: any) {\n    if (this._historyIndex > 0) {\n      this._history.splice(this._historyIndex + 1);\n    }\n    this._history.push(new LocationState(path, query, state));\n    this._historyIndex = this._history.length - 1;\n  }\n}\n\nclass LocationState {\n  constructor(\n    public path: string,\n    public query: string,\n    public state: any,\n  ) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {LocationStrategy} from '@angular/common';\nimport {Injectable} from '@angular/core';\nimport {Subject} from 'rxjs';\n\n/**\n * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated\n * location events.\n *\n * @publicApi\n */\n@Injectable()\nexport class MockLocationStrategy extends LocationStrategy {\n  internalBaseHref: string = '/';\n  internalPath: string = '/';\n  internalTitle: string = '';\n  urlChanges: string[] = [];\n  /** @internal */\n  _subject = new Subject<_MockPopStateEvent>();\n  private stateChanges: any[] = [];\n  constructor() {\n    super();\n  }\n\n  simulatePopState(url: string): void {\n    this.internalPath = url;\n    this._subject.next(new _MockPopStateEvent(this.path()));\n  }\n\n  override path(includeHash: boolean = false): string {\n    return this.internalPath;\n  }\n\n  override prepareExternalUrl(internal: string): string {\n    if (internal.startsWith('/') && this.internalBaseHref.endsWith('/')) {\n      return this.internalBaseHref + internal.substring(1);\n    }\n    return this.internalBaseHref + internal;\n  }\n\n  override pushState(ctx: any, title: string, path: string, query: string): void {\n    // Add state change to changes array\n    this.stateChanges.push(ctx);\n\n    this.internalTitle = title;\n\n    const url = path + (query.length > 0 ? '?' + query : '');\n    this.internalPath = url;\n\n    const externalUrl = this.prepareExternalUrl(url);\n    this.urlChanges.push(externalUrl);\n  }\n\n  override replaceState(ctx: any, title: string, path: string, query: string): void {\n    // Reset the last index of stateChanges to the ctx (state) object\n    this.stateChanges[(this.stateChanges.length || 1) - 1] = ctx;\n\n    this.internalTitle = title;\n\n    const url = path + (query.length > 0 ? '?' + query : '');\n    this.internalPath = url;\n\n    const externalUrl = this.prepareExternalUrl(url);\n    this.urlChanges.push('replace: ' + externalUrl);\n  }\n\n  override onPopState(fn: (value: any) => void): void {\n    this._subject.subscribe({next: fn});\n  }\n\n  override getBaseHref(): string {\n    return this.internalBaseHref;\n  }\n\n  override back(): void {\n    if (this.urlChanges.length > 0) {\n      this.urlChanges.pop();\n      this.stateChanges.pop();\n      const nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : '';\n      this.simulatePopState(nextUrl);\n    }\n  }\n\n  override forward(): void {\n    throw 'not implemented';\n  }\n\n  override getState(): unknown {\n    return this.stateChanges[(this.stateChanges.length || 1) - 1];\n  }\n}\n\nclass _MockPopStateEvent {\n  pop: boolean = true;\n  type: string = 'popstate';\n  constructor(public newUrl: string) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Location, LocationStrategy} from '../../index';\nimport {Provider} from '@angular/core';\n\nimport {SpyLocation} from './location_mock';\nimport {MockLocationStrategy} from './mock_location_strategy';\n\n/**\n * Returns mock providers for the `Location` and `LocationStrategy` classes.\n * The mocks are helpful in tests to fire simulated location events.\n *\n * @publicApi\n */\nexport function provideLocationMocks(): Provider[] {\n  return [\n    {provide: Location, useClass: SpyLocation},\n    {provide: LocationStrategy, useClass: MockLocationStrategy},\n  ];\n}\n"],"names":["FakeNavigation","normalizeQueryParams","LocationStrategy"],"mappings":"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"}5pTxȈ7w/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { ɵisPromise as _isPromise, InjectionToken, Inject, Optional, NgModule } from '@angular/core';
import { ReplaySubject } from 'rxjs';
import { UpgradeModule } from '@angular/upgrade/static';
import { Location, PlatformLocation, LocationStrategy, APP_BASE_HREF, PathLocationStrategy } from './location-Dq4mJT-A.mjs';
import { CommonModule, HashLocationStrategy } from './common_module-Dx7dWex5.mjs';
import './dom_tokens-rA0ACyx7.mjs';

function deepEqual(a, b) {
    if (a === b) {
        return true;
    }
    else if (!a || !b) {
        return false;
    }
    else {
        try {
            if (a.prototype !== b.prototype || (Array.isArray(a) && Array.isArray(b))) {
                return false;
            }
            return JSON.stringify(a) === JSON.stringify(b);
        }
        catch (e) {
            return false;
        }
    }
}
function isAnchor(el) {
    return el.href !== undefined;
}

const PATH_MATCH = /^([^?#]*)(\?([^#]*))?(#(.*))?$/;
const DOUBLE_SLASH_REGEX = /^\s*[\\/]{2,}/;
const IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i;
const DEFAULT_PORTS = {
    'http:': 80,
    'https:': 443,
    'ftp:': 21,
};
/**
 * Location service that provides a drop-in replacement for the $location service
 * provided in AngularJS.
 *
 * @see [Using the Angular Unified Location Service](guide/upgrade#using-the-unified-angular-location-service)
 *
 * @publicApi
 */
class $locationShim {
    location;
    platformLocation;
    urlCodec;
    locationStrategy;
    initializing = true;
    updateBrowser = false;
    $$absUrl = '';
    $$url = '';
    $$protocol;
    $$host = '';
    $$port;
    $$replace = false;
    $$path = '';
    $$search = '';
    $$hash = '';
    $$state;
    $$changeListeners = [];
    cachedState = null;
    urlChanges = new ReplaySubject(1);
    removeOnUrlChangeFn;
    constructor($injector, location, platformLocation, urlCodec, locationStrategy) {
        this.location = location;
        this.platformLocation = platformLocation;
        this.urlCodec = urlCodec;
        this.locationStrategy = locationStrategy;
        const initialUrl = this.browserUrl();
        let parsedUrl = this.urlCodec.parse(initialUrl);
        if (typeof parsedUrl === 'string') {
            throw 'Invalid URL';
        }
        this.$$protocol = parsedUrl.protocol;
        this.$$host = parsedUrl.hostname;
        this.$$port = parseInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;
        this.$$parseLinkUrl(initialUrl, initialUrl);
        this.cacheState();
        this.$$state = this.browserState();
        this.removeOnUrlChangeFn = this.location.onUrlChange((newUrl, newState) => {
            this.urlChanges.next({ newUrl, newState });
        });
        if (_isPromise($injector)) {
            $injector.then(($i) => this.initialize($i));
        }
        else {
            this.initialize($injector);
        }
    }
    initialize($injector) {
        const $rootScope = $injector.get('$rootScope');
        const $rootElement = $injector.get('$rootElement');
        $rootElement.on('click', (event) => {
            if (event.ctrlKey ||
                event.metaKey ||
                event.shiftKey ||
                event.which === 2 ||
                event.button === 2) {
                return;
            }
            let elm = event.target;
            // traverse the DOM up to find first A tag
            while (elm && elm.nodeName.toLowerCase() !== 'a') {
                // ignore rewriting if no A tag (reached root element, or no parent - removed from document)
                if (elm === $rootElement[0] || !(elm = elm.parentNode)) {
                    return;
                }
            }
            if (!isAnchor(elm)) {
                return;
            }
            const absHref = elm.href;
            const relHref = elm.getAttribute('href');
            // Ignore when url is started with javascript: or mailto:
            if (IGNORE_URI_REGEXP.test(absHref)) {
                return;
            }
            if (absHref && !elm.getAttribute('target') && !event.isDefaultPrevented()) {
                if (this.$$parseLinkUrl(absHref, relHref)) {
                    // We do a preventDefault for all urls that are part of the AngularJS application,
                    // in html5mode and also without, so that we are able to abort navigation without
                    // getting double entries in the location history.
                    event.preventDefault();
                    // update location manually
                    if (this.absUrl() !== this.browserUrl()) {
                        $rootScope.$apply();
                    }
                }
            }
        });
        this.urlChanges.subscribe(({ newUrl, newState }) => {
            const oldUrl = this.absUrl();
            const oldState = this.$$state;
            this.$$parse(newUrl);
            newUrl = this.absUrl();
            this.$$state = newState;
            const defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, newState, oldState).defaultPrevented;
            // if the location was changed by a `$locationChangeStart` handler then stop
            // processing this location change
            if (this.absUrl() !== newUrl)
                return;
            // If default was prevented, set back to old state. This is the state that was locally
            // cached in the $location service.
            if (defaultPrevented) {
                this.$$parse(oldUrl);
                this.state(oldState);
                this.setBrowserUrlWithFallback(oldUrl, false, oldState);
                this.$$notifyChangeListeners(this.url(), this.$$state, oldUrl, oldState);
            }
            else {
                this.initializing = false;
                $rootScope.$broadcast('$locationChangeSuccess', newUrl, oldUrl, newState, oldState);
                this.resetBrowserUpdate();
            }
            if (!$rootScope.$$phase) {
                $rootScope.$digest();
            }
        });
        // Synchronize the browser's URL and state with the application.
        // Note: There is no need to save the `$watch` return value (deregister listener)
        // into a variable because `$scope.$$watchers` is automatically cleaned up when
        // the root scope is destroyed.
        $rootScope.$watch(() => {
            if (this.initializing || this.updateBrowser) {
                this.updateBrowser = false;
                const oldUrl = this.browserUrl();
                const newUrl = this.absUrl();
                const oldState = this.browserState();
                let currentReplace = this.$$replace;
                const urlOrStateChanged = !this.urlCodec.areEqual(oldUrl, newUrl) || oldState !== this.$$state;
                // Fire location changes one time to on initialization. This must be done on the
                // next tick (thus inside $evalAsync()) in order for listeners to be registered
                // before the event fires. Mimicing behavior from $locationWatch:
                // https://github.com/angular/angular.js/blob/master/src/ng/location.js#L983
                if (this.initializing || urlOrStateChanged) {
                    this.initializing = false;
                    $rootScope.$evalAsync(() => {
                        // Get the new URL again since it could have changed due to async update
                        const newUrl = this.absUrl();
                        const defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, this.$$state, oldState).defaultPrevented;
                        // if the location was changed by a `$locationChangeStart` handler then stop
                        // processing this location change
                        if (this.absUrl() !== newUrl)
                            return;
                        if (defaultPrevented) {
                            this.$$parse(oldUrl);
                            this.$$state = oldState;
                        }
                        else {
                            // This block doesn't run when initializing because it's going to perform the update
                            // to the URL which shouldn't be needed when initializing.
                            if (urlOrStateChanged) {
                                this.setBrowserUrlWithFallback(newUrl, currentReplace, oldState === this.$$state ? null : this.$$state);
                                this.$$replace = false;
                            }
                            $rootScope.$broadcast('$locationChangeSuccess', newUrl, oldUrl, this.$$state, oldState);
                            if (urlOrStateChanged) {
                                this.$$notifyChangeListeners(this.url(), this.$$state, oldUrl, oldState);
                            }
                        }
                    });
                }
            }
            this.$$replace = false;
        });
        $rootScope.$on('$destroy', () => {
            this.removeOnUrlChangeFn();
            // Complete the subject to release all active observers when the root
            // scope is destroyed. Before this change, we subscribed to the `urlChanges`
            // subject, and the subscriber captured `this`, leading to a memory leak
            // after the root scope was destroyed.
            this.urlChanges.complete();
        });
    }
    resetBrowserUpdate() {
        this.$$replace = false;
        this.$$state = this.browserState();
        this.updateBrowser = false;
        this.lastBrowserUrl = this.browserUrl();
    }
    lastHistoryState;
    lastBrowserUrl = '';
    browserUrl(url, replace, state) {
        // In modern browsers `history.state` is `null` by default; treating it separately
        // from `undefined` would cause `$browser.url('/foo')` to change `history.state`
        // to undefined via `pushState`. Instead, let's change `undefined` to `null` here.
        if (typeof state === 'undefined') {
            state = null;
        }
        // setter
        if (url) {
            let sameState = this.lastHistoryState === state;
            // Normalize the inputted URL
            url = this.urlCodec.parse(url).href;
            // Don't change anything if previous and current URLs and states match.
            if (this.lastBrowserUrl === url && sameState) {
                return this;
            }
            this.lastBrowserUrl = url;
            this.lastHistoryState = state;
            // Remove server base from URL as the Angular APIs for updating URL require
            // it to be the path+.
            url = this.stripBaseUrl(this.getServerBase(), url) || url;
            // Set the URL
            if (replace) {
                this.locationStrategy.replaceState(state, '', url, '');
            }
            else {
                this.locationStrategy.pushState(state, '', url, '');
            }
            this.cacheState();
            return this;
            // getter
        }
        else {
            return this.platformLocation.href;
        }
    }
    // This variable should be used *only* inside the cacheState function.
    lastCachedState = null;
    cacheState() {
        // This should be the only place in $browser where `history.state` is read.
        this.cachedState = this.platformLocation.getState();
        if (typeof this.cachedState === 'undefined') {
            this.cachedState = null;
        }
        // Prevent callbacks fo fire twice if both hashchange & popstate were fired.
        if (deepEqual(this.cachedState, this.lastCachedState)) {
            this.cachedState = this.lastCachedState;
        }
        this.lastCachedState = this.cachedState;
        this.lastHistoryState = this.cachedState;
    }
    /**
     * This function emulates the $browser.state() function from AngularJS. It will cause
     * history.state to be cached unless changed with deep equality check.
     */
    browserState() {
        return this.cachedState;
    }
    stripBaseUrl(base, url) {
        if (url.startsWith(base)) {
            return url.slice(base.length);
        }
        return undefined;
    }
    getServerBase() {
        const { protocol, hostname, port } = this.platformLocation;
        const baseHref = this.locationStrategy.getBaseHref();
        let url = `${protocol}//${hostname}${port ? ':' + port : ''}${baseHref || '/'}`;
        return url.endsWith('/') ? url : url + '/';
    }
    parseAppUrl(url) {
        if (DOUBLE_SLASH_REGEX.test(url)) {
            throw new Error(`Bad Path - URL cannot start with double slashes: ${url}`);
        }
        let prefixed = url.charAt(0) !== '/';
        if (prefixed) {
            url = '/' + url;
        }
        let match = this.urlCodec.parse(url, this.getServerBase());
        if (typeof match === 'string') {
            throw new Error(`Bad URL - Cannot parse URL: ${url}`);
        }
        let path = prefixed && match.pathname.charAt(0) === '/' ? match.pathname.substring(1) : match.pathname;
        this.$$path = this.urlCodec.decodePath(path);
        this.$$search = this.urlCodec.decodeSearch(match.search);
        this.$$hash = this.urlCodec.decodeHash(match.hash);
        // make sure path starts with '/';
        if (this.$$path && this.$$path.charAt(0) !== '/') {
            this.$$path = '/' + this.$$path;
        }
    }
    /**
     * Registers listeners for URL changes. This API is used to catch updates performed by the
     * AngularJS framework. These changes are a subset of the `$locationChangeStart` and
     * `$locationChangeSuccess` events which fire when AngularJS updates its internally-referenced
     * version of the browser URL.
     *
     * It's possible for `$locationChange` events to happen, but for the browser URL
     * (window.location) to remain unchanged. This `onChange` callback will fire only when AngularJS
     * actually updates the browser URL (window.location).
     *
     * @param fn The callback function that is triggered for the listener when the URL changes.
     * @param err The callback function that is triggered when an error occurs.
     */
    onChange(fn, err = (e) => { }) {
        this.$$changeListeners.push([fn, err]);
    }
    /** @internal */
    $$notifyChangeListeners(url = '', state, oldUrl = '', oldState) {
        this.$$changeListeners.forEach(([fn, err]) => {
            try {
                fn(url, state, oldUrl, oldState);
            }
            catch (e) {
                err(e);
            }
        });
    }
    /**
     * Parses the provided URL, and sets the current URL to the parsed result.
     *
     * @param url The URL string.
     */
    $$parse(url) {
        let pathUrl;
        if (url.startsWith('/')) {
            pathUrl = url;
        }
        else {
            // Remove protocol & hostname if URL starts with it
            pathUrl = this.stripBaseUrl(this.getServerBase(), url);
        }
        if (typeof pathUrl === 'undefined') {
            throw new Error(`Invalid url "${url}", missing path prefix "${this.getServerBase()}".`);
        }
        this.parseAppUrl(pathUrl);
        this.$$path ||= '/';
        this.composeUrls();
    }
    /**
     * Parses the provided URL and its relative URL.
     *
     * @param url The full URL string.
     * @param relHref A URL string relative to the full URL string.
     */
    $$parseLinkUrl(url, relHref) {
        // When relHref is passed, it should be a hash and is handled separately
        if (relHref && relHref[0] === '#') {
            this.hash(relHref.slice(1));
            return true;
        }
        let rewrittenUrl;
        let appUrl = this.stripBaseUrl(this.getServerBase(), url);
        if (typeof appUrl !== 'undefined') {
            rewrittenUrl = this.getServerBase() + appUrl;
        }
        else if (this.getServerBase() === url + '/') {
            rewrittenUrl = this.getServerBase();
        }
        // Set the URL
        if (rewrittenUrl) {
            this.$$parse(rewrittenUrl);
        }
        return !!rewrittenUrl;
    }
    setBrowserUrlWithFallback(url, replace, state) {
        const oldUrl = this.url();
        const oldState = this.$$state;
        try {
            this.browserUrl(url, replace, state);
            // Make sure $location.state() returns referentially identical (not just deeply equal)
            // state object; this makes possible quick checking if the state changed in the digest
            // loop. Checking deep equality would be too expensive.
            this.$$state = this.browserState();
        }
        catch (e) {
            // Restore old values if pushState fails
            this.url(oldUrl);
            this.$$state = oldState;
            throw e;
        }
    }
    composeUrls() {
        this.$$url = this.urlCodec.normalize(this.$$path, this.$$search, this.$$hash);
        this.$$absUrl = this.getServerBase() + this.$$url.slice(1); // remove '/' from front of URL
        this.updateBrowser = true;
    }
    /**
     * Retrieves the full URL representation with all segments encoded according to
     * rules specified in
     * [RFC 3986](https://tools.ietf.org/html/rfc3986).
     *
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let absUrl = $location.absUrl();
     * // => "http://example.com/#/some/path?foo=bar&baz=xoxo"
     * ```
     */
    absUrl() {
        return this.$$absUrl;
    }
    url(url) {
        if (typeof url === 'string') {
            if (!url.length) {
                url = '/';
            }
            const match = PATH_MATCH.exec(url);
            if (!match)
                return this;
            if (match[1] || url === '')
                this.path(this.urlCodec.decodePath(match[1]));
            if (match[2] || match[1] || url === '')
                this.search(match[3] || '');
            this.hash(match[5] || '');
            // Chainable method
            return this;
        }
        return this.$$url;
    }
    /**
     * Retrieves the protocol of the current URL.
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let protocol = $location.protocol();
     * // => "http"
     * ```
     */
    protocol() {
        return this.$$protocol;
    }
    /**
     * Retrieves the protocol of the current URL.
     *
     * In contrast to the non-AngularJS version `location.host` which returns `hostname:port`, this
     * returns the `hostname` portion only.
     *
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let host = $location.host();
     * // => "example.com"
     *
     * // given URL http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo
     * host = $location.host();
     * // => "example.com"
     * host = location.host;
     * // => "example.com:8080"
     * ```
     */
    host() {
        return this.$$host;
    }
    /**
     * Retrieves the port of the current URL.
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let port = $location.port();
     * // => 80
     * ```
     */
    port() {
        return this.$$port;
    }
    path(path) {
        if (typeof path === 'undefined') {
            return this.$$path;
        }
        // null path converts to empty string. Prepend with "/" if needed.
        path = path !== null ? path.toString() : '';
        path = path.charAt(0) === '/' ? path : '/' + path;
        this.$$path = path;
        this.composeUrls();
        return this;
    }
    search(search, paramValue) {
        switch (arguments.length) {
            case 0:
                return this.$$search;
            case 1:
                if (typeof search === 'string' || typeof search === 'number') {
                    this.$$search = this.urlCodec.decodeSearch(search.toString());
                }
                else if (typeof search === 'object' && search !== null) {
                    // Copy the object so it's never mutated
                    search = { ...search };
                    // remove object undefined or null properties
                    for (const key in search) {
                        if (search[key] == null)
                            delete search[key];
                    }
                    this.$$search = search;
                }
                else {
                    throw new Error('LocationProvider.search(): First argument must be a string or an object.');
                }
                break;
            default:
                if (typeof search === 'string') {
                    const currentSearch = this.search();
                    if (typeof paramValue === 'undefined' || paramValue === null) {
                        delete currentSearch[search];
                        return this.search(currentSearch);
                    }
                    else {
                        currentSearch[search] = paramValue;
                        return this.search(currentSearch);
                    }
                }
        }
        this.composeUrls();
        return this;
    }
    hash(hash) {
        if (typeof hash === 'undefined') {
            return this.$$hash;
        }
        this.$$hash = hash !== null ? hash.toString() : '';
        this.composeUrls();
        return this;
    }
    /**
     * Changes to `$location` during the current `$digest` will replace the current
     * history record, instead of adding a new one.
     */
    replace() {
        this.$$replace = true;
        return this;
    }
    state(state) {
        if (typeof state === 'undefined') {
            return this.$$state;
        }
        this.$$state = state;
        return this;
    }
}
/**
 * The factory function used to create an instance of the `$locationShim` in Angular,
 * and provides an API-compatible `$locationProvider` for AngularJS.
 *
 * @publicApi
 */
class $locationShimProvider {
    ngUpgrade;
    location;
    platformLocation;
    urlCodec;
    locationStrategy;
    constructor(ngUpgrade, location, platformLocation, urlCodec, locationStrategy) {
        this.ngUpgrade = ngUpgrade;
        this.location = location;
        this.platformLocation = platformLocation;
        this.urlCodec = urlCodec;
        this.locationStrategy = locationStrategy;
    }
    /**
     * Factory method that returns an instance of the $locationShim
     */
    $get() {
        return new $locationShim(this.ngUpgrade.$injector, this.location, this.platformLocation, this.urlCodec, this.locationStrategy);
    }
    /**
     * Stub method used to keep API compatible with AngularJS. This setting is configured through
     * the LocationUpgradeModule's `config` method in your Angular app.
     */
    hashPrefix(prefix) {
        throw new Error('Configure LocationUpgrade through LocationUpgradeModule.config method.');
    }
    /**
     * Stub method used to keep API compatible with AngularJS. This setting is configured through
     * the LocationUpgradeModule's `config` method in your Angular app.
     */
    html5Mode(mode) {
        throw new Error('Configure LocationUpgrade through LocationUpgradeModule.config method.');
    }
}

/**
 * A codec for encoding and decoding URL parts.
 *
 * @publicApi
 **/
class UrlCodec {
}
/**
 * A `UrlCodec` that uses logic from AngularJS to serialize and parse URLs
 * and URL parameters.
 *
 * @publicApi
 */
class AngularJSUrlCodec {
    // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L15
    encodePath(path) {
        const segments = path.split('/');
        let i = segments.length;
        while (i--) {
            // decode forward slashes to prevent them from being double encoded
            segments[i] = encodeUriSegment(segments[i].replace(/%2F/g, '/'));
        }
        path = segments.join('/');
        return _stripIndexHtml(((path && path[0] !== '/' && '/') || '') + path);
    }
    // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L42
    encodeSearch(search) {
        if (typeof search === 'string') {
            search = parseKeyValue(search);
        }
        search = toKeyValue(search);
        return search ? '?' + search : '';
    }
    // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L44
    encodeHash(hash) {
        hash = encodeUriSegment(hash);
        return hash ? '#' + hash : '';
    }
    // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L27
    decodePath(path, html5Mode = true) {
        const segments = path.split('/');
        let i = segments.length;
        while (i--) {
            segments[i] = decodeURIComponent(segments[i]);
            if (html5Mode) {
                // encode forward slashes to prevent them from being mistaken for path separators
                segments[i] = segments[i].replace(/\//g, '%2F');
            }
        }
        return segments.join('/');
    }
    // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L72
    decodeSearch(search) {
        return parseKeyValue(search);
    }
    // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L73
    decodeHash(hash) {
        hash = decodeURIComponent(hash);
        return hash[0] === '#' ? hash.substring(1) : hash;
    }
    normalize(pathOrHref, search, hash, baseUrl) {
        if (arguments.length === 1) {
            const parsed = this.parse(pathOrHref, baseUrl);
            if (typeof parsed === 'string') {
                return parsed;
            }
            const serverUrl = `${parsed.protocol}://${parsed.hostname}${parsed.port ? ':' + parsed.port : ''}`;
            return this.normalize(this.decodePath(parsed.pathname), this.decodeSearch(parsed.search), this.decodeHash(parsed.hash), serverUrl);
        }
        else {
            const encPath = this.encodePath(pathOrHref);
            const encSearch = (search && this.encodeSearch(search)) || '';
            const encHash = (hash && this.encodeHash(hash)) || '';
            let joinedPath = (baseUrl || '') + encPath;
            if (!joinedPath.length || joinedPath[0] !== '/') {
                joinedPath = '/' + joinedPath;
            }
            return joinedPath + encSearch + encHash;
        }
    }
    areEqual(valA, valB) {
        return this.normalize(valA) === this.normalize(valB);
    }
    // https://github.com/angular/angular.js/blob/864c7f0/src/ng/urlUtils.js#L60
    parse(url, base) {
        try {
            // Safari 12 throws an error when the URL constructor is called with an undefined base.
            const parsed = !base ? new URL(url) : new URL(url, base);
            return {
                href: parsed.href,
                protocol: parsed.protocol ? parsed.protocol.replace(/:$/, '') : '',
                host: parsed.host,
                search: parsed.search ? parsed.search.replace(/^\?/, '') : '',
                hash: parsed.hash ? parsed.hash.replace(/^#/, '') : '',
                hostname: parsed.hostname,
                port: parsed.port,
                pathname: parsed.pathname.charAt(0) === '/' ? parsed.pathname : '/' + parsed.pathname,
            };
        }
        catch (e) {
            throw new Error(`Invalid URL (${url}) with base (${base})`);
        }
    }
}
function _stripIndexHtml(url) {
    return url.replace(/\/index.html$/, '');
}
/**
 * Tries to decode the URI component without throwing an exception.
 *
 * @param str value potential URI component to check.
 * @returns the decoded URI if it can be decoded or else `undefined`.
 */
function tryDecodeURIComponent(value) {
    try {
        return decodeURIComponent(value);
    }
    catch (e) {
        // Ignore any invalid uri component.
        return undefined;
    }
}
/**
 * Parses an escaped url query string into key-value pairs. Logic taken from
 * https://github.com/angular/angular.js/blob/864c7f0/src/Angular.js#L1382
 */
function parseKeyValue(keyValue) {
    const obj = {};
    (keyValue || '').split('&').forEach((keyValue) => {
        let splitPoint, key, val;
        if (keyValue) {
            key = keyValue = keyValue.replace(/\+/g, '%20');
            splitPoint = keyValue.indexOf('=');
            if (splitPoint !== -1) {
                key = keyValue.substring(0, splitPoint);
                val = keyValue.substring(splitPoint + 1);
            }
            key = tryDecodeURIComponent(key);
            if (typeof key !== 'undefined') {
                val = typeof val !== 'undefined' ? tryDecodeURIComponent(val) : true;
                if (!obj.hasOwnProperty(key)) {
                    obj[key] = val;
                }
                else if (Array.isArray(obj[key])) {
                    obj[key].push(val);
                }
                else {
                    obj[key] = [obj[key], val];
                }
            }
        }
    });
    return obj;
}
/**
 * Serializes into key-value pairs. Logic taken from
 * https://github.com/angular/angular.js/blob/864c7f0/src/Angular.js#L1409
 */
function toKeyValue(obj) {
    const parts = [];
    for (const key in obj) {
        let value = obj[key];
        if (Array.isArray(value)) {
            value.forEach((arrayValue) => {
                parts.push(encodeUriQuery(key, true) +
                    (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));
            });
        }
        else {
            parts.push(encodeUriQuery(key, true) +
                (value === true ? '' : '=' + encodeUriQuery(value, true)));
        }
    }
    return parts.length ? parts.join('&') : '';
}
/**
 * We need our custom method because encodeURIComponent is too aggressive and doesn't follow
 * https://tools.ietf.org/html/rfc3986 with regards to the character set (pchar) allowed in path
 * segments:
 *    segment       = *pchar
 *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
 *    pct-encoded   = "%" HEXDIG HEXDIG
 *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
 *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
 *                     / "*" / "+" / "," / ";" / "="
 *
 * Logic from https://github.com/angular/angular.js/blob/864c7f0/src/Angular.js#L1437
 */
function encodeUriSegment(val) {
    return encodeUriQuery(val, true).replace(/%26/g, '&').replace(/%3D/gi, '=').replace(/%2B/gi, '+');
}
/**
 * This method is intended for encoding *key* or *value* parts of query component. We need a custom
 * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
 * encoded per https://tools.ietf.org/html/rfc3986:
 *    query         = *( pchar / "/" / "?" )
 *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
 *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
 *    pct-encoded   = "%" HEXDIG HEXDIG
 *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
 *                     / "*" / "+" / "," / ";" / "="
 *
 * Logic from https://github.com/angular/angular.js/blob/864c7f0/src/Angular.js#L1456
 */
function encodeUriQuery(val, pctEncodeSpaces = false) {
    return encodeURIComponent(val)
        .replace(/%40/g, '@')
        .replace(/%3A/gi, ':')
        .replace(/%24/g, '$')
        .replace(/%2C/gi, ',')
        .replace(/%3B/gi, ';')
        .replace(/%20/g, pctEncodeSpaces ? '%20' : '+');
}

/**
 * A provider token used to configure the location upgrade module.
 *
 * @publicApi
 */
const LOCATION_UPGRADE_CONFIGURATION = new InjectionToken(ngDevMode ? 'LOCATION_UPGRADE_CONFIGURATION' : '');
const APP_BASE_HREF_RESOLVED = new InjectionToken(ngDevMode ? 'APP_BASE_HREF_RESOLVED' : '');
/**
 * `NgModule` used for providing and configuring Angular's Unified Location Service for upgrading.
 *
 * @see [Using the Unified Angular Location Service](https://angular.io/guide/upgrade#using-the-unified-angular-location-service)
 *
 * @publicApi
 */
class LocationUpgradeModule {
    static config(config) {
        return {
            ngModule: LocationUpgradeModule,
            providers: [
                Location,
                {
                    provide: $locationShim,
                    useFactory: provide$location,
                    deps: [UpgradeModule, Location, PlatformLocation, UrlCodec, LocationStrategy],
                },
                { provide: LOCATION_UPGRADE_CONFIGURATION, useValue: config ? config : {} },
                { provide: UrlCodec, useFactory: provideUrlCodec, deps: [LOCATION_UPGRADE_CONFIGURATION] },
                {
                    provide: APP_BASE_HREF_RESOLVED,
                    useFactory: provideAppBaseHref,
                    deps: [LOCATION_UPGRADE_CONFIGURATION, [new Inject(APP_BASE_HREF), new Optional()]],
                },
                {
                    provide: LocationStrategy,
                    useFactory: provideLocationStrategy,
                    deps: [PlatformLocation, APP_BASE_HREF_RESOLVED, LOCATION_UPGRADE_CONFIGURATION],
                },
            ],
        };
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LocationUpgradeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
    static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: LocationUpgradeModule, imports: [CommonModule] });
    static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LocationUpgradeModule, imports: [CommonModule] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LocationUpgradeModule, decorators: [{
            type: NgModule,
            args: [{ imports: [CommonModule] }]
        }] });
function provideAppBaseHref(config, appBaseHref) {
    if (config && config.appBaseHref != null) {
        return config.appBaseHref;
    }
    else if (appBaseHref != null) {
        return appBaseHref;
    }
    return '';
}
function provideUrlCodec(config) {
    const codec = (config && config.urlCodec) || AngularJSUrlCodec;
    return new codec();
}
function provideLocationStrategy(platformLocation, baseHref, options = {}) {
    return options.useHash
        ? new HashLocationStrategy(platformLocation, baseHref)
        : new PathLocationStrategy(platformLocation, baseHref);
}
function provide$location(ngUpgrade, location, platformLocation, urlCodec, locationStrategy) {
    const $locationProvider = new $locationShimProvider(ngUpgrade, location, platformLocation, urlCodec, locationStrategy);
    return $locationProvider.$get();
}

export { $locationShim, $locationShimProvider, AngularJSUrlCodec, LOCATION_UPGRADE_CONFIGURATION, LocationUpgradeModule, UrlCodec };
//# sourceMappingURL=upgrade.mjs.map
x){"version":3,"file":"upgrade.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/upgrade/src/utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/upgrade/src/location_shim.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/upgrade/src/params.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/upgrade/src/location_upgrade_module.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport function stripPrefix(val: string, prefix: string): string {\n  return val.startsWith(prefix) ? val.substring(prefix.length) : val;\n}\n\nexport function deepEqual(a: any, b: any): boolean {\n  if (a === b) {\n    return true;\n  } else if (!a || !b) {\n    return false;\n  } else {\n    try {\n      if (a.prototype !== b.prototype || (Array.isArray(a) && Array.isArray(b))) {\n        return false;\n      }\n      return JSON.stringify(a) === JSON.stringify(b);\n    } catch (e) {\n      return false;\n    }\n  }\n}\n\nexport function isAnchor(el: (Node & ParentNode) | Element | null): el is HTMLAnchorElement {\n  return (<HTMLAnchorElement>el).href !== undefined;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Location, LocationStrategy, PlatformLocation} from '../../index';\nimport {ɵisPromise as isPromise} from '@angular/core';\nimport {UpgradeModule} from '@angular/upgrade/static';\nimport {ReplaySubject} from 'rxjs';\n\nimport {UrlCodec} from './params';\nimport {deepEqual, isAnchor} from './utils';\n\nconst PATH_MATCH = /^([^?#]*)(\\?([^#]*))?(#(.*))?$/;\nconst DOUBLE_SLASH_REGEX = /^\\s*[\\\\/]{2,}/;\nconst IGNORE_URI_REGEXP = /^\\s*(javascript|mailto):/i;\nconst DEFAULT_PORTS: {[key: string]: number} = {\n  'http:': 80,\n  'https:': 443,\n  'ftp:': 21,\n};\n\n/**\n * Location service that provides a drop-in replacement for the $location service\n * provided in AngularJS.\n *\n * @see [Using the Angular Unified Location Service](guide/upgrade#using-the-unified-angular-location-service)\n *\n * @publicApi\n */\nexport class $locationShim {\n  private initializing = true;\n  private updateBrowser = false;\n  private $$absUrl: string = '';\n  private $$url: string = '';\n  private $$protocol: string;\n  private $$host: string = '';\n  private $$port: number | null;\n  private $$replace: boolean = false;\n  private $$path: string = '';\n  private $$search: any = '';\n  private $$hash: string = '';\n  private $$state: unknown;\n  private $$changeListeners: [\n    (\n      url: string,\n      state: unknown,\n      oldUrl: string,\n      oldState: unknown,\n      err?: (e: Error) => void,\n    ) => void,\n    (e: Error) => void,\n  ][] = [];\n\n  private cachedState: unknown = null;\n\n  private urlChanges = new ReplaySubject<{newUrl: string; newState: unknown}>(1);\n\n  private readonly removeOnUrlChangeFn: VoidFunction;\n\n  constructor(\n    $injector: any,\n    private location: Location,\n    private platformLocation: PlatformLocation,\n    private urlCodec: UrlCodec,\n    private locationStrategy: LocationStrategy,\n  ) {\n    const initialUrl = this.browserUrl();\n\n    let parsedUrl = this.urlCodec.parse(initialUrl);\n\n    if (typeof parsedUrl === 'string') {\n      throw 'Invalid URL';\n    }\n\n    this.$$protocol = parsedUrl.protocol;\n    this.$$host = parsedUrl.hostname;\n    this.$$port = parseInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;\n\n    this.$$parseLinkUrl(initialUrl, initialUrl);\n    this.cacheState();\n    this.$$state = this.browserState();\n\n    this.removeOnUrlChangeFn = this.location.onUrlChange((newUrl, newState) => {\n      this.urlChanges.next({newUrl, newState});\n    });\n\n    if (isPromise($injector)) {\n      $injector.then(($i) => this.initialize($i));\n    } else {\n      this.initialize($injector);\n    }\n  }\n\n  private initialize($injector: any) {\n    const $rootScope = $injector.get('$rootScope');\n    const $rootElement = $injector.get('$rootElement');\n\n    $rootElement.on('click', (event: any) => {\n      if (\n        event.ctrlKey ||\n        event.metaKey ||\n        event.shiftKey ||\n        event.which === 2 ||\n        event.button === 2\n      ) {\n        return;\n      }\n\n      let elm: (Node & ParentNode) | null = event.target;\n\n      // traverse the DOM up to find first A tag\n      while (elm && elm.nodeName.toLowerCase() !== 'a') {\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\n        if (elm === $rootElement[0] || !(elm = elm.parentNode)) {\n          return;\n        }\n      }\n\n      if (!isAnchor(elm)) {\n        return;\n      }\n\n      const absHref = elm.href;\n      const relHref = elm.getAttribute('href');\n\n      // Ignore when url is started with javascript: or mailto:\n      if (IGNORE_URI_REGEXP.test(absHref)) {\n        return;\n      }\n\n      if (absHref && !elm.getAttribute('target') && !event.isDefaultPrevented()) {\n        if (this.$$parseLinkUrl(absHref, relHref)) {\n          // We do a preventDefault for all urls that are part of the AngularJS application,\n          // in html5mode and also without, so that we are able to abort navigation without\n          // getting double entries in the location history.\n          event.preventDefault();\n          // update location manually\n          if (this.absUrl() !== this.browserUrl()) {\n            $rootScope.$apply();\n          }\n        }\n      }\n    });\n\n    this.urlChanges.subscribe(({newUrl, newState}) => {\n      const oldUrl = this.absUrl();\n      const oldState = this.$$state;\n      this.$$parse(newUrl);\n      newUrl = this.absUrl();\n      this.$$state = newState;\n      const defaultPrevented = $rootScope.$broadcast(\n        '$locationChangeStart',\n        newUrl,\n        oldUrl,\n        newState,\n        oldState,\n      ).defaultPrevented;\n\n      // if the location was changed by a `$locationChangeStart` handler then stop\n      // processing this location change\n      if (this.absUrl() !== newUrl) return;\n\n      // If default was prevented, set back to old state. This is the state that was locally\n      // cached in the $location service.\n      if (defaultPrevented) {\n        this.$$parse(oldUrl);\n        this.state(oldState);\n        this.setBrowserUrlWithFallback(oldUrl, false, oldState);\n        this.$$notifyChangeListeners(this.url(), this.$$state, oldUrl, oldState);\n      } else {\n        this.initializing = false;\n        $rootScope.$broadcast('$locationChangeSuccess', newUrl, oldUrl, newState, oldState);\n        this.resetBrowserUpdate();\n      }\n      if (!$rootScope.$$phase) {\n        $rootScope.$digest();\n      }\n    });\n\n    // Synchronize the browser's URL and state with the application.\n    // Note: There is no need to save the `$watch` return value (deregister listener)\n    // into a variable because `$scope.$$watchers` is automatically cleaned up when\n    // the root scope is destroyed.\n    $rootScope.$watch(() => {\n      if (this.initializing || this.updateBrowser) {\n        this.updateBrowser = false;\n\n        const oldUrl = this.browserUrl();\n        const newUrl = this.absUrl();\n        const oldState = this.browserState();\n        let currentReplace = this.$$replace;\n\n        const urlOrStateChanged =\n          !this.urlCodec.areEqual(oldUrl, newUrl) || oldState !== this.$$state;\n\n        // Fire location changes one time to on initialization. This must be done on the\n        // next tick (thus inside $evalAsync()) in order for listeners to be registered\n        // before the event fires. Mimicing behavior from $locationWatch:\n        // https://github.com/angular/angular.js/blob/master/src/ng/location.js#L983\n        if (this.initializing || urlOrStateChanged) {\n          this.initializing = false;\n\n          $rootScope.$evalAsync(() => {\n            // Get the new URL again since it could have changed due to async update\n            const newUrl = this.absUrl();\n            const defaultPrevented = $rootScope.$broadcast(\n              '$locationChangeStart',\n              newUrl,\n              oldUrl,\n              this.$$state,\n              oldState,\n            ).defaultPrevented;\n\n            // if the location was changed by a `$locationChangeStart` handler then stop\n            // processing this location change\n            if (this.absUrl() !== newUrl) return;\n\n            if (defaultPrevented) {\n              this.$$parse(oldUrl);\n              this.$$state = oldState;\n            } else {\n              // This block doesn't run when initializing because it's going to perform the update\n              // to the URL which shouldn't be needed when initializing.\n              if (urlOrStateChanged) {\n                this.setBrowserUrlWithFallback(\n                  newUrl,\n                  currentReplace,\n                  oldState === this.$$state ? null : this.$$state,\n                );\n                this.$$replace = false;\n              }\n              $rootScope.$broadcast(\n                '$locationChangeSuccess',\n                newUrl,\n                oldUrl,\n                this.$$state,\n                oldState,\n              );\n              if (urlOrStateChanged) {\n                this.$$notifyChangeListeners(this.url(), this.$$state, oldUrl, oldState);\n              }\n            }\n          });\n        }\n      }\n      this.$$replace = false;\n    });\n\n    $rootScope.$on('$destroy', () => {\n      this.removeOnUrlChangeFn();\n      // Complete the subject to release all active observers when the root\n      // scope is destroyed. Before this change, we subscribed to the `urlChanges`\n      // subject, and the subscriber captured `this`, leading to a memory leak\n      // after the root scope was destroyed.\n      this.urlChanges.complete();\n    });\n  }\n\n  private resetBrowserUpdate() {\n    this.$$replace = false;\n    this.$$state = this.browserState();\n    this.updateBrowser = false;\n    this.lastBrowserUrl = this.browserUrl();\n  }\n\n  private lastHistoryState: unknown;\n  private lastBrowserUrl: string = '';\n  private browserUrl(): string;\n  private browserUrl(url: string, replace?: boolean, state?: unknown): this;\n  private browserUrl(url?: string, replace?: boolean, state?: unknown) {\n    // In modern browsers `history.state` is `null` by default; treating it separately\n    // from `undefined` would cause `$browser.url('/foo')` to change `history.state`\n    // to undefined via `pushState`. Instead, let's change `undefined` to `null` here.\n    if (typeof state === 'undefined') {\n      state = null;\n    }\n\n    // setter\n    if (url) {\n      let sameState = this.lastHistoryState === state;\n\n      // Normalize the inputted URL\n      url = this.urlCodec.parse(url).href;\n\n      // Don't change anything if previous and current URLs and states match.\n      if (this.lastBrowserUrl === url && sameState) {\n        return this;\n      }\n      this.lastBrowserUrl = url;\n      this.lastHistoryState = state;\n\n      // Remove server base from URL as the Angular APIs for updating URL require\n      // it to be the path+.\n      url = this.stripBaseUrl(this.getServerBase(), url) || url;\n\n      // Set the URL\n      if (replace) {\n        this.locationStrategy.replaceState(state, '', url, '');\n      } else {\n        this.locationStrategy.pushState(state, '', url, '');\n      }\n\n      this.cacheState();\n\n      return this;\n      // getter\n    } else {\n      return this.platformLocation.href;\n    }\n  }\n\n  // This variable should be used *only* inside the cacheState function.\n  private lastCachedState: unknown = null;\n  private cacheState() {\n    // This should be the only place in $browser where `history.state` is read.\n    this.cachedState = this.platformLocation.getState();\n    if (typeof this.cachedState === 'undefined') {\n      this.cachedState = null;\n    }\n\n    // Prevent callbacks fo fire twice if both hashchange & popstate were fired.\n    if (deepEqual(this.cachedState, this.lastCachedState)) {\n      this.cachedState = this.lastCachedState;\n    }\n\n    this.lastCachedState = this.cachedState;\n    this.lastHistoryState = this.cachedState;\n  }\n\n  /**\n   * This function emulates the $browser.state() function from AngularJS. It will cause\n   * history.state to be cached unless changed with deep equality check.\n   */\n  private browserState(): unknown {\n    return this.cachedState;\n  }\n\n  private stripBaseUrl(base: string, url: string) {\n    if (url.startsWith(base)) {\n      return url.slice(base.length);\n    }\n    return undefined;\n  }\n\n  private getServerBase() {\n    const {protocol, hostname, port} = this.platformLocation;\n    const baseHref = this.locationStrategy.getBaseHref();\n    let url = `${protocol}//${hostname}${port ? ':' + port : ''}${baseHref || '/'}`;\n    return url.endsWith('/') ? url : url + '/';\n  }\n\n  private parseAppUrl(url: string) {\n    if (DOUBLE_SLASH_REGEX.test(url)) {\n      throw new Error(`Bad Path - URL cannot start with double slashes: ${url}`);\n    }\n\n    let prefixed = url.charAt(0) !== '/';\n    if (prefixed) {\n      url = '/' + url;\n    }\n    let match = this.urlCodec.parse(url, this.getServerBase());\n    if (typeof match === 'string') {\n      throw new Error(`Bad URL - Cannot parse URL: ${url}`);\n    }\n    let path =\n      prefixed && match.pathname.charAt(0) === '/' ? match.pathname.substring(1) : match.pathname;\n    this.$$path = this.urlCodec.decodePath(path);\n    this.$$search = this.urlCodec.decodeSearch(match.search);\n    this.$$hash = this.urlCodec.decodeHash(match.hash);\n\n    // make sure path starts with '/';\n    if (this.$$path && this.$$path.charAt(0) !== '/') {\n      this.$$path = '/' + this.$$path;\n    }\n  }\n\n  /**\n   * Registers listeners for URL changes. This API is used to catch updates performed by the\n   * AngularJS framework. These changes are a subset of the `$locationChangeStart` and\n   * `$locationChangeSuccess` events which fire when AngularJS updates its internally-referenced\n   * version of the browser URL.\n   *\n   * It's possible for `$locationChange` events to happen, but for the browser URL\n   * (window.location) to remain unchanged. This `onChange` callback will fire only when AngularJS\n   * actually updates the browser URL (window.location).\n   *\n   * @param fn The callback function that is triggered for the listener when the URL changes.\n   * @param err The callback function that is triggered when an error occurs.\n   */\n  onChange(\n    fn: (url: string, state: unknown, oldUrl: string, oldState: unknown) => void,\n    err: (e: Error) => void = (e: Error) => {},\n  ) {\n    this.$$changeListeners.push([fn, err]);\n  }\n\n  /** @internal */\n  $$notifyChangeListeners(\n    url: string = '',\n    state: unknown,\n    oldUrl: string = '',\n    oldState: unknown,\n  ) {\n    this.$$changeListeners.forEach(([fn, err]) => {\n      try {\n        fn(url, state, oldUrl, oldState);\n      } catch (e) {\n        err(e as Error);\n      }\n    });\n  }\n\n  /**\n   * Parses the provided URL, and sets the current URL to the parsed result.\n   *\n   * @param url The URL string.\n   */\n  $$parse(url: string) {\n    let pathUrl: string | undefined;\n    if (url.startsWith('/')) {\n      pathUrl = url;\n    } else {\n      // Remove protocol & hostname if URL starts with it\n      pathUrl = this.stripBaseUrl(this.getServerBase(), url);\n    }\n    if (typeof pathUrl === 'undefined') {\n      throw new Error(`Invalid url \"${url}\", missing path prefix \"${this.getServerBase()}\".`);\n    }\n\n    this.parseAppUrl(pathUrl);\n\n    this.$$path ||= '/';\n    this.composeUrls();\n  }\n\n  /**\n   * Parses the provided URL and its relative URL.\n   *\n   * @param url The full URL string.\n   * @param relHref A URL string relative to the full URL string.\n   */\n  $$parseLinkUrl(url: string, relHref?: string | null): boolean {\n    // When relHref is passed, it should be a hash and is handled separately\n    if (relHref && relHref[0] === '#') {\n      this.hash(relHref.slice(1));\n      return true;\n    }\n    let rewrittenUrl;\n    let appUrl = this.stripBaseUrl(this.getServerBase(), url);\n    if (typeof appUrl !== 'undefined') {\n      rewrittenUrl = this.getServerBase() + appUrl;\n    } else if (this.getServerBase() === url + '/') {\n      rewrittenUrl = this.getServerBase();\n    }\n    // Set the URL\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  }\n\n  private setBrowserUrlWithFallback(url: string, replace: boolean, state: unknown) {\n    const oldUrl = this.url();\n    const oldState = this.$$state;\n    try {\n      this.browserUrl(url, replace, state);\n\n      // Make sure $location.state() returns referentially identical (not just deeply equal)\n      // state object; this makes possible quick checking if the state changed in the digest\n      // loop. Checking deep equality would be too expensive.\n      this.$$state = this.browserState();\n    } catch (e) {\n      // Restore old values if pushState fails\n      this.url(oldUrl);\n      this.$$state = oldState;\n\n      throw e;\n    }\n  }\n\n  private composeUrls() {\n    this.$$url = this.urlCodec.normalize(this.$$path, this.$$search, this.$$hash);\n    this.$$absUrl = this.getServerBase() + this.$$url.slice(1); // remove '/' from front of URL\n    this.updateBrowser = true;\n  }\n\n  /**\n   * Retrieves the full URL representation with all segments encoded according to\n   * rules specified in\n   * [RFC 3986](https://tools.ietf.org/html/rfc3986).\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * let absUrl = $location.absUrl();\n   * // => \"http://example.com/#/some/path?foo=bar&baz=xoxo\"\n   * ```\n   */\n  absUrl(): string {\n    return this.$$absUrl;\n  }\n\n  /**\n   * Retrieves the current URL, or sets a new URL. When setting a URL,\n   * changes the path, search, and hash, and returns a reference to its own instance.\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * let url = $location.url();\n   * // => \"/some/path?foo=bar&baz=xoxo\"\n   * ```\n   */\n  url(): string;\n  url(url: string): this;\n  url(url?: string): string | this {\n    if (typeof url === 'string') {\n      if (!url.length) {\n        url = '/';\n      }\n\n      const match = PATH_MATCH.exec(url);\n      if (!match) return this;\n      if (match[1] || url === '') this.path(this.urlCodec.decodePath(match[1]));\n      if (match[2] || match[1] || url === '') this.search(match[3] || '');\n      this.hash(match[5] || '');\n\n      // Chainable method\n      return this;\n    }\n\n    return this.$$url;\n  }\n\n  /**\n   * Retrieves the protocol of the current URL.\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * let protocol = $location.protocol();\n   * // => \"http\"\n   * ```\n   */\n  protocol(): string {\n    return this.$$protocol;\n  }\n\n  /**\n   * Retrieves the protocol of the current URL.\n   *\n   * In contrast to the non-AngularJS version `location.host` which returns `hostname:port`, this\n   * returns the `hostname` portion only.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * let host = $location.host();\n   * // => \"example.com\"\n   *\n   * // given URL http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo\n   * host = $location.host();\n   * // => \"example.com\"\n   * host = location.host;\n   * // => \"example.com:8080\"\n   * ```\n   */\n  host(): string {\n    return this.$$host;\n  }\n\n  /**\n   * Retrieves the port of the current URL.\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * let port = $location.port();\n   * // => 80\n   * ```\n   */\n  port(): number | null {\n    return this.$$port;\n  }\n\n  /**\n   * Retrieves the path of the current URL, or changes the path and returns a reference to its own\n   * instance.\n   *\n   * Paths should always begin with forward slash (/). This method adds the forward slash\n   * if it is missing.\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * let path = $location.path();\n   * // => \"/some/path\"\n   * ```\n   */\n  path(): string;\n  path(path: string | number | null): this;\n  path(path?: string | number | null): string | this {\n    if (typeof path === 'undefined') {\n      return this.$$path;\n    }\n\n    // null path converts to empty string. Prepend with \"/\" if needed.\n    path = path !== null ? path.toString() : '';\n    path = path.charAt(0) === '/' ? path : '/' + path;\n\n    this.$$path = path;\n\n    this.composeUrls();\n    return this;\n  }\n\n  /**\n   * Retrieves a map of the search parameters of the current URL, or changes a search\n   * part and returns a reference to its own instance.\n   *\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo\n   * let searchObject = $location.search();\n   * // => {foo: 'bar', baz: 'xoxo'}\n   *\n   * // set foo to 'yipee'\n   * $location.search('foo', 'yipee');\n   * // $location.search() => {foo: 'yipee', baz: 'xoxo'}\n   * ```\n   *\n   * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or\n   * hash object.\n   *\n   * When called with a single argument the method acts as a setter, setting the `search` component\n   * of `$location` to the specified value.\n   *\n   * If the argument is a hash object containing an array of values, these values will be encoded\n   * as duplicate search parameters in the URL.\n   *\n   * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number,\n   *     then `paramValue`\n   * will override only a single search property.\n   *\n   * If `paramValue` is an array, it will override the property of the `search` component of\n   * `$location` specified via the first argument.\n   *\n   * If `paramValue` is `null`, the property specified via the first argument will be deleted.\n   *\n   * If `paramValue` is `true`, the property specified via the first argument will be added with no\n   * value nor trailing equal sign.\n   *\n   * @return {Object} The parsed `search` object of the current URL, or the changed `search` object.\n   */\n  search(): {[key: string]: unknown};\n  search(search: string | number | {[key: string]: unknown}): this;\n  search(\n    search: string | number | {[key: string]: unknown},\n    paramValue: null | undefined | string | number | boolean | string[],\n  ): this;\n  search(\n    search?: string | number | {[key: string]: unknown},\n    paramValue?: null | undefined | string | number | boolean | string[],\n  ): {[key: string]: unknown} | this {\n    switch (arguments.length) {\n      case 0:\n        return this.$$search;\n      case 1:\n        if (typeof search === 'string' || typeof search === 'number') {\n          this.$$search = this.urlCodec.decodeSearch(search.toString());\n        } else if (typeof search === 'object' && search !== null) {\n          // Copy the object so it's never mutated\n          search = {...search};\n          // remove object undefined or null properties\n          for (const key in search) {\n            if (search[key] == null) delete search[key];\n          }\n\n          this.$$search = search;\n        } else {\n          throw new Error(\n            'LocationProvider.search(): First argument must be a string or an object.',\n          );\n        }\n        break;\n      default:\n        if (typeof search === 'string') {\n          const currentSearch = this.search();\n          if (typeof paramValue === 'undefined' || paramValue === null) {\n            delete currentSearch[search];\n            return this.search(currentSearch);\n          } else {\n            currentSearch[search] = paramValue;\n            return this.search(currentSearch);\n          }\n        }\n    }\n    this.composeUrls();\n    return this;\n  }\n\n  /**\n   * Retrieves the current hash fragment, or changes the hash fragment and returns a reference to\n   * its own instance.\n   *\n   * ```js\n   * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue\n   * let hash = $location.hash();\n   * // => \"hashValue\"\n   * ```\n   */\n  hash(): string;\n  hash(hash: string | number | null): this;\n  hash(hash?: string | number | null): string | this {\n    if (typeof hash === 'undefined') {\n      return this.$$hash;\n    }\n\n    this.$$hash = hash !== null ? hash.toString() : '';\n\n    this.composeUrls();\n    return this;\n  }\n\n  /**\n   * Changes to `$location` during the current `$digest` will replace the current\n   * history record, instead of adding a new one.\n   */\n  replace(): this {\n    this.$$replace = true;\n    return this;\n  }\n\n  /**\n   * Retrieves the history state object when called without any parameter.\n   *\n   * Change the history state object when called with one parameter and return `$location`.\n   * The state object is later passed to `pushState` or `replaceState`.\n   *\n   * This method is supported only in HTML5 mode and only in browsers supporting\n   * the HTML5 History API methods such as `pushState` and `replaceState`. If you need to support\n   * older browsers (like Android < 4.0), don't use this method.\n   *\n   */\n  state(): unknown;\n  state(state: unknown): this;\n  state(state?: unknown): unknown | this {\n    if (typeof state === 'undefined') {\n      return this.$$state;\n    }\n\n    this.$$state = state;\n    return this;\n  }\n}\n\n/**\n * The factory function used to create an instance of the `$locationShim` in Angular,\n * and provides an API-compatible `$locationProvider` for AngularJS.\n *\n * @publicApi\n */\nexport class $locationShimProvider {\n  constructor(\n    private ngUpgrade: UpgradeModule,\n    private location: Location,\n    private platformLocation: PlatformLocation,\n    private urlCodec: UrlCodec,\n    private locationStrategy: LocationStrategy,\n  ) {}\n\n  /**\n   * Factory method that returns an instance of the $locationShim\n   */\n  $get() {\n    return new $locationShim(\n      this.ngUpgrade.$injector,\n      this.location,\n      this.platformLocation,\n      this.urlCodec,\n      this.locationStrategy,\n    );\n  }\n\n  /**\n   * Stub method used to keep API compatible with AngularJS. This setting is configured through\n   * the LocationUpgradeModule's `config` method in your Angular app.\n   */\n  hashPrefix(prefix?: string) {\n    throw new Error('Configure LocationUpgrade through LocationUpgradeModule.config method.');\n  }\n\n  /**\n   * Stub method used to keep API compatible with AngularJS. This setting is configured through\n   * the LocationUpgradeModule's `config` method in your Angular app.\n   */\n  html5Mode(mode?: any) {\n    throw new Error('Configure LocationUpgrade through LocationUpgradeModule.config method.');\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * A codec for encoding and decoding URL parts.\n *\n * @publicApi\n **/\nexport abstract class UrlCodec {\n  /**\n   * Encodes the path from the provided string\n   *\n   * @param path The path string\n   */\n  abstract encodePath(path: string): string;\n\n  /**\n   * Decodes the path from the provided string\n   *\n   * @param path The path string\n   */\n  abstract decodePath(path: string): string;\n\n  /**\n   * Encodes the search string from the provided string or object\n   *\n   * @param path The path string or object\n   */\n  abstract encodeSearch(search: string | {[k: string]: unknown}): string;\n\n  /**\n   * Decodes the search objects from the provided string\n   *\n   * @param path The path string\n   */\n  abstract decodeSearch(search: string): {[k: string]: unknown};\n\n  /**\n   * Encodes the hash from the provided string\n   *\n   * @param path The hash string\n   */\n  abstract encodeHash(hash: string): string;\n\n  /**\n   * Decodes the hash from the provided string\n   *\n   * @param path The hash string\n   */\n  abstract decodeHash(hash: string): string;\n\n  /**\n   * Normalizes the URL from the provided string\n   *\n   * @param path The URL string\n   */\n  abstract normalize(href: string): string;\n\n  /**\n   * Normalizes the URL from the provided string, search, hash, and base URL parameters\n   *\n   * @param path The URL path\n   * @param search The search object\n   * @param hash The has string\n   * @param baseUrl The base URL for the URL\n   */\n  abstract normalize(\n    path: string,\n    search: {[k: string]: unknown},\n    hash: string,\n    baseUrl?: string,\n  ): string;\n\n  /**\n   * Checks whether the two strings are equal\n   * @param valA First string for comparison\n   * @param valB Second string for comparison\n   */\n  abstract areEqual(valA: string, valB: string): boolean;\n\n  /**\n   * Parses the URL string based on the base URL\n   *\n   * @param url The full URL string\n   * @param base The base for the URL\n   */\n  abstract parse(\n    url: string,\n    base?: string,\n  ): {\n    href: string;\n    protocol: string;\n    host: string;\n    search: string;\n    hash: string;\n    hostname: string;\n    port: string;\n    pathname: string;\n  };\n}\n\n/**\n * A `UrlCodec` that uses logic from AngularJS to serialize and parse URLs\n * and URL parameters.\n *\n * @publicApi\n */\nexport class AngularJSUrlCodec implements UrlCodec {\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L15\n  encodePath(path: string): string {\n    const segments = path.split('/');\n    let i = segments.length;\n\n    while (i--) {\n      // decode forward slashes to prevent them from being double encoded\n      segments[i] = encodeUriSegment(segments[i].replace(/%2F/g, '/'));\n    }\n\n    path = segments.join('/');\n    return _stripIndexHtml(((path && path[0] !== '/' && '/') || '') + path);\n  }\n\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L42\n  encodeSearch(search: string | {[k: string]: unknown}): string {\n    if (typeof search === 'string') {\n      search = parseKeyValue(search);\n    }\n\n    search = toKeyValue(search);\n    return search ? '?' + search : '';\n  }\n\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L44\n  encodeHash(hash: string) {\n    hash = encodeUriSegment(hash);\n    return hash ? '#' + hash : '';\n  }\n\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L27\n  decodePath(path: string, html5Mode = true): string {\n    const segments = path.split('/');\n    let i = segments.length;\n\n    while (i--) {\n      segments[i] = decodeURIComponent(segments[i]);\n      if (html5Mode) {\n        // encode forward slashes to prevent them from being mistaken for path separators\n        segments[i] = segments[i].replace(/\\//g, '%2F');\n      }\n    }\n\n    return segments.join('/');\n  }\n\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L72\n  decodeSearch(search: string) {\n    return parseKeyValue(search);\n  }\n\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L73\n  decodeHash(hash: string) {\n    hash = decodeURIComponent(hash);\n    return hash[0] === '#' ? hash.substring(1) : hash;\n  }\n\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L149\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/location.js#L42\n  normalize(href: string): string;\n  normalize(path: string, search: {[k: string]: unknown}, hash: string, baseUrl?: string): string;\n  normalize(\n    pathOrHref: string,\n    search?: {[k: string]: unknown},\n    hash?: string,\n    baseUrl?: string,\n  ): string {\n    if (arguments.length === 1) {\n      const parsed = this.parse(pathOrHref, baseUrl);\n\n      if (typeof parsed === 'string') {\n        return parsed;\n      }\n\n      const serverUrl = `${parsed.protocol}://${parsed.hostname}${\n        parsed.port ? ':' + parsed.port : ''\n      }`;\n\n      return this.normalize(\n        this.decodePath(parsed.pathname),\n        this.decodeSearch(parsed.search),\n        this.decodeHash(parsed.hash),\n        serverUrl,\n      );\n    } else {\n      const encPath = this.encodePath(pathOrHref);\n      const encSearch = (search && this.encodeSearch(search)) || '';\n      const encHash = (hash && this.encodeHash(hash)) || '';\n\n      let joinedPath = (baseUrl || '') + encPath;\n\n      if (!joinedPath.length || joinedPath[0] !== '/') {\n        joinedPath = '/' + joinedPath;\n      }\n      return joinedPath + encSearch + encHash;\n    }\n  }\n\n  areEqual(valA: string, valB: string) {\n    return this.normalize(valA) === this.normalize(valB);\n  }\n\n  // https://github.com/angular/angular.js/blob/864c7f0/src/ng/urlUtils.js#L60\n  parse(url: string, base?: string) {\n    try {\n      // Safari 12 throws an error when the URL constructor is called with an undefined base.\n      const parsed = !base ? new URL(url) : new URL(url, base);\n      return {\n        href: parsed.href,\n        protocol: parsed.protocol ? parsed.protocol.replace(/:$/, '') : '',\n        host: parsed.host,\n        search: parsed.search ? parsed.search.replace(/^\\?/, '') : '',\n        hash: parsed.hash ? parsed.hash.replace(/^#/, '') : '',\n        hostname: parsed.hostname,\n        port: parsed.port,\n        pathname: parsed.pathname.charAt(0) === '/' ? parsed.pathname : '/' + parsed.pathname,\n      };\n    } catch (e) {\n      throw new Error(`Invalid URL (${url}) with base (${base})`);\n    }\n  }\n}\n\nfunction _stripIndexHtml(url: string): string {\n  return url.replace(/\\/index.html$/, '');\n}\n\n/**\n * Tries to decode the URI component without throwing an exception.\n *\n * @param str value potential URI component to check.\n * @returns the decoded URI if it can be decoded or else `undefined`.\n */\nfunction tryDecodeURIComponent(value: string): string | undefined {\n  try {\n    return decodeURIComponent(value);\n  } catch (e) {\n    // Ignore any invalid uri component.\n    return undefined;\n  }\n}\n\n/**\n * Parses an escaped url query string into key-value pairs. Logic taken from\n * https://github.com/angular/angular.js/blob/864c7f0/src/Angular.js#L1382\n */\nfunction parseKeyValue(keyValue: string): {[k: string]: unknown} {\n  const obj: {[k: string]: unknown} = {};\n  (keyValue || '').split('&').forEach((keyValue) => {\n    let splitPoint, key, val;\n    if (keyValue) {\n      key = keyValue = keyValue.replace(/\\+/g, '%20');\n      splitPoint = keyValue.indexOf('=');\n      if (splitPoint !== -1) {\n        key = keyValue.substring(0, splitPoint);\n        val = keyValue.substring(splitPoint + 1);\n      }\n      key = tryDecodeURIComponent(key);\n      if (typeof key !== 'undefined') {\n        val = typeof val !== 'undefined' ? tryDecodeURIComponent(val) : true;\n        if (!obj.hasOwnProperty(key)) {\n          obj[key] = val;\n        } else if (Array.isArray(obj[key])) {\n          (obj[key] as unknown[]).push(val);\n        } else {\n          obj[key] = [obj[key], val];\n        }\n      }\n    }\n  });\n  return obj;\n}\n\n/**\n * Serializes into key-value pairs. Logic taken from\n * https://github.com/angular/angular.js/blob/864c7f0/src/Angular.js#L1409\n */\nfunction toKeyValue(obj: {[k: string]: unknown}) {\n  const parts: unknown[] = [];\n  for (const key in obj) {\n    let value = obj[key];\n    if (Array.isArray(value)) {\n      value.forEach((arrayValue) => {\n        parts.push(\n          encodeUriQuery(key, true) +\n            (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)),\n        );\n      });\n    } else {\n      parts.push(\n        encodeUriQuery(key, true) +\n          (value === true ? '' : '=' + encodeUriQuery(value as any, true)),\n      );\n    }\n  }\n  return parts.length ? parts.join('&') : '';\n}\n\n/**\n * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\n * https://tools.ietf.org/html/rfc3986 with regards to the character set (pchar) allowed in path\n * segments:\n *    segment       = *pchar\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n *\n * Logic from https://github.com/angular/angular.js/blob/864c7f0/src/Angular.js#L1437\n */\nfunction encodeUriSegment(val: string) {\n  return encodeUriQuery(val, true).replace(/%26/g, '&').replace(/%3D/gi, '=').replace(/%2B/gi, '+');\n}\n\n/**\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\n * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be\n * encoded per https://tools.ietf.org/html/rfc3986:\n *    query         = *( pchar / \"/\" / \"?\" )\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n *\n * Logic from https://github.com/angular/angular.js/blob/864c7f0/src/Angular.js#L1456\n */\nfunction encodeUriQuery(val: string, pctEncodeSpaces: boolean = false) {\n  return encodeURIComponent(val)\n    .replace(/%40/g, '@')\n    .replace(/%3A/gi, ':')\n    .replace(/%24/g, '$')\n    .replace(/%2C/gi, ',')\n    .replace(/%3B/gi, ';')\n    .replace(/%20/g, pctEncodeSpaces ? '%20' : '+');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  APP_BASE_HREF,\n  CommonModule,\n  HashLocationStrategy,\n  Location,\n  LocationStrategy,\n  PathLocationStrategy,\n  PlatformLocation,\n} from '../../index';\nimport {Inject, InjectionToken, ModuleWithProviders, NgModule, Optional} from '@angular/core';\nimport {UpgradeModule} from '@angular/upgrade/static';\n\nimport {$locationShim, $locationShimProvider} from './location_shim';\nimport {AngularJSUrlCodec, UrlCodec} from './params';\n\n/**\n * Configuration options for LocationUpgrade.\n *\n * @publicApi\n */\nexport interface LocationUpgradeConfig {\n  /**\n   * Configures whether the location upgrade module should use the `HashLocationStrategy`\n   * or the `PathLocationStrategy`\n   */\n  useHash?: boolean;\n  /**\n   * Configures the hash prefix used in the URL when using the `HashLocationStrategy`\n   */\n  hashPrefix?: string;\n  /**\n   * Configures the URL codec for encoding and decoding URLs. Default is the `AngularJSCodec`\n   */\n  urlCodec?: typeof UrlCodec;\n  /**\n   * Configures the base href when used in server-side rendered applications\n   */\n  serverBaseHref?: string;\n  /**\n   * Configures the base href when used in client-side rendered applications\n   */\n  appBaseHref?: string;\n}\n\n/**\n * A provider token used to configure the location upgrade module.\n *\n * @publicApi\n */\nexport const LOCATION_UPGRADE_CONFIGURATION = new InjectionToken<LocationUpgradeConfig>(\n  ngDevMode ? 'LOCATION_UPGRADE_CONFIGURATION' : '',\n);\n\nconst APP_BASE_HREF_RESOLVED = new InjectionToken<string>(\n  ngDevMode ? 'APP_BASE_HREF_RESOLVED' : '',\n);\n\n/**\n * `NgModule` used for providing and configuring Angular's Unified Location Service for upgrading.\n *\n * @see [Using the Unified Angular Location Service](https://angular.io/guide/upgrade#using-the-unified-angular-location-service)\n *\n * @publicApi\n */\n@NgModule({imports: [CommonModule]})\nexport class LocationUpgradeModule {\n  static config(config?: LocationUpgradeConfig): ModuleWithProviders<LocationUpgradeModule> {\n    return {\n      ngModule: LocationUpgradeModule,\n      providers: [\n        Location,\n        {\n          provide: $locationShim,\n          useFactory: provide$location,\n          deps: [UpgradeModule, Location, PlatformLocation, UrlCodec, LocationStrategy],\n        },\n        {provide: LOCATION_UPGRADE_CONFIGURATION, useValue: config ? config : {}},\n        {provide: UrlCodec, useFactory: provideUrlCodec, deps: [LOCATION_UPGRADE_CONFIGURATION]},\n        {\n          provide: APP_BASE_HREF_RESOLVED,\n          useFactory: provideAppBaseHref,\n          deps: [LOCATION_UPGRADE_CONFIGURATION, [new Inject(APP_BASE_HREF), new Optional()]],\n        },\n        {\n          provide: LocationStrategy,\n          useFactory: provideLocationStrategy,\n          deps: [PlatformLocation, APP_BASE_HREF_RESOLVED, LOCATION_UPGRADE_CONFIGURATION],\n        },\n      ],\n    };\n  }\n}\n\nexport function provideAppBaseHref(config: LocationUpgradeConfig, appBaseHref?: string) {\n  if (config && config.appBaseHref != null) {\n    return config.appBaseHref;\n  } else if (appBaseHref != null) {\n    return appBaseHref;\n  }\n  return '';\n}\n\nexport function provideUrlCodec(config: LocationUpgradeConfig) {\n  const codec = (config && config.urlCodec) || AngularJSUrlCodec;\n  return new (codec as any)();\n}\n\nexport function provideLocationStrategy(\n  platformLocation: PlatformLocation,\n  baseHref: string,\n  options: LocationUpgradeConfig = {},\n) {\n  return options.useHash\n    ? new HashLocationStrategy(platformLocation, baseHref)\n    : new PathLocationStrategy(platformLocation, baseHref);\n}\n\nexport function provide$location(\n  ngUpgrade: UpgradeModule,\n  location: Location,\n  platformLocation: PlatformLocation,\n  urlCodec: UrlCodec,\n  locationStrategy: LocationStrategy,\n) {\n  const $locationProvider = new $locationShimProvider(\n    ngUpgrade,\n    location,\n    platformLocation,\n    urlCodec,\n    locationStrategy,\n  );\n\n  return $locationProvider.$get();\n}\n"],"names":["isPromise"],"mappings":"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"}9\Lx6/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

function parseCookieValue(cookieStr, name) {
    name = encodeURIComponent(name);
    for (const cookie of cookieStr.split(';')) {
        const eqIndex = cookie.indexOf('=');
        const [cookieName, cookieValue] = eqIndex == -1 ? [cookie, ''] : [cookie.slice(0, eqIndex), cookie.slice(eqIndex + 1)];
        if (cookieName.trim() === name) {
            return decodeURIComponent(cookieValue);
        }
    }
    return null;
}

const PLATFORM_BROWSER_ID = 'browser';
const PLATFORM_SERVER_ID = 'server';
/**
 * Returns whether a platform id represents a browser platform.
 * @publicApi
 */
function isPlatformBrowser(platformId) {
    return platformId === PLATFORM_BROWSER_ID;
}
/**
 * Returns whether a platform id represents a server platform.
 * @publicApi
 */
function isPlatformServer(platformId) {
    return platformId === PLATFORM_SERVER_ID;
}

/**
 * A wrapper around the `XMLHttpRequest` constructor.
 *
 * @publicApi
 */
class XhrFactory {
}

export { PLATFORM_BROWSER_ID, PLATFORM_SERVER_ID, XhrFactory, isPlatformBrowser, isPlatformServer, parseCookieValue };
//# sourceMappingURL=xhr-BfNfxNDv.mjs.map
{OxW{"version":3,"file":"xhr-BfNfxNDv.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/cookie.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/platform_id.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/common/src/xhr.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport function parseCookieValue(cookieStr: string, name: string): string | null {\n  name = encodeURIComponent(name);\n  for (const cookie of cookieStr.split(';')) {\n    const eqIndex = cookie.indexOf('=');\n    const [cookieName, cookieValue]: string[] =\n      eqIndex == -1 ? [cookie, ''] : [cookie.slice(0, eqIndex), cookie.slice(eqIndex + 1)];\n    if (cookieName.trim() === name) {\n      return decodeURIComponent(cookieValue);\n    }\n  }\n  return null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport const PLATFORM_BROWSER_ID = 'browser';\nexport const PLATFORM_SERVER_ID = 'server';\n\n/**\n * Returns whether a platform id represents a browser platform.\n * @publicApi\n */\nexport function isPlatformBrowser(platformId: Object): boolean {\n  return platformId === PLATFORM_BROWSER_ID;\n}\n\n/**\n * Returns whether a platform id represents a server platform.\n * @publicApi\n */\nexport function isPlatformServer(platformId: Object): boolean {\n  return platformId === PLATFORM_SERVER_ID;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * A wrapper around the `XMLHttpRequest` constructor.\n *\n * @publicApi\n */\nexport abstract class XhrFactory {\n  abstract build(): XMLHttpRequest;\n}\n"],"names":[],"mappings":";;;;;;AAQgB,SAAA,gBAAgB,CAAC,SAAiB,EAAE,IAAY,EAAA;AAC9D,IAAA,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;AACnC,QAAA,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAC7B,OAAO,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACtF,QAAA,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;AAC9B,YAAA,OAAO,kBAAkB,CAAC,WAAW,CAAC;;;AAG1C,IAAA,OAAO,IAAI;AACb;;ACXO,MAAM,mBAAmB,GAAG;AAC5B,MAAM,kBAAkB,GAAG;AAElC;;;AAGG;AACG,SAAU,iBAAiB,CAAC,UAAkB,EAAA;IAClD,OAAO,UAAU,KAAK,mBAAmB;AAC3C;AAEA;;;AAGG;AACG,SAAU,gBAAgB,CAAC,UAAkB,EAAA;IACjD,OAAO,UAAU,KAAK,kBAAkB;AAC1C;;ACjBA;;;;AAIG;MACmB,UAAU,CAAA;AAE/B;;;;"}nBx   /**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { Observable } from 'rxjs';
import { HttpRequest, HttpEvent, HttpHeaders, HttpContext, HttpParams, HttpResponse, HttpProgressEvent } from '../module.d-CnjH8Dlt.js';
export { HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContextToken, HttpDownloadProgressEvent, HttpErrorResponse, HttpEventType, HttpHeaderResponse, HttpParameterCodec, HttpParamsOptions, HttpResponseBase, HttpSentEvent, HttpStatusCode, HttpUploadProgressEvent, HttpUrlEncodingCodec, HttpUserEvent } from '../module.d-CnjH8Dlt.js';
import * as i0 from '@angular/core';
import { InjectionToken, EnvironmentInjector, Provider, EnvironmentProviders, WritableResource, ResourceRef, Signal, Injector, ValueEqualityFn } from '@angular/core';
import { XhrFactory } from '../xhr.d-D_1kTQR5.js';

/**
 * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a
 * `HttpResponse`.
 *
 * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the
 * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the
 * `HttpBackend`.
 *
 * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.
 *
 * @publicApi
 */
declare abstract class HttpHandler {
    abstract handle(req: HttpRequest<any>): Observable<HttpEvent<any>>;
}
/**
 * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.
 *
 * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.
 *
 * When injected, `HttpBackend` dispatches requests directly to the backend, without going
 * through the interceptor chain.
 *
 * @publicApi
 */
declare abstract class HttpBackend implements HttpHandler {
    abstract handle(req: HttpRequest<any>): Observable<HttpEvent<any>>;
}

/**
 * Performs HTTP requests.
 * This service is available as an injectable class, with methods to perform HTTP requests.
 * Each request method has multiple signatures, and the return type varies based on
 * the signature that is called (mainly the values of `observe` and `responseType`).
 *
 * Note that the `responseType` *options* value is a String that identifies the
 * single data type of the response.
 * A single overload version of the method handles each response type.
 * The value of `responseType` cannot be a union, as the combined signature could imply.
 *
 * @usageNotes
 *
 * ### HTTP Request Example
 *
 * ```ts
 *  // GET heroes whose name contains search term
 * searchHeroes(term: string): observable<Hero[]>{
 *
 *  const params = new HttpParams({fromString: 'name=term'});
 *    return this.httpClient.request('GET', this.heroesUrl, {responseType:'json', params});
 * }
 * ```
 *
 * Alternatively, the parameter string can be used without invoking HttpParams
 * by directly joining to the URL.
 * ```ts
 * this.httpClient.request('GET', this.heroesUrl + '?' + 'name=term', {responseType:'json'});
 * ```
 *
 *
 * ### JSONP Example
 * ```ts
 * requestJsonp(url, callback = 'callback') {
 *  return this.httpClient.jsonp(this.heroesURL, callback);
 * }
 * ```
 *
 * ### PATCH Example
 * ```ts
 * // PATCH one of the heroes' name
 * patchHero (id: number, heroName: string): Observable<{}> {
 * const url = `${this.heroesUrl}/${id}`;   // PATCH api/heroes/42
 *  return this.httpClient.patch(url, {name: heroName}, httpOptions)
 *    .pipe(catchError(this.handleError('patchHero')));
 * }
 * ```
 *
 * @see [HTTP Guide](guide/http)
 * @see [HTTP Request](api/common/http/HttpRequest)
 *
 * @publicApi
 */
declare class HttpClient {
    private handler;
    constructor(handler: HttpHandler);
    /**
     * Sends an `HttpRequest` and returns a stream of `HttpEvent`s.
     *
     * @return An `Observable` of the response, with the response body as a stream of `HttpEvent`s.
     */
    request<R>(req: HttpRequest<any>): Observable<HttpEvent<R>>;
    /**
     * Constructs a request that interprets the body as an `ArrayBuffer` and returns the response in
     * an `ArrayBuffer`.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     *
     * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<ArrayBuffer>;
    /**
     * Constructs a request that interprets the body as a blob and returns
     * the response as a blob.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body of type `Blob`.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<Blob>;
    /**
     * Constructs a request that interprets the body as a text string and
     * returns a string value.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body of type string.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<string>;
    /**
     * Constructs a request that interprets the body as an `ArrayBuffer` and returns the
     * the full event stream.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body as an array of `HttpEvent`s for
     * the request.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        observe: 'events';
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<ArrayBuffer>>;
    /**
     * Constructs a request that interprets the body as a `Blob` and returns
     * the full event stream.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body of type `Blob`.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<Blob>>;
    /**
     * Constructs a request which interprets the body as a text string and returns the full event
     * stream.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body of type string.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<string>>;
    /**
     * Constructs a request which interprets the body as a JavaScript object and returns the full
     * event stream.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the  request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body of type `Object`.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        reportProgress?: boolean;
        observe: 'events';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<any>>;
    /**
     * Constructs a request which interprets the body as a JavaScript object and returns the full
     * event stream.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body of type `R`.
     */
    request<R>(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        reportProgress?: boolean;
        observe: 'events';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<R>>;
    /**
     * Constructs a request which interprets the body as an `ArrayBuffer`
     * and returns the full `HttpResponse`.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with the response body as an `ArrayBuffer`.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<ArrayBuffer>>;
    /**
     * Constructs a request which interprets the body as a `Blob` and returns the full `HttpResponse`.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with the response body of type `Blob`.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<Blob>>;
    /**
     * Constructs a request which interprets the body as a text stream and returns the full
     * `HttpResponse`.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the HTTP response, with the response body of type string.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<string>>;
    /**
     * Constructs a request which interprets the body as a JavaScript object and returns the full
     * `HttpResponse`.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the full `HttpResponse`,
     * with the response body of type `Object`.
     */
    request(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        reportProgress?: boolean;
        observe: 'response';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpResponse<Object>>;
    /**
     * Constructs a request which interprets the body as a JavaScript object and returns
     * the full `HttpResponse` with the response body in the requested type.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return  An `Observable` of the full `HttpResponse`, with the response body of type `R`.
     */
    request<R>(method: string, url: string, options: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        reportProgress?: boolean;
        observe: 'response';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<R>>;
    /**
     * Constructs a request which interprets the body as a JavaScript object and returns the full
     * `HttpResponse` as a JavaScript object.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with the response body of type `Object`.
     */
    request(method: string, url: string, options?: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        responseType?: 'json';
        reportProgress?: boolean;
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<Object>;
    /**
     * Constructs a request which interprets the body as a JavaScript object
     * with the response body of the requested type.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with the response body of type `R`.
     */
    request<R>(method: string, url: string, options?: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        responseType?: 'json';
        reportProgress?: boolean;
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<R>;
    /**
     * Constructs a request where response type and requested observable are not known statically.
     *
     * @param method  The HTTP method.
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the requested response, with body of type `any`.
     */
    request(method: string, url: string, options?: {
        body?: any;
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        observe?: 'body' | 'events' | 'response';
        reportProgress?: boolean;
        responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<any>;
    /**
     * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer`
     *  and returns the response as an `ArrayBuffer`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return  An `Observable` of the response body as an `ArrayBuffer`.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<ArrayBuffer>;
    /**
     * Constructs a `DELETE` request that interprets the body as a `Blob` and returns
     * the response as a `Blob`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response body as a `Blob`.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<Blob>;
    /**
     * Constructs a `DELETE` request that interprets the body as a text string and returns
     * a string.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body of type string.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<string>;
    /**
     * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer`
     *  and returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with response body as an `ArrayBuffer`.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpEvent<ArrayBuffer>>;
    /**
     * Constructs a `DELETE` request that interprets the body as a `Blob`
     *  and returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request, with the response body as a
     * `Blob`.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpEvent<Blob>>;
    /**
     * Constructs a `DELETE` request that interprets the body as a text string
     * and returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request, with the response
     * body of type string.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpEvent<string>>;
    /**
     * Constructs a `DELETE` request that interprets the body as JSON
     * and returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request, with response body of
     * type `Object`.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpEvent<Object>>;
    /**
     * Constructs a `DELETE`request that interprets the body as JSON
     * and returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request, with a response
     * body in the requested type.
     */
    delete<T>(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | (string | number | boolean)[]>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpEvent<T>>;
    /**
     * Constructs a `DELETE` request that interprets the body as an `ArrayBuffer` and returns
     *  the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the full `HttpResponse`, with the response body as an `ArrayBuffer`.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpResponse<ArrayBuffer>>;
    /**
     * Constructs a `DELETE` request that interprets the body as a `Blob` and returns the full
     * `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with the response body of type `Blob`.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpResponse<Blob>>;
    /**
     * Constructs a `DELETE` request that interprets the body as a text stream and
     *  returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the full `HttpResponse`, with the response body of type string.
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpResponse<string>>;
    /**
     * Constructs a `DELETE` request the interprets the body as a JavaScript object and returns
     * the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with the response body of type `Object`.
     *
     */
    delete(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpResponse<Object>>;
    /**
     * Constructs a `DELETE` request that interprets the body as JSON
     * and returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with the response body of the requested type.
     */
    delete<T>(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<HttpResponse<T>>;
    /**
     * Constructs a `DELETE` request that interprets the body as JSON and
     * returns the response body as an object parsed from JSON.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body of type `Object`.
     */
    delete(url: string, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<Object>;
    /**
     * Constructs a DELETE request that interprets the body as JSON and returns
     * the response in a given type.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with response body in the requested type.
     */
    delete<T>(url: string, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        body?: any | null;
    }): Observable<T>;
    /**
     * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and returns the
     * response in an `ArrayBuffer`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<ArrayBuffer>;
    /**
     * Constructs a `GET` request that interprets the body as a `Blob`
     * and returns the response as a `Blob`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body as a `Blob`.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<Blob>;
    /**
     * Constructs a `GET` request that interprets the body as a text string
     * and returns the response as a string value.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body of type string.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<string>;
    /**
     * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and returns
     *  the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request, with the response
     * body as an `ArrayBuffer`.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<ArrayBuffer>>;
    /**
     * Constructs a `GET` request that interprets the body as a `Blob` and
     * returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body as a `Blob`.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<Blob>>;
    /**
     * Constructs a `GET` request that interprets the body as a text string and returns
     * the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body of type string.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<string>>;
    /**
     * Constructs a `GET` request that interprets the body as JSON
     * and returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body of type `Object`.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<Object>>;
    /**
     * Constructs a `GET` request that interprets the body as JSON and returns the full
     * event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with a response body in the requested type.
     */
    get<T>(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<T>>;
    /**
     * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and
     * returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body as an `ArrayBuffer`.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<ArrayBuffer>>;
    /**
     * Constructs a `GET` request that interprets the body as a `Blob` and
     * returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body as a `Blob`.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<Blob>>;
    /**
     * Constructs a `GET` request that interprets the body as a text stream and
     * returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body of type string.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<string>>;
    /**
     * Constructs a `GET` request that interprets the body as JSON and
     * returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the full `HttpResponse`,
     * with the response body of type `Object`.
     */
    get(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<Object>>;
    /**
     * Constructs a `GET` request that interprets the body as JSON and
     * returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the full `HttpResponse` for the request,
     * with a response body in the requested type.
     */
    get<T>(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<T>>;
    /**
     * Constructs a `GET` request that interprets the body as JSON and
     * returns the response body as an object parsed from JSON.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     *
     * @return An `Observable` of the response body as a JavaScript object.
     */
    get(url: string, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<Object>;
    /**
     * Constructs a `GET` request that interprets the body as JSON and returns
     * the response body in a given type.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse`, with a response body in the requested type.
     */
    get<T>(url: string, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<T>;
    /**
     * Constructs a `HEAD` request that interprets the body as an `ArrayBuffer` and
     * returns the response as an `ArrayBuffer`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<ArrayBuffer>;
    /**
     * Constructs a `HEAD` request that interprets the body as a `Blob` and returns
     * the response as a `Blob`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return  An `Observable` of the response, with the response body as a `Blob`.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<Blob>;
    /**
     * Constructs a `HEAD` request that interprets the body as a text string and returns the response
     * as a string value.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body of type string.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<string>;
    /**
     * Constructs a `HEAD` request that interprets the body as an  `ArrayBuffer`
     *  and returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body as an `ArrayBuffer`.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<ArrayBuffer>>;
    /**
     * Constructs a `HEAD` request that interprets the body as a `Blob` and
     * returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body as a `Blob`.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<Blob>>;
    /**
     * Constructs a `HEAD` request that interprets the body as a text string
     * and returns the full event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request, with the response body of type
     * string.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<string>>;
    /**
     * Constructs a `HEAD` request that interprets the body as JSON
     * and returns the full HTTP event stream.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of all `HttpEvent`s for the request, with a response body of
     * type `Object`.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<Object>>;
    /**
     * Constructs a `HEAD` request that interprets the body as JSON and
     * returns the full event stream.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request,
     * with a response body in the requested type.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     */
    head<T>(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<T>>;
    /**
     * Constructs a `HEAD` request that interprets the body as an `ArrayBuffer`
     *  and returns the full HTTP response.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body as an `ArrayBuffer`.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<ArrayBuffer>>;
    /**
     * Constructs a `HEAD` request that interprets the body as a `Blob` and returns
     * the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body as a blob.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<Blob>>;
    /**
     * Constructs a `HEAD` request that interprets the body as text stream
     * and returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body of type string.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<string>>;
    /**
     * Constructs a `HEAD` request that interprets the body as JSON and
     * returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body of type `Object`.
     */
    head(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<Object>>;
    /**
     * Constructs a `HEAD` request that interprets the body as JSON
     * and returns the full `HttpResponse`.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with a response body of the requested type.
     */
    head<T>(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<T>>;
    /**
  
     * Constructs a `HEAD` request that interprets the body as JSON and
     * returns the response body as an object parsed from JSON.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the response, with the response body as an object parsed from JSON.
     */
    head(url: string, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<Object>;
    /**
     * Constructs a `HEAD` request that interprets the body as JSON and returns
     * the response in a given type.
     *
     * @param url     The endpoint URL.
     * @param options The HTTP options to send with the request.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with a response body of the given type.
     */
    head<T>(url: string, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<T>;
    /**
     * Constructs a `JSONP` request for the given URL and name of the callback parameter.
     *
     * @param url The resource URL.
     * @param callbackParam The callback function name.
     *
     * @return An `Observable` of the response object, with response body as an object.
     */
    jsonp(url: string, callbackParam: string): Observable<Object>;
    /**
     * Constructs a `JSONP` request for the given URL and name of the callback parameter.
     *
     * @param url The resource URL.
     * @param callbackParam The callback function name.
     *
     * You must install a suitable interceptor, such as one provided by `HttpClientJsonpModule`.
     * If no such interceptor is reached,
     * then the `JSONP` request can be rejected by the configured backend.
     *
     * @return An `Observable` of the response object, with response body in the requested type.
     */
    jsonp<T>(url: string, callbackParam: string): Observable<T>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as an
     * `ArrayBuffer` and returns the response as an `ArrayBuffer`.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<ArrayBuffer>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as a `Blob` and returns
     * the response as a `Blob`.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with the response body as a `Blob`.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<Blob>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as a text string and
     * returns a string value.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with the response body of type string.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<string>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as an `ArrayBuffer`
     *  and returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return  An `Observable` of all `HttpEvent`s for the request,
     * with the response body as an `ArrayBuffer`.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<HttpEvent<ArrayBuffer>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as a `Blob` and
     * returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body as a `Blob`.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<HttpEvent<Blob>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as a text string
     * and returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request,
     * with the response body of type string.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<HttpEvent<string>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as JSON
     * and returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request with the response
     * body of type `Object`.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpEvent<Object>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as JSON and
     * returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request,
     * with a response body in the requested type.
     */
    options<T>(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpEvent<T>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as an `ArrayBuffer`
     *  and returns the full HTTP response.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body as an `ArrayBuffer`.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<HttpResponse<ArrayBuffer>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as a `Blob`
     *  and returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body as a `Blob`.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<HttpResponse<Blob>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as text stream
     * and returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body of type string.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: bo   olean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<HttpResponse<string>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as JSON
     * and returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body of type `Object`.
     */
    options(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpResponse<Object>>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as JSON and
     * returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with a response body in the requested type.
     */
    options<T>(url: string, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpResponse<T>>;
    /**
  
     * Constructs an `OPTIONS` request that interprets the body as JSON and returns the
     * response body as an object parsed from JSON.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with the response body as an object parsed from JSON.
     */
    options(url: string, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<Object>;
    /**
     * Constructs an `OPTIONS` request that interprets the body as JSON and returns the
     * response in a given type.
     *
     * @param url The endpoint URL.
     * @param options HTTP options.
     *
     * @return An `Observable` of the `HttpResponse`, with a response body of the given type.
     */
    options<T>(url: string, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<T>;
    /**
     * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer` and returns
     * the response as an `ArrayBuffer`.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<ArrayBuffer>;
    /**
     * Constructs a `PATCH` request that interprets the body as a `Blob` and returns the response
     * as a `Blob`.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with the response body as a `Blob`.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<Blob>;
    /**
     * Constructs a `PATCH` request that interprets the body as a text string and
     * returns the response as a string value.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with a response body of type string.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<string>;
    /**
     * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer` and
     *  returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request,
     * with the response body as an `ArrayBuffer`.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<HttpEvent<ArrayBuffer>>;
    /**
     * Constructs a `PATCH` request that interprets the body as a `Blob`
     *  and returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request, with the
     * response body as `Blob`.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<HttpEvent<Blob>>;
    /**
     * Constructs a `PATCH` request that interprets the body as a text string and
     * returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request, with a
     * response body of type string.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<HttpEvent<string>>;
    /**
     * Constructs a `PATCH` request that interprets the body as JSON
     * and returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request,
     * with a response body of type `Object`.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpEvent<Object>>;
    /**
     * Constructs a `PATCH` request that interprets the body as JSON
     * and returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of all the `HttpEvent`s for the request,
     * with a response body in the requested type.
     */
    patch<T>(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpEvent<T>>;
    /**
     * Constructs a `PATCH` request that interprets the body as an `ArrayBuffer`
     *  and returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return  An `Observable` of the `HttpResponse` for the request,
     * with the response body as an `ArrayBuffer`.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<HttpResponse<ArrayBuffer>>;
    /**
     * Constructs a `PATCH` request that interprets the body as a `Blob` and returns the full
     * `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return  An `Observable` of the `HttpResponse` for the request,
     * with the response body as a `Blob`.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<HttpResponse<Blob>>;
    /**
     * Constructs a `PATCH` request that interprets the body as a text stream and returns the
     * full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return  An `Observable` of the `HttpResponse` for the request,
     * with a response body of type string.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<HttpResponse<string>>;
    /**
     * Constructs a `PATCH` request that interprets the body as JSON
     * and returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with a response body in the requested type.
     */
    patch(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpResponse<Object>>;
    /**
     * Constructs a `PATCH` request that interprets the body as JSON
     * and returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with a response body in the given type.
     */
    patch<T>(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpResponse<T>>;
    /**
  
     * Constructs a `PATCH` request that interprets the body as JSON and
     * returns the response body as an object parsed from JSON.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with the response body as an object parsed from JSON.
     */
    patch(url: string, body: any | null, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<Object>;
    /**
     * Constructs a `PATCH` request that interprets the body as JSON
     * and returns the response in a given type.
     *
     * @param url The endpoint URL.
     * @param body The resources to edit.
     * @param options HTTP options.
     *
     * @return  An `Observable` of the `HttpResponse` for the request,
     * with a response body in the given type.
     */
    patch<T>(url: string, body: any | null, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<T>;
    /**
     * Constructs a `POST` request that interprets the body as an `ArrayBuffer` and returns
     * an `ArrayBuffer`.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options.
     *
     * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<ArrayBuffer>;
    /**
     * Constructs a `POST` request that interprets the body as a `Blob` and returns the
     * response as a `Blob`.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of the response, with the response body as a `Blob`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<Blob>;
    /**
     * Constructs a `POST` request that interprets the body as a text string and
     * returns the response as a string value.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of the response, with a response body of type string.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<string>;
    /**
     * Constructs a `POST` request that interprets the body as an `ArrayBuffer` and
     * returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body as an `ArrayBuffer`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<ArrayBuffer>>;
    /**
     * Constructs a `POST` request that interprets the body as a `Blob`
     * and returns the response in an observable of the full event stream.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of all `HttpEvent`s for the request, with the response body as `Blob`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<Blob>>;
    /**
     * Constructs a `POST` request that interprets the body as a text string and returns the full
     * event stream.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return  An `Observable` of all `HttpEvent`s for the request,
     * with a response body of type string.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<string>>;
    /**
     * Constructs a POST request that interprets the body as JSON and returns the full
     * event stream.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return  An `Observable` of all `HttpEvent`s for the request,
     * with a response body of type `Object`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<Object>>;
    /**
     * Constructs a POST request that interprets the body as JSON and returns the full
     * event stream.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with a response body in the requested type.
     */
    post<T>(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpEvent<T>>;
    /**
     * Constructs a POST request that interprets the body as an `ArrayBuffer`
     *  and returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return  An `Observable` of the `HttpResponse` for the request, with the response body as an
     * `ArrayBuffer`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<ArrayBuffer>>;
    /**
     * Constructs a `POST` request that interprets the body as a `Blob` and returns the full
     * `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body as a `Blob`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<Blob>>;
    /**
     * Constructs a `POST` request that interprets the body as a text stream and returns
     * the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return  An `Observable` of the `HttpResponse` for the request,
     * with a response body of type string.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<string>>;
    /**
     * Constructs a `POST` request that interprets the body as JSON
     * and returns the full `HttpResponse`.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of the `HttpResponse` for the request, with a response body of type
     * `Object`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<Object>>;
    /**
     * Constructs a `POST` request that interprets the body as JSON and returns the
     * full `HttpResponse`.
     *
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of the `HttpResponse` for the request, with a response body in the
     * requested type.
     */
    post<T>(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<HttpResponse<T>>;
    /**
     * Constructs a `POST` request that interprets the body as JSON
     * and returns the response body as an object parsed from JSON.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return An `Observable` of the response, with the response body as an object parsed from JSON.
     */
    post(url: string, body: any | null, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<Object>;
    /**
     * Constructs a `POST` request that interprets the body as JSON
     * and returns an observable of the response.
     *
     * @param url The endpoint URL.
     * @param body The content to replace with.
     * @param options HTTP options
     *
     * @return  An `Observable` of the `HttpResponse` for the request, with a response body in the
     * requested type.
     */
    post<T>(url: string, body: any | null, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    }): Observable<T>;
    /**
     * Constructs a `PUT` request that interprets the body as an `ArrayBuffer` and returns the
     * response as an `ArrayBuffer`.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<ArrayBuffer>;
    /**
     * Constructs a `PUT` request that interprets the body as a `Blob` and returns
     * the response as a `Blob`.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the response, with the response body as a `Blob`.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<Blob>;
    /**
     * Constructs a `PUT` request that interprets the body as a text string and
     * returns the response as a string value.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the response, with a response body of type string.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<string>;
    /**
     * Constructs a `PUT` request that interprets the body as an `ArrayBuffer` and
     * returns the full event stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body as an `ArrayBuffer`.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<HttpEvent<ArrayBuffer>>;
    /**
     * Constructs a `PUT` request that interprets the body as a `Blob` and returns the full event
     * stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with the response body as a `Blob`.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<HttpEvent<Blob>>;
    /**
     * Constructs a `PUT` request that interprets the body as a text string and returns the full event
     * stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of all `HttpEvent`s for the request, with a response body
     * of type string.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<HttpEvent<string>>;
    /**
     * Constructs a `PUT` request that interprets the body as JSON and returns the full
     * event stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of all `HttpEvent`s for the request, with a response body of
     * type `Object`.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpEvent<Object>>;
    /**
     * Constructs a `PUT` request that interprets the body as JSON and returns the
     * full event stream.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of all `HttpEvent`s for the request,
     * with a response body in the requested type.
     */
    put<T>(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'events';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpEvent<T>>;
    /**
     * Constructs a `PUT` request that interprets the body as an
     * `ArrayBuffer` and returns an observable of the full HTTP response.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the `HttpResponse` for the request, with the response body as an
     * `ArrayBuffer`.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<HttpResponse<ArrayBuffer>>;
    /**
     * Constructs a `PUT` request that interprets the body as a `Blob` and returns the
     * full HTTP response.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with the response body as a `Blob`.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'blob';
        withCredentials?: boolean;
    }): Observable<HttpResponse<Blob>>;
    /**
     * Constructs a `PUT` request that interprets the body as a text stream and returns the
     * full HTTP response.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the `HttpResponse` for the request, with a response body of type
     * string.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType: 'text';
        withCredentials?: boolean;
    }): Observable<HttpResponse<string>>;
    /**
     * Constructs a `PUT` request that interprets the body as JSON and returns the full
     * HTTP response.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the `HttpResponse` for the request, with a response body
     * of type 'Object`.
     */
    put(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpResponse<Object>>;
    /**
     * Constructs a `PUT` request that interprets the body as an instance of the requested type and
     * returns the full HTTP response.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the `HttpResponse` for the request,
     * with a response body in the requested type.
     */
    put<T>(url: string, body: any | null, options: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        observe: 'response';
        context?: HttpContext;
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpResponse<T>>;
    /**
     * Constructs a `PUT` request that interprets the body as JSON
     * and returns an observable of JavaScript object.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the response as a JavaScript object.
     */
    put(url: string, body: any | null, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<Object>;
    /**
     * Constructs a `PUT` request that interprets the body as an instance of the requested type
     * and returns an observable of the requested type.
     *
     * @param url The endpoint URL.
     * @param body The resources to add/update.
     * @param options HTTP options
     *
     * @return An `Observable` of the requested type.
     */
    put<T>(url: string, body: any | null, options?: {
        headers?: HttpHeaders | Record<string, string | string[]>;
        context?: HttpContext;
        observe?: 'body';
        params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<T>;
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpClient, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<HttpClient>;
}

/**
 * Uses `fetch` to send requests to a backend server.
 *
 * This `FetchBackend` requires the support of the
 * [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) which is available on all
 * supported browsers and on Node.js v18 or later.
 *
 * @see {@link HttpHandler}
 *
 * @publicApi
 */
declare class FetchBackend implements HttpBackend {
    private readonly fetchImpl;
    private readonly ngZone;
    private readonly destroyRef;
    private destroyed;
    constructor();
    handle(request: HttpRequest<any>): Observable<HttpEvent<any>>;
    private doRequest;
    private parseBody;
    private createRequestInit;
    private concatChunks;
    static ɵfac: i0.ɵɵFactoryDeclaration<FetchBackend, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<FetchBackend>;
}

/**
 * Intercepts and handles an `HttpRequest` or `HttpResponse`.
 *
 * Most interceptors transform the outgoing request before passing it to the
 * next interceptor in the chain, by calling `next.handle(transformedReq)`.
 * An interceptor may transform the
 * response event stream as well, by applying additional RxJS operators on the stream
 * returned by `next.handle()`.
 *
 * More rarely, an interceptor may handle the request entirely,
 * and compose a new event stream instead of invoking `next.handle()`. This is an
 * acceptable behavior, but keep in mind that further interceptors will be skipped entirely.
 *
 * It is also rare but valid for an interceptor to return multiple responses on the
 * event stream for a single request.
 *
 * @publicApi
 *
 * @see [HTTP Guide](guide/http/interceptors)
 * @see {@link HttpInterceptorFn}
 *
 * @usageNotes
 *
 * To use the same instance of `HttpInterceptors` for the entire app, import the `HttpClientModule`
 * only in your `AppModule`, and add the interceptors to the root application injector.
 * If you import `HttpClientModule` multiple times across different modules (for example, in lazy
 * loading modules), each import creates a new copy of the `HttpClientModule`, which overwrites the
 * interceptors provided in the root module.
 */
interface HttpInterceptor {
    /**
     * Identifies and handles a given HTTP request.
     * @param req The outgoing request object to handle.
     * @param next The next interceptor in the chain, or the backend
     * if no interceptors remain in the chain.
     * @returns An observable of the event stream.
     */
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
}
/**
 * Represents the next interceptor in an interceptor chain, or the real backend if there are no
 * further interceptors.
 *
 * Most interceptors will delegate to this function, and either modify the outgoing request or the
 * response when it arrives. Within the scope of the current request, however, this function may be
 * called any number of times, for any number of downstream requests. Such downstream requests need
 * not be to the same URL or even the same origin as the current request. It is also valid to not
 * call the downstream handler at all, and process the current request entirely within the
 * interceptor.
 *
 * This function should only be called within the scope of the request that's currently being
 * intercepted. Once that request is complete, this downstream handler function should not be
 * called.
 *
 * @publicApi
 *
 * @see [HTTP Guide](guide/http/interceptors)
 */
type HttpHandlerFn = (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>;
/**
 * An interceptor for HTTP requests made via `HttpClient`.
 *
 * `HttpInterceptorFn`s are middleware functions which `HttpClient` calls when a request is made.
 * These functions have the opportunity to modify the outgoing request or any response that comes
 * back, as well as block, redirect, or otherwise change the request or response semantics.
 *
 * An `HttpHandlerFn` representing the next interceptor (or the backend which will make a real HTTP
 * request) is provided. Most interceptors will delegate to this function, but that is not required
 * (see `HttpHandlerFn` for more details).
 *
 * `HttpInterceptorFn`s are executed in an [injection context](guide/di/dependency-injection-context).
 * They have access to `inject()` via the `EnvironmentInjector` from which they were configured.
 *
 * @see [HTTP Guide](guide/http/interceptors)
 * @see {@link withInterceptors}
 *
 * @usageNotes
 * Here is a noop interceptor that passes the request through without modifying it:
 * ```ts
 * export const noopInterceptor: HttpInterceptorFn = (req: HttpRequest<unknown>, next:
 * HttpHandlerFn) => {
 *   return next(modifiedReq);
 * };
 * ```
 *
 * If you want to alter a request, clone it first and modify the clone before passing it to the
 * `next()` handler function.
 *
 * Here is a basic interceptor that adds a bearer token to the headers
 * ```ts
 * export const authenticationInterceptor: HttpInterceptorFn = (req: HttpRequest<unknown>, next:
 * HttpHandlerFn) => {
 *    const userToken = 'MY_TOKEN'; const modifiedReq = req.clone({
 *      headers: req.headers.set('Authorization', `Bearer ${userToken}`),
 *    });
 *
 *    return next(modifiedReq);
 * };
 * ```
 */
type HttpInterceptorFn = (req: HttpRequest<unknown>, next: HttpHandlerFn) => Observable<HttpEvent<unknown>>;
/**
 * A multi-provider token that represents the array of registered
 * `HttpInterceptor` objects.
 *
 * @publicApi
 */
declare const HTTP_INTERCEPTORS: InjectionToken<readonly HttpInterceptor[]>;
/**
 * A multi-provided token of `HttpInterceptorFn`s that are only set in root.
 */
declare const HTTP_ROOT_INTERCEPTOR_FNS: InjectionToken<readonly HttpInterceptorFn[]>;
declare const REQUESTS_CONTRIBUTE_TO_STABILITY: InjectionToken<boolean>;
declare class HttpInterceptorHandler extends HttpHandler {
    private backend;
    private injector;
    private chain;
    private readonly pendingTasks;
    private readonly contributeToStability;
    constructor(backend: HttpBackend, injector: EnvironmentInjector);
    handle(initialRequest: HttpRequest<any>): Observable<HttpEvent<any>>;
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpInterceptorHandler, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<HttpInterceptorHandler>;
}

/**
 * DI token/abstract type representing a map of JSONP callbacks.
 *
 * In the browser, this should always be the `window` object.
 *
 *
 */
declare abstract class JsonpCallbackContext {
    [key: string]: (data: any) => void;
}
/**
 * Processes an `HttpRequest` with the JSONP method,
 * by performing JSONP style requests.
 * @see {@link HttpHandler}
 * @see {@link HttpXhrBackend}
 *
 * @publicApi
 */
declare class JsonpClientBackend implements HttpBackend {
    private callbackMap;
    private document;
    /**
     * A resolved promise that can be used to schedule microtasks in the event handlers.
     */
    private readonly resolvedPromise;
    constructor(callbackMap: JsonpCallbackContext, document: any);
    /**
     * Get the name of the next callback method, by incrementing the global `nextRequestId`.
     */
    private nextCallback;
    /**
     * Processes a JSONP request and returns an event stream of the results.
     * @param req The request object.
     * @returns An observable of the response events.
     *
     */
    handle(req: HttpRequest<never>): Observable<HttpEvent<any>>;
    private removeListeners;
    static ɵfac: i0.ɵɵFactoryDeclaration<JsonpClientBackend, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<JsonpClientBackend>;
}
/**
 * Identifies requests with the method JSONP and
 * shifts them to the `JsonpClientBackend`.
 *
 * @see {@link HttpInterceptor}
 *
 * @publicApi
 */
declare class JsonpInterceptor {
    private injector;
    constructor(injector: EnvironmentInjector);
    /**
     * Identifies and handles a given JSONP request.
     * @param initialRequest The outgoing request object to handle.
     * @param next The next interceptor in the chain, or the backend
     * if no interceptors remain in the chain.
     * @returns An observable of the event stream.
     */
    intercept(initialRequest: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
    static ɵfac: i0.ɵɵFactoryDeclaration<JsonpInterceptor, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<JsonpInterceptor>;
}

/**
 * Identifies a particular kind of `HttpFeature`.
 *
 * @publicApi
 */
declare enum HttpFeatureKind {
    Interceptors = 0,
    LegacyInterceptors = 1,
    CustomXsrfConfiguration = 2,
    NoXsrfProtection = 3,
    JsonpSupport = 4,
    RequestsMadeViaParent = 5,
    Fetch = 6
}
/**
 * A feature for use when configuring `provideHttpClient`.
 *
 * @publicApi
 */
interface HttpFeature<KindT extends HttpFeatureKind> {
    ɵkind: KindT;
    ɵproviders: Provider[];
}
/**
 * Configures Angular's `HttpClient` service to be available for injection.
 *
 * By default, `HttpClient` will be configured for injection with its default options for XSRF
 * protection of outgoing requests. Additional configuration options can be provided by passing
 * feature functions to `provideHttpClient`. For example, HTTP interceptors can be added using the
 * `withInterceptors(...)` feature.
 *
 * <div class="docs-alert docs-alert-helpful">
 *
 * It's strongly recommended to enable
 * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for applications that use
 * Server-Side Rendering for better performance and compatibility. To enable `fetch`, add
 * `withFetch()` feature to the `provideHttpClient()` call at the root of the application:
 *
 * ```ts
 * provideHttpClient(withFetch());
 * ```
 *
 * </div>
 *
 * @see {@link withInterceptors}
 * @see {@link withInterceptorsFromDi}
 * @see {@link withXsrfConfiguration}
 * @see {@link withNoXsrfProtection}
 * @see {@link withJsonpSupport}
 * @see {@link withRequestsMadeViaParent}
 * @see {@link withFetch}
 */
declare function provideHttpClient(...features: HttpFeature<HttpFeatureKind>[]): EnvironmentProviders;
/**
 * Adds one or more functional-style HTTP interceptors to the configuration of the `HttpClient`
 * instance.
 *
 * @see {@link HttpInterceptorFn}
 * @see {@link provideHttpClient}
 * @publicApi
 */
declare function withInterceptors(interceptorFns: HttpInterceptorFn[]): HttpFeature<HttpFeatureKind.Interceptors>;
/**
 * Includes class-based interceptors configured using a multi-provider in the current injector into
 * the configured `HttpClient` instance.
 *
 * Prefer `withInterceptors` and functional interceptors instead, as support for DI-provided
 * interceptors may be phased out in a later release.
 *
 * @see {@link HttpInterceptor}
 * @see {@link HTTP_INTERCEPTORS}
 * @see {@link provideHttpClient}
 */
declare function withInterceptorsFromDi(): HttpFeature<HttpFeatureKind.LegacyInterceptors>;
/**
 * Customizes the XSRF protection for the configuration of the current `HttpClient` instance.
 *
 * This feature is incompatible with the `withNoXsrfProtection` feature.
 *
 * @see {@link provideHttpClient}
 */
declare function withXsrfConfiguration({ cookieName, headerName, }: {
    cookieName?: string;
    headerName?: string;
}): HttpFeature<HttpFeatureKind.CustomXsrfConfiguration>;
/**
 * Disables XSRF protection in the configuration of the current `HttpClient` instance.
 *
 * This feature is incompatible with the `withXsrfConfiguration` feature.
 *
 * @see {@link provideHttpClient}
 */
declare function withNoXsrfProtection(): HttpFeature<HttpFeatureKind.NoXsrfProtection>;
/**
 * Add JSONP support to the configuration of the current `HttpClient` instance.
 *
 * @see {@link provideHttpClient}
 */
declare function withJsonpSupport(): HttpFeature<HttpFeatureKind.JsonpSupport>;
/**
 * Configures the current `HttpClient` instance to make requests via the parent injector's
 * `HttpClient` instead of directly.
 *
 * By default, `provideHttpClient` configures `HttpClient` in its injector to be an independent
 * instance. For example, even if `HttpClient` is configured in the parent injector with
 * one or more interceptors, they will not intercept requests made via this instance.
 *
 * With this option enabled, once the request has passed through the current injector's
 * interceptors, it will be delegated to the parent injector's `HttpClient` chain instead of
 * dispatched directly, and interceptors in the parent configuration will be applied to the request.
 *
 * If there are several `HttpClient` instances in the injector hierarchy, it's possible for
 * `withRequestsMadeViaParent` to be used at multiple levels, which will cause the request to
 * "bubble up" until either reaching the root level or an `HttpClient` which was not configured with
 * this option.
 *
 * @see {@link provideHttpClient}
 * @publicApi
 */
declare function withRequestsMadeViaParent(): HttpFeature<HttpFeatureKind.RequestsMadeViaParent>;
/**
 * Configures the current `HttpClient` instance to make requests using the fetch API.
 *
 * Note: The Fetch API doesn't support progress report on uploads.
 *
 * @publicApi
 */
declare function withFetch(): HttpFeature<HttpFeatureKind.Fetch>;

/**
 * The structure of an `httpResource` request which will be sent to the backend.
 *
 * @experimental
 */
interface HttpResourceRequest {
    /**
     * URL of the request.
     *
     * This URL should not include query parameters. Instead, specify query parameters through the
     * `params` field.
     */
    url: string;
    /**
     * HTTP method of the request, which defaults to GET if not specified.
     */
    method?: string;
    /**
     * Body to send with the request, if there is one.
     *
     * If no Content-Type header is specified by the user, Angular will attempt to set one based on
     * the type of `body`.
     */
    body?: unknown;
    /**
     * Dictionary of query parameters which will be appeneded to the request URL.
     */
    params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;
    /**
     * Dictionary of headers to include with the outgoing request.
     */
    headers?: HttpHeaders | Record<string, string | ReadonlyArray<string>>;
    /**
     * Context of the request stored in a dictionary of key-value pairs.
     */
    context?: HttpContext;
    /**
     * If `true`, progress events will be enabled for the request and delivered through the
     * `HttpResource.progress` signal.
     */
    reportProgress?: boolean;
    /**
     * Specifies whether the `withCredentials` flag should be set on the outgoing request.
     *
     * This flag causes the browser to send cookies and other authentication information along with
     * the request.
     */
    withCredentials?: boolean;
    /**
     * Configures the server-side rendering transfer cache for this request.
     *
     * See the documentation on the transfer cache for more information.
     */
    transferCache?: {
        includeHeaders?: string[];
    } | boolean;
}
/**
 * Options for creating an `httpResource`.
 *
 * @experimental
 */
interface HttpResourceOptions<TResult, TRaw> {
    /**
     * Transform the result of the HTTP request before it's delivered to the resource.
     *
     * `parse` receives the value from the HTTP layer as its raw type (e.g. as `unknown` for JSON data).
     * It can be used to validate or transform the type of the resource, and return a more specific
     * type. This is also useful for validating backend responses using a runtime schema validation
     * library such as Zod.
     */
    parse?: (value: TRaw) => TResult;
    /**
     * Value that the resource will take when in Idle, Loading, or Error states.
     *
     * If not set, the resource will use `undefined` as its default value.
     */
    defaultValue?: NoInfer<TResult>;
    /**
     * The `Injector` in which to create the `httpResource`.
     *
     * If this is not provided, the current [injection context](guide/di/dependency-injection-context)
     * will be used instead (via `inject`).
     */
    injector?: Injector;
    /**
     * A comparison function which defines equality for the response value.
     */
    equal?: ValueEqualityFn<NoInfer<TResult>>;
}
/**
 * A `WritableResource` that represents the results of a reactive HTTP request.
 *
 * `HttpResource`s are backed by `HttpClient`, including support for interceptors, testing, and the
 * other features of the `HttpClient` API.
 *
 * @experimental
 */
interface HttpResourceRef<T> extends WritableResource<T>, ResourceRef<T> {
    /**
     * Signal of the response headers, when available.
     */
    readonly headers: Signal<HttpHeaders | undefined>;
    /**
     * Signal of the response status code, when available.
     */
    readonly statusCode: Signal<number | undefined>;
    /**
     * Signal of the latest progress update, if the request was made with `reportProgress: true`.
     */
    readonly progress: Signal<HttpProgressEvent | undefined>;
    hasValue(): this is HttpResourceRef<Exclude<T, undefined>>;
    destroy(): void;
}

/**
 * Type for the `httpRequest` top-level function, which includes the call signatures for the JSON-
 * based `httpRequest` as well as sub-functions for `ArrayBuffer`, `Blob`, and `string` type
 * requests.
 *
 * @experimental
 */
interface HttpResourceFn {
    /**
     * Create a `Resource` that fetches data with an HTTP GET request to the given URL.
     *
     * If a reactive function is passed for the URL, the resource will update when the URL changes via
     * signals.
     *
     * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features
     * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of
     * `httpResource`, such as `httpResource.text()`, to parse the response differently.
     *
     * @experimental
     */
    <TResult = unknown>(url: string | (() => string | undefined), options: HttpResourceOptions<TResult, unknown> & {
        defaultValue: NoInfer<TResult>;
    }): HttpResourceRef<TResult>;
    /**
     * Create a `Resource` that fetches data with an HTTP GET request to the given URL.
     *
     * If a reactive function is passed for the URL, the resource will update when the URL changes via
     * signals.
     *
     * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features
     * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of
     * `httpResource`, such as `httpResource.text()`, to parse the response differently.
     *
     * @experimental
     */
    <TResult = unknown>(url: string | (() => string | undefined), options?: HttpResourceOptions<TResult, unknown>): HttpResourceRef<TResult | undefined>;
    /**
     * Create a `Resource` that fetches data with the configured HTTP request.
     *
     * If a reactive function is passed for the request, the resource will update when the request
     * changes via signals.
     *
     * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features
     * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of
     * `httpResource`, such as `httpResource.text()`, to parse the response differently.
     *
     * @experimental
     */
    <TResult = unknown>(request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions<TResult, unknown> & {
        defaultValue: NoInfer<TResult>;
    }): HttpResourceRef<TResult>;
    /**
     * Create a `Resource` that fetches data with the configured HTTP request.
     *
     * If a reactive function is passed for the request, the resource will update when the request
     * changes via signals.
     *
     * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features
     * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of
     * `httpResource`, such as `httpResource.text()`, to parse the response differently.
     *
     * @experimental
     */
    <TResult = unknown>(request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions<TResult, unknown>): HttpResourceRef<TResult | undefined>;
    /**
     * Create a `Resource` that fetches data with the configured HTTP request.
     *
     * If a reactive function is passed for the URL or request, the resource will update when the
     * URL or request changes via signals.
     *
     * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features
     * of the `HttpClient` API. Data is parsed into an `ArrayBuffer`.
     *
     * @experimental
     */
    arrayBuffer: {
        <TResult = ArrayBuffer>(url: string | (() => string | undefined), options: HttpResourceOptions<TResult, ArrayBuffer> & {
            defaultValue: NoInfer<TResult>;
        }): HttpResourceRef<TResult>;
        <TResult = ArrayBuffer>(url: string | (() => string | undefined), options?: HttpResourceOptions<TResult, ArrayBuffer>): HttpResourceRef<TResult | undefined>;
        <TResult = ArrayBuffer>(request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions<TResult, ArrayBuffer> & {
            defaultValue: NoInfer<TResult>;
        }): HttpResourceRef<TResult>;
        <TResult = ArrayBuffer>(request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions<TResult, ArrayBuffer>): HttpResourceRef<TResult | undefined>;
    };
    /**
     * Create a `Resource` that fetches data with the configured HTTP request.
     *
     * If a reactive function is passed for the URL or request, the resource will update when the
     * URL or request changes via signals.
     *
     * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features
     * of the `HttpClient` API. Data is parsed into a `Blob`.
     *
     * @experimental
     */
    blob: {
        <TResult = Blob>(url: string | (() => string | undefined), options: HttpResourceOptions<TResult, Blob> & {
            defaultValue: NoInfer<TResult>;
        }): HttpResourceRef<TResult>;
        <TResult = Blob>(url: string | (() => string | undefined), options?: HttpResourceOptions<TResult, Blob>): HttpResourceRef<TResult | undefined>;
        <TResult = Blob>(request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions<TResult, Blob> & {
            defaultValue: NoInfer<TResult>;
        }): HttpResourceRef<TResult>;
        <TResult = Blob>(request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions<TResult, Blob>): HttpResourceRef<TResult | undefined>;
    };
    /**
     * Create a `Resource` that fetches data with the configured HTTP request.
     *
     * If a reactive function is passed for the URL or request, the resource will update when the
     * URL or request changes via signals.
     *
     * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features
     * of the `HttpClient` API. Data is parsed as a `string`.
     *
     * @experimental
     */
    text: {
        <TResult = string>(url: string | (() => string | undefined), options: HttpResourceOptions<TResult, string> & {
            defaultValue: NoInfer<TResult>;
        }): HttpResourceRef<TResult>;
        <TResult = string>(url: string | (() => string | undefined), options?: HttpResourceOptions<TResult, string>): HttpResourceRef<TResult | undefined>;
        <TResult = string>(request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions<TResult, string> & {
            defaultValue: NoInfer<TResult>;
        }): HttpResourceRef<TResult>;
        <TResult = string>(request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions<TResult, string>): HttpResourceRef<TResult | undefined>;
    };
}
/**
 * `httpResource` makes a reactive HTTP request and exposes the request status and response value as
 * a `WritableResource`. By default, it assumes that the backend will return JSON data. To make a
 * request that expects a different kind of data, you can use a sub-constructor of `httpResource`,
 * such as `httpResource.text`.
 *
 * @experimental
 * @initializerApiFunction
 */
declare const httpResource: HttpResourceFn;

/**
 * Options to configure how TransferCache should be used to cache requests made via HttpClient.
 *
 * @param includeHeaders Specifies which headers should be included into cached responses. No
 *     headers are included by default.
 * @param filter A function that receives a request as an argument and returns a boolean to indicate
 *     whether a request should be included into the cache.
 * @param includePostRequests Enables caching for POST requests. By default, only GET and HEAD
 *     requests are cached. This option can be enabled if POST requests are used to retrieve data
 *     (for example using GraphQL).
 * @param includeRequestsWithAuthHeaders Enables caching of requests containing either `Authorization`
 *     or `Proxy-Authorization` headers. By default, these requests are excluded from caching.
 *
 * @publicApi
 */
type HttpTransferCacheOptions = {
    includeHeaders?: string[];
    filter?: (req: HttpRequest<unknown>) => boolean;
    includePostRequests?: boolean;
    includeRequestsWithAuthHeaders?: boolean;
};
/**
 * If your application uses different HTTP origins to make API calls (via `HttpClient`) on the server and
 * on the client, the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token allows you to establish a mapping
 * between those origins, so that `HttpTransferCache` feature can recognize those requests as the same
 * ones and reuse the data cached on the server during hydration on the client.
 *
 * **Important note**: the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token should *only* be provided in
 * the *server* code of your application (typically in the `app.server.config.ts` script). Angular throws an
 * error if it detects that the token is defined while running on the client.
 *
 * @usageNotes
 *
 * When the same API endpoint is accessed via `http://internal-domain.com:8080` on the server and
 * via `https://external-domain.com` on the client, you can use the following configuration:
 * ```ts
 * // in app.server.config.ts
 * {
 *     provide: HTTP_TRANSFER_CACHE_ORIGIN_MAP,
 *     useValue: {
 *         'http://internal-domain.com:8080': 'https://external-domain.com'
 *     }
 * }
 * ```
 *
 * @publicApi
 */
declare const HTTP_TRANSFER_CACHE_ORIGIN_MAP: InjectionToken<Record<string, string>>;
/**
 * Returns the DI providers needed to enable HTTP transfer cache.
 *
 * By default, when using server rendering, requests are performed twice: once on the server and
 * other one on the browser.
 *
 * When these providers are added, requests performed on the server are cached and reused during the
 * bootstrapping of the application in the browser thus avoiding duplicate requests and reducing
 * load time.
 *
 */
declare function withHttpTransferCache(cacheOptions: HttpTransferCacheOptions): Provider[];

/**
 * Uses `XMLHttpRequest` to send requests to a backend server.
 * @see {@link HttpHandler}
 * @see {@link JsonpClientBackend}
 *
 * @publicApi
 */
declare class HttpXhrBackend implements HttpBackend {
    private xhrFactory;
    constructor(xhrFactory: XhrFactory);
    /**
     * Processes a request and returns a stream of response events.
     * @param req The request object.
     * @returns An observable of the response events.
     */
    handle(req: HttpRequest<any>): Observable<HttpEvent<any>>;
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpXhrBackend, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<HttpXhrBackend>;
}

/**
 * Retrieves the current XSRF token to use with the next outgoing request.
 *
 * @publicApi
 */
declare abstract class HttpXsrfTokenExtractor {
    /**
     * Get the XSRF token to use with an outgoing request.
     *
     * Will be called for every request, so the token may change between requests.
     */
    abstract getToken(): string | null;
}

export { FetchBackend, HTTP_INTERCEPTORS, HTTP_TRANSFER_CACHE_ORIGIN_MAP, HttpBackend, HttpClient, HttpContext, HttpEvent, HttpFeatureKind, HttpHandler, HttpHeaders, HttpParams, HttpProgressEvent, HttpRequest, HttpResponse, HttpXhrBackend, HttpXsrfTokenExtractor, JsonpClientBackend, JsonpInterceptor, httpResource, provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration, HTTP_ROOT_INTERCEPTOR_FNS as ɵHTTP_ROOT_INTERCEPTOR_FNS, HttpInterceptorHandler as ɵHttpInterceptingHandler, HttpInterceptorHandler as ɵHttpInterceptorHandler, REQUESTS_CONTRIBUTE_TO_STABILITY as ɵREQUESTS_CONTRIBUTE_TO_STABILITY, withHttpTransferCache as ɵwithHttpTransferCache };
export type { HttpFeature, HttpHandlerFn, HttpInterceptor, HttpInterceptorFn, HttpResourceFn, HttpResourceOptions, HttpResourceRef, HttpResourceRequest, HttpTransferCacheOptions };
xM/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { HttpRequest, HttpEvent, HttpHeaders, HttpClientModule } from '../../module.d-CnjH8Dlt.js';
import { Observer } from 'rxjs';
import * as i0 from '@angular/core';
import { Provider } from '@angular/core';

/**
 * Type that describes options that can be used to create an error
 * in `TestRequest`.
 */
type TestRequestErrorOptions = {
    headers?: HttpHeaders | {
        [name: string]: string | string[];
    };
    status?: number;
    statusText?: string;
};
/**
 * A mock requests that was received and is ready to be answered.
 *
 * This interface allows access to the underlying `HttpRequest`, and allows
 * responding with `HttpEvent`s or `HttpErrorResponse`s.
 *
 * @publicApi
 */
declare class TestRequest {
    request: HttpRequest<any>;
    private observer;
    /**
     * Whether the request was cancelled after it was sent.
     */
    get cancelled(): boolean;
    constructor(request: HttpRequest<any>, observer: Observer<HttpEvent<any>>);
    /**
     * Resolve the request by returning a body plus additional HTTP information (such as response
     * headers) if provided.
     * If the request specifies an expected body type, the body is converted into the requested type.
     * Otherwise, the body is converted to `JSON` by default.
     *
     * Both successful and unsuccessful responses can be delivered via `flush()`.
     */
    flush(body: ArrayBuffer | Blob | boolean | string | number | Object | (boolean | string | number | Object | null)[] | null, opts?: {
        headers?: HttpHeaders | {
            [name: string]: string | string[];
        };
        status?: number;
        statusText?: string;
    }): void;
    /**
     * Resolve the request by returning an `ErrorEvent` (e.g. simulating a network failure).
     * @deprecated Http requests never emit an `ErrorEvent`. Please specify a `ProgressEvent`.
     */
    error(error: ErrorEvent, opts?: TestRequestErrorOptions): void;
    /**
     * Resolve the request by returning an `ProgressEvent` (e.g. simulating a network failure).
     */
    error(error: ProgressEvent, opts?: TestRequestErrorOptions): void;
    /**
     * Deliver an arbitrary `HttpEvent` (such as a progress event) on the response stream for this
     * request.
     */
    event(event: HttpEvent<any>): void;
}

/**
 * Defines a matcher for requests based on URL, method, or both.
 *
 * @publicApi
 */
interface RequestMatch {
    method?: string;
    url?: string;
}
/**
 * Controller to be injected into tests, that allows for mocking and flushing
 * of requests.
 *
 * @publicApi
 */
declare abstract class HttpTestingController {
    /**
     * Search for requests that match the given parameter, without any expectations.
     */
    abstract match(match: string | RequestMatch | ((req: HttpRequest<any>) => boolean)): TestRequest[];
    /**
     * Expect that a single request has been made which matches the given URL, and return its
     * mock.
     *
     * If no such request has been made, or more than one such request has been made, fail with an
     * error message including the given request description, if any.
     */
    abstract expectOne(url: string, description?: string): TestRequest;
    /**
     * Expect that a single request has been made which matches the given parameters, and return
     * its mock.
     *
     * If no such request has been made, or more than one such request has been made, fail with an
     * error message including the given request description, if any.
     */
    abstract expectOne(params: RequestMatch, description?: string): TestRequest;
    /**
     * Expect that a single request has been made which matches the given predicate function, and
     * return its mock.
     *
     * If no such request has been made, or more than one such request has been made, fail with an
     * error message including the given request description, if any.
     */
    abstract expectOne(matchFn: (req: HttpRequest<any>) => boolean, description?: string): TestRequest;
    /**
     * Expect that a single request has been made which matches the given condition, and return
     * its mock.
     *
     * If no such request has been made, or more than one such request has been made, fail with an
     * error message including the given request description, if any.
     */
    abstract expectOne(match: string | RequestMatch | ((req: HttpRequest<any>) => boolean), description?: string): TestRequest;
    /**
     * Expect that no requests have been made which match the given URL.
     *
     * If a matching request has been made, fail with an error message including the given request
     * description, if any.
     */
    abstract expectNone(url: string, description?: string): void;
    /**
     * Expect that no requests have been made which match the given parameters.
     *
     * If a matching request has been made, fail with an error message including the given request
     * description, if any.
     */
    abstract expectNone(params: RequestMatch, description?: string): void;
    /**
     * Expect that no requests have been made which match the given predicate function.
     *
     * If a matching request has been made, fail with an error message including the given request
     * description, if any.
     */
    abstract expectNone(matchFn: (req: HttpRequest<any>) => boolean, description?: string): void;
    /**
     * Expect that no requests have been made which match the given condition.
     *
     * If a matching request has been made, fail with an error message including the given request
     * description, if any.
     */
    abstract expectNone(match: string | RequestMatch | ((req: HttpRequest<any>) => boolean), description?: string): void;
    /**
     * Verify that no unmatched requests are outstanding.
     *
     * If any requests are outstanding, fail with an error message indicating which requests were not
     * handled.
     *
     * If `ignoreCancelled` is not set (the default), `verify()` will also fail if cancelled requests
     * were not explicitly matched.
     */
    abstract verify(opts?: {
        ignoreCancelled?: boolean;
    }): void;
}

/**
 * Configures `HttpClientTestingBackend` as the `HttpBackend` used by `HttpClient`.
 *
 * Inject `HttpTestingController` to expect and flush requests in your tests.
 *
 * @publicApi
 *
 * @deprecated Add `provideHttpClientTesting()` to your providers instead.
 */
declare class HttpClientTestingModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpClientTestingModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<HttpClientTestingModule, never, [typeof HttpClientModule], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<HttpClientTestingModule>;
}

declare function provideHttpClientTesting(): Provider[];

export { HttpClientTestingModule, HttpTestingController, TestRequest, provideHttpClientTesting };
export type { RequestMatch };
h?x4C/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { ɵNavigation as _Navigation, ɵNavigationHistoryEntry as _NavigationHistoryEntry, ɵNavigationUpdateCurrentEntryOptions as _NavigationUpdateCurrentEntryOptions, ɵNavigationTransition as _NavigationTransition, ɵNavigationNavigateOptions as _NavigationNavigateOptions, ɵNavigationResult as _NavigationResult, ɵNavigationReloadOptions as _NavigationReloadOptions, ɵNavigationOptions as _NavigationOptions, ɵNavigateEvent as _NavigateEvent, ɵNavigationCurrentEntryChangeEvent as _NavigationCurrentEntryChangeEvent, OnDestroy, InjectionToken, Version, Provider, OnInit, OnChanges, SimpleChanges } from '@angular/core';
export { ɵIMAGE_CONFIG as IMAGE_CONFIG, ɵImageConfig as ImageConfig } from '@angular/core';
import { LocationStrategy } from './common_module.d-NEF7UaHr.js';
export { APP_BASE_HREF, AsyncPipe, CommonModule, CurrencyPipe, DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe, DatePipeConfig, DecimalPipe, I18nPluralPipe, I18nSelectPipe, JsonPipe, KeyValue, KeyValuePipe, Location, LowerCasePipe, NgClass, NgComponentOutlet, NgForOf as NgFor, NgForOf, NgForOfContext, NgIf, NgIfContext, NgLocaleLocalization, NgLocalization, NgPlural, NgPluralCase, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet, PathLocationStrategy, PercentPipe, PopStateEvent, SlicePipe, TitleCasePipe, UpperCasePipe } from './common_module.d-NEF7UaHr.js';
import { PlatformLocation, LocationChangeListener } from './platform_location.d-Lbv6Ueec.js';
export { BrowserPlatformLocation, LOCATION_INITIALIZED, LocationChangeEvent } from './platform_location.d-Lbv6Ueec.js';
export { XhrFactory } from './xhr.d-D_1kTQR5.js';
import 'rxjs';

declare function getDOM(): DomAdapter;
declare function setRootDomAdapter(adapter: DomAdapter): void;
/**
 * Provides DOM operations in an environment-agnostic way.
 *
 * @security Tread carefully! Interacting with the DOM directly is dangerous and
 * can introduce XSS risks.
 */
declare abstract class DomAdapter {
    abstract dispatchEvent(el: any, evt: any): any;
    abstract readonly supportsDOMEvents: boolean;
    abstract remove(el: any): void;
    abstract createElement(tagName: any, doc?: any): HTMLElement;
    abstract createHtmlDocument(): Document;
    abstract getDefaultDocument(): Document;
    abstract isElementNode(node: any): boolean;
    abstract isShadowRoot(node: any): boolean;
    abstract onAndCancel(el: any, evt: any, listener: any, options?: any): Function;
    abstract getGlobalEventTarget(doc: Document, target: string): any;
    abstract getBaseHref(doc: Document): string | null;
    abstract resetBaseElement(): void;
    abstract getUserAgent(): string;
    abstract getCookie(name: string): string | null;
}

/**
 * This class wraps the platform Navigation API which allows server-specific and test
 * implementations.
 */
declare abstract class PlatformNavigation implements _Navigation {
    abstract entries(): _NavigationHistoryEntry[];
    abstract currentEntry: _NavigationHistoryEntry | null;
    abstract updateCurrentEntry(options: _NavigationUpdateCurrentEntryOptions): void;
    abstract transition: _NavigationTransition | null;
    abstract canGoBack: boolean;
    abstract canGoForward: boolean;
    abstract navigate(url: string, options?: _NavigationNavigateOptions | undefined): _NavigationResult;
    abstract reload(options?: _NavigationReloadOptions | undefined): _NavigationResult;
    abstract traverseTo(key: string, options?: _NavigationOptions | undefined): _NavigationResult;
    abstract back(options?: _NavigationOptions | undefined): _NavigationResult;
    abstract forward(options?: _NavigationOptions | undefined): _NavigationResult;
    abstract onnavigate: ((this: _Navigation, ev: _NavigateEvent) => any) | null;
    abstract onnavigatesuccess: ((this: _Navigation, ev: Event) => any) | null;
    abstract onnavigateerror: ((this: _Navigation, ev: ErrorEvent) => any) | null;
    abstract oncurrententrychange: ((this: _Navigation, ev: _NavigationCurrentEntryChangeEvent) => any) | null;
    abstract addEventListener(type: unknown, listener: unknown, options?: unknown): void;
    abstract removeEventListener(type: unknown, listener: unknown, options?: unknown): void;
    abstract dispatchEvent(event: Event): boolean;
    static ɵfac: i0.ɵɵFactoryDeclaration<PlatformNavigation, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PlatformNavigation>;
}

/**
 * @description
 * A {@link LocationStrategy} used to configure the {@link Location} service to
 * represent its state in the
 * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)
 * of the browser's URL.
 *
 * For instance, if you call `location.go('/foo')`, the browser's URL will become
 * `example.com#/foo`.
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example common/location/ts/hash_location_component.ts region='LocationComponent'}
 *
 * @publicApi
 */
declare class HashLocationStrategy extends LocationStrategy implements OnDestroy {
    private _platformLocation;
    private _baseHref;
    private _removeListenerFns;
    constructor(_platformLocation: PlatformLocation, _baseHref?: string);
    /** @docs-private */
    ngOnDestroy(): void;
    onPopState(fn: LocationChangeListener): void;
    getBaseHref(): string;
    path(includeHash?: boolean): string;
    prepareExternalUrl(internal: string): string;
    pushState(state: any, title: string, path: string, queryParams: string): void;
    replaceState(state: any, title: string, path: string, queryParams: string): void;
    forward(): void;
    back(): void;
    getState(): unknown;
    historyGo(relativePosition?: number): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<HashLocationStrategy, [null, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<HashLocationStrategy>;
}

/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a date according to locale rules.
 *
 * @param value The date to format, as a Date, or a number (milliseconds since UTC epoch)
 * or an [ISO date-time string](https://www.w3.org/TR/NOTE-datetime).
 * @param format The date-time components to include. See `DatePipe` for details.
 * @param locale A locale code for the locale format rules to use.
 * @param timezone The time zone. A time zone offset from GMT (such as `'+0430'`).
 * If not specified, uses host system settings.
 *
 * @returns The formatted date string.
 *
 * @see {@link DatePipe}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 */
declare function formatDate(value: string | number | Date, format: string, locale: string, timezone?: string): string;

/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a number as currency using locale rules.
 *
 * @param value The number to format.
 * @param locale A locale code for the locale format rules to use.
 * @param currency A string containing the currency symbol or its name,
 * such as "$" or "Canadian Dollar". Used in output string, but does not affect the operation
 * of the function.
 * @param currencyCode The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217)
 * currency code, such as `USD` for the US dollar and `EUR` for the euro.
 * Used to determine the number of digits in the decimal part.
 * @param digitsInfo Decimal representation options, specified by a string in the following format:
 * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
 *
 * @returns The formatted currency value.
 *
 * @see {@link formatNumber}
 * @see {@link DecimalPipe}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 */
declare function formatCurrency(value: number, locale: string, currency: string, currencyCode?: string, digitsInfo?: string): string;
/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a number as a percentage according to locale rules.
 *
 * @param value The number to format.
 * @param locale A locale code for the locale format rules to use.
 * @param digitsInfo Decimal representation options, specified by a string in the following format:
 * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
 *
 * @returns The formatted percentage value.
 *
 * @see {@link formatNumber}
 * @see {@link DecimalPipe}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 * @publicApi
 *
 */
declare function formatPercent(value: number, locale: string, digitsInfo?: string): string;
/**
 * @ngModule CommonModule
 * @description
 *
 * Formats a number as text, with group sizing, separator, and other
 * parameters based on the locale.
 *
 * @param value The number to format.
 * @param locale A locale code for the locale format rules to use.
 * @param digitsInfo Decimal representation options, specified by a string in the following format:
 * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
 *
 * @returns The formatted text string.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 */
declare function formatNumber(value: number, locale: string, digitsInfo?: string): string;

/**
 * Register global data to be used internally by Angular. See the
 * ["I18n guide"](guide/i18n/format-data-locale) to know how to import additional locale
 * data.
 *
 * The signature registerLocaleData(data: any, extraData?: any) is deprecated since v5.1
 *
 * @publicApi
 */
declare function registerLocaleData(data: any, localeId?: string | any, extraData?: any): void;

/**
 * Format styles that can be used to represent numbers.
 * @see {@link getLocaleNumberFormat}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated `getLocaleNumberFormat` is deprecated
 */
declare enum NumberFormatStyle {
    Decimal = 0,
    Percent = 1,
    Currency = 2,
    Scientific = 3
}
/**
 * Plurality cases used for translating plurals to different languages.
 *
 * @see {@link NgPlural}
 * @see {@link NgPluralCase}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated `getLocalePluralCase` is deprecated
 */
declare enum Plural {
    Zero = 0,
    One = 1,
    Two = 2,
    Few = 3,
    Many = 4,
    Other = 5
}
/**
 * Context-dependant translation forms for strings.
 * Typically the standalone version is for the nominative form of the word,
 * and the format version is used for the genitive case.
 * @see [CLDR website](http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles)
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated locale data getters are deprecated
 */
declare enum FormStyle {
    Format = 0,
    Standalone = 1
}
/**
 * String widths available for translations.
 * The specific character widths are locale-specific.
 * Examples are given for the word "Sunday" in English.
 *
 * @publicApi
 *
 * @deprecated locale data getters are deprecated
 */
declare enum TranslationWidth {
    /** 1 character for `en-US`. For example: 'S' */
    Narrow = 0,
    /** 3 characters for `en-US`. For example: 'Sun' */
    Abbreviated = 1,
    /** Full length for `en-US`. For example: "Sunday" */
    Wide = 2,
    /** 2 characters for `en-US`, For example: "Su" */
    Short = 3
}
/**
 * String widths available for date-time formats.
 * The specific character widths are locale-specific.
 * Examples are given for `en-US`.
 *
 * @see {@link getLocaleDateFormat}
 * @see {@link getLocaleTimeFormat}
 * @see {@link getLocaleDateTimeFormat}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 * @publicApi
 *
 * @deprecated Date locale data getters are deprecated
 */
declare enum FormatWidth {
    /**
     * For `en-US`, `'M/d/yy, h:mm a'`
     * (Example: `6/15/15, 9:03 AM`)
     */
    Short = 0,
    /**
     * For `en-US`, `'MMM d, y, h:mm:ss a'`
     * (Example: `Jun 15, 2015, 9:03:01 AM`)
     */
    Medium = 1,
    /**
     * For `en-US`, `'MMMM d, y, h:mm:ss a z'`
     * (Example: `June 15, 2015 at 9:03:01 AM GMT+1`)
     */
    Long = 2,
    /**
     * For `en-US`, `'EEEE, MMMM d, y, h:mm:ss a zzzz'`
     * (Example: `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00`)
     */
    Full = 3
}
/**
 * Symbols that can be used to replace placeholders in number patterns.
 * Examples are based on `en-US` values.
 *
 * @see {@link getLocaleNumberSymbol}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated `getLocaleNumberSymbol` is deprecated
 *
 * @object-literal-as-enum
 */
declare const NumberSymbol: {
    /**
     * Decimal separator.
     * For `en-US`, the dot character.
     * Example: 2,345`.`67
     */
    readonly Decimal: 0;
    /**
     * Grouping separator, typically for thousands.
     * For `en-US`, the comma character.
     * Example: 2`,`345.67
     */
    readonly Group: 1;
    /**
     * List-item separator.
     * Example: "one, two, and three"
     */
    readonly List: 2;
    /**
     * Sign for percentage (out of 100).
     * Example: 23.4%
     */
    readonly PercentSign: 3;
    /**
     * Sign for positive numbers.
     * Example: +23
     */
    readonly PlusSign: 4;
    /**
     * Sign for negative numbers.
     * Example: -23
     */
    readonly MinusSign: 5;
    /**
     * Computer notation for exponential value (n times a power of 10).
     * Example: 1.2E3
     */
    readonly Exponential: 6;
    /**
     * Human-readable format of exponential.
     * Example: 1.2x103
     */
    readonly SuperscriptingExponent: 7;
    /**
     * Sign for permille (out of 1000).
     * Example: 23.4‰
     */
    readonly PerMille: 8;
    /**
     * Infinity, can be used with plus and minus.
     * Example: ∞, +∞, -∞
     */
    readonly Infinity: 9;
    /**
     * Not a number.
     * Example: NaN
     */
    readonly NaN: 10;
    /**
     * Symbol used between time units.
     * Example: 10:52
     */
    readonly TimeSeparator: 11;
    /**
     * Decimal separator for currency values (fallback to `Decimal`).
     * Example: $2,345.67
     */
    readonly CurrencyDecimal: 12;
    /**
     * Group separator for currency values (fallback to `Group`).
     * Example: $2,345.67
     */
    readonly CurrencyGroup: 13;
};
type NumberSymbol = (typeof NumberSymbol)[keyof typeof NumberSymbol];
/**
 * The value for each day of the week, based on the `en-US` locale
 *
 * @publicApi
 *
 * @deprecated Week locale getters are deprecated
 */
declare enum WeekDay {
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6
}
/**
 * Retrieves the locale ID from the currently loaded locale.
 * The loaded locale could be, for example, a global one rather than a regional one.
 * @param locale A locale code, such as `fr-FR`.
 * @returns The locale code. For example, `fr`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * This function serves no purpose when relying on the `Intl` API.
 */
declare function getLocaleId(locale: string): string;
/**
 * Retrieves day period strings for the given locale.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param formStyle The required grammatical form.
 * @param width The required character width.
 * @returns An array of localized period strings. For example, `[AM, PM]` for `en-US`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
declare function getLocaleDayPeriods(locale: string, formStyle: FormStyle, width: TranslationWidth): Readonly<[string, string]>;
/**
 * Retrieves days of the week for the given locale, using the Gregorian calendar.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param formStyle The required grammatical form.
 * @param width The required character width.
 * @returns An array of localized name strings.
 * For example,`[Sunday, Monday, ... Saturday]` for `en-US`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
declare function getLocaleDayNames(locale: string, formStyle: FormStyle, width: TranslationWidth): ReadonlyArray<string>;
/**
 * Retrieves months of the year for the given locale, using the Gregorian calendar.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param formStyle The required grammatical form.
 * @param width The required character width.
 * @returns An array of localized name strings.
 * For example,  `[January, February, ...]` for `en-US`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
declare function getLocaleMonthNames(locale: string, formStyle: FormStyle, width: TranslationWidth): ReadonlyArray<string>;
/**
 * Retrieves Gregorian-calendar eras for the given locale.
 * @param locale A locale code for the locale format rules to use.
 * @param width The required character width.

 * @returns An array of localized era strings.
 * For example, `[AD, BC]` for `en-US`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
declare function getLocaleEraNames(locale: string, width: TranslationWidth): Readonly<[string, string]>;
/**
 * Retrieves the first day of the week for the given locale.
 *
 * @param locale A locale code for the locale format rules to use.
 * @returns A day index number, using the 0-based week-day index for `en-US`
 * (Sunday = 0, Monday = 1, ...).
 * For example, for `fr-FR`, returns 1 to indicate that the first day is Monday.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Intl's [`getWeekInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getWeekInfo) has partial support (Chromium M99 & Safari 17).
 * You may want to rely on the following alternatives:
 * - Libraries like [`Luxon`](https://moment.github.io/luxon/#/) rely on `Intl` but fallback on the ISO 8601 definition (monday) if `getWeekInfo` is not supported.
 * - Other librairies like [`date-fns`](https://date-fns.org/), [`day.js`](https://day.js.org/en/) or [`weekstart`](https://www.npmjs.com/package/weekstart) library provide their own locale based data for the first day of the week.
 */
declare function getLocaleFirstDayOfWeek(locale: string): WeekDay;
/**
 * Range of week days that are considered the week-end for the given locale.
 *
 * @param locale A locale code for the locale format rules to use.
 * @returns The range of day values, `[startDay, endDay]`.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Intl's [`getWeekInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getWeekInfo) has partial support (Chromium M99 & Safari 17).
 * Libraries like [`Luxon`](https://moment.github.io/luxon/#/) rely on `Intl` but fallback on the ISO 8601 definition (Saturday+Sunday) if `getWeekInfo` is not supported .
 */
declare function getLocaleWeekEndRange(locale: string): [WeekDay, WeekDay];
/**
 * Retrieves a localized date-value formatting string.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param width The format type.
 * @returns The localized formatting string.
 * @see {@link FormatWidth}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
declare function getLocaleDateFormat(locale: string, width: FormatWidth): string;
/**
 * Retrieves a localized time-value formatting string.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param width The format type.
 * @returns The localized formatting string.
 * @see {@link FormatWidth}
 * @see [Internationalization (i18n) Guide](guide/i18n)

 * @publicApi
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
declare function getLocaleTimeFormat(locale: string, width: FormatWidth): string;
/**
 * Retrieves a localized date-time formatting string.
 *
 * @param locale A locale code for the locale format rules to use.
 * @param width The format type.
 * @returns The localized formatting string.
 * @see {@link FormatWidth}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.DateTimeFormat` for date formating instead.
 */
declare function getLocaleDateTimeFormat(locale: string, width: FormatWidth): string;
/**
 * Retrieves a localized number symbol that can be used to replace placeholders in number formats.
 * @param locale The locale code.
 * @param symbol The symbol to localize. Must be one of `NumberSymbol`.
 * @returns The character for the localized symbol.
 * @see {@link NumberSymbol}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.NumberFormat` to format numbers instead.
 */
declare function getLocaleNumberSymbol(locale: string, symbol: NumberSymbol): string;
/**
 * Retrieves a number format for a given locale.
 *
 * Numbers are formatted using patterns, like `#,###.00`. For example, the pattern `#,###.00`
 * when used to format the number 12345.678 could result in "12'345,678". That would happen if the
 * grouping separator for your language is an apostrophe, and the decimal separator is a comma.
 *
 * <b>Important:</b> The characters `.` `,` `0` `#` (and others below) are special placeholders
 * that stand for the decimal separator, and so on, and are NOT real characters.
 * You must NOT "translate" the placeholders. For example, don't change `.` to `,` even though in
 * your language the decimal point is written with a comma. The symbols should be replaced by the
 * local equivalents, using the appropriate `NumberSymbol` for your language.
 *
 * Here are the special characters used in number patterns:
 *
 * | Symbol | Meaning |
 * |--------|---------|
 * | . | Replaced automatically by the character used for the decimal point. |
 * | , | Replaced by the "grouping" (thousands) separator. |
 * | 0 | Replaced by a digit (or zero if there aren't enough digits). |
 * | # | Replaced by a digit (or nothing if there aren't enough). |
 * | ¤ | Replaced by a currency symbol, such as $ or USD. |
 * | % | Marks a percent format. The % symbol may change position, but must be retained. |
 * | E | Marks a scientific format. The E symbol may change position, but must be retained. |
 * | ' | Special characters used as literal characters are quoted with ASCII single quotes. |
 *
 * @param locale A locale code for the locale format rules to use.
 * @param type The type of numeric value to be formatted (such as `Decimal` or `Currency`.)
 * @returns The localized format string.
 * @see {@link NumberFormatStyle}
 * @see [CLDR website](http://cldr.unicode.org/translation/number-patterns)
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Let `Intl.NumberFormat` determine the number format instead
 */
declare function getLocaleNumberFormat(locale: string, type: NumberFormatStyle): string;
/**
 * Retrieves the symbol used to represent the currency for the main country
 * corresponding to a given locale. For example, '$' for `en-US`.
 *
 * @param locale A locale code for the locale format rules to use.
 * @returns The localized symbol character,
 * or `null` if the main country cannot be determined.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Use the `Intl` API to format a currency with from currency code
 */
declare function getLocaleCurrencySymbol(locale: string): string | null;
/**
 * Retrieves the name of the currency for the main country corresponding
 * to a given locale. For example, 'US Dollar' for `en-US`.
 * @param locale A locale code for the locale format rules to use.
 * @returns The currency name,
 * or `null` if the main country cannot be determined.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Use the `Intl` API to format a currency with from currency code
 */
declare function getLocaleCurrencyName(locale: string): string | null;
/**
 * Retrieves the default currency code for the given locale.
 *
 * The default is defined as the first currency which is still in use.
 *
 * @param locale The code of the locale whose currency code we want.
 * @returns The code of the default currency for the given locale.
 *
 * @publicApi
 *
 * @deprecated We recommend you create a map of locale to ISO 4217 currency codes.
 * Time relative currency data is provided by the CLDR project. See https://www.unicode.org/cldr/charts/44/supplemental/detailed_territory_currency_information.html
 */
declare function getLocaleCurrencyCode(locale: string): string | null;
/**
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Use `Intl.PluralRules` instead
 */
declare const getLocalePluralCase: (locale: string) => (value: number) => Plural;
/**
 * Retrieves locale-specific rules used to determine which day period to use
 * when more than one period is defined for a locale.
 *
 * There is a rule for each defined day period. The
 * first rule is applied to the first day period and so on.
 * Fall back to AM/PM when no rules are available.
 *
 * A rule can specify a period as time range, or as a single time value.
 *
 * This functionality is only available when you have loaded the full locale data.
 * See the ["I18n guide"](guide/i18n/format-data-locale).
 *
 * @param locale A locale code for the locale format rules to use.
 * @returns The rules for the locale, a single time value or array of *from-time, to-time*,
 * or null if no periods are available.
 *
 * @see {@link getLocaleExtraDayPeriods}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * Let `Intl.DateTimeFormat` determine the day period instead.
 */
declare function getLocaleExtraDayPeriodRules(locale: string): (Time | [Time, Time])[];
/**
 * Retrieves locale-specific day periods, which indicate roughly how a day is broken up
 * in different languages.
 * For example, for `en-US`, periods are morning, noon, afternoon, evening, and midnight.
 *
 * This functionality is only available when you have loaded the full locale data.
 * See the ["I18n guide"](guide/i18n/format-data-locale).
 *
 * @param locale A locale code for the locale format rules to use.
 * @param formStyle The required grammatical form.
 * @param width The required character width.
 * @returns The translated day-period strings.
 * @see {@link getLocaleExtraDayPeriodRules}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * To extract a day period use `Intl.DateTimeFormat` with the `dayPeriod` option instead.
 */
declare function getLocaleExtraDayPeriods(locale: string, formStyle: FormStyle, width: TranslationWidth): string[];
/**
 * Retrieves the writing direction of a specified locale
 * @param locale A locale code for the locale format rules to use.
 * @publicApi
 * @returns 'rtl' or 'ltr'
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * For dates and numbers, let `Intl.DateTimeFormat()` and `Intl.NumberFormat()` determine the writing direction.
 * The `Intl` alternative [`getTextInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getTextInfo).
 * has only partial support (Chromium M99 & Safari 17).
 * 3rd party alternatives like [`rtl-detect`](https://www.npmjs.com/package/rtl-detect) can work around this issue.
 */
declare function getLocaleDirection(locale: string): 'ltr' | 'rtl';
/**
 * Represents a time value with hours and minutes.
 *
 * @publicApi
 *
 * @deprecated Locale date getters are deprecated
 */
type Time = {
    hours: number;
    minutes: number;
};
/**
 * Retrieves the currency symbol for a given currency code.
 *
 * For example, for the default `en-US` locale, the code `USD` can
 * be represented by the narrow symbol `$` or the wide symbol `US$`.
 *
 * @param code The currency code.
 * @param format The format, `wide` or `narrow`.
 * @param locale A locale code for the locale format rules to use.
 *
 * @returns The symbol, or the currency code if no symbol is available.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * You can use `Intl.NumberFormat().formatToParts()` to extract the currency symbol.
 * For example: `Intl.NumberFormat('en', {style:'currency', currency: 'USD'}).formatToParts().find(part => part.type === 'currency').value`
 * returns `$` for USD currency code in the `en` locale.
 * Note: `US$` is a currency symbol for the `en-ca` locale but not the `en-us` locale.
 */
declare function getCurrencySymbol(code: string, format: 'wide' | 'narrow', locale?: string): string;
/**
 * Reports the number of decimal digits for a given currency.
 * The value depends upon the presence of cents in that particular currency.
 *
 * @param code The currency code.
 * @returns The number of decimal digits, typically 0 or 2.
 * @see [Internationalization (i18n) Guide](guide/i18n)
 *
 * @publicApi
 *
 * @deprecated Angular recommends relying on the `Intl` API for i18n.
 * This function should not be used anymore. Let `Intl.NumberFormat` determine the number of digits to display for the currency
 */
declare function getNumberOfCurrencyDigits(code: string): number;

declare function parseCookieValue(cookieStr: string, name: string): string | null;

/**
 * A DI Token representing the main rendering context.
 * In a browser and SSR this is the DOM Document.
 * When using SSR, that document is created by [Domino](https://github.com/angular/domino).
 *
 * @publicApi
 */
declare const DOCUMENT: InjectionToken<Document>;

declare const PLATFORM_BROWSER_ID = "browser";
declare const PLATFORM_SERVER_ID = "server";
/**
 * Returns whether a platform id represents a browser platform.
 * @publicApi
 */
declare function isPlatformBrowser(platformId: Object): boolean;
/**
 * Returns whether a platform id represents a server platform.
 * @publicApi
 */
declare function isPlatformServer(platformId: Object): boolean;

/**
 * @module
 * @description
 * Entry point for all public APIs of the common package.
 */

/**
 * @publicApi
 */
declare const VERSION: Version;

/**
 * Defines a scroll position manager. Implemented by `BrowserViewportScroller`.
 *
 * @publicApi
 */
declare abstract class ViewportScroller {
    /** @nocollapse */
    static ɵprov: unknown;
    /**
     * Configures the top offset used when scrolling to an anchor.
     * @param offset A position in screen coordinates (a tuple with x and y values)
     * or a function that returns the top offset position.
     *
     */
    abstract setOffset(offset: [number, number] | (() => [number, number])): void;
    /**
     * Retrieves the current scroll position.
     * @returns A position in screen coordinates (a tuple with x and y values).
     */
    abstract getScrollPosition(): [number, number];
    /**
     * Scrolls to a specified position.
     * @param position A position in screen coordinates (a tuple with x and y values).
     */
    abstract scrollToPosition(position: [number, number]): void;
    /**
     * Scrolls to an anchor element.
     * @param anchor The ID of the anchor element.
     */
    abstract scrollToAnchor(anchor: string): void;
    /**
     * Disables automatic scroll restoration provided by the browser.
     * See also [window.history.scrollRestoration
     * info](https://developers.google.com/web/updates/2015/09/history-api-scroll-restoration).
     */
    abstract setHistoryScrollRestoration(scrollRestoration: 'auto' | 'manual'): void;
}
/**
 * Provides an empty implementation of the viewport scroller.
 */
declare class NullViewportScroller implements ViewportScroller {
    /**
     * Empty implementation
     */
    setOffset(offset: [number, number] | (() => [number, number])): void;
    /**
     * Empty implementation
     */
    getScrollPosition(): [number, number];
    /**
     * Empty implementation
     */
    scrollToPosition(position: [number, number]): void;
    /**
     * Empty implementation
     */
    scrollToAnchor(anchor: string): void;
    /**
     * Empty implementation
     */
    setHistoryScrollRestoration(scrollRestoration: 'auto' | 'manual'): void;
}

/**
 * Function that generates an ImageLoader for [Cloudflare Image
 * Resizing](https://developers.cloudflare.com/images/image-resizing/) and turns it into an Angular
 * provider. Note: Cloudflare has multiple image products - this provider is specifically for
 * Cloudflare Image Resizing; it will not work with Cloudflare Images or Cloudflare Polish.
 *
 * @param path Your domain name, e.g. https://mysite.com
 * @returns Provider that provides an ImageLoader function
 *
 * @publicApi
 */
declare const provideCloudflareLoader: (path: string) => Provider[];

/**
 * Config options recognized by the image loader function.
 *
 * @see {@link ImageLoader}
 * @see {@link NgOptimizedImage}
 * @publicApi
 */
interface ImageLoaderConfig {
    /**
     * Image file name to be added to the image request URL.
     */
    src: string;
    /**
     * Width of the requested image (to be used when generating srcset).
     */
    width?: number;
    /**
     * Whether the loader should generate a URL for a small image placeholder instead of a full-sized
     * image.
     */
    isPlaceholder?: boolean;
    /**
     * Additional user-provided parameters for use by the ImageLoader.
     */
    loaderParams?: {
        [key: string]: any;
    };
}
/**
 * Represents an image loader function. Image loader functions are used by the
 * NgOptimizedImage directive to produce full image URL based on the image name and its width.
 *
 * @publicApi
 */
type ImageLoader = (config: ImageLoaderConfig) => string;
/**
 * Injection token that configures the image loader function.
 *
 * @see {@link ImageLoader}
 * @see {@link NgOptimizedImage}
 * @publicApi
 */
declare const IMAGE_LOADER: InjectionToken<ImageLoader>;

/**
 * Function that generates an ImageLoader for Cloudinary and turns it into an Angular provider.
 *
 * @param path Base URL of your Cloudinary images
 * This URL should match one of the following formats:
 * https://res.cloudinary.com/mysite
 * https://mysite.cloudinary.com
 * https://subdomain.mysite.com
 * @returns Set of providers to configure the Cloudinary loader.
 *
 * @publicApi
 */
declare const provideCloudinaryLoader: (path: string) => Provider[];

/**
 * Function that generates an ImageLoader for ImageKit and turns it into an Angular provider.
 *
 * @param path Base URL of your ImageKit images
 * This URL should match one of the following formats:
 * https://ik.imagekit.io/myaccount
 * https://subdomain.mysite.com
 * @returns Set of providers to configure the ImageKit loader.
 *
 * @publicApi
 */
declare const provideImageKitLoader: (path: string) => Provider[];

/**
 * Function that generates an ImageLoader for Imgix and turns it into an Angular provider.
 *
 * @param path path to the desired Imgix origin,
 * e.g. https://somepath.imgix.net or https://images.mysite.com
 * @returns Set of providers to configure the Imgix loader.
 *
 * @publicApi
 */
declare const provideImgixLoader: (path: string) => Provider[];

/**
 * Function that generates an ImageLoader for Netlify and turns it into an Angular provider.
 *
 * @param path optional URL of the desired Netlify site. Defaults to the current site.
 * @returns Set of providers to configure the Netlify loader.
 *
 * @publicApi
 */
declare function provideNetlifyLoader(path?: string): Provider[];

/**
 * Config options used in rendering placeholder images.
 *
 * @see {@link NgOptimizedImage}
 * @publicApi
 */
interface ImagePlaceholderConfig {
    blur?: boolean;
}
/**
 * Directive that improves image loading performance by enforcing best practices.
 *
 * `NgOptimizedImage` ensures that the loading of the Largest Contentful Paint (LCP) image is
 * prioritized by:
 * - Automatically setting the `fetchpriority` attribute on the `<img>` tag
 * - Lazy loading non-priority images by default
 * - Automatically generating a preconnect link tag in the document head
 *
 * In addition, the directive:
 * - Generates appropriate asset URLs if a corresponding `ImageLoader` function is provided
 * - Automatically generates a srcset
 * - Requires that `width` and `height` are set
 * - Warns if `width` or `height` have been set incorrectly
 * - Warns if the image will be visually distorted when rendered
 *
 * @usageNotes
 * The `NgOptimizedImage` directive is marked as [standalone](guide/components/importing) and can
 * be imported directly.
 *
 * Follow the steps below to enable and use the directive:
 * 1. Import it into the necessary NgModule or a standalone Component.
 * 2. Optionally provide an `ImageLoader` if you use an image hosting service.
 * 3. Update the necessary `<img>` tags in templates and replace `src` attributes with `ngSrc`.
 * Using a `ngSrc` allows the directive to control when the `src` gets set, which triggers an image
 * download.
 *
 * Step 1: import the `NgOptimizedImage` directive.
 *
 * ```ts
 * import { NgOptimizedImage } from '@angular/common';
 *
 * // Include it into the necessary NgModule
 * @NgModule({
 *   imports: [NgOptimizedImage],
 * })
 * class AppModule {}
 *
 * // ... or a standalone Component
 * @Component({
 *   imports: [NgOptimizedImage],
 * })
 * class MyStandaloneComponent {}
 * ```
 *
 * Step 2: configure a loader.
 *
 * To use the **default loader**: no additional code changes are necessary. The URL returned by the
 * generic loader will always match the value of "src". In other words, this loader applies no
 * transformations to the resource URL and the value of the `ngSrc` attribute will be used as is.
 *
 * To use an existing loader for a **third-party image service**: add the provider factory for your
 * chosen service to the `providers` array. In the example below, the Imgix loader is used:
 *
 * ```ts
 * import {provideImgixLoader} from '@angular/common';
 *
 * // Call the function and add the result to the `providers` array:
 * providers: [
 *   provideImgixLoader("https://my.base.url/"),
 * ],
 * ```
 *
 * The `NgOptimizedImage` directive provides the following functions:
 * - `provideCloudflareLoader`
 * - `provideCloudinaryLoader`
 * - `provideImageKitLoader`
 * - `provideImgixLoader`
 *
 * If you use a different image provider, you can create a custom loader function as described
 * below.
 *
 * To use a **custom loader**: provide your loader function as a value for the `IMAGE_LOADER` DI
 * token.
 *
 * ```ts
 * import {IMAGE_LOADER, ImageLoaderConfig} from '@angular/common';
 *
 * // Configure the loader using the `IMAGE_LOADER` token.
 * providers: [
 *   {
 *      provide: IMAGE_LOADER,
 *      useValue: (config: ImageLoaderConfig) => {
 *        return `https://example.com/${config.src}-${config.width}.jpg`;
 *      }
 *   },
 * ],
 * ```
 *
 * Step 3: update `<img>` tags in templates to use `ngSrc` instead of `src`.
 *
 * ```html
 * <img ngSrc="logo.png" width="200" height="100">
 * ```
 *
 * @publicApi
 */
declare class NgOptimizedImage implements OnInit, OnChanges {
    private imageLoader;
    private config;
    private renderer;
    private imgElement;
    private injector;
    private lcpObserver?;
    /**
     * Calculate the rewritten `src` once and store it.
     * This is needed to avoid repetitive calculations and make sure the directive cleanup in the
     * `ngOnDestroy` does not rely on the `IMAGE_LOADER` logic (which in turn can rely on some other
     * instance that might be already destroyed).
     */
    private _renderedSrc;
    /**
     * Name of the source image.
     * Image name will be processed by the image loader and the final URL will be applied as the `src`
     * property of the image.
     */
    ngSrc: string;
    /**
     * A comma separated list of width or density descriptors.
     * The image name will be taken from `ngSrc` and combined with the list of width or density
     * descriptors to generate the final `srcset` property of the image.
     *
     * Example:
     * ```html
     * <img ngSrc="hello.jpg" ngSrcset="100w, 200w" />  =>
     * <img src="path/hello.jpg" srcset="path/hello.jpg?w=100 100w, path/hello.jpg?w=200 200w" />
     * ```
     */
    ngSrcset: string;
    /**
     * The base `sizes` attribute passed through to the `<img>` element.
     * Providing sizes causes the image to create an automatic responsive srcset.
     */
    sizes?: string;
    /**
     * For responsive images: the intrinsic width of the image in pixels.
     * For fixed size images: the desired rendered width of the image in pixels.
     */
    width: number | undefined;
    /**
     * For responsive images: the intrinsic height of the image in pixels.
     * For fixed size images: the desired rendered height of the image in pixels.
     */
    height: number | undefined;
    /**
     * The desired loading behavior (lazy, eager, or auto). Defaults to `lazy`,
     * which is recommended for most images.
     *
     * Warning: Setting images as loading="eager" or loading="auto" marks them
     * as non-priority images and can hurt loading performance. For images which
     * may be the LCP element, use the `priority` attribute instead of `loading`.
     */
    loading?: 'lazy' | 'eager' | 'auto';
    /**
     * Indicates whether this image should have a high priority.
     */
    priority: boolean;
    /**
     * Data to pass through to custom loaders.
     */
    loaderParams?: {
        [key: string]: any;
    };
    /**
     * Disables automatic srcset generation for this image.
     */
    disableOptimizedSrcset: boolean;
    /**
     * Sets the image to "fill mode", which eliminates the height/width requirement and adds
     * styles such that the image fills its containing element.
     */
    fill: boolean;
    /**
     * A URL or data URL for an image to be used as a placeholder while this image loads.
     */
    placeholder?: string | boolean;
    /**
     * Configuration object for placeholder settings. Options:
     *   * blur: Setting this to false disables the automatic CSS blur.
     */
    placeholderConfig?: ImagePlaceholderConfig;
    constructor();
    /** @docs-private */
    ngOnInit(): void;
    private setHostAttributes;
    /** @docs-private */
    ngOnChanges(changes: SimpleChanges): void;
    private callImageLoader;
    private getLoadingBehavior;
    private getFetchPriority;
    private getRewrittenSrc;
    private getRewrittenSrcset;
    private getAutomaticSrcset;
    private getResponsiveSrcset;
    private updateSrcAndSrcset;
    private getFixedSrcset;
    private shouldGenerateAutomaticSrcset;
    /**
     * Returns an image url formatted for use with the CSS background-image property. Expects one of:
     * * A base64 encoded image, which is wrapped and passed through.
     * * A boolean. If true, calls the image loader to generate a small placeholder url.
     */
    private generatePlaceholder;
    /**
     * Determines if blur should be applied, based on an optional boolean
     * property `blur` within the optional configuration object `placeholderConfig`.
     */
    private shouldBlurPlaceholder;
    private removePlaceholderOnLoad;
    private setHostAttribute;
    static ɵfac: i0.ɵɵFactoryDeclaration<NgOptimizedImage, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<NgOptimizedImage, "img[ngSrc]", never, { "ngSrc": { "alias": "ngSrc"; "required": true; }; "ngSrcset": { "alias": "ngSrcset"; "required": false; }; "sizes": { "alias": "sizes"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "priority": { "alias": "priority"; "required": false; }; "loaderParams": { "alias": "loaderParams"; "required": false; }; "disableOptimizedSrcset": { "alias": "disableOptimizedSrcset"; "required": false; }; "fill": { "alias": "fill"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderConfig": { "alias": "placeholderConfig"; "required": false; }; "src": { "alias": "src"; "required": false; }; "srcset": { "alias": "srcset"; "required": false; }; }, {}, never, never, true, never>;
    static ngAcceptInputType_ngSrc: string | i0.ɵSafeValue;
    static ngAcceptInputType_width: unknown;
    static ngAcceptInputType_height: unknown;
    static ngAcceptInputType_priority: unknown;
    static ngAcceptInputType_disableOptimizedSrcset: unknown;
    static ngAcceptInputType_fill: unknown;
    static ngAcceptInputType_placeholder: boolean | string;
}

/**
 * Injection token to configure which origins should be excluded
 * from the preconnect checks. It can either be a single string or an array of strings
 * to represent a group of origins, for example:
 *
 * ```ts
 *  {provide: PRECONNECT_CHECK_BLOCKLIST, useValue: 'https://your-domain.com'}
 * ```
 *
 * or:
 *
 * ```ts
 *  {provide: PRECONNECT_CHECK_BLOCKLIST,
 *   useValue: ['https://your-domain-1.com', 'https://your-domain-2.com']}
 * ```
 *
 * @publicApi
 */
declare const PRECONNECT_CHECK_BLOCKLIST: InjectionToken<(string | string[])[]>;

/**
 * Normalizes URL parameters by prepending with `?` if needed.
 *
 * @param  params String of URL parameters.
 *
 * @returns The normalized URL parameters string.
 */
declare function normalizeQueryParams(params: string): string;

export { DOCUMENT, FormStyle, FormatWidth, HashLocationStrategy, IMAGE_LOADER, LocationChangeListener, LocationStrategy, NgOptimizedImage, NumberFormatStyle, NumberSymbol, PRECONNECT_CHECK_BLOCKLIST, PlatformLocation, Plural, TranslationWidth, VERSION, ViewportScroller, WeekDay, formatCurrency, formatDate, formatNumber, formatPercent, getCurrencySymbol, getLocaleCurrencyCode, getLocaleCurrencyName, getLocaleCurrencySymbol, getLocaleDateFormat, getLocaleDateTimeFormat, getLocaleDayNames, getLocaleDayPeriods, getLocaleDirection, getLocaleEraNames, getLocaleExtraDayPeriodRules, getLocaleExtraDayPeriods, getLocaleFirstDayOfWeek, getLocaleId, getLocaleMonthNames, getLocaleNumberFormat, getLocaleNumberSymbol, getLocalePluralCase, getLocaleTimeFormat, getLocaleWeekEndRange, getNumberOfCurrencyDigits, isPlatformBrowser, isPlatformServer, provideCloudflareLoader, provideCloudinaryLoader, provideImageKitLoader, provideImgixLoader, provideNetlifyLoader, registerLocaleData, DomAdapter as ɵDomAdapter, NullViewportScroller as ɵNullViewportScroller, PLATFORM_BROWSER_ID as ɵPLATFORM_BROWSER_ID, PLATFORM_SERVER_ID as ɵPLATFORM_SERVER_ID, PlatformNavigation as ɵPlatformNavigation, getDOM as ɵgetDOM, normalizeQueryParams as ɵnormalizeQueryParams, parseCookieValue as ɵparseCookieValue, setRootDomAdapter as ɵsetRootDomAdapter };
export type { ImageLoader, ImageLoaderConfig, ImagePlaceholderConfig, Time };
b6^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    ARS: string[];
    AUD: string[];
    BEF: string[];
    BMD: string[];
    BND: string[];
    BYN: (string | undefined)[];
    BZD: string[];
    CAD: string[];
    CLP: string[];
    CNY: (string | undefined)[];
    COP: string[];
    CYP: string[];
    DJF: string[];
    EGP: (string | undefined)[];
    FJD: string[];
    FKP: string[];
    FRF: string[];
    GBP: string[];
    GIP: string[];
    HKD: (string | undefined)[];
    IEP: string[];
    ILP: string[];
    ITL: string[];
    JPY: (string | undefined)[];
    KMF: (string | undefined)[];
    LBP: string[];
    MTP: string[];
    MXN: string[];
    NAD: string[];
    NIO: (string | undefined)[];
    NZD: string[];
    PHP: (string | undefined)[];
    RHD: string[];
    RON: (string | undefined)[];
    RWF: (string | undefined)[];
    SBD: string[];
    SGD: string[];
    SRD: string[];
    TOP: (string | undefined)[];
    TTD: string[];
    TWD: (string | undefined)[];
    USD: string[];
    UYU: string[];
    WST: string[];
    XCD: (string | undefined)[];
    XPF: string[];
    ZMW: (string | undefined)[];
} | undefined)[];
export default _default;
7ʸ&nxfzED: string[];
    ARSAUD: string[];
    BBDBHD: string[];
    BMDBNDBSD&CNY: string[];
    COPCUPyDOP)DZD: string[];
    EGP: string[];
    FJDYD<HKD: string[];
    IQD: string[];
    IRR: string[];
    JMD<JOD: string[];
    JPY: string[];
    KWD: string[];
    KYDLRD)LYD: string[];
    MAD: string[];
    MRU$OMR1)QAR: string[];
    SAR: string[];
    SBD(DD: string[];
    SDG: string[];
    SRD;YP: string[];
    THB: string[];
    TND: string[];
    TTDTWD: string$ YER: string/]+cx y0GA6Qx* yGBP: string[];
    GIP.#G+>Qx	zUDBRLW!CAD#ESP: string[];
    EURFKP#HKDILINRJPYKRWMXNNZDPHPRONSSPSYPTWDUSD)VEF: string[];
    VES: string[];
    VNDXAF: never[];
    XCD
XOF: never/6KZkx zyBYNHS: string[];
    GNF<JPY: string[];
    NGN: string[];
    PGK: string[];
    PHP7#XAF: string[];
    XOF~7A%xj yBYNELKGS1RONRUB: string[];
    RUR$
MT: string,AH: string[];
    XXX~7dxx2 yDKK.#NOK: string[];
    SEK#G+ul9x5 y)JPY: string[];
    NGN: string[];
    RUB~7mx zIB8#9-x yGHSO+H~j&ExbzED: string[];
    ARSAUD: string[];
    BBDBHD: string[];
    BMDBNDBSD&CNY: string[];
    COPCUPDOP)DZD: string[];
    EGP: string[];
    FJDYD<HKD: string[];
    IQD: string[];
    IRR: string[];
    JMD<JOD: string[];
    JPY: string[];
    KWD: string[];
    KYDLRD)LYD: string[];
    MAD: string[];
    MRU$OMR1)QAR: string[];
    SAR: string[];
    SBD(DD: string[];
    SDG: string[];
    SRD;YP: string[];
    THB: string[];
    TND: string[];
    TTDTWD: string$ YER: string/K6x 3zT{%GM: string[];
    BGO1CUC(DEM: string[];
    EUR: never[];
    FKPGHSGNt!("ONRUR}"AYP: never[];
    THB: string[];
    TWD: string[];
    XXX: neverPP:x yJPY#USD: string/
?x '
zUDBRL!CAD2!ESP: string[];
    EURFKPGBP"LSINRS"RWMXNNZDPEN2ONSPYPTWDUSDVEVND
XAF: never]*	OF: never/	<@&x I%L:Hx CR@Vjx yNGN: string/c3%xU yBRL!y!"NRS"RWMXNNOKTHB6VND+~txS zU2JPY1PTEL11THB: string[];
    TWD: string[];
    USD: string/!oEx SEKJ.I+x pzUBRL!CA2!EURGBP"LSINRS"RWMDL: string[];
    MXNNZ!&VNe+"x yJPY+    XC=8o 	Fx kzFN|1bCAD: string[];
    CNY: string[];
    HKD: string[];
    IRR: string[];
    MXN: string[];
    NZD1XCD: string[];
    XOF>7*
ixQ y!GNF1NGN: string[];
    PGK-    XAF: string[];
    XOF>7Ixg CAD: string[];
    FJD: string<RURSBD: string=     XPF: never[];
    XXX: neverF/xt?xc y!GELMDL1!RUB: string[];
    RUR: stringMT$AH: string[];
    XXX>71xL y<BBD: string[];
    JPY: string[];
    KES: string[];
    SOS+ Wx y4KES1&TZS>7	v:x5 y)JPY: string[];
    KES: string[];
    UGX+JՀax SBD|+FnWx@ y&MXNAD2O;+ZAR: string/\&x yBB$USD: string/
Sx yCA$USD: string/
 x USD: string/*	*xL Aconst _default: ((string[] | undefined)[] | (string | string[])[]I:x yRUR;&9cr+x? ~BAM|1GELKRWNZD!N&VND+fEyx* y"DF#KES1;&TZSQ++/<xc CAD(IDR: string[];
    JPY: string[];
    MXMYR1TWD: string[];
    USD+Fk.x G,oLx SCRJ0Ntix yETB: string[];t,9n
-x yCDF|#:Fy`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["af-NA", [["v", "n"], ["vm.", "nm."], u], u, [["S", "M", "D", "W", "D", "V", "S"], ["So.", "Ma.", "Di.", "Wo.", "Do.", "Vr.", "Sa."], ["Sondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrydag", "Saterdag"], ["So.", "Ma.", "Di.", "Wo.", "Do.", "Vr.", "Sa."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan.", "Feb.", "Mrt.", "Apr.", "Mei", "Jun.", "Jul.", "Aug.", "Sep.", "Okt.", "Nov.", "Des."], ["Januarie", "Februarie", "Maart", "April", "Mei", "Junie", "Julie", "Augustus", "September", "Oktober", "November", "Desember"]], u, [["v.C.", "n.C."], u, ["voor Christus", "na Christus"]], 1, [6, 0], ["y-MM-dd", "dd MMM y", "dd MMMM y", "EEEE dd MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ZAR", "R", "Suid-Afrikaanse rand", { "BYN": [u, "р."], "CAD": [u, "$"], "JPY": ["JP¥", "¥"], "MXN": [u, "$"], "NAD": ["$"], "PHP": [u, "₱"], "RON": [u, "leu"], "THB": ["฿"], "TWD": ["NT$"], "USD": [u, "$"], "ZAR": ["R"] }, "ltr", plural];
//# sourceMappingURL=af-NA.js.map9^x{"version":3,"file":"ru-MD.js","sourceRoot":"","sources":["ru-MD.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))\n    return 3;\nif (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ru-MD\",[[\"AM\",\"PM\"],u,u],u,[[\"В\",\"П\",\"В\",\"С\",\"Ч\",\"П\",\"С\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],[\"воскресенье\",\"понедельник\",\"вторник\",\"среда\",\"четверг\",\"пятница\",\"суббота\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"мар.\",\"апр.\",\"мая\",\"июн.\",\"июл.\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"января\",\"февраля\",\"марта\",\"апреля\",\"мая\",\"июня\",\"июля\",\"августа\",\"сентября\",\"октября\",\"ноября\",\"декабря\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"март\",\"апр.\",\"май\",\"июнь\",\"июль\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"январь\",\"февраль\",\"март\",\"апрель\",\"май\",\"июнь\",\"июль\",\"август\",\"сентябрь\",\"октябрь\",\"ноябрь\",\"декабрь\"]],[[\"до н.э.\",\"н.э.\"],[\"до н. э.\",\"н. э.\"],[\"до Рождества Христова\",\"от Рождества Христова\"]],1,[6,0],[\"dd.MM.y\",\"d MMM y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"не число\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"MDL\",\"L\",\"молдавский лей\",{\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"MDL\":[\"L\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUB\":[\"₽\"],\"RUR\":[\"р.\"],\"THB\":[\"฿\"],\"TMT\":[\"ТМТ\"],\"TWD\":[\"NT$\"],\"UAH\":[\"₴\"],\"XXX\":[\"XXXX\"]},\"ltr\", plural];\n"]}͓mx$0&o%o=M	;QAClB
:
&(\
Kgp	;QAC7FQQ

`#u\@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKp
7UAAU,EAAC,KAAK

F
q
WAAWEAAC,KAAK,EAAC,OAAO"YAAY,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW	$OAAO	`
oBAAoB,EAAC,cAAc	G
UAAU,EAAC,gBAAg=
KAAKQ4AiBAAiB,E(
(F((((((((
RFi === 1 && v === 0 !(v === 0) || (n === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 19)))\n    return 3;\nreturn 5;\n}\n\no-MD\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"D\",\"L\",\"Ma\",\"Mi\",\"J\",\"V\",\"S\"],[\"Dum\",\"Lun\",\"Mar\",\"Mie\",\"Joi\",\"Vin\",\"Sâm\"],[\"duminică\",\"luni\",\"marți\",\"miercuri\",\"joi\",\"vineri\",\"sâmbătă\"],[\"Du\",\"Lu\",\"Ma\",\"Mi\",\"Jo\",\"Vi\",\"Sâ\"]],u,[[\"I\",\"F\",\"M\",\"A\",\"M\",\"I\",\"I\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"ian.\",\"feb.\",\"mar.\",\"apr.\",\"mai\",\"iun.\",\"iul.\",\"aug.\",\"sept.\",\"oct.\",\"nov.\",\"dec.\"],[\"ianuarie\",\"februarie\",\"martie\",\"aprilie\",\"mai\",\"iunie\",\"iulie\",\"august\",\"septembrie\",\"octombrie\",\"noiembrie\",\"decembrie\"]],u,[[\"î.Hr.\",\"d.Hr..\"],u,[\"înainte de Hristos\",\"după Hristos# \",\"d MMMM y\",\"EEEE, d MMMM yq\.:NaNPleu moldovenesc\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"EUR\":[u,\"\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MDL+\":[\"L\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$aTWD\":[u,\"NT$\"],\"USD\":[u,\"$\"],\"VND\":[u,\"₫\"],\"XCD\":[u,\"$\"]},\"ltr\", plural];\n"]}UjxV
&3fr-CF!fr-CF@!EAAE,CAAC,GAAG,QAAQ,CAAC$.sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE18v-	GAAG,OAAOOKAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChzR4\

07.
.
VOAAOQAAQOAAO,EAAC,OAAO882uMAAM,EAAC,OAAO
6SAAS,EAAC,MAAM,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU,EAAC,UAAUQ
CAAC,WAAW,EAAC,WAAW(oBAAoBQ
u2SAAS,EAAC,UAAU,EAAC,aAAaL
kBAAkB

q	q	"q	q	Jq	q	q	7q	p
(Jq	q		q	q	7p
p
p
PJKAAK$p
q	q	Jq	7p
PJq	q	q	Jq	p
q	q	p
FMAAM;
, e = parseInt(e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 &1& v === 0)) || !(e >= 0 && e <= 5))\n    return 4g%fr-CF\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JJ\",\"J%Gjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août4"éc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\"O pM4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" XAF\",\"FCFA\",\"franc CFA (BEAC)\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\	COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"]4MF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"%TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$!\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plur	j#fxR 33B%B?OAAO,EAAC,mBAAmB,EA
@
(B	BOF\",\"F CEAO-GxN 33NC$NC@WAAW,EA
@
(B	NCPF\",\"FCFP\",\"franc CFP̧_$x3$it-VA!it-VA@O	<s
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1QAAQ,EAAC,SAAS
	QAAQ,CAAC6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKPP2
`KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1#6OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQLeAAe,EAAC,aAAaPP
K
2
CAAC,EAAC,SAAS@QAAQ)oEAAC,MAAM,E	@




(
(
(
(
(




(
,1 && v === 02(it-VA\",[[\"m.\",\"p.\"],[\"AM\",\"PM\"]"G\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mer\",\"gio\",\"ven\",\"sab\"],[\"domenica\",\"lunedì\",\"martedì\",\"mercoledì\",\"giovedì\",\"venerdì\",\"sabato\"],[\"dom\",\"lun\",\"mar\",\"mer\",\"gio\",\"ven\",\"sab\"]],u,[[\"G\",\"F\",\"M\",\"A\",G\",\"L%gen\",\"feb\",\"mar\",\"apr\",\"mag\",\"giu\",\"lug\",\"ago\",\"set\",\"ott\",\"nov\",\"dic\"],[\"gennaio\",\"febbraio\",\"marzo\",\"aprile\",\"maggio\",\"giugno\",\"luglio\",\"agosto\",\"settembre\",\"ottobre\",\"novembre\",\"dicembre\"]],u,[[\"aC\",\"d9C\"],[\"a.C.\",\"d.C.\"],[\"avanti Cristo\",\"dopo Cristo~p#, {0}\",u,\"{1} {0}\",u],[\",\",\".8] NEUR\",\"€\",\"euro\",{\"BRL\":[u,\"R$\"],\"BYN\":[u,\"Br\"],\"EGP\":[u,\"£EmNR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NOK\":[u,\"NKr\"],\"THB\":[\"฿\"],\"TWD\":[u,\"NT94u,\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}(SAx03en-CC!en-CC@!
CAAC;IAEjG/<_O	<<F
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1ECAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU?
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1#	
QAAQL_O	CAAC,eAAe,EAAC,aAAaPP
K
gBAAgBB
CAAC,EAAC,cAAc@QAAQ,EAAC,WAAW,E1o%	K*;\n\nif (i === 1 && v === 0)\n    return 1%en-CC\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],.[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"SVJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"B,C\",\"AD\"],[\"Before Christ\",\"Anno Domini~9,M(, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",8]%\",\"¤#,##0.00\",\"#E0\"],\"AUD\",\"$\",\"Australian Dollar\",{\"AUD\":[\"$\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}
P\ x<3en-LC!en-LC@!
CAAC;IAEjG/<_O	<<F
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1ECAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU?
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1#	
QAAQL_O	CAAC,eAAe,EAAC,aAAaPP
K
:gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBCAAC,EAAC,cAAc@QAAQ,EAAC,WAAW,E1oEAAC,uBAAuB,EA
@
(*;\n\nif (i === 1 && v === 0)\n    return 1%en-LC\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],.[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"SVJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"B,C\",\"AD\"],[\"Before Christ\",\"Anno Domini~9, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",\",\"=X%\",\"¤#,##0.00\",\"#E0\"],\"XCD\",\"$\",\"East Caribbean Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"],\"XCD\":[\"$\"]},\"ltr\", plural];\n"]}iRx`3'es-EA!es-EA@;QACP5AP
P_
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1CAAC,OAAO,EAAC,SAAS,E1"5,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWP5AiBAAiB,EAAC,mBAAmBPP
K&QAAQ,EAAC,SAAS,EAAC,oBAAoB,EAAC,0BAA0BSAAS,EAAC,WAAW,EAAC,gBAAgBPPÓoEAAC,MAAM,E	"{F


(
#EAAEP
(
(
(
(
(
(
(
(
(
(

AEAAE{EAAE,n,es-EA\",[[\"a. m.\",\"p. m.!X\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoldes\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],u,[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMdMM 'de' y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss (zzzz)\"],[\"{1}, {0}\",u,u,u],[\",\",\".88EUR\",\"€\",\"euro\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"RLJCAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"EGP\":[],\"ESP\":[\"₧\"],\"GBP\":[ul!LS\":[u,\"₪\"],\"INR\":[u,\"₹-RW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[uhON\":[u,\"L\"],\"THB\":[\"฿*#LUS$\",\"$\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}< xe3.es-EC!es-EC@;QACP5AP
P_
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5oF
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5o
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1CAAC,OAAO,EAAC,SAAS,E1"5,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWP5AiBAAiB,EAAC,mBAAmBPP
K&QAAQ,EAAC,SAAS,EAAC,oBAAoB,EAAC,0BAA0BB
FsBAAsB,E1oEAAC,sBAAsB,E	"{F


(
(
(


(
(
(
(
(
(
(
(
(
(








#EAAE{EAAE,n,es-EC\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]]2om\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\"G,\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de'F, {0}\",u],[\",\",\".8e¤#,##0.00;¤-#,##0.00\",\"#E0\"],\"USD\",\"$\",\"dólar estadounidense\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р`hCAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[ul!LS\":[u,\"₪\"],\"INR\":[u,\"₹-RW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[uh4ON\":[u,\"L\"],\"SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£*eVEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}J%iux`3'es-IC!es-IC@;QACP5AP
P_
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1CAAC,OAAO,EAAC,SAAS,E1"5,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWP5AiBAAiB,EAAC,mBAAmBPP
K&QAAQ,EAAC,SAAS,EAAC,oBAAoB,EAAC,0BAA0BSAAS,EAAC,WAAW,EAAC,gBAAgBPPÓoEAAC,MAAM,E	"{F


(
#EAAEP
(
(
(
(
(
(
(
(
(
(

AEAAE{EAAE,n,es-IC\",[[\"a. m.\",\"p. m.!X\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoldes\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],u,[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMdMM 'de' y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss (zzzz)\"],[\"{1}, {0}\",u,u,u],[\",\",\".88EUR\",\"€\",\"euro\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"RLJCAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"EGP\":[],\"ESP\":[\"₧\"],\"GBP\":[ul!LS\":[u,\"₪\"],\"INR\":[u,\"₹-RW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[uhON\":[u,\"L\"],\"THB\":[\"฿*#LUS$\",\"$\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}7#x(3.es-PA!es-PA@;QACP5AP
P_
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5oF
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5o
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1CAAC,OAAO,EAAC,SAAS,E1"5,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWP5AiBAAiB,EAAC,mBAAmBPP
K
PSAAS,EAAC,oBAAoB,EAAC,0BAA0B,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBFWAAW,E1KAAK,EAAC,iBAAiB,E	"{F


(
(
(


(
(
(
(
(
(
(
F
(
(






(


#EAAE{EAAE,n,es-PA\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]]2om\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\"G,\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"MM/dd/yy\",\"MM/dd/y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' [MMMM 'de' y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u],[\".\",\",8e\¤#,##0.00\",\"#E0\"],\"PAB\",\"B/.\",\"balboa panameño\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"RLhCAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[ul!LS\":[u,\"₪\"],\"INR\":[u,\"₹CRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PAB\":[\"B/.l4ON\":[u,\"L\"],\"SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£*!pu,\"$\"],\"VEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}Ħ@
x|3$a-A#a-A?	CAAC;IAE7/<_
%(_PQAAQ,EAAC,QAAQP
O2PP2
QAAQa6IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ:
CAAC,OAAO,EAAC,QAAQaIAAI,EAAC,KAAKQAAQ,EAAC,QAAQ,E1_A2OAAO,EAAC,QAAQaIAAI,EAAC,KAAKQAAQ,EAAC,QAAQ,E12	CAAC,cAAc,EAAC,QAAQPP
KOAAO
SAAS,EAAC,aAAa,EAAC,gBAAgBCAAC,EAAC,eAAe@Bw(OAAOA0
QAAQ)oEAAC,kBAAkB,E	


xFWAAW;\n\nif (i === 0 || n,#a-AF\",[[\"ق\",\"ب\"],[\"ق.ظ.\",\"ب.ظ.\"],[\"قبل‌ازظهر\",\"بعدازظهر\"]],u,[[\"ی\",\"د\",\"س\",\"چ\",\"پ\",\"ج\",\"ش\"],[\"یکشنبه\",\"دوشنبه\",\"سه‌شنبه\",\"چهارشنبه\",\"پنجشنبه\",\"جمع\",\"شنبه\"],u,[\"۱ش\",\"۲ش\",\"۳ش\",\"۴ش\",\"۵ش\",\"ج\",\"ش\"]],u,[[\"ج\",\"ف\",\"م\",\"ا\",\"م\",\"ج\",\"ج\",\"ا\",\"س\",\"ا\",\"ن\",\"د\"],[\"جنو\",\"فبروری\",\"مارچ\",\"اپریل\",\"می\",\"جون\",\"جول\",\"اگست\",\"سپتمبر\",\"اکتوبر\",\"نومبر\",\"دسم\"],[\"جنوری\",\"فبروری\",\"مارچ\",\"اپریل\",\"می\",\"جون\",\"جولای\",\"اگست\",\"سپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"]],[[\"ج\",\"ف\",\"م\",\"ا\",\"م\",\"ج\",\"ج\",\"ا\",\"س\",\"ا\",\"ن\",\"د\"],[\"جنوری\",\"فبروری\",\"ماچ\",\"اپریل\",\"می\",\"جون\",\"جولای\",\"اگست\",\"سپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمر\"],u],[[\"ق\",\"م\"],[\"ق.م.\",\"م.\"],[\"قبل از میلاد\",\"میلادی\"]],6,[4,5],[\"y/M/d\",\"d MMM y\",\#:mm\",\"H:mm:ss\",\"H:mm:ss (z)\",\"H:mm:ss (zzzz)\"],[\"{1}،‏ {0}\",u,\"{1}، ساعت {0}\",u],[\".\",\",\",\";\",\"%\",\"‎+\",\"‎−P"
ناعددu _%\",\"¤ #,##0.00\",\"#E0\"],\"AFN\",\"؋\",\"افغانی افغانستان\",{\"AFN\":[\"؋MBNY\":[\"¥CN\",\"¥\"],\"HKD\":[\"$HK\",\"$\"],\"IRR\":[\"ریال[+^THB\":[\"฿\"],\"XCD\":[\"$EC\",\"$\"],\"XOF\":[\"فرانک CFA\"]},\"rtl\", plural];\n"]}~|x} 33E%E@4BAA4BoEAAC,MAAM,EA
@
(C	E/MM/yZ 'h' mm 'min' ss 's'EUR\",\"€\",\"eurof('6"xo3,CA$CA@_KWPP
FQAAQa$?
wBAAwB,EAAC,0BAA0B,EAAC,6BAA6BoEAAC,iBAAiB,E	MAAMA$

#	AEAAEPMAAMA)	P{s	#{MAAM.{nMAAML

MAAM.{EAAE{EAAE,EAAC,KAAK,EAAC,EAAEDCA\",[[\"a\",\"p\"],[\"a.m.\",\"p.m.\"],u],[[\"a.m.\",\"p.m.\"],u,u]k0,[6,0],[\"y-MM-dd4Z 'h' mm\",\"HH 'h' mm 'min' ss 's'\",\"HH 'h' mm 'min' ss 's' z\",\"HH 'h' mm 'min' ss 's'@ 8/CAD\",\"$\",\"dollar canadien\",{\"AUD\":[\"$  YN\":[u,\"Br\"],\"CAD\":[14EL\":[],\"HKD\":[\"$ HK\"1WLS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"ITL\":[\"₤IT\"],\"KRW\":[u,\"₩\"],\"LBP\":[u&u,\"$\"],\"NZD\":[\"$ dZGD\":[\"$ SG 1l US\",\"$\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[],\"XPF\":[]},\"ltr\", plural];\n"]}N
 x~ 33CD$CD@IAAI,EAAC,iBAAiB,EA
@
(操F
-(	CDCDF\",\"FC\",\"franc congolais
DF\":[\"FCBrN*W-x` 33GA$GA@MAAM,EAAC,kBAAkB,EA
@
(B	GAAF\",\"FCFA\",\"franc CFA (BEACEEx 34MA$MA@7F(]KAAK,EAAC,iBAAiB,EA
@
(B	MA*[\"a.m.\",\"p.m.\"]],[[\"AM\",\"PM\"],u,u]H..\",\"fév.\",\"mar.\",\"avr.\",\"mai\",\"jui.c.8MAD\",\"MAD\",\"dirham marocainH{xR 33MC$MC@oEAAC,MAAM,EA
@
(B	MCEUR\",\"€\",\"euro'awx3ga-GB!ga-GB@	CAAC;IAEdP(;QACP$zC$EAAE,CAAC;QAC1CQ\PP
PscAAc,EAAC,UAAU,WAAW,EAAC,WAAW,EAAC,aAAa?
5]
5#QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,WAAW,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAC,cAAc,EAAC,kBAAkB,EAAC,SAAS,EAAC,SAAS,CAAC,CAAC,
P(eAAe,EAAC,aAAaPP
K
<PPnOAAOA0
QAAQ,EAAC,WAAW,E1oEAAC,gBAAgB,E	@#	EAAE
;\n\nif (n,n === 2)\n    return 2;\nif (n === Math.floor(n) && (n >= 3 && n <= 6))\n    return 3;\nif (n === Math.floor(n) && (n >= 7 && n <= 105ga-GB\",[[\"r.n.\",\"i.n.!C\",\"D\",\"A\",\"S\"],[\"Domh\",\"Luan\",\"Máirt\",\"Céad\",\"Déar\",\"Aoine\",\"Sath\"],[\"Dé Domhnaigh\",\"Dé Luain\",\"Dé Máirt\",\"Dé Céadaoin\",\"Déardaoin\",\"Dé hAoine\",\"Dé Sathairn\"],[\"Do\",\"Lu\",\"Má\",\"Cé\",\"Dé\",\"Ao\",\"Sa\"]],u,[[\"E\",\"F\",\"M\",\"A\",\"B\",\"M\",\"I\",\"L\",\"M\",\"D\",\"S\",\"N\"],[\"Ean\",\"Feabh\",\"Márta\",\"Aib\",\"Beal\",\"Meith\",\"Iúil\",\"Lún\",\"MFómh\",\"DFómh\",\"Samh\",\"Noll\"],[\"Eanáir\",\"Feabhra\",\"Márta\",\"Aibreán\",\"Bealtaine\",\"Meitheamh\",\"Iúil\",\"Lúnasa\",\"Meán Fómhair\",\"Deireadh Fómhair\",\"Samhain\",\"Nollaig\"]],u,[[\"RC\",\")AD\"],u,[\"Roimh Chríost\",\"Anno Domini~u,u,u],[\".\",\",8;uimhu %\",\"¤#,##0.00\",\"#E0\"],\"GBP\",\"£\",\"Punt Steirling\",{\"RUR\":[u,\"р.\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XXX\":[]},\"ltr\", plural];\n"]}Vxb3ms-ID!ms-ID@	CAAC;IAEd=_O
5<s
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E16OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO?
`KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1#KAAKKAAKF\	KP
PP
K
iBAAiBB
CAAC,EAAC,SAAS@QAAQ,EAAC,WAAW,E1IAAI,EAAC,kBAAkB,E	@
(F
(
F
;\n$ms-ID\",[[\"a\",\"p\"],[\"PG\",\"PTG\"],u],u,[[\"A\",\"I\",\"S\",\"R\",\"K\",\"J\",\"S\"],[\"Ahd\",\"Isn\",\"Sel\",\"Rab\",\"Kha\",\"Jum\",\"Sab\"],[\"Ahad\",\"Isnin\",\"Selasa\",\"Rabu\",\"Khamis\",\"Jumaat\",\"Sabtu\"],[\"Ah\",\"Is\",\"Se\",\"Ra\",\"Kh\",\"Ju\",\"S6OJan\",\"Feb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ogo\",\"Sep\",\"Okt\",\"Nov\",\"Dis\"],[\"Januari\",\"Februari\",\"Mac\",\"April\",\"Mei\",\"Jun\",\"Julai\",\"Ogos\",\"September\",\"Oktober\",\"November\",\"Disember\"]],u,[[\"S.M.\",\"TM\"],u,u],0,[6,0],[\"dd/MM/y#, dd MMMM y\"],[\"HH.mm\",\"HH.mm.ss\",\"HH.mm.ss z\",\"HH.mm.ss zzzz\"],[\"{1}, {0}\",u,\"{1} {0}\",u],[\",\",\".\",\";\",\"%\E5.{A%\",\"¤#,##0.00\",\"#E0\"],\"IDR\",\"Rp\",\"Rupiah Indonesia\",{QZCAD\":[u,\"$\"],\"IDR\":[\"Rp\"],\"JPY\":[\"JP¥\",\"¥\"],\"MXN\":[u,\"$\"],\"MYR\":[\"RMl9TWD\":[\"NT$\"],\"USD\":[u,\"$\"]},\"ltr\", plural];\n"]}T
xL3 nl-BE!nl-BE@!
CAAC;IAEjG/<\PP
P_OF	CAAC,QAAQ,E"@(]#(	
UAAUL\,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,eAAe,EAAC,aAAaPP
KQAAQ<CAAC,EAAC,cAAc@QAAQ,EAAC,wBAAwB,E1oEAAC,MAAM,EA
@

IAAIA~{Po#	
#EAAE,EAAC,KAAK,EAAC,EAAE*;\n\nif (i === 1 && v === 0)\n    return 1%nl-BE\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"Z\",\"M\",\"D\",\"W\",\"D\",\"V\",\"Z\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"zY.\",\"feb.\",\"mrt.\",\"apr.\",\"mei\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"v.C.\"S,\"n.C.\"],[\"v.Chr.\",\"n.Chr.\"],[\"voor Christus\",\"na Christus\"]],1,[6,0],[\"|u,\"{1} 'om!.8]T%\",\"¤ #,##0.00;¤ -#,##0.00\",\"#E0\"],\"EUR\",\"€\",\"Euro\",{\"AUD\":[\"AU$G CCAD\":[\"C$\",\"$\"],\"FJD\":[\"FJ$\",\"$\"],\"JPY\":[\"JP¥\",\"¥lUR\":[u,\"р.\"],\"SBD\":[\"SI$\",\"$\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XPF\":[],\"XXX\":[]},\"ltr\", plural];\n"]}ʑcyfxi3"
sr-Latn-BA!
sr-Latn-BA@	CAAC;IAEd)YAAY	.aAAa,EAAC,UAAU1aAAa,EAAC,UAAU1F
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1<
QAAQOAAO5oF
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1<
QAAQOAAO5o
`KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1	CAAC,QAAQKAAK,EAAC,KAAK,EAAC,QAAQLQAAQCAAC,EAAC,CAAC,gBAAgB.P
K(

kBAAkBLPPQAAQ)IAAI,EAAC,0CAA0C,E	"{


(
(
(
K#
;\n$
sr-Latn-BA[\"prije podne\",\"po podne\"],u],[[\"a\",\"p\"],[\"prije podne\",\"po podne\"],u],[[\"n\",\"p\",\"u\",\"s\",\"č\",\"p\",\"s\"],[\"ned\",\"pon\",\"uto\",\"sre\",\"čet\",\"pet\",\"sub\"],[\"nedjelja\",\"ponedjeljak\",\"utorak\",\"srijeda\",\"četvrtak\",\"petak\",\"subota\"],[\"ne\",\"po\",\"ut\",\"sr\",\"če\",\"pe\",\"su\"]],[[\"n\",\"p\",\"u\",\"s\",\"č\",\"p\",\"s\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"],[\"nedjelja\",\"ponedjeljak\",\"utorak\",\"srijeda\",\"četvrtak\",\"petak\",\"subota\"],[\"ne\",\"po\",\"ut\",\"sr\",\"če\",\"pe\",\"su\"]],[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"maj\",\"jun\",\"jul\",\"avg\",\"sep\",\"okt\",\"nov\",\"dec\"],[\"januar\",\"februar\",\"mart\",\"april\",\"maj\",\"jun\",\"jul\",\"avgust\",\"septembar\",\"oktobar\",\"novembar\",\"decembar\"]],u,[[\"p.n.e.\",\"n.e.\"],[\"p. n. e.\",\"n. e.\"],[\"prije nove ere\",\"nove ere\"]],1,[6,0],[\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.\",\"EEEE, d. MMMM y.Ku,u,u],[\",\",\".8] BAM\",\"KM\",\"Bosanskohercegovačka konvertibilna marka\",{\"AUD\":[u,\"$\"],\"BAM\":[\"KM\"],\"BYN\":[u,\"r.\"],\"GEL\":[u,\"%ლ\"],\"KRW\":[u,\"₩\"],\"NZD\":[uhSTWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}yI-
Kx ]BB$BB@aAAa,EAAC,gBAAgBAkBAAkKBB	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a&BBD\",\"$\",\"Barbadian Dollar\",{\"BBU5e1}xVA%A@:MAAM,EAAC,MAAMa+MAAM>MAAM,EAAC,MAAMa+A=P
WAAW,EAAC,iBAAiB,CAAC,EAAC,CaAAa,EAAC,gBAAgBAiBAAiKRA\",[[\"am\",\"pm\"],[\"a.m.\",\"p.m.\"],u],[[\"a.m.\",\"pm\"],[\"a.m.\",\"p.m.\"]#
u0,[6,0],[\"y-MM-dd\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz%CAD\",\"$\",\"Canadian Dollar\",{\"CAUw6xR GB$GB@eAAeLMGB	 GBP\",\"£\",\"British Pound\",{IYxBE$BE@UAAU,EAAC,UAAU&"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCYAAY)MAAM/%BE	y\",\"d..HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss0,\",\".Hc.#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Euro5},\"ltr\", plural];\n"]}OtxDE$DE@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCSAAS,EAAC,YAAY)MAAM/%DE	.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss0,\",\".H#·m86 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Euro5},\"ltr\", plural];\n"]}N	x GD$GD@	GD	Uz?y[xg,de$de=:7P=PQAAQYAAY,EAAC,SAAS,EAAC,SAAS<Q&A=:(
I
QAAQYAAY,EAAC,SAAS,EAAC,SAAS<Q&





OAAOMAAM,CAAC,EAAC,CMAAMo_7`# MAAMo_SAAS,EAAC,SAASK++

SAAS,EAAC,WAAW,EAAC,iBAAiSAASQIAAI,CLE(_
(_
IAAI,CL
MAAM,CLIAAI,CL
#_
}
MAAM,CL
IAAI,CL
}
}
IAAI,CL
MAAM,CAAC,EAAC,KAAK,EAAC,EAAEOn#(EAAEO
1de-BE\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]]
R.\",\"Feb.\",\"März\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sept.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Januar\",\"Februar\-",\"März\",\"April\",\"Mai\",\"Juni\",\"Julik
zember\"]]
`är\",\"Apr\",\"Mail _\",\"Okt\",\"Nov\",\"Dez\"],[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Julikezember\"]],[[\"v. Chr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d.\um8·I8 :ATS\":[\"öS\"],\"AUD\":[\"AU$\",\"$\"],\"BGM\":[\"BGK\"],\"BGO\":[\"BGJ\"],\"BYN\":[u,\"р.\"],\"CUC\":[u,\"Cub$\"],\"DEM\":[\"DM\"],\"FKP\":[u,\"Fl£\"],\"GHS\":[u,\"₵\"],\"GNF\":[u,\"F.G.\"],\"KMF\":[u,\"FC\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"RWF\":[u,\"F.Rw\"],\"SYP\":[],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XXX\":[],\"ZMW\":[u,\"K\"]},\"ltr\", plural];\n"]}47x_A%A?]`#,
SAAS&aAAa,EAAC,gBAAgBAؓ
#`
6BAA6B,EAAC,EAAE&4AE\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM	6,[6,0],[\"dd/MM/y\",\".2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a0.\",\",$c_¤#,##0.00\",\"#E0\"],\"AED\",\"AED\",\"United Arab Emirates Dirham\",{},\"ltr\", plural];\n"]}jfXpx NA$NA@
SAAS&aAAa,EAAC,gBAAgBAؓ
#`
oBAAoBJBn\NA	\",\".2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a0.\",\",$c:¤#,##0.00\",\"#E0\"],\"ZAR\",\"ZAR\",\"South African Rand 
NAD\":[\"$3H1<wx:sw-CD!sw-CD@::_+SAASHK(7`#-QAAQOAAO,EAAC,QAAQ,EAAC,UAAUSAAS@$:(iBAAiB,EAAC,iBAAiB@$++

SAASX
+
dUIAAI,EAAC,kBAAkBJ
IAAI,CLIAAI,CLE(_
}n#(_
(_"9sw-CD\",[[\"am\",\"pm\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM	9ZJumapili\",\"Jumatatu\",\"Jumanne\",\"Jumatano\",\"Alhamisi\",\"Ijumaa\",\"Jumamosi\"],u,u
dc\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Machi\",\"Aprili\",\"Mei\",\"Juni\",\"Julai\",\"Agosti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Desemba\"]],u,[[\"KK\",\"BK\"],u,[\"Kabla ya Kristo\",-\"Baada ya Kristo\"]],1,[6,0],[\"dd/MM/y\",\"k
 {0}\",u,uqb¤ #,##0.00\",\"#E0\"],\"CDF\",\"FC\",\"Faranga ya Kongo\",{\"BYN\":[u,\"р.\"],\"CDF\":[\"FC\"],VKES\":[\"Ksh\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"TZS\":[\"TSh35#mO[xaf$af=	CAAC;IAEdPoL_K(=P
*
WAAWB$LAF--=











"MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,WAAW$UAAULMAAM,EAAC,MAAMU
WAAWP
{GAAG,EAAC,sBAAsBIAAI,CP
r
r<
r
%(*r-;\n\nif (n === 1	4af-NA\",[[\"v\",\"n\"],[\"vm.\",\"nm.\"],u],u,[[\"S\",\"M\",\"D\",\"W\",\"D\",\"V\",\"S\"],[\"So.\",\"Ma.\",\"Di.\",\"Wo.\",\"Do.\",\"Vr.\",\"Sa.\"],[\"Sondag\",\"Maandag\",\"Dinsdag\",\"Woensdag\",\"Donderdag\",\"Vrydag\",\"Saterdag\"],[\"So.\",\"Ma.\",%\"Di.\",\"Wo.\",\"Do.\",\"Vr.\",\"Sa.X.\",\"Feb.\",\"Mrt.\",\"Apr.\",\"Mei\",\"Jun.\",\"Jul.\",\"Aug.\",\"Sep.\",\"Okt.\",\"Nov.\",\"Des.\"],[\"Januarie\",\"FebruariSe\",\"Maart\",\"April\",\"Mei\",\"Junie\",\"Julie\",\"Augustus\",\"September\",\"Ok0sember\"]],u,[[\"v.C.\",\"n.C.\"],u,[\"voor Christus\",\"na Christus\"]],1,[6,0],[\"y-MM-dd\",\"dd MMM y\",\"dd MMMM y\",\"EEEE dP {0}\",u,u,u],[\",\",\" HDR\",\"Suid-Afrikaanse rand\",{\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],MXN\":[u,\"$PHP\":[u,\"₱\"],\"RON\":[u,\"leu\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[u,\"$\"],\"ZAR\":[\"R\"]},\"ltr\", plural];\n"]}x1Rax*qu-EC!qu-EC@	CAAC;IAEd=MAAM,EAAC,MAAM0/PZA
=V"WAAW,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQQ!/iIAAI,E""OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,OAAOnV"WAAW,EAAC,SAAS,EAAC,WAAW,EAAC,WAAW /MAAM,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,cAAc,EAAC,eAAe /0
0OiBAAirWSAASw)GAAG,EAAC,iBAAi-o-o
-
`;\n	$qu-EC\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"D\",\"L\",\"M\",\"X\",\"J\",\"V\",\"S\"],[\"Dom\",\"Lun\",\"Mar\",\"Mié\",\"Jue\",\"Vie\",\"Sab\"],[\"Domingo\",\"Lunes\",\"Martes\",\"Miércoles\",\"Jueves\",\"Viernes\",\"Sábado\"],[\"Dom\",\"Lun\",\"Mar\",\"Mié\",\"Jue\",\"Vie\",\"Sab\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"Ene\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Jul\",\"Ago\",\"Set\",\"Oct\",\"Nov\",\"Dic\"],[\"Enero\",\"Febrero\",\"Marzo\",\"Abril\",\"Mayo\",\"Junio\",\"Julio\",\"Agosto\",\"Setiembre\",\"Octubre\",\"Noviembre\",\"Diciembre\"]],u,[[\"a.d.\",\"dC\"],[\"a.d.\",\"*d.C.\"],[\"ñawpa cristu\",\"chanta cristuRA,O#\"{0} {1}\",\"{1} {0}\"],[\".\",\",] N USD\",\"$\",\"Dólar Americano\",{\"BBD\":[\"BBG\",\"$\"],\"BMD\":[\"DBM\",\"$\"],\"BZD\":[\"DBZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"GHS\":[u,\"GH!Cޥ/9x! 	eAAe,EAAEh2];\n"]}g
x).&ca-AD!ca-AD@!	CAAC;IAEj lB:Fp[FWaQAAQ,EAAC,WAAW,EAAC,UAAUPQ'#:A(]
k
k
fSAAS,E0
pSAAS,CAAC,EAAC,CAAC,UAAU,EAAC,WAAW,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS,EAAC,aAAa,EAAC,WAAW,EAAC,aAAa,EA	AC,aAAa,C`:A(]
k
	CAAC,MAAMMAAM,EAAC,MAAM,EAAC,MAAM
$MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CMAAMMAAM,EAAC,QAAQ,E!aUAAU,C`:k
6gBAAgB,EAAC,kBAAkRDeAAe,EAAC,qBAAqB,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,gBAAgBk
oBAAoB!JA#(\
YAAY
GAAG,EAAC,MAAM,E1	O

			6
PMAAM/	2=*;\n\nif (i === 1 && v === 0)\n    return 1%ca-AD	(g\",\"dl\",\"dt\",\"dc\",\"dj\",\"dv\",\"ds\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"],[\"diumenge\",\"dilluns\",\"dimarts\",\"dimecres\",\"dijous\",\"divendres\",\"dissabte\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"]],u,[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"de gen.\",\"de febr.\",\"de març\",\"d’abr.\",\"de maig\",\"de juny\",\"de jul.\",\"d’ag.\",\"de set.\",\"d’oct.\",\"de nov.\",\"de des.\"],[\"de gener\",\"de febrer\",\"de març\",\"d’abril\",\"de maig\",\"de juny\",\"de juliol\",\"d’agost\",\"de setembre\",\"d’octubre\",\"de novembre\",\"de desembre\"]],[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"gen.\",\"febr.\",\"març\",\"abr.\",\"maig\",\"juny\",\"jul.\",\"ag.\",\"set.\",\"oct.\",\"nov.\",\"des.\"],[\"gener\",\"febrer\",\"març\",\"abril\",\"maig\",\"juny\",\"juliol\",\"agost\",\"setembre\",\"octubre\",\"novembre\",\"desembre\"]],[[\"aC\",\"dC\"]*,u,[\"abans de Crist\",\"després de Crist)HMMMM 'de' y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss (zzzz)\"],[0\"{1}, 'a' 'les'BqH%\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AUD\":[\"AU$\"h9kTHB\":[\"฿\"],\"USD\":[u,\"$\"],\"VEF\":[u,\"Bs F\"],\"XCD\":[u,\"$\"],\"XXX\":[]},\"ltr\", plural];\n"]}JtlE]x  	eAAe,EAAE25
];\n"]}	JExW$
ff-Latn-BF!
ff-Latn-BF@	CAAC;IAE7/("YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,SAAS)A

U
QAAQ,EAAC,UAAU,EAAC,WAAW,E:P'
OAAO$"OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQOAAOO$I

AP
U
~OAAO,EAAC,qBAAqB,EoN
*;\n\nif (i === 0 || i === 1)\n    return 1%ff-Latn-BF\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade5 Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM,e {0}\",u,u,u],[\",\",\" }}uXOF\",\"F CFA\",\"Mbuuɗu Seefaa BCEAO\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}o8x- 	eAAe,EAAE2export default [];\n"]}[:,x0/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    ANG: string[];
    AWG: string[];
    BBD: (string | undefined)[];
    BSD: (string | undefined)[];
    BYN: (string | undefined)[];
    HTG: string[];
    JPY: string[];
    MMK: string[];
    PAB: string[];
    PHP: (string | undefined)[];
    THB: string[];
    TTD: string[];
    USD: string[];
} | undefined)[];
export default _default;
%%\xs yBDTQ
BWP: never*KD#KRWQN5W 7    XXX: never[];
    ZAR: never[];
    ZMW: never[];
}b^ ^xf z(UD: string[];
    BTN: string[];
    ILSQKRW: string[];
    THB    XAF: never/_Sx$ z
MD: string)N5W8Jex J	zU M RLQBBZCADOPEGPGBPHKHRKQILSQINRQJMKGS: string[];
    KRWQMXNQNZN9TWU XC+1+Jxk yOBBD: string[];
    BMD: string[];
    BZD: string[];
    CAD: string[];
    GHSQPEN>1:w%Dx1 y!KES>EWD: string[];
    TZSJxG z
UD: string)KRW>1RONQRURQW     XXX: never/ QZx] y!DKKQHRKQISKQNOKQN!PLNQSEKQ2WD: string[];
    ZAR7WhxN <CAD: string[];
    FJD: string[];
    JPY: string[];
    SBD7P7,|Px y@DKK: never[];
    HRK: never[];
    ISK: never[];
    NOK: never)PLN: never[];
    SEK: never*    XXX: never/9&+_x' zU{2GHS: never[];
    LVL~x yRUB07JTox  6L+#xA 1CNY: string[];
    ILR: string[];
    JPY: string={Px yES>o+Xtx yID$No+VRx yTRY>o+agC>xE !PTE: string[];
    ROSYPTHB: string3*o+Jox hNL4;x yGEL|}Oox yJPYLJ(2x zZN|e9kSx EXstring[][] | {
    AUDBAM: string[];
    BRL!CADCNYGBPHKDHRK: string[];
    ILSMXNZD!RSD: string.3XCD
XPF: neverg/5xox yQk+/Z9x{ )CSK: string[];
    CZK: string[];
    ILSINRR!RURI"    VNDXEU: string[];
    XXX: neverg/#Cx EEK16"k+Wdix y!ESP: string<6`z
Px  const _default: neveryFx y4MUR!6`0pxj ~BRLCADEURGBPINR1KRWMXNZD!TWDUSDVNDk+l*ix6 FJD: string    XOF: string[];
    ZMK_7a.x9	~BDT: never[];
    BRL!CADCNYGBPHKD'ILS: never[];
    INR: never[];
    JPYKHR: never[];
    KRW&LAK: never[];
    MNT: never[];
    MXNZD"LPYGRUBTWDUSD'VND: never[];
    XAF: never[];
    XCDXOF: never[];
    XPF: neverg/tVvx y46"k+H	Px. y!CAD1MXMYR1Ik+X6Ux y!k+Hwx zFN|@k+;ox yIDR_7'5x2 FJD1NZD: string[];
    SBDTOPLJtvx yV
KR: string.*k+	#x' yJPY: string.\    UZS_7#6Yx& yUUSD: string[];
    UZS_7 wUx y!4USD: string//
xl y!GNF: string)NGN: string[];
    PGK: string[];
    PHP#XAF: string[];
    XOF: string/ u~x y!9}`:%x+ y!LAK1THB: string*+x_x yBIF: string+
*x$ yBBD: stringSOS}g
=x yETB#.+elcx CAD7HP:..+	FoxW yAUD: string[];
    BYN:./;
    CNH: string[];
    ETB: string[];
    JPY@Ux yJPY    ZMW
7|x" yCNY: string[];
    JPYJo0x "+3>hMx^ *ESP: string[];
    JPY: string[];
    KMF:.	;
    MXN1RUB:.,XCD:.-):x6 KZT: string[];
    LSL1RUB: string*++x& KHR: string[];
    LSLS+o4x C+.5
Qx  MNT1SEK:.(+~	 x KRf    XOF
7v:x8 y"ADMX!RO+ZAR07x yGHS#-:GM#x yTZSJJlEx yUGXJJ|_gx ~PLN: string<+
x( y#Y: string[];
    ILPS<+Lx y!4RO"<+	Pyx5 IDR: string[];
    INRy    XXX: never8/Vo=x yMZNJJ`n_x yNZK(	{x yJPY: string[];
}I	*&x yRUBJJMTHx y-    XDR07rx yTJS07IQIx V    XXX: never8/"	Ax" yCNY: string[];
    JPY07_
<k&x Mx" y!4RORUBN+є
sCx y!GRDSN+dWix yBWP#-N+esIx yBZD#-N+e@5x yGYD#-N+e>D[x yKY N+`  x yMVRN+h,U&x yMWKN+gOLx yMYRN+hJXrx yRWFN+hOx yGBP#SSPN+~EBx zNG#-N+]gx ySZLN+h`Yx yTT N+`M2x y-VUV: stringJ/
^`x y-WST: stringJ/
[x& y!4RORUR&@9	}Cx* yNLG: string[];
    RUBN+8|x y!CNYDRO@9	)xl ~!CNYGEL: string[];
    HKDLSNRJPYKRWNZD"%VNDN+($x yDZD#-N+eBJx CVE#-N+&tx' zTS: string[];
    AUDS}[*x* yKES: string[];
    TZSN+9cxZ zNG: string[];t9CAD: string[];
    FJDDRURSBD: stringB	PF: never8A'Lx  yRUB: string[];
}[
{x5 MZN1PTE: string[];
    RO5N+#?x9 4PTE: string[];
    ROSTN: string=N++0xV yBYN: string[];
    GEL!RORUB: stringMT
$AH0stringJ/lx^ y!GELKZT1RORUB: string[];
    RUR: stringMT
$AH0stringJ/kXEYx y!4PKRN+rx' y!MYR1SGD: string*N+JV9x) !RORURRY
N+-#5qx zFN#-N+]n-x yGB{^(	x 
RL"A!ESP: string[];
    EURFKPGBPMXNFRONSSPSYPTW)UYU: string[];
    UYW: string[];
    VEFVNXAF: never[];
    XC
XOF: never/fMmx. 

BZD: string[];
    CA(YKByCxZ 
Rs:RO: string[];
    MRU: string[];
    MXN: string[];
    NZ{!&z,x. 

PYG: string[];
    RONhYSu8x" zUD: string[];
    AWGC
\ix zSR=E
x  z4VEEON5+g
/x yIQD#;:HKRPx. yBBD: string[];
    ETB#SOS+ W`:x LUFe(`@y<Ox const _default: {}
$x zZN#o+]dIx_ yOBAM: string[];
    CZK: string[];
    PLN: string[];
    RSD: string[];
    TRY_+T 7x 1~BRL!CADCNYEURGBPHKDHRK: string[];
    ILSINRJPYKRWMXNZD!RURTWDUSDVNDXCDXPF: never[];
    XXX: never/:]x 	~string[];
    BBBM"SBYN: string[];
    BZ"UC!CUADOAFJFKAGYISK!JMKYLRMXN: string[];
    NA9DB: string[];
    SBSGTTUYU#string</\9
Ux Y~string[];
    BRL!&string[];
    CNY!EGA?string[];
    HKD1BL@ NZD: string[];
    PHA{"OA&string[];
    VN !38-
xC ! ?B
KD: string1J&string[];
    VN@+6\x4 ?B
OK: string1Jd	AF: neverJMԔx6 B?BPLN: string[];
    RON!_@+Idx 瓜@+Qx# ?BILS: stringk9Ǔ38ק8x ?!c!@+B	bx/ yCNY!ETB: string)USD: string</_m xB yBYN!BJPY: string[];
    PHAUSD: string[];
}MqxC B'AH: string[];
    UAK: string[];
    US>@+m&5x\ 	RLcEUR0BHUF: string[];
    ILSINR!cG4XC1{+g^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["af", [["v", "n"], ["vm.", "nm."], u], u, [["S", "M", "D", "W", "D", "V", "S"], ["So.", "Ma.", "Di.", "Wo.", "Do.", "Vr.", "Sa."], ["Sondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrydag", "Saterdag"], ["So.", "Ma.", "Di.", "Wo.", "Do.", "Vr.", "Sa."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan.", "Feb.", "Mrt.", "Apr.", "Mei", "Jun.", "Jul.", "Aug.", "Sep.", "Okt.", "Nov.", "Des."], ["Januarie", "Februarie", "Maart", "April", "Mei", "Junie", "Julie", "Augustus", "September", "Oktober", "November", "Desember"]], u, [["v.C.", "n.C."], u, ["voor Christus", "na Christus"]], 0, [6, 0], ["y-MM-dd", "dd MMM y", "dd MMMM y", "EEEE dd MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ZAR", "R", "Suid-Afrikaanse rand", { "BYN": [u, "р."], "CAD": [u, "$"], "JPY": ["JP¥", "¥"], "MXN": [u, "$"], "PHP": [u, "₱"], "RON": [u, "leu"], "THB": ["฿"], "TWD": ["NT$"], "USD": [u, "$"], "ZAR": ["R"] }, "ltr", plural];
//# sourceMappingURL=af.js.map1xz{"version":3,"file":"he.js","sourceRoot":"","sources":["he.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;\nif (i === 2 && v === 0)\n    return 2;\nif (v === 0 && (!(n >= 0 && n <= 10) && n % 10 === 0))\n    return 4;\nreturn 5;\n}\n\nexport default [\"he\",[[\"לפנה״צ\",\"אחה״צ\"],u,u],[[\"לפנה״צ\",\"אחה״צ\"],[\"AM\",\"PM\"],u],[[\"א׳\",\"ב׳\",\"ג׳\",\"ד׳\",\"ה׳\",\"ו׳\",\"ש׳\"],[\"יום א׳\",\"יום ב׳\",\"יום ג׳\",\"יום ד׳\",\"יום ה׳\",\"יום ו׳\",\"שבת\"],[\"יום ראשון\",\"יום שני\",\"יום שלישי\",\"יום רביעי\",\"יום חמישי\",\"יום שישי\",\"יום שבת\"],[\"א׳\",\"ב׳\",\"ג׳\",\"ד׳\",\"ה׳\",\"ו׳\",\"ש׳\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"ינו׳\",\"פבר׳\",\"מרץ\",\"אפר׳\",\"מאי\",\"יוני\",\"יולי\",\"אוג׳\",\"ספט׳\",\"אוק׳\",\"נוב׳\",\"דצמ׳\"],[\"ינואר\",\"פברואר\",\"מרץ\",\"אפריל\",\"מאי\",\"יוני\",\"יולי\",\"אוגוסט\",\"ספטמבר\",\"אוקטובר\",\"נובמבר\",\"דצמבר\"]],u,[[\"לפני\",\"אחריי\"],[\"לפנה״ס\",\"לספירה\"],[\"לפני הספירה\",\"לספירה\"]],0,[5,6],[\"d.M.y\",\"d בMMM y\",\"d בMMMM y\",\"EEEE, d בMMMM y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} בשעה {0}\",u],[\".\",\",\",\";\",\"%\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"‏#,##0.00 ¤;‏-#,##0.00 ¤\",\"#E0\"],\"ILS\",\"₪\",\"שקל חדש\",{\"BYN\":[u,\"р\"],\"CNY\":[\"‎CN¥‎\",\"¥\"],\"ILP\":[\"ל״י\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"rtl\", plural];\n"]}/Axm	"&ca-ES-valencia!ca-ES-valencia:nw(gBAAgB,EAAC,CAAC,CAAC,OAAO1
?P@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK
"SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQOCAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK?ANASAAS,EAAC,UAAU"SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,OAAOSAAS,EAAC,SAAS
"WAAW,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,SAAS,EAAC,aAAa,EAAC,WAAW,EAAC,aAAa,EAAC,aAAa?ANAMAAM,EAAC,OAAOA8=-#MAAM,EAAC,OAAOA
SAAS,EAAC,UAAU,EAAC,UAAU?
gBAAgB,EAAC,kBAAkB

SAAS,EAAC,eAAe,EAAC,qBAAq/0gBAAgB,CAAC,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,oBAAoBL(```2YAAY,E{GAAG,EAAC,MAAM,E?p/
H/
H/(/(/(/(/(/
MAAM=/#EAAEa"ca-ES-valencia\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"dg\",\"dl\",\"dt\",\"dc\",\"dj\",\"dv\",\"ds\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"],[\"diumenge\",\"dilluns\",\"dimarts\",\"dimecres\",\"dijous\",\"divendres\",\"dissabte\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"]],u,[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"de gen.\",\"de febr.\",\"de març\",\"d’abr.\",\"de maig\",\"de juny\",\"de jul.\",\"d’ag.\",\"de set.\",\"d’oct.\",\"de nov.\",\"de des.\"],[\"de gener\",\"de febrer\",\"de març\",\"d’abril\",\"de maig\",\"de juny\",\"de juliol\",\"d’agost\",\"de setembre\",\"d’octubre\",\"de novembre\",\"de desembre\"]],[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"gen.\",\"febr.\",\"març\",\"abr.\",\"maig\",\"juny\",\"jul.\",\"ag.\",\"set.\",\"oct.\",\"nov.\",\"des.\"],[\"gener\",\"febrer\",\"març\",\"abril\",\"maig\",\"juny\",\"juliol\",\"agost\",\"setembre\",\"octubre\",\"novembre\",\"desembre\"]],[[\"aC\",\"dC\"],u,[\"abans de Crist\",\"després de Crist\"]],1,[6,0],[\"d/M/yy\",\"d MM+M y\",\"d MMMM 'de' y\",\"EEEE, d MMMM 'de'4_(zzzz)\"],[\"{1} {0}\",\"{1}, {0}\",\"{1}, 'a' 'les' {0}\",u],[\",\",\".\",\";\",\"%\",\"+\",\"HL#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AUD\":[\"AU$\",\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$7\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"MXN\":[u,\"$',YUSD\":[u,\"$\"],\"VEF\":[u,\"Bs F\"],\"XCD\":[u,\"$\"],\"XXX\":[]},\"ltr\", plural];\n"]}գx"	af!af:]eAAe,C1#
YAAY,EAAC,YAAY$+#
MAAM,EAAC,KAAKOAAO,EAAC,CAAC,OAAO1OAAO1OAAO1OAAO	6export default [[[\"mn\",\"o\",\"m\",\"a\",\"n\"],[\"middernag\",\"die oggend\",\"die middag\",\"die aand\",\"die nag\"],u],[[\"mn\",\"o\",\"m\",\"a\",\"n\"],[\"middernag\",\"oggend\",\"middag\",\"aand\",\"nag\"],u],[\"00:00\",[\"05:00\",\"12:00\"],[\"12D:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}B@ZlxR&af#!afR	CAAC;IAEdP=IAAI,EAAC,CAAC,C
 A
F/

WAAW,EAAC,QAAQ~Z
-"OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,OAAOl#

eAAe,EAAC,aAAa $	0 w ,
|
YAAY,EAAC,eAAe
WAAW,EAAC,KAAK	GAAG,EAAC,sBAAsB,Eq7.	2.	F

KAAK	t	KAAK	Q}
;\n\nif (n === 1k4af\",[[\"v\",\"n\"],[\"vm.\",\"nm.\"],u],u,[[\"S\",\"M\",\"D\",\"W\",\"D\",\"V\",\"S\"],[\"So.\",\"Ma.\",\"Di.\",\"Wo.\",\"Do.\",\"Vr.\",\"Sa.\"],[\"Sondag\",\"Maandag\",\"Dinsdag\",\"Woensdag\",\"Donderdag\",\"Vrydag\",\"Saterdag\"],[\"So.\",\"Ma.\",\"Di.\",\"Wo.\",\"Do.\",\"Vr.\",\"Sa.\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan.\",\"Feb.\",\"Mrt.\",\"Apr.\",\"Mei\",\"Jun.\",\"Jul.\",\"Aug.\",\"Sep.\",\"Okt.\",\"Nov.\",\"Des.\"],[\"Januarie\",\"Februarie\",\"Maart\",\"April\",\"Mei\",\"Junie\",\"Julie\",\"Augustus\",\"September\",\"Oktober\",\"November\",\"Desember\"]],u,[[\"v.C.\",\"n.C.\"],u,[\"voor Christus\",\"na Christus\"]],0,[6,0],[\"y-MM-dd\",\"dd MMM y\",\"dd MMMM y\",\"EEEE dd MMMM y\"],[\"HH:mm\"O,\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\" c>¤#,##0.00\",\"#E0\"],\"ZAR\",\"R\",\"Suid-Afrikaanse rand\",{}(JPY\":[\"JP¥\",\"¥,2RON\":[u,\"leu\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$%ZAR\":[\"R\"]},\"ltr\", plural];\n"]}D⩥(x1&+de#!deRIAAI8 A
F
"QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAYx$
>K A
F"QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAYx$
>K Z
(J/@QAAQ(Z
7(
/@QAAQ(
(	0 

WAAW,EAAC,iBAAiB|
YAAY,EAAC,eAAeCAAC,EAAC,cAAcSAAS[Q(KAAK	KAAK	$(2
(KAAK	B

2
((.	F

(2
EAAE_	3KAAK	EAAE	.}
"de\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan.\",\"Feb.\",\"März\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sept.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mär\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"],[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"]],[[\"v. Chr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d. MMMM y\"],[\"HH:mm\",\"FHH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} 'um8·8 0REuro\",{\"ATS\":[\"öS\"],\"AUD\":[\"AU$\",\"$\"],\"BGM\":[\"BGK\"],\"BGO\":[\"BGJyUC\":[u,\"Cub$\"],\"DEM\":[\"DM\"],\"FKP\":[u,\"Fl£\"],\"GHS\":[u,\"₵\"],\"GNF\":[u,\"F.G.\"],\"KMF\":[u,\"FC\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"RWF\":[u,\"F.Rw\"],\"SYP\":[],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XXX\":[],\("ZMW\":[u,\"K\"]},\"ltr\", plural];\n"]}[GDxCid!id:<IAAI,EAAC,IAAIa
6OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAOF
V#DSAAS,EAAC,WAAW@X(IAAIN
gBAAgB,EAAC,QAAQ
||
FiBAAi.IAAI,EAAC,kBAAkB,E17xIAAIIAAI$P^<#EAAEr	"id\",[[\"AM\",\"PM\"],u,u],u,[[\"M\",\"S\",\"S\",\"R\",\"K\",\"J\",\"S\"],[\"Min\",\"Sen\",\"Sel\",\"Rab\",\"Kam\",\"Jum\",\"Sab\"],[\"Minggu\",\"Senin\",\"Selasa\",\"Rabu\",\"Kamis\",\"Jumat\",\"Sabtu\"],[\"Min\",\"Sen\",\"Sel\",\"Rab\",\"Kam\",\"Jum\",\"Sab
X\",\"Feb\",\"Mar\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Agu\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Maret\"(,\"April\",\"Mei\",\"Juni\",\"Juli\",\"AESM\",\"M\"],u,[\"Sebelum Masehi\",\"Masehi\"]],0,[6,0],[\"dd/MM/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, dd MMMM y\"],[\"HH.mm\",\#"HH.mm.ss\",\"HH.mm.ss z\",\"HH.mm.(.B. 8;IDR\",\"Rp\",\"Rupiah Indonesia\",{\"AUD\":[\"AU$\",\"$\"],~$IDR\":[\"Rp\"],\"INR\":[\"Rs\",\"₹ +\"US$\",\"$\"],\"XXX\":[<:ax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["agq", [["a.g", "a.k"], u, u], u, [["n", "k", "g", "t", "u", "g", "d"], ["nts", "kpa", "ghɔ", "tɔm", "ume", "ghɨ", "dzk"], ["tsuʔntsɨ", "tsuʔukpà", "tsuʔughɔe", "tsuʔutɔ̀mlò", "tsuʔumè", "tsuʔughɨ̂m", "tsuʔndzɨkɔʔɔ"], ["nts", "kpa", "ghɔ", "tɔm", "ume", "ghɨ", "dzk"]], u, [["n", "k", "t", "t", "s", "z", "k", "f", "d", "l", "c", "f"], ["nùm", "kɨz", "tɨd", "taa", "see", "nzu", "dum", "fɔe", "dzu", "lɔm", "kaa", "fwo"], ["ndzɔ̀ŋɔ̀nùm", "ndzɔ̀ŋɔ̀kƗ̀zùʔ", "ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà", "ndzɔ̀ŋɔ̀tǎafʉ̄ghā", "ndzɔ̀ŋèsèe", "ndzɔ̀ŋɔ̀nzùghò", "ndzɔ̀ŋɔ̀dùmlo", "ndzɔ̀ŋɔ̀kwîfɔ̀e", "ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù", "ndzɔ̀ŋɔ̀ghǔuwelɔ̀m", "ndzɔ̀ŋɔ̀chwaʔàkaa wo", "ndzɔ̀ŋèfwòo"]], u, [["SK", "BK"], u, ["Sěe Kɨ̀lesto", "Bǎa Kɨ̀lesto"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "XAF", "FCFA", "CFA Fàlâŋ BEAC", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=agq.js.mapx{"version":3,"file":"yo.js","sourceRoot":"","sources":["yo.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"yo\",[[\"Àárọ̀\",\"Ọ̀sán\"],u,u],u,[[\"À\",\"A\",\"Ì\",\"Ọ\",\"Ọ\",\"Ẹ\",\"À\"],[\"Àìk\",\"Aj\",\"Ìsẹ́g\",\"Ọjọ́r\",\"Ọjọ́b\",\"Ẹt\",\"Àbám\"],[\"Ọjọ́ Àìkú\",\"Ọjọ́ Ajé\",\"Ọjọ́ Ìsẹ́gun\",\"Ọjọ́rú\",\"Ọjọ́bọ\",\"Ọjọ́ Ẹtì\",\"Ọjọ́ Àbámẹ́ta\"],[\"Àìk\",\"Aj\",\"Ìsẹ́g\",\"Ọjọ́r\",\"Ọjọ́b\",\"Ẹt\",\"Àbám\"]],[[\"À\",\"A\",\"Ì\",\"Ọ\",\"Ọ\",\"Ẹ\",\"À\"],[\"Àìk\",\"Aj\",\"Ìsẹ́g\",\"Ọjọ́r\",\"Ọjọ́b\",\"Ẹt\",\"Àbám\"],[\"Àìkú\",\"Ajé\",\"Ìsẹ́gun\",\"Ọjọ́rú\",\"Ọjọ́bọ\",\"Ẹtì\",\"Àbámẹ́ta\"],[\"Àìk\",\"Aj\",\"Ìsẹ́g\",\"Ọjọ́r\",\"Ọjọ́b\",\"Ẹt\",\"Àbám\"]],[[\"S\",\"È\",\"Ẹ\",\"Ì\",\"Ẹ̀\",\"Ò\",\"A\",\"Ò\",\"O\",\"Ọ̀\",\"B\",\"Ọ̀\"],[\"Ṣẹ́r\",\"Èrèl\",\"Ẹrẹ̀n\",\"Ìgb\",\"Ẹ̀bi\",\"Òkú\",\"Agẹ\",\"Ògú\",\"Owe\",\"Ọ̀wà\",\"Bél\",\"Ọ̀pẹ\"],[\"Oṣù Ṣẹ́rẹ́\",\"Oṣù Èrèlè\",\"Oṣù Ẹrẹ̀nà\",\"Oṣù Ìgbé\",\"Oṣù Ẹ̀bibi\",\"Oṣù Òkúdu\",\"Oṣù Agẹmọ\",\"Oṣù Ògún\",\"Oṣù Owewe\",\"Oṣù Ọ̀wàrà\",\"Oṣù Bélú\",\"Oṣù Ọ̀pẹ̀\"]],[[\"S\",\"È\",\"Ẹ\",\"Ì\",\"Ẹ̀\",\"Ò\",\"A\",\"Ò\",\"O\",\"Ọ̀\",\"B\",\"Ọ̀\"],[\"Ṣẹ́\",\"Èr\",\"Ẹr\",\"Ìg\",\"Ẹ̀b\",\"Òk\",\"Ag\",\"Òg\",\"Ow\",\"Ọ̀w\",\"Bé\",\"Ọ̀p\"],[\"Ṣẹ́rẹ́\",\"Èrèlè\",\"Ẹrẹ̀nà\",\"Ìgbé\",\"Ẹ̀bibi\",\"Òkúdu\",\"Agẹmọ\",\"Ògún\",\"Owewe\",\"Ọ̀wàrà\",\"Bélú\",\"Ọ̀pẹ̀\"]],[[\"BCE\",\"AD\"],u,[\"Saju Kristi\",\"Lehin Kristi\"]],1,[6,0],[\"d/M/y\",\"d MM y\",\"d MMM y\",\"EEEE, d MMM y\"],[\"H:m\",\"H:m:s\",\"H:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"NGN\",\"₦\",\"Náírà Nàìjíríà\",{\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"₦\"],\"RUB\":[\"₽\"]},\"ltr\", plural];\n"]}A\ux9%agq!agq:KAAK,EAAC,CePPZj@UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,cAAcPA`Ke-
gBAAgB,EAAC,mBAAmB,EAAC,mBAAmB,EAAC,YAAY,EAAC,gBAAgB,EAAC,eAAe,EAAC,iBAAiB,EAAC,yBAAyB,EAAC,oBAAoB,EAAC,sBAAsB,EAAC,aAAa,CAAC,CPIAAIMP
cAAc1QUAAU$OAAO듏
H
|F	agq\",[[\"a.g\",\"a.k\"],u,u],u,[[\"n\",\"k\",\"g\",\"t\",\"u\",\"g\",\"d\"],[\"nts\",\"kpa\",\"ghɔ\",\"tɔm\",\"ume\",\"ghɨ\",\"dzk\"],[\"tsuʔntsɨ\",\"tsuʔukpà\",\"tsuʔughɔe\",\"tsuʔutɔ̀mlò\",\"tsuʔumè\",\"tsuʔughɨ̂m\",\"tsuʔndzɨkɔʔɔ\"],[\"nts\",\"kpa\",\"ghɔ\",\"tɔm\",\"ume\",\"ghɨ\",\"dzk\"]],u,[[\"n\",\"k\",\"t\",\"t\",\"s\",\"z\",\"k\",\"f\",\"d\",\"l\",\"c\",\"f\"],[\"nùm\",\"kɨz\",\"tɨd\",\"taa\",\"see\",\"nzu\",\"dum\",\"fɔe\",\"dzu\",\"lɔm\",\"kaa\",\"fwo\"],[\"ndzɔ̀ŋɔ̀nùm\",\"ndzɔ̀ŋɔ̀kƗ̀zùʔ\",\"ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà\",\"ndzɔ̀ŋɔ̀tǎafʉ̄ghā\",\"ndzɔ̀ŋèsèe\",\"ndzɔ̀ŋɔ̀nzùghò\",\"ndzɔ̀ŋɔ̀dùmlo\",\"ndzɔ̀ŋɔ̀kwîfɔ̀e\",\"ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù\",\"ndzɔ̀ŋɔ̀ghǔuwelɔ̀m\",\"ndzɔ̀ŋɔ̀chwaʔàkaa wo\",\"ndzɔ̀ŋèfwòo\"]],u,[[\"SK\",\"BK\"],u,[\"Sěe Kɨ̀lesto\",\"Bǎa K	ɨ̀lestoYBM, y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"H6,\",\" c:#,##0.00¤\",\"#E0\"],\"XAF\",\"FCFA\",\"CFA Fàlâŋ BEAC USD\":[\"US$\",\"$}s*JxW%is!is:]eAAe,CAAC,C
UAAU,EAAC,QAAQ$/|_

UAAU|UAAU,UAAU|cAAcC
Z	6export default [[[\"mn.\",\"h.\",\"mrg.\",\"sd.\",\"kv.\",\"n.\"],[\"miðnætti\",\"hádegi\",\"að morgni\",\"síðdegis\",\"að kvöldi\",\"að nóttu\"],u],[[\"mn.\",\"hd.\",\"mrg.\",\"sd.\",\"kv.\",\"n.\"],[\"miðnætti\",\"hádegi\",\"morgunn\",\"sðdegis\",\"kvöld\",\"nótt\"],[\"miðnætti\",\"hádegi\",\"morgunn\",\"eftir hádegi\",\"kvöld\",\"nótt\"]],[\"00:00\",\"g12:00\",[\"06:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}
َKxL%w"w9ғ
ePP
jP
QAAQ|QAAQ
PA`?
=`
eUAAU,EAAC,UAAUk.{

%UAAU,EAAC,UAAUPIAAIMP
QAAQ,EAAC,IAAIP(
.UAAU,EAAC,WAAW,EAAC,gBAAgB,CAAC,EAAC,CAAC,OAAO
CAAC,EAAC,cAAcOYAAY_
OAAO,EAAC,+BAA+B,E	
|F	wo\",[[\"Sub\",\"Ngo\"],u,u],u,[[\"Dib\",\"Alt\",\"Tal\",\"Àla\",\"Alx\",\"Àjj\",\"Ase\"],u,[\"Dibéer\",\"Altine\",\"Talaata\",\"Àlarba\",\"Alxamis\",\"Àjjuma\",\"Aseer\"],[\"Dib\",\"Alt\",\"Tal\",\"Àla\",\"Alx\",\"Àjj\",\"Ase\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"Sam\",\"Few\",\"Mar\",\"Awr\",\"Mee\",\"Suw\",\"Sul\",\"Ut\",\"Sàt\",\"Okt\",\"Now\",\"Des\"],[\"Samwiyee\",\"Fewriyee\",\"Mars\",\"Awril\",\"Mee\",\"Suwe\",\"Sulet\",\"Ut\",\"Sàttumbar\",\"Oktoobar\",\"Nowàmbar\",\"Desàmbar\"]],u,[[\"JC\",\"AD\"],u,[\"av. JC\",\"AD\"]],1,[6,0],[\"dd-MM-y\",\"d MMM, y\",\"d M8MMM, y\",\"EEEE, d MMM, y\"],[\"HH:mm\",\"HH:mm:ss\",\"H&(- {0}\",u,\"{1} 'ci' {0}\",u],[\",\",\".eI #,##0.00\",\"#E0\"],\"XOF\",\"F CFA\",\"Franc CFA bu Afrik Sowwu-jantafRNx%sa"sa;,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb=SAAS,EAAC,OAAO1)o
NeAAe)A1eAAeNcAAc,EAAC,aAAa,EAAC,cAAc,EAAC,eAAe,EAAC,cAAc,EAAC,eAAe,EAAC,mBAAmB,EAAC,qBAAqBo
L-kBAAkB,EAAC,kBAAkBo
KK$SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB-o
oBAAoB,EM1VLif (n === 1)\n    return 1;$saq\",[[\"Tesiran\",\"Teipa\"],u,u],u,[[\"A\",\"K\",\"O\",\"I\",\"I\",\"S\",\"K\"],[\"Are\",\"Kun\",\"Ong\",\"Ine\",\"Ile\",\"Sap\",\"Kwe\"],[\"Mderot ee are\",\"Mderot ee kuni\",\"Mderot ee ong’wan\",\"Mderot ee inet\",\"Mderot ee ile\",\"Mderot ee sapa\",\"Mderot ee kwe\"],[\"Are\",\"Kun\",\"Ong\",\"Ine\",\"Ile\",\"Sap\",\"Kwe\"]],u,[[\"O\",\"W\",\"O\",\"O\",\"I\",\"I\",\"S\",\"I\",\"S\",\"T\",\"T\",\"T\"],[\"Obo\",\"Waa\",\"Oku\",\"Ong\",\"Ime\",\"Ile\",\"Sap\",\"Isi\",\"Saa\",\"Tom\",\"Tob\",\"Tow\"],[\"Lapa le obo\",\"Lapa le waare\",\"Lapa le okuni\",\"Lapa le ong’wan\",\"Lapa le imet\",\"Lapa le ile\",\"Lapa le sapa\",\"Lapa le isiet\",\"Lapa le saal\",\"Lapa le tomon\",\"Lapa le tomon obo\",\"Lapa le tomon waare\"]],u,[[\"KK\",\"BK\"],u,[\"_Kabla ya Christo\",\"Baada ya Christo\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE,^.\",\",Dc:¤#,##0.00\",\"#E0\"],\"KES\",\"Ksh\",\"Njilingi eel Kenya KES\":[\"Ksh3R4x-n#n:ı	,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI$cAAc,EAAC,gBAAgB,EAAC,cAAc?
,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI2:
nYAAY,EAAC,YAAY,EAAC,YAAY,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY,EAAC,WAAW,EAAC,cAAc,Cm7cAAc,EAAC,iBAAiB,CMQAAQ,EAAC,WAAW,EAAC,aAAa:

qBAAqB,E1:
GAAG/if (n === 2)\n    return 2k%naq\",[[\"ǁgoagas\",\"ǃuias\"],u,u],u,[[\"S\",\"M\",\"E\",\"W\",\"D\",\"F\",\"A\"],[\"Son\",\"Ma\",\"De\",\"Wu\",\"Do\",\"Fr\",\"Sat\"],[\"Sontaxtsees\",\"Mantaxtsees\",\"Denstaxtsees\",\"Wunstaxtsees\",\"Dondertaxtsees\",\"Fraitaxtsees\",\"Satertaxtsees\"],[\"Son\",\"Ma\",\"De\",\"Wu\",\"Do\",\"Fr\",\"Sat\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],[\"ǃKhanni\",\"ǃKhanǀgôab\",\"ǀKhuuǁkhâb\",\"ǃHôaǂkhaib\",\"ǃKhaitsâb\",\"Gamaǀaeb\",\"ǂKhoesaob\",\"Aoǁkhuumûǁkhâb\",\"Taraǀkhuumûǁkhâb\",\"ǂNûǁnâiseb\",\"ǀHooǂgaeb\",\"Hôasoreǁkhâb\"]],u,[[\"BC\",\"AD\"],u,[\"Xristub aiǃâ\",\"Xristub khaoǃgâ\"]],1D2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a'#ZAR\",\"ZAR\",\"South African Randi 
NAD\":[\"$3(-ix!az-Cyrl!az-Cyrl:q6UAAU,EAAC,GAAG,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW.,SAAS,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW$76UAAU,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW$-;1xO<Oҝеҹәјары\",\"ҝ\",\"сүбһ\",\"сәһәр\",\"ҝүндүз\",\"ахшамүстү\",\"ахшам\",\"ҝеҹә\"],[\"еҹәјары\",\"ҝүнорта\",\"сүбһ\",\"сәһәр\",\"ҝүндүз\",\"ахшамүстү\",\"ахшам\",\"ҝеә\"],u],[[\"ҝеҹәјары\",\"ҝүнорта\",\"сүбһ\",\"сәһәр\",\"ҝүндүз\",\"ахшамүстү\",\"ахEам\",\"ҝеҹә\"],u,u],[\"00:00\",\"12:00\",[\"04:00\",\"06:00\"]h%#7:00\"],[\"17:00\",\"19:00\"],[\"194:00\"]]];\n"]};m>Vxget!et:qSAAS,EAAC,YAAY,EAAC,UAAU
O
-QAAQ,E"aAAa,EAAC,MAAM,EAAC,IAAI,CAAC,EAAC';1keskööl\",\"keskpäeval\",\"hommikul\",\"pärastlõunal\",\"õhtul\",\"öösel\"],u,u],[[\"kesköö\",\"keskpäev\",\"hommik\G",\"pärastlõuna\",\"õhtu\",\"öö\"],u,u],[\"00:00\",\"12:00\",[\"05n5%3:00\"],[\"23:00\",\"05:00\"]]];\n"]}:x/Lx Okgp!kgp:qSAAS$SAAS,EAAC,SAAS,CAAC,EAAC'[kuty-si\",\"kurã-kuju\",\"kusãg ki\",\"rãkãnh kỹ\",\"kuty kỹ\",\"kurã ge\"],u,u],uS:9:00\"],[\"19.<x& saq!saq:bEAAEB];\n"]}@xE
sr-Cyrl!sr-Cyrl:qY	EAAC,QAAQ.;	EAAC,QAAQ.7Y
'EAAC,SAAS,EAAC,MAAM,EAAC,KAAK,CAAC,EAAC';1поноћ\",\"подне\",\"ујутру\",\"по подне\",\"увече\",\"ноћу\"],[\"поноћ\",\"подне\",\"ујутро\",\"по подне\",\"увече\",\"ноћу\"],u],[[\"поноћ\",\"подне\",\"јутро\",\"попод"е\",\"вече\",\"ноћ\"],u,uRQ1:00\"],[\"21_N	xuz-Cyrl!uz-Cyrl:qUAAU,EAAC,WAAW,EAAC,SAASQAAQ,CAAC,EAAC'ярим тун\",\"туш пайти\",\"эрталаб\",\"кундузи\",\"кечқурун\",\"кечаси\"],u,u],u,[\"W 91:00\"],[\"11:00\",\"18:00\"],[\"18:00\",\"22:00\"],[\"22ep	+x$ yo!yo:bEAAEB];\n"]}N^x yrl!yrl:qFiBAAiB,EAAC,oBAAoB,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC'pituna pyterupé\",\"iandé-ara-pyturepé\",\"kuêma ramẽ\",\"karuka ramẽ\",\"pituna ramẽ\",\"pitunaeté ramẽ\"],u,u],uS:9:00\"],[\"19.sW~xHes!esDq.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)xWAAW,EAAC,QAAQ,EA"#sOdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"ma1ana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"004&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}feUx}	hr!hrDq	
SAASZw
eAAeC	
SAASZOponoć\",\"podne\",\"ujutro\",\"popodne\",\"navečer\",\"noću\"],u,[\"ponoć\",\"podne\",\"ujutro\",\"poslije podne\",\"navečSer\",\"noću\"]],[[\"ponoć\",\"podne\",\"ujutro\",\"popodne\",\"navečer\",\"noću+;8:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"04:00\"]]];\n"]}$~ax& rwk!rwkDbEAAEB];\n"]}65x kln!kln<UyXx mgo!mgo<Uu{x sbp!sbp<Uyx to!to<FEx as!as<Efx jgo!jgo<UEo	x o"o<85)x teo!teo<Ux mn"mn<FDtx] 
	bs&bs?SAAS$P#cAAcwBу,H9
слийеD4K4:00\"]]];\n"]}|I`x& 
naq!naqDbEAAEDB];\n"]}z*x agq!agq:Tp\Bx! 	eAAe,EAAE2];\n"]}	_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["ak", [["AN", "EW"], u, u], u, [["K", "D", "B", "W", "Y", "F", "M"], ["Kwe", "Dwo", "Ben", "Wuk", "Yaw", "Fia", "Mem"], ["Kwesida", "Dwowda", "Benada", "Wukuda", "Yawda", "Fida", "Memeneda"], ["Kwe", "Dwo", "Ben", "Wuk", "Yaw", "Fia", "Mem"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["S-Ɔ", "K-Ɔ", "E-Ɔ", "E-O", "E-K", "O-A", "A-K", "D-Ɔ", "F-Ɛ", "Ɔ-A", "Ɔ-O", "M-Ɔ"], ["Sanda-Ɔpɛpɔn", "Kwakwar-Ɔgyefuo", "Ebɔw-Ɔbenem", "Ebɔbira-Oforisuo", "Esusow Aketseaba-Kɔtɔnimba", "Obirade-Ayɛwohomumu", "Ayɛwoho-Kitawonsa", "Difuu-Ɔsandaa", "Fankwa-Ɛbɔ", "Ɔbɛsɛ-Ahinime", "Ɔberɛfɛw-Obubuo", "Mumu-Ɔpɛnimba"]], u, [["AK", "KE"], u, ["Ansa Kristo", "Kristo Ekyiri"]], 1, [6, 0], ["yy/MM/dd", "y MMM d", "y MMMM d", "EEEE, y MMMM dd"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GHS", "GH₵", "Ghana Sidi", { "GHS": ["GH₵"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ak.js.map$7x3{"version":3,"file":"sat-Olck.js","sourceRoot":"","sources":["sat-Olck.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,UAAU,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,IAAI,CAAC,EAAC,CAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,CAAC,EAAC,CAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,kBAAkB,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nreturn 5;\n}\n\nexport default [\"sat-Olck\",[[\"AM\",\"PM\"],u,[\"ᱥᱮᱛᱟᱜ\",\"ᱧᱤᱫᱟᱹ\"]],[[\"AM\",\"PM\"],u,u],[[\"ᱥ\",\"ᱚ\",\"ᱵ\",\"ᱥ\",\"ᱥ\",\"ᱡ\",\"ᱧ\"],[\"ᱥᱤᱸ\",\"ᱚᱛ\",\"ᱵᱟ\",\"ᱥᱟᱹ\",\"ᱥᱟᱹᱨ\",\"ᱡᱟᱹ\",\"ᱧᱩ\"],[\"ᱥᱤᱸᱜᱮ\",\"ᱚᱛᱮ\",\"ᱵᱟᱞᱮ\",\"ᱥᱟᱹᱜᱩᱱ\",\"ᱥᱟᱹᱨᱫᱤ\",\"ᱡᱟᱹᱨᱩᱢ\",\"ᱧᱩᱦᱩᱢ\"],[\"ᱥᱤᱸ\",\"ᱚᱛ\",\"ᱵᱟ\",\"ᱥᱟᱹ\",\"ᱥᱟᱹᱨ\",\"ᱡᱟᱹ\",\"ᱧᱩ\"]],u,[[\"ᱡ\",\"ᱯ\",\"ᱢ\",\"ᱟ\",\"ᱢ\",\"ᱡ\",\"ᱡ\",\"ᱟ\",\"ᱥ\",\"ᱚ\",\"ᱱ\",\"ᱫ\"],[\"ᱡᱟᱱ\",\"ᱯᱷᱟ\",\"ᱢᱟᱨ\",\"ᱟᱯᱨ\",\"ᱢᱮ\",\"ᱡᱩᱱ\",\"ᱡᱩᱞ\",\"ᱟᱜᱟ\",\"ᱥᱮᱯ\",\"ᱚᱠᱴ\",\"ᱱᱟᱣ\",\"ᱫᱤᱥ\"],[\"ᱡᱟᱱᱣᱟᱨᱤ\",\"ᱯᱷᱟᱨᱣᱟᱨᱤ\",\"ᱢᱟᱨᱪ\",\"ᱟᱯᱨᱮᱞ\",\"ᱢᱮ\",\"ᱡᱩᱱ\",\"ᱡᱩᱞᱟᱭ\",\"ᱟᱜᱟᱥᱛ\",\"ᱥᱮᱯᱴᱮᱢᱵᱟᱨ\",\"ᱚᱠᱴᱚᱵᱟᱨ\",\"ᱱᱟᱣᱟᱢᱵᱟᱨ\",\"ᱫᱤᱥᱟᱢᱵᱟᱨ\"]],u,[[\"ᱥᱮᱨᱢᱟ ᱞᱟᱦᱟ\",\"ᱤᱥᱣᱤ\"],u,u],0,[0,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"INR\",\"₹\",\"ᱥᱤᱧᱚᱛ ᱨᱮᱱᱟᱜ ᱴᱟᱠᱟ\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}$<@pZx- 	eAAe,EAAE 2export default [];\n"]}dFkxEkl!klF5(IAAIGZF~
@gBAAgB,EAAC,eAAe,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,gBAAgB=<A W{M
u2uF"WAAW,EAAC,YAAY,EAAC,QAAQ,EAAC,UAAU
,UAAU,EAAC,aAAa,EAAC,WAAW,EAAC,YAAY,EAAC,YAAYL_W{M
u2uF"UAAU,EAAC,WAAW,EAAC,OAAO,EAAC,SAAS
,SAAS,EAAC,YAAY,EAAC,UAAU,EAAC,WAAW,EAAC,WAAWC{"@
SAAS,EQh
UAAU,EAAC,YAAY,EAAC,eAAeΓ
sBAAsB~"klu],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"sap\",\"ata\",\"mar\",\"pin\",\"sis\",\"tal\",\"arf\"],[\"sapaat\",\"ataasinngorneq\",\"marlunngorneq\",\"pingasunngorneq\",\"sisamanngorneq\",\"tallimanngorneq\",\"arfininngorneq\"],[\"sap\",\"ata\",\"mar\",\"pin\",\"sis\",\"tal\",\"arf\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"jan\",\"febr\",\"mar\",\"apr\",\"maj\",\"jun\",\"jul\",\"aug\",\"sept\",\"okt\",\"nov\",\"dec\"],[\"januaarip\",\"februaarip\",\"marsip\",\"apriilip\",\"maajip\",\"juunip\",\"juulip\",\"aggustip\",\"septembarip\",\"oktobarip\",\"novembarip\",\"decembarip\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"jan\",\"febr\",\"mar\",\"apr\",\"maj\",\"jun\",\"jul\",\"aug\",\"sept\",\"okt\",\"nov\",\"dec\"],[\"januaari\",\"februaari\",\"marsi\",\"apriili\",\"maaji\",\"juuni\",\"juuli\",\"aggusti\",\"septembari\",\"oktobari\",\"novembari\",\"decembari\"]],[[\"BCE\",\"CE\"],u,u],1,[6,0],[\"y-MM-dd\",\"y MMMW d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\"HH.mm\",\"HH.mm.ss\",\"HH.mm.ss z\",\"HH.mm.ss ,\",\".]\ %\",\"¤#,##0.00;¤-#,##0.00\",\"#E0\"],\"DKK\",\"kr.\",\"DKK\",{\"DKK\":[\"kr.\",\"kr\"],IvT_x@xog!xogF5(KAAK,EAAC,CA(P6MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMSAAS,EAAC,QAAQ,EAAC,WAAW^YAAY,EAAC,YAAY,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMA`2>7(
FWAAW,EAAC,WAAW,EAAC,QAAQ
6SAAS,EAAC,SAAS,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,SAASq(qBAAqB,EAAC,oBAAoB@
SAAS,EQh
UAAU,EAAC,YAAY,EAAC,eAAe
qBAAqH"xog\",[[\"Munkyo\",\"Eigulo\"],u,u],u,[[\"S\",\"B\",\"B\",\"S\",\"K\",\"K\",\"M\"],[\"Sabi\",\"Bala\",\"Kubi\",\"Kusa\",\"Kuna\",\"Kuta\",\"Muka\"],[\"Sabiiti\",\"Balaza\",\"Owokubili\",\"Owokusatu\",\"Olokuna\",\"Olokutaanu\",\"Olomukaaga\"],[\"Sabi\",\"Bala\",\"Kubi\",\"Kusa\",\"Kuna\",\"Kuta\",\"Muka\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apu\",\"Maa\",\"Juu\",\"Jul\",\"Agu\",\"Seb\",\"Oki\",\"Nov\",\"Des\"],[\"Janwaliyo\",\"Febwaliyo\",\"Marisi\",\"Apuli\",\"Maayi\",\"Juuni\",\"Julaayi\",\"Agusito\",\"Sebuttemba\",\"Okitobba\",\"Novemba\",\"Desemba\"]],u,[U[\"AZ\",\"AF\"],u,[\"Kulisto nga azilawo\",\"Kulisto nga affile\"]],1,[0,0],[\"dd/MM/94.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss=#,##0.00 ¤\",\"#E0\"],\"UGX\",\"USh\",\"Silingi eya Yuganda!GX\":[\"USh3Ə;Tx kl!klFFvx nnh!nnhFVx hi"hiFF<x xog!xogFWFx t"t;8kex xh!xh<FrRdx'nnh!nnh:"KAAK,EAAC,CAAC,CAAC,WAAW,EAAC,UAAU_
o_HeAAe,EAAC,YAAY,EAAC,qBAAqB,EAAC,gBAAgB,EAAC,yBAAyB,EAAC,iBAAiB,EAAC,YAAY_
oP 6(kBAAkB,EAAC,eAAe,EAAC,gBAAgB,EAAC,SAAS,EAAC,eAAe,EAAC,aAAa,EAAC,uBAAuB,EAAC,WAAW,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,aAAa,EAAC,SAAS,CAS+QAAQ,EAAC,UAAU_aAAa,EAAC,kBAAkB,Cop
UAAU,EAAC,wBAAwB,EAAC,+BAA+~WUAAU,EAAC,SAAS,CAAC,EAAC,C!62W(QAAQ,EAAC,YAAY
WAAW,E1%nnh\",[[\"mbaʼámbaʼ\",\"ncwònzém
;lyɛʼɛ́ sẅíŋtè\",\"mvfò lyɛ̌ʼ\",\"mbɔ́ɔntè mvfò lyɛ̌ʼ\",\"tsètsɛ̀ɛ lyɛ̌ʼ\",\"mbɔ́ɔntè tsetsɛ̀= lyɛ̌ʼ\",\"mvfò màga lyɛ̌ʼ\",\"màga lyɛ̌ʼ\"],u,u?Usaŋ tsetsɛ̀ɛ lùm\",\"saŋ kàg ngwóŋ\",\"saŋ lepyè shúm\",\"saŋ cÿó\",\"saŋ tsɛ̀ɛ cÿó\",\"saŋ njÿoláʼ\",\"saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ\",\"saŋ mbʉ̀ŋ\",\"saŋ ngwɔ̀ʼ mbÿɛ\",\"saŋ tàŋa tsetsáʼ\",\"saŋ mejwoŋó\",\"saŋ lùm\"],u],u,[[\"m.z.Y.\",\"m.g.n.Y.\"],u,[\"mé zyé Yěsô\",\"mé gÿo ńzyé Yěsô\"]],1,[6,0],[\"dd/MM/yy\",\"d MMM, y\",\"'lyɛ'̌ʼ d 'na' MMMM, y\",\"EEEE , 'lyɛ'̌ʼ d 'na' MMMM, y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\")],[\"{1} {0}\",u,\"{1}, {0}\",\"{1},{0}\"i@%\",\"¤ #,##0.00\",\"#E0\"],\"XAF\",\"FCFA\",\"feláŋ CFA\",{IIvx8"vi!vi:<~8``87`8;;;
O@IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM`SAASSAAS,EAAC,SAAS,EAAC,SAAS,CAAC,E/;;;
OoP 6(








QAAQ8SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EW"UAAU,EAAC,UAAU,C~A 6(








QAAQ8SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EW"UAAU,EAAC,UAAU,CQAAQ,EAAC,QAAQ`(QAAQ,CAAC,EAAC,CAAC,kBAAkB,EAAC,iBAAiB,Co[
o
z
iBAAi~Cp
CAAC,EAAC,SAASA%22W(QAAQ,EAAC,YAAYGAAG,EAAC,eAAe,E1L
L
GAAG,CGAAG,C(EAAE9	"vi\",[[\"s\",\"c\"],[\"SA\",\"CH\"],u],[[\"SA\",\"CH\"],u,u],[[\"CN\",\"T2\",\"T3\",\"T4\",\"T5\",\"T6\",\"T7\"],[\"CN\",\"Th 2\",\"Th 3\",\"Th 4\",\"Th 5\",\"Th 6\",\"Th 7\"],[\"Chủ Nhật\",\"Thứ Hai\",\"Thứ Ba\",\"Thứ Tư\",\"Thứ Năm\",\"ThKứ Sáu\",\"Thứ Bảy\"],[\"CN\",\"T2\",\"T3\",\"T4\",\"T5\",\"T6\",\"T7<Xthg 1\",\"thg 2\",\"thg 3\",\"thg 4\",\"thg 5\",\"thg 6\",\"thg 7\",\"thg 8\",\"thg 9\",\"thg 10\",\"thg 11\",\"thg 12\"],[\"tháng 1\",\"tháng 2\",\"tháng 3\",\"tháng 4\",\"tháng 5\",\"tháng 6\",\"tháng 7\",\"tháng 8\",\"tháng 9\",\"tháng 10\",\"tháng 11\",\"tháng 12VThg 1\",\"Thg 2\",\"Thg 3\",\"Thg 4\",\"Thg 5\",\"Thg 6\",\"Thg 7\",\"Thg 8\",\"Thg 9\",\"Thg 10\",\"Thg 11\",\"Thg 12\"],[\"Tháng 1\",\"Tháng 2\",\"Tháng 3\",\"Tháng 4\",\"Tháng 5\",\"Tháng 6\",\"Tháng 7\",\"Tháng 8\",\"Tháng 9\",\"Tháng 10\",\"Tháng 11\",\"Tháng 12\"]],[[\"tr. CN\",\"sau CN\"],[\"Trước CN\",\"Sau CN\"],[\"Trước Thiên Chúa\",\"Sau Công Nguyên\"]],1,[6,0],[\"dd/MM/y\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss #zzzz\"],[\"{0}, {1}\",u,\"{0} {1}\"k%\",\"#,##0.00 ¤\",\"#E0\"],\"VND\",\"₫\",\"Đồng Việt Nam\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"PHP\":[u,\"'₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$_#,\"XXX\":[]},\"ltr\", plural];\n"]}.Cs!Hx"
zh!zh:]eAAe,CM(
^n
)(
V(
^nm
^^^^^	CAAC,CAAC	7
[[\"午夜\",\"早上\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"],u,[\"午夜\",\"清晨\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"]],[[\"午夜\",\"早上\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"],u,u],[\"00:00\",[\"05:00\",\"08:00\"],[\"08:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"19:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]};Olx"zh!zh:ѓ[7nA(
^8KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E$(
)(#KAAK,EAAC,KAAK,E$((KAAK,EAAC,KAAKAnKAAK_3n(m
QAAQ,EAAC,CAAC,EAAC,YAAY](
n.WAAW,EGAAG,EAAC,KAAK,EP_

_(_
ePzh\",[[\"上午\",\"下午\"],u,u],u,[[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],[\"周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周六\"],[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期`五\",\"星期六\"],[\"周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周六X1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"]],u,[X[\"公元前\",\"公元\"],u,u],0,[6,0],[\"y/M/d\",\"y年M月d日\",u,\"y年M月d日EEEEj>z HH:mm:ss\",\"zzzz HH:mm:ss\"],[\"{1} {0}\",u,u,u],[\".\",\",c0¤#,##0.00\",\"#E0\"],\"CNY\",\"¥\",\"人民币p2QCNY\":[\"¥\"],\"ILR\":[\"ILS\"],\"JPY\":[\"JP¥\",\"¥\"],\"KRW\":[\"￦\",\"₩RUR\":[u,\"р.PLJtIxBshi!shi<EAAE,CAAC,GAAG.,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C%lB,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAKB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1C[UAAUa
_PV2:
OAAO$QAAQ,EAAC,SAASFB6:
OAAO,EAAC,MAAM$6QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,UAAU_V_
YAAY,EAAC,cAAc_UAAU1WAAW)gBAAgB,Ep,
[, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nif (n === Math.floor(n) && (n >= 2 && n <= 10))\n  
  return 3]%shi\",[[\"ⵜⵉⴼⴰⵡⵜ\",\"ⵜⴰⴷⴳⴳⵯⴰⵜ\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"ⴰⵙⴰ\",\"ⴰⵢⵏ\",\"ⴰⵙⵉ\",\"ⴰⴽⵕ\",\"ⴰⴽⵡ\",\"ⴰⵙⵉⵎ\",\"ⴰⵙⵉⴹ\"],[\"ⴰⵙⴰⵎⴰⵙ\",\"ⴰⵢⵏⴰⵙ\",\"ⴰⵙⵉⵏⴰⵙ\",\"ⴰⴽⵕⴰⵙ\",\"ⴰⴽⵡⴰⵙ\",\"ⵙⵉⵎⵡⴰⵙ\",\"ⴰⵙⵉⴹⵢⴰⵙ\"],[\"ⵙⴰ\",\"ⴰⵢⵏ\",\"ⴰⵙⵉ\",\"ⴰⴽⵕ\",\"ⴰⴽⵡ\",\"ⴰⵙⵉⵎ\",\"ⴰⵙⵉⴹ\"]],u,[[\"ⵉ\",\"ⴱ\",\"ⵎ\",\"ⵉ\",\"ⵎ\",\"ⵢ\",\"ⵢ\",\"ⵖ\",\"ⵛ\",\"ⴽ\",\"ⵏ\",\"ⴷ\"],[\"ⵉⵏⵏ\",\"ⴱⵕⴰ\",\"ⵎⴰⵕ\",\"ⵉⴱⵔ\",\"ⵎⴰⵢ\",\"ⵢⵓⵏ\",\"ⵢⵓⵍ\",\"ⵖⵓⵛ\",\"ⵛⵓⵜ\",\"ⴽⵜⵓ\",\"ⵏⵓⵡ\",\"ⴷⵓⵊ\"],[\"ⵉⵏⴰⵢⵔ\",\"ⴱⵕⴰⵢⵕ\",\"ⵎⴰⵕⵚ\",\"ⵉⴱⵔⵉⵔ\",\"ⵎⴰⵢⵢⵓ\",\"ⵢⵓⵏⵢⵓ\",\"ⵢⵓⵍⵢⵓⵣ\",\"ⵖⵓⵛⵜ\",\"ⵛⵓⵜⴰⵏⴱⵉⵔ\",\"ⴽⵜⵓⴱⵔ\",\"ⵏⵓⵡⴰⵏⴱⵉⵔ\",\"ⴷⵓⵊⴰⵏⴱⵉⵔ\"]],u,[[\"ⴷⴰⵄ\",\"ⴷⴼⵄ\"],u,[\"ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ\",\"ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ\"]],1,[6,0],[\"d/M/y\",\"d MMM,]v^,\",\" lE\",\"#E0\"],\"MAD\",\"MAD\",\"ⴰⴷⵔⵉⵎ ⵏ ⵍⵎⵖⵔⵉⴱ{!,CR>xh"h<IAAI^8
_PVA
OAAO,EAAC,WAAW,EAAC,aAAaGP_AIAAI,Ej"VQAAQQAAQ,EAAC,QAAQ,
KK
_GWAAWGAAG,EAAC,0BAA0B,Ep,
[-h\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Caw\",\"Mvu\",\"Bin\",\"Tha\",\"Sin\",\"Hla\",\"Mgq\"],[\"Cawe\",\"Mvulo\",\"Lwesibini\",\"Lwesithathu\",\"Lwesine\",\"Lwesihlanu\",\"Mgqibelo\"],[\"Caw\",\"Mvu\",\"Bin\",\"Tha\"g,\"Sin\",\"Hla\",\"Mgq\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12
t\",\"Epr\",\"Mey\",\"Jun\",\"Jul\",\"Aga\",\"Sep\",\"Okt\",\"Nov\",\"Dis\"],[\"Janyuwari\",\"Februwari\",\"Matshi\",\"Epreli\",\"Meyi\",\"Juni\",\"Julayi\",\"Agasti\",\"Septemba\",\"Okthoba\",\"Novemba\",\"Disemba\"]],u,[[\"BC\",\"AD\"],u,u],0,[6,0],[\"3y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE[ c=¤#,##0.00\",\"#E0\"],\"ZAR\",\"R\",\"iRandi yaseMzanzi Afrikz"!SD\":[\"US$\",\"$\"],\"ZAR\":[\"Ry'#D|xObm!bm:6,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ^Γ7IAAIV

`QAAQ,EAAC,SAAS,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW,CoUAAU,EAAC,UAAU_iBAAiB,EAAC,oBAAoB,CoUAAU,EAAC,eAAe-OAAO,EAAC,mBAAm+\F"bmjK\",\"N\",\"T\",\"A\",\"A\",\"J\",\"S\"],[\"kar\",\"ntɛ\",\"tar\",\"ara\",\"ala\",\"jum\",\"sib\"],[\"kari\",\"ntɛnɛ\",\"tarata\",\"araba\",\"alamisa\",\"juma\",\"sibiri\"],[\"kar\",\"ntɛ\",\"tar\",\"ara\",\"ala\",\"jum\",\"sib\"]],u,[[\"Z\",\"F\",\"M\",\"A\",\"M\",\"Z\",\"Z\",\"U\",\"S\",\"Ɔ\",\"N\",\"D\"],[\"zan\",\"feb\",\"mar\",\"awi\",\"mɛ\",\"zuw\",\"zul\",\"uti\",\"sɛt\",\"ɔku\",\"now\",\"des\"],[\"zanwuye\",\"feburuye\",\"marisi\",\"awirili\",\"mɛ\",\"zuwɛn\",\"zuluye\",\"uti\",\"sɛtanburu\",\"ɔkutɔburu\",\"nowanburu\",\"desanburu\"]],u,[[\"J.-C. ɲɛ\",\"ni J.-C.\"],u,[\"jezu krisiti ɲɛ\",\"jezu krisiti Gminkɛ\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMM y[,u{&XOF\",\"F CFA\",\"sefa Fraŋ (BCEAO)5},\"ltr\", plural];\n"]}ىVWZxksf!ksf:("KAAK,EAAC,CAAC,CAAC,QAAQ,EAAC,SAAS_
o_
7@QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO78;
;
;
;
;
;
;
-gBAAgB,EAAC,eAAe,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,eAAe,EAAC,uBAAuB,EAAC,uBAAuB,CoMAAM,EAAC,MAAM_oBAAoB,EAAC,qBAAqB,Co
eAAe
YAAYMAAM,EAAC,MAAM,[F"ksf\",[[\"sárúwá\",\"cɛɛ́nko\"],u,u],u,[[\"s\",\"l\",\"m\",\"m\",\"j\",\"j\",\"s\"],[\"sɔ́n\",\"lǝn\",\"maa\",\"mɛk\",\"jǝǝ\",\"júm\",\"sam\"],[\"sɔ́ndǝ\",\"lǝndí\",\"maadí\",\"mɛkrɛdí\",\"jǝǝdí\",\"júmbá\",\"samdí\"],[\"sɔ́6n\",\"lǝn\",\"maa\",\"mɛk\",\"jǝǝ\",\"júm\",\"sam}	Xŋ1\",\"ŋ2\",\"ŋ3\",\"ŋ4\",\"ŋ5\",\"ŋ6\",\"ŋ7\",\"ŋ8\",\"ŋ9\",\"ŋ10\",\"ŋ11\",\"ŋ12\"],[\"ŋwíí a ntɔ́ntɔ\",\"wíí akǝ bɛ́ɛ\",\"ŋwíí akǝ ráá\",\"ŋwíí akǝ nin\",\"ŋwíí akǝ táan\",\"ŋwíí akǝ táafɔk\",\"ŋwíí akǝ táabɛɛ\",\"ŋwíí akǝ táaraa\",\"ŋwíí akǝ táanin\",\"ŋwíí akǝ ntɛk\",\"ŋwíí akǝ ntɛk di bɔ́k\",\"ŋwí akǝ ntɛk di bɛ́ɛ\"]],u,[[\"d.Y.\",\"k.Y.\"],u,[\"di Yɛ́sus aká yálɛ\",\"cámɛɛn kǝ kǝbɔpka Y\"]],1,[6,0],[\"0d/M/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM yU,nj1#,##0.00 ¤\",\"#E0\"],\"XAF\",\"FCFA\",\"fráŋ5},\"ltr\", plural];\n"]}h;hxCvai-Vaii!vai-Vaii:(UAAU\V~xMAAM,EAAC,MAAMo
oP,26;
;
;
;
;
;
;
;
YAAY,EAAC,MAAM0;
;
	EAAC,KAAK0;
EAAC,UAAU,EAAC,YAAY,CoKAAKpQAAQ,gBAAgB!UAAU,B_(F"vai-VaiijKjꕞꕌꔵ\",\"ꗳꗡꘉ\",\"ꕚꕞꕚ\",\"ꕉꕞꕒ\",\"ꕉꔤꕆꕢ\",\"ꕉꔤꕀꕮ\",\"ꔻꔬꔳ\"],u,u	Uꖨꖕꔞ\",\"ꕒꕡ\",\"ꕾꖺ\",\"ꖢꖕ\",\"ꖑꕱ\",\"ꖱꘋ\",\"ꖱꕞ\",\"ꗛꔕ\",\"ꕢꕌ\",\"ꕭꖃ\",\"ꔞꘋ\",\"ꖨꖕꗏ\"],[\"ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ\",\"ꕒꕡꖝꖕ\",\"ꕾꖺ\",\"ꖢꖕ\",\"ꖑꕱ\",\"ꖱꘋ\",\"ꖱꕞꔤ\",\"ꗛꔕ\",\"ꕢꕌ\",\"ꕭꖃ\",\"ꔞꘋꕔꕿ ꕸꖃꗏ\",\"ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ\"]],u,[[\"BCE\",\"CE\"],u,u],1,[6,0],[\"dd/MM/y\d",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aM&,u{$LRD\",\"$\",\"ꕞꔤꔫꕩ ꕜꕞꕌ 
LRD\":[\"$0},\"ltr\", plural];\n"]}7<3x1yue!yue:(KAAK\V~o
2oP,(8;
;
;
;
;
;
;
-`KAAKp[
QAAQ,EAAC,CAAC,EAAC,aAAa$cAAc,EAAC,iBAAiB!
IAAI,B
v

_
P
v72EAAEF"yue\",[[\"上午\",\"下午\"],u,u],u,[[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\"],u,[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\~	W1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],u],u,[[\"西元\",\"西元
/M/d\",\"y年M月d日\",u,\"y年M月d日 EEEE\"],[\"ah:mm\",\"ah:mm:ss\",\"ah:mm:ss [z]\",\"ah:mm:ss [zzzz]\"],[\"{1} {0}\",u,u,u],[\".\",\",u:	非數值>HKD\",\"HK$\",\"港幣\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"KRW\":[\"￦\",\"₩\"],\"PHP\":[u,\"₱\"],\"RUR\":[u,\"р.0 XXX\":[]},\"ltr\", plural];\n"]}kFjKG6xsnmg!nmg<ѓO(M@AL

-TQAAQ,EAAC,QAAQ,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,kBAAkB,EAAC,iBAAiB,EAAC,QAAQ,CAAC,EAAC,C-^eAAe,EAAC,YAAY,EAAC,YAAY,EAAC,WAAW,EAAC,YAAY,EAAC,YAAY,EAAC,gBAAgB,EAAC,aAAa,EAAC,cAAc,EAAC,WAAW,EAAC,iBAAiB,EAAC,UAAU,CAAC,CAA@)@

WAAW@reAAe,EM1
`nmg\",[[\"maná\",\"kugú\"],u,u],u,[[\"s\",\"m\",\"s\",\"s\",\"s\",\"m\",\"s\"],[\"sɔ́n\",\"mɔ́n\",\"smb\",\"sml\",\"smn\",\"mbs\",\"sas\"],[\"sɔ́ndɔ\",\"mɔ́ndɔ\",\"sɔ́ndɔ mafú mába\",\"sɔ́ndɔ mafú málal\",\"sɔ́ndɔ mafú mána\",\_"mabágá má sukul\",\"sásadi\"],[\"sɔ́n\",\"mɔ́n\",\"smb\",\"sml\",\"smn\",\"mbs\",\"sasX	Xng1\",\"ng2\",\"ng3\",\"ng4\",\"ng5\",\"ng6\",\"ng7\",\"ng8\",\"ng9\",\"ng10\",\"ng11\",\"kris\"],[\"ngwɛn matáhra\",\"ngwɛn ńmba\",\"ngwɛn ńlal\",\"ngwɛn ńna\",\"ngwɛn ńtan\",\"ngwɛn ńtuó\",\"ngwɛn hɛmbuɛrí\",\"ngwɛn lɔmbi\",\"ngwɛn rɛbvuâ\",\"ngwɛn wum\",\"ngwɛn wum navǔr\",\"krísimin\"]],u,[[\"BL\",\"PB\"],u,[\"Bó Lahlɛ̄\",\"Pfiɛ Burī\"]],1,[6,0 Fraŋ CFA BEACM.bS8x<ro"ro;,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb=UAAU#
BWAAW,EAAC,UAAU,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,WAAW,CAAC,EAAC,C#}pL
$iBAAiB,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,eAAe,EAAC,eAAe,EAAC,eAAe,EAAC,eAAe,EAAC,eAAe,EAAC,gBAAgB,EAAC,wBAAwB,EAAC,yBAAyB@)@
iBAAiB,EAAC,iBAAiB@*
gBAAgB
WAAW
oBAAoB,EM1
`
`if (n === 1)\n    return 1;$-rof\",[[\"kang’ama\",\"kingoto\"],u,u],u,[[g	&1\"],[\"Ijp\",\"Ijt\",\"Ijn\",\"Ijtn\",\"Alh\",\"Iju\",\"Ijm\"],[\"Ijumapili\",\"Ijumatatu\",\"Ijumanne\",\"Ijumatano\",\"Alhamisi\",\"Ijumaa\",\"Ijumamosi\"],[\"Ijp\",\"Ijt\",\"Ijn\",\"Ijtn\",\"Alh\",\"Iju\",\"Ijm\"]],u,[[\"K\",\"K\",\"K\",\"K\",\"T\",\"S\",\"S\",\"N\",\"T\",\"I\",\"I\",\"I\"],[\"M1\",\"M2\",\"M3\",\"M4\",\"M5\",\"M6\",\"M7\",\"M8\",\"M9\",\"M10\",\"M11\",\"M12\"],[\"Mweri wa kwanza\",\"Mweri wa kaili\",\"Mweri wa katatu\",\"Mweri wa kaana\",\"Mweri wa tanu\",\"Mweri wa sita\",\"Mweri wa saba\",\"Mweri wa nane\",\"Mweri wa tisa\",\"Mweri wa ikumi\",\"Mweri wa ikumi na moja\",\"Mweri wa ikumi na mbili\"]],u,[[\J"KM\",\"BM\"],u,[\"Kabla ya Mayesu\",\"Baada ya Mayesu\"]],1,[6,0],[\"dd/M%,^.\",\",9c:¤#,##0.00\",\"#E0\"],\"TZS\",\"TSh\",\"heleri sa Tanzania TZS\":[\"TSh3cx2zgh!zgh<UAAU0
@AL
C^(@ZpL
C7MAAM*
;EAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,UAAU@@
YAAY,EAAC,cAAc@#UAAU,EAAC,UAAUSAAS,EAAC,WAAW
gBAAgB,EM1
`zgh\",[[\"ⵜⵉⴼⴰⵡⵜ\",\"ⵜⴰⴷⴳⴳⵯⴰⵜ\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"ⴰⵙⴰ\",\"ⴰⵢⵏ\",\"ⴰⵙⵉ\",\"ⴰⴽⵕ\",\"ⴰⴽⵡ\",\"ⴰⵙⵉⵎ\",\"ⴰⵙⵉⴹ\"],[\"ⴰⵙⴰⵎⴰⵙ\",\"ⴰⵢⵏⴰⵙ\",\"ⴰⵙⵉⵏⴰⵙ\",\"ⴰⴽⵕⴰⵙ\",\"ⴰⴽⵡⴰⵙ\",\"ⴰⵙⵉⵎⵡⴰⵙ\",\"ⴰⵙⵉⴹⵢⴰⵙ\"],[\"ⴰⵙⴰ\",\"ⴰⵢⵏ\",\"ⴰⵙⵉ\",\"ⴰⴽⵕ\",\"ⴰⴽⵡ\",\"ⴰⵙⵉⵎ\",\"ⴰⵙⵉⴹ\"]],u,[[\"ⵉ\",\"ⴱ\",\"ⵎ\",\"ⵉ\",\"ⵎ\",\"ⵢ\",\"ⵢ\",\"ⵖ\",\"ⵛ\",\"ⴽ\",\"ⵏ\",\"ⴷ\"],[\"ⵉⵏⵏ\",\"ⴱⵕⴰ\",\"ⵎⴰⵕ\",\"ⵉⴱⵔ\",\"ⵎⴰⵢ\",\"ⵢⵓⵏ\",\"ⵢⵓⵍ\",\"ⵖⵓⵛ\",\"ⵛⵓⵜ\",\"ⴽⵜⵓ\",\"ⵏⵓⵡ\",\"ⴷⵓⵊ\"],[\"ⵏⵏⴰⵢⵔ\",\"ⴱⵕⴰⵢⵕ\",\"ⵎⴰⵕⵚ\",\"ⵉⴱⵔⵉⵔ\",\"ⵎⴰⵢⵢⵓ\",\"ⵢⵓⵏⵢⵓ\",\"ⵢⵓⵍⵢⵓⵣ\",\"ⵖⵓⵛⵜ\",\"ⵛⵓⵜⴰⵏⴱⵉⵔ\",\"ⴽⵜⵓⴱⵔ\",\"ⵏⵓⵡⴰⵏⴱⵉⵔ\",\"ⴷⵓⵊⴰⵏⴱⵉⵔ\"]],u,[[\"ⴷⴰⵄ\",\"ⴷⴼⵄ\"],u,[\"ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ\",\"ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ\"]],1,[6,0],[\,V %\",\"#,##0.00¤\",\"#E0\"],\"MAD\",\"MAD\",\"ⴰⴷⵔⵉⵎ ⵏ ⵍⵎⵖⵔⵉⴱMWGx}ki!ki<("IAAI,EAAC,CAAC,CAAC,QAAQ,EAAC,UAAUaZGQAAQ$8YAAY.:
=eAAe,EAAC,iBAAiB,EAAC,eAAe,EAAC,iBAAiB,EAAC,oBAAoB,EAAC,mBAAmgBAAgB,EAAC,wBAAwB,EAAC,WAAW$|4kBAAkB$

[kBAAkB,E1:

n"ki\",[[\"Kiroko\",\"Hwaĩ-inĩ\"],u,u],u,[[\"K\",\"N\",\"N\",\"N\",\"A\",\"N\",\"N\"],[\"KMA\",\"NTT\",\"NMN\",\"NMT\",\"ART\",\"NMA\",\"NMM\"],[\"Kiumia\",\"Njumatatũ\",\"Njumaine\",\"Njumatana\",\"Aramithi\",\"Njumaa\",\"Njumamothi\"],[\"KMA\",\"NTT\",\"NMN\",\"NMT\",\"ART\",\"NMA\",\"NMM\"]],u,[[\"J\",\"K\",\"G\",\"K\",\"G\",\"G\",\"M\",\"K\",\"K\",\"I\",\"I\",\"D\"],[\"JEN\",\"WKR\",\"WGT\",\"WKN\",\"WTN\",\"WTD\",\"WMJ\",\"WNN\",\"WKD\",\"WIK\",\"WMW\",\"DIT\"],[\"Njenuarĩ\",\"Mwere wa kerĩ\",\"Mwere wa gatatũ\",\"Mwere wa kana\",\"Mwere wa gatano\",\"Mwere wa gatandatũ\",\"Mwere wa mũgwanja\",\"Mwere wa kanana\",\"Mwere wa kenda\",\"Mwere wa ikũmi\",\"Mwere wa ikũmi na ũmwe\",\"Ndithemba\"]],u,[[\"MK\",\"TK\"],u,[\"Mbere ya Kristo\",\"Thutha wa Kristo\"]],0KES\",\"Ksh\",\"Ciringi ya Keny!KES\":[\"Ks4]bFxhmgh!mgh<FYAAYaZGQAAQ,EAAC,UAAU,EAAC,SAAS.QAAQ,EAAC,UAAU.5kBAAkB,EAAC,kBAAkB,EAAC,oBAAoB,EAAC,mBAAmB,EAAC,yBAAy/uBAAuKYeAAe,EAAC,YAAY$

.YAAY%)
5:

n"mgh\",[[\"wichishu\",\"mchochil’l\"],u,u],u,[[\"S\",\"J\",\"J\",\"J\",\"A\",\"I\",\"J\"],[\"Sab\",\"Jtt\",\"Jnn\",\"Jtn\",\"AMra\",\"Iju\",\"Jmo\"],[\"Sabato\",\"Jumatatu\",\"Jumanne\",\"Jumatano\",\"Ara_	Jumamosi\"],[\"Sab\",\"Jtt\",\"Jnn\",\"Jtn\",\"Ara\",\"Iju\",\"Jmo\"]],u,[[\"K\",\"U\",\"R\",\"C\",\"T\",\"M\",\"S\",\"N\",\"T\",\"K\",\"M\",\"Y\"],[\"Kwa\",\"Una\",\"Rar\",\"Che\",\"Tha\",\"Moc\",\"Sab\",\"Nan\",\"Tis\",\"Kum\",\"Moj\",\"Yel\"],[\"Mweri wo kwanza\",\"Mweri wo unayeli\",\"Mweri wo uneraru\",\"Mweri wo unecheshe\",\"Mweri wo unethanu\",\"Mweri wo thanu na mocha\"T,\"Mweri wo saba\",\"Mweri wo nane\",\"Mweri wo tisa\",\"Mweri wo kumi\",\"Mweri wo ,Qo kumi na yel’li\"]],u,[[\"HY\",\"YY\"],u,[\"Hinapiya yesu\",\"Yopia yesu\"]],0,\",\".3e+ #,##0.00\",\"#E0\"],\"MZN\",\"MTn\",\"MZN MZN\":[\"MTn3\4Ux[tg!tg<(IAAIl8ZG>
OAAO,EAAC,OAAO.$OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,E",QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ$m
cAAc,EAAC,cAAc$

:
4iBAAiYAAY%
QAAQ,E1:
MAAMn"tg\",[[\"AM\",\"PM\"],u,u],u,[[\"Я\",\"Д\",\"С\",\"Ч\",\"П\",\"Ҷ\",\"Ш\"],[\"Яшб\",\"Дшб\",\"Сшб\",\"Чшб\",\"Пшб\",\"Ҷмъ\",\"Шнб\"],[\"Якшанбе\",\"Душанбе\",\"Сешанбе\",\"Чоршанбе\",\"Панҷшабе\",\"Ҷумъа\",\"Шанбе\"],[\"Яшб\",\"Дшб\",\"Сшб\",\"Чшб\",\"Пшб\",\"Ҷмъ\",\"Шнб\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"Янв\",\"Фев\",\"Мар\",\"Апр\",\"Май\",\"Июн\",\"Июл\",\"Авг\",\"Сен\",\"Окт\",\"Ноя\",\"Дек\"],[\"Январ\",\"Феврал\",\"Март\",\"Апрел\",\"Май\",\"Июн\",\"Июл\",\"Август\",\"Сентябр\",\"Октябр\",\"Ноябр\",\"Декабр\"]],u,[[\"ПеМ\",\"ПаМ\"],u,[\"Пеш аз милод\",\"Пас аз милод\"]],1,[6,0],[\"dd/MM/yy\",\"dd  MMM y\",\"dd MMMM y\",\"EEEE, d],\",\" 3c:#,##0.00 ¤\",\"#E0\"],\"TJS\",\"сом.\",\"Сомонӣ!*JS\":[\"сом.\"]},\"ltr\", plural];\n"]}+S Wyxug!ug<IAAIpGcAAc,EAAC,cAAcm
FGP:1EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,MAAM,EAAC,OAAO{Q}thQAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS>KAAK,EAAC,UAAUamBAAmB,EAAC,UAAU$

SAAS.H:
CAAC,EAAC,SAASqGAAG,EAAC,aAAa,E10ug\",[[\"ب\",\"ك\"],[\"چ.ب\",\"چ.ك\"],[\"چۈشتىن بۇرۇن\",\"چۈشتىن كېيىن\"]],[[\"چ.ب\",\"چ.ك\"],u,u],[[\"ي\",\"د\",\"س\",\"چ\",\"پ\",\"ج\",\"ش\"],[\"يە\",\"دۈ\",\"سە\",\"چا\",\"پە\",\"جۈ\",\"شە\"],[\"يكشەنبە\",\"دۈشەنبە\",\"سەيشەنبە\",\"چارشەنبە\",\"پەيشەنبە\",\"جۈمە\",\"شەنبە\"],>[\"ي\",\"د\",\"س\",\"چ\",\"پ\",\"ج\",\"ش\"]],u,[[\"1\",&8\",\"9\",\"10\",\"11\",\"12\"],[\"يانۋار\",\"فېۋرال\",\"مارت\",\"ئاپرېل\",\"ماي\",\"ئىيۇن\",\"ئىيۇل\",\"ئاۋغۇست\",\"سېنتەبىر\",\"ئۆكتەبىر\",\"نويابىر\",\"دېكابىر\"],u],u,[[\"BCE\",\"مىلادىيە\"],u,[\"مىلادىيەدىن بۇرۇن\",\"مىلادىيە\"]],0,[6,0],[\"y-MM-dd\",\"d-MMM، y\",\"d-MMMM، y\",\"y d-MMMM، EEEED، {0}\",u,\"{1} {0}\"%sCNY\",\"￥\",\"جۇڭگو يۈەنى\",{\"CNY\":[\"￥\",\"¥\"],\"JPY\":[\"JP¥\",\"¥\"]},\"rtl\", plural];\n"]}K<x0vai!vai<<|(ZG

MAAMmst
t<~(YAAY,EAAC,MAAMn.
tUAAU,EAAC,YAAY$KAAK$

4QAAQ,EAAC,WAAW,EAAC,aAAaYGAAG,EAAC,UAAU,E1:
GAAG/n"vai\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"ꕞꕌꔵ\",\"ꗳꗡꘉ\",\"ꕚꕞꕚ\",\"ꕉꕞE\",\"ꕉꔤꕆꕢ\",\"ꕉꔤꕀꕮ\",\"ꔻꔬꔳ\"],u,u],u,[[\"1\",&8\",\"9\",\"10\",\"11\",\"12\"],[\"ꖨꖕꔞ\",\"ꕒꕡ\",\"ꕾꖺ\",\"ꖢꖕ\",\"ꖑꕱ\",\"ꖱꘋ\",\"ꖱꕞ\",\"ꗛꔕ\",\"ꕌ\",\"ꕭꖃ\",\"ꔞꘋ\",\"ꖨꖕꗏ\"],[\"ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ\",\"ꕒꕡꖝꖕ\",\"ꕾꖺ\",\"ꖢꖕ\",\"ꖑꕱ\",\"ꖱꘋ\",\"ꖱꕞꔤ\",\"ꗛꔕ\",\"ꕢꕌ\",\"ꕭꖃ\",\"ꔞꘋꕔꕿ ꕸꖃꗏ\",\"ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ\"]],u,[[\"BCE\",\"CE\"],u,uG2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a$LRD\",\"$\",\"ꕞꔤꔫꕩ ꕜꕞꕌ 
LRD\":[\"$3ZYxQak!ak:IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAFCAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACb=O(
@AP,
,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM'A}IAAI,EK"'^cAAc,EAAC,iBAAiB,EAAC,aAAa,EAAC,kBAAkB,EAAC,4BAA4B,EAAC,qBAAqB,EAAC,mBAAmB,EAAC,eAAe,EAAC,YAAY!#O(aAAa,EAAC,eAAe$UAAUiBAAiB$aAAa,YAAY,EQOZ=if (n === Math.floor(n) && (n >= 0 && n <= 1))\n    return 1;"$ak\",[[\"AN\",\"EW\"],u,u],u,[[\"K\",\"D\",\"B\",\"W\",\"Y\",\"F\",\"M\"],[\"Kwe\",\"Dwo\",\"Ben\",\"Wuk\",\"Yaw\",\"Fia\",\"Mem\"],[\"Kwesida\",\"Dwowda\",\"Benada\",\"Wukuda\",\"Yawda\",\"Fida\",\"Memeneda\"],[\"Kwe\",\"Dwo\",\"Ben\",\"Wuk\",\"Yaw\",\"Fia\",\"Mem\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"S-Ɔ\",\"K-Ɔ\",\"E-Ɔ\",\"E-O\",\"E-K\",\"O-A\",\"A-K\",\"D-Ɔ\",\"F-Ɛ\",\"Ɔ-A\",\"Ɔ-O\",\"M-Ɔ\"],[\"Sanda-Ɔpɛpɔn\",\"Kwakwar-Ɔgyefuo\",\"Ebɔw-Ɔbenem\",\"Ebɔbira-Oforisuo\",\"Esusow Aketseaba-Kɔtɔnimba\",\"Obirade-Ayɛwohomumu\",\"Ayɛwoho-Kitawonsa\",\"Difuu-Ɔsandaa\",\"Fankwa-Ɛbɔ\",\"Ɔbɛsɛ-Ahinime\",\"Ɔberɛfɛw-Obubuo\",\"Mumu-Ɔpɛnimba\"]],u,[[\"AK\",\"KE\"],u,[\"Ansa Kristo\",\"Kristo Ekyiri\"]],1,[6,0],[\"yy/MM/dd\",\"y MMM d\",\"y MMMM d\",\"EEEE, y MMMM dd\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a4GHS\",\"GH₵\",\"Ghana Sidi\",{\"GHS\":[\"GH₵\"],-b Ex\sg!sg:ѓO(
@AP
WAAW,EAAC,WAAW,EAAC,YAAY,ESAAS1x
6QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAOSAAS$'@
gBAAgB,EAAC,mBAAmB$UAAU,EAAC,eAAe
sBAAsB
MAAM,EAAC,oBAAoB,EQZsg\",[[\"ND\",\"LK\"],u,u],u,[[\"K\",\"S\",\"T\",\"S\",\"K\",\"P\",\"Y\"],[\"Bk1\",\"Bk2\",\"Bk3\",\"Bk4\",\"Bk5\",\"Lâp\",\"Lây\"],[\"Bikua-ôko\",\"Bïkua-ûse\",\"Bïkua-ptâ\",\"Bïkua-usïö\",\"Bïkua-okü\",\"Lâpôsö\",\"Lâyenga\"],[\"Bk1\",\"Bk2\",\"Bk3\",\"Bk4\",\"Bk5\",\"Lâp\",\"Lây\"]],u,[[\"N\",\"F\",\"M\",\"N\",\"B\",\"F\",\"L\",\"K\",\"M\",\"N\",\"N\",\"K\"],[\"Nye\",\"Ful\",\"Mbä\",\"Ngu\",\"Bêl\",\"Fön\",\"Len\",\"Kük\",\"Mvu\",\"Ngb\",\"Nab\",\"Kak\"],[\"Nyenye\",\"Fulundïgi\",\"Mbängü\",\"Ngubùe\",\"Bêläwü\",\"Föndo\",\"Lengua\",\"Kükürü\",\"Mvuka\",\"Ngberere\",\"Nabändüru\",\"Kakauka\g"]],u,[[\"KnK\",\"NpK\"],u,[\"Kôzo na Krîstu\",\"Na pekô tî Krîstu\"]],1,[6,0],[\"d/M/y\",\"d MMM,o^,\",\".m>;¤-#,##0.00\",\"#E0\"],\"XAF\",\"FCFA\",\"farânga CFA (BEAC) -gcKHuxsse"se;,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb=Q(Mo
N*



%	EAAC,QAAQQ'*
6UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO%	EAAC,UAAUo
L-aAAao
MM'OAAO,EAAC,mBAAmB,EAAC,oBAAoB,EAAC,0BAA0WAAWuBAAuB,EM
`if (n === 1)\n    return 1;$seh\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"P\",\"C\",\"T\",\"N\",\"S\",\"S\"],[\"Dim\",\"Pos\",\"Pir\",\"Tat\",\"Nai\",\"Sha\",\"Sab\"],[\"Dimingu\",\"Chiposi\",\"Chipiri\",\"Chitatu\",\"Chinai\",\"Chishanu\",\"Sabudu\"],[\"Dim\",\"Pos\",\"Pir\",\"Tat\",\"Nai\",\"Sha\",\"Sab\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Fev\",\"Mar\",\"Abr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Set\",\"Otu\",\"Nov\",\"Dec\"],[\"Janeiro\",\"Fevreiro\",\"Marco\",\"Abril\",\"Maio\",\"Junho\",\"Julho\",\"Augusto\",\"Setembro\",\"Otubro\",\"Novembro\",\"Decembro\"]],u,[[\"AC\",\"AD\"],u,[\"Antes de Cristo\",\"Anno Domini\"]],0,[6,0],[\"d/M/y\",\"d 'de' MMM 'de' y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"HH:mm\",\"HH:m
#,##0.00¤fetical de Moçambique_OC!x9m"m;IAAIVOCAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS
V#ZCAAC,EAAC,C
6OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM lYAAY,EAAC,cAAc,EAAC,cAAc,EAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,cAAc,EAAC,QAAQ,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,SAASYAAYH)iBAAiB,Em T\",\"H\",\"T\",\"A\",\"P\",\"M\",\"H\"],[\"Tap\",\"Hin\",\"Tū\",\"Apa\",\"Par\",\"Mer\",\"Hor\"],[\"Rātapu\",\"Rāhina\",\"Rātū\",\"Rāapa\",\"Rāpare\",\"Rāmere\",\"Rāhoroi\"],[\"Tap\",\"Hin\",\"Tū\",\"Apa\",\"Par\",\"Mer\",\"Hor\"]],u,[[\"K\",\"H\",\"P\",\"P\",\"H\",\"P\",\"H\",\"H\",\"M\",\"N\",\"R\",\"H\"],[\"Kohi\",\"Hui\",\"Pou\",\"Pae\",\"Hara\",\"Pipi\",\"Hōngo\",\"Here\",\"Mahu\",\"Nuku\",\"Rangi\",\"Haki\"],[\"Kohitātea\",\"Huitanguru\",\"Poutūterangi\",\"Paengawhāwhā\",\"Haratua\",\"Pipiri\",\"Hōngongoi\",\"Hereturikōkā\",\"Mahuru\",\"Whiringa-ā-nuku\",\"Whiringa-ā-rangi\",\"Hakihea\"]],u,[[\"BCE\",	-MM-
 &NZD\",\"$\",\"Tāra o Aotearoa\",{\"NZj;Q?K%xshi-Tfng!shi-Tfng<EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC;IACb)UAAU(QAAQ)QAAQ, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nif (n === Math.floor(n) && (n >= 2 && n <= 10))\n    return 3;$shi-TfngF`	yćx! 	eAAe,EAAE2	];\n"]}
0x nm"nmEG7mx- 	eAAe,EAAE2export default [];\n"]}]rx*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["am", [["ጠ", "ከ"], ["ጥዋት", "ከሰዓት"], u], u, [["እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"], ["እሑድ", "ሰኞ", "ማክሰ", "ረቡዕ", "ሐሙስ", "ዓርብ", "ቅዳሜ"], ["እሑድ", "ሰኞ", "ማክሰኞ", "ረቡዕ", "ሐሙስ", "ዓርብ", "ቅዳሜ"], ["እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"]], u, [["ጃ", "ፌ", "ማ", "ኤ", "ሜ", "ጁ", "ጁ", "ኦ", "ሴ", "ኦ", "ኖ", "ዲ"], ["ጃንዩ", "ፌብሩ", "ማርች", "ኤፕሪ", "ሜይ", "ጁን", "ጁላይ", "ኦገስ", "ሴፕቴ", "ኦክቶ", "ኖቬም", "ዲሴም"], ["ጃንዩወሪ", "ፌብሩወሪ", "ማርች", "ኤፕሪል", "ሜይ", "ጁን", "ጁላይ", "ኦገስት", "ሴፕቴምበር", "ኦክቶበር", "ኖቬምበር", "ዲሴምበር"]], u, [["ዓ/ዓ", "ዓ/ም"], u, ["ዓመተ ዓለም", "ዓመተ ምሕረት"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "y MMMM d, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ETB", "ብር", "የኢትዮጵያ ብር", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CNH": ["የቻይና ዩዋን"], "ETB": ["ብር"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=am.js.map5|x0{"version":3,"file":"el.js","sourceRoot":"","sources":["el.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"el\",[[\"πμ\",\"μμ\"],[\"π.μ.\",\"μ.μ.\"],u],u,[[\"Κ\",\"Δ\",\"Τ\",\"Τ\",\"Π\",\"Π\",\"Σ\"],[\"Κυρ\",\"Δευ\",\"Τρί\",\"Τετ\",\"Πέμ\",\"Παρ\",\"Σάβ\"],[\"Κυριακή\",\"Δευτέρα\",\"Τρίτη\",\"Τετάρτη\",\"Πέμπτη\",\"Παρασκευή\",\"Σάββατο\"],[\"Κυ\",\"Δε\",\"Τρ\",\"Τε\",\"Πέ\",\"Πα\",\"Σά\"]],u,[[\"Ι\",\"Φ\",\"Μ\",\"Α\",\"Μ\",\"Ι\",\"Ι\",\"Α\",\"Σ\",\"Ο\",\"Ν\",\"Δ\"],[\"Ιαν\",\"Φεβ\",\"Μαρ\",\"Απρ\",\"Μαΐ\",\"Ιουν\",\"Ιουλ\",\"Αυγ\",\"Σεπ\",\"Οκτ\",\"Νοε\",\"Δεκ\"],[\"Ιανουαρίου\",\"Φεβρουαρίου\",\"Μαρτίου\",\"Απριλίου\",\"Μαΐου\",\"Ιουνίου\",\"Ιουλίου\",\"Αυγούστου\",\"Σεπτεμβρίου\",\"Οκτωβρίου\",\"Νοεμβρίου\",\"Δεκεμβρίου\"]],[[\"Ι\",\"Φ\",\"Μ\",\"Α\",\"Μ\",\"Ι\",\"Ι\",\"Α\",\"Σ\",\"Ο\",\"Ν\",\"Δ\"],[\"Ιαν\",\"Φεβ\",\"Μάρ\",\"Απρ\",\"Μάι\",\"Ιούν\",\"Ιούλ\",\"Αύγ\",\"Σεπ\",\"Οκτ\",\"Νοέ\",\"Δεκ\"],[\"Ιανουάριος\",\"Φεβρουάριος\",\"Μάρτιος\",\"Απρίλιος\",\"Μάιος\",\"Ιούνιος\",\"Ιούλιος\",\"Αύγουστος\",\"Σεπτέμβριος\",\"Οκτώβριος\",\"Νοέμβριος\",\"Δεκέμβριος\"]],[[\"π.Χ.\",\"μ.Χ.\"],u,[\"προ Χριστού\",\"μετά Χριστόν\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} - {0}\",u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"e\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Ευρώ\",{\"BYN\":[u,\"р.\"],\"GRD\":[\"Δρχ\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"]},\"ltr\", plural];\n"]}t>l]x0#am!am:dEAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAClBQY`IAAIBKAAK,EAAC,IAAI3Aod 2Y7-
OAAO,EAAC,OAAO"QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,OAAOn$hEAAC,CAAC,SAAS,EAAC,UAAUn$`2
gBAAgBDSAAS,Ep"`
du2WAAW
IAAI,EAAC,WAAW19UAAU#=ZF3, i = Math.floor(Math.abs(val));\n\nif (i === 0 || 
;am\",[[\"ጠ\",\"ከ\"],[\"ጥዋት\",\"ከሰዓት\"],u],u,[[\"እ\",\"ሰ\",\"ማ\",\"ረ\",\"ሐ\",\"ዓ\",\"ቅ\"],[\"እሑድ\",\"ሰኞ\",\"ማክሰ\",\"ረቡዕ\",\"ሐሙስ\",\"ዓርብ\",\"ቅዳሜ\"],[\"እሑድ\",\"ሰኞ\",\"ማክኞ\",\"ረቡዕ\",\"ሐሙስ\",\"ዓርብ\",\"ቅዳሜ\"],[\"እ\",\"ሰ\",\"ማ\",\"ረ\",\"ሐ\",\"ዓ\",\"ቅ\"]],u,[[\"ጃ\",\"ፌ\",\"ማ\",\"ኤ\",\"ሜ\",\"ጁ\",\"ጁ\",\"ኦ\",\"ሴ\",\"ኦ\",\"ኖ\",\"ዲ\"],[\"ጃንዩ\",\"ፌብሩ\",\"ማርች\",\"ኤፕሪ\",\"ሜይ\",\"ጁን\",\"ጁላይ\",\"ኦገስ\",\"ሴፕቴ\",\"ኦክቶ\",\"ኖቬም\",\"ዲሴም\"],[\"ጃንዩወሪ\",\"ፌብሩወሪ\",\"ማርች\",\"ኤፕሪል\",\"ሜይ\",\"ጁን\",\"ጁላይ\",\"ኦገስ\",\"ሴፕቴምበር\",\"ኦክቶበር\",\"ኖቬምበር\",\"ዲሴምበር\"]],u,[[\"ዓ/ዓ\",\"ዓ/ም\"],u,[\"ዓAመተ ዓለም\",\"ዓመተ ምሕረት\"]],0,[6,0],[\"dd/MM/y MMMM d, EEEEIH6 {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"EE`¤#,##0.00\",\"#E0\"],\"ETB\",\"ብር\",\"የኢትዮጵያ ብር\",{\"AUD\":[\"AU$\",\"$\"],O4CNH\":[\"የቻይና ዩዋን\"],\"ETB\":[\"ብርtCB,\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}\x1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    ARS: string[];
    AUD: string[];
    BEF: string[];
    BMD: string[];
    BND: string[];
    BYN: (string | undefined)[];
    BZD: string[];
    CAD: string[];
    CLP: string[];
    CNY: (string | undefined)[];
    COP: string[];
    CYP: string[];
    EGP: (string | undefined)[];
    FJD: string[];
    FKP: string[];
    FRF: string[];
    GBP: string[];
    GIP: string[];
    HKD: (string | undefined)[];
    IEP: string[];
    ILP: string[];
    ITL: string[];
    JPY: (string | undefined)[];
    KMF: (string | undefined)[];
    LBP: string[];
    MTP: string[];
    MXN: string[];
    NAD: string[];
    NIO: (string | undefined)[];
    NZD: string[];
    PHP: (string | undefined)[];
    RHD: string[];
    RON: (string | undefined)[];
    RWF: (string | undefined)[];
    SBD: string[];
    SGD: string[];
    SRD: string[];
    TOP: (string | undefined)[];
    TTD: string[];
    TWD: (string | undefined)[];
    USD: string[];
    UYU: string[];
    WST: string[];
    XCD: (string | undefined)[];
    XPF: string[];
    ZMW: (string | undefined)[];
} | undefined)[];
export default _default;
v$[xKzED: string[];
    ARSmAUD: string[];
    BBDmBHD: string[];
    BMDmBSDm&ooCNY: string[];
    COPmCUPmDOPm)DZD: string[];
    EGP: string[];
    FJDmYDm<HKD: string[];
    IQD: string[];
    IRR: string[];
    JMDm<JOD: string[];
    JPY: string[];
    KWD: string[];
    KYDmLRDm)LYD: string[];
    MAD: string[];
    MRU$OMR1)QAR: string[];
    SAR: string[];
    SBDmDD: string[];
    SDGo;YP: string[];
    THB: string[];
    TND: string[];
    TTDmTWD: string oYER: string/25x IzT{%GM: string[];
    BGO1CUCmDEM: string[];
    FKPmGHSmGNlt!"J!URmj"AYP: never[];
    THB: string[];
    TWD: string[];
    XXX: never~PQ3=zx const _default: ({+W
&x yJPY#+c#sLx 9	zUDmBRLm!CADm2!ESP: string[];
    EURmFKPmGBPm"LSmINRmS"RWmMXNmNZDm"J SSPmYPm!VElVNDm
XAF: neverJ*	OF: never/q7!!x 1
zUDmBRLm!CADm2!ESP: string[];
    EURmFKPmGBPm"LSmINRmS"RWmMXNmNZDmPAB2J SSPmYPm&oVElVNDm
XAF: neverJ*	OF: never/8~x% const _default: string[][]52x D	z& CADVEEL: never[];
    HKD: string/LSmINRmITL: string[];
    KRWmLBPmoG33VNDm
XAF: neverJ*OF: never[];
    XPF: never/C6o|x  DF*`x' yBBD$%GHSmJPY-+tx N^L@(xN 	~string[];
    BRLv9!{!THB: string[];
    US@t"XX6EGnx 		 US&M!xI 	GP: never[];
    ESP: stringkRTHB: string)USD: stringZtAKDyxl 	AM: string[];
    BRLd2 sBHRK: stringUR?US B!u!PF: never[];
    XXX6w!x
J/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-QA", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "QAR", "ر.ق.‏", "ريال قطري", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-QA.js.mapCxV AE6, 0 3)AED", "د.إ.‏", "درهم إماراتv~	AE.js.mapw^#x{"version":3,"file":"ar-QA.js","sourceRoot":"","sources":["ar-QA.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-QA\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"QAR\",\"ر.ق.‏\",\"ريال قطري\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}Frxu 33AE$AE@&cAAc,E
6
(@
Fx~AE06,0K+AED\",\"د.إ.‏\",\"درهم إماراتlK. vx33LB$LB@cAAc,EAAC,MAAM$,IAAI,EAAC,OAAO,EAAC,aAAa,EAAC,cAAc,EAAC,aAAa
aAAa,E
6
(@
F(
-LB0o\",\"ش\",\"آ\",\"ن\",\"أ\",\"ح\",\"ت\",\"آ\",\"أ\",\"ت\",\"ت\",\"ك\"],[\"كانون الثاني\",\"شباط\",\"ذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشر*ن الثاني\",\"كانون الأولM1,[6,0,\",\".)LBP\",\"ل.ل.‏\",\"جنيه لبنانl{&x
D/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-BH", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "BHD", "د.ب.‏", "دينار بحريني", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-BH.js.mapXx{"version":3,"file":"ar-BH.js","sourceRoot":"","sources":["ar-BH.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QAClE,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACnE,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,WAAW,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,OAAO,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-BH\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"BHD\",\"د.ب.‏\",\"دينار بحريني\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}ʋx
</**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-DJ", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "DJF", "Fdj", "فرنك جيبوتي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DJF": ["Fdj"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-DJ.js.map(x{"version":3,"file":"ar-YE.js","sourceRoot":"","sources":["ar-YE.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-YE\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],0,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"YER\",\"ر.ي.‏\",\"ريال يمني\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}t		rx o34DJ$DJ@KAAK,EAAC,aAAa,E
6
(@
F@
F	>DJ06,[6,0K#DJF\",\"Fdj\",\"فرنك جيبوتl8JF\":[\"FdjG1'xw3
fr-DJ!fr-DJ@]eAAe,CAAC,CAAC,C
MAAM>


$UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUPo
MAAM>

YAAY,EAAC,MAAM,EAAC,MAAMP
<



OAAO,CAAC,CAAC7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}Bóx
L/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-DZ", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ج", "ف", "م", "أ", "م", "ج", "ج", "أ", "س", "أ", "ن", "د"], ["جانفي", "فيفري", "مارس", "أفريل", "ماي", "جوان", "جويلية", "أوت", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [",", ".", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "DZD", "د.ج.‏", "دينار جزائري", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-DZ.js.map?x{"version":3,"file":"ar-DZ.js","sourceRoot":"","sources":["ar-DZ.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QAClE,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACnE,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,WAAW,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,OAAO,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-DZ\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ج\",\"ف\",\"م\",\"أ\",\"م\",\"ج\",\"ج\",\"أ\",\"س\",\"أ\",\"ن\",\"د\"],[\"جانفي\",\"فيفري\",\"مارس\",\"أفريل\",\"ماي\",\"جوان\",\"جويلية\",\"أوت\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\",\",\".\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"DZD\",\"د.ج.‏\",\"دينار جزائري\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}%0x
J/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-EG", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "EGP", "ج.م.‏", "جنيه مصري", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-EG.js.mapБyx{"version":3,"file":"ar-EG.js","sourceRoot":"","sources":["ar-EG.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-EG\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"EGP\",\"ج.م.‏\",\"جنيه مصري\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}'۷x
H/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-EH", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MAD", "د.م.‏", "درهم مغربي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-EH.js.mapsx{"version":3,"file":"ar-EH.js","sourceRoot":"","sources":["ar-EH.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-EH\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],1,[6,0],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"MAD\",\"د.م.‏\",\"درهم مغربي\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}^~txu 33SD$SD@MAAM,EAAC,aAAa,E
6
(@
F	SD06,[5,6K&SDG\",\"ج.س.\",\"جنيه سودانnxU*xxp 33TD$TD@MAAM,EAAC,iBAAiB,E
6
(@
F	TD0+XAF\",\"FCFA\",\"فرنك وسط أفريقnx:)'wxw3
fr-TD!fr-TD@]eAAe,CAAC,CAAC,C
MAAM>


$UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUPo
MAAM>

YAAY,EAAC,MAAM,EAAC,MAAMP
<



OAAO,CAAC,CAAC7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}w0ټGx|/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    AUD: (string | undefined)[];
    BBD: string[];
    BMD: string[];
    BRL: string[];
    BSD: string[];
    BYN: (string | undefined)[];
    BZD: string[];
    CNY: (string | undefined)[];
    DKK: string[];
    DOP: string[];
    EEK: string[];
    EGP: string[];
    ESP: never[];
    GBP: (string | undefined)[];
    HKD: (string | undefined)[];
    IEP: string[];
    INR: (string | undefined)[];
    ISK: string[];
    JMD: string[];
    JPY: (string | undefined)[];
    KRW: (string | undefined)[];
    NOK: string[];
    NZD: (string | undefined)[];
    PHP: (string | undefined)[];
    RON: (string | undefined)[];
    SEK: string[];
    TWD: (string | undefined)[];
    USD: string[];
    VND: (string | undefined)[];
} | undefined)[];
export default _default;
)e		x hRL!CADCNYESP: string[];
    EUCLS V!MXNNZD!!4    XAF: never[];
    XCD
XOF: neverM/\.u$/xIz(RS: string[];
    AUD: string[];
    BEF$NFAD: string[];
    CLP
1)COP: string[];
    CYP: string[];
    EGPbFJD: string[];
    FKP: string[];
    FRF: string[];
    GBP: string[];
    GIP: string[];
    HKDLP: string[];
    ITL%2MFbLBP: string[];
    MTP: string[];
    MUR: string[];
    MXN: string[];
    NAD: string[];
    NIONZD: string[];
    PHPRHD: string[];
    RONRWF<SBD: string[];
    SGD: string[];
    SRD: string[];
    TOPTTDD)UYU: string[];
    WST: string[];
    XCDXPF: string[];
    ZMWQ+>Xx yJPY#USD: string/I
x LUF$	J%'xUzED: string[];
    ARSmAUD: string[];
    BBDmBHD: string[];
    BMDmBNDmBSDm&ooCNY: string[];
    COPmCUPmDOPm)DZD: string[];
    EGP: string[];
    FJDmYDm<HKD: string[];
    IQD: string[];
    IRR: string[];
    JMDmJOD0$string[];
    KWD: string[];
    KYDmRDm)LYD: string[];
    MAD: string[];
    MRU$OMR1)QAR: string[];
    SAR: string[];
    SBDm(DD: string[];
    SDG: string[];
    SOSo;YP: string[];
    THB: string[];
    TND: string[];
    TTDmTWD: string oYER: string/1%
xUzED: string[];
    ARSmAUD: string[];
    BBDmBHD: string[];
    BMDmBNDmBSDm&ooCNY: string[];
    COPmCUPmDOPm)DZD: string[];
    EGP: string[];
    FJDmYDm<HKD: string[];
    IQD: string[];
    IRR: string[];
    JMDmJOD0$string[];
    KWD: string[];
    KYDmRDm)LYD: string[];
    MAD: string[];
    MRU$OMR1)QAR: string[];
    SAR: string[];
    SBDmDD: string[];
    SDGoNSP: string[];
    SYP: string[];
    THB: string[];
    TND: string[];
    TTDmTWD: string oYER: string/nx EzT{%GM: string[];
    BGO1CUCmDEM: string[];
    FKPmGHSmGNla!"J!URmj"AYP: never[];
    THB: string[];
    TWD: string[];
    XXX: never~&4Z7x AzT{%GM: string[];
    BGO1CUCmDEM: string[];
    FKPmGHSmGNla""J!URmj"AYP: never[];
    THB: string[];
    TWD: string[];
    XXX: never~& 5x yBSD0string+	Z1x' yJPY: stringZAR: string/ugx #
zUDmBRLm!CADm2"(RC: string[];
    ESP: string[];
    EURmFKPmGBPm"LSmINRm@"RWmMXNmNZDm"J SSPmYPm&oVElVNDm
XAF: neverJ*	OF: never/=<Rx 1
zUDmBRLm!CADm2!ESP: string[];
    EURmFKPmGBPmGTQ2LSmINRm@"RWmMXNmNZDm"J SSPmYPm&oVElVNDm
XAF: neverJ*	OF: never/w8	/x jyBYNmGNlWJPY: string[];
    MRU: string[];
    NGN: string[];
    PGK: string[];
    PHP: stringXAF: string[];
    XOF: string/#+Sx$ FRFWHTG: string&Dx FRFMRU6w-x FRF峨N	Wx z
TS: string/Z|x- zU2JPY2J TWD: string+E\8x. y2!ERN: string[];
    ETB01+E%uxd zU2ILR0$string[];
    KRW: string[];
    MOP2URmTWD: string
XXX: never/hx3 zU2MOP2J!URm
XXX: never/x iERNYNH5&x pzUD: string[];
    BRLW!CAaCNYESP: string[];
    FRF!THB: string[];
    USaVEFXCa
XXX: never/(Dx yERN#G+ZZ`x MRU|+GLx5 
	zRS: string[];
    AUD1stringLx 
	b16/x6 

EGP: never)JTHB: string
.stringb		x m

~string[];
    BDT!BCUEG1!s!cISK
PYGSCR: string[];
    SEKBUYUub    XPF: string/jq**x' 
	CUP: string~stringLox LRD6Jo x n擓&O+?	Cx y&O+KGo!x TOPJ/=Y=x yJPY#No+_Jcxn CAD: string[];
    FJD#BCSBD: string[];
    THB: string[];
    TWD: string[];
    XPF: neverYAB. `x= JPYDPTE: string[];
    ROTHB: string3*o+Nxoox SLLJ/Qix yBDT|D!STD(`P	x> DKK: string[];
    ISK1NOK!!SEK(`Xocx yJPYQ7' x  ӓ[] | undefined)[]k
l/x4 )const _default: ((string[] | undefined)[]^* Arxs y!GMD: string[];
    GNF1)NGN: string[];
    PGK: string[];
    PHP>    XAF: string[];
    XOFQ7. txs y!GNF1<NGN: string[];
    PGK: string[];
    PHP: string[];
    SLL>    XAF: string[];
    XOFQ7p *vx nJPY>JO9Tx" yGNF: string[];
    JPY>J
Ix* y!DKK: string[];
    JPY1N:bxC yBN{2CAD2XMYR1TWD: string[];
    USD]+lTx1 y!CAD2XMYR1SGD+(]+ilx 8~BRL!CADCNYHKDILSINR#KRWMXNOK: string[];
    NZD!"WDUSDVNDXAF: never[];
    XCDXPF: never[];
    XXX: neverY/ 7jx y4NPR1(N:{&x zOA: string[];tL
7@x2 y4KES1(&TZS: string[];
    UGX>JRx y!LKR1("]+x+x# y!MYR1SGD: string h8
]x [OB|1COP: string[];
    JPYeSCR: string[];
    SYP(5S    VES: string[];
    XAF: string[];
    XOF: string[];
    XPF: string[];
    ZMW]+Jy.xT )ILR: string[];
    JPY: string[];
    KRW1RUR;"    XXX: neverY/ r/sx9 !!RURUSD: string[];
    XXX: neverY/	=dkRx `5ox y&:/]x v	LP: string[];
    CNY!ESP: string[];
    EUR!FKP!GBP!ǓbSSP!SYP!Z&string[];
    VEF!UOF6%x2 	
]IO: string[];
    NZDFGYx6 	!	GP: never)!THB: string
<l{x yKR>J<x" CDF: string[];
    JPY>JD
Mx zFNEKRQ7NpoUx yBMD].Loqx yGMD]/Q-x 'z;TS: string[];
    AUD: string[];
    BGM: string[];
    BGO|1CUCDEM: string[];
    EURFKPGHSGNFKMF"O!RWFSYP: never[];
    THB: string N    ZMW}i`;x GHS#THB+\+u>x% yJPY: string[];
    NZ* \+}
rx* yFKP: string[];
    GBP#;\+F+x yGBP#SHP+\+xUx (SGD: string gQXgx yFJD#:C"x. yBBD: string[];
    DJF|#SOS [.nx GNJ)o7x PGKJ.HnTx SGK)xB/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-IQ", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ك", "ش", "آ", "ن", "أ", "ح", "ت", "آ", "أ", "ت", "ت", "ك"], ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"], ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"]], [["ك", "ش", "آ", "ن", "أ", "ح", "ت", "آ", "أ", "ت", "ت", "ك"], ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"], u], [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "IQD", "د.ع.‏", "دينار عراقي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-IQ.js.map8VKxeERX", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, A1, [6, 0$3#ERN", "Nfk", "ناكفا أريتر~iERN": ["Nfk		ER.js.map|xh{"version":3,"file":"ar-IQ.js","sourceRoot":"","sources":["ar-IQ.ts"],"names":[],"mappings":"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,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-IQ\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ك\",\"ش\",\"آ\",\"ن\",\"أ\",\"ح\",\"ت\",\"آ\",\"أ\",\"ت\",\"ت\",\"ك\"],[\"كانون الثاني\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشرين الثاني\",\"كانون الأول\"],[\"كانون الثاني\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشرين الثاني\",\"كانون الأول\"]],[[\"ك\",\"ش\",\"آ\",\"ن\",\"أ\",\"ح\",\"ت\",\"آ\",\"أ\",\"ت\",\"ت\",\"ك\"],[\"كانون الثاني\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشرين الثاني\",\"كانون الأول\"],u],[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"IQD\",\"د.ع.‏\",\"دينار عراقي\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}Z%x;4ER$ER@OAAO,EAAC,QAAQ$OAAO,EAAC,OAAO$.
QAAQa:
KAAK,EAAC,cAAcP	FP	FP	i	P	`0-{K`TERo\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u`E1,[6,0K%ERN\",\"Nfk\",\"ناكفا أريترERN\":[\"Nfk'x
G/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-IL", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 0, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "ILS", "₪", "شيكل إسرائيلي جديد", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-IL.js.map}ժݷx{"version":3,"file":"ar-IL.js","sourceRoot":"","sources":["ar-IL.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-IL\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],0,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"ILS\",\"₪\",\"شيكل إسرائيلي جديد\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}%<x
(/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-JO", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ك", "ش", "آ", "ن", "أ", "ح", "ت", "آ", "أ", "ت", "ت", "ك"], ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "JOD", "د.أ.‏", "دينار أردني", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-JO.js.map@I3x{"version":3,"file":"ar-JO.js","sourceRoot":"","sources":["ar-JO.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-JO\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ك\",\"ش\",\"آ\",\"ن\",\"أ\",\"ح\",\"ت\",\"آ\",\"أ\",\"ت\",\"ت\",\"ك\"],[\"كانون الثاني\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشرين الثاني\",\"كانون الأول\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"JOD\",\"د.أ.‏\",\"دينار أردني\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}5*Px/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    AUD: (string | undefined)[];
    BRL: (string | undefined)[];
    BYN: (string | undefined)[];
    CAD: (string | undefined)[];
    CNY: (string | undefined)[];
    ESP: string[];
    EUR: (string | undefined)[];
    FKP: (string | undefined)[];
    GBP: (string | undefined)[];
    HKD: (string | undefined)[];
    HNL: string[];
    ILS: (string | undefined)[];
    INR: (string | undefined)[];
    JPY: (string | undefined)[];
    KRW: (string | undefined)[];
    MXN: (string | undefined)[];
    NZD: (string | undefined)[];
    PHP: (string | undefined)[];
    RON: (string | undefined)[];
    SSP: (string | undefined)[];
    SYP: (string | undefined)[];
    TWD: (string | undefined)[];
    USD: (string | undefined)[];
    VEF: (string | undefined)[];
    VND: (string | undefined)[];
    XAF: never[];
    XCD: (string | undefined)[];
    XOF: never[];
} | undefined)[];
export default _default;
5x' 
	DOP: stringpstringL]6x2 	
OB: string[];
    BRLc1Fnvx 		C(*xV	z`RS: string[];
    AUD: string[];
    BEF: string[];
    BMD: string[];
    BND: string[];
    BY<BZD: string[];
    CAD: string[];
    CLP: string[];
    CNY(COP: string[];
    CYP: string[];
    EGjFJD: string[];
    FKP: string[];
    FRF: string[];
    GBP: string[];
    GIP: string[];
    GNF: string*;EP: string[];
    ILP: string[];
    ITL: string[];
    JPYKMFOLBP: string[];
    MTP: string[];
    MXN: string[];
    NAD: string[];
    NIONZD: string*
HD: string)RWF;SBD: string[];
    SGD: string[];
    SRD: string[];
    TOTTD: string
<)UYU: string[];
    WST: string[];
    XCDXPF: string[];
    ZMW+O'8xuzED: string[];
    ARSAUD: string[];
    BBDBHD: string[];
    BMDBNDBSD&CNY: string[];
    COPCUPDOP)DZD: string[];
    EGP: string[];
    FJDYD<HKD: string[];
    IQD: string[];
    IRR: string[];
    JMDOJOD: string[];
    JPY: string[];
    KMF: string[];
    KWD: string[];
    KYDLRD)LYD: string[];
    MAD: string[];
    MRU$OMR1)QAR: string[];
    SAR: string[];
    SBD(DD: string[];
    SDG: string[];
    SRD;YP: string[];
    THB: string[];
    TND: string[];
    TTDTWD: string$ YER: string/V<x stringAr!bx6 yBBD$
OB: string.GHSJPY1,+WEx yJMD: string-:-	enx nGNF: string-:D%x
=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-KM", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "KMF", "CF", "فرنك جزر القمر", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KMF": ["CF"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-KM.js.map±x{"version":3,"file":"ar-KM.js","sourceRoot":"","sources":["ar-KM.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-KM\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],1,[6,0],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"KMF\",\"CF\",\"فرنك جزر القمر\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KMF\":[\"CF\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}Ѱx
F/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-KW", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "KWD", "د.ك.‏", "دينار كويتي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-KW.js.mapvfx{"version":3,"file":"ar-KW.js","sourceRoot":"","sources":["ar-KW.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-KW\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"KWD\",\"د.ك.‏\",\"دينار كويتي\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}x
;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-LB", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ك", "ش", "آ", "ن", "أ", "ح", "ت", "آ", "أ", "ت", "ت", "ك"], ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [",", ".", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "LBP", "ل.ل.‏", "جنيه لبناني", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-LB.js.mapc"x
H/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-LY", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [",", ".", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "LYD", "د.ل.‏", "دينار ليبي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-LY.js.map1x{"version":3,"file":"ar-LY.js","sourceRoot":"","sources":["ar-LY.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-LY\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\",\",\".\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"LYD\",\"د.ل.‏\",\"دينار ليبي\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}[sǰx
V/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-MA", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "م", "ن", "ل", "غ", "ش", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "ماي", "يونيو", "يوليوز", "غشت", "شتنبر", "أكتوبر", "نونبر", "دجنبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [",", ".", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MAD", "د.م.‏", "درهم مغربي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-MA.js.mapC?x){"version":3,"file":"ar-MA.js","sourceRoot":"","sources":["ar-MA.ts"],"names":[],"mappings":"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AAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-MA\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"م\",\"ن\",\"ل\",\"غ\",\"ش\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"ماي\",\"يونيو\",\"يوليوز\",\"غشت\",\"شتنبر\",\"أكتوبر\",\"نونبر\",\"دجنبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],1,[6,0],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\",\",\".\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"MAD\",\"د.م.‏\",\"درهم مغربي\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}C>x
G/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-MR", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "إ", "و", "ن", "ل", "غ", "ش", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "إبريل", "مايو", "يونيو", "يوليو", "أغشت", "شتمبر", "أكتوبر", "نوفمبر", "دجمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [",", ".", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MRU", "أ.م.", "أوقية موريتانية", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-MR.js.mapBŻx{"version":3,"file":"es-PR.js","sourceRoot":"","sources":["es-PR.ts"],"names":[],"mappings":"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,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4;\nreturn 5;\n}\n\nexport default [\"es-PR\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"E\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"MM/dd/yy\",\"MM/dd/y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",\"{1} {0}\",\"{1}, {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"¤#,##0.00\",\"#E0\"],\"USD\",\"$\",\"dólar estadounidense\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£\"],\"TWD\":[u,\"NT$\"],\"VEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}@`	xw-3ar-M"ar-M?	CAAC;IAEdA-$GAAG,GAAG,KAAK,IAAI!	GAAG,GAAGq<GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QAClEGAAG,GAAG,KAAK,IAAI!	GAAG,GAAGq<GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACnEQ;i;
QAAQ,EAAC,OAAO,C`Am
UAAU,EAAC,QAAQ,EAAC,QAAQ|$`
"QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK&e#MAAM.

QAAQ|;
;
aAAa,EAAC,QAAQ&$iWAAW,EAAC,UAAU=%>CAAC,EAAC,YAAYq8
-WAAW	
\
YAAY

iBAAiB,E1	O
OAAO/	/-FOAAO/	_>nFPFOAAO/	O
OAAO`LF>OAAO/	O
MAAM/	/-OAAO/	O
>OAAO/	/-OAAO`LOAAO/	O
OAAO/	O
MAAM/	O
>>OAAO/	O
-OAAO/	O
OAAO/	/-OAAO/	O
MAAM/	/-OAAO
$6
OAAO/	/->F	OAAO,CAAC7 ;\n\nif (n === 0)\n    return 0;]#n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 ==8= Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 995ar-MR\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"البت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"إ\",\"و\",\"ن\",\"ل\",\"غ\",\"ش\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"إبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغشت\",\"شتمبر\",\"أكتوبر\",\"نوفمبر\",\"دجمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],1,[6,0],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMMRCu,\"{1} في {0}\",u],[\",\",\".\",\";\",\"‎%‎\",\"‎+\",\"‎s#ليس رقمًا %\",\"¤ #,##0.00\",\"#E0\"],\"MRU\",\"أ.م.\",\"أوقية موريتانية\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BY)BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"Y.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏-QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"UIS$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}zXBxi-4ar-SO!ar-SO@	CAAC;IAEdA-$GAAG,GAAG,KAAK,IAAI!	GAAG,GAAGq<GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QAClEGAAG,GAAG,KAAK,IAAI!	GAAG,GAAGq<GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACnEQ;i;
QAAQ,EAAC,OAAO,C`Am
UAAU,EAAC,QAAQ,EAAC,QAAQ|$`
"QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK&e#MAAM.

QAAQ,EAAC,QAAQ ;
;
aAAa,EAAC,QAAQ&$iWAAW,EAAC,UAAU=%>CAAC,EAAC,YAAYqB-WAAW	
\
YAAY
GAAG,EAAC,YAAY,E1	O
OAAO/	/-FOAAO/	_>nFPFOAAO/	O
OAAO`LF>OAAO/	O
MAAM/	/-OAAO/	O
>OAAO/	/-OAAO`LOAAO/	O
OAAO/	O
MAAM/	O
>>OAAO/	O
-OAAO/	O
OAAO/	/-OAAO/	O
MAAM/	O
6
(>OAAO
$6
OAAO/	/->F	OAAO,CAAC7 ;\n\nif (n === 0)\n    return 0;]#n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 ==8= Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 995ar-SO\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"البت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],1,[6,0],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMMRu,\"{1} فيH٪\",\"‎+\",\"‎s#ليس رقمًا %\",\"¤ #,##0.00\",\"#E0\"],\"SOS\",\"S\",\"شلن صومالي\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$g\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"Y.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏-QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SOS\":[\"S\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$Y\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}&N	x-&ca-IT!ca-IT@!	CAAC;IAEj lB:Fp[Fc%UAAUPQ'#:A(]
k
m
fSAAS,E0
pSAAS"WAAW,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS	.SAAS,EAAC,aAAa,EAAC,WAAW,EAAC,aAAa,EAAC,aAAa,C`:A(]
k
	CAAC,MAAMMAAM,EAAC,MAAM,EAAC,MAAM
$MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CMAAMMAAM,EAAC,QAAQ,EAAC,OAAO,EU"UAAU,C`:k
6gBAAgB,EAAC,kBAAk>$eAAe,EAAC,qBAAqB,CAAC,EAAC,CAAC,MAAM	C
m
oBAAoBq\
YAAY
GAAG,EAAC,MAAM,E1	O

			6
PMAAM/	2=*;\n\nif (i === 1 && v === 0)\n    return 1%ca-IT	(g\",\"dl\",\"dt\",\"dc\",\"dj\",\"dv\",\"ds\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"],[\"diumenge\",\"dilluns\",\"dimarts\",\"dimecres\",\"dijous\",\"divendres\",\"dissabte\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"]],u,[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"de gen.\",\"de febr.\",\"de març\",\"d’abr.\",\"de maig\",\"de juny\",\"de jul.\",\"d’ag.\",\"de set.\",\"d’oct.\",\"de nov.\",\"de des.\"],[\"de gener\",\"de febrer\",\"de març\",\"d’abril\",\"de maig\",\"de juny\",\"de juliol\",\"d’agost\",\"de setembre\",\"d’octubre\",\"de novembre\",\"de desembre\"]],[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"gen.\",\"febr.\",\"març\",\"abr.\",\"maig\",\"juny\",\"jul.\",\"ag.\",\"set.\",\"oct.\",\"nov.\",\"des.\"],[\"gener\",\"febrer\",\"març\",\"abril\",\"maig\",\"juny\",\"juliol\",\"agost\",\"setembre\",\"octubre\",\"novembre\",\"desembre\"]],[[\"aC\",\"dC\"]R,u,[\"abans de Crist\",\"després de Crist\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"dMMMM 'de' y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss (zzzz)\"],[\"{1} {0}\",\"{1}, {0}\",\"{1}, 'a' 'les' {0}\",u],[\",\",\".\]H%\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AUD\":[\"AU$\"
hMXN$#NTHB\":[\"฿\"],\"USD\":[u,\"$\"],\"VEF\":[u,\"Bs F\"],\"XCD\":[u,\"$\"],\"XXXd]W!xr-ckb-I"ckb-I?	CAAC;IAEd.(QAAQ,EAAC,C;1i
UAAU	P:24W#eAAe

@UAAU,EAAC,QAAQ,EAAC,KAAK,EAAC,SAAS,EAAC,cAAc,EAAC,cAAc,EAAC,cAAc;WAAW ;1iSAAS,EAAC,YAAY="OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe6;2IAAI.
(\
YAAY
 o5	O
OAAO/	O

	
=Z""ckb-IR\",[[\"ب.ن\",\"د.ن\"],u,u],u,[[\"ی\",\"د\",\"س\",\"چ\",\"پ\",\"ھ\",\"ش\"],[\"یەکشەممە\",\"دووشەممە\",\"سێشەممە\",\"چوارشەممە\",\"پێنجشەممە\",\"ھەینی\",\"شەممە\"],u,[\"١ش\",\"٢ش\",\"ش\",\"٤ش\",\"٥ش\",\"ھ\",\"ش\"]],u,[[\"ک\",\"ش\",\"ئ\",\"ن\",\"ئ\",\"ح\",\"ت\",\"ئ\",\"ئ\",\"ت\",\"ت\",\"ک\"],[\"کانوونی دووەم\",\"شوبات\",\"ئازار\",\"نیسان\",\"ئایار\",\"حوزەیران\",\"تەموو\",\"ئاب\",\"ئەیلوول\",\"تشرینی یەکەم\",\"تشرینی دووەم\",\"کانونی یەکەم\"],u],u,[[\"پێش زایین\",\"زایینی\"],u,u],6,[5,5],[\"y-MM-dd\",\"y MMM d\",\"dی MMMMی y\",\"y MMMM d, EEEE\"],[\"HH:mm\",\"=HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,uN‎mL%\",\"¤ #,##0.00\",\"#E0\"],\"IRR\",\"IRR\",\"IRR\",{\"IQD\":[\"د.ع.‏\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"rtl\", plural];\n"]}$.t"xC-,n-AU"n-AU@!	CAAC;IAEj lBQ:k
61
,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI`AQAAQ"WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU*"KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,_#A
2
m
MAAM,E!cUAAU,C`ғ om
MAAM,E!cUAAU,C`:k
CAAC,eAAe,EAAC,aAAa&$iEAAC,Cm
C%>CAAC,EAAC,cAAcq\
/
+	#mBAAmB,E1	O
6
(	#
	(	F#
_		
	(	F		KAAK,CAAC7*;\n\nif (i === 1 && v === 0)\n    return 1&n-AU\",[[\"am\",\"pm\"],u,u],u,[[\"Su.\",\"M.\",\"Tu.\",\"W.\",\"Th.\",\"F.\",\"Sa.\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mon\",\"Tu\"),\"Wed\",\"Th\",\"Fri\",\"Sat\"]],u,[[\"JIJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"June\",\"July\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],[[\"J\",\"F\",\"M\"#;Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:<u,\"{1} 'at'H1ez?BAUD\",\"$\",\"Australian Dollar\",{\"AUD\":[\"$\"],\"BDT\":[u,\"Tk;%!CUP\":[u,\"₱\"],\"EGP\":[u,\"£lMISK\":[u,\"KrePYG\":[u,\"Gs\"],\"SCR\":[\"Rs\"],\"SEK\":[u,\"Kr\"],\"TWD\":[u,\"$\"],\"USD\":[u,\"$\"],\"UYU\":[u,\"$U\"],\"VND\":[u,\"₫\"](*,\"XPF\":[\"CFP\"]},\"ltr\", plural];\n"]}%$tx-.CU$CU@""OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe$maAAa,E1	O
7	6
v
	>(	CU	1,[6,0],[\"d/M/yy\",\"d MMM <.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ssCUP\",\"$\",\"peso cubanod
CUP\":[\"$Z<USD\":[\"US$\",\"lS[Rx(-	ff-Latn-L"	ff-Latn-L?
CAAC;IAE7ClB="YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,SAAS+1MAAM,EAAC,QAAQ,EAAC,UAAU@WYAAYPQ'd#Po2x
QAAQ$QAAQ,EAAC,UAAU'#;
	
aAAa&$i,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,eAAeD
6;\
YAAY
GAAG,EAAC,kBAAkB,E1	O

	6

=*;\n\nif (i === 0 || i === 1)\n    return 1%$ff-Latn-LR\",[[\"subaka\",\"kikiiɗe!a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMMJ {0}\",u,u,u],[\",\",\" \]%\",\"#,##0.00 ¤\",\"#E0\"],\"LRD\",\"$\",\"Dolaar Liberiyaa\",{\"JPY\":[\"JP¥\",\"¥\"],\"LRD\":[\"$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}8RSx)-	ff-Latn-M"	ff-Latn-M?
CAAC;IAE7ClB="YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,SAAS+1MAAM,EAAC,QAAQ,EAAC,UAAU@WYAAYPQ'd#Po2x
QAAQ$QAAQ,EAAC,UAAU'#;
	
aAAa&$i,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,eAAeD
6;\
YAAY
IAAI,EAAC,iBAAiB,E1	O

		
=*;\n\nif (i === 0 || i === 1)\n    return 1%$ff-Latn-MR\",[[\"subaka\",\"kikiiɗe!a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMMJ {0}\",u,u,u],[\",\",\" \]%\",\"#,##0.00 ¤\",\"#E0\"],\"MRU\",\"UM\",\"Ugiyya Muritani\",{\"JPY\":[\"JP¥\",\"¥\"],\"MRU\":[\"UM\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}x 
-3fr-HT!fr-HT@lB:k
61i@MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMUAAU,EAAC,OAAO,EAAC,UAAU o;P#x


MAAM,EAAC,MAAMSAAS,EAAC,MAAM,EAAC,OAAOSAAS,EAAC,MAAM,EAAC,WAAW]UAAU&$WAAW,EAAC,WAAW+oBAAoB,EAAC,oBAAo>
c6eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAem
aAAaqYAAY
GAAG,EAAC,kBAAkB,E1	O

	
		
	
		
	
	
	7
	>F
	
	6

	
	U>>>(	(	
f>
	
		
	7>(	(	
	
	
		
	>
	
	>(	MAAM/	O
	=&i === 0 || idfr-HT\",[[\"AM\",\"PM\"],u,u],u2im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JIjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" \e#,##0.00 ¤\",\"#E0\"],\"HTG\",\"G\",\"gourde haïtienne\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\*"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\" BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"HTG\":[\"G\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\")HD\":[\"$RHARWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$|USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}
=x
-3fr-MQ!fr-MQ@lB:k
61i@MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMUAAU,EAAC,OAAO,EAAC,UAAU o;P#x


MAAM,EAAC,MAAMSAAS,EAAC,MAAM,EAAC,OAAOSAAS,EAAC,MAAM,EAAC,WAAW]UAAU&$WAAW,EAAC,WAAW+oBAAoB,EAAC,oBAAo>
c6eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAem
aAAaqYAAY
GAAG,EAAC,MAAM,E1	O

	
		
	
		
	
	
	7
	>F
	
	6

	
	7>>>(	(	
f>
	
		
	7>(	(	
	
	
		
	>
	
	>(	MAAM/	O
	=&i === 0 || idfr-MQ\",[[\"AM\",\"PM\"],u,u],u2im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JIjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" \e#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\" BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\")HD\":[\"$RHARWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$|USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}GQx	I-4fr-M"fr-M?lB:k
61i@MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMUAAU,EAAC,OAAO,EAAC,UAAU o;P#x


MAAM,EAAC,MAAMSAAS,EAAC,MAAM,EAAC,OAAOSAAS,EAAC,MAAM,EAAC,WAAW]UAAU&$WAAW,EAAC,WAAW+oBAAoB,EAAC,oBAAo>
ceAAeD
m
aAAaqYAAY
IAAI,EAAC,qBAAqB,E1	O

	
		
	
		
	
	
	7
	>F
	
	6

	
	7>>>(	(	
f	>
	
		
	7>(	(	
	
	
		
	>
	
	>(	MAAM/	O
	=&i === 0 || idfr-MR\",[[\"AM\",\"PM\"],u,u],u2im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JIjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMMJ4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" \e#,##0.00 ¤\",\"#E0\"],\"MRU\",\"UM\",\"ouguiya mauritanien\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"-],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\" BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MRU\":[\"UM\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\")HD\":[\"$RHARWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$|USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}3x#-&so-ET!so-ET@	CAAC;IAEd.<:k
:k
6:{AIAAI#
MAAMCAAC,EAAC,CAAC,MAAM>
`
MAAMC`(IAAI#
MAAMCAAC,EAAC,CAAC,MAAM>
`
QAAQC`ғ oeAAe,EAAC,cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,eAAe,EAAC,cAAc,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,eAAe,EAAC,uBAAuB,EAAC,wBAAwB,ғ o
UAAU,EAAC,QAAQ,EAAC,QAAQ4$WAAW,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,C`:k
CAAC,cAAc,EAAC,eAAe&$iUAAU,EAAC,WAAW,EAAC,iBAAiE
cAAc0\
/
+	IAAI,EAAC,iBAAiB,E1	O

		
	6

=Z""so-ET\",[[\"h\",\"d\"],[\"GH\",\"GD\"],u],[[\"AM\",\"GD\"],u,[\"GH\",\"GD\"]],[[\"A\",\"I\",\"T\",\"A\",\"Kh\",\"J\",\"S\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"],[\"Axad\",\"Isniin\",\"Talaado\",\"Arbaco\",\"Khamiis\",\"Jimco\",\"Sabti\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"]],[[\"A\",\"I\",\"T\",\"A\",\"Kh\",\"J\",\"S\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"],[\"Axad\",\"Isniin\",\"Talaado\",\"Arbaco\",\"Khamiis\",\"Jimco\",\"Sabti\I"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbaco\",\"Khms\",\"Jmc\",\"Sbti\"]],[[\"J#L\",\"O?Jan\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Lul\",\"Ogs\",\"Seb\",\"Okt\",\"Nof\",\"Dis\"],[\"Bisha Koobaad\",\"Bisha Labaad\",\"Bisha Saddexaad\",\"Bisha Afraad\",\"Bisha Shanaad\",\"Bisha Lixaad\",\"Bisha Todobaad\",\"Bisha Sideedaad\",\"Bisha SagaValaad\",\"Bisha Tobnaad\",\"Bisha Kow iyo Tobnaad\",\"Bisha Laba iyo Tobnaad\"]],[[\"J#L\",\"O?Jan\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Lul\",\"Ogs\",\"Seb\",\"Okt\",\"Nof\",\"Dis\"],[\"Jannaayo\",\"Febraayo\",\"Maarso\",\"Abriil\",\"May\",\"Juun\",\"Luuliyo\",\"Ogost\",\"Sebtembar\",\"Oktoobar\",\"Nofembar\",\"Desembar\"]],[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Ciise Hortii\",\"Ciise Dabadii\"]],0,[6,0],[\"dd/MM/yy\",\"dd-MMM-y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h@ {0}\",\"{1} 'ee' {0}\",uNHMaL ETB\",\"Br\",\"Birta Itoobbiya\",{\"BBD\":[\"DBB\",\"$\"],\"ETB\":[\"Br\"],\"JPY\":[\"JP¥\",\"¥\"],\"SOS\":[\"S\"],\"USD\":[\%"US$\",\"$\"]},\"ltr\", plural];\n"]}_pdx- 	eAAe,EAAE2export default [];\n"]}eb=x3,LR$LR@
#k
7F
{$IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,Efғ
`
nSAAS/YiBAAiKAAK$KAAK%fLR\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"SQ#\",\"Tu\",\"We\",\"Th\",\"Fr\",\"SauQd/MM/E]_LRD\",\"$\",\"Liberian Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"LRD\":[\"$\"],\"USD\":[\"US$\",\"$+1G[x AT$AT@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCSAAS,EAAC,YAAY)MAAM MAT	.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss0,\",\".H#·m86 %\",\"¤ #,##0.00\",\"#E0\"],\"EUR\",\"€\",\"Euro -F8Vxz TO$TO@IAAI,EAAC,gBAAgB IAAI,CP1%TO	TOP\",\"T$\",\"Tongan Paʻanga 
TOP\":[\"T	4%x2-de$de=:<:_+A=P6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&A=:(
I
6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&











MAAM,CAAC,EAAC,CMAAMo_7`# MAAMo_SAAS,EAAC,SAASK++
#UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,iBAAi	EAAC,CAACdIAAI,CLE(_
(_
IAAI,CL
MAAM,CLIAAI,CL
#_
}
MAAM,CL
IAAI,CL
}
}
IAAI,CL
MAAM,CAAC,EAAC,KAAK,EAAC,EAAEOn#(EAAEO
1de-AT\",[[\"AM\",\"PM\"],u,u],[[\"vm.\",\"nm.\"],[\"AM\",\"PM\"],u],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\8"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]]
Pän.\",\"Feb.\",\"März\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sep.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Jänner\",\"Febru0ar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Julik
zember\"]]
P$än\",\"Feb\",\"Mär\",\"Apr\",\"Mail `\",\"Okt\",\"Nov\",\"Dez\"],[\"Jänner\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Julikezember\"]],[[\"v. Chr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d.\um' {0}\",u],[\",\",\" "E,u,\".eVATS\":[\"öS\"],\"AUD\":[\"AU$\",\"$\"],\"BGM\":[\"BGK\"],\"BGO\":[\"BGJ\"],\"BYN\":[u,\"р.\"],\"CUC\":[u,\"Cub$\"],\"DEM\":[\"DM\"],\"FKP\":[u,\"Fl£\"],\"GHS\":[u,\"₵\"],\"GNF\":[u,\"F.G.\"],\"KMF\":[u,\"FC\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"RWF\":[u,\"F.Rw\"],\"SYP\":[],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XXX\":[],\"ZMW\":[u,\"K\"]},\"ltr\", plural];\n"]}^/Bx-gsw-FR!gsw-FR@	CAAC;IAEdP="QAAQ,EAAC,CAAC,CAAC,OAAO,EAAC,MAAMQcAAc,EAAC,aAAaOAAO,EAAC,MAAMQWAAW,EAAC,UAAU[P`
"UAAU,EAAC,WAAW,EAAC,SAAS,EAAC,WAAWeA0	2UAAU,EAAC,WAAWn|*œ`
R(
d		};\n\nif (n === 14gsw-FR\",[[\"vorm.\",\"nam.\"],u,[\"am Vormittag\",\"am Namittag\"]],[[\"vorm.\",\"nam.\"],u,[\"Vormittag\",\"Namittag\"]],[[\")-"u.\",\"Mä.\",\"Zi.\",\"Mi.\",\"Du{unntig\",\"Määntig\",\"Ziischtig\",\"Mittwuch\",\"Dunschtig\",\"Friitig\",\"Samschtig\"],[\"Su.\",\"Mä.\",\"Zi.\",\"Mi.\",\"Duu[PabanuaEAcht\",\"Septämber\",\"Oktoober\",\"Novämber\",\"Dezämber\"]],u {0}\",u,u,u],[\".\",\"’a−\",\"E\",\"×  #,##0.00 ¤7s 
yx Z..GT$GT@
QAAQOSAASP	n
xP
P
@
(Fn
s9GTK0,[6,0],[\"d/MM/yy\",\"d/MM/$GTQ\",\"Q\",\"quetzal.dN
GTQ\":[\"Quo43x- 	eAAe,EAAE=2export default [];\n"]}fXx- 	eAAe,EAAE=2export default [];\n"]}fIY<x so-ET!so-ETJrj$6xO3
eAAe,CAAC,CAAC,CAAC,QAAQP
$QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiBQAAQP
QAAQaYAAY55&&&	CAAC,CAAC+7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"de la nuit\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}v(%OxX4
eAAe,CAAC,CAAC,CAAC,QAAQP
.QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS	CAAC,QAAQP
QAAQaYAAY55&&&	CAAC,CAAC-7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}-gx
	en-AU!en-AU@q,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS<EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB/$,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS	EAAC,CAACQdnight\",\"midday\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,[\"midnight\",\"midday\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"]],[[\"midnight\",\"midday\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"065%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}_ך#tx;

en-L"en-L?rIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,YEAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS	EAAC,CAACQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u65%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}ө>x 

Q%Q@1jx 

AT$AT@5x 

TO$TO@6x
H/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-OM", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "OMR", "ر.ع.‏", "ريال عماني", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-OM.js.map^x{"version":3,"file":"ar-OM.js","sourceRoot":"","sources":["ar-OM.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-OM\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"OMR\",\"ر.ع.‏\",\"ريال عماني\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}][Ծx
!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-PS", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ك", "ش", "آ", "ن", "أ", "ح", "ت", "آ", "أ", "ت", "ت", "ك"], ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "ILS", "₪", "شيكل إسرائيلي جديد", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-PS.js.map׿x{"version":3,"file":"ar-PS.js","sourceRoot":"","sources":["ar-PS.ts"],"names":[],"mappings":"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AC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-PS\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ك\",\"ش\",\"آ\",\"ن\",\"أ\",\"ح\",\"ت\",\"آ\",\"أ\",\"ت\",\"ت\",\"ك\"],[\"كانون الثاني\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشرين الثاني\",\"كانون الأول\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],1,[6,0],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"ILS\",\"₪\",\"شيكل إسرائيلي جديد\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}uhx
M/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-SA", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 0, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "٪", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "SAR", "ر.س.‏", "ريال سعودي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-SA.js.mapᥣﱞx{"version":3,"file":"ar-SA.js","sourceRoot":"","sources":["ar-SA.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-SA\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],0,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"٪\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"SAR\",\"ر.س.‏\",\"ريال سعودي\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}/U'oxw3
fr-BE!fr-BE@]eAAe,CAAC,CAAC,C
MAAM>


$UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUPo
MAAM>

YAAY,EAAC,MAAM,EAAC,MAAMP
<



OAAO,CAAC,CAAC7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}x
I/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-SD", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "SDG", "ج.س.", "جنيه سوداني", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-SD.js.mapF¥x
G/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-SO", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "٪", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "SOS", "S", "شلن صومالي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SOS": ["S"], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-SO.js.map)pڴx
+/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-SS", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "SSP", "£", "جنيه جنوب السودان", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["GB£", "UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SSP": ["£"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-SS.js.mapʱ찣x0{"version":3,"file":"ar-SS.js","sourceRoot":"","sources":["ar-SS.ts"],"names":[],"mappings":"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AC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-SS\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],1,[6,0],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"SSP\",\"£\",\"جنيه جنوب السودان\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"GB£\",\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SSP\":[\"£\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}ntߞx
*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-SY", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ك", "ش", "آ", "ن", "أ", "ح", "ت", "آ", "أ", "ت", "ت", "ك"], ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "SYP", "ل.س.‏", "ليرة سورية", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-SY.js.map㴠x{"version":3,"file":"ar-SY.js","sourceRoot":"","sources":["ar-SY.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QAClE,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACnE,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,aAAa,EAAC,cAAc,EAAC,aAAa,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,WAAW,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,OAAO,EAAC,YAAY,EAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-SY\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ك\",\"ش\",\"آ\",\"ن\",\"أ\",\"ح\",\"ت\",\"آ\",\"أ\",\"ت\",\"ت\",\"ك\"],[\"كانون الثاني\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشرين الثاني\",\"كانون الأول\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"SYP\",\"ل.س.‏\",\"ليرة سورية\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}3ݻx
D/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-TD", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XAF", "FCFA", "فرنك وسط أفريقي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-TD.js.map}x
N/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-TN", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ج", "ف", "م", "أ", "م", "ج", "ج", "أ", "س", "أ", "ن", "د"], ["جانفي", "فيفري", "مارس", "أفريل", "ماي", "جوان", "جويلية", "أوت", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 1, [6, 0], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [",", ".", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "TND", "د.ت.‏", "دينار تونسي", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-TN.js.mapVx{"version":3,"file":"ar-TN.js","sourceRoot":"","sources":["ar-TN.ts"],"names":[],"mappings":"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,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,OAAO,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))\n    return 3;\nif (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ar-TN\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ج\",\"ف\",\"م\",\"أ\",\"م\",\"ج\",\"ج\",\"أ\",\"س\",\"أ\",\"ن\",\"د\"],[\"جانفي\",\"فيفري\",\"مارس\",\"أفريل\",\"ماي\",\"جوان\",\"جويلية\",\"أوت\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],1,[6,0],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} في {0}\",u],[\",\",\".\",\";\",\"‎%‎\",\"‎+\",\"‎-\",\"E\",\"×\",\"‰\",\"∞\",\"ليس رقمًا\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"TND\",\"د.ت.‏\",\"دينار تونسي\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.‏\"],\"EGP\":[\"ج.م.‏\",\"E£\"],\"FJD\":[u,\"FJ$\"],\"GBP\":[\"UK£\"],\"GYD\":[u,\"GY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP¥\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"MAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏\"],\"PHP\":[u,\"₱\"],\"QAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]} 8ix
J/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar-YE", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 0, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "YER", "ر.ي.‏", "ريال يمني", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar-YE.js.mapx
P/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
        return 4;
    return 5;
}
export default ["ar", [["ص", "م"], u, u], [["ص", "م"], u, ["صباحًا", "مساءً"]], [["ح", "ن", "ث", "ر", "خ", "ج", "س"], ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], u, ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"]], u, [["ي", "ف", "م", "أ", "و", "ن", "ل", "غ", "س", "ك", "ب", "د"], ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], u], u, [["ق.م", "م"], u, ["قبل الميلاد", "ميلادي"]], 6, [5, 6], ["d‏/M‏/y", "dd‏/MM‏/y", "d MMMM y", "EEEE، d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} في {0}", u], [".", ",", ";", "‎%‎", "‎+", "‎-", "E", "×", "‰", "∞", "ليس رقمًا", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "EGP", "ج.م.‏", "جنيه مصري", { "AED": ["د.إ.‏"], "ARS": [u, "AR$"], "AUD": ["AU$"], "BBD": [u, "BB$"], "BHD": ["د.ب.‏"], "BMD": [u, "BM$"], "BND": [u, "BN$"], "BSD": [u, "BS$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": ["CA$"], "CLP": [u, "CL$"], "CNY": ["CN¥"], "COP": [u, "CO$"], "CUP": [u, "CU$"], "DOP": [u, "DO$"], "DZD": ["د.ج.‏"], "EGP": ["ج.م.‏", "E£"], "FJD": [u, "FJ$"], "GBP": ["UK£"], "GYD": [u, "GY$"], "HKD": ["HK$"], "IQD": ["د.ع.‏"], "IRR": ["ر.إ."], "JMD": [u, "JM$"], "JOD": ["د.أ.‏"], "JPY": ["JP¥"], "KWD": ["د.ك.‏"], "KYD": [u, "KY$"], "LBP": ["ل.ل.‏", "L£"], "LRD": [u, "$LR"], "LYD": ["د.ل.‏"], "MAD": ["د.م.‏"], "MRU": ["أ.م."], "MXN": ["MX$"], "NZD": ["NZ$"], "OMR": ["ر.ع.‏"], "PHP": [u, "₱"], "QAR": ["ر.ق.‏"], "SAR": ["ر.س.‏"], "SBD": [u, "SB$"], "SDD": ["د.س.‏"], "SDG": ["ج.س."], "SRD": [u, "SR$"], "SYP": ["ل.س.‏", "£"], "THB": ["฿"], "TND": ["د.ت.‏"], "TTD": [u, "TT$"], "TWD": ["NT$"], "USD": ["US$"], "UYU": [u, "UY$"], "YER": ["ر.ي.‏"] }, "rtl", plural];
//# sourceMappingURL=ar.js.mapx{"version":3,"file":"be-tarask.js","sourceRoot":"","sources":["be-tarask.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n % 10 === 1 && !(n % 100 === 11))\n    return 1;\nif (n % 10 === Math.floor(n % 10) && (n % 10 >= 2 && n % 10 <= 4) && !(n % 100 >= 12 && n % 100 <= 14))\n    return 3;\nif (n % 10 === 0 || (n % 10 === Math.floor(n % 10) && (n % 10 >= 5 && n % 10 <= 9) || n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 14)))\n    return 4;\nreturn 5;\n}\n\nexport default [\"be-tarask\",[[\"am\",\"pm\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"н\",\"п\",\"а\",\"с\",\"ч\",\"п\",\"с\"],[\"нд\",\"пн\",\"аў\",\"ср\",\"чц\",\"пт\",\"сб\"],[\"нядзеля\",\"панядзелак\",\"аўторак\",\"серада\",\"чацвер\",\"пятніца\",\"субота\"],[\"нд\",\"пн\",\"аў\",\"ср\",\"чц\",\"пт\",\"сб\"]],u,[[\"с\",\"л\",\"с\",\"к\",\"м\",\"ч\",\"л\",\"ж\",\"в\",\"к\",\"л\",\"с\"],[\"сту\",\"лют\",\"сак\",\"кра\",\"мая\",\"чэр\",\"ліп\",\"жні\",\"вер\",\"кас\",\"ліс\",\"сне\"],[\"студзеня\",\"лютага\",\"сакавіка\",\"красавіка\",\"мая\",\"чэрвеня\",\"ліпеня\",\"жніўня\",\"верасня\",\"кастрычніка\",\"лістапада\",\"снежня\"]],[[\"с\",\"л\",\"с\",\"к\",\"м\",\"ч\",\"л\",\"ж\",\"в\",\"к\",\"л\",\"с\"],[\"сту\",\"лют\",\"сак\",\"кра\",\"май\",\"чэр\",\"ліп\",\"жні\",\"вер\",\"кас\",\"ліс\",\"сне\"],[\"студзень\",\"люты\",\"сакавік\",\"красавік\",\"май\",\"чэрвень\",\"ліпень\",\"жнівень\",\"верасень\",\"кастрычнік\",\"лістапад\",\"снежань\"]],[[\"да н.э.\",\"н.э.\"],u,[\"да нараджэння Хрыстова\",\"ад нараджэння Хрыстова\"]],1,[6,0],[\"d.MM.yy\",\"d MMM y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss, zzzz\"],[\"{1}, {0}\",u,\"{1} 'у' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"BYN\",\"Br\",\"беларускі рубель\",{\"AUD\":[\"A$\"],\"BBD\":[u,\"Bds$\"],\"BMD\":[u,\"BD$\"],\"BRL\":[u,\"R$\"],\"BSD\":[u,\"B$\"],\"BYN\":[\"Br\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[u,\"CA$\"],\"CUC\":[u,\"CUC$\"],\"CUP\":[u,\"$MN\"],\"DOP\":[u,\"RD$\"],\"FJD\":[u,\"FJ$\"],\"FKP\":[u,\"FK£\"],\"GYD\":[u,\"G$\"],\"ISK\":[u,\"Íkr\"],\"JMD\":[u,\"J$\"],\"KYD\":[u,\"CI$\"],\"LRD\":[u,\"L$\"],\"MXN\":[\"MX$\"],\"NAD\":[u,\"N$\"],\"NZD\":[u,\"NZ$\"],\"PHP\":[u,\"₱\"],\"RUB\":[\"₽\",\"руб.\"],\"SBD\":[u,\"SI$\"],\"SGD\":[u,\"S$\"],\"TTD\":[u,\"TT$\"],\"UYU\":[u,\"$U\"],\"XCD\":[\"EC$\"]},\"ltr\", plural];\n"]}/~_)xa63ar!arH	;QACP-	;QACP-	;QACP-$KE-$r;QACnEi=IAAI,E
 
QAAQ,EAAC,OAAO[OAAOnUAAUOAAO{
OAAOMAAM,EAAC,MAAM,Ea
JOAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO
"	/

aAAa,EAAC,QAAQ

WAAW,EAAC,UAAU}	QAAQ,EAAC,WAAW,EAAC,aAAa}	0YAAY	8/


(WAAW|M

QAAQ[
)OAAO,EAAC,WAAW
OAAOpBj(
OAAOj(
j(
(
(
OAAOpOAAO .
j(
jOAAOpFOAAOP8OAAOpBOAAO .
OAAOpOAAOpjjOAAOp$OAAOpOAAOpBOAAOpFOAAO)OAAOpBjj(
OAAO"=== 0)\n    return 0;\nif (n === 1=== 2)\n    return 2;\nif (`/3 && n % 100 <= 10f:995ar\",[[\"ص\",\"م\"],u,u],[[\"ص\",\"م\"],u,[\"صباحًا\",\"مساءً\"]],[[\"ح\",\"ن\",\"ث\",\"ر\",\"خ\",\"ج\",\"س\"],[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],u,[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"]],u,[[\"ي\",\"ف\",\"م\",\"أ\",\"و\",\"ن\",\"ل\",\"غ\",\"س\",\"ك\",\"ب\",\"د\"],[\"يناير\",\"فبراير\",\"مارس\",\"أبري\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],u],u,[[\"ق.م\",\"م\"],u,[\"قبل الميلاد\",\"ميلادي\"]],6,[5,6],[\"d‏/M‏/y\",\"dd‏/MM‏/y\",\"d MMMPM y\",\"EEEE، d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a;في {0}\",u],[\".\",\",\",\";\",\"‎%‎\",\"‎+\",\"‎>#ليس رقمًاd %\",\"¤ #,##0.00\",\"#E0\"],\"EGP\",\"ج.م.‏\",\"جنيه مصري\",{\"AED\":[\"د.إ.‏\"],\"ARS\":[u,\"AR$\"],\"AUD\":[\"AU$\"],\"BBD\":[u,\"BB$\"],\"BHD\":[\"د.ب.‏\"],\"BMD\":[u,\"BM$\"],\"BND\":[u,\"BN$\"],\"BSD\":[u,\"BS$\"],\"BYN\":[u,\"р.E!\"CA$\"],\"CLP\":[u,\"CL$\"],\"CNY\":[\"CN¥\"],\"COP\":[u,\"CO$\"],\"CUP\":[u,\"CU$\"],\"DOP\":[u,\"DO$\"],\"DZD\":[\"د.ج.!\"],\"EGP\":[\"ج.م.‏\",\"E£
GBP\":[\"UY$\"],\"HKD\":[\"HK$\"],\"IQD\":[\"د.ع.‏\"],\"IRR\":[\"ر.إ.\"],\"JMD\":[u,\"JM$\"],\"JOD\":[\"د.أ.‏\"],\"JPY\":[\"JP\"],\"KWD\":[\"د.ك.‏\"],\"KYD\":[u,\"KY$\"],\"LBP\":[\"ل.ل.‏\",\"L£\"],\"LRD\":[u,\"$LR\"],\"LYD\":[\"د.ل.‏\"],\"cMAD\":[\"د.م.‏\"],\"MRU\":[\"أ.م.\"],\"MXN\":[\"MX$\"],\"NZD\":[\"NZ$\"],\"OMR\":[\"ر.ع.‏nQAR\":[\"ر.ق.‏\"],\"SAR\":[\"ر.س.‏\"],\"SBD\":[u,\"SB$\"],\"SDD\":[\"د.س.‏\"],\"SDG\":[\"ج.س.\"],\"SRD\":[u,\"SR$\"],\"SYP\":[\"ل.س.‏\",\"£\"],\"THB\":[\"฿\"],\"TND\":[\"د.ت.‏\"],\"TTD\":[u,\"TT$\"],\"TWD\":[\"NT$\"],\"USD\":[\"UIS$\"],\"UYU\":[u,\"UY$\"],\"YER\":[\"ر.ي.‏\"]},\"rtl\", plural];\n"]}O ux	6,r"rHۓKAAK,CAAC;QACvE-.G
KAAK,CAAC;QACvE-KAAKQ<

P
<<<+xL-CaoOAAO,KAAK,CAAC;QAC/Bi=IAAI.MAAM
<

MAAM
GAAG
&"MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM
"QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,QAAQ,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM((+
mCAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI
CAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,CAAC,CAaAAa,EAAC,YAAY{oBAAoB,EAAC,mBAAmB

teAAeU	.eAAe!	~
cAAc	GAAG,EAAC,MAAM

P2N
9
{(MAAM$MAAM$


P(MAAM$
PZMAAM$

EAAE& || (n % 100 === 71 || n % 100 === 91)"K2 && !(n % 100 === 12 || (n % 100 === 72 || n % 100 === 92)))\n    return 233 && n % 10 <= 4 || n % 10 === 9) && !(n % 100 >= 10 && n % 100 <= 19 || (n % 100 >= 70 && n % 100 <= 79 || n % 100 >= 90 && n B% 100 <= 99)))\n    return 3;\nif (!(n === 0) && n % 1000000 === 05r\",[[\"am\",\"gm\"],[\"A.M.\",\"G.M.\"],u],[[\"A.M.\",\"G.M.\"],u,u],[[\"Su\",\"L\",\"Mz\",\"Mc\",\"Y\",\"G\",\"Sa\"],[\"Sul\",\"Lun\",\"Meu.\",\"Mer.\",\"Yaou\",\"Gwe.\",\"Sad.\"],[\"Sul\",\"Lun\",\"Meurzh\",\"Mercʼher\",\"Yaou\",\"Gwener\",\"Sadorn\"],[\"Sul\",\"Lun\",\"Meu.\",\"Mer.\",\"Yaou\",\"Gwe.\",\"Sad.\"]],u,[[\"01\",\"02\",\"03\",\"04\",\"05\",\"06\",\"07\",\"08\",\"09\",\"10\",\"11\",\"12\"],[\"Gen.\",\"Cʼhwe.\",\"Meur.\",\"Ebr.\",\"Mae\",\"Mezh.\",\"Goue.\",\"Eost\",\"Gwen.\",\"Here\",\"Du\",\"Kzu.\"],[\"Genver\",\"Cʼhwevrer\",\"Meurzh\",\"Ebrel\",\"Mae\",\"Mezheven\",\"Gouere\",\"Eost\",\"Gwengolo\",\"Here\",\"Du\",\"Kerzu\"]],u,[[\"a-raok J.K.\",\"goude J.K.\"],u,[\"a-raok Jezuz-Krist\",\"goude Jezuz-Krist\"]],1,[6,0],[\"dd/MM/y\",\"&d MMM y\",\"d MMMM y\",\"EEEE d MMMM y5, zzzz\"],[\"{1} {0}\",\"{1}, {0}\",\"{1} 'da*EUR\",\"€\",\"euro\",{\"AUD\":[\"$A\",\"YN\":[u,\"р.\"],\"CAD\":[\"$CA\",\"$\"],\"CNY\":[u,\"¥\"],\"EGP\":[u,\"£ E\"],\"GBP\":[\"£ RU\",\"£\"],\"HKD\":[\"$ HK\",\i"$\"],\"ILS\":[u,\"₪\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"LBP\":[u,\"£L\"],\"NZD\":[\"$ ZN\",\"mR\":[u,\"р.\"],\"TOP\":[u,\"$ T\"],\"TWD\":[u,\"$\"],\"USD\":[\"$ SU\",\"$\"],\"VND\":[u,\"₫\"],\"XCD\":[u,\"$\"],\"XXX\":[]},\"ltr\", plural];\n"]}rx- 6	eAAe,EAAE2export default [];\n"]}xZx=
6,nn!nnH	;QACPi=IAAI,E
MAAM
CAAC,MAAM,EAAC,MAAMMAAM
	CAAC,MAAM
<
 KP
o
PoPP
o
PohMAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM
C@MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,WAAWnUAAU@MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,WAAWnUAAUOAAO,EAAC,OAAO{aAAa,EAAC,eAAe

~

	e	O	
CAAC,EAAC,eAAe,EAAC,SAAS	eAAe
P2N









(



EAAE
EAAE,EAAC,KAAK,EAAC,EAAE=== 1)\n    return 1%nn\",[[\"a\",\"p\"],[\"f.m.\",\"e.m.\"],[\"a.m.\",\"p.m.\"]],[[\"f.m.\",\"e.m.\"],[\"a.m.\",\"p.m.\"],u],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"sø.\",\"må.\",\"ty.\",\"on.\",\"to.\",\"fr.\",\"la.\"],[\"søndag\",\"måndag\",\"tysdag\",\"onsdag\",\"torsdag\",\"fredag\",\"laurdag\"],[\"sø.\",\"må.\",\"ty.\",\"on.\",\"to.\",\"fr.\",\"la.\"]],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"søn\",\"mån\",\"tys\",\"ons\",\"tor\",\"fre\",\"lau\"],[\"søndag\",\"måndag\",\"tysdag\",\"onsdag\",\"torsdag\",\"fredag\",\"laurdag\"],[\"sø.\",\"må.\",\"ty.\",\"on.\",\"to.\",\"fr.\",\"la.\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan.\",\"feb.\",\"mars\",\"apr.\",\"mai\",\"juni\",\"juli\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"des.\"],[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"mai\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"des\"],[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"f.Kr.\",\"e.Kr.\"],u,[\"før Kristus\"U,\"etter Kristus\"]],1,[6,0],[\"dd.MM.y\",\"d. MMM y\",\"d. MMMM y\",\"EEEE d. MMMM y-'kl'. HH:mm:ss kl'. {0}\",\"{1} {0}\"$−?g-NOK\",\"kr\",\"norske kroner\",{\"AUD\":[u,\"YN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹[\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NOK\":[\"kr\"],\"NZD\":[u,\"mTWD\":[u,\"$\"],\"USD\":[u,\"$\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XPF\":[],\"XXX\":[]},\"ltr\", plural];\n"]}gN'x6sn!snH	;QACPi=IAAI,E
	ASAAS,EAAC,SAAS,Ea	UAAU,CAAC,E(
w'OAAOUAAU,EAAC,UAAUQ
aAAanQAAQ,EAAC,OAAO
(mBAAmB,EAAC,qBAAqB

t	e	eAAe!		QAAQ,EAAC,WAAW0
iBAAiB

9
[4
=== 1)\n    return 1%sn\",[[\"a\",\"p1S\",\"M\",\"C\",\"C\",\"C\",\"C\",\"M\"],[\"Svo\",\"Muv\",\"Chp\",\"Cht\",\"Chn\",\"Chs\",\"Mug\"],[\"Svondo\",\"Muvhuro\",\"Chipiri\",\"Chitatu\",\"China\",\"Chishanu\",\"Mugovera\"],[\"Sv\",\"Mu\",\"Cp\",\"Ct\",\"Cn\",\"Cs\",\"Mg\"]],u,[[\"N\",\"K\",\"K\",\"K\",\"C\",\"C\",\"C\",\"N\",\"G\",\"G\",\"M\",\"Z\"],[\"Ndi\",\"Kuk\",\"Kur\",\"Kub\",\"Chv\",\"Chk\",\"Chg\",\"Nya\",\"Gun\",\"Gum\",\"Mbu\",\"Zvi\"],[\"Ndira\",\"Kukadzi\",\"Kurume\",\"Kubvumbi\",\"Chivabvu\",\"Chikumi\",\"Chikunguru\",\"Nyamavhuvhu\",\"Gunyana\",\"Gumiguru\",\"Mbudzi\",\"Zvita\"]],u,[[\"BC\",\"AD\"],u,[\"Kristo asati auya\",\"mugore ramambo vedu\"]],0,[;6,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE5' zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",']%\",\"¤#,##0.00\",\"#E0\"],\"USD\",\"US$\",\"Dora re Amerika\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", pldr{x@,'no!no:KAAK,CAAC;QACP<	pd			p[
[
[
[
[,
"QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS8.
.
.
.
						p[
[
)<[
[,
SAAS.QAAQ,EM	M
UAAU~						#.
.
.
.
.
.
.
.
.
KAAKSAAS.QAAQ,EM	M
UAAU~OAAO,EAAC,OAAOaAAa,EAAC,eAAe$ #M
WAAW,EAAC,gBAAgB[BUAAU,EAAC,CAAC,EAAC,eAAewBAAwB|
IAAI,EAAC,eAAe,Er(
x
x
F		
xFP
#
A
2
=== 1)\n    return 1%no\",[[\"a\",\"p\"],[\"a.m.\",\"p.m.\"],u],[[\"a.m.\",\"p.m.\"],u,u],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"søn.\",\"man.\",\"tir.\",\"ons.\",\"tor.\",\"fre.\",\"lør.\"],[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],[\"sø.\",\"ma.\",\"ti.\",\"on.\",\"to.\",\"fr.\",\"lø.\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan.\",\"feb.\",\"mar.\",\"apr.\",\"mai\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"des.\"],[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"mai\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"des\"],[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"f.Kr.\",\"e.Kr.\"],u,[\"før Kristus\",\"etter Kristus\"]],18,[6,0],[\"dd.MM.y\",\"d. MMM y\",\"d. MMMM y\",\"EEEE d.RK, {0}\",u,\"{1} 'kl'.,−MR¤ #,##0.00;¤ -#,##0.00\",\"#E0\"],\"NOK\",\"kr\",\"norske kroner\",{\"AUD\":[uv8&u,\"$\"],\"CNY\":[u,\"¥\"],\"HKD\":[uINR\":[u,\"₹)-+MXN\":[u,\"$\"],\"NOK\":[\"kr\"],\"NZD\":[uy-ON\":[u,\"L\"],\"TWD\":[u,\"NT$\"],\"USD\":[u#AF\":[],\"XCD\":[u,\"$\"],\"XPF\":[$ARUx$,rn!rn:<OAAO,EAAC,OAAO)
			CAAC,EAAC,C*;[NYAAY,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,YAAY,EAAC,cAAc,EAAC,iBAAiB,CAAC,EAAC,C*;-				Pp[
[
[
[
[
[
[
[
[
[kWAAW0C
"UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU$OAAO$eAAe,EAAC,eAAe$ k
Cd 
WAAW|
.
sBAAsB,E

(
((
"rn\",[[\"Z.MU.\",\"Z.MW.\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"cu.\",\"mbe.\",\"kab.\",\"gtu.\",\"kan.\",\"gnu.\",\"gnd.\"],[\"Ku w’indwi\",\"Ku wa mbere\",\"Ku wa kabiri\",\"Ku wa gatatu\",\"Ku wa kane\",\"Ku wa gatanu\",\"Ku wa gatandatu\"],[\"cu.\",\"mbe.\",\"kab.\",\"gtu.\",\"kan.\",\"gnu.\",\"gnd.\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"Mut.\",\"Gas.\",\"Wer.\",\"Mat.\",\"Gic.\",\"Kam.\",\"Nya.\",\"Kan.\",\"Nze.\",\"Ukw.\",\"Ugu.\",\"Uku.\"],[\"Nzero\",\"Ruhuhuma\",\"Ntwarante\",\"Ndamukiza\",\"Rusama\",\"Ruheshi\",\"Mukakaro\",\"Nyandagaro\",\"Nyakanga\",\"Gitugutu\",\"Munyonyo\",\"KigXarama\"]],u,[[\"Mb.Y.\",\"Ny.Y\"],u,[\"Mbere ya Yezu\",\"Nyuma ya Yezu\"]],1,[6,0],[\"d/+yu,u,u],[\",\",\".n\",\"#E0\"],\"BIF\",\"FBu\",\"Ifaranga ry’Uburundi\",{\"BIF\":[\"FBu\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}ex sn!snHGSjx7,$fo!fo:IAAI,EAAC,IAAI

{F-M(M
@YAAY,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,UAAU,EAAC,cAAc,EAAC,aAAa
YAAY,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,UAAU,EAAC,cAAc,EAAC,aAAa,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI }YAAY,EAAC,aAAa

{
SAAS,EAAC,WAAW,EAAC,iBAAi6/eAAek.aAAa,E	@n<
	
7<
	fo\",[[\"AM\",\"PM\"],u,u],uM\",\"H\",\"F\",\"L\"],[\"sun.\",\"mán.\",\"týs.\",\"mik.\",\"hós.\",\"frí.\",\"ley.\"],[\"sunnudagur\",\"mánadagur\",\"tsdagur\",\"mikudagur\",\"hósdagur\",\"fríggjadagur\",\"leygardagur\"],[\"su.\",\"má.\",\"tý.\",\"mi.\",\"hó.\",\"fr.\",\"leM\",\"H\",\"F\",\"L\"],[\"sun\",\"mán\",\"týs\",\"mik\",\"hós\",\"frí\",\"ley\"],[\"sunnudagur\",\"mánadagur\",\"týsdagur\",\"mikudagur\",\"hósdagur\",\"fríggjadagur\",\"leygardagur\"],[\"su\",\"má\",\"tý\",\"mi\",\"hó\",\"fr\",\"le\"]],[[\"J\K.+
.\",\"jul.NWíc	íd\Kr\",\"eKr\"],[\"f.Kr.\",\"e.Kr.\"],[\"fyri Krist\",\"eftir Krist\"]],1,[6,0],[\"dd.MM.yy\",M y\",\"EEEE,73u],[\",\",\".5DKK\",\"kr\",\"donsk króna\",{\"BYN\":[u,\"р.\"],\"DKK\":[\"kr\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"USD\":[\"US"$\",\"$\"]},\"ltr\", plural];\n"]}d3z0xU,"pcm!pcm:dEAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAClB=IAAI,EAAC,IAAI/	

{F-%-2WAAW%-b
K}P
"OAAO,EAAC,OAAO,EAAC,WAAW,EAAC,QAAQP P}P
"OAAO,EAAC,OAAO,EAAC,WAAW,EAAC,QAAQ.IAAI
cAAcQ1*6WAAW,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,cAAcQAAQ,EAAC,WAAWG	GAAG,EAAC,gBAAgB,E	@<
	
<
	
r-<
	3, i = Math.floor(Math.abs(val));\n\nif (i === 0 || 1;@pcm\",[[\"AM\",\"PM\"],u,[\"Fọ mọ́nin\",\"Fọ ívnin\"]],uW\",\"T\",\"F\",\"S\"],[\"Sọ́n\",\"Mọ́n\",\"Tiú\",\"Wẹ́n\",\"Tọ́z\",\"Fraí\",\"Sát\"],[\"Sọ́ndè\",\"Mọ́ndè\",\"Tiúzdè\",\"Wẹ́nẹ́zdè\",\"Tọ́zdè\",\"Fraídè\",\"Sátọdè\"],[\"Sọ́n\",\"Mọ́n\",\"Tiú\",\"Wẹ́n\$",\"Tọ́z\",\"Fraí\",\"Sát\"]],uOJén\",\"Fẹ́b\",\"Mach\",\"Épr\",\"Mee\",\"Jun\",\"Jul\",\"Ọgọ\",\"Sẹp\",\"Ọkt\",\"Nọv\",\"Dis\"],[\"Jénúári\",\"Fẹ́búári\",\"Mach\",\"Éprel\",\"Mee\",\"Jun\",\"Julai\",\"Ọgọst\",\"Sẹptẹ́mba\",\"Ọktóba\",\"Nọvẹ́mba\",\"Disẹ́mbaSJén\",\"Fẹ́b\",\"Mach\",\"Épr\",\"Mee\",\"Jun\",\"Jul\",\"Ọ́gọ\",\"Sẹp\",\"Ọkt\",\"Nọv\",\"Dis\"],[\"Jénúári\",\"Fẹ́búári\",\"Mach\",\"Éprel\",\"Mee\",\"Jun\",\"Julai\",\"Ọgọst\",\"Sẹptẹ́mba\",\"Ọktóba\",\"Nọvẹ́mba\",\"Disẹ́mba\"]],[[\"BK\",\"KIY\"],u,[\"Bifọ́ Kraist\",\"Kraist Im Yiẹ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d&e:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 'fọ' {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-OE%\",\"¤#,##0.00\",\"#E0\"],\"NGN\",\"₦\",\"Naijíriá Naíra\",{\"BYN\":[u,\"p.\"],\"CAD\":[\"KA$\",\"$\"],\"JPY\":[\"JP¥\"^,\"¥\"],\"NGN\":[\"₦\"],\"PHP\":[u,\"₱\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}%kixN,rm!rm:IAAI,EAAC,IAAI

{F-@IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAIkWAAW,EAAC,OAAO,EAAC,SAAS,ETOAAO,CAAC,EAAC,CAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI
{
OAAOMAAM,EAAC,OAAO,EAAC,OAAOpYAAY$JSAAS,EAAC,cAAc,EAAC,YAAY,EAAC,SAAS,EAAC,cAAc,EAAC,WAAW,EAAC,aAAa,EAAC,aAAa
OAAOMAAM,EAAC,OAAO,EAAC,OAAOpMAAMOAAOBSAAS,EAAC,QAAQeAAe,EAAC,iBAAiB

{
sBAAs6/eAAe,CAAC,EAAC,CAAC,SAAS

P
p	<
	rm\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"G\",\"M\",\"M\",\"G\",\"V\",\"S\"],[\"du\",\"gli\",\"ma\",\"me\",\"gie\",\"ve\",\"so\"],[\"dumengia\",\"glindesdi\",\"mardi\",\"mesemna\",\"gievgia\",\"venderdi\",\"sonda\"],[\"du\",\"gli\",\"ma\",\"me\",\"gie\",\"ve\",\"so\"]],u,[[\"SZ\",\"F%schan.\",\"favr.\",\"mars\",\"avr.\",\"matg\",\"zercl.\",\"fan.\",\"avust\",\"sett.\",\"oct.\",\"nov.\",\"dec.\"],[\"da schaner\",\"da favrer\",\"da mars\",\"d’avrigl\",\"da matg\",\"da zercladur\",\"da fanadur\",\"d’avust\",\"da settember\",\"d’oc/tober\",\"da november\",\"da december\"]],[[\"SZ\",\"F%schan.\",\"favr.\",\"mars\",\"avr.\",\"matg\",\"zercl.\",\"fan.\",\"avust\",\"sett.\",\"oct.\",\"nov.\",\"dec.\"],[\"schaner\",^\"favrer\",\"mars\",\"avrigl\",\"matg\",\"zercladur\",\"fanadur\",\"avust\",\"settember\",\"ocEcember\"]],[[\"av. Cr.\",\"s. Cr.\"],u,[\"avant Cristus\",\"suenter Cl1-MM-yy\",\"dd-MM-y\",\"d MMMM y\",\"EEEE, 'ils' d41HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\"’5RCHF\",\"CHF\",\"franc svizzer\",{\"JPY\":[\"JP¥\",\"¥\"]},\"ltr\", plural];\n"]}ژz)xS,$sl!sl:EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;QACxB,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;QACxB,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,
CAAC;QAC5F獓

-{
_-M(M
@SAAS,EAAC,YAAY,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQM(M

{OAAOOAAO,EAAC,OAAOG
CAAC,SAAS,EAAC,QAAQgBAAgB,EAAC,aAAa

/	
UAAU,EAAC,WAAW,EAAC,iBAAi6/eAAek$SAASGAAG,EAAC,MAAM,E	J	M	, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (v === 0 && i % 100 === 1)\n    return 1;\nif (v === 0 && i % 100 === 2)\n    return 2;\nif (v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 3 && i % 1&00 <= 4)) || !(v === 0))\n    return 3G%sl\",[[\"d\",\"p\"],[\"dop.\",\"pop.\"],u],[[\"d\",\"p\"],[\"dop.\",\"pop.\"],[\"dopoldne\",\"popoldne\"]],[[\"n\",\"p\",\"t\",\"s\",\"č\",\"p\",\"s\"],[\"ned.\",\"pon.\",\"tor.\",\"sre.\",\"čet.\",\"pet.\",\"sob.\"],[\"nedelja\",\"ponedeljek\",\"torek\",\"sreda\",\"četrtek\",\"petek\",\"sobota\"],[\"ned.\",\"pon.\",\"tor.\",\"sre.\",\"čet.\",\"pet.\",\"sob.\"]],u,[[\"j\",\"=f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d+.\",\"apr.\",\"maj\",\"jun.\",\"jul.\",\"avU$c.!/ec\",\"april\",\"maj\",\"junij\",\"julij\",\"av2bcember\"]],u,[[\"pr. Kr.\",\"po Kr.\"],u,[\"pred Kristusom\",\"po Kristusu\"]],1,[6,0],[\"d. MM. y%,7'{0}\",u],[\",\",\".5eUaEUR\",\"€\",\"evroQ6MXN\":[u,\"$70NT$\"],\"XCD\":[u,\"$\"]},\"ltr\", plural];\n"]}}) Bzx,$e"e9^
o
o_FL
@SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQeoP`GnAo(Op,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,OAAOp-o8F#2yBAAyB@8BAA8B,CAAC,EAAC,CAAC,SAAS,E~,A`#(QAAQo
od	<	eo\",[[\"atm\",\"ptm!W\",\"T\",\"F\",\"S\"],[\"di\",\"lu\",\"ma\",\"me\",\"ĵa\",\"ve\",\"sa\"],[\"dimanĉo\",\"lundo\",\"mardo\",\"merkredo\",\"ĵaŭdo\",\"vendredo\",\"sabato\"],[\"di\",\"lu\",\"ma\",\"me\",\"ĵa\",\"ve\",\"sa\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\""7\",\"8\",\"9\",\"10\",\"11\",\"12q)j\",\"jun\",\"jul\",\"aŭg\",\"sep\",\"okt\",\"nov\",\"dec\"],[\"januaro\",\"februaro\",\"marto\",\"aprilo\",\"majo\",\"junio\",\"julio\",\"aŭgusto\",\"septembro\",\"oktobro\",\"novembro\",\"decembro\"]],u,[[\"aK\",\"pK\"],u,u],1,[6,0],[\"yy-MM-dd\",\"y*-MMM-dd\",\"y-MMMM-dd\",\"EEEE, d-'a' 'de'5V-'a' 'horo' 'kaj' m:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-qE%%\",\"¤ #,##0.00\",\"#E0\"],u,u,u,{L-o>ox! "	eAAe,EAAEA	2];\n"]}
Hx{"o"o;"CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACPE=IAAI8?
Pz
79;SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,CAACo7!K/
/
/#6aAAa,EAAC,aAAa,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,YAAYcAAc,EAAC,SAAS,EAAC,QAAQ $z
kBAAkB,EAAC,IAAI $UAAUiBAAiB
aAAa=
oIAAI,EAAC,mBAAmB,E\_)		;\n\nif (
;om\",[[\"WD\",\"WB\"],u,uS4Dil\",\"Wix\",\"Qib\",\"Rob\",\"Kam\",\"Jim\",\"San\"],[\"Dilbata\",\"Wiixata\",\"Qibxata\",\"Roobii\",\"Kamiisa\",\"Jimaata\",I\"Sanbata\"],[\"Dil\",\"Wix\",\"Qib\",\"Rob\",\"Kam\",\"Jim\",\"San\"]],uOAma\",\"Gur\",\"Bit\",\"Elb\",\"Cam\",\"Wax\",\"Ado\",\"Hag\",\"Ful\",\"Onk\",\"Sad\",\"Mud\"],[\"Amajjii\",\"Guraandhala\",\"Bitooteessa\",\"Elba\",\"Caamsa\",\"Waxabajjii\",\"Adooleessa\",\"Hagayya\",\"Fuulbana\",\"Onkololeessa\",\"Sadaasa\",\"Muddee\"]],u,[[\"BCE\",\"CE\"],u,[\"Dheengadda Jeesu\",\"CE\"]],0,[6,0],[\"dd/MM/yy\",\"dd-MMM-y\",\"dd MMMM y\",\"EEEE, MMMM d, y\"],[M\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u/1ETB\",\"Br\",\"Itoophiyaa Birrii\",{\"ETB\":[\"Br J-ɼX8xtbe"be9듕CAAC,UAAU,EAAC,SAAS_
o_YAAY,EAAC,WAAWWAAW,EAAC,aAAa,EAAC,cAAc_
oP#P(
JUAAU,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU6_o8(aAAa,EAAC,YAAY,Co
`UAAU-%*
*
{
vbem\",[[\"uluchelo\",\"akasuba;Pa Mulungu\",\"Palichimo\",\"Palichibuli\",\"Palichitatu\",\"Palichine\",\"Palichisano\",\"Pachibelushi\"],u,u],u,[[\"J\",\"F\"
,\"M\",\"E	O	Jan\",\"Feb\",\"Mac\",\"Epr\",\"Mei\",\"Jun\",\"Jul\",\"Oga\",\"Sep\",\"Okt\",\"Nov\",\"Dis\"],[\"Januari\",\"Februari\",\"Machi\",\"Epreo\",\"Mei\",\"Juni\",\"Julai\",\"Ogasti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Disemba\"]],u,[[\"BC\",\"AD\"],u,[\"BZefore Yesu\",\"After Yesu\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMMZZMW\",\"K\",\"ZMW\",{l1,\"ZMW\":[\"K\",\"ZK Wx=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["as", [["পূৰ্বাহ্ন", "অপৰাহ্ন"], u, u], u, [["দ", "স", "ম", "ব", "ব", "শ", "শ"], ["দেও", "সোম", "মঙ্গল", "বুধ", "বৃহ", "শুক্ৰ", "শনি"], ["দেওবাৰ", "সোমবাৰ", "মঙ্গলবাৰ", "বুধবাৰ", "বৃহস্পতিবাৰ", "শুক্ৰবাৰ", "শনিবাৰ"], ["দেও", "সোম", "মঙ্গল", "বুধ", "বৃহ", "শুক্ৰ", "শনি"]], u, [["জ", "ফ", "ম", "এ", "ম", "জ", "জ", "আ", "ছ", "অ", "ন", "ড"], ["জানু", "ফেব্ৰু", "মাৰ্চ", "এপ্ৰিল", "মে’", "জুন", "জুলাই", "আগ", "ছেপ্তে", "অক্টো", "নৱে", "ডিচে"], ["জানুৱাৰী", "ফেব্ৰুৱাৰী", "মাৰ্চ", "এপ্ৰিল", "মে’", "জুন", "জুলাই", "আগষ্ট", "ছেপ্তেম্বৰ", "অক্টোবৰ", "নৱেম্বৰ", "ডিচেম্বৰ"]], u, [["খ্ৰীঃ পূঃ", "খ্ৰীঃ"], u, ["খ্ৰীষ্টপূৰ্ব", "খ্ৰীষ্টাব্দ"]], 0, [0, 0], ["d-M-y", "dd-MM-y", "d MMMM, y", "EEEE, d MMMM, y"], ["a h.mm", "a h.mm.ss", "a h.mm.ss z", "a h.mm.ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤ #,##,##0.00", "#E0"], "INR", "₹", "ভাৰতীয় ৰুপী", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=as.js.map[\x{"version":3,"file":"as.js","sourceRoot":"","sources":["as.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,WAAW,EAAC,SAAS,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,aAAa,EAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,cAAc,EAAC,aAAa,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,eAAe,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"as\",[[\"পূৰ্বাহ্ন\",\"অপৰাহ্ন\"],u,u],u,[[\"দ\",\"স\",\"ম\",\"ব\",\"ব\",\"শ\",\"শ\"],[\"দেও\",\"সোম\",\"মঙ্গল\",\"বুধ\",\"বৃহ\",\"শুক্ৰ\",\"শনি\"],[\"দেওবাৰ\",\"সোমবাৰ\",\"মঙ্গলবাৰ\",\"বুধবাৰ\",\"বৃহস্পতিবাৰ\",\"শুক্ৰবাৰ\",\"শনিবাৰ\"],[\"দেও\",\"সোম\",\"মঙ্গল\",\"বুধ\",\"বৃহ\",\"শুক্ৰ\",\"শনি\"]],u,[[\"জ\",\"ফ\",\"ম\",\"এ\",\"ম\",\"জ\",\"জ\",\"আ\",\"ছ\",\"অ\",\"ন\",\"ড\"],[\"জানু\",\"ফেব্ৰু\",\"মাৰ্চ\",\"এপ্ৰিল\",\"মে’\",\"জুন\",\"জুলাই\",\"আগ\",\"ছেপ্তে\",\"অক্টো\",\"নৱে\",\"ডিচে\"],[\"জানুৱাৰী\",\"ফেব্ৰুৱাৰী\",\"মাৰ্চ\",\"এপ্ৰিল\",\"মে’\",\"জুন\",\"জুলাই\",\"আগষ্ট\",\"ছেপ্তেম্বৰ\",\"অক্টোবৰ\",\"নৱেম্বৰ\",\"ডিচেম্বৰ\"]],u,[[\"খ্ৰীঃ পূঃ\",\"খ্ৰীঃ\"],u,[\"খ্ৰীষ্টপূৰ্ব\",\"খ্ৰীষ্টাব্দ\"]],0,[0,0],[\"d-M-y\",\"dd-MM-y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"a h.mm\",\"a h.mm.ss\",\"a h.mm.ss z\",\"a h.mm.ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤ #,##,##0.00\",\"#E0\"],\"INR\",\"₹\",\"ভাৰতীয় ৰুপী\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}";Wxr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["asa", [["icheheavo", "ichamthi"], u, u], u, [["J", "J", "J", "J", "A", "I", "J"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Ijm", "Jmo"], ["Jumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Ijm", "Jmo"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Dec"], ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KM", "BM"], u, ["Kabla yakwe Yethu", "Baada yakwe Yethu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "TZS", "TSh", "shilingi ya Tandhania", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=asa.js.map~Nx{"version":3,"file":"sah.js","sourceRoot":"","sources":["sah.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,KAAK,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,cAAc,EAAC,cAAc,EAAC,cAAc,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,SAAS,EAAC,aAAa,EAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,eAAe,EAAC,cAAc,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,SAAS,EAAC,aAAa,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,cAAc,EAAC,aAAa,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,6BAA6B,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,gBAAgB,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,sBAAsB,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"sah\",[[\"ЭИ\",\"ЭК\"],u,u],u,[[\"Б\",\"Б\",\"О\",\"С\",\"Ч\",\"Б\",\"С\"],[\"бс\",\"бн\",\"оп\",\"сэ\",\"чп\",\"бэ\",\"сб\"],[\"баскыһыанньа\",\"бэнидиэнньик\",\"оптуорунньук\",\"сэрэдэ\",\"чэппиэр\",\"Бээтиҥсэ\",\"субуота\"],[\"бс\",\"бн\",\"оп\",\"сэ\",\"чп\",\"бэ\",\"сб\"]],u,[[\"Т\",\"О\",\"К\",\"М\",\"Ы\",\"Б\",\"О\",\"А\",\"Б\",\"А\",\"С\",\"А\"],[\"Тохс\",\"Олун\",\"Клн\",\"Мсу\",\"Ыам\",\"Бэс\",\"Отй\",\"Атр\",\"Блҕ\",\"Алт\",\"Сэт\",\"Ахс\"],[\"Тохсунньу\",\"Олунньу\",\"Кулун тутар\",\"Муус устар\",\"Ыам ыйын\",\"Бэс ыйын\",\"От ыйын\",\"Атырдьых ыйын\",\"Балаҕан ыйын\",\"Алтынньы\",\"Сэтинньи\",\"ахсынньы\"]],[[\"Т\",\"О\",\"К\",\"М\",\"Ы\",\"Б\",\"О\",\"А\",\"Б\",\"А\",\"С\",\"А\"],[\"Тохс\",\"Олун\",\"Клн\",\"Мсу\",\"Ыам\",\"Бэс\",\"Отй\",\"Атр\",\"Блҕ\",\"Алт\",\"Сэт\",\"Ахс\"],[\"тохсунньу\",\"олунньу\",\"кулун тутар\",\"муус устар\",\"ыам ыйа\",\"бэс ыйа\",\"от ыйа\",\"атырдьых ыйа\",\"балаҕан ыйа\",\"алтынньы\",\"сэтинньи\",\"ахсынньы\"]],[[\"б. э. и.\",\"б. э\"],u,u],1,[6,0],[\"yy/M/d\",\"y, MMM d\",\"y, MMMM d\",\"y 'сыл' MMMM d 'күнэ', EEEE\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"чыыһыла буотах\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"RUB\",\"₽\",\"Арассыыйа солкуобайа\",{\"JPY\":[\"JP¥\",\"¥\"],\"RUB\":[\"₽\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}>&TxD"cgg!cgg<,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACbӓe7`
Z
BaAAa,EAAC,YAAY,EAAC,aAAa,EAAC,UAAU,EAAC,aAAa,EAAC,aAAa,CAAC,EAAC,Ca;`
e7`K6aAAa,EAAC,YAAY,EAAC,aAAa,EAAC,UAAU,EAAC,aAAa,EAAC,aAAa{&YAAY,EAAC,WAAW,EAAC,oBAAoB,EAAC,oBAAoB(qBAAqB,EAAC,kBAAkB(
m
UAAU,EAAC,gBAAgIٓ=WAAWo
o
qBAAqB,E1`if (n === 1)\n    return 1;	$cgg\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"K\",\"R\",\"S\",\"N\",\"T\",\"M\"],[\"SAN\",\"ORK\",\"OKB\",\"OKS\",\"OKN\",\"OKT\",\"OMK\"],[\"Sande\",\"Orwokubanza\",\"Orwakabiri\",\"Orwakashatu\",\"Orwakana\",\"Orwakataano\",\"Orwamukaaga\"],[\"SAN\",\"ORK\",\"OKB\",\"OKS\",\"OKN\",\"OKT\",\"OMK\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"KBZ\",\"KBR\",\"KST\",\"KKN\",\"KTN\",\"KMK\",\"KMS\",\"KMN\",\"KMW\",\"KKM\",\"KNK\",\"KNB\"],[\"Okwokubanza\",\"Okwakabiri\",\"Okwakashatu\",\"Okwakana\",\"Okwakataana\",\"Okwamukaaga\",\"Okwamushanju\",\"Okwamunaana\",\"Okwamwenda\",\"Okwaikumi\",\"Okwaikumi na kumwe\",\"Okwaikumi na ibiri\"]],u,[[\"BC\",\"AD\"],u,[\"Kurisito Atakaijire\",\"Kurisito Yaijire\"]],1,[0,0],[\"dd/MM/y\+",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM yzU.\",\",:NaN-&;¤#,##0.00\",\"#E0\"],\"UGX\",\"USh\",\"Eshiringi ya Uganda UGX\":[\"USh3(;dxE"ii!ii<IAAIe7`

}Ge(
m
UAAU,EAAC,gBAAgIٓ=FKAAK,E7ii\",[[\"ꎸꄑ\",\"ꁯꋒ\"],u,u],u,[[\"ꆏ\",\"ꋍ\",\"ꑍ\",\"ꌕ\",\"ꇖ\",\"ꉬ\",\"ꃘ\"],[\"ꑭꆏ\",\"ꆏꋍ\",\"ꆏꑍ\",\"ꆏꌕ\",\"ꆏꇖ\",\"ꆏꉬ\",\"ꆏꃘ\"],[\"ꑭꆏꑍ\",\"ꆏꊂꋍ\",\"ꆏꊂꑍ\",\"ꆏꊂꌕ\",\"ꆏꊂꇖ\",\"ꆏꊂꉬ\",\"ꆏꊂꃘ\"],[\"ꑭꆏ\",\"ꆏꋍ\",\"ꆏꑍ\",\"ꆏꌕ\",\"ꆏꇖ\",\"ꆏꉬ\",\"ꆏꃘ\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"ꋍꆪ\",\"ꑍꆪ\",\"ꌕꆪ\",\"ꇖꆪ\",\"ꉬꆪ\",\"ꃘꆪ\",\"ꏃ\",\"ꉆꆪ\",\"ꈬꆪ\",\"ꊰꆪ\",\"ꊰꊪꆪ\",\"ꊰꑋꆪ\"],u],u,[[\"ꃅꋊꂿ\",\"ꃅꋊꊂ\"],u,u],0,[6,0],[\"y-MM-dd\%",\"y MMM d\",\"y MMMM d\",\"y MMMM dt[.\",\",:NaN-&A¤ #,##0.00\",\"#E0\"],\"CNY\",\"¥\",\"CNY\",{\"CNY\":[\"¥\"],-8y:x[asa!asa<WAAW,EAAC,UAAU)
FGPUAAU,EAAC,UAAUUAAU,EAAC,QAAQ,EAAC,UAAU`xO

^OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS$:(mBAAmB,EAAC,mBAAmB$GYAAY)uBAAuI=6asa\",[[\"icheheavo\",\"ichamthi\"],u,u],u,[[\"J\",\"J	I\",\"J\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Ijm\",\"Jmo\"],[\"Jumapili\",\"Jumatatu\",\"Jumanne\",\"Jumatano\",\"AlhaVmisi\",\"Ijumaa\",\"Jumamosi\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Ijm\",\"Jmo	UJan\",\"Feb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Dec\"],[\"Januari\",\"Februari\",\"Machi\",\"Aprili\",\"Mei\",\"Juni\",\"Julai\",\"Agosti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Desemba\"]],u,[[\"KM\",\"BM\"],u,[\"0Kabla yakwe Yethu\",\"Baada yakwe Yethu\"]],1,[6q>#,##0.00 ¤\",\"#E0\"],\"TZS\",\"TSh\",\"shilingi ya Tandhani!
TZS\":[\"T5bFOxjdje!dje<<UAAU,EAAC,YAAY)
FGP@QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ`IAAIIAAI8O
hWAAW,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,WAAW$:(WAAW,EAAC,cAAc$ 
UAAU,EAAC,UAAU,EAAC,eAAe'OAAO,EAAC,kBAAkIHd"dje\",[[\"Subbaahi\",\"Zaarikay b\"],u,u],u,[[\"H\",\"T\",\"T\",\"L\",\"M\",\"Z\",\"S\"],[\"Alh\",\"Ati\",\"Ata\",\"Ala\",\"Alm\",\"Alz\",\"Asi\"],[\"Alhadi\",\"Atinni\",\"Atalaata\",\"Alarba\",\"Alhamisi\",\"Alzuma\",\"Asibti\"],[\"Alh\",\"Ati\",\"Ata\"W,\"Ala\",\"Alm\",\"Alz\",\"Asi\"]],u,[[\"Ž\",\"F\",\"M\",\"A\",\"M\",\"Ž\",\"Ž\",\"U	Žan\",\"Fee\",\"Mar\",\"Awi\",\"Me\",\"Žuw\",\"Žuy\",\"Ut\",\"Sek\",\"Okt\",\"Noo\",\"Dee\"],[\"Žanwiye\",\"Feewiriye\",\"Marsi\",\"Awiril\",\"Me\",\"Žuweŋ\",\"Žuyye\",\"Ut\",\"Sektanbur\",\"Oktoobur\",\"Noowanbur\",\"Deesanbur\"]],u,[[\"IJ\",\"IZ[\"],u,[\"Isaa jine\",\"Isaa zamanoo\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEEd c=#,##0.00¤\",\"#E0\"],\"XOF\",\"F CFA\",\"CFA Fraŋ (BCEAO)!,WR(OHxdua!dua<<OAAO,EAAC,QAAQ)
FG:
MAAM)
=OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,CAAC,E1MAAM):
MAAM)MAAMO
hQAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,cAAc,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS$MAAM,EAAC,OAAOakBAAkB,EAAC,mBAAmB$ 
eAAe'SAAS,EAAC,YAAYMAAM,EAAC,KAAKJGd"dua\",[[\"idiɓa\",\"ebyámu\"],u,u],u,[[\"e\",\"m\",\"k\",\"m\",\"ŋ\",\"ɗ\",\"e\"],[\"ét\",\"mɔ́s\",\"kwa\",\"muk\",\"ŋgi\",\"ɗón\",\"esa\"],[\"éti\",\"mɔ́sú\",\"kwasú\",\"mukɔ́sú\",\"ŋgisú\",\"ɗónɛsú\",\"esaɓasú\"],[\"ét\",\"m́s\",\"kwa\",\"muk\",\"ŋgi\",\"ɗón\",\"esa\"]],u,[[\"d\",\"ŋ\",\"s\",\"d\",\"e\",\"e\",\"m\",\"d\",\"n\",\"m\",\"t\",\"e\"],[\"di\",\"ŋgɔn\",\"sɔŋ\",\"diɓ\",\"emi\",\"esɔ\",\"mad\",\"diŋ\",\"nyɛt\",\"may\",\"tin\",\"elá\"],[\"dimɔ́di\",\"ŋgɔndɛ\",\"sɔŋɛ\",\"diɓáɓá\",\"emiasele\",\"esɔpɛsɔpɛ\",\"madiɓɛ́díɓɛ́\",\"diŋgindi\",\"nyɛtɛki\",\"mayésɛ́\",\"tiníní\",\"eláŋgɛ́\"]],u,[[\"ɓ.Ys\",\"mb.Ys\"],u,[\"ɓoso ɓwá yáɓe lá\",\"mbúsa kwédi a Yés\"]],1,[
6,0],[\"d/|%^,\",\" ]6 %\",\"#,##0.00 ¤\",\"#E0\"],\"XAF\",\"FCFA\",\"XAF!,-Ux! 	eAAe,EAAE2t];\n"]}
Mx#i"i;("IAAI,EAAC,CAAC,CAAC,MAAM,EAAC,MAAMaO
SAASMAAM,EAAC,MAAM.MAAMQAAQ,EAAC,OAAOSAAS,EAAC,SAAS,EAAC,SAASBMAAM2UAAU,ETQAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS$MAAM,EAAC,MAAMa#QAAQbUAAU,EAAC,CAAC,EAAC,cAAcPU	EAAC,OAAOJd"ig\",[[\"A.M.\",\"P.M.\"],u,[\"N’ụtụtụ\",\"N’abali\"]],[[\"A.M.\",\"P.M.\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sọn\",\"Mọn\",\"Tiu\",\"Wen\",\"Tọọ\",\"Fraị\",\"Sat\"],[\"Sọndee\",\"Mọnde\",\"Tiuzdee\",\"Wenezdee\",\"Tọọzdee\",\"Fraịdee\",\"Satọdee\"],[\"Sọn\",\"Mọn\",\"Tiu\",\"Wen\",\"Tọọ\",\"Fraị\",\"Sat\"]],u,[[\"J\",	E\",\"M\",\"J\",\"J\",\"Ọ\",\"S\",\"Ọ\",\"N\",\"D\"],[\"Jen\",\"Feb\",\"Maa\",\"Epr\",\"Mee\",\"Juu\",\"Jul\",\"Ọgọ\",\"Sep\",\"Ọkt\",\"Nov\",\"Dis\"],[\"Jenụwarị\",\"Febrụwarị\",\"Maachị\",\"Epreel\",\"Mee\",\"Juun\",\"Julaị\",\"gọọst\",\"Septemba\",\"Ọktoba\",\"Novemba\",\"Disemba\"]],u,[[\"T.K.\",\"A.K.\"],u,[\"Tupu Kraist\",\"Afọ Kraịst\"]],1,[6,0],[\"d/M/y~q, {0}\",u,\"{1} 'na' {0}\")NGN\",\"₦\",\"Naịra\",{\"NGN\":[\"₦ț7pxjmc!jmc<OAAO,EAAC,WAAW)
FGPWAAW,EAAC,WAAWUAAU,EAAC,QAAQ,EAAC,UAAU`xO

^OAAO,EAAC,SAAS,EAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS$:(iBAAiB,EAAC,iBAAiB$tsBAAsI=3jmc\",[[\"utuko\",\"kyiukonyi\"],u,u],u,[[\"J\",\"J	I\",\"J\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"],[\"Jumapilyi\",\"Jumatatuu\",\"Jumanne\",\"Jumatanu\",\"AlXhamisi\",\"Ijumaa\",\"Jumamosi\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo	UJan\",\"Feb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Machi\",\"Aprilyi\",\"Mei\",\"Junyi\",\"Julyai\",\"Agusti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Desemba\"]],u,[[\"KK\",\"BK\"],u,/[\"Kabla ya Kristu\",\"Baada ya Kristu\"]],1,[6q#TZS\",\"TSh\",\"Shilingi ya Tanzani!
TZS\":[\"T59;~xDksb!ksb<OAAO,EAAC,UAAU)
FGP@UAAU,EAAC,WAAW,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,WAAW`xO

^OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS$:(iBAAiB,EAAC,iBAAiB$tsBAAsI=ksb\",[[\"makeo\",\"nyiaghuo\"],u,u],u,[[\"2\",\"3\",\"4\",\"5\",\"A\",\"I\",\"1\"],[\"Jpi\",\"Jtt\",\"Jmn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"],[\"Jumaapii\",\"Jumaatatu\",\"Jumaane\",\"Jumaatano\",\"Alhamisi\",\"Ijumaa\",\"Jumaamosi\"],[\"Jpi\",\"Jtt\",\"#Jmn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo	UJan\",\"Feb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januali\",\"Febluali\",\"Machi\",\"Aplili\",\"Mei\",\"Juni\",\"Julai\",\"Agosti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Desemba\"]],u,[[\"KK\",\"BK\"],u,[\",Kabla ya Klisto\",\"Baada ya Klisto\"]],1,[6q;#,##0.00¤\",\"#E0\"],\"TZS\",\"TSh\",\"shilingi ya Tanzani!
TZS\":[\"T5'k6Hxhl"l;IAAI*@UAAU,EAAC,QAAQ,EAAC,WAAW,EAAC,WAAW,EAAC,SAAS,EAAC,YAAY,EAAC,YAAY`xWAAW,ETOAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS$:(sBAAsB,EAAC,sBAAsB$l&B\",\"L\",\"L\",\"L\",\"L\",\"L\"],[\"Sab\",\"Bal\",\"Lw2\",\"Lw3\",\"Lw4\",\"Lw5\",\"Lw6\"],[\"Sabbiiti\",\"Balaza\",\"Lwakubiri\",\"Lwakusatu\",\"Lwakuna\",\"Lwakutaano\",\"Lwamukaaga\"],[\"Sab\",\"Bal\",\"Lw2\",\"Lw3\",\"Lw4\",\"Lw5\",\"Lw6\"]],u,[[\"	JJan\",\"Feb\",\"Mar\",\"Apu\",\"Maa\",\"Juu\",\"Jul\",\"Agu\",\"Seb\",\"Oki\",\"Nov\",\"Des\"],[\"Janwaliyo\",\"Febwaliyo\",\"Marisi\",\"Apuli\",\"Maayi\",\"Juuni\",\"Julaayi\",\"Agusito\",\"Sebuttemba\",\"Okitobba\",\"Novemba\",\"Desemba\"]],u,[[\"BC\",:\"AD\"],u,[\"Kulisito nga tannaza\",\"Bukya Kulisito Azaalh6#,##0.00¤\",\"#E0\"],\"UGX\",\"USh\",\"Silingi eya Yud3?x<lrc!lrc<"


_IAAI,En"QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CA


D<GYAAY)
POAAO3}d"lrc%M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],u,u],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"جانڤیە\",\"فئڤریە\",\"مارس\",\"آڤریل\",\"مئی\",\"جوٙأن\",\"جوٙلا\",\"آگوست\",\"سئپتامر\",\"ئوکتوڤر\",\"نوڤامر\",\"دئسامر\"],u],u,[[\"BCOE\",\"CE\"],u,u],6,[5,5],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEEG #,##0.00\",\"#E0\"],\"IRR\",\"IRR\",\"IRR\",{\"IQD\":[\"د.ع.‏\"],rtl\", plural];\n"]}!J
xWm"m;B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC=IAAI*@MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM?aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,MAAM,EAAC,UAAU,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM(O

@QAAQ,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,WAAWUAAU$:(R7eAAe'YAAYIAAI,EAAC,QAAQJBIAAI#Math.floor(n) && (n >= 0 && n <= 1)R4m A\",\"A\",\"T\",\"A\",\"A\",\"Z\",\"A\"],[\"Alah\",\"Alats\",\"Tal\",\"Alar\",\"Alak\",\"Zom\",\"Asab\"],[\"Alahady\",\"Alatsinainy\",\"Talata\",\"Alarobia\",\"Alakamisy\",\"Zoma\",\"Asabotsy\"],[\"Alah\",\"Alats\",\"Tal\",\"Alar\",\"Alak\",\"Zom\",\"Asab	UJan\",\"Feb\",\"Mar\",\"Apr\",\"Mey\",\"Jon\",\"Jol\",\"Aog\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Janoary\",\"Febroary\",\"Martsa\",\"Aprily\",\"Mey\",\"Jona\",\"Jolay\",\"Aogositra\",\"Septambra\",\"Oktobra\",\"Novambra\",\"Desambra\"]],u,[[\"BC\",\"AD\`"],u,[\"Alohan’i JK\",\"Aorian’i JK\"]],1,[6,0],[\"y-MM-dd\",\"y MMM d\",\"d MMMM y\",\"EEEE- #,##0.00\",\"#E0\"],\"MGA\",\"Ar\",\"Ariary MGA\":[\"Ar3WEAxTmua!mua<<OAAO,EAAC,OAAO)
FGP@WAAW,EAAC,WAAW,EAAC,YAAY,EAAC,UAAU,EAAC,cAAc,EAAC,WAAW,EAAC,YAAY`xO
:cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,cAAc!4#:(cAAc,EAAC,YAAY$ 
eAAe'MAAM,EAAC,YAAYJGd"mua\",[[\"comme\",\"lilli\"],u,u],u,[[\"Y\",\"L\",\"Z\",\"O\",\"A\",\"G\",\"E\"],[\"Cya\",\"Cla\",\"Czi\",\"Cko\",\"Cka\",\"Cga\",\"Cze\"],[\"Com’yakke\",\"Comlaaɗii\",\"Comzyiiɗii\",\"Comkolle\",\"Comkaldǝɓlii\",\"Comgaisuu\",\"Comzyeɓsuu\"],[\"Cya\",\"Cla\",\"Czi\",\"Cko\",\"Cka\",\"Cga\",\"Cze\"]],u,[[\"O\",\"A\",\"I\",\"F\",\"D\",\"B\",\"L\",\"M\",\"E\",\"U\",\"W\",\"Y\"],[\"FLO\",\"CLA\",\"CKI\",\"FMF\",\"MAD\",\"MBI\",\"MLI\",\"MAM\",\"FDE\",\"FMU\",\"FGW\",\"FYU\"],[\"Fĩi Loo\",\"Cokcwaklaŋne\",\"Cokcwaklii\",\"Fĩi Marfoo\",\"Madǝǝuutǝbijaŋ\",\"Mamǝŋgwãafahbii\",\"Mamǝŋgwãalii\",\"Madǝmbii\",\"Fĩi Dǝɓlii\",\"Fĩi Mundaŋ\",\"Fĩi Gwahlle\",\"Fĩi Yuru\"]],u,[[\"KK\",\"PK\"],u,[\"KǝPel Kristu\",\"Pel Kristu\"]],1,[6,0],[\"d/|%^,\",\".{XAF\",\"FCFA\",\"solai BEAC!,Y=$x(nd!nd<IAAI*6OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,UAAU`MAAM$MAAMMAAM$MAAM,CAAC,EAAC,CAAC,YAAY,EAAC,WAAW,EJYAAY,EAAC,WAAW,EAAC,WAAW,EAAC,YAAY,EAAC,UAAU,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW$:(oBAAoB,EAAC,iBAAiB$tmBAAmIHnd%M\",\"S\",\"S\",\"S\",\"S\",\"M\"],[\"Son\",\"Mvu\",\"Sib\",\"Sit\",\"Sin\",\"Sih\",\"Mgq\"],[\"Sonto\",\"Mvulo\",\"Sibili\",\"Sithathu\",\"Sine\",\"Sihlanu\",\"Mgqibelo\"],[\"Son\",\"Mvu\",\"Sib\",\"Sit\",\"Sin\",\"Sih\",\"Mgq\"]],u,[[\"Z\",\"N\",\"M\",\"M\",\"N\",\"N\",\"N\",\"N\",\"M\",\"M\",\"L\",\"M\"],[\"Zib\",\"Nhlo\",\"Mbi\",\"Mab\",\"Nkw\",\"Nhla\",\"Ntu\",\"Ncw\",\"Mpan\",\"Mfu\",\"Lwe\",\"Mpal\"],[\"Zibandlela\",\"Nhlolanja\",\"Mbimbitho\",\"Mabasa\",\"Nkwenkwezi\",\"Nhlangula\",\"Ntulikazi\",\"Ncwabakazi\",\"Mpandula\",\"Mfumfu\",\"Lwezi\",\"Mpalakazi\"]],u,[[\"BC\",\"AD\"],u,[\"UKristo angakabuyi\",\"Ukristo ebuyil
e\"]],0,[6qSD\",\"US$\",\"Dola yase Amelik",
o#V
xisd!sd<IAAI,EAAC,CAAC,CN"RRR

6IAAI,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM6MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM)
 
SAAS,EAAC,MAAM,EAAC,OAAO6QAAQ,EAAC,MAAM,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO

:(UAAU,EAAC,iBAAiB$MQAAQ,EAAC,WAAW,EAAC,aAAaOYAAYIAAI,EAAC,cAAcJ
IAAI3}
nIAAIsd\",[[\"صبح، منجهند\",\"منجهند، شام\"],[\"صبح، منجهند\",\"شام، منجهند\"],[\"صبح، نجهند\",\"منجهند، شام\"]],[[\"صبح، منجهند\",\"منجهند، شام\"],u,u],[[\"آچر\",\"سو\",\"ڱارو\",\"اربع\",\"خم\",\"جمعو\",\"ڇنڇر\"],[\"آچر\",\"سومر\",\"اڱارو\",\"اربع\",\"خميس\",\"جمعو\",\"ڇنڇر\"],u,u	Rجنوري\",\"فيبروري\",\"مارچ\",\"اپريل\",\"مئي\",\"جون\",\"جولاءِ\",\"آگسٽ\",\"سيپٽمب\",\"آڪٽوبر\",\"نومبر\",\"ڊسمبر\"],u],u,[[\"BC\",\"CD\"],u,[\"قبل مسيح\",\"عيسوي کان پهرين\"]],0,[6,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzV #,##0.00\",\"#E0\"],\"PKR\",\"Rs\",\"پاڪستاني رپي\",{\"BYN\":[u,\"р.\"],PHP\":[u,\"₱\"],\"PKR\":[\"Rsrtl\", plural];\n"]}G?xwae!wae<O
6QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS`x^QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,aAAa,EAAC,SAASLSAAS,EAAC,QAAQ)
#
WAAW,EAAC,iBAAiB'YAAY)
EAAEwae%M\",\"Z\",\"M\",\"F\",\"F\",\"S\"],[\"Sun\",\"Män\",\"Ziš\",\"Mit\",\"Fró\",\"Fri\",\"Sam\"],[\"Sunntag\",\"Mäntag\",\"Zištag\",\"Mittwuč\",\"Fróntag\",\"Fritag\",\"Samštag\"],[\"Sun\",\"Män\",\"Ziš\",\"Mit\",\"Fró\",\"Fri\",\"Sam\"]],u,[[\"J\",\"H\",\"M\",\"A\",\"M\",\"B\",\"H\",\"Ö\",\"H\",\"W\",\"W\",\"C\"],[\"Jen\",\"Hor\",\"Mär\",\"Abr\",\"Mei\",\"Brá\",\"Hei\",\"Öig\",\"Her\",\"Wím\",\"Win\",\"Chr\"],[\"Jenner\",\"Hornig\",\"Märze\",\"Abrille\",\"Meije\",\"Bráčet\",\"Heiwet\",\"Öigšte\",\"Herbštmánet\",\"Wímánet\",\"Wintermánet\",\"Chrištmánet\"]],u,[[\"v. Chr.\",\"n. Chr\"],u,u],1,[6,0],[\"y-MM-dd\",\"d. MMM y\",\"d..\	,\",\"’e/ #,##0.00\",\"#E0\"],\"CHF\",\"CHF\",\"CHF\",{<!Iqxgff!ff<EAAE,CAAC,GAAG.,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7ClB="IAAI,EAAC,CAAC,CAAC,QAAQ,EAAC,SAASa
_$MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EawOAAO,EAAC,OAAO,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQOAAO_V_

aAAa_*
7OAAO,EAAC,qBAAqB,Ep,
[4, i = Math.floor(Math.abs(val));\n\nif (i === 0 || iH:ff\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade Iisa\",-\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM,?X^,\",\" }(XOF\",\"F CFA\",\"Mbuuɗu Seefaa BCEAO_ -{bjcx3sc!sc<EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,lB=IAAI^.nn((WAAW,EAAC,QAAQ`xYAAY,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,SAAS,EAAC,OAAO,EAAC,WAAW,EAAC,YAAY,EAAC,YAAY,EAAC,QAAQ,CAAC,CAAC,EA_MAAM,EAAC,MAAMaoBAAoB,EAAC,oBAAoB_#cAAc,EAAC,yBAAyB,EAAC,oCAAoC	B 
CAAC,EAAC,mBAAmB}GAAG,EAAC,MAAM,Ep,
[<, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;^$sc\",[[\"m.\",\"b.\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"D\",\"L\",\"M\",\"M\",\"G\",\"C\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mèr\",\"giò\",\"che\",\"sàb\"],[\"domìniga\",\"lunis\",\"martis\",\"mèrcuris\",\"giòbia\",\"chenàbura\",\"sàbadJu\"],[\"dom\",\"lun\",\"mar\",\"mèr\",\"giò\",\"che\",\"sàb\"]],u,[[\"G	L\",\"T\",\"A\",\"C\",\"S\",\"S\",\"N\"],[\"ghe\",\"fre\",\"mar\",\"abr\",\"maj\",\"làm\",\"trì\",\"aus\",\"cab\",\"stG\",\"stA\",\"nad\"],[\"ghennàrgiu\",\"freàrgiu\",\"martzu\",\"abrile\",\"maju\",\"làmpadas\",\"trìulas\",\"austu\",\"cabudanni\",\"santugaine\",\"santandria\",\"nadale\"]],u,[[\"a.C.\",\"p.C.\"],u,[\"in antis de Cristu\",\"a pustis de Cristu\"]],1,[6,0],[\-M'de' MMM y\",\"d 'de' MMMM 'de' 'su' y\",\"d 'de' MMMM 'de' 'su' y, 'de' EEEEaD-, {0}\",u,\"{1} 'a' 'sas' {0}\",u],[\",\",\".}EUR\",\"€\",\"èuro_ *,\"XDR\":[\"DIP\"]},\"ltr\", plural];\n"]}!x lrc!lrc<UtqHxks-Deva!ks-Deva:"SAAS,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI)A^,+(OAAO)
IAAI!=7,
6QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO%.QAAQp
IAAI,EAAC,IAAI)\QAAQ,EAAC,WAAW,EAAC,aAAa
CAAC,EAAC,aAAaYAAY*)aAAa,EAAC,EAAC,KAAK,EAAC,Cks-Deva\",[[\"AM\",\"PM\"],u,u],u,[[\"अ\",\"च\",\"ब\",\"ब\",\"ब\",\"ज\",\"ब\"],[\"आथवार\",\"चंदरवार\",\"बुवार\",\"बोदवार\",\"ब्रेसवार\",\"जुम्मा\",\"बटवा\"],u,u],u,[[\"ज\",\"फ़\",\"म\",\"अ\",\"म\",\"ज\",\"ज\",\"अ\",\"स\",\"ओ\",\"न\",\"द\"],[\"जनवी\",\"फ़रवरी\",\"मार्च\",\"अप्रैल\",\"मे\",\"जून\",\"जुलाई\",\"अगस्त\",\"सतुंबर\",\"अकतुम्बर\",\"नवूमबर\",\"दसूमबर\"],u],u,[[\"BC\",\"AD\"],u,u],0,[03@,a h:mm\",\"a h:mm:ss\",\"a h:mm:ss z\",\"a h"0} पेठ {1va #,##0.00\",\"#E0\"],\"INR\",\"₹\",\"इंडियन रूपी\",{\"JPY\":[\"JP¥\",\"¥|`$C9x:kde!kde<<MAAM,EAAC,OAAOa
_BgBAAgB,EAAC,gBAAgB,EAAC,mBAAmB,EAAC,kBAAkB,EAAC,2BAA2B,EAAC,4BAA4BphcAAc,EAAC,eAAe,EAAC,eAAe,EAAC,kBAAkB,EAAC,iBAAiB,EAAC,wBAAwB,EAAC,2BAA2B,EAAC,2BAA2B,EAAC,4BAA4B,EAAC,2BAA2B,EAAC,gCAAgC,EAAC,gCAAg_7gBAAgB,EAAC,eAAe_w`"kde\",[[\"Muhi\",\"Chilo\"],u,u],u,[[\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"1\"],[\"Ll2\",\"Ll3\",\"Ll4\",\"Ll5\",\"Ll6\",\"Ll7\",\"Ll1\"],[\"Liduva lyapili\",\"Liduva lyatatu\",\"Liduva lyanchechi\",\"Liduva lyannyano\",\"Liduva lyannyano na linji\",\"Liduva lyannyano na mavili\",\"Liduva litandi\"],[\"Ll2\",\"Ll3\",\"Ll4\",\"Ll5\",\"Ll6\",\"Ll7\",\"Ll1\"]],u,[[\"J\",\"F\",\"M\"	Mwedi Ntandi\",\"Mwedi wa Pili\",\"Mwedi wa Tatu\",\"Mwedi wa Nchechi\",\"Mwedi wa Nnyano\",\"Mwedi wa Nnyano na Umo\",\"Mwedi wa Nnyano na Mivili\",\"Mwedi wa Nnyano na Mitatu\",\"Mwedi wa Nnyano na Nchechi\",\"Mwedi wa Nnyano na Nnyano\",\"Mwedi wa Nnyano na Nnyano na U\",\"Mwedi wa Nnyano na Nnyano na M\"]],u,[[\"AY\",\"NY\"],u,[\"Akanapawa Yesu\",\"Nankuida Yesu\"]],1,[6,0],)ZYLIx! 	eAAe,EAAE2D];\n"]}@
0x dua!dua<TcSx sd!sd<Etx wa"wa;F}x! 	eAAe,EAAE2];\n"]}
3d-xIla"la9EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,CAAC,KAAK,CAACCAAC,KAAK,CAAC,CAAC;QACl2>KAAK,EAAC,CAAC,C"A]
$$
TOAAO,CAAC,EAAC,CAAC,WAAW,EAAC,UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,WAAWM$$
OAAO$
OAAO,EAAC,QAAQ,EAAC,OAAOlSAAS,EAAC,OAAO,EAAC,OAAONQAAQ,CAAC,EAAC,Cn'EAAC,cAAc,EAAC,YAAYlSAAS,E'#KAAK$sBAAsB,EAAC,qBAAqB[gBAAgBM-
wBAAwB,E1af, i = Math.floor(Math.abs(val));\n\nif (n === 0)\n    return 0;\nif ((i === 0 || i === 1) && !(n === 05lag\",[[\"TOO\",\"MUU\"],u,u],u,[[\"P\",\"T\",\"E\",\"O\",\"A\",\"I\",\"M\"],[\"Píili\",\"Táatu\",\"Íne\",\"Táano\",\"Alh\",\"Ijm\",\"Móosi\"],[\"Jumapíiri\",\"Jumatátu\",\"Jumaíne\",\"Jumatáano\",\"Alamíisi\",\"Ijumáa\",\"Jumamóosi\"],[\"Píili\",\"Táatu\",\"Íne\",\"Táano\",\"Alh\",\"Ijm\",\"Móosi\"]],u,[[\"F\",\"N\",\"K\",\"I\",\"I\",\"I\",\"M\",\"V\",\"S\",\"I\",\"S\",\"S\"],[\"Fúngatɨ\",\"Naanɨ\",\"Keenda\",\"Ikúmi\",\"Inyambala\",\"Idwaata\",\"Mʉʉnchɨ\",\"Vɨɨrɨ\",\"Saatʉ\",\"Inyi\",\"Saano\",\"Sasatʉ\"],[\"Kʉfúngatɨ\",\"Kʉnaanɨ\",\"Kʉkeenda\",\"Kwiikumi\",\"Kwiinyambála\",\"Kwiidwaata\",\"Kʉmʉʉnchɨ\",\"Kʉvɨɨrɨ\",\"Kʉsaatʉ\",\"Kwiinyi\",\"Kʉsaano\",\"Kʉsasatʉ\"]],u,[[\"KSA\",\"KA\"],u,[\"Kɨrɨsitʉ s`ɨ anavyaal\",\"Kɨrɨsitʉ akavyaalwe\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE,(TZS\",\"TSh\",\"Shilíingi ya Taansanía TZS\":[\"TSh3?xfe"fe:H(KAAK8P(z
OCAAC,EAAC,CAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,MAAM,EAAC,UAAU,EAAC,OAAO8z
#z
-#QAAQ,EAAC,SAASNIAAI,EAAC,KAAK"QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO$j
SAASiBAAiB,EAAC,iBAAiB=]D@gBAAgB,E1#fed\",\"l\",\"m\",\"m\",\"z\",\"v\",\"s\"],[\"dim\",\"lin\",\"mar\",\"mer\",\"ze\",\"van\",\"sam\"],[\"dimans\",\"lindi\",\"mardi\",\"merkredi\",\"zedi\",\"vandredi\",\"samdi\"],[\"dim\",\"lin\",\"mar\",\"mer\",\"ze\",\"van\",\"sam\"]],u,[[\"z\",\"f\",\"m\",\"a\",\"m\",\"z\",\"z\",\"o\",\"s\",\"o\",\"n\",\"d\"],[\"zan\",\"fev\",\"mar\",\"avr\",\"me\",\"zin\",\"zil\",\"out\",\"sep\",\"okt\",\"nov\",\"des\"],[\"zanvie\",\"fevriye\",\"mars\",\"avril\",\"me\",\"zin\",\"zilye\",\"out\",\"septam\",\"oktob\",\"novam\",\"desam\"]],u,[[\"av. Z-K\",\"ap. Z-K\"],u,[\"avan Zezi-Krist\",\"apre Zezi-Krist\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"u ~UR\",\"Rs\",\"roupi morisien!
UR\":[\"Rs3D2lx1se!se:6CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP3Q
V

eAAe,C
V
YAAY,EAAC,cAAc,CAB=MAAM,EAAC,KAAK6WAAW,EAAC,YAAY,EAAC,aAAa,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW
B=MAAM,EAAC,KAAK$
8#=,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMP`eAAe,EAAC,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,cAAc,E6OAAO,EAAC,OAAOiBAAiB,EAAC,kBAAkB[gBAAgBMMAAML|
W-gBAAgB,E"IAAI7IAAI-1)\n    return 1;\nif (n === 2)\n    return 2%se\",[[\"i.b.\",\"e.b.\"],u,[\"iđitbeaivet\",\"eahketbeaivet\"]],[[\"i.b.\",\"e.b.\"],u,[\"iđitbeaivi\",\"eahketbeaivi\"]],[[\"S\",\"V\",\"M\",\"G\",\"D\",\"B\",\"L\"],[\"sotn\",\"vuos\",\"maŋ\",\"gask\",\"duor\",\"bear\",\"láv\"],[\"sotnabeaivi\",\"vuossárga\",\"maŋŋebárga\",\"gaskavahkku\",\"duorasdat\",\"bearjadat\",\"lávvardat\"],[\"sotn\",\"vuos\",\"maŋ\",\"gask\",\"duor\",\"bear\",\"láv\"]],u,[[\"O\",\"G\",\"N\",\"C\",\"M\",\"G\",\"S\",\"B\",\"Č\",\"G\",\"S\",\"J\"],[\"ođđj\",\"guov\",\"njuk\",\"cuo\",\"mies\",\"geas\",\"suoi\",\"borg\",\"čakč\",\"golg\",\"skáb\",\"juov\"],[\"ođđajagemánnu\",\"guovvamnnu\",\"njukčamánnu\",\"cuoŋománnu\",\"miessemánnu\",\"geassemánnu\",\"suoidnemánnu\",\"borgemánnu\",\"čakčamánnu\",\"golggotmánnu\",\"skábmamánnu\",\"juovlamánnu\"]],u,[[\"o.Kr.\",\"m.Kr.\"],u,[\"ovdal Kristtusa\",\"maŋŋel Kristtusa\"]%y MMMM d\",\"y MMMM d, EEEEU,\",\" −\",\"·10^\",\"·C8 %\",\"#,##0.00 ¤\",\"#E0\"],\"NOK\",\"kr\",\"norgga kruvdno\",{\"DKK\":[\"Dkr\",\"kr\"],\"JPY\":[\"JP¥\",\"¥\"],\"NOK\":[/\"kr\"],\"SEK\":[\"Skr\",\"kr\"],\"THB\":[\"฿3\+zqx la"la9E"x dje!dje<TVUEx ksb!ksb<Uaomhx #;&x se!se<Ex! 	eAAe,EAAE2$];\n"]}
G0x hsb!hsb<U"i.x! 	eAAe,EAAE2];\n"]}C	0x dsb!dsb<TaSx ig!ig<ETtx ks-Dev"ks-Dev;0	Q)x jmc!jmcDUwLx sd&sd?GLR,x(ckb!ckb:KAAK,EAAC,CAAC,C"o
o_UAAU,EAAC,UAAU,EAAC,SAASOAAO,EAAC,OAAO_8EAAC,IAAI,EAAC,IAAI,EAAC,IAAIoP#,eAAe,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO ,KAAK,EAAC,SAAS,EAAC,cAAc,EAAC,cAAc,EAAC,cAAcP.WAAW,EAAC,QAAQ_
o-YAAYQAAQ,EAAC,WAAW,EAAC,aAAaIZIAAI.
2
OAAO,EAAC,KAAK,E!	CAAC,OAAOY	ckb\",[[\"ب.ن\",\"د.ن\"],u,u],u,[[\"ی\",\"د\",\"س\",\"چ\",\"پ\",\"ھ\",\"ش\"],[\"یەکشەممە\",\"دووشەمم\",\"سێشەممە\",\"چوارشەممە\",\"پێنجشەممە\",\"ھەینی\",\"شەممە\"],u,[\"١ش\",\"٢ش\",\"٣ش\",\"٤ش\",\"٥ش\",\"ھ\",\"ش\"]],u,[[\"ک\",\"ش\",\"ئ\",\"ن\",\"ئ\",\"ح\",\"ت\",\"ئ\",\"ئ\",\"ت\",\"ت\",\"ک\"],[\"کانوونی دووەم\",\"شوبات\",\"ئازار\",\"نیسان\",\"ئایار\",\"حوزەیران\",\"تەمووز\",\"ئاب\",\"ئەیلوول\",\"تشرینی یەکەم\",\"تشرینی دووەم\",\"کانونی یەکەم\"],u],u,[[\"پێش زایین\",\"زایینی\"],u,u],6,[5,6],[\"y-MM-dd\",\"y MMM d\",\"dی MMMMی y\",\"y MMMM d, EEEE\"],[\"h:mm a\",\"h:%mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a}8‎TM #,##0.00\",\"#E0\"],\"IQD\",\"د.ع.‏\",\"IQD\",{\"IQD\":[\"د.ع.‏\"],D5rtl\", plural];\n"]}kWcxvee!ee:~OAAOPΓ0OAAO,EAAC,MAAM,EAAC,QAAQ@_#"QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM@.YAAY,EAAC,SAAS,EAAC,MAAM,EAAC,aAAa,EAAC,OAAO,CoKAAKp$cAAc>.`QAAQ,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,sBAAsB,CAAC,EAAC,CAAC,aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,qBAAqB9YAAY,E!Y-l
v*
CY-GAAGYee\",[[\"ŋ\",\"ɣ\"],[\"ŋdi\",\"ɣetrɔ\"],u],u,[[\"k\",\"d\",\"b\",\"k\",\"y\",\"f\",\"m\"],[\"kɔs\",\"dzo\",\"bla\",\"kuɖ\",\"yaw\",\"fiɖ\",\"mem\"],[\"kɔsiɖa\",\"dzoɖa\",\"blaɖa\",\"kuɖa\",\"yawoɖa\",\"fiɖa\",\"memleɖa\"],[\"kɔs\",\"dzo\",\"bla\",\"kuɖ\",\"yaw\",\"fiɖ\",\"mem\"]],u,[[\"d\",\"d\",\"t\",\"a\",\"d\",\"m\",\"s\",\"d\",\"a\",\"k\",\"a\",\"d\"],[\"dzv\",\"dzd\",\"ted\",\"afɔ\",\"dam\",\"mas\",\"sia\",\"dea\",\"any\",\"kel\",\"ade\",\"dzm\"],[\"dzove\",\"dzodze\",\"tedoxe\",\"afɔfĩe\",\"dama\",\"masa\",\"siamlɔm\",\"deasiamime\",\"anyɔnyɔ\",\"kele\",\"adeɛmekpɔxe\",\"dzome\"]],u,[[\"HYV\",\"Yŋ\"],u,[\"Hafi Yesu Va\",\"Yesu ŋɔli\"]],1,[6,0],[\"M/d/yy\",\"MMM d 'lia', y\",\"MMMM d 'lia' y\",\"EEEE, MMMM d 'lia' y\"]],[\"a 'ga' h:mm\",\"a 'ga' h:mm:ss\",\"a 'ga' h:mm:ss z\",\"a 'ga' h:mm:ss zzzz\"],[\"{0} {1Omnn>GHS\",\"GH₵\",\"ghana siɖi\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"GHS\":[\"GH₵\"],\"JPY\":[\"JP¥\",\"¥\"],\"TH
B\":[\"฿Z3zx[/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["ast", [["a", "p"], ["AM", "PM"], ["de la mañana", "de la tarde"]], [["a", "p"], ["AM", "PM"], ["mañana", "tarde"]], [["D", "L", "M", "M", "X", "V", "S"], ["dom", "llu", "mar", "mié", "xue", "vie", "sáb"], ["domingu", "llunes", "martes", "miércoles", "xueves", "vienres", "sábadu"], ["do", "ll", "ma", "mi", "xu", "vi", "sá"]], u, [["X", "F", "M", "A", "M", "X", "X", "A", "S", "O", "P", "A"], ["xin", "feb", "mar", "abr", "may", "xun", "xnt", "ago", "set", "och", "pay", "avi"], ["de xineru", "de febreru", "de marzu", "d’abril", "de mayu", "de xunu", "de xunetu", "d’agostu", "de setiembre", "d’ochobre", "de payares", "d’avientu"]], [["X", "F", "M", "A", "M", "X", "X", "A", "S", "O", "P", "A"], ["Xin", "Feb", "Mar", "Abr", "May", "Xun", "Xnt", "Ago", "Set", "Och", "Pay", "Avi"], ["xineru", "febreru", "marzu", "abril", "mayu", "xunu", "xunetu", "agostu", "setiembre", "ochobre", "payares", "avientu"]], [["e.C.", "d.C."], u, ["enantes de Cristu", "después de Cristu"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM 'de' y", "EEEE, d MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'a' 'les' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "ND", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "DKK": [], "HRK": [], "ISK": [], "NOK": [], "PHP": [u, "₱"], "PLN": [], "SEK": [], "THB": ["฿"], "TWD": ["NT$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ast.js.mapB#x1{"version":3,"file":"guz.js","sourceRoot":"","sources":["guz.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,KAAK,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,gBAAgB,EAAC,gBAAgB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,mBAAmB,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"guz\",[[\"Ma\",\"Mo\"],u,[\"Mambia\",\"Mog\"]],[[\"Ma\",\"Mo\"],u,u],[[\"C\",\"C\",\"C\",\"C\",\"A\",\"I\",\"E\"],[\"Cpr\",\"Ctt\",\"Cmn\",\"Cmt\",\"Ars\",\"Icm\",\"Est\"],[\"Chumapiri\",\"Chumatato\",\"Chumaine\",\"Chumatano\",\"Aramisi\",\"Ichuma\",\"Esabato\"],[\"Cpr\",\"Ctt\",\"Cmn\",\"Cmt\",\"Ars\",\"Icm\",\"Est\"]],u,[[\"C\",\"F\",\"M\",\"A\",\"M\",\"J\",\"C\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Can\",\"Feb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Cul\",\"Agt\",\"Sep\",\"Okt\",\"Nob\",\"Dis\"],[\"Chanuari\",\"Feburari\",\"Machi\",\"Apiriri\",\"Mei\",\"Juni\",\"Chulai\",\"Agosti\",\"Septemba\",\"Okitoba\",\"Nobemba\",\"Disemba\"]],u,[[\"YA\",\"YK\"],u,[\"Yeso ataiborwa\",\"Yeso kaiboirwe\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"KES\",\"Ksh\",\"Shilingi ya Kenya\",{\"JPY\":[\"JP¥\",\"¥\"],\"KES\":[\"Ksh\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}-RR\x*be"be;,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb=U
A`P;
ICAAC,YAAY,EAAC,gBAAgB,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW,EAAC,iBAAiB_Q'sBAAsB,EAAC,sBAAsB,EAAC,sBAAsB,EAAC,qBAAqB,EAAC,sBAAsB,EAAC,oBAAoB,EAAC,oBAAoB,EAAC,oBAAoB,EAAC,oBAAoB,EAAC,oBAAoB,EAAC,4BAA4B,
EAAC,6BAA6%(wBAAw^if (n === 1)\n    return 1;Z$bez\",[[\"pamilau\",\"pamunyi\"],u,u],u,[[\"M\",\"J\",\"H\",\"H\",\"H\",\"W\",\"J\"],[\"Mul\",\"Vil\",\"Hiv\",\"Hid\",\"Hit\",\"Hih\",\"Lem\"],[\"pa mulungu\",\"pa shahuviluha\",\"pa hivili\",\"pa hidatu\",\"pa hitayi\",\"pa hihanu\",\"pa shahulembela\"],[\"Mul\",\"Vil\",\"Hiv\",\"Hid\",\"Hit\",\"Hih\",\"Lem\"]],u,[[\"H\",\"V\",\"D\",\"T\",\"H\",\"S\",\"S\",\"N\",\"T\",\"K\",\"K\",\"K\"],[\"Hut\",\"Vil\",\"Dat\",\"Tai\",\"Han\",\"Sit\",\"Sab\",\"Nan\",\"Tis\",\"Kum\",\"Kmj\",\"Kmb\"],[\"pa mwedzi gwa hutala\",\"pa mwedzi gwa wuvili\",\"pa mwedzi gwa wudatu\",\"pa mwedzi gwa wutai\",\"pa mwedzi gwa wuhanu\",\"pa mwedzi gwa sita\",\"pa mwedzi gwa saba\",\"pa mwedzi gwa nane\",\"pa mwedzi gwa tisa\",\"pa mwedzi gwa kumi\",\"pa mwedzi gwa kumi na moja\",\"_pa mwedzi gwa kumi na mbili\"]],u,[[\"KM\",\"BM\"],u,[\"Kabla ya Mtwaa\",\"Baada ya Mtwaa\"]],1:=#,##0.00¤\",\"#E0\"],\"TZS\",\"TSh\",\"Shilingi ya Hutanzanin!TZS\":[\"TS4m`x- 	eAAe,EAAE2export default [];\n"]}x	9Qxfluy!luy<MAAM,EAAC,MAAMA`EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,E	"K
-UAAU,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,UAAU,CAAC,E~1EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI$
UAAU,EAAC,OAAO,E1EAAC,MAAM,EAAC,OAAO1QAAQO`qBAAqB,EAAC,qBAAqluBAAuB0)kBAAk^ luy\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"J2\",\"J3\",\"J4\",\"J5\",\"Al\",\"Ij\",\"J1\"],[\"Jumapiri\",\"Jumatatu\",\"Jumanne\",\"Jumatano\",\"Murwa wa Kanne\",\"Murwa wa Katano\",\"Jumamosi\"],[\"J2\",\"J3\",\"J4(\",\"J5\",\"Al\",\"Ij\",\"J1\"]],u,[[\"J	#J	%Jan\",\"Feb\",\"Mar\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Machi\",\"April
J
#toba\",\"Novemba\",\"Desemba\"]],u,[[\"BC\",\"AD\"],u,[\"Imberi ya Kuuza Kwa\",\"Muhiga Kuvita Kuuza\"]],0,[6,0],[\"dd/MM/y\",\O;¤- 8'irinjeiZyxPnus!nus<P`6MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO)$,WAAW,EAAC,aAAa,EAAC,aAAa,EAAC,cAAc,EAAC,aAAa_6MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO$"MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM$MAAM8eAAe,EAAC,KAAK,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,EAAC,UAAU,EAAC,aAAa,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,iBAAiB,CAAC,CAAC,(oBAAoB,EAAC,eAAe=QAAQ,EAAC,SAAS,EAAC,UAAUJ"aAAa,EAAC,gBAAgBneA~#j(nus\",[[\"RW\",\"TŊ\"],u,u],u,[[\"C\",\"J\",\"R\",\"D\",\"Ŋ\",\"D\",\"B\"],[\"Cäŋ\",\"Jiec\",\"Rɛw\",\"Diɔ̱k\",\"Ŋuaan\",\"Dhieec\",\"Bäkɛl\"],[\"Cäŋ kuɔth\",\"Jiec la̱t\",\"Rɛw lätni\",\"Diɔ̱k lätni\",\"Ŋuaan lätni\",\"Dhieec lätni\",\"Bäkɛl lätni\"],[\"Cäŋ\",\"Jiec\",\"Rɛw\",\"Diɔ̱k\",\"Ŋuaan\",\"Dhieec\",\"Bäkɛl\"]],u,[[\"T\",\"P\",\"D\",\"G\",\"D\",\"K\",\"P\",\"T\",\"T\",\"L\",\"K\",\"T\"],[\"Tiop\",\"Pɛt\",\"Duɔ̱ɔ̱\",\"Guak\",\"Duä\",\"Kor\",\"Pay\",\"Thoo\",\"Tɛɛ\",\"Laa\",\"Kur\",\"Tid\"],[\"Tiop thar pɛt\",\"Pɛt\",\"Duɔ̱ɔ̱ŋ\",\"Guak\",\"Duät\",\"Kornyoot\",\"Pay yie̱tni\",\"Tho̱o̱r\",\"Tɛɛr\",\"Laath\",\"Kur\",\"Tio̱p in di̱i̱t\"]],u,[[\"AY\",\"ƐY\"],u,[\"A ka̱n Yecu ni dap\",\"Ɛ ca Yecu dap\"]],1,[6,0],[\"E(G d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"z h:mm:ss a\",\"zzzz h:mm:ss aWSSP\",\"£\",\"SSP\",{\"GBP\":[\"GB£\",\"£\"],\"JPY\":[\"JP¥\",\"¥\"],\"SSP\":[\"£37uI7xisw!sw<EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAcAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,OAAO,CAAC,CAAC;IACb)IAAI.]K
7
UAAU,EAAC,OAAO,E1EAAC,MAAM,EAAC,OAAO1QAAQO`iBAAiB,EAAC,iBAAilYAAY0)sBAAs^CAACjUCAACjj*
*
, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;Z$sw\",[[\"am\",\"pm\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Jumapili\",\"JumSatatu\",\"Jumanne\",\"Jumatano\",\"Alhamisi\",\"Ijumaa\",\"Jumamosi\"],u,u],u,[[\"J	#J	%J
/ZJul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Machi\",\"April
J
#btoba\",\"Novemba\",\"Desemba\"]],u,[[\"KK\",\"BK\"],u,[\"Kabla ya Kristo\",\"Baada ya Kristo\"]],1:T #,##0.00\",\"#E0\"],\"TZS\",\"TSh\",\"Shilingi ya Tanzania\",{\"BYN\":[u,\"р.\"],s.CPHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"TZS\":[\"TS4#|Xhn\x#:,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb)IAAIMGP`MAAM,EAAC,MAAM,EAAC,MAAMMAAM,CAAC,EAAC,C?
)YAAY,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,CAAC,E~1EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI$6QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAMaQAAQ,EAAC,QAAQ6QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAMaQAAQ,EAAC,QAAQMAAMo
kBAAkBY.
WAAW,EAAC,iBAAi!%aAAa,EAAC,gBAAgB&nUAAUYAAY0MAAMS&CAACj7CAACj7MAAMif (n === 1)\n    return 1;Z$uz\",[[\"TO\",\"TK\"],u,u],u,[[\"Y\",\"D\",\"S\",\"C\",\"P\",\"J\",\"S\"],[\"Yak\",\"Dush\",\"Sesh\",\"Chor\",\"Pay\",\"Jum\",\"Shan\"],[\"yakshanba\",\"dushanba\",\"seshanba\",\"chorshanba\",\"payshanba\",\"juma\",\"shanba\"],[\"Ya\",\"Du\",\"Se\",\"Ch\ ",\"Pa\",\"Ju\",\"Sh\"]],u,[[\"Y	I\",\"I	%yan\",\"fev\",\"mar\",\"apr\",\"may\",\"iyn\",\"iyl\",\"avg\",\"sen\",\"okt\",\"noy\",\"dek\"],[\"yanvar\",\"fevral\",\"mart\",c\"aprel\",\"may\",\"iyun\",\"iyul\",\"avgust\",\"sentabr\",\"oktabr\",\"noyabr\",\"dekabr\"]],[[\"Y	I\",\"I	%Yan\",\"Fev\",\"Mar\",\"Apr\",\"May\",\"Iyn\",\"Iyl\",\"Avg\",\"Sen\",\"Okt\",\"Noy\",\"Dek\"],[\"Yanvar\",\"Fevral\",\"Mart\",\"Aprel\",\"May\",\"Iyun\",\"Iyul\",\"Avgust\",\"Sentabr\",\"Oktabr\",\"Noyabr\",\"Dekabr\"]],[[\"m.a.\",\"milodiy\"],u,[\"milo]ddan avvalgi\",\"milodiy\"]],1,[6,0],[\"dd/MM/yy\",\"d-MMM, y\",\"d-MMMM, y\",\"EEEE, d-MMMM,u!A:mm:ss (z)\",\"H:mm:ss (zzzz)\"],[\"{1}, {0}\",u,u,u],[\",\",\" :	son emas&#,##0.00 ¤\",\"#E0\"],\"UZS\",\"soʻm\",\"O‘zbekiston so‘mi\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱,,\"UZS\":[\"soʻm\"]},\"ltr\", plural];\n"]}\@x luy!luy<W#|Bx6$ast!ast:pcAAc,EAAC,aAAa,C 'QAAQ,EAAC,OAAO,C YP-QAAQ,EAAC,QAAQ,E_
BQAAQ,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EpA2WAAW,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,cAAc,EAAC,WAAW,EAAC,YAAY,EAAC,WAAW,CAAC,CAAC,EA+^QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS) MAAM,EAAC,MAAMmBAAmB,EAAC,mBAAmB$0#QAAQ,EAAC,SAAS,EAAC,eAAe,EAAC,qBAAqlM
mBAAmBQ8dIAAIc7O^EAAC,MAAM,EAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE\
<EAAE,EAAC,KAAK,EAAC,EAAEZ7EAAE(ast\",[[\"a\",\"p
0[\"de la mañana\",\"de la tarde\"]],[[\"a\",\"p
[\"mañana\",\"tarde\"]],[[\"D\",\"L\",\"M\",\"M\",\"X\",\"V\",\"S\"],[\"dom\",\"llu\",\"mar\",\"mié\",\"xue\",\"vie\",\"sáb\"],[\"domingu\",\"llunes\",\"martes\",\"miércoles\",\"xueves\",\"vienres\",\"sábadu\"],[\"do\",\"ll\",\"ma\",\"mi\",\"xu\",\"vi\",\"sá\"]],u,[[\"X
X\",\"X\",\"A\",\"S\",\"O\",\"P\",\"A\"],[\"xin\",\"feb\",\"mar\",\"abr\",\"may\",\"xun\",\"xnt\",\"ago\",\"set\",\"och\",\"pay\",\"avi\"],[\"de xineru\",\"de febreru\",\"de marzu\",\"d’abril\",\"de mayu\",\"de xunu\",\"de xunetu\",\"d’agostu\",\"de Bsetiembre\",\"d’ochobre\",\"de payares\",\"d’avientu\"]],[[\"X
X\",\"X\",\"A\",\"S\",\"O\",\"P\",\"A\"],[\"Xin\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Xun\",\"Xnt\",\"Ago\",\"Set\",\"Och\",\"Pay\",\"Avi\"],[\"xineru\",\"febreru\",\"marzu\",\"abril\",\"mayu\",\"xunu\",\"xunetu\",\"agostu\",\"setiembre\",\"ochobre\",\"paylares\",\"avientu\"]],[[\"e.C.\",\"d.C.\"],u,[\"enantes de Cristu\",\"después de Cristu\"]],1,[6,0],[\"d/M/yA'de' y\",\"EEEE, d MMMM 'de'lM0\"{1}, {0}\",\"{1} 'a' 'les' {0}\",u],[\",\",\".;D&\#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"DKK\":[],\"HRK\":[],\"ISK\":[],\"NOK\":[PLN\":[],\"SEK\":[(XXX\":[Ltx@!az!az:"CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACPQp .IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,E"}
cAAc,EAAC,iBAAiB,EAAC,UAAU,EAAC,aAAa,EAAC,MAAM,EAAC,OAAO,CAAC,EAAC,CAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,$U.IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,E"}
cAAc,EAAC,iBAAiB,EAAC,UAAU,EAAC,aAAa,EAAC,MAAM,EAAC,OAAO,CAAC,EAAC,CAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,$nIAAI,E"
_
-"QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO^MAAM|SAAS,EAAC,QAAQ,EAAC,QAAQ$MAAM,EAAC,MAAMUAAU$0
g3OEAAC,mBAAmB,E`Z\
F\
<\
(ZAO;\n\nif (n === 1	4az\",[[\"a\",\"p
17\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\"],[\"B.\",\"B.e.\",\"Ç.a.\",\"Ç.\",\"C.a.\",\"C.\",\"Ş.\"],[\"bazar\",\"bazar ertəsi\",\"çərşənbə axşamı\",\"çərşənbə\",\"cümə axşamı\",\"cümə\",\"şənbə\"],[\"B.\",\"B.E.\",\"Ç.A.\",\"Ç.\",\"C.A.\",\"C.\",\"Ş.\"]],[[\"7\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\"],[\"B.\",\"B.E.\",\"Ç.A.\",\"Ç.\",\"C.A.\",\"C.\",\"Ş.\"],[\"bazar\",\"bazar ertəsi\",\"çərşənbə axşamı\",\"çərşənbə\",\"cümə axşamı\",\"cümə\",\"şənbə\"],[\"B.\",\"B.E.\",\"Ç.A.\",\"Ç.\",\"C.A.\",\"C.\",\"Ş.\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"yan\",\"fev\",\"mar\",\"apr\",\"may\",\"iyn\",\"iyl\",\"avq\",\"sen\",\"okt\",\"noy\",\"dek\"],[\"yanvar\",\"fevral\",\"mart\",\"aprel\",\"may\",\"iyun\",\"iyul\",\"avqust\",\"sentyabr\",\"oktyabr\",\"noyabr\",\"dekabr\"]],u,[[\"e.ə.\",\"y.e@.\"],u,[\"eramızdan əvvəl\",\"yeni era\"]],1,[6,0],[\"dd.MM.yAd MMMM y, EEEEnU,\",\".cS#,##0.00 ¤\",\"#E0\"],\"AZN\",\"₼\",\"Azərbaycan Manatı\",{\"AZN\":[\"₼\"],o0"RON\":[u,\"ley\"],\"SYP\":[u,\"S£*-K9@ixfur!fur:"CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP=47pP
7-OAAO,EAAC,SAAS,EAAC,SAASJ	QAAQ,CAAC7#pA2}
Z
MAAM,EAAC,OAAO^KAAK,EAAC,OAAO,EAAC,UAAU|UAAU$-(0
SAAS,EAAC,qBAAqB,EAAC,0BAA0l.OEAAC,MAAM,E`OK;\n\nif (n === 1	4fur\",[[\"a.\",\"p.\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mie\",\"joi\",\"vin\",\"sab\"],[\"domenie\",\"lunis\",\"martars\",\"miercus\",\"joibe\",\"vinars\",\"sabide\"],[\"dom\",\"lun\",\"mar\",\"mie\",\"joi\",\"vin\",\"sab\"]],u,[[\"Z
#L
%Zen\",\"Fev\",\"Mar\",\"Avr\",\"Mai\",\"Jug\",\"Lui\",\"Avo\",\"Set\",\"Otu\",\"Nov\",\"Dic\"],[\"Zenâr\",\"Fevrâr\",\"Març\",\"Avrîl\",\"Mai\",\"Jugn\",\"Lui\",\"Avost\",\"Setembar\",\"Otubar\",\"Novembar\",\"Dicembar\"]],u,[[\"pdC\",\"ddC\"],u,u],1Q,[6,0],[\"dd/MM/yy\",\"dd/MM/y\",\"d 'di' MMMM 'dal' y\",\"EEEE d 'di' MMMM 'dal'lW,\",\".}.EUR\",\"€\",\"euro\",{\"JPY\":[\"JP¥\",\"¥3^4CN{xfy!fy:i.IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,E"}
SAASVYAAY,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EpA2TYAAY,EAAC,YAAY,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,UAAU,EAAC,WAAW#MAAM,EAAC,MAAMm"OAAO,CAAC,EAAC,CAAC,cAAc,EAAC,aAAa$0
eAAemVcAAcQ8dE2wBAAwB,EOEAAC,MAAM,E`OKIAAI)OK-OK2OK
EAAE(fy\",[[\"AM\",\"PM\"],u,u],u-
1si\",\"mo\",\"ti\",\"wo\",\"to\",\"fr\",\"so\"],[\"snein\",\"moandei\",\"tiisdei\",\"woansdei\",\"tongersdei\",\"freed\",\"sneo7n\"],[\"si\",\"mo\",\"ti\",\"wo\",\"to\",\"fr\",\"so\"]
c*rt\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"AugE*newaris\",\"Febrewaris\",\"Maart\",\"April\",\"Maaie\",\"Juny\",\"July\",\"Augustus\",\"Septimber\",\"Oktober\",\"Novimber\",\"Desimber\"]],u,[[\"f.K.\",\"n.K.\"],[\"f.Kr.\",\"n.Kr.\"],[\"Foar Kristus\",\"nei Kristus\"]],1,[6,0],[\"dd-MM-yy\",\"d MMM y\"PeV\"{1} 'om' {0}\",u],[\",\",\".o;¤ #,##0.00-\",\"#E0\"],\"EUR\",\"€\",\"Euro\",{\"AUD\":[\"AU$\",\"$\"],\"CAD\":[\"C$\",\"$\"],\"FJD\":[\"FJ$\",\"$\"],\"JPSBD\":[\"SI$\",\"$USD\":[\"US$\",\"$\"],\"XPF\":[ikxE%hy!hy:
CAAC;IAE7Cep 
7-$QAAQ,EAAC,YAAY,EAAC,WAAW,EAAC,YAAY,E_BOAAO,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EpA2P$YAAY,EAAC,YAAY,EAAC,WAAW,EAAC,YAAY,C &SAAS,EAAC,MAAM,EAAC,OAAOJ$WAAW,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,C QAAQ,EAAC,MAAMgBAAgB,EAAC,gBAAgB$0
cAAc,EAAC,eAAe,EAAC,mBAAmlC
0
8dEUOEAAC,eAAe,E`Z\
F\
<K;\n\nif (i === 0 || i === 1	4hy\",[[\"ա\",\"հ
1Կ\",\"Ե\",\"Ե\",\"Չ\",\"Հ\",\"Ո\",\"Շ\"],[\"կիր\",\"երկ\",\"երք\",\"չրք\",\"հնգ\",\"ուր\",\"շբթ\"],[\"կիրակի\",\"երկուշաբթի\",\"երեքշաբթի\",\"չորեքշաբթի\",\"հինգշաբթի\",\"ուրբա\",\"շաբաթ\"],[\"կր\",\"եկ\",\"եք\",\"չք\",\"հգ\",\"ու\",\"շբ\"]],u,[[\"Հ\",\"Փ\",\"Մ\",\"Ա\",\"Մ\",\"Հ\",\"Հ\",\"Օ\",\"Ս\",\"Հ\",\"Ն\",\"Դ\"],[\"հնվ\",\"փտվ\",\"մրտ\",\"ապր\",\"մյս\",\"հնս\",\"հլս\",\"օգս\",\"սեպ\",\"հոկ\",\"նոյ\",\"դեկ\"],[\"հունվարի\",\"փետրվարի\",\"մարտի\",\"ապրիլի\",\"մայիսի\",\"հունիսի\",\"հուլիսի\",\"օգոստոսի\",\"սեպտեմբերի\",\"հոկտեմբերի\",\"նոյեմբերի\",\"դեկտեմբերի\"]],[[\"Հ\",\"Փ\",\"Մ\",\"Ա\",\"Մ\",\"Հ\",\"Հ\",\"Օ\",\"Ս\",\"Հ\",\"\",\"Դ\"],[\"հնվ\",\"փտվ\",\"մրտ\",\"ապր\",\"մյս\",\"հնս\",\"հլս\",\"օգս\",\"սեպ\",\"հոկ\",\"նոյ\",\"դեկ\"],[\"հունվար\",\"փետրվար\",\"մարտ\",\"ապրիլ\",\"մայիս\",\"հունիս\",\"հուիս\",\"օգոստոս\",\"սեպտեմբեր\",\"հոկտեմբեր\",\"նոյեմբեր\",\"դեկտեմբեր\"]],[[\"մ..ա.\",\"մ.թ.\"],u,[\"Քրիստոսից առաջ\",\"Քրիստոսից հետո\"]],1,[6,0],[\"dd.MM.yy\",\"dd MMM, y թ.\)",\"dd MMMM, y թ.\",\"y թ. MMMM d, EEEEnD, {0}\",u,u,u],[\",\",\" :ՈչԹ&W#,##0.00 ¤\",\"#E0\"],\"AMD\",\"֏\",\"հայկական դրամ\",{\"AMD\":[\"֏\"],o05M=@x%u"u:	CAAC;IAEd[iP-QAAQJn	OAAO,CAAC7#pA2OAAO^MAAM,EAAC,SAAS,EAAC,WAAW-(0QAAQg"MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,cAAcCAAC,EAAC,eAAeQ8dE2WAAW,EIAAI,EAAC,iBAAiB,E`IAAI;\n	%u\",[[\"AM\",\"PM\"],u,u],u,[[\"M\",\"S\",\"S\",\"R\",\"K\",\"J\",\"S\"],[\"Mng\",\"Sen\",\"Sal\",\"Reb\",\"Kem\",\"Jum\",\"Sap\"],[\"Minggu\",\"Senén\",\"Salasa\",\"Rebo\",\"Kemis\",\"Jumaah\",\"Saptu\"],[\"Mng\",\"Sen\",\"Sal\",\"Reb\",\"Kem\",\"Jum\",\"Sap\"]],u,[[\"J\",\"P
KPéb\",\"Mar\",\"Apr\",\"Mé,s\",\"Sép\",\"Okt\",\"Nop\",\"Dés\"],[\"Januari\",\"Pébruari\",\"Maret\",\"April\",\"Méi\",\"Juni\",\"Juli\",\"Agustus\",\"`Séptémber\",\"Oktober\",\"Nopémber\",\"Désémber\"]],u,[[\"SM\",\"M\"],u,u],0,[6,0],[\"d/M/yA5a.mm\",\"H.mm.ss\",\"H.mm.ss z\",\"H.mm.ss zzzz\"],[\"{1}, {0}\",u,\"{1} 'jam' {0}\",u],[\",\",\".B."10IDR\",\"Rp\",\"Rupee Indonésia\",{\"IDR\":[\"RpY*})x#(v"v: .MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,WAAW,EAAC,aAAa,C Y7n
-QAAQ,EAAC,QAAQ,EAAC,QAAQLQAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EpA2"MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM^6MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM
MAAM,EAAC,OAAO^MAAM,EAAC,SAAS,EAAC,WAAW#OAAO,EAAC,OAAOcAAc,EAAC,eAAe$07eAAemMAAM!LSAASq)IAAI,EAAC,cAAc,E`\
<MAAM)OK
F\
F\
<
d
EAAE\
<\
<x\
<
F\
<\
<
\
<\
<\
<\
(\
<#_v\",[[\"fm\",\"em\"],u,u],[[\"fm\",\"em\"],[\"f.m.\",\"e.m.\"],[\"förmiddag\",\"eftermiddag\"],
O\",\"T\",\"F\",\"L\"],[\"sön\",\"mån\",\"tis\",\"ons\",\"tors\",\"fre\",\"lör\"],[\"söndag\",\"måndag\",\"tisdag\",\"onsd^ag\",\"torsdag\",\"fredag\",\"lördag\"],[\"sö\",\"må\",\"ti\",\"on\",\"to\",\"fr\",\"lö\"]
Rjan.\",\"feb.\",\"mars\",\"apr.\",\"maj\",\"juni\",\"juli\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januari\",\"februari\",\"mars\",\"april\",\"maj\",\"juni\",\"juli\",\"augusti\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"f.Kr.I\",\"e.Kr.\"],u,[\"före Kristus\",\"efter Kristus\"]],1,[6,0],[\"y-MM-ddB"e^,,\",\" \",\";\",\"%\",\"+\",\"−\",\"×10^? %\",\"#,##0.00 ¤\",\"#E0\"],\"SEK\",\"kr\",\"svensk krona\",{\"AUD\":[u,\"$\"],\"BBD\":[\"Bds$\",\"$\"],\"BMD\":[\"BM$\",\"6$\"],\"BRL\":[\"BR$\",\"R$\"],\"BSD\":[\"BS$\",\"$\"],oBZD\":[\"BZ$\",\"$\"],\"CNY\":[u,\"¥\"],\"DKK\":[\"Dkr\",\"kr\"],\"DOP\":[\"RD$\",\"$\"],\"EEK\":[\"Ekr\"],\"EGP\":[\"EG£\",\"E£\"],\"ESP\":[],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"IE£\"],\"INR\":[u,\"₹\"],\"ISK\":[\"Ikr\",\"kr\"],\"JMD\"_:[\"JM$\",\"$\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"NOK\":[\"Nkr\",\"kr\"],\"NZD\":[u,\"$]RON\":[u,\"L\"],\"SEK\":[\"kr\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫xS|Cx8twq!twq:	CAAC;IAEd)UAAU,EAAC,YAAY)pP
7-QAAQ|$c	QAAQ,CAAC7#pA27IAAIIAAI)-WAAWJJIAAI,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,WAAWLWAAW,EAAC,cAAc$0}
eAAem
WAAW,EOAAO,EAAC,kBAAkB,E`OK;\n	$twq\",[[\"Subbaahi\",\"Zaarikay b\"],u,u],u,[[\"H\",\"T\",\"T\",\"L\",\"L\",\"L\",\"S\"],[\"Alh\",\"Ati\",\"Ata\",\"Ala\",\"Alm\",\"Alz\",\"Asi\"],[\"Alhadi\",\"Atinni\",\"Atalaata\",\"Alarba\",\"Alhamiisa\",\"Alzuma\",\"Asibti\"],[\"Alh\",\"Ati\",\"Ata\,",\"Ala\",\"Alm\",\"Alz\",\"Asi\"]],u,[[\"Ž
Ž\",\"Ž\",\"U
Žan\",\"Fee\",\"Mar\",\"Awi\",\"Me\",\"Žuw\",\"Žuy\",\"Ut\",\"Sek\",\"Okt\",\"Noo\",\"Dee\"],[\"Žanwiye\",\"Feewiriye\",\"Marsi\",\"Awiril\",\"Me\",\"Žuweŋ\",\"Žuyye\",\"Ut\",\"Sektanbur\",\"Oktoobur\",\"Noowanbur\",\"Deesanbur\"]],u,[[\"IJ\",\"IZ5\"],u,[\"Isaa jine\",\"Isaa zamanoo\"]],1,[6,0],[\"d/?%ed cW#,##0.00¤\",\"#E0\"],\"XOF\",\"F CFA\",\"CFA Fraŋ (BCEAO)\",{\"JPY\":[\"JP¥\",\"¥3TL][x*$zu!zu:
CAAC;IAE7Cep 
7-EQAAQ,EAAC,aAAa,EAAC,YAAY,EAAC,cAAc,EAAC,UAAU,EAAC,aAAa,EAAC,WAAW,CAAC7#pA2
TWAAW,EAAC,OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS) pA2
TWAAW,EAAC,OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS) 47 WAAW,EAAC,iBAAilWAAW,EOM\
\
\
F\
\
<\
\
Z<Z;\n\nif (i === 0 || n === 1	4zu\",[[\"a\",\"p
=B\",\"T\",\"S\",\"H\",\"M\"],[\"Son\",\"Mso\",\"Bil\",\"Tha\",\"Sin\",\"Hla\",\"Mgq\"],[\"ISonto\",\"UMsombuluko\",\"ULwesibili\",\"ULwesithathu\",\"ULwesine\",\"ULwesihlanu\",\"UMgqibelo\"],[\"Son\",\"Mso\",\"Bil\",\"Tha\",\"Sin\",\"Hla\",\"Mgq\"]],u,[[\"J\",\"F\",\"M\",\"E
Is\",\"Eph\",\"Mey-a\",\"Sep\",\"Okt\",\"Nov\",\"Dis\"],[\"Januwari\",\"Februwari\",\"Mashi\",\"Ephreli\",\"Meyi\",\"Juni\",\"Julayi\",\"Agasti\",\"Septhemba\",\"Okth
isemba\"]]
as\",\"Eph\",\"Mey-a\",\"Sep\",\"Okt\",\"Nov\",\"Dis\"],[\"Januwari\",\"Februwari\",\"Mashi\",\"Ephreli\",\"Meyi\",\"Juni\",\"Julayi\",\"Agasti\",\"Septhemba\",\"Okth_isemba\"]],[[\"BC\",\"AD\"],u,u],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d,lÓ1ZAR\",\"R\",\"i-South African Rand\",{\"BYN\":[u,\"P.\"],\"DKK\":[u,\"Kr\"],\"HRK\":[u,\"Kn\"],\"ISK\":[u,\"Kr\"],\"JPY\":[\"JPNOK\":[u,\"Kr!PLN\":[u,\"Zł\"],\"SEK\":[u,\"Kr*
ZAR\":[\"Rq}x! $	eAAe,EAAE
2];\n"]}	Ux'	!*cy!cy:---ϥ`
`
FIAAI3;

MAAM$MAAMfWAAW,EAAC,aAAa,EAAC,cAAc~aAAaP`KIAAI3;

MAAM3
fWAAW,EAAC,aAAa,EAAC,cAAc~aAAaP`KIAAIVp

OAAO.OAAOKAAK,E"`
UAAU,E\KAAK,EAAC,SAAS,EAAC,YAAY3C
IAAIVp
FKAAK,E"`
UAAU,E\KAAK,EAAC,SAAS,EAAC,YAAY3C;
`
`WAAW,EAAC,WAAW,CkzcAAcQ807pg2WAAW
cAAc,E\
EAAE\
#2m^(^Um
,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE	0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nif (n === 3)\n    return 3;\nif (n === 6)\n    return 4
%3cy\",[[\"b\",\"h\"],[\"AM\",\"PM\"],[\"yb\",\"yh\"]	S\",\"Ll\",\"M\",\"M\",\"I\",\"G\",\"S\"],[\"Sul\",\"Llun\",\"Maw\",\"Mer\",\"Iau\",\"Gwen\",\"Sad\"],[\"Dydd Sul\",\"Dydd Llun\",\"Dydd Mawrth\",\"Dydd Mercher\",\"Dydd Iau\",\"Dydd Gwener\",\"Dydd Sadwrn\"],[\"Su\",\"Ll\",\"Ma\",\"Me\",\"Ia\",\"Gw\",\"Sa\"]],[[\"S\",\"Ll\",\"M\",\"M\",\"I\",\"G\",\"S\"],[\"Sul\",\"Llun\",\"Maw\",\"Mer\",\"Iau\",\"Gwe\",\"Sad\"],[\"Dydd Sul\",\"Dydd Llun\",\"Dydd Mawrth\",\"Dydd Mercher\",\"Dydd Iau\",\"Dydd Gwener\",\"Dydd Sadwrn\"],[\"Su\",\"Ll\",\"Ma\",\"Me\",\"Ia\",\"Gw\",\"Sa\"]],[[\"I\",\"Ch\",\"M\",\"E\",\"M\",\"M\",\"G\",\"A\",\"M\",\"H\",\"T\",\"Rh\"],[\"Ion\",\"Chwef\",\"Maw\",\"Ebr\",\"Mai\",\"Meh\",\"Gorff\",\"Awst\",\"Medi\",\"Hyd\",\"Tach\",\"Rhag\"],[\"Ionawr\",\"Chwefror\",\"Mawrth\",\"Ebrill\",\"Mai\",\"Mehefin\",\"Gorffennaf\",\"Awst\",\"Medi\",\"Hydref\",\"Tachwedd\",\"Rhagfyr\"]],[[\"I\",\"Ch\",\"M\",\"E\",\"M\",\"M\",\"G\",\"A\",\"M\",\"H\",\"T\",\"Rh\"],[\"Ion\",\"Chw\",\"Maw\",\"Ebr\",\"Mai\",\"Meh\",\"Gor\",\"Awst\",\"Medi\",\"Hyd\",\"Tach\",\"Rhag\"],[\"Ionawr\",\"Chwefror\",\"Mawrth\",\"Ebrill\",\"Mai\",\"Mehefin\",\"Gorffennaf\",\"Awst\",\"Medi\",\"Hydref\",\"Tachwcedd\",\"Rhagfyr\"]],[[\"C\",\"O\"],[\"CC\",\"OC\"],[\"Cyn Crist\",\"Oed Crist\"]],1,[6,0],[\"dd/MM/ EEEE, d MMMM yM\"{1} 'am' {0}\",u],[\".\",\",gc¤#,##0.00\",\"#E0\"],\"GBP\",\"£\",\"Punt Prydain\",{\"BDT\":[u,\"TK\"],\"BWP\":[],\"BYN\":[u,\"р.\"],\"HKD\":[\"HK$\"],\"JP5"KRW\":[u,\"₩\"],\"PHP\":[u,\"₱? ,\"XXX\":[],\"ZAR\":[],\"ZMW\":[Ds@x!haw!haw:7Z`K`

Q`KA0(





SAAS,E
KAAKn.SAAS,EAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,CKAAK3`
u*`
WAAW,EAAC,aAAa,EAAC,gBAAgBWAAW
KAAK,Ehaw\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"LP\",\"P1\",\"P2\",\"P3\",\"P4\",\"P5\",\"P6\"],[\"Lāpule\",\"Poʻakahi\",\"Poʻalua\",\"Poʻakolu\",\"Poʻahā\",\"Poʻalima\",\"Poʻaono\"],[\"LP\",\"P1\",\"P2\",\"P3\",\"P4\",\"P5\",\"P6\"]],uZRIan.\",\"Pep.\",\"Mal.\",\"ʻAp.\",\"Mei\",\"Iun.\",\"Iul.\",\"ʻAu.\",\"Kep.\",\"ʻOk.\",\"Now.\",\"Kek.\"],[\"Ianuali\",\"Pepeluali\",\"Malaki\",\"ʻApelila\",\"Mei\",\"Iune\",\"Iulai\",\"ʻAukake\",\"Kepakemapa\",\"ʻOkakopa\",\"Nowemapa\",\"Kekemapa\,"]],u,[[\"BCE\",\"CE\"],u,u],0,[6,0],[\"d/M/ GEEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a@ .\",\",gc-¤#,##0.00\",\"#E0\"],\"USD\",\"$\",\"USD\",{1ߌ<N*x!yav!yav:(UAAU,EAAC,UAAU)Z`K.SAAS,EAAC,QAAQ,EAAC,eAAe,EAAC,YAAY,EAAC,kBAAkBV`KA064BAA4B,EAAC,uBAAuB,EAAC,0BAA0B,EAAC,qBAAqB,EAAC,uBAAuBn0QAAQ,EAAC,aAAa,EAAC,2BAA2B,EAAC,WAAW,EAAC,UAAU,C
mBAAmB,EAAC,kBAAkB,C
ueAAeMAAM,EAAC,KAAK,E1m,!	
"yav\",[[\"kiɛmɛ́ɛm\",\"kisɛ́ndɛ\"],u,u],u,[[\"s\",\"m\",\"m\",\"e\",\"k\",\"f\",\"s\"],[\"sd\",\"md\",\"mw\",\"et\",\"kl\",\"fl\",\"ss\"],[\"sɔ́ndiɛ\",\"móndie\",\"muányáŋmóndie\",\"metúkpíápɛ\",\"kúpélimetúkpiapɛ\",\"feléte\",\"s@éselé\"],[\"sd\",\"md\",\"mw\",\"et\",\"kl\",\"fl\",\"ss\"]],uZRo.1\",\"o.2\",\"o.3\",\"o.4\",\"o.5\",\"o.6\",\"o.7\",\"o.8\",\"o.9\",\"o.10\",\"o.11\",\"o.12\"],[\"pikítíkítie, oólí ú kutúan\",\"siɛyɛ́, oóli ú kándíɛ\",\"ɔnsúmbɔl, oóli ú kátátúɛ\",\"mesiŋ, oóli ú kénie\",\"ensil, oóli ú kátánuɛ\",\"ɔsɔn\",\"efute\",\"pisuyú\",\"imɛŋ i puɔs\",\"imɛŋ i putúk,oóli ú kátíɛ\",\"makandikɛ\",\"pilɔnidɔ́\"]],u,[[\"k.Y.\",\"+J.C.\"],u,[\"katikupíen Yésuse\",\"ékélémkúnupíén n\"]],1,[6,0],[\"d/M/EEEE d MMMM y[ g}XAF\",\"FCFA\",\"XAF\",{1->`x^@eAAe,CAAC,CAAC,CAAC,WAAW,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,WAAW$`
OAAOOAAOOAAOOAAOOAAO,CAAC,CAAC7D
[[\"yarim tun\",\"tush payti\",\"ertalab\",\"kunduzi\",\"kechqurun\",\"kechasi\"],u,u],u,[\"00:00\",\"12:00\",[\"06:00\",\"11:0N0\"],[\"11:00\",\"18:00\"],[\"18:00\",\"22:00\"],[\"22:00\",\"06:00\"]]];\n"]}(aK
xAgsw!gsw:OAAO,EAAC,MAAMcAAc,EAAC,aAAa,COAAO,EAAC,MAAMC~Z^7SAAS,EAAC,SAAS,EAAC,WAAWkSAAS,EAAC,WAAW^71SAAS8q(UAAU$SAAS$`N#SAASu:<
eAAe,CAAC,EAAC,CAAC,SAAS,E"N
PO
SAAS)
kBAAkIAAIgsw\",[[\"vorm.\",\"nam.\"],u,[\"am Vormittag\",\"am Namittag\"]],[[\"vorm.\",\"nam.\"],u,[\"Vormittag\",\"Namittag\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"Su.\",\"Mä.\",\"Zi.\",\"Mi.\",\"Du.\",\"Fr.\",\"Sa.\"],[\"Sunntig\",\"Määntig\",\"Ziischtig\",\"Mittwuch\",\"Dunschtig\",\"Friitig\",\"Samschtig\"],[\"Su.\",\"Mä.\",\"Zi.\",\"Mi.\",\"Du.\",\"Fr.\",\"Sa.\"]],u,[[\"JJ\",\"J%Jan\",\"Feb\",\"Mär\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"],[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"Auguscht\",\"Septämber\",\"Oktoober\",\"Novämber\",\"Dezämber\"]],u,[[\"v. Chr.\",\P"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d. MMMMC!YH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\"’\",\";\",\"%\",\"+\",\"−"NaN   2CHF\",\"CHF\",\"Schwiizer Franke\",{\"ATS\":[\"öSo#<x0
gsw!gsw:q6aAAa,EAAC,UAAU,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ);CAAC,aAAa,EAAC,UAAU,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ8aAAa,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO,C(s_OMitternacht\",\"am Morge\",\"zmittag\",\"am Namittag\",\"zaabig\",\"znacht\"],u,u],[[\"Mitternacht\",\"am Morge\",\"zmittag\",\"am Namittag\",\"zaabig\",\"znacht\"],u,[\"Mitternacht\",\"Morge\",\"Mittag\",\"Namittag\",\"Aabig\",\"Nacht\"]],[\"00:00\",[\".05:00\",\"12:00\"],[\"12:00\",\"14:00\"],[\"14o%4:00\"],[\"00:00\",\"05:00\"]]];\n"]}1&{xn
ky!ky:qBSAAS,EAAC,IAAI,EAAC,SAAS,EAAC,UAAU,EAAC,MAAM,EAAC,KAAK,CAAC,EAAC,C"aAAa,EAAC,cAAc,EAAC,SAAS,EAAC,YAAYC"aAAa,EAAC,cAAc,EAAC,UAAU,EAAC,KAAK)K#түн орт\",\"чт\",\"эртң мн\",\"түшт кйн\",\"кечк\",\"түн\"],[\"түн ортосу\",\"чак тү\",\"эртең менен\",\"түштөн кийин\",\"кечинде\",\"түн ичинде\"],u],[[\"түн ортос\",\"чак түш\",\"эртең менен\",\"түштөн кийин\",\"кечкурун\",\"түн\"],u,u],[\"00:00\",\"L2:00\"],[\"12o%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}xl>xx1my!my:q6aAAa,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,GAAG	သန်းခေါင်ယံ\",\"မွန်းတည့်\",\"နံနက်\",\"နေ့လယ်\",\"ညနေ\",\"ည4$[0:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"19:00\"],[\"19:00\",\"24:00\"]]];\n"]}	y$|xM

pa-Guru!pa-Guru<q"UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ"UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ6EAAC,CAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,KAAKGOਅੱਧੀ ਰਾਤ\",\"ਸਵੇਰੇ\",\"ਦੁਪਹਿਰੇ\",\"ਸ਼ਾਮੀਂ\",\"ਰਾਤੀਂ\"],u,u],[[\"ਅੱਧੀ ਰਾਤ\",\"ਸਵੇਰੇ\",\"ਦੁਪਹਿਰੇ\",\"ਸ਼ਾਮੀਂ\",\"ਰਾਤੀਂ\"],u,[\"ਅੱਧY ਰਾਤ\",\"ਸਵੇਰੇ\",\"ਦੁਪਹਿਰੇ\",\"ਸ਼ਾਮ\",\"ਰਾਤ4;6:00\"],[\"16:00\",\"21:00\"],[\"21:00\",\"04:00\"]]];\n"]}yxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["az-Cyrl", [["а", "п"], ["АМ", "ПМ"], u], [["АМ", "ПМ"], u, u], [["7", "1", "2", "3", "4", "5", "6"], ["Б.", "Б.Е.", "Ч.А.", "Ч.", "Ҹ.А.", "Ҹ.", "Ш."], ["базар", "базар ертәси", "чәршәнбә ахшамы", "чәршәнбә", "ҹүмә ахшамы", "ҹүмә", "шәнбә"], ["Б.", "Б.Е.", "Ч.А.", "Ч.", "Ҹ.А.", "Ҹ.", "Ш."]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["јан", "фев", "мар", "апр", "май", "ијн", "ијл", "авг", "сен", "окт", "ној", "дек"], ["јанвар", "феврал", "март", "апрел", "май", "ијун", "ијул", "август", "сентјабр", "октјабр", "нојабр", "декабр"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["јан", "фев", "мар", "апр", "май", "ијн", "ијл", "авг", "сен", "окт", "ној", "дек"], ["Јанвар", "Феврал", "Март", "Апрел", "Май", "Ијун", "Ијул", "Август", "Сентјабр", "Октјабр", "Нојабр", "Декабр"]], [["е.ә.", "ј.е."], u, ["ерамыздан әввәл", "јени ера"]], 1, [6, 0], ["dd.MM.yy", "d MMM y", "d MMMM y", "d MMMM y, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "AZN", "₼", "AZN", { "AZN": ["₼"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=az-Cyrl.js.mapx{"version":3,"file":"kgp.js","sourceRoot":"","sources":["kgp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,KAAK,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,aAAa,EAAC,eAAe,EAAC,eAAe,EAAC,mBAAmB,EAAC,gBAAgB,EAAC,OAAO,CAAC,EAAC,CAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,WAAW,EAAC,eAAe,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,eAAe,EAAC,gBAAgB,EAAC,sBAAsB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"kgp\",[[\"AM\",\"PM\"],u,u],u,[[\"N.\",\"P.\",\"R.\",\"T.\",\"V.\",\"P.\",\"S.\"],[\"num.\",\"pir.\",\"rég.\",\"tẽg.\",\"vẽn.\",\"pén.\",\"sav.\"],[\"numĩggu\",\"pir-kurã-há\",\"régre-kurã-há\",\"tẽgtũ-kurã-há\",\"vẽnhkãgra-kurã-há\",\"pénkar-kurã-há\",\"savnu\"],[\"N.\",\"1kh.\",\"2kh.\",\"3kh.\",\"4kh.\",\"5kh.\",\"S.\"]],u,[[\"1K\",\"2K\",\"3K\",\"4K\",\"5K\",\"6K\",\"7K\",\"8K\",\"9K\",\"10K\",\"11K\",\"12K\"],[\"1Ky.\",\"2Ky.\",\"3Ky.\",\"4Ky.\",\"5Ky.\",\"6Ky.\",\"7Ky.\",\"8Ky.\",\"9Ky.\",\"10Ky.\",\"11Ky.\",\"12Ky.\"],[\"1-Kysã\",\"2-Kysã\",\"3-Kysã\",\"4-Kysã\",\"5-Kysã\",\"6-Kysã\",\"7-Kysã\",\"8-Kysã\",\"9-Kysã\",\"10-Kysã\",\"11-Kysã\",\"12-Kysã\"]],u,[[\"C.j.\",\"C.kk.\"],u,[\"Cristo jo\",\"Cristo kar kỹ\"]],0,[6,0],[\"dd/MM/y\",\"d 'ne' MMM, y\",\"d 'ne' MMMM, y\",\"EEEE, d 'ne' MMMM, y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"BRL\",\"R$\",\"Mrasir Rejar\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"p.\"],\"FJD\":[\"FJC\",\"$\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"Vẽj.\"],\"RON\":[u,\"L\"],\"SYP\":[u,\"S£\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XOF\":[\"CFA\"],\"ZMK\":[\"SMK\"]},\"ltr\", plural];\n"]}G2^xuz-Cyrl!uz-Cyrl<SAASV2p



# 
$SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EA"A#2pA








QAAQ,EA1EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ!.SAASkBAAkB.`?@`?#UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,kBAAk%cAAc,EAAC,iBAAiBkBAAkB<
gBAAgB,E(i##uz-Cyrl\",[[\"ТО\",\"ТК\"],u,u],u,[[\"Я\",\"Д\",\"С\",\"Ч\",\"П\",\"Ж\",\"Ш\"],[\"якш\",\"душ\",\"сеш\",\"ор\",\"пай\",\"жум\",\"шан\"],[\"якшанба\",\"душанба\",\"сешанба\",\"чоршанба\",\"пайшанба\",\"жума\",\"шанба\"],[\"як\",\"ду\",\"се\",\"чо\",\"па\",\"жу\",\"ша\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв\",\"фев\",\"мар\",\"апр\",\"май\",\"июн\",\"июл\",\"авг\",\"сен\",\"окт\",\"ноя\",\"дек\"],[\"январ\",\"феврал\",\"март\",\"апрел\",\"май\",\"июн\",\"июл\",\"август\",\"сентябр\",\"октябр\",\"ноябр\",\"декаб\"]],u,[[\"м.а.\",\"милодий\"],u,[\"милоддан аввалги\",\"милодий\"]],1,[6,0],[\"dd/MM/yy\",\"d MMM, y\",\"dd/(z)\",\"HH:mm:ss (zzzz)+! M: ҳақиқий сон эмас&L#,##0.00 ¤\",\"#E0\"],\"UZS\",\"сўм\",\"Ўзбекистон сўм\",{,'USD\":[\"US$\",\"$\"],\"UZS\":[\"сўм5kzxG!a'a>דK#7AK
$MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,E"OAAOEAAC,UAAU,EAAC,aAAa<$MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EZU"QAAQ."MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU!ZU"QAAQ."MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU!MAAM,EAAC,MAAMiBAAiB,EAAC,UAAUGSAAS,EAAC,UAAU,EAAC,gBAAg%YAAY,EAAC,eAAe0<GAAG,EAAC,KAAK,EMcaz-Cyrl\",[[\"а\",\"п\"],[\"АМ\",\"ПМ\"],u],[[\"АМ\",\"ПМ\"],u,u],[[\"7\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\"],[\"Б.\",\"Б.Е.\",\"Ч.А.\",\"Ч.\",\"Ҹ.А.\",\"Ҹ.\",\"Ш.\"],[\"базар\",\"базар ертәси\",\"чәршәнбә ашамы\",\"чәршәнбә\",\"ҹүмә ахшамы\",\"ҹүмә\",\"шәнбә\"],[\"Б.\",\"Б.Е.\",\"Ч.А.\",\"Ч.\",\"Ҹ.А.\",\"Ҹ.\",\"Ш.\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"јан\",\"фе7
+н\",\"ијn
-\",\"дек\"],[\"ја
Hун\",\"ију!абр\",\"октјабр\",\"нојабр\",\"декабр\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"јан.
4н\",\"ијn
-\",\"дек\"],[\"Јанвар\",\"Феврал\",\"Март\",\"Апрел\",\"Май\",\"Ијун\",\"Ијул\",\"Авгут\",\"Сентјабр\",\"Октјабр\",\"Нојабр\",\"Декабр\"]],[[\"е.ә.\",\"ј.е.\"],u,[\"ерамыздн әввәл\",\"јени ера\"]],1,[6,0],[\"dd.MM.yy\",\"d MMM y\",\"d MMMM y\",\"d MMMM y, EEEE\"],[\"HH:mm\",\"HH:mm:ssz\",\"HH:mm:ss zzzz@!.c:NaN@)AZN\",\"₼\",\"AZN\",{\"AZN\":[\"₼\"],/-USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}(px/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["az-Latn", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["7", "1", "2", "3", "4", "5", "6"], ["B.", "B.e.", "Ç.a.", "Ç.", "C.a.", "C.", "Ş."], ["bazar", "bazar ertəsi", "çərşənbə axşamı", "çərşənbə", "cümə axşamı", "cümə", "şənbə"], ["B.", "B.E.", "Ç.A.", "Ç.", "C.A.", "C.", "Ş."]], [["7", "1", "2", "3", "4", "5", "6"], ["B.", "B.E.", "Ç.A.", "Ç.", "C.A.", "C.", "Ş."], ["bazar", "bazar ertəsi", "çərşənbə axşamı", "çərşənbə", "cümə axşamı", "cümə", "şənbə"], ["B.", "B.E.", "Ç.A.", "Ç.", "C.A.", "C.", "Ş."]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["yan", "fev", "mar", "apr", "may", "iyn", "iyl", "avq", "sen", "okt", "noy", "dek"], ["yanvar", "fevral", "mart", "aprel", "may", "iyun", "iyul", "avqust", "sentyabr", "oktyabr", "noyabr", "dekabr"]], u, [["e.ə.", "y.e."], u, ["eramızdan əvvəl", "yeni era"]], 1, [6, 0], ["dd.MM.yy", "d MMM y", "d MMMM y", "d MMMM y, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "AZN", "₼", "Azərbaycan Manatı", { "AZN": ["₼"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "ley"], "SYP": [u, "S£"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=az-Latn.js.mapR9x:{"version":3,"file":"sq.js","sourceRoot":"","sources":["sq.ts"],"names":[],"mappings":"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AAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"sq\",[[\"p.d.\",\"m.d.\"],u,[\"e paradites\",\"e pasdites\"]],[[\"p.d.\",\"m.d.\"],u,[\"paradite\",\"pasdite\"]],[[\"d\",\"h\",\"m\",\"m\",\"e\",\"p\",\"sh\"],[\"Die\",\"Hën\",\"Mar\",\"Mër\",\"Enj\",\"Pre\",\"Sht\"],[\"e diel\",\"e hënë\",\"e martë\",\"e mërkurë\",\"e enjte\",\"e premte\",\"e shtunë\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"]],[[\"d\",\"h\",\"m\",\"m\",\"e\",\"p\",\"sh\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"],[\"e diel\",\"e hënë\",\"e martë\",\"e mërkurë\",\"e enjte\",\"e premte\",\"e shtunë\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"]],[[\"j\",\"sh\",\"m\",\"p\",\"m\",\"q\",\"k\",\"g\",\"sh\",\"t\",\"n\",\"dh\"],[\"jan\",\"shk\",\"mar\",\"pri\",\"maj\",\"qer\",\"korr\",\"gush\",\"sht\",\"tet\",\"nën\",\"dhj\"],[\"janar\",\"shkurt\",\"mars\",\"prill\",\"maj\",\"qershor\",\"korrik\",\"gusht\",\"shtator\",\"tetor\",\"nëntor\",\"dhjetor\"]],u,[[\"p.K.\",\"mb.K.\"],u,[\"para Krishtit\",\"mbas Krishtit\"]],1,[6,0],[\"d.M.yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a, z\",\"h:mm:ss a, zzzz\"],[\"{1}, {0}\",u,\"{1} 'në' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"ALL\",\"Lekë\",\"Leku shqiptar\",{\"AFN\":[],\"ALL\":[\"Lekë\"],\"AMD\":[],\"AOA\":[],\"ARS\":[],\"AUD\":[\"A$\",\"AUD\"],\"AZN\":[],\"BAM\":[],\"BBD\":[],\"BDT\":[],\"BMD\":[],\"BND\":[],\"BOB\":[],\"BRL\":[],\"BSD\":[],\"BWP\":[],\"BZD\":[],\"CAD\":[\"CA$\",\"CAD\"],\"CLP\":[],\"CNY\":[\"CN¥\",\"CNY\"],\"COP\":[],\"CRC\":[],\"CUC\":[],\"CUP\":[],\"CZK\":[],\"DKK\":[],\"DOP\":[],\"EGP\":[],\"FJD\":[],\"FKP\":[],\"GBP\":[\"£\",\"GBP\"],\"GEL\":[],\"GIP\":[],\"GNF\":[],\"GTQ\":[],\"GYD\":[],\"HKD\":[\"HK$\",\"HKS\"],\"HNL\":[],\"HRK\":[],\"HUF\":[],\"IDR\":[],\"ILS\":[\"₪\",\"ILS\"],\"INR\":[\"₹\",\"INR\"],\"ISK\":[],\"JMD\":[],\"JPY\":[\"JP¥\",\"JPY\"],\"KHR\":[],\"KMF\":[],\"KPW\":[],\"KRW\":[\"₩\",\"KRW\"],\"KYD\":[],\"KZT\":[],\"LAK\":[],\"LBP\":[],\"LKR\":[],\"LRD\":[],\"MGA\":[],\"MMK\":[],\"MNT\":[],\"MUR\":[],\"MXN\":[\"MX$\",\"MXN\"],\"MYR\":[],\"NAD\":[],\"NGN\":[],\"NIO\":[],\"NOK\":[],\"NPR\":[],\"NZD\":[\"NZ$\",\"NZD\"],\"PHP\":[],\"PKR\":[],\"PLN\":[],\"PYG\":[],\"RON\":[],\"RUB\":[],\"RWF\":[],\"SBD\":[],\"SEK\":[],\"SGD\":[],\"SHP\":[],\"SRD\":[],\"SSP\":[],\"STN\":[],\"SYP\":[],\"THB\":[\"฿\",\"THB\"],\"TOP\":[],\"TRY\":[],\"TTD\":[],\"TWD\":[\"NT$\",\"TWD\"],\"UAH\":[],\"USD\":[\"US$\",\"USD\"],\"UYU\":[],\"VND\":[\"₫\",\"VND\"],\"XCD\":[\"EC$\",\"XCD\"],\"ZAR\":[],\"ZMW\":[]},\"ltr\", plural];\n"]}5`TSx@9kh"kh9(KAAK,EAAC,CoB(K<P-


FP	K@@(IAAI@IAAI@8SAAS,EAAC,WAAW,ElJIAAI,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,WAAW<$IAAIEAAC,CAAC,WAAW,EAAC,cAAc<=p
UAAU,EAAC,UAAU,EAAC,eAAe`.UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,E>,<@
w2WAAWOAAO,EAAC,kBAAkB,EAACQ	GAAG@$	GAAG,CAAC<"khq\",[[\"Adduha\",\"Aluula\"],u,u],u,[[\"H\",\"T\",\"T\",\"L\",\"L\",\"L\",\"S\"],[\"Alh\",\"Ati\",\"Ata\",\"Ala\",\"Alm\",\"Alj\",\"Ass\"],[\"Alhadi\",\"Atini\",\"Atalata\",\"Alarba\",\"Alhamiisa\",\"Aljuma\",\"Assabdu\"],[\"Alh\",\"Ati\",\"Ata\",\"Ala\",\"Alm\",\"Alj\",\"Ass\"]],u,[[\"Ž\",\"F\",\"M\",\"A\",\"M\",\"Ž\",\"Ž\",\"U\",\"S\",\"O\",\"N\",\"D\"],[\"Žan\",\"Fee\",\"Mar\",\"Awi\",\"Me\",\"Žuw\",\"Žuy\",\"Ut\",\"Sek\",\"Okt\",\"Noo\",\"Dee\"],[\"Žanwiye\",\"Feewiriye\",\"Marsi\",\"Awiril\",\"Me\",\"Žuweŋ\",\"Žuyye\",\"Ut\",\"Sektanbur\",\"Oktoobur\",\"Noowanbur\",\"Deesanbur\"]],u,[[\"IJ\",\"IZ\"],u,[\"Isaa jine\",\"Isaa jamanoo\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",,\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".s8\",\"#E0\"],\"XOF\",\"F CFA\",\"CFA Fraŋ (BCEAO)\",{¥\"],\"USD\":[\"US$\",\"$\" "H"x~9u-Latn"u-Latn:(SAAS,EAAC,CAAC,CAAC,IAAIy`
K<P-
p(z
<P	K@@<##OAAO,EAAC,OAAOMAAM8BIAAI{y`
y`MMAAMcAAc$eAAeP<@
w2WAAWIAAI,EAAC,iBAAiB,EAACQ		IAAI,CAAC<#u-Latn\",[[\"AM\",\"PM\"],u,u],u,[[\"M\",\"S\",\"S\",\"R\",\"K\",\"J\",\"S\"],[\"Mng\",\"Sen\",\"Sal\",\"Reb\",\"Kem\",\"Jum\",\"Sap\"],[\"Minggu\",\"Senén\",\"Salasa\",\"Rebo\",\"Kemis\",\"Jumaah\",\"Saptu\"],[\"Mng\",\"Sen\",\"Sal\",\"Reb\",\"Kem\",\"Jum\",\"Sap\"]],u,[[\"J\",\"P\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Péb\",\"Mar\",\"Apr\",\"Méi\",\"Jun\",\"Jul\",\"Ags\",\"Sép\",\"Okt\",\"Nop\",\"Dés\"],[\"Januari\",\"Pébruari\",\"Maret\",\"April\",\"Méi\",\"Juni\",\"Juli\",\"Agustus\",\"Séptémber\",\"Oktober\",\"Nopémber\",\"Désémber\"]],u,[[\"SM\",\"M\"],u,u],0,[6,0],[\"d/M/yy\a2*H.mm\",\"H.mm.ss\",\"H.mm.ss z\",\"H.mm.ss jam' {0}\",u],[\",\",\".B.\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"IDR\",\"Rp\",\"Rupee Indonésia\",{\"IDR\":[\"Rp\"]},\"ltr\", plural];Xp2x9uz-Latn!uz-Latn:SAAS,EAAC,CAAC,CAAC,IAAIy`
K

*(BWAAW,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI<$l
O(@@<#7
MAAM|

QAAQV@@<#7
MAAM|

QAAQn$SAASAkBAAkB.`
UAAU,EAAC,WAAW,EAAC,iBAAiB`UAAU,EAAC,aAAa

L<@
UAAU{[mBAAmB,EAACQ	[
IAAI@$GAAG@[
GAAG@$GAAG@uz-Latn\",[[\"TO\",\"TK\"],u,u],u,[[\"Y\",\"D\",\"S\",\"C\",\"P\",\"J\",\"S\"],[\"Yak\",\"Dush\",\"Sesh\",\"Chor\",\"Pay\",\"Jum\",\"Shan\"],[\"yakshanba\",\"dushanba\",\"seshanba\",\"chorshanba\",\"payshanba\",\"juma\",\"shanba\"],[\"Ya\",\"Du\",\"Se\",\"Ch\",\"Pa\",\"Ju\",\"Sh\"]],u,[[\"Y\",\"F\",\"M\",\"A\",\"M\",\"I\",\"I\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"yan\",\"fev\",\"mar\",\"apr\",\"may\",\"iyn\",\"iyl\",\"avg\",\"sen\",\"okt\",\"noy\",\"dek\"],[\"yanvar\",\"fevral\",\"mart\",\"aprel\",\"may\",\"iyun\",\"iyul\",\"avgust\",\"sentabr\",\"oktabr\",\"noyabr\",\"dekabr\"]],[[\"Y\",\"F\",\"M\",\"A\",\"M\",\"I\",\"I\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Yan\",\"Fev\",\"Mar\",\"Apr\",\"May\",\"Iyn\",\"Iyl\",\"Avg\",\"Sen\",\"Okt\",\"Noy\",\"Dek\"],[\"Yanvar\",\"Fevral\",\"Mart\",\"Aprel\",\"May\",\"Iyun\",\"Iyul\",\"Avgust\",\"Sentabr\",\"Oktabr\",\"Noyabr\",\"Dekabr\"]],[[\"m.a.\",\"milodiy\"],u,[\"miloddan avvalgi\",\"milodiy\"]],1,[6,0],[\"dd/MM/yy\",\"d-MMM, y\",\"d-MMMM, y\",\"EEEE, d-MMMM, y\"],M[\"HH:mm\",\"HH:mm:ss\",\"H:mm:ss (z)\",\"H:mm:ss (zzzz)\"],[\"{1}, {0}\",u,uI	son emas=@=UZS\",\"soʻm\",\"O‘zbekiston so‘mi\",{\"BYN\":[u,\"р.\"D¥\"],\"PHP\":[u,\"₱\"],\"USD\":[\"US$\",\"$\"],\"UZS\":[\"soʻm\"iSOJ}x[bas!bas<YAAY,EAAC,WAAW!)_
N
gBAAgB,EAAC,SAASUAAU,EAAC,UAAU8p
QAAQ,EAAC,QAAQ,E$QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO,E"eAAe_
CAAC,OAAO,EAAC,OAAO!qBAAqB,EAAC,oBAAoB_
;;SAAS,EAAC,YAAYKAAK,EAAC,MAAM,EAAC,iBAAiB,E=1Fbas\",[[\"I bikɛ̂glà\",\"I ɓugajɔp\"],u,u],u,[[\"n\",\"n\",\"u\",\"ŋ\",\"m\",\"k\",\"j\"],[\"nɔy\",\"nja\",\"uum\",\"ŋge\",\"mbɔ\",\"kɔɔ\",\"jon\"],[\"ŋgwà nɔ̂y\",\"ŋgwà njaŋgumba\",\"ŋgwà ûm\",\"ŋgwà ŋgê\",\"ŋgwà mbɔk\",\"ŋgwà kɔɔ\",\"ŋgwà jôn\"],[\"nɔy\",\"nja\",\"uum\",\"ŋge\",\"mbɔ\",\"kɔɔ\",\"jon\"]],u,[[\"k\",\"m\",\"m\",\"m\",\"m\",\"h\",\"n\",\"h\",\"d\",\"b\",\"m\",\"l\"],[\"kɔn\",\"mac\",\"mat\",\"mto\",\"mpu\",\"hil\",\"nje\",\"hik\",\"dip\",\"bio\",\"may\",\"liɓ\"],[\"Kɔndɔŋ\",\"Màcɛ̂l\",\"Màtùmb\",\"Màtop\",\"M̀puyɛ\",\"Hìlòndɛ̀\",\"Njèbà\",\"Hìkaŋ\",\"Dpɔ̀s\",\"Bìòôm\",\"Màyɛsèp\",\"Lìbuy li ńyèe\"]],u,[[\"b.Y.K\",\"m.Y.K\"],u,[\"bisū bi Yesù Krǐstò\",\"i mbūs Yesù Krǐstò
,:dC %\",\"#,##0.00 ¤\",\"#E0\"],\"XAF\",\"FCFA\",\"Frǎŋ CFA (BEACN{kQxM!a'a>OxsQ(FOIAAIIAAI,EAAC,MAAMeCAAC,EAAC,CAAC,OAAO,EAAC,cAAc,EAAC,iBAAiB,EAAC,UAAU,EAAC,aAAa,EAAC,MAAM,EAAC,OAAO,CAAC,EAAC,CAAC,IAAIIAAI,EAAC,MAAMFOIAAIIAAI,EAAC,MAAMeCAAC,EAAC,CAAC,OAAO,EAAC,cAAc,EAAC,iBAAiB,EAAC,UAAU,EAAC,aAAa,EAAC,MAAM,EAAC,OAAO,CAAC,EAAC,CAAC,IAAIIAAI,EAAC,MAAM_OUAAU*S`
`
iBAAiB,EAAC,UAAU,C`UAAU,EAAC,SAAS,EAAC,UAAU"YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS`dKAAK7GAAG& (n
- az-Latn\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"7\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\"],[\"B.\",\"B.e.\",\"Ç.a.\",\"Ç.\",\"C.a.\",\"C.\",\"Ş.\"],[\"bazar\",\"bazar ertəsi\",\"çərşənbə axşamı\",\"çərşənbə\",\"cümə axşamı\",\"cümə\",\"şənbə\"],[\"B.\",\"B.E.\",\"Ç.A.\",\"Ç.\",\"C.A.\",\"C.\",\"Ş.\"]],[[\"7\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\"],[\"B.\",\"B.E.\",\"Ç.A.\",\"Ç.\",\"C.A.\",\"C.\",\"Ş.\"],[\"bazar\",\"bazar ertəsi\",\"çərşənbə axşam\",\"çərşənbə\",\"cümə axşamı\",\"cümə\",\"şənbə\"],[\"B.\",\"B.E.\",\"Ç.A.\",\"Ç.\",\"C.A.\",\"C.\",\"Ş.\"]]K,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12Aqlqust\",\"sentyabr\",\"oktyu,[[\"e.ə.\",\"y.e.\"],u,[\"eramızdan əvvəl\",\"yeni era\"]],1,[6,0],[\"dd.MM.yy\",\"d MMM y\",\"d MMMM y\",\"d MMMM y, EEE]E\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".:NaN@9AZN\",\"₼\",\"Azərbaycan Manatı\",{\"AZN\":[\"₼\"],bDFRON\":[u,\"ley\"],\"SYP\":[u,\"S£\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$NAx!ff&ff?EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,Pj
SAAS
PA[WAAW,EPRA02n
6OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO$OAAO,EAAC,OAAOQ[

aAAaQ
n
UAAU,EAAC,UAAUn
OAAO,EAAC,qBAAqB,E@6+	4, i = Math.floor(Math.abs(val));\n\nif (i === 0 || i
:ff-Latn\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade IiSsa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMM y[ v},XOF\",\"F CFA\",\"Mbuuɗu Seefaa BCEAO\",{@-FywJ5xR!shi&shi?(UAAU,EAAC,CaUAAU
P2j
6OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,SAASBWA02,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAOnUAAU,EAAC,OAAO,EAAC,UAAU..[
YAAY,EAAC,cAAcQ
n
UAAU,EAAC,UAAUn
WAAWP

gBAAgB,E@6+	
"shi-Latn\",[[\"tifawt\",\"tadggʷat\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"asa\",\"ayn\",\"asi\",\"akṛ\",\"akw\",\"asim\",\"asiḍ\"],[\"asamas\",\"aynas\",\"asinas\",\"akṛas\",\"akwas\",\"asimwas\",\"asiḍyas\"],[\"asa\",\"ayn\",\"asi\",\"akṛ\",\"akw\",\"asim\",\"asiḍ\"]],u,[[\"i\",\"b\",\"m\",\"i\",\"m\",\"y\",\"y\",\"ɣ\",\"c\",\"k\",\"n\",\"d\"],[\"inn\",\"bṛa\",\"maṛ\",\"ibr\",\"may\",\"yun\",\"yul\",\"ɣuc\",\"cut\",\"ktu\",\"nuw\",\"duj\"],[\"innayr\",\"bṛayṛ\",\"maṛṣ\",\"ibrir\",\"mayyu\",\"yunyu\",\"yulyuz\",\"ɣuct\",\"cutanbir\",\"ktubr\",\"nuwanbir\",\"dujanbir\"]],u,[[\"daɛ\",\"dfɛ\"],u,[\"dat n ɛisa\",\"dffir n ɛisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\*K vl2\",\"#E0\"],\"MAD\",\"MAD\",\"adrim n lmɣrib\",{@-#EzTqxF!sr&sr?<j
2WAAW,EAAC,UAAUPBPA[
6YAAY,EAAC,QAAQ,EAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,QAAQP



WA02SAASx$"QAAQ,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU..j
6MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,OAAO,CAAC,EAAC,CAAC,cAAc.G
kBAAkB^
cAAc,En"hIAAI(^2h(h(h7O(+	
"	sr-Latn\"pre podne\",\"po podne\"],[\"AM\",\"PM\"],u],[[\"n\",\"p\",\"u\",\"s\",\"č\",\"p\",\"s\"],[\"ned\",\"pon\",\"uto\",\"sre\",\"et\",\"pet\",\"sub\"],[\"nedelja\",\"ponedeljak\",\"utorak\",\"sreda\",\"četvrtak\",\"petak\",\"subota\"],[\"ne\",\"po\",\"ut\",\"sr\",\"če\",\"pe\",\"su\"]],u,[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"maj\",\"jun\",\"jul\",\"avg\",\"sep\",\"okt\",\"nov\",\"dec\"],[\"januar\",\"februar\",\"mart\",\"april\",\"maj\",\"jun\",\"jul\",\"avgust\",\"septembar\",\"oktobar\",\"novembar\",\"decembar\"]],u,[[\"p.n.e.\",\"n.e.\"],[\"p. n. e.\",\"n. e.\"],[\"pre nove ere\",\"nove ere\"]],1,[6,0],[\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.\",\"EEEE, d. MMMM y.\"],[\"HH:mm\",\"+RSD\",\"RSD\",\"srpski dinar\",{\"AUD\":[u,\"$\"],\"BAM\":[\"KM\"],\"BYN\":[u,\"r.\"],\"GEL\":[u,\"ლ\"],\"KRW\":[u,\"₩\"],\!"NZD\":[u,\"$\"],\"PHP\":[u,\"₱-,\"VND\":[u,\"₫kT-Fx,!vai&vai?(UAAU,EAAC,Ca-Pj,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ
A0~KAAK

*j
WAAW,EAAC,aAAaWAAWP
GAAG,EAAC,eAAe,E@6+	
"vai-Latn\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"lahadi\",\"tɛɛnɛɛ\",\"talata\",\"alaba\"*,\"aimisa\",\"aijima\",\"siɓiti\"],u,u],uiRM01\",\"M02\",\"M03\",\"M04\",\"M05\",\"M06\",\"M07\",\"M08\",\"M09\",\"M10\",\"M11\",\"M12\"],u],u,[[\"BCE\",\"CE\"],u,u],1,[6,0],[\"dd/MM/GEEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aO .\",\",vc7¤#,##0.00\",\"#E0\"],\"LRD\",\"$\",\"Laibhiya Dala\",{@	LRD\":[\"4ָҠ7x	0bs&bs?EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAEjK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC;QACnF,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IA:AI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACrN,OAAO,CAAC,CAAC;IACb=YAAY,EAAC,SAAS~YAAY,EAAC,SAASe
U
aAAa,EAAC,QAAQMs
7F
U
aAAa,EAAC,QAAQMs
7;MAAM,EAAC,MAAM9`_gBAAgBa.
WAAW$laAAaANIAAI,EAAC,0CAA0C,Ex(/n(MAAM(#EAAE, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))\n    return 3;\nreturn 5;\n}\n	bs-Latn\",[[\"prijepodne\",\"popodne\"],[\"AM\",\"PM\"],[\"prijepodne\",\"popodne\"]],u,[[\"N\",\"P\",\"U\",\"S\",\"Č\",\"P\",\"S
!i?
#jelja\",\"ponedjp
ij
/&
i?
	Mi?
#jelja\",\"ponedjp
ij
/&
i?
]
up]i\",\"juli\",\"auP ,$ijP)t\"{1} 'u' {0}\"k h 8BAM\",\"KM\",\"Bosanskohercegovačka konvertibilna marka*RL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"HRK\":[\"kn\"],"\"ILS\":[u,\"₪\"],\"MXN\":[u,\"$,RSD\":[\"din.\"],\"THB\":[\"฿(=u,\"$\"],\"XCD\":[u,\"$\"],\"XPF\":[]},\"ltr\", plural];\n"]}$ԓPx0et!etD!
CAAC;IAEjG
KAAK,CAAC;QAClBn=IAAI,EAAC,C'	_

	
,WAAW,EAAC,WAAW,EAAC,WAAW,EAAC,OAAO,EAAC,SAASl
Q	P2nMAAM,EAAC,OAAO
OAAO$MAAM:
?OEAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,UAAU,EAAC,UAAU,EAAC,WAAW	
eAAe,EAAC,iBAAiB			iBAAi
W		|
<MAAM1$
(QAAQ)GAAG,EAAC,MAAM,Eo
(*;\n\nif (i === 1 && v === 0)\n    return 1l%et\",[[\"AM\",\"PM\"],u,u],u,[[\"P\",\"E\",\"T\",\"K\",\"N\",\"R\",\"L\"],u,[\"Pühapäev\",\"Esmaspäev\",\"Teisipäev\",\"Kolmapäev\",\"Neljapäev\",\"Reede\",\"Laupäev\"],[\"P\",\"E\",\"T\",\"K\",\"N\",\"R\",\"L\"]],u,[[\"J\",\"V\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jaan\",\"veebr\",\"märts\",\"apr\",\"mai\",\"juuni\",\"juuli\",\"aug\",\"sept\"a,\"okt\",\"nov\",\"dets\"],[\"jaanuar\",\"veebruar\",\"märts\",\"aprill\",\"mai\",\"juuni\",\"juer\",\"oktoober\",\"november\",\"detsember\"]],u,[[\"eKr\",\"pKr\"],u,[\"enne Kristust\",\"pärast Kristust\"]],1,[6,0],[\"dd.M3M.yy\",\"d. MMM y\",\"d. MMMM y\",\"EEEE, d. MMMM yMu,u],[\",\",\" −\",\"×10^;?| =EUR\",\"€\",\"euro\",{\"AUD\":[\"AU$\",\"$\"],\"EEK\":[\"kr!.~4x+x0!hi&hi?&
CAAC;IAEjG
KAAK,CAAC;QAClBnQ-n
	

	.IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,E"MAAM,EAAC,KAAK,EAAC,QAAQ$e	SAAS,EAAC,YAAY,EAAC,UAAU
WAAW1EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI	P2nPp2J

?iMAAMJ

?ineAAe,EAAC,aAAa		J

?
DUAAU,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB:
$UAAU	|
cAAc,EAAC,WAAW,EAAC,cAAc_	
GAAG,EAAC,cAAc,Eo
*;\n\nif (i === 1 && v === 0)\n    return 1l%hi-Latn\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"am\",\"pm\"],u,[\"AM\",\"PM\"]],[[\"ra\",\"so\",\"ma\",\"bu\",\"gu\",\"su\",\"sa\"],[\"ravi\",\"som\",\"mangal\",\"budh\",\"guru\",\"shukra\",\"shani\"],[\"ravivaar\",\"somvaar\",\"mangalvaar\",\"budhvaar\",\"guruvaar\",\"shukravaar\",\"shanivaar\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],0,[0,0],[\"dd/MM/y\",\"dd-MMM-y\",\"d MMMM y\",\"EEEE, d MMMM, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a, {0}\",u],[\".\",\",N,##0.###\",\"#,##,##0%\",\"¤#,##,##0.00\",\"[#E0]\"],\"INR\",\"₹\",\"Indian Rupee\",{\"JPY\":[\"JP¥\",\"¥\"]},\"ltr\", plu<
2f:xj0#is!isDt-gBAAgB1lH_
KAAK,CAAC,CAAC;QAC5Dn=IAAI,EAAC,C'MAAM,EAAC,MAAM,CAAC	
MAAM,EAAC,MAAM	
-PMAAM6WAAW,EAAC,aAAa,EAAC,cAAc,EAAC,aAAa,EAAC,YAAY,EAAC,aAAaeP2nMAAMMAAM$MAAMVOAAO	L"MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO_	aAAa,EAAC,aAAa		
	
iBAAi
C
CAAC,EAAC,eAAe	|
QAAQ)
eAAe,Eo_(_
(
_(_(_(_(_
_t.|0+$/g, ''), 10) || 0;\n\nif (t 1	!(t === 0qo"is\",[[\"f.\",\"e.\"],[\"f.h.\",\"e.h.\"],u],[[\"f.h.\",\"e.h.\"],u,u],[[\"S\",\"M\",\"Þ\",\"M\",\"F\",\"F\",\"L\"],[\"sun.\",\"mán.\",\"þri.\",\"mið.\",\"fim.\",\"fös.\",\"lau.\"],[\"sunnudagur\",\"mánudagur\",\"þriðjudagur\",\"miðvikudagur\",\"fimmtudagur\",\"föstudagur\",\"laugardagur\"],[\"su.\",\"má.\",\"þr.\",\"mi.\",\"fi.\",\"fö.\",\"la.\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"Á\",\"S\",\"O\",\"N\",\"D\"],[\"jan.\",\"feb.\",\"mar.\",\"apr.\",\"maí\",\"jún.\",\"júl.\",\"ágú.\",\"sep.\",\"okt.\",\"nóv.\",\"des.\"],[\"janúar\",\"febrúar\",\"mars\",\"apríl\",\"maí\",\"júní\",\"júlí\",\"ágúst\",\"september\",\"október\",\"nóvember\",\"desember\"]],u,[[\"f.k.\",\"e.k.\"],[\"f.Kr.\",\"e.Kr.\"],[\"fyrir Krist\S",\"eftir Krist\"]],1,[6,0],[\"d.M.y\",\"d. MMM y\",\"d. MMMM y\",\"EEEE, d. MMMM yD, {0}\",u,\"{1} 'kl'.	q| DISK\",\"ISK\",\"íslensk króna\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$cEUR\":[u,\"€\"],\"GBP\":[u,\"£\"],\"INR\":[u,\"₹\"],\"JPY\":[\"JP¥\",\"¥\"],\"KRW\":[u,\"₩>	TWD\":[u,VND\":[u,\"₫\"-.x! 	eAAe,EAAE2];\n"]}U
 0x ff&ffAFpx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["az", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["7", "1", "2", "3", "4", "5", "6"], ["B.", "B.e.", "Ç.a.", "Ç.", "C.a.", "C.", "Ş."], ["bazar", "bazar ertəsi", "çərşənbə axşamı", "çərşənbə", "cümə axşamı", "cümə", "şənbə"], ["B.", "B.E.", "Ç.A.", "Ç.", "C.A.", "C.", "Ş."]], [["7", "1", "2", "3", "4", "5", "6"], ["B.", "B.E.", "Ç.A.", "Ç.", "C.A.", "C.", "Ş."], ["bazar", "bazar ertəsi", "çərşənbə axşamı", "çərşənbə", "cümə axşamı", "cümə", "şənbə"], ["B.", "B.E.", "Ç.A.", "Ç.", "C.A.", "C.", "Ş."]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["yan", "fev", "mar", "apr", "may", "iyn", "iyl", "avq", "sen", "okt", "noy", "dek"], ["yanvar", "fevral", "mart", "aprel", "may", "iyun", "iyul", "avqust", "sentyabr", "oktyabr", "noyabr", "dekabr"]], u, [["e.ə.", "y.e."], u, ["eramızdan əvvəl", "yeni era"]], 1, [6, 0], ["dd.MM.yy", "d MMM y", "d MMMM y", "d MMMM y, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "AZN", "₼", "Azərbaycan Manatı", { "AZN": ["₼"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "ley"], "SYP": [u, "S£"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=az.js.mapL	ZxV/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["bas", [["I bikɛ̂glà", "I ɓugajɔp"], u, u], u, [["n", "n", "u", "ŋ", "m", "k", "j"], ["nɔy", "nja", "uum", "ŋge", "mbɔ", "kɔɔ", "jon"], ["ŋgwà nɔ̂y", "ŋgwà njaŋgumba", "ŋgwà ûm", "ŋgwà ŋgê", "ŋgwà mbɔk", "ŋgwà kɔɔ", "ŋgwà jôn"], ["nɔy", "nja", "uum", "ŋge", "mbɔ", "kɔɔ", "jon"]], u, [["k", "m", "m", "m", "m", "h", "n", "h", "d", "b", "m", "l"], ["kɔn", "mac", "mat", "mto", "mpu", "hil", "nje", "hik", "dip", "bio", "may", "liɓ"], ["Kɔndɔŋ", "Màcɛ̂l", "Màtùmb", "Màtop", "M̀puyɛ", "Hìlòndɛ̀", "Njèbà", "Hìkaŋ", "Dìpɔ̀s", "Bìòôm", "Màyɛsèp", "Lìbuy li ńyèe"]], u, [["b.Y.K", "m.Y.K"], u, ["bisū bi Yesù Krǐstò", "i mbūs Yesù Krǐstò"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "Frǎŋ CFA (BEAC)", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=bas.js.map x{/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n % 10 === 1 && !(n % 100 === 11))
        return 1;
    if (n % 10 === Math.floor(n % 10) && (n % 10 >= 2 && n % 10 <= 4) && !(n % 100 >= 12 && n % 100 <= 14))
        return 3;
    if (n % 10 === 0 || (n % 10 === Math.floor(n % 10) && (n % 10 >= 5 && n % 10 <= 9) || n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 14)))
        return 4;
    return 5;
}
export default ["be-tarask", [["am", "pm"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["н", "п", "а", "с", "ч", "п", "с"], ["нд", "пн", "аў", "ср", "чц", "пт", "сб"], ["нядзеля", "панядзелак", "аўторак", "серада", "чацвер", "пятніца", "субота"], ["нд", "пн", "аў", "ср", "чц", "пт", "сб"]], u, [["с", "л", "с", "к", "м", "ч", "л", "ж", "в", "к", "л", "с"], ["сту", "лют", "сак", "кра", "мая", "чэр", "ліп", "жні", "вер", "кас", "ліс", "сне"], ["студзеня", "лютага", "сакавіка", "красавіка", "мая", "чэрвеня", "ліпеня", "жніўня", "верасня", "кастрычніка", "лістапада", "снежня"]], [["с", "л", "с", "к", "м", "ч", "л", "ж", "в", "к", "л", "с"], ["сту", "лют", "сак", "кра", "май", "чэр", "ліп", "жні", "вер", "кас", "ліс", "сне"], ["студзень", "люты", "сакавік", "красавік", "май", "чэрвень", "ліпень", "жнівень", "верасень", "кастрычнік", "лістапад", "снежань"]], [["да н.э.", "н.э."], u, ["да нараджэння Хрыстова", "ад нараджэння Хрыстова"]], 1, [6, 0], ["d.MM.yy", "d MMM y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss, zzzz"], ["{1}, {0}", u, "{1} 'у' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "BYN", "Br", "беларускі рубель", { "AUD": ["A$"], "BBD": [u, "Bds$"], "BMD": [u, "BD$"], "BRL": [u, "R$"], "BSD": [u, "B$"], "BYN": ["Br"], "BZD": [u, "BZ$"], "CAD": [u, "CA$"], "CUC": [u, "CUC$"], "CUP": [u, "$MN"], "DOP": [u, "RD$"], "FJD": [u, "FJ$"], "FKP": [u, "FK£"], "GYD": [u, "G$"], "ISK": [u, "Íkr"], "JMD": [u, "J$"], "KYD": [u, "CI$"], "LRD": [u, "L$"], "MXN": ["MX$"], "NAD": [u, "N$"], "NZD": [u, "NZ$"], "PHP": [u, "₱"], "RUB": ["₽", "руб."], "SBD": [u, "SI$"], "SGD": [u, "S$"], "TTD": [u, "TT$"], "UYU": [u, "$U"], "XCD": ["EC$"] }, "ltr", plural];
//# sourceMappingURL=be-tarask.js.mapRCx export default [\(]	qxv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n % 10 === 1 && !(n % 100 === 11))
        return 1;
    if (n % 10 === Math.floor(n % 10) && (n % 10 >= 2 && n % 10 <= 4) && !(n % 100 >= 12 && n % 100 <= 14))
        return 3;
    if (n % 10 === 0 || (n % 10 === Math.floor(n % 10) && (n % 10 >= 5 && n % 10 <= 9) || n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 14)))
        return 4;
    return 5;
}
export default ["be", [["am", "pm"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["н", "п", "а", "с", "ч", "п", "с"], ["нд", "пн", "аў", "ср", "чц", "пт", "сб"], ["нядзеля", "панядзелак", "аўторак", "серада", "чацвер", "пятніца", "субота"], ["нд", "пн", "аў", "ср", "чц", "пт", "сб"]], u, [["с", "л", "с", "к", "м", "ч", "л", "ж", "в", "к", "л", "с"], ["сту", "лют", "сак", "кра", "мая", "чэр", "ліп", "жні", "вер", "кас", "ліс", "сне"], ["студзеня", "лютага", "сакавіка", "красавіка", "мая", "чэрвеня", "ліпеня", "жніўня", "верасня", "кастрычніка", "лістапада", "снежня"]], [["с", "л", "с", "к", "м", "ч", "л", "ж", "в", "к", "л", "с"], ["сту", "лют", "сак", "кра", "май", "чэр", "ліп", "жні", "вер", "кас", "ліс", "сне"], ["студзень", "люты", "сакавік", "красавік", "май", "чэрвень", "ліпень", "жнівень", "верасень", "кастрычнік", "лістапад", "снежань"]], [["да н.э.", "н.э."], u, ["да нараджэння Хрыстова", "ад нараджэння Хрыстова"]], 1, [6, 0], ["d.MM.yy", "d MMM y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss, zzzz"], ["{1}, {0}", u, "{1} 'у' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "BYN", "Br", "беларускі рубель", { "AUD": ["A$"], "BBD": [u, "Bds$"], "BMD": [u, "BD$"], "BRL": [u, "R$"], "BSD": [u, "B$"], "BYN": ["Br"], "BZD": [u, "BZ$"], "CAD": [u, "CA$"], "CUC": [u, "CUC$"], "CUP": [u, "$MN"], "DOP": [u, "RD$"], "FJD": [u, "FJ$"], "FKP": [u, "FK£"], "GYD": [u, "G$"], "ISK": [u, "Íkr"], "JMD": [u, "J$"], "KYD": [u, "CI$"], "LRD": [u, "L$"], "MXN": ["MX$"], "NAD": [u, "N$"], "NZD": [u, "NZ$"], "PHP": [u, "₱"], "RUB": ["₽", "руб."], "SBD": [u, "SI$"], "SGD": [u, "S$"], "TTD": [u, "TT$"], "UYU": [u, "$U"], "XCD": ["EC$"] }, "ltr", plural];
//# sourceMappingURL=be.js.mapt>wx{"version":3,"file":"be.js","sourceRoot":"","sources":["be.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n % 10 === 1 && !(n % 100 === 11))\n    return 1;\nif (n % 10 === Math.floor(n % 10) && (n % 10 >= 2 && n % 10 <= 4) && !(n % 100 >= 12 && n % 100 <= 14))\n    return 3;\nif (n % 10 === 0 || (n % 10 === Math.floor(n % 10) && (n % 10 >= 5 && n % 10 <= 9) || n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 14)))\n    return 4;\nreturn 5;\n}\n\nexport default [\"be\",[[\"am\",\"pm\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"н\",\"п\",\"а\",\"с\",\"ч\",\"п\",\"с\"],[\"нд\",\"пн\",\"аў\",\"ср\",\"чц\",\"пт\",\"сб\"],[\"нядзеля\",\"панядзелак\",\"аўторак\",\"серада\",\"чацвер\",\"пятніца\",\"субота\"],[\"нд\",\"пн\",\"аў\",\"ср\",\"чц\",\"пт\",\"сб\"]],u,[[\"с\",\"л\",\"с\",\"к\",\"м\",\"ч\",\"л\",\"ж\",\"в\",\"к\",\"л\",\"с\"],[\"сту\",\"лют\",\"сак\",\"кра\",\"мая\",\"чэр\",\"ліп\",\"жні\",\"вер\",\"кас\",\"ліс\",\"сне\"],[\"студзеня\",\"лютага\",\"сакавіка\",\"красавіка\",\"мая\",\"чэрвеня\",\"ліпеня\",\"жніўня\",\"верасня\",\"кастрычніка\",\"лістапада\",\"снежня\"]],[[\"с\",\"л\",\"с\",\"к\",\"м\",\"ч\",\"л\",\"ж\",\"в\",\"к\",\"л\",\"с\"],[\"сту\",\"лют\",\"сак\",\"кра\",\"май\",\"чэр\",\"ліп\",\"жні\",\"вер\",\"кас\",\"ліс\",\"сне\"],[\"студзень\",\"люты\",\"сакавік\",\"красавік\",\"май\",\"чэрвень\",\"ліпень\",\"жнівень\",\"верасень\",\"кастрычнік\",\"лістапад\",\"снежань\"]],[[\"да н.э.\",\"н.э.\"],u,[\"да нараджэння Хрыстова\",\"ад нараджэння Хрыстова\"]],1,[6,0],[\"d.MM.yy\",\"d MMM y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss, zzzz\"],[\"{1}, {0}\",u,\"{1} 'у' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"BYN\",\"Br\",\"беларускі рубель\",{\"AUD\":[\"A$\"],\"BBD\":[u,\"Bds$\"],\"BMD\":[u,\"BD$\"],\"BRL\":[u,\"R$\"],\"BSD\":[u,\"B$\"],\"BYN\":[\"Br\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[u,\"CA$\"],\"CUC\":[u,\"CUC$\"],\"CUP\":[u,\"$MN\"],\"DOP\":[u,\"RD$\"],\"FJD\":[u,\"FJ$\"],\"FKP\":[u,\"FK£\"],\"GYD\":[u,\"G$\"],\"ISK\":[u,\"Íkr\"],\"JMD\":[u,\"J$\"],\"KYD\":[u,\"CI$\"],\"LRD\":[u,\"L$\"],\"MXN\":[\"MX$\"],\"NAD\":[u,\"N$\"],\"NZD\":[u,\"NZ$\"],\"PHP\":[u,\"₱\"],\"RUB\":[\"₽\",\"руб.\"],\"SBD\":[u,\"SI$\"],\"SGD\":[u,\"S$\"],\"TTD\":[u,\"TT$\"],\"UYU\":[u,\"$U\"],\"XCD\":[\"EC$\"]},\"ltr\", plural];\n"]}v*x#6!ceb!ceb:EAAE,CAAC,GAAG,IAAI,CAAC,KAAKCAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,GAWAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAEju
u
M
u
/-9*
p/-9*CAAC,CAAC,CAAC;QACjLp(=
A
CAAC,SAAS,EAAC,OAAO,EAAC,QAAQp
AC}OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS,EAAC,WAAW,EAAC,WAAW,CAAC,CAAC,EA}(sBAAsB,EAAC,aAAa,C}.iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAao	0cAAcq	QAAQ,EAAC,WAAWGAAG,EAAC,iBAAiB,E
!
l

MAAM,EAAC,GAAG, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i === 1 || (i === 2 || i === 3)) || (v === 0 && !(i % 10 === 4 || (i % 10 === 6 || iP % 10 === 9)) || !(v === 0) && !(f % 10 === 4 || (f % 10 === 6 || f % 10 === 9))q"ceb\",[[\"a\",\"p1D\",\"L\",\"M\",\"M\",\"H\",\"B\",\"S\"],[\"Dom\",\"Lun\",\"Mar\",\"Miy\",\"Huw\",\"Biy\",\"Sab\"],[\"Domingo\",\"Lunes\",\"Martes\",\"Miyerkules\",\"Huwebes\",\"Biyernes\",\"Sabado\"],[\"Dom\",\"Lun\",\"Mar\",\"Miy\",\"Huw\",\"Biy\",\"Sab\"]],u,[[\"E\",\"P\",\"M\",\"A\",\"M\",\"H\",\"H\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Ene\",\"Peb\",\"Mar\",\"Abr\",\"May\",\"Hun\",\"Hul\",\"Ago\",\"Set\",\"Okt\",\"Nob\",\"Dis\"],[\"Enero\",\"Pebrero\",\"Marso\",\"Abril\",\"Mayo\",\"Hunyo\",\"Hulyo\",\"Agosto\",\"Setyembre\",\"Oktubre\",\"Nobyembre\",\"Disyembre\"]],u,[[\"BC\",\"AD\"],u,[\"Sa Wala Pa Si Kristo\",\"Anno Domini\"]],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {sa' {0}\",u],[\".\",\",]%\",\"¤#,##0.00\",\"#E0\"],\"PHP\",\"₱\",\"Philippine Piso\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US $\",\"$\"]},\"ltr\", pO
FjV3xg!ks-Ara"ks-Ara;	CAAC;IAEd;QACPa=SAAS8 >P,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO6YAAY,EAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO
.QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO,CA >A#LOAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,E' OAAO,EAAC,OAAOYAAYZgBAAgB!kBAAkB,EAAC,EAAE^	;\n\nif (n === 1-4ks-Arab\",[[\"AM\",\"PM\"],u,u],u,[[\"ا\",\"ژ\",\"ب\",\"ب\",\"ب\",\"ج\",\"ب\"],[\"آتھوار\",\"ژٔندٕروار\",\"بۆموار\",\"بودوار\",\"برؠسوار\",\"جُمہ\",\"بٹوار\"],[\"اَتھوار\",\"ژٔندرٕروار\",\"بۆموار\",\"بودوار\",\"برؠسوار\",\"جُمہ\",\"بٹوار\"],[\"آتھوار\",\"ژٔندٕروار\",\"بۆموار\",\"بودوار\",\"برؠسوار\",\"جُمہ\",\"بٹوار\"]],u,[[\"ج\",\"ف\",\"م\",\"ا\",\"م\",\"ج\",\"ج\",\"ا\",\"س\",\"س\",\"ا\",\"ن\"],[\"جنؤری\",\"فرؤری\",\"مارٕچ\",\"اپریل\",\"مئی\",\"جوٗن\",\"جوٗلایی\",\"اگست\",\"ستمبر\",\"اکتوٗبر\",\"نومبر\",\"دسمبر\"],u],u,[[\"بی سی\",\"اے ڈ@\"],u,[\"قبٕل مسیٖح\",\"عیٖسوی سنہٕ\"]],0,[0$0} پٮ۪ٹھۍ {1}\",u],[\".\",\"،{KINR\",\"₹\",\"ہِندُستٲنۍ رۄپَے\",{},\"rtl\", plural];\n"]}aPx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["bem", [["uluchelo", "akasuba"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Pa Mulungu", "Palichimo", "Palichibuli", "Palichitatu", "Palichine", "Palichisano", "Pachibelushi"], u, u], u, [["J", "F", "M", "E", "M", "J", "J", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Epr", "Mei", "Jun", "Jul", "Oga", "Sep", "Okt", "Nov", "Dis"], ["Januari", "Februari", "Machi", "Epreo", "Mei", "Juni", "Julai", "Ogasti", "Septemba", "Oktoba", "Novemba", "Disemba"]], u, [["BC", "AD"], u, ["Before Yesu", "After Yesu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ZMW", "K", "ZMW", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "ZMW": ["K", "ZK"] }, "ltr", plural];
//# sourceMappingURL=bem.js.mapaFbx(/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["bez", [["pamilau", "pamunyi"], u, u], u, [["M", "J", "H", "H", "H", "W", "J"], ["Mul", "Vil", "Hiv", "Hid", "Hit", "Hih", "Lem"], ["pa mulungu", "pa shahuviluha", "pa hivili", "pa hidatu", "pa hitayi", "pa hihanu", "pa shahulembela"], ["Mul", "Vil", "Hiv", "Hid", "Hit", "Hih", "Lem"]], u, [["H", "V", "D", "T", "H", "S", "S", "N", "T", "K", "K", "K"], ["Hut", "Vil", "Dat", "Tai", "Han", "Sit", "Sab", "Nan", "Tis", "Kum", "Kmj", "Kmb"], ["pa mwedzi gwa hutala", "pa mwedzi gwa wuvili", "pa mwedzi gwa wudatu", "pa mwedzi gwa wutai", "pa mwedzi gwa wuhanu", "pa mwedzi gwa sita", "pa mwedzi gwa saba", "pa mwedzi gwa nane", "pa mwedzi gwa tisa", "pa mwedzi gwa kumi", "pa mwedzi gwa kumi na moja", "pa mwedzi gwa kumi na mbili"]], u, [["KM", "BM"], u, ["Kabla ya Mtwaa", "Baada ya Mtwaa"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "TZS", "TSh", "Shilingi ya Hutanzania", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=bez.js.mapOExL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    AOA: never[];
    ARS: never[];
    AUD: never[];
    BAM: never[];
    BBD: never[];
    BDT: never[];
    BMD: never[];
    BND: never[];
    BOB: never[];
    BRL: never[];
    BSD: never[];
    BWP: never[];
    BZD: never[];
    CAD: never[];
    CLP: never[];
    CNY: never[];
    COP: never[];
    CRC: never[];
    CUC: never[];
    CUP: never[];
    CZK: never[];
    DKK: never[];
    DOP: never[];
    EGP: never[];
    ESP: never[];
    FIM: string[];
    FJD: never[];
    FKP: never[];
    GEL: never[];
    GIP: never[];
    GNF: never[];
    GTQ: never[];
    GYD: never[];
    HKD: never[];
    HNL: never[];
    HRK: never[];
    HUF: never[];
    IDR: never[];
    ILS: never[];
    INR: never[];
    ISK: never[];
    JMD: never[];
    KHR: never[];
    KMF: never[];
    KPW: never[];
    KRW: never[];
    KYD: never[];
    KZT: never[];
    LAK: never[];
    LBP: never[];
    LKR: never[];
    LRD: never[];
    LTL: never[];
    LVL: never[];
    MGA: never[];
    MMK: never[];
    MNT: never[];
    MUR: never[];
    MXN: never[];
    MYR: never[];
    NAD: never[];
    NGN: never[];
    NIO: never[];
    NOK: never[];
    NPR: never[];
    NZD: never[];
    PHP: never[];
    PKR: never[];
    PLN: never[];
    PYG: never[];
    RON: never[];
    RWF: never[];
    SBD: never[];
    SEK: never[];
    SGD: never[];
    SHP: never[];
    SRD: never[];
    SSP: never[];
    STN: (string | undefined)[];
    SYP: never[];
    THB: never[];
    TOP: never[];
    TRY: never[];
    TTD: never[];
    TWD: never[];
    UAH: never[];
    UYU: never[];
    VEF: never[];
    VND: never[];
    XCD: never[];
    XPF: never[];
    XXX: never[];
    ZAR: never[];
    ZMW: never[];
} | undefined)[];
export default _default;
E\Zx >zFN:.	;
    AMD|3AZN4
GN: string-$RmP!N%BP:.	;
    GHSu"#&$\JPY:.	;
    KHRXRD["%$U##MI
SD: string/-ޒ4*xL Aconst _default: ((string[] | undefined)[] | (string | string[])[]"*Rbbx ӓstring[])[]/ x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["bg", [["am", "pm"], u, ["пр.об.", "сл.об."]], [["am", "pm"], u, u], [["н", "п", "в", "с", "ч", "п", "с"], ["нд", "пн", "вт", "ср", "чт", "пт", "сб"], ["неделя", "понеделник", "вторник", "сряда", "четвъртък", "петък", "събота"], ["нд", "пн", "вт", "ср", "чт", "пт", "сб"]], u, [["я", "ф", "м", "а", "м", "ю", "ю", "а", "с", "о", "н", "д"], ["яну", "фев", "март", "апр", "май", "юни", "юли", "авг", "сеп", "окт", "ное", "дек"], ["януари", "февруари", "март", "април", "май", "юни", "юли", "август", "септември", "октомври", "ноември", "декември"]], u, [["пр.Хр.", "сл.Хр."], u, ["преди Христа", "след Христа"]], 1, [6, 0], ["d.MM.yy 'г'.", "d.MM.y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["H:mm 'ч'.", "H:mm:ss 'ч'.", "H:mm:ss 'ч'. z", "H:mm:ss 'ч'. zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "0.00 ¤", "#E0"], "BGN", "лв.", "Български лев", { "AFN": [u, "Af"], "AMD": [], "ARS": [], "AUD": [], "AZN": [], "BBD": [], "BDT": [], "BGN": ["лв."], "BMD": [], "BND": [], "BRL": [], "BSD": [], "BZD": [], "CAD": [], "CLP": [], "CNY": [], "COP": [], "CRC": [], "CUP": [], "DOP": [], "FJD": [], "FKP": [], "GBP": [u, "£"], "GHS": [], "GIP": [], "GYD": [], "HKD": [], "ILS": [], "INR": [], "JMD": [], "JPY": [u, "¥"], "KHR": [], "KRW": [], "KYD": [], "KZT": [], "LAK": [], "LRD": [], "MNT": [], "MXN": [], "NAD": [], "NGN": [], "NZD": [], "PHP": [], "PYG": [], "RON": [], "SBD": [], "SGD": [], "SRD": [], "SSP": [], "TRY": [], "TTD": [], "TWD": [], "UAH": [], "USD": ["щ.д.", "$"], "UYU": [], "VND": [], "XCD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=bg.js.map%Ͼx{"version":3,"file":"bg.js","sourceRoot":"","sources":["bg.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"bg\",[[\"am\",\"pm\"],u,[\"пр.об.\",\"сл.об.\"]],[[\"am\",\"pm\"],u,u],[[\"н\",\"п\",\"в\",\"с\",\"ч\",\"п\",\"с\"],[\"нд\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],[\"неделя\",\"понеделник\",\"вторник\",\"сряда\",\"четвъртък\",\"петък\",\"събота\"],[\"нд\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"]],u,[[\"я\",\"ф\",\"м\",\"а\",\"м\",\"ю\",\"ю\",\"а\",\"с\",\"о\",\"н\",\"д\"],[\"яну\",\"фев\",\"март\",\"апр\",\"май\",\"юни\",\"юли\",\"авг\",\"сеп\",\"окт\",\"ное\",\"дек\"],[\"януари\",\"февруари\",\"март\",\"април\",\"май\",\"юни\",\"юли\",\"август\",\"септември\",\"октомври\",\"ноември\",\"декември\"]],u,[[\"пр.Хр.\",\"сл.Хр.\"],u,[\"преди Христа\",\"след Христа\"]],1,[6,0],[\"d.MM.yy 'г'.\",\"d.MM.y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"H:mm 'ч'.\",\"H:mm:ss 'ч'.\",\"H:mm:ss 'ч'. z\",\"H:mm:ss 'ч'. zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"0.00 ¤\",\"#E0\"],\"BGN\",\"лв.\",\"Български лев\",{\"AFN\":[u,\"Af\"],\"AMD\":[],\"ARS\":[],\"AUD\":[],\"AZN\":[],\"BBD\":[],\"BDT\":[],\"BGN\":[\"лв.\"],\"BMD\":[],\"BND\":[],\"BRL\":[],\"BSD\":[],\"BZD\":[],\"CAD\":[],\"CLP\":[],\"CNY\":[],\"COP\":[],\"CRC\":[],\"CUP\":[],\"DOP\":[],\"FJD\":[],\"FKP\":[],\"GBP\":[u,\"£\"],\"GHS\":[],\"GIP\":[],\"GYD\":[],\"HKD\":[],\"ILS\":[],\"INR\":[],\"JMD\":[],\"JPY\":[u,\"¥\"],\"KHR\":[],\"KRW\":[],\"KYD\":[],\"KZT\":[],\"LAK\":[],\"LRD\":[],\"MNT\":[],\"MXN\":[],\"NAD\":[],\"NGN\":[],\"NZD\":[],\"PHP\":[],\"PYG\":[],\"RON\":[],\"SBD\":[],\"SGD\":[],\"SRD\":[],\"SSP\":[],\"TRY\":[],\"TTD\":[],\"TWD\":[],\"UAH\":[],\"USD\":[\"щ.д.\",\"$\"],\"UYU\":[],\"VND\":[],\"XCD\":[u,\"$\"]},\"ltr\", plural];\n"]}sTxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["bm", [["AM", "PM"], u, u], u, [["K", "N", "T", "A", "A", "J", "S"], ["kar", "ntɛ", "tar", "ara", "ala", "jum", "sib"], ["kari", "ntɛnɛ", "tarata", "araba", "alamisa", "juma", "sibiri"], ["kar", "ntɛ", "tar", "ara", "ala", "jum", "sib"]], u, [["Z", "F", "M", "A", "M", "Z", "Z", "U", "S", "Ɔ", "N", "D"], ["zan", "feb", "mar", "awi", "mɛ", "zuw", "zul", "uti", "sɛt", "ɔku", "now", "des"], ["zanwuye", "feburuye", "marisi", "awirili", "mɛ", "zuwɛn", "zuluye", "uti", "sɛtanburu", "ɔkutɔburu", "nowanburu", "desanburu"]], u, [["J.-C. ɲɛ", "ni J.-C."], u, ["jezu krisiti ɲɛ", "jezu krisiti minkɛ"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XOF", "F CFA", "sefa Fraŋ (BCEAO)", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=bm.js.mapՂx;
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["bn-IN", [["AM", "PM"], u, u], u, [["র", "সো", "ম", "বু", "বৃ", "শু", "শ"], ["রবি", "সোম", "মঙ্গল", "বুধ", "বৃহস্পতি", "শুক্র", "শনি"], ["রবিবার", "সোমবার", "মঙ্গলবার", "বুধবার", "বৃহস্পতিবার", "শুক্রবার", "শনিবার"], ["রঃ", "সোঃ", "মঃ", "বুঃ", "বৃঃ", "শুঃ", "শনি"]], u, [["জা", "ফে", "মা", "এ", "মে", "জুন", "জু", "আ", "সে", "অ", "ন", "ডি"], ["জানু", "ফেব", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "আগস্ট", "সেপ্টেম্বর", "অক্টোবর", "নভেম্বর", "ডিসেম্বর"], ["জানুয়ারী", "ফেব্রুয়ারী", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "আগস্ট", "সেপ্টেম্বর", "অক্টোবর", "নভেম্বর", "ডিসেম্বর"]], [["জা", "ফে", "মা", "এ", "মে", "জুন", "জু", "আ", "সে", "অ", "ন", "ডি"], ["জানুয়ারী", "ফেব্রুয়ারী", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "আগস্ট", "সেপ্টেম্বর", "অক্টোবর", "নভেম্বর", "ডিসেম্বর"], u], [["খ্রিস্টপূর্ব", "খৃষ্টাব্দ"], u, ["খ্রিস্টপূর্ব", "খ্রীষ্টাব্দ"]], 0, [0, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "#,##,##0.00¤", "#E0"], "INR", "₹", "ভারতীয় রুপি", { "BDT": ["৳"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=bn-IN.js.map[͹xf{"version":3,"file":"bn-IN.js","sourceRoot":"","sources":["bn-IN.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"bn-IN\",[[\"AM\",\"PM\"],u,u],u,[[\"র\",\"সো\",\"ম\",\"বু\",\"বৃ\",\"শু\",\"শ\"],[\"রবি\",\"সোম\",\"মঙ্গল\",\"বুধ\",\"বৃহস্পতি\",\"শুক্র\",\"শনি\"],[\"রবিবার\",\"সোমবার\",\"মঙ্গলবার\",\"বুধবার\",\"বৃহস্পতিবার\",\"শুক্রবার\",\"শনিবার\"],[\"রঃ\",\"সোঃ\",\"মঃ\",\"বুঃ\",\"বৃঃ\",\"শুঃ\",\"শনি\"]],u,[[\"জা\",\"ফে\",\"মা\",\"এ\",\"মে\",\"জুন\",\"জু\",\"আ\",\"সে\",\"অ\",\"ন\",\"ডি\"],[\"জানু\",\"ফেব\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"আগস্ট\",\"সেপ্টেম্বর\",\"অক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"],[\"জানুয়ারী\",\"ফেব্রুয়ারী\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"আগস্ট\",\"সেপ্টেম্বর\",\"অক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"]],[[\"জা\",\"ফে\",\"মা\",\"এ\",\"মে\",\"জুন\",\"জু\",\"আ\",\"সে\",\"অ\",\"ন\",\"ডি\"],[\"জানুয়ারী\",\"ফেব্রুয়ারী\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"আগস্ট\",\"সেপ্টেম্বর\",\"অক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"],u],[[\"খ্রিস্টপূর্ব\",\"খৃষ্টাব্দ\"],u,[\"খ্রিস্টপূর্ব\",\"খ্রীষ্টাব্দ\"]],0,[0,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"#,##,##0.00¤\",\"#E0\"],\"INR\",\"₹\",\"ভারতীয় রুপি\",{\"BDT\":[\"৳\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]};xx;
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["bn", [["AM", "PM"], u, u], u, [["র", "সো", "ম", "বু", "বৃ", "শু", "শ"], ["রবি", "সোম", "মঙ্গল", "বুধ", "বৃহস্পতি", "শুক্র", "শনি"], ["রবিবার", "সোমবার", "মঙ্গলবার", "বুধবার", "বৃহস্পতিবার", "শুক্রবার", "শনিবার"], ["রঃ", "সোঃ", "মঃ", "বুঃ", "বৃঃ", "শুঃ", "শনি"]], u, [["জা", "ফে", "মা", "এ", "মে", "জুন", "জু", "আ", "সে", "অ", "ন", "ডি"], ["জানু", "ফেব", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "আগস্ট", "সেপ্টেম্বর", "অক্টোবর", "নভেম্বর", "ডিসেম্বর"], ["জানুয়ারী", "ফেব্রুয়ারী", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "আগস্ট", "সেপ্টেম্বর", "অক্টোবর", "নভেম্বর", "ডিসেম্বর"]], [["জা", "ফে", "মা", "এ", "মে", "জুন", "জু", "আ", "সে", "অ", "ন", "ডি"], ["জানুয়ারী", "ফেব্রুয়ারী", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "আগস্ট", "সেপ্টেম্বর", "অক্টোবর", "নভেম্বর", "ডিসেম্বর"], u], [["খ্রিস্টপূর্ব", "খৃষ্টাব্দ"], u, ["খ্রিস্টপূর্ব", "খ্রীষ্টাব্দ"]], 0, [6, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "#,##,##0.00¤", "#E0"], "BDT", "৳", "বাংলাদেশী টাকা", { "BDT": ["৳"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=bn.js.map␸xg{"version":3,"file":"bn.js","sourceRoot":"","sources":["bn.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"bn\",[[\"AM\",\"PM\"],u,u],u,[[\"র\",\"সো\",\"ম\",\"বু\",\"বৃ\",\"শু\",\"শ\"],[\"রবি\",\"সোম\",\"মঙ্গল\",\"বুধ\",\"বৃহস্পতি\",\"শুক্র\",\"শনি\"],[\"রবিবার\",\"সোমবার\",\"মঙ্গলবার\",\"বুধবার\",\"বৃহস্পতিবার\",\"শুক্রবার\",\"শনিবার\"],[\"রঃ\",\"সোঃ\",\"মঃ\",\"বুঃ\",\"বৃঃ\",\"শুঃ\",\"শনি\"]],u,[[\"জা\",\"ফে\",\"মা\",\"এ\",\"মে\",\"জুন\",\"জু\",\"আ\",\"সে\",\"অ\",\"ন\",\"ডি\"],[\"জানু\",\"ফেব\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"আগস্ট\",\"সেপ্টেম্বর\",\"অক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"],[\"জানুয়ারী\",\"ফেব্রুয়ারী\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"আগস্ট\",\"সেপ্টেম্বর\",\"অক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"]],[[\"জা\",\"ফে\",\"মা\",\"এ\",\"মে\",\"জুন\",\"জু\",\"আ\",\"সে\",\"অ\",\"ন\",\"ডি\"],[\"জানুয়ারী\",\"ফেব্রুয়ারী\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"আগস্ট\",\"সেপ্টেম্বর\",\"অক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"],u],[[\"খ্রিস্টপূর্ব\",\"খৃষ্টাব্দ\"],u,[\"খ্রিস্টপূর্ব\",\"খ্রীষ্টাব্দ\"]],0,[6,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"#,##,##0.00¤\",\"#E0\"],\"BDT\",\"৳\",\"বাংলাদেশী টাকা\",{\"BDT\":[\"৳\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}PzxO/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["bo-IN", [["སྔ་དྲོ་", "ཕྱི་དྲོ་"], u, u], u, [["ཉི", "ཟླ", "མིག", "ལྷག", "ཕུར", "སངས", "སྤེན"], ["ཉི་མ་", "ཟླ་བ་", "མིག་དམར་", "ལྷག་པ་", "ཕུར་བུ་", "པ་སངས་", "སྤེན་པ་"], ["གཟའ་ཉི་མ་", "གཟའ་ཟླ་བ་", "གཟའ་མིག་དམར་", "གཟའ་ལྷག་པ་", "གཟའ་ཕུར་བུ་", "གཟའ་པ་སངས་", "གཟའ་སྤེན་པ་"], ["ཉི་མ་", "ཟླ་བ་", "མིག་དམར་", "ལྷག་པ་", "ཕུར་བུ་", "པ་སངས་", "སྤེན་པ་"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ཟླ་༡", "ཟླ་༢", "ཟླ་༣", "ཟླ་༤", "ཟླ་༥", "ཟླ་༦", "ཟླ་༧", "ཟླ་༨", "ཟླ་༩", "ཟླ་༡༠", "ཟླ་༡༡", "ཟླ་༡༢"], ["ཟླ་བ་དང་པོ", "ཟླ་བ་གཉིས་པ", "ཟླ་བ་གསུམ་པ", "ཟླ་བ་བཞི་པ", "ཟླ་བ་ལྔ་པ", "ཟླ་བ་དྲུག་པ", "ཟླ་བ་བདུན་པ", "ཟླ་བ་བརྒྱད་པ", "ཟླ་བ་དགུ་པ", "ཟླ་བ་བཅུ་པ", "ཟླ་བ་བཅུ་གཅིག་པ", "ཟླ་བ་བཅུ་གཉིས་པ"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ཟླ་༡", "ཟླ་༢", "ཟླ་༣", "ཟླ་༤", "ཟླ་༥", "ཟླ་༦", "ཟླ་༧", "ཟླ་༨", "ཟླ་༩", "ཟླ་༡༠", "ཟླ་༡༡", "ཟླ་༡༢"], ["ཟླ་བ་དང་པོ་", "ཟླ་བ་གཉིས་པ་", "ཟླ་བ་གསུམ་པ་", "ཟླ་བ་བཞི་པ་", "ཟླ་བ་ལྔ་པ་", "ཟླ་བ་དྲུག་པ་", "ཟླ་བ་བདུན་པ་", "ཟླ་བ་བརྒྱད་པ་", "ཟླ་བ་དགུ་པ་", "ཟླ་བ་བཅུ་པ་", "ཟླ་བ་བཅུ་གཅིག་པ་", "ཟླ་བ་བཅུ་གཉིས་པ་"]], [["སྤྱི་ལོ་སྔོན་", "སྤྱི་ལོ་"], u, u], 0, [0, 0], ["y-MM-dd", "y ལོའི་MMMཚེས་d", "སྤྱི་ལོ་y MMMMའི་ཚེས་d", "y MMMMའི་ཚེས་d, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "INR", "₹", "རྒྱ་གར་སྒོར་", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=bo-IN.js.map3-x{"version":3,"file":"bo-IN.js","sourceRoot":"","sources":["bo-IN.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,SAAS,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,cAAc,EAAC,YAAY,EAAC,aAAa,EAAC,YAAY,EAAC,aAAa,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,WAAW,EAAC,aAAa,EAAC,aAAa,EAAC,cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,iBAAiB,EAAC,iBAAiB,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa,EAAC,YAAY,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,EAAC,aAAa,EAAC,aAAa,EAAC,kBAAkB,EAAC,kBAAkB,CAAC,CAAC,EAAC,CAAC,CAAC,eAAe,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,iBAAiB,EAAC,wBAAwB,EAAC,sBAAsB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"bo-IN\",[[\"སྔ་དྲོ་\",\"ཕྱི་དྲོ་\"],u,u],u,[[\"ཉི\",\"ཟླ\",\"མིག\",\"ལྷག\",\"ཕུར\",\"སངས\",\"སྤེན\"],[\"ཉི་མ་\",\"ཟླ་བ་\",\"མིག་དམར་\",\"ལྷག་པ་\",\"ཕུར་བུ་\",\"པ་སངས་\",\"སྤེན་པ་\"],[\"གཟའ་ཉི་མ་\",\"གཟའ་ཟླ་བ་\",\"གཟའ་མིག་དམར་\",\"གཟའ་ལྷག་པ་\",\"གཟའ་ཕུར་བུ་\",\"གཟའ་པ་སངས་\",\"གཟའ་སྤེན་པ་\"],[\"ཉི་མ་\",\"ཟླ་བ་\",\"མིག་དམར་\",\"ལྷག་པ་\",\"ཕུར་བུ་\",\"པ་སངས་\",\"སྤེན་པ་\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"ཟླ་༡\",\"ཟླ་༢\",\"ཟླ་༣\",\"ཟླ་༤\",\"ཟླ་༥\",\"ཟླ་༦\",\"ཟླ་༧\",\"ཟླ་༨\",\"ཟླ་༩\",\"ཟླ་༡༠\",\"ཟླ་༡༡\",\"ཟླ་༡༢\"],[\"ཟླ་བ་དང་པོ\",\"ཟླ་བ་གཉིས་པ\",\"ཟླ་བ་གསུམ་པ\",\"ཟླ་བ་བཞི་པ\",\"ཟླ་བ་ལྔ་པ\",\"ཟླ་བ་དྲུག་པ\",\"ཟླ་བ་བདུན་པ\",\"ཟླ་བ་བརྒྱད་པ\",\"ཟླ་བ་དགུ་པ\",\"ཟླ་བ་བཅུ་པ\",\"ཟླ་བ་བཅུ་གཅིག་པ\",\"ཟླ་བ་བཅུ་གཉིས་པ\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"ཟླ་༡\",\"ཟླ་༢\",\"ཟླ་༣\",\"ཟླ་༤\",\"ཟླ་༥\",\"ཟླ་༦\",\"ཟླ་༧\",\"ཟླ་༨\",\"ཟླ་༩\",\"ཟླ་༡༠\",\"ཟླ་༡༡\",\"ཟླ་༡༢\"],[\"ཟླ་བ་དང་པོ་\",\"ཟླ་བ་གཉིས་པ་\",\"ཟླ་བ་གསུམ་པ་\",\"ཟླ་བ་བཞི་པ་\",\"ཟླ་བ་ལྔ་པ་\",\"ཟླ་བ་དྲུག་པ་\",\"ཟླ་བ་བདུན་པ་\",\"ཟླ་བ་བརྒྱད་པ་\",\"ཟླ་བ་དགུ་པ་\",\"ཟླ་བ་བཅུ་པ་\",\"ཟླ་བ་བཅུ་གཅིག་པ་\",\"ཟླ་བ་བཅུ་གཉིས་པ་\"]],[[\"སྤྱི་ལོ་སྔོན་\",\"སྤྱི་ལོ་\"],u,u],0,[0,0],[\"y-MM-dd\",\"y ལོའི་MMMཚེས་d\",\"སྤྱི་ལོ་y MMMMའི་ཚེས་d\",\"y MMMMའི་ཚེས་d, EEEE\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"INR\",\"₹\",\"རྒྱ་གར་སྒོར་\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}k x- )	eAAe,EAAE
2export default [];\n"]}iwWxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["bo", [["སྔ་དྲོ་", "ཕྱི་དྲོ་"], u, u], u, [["ཉི", "ཟླ", "མིག", "ལྷག", "ཕུར", "སངས", "སྤེན"], ["ཉི་མ་", "ཟླ་བ་", "མིག་དམར་", "ལྷག་པ་", "ཕུར་བུ་", "པ་སངས་", "སྤེན་པ་"], ["གཟའ་ཉི་མ་", "གཟའ་ཟླ་བ་", "གཟའ་མིག་དམར་", "གཟའ་ལྷག་པ་", "གཟའ་ཕུར་བུ་", "གཟའ་པ་སངས་", "གཟའ་སྤེན་པ་"], ["ཉི་མ་", "ཟླ་བ་", "མིག་དམར་", "ལྷག་པ་", "ཕུར་བུ་", "པ་སངས་", "སྤེན་པ་"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ཟླ་༡", "ཟླ་༢", "ཟླ་༣", "ཟླ་༤", "ཟླ་༥", "ཟླ་༦", "ཟླ་༧", "ཟླ་༨", "ཟླ་༩", "ཟླ་༡༠", "ཟླ་༡༡", "ཟླ་༡༢"], ["ཟླ་བ་དང་པོ", "ཟླ་བ་གཉིས་པ", "ཟླ་བ་གསུམ་པ", "ཟླ་བ་བཞི་པ", "ཟླ་བ་ལྔ་པ", "ཟླ་བ་དྲུག་པ", "ཟླ་བ་བདུན་པ", "ཟླ་བ་བརྒྱད་པ", "ཟླ་བ་དགུ་པ", "ཟླ་བ་བཅུ་པ", "ཟླ་བ་བཅུ་གཅིག་པ", "ཟླ་བ་བཅུ་གཉིས་པ"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ཟླ་༡", "ཟླ་༢", "ཟླ་༣", "ཟླ་༤", "ཟླ་༥", "ཟླ་༦", "ཟླ་༧", "ཟླ་༨", "ཟླ་༩", "ཟླ་༡༠", "ཟླ་༡༡", "ཟླ་༡༢"], ["ཟླ་བ་དང་པོ་", "ཟླ་བ་གཉིས་པ་", "ཟླ་བ་གསུམ་པ་", "ཟླ་བ་བཞི་པ་", "ཟླ་བ་ལྔ་པ་", "ཟླ་བ་དྲུག་པ་", "ཟླ་བ་བདུན་པ་", "ཟླ་བ་བརྒྱད་པ་", "ཟླ་བ་དགུ་པ་", "ཟླ་བ་བཅུ་པ་", "ཟླ་བ་བཅུ་གཅིག་པ་", "ཟླ་བ་བཅུ་གཉིས་པ་"]], [["སྤྱི་ལོ་སྔོན་", "སྤྱི་ལོ་"], u, u], 0, [6, 0], ["y-MM-dd", "y ལོའི་MMMཚེས་d", "སྤྱི་ལོ་y MMMMའི་ཚེས་d", "y MMMMའི་ཚེས་d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "CNY", "¥", "ཡུ་ཨན་", { "CNY": ["¥"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=bo.js.maps9x {"version":3,"file":"bo.js","sourceRoot":"","sources":["bo.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,SAAS,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,cAAc,EAAC,YAAY,EAAC,aAAa,EAAC,YAAY,EAAC,aAAa,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,WAAW,EAAC,aAAa,EAAC,aAAa,EAAC,cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,iBAAiB,EAAC,iBAAiB,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa,EAAC,YAAY,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,EAAC,aAAa,EAAC,aAAa,EAAC,kBAAkB,EAAC,kBAAkB,CAAC,CAAC,EAAC,CAAC,CAAC,eAAe,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,iBAAiB,EAAC,wBAAwB,EAAC,sBAAsB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,QAAQ,EAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"bo\",[[\"སྔ་དྲོ་\",\"ཕྱི་དྲོ་\"],u,u],u,[[\"ཉི\",\"ཟླ\",\"མིག\",\"ལྷག\",\"ཕུར\",\"སངས\",\"སྤེན\"],[\"ཉི་མ་\",\"ཟླ་བ་\",\"མིག་དམར་\",\"ལྷག་པ་\",\"ཕུར་བུ་\",\"པ་སངས་\",\"སྤེན་པ་\"],[\"གཟའ་ཉི་མ་\",\"གཟའ་ཟླ་བ་\",\"གཟའ་མིག་དམར་\",\"གཟའ་ལྷག་པ་\",\"གཟའ་ཕུར་བུ་\",\"གཟའ་པ་སངས་\",\"གཟའ་སྤེན་པ་\"],[\"ཉི་མ་\",\"ཟླ་བ་\",\"མིག་དམར་\",\"ལྷག་པ་\",\"ཕུར་བུ་\",\"པ་སངས་\",\"སྤེན་པ་\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"ཟླ་༡\",\"ཟླ་༢\",\"ཟླ་༣\",\"ཟླ་༤\",\"ཟླ་༥\",\"ཟླ་༦\",\"ཟླ་༧\",\"ཟླ་༨\",\"ཟླ་༩\",\"ཟླ་༡༠\",\"ཟླ་༡༡\",\"ཟླ་༡༢\"],[\"ཟླ་བ་དང་པོ\",\"ཟླ་བ་གཉིས་པ\",\"ཟླ་བ་གསུམ་པ\",\"ཟླ་བ་བཞི་པ\",\"ཟླ་བ་ལྔ་པ\",\"ཟླ་བ་དྲུག་པ\",\"ཟླ་བ་བདུན་པ\",\"ཟླ་བ་བརྒྱད་པ\",\"ཟླ་བ་དགུ་པ\",\"ཟླ་བ་བཅུ་པ\",\"ཟླ་བ་བཅུ་གཅིག་པ\",\"ཟླ་བ་བཅུ་གཉིས་པ\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"ཟླ་༡\",\"ཟླ་༢\",\"ཟླ་༣\",\"ཟླ་༤\",\"ཟླ་༥\",\"ཟླ་༦\",\"ཟླ་༧\",\"ཟླ་༨\",\"ཟླ་༩\",\"ཟླ་༡༠\",\"ཟླ་༡༡\",\"ཟླ་༡༢\"],[\"ཟླ་བ་དང་པོ་\",\"ཟླ་བ་གཉིས་པ་\",\"ཟླ་བ་གསུམ་པ་\",\"ཟླ་བ་བཞི་པ་\",\"ཟླ་བ་ལྔ་པ་\",\"ཟླ་བ་དྲུག་པ་\",\"ཟླ་བ་བདུན་པ་\",\"ཟླ་བ་བརྒྱད་པ་\",\"ཟླ་བ་དགུ་པ་\",\"ཟླ་བ་བཅུ་པ་\",\"ཟླ་བ་བཅུ་གཅིག་པ་\",\"ཟླ་བ་བཅུ་གཉིས་པ་\"]],[[\"སྤྱི་ལོ་སྔོན་\",\"སྤྱི་ལོ་\"],u,u],0,[6,0],[\"y-MM-dd\",\"y ལོའི་MMMཚེས་d\",\"སྤྱི་ལོ་y MMMMའི་ཚེས་d\",\"y MMMMའི་ཚེས་d, EEEE\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"CNY\",\"¥\",\"ཡུ་ཨན་\",{\"CNY\":[\"¥\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}/Ixf)kkj!kkj:,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb)KAAKA``"WAAW,EAAC,MAAM,EAAC,WAAW,EAAC,YAAY)``"WAAW,EAAC,MAAM,EAAC,WAAW,EAAC,YAAY``gBAAgBBiBAAiB,EAAC,QAAQ,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,SAAS
KAAK
,
SAAS,EAAC,UAAU,EAAC,gBAAgBnMAAM,EAAC,WAAWif (n === 1)\n    return 1;	$kkj\",[[\"AM\",\"PM\"],u,u],u,[[\"so\",\"lu\",\"ma\",\"mɛ\",\"ye\",\"va\",\"ms\"],[\"sɔndi\",\"lundi\",\"mardi\",\"mɛrkɛrɛdi\",\"yedi\",\"vaŋdɛrɛdi\",\"mɔnɔ sɔndi\"],u,u],[[\"so\",\"lu\",\"ma\",\"mɛ\",\"ye\",\"va\",\"ms\"],[\"sɔndi\",\"lundi\",\"mardi\",\"mɛrkɛrɛdi\",\"yedi\",\"vaŋdɛrɛdi\",\"mɔnɔ sɔndi\"],u,[\"so\",\"lu\",\"ma\",\"mɛ\",\"ye\",\"va\",\"ms\"Tpamba\",\"wanja\",\"mbiyɔ mɛndoŋgɔ\",\"Nyɔlɔmbɔŋgɔ\",\"Mɔnɔ ŋgbanja\",\"Nyaŋgwɛ ŋgbanja\",\"kuŋgwɛ\",\"fɛ\",\"njapi\",\"nyukul\",\"M11\",\"ɓulɓusɛ\"],u],u,[[\"BCE\",\"CE\"],u,u],1,[6,0],[\"dd/MM y\",\"d MMM y\",\"d MMMM y\",\"EEEE dd MMMM yU,\",\".}XAF\",\"FCFA\",\"Franc CFA\",{I-|+v5xd)yi!yi:EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAcAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,OAAO,CAAC,CAAC;IACb=aAAa,EAAC,YAAY)9A;@QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,KAAK)9,UAAU,EAAC,WAAW,EAAC,MAAM,EAAC,SAAS,EAAC,KAAK"SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW
OAAO,EAAC,KAAK$O
TKAAK,EAAC,MAAM,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,WAAW,EAAC,MAAM,EAAC,SAAS,EAAC,KAAK,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,UAAUKAAK
$UAAU,EAAC,WAAW,EAAC,YAAY,EAAC,kBAAkBn2UAAU,EAAC,SAASɓ
, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;	$yi\",[[\"פֿאַרמיטאָג\",\"נאָכמיטאָג\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"זונטיק\",\"מאָנטיק\",\"דינסטיק\",\"מיטוואך\",\"דאנערשטיק\",\"פֿרײַטיק\",\"שבת\"],u,u],u,[[\"Mיאַנואַר\",\"פֿעברואַר\",\"מערץ\",\"אַפּריל\",\"מיי\",\"יוני\",\"יולי\",\"אויגוסט]\",\"סעפּטעמבער\",\"אקטאבער\",\"נאוועמבער\",\"דעצעמבער\"],uSיאַנ\",\"פֿעב\",\"מערץ\",\"אַפּר\",\"מיי\",\"יוני\",\"יולי\",\"אויג\",\"סעפּ\",\"אקט\",\"נאוו\",\"דעצ\"],[\"יאַנואַר\",\"פֿעברואַר\",\"מערץ\",\"אַפּריל\",\"מיי\",\"יוני\",\"יולי\",\"אויגוסט\",\"סעפּטעמבער\",\"אקטאבער\",\"נאוועמבער\",\"דעצעמבער\"]],[[\"BCE[\",\"CE\"],u,u],1,[6,0],[\"dd/MM/yy\",\"dטן MMM y\",\"dטן MMMM y\",\"EEEE, dטן MMMM yK\"{1}, {0}\",\"{1} {0}\"u,u,u,{5rtl\", plural];\n"]}Wsx{en!en:*knCj"O
Fk
,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKz
QAAQ	EAAC,QAAQd[
[
[
[O
_k
^KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK_OAAO,EAAC,OAAO0$,QAAQ,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU,EAAC,UAAUO
kneAAe,EAAC,aAAaO
z
tiBAAiBjWAAW,EAAC,aAAa,EAAC,gBAAgBCAAC,EAAC,cAAc
Z
2WAAW
EAAC,WAAW,EAAC,EAAE#<en\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u]
1Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMMa d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'at'yI#,##0.00\",\"#E0\"],\"USD\",\"$\",\"US Dollar\",{},\"ltr\", plural];\n"]}࿋x@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n % 10 === 1 && !(n % 100 === 11 || (n % 100 === 71 || n % 100 === 91)))
        return 1;
    if (n % 10 === 2 && !(n % 100 === 12 || (n % 100 === 72 || n % 100 === 92)))
        return 2;
    if (n % 10 === Math.floor(n % 10) && (n % 10 >= 3 && n % 10 <= 4 || n % 10 === 9) && !(n % 100 >= 10 && n % 100 <= 19 || (n % 100 >= 70 && n % 100 <= 79 || n % 100 >= 90 && n % 100 <= 99)))
        return 3;
    if (!(n === 0) && n % 1000000 === 0)
        return 4;
    return 5;
}
export default ["br", [["am", "gm"], ["A.M.", "G.M."], u], [["A.M.", "G.M."], u, u], [["Su", "L", "Mz", "Mc", "Y", "G", "Sa"], ["Sul", "Lun", "Meu.", "Mer.", "Yaou", "Gwe.", "Sad."], ["Sul", "Lun", "Meurzh", "Mercʼher", "Yaou", "Gwener", "Sadorn"], ["Sul", "Lun", "Meu.", "Mer.", "Yaou", "Gwe.", "Sad."]], u, [["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"], ["Gen.", "Cʼhwe.", "Meur.", "Ebr.", "Mae", "Mezh.", "Goue.", "Eost", "Gwen.", "Here", "Du", "Kzu."], ["Genver", "Cʼhwevrer", "Meurzh", "Ebrel", "Mae", "Mezheven", "Gouere", "Eost", "Gwengolo", "Here", "Du", "Kerzu"]], u, [["a-raok J.K.", "goude J.K."], u, ["a-raok Jezuz-Krist", "goude Jezuz-Krist"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'da' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": ["$A", "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": ["$CA", "$"], "CNY": [u, "¥"], "EGP": [u, "£ E"], "GBP": ["£ RU", "£"], "HKD": ["$ HK", "$"], "ILS": [u, "₪"], "JPY": [u, "¥"], "KRW": [u, "₩"], "LBP": [u, "£L"], "NZD": ["$ ZN", "$"], "PHP": [u, "₱"], "RUR": [u, "р."], "TOP": [u, "$ T"], "TWD": [u, "$"], "USD": ["$ SU", "$"], "VND": [u, "₫"], "XCD": [u, "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=br.js.mapV:ùx&/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    CNY: string[];
    JPY: string[];
    RUB: string[];
} | undefined)[];
export default _default;
t;8fx yBYN:.;
    JPY: string[];
    PHP:.I;
    THB: string[];
    TWD: string[];
    USD: string[];
    XXX: never/#	{xJ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["brx", [["फुं", "बेलासे"], u, u], u, [["र", "स", "मं", "बु", "बि", "सु", "सु"], ["रबि", "सम", "मंगल", "बुध", "बिस्थि", "सुखुर", "सुनि"], ["रबिबार", "समबार", "मंगलबार", "बुधबार", "बिस्थिबार", "सुखुरबार", "सुनिबार"], ["रबि", "सम", "मंगल", "बुध", "बिस्थि", "सुखुर", "सुनि"]], u, [["ज", "फ", "म", "ए", "म", "ज", "ज", "आ", "स", "अ", "न", "ड"], ["जान", "फेब", "मार्च", "एप्रि", "मे", "जुन", "जुल", "आग", "सेप", "अक्ट’", "नवे", "डिसे"], ["जानुवारी", "फेब्रूवारी", "मार्च", "एप्रिल", "मे", "जुन", "जुलाई", "आगष्ट", "सेप्थेम्बर", "अक्ट’बर", "नवेम्बर", "डिसेम्बर"]], u, [["बि.सि.", "ए.दि"], u, u], 0, [0, 0], ["y-MM-dd", "MMM d, y", "MMMM d, y", "y MMMM d, EEEE"], ["a नि h:mm", "a h:mm:ss", "a h:mm:ss z", "a h:mm:ss zzzz"], ["{1}, {0}", u, "{1} नि {0} याव", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤ #,##,##0.00", "#E0"], "INR", "₹", "भारतनि रुपी", { "CNY": ["सिएन¥", "¥"], "JPY": ["JP¥", "¥"], "RUB": ["रूब", "₽"] }, "ltr", plural];
//# sourceMappingURL=brx.js.map#/zBx export default ["	x
{"version":3,"file":"brx.js","sourceRoot":"","sources":["brx.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,KAAK,EAAC,CAAC,CAAC,KAAK,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,UAAU,EAAC,SAAS,CAAC,EAAC,CAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,WAAW,EAAC,gBAAgB,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,gBAAgB,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,eAAe,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,aAAa,EAAC,EAAC,KAAK,EAAC,CAAC,OAAO,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"brx\",[[\"फुं\",\"बेलासे\"],u,u],u,[[\"र\",\"स\",\"मं\",\"बु\",\"बि\",\"सु\",\"सु\"],[\"रबि\",\"सम\",\"मंगल\",\"बुध\",\"बिस्थि\",\"सुखुर\",\"सुनि\"],[\"रबिबार\",\"समबार\",\"मंगलबार\",\"बुधबार\",\"बिस्थिबार\",\"सुखुरबार\",\"सुनिबार\"],[\"रबि\",\"सम\",\"मंगल\",\"बुध\",\"बिस्थि\",\"सुखुर\",\"सुनि\"]],u,[[\"ज\",\"फ\",\"म\",\"ए\",\"म\",\"ज\",\"ज\",\"आ\",\"स\",\"अ\",\"न\",\"ड\"],[\"जान\",\"फेब\",\"मार्च\",\"एप्रि\",\"मे\",\"जुन\",\"जुल\",\"आग\",\"सेप\",\"अक्ट’\",\"नवे\",\"डिसे\"],[\"जानुवारी\",\"फेब्रूवारी\",\"मार्च\",\"एप्रिल\",\"मे\",\"जुन\",\"जुलाई\",\"आगष्ट\",\"सेप्थेम्बर\",\"अक्ट’बर\",\"नवेम्बर\",\"डिसेम्बर\"]],u,[[\"बि.सि.\",\"ए.दि\"],u,u],0,[0,0],[\"y-MM-dd\",\"MMM d, y\",\"MMMM d, y\",\"y MMMM d, EEEE\"],[\"a नि h:mm\",\"a h:mm:ss\",\"a h:mm:ss z\",\"a h:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} नि {0} याव\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤ #,##,##0.00\",\"#E0\"],\"INR\",\"₹\",\"भारतनि रुपी\",{\"CNY\":[\"सिएन¥\",\"¥\"],\"JPY\":[\"JP¥\",\"¥\"],\"RUB\":[\"रूब\",\"₽\"]},\"ltr\", plural];\n"]}[x! 	eAAe,EAAE2d];\n"]}(
0x ez"ez<Ftx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["sr-Cyrl", [["AM", "PM"], u, u], [["пре подне", "по подне"], ["AM", "PM"], u], [["н", "п", "у", "с", "ч", "п", "с"], ["нед", "пон", "уто", "сре", "чет", "пет", "суб"], ["недеља", "понедељак", "уторак", "среда", "четвртак", "петак", "субота"], ["не", "по", "ут", "ср", "че", "пе", "су"]], u, [["ј", "ф", "м", "а", "м", "ј", "ј", "а", "с", "о", "н", "д"], ["јан", "феб", "мар", "апр", "мај", "јун", "јул", "авг", "сеп", "окт", "нов", "дец"], ["јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"]], u, [["п.н.е.", "н.е."], ["п. н. е.", "н. е."], ["пре нове ере", "нове ере"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "RSD", "RSD", "српски динар", { "AUD": [u, "$"], "BAM": ["КМ", "KM"], "BYN": [u, "р."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr-Cyrl.js.mapM\"	nx|3&#bs-Cyrl"gподне"], u, ["пријpслије подне"]], uT*јеља", "понедј7!јWB уh|и", "јули", "аујCd.MM.y.", "d8BAM", "КМ", "Конвертибилна марка", {WCZK": ["Кч", "Kč"], "PLN": ["зл", "zł"], "RSD": ["дин."], "TRY": ["Тл", "₺)bs-Cyrl.js.mapxD{"version":3,"file":"es.js","sourceRoot":"","sources":["es.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4;\nreturn 5;\n}\n\nexport default [\"es\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"D\",\"L\",\"M\",\"X\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],u,[[\"E\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss (zzzz)\"],[\"{1}, {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"EGP\":[],\"ESP\":[\"₧\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"THB\":[\"฿\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}EYIx1
'*sr-Cyrl!sr-Cyrl:]=	EAAE,EAAEjK$?EAAE1GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAEGAAG,GAAG,KAAK,EAAE,CAAC;QACnF8?,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE*EAAE,IAAI,CAAC,IAAI,CAAC,GAAG#GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,IA2EAAE,IAAI,CAAC,IAAI,CAAC,GAAG#<GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACrN("SAAS,EAAC,CAAC,CAAC,IAAI,EAAC,IAAIq.,WAAW,EAAC,UAAU,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI/APOAAO,EAAC,UAAU,EAAC,OAAOP`
`
`
V`
,QAAQ,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU $JQAAQ,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,OAAO,CAAC,EAAC,CAAC,cAAc,EAAC,UAAU $$SAAS,EAAC,UAAU,EAAC,YAAY,EAAC,kBAAkB,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAASP
?
d(

`
cAAc,E0	@IAAIz.i-(-(C-_f5', 10) || 0;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Mathb.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))\n    return 3%sr-Cyrl\",[[\"AM\",\"PM\"],u,u],[[\"пре подне\",\"по подне\"],[\"AM\",\"PM\"],u],[[\"н\",\"п\",\"у\",\"с\",\"ч\",\"п\",\"с\"],[\"нед\",\"пон\",\"уто\",\"сре\",\"чет\",\"пет\",\"суб\"],[\"недеља\",\"пондељак\",\"уторак\",\"среда\",\"четвртак\",\"петак\",\"субота\"],[\"не\",\"по\",\"ут\",\"ср\",\"че\",\"пе\",\"су\"]],u,[[\"ј\",\"ф\",\"м\",\"а\",\"м\",\"ј\",\"ј\",\"а\",\"с\",\"о\",\"н\",\"д\"],[\"јан\",\"феб\",\"мар\",\"апр\",\"мај\",\"јун\",\"јул\",\"авг\",\"сеп\",\"окт\",\"нов\",\"дец\"],[\"јануар\",\"фебруар\",\"март\",\"април\",\"мај\",\"јун\",\"јул\",\"август\",\"септембар\",\"октобар\",\"новембар\",\"децембар\"]],u,[[\"п.н.е.\",\"н.е.\"],[\"п. н. е.\",\"н. е.\"],[\"пре нове ере\",\"нове ере\"]],1,[6,0],[\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.\",\"EEEE, d. MMIMM y.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}Vu 'RSD\",\"RSD\",\"српски динар;AM\":[\"КМ\",\"KM\"],\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ&TWD\":[[#)VND\":[u,\"₫\"]},\"ltr\", plural];\n"]},Ax<*bs&bs?	CAAC;IAEd=
SAASaAAa,EAAC,eAAeP_
YAAY,E
FEMAAM,EAAC,MAAMgBAAgB.N	
I	aAAa,EAAC,mBAAm.IAAI,EAAC,qBAAqB
;p
;p
;p
MAAM,C!
;
*
o;\n$	bs-Cyrl\"^Lподне\"],u,[\"прије подне\",\"послије подне\"]],u^.јеља\",\"понедј@#јbF"$уи\",\"јули\",\"ау*јC#d.MM.y.\",\"dd. MMMM y.\",\"EEEE, d2BAM\",\"КМ\",\"Конвертибилна марка\",{\"BAM\":[\"КМ\",\"KM\"],\"CZK\":[\"Кч\",\"Kč\"],\"PLN\":[\"зл\8",\"zł\"],\"RSD\":[\"дин.\"],\"TRY\":[\"Тл\",\"₺},\"ltr\", plural];\n"]}^yJx	*7hr!hrDgIAAIGP_UAAU,EAAC,aAAa,E
F7UAAU,EAAC,aAAa,E
F^^^g
MAAMa302UAAU,EAAC,SAAS,ESAAS,EAAC,QAAQ,EAAC,QAAQWAAW,EAAC,WAAW^^^g
MAAMa302UAAU,EAAC,SAAS,ESAAS,EAAC,QAAQ,ESAAS	CAAC,SAAS
$SAAS,CAAC,EAAC,CAAC,cAAc,EAAC,gBAAgBN	
I	YAAY,EAAC,WAAWDiBAAiB0	
aAAa>	
	#IAAI,EAAC,eAAe,E
J
(
9
-

x
2`
sEAAE,EAAC,KAAK,EAAC,EAAEhr\",[[\"AM\",\"PM\"],u,u],u,[[\"N\",\"P\",\"U\",\"S\",\"Č\",\"P\",\"S\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"],[\"nedjelja\",\"ponedjeljak\",\"utorak\",\"srijeda\",\"četvrtak\",\"petak\",\"subota\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"]],[[\"n\",\"p\",\"u\",\"s\",\"č\",\"p\",\"s\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"],[\"nedjelja\",\"ponedjeljak\",\"utorak\",\"srijeda\",\"četvrtak\",\"petak\",\"subota\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"]],[[\"1.\",\"2.\",\"3.\",\"4.\",\"5.\",\"6.\",\"7.\",\"8.\",\"9.\",\"10.\",\"11.\",\"12.\"],[\"sij\",\"velj\",\"ožu\",\"tra\",\"svi\",\"lip\",\"srp\",\"kol\",\"ruj\",\"lis\",\"stu\",\"pro\"],[\"siječnja\",\"veljače\",\"ožujka\",\"travnja\",\"svibnja\",\"lipnja\",\"srpnja\",\"kolovoza\",\"rujna\",\"listopada\",\"studenoga\",\"prosinca\"]],[[\"1.\",\"2.\",\"3.\",\"4.\",\"5.\",\"6.\",\"7.\",\"8.\",\"9.\",\"10.\",\"11.\",\"12.\"],[\"sij\",\"velj\",\"ožu\",\"tra\",\"svi\",\"lip\",\"srp\",\"kol\",\"ruj\",\"lis\",\"stu\",\"pro\"],[\"siječanj\",\"veljača\",\"ožujak\",\"travanj\",\"svibanj\",\"lipanj\",\"srpanj\",\"kolovoz\",\"rujan\",\"listopad\",\"studeni\",\"prosinac\"]],[[\"pr.n.e.\",\"AD\"],[\"pr. Kr.\",\"po. Kr.\"],[\"prBije Krista\",\"poslije Krista\"]],1,[6,0],[\"dd. MM. y.\",\"d. MMM]((zzzz)\"],[\"{1} {0}\",u,\"{1} 'u' {0}\"%−E  HRK\",\"kn\",\"hrvatska kuna<RL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"EUR\":[u,\"€\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\K"],\"HRK\":[\"kn\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥MXN\":[u,\"$,0RUR\":[u,\"р.\"],\"TWD\":[u,\"NT$\"],\"USD\":[u@,\"XCD\":[u,\"$\"],\"XPF\":[],\"XXX\":[]},\"ltr\", plural];\n"]}eL3x1*rwk!rwkD"CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACPn=
OAAO,EAAC,WAAWN	
P_	
#	EAAC,QAAQF
8SAAS,EAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,ESAAS(iBAAiB,EAAC,iBAAiBN	
I	
gBAAgWAAW`

sBAAsB
o(oV2;\n\nif (n === 1)\n    return 1%rwk\",[[\"utuko\",\"kyiukonyi\"],u,u],u,[[\"J\",\"J\",\"J\",\"J\",\"A\",\"I\",\"J\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"],[\"Jumapilyi\",\"Jumatatuu\",\"Jumanne\",\"Jumatanu\",\"Alhamisi\",\"Ijumaa\",\"Jumamosi\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Machi\",\"Aprilyi\",\"Mei\",\"Junyi\",\"Julyai\",\"Agusti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Desemba\"]],u,[[\"KK\",\"BK\"],u,[\"Kablba ya Kristu\",\"Baada ya Kristu\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y<U.\",\",l_\",\"#E0\"],\"TZS\",\"TSh\",\"Shilingi ya Tanzania\",{\"JPY\":[\"JP¥\",\"¥\"],\"TZS\":[\"TSh},\"ltr\", plural];\n"]}o"exV*to!toD	CAAC;IAEd)IAAI8YAAY,EAAC,QAAQ(;p
7MAAMa,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,cAAc,EAAC,SAAS(MAAMaMAAM,EAAC,MAAM,EAAC,IAAIaMAAM,EAAC,KAAK,EAAC,MAAMa
.SAAS,EAAC,QAAQ,EAAC,UAAU,EAAC,IAAI,EAAC,MAAM,E
UAAU,EAAC,QAAQ,EAAC,QAAQ(
cAAcN	
I	


	aAAa,EAAC,gBAAgB$%N	nIAAI	7IAAI,EAAC,mBAAmB
MAAM`
(o(MAAM`
(
o;\n$to\",[[\"AM\",\"PM\"],u,[\"hengihengi\",\"efiafi\"]],[[\"AM\",\"PM\"],u,[\"HH\",\"EA\"]],[[\"S\",\"M\",\"T\",\"P\",\"T\",\"F\",\"T\"],[\"Sāp\",\"Mōn\",\"Tūs\",\"Pul\",\"Tuʻa\",\"Fal\",\"Tok\"],[\"Sāpate\",\"Mōnite\",\"Tūsite\",\"Pulelulu\",\"Tuʻapulelulu\",\"Falaite\",\"Tokonaki\"],[\"Sāp\",\"Mōn\",\"Tūs\",\"Pul\",\"Tuʻa\",\"Fal\",\"Tok\"]],u,[[\"S\",\"F\",\"M\",\"E\",\"M\",\"S\",\"S\",\"A\",\"S\",\"O\",\"N\",\"T\"],[\"Sān\",\"Fēp\",\"Maʻa\",\"ʻEpe\",\"Mē\",\"Sun\",\"Siu\",\"ʻAok\",\"Sep\",\"ʻOka\",\"Nōv\",\"Tīs\"],[\"Sānuali\",\"Fēpueli\",\"Maʻasi\",\"ʻEpeleli\",\"Mē\",\"Sune\",\"Siulai\",\"ʻAokosi\",\"Sepitema\",\"ʻOkatopa\",\"Nōvema\",\"Tīsema\"]],u,[[\"KM\",\"TS\"],u,[\"ki muʻa\",\"taʻu ʻo Sīsū\"]],1,[6,0],[\"d/M/fyy\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aq\"{1}, {0}\",u,u],[\".\",\",:TF&¤ #,##0.00\",\"#E0\"],\"TOP\",\"T$\",\"Paʻanga fakatonga\",{\"AUD\":[\"AUD$\",\"AU$\"],\"FJD\":[u,\"F$\"],\"JPY\":[\"JP¥\",A\"¥\"],\"NZD\":[\"NZD$\",\"NZ$\"],\"SBD\":[u,\"S$\"],\"TOP\":[\"},\"ltr\", plural];\n"]}Oeaux*$A	CAAC;IAEd)
7P_cAAc,EAAC,iBAAiB,EaF;A^^p

CAAC,MAAM,E
IAAI,E,aAAa,EAAC,UAAU,EAAC,cAAc,EAAC,WAAW,EAAC,YAAYMAAM=
gBAAgB,EAAC,eAAeN	
I	
gBAAg.IAAI,EAAC,iBAAiB
o(o

(
GAAG`P*
MAAM,C!
@MAAMo
B3dMAAM`VVV
;\n$yrl\",[[\"AM\",\"PM\"],u,u],u,[[\"M\",\"M\",\"M\",\"M\",\"S\",\"Y\",\"S\"],[\"mit\",\"mur\",\"mmk\",\"mms\",\"sup\",\"yuk\",\"sau\"],[\"mituú\",\"murakipí\",\"murakí-mukũi\",\"murakí-musapíri\",\"supapá\",\"yukuakú\",\"saurú\"],[\"mit\",\"mur\",\"mmk\",\"mms\",\"sup\",\"yuk\",\"sau\"]],u,[[\"Y\",\"M\",\"M\",\"I\",\"P\",\"P\",\"P\",\"P\",\"P\",\"Y\",\"Y\",\"Y\"],[\"ye\",\"mk\",\"ms\",\"id\",\"pu\",\"py\",\"pm\",\"ps\",\"pi\",\"yp\",\"yy\",\"ym\"],[\"yepé\",\"mukũi\",\"musapíri\",\"irũdí\",\"pú\",\"pú-yepé\",\"pú-mukũi\",\"pú-musapíri\",\"pú-irũdí\",\"yepé-putimaã\",\"yepé-yepé\",\"yepé-mukũi\"]],u,[[\"K.s.\",\"K.a.\"],u,[\"Kiristu senũdé\",\"Kiristu ariré\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y<¤ #,##0.00\",\"#E0\"],\"BRL\",\"R$\",\"Reau Brasiuwara\",{\"AUD\":[\"AU$\",\"$\"],\"BOB\":[\"BUB\",\"Bs\"],\"BYN\":[u,\"p.\"],\"COP\":[\"$\",\"COP\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"Esc.\"],\"RON\":[u,\"L\"],\"SCR\":[\"SCRu\"],"\"SYP\":[u,\"S£\"],\"THB\":[\"฿1xES\":[\"Bs.S\",\"VES\"],\"XAF\":[\"FCF\"],\"XOF\":[\"CFA\"],\"XPF\":[\"CFP\"],\"ZMW\":[u,\"Zk\"]},\"ltr\", plural];\n"]}xg7)cs!cs:!
CAAC;IAEjGKAAK,CAAC;QAClB$

=


=
KAAK,CAAC;QACpDCAAC,CAAC,KAAK,CAAC,CAAC;QACVdQMAAM,EAAC,MAAM)P



_





A
/Up#l
#MAAM	A
/Up#l
MAAM,EAAC,QAAQ#MAAMm

(CMAAM,CAAC,EAAC,CAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,uBAAuB,EAAC,kBAAk
>

BWAAW,EAAC,gBAAgB,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,cAAc$EA#6_cAAc,E!K
77rsK
7irF77r;\n\nif (i === 1 && v === 0)\n    return 1;\nif (i === Math.floor(i) && (i >= 2 && i <= 4) && v === 0)\n    return 3;\nif (!(v === 0))\n    return 4t%cs\",[[\"dop.\",\"odp.Ú"\",\"po\",\"út\",\"st\",\"čt\",\"pá\",\"so\"],[\"neděle\",\"pondělí\",\"úterý\",\"středa\",\"čtvrtek\",\"pátek\",\"sobota\"],[\"ne\",\"po\",\"út\",\"st\",\"čt\",\"pá\",\"so\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"led\",\"úno\",\"bře\",\"dub\",\"kvě\",\"čvn\",\"čvc\",\"srp\",\"zář\",\"říj\",\"lis\",\"pro\"],[\"ledna\",\"února\",\"března\",\"dubna\",\"května\",\"června\",\"července\",\"srpna\",\"září\",\"října\",\"listopadu\",\"prosince\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"led\",\"úno\",\"bře\",\"dub\",\"kvě\",\"čvn\",\"čvc\",\"srp\",\"zář\",\"říj\",\"lis\",\"pro\"],[\"leden\",\"únor\",\"březen\",\"duben\",\"květen\",\"červen\",\"červenec\",\"srpen\",\"září\",\"říjen\",\"listopad\",\"prosinec\"]],[[\"př.n.l.\",\"n.l.\"],[\"př. n. l.\",\"n. l.\"],[\"před naším letopočtem\",\"našeho letopočtu\"]],1,[6,0],[\"dd.MM.yy\",\"d. M. y\",\"d. MMMM y\",\"EEEE d. MMMM y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\`CZK\",\"Kč\",\"česká koruna\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"CSK\":[\"Kčs\"],\"CZK\":[\"Kč\"],\"ILS\":[u,\%\"JP¥\",\"¥ON\":[u,\"L0!\"NT$\"],\"USD\":[\"US$\"fEU\":[\"ECU\"$۸TP^xjgo!jgo<UAAU1_
_VIAAInaAAa$$QAAQa
_AIAAI,Ej"aAAa,EAAC,aAAa,EAAC,cAAc,EAAC,iBAAiB,EAAC,aAAa,EAAC,mBAAmB,EAAC,cAAc,EAAC,iBAAiB,EAAC,mBAAmB,EAAC,cAAc,EAAC,iBAAiB,EAAC,gBAAgB,

_KAAK,EAAC,IAAIa6CAA6C,EAAC,6CAA6_7iBAAiB,CAAC,E1#YAAYMAAM,EAAC,OAAO,Ep,
[jgo\",[[\"mbaꞌmbaꞌ\",\"ŋka mbɔ́t nji\"],u,u],u,[[\"Sɔ́\",\"Mɔ́\",\"ÁM\",\"Wɛ́\",\"Tɔ́\",\"Fɛ\",\"Sá\"],[\"Sɔ́ndi\",\"Mɔ́ndi\",\"Ápta Mɔ́ndi\",\"Wɛ́nɛsɛdɛ\",\"Tɔ́sɛdɛ\",\"Fɛlâyɛdɛ\",\"Sásidɛ\"],u,u],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"Nduŋmbi Saŋ\",\"Pɛsaŋ Pɛ́pá\",\"Pɛsaŋ Pɛ́tát\",\"Pɛsaŋ Pɛ́nɛ́kwa\",\"Pɛsaŋ Pataa\",\"Pɛsaŋ Pɛ́nɛ́ntúkú\",\"Pɛsaŋ Saambá\",\"Pɛsaŋ Pɛ́nɛ́fɔm\",\"Pɛsaŋ Pɛ́nɛ́pfúꞋú\",\"Pɛsaŋ Nɛgɛ́m\",\"Pɛsaŋ Ntsɔ̌pmɔ́\",\"Pɛsaŋ Ntsɔ̌ppá\"],u],u,[[\"BCE\",\"CE\"],u,[\"tsɛttsɛt mɛŋguꞌ mi ɛ́ lɛɛnɛ Kɛlísɛtɔ gɔ ńɔ́\",\"tsɛttsɛt mɛŋguꞌ mi ɛ́ fúnɛ Kɛlísɛtɔ tɔ́ mɔ́D\"]],1,[6,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"EEEE, y MMMM dd_U,\",\".c3¤ #,##0.00\",\"#E0\"],\"XAF\",\"FCFA\",\"FɛlâŋZ -RGGox}kln!kln<<KAAK,EAAC,OAAOaQAAQ,EAAC,YAAYKAAK,EAAC,OAAOaK
2EAAC,WAAW,EAAC,QAAQ,EAAC,MAAM`MAAM)o<JQAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,SAASmBAAmB,EAAC,sBAAsB_7mBAAmqBAAqB,Ep,
[
`"kln\",[[\"krn\",\"koosk\"],u,[\"karoon\",\"kooskoliny\"]],[[\"krn\",\"koosk\"],u,u],[[\"T\",\"T\",\"O\",\"S\",\"A\",\"M\",\"L\"],[\"Kts\",\"Kot\",\"Koo\",\"Kos\",\"Koa\",\"Kom\",\"Kol\"],[\"Kotisap\",\"Kotaai\",\"Koaeng’\",\"Kosomok\",\"Koang’wan\",\"Komuut\",\"Kolo\"],[\"Kts\",\"Kot\",\"Koo\",\"Kos\",\"Koa\",\"Kom\",\"Kol\"]],u,[[\"M\",\"N\",\"T\",\"I\",\"M\",\"P\",\"N\",\"R\",\"B\",\"E\",\"K\",\"K\"],[\"Mul\",\"Ngat\",\"Taa\",\"Iwo\",\"Mam\",\"Paa\",\"Nge\",\"Roo\",\"Bur\",\"Epe\",\"Kpt\",\"Kpa\"],[\"Mulgul\",\"Ng’atyaato\",\"Kiptaamo\",\"Iwootkuut\",\"Mamuut\",\"Paagi\",\"Ng’eiyeet\",\"Rooptui\",\"Bureet\",\"Epeeso\",\"Kipsuunde ne taai\",\"Kipsuunde nebo aeng’\"]],u,[[\"AM\",\"KO\"],u,[\"Amait kesich Jesu\",\"Kokakesich Jesu\"]],0,[6,0],[*:¤#,##0.00\",\"#E0\"],\"KES\",\"Ksh\",\"Silingitab ya KenyY!KES\":[\"Ks4m]3Y{xcmgo!mgo<n(
_EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,Ej"



QAAQa}A_QEAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,Ej"K
YAAY,EAAC,gBAAgB,EAAC,aAAa,EAAC,UAAU,EAAC,eAAe,EAAC,eAAe,EAAC,aAAa,EAAC,UAAU,EAAC,aAAa,EAAC,SAAS,EAAC,cAAc,CAAC,EAAC,CAAC,cAAc,oEAAC,YAAY,EAAC,gBAAgB,EAAC,aAAa,EAAC,UAAU,EAAC,eAAe,EAAC,eAAe,EAAC,aAAa,EAAC,UAAU,EAAC,aAAa,EAAC,SAAS,EAAC,cAAc_KAAK,EAAC,IAAIa
_7iBAAiB,CAAC,E1#YAAYMAAM,EAAC,OAAO,Ep,
[mgo\",[[\"AM\",\"PM\"],u,u],u,[[\"A1\",\"A2\",\"A3\",\"A4\",\"A5\",\"A6\",\"A7\"],[\"Aneg 1\",\"Aneg 2\",\"Aneg 3\",\"Aneg 4\",\"Aneg 5\",\"Aneg 6\",\"Aneg 7\"],u,[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\"]],u,[[\"M1\",\"A2\",\"M3\",\"N4\",\"F5\",\"I6\",\"A7\",\"I8\",\"K9\",\"10\",\"11\",\"12\"],[\"mbegtug\",\"imeg àbùbì\",\"imeg mbəŋchubi\",\"iməg ngwə̀t\",\"iməg fog\",\"iməg ichiibɔd\",\"iməg àdùmbə̀ŋ\",\"iməg ichika\",\"iməg kud\",\"iməg tèsiʼe\",\"iməg zò\",\"iməg krizmed\"],[\"iməg mbegtug\",\"imeg àbùbì\",\"imeg mbəŋchubi\",\"iməg ngwə̀t\",\"iməg fog\",\"iməg ichiibɔd\",\"iməg àdùmbə̀ŋ\",\"iməg ichika\",\"iməg kud\",\"iməg tèsiʼe\",\"iməg zò\",\"iməg krizmed\"]],u,[[\"BCE\",\"CE\"],u,u],1,[6,0],[6\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"EEEE, y MMMM dd_1¤ #,##0.00\",\"#E0\"],\"XAF\",\"FCFA\",\"shirèZ -[B0&xsbp!sbp<<WAAW>K
>
4WAAWLIAAI,Ej"AAcAAc.
$iBAAiB,EAAC,SAAS,EAAC,WAAW,EAAC,UAAUgBAAgB@VoBAAoB,EAAC,qBAAqB_toBAAoB,Ep,
[
`"1sbp\",[[\"Lwamilawu\",\"Pashamihe\"],u,u],u,[[\"M+Mul75Mulungu\",\"Jumatatu\",\"Jumanne\",\"Jumatano\",\"AlaK	%Mul3],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"Mup\",\"Mwi\",\"Msh\",\"Mun\",\"Mag\",\"Muj\",\"Msp\",\"Mpg\",\"Mye\",\"Mok\",\"Mus\",\"Muh\"],[\"Mupalangulwa\",\"Mwitope\",\"Mushende\",\"Munyi\",\"Mushende Magali\",\"Mujimbi\",\"Mushipepo\",\"Mupuguto\",\"Munyense\",\"Mokhu\",\"Musongandembwe\",\"Muhaano\"]],u,[[\"AK\",\"PK\"],u,[\"Ashanali !uKilisito\",\"Pamwandi ya Kilisto*Ihela ya TansaniyY`v==x/teo!teo<WAAW,EAAC,QAAQa
_aAAa,EYAAY,EAAC,UAAU,EAAC,YAAY`x:
MAAM..QAAQ,EAAC,gBAAgB,EAAC,OAAO,EAAC,QAAQ,EAAC,aAAaMAAM_7kBAAkB,EAAC,kBAAkB_tuBAAuB,Ep,
[
teo\",[[\"Taparachu\",\"EbongB\",\"A\",\"U\",\"U\",\"K\",\"S\"],[\"Jum\",\"Bar\",\"Aar\",\"Uni\",\"Ung\",\"Kan\",\"Sab\"],[\"Nakaejuma\",\"Nakaebarasa\",\"Nakaare\",\"Nakauni\",\"Nakaung’on\",\"Nakakany\",\"Nakasabiti\"],[\"Jum\",\"Bar\",\"Aar\",\"Uni\",\"Ung\",\"Kan\",\"Sab\"]],u,[[\"R\",\"M\",\"K\",\"D\",\"M\",\"M\",\"J\",\"P\",\"S\",\"T\",\"L\",\"P\"],[\"Rar\",\"Muk\",\"Kwa\",\"Dun\",\"Mar\",\"Mod\",\"Jol\",\"Ped\",\"Sok\",\"Tib\",\"Lab\",\"Poo\"],[\"Orara\",\"Omuk\",\"Okwamg’\",\"Odung’el\",\"Omaruk\",\"Omodok’king’olD\",\"Ojola\",\"Opedel\",\"Osokosokoma\",\"Otibar\",\"Olabor\",\"Opoo
&%Christo\",\"Baada ya Christo\"]],1,[0%@¤#,##0.00\",\"#E0\"],\"UGX\",\"USh\",\"Ango’otol lok’ UgandY!
UGX\":[\"U5o+%?x>&s"s9,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb=[x,
#


-
MAAM,CAAC,EAAC,C1""QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,OAAOq8
-
MAAMB,
#


-
MAAM,CAAC,EAAC,C1""QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,OAAOq.?
Z@U<eAAe,EAAC,cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,eAAe,EAAC,cAAc,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,eAAe,EAAC,uBAAuB,EAAC,wBAAwB,Z@U<S#SAAS,EAAC,OAAO,EAAC,WAAWMUAAU)cAAc,EAAC,eAAeALL
SWAAW,EAAC,iBAAiB.NcAAcKAAK&WAAW1
GAAG,EAAC,sBAAsB,E@mmif (n === 1)\n    return 1;	$so\",[[\"h\",\"d\"],[\"GH\",\"GD\"],u],[[\"AM\",\"GD\"],u,[\"GH\",\"GD\"]],[[\"A\",\"I\",\"T\",\"A\",\"Kh\",\"J\",\"S\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"],[\"Axad\",\"Isniin\",\"Talaado\",\"Arbaco\",\"Khamiis\",\"Jimco\",\"Sabti\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"]],[[\"A\",\"I\",\"T\",\"A\",\"Kh\",\"J\",\"S\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"],[\"Axad\",\"Isniin\",\"Talaado\",\"Arbaco\",\"Khamiis\",\"Jimco\",\"Sabti\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbaco\",\"Khms\",\"Jmc\",\"Sbti\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"L\",\"O\",\"S\",\"O\",
D\"],[\"Jan\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Lul\",\"Ogs\",\"Seb\",\"Okt\",\"Nof\",\"Dis\"],[\"Bisha Koobaad\",\"Bisha Labaad\",\"Bisha Saddexaad\",\"Bisha Afraad\",\"Bisha Shanaad\",\"Bisha Lixaad\",\"Bisha Todobaad\",\"Bisha Sideedaad\",\"Bisha Sagaalaad\",\"Bisha Tobnaad\",\"Bisha Kow iyo Tobnaad\",\"Bisha Laba iyo Tobnaad\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",	\"L\",\"O
D\"],[\"Jan\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Lul\",\"Ogs\",\"Seb\",\"Okt\",\"Nof\",\"Dis\"],[\"Jannaayo\",\"Febraayo\",\"Maarso\",\"Abriil\",\"May\",\"Juun\",\"Luuliyo\",\"Ogost\",\"Sebtembar\",\"Oktoobar\",\"Nofembar\",\"Desembar\"]],[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Ciise Hortii\",\"Ciise Dabadii\"]],1,[6,0],[\"dd/MM/yy\",\"dd-MMM-y\",\"MMMM d, y\",\"EEEE, MMMM d, yST 'ee'PMaL(O#,##0.00\",\"#E0\"],\"SOS\",\"S\",\"Shilingka Soomaaliya\",{\"BBD\":[\"DBB\",\"!
SOS\":[\"S3x	w/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["bs-Latn", [["prijepodne", "popodne"], ["AM", "PM"], ["prijepodne", "popodne"]], u, [["N", "P", "U", "S", "Č", "P", "S"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"]], [["n", "p", "u", "s", "č", "p", "s"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"]], [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], ["januar", "februar", "mart", "april", "maj", "juni", "juli", "august", "septembar", "oktobar", "novembar", "decembar"]], u, [["p.n.e.", "n. e."], ["p. n. e.", "n. e."], ["prije nove ere", "nove ere"]], 1, [6, 0], ["d. M. y.", "d. MMM y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'u' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "BAM", "KM", "Bosanskohercegovačka konvertibilna marka", { "AUD": [u, "$"], "BAM": ["KM"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "GBP": [u, "£"], "HKD": [u, "$"], "HRK": ["kn"], "ILS": [u, "₪"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RSD": ["din."], "THB": ["฿"], "TWD": ["NT$"], "USD": [u, "$"], "XCD": [u, "$"], "XPF": [] }, "ltr", plural];
//# sourceMappingURL=bs-Latn.js.mapqx~	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["bs", [["prijepodne", "popodne"], ["AM", "PM"], ["prijepodne", "popodne"]], u, [["N", "P", "U", "S", "Č", "P", "S"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"]], [["n", "p", "u", "s", "č", "p", "s"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"]], [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], ["januar", "februar", "mart", "april", "maj", "juni", "juli", "august", "septembar", "oktobar", "novembar", "decembar"]], u, [["p.n.e.", "n. e."], ["p. n. e.", "n. e."], ["prije nove ere", "nove ere"]], 1, [6, 0], ["d. M. y.", "d. MMM y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'u' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "BAM", "KM", "Bosanskohercegovačka konvertibilna marka", { "AUD": [u, "$"], "BAM": ["KM"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "GBP": [u, "£"], "HKD": [u, "$"], "HRK": ["kn"], "ILS": [u, "₪"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RSD": ["din."], "THB": ["฿"], "TWD": ["NT$"], "USD": [u, "$"], "XCD": [u, "$"], "XPF": [] }, "ltr", plural];
//# sourceMappingURL=bs.js.map ZxH{"version":3,"file":"fr.js","sourceRoot":"","sources":["fr.ts"],"names":[],"mappings":"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AAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4;\nreturn 5;\n}\n\nexport default [\"fr\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"janv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}rzExc30bs!bs:]=	EAAE,EAAEjK$	GAAG,EAAE
GAAG,GAAG,KAAK,EAAE	GAAG,EAAE
GAAG,GAAG,KAAK,EAAE,CAAC;QACn	#GAAG,EAAE,KAAK,IAAI0	GAAG,EAAE"GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG#7,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAEGAAG,EAAE,KAAK,IAAI0	GAAG,EAAE"GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG#B,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACrNQYAAY,EAAC,SAAS9
CAAC,YAAY,EAAC,SAAS$A 
,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKCAAC,UAAU,EAAC,aAAa,EAAC,QAAQ,EOAAO/
6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKA 
,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKCAAC,UAAU,EAAC,aAAa,EAAC,QAAQ,EOAAO/
6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK
^KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK	CAAC,QAAQ8
QAAQLQAAQ,EAAC,OAAOCAAC,EAAC,CAAC,gBAAgB.@
$UAAU,EAAC,WAAW,EAAC,YAAY,EAAC,kBAAkBLCAAC0IAAI,EAAC,0CAA0C,EQ@
O(O(((((
((((y
#PKEAAEf'.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))\n    return 3;\nreturn 5;\n}\bs\",[[\"prijepodne\",\"popodne\"],[\"AM\",\"PM\"],[\"prijepodne\",\"popodne\"]],u,[[\"N\",\"P\",\"U\",\"S\",\"Č\",\"P\",\"S\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"],[\"nedjelja\",\"ponedjeljak\",\"utorak\",\"srijeda\",\"četvrtak\",\"petak\",\"subota\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"]],[[\"n\",\"p\",\"u\",\"s\",\"č\",\"p\",\"s\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"],[\"nedjelja\",\"ponedjeljak\",\"utorak\",\"srijeda\",\"četvrtak\",\"petak\",\"subota\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"]],[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"maj\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"],[\"januar\",\"februar\",\"mart\",\"april\",\"maj\",\"juni\",\"juli\",\"august\",\"septembar\",\"oktobar\",\"novembar\",\"decembar\"]],u,[[\"p.n.e.\",\"n. e.\"],[\"p. n. e.\",\"n. e.\"],[\"prije nove ere\",\"nove ere\"]],1,[6,0],[\"d. M. y.\",\"d. MMM y%.\",\"d. MMMM y.\",\"EEEE, d. MMMM y.Ku,\"{1} 'u' {0}\",u],[\",\",\".-mBAM\",\"KM\",\"Bosanskohercegovačka konvertibilna marka\",{\"AUD\":[u,\"$\"],\"BAM\":[\"KM\"],\"BRL\":[u,\"R0CAD\":[uGBP\":[uP?HRK\":[\"kn\"],\"ILS\":[u,\"₪\"],\"MXN\":[u,\"$\"],\"NZD\":[uLaSD\":[\"din.\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[u,\"$\"],\"XCD\":[u,\"$\"],\"XPF\":[C?dqxF3%ro!ro:!
CAAC;IAEjG.,(GAAG,GAAG,KAAK,IAAI0@GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7R@WUAAUo+
KAAK,EAAC,QAAQ,EAAC,SAAS,CAAC6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK$(W2,UAAU,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS,EAAC,KAAK,QAAQ,EAAC,YAAY,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW$OAAO,EAAC,OAAO!ocAAc[gBAAgBBUAAU?@
YA#UKAAK,EAAC,cAAc,EQhO(((((((((((((O
((;\n\nif (i === 1 && v === 0)\n    return 1;\nif (!(v === 0) || (n === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 19)))\n    return 3%ro\",[[\"a.m.\",\"p.m.<um.\",\"lun.\",\"mar.\",\"mie.\",\"joi\",\"vin.\",\"sâm.\"],[\"duminică\",\"luni\",\"marți\",\"miercuri\",\"joi\",\"vineri\"T,\"sâmbătă\"],[\"du.\",\"lu.\",\"ma.\",\"mi.\",\"joi\",\"vi.\",\"sâ.\"]],u,[[\"II\",\"I%Bian.\",\"feb.\",\"mar.\",\"apr.\",\"mai\",\"iun.\",\"iul.\",\"aug.l"ec.\"],[\"ianuarie\",\"februarie\",\"martie\",\"aprilie\",\"mai\",\"iunie\",\"iulie\",\"august\",\"septembrie\",\"octombrie\",\"noiembrie\",\"decembrie\"]],u,[[\"î.Hr.\",\"d.Hr.\"],u,[\"înainte de Hristos\",\"după Hristos\"]],1,[6,0],[\"dd.MM.y\",\"d ,M, {0}\",u,u,u],[\",\",\".-ARON\",\"RON\",\"leu românesc\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R0CAD\":[uEUR\":[u,\"€\"],\"GBP\":[uP!LS\":[u,\"₪\"],\"INR\":[u,\"₹-RW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[uL+u,\"$\"],\"VND\":[u,\"₫\"],\"XCD\":[u,\"$QDx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["ca-AD", [["a. m.", "p. m."], u, u], u, [["dg", "dl", "dt", "dc", "dj", "dv", "ds"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."], ["diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."]], u, [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["de gen.", "de febr.", "de març", "d’abr.", "de maig", "de juny", "de jul.", "d’ag.", "de set.", "d’oct.", "de nov.", "de des."], ["de gener", "de febrer", "de març", "d’abril", "de maig", "de juny", "de juliol", "d’agost", "de setembre", "d’octubre", "de novembre", "de desembre"]], [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des."], ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"]], [["aC", "dC"], u, ["abans de Crist", "després de Crist"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM 'de' y", "EEEE, d MMMM 'de' y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1} {0}", "{1}, {0}", "{1}, 'a' 'les' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": ["AU$", "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "MXN": [u, "$"], "PHP": [u, "₱"], "THB": ["฿"], "USD": [u, "$"], "VEF": [u, "Bs F"], "XCD": [u, "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ca-AD.js.map"A_x*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["ca-ES-valencia", [["a. m.", "p. m."], u, u], u, [["dg", "dl", "dt", "dc", "dj", "dv", "ds"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."], ["diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."]], u, [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["de gen.", "de febr.", "de març", "d’abr.", "de maig", "de juny", "de jul.", "d’ag.", "de set.", "d’oct.", "de nov.", "de des."], ["de gener", "de febrer", "de març", "d’abril", "de maig", "de juny", "de juliol", "d’agost", "de setembre", "d’octubre", "de novembre", "de desembre"]], [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des."], ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"]], [["aC", "dC"], u, ["abans de Crist", "després de Crist"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM 'de' y", "EEEE, d MMMM 'de' y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1} {0}", "{1}, {0}", "{1}, 'a' 'les' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": ["AU$", "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "MXN": [u, "$"], "PHP": [u, "₱"], "THB": ["฿"], "USD": [u, "$"], "VEF": [u, "Bs F"], "XCD": [u, "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ca-ES-valencia.js.mapHex&/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["ca-FR", [["a. m.", "p. m."], u, u], u, [["dg", "dl", "dt", "dc", "dj", "dv", "ds"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."], ["diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."]], u, [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["de gen.", "de febr.", "de març", "d’abr.", "de maig", "de juny", "de jul.", "d’ag.", "de set.", "d’oct.", "de nov.", "de des."], ["de gener", "de febrer", "de març", "d’abril", "de maig", "de juny", "de juliol", "d’agost", "de setembre", "d’octubre", "de novembre", "de desembre"]], [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des."], ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"]], [["aC", "dC"], u, ["abans de Crist", "després de Crist"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM 'de' y", "EEEE, d MMMM 'de' y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1} {0}", "{1}, {0}", "{1}, 'a' 'les' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": ["AU$", "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "FRF": ["F"], "MXN": [u, "$"], "PHP": [u, "₱"], "THB": ["฿"], "USD": [u, "$"], "VEF": [u, "Bs F"], "XCD": [u, "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ca-FR.js.mapDxM{"version":3,"file":"en-ZM.js","sourceRoot":"","sources":["en-ZM.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,eAAe,EAAC,aAAa,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,cAAc,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,gBAAgB,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,IAAI,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;\nreturn 5;\n}\n\nexport default [\"en-ZM\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"ZMW\",\"K\",\"Zambian Kwacha\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"],\"ZMW\":[\"K\",\"ZK\"]},\"ltr\", plural];\n"]}P[xF	&ca-FR!ca-FR@OAAO,EAAC,OAAOK:(
ILAUAAU,E"RLAF:((ISAAS"SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,SAASSAAS,CAAC,EAAC,CAAC,UAAU,EAAC,WAAW,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS,EAAC,aAAa,EAAC,WAAW,EAAC,aAAa,EAAC,aAAa )((IMAAM,EAAC,OAAO







6MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO$OAAO,EAAC,UAAU<_:(gBAAgB,EAAC,kBAAkB@$++

*
DeAAe,EAAC,qBAAqB,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,gBAAgB$oBAAoBd2YAAY)MAAMNB
IAAI,CP
IAAI,CP
r
rrr
r
rr
r
MAAM,CP
rEAAE(ca-FR\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"dg\",\"dl\",\"dt\",\"dc\",\"dj\",\"dv\",\"ds\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"],[\"diumenge\",\"dilluns\",\"dimarts\",\"dimecres\",\"dijous\",\"divendres\",\"dissabte\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"]],u,[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"de gen.\",\"de febr.\",\"de març\",\"d’abr.\",\"de maig\",\"de juny\",\"de jul.\",\"d’ag.\",\"de set.\",\"d’oct.\",\"de nov.\",\"de des.\"],[\"de gener\",\"de febrer\",\"de març\",\"d’abril\",\"de maig\",\"de juny\",\"de juliol\",\"d’agost\",\"de setembre\",\"d’octubre\",\"de novembre\",\"de desembre\"]],[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"gen.\",\"febr.\",\"març\",\"abr.\",\"maig\",\"juny\",\"jul.\",\"ag.\",\"set.\",\"oct.\",\"nov.\",\"des.\"],[\"gener\",\"febrer\",\"març\",\"abril\",\"maig\",\"juny\",\"juliol\",\"agost\",\"setembre\",\"octubre\",\"novembre\",\"desembre\"]],[[\"aC\",\"dC\"],u,[\"abans de Crist\",\"després de Crist\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM 'de' y\",\"EEEE, d MMMM 'de' y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss (zzzz)\"],[\"{1} {0}\",\"{1}, {0}\",\"{1}, 'a' 'les' {0}\",u],[\",\",\".Rc#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AUD\":[\"AU$\",\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"FRF\":[\"F\"],\"MXN\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"USD\":[u,\"$M\"],\"VEF\":[u,\"Bs F\"],\"XCD\":[u,\"$\"],\"XXX\":[]},\"ltr\", plural];\n"]}1x tBS$BS@iBAAiB,EwA%BS	0(1BSD\",\"$\",\"Bahamian Dollar\",{\"BSD\":[\"$\"],1},\"ltr\", plural];\n"]}X*ZKx24fr-TN!fr-TN@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KkClCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQ:7P=







MAAM,CAAC,EAAC,C")UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,CAAC,E1(
OAAO,EAAC,MAAM,EAAC,OAAOMAAMSAAS,EAAC,MAAM$SAAS,EAAC,MAAMLWAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoB@$++

eAAeDaAAad(SAAS,EAAC,YAAYIAAIBvIAAI,CPh
IAAI,CPh(
rF*IAAI,CPmwA(
r#*
*
*r
IAAI,CP"IAAI,CP*-(
IAAI,CP@
r#*r
IAAI,CPh(IAAI,CP
IAAI,CP@
%-(*rMAAM,CP
, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e ==[= 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4	%fr-TN\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sVjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,P[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ9Q4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" R] %\",\"#,##0.00 ¤\",\"#E0\"],\"TND\",\"DT\",\"dinar tunisien\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TND\":[\"DT\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],O\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}4j3x1lrc-IQ!lrc-IQ@	CAAC;IAEd)QAAQ*GP=PK(-I
 
MAAM,EAAC,OAAO,EAAC,KAAK
"SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQaKKAAK>3++

^
{YAAYOAAO,EAAC,KAAKNOAAO,CPY;\n	$ lrc-IQ\",[[\"AM\",\"PM\"],u,u],u2
hu,u],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"جانڤیە\",\"فئڤریە\",\"ماس\",\"آڤریل\",\"مئی\",\"جوٙأن\",\"جوٙلا\",\"آگوست\",\"سئپتامر\",\"ئوکتوڤر\",\"نوڤامر\",\"دئسامر\"],u],u,[[\"BCE\",\"CE\"],u,u],6,[5,6],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\"h:mm a\:
 {0}\",u,uDsM #,##0.00\",\"#E0\"],\"IQD\",\"د.ع.‏\",\"IQD\",{\"IQD\":[\"د.ع.‏\"],1},\"rtl\", plural];\n"]}W"^Mxti-ER!ti-ER@CAAC;IAEd,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;I@MAAM,EAAC,MAAMK(=:(
IMAAMP=:(
:((I:




IAAIPOAAO,EAAC,MAAMA#
A#++
UAAUd
CAAC,EAAC,aAAadU`T
r#*CAAC,IAAI,CP
r72;\n\nif (n === Math.floor(n) && (n >= 0 && n <= 1)	4ti-ER\",[[\"ቅ.ቀ.\",\"ድ.ቀ.\"],u,u],u,[[\"ሰ\",\"ሰ\",\"ሰ\",\"ረ\",\"ሓ\",\"ዓ\",\"ቀ\"],[\"ሰን\",\"ሰኑ\",\"ሰሉ\",\"ረቡ\",\"ሓሙ\",\"ዓር\",\"ቀዳ\"],[\"ሰንበት\",\"ሰኑይ\",\"ሰሉስ\",\"ረቡዕ\",\"ሓሙስ\",\"ዓርቢ\",\"ቀዳም\"],[\"ሰን\",\"ሰኑ\",\"ሰሉ\",\"ረቡ\",\"ሓሙ\",\"ዓር\",\"ቀዳ\"]],u,[[\"ጥ\",\"\",\"መ\",\"ሚ\",\"ግ\",\"ሰ\",\"ሓ\",\"ነ\",\"መ\",\"ጥ\",\"ሕ\",\"ታ\"],[\"ጥሪ\",\"ለካ\",\"መጋ\",\"ሚያ\",\"ግን\",\"ሰነ\",\"ሓም\",\"ነሓ\",\"መስ\",\"ጥቅ\",\"ሕዳ\",\"ታሕ\"],[\"ጥሪ\",\"ለካቲት\",\"መቢት\",\"ሚያዝያ\",\"ግንቦት\",\"ሰነ\",\"ሓምለ\",\"ነሓሰ\",\"መስከረም\",\"ጥቅምቲ\",\"ሕkር\",\"ታሕሳስ\"]],u,[[\"ዓ/ዓ\",\"ዓ/ም\"],u,[\"ዓመተ ዓለም\",\"ዓመተ ምሕረት#፣Q {0}\",u,\"{1} ሰዓት>]ERN\",\"Nfk\",\"ናቕፋ\",{\"CNY\":[u,\"¥\"],\"ERN\":[\"Nfk\"],\"ETB\":[\"Br\"],\"JPY\":[u },\"ltr\", plural];\n"]}`x A%A?]`#,
UAAU,EAAC,WAAW,EAAC,iBAAi:WAAW,EAAC,EAAE&4AS\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM 
3M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d,3USD\",\"$\",\"US Dollar\",{},\"ltr\", plural];\n"]}G$xw ER$ER@`
gBAAgB*MER	1(0ERN\",\"Nfk\",\"Eritrean Nakfa\",{\"ERN\":[\"NfkM%x" MP$MP@<	MP~	1*]R	/Ax44.es-CR!es-CR@;QACP5A
P_[

.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EQ%,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5oF[

.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EQ%,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5o[

@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,EQCAAC,OAAO,EAAC,SAAS,E1"5,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWP5AiBAAiB,EAAC,mBAAmBP
2QAAQ,EAAC,SAAS,EAAC,oBAAoB,EAAC,0BAA0B,CAAC,EAAC,CYAAY

\WAAW,EQEAAC,qBAAqB,E@

2}e
<2/2}(}(}(}(}(}(}(}(}(/

/2/#EAAE}EAAE,nLes-CR\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]]2om\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\"G,\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",\"{1} {0}\",\"{1}, {0}\",u],[\",\",\" \",_b¤#,##0.00\",\"#E0\"],\"CRC\",\"₡\",\"colón costarricense\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[uTRC\":[\"₡\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[uLS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"#SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£W!:u,\"$\"],\"VEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[OF\":[]},\"ltr\", plural];\n"]}M&xd4
GQ$GQ@]eAAe,CAAC,CAAC,CAAC,QAAQP
.QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS	CAAC,QAAQP
QAAQaYAAY55&&&	CAAC,CAAC-7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}L%xX4
eAAe,CAAC,CAAC,CAAC,QAAQP
.QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS	CAAC,QAAQP
QAAQaYAAY55&&&	CAAC,CAAC-7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}uvx O43S%S?YAAY*OAAO,EAAC,mBAAmB,Eh(
S.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss%XOF\",\"F CFA\",\"franc CFA (BCEAO)*3<7K5xK4ko-KP!ko-KP@	CAAC;IAEdeOdP
[

.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EQWFP^2^KAAK,EAAC,KAAK,EQK
P([


P

UAAU8cAAc,EAAC,iBAAiP
\QAAQ,EAAC,WAAW,EQKAAK,EAAC,kBAAkB,E
JP}(}?2;\n$ko-KP[\"오전\",\"오후\"]],u,[[\"일\",\"월\",\"화\",\"수\",\"목\",\"금\",\"토\"],u,[\"일요일\",\"월요일\",\"화요\",\"수요일\",\"목요일\",\"금요일\",\"토요일\"],[\"일\",\"월\",\"화\",\"수\",\"목\",\"금\",\"토\"]],u,[[\"1월\",\"2월\",\"3월\",\"4월\",\"5월\",\"6월\",\"7월\",\"8월\",\"9월\",\"10월\",\"11월\",\"12월\"],u,u],u,[[\"BC\",\"AD\"],u,[\"기원전\",\"서기\"]],1,[6,0],[\"yy. M. d.\",\"y. M. d.\",\"y년 M월 d일\",\"y년 M월 d일 EEEE\"],[\"a h:mm\"_,\"a h:mm:ss\",\"a h시 m분 s초 z\",\"a h시 m분 s초 zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\]%\",\"¤#,##0.00\",\"#E0\"],\"KPW\",\"KPW\",\"조선 민주주의 인민 공화국 원\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"1р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱?TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}gxxu4$pt-GQ!pt-GQ@zC\P

%WP
5_P*

,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ6eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa,EAAC,QAAQVPP2PA*
WAAW,E1"5QAAQ,EAAC,UAAUB\P
iBAAiB,EAAC,kBAAkBP

(SAAS,EAAC,oBAAoB,EAAC,0BAA0B,CAAC,EAAC,CYAAY
CAAC,EAAC,cAAc
\QAAQ)MAAM,EAAC,mBAAmB,E
JP}e
(e
?2,#Math.floor(i) && (i >= 0 && i <= 1)Rpt-GQ\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"sáb.X.\",\"fev.\",\"mar.\",\"abr.\",\"mai.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C7.\",\"d.C.\"],u,[\"antes de Cristo\",\"depois de Cristoy\",\"dd/MM/y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],0[\"{1}, {0}\",u,\"{1} 'às' {0}\",u],[\",\",\" \] XAF\",\"FCFA\",\"franco CFA (BEAC)\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"​QTHB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}:S3;xf.'GQ$GQ@O;P-UouMAAM	gBAAgB,CAAC,EAAC,CAAC,UAAU0;Ó
8BAA8Q	ޓ;4

4
P(
	2;
GQM'fXyuSS:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss (zzzz)\"],[\"{1}, {0}\",u,u,u],[\",\",\".}.XAF\",\"FCFA\",\"franco CFA de África Central<dEGP\":[THB\":[\"฿!\"US$\",\"$\")6a$nrUx9 

SN$SN@qMAAMW`>MAAMWp.\KD.\SmCx 3*es-AR!es-AR@;QACP5AP
P_
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1CAAC,OAAO,EAAC,SAAS,E1"5,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWP5AiBAAiB,EAAC,mBAAmBPP
K&QAAQ,EAAC,SAAS,EAAC,oBAAoB,EAAC,0BAA0BB
F͓oEAAC,gBAAgB,E	
(




(
(
(


(
(
(
(
(
(
(
(
(
(





F


#EAAE{EAAE,n,es-AR\",[[\"a. m.\",\"p. m.<om\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\"I,\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],u,[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de'F, {0}\",u],[\",\",\".8ej¤ #,##0.00\",\"#E0\"],\"ARS\",\"$\",\"peso argentino\",{\"ARS\":[\"$\"],\"AUD\":[u,\"$\"],\"BRL\":[u,\"RLhCAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[ul!LS\":[u,\"₪\"],\"INR\":[u,\"₹-RW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[uh4ON\":[u,\"L\"],\"SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£*#tUS$\",\"$\"],\"VEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}1x03-es-BR!es-BR@;QACP5AP
P_
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5oF
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5o
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1CAAC,OAAO,EAAC,SAAS,E1"5,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWP5AiBAAiB,EAAC,mBAAmBPP
K&QAAQ,EAAC,SAAS,EAAC,oBAAoB,EAAC,0BAA0BB
FWAAW,E1IAAI,EAAC,gBAAgB,E	"{F
(
(
(


(
(
(
(
(
(
(
(
(
(






(


#EAAE{EAAE,n,es-BR\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]]2om\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\"G,\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de'F, {0}\",u],[\".\",\",8eD¤#,##0.00\",\"#E0\"],\"BRL\",\"R$\",\"real brasileño\",{\"AUD\":[uIhCAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[ul!LS\":[u,\"₪\"],\"INR\":[u,\"₹-RW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[uh4ON\":[u,\"L\"],\"SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£*!pu,\"$\"],\"VEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}vqx` 33GQ$GQ@MAAM,EAAC,kBAAkB,EA
@
(B	GQAF\",\"FCFA\",\"franc CFA (BEACuj`x[3%pt-MO!pt-MO@zC\P

%WP
5_POAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,CAAC,SAAS,EAAC,eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa,EAAC,QAAQ,CASPP2PASAAS,EAAC,WAAW,E1"5QAAQ,EAAC,UAAUB\P
iBAAiB,EAAC,kBAAkBPP
K
PSAAS,EAAC,oBAAoB,EAAC,0BAA0B,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBCAAC,EAAC,cAAc@QAAQ)MAAM,EAAC,iBAAiB,EA
@

F({
(#	
,#Math.floor(i) && (i >= 0 && i <= 1)2pt-MO\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"sáb.X.\",\"fev.\",\"mar.\",\"abr.\",\"mai.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.C.\"],u,[\"antes de Cristo\",\"depois de Cristo\"]],0,[6,0],[\"dd/MM/yy\",\"dd/MM/y\",\"d 'de' MMMM 'de' y\",\"EEEE, d l'de' MMMM 'de' y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'às! 8] 2MOP\",\"MOP$\",\"pataca macaense\",{\"AUD\":[\"AU$G &JPY\":[\"JP¥\",\"¥\"],\"MOP\":[\"MOPkuPTE\":[\"​\"],\"RON\":[u,\"L\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}XPxy*n-MO"n-MO@!	CAAC;IAEj lBQ:#:?
A A
"WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU*x
+
fMAAM,EAAC,QAAQ,EAAC,WAAWUAAUz3:CAAC,EAAC,CAAC,eAAe,EAAC,aAAaz$?

!gBAAgBBWAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,cAAc!JA#(QAAQ,EAAC,WAAW;
p
iBAAi
-
MAAM0
A*;\n\nif (i === 1 && v === 0)\n    return 1&n-MO\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[:\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J)IJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",)\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a- u,\"{1} 'at' {0}\",u],[\".\",\",j]%\",\"¤#,##0.00\",\"#E0\"],\"MOP\",\"MOP$\",\"Macanese Pataca\",{\"JPY\":[\"JP¥\",\"¥\"],\"MOP\":[\"MOP$\"],\"USD\":[\"US$\"},\"ltr\", plural];\n"]}-oex}	*3fr-GP!fr-GP@lB:?
PTMAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU
&8pp

MAAM,EAAC,MAAMSAAS,EAAC,MAAM,EAAC,OAAO`SAAS,EAAC,MAAM,EAAC,WAAWUAAUz$WAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoq>
!2
+
aAAa!JA#_MAAM,Ep@
-

-

-
|
-

-

-
(
-
b	(|
-

-
,
-

-
(b	b	b	P|
b	
-

-
|
-
(b	P|
-

-

-
|
-
jF
-
b	FMAAM3A&i === 0 || ihfr-GP\",[[\"AM\",\"PM%<im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"J)Ijanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMMF4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" je#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"9>BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\"\COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],+\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\"3EP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤ITMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"USGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$#$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}jcHrxs*$it-SM!it-SM@lB:+P AUAAUWAAW,EAAC,SAAS$ A{#+
,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,WAAWUAAUz$:;CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,eAAe,EAAC,aAAaz$?
<CAAC,EAAC,SAAS!JA#(QAAQ3MAAM,E J|	,(AA&i === 1 && v === 0n(it-SM\",[[\"m.\",\"p.\"],[\"AM\",\"PM\"]*"GM,er\",\"gio\",\"ven\",\"sab\"],[\"domenica\",\"lunedì\",\"martedì\",\"mercoledì\",\"giovedì\",\"venerdì\",\"sabato\"],[\"dob&er\",\"gio\",\"ven\",\"sab\"]],u,[[\"G)G\",\"LM%Jgen\",\"feb\",\"mar\",\"apr\",\"mag\",\"giu\",\"lug\",\"ago\",\"set\",\"otgennaio\",\"febbraio\",\"marzo\",\"aprile\",\"maggio\",\"giugno\",\"luglio\",\"agosto\",\"settembre\",\"ottobre\",\"novembre\",\"dicembre\"]],u,[[\"aC\",\"dC\"],[\"a.C.\",\"d.C.\"],[\"avanti Cristo\",\"dopo Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMMNu,\"{1}Vq8%\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{+ Br\"],\"EGP\":[u,\"£EMOK\":[u,\"NKr\"],\"THB\":[\"฿!4u,\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}a==x PN$PN@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCGAAG,EAAC,oBAAoB Yr>PN	1D.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ssINZD\",\"$\",\"New Zealand Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"NZD\":[\"4H>;xUM$UM@\`#,
UAAU,EAAC,WAAW,EAAC,iBAAi0GAAG,EAAC,WAAW,EAAC,EAAE&4UM\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM 
3M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d,3USD\",\"$\",\"US Dollar\",{},\"ltr\", plural];\n"]}=J%<xX3
eAAe,CAAC,CAAC,CAAC,QAAQP
.QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS	CAAC,QAAQP
QAAQaYAAY55&&&	CAAC,CAAC7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}I#x 33PM$PM@PM	UUMxR3nl-BQ!nl-BQ@!
CAAC;IAEjG/<\PP
P_OF-
QAAQ,E"@(]#(	
UAAUL\,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,eAAe,EAAC,aAAaPP
K
<CAAC,EAAC,cAAc@QAAQ,EAAC,wBAAwB,E
EAAC,oBAAoB!B 
IAAI
L/
(oZ

#EAAE,EAAC,KAAK,EAAC,EAAE!*;\n\nif (i === 1 && v === 0)\n    return 1%nl-BQ\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"Z\",\"M\",\"D\",\"W\",\"D\",\"V\",\"Z\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"zY.\",\"feb.\",\"mrt.\",\"apr.\",\"mei\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"v.C.\"Y,\"n.C.\"],[\"v.Chr.\",\"n.Chr.\"],[\"voor Christus\",\"na Christus\"]],1,[6,0],[\"dd-MM-w u,\"{1} 'om' {0}\",u],[\",\",\".6]`%\",\"¤ #,##0.00;¤ -#,##0.00\",\"#E0\"],\"USD\",\"$\",\"Amerikaanse dollar\",{\"AUD\":[\"AU$4 CCAD\":[\"C$\",\"$\"],\"FJD\":[\"FJ$\",\"$\"],\"JPY\":[\"JP¥\",\"¥YzUR\":[u,\"р.\"],\"SBD\":[\"SI$\",\"$\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XPF\":[],\"XXX\":[]},\"ltr\", plural];\n"]}c.x13$pt-TL!pt-TL@zC\P

%WP
5_POAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,CAAC,SAAS,EAAC,eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa,EAAC,QAAQ,CASPP2PASAAS,EAAC,WAAW,E1"5QAAQ,EAAC,UAAUB\P
iBAAiB,EAAC,kBAAkBPP
K
SAAS,EAAC,oBAAoB,EAAC,0BAA0BB
CAAC,EAAC,cAAc@QAAQ)KAAK,EAAC,0BAA0B!B 
7o(
o(
#/
,#Math.floor(i) && (i >= 0 && i <= 1)0pt-TL\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"sáb.X.\",\"fev.\",\"mar.\",\"abr.\",\"mai.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.C.\"],u,[\"antes de Cristo\",\"depois de Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"dd/MM/y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de'F*, {0}\",u,\"{1} 'às' {0}\",u],[\",\",\" 6] ;USD\",\"US$\",\"dólar dos Estados Unidos\",{\"AUD\":[\"AU$4 :JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"​QTHB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}=ZnxV3
sr-Latn-XK!
sr-Latn-XK@	CAAC;IAEd)YAAY	GO-
KF;
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,ECAAC,SAAS,EAAC,YAAY,EAAC,QAAQ!OAAO5;
KAAKM"KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E	CAAC,QAAQKAAK,EAAC,KAAK,EAAC,QAAQLQAAQCAAC,EAAC,CAAC,cAAc.P
K(

kBAAkBLPPQAAQQo( 
o2o2</
(o;\n$
sr-Latn-XK[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"n\",\"p\",\"u\",\"s\",\"č\",\"p\",\"s\"],[\"ned\",\"pon\",\"uto\",\"sre\",\"čet\",\"pet\",\"sub\"],[\"nedelja\",\"ponedeljak\",\"utorak\",\"sreda\",\"četvrtak\",\"petak\",\"subota\"],[\"ne\",\"po\",\"ut\",\"sr\",\"če\",\"pe\",\"su\"]],u,[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"mart\",\"apr\",\"maj\",\"jun\",\"jul\",\"avg\",\"sept\",\"okt\",\"nov\",\"dec\"],[\"januar\",\"februar\",\"mart\",\"april\",\"maj\",\"jun\",\"jul\",\"avgust\",\"septembar\",\"oktobar\",\"novembar\",\"decembar\"]],u,[[\"p.n.e.\",\"n.e.\"],[\"p. n. e.\",\"n. e.\"]e,[\"pre nove ere\",\"nove ere\"]],1,[6,0],[\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.\",\"EEEE, d. MMMM y.Ku,u,u],[\",\",\".6]0Evro\",{\"AUD\":[u,\"$\"],\"BAM\":[\"KM\"],\"BYN\":[u,\"r.\"],\"GEL\":[u,\"ლ\"],\"KRW\":[u,\"₩\"],\"NZD\":[u,\"$\"],\"PHP\"b:[u,\"₱\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}_CFYxoen-IO!en-IO@0p0P@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKWAAW,EAAC,UAAU,EAAC,QAAQ@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK.
KAAK,EAAC,KAAKxVQAAQ,EAAC,WAAW(0KxgBAAgBBUAAUWAAW,EzKAAK,EAAC,WAAW,EY"en-IO\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],.[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"SVJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BBC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/#,M(, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",)e^US$\",\"US Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}vLCx5
zh-Hant-MO!
zh-Hant-MO@YAAY8/
kPyA K
kAo y/
KAAK'$/
@OAAO,EAAC,QAAQ,EAAC,CAAC,EAAC,YAAY,CAAC,EAAC,CAAC,OAAO,EAAC,UAAUMAAM,EAAC,KAAK,EP*7MAAMoj9KEAAE
zh-Hant-MO\",[[\"上午\",\"下午\"],u,u],u,[[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],[\"週日\",\"週一\",\"週二\",\"週三\",\"週四\",\"週五\",\"週六\"],[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\"],[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],u],u,[[\"公元前\",\"公元\"],u,u],0,[6,0],[\"d/M/y\",\"y年M月d日\",u,\"y年M月d日EEEE\"],[\8"ah:mm\",\"ah:mm:ss\",\"ah:mm:ss [z]\",\"ah:mm:ss [zzzz]

\	非數值i
>MOP\",\"MOP$\",\"澳門元
2MOP\":[\"MOP$%,RUR\":[u,\"р.]#,\"XXX\":[]},\"ltr\", plural];\n"]}<#Ex8s*sG
7A'7Z
#_QAAQ:BYAAY,EAAC,eAAes
}
(@u,Pw#
}
sodE周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周	nE周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周	[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"]
5
Gz ah:mm:ss\",\"zzzz ah:mm:ss\NaNS币2@ILR\":[\"ILS\"],\"JPY\":[\"JP¥\",\"¥\"],\"KRW\":[\"￦\",\"₩.DTWD\":[\"NT$Q>LXLx! 	eAAe,EAAEi2$	];\n"]}
91x lrc-IQ!lrc-IQ@	x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["ca-IT", [["a. m.", "p. m."], u, u], u, [["dg", "dl", "dt", "dc", "dj", "dv", "ds"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."], ["diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."]], u, [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["de gen.", "de febr.", "de març", "d’abr.", "de maig", "de juny", "de jul.", "d’ag.", "de set.", "d’oct.", "de nov.", "de des."], ["de gener", "de febrer", "de març", "d’abril", "de maig", "de juny", "de juliol", "d’agost", "de setembre", "d’octubre", "de novembre", "de desembre"]], [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des."], ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"]], [["aC", "dC"], u, ["abans de Crist", "després de Crist"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM 'de' y", "EEEE, d MMMM 'de' y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1} {0}", "{1}, {0}", "{1}, 'a' 'les' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": ["AU$", "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "MXN": [u, "$"], "PHP": [u, "₱"], "THB": ["฿"], "USD": [u, "$"], "VEF": [u, "Bs F"], "XCD": [u, "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ca-IT.js.mapAAx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["ca", [["a. m.", "p. m."], u, u], u, [["dg", "dl", "dt", "dc", "dj", "dv", "ds"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."], ["diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"], ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."]], u, [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["de gen.", "de febr.", "de març", "d’abr.", "de maig", "de juny", "de jul.", "d’ag.", "de set.", "d’oct.", "de nov.", "de des."], ["de gener", "de febrer", "de març", "d’abril", "de maig", "de juny", "de juliol", "d’agost", "de setembre", "d’octubre", "de novembre", "de desembre"]], [["GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"], ["gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des."], ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"]], [["aC", "dC"], u, ["abans de Crist", "després de Crist"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM 'de' y", "EEEE, d MMMM 'de' y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1} {0}", "{1}, {0}", "{1}, 'a' 'les' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": ["AU$", "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "MXN": [u, "$"], "PHP": [u, "₱"], "THB": ["฿"], "USD": [u, "$"], "VEF": [u, "Bs F"], "XCD": [u, "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ca.js.map]?x0{"version":3,"file":"gd.js","sourceRoot":"","sources":["gd.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1 || n === 11)\n    return 1;\nif (n === 2 || n === 12)\n    return 2;\nif (n === Math.floor(n) && (n >= 3 && n <= 10 || n >= 13 && n <= 19))\n    return 3;\nreturn 5;\n}\n\nexport default [\"gd\",[[\"m\",\"f\"],u,u],u,[[\"D\",\"L\",\"M\",\"C\",\"A\",\"H\",\"S\"],[\"DiD\",\"DiL\",\"DiM\",\"DiC\",\"Dia\",\"Dih\",\"DiS\"],[\"DiDòmhnaich\",\"DiLuain\",\"DiMàirt\",\"DiCiadain\",\"DiarDaoin\",\"DihAoine\",\"DiSathairne\"],[\"Dò\",\"Lu\",\"Mà\",\"Ci\",\"Da\",\"hA\",\"Sa\"]],u,[[\"F\",\"G\",\"M\",\"G\",\"C\",\"Ò\",\"I\",\"L\",\"S\",\"D\",\"S\",\"D\"],[\"Faoi\",\"Gearr\",\"Màrt\",\"Gibl\",\"Cèit\",\"Ògmh\",\"Iuch\",\"Lùna\",\"Sult\",\"Dàmh\",\"Samh\",\"Dùbh\"],[\"dhen Fhaoilleach\",\"dhen Ghearran\",\"dhen Mhàrt\",\"dhen Ghiblean\",\"dhen Chèitean\",\"dhen Ògmhios\",\"dhen Iuchar\",\"dhen Lùnastal\",\"dhen t-Sultain\",\"dhen Dàmhair\",\"dhen t-Samhain\",\"dhen Dùbhlachd\"]],[[\"F\",\"G\",\"M\",\"G\",\"C\",\"Ò\",\"I\",\"L\",\"S\",\"D\",\"S\",\"D\"],[\"Faoi\",\"Gearr\",\"Màrt\",\"Gibl\",\"Cèit\",\"Ògmh\",\"Iuch\",\"Lùna\",\"Sult\",\"Dàmh\",\"Samh\",\"Dùbh\"],[\"Am Faoilleach\",\"An Gearran\",\"Am Màrt\",\"An Giblean\",\"An Cèitean\",\"An t-Ògmhios\",\"An t-Iuchar\",\"An Lùnastal\",\"An t-Sultain\",\"An Dàmhair\",\"An t-Samhain\",\"An Dùbhlachd\"]],[[\"R\",\"A\"],[\"RC\",\"AD\"],[\"Ro Chrìosta\",\"An dèidh Chrìosta\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d'mh' MMMM y\",\"EEEE, d'mh' MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"GBP\",\"£\",\"Punnd Sasannach\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"leu\"],\"RUR\":[u,\"р.\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XXX\":[]},\"ltr\", plural];\n"]}eFD}]x!%!ce!ce:;QACPQfN(KAAK~KAAK,EAAC,IAAI$N

,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,UAAULKAAK~$KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,CIAAI!IAAI,EAAC,GAAG,EAAC,IAAI$KAAK,EAAC,IAAI$
,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,UAAULKAAK~$KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,C0@7<A(
,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK.QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CNaAAaLN
gCAAgC,EAAC,oCAAoQ%]
]{UAAU,EAAC,gBAAgaAAaWAAW,EAAC,SAAS,EAAC,YAAY)aAAa	##		)\n    return 1(%ce\",[[\"AM\",\"PM\"],u,u],u,[[\"кӀи\",\"ор\",\"ши\",\"кха\",\"еа\",\"пӀе\",\"шуо\"],u,[\"кӀира\",\"оршот\",\"шинара\",\"кхаара\",\"еара\",\"пӀераска\",\"шуот\"],[\"кӀи\",\"ор\",\"ши\",\"кха\",\"еа\",\"пӀе\",\"шуо\"]],[[\"кӀ\",\"о\",\"ш\",\"кх\",\"е\",\"пӀ\",\"ш\"],[\"кӀи\",\"ор\",\"ши\",\"кха\",\"еа\",\"пӀе\",\"шуо\"],[\"кӀира\",\"оршот\",\"шинара\",\"кхаара\",\"еара\",\"пӀраска\",\"шуот\"],[\"кӀи\",\"ор\",\"ши\",\"кха\",\"еа\",\"пӀе\",\"шуо\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв\",\"фев\",\"мар\",\"апр\",\"май\",\"июн\",\"июл\",\"авг\",\"сен\",\"окт\",\"ноя\",\"дек\"],[\"январь\",\"февраль\",\"март\",\"апрель\",\"май\",\"июнь\",\"июль\",\"август\",\"сентябрь\",\"октябрь\",\"ноябрь\",\"деабрь\"]],u,[[\"в. э. тӀ. я\",\"в. э\"],u,[\"Ӏийса пайхамар вина де кхачале\",\"Ӏийса пайхамар вина дийнахь дуьйна\"]],1,[6,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\,Терхьаш дац G %\",\"#,##0.00 ¤\",\"#E0\"],\"RUB\",\"₽\",\"Российн сомSKлей\"],\"RUB\":[\"₽\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}(sl1xp!%da!da:EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAElH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,C,AAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7CQ?8``87`A?




6CAAC,E/7<
<
<
IAAI`A?P
6CAAC,E/7<
<
<
IAAI`





"(WAAWUAAU$~
#R<UAAU,EAAC,WAAW,EAAC,sBAAsWeAAe[~<
8~2(~2
(i, i = Math.floor(Math.abs(val)), t = parseInt(val.toString().replace(/^[^.]*\\.?|0+$/g, ''), 10) || 0;\n\nif (n === 1 || !(t === 0) && (i === 0 || i === 1)	4da\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"søn.\",\"man.\",\"tir.\",\"ons.\",\"tor.\",\"fre.\",\"lør.\"],[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],[\"sø\",\"ma\",\"ti\",\"on\",\"to\",\"fr\",\"lø\"]],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"søn\",\"man\",\"tir\",\"ons\",\"tor\",\"fre\",\"lør\"],[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],[\"sø\",\"ma\",\"ti\",\"on\",\"to\",\"fr\",\"lø\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan.\",\"feb.\",\"mar.\",\"apr.\",\"maj\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januar\",\"februar\",\"marts\",\"april\",\"maj\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"fKr\",\"eKr\"],[\"f.Kr.\",\"e.Kr.\"],u],1,[6,0],[\"dd.MM.y\",\"d. MMM y\",\"d. MMMM y\",\"EEEE 'den' d. MMMM y\"],[\"HH.mm\",\"HH.mm.ss\",\O"HH.mm.ss z\",\"HH.mm.ss zzzz\"],[\"{1} {0}\",u,\"{1} 'kl'. {0}\",u],[\",\",\".<:	NaN\",\".<DKK\",\"kr.\",\"dansk krone\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"Br.\"],\"DKK\":[\"kr.\"],\"ISK\":[u,\"kr.\"],\"JPY\":[\"JPNOK\":[u,\"kr.!%9L\"],\"SEK\":[u,\"kr.\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$^3&v+PxN!fa!fa:]eAAe,CE?
vP
SAASKAAK,EAAC,UAAU@>`7?
vP
SAASQ
`OAAOOAAOOAAOOAAOOAAO,CAAC,CAAC@7export default [[[\"ب\",\"ص\",\"ظ\",\"ع\",\"ش\",\"ن\"],[\"بامداد\",\"صبح\",\"ظهر\",\"عصر\",\"شب\",\"نیمه‌شب\"],[\"بامداد\",\"صبح\",\"بعدازظهر\",\"عصر\",\"شب\",\"نیمه‌شب\"]],[[\"ب\",\"ص\",\"ظ\",\"ع\",\"ش\",\"ن\"],[\"بامداد\",\"صبح\",\"ظهر\",\"عصر\",\"شب\",\"نیمه‌شب\"],u],[[\"01:00\",\"04:0z0\"],[\"04:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"19:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"01:00\"]]];\n"]}Ʈmx,!ga!ga:-IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACb,IAAI,C^AAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1CQMAAMoA?OAAOOAAOGcAAc,EAAC,UAAU,EAAC,UAAU,EAAC,aAAa,EAAC,WAAW,EAAC,WAAW,EAAC,aAAa,CAAC,E/7<
<
<
IAAI$".KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EMAAM"OAAO,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWcAAc,EAAC,kBAAkB,EAAC,SAAS8.8(eAAe,EAAC,aAAa[eAAeOAAO$QAAQ,EAAC,WAAW)MAAM<B#EAAE'if (n === 2)\n    return 2;\nif (n === Math.floor(n) && (n >= 3 && n <= 6))\n    return 3;\nif (n === Math.floor(n) && (n >= 7 && n <= 10))\n    return 4	%ga\",[[\"r.n.\",\"i.n.\"],u,u],u,[[\"D\",\"L\",\"M\",\"C\",\"D\",\"A\",\"S\"],[\"Domh\",\"Luan\",\"Máirt\",\"Céad\",\"Déar\",\"Aoine\",\"Sath\"],[\"Dé Domhnaigh\",\"Dé Luain\",\"Dé Máirt\",\"Dé Céadaoin\",\"Déardaoin\",\"Dé hAoine\",\"Dé Sathairn\"],[\"Do\",\"Lu\",\"Má\",\"Cé\",\"Dé\",\"Ao\",\"Sa\"]],u,[[\"E\",\"F\",\"M\",\"A\",\"B\",\"M\",\"I\",\"L\",\"M\",\"D\",\"S\",\"N\"],[\"Ean\",\"Feabh\",\"Márta\",\"Aib\",\"Beal\",\"Meith\",\"Iúil\",\"Lún\",\"MFómh\",\"DFómh\",\"Samh\",\"Noll\"],[\"Eanáir\",\"Feabhra\",\"Márta\",\"Aibreán\",\"Bealtaine\",\"Meitheamh\",\"Iúil\",\"Lúnasa\",\"Meán Fómhair\",\"Deireadh Fómhair\",\"Samhain\",\"Nollaig\"]],u,[[\"RC\",\"AD\"],u,[\"Roimh Chríost\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d M#MM y\",\"d MMMM y\",\"EEEE d MMMM yNuimh %\",\"¤#,##0.00\",\"#E0\"],\"EUR\",\"€\",\"Euro\",{\"RUR\":[u,\"р.\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XXX\":[]},\"ltr\", plural];\n"]}vrxe!!ia!ia:EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EA5AE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,IAAI,CAAC,KAAK,CAAClB痓A?PUAAU,EWAAW,ESAAS,CAAC,E/7<
<
<
IAAI$.UAAU,EAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,ESAAS,EAAC,WAAWUAAU`Z
<
BN.UAAU,EAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,ESAAS,EAAC,WAAWUAAU`QAAQ,EAAC,QAAQ_cAAc,EAAC,cAAcQeAAe,EAAC,yBAAyWaAAa[~CAAC,WAAW,EAAC,QAAQjo
oB~(, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;	$ia\",[[\"AM\",\"PM\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mer\",\"jov\",\"ven\",\"sab\"],[\"dominica\",\"lunedi\",\"martedi\",\"mercuridi\",\"jovedi\",\"venerdi\",\"sabbato\"],[\"do\",\"lu\",\"ma\",\"me\",\"jo\",\"ve\",\"sa\"]],u,[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"mai\",\"jun\",\"jul\",\"aug\",\"sep\",\"oct\",\"nov\",\"dec\"],[\"januario\",\"februario\",\"martio\",\"april\",\"maio\",\"junio\",\"julio\",\"augusto\",\"septembre\",\"octobre\",\"novembre\",\"decembre\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"mai\",\"jun\",\"jul\",\"aug\",\"sep\",\"oct\",\"nov\",\"dec\"],[\"januario\",\"februario\",\"martio\",\"april\",\"maio\",\"junio\",\"julio\",\"augusto\",\"septembre\",\"octobre\",\"novembre\",\"decembre\"]],[[\"a.Chr.\",\"p.Chr.\"],u,[\"ante Christo\",\"post Christo\"]],1,[6,0],[\"dd-MM-y\",\"d MMM y\",\"d 'de' "MMMM y\",\"EEEE 'le' d 'de' MMMM yM\"{1} 'a' {0}\",u],[\",\",\".<:NaN %%\",\"¤ #,##0.00\",\"#E0\"],u,u,u,{NLG\":[\"ƒLE:(JFfxb!ja!ja:A?o
NAuA?Z
<
B87<
<
<
<
<
<`8N
B`
`
M
6QAAQ,EAAC,YAAY,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,WAAW)CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW)KAAK<Bu?

(`EAAE'	"ja\",[[\"午前\",\"午後\"],u,u],u,[[\"日\",\"月\",\"火\",\"水\",\"木\",\"金\",\"土\"],u,[\"日曜日\",\"月曜日\",\"火曜日\",\"水曜日\",\"木曜日\",\"金曜日\",\"土曜日\"],[\"日\",\"月\",\"火\",\"水\",\"木\",\"金\",\"土\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],u],u,[[\"BC\",\"AD\"],[\"紀元前\",\"西暦\"],u],0,[6,0],[\"y/MM/dd\",u,\"y年M月d日\",\"y年M月d日EEEE\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H時mm分ss秒 zzzz\"],[\"{1} {0}(NNaN %\",\"¤#,##0.00\",\"#E0\"],\"JPY\",\"￥\",\"日本円\",{\"BYN\":[u,\"р.\"],\"CNY\":[\"元\",\"￥\"],\"JPY\":[\"￥\"],\"PH),レイ\"],\"XXX\":[]},\"ltr\", plural];\n"]}3Wxa!$ka!ka:?8``87`A?P3WAAW,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW,EAAC,QAAQ,CAAC,E/7<
<
<
IAAI$
WAAW

WAAW,EAAC,UAAU,EAAC,WAAW$QAAQ,EAAC,QAAQ_qBAAqB,EAAC,qBAAqB=#UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,kBAAkCUAAUQokngBAAgB$QAAQ3cAAc,EJ`

((((((-ka\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"კ\",\"ო\",\"ს\",\"ო\",\"ხ\",\"პ\",\"შ\"],[\"კი\",\"ორშ\",\"სამ\",\"ოთხ\",\"ხუთ\",\"პარ\",\"შაბ\"],[\"კვირა\",\"ორშბათი\",\"სამშაბათი\",\"ოთხშაბათი\",\"ხუთშაბათი\",\"პარაკევი\",\"შაბათი\"],[\"კვ\",\"ორ\",\"სმ\",\"ოთ\",\"ხთ\",\"პრ\",\"შბ\"]],u,[[\"ი\",\"თ\",\"მ\",\"ა\",\"მ\",\"ი\",\"ი\",\"ა\",\"ს\",\"ო\",\"ნ\",\"დ\"],[\"იან\",\"თებ\",\"არ\",\"აპრ\",\"მაი\",\"ივნ\",\"ივლ\",\"აგვ\",\"სექ\",\"ოქტ\",\"ნოე\",\"ეკ\"],[\"იანვარი\",\"თებერვალი\",\"მარტი\",\"აპრილი\",\"მაისი\",\"ივნისი\",\"ივლისი\",\"აგვისტო\",\"სექტემბერი\",\"ოქტომბერი\",\"ნოემბერი\",\"დეკემბერი\"]],u,[[\"ძვ. წ.\",\"ახ. წ.\"],u,[\"ველი წელთაღრიცხვით\",\"ახალი წელთაღრიცხვით\"]],1,[6,0],[:\"dd.MM.yy\",\"d MMM. y\",\"d MMMM, y\",\"EEEE, dd MMMM, yD, {0}\",u,u,u],[\",\",\" <:(არ არის რიცხვი  GEL\",\"₾\",\"ქართული ლარი\",{\"AUD\":[u,\"$\"],\"BYN\":[u,\"р.\"],\"CNY\":[u,\"¥\"],\"GEL\":[\"₾\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"NZD\":[u,\"$\"],\"PHP\":[u/TWD\":[\"NT$^,,\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}aD[HxE!kab!kab:dEAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAClB=CAAC,SAAS,EAAC,WAAW_A?#MAAMpMAAM6
QAAQ>$MAAMpMAAM^oUAAU$",
MAAM,EAAC,SAAS,EUAAU$UAAU,EAAC,UAAU_qBAAqB,EAAC,qBAAqB=UAAU,EAAC,eAAeWAAW,EAAC,aAAa,EAAC,gBAAgBMCAAC,WAAW,EAAC,QAAQ,EAAC,WAAWP
gBAAgB<`F~-4, i = Math.floor(Math.abs(val));\n\nif (i === 0 || i	:kab\",[[\"n tufat\",\"n tmeddit\"],u,u],u,[[\"Y\",\"S\",\"K\",\"K\",\"S\",\"S\",\"S\"],[\"Yan\",\"San\",\"Kraḍ\",\"Kuẓ\",\"Sam\",\"Sḍis\",\"Say\"],[\"Yanass\",\"Sanass\",\"Kraḍass\",\"Kuẓass\",\"Samass\",\"Sḍisass\",\"Sayass\"],[\"Yan\",\"San\",\"Kraḍ\",\"Kuẓ\",\"Sam\",\"Sḍis\",\"Say\"]],u,[[\"Y\",\"F\",\"M\",\"Y\",\"M\",\"Y\",\"Y\",\"Ɣ\",\"C\",\"T\",\"N\",\"D\"],[\"Yen\",\"Fur\",\"Meɣ\",\"Yeb\",\"May\",\"Yun\",\"Yul\",\"Ɣuc\",\"Cte\",\"Tub\",\"Nun\",\"Duǧ\"],[\"Yennayer\",\"Fuṛar\",\"Meɣres\",\"Yebrir\",\"Mayyu\",\"Yunyu\",\"Yulyu\",\"Ɣuct\",\"Ctembeṛ\",\"Tubeṛ\",\"Nunembeṛ\",\"Duǧembeṛ\"]],u,[[\"snd. T.Ɛ\",\"sld. T.Ɛ\"],u,[\"send talalit n Ɛisa\",\"seld talalit n Ɛisa\"]],6,[5,6],[\"d/M/y\",\"d MMM, y\",\"d MMMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a ,\",\" <:NaN L%\",\"#,##0.00¤\",\"#E0\"],\"DZD\",\"DA\",\"Adinar Azzayri\",{\"DZD\":[\"DA d-KxB!kea!kea:(3KA?P
=cAAc,EAAC,YAAY,EAAC,aAAa,EAAC,YAAY,EAAC,YAAY,EAAC,QAAQ,CAAC,E/7<
<
<
IAAI$"MAAM,E" 
UAAU$8(iBAAiB,EAAC,kBAAkBQoBAAoB,EAAC,0BAA0CUAAUQoknCAAC,WAAW,EAAC,QAAQ3oBAAoB<~(7	"kea\",[[\"am\",\"pm\"],u,u],u,[[\"D\",\"S\",\"T\",\"K\",\"K\",\"S\",\"S\"],[\"dum\",\"sig\",\"ter\",\"kua\",\"kin\",\"ses\",\"sab\"],[\"dumingu\",\"sigunda-fera\",\"tersa-fera\",\"kuarta-fera\",\"kinta-fera\",\"sesta-fera\",\"sábadu\"],[\"du\",\"si\",\"te\",\"ku\",\"ki\",\"se\",\"sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Abr\",\"Mai\",\"Jun\",\"Jul\",\"Ago\",\"Set\",\"Otu\",\"Nuv\",\"Diz\"],[\"Janeru\",\"Febreru\",\"Marsu\",\"Abril\",\"Maiu\",\"Junhu\",\"Julhu\",\"Agostu\",\"Setenbru\",\"Otubru\",\"Nuvenbru\",\"Dizenbru\"]],u,[[\"AK\",\"DK\"],u,[\"antis di Kristu\",\"dispos di Kristu\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d 'di' MMMM 'di' y\",\"EEEE, d 'di' MMMM 'di' y\"],[\"HH:mm\",5, {0}\",u,u,u],[\",\",\" <:NaN  LCVE\",\"​\",\"Skudu Kabuverdianu\",{\"AUD\":[\"AU$\",\"$\"],\"CVE\":[\"​ THB\":[\"฿^3gz]xV!$lb!lb:~
OAAOR
`OAAO,EAAC,UAAU_
`A?



,WAAW,EAAC,UAAU,EAAC,aAAa,EAAC,SAAS,EAAC,WAAW>QnA?P,WAAW,EAAC,UAAU,EAAC,aAAa,EAAC,SAAS,EAAC,WAAW>Qn





(WAAWUAAU`(WAAWUAAU`SAAS,EAAC,SAAS_2#UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiٓFMAAM<`n#
-lb\",[[\"mo.\",\"nomë.\"],[\"moies\",\"nomëttes\"],u],[[\"moies\",\"nomëttes\"],u,u],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"Son.\",\"Méi.\",\"Dën.\",\"Mët.\",\"Don.\",\"Fre.\",\"Sam.\"],[\"Sonndeg\",\"Méindeg\",\"Dënschdeg\",\"Mëttwoch\",\"Donneschdeg\",\"Freideg\",\"Samschdeg\"],[\"So.\",\"Mé.\",\"Dë.\",\"Më.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"Son\",\"Méi\",\"Dën\",\"Mët\",\"Don\",\"Fre\",\"Sam\"],[\"Sonndeg\",\"Méindeg\",\"Dënschdeg\",\"Mëttwoch\",\"Donneschdeg\",\"Freideg\",\"Samschdeg\"],[\"So.\",\"Mé.\",\"Dë.\",\"Më.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan.\",\"Feb.\",\"Mäe.\",\"Abr.\",\"Mee\",\"Juni\",\"Juli\",\"Aug.\",\"Sep.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Januar\",\"Februar\",\"Mäerz\",\"Abrëll\",\"Mee\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mäe\",\"Abr\",\"Mee\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"],[\"Januar\",\"Februar\",\"Mäerz\",\"Abrëll\",\"Mee\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"]],[[\"v. CZhr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"d. MMM y\",\"d. MMMM y\",\"EEEE, d. MMMM yU,\",\".<:NaNB>EUR\",\"€\",\"Euro\",{\"ATS\":[\"öS\"],\"AUD\":[\"AU$\",\"$!9THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}jOUx_!mas-TZ!mas-TZ:"QAAQ,EAAC,CAAC,CAAC,WAAW,EAAC,QAAQ_A?PUAAU,EAAC,UAAUUAAU,EAAC,OAAO,EAAC,UAAU>QnoZ
<
BNFMAAMpMAAMPUAAU,EAAC,MAAM,EAAC,YAAY,EAAC,qBAAqB,EAAC,sBAAsB,EAAC,UAAU,EAAC,WAAW,EAAC,eAAe,EUAAU,EAAC,UAAU$8(aAAa,EAAC,YAAY9CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW
uBAAuB<~(
mas-TZ\",[[\"Ɛnkakɛnyá\",\"Ɛndámâ\"],u,u],u,[[\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"1\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"],[\"Jumapílí\",\"Jumatátu\",\"Jumane\",\"Jumatánɔ\",\"Alaámisi\",\"Jumáa\",\"Jumamósi\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"Dal\",\"Ará\",\"Ɔɛn\",\"Doy\",\"Lép\",\"Rok\",\"Sás\",\"Bɔ́r\",\"Kús\",\"Gís\",\"Shʉ́\",\"Ntʉ́\"],[\"Oladalʉ́\",\"Arát\",\"Ɔɛnɨ́ɔɨŋɔk\",\"Olodoyíóríê inkókúâ\",\"Oloilépūnyīē inkókúâ\",\"Kújúɔrɔk\",\"Mrusásin\",\"Ɔlɔ́ɨ́bɔ́rárɛ\",\"Kúshîn\",\"Olgísan\",\"Pʉshʉ́ka\",\"Ntʉ́ŋʉ́s\"]],u,[[\"MY\",\"EY\"],u,[\"Meeínō Yɛ́sʉ\",\"Eínō Yɛ́sʉ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM yNaN H%\",\"¤#,##0.00\",\"#E0\"],\"TZS\",\"TSh\",\"Iropiyianí e Tanzania\",{KES\":[\"Ksh\"],\"TZS\":[\"TSh^3fΫx2!'nb!nb:?MAAM``MAAMo
`A?




6?Pno





OAAO.WAAWUAAU`"OAAO.WAAWUAAU``aAAa,EAAC,eAAeGUAAU,EAAC,WAAWNUAAU,EAAC,CAAC,EAAC,eAAe[~wBAAwBP
eAAe,EJ`
`
(((((((`
((F
(EAAE8EAAE,EAAC,KAAK,EAAC,EAAE'nb\",[[\"a\",\"p\"],[\"a.m.\",\"p.m.\"],u],[[\"a.m.\",\"p.m.\"],u,u],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"søn.\",\"man.\",\"tir.\",\"ons.\",\"tor.\",\"fre.\",\"lør.\"],[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],[\"sø.\",\"ma.\",\"ti.\",\"on.\",\"to.\",\"fr.\",\"lø.\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan.\",\"feb.\",\"mar.\",\"apr.\",\"mai\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"des.\"],[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"mai\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"des\"],[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"f.Kr.\",\"e.Kr.\"],u,[\"før Kristus\",\"etter Kristus\"]],1?,[6,0],[\"dd.MM.y\",\"d. MMM y\",\"d. MMMM y\",\"EEEE d. MMMM yDD, {0}\",u,\"{1} 'kl'. {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"−T"NaN(¤ #,##0.00;¤ -#,##0.00\",\"#E0\"],\"NOK\",\"kr\",\"norske kroner\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,:\"₩\"],\"MXN\":[u,\"$\"],\"NOK\":[\"kr\"],\"NZD\":[u,\"$!%L\"],\"TWD\":[u,\"NT$\"],\"USD\":[u,\"$\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XPF\":[],\"XXX\":[]},\"ltr\", plu
ral];\n"]}pVGxk!sd-Arab!sd-Arab:^SAAS,EAAC,CAAC,CAAC,aAAa,EAAC,aAAa,CAAC,EAAC,CAAC,aAAa,EAAC,aAAa,CAAC,EAAC,CAAC,aAAa,EAAC,aAAa`aAAa,EAAC,aAAa_
`~"OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM$MAAM,EAAC,OAAO
o"OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,OAAOp"SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAOQ8(UAAU,EAAC,iBAAiBq
WAAW,EAAC,aAAa,EAAC,gBAAgBMCAAC,WAAW,EAAC,QAAQ)P
cAAc<`7-sd-Arab\",[[\"صبح، منجهند\",\"منجهند، شام\"],[\"صبح، منجهند\",\"شام، منجهند\"],[\"صب، منجهند\",\"منجهند، شام\"]],[[\"صبح، منجهند\",\"منجهند، شام\"],u,u],[[\"آچر\",\"سو\",\"اڱارو\",\"اربع\",\"خم\",\"جمعو\",\"ڇنڇر\"],[\"آچر\",\"سومر\",\"اڱارو\",\"اربع\",\"خميس\",\"جمعو\",\"ڇنڇر\"],u,u],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"جنوري\",\"فيبروري\",\"مارچ\",\"اپريل\",\"مئي\",\"جون\",\"جولاءِ\",\"آگسٽ\",\"سيپٽمبر\",\"آڪٽوبر\",\"نومبر\",\"ڊسمبر\"],u],u,[[\"BC\",\"CD\"],u,[\"قبل مسيح\",\"عيسوي کان پهرين\"]],0,[6,@2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aaNaN F%\",\"¤ #,##0.00\",\"#E0\"],\"PKR\",\"Rs\",\"پاڪستاني رپيHPKR\":[\"Rs^rtl\", plural];\n"]}[RBJBxU!uz-Arab!uz-Arab:(SAAS(VA?87<
<
<
B
 MAAM87<
<
<
IAAI$Z
<
BN(PA
OAAOOAAO@
OAAO,EAAC,OAAO$~G7
`
<
CAAC,WAAW,EAAC,QAAQ3QAAQ,EO~-	"uz-Arab\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"ی.\",\"د.\",\"س.\",\"چ.\",\"پ.\",\"ج.\",\"ش.\"],[\"یکشنبه\",\"دوشنبه\",\"سه‌شنبه\",\"چهارشنبه\",\"پنجشنبه\",\"جمعه\",\"شنب\"],[\"ی.\",\"د.\",\"س.\",\"چ.\",\"پ.\",\"ج.\",\"ش.\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"جنو\",\"فبر\",\"مار\",\"اپر\",\"می\",\"جون\",\"جول\",\"اگس\",\"سپت\",\"اکت\",\"نوم\",\"دسم\"],[\"جنوری\",\"فبروری\",\"مارچ\",\"اپریل\",\"می\",\"جون\",\"جولای\",\"اگسe\",\"سپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"]],u,[[\"BCE\",\"CE\"],u,u],6,[4,5',\",\".\",\";\",\"%\",\"‎+\",\"‎−T"NaN L%\",\"¤ #,##0.00\",\"#E0\"],\"AFN\",\"؋\",\"افغانی\",{\"AFN\":[\"؋ drtl\", plural];\n"]}BKx 	%&c"c9$#(WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG	;QAClBQ(
|	
pFEUAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ,EAAC,WAAW,EAAC,UAAU,CAACq	p<6((m
SAAS,EAAC,SAAS,EAAC,OAAO
SAAS,CAAC,EAAC,CAAC,UAAUSAAS,EAAC,SAAS,EAAC,SAAS"aAAa,EAAC,WAAW,EAAC,aAAa,EAAC,aAAa0O((
OAAO 8
-]"OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO$-O(gBAAgB,EAAC,kBAAkB0=l

eAAe,EAAC,qBAAqBSAAS,EAAC,WAAW,EAAC,gBAAgB]$oBAAoBqAP
i(QAAQ,EAAC,YAAY 
GAAG,EAAC,MAAMLIAAI,C	
IAAI,C	
	(	D
	
	(	D
	
	(MAAM,C	
	EAAE
v = F"(/, '').length;\n\nif (i === 1 && v === 04ca\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"dg\",\"dl\",\"dt\",\"dc\",\"dj\",\"dv\",\"ds\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"],[\"diumenge\",\"dilluns\",\"dimarts\",\"dimecres\",\"dijous\",\"divendres\",\"dissabte\"],[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"]],u,[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"de gen.\",\"de febr.\",\"de març\",\"d’abr.\",\"de maig\",\"de juny\",\"de jul.\",\"d’ag.\",\"de set.\",\"d’oct.\",\"de nov.\",\"de des.\"],[\"de gener\",\"de febrer\",\"de març\",\"d’abril\",\"de maig\",\"de juny\",\"de juliol\",\"d’agost\",\"de setembre\",\"d’octubre\",\"de novembre\",\"de desembre\"]],[[\"GN\",\"FB\",\"MÇ\",\"AB\",\"MG\",\"JN\",\"JL\",\"AG\",\"ST\",\"OC\",\"NV\",\"DS\"],[\"gen.\",\"febr.\",\"març\",\"abr.\",\"maig\",\"juny\",\"jul.\",\"ag.\",\"set.\",\"oct.\",\"nov.\",\"des.\"],[\"gener\",\"febrer\",\"març\",\"abril\",\"maig\",\"juny\",\"juliol\",\"agost\",\"setembre\",\"octubre\",\"novembre\",\"desembre\"]],[[\"aC\",\"dC\"],u,[\"abans de Crist\",\"després de Crist\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM 'de' y\",\"EEEE, d MMMM 'de' y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss (zzzz)\"],[\"{1} {0}\",\"{1}, {0}\",\"{1}, 'a' 'les'V:q EUR\",\"€\",\"euroRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"MXN\":[u,\"$\"],\"PHP\":[u,\"₱\"V],\"THB\":[\"฿\"],\"USD\":[u,\"$\"],\"VEF\":[u,\"Bs F\"],\"XCD\":[u,\"$\"],\"XXX\":[fhJQ\x%en-NZ!en-NZ:$#(WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG	;QAClB=OAAO0|	
pd"WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAUN(
;`|	
p7+

hx@<eAAe,EAAC,aAAa0G
UAAU,EAAC,gBAAgB\BWAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,cAAcqAP
i(QAAQ,EAAC,WAAW 
GAAG,EAAC,oBAAoBBD
#
v = F"(/, '').length;\n\nif (i === 1 && v === 047en-NZ\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pmW\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday^\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],uOJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"d/MM/yy\",\"d/MM/y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\_"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",.B:qB%\",\"¤#,##0.00\",\"#E0\"],\"NZD\",\"$\",\"New Zealand Dollar\",{ZD\":[\"4k{Nx%en-TZ!en-TZ:$#(WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG	;QAClB=OAAO0|	
pd"WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAUN(
;`|	
p7+

hx@<eAAe,EAAC,aAAa0GSAAS,EAAC,UAAU,EAAC,gBAAgCUAAU,EAAC,CAAC,EAAC,cAAcqAP
i(QAAQ,EAAC,WAAW 

oBAAoBB
;	
v = F"(/, '').length;\n\nif (i === 1 && v === 047en-TZ\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pmW\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday^\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],uOJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"HH:mm\",\\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",.B:qD%\",\"¤#,##0.00\",\"#E0\"],\"TZS\",\"TSh\",\"Tanzanian Shilling\",{TZS\":[\"TSh3px%4es-UY!es-UY:$#WAAW,EAAE,EAAE,CAAC,CAAC,MAAM
=sBAAsB,EAAE,IAAI;IAE1K;QACP(#	GAAG,OAAO#-CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF=OAAO,EAAC,C'`AO|	
pFm
OAAO,EAAC,QAAQ,EAAC,WAAWpO|	
pFm
OAAO,EAAC,QAAQ,EAAC,WAAWp0-?-OAAOh$MAAM,EAAC,OAAO,EAAC,OAAO$WAAW,EAAC,WAAW0O`0-?-OAAOh$MAAM,EAAC,OAAO,EAAC,OAAO$WAAW,EAAC,WAAW0O
iBAAiB,EAAC,mBAAmB0=l

oBAAoB,EAAC,0BAA0CUAAU,EAAC,SAAS,EAAC,UAAUqAP
iUGAAG,EAAC,eAAe	
	(IAAI,C	
IAAI,C	
	(	D
	
	F	
	(	(	(	(	(	(	(	(	(	F	
IAAI,C	-D
IAAI,C	(	
	EAAE	
	EAAE
v = F"/, '').length, e:'e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0))& || !(e >= 0 && e <= 5))\n    return 4%es-UY\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"EIene`br.\",\"may.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"oct.\",\"nov.\",\"dic.\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"may`o\",\"junio\",\"julio\",\"agosto\",\"setiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],[[\"EIEne.\",\"Feb.\",\"Mar.\",\"Abr.\",\"May.\",\"Jun.\",\"Jul.\",\"Ago.\",\"Set.\",\"Oct.\",\"Nov.\",\"Dic.\"],[\"Enero\",\"Febrero\",\"Marzo\",\"Abril\",\"Mayo\",\"Junio\",\"Julio\",\"Agosto\",\"Setiembre\",\"Octubre\",\"Noviembre\",\"Diciembre\"]],[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",\"{1} {0}\",\"{1}, {0}\",u],[\",\"*F:q"¤ #,##0.00\",\"#E0\"],\"UYU\",\"$\",\"peso uruguayo\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"]_1SP\":[u,\"SD£\"],\"SYP\":[u,\"S£\"],\"TWD\":[u, ,\"UYU\":[\"$\"],\"UYW\":[\"UP\"],\"VEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plu
D^!Wx&
eAAe,CAAC,CIAAI,EUAAU>$
UAAU>$
oOAAO,E'CAACv
7export default [[[\"mitjanit\",\"mat.\",\"matí\",\"md\",\"tarda\",\"vespre\",\"nit\"],[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u],[[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u,u],[\"00:00\",[\"00:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"19:00\"],[\"19:00\",\"21:00\"],[\"21:00\",\"24:00\"]]];\n"]}ɡsx+ZW$ZW@VOAAO,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeC`
WAAW MZW	0,[6,0],[\"d/M/y\",\"dd MMM,y\",\"dd MMMM y\",\"EEEE, dd MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\USD\",\"US$\",\"US'-pUx ES%S?aAAa,EAAC,gBAAgBAGAAG,EAAC,iBAAiKCp#k%S	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aSZL\",\"E\",\"Swazi Lilangeni 
SZL\":[\"E38NxI4/P%P?q_YAAY63M	wBAAwB
 EAAC,mBAAmB,EPJJ(JD.(
2n
2(#P,do\",\"lu\",\"ma\",\"mi\",\"ju\",\"vi\",\"sa+o\",\"Lu\",\"Ma\",\"Mi\",\"Ju\",\"Vi\",\"Sapxp4u}H03;¤ -PYG\",\"Gs.\",\"guaraní paraPPYG\":[\"Gs.\",\"₲g\u,\"$kh&x.	44fr-S"fr-S?lB:>	(M	A`A	UAAU,EAAC,OAAO,EAAC,UAAU oM		




KAAK,EAAC,MAAM$

@SAAS,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,UAAU,EAAC,UAAUQ	M	WAAW,EAAC,WAAW=	oBAAoB,EAAC,oBAAoBQ	M	(
	8eAAe,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBUAAU,EAAC,aAAa!
IAAI,EAAC,gBAAgB,E.(.(t.(.(@(.(.(.(
(.(F.(.F.(.(
(##(J.
tF.(@(.(
(((J.(.(.(:
J.(

F.((MAAM$J#&i === 0 || iJfr-SY\",[[\"AM\",\"PM\"],u,u],u2im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"J?IOjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sepéc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],6,[5,6],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",\"{1}, &{0}\",\"{1} 'à' {0}\",u],[\",\",\" e#,##0.00 ¤\",\"#E0\"],\"SYP\",\"LS\",\"livre syrienne\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\"iCOP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],+\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\"EP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\"_:[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\"OHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"S<YP\":[\"LS\",\"£\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$#m$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"AKWdxu4 nl-SX!nl-SX@!	CAAC;IAEj lBQ\M	M	A:Fk		2UAAU*eM	KAAK3#
UAAUKAAKUAAU,UAAU,EAAC,UAAUQ	M	\QAAQ eAAe,EAAC,aAAaQ	M	(
	eAAe	B
CAAC,EAAC,cAAc!
\
wBAAwB
MAAM,EAAC,gCAAgC,EMAAM.(@(:
.(.(
P.FA
#*;\n\nif (i === 1 && v === 0)\n    return 1%nl-SX\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"Z\",\"M\",\"D\",\"W\",\"D\",\"V\",\"Z\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"]],u,[[\"J?I'jan.\",\"feb.\",\"mrt.\",\"apr.\",\"meilug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"v.C.\",\"n.C.\"],[\"v.Chr.\",\"n.Chr.\"],[\"voor Christus\",\"na CGhristus\"]],1,[6,0],[\"dd-MM-y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMMF {0}\",u,\"{1} 'om'tq%\",\"¤ #,##0.00;¤ -YANG\",\"NAf.\",\"Nederlands-Antilliaanse gulden\",{\"ANG\":[\"NAf.\"],\"AUD\":[\"AU$\",\"F"\"C$\",\"$\"],\"FJD\":[\"FJ$\",\"$\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"RUR\":[u,\"р.\"],\"SBD\":[\"SI$\",\"$\"],\"THB\":[\"฿\"],\"TWD\":[#XPF\":[],\"XXX=2vXhxw4%pt-MZ!pt-MZ@IAAI!@&zC\M	
	
UAAUQ	\M	
	

W	A
4QAAQ,EAAC,OAAO 
,eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa `AR	M	
WAAWB	UAAUQ	M	\M	
iBAAiB,EAAC,kBAAkBQ	M	(		^CAAC,EAAC,cAAc!
\

# EAAC,qBAAqB,E.(@(.((F7#&)i === Math.floor(i) && (i >= 0 && i <= 1)Ppt-MZ\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\"&,\"qui.\",\"sex.\",\"sáb.\"]],u,[[\"J?Ijan.\",\"fevPik+ut.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\8"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.!1pois de Cristo\"]],0,[6,0],[\"dd/MM/yy\",\"dd/MM/"u,\"{1} 'às' {0}\",u],[\",\",\" ]%\",\"#,##0.00 ¤\",\"#E0\"],\"MZN\",\"MTn\",\"metical moçambicano\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"MZN\":[\"MTn\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"​\"],\"RON\":[u,\"L\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"BwEx] en$en=0p0P
6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKWAAW,EAAC,UAAU,EAAC,QAAQ
6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK.
KAAK,EAAC,KAAKxVQAAQ,EAAC,WAAW(0KxgBAAgBBUAAUWAAW)+BAA+B,EN F>"en-SX\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],.[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"S(VJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BBC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/#,M(, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",oe).therlands Antillean Guilder\",{\"ANG\":[\"NAf. -USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}#Jlx MY$MY@aAAa,EAAC,gBAAgBAIAAI,EAAC,mBAAmKIAAI,CN>MY	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aKMYR\",\"RM\",\"Malaysian Ringgit\",{\"JPY\":[\"JP¥\",\"¥\"],\"MYR\":[\"RM3hF	bx mRW$RW@IAAI,EAAC,eAAeLIAAI,CN>RW	GRWF\",\"RF\",\"Rwandan Franc\",{\"JPY\":[\"JP¥\",\"¥\"],\"RWF\":[\"RF3f,wxd3fr-RW!fr-RW@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KkClCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQ:7P=







MAAMA)UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,CAAC,E1(


OAAO,EAAC,MAAM,EAAC,OAAOMAAMSAAS,EAAC,MAAM$SAAS,EAAC,MAAMLWAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoB@$++

eAAeBaAAad(SAAS,EAAC,YAAYIAAI,EAAC,gBAAgK(IAAI,CN(
IAAI,CN((
((
IAAI,CN(7(
(
(
(

IAAI,CNL
IAAI,CN#F
IAAI,CN
(
:W((
IAAI,CN
#F(
f
IAAI, e = parseInt(i	e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 &1& v === 0)) || !(e >= 0 && e <= 5))\n    return 4	%fr-RW\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sVjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,P[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ9M4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" B] %\",\"#,##0.00 ¤\",\"#E0\"],\"RWF\",\"RF\",\"franc rwandais\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[\"RF\",\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\("$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw0}B	x oK%K?GAAG,EAAC,uBAAuB Yr>K	MKYD\",\"$\",\"Cayman Islands Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"KYD\":[\"$3˾,hxv3(es-MX!es-MX@;QACP5AP
P_
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1CAAC,OAAO,EAAC,SAAS,E1"5,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWP5AiBAAiB,EAAC,mBAAmBPP
K
SAAS,EAAC,oBAAoB,EAAC,0BAA0BB
FWAAW,E1oEAAC,eAAe,E	"{F


(
(
(
(
(
(
(
(
F
(
(


(
#EAAE{EAAE,n,es-MX\",[[\"a. m.\",\"p. m.<om\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\"I,\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],u,[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"dd/MM/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' 	MMMM 'de'F, {0}\",u],[\".\",\",8e¤#,##0.00\",\"#E0\"],\"MXN\",\"$\",\"peso mexicano\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"p.\"],\"CAD\":[u,\"$\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"V\"],\"KRW\":[u,\"₩\"],\"MRO\":[\"MRU\"],\"MRU\":[\"UM\"],\"MXN\":[\"$\"],\"NZD\":[u`-&u,\"$\"],\"VND\":[u,\"₫\"],\"XAF\":[OF\":[]},\"ltr\", plural];\n"]}+x 34DZ$DZ@$QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB

F
(	K#
&

F
ZDZ6,[5,6>2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aDZD\",\"DA\",\"dinar algérienDZD\":[\"DAu!12MOx(n-TV"n-TV@!	CAAC;IAEj lBQ:#:?
A AQAAQ
UAAU,EAAC,QAAQ,EAAC,UAAU*x
+
fMAAM,EAAC,QAAQ,EAAC,WAAWUAAUz3:CAAC,EAAC,CAAC,eAAe,EAAC,aAAaz$?

!gBAAgMCAAC,EAAC,cAAc!JA#(QAAQ3mBAAmB4
k
*;\n\nif (i === 1 && v === 0)\n    return 1-&n-TV\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[:\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"JsIJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"HH:mm\",\T<u,\"{1} 'at'q%\",\"¤#,##0.00\",\"#E0\"],\"AUD\",\"$\",\"Australian Dollar\",{\"AUD\":[\"$\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}0sxH(-SV$SV@OA AIsBAAsB2
i_
		2
(\(
(
AESVW'%d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"sɓzn/3#USD\",\"$\",\"dólar estadounidenseN6рRFKP\":[u,\"FK£{XN\":[u,u/5RON\":[u,\"L\"],\"SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£VEF\":[u,\"BsFWg.qx	/(4fr-VU!fr-VU@lB:?
P@MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM
&8pp

MAAM,EAAC,MAAMSAAS,EAAC,MAAM,EAAC,OAAO`SAAS,EAAC,MAAM,EAAC,WAAWUAAUz$WAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoq>
!$QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB+
aAAa!JA#2YAAYk
IAAI,EAAC,gBAAgB
k
kF

k
k7
k
k
7
k(
	
\
k
k4
k
7(
(
(
	2\
(

k
k7
7(
	2\
k
k
k7
k

k
kF
(
	(MAAM`3&i === 0 || ifr-VU\",[[\"AM\",\"PMo<im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JsIjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM Vy\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[ \"{1} 'à' {0}\",u],[\",\",\" e#,##0.00 ¤\",\"#E0\"],\"VUV\",\"VT\",\"vatu vanuatuan\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"J£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\"3EP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤ITMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"%TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$!\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"VUV\":[\"VT\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}B 
9x \PW$PW@aAAa,EAAC,gBAAgBA`
WAAWLMPW	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aUSD\",\"US$\",\"US Dollar\",{IУ12xNBZ$BZ@VUAAU,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCGAAG,EAAC,eAAe_p7MBZ	0,[6,0],[\"dd/MM/yy\",\"dd-MMM-y\",\"dd MMMM y\",\"EEEE, dd MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"]/BZD\",\"$\",\"Belize Dollar\",{\"BZD\":[\"$\"],I`xL CY$CY@GAAG,EAAC,MAAM_mCY	EUR\",\"€\",\"EuroMkwjxt GY$GY@GAAG,EAAC,kBAAkB_p7MGY	2GYD\",\"$\",\"Guyanaese Dollar\",{\"GYD\":[\"$\"],IS#?mxt M%M?IAAI,EAAC,iBAAiB_/IAAI,CN1%M	MWK\",\"MK\",\"Malawian Kwacha MWK\":[\"MK36#pxs VU$VU@IAAI,EAAC,cAAc_HIAAI0VU	VUV\",\"VT\",\"Vanuatu Vatu5,\"VUV\":[\"VT#\Vrxktr-CY!tr-CY@	CAAC;IAEdPQ::_+GOAAO,EAAC,WAAW,EAAC,MAAM,EAAC,UAAU,EAAC,UAAU,EAAC,MAAM,EAAC,WAAW,CAAC,E1(
`#MAAM,EAAC,OAAO,EAAC,MAAMSAAS"OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ@$:(
gBAAgB@$++

*

eAAeD
{GAAG,EAAC,MAAM_/
IAAI,CN
p
p
IAAI,CNpp#*
;\n\nif (n === 1	4tr-CY\",[[\"öö\",\"ös\"],[\"ÖÖ\",\"ÖS\"],u],[[\"ÖÖ\",\"ÖS\"],u,u],[[\"P\",\"P\",\"S\",\"Ç\",\"P\",\"C\",\"C\"],[\"Paz\",\"Pzt\",\"Sal\",\"Çar\",\"Per\",\"Cum\",\"Cmt\"],[\"Pazar\",\"Pazartesi\",\"Salı\",\"Çarşamba\",\"Perşembe\",\"Cuma\",\"Cumartesi\"],[\"Pa\",\"Pt\",\"Sa\",\"Ça\",\"Pe\",\"Cu\",\"Ct\"]],u,[[\"O\",\"Ş\",\"M\",\"N\",\"M\",\"H\",\"T\",\"A\",\"E\",\"E\",\"K\",\"A\"],[\"Oca\",\"Şub\",\"Mar\",\"Nis\",\"May\",\"Haz\",\"Tem\",\"Ağu\",\"Eyl\",\"Eki\",\"Kas\",\"Ara\"],[\"Ocak\",\"Şubat\",\"Mart\",\"Nisan\",\"Mayıs\",\"Haziran\",\"Temmuz\",\"Ağustos\",\"Eylül\",\"Ekim\",\"Kasım\",\"Aralık\"]],u,[[K\"MÖ\",\"MS\"],u,[\"Milattan Önce\",\"Milattan Sonra\"]],1,[6,0],[\"d.MM.d MMMM y EEEEH {0}\",u,u,u],[\",\",\".(X%#,##0\",\"¤#,##0.00\",\"#E0\"],\"EUR\",\"€\",\"Euro\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"PHP\":[u,\"₱\"],\"ROSN\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"THB\":[\"฿\"],\"TRY\":[\"₺\"],\"TWD\":[\"NTˬ#x }-.BZ$BZ@	gBAAgQ	
n4
	(<(	BZBZD\",\"$\",\"dólar beliceño?
BZD\":[\"$-aUSD\":[u,\"l*#
]x X43YT$YT@YAAY*EAAC,MAAM,Eh?(YT.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ssEUR\",\"€\",\"euro_G8Hwxv$h"h9(QAAQ,EAAC,OAAOnQAAQ,EAAC,SAASH$SAASTSAAS,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS$
MAAMsBAAsB,EAAC,sBAAsB$QAAQ-gBAAgLWcAAc,EAAC,SAAStp@FiBAAiB,Eha\",[[\"SF\",\"YM\"],u,[\"Safiya\",\"Yamma\"]],[[\"SF\",\"YM\"],u,u],[[\"L\",\"L\",\"T\",\"L\",\"A\",\"J\",\"A\"],[\"Lah\",\"Lit\",\"Tal\",\"Lar\",\"Alh\",\"Jum\",\"Asa\"],[\"Lahadi\",\"Litinin\",\"Talata\",\"Laraba\",\"Alhamis\",\"Jummaʼa\",\"Asabar\"],[\"Lh\",\"Li\",\"Ta\",\"Lr\",\"Al\",\"Ju\",\"As\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"Y\",\"Y\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Fab\",\"Mar\",\"Afi\",\"May\",\"Yun\",\"Yul\",\"Agu\",\"Sat\",\"Okt\",\"Nuw\",\"Dis\"],[\"Janairu\",\"Faburairu\",\"Maris\",\"Afirilu\",\"Mayu\",\"Yuni\",\"Yuli\",\"Agusta\",\"Satumba\",\"Oktoba\",\"Nuwamba\",\"Disamba\"]],u,[[\"K.H\",\"BHYAI\"],u,[\"Kafin haihuwar annab\",\"Bayan haihuwar annab\"]],1,[6,0],[\"d/M/yy\",\"d MMM, W(\"{1} 'da' {0}\",\"{1} {0}\"],[\".\",\",:NaNd&f¤ #,##0.00\",\"#E0\"],\"NGN\",\"₦\",\"Nairar Najeriya\",{\"NGN\":[\"₦\"]},\"ltr\", plural];\n"]}Ux! 	eAAe,EAAE2d];\n"]}
0x g"g97x!x! 	eAAe,EAAE2];\n"]}I%x! 	eAAe,EAAE2];\n"]}
(Vxrpa&pa?l
"KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ'$
OAAO.
g(UAAUFiBAAiBWAAW,EAAC,aAAa?(GAAGXpa(Pاتوار\",\"پیر\",\"منگل\",\"بُدھ\",\"جمعرات\",\"جمعہ\",\"ہفتہ\"],u,u],u,[[\"1\",\"2\",\"3\",\"4\",	=ری\",\"فN
+2ئ\",\"جون\",\"جولائی\",\"اگست\",\"س
:,u],u,[[\"ايساپورو\",\"سں\"],u,u],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, dd MMMM y\"],[\"h:mm a\",\"h:Lmm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",-ePKR\",\"ر\",\"روپئیہ\",{OPKR\":[\"ر\",\"Rse3Nx ce"ceCEpx ks&ks?Gx pa&pa?F4x sd&sd?GLxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ccp-IN", [["AM", "PM"], u, u], u, [["𑄢𑄧", "𑄥𑄧", "𑄟𑄧", "𑄝𑄪", "𑄝𑄳𑄢𑄨", "𑄥𑄪", "𑄥𑄧"], ["𑄢𑄧𑄝𑄨", "𑄥𑄧𑄟𑄴", "𑄟𑄧𑄁𑄉𑄧𑄣𑄴", "𑄝𑄪𑄖𑄴", "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴", "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴", "𑄥𑄧𑄚𑄨"], ["𑄢𑄧𑄝𑄨𑄝𑄢𑄴", "𑄥𑄧𑄟𑄴𑄝𑄢𑄴", "𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴", "𑄝𑄪𑄖𑄴𑄝𑄢𑄴", "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴", "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴", "𑄥𑄧𑄚𑄨𑄝𑄢𑄴"], ["𑄢𑄧𑄝𑄨", "𑄥𑄧𑄟𑄴", "𑄟𑄧𑄁𑄉𑄧𑄣𑄴", "𑄝𑄪𑄖𑄴", "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴", "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴", "𑄥𑄧𑄚𑄨"]], u, [["𑄎", "𑄜𑄬", "𑄟", "𑄃𑄬", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪", "𑄃", "𑄥𑄬", "𑄃𑄧", "𑄚𑄧", "𑄓𑄨"], ["𑄎𑄚𑄪", "𑄜𑄬𑄛𑄴", "𑄟𑄢𑄴𑄌𑄧", "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪𑄣𑄭", "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴", "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴"], ["𑄎𑄚𑄪𑄠𑄢𑄨", "𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨", "𑄟𑄢𑄴𑄌𑄧", "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪𑄣𑄭", "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴", "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴"]], [["𑄎", "𑄜𑄬", "𑄟", "𑄃𑄬", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪", "𑄃", "𑄥𑄬", "𑄃𑄧", "𑄚𑄧", "𑄓𑄨"], ["𑄎𑄚𑄪𑄠𑄢𑄨", "𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨", "𑄟𑄢𑄴𑄌𑄧", "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪𑄣𑄭", "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴", "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴"], u], [["𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧", "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧"], u, u], 0, [0, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "#,##,##0.00¤", "#E0"], "INR", "₹", "𑄃𑄨𑄚𑄴𑄘𑄨𑄠𑄚𑄴 𑄢𑄪𑄛𑄨", { "BDT": ["৳"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "STD": [u, "Db"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ccp-IN.js.mapQx{"version":3,"file":"ccp-IN.js","sourceRoot":"","sources":["ccp-IN.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ccp-IN\",[[\"AM\",\"PM\"],u,u],u,[[\"𑄢𑄧\",\"𑄥𑄧\",\"𑄟𑄧\",\"𑄝𑄪\",\"𑄝𑄳𑄢𑄨\",\"𑄥𑄪\",\"𑄥𑄧\"],[\"𑄢𑄧𑄝𑄨\",\"𑄥𑄧𑄟𑄴\",\"𑄟𑄧𑄁𑄉𑄧𑄣𑄴\",\"𑄝𑄪𑄖𑄴\",\"𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴\",\"𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴\",\"𑄥𑄧𑄚𑄨\"],[\"𑄢𑄧𑄝𑄨𑄝𑄢𑄴\",\"𑄥𑄧𑄟𑄴𑄝𑄢𑄴\",\"𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴\",\"𑄝𑄪𑄖𑄴𑄝𑄢𑄴\",\"𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴\",\"𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴\",\"𑄥𑄧𑄚𑄨𑄝𑄢𑄴\"],[\"𑄢𑄧𑄝𑄨\",\"𑄥𑄧𑄟𑄴\",\"𑄟𑄧𑄁𑄉𑄧𑄣𑄴\",\"𑄝𑄪𑄖𑄴\",\"𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴\",\"𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴\",\"𑄥𑄧𑄚𑄨\"]],u,[[\"𑄎\",\"𑄜𑄬\",\"𑄟\",\"𑄃𑄬\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪\",\"𑄃\",\"𑄥𑄬\",\"𑄃𑄧\",\"𑄚𑄧\",\"𑄓𑄨\"],[\"𑄎𑄚𑄪\",\"𑄜𑄬𑄛𑄴\",\"𑄟𑄢𑄴𑄌𑄧\",\"𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪𑄣𑄭\",\"𑄃𑄉𑄧𑄌𑄴𑄑𑄴\",\"𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴\",\"𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴\"],[\"𑄎𑄚𑄪𑄠𑄢𑄨\",\"𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨\",\"𑄟𑄢𑄴𑄌𑄧\",\"𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪𑄣𑄭\",\"𑄃𑄉𑄧𑄌𑄴𑄑𑄴\",\"𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴\",\"𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴\"]],[[\"𑄎\",\"𑄜𑄬\",\"𑄟\",\"𑄃𑄬\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪\",\"𑄃\",\"𑄥𑄬\",\"𑄃𑄧\",\"𑄚𑄧\",\"𑄓𑄨\"],[\"𑄎𑄚𑄪𑄠𑄢𑄨\",\"𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨\",\"𑄟𑄢𑄴𑄌𑄧\",\"𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪𑄣𑄭\",\"𑄃𑄉𑄧𑄌𑄴𑄑𑄴\",\"𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴\",\"𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴\"],u],[[\"𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧\",\"𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧\"],u,u],0,[0,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"#,##,##0.00¤\",\"#E0\"],\"INR\",\"₹\",\"𑄃𑄨𑄚𑄴𑄘𑄨𑄠𑄚𑄴 𑄢𑄪𑄛𑄨\",{\"BDT\":[\"৳\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"STD\":[u,\"Db\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}BK浺xe/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ccp", [["AM", "PM"], u, u], u, [["𑄢𑄧", "𑄥𑄧", "𑄟𑄧", "𑄝𑄪", "𑄝𑄳𑄢𑄨", "𑄥𑄪", "𑄥𑄧"], ["𑄢𑄧𑄝𑄨", "𑄥𑄧𑄟𑄴", "𑄟𑄧𑄁𑄉𑄧𑄣𑄴", "𑄝𑄪𑄖𑄴", "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴", "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴", "𑄥𑄧𑄚𑄨"], ["𑄢𑄧𑄝𑄨𑄝𑄢𑄴", "𑄥𑄧𑄟𑄴𑄝𑄢𑄴", "𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴", "𑄝𑄪𑄖𑄴𑄝𑄢𑄴", "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴", "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴", "𑄥𑄧𑄚𑄨𑄝𑄢𑄴"], ["𑄢𑄧𑄝𑄨", "𑄥𑄧𑄟𑄴", "𑄟𑄧𑄁𑄉𑄧𑄣𑄴", "𑄝𑄪𑄖𑄴", "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴", "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴", "𑄥𑄧𑄚𑄨"]], u, [["𑄎", "𑄜𑄬", "𑄟", "𑄃𑄬", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪", "𑄃", "𑄥𑄬", "𑄃𑄧", "𑄚𑄧", "𑄓𑄨"], ["𑄎𑄚𑄪", "𑄜𑄬𑄛𑄴", "𑄟𑄢𑄴𑄌𑄧", "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪𑄣𑄭", "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴", "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴"], ["𑄎𑄚𑄪𑄠𑄢𑄨", "𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨", "𑄟𑄢𑄴𑄌𑄧", "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪𑄣𑄭", "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴", "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴"]], [["𑄎", "𑄜𑄬", "𑄟", "𑄃𑄬", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪", "𑄃", "𑄥𑄬", "𑄃𑄧", "𑄚𑄧", "𑄓𑄨"], ["𑄎𑄚𑄪𑄠𑄢𑄨", "𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨", "𑄟𑄢𑄴𑄌𑄧", "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", "𑄟𑄬", "𑄎𑄪𑄚𑄴", "𑄎𑄪𑄣𑄭", "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴", "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴"], u], [["𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧", "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧"], u, u], 0, [6, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "#,##,##0.00¤", "#E0"], "BDT", "৳", "𑄝𑄁𑄣𑄘𑄬𑄥𑄨 𑄑𑄬𑄋", { "BDT": ["৳"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "STD": [u, "Db"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ccp.js.mapUH^x2{"version":3,"file":"ccp.js","sourceRoot":"","sources":["ccp.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ccp\",[[\"AM\",\"PM\"],u,u],u,[[\"𑄢𑄧\",\"𑄥𑄧\",\"𑄟𑄧\",\"𑄝𑄪\",\"𑄝𑄳𑄢𑄨\",\"𑄥𑄪\",\"𑄥𑄧\"],[\"𑄢𑄧𑄝𑄨\",\"𑄥𑄧𑄟𑄴\",\"𑄟𑄧𑄁𑄉𑄧𑄣𑄴\",\"𑄝𑄪𑄖𑄴\",\"𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴\",\"𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴\",\"𑄥𑄧𑄚𑄨\"],[\"𑄢𑄧𑄝𑄨𑄝𑄢𑄴\",\"𑄥𑄧𑄟𑄴𑄝𑄢𑄴\",\"𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴\",\"𑄝𑄪𑄖𑄴𑄝𑄢𑄴\",\"𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴\",\"𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴\",\"𑄥𑄧𑄚𑄨𑄝𑄢𑄴\"],[\"𑄢𑄧𑄝𑄨\",\"𑄥𑄧𑄟𑄴\",\"𑄟𑄧𑄁𑄉𑄧𑄣𑄴\",\"𑄝𑄪𑄖𑄴\",\"𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴\",\"𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴\",\"𑄥𑄧𑄚𑄨\"]],u,[[\"𑄎\",\"𑄜𑄬\",\"𑄟\",\"𑄃𑄬\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪\",\"𑄃\",\"𑄥𑄬\",\"𑄃𑄧\",\"𑄚𑄧\",\"𑄓𑄨\"],[\"𑄎𑄚𑄪\",\"𑄜𑄬𑄛𑄴\",\"𑄟𑄢𑄴𑄌𑄧\",\"𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪𑄣𑄭\",\"𑄃𑄉𑄧𑄌𑄴𑄑𑄴\",\"𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴\",\"𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴\"],[\"𑄎𑄚𑄪𑄠𑄢𑄨\",\"𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨\",\"𑄟𑄢𑄴𑄌𑄧\",\"𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪𑄣𑄭\",\"𑄃𑄉𑄧𑄌𑄴𑄑𑄴\",\"𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴\",\"𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴\"]],[[\"𑄎\",\"𑄜𑄬\",\"𑄟\",\"𑄃𑄬\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪\",\"𑄃\",\"𑄥𑄬\",\"𑄃𑄧\",\"𑄚𑄧\",\"𑄓𑄨\"],[\"𑄎𑄚𑄪𑄠𑄢𑄨\",\"𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨\",\"𑄟𑄢𑄴𑄌𑄧\",\"𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴\",\"𑄟𑄬\",\"𑄎𑄪𑄚𑄴\",\"𑄎𑄪𑄣𑄭\",\"𑄃𑄉𑄧𑄌𑄴𑄑𑄴\",\"𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴\",\"𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴\",\"𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴\"],u],[[\"𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧\",\"𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧\"],u,u],0,[6,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"#,##,##0.00¤\",\"#E0\"],\"BDT\",\"৳\",\"𑄝𑄁𑄣𑄘𑄬𑄥𑄨 𑄑𑄬𑄋\",{\"BDT\":[\"৳\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"STD\":[u,\"Db\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}Qľ{xA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ce", [["AM", "PM"], u, u], u, [["кӀи", "ор", "ши", "кха", "еа", "пӀе", "шуо"], u, ["кӀира", "оршот", "шинара", "кхаара", "еара", "пӀераска", "шуот"], ["кӀи", "ор", "ши", "кха", "еа", "пӀе", "шуо"]], [["кӀ", "о", "ш", "кх", "е", "пӀ", "ш"], ["кӀи", "ор", "ши", "кха", "еа", "пӀе", "шуо"], ["кӀира", "оршот", "шинара", "кхаара", "еара", "пӀераска", "шуот"], ["кӀи", "ор", "ши", "кха", "еа", "пӀе", "шуо"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"], ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], u, [["в. э. тӀ. я", "в. э"], u, ["Ӏийса пайхамар вина де кхачале", "Ӏийса пайхамар вина дийнахь дуьйна"]], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "Терхьаш дац", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "RUB", "₽", "Российн сом", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "лей"], "RUB": ["₽"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ce.js.map;qKx export default [!	+x 3	be.js.map3NJx 5b.js.map-uEhx 3	gd.js.map3sx 3
kab.js.map9(x 3ks-Arab.js.mapTlMx 3	lb.js.map3mx 3pa-Arab.js.mapTV_x 3	sa.js.map32x 3sd-Arab.js.mapTeWx 3uz-Arab.js.mapU}ux 4	ea.js.map3ukxG/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i === 1 || (i === 2 || i === 3)) || (v === 0 && !(i % 10 === 4 || (i % 10 === 6 || i % 10 === 9)) || !(v === 0) && !(f % 10 === 4 || (f % 10 === 6 || f % 10 === 9))))
        return 1;
    return 5;
}
export default ["ceb", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["D", "L", "M", "M", "H", "B", "S"], ["Dom", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab"], ["Domingo", "Lunes", "Martes", "Miyerkules", "Huwebes", "Biyernes", "Sabado"], ["Dom", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab"]], u, [["E", "P", "M", "A", "M", "H", "H", "A", "S", "O", "N", "D"], ["Ene", "Peb", "Mar", "Abr", "May", "Hun", "Hul", "Ago", "Set", "Okt", "Nob", "Dis"], ["Enero", "Pebrero", "Marso", "Abril", "Mayo", "Hunyo", "Hulyo", "Agosto", "Setyembre", "Oktubre", "Nobyembre", "Disyembre"]], u, [["BC", "AD"], u, ["Sa Wala Pa Si Kristo", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'sa' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "PHP", "₱", "Philippine Piso", { "JPY": ["JP¥", "¥"], "USD": ["US $", "$"] }, "ltr", plural];
//# sourceMappingURL=ceb.js.map`'[xK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["cgg", [["AM", "PM"], u, u], u, [["S", "K", "R", "S", "N", "T", "M"], ["SAN", "ORK", "OKB", "OKS", "OKN", "OKT", "OMK"], ["Sande", "Orwokubanza", "Orwakabiri", "Orwakashatu", "Orwakana", "Orwakataano", "Orwamukaaga"], ["SAN", "ORK", "OKB", "OKS", "OKN", "OKT", "OMK"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["KBZ", "KBR", "KST", "KKN", "KTN", "KMK", "KMS", "KMN", "KMW", "KKM", "KNK", "KNB"], ["Okwokubanza", "Okwakabiri", "Okwakashatu", "Okwakana", "Okwakataana", "Okwamukaaga", "Okwamushanju", "Okwamunaana", "Okwamwenda", "Okwaikumi", "Okwaikumi na kumwe", "Okwaikumi na ibiri"]], u, [["BC", "AD"], u, ["Kurisito Atakaijire", "Kurisito Yaijire"]], 1, [0, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "UGX", "USh", "Eshiringi ya Uganda", { "JPY": ["JP¥", "¥"], "UGX": ["USh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=cgg.js.map̳rx#/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["chr", [["Ꮜ", "Ꮢ"], ["ᏌᎾᎴ", "ᏒᎯᏱᎢ"], ["ᏌᎾᎴ", "ᏒᎯᏱᎢᏗᏢ"]], [["ᏌᎾᎴ", "ᏒᎯᏱᎢ"], u, ["ᏌᎾᎴ", "ᏒᎯᏱᎢᏗᏢ"]], [["Ꮖ", "Ꮙ", "Ꮤ", "Ꮶ", "Ꮕ", "Ꮷ", "Ꭴ"], ["ᏆᏍᎬ", "ᏉᏅᎯ", "ᏔᎵᏁ", "ᏦᎢᏁ", "ᏅᎩᏁ", "ᏧᎾᎩ", "ᏈᏕᎾ"], ["ᎤᎾᏙᏓᏆᏍᎬ", "ᎤᎾᏙᏓᏉᏅᎯ", "ᏔᎵᏁᎢᎦ", "ᏦᎢᏁᎢᎦ", "ᏅᎩᏁᎢᎦ", "ᏧᎾᎩᎶᏍᏗ", "ᎤᎾᏙᏓᏈᏕᎾ"], ["ᏍᎬ", "ᏅᎯ", "ᏔᎵ", "ᏦᎢ", "ᏅᎩ", "ᏧᎾ", "ᏕᎾ"]], u, [["Ꭴ", "Ꭷ", "Ꭰ", "Ꭷ", "Ꭰ", "Ꮥ", "Ꭻ", "Ꭶ", "Ꮪ", "Ꮪ", "Ꮕ", "Ꭵ"], ["ᎤᏃ", "ᎧᎦ", "ᎠᏅ", "ᎧᏬ", "ᎠᏂ", "ᏕᎭ", "ᎫᏰ", "ᎦᎶ", "ᏚᎵ", "ᏚᏂ", "ᏅᏓ", "ᎥᏍ"], ["ᎤᏃᎸᏔᏅ", "ᎧᎦᎵ", "ᎠᏅᏱ", "ᎧᏬᏂ", "ᎠᏂᏍᎬᏘ", "ᏕᎭᎷᏱ", "ᎫᏰᏉᏂ", "ᎦᎶᏂ", "ᏚᎵᏍᏗ", "ᏚᏂᏅᏗ", "ᏅᏓᏕᏆ", "ᎥᏍᎩᏱ"]], u, [["BC", "AD"], u, ["ᏧᏓᎷᎸ ᎤᎷᎯᏍᏗ ᎦᎶᏁᏛ", "ᎠᏃ ᏙᎻᏂ"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} ᎤᎾᎢ {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US ᎠᏕᎳ", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"] }, "ltr", plural];
//# sourceMappingURL=chr.js.map3
0x Zexport default [[["Ꭲ", ᏗᏢ"], ["ᎢᎦ", ᏗᏢ"], u], [["ᎢᎦ", BᏗᏢ"], u, u], ["12:00", ["00:00", "12:00"], ["12:00", "24:00"]]"67x7{"version":3,"file":"pt.js","sourceRoot":"","sources":["pt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1K,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa,EAAC,QAAQ,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,WAAW,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,iBAAiB,EAAC,kBAAkB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,mBAAmB,EAAC,oBAAoB,EAAC,0BAA0B,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,iBAAiB,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === Math.floor(i) && (i >= 0 && i <= 1))\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4;\nreturn 5;\n}\n\nexport default [\"pt\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"sáb.\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"sáb.\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan.\",\"fev.\",\"mar.\",\"abr.\",\"mai.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.C.\"],u,[\"antes de Cristo\",\"depois de Cristo\"]],0,[6,0],[\"dd/MM/y\",\"d 'de' MMM 'de' y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"BRL\",\"R$\",\"Real brasileiro\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"Esc.\"],\"RON\":[u,\"L\"],\"SYP\":[u,\"S£\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}+zVx_#gv!gv:!
CAAC;IAEjG?GAAG,EAAE,KAAK,CAAC;QACvB+3GAAG,EAAE,KAAK,CAAC;QACvB+8GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACxG+c;QACVQ~(_	U
CAAC,KAAK,EAAC,KAAK,EAAC,KAAK@KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS<,QAAQ,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAKKAAK,EAAC,KAAKoAIAAI,EAAC,IAAI'CAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ<EAAC,WAAW,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,WAAW,CAAC,EAAC,CAAC,eAAe,EAAC,iBAAiB,EAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,aAAa,EAAC,8eAAe,EAAC,WAAW,EAAC,aAAa,EAAC,eAAe,EAAC,YAAY,EAAC,gBAAgBoJF_	_	BgBAAgWAAW+	EAAC,KAAK	m/		;\n\nif (v === 0 && i % 10 === 1)\n    return 1;\nif (v === 0 && i % 10 === 2)\n    return 2;\nif (v === 0 && (i % 100 === 0 || (i % 100 === 20 || (i % 100 === 40 || (i % 100 === 60 || i % 100 === 80)))))\n    return 3;\nif (!(v === 0))\n    return 4;\nr!gv\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Jed\",\"Jel\",\"Jem\",\"Jerc\",\"Jerd\",\"Jeh\",\"Jes\"],[\"Jedoonee\",\"Jelhein\",\"Jemayrt\",\"Jercean\",\"Jerdein\",\"Jeheiney\",\"Jesarn\"],[\"Jed\",\"Jel\",\"Jem\",\"Jerc\",\"Jerd\",\"Jeh\",\"Jes\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"J-guer\",\"T-arree\",\"Mayrnt\",\"Avrril\",\"Boaldyn\",\"M-souree\",\"J-souree\",\"Luanistyn\",\"M-fouyir\",\"J-fouyir\",\"M-Houney\",\"M-Nollick\"],[\"Jerrey-geuree\",\"Toshiaght-arree\",\"Mayrnt\",\"Averil\",\"Boaldyn\",\"Mean-souree\",\"Jerrey-souree\",\"Luanistyn\",\"Mean-fouyir\",\"Jerrey-fouyir\",\"Mee Houney\",\"Mee ny Nollick\"]],u,[[\"RC\",\"AD\"],u,u],1,[6,0],[\"y-MM-dd\",\"y MMM !d\",\"y MMMM d\",\"y MMMM d, EEEEU.\",\",Ce,#,##0.00\",\"#E0\"],\"GBP\",\"£\",\"GBP\",{-C/x9dyo!dyo:	CAAC;IAEd%)KAAKVA-


4-
OAAO
-


([[[[[7@MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,IAAI,EAAC,WAAW#
4
cAAc,EAAC,cAAc=-
eAAe
YAAY+OAAO,EAAC,kBAAkBX;\n$dyo\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"T\",\"T\",\"A\",\"A\",\"A\",\"S\"],[\"Dim\",\"Ten\",\"Tal\",\"Ala\",\"Ara\",\"Arj\",\"Sib\"],[\"Dimas\",\"Teneŋ\",\"Talata\",\"Alarbay\",\"Aramisay\",\"Arjuma\",\"Sibiti\"],[\"Dim\",\"Ten\",\"Tal\",\"Ala\",\"Ara\",\"Arj\",\"Sib\"]],u,[[\"S\",\"F\",\"M\",\"A\",\"M\",\"S\",\"S\",\"U\",\"S\",\"O\",\"N\",\"D\"],[\"Sa\",\"Fe\",\"Ma\",\"Ab\",\"Me\",\"Su\",\"Sú\",\"Ut\",\"Se\",\"Ok\",\"No\",\"De\"],[\"Sanvie\",\"Fébirie\",\"Mars\",\"Aburil\",\"Mee\",\"Sueŋ\",\"Súuyee\",\"Ut\",\"Settembar\",\"Oktobar\",\"Novembar\",\"Disambar\"]],u,[[\"ArY\",\"AtY\"],u,[\"Ariŋuu Yeesu\",\"Atooŋe Yeesu\"]],;1,[6,0],[\"d/M/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM yU,\",\" c>#,##0.00 ¤\",\"#E0\"],\"XOF\",\"F CFA\",\"seefa yati BCEAOMx;UwxRewo!ewo:	CAAC;IAEd%)"KAAK,EAAC,CAAC,CAAC,SAAS,EAAC,WAAW)A#
4~

oBAAoB,EAAC,oBAAoB,EAAC,oBAAo#
F





CAAC,EAAC,C"YAAY,EAAC,WAAW.$&YAAY,EAAC,WAAW,EAAC,mBAAmB,EAAC,kBAAkB$
4
mBAAmB,EAAC,mBAAmB=-
eAAe
YAAY+MAAM,EAAC,kBAAkBX;\n$ewo\",[[\"kíkíríg\",\"ngəgógəle\"],u,u],u,[[\"s\",\"m\",\"s\",\"s\",\"s\",\"f\",\"s\"],[\"sɔ́n\",\"mɔ́n\",\"smb\",\"sml\",\"smn\",\"fúl\",\"sér\"],[\"sɔ́ndɔ\",\"mɔ́ndi\",\"sɔ́ndɔ məlú mə́bɛ̌\",\"sɔ́ndɔ məlú mə́lɛ́\",\"sɔ́ndɔ məlú mə́nyi\",\"fúladé\",\"séradé\"],[\"sɔ́n\",\"mɔ́n\",\"smb\",\"sml\",\"smn\",\"fúl\",\"sér\"]],u,[[\"o\",\"b\",\"l\",\"n\",\"t\",\"s\",\"z\",\"m\",\"e\",\"a\",\"d\",\"b\"],[\"ngo\",\"ngb\",\"ngl\",\"ngn\",\"ngt\",\"ngs\",\"ngz\",\"ngm\",\"nge\",\"nga\",\"ngad\",\"ngab\"],[\"ngɔn osú\",\"ngɔn bɛ̌\",\"ngɔn lála\",\"ngɔn nyina\",\"ngɔn tána\",\"ngɔn saməna\",\"ngɔn zamgbála\",\"ngɔn mwom\",\"ngɔn ebulú\",\"ngɔn awóm\",\"ngɔn awóm ai dziá\",\"ngɔn awóm ai b̌\"]],u,[[\"oyk\",\"ayk\"],u,[\"osúsúa Yésus kiri\",\"ámvus Yésus Kirís\"]],1,[6,0],[\"d/M/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM yU,\",\" c>#,##0.00 ¤\",\"#E0\"],\"XAF\",\"FCFA\",\"Fəláŋ CFA (BEAC)M&(]Xx$ku!ku:	CAAC;IAEd;QACPQFA[[~
OAAO,EAAC,OAAOIAAI,EAAC,MAAM,CAAC,E[[	EAAC,GAAG$ZF







4OAAO$pfWAAW,EAAC,YAAY,CY2-







4"QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO$(aAAa,EAAC,cAAckYAAY+o|
;\n\nif (n
"ku\",[[\"BN\",\"PN\"],u,u],u,[[\"Y\",\"D\",\"S\",\"Ç\",\"P\",\"Î\",\"Ş\"],[\"yş\",\"dş\",\"sş\",\"çş\",\"pş\",\"în\",\"ş\"],[\"yekşem\",\"duşem\",\"sêşem\",\"çarşem\",\"pêncşem\",\"în\",\"şemî\"],[\"yş\",\"dş\",\"sş\",\"çş\",\"pş\",\"în\",\"ş\"]],u,[[\"R\",\"R\",\"A\",\"A\",\"G\",\"P\",\"T\",\"G\",\"R\",\"K\",\"S\",\"B\"],[\"rêb\",\"reş\",\"ada\",\"avr\",\"gul\",\"pûş\",\"tîr\",\"gel\",\"rez\",\"kew\",\"ser\",\"ber\"],[\"rêbendanê\",\"reşemiyê\",\"adarê\",\"avrêlê\",\"gulanê\",\"pûşperê\",\"tîrmehê\",\"gelawêjê\",\"rezberê\",\"kewçêrê\",\"sermawezê\",\"berfanbarê\"]],[[\"R\",\"R\",\"A\",\"A\",\"G\",\"P\",\"T\",\"G\",\"R\",\"K\",\"S\",\"B\"],[\"rêb\",\"reş\",\"ada\",\"avr\",\"gul\",\"pûş\",\"tr\",\"gel\",\"rez\",\"kew\",\"ser\",\"ber\"],[\"rêbendan\",\"reşemî\",\"adar\",\"avrêl\",\"gulan\",\"pûşper\",\"tîrmeh\",\"gelawêj\",\"rezber\",\"kewçêr\",\"sermawez\",\"berfanbar\"]],[[\"BZ\",\"PZ\"],u,[\"berî zayînê\",\"piştî zayînê\"],\",\".X8%#,##0\",\"#,##0.00 ¤\",\"#E0\"],\"TRY\",\"₺\",\"TRY TRY\":[\"₺31Bxp	(mt!mt:	CAAC;IAEd;QACP
5IAAIGAAG,IAAI,EAAE,CAAC;QAC7E
52IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QACnEQ
L#[#





4_

WAAW,EAAC,SAAS,CAAC




[[[
o





4_

WAAW,EAAC,SAAS,CAAC




_F







4~
JMAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,WAAWC[[[[[#










4~
JMAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,WAAWC(cAAc,EAAC,aAAaG
EAAC,sBAAs8MAAM,EAAC,EAAC,KAAKIAAI3
|
;\n\nif (n
Ln === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 10PBn % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 19p5mt\",[[\"am\",\"pm\"],[\"AM\",\"PM\"],u],u,[[\"Ħd\",\"T\",\"Tl\",\"Er\",\"Ħm\",\"Ġm\",\"Sb\"],[\"Ħad\",\"Tne\",\"Tli\",\"Erb\",\"Ħam\",\"Ġim\",\"Sib\"],[\"Il-Ħadd\",\"It-Tnejn\",\"It-Tlieta\",\"L-Erbgħa\",\"Il-Ħamis\",\"Il-Ġimgħa\",\"Is-Sibt\"],[\"Ħad\",\"Tne\",\"Tli\",\"Erb\",\"Ħam\",\"Ġim\",\"Sib\"]],[[\"Ħd\",\"Tn\",\"Tl\",\"Er\",\"Ħm\",\"Ġm\",\"Sb\"],[\"Ħad\",\"Tne\",\"Tli\",\"Erb\",\"Ħam\",\"Ġim\",\"Sib\"],[\"Il-Ħadd\",\"It-Tnejn\",\"It-Tlieta\",\"L-Erbgħa\",\"Il-Ħamis\",\"Il-Ġimgħa\",\"Is-Sibt\"],[\"Ħad\",\"Tne\",\"Tli\",\"Erb\",\"Ħam\",\"Ġim\",\"Sib\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"Ġ\",\"L\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Fra\",\"Mar\",\"Apr\",\"Mej\",\"Ġun\",\"Lul\",\"Aww\",\"Set\",\"Ott\",\"Nov\",\"Diċ\"],[\"Jannar\",\"Frar\",\"Marzu\",\"April\",\"Mejju\",\"Ġunju\",\"Lulju\",\"Awwissu\",\"Settembru\",\"Ottubru\",\"Novembru\",\"Diċembru\"]],[[\"Jn\",\"Fr\",\"Mz\",\"Ap\",\"Mj\",\"Ġn\",\"Lj\",\"Aw\",\"St\",\"Ob\",\"Nv\",\"Dċ\"],[\"Jan\",\"Fra\",\"Mar\",\"Apr\",\"Mej\",\"Ġun\",\"Lul\",\"Aww\",\"Set\",\"Ott\",\"Nov\",\"Diċ\"],[\"Jannar\",\"Frar\",\"Marzu\",\"April\",\"Mejju\",\"Ġunju\",\"Lulju\",\"Awwissu\",\"Settembru\",\"Ottubru\",\"Novembru\",\"Diċembru\"]],[[\"QK\",\"WK\"],u,[\"Qabel Kristeu\",\"Wara Kristu\"]],0,[6,0],[\"dd/MM/y\",\"dd MMM y\",\"d 'ta'’ MMMM y\",\"EEEE, d 'ta'’ MMMM y,EUR\",\"€\",\"ewro\",{\"BYN\":[u,\"р.\"],PHP\":[u,\"₱3H.Bxmzn!mzn:	CAAC;IAEd%)KAAKVA-


4iV2TOAAO,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO
WAAW,EAAC,WAAWkYAAY+
YAAY,EAAC,EAAC,KAAKIAAI3
;\n$mzn\",[[\"AM\",\"PM;:Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],u,uUژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"],u],u,[[\"پ.م\",\"م.\"],u,[\"قبل میلاد\",\"بعد میلاد\"]],6,[5,5 ;IRR\",\"IRR\",\"ایران ریال\",{\"BYN\":[u,\"р.\"],)PHP\":[u,\"₱\"]},\"rtl\", plural];\n"]}Li3x`sat!sat:	CAAC;IAEd;QACP;QACP=KAAK8-
OAAO,C7FVKAAK-
KAAK,EAAC,MAAM 
	OAAO,CAACVKAAK5ZF
IAAI



4_

@MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,WAAW#YAAY,EAAC,MAAM)~
~
WAAW,EAAC,aAAa_YAAY+)kBAAkBX
;\n\nif (n
n
"sat\",[[\"AM\",\"PM\"],u,[\"ᱥᱮᱛᱟᱜ\",\"ᱧᱤᱫᱟᱹ\"]],[[\"AM\",\"PM\"],u,u],[[\"ᱥ\",\"ᱚ\",\"ᱵ\",\"ᱥ\",\"\",\"ᱡ\",\"ᱧ\"],[\"ᱥᱤᱸ\",\"ᱚᱛ\",\"ᱵᱟ\",\"ᱥᱟᱹ\",\"ᱥᱟᱹᱨ\",\"ᱡᱟᱹ\",\"ᱧᱩ\"],[\"ᱥᱤᱜᱮ\",\"ᱚᱛᱮ\",\"ᱵᱟᱞᱮ\",\"ᱥᱟᱹᱜᱩᱱ\",\"ᱥᱟᱹᱨᱫᱤ\",\"ᱡᱟᱹᱨᱩᱢ\",\"ᱧᱩᱦᱩᱢ\"],[\"ᱥᱤᱸ\",\"ᱚᱛ\",\"ᱵᱟ\",\"ᱥᱟᱹ\",\"ᱥᱟᱹᱨ\",\"ᱡᱟᱹ\",\"ᱧᱩ\"]],u,[[\"ᱡ\",\"ᱯ\",\"ᱢ\",\"ᱟ\",\"ᱢ\",\"ᱡ\",\"ᱡ\",\"ᱟ\",\"ᱥ\",\"ᱚ\",\"ᱱ\",\"ᱫ\"],[\"ᱡᱟᱱ\",\"ᱯᱷᱟ\",\"ᱢᱟᱨ\",\"ᱟᱯᱨ\",\"ᱢᱮ\",\"ᱡᱩᱱ\",\"ᱡᱩᱞ\",\"ᱟᱜᱟ\",\"ᱥᱮᱯ\",\"ᱚᱠᱴ\",\"ᱱᱟᱣ\",\"ᱫᱤᱥ\"],[\"ᱡᱟᱱᱟᱨᱤ\",\"ᱯᱷᱟᱨᱣᱟᱨᱤ\",\"ᱢᱟᱨᱪ\",\"ᱟᱯᱨᱮᱞ\",\"ᱢᱮ\",\"ᱡᱩᱱ\",\"ᱡᱩᱞᱟᱭ\",\"ᱜᱟᱥᱛ\",\"ᱥᱮᱯᱴᱮᱢᱵᱟᱨ\",\"ᱚᱠᱴᱚᱵᱟᱨ\",\"ᱱᱟᱣᱟᱢᱵᱟᱨ\",\"ᱫᱤᱥᱟᱢᱵᱟᱨ\"]],u,[[\"ᱥᱮᱨᱢᱟ ᱞᱟᱦᱟ\",\"ᱤᱥᱣᱤ\"],u,u],0,[0,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM; y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a <INR\",\"₹\",\"ᱥᱤᱧᱚᱛ ᱨᱮᱱᱟᱜ ᱴᱟᱠᱟMKaxKur!ur:J	;QAClBQ7F-
KAAKQAAQ(Z(-
OAAO,EAAC,MAAM,EAAC,OAAO6QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAOUAAU,EAAC,OAAO)~
UAAU,EAAC,WAAW,EAAC,iBAAiBnWAAW,EAAC,aAAa_ZV
2YAAY+IAAI,EAAC,gBAAgB,EAAC,EAAC,KAAKIAAI3
|IAAI|#!i === 1 && v === 0)\n    return 1%<ur\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u]1اتوار\",\"پیر\",\"منگل\",\"بدھ\",\"جمعرات\",\"جمعہ\",\"ہفتہ\"],u,u],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"جنوری\",\"فروری\",\"مارچ\",\"اپریل\",\"مئی\",\"جون\",\"جولائی\",\"اگست\",\"ستمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"],u],u,[[\"قبل مسیح\",\"عیسوی\"],u,u],0,[6,0],[\"d/M/yy\",\"d MMM، y\",\"d MMMM، y\",\"EEEE، d MMMM، y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a8‎+\",\"‎3N BPKR\",\"Rs\",\"پاکستانی روپیہ\",{\"BYN\":[u,\"р.\"],^PHP\":[u,\"₱\"],\"PKR\":[\"Rs\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"rtl\", plural];\n"]}6uxises!ses<ѓ%_
;_
N
/EAAC,UAAU,EAAC,QAAQ,EAAC,WAAW
IAAIIAAI)PSAAS,EAAC,WAAW,EAAC,OAAOUAAU,EAAC,WAAW,EAAC,WAAW_
-
sK
UAAUWAAW0ses\",[[\"Adduha\",\"Aluula\"],u,u],u,[[\"H\",\"T\",\"T\",\"L\",\"L\",\"L\",\"S\"],[\"Alh\",\"Ati\",\"Ata\",\"Ala\",\"Alm\",\"Alz\",\"Asi\"],[\"Alhadi\",\"Atinni\",\"Atalaata\",\"Alarba\",\"Alhamiisa\",\"Alzuma\",\"Asibti\"],[\"Alh\",\"Ati\",\"Ata\",\"Al&a\",\"Alm\",\"Alz\",\"Asi\"]],u,[[\"Ž,		Ž\",\"ŽP	%Žan\",\"Fee\",\"Mar\",\"Awi\",\"Me\",\"Žuw\",\"Žuy\",\"Ut\",\"Sek\",\"Okt\",\"Noo\",\"Dee\"],[\"Žanwiye\",\"Feewiriye\",\"Marsi\",\"Awiril\",\"Me\",\"Žuweŋ\",\"Žuyye\",\"Ut\",\"Sektanbur\",\"Oktoobur\",\"Noowanbur\",\"Deesanbur\"]],u,[[\"IJ\",\"IZ#\"],u,[\"Isaa jine\",\"Isaa zamanoo
,
v. s#CFA Fraŋ (BCEAO)M1pkZxK(chr!chr:R(KAAKlMAAMQAAQ,C	KAAK,EAAC,MAAM	
QAAQ,C	|APySAAS$QAAQ/2	|/P_#OAAOP$LOAAO,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,C		
iBAAiB,EAAC,QAAQ,C		
iBAAiBp?

8aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,aAAa	QAAQp
x"chr\",[[\"Ꮜ\",\"Ꮢ\"],[\"ᏌᎾᎴ\",\"ᏒᎯᏱᎢ\"],[\"ᏌᎾᎴ\",\"ᏒᎯᏱᎢᏗᏢ\"]],[[\"ᏌᎾᎴ\",\"ᏒᎯᏱ\"],u,[\"ᏌᎾᎴ\",\"ᏒᎯᏱᎢᏗᏢ\"]],[[\"Ꮖ\",\"Ꮙ\",\"Ꮤ\",\"Ꮶ\",\"Ꮕ\",\"Ꮷ\",\"Ꭴ\"],[\"ᏆᏍᎬ\",\"ᏉᎯ\",\"ᏔᎵᏁ\",\"ᏦᎢᏁ\",\"ᏅᎩᏁ\",\"ᏧᎾᎩ\",\"ᏈᏕᎾ\"],[\"ᎤᎾᏙᏓᏆᏍᎬ\",\"ᎤᎾᏙᏓᏉᏅ\",\"ᏔᎵᏁᎢᎦ\",\"ᏦᎢᏁᎢᎦ\",\"ᏅᎩᏁᎢᎦ\",\"ᏧᎾᎩᎶᏍᏗ\",\"ᎤᎾᏙᏓᏈᏕᎾ\"],[\"ᏍᎬ\",\"ᏅᎯ\",\"ᏔᎵ\",\"ᏦᎢ\",\"ᏅᎩ\",\"ᏧᎾ\",\"ᏕᎾ\"]],u,[[\"Ꭴ\",\"Ꭷ\",\"Ꭰ\",\"Ꭷ\",\"Ꭰ\",\"Ꮥ\",\"Ꭻ\",\"Ꭶ\",\"Ꮪ\",\"Ꮪ\",\"Ꮕ\",\"Ꭵ\"],[\"ᎤᏃ\",\"ᎧᎦ\",\"ᎠᏅ\",\"ᎧᏬ\",\"ᎠᏂ\",\"ᏕᎭ\",\"ᎫᏰ\",\"Ꭶ\",\"ᏚᎵ\",\"ᏚᏂ\",\"ᏅᏓ\",\"ᎥᏍ\"],[\"ᎤᏃᎸᏔᏅ\",\"ᎧᎦᎵ\",\"ᎠᏅᏱ\",\"ᎧᏬᏂ\",\"ᎠᏂᏍᎬ\",\"ᏕᎭᎷᏱ\",\"ᎫᏰᏉᏂ\",\"ᎦᎶᏂ\",\"ᏚᎵᏍᏗ\",\"ᏚᏂᏅᏗ\",\"ᏅᏓᏕᏆ\",\"ᎥᏍᎩᏱ\"]],u,[[\"BC\",\"AD\"],u,[\"ᏧᏓᎷᎸ ᎤᎷᎯᏍᏗ ᎦᎶᏁᏛ\",\"ᎠᏃ ᏙᎻᏂ\"]],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} ᎤᎾᎢ {0}\"CUSD\",\"$\",\"US ᎠᏕᎳE=:[z|x4($i"i9EAAE,CAAC,GAAG$CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,GAPAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KlBCAAC,CAAC,CAAC,KAAK,CAACiOAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF=|APyUAAU,EAAC,QAAQ$SAAS,EAAC,QAAQQ	|	,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ/
-	"MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,eAAeGUAAU,Ec	E	2UAAU,EAAC,CAAC,EAAC,SAAS	YAAY,EAAC,KAAK
b
P
(
(
(
(
(
(
(
KAAK


KAAK
B
, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 1 && v === 0)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 &&  v === 0)) || !(e >= 0 && e <= 5e5it\",[[\"m.\",\"p.D\",\"L\",\"M\",\"M\",\"G\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mer\",\"gio\",\"ven\",\"sab\"],[\"domenica\",\"lunedì\",\"martedì\",\"mercoledì\",\"giovedì\",\"venerdì\",\"sabato\"],[\"dom\",\"lun\",\"mar\",\"mer\",\"gio\",\"ven\",\"sab\"]],u,[[\"GG+gen\",\"feb\",\"mar\",\"apr\",\"mag\",\"giu\",\"lug\",\"ago\",\"set\",\"ott\",\"nov\",\"dic\"],[\"gennaio\",\"febbraio\",\"marzo\",\"aprile\",\"maggio\",\"giugno\",\"luglio\",\"agosto\",\"settembre\",\"ottobre\",\"novembre\",\"dicembre\"]],u,[[\"aC\",\"dC\"],[\"a.C.\",\"d.C.\"],[\"avanti Cristo\",\"dopo Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"]A#, {0}\",u,\"{1} {0}\",u],[\",\",\".Qc#,##0.00 ¤uro\",{\"BRL\":[u,\"R$\"],\"BYN\":[u,\"Br\"],\"EGP\":[u,\"£E\"],\"HKD\":[u,\"$\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NOK\":[u,\"NKr\"],\"THB\":[\"฿\"],\"TWD\":[u,\"NT$\"],\"USD\":[u,\"$\"],\"VND\":[u,\"₫\"<9Fiwx
(/l"l9EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAE9E,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAACEjD$EAAE$EAAE;EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAACElGCAAC,CAAC,KAAK,CAAC,CAAC;QACV=QQAAQ,EAAC,MAAM
	|A/20aAAa,EAAC,aAAa,EAAC,aAAa,EAAC,cAAc,EAAC,gBAAgB,E/2	|"OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMBQAAQ,EAAC,QAAQpSAAS,EAAC,MAAM$5

5
|"OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMBQAAQ,EAAC,QAAQpSAAS,EA	QAAQ,EAAC,UAAU,EAAC,OAAO5

	SAAS,EAAC,QAAQ	UCAAC,EAAC,oBAAoB,EAAC,0BAA04	l

	
(
YAAY,EAAC,KAAK
GAAG,EAAC,OAAOp
$


EAAEu
=
(
(
(
(
#EAAE,EAAC,KAAK,EAAC,EAAE
8EAAE
8EAAE,EAAC,KAAK,EAAC,EAAE
=
(
(
(
(
(
(
#EAAE,EAAC,KAAK,EAAC,EAAE
8EAAE,EAAC,KAAK,EAAC,EAAE[, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (n % 10 === 1 && !F.1;\nif (n % 1&) && (n % 10 >= 2 && n % 10 <= 9) && !F.3;\nif (!(f === 0e5lt\",[[\"pr. p.\",\"pop.\"],[\"priešpiet\",\"popiet\"],u],u,[[\"S\",\"P\",\"A\",\"T\",\"K\",\"P\",\"Š\"],[\"sk\",\"pr\",\"an\",\"tr\",\"kt\",\"pn\",\"št\"],[\"sekmadienis\",\"pirmadienis\",\"antradienis\",\"trečiadienis\",\"ketvirtadienis\",\"penktadienis\",\"šeštadienis\"],[\"Sk\",\"Pr\",\"An\",\"Tr\",\"Kt\",\"Pn\",\"Št\"]],u,[[\"S\",\"V\",\"K\",\"B\",\"G\",\"B\",\"L\",\"R\",\"R\",\"S\",\"L\",\"G\"],[\"saus.\",\"vas.\",\"kov.\",\"bal.\",\"geg.\",\"birž.\",\"liep.\",\"rugp.\",\"rugs.\",\"spal.\",\"lapkr.\",\"gruod.\"],[\"sausio\",\"vasario\",\"kovo\",\"balandžio\",\"gegužės\",\"birželio\",\"liepos\",\"rugpjūčio\",\"rugsėjo\",\"spalio\",\"lapkričio\",\"gruodžio\"]],[[\"S\",\"V\",\"K\",\"B\",\"G\",\"B\",\"L\",\"R\",\"R\",\"S\",\"L\",\"G\"],[\"saus.\",\"vas.\",\"kov.\",\"bal.\",\"geg.\",\"birž.\",\"liep.\",\"rugp.\",\"rugs.\",\"spal.\",\"lapkr.\",\"gruod.\"],[\"sausis\",\"vasaris\",\"kovas\",\"balandis\",\"gegužė\",\"birželis\",\"liepa\",\"rugpjūtis\",\"rugsėjis\",\"spalis\",\"lapkritis\",\"gruodis\"]],[[\"pr. Kr.\",\"po Kr.\"],u,[\"prieš Kristų\",\"po Kristaus\"]],1,[6,0],[\"y-MM-dd\",u,\"y 'm'. MMMM d" 'd'.\",\"y 'm'. MMMM d 'd'., EEEEU,\",\" Q−\",\"×10^o? %\",\"#,##0.00 ¤Euras\",{\"AUD\":[u,\"$\"],\"BDT\":[],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"Br\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"GBP\":[u,\"\"],\"HKD\":[u,\"$\"],\"ILS\":[],\"INR\":[],\"JPY\":[u,\"¥\"],\"KHR\":[],\"KRW\":[u,\"₩\"],\"LAK\":[],\"MNT\":[],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$PLN\":[u,\"zl\"],\"PYG\":[u,\"Gs\"],\"RUB\":[u,\"rb\"],\"TWD\":[u,\"$\"],\"USD\":[u,\"$\"],\"VND\":[],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[],\"XPF\":[<7@Lx0(as"as:R("KAAK,EAAC,CAAC,CAAC,WAAW,EAAC,QAAQ	)	|APyQAAQE	P	|ZUMAAMPNMAAM,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,qBAAqB,EAAC,sBAAsBeAAe,EAAC,QAAQ,E		
aAAa,EAAC,YAAY,C		gBAAg4	.`
oBAAoBp

(KAAK
x#as\",[[\"Ɛnkakɛnyá\",\"Ɛndámâ\"],u,u],u,[[\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"1\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"],[\"Jumapílí\",\"Jumatátu\",\"Jumane\",\"Jumatánɔ\",\"Alaámisi\",\"Jumáa\",\"Jumamósi\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"Dal\",\"Ará\",\"Ɔɛn\",\"Doy\",\"Lép\",\"Rok\",\"Sás\",\"Bɔ́r\",\"Kús\",\"Gís\",\"Shʉ́\",\"Ntʉ́\"],[\"Oladal́\",\"Arát\",\"Ɔɛnɨ́ɔɨŋɔk\",\"Olodoyíóríê inkókúâ\",\"Oloilépūnyīē inkókúâ\",\"Kújúɔrɔk\",\"Mórusásin\",\"Ɔlɔ́ɨ́bɔ́rárɛ\",\"Kúshîn\",\"Olgísan\",\"Pʉshʉ́ka\",\"Ntʉ́ŋʉ́s\"]],u,[[\"MY\",\"EY\"],u,[\"Meín Yɛ́sʉ\",\"Eínō Yɛ́sʉ MMM y\",\"d MMMM y\",\"EEEE, d'KES\",\"Ksh\",\"Iropiyianí e Kenya\",{KES\":[\"Ksh"3OlFG`xv(s"s:R<|
t		|APyMAAM,EAAC,OAAO,E|QAAQ,EAAC,QAAQ,EAAC,OAAO/2	|	KAAK,EAAC,OAAOPOAAO,EAAC,MAAM=	MAAM$			gBAAgBp?

8aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,SAAS	IAAI,EAAC,kBAAkBp
B
A
7

-
2x#s\",[[\"a\",\"p\"],[\"PG\",\"PTG\"],u],u,[[\"A\",\"I\",\"S\",\"R\",\"K\",\"J\",\"S\"],[\"Ahd\",\"Isn\",\"Sel\",\"Rab\",\"Kha\",\"Jum\",\"Sab\"],[\"Ahad\",\"Isnin\",\"Selasa\",\"Rabu\",\"Khamis\",\"Jumaat\",\"Sabtu\"],[\"Ah\",\"Is\",\"Se\",\"Ra\",\"Kh\",\"Ju\",\"Sa\"]],u#J\",\"J\",\"O(eb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ogo\",\"Sep\",\"Okt\",\"Nov\",\"Dis\"],[\"Januari\",\"Februari\",\"Mac\",\"April\",\"Mei\",\"Jun\",\"Julai\",\"Ogos\",\"September\",\"Oktober\",\"November\",\"Disember\"]],u,[[\"S.M.\",\"TM\"],u,u],1,[6,0],[\"d/MM/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} {0}\"CMYR\",\"RM\",\"Ringgit MalaysiaCAD\":[u,\"$ MXN\":[u,\"$\"],\"MYR\":[\"RMTWD\":[\"NT$\"],\"USD\":[u6&)Ll$exO(nds!nds:R(KAAK~.		|APy		|Z		KAAK$			gBAAg4	YAAY,EAAC,KAAK

v

(x"nds\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],u,u],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"M01\",\"M02\",\"M03\",\"M04\",\"M05\",\"M06\",\"M07\",\"M08\",\"M09\",\"M10\",\"M11\",\"M12\"],u],u,[[\"BCE\",\"CE\"],u,u],1,[6,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE &EUR\",{(-H	ICxm(nyn!nyn:R(KAAK~.		|APy@OAAO,EAAC,aAAa,EAAC,YAAY,EAAC,aAAa,EAAC,UAAU,EAAC,aAAa,EAAC,aAAaQ	|aAAa,EAAC,YAAY,EAAC,aAAa,EAAC,UAAU,EAAC,aAAa,EAAC,aAAa,EAAC,cAAc,EAAC,aAAa,EAAC,YAAY,EAAC,WAAW,EAAC,oBAAoB,EAAC,oBAAoB,CAAC,CAA		
qBAAqB,EAAC,kBAAkB,C		gBAAg4	.`
qBAAqBp

(KAAK
x"nyn\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"K\",\"R\",\"S\",\"N\",\"T\",\"M\"],[\"SAN\",\"ORK\",\"OKB\",\"OKS\",\"OKN\",\"OKT\",\"OMK\"],[\"Sande\",\"Orwokubanza\",\"Orwakabiri\",\"Orwakashatu\",\"Orwakana\",\"Orwakataano\",\"Orwamukaaga\"],[\"SAN\",\"ORK\",+\"OKB\",\"OKS\",\"OKN\",\"OKT\",\"OMK\"]],u#J\",\"J%KBZ\",\"KBR\",\"KST\",\"KKN\",\"KTN\",\"KMK\",\"KMS\",\"KMN\",\"KMW\",\"KKM\",\"KNK\",\"KNB\"],[\"Okwokubanza\",\"Okwakabiri\",\"Okwakashatu\",\"Okwakana\",\"Okwakataana\",\"Okwamukaaga\",\"Okwamushanju\",\"Okwamunaana\",\"Okwamwenda\",\"Okwaikumi\",\"Okwaikumi na kumwe\",\"Okwaikumi na ibiri\"]],u,[[\"BC\",\"AD\"],u,[\"Kurisito Atakaijire\",\"Kurisito Yaijire\"]],1,[0,0],[\"dd/)MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d'UGX\",\"USh\",\"Eshiringi ya Uganda\",{UGX\":[\"USh"3_XOex(tr!tr:R			|APyOAAO,EAAC,WAAW,EAAC,MAAMMAAM,EAAC,WAAW/2	|MAAM,EAAC,OAAO$BSAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,C		
eAAe,EAAC,gBAAgB,C		
c	E	'aAAap

2
7
(
(

#x"tr\",[[\"öö\",\"ös\"],[\"ÖÖ\",\"ÖS\"],u],[[\"ÖÖ\",\"ÖS\"],u,u],[[\"P\",\"P\",\"S\",\"Ç\",\"P\",\"C\",\"C\"],[\"Paz\",\"Pzt\",\"Sal\",\"Çar\",\"Per\",\"Cum\",\"Cmt\"],[\"Pazar\",\"Pazartesi\",\"Salı\",\"Çarşamba\",\"Perşembe\",\"Cuma\",\"Cumartesi\"],[\"Pa\",\"Pt\",\"Sa\",\"Ça\",\"Pe\",\"Cu\",\"Ct\"]],u,[[\"O\",\"Ş\",\"M\",\"N\",\"M\",\"H\",\"T\",\"A\",\"E\",\"E\",\"K\",\"A\"],[\"Oca\",\"Şub\",\"Mar\",\"Nis\",\"May\",\"Haz\",\"Tem\",\"Ağu\",\"Eyl\",\"Eki\",\"Kas\",\"Ara\"],[\"Ocak\",\"Şubat\",\"Mart\",\"Nisan\",\"Mayıs\",\"Haziran\",\"Temmuz\",\"Ağustos\",\"Eylül\",\"Ekim\",\"Kasım\",\"Aralık\"]],u,[[\"MÖ\",\"MS\"],u,[\"Milattan Önce\",\"Milattan Sonra\"]],1,[6,0],[\"d.MM.y\",\"d MMM y\",\"d MMMM y\",\"d MMMM y EEEE\"],[\"HH:mJ,\",\".QX%#,##0ITRY\",\"₺\",\"Türk Lirası\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.URON\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"THB\":[\"฿\"],\"TRY\":[\"₺\"],\"TWD\":[\"NT9Uox](tzm!tzm:IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI E,IAAI,CAAC,IAAI,EAAE,CAAC;QACxF=="KAAK,EAAC,CAAC,CAAC,WAAW,EAAC,YAAY	)	|APy
OAAO,EAAC,QAAQSAASo	|(UAAU,EAAC,QAAQ,EAAC,SAAS		
iBAAiB,EAAC,mBAAmB,C		gBAAg4	YAAY,EAAC,KAAK
`
iBAAiBp

(aMath.floor(n) && (n >= 0 && n <= 1) || n === Math.floor(n) && (n >= 11 && n <= 99))\n    return 1u%tzm\",[[\"Zdat azal\",\"Ḍeffir aza\"],u,u],u,[[\"A\",\"A\",\"A\",\"A\",\"A\",\"A\",\"A\"],[\"Asa\",\"Ayn\",\"Asn\",\"Akr\",\"Akw\",\"Asm\",\"Asḍ\"],[\"Asamas\",\"Aynas\",\"Asinas\",\"Akras\",\"Akwas\",\"Asimwas\",\"Asiḍyas\"],[\"Asa\",\"Ayn\",\"Asn\",\"Akr\",\"Akw\",\"Asm\",\"Asḍ\"]],u,[[\"Y\",\"Y\",\"M\",\"I\",\"M\",\"Y\",\"Y\",\"Ɣ\",\"C\",\"K\",\"N\",\"D\"],[\"Yen\",\"Yeb\",\"Mar\",\"Ibr\",\"May\",\"Yun\",\"Yul\",\"Ɣuc\",\"Cut\",\"Kṭu\",\"Nwa\",\"Duj\"],[\"Yennayer\",\"Yebrayer\",\"Mars\",\"Ibrir\",\"Mayyu\",\"Yunyu\",\"Yulyuz\",\"Ɣuct\",\"Cutanbir\",\"Kṭuber\",\"Nwanbir\",\"Dujanbir\"]],u,[[\"ZƐ\",\"ḌƐ\"],lu,[\"Zdat Ɛisa (TAƔ)\",\"Ḍeffir Ɛisa (TAƔ)\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d\,\",\" QcA#,##0.00 ¤\",\"#E0\"],\"MAD\",\"MAD\",\"Derhem Umeṛṛuki\",{(-d~A\x(vun!vun:R("KAAK,EAAC,CAAC,CAAC,OAAO,EAAC,WAAW	)	|APy+

#QAAQ,EAAC,UAAUQ	|	`OAAO,EAAC,SAAS,EAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,C		
iBAAiB,EAAC,iBAAiB,C		gBAAg4	.`
sBAAsBp

(KAAK
x"vun\",[[\"utuko\",\"kyiukonyi\"],u,u],u,[[\"J\",\"J\",\"J\",\"J\",\"A\",\"I\",\"J\"],[\"Jpi\",\"Jtt\",\"Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"],[\"Jumapilyi\",\"Jumatatuu\",\"Jumanne\",\"Jumatanu\",\"Alhamisi\",\"Ijumaa\",\"Jumamosi\"],[\"Jpi\",\"Jtt\",\")Jnn\",\"Jtn\",\"Alh\",\"Iju\",\"Jmo\"]],u#J\",\"J.eb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Machi\",\"Aprilyi\",\"Mei\",\"Junyi\",\"Julyai\",\"Agusti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Desemba\"]],u,[[\"KK\",\"BK\"],u,[\"Kabla Yya Kristu\",\"Baada ya Kristu\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d(TZS\",\"TSh\",\"Shilingi ya Tanzania\",{TZS\":[\"TSh"3:exT/!hu!hu:"CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACPQKAAK,EAAC,KAAK
vGAAGKAAK,EAAC,IAAIQ	CAAC,EAAC,CAAC,UAAU,ENQAAQ,EAAC,SAAS.KAAK,EAAC,IAAIQ	C"PIAAI	z\(p
QAAQ`#SAAS,EAAC,SAASYAAY,EAAC,SAAS,EAAC,UAAU<
'CAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAOgBAAgB,EAAC,wBAAwB,C,VYAAY,EAAC,WAAW,EAAC,YAAY,EAAC,kBAAkB,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,cAAc~ # 	a	(QAAQ	)IAAI,EAAC,eAAea9@PPP$
(PPP	
ng;\n\nif (n === 1)\n    return 1%hu\",[[\"de.\",\"du.\"],u,u],u,[[\"V\",\"H\",\"K\",\"Sz\",\"Cs\",\"P\",\"Sz\"],[\"V\",\"H\",\"K\",\"Sze\",\"Cs\",\"P\",\"Szo\"],[\"vasárnap\",\"hétfő\",\"kedd\",\"szerda\",\"csütörtök\",\"péntek\",\"szombat\"],[\"V\",\"H\",\"K\",\"Sze\",\"Cs\",\"P\",\"Szo\"]],u,[[\"J\",\"F\",\"M\",\"Á\",\"M\",\"J\",\"J\",\"A\",\"Sz\",\"O\",\"N\",\"D\"],[\"jan.\",\"febr.\",\"márc.\",\"ápr.\",\"máj.\",\"jún.\",\"júl.\",\"aug.\",\"szept.\",\"okt.\",\"nov.\",\"dec.\"],[\"január\",\"február\",\"március\",\"április\",\"május\",\"június\",\"július\",\"augusztus\",\"szeptember\",\"október\",\"november\",\"december\"]],u,[[\"ie.\",\"isz.\"],[\"i. e.\",\"i. sz.\"],[\"Krisztus előtt\",\"időszámításunk szerint\"]],1,[6,0],[\"y. MM. dd.\",\"y. MMM d.\",\"yH. MMMM d.\",\"y. MMMM d., EEEE\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"F-\",\"EG? HUF\",\"Ft\",\"magyar forintр.+EUR\":[u,\"€%+5HUF\":[\"Ft\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"8TWD\":[u,\"NT* u,\"₫\"],\"XCD\":[u,\"$\"}Xs;gxMer"er<<r(

F_4"OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQVؓPAK
6WAAW,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,EAAC,QAAQ.QAAQ,E
r(iBAAiB,EAAC,iBAAiB
tmBAAmB,Ep,
[
`#er\",[[\"RŨ\",\"ŨG\"],u,u],u,[[\"K\",\"M\",\"W\",\"W\",\"W\",\"W\",\"J\"],[\"KIU\",\"MRA\",\"WAI\",\"WET\",\"WEN\",\"WTN\",\"JUM\"],[\"Kiumia\",\"Muramuko\",\"Wairi\",\"Wethatu\",\"Wena\",\"Wetano\",\"Jumamosi\"],[\"KIU\",\"MRA\",\"WAI\",\"WET\",\"WEN\",\"WTN\",\"JUM\"]],u,[[\"J\",\"F\",\"M\",\"Ĩ\",\"M\",\"N\",\"N\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"JAN\",\"FEB\",\"MAC\",\"ĨPU\",\"MĨĨ\",\"NJU\",\"NJR\",\"AGA\",\"SPT\",\"OKT\",\"NOV\",\"DEC\"],[\"Januarĩ\",\"Feburuarĩ\",\"Machi\",\"Ĩpurũ\",\"Mĩ\",\"Njuni\",\"Njuraĩ\",\"Agasti\",\"Septemba\",\"Oktũba\",\"Novemba\",\"Dicemba\"]],u,[[\"MK\",\"NK\"],u,[\"Mbere ya Kristũ\",\"Nyuma ya Kristũ*Shilingi yaeww gx! 	eAAe,EAAE2t];\n"]}
Gxpluo!luo<"O
6WAAW,EAAC,YAAY,EAAC,WAAW,EAAC,cAAc,EAAC,YAAY,EAAC,OAAO`xgBAAgB,EAAC,eAAe,EAAC,cAAc,EAAC,iBAAiB,EAAC,eAAe,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,eAAe,EAAC,gBAAgB,EAAC,cAAc,EAAC,mBAAmB,EAAC,uBAAuB$:(oBAAoB,EAAC,mBAAmB$tkBAAkId"luo\",[[\"OD\",\"OT\"],u,u],u,[[\"J\",\"W\",\"T\",\"T\",\"T\",\"T\",\"N\"],[\"JMP\",\"WUT\",\"TAR\",\"TAD\",\"TAN\",\"TAB\",\"NGS\"],[\"Jumapil\",\"Wuok Tich\",\"Tich Ariyo\",\"Tich Adek\",\"Tich Ang’wen\",\"Tich Abich\",\"Ngeso\"],[\"JMP\",\"WUT\",\"TAR\",\"TAD\",\"TAN\",\"TAB\",\"NGS\"]],u,[[\"C\",\"R\",\"D\",\"N\",\"B\",\"U\",\"B\",\"B\",\"C\",\"P\",\"C\",\"P\"],[\"DAC\",\"DAR\",\"DAD\",\"DAN\",\"DAH\",\"DAU\",\"DAO\",\"DAB\",\"DOC\",\"DAP\",\"DGI\",\"DAG\"],[\"Dwe mar Achiel\",\"Dwe mar Ariyo\",\"Dwe mar Adek\",\"Dwe mar Ang’wen\",\"Dwe mar Abich\",\"Dwe mar Auchiel\",\"Dwe mar Abiriyo\",\"Dwe mar Aboro\",\"Dwe mar Ochiko\",\"Dwe mar Apar\",\"Dwe mar gi achiel\",\"Dwe mar Apar gi ariyo\"]],u,[[\"BC\",\"AD\"],u,[\"Kapok Kristo obiro\",\"Ka Kristo osebiro\"]],0,[6q7#,##0.00¤\",\"#E0\"],\"KES\",\"Ksh\",\"Siling mar Keny!KES\":[\"Ks4Le/x ewo!ewo<VXxq/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ckb-IR", [["ب.ن", "د.ن"], u, u], u, [["ی", "د", "س", "چ", "پ", "ھ", "ش"], ["یەکشەممە", "دووشەممە", "سێشەممە", "چوارشەممە", "پێنجشەممە", "ھەینی", "شەممە"], u, ["١ش", "٢ش", "٣ش", "٤ش", "٥ش", "ھ", "ش"]], u, [["ک", "ش", "ئ", "ن", "ئ", "ح", "ت", "ئ", "ئ", "ت", "ت", "ک"], ["کانوونی دووەم", "شوبات", "ئازار", "نیسان", "ئایار", "حوزەیران", "تەمووز", "ئاب", "ئەیلوول", "تشرینی یەکەم", "تشرینی دووەم", "کانونی یەکەم"], u], u, [["پێش زایین", "زایینی"], u, u], 6, [5, 5], ["y-MM-dd", "y MMM d", "dی MMMMی y", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "‎+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "IRR", "IRR", "IRR", { "IQD": ["د.ع.‏"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=ckb-IR.js.map x export default [i%	pYxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ckb", [["ب.ن", "د.ن"], u, u], u, [["ی", "د", "س", "چ", "پ", "ھ", "ش"], ["یەکشەممە", "دووشەممە", "سێشەممە", "چوارشەممە", "پێنجشەممە", "ھەینی", "شەممە"], u, ["١ش", "٢ش", "٣ش", "٤ش", "٥ش", "ھ", "ش"]], u, [["ک", "ش", "ئ", "ن", "ئ", "ح", "ت", "ئ", "ئ", "ت", "ت", "ک"], ["کانوونی دووەم", "شوبات", "ئازار", "نیسان", "ئایار", "حوزەیران", "تەمووز", "ئاب", "ئەیلوول", "تشرینی یەکەم", "تشرینی دووەم", "کانونی یەکەم"], u], u, [["پێش زایین", "زایینی"], u, u], 6, [5, 6], ["y-MM-dd", "y MMM d", "dی MMMMی y", "y MMMM d, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "‎+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "IQD", "د.ع.‏", "IQD", { "IQD": ["د.ع.‏"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=ckb.js.map$޾x^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    if (i === Math.floor(i) && (i >= 2 && i <= 4) && v === 0)
        return 3;
    if (!(v === 0))
        return 4;
    return 5;
}
export default ["cs", [["dop.", "odp."], u, u], u, [["N", "P", "Ú", "S", "Č", "P", "S"], ["ne", "po", "út", "st", "čt", "pá", "so"], ["neděle", "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota"], ["ne", "po", "út", "st", "čt", "pá", "so"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["led", "úno", "bře", "dub", "kvě", "čvn", "čvc", "srp", "zář", "říj", "lis", "pro"], ["ledna", "února", "března", "dubna", "května", "června", "července", "srpna", "září", "října", "listopadu", "prosince"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["led", "úno", "bře", "dub", "kvě", "čvn", "čvc", "srp", "zář", "říj", "lis", "pro"], ["leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec"]], [["př.n.l.", "n.l."], ["př. n. l.", "n. l."], ["před naším letopočtem", "našeho letopočtu"]], 1, [6, 0], ["dd.MM.yy", "d. M. y", "d. MMMM y", "EEEE d. MMMM y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "CZK", "Kč", "česká koruna", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CSK": ["Kčs"], "CZK": ["Kč"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"], "XEU": ["ECU"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=cs.js.map3npx>/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n === 3)
        return 3;
    if (n === 6)
        return 4;
    return 5;
}
export default ["cy", [["b", "h"], ["AM", "PM"], ["yb", "yh"]], [["AM", "PM"], u, u], [["S", "Ll", "M", "M", "I", "G", "S"], ["Sul", "Llun", "Maw", "Mer", "Iau", "Gwen", "Sad"], ["Dydd Sul", "Dydd Llun", "Dydd Mawrth", "Dydd Mercher", "Dydd Iau", "Dydd Gwener", "Dydd Sadwrn"], ["Su", "Ll", "Ma", "Me", "Ia", "Gw", "Sa"]], [["S", "Ll", "M", "M", "I", "G", "S"], ["Sul", "Llun", "Maw", "Mer", "Iau", "Gwe", "Sad"], ["Dydd Sul", "Dydd Llun", "Dydd Mawrth", "Dydd Mercher", "Dydd Iau", "Dydd Gwener", "Dydd Sadwrn"], ["Su", "Ll", "Ma", "Me", "Ia", "Gw", "Sa"]], [["I", "Ch", "M", "E", "M", "M", "G", "A", "M", "H", "T", "Rh"], ["Ion", "Chwef", "Maw", "Ebr", "Mai", "Meh", "Gorff", "Awst", "Medi", "Hyd", "Tach", "Rhag"], ["Ionawr", "Chwefror", "Mawrth", "Ebrill", "Mai", "Mehefin", "Gorffennaf", "Awst", "Medi", "Hydref", "Tachwedd", "Rhagfyr"]], [["I", "Ch", "M", "E", "M", "M", "G", "A", "M", "H", "T", "Rh"], ["Ion", "Chw", "Maw", "Ebr", "Mai", "Meh", "Gor", "Awst", "Medi", "Hyd", "Tach", "Rhag"], ["Ionawr", "Chwefror", "Mawrth", "Ebrill", "Mai", "Mehefin", "Gorffennaf", "Awst", "Medi", "Hydref", "Tachwedd", "Rhagfyr"]], [["C", "O"], ["CC", "OC"], ["Cyn Crist", "Oed Crist"]], 1, [6, 0], ["dd/MM/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'am' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GBP", "£", "Punt Prydain", { "BDT": [u, "TK"], "BWP": [], "BYN": [u, "р."], "HKD": ["HK$"], "JPY": ["JP¥", "¥"], "KRW": [u, "₩"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [], "ZAR": [], "ZMW": [] }, "ltr", plural];
//# sourceMappingURL=cy.js.map`MGxxx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), t = parseInt(val.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0;
    if (n === 1 || !(t === 0) && (i === 0 || i === 1))
        return 1;
    return 5;
}
export default ["da-GL", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "O", "T", "F", "L"], ["søn.", "man.", "tir.", "ons.", "tor.", "fre.", "lør."], ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], ["sø", "ma", "ti", "on", "to", "fr", "lø"]], [["S", "M", "T", "O", "T", "F", "L"], ["søn", "man", "tir", "ons", "tor", "fre", "lør"], ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], ["sø", "ma", "ti", "on", "to", "fr", "lø"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mar.", "apr.", "maj", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "dec."], ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"]], u, [["fKr", "eKr"], ["f.Kr.", "e.Kr."], u], 1, [6, 0], ["dd.MM.y", "d. MMM y", "d. MMMM y", "EEEE 'den' d. MMMM y"], ["HH.mm", "HH.mm.ss", "HH.mm.ss z", "HH.mm.ss zzzz"], ["{1} {0}", u, "{1} 'kl'. {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "DKK", "kr.", "dansk krone", { "AUD": ["AU$", "$"], "BYN": [u, "Br."], "DKK": ["kr."], "ISK": [u, "kr."], "JPY": ["JP¥", "¥"], "NOK": [u, "kr."], "PHP": [u, "₱"], "RON": [u, "L"], "SEK": [u, "kr."], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=da-GL.js.mapr`x{"version":3,"file":"fr-CM.js","sourceRoot":"","sources":["fr-CM.ts"],"names":[],"mappings":"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,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4;\nreturn 5;\n}\n\nexport default [\"fr-CM\",[[\"mat.\",\"soir\"],u,[\"matin\",\"soir\"]],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"janv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"XAF\",\"FCFA\",\"franc CFA (BEAC)\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}d~Ux[3en$en=$
CAAC;IAEjG/<|

Cf_C#A|


hKAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW?EAAC,UAAU,CAAC,EAAC,C


6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKKAAK,EAAC,KAAK,EAAC,KAAK,$QAAQ,E/2|

CCAAC,eAAe,EAAC,aAAaO$p_k
_<
%gBAAgB1(UAAU,EAAC,CAAC,EAAC,cAAc`_nQAAQ,EAAC,WAAW,E
2BAA2B,EaY*;\n\nif (i === 1 && v === 0)\n    return 1%en-CM\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],.[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"SVJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"B,C\",\"AD\"],[\"Before Christ\",\"Anno Domini9,M(, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",c]%\",\"¤#,##0.00\",\"#E0\"],\"XAF\",\"FCFA\",\"Central African CFA Franc\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},3{jxH%da-GL!da-GL@	QAAQ,CAAC$9gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAElHk"CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAACp#,CAAC;QAC7C-







MAAM. QAAQ,EAAC,QAAQ,CAAC,E1(
_2=P QAAQ,EAAC,QAAQ,CAAC,E1(
_7<











MAAM,CAAC,EAAC,C
OAAOaK++
WAAW,EAAC,sBAAsC
CAAC,EAAC,eAAed(SAAS,EAAC,YAAY`
aAAa_/
#C#
#p
p
#Cl'(t = parseInt(K	"K|0+$/g, ''), 10) || 0;\n\nif (n === 1 || !(t === 0) && (i === 0 || i === 1)	47da-GL\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM
O\",\"T\",\"F\",\"L\"],[\"søn.\",\"man.\",\"tir.\",\"ons.\",\"tor.\",\"fre.\",\"lør.\"],[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],[\"sø\",\"ma\",\"ti\",\"on\",\"to\",\"fr\",\"lø\"]],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"søn\",\"man\",\"tir\",\"ons\",\"tor\",\"fre\",\"lør\"],[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"Wtorsdag\",\"fredag\",\"lørdag\"],[\"sø\",\"ma\",\"ti\",\"on\",\"to\",\"fr\",\"lø\"]]
Ojan.\",\"feb.\",\"mar.\",\"apr.\",\"maj\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januar\",\"februar\",\"marts\",\"april\",\"maj\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"fKr\",\"eKr\"],[\"f.Kr.\",\"e.Kr.\"],u],1,[6,0],[\"dd.MM.y\",\"d. MMM y\",\"d. MMMM y\",\"EEEE 'den' d. MMMM y\"],[\"HH.mm\",\"HH.mm.sTs\",\"HH.mm.ss z\",\"HH.mm.ss zzzz\"],[\"{1} {0}\",u,\"{1} 'kl'. {0}\",u],[\",\",\".$B.\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"DKK\",\"kr.\",\"dansk krone\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,/\"Br.\"],\"DKK\":[\"kr.\"],\"ISK\":[u,\"kr.\"],NOK\":[u,\"kr.\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"SEK\":[u,\"kr.\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\ Hm=0x >B%B?aAAa,EAAC,gBAAgBAGAAG,EAAC,kBAAkB_p7MB	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a2BMD\",\"$\",\"Bermudian Dollar\",{\"BMD\":[\"$\"],I:	 x fSI$SI@YAAYGAAG,EAAC,MAAM_mSI	O%,\",\".\",\";\",\"%\",\"+\",\"-\",\"eBE.#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"EuroMV-*>x
	%4es-C"es-C?*#WAAW,EAAE,EAAE,CAAC,CAAC,MAAM=sBAAsB,EAAE,IAAI,CAACl/1K,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb-	GAAG,OAAOPKAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQKKt	t`2lA

tJMAAM,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWOA`sOOAAO0[
tJMAAM,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWOK
iBAAiB,EAAC,mBAAmBOK(&UAAU,EAAC,SAAS,EAAC,oBAAoB,EAAC,0BAA0B(UAAUsBAAsB^	GAAG,EAAC,cAAc,E		(IAAI@	$IAAI	BJ
<
	J
<
	(	<
	P	P	P	P	n<
IAAI@	EAAEq
<
	EAAE
v = L"/, '').length, e@'e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0))& || !(e >= 0 && e <= 5))\n    return 4%es-CL\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"do\",\"lu\",\"ma\",\"mi\",\"ju\",\"vi\",\"sá\"]],[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"EIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],[[\"E\",\"F\",\"M\*<(ene.\",\"feb.\",\"mar.\",\"abr.\",\"may.go.\",\"sept.\",\"oct.\",\"nov.\",\"dic.\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"dd-MM-yy\",\"dd-MM-y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",3\"HH:mm:ss zzzz\"],[\"{1}, {0}\",\"{1} {0}\",\"{1},#V:z"¤#,##0.00;¤-#,##0.00\",\"#E0\"],\"CLP\",\"$\",\"Peso chileno\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CLP\":[\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$Q-1SP\":[u,\"SD£\"],\"SYP\":[u,\"S£\"],\"TWD\":[u, h,\"VEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}<:IDxj%
zh-Hant-HK!
zh-Hant-HK@	CAAC;IAEd	)YAAYGKPF
lPA]KA`
A/vK
-K(
QAAQ,EAAC,CAAC,EAAC,YAAYUAAU,EAAC,cAAc,EAAC,iBAAiB$PKd	
IAAI,E	2IAAI	L	(IAAI@	#EAAE
;\n$zh-Hant-HK\",[[\"上午\",\"下午\"],u,u],u,[[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],[\"週日\",\"週一\",\"週二\",\"週三\",\"週四\",\"週五\",\"週六\"],[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\"],[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],u],u,[[\"公元前\",\"公元\"],u,u],0,[6,0],[\"d/M/y\",\"y年M月d日\",u,\"y年M月d日EEEE\"],[\Z"ah:mm\",\"ah:mm:ss\",\"ah:mm:ss [z]\",\"ah:mm:ss [zzzz]\"],[\"{1} {0}\",u,u,u],[\".\",\",7:非數值\",\":z4%\",\"¤#,##0.00\",\"#E0\"],\"HKD\",\"HK$\",\"港元)рP-RUR\":[u,\"р.#,\"XXX\":[]},\"ltr\", plural];\n"]}C*x4.NI$NI@)M	w	WAAW

IAAI,EAAC,sBAAsB9L(LF$(Pxn(
QNI䓪5(uZH0,[6,0],[\"d/M/yy\",\"d MMM .\",\",go3\",\"#E0\"],\"NIO\",\"C$\",\"córdoba nicaragüense
Rl	IO\":[\"C8uo=Q%<x\4
fr-B"fr-B?^eAAe,CAAC,CAAC,CAAC,QAAQ@>	$QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB	R	QAAQ@>	QAAQ0YAAYNW		

		
	
	

CAAC7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}^:'x 43fr-B"fr-B?lB:>	(M	AA	UAAU,EAAC,OAAO,EAAC,UAAU oM		

J

@@2
SAAS0SAAS,EAAC,MAAM,E
UAAU,EAAC,UAAUQ	M	WAAW,EAAC,WAAW=	oBAAoB,EAAC,oBAAoBQ	M	(
	eAAe	B
UAAU,EAAC,aAAa!
YAAY
MAAMN(N($N(N2LN(N(N2N(
=-N(N(N(N2
C
C

UN
$
I-N2LN2

UN(N(N2LNPN(N(

-MAAM3&i === 0 || i.fr-BL\",[[\"AM\",\"PM\"],u,u],u2im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JIGjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août"éc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\"',\"d MMM y\",\"d MMMM y\",\"EEEE d MMMMFF \"{1} 'à' {0}\",u],[\",\",\" ge#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\".&BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\"QCL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[L\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\"3EP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤ITMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\"GHD\":[\"$RH_RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$#$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}gP%QxXs*sG
7A'7Z
#_QAAQ:BYAAY,EAAC,eAAes
}
-u6#	(Y#
}
(sQdE周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周nE周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周	[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"]b
5
Gz ah:mm:ss\",\"zzzz ah:mm:ss
\NaNbILR\":[\"ILS\"],\"JPY\":[\"JP¥\",\"¥\"],\"KRW\":[\"￦\",\"₩\"],\"PHP\":[u,\"₱\"],\"RUR\":[u,\"р.\"],\"TWD\":[\"NT$\"],\!9 C)6xu HK$HK@OAAOO`
kBAAkBmHK	0,[6,0],[\"d/$HKD\",\"HK$\",\"Hong Kong Dollar\",{I#V:x  SH$SH@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCiBAAiBHh7%SH	.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss8SHP\",\"£\",\"St Helena Pound\",{\"GBP\":[\"GB£\",\"£ SHP\":[\"£3 Egnxo-de-LI!de-LI@:<:_+A=P6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&A=:(
I
6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&





OAAOMAAM,CAAC,EAAC,CMAAMo_7`# MAAMo_SAAS,EAAC,SAASK++
#UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,iBAAiYAAY`
mBAAmKIAAI,CNE(
(
IAAI,CN
MAAM,CNIAAI,CN
p
#
p
MAAM,CN
IAAI,CN
p
p
IAAI,CN
MAAM,CAAC,EAAC,KAAK,EAAC,EAAE8(EAAEQ
1de-LI\",[[\"AM\",\"PM\"],u,u],[[\"vm.\",\"nm.\"],[\"AM\",\"PM\"],u],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\8"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]]BR.\",\"Feb.\",\"März\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sept.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Januar\",\"Februar\-",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli6$ktober\",\"November\",\"Dezember\"]]B`är\",\"Apr\",\"Mai _\",\"Okt\",\"Nov\",\"Dez\"],[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli6ktober\",\"November\",\"Dezember\"]],[[\"v. Chr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d.\um' {0}\",u],[\".\",\"’j#·@ CHF\",\"CHF\",\"Schweizer Franken\",{\"ATS\":[\"öS\"],\"AUD\":[\"AU$\",\"$\"],\"BGM\":[\"BGK\"],\"BGO\":[\"BGJ\"],\"BYN\":[u,\"р.\"],\"CUC\":[u,\"Cub$\"],\"DEM\":[\"DM\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"Fl£\"],\"GHS\":[u,\"₵\"],\"GNF\":[u,\"F.G.\"],\"KMF\":[u,\"FC\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"RWF\":[u,\"F.Rw\"],\"SYP\":[],\"THB\":[\"฿\"],,\"TWD\":[\"NT$\"],\"XXX\":[],\"ZMW\":[u,\"K`.ltTmxOe-TG"e-TG@	CAAC;IAEdPoL
OAAOaK(2=PQAAQ"MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,SAAS<QF-7`#
QAAQ,EAAC,QAAQ,EAAC,QAAQ6SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,MAAM,EAAC,aAAa,EAAC,OAAO@$KAAK>$cAAc,EAAC,WAAW@$++
'QAAQ,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,sBAAsC
+
dUOAAO,EAAC,mCAAmCLB
IAAI,CN(;\n\nif (n === 1	5e-TG\",[[\"ŋ\",\"ɣ\"],[\"ŋdi\",\"ɣetrɔ\"],u],u,[[\"k\",\"d\",\"b\",\"k\",\"y\",\"f\",\"m\"],[\"kɔs\",\"dzo\",\"bla\",\"kuɖ\",\"yaw\",\"fiɖ\",\"mem\"],[\"kɔsiɖa\",\"dzoɖa\",\"blaɖa\",\"kuɖa\",\"yawoɖa\",\"fiɖa\",\"memleɖa\"],[\"kɔs\",\"dzo\",\"bla\",\"kuɖ\",\"yaw\",\"fiɖ\",\"mem\"]],u,[[\"d\",\"d\",\"t\",\"a\",\"d\",\"m\",\"s\",\"d\",\"a\",\"k\",\"a\",\"d\"],[\"dzv\",\"dzd\",\"ted\",\"afɔ\",\"dam\",\"mas\",\"sia\",\"dea\",\"any\",\"kel\",\"ade\",\"dzm\"],[\"dzove\",\"dzodze\",\"tedoxe\",\"afɔfĩe\",\"dama\",\"masa\",\"siamlɔm\",\"deasiamime\",\"anyɔnyɔ\",\"kele\",\"adeɛmekpɔxe\",\"dzome\"]],u,[[\"HYV\",\"Yŋ\"],u,[\"Hafi Yesu Va\",\"Yesu ŋɔli\"]],1,[6,0],[\"M/d/yy\",\"MMM d 'lia', y\",\"MMMM d 'lia' y\",\"EEEE, MMMM d 'lia' yB0} {1}\",u,u\Hmnn>XOF\",\"F CFA\",\"ɣetoɖofe afrikaga CFA franc BCEAO\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"GHS\":[\"GH₵\"],\"JP%THB\":[\"฿H3`"Kxb CK$CK@oBAAoKC\CK
$NZD\",\"$\",\"New Zealand Dollar\",{!
NZD\":[\"$H3*<x DK$DK@SAAS,EAAC,YAAY`
cAAcL$IAAI,CNY%DK
*.mm\",\"HH.mm.ss\",\"HH.mm.ss z\",\"HH.mm.12,\",\".j#·.W %\",\"#,##0.00 ¤\",\"#E0\"],\"DKK\",\"kr.\",\"Danish Krone\",{\"DKK\":[\"kr.\",\"kr N-9IE>xx FK$FK@wBAAwB,EO7%FK
:FKP\",\"£\",\"Falkland Islands Pound\",{\"FKP\":[\"£\"],6N-%YEx EKI$KI@aAAa,EAAC,gBAAgBAmBAAmB,EO(%KI
2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a3/AUD\",\"$\",\"Australian Dollar\",{\"AUD\":[\"$ N-=37VxjP%P?]`#,0QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CaAAa,EAAC,gBAAgBAE&4PH\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PMF
0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\9;PHP\",\"₱\",\"Philippine Peso\",{},\"ltr\", plural];\n"]}Sj4xs UG$UG@`
kBAAkKH(CUG
0!$UGX\",\"USh\",\"Ugandan Shilling\",{!UGX\":[\"UShH34"M
	x \VG$VG@aAAa,EAAC,gBAAgBA`
WAAWL[%VG
2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a3USD\",\"US$\",\"US Dollar\",{!N-0;xC's-P#s-P?"EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KP,OAAO,CAAC,CAAC;IACbkCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQOAAO,EAAC,OAAOK(2=POAAO
*
QAAQ,CAAC,E1(
'
SAASMAAM,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAW@$OAAO,EAAC,OAAOiBAAiB,EAAC,mBAAmB@$++
 oBAAoB,EAAC,0BAA0B,CAAC,EAAC,CaAAa,EAAC,gBAAgBA$+
d(SAAS,EAAC,YAAY)eAAeL
p
IAAI,CN
IAAI,CN
p
pEAAE3
p
p
p
p
p
p
p
p
p
#
EAAEQ
pEAAE, e = parseInt(	e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0))& || !(e >= 0 && e <= 5))\n    return 4	&s-PH\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"D\",\"L\",\"M\",\"X\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"M"I\",\"JU\",\"VI\",\"SA\"]],u,[[\"EHIene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d.G C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"d/M/y'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\".j] %\",\"#,##0.00 ¤\",\"#E0\"],\"PHP\",\"₱\",\"peso filipino\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"EGP\":[],\"ESP\":[\"₧\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"RON\":[u,\"L\"],\"THB\":[\"฿\"],\"ThWD\":[u,\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[]},\"ltr\", plural];\n"]}wxy%fo-DK!fo-DK@	CAAC;IAEdPQ:7P=







MAAM,CAAC,EAAC,CAAC,YAAY.4cAAc,EAAC,aAAa<Q&A=PYAAY.4cAAc,EAAC,aAAa,CAAC,E1(
_7<











MAAM,CAAC,EAAC,CMAAMo_7`# MAAMo_
"OAAO,CAAC,EAAC,CAAC,YAAY,EAAC,aAAa@$++
#UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,iBAAiWeAAed(SAAS,EAAC,YAAY`
aAAaL
IAAI,CN"IAAI,CN@
p7;\n\nif (n === 1	4fo-DK\",[[\"AM\",\"PM\"],u,u],uN
M\",\"H\",\"F\",\"L\"],[\"sun.\",\"mán.\",\"týs.\",\"mik.\",\"hós.\",\"frí.\",\"ley.\"],[\"sunnudagur\",\"mánadagur\",\"tsdagur\",\"mikudagur\",\"hósdagur\",\"fríggjadagur\",\"leygardagur\"],[\"su.\",\"má.\",\"tý.\",\"mi.\",\"hó.\",\"fr.\",\"le.\"]M
M\",\"H\",\"F\",\"L\"],[\"sun\",\"mán\",\"týs\",\"mik\",\"hós\",\"frí\",\"ley\"],[\"sunnudagur\",\"mánadagur\",\"týsdagur\",\"mikudagur\",\"hósdagur\",\"fríggjadagur\",\"leygardagur\"],[\"su\",\"má\",\"tý\",\"mi\",\"hó\",\"fr\",\"le\"]],[[\"J\IHjan.\",\"feb.\",\"mar.\",\"apr.\",\"mai\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"des.\"],[\"januar\",\"februar\",\"mars\",\"apríl\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"J\",\"F\"PAjan\",\"feb\",\"mar\",\"apr\",\"mai\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"des\"],[\"januar\",\"februar\",\"mars\",\"apríl\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"fKr\",\"eKr\"],[\"f.Kr.\",\"e.Kr.\"],[\"fyri Krist\",\"eftir Krist\"]],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d. MMMM y\"],[\"HH:m	J2kl'. {0}\",u],[\",\",\".\",\";\",\"%\",\"+\",\"−Ek %\",\"#,##0.00 ¤\",\"#E0\"],\"DKK\",\"kr.\",\"donsk króna\",{\"BYN\":[u,\"р.\"],\"DKK\":[\"kr.\",\"kr PHP\":[u,\"₱H3Mbx
3fr-WF!fr-WF@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KkClCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQ:7P=







MAAMA)UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,CAAC,E1(


OAAO,EAAC,MAAM,EAAC,OAAOMAAMSAAS,EAAC,MAAM$SAAS,EAAC,MAAMLWAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoB@$++

eAAeBaAAad(SAAS,EAAC,YAAY
WAAWLjIAAI,CNh
IAAI,CNh(
pF#
IAAI,CN7
p#(
(
(
p
IAAI,CN"IAAI,CN(7
IAAI,CN@
p#(
p
IAAI,CNh(
IAAI,CN@
#7#
pMAAM,CN
IAAI, e = parseInt(	e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 &1& v === 0)) || !(e >= 0 && e <= 5))\n    return 4	%fr-WF\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"s;Vjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,P[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ9M4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" j] %\",\"#,##0.00 ¤\",\"#E0\"],\"XPF\",\"FCFP\",\"franc CFP\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\" XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw`OwPLx9gsw-LI!gsw-LI@	CAAC;IAEdP="QAAQ,EAAC,CAAC,CAAC,OAAO,EAAC,MAAMcAAc,EAAC,aAAa OAAO,EAAC,MAAMWAAW,EAAC,UAAU A=P*WAAW,EAAC,SAAS,EAAC,WAAW<QF-7`# MAAM.UAAU.22SAAS,EAAC,SAASK++
#UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,iBAAiC
+
d(SAAS,EAAC,YAAY`
kBAAkKIAAI;\n\nif (n === 1	4gsw-LI\",[[\"vorm.\",\"nam.\"],u,[\"am Vormittag\",\"am Namittag\"]],[[\"vorm.\",\"nam.\"],u,[\"Vormittag\",\"Namittag\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"Su.\",\"Mä.\",\"Zi.\",\"Mi.\",\"Du.\",\"Fr.\",\"Sa.\"],[\"Sunntig\",\"Määntig\",\"Ziischtig\",\"Mittwuch\",\"Dunschtig\",\"Friitig\",\"Samschtig\"],[\"Su.\",\"Mä.\",\"Zi.\",\"Mi.\",\"Du.\",\"Fr.\",\"Sa.\"]]@bär\",\"Apr\",\"Mai \",\"Okt\",\"Nov\",\"Dez\"],[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"Auguscht\",\"Septämber\",\"Oktoober\",\"Novämber\",\"Dezämber\"]],u,[[\"v. Chr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d.K4 {0}\",u,u,u],[\".\",\"’\",\";\",\"%\",\"+\",\"−ET %\",\"#,##0.00 ¤\",\"#E0\"],\"CHF\",\"CHF\",\"Schwiizer Franke\",{\"ATS\":[\"öS`o5Fbxbms-SG!ms-SG@	CAAC;IAEde_K(2=PGMAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,CAAC,E1(
`##KAAK,EAAC,OAAOPOAAO,EAAC,MAAMLMAAM>3++

*aAAa,EAAC,gBAAgBA$SAASd
IAAI,CN
pF
pIAAI,CN
p#(
;\n	$ms-SG\",[[\"a\",\"p\"],[\"PG\",\"PTG\"],u],u,[[\"A\",\"I\",\"S\",\"R\",\"K\",\"J\",\"S\"],[\"Ahd\",\"Isn\",\"Sel\",\"Rab\",\"Kha\",\"Jum\",\"Sab\"],[\"Ahad\",\"Isnin\",\"Selasa\",\"Rabu\",\"Khamis\",\"Jumaat\",\"Sabtu\"],[\"Ah\",\"Is\",\"Se\",\"Ra\",\"Kh\",\"Ju5<Or1c\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ogo\",\"Sep\",\"Okt\",\"Nov\",\"Dis\"],[\"Januari\",\"Februari\",\"Mac\",\"April\",\"Mei\",\"Jun\",\"Julai\",\"OgosAPktober\",\"November\",\"Disember\"]],u,[[\"S.M.\",\"TM\"],u,u],0,[6,0],[\"d/MM/y4Ph:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1}VBGD\",\"$\",\"Dolar Singapura\",{\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$ aMXN\":[u,\"$\"],\"MYR\":[\"RM\"],\"PHP\":[u,\"₱\"],\"SGD\":[\"$\"],\"TWD\":[\"NT$\"],\"USD\":[u\yH:SxQsw-UG!sw-UG@::_+UAAU,EAAC,UAAU>(K(7`#-QAAQOAAO,EAAC,QAAQ,EAAC,UAAUSAAS@$:(iBAAiB,EAAC,iBAAiB@$++

\
+
d2YAAY`
oBAAoK
IAAI,CNE(
p#(
(
(@9sw-UG\",[[\"am\",\"pm\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PMF
9ZJumapili\",\"Jumatatu\",\"Jumanne\",\"Jumatano\",\"Alhamisi\",\"Ijumaa\",\"Jumamosi\"],u,u?dc\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Machi\",\"Aprili\",\"Mei\",\"Juni\",\"Julai\",\"Agosti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Desemba\"]],u,[[\"KK\",\"BK\"],u,[\"Kabla ya Kristo\",\"Baada ya Kristo\"]],1,[0~
 {0}\",u,u\s 6UGX\",\"USh\",\"Shilingi ya Uganda\",{\"BYN\":[u,\"р. KES\":[\"Ksh\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"TZS\":[\"TSh\"],\"UGX\":[\"USh\"],\"USD\":[\"US$\",\"_FKxU FJ$FJ@eAAehFJ	#FJD\",\"$\",\"Fijian Dollar\",{\"FJUE2/x *G%G?"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCiBAAiB/hG	.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ssIGIP\",\"£\",\"Gibraltar Pound\",{\"GBP\":[\"GB£\",\"£\"],\"GIP\":[\"£M(Bx yPG$PG@wBAAwB/h7%PG	NPGK\",\"K\",\"Papua New Guinean Kina\",{\"JPY\":[\"JP¥\",\"¥\"],\"PGK\":[\"K3)
(x \SG$SG@
*
IkBAAkB/h7%SG	0,[6,0],[\"d/M/yHSGD\",\"$\",\"Singapore Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"SGD\":[\"$314Zxx4fr-DJ!fr-DJ@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KkClCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQ:7P=







MAAM,CAAC,EAAC,C")UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,CAAC,E1(
OAAO,EAAC,MAAM,EAAC,OAAOMAAMSAAS,EAAC,MAAM$SAAS,EAAC,MAAMLWAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoB@$++

eAAeDaAAad(SAAS,EAAC,YAAY`
kBAAkBHIAAI,CP(
IAAI,CP((
7*C!IAAI,CP(h_
#*C!C!
IAAI,CP
IAAI,CP%(
IAAI,CP
#*
IAAI,CP((
IAAI,CP
%(*MAAM,CP
IAAI, e = parseInt(k	e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 &1& v === 0)) || !(e >= 0 && e <= 5))\n    return 4	%fr-DJ\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sVjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,V[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],63Q4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" H] %\",\"#,##0.00 ¤\",\"#E0\"],\"DJF\",\"Fdj\",\"franc djiboutien\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"DJF\":[\"Fdj\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WSS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}gH~bx&so-DJ!so-DJ@	CAAC;IAEdPɓ:_IAAI=#

CAAC,EAAC,CAAC,MAAM OAAO,EAAC,OAAO<$

!(IAAI=#

CAAC,EAAC,CAAC,MAAM OAAO,EAAC,OAAO<$
QAAQ,EAAC,MAAM!ғ`#
cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,eAAe,EAAC,cAAc,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,eAAe,EAAC,uBAAuB,EAAC,wBAAwB,CAAC,CAAC,+ғ`#"UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQSAAS,EAAC,OAAO.2#_AcAAc,EAAC,eAAe@$++
#UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiE
g{Ó`
eAAe4*h7;\n\nif (n === 1	4so-DJ\",[[\"h\",\"d\"],[\"GH\",\"GD\"],u],[[\"AM\",\"GD\"],u,[\"GH\",\"GD\"]],[[\"A\",\"I\",\"T\",\"A\",\"Kh\",\"J\",\"S\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"],[\"Axad\",\"Isniin\",\"Talaado\",\"Arbaco\",\"Khamiis\",\"Jimco\",\"Sabti\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"]],[[\"A\",\"I\",\"T\",\"A\",\"Kh\",\"J\",\"S\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"],[\"Axad\",\"Isniin\",\"Talaado\",\"Arbaco\",\"Khamiis\",\"Jimco\",\"Sabti\C"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbaco\",\"Khms\",\"Jmc\",\"Sbti\"]])L\",\"OL8br\",\"May\",\"Jun\",\"Lul\",\"Ogs\",\"Seb\",\"Okt\",\"Nof\",\"Dis\"],[\"Bisha Koobaad\",\"Bisha Labaad\",\"Bisha Saddexaad\",\"Bisha Afraad\",\"Bisha Shanaad\",\"Bisha Lixaad\",\"Bisha Todobaad\",\"Bisha Sideedaad\",\"Bisha Sagaalaad\",\"Bisha Tobnaad\"7,\"Bisha Kow iyo Tobnaad\",\"Bisha Laba iyo Tobnaad\"]])L\",\"OL8br\",\"May\",\"Jun\",\"Lul\",\"Ogs\",\"Seb\",\"Okt\",\"Nof\",\"Dis\"],[\"Jannaayo\",\"Febraayo\",\"Maarso\",\"Abriil\",\"May\",U\"Juun\",\"Luuliyo\",\"Ogost\",\"Sebtembar\",\"Oktoobar\",\"Nofembar\",\"Desembar\"]]U#cCiise Hortii\",\"Ciise Dabadii\"]],6,[6,0],[\"dd/MM/yy\",\"dd-MMM-y\",\"MMMM d, y\",\"EEEE, MMMM d,J {0}\",\"{1} 'ee' {0}\",u:HMaL>DJF\",\"Fdj\",\"Faran Jabuuti\",{\"BBD\":[\"DBB\",\"$\"],\"DJF\":[\"Fdj\"],\"JPY\":[\"JP¥\",\"¥\"],\"SOS\":[\"S\"],\"USD\":[\%Ttx MH$MH@\`#,
UAAU,EAAC,WAAW,EAAC,iBAAi:WAAW,EAAC,EAAE&4MH\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM
>0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d,USD\",\"$\",\"US Dollar\",{!CbM4x(
ff-Latn-NG!
ff-Latn-NG@
CAAC;IAE7Ckk"YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,SAASK(2=P$MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EYAAY<QF-7`#


QAAQ,EAAC,QAAQ,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO@$
WAAW,EAAC,aAAa@$++
UAAU,EAAC,eAAeB
+
d2YAAY)kBAAkKz;\n\nif (i === 0 || i === 1	4ff-Latn-NG\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade5 Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM,M {0}\",u,u,u],[\",\",\" jcf#,##0.00 ¤\",\"#E0\"],\"NGN\",\"₦\",\"Nayraa Nijeriyaa\",{\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"₦H3}y9|x>(sv-F"sv-F?:<:,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,WAAW,EAAC,aAAa A=7
VQAAQ,EAAC,QAAQ,CAAC,E1(












MAAM$MAAM.SAASLOAAO,EAAC,OAAOcAAc,EAAC,eAAe@$++

eAAeB
+
<MAAM$(SAAS,EAAC,YAAY)MAAML
MAAM=L
IAAI,CN@
IAAI,CN@
(IAAI,CN@#IAAI,CAAC,EAAC,KAAK,EAAC,EAAEQ

#(
(IAAI,CN@

(IAAI,CN


IAAI,CN
#
"csv-FI\",[[\"fm\",\"em\"],u,u],[[\"fm\",\"em\"],[\"f.m.\",\"e.m.\"],[\"förmiddag\",\"eftermiddag\"]M
O\",\"T\",\"F\",\"L\"],[\"sön\",\"mån\",\"tis\",\"ons\",\"tors\",\"fre\",\"lör\"],[\"söndag\",\"måndag\",\"tisdag\",\"onsd[ag\",\"torsdag\",\"fredag\",\"lördag\"],[\"sö\",\"må\",\"ti\",\"on\",\"to\",\"fr\",\"lö<Ujan.\",\"feb.\",\"mars\",\"apr.\",\"maj\",\"juni\",\"juli\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januari\",\"februari\",\"mars\",\"april\",\"maj\",\"juni\",\"juli\",\"augusti\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"f.Kr.I\",\"e.Kr.\"],u,[\"före Kristus\",\"efter Kristus\"]],1,[6,0],[\"y-MM-dd"M= {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"−\",\"×10^$. %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AUD\":[u,\"$\"],\"BBD\":[\"Bds$\",\"$\"],\"BMD\":[\"BM$\",\"$\"],\"BRL\":[\"BR$\",\"R$\"],\"BSD\":[\"BS$\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"BZ$\",\"$\"],\"CNY\":[u,\"¥\"],\"DKK\":[\"Dkr\",\"kr\"],\"DOP\":[\"RD$\",\"$\"],\"EEK\":[\"Ekr\"],\"EGP\":[\"EG£\",\"E£\"],\"ESP\":[],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"IE£\"],\"INR\":[u,\"₹\"],\"ISK\":[\"Ikr\",\"kr\"],\"JMD\":[\"JM$\",\"$\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"NOK\":[\"Nkr\",\"kr\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"SEK\":[\"kr\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫`R6x- 	eAAe,EAAE;2export default [];\n"]}eT<x yo-BJ!yo-BJJr<\3x
(.es-VE!es-VE@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KP,OAAO,CAAC,CAAC;IACbkCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQx(P7O
,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS`oF7O
,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS`o#o
SAAS,EAAC,OAAO,EAAC,OAAO6OAAO,EAAC,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWpx(iBAAiB,EAAC,mBAAmBp/
/*
SAAS,EAAC,oBAAoB,EAAC,0BAA0B.WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAUA#2sBAAsB0
MAAM,EAAC,kBAAkB,EP	@
@
		
PJ										@(@
@(	-MAAM`=3	<EAAE, e = parseInt(Me]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0))& || !(e >= 0 && e <= 5))\n    return 4%es-VE\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"Do\",\"Lu\",\"Ma\",\"Mi\",\"Ju\",\"Vi\",\"Sa\"]],[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"Do\",\"Lu\",\"Ma\",\"Mi\",\"Ju\",\"Vi\",\"Sa\"]],[[\"E,Iene.\",\"feb.\",\"mar.\",\"abr.\",\"may.\",\"jun.\",\"jul.\",\"ago.\",\"sept.\",\"oct.\",\"nov.\",\"dic.\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",\"{1} {0}\",\"{1}, {0}\",u*],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"Eh$:"E¤#,##0.00;¤-#,##0.00\",\"#E0\"],\"VES\",\"Bs.S\",\"bolívar soberanRL\":[u,\"RPCAD\":[uy7ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"*LS\":[u,\"₪1|'MXN\":[u,\"$?"SP\":[u,\"SD£\"],\"SYP\":[u,\"S£!hu,\"$\"],\"VEF\":[\"Bs.\"],\"VES\":[\"Bs.S\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[AZjx	i.3fr-BJ!fr-BJ@lB:,1i`ACAAC,EAAC,CAAC,UAAUUAAU,EAAC,OAAO,EAAC,UAAU o;P#xKAAK$2
SAAS,KAAK,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,EAAC,WAAW]UAAU&$WAAW,EAAC,WAAW+oBAAoB,EAAC,oBAAo>
c6eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAem
aAAaqYAAYO
OAAO,EAAC,mBAAmB,E	
o

o
	
o

o
	
o

o


7
o
	(
o

o
8

o


7p	P
	
o

o
	

7p	P
o

o

o
	
o
7
o

o
p	((	{&i === 0 || ifr-BJ\",[[\"AM\",\"PM\"],u,u],u[2im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JSIGjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août"éc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\"h,\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[~~'à' {0}\",u],[\",\",\" e#,##0.00 ¤\",\"#E0\"],\"XOF\",\"F CFA\",\"franc CFA (BCEAO)\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FRKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\"EP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\"_:[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\"|HD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"T$OP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$!\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plur	al];\n"]}{S&x73en-NG!en-NG@!
CAAC;IAEjG/<_O	<<F
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1ECAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU?
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1#	
QAAQL_O	CAAC,eAAe,EAAC,aAAaPP
K
gBAAgBB
CAAC,EAAC,cAAc@QAAQ,EAAC,WAAW,E1oEAAC,gBAAgB,EA
w*;\n\nif (i === 1 && v === 0)\n    return 1%en-NG\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],.[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"SVJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"B,C\",\"AD\"],[\"Before Christ\",\"Anno Domini~9,M(, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",8]%\",\"¤#,##0.00\",\"#E0\"],\"NGN\",\"₦\",\"Nigerian Naira\",{\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"₦\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}]lx 33CI$CI@CI?^x x33MG$MG@IAAI,EAAC,iBAAiB,EA
@
(\#	
ZP{MGMGA\",\"Ar\",\"ariary malgache)
GA\":[\"Ar,,xX 33PF$PF@MAAM,EAAC,WAAW,EA
@
(B	PFPF\",\"FCFP\",\"franc CFP/mx 	FI$FI@"MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,cAAcASAAS,EAAC,YAAY)MAAMLB>FI	'.mm\",\"H.mm.ss\",\"H.mm.ss z\",\"H.mm.	2,\",\" BBQ.\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Euro -F*rxo M%M?IAAI,EAAC,iBAAiKCIAAI,CN1%M	MGA\",\"Ar\",\"Malagasy Ariary MGA\":[\"Ar3Ee!N.x	$'3fr-TG!fr-TG@lB:
(ATMAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,UAAUUAAU,EAAC,OAAO,EAAC,UAAU 8pp

MAAM,EAAC,MAAMSAAS,EAAC,MAAM,EAAC,OAAO`8SAAS,EAAC,MAAM,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,C"WAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoq>
JSAAS,EAAC,UAAU,EAAC,eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeUAAU,EAAC,aAAa1OAAO,EAAC,mBAAmB,E
(
(O^


(O-


(
(-



O-


(O



(-



7^

(
(O-

-7^


(
(O-

O
A
(

-MAAMO=&i === 0 || idfr-TG\",[[\"AM\",\"PM!!M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\>0janv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" UXOF\",\"F CFA\",\"franc CFA (BCEAO)\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":HCOP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],+\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\"zEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TO#P\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$(#5$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"a!PF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"~ Nx%

zh-Hans-SG!
zh-Hans-SG@]eAAe,C07RZ>7R#OAAOK)VVVVVCAAC
7export default [[[\"午夜\",\"早上\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"],u,[\"午夜\",\"清晨\",\"上\",\"中午\",\"下午\",\"晚上\",\"凌晨\"]],[[\"午夜\",\"早上\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"],u,u],[\"00:00\",[\"05:00\",\"08:00\"],[\"08:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"19:00\"],[\"19:00\",\"24:00\ "],[\"00:00\",\"05:00\"]]];\n"]}Ykxm%
zh-Hans-SG!
zh-Hans-SG@(YAAY.FZU\ApKF(A##\*
j	W-M
QAAQ,EAAC,CAAC,EAAC,YAAYBSAASQ\d(bGAAG,EAAC,MAAM,Ep	JB	#o	A
)			
B	y	o	<EAAE	"zh-Hans-SG\",[[\"上午\",\"下午\"],u,u],u,[[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],[\"周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周六\"],[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\"],[\"周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周六\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"]],u,[[\"公元前\",\"公元\"],u,u],0,[6,0],[\"dd/MM/yy\",\"y年Md日\",u,\"y年M月d日EEEE\"],[\"ah:mm\",\"ah:mm:ss\",\"z ah:mm:ss\",\"zzzz ah:mm:ss\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-E%\",\"¤#,##0.00\",\"#E0\"],\"SGD\",\"$\",\"新加坡元\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"ILR\":[\"ILS\"],\"JPY=KRW\":[\"￦\",\"₩NURUR\":[u,\"р.\"],\"SGD\":[\"$\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XXX\":[|0Xb ?x

m%mFu"MAAM,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ
"cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ1EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ"cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQOpagi\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],u,[\"tengah malam\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"]],[[\"pagi\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],[\"tengah malam\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],u],[[\"00:00\",\"01:00\"],[\"014:00\"],[\"14%&]];\n"]}z;Աxx~/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), t = parseInt(val.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0;
    if (n === 1 || !(t === 0) && (i === 0 || i === 1))
        return 1;
    return 5;
}
export default ["da", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "O", "T", "F", "L"], ["søn.", "man.", "tir.", "ons.", "tor.", "fre.", "lør."], ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], ["sø", "ma", "ti", "on", "to", "fr", "lø"]], [["S", "M", "T", "O", "T", "F", "L"], ["søn", "man", "tir", "ons", "tor", "fre", "lør"], ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], ["sø", "ma", "ti", "on", "to", "fr", "lø"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mar.", "apr.", "maj", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "dec."], ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"]], u, [["fKr", "eKr"], ["f.Kr.", "e.Kr."], u], 1, [6, 0], ["dd.MM.y", "d. MMM y", "d. MMMM y", "EEEE 'den' d. MMMM y"], ["HH.mm", "HH.mm.ss", "HH.mm.ss z", "HH.mm.ss zzzz"], ["{1} {0}", u, "{1} 'kl'. {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "DKK", "kr.", "dansk krone", { "AUD": ["AU$", "$"], "BYN": [u, "Br."], "DKK": ["kr."], "ISK": [u, "kr."], "JPY": ["JP¥", "¥"], "NOK": [u, "kr."], "PHP": [u, "₱"], "RON": [u, "L"], "SEK": [u, "kr."], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=da.js.map_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["dav", [["Luma lwa K", "luma lwa p"], u, u], u, [["J", "J", "K", "K", "K", "K", "N"], ["Jum", "Jim", "Kaw", "Kad", "Kan", "Kas", "Ngu"], ["Ituku ja jumwa", "Kuramuka jimweri", "Kuramuka kawi", "Kuramuka kadadu", "Kuramuka kana", "Kuramuka kasanu", "Kifula nguwo"], ["Jum", "Jim", "Kaw", "Kad", "Kan", "Kas", "Ngu"]], u, [["I", "K", "K", "K", "K", "K", "M", "W", "I", "I", "I", "I"], ["Imb", "Kaw", "Kad", "Kan", "Kas", "Kar", "Mfu", "Wun", "Ike", "Iku", "Imw", "Iwi"], ["Mori ghwa imbiri", "Mori ghwa kawi", "Mori ghwa kadadu", "Mori ghwa kana", "Mori ghwa kasanu", "Mori ghwa karandadu", "Mori ghwa mfungade", "Mori ghwa wunyanya", "Mori ghwa ikenda", "Mori ghwa ikumi", "Mori ghwa ikumi na imweri", "Mori ghwa ikumi na iwi"]], u, [["KK", "BK"], u, ["Kabla ya Kristo", "Baada ya Kristo"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Shilingi ya Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=dav.js.map.>x{"version":3,"file":"kw.js","sourceRoot":"","sources":["kw.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 0)\n    return 0;\nif (n === 1)\n    return 1;\nif (n % 100 === 2 || (n % 100 === 22 || (n % 100 === 42 || (n % 100 === 62 || n % 100 === 82))) || (n % 1000 === 0 && (n % 100000 === Math.floor(n % 100000) && (n % 100000 >= 1000 && n % 100000 <= 20000 || (n % 100000 === 40000 || (n % 100000 === 60000 || n % 100000 === 80000)))) || !(n === 0) && n % 1000000 === 100000))\n    return 2;\nif (n % 100 === 3 || (n % 100 === 23 || (n % 100 === 43 || (n % 100 === 63 || n % 100 === 83))))\n    return 3;\nif (!(n === 1) && (n % 100 === 1 || (n % 100 === 21 || (n % 100 === 41 || (n % 100 === 61 || n % 100 === 81)))))\n    return 4;\nreturn 5;\n}\n\nexport default [\"kw\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sul\",\"Lun\",\"Mth\",\"Mhr\",\"Yow\",\"Gwe\",\"Sad\"],[\"dy Sul\",\"dy Lun\",\"dy Meurth\",\"dy Merher\",\"dy Yow\",\"dy Gwener\",\"dy Sadorn\"],[\"Sul\",\"Lun\",\"Mth\",\"Mhr\",\"Yow\",\"Gwe\",\"Sad\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"Gen\",\"Hwe\",\"Meu\",\"Ebr\",\"Me\",\"Met\",\"Gor\",\"Est\",\"Gwn\",\"Hed\",\"Du\",\"Kev\"],[\"mis Genver\",\"mis Hwevrer\",\"mis Meurth\",\"mis Ebrel\",\"mis Me\",\"mis Metheven\",\"mis Gortheren\",\"mis Est\",\"mis Gwynngala\",\"mis Hedra\",\"mis Du\",\"mis Kevardhu\"]],u,[[\"RC\",\"AD\"],u,u],1,[6,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"GBP\",\"£\",\"GBP\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}gVsxe%dav!dav:(("KAAK,EAAC,CAAC,CAAC,YAAY,EAAC,YAAY)P_HgBAAgB,EAAC,kBAAkB,EAAC,eAAe,EAAC,iBAAiB,EAAC,eAAe,EAAC,iBAAiB,EAAC,cAAcp8}0P;kBAAkB,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,qBAAqB,EAAC,oBAAoB,EAAC,oBAAoB,EAAC,kBAAkB,EAAC,iBAAiB,EAAC,2BAA2B,EAAC,wBAAwB$#iBAAiB,EAAC,iBAAiB
mBAAmB,E
1
4
k

"dav\",[[\"Luma lwa K\",\"luma lwa p\"],u,u],u,[[\"J\",\"J\",\"K\",\"K\",\"K\",\"K\",\"N\"],[\"Jum\",\"Jim\",\"Kaw\",\"Kad\",\"Kan\",\"Kas\",\"Ngu\"],[\"Ituku ja jumwa\",\"Kuramuka jimweri\",\"Kuramuka kawi\",\"Kuramuka kadadu\",\"Kuramuka kana\",\"Kuramuka kasanu\",\"Kifula nguwo\"],[\"Jum\",\"Jim\",\"Kaw\",\"Kad\",\"Kan\",\"Kas\",\"Ngu\"]],u,[[\"I\",\"K\",\"K\",\"K\",\"K\",\"K\",\"M\",\"W\",\"I\",\"I\",\"I\",\"I\"],[\"Imb\",\"Kaw\",\"Kad\",\"Kan\",\"Kas\",\"Kar\",\"Mfu\",\"Wun\",\"Ike\",\"Iku\",\"Imw\",\"Iwi\"],[\"Mori ghwa imbiri\",\"Mori ghwa kawi\",\"Mori ghwa kadadu\",\"Mori ghwa kana\",\"Mori ghwa kasanu\",\"Mori ghwa karandadu\",\"Mori ghwa mfungade\",\"Mori ghwa wunyanya\",\"Mori ghwa ikenda\",\"Mori ghwa ikumi\",\"Mori ghwa ikumi na imweri\",\"Mori ghwa ikumi na iwi\"]],u,[[\"KK\",\"BK\"],u,[\"Kabla ya Kristo\",\"Baada ya Kristo\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y!KES\",\"Ksh\",\"Shilingi ya Kenya KES\":[\"Ksh3'KgxJ%jv!jv:(FOAAO)PMAAM$;TMAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,MAAM$}0P;]	
	
@OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,WAAWUAAU$
mBAAmB,EAAC,QAAQUAAU,EAAC,CAAC,EAAC,SAAS	YAAY0>

IAAI,EAAC,kBAAkB,E
IAAI~
3
"jv\",[[\"Isuk\",\"Wengi\"],u,u],u,[[\"A\",\"S\",\"S\",\"R\",\"K\",\"J\",\"S\"],[\"Ahad\",\"Sen\",\"Sel\",\"Rab\",\"Kam\",\"Jum\",\"Sab\"],[\"Ahad\",\"Senin\",\"Selasa\",\"Rabu\",\"Kamis\",\"Jumat\",\"Sabtu\"],[\"Ahad\",\"Sen\",\"Sel\",\"Rab\",\"Kam\",\"Jum\",\"Sab\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Agt\",\"Sep\",\"Okt\",\"Nov\",\"Des\"],[\"Januari\",\"Februari\",\"Maret\",\"April\",\"Mei\",\"Juni\",\"Juli\",\"Agustus\",\"September\",\"Oktober\",\"November\",\"Desember\"]],u,[[\"SM\",\"M\"],u,[\"Sakdurunge Masehi\",\"Masehi\"A]],0,[6,0],[\"dd-MM-y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM yD#, {0}\",u,\"{1} {0}\",u],[\",\",\".e p4IDR\",\"Rp\",\"Rupiah Indonesia\",{\"IDR\":[\"Rp\"],IaN+x%lkt!lkt:((KAAK,EAA@cAAc,EAAC,aAAa,EAAC,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,cAAc,EAAC,eAAe.A@cAAc,EAAC,aAAa,EAAC,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,cAAc,EAAC,eAAe.eAAe,EAAC,iBAAiB,EAAC,mBAAmB,EAAC,aAAa,EAAC,gBAAgB,EAAC,oBAAoB,EAAC,gBAAgB,EAAC,aAAa,EAAC,eAAe,EAAC,mBAAmB,EAAC,aAAa,EAAC,gBAAg	
UJ
UAAU,EAAC,WAAW,EAAC,iBAAiB:^
aAAa	]	YAAY0>
K
"lkt\",[[\"AM\",\"PM\"],u,u],u,[[\"A\",\"W\",\"N\",\"Y\",\"T\",\"Z\",\"O\"],[\"Aŋpétuwakȟaŋ\",\"Aŋpétuwaŋži\",\"Aŋpétu[nuŋpa\",\"Aŋpétuyamni\",\"Aŋpétutopa\",\"Aŋpétuzaptaŋ\",\"Owáŋgyužažapi\"],u,u]1Aŋpétuwakȟaŋ\",\"Aŋpétuwaŋži\",\"Aŋpétunuŋpa\",\"Aŋpétuyamni\",\"Aŋpétutopa\",\"Aŋpétuzaptaŋ\",\"Owáŋgyužažapi\"],u,u]RWiótheȟika Wí\",\"Thiyóȟeyuŋka Wí\",\"Ištáwičhayazaŋ Wí\",\"Pȟežítȟo Wí\",\"Čhaŋwápetȟo Wí\",\"Wípazukȟa-wašté Wí\",\"Čhaŋpȟásapa Wí\",\"Wasútȟuŋ Wí\",\"Čhaŋwápeǧi Wí\",\"Čhaŋwápe-kasná Wí\",\"Waníyetu Wí\",\"Tȟahékapšuŋ Wí\"],u],u,[[\"BCE\",\"CE\"],u,u],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:0mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a pUSD\",\"$\",\"USDEN!x%qu!qu:("]	
OAAON

SAAS,EAAC,QAAQp8͓;+	
6SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAONSAAS,EAAC,WAAW,EAAC,WAAW$MAAMdcAAc,EAAC,eAAe[iBAAi	WSAAS,EAAC,SAAS	SAAS,EAAC,YAAY0>

IAAI,EAAC,aAAa,E
1
(
(
(

6>

k
-IAAI~


"qu#D\",\"L\",\"M\",\"X\",\"J\",\"V\",\"S\"],[\"Dom\",\"Lun\",\"Mar\",\"Mié\",\"Jue\",\"Vie\",\"Sab\"],[\"Domingo\",\"Lunes\",\"Martes\",\"Miércoles\",\"Jueves\",\"Viernes\",\"Sábado\"],[\"Dom\",\"Lun\",\"Mar\",\"Mié\",\"Jue\",\"Vie\",\"Sab\"]],u,[[\"1\"JEne\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Jul\",\"Ago\",\"Set\",\"Oct\",\"Nov\",\"Dic\"],[\"Enero\",\"Febrero\",\"Marzo\",\"Abril\",\"Mayo\",\"Junio\",\"Julio\",\"Agosto\",\"Setiembre\",\"Octubre\",\"Noviembre\",\"Diciembre\"]],u,[[\"a.d.\",\"dC\"],[\"a.d.\",\"d.C.\"],[\"ñawpa cristu\",\"chanta cristu\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM, y\"],I\"{0} {1}\",\"{1} {0}\"i %\",\"¤ pPEN\",\"S/\",\"Sol Peruano\",{\"BBD\":[\"BBG\",\"$\"],\"BMD\":[\"DBM\",\"$\"],\"BZD\":[\"DBZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"GHS\":[u,\"GHC\"],1PEN\":[\"S/\"],\"PHP\":[u,\"₱\"],\"USD\":[\"$US!tbYxh%zh-Hans!zh-Hans:((SAAS,EAAEAAC,IAAI,EAAC,IAAIRV;EAAC,IAAI,EAAC,IAAIR$EEAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;OEAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI#
U+	
QAAQ,EAAC,CAAC,EAAC,YAAY	}
IAAI~
z
#4
k
-




IAAI~
4
k
(EAAE
"zh-Hans\",[[\"上午\",\"下午\"],u,u],u,[[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],[\"周日\",\"周一\",\"二\",\"周三\",\"周四\",\"周五\",\"周六\"],[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"e期五\",\"星期六\"],[\"周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周六X1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"]],u,[T[\"公元前\",\"公元\"],u,u],0,[6,0],[\"y/M/d\",\"y年M月d日\",u,\"y年M月d日"z HH:mm:ss\",\"zzzz HH:mm:ssCNY\",\"¥\",\"人民币\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"CNY\":[\"¥\"],\"ILR\":[\"ILS\"],\"JPY\":[\"JP¥\",\"KRW\":[\"￦\",\"₩\"],\"PHP\":[u,\"₱\"],\"RUR\":[u,\"р.\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XXX\":[]},\"ltr\", pI:xb%zh-Hant!zh-Hant:((SAAS,EAAEAAC,IAAI,EAAC,IAAIRV;	AEEAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;
U+	
QAAQ,EAAC,CAAC,EAAC,aAAa	$cAAc,EAAC,iBAAiBM	K
IAAI~







IAAI~
z
7KAAK,EAAC,EAAE
"zh-Hant\",[[\"上午\",\"下午\"],u,u],u,[[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],[\"週日\",\"週一\",\"二\",\"週三\",\"週四\",\"週五\",\"週六\"],[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"P期五\",\"星期六\"],[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六X1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],u],u,[[\"西元\",\"西元\"],u,u],0,[6,0],[\"y/M/d\",\"y年M月d日\",u,\"y年M月d日 EEEE\"],[\"Bh:mm\",\"Bh:mm:ss\",\"Bh:mm:ss [z]\",\"Bh:mm:ss [zzzz]\	非數值H>TWD\",\"$\",\"新台幣\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"KRW\":[\"￦\",\"₩\"],\"PHP\":[u,\"₱\"],\"RON\":[uM,\"L\"],\"RUR\":[u,\"р.\"],\"TWD\":[\"$\"],\"USD\":[\"US$\",\"$\"],\"XXX\":[hX=sx%ebu!ebu<ѓa(P_@QAAQ,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,aAAa!Q'gBAAgNoBAAoB,EAAC,mBAAmB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,wBAAwB,EAAC,yBAAyB/$a4kBAAkB/$ebu\",[[\"KI\",\"UT\"],u,u],u,[[\"K\",\"N\",\"N\",\"N\",\"A\",\"M\",\"N\"],[\"Kma\",\"Tat\",\"Ine\",\"Tan\",\"Arm\",\"Maa\",\"NMM\"],[\"Kiumia\",\"Njumatatu\",\"Njumaine\",\"Njumatano\",\"Aramithi\",\"Njumaa\",\"NJumamothii\"],[\"Kma\",\"Tat\",\"Ine\",\"'Tan\",\"Arm\",\"Maa\",\"NMM\"]],u,[[\"MG\",\"G\",\"M\",\"K\",\"K	],[\"Mbe\",\"Kai\",\"Kat\",\"Kan\",\"Gat\",\"Gan\",\"Mug\",\"Knn\",\"Ken\",\"Iku\",\"Imw\",\"Igi\"],[\"Mweri wa mbere\",\"Mweri wa kaĩri\",\"Mweri wa kathatũ\",\"Mweri wa kana\",\"Mweri wa gatano\",\"Mweri wa gatantatũ\",\"Mweri wa mũgwanja\",\"Mweri wa kanana\",\"Mweri wa kenda\",\"Mweri wa ikũmi\",\"Mweri wa ikũmi na ũmwe\",\"Mweri wa ikũmi na Kaĩrĩ\"]],u,[[\"MK\",\"'TK\"],u,[\"Mbere ya Kristo\",\"Thutha wo3\xpt!pt<]eAAe,C"UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU1
,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,WAAW)
OAAOOAAOOAAOOAAOOAAO,CAAC,CAAC7export default [[[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",\"da noite\",\"da madrugada\"],u,u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],u,u],[\"00:00\",\"12:00\",[\"06:00\",\"12:00\"],[\"12:00\",\"19:00\"]4,[\"19:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}9Idxelu!lu:OAAO,EAAC,QAAQ Z\
"F6QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,SAASQ
#@QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,aAAa$WAAW,EAAC,OAAO$WAAW,EAAC,YAAY sBAAsB,EAAC,sBAAsB$

OAAO2SAAS0
LWAAWmBAAmB,E]/lu\",[[\"Dinda\",\"Dilolo\"],u,u],u,[[\"L\",\"N\",\"N\",\"N\",\"N\",\"N\",\"L\"],[\"Lum\",\"Nko\",\"Ndy\",\"Ndg\",\"Njw\",\"Ngv\",\"Lub\"],[\"Lumingu\",\"Nkodya\",\"Ndàayà\",\"Ndangù\",\"Njòwa\",\"Ngòvya\",\"Lubingu\"],[\"Lum\",\"Nko\",\"Ndy\",\"Ndg\",\"Njw\",\"Ngv\",\"Lub\"]],u,[[\"C\",\"L\",\"L\",\"M\",\"L\",\"L\",\"K\",\"L\",\"L\",\"L\",\"K\",\"C\"],[\"Cio\",\"Lui\",\"Lus\",\"Muu\",\"Lum\",\"Luf\",\"Kab\",\"Lush\",\"Lut\",\"Lun\",\"Kas\",\"Cis\"],[\"Ciongo\",\"Lùishi\",\"Lusòlo\",\"Mùuyà\",\"Lumùngùlù\",\"Lufuimi\",\"Kabàlàshìpù\",\"Lùshìkà\",\"Lutongolo\",\"Lungùdi\",\"Kaswèkèsè\",\"Ciswà\"]],u,[[\"kamp. Y.K.\",\"kny. Y. K.\"],u,[\"Kumpala kwa Yezu Kli\",\"Kunyima kwa Yezu Kli\"]],1,[6,0],[\"d/M/
#
M
 {0}\",u,uIqI#,##0.00¤\",\"#E0\"],\"CDF\",\"FC\",\"Nfalanga wa Kongu\",{\"CDF\":[\"FCMMk"`x!
eAAe,CAAC,CAAC,CAE
KU/EA
OAAOOAAOOAAOOAAOOAAOOAAO,CAAC,CAAC7export default [[[\"午夜\",\"早上\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"],u,[\"午夜\",\"清晨\",\"上\",\"中午\",\"下午\",\"晚上\",\"凌晨\"]],[[\"午夜\",\"早上\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"],u,u],[\"00:00\",[\"05:00\",\"08:00\"],[\"08:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"19:00\"],[\"19:00\",\"24:00\ "],[\"00:00\",\"05:00\"]]];\n"]}x~ yue&yue?UAAUoj

~yue>	西元前\",\"西		非数值Fￓ-J
￥\",\"¥b8 4F=xp 
yue&yue?ГUZ


F晨\",\"朝早\",\"中午\",\"下昼\",\"夜晚\",\"凌晨\"],u,u],u;0F
vx Vyue&yue?UAAUP
K6
IAAIē
yuefA	au	c)ah:mm\",\"ah:mm:ss\",\"ah:mm:ss [z]\",\"a-HKD\",\"HK$\",\"港dh8Ǘ8;8xieAAe,C	2N
OAAOOAAOOAAOOAAOOAAOOAAO,CAAC,CAACm7export default [[[\"午夜\",\"清晨\",\"朝早\",\"中午\",\"下晝\",\"夜晚\",\"凌晨\"],u,u],u,[\"00:00\",[\"05:00\",\"~08:00\"],[\"08:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"19:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}mxx? zh&zhA'上午\",\"中午\",\"下午\",\"晚上o x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["de-AT", [["AM", "PM"], u, u], [["vm.", "nm."], ["AM", "PM"], u], [["S", "M", "D", "M", "D", "F", "S"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["S", "M", "D", "M", "D", "F", "S"], ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jän.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sep.", "Okt.", "Nov.", "Dez."], ["Jänner", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jän", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Jänner", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'um' {0}", u], [",", " ", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":", u, "."], ["#,##0.###", "#,##0 %", "¤ #,##0.00", "#E0"], "EUR", "€", "Euro", { "ATS": ["öS"], "AUD": ["AU$", "$"], "BGM": ["BGK"], "BGO": ["BGJ"], "BYN": [u, "р."], "CUC": [u, "Cub$"], "DEM": ["DM"], "FKP": [u, "Fl£"], "GHS": [u, "₵"], "GNF": [u, "F.G."], "KMF": [u, "FC"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "RWF": [u, "F.Rw"], "SYP": [], "THB": ["฿"], "TWD": ["NT$"], "XXX": [], "ZMW": [u, "K"] }, "ltr", plural];
//# sourceMappingURL=de-AT.js.map3]xF/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["de-BE", [["AM", "PM"], u, u], u, [["S", "M", "D", "M", "D", "F", "S"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["S", "M", "D", "M", "D", "F", "S"], ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'um' {0}", u], [",", ".", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euro", { "ATS": ["öS"], "AUD": ["AU$", "$"], "BGM": ["BGK"], "BGO": ["BGJ"], "BYN": [u, "р."], "CUC": [u, "Cub$"], "DEM": ["DM"], "FKP": [u, "Fl£"], "GHS": [u, "₵"], "GNF": [u, "F.G."], "KMF": [u, "FC"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "RWF": [u, "F.Rw"], "SYP": [], "THB": ["฿"], "TWD": ["NT$"], "XXX": [], "ZMW": [u, "K"] }, "ltr", plural];
//# sourceMappingURL=de-BE.js.mapOx)/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["de-CH", [["AM", "PM"], u, u], u, [["S", "M", "D", "M", "D", "F", "S"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]], [["S", "M", "D", "M", "D", "F", "S"], ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'um' {0}", u], [".", "’", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤-#,##0.00", "#E0"], "CHF", "CHF", "Schweizer Franken", { "ATS": ["öS"], "AUD": ["AU$", "$"], "BGM": ["BGK"], "BGO": ["BGJ"], "BYN": [u, "р."], "CUC": [u, "Cub$"], "DEM": ["DM"], "EUR": [], "FKP": [u, "Fl£"], "GHS": [u, "₵"], "GNF": [u, "F.G."], "KMF": [u, "FC"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "RWF": [u, "F.Rw"], "SYP": [], "THB": ["฿"], "TWD": ["NT$"], "XXX": [], "ZMW": [u, "K"] }, "ltr", plural];
//# sourceMappingURL=de-CH.js.map'Xxv{"version":3,"file":"ru-KG.js","sourceRoot":"","sources":["ru-KG.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))\n    return 3;\nif (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ru-KG\",[[\"AM\",\"PM\"],u,u],u,[[\"В\",\"П\",\"В\",\"С\",\"Ч\",\"П\",\"С\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],[\"воскресенье\",\"понедельник\",\"вторник\",\"среда\",\"четверг\",\"пятница\",\"суббота\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"мар.\",\"апр.\",\"мая\",\"июн.\",\"июл.\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"января\",\"февраля\",\"марта\",\"апреля\",\"мая\",\"июня\",\"июля\",\"августа\",\"сентября\",\"октября\",\"ноября\",\"декабря\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"март\",\"апр.\",\"май\",\"июнь\",\"июль\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"январь\",\"февраль\",\"март\",\"апрель\",\"май\",\"июнь\",\"июль\",\"август\",\"сентябрь\",\"октябрь\",\"ноябрь\",\"декабрь\"]],[[\"до н.э.\",\"н.э.\"],[\"до н. э.\",\"н. э.\"],[\"до Рождества Христова\",\"от Рождества Христова\"]],1,[6,0],[\"dd.MM.y\",\"d MMM y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"не число\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"KGS\",\"сом\",\"киргизский сом\",{\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"KGS\":[\"сом\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUB\":[\"₽\"],\"RUR\":[\"р.\"],\"THB\":[\"฿\"],\"TMT\":[\"ТМТ\"],\"TWD\":[\"NT$\"],\"UAH\":[\"₴\"],\"XXX\":[\"XXXX\"]},\"ltr\", plural];\n"]}~Փ\x21
ff-Latn-GH!
ff-Latn-GH@
CAAC;IAE7Ca
	;QAClB=YAAY,EAAC,CAAC,CAAC,QAAQ`

`P\ak
k
k
k
I	.WAAW,EAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,CAAC,EAAC,C]k
k
k
k
KAAK	$oak
k
k
k
k
k
k
k
k
I
OAAOQAAQ,EAAC,OAAOOPI	OAAO,EAAC,OAAO	$KAAK,E[WAAW,EAAC,aAAa	=N
BUAAU,EAAC,eAAe,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB

`

%7-KAAKQWAAW,EAAC,QAAQ,EAAC,YAAY,Ek
k
#(R*;\n\nif (i === 0 || i === 1)\n    return 1%ff-Latn-GH\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}SNaN ; [GHS\",\"GH₵\",\"GHS\",{\"GHS\":[\"GH₵\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$n\\x7e%eFZEAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG%kOAAO.+IAAI,EAAC,IAAI$IAAI,EAAC,IAAI>A+_}
j
SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CA/MAAM{SAAS;EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,WAAW,EAAC,SAASOC/+.IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,eAAe,EAAC,aAAa,C/$SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgBmDUAAU,EAAC,CAAC,EAAC,cAAcA#G2WAAWp

eAAeP, v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 04en-GH\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"]R,[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d MMM,Q(, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",Bc
¤#,##0.00!hanaian Cedia3x- 	eAAe,EAAE;2export default [];\n"]}dOxHSE$SE@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeC~MAAM$(SAAS,EAAC,YAAYIAAIB)#IAAI,CN%SE	y-MM-dd3.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss0*,\",\" \",\";\",\"%\",\"+\",\"-\",\"×10^d?B %\",\"#,##0.00 ¤\",\"#E0\"],\"SEK\",\"kr\",\"Swedish Krona\",{SEK\":[\"kr3_8Wx NF$NF@((#GAAG,EAAC,mBAAmBJnL
nL
n%NF	dd/MM/y.\",\",AEc?g%\",\"¤#,##0.00\",\"#E0\"],\"AUD\",\"$\",\"Australian Dollar\",{\"AUD\":[\"$\"],\"JPY\":[\"JP¥\",\"¥3.@oIxm3fr-BI!fr-BI@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KkClCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQ:7P=







MAAMA)UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,CAAC,E1(


OAAO,EAAC,MAAM,EAAC,OAAOMAAMSAAS,EAAC,MAAM$SAAS,EAAC,MAAM,E
<(WAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoB@$++

eAAeBaAAadU`
iBAAiBJBL
nA(_-L
n
7}L
nL
n
nL
n#_
7}L
nnL
nL
n
n#_
(_
(_
n
(#(_-L
n
7}
n#_
n
7}L
nL
n
7}
#_-L
n#_
nMAAM
IAAI, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e ==[= 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4	%fr-BI\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sVjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM 
M4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" AEcaBIF\",\"FBu\",\"franc burundais\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BIF\":[\"FBu\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FC0FP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}BDFxE3fr-MF!fr-MF@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KkClCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQ:7P=







MAAMA)UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,CAAC,E1(


OAAO,EAAC,MAAM,EAAC,OAAOMAAMSAAS,EAAC,MAAM$SAAS,EAAC,MAAM,E
<(WAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoB@$++

eAAeBaAAadUP<L
nU}L
n
7}L
nL
n
nL
n#_
7}L
nnL
nL
n
n#_
(_
(_
n
(#(_-L
n
7}
n#_
n
7}L
nL
n
7}
#_-L
n#_
nMAAM
IAAI, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e ==[= 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4	%fr-MF\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sVjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM 
M4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" AEcaEUR\",\"€\",\"euro\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}w9Pxha-GH!ha-GH@	CAAC;IAEdPQ:(QAAQ,EAAC,OAAO *
SAAS,EAAC,QAAQ,CAAC,E1(
`#WAAW,EAAC,OAAO,EAAC,SAAS
*
 SAAS@$
MAAMsBAAsB,EAAC,sBAAsB@$++
0QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,gBAAgB,CAAC,EAAC,CaAAa,EAAC,gBAAgBA.SAAS,CAAC,Em(QAAQ)`
F#(_;\n\nif (n === 1	4ha-GH\",[[\"SF\",\"YM\"],u,[\"Safiya\",\"Yamma\"]],[[\"SF\",\"YM\"],u,u],[[\"L\",\"L\",\"T\",\"L\",\"A\",\"J\",\"A\"],[\"Lah\",\"Lit\",\"Tal\",\"Lar\",\"Alh\",\"Jum\",\"Asa\"],[\"Lahadi\",\"Litinin\",\"Talata\",\"Laraba\",\"Alhamis\",\"Jummaʼa\",\"Asaba4r\"],[\"Lh\",\"Li\",\"Ta\",\"Lr\",\"Al\",\"Ju\",\"As)Y\",\"YB.ab\",\"Mar\",\"Afi\",\"May\",\"Yun\",\"Yul\",\"Agu\",\"Sat\",\"Okt\",\"Nuw\",\"Dis\"],[\"Janairu\",\"Faburairu\",\"Maris\",\"Afirilu\",\"Mayu\",\"Yuni\",\"Yuli\",\"Agusta\",\"Satumba\",\"Oktoba\",\"Nuwamba\",\"Disamba\"]],u,[[\"K.H\",\"BHAI\"],u,[\"Kafin haihuwar annab\",\"Bayan haihuwar annab\"]],1,[6,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE d MMMM, y\"],[\"h:mm a\",\"h&:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a	 !da' {0}\",\"{1} {0}\"],[\".\",\",AEc?%\",\"¤ #,##0.00\",\"#E0\"],\"GHS\",\"GH₵\",\"Sidi na Ghana\",{\"GHS\":[\"GH₵\"],\"NGN\":[\"₦\"]},\"ltr\", plural];\n"]}-vql0x7se$se=	CAAC;IAEdP,OAAO,CAAC,CAAC;IACbPQMAAM,EAAC,MAAMaAAa,EAAC,eAAe MAAM,EAAC,MAAMYAAY,EAAC,cAAc A=

LaAAa,EAAC,WAAW,EAAC,YAAY,EAAC,aAAa,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW,CAAC,EAAC,C

KAAK@3-=











MAAMcEAAC,aAAa,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa@$OAAO,EAAC,OAAOiBAAiB,EAAC,kBAAkB@$++

\
+
<gBAAgBJ$7}L
nL
n<;\n\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2	%se-SE\",[[\"i.b.\",\"e.b.\"],u,[\"iđitbeaivet\",\"eahketbeaivet\"]],[[\"i.b.\",\"e.b.\"],u,[\"iđitbeaivi\",\"eahketbeaivi\"]],[[\"S\",\"V\",\"M\",\"G\",\"D\",\"B\",\"L\"],[\"sotn\",\"vuos\",\"maŋ\",\"gask\",\"duor\",\"bear\",\"láv\"],[\"sotnabeaivi\",\"vuossárga\",\"maŋŋebárga\",\"gaskavahkku\",\"duorasdat\",\"bearjadat\",\"lávvardat\"],[\"sotn\",\"vuos\",\"maŋ\",\"gask\",\"duor\",\"bear\",\"láv\"]],u,[[\"O\",\"G\",\"N\",\"C\",\"M\",\"G\",\"S\",\"B\",\"Č\",\"G\",\"S\",\"J\"],[\"ođđj\",\"guov\",\"njuk\",\"cuo\",\"mies\",\"geas\",\"suoi\",\"borg\",\"čakč\",\"golg\",\"skáb\",\"juov\"],[\"ođđajagemánnu\",\"guovvamánnu\",\"njukčamánnu\",\"cuoŋománnu\",\"miessemánnu\",\"geassemánnu\",\"suoidnemánnu\",\"borgemánnu\",\"čakčamánnu\",\"golggotmánnu\",\"skábmamánnu\",\"juovlamánnu\"]],u,[[\"o.Kr.\",\"m.Kr.\"],u,[\"ovdal Kristtusa\",\"maŋŋel Kristtusa'y MMM d\",\"y MMMM d\",\"y MMMM d, EEEED
 {0}\",u,u2&−\",\"·10^\",\"·jiruoŧŧa kruvdno\",{\"DKK\":[\"Dkr\",\"kr\"],\"JPY\":[\"JP¥\",\"¥\"],\"NOK\":[\"Nkr\",\"kr\"],\"SEK\":[\"kr\"],\"THB\":[\"฿3̕*0xu AI$AI@uBAAuK(f%AI	'XCD\",\"$\",\"East Caribbean Dollar\",{1
,\"XCD\":["#24x	BI$BI@\`#,#QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAi.`
iBAAiKKAAK04BI\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM
3M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d,1BIF\",\"FBu\",\"Burundian Franc\",{\"BIF\":[\"FBuJZxz 33RE$RE@oEAAC,MAAM,Eh#`K@
_O
((O
-#FO
(
NREEUR\",\"€\",\"euroHN(fx	34es-PE!es-PE@;QACP5AP
P_;
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5oF;
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E;CAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS5oAAOAAO,EAAC,SAAS,E1"5QAAQWAAW,EAAC,WAAW_A2PAOAAO,EAAC,SAAS,E1"5QAAQWAAW,EAAC,WAAW5AiBAAiB,EAAC,mBAAmBPP
KoBAAoB,EAAC,0BAA0BB
FIAAI,EAAC,aAAa!oP 
o2
o2o2o2o2o2o2o
 
o
o2o#EAAE8EAAE!n*es-PE\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]]2om\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\"G,\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"EIJene.\",\"feb.\",\"mar.\",\"abr.\",\"may.\",\"jun.\",\"jul.\",\"ago.\",\"se}ic.\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"setiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],[[\"EIEne.\",\"Feb.\",\"Mar.\",\"Abr.\",\"May.\",\"Jun.\",\"Jul.\",\"Ago.\",\"Set.\",\"Oct.\",\"Nov.\",\"Dic.\"],[\"Enero\",\"Febrero\",\"Marzo\",\"Abril\",\"Mayo\",\"Junio\",\"Julio\",\"Agosto\",\"Setiembre\",\"Octubre\",\"Noviembre\",\"Diciembre\"]],[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"d/MM/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de'F, {0}\",u],[\".\",\",6eX¤ #,##0.00\",\"#E0\"],\"PEN\",\"S/\",\"sol peruano\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R9CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$p!LS\":[u,\"₪\"],\"INR\":[u,\"₹BRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PEN\":[\"S/Y#SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£!:u,\"$\"],\"VEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[oOF\":[]},\"ltr\", plural];\n"]}}x G33TD$TD@$QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBMAAM,EAAC,kBAAkB!	TD2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a!XAF\",\"FCFA\",\"franc CFA (BEAC)8&^xs	43fr-CH!fr-CH@lB:
H	M	A`A	UAAU,EAAC,OAAO,EAAC,UAAU oM		




KAAK,EAAC,MAAM$

	
6MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,UAAU,EAAC,UAAUQ	M	WAAW,EAAC,WAAW=	oBAAoB,EAAC,oBAAoBQ	M	(	gBAAg	/mBAAmBUAAU,EAAC,aAAa!
s<

R
# EAAC,cAAc,E
}

}
f
}

}
J
}

}

}
?7
}

J
}

}

}

}
?7


7J


}

}
J
}
?7
7J
}

}

}
J
}
7
}

}

-MAAM
3&i === 0 || i,fr-CH\",[[\"AM\",\"PM\"],u,u],u2im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"J!IOjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"seppéc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd.MM.yy\)",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM1M.mm:ss 'h' zzzz\"],[\"{1} {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" kE,\".%\",\"#,##0.00 ¤\",\"#E0\"],\"CHF\",\"CHF\",\"franc suisse\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\"KCOP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],+\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\"3EP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤ITMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"USGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$!7\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"!PF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"Lax;4$it-CH!it-CH@lB:
5

\	
M	A_	
2	
pFW	M	A(
UAAUQAAQ,EAAC,QAAQ,EAAC,QAAQ"$UAAU,EAAC,UAAUQ	M	:
[CAAC,EAAC,CAAC,eAAe,EAAC,aAAaQ	M	(	gBAAg	MCAAC,EAAC,SAAS!
\
uBAAuB

 EAAC,iBAAiB,ErJn
20P(.P&i === 1 && v === 02Kit-CH\",[[\"m.\",\"p.\"],[\"AM\",\"PM\"],u],u,[[\"D\",\"L\",\"M\",\"M\",\"G,er\",\"gio\",\"ven\",\"sab\"],[\"domenica\",\"lunedì\",\"martedì\",\"mercoledì\",\"giovedì\",\"venerdì\",\"sabato\"],[\"do&er\",\"gio\",\"ven\",\"sab\"]],u,[[\"G!G\",\"L%gen\",\"feb\",\"mar\",\"apr\",\"mag\",\"giu\",\"lug\",\"ago\",\"set\",\"ott\",\"nov\",\"dic\"],[\"gennaio\",\"febbraio\",\"marzo\",\"aprile\",\"maggio\",\"giugno\",\"luglio\",\"agosto\",\"settembre\",\"ottobre\",\"novembre\",\"dicembre\"]],u,[[\"aC\",\"dC\"],[\"a.C.\",\"d.C.\"],[\"avanti Cristo\",\"dopo Cristo\"]],1,[6,0],[\"dd.MM.yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"Ju,\"{1} {0}\",u],[\".\",\"’k]O%\",\"¤ #,##0.00;¤-#,##0.00\",\"#E0\"],\"CHF\",\"CHF\",\"franco svizzero\",{ Br\"],\"EGP\":[u,\"£EMOK\":[u,\"NKr\"],\"THB\":[\"฿- {qZ4xP4$pt-CH!pt-CH@IAAI!@&zC\M	
	
UAAUQ	\M	
	

W	A
	
>QAAQ,EAAC,OAAO 
,eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa `AR	M	
WAAWB	UAAUQ	M	\M	
iBAAiB,EAAC,kBAAkBQ	M	(		^CAAC,EAAC,cAAc!
\

# EAAC,cAAc,E
}
J
}
?7F

}
&)i === Math.floor(i) && (i >= 0 && i <= 1)2pt-CH\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\"&,\"qui.\",\"sex.\",\"sáb.\"]],u,[[\"J!I'jan.\",\"fev.\",\"mar.\",\"abr.\",\"maiM+ut.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\8"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.q!1pois de Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"dd/MM/"u,\"{1} 'às' {0}\",u],[\",\",\" k]%\",\"#,##0.00 ¤\",\"#E0\"],\"CHF\",\"CHF\",\"franco suíço\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"​\"],\"RON\":[u,\"L\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\h.Bx%$en$en=$
CAAC;IAEjG/<
#	
_\#A
U'UAAU,CAAC,EEAAC,IAAI,EAAC,IAAI,EAAC,IAAI,E]U_2
FMAAM-"OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAMV
#K
%\cAAc	_aAAaK	T
q-"en-CH\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],;[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"JYJ\",\"J}%Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BBC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/'at'p9·tXSwiss Franc\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}A}4x,,de$de=:7P=P=QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,CAAC,E1(
_2=:(
I
6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&





OAAOMAAM,CAAC,EAAC,CMAAMo_7`# MAAMo_SAAS,EAAC,SAASK++
#UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,iBAAi:mBAAmB_IAAI,CNE*C!IAAI,CN
MAAM,CNIAAI,CAAC,EAAC,KAAK,EAAC,EAAEQ
%p
MAAM,CN
IAAI,CN
p
p
IAAI,CN
MAAM,CAAC,EAAC,KAAK,EAAC,EAAEQp#*EAAEQ
1de-CH\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]]
R.\",\"Feb.\",\"März\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sept.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Januar\",\"Februar\-",\"März\",\"April\",\"Mai\",\"Juni\",\"Julik
zember\"]]
`är\",\"Apr\",\"Main _\",\"Okt\",\"Nov\",\"Dez\"],[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Julikezember\"]],[[\"v. Chr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d.\umchweizer Franken\",{\"ATS\":[\"öS\"],\"AUD\":[\"AU$\",\"$\"],\"BGM\":[\"BGK\"],\"BGO\":[\"BGJ\"],\"BYN\":[u,\"р.\"],\"CUC\":[u,\"Cub$\"],\"DEM\":[\"DM\"],\"EUR\":[],\"FKP\":[u,\"Fl£\"],\"GHS\":[u,\"₵\"],\"GNF\":[u,\"F.G.\"],\"KMF\":[u,\"FC\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"RWF\":[u,\"F.Rw\"],\"SYP\":[],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XXX\":[],\"ZMW\":[u,\"KFJBxz GG$GG@
%GAAG,EAAC,UAAU_mGG	U,&#×K@-#,##0.00\",\"#E0\"],\"GBP\",\"£\",\"UK PoundM!x +SD$SD@aAAa,EAAC,gBAAgBAؓ
%#gBAAgB_mSD	6,[5,6?2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a6,&#×K@4#,##0.00\",\"#E0\"],\"SDG\",\"SDG\",\"Sudanese PoundMQ=Mx&
ff-Latn-NE!
ff-Latn-NE@
CAAC;IAE7Ckk"YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,SAASK(2=P$MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EYAAY<QF-7`#


QAAQ,EAAC,QAAQ,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO@$
WAAW,EAAC,aAAa@$++
UAAU,EAAC,eAAeB
+
d2YAAYOAAO,EAAC,qBAAqB_;\n\nif (i === 0 || i === 1	4ff-Latn-NE\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"HadeM Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEEM {0}\",u,u,u],[\",\",\" &#×K>B#,##0.00 ¤\",\"#E0\"],\"XOF\",\"F CFA\",\"Mbuuɗu Seefaa BCEAOMz	u~F6xd,en-TC!en-TC@0o
p
7FP@QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAUe0A0	#A
n
0I
,
OAAOo0eAAe,EAAC,aAAa`(
":gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBWAAW,E 
0
WAAW,E	oI	}	"]en-TC\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"Tun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",C\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u`ar\",\"Apr\",\"May` bt\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"Julyccember\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",I\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a at' {0}\",u],[\".\",\",#×@a#,##0.00\",\"#E0\"],\"USD\",\"US$\",\"US Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$$H+H)xq,en-VC!en-VC@0o
p
7FP@QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAUe0A0	#A
n
0I
,
OAAOo0eAAe,EAAC,aAAa`(
":gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBWAAW,E 
GAAG,EAAC,uBAAuB,E	oI	}	("]en-VC\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"Tun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",C\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u`ar\",\"Apr\",\"May` bt\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"Julyccember\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",I\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a at' {0}\",u],[\".\",\",#×@#,##0.00\",\"#E0\"],\"XCD\",\"$\",\"East Caribbean Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"],\"XCD\":[\"$\"]}U Fx
N,3fr-NE!fr-NE@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KkClCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFF(

ECAAC,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQe0A0	#OAAO$n2
27WAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoB`(
"w2
,
aAAaSAAS,EAAC,YAAY,E 
OAAO	&	-oI	}	KoI	}	-oI	}	(
(	F<(	-oI	}#oI	}	(
(
<
P	
F
#oI	}	(<(	(
(
P	-oI	}	(<(	(

	-oI	}

(t
<, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e ==[= 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4~%fr-NED\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"J\",\"F\Bjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d}K4 {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" #×8 %\",\"#,##0.00 ¤\",\"#E0\"],\"XOF\",\"F CFA\",\"franc CFA (BCEAO)\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BE9F\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\k"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥mLBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$HD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\3"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"KwkZxP,
sr-Latn-ME!
sr-Latn-ME@	CAAC;IAEd)YAAY.aAAa,EAAC,UAAUo
paAAa,EAAC,UAAUo
pZPQAAQOAAO,EAAC,QAAQe0A0	#
n
0
n
0IA0AQAAQ)CAAC,UAAU,EAAC,OAAO,CAAC,EAAC,CAAC,gBAAgB0(
,

kBAAkfC
YAAY,E 
GAAG,EAAC,MAAM,E	
(	<nF
#oI	}(;\n$sr-Latn-ME\",[[\"AM\",\"PM\"],[\"prije podne\",\"po podne\"],u],[[\"a\",\"p\"],[\"prije podne\",\"po podne\"],u],[[\"n\",\"p\",\"u\",\"s\",\"č\",\"p\",\"s\"],[\"ned\",\"pon\",\"uto\",\"sre\",\"čet\",\"pet\",\"sub\"],[\"nedjelja\",\"ponedeljak\",\"utorak\",\"srijeda\",\"četvrtak\",\"petak\",\"subota\"],[\"ne\",\"po\",\"ut\",\"sr\",\"če\",\"pe\",\"su\"]],u,[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"mart\",\"apr\",\"maj\",\"jun\",\"jul\",\"avg\",\"sept\",\"okt\",\"nov\",\"dec\"],[\"januar\",\"februar\",\"mart\",\"april\",\"maj\",\"jun\",\"jul\",\"avgust\",\"septembar\",\"oktobar\",\"novembar\",\"decembar\"]],u,[[\"p.n.e.\",\"n.e.\"],[\"p. n. e.\",\"n. e.\"],[\"prije nove ere\",\"nove ere\"]],1,[6,0],[%\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.p.D {0}\",u,u,u],[\",\",\".#×>#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Evro\",{\"AUD\":[u,\"$\"],\"BAM\":[\"KM\"],\"BYN\":[u,\"r.\"],\"GEL\":[u,\"ლ\"],\"KRW\":[u,\"₩\"],\"NZD\":[u,\"$&USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫{;ExG,sw-KE!sw-KE@ o
p
7FM
,EAAC,QAAQ,EAAC,UAAUo
p0A0	#AK,
OAAO,EAAC,QAAQOAAOQAAQ,Ef(iBAAiB,EAAC,iBAAiB`(
"gBAAgfC
YAAY,E 
0
	 <(	F
(7
"sw-KE\",[[\"am\",\"pm\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Jumapili\",\"PJumatatu\",\"Jumanne\",\"Jumatano\",\"Alhamisi\",\"Ijumaa\",\"Jumamosi\"],u,u],u`ac\",\"Apr\",\"Me_goxs\"],[\"Januari\",\"Februari\",\"Machi\",\"Aprili\",\"Mei\",\"Juni\",\"Julai\",\"Agosti\",\"Septemba\",\"Oktoba\",\"Novemba\",\"Desemba\"]],u,[[\"KK\",\"BK\"],u,[\"Kabla ya Kristo\",\"Baada ya Kristo\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d}K {0}\",u,u,u],[\".\",\",#×J3\",\"#E0\"],\"KES\",\"Ksh\",\"Shilingi ya Kenya\",{&JPY\":[\"JP¥\",\"¥\"],\"KES\":[\"Ksh$TZS\":[\"TShoVxw DG$DG@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCDG	.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss#JDx- 	eAAe,EAAE2export default [];\n"]}[:xC/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["de-IT", [["AM", "PM"], u, u], u, [["S", "M", "D", "M", "D", "F", "S"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["S", "M", "D", "M", "D", "F", "S"], ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jän.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sep.", "Okt.", "Nov.", "Dez."], ["Jänner", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jän", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Jänner", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'um' {0}", u], [",", ".", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euro", { "ATS": ["öS"], "AUD": ["AU$", "$"], "BGM": ["BGK"], "BGO": ["BGJ"], "BYN": [u, "р."], "CUC": [u, "Cub$"], "DEM": ["DM"], "FKP": [u, "Fl£"], "GHS": [u, "₵"], "GNF": [u, "F.G."], "KMF": [u, "FC"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "RWF": [u, "F.Rw"], "SYP": [], "THB": ["฿"], "TWD": ["NT$"], "XXX": [], "ZMW": [u, "K"] }, "ltr", plural];
//# sourceMappingURL=de-IT.js.mapUSLx{"version":3,"file":"ru-BY.js","sourceRoot":"","sources":["ru-BY.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;QAC/G,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3L,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,aAAa,EAAC,aAAa,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC,SAAS,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,OAAO,CAAC,EAAC,CAAC,uBAAuB,EAAC,uBAAuB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,cAAc,EAAC,eAAe,EAAC,qBAAqB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,UAAU,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,SAAS,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,mBAAmB,EAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))\n    return 3;\nif (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ru-BY\",[[\"AM\",\"PM\"],u,u],u,[[\"В\",\"П\",\"В\",\"С\",\"Ч\",\"П\",\"С\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],[\"воскресенье\",\"понедельник\",\"вторник\",\"среда\",\"четверг\",\"пятница\",\"суббота\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"мар.\",\"апр.\",\"мая\",\"июн.\",\"июл.\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"января\",\"февраля\",\"марта\",\"апреля\",\"мая\",\"июня\",\"июля\",\"августа\",\"сентября\",\"октября\",\"ноября\",\"декабря\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"март\",\"апр.\",\"май\",\"июнь\",\"июль\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"январь\",\"февраль\",\"март\",\"апрель\",\"май\",\"июнь\",\"июль\",\"август\",\"сентябрь\",\"октябрь\",\"ноябрь\",\"декабрь\"]],[[\"до н.э.\",\"н.э.\"],[\"до н. э.\",\"н. э.\"],[\"до Рождества Христова\",\"от Рождества Христова\"]],1,[6,0],[\"dd.MM.y\",\"d MMM y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"не число\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"BYN\",\"Br\",\"белорусский рубль\",{\"BYN\":[\"Br\"],\"GEL\":[u,\"ლ\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUB\":[\"₽\"],\"THB\":[\"฿\"],\"TMT\":[\"ТМТ\"],\"TWD\":[\"NT$\"],\"UAH\":[\"₴\"],\"XXX\":[\"XXXX\"]},\"ltr\", plural];\n"]}?F^)x0en-MV!en-MV@J	;QAClBQo\<jF\8KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E	CAAC,QAAQ'EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAUjKAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,E
UAAU,EAAC,OAAO,EAAC,OAAO%	.4UAAU,EAAC,UAAU	$o\eAAe,EAAC,aAAa	=sUAAU,EAAC,eAAe>
B

`

%7-KAAKQWAAW,EAAC,QAAQ,EAAC,YAAY,Ek*KAAKQKAAKQ!i === 1 && v === 0)\n    return 1?%en-MV\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],5,[6,0],[\"d-M-yy\",\"dd-MM-y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\87 {0}\",u,u,u],[\".\",\",:NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"MVR\",\"Rf\",\"Maldivian Rufiyaa\",{\"JPY\":[\"JP¥\",\"¥\"'],\"MVR\":[\"Rf\"],\"USD\":[\"US$\",\"$NîR%x	J0'os-RU!os-RU@	CAAC;IAEda;QACPyiBAAiB,EAAC,iBAAiB,C
7jF\8KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E;CAAC,WAAW,EAAC,WAAW,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,WAAW	BKAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,C
oA\8KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E;CAAC,WAAW,EAAC,WAAW,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,WAAW	BKAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,C
o









d#UAAU,EAAC,QAAQUPnQAAQ	tQAAQ,EAAC,MAAMP

`



eAAe,EAAC,gBAAgB,EAAC,sBAAs=
IAAIQWAAW,EAAC,QAAQ,EAAC,YAAY,EGAAG,EAAC,KAAK,E1KAAKQ;\n\nif (n === 1)\n    return 1?%os-RU\",[[\"AM\",\"PM\"],u,[\"ӕмбисбоны размӕ\",\"ӕмбисбоны фӕстӕ\"]],[[\"AM\",\"PM\"],u,u],[[\"Х\",\"К\",\"Д\",\"Ӕ\",\"Ц\",\"М\",\"С\"],[\"хцб\",\"крс\",\"дцг\",\"ӕрт\",\"цпр\",\"мрб\",\"сбт\"],[\"хуыцаубон\",\"къуырисӕр\",\"дыццӕг\",\"ӕртыццӕг\",\"цыппӕрӕм\",\"майрӕмбон\",\"сабат\"],[\"хцб\",\"крс\",\"дцг\",\"ӕрт\",\"цпр\",\"мрб\",\"сбт\"]],[[\"Х\",\"К\",\"Д\",\"Ӕ\",\"Ц\",\"М\",\"С\"],[\"Хцб\",\"Крс\",\"Дцг\",\"Ӕрт\",\"Цпр\",\"Мрб\",\"Сбт\"],[\"Хуыцаубон\",\"Къуырисӕр\",\"Дыццӕг\",\"Ӕртыццӕг\",\"Цыппӕрӕм\",\"Майрӕмбон\",\"Сабат\"],[\"хцб\E",\"крс\",\"дцг\",\"ӕрт\",\"цпр\",\"мрб\",\"сбт\"]]m>"5йы\",\"июны\",\"июлы\",\"авг.\",\"сенO\",\"февралы\",\"мартъийы\",\"апрелы\",\"майы\",\"июны\",\"июлы\",\"августы\",\"сен	<\",\"октябры\",\"ноябры\",\"декабры\"]][Янв.\",\"Февр.\",\"Март.\",\"Апр.\",\"Май\",\"Июнь\",\"Июль\",\"Авг.\",\"Сент.\",\"Окт.\",\"Нояб.\",\"Дек.\"],[\"Январь\",\"Февраль\",\"Мартъи\",\"Апрель\",\"Май\",\"Июнь\",\"ИюTь\",\"Август\",\"Сентябрь\",\"Октябрь\",\"Ноябрь\",\"Д0.д.а.\",\"н.д.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd MMM y 'аз'\",\"d MMMM, y 'аз'\",\"EEEE, d MMMM, y 'аз'\"],[\"HH:mm7Н\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"RUB\",\"₽\",\"Сом\",{\"JPY\":[\"JP¥\",\"¥\"],\"RUB\":	~jx0%pt-ST!pt-ST@!EAAE,CAAC,GAAG,QAAQ,CAAC$sBAAsBz#;IAE1K,IAAI,CAACCAACl
l
	CAAC;QACz95?OAAO 
CAACbl

CAAC;QAChFQQ

UAAU,C
QN

OAAO,C
oA\


QAAQ
6eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa,EAAC,QAAQ




	#o










WAAW,EAAC,OAAOOPUAAU,EAAC,UAAU	$QiBAAiB,EAAC,kBAAk	>


oBAAoB,EAAC,0BAA0=
WcAAc	%7-KAAKQWAAW,EAAC,QAAQ,EAAC,YAAY,Ek
8BAA8B,E1KAAKQKAAKQ7+	
+:
KAAKQ, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === Math.floor(i) && (i >= 0 && i <= 1))\nb    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5/5pt-ST\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"sáb.\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan.\",\"fev.\",\"mar.\",\"abr.\",\"mai.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.C.\"],u,[\"antes de Cristo\",\"depois de Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"dd/MM/y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y+N\"{1} 'às' {0}\"zI#NaN\",\":\"],[\"#,##0.###\",\"#,##0 STN\",\"Db\",\"dobra de São Tomé e Príncipe\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\"uPTE\":[\"​~GSTN\":[\"Db\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$#wTjxfTT$TT@O
gBAAgB
8aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,cAAcd2
!
EAAC,0BAA0ICnL
%TT	0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"]!,[\"{1}, {0}\",u,\"{1} 'at' {0}\" s<#,##0.00\",\"#E0\"],\"TTD\",\"$\",\"Trinidad & Tobago Dollar 
TTD\":[\"$39vxZWS$WS@O
gBAAgB
8aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,cAAcd2
!`
aAAaJBL
}KAAK0WS	0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"]!,[\"{1}, {0}\",u,\"{1} 'at' {0}\" s0#,##0.00\",\"#E0\"],\"WST\",\"WS$\",\"Samoan Tal!#USD\":[\"US$\",\"$\"],\"WST\":[\"WS^+w1HFxv
ff-Latn-GW!
ff-Latn-GW@
CAAC;IAE7Ckk"YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,SAASK(2=P$MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,E=PF-U=_`#


QAAQ,EAAC,QAAQ,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO@$

WAAW,EAAC,aAAa@$++
;OAAO,EAAC,qBAAqICL
;\n\nif (i === 0 || i === 1	4ff-Latn-GW\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade6 Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, u,\",\" .cB#,##0.00 ¤\",\"#E0\"],\"XOF\",\"F CFA\",\"Mbuuɗu Seefaa BCEAO -I`{w^xt(sv-AX!sv-AX@:<:,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,WAAW,EAAC,aAAa A=7
V
 
QAAQ,EAAC,QAAQ,CAAC,E1(












MAAM?
MAAM.SAASLOAAO,EAAC,OAAOcAAc,EAAC,eAAe@$++
O
MAAMLSAAS)	EAAC,MAAMJ
nMAAMh$L
}L
7}
7}
nL
7}!_EAAEO
n
n!_
nL
7}
n
nL

n
n
n<
!_-
1sv-AX\",[[\"fm\",\"em\"],u,u],[[\"fm\",\"em\"],[\"f.m.\",\"e.m.\"],[\"förmiddag\",\"eftermiddag\"]],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"sön\",\"mån\",\"tis\",\"ons\",\"tors\",\"fre\",\"lör\"],[\"söndag\",\"måndag\",\"tisdag\",\"onsdag\"W,\"torsdag\",\"fredag\",\"lördag\"],[\"sö\",\"må\",\"ti\",\"on\",\"to\",\"fr\",\"löUjan.\",\"feb.\",\"mars\",\"apr.\",\"maj\",\"juni\",\"juli\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januari\",\"februari\",\"mars\",\"april\",\"maj\",\"juni\",\"juli\",\"augusti\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"f.Kr.T\",\"e.Kr.\"],u,[\"före Kristus\",\"efter Kristus\"]],1,[6,0],[\"y-MM-dd\",\"d MMM u,\",\" .−\",\"×10^L? %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AUD\":[u,\"$\"],\"BBD\":[\"Bds$\",\"$\"],\"BMD\":[\"BM$\",\"$\"],\"BRL\":[\"BR$\",\"R$\"],\"BSD\":[\"BS$\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"BZ$\",\"$\"],\"CNY\":[u,\"¥\"],\"DKK\":[\"Dkr\",\"kr\"],\"DOP\":[\"RD$\",\"$\"],\"EEK\":[\"Ekr\"],\"EGP\":[\"EG£\",\"E£\"],\"ESP\":[],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"IE£\"],\"INR\":[u,\"₹\"],\"ISK\":[\"Ikr\",\"kr\"],\"JMD\":[\"JM$\",\"$\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"NOK\":[\"Nkr\",\"kr\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"SEK\":[\"kr\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫y;tOx &CX$CX@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCGAAG,EAAC,mBAAmBLpKk%CX	1D.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss3AUD\",\"$\",\"Australian Dollar\",{\"AUD\":[\"$\"],1#J@hxR-de-LU!de-LU@OAAO,EAAC,QAAQ,CAAC,E1'_+
6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&A=:(
I
6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&





OAAOMAAM,CAAC,EAAC,CMAAMo_7`# MAAMo_SAAS,EAAC,SAASK++
#UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,iBAAiSAAS,EAAC,YAAY)MAAMLIAAI,CN(
(
IAAI,CN
MAAM,CNIAAI,CN
#

MAAM,CN
IAAI,CN6


IAAI,CN
MAAM,CAAC,EAAC,KAAK,EAAC,EAAEQ8(EAAEQ
1@de-LU\",[[\"vorm.\",\"nachm.\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM
D\",\"M\",\"D\",\"F\",\"S\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\"c,\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]]R.\",\"Feb.\",\"März\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sept.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Januar\",\"Februar\-",\"März\",\"April\",\"Mai\",\"Juni\",\"Julik.
zember\"]]`är\",\"Apr\",\"Mai _\",\"Okt\",\"Nov\",\"Dez\"],[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Julik.ezember\"]],[[\"v. Chr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d.\um' {0}\",u],[\",\",\".B#·g8 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Euro\",{\"ATS\":[\"öS\"],\"AUD\":[\"AU$\",\"$\"],\"BGM\":[\"BGK\"],\"BGO\":[\"BGJ\"],\"BYN\":[u,\"р.\"],\"CUC\":[u,\"Cub$\"],\"DEM\":[\"DM\"],\"FKP\":[u,\"Fl£\"],\"GHS\":[u,\"₵\"],\"GNF\":[u,\"F.G.\"],\"KMF\":[u,\"FC\"],\"LUF\":[\"F\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"RWF\":[u,\"F.Rw\"],\"SYP\":[],=\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"XXX\":[],\"ZMW\":[u,\"KmcJx @BW$BW@#UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAi8gBAAgKBW	:0,[6,0],[\"dd/MM/yy\",\"dd MMM y\",\"dd MMMM y\",\"EEEE, d,BWP\",\"P\",\"Botswanan Pula\",{\"BWP\":[\"PMtz85x~ MU$MU@IAAI,EAAC,iBAAiKIAAI,CN>MU	"MUR\",\"Rs\",\"Mauritian Rupee\",{MUR\":[\"Rs3x&b%xn NU$NU@oBAAoKf7%NU	$NZD\",\"$\",\"New Zealand Dollar\",{
NZD\":[\"$38!"x "SS$SS@aAAa,EAAC,gBAAgBAsBAAsK(f7%SS	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a=SSP\",\"£\",\"South Sudanese Pound\",{\"GBP\":[\"GB£\",\"£ SSP\":[\"£36ETxJ nl-CW!nl-CW@MAAM,EAAC,MAAMK(2=:(
I W











MAAMVUAAULMAAM,EAAC,MAAMxeAAeB
[wBAAwB
gCAAgCLMAAM,CN
IAAI,CN:
((

IAAI,CNf#((EAAE,EAAC,KAAK,EAAC,EAAE(nl-CW\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"Z\",\"M\",\"D\",\"W\",\"D\",\"V\",\"Z\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"zVjan.\",\"feb.\",\"mrt.\",\"apr.\",\"mei\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"]],u,[[\"v.C\.\",\"n.C.\"],[\"v.Chr.\",\"n.Chr.\"],[\"voor Christus\",\"na Christus\"]],1,[6,0],[\"dd-MM-#M' {0}\",u,\"{1} 'om' {0}\",u],[\",\",\".Be #,##0.00;¤ -#,##0.00\",\"#E0\"],\"ANG\",\"NAf.\",\"Nederlands-Antilliaanse gulden\",{\"ANG\":[\"NAf.\"],\"AUD\":[\"AU$\",\"A$\"],\"BYN\":[u,\"р.\"],\"CAD\":[\"C$\",\"$\"],\"FJD\":[\"FJ$\",#PHP\":[u,\"₱\"],\"RUR\":[u,\"р.\"],\"SBD\":[\"SI$\",\"$\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XPF\":[],\"XXX\":[ bx MT$MT@
gBAAg8MAAML(MMT	'.EUR\",\"€\",\"Euro\",{\"GBP\":[\"GB£\",\"£MK*Rgx, en-GU!en-GU@0p0P
6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKWAAW,EAAC,UAAU,EAAC,QAAQ
KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EA?QAAQ,EAAC,WAAW(0KZ
UAAU,EAAC,WAAW,EAAC,iBAAiB.WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAUWAAWGAAG,EAAC,WAAW,EAAC,EAAE#en-GU\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],.[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"S(VJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\"a,\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",oeI#,##0.00\",\"#E0\"],\"USD\",\"$\",\"US Dollar\",{},\"ltr\", plural];\n"]}}F"xn   A%A?kBAAkB,E@ .(A!$WG\",\"Afl.\",\"Arubaanse gulden\",{@AWG\":[\"Afl.T
9 xt   SR$SR@GAAG,EAAC,mBAAmB,E@.(~SR"#SRD\",\"$\",\"Surinaamse dollar\",{@SRD\":[p $'~"x $pt-CV!pt-CV@!EAAE,CAAC,GAAG,QAAQ,CAAC$sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1K,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC),IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACbkCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFy#
OAAO,EAAC,OAAO0P"OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO@6SAAS,EAAC,eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa@`o0A#7``o#JWAAW,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAUF
iBAAiB,EAAC,kBAAkB&UAAU,EAAC,SAAS,EAAC,oBAAoB,EAAC,0BAA0BBUAAUYAAYGAAG,EAAC,sBAAsB,E@.(~#)(~U, e = parseInt(
e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === Math.floor(i) && (i >= 0 && i <= 1))\n    return 1;\nif (e === 0 && (!(i === 0) H&& (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4
%pt-CV\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"sáb.)`v.\",\"mar.\",\"abr.\",\"mai.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.C.\"],u,[\"antes de Cristo\",\"depois de Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"dd/MM/y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de'F*, {0}\",u,\"{1} 'às' {0}\",u],[\",\",\" ocB#,##0.00 ¤\",\"#E0\"],\"CVE\",\"​\",\"escudo cabo-verdiano\",{@/VE\":[\"​5ON\":[u,\"L?},\"ltr\", plural];\n"]}]I# 9xMS$MS@\
E
LSAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCuBAAuB,EAAC,EAAC,KAAKAGAAG,CAAC,EAAC,KAAKA,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAACV&4MS\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm	t>1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"hXCD\",\"$\",\"East Caribbean Dollar\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"],\"XCD\":[\"$\"]o{Lx-,de-IT!de-IT@:7P=P6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&A=:(
I
6QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS<Q&











MAAM,CAAC,EAAC,CMAAMo_7`# MAAMo_SAAS,EAAC,SAASK++
#UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,iBAAiSAAS,EAAC,YAAY)MAAMLIAAI,CNE(CIAAI,CN
MAAM,CNIAAI,CN
#p
MAAM,CN
IAAI,CN
p
p
IAAI,CN
MAAM,CAAC,EAAC,KAAK,EAAC,EAAE$(EAAEQ
1de-IT\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],[\"So.\",\"Mo.\",\"Di.\",\"Mi.\",\"Do.\",\"Fr.\",\"Sa.\"]]Pän.\",\"Feb.\",\"März\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sep.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Jänner\",\"Febru0ar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Julik.
zember\"]]P$än\",\"Feb\",\"Mär\",\"Apr\",\"Mai `\",\"Okt\",\"Nov\",\"Dez\"],[\"Jänner\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Julik.ezember\"]],[[\"v. Chr.\",\"n. Chr.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd.MM.y\",\"d. MMMM y\",\"EEEE, d.\um' {0}\",u],[\",\",\".B#·g8 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Euro\",{\"ATS\":[\"öS\"],\"AUD\":[\"AU$\",\"$\"],\"BGM\":[\"BGK\"],\"BGO\":[\"BGJ\"],\"BYN\":[u,\"р.\"],\"CUC\":[u,\"Cub$\"],\"DEM\":[\"DM\"],\"FKP\":[u,\"Fl£\"],\"GHS\":[u,\"₵\"],\"GNF\":[u,\"F.G.\"],\"KMF\":[u,\"FC\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUR\":[u,\"р.\"],\"RWF\":[u,\"F.Rw\"],\"SYP\":[],\"THB\":[\"฿\"H],\"TWD\":[\"NT$\"],\"XXX\":[],\"ZMW\":[u,\"K\"]},\"ltr\", plural];\n"]}ZRx @L%L?aAAa,EAAC,gBAAgBAoBAAoKL	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a ZAR\",\"R\",\"South African Rand8%ZAR\":[\"R\"]},\"ltr\", plural];\n"]};Nx  NR$NR@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCmBAAmBYP%NR	.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss3AUD\",\"$\",\"Australian Dollar\",{\"AUD\":[\"$\"],1},\"ltr\", plural];\n"]}'/D<xPR$PR@\`#,
UAAU,EAAC,WAAW,EAAC,iBAAi:WAAW,EAAC,EAAE&4PR\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM 
>0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d,3USD\",\"$\",\"US Dollar\",{},\"ltr\", plural];\n"]}Knx- 	eAAe,EAAE2export default [];\n"]}[:x (&es-US!es-US@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KP,OAAO,CAAC,CAAC;IACbkCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQx(P7O
,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS`(-
SAAS,EAAC,OAAO,EAAC,OAAO6OAAO,EAAC,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAWpx(iBAAiB,EAAC,mBAAmBp/
/
SAAS,EAAC,oBAAoB,EAAC,0BAA0B0WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,E,A#2WAAW0sBAAsB,EP	@
@
		
n							@(	
3	<EAAE, e = parseInt(Me]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0))& || !(e >= 0 && e <= 5))\n    return 4%es-US\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"#MI\",\"JU\",\"VI\",\"SA\"]],u,[[\"E,Iene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"d/M/y\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"EhG;¤#,##0.00\",\"#E0\"],\"USD\",\"$\",\"dólar estadounidenseRL\":[u,\"RPCAD\":[uy"ESP\":[\"₧\"],\"EUR\":[u,\"€\"*LS\":[u,\"₪1 KRW\":[u,\"₩\"],\"MXN\":[u,\"$,8VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[AL x-
(3fr-MU!fr-MU@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KkClCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFP`(ECAAC,EAAC,CAAC,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU`
OAAO
SAAS.SAAS,EAAC,MAAM,E
P(WAAW,EAAC,WAAWoBAAoB,EAAC,oBAAoBp/
/O
d
aAAaA#UIAAI,EAAC,oBAAoB,EP@	
	F	
	@
F	
	
K	
	7F	
	P		-		@
(#F	
	@
4s	@
F	
	
-PJF	
	UMAAM3, e = parseInt(Me]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 &1& v === 0)) || !(e >= 0 && e <= 5))\n    return 4%fr-MU\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa Xv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"fvrier\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\d"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/yvK\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"EhaMUR\",\"Rs\",\"roupie mauricienne\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BNK)3$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CLwCOP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],+\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\"&£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MUR\":[\"Rs\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"\"],\"RHD\":[\"$RHRWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$#k$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw?y&=xb3
L%L?^eAAe,CAAC,CAAC,CAAC,QAAQP
.QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS	CAAC,QAAQP
QAAQaYAAY55&&&	CAAC,CAAC+7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}w	.x m33L%L?oEAAC,MAAM,EA
@
(
J#	
ZnLe.VEUR\",\"€\",\"euroW]LUF\":[\"F\"],\"MTP\":[\"£MT<T0_bOx-3$pt-L"pt-L?zC\P

%WP
5_POAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,CAAC,SAAS,EAAC,eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa,EAAC,QAAQ,CASPP2PASAAS,EAAC,WAAW,E1"5QAAQ,EAAC,UAAUB\P
iBAAiB,EAAC,kBAAkBPP
K
SAAS,EAAC,oBAAoB,EAAC,0BAA0BB
CAAC,EAAC,cAAc@QAAQ)oEAAC,MAAM,EA
@7((#	
,#Math.floor(i) && (i >= 0 && i <= 1)Ppt-LU\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"sáb.X.\",\"fev.\",\"mar.\",\"abr.\",\"mai.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.C.\"],u,[\"antes de Cristo\",\"depois de Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"dd/MM/y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de'F*, {0}\",u,\"{1} 'às' {0}\",u],[\",\",\" V] &EUR\",\"€\",\"euro\",{\"AUD\":[\"AU$a JJPY\":[\"JP¥\",\"¥\"],\"LUF\":[\"F\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"​QTHB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}'(<x5 $$PT$PT@		F	iPT\"N40<7Qx! '	eAAe,EAAE	2D];\n"]}
=xt %$GW$GW@hOAAO,EAAC,oBAAoB,E	Sͳ	AGW\"P6E&XOF\",\"F CFA\",\"franco CFA (BCEAO)>Q{#Wx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["de-LI", [["AM", "PM"], u, u], [["vm.", "nm."], ["AM", "PM"], u], [["S", "M", "D", "M", "D", "F", "S"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["S", "M", "D", "M", "D", "F", "S"], ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'um' {0}", u], [".", "’", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "CHF", "CHF", "Schweizer Franken", { "ATS": ["öS"], "AUD": ["AU$", "$"], "BGM": ["BGK"], "BGO": ["BGJ"], "BYN": [u, "р."], "CUC": [u, "Cub$"], "DEM": ["DM"], "EUR": [u, "€"], "FKP": [u, "Fl£"], "GHS": [u, "₵"], "GNF": [u, "F.G."], "KMF": [u, "FC"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "RWF": [u, "F.Rw"], "SYP": [], "THB": ["฿"], "TWD": ["NT$"], "XXX": [], "ZMW": [u, "K"] }, "ltr", plural];
//# sourceMappingURL=de-LI.js.map:,`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["de-LU", [["vorm.", "nachm."], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "D", "M", "D", "F", "S"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["S", "M", "D", "M", "D", "F", "S"], ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'um' {0}", u], [",", ".", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euro", { "ATS": ["öS"], "AUD": ["AU$", "$"], "BGM": ["BGK"], "BGO": ["BGJ"], "BYN": [u, "р."], "CUC": [u, "Cub$"], "DEM": ["DM"], "FKP": [u, "Fl£"], "GHS": [u, "₵"], "GNF": [u, "F.G."], "KMF": [u, "FC"], "LUF": ["F"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "RWF": [u, "F.Rw"], "SYP": [], "THB": ["฿"], "TWD": ["NT$"], "XXX": [], "ZMW": [u, "K"] }, "ltr", plural];
//# sourceMappingURL=de-LU.js.mapi*\xL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["de", [["AM", "PM"], u, u], u, [["S", "M", "D", "M", "D", "F", "S"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["S", "M", "D", "M", "D", "F", "S"], ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], ["So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'um' {0}", u], [",", ".", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euro", { "ATS": ["öS"], "AUD": ["AU$", "$"], "BGM": ["BGK"], "BGO": ["BGJ"], "BYN": [u, "р."], "CUC": [u, "Cub$"], "DEM": ["DM"], "FKP": [u, "Fl£"], "GHS": [u, "₵"], "GNF": [u, "F.G."], "KMF": [u, "FC"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "RWF": [u, "F.Rw"], "SYP": [], "THB": ["฿"], "TWD": ["NT$"], "XXX": [], "ZMW": [u, "K"] }, "ltr", plural];
//# sourceMappingURL=de.js.map{NSx5/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["dje", [["Subbaahi", "Zaarikay b"], u, u], u, [["H", "T", "T", "L", "M", "Z", "S"], ["Alh", "Ati", "Ata", "Ala", "Alm", "Alz", "Asi"], ["Alhadi", "Atinni", "Atalaata", "Alarba", "Alhamisi", "Alzuma", "Asibti"], ["Alh", "Ati", "Ata", "Ala", "Alm", "Alz", "Asi"]], u, [["Ž", "F", "M", "A", "M", "Ž", "Ž", "U", "S", "O", "N", "D"], ["Žan", "Fee", "Mar", "Awi", "Me", "Žuw", "Žuy", "Ut", "Sek", "Okt", "Noo", "Dee"], ["Žanwiye", "Feewiriye", "Marsi", "Awiril", "Me", "Žuweŋ", "Žuyye", "Ut", "Sektanbur", "Oktoobur", "Noowanbur", "Deesanbur"]], u, [["IJ", "IZ"], u, ["Isaa jine", "Isaa zamanoo"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "XOF", "F CFA", "CFA Fraŋ (BCEAO)", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=dje.js.mapv^xO/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["doi", [["सवेर", "स’ञ"], u, ["सवेर", "बाद दपैहर"]], [["सवेर", "स’ञ"], u, u], [["ऐ.", "सो.", "म.", "बु.", "बी.", "शु.", "श."], ["ऐत", "सोम", "मंगल", "बुध", "बीर", "शुक्र", "शनि"], ["ऐतबार", "सोमबार", "मंगलबार", "बुधबार", "बीरबार", "शुक्रबार", "शनीबार"], ["ऐत", "सोम", "मंगल", "बुध", "बीर", "शुक्र", "शनि"]], [["ऐ", "सो", "म.", "बु.", "बी.", "शु.", "श."], ["ऐत", "सोम", "मंगल", "बुध", "बीर", "शुक्र", "शनि"], ["ऐतबार", "सोमबार", "मंगलबार", "बुधबार", "बीरबार", "शुक्रबार", "शनिबार"], ["ऐत", "सोम", "मंगल", "बुध", "बीर", "शुक्र", "शनि"]], [["ज", "फ", "मा", "अ", "मे", "जू", "जु", "अ", "सि", "अ", "न", "दि"], ["जन.", "फर.", "मार्च", "अप्रैल", "मेई", "जून", "जुलाई", "अग.", "सित.", "अक्तू.", "नव.", "दिस."], ["जनवरी", "फरवरी", "मार्च", "अप्रैल", "मेई", "जून", "जुलाई", "अगस्त", "सितंबर", "अत्तूबर", "नवंबर", "दिसंबर"]], [["ज", "फ", "मा", "अ", "मे", "जू", "जु", "अ", "सि", "अ", "न", "दि"], ["जन.", "फर.", "मार्च", "अप्रैल", "मेई", "जून", "जुलाई", "अग.", "सित.", "अक्तू.", "नव.", "दिस."], ["जनवरी", "फरवरी", "मार्च", "अप्रैल", "मेई", "जून", "जुलाई", "अगस्त", "सितंबर", "अक्तूबर", "नवंबर", "दिसंबर"]], [["ई.पू.", "ईसवी"], u, ["ई.पू.", "ई. सन्"]], 0, [0, 0], ["d/M/yy", "d, MMM y", "d, MMMM y", "EEEE, d, MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} गी {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "INR", "₹", "भारती रपेऽ", {}, "ltr", plural];
//# sourceMappingURL=doi.js.mapIex-{"version":3,"file":"doi.js","sourceRoot":"","sources":["doi.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"doi\",[[\"सवेर\",\"स’ञ\"],u,[\"सवेर\",\"बाद दपैहर\"]],[[\"सवेर\",\"स’ञ\"],u,u],[[\"ऐ.\",\"सो.\",\"म.\",\"बु.\",\"बी.\",\"शु.\",\"श.\"],[\"ऐत\",\"सोम\",\"मंगल\",\"बुध\",\"बीर\",\"शुक्र\",\"शनि\"],[\"ऐतबार\",\"सोमबार\",\"मंगलबार\",\"बुधबार\",\"बीरबार\",\"शुक्रबार\",\"शनीबार\"],[\"ऐत\",\"सोम\",\"मंगल\",\"बुध\",\"बीर\",\"शुक्र\",\"शनि\"]],[[\"ऐ\",\"सो\",\"म.\",\"बु.\",\"बी.\",\"शु.\",\"श.\"],[\"ऐत\",\"सोम\",\"मंगल\",\"बुध\",\"बीर\",\"शुक्र\",\"शनि\"],[\"ऐतबार\",\"सोमबार\",\"मंगलबार\",\"बुधबार\",\"बीरबार\",\"शुक्रबार\",\"शनिबार\"],[\"ऐत\",\"सोम\",\"मंगल\",\"बुध\",\"बीर\",\"शुक्र\",\"शनि\"]],[[\"ज\",\"फ\",\"मा\",\"अ\",\"मे\",\"जू\",\"जु\",\"अ\",\"सि\",\"अ\",\"न\",\"दि\"],[\"जन.\",\"फर.\",\"मार्च\",\"अप्रैल\",\"मेई\",\"जून\",\"जुलाई\",\"अग.\",\"सित.\",\"अक्तू.\",\"नव.\",\"दिस.\"],[\"जनवरी\",\"फरवरी\",\"मार्च\",\"अप्रैल\",\"मेई\",\"जून\",\"जुलाई\",\"अगस्त\",\"सितंबर\",\"अत्तूबर\",\"नवंबर\",\"दिसंबर\"]],[[\"ज\",\"फ\",\"मा\",\"अ\",\"मे\",\"जू\",\"जु\",\"अ\",\"सि\",\"अ\",\"न\",\"दि\"],[\"जन.\",\"फर.\",\"मार्च\",\"अप्रैल\",\"मेई\",\"जून\",\"जुलाई\",\"अग.\",\"सित.\",\"अक्तू.\",\"नव.\",\"दिस.\"],[\"जनवरी\",\"फरवरी\",\"मार्च\",\"अप्रैल\",\"मेई\",\"जून\",\"जुलाई\",\"अगस्त\",\"सितंबर\",\"अक्तूबर\",\"नवंबर\",\"दिसंबर\"]],[[\"ई.पू.\",\"ईसवी\"],u,[\"ई.पू.\",\"ई. सन्\"]],0,[0,0],[\"d/M/yy\",\"d, MMM y\",\"d, MMMM y\",\"EEEE, d, MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} गी {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"INR\",\"₹\",\"भारती रपेऽ\",{},\"ltr\", plural];\n"]}MOxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && i % 100 === 1 || f % 100 === 1)
        return 1;
    if (v === 0 && i % 100 === 2 || f % 100 === 2)
        return 2;
    if (v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 3 && i % 100 <= 4)) || f % 100 === Math.floor(f % 100) && (f % 100 >= 3 && f % 100 <= 4))
        return 3;
    return 5;
}
export default ["dsb", [["dop.", "wótp."], ["dopołdnja", "wótpołdnja"], u], [["am", "pm"], u, ["dopołdnja", "wótpołdnja"]], [["n", "p", "w", "s", "s", "p", "s"], ["nje", "pón", "wał", "srj", "stw", "pět", "sob"], ["njeźela", "pónjeźele", "wałtora", "srjoda", "stwórtk", "pětk", "sobota"], ["nj", "pó", "wa", "sr", "st", "pě", "so"]], u, [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan.", "feb.", "měr.", "apr.", "maj.", "jun.", "jul.", "awg.", "sep.", "okt.", "now.", "dec."], ["januara", "februara", "měrca", "apryla", "maja", "junija", "julija", "awgusta", "septembra", "oktobra", "nowembra", "decembra"]], [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "měr", "apr", "maj", "jun", "jul", "awg", "sep", "okt", "now", "dec"], ["januar", "februar", "měrc", "apryl", "maj", "junij", "julij", "awgust", "september", "oktober", "nowember", "december"]], [["pś.Chr.n.", "pó Chr.n."], u, ["pśed Kristusowym naroźenim", "pó Kristusowem naroźenju"]], 1, [6, 0], ["d.M.yy", "d.M.y", "d. MMMM y", "EEEE, d. MMMM y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": [u, "$"], "PLN": ["zł"], "THB": ["฿"] }, "ltr", plural];
//# sourceMappingURL=dsb.js.mapkxG{"version":3,"file":"hsb.js","sourceRoot":"","sources":["hsb.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && i % 100 === 1 || f % 100 === 1)\n    return 1;\nif (v === 0 && i % 100 === 2 || f % 100 === 2)\n    return 2;\nif (v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 3 && i % 100 <= 4)) || f % 100 === Math.floor(f % 100) && (f % 100 >= 3 && f % 100 <= 4))\n    return 3;\nreturn 5;\n}\n\nexport default [\"hsb\",[[\"dop.\",\"pop.\"],[\"dopołdnja\",\"popołdnju\"],u],[[\"am\",\"pm\"],u,[\"dopołdnja\",\"popołdnju\"]],[[\"n\",\"p\",\"w\",\"s\",\"š\",\"p\",\"s\"],[\"nje\",\"pón\",\"wut\",\"srj\",\"štw\",\"pja\",\"sob\"],[\"njedźela\",\"póndźela\",\"wutora\",\"srjeda\",\"štwórtk\",\"pjatk\",\"sobota\"],[\"nj\",\"pó\",\"wu\",\"sr\",\"št\",\"pj\",\"so\"]],u,[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan.\",\"feb.\",\"měr.\",\"apr.\",\"mej.\",\"jun.\",\"jul.\",\"awg.\",\"sep.\",\"okt.\",\"now.\",\"dec.\"],[\"januara\",\"februara\",\"měrca\",\"apryla\",\"meje\",\"junija\",\"julija\",\"awgusta\",\"septembra\",\"oktobra\",\"nowembra\",\"decembra\"]],[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"měr\",\"apr\",\"mej\",\"jun\",\"jul\",\"awg\",\"sep\",\"okt\",\"now\",\"dec\"],[\"januar\",\"februar\",\"měrc\",\"apryl\",\"meja\",\"junij\",\"julij\",\"awgust\",\"september\",\"oktober\",\"nowember\",\"december\"]],[[\"př.Chr.n.\",\"po Chr.n.\"],u,[\"před Chrystowym narodźenjom\",\"po Chrystowym narodźenju\"]],1,[6,0],[\"d.M.yy\",\"d.M.y\",\"d. MMMM y\",\"EEEE, d. MMMM y\"],[\"H:mm 'hodź'.\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"·\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AUD\":[u,\"$\"],\"PLN\":[\"zł\"],\"THB\":[\"฿\"]},\"ltr\", plural];\n"]}'7Fx!))d#d:OAAOYAAY+
r7YAAY[P
oG/KAAK4BAA4h	~
e
;dsb\",[[\"dop.\",\"wótp.\"],[\"dopołdnja\",\"wótpołdnja,wótpołdnjaO!sr%ał\",\"srj\",\"stw\",\"pět\",\"sob\"],[\"njeźela\",\"pónjeźele\",\"wałtora\",\"srjoda\",\"stwórtk\",\"pětk\",\"sobota\"a\",\"sr\",\"st\",\"pě@axaja>a
lajy^U.Chr.n.\",\"pó Chr.n.\"],u,[\"pśed Kristusowym naroźenim\",\"pó Kristusowem naro+S1FXx{/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["dua", [["idiɓa", "ebyámu"], u, u], u, [["e", "m", "k", "m", "ŋ", "ɗ", "e"], ["ét", "mɔ́s", "kwa", "muk", "ŋgi", "ɗón", "esa"], ["éti", "mɔ́sú", "kwasú", "mukɔ́sú", "ŋgisú", "ɗónɛsú", "esaɓasú"], ["ét", "mɔ́s", "kwa", "muk", "ŋgi", "ɗón", "esa"]], u, [["d", "ŋ", "s", "d", "e", "e", "m", "d", "n", "m", "t", "e"], ["di", "ŋgɔn", "sɔŋ", "diɓ", "emi", "esɔ", "mad", "diŋ", "nyɛt", "may", "tin", "elá"], ["dimɔ́di", "ŋgɔndɛ", "sɔŋɛ", "diɓáɓá", "emiasele", "esɔpɛsɔpɛ", "madiɓɛ́díɓɛ́", "diŋgindi", "nyɛtɛki", "mayésɛ́", "tiníní", "eláŋgɛ́"]], u, [["ɓ.Ys", "mb.Ys"], u, ["ɓoso ɓwá yáɓe lá", "mbúsa kwédi a Yés"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "XAF", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=dua.js.mapsȡQx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["dyo", [["AM", "PM"], u, u], u, [["D", "T", "T", "A", "A", "A", "S"], ["Dim", "Ten", "Tal", "Ala", "Ara", "Arj", "Sib"], ["Dimas", "Teneŋ", "Talata", "Alarbay", "Aramisay", "Arjuma", "Sibiti"], ["Dim", "Ten", "Tal", "Ala", "Ara", "Arj", "Sib"]], u, [["S", "F", "M", "A", "M", "S", "S", "U", "S", "O", "N", "D"], ["Sa", "Fe", "Ma", "Ab", "Me", "Su", "Sú", "Ut", "Se", "Ok", "No", "De"], ["Sanvie", "Fébirie", "Mars", "Aburil", "Mee", "Sueŋ", "Súuyee", "Ut", "Settembar", "Oktobar", "Novembar", "Disambar"]], u, [["ArY", "AtY"], u, ["Ariŋuu Yeesu", "Atooŋe Yeesu"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "seefa yati BCEAO", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=dyo.js.map;g
x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["dz", [["སྔ་ཆ་", "ཕྱི་ཆ་"], u, u], u, [["ཟླ", "མིར", "ལྷག", "ཕུར", "སངྶ", "སྤེན", "ཉི"], ["ཟླ་", "མིར་", "ལྷག་", "ཕུར་", "སངས་", "སྤེན་", "ཉི་"], ["གཟའ་ཟླ་བ་", "གཟའ་མིག་དམར་", "གཟའ་ལྷག་པ་", "གཟའ་ཕུར་བུ་", "གཟའ་པ་སངས་", "གཟའ་སྤེན་པ་", "གཟའ་ཉི་མ་"], ["ཟླ་", "མིར་", "ལྷག་", "ཕུར་", "སངས་", "སྤེན་", "ཉི་"]], u, [["༡", "༢", "༣", "4", "༥", "༦", "༧", "༨", "9", "༡༠", "༡༡", "༡༢"], ["༡", "༢", "༣", "༤", "༥", "༦", "༧", "༨", "༩", "༡༠", "༡༡", "12"], ["ཟླ་དངཔ་", "ཟླ་གཉིས་པ་", "ཟླ་གསུམ་པ་", "ཟླ་བཞི་པ་", "ཟླ་ལྔ་པ་", "ཟླ་དྲུག་པ", "ཟླ་བདུན་པ་", "ཟླ་བརྒྱད་པ་", "ཟླ་དགུ་པ་", "ཟླ་བཅུ་པ་", "ཟླ་བཅུ་གཅིག་པ་", "ཟླ་བཅུ་གཉིས་པ་"]], [["༡", "༢", "༣", "༤", "༥", "༦", "༧", "༨", "༩", "༡༠", "༡༡", "༡༢"], ["ཟླ་༡", "ཟླ་༢", "ཟླ་༣", "ཟླ་༤", "ཟླ་༥", "ཟླ་༦", "ཟླ་༧", "ཟླ་༨", "ཟླ་༩", "ཟླ་༡༠", "ཟླ་༡༡", "ཟླ་༡༢"], ["སྤྱི་ཟླ་དངཔ་", "སྤྱི་ཟླ་གཉིས་པ་", "སྤྱི་ཟླ་གསུམ་པ་", "སྤྱི་ཟླ་བཞི་པ", "སྤྱི་ཟླ་ལྔ་པ་", "སྤྱི་ཟླ་དྲུག་པ", "སྤྱི་ཟླ་བདུན་པ་", "སྤྱི་ཟླ་བརྒྱད་པ་", "སྤྱི་ཟླ་དགུ་པ་", "སྤྱི་ཟླ་བཅུ་པ་", "སྤྱི་ཟླ་བཅུ་གཅིག་པ་", "སྤྱི་ཟླ་བཅུ་གཉིས་པ་"]], [["BCE", "CE"], u, u], 0, [6, 0], ["y-MM-dd", "སྤྱི་ལོ་y ཟླ་MMM ཚེས་dd", "སྤྱི་ལོ་y MMMM ཚེས་ dd", "EEEE, སྤྱི་ལོ་y MMMM ཚེས་dd"], ["ཆུ་ཚོད་ h སྐར་མ་ mm a", "ཆུ་ཚོད་h:mm:ss a", "ཆུ་ཚོད་ h སྐར་མ་ mm:ss a z", "ཆུ་ཚོད་ h སྐར་མ་ mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0 %", "¤#,##,##0.00", "#E0"], "INR", "₹", "རྒྱ་གར་གྱི་དངུལ་ རུ་པི", { "AUD": ["AU$", "$"], "BTN": ["Nu."], "ILS": [u, "₪"], "JPY": ["JP¥", "¥"], "KRW": ["KR₩", "₩"], "THB": ["TH฿", "฿"], "USD": ["US$", "$"], "XAF": [] }, "ltr", plural];
//# sourceMappingURL=dz.js.mapxu{"version":3,"file":"dz.js","sourceRoot":"","sources":["dz.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"dz\",[[\"སྔ་ཆ་\",\"ཕྱི་ཆ་\"],u,u],u,[[\"ཟླ\",\"མིར\",\"ལྷག\",\"ཕུར\",\"སངྶ\",\"སྤེན\",\"ཉི\"],[\"ཟླ་\",\"མིར་\",\"ལྷག་\",\"ཕུར་\",\"སངས་\",\"སྤེན་\",\"ཉི་\"],[\"གཟའ་ཟླ་བ་\",\"གཟའ་མིག་དམར་\",\"གཟའ་ལྷག་པ་\",\"གཟའ་ཕུར་བུ་\",\"གཟའ་པ་སངས་\",\"གཟའ་སྤེན་པ་\",\"གཟའ་ཉི་མ་\"],[\"ཟླ་\",\"མིར་\",\"ལྷག་\",\"ཕུར་\",\"སངས་\",\"སྤེན་\",\"ཉི་\"]],u,[[\"༡\",\"༢\",\"༣\",\"4\",\"༥\",\"༦\",\"༧\",\"༨\",\"9\",\"༡༠\",\"༡༡\",\"༡༢\"],[\"༡\",\"༢\",\"༣\",\"༤\",\"༥\",\"༦\",\"༧\",\"༨\",\"༩\",\"༡༠\",\"༡༡\",\"12\"],[\"ཟླ་དངཔ་\",\"ཟླ་གཉིས་པ་\",\"ཟླ་གསུམ་པ་\",\"ཟླ་བཞི་པ་\",\"ཟླ་ལྔ་པ་\",\"ཟླ་དྲུག་པ\",\"ཟླ་བདུན་པ་\",\"ཟླ་བརྒྱད་པ་\",\"ཟླ་དགུ་པ་\",\"ཟླ་བཅུ་པ་\",\"ཟླ་བཅུ་གཅིག་པ་\",\"ཟླ་བཅུ་གཉིས་པ་\"]],[[\"༡\",\"༢\",\"༣\",\"༤\",\"༥\",\"༦\",\"༧\",\"༨\",\"༩\",\"༡༠\",\"༡༡\",\"༡༢\"],[\"ཟླ་༡\",\"ཟླ་༢\",\"ཟླ་༣\",\"ཟླ་༤\",\"ཟླ་༥\",\"ཟླ་༦\",\"ཟླ་༧\",\"ཟླ་༨\",\"ཟླ་༩\",\"ཟླ་༡༠\",\"ཟླ་༡༡\",\"ཟླ་༡༢\"],[\"སྤྱི་ཟླ་དངཔ་\",\"སྤྱི་ཟླ་གཉིས་པ་\",\"སྤྱི་ཟླ་གསུམ་པ་\",\"སྤྱི་ཟླ་བཞི་པ\",\"སྤྱི་ཟླ་ལྔ་པ་\",\"སྤྱི་ཟླ་དྲུག་པ\",\"སྤྱི་ཟླ་བདུན་པ་\",\"སྤྱི་ཟླ་བརྒྱད་པ་\",\"སྤྱི་ཟླ་དགུ་པ་\",\"སྤྱི་ཟླ་བཅུ་པ་\",\"སྤྱི་ཟླ་བཅུ་གཅིག་པ་\",\"སྤྱི་ཟླ་བཅུ་གཉིས་པ་\"]],[[\"BCE\",\"CE\"],u,u],0,[6,0],[\"y-MM-dd\",\"སྤྱི་ལོ་y ཟླ་MMM ཚེས་dd\",\"སྤྱི་ལོ་y MMMM ཚེས་ dd\",\"EEEE, སྤྱི་ལོ་y MMMM ཚེས་dd\"],[\"ཆུ་ཚོད་ h སྐར་མ་ mm a\",\"ཆུ་ཚོད་h:mm:ss a\",\"ཆུ་ཚོད་ h སྐར་མ་ mm:ss a z\",\"ཆུ་ཚོད་ h སྐར་མ་ mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0 %\",\"¤#,##,##0.00\",\"#E0\"],\"INR\",\"₹\",\"རྒྱ་གར་གྱི་དངུལ་ རུ་པི\",{\"AUD\":[\"AU$\",\"$\"],\"BTN\":[\"Nu.\"],\"ILS\":[u,\"₪\"],\"JPY\":[\"JP¥\",\"¥\"],\"KRW\":[\"KR₩\",\"₩\"],\"THB\":[\"TH฿\",\"฿\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[]},\"ltr\", plural];\n"]}Z$\x=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ebu", [["KI", "UT"], u, u], u, [["K", "N", "N", "N", "A", "M", "N"], ["Kma", "Tat", "Ine", "Tan", "Arm", "Maa", "NMM"], ["Kiumia", "Njumatatu", "Njumaine", "Njumatano", "Aramithi", "Njumaa", "NJumamothii"], ["Kma", "Tat", "Ine", "Tan", "Arm", "Maa", "NMM"]], u, [["M", "K", "K", "K", "G", "G", "M", "K", "K", "I", "I", "I"], ["Mbe", "Kai", "Kat", "Kan", "Gat", "Gan", "Mug", "Knn", "Ken", "Iku", "Imw", "Igi"], ["Mweri wa mbere", "Mweri wa kaĩri", "Mweri wa kathatũ", "Mweri wa kana", "Mweri wa gatano", "Mweri wa gatantatũ", "Mweri wa mũgwanja", "Mweri wa kanana", "Mweri wa kenda", "Mweri wa ikũmi", "Mweri wa ikũmi na ũmwe", "Mweri wa ikũmi na Kaĩrĩ"]], u, [["MK", "TK"], u, ["Mbere ya Kristo", "Thutha wa Kristo"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Shilingi ya Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ebu.js.mapaOx export default ["	+x 3
dyo.js.map:0Kx 4	wo.js.map4jx 3	gv.js.map4	x 3	ku.js.map40)x 3	lu.js.map49Ix 3
luo.js.map;4jx 3	mt.js.map4:
x 3
mzn.js.map;G9+x 3
nds.js.map:)Lx 3
nyn.js.map;H9mx 3	os.js.map4Dx 3	ps.js.map4M-x 3
sat.js.map:,Nx 3
tzm.js.map;?ox 3
vun.js.map;t=cx 4	es.js.map4]x(/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ee-TG", [["ŋ", "ɣ"], ["ŋdi", "ɣetrɔ"], u], u, [["k", "d", "b", "k", "y", "f", "m"], ["kɔs", "dzo", "bla", "kuɖ", "yaw", "fiɖ", "mem"], ["kɔsiɖa", "dzoɖa", "blaɖa", "kuɖa", "yawoɖa", "fiɖa", "memleɖa"], ["kɔs", "dzo", "bla", "kuɖ", "yaw", "fiɖ", "mem"]], u, [["d", "d", "t", "a", "d", "m", "s", "d", "a", "k", "a", "d"], ["dzv", "dzd", "ted", "afɔ", "dam", "mas", "sia", "dea", "any", "kel", "ade", "dzm"], ["dzove", "dzodze", "tedoxe", "afɔfĩe", "dama", "masa", "siamlɔm", "deasiamime", "anyɔnyɔ", "kele", "adeɛmekpɔxe", "dzome"]], u, [["HYV", "Yŋ"], u, ["Hafi Yesu Va", "Yesu ŋɔli"]], 1, [6, 0], ["M/d/yy", "MMM d 'lia', y", "MMMM d 'lia' y", "EEEE, MMMM d 'lia' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{0} {1}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "mnn", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XOF", "F CFA", "ɣetoɖofe afrikaga CFA franc BCEAO", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "GHS": ["GH₵"], "JPY": ["JP¥", "¥"], "THB": ["฿"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ee-TG.js.mapkS\x0/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ee", [["ŋ", "ɣ"], ["ŋdi", "ɣetrɔ"], u], u, [["k", "d", "b", "k", "y", "f", "m"], ["kɔs", "dzo", "bla", "kuɖ", "yaw", "fiɖ", "mem"], ["kɔsiɖa", "dzoɖa", "blaɖa", "kuɖa", "yawoɖa", "fiɖa", "memleɖa"], ["kɔs", "dzo", "bla", "kuɖ", "yaw", "fiɖ", "mem"]], u, [["d", "d", "t", "a", "d", "m", "s", "d", "a", "k", "a", "d"], ["dzv", "dzd", "ted", "afɔ", "dam", "mas", "sia", "dea", "any", "kel", "ade", "dzm"], ["dzove", "dzodze", "tedoxe", "afɔfĩe", "dama", "masa", "siamlɔm", "deasiamime", "anyɔnyɔ", "kele", "adeɛmekpɔxe", "dzome"]], u, [["HYV", "Yŋ"], u, ["Hafi Yesu Va", "Yesu ŋɔli"]], 1, [6, 0], ["M/d/yy", "MMM d 'lia', y", "MMMM d 'lia' y", "EEEE, MMMM d 'lia' y"], ["a 'ga' h:mm", "a 'ga' h:mm:ss", "a 'ga' h:mm:ss z", "a 'ga' h:mm:ss zzzz"], ["{0} {1}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "mnn", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GHS", "GH₵", "ghana siɖi", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "GHS": ["GH₵"], "JPY": ["JP¥", "¥"], "THB": ["฿"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ee.js.mapDxz/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["el-CY", [["πμ", "μμ"], ["π.μ.", "μ.μ."], u], u, [["Κ", "Δ", "Τ", "Τ", "Π", "Π", "Σ"], ["Κυρ", "Δευ", "Τρί", "Τετ", "Πέμ", "Παρ", "Σάβ"], ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο"], ["Κυ", "Δε", "Τρ", "Τε", "Πέ", "Πα", "Σά"]], u, [["Ι", "Φ", "Μ", "Α", "Μ", "Ι", "Ι", "Α", "Σ", "Ο", "Ν", "Δ"], ["Ιαν", "Φεβ", "Μαρ", "Απρ", "Μαΐ", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ"], ["Ιανουαρίου", "Φεβρουαρίου", "Μαρτίου", "Απριλίου", "Μαΐου", "Ιουνίου", "Ιουλίου", "Αυγούστου", "Σεπτεμβρίου", "Οκτωβρίου", "Νοεμβρίου", "Δεκεμβρίου"]], [["Ι", "Φ", "Μ", "Α", "Μ", "Ι", "Ι", "Α", "Σ", "Ο", "Ν", "Δ"], ["Ιαν", "Φεβ", "Μάρ", "Απρ", "Μάι", "Ιούν", "Ιούλ", "Αύγ", "Σεπ", "Οκτ", "Νοέ", "Δεκ"], ["Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"]], [["π.Χ.", "μ.Χ."], u, ["προ Χριστού", "μετά Χριστόν"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} - {0}", u], [",", ".", ";", "%", "+", "-", "e", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "Ευρώ", { "BYN": [u, "р."], "GRD": ["Δρχ"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"] }, "ltr", plural];
//# sourceMappingURL=el-CY.js.mapwx'{"version":3,"file":"el-CY.js","sourceRoot":"","sources":["el-CY.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"el-CY\",[[\"πμ\",\"μμ\"],[\"π.μ.\",\"μ.μ.\"],u],u,[[\"Κ\",\"Δ\",\"Τ\",\"Τ\",\"Π\",\"Π\",\"Σ\"],[\"Κυρ\",\"Δευ\",\"Τρί\",\"Τετ\",\"Πέμ\",\"Παρ\",\"Σάβ\"],[\"Κυριακή\",\"Δευτέρα\",\"Τρίτη\",\"Τετάρτη\",\"Πέμπτη\",\"Παρασκευή\",\"Σάββατο\"],[\"Κυ\",\"Δε\",\"Τρ\",\"Τε\",\"Πέ\",\"Πα\",\"Σά\"]],u,[[\"Ι\",\"Φ\",\"Μ\",\"Α\",\"Μ\",\"Ι\",\"Ι\",\"Α\",\"Σ\",\"Ο\",\"Ν\",\"Δ\"],[\"Ιαν\",\"Φεβ\",\"Μαρ\",\"Απρ\",\"Μαΐ\",\"Ιουν\",\"Ιουλ\",\"Αυγ\",\"Σεπ\",\"Οκτ\",\"Νοε\",\"Δεκ\"],[\"Ιανουαρίου\",\"Φεβρουαρίου\",\"Μαρτίου\",\"Απριλίου\",\"Μαΐου\",\"Ιουνίου\",\"Ιουλίου\",\"Αυγούστου\",\"Σεπτεμβρίου\",\"Οκτωβρίου\",\"Νοεμβρίου\",\"Δεκεμβρίου\"]],[[\"Ι\",\"Φ\",\"Μ\",\"Α\",\"Μ\",\"Ι\",\"Ι\",\"Α\",\"Σ\",\"Ο\",\"Ν\",\"Δ\"],[\"Ιαν\",\"Φεβ\",\"Μάρ\",\"Απρ\",\"Μάι\",\"Ιούν\",\"Ιούλ\",\"Αύγ\",\"Σεπ\",\"Οκτ\",\"Νοέ\",\"Δεκ\"],[\"Ιανουάριος\",\"Φεβρουάριος\",\"Μάρτιος\",\"Απρίλιος\",\"Μάιος\",\"Ιούνιος\",\"Ιούλιος\",\"Αύγουστος\",\"Σεπτέμβριος\",\"Οκτώβριος\",\"Νοέμβριος\",\"Δεκέμβριος\"]],[[\"π.Χ.\",\"μ.Χ.\"],u,[\"προ Χριστού\",\"μετά Χριστόν\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} - {0}\",u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"e\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Ευρώ\",{\"BYN\":[u,\"р.\"],\"GRD\":[\"Δρχ\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"]},\"ltr\", plural];\n"]}`@lx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["el", [["πμ", "μμ"], ["π.μ.", "μ.μ."], u], u, [["Κ", "Δ", "Τ", "Τ", "Π", "Π", "Σ"], ["Κυρ", "Δευ", "Τρί", "Τετ", "Πέμ", "Παρ", "Σάβ"], ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο"], ["Κυ", "Δε", "Τρ", "Τε", "Πέ", "Πα", "Σά"]], u, [["Ι", "Φ", "Μ", "Α", "Μ", "Ι", "Ι", "Α", "Σ", "Ο", "Ν", "Δ"], ["Ιαν", "Φεβ", "Μαρ", "Απρ", "Μαΐ", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ"], ["Ιανουαρίου", "Φεβρουαρίου", "Μαρτίου", "Απριλίου", "Μαΐου", "Ιουνίου", "Ιουλίου", "Αυγούστου", "Σεπτεμβρίου", "Οκτωβρίου", "Νοεμβρίου", "Δεκεμβρίου"]], [["Ι", "Φ", "Μ", "Α", "Μ", "Ι", "Ι", "Α", "Σ", "Ο", "Ν", "Δ"], ["Ιαν", "Φεβ", "Μάρ", "Απρ", "Μάι", "Ιούν", "Ιούλ", "Αύγ", "Σεπ", "Οκτ", "Νοέ", "Δεκ"], ["Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"]], [["π.Χ.", "μ.Χ."], u, ["προ Χριστού", "μετά Χριστόν"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} - {0}", u], [",", ".", ";", "%", "+", "-", "e", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "Ευρώ", { "BYN": [u, "р."], "GRD": ["Δρχ"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"] }, "ltr", plural];
//# sourceMappingURL=el.js.mapƦa[xB/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-150", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], u, u, u, { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-150.js.map$9Jx^ 001/h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a
¤#,##0.00Gl
001.js.mapxC{"version":3,"file":"sr-Cyrl-BA.js","sourceRoot":"","sources":["sr-Cyrl-BA.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))\n    return 3;\nreturn 5;\n}\n\nexport default [\"sr-Cyrl-BA\",[[\"AM\",\"PM\"],[\"прије подне\",\"по подне\"],u],[[\"а\",\"p\"],[\"прије подне\",\"по подне\"],u],[[\"н\",\"п\",\"у\",\"с\",\"ч\",\"п\",\"с\"],[\"нед\",\"пон\",\"уто\",\"сре\",\"чет\",\"пет\",\"суб\"],[\"недјеља\",\"понедјељак\",\"уторак\",\"сриједа\",\"четвртак\",\"петак\",\"субота\"],[\"не\",\"по\",\"ут\",\"ср\",\"че\",\"пе\",\"су\"]],[[\"н\",\"п\",\"у\",\"с\",\"ч\",\"п\",\"с\"],[\"нед\",\"пон\",\"уто\",\"сри\",\"чет\",\"пет\",\"суб\"],[\"недјеља\",\"понедјељак\",\"уторак\",\"сриједа\",\"четвртак\",\"петак\",\"субота\"],[\"не\",\"по\",\"ут\",\"ср\",\"че\",\"пе\",\"су\"]],[[\"ј\",\"ф\",\"м\",\"а\",\"м\",\"ј\",\"ј\",\"а\",\"с\",\"о\",\"н\",\"д\"],[\"јан\",\"феб\",\"мар\",\"апр\",\"мај\",\"јун\",\"јул\",\"авг\",\"сеп\",\"окт\",\"нов\",\"дец\"],[\"јануар\",\"фебруар\",\"март\",\"април\",\"мај\",\"јун\",\"јул\",\"август\",\"септембар\",\"октобар\",\"новембар\",\"децембар\"]],u,[[\"п.н.е.\",\"н.е.\"],[\"п. н. е.\",\"н. е.\"],[\"прије нове ере\",\"нове ере\"]],1,[6,0],[\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.\",\"EEEE, d. MMMM y.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"BAM\",\"КМ\",\"Босанскохерцеговачка конвертибилна марка\",{\"AUD\":[u,\"$\"],\"BAM\":[\"КМ\",\"KM\"],\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"KRW\":[u,\"₩\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}`OQx0en-150!en-150J!
CAAC;IAEjGKAAK,CAAC;QAClBt=QAAQ
`
c"WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAUe
A02PMAAM!8-"OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM=	VEAAC,CAAC,eAAe,EAAC,aAAa	GW	gBAAg?
CUAAU,EAAC,CAAC,EAAC,cAAc
ɒ



~g*;\n\nif (i === 1 && v === 0)\n    return 1x%en-150\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"HH:.:(, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",{u,u,u,{\"JPY\":[\"JP¥\",\"¥},\"ltr\", plural];\n"]}wp}Yx)03hr$hrGjOAAO.

UAAU,EAAC,aAAa]BFu	UAn'(
MAAM=
@UAAU,EAAC,SAAS]SAAS,EAAC,QAAQ,EAAC,QAAQqWAAW,EAAC,WAAW,EAAC,UAAUUAn'(
MAAM=
@UAAU,EAAC,SAAS]SAAS,EAAC,QAAQ]P
W	SAAS,EAAC,IAAI?$SAAS,CAAC,EAAC,CAAC,cAAc,EAAC,gBAAgB	=WAAW,EAAC,WAAW*
DiBAAiB?

aAAa
T#qBAAqB}G#(((TPZEAAE,EAAC,KAAK,EAAC,EAAEhr-BA\",[[\"AM\",\"PM\"],u,u],u,[[\"N\",\"P\",\"U\",\"S\",\"Č\",\"P\",\"S\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"],[\"nedjelja\",\"ponedjeljak\",\"utorak\",\"srijeda\",\"četvrtak\",\"petak\",\"subota\"],[\"ned\",\"pon\",\"uto\",\"sri\",\"čet\",\"pet\",\"sub\"]],u,[[\"1.\",\"2.\",\"3.\",\"4.\",\"5.\",\"6.\",\"7.\",\"8.\",\"9.\",\"10.\",\"11.\",\"12.\"],[\"sij\",\"velj\",\"ožu\",\"tra\",\"svi\",\"lip\",\"srp\",\"kol\",\"ruj\",\"lis\",\"stu\",\"pro\"],[\"siječnja\",\"veljače\",\"ožujka\",\"travnja\",\"svibnja\",\"lipnja\",\"srpnja\",\"kolovoza\",\"rujna\",\"listopada\",\"studenoga\",\"prosinca\"]],[[\"1.\",\"2.\",\"3.\",\"4.\",\"5.\",\"6.\",\"7.\",\"8.\",\"9.\",\"10.\",\"11.\",\"12.\"],[\"sij\",\"velj\",\"ožu\",\"tra\",\"svi\",\"lip\",\"srp\",\"kol\",\"ruj\",\"lis\",\"stu\",\"pro\"],[\"siječanj\",\"veljača\",\"ožujak\",\"travanj\",\"svibanj\",\"lipanj\",\"srpanj\",\"kolovoz\",\"rujan\",\"listopad\",\"studeni\",\"prosinac\"]],[[\"pr.n.e.\",\"AD\"],[\"pr. Kr.\",\"po. Kr.\"],F[\"prije Krista\",\"poslije Krista\"]],1,[6,0],[\"d. M. yy.\",\"d. MMM]((zzzz)\"],[\"{1} {0}\",u,\"{1} 'u' {0}\"r%−E (KM\",\"konvertibilna marka\!KM\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"EUR\":[u,\"€\"],\"GBP\":[u,\"£\"],\"HKD\T":[u,\"$\"],\"HRK\":[\"kn\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥MXN\":[u,\"$,0RUR\":[u,\"р.\"],\"TWD\":[u,\"NT$\"],\"USD\":[u@,\"XCD\":[u,\"$\"],\"XPF\":[],\"XXX\":[]},\"ltr\", plural];\n"]}af5	mx i001$001B$QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBCؓ 
%001	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a
¤#,##0.00\-j
xt3.es-419!es-419@]sBAAsB.#;IAE1K,IAAI,CAAC,KAAK,CAAC;QACP8CAAC	GAAG,OAAO
IAAI;QAChFj="QAAQ,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO"SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAWQAAQ,CAAC,ELJ2P
9AJ"SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAWQAAQ,CAAC,ELJ2P
\
P#JOAAO,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAW,CAAC,CAAC,EA>9OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,iBAAiB,EAAC,mBAAm	>oBAAoB,EAAC,0BAA0!
/eAAeM	q
WAAW?P
o
MAAMaB2(F2EP͓ZEP(EPAEP2(e'0e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1`_e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4Z%es-419\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"E\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],1,[6,0],[\"d/M/yy\",\"d MMM y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"HH:mm\",\"HH:mm:<zzzz\"],[\"{1}, {0}\",\"{1} {0}\",\"{1}, {0}\",u],[\".\",\",P-jM>¤#,##0.00\",\"#E0\"],\"EUR\",\"EUR\",\"euro\",{\"AUD\":[u,\"$S4SP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£v+4ON\":[u,\"L\"],\"SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£G-EF\":[u,\"BsFmAF\":[],\"XCD\":[u,\"$\"],\"XOFu[xK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-AE", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 6, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "AED", "AED", "United Arab Emirates Dirham", {}, "ltr", plural];
//# sourceMappingURL=en-AE.js.mapLdAx I/NA", [["a", "p"], ["am", "pm"], u], [["am", "pm	`ti1A^ZAR", "ZAR", "South African Rand", { "JPY": ["JP¥", "¥"], "NAD": ["$"], "USD": ["US$", "$"] +	NA.js.map@0+x@sw-CD", [["am", "pmTUJumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi"], u, uWc", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KK", "BK"], u, ["Kabla ya Kristo", "Baada ya Kristo"]], 1ABRHH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".X #,##0.00", "#E0"], "CDF", "FC", "Faranga ya Kongo", { "BYN": [u, "р."], "CDF": ["FC"], "JPY": ["JP¥", "¥"], "KES": ["Ksh"]Y, "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "TZS": ["TSh"], "USD": ["US$", "$"] (sw-CD.js.map>W^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-AG", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XCD", "$", "East Caribbean Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "XCD": ["$"] }, "ltr", plural];
//# sourceMappingURL=en-AG.js.maptx qIE["a.m.", "p.m."]F1B2: d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ssEUR", "€", "Eurou/,	IE.js.map*Ox4{"version":3,"file":"so-KE.js","sourceRoot":"","sources":["so-KE.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"so-KE\",[[\"h\",\"d\"],[\"GH\",\"GD\"],u],[[\"AM\",\"GD\"],u,[\"GH\",\"GD\"]],[[\"A\",\"I\",\"T\",\"A\",\"Kh\",\"J\",\"S\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"],[\"Axad\",\"Isniin\",\"Talaado\",\"Arbaco\",\"Khamiis\",\"Jimco\",\"Sabti\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"]],[[\"A\",\"I\",\"T\",\"A\",\"Kh\",\"J\",\"S\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbc\",\"Khms\",\"Jmc\",\"Sbti\"],[\"Axad\",\"Isniin\",\"Talaado\",\"Arbaco\",\"Khamiis\",\"Jimco\",\"Sabti\"],[\"Axd\",\"Isn\",\"Tldo\",\"Arbaco\",\"Khms\",\"Jmc\",\"Sbti\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"L\",\"O\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Lul\",\"Ogs\",\"Seb\",\"Okt\",\"Nof\",\"Dis\"],[\"Bisha Koobaad\",\"Bisha Labaad\",\"Bisha Saddexaad\",\"Bisha Afraad\",\"Bisha Shanaad\",\"Bisha Lixaad\",\"Bisha Todobaad\",\"Bisha Sideedaad\",\"Bisha Sagaalaad\",\"Bisha Tobnaad\",\"Bisha Kow iyo Tobnaad\",\"Bisha Laba iyo Tobnaad\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"L\",\"O\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Lul\",\"Ogs\",\"Seb\",\"Okt\",\"Nof\",\"Dis\"],[\"Jannaayo\",\"Febraayo\",\"Maarso\",\"Abriil\",\"May\",\"Juun\",\"Luuliyo\",\"Ogost\",\"Sebtembar\",\"Oktoobar\",\"Nofembar\",\"Desembar\"]],[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Ciise Hortii\",\"Ciise Dabadii\"]],0,[6,0],[\"dd/MM/yy\",\"dd-MMM-y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",\"{1} 'ee' {0}\",u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"MaL\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"KES\",\"Ksh\",\"Shilingka Kenya\",{\"BBD\":[\"DBB\",\"$\"],\"JPY\":[\"JP¥\",\"¥\"],\"KES\":[\"Ksh\"],\"SOS\":[\"S\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}BRBx &en$en=EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAOAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClBɓmF#0-gQAAQbQAAQ,EAAC,UAAULEAAC,IAAI,EAAC,IAAI,EAAC,IAAI,E'ғ
`
0g
UAAU,EAAC,OAAO,EAAC,OAAO|$QAAQ,EAAC,WAAW,EAAC,SAASp)><eAAe,EAAC,aAAa(
SAAS,EAAC,UAAU,EAAC,gBAAgHCUAAU,EAAC,CAACz		E
, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;$en-KE\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],5[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],uG)J\",\"Aw8pJul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"Augus;t\",\"September\",\"October\",\"November\",\"December\"]],u #Before Christ\",\"Anno Domin`*\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMMF, {0}\",u,\"{1} 'at' {0}\"HNaNPNKenyan Shilling\",{.-E-{cqx:&ln-CG!ln-CG@UIAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzCQUAAU,EAAC,QAAQ)A#0-gJQAAQ,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,mBAAmB,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,QAAQQ$$(gBAAgB,EAAC,eAAe,EAAC,yBAAyB,EAAC,yBAAyBWAAW,EAAC,YAAYoBAAoB,EAAC,oBAAoB(OAAO,EAAC,SAAS,EAAC,UAAUqY<YAAY,E	
kBAAkB,E	IAAIa		FE
#Math.floor(n) && (n >= 0 && n <= 1)4ln-CG\",[[\"ntɔ́ngɔ́\",\"mpókwa\"],u,u],u,[[\"e\",\"y\",\"m\",\"m\",\"m\",\"m\",\"p\"],[\"eye\",\"ybo\",\"mbl\",\"mst\",\"min\",\"mtn\",\"mps\"],[\"eyenga\",\"mokɔlɔ mwa yambo\",\"mokɔlɔ mwa míbalé\",\"mokɔlɔ mwa mísáto\",\"mokɔlɔ ya mínéi\",\"mokɔlɔ ya mítáno\",\"mpɔ́sɔ\"],[\"eye\",\"ybo\",\"mbl\",\"mst\",\"min\",\"mtn\",\"mps\"]],u,[[\"y\",\"f\",\"m\",\"a\",\"m\",\"y\",\"y\",\"a\",\"s\",\"ɔ\",\"n\",\"d\"],[\"yan\",\"fbl\",\"msi\",\"apl\",\"mai\",\"yun\",\"yul\",\"agt\",\"stb\",\"ɔtb\",\"nvb\",\"dsb\"],[\"sánzá ya yambo\",\"sánzá ya míbalé\",\"sánzá ya mísáto\",\"sánzá ya mínei\",\"sánzá ya mítáno\",\"sánzá ya motóbá\",\"sánzá ya nsambo\",\"sánzá ya mwambe\",\"sánzá ya libwa\",\"sánzá ya zómi\",\"sánzá ya zómi na mɔ̌kɔ́\",\"sánzá ya zómi na míbalé\"]],u,[[\"libóso ya\",\"nsima ya Y\"],u,[\"Yambo ya Yézu K[rís\",\"Nsima ya Yézu Krís\"]],1,[6,0],[\"d/M/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMMMu,u,u],[\",\",\".:NaNP&M#,##0.00 ¤\",\"#E0\"],\"XAF\",\"FCFA\",\"Falánga CFA BEAC\",{\"CDF\":[\"FC -
dkV:xm&om$om=(A#0-g
SAAS$SAAS,EAAC,SAASQ
haAAa,EAAC,aAAa,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,YAAY,EAAC,SAAS,EAAC,UAAU,EAAC,cAAc,EAAC,SAAS,EAAC,QAAQ
haAAa,EAAC,aAAa,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,YAAY,EAAC,SAAS,EAAC,UAAU,EAAC,cAAc,EAAC,SAAS,EAAC,QAAQ(kBAAkBÓ0
	IAAIa		2		E
om-KE\",[[\"WD\",\"WB\"],u,u],u,[[\"D\",\"W\",\"Q\",\"R\",\"K\",\"J\",\"S\"],[\"Dil\",\"Wix\",\"Qib\",\"Rob\",\"Kam\",\"Jim\",\"San\"],[\"Dilbata\",\"Wiixata\",\"Qibxata\",\"Roobii\",\"Kamiisa\",\"Jimaata\",\"Sanbata\"],[\"Dil\",\"Wix\",\"Qib\",\"Rob\",\"Kam\",\"Jim\",\"San\"]],uG)J\",\"AwAma\",\"Gur\",\"Bit\",\"Elb\",\"Cam\",\"Wax\",\"Ado\",\"Hag\",\"Ful\",\"Onk\",\"Sad\",\"Mud\"],[\"Amajjii\",\"Guraandhala\",\"Bitooteessa\",\"Elba\",\"Caamsa\",\"Waxabajjii\",\"Adooleessa\",\"Hagayya\",\"Fuulbana\",\"Onkololeessa\",\"Sadaasa\",\"Muddee\"]],[[\"A\",\"G\",\"B\",\"E\",\"C\",\"W\",\"A\",\"H\",\"F\",\"O\",\"S\",\"M\"],[\"Ama\",\"Gur\",\"Bit\",\"Elb\",\"Cam\",\"Wax\",\"Ado\",\"Hag\",\"Ful\",\"Onk\",\"Sad\",\"Mud\"],[\"Amajjii\",\"Guraandhala\",\"Bitooteessa\",\"Elba\",\"Caamsa\",\"Waxabajjii\",\"Adooleessa\",\"Hagayya\",\"Fuulbana\",\"Onkololeessa\",\"Sadaasa\",\"Muddee\"]],[[\"KD\",\"CE\"],u,[\"Dheengadda Jeesu\",\"CEa*dd MMMMauJNaNPNKES\",{\"ETB\":[\"Br2-vH6x|&te%te<"QAAQ,EAAC,CAAC,CAAC,WAAW,EAAC,QAAQ)A#0-g?	
6aAAa,EAAC,SAAS,EAAC,SAAS,EAAC,YAAY,EAAC,UAAU,EAAC,YAAYQOAAO>8UAAU,EAAC,QAAQ,EAAC,gBAAgB,EAAC,OAAO,EAAC,QAAQ,EAAC,aAAa @Y(kBAAkB,EAAC,kBAAkB(
SAAS,EAAC,UAAU,EAAC,gBAAgHMsBAAsB,E	^		E
teo-KE\",[[\"Taparachu\",\"Ebongi\"],u,u],u,[[\"J\",\"B\",\"A\",\"U\",\"U\",\"K\",\"S\"],[\"Jum\",\"Bar\",\"Aar\",\"Uni\",\"Ung\",\"Kan\",\"Sab\"],[\"Nakaejuma\",\"Nakaebarasa\",\"Nakaare\",\"Nakauni\",\"Nakaung’on\",\"Nakakany\",\"Nakasabiti\"],[\"Jum\",\"Bar\",\"Aar\",\"Uni\",\"Ung\",\"Kan\",\"Sab\"]],u,[[\"R\",\"M\",\"K\",\"D\",\"M\",\"M\",\"J\",\"P\",\"S\",\"T\",\"L\",\"P\"],[\"Rar\",\"Muk\",\"Kwa\",\"Dun\",\"Mar\",\"Mod\",\"Jol\",\"Ped\",\"Sok\",\"Tib\",\"Lab\",\"Poo\"],[\"Orara\",\"Omuk\",\"Okwamg’\",\"Odung’el\",\"Omaruk\",\"Omodok’king’ol\",\"Ojola\",\"Opedel\",\"Osokosokoma\",\"Otibar\",\"Olabor\",\"Opoo\"]],=u,[[\"KK\",\"BK\"],u,[\"Kabla ya Christo\",\"Baada ya Christoa*\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMMMuJNaNPNAngo’otol lok’ Kenya\",{.UGX\":[\"USh3O\x +AG$AG@aAAa,EAAC,gBAAgBAGAAG,EAAC,uBAAuKHk#4AG	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a#XCD\",\"$\",\"East Caribbean Dollar USD\":[\"US$\",\"$\"],\"XCD\":[?5	ix nI%I?MAAM,EAAC,MAAM eAAe-GAAG,EAAC,MAAMLGk%I	#[\"a.m.\",\"p.m.\"]
13EUR\",\"€\",\"Euro -*	x[ J%J?GAAG,EAAC,UAAULGk%J	1$GBP\",\"£\",\"UK Pound -٠@sx 5SB$SB@aAAa,EAAC,gBAAgBAGAAG,EAAC,wBAAwKCp#k%SB	1D2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a$SBD\",\"$\",\"Solomon Islands Dollar 
SBD\":[\"$3B<Lx{ SC$SC@IAAI,EAAC,mBAAmKCIAAI,CN1%SC	1$ SCR\",\"SR\",\"Seychellois Rupee SCR\":[\"SR3,$Vx "ZA$ZA@
WAAW,EAAC,iBAAi.GAAG,EAAC,oBAAoKHk#4ZA	.y/MM/dd\",\"dd MMM y\",\"dd MMMM y\",\"EEEE, dm,\",\" B{ ZAR\",\"R\",\"South African Rand "USD\":[\"US$\",\"$\"],\"ZAR\":[\"R -m@liBx`ln-CF!ln-CF@CAAC;IAEd,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;I@UAAU,EAAC,QAAQK(2=PJQAAQ,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,mBAAmB,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,QAAQ<QF-7`#gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,eAAe,EAAC,yBAAyB,EA	AC,yBAAyB@$WAAW,EAAC,YAAYoBAAoB,EAAC,oBAAoB@$++

eAAeB
+
d2YAAY
kBAAkKIAAI,CNEk2;\n\nif (n === Math.floor(n) && (n >= 0 && n <= 1)	4ln-CF\",[[\"ntɔ́ngɔ́\",\"mpókwa\"],u,u],u,[[\"e\",\"y\",\"m\",\"m\",\"m\",\"m\",\"p\"],[\"eye\",\"ybo\",\"mbl\",\"mst\",\"min\",\"mtn\",\"mps\"],[\"eyenga\",\"mokɔlɔ mwa yambo\",\"mokɔlɔ mwa míbalé\",\"mokɔlɔ mwa mísáto\",\"mokɔlɔ ya mínéi\",\"mokɔlɔ ya mítáno\",\"mpɔ́sɔ\"],[\"eye\",\"ybo\",\"mbl\",\"mst\",\"min\",\"mtn\",\"mps\"]],u,[[\"y\",\"f\",\"m\",\"a\",\"m\",\"y\",\"y\",\"a\",\"s\",\"ɔ\",\"n\",\"d\"],[\"yan\",\"fbl\",\"msi\",\"apl\",\"mai\",\"yun\",\"yul\",\"agt\",\"stb\",\"ɔtb\",\"nvb\",\"dsb\"],[\"sánzá ya yambo\",\"sánzá ya míbalé\",\"sánzá ya mísáto\",\"sánzá ya mínei\",\"sánzá ya mítáno\",\"sánzá ya motóbá\",\"sánzá ya nsambo\",\"sánzá ya mwambe\",\"sánzá ya libwa\",\"sánzá ya zómi\",\"sánzá ya zómi na mɔ̌kɔ́\",\"sánzá ya zómi na míbalé\"]],u,[[\"libóso ya\",\"nsima ya Y\"],u,[\"Yambo ya Yézu K/rís\",\"Nsima ya Yézu Krís\"]],1,[6,0],[\"d/%M {0}\",u,u,u],[\",\",\".BcQ#,##0.00 ¤\",\"#E0\"],\"XAF\",\"FCFA\",\"Falánga CFA BEAC\",{\"CDF\":[\"FC\"],-;1^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-AI", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XCD", "$", "East Caribbean Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "XCD": ["$"] }, "ltr", plural];
//# sourceMappingURL=en-AI.js.map)옺^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-ER", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ERN", "Nfk", "Eritrean Nakfa", { "ERN": ["Nfk"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-ER.js.mapݙ
qx U/AS", [["a", "p"], ["AM", "PM"], u], [["AM", "PM	`j=0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d,|USD", "$", "US Dollar", {+	AS.js.mapC,_9x  MPd1AX	MP.js.map<
^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-LR", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "LRD", "$", "Liberian Dollar", { "JPY": ["JP¥", "¥"], "LRD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-LR.js.mapޘNnx yAT+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss/,", ".·2 %", "¤ @EUR", "€", "Euroo>	AT.js.map- *x`/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-AU", [["am", "pm"], u, u], u, [["Su.", "M.", "Tu.", "W.", "Th.", "F.", "Sa."], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mon", "Tu", "Wed", "Th", "Fri", "Sat"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "e", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "AUD", "$", "Australian Dollar", { "AUD": ["$"], "BDT": [u, "Tk"], "BRL": [u, "R$"], "CAD": [u, "$"], "CNY": [u, "¥"], "CUP": [u, "₱"], "EGP": [u, "£"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "ISK": [u, "Kr"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "PYG": [u, "Gs"], "SCR": ["Rs"], "SEK": [u, "Kr"], "TWD": [u, "$"], "USD": [u, "$"], "UYU": [u, "$U"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [], "XPF": ["CFP"] }, "ltr", plural];
//# sourceMappingURL=en-AU.js.map§L)^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-BB", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "BBD", "$", "Barbadian Dollar", { "BBD": ["$"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-BB.js.map/4ox 2KCA", [["am", "pm"], ["a.m.", "p.m."], u], [["a.m.", "pm"], ["a.m.", "p.m."]3>0, [6, 0], ["y-MM-dd", "MMM d, y", "MMMM d, y", "EEEE, MMMM d,|#CAD", "$", "Canadian Dollar", { "CAxa	CA.js.mapr5ixm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["nl-BE", [["a.m.", "p.m."], u, u], u, [["Z", "M", "D", "W", "D", "V", "Z"], ["zo", "ma", "di", "wo", "do", "vr", "za"], ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], ["zo", "ma", "di", "wo", "do", "vr", "za"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mrt.", "apr.", "mei", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"]], u, [["v.C.", "n.C."], ["v.Chr.", "n.Chr."], ["voor Christus", "na Christus"]], 1, [6, 0], ["d/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'om' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "EUR", "€", "Euro", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CAD": ["C$", "$"], "FJD": ["FJ$", "$"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RUR": [u, "р."], "SBD": ["SI$", "$"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nl-BE.js.map!*xRen-BE", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "SJJan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before ChrisKt", "Anno Domini"]], 1, [6, 0], ["dd/MM/yy", "dd MMM y", "d MMMM y", "EEEE,pH, {0}", u, "{1} 'atj#,##0.00 ¤N$5])en-BE.js.mapž]x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-NF", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "AUD", "$", "Australian Dollar", { "AUD": ["$"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-NF.js.mapHlx M/BI", [["a", "p"], ["AM", "PM"], u], [["AM", "PM	`j0M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d,|.BIF", "FBu", "Burundian Franc", { "BIF": ["FBu.	BI.js.map0^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-BM", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "BMD", "$", "Bermudian Dollar", { "BMD": ["$"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-BM.js.map͘^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-ZM", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ZMW", "K", "Zambian Kwacha", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "ZMW": ["K", "ZK"] }, "ltr", plural];
//# sourceMappingURL=en-ZM.js.mapsxV BSe0B-BSD", "$", "Bahamian Dollar", { "BSD": ["$"],r+,	BS.js.mapKd_x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-SS", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "SSP", "£", "South Sudanese Pound", { "GBP": ["GB£", "£"], "JPY": ["JP¥", "¥"], "SSP": ["£"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-SS.js.mapvᣗx 0BWe0, [6, 0], ["dd/MM/yy", "dd MMM y", "dd MMMM y", "EEEE, dd MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1)BWP", "P", "Botswanan Pula", { "BWP": ["P>	BW.js.map	;djx qMTe%0, [6, 0], ["dd/MM/y", "dd MMM y", "dd +HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ssEUR", "€", "Eurou4>	MT.js.mapz*7^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-VU", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "VUV", "VT", "Vanuatu Vatu", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "VUV": ["VT"] }, "ltr", plural];
//# sourceMappingURL=en-VU.js.mapxImx .BZe0, [6, 0], ["dd/MM/yy", "dd-MMM-y", "dd MMMM y", "EEEE, dd MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1+BZD", "$", "Belize Dollar", { "BZD": ["$"],q+,	BZ.js.mapV:Mx^ MWxMWK", "MK", "Malawian KwachamMWK": ["MK"], "USD": ["US$", "$.	MW.js.mapX]x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-CC", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "AUD", "$", "Australian Dollar", { "AUD": ["$"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-CC.js.maplx< GBtGBP", "£", "British Pound", {W	GB.js.mapm]x"/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-CH", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", "’", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤-#,##0.00", "#E0"], "CHF", "CHF", "Swiss Franc", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-CH.js.mapdjxl GG ,", ";", "%", "+", "-", "E", "×9)#,##0.00", "#E0"], "GBP", "£", "UK Poundy[	GG.js.mapu6zex KSDe6, [5, 6I;/h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a4 ,", ";", "%", "+", "-", "E", "×90#,##0.00", "#E0"], "SDG", "SDG", "Sudanese Poundy[	SD.js.map/^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-KI", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "AUD", "$", "Australian Dollar", { "AUD": ["$"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-KI.js.mapMpxw SGe0, [6, 0], ["d/M/yTBSGD", "$", "Singapore Dollar", { "JPY": ["JP¥", "¥"], "SGD": ["$C	SG.js.map#"Kx {CKe1, [6, 0], ["dd/MM/S0+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ssNZD", "$", "New Zealandh$NZJ	CK.js.map&rxu FJe1, [6, 0], ["dd/MM/S?FJD", "$", "Fijian Dollar", { "FJD": ["$"], "JPY": ["JP¥", "¥C	FJ.js.map| 	x b/MH", [["a", "p"], ["AM", "PM"], u], [["AM", "PM	`j0M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d,{USD", "$", "US Dollar", {+	MH.js.map)]x#/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-CM", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XAF", "FCFA", "Central African CFA Franc", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-CM.js.map^ixl SI,", ".", ";", "%", "+", "-", "e=*#,##0.00 ¤", "#E0"], "EUR", "€", "Eurox[	SI.js.mapر^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-WS", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "WST", "WS$", "Samoan Tala", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "WST": ["WS$"] }, "ltr", plural];
//# sourceMappingURL=en-WS.js.mapQNnx xCXe1BB+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss/AUD", "$", "Australian Dollar", { "AUD": ["$"],q+,	CX.js.map5'xN NUt"NZD", "$", "New Zealand Dollar", {	NZD": ["$C	NU.js.maṗ\x5/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-CY", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "EUR", "€", "Euro", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-CY.js.mapDK^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-LC", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XCD", "$", "East Caribbean Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "XCD": ["$"] }, "ltr", plural];
//# sourceMappingURL=en-LC.js.map!ٚ(	tx jDE+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss/,", ".·21 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Eurou/,	DE.js.mapX.,x GD	GD.js.map{\x0/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-TC", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "US$", "US Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-TC.js.map\xJ DG+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss	DG.js.mapP%Yx_4sw-KE", [["am", "pm"], ["AM", "PM"], u], [["AM", "PM	3UJumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi"], u, uWc", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KK", "BK"], u, ["Kabla ya Kristo", "Baada ya Kristo"]], 0B{ {0}", u, ufL #,##0.00", "#E0"], "KES", "Ksh", "Shilingi ya Kenya", { "BYN": [u, "р."],kNKES": ["Ksh"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "TZS": ["TSh+sw-KE.js.maplRS^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-DK", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH.mm", "HH.mm.ss", "HH.mm.ss z", "HH.mm.ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [",", ".", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "DKK", "kr.", "Danish Krone", { "DKK": ["kr.", "kr"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-DK.js.mapOLuxS/PH", [["a", "p"], ["AM", "PM"], u], [["AM", "PM	`j0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["$?.", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":<%", "¤#,##0.00", "#E0"], "PHP", "₱", "Philippine Peso", {+	PH.js.mapX]x//**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-IL", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [5, 6], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ILS", "₪", "Israeli New Shekel", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-IL.js.map]x tDMi6, 0I;/h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a!XCD", "$", "East Caribbean Dollarl/
, "XCD": [0	DM.js.mapl\)x{"version":3,"file":"sr-Cyrl-XK.js","sourceRoot":"","sources":["sr-Cyrl-XK.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))\n    return 3;\nreturn 5;\n}\n\nexport default [\"sr-Cyrl-XK\",[[\"AM\",\"PM\"],u,u],[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"н\",\"п\",\"у\",\"с\",\"ч\",\"п\",\"с\"],[\"нед\",\"пон\",\"уто\",\"сре\",\"чет\",\"пет\",\"суб\"],[\"недеља\",\"понедељак\",\"уторак\",\"среда\",\"четвртак\",\"петак\",\"субота\"],[\"не\",\"по\",\"ут\",\"ср\",\"че\",\"пе\",\"су\"]],u,[[\"ј\",\"ф\",\"м\",\"а\",\"м\",\"ј\",\"ј\",\"а\",\"с\",\"о\",\"н\",\"д\"],[\"јан\",\"феб\",\"март\",\"апр\",\"мај\",\"јун\",\"јул\",\"авг\",\"септ\",\"окт\",\"нов\",\"дец\"],[\"јануар\",\"фебруар\",\"март\",\"април\",\"мај\",\"јун\",\"јул\",\"август\",\"септембар\",\"октобар\",\"новембар\",\"децембар\"]],u,[[\"п.н.е.\",\"н.е.\"],[\"п. н. е.\",\"н. е.\"],[\"пре нове ере\",\"нове ере\"]],1,[6,0],[\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.\",\"EEEE, d. MMMM y.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Евро\",{\"AUD\":[u,\"$\"],\"BAM\":[\"КМ\",\"KM\"],\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"KRW\":[u,\"₩\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}RVxl*en-SL!en-SLJ!
CAAC;IAEjGKAAK,CAAC;QAClBt=OAAO`g
2`6QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU1
O(;#,	

OAAO;
MAAM,E<e-eAAe,EAAC,aAAa$#gBAAgB$aAAa,EAAC,gBAAgBMCAAC,EAAC,cAAc^	


IAAI,EAAC,sBAAsB,E?z#q
u*;\n\nif (i === 1 && v === 0)\n    return 1 %en-SL\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mme a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",cf¤#,##0.00\",\"#E0\"],\"SLL\",\"Le\",\"Sierra Leonean Leone\",{\"JPY\":[\"JP¥\",\"¥\"],\"SLL\":[\"Le},\"ltr\", plural];\n"]}VSx5*
ff-Latn-SL!
ff-Latn-SLJ
CAAC;IAE7CKAAK,CAAC;QAClBtQ?
SAAS 
0A'O($MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,E	UO(O(
OAAO,EAAC,OAAO,EAAC,QAAQ6OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO$'0
	
aAAa$UAAU,EAAC,eAAe$aAAa,EAAC,gBAAgB	IAAI,EAAC,oBAAoB,E?z#q
u*;\n\nif (i === 0 || i === 1)\n    return 1 %ff-Latn-SL\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a`& }LSLL\",\"Le\",\"Lewoon Seraa Liyon\",{\"JPY\":[\"JP¥\",\"¥\"],\"SLL\":[\"Le},\"ltr\", plural];\n"]}f`?x&IN$IN@#UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,iBAAicAAc,EAAC,WAAW,EAAC,cAAcGAAG,EAAC,cAAcEIN	0,[0,0],[\"dd/MM/yy\",\"dd-MMM-,,##0.###\",\"#,##,##0%\",\"¤#,##,##0.00\",\"#E0\"],\"INR\",\"₹\",\"Indian Rupee\",{\"JPY\":[\"JP¥\",\"¥\"]},\"ltr\", plura<T^txx KN$KN@GAAG,EAAC,uBAAuB Y74KN	#XCD\",\"$\",\"East Caribbean Dollar 
,\"XCD\":[&}${x 0TK$TK@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCGAAG,EAAC,oBAAoB Yr>TK	.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss NZD\",\"$\",\"New Zealand Dollar 
NZD\":[\"$36 >GYx
D.s-HN"s-HN@!EAAE,CAAC,GAAG,QAAQ,CAAC$/sBAAsB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1KP,OAAO,CAAC,CAAC;IACbkCAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChFQOAAO,EAAC,OAAOK(=POAAO QAAQ,CAAC,E1(
_=POAAO QAAQ,CAAC,E1(
_-=OAAO,EAAC,SAASMAAM,QAAQ,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,WAAW@$OAAO,EAAC,OAAOiBAAiB,EAAC,mBAAmB@$++

*
XqBAAqB,EAAC,0BAA0B,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,UAAUd(SAAS)GAAG,EAAC,mBAAmBr


r
rr
r
%r
rr
r
r
r
r
r
r
r
r
%
%r
%rEAAE,EAAC,KAAKrEAAE, e = parseInt(k	e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (n === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0))& || !(e >= 0 && e <= 5))\n    return 4	&s-HN\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"d\",\"l\",\"m\",\"m\",\"j\",\"v\",\"s\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],[\"DO\",\"LU\",\"MA\",\"MI\",\"JU\",\"VI\",\"SA\"]],[[\"E"Iene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"],[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]],u,[[\"a. C.\",\"d. C.\"],u,[\"antes de Cristo\",\"después de Cristo\"]],0,[6,0],[\"d/M/yy\",\"d MMM y\",\"dd 'de' MMMM 'de' y\",\"EEEE dd 'de' M?MMM 'de' y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss\"{1} {0}\",\"{1},4q %\",\"¤#,##0.00\",\"#E0\"],\"HNL\",\"L\",\"lempira hondureño\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"ESP\":[\"₧\"],\"EUR\":[u,\"€\"],\"FKP\":[u,\"FK£\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"HNL\":[\"L\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"SSP\":[u,\"SD£\"],\"SYP\":[u,\"S£\"],\"TWD\":[u,\"NT$\"],\"USD\":[u,\"$\"],\"LVEF\":[u,\"BsF\"],\"VND\":[u,\"₫\"],\"XAF\":[],\"XCD\":[u,\"$\"],\"XOF\":[+\ =$x%ur-IN!ur-IN@"KAAK,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAMK(-=MAAM,EAAC,OAAOP6QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAOaKUAAU,EAAC,OAAOK++

UAAU,EAAC,WAAW,EAAC,iBAAiE
{2(2YAAYGAAG,EAAC,cAAc7Y
rr%"7ur-IN\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM 
9_اتوار\",\"پیر\",\"منگل\",\"بدھ\",\"جمعرات\",\"جمعہ\",\"ہفتہ\"],u,uRجنوری\",\"فروری\",\"مارچ\",\"اپریل\",\"مئی\",\"جون\",\"جولائی\",\"اگست\",\"ستمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"],u],u,[[\"قبل مسیح\",\"عیسوی\"],u,u],0,[0,0],[\"d/M/yy\",\"d MMM، y\",\"d MMMM، y\",\"EEEE، d MMMM،J
 {0}\",u,u:‎+\",\"‎_NW #,##0.00\",\"#E0\"],\"INR\",\"₹\",\"بھارتی روپیہ\",{\"BYN\":[u,\"р.\"],MPHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"rtl\", plural];\n"]}yMx!
ff-Latn-GN!
ff-Latn-GN@
CAAC;IAE7Ckk"YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,SAASK(2=P$MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EYAAY<QF-7`#


QAAQ,EAAC,QAAQ,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO@$
WAAW,EAAC,aAAa@$++
UAAU,EAAC,eAAeB
+
d2YAAYIAAI,EAAC,KAAKLIAAI,CN@;\n\nif (i === 0 || i === 1	4ff-Latn-GN\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"HadeM Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEEM {0}\",u,u,u],[\",\",\" BcA#,##0.00 ¤\",\"#E0\"],\"GNF\",\"FG\",\"GNF\",{\"GNF\":[\"FG\"],-{rmx- 	eAAe,EAAE92export default [];\n"]}bUA']xw.4CO$CO@)JMAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAMMAAM,EAAC,MAAMxw
QAAQ,EAAC,oBAAo
.WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU0;YAAYk

GAAG,EAAC,iBAAiQ	4

	QCOM'ftX6TQe.\",\"feb.\",\"mar.\",\"abr.\",\"may.\",\"jun.\",\"jul.\",\"ago.\",\"sept.\",\"oct.\",\"nov.\",\"dic.UM/yy\",\"d/MM/y\",\"M, d 'de' MMMM 'de' y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a^u,u,u],[\",\",\".g4 #,##0.00\",\"#E0\"],\"COP\",\"$\",\"peso colombian7e
COP\":[\"$f\"US$\"ocx?.*DO$DO@O;P-UoSoBAAo
WAAW,EAAC,aAAa,EAAC,gBAAgBG oiBAAiQ	㓚
	4

	QDOM'fuSM, d 'de' MMMM 'de' y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a^DOP\",\"RD$\",\"peso dominican7eDOP\":[\"RD$\",\"$f\"US$\"oocMTx,4n-JM"n-JM@!	CAAC;IAEj lBQ:+

\	:+
H	#A_	
"WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU*eM	
UAAU
QAAQ,E
UAAU,EAAC,UAAUQ	M	:+
CAAC,eAAe,EAAC,aAAaQ	M	2SAAS,EAAC,UAAU,EAAC,gBAAg	YcAAc!JA 
#u
(\
WAAW
4P(P	*;\n\nif (i === 1 && v === 0)\n    return 1&n-JM\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[:\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"JIJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",B\"{1} 'at' {0}\",u],[\".\",\",U]%\",\"¤aJMD\",\"$\",\"Jamaican Dollar\",{\"JMD\":[\"$\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"i6xZ4.B%B?*M	w	
cAAc	("OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe	SAAS,EAAC,UAAU!JA 
#u
2WAAW

IAAI,EAAC,WAAW,E@N(N(NZ
(
(
(
(
(
(
(
(
(
(*(N(*P*A
B(6u[H!1,[6,0],[\"d/M/yy\",\"d MMM 'de' <.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss-\"{1} {0}\",\"{1}, {0}\"GuBOB\",\"Bs\",\"boliv
OB\":[\"BsRe=uomƄ%jxS4
fr-GN!fr-GN@]eAAe,CAAC,CAAC,CAAC,QAAQ@>		
.MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUQ	QAAQ@>		
6YAAYNW	#CAAC7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}?%LxS4
fr-ML!fr-ML@]eAAe,CAAC,CAAC,CAAC,QAAQ@>		
.MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUQ	QAAQ@>		
6YAAYNW	#CAAC7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}-gM.x%4
ff-Latn-GM!
ff-Latn-GM@
CAAC;IAE7ClB="YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,SAAS=	)M	A_
QAAQ,EAAC,UAAU@WYAAYPQR	M	ғ o

QAAQ$QAAQ,EAAC,UAAUR	M	M	
	R	M	("OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,eAAe	D
	M	JA 
#u
(\

-eAAe,EP(P	;\n\nif (i === 0 || i0"ff-Latn-GM\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"HadeT Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/y\",\"d MMM, y\",\"d MMMM y\",\"EEEE d MMMMJ= U]%\",\"#,##0.00 ¤\",\"#E0\"],\"GMD\",\"D\",\"Dalasi Gammbi\",{\"GMD\":[\"D\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"Lwx43fr-GN!fr-GN@lB:+
H	M	AA	UAAU,EAAC,OAAO,EAAC,UAAU oM	J

@@2
SAAS0SAAS,EAAC,MAAM,E
UAAU,EAAC,UAAUQ	M	WAAW,EAAC,WAAW=	oBAAoB,EAAC,oBAAoBQ	M	2JSAAS,EAAC,UAAU,EAAC,eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeUAAU,EAAC,aAAa!JA 
#u
UIAAI,EAAC,eAAe,EP(P(NP(P2NP(P(P2
P(PAP(P(P(P(NFP77<?-P
&P7AP2NP2
P<?-P(P(P2NPPP(P(P<
MAAM	&i === 0 || i0fr-GN\",[[\"AM\",\"PM<im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JIGjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août"éc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",\"{1}, {0}\"",\"{1} 'à' {0}\",u],[\",\",\" Ue#,##0.00 ¤\",\"#E0\"],\"GNF\",\"FG\",\"franc guinéen\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\"8'CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\7"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"GNF\":[\"FGEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\"_:[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\".HD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"T$OP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$#m$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"TqxH43fr-ML!fr-ML@lB:+
H	M	AA	UAAU,EAAC,OAAO,EAAC,UAAU oM	J

@@2
SAAS0SAAS,EAAC,MAAM,E
UAAU,EAAC,UAAUQ	M	WAAW,EAAC,WAAW=	oBAAoB,EAAC,oBAAoBQ	M	2JSAAS,EAAC,UAAU,EAAC,eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe	$aAAa!JA 
#u
UOAAO,EAAC,mBAAmB,EP(P(NP(P2NP(P(P2
P(PAP(P(P(P2
P77<?-P
&P7AP2NP2
P<?-P(P(P2NPPP(P(P<
MAAM	&i === 0 || i0fr-ML\",[[\"AM\",\"PM<im.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredKi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"JIGjanv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août"éc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\"^,\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss- \"{1} 'à' {0}\",u],[\",\",\" Ue#,##0.00 ¤\",\"#E0\"],\"XOF\",\"F CFA\",\"franc CFA (BCEAO)\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\
":[\"$CL\"8'CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\!"£GB\",\"£\"],\"GIP\":[\"£GI\"EP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\"_:[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\".HD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"T$OP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$#m$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"[EZxS4ms-BN!ms-BN@	CAAC;IAEd=:
\	
M	A_
"MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO*eM	ғ oUAAU,EAAC,KAAK,EAAC,OAAOo
UAAU,EAAC,UAAUQ	M	\$H	M	2SAAS,EAAC,UAAU,EAAC,WAAW	XSAAS!JA 
#u
(\

-cAAc,E2
P2
NFP2	;\n$ms-BN\",[[\"a\",\"p\"],[\"PG\",\"PTG\"],u],u,[[\"A\",\"I\",\"S\",\"R\",\"K\",\"J\",\"S\"],[\"Ahd\",\"Isn\",\"Sel\",\"Rab\",\"Kha\",\"Jum\",\"Sab\"],[\"Ahad\",\"Isnin\",\"Selasa\",\"Rabu\",\"Khamis\",\"Jumaat\",\"Sabtu\"],[\"Ah\",\"Is\",\"Se\",\"Ra\",\"Kh\",\"Ju\",\"Sa\"]],u,[[\"J)OJan\",\"Feb\",\"Mac\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Ogo\",\"Sep\",\"Okt\",\"Nov\",\"Dis\"],[\"Januari\",\"Februari\",\"Mac\",\"April\",\"Mei\",\"Jun\",\"Julai\",\"Ogos\",\"September\",\"Oktober\",\"November\",\"Disember\"]],u,[[\"S.M.\",\"TM\"],u,u],71,[6,0],[\"d/MM/yy\",\"d MMM y\",\"d MMMM y\",\"dd MMMMT\"{1} {0}\"Gk )BND\",\"$\",\"Dolar Brunei\",{\"BND\":[\"-JPY\":[\"JP¥\",\"¥EMYR\":[\"RM\"],\"PHP\":[u,\"₱\"],\"TWD\":[\"NT$\"],\"USD\":[u,\"$\"Ce<xQ4'nb-SJ!nb-SJ@	CAAC;IAEd.<\	\\M	AA	!`AR	M	n

2^	

6
QAAQ,E
UAAU,EAAC,UAAUQ	ғ o	

6
QAAQ,E
UAAU,EAAC,UAAUQ	(aAAa,EAAC,eAAeQ	M	2LUAAU,EAAC,WAAW,EAAC,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe	$eAAe!JA 
#u
2wBAAwB

IAAI,EAAC,eAAe,EJN(NnpNnZ
(

<
&""nb-SJ\",[[\"a\",\"p\"],[\"a.m.\",\"p.m.\"],u],[[\"a.m.\",\"p.m.\"],u,u],[[\"S\",\"M\",\"T\",\"O\",\"T\",\"F\",\"L\"],[\"søn.\",\"man.\",\"tir.\",\"ons.\",\"tor.\",\"fre.\",\"lør.\"],[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",Q\"lørdag\"],[\"sø.\",\"ma.\",\"ti.\",\"on.\",\"to.\",\"fr.\",\"lø.\"]],u,[[\"JI'jan.\",\"feb.\",\"mar.\",\"apr.\",\"maiug.\",\"sep.\",\"okt.\",\"nov.\",\"des.\"],[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"se7ptember\",\"oktober\",\"november\",\"desember\"]],[[\"JIjan\",\"feb\",\"mar\",\"apr\",\"mai\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"des\"],[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"]],[[\"f.Kr.\",\"e.Kr.\"],u,[\"før Kristus\",\"etter Kristus\"]],1,[6,0],[\"dd.MM.y\",\"d. MMM y\",\"d. MMMM y\",\"EEEE d. MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss-:\"{1} 'kl'. {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"−mY;¤ -NOK\",\"kr\",\"norske kronerdt
OK\":[\"kr >u,\"$8PF\":[],\"XXX%kxF4ps-PK!ps-PK@	CAAC;IAEd.<\\M	M	A@


TM	M	6IAAI,EAAC,KAAKf	\	Z]
+
C6IAAI,EAAC,KAAKQAAQ,EAAC,QAAQ	6IAAI,EAAC,KAAKQAAQ,EAAC,QAAQR	iBAAiB H	qBAAqB,EAAC,qBAAqBQ	M	(cAAc,EAAC,mBAAm	E
	M	J(R
#
u
(\

#IAAI
&(P(	IAAI,CAAC&""ps-PK\",[[\"غ.م.\",\"غ.و.\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"يونۍ\",\"دونۍ\",\"درېنۍ\",\"څلرنۍ\",\"پينځنۍ\",\"جمعه\",\"اونۍ\"],u,u],u,[[\"ج\",\"ف\",\"م\",\"ا\",\"م\",\"ج\",\"ج\",\"ا\",\"\",\"ا\",\"ن\",\"د\"],[\"جنوري\",\"فبروري\",\"مارچ\",\"اپریل\",\"مۍ\",\"جون\",\"جولای\",\"است\",\"سېپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"],u],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"جنوري\",\"فبروري\",\"مارچ\",\"اپریل\",\"مۍ\",\"جون\",\"جولای\",\"اګست\",\"سپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"],[\"جنوري\",\"فېبروري\",\"مارچ\",\"پریل\",\"مۍ\",\"جون\",\"جولای\",\"اګست\",\"سپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"]],[[\"له میلاد وړاندې\",\"م.\"],u,[\"له میلاد څخه وړاندې\",\"له میلاد څخه وروسته\"]]H,0,[6,0],[\"y/M/d\",\"y MMM d\",\"د y د MMMM d\",\"EEEE د y د MMMM dH=)‎+\",\"‎−mE%\",\"#,##0.00 ¤\",\"#E0\"],\"PKR\",\"Rs\",\"پاکستانۍ کلداره\",{\"AFN\":[\"؋\"],\"BYN\":[u,\"р.\"],\"JPY\":[\8"JP¥\",\"¥\"],\"PKR\":[\"Rs\"]},\"rtl\", plural];\n"]}a^dx4$pt-A"pt-A?IAAI!@&zC\\M	
	
UAAUQ	\\M	
W	A
4QAAQ,EAAC,OAAO 
,eAAe,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,aAAa AR	M	nғ#WAAWB"UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAUQ	M	\\M	
iBAAiB,EAAC,kBAAkBQ	M	(	
SAAS	("OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe	$cAAc!JA 
#u
(\

#IAAI
&NP2NP2<p(P72	&)i === Math.floor(i) && (i >= 0 && i <= 1)6pt-AO\",[[\"a.m.\",\"p.m.\"],u,[\"da manhã\",\"da tarde\"]],[[\"a.m.\",\"p.m.\"],u,[\"manhã\",\"tarde\"]],[[\"D\",\"S\",\"T\",\"Q\",\"Q\",\"S\",\"S\"],[\"domingo\",\"segunda\",\"terça\",\"quarta\",\"quinta\",\"sexta\",\"sábado\"],[\"domingo\",\"segunda-feira\",\"terça-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"sábado\"],[\"dom.\",\"seg.\",\"ter.\",\"qua.\"&,\"qui.\",\"sex.\",\"sáb.\"]],u,[[\"JIjan.\",\"fevpi#t.\",\"out.\",\"nov.\",\"dez.\"],[\"janeiro\",\"fevereiro\",\"março\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"sete@mbro\",\"outubro\",\"novembro\",\"dezembro\"]],u,[[\"a.C.\",\"d.m!,pois de Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"dA.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss- \"{1} 'às' {0}\",u],[\",\",\" U]%\",\"#,##0.00 ¤\",\"#E0\"],\"AOA\",\"Kz\",\"kwanza angolano\",{\"AOA\":[\"Kz\"],\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],m\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"​\"],\"RON\":[u,\"L\"],\"THB\":[\"฿\"],\"TWD\":[ RbVUxk4qu-B"qu-B?	CAAC;IAEd=\\M	M	A`AR	M	Z]
+
[U oP
F#M	\$CAAC,EAAC,CAAC,cAAc,EAAC,eAAeQ	M	2LSAAS,EAAC,UAAU,EAAC,iBAAiB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCAAC,EAAC,SAAS,EAAC,SAAS
IAAI,EAAC,WAAW,EP(P(NP(PPP2
P	;\n$qu-BO\",[[\"a.m.\",\"p.#XDom\",\"Lun\",\"Mar\",\"Mié\",\"Jue\",\"Vie\",\"Sab\"],[\"Domingo\",\"Lunes\",\"Martes\",\"Miércoles\",\"Jueves\",\"Viernes\",\"Sábado\"],[\"Dom\",\"Lun\",\"Mar\",\"Mié\",\"Jue\",\"Vie\",\"Sab\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"Ene\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Jul\",\"Ago\",\"Set\",\"Oct\",\"Nov\",\"Dic\"],[\"Enero\",\"Febrero\",\"Marzo\",\"Abril\",\"Mayo\",\"Junio\",\"Julio\",\"Agosto\",\"Setiembre\",\"Octubre\",\"Noviembre\",\"Diciembre\"]],u,[[\"a.d.\",\"dC\"],[\"a.d.\",\"d.C.\"],[\"ñawpa cristu\",\"chanta cristu\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM, y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{0} {1}\",\"{1} {0}\"]JBOB\",\"Bs\",\"Boliviano\",{\"BBD\":[\"BBG\",\"$\"],\"BMD\":[\"DBM\",\"$\"],\"BOB\":[\"Bs\"],\"BZD\":[\"DBZ\",\"$\"],\"CAD\":[\f"$CA\",\"$\"],\"GHS\":[u,\"GHC\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"USD\":[\"$US\",\"$\"UcOx34yrl$yrl=	CAAC;IAEd)QAAQ8\	
M	A_$OAAO,EAAC,UAAU,EAAC,cAAc,EAAC,iBAAiBOAAOPQR	M	:A(]
+
hOAAO,EAAC,UAAU,EAAC,OAAO,EAAC,IAAI,EAAC,SAAS,EAAC,UAAU,EAAC,aAAa,EAAC,UAAU,EAAC,cAAc,EAAC,WAAW,EAAC,YAAYQ	M	\\M	
gBAAgB,EAAC,eAAeQ	M	2SAAS,EAAC,UAAU,EAAC,gBAAg	E
	M	JA 
#u
(\

-mBAAmB,EP(P
&FJ



P2
MAAMp(MAAM(P7AMAAM


P772	;\n$yrl*M\",\"M\",\"M\",\"M\",\"S\",\"Y\",\"S\"],[\"mit\",\"mur\",\"mmk\",\"mms\",\"sup\",\"yuk\",\"sau\"],[\"mituú\",\"murakipí\",\"murakí-mukũi\",\"murakí-musapíri\",\"supapá\",\"yukuakú\",\"saurú\"],[\"mit\",\"mur\",\"mmk\",\"mms\",\"sup\",\"yuk\",\"sau\"]],u,[[\"Y\",\"M\",\"M\",\"I\",\"P\",\"P\",\"P\",\"P\",\"P\",\"Y\",\"Y\",\"Y\"],[\"ye\",\"mk\",\"ms\",\"id\",\"pu\",\"py\",\"pm\",\"ps\",\"pi\",\"yp\",\"yy\",\"ym\"],[\"yepé\",\"mukũi\",\"musapíri\",\"irũdí\",\"pú\",\"pú-yepé\",\"pú-mukũi\",\"pú-musapíri\",\"pú-irũdí\",\"yepé-putimaã\",\"yepé-yepé\",\"yepé-mukũi\"]],u,[[\"K.s.\",\"K.a.\"],u,[\"Kiristu s[enũdé\",\"Kiristu ariré\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMMJ=u.Peso Kurũbiyawara\",{\"AUD\":[\"AU$\",\"$\"],\"BOB\":[\"BUB\",\"Bs\"],\"BYN\":[u,\"p.\"],\"COP\":[\"$\",\"COP\"],\"JPY\":[\"JPU¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"PTE\":[\"Esc.\"],\"RON\":[u,\"L\"],\"SCR\":[\"SCRumHB\":[\"฿\"],\"TWD\":[%^S\":[\"Bs.S\",\"VES\"],\"XAF\":[\"FCF\"],\"XOF\":[\"CFA\"],\"XPF\":[\"CFP\"],\"ZMW\":[u,\"Zk\"k>x NL$NL@"OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAeCwBAAwB)MAAMmNL	1D.HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss0,\",\".He> #,##0.00;¤ -#,##0.00\",\"#E0\"],\"EUR\",\"€\",\"Euro\",{IxCx 

KM$KM@<Kyx- 	eAAe,EAAE;2export default [];\n"]}eQLxu 33KM$KM@gBAAgB!(oooF 
KMKMF\",\"CF\",\"franc comorif\"CF\"%NTx3en-IM!en-IM@!
CAAC;IAEjG/<_O	<<F
.KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,E1ECAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU?
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMKAAK,E1C	
QAAQL_O	CAAC,eAAe,EAAC,aAAaPP
K
gBAAgBVcAAc@QAAQ,EAAC,WAAW,E1oEAAC,UAAU,EA
@
*;\n\nif (i === 1 && v === 0)\n    return 1%en-IM\",[[\"a\",\"p\"],[\"am\",\"pm\"],u],[[\"am\",\"pm\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],.[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"SVJan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"B,C\",\"AD\"],[\"Before Christ\",\"Anno Domini~9,^at' {0}\",u],[\".\",\",.]g%\",\"¤#,##0.00\",\"#E0\"],\"GBP\",\"£\",\"UK Pound\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$Sjzx NG%G?aAAa,EAAC,gBAAgBAgBAAgBJn7}MG	2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a/MD\",\"D\",\"Gambian Dalasi\",{\"GMD\":[\"D\"],I5::x PK$PK@
 aAAa,EAAC,gBAAgBAIAAI,EAAC,iBAAiBJBIAAI,CL1%PK	0,[6,0],[\"dd/MM/y\",\"dd-MMM-(2h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss aPKR\",\"Rs\",\"Pakistani Rupee PKR\":[\"Rs3	Hu=xL F%F?`
WAAWmF	USD\",\"US$\",\"US Dollar\",{I[xq D%D?GAAG,EAAC,uBAAuB_H4D	0{(XCD\",\"$\",\"East Caribbean<
,\"XCD\":[p!Zx BIL$IL@"MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,cAAcCGAAG,EAAC,oBAAoB_mIL	0,[5,6?*H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss"ILS\",\"₪\",\"Israeli New ShekelMq|:L&x 
VI$VI@\`#,
UAAU,EAAC,WAAW,EAAC,iBAAi0GAAG,EAAC,WAAW,EAAC,EAAE&4VI\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM
>0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d,$\",\"US Dollar\",{ODx'9sq-MK!sq-MK@(aAAa,EAAC,YAAY(UAAU,EAAC,SAASV+Ftr(&KA+Ftr(&K9IAAIaBIAAIa+Av#CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ0$,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS
OAAOeAAejGj
~

\cAAc!A#(QAAQ,EAAC,YAAY~

kBAAkBA
MAAM



IAAI~































































































=sq-MK\",[[\"p.d.\",\"m.d.\"],u,[\"e paradites\",\"e pasdites\"]],[[\"p.d.\",\"m.d.\"],u,[\"paradite\",\"pasdite\"]],[[\"d\",\"h\",\"m\",\"m\",\"e\",\"p\",\"sh\"],[\"Die\",\"Hën\",\"Mar\",\"Mër\",\"Enj\",\"Pre\",\"Sht\"],[\"e diel\",\"e hënë\",\"e martë\",\"e mërkurë\",\"e enjte\",\"e premte\",\"e shtunë\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"]],[[\"d\",\"h\",\"m\",\"m\",\"e\",\"p\",\"sh\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"],[\"e diel\",\"e hënë\",\"e martë\",\"e mërkurë\",\"e enjte\",\"e premte\",\"e shtunë\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"]],[[\"j\",\"sh\",\"m\",\"p\",\"m\",\"q\",\"k\",\"g\",\"sh\",\"t\",\"n\",\"dh\"],[\"jan\",\"shk\",\"mar\",\"pri\",\"maj\",\"qer\",\"korr\",\"gush\",\"sht\",\"tet\",\"nën\",\"dhj\"],[\"janar\",\"shkurt\",\"mars\",\"prill\",\"maj\",\"qershor\",\"korrik\",\"gusht\",\"shtator\",\"tetor\",\"nëntor\",\"dhjetor\"]],u,[[\"p.K.\",\"mb.K.\"],u,[\"para Krishtit\",\"mbas Krishtit\"]],1,[62,0],[\"d.M.yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d=\në',-E%\",\"#,##0.00 ¤\",\"#E0\"],\"MKD\",\"den\",\"Denari maqedonas\",{\"AFN\":[],\"ALL\":[\"Lekë\"],\"AMD\":[],\"AOA\":[],\"ARS\":[],\"AUD\":[\"A$\",\"AUD\"],\"AZN\":[],\"BAM\":[],\"BBD\":[],\"BDT\":[],\"BMD\":[],\"BND\":[],\"BOB\":[],\"BRL\":[],\"BSD\":[],\"BWP\":[],\"BZD\":[],\"CAD\":[\"CA$\",\"CAD\"],\"CLP\":[],\"CNY\":[\"CN¥\",\"CNY\"],\"COP\":[],\"CRC\":[],\"CUC\":[],\"CUP\":[],\"CZK\":[],\"DKK\":[],\"DOP\":[],\"EGP\":[],\"FJD\":[],\"FKP\":[],\"GBP\":[\"£\",\"GBP\"],\"GEL\":[],\"GIP\":[],\"GNF\":[],\"GTQ\":[],\"GYD\":[],\"HKD\":[\"HK$\",\"HKS\"],\"HNL\":[],\"HRK\":[],\"HUF\":[],\"IDR\":[],\"ILS\":[\"₪\",\"ILS\"],\"INR\":[\"₹\",\"INR\"],\"ISK\":[],\"JMD\":[],\"JPY\":[\"JP¥\",\"JPY\"],\"KHR\":[],\"KMF\":[],\"KPW\":[],\"KRW\":[\"₩\",\"KRW\"],\"KYD\":[],\"KZT\":[],\"LAK\":[],\"LBP\":[],\"LKR\":[],\"LRD\":[],\"MGA\":[],\"MKD\":[\"den\"],\"MMK\":[],\"MNT\":[],\"MUR\":[],\"MXN\":[\"MX$\",\"MXN\"],\"MYR\":[],\"NAD\":[],\"NGN\":[],\"NIO\":[],\"NOK\":[],\"NPR\":[],\"NZD\":[\"NZ$\",\"NZD\"],\"PHP\":[],\"PKR\":[],\"PLN\":[],\"PYG\":[],\"RON\":[],\"RUB\":[],\"RWF\":[],\"SBD\":[],\"SEK\":[],\"SGD\":[],\"SHP\":[],\"SRD\":[],\"SSP\":[],\"STN\":[],\"SYP\":[],\"THB\":[\"฿\",\"THB\"],\"TOP\":[],\"TRY\":[],\"TTD\":[],\"TWD\":[\"NT$\",\"TWD\"],\"UAH\":[],\"USD\":[\"US$\",\"USD\"],\"UYU\":[],\"VND\":[\"₫\",\"VND\"],\"XCD\":[\"EC$\",\"XCD\"],\"ZAR\":[],\"ZMW\":[]},\"ltr\", plural];\n"]}H{x- 	eAAe,EAAE2export default [];\n"]}g&7xknds-NL!nds-NL@QAAQ,EAAC,CAAC,C/ȓ/ip@>KAAK,E*->
@>
gBAAgWWAp#(
#O	EAAC,KAAK+[nds-NL\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],u,uU
UM01\",\"M02\",\"M03\",\"M04\",\"M05\",\"M06\",\"M07\",\"M08\",\"M09\",\"M10\",\"M11\",\"M12\"],u],u,[[\"BCE\",\"CE\"],u,u],1,[6:,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE#Mu,u],[\".\",\",]_%\",\"¤ #,##0.00\",\"#E0\"],\"EUR\",\"€\",\"EUR\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$!۝K6x nds-NL!nds-NL@	kx- 	eAAe,EAAE=2export default [];\n"]}f\^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-NG", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "NGN", "₦", "Nigerian Naira", { "JPY": ["JP¥", "¥"], "NGN": ["₦"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-NG.js.map}:mx qFI$.mm", "H.mm.ss", "H.mm.ss z", "H.mm.1,", " 8.1 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Eurol>	FI.js.map)_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-FK", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "FKP", "£", "Falkland Islands Pound", { "FKP": ["£"], "GBP": ["GB£", "£"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-FK.js.mapD
xV UGi0F
"UGX", "USh", "Ugandan Shilling", {
GX": ["UShC	UG.js.mapzCoxm VG/h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss aUSD", "US$", "US Dollar", {W	VG.js.map!'kxr4sw-UG", [["am", "pm"], ["AM", "PM"], u], [["AM", "PM	3UJumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi"], u, uWc", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KK", "BK"], u, ["Kabla ya Kristo", "Baada ya Kristo"]], 1, [0Fw {0}", u, ufJ #,##0.00", "#E0"], "UGX", "USh", "Shilingi ya Uganda", { "BYN": [u, "р.^KES": ["Ksh"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "TZS": ["TSh"], "UGX": ["USh@sw-UG.js.map
^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-GM", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GMD", "D", "Gambian Dalasi", { "GMD": ["D"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-GM.js.mapΗmx8 FyUSD", "US$", "US Dollar", {W	FM.js.mapy'
4x U/VI", [["a", "p"], ["AM", "PM"], u], [["AM", "PM	`j=0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d,|USD", "$", "US Dollar", {+	VI.js.map,m^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-GH", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GHS", "GH₵", "Ghanaian Cedi", { "GHS": ["GH₵"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-GH.js.map@@tx SEry-MM-ddU/+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss/$,", " ", ";", "%", "+", "-", "×10^8` %", "#,##0.00 ¤", "#E0"], "SEK", "kr", "Swedish Krona", { "JPY": ["JP¥", "¥"], "SEK": ["krC	SE.js.map?^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-PG", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "PGK", "K", "Papua New Guinean Kina", { "JPY": ["JP¥", "¥"], "PGK": ["K"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-PG.js.map 
ux WGI+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ssZGIP", "£", "Gibraltar Pound", { "GBP": ["GB£", "£"], "GIP": ["£"], "JPY": ["JP¥", "¥C	GI.js.map4|Zx]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-GU", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
//# sourceMappingURL=en-GU.js.mapqm/x4/MS", [["a", "p"], ["am", "pm"], u], [["am", "pm	`ti1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {_XCD", "$", "East Caribbean Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "XCD": ["$"] n+	MS.js.map~QS]x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-TV", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "AUD", "$", "Australian Dollar", { "AUD": ["$"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-TV.js.map6klxm PW/h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss aUSD", "US$", "US Dollar", {W	PW.js.mapw!~|xL GYx.GYD", "$", "Guyanaese Dollar", { "GYD": ["$"],oW	GY.js.map[˴]x+/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-HK", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "HKD", "HK$", "Hong Kong Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-HK.js.mapS7ax ASHe1, [6, 0], ["dd/MP2+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ssZSHP", "£", "St Helena Pound", { "GBP": ["GB£", "£"], "JPY": ["JP¥", "¥"], "SHP": ["£C	SH.js.map8\x6/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-IM", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GBP", "£", "UK Pound", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-IM.js.mapxHVx FPKe0, [6, 0], ["dd/MM/y", "dd-MMM-_%/h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss aCPKR", "Rs", "Pakistani Rupee", { "JPY": ["JP¥", "¥"], "PKR": ["Rs}C	PK.js.map6F^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-SL", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "SLL", "Le", "Sierra Leonean Leone", { "JPY": ["JP¥", "¥"], "SLL": ["Le"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-SL.js.mapEq3	ux aINe 0, [0, 0], ["dd/MM/yy", "dd-MMM-_,|,##0.###", "#,##,##0%", "¤#,#@2INR", "₹", "Indian Rupee", { "JPY": ["JP¥", "¥.	IN.js.mapY+"xx KNxZXCD", "$", "East Caribbean Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "XCD": [0	KN.js.map"')x~
2ur-IN", [["a", "p"], ["AM", "PM"], u], [["AM", "PM	3Zاتوار", "پیر", "منگل", "بدھ", "جمعرات", "جمعہ", "ہفتہ"], u, uGجنوری", "فروری", "مارچ", "اپریل", "مئی", "جون", "جولائی", "اگست", "ستمبر", "اکتوب", "نومبر", "دسمبر"], u], u, [["قبل مسیح", "عیسوی"], u, u], 0, [0, 0], ["d/M/yy", "d MMM، y", "d MMMM، y", "EEEE، d MMMM،|E {0}", u, u‎+", "‎E @INR", "₹", "بھارتی روپیہ", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "rtl!ur-IN.js.map\x4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-IO", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "US$", "US Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-IO.js.mapQ&^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-KE", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Kenyan Shilling", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-KE.js.map]Jnx= Jf1BGBP", "£", "UK Poundm>	JE.js.mapO:xR SCe1BSCR", "SR", "Seychellois Rupeem
SCR": ["SRC	SC.js.map	x dZAr+y/MM/dd", "dd MMM y", "dd MMMM y", "EEEE, dvh,", " lZAR", "R", "South African RandmUSD": ["US$", "$"], "ZAR": ["R.	ZA.js.map&+ܱ^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-JM", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "JMD", "$", "Jamaican Dollar", { "JMD": ["$"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-JM.js.map`nx uNLe1BB+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss/,", ".X #,##0.00;¤ -@EUR", "€", "Euro", {W	NL.js.mapm)^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-KY", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KYD", "$", "Cayman Islands Dollar", { "JPY": ["JP¥", "¥"], "KYD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-KY.js.maptx pRW+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ssARWF", "RF", "Rwandan Franc", { "JPY": ["JP¥", "¥"], "RWF": ["RFC	RW.js.map+s^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-LS", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ZAR", "R", "South African Rand", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "ZAR": ["R"] }, "ltr", plural];
//# sourceMappingURL=en-LS.js.map%
qx U/PR", [["a", "p"], ["AM", "PM"], u], [["AM", "PM	`j=0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d,|USD", "$", "US Dollar", {+	PR.js.map,{]x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-MG", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "MGA", "Ar", "Malagasy Ariary", { "JPY": ["JP¥", "¥"], "MGA": ["Ar"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-MG.js.mapi^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-MO", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "MOP", "MOP$", "Macanese Pataca", { "JPY": ["JP¥", "¥"], "MOP": ["MOP$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-MO.js.map@	tx hPNe1BB+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ssCNZD", "$", "New Zealand Dollar", { "JPY": ["JP¥", "¥"], "NZD": ["D	PN.js.map2-	x b/UM", [["a", "p"], ["AM", "PM"], u], [["AM", "PM	`j0M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d,|USD", "$", "US Dollar", {+	UM.js.map)ҿ]x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-MU", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "MUR", "Rs", "Mauritian Rupee", { "JPY": ["JP¥", "¥"], "MUR": ["Rs"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-MU.js.mapyX]x,/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-MV", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 5, [6, 0], ["d-M-yy", "dd-MM-y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MVR", "Rf", "Maldivian Rufiyaa", { "JPY": ["JP¥", "¥"], "MVR": ["Rf"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-MV.js.mapMD`xTTe0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}"f8#,##0.00", "#E0"], "TTD", "$", "Trinidad & Tobago Dollar`	TTD": ["$C	TT.js.mapBFkx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["nl-SX", [["a.m.", "p.m."], u, u], u, [["Z", "M", "D", "W", "D", "V", "Z"], ["zo", "ma", "di", "wo", "do", "vr", "za"], ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], ["zo", "ma", "di", "wo", "do", "vr", "za"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mrt.", "apr.", "mei", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"]], u, [["v.C.", "n.C."], ["v.Chr.", "n.Chr."], ["voor Christus", "na Christus"]], 1, [6, 0], ["dd-MM-y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'om' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "ANG", "NAf.", "Nederlands-Antilliaanse gulden", { "ANG": ["NAf."], "AUD": ["AU$", "$"], "BYN": [u, "р."], "CAD": ["C$", "$"], "FJD": ["FJ$", "$"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RUR": [u, "р."], "SBD": ["SI$", "$"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nl-SX.js.mapt#a,Lx:en-SX", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "SJJan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Chris(t", "Anno Domini"]], 1, [6, 0], ["dd/MM/Q ,qH', {0}", u, "{1} 'at' {0}", u], [".", ",XG%-therlands Antillean Guilder", { "ANG": ["NAf.b)en-SX.js.mapTx |MY/h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a"MYR", "RM", "Malaysian Ringgit", {
MYR": ["RMC	MY.js.map(]x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-NR", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "AUD", "$", "Australian Dollar", { "AUD": ["$"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-NR.js.map̳^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-NZ", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["d/MM/yy", "d/MM/y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "NZD", "$", "New Zealand Dollar", { "JPY": ["JP¥", "¥"], "NZD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-NZ.js.mapKԙ?px IZWe0, [6, 0], ["d/M/y", "dd MMM,y", "dd MMMM y", "EEEE, dd MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, USD", "US$", "USj$>	ZW.js.mapK3)^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-SB", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "SBD", "$", "Solomon Islands Dollar", { "JPY": ["JP¥", "¥"], "SBD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-SB.js.mapٴ^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-TZ", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "TZS", "TSh", "Tanzanian Shilling", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-TZ.js.mapܛxqxz S/h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss aSZL", "E", "Swazi Lilangenip	SZL": ["EC	SZ.js.mapdy%^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-TK", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "NZD", "$", "New Zealand Dollar", { "JPY": ["JP¥", "¥"], "NZD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-TK.js.map^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-TO", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "TOP", "T$", "Tongan Paʻanga", { "JPY": ["JP¥", "¥"], "TOP": ["T$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=en-TO.js.mapZҷ^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en-VC", [["a", "p"], ["am", "pm"], u], [["am", "pm"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XCD", "$", "East Caribbean Dollar", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "XCD": ["$"] }, "ltr", plural];
//# sourceMappingURL=en-VC.js.mapJ<Yxc/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["en", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
//# sourceMappingURL=en.js.map:Rx$/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["eo", [["atm", "ptm"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["di", "lu", "ma", "me", "ĵa", "ve", "sa"], ["dimanĉo", "lundo", "mardo", "merkredo", "ĵaŭdo", "vendredo", "sabato"], ["di", "lu", "ma", "me", "ĵa", "ve", "sa"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aŭg", "sep", "okt", "nov", "dec"], ["januaro", "februaro", "marto", "aprilo", "majo", "junio", "julio", "aŭgusto", "septembro", "oktobro", "novembro", "decembro"]], u, [["aK", "pK"], u, u], 1, [6, 0], ["yy-MM-dd", "y-MMM-dd", "y-MMMM-dd", "EEEE, d-'a' 'de' MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "H-'a' 'horo' 'kaj' m:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], u, u, u, { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=eo.js.maphlx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-419", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "EUR", "EUR", "euro", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-419.js.mapqxxJ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-AR", [["a. m.", "p. m."], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], u, [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00", "#E0"], "ARS", "$", "peso argentino", { "ARS": ["$"], "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-AR.js.map?ox	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-BO", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM 'de' y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "BOB", "Bs", "boliviano", { "AUD": [u, "$"], "BOB": ["Bs"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-BO.js.mapQwx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-BR", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "BRL", "R$", "real brasileño", { "AUD": [u, "$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-BR.js.mapqx /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-SV", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "USD", "$", "dólar estadounidense", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-SV.js.maptgxY BZUBZD", "$", "dólar beliceño<	BZD": ["$3MUSD": [u, "z|	BZ.js.mapTxG
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-CL", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["do", "lu", "ma", "mi", "ju", "vi", "sá"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "sept.", "oct.", "nov.", "dic."], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["dd-MM-yy", "dd-MM-y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00;¤-#,##0.00", "#E0"], "CLP", "$", "Peso chileno", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CLP": ["$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-CL.js.mapBj_	Ux `NIϓ,.uF0, [6, 0], ["d/M/yy", "d MMM .", ",b/", "#E0"], "NIO", "C$", "córdoba nicaragüense!N}IO": ["C>	|u		NI.js.mapz/x0
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-CO", [["a. m.", "p. m."], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "sept.", "oct.", "nov.", "dic."], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/MM/yy", "d/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00", "#E0"], "COP", "$", "peso colombiano", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "COP": ["$"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-CO.js.mapXAx"	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-CR", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "CRC", "₡", "colón costarricense", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "CRC": ["₡"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-CR.js.mapD^0x GQ'D", "L", "M", "XuTP:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1}, {0}", u, u, u], [",", ".nn,XAF", "FCFA", "franco CFA de África Central_EGP": [], "ESP": ["₧THB": ["฿z
"US$", "$"I	GQ.js.map)GVx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-CU", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "CUP", "$", "peso cubano", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "CUP": ["$"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-CU.js.mapAv&xl GT-0, [6, 0], ["d/MM/yy", "d/MM/GTQ", "Q", "quetzal__I	GTQ": ["Qu	GT.js.mapMcfx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-HN", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/M/yy", "d MMM y", "dd 'de' MMMM 'de' y", "EEEE dd 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "HNL", "L", "lempira hondureño", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "HNL": ["L"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-HN.js.mapz*x 1DO'uTb 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a5DOP", "RD$", "peso dominican`DOP": ["RD$", "$T_"US$"	DO.js.map;W|x7/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-EA", [["a. m.", "p. m."], u, u], u, [["D", "L", "M", "X", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], u, [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1}, {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EGP": [], "ESP": ["₧"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "THB": ["฿"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-EA.js.map_Ngx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-EC", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00;¤-#,##0.00", "#E0"], "USD", "$", "dólar estadounidense", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-EC.js.mapfwG|x7/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-IC", [["a. m.", "p. m."], u, u], u, [["D", "L", "M", "X", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], u, [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1}, {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EGP": [], "ESP": ["₧"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "THB": ["฿"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-IC.js.mapsx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-MX", [["a. m.", "p. m."], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], u, [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["dd/MM/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "MXN", "$", "peso mexicano", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "p."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MRO": ["MRU"], "MRU": ["UM"], "MXN": ["$"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-MX.js.mapd'x#	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-PA", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["MM/dd/yy", "MM/dd/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "PAB", "B/.", "balboa panameño", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PAB": ["B/."], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-PA.js.map{x@
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-PE", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "set.", "oct.", "nov.", "dic."], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "setiembre", "octubre", "noviembre", "diciembre"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Ene.", "Feb.", "Mar.", "Abr.", "May.", "Jun.", "Jul.", "Ago.", "Set.", "Oct.", "Nov.", "Dic."], ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Setiembre", "Octubre", "Noviembre", "Diciembre"]], [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/MM/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00", "#E0"], "PEN", "S/", "sol peruano", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PEN": ["S/"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-PE.js.map5NxPi === 1 && v === 0*it-CH", [["m.", "p."], ["AM", "PM"], u], u~G&er", "gio", "ven", "sab"], ["domenica", "lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato"], ["dom", "lun", 	Aer", "gio", "ven", "sab"]], u, [["G", "F", "M", "A", "M", "G", "Lxgen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"]], u, [["aC", "dC"], ["a.C.", "d.C."], [^"avanti Cristo", "dopo Cristo"]], 1, [6, 0], ["dd.MM.yy", "d MMM y", "d MMMM y", "EEEE, d MMMM)Iu, "{1} {0}", u], [".", "’Q%", "¤ #,##0.00;¤-UCHF", "CHF", "franco svizzero", { "BRL": [u, "R$"], "BYN": [u, "Br"], "EGP": [u, "£EIOK": [u, "NKr"], "THB": ["฿	*	
)it-CH.js.map<:-xQ)i === Math.floor(i) && (i >= 0 && i <= 1)pt-CH", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["JZ=#jan.", "fev.", "mar.", "abr.", "mai&ut.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", ")novembro", "dezembro"]], u, [["a.C.", "d. 2pois de Cristo"]], 1, [6, 0], ["dd/MM/yy", "dd/MM/z!u, "{1} 'às' {0}", u], [",", " QN%", "#,##0.00 ¤", "#E0"], "CHF", "CHF", "franco suíço", { "AUD": ["AU$", "@JPY": ["JP¥", "¥M	PTE": ["​`	1THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"

*pt-CH.js.maph|x;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-PH", [["a. m.", "p. m."], u, u], u, [["D", "L", "M", "X", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], u, [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "PHP", "₱", "peso filipino", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EGP": [], "ESP": ["₧"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "RON": [u, "L"], "THB": ["฿"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-PH.js.mapsmx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-PR", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["MM/dd/yy", "MM/dd/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "USD", "$", "dólar estadounidense", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-PR.js.mapvxB	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-PY", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["do", "lu", "ma", "mi", "ju", "vi", "sa"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "sept.", "oct.", "nov.", "dic."], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "PYG", "Gs.", "guaraní paraguayo", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "PYG": ["Gs.", "₲"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-PY.js.map刺zxR/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-US", [["a. m.", "p. m."], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], u, [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/M/y", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00", "#E0"], "USD", "$", "dólar estadounidense", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "NT$"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-US.js.mapײxR
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-UY", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "set.", "oct.", "nov.", "dic."], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "setiembre", "octubre", "noviembre", "diciembre"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Ene.", "Feb.", "Mar.", "Abr.", "May.", "Jun.", "Jul.", "Ago.", "Set.", "Oct.", "Nov.", "Dic."], ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Setiembre", "Octubre", "Noviembre", "Diciembre"]], [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00", "#E0"], "UYU", "$", "peso uruguayo", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "UYU": ["$"], "UYW": ["UP"], "VEF": [u, "BsF"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-UY.js.map<x9	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es-VE", [["a. m.", "p. m."], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"]], [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"]], [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "sept.", "oct.", "nov.", "dic."], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 0, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", "{1} {0}", "{1}, {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00;¤-#,##0.00", "#E0"], "VES", "Bs.S", "bolívar soberano", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "ESP": ["₧"], "EUR": [u, "€"], "FKP": [u, "FK£"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SSP": [u, "SD£"], "SYP": [u, "S£"], "TWD": [u, "NT$"], "USD": [u, "$"], "VEF": ["Bs."], "VES": ["Bs.S"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es-VE.js.map|x=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (n === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["es", [["a. m.", "p. m."], u, u], u, [["D", "L", "M", "X", "J", "V", "S"], ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], ["DO", "LU", "MA", "MI", "JU", "VI", "SA"]], u, [["E", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sept", "oct", "nov", "dic"], ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]], u, [["a. C.", "d. C."], u, ["antes de Cristo", "después de Cristo"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss (zzzz)"], ["{1}, {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EGP": [], "ESP": ["₧"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "THB": ["฿"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "XAF": [], "XCD": [u, "$"], "XOF": [] }, "ltr", plural];
//# sourceMappingURL=es.js.map6:[xL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["et", [["AM", "PM"], u, u], u, [["P", "E", "T", "K", "N", "R", "L"], u, ["Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", "Neljapäev", "Reede", "Laupäev"], ["P", "E", "T", "K", "N", "R", "L"]], u, [["J", "V", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jaan", "veebr", "märts", "apr", "mai", "juuni", "juuli", "aug", "sept", "okt", "nov", "dets"], ["jaanuar", "veebruar", "märts", "aprill", "mai", "juuni", "juuli", "august", "september", "oktoober", "november", "detsember"]], u, [["eKr", "pKr"], u, ["enne Kristust", "pärast Kristust"]], 1, [6, 0], ["dd.MM.yy", "d. MMM y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "×10^", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": ["AU$", "$"], "EEK": ["kr"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=et.js.mapnsx8/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["eu", [["g", "a"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["I", "A", "A", "A", "O", "O", "L"], ["ig.", "al.", "ar.", "az.", "og.", "or.", "lr."], ["igandea", "astelehena", "asteartea", "asteazkena", "osteguna", "ostirala", "larunbata"], ["ig.", "al.", "ar.", "az.", "og.", "or.", "lr."]], u, [["U", "O", "M", "A", "M", "E", "U", "A", "I", "U", "A", "A"], ["urt.", "ots.", "mar.", "api.", "mai.", "eka.", "uzt.", "abu.", "ira.", "urr.", "aza.", "abe."], ["urtarrilak", "otsailak", "martxoak", "apirilak", "maiatzak", "ekainak", "uztailak", "abuztuak", "irailak", "urriak", "azaroak", "abenduak"]], [["U", "O", "M", "A", "M", "E", "U", "A", "I", "U", "A", "A"], ["urt.", "ots.", "mar.", "api.", "mai.", "eka.", "uzt.", "abu.", "ira.", "urr.", "aza.", "abe."], ["urtarrila", "otsaila", "martxoa", "apirila", "maiatza", "ekaina", "uztaila", "abuztua", "iraila", "urria", "azaroa", "abendua"]], [["a", "o"], ["K.a.", "K.o."], ["K.a.", "Kristo ondoren"]], 1, [6, 0], ["yy/M/d", "y('e')'ko' MMM d('a')", "y('e')'ko' MMMM'ren' d('a')", "y('e')'ko' MMMM'ren' d('a'), EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss (z)", "HH:mm:ss (zzzz)"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "% #,##0", "#,##0.00 ¤", "#E0"], "EUR", "€", "euroa", { "BYN": [u, "р."], "ESP": ["₧"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=eu.js.map),x#{"version":3,"file":"eu.js","sourceRoot":"","sources":["eu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"eu\",[[\"g\",\"a\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"I\",\"A\",\"A\",\"A\",\"O\",\"O\",\"L\"],[\"ig.\",\"al.\",\"ar.\",\"az.\",\"og.\",\"or.\",\"lr.\"],[\"igandea\",\"astelehena\",\"asteartea\",\"asteazkena\",\"osteguna\",\"ostirala\",\"larunbata\"],[\"ig.\",\"al.\",\"ar.\",\"az.\",\"og.\",\"or.\",\"lr.\"]],u,[[\"U\",\"O\",\"M\",\"A\",\"M\",\"E\",\"U\",\"A\",\"I\",\"U\",\"A\",\"A\"],[\"urt.\",\"ots.\",\"mar.\",\"api.\",\"mai.\",\"eka.\",\"uzt.\",\"abu.\",\"ira.\",\"urr.\",\"aza.\",\"abe.\"],[\"urtarrilak\",\"otsailak\",\"martxoak\",\"apirilak\",\"maiatzak\",\"ekainak\",\"uztailak\",\"abuztuak\",\"irailak\",\"urriak\",\"azaroak\",\"abenduak\"]],[[\"U\",\"O\",\"M\",\"A\",\"M\",\"E\",\"U\",\"A\",\"I\",\"U\",\"A\",\"A\"],[\"urt.\",\"ots.\",\"mar.\",\"api.\",\"mai.\",\"eka.\",\"uzt.\",\"abu.\",\"ira.\",\"urr.\",\"aza.\",\"abe.\"],[\"urtarrila\",\"otsaila\",\"martxoa\",\"apirila\",\"maiatza\",\"ekaina\",\"uztaila\",\"abuztua\",\"iraila\",\"urria\",\"azaroa\",\"abendua\"]],[[\"a\",\"o\"],[\"K.a.\",\"K.o.\"],[\"K.a.\",\"Kristo ondoren\"]],1,[6,0],[\"yy/M/d\",\"y('e')'ko' MMM d('a')\",\"y('e')'ko' MMMM'ren' d('a')\",\"y('e')'ko' MMMM'ren' d('a'), EEEE\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss (z)\",\"HH:mm:ss (zzzz)\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"−\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"% #,##0\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euroa\",{\"BYN\":[u,\"р.\"],\"ESP\":[\"₧\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}qM_^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ewo", [["kíkíríg", "ngəgógəle"], u, u], u, [["s", "m", "s", "s", "s", "f", "s"], ["sɔ́n", "mɔ́n", "smb", "sml", "smn", "fúl", "sér"], ["sɔ́ndɔ", "mɔ́ndi", "sɔ́ndɔ məlú mə́bɛ̌", "sɔ́ndɔ məlú mə́lɛ́", "sɔ́ndɔ məlú mə́nyi", "fúladé", "séradé"], ["sɔ́n", "mɔ́n", "smb", "sml", "smn", "fúl", "sér"]], u, [["o", "b", "l", "n", "t", "s", "z", "m", "e", "a", "d", "b"], ["ngo", "ngb", "ngl", "ngn", "ngt", "ngs", "ngz", "ngm", "nge", "nga", "ngad", "ngab"], ["ngɔn osú", "ngɔn bɛ̌", "ngɔn lála", "ngɔn nyina", "ngɔn tána", "ngɔn saməna", "ngɔn zamgbála", "ngɔn mwom", "ngɔn ebulú", "ngɔn awóm", "ngɔn awóm ai dziá", "ngɔn awóm ai bɛ̌"]], u, [["oyk", "ayk"], u, ["osúsúa Yésus kiri", "ámvus Yésus Kirís"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "Fəláŋ CFA (BEAC)", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ewo.js.map$	샻)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-NA.js.map](x n", "o", "m", "a", "n"], ["middernag", "die oggend", "die middag", "die aand", "die nag"], u], [["mn", "o", "m", "a", "n"], ["mAiddernag", "oggend", "middag", "aand", "nag"], u], ["00:00", ["05,04:00"], ["00:00", "05qaf-NA.js.map@+x del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-EC.js.mapVPDbx-{"version":3,"file":"fr-CD.js","sourceRoot":"","sources":["fr-CD.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"min.\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"min.\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}~#:x:
en-NA!en-NA@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAACQ1CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAASEAACQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\",[\"065%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}CIx(
	af$af=TGAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,SAASTGAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,KAAK) #<CPn\",\"o\",\"m\",\"a\",\"n\"],[\"middernag\",\"die oggend\",\"die middag\",\"die aand\",\"die nag\"],u],[[\"mn\",\"o\",\"m\",\"aT\",\"n\"],[\"middernag\",\"oggend\",\"middag\",\"aand\",\"nag\"],u],[\"00:00\",[\"055%4:00\"],[\"00:00\",\"05:00\"]]];\n"]}S/xd
s-EC"s-EC@q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)XWAAW,EAAC,QAAQ,E"# #<COdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"maAana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"]$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}'l9%Yx[	
fr-M"fr-M?r=QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,E8QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUBCAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,E6QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAMinuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"so*ir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04dK4:00\"]]];\n"]}ұ$xK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mn", "o", "m", "a", "n"], ["middernag", "die oggend", "die middag", "die aand", "die nag"], u], [["mn", "o", "m", "a", "n"], ["middernag", "oggend", "middag", "aand", "nag"], u], ["00:00", ["05:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=af.js.mapXx :Tfɔŋli", "ŋdi", "ŋdɔ", "ɣetrɔ", "fiẽ", "zã"], u, u], u, [["04:00", "05:00"]"d4:00"], ["14:00", "18:00"], ["18:00", "21:00"], ["21:00", "04:00"]]];
//# sourceMappingURL=ee.js.map9q
Tx Ztengah malam", "tengah hari", "pagi", "siang", "sore", "malam"], u, u], u, ["00:00", "12:00", ["00:00", "10:00"], ["10:00", "15:00"], ["15	id.js.mape?+.x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mn.", "h.", "mrg.", "sd.", "kv.", "n."], ["miðnætti", "hádegi", "að morgni", "síðdegis", "að kvöldi", "að nóttu"], u], [["mn.", "hd.", "mrg.", "sd.", "kv.", "n."], ["miðnætti", "hádegi", "morgunn", "síðdegis", "kvöld", "nótt"], ["miðnætti", "hádegi", "morgunn", "eftir hádegi", "kvöld", "nótt"]], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=is.js.mapwGnx &keskööl", "keskpäeval", "hommikul", "pärastlõunal", "õhtul", "öösel"], u, u], [["kesköö", "keskpäev", "hommik", "pä#rastlõuna", "õhtu", "öö"], u, u[5u03:00"], ["23:00", "05	et.js.mapMVx 	yo.js.mapRF$x 3
agq.js.map:*Dx 3
saq.js.map:(dx 3	wo.js.map4[?x 4	mn.js.map4%Qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ii", [["ꎸꄑ", "ꁯꋒ"], u, u], u, [["ꆏ", "ꋍ", "ꑍ", "ꌕ", "ꇖ", "ꉬ", "ꃘ"], ["ꑭꆏ", "ꆏꋍ", "ꆏꑍ", "ꆏꌕ", "ꆏꇖ", "ꆏꉬ", "ꆏꃘ"], ["ꑭꆏꑍ", "ꆏꊂꋍ", "ꆏꊂꑍ", "ꆏꊂꌕ", "ꆏꊂꇖ", "ꆏꊂꉬ", "ꆏꊂꃘ"], ["ꑭꆏ", "ꆏꋍ", "ꆏꑍ", "ꆏꌕ", "ꆏꇖ", "ꆏꉬ", "ꆏꃘ"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ꋍꆪ", "ꑍꆪ", "ꌕꆪ", "ꇖꆪ", "ꉬꆪ", "ꃘꆪ", "ꏃꆪ", "ꉆꆪ", "ꈬꆪ", "ꊰꆪ", "ꊰꊪꆪ", "ꊰꑋꆪ"], u], u, [["ꃅꋊꂿ", "ꃅꋊꊂ"], u, u], 0, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "CNY", "¥", "CNY", { "CNY": ["¥"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ii.js.maph3x& 
export default [	ak.js.map35x 3
cgg.js.map9Ux 3	ii.js.map3x{"version":3,"file":"mai.js","sourceRoot":"","sources":["mai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,KAAK,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,cAAc,EAAC,WAAW,EAAC,SAAS,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,OAAO,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"mai\",[[\"AM\",\"PM\"],u,[\"भोर\",\"सांझ\"]],[[\"AM\",\"PM\"],u,u],[[\"र\",\"सो\",\"मं\",\"बु\",\"गु\",\"शु\",\"श\"],[\"रवि\",\"सोम\",\"मंगल\",\"बुध\",\"गुरु\",\"शुक्र\",\"शनि\"],[\"रवि दिन\",\"सोम दिन\",\"मंगल दिन\",\"बुध दिन\",\"बृहस्पति दिन\",\"शुक्र दिन\",\"शनि दिन\"],[\"रवि\",\"सोम\",\"मंगल\",\"बुध\",\"गुरु\",\"शुक्र\",\"शनि\"]],u,[[\"ज\",\"फ\",\"मा\",\"अ\",\"म\",\"जू\",\"जु\",\"अ\",\"सि\",\"अ\",\"न\",\"दि\"],[\"जन॰\",\"फ़र॰\",\"मार्च\",\"अप्रैल\",\"मई\",\"जून\",\"जुल॰\",\"अग॰\",\"सित॰\",\"अक्तू॰\",\"नव॰\",\"दिस॰\"],[\"जनवरी\",\"फरवरी\",\"मार्च\",\"अप्रैल\",\"मई\",\"जून\",\"जुलाई\",\"अगस्त\",\"सितंबर\",\"अक्तूबर\",\"नवंबर\",\"दिसंबर\"]],[[\"ज\",\"फ\",\"मा\",\"अ\",\"म\",\"जू\",\"जु\",\"अ\",\"सि\",\"अ\",\"न\",\"दि\"],[\"जन॰\",\"फर॰\",\"मार्च\",\"अप्रैल\",\"मई\",\"जून\",\"जुल॰\",\"अग॰\",\"सित॰\",\"अक्तू॰\",\"नव॰\",\"दिस॰\"],[\"जनवरी\",\"फरवरी\",\"मार्च\",\"अप्रैल\",\"मई\",\"जून\",\"जुलाई\",\"अगस्त\",\"सितंबर\",\"अक्टूबर\",\"नवंबर\",\"दिसंबर\"]],[[\"ईसा-पूर्व\",\"ईसवी\"],u,u],0,[0,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} के {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"[#E0]\"],\"INR\",\"₹\",\"भारतीय रुपया\",{\"JPY\":[\"JP¥\",\"¥\"]},\"ltr\", plural];\n"]}x! $	eAAe,EAAE2	];\n"]}
0x ak!ak<EQx i"i;7px k"k;7mx #;&*x sah!sah<UgNx sg!sg<Fpx tg!tg<Fx ug!ug<F,8xq/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["እኩለ ሌሊት", "ቀ", "ጥዋት1", "ከሰዓት1", "ማታ1", "ሌሊት1"], ["እኩለ ሌሊት", "ቀትር", "ጥዋት1", "ከሰዓት 7", "ማታ1", "ሌሊት1"], ["እኩለ ሌሊት", "ቀትር", "ጥዋት1", "ከሰዓት 7 ሰዓት", "ማታ1", "ሌሊት1"]], [["እኩለ ሌሊት", "ቀትር", "ጥዋት", "ከሰዓት በኋላ", "ማታ", "ሌሊት"], ["እኩለ ሌሊት", "ቀትር", "ጥዋት1", "ከሰዓት በኋላ", "ማታ", "ሌሊት"], u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=am.js.mapv!gxu{"version":3,"file":"am.js","sourceRoot":"","sources":["am.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,SAAS,EAAC,GAAG,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,KAAK,EAAC,MAAM,EAAC,YAAY,EAAC,KAAK,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,SAAS,EAAC,KAAK,EAAC,KAAK,EAAC,UAAU,EAAC,IAAI,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,KAAK,EAAC,MAAM,EAAC,UAAU,EAAC,IAAI,EAAC,KAAK,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"እኩለ ሌሊት\",\"ቀ\",\"ጥዋት1\",\"ከሰዓት1\",\"ማታ1\",\"ሌሊት1\"],[\"እኩለ ሌሊት\",\"ቀትር\",\"ጥዋት1\",\"ከሰዓት 7\",\"ማታ1\",\"ሌሊት1\"],[\"እኩለ ሌሊት\",\"ቀትር\",\"ጥዋት1\",\"ከሰዓት 7 ሰዓት\",\"ማታ1\",\"ሌሊት1\"]],[[\"እኩለ ሌሊት\",\"ቀትር\",\"ጥዋት\",\"ከሰዓት በኋላ\",\"ማታ\",\"ሌሊት\"],[\"እኩለ ሌሊት\",\"ቀትር\",\"ጥዋት1\",\"ከሰዓት በኋላ\",\"ማታ\",\"ሌሊት\"],u],[\"00:00\",\"12:00\",[\"06:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}hGx!	el!el:qO
aAAa,EAAC,aAAa,EAAC,UAAUmO
EAAC,CUAAU,EAAC,OAAOmYPOOπρωί\",\"μεσημ.\",\"απόγ.\",\"βράδυ\"],u,[\"το πρωί\",\"το μεσημέρι\",\"το απόγευμα\",\"το βράδυ\"]],[[\"πρωί\",\"μεσημ.\",\"απόγ.\",\"βράδυ\"],u,[\"πρωί\",\"μεσημέρι\",\"α(πόγευμα\",\"βράδυ\"]],[[\"04;7:00\"],[\"17:00\",\"20:00\"],[\"20:00\",\"04:00\"]]];\n"]}loκHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-AE.js.mapb6x 			LB.js.map/j7x 			QA.js.map/nxC{"version":3,"file":"ar-AE.js","sourceRoot":"","sources":["ar-AE.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}شQx LB$LB@<E:sx QA$QA@<B#x8
en$en=tIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAU,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS
1<OOmmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\"%%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}\x	es-PA!es-PA@qlcAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa,CAAC,EAAC,CAAC,UAAU,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAaUAAU,EM"

67OOmdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],[\"mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u],[[\"mediodía\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"004&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-BH.js.mapbWxC{"version":3,"file":"ar-BH.js","sourceRoot":"","sources":["ar-BH.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}}Qx EG$EG@<6#sx>
en-VC!en-VC@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAU,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS
1<OOmmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\"%%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}keMx"


sr-Latn-ME!
sr-Latn-ME@q
EAAC,SAAS,EAAC,MAAM,EAAC,KAAK
EAAC,SAAS,EAAC,MAAM,EAAC,MAAM8EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,C
EAAC,SAAS,EAAC,MAAM,EAAC,KAAKponoć\",\"podne\",\"jutro\",\"po pod.\",\"veče\",\"noć\"],[\"ponoć\",\"podne\",\"jutro\",\"po pod.\",\"veče\",\"noću\"],[\"ponoć\",\"podne\",\"ujutro\",\"po podne\",\"uveče\",\"noću\"]],[[\"ponoć\",\"podne\",\"jutro\",\"popodne\",\"veče\",\"noć}_lx

en-DG!en-DGJqIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAU1CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS1mi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"{d h`xy
Cyrl'CyrlGпоноћ\",\"подне\",\"јутро\",\"по под.\",\"вече\",\"ноћ\"],[\"поноћ\",\"подне\",\"јутр\",\"по под.\",\"вече\",\"ноћу\"],[\"поноћ\",\"подне\",\"ујутро\",\"по подне\",\"увечj\",\"ноћу\"]],[[\"поноћ\",\"подне\",\"јутро\",\"поподне\",\"вече\",\"ноћ}t	x 

TC$TC@5Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-DJ.js.mapbyxC{"version":3,"file":"ar-DJ.js","sourceRoot":"","sources":["ar-DJ.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}Z9Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-DZ.js.mapbx !	del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"*, "tarde", "noche"], u, u], ["12:00", ["00/20:00"], ["20:00", "24`es-BZ.js.mapBx !	del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"*, "tarde", "noche"], u, u], ["12:00", ["00/20:00"], ["20:00", "24`es-SV.js.mapbC
xC{"version":3,"file":"ar-DZ.js","sourceRoot":"","sources":["ar-DZ.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}](6Qx[es-SV!es-SV@q5cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa,CAAC,EUAAU,EM"

67OOmdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"ma1ana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"004&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}jjx BZ$BZ@<Z Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-EG.js.mapbjHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-EH.js.mapbrx 			SD.js.map0s7x 			TD.js.map0#tWx !	del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"*, "tarde", "noche"], u, u], ["12:00", ["00/20:00"], ["20:00", "24`es-PE.js.mapBDx4	mezzanotte", "mezzogiorno", "di mattina", "di pomeriggio", "di sera", "di notte"], u, ["mezzanotte", "mezzogiorno", "di mattina", "del pomeriggio", "di sera", "di notte"]], [["mezzanotte", "mezzogiorno", "mattina", "pomeriggio", "sera", "notte"], u, u], ["00:00", "12:00""#(6`it-CH.js.mapa8x/	meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noite", "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], u, u], ["00:00", "12:00", ["06:09:00"], ["19/6`pt-CH.js.map7ZLxC{"version":3,"file":"ar-EH.js","sourceRoot":"","sources":["ar-EH.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}JQx SD$SD@<Lsx TD$TD@<N+xNde-C"de-C?raAAa,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQaAAa
EAAC,CAAC,aAAa,EAAC,QAAQ,EMYAAY,E
67OOOOmMitternacht\",\"morgens\",\"vorm.\",\"mittags\",\"nachm.\",\"abends\",\"nachts\"],u,[\"Mitternacht\",\"morgens\",\"vormittags\",\"mittags\",\"nachmittags\",\"abends\",\"nachts\"]],[[\"Mitternacht\",\"Morgen\",\"Vorm.\",\"Mittag\",\"Nachm.\",\"Abend\",\"Nacht\"],u,[\"Mitternacht\",\"Morgen\",\"Vormittag\",\"Mittag\",\"Nachmittag\",\"Abend\",\"Nacht\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"10a5:00\"]]];\n"]}!GUx[es-PE!es-PE@q5cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa,CAAC,EUAAU,EM"

67OOmdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"ma1ana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"004&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}j?x	pt-C"pt-C?rYAAY,EAAC,UAAU,E

ECAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcYAAY,EAAC,UAAU,E

CAAC,E
1<OOmmeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],u,u],[\"00:00\",	\"12:00\"%9:00\"],[\"196:00\"]]];\n"]}ۅ{&%xg
fr-NE!fr-NE@q6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM8QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU`6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM6QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM}Ominuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"sAoir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"1254:00\"]]];\n"]}Gqx	
i%i<aAAa,EAAC,YAAY,EAAC,eAAe,EAAC,SAAS,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,YAAY,EAAC,aAAa,EAAC,YAAY,EAAC,gBAAgB,EAAC,SAAS,EAAC,UAAU,C,YAAY,EAAC,aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,MAAMzzanotte\",\"mezzogiorno\",\"di mattina\",\"di pomeriggio\",\"di sera\",\"di notte\"],u,[\"mezzanotte\",\"mezzogiorno\",\"di mattina\",\"del pomeriggio\",\"di sera\",\"di notte\"]],[[\"mezzanotte\",\"mezzogiorno\",\"mattina\",\"pomeriggio\",\"sera\",\"nottepB8:00\"],[\"18.t.ux5

en$en=t2IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB2UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS
i\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"]U1:00\"],[\"21XC#Nx7

fr$fr=tMAAM,EAAC,MAAMaKSAAS,EAAC,SAAS,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAi$/hMAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,OAAOkMAAMin.\",\"midi\",\"du mat.\",\"de l’ap.m.\",\"du soir\",\"du mat.\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"min.\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après6-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04K4:00\"]]];\n"]}|x 

GG$GG@5Ax 

SD$SD@5Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-ER.js.mapbx 			IQ.js.map0(v7x-	mitjanit", "mat.", "matí", "md", "tarda", "vespre", "nit"], ["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nift"], u], [["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nit"], u, u], ["00:00", ["00D)9:00"], ["19:00", "21:00"], ["21:00", "24`ca-FR.js.map(VxC{"version":3,"file":"ar-ER.js","sourceRoot":"","sources":["ar-ER.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}(Qx IQ$IQ@<R sx
ca-F"ca-F?r$UAAU,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,E,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,MAAM
KAAKUAAU,EAAC,UAAU,EAAC,MAAM
KAAK,CAAC,E

67OOOOmmitjanit\",\"mat.\",\"matí\",\"md\",\"tarda\",\"vespre\",\"nit\"],[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u],[[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u,u],[\"00:00\",[\"00:00\",E;9:00\"],[\"19:00\",\"21:00\"],[\"21:00\",\"24:00\"]]];\n"]}眢x

en-AS!en-AS@q<IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU
(gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUA.
SAAS,EAAC,WAAW,EAAC,SAASG
_xQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\"%8:00\"],[\"18&06:00\"]]];\n"]}'x 

ER$ER@5/x 

MP$MP@6Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-IL.js.mapbxC{"version":3,"file":"ar-IL.js","sourceRoot":"","sources":["ar-IL.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}˅$Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-JO.js.mapbxC{"version":3,"file":"ar-JO.js","sourceRoot":"","sources":["ar-JO.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}N,QxBnl-BQ!nl-BQ@q3aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,WAAW,EAAC,WAAW,CAAC,EaAAa,EAAC,SAAS

67OOmmiddernacht\",\"’s ochtends\",\"’s middags\",\"’s avonds\",\"’s nachts\"],u,u],[[\"middernacht\",\"ochtend\",\"middag\"%,\"avond\",\"nacht\"],u,u],[\"00:00\"%,6:00\"]]];\n"]}g"x	pt-TL!pt-TL@qYAAY,EAAC,UAAU,E

ECAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcYAAY,EAAC,UAAU,E

CAAC,E
1<OOmmeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],u,u],[\"00:00\",	\"12:00\"%9:00\"],[\"196:00\"]]];\n"]}D7"Nx'
en-KN!en-KN@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAUA1CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS`
`\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12@%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}G*$xI
fr-PM!fr-PM@q6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM8QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM6QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM`
`nuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soi)r\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04K4:00\"]]];\n"]}ϯ	\xY	sq-XK!sq-XK@qYAAY,EAAC,YAAY,E"YAAY,EAAC,SAAS.@SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM)`
`}me mesnatës\",\"e mesditës\",\"e mëngjesit\",\"e paradites\",\"e pasdites\",\"e mbrëmjes\",\"e natës\"],u,u],[[\"mesnatë\",\"mesditë\",\"mëngjes\",\"paradite\",\"pasdite\",\"mbrëmje\",\"natë\"],u,u],[\"00:00\",\"12:00\",[\"04:00\",\"09:00\"],[\"09K4:00\"]]];\n"]}<TCx 

I%I?+fcx 

SL$SL@6CHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-KM.js.mapbxC{"version":3,"file":"ar-KM.js","sourceRoot":"","sources":["ar-KM.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}*#Qx<
en-J"en-J?rIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAU,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS
1<OOmmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\"%%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}̫x[es-BO!es-BO@q5cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa,CAAC,EUAAU,EM"

67OOmdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"ma1ana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"004&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}j5x 

D%D?+Ux 

F%F?+9ux 

G%G?+Hx 

IL$IL@57x 

I%I?+fWx 

NL$NL@5yx 

PK$PK@5x 

VI$VI@6I%=xW

ms-BN!ms-BN@q"MAAM,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ$cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,CAAC,EAAC,CA/AC,cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ,EAAC,OAAOsCOpagi\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],u,[\"tengah malam\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"]],[[\"pagi\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],[\"tengah malam\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],u],[[\"00:00\",\"01:00\"],[\"01;4:00\"],[\"14:00\",\"19:00\"],[\"19:00\",\"24:00\"]]];\n"]}-8#x#
	pt-AO!pt-AO@qYAAY,EAAC,UAAU,E
OEAAC,WAAW,CAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcCAAC,YAAY,EAAC,UAAU,E
	EAAC,WAAWeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",j\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugadaB;9:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}󍐵x@
	sq-MK!sq-MK@q@YAAY,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,YAAY,EAAC,SAAS)ECAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAMCOe mesnatës\",\"e mesditës\",\"e mëngjesit\",\"e paradites\",\"e pasdites\",\"e mbrëmjes\",\"e natës\"],u,u],[[\"mesnatë\"H,\"mesditë\",\"mëngjes\",\"paradite\",\"pasdite\",\"mbrëmje\",\"natë"4:00\",\"09:00\"],[\"095%4:00\"],[\"00:00\",\"04:00\"]]];\n"]}- 9x$ 	ln$ln=eEAAE@B];\n"]}
3x ps-PK!ps-PK@qWHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-KW.js.mapc xC{"version":3,"file":"ar-KW.js","sourceRoot":"","sources":["ar-KW.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}>Qx	el-CY!el-CY@qMAAM,EAAC,CAAC,SAAS,EAAC,aAAa,EAAC,aAAa,EAAC,UAAUMAAM"EAAC,CAAC,MAAM,EAAC,UAAU,EAAC,UAAUmOπρωί\",\"μεσημ.\",\"απόγ.\",\"βράδυ\"],u,[\"το πρωί\",\"το μεσημέρι\",\"το απόγευμα\",\"το βράδυ\"]],[[\"πρωί\",\"μεσημ.\",\"απόγ.\",\"βράδυ\"],u,[\"πρωί\",\"μεσημέρι\",\"α(πόγευμα\",\"βράδυ\"]],[[\"04;7:00\"],[\"17:00\",\"20:00\"],[\"20:00\",\"04:00\"]]];\n"]}@ٔHx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ل"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-LY.js.map=t
x;{"version":3,"file":"ar-LY.js","sourceRoot":"","sources":["ar-LY.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ل\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-MA.js.mapbx-	mitjanit", "mat.", "matí", "md", "tarda", "vespre", "nit"], ["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nift"], u], [["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nit"], u, u], ["00:00", ["00D)9:00"], ["19:00", "21:00"], ["21:00", "24`ca-AD.js.map(&VⳄxC{"version":3,"file":"ar-MA.js","sourceRoot":"","sources":["ar-MA.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}ZK Qx
ca-AD!ca-AD@q$UAAU,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,E,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,MAAM
KAAKUAAU,EAAC,UAAU,EAAC,MAAM
KAAK,CAAC,E

67OOOOmmitjanit\",\"mat.\",\"matí\",\"md\",\"tarda\",\"vespre\",\"nit\"],[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u],[[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u,u],[\"00:00\",[\"00:00\",E;9:00\"],[\"19:00\",\"21:00\"],[\"21:00\",\"24:00\"]]];\n"]}c"nxYes-E"es-E?r5cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa,CAAC,EUAAU,EM"

67OOmdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"ma1ana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"004&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}j.(Vxz
fr-G"fr-G?rQAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,	EAAC,UAAUQAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM1<OOmminuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"s+oir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04,4:00\"]]];\n"]}Cx

en-CC!en-CC@q<IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU
(gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUA.
SAAS,EAAC,WAAW,EAAC,SAASG
_xQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\"%8:00\"],[\"18&06:00\"]]];\n"]}x 

001$001@;&1x 

150$150@;Ux 

BB$BB@4qnwx 

A%A@q6KAAK,EAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,OAAOp6KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO$q2$d\",\"n\",\"mor\",\"aft\",\"eve\",\"s&\",\"noon\",\"mor\",\"aft\",\"eve\",\""c0vCiox 

GB$GB@4xxf
s-419"s-419@q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)XWAAW,EAAC,QAAQ,E"# #<COdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"maAana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"]$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}olix"


sr-Latn-BA!
sr-Latn-BA@q
EAAC,SAAS,EAAC,MAAM,EAAC,KAAK
EAAC,SAAS,EAAC,MAAM,EAAC,MAAM8EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,C
EAAC,SAAS,EAAC,MAAM,EAAC,KAAKponoć\",\"podne\",\"jutro\",\"po pod.\",\"veče\",\"noć\"],[\"ponoć\",\"podne\",\"jutro\",\"po pod.\",\"veče\",\"noću\"],[\"ponoć\",\"podne\",\"ujutro\",\"po podne\",\"uveče\",\"noću\"]],[[\"ponoć\",\"podne\",\"jutro\",\"popodne\",\"veče\",\"noć}elx 
	hr$hrG[
SAAS8
-[
eAAe[
SAAS8/ujutro\",\"popodne\",\"navečer\",\"noću\"],u,%ujutro\",\"poslije podne\",\"navečer()ujutro\",\"popodne\",\"navečer\",\"noću"4K4:00\"]]];\n"]}Svxy
Cyrl'CyrlGпоноћ\",\"подне\",\"јутро\",\"по под.\",\"вече\",\"ноћ\"],[\"поноћ\",\"подне\",\"јутр\",\"по под.\",\"вече\",\"ноћу\"],[\"поноћ\",\"подне\",\"ујутро\",\"по подне\",\"увечj\",\"ноћу\"]],[[\"поноћ\",\"подне\",\"јутро\",\"поподне\",\"вече\",\"ноћ}t
%x U
C%C?
S"SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS
S
@mat.\"],du mat.\",\")".\"],`mat.\"],",3<Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-MR.js.mapc
xC{"version":3,"file":"ar-MR.js","sourceRoot":"","sources":["ar-MR.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}mh8Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-OM.js.mapbxC{"version":3,"file":"ar-OM.js","sourceRoot":"","sources":["ar-OM.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}<2#Qx6
ur-IN!ur-IN@qUAAU,EAAC,KAAK,E8KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EMSAAS,EAAC,SAASUAAU,EAAC,KAAK,EKAAK,EAAC,KAAK,CAAC,E

67OOOmآدھی رات\",\"صبح\",\"دوپہر\",\"سہ پہر\",\"شام\",\"رات\"],u,[\"آدھی رات\",\"صبح میں\",\"وپہر میں\",\"سہ پہر\",\"شام میں\",\"رات میں\"]],[[\"آدھی رات\",\"صبح\",\"دوپہر\",\"سہ6 پہر\",\"شام\",\"رات\"],u,u],[\"00:00\",[\"046:00\"],[\"16%0:00\"],[\"20:00\",\"04:00\"]]];\n"]}ExN
ccp$ccp=t:0BAA0B,EAAC,cAAc,EAAC,gBAAgB,EAAC,cAAc,EAAC,cAAc,EAAC,UAAU)2<𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬\",\"𑄝𑄬𑄚𑄳𑄠𑄬\",\"𑄘𑄨𑄝𑄪𑄎𑄳𑄠\",\"𑄝𑄬𑄣e𑄳𑄠𑄬\",\"𑄥𑄎𑄧𑄚𑄳𑄠\",\"𑄢𑄬𑄖𑄴\"],u,u],u,[[\"04:00\",\"06:00\"],[\"06p7"]x$bn$bn?tKAAK,EAAC,MAAM,E!EAAC,SAAS,EAAC,QAAQKAAK,EAAC,MAAM,E!EAAC,SAAS,EAAC,UAAU KAAK,EAAC,MAAM,E!EAAC,SAAS,EAAC,QAAQ) ভোর\",\"সকাল\",\"দুপুর\",\"বিকাল\",\"সন্ধ্যা\",\"রাত্রি\"],u,[\"ভোর\",\"সকাল\",\"দুপুর\",\"বিকাল\",\"সন্ধ্যা\",\"রাত্রিতে\"]],[[\"ভোর\",\"সকাল\",\"দুপুর\",\"বিকাল\",\"সন্ধ্যা\",\"রাত্রি\"],u,u],[[\Oxdne$ne?t@SAAS,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK39xOमध्यरात\",\"मध्यान्ह\",\"बिहान\",\"अपरान्ह\",\"साँझ\",\"बेल<ुकी\",\"रात\"],u,u],u,[\"00:00\",\"12:00\",[\"045;9:00\"],[\"19:00\",\"22:00\"],[\"22:00\",\"04:00\"]]];\n"]}&x

es-DO!es-DO@qUAAU,EAAC,KAAK,EAAC,QAAQ,E".cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa$IAAI,EAAC,WAAW,EAAC,QAAQ,E"UAAU,EAAC,WAAW,EAAC,QAAQ,E"FZ_Omediodía\",\"día\",\"mañana\",\"tarde\",\"noche\"],[\"del mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u],[[\"m.\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],[\"mediodía\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],u],[\"12:00\",[\"00.424:00\"]]];\n"]}d*"x"

n-TK"n-TK@q?
2GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUk2MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU$,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAASa!/i\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\"$<18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}cѡ5xO 
C%C?r>IAAI:4:Aq<W[\"m.JY#:u\>lQ^x< 
HN$HN@q>!{<!/
X,u],[]?n;3Zx$
yrl-CO!yrl-CO@q<iBAAiB,EAAC,oBAAoB,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,gBAAgB)pituna pyterupé\",\"iandé-ara-pyturepé\",\"kuêma ramẽ\",\"karuka ramẽ\",\"pituna ramẽ\",\"pitunaeté ramẽ\"],u,u],u:;9:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}bߺHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-PS.js.mapc-x >	middernacht", "’s ochtends", "’s middags", "’s avonds", "’s nachts"], u, u], [["middernacht", "ochtend", "middag", "avond", "nacht"], u, u], ["00:00""#(6`nl-SR.js.mapl>糄xC{"version":3,"file":"ar-PS.js","sourceRoot":"","sources":["ar-PS.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}&@Qx	pt-CV!pt-CV@qYAAY,EAAC,UAAU,E

ECAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcYAAY,EAAC,UAAU,E

CAAC,E
1<OOmmeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],u,u],[\"00:00\",	\"12:00\"%9:00\"],[\"196:00\"]]];\n"]}*)Hx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ل"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-SA.js.map<	x;{"version":3,"file":"ar-SA.js","sourceRoot":"","sources":["ar-SA.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ل\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}oHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-SO.js.mapc(xC{"version":3,"file":"ar-SO.js","sourceRoot":"","sources":["ar-SO.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}>Hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-SS.js.mapcHx >	middernacht", "’s ochtends", "’s middags", "’s avonds", "’s nachts"], u, u], [["middernacht", "ochtend", "middag", "avond", "nacht"], u, u], ["00:00""#(6`nl-CW.js.maplU>Px. ", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:1:00"], ["21'en-SS.js.mape\x '	AW.js.map/Z]x 	BW.js.map2w}x 	GU.js.map2x 	MS.js.map2=x 	MT.js.map2]x del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-PR.js.mapW+DWxeia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noiteZ", "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada
> 9:00"], ["19:00", "24:00"], ["00h'pt-CV.js.map06TxC{"version":3,"file":"ar-SS.js","sourceRoot":"","sources":["ar-SS.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}޶FHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-SY.js.mapcxxC{"version":3,"file":"ar-SY.js","sourceRoot":"","sources":["ar-SY.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}?RHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-TN.js.mapc)x !	del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"*, "tarde", "noche"], u, u], ["12:00", ["00/20:00"], ["20:00", "24`es-CR.js.mapBx/	meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noite", "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], u, u], ["00:00", "12:00", ["06:09:00"], ["19/6`pt-GQ.js.map8ZY+x -	GQ.js.map0lxC{"version":3,"file":"ar-TN.js","sourceRoot":"","sources":["ar-TN.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]} >Qx	pt-GQ!pt-GQ@qYAAY,EAAC,UAAU,E

ECAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcYAAY,EAAC,UAAU,E

CAAC,E
1<OOmmeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],u,u],[\"00:00\",	\"12:00\"%9:00\"],[\"196:00\"]]];\n"]}&'}xS	es-CR!es-CR@q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)CAAC,UAAU,EAAC,WAAW,EAAC,QAAQ,E"#del mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"ma+ana\",\"tarde\",\"noche\"],u,u],[\"12:00\"$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}Xhbx B%B?0jx GQ$GQ@<$$x ko-KP!ko-KP@q@IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG)
gx?
Oj자정\",\"정오\",\"새벽\",\"오전\",\"오후\",\"저녁\",\"밤\"],u,u],u,[\"00:00\",\"12:00\",[\"034<18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"03:00\"]]];\n"]}^!/x
en-MO!en-MO@{GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,1CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAASA
[3xOmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\"Q6:00\"]]];\n"]}>"Tx(
es-AR!es-AR@qXcAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa,CAAC,EAAC,CAAC,UAAU,EAAC,WAAW,EAAC,QAAQ,Eo
CAAC,IAAI,EAAC,WAAW,EAAC,QAAQ,Eo
UAAU,EAAC,WAAW,EAAC,QAAQ,Eo
[
8sOdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],[\"mediodía\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],u],[[\"m.\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],[\"mediodía\",\"madrugada\",\"mañana\",\"tar#de\",\"noche\"],u],[\"12:00\",[\"004&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}'apx
zh-Hant-MO!
zh-Hant-MO@<8oO午夜\",\"早上\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"],u,u],u,[\"00:00\",[\"05:00\",\"08:00\"],[\"08:00\",Q3:00\"],[\"13:00\",\"19:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}(Yvx 

I%I?+fx 

PN$PN@6-8x 

UM$UM@6w Zx

it-SM!it-SM@q,YAAY,EAAC,aAAa,EAAC,YAAY,EAAC,eAAe,EAAC,SAAS/EAAC,CAAC,YAAY,EAAC,aAAa,EAAC,YAAY,EAAC,gBAAgB,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,YAAY,EAAC,aAAa,EAAC,SAAS,EAAC,YAAY,	EAAC,MAAM
ezzanotte\",\"mezzogiorno\",\"di mattina\",\"di pomeriggio\",\"di sera\",\"di notte\"],u,[\"mezzanotte\",\"mezzogiorno\",\"di mattina\",\"del pomeriggio\",\"di sera\",\"di notte\"]],[[\"mezzanotte\",\"mezzogiorno\",\"mattina\",\"pomeriggio\",\"sera\",\"notteX%4:00\"],[\"00:00\",\"06:00\"]]];\n"]}Epx1


sr-Latn-XK!
sr-Latn-XK@q
EAAC,SAAS,EAAC,MAAM,EAAC,KAAK
	EAAC,MAAM8EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,C
EAAC,SAAS,EAAC,MAAM,EAAC,KAAKponoć\",\"podne\",\"jutro\",\"po pod.\",\"veče\",\"noć\"],[\"ponoć\",\"podne\",\"jutro\",\"po pod.\",\"uveče\",\"noću\"],[\"ponoć\",\"podne\",\"ujutro\",\"po podne\",\"uveče\",\"noću\"]],[[\"ponoć\",\"podne\",\"jutro\",\"popodne\",\"veče\",\"noć}](]xd
Cyrl'CyrlGпоноћ\",\"подне\",\"јутро\",\"по под.\",\"вече\",\"ноћ\"],[\"поноћ\",\"подне\",\"јутр\",\"по под.\",\"увече\",\"ноћу\"],[\"поноћ\",\"подне\",\"ујутро\",\"по подне\",\"увее\",\"ноћу\"]],[[\"поноћ\",\"подне\",\"јутро\",\"поподне\",\"вече\",\"ноћ\"],u,u],[\"00:00\"j@x	p%pFuYAAY,EAAC,UAAU,E
OEAAC,WAAW,CAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcCAAC,YAAY,EAAC,UAAU,E
	EAAC,WAAW).
3xOmeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],u,u],[\"00:00\",\"12:00\",[\"06,6:00\"]]];\n"]}͓xF 
s*sGΑ7
n.V[\"午夜\",\"清晨G:],2U2JHxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar-YE.js.mapcxC{"version":3,"file":"ar-YE.js","sourceRoot":"","sources":["ar-YE.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}]R6Hxx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"], ["في الصباح", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "في المساء", "ليلاً"]], [["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "ص", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"], ["فجرًا", "صباحًا", "ظهرًا", "بعد الظهر", "مساءً", "منتصف الليل", "ليلاً"]], [["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"], ["01:00", "03:00"]]];
//# sourceMappingURL=ar.js.map6x u	`자정", "정오", "새벽", "오전", "오후", "저녁", "밤"], u, u], u, ["00:00", "12:00", 4#1:00"], ["2V(	ko.js.mapC912x k.js.mapDw#x 3	rm.js.map4/x={"version":3,"file":"ar.js","sourceRoot":"","sources":["ar.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"],[\"في الصباح\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"في المساء\",\"ليلاً\"]],[[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"ص\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"],[\"فجرًا\",\"صباحًا\",\"ظهرًا\",\"بعد الظهر\",\"مساءً\",\"منتصف الليل\",\"ليلاً\"]],[[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"01:00\"],[\"01:00\",\"03:00\"]]];\n"]}8Kxko!ko:qGIAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EEAACe자정\",\"정오\",\"새벽\",\"오전\",\"오후\",\"저녁\",\"밤\"],u,u],u,[\"00:00\",\"12:00\",:;8:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"03:00\"]]];\n"]}`Xlx& kok!kok:bEAAEpB];\n"]}5x ln!ln<EVx rm!rm<FVx</**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [];
//# sourceMappingURL=as.js.mapd8x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ky.", "kp.", "aamulla", "ap.", "ip.", "illalla", "yöllä"], ["keskiyöllä", "keskip.", "aamulla", "aamup.", "iltap.", "illalla", "yöllä"], ["keskiyöllä", "keskipäivällä", "aamulla", "aamupäivällä", "iltapäivällä", "illalla", "yöllä"]], [["ky.", "kp.", "aamu", "ap.", "ip.", "ilta", "yö"], ["keskiyö", "keskip.", "aamu", "aamup.", "iltap.", "ilta", "yö"], ["keskiyö", "keskipäivä", "aamu", "aamupäivä", "iltapäivä", "ilta", "yö"]], ["00:00", "12:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "23:00"], ["23:00", "05:00"]]];
//# sourceMappingURL=fi.js.mapTOx _
lrc.js.mapL%x 3
asa.js.map:(Ex 3
ckb.js.map9ex 3
dje.js.map:x 3
dsb.js.map:N&x 3
dua.js.map:XGx 3	ff.js.map3gx 3
hsb.js.map:v!x 3	ig.js.map3(x 3
jmc.js.map:\Ix 3
kde.js.map:%jx 3ks-Deva.js.mapUdwx 3
ksb.js.map:$0x 4	ag.js.map3Px 4g.js.map-Iox 3
mfe.js.map:Kx 3	mg.js.map30x 3
mua.js.map:'Qx 3	nd.js.map3qx 3	sc.js.map3x 3sd-Deva.js.mapUp6x 3	sd.js.map3Vx 3	se.js.map3vx 3
wae.js.map:!xi{"version":3,"file":"ne.js","sourceRoot":"","sources":["ne.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,WAAW,EAAC,SAAS,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,eAAe,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,MAAM,EAAC,gBAAgB,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ne\",[[\"पूर्वाह्न\",\"अपराह्न\"],u,u],u,[[\"आ\",\"सो\",\"म\",\"बु\",\"बि\",\"शु\",\"श\"],[\"आइत\",\"सोम\",\"मङ्गल\",\"बुध\",\"बिहि\",\"शुक्र\",\"शनि\"],[\"आइतबार\",\"सोमबार\",\"मङ्गलबार\",\"बुधबार\",\"बिहिबार\",\"शुक्रबार\",\"शनिबार\"],[\"आइत\",\"सोम\",\"मङ्गल\",\"बुध\",\"बिहि\",\"शुक्र\",\"शनि\"]],u,[[\"जन\",\"फेब\",\"मार्च\",\"अप्र\",\"मे\",\"जुन\",\"जुल\",\"अग\",\"सेप\",\"अक्टो\",\"नोभे\",\"डिसे\"],[\"जनवरी\",\"फेब्रुअरी\",\"मार्च\",\"अप्रिल\",\"मे\",\"जुन\",\"जुलाई\",\"अगस्ट\",\"सेप्टेम्बर\",\"अक्टोबर\",\"नोभेम्बर\",\"डिसेम्बर\"],u],[[\"जन\",\"फेेब\",\"मार्च\",\"अप्र\",\"मे\",\"जुन\",\"जुल\",\"अग\",\"सेप\",\"अक्टो\",\"नोभे\",\"डिसे\"],[\"जनवरी\",\"फेब्रुअरी\",\"मार्च\",\"अप्रिल\",\"मे\",\"जुन\",\"जुलाई\",\"अगस्ट\",\"सेप्टेम्बर\",\"अक्टोबर\",\"नोभेम्बर\",\"डिसेम्बर\"],u],[[\"ईसा पूर्व\",\"सन्\"],u,u],0,[6,0],[\"yy/M/d\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤ #,##,##0.00\",\"#E0\"],\"NPR\",\"नेरू\",\"नेपाली रूपैयाँ\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"NPR\":[\"नेरू\",\"रू\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}$x0#JeAAe,CAAC,CAAC,CAAC,SAAS,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ=l

gOAAO\OAAO\OAAO\OAAO\OAAO,CAAC,CAAC7d	[[\"मध्यरात\",\"मध्यान्ह\",\"बिहान\",\"अपरान्ह\",\"साँझ\",\"बलुकी\",\"रात\"],u,u],u,[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"19:00\"],[\1"19:00\",\"22:00\"],[\"22:00\",\"04:00\"]]];\n"]}֬^x& asa!asa:bEAAEB];\n"]}xbg!bg:"SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,YAAY=2полунощ\",\"сутринта\",\"на обяд\",\"следобед\",\"вечерта\",\"през нощта\"],u,u],uS,[\"00:00\",[\"04:00\",\"11:00\"],[\"11:00\",\"14:00\"],[\"14:00\",\"18:00\"],[\"18.r77x

ca-ES-valencia!ca-ES-valencia:q,UAAU,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO$UAAU,EAAC,UAAUOAAO$CAAC,UAAU,EAAC,UAAUOAAO=
2KOmitjanit\",\"mat.\",\"matí\",\"md\",\"tarda\",\"vespre\",\"nit\"],[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u],[[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u,u],[\"00:00\",[\"00:00\",\"06:00\"],[\"063:00\"],[\"13%1:00\"],[\"21:00\",\"24:00\"]]];\n"]}VK]x ckb!ckb<T!Ox ff!ff<E#x nd!nd<E~Ex sc!sc<EtxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["zu", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "B", "T", "S", "H", "M"], ["Son", "Mso", "Bil", "Tha", "Sin", "Hla", "Mgq"], ["ISonto", "UMsombuluko", "ULwesibili", "ULwesithathu", "ULwesine", "ULwesihlanu", "UMgqibelo"], ["Son", "Mso", "Bil", "Tha", "Sin", "Hla", "Mgq"]], u, [["J", "F", "M", "E", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mas", "Eph", "Mey", "Jun", "Jul", "Aga", "Sep", "Okt", "Nov", "Dis"], ["Januwari", "Februwari", "Mashi", "Ephreli", "Meyi", "Juni", "Julayi", "Agasti", "Septhemba", "Okthoba", "Novemba", "Disemba"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mas", "Eph", "Mey", "Jun", "Jul", "Aga", "Sep", "Okt", "Nov", "Dis"], ["Januwari", "Februwari", "Mashi", "Ephreli", "Meyi", "Juni", "Julayi", "Agasti", "Septhemba", "Okthoba", "Novemba", "Disemba"]], [["BC", "AD"], u, u], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ZAR", "R", "i-South African Rand", { "BYN": [u, "P."], "DKK": [u, "Kr"], "HRK": [u, "Kn"], "ISK": [u, "Kr"], "JPY": ["JP¥", "¥"], "NOK": [u, "Kr"], "PHP": [u, "₱"], "PLN": [u, "Zł"], "SEK": [u, "Kr"], "THB": ["฿"], "TWD": ["NT$"], "ZAR": ["R"] }, "ltr", plural];
//# sourceMappingURL=zu.js.mapNx& export default [ 	rw.js.map5x 3
ast.js.map:+Ux 3	dz.js.map4tx 3
nus.js.map;:95xR/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ҝеҹәјары", "ҝ", "сүбһ", "сәһәр", "ҝүндүз", "ахшамүстү", "ахшам", "ҝеҹә"], ["ҝеҹәјары", "ҝүнорта", "сүбһ", "сәһәр", "ҝүндүз", "ахшамүстү", "ахшам", "ҝеҹә"], u], [["ҝеҹәјары", "ҝүнорта", "сүбһ", "сәһәр", "ҝүндүз", "ахшамүстү", "ахшам", "ҝеҹә"], u, u], ["00:00", "12:00", ["04:00", "06:00"], ["06:00", "12:00"], ["12:00", "17:00"], ["17:00", "19:00"], ["19:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=az-Cyrl.js.map#
\_x %del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"*, "tarde", "noche"], u, u], ["12:00", ["00/20:00"], ["20:00", "2%	es.js.map>.AHxponoć", "podne", "ujutro", "popodne", "navečer", "noću"], u, ["ponoć", "podne", "ujutro", "poslije podne", "navečer", "noCu"]], [["ponoć", "podne", "ujutro", "popodne", "navečer", "noću) 8:00"], ["18:00", "21:00"], ["21'	hr.js.mapSYx ,
naq.js.mapP~x ,
rwk.js.mapQ
#x [pituna pyterupé", "iandé-ara-pyturepé", "kuêma ramẽ", "karuka ramẽ", "pituna ramẽ", "pitunaeté ramẽ"], u, u], u, [(6&
yrl.js.map?Xx 3
jgo.js.map:$yx 3
kln.js.map:)x 3
mgo.js.map:';x 3
sbp.js.map:)\x 3	so.js.map4H|x 3
teo.js.map:,x 3	to.js.map4Qž.x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["gecəyarı", "g", "sübh", "səhər", "gündüz", "axşamüstü", "axşam", "gecə"], ["gecəyarı", "günorta", "sübh", "səhər", "gündüz", "axşamüstü", "axşam", "gecə"], u], [["gecəyarı", "günorta", "sübh", "səhər", "gündüz", "axşamüstü", "axşam", "gecə"], u, u], ["00:00", "12:00", ["04:00", "06:00"], ["06:00", "12:00"], ["12:00", "17:00"], ["17:00", "19:00"], ["19:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=az-Latn.js.mapX\x8{"version":3,"file":"gu.js","sourceRoot":"","sources":["gu.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,CAAC,YAAY,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,YAAY,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,YAAY,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"મ.રાત્રિ\",\"સવારે\",\"બપોરે\",\"સાંજે\",\"રાત્રે\"],[\"મધ્યરાત્રિ\",\"સવારે\",\"બપોરે\",\"સાંજે\",\"રાત્રે\"],u],[[\"મધ્યરાત્રિ\",\"સવારે\",\"બપોરે\",\"સાંજે\",\"રાત્રે\"],u,[\"મધ્યરાત્રિ\",\"સવાર\",\"બપોર\",\"સાંજ\",\"રાત્રિ\"]],[\"00:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"20:00\"],[\"20:00\",\"04:00\"]]];\n"]}A9Txchr!chr:qGAAG,EAAC,KAAKIAAI,EAAC,KAAK#IAAI,EAAC,KAAK(K;OᎢ\",\"ᏌᎾᎴ\",\"ᏒᎯᏱᎢᏗᏢ\"],[\"ᎢᎦ\",\"ᏌᎾᎴ\",\"ᏒᎯᏱᎢᏗᏢ\"],u],[[\"ᎢᎦ\",\"ᏌᎾᎴ\",\"*ᎯᏱᎢᏗᏢ\"],u,u],[\"12:00\",[\"00m24:00\"]]];\n"]}pqu"~x 
it!it:q6YAAY,EAAC,aAAa,EAAC,YAAY,EAAC,eAAe,EAAC,SAAS,EAAC,UAAUc$.aAAa,EAAC,YAAY,EAAC,gBAAgB,EAAC,SAAS,EAAC,UAAU$"aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,MAAM(
mezzanotte\",\"mezzogiorno\",\"di mattina\",\"di pomeriggio\",\"di sera\",\"di notte\"],u,[\"mezzanotte\",\"mezzogiorno\",\"di mattina\",\"del pomeriggio\",\"di sera\",\"di notte\"]],[[\"mezzanotte\",\"mezzogiorno\",\"mattina\",\"pomeriggio\",\"sera\",\"(notte\"],u,u],[\"00:00\",\"12:00\",[\"06m;8:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}!-x
sr!sr:q	EAAC,UAAU,EAAC,OAAO,EAAC,MAAM
EAAC,UAAU,EAAC,OAAO,EAAC,MAAM$	SAAS,EAAC,MAAM,EAAC,KAAK,CAAC,E
поноћ\",\"подне\",\"ујутру\",\"по подне\",\"увече\",\"ноћу\"],[\"поноћ\",\"подне\",\"ујутро\",\"по подне\",\"увече\",\"ноћу\"],u],[[\"поноћ\",\"подне\",\"јутро\",\"попод>е\",\"вече\",\"ноћ\"],u,u],[\"00:00\",\"12:00\",[\"06m;8:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}{(\xp
az-Latn!az-Latn:qUAAU,EAAC,GAAGoEEAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,SAASo'EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,MAAMCAAC,UAAU,EAAC,SAASo'EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,MAAM<3Ogecəyarı\",\"g\",\"sübh\",\"səhər\",\"gündüz\",\"axşamüstü\",\"axşam\",\"gecə\"],[\"gecəyarı\",\"günorta\",\"sübh\",\"səhər\",\"gündüz\",\"axşamüstü\",\"axşam\",\"gecə\"],u],[[\"gecəyarı\",\"günorta\",\"sübh\",\"səhər\",\"g-ündüz\",\"axşamüstü\",\"axşam\",\"gecə"4:00\",\"06:00\"]%Q7:00\"],[\"17:00\",\"19:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}Lzxy
	sq!sq:{YAAY,EAAC,aAAaYAAY,EAAC,SAASCAAC,SAAS,EAAC,SAASEAAC,SAAS,EAAC,SAAS,EAAC,MAAM3Oe mesnatës\",\"e mesditës\",\"e mëngjesit\",\"e paradites\",\"e pasdites\",\"e mbrëmjes\",\"e natës\"],u,u],[[\"mesnatë\"H,\"mesditë\",\"mëngjes\",\"paradite\",\"pasdite\",\"mbrëmje\",\"natë"4:00\",\"09:00\"],[\"09K4:00\"]]];\n"]}=,|x 
uz-Latn!uz-Latn:q6WAAW,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAC,SAASTyarim tun\",\"tush payti\",\"ertalab\",\"kunduzi\",\"kechqurun\",\"kechasi\"],u,u],u$1:00\"],[\"11%2:00\"],[\"22:00\",\"06:00\"]]];\n"]}K)xe	sr&sr?v	
UAAU$
UAAU$i	OKAAKOponoć\",\"podne\",\"ujutru\",\"po podne\",\"uveče\",\"noću\"],[\"ponoć\",\"podne\",\"ujutro\",\"po podne\",\"uveče\",\"noFu\"],u],[[\"ponoć\",\"podne\",\"jutro\",\"popodne\",\"veče\",\"noć-"e ;8:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}[gv{x$ su&su?gEAAEB];\n"]}
'x ^	bs&bs?cAAc,EAAC,SAAS,EAAC,SAAS)
Qo\",\"poslijepodne\",\"navečer\",\"po noći\"],u,u],u,[\"00:00\",\"12:00\",[\"04rK4:00\"]]];\n"]}^2cx hi'hi?G.x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["gecəyarı", "g", "sübh", "səhər", "gündüz", "axşamüstü", "axşam", "gecə"], ["gecəyarı", "günorta", "sübh", "səhər", "gündüz", "axşamüstü", "axşam", "gecə"], u], [["gecəyarı", "günorta", "sübh", "səhər", "gündüz", "axşamüstü", "axşam", "gecə"], u, u], ["00:00", "12:00", ["04:00", "06:00"], ["06:00", "12:00"], ["12:00", "17:00"], ["17:00", "19:00"], ["19:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=az.js.map6kxD{"version":3,"file":"sv.js","sourceRoot":"","sources":["sv.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,WAAW,CAAC,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,WAAW,CAAC,EAAC,CAAC,SAAS,EAAC,aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"midn.\",\"på morg.\",\"på förm.\",\"på efterm.\",\"på kvällen\",\"på natten\"],[\"midnatt\",\"på morg.\",\"på förm.\",\"på efterm.\",\"på kvällen\",\"på natten\"],[\"midnatt\",\"på morgonen\",\"på förmiddagen\",\"på eftermiddagen\",\"på kvällen\",\"på natten\"]],[[\"midn.\",\"morg.\",\"förm.\",\"efterm.\",\"kväll\",\"natt\"],[\"midnatt\",\"morgon\",\"förm.\",\"efterm.\",\"kväll\",\"natt\"],[\"midnatt\",\"morgon\",\"förmiddag\",\"eftermiddag\",\"kväll\",\"natt\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}Si%HxPaz!az:q"UAAU,EAAC,GAAG,EAAC,MAAM,EAAC,OAAO"UAAU,EAAC,SAAS,EAAC,MAAM,EAAC,OAAOw"UAAU,EAAC,SAAS,EAAC,MAAM,EAAC,OAAOEAACqgmgecəyarı\",\"g\",\"sübh\",\"səhər\",\"gündüz\",\"axşamüstü\",\"axşam\",\"gecə\"],[\"gecəyarı\",\"günorta\",\"sübh\",\"səhər\",\"gündüz\",\"axşamüstü\",\"axşam\",\"gecə\"],u],[[\"gecəyarı\",\"günorta\",\"sübh\",\"səhər\",\"gfündüz\",\"axşamüstü\",\"axşam\",\"gecə\"],u,u],[\"00:00\",\"12:00\",[\"04:00\",\"06:00\"],[\"06a#7:00\"],[\"17:00\",\"19:00\"],[\"194:00\"]]];\n"]}='x& twq!twq:bEAAEB];\n"]}5x bas!bas<To[Xx dav!dav<Te{x dyo!dyo<Vx ebu!ebu<TgBx fur!fur<V.fx gv!gv<F x haw!haw<U1o,x jv!jv<FVNx kh"kh;Epx ks!ks<F8x ku!ku<FX4x kw!kw<FxVx lkt!lkt<Vzx lu!lu<Fjx luo!luo<Vy@x mas!mas<UVqdx mer!mer<Uwx mt!mt<Fl*x mzn!mzn<VNx nds!nds<Uyrx or!or<Fpx os!os<F6x ps!ps<FXx qu!qu<Fzx sat!sat<Ux ses!ses<V Bx su!su<Fdx t"t<8x zm"zm<G&x vun!vun<W:Jx yav!yav<VRx//**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["khq", [["Adduha", "Aluula"], u, u], u, [["H", "T", "T", "L", "L", "L", "S"], ["Alh", "Ati", "Ata", "Ala", "Alm", "Alj", "Ass"], ["Alhadi", "Atini", "Atalata", "Alarba", "Alhamiisa", "Aljuma", "Assabdu"], ["Alh", "Ati", "Ata", "Ala", "Alm", "Alj", "Ass"]], u, [["Ž", "F", "M", "A", "M", "Ž", "Ž", "U", "S", "O", "N", "D"], ["Žan", "Fee", "Mar", "Awi", "Me", "Žuw", "Žuy", "Ut", "Sek", "Okt", "Noo", "Dee"], ["Žanwiye", "Feewiriye", "Marsi", "Awiril", "Me", "Žuweŋ", "Žuyye", "Ut", "Sektanbur", "Oktoobur", "Noowanbur", "Deesanbur"]], u, [["IJ", "IZ"], u, ["Isaa jine", "Isaa jamanoo"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "XOF", "F CFA", "CFA Fraŋ (BCEAO)", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=khq.js.map{3t<x 
export default ["	.+x 3
bas.js.map: Kx 4s.js.map-Uix 3	or.js.map4<ðfx`{"version":3,"file":"nb.js","sourceRoot":"","sources":["nb.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"mn.\",\"mg.\",\"fm.\",\"em.\",\"kv.\",\"nt.\"],[\"midn.\",\"morg.\",\"form.\",\"etterm.\",\"kveld\",\"natt\"],[\"midnatt\",\"på morgenen\",\"på formiddagen\",\"på ettermiddagen\",\"på kvelden\",\"på natten\"]],[[\"mn.\",\"mg.\",\"fm.\",\"em.\",\"kv.\",\"nt.\"],[\"midn.\",\"morg.\",\"form.\",\"etterm.\",\"kveld\",\"natt\"],[\"midnatt\",\"morgen\",\"formiddag\",\"ettermiddag\",\"kveld\",\"natt\"]],[\"00:00\",[\"06:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}mx$ be!be:bEAAEB];\n"]}Ϩ
z+ xFka!ka:q,UAAU,EAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM@EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,OAAOqMAAM,EAAC,YAAY,EAAC,QAAQEAACqlsOშუაღამეს\",\"შუადღ.\",\"დილ.\",\"ნაშუადღ.\",\"საღ.\",\"ღამ.\"],u,[\"უაღამეს\",\"შუადღეს\",\"დილით\",\"ნაშუადღევს\",\"საღამოს\",\"ღამით\"]],[[\"შუაღამე\",\"შუადღე\",\"დილა\",\"ნაშუადღევL\",\"საღამო\",\"ღამე\"],u,u],[\"00:00\",\"12:00\",[\"055%1:00\"],[\"21:00\",\"05:00\"]]];\n"]}Tc6hx" l"l9cEAAEB];\n"]}	"x/
pa!pa:qUAAUQAAQEAACqUAAUQAAQEAAC,CAAC,UAAUMAAM,EAAC,KAAKq
lsOਅੱਧੀ ਰਾਤ\",\"ਸਵੇਰੇ\",\"ਦੁਪਹਿਰੇ\",\"ਸ਼ਾਮੀਂ\",\"ਰਾਤੀਂ\"],u,u],[[\"ਅੱਧੀ ਰਾਤ\",\"ਸਵੇਰੇ\",\"ਦੁਪਹਿਰੇ\",\"ਸ਼ਾਮੀਂ\",\"ਰਾਤੀਂ\"],u,[\"ਅੱਧ ਰਾਤ\",\"ਸਵੇਰੇ\",\"ਦੁਪਹਿਰੇ\",\"ਸ਼ਾਮ\",\"ਰਾਤ\"]],[\"00:00\",[\"04:00\",\"12:00\"],;6:00\"],[\"16:00\",\"21:00\"],[\"21:00\",\"04:00\"]]];\n"]}C
jx kab!kab:SFx kea!kea:TLx_	d"d9r:QAAQ,EAAC,aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY,EAAC,WAAW);CAAC,QAAQ,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,KAAK3s1Omidnat\",\"om morgenen\",\"om formiddagen\",\"om eftermiddagen\",\"om aftenen\",\"om natten\"],u,u],[[\"midnat\",\"morgen\",\"fYormiddag\",\"eftermiddag\",\"aften\",\"nat\"],u,u],[\"00:00\",[\"05:00\",\"10:00\"],[\"10I5%4:00\"],[\"00:00\",\"05:00\"]]];\n"]}k{o.x2
en-NZ!en-NZ:q<IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU2MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUMAAM,EAAC,SAAS,EAAC,WAAWmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"( 6IK6:00\"]]];\n"]}4o
x2
en-SX!en-SX:q<IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU2MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUMAAM,EAAC,SAAS,EAAC,WAAWmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"( 6IK6:00\"]]];\n"]}?!ufx2
en-TZ!en-TZ:q<IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU2MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUMAAM,EAAC,SAAS,EAAC,WAAWmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"( 6IK6:00\"]]];\n"]}I{BxD	es-PY!es-PY:q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)CAAC,IAAI,EAAC,WAAW,EAAC,QAAQ,E"
WAAW,EAAC,QAAQ,E"del mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"m.\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],[\"mediodía\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],u],[\"12:00\",[\"00:00\",\"06:00\"],[\"06:00L&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}>x_es-UY!es-UY:q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)WAAW,EAAC,QAAQ,E"#del mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"maGana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"],[\"06I&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}ծk{zx9
fr-SY!fr-SY:qMAAM,EAAC,OAAO.iBAAiB,EAAC,SAAS,EAAC,UAAU1MAAM,EAAC,OAAO.OAAO,EAAC,YAAY7minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]-4I5%4:00\"],[\"00:00\",\"04:00\"]]];\n"]}x8Ox" i"i9cEAAE:B];\n"]}I	 xj"j9r@KAAK,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI)x1OL真夜中\",\"正午\",\"朝\",\"昼\",\"夕方\",\"夜\",\"夜中\"],u,u],u.4IQ6:00\"],[\"16:00\",\"19:00\"],[\"19:00\",\"23:00\"],[\"23:00\",\"04:00\"]]];\n"]}-YV,x?ru-KZ!ru-KZ:qMAAM,EAAC,KAAK$EAAC,MAAM,EAAC,KAAK1CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,KAAK2MAAM,EAAC,MAAM.6SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM1полн.\",\"полд.\",\"утра\",\"дня\",\"веч.\",\"ночи\"],[\"полн.\",\"полд.\",\"утра\",\"дня\",\"вечера\",\"ночи\"],[\"полночь\",\"полдень\",\"утра\",\"дня\",\"вечера\",\"ночи\"]],[[\"полн.\",\"полд.\",\"утро\",\"день\",\"веч.\",\"ночь\"],u,[\"полночь\",\"полдень\",\"3тро\",\"день\",\"вечер\",\"ночь\"]-4I5%2:00\"],[\"22:00\",\"04:00\"]]];\n"]}6 ?x 

ZW$ZW@7qax%
	pt-M"pt-M?rYAAY,EAAC,UAAU,E
OEAAC,WAAW,CAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcCAAC,YAAY,EAAC,UAAU,E
	EAAC,WAAWeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",j\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugadaB;9:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}-ix	nl-SX!nl-SX@q"aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,WAAW}3CAAC,aAAa,EAAC,SAAS,EAAC,QAAQ,E"#iddernacht\",\"’s ochtends\",\"’s middags\",\"’s avonds\",\"’s nachts\"],u,u],[[\"middernacht\",\"ochtend\",\"middag\",\"avond\",\"nachtp$8:00\"],[\"18.Zx 

KY$KY@67x 

MY$MY@6Yx 

RW$RW@6x 

S%S?+
xO/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['kn'] = ["kn",[["ಪೂ","ಅ"],["ಪೂರ್ವಾಹ್ನ","ಅಪರಾಹ್ನ"],u],[["ಪೂರ್ವಾಹ್ನ","ಅಪರಾಹ್ನ"],u,u],[["ಭಾ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],["ಭಾನು","ಸೋಮ","ಮಂಗಳ","ಬುಧ","ಗುರು","ಶುಕ್ರ","ಶನಿ"],["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],["ಭಾನು","ಸೋಮ","ಮಂಗಳ","ಬುಧ","ಗುರು","ಶುಕ್ರ","ಶನಿ"]],u,[["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"],["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ"],["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"]],[["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"],["ಜನ","ಫೆಬ್ರ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ"],["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"]],[["ಕ್ರಿ.ಪೂ","ಕ್ರಿ.ಶ"],u,["ಕ್ರಿಸ್ತ ಪೂರ್ವ","ಕ್ರಿಸ್ತ ಶಕ"]],0,[0,0],["d/M/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["hh:mm a","hh:mm:ss a","hh:mm:ss a z","hh:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"INR","₹","ಭಾರತೀಯ ರೂಪಾಯಿ",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"ಲೀ"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["ಮಧ್ಯರಾತ್ರಿ","ಬೆಳಗ್ಗೆ","ಮಧ್ಯಾಹ್ನ","ಸಂಜೆ","ರಾತ್ರಿ"],["ಮಧ್ಯ ರಾತ್ರಿ","ಬೆಳಗ್ಗೆ","ಮಧ್ಯಾಹ್ನ","ಸಂಜೆ","ರಾತ್ರಿ"],u],[["ಮಧ್ಯರಾತ್ರಿ","ಬೆಳಗ್ಗೆ","ಮಧ್ಯಾಹ್ನ","ಸಂಜೆ","ರಾತ್ರಿ"],u,u],["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    E>x(ˑ+#const u = undefined;
export default
% 
  "ಸಂಜೆ", 1 G# 
  "ಸಂಜೆ", 1 u], 
# 
  "ಸಂಜೆ", 1 u, u], ["00:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=kn.js.map\7x 	om.js.mapP(9$x 3
bem.js.map:Dx 3	eo.js.map3cx 3	fo.js.map3x 3
kam.js.map:8#x 3	tk.js.map4 mx!{"version":3,"file":"fil.js","sourceRoot":"","sources":["fil.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,YAAY,EAAC,kBAAkB,EAAC,OAAO,EAAC,eAAe,EAAC,UAAU,EAAC,SAAS,EAAC,MAAM,CAAC,EAAC,CAAC,YAAY,EAAC,kBAAkB,EAAC,YAAY,EAAC,eAAe,EAAC,UAAU,EAAC,UAAU,EAAC,MAAM,CAAC,EAAC,CAAC,YAAY,EAAC,kBAAkB,EAAC,YAAY,EAAC,eAAe,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC,YAAY,EAAC,kBAAkB,EAAC,OAAO,EAAC,eAAe,EAAC,UAAU,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,YAAY,EAAC,kBAAkB,EAAC,OAAO,EAAC,eAAe,EAAC,UAAU,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"hatinggabi\",\"tanghaling-tapat\",\"umaga\",\"madaling-araw\",\"sa hapon\",\"sa gabi\",\"gabi\"],[\"hatinggabi\",\"tanghaling-tapat\",\"nang umaga\",\"madaling-araw\",\"tanghali\",\"ng hapon\",\"gabi\"],[\"hatinggabi\",\"tanghaling-tapat\",\"nang umaga\",\"madaling-araw\",\"tanghali\",\"ng hapon\",\"ng gabi\"]],[[\"hatinggabi\",\"tanghaling-tapat\",\"umaga\",\"madaling-araw\",\"tanghali\",\"gabi\",\"gabi\"],[\"hatinggabi\",\"tanghaling-tapat\",\"umaga\",\"madaling-araw\",\"tanghali\",\"hapon\",\"gabi\"],u],[\"00:00\",\"12:00\",[\"00:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"24:00\"]]];\n"]}gkx& bem!bem<bEAAEB];\n"]}|b x" o"o<bEAAEB];\n"]}	$QxB
kn!kn<{SAAS"QAAQ,CAAC,EAAC,CAAC,aAAa,EAAC,SAASQAAQASAASQAAQ,CAAC,EAACA)tsOಮಧ್ಯರಾತ್ರಿ\",\"ಬೆಳಗ್ಗೆ\",\"ಮಧ್ಯಾಹ್ನ\",\"ಸಂಜೆ\",\"ರಾತ್ರಿ\"],[\"ಮಧ್ಯ ರಾತ್ರಿ\",\"ಬೆಳಗ್ಗೆ\",\"ಮಧ್ಯಾಹ್ನ\",\"ಸಂಜೆ\",\"ರಾತ್ಿ\"],u],[[\"ಮಧ್ಯರಾತ್ರಿ\",\"ಬೆಳಗ್ಗೆ\",\"ಮಧ್ಯಾಹ್ನ\",\"ಸಂಜೆ\",\"ರ ತ್ರಿ\"],u,u],[\"00:00\"~%%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}."x$ om!om<bEAAEB];\n"]}Y
#Ux?
uk!uk<qQAAQ,EAAC,GAAG,EAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,WAAW,EAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,CADECAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAACAOпівніч\",\"п\",\"ранку\",\"дня\",\"вечора\",\"ночі\"],[\"опівночі\",\"пополудні\",\"анку\",\"дня\",\"вечора\",\"ночі\"],u],[[\"північ\",\"полудень\",\"ранок\",\"день\",\"вечір\",\"ніч\"],uP4:00\",\"12:00\"],[\"12&,[\"00:00\",\"04:00\"]]];\n"]}d8x eo!eo<EZx ka"ka;E8|x tk!tk<FZ(xp/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "am Morge", "zmittag", "am Namittag", "zaabig", "znacht"], u, u], [["Mitternacht", "am Morge", "zmittag", "am Namittag", "zaabig", "znacht"], u, ["Mitternacht", "Morge", "Mittag", "Namittag", "Aabig", "Nacht"]], ["00:00", ["05:00", "12:00"], ["12:00", "14:00"], ["14:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=gsw.js.map4x m
bez.js.mapN"x*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["полунощ", "сутринта", "на обяд", "следобед", "вечерта", "през нощта"], u, u], u, ["00:00", ["04:00", "11:00"], ["11:00", "14:00"], ["14:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=bg.js.map6xg/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["මැ", "ම", "පා", "උ", "ද", "හ", "රෑ", "මැ"], ["මැදියම", "මධ්‍යාහ්නය", "පාන්දර", "උදේ", "දවල්", "හවස", "රෑ", "මැදියමට පසු"], u], [["මැදියම", "මධ්‍යාහ්නය", "පාන්දර", "උදේ", "දවල්", "හවස", "රෑ", "මැදියමට පසු"], u, u], ["00:00", "12:00", ["01:00", "06:00"], ["06:00", "12:00"], ["12:00", "14:00"], ["14:00", "18:00"], ["18:00", "24:00"], ["00:00", "01:00"]]];
//# sourceMappingURL=si.js.mapp5tx da noite", "da madrugada", "da mañá", "do mediodía", "da tarde", "da noite"], u, u], [["medianoite", "madrugada", "mañá", "mediodía", "tarde", "noite["000)3:00"], ["13:00", "21:00"], ["21:00", "24@	gl.js.mapGxx 1
ksf.js.mapQ%%x 3	bm.js.map3Dx 3
nmg.js.map:&dx 3shi-Tfng.js.map^	x 3
zgh.js.map:-x({"version":3,"file":"mk.js","sourceRoot":"","sources":["mk.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,WAAW,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,WAAW,CAAC,EAAC,CAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"полн.\",\"напл.\",\"утро\",\"претпл.\",\"попл.\",\"веч.\",\"ноќе\"],[\"полноќ\",\"напладне\",\"наутро\",\"претпладне\",\"попладне\",\"навечер\",\"ноќе\"],[\"полноќ\",\"напладне\",\"наутро\",\"претпладне\",\"попладне\",\"навечер\",\"по полноќ\"]],[[\"полноќ\",\"пладне\",\"наутро\",\"претпл.\",\"попл.\",\"навечер\",\"по полноќ\"],[\"полноќ\",\"напладне\",\"наутро\",\"претпл.\",\"попл.\",\"навечер\",\"по полноќ\"],[\"на полноќ\",\"напладне\",\"наутро\",\"претпладне\",\"попладне\",\"навечер\",\"по полноќ\"]],[\"00:00\",\"12:00\",[\"04:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}7/6xsi!si:qJIAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI@YAAY,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,IAAI,EAAC,aAAaGYAAY,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,IAAI,EAAC,aAAa,CAAC,E?Oමැ\",\"ම\",\"පා\",\"උ\",\"ද\",\"හ\",\"රෑ\",\"මැ\"],[\"මැදියම\",\"මධ්‍යාහ්ය\",\"පාන්දර\",\"උදේ\",\"දවල්\",\"හවස\",\"රෑ\",\"මැදියමට පසු\"],u],[[\"මැදියම\",\"මධ්‍යාහ්නය\",\"පාන්දර\",\"උදේ\",\"දවල්\",\"හවස\",3\"රෑ\",\"මැදියමට පසු\"],u,u1:00\",\"06:00\"],[\"064:00\"],[\"1451:00\"]]];\n"]} VAx2yue!yue:qGIAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EEAAC?O午夜\",\"清晨\",\"朝早\",\"中午\",\"下晝\",\"夜晚\",\"凌晨\"],u,u],u,[\"00:00\",[\"05:00\",\"08:00\"],[\"08:00\",#3:00\"],[\"13:00\",\"19:00\"],[\"195:00\"]]];\n"]}"bLx{	gl!gl:q6UAAU,EAAC,cAAc,EAAC,SAAS,EAAC,aAAa,EAAC,UAAU,EAAC,UAAU)_$YAAY,EAAC,WAAW,EAAC,MAAM,EAAC,UAAU,EO
#Oda noite\",\"da madrugada\",\"da mañá\",\"do mediodía\",\"da tarde\",\"da noite\"],u,u],[[\"medianoite\",\"madrugada\",\"ma%á\",\"mediodía\",\"tarde\",\"noite[\"005;3:00\"],[\"13:00\",\"21:00\"],[\"21:00\",\"24:00\"]]];\n"]}u]Vx
kk!kk:qY
EAAC,gBAAgB,EO
YAAY,EEAAC,gBAAgB,EO
_cAAc,EAAC,KAAK,EAAC,KAAKOтүнгі\",\"түскі\",\"таңғы\",\"түстен кейінгі\",\"кешкі\",\"түнгі\"],[\"түн жарым\",\"түскі\",\"таңғы\",\"түстен кейінгі\",\"кешкі\",\"түнгі\"],u],[[\"түн жарымы\",\J"талтүс\",\"таң\",\"түстен кейін\",\"кеш\",\"түн" %1:00\"],[\"21:00\",\"06:00\"]]];\n"]}6Xx$ 
sf"sf:bEAAE>B];\n"]}
3x bm!bm<E6Tx zgh!zgh<V2x&/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ভোর", "সকাল", "দুপুর", "বিকাল", "সন্ধ্যা", "রাত্রি"], u, ["ভোর", "সকাল", "দুপুর", "বিকাল", "সন্ধ্যা", "রাত্রিতে"]], [["ভোর", "সকাল", "দুপুর", "বিকাল", "সন্ধ্যা", "রাত্রি"], u, u], [["04:00", "06:00"], ["06:00", "12:00"], ["12:00", "16:00"], ["16:00", "18:00"], ["18:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=bn-IN.js.mapUUq3x.mediodía", "día", "mañana", "tarde", "noche"], ["del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u], [["m.", "madrugada", "mañana", "tarde", "noche"], ["mediodía", "madrugada", "mañana", "tarde", "noche"], u], ["12:00", ["00/2es-DO.js.mapa`rpx ध्यरात", "मध्यान्ह", "बिहान", "अपरान्ह", "साँझ", "बेलुक5ी", "रात"], u, u], u, ["00:00", "12:00", ["040 9:00"], ["19:00", "22:00"], ["22'ne-IN.js.map
q?x% RT, u], [:z	HN.js.mapΛ2x#/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ভোর", "সকাল", "দুপুর", "বিকাল", "সন্ধ্যা", "রাত্রি"], u, ["ভোর", "সকাল", "দুপুর", "বিকাল", "সন্ধ্যা", "রাত্রিতে"]], [["ভোর", "সকাল", "দুপুর", "বিকাল", "সন্ধ্যা", "রাত্রি"], u, u], [["04:00", "06:00"], ["06:00", "12:00"], ["12:00", "16:00"], ["16:00", "18:00"], ["18:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=bn.js.mapT\x<{"version":3,"file":"vi.js","sourceRoot":"","sources":["vi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,SAAS,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"nửa đêm\",\"tr\",\"sáng\",\"chiều\",\"tối\",\"đêm\"],[\"nửa đêm\",\"TR\",\"sáng\",\"chiều\",\"tối\",\"đêm\"],u],[[\"nửa đêm\",\"trưa\",\"sáng\",\"chiều\",\"tối\",\"đêm\"],[\"nửa đêm\",\"TR\",\"sáng\",\"chiều\",\"tối\",\"đêm\"],[\"nửa đêm\",\"trưa\",\"sáng\",\"chiều\",\"tối\",\"đêm\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"04:00\"]]];\n"]}ư'Px|bn!bn:qKAAK1EAAC,SAAS,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,KAAKEAAC,SAAS,EAAC,UAAU1KAAKEAAC,SAAS,EAAC,QAAQ,CAAC,EAAC'$YPOভোর\",\"সকাল\",\"দুপুর\",\"বিকাল\",\"সন্ধ্যা\",\"রাত্রি\"],u,[\"ভোর\",\"সকাল\",\"দুপুর\",\"বিকাল\",\"সন্ধ্যা\",\"রাত্রিতে\"]],[[\"ভোর\",\"সকাল\",\"দুপুর\",\"বিকাল\",\"সন্ধ্যা\",\"রাত্রি\"],u,u],[[\"04:00\",\"06:00\"],[\"06i6:00\"],[\"16%0:00\"],[\"20:00\",\"04:00\"]]];\n"]}	',x:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["آدھی رات", "صبح", "دوپہر", "سہ پہر", "شام", "رات"], u, ["آدھی رات", "صبح میں", "دوپہر میں", "سہ پہر", "شام میں", "رات میں"]], [["آدھی رات", "صبح", "دوپہر", "سہ پہر", "شام", "رات"], u, u], ["00:00", ["04:00", "12:00"], ["12:00", "16:00"], ["16:00", "18:00"], ["18:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=ur-IN.js.map&Rx bo-IN.js.mapbyx 𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬", "𑄝𑄬𑄚𑄳𑄠𑄬", "𑄘𑄨𑄝𑄪𑄎𑄳𑄠", "𑄝𑄬𑄣`𑄠𑄬", "𑄥𑄎𑄧𑄚𑄳𑄠", "𑄢𑄬𑄖𑄴"], u, u], u, [["04:00", "06:00"], ["06Bwccp-IN.js.mapUxY/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["kkj", [["AM", "PM"], u, u], u, [["so", "lu", "ma", "mɛ", "ye", "va", "ms"], ["sɔndi", "lundi", "mardi", "mɛrkɛrɛdi", "yedi", "vaŋdɛrɛdi", "mɔnɔ sɔndi"], u, u], [["so", "lu", "ma", "mɛ", "ye", "va", "ms"], ["sɔndi", "lundi", "mardi", "mɛrkɛrɛdi", "yedi", "vaŋdɛrɛdi", "mɔnɔ sɔndi"], u, ["so", "lu", "ma", "mɛ", "ye", "va", "ms"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["pamba", "wanja", "mbiyɔ mɛndoŋgɔ", "Nyɔlɔmbɔŋgɔ", "Mɔnɔ ŋgbanja", "Nyaŋgwɛ ŋgbanja", "kuŋgwɛ", "fɛ", "njapi", "nyukul", "M11", "ɓulɓusɛ"], u], u, [["BCE", "CE"], u, u], 1, [6, 0], ["dd/MM y", "d MMM y", "d MMMM y", "EEEE dd MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XAF", "FCFA", "Franc CFA", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kkj.js.mapRfx 
export default [7"-	+x 3	bo.js.map3Jx 4	sh.js.map4+ix 3
mni.js.map:(`x{"version":3,"file":"pl.js","sourceRoot":"","sources":["pl.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,MAAM,EAAC,YAAY,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,WAAW,EAAC,YAAY,EAAC,MAAM,EAAC,iBAAiB,EAAC,aAAa,EAAC,WAAW,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,eAAe,EAAC,YAAY,EAAC,SAAS,EAAC,KAAK,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"o półn.\",\"w poł.\",\"rano\",\"przed poł.\",\"po poł.\",\"wiecz.\",\"w nocy\"],[\"o północy\",\"w południe\",\"rano\",\"przed południem\",\"po południu\",\"wieczorem\",\"w nocy\"],u],[[\"półn.\",\"poł.\",\"rano\",\"przedpoł.\",\"popoł.\",\"wiecz.\",\"noc\"],[\"północ\",\"południe\",\"rano\",\"przedpołudnie\",\"popołudnie\",\"wieczór\",\"noc\"],u],[\"00:00\",\"12:00\",[\"06:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}=Șx
en!en:qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAU1CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS-Omi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],us'Qx& kkj!kkj:bEAAEB];\n"]} =x
km!km:qUAAU,EAAC,WAAW%	CAAC,EAACCAAC,UAAU,EAAC,YAAY,E]OAAO,EAAC,KAAK,CAAC,EAACOអធ្រាត្រ\",\"ថ្ងៃត្រង់\",\"នៅពេល​ព្រឹក\",\"នៅពេលរសៀល\",\"នៅពេល​ល្ងាច\",\"នៅពេល​យប់\"],u,u],[[\"អធ្រាត្រ\",\"ថ្ងៃ​្រង់\",\"ព្រឹក\",\"រសៀល\",\"ល្ងាច\",\"យប់\"],u,u],[\"00:00\",\"12:00\",[\"00:00\",\C24:00\"]]];\n"]}bTx?n"n9r6aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,WAAW,EAAC,WAAW,CAAC,EAAC	CAAC,aAAae#$sOmiddernacht\",\"’s ochtends\",\"’s middags\",\"’s avonds\",\"’s nachts\"],u,u],[[\"middernacht\",\"ochtend\",\"middag\"+,\"avond\",\"nacht\"],u,u],[\"00:00\",[\"065%4:00\"],[\"00:00\",\"06:00\"]]];\n"]}ef4"xNsk!sk:{BMAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,C
QAAQ,EAAC,QAAQ,EAAC,OAAO8'YAAY,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,CAACa"MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAKkQAAQ,EAAC,QAAQ,EAAC,OAAO8'YAAY,EAAC,YAAY,EAAC,OAAO,EAAC,KAAK,CAAColn.\",\"nap.\",\"ráno\",\"dop.\",\"pop.\",\"več.\",\"v n.\"],[\"o poln.\",\"napol.\",\"ráno\",\"dopol.\",\"popol.\",\"večer\",\"v noci\"],[\"o polnoci\",\"napoludnie\",\"ráno\",\"dopoludnia\",\"popoludní\",\"večer\",\"v noci\"]],[[\"poln.\",\"pol.\",\"ráno\",\"dop.\",\"pop.\",\"več.\",\"noc\"],[\"poln.\",\"pol.\",\"ráno\",\"dopol.\",\"popol.\",\"večer\",\"noc\"],[\"polnoc\",\"poludnie\",\"ráno\",\"dopoludnie\",\"popoludnie\",\"večer\",\"noc\"]],[\"00:00\",\"12:00\",[\"04:00\",\"09:00\"],[\"095%2:00\"],[\"22:00\",\"04:00\"]]];\n"]}*wx bo!bo<EVx doi!doi<Tg=x sh"sh<FP_x mni!mni<Uwx yi!yi<Fx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "GNF", "FG", "𞤊𞤢𞤪𞤢𞤲 𞤘𞤭𞤲𞤫𞤲𞤳𞤮", { "BYN": [u, "р."], "GNF": ["FG", "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm.js.mapPTzx export default [
&
L+x 3	br.js.map4Jx 3	rn.js.map4{ưfx`{"version":3,"file":"no.js","sourceRoot":"","sources":["no.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"mn.\",\"mg.\",\"fm.\",\"em.\",\"kv.\",\"nt.\"],[\"midn.\",\"morg.\",\"form.\",\"etterm.\",\"kveld\",\"natt\"],[\"midnatt\",\"på morgenen\",\"på formiddagen\",\"på ettermiddagen\",\"på kvelden\",\"på natten\"]],[[\"mn.\",\"mg.\",\"fm.\",\"em.\",\"kv.\",\"nt.\"],[\"midn.\",\"morg.\",\"form.\",\"etterm.\",\"kveld\",\"natt\"],[\"midnatt\",\"morgen\",\"formiddag\",\"ettermiddag\",\"kveld\",\"natt\"]],[\"00:00\",[\"06:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}6mx$ br!br:bEAAEB];\n"]}2
 x$ rn!rn:bEAAEB];\n"]}Ԫ
+xE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["поноћ", "подне", "ујутру", "по подне", "увече", "ноћу"], ["поноћ", "подне", "ујутро", "по подне", "увече", "ноћу"], u], [["поноћ", "подне", "јутро", "поподне", "вече", "ноћ"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=sr-Cyrl.js.maptGx> JуN)u7
слийеA4ID4bs-Cyrl.js.map"cx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["yarim tun", "tush payti", "ertalab", "kunduzi", "kechqurun", "kechasi"], u, u], u, ["00:00", "12:00", ["06:00", "11:00"], ["11:00", "18:00"], ["18:00", "22:00"], ["22:00", "06:00"]]];
//# sourceMappingURL=uz-Latn.js.mapx ponoć", "podne", "ujutru", "po podne", "uveče", "noću"], ["ponoć", "podne", "ujutro", "po podne", "uveče", "noću"], u], [?["ponoć", "podne", "jutro", "popodne", "veče", "noć"], u, u]o!2:00"], ["121:00"], ["21'sr-Latn.js.maplPfx\ 65o", "poslijepodne", "navečer", "po noći"], u, u], u4D4:bs-Latn.js.mapmvx @hi-Latn.js.maprq{)x 3ff-Latn.js.mapUiyMx 3vai-Latn.js.map^)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr.js.mapGy(xt Mponoć", "podne", "ujutro", "poslijepodne", "navečer", "po noći"], u, u], uI1:00"], ["21k'	bs.js.map$Ŵcx4{"version":3,"file":"ro.js","sourceRoot":"","sources":["ro.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,eAAe,EAAC,WAAW,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,SAAS,CAAC,EAAC,CAAC,eAAe,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,SAAS,CAAC,EAAC,CAAC,kBAAkB,EAAC,WAAW,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC,eAAe,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,SAAS,CAAC,EAAC,CAAC,EAAC,CAAC,kBAAkB,EAAC,WAAW,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"miezul nopții\",\"la amiază\",\"dimineața\",\"după-amiaza\",\"seara\",\"noaptea\"],[\"miezul nopții\",\"amiază\",\"dimineața\",\"după-amiaza\",\"seara\",\"noaptea\"],[\"la miezul nopții\",\"la amiază\",\"dimineața\",\"după-amiaza\",\"seara\",\"noaptea\"]],[[\"miezul nopții\",\"amiază\",\"dimineața\",\"după-amiaza\",\"seara\",\"noaptea\"],u,[\"la miezul nopții\",\"la amiază\",\"dimineața\",\"după-amiaza\",\"seara\",\"noaptea\"]],[\"00:00\",\"12:00\",[\"05:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"22:00\"],[\"22:00\",\"05:00\"]]];\n"]}3$AxA
fr!fr:q6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM8QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU;CAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM6QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAMnuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soi
r\",\"nuit45%4:00\"],[\"00:00\",\"04:00\"]]];\n"]}VTPx <
bs!bs:q"QAAQ,EAAC,cAAc,EAAC,SAAS,EAAC,SAASPponoć\",\"podne\",\"ujutro\",\"poslijepodne\",\"navečer\",\"po noći\"],u,u],uP%1:00\"],[\"21:00\",\"04:00\"]]];\n"]}?_"xw
ccp!ccp:q:0BAA0B,EAAC,cAAc,EAAC,gBAAgB,EAAC,cAAc,EAAC,cAAc,EAAC,UAAU_<oO𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬\",\"𑄝𑄬𑄚𑄳𑄠𑄬\",\"𑄘𑄨𑄝𑄪𑄎𑄳𑄠\",\"𑄝𑄬𑄣e𑄳𑄠𑄬\",\"𑄥𑄎𑄧𑄚𑄳𑄠\",\"𑄢𑄬𑄖𑄴\"],u,u],u,[[\"04:00\",\"06:00\"],[\"066:00\"],[\"16%0:00\"],[\"20:00\",\"04:00\"]]];\n"]};ĳ*x\/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mitjanit", "mat.", "matí", "md", "tarda", "vespre", "nit"], ["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nit"], u], [["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nit"], u, u], ["00:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "19:00"], ["19:00", "21:00"], ["21:00", "24:00"]]];
//# sourceMappingURL=ca-ES-valencia.js.map)xe/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mitjanit", "mat.", "matí", "md", "tarda", "vespre", "nit"], ["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nit"], u], [["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nit"], u, u], ["00:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "19:00"], ["19:00", "21:00"], ["21:00", "24:00"]]];
//# sourceMappingURL=ca-IT.js.mapax{"version":3,"file":"de-LU.js","sourceRoot":"","sources":["de-LU.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,aAAa,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"Mitternacht\",\"morgens\",\"vorm.\",\"mittags\",\"nachm.\",\"abends\",\"nachts\"],u,[\"Mitternacht\",\"morgens\",\"vormittags\",\"mittags\",\"nachmittags\",\"abends\",\"nachts\"]],[[\"Mitternacht\",\"Morgen\",\"Vorm.\",\"Mittag\",\"Nachm.\",\"Abend\",\"Nacht\"],u,[\"Mitternacht\",\"Morgen\",\"Vormittag\",\"Mittag\",\"Nachmittag\",\"Abend\",\"Nacht\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}\,!x4nl-CW!nl-CW@{"aAAa,EAAC,YAAY,EAAC,WAAW,EAAC,WAAW`

`
2`
Omiddernacht\",\"’s ochtends\",\"’s middags\",\"’s avonds\",\"’s nachts\"],u,u],[[\"middernacht\",\"ochtend\",\"middag\"A,\"avond\",\"nacht\"],u,u],[\"00:00\",[\"06:00\",\"12:00\"],[\"1256:00\"]]];\n"]}mZb*Cx^de-IT!de-IT@{SAAS,EAAC,OAAOQAAQ,EAAC,QAAQ@aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ$QAAQ,EAAC,OAAO,EAAC,QAAQ8@aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,OAAO,EAAC,OAAO`}mMitternacht\",\"morgens\",\"vorm.\",\"mittags\",\"nachm.\",\"abends\",\"nachts\"],u,[\"Mitternacht\",\"morgens\",\"vormittags\",\"mittags\",\"nachmittags\",\"abends\",\"nachts\"]],[[\"Mitternacht\",\"Morgen\",\"Vorm.\",\"Mittag\",\"Nachm.\",\"Abend\",\"Nacht\"],u,[\"Mitternacht\",\"Morgen\",\"Vormittag\",\"Mittag\",\"Nachmittag\",\"Abend\",\"Nacht\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"103:00\"],[\"1355:00\"]]];\n"]}="sx'
en-SS!en-SS@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAUA1CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS`
`\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12@%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}D)xKes-PR!es-PR@q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa.UAAU,EAAC,WAAWdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"maAana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"]$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}]e-x A%A?/P#x SR$SR@;Rx 

BW$BW@5tx 

GU$GU@5x 

M%M?+6x 

MT$MT@6W "x
ca-IT!ca-IT@q
^MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,MAAMQAAQ,EAAC,KAAK.UAAU,EAAC,MAAMQAAQ,EAAC,KAAK)
ls?
2Omitjanit\",\"mat.\",\"matí\",\"md\",\"tarda\",\"vespre\",\"nit\"],[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u],[[\"mitjanit\",\"matinada\",\"matí\",\"migdia\",\"tarda\",\"vespre\",\"nit\"],u,u],[\"00:00\",[\"00:00\",.:13:00\"],[\"13:00\",\"19:00\"],[\"19:00\",\"21:00\"],[\"21 ?֚?x CU$CU@<ax GT$GT@<Tax

en-LS!en-LS@q<IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU
(gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUA.
SAAS,EAAC,WAAW,EAAC,SAASG
_xQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\"%8:00\"],[\"18&06:00\"]]];\n"]}Ru3x 

NR$NR@6I/x 

PR$PR@6m/x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ب", "ص", "ظ", "ع", "ش", "ن"], ["بامداد", "صبح", "ظهر", "عصر", "شب", "نیمه‌شب"], ["بامداد", "صبح", "بعدازظهر", "عصر", "شب", "نیمه‌شب"]], [["ب", "ص", "ظ", "ع", "ش", "ن"], ["بامداد", "صبح", "ظهر", "عصر", "شب", "نیمه‌شب"], u], [["01:00", "04:00"], ["04:00", "12:00"], ["12:00", "13:00"], ["13:00", "19:00"], ["19:00", "24:00"], ["00:00", "01:00"]]];
//# sourceMappingURL=fa.js.mapx/mitjanit", "mat.", "matí", "md", "tarda", "vespre", "nit"], ["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nit"], u], [["mitjanit", "matinada", "matí", "migdia", "tarda", "vespre", "nit"], u, u], ["00:00", ["00:00", "06:00"], ["06:00",w?1:00"], ["21:00", "24	ca.js.map&Wm=x mas-TZ.js.maptmxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ccp'] = ["ccp",[["AM","PM"],u,u],u,[["𑄢𑄧","𑄥𑄧","𑄟𑄧","𑄝𑄪","𑄝𑄳𑄢𑄨","𑄥𑄪","𑄥𑄧"],["𑄢𑄧𑄝𑄨","𑄥𑄧𑄟𑄴","𑄟𑄧𑄁𑄉𑄧𑄣𑄴","𑄝𑄪𑄖𑄴","𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴","𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴","𑄥𑄧𑄚𑄨"],["𑄢𑄧𑄝𑄨𑄝𑄢𑄴","𑄥𑄧𑄟𑄴𑄝𑄢𑄴","𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴","𑄝𑄪𑄖𑄴𑄝𑄢𑄴","𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴","𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴","𑄥𑄧𑄚𑄨𑄝𑄢𑄴"],["𑄢𑄧𑄝𑄨","𑄥𑄧𑄟𑄴","𑄟𑄧𑄁𑄉𑄧𑄣𑄴","𑄝𑄪𑄖𑄴","𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴","𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴","𑄥𑄧𑄚𑄨"]],u,[["𑄎","𑄜𑄬","𑄟","𑄃𑄬","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪","𑄃","𑄥𑄬","𑄃𑄧","𑄚𑄧","𑄓𑄨"],["𑄎𑄚𑄪","𑄜𑄬𑄛𑄴","𑄟𑄢𑄴𑄌𑄧","𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪𑄣𑄭","𑄃𑄉𑄧𑄌𑄴𑄑𑄴","𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴","𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴"],["𑄎𑄚𑄪𑄠𑄢𑄨","𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨","𑄟𑄢𑄴𑄌𑄧","𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪𑄣𑄭","𑄃𑄉𑄧𑄌𑄴𑄑𑄴","𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴","𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴"]],[["𑄎","𑄜𑄬","𑄟","𑄃𑄬","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪","𑄃","𑄥𑄬","𑄃𑄧","𑄚𑄧","𑄓𑄨"],["𑄎𑄚𑄪𑄠𑄢𑄨","𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨","𑄟𑄢𑄴𑄌𑄧","𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪𑄣𑄭","𑄃𑄉𑄧𑄌𑄴𑄑𑄴","𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴","𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴"],u],[["𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧","𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧"],u,u],0,[6,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","#,##,##0.00¤","#E0"],"BDT","৳","𑄝𑄁𑄣𑄘𑄬𑄥𑄨 𑄑𑄬𑄋",{"BDT":["৳"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"STD":[u,"Db"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬","𑄝𑄬𑄚𑄳𑄠𑄬","𑄘𑄨𑄝𑄪𑄎𑄳𑄠","𑄝𑄬𑄣𑄳𑄠𑄬","𑄥𑄎𑄧𑄚𑄳𑄠","𑄢𑄬𑄖𑄴"],u,u],u,[["04:00","06:00"],["06:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    }7:xˑ+#const u = undefined;
export defaultc7   "𑄝𑄬𑄣𑄳𑄠𑄬",  "𑄢𑄬𑄖𑄴"], u, u], u, [["04:00", "06:00"], ["06:00", "12:00"], ["12:00", "16:00"], ["16:00", "18:00"], ["18:00", "20:;00"], ["20:00", "04:00"]]];
//# sourceMappingURL=ccp.js.maprGZjtxA{"version":3,"file":"he.js","sourceRoot":"","sources":["he.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,MAAM,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,EAAC,KAAK,EAAC,MAAM,EAAC,YAAY,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,SAAS,EAAC,aAAa,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,YAAY,CAAC,EAAC,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,EAAC,KAAK,EAAC,MAAM,EAAC,YAAY,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"חצות\",\"בבוקר\",\"בצהריים\",\"אחה״צ\",\"בערב\",\"בלילה\",\"לפנות בוקר\"],[\"חצות\",\"בוקר\",\"צהריים\",\"אחר הצהריים\",\"ערב\",\"לילה\",\"לפנות בוקר\"],[\"חצות\",\"בבוקר\",\"בצהריים\",\"אחר הצהריים\",\"בערב\",\"בלילה\",\"לפנות בוקר\"]],[[\"חצות\",\"בוקר\",\"צהריים\",\"אחה״צ\",\"ערב\",\"לילה\",\"לפנות בוקר\"],u,[\"חצות\",\"בוקר\",\"צהריים\",\"אחר הצהריים\",\"ערב\",\"לילה\",\"לפנות בוקר\"]],[\"00:00\",[\"06:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"22:00\"],[\"22:00\",\"03:00\"],[\"03:00\",\"06:00\"]]];\n"]}2,Nx9d"d9raAAa,EAAC,SAASQAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EA@aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ?.aAAa,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,E_"J
.aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,E_EMitternacht\",\"morgens\",\"vorm.\",\"mittags\",\"nachm.\",\"abends\",\"nachts\"],u,[\"Mitternacht\",\"morgens\",\"vormittags\",\"mittags\",\"nachmittags\",\"abends\",\"nachts\"]],[[\"Mitternacht\",\"Morgen\",\"Vorm.\",\"Mittag\",\"Nachm.\",\"Abend\",\"Nacht\"],u,[\"Mitternacht\",\"Morgen\",\"Vormittag\",\"Mittag\",\"Nachmittag\",\"Abend\",\"Nacht\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"103:00\"],[\"13%4:00\"],[\"00:00\",\"05:00\"]]];\n"]}`҂#x e"e9rKAAKIAAI,CAAC,EAJ
J
m_fɔŋli\",\"ŋdi\",\"ŋdɔ\",\"ɣetrɔ\",\"fiẽ\",\"zã\"],u,u],u,[[\"04:00\",\"05:00\"],[\"054:00\"],[\"14%1:00\"],[\"21:00\",\"04:00\"]]];\n"]}=ME$x id!id:qcAAc,EAAC,aAAaMAAMJ
J
JT}Otengah malam\",\"tengah hari\",\"pagi\",\"siang\",\"sore\",\"malam\"],u,u],u,[\"00:00\",\"12:00\",[\"00:00\",\"10:00\"],[\"10:00\",\"15:00\"],[\"154:00\"]]];\n"]}b9D(Tx" c"c9cEAAEB];\n"]}
'x$ gd!gd:bEAAEB];\n"]}_
8x$ sa!sa:bEAAEB];\n"]}9/x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["půl.", "pol.", "r.", "d.", "o.", "v.", "n."], ["půln.", "pol.", "r.", "dop.", "odp.", "več.", "v n."], ["půlnoc", "poledne", "ráno", "dopoledne", "odpoledne", "večer", "v noci"]], [["půl.", "pol.", "ráno", "dop.", "odp.", "več.", "noc"], ["půlnoc", "poledne", "ráno", "dopoledne", "odpoledne", "večer", "noc"], u], ["00:00", "12:00", ["04:00", "09:00"], ["09:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=cs.js.map0Jcx:{"version":3,"file":"cs.js","sourceRoot":"","sources":["cs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,WAAW,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,WAAW,EAAC,WAAW,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"půl.\",\"pol.\",\"r.\",\"d.\",\"o.\",\"v.\",\"n.\"],[\"půln.\",\"pol.\",\"r.\",\"dop.\",\"odp.\",\"več.\",\"v n.\"],[\"půlnoc\",\"poledne\",\"ráno\",\"dopoledne\",\"odpoledne\",\"večer\",\"v noci\"]],[[\"půl.\",\"pol.\",\"ráno\",\"dop.\",\"odp.\",\"več.\",\"noc\"],[\"půlnoc\",\"poledne\",\"ráno\",\"dopoledne\",\"odpoledne\",\"večer\",\"noc\"],u],[\"00:00\",\"12:00\",[\"04:00\",\"09:00\"],[\"09:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"22:00\"],[\"22:00\",\"04:00\"]]];\n"]},x0/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["canol nos", "canol dydd", "yn y bore", "yn y prynhawn", "min nos"], ["canol nos", "canol dydd", "y bore", "y prynhawn", "yr hwyr"], u], [["canol nos", "canol dydd", "bore", "prynhawn", "min nos"], ["canol nos", "canol dydd", "bore", "prynhawn", "yr hwyr"], ["canol nos", "canol dydd", "y bore", "y prynhawn", "yr hwyr"]], ["00:00", "12:00", ["00:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"]]];
//# sourceMappingURL=cy.js.map*HMUx_{"version":3,"file":"cy.js","sourceRoot":"","sources":["cy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,WAAW,EAAC,YAAY,EAAC,WAAW,EAAC,eAAe,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,YAAY,EAAC,QAAQ,EAAC,YAAY,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,YAAY,EAAC,MAAM,EAAC,UAAU,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,YAAY,EAAC,MAAM,EAAC,UAAU,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,YAAY,EAAC,QAAQ,EAAC,YAAY,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"canol nos\",\"canol dydd\",\"yn y bore\",\"yn y prynhawn\",\"min nos\"],[\"canol nos\",\"canol dydd\",\"y bore\",\"y prynhawn\",\"yr hwyr\"],u],[[\"canol nos\",\"canol dydd\",\"bore\",\"prynhawn\",\"min nos\"],[\"canol nos\",\"canol dydd\",\"bore\",\"prynhawn\",\"yr hwyr\"],[\"canol nos\",\"canol dydd\",\"y bore\",\"y prynhawn\",\"yr hwyr\"]],[\"00:00\",\"12:00\",[\"00:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"]]];\n"]}ɔS)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-CM.js.mapZ(x   dnat", "om morgenen", "om formiddagen", "om eftermiddagen", "om aftenen", "om natten"], u, u], [["midnat", "morgen", "formiddagL", "eftermiddag", "aften", "nat"], u, u], ["00:00", ["05:00", "10:00"], ["10,04:00"], ["00:00", "05qda-GL.js.mapIZ6x 	BM.js.map2'Vx 	FK.js.map2;vx 	HK.js.map2Mx 	SH.js.map26x 	SI.js.map2Vx 	UG.js.map2vx 	VG.js.map2x del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-CL.js.mapVDx del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-NI.js.mapVD
x del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-PH.js.mapVD\x =午夜", "早上", "上午", "中午", "下午", "晚上", "凌晨"], u, u], u, ["00:00", ["05:00", "08:00"], ["08:00", "12:00" 3:00"], ["13:00", "19:00"], ["19;zh-Hant-HK.js.map#>Qx6 g["午夜", "清晨.4], Pns-HK.js.mapEd㱂x!{"version":3,"file":"ta-LK.js","sourceRoot":"","sources":["ta-LK.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,WAAW,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"நள்.\",\"நண்.\",\"அதி.\",\"கா.\",\"மதி.\",\"பிற்.\",\"மா.\",\"அந்தி மா.\",\"இர.\"],[\"நள்ளிரவு\",\"நண்பகல்\",\"அதிகாலை\",\"காலை\",\"மதியம்\",\"பிற்பகல்\",\"மாலை\",\"அந்தி மாலை\",\"இரவு\"],u],[[\"நள்.\",\"நண்.\",\"அதி.\",\"கா.\",\"மதி.\",\"பிற்.\",\"மா.\",\"அந்தி மா.\",\"இ.\"],[\"நள்ளிரவு\",\"நண்பகல்\",\"அதிகாலை\",\"காலை\",\"மதியம்\",\"பிற்பகல்\",\"மாலை\",\"அந்தி மாலை\",\"இரவு\"],u],[\"00:00\",\"12:00\",[\"03:00\",\"05:00\"],[\"05:00\",\"12:00\"],[\"12:00\",\"14:00\"],[\"14:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"03:00\"]]];\n"]}h/x
en-CM!en-CM@q<IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU-
(gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUi$#SAAS,EAAC,WAAW,EAAC,SAASZ
ysxEOmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],ug6,6:00\"]]];\n"]}+C x
fr-CM!fr-CM@qQAAQ
jZ
8QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUO	CAAC,QAAQ
jZ
QAAQ7
PEOminuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]i4%4:00\"],[\"00:00\",\"04:00\"]]];\n"]}Vjxs
	da-GL!da-GL@qQAAQ,EAAC,aAAaYAAY,EAAC,WAAW);CAAC,QAAQ,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,KAAK3 #dnat\",\"om morgenen\",\"om formiddagen\",\"om eftermiddagen\",\"om aftenen\",\"om natten\"],u,u],[[\"midnat\",\"morgen\",\"forWmiddag\",\"eftermiddag\",\"aften\",\"nat\"],u,u],[\"00:00\",[\"05:00\",\"10:00\"],[\"105%4:00\"],[\"00:00\",\"05:00\"]]];\n"]}vx 
e-TG"e-TG@q6OAAO,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,IAAI)EAAC,Cw<CO_fɔŋli\",\"ŋdi\",\"ŋdɔ\",\"ɣetrɔ\",\"fiẽ\",\"zã\"],u,u],u,[[\"04:00\",\"05:00\"],[\"054:00\"],[\"1454:00\"]]];\n"]}NHx 

B%B?*x 

K%K@+?x 

DK$DK@5%ax 

FJ$FJ@59x 

FK$FK@5I%x 

GI$GI@5;Gx 

HK$HK@5mix 

KI$KI@5x 

MH$MH@5-x 

PG$PG@5Ox 

PH$PH@5qx 

SG$SG@5x 

SH$SH@65x 

SI$SI@6Wx 

UG$UG@6yx 

VG$VG@6)xd
s-CL"s-CL@q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)XWAAW,EAAC,QAAQ,E"# #<COdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"maAana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"]$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}:RlGxd
s-PH"s-PH@q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)XWAAW,EAAC,QAAQ,E"# #<COdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"maAana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"]$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}RxlYx* 
so-DJ!so-DJ@bEAAELB];\n"]}):x$
yrl-VE!yrl-VE@q<iBAAiB,EAAC,oBAAoB,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,gBAAgB)pituna pyterupé\",\"iandé-ara-pyturepé\",\"kuêma ramẽ\",\"karuka ramẽ\",\"pituna ramẽ\",\"pitunaeté ramẽ\"],u,u],u:;9:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}Rbx(	
zh-Hant-HK!
zh-Hant-HK@q@IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAIO)_

O午夜\",\"早上\",\"上午\",\"中午\",\"下午\",\"晚上\",\"凌晨\"],u,u],u,[\"00:00\",[\"05:00\",\"08:00\"],[\"08:00\",@#3:00\"],[\"13:00\",\"19:00\"],[\"19f.	S^7xF 
s*sGΑ7
n.V[\"午夜\",\"清晨G:],2U2J^x NI$NI@<""ax.
en-FI!en-FIBqIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAU1CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS?;1mi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u]w:;8:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}|xd	es$es?tcAAc,EAAC,iBAAiB,EAAC,cAAc(CAAC,IAAI,EAAC,WAAW,EAAC,QAAQ,EO
UAAU,EAAC,WAAW,EAAC,QAAQ,EO
	;
6del mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"m.\",\"madrugada\",\"mañana\",`\"tarde\",\"noche\"],[\"mediodía\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],u],[\"12:00\"$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}jgx 

MG$MG@5	x 

NG$NG@5+x$ 
se$se=eEAAELB];\n"]}˫
%xW/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["midnat", "om morgenen", "om formiddagen", "om eftermiddagen", "om aftenen", "om natten"], u, u], [["midnat", "morgen", "formiddag", "eftermiddag", "aften", "nat"], u, u], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=da.js.map5*xX/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["午夜", "早上", "上午", "中午", "下午", "晚上", "凌晨"], u, ["午夜", "清晨", "上午", "中午", "下午", "晚上", "凌晨"]], [["午夜", "早上", "上午", "中午", "下午", "晚上", "凌晨"], u, u], ["00:00", ["05:00", "08:00"], ["08:00", "12:00"], ["12:00", "13:00"], ["13:00", "19:00"], ["19:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=zh-Hans.js.map}4x 
dav.js.mapQ"Yx_ )C晨", "朝早", "中午", "下昼", "夜晚", "凌晨"], u, u], uyue-Hans.js.mapq(x 3	jv.js.map4/¼0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "morgens", "vorm.", "mittags", "nachm.", "abends", "nachts"], u, ["Mitternacht", "morgens", "vormittags", "mittags", "nachmittags", "abends", "nachts"]], [["Mitternacht", "Morgen", "Vorm.", "Mittag", "Nachm.", "Abend", "Nacht"], u, ["Mitternacht", "Morgen", "Vormittag", "Mittag", "Nachmittag", "Abend", "Nacht"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=de-AT.js.map噴ax{"version":3,"file":"de-AT.js","sourceRoot":"","sources":["de-AT.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,aAAa,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"Mitternacht\",\"morgens\",\"vorm.\",\"mittags\",\"nachm.\",\"abends\",\"nachts\"],u,[\"Mitternacht\",\"morgens\",\"vormittags\",\"mittags\",\"nachmittags\",\"abends\",\"nachts\"]],[[\"Mitternacht\",\"Morgen\",\"Vorm.\",\"Mittag\",\"Nachm.\",\"Abend\",\"Nacht\"],u,[\"Mitternacht\",\"Morgen\",\"Vormittag\",\"Mittag\",\"Nachmittag\",\"Abend\",\"Nacht\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}w!xL
gsw-FR!gsw-FR@{UAAU,EAAC,SAAS,Ea`

`UAAU,EAAC,SAAS,Ea(OAAO,EAAC,QAAQ,EAAC,UAAU_Aam Morge\",\"zmittag\",\"am Namittag\",\"zaabig\",\"znacht\"],u,u6am Morge\",\"zmittag\",\"am Namittag\",\"zaabig\",\"zn""\",\"Mittag\",\"Namittag\",\"Aabigo(#2:00\"],[\"12:00\",\"14:00\"],[\"14Dc0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "morgens", "vorm.", "mittags", "nachm.", "abends", "nachts"], u, ["Mitternacht", "morgens", "vormittags", "mittags", "nachmittags", "abends", "nachts"]], [["Mitternacht", "Morgen", "Vorm.", "Mittag", "Nachm.", "Abend", "Nacht"], u, ["Mitternacht", "Morgen", "Vormittag", "Mittag", "Nachmittag", "Abend", "Nacht"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=de-BE.js.map;勹xY{"version":3,"file":"ru-UA.js","sourceRoot":"","sources":["ru-UA.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;QAC/G,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3L,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,aAAa,EAAC,aAAa,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC,SAAS,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,OAAO,CAAC,EAAC,CAAC,uBAAuB,EAAC,uBAAuB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,SAAS,EAAC,cAAc,EAAC,eAAe,EAAC,qBAAqB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,UAAU,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,SAAS,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,mBAAmB,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))\n    return 3;\nif (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ru-UA\",[[\"AM\",\"PM\"],u,u],u,[[\"В\",\"П\",\"В\",\"С\",\"Ч\",\"П\",\"С\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],[\"воскресенье\",\"понедельник\",\"вторник\",\"среда\",\"четверг\",\"пятница\",\"суббота\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"мар.\",\"апр.\",\"мая\",\"июн.\",\"июл.\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"января\",\"февраля\",\"марта\",\"апреля\",\"мая\",\"июня\",\"июля\",\"августа\",\"сентября\",\"октября\",\"ноября\",\"декабря\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"март\",\"апр.\",\"май\",\"июнь\",\"июль\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"январь\",\"февраль\",\"март\",\"апрель\",\"май\",\"июнь\",\"июль\",\"август\",\"сентябрь\",\"октябрь\",\"ноябрь\",\"декабрь\"]],[[\"до н.э.\",\"н.э.\"],[\"до н. э.\",\"н. э.\"],[\"до Рождества Христова\",\"от Рождества Христова\"]],1,[6,0],[\"dd.MM.y\",\"d MMM y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"не число\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"UAH\",\"₴\",\"украинская гривна\",{\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUB\":[\"₽\"],\"RUR\":[\"р.\"],\"THB\":[\"฿\"],\"TMT\":[\"ТМТ\"],\"TWD\":[\"NT$\"],\"UAH\":[\"₴\"],\"XXX\":[\"XXXX\"]},\"ltr\", plural];\n"]}Ǣ)gxk0fa-AF!fa-AF@]eAAe,CaE\KAAK,EAAC,WAAW,EAAC,IAAIjaAAa\KAAK,EAAC,WAAW,EAAC,IAAI	CAAC,OAAO	N

	N

	N

	N

	N

OAAO,CAAC,CAAC7export default [[[\"ب\",\"ص\",\"ظ\",\"ع\",\"ش\",\"ن\"],[\"بامداد\",\"صبح\",\"ظهر\",\"بعدازچاشت\",\"ب\",\"نیمه‌شب\"],u],[[\"ب\",\"ص\",\"بعد از چاشت\",\"ع\",\"ش\",\"ن\"],[\"بامداد\",\"صبح\",\"ظر\",\"بعدازچاشت\",\"شب\",\"نیمه‌شب\"],u],[[\"01:00\",\"04:00\"],[\"04:00\",\"12:00\"],[\"12:00\",\"13:00\"K],[\"13:00\",\"19:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"01:00\"]]];\n"]}k$#xN
en-DE!en-DE@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,	EAAC,UAAU-$,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS13AZ_Omi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"!],u,u],[\"00:00\",\"12:00\",[\"06.;8:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}v ]x 

B%B?*}x 

GD$GD@4|x 

LC$LC@55AxI
nl-B"nl-B?r,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,WAAW,EAAC,WAAW)CAAC,aAAa,EAAC,SAAS,EAAC,QAAQ,E"# #<CQddernacht\",\"’s ochtends\",\"’s middags\",\"’s avonds\",\"’s nachts\"],u,u],[[\"middernacht\",\"ochtend\",\"middag\",\"avond\",\"nacht\"],u,u],[\"00@%4:00\"],[\"00:00\",\"06:00\"]]];\n"]}g)Xxdde$de=~SAAS,EAAC,OAAOQAAQ,EAAC,QAAQ@aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ$QAAQ,EAAC,OAAO,EAAC,QAAQ8@aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,OAAO,EAAC,OAAO`}mMitternacht\",\"morgens\",\"vorm.\",\"mittags\",\"nachm.\",\"abends\",\"nachts\"],u,[\"Mitternacht\",\"morgens\",\"vormittags\",\"mittags\",\"nachmittags\",\"abends\",\"nachts\"]],[[\"Mitternacht\",\"Morgen\",\"Vorm.\",\"Mittag\",\"Nachm.\",\"Abend\",\"Nacht\"],u,[\"Mitternacht\",\"Morgen\",\"Vormittag\",\"Mittag\",\"Nachmittag\",\"Abend\",\"Nacht\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"103:00\"],[\"1355:00\"]]];\n"]}ˣxKes-IC!es-IC@q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa.UAAU,EAAC,WAAWdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"maAana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"]$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}e0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "morgens", "vorm.", "mittags", "nachm.", "abends", "nachts"], u, ["Mitternacht", "morgens", "vormittags", "mittags", "nachmittags", "abends", "nachts"]], [["Mitternacht", "Morgen", "Vorm.", "Mittag", "Nachm.", "Abend", "Nacht"], u, ["Mitternacht", "Morgen", "Vormittag", "Mittag", "Nachmittag", "Abend", "Nacht"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=de-CH.js.map\叼0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "morgens", "vorm.", "mittags", "nachm.", "abends", "nachts"], u, ["Mitternacht", "morgens", "vormittags", "mittags", "nachmittags", "abends", "nachts"]], [["Mitternacht", "Morgen", "Vorm.", "Mittag", "Nachm.", "Abend", "Nacht"], u, ["Mitternacht", "Morgen", "Vormittag", "Mittag", "Nachmittag", "Abend", "Nacht"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=de-IT.js.map塲)xm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "am Morge", "zmittag", "am Namittag", "zaabig", "znacht"], u, u], [["Mitternacht", "am Morge", "zmittag", "am Namittag", "zaabig", "znacht"], u, ["Mitternacht", "Morge", "Mittag", "Namittag", "Aabig", "Nacht"]], ["00:00", ["05:00", "12:00"], ["12:00", "14:00"], ["14:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=gsw-LI.js.mapIxi-morgens", "vorm.", "mittags", "nachm.", "abends", "nachts"], u, ["Mitternacht", "morgens", "vormittags", "mittags", "nachmittags", "abends", "nachts"]], [["Mitternacht", "Morgen", "Vorm.", "Mittag", "Nachm.", "Abend", "Nacht"], u, ["Mitternacht", "Morgen.", "Vormittag", "Mittag", "Nachmittag", "Abend$0:00"], ["103:00"], ["136Ode-LI.js.mapmtx xTfɔŋli", "ŋdi", "ŋdɔ", "ɣetrɔ", "fiẽ", "zã"], u, u], u, [["04:00", "05:00"]J1:00"], ["21:00", "04gee-TG.js.mapL)8-x mfo-DK.js.mapZxSTx5午夜", "早上", "上午", "中午", "下午", "晚上", "凌晨"], u, ["午夜", "清晨", "上午", "中午", "下午", "`上", "凌晨"]], [["午夜", "早上", "上午", "中午", "下午", "晚上", "凌晨"], u, u08:00"], ["08 3:00"], ["13:00", "19:00"], ["19J;zh-Hans-SG.js.mapR}ax{"version":3,"file":"de-LI.js","sourceRoot":"","sources":["de-LI.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,aAAa,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"Mitternacht\",\"morgens\",\"vorm.\",\"mittags\",\"nachm.\",\"abends\",\"nachts\"],u,[\"Mitternacht\",\"morgens\",\"vormittags\",\"mittags\",\"nachmittags\",\"abends\",\"nachts\"]],[[\"Mitternacht\",\"Morgen\",\"Vorm.\",\"Mittag\",\"Nachm.\",\"Abend\",\"Nacht\"],u,[\"Mitternacht\",\"Morgen\",\"Vormittag\",\"Mittag\",\"Nachmittag\",\"Abend\",\"Nacht\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}&!xg
fr-WF!fr-WF@q6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM8QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU`6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM6QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM}Ominuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"sAoir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"1254:00\"]]];\n"]}>&0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "morgens", "vorm.", "mittags", "nachm.", "abends", "nachts"], u, ["Mitternacht", "morgens", "vormittags", "mittags", "nachmittags", "abends", "nachts"]], [["Mitternacht", "Morgen", "Vorm.", "Mittag", "Nachm.", "Abend", "Nacht"], u, ["Mitternacht", "Morgen", "Vormittag", "Mittag", "Nachmittag", "Abend", "Nacht"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=de-LU.js.map她0x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "morgens", "vorm.", "mittags", "nachm.", "abends", "nachts"], u, ["Mitternacht", "morgens", "vormittags", "mittags", "nachmittags", "abends", "nachts"]], [["Mitternacht", "Morgen", "Vorm.", "Mittag", "Nachm.", "Abend", "Nacht"], u, ["Mitternacht", "Morgen", "Vormittag", "Mittag", "Nachmittag", "Abend", "Nacht"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "13:00"], ["13:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=de.js.mapnװrx /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["yi", [["פֿאַרמיטאָג", "נאָכמיטאָג"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["זונטיק", "מאָנטיק", "דינסטיק", "מיטוואך", "דאנערשטיק", "פֿרײַטיק", "שבת"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["יאַנואַר", "פֿעברואַר", "מערץ", "אַפּריל", "מיי", "יוני", "יולי", "אויגוסט", "סעפּטעמבער", "אקטאבער", "נאוועמבער", "דעצעמבער"], u], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["יאַנ", "פֿעב", "מערץ", "אַפּר", "מיי", "יוני", "יולי", "אויג", "סעפּ", "אקט", "נאוו", "דעצ"], ["יאַנואַר", "פֿעברואַר", "מערץ", "אַפּריל", "מיי", "יוני", "יולי", "אויגוסט", "סעפּטעמבער", "אקטאבער", "נאוועמבער", "דעצעמבער"]], [["BCE", "CE"], u, u], 1, [6, 0], ["dd/MM/yy", "dטן MMM y", "dטן MMMM y", "EEEE, dטן MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], u, u, u, { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=yi.js.map&B-x export default [!
+x 3
doi.js.map:PKx 3	kl.js.map3jx 3
nnh.js.map:'
x 3sat-Olck.js.map^0x 3
shi.js.map:'Qx 3
xog.js.map;1vxg{"version":3,"file":"sw.js","sourceRoot":"","sources":["sw.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"usiku\",\"mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"adhuhuri\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"]],[[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"adhuhuri\",\"alfajiri\",\"asubuhi\",\"alasiri\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"]],[\"00:00\",\"12:00\",[\"04:00\",\"07:00\"],[\"07:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"19:00\"],[\"19:00\",\"04:00\"]]];\n"]}q+tx$ dz!dz:bEAAEXB];\n"]}D-'x+hy!hy:q^KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,OAAO,EAAC,WAAW6QAAQ,CAAC,EAAC,CAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS_UAAU,EAAC,OAAOEAAC,CAAC,EAACxOOկգ․\",\"կօ․\",\"առվ\",\"ցրկ\",\"երկ\",\"գշր\"],[\"կեսգիշեր\",\"կեսօր\",\"առավոտյան\",\"ցերեկը\",\"երեկոյան\",\"գիշերը\"],[\"կեսգիշերին\",\"կեսօրին\",\"առավոտյան\",\"երեկվա\",\"երեկոյան\",\"գիշերվա\"]],[[\"կեսգիշեր\",\"կեսօր\",\"առավոտ\",\"ցերեկ\"#,\"երեկո\",\"գիշեր\"],u,u6;8:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}:EZ
x" r"r9cEAAEXB];\n"]}
);x 
zu!zu:qaAAa,EAAC,SAAS,EAAC,OAAO_CAAC,EAAC,CAAC,EAACEentathakusa\",\"ekuseni\",\"emini\",\"ntambama\",\"ebusuku\"],u,u],u,[[\"00:00\",\"06:00\"],[\"06:00\",\"10:00\"],[\"10:00\",\"13:00\"],[\"13924:00\"]]];\n"]}:F Kx fy!fy:F	Wx nus!nus:V*xZ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["πρωί", "μεσημ.", "απόγ.", "βράδυ"], u, ["το πρωί", "το μεσημέρι", "το απόγευμα", "το βράδυ"]], [["πρωί", "μεσημ.", "απόγ.", "βράδυ"], u, ["πρωί", "μεσημέρι", "απόγευμα", "βράδυ"]], [["04:00", "12:00"], ["12:00", "17:00"], ["17:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=el-CY.js.map2x os-RU.js.map^*x]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["πρωί", "μεσημ.", "απόγ.", "βράδυ"], u, ["το πρωί", "το μεσημέρι", "το απόγευμα", "το βράδυ"]], [["πρωί", "μεσημ.", "απόγ.", "βράδυ"], u, ["πρωί", "μεσημέρι", "απόγευμα", "βράδυ"]], [["04:00", "12:00"], ["12:00", "17:00"], ["17:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=el.js.map/x mni-Beng.js.mapy*x 3
rof.js.map;00)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-CC.js.map
(x 
001.js.map5.Ix 
150.js.map5]jx 	BB.js.map1
xg  d", "n", "mor", "aft", "eve", "dm*", "noon", "mor", "aft", "eve", "night"], CA.js.mapo2 x 	GB.js.map1 x del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-419.js.mapDx del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-EA.js.mapV@Dxponoć", "podne", "jutro", "po pod.", "veče", "noć"], ["ponoć", "podne", "jutro", "po pod.", "veče", "noću"], ["ponoć", "podne", "ujutro", "po podne", "uveče", "noću"]], [["ponoć", "podne", "jutro", "popodne", "veče", "noć"], u, u], ["00:00", psr-Latn-BA.js.map[R	,x e1+ujutro", "popodne", "navečer", "noću"], u#&slije podne", "navečer", "noću"]], [!podne", "navečer", "noću!4)D4nhr-BA.js.map2ɻ)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-AE.js.map3x:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["полн.", "полд.", "утра", "дня", "веч.", "ночи"], ["полн.", "полд.", "утра", "дня", "вечера", "ночи"], ["полночь", "полдень", "утра", "дня", "вечера", "ночи"]], [["полн.", "полд.", "утро", "день", "веч.", "ночь"], u, ["полночь", "полдень", "утро", "день", "вечер", "ночь"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=ru-MD.js.mapJSnGx8mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00601:00"], ["21:00", "06en-AG.js.mapo^x)minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00C4:00"], ["00'fr-CF.js.mapYFx  miezul nopții", "amiază", "dimineață", "după-amiază", "seară", "noapte"], ["miezul nopții", "amiază", "dimineața", "dAupă-amiaza", "seara", "noaptea"], u], u, ["00:00", "12:00", ["05D5o-MD.js.map9JFmx 	IE.js.map2&x 	SB.js.map2h-x)ezzanotte", "mezzogiorno", "di mattina", "di pomeriggio", "di sera", "di notte"], u, ["mezzanotte", "mezzogiorno", "di mattina", "del pomeriggio", "di sera", "di notte"]], [["mezzanotte", "mezzogiorno", "mattina", "pomeriggio", "sera", "notte"], u, u], [F4:00"], ["00h'it-VA.js.map^ͱx{"version":3,"file":"fr-SC.js","sourceRoot":"","sources":["fr-SC.ts"],"names":[],"mappings":"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,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\\d+))?/, '$2')) || 0;\n\nif (i === 0 || i === 1)\n    return 1;\nif (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))\n    return 4;\nreturn 5;\n}\n\nexport default [\"fr-SC\",[[\"AM\",\"PM\"],u,u],u,[[\"D\",\"L\",\"M\",\"M\",\"J\",\"V\",\"S\"],[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],[\"di\",\"lu\",\"ma\",\"me\",\"je\",\"ve\",\"sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"janv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"],[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"]],u,[[\"av. J.-C.\",\"ap. J.-C.\"],u,[\"avant Jésus-Christ\",\"après Jésus-Christ\"]],1,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",\"{1}, {0}\",\"{1} 'à' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"SCR\",\"SR\",\"roupie des Seychelles\",{\"ARS\":[\"$AR\",\"$\"],\"AUD\":[\"$AU\",\"$\"],\"BEF\":[\"FB\"],\"BMD\":[\"$BM\",\"$\"],\"BND\":[\"$BN\",\"$\"],\"BYN\":[u,\"р.\"],\"BZD\":[\"$BZ\",\"$\"],\"CAD\":[\"$CA\",\"$\"],\"CLP\":[\"$CL\",\"$\"],\"CNY\":[u,\"¥\"],\"COP\":[\"$CO\",\"$\"],\"CYP\":[\"£CY\"],\"EGP\":[u,\"£E\"],\"FJD\":[\"$FJ\",\"$\"],\"FKP\":[\"£FK\",\"£\"],\"FRF\":[\"F\"],\"GBP\":[\"£GB\",\"£\"],\"GIP\":[\"£GI\",\"£\"],\"HKD\":[u,\"$\"],\"IEP\":[\"£IE\"],\"ILP\":[\"£IL\"],\"ITL\":[\"₤IT\"],\"JPY\":[u,\"¥\"],\"KMF\":[u,\"FC\"],\"LBP\":[\"£LB\",\"£L\"],\"MTP\":[\"£MT\"],\"MXN\":[\"$MX\",\"$\"],\"NAD\":[\"$NA\",\"$\"],\"NIO\":[u,\"$C\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"RHD\":[\"$RH\"],\"RON\":[u,\"L\"],\"RWF\":[u,\"FR\"],\"SBD\":[\"$SB\",\"$\"],\"SCR\":[\"SR\"],\"SGD\":[\"$SG\",\"$\"],\"SRD\":[\"$SR\",\"$\"],\"TOP\":[u,\"$T\"],\"TTD\":[\"$TT\",\"$\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"$US\",\"$\"],\"UYU\":[\"$UY\",\"$\"],\"WST\":[\"$WS\"],\"XCD\":[u,\"$\"],\"XPF\":[\"FCFP\"],\"ZMW\":[u,\"Kw\"]},\"ltr\", plural];\n"]}1&xd4
CG$CG@]eAAe,CAAC,CAAC,CAAC,QAAQP
.QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS	CAAC,QAAQP
QAAQaYAAY55&&&	CAAC,CAAC+7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}	ryxw 43CG$CG@MAAM,EAAC,kBAAkB,EA
@
(
ZF

-CG!XAF\",\"FCFA\",\"franc CFA (BEAC)%xg 43GF$GF@oEAAC,MAAM,EA
@
(
ZF

-GFEUR\",\"€\",\"euro##ox=

en-KE!en-KE@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,YEAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS	EAAC,CAACQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u65%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}Vh;x 

GF$GF@;5]x 

SC$SC@<Gx$ 
ln$ln=eEAAE~B];\n"]}&2x`
ru-MD!ru-MD@qvKAAKu${
KAAK,EAAC,QAAQ,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQvv-SAAS,EAAC,SAASW)полн.\",\"полд.\",\"утра\",\"дня\",\"веч.\",\"ночи\"],[\"полн.\",\"полд.\",\"утра\",\"дня\",\"вечера\",\"ночи\"],[\"полночь\",\"полдень\",\"утра\",\"дня\",\"вечера\",\"ночи\"]],[[\"полн.\",\"полд.\",\"утро\",\"день\",\"веч.\",\"ночь\"],u,[\"полночь\",\"полдень\",\"0тро\",\"день\",\"вечер\",\"ночьT2:00\"],[\"22/Q2x 

AG$AG@4vTx 

I%I?+ftx 

J%J?+ux 

SB$SB@56x 

SC$SC@5Xx 

ZA$ZA@6jx om-KE!om-KE@p3_x9
fr-CF!fr-CF@qe
e?EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,Ca
eEAAC,OAAO,EAAC,YAAYminuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuitT4:00\"],[\"00F4xo%o=teAAe,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,CAAC,eAAe,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAACO<miezul nopții\",\"amiază\",\"dimineață\",\"după-amiază\",\"seară\",\"noapte\"],[\"miezul nopții\",\"amiază\",\"diminea2ța\",\"după-amiaza\",\"seara\",\"noaptea\"],u],u5K5:00\"]]];\n"]}{ dx 

B%B?0x 

MC$MC@<0;&x 

NC$NC@<B=Hx

it-VA!it-VA@qYAAY,EAAC,aAAa,EAAC,YAAY,EAAC,eAAe,EAAC,SAAS,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,YAAY,EAAC,aAAa,EAAC,YAAY,EAAC,gBAAgB,EAAC,SAAS,0#YAAY,EAAC,aAAa,EAAC,SAAS	EAAC,CAACQezzanotte\",\"mezzogiorno\",\"di mattina\",\"di pomeriggio\",\"di sera\",\"di notte\"],u,[\"mezzanotte\",\"mezzogiorno\",\"di mattina\",\"del pomeriggio\",\"di sera\",\"di notte\"]],[[\"mezzanotte\",\"mezzogiorno\",\"mattina\",\"pomeriggio\",\"sera\",\"notte\"],u,u6K6:00\"]]];\n"]}lPx$ 
ln$ln=eEAAE~B];\n"]}&x`
ru-UA!ru-UA@qvKAAKu${
KAAK,EAAC,QAAQ,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQvv-SAAS,EAAC,SAASW)полн.\",\"полд.\",\"утра\",\"дня\",\"веч.\",\"ночи\"],[\"полн.\",\"полд.\",\"утра\",\"дня\",\"вечера\",\"ночи\"],[\"полночь\",\"полдень\",\"утра\",\"дня\",\"вечера\",\"ночи\"]],[[\"полн.\",\"полд.\",\"утро\",\"день\",\"веч.\",\"ночь\"],u,[\"полночь\",\"полдень\",\"0тро\",\"день\",\"вечер\",\"ночьT2:00\"],[\"22/!ox
ms-ID!ms-ID@qaAAa,EAAC,QAAQ,EAAC,CAAC,cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQEAAC,CAAC,CaAAa,EAAC,QAAQ"cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQy#P_UOpagi\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],u,[\"tengah malam\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"]],[[\"pagi\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],[\"tengah malam\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],u],[[\"00:00\",\"01:00\"],[\"01;4:00\"],[\"14:00\",\"19:00\"],[\"19:00\",\"24:00\"]]];\n"]}ٞ)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-BI.js.map1(x 	AI.js.map1Hx 	NF.js.map2[TxG{"version":3,"file":"fr-MG.js","sourceRoot":"","sources":["fr-MG.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}oz#Tx=

en-BI!en-BI@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,YEAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS	EAAC,CAACQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u65%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}}^# x=

en-GH!en-GH@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,YEAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS	EAAC,CAACQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u65%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}flx 

BI$BI@;1x 

CI$CI@;30x 

F%F@1GPx 

PF$PF@<GrxG 
RE$RE@MAAMWBS>MAAMW[\"min.\2D.\{%Hx^
ru-K"ru-K?rvKAAKu${
KAAK,EAAC,QAAQ,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQvv-SAAS,EAAC,SAASW)полн.\",\"полд.\",\"утра\",\"дня\",\"веч.\",\"ночи\"],[\"полн.\",\"полд.\",\"утра\",\"дня\",\"вечера\",\"ночи\"],[\"полночь\",\"полдень\",\"утра\",\"дня\",\"вечера\",\"ночи\"]],[[\"полн.\",\"полд.\",\"утро\",\"день\",\"веч.\",\"ночь\"],u,[\"полночь\",\"полдень\",\"0тро\",\"день\",\"вечер\",\"ночьT2:00\"],[\"22/HAax 

A%A?*x 

NF$NF@5Wx 

SE$SE@5"x$ 
se$se=eEAAELB];\n"]}˫
2x ha-GH!ha-GH@n)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-AS.js.mapx(x 	ER.js.map2jHx 	MP.js.map2)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-LR.js.map(x 	AT.js.map2VHx 	TO.js.map2)xm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["midnight", "midday", "morning", "afternoon", "evening", "night"], u, ["midnight", "midday", "in the morning", "in the afternoon", "in the evening", "at night"]], [["midnight", "midday", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-AU.js.map3x:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["полн.", "полд.", "утра", "дня", "веч.", "ночи"], ["полн.", "полд.", "утра", "дня", "вечера", "ночи"], ["полночь", "полдень", "утра", "дня", "вечера", "ночи"]], [["полн.", "полд.", "утро", "день", "веч.", "ночь"], u, ["полночь", "полдень", "утро", "день", "вечер", "ночь"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=ru-UA.js.mapKSsGx8mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00601:00"], ["21:00", "06en-DE.js.mapz^x)minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00C4:00"], ["00'fr-MC.js.map<Y
x 	BE.js.map1x 	GD.js.map2?x 	LC.js.map21_x del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-IC.js.mapVtDYx = ddernacht", "’s ochtends", "’s middags", "’s avonds", "’s nachts"], u, u], [["middernacht", "ochtend", "middag", "avond", "nacht"], u, u], ["00":4:00"], ["00h'nl-BE.js.mapy>)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-BS.js.map(x 	ZM.js.map2Px{"version":3,"file":"en-BS.js","sourceRoot":"","sources":["en-BS.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"mi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\",[\"06:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}xx 

ZM$ZM@6)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-BZ.js.map(x 	CY.js.map2Hx 	MW.js.map2hx 	VU.js.map3TxG{"version":3,"file":"fr-VU.js","sourceRoot":"","sources":["fr-VU.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}Zu#Tx=

en-BZ!en-BZ@qIAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,YEAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS	EAAC,CAACQ\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u65%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}M x 

YT$YT@>u&Bx`
ru-BY!ru-BY@qvKAAKu${
KAAK,EAAC,QAAQ,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQvv-SAAS,EAAC,SAASW)полн.\",\"полд.\",\"утра\",\"дня\",\"веч.\",\"ночи\"],[\"полн.\",\"полд.\",\"утра\",\"дня\",\"вечера\",\"ночи\"],[\"полночь\",\"полдень\",\"утра\",\"дня\",\"вечера\",\"ночи\"]],[[\"полн.\",\"полд.\",\"утро\",\"день\",\"веч.\",\"ночь\"],u,[\"полночь\",\"полдень\",\"0тро\",\"день\",\"вечер\",\"ночьT2:00\"],[\"22/')1xd
tr-CY!tr-CY@q@MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,cAAc,EAAC,eAAe,EAAC,WAAW,EAAC,OAAOaAAaa"cAAc,EAAC,eAAe,EAAC,WAAW,EAAC,OAAOCAAC,EAAC,CAAC,CAAC,aAAaa"cAAc,EAAC,eAAe,EAAC,WAAW,EAAC,OAAO$Rx<uOgece\",\"ö\",\"sabah\",\"öğleden önce\",\"öğleden sonra\",\"akşamüstü\",\"akşam\",\"gece\"],[\"gece yarısı\",\"öğle\",\"sabah\",\"öğleden önce\",\"öğleden sonra\",\"akşamüstü\",\"akşam\",\"gece\"],u],[[\"gece yarısı\",\"öğle\",[\"sabah\",\"öğleden önce\",\"öğleden sonra\",\"akşamüstü\",\"akşam\",\"gece\"],u,u6:00\",\"11:00\"],[\"114<19:00\"],[\"19:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}IKx 

CX$CX@5)x 

CY$CY@5Kx 

MU$MU@6gmx 

MV$MV@6wx 

MW$MW@61x 

NU$NU@6ySx 

TT$TT@6ux 

VU$VU@7	x 

WS$WS@69xd
s-US"s-US@q.cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa)XWAAW,EAAC,QAAQ,E"# #<COdel mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u,u],[[\"mediodía\",\"madrugada\",\"maAana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"]$&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}}Bly,x#
	pt-GW!pt-GW@qYAAY,EAAC,UAAU,E
OEAAC,WAAW,CAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcCAAC,YAAY,EAAC,UAAU,E
	EAAC,WAAWeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",j\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugadaB;9:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}&x#
	pt-LU!pt-LU@qYAAY,EAAC,UAAU,E
OEAAC,WAAW,CAAC,EAAC,CAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,UAAU,EAAC,cAAcCAAC,YAAY,EAAC,UAAU,E
	EAAC,WAAWeia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugada\"],[\"meia-noite\",\"meio-dia\",\"da manhã\",\"da tarde\",j\"da noite\",\"da madrugada\"],u],[[\"meia-noite\",\"meio-dia\",\"manhã\",\"tarde\",\"noite\",\"madrugadaB;9:00\"],[\"19:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}0ېVx 		ST$ST@D-Xx 		PT$PT@CR)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-CH.js.map2(x 	GG.js.map2$Hx 	SD.js.map2x)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-CK.js.mapJ(x 	FJ.js.map23Hx 	KI.js.map2Xhx 	MH.js.map2bx 	SG.js.map2)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-CX.js.map(x 	MU.js.map2Hx 	NU.js.map2hx 	WS.js.map3x del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-US.js.mapW`Dxeia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noiteZ", "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada
> 9:00"], ["19:00", "24:00"], ["00h'pt-LU.js.map0T'x 	PT.js.map/s0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["поноћ", "подне", "јутро", "по под.", "вече", "ноћ"], ["поноћ", "подне", "јутро", "по под.", "вече", "ноћу"], ["поноћ", "подне", "ујутро", "по подне", "увече", "ноћу"]], [["поноћ", "подне", "јутро", "поподне", "вече", "ноћ"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=sr-Cyrl-ME.js.map;;wxmi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the amfternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "nightoen-DG.js.mapS'x ha-NE.js.map_Nx o-KE.js.mapWQbx 	TC.js.map2yFx 3ln-CG.js.mapD{hx 3om-KE.js.mapD
x 3teo-KE.js.mapM)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-DK.js.mapS(x 	PH.js.map2})xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-FM.js.mapu(x 	DM.js.map29Hx 	IL.js.map2^hx 	VI.js.map2x
e mesnatës", "e mesditës", "e mëngjesit", "e paradites", "e pasdites", "e mbrëmjes", "e natës"], u, u], [["mesnatë", "mes=ditë", "mëngjes", "paradite", "pasdite", "mbrëmje", "natë
!4:00", "09:00"], ["09,04:00"], ["00:00", "04qsq-MK.js.mapuU<)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-FI.js.mapU(x 	MG.js.map2ZHx 	NG.js.map2c)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-GH.js.mapV(x 	SE.js.map2)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-PG.js.map(x 	GI.js.map24)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-JM.js.map(x 	GM.js.map2THx 	IM.js.map2fhx 	NL.js.map2x 	PK.js.map2(xeia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noiteZ", "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada
> 9:00"], ["19:00", "24:00"], ["00h'pt-AO.js.map/Tx)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-PW.js.map(x 	GY.js.map2Hx 	TV.js.map3x!{"version":3,"file":"ta-MY.js","sourceRoot":"","sources":["ta-MY.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,WAAW,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"நள்.\",\"நண்.\",\"அதி.\",\"கா.\",\"மதி.\",\"பிற்.\",\"மா.\",\"அந்தி மா.\",\"இர.\"],[\"நள்ளிரவு\",\"நண்பகல்\",\"அதிகாலை\",\"காலை\",\"மதியம்\",\"பிற்பகல்\",\"மாலை\",\"அந்தி மாலை\",\"இரவு\"],u],[[\"நள்.\",\"நண்.\",\"அதி.\",\"கா.\",\"மதி.\",\"பிற்.\",\"மா.\",\"அந்தி மா.\",\"இ.\"],[\"நள்ளிரவு\",\"நண்பகல்\",\"அதிகாலை\",\"காலை\",\"மதியம்\",\"பிற்பகல்\",\"மாலை\",\"அந்தி மாலை\",\"இரவு\"],u],[\"00:00\",\"12:00\",[\"03:00\",\"05:00\"],[\"05:00\",\"12:00\"],[\"12:00\",\"14:00\"],[\"14:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"03:00\"]]];\n"]}//x
en-PW!en-PW@q<IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU-
(gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAUi$#SAAS,EAAC,WAAW,EAAC,SAASZ
ysxEOmi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],ug6,6:00\"]]];\n"]}0! x	es-MX!es-MX@qcAAc,EAAC,iBAAiB,EAAC,QAAQ,EAAC,aAAa,EAAC,aAAa,CAAC,EAAC,CAAC,cAAc,EAAC,iBAAiB,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa,CAAC,EAAC,CAAC,CAA|UAAU,EAAC,WAAW,EAAC,QAAQ,E"Z
y
xsEOdel mediodía\",\"de la madrugada\",\"mañana\",\"de la tarde\",\"de la noche\"],[\"del mediodía\",\"de la madrugada\",\"de la mañana\",\"de la tarde\",\"de la noche\"],u],[[\"mediodía\",\"madrugada\",\"mañana\",\"tarde\",\"noche\"],u,u],[\"12:00\",[\"00:00\",\"06:00\"],[\"06&20:00\"],[\"20:00\",\"24:00\"]]];\n"]}#SEx
fr-RW!fr-RW@qQAAQ
jZ
8QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUO	CAAC,QAAQ
jZ
QAAQ7
PEOminuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]i4%4:00\"],[\"00:00\",\"04:00\"]]];\n"]}J0x 

GY$GY@6;1x 

TV$TV@6=x 

DZ$DZ@<W)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-IN.js.map)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-MO.js.map(x 	PN.js.map2Hx 	UM.js.map2hx)ezzanotte", "mezzogiorno", "di mattina", "di pomeriggio", "di sera", "di notte"], u, ["mezzanotte", "mezzogiorno", "di mattina", "del pomeriggio", "di sera", "di notte"]], [["mezzanotte", "mezzogiorno", "mattina", "pomeriggio", "sera", "notte"], u, u], [F4:00"], ["00h'it-SM.js.map^8xi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the aflternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "nightR1:00"], ["21o'en-IO.js.mapV
]x Xiddernacht", "’s ochtends", "’s middags", "’s avonds", "’s nachts"], u, u], [["middernacht", "ochtend", "middag", "avon
d", "nacht/gnl-BQ.js.mapk89x ia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noite"Y, "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada>9:00"], ["19[;pt-TL.js.map5PR%x 	e mesnatës", "e mesditës", "e mëngjesit", "e paradites", "e pasdites", "e mbrëmjes", "e natës"], u, u], [["mesnatë", "mes=ditë", "mëngjes", "paradite", "pasdite", "mbrëmje", "natë!4:00", "09:00"], ["093D4xsq-XK.js.mapQ*xponoć", "podne", "jutro", "po pod.", "veče", "noć"], ["ponoć", "podne", "jutro", "po pod.", "uveče", "noću"], ["ponoć", k"podne", "ujutro", "po podne", "uveče", "noću"]], [["ponoć", "podne", "jutro", "popodne", "veče", "noćR1:00"], ["21o'sr-Latn-XK.js.map"Z.x,minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04cfr-PM.js.mapY)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-KE.js.mapb(x 	JE.js.map2/Hx 	SC.js.map2phx 	ZA.js.map2)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-KN.js.map(x 	SL.js.map23x:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["полн.", "полд.", "утра", "дня", "веч.", "ночи"], ["полн.", "полд.", "утра", "дня", "вечера", "ночи"], ["полночь", "полдень", "утра", "дня", "вечера", "ночи"]], [["полн.", "полд.", "утро", "день", "веч.", "ночь"], u, ["полночь", "полдень", "утро", "день", "вечер", "ночь"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=ru-KZ.js.mapKSGx8mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00601:00"], ["21:00", "06en-SX.js.map^Gx 	KY.js.map2gx 	MY.js.map2x 	RW.js.map3)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-LS.js.map(x 	NR.js.map2Hx 	PR.js.map2hx del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-CU.js.mapVDzx -	GT.js.map1o3x:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["полн.", "полд.", "утра", "дня", "веч.", "ночи"], ["полн.", "полд.", "утра", "дня", "вечера", "ночи"], ["полночь", "полдень", "утра", "дня", "вечера", "ночи"]], [["полн.", "полд.", "утро", "день", "веч.", "ночь"], u, ["полночь", "полдень", "утро", "день", "вечер", "ночь"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=ru-BY.js.mapK-SxGx8mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00601:00"], ["21:00", "06en-MV.js.mapS^Gx 	TT.js.map3gxeia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noiteZ", "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada
> 9:00"], ["19:00", "24:00"], ["00h'pt-GW.js.map0bT'x 	ST.js.map/v)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-NZ.js.map% (x 	ZW.js.map3OHxeia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noiteZ", "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada
> 9:00"], ["19:00", "24:00"], ["00h'pt-MZ.js.map0T'xdel mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["m.", "madrugada", "mañana", "tardSe", "noche"], ["mediodía", "madrugada", "mañana", "tarde", "noche"], u], ["12:00"P!20:00"], ["20:00", "24_es-PY.js.mapǩPAx <iddernacht", "’s ochtends", "’s middags", "’s avonds", "’s nachts"], u, u], [["middernacht", "ochtend", "middag", "avond", "nacht"], u, u], ["00&8:00"], ["18B;nl-SX.js.map>T)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-TZ.js.map[&(x 	SZ.js.map3(Hx del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"8, "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"]&!20:00"], ["20:00", "24qs-UY.js.mapWD)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-TK.js.map(x Apituna pyterupé", "iandé-ara-pyturepé", "kuêma ramẽ", "karuka ramẽ", "pituna ramẽ", "pitunaeté ramẽ"], u, u], u, [2 9:00"], ["19:00", "24:00"], ["00h'yrl-CO.js.mapBp)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en-VC.js.map(xponoć", "podne", "jutro", "po pod.", "veče", "noć"], ["ponoć", "podne", "jutro", "po pod.", "veče", "noću"], ["ponoć", "podne", "ujutro", "po podne", "uveče", "noću"]], [["ponoć", "podne", "jutro", "popodne", "veče", "noć"], u, u], ["00:00", psr-Latn-ME.js.mapњ[a)xg/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=en.js.map,K)xd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], ["mediodía", "madrugada", "mañana", "tarde", "noche"], u], [["m.", "madrugada", "mañana", "tarde", "noche"], ["mediodía", "madrugada", "mañana", "tarde", "noche"], u], ["12:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "20:00"], ["20:00", "24:00"]]];
//# sourceMappingURL=es-AR.js.mapʶ#x6/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana", "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "20:00"], ["20:00", "24:00"]]];
//# sourceMappingURL=es-BO.js.mapQ,޾)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-GQ.js.map>+x! !.Dh@.	SN.js.mapg
|0x M자정", "정오", "새벽", "오전", "오후", "저녁", "밤"], u, u], u, ["00:00", "12:00", ["03:00", "06:00"], ["06:00", "2)1:00"], ["21:00", "03pko-KP.js.map1>8cpx  午夜", "早上", "上午", "中午", "下午", "晚上", "凌晨"], u, u], u, ["00:00", ["05:00", "08:00"], ["08:00", "12:00"8=3:00"], ["13:00", "19:00"], ["19:00", "24:00"], ["00:00", "05pzh-Hant-MO.js.mapu Co.x !del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["mediodía", "madrugada", "mañana"*, "tarde", "noche"], u, u], ["12:00", ["00/20:00"], ["20:00", "24es-BR.js.mapC[x6 g["午夜", "清晨.4], Pns-MO.js.mapE/x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], ["m.", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], ["del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"]], [["m.", "madrugada", "mañana", "tarde", "noche"], u, ["mediodía", "madrugada", "mañana", "tarde", "noche"]], ["12:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "20:00"], ["20:00", "24:00"]]];
//# sourceMappingURL=es-CO.js.mapQ(x}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["del mediodía", "de la madrugada", "mañana", "de la tarde", "de la noche"], ["del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u], [["mediodía", "madrugada", "mañana", "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "20:00"], ["20:00", "24:00"]]];
//# sourceMappingURL=es-MX.js.map(x{/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], ["mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u], [["mediodía", "madrugada", "mañana", "tarde", "noche"], u, u], ["12:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "20:00"], ["20:00", "24:00"]]];
//# sourceMappingURL=es-PA.js.mapu&xe/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["del mediodía", "de la madrugada", "de la mañana", "de la tarde", "de la noche"], u, u], [["m.", "madrugada", "mañana", "tarde", "noche"], ["mediodía", "madrugada", "mañana", "tarde", "noche"], u], ["12:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "20:00"], ["20:00", "24:00"]]];
//# sourceMappingURL=es-VE.js.mapg}5xW/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["gauerdia", "goizald.", "goizeko", "eguerd.", "arrats.", "iluntz.", "gaueko"], u, ["gauerdia", "goizaldeko", "goizeko", "eguerdiko", "arratsaldeko", "iluntzeko", "gaueko"]], [["gauerdia", "goizald.", "goiza", "eguerd.", "arrats.", "iluntz.", "gaua"], ["gauerdia", "goiz.", "goiza", "eguerd.", "arrats.", "iluntz.", "gaua"], ["gauerdia", "goizaldea", "goiza", "eguerdia", "arratsaldea", "iluntzea", "gaua"]], ["00:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "14:00"], ["14:00", "19:00"], ["19:00", "21:00"], ["21:00", "24:00"]]];
//# sourceMappingURL=eu.js.mapdxpagi", "pagi", "tengah hari", "petang", "malam"], u, ["tengah malam", "pagi", "tengah hari", "petang", "malam"]], [["pagi", "pagi", "tengah hari", "petang", "malam"], ["tengah malam", "pagi", "tengah hari", "petang", "malam"], u], [["00:00", "01:00"], ["01D/	ms.js.mapTT|jxU{"version":3,"file":"eu.js","sourceRoot":"","sources":["eu.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,cAAc,EAAC,WAAW,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,WAAW,EAAC,OAAO,EAAC,UAAU,EAAC,aAAa,EAAC,UAAU,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"gauerdia\",\"goizald.\",\"goizeko\",\"eguerd.\",\"arrats.\",\"iluntz.\",\"gaueko\"],u,[\"gauerdia\",\"goizaldeko\",\"goizeko\",\"eguerdiko\",\"arratsaldeko\",\"iluntzeko\",\"gaueko\"]],[[\"gauerdia\",\"goizald.\",\"goiza\",\"eguerd.\",\"arrats.\",\"iluntz.\",\"gaua\"],[\"gauerdia\",\"goiz.\",\"goiza\",\"eguerd.\",\"arrats.\",\"iluntz.\",\"gaua\"],[\"gauerdia\",\"goizaldea\",\"goiza\",\"eguerdia\",\"arratsaldea\",\"iluntzea\",\"gaua\"]],[\"00:00\",[\"00:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"14:00\"],[\"14:00\",\"19:00\"],[\"19:00\",\"21:00\"],[\"21:00\",\"24:00\"]]];\n"]}" 7x
ms!ms:q"MAAM,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ
,cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ,EAAC,OAAO?'CAAC,MAAM,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ"cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQEmpagi\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],u,[\"tengah malam\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"]],[[\"pagi\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],[\"tengah malam\",\"pagi\",\"tengah hari\",\"petang\",\"malam\"],u],[[\"00:00\",\"01:00\"],[\"01:K4:00\"]]];\n"]}Q񜌽,x2/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ب", "ص", "ظ", "ع", "ش", "ن"], ["بامداد", "صبح", "ظهر", "بعدازچاشت", "شب", "نیمه‌شب"], u], [["ب", "ص", "بعد از چاشت", "ع", "ش", "ن"], ["بامداد", "صبح", "ظهر", "بعدازچاشت", "شب", "نیمه‌شب"], u], [["01:00", "04:00"], ["04:00", "12:00"], ["12:00", "13:00"], ["13:00", "19:00"], ["19:00", "24:00"], ["00:00", "01:00"]]];
//# sourceMappingURL=fa-AF.js.mapZMXxv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-BF", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "Mbuuɗu Seefaa BCEAO", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-BF.js.map塏_x export default [`)	j+x 6Adlm-BF.js.mapS9,x:{"version":3,"file":"ff-Adlm-BF.js","sourceRoot":"","sources":["ff-Adlm-BF.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-BF\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"XOF\",\"𞤅𞤊𞤀\",\"𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}
*Sx- )	eAAe,EAAE2export default [];\n"]}~d(Xxz/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-CM", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "Mbuuɗi Seefaa BEAC", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-CM.js.map!x export default [\)D	b+x 6Adlm-CM.js.mapSz4xC{"version":3,"file":"ff-Adlm-CM.js","sourceRoot":"","sources":["ff-Adlm-CM.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,YAAY,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,kBAAkB,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,oBAAoB,EAAC,oBAAoB,EAAC,cAAc,EAAC,kBAAkB,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,YAAY,EAAC,YAAY,EAAC,cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,YAAY,EAAC,YAAY,EAAC,cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,YAAY,CAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,gCAAgC,EAAC,oCAAoC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,WAAW,EAAC,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,QAAQ,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,UAAU,EAAC,8CAA8C,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,QAAQ,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,QAAQ,CAAC,EAAC,KAAK,EAAC,CAAC,QAAQ,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,UAAU,CAAC,EAAC,KAAK,EAAC,CAAC,QAAQ,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-CM\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"XAF\",\"𞤊𞤅𞤊𞤀\",\"𞤊𞤢𞤪𞤢𞤲 𞤚𞤵𞤦𞤮𞥅𞤪𞤭 𞤀𞤬𞤪𞤭𞤳𞤭𞤲𞤳𞤮\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}$RJx- )	eAAe,EAAE2export default [];\n"]}|Xxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-GH", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "GHS", "GH₵", "GHS", { "GHS": ["GH₵"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-GH.js.mapw@Rx export default [c)	p+x 6Adlm-GH.js.mapSv3Ox 3ha-GH.js.mapD{tqx 3se-SE.js.mapEx?{"version":3,"file":"ff-Adlm-GH.js","sourceRoot":"","sources":["ff-Adlm-GH.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-GH\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"GHS\",\"GH₵\",\"𞤅𞤭𞤣𞤭 𞤘𞤢𞤲𞤢𞤲𞤳𞤮\",{\"BYN\":[u,\"р.\"],\"GHS\":[\"GH₵\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}Nx- )	eAAe,EAAE	2export default [];\n"]}eDixi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["ln-AO", [["ntɔ́ngɔ́", "mpókwa"], u, u], u, [["e", "y", "m", "m", "m", "m", "p"], ["eye", "ybo", "mbl", "mst", "min", "mtn", "mps"], ["eyenga", "mokɔlɔ mwa yambo", "mokɔlɔ mwa míbalé", "mokɔlɔ mwa mísáto", "mokɔlɔ ya mínéi", "mokɔlɔ ya mítáno", "mpɔ́sɔ"], ["eye", "ybo", "mbl", "mst", "min", "mtn", "mps"]], u, [["y", "f", "m", "a", "m", "y", "y", "a", "s", "ɔ", "n", "d"], ["yan", "fbl", "msi", "apl", "mai", "yun", "yul", "agt", "stb", "ɔtb", "nvb", "dsb"], ["sánzá ya yambo", "sánzá ya míbalé", "sánzá ya mísáto", "sánzá ya mínei", "sánzá ya mítáno", "sánzá ya motóbá", "sánzá ya nsambo", "sánzá ya mwambe", "sánzá ya libwa", "sánzá ya zómi", "sánzá ya zómi na mɔ̌kɔ́", "sánzá ya zómi na míbalé"]], u, [["libóso ya", "nsima ya Y"], u, ["Yambo ya Yézu Krís", "Nsima ya Yézu Krís"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "AOA", "Kz", "Kwanza ya Angóla", { "AOA": ["Kz"], "CDF": ["FC"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ln-AO.js.map#x export default [r$	+x 3ff-Latn-GM.js.mapkH=Rx 3ps-PK.js.mapEIx 6Adlm-GM.js.mapS8x;{"version":3,"file":"ff-Adlm-GM.js","sourceRoot":"","sources":["ff-Adlm-GM.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,YAAY,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,kBAAkB,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,oBAAoB,EAAC,oBAAoB,EAAC,cAAc,EAAC,kBAAkB,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,YAAY,EAAC,YAAY,EAAC,cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,YAAY,EAAC,YAAY,EAAC,cAAc,EAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,UAAU,EAAC,YAAY,CAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,gCAAgC,EAAC,oCAAoC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,WAAW,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,QAAQ,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,+BAA+B,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,QAAQ,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,QAAQ,CAAC,EAAC,KAAK,EAAC,CAAC,QAAQ,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,UAAU,CAAC,EAAC,KAAK,EAAC,CAAC,QAAQ,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-GM\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"GMD\",\"D\",\"𞤁𞤢𞤤𞤢𞤧𞤭 𞤘𞤢𞤥𞤦𞤭𞤲𞤳𞤮\",{\"BYN\":[u,\"р.\"],\"GMD\":[\"D\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}Rx- )	eAAe,EAAE	2export default [];\n"]}eHXxv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-GW", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "Mbuuɗu Seefaa BCEAO", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-GW.js.map;hx export default [`)	j+x 6Adlm-GW.js.mapSBx:{"version":3,"file":"ff-Adlm-GW.js","sourceRoot":"","sources":["ff-Adlm-GW.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-GW\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"XOF\",\"𞤅𞤊𞤀\",\"𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}u>*DSx- )	eAAe,EAAE2export default [];\n"]}~d(Yxn/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-LR", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "LRD", "$", "Dolaar Liberiyaa", { "JPY": ["JP¥", "¥"], "LRD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-LR.js.mapx export default [h)	z+x 6Adlm-LR.js.mapSBx7{"version":3,"file":"ff-Adlm-LR.js","sourceRoot":"","sources":["ff-Adlm-LR.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-LR\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"LRD\",\"$\",\"𞤁𞤢𞤤𞤢 𞤂𞤭𞤦𞤫𞤪𞤭𞤴𞤢𞤲𞤳𞤮\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"LRD\":[\"$\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}c9Vx- )	eAAe,EAAE	2export default [];\n"]}fLYxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-MR", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "MRU", "UM", "Ugiyya Muritani", { "JPY": ["JP¥", "¥"], "MRU": ["UM"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-MR.js.map某x export default [i)	|+x 6Adlm-MR.js.mapSCOx 3so-ET.js.mapEx){"version":3,"file":"ff-Adlm-MR.js","sourceRoot":"","sources":["ff-Adlm-MR.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-MR\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"MRU\",\"UM\",\"𞤓𞤺𞤭𞤴𞤢 𞤃𞤮𞤪𞤭𞤼𞤢𞤲𞤭𞤴𞤢𞤲𞤳𞤮\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"MRU\":[\"UM\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]} gdx- )	eAAe,EAAE	2export default [];\n"]}hZXxv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-NE", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "Mbuuɗu Seefaa BCEAO", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-NE.js.mapux export default [`)	j+x 6Adlm-NE.js.mapS7x:{"version":3,"file":"ff-Adlm-NE.js","sourceRoot":"","sources":["ff-Adlm-NE.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-NE\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"XOF\",\"𞤅𞤊𞤀\",\"𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}@6*#Sx- )	eAAe,EAAE2export default [];\n"]}~d(x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-NG", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "NGN", "₦", "𞤐𞤢𞤴𞤪𞤢 𞤐𞤢𞤶𞤭𞤪𞤢𞤴𞤢𞤲𞤳𞤮", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-NG.js.mapYx export default [
)I
W+x 3se-FI.js.mapE*x{"version":3,"file":"ff-Adlm-NG.js","sourceRoot":"","sources":["ff-Adlm-NG.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-NG\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"NGN\",\"₦\",\"𞤐𞤢𞤴𞤪𞤢 𞤐𞤢𞤶𞤭𞤪𞤢𞤴𞤢𞤲𞤳𞤮\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}Dx- (	eAAe,EAAE2export default [];\n"]}RWpIx(se-FI!se-FIJYIAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb)OAAO,EAAC,CAAC,CAAC,GAAG*#*#
F*aAAa)aAAa,EAAC,WAAW,EAAC,WAAW,EAAC,WAAW,CAAC,EJR2#
4QEAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,Eg"6eAAe,EAAC,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa1$
aAAa,EAAC,aAAaQk(gBAAgB,EAAC,iBAAiBQ(
SAAS,EAAC,UAAU,EAAC,eAAeJV<MAAM$;SAASN3MAAM,E}
%}(%}
%
-}8if (n === 1)\n    return 1;\nif (n === 2)\n    return 2;T
$se-FI\",[[\"i\",\"e\"],[\"ib\",\"eb\"],u],[[\"ib\",\"eb\"],u,u],[[\"S\",\"M\",\"D\",\"G\",\"D\",\"B\",\"L\"],[\"so\",\"má\",\"di\",\"ga\",\"du\",\"be\",\"lá\"],[\"sotnabeaivi\",\"mánnodat\",\"disdat\",\"gaskavahkku\",\"duorastat\",\"bearjadat\",\"lávvordat\"],[\"so\",\"má\",\"di\",\"ga\",\"du\",\"be\",\"lá\"]],u,[[\"O\",\"G\",\"N\",\"C\",\"M\",\"G\",\"S\",\"B\",\"Č\",\"G\",\"S\",\"J\"],[\"ođđj\",\"guov\",\"njuk\",\"cuoŋ\",\"mies\",\"geas\",\"suoi\",\"borg\",\"čakč\",\"golg\",\"skáb\",\"juov\"],[\"ođđajagemánnu\",\"guovvamánnu\",\"njukčamánnu\",\"cuoŋománnu\",\"miessemánnu\",\"geassemánnu\",\"suoidnemánnu\",\"borgemánnu\",\"čakčamánnu\",\"golggotmánnu\",\"skábmamánnu\",\"juovlamánnu\"]],u,[[\"oKr.\",\"mKr.\"],u,[\"ovdal K]ristusa\",\"maŋŋel Kristusa\"]],1,[6,0],[\"dd.MM.y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM5OSu,u],[\",\",\" \",\";\",\"%\",\"+\",\"−\",\"·10^\",\"·\",\"‰\",\"∞\",\"NaN O %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"DKK\":[\"Dkr\",\"kr!hOK\":[\"kr\"],\"SEK\":[\"Skr\",\"kr\"],\"THB\":[\"฿\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}E2Yxj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-SL", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "SLL", "Le", "Lewoon Seraa Liyon", { "JPY": ["JP¥", "¥"], "SLL": ["Le"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-SL.js.map_"x export default [l)4	+x 6Adlm-SL.js.mapTCx1{"version":3,"file":"ff-Adlm-SL.js","sourceRoot":"","sources":["ff-Adlm-SL.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-SL\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"SLL\",\"Le\",\"𞤂𞤫𞤴𞤮𞤲 𞤅𞤫𞤪𞤢𞤤𞤭𞤴𞤢𞤲𞤳𞤮\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"SLL\":[\"Le\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}"x\x- )	eAAe,EAAE	2export default [];\n"]}gRx3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-SN", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XOF", "𞤅𞤊𞤀", "𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-SN.js.map<Ax export default [
)	Ox:{"version":3,"file":"ff-Adlm-SN.js","sourceRoot":"","sources":["ff-Adlm-SN.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm-SN\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"XOF\",\"𞤅𞤊𞤀\",\"𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢\",{\"BYN\":[u,\"р.\"],\"GNF\":[u,\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}*MSx- )	eAAe,EAAE2export default [];\n"]}~d(xz{"version":3,"file":"ff-Adlm.js","sourceRoot":"","sources":["ff-Adlm.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"ff-Adlm\",[[\"𞤢\",\"𞤩\"],[\"𞤀𞤎\",\"𞤇𞤎\"],u],[[\"𞤀𞤎\",\"𞤇𞤎\"],u,u],[[\"𞤈\",\"𞤀𞥄\",\"𞤃\",\"𞤔\",\"𞤐\",\"𞤃\",\"𞤖\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"],[\"𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫\",\"𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫\",\"𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫\",\"𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫\",\"𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫\",\"𞤃𞤢𞤱𞤲𞤣𞤫\",\"𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫\"],[\"𞤈𞤫𞤬\",\"𞤀𞥄𞤩𞤵\",\"𞤃𞤢𞤦\",\"𞤔𞤫𞤧\",\"𞤐𞤢𞥄𞤧\",\"𞤃𞤢𞤣\",\"𞤖𞤮𞤪\"]],u,[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"],u],[[\"𞤅\",\"𞤕\",\"𞤄\",\"𞤅\",\"𞤁\",\"𞤑\",\"𞤃\",\"𞤔\",\"𞤅\",\"𞤒\",\"𞤔\",\"𞤄\"],[\"𞤅𞤭𞥅𞤤\",\"𞤕𞤮𞤤\",\"𞤐𞤦𞤮𞥅𞤴\",\"𞤅𞤫𞥅𞤼\",\"𞤁𞤵𞥅𞤶\",\"𞤑𞤮𞤪\",\"𞤃𞤮𞤪\",\"𞤔𞤵𞤳\",\"𞤅𞤭𞤤\",\"𞤒𞤢𞤪\",\"𞤔𞤮𞤤\",\"𞤄𞤮𞤱\"],[\"𞤅𞤭𞥅𞤤𞤮\",\"𞤕𞤮𞤤𞤼𞤮\",\"𞤐𞤦𞤮𞥅𞤴𞤮\",\"𞤅𞤫𞥅𞤼𞤮\",\"𞤁𞤵𞥅𞤶𞤮\",\"𞤑𞤮𞤪𞤧𞤮\",\"𞤃𞤮𞤪𞤧𞤮\",\"𞤔𞤵𞤳𞤮\",\"𞤅𞤭𞤤𞤼𞤮\",\"𞤒𞤢𞤪𞤳𞤮\",\"𞤔𞤮𞤤𞤮\",\"𞤄𞤮𞤱𞤼𞤮\"]],[[\"𞤀𞤀𞤋\",\"𞤇𞤀𞤋\"],u,[\"𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\",\"𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄\"]],1,[6,0],[\"d-M-y\",\"d MMM⹁ y\",\"d MMMM⹁ y\",\"EEEE d MMMM⹁ y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 𞤉 {0}\",u],[\".\",\"⹁\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"𞤏𞤮𞤈\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"GNF\",\"FG\",\"𞤊𞤢𞤪𞤢𞤲 𞤘𞤭𞤲𞤫𞤲𞤳𞤮\",{\"BYN\":[u,\"р.\"],\"GNF\":[\"FG\",\"𞤊𞤘\"],\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"𞤐𞤐𞤘\",\"₦\"],\"PGK\":[\"𞤑𞤆𞤘\"],\"PHP\":[\"𞤆𞤆𞤖\",\"₱\"],\"USD\":[\"US$\",\"$\"],\"XAF\":[\"𞤊𞤅𞤊𞤀\"],\"XOF\":[\"𞤅𞤊𞤀\"]},\"rtl\", plural];\n"]}x- )	eAAe,EAAE2export default [];\n"]}pִxk/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// **Note**: Locale files are generated through Bazel and never part of the sources. This is an
// exception for backwards compatibility. With the Gulp setup we never deleted old locale files
// when updating CLDR, so older locale files which have been removed, or renamed in the CLDR
// data remained in the repository. We keep these files checked-in until the next major to avoid
// potential breaking changes. It's worth noting that the locale data for such files is outdated
// anyway. e.g. the data is missing the directionality, throwing off the indices.
const u = undefined;
function plural(n) {
    let i = Math.floor(Math.abs(n));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default [
    'ff-CM',
    [['subaka', 'kikiiɗe'], u, u],
    u,
    [
        ['d', 'a', 'm', 'n', 'n', 'm', 'h'],
        ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],
        ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],
        ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],
    ],
    u,
    [
        ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],
        ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],
        [
            'siilo',
            'colte',
            'mbooy',
            'seeɗto',
            'duujal',
            'korse',
            'morso',
            'juko',
            'siilto',
            'yarkomaa',
            'jolal',
            'bowte',
        ],
    ],
    u,
    [['H-I', 'C-I'], u, ['Hade Iisa', 'Caggal Iisa']],
    1,
    [6, 0],
    ['d/M/y', 'd MMM, y', 'd MMMM y', 'EEEE d MMMM y'],
    ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
    ['{1} {0}', u, u, u],
    [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
    ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
    'FCFA',
    'Mbuuɗi Seefaa BEAC',
    { 'JPY': ['JP¥', '¥'], 'USD': ['US$', '$'] },
    plural,
];
//# sourceMappingURL=ff-CM.js.mapb"x export default [p$	%MxU˱2
(function (global) {
  global.ng = global.ng || {};
  global.ng.common = global.ng.common || {};
  global.ng.common.locales = 9global.ng.common.locales || {};
  const u = undefined;
  Un'  }
  root.ng.common.locales['ff-cm'] =G+8G[ND:\[
'colte',
        'mbooy',
'duujal',
        'korse',
'juko',
        'siilto',
^'jolal',
        'bowte',
6*},
    plural,
    [],
  ];
})(
  (typeof globalThis !== 'undefined' && globalThis) ||
    (typeof global !== 'undefined' && gl;obal) ||
    (typeof window !== 'undefined' && window),
);
Gx{"version":3,"file":"ff-CM.js","sourceRoot":"","sources":["ff-CM.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+FAA+F;AAC/F,+FAA+F;AAC/F,4FAA4F;AAC5F,gGAAgG;AAChG,gGAAgG;AAChG,iFAAiF;AAEjF,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,CAAS;IACvB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,eAAe;IACb,OAAO;IACP,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD;QACE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACnC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACjD,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC;QAChF,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KAClD;IACD,CAAC;IACD;QACE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC5D,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACpF;YACE,OAAO;YACP,OAAO;YACP,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,OAAO;YACP,OAAO;YACP,MAAM;YACN,QAAQ;YACR,UAAU;YACV,OAAO;YACP,OAAO;SACR;KACF;IACD,CAAC;IACD,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC;IAClD,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,CAAC;IACpD,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAC9D,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC;IAC5C,MAAM;IACN,oBAAoB;IACpB,EAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAC;IAC1C,MAAM;CACP,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// **Note**: Locale files are generated through Bazel and never part of the sources. This is an\n// exception for backwards compatibility. With the Gulp setup we never deleted old locale files\n// when updating CLDR, so older locale files which have been removed, or renamed in the CLDR\n// data remained in the repository. We keep these files checked-in until the next major to avoid\n// potential breaking changes. It's worth noting that the locale data for such files is outdated\n// anyway. e.g. the data is missing the directionality, throwing off the indices.\n\nconst u = undefined;\n\nfunction plural(n: number): number {\n  let i = Math.floor(Math.abs(n));\n  if (i === 0 || i === 1) return 1;\n  return 5;\n}\n\nexport default [\n  'ff-CM',\n  [['subaka', 'kikiiɗe'], u, u],\n  u,\n  [\n    ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n    ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n    ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n    ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  ],\n  u,\n  [\n    ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n    ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n    [\n      'siilo',\n      'colte',\n      'mbooy',\n      'seeɗto',\n      'duujal',\n      'korse',\n      'morso',\n      'juko',\n      'siilto',\n      'yarkomaa',\n      'jolal',\n      'bowte',\n    ],\n  ],\n  u,\n  [['H-I', 'C-I'], u, ['Hade Iisa', 'Caggal Iisa']],\n  1,\n  [6, 0],\n  ['d/M/y', 'd MMM, y', 'd MMMM y', 'EEEE d MMMM y'],\n  ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],\n  ['{1} {0}', u, u, u],\n  [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],\n  ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],\n  'FCFA',\n  'Mbuuɗi Seefaa BEAC',\n  {'JPY': ['JP¥', '¥'], 'USD': ['US$', '$']},\n  plural,\n];\n"]}j^Rx- 	eAAe,EAAE;?export default [];\n"]}s5xn/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// **Note**: Locale files are generated through Bazel and never part of the sources. This is an
// exception for backwards compatibility. With the Gulp setup we never deleted old locale files
// when updating CLDR, so older locale files which have been removed, or renamed in the CLDR
// data remained in the repository. We keep these files checked-in until the next major to avoid
// potential breaking changes. It's worth noting that the locale data for such files is outdated
// anyway. e.g. the data is missing the directionality, throwing off the indices.
const u = undefined;
function plural(n) {
    let i = Math.floor(Math.abs(n));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default [
    'ff-GN',
    [['subaka', 'kikiiɗe'], u, u],
    u,
    [
        ['d', 'a', 'm', 'n', 'n', 'm', 'h'],
        ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],
        ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],
        ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],
    ],
    u,
    [
        ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],
        ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],
        [
            'siilo',
            'colte',
            'mbooy',
            'seeɗto',
            'duujal',
            'korse',
            'morso',
            'juko',
            'siilto',
            'yarkomaa',
            'jolal',
            'bowte',
        ],
    ],
    u,
    [['H-I', 'C-I'], u, ['Hade Iisa', 'Caggal Iisa']],
    1,
    [6, 0],
    ['d/M/y', 'd MMM, y', 'd MMMM y', 'EEEE d MMMM y'],
    ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
    ['{1} {0}', u, u, u],
    [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
    ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
    'FG',
    'GNF',
    { 'GNF': ['FG'], 'JPY': ['JP¥', '¥'], 'USD': ['US$', '$'] },
    plural,
];
//# sourceMappingURL=ff-GN.js.map~_Yx export default [m$	%JxU˱2
(function (global) {
  global.ng = global.ng || {};
  global.ng.common = global.ng.common || {};
  global.ng.common.locales = 9global.ng.common.locales || {};
  const u = undefined;
  Un'  }
  root.ng.common.locales['ff-gn'] =G+8G[ND:\[
'colte',
        'mbooy',
'duujal',
        'korse',
'juko',
        'siilto',
^'jolal',
        'bowte',
$9},
    plural,
    [],
  ];
})(
  (typeof globalThis !== 'undefined' && globalThis) ||
    (typeof global !== 'undefined' && gl;obal) ||
    (typeof window !== 'undefined' && window),
);
0̷xh{"version":3,"file":"ff-GN.js","sourceRoot":"","sources":["ff-GN.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+FAA+F;AAC/F,+FAA+F;AAC/F,4FAA4F;AAC5F,gGAAgG;AAChG,gGAAgG;AAChG,iFAAiF;AAEjF,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,CAAS;IACvB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,eAAe;IACb,OAAO;IACP,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD;QACE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACnC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACjD,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC;QAChF,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KAClD;IACD,CAAC;IACD;QACE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC5D,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACpF;YACE,OAAO;YACP,OAAO;YACP,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,OAAO;YACP,OAAO;YACP,MAAM;YACN,QAAQ;YACR,UAAU;YACV,OAAO;YACP,OAAO;SACR;KACF;IACD,CAAC;IACD,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC;IAClD,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,CAAC;IACpD,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAC9D,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC;IAC5C,IAAI;IACJ,KAAK;IACL,EAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAC;IACzD,MAAM;CACP,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// **Note**: Locale files are generated through Bazel and never part of the sources. This is an\n// exception for backwards compatibility. With the Gulp setup we never deleted old locale files\n// when updating CLDR, so older locale files which have been removed, or renamed in the CLDR\n// data remained in the repository. We keep these files checked-in until the next major to avoid\n// potential breaking changes. It's worth noting that the locale data for such files is outdated\n// anyway. e.g. the data is missing the directionality, throwing off the indices.\n\nconst u = undefined;\n\nfunction plural(n: number): number {\n  let i = Math.floor(Math.abs(n));\n  if (i === 0 || i === 1) return 1;\n  return 5;\n}\n\nexport default [\n  'ff-GN',\n  [['subaka', 'kikiiɗe'], u, u],\n  u,\n  [\n    ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n    ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n    ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n    ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  ],\n  u,\n  [\n    ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n    ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n    [\n      'siilo',\n      'colte',\n      'mbooy',\n      'seeɗto',\n      'duujal',\n      'korse',\n      'morso',\n      'juko',\n      'siilto',\n      'yarkomaa',\n      'jolal',\n      'bowte',\n    ],\n  ],\n  u,\n  [['H-I', 'C-I'], u, ['Hade Iisa', 'Caggal Iisa']],\n  1,\n  [6, 0],\n  ['d/M/y', 'd MMM, y', 'd MMMM y', 'EEEE d MMMM y'],\n  ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],\n  ['{1} {0}', u, u, u],\n  [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],\n  ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],\n  'FG',\n  'GNF',\n  {'GNF': ['FG'], 'JPY': ['JP¥', '¥'], 'USD': ['US$', '$']},\n  plural,\n];\n"]}Fa%x- 	eAAe,EAAEV?export default [];\n"]}d`x1{"version":3,"file":"ta-LK.js","sourceRoot":"","sources":["ta-LK.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,qBAAqB,EAAC,cAAc,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,eAAe,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,eAAe,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ta-LK\",[[\"மு.ப\",\"பி.ப\"],[\"முற்பகல்\",\"பிற்பகல்\"],u],u,[[\"ஞா\",\"தி\",\"செ\",\"பு\",\"வி\",\"வெ\",\"ச\"],[\"ஞாயி.\",\"திங்.\",\"செவ்.\",\"புத.\",\"வியா.\",\"வெள்.\",\"சனி\"],[\"ஞாயிறு\",\"திங்கள்\",\"செவ்வாய்\",\"புதன்\",\"வியாழன்\",\"வெள்ளி\",\"சனி\"],[\"ஞா\",\"தி\",\"செ\",\"பு\",\"வி\",\"வெ\",\"ச\"]],u,[[\"ஜ\",\"பி\",\"மா\",\"ஏ\",\"மே\",\"ஜூ\",\"ஜூ\",\"ஆ\",\"செ\",\"அ\",\"ந\",\"டி\"],[\"ஜன.\",\"பிப்.\",\"மார்.\",\"ஏப்.\",\"மே\",\"ஜூன்\",\"ஜூலை\",\"ஆக.\",\"செப்.\",\"அக்.\",\"நவ.\",\"டிச.\"],[\"ஜனவரி\",\"பிப்ரவரி\",\"மார்ச்\",\"ஏப்ரல்\",\"மே\",\"ஜூன்\",\"ஜூலை\",\"ஆகஸ்ட்\",\"செப்டம்பர்\",\"அக்டோபர்\",\"நவம்பர்\",\"டிசம்பர்\"]],u,[[\"கி.மு.\",\"கி.பி.\"],u,[\"கிறிஸ்துவுக்கு முன்\",\"அன்னோ டோமினி\"]],1,[6,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} அன்று {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤ #,##,##0.00\",\"#E0\"],\"LKR\",\"Rs.\",\"இலங்கை ரூபாய்\",{\"BYN\":[u,\"р.\"],\"LKR\":[\"Rs.\",\"Rs\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}0`\x
ff-Latn-CM!
ff-Latn-CM@EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,<YAAY,EAAC,C/
(P
Pn
L
L
L
L
L
$MAAM,E"WAAW0_L
L
L
L
L
KAAK$
(P
P
P
P
P
P
Pn
L
L
L
L
L
L
L
L
L
L
$


"QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO$KAAK
WAAW,EAAC,aAAa=UAAU,EAAC,eAAe$CSAAS,E,2P
P
P
P
P
WAAW03MAAM,EAAC,oBAAoBZ

GAAG4, i = Math.floor(Math.abs(val));\n\nif (i === 0 || i:ff-Latn-CM\",[[\"subaka\",\"kikiiɗe\"],u,u],u,[[\"d\",\"a\",\"m\",\"n\",\"n\",\"m\",\"h\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"],[\"dewo\",\"aaɓnde\",\"mawbaare\",\"njeslaare\",\"naasaande\",\"mawnde\",\"hoore-biir\"],[\"dew\",\"aaɓ\",\"maw\",\"nje\",\"naa\",\"mwd\",\"hbi\"]],u,[[\"s\",\"c\",\"m\",\"s\",\"d\",\"k\",\"m\",\"j\",\"s\",\"y\",\"j\",\"b\"],[\"sii\",\"col\",\"mbo\",\"see\",\"duu\",\"kor\",\"mor\",\"juk\",\"slt\",\"yar\",\"jol\",\"bow\"],[\"siilo\",\"colte\",\"mbooy\",\"seeɗto\",\"duujal\",\"korse\",\"morso\",\"juko\",\"siilto\",\"yarkomaa\",\"jolal\",\"bowte\"]],u,[[\"H-I\",\"C-I\"],u,[\"Hade) Iisa\",\"Caggal Iisa\"]],1,[6,0],[\"d/M/ y\",\"EEEE d MMMMF {0}\",u,u,u],[\",\",\" N0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"XAF\",\"FCFA\",\"Mbuuɗi Seefaa BEAC\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$!\",\"$\"]},\"ltr\", plural];\n"]}cƏx- 	eAAe,EAAE2export default [];\n"]}Z
Xx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-GN", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "GNF", "FG", "GNF", { "GNF": ["FG"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-GN.js.maptkx export default [Y)	\Yxn/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-NG", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "NGN", "₦", "Nayraa Nijeriyaa", { "JPY": ["JP¥", "¥"], "NGN": ["₦"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-NG.js.maphx export default [h)	z+x 3yo-BJ.js.mapEx^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// **Note**: Locale files are generated through Bazel and never part of the sources. This is an
// exception for backwards compatibility. With the Gulp setup we never deleted old locale files
// when updating CLDR, so older locale files which have been removed, or renamed in the CLDR
// data remained in the repository. We keep these files checked-in until the next major to avoid
// potential breaking changes. It's worth noting that the locale data for such files is outdated
// anyway. e.g. the data is missing the directionality, throwing off the indices.
const u = undefined;
function plural(n) {
    let i = Math.floor(Math.abs(n));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default [
    'ff-MR',
    [['subaka', 'kikiiɗe'], u, u],
    u,
    [
        ['d', 'a', 'm', 'n', 'n', 'm', 'h'],
        ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],
        ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],
        ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],
    ],
    u,
    [
        ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],
        ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],
        [
            'siilo',
            'colte',
            'mbooy',
            'seeɗto',
            'duujal',
            'korse',
            'morso',
            'juko',
            'siilto',
            'yarkomaa',
            'jolal',
            'bowte',
        ],
    ],
    u,
    [['H-I', 'C-I'], u, ['Hade Iisa', 'Caggal Iisa']],
    1,
    [6, 0],
    ['d/M/y', 'd MMM, y', 'd MMMM y', 'EEEE d MMMM y'],
    ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'],
    ['{1} {0}', u, u, u],
    [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
    ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
    'UM',
    'Ugiyya Muritani',
    { 'JPY': ['JP¥', '¥'], 'MRU': ['UM'], 'USD': ['US$', '$'] },
    plural,
];
//# sourceMappingURL=ff-MR.js.mapjTf/x export default [}$	%ZxU˱2
(function (global) {
  global.ng = global.ng || {};
  global.ng.common = global.ng.common || {};
  global.ng.common.locales = 9global.ng.common.locales || {};
  const u = undefined;
  Un'  }
  root.ng.common.locales['ff-mr'] =G+8G[ND:\[
'colte',
        'mbooy',
'duujal',
        'korse',
'juko',
        'siilto',
^'jolal',
        'bowte',
49},
    plural,
    [],
  ];
})(
  (typeof globalThis !== 'undefined' && globalThis) ||
    (typeof global !== 'undefined' && gl;obal) ||
    (typeof window !== 'undefined' && window),
);
xS{"version":3,"file":"ff-MR.js","sourceRoot":"","sources":["ff-MR.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+FAA+F;AAC/F,+FAA+F;AAC/F,4FAA4F;AAC5F,gGAAgG;AAChG,gGAAgG;AAChG,iFAAiF;AAEjF,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,CAAS;IACvB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,eAAe;IACb,OAAO;IACP,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD;QACE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACnC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACjD,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC;QAChF,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KAClD;IACD,CAAC;IACD;QACE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC5D,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACpF;YACE,OAAO;YACP,OAAO;YACP,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,OAAO;YACP,OAAO;YACP,MAAM;YACN,QAAQ;YACR,UAAU;YACV,OAAO;YACP,OAAO;SACR;KACF;IACD,CAAC;IACD,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC;IAClD,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,CAAC;IACxD,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAC9D,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC;IAC5C,IAAI;IACJ,iBAAiB;IACjB,EAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAC;IACzD,MAAM;CACP,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// **Note**: Locale files are generated through Bazel and never part of the sources. This is an\n// exception for backwards compatibility. With the Gulp setup we never deleted old locale files\n// when updating CLDR, so older locale files which have been removed, or renamed in the CLDR\n// data remained in the repository. We keep these files checked-in until the next major to avoid\n// potential breaking changes. It's worth noting that the locale data for such files is outdated\n// anyway. e.g. the data is missing the directionality, throwing off the indices.\n\nconst u = undefined;\n\nfunction plural(n: number): number {\n  let i = Math.floor(Math.abs(n));\n  if (i === 0 || i === 1) return 1;\n  return 5;\n}\n\nexport default [\n  'ff-MR',\n  [['subaka', 'kikiiɗe'], u, u],\n  u,\n  [\n    ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n    ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n    ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n    ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  ],\n  u,\n  [\n    ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n    ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n    [\n      'siilo',\n      'colte',\n      'mbooy',\n      'seeɗto',\n      'duujal',\n      'korse',\n      'morso',\n      'juko',\n      'siilto',\n      'yarkomaa',\n      'jolal',\n      'bowte',\n    ],\n  ],\n  u,\n  [['H-I', 'C-I'], u, ['Hade Iisa', 'Caggal Iisa']],\n  1,\n  [6, 0],\n  ['d/M/y', 'd MMM, y', 'd MMMM y', 'EEEE d MMMM y'],\n  ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'],\n  ['{1} {0}', u, u, u],\n  [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],\n  ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],\n  'UM',\n  'Ugiyya Muritani',\n  {'JPY': ['JP¥', '¥'], 'MRU': ['UM'], 'USD': ['US$', '$']},\n  plural,\n];\n"]}0j$:x- 	eAAe,EAAE[?export default [];\n"]}hJzpx{"version":3,"file":"fi.js","sourceRoot":"","sources":["fi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO,CAAC,EAAC,CAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,CAAC,EAAC,CAAC,YAAY,EAAC,eAAe,EAAC,SAAS,EAAC,cAAc,EAAC,cAAc,EAAC,SAAS,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,IAAI,CAAC,EAAC,CAAC,SAAS,EAAC,YAAY,EAAC,MAAM,EAAC,WAAW,EAAC,WAAW,EAAC,MAAM,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"ky.\",\"kp.\",\"aamulla\",\"ap.\",\"ip.\",\"illalla\",\"yöllä\"],[\"keskiyöllä\",\"keskip.\",\"aamulla\",\"aamup.\",\"iltap.\",\"illalla\",\"yöllä\"],[\"keskiyöllä\",\"keskipäivällä\",\"aamulla\",\"aamupäivällä\",\"iltapäivällä\",\"illalla\",\"yöllä\"]],[[\"ky.\",\"kp.\",\"aamu\",\"ap.\",\"ip.\",\"ilta\",\"yö\"],[\"keskiyö\",\"keskip.\",\"aamu\",\"aamup.\",\"iltap.\",\"ilta\",\"yö\"],[\"keskiyö\",\"keskipäivä\",\"aamu\",\"aamupäivä\",\"iltapäivä\",\"ilta\",\"yö\"]],[\"00:00\",\"12:00\",[\"05:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"23:00\"],[\"23:00\",\"05:00\"]]];\n"]}L9xj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["hatinggabi", "tanghaling-tapat", "umaga", "madaling-araw", "sa hapon", "sa gabi", "gabi"], ["hatinggabi", "tanghaling-tapat", "nang umaga", "madaling-araw", "tanghali", "ng hapon", "gabi"], ["hatinggabi", "tanghaling-tapat", "nang umaga", "madaling-araw", "tanghali", "ng hapon", "ng gabi"]], [["hatinggabi", "tanghaling-tapat", "umaga", "madaling-araw", "tanghali", "gabi", "gabi"], ["hatinggabi", "tanghaling-tapat", "umaga", "madaling-araw", "tanghali", "hapon", "gabi"], u], ["00:00", "12:00", ["00:00", "06:00"], ["06:00", "12:00"], ["12:00", "16:00"], ["16:00", "18:00"], ["18:00", "24:00"]]];
//# sourceMappingURL=fil.js.mapvxm{"version":3,"file":"sw-UG.js","sourceRoot":"","sources":["sw-UG.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"usiku\",\"mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"adhuhuri\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"]],[[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"adhuhuri\",\"alfajiri\",\"asubuhi\",\"alasiri\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"]],[\"00:00\",\"12:00\",[\"04:00\",\"07:00\"],[\"07:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"19:00\"],[\"19:00\",\"04:00\"]]];\n"]}O-o#zx2
gsw-LI!gsw-LI@qaAAaJaAAa,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,aAAa8aAAa,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,E"
Mitternacht\",\"am Morge\",\"zmittag\",\"am Namittag\",\"zaabig\",\"znacht\"],u,u],[[\"Mitternacht\",\"am Morge\",\"zmittag\",\"am Namittag\",\"zaabig\",\"znacht\"],u,[\"Mitternacht\",\"Morge\",\"Mittag\",\"Namittag\",\"Aabig\",\"Nacht\"]],[\"00:00\",[\"r05:00\",\"12:00\"],[\"12:00\",\"14:00\"],[\"14:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}%AxT

fr-TG!fr-TGBq6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAMM:QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU,C6QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAMM6QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM}MOminuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"s+oir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04,4:00\"]]];\n"]}.cx( 
o-DK"o-DK@bEAAE~B];\n"]})xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-BE.js.map-)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-BF.js.map.+x 	NC.js.map2,x3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], ["min.", "midi", "mat.", "ap.m.", "soir", "nuit"], ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["min.", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-RE.js.mapYx! Q@!0	BI.js.mapw	ݾ)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-BJ.js.map'2xr{"version":3,"file":"yo-BJ.js","sourceRoot":"","sources":["yo-BJ.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"yo-BJ\",[[\"Àárɔ̀\",\"Ɔ̀sán\"],u,u],u,[[\"À\",\"A\",\"Ì\",\"Ɔ\",\"Ɔ\",\"Ɛ\",\"À\"],[\"Àìk\",\"Aj\",\"Ìsɛ́g\",\"Ɔjɔ́r\",\"Ɔjɔ́b\",\"Ɛt\",\"Àbám\"],[\"Ɔjɔ́ Àìkú\",\"Ɔjɔ́ Ajé\",\"Ɔjɔ́ Ìsɛ́gun\",\"Ɔjɔ́rú\",\"Ɔjɔ́bɔ\",\"Ɔjɔ́ Ɛtì\",\"Ɔjɔ́ Àbámɛ́ta\"],[\"Àìk\",\"Aj\",\"Ìsɛ́g\",\"Ɔjɔ́r\",\"Ɔjɔ́b\",\"Ɛt\",\"Àbám\"]],[[\"À\",\"A\",\"Ì\",\"Ɔ\",\"Ɔ\",\"Ɛ\",\"À\"],[\"Àìk\",\"Aj\",\"Ìsɛ́g\",\"Ɔjɔ́r\",\"Ɔjɔ́b\",\"Ɛt\",\"Àbám\"],[\"Àìkú\",\"Ajé\",\"Ìsɛ́gun\",\"Ɔjɔ́rú\",\"Ɔjɔ́bɔ\",\"Ɛtì\",\"Àbámɛ́ta\"],[\"Àìk\",\"Aj\",\"Ìsɛ́g\",\"Ɔjɔ́r\",\"Ɔjɔ́b\",\"Ɛt\",\"Àbám\"]],[[\"S\",\"È\",\"Ɛ\",\"Ì\",\"Ɛ̀\",\"Ò\",\"A\",\"Ò\",\"O\",\"Ɔ̀\",\"B\",\"Ɔ̀\"],[\"Shɛ́r\",\"Èrèl\",\"Ɛrɛ̀n\",\"Ìgb\",\"Ɛ̀bi\",\"Òkú\",\"Agɛ\",\"Ògú\",\"Owe\",\"Ɔ̀wà\",\"Bél\",\"Ɔ̀pɛ\"],[\"Oshù Shɛ́rɛ́\",\"Oshù Èrèlè\",\"Oshù Ɛrɛ̀nà\",\"Oshù Ìgbé\",\"Oshù Ɛ̀bibi\",\"Oshù Òkúdu\",\"Oshù Agɛmɔ\",\"Oshù Ògún\",\"Oshù Owewe\",\"Oshù Ɔ̀wàrà\",\"Oshù Bélú\",\"Oshù Ɔ̀pɛ̀\"]],[[\"S\",\"È\",\"Ɛ\",\"Ì\",\"Ɛ̀\",\"Ò\",\"A\",\"Ò\",\"O\",\"Ɔ̀\",\"B\",\"Ɔ̀\"],[\"Shɛ́\",\"Èr\",\"Ɛr\",\"Ìg\",\"Ɛ̀b\",\"Òk\",\"Ag\",\"Òg\",\"Ow\",\"Ɔ̀w\",\"Bé\",\"Ɔ̀p\"],[\"Shɛ́rɛ́\",\"Èrèlè\",\"Ɛrɛ̀nà\",\"Ìgbé\",\"Ɛ̀bibi\",\"Òkúdu\",\"Agɛmɔ\",\"Ògún\",\"Owewe\",\"Ɔ̀wàrà\",\"Bélú\",\"Ɔ̀pɛ̀\"]],[[\"BCE\",\"AD\"],u,[\"Saju Kristi\",\"Lehin Kristi\"]],1,[6,0],[\"d/M/y\",\"d MM y\",\"d MMM y\",\"EEEE, d MMM y\"],[\"H:m\",\"H:m:s\",\"H:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"XOF\",\"F CFA\",\"Faransì ìwɔ̀-oorùn Afíríkà\",{\"JPY\":[\"JP¥\",\"¥\"],\"NGN\":[\"₦\"],\"RUB\":[\"₽\"]},\"ltr\", plural];\n"]}Y'xp%
fr$fr=`eAAe,CAAC,CAAC,CwMAAM/
$UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAUwMAAM/

YAAY,EAAC,MAAM}~

C ~
 ~
 ~
 CAAC_	7export default [[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soir\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"04:00\"]]];\n"]}sx:%rl-VE"rl-VE@QAAQ




KAAKn$iBAAiB,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO




KAAKA$(P(P#CM
M
M
M
M
M
M
M
M


6UAAU,EAAC,OAAO,EAAC,IAAI,EAAC,SAAS,EAAC,UAAU,EAAC,aAAa5B#MAAM/
gBAAgB,EAAC,eAAeA=
&SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CaAAa,EAAC,gBAAgBoYAAYMAAM,EAAC,wBAAwC
CAAC	-CAAC$MAAM,CCAAC$MAAM,CCAAC	-CCC	CAAC,CAACL	rl-VE\",[[\"a. m.\",\"p. m.\"],u,u],u,[[\"M\",\"M\",\"M\",\"M\",\"S\",\"Y\",\"S\"],[\"mit\",\"mur\",\"mmk\",\"mms\",\"sup\",\"yuk\",\"sau\"],[\"mituú\",\"murakipí\",\"murakí-mukũi\",\"murakí-musapíri\",\"supapá\",\"yukuakú\",\"saurú\"],[\"mit\",\"mur\",\"mmk\",\"mms\",\"sup\",\"yuk\",\"sau\"]],u,[[\"Y\",\"M\",\"M\",\"I\",\"P\",\"P\",\"P\",\"P\",\"P\",\"Y\",\"Y\",\"Y\"],[\"ye\",\"mk\",\"ms\",\"id\",\"pu\",\"py\",\"pm\",\"ps\",\"pi\",\"yp\",\"yy\",\"ym\"],[\"yepé\",\"mukũi\",\"musapíri\",\"irũdí\",\"pú\",\"pú-yepé\",\"pú-mukũi\",\"pú-musapíri\",\"pú-irũdí\",\"yepé-putimaã\",\"yepé-yepé\",\"yepé-muki\"]],u,[[\"K.s.\",\"K.a.\"],u,[\"Kiristu senũdé\",\"Kiristu ariré\"]],0,[6,0],[\"dd/MM/y\",\"d MMM y\",\"d MMMM y\",\"EEEEC, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a\ ,\",\".e #,##0.00\",\"#E0\"],\"VES\",\"Bs.S\",\"Buriwari Wenesuerawara\",{\"AUD\":[\"AU$\",\"$\"],\"BOB\":[\"BUB\",\"Bs\"],\"BYN\":[u, \"p.\"],\"COP\":[\"$\",\"COP\"],8PHP\":[u,\"₱\"],\"PTE\":[\"Esc.\"],\"RON\":[u,\"L\"],\"SCR\":[\"SCRu\"],\"SYP\":[u,\"S£\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VES\":[\"Bs.S\",\"VES\"],\"XAF\":[\"FCF\"],\"XOF\":[\"CFA\"],\"XPF\":[\"CFP\"],\"ZMW\":[u,\"Zk\"]},\"ltr\", plural];\n"]}9)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-BL.js.map742x#/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "après-midi", "soir", "mat."], ["minuit", "midi", "du mat.", "après-midi", "du soir", "du mat."], ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "après-midi", "soir", "mat."], ["minuit", "midi", "mat.", "après-midi", "soir", "nuit"], ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-CA.js.map/x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["min.", "midi", "mat.", "ap.m.", "soir", "nuit"], ["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["min.", "midi", "mat.", "ap.m.", "soir", "nuit"], ["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-CD.js.map<)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-CG.js.map0+x 	GF.js.map2Kx 	SC.js.map2*xU/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["min.", "midi", "du mat.", "de l’ap.m.", "du soir", "du mat."], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["min.", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-CH.js.mapԾ)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-MG.js.mapr:+x 	CI.js.map2Kx 	PF.js.map2)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-CM.js.mapH6)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-DJ.js.map94)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-DZ.js.mapD)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-GA.js.map.)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-GN.js.mapt;+x 	KM.js.map2)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-GP.js.map=*x_/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "de la nuit"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-HT.js.mapƾ)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-LU.js.mapG)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-MA.js.mapB4)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-MF.js.mapj9)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-ML.js.map?)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-MQ.js.mapD)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-MR.js.mapE7x{/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["midn.", "på morg.", "på förm.", "på efterm.", "på kvällen", "på natten"], ["midnatt", "på morg.", "på förm.", "på efterm.", "på kvällen", "på natten"], ["midnatt", "på morgonen", "på förmiddagen", "på eftermiddagen", "på kvällen", "på natten"]], [["midn.", "morg.", "förm.", "efterm.", "kväll", "natt"], ["midnatt", "morgon", "förm.", "efterm.", "kväll", "natt"], ["midnatt", "morgon", "förmiddag", "eftermiddag", "kväll", "natt"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=sv-AX.js.mapCwbx0 nuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04D4Qfr-MU.js.map=YZlx>{"version":3,"file":"sv-AX.js","sourceRoot":"","sources":["sv-AX.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,WAAW,CAAC,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,WAAW,CAAC,EAAC,CAAC,SAAS,EAAC,aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"midn.\",\"på morg.\",\"på förm.\",\"på efterm.\",\"på kvällen\",\"på natten\"],[\"midnatt\",\"på morg.\",\"på förm.\",\"på efterm.\",\"på kvällen\",\"på natten\"],[\"midnatt\",\"på morgonen\",\"på förmiddagen\",\"på eftermiddagen\",\"på kvällen\",\"på natten\"]],[[\"midn.\",\"morg.\",\"förm.\",\"efterm.\",\"kväll\",\"natt\"],[\"midnatt\",\"morgon\",\"förm.\",\"efterm.\",\"kväll\",\"natt\"],[\"midnatt\",\"morgon\",\"förmiddag\",\"eftermiddag\",\"kväll\",\"natt\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}5	$NxK
fr-MU!fr-MU@qQAAQ,EAAC,MAAM,EAAC,MAAM?EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,UAAU,EAAC,iBAAiB,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,J
6EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,YAAY,EAAC,MAAMI)rsQnuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"du matin\",\"de l’après-midi\",\"du soir\",\"du matin\"]],[[\"minuit\",\"midi\",\"mat.\",\"ap.m.\",\"soir\",\"nuit\"],u,[\"minuit\",\"midi\",\"matin\",\"après-midi\",\"soi)r\",\"nuit\"]],[\"00:00\",\"12:00\",[\"04gK4:00\"]]];\n"]}>l)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-NE.js.mapk9)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-RW.js.mapO)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-SY.js.map8R)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-TD.js.map>)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-TG.js.mapA)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-TN.js.mapH)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-VU.js.map3Q)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-WF.js.mapC)xa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "du matin", "de l’après-midi", "du soir", "du matin"]], [["minuit", "midi", "mat.", "ap.m.", "soir", "nuit"], u, ["minuit", "midi", "matin", "après-midi", "soir", "nuit"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=fr-YT.js.mapFSbx*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["fy", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["si", "mo", "ti", "wo", "to", "fr", "so"], ["snein", "moandei", "tiisdei", "woansdei", "tongersdei", "freed", "sneon"], ["si", "mo", "ti", "wo", "to", "fr", "so"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mrt", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"], ["Jannewaris", "Febrewaris", "Maart", "April", "Maaie", "Juny", "July", "Augustus", "Septimber", "Oktober", "Novimber", "Desimber"]], u, [["f.K.", "n.K."], ["f.Kr.", "n.Kr."], ["Foar Kristus", "nei Kristus"]], 1, [6, 0], ["dd-MM-yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'om' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤ #,##0.00-", "#E0"], "EUR", "€", "Euro", { "AUD": ["AU$", "$"], "CAD": ["C$", "$"], "FJD": ["FJ$", "$"], "JPY": ["JP¥", "¥"], "SBD": ["SI$", "$"], "THB": ["฿"], "USD": ["US$", "$"], "XPF": [] }, "ltr", plural];
//# sourceMappingURL=fy.js.map4C7x export default [	!	&+x 4	ur.js.map4|Jx 3
haw.js.map:j#jx 3	kw.js.map4/	x 3
lkt.js.map:.*x 3	su.js.map4gJx 3
twq.js.map;x?kx 3
yav.js.map;3ex]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n === Math.floor(n) && (n >= 3 && n <= 6))
        return 3;
    if (n === Math.floor(n) && (n >= 7 && n <= 10))
        return 4;
    return 5;
}
export default ["ga-GB", [["r.n.", "i.n."], u, u], u, [["D", "L", "M", "C", "D", "A", "S"], ["Domh", "Luan", "Máirt", "Céad", "Déar", "Aoine", "Sath"], ["Dé Domhnaigh", "Dé Luain", "Dé Máirt", "Dé Céadaoin", "Déardaoin", "Dé hAoine", "Dé Sathairn"], ["Do", "Lu", "Má", "Cé", "Dé", "Ao", "Sa"]], u, [["E", "F", "M", "A", "B", "M", "I", "L", "M", "D", "S", "N"], ["Ean", "Feabh", "Márta", "Aib", "Beal", "Meith", "Iúil", "Lún", "MFómh", "DFómh", "Samh", "Noll"], ["Eanáir", "Feabhra", "Márta", "Aibreán", "Bealtaine", "Meitheamh", "Iúil", "Lúnasa", "Meán Fómhair", "Deireadh Fómhair", "Samhain", "Nollaig"]], u, [["RC", "AD"], u, ["Roimh Chríost", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "Nuimh", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GBP", "£", "Punt Steirling", { "RUR": [u, "р."], "THB": ["฿"], "TWD": ["NT$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ga-GB.js.map2jx export default [9$	.x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ਅੱਧੀ ਰਾਤ", "ਸਵੇਰੇ", "ਦੁਪਹਿਰੇ", "ਸ਼ਾਮੀਂ", "ਰਾਤੀਂ"], u, u], [["ਅੱਧੀ ਰਾਤ", "ਸਵੇਰੇ", "ਦੁਪਹਿਰੇ", "ਸ਼ਾਮੀਂ", "ਰਾਤੀਂ"], u, ["ਅੱਧੀ ਰਾਤ", "ਸਵੇਰੇ", "ਦੁਪਹਿਰੇ", "ਸ਼ਾਮ", "ਰਾਤ"]], ["00:00", ["04:00", "12:00"], ["12:00", "16:00"], ["16:00", "21:00"], ["21:00", "04:00"]]];
//# sourceMappingURL=pa.js.map͓?	vx lW真夜中", "正午", "朝", "昼", "夕方", "夜", "夜中"], u, u], u, ["00:00", "12s9!19:00"], ["19:00", "23:00"], ["23'	ja.js.map(X2"x 	ia.js.mapUha$x 3	ga.js.map3[Cx 3	ha.js.map3d)xm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["Mitternacht", "am Morge", "zmittag", "am Namittag", "zaabig", "znacht"], u, u], [["Mitternacht", "am Morge", "zmittag", "am Namittag", "zaabig", "znacht"], u, ["Mitternacht", "Morge", "Mittag", "Namittag", "Aabig", "Nacht"]], ["00:00", ["05:00", "12:00"], ["12:00", "14:00"], ["14:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=gsw-FR.js.mapI 5xZ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["મ.રાત્રિ", "સવારે", "બપોરે", "સાંજે", "રાત્રે"], ["મધ્યરાત્રિ", "સવારે", "બપોરે", "સાંજે", "રાત્રે"], u], [["મધ્યરાત્રિ", "સવારે", "બપોરે", "સાંજે", "રાત્રે"], u, ["મધ્યરાત્રિ", "સવાર", "બપોર", "સાંજ", "રાત્રિ"]], ["00:00", ["04:00", "12:00"], ["12:00", "16:00"], ["16:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=gu.js.mapUx_/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["guz", [["Ma", "Mo"], u, ["Mambia", "Mog"]], [["Ma", "Mo"], u, u], [["C", "C", "C", "C", "A", "I", "E"], ["Cpr", "Ctt", "Cmn", "Cmt", "Ars", "Icm", "Est"], ["Chumapiri", "Chumatato", "Chumaine", "Chumatano", "Aramisi", "Ichuma", "Esabato"], ["Cpr", "Ctt", "Cmn", "Cmt", "Ars", "Icm", "Est"]], u, [["C", "F", "M", "A", "M", "J", "C", "A", "S", "O", "N", "D"], ["Can", "Feb", "Mac", "Apr", "Mei", "Jun", "Cul", "Agt", "Sep", "Okt", "Nob", "Dis"], ["Chanuari", "Feburari", "Machi", "Apiriri", "Mei", "Juni", "Chulai", "Agosti", "Septemba", "Okitoba", "Nobemba", "Disemba"]], u, [["YA", "YK"], u, ["Yeso ataiborwa", "Yeso kaiboirwe"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Shilingi ya Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=guz.js.mapwlx 
export default [="	"x%

Vluy", [["a.m.", "p.m."], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["J2", "J3", "J4", "J5", "Al", "Ij", "J1"], ["Jumapiri", "Jumatatu", "Jumanne", "Jumatano", "Murwa wa Kanne", "Murwa wa Katano", "Jumamosi"], ["J2", "J3", "J4", "J5", "Al", "Ij", "J1"]], u, [["JJJan", "Feb", "MarfJul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "JQ `toba", "Novemba", "Desemba"]], u, [["BC", "AD"], u, ["Imberi ya Kuuza Kwa", "Muhiga Kuvita Kuuza;¤- #irinjr
luy.js.mapʘ_x 3
luy.js.map;h>xq{"version":3,"file":"sr-Cyrl-ME.js","sourceRoot":"","sources":["sr-Cyrl-ME.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))\n    return 3;\nreturn 5;\n}\n\nexport default [\"sr-Cyrl-ME\",[[\"AM\",\"PM\"],[\"прије подне\",\"по подне\"],u],[[\"a\",\"p\"],[\"прије подне\",\"по подне\"],u],[[\"н\",\"п\",\"у\",\"с\",\"ч\",\"п\",\"с\"],[\"нед\",\"пон\",\"уто\",\"сре\",\"чет\",\"пет\",\"суб\"],[\"недјеља\",\"понедељак\",\"уторак\",\"сриједа\",\"четвртак\",\"петак\",\"субота\"],[\"не\",\"по\",\"ут\",\"ср\",\"че\",\"пе\",\"су\"]],u,[[\"ј\",\"ф\",\"м\",\"а\",\"м\",\"ј\",\"ј\",\"а\",\"с\",\"о\",\"н\",\"д\"],[\"јан\",\"феб\",\"март\",\"апр\",\"мај\",\"јун\",\"јул\",\"авг\",\"септ\",\"окт\",\"нов\",\"дец\"],[\"јануар\",\"фебруар\",\"март\",\"април\",\"мај\",\"јун\",\"јул\",\"август\",\"септембар\",\"октобар\",\"новембар\",\"децембар\"]],u,[[\"п.н.е.\",\"н.е.\"],[\"п. н. е.\",\"н. е.\"],[\"прије нове ере\",\"нове ере\"]],1,[6,0],[\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.\",\"EEEE, d. MMMM y.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Евро\",{\"AUD\":[u,\"$\"],\"BAM\":[\"КМ\",\"KM\"],\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"KRW\":[u,\"₩\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}DUxQ*ha-N"ha-NI"CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACPt=OAAO.[	

OAAO,C[	`"QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS;7KOAAO@MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS/$EL	sBAAsB,EAAC,sBAAsB=
UAAU,EAAC,WAAW,EAAC,gBAAgC)UAAU,EAAC,CAAC,EAAC,cAAc,EAAC,SAAS,CAAC,Em	UOAAO,EAAC,+BAA+B;
;\n\nif (n === 1)\n    return 16%ha-NE\",[[\"SF\",\"YM\"],u,[\"Safiya\",\"Yamma\"]],[[\"SF\",\"YM\"],u,u],[[\"L\",\"L\",\"T\",\"L\",\"A\",\"J\",\"A\"],[\"Lah\",\"Lit\",\"Tal\",\"Lar\",\"Alh\",\"Jum\",\"Asa\"],[\"Lahadi\",\"Litinin\",\"Talata\",\"Laraba\",\"Alhamis\",\"Jummaʼa\",\"Asabar\"],[\"Lh\",\"Li\",\"Ta\",\"Lr\",\"Al\",\"Ju\",\"As\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"Y\",\"Y\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Fab\",\"Mar\",\"Afi\",\"May\",\"Yun\",\"Yul\",\"Agu\",\"Sat\",\"Okt\",\"Nuw\",\"Dis\"],[\"Janairu\",\"Faburairu\",\"Maris\",\"Afirilu\",\"Mayu\",\"Yuni\",\"Yuli\",\"Agusta\",\"Satumba\",\"Oktoba\",\"Nuwamba\",\"Disamba\"]],u,[[\"K.H\",\"BHAI\"],u,[\"Kafin haihuwar annab\",\"Bayan haihuwar annab\"]],1,[6,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE d MMMM, yD2, {0}\",u,\"{1} 'da' {0}\",\"{1} {0}\"],[\".\",\",cy¤ #,##0.00\",\"#E0\"],\"XOF\",\"F CFA\",\"Kuɗin Sefa na Afirka Ta Yamma\",{\"NGN\":[\"₦\"]},\"ltr\", plural];\n"]}`x- 	eAAe,EAAE2export default [];\n"]}t>x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["חצות", "בבוקר", "בצהריים", "אחה״צ", "בערב", "בלילה", "לפנות בוקר"], ["חצות", "בוקר", "צהריים", "אחר הצהריים", "ערב", "לילה", "לפנות בוקר"], ["חצות", "בבוקר", "בצהריים", "אחר הצהריים", "בערב", "בלילה", "לפנות בוקר"]], [["חצות", "בוקר", "צהריים", "אחה״צ", "ערב", "לילה", "לפנות בוקר"], u, ["חצות", "בוקר", "צהריים", "אחר הצהריים", "ערב", "לילה", "לפנות בוקר"]], ["00:00", ["06:00", "12:00"], ["12:00", "16:00"], ["16:00", "18:00"], ["18:00", "22:00"], ["22:00", "03:00"], ["03:00", "06:00"]]];
//# sourceMappingURL=he.js.map.x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "in the morning", "in the afternoon", "in the evening", "at night"], ["aadhi raat", "subah", "dopahar", "shaam", "raat"]], [["midnight", "morning", "afternoon", "evening", "night"], u, ["aadhi raat", "subah", "dopahar", "shaam", "raat"]], ["00:00", ["04:00", "12:00"], ["12:00", "16:00"], ["16:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=hi-Latn.js.mapW0Yxf{"version":3,"file":"hi-Latn.js","sourceRoot":"","sources":["hi-Latn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,IAAI,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,YAAY,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,YAAY,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"mi\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"aadhi raat\",\"subah\",\"dopahar\",\"shaam\",\"raat\"]],[[\"midnight\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,[\"aadhi raat\",\"subah\",\"dopahar\",\"shaam\",\"raat\"]],[\"00:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"20:00\"],[\"20:00\",\"04:00\"]]];\n"]}ͺ+xE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["मध्यरात्रि", "सुबह", "दोपहर", "शाम", "रात"], u, u], [["आधी रात", "सुबह", "दोपहर", "शाम", "रात"], ["मध्यरात्रि", "सुबह", "दोपहर", "शाम", "रात"], u], ["00:00", ["04:00", "12:00"], ["12:00", "16:00"], ["16:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=hi.js.mapv&YPx{"version":3,"file":"und.js","sourceRoot":"","sources":["und.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,IAAI,EAAC,GAAG,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"mi\",\"n\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],[\"midnight\",\"noon\",\"in the morning\",\"in the afternoon\",\"in the evening\",\"at night\"],u],[[\"midnight\",\"noon\",\"morning\",\"afternoon\",\"evening\",\"night\"],u,u],[\"00:00\",\"12:00\",[\"06:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}vw$xL
	hi!hi<q,YAAY,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK)CAAC,SAAS,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,YAAY,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,CAमध्यरात्रि\",\"सुबह\",\"दोपहर\",\"शाम\",\"रात\"],u,u],[[\"आधी रात\",\"सुबह\",\"दोपहर\",\"शाम\",\"रात\"],[\"मध्यरात्रि\",\"सुबह\",\"द?ोपहर\",\"शाम\",\"रात\"],u],[\"00:00\",[\"04;6:00\"],[\"16:00\",\"20:00\"],[\"20:00\",\"04:00\"]]];\n"]}̰1x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["gece", "ö", "sabah", "öğleden önce", "öğleden sonra", "akşamüstü", "akşam", "gece"], ["gece yarısı", "öğle", "sabah", "öğleden önce", "öğleden sonra", "akşamüstü", "akşam", "gece"], u], [["gece yarısı", "öğle", "sabah", "öğleden önce", "öğleden sonra", "akşamüstü", "akşam", "gece"], u, u], ["00:00", "12:00", ["06:00", "11:00"], ["11:00", "12:00"], ["12:00", "18:00"], ["18:00", "19:00"], ["19:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=tr.js.map1Jx éjfél", "dél", "reggel", "de.", "du.", "este", "éjjel", "hajnal"], u, ["éjfél", "dél", "reggel", "délelőtt", "délutáPn", "este", "éjjel", "hajnal"]], u, ["00:00", "12:00", ["06:00", "09:00"], ["09/4:00"], ["04'	hu.js.map&M'x Cvidurnaktis", "perpiet", "rytas", "popietė", "vakaras", "naktis"], u, u], [["vidurnaktis", "vidurdienis", "rytas", "diena", "vakaras", "naktisZ*'24:00"], ["00'	lt.js.map}<4_x{"version":3,"file":"tr.js","sourceRoot":"","sources":["tr.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,cAAc,EAAC,eAAe,EAAC,WAAW,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,aAAa,EAAC,MAAM,EAAC,OAAO,EAAC,cAAc,EAAC,eAAe,EAAC,WAAW,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,aAAa,EAAC,MAAM,EAAC,OAAO,EAAC,cAAc,EAAC,eAAe,EAAC,WAAW,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"gece\",\"ö\",\"sabah\",\"öğleden önce\",\"öğleden sonra\",\"akşamüstü\",\"akşam\",\"gece\"],[\"gece yarısı\",\"öğle\",\"sabah\",\"öğleden önce\",\"öğleden sonra\",\"akşamüstü\",\"akşam\",\"gece\"],u],[[\"gece yarısı\",\"öğle\",\"sabah\",\"öğleden önce\",\"öğleden sonra\",\"akşamüstü\",\"akşam\",\"gece\"],u,u],[\"00:00\",\"12:00\",[\"06:00\",\"11:00\"],[\"11:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"19:00\"],[\"19:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}= xU	hu!hu:qJOAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ
@KAAK,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ
éjfél\",\"dél\",\"reggel\",\"de.\",\"du.\",\"este\",\"éjjel\",\"hajnal\"],u,[\"éjfél\",\"dél\",\"reggel\",\"délelőtt\"1,\"délután\",\"este\",\"éjjel\",\"hajnal\"]],uR#09:00\"],[\"094%4:00\"],[\"04:00\",\"06:00\"]]];\n"]}"M9xLlt!lt:q6aAAa,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ)_aAAa,EAAC,aAAa,EEAAC,SAAS,EAAC,QAAQOvidurnaktis\",\"perpiet\",\"rytas\",\"popietė\",\"vakaras\",\"naktis\"],u,u],[[\"vidurnaktis\",\"vidurdienis\",\"rytas\",\"diena\",\"vakaras\",\"naktisJ,+&24:00\"],[\"00:00\",\"06:00\"]]];\n"]}Ng2x./**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["կգ․", "կօ․", "առվ", "ցրկ", "երկ", "գշր"], ["կեսգիշեր", "կեսօր", "առավոտյան", "ցերեկը", "երեկոյան", "գիշերը"], ["կեսգիշերին", "կեսօրին", "առավոտյան", "ցերեկվա", "երեկոյան", "գիշերվա"]], [["կեսգիշեր", "կեսօր", "առավոտ", "ցերեկ", "երեկո", "գիշեր"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=hy.js.mapO^-)x`/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mezzanotte", "mezzogiorno", "di mattina", "di pomeriggio", "di sera", "di notte"], u, ["mezzanotte", "mezzogiorno", "di mattina", "del pomeriggio", "di sera", "di notte"]], [["mezzanotte", "mezzogiorno", "mattina", "pomeriggio", "sera", "notte"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=it.js.map.˂4xB/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["შუაღამეს", "შუადღ.", "დილ.", "ნაშუადღ.", "საღ.", "ღამ."], u, ["შუაღამეს", "შუადღეს", "დილით", "ნაშუადღევს", "საღამოს", "ღამით"]], [["შუაღამე", "შუადღე", "დილა", "ნაშუადღევი", "საღამო", "ღამე"], u, u], ["00:00", "12:00", ["05:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "05:00"]]];
//# sourceMappingURL=ka.js.map__x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["saq", [["Tesiran", "Teipa"], u, u], u, [["A", "K", "O", "I", "I", "S", "K"], ["Are", "Kun", "Ong", "Ine", "Ile", "Sap", "Kwe"], ["Mderot ee are", "Mderot ee kuni", "Mderot ee ong’wan", "Mderot ee inet", "Mderot ee ile", "Mderot ee sapa", "Mderot ee kwe"], ["Are", "Kun", "Ong", "Ine", "Ile", "Sap", "Kwe"]], u, [["O", "W", "O", "O", "I", "I", "S", "I", "S", "T", "T", "T"], ["Obo", "Waa", "Oku", "Ong", "Ime", "Ile", "Sap", "Isi", "Saa", "Tom", "Tob", "Tow"], ["Lapa le obo", "Lapa le waare", "Lapa le okuni", "Lapa le ong’wan", "Lapa le imet", "Lapa le ile", "Lapa le sapa", "Lapa le isiet", "Lapa le saal", "Lapa le tomon", "Lapa le tomon obo", "Lapa le tomon waare"]], u, [["KK", "BK"], u, ["Kabla ya Christo", "Baada ya Christo"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Njilingi eel Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=saq.js.map$}x export default [[["kuty-si", "kurã-kuju", "kusãg ki", "rãkãnh kỹ", "kuty kỹ", "kurã ge"], u, u], u, ["00:00", "12:00",P ["06:00", "12:00"], ["12:00", "19:00"], ["19:00", "24:00"], ["00:00", "06:00"]]
kgp.js.mapDxY	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mai", [["AM", "PM"], u, ["भोर", "सांझ"]], [["AM", "PM"], u, u], [["र", "सो", "मं", "बु", "गु", "शु", "श"], ["रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि"], ["रवि दिन", "सोम दिन", "मंगल दिन", "बुध दिन", "बृहस्पति दिन", "शुक्र दिन", "शनि दिन"], ["रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि"]], u, [["ज", "फ", "मा", "अ", "म", "जू", "जु", "अ", "सि", "अ", "न", "दि"], ["जन॰", "फ़र॰", "मार्च", "अप्रैल", "मई", "जून", "जुल॰", "अग॰", "सित॰", "अक्तू॰", "नव॰", "दिस॰"], ["जनवरी", "फरवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितंबर", "अक्तूबर", "नवंबर", "दिसंबर"]], [["ज", "फ", "मा", "अ", "म", "जू", "जु", "अ", "सि", "अ", "न", "दि"], ["जन॰", "फर॰", "मार्च", "अप्रैल", "मई", "जून", "जुल॰", "अग॰", "सित॰", "अक्तू॰", "नव॰", "दिस॰"], ["जनवरी", "फरवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितंबर", "अक्टूबर", "नवंबर", "दिसंबर"]], [["ईसा-पूर्व", "ईसवी"], u, u], 0, [0, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} के {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "[#E0]"], "INR", "₹", "भारतीय रुपया", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=mai.js.map@igx export default [7	"	+x 3	ki.js.map3Jx 4i.js.map-Khx 3	sg.js.map4x 3	tg.js.map4'x 3	ug.js.map4_x 4	ah.js.map3x.x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["түнгі", "түскі", "таңғы", "түстен кейінгі", "кешкі", "түнгі"], ["түн жарымы", "түскі", "таңғы", "түстен кейінгі", "кешкі", "түнгі"], u], [["түн жарымы", "талтүс", "таң", "түстен кейін", "кеш", "түн"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=kk.js.map:.x

/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['km'] = ["km",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["អ","ច","អ","ព","ព","ស","ស"],["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហ","សុក្រ","សៅរ៍"],["អាទិត្យ","ច័ន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],["អា","ច","អ","ពុ","ព្រ","សុ","ស"]],[["អ","ច","អ","ព","ព","ស","ស"],["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហ","សុក្រ","សៅរ៍"],["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],["អា","ច","អ","ពុ","ព្រ","សុ","ស"]],[["ម","ក","ម","ម","ឧ","ម","ក","ស","ក","ត","វ","ធ"],["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],u],u,[["មុន គ.ស.","គ.ស."],u,["មុន​គ្រិស្តសករាជ","គ្រិស្តសករាជ"]],0,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} នៅ​ម៉ោង {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"KHR","៛","រៀល​កម្ពុជា",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"KHR":["៛"],"LSL":["ឡូទី"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["អធ្រាត្រ","ថ្ងៃត្រង់","នៅពេល​ព្រឹក","នៅពេលរសៀល","នៅពេល​ល្ងាច","នៅពេល​យប់"],u,u],[["អធ្រាត្រ","ថ្ងៃ​ត្រង់","ព្រឹក","រសៀល","ល្ងាច","យប់"],u,u],["00:00","12:00",["00:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","24:00"]]]];
  })(globalThis);
    xFˑ+#const u = undefined;
export defaultM l   ្ងាច",  u, u], O 1	! "ព្រឹក", "រសៀល", "ល្ងាច", "យប់"], u, u], ["00:00", "12:00", ["00:00", "12:00"], ["12:00", "1P8:00"], ["18:00", "21:00"], ["21:00", "24:00"]]];
//# sourceMappingURL=km.js.mapp0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["түн орт", "чт", "эртң мн", "түшт кйн", "кечк", "түн"], ["түн ортосу", "чак түш", "эртең менен", "түштөн кийин", "кечинде", "түн ичинде"], u], [["түн ортосу", "чак түш", "эртең менен", "түштөн кийин", "кечкурун", "түн"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=ky.js.map3Ax Fentathakusa", "ekuseni", "emini", "ntambama", "ebusuku"], u, u], u, [["00:00", "06:00"], ["06:00", "10:00"], ["10:00", "13:00"]#, ["13:00", "19:00"], ["19:00", "24	zu.js.map/hxv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["ln-CF", [["ntɔ́ngɔ́", "mpókwa"], u, u], u, [["e", "y", "m", "m", "m", "m", "p"], ["eye", "ybo", "mbl", "mst", "min", "mtn", "mps"], ["eyenga", "mokɔlɔ mwa yambo", "mokɔlɔ mwa míbalé", "mokɔlɔ mwa mísáto", "mokɔlɔ ya mínéi", "mokɔlɔ ya mítáno", "mpɔ́sɔ"], ["eye", "ybo", "mbl", "mst", "min", "mtn", "mps"]], u, [["y", "f", "m", "a", "m", "y", "y", "a", "s", "ɔ", "n", "d"], ["yan", "fbl", "msi", "apl", "mai", "yun", "yul", "agt", "stb", "ɔtb", "nvb", "dsb"], ["sánzá ya yambo", "sánzá ya míbalé", "sánzá ya mísáto", "sánzá ya mínei", "sánzá ya mítáno", "sánzá ya motóbá", "sánzá ya nsambo", "sánzá ya mwambe", "sánzá ya libwa", "sánzá ya zómi", "sánzá ya zómi na mɔ̌kɔ́", "sánzá ya zómi na míbalé"]], u, [["libóso ya", "nsima ya Y"], u, ["Yambo ya Yézu Krís", "Nsima ya Yézu Krís"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "Falánga CFA BEAC", { "CDF": ["FC"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ln-CF.js.maplmTx export default [e$	hyxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["pcm", [["AM", "PM"], u, ["Fọ mọ́nin", "Fọ ívnin"]], u, [["S", "M", "T", "W", "T", "F", "S"], ["Sọ́n", "Mọ́n", "Tiú", "Wẹ́n", "Tọ́z", "Fraí", "Sát"], ["Sọ́ndè", "Mọ́ndè", "Tiúzdè", "Wẹ́nẹ́zdè", "Tọ́zdè", "Fraídè", "Sátọdè"], ["Sọ́n", "Mọ́n", "Tiú", "Wẹ́n", "Tọ́z", "Fraí", "Sát"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jén", "Fẹ́b", "Mach", "Épr", "Mee", "Jun", "Jul", "Ọgọ", "Sẹp", "Ọkt", "Nọv", "Dis"], ["Jénúári", "Fẹ́búári", "Mach", "Éprel", "Mee", "Jun", "Julai", "Ọgọst", "Sẹptẹ́mba", "Ọktóba", "Nọvẹ́mba", "Disẹ́mba"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jén", "Fẹ́b", "Mach", "Épr", "Mee", "Jun", "Jul", "Ọ́gọ", "Sẹp", "Ọkt", "Nọv", "Dis"], ["Jénúári", "Fẹ́búári", "Mach", "Éprel", "Mee", "Jun", "Julai", "Ọgọst", "Sẹptẹ́mba", "Ọktóba", "Nọvẹ́mba", "Disẹ́mba"]], [["BK", "KIY"], u, ["Bifọ́ Kraist", "Kraist Im Yiẹ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "H:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'fọ' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "NGN", "₦", "Naijíriá Naíra", { "BYN": [u, "p."], "CAD": ["KA$", "$"], "JPY": ["JP¥", "¥"], "NGN": ["₦"], "PHP": [u, "₱"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pcm.js.mapixx& export default [p	ln.js.map5x 3
pcm.js.map:|#xz/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['lo'] = ["lo",[["ກ່ອນທ່ຽງ","ຫຼັງທ່ຽງ"],u,u],u,[["ອາ","ຈ","ອ","ພ","ພຫ","ສຸ","ສ"],["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],["ອາ.","ຈ.","ອ.","ພ.","ພຫ.","ສຸ.","ສ."]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."],["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"]],u,[["ກ່ອນ ຄ.ສ.","ຄ.ສ."],u,["ກ່ອນຄຣິດສັກກະລາດ","ຄຣິດສັກກະລາດ"]],0,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE ທີ d MMMM G y"],["H:mm","H:mm:ss","H ໂມງ m ນາທີ ss ວິນາທີ z","H ໂມງ m ນາທີ ss ວິນາທີ zzzz"],["{1}, {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","ບໍ່​ແມ່ນ​ໂຕ​ເລກ",":"],["#,##0.###","#,##0%","¤#,##0.00;¤-#,##0.00","#"],"LAK","₭","ລາວ ກີບ",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"LAK":["₭"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["ທ່ຽງຄືນ","ຕອນທ່ຽງ","ຕອນເຊົ້າ","ຕອນທ່ຽງ","ຕອນແລງ","ກາງຄືນ"],["ທ່ຽງຄືນ","ຕອນທ່ຽງ","ຕອນເຊົ້າ","ຕອນບ່າຍ","ຕອນແລງ","ກາງຄືນ"],["ທ່ຽງຄືນ","ຕອນທ່ຽງ","ຕອນເຊົ້າ","ຕອນບ່າຍ","ຕອນແລງ","ຕອນກາງຄືນ"]],[["ທ່ຽງ​ຄືນ","ຕອນທ່ຽງ","​ເຊົ້າ","ສ","ແລງ","​ກາງ​ຄືນ"],["ທ່ຽງ​ຄືນ","ທ່ຽງ","​ເຊົ້າ","ສວຍ","ແລງ","​ກາງ​ຄືນ"],["ທ່ຽງຄືນ","ຕອນທ່ຽງ","​ເຊົ້າ","ສວຍ","ແລງ","​ກາງ​ຄືນ"]],["00:00","12:00",["05:00","12:00"],["12:00","16:00"],["16:00","20:00"],["20:00","05:00"]]]];
  })(globalThis);
    $xB	ˑ+&const u = undefined;
export default [[
    "ຕອນແລງ",  
  0 "ຕອນບ່າຍ", "ຕອນແລງ",  
  0 "ຕອນບ່າຍ", "ຕອນແລງ", 	  	 + "​ເຊົ້າ", "ສ", "ແລງ", p
 	A "ທ່ຽງ", "​ເຊົ້າ", "ສວຍ", "ແລງ", p
 
 1 "​ເຊົ້າ", "ສວຍ", "ແລງ", p
], ["00:00", "12:00", ["05:00", "12:00"], ["12:00", "16:00"], ["16:00", "20:00"], ["20:00", "05:00"]]];
//# sourceMappingURL=lo.js.map𩻀x{"version":3,"file":"lo.js","sourceRoot":"","sources":["lo.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,GAAG,EAAC,KAAK,EAAC,UAAU,CAAC,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,EAAC,UAAU,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"ທ່ຽງຄືນ\",\"ຕອນທ່ຽງ\",\"ຕອນເຊົ້າ\",\"ຕອນທ່ຽງ\",\"ຕອນແລງ\",\"ກາງຄືນ\"],[\"ທ່ຽງຄືນ\",\"ຕອນທ່ຽງ\",\"ຕອນເຊົ້າ\",\"ຕອນບ່າຍ\",\"ຕອນແລງ\",\"ກາງຄືນ\"],[\"ທ່ຽງຄືນ\",\"ຕອນທ່ຽງ\",\"ຕອນເຊົ້າ\",\"ຕອນບ່າຍ\",\"ຕອນແລງ\",\"ຕອນກາງຄືນ\"]],[[\"ທ່ຽງ​ຄືນ\",\"ຕອນທ່ຽງ\",\"​ເຊົ້າ\",\"ສ\",\"ແລງ\",\"​ກາງ​ຄືນ\"],[\"ທ່ຽງ​ຄືນ\",\"ທ່ຽງ\",\"​ເຊົ້າ\",\"ສວຍ\",\"ແລງ\",\"​ກາງ​ຄືນ\"],[\"ທ່ຽງຄືນ\",\"ຕອນທ່ຽງ\",\"​ເຊົ້າ\",\"ສວຍ\",\"ແລງ\",\"​ກາງ​ຄືນ\"]],[\"00:00\",\"12:00\",[\"05:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"20:00\"],[\"20:00\",\"05:00\"]]];\n"]}_mcS/xnn!nn:q1;
;
;
KAAK
EAAC,SAAS,EAAC,OAAO,EAAC,MAAM&aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY?C-;
;
;
KAAK
EAAC,SAAS,EAAC,OAAO,EAAC,MAAM_"EAAC,aAAa,EAAC,OAAO,EAAC,MAAM,CAACrsOmn.\",\"mg.\",\"fm.\",\"em.\",\"kv.\",\"nt.\"],[\"midn.\",\"morg.\",\"form.\",\"etterm.\",\"kveld\",\"natt\"],[\"midnatt\",\"p morgonen\",\"på formiddagen\",\"på ettermiddagen\",\"på kvelden\",\"på natta\"]],[[\"mn.\",\"mg.\",\"fm.\",\"em.\",\"kv.\",\"nt.\"],[\"midn.\",\"morg.\",\"form.\",\"etterm.\",\"kveld\",\"natt\"],[\"midnatt\",\"morgon\",\"formiddag\",\"ettermiddag\"<,\"kveld\",\"natt\"]],[\"00:00\",[\"06:00\",\"10:00\"],[\"10;8:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}^Wx m"m9rWAAW		EAAC,MAAMEAACqX
lsOшөнө дунд\",\"үд дунд\",\"өглөө\",\"өдөр\",\"орой\",\"шөнө\"],u,u],u,[\"00:00\",\"12:00\",[\"06:4%1:00\"],[\"21:00\",\"06:00\"]]];\n"]}Zhxy/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["ti-ER", [["ቅ.ቀ.", "ድ.ቀ."], u, u], u, [["ሰ", "ሰ", "ሰ", "ረ", "ሓ", "ዓ", "ቀ"], ["ሰን", "ሰኑ", "ሰሉ", "ረቡ", "ሓሙ", "ዓር", "ቀዳ"], ["ሰንበት", "ሰኑይ", "ሰሉስ", "ረቡዕ", "ሓሙስ", "ዓርቢ", "ቀዳም"], ["ሰን", "ሰኑ", "ሰሉ", "ረቡ", "ሓሙ", "ዓር", "ቀዳ"]], u, [["ጥ", "ለ", "መ", "ሚ", "ግ", "ሰ", "ሓ", "ነ", "መ", "ጥ", "ሕ", "ታ"], ["ጥሪ", "ለካ", "መጋ", "ሚያ", "ግን", "ሰነ", "ሓም", "ነሓ", "መስ", "ጥቅ", "ሕዳ", "ታሕ"], ["ጥሪ", "ለካቲት", "መጋቢት", "ሚያዝያ", "ግንቦት", "ሰነ", "ሓምለ", "ነሓሰ", "መስከረም", "ጥቅምቲ", "ሕዳር", "ታሕሳስ"]], u, [["ዓ/ዓ", "ዓ/ም"], u, ["ዓመተ ዓለም", "ዓመተ ምሕረት"]], 1, [6, 0], ["dd/MM/yy", "d MMM y", "d MMMM y", "EEEE፣ d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1} ሰዓት {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ERN", "Nfk", "ናቕፋ", { "CNY": [u, "¥"], "ERN": ["Nfk"], "ETB": ["Br"], "JPY": [u, "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ti-ER.js.mapXlx export default [b$#	b+x 3lrc-IQ.js.mapM,x5/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["pusnaktī", "pusd.", "no rīta", "pēcpusd.", "vakarā", "naktī"], u, ["pusnaktī", "pusdienlaikā", "no rīta", "pēcpusdienā", "vakarā", "naktī"]], [["pusnakts", "pusd.", "rīts", "pēcpusd.", "vakars", "nakts"], u, ["pusnakts", "pusdienlaiks", "rīts", "pēcpusdiena", "vakars", "nakts"]], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "23:00"], ["23:00", "06:00"]]];
//# sourceMappingURL=lv.js.map&:Wx) !];
//# sourceMappingURL=tt.js.map	ax{"version":3,"file":"ru.js","sourceRoot":"","sources":["ru.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"полн.\",\"полд.\",\"утра\",\"дня\",\"веч.\",\"ночи\"],[\"полн.\",\"полд.\",\"утра\",\"дня\",\"вечера\",\"ночи\"],[\"полночь\",\"полдень\",\"утра\",\"дня\",\"вечера\",\"ночи\"]],[[\"полн.\",\"полд.\",\"утро\",\"день\",\"веч.\",\"ночь\"],u,[\"полночь\",\"полдень\",\"утро\",\"день\",\"вечер\",\"ночь\"]],[\"00:00\",\"12:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"22:00\"],[\"22:00\",\"04:00\"]]];\n"]}~$_&+xb
lv!lv:q,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ?
6UAAU,EAAC,cAAc,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAC,OAAOmUAAUUAAU,EAAC,QAAQ?
6UAAU,EAAC,cAAc,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ,EAAC,OAAOpusnaktī\",\"pusd.\",\"no rīta\",\"pēcpusd.\",\"vakarā\",\"naktī\"],u,[\"pusnaktī\",\"pusdienlaikā\",\"no rīta\",\"pēcpusdienā\",\"vakarā\",\"naktī\"]],[[\"pusnakts\",\"pusd.\",\"rīts\",\"pēcpusd.\",\"vakars\",\"nakts\"],u,[\"pusnakts\",\"pZusdienlaiks\",\"rīts\",\"pēcpusdiena\",\"vakars\",\"nakts\"]],[\"00:00\",\"12:00\",[\"065%3:00\"],[\"23:00\",\"06:00\"]]];\n"]}n'TxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mer", [["RŨ", "ŨG"], u, u], u, [["K", "M", "W", "W", "W", "W", "J"], ["KIU", "MRA", "WAI", "WET", "WEN", "WTN", "JUM"], ["Kiumia", "Muramuko", "Wairi", "Wethatu", "Wena", "Wetano", "Jumamosi"], ["KIU", "MRA", "WAI", "WET", "WEN", "WTN", "JUM"]], u, [["J", "F", "M", "Ĩ", "M", "N", "N", "A", "S", "O", "N", "D"], ["JAN", "FEB", "MAC", "ĨPU", "MĨĨ", "NJU", "NJR", "AGA", "SPT", "OKT", "NOV", "DEC"], ["Januarĩ", "Feburuarĩ", "Machi", "Ĩpurũ", "Mĩĩ", "Njuni", "Njuraĩ", "Agasti", "Septemba", "Oktũba", "Novemba", "Dicemba"]], u, [["MK", "NK"], u, ["Mbere ya Kristũ", "Nyuma ya Kristũ"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Shilingi ya Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mer.js.mapu/Nx& 
export default [	as.js.map5x 4	er.js.map3Sx7/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["vai", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["ꕞꕌꔵ", "ꗳꗡꘉ", "ꕚꕞꕚ", "ꕉꕞꕒ", "ꕉꔤꕆꕢ", "ꕉꔤꕀꕮ", "ꔻꔬꔳ"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ꖨꖕꔞ", "ꕒꕡ", "ꕾꖺ", "ꖢꖕ", "ꖑꕱ", "ꖱꘋ", "ꖱꕞ", "ꗛꔕ", "ꕢꕌ", "ꕭꖃ", "ꔞꘋ", "ꖨꖕꗏ"], ["ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ", "ꕒꕡꖝꖕ", "ꕾꖺ", "ꖢꖕ", "ꖑꕱ", "ꖱꘋ", "ꖱꕞꔤ", "ꗛꔕ", "ꕢꕌ", "ꕭꖃ", "ꔞꘋꕔꕿ ꕸꖃꗏ", "ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ"]], u, [["BCE", "CE"], u, u], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "LRD", "$", "ꕞꔤꔫꕩ ꕜꕞꕌ", { "JPY": ["JP¥", "¥"], "LRD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=vai.js.mapVDx 
export default ["	>+x 3
mgh.js.map:l Kx 3
seh.js.map:$x.{"version":3,"file":"mni-Beng.js","sourceRoot":"","sources":["mni-Beng.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,UAAU,EAAC,CAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,YAAY,EAAC,WAAW,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,YAAY,EAAC,WAAW,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,gBAAgB,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"mni-Beng\",[[\"নুমাং\",\"PM\"],u,[\"এ এম\",\"পি এম\"]],[[\"নুমাং\",\"PM\"],u,u],[[\"নোং\",\"নিং\",\"লৈবা\",\"য়ুম\",\"শগো\",\"ইরা\",\"থাং\"],[\"নোংমাইজিং\",\"নিংথৌকাবা\",\"লৈবাকপোকপা\",\"য়ুমশকৈশা\",\"শগোলশেন\",\"ইরাই\",\"থাংজ\"],u,u],[[\"নো\",\"নিং\",\"লৈ\",\"য়ুম\",\"শগ\",\"ইরা\",\"থাং\"],[\"নোংমাইজিং\",\"নিংথৌকাবা\",\"লৈবাকপোকপা\",\"য়ুমশকৈশা\",\"শগোলশেন\",\"ইরাই\",\"থাংজ\"],u,u],[[\"জা\",\"ফে\",\"মার\",\"এপ\",\"মে\",\"জুন\",\"জুল\",\"আ\",\"সে\",\"ওক\",\"নব\",\"ডি\"],[\"জানুৱারি\",\"ফেব্রুৱারি\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"আগস্ট\",\"সেপ্টেম্বর\",\"ওক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"],u],[[\"জা\",\"ফে\",\"মার\",\"এপ\",\"মে\",\"জুন\",\"জুল\",\"আ\",\"সে\",\"ও\",\"নব\",\"ডি\"],[\"জানু\",\"ফেব্রু\",\"মার\",\"এপ্রি\",\"মে\",\"জুন\",\"জুলা\",\"আগ\",\"সেপ্ট\",\"ওক্টো\",\"নভে\",\"ডিসে\"],[\"জানুৱারি\",\"ফেব্রুৱারি\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"ওগষ্ট\",\"সেপ্টেম্বর\",\"ওক্টোবর\",\"নবেম্বর\",\"ডিসেম্বর\"]],[[\"খৃ: মমাং\",\"খৃ: মতুং\"],u,u],0,[0,0],[\"d/M/yy\",\"MMM d, y\",\"MMMM d, y\",\"MMMM d, y, EEEE\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} গী {0} দা\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"INR\",\"₹\",\"ইন্দিয়ান রুপী\",{\"JPY\":[\"JP¥\",\"¥\"]},\"ltr\", plural];\n"]})<x- $	eAAe,EAAE2export default [];\n"]}t<x gh"ghFF]x rof!rofFW x seh!sehFV$x vai!vaiFVIxc/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["полн.", "напл.", "утро", "претпл.", "попл.", "веч.", "ноќе"], ["полноќ", "напладне", "наутро", "претпладне", "попладне", "навечер", "ноќе"], ["полноќ", "напладне", "наутро", "претпладне", "попладне", "навечер", "по полноќ"]], [["полноќ", "пладне", "наутро", "претпл.", "попл.", "навечер", "по полноќ"], ["полноќ", "напладне", "наутро", "претпл.", "попл.", "навечер", "по полноќ"], ["на полноќ", "напладне", "наутро", "претпладне", "попладне", "навечер", "по полноќ"]], ["00:00", "12:00", ["04:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=mk.js.map6)x %	午夜", "清晨", "朝早", "中午", "下晝", "夜晚", "凌晨"], u, u], u, ["00:00", ["05:00", "08:00"], ["08:00", "12:00"= 3:00"], ["13:00", "19:00"], ["19X)5:00"]]];
//# sourceMappingURL=yue.js.map~Eix 	ti.js.mapM$x 3vai-Vaii.js.map^,Ix 3	xh.js.map4,xz/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ml'] = ["ml",[["AM","PM"],u,u],u,[["ഞ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],["ഞായർ","തിങ്കൾ","ചൊവ്വ","ബുധൻ","വ്യാഴം","വെള്ളി","ശനി"],["ഞായറാഴ്‌ച","തിങ്കളാഴ്‌ച","ചൊവ്വാഴ്ച","ബുധനാഴ്‌ച","വ്യാഴാഴ്‌ച","വെള്ളിയാഴ്‌ച","ശനിയാഴ്‌ച"],["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"]],[["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],["ഞായർ","തിങ്കൾ","ചൊവ്വ","ബുധൻ","വ്യാഴം","വെള്ളി","ശനി"],["ഞായറാഴ്‌ച","തിങ്കളാഴ്‌ച","ചൊവ്വാഴ്‌ച","ബുധനാഴ്‌ച","വ്യാഴാഴ്‌ച","വെള്ളിയാഴ്‌ച","ശനിയാഴ്‌ച"],["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"]],[["ജ","ഫെ","മാ","ഏ","മെ","ജൂൺ","ജൂ","ഓ","സെ","ഒ","ന","ഡി"],["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"],["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ഓഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"]],u,[["ക്രി.മു.","എഡി"],u,["ക്രിസ്‌തുവിന് മുമ്പ്","ആന്നോ ഡൊമിനി"]],0,[0,0],["d/M/yy","y, MMM d","y, MMMM d","y, MMMM d, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##0%","¤#,##0.00","#E0"],"INR","₹","ഇന്ത്യൻ രൂപ",{"BYN":[u,"р."],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["അ","ഉച്ച","പുലർച്ചെ","രാവിലെ","ഉച്ചയ്ക്ക്","ഉച്ചതിരിഞ്ഞ്","വൈകുന്നേരം","സന്ധ്യ","രാത്രി"],["അർദ്ധരാത്രി","ഉച്ച","പുലർച്ചെ","രാവിലെ","ഉച്ചയ്ക്ക്","ഉച്ചതിരിഞ്ഞ്","വൈകുന്നേരം","സന്ധ്യ","രാത്രി"],u],[["അർദ്ധരാത്രി","ഉച്ച","പുലർച്ചെ","രാവിലെ","ഉച്ചയ്ക്ക്","ഉച്ചതിരിഞ്ഞ്","വൈകുന്നേരം","സന്ധ്യ","രാത്രി"],u,u],["00:00","12:00",["03:00","06:00"],["06:00","12:00"],["12:00","14:00"],["14:00","15:00"],["15:00","18:00"],["18:00","19:00"],["19:00","03:00"]]]];
  })(globalThis);
    	,x	ˑ+>const u = undefined;
export default [[["അ", "ഉച്ച", 
 "രാവിലെ", O
! p
' !   % "ഉച്ച", 
 "രാവിലെ", O
! p
' !   u], & "ഉച്ച", 
 "രാവിലെ", O
! p
' !   u, u], ["00:00", "12:00", ["03:00", "06:00"], ["06:00", "12:00"], ["12:00", "14:00"], ["14:00", "15:00"], ["15:00", "18:00"], H["18:00", "19:00"], ["19:00", "03:00"]]];
//# sourceMappingURL=ml.js.map{x{"version":3,"file":"ml.js","sourceRoot":"","sources":["ml.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,GAAG,EAAC,MAAM,EAAC,UAAU,EAAC,QAAQ,EAAC,YAAY,EAAC,cAAc,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,aAAa,EAAC,MAAM,EAAC,UAAU,EAAC,QAAQ,EAAC,YAAY,EAAC,cAAc,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,aAAa,EAAC,MAAM,EAAC,UAAU,EAAC,QAAQ,EAAC,YAAY,EAAC,cAAc,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"അ\",\"ഉച്ച\",\"പുലർച്ചെ\",\"രാവിലെ\",\"ഉച്ചയ്ക്ക്\",\"ഉച്ചതിരിഞ്ഞ്\",\"വൈകുന്നേരം\",\"സന്ധ്യ\",\"രാത്രി\"],[\"അർദ്ധരാത്രി\",\"ഉച്ച\",\"പുലർച്ചെ\",\"രാവിലെ\",\"ഉച്ചയ്ക്ക്\",\"ഉച്ചതിരിഞ്ഞ്\",\"വൈകുന്നേരം\",\"സന്ധ്യ\",\"രാത്രി\"],u],[[\"അർദ്ധരാത്രി\",\"ഉച്ച\",\"പുലർച്ചെ\",\"രാവിലെ\",\"ഉച്ചയ്ക്ക്\",\"ഉച്ചതിരിഞ്ഞ്\",\"വൈകുന്നേരം\",\"സന്ധ്യ\",\"രാത്രി\"],u,u],[\"00:00\",\"12:00\",[\"03:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"14:00\"],[\"14:00\",\"15:00\"],[\"15:00\",\"18:00\"],[\"18:00\",\"19:00\"],[\"19:00\",\"03:00\"]]];\n"]}G x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["шөнө дунд", "үд дунд", "өглөө", "өдөр", "орой", "шөнө"], u, u], u, ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=mn.js.mapPDž>x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["म.रा.", "दु", "प", "स", "दु", "सं", "सा", "रा"], ["मध्यरात्र", "मध्यान्ह", "पहाट", "सकाळ", "दुपार", "संध्याकाळ", "सायंकाळ", "रात्र"], u], [["म.रा.", "म", "प", "स", "दु", "सं", "सा", "रात्र"], ["मध्यरात्र", "मध्यान्ह", "पहाट", "सकाळ", "दुपार", "संध्याकाळ", "सायंकाळ", "रात्र"], u], ["00:00", "12:00", ["04:00", "06:00"], ["06:00", "12:00"], ["12:00", "16:00"], ["16:00", "18:00"], ["18:00", "21:00"], ["21:00", "04:00"]]];
//# sourceMappingURL=mr.js.map-rx*{"version":3,"file":"mr.js","sourceRoot":"","sources":["mr.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,WAAW,EAAC,UAAU,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,CAAC,EAAC,CAAC,WAAW,EAAC,UAAU,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"म.रा.\",\"दु\",\"प\",\"स\",\"दु\",\"सं\",\"सा\",\"रा\"],[\"मध्यरात्र\",\"मध्यान्ह\",\"पहाट\",\"सकाळ\",\"दुपार\",\"संध्याकाळ\",\"सायंकाळ\",\"रात्र\"],u],[[\"म.रा.\",\"म\",\"प\",\"स\",\"दु\",\"सं\",\"सा\",\"रात्र\"],[\"मध्यरात्र\",\"मध्यान्ह\",\"पहाट\",\"सकाळ\",\"दुपार\",\"संध्याकाळ\",\"सायंकाळ\",\"रात्र\"],u],[\"00:00\",\"12:00\",[\"04:00\",\"06:00\"],[\"06:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"04:00\"]]];\n"]}y2~(xr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["pagi", "pagi", "tengah hari", "petang", "malam"], u, ["tengah malam", "pagi", "tengah hari", "petang", "malam"]], [["pagi", "pagi", "tengah hari", "petang", "malam"], ["tengah malam", "pagi", "tengah hari", "petang", "malam"], u], [["00:00", "01:00"], ["01:00", "12:00"], ["12:00", "14:00"], ["14:00", "19:00"], ["19:00", "24:00"]]];
//# sourceMappingURL=ms-BN.js.map91(xr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["pagi", "pagi", "tengah hari", "petang", "malam"], u, ["tengah malam", "pagi", "tengah hari", "petang", "malam"]], [["pagi", "pagi", "tengah hari", "petang", "malam"], ["tengah malam", "pagi", "tengah hari", "petang", "malam"], u], [["00:00", "01:00"], ["01:00", "12:00"], ["12:00", "14:00"], ["14:00", "19:00"], ["19:00", "24:00"]]];
//# sourceMappingURL=ms-ID.js.map9|.(xr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["pagi", "pagi", "tengah hari", "petang", "malam"], u, ["tengah malam", "pagi", "tengah hari", "petang", "malam"]], [["pagi", "pagi", "tengah hari", "petang", "malam"], ["tengah malam", "pagi", "tengah hari", "petang", "malam"], u], [["00:00", "01:00"], ["01:00", "12:00"], ["12:00", "14:00"], ["14:00", "19:00"], ["19:00", "24:00"]]];
//# sourceMappingURL=ms-SG.js.map9;"x,/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["သန်းခေါင်ယံ", "မွန်းတည့်", "နံနက်", "နေ့လယ်", "ညနေ", "ည"], u, u], u, ["00:00", "12:00", ["00:00", "12:00"], ["12:00", "16:00"], ["16:00", "19:00"], ["19:00", "24:00"]]];
//# sourceMappingURL=my.js.mapYR2x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mn.", "mg.", "fm.", "em.", "kv.", "nt."], ["midn.", "morg.", "form.", "etterm.", "kveld", "natt"], ["midnatt", "på morgenen", "på formiddagen", "på ettermiddagen", "på kvelden", "på natten"]], [["mn.", "mg.", "fm.", "em.", "kv.", "nt."], ["midn.", "morg.", "form.", "etterm.", "kveld", "natt"], ["midnatt", "morgen", "formiddag", "ettermiddag", "kveld", "natt"]], ["00:00", ["06:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=nb-SJ.js.map\V/fxf{"version":3,"file":"nb-SJ.js","sourceRoot":"","sources":["nb-SJ.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"mn.\",\"mg.\",\"fm.\",\"em.\",\"kv.\",\"nt.\"],[\"midn.\",\"morg.\",\"form.\",\"etterm.\",\"kveld\",\"natt\"],[\"midnatt\",\"på morgenen\",\"på formiddagen\",\"på ettermiddagen\",\"på kvelden\",\"på natten\"]],[[\"mn.\",\"mg.\",\"fm.\",\"em.\",\"kv.\",\"nt.\"],[\"midn.\",\"morg.\",\"form.\",\"etterm.\",\"kveld\",\"natt\"],[\"midnatt\",\"morgen\",\"formiddag\",\"ettermiddag\",\"kveld\",\"natt\"]],[\"00:00\",[\"06:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"06:00\"]]];\n"]}֙1x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mn.", "mg.", "fm.", "em.", "kv.", "nt."], ["midn.", "morg.", "form.", "etterm.", "kveld", "natt"], ["midnatt", "på morgenen", "på formiddagen", "på ettermiddagen", "på kvelden", "på natten"]], [["mn.", "mg.", "fm.", "em.", "kv.", "nt."], ["midn.", "morg.", "form.", "etterm.", "kveld", "natt"], ["midnatt", "morgen", "formiddag", "ettermiddag", "kveld", "natt"]], ["00:00", ["06:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=nb.js.mapbe]x)/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["qu-BO", [["a.m.", "p.m."], u, u], u, [["D", "L", "M", "X", "J", "V", "S"], ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sab"], ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"], ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sab"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Dic"], ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Setiembre", "Octubre", "Noviembre", "Diciembre"]], u, [["a.d.", "dC"], ["a.d.", "d.C."], ["ñawpa cristu", "chanta cristu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{0} {1}", "{1} {0}"], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00", "#E0"], "BOB", "Bs", "Boliviano", { "BBD": ["BBG", "$"], "BMD": ["DBM", "$"], "BOB": ["Bs"], "BZD": ["DBZ", "$"], "CAD": ["$CA", "$"], "GHS": [u, "GHC"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "USD": ["$US", "$"] }, "ltr", plural];
//# sourceMappingURL=qu-BO.js.mapz>cx export default [$	xBVnds-NL", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], u, uUJM01", "M02", "M03", "M04", "M05", "M06", "M07", "M08", "M09", "M10", "M11", "M12"], u], u, [["BCE", "CE"], u, u], 1, [6, 0], ["0y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEEIu, u], [".", ",cQV%", "¤ #,##0.00", "#E0"], "EUR", "€", "EUR", { "JPY": ["JP¥", "¥"], "USD": ["US$0nds-NL.js.map#kwx 3nds-NL.js.mapM6%xS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["मध्यरात", "मध्यान्ह", "बिहान", "अपरान्ह", "साँझ", "बेलुकी", "रात"], u, u], u, ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "16:00"], ["16:00", "19:00"], ["19:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=ne.js.map*̽"x-/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["middernacht", "’s ochtends", "’s middags", "’s avonds", "’s nachts"], u, u], [["middernacht", "ochtend", "middag", "avond", "nacht"], u, u], ["00:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=nl.js.mapd|1x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mn.", "mg.", "fm.", "em.", "kv.", "nt."], ["midn.", "morg.", "form.", "etterm.", "kveld", "natt"], ["midnatt", "på morgonen", "på formiddagen", "på ettermiddagen", "på kvelden", "på natta"]], [["mn.", "mg.", "fm.", "em.", "kv.", "nt."], ["midn.", "morg.", "form.", "etterm.", "kveld", "natt"], ["midnatt", "morgon", "formiddag", "ettermiddag", "kveld", "natt"]], ["00:00", ["06:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=nn.js.map1x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mn.", "mg.", "fm.", "em.", "kv.", "nt."], ["midn.", "morg.", "form.", "etterm.", "kveld", "natt"], ["midnatt", "på morgenen", "på formiddagen", "på ettermiddagen", "på kvelden", "på natten"]], [["mn.", "mg.", "fm.", "em.", "kv.", "nt."], ["midn.", "morg.", "form.", "etterm.", "kveld", "natt"], ["midnatt", "morgen", "formiddag", "ettermiddag", "kveld", "natt"]], ["00:00", ["06:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=no.js.mapr.x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ਅੱਧੀ ਰਾਤ", "ਸਵੇਰੇ", "ਦੁਪਹਿਰੇ", "ਸ਼ਾਮੀਂ", "ਰਾਤੀਂ"], u, u], [["ਅੱਧੀ ਰਾਤ", "ਸਵੇਰੇ", "ਦੁਪਹਿਰੇ", "ਸ਼ਾਮੀਂ", "ਰਾਤੀਂ"], u, ["ਅੱਧੀ ਰਾਤ", "ਸਵੇਰੇ", "ਦੁਪਹਿਰੇ", "ਸ਼ਾਮ", "ਰਾਤ"]], ["00:00", ["04:00", "12:00"], ["12:00", "16:00"], ["16:00", "21:00"], ["21:00", "04:00"]]];
//# sourceMappingURL=pa-Guru.js.mapAw0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["o półn.", "w poł.", "rano", "przed poł.", "po poł.", "wiecz.", "w nocy"], ["o północy", "w południe", "rano", "przed południem", "po południu", "wieczorem", "w nocy"], u], [["półn.", "poł.", "rano", "przedpoł.", "popoł.", "wiecz.", "noc"], ["północ", "południe", "rano", "przedpołudnie", "popołudnie", "wieczór", "noc"], u], ["00:00", "12:00", ["06:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=pl.js.map(xv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], ["meia-noite", "meio-dia", "da manhã", "da tarde", "da noite", "da madrugada"], u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "19:00"], ["19:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=pt-MO.js.mapa$xD/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["meia-noite", "meio-dia", "da manhã", "da tarde", "da noite", "da madrugada"], u, u], [["meia-noite", "meio-dia", "manhã", "tarde", "noite", "madrugada"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "19:00"], ["19:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=pt.js.mapu[xG/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["qu-EC", [["a.m.", "p.m."], u, u], u, [["D", "L", "M", "X", "J", "V", "S"], ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sab"], ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"], ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sab"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Dic"], ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Setiembre", "Octubre", "Noviembre", "Diciembre"]], u, [["a.d.", "dC"], ["a.d.", "d.C."], ["ñawpa cristu", "chanta cristu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{0} {1}", "{1} {0}"], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00", "#E0"], "USD", "$", "Dólar Americano", { "BBD": ["BBG", "$"], "BMD": ["DBM", "$"], "BZD": ["DBZ", "$"], "CAD": ["$CA", "$"], "GHS": [u, "GHC"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"] }, "ltr", plural];
//# sourceMappingURL=qu-EC.js.mapFgEx export default [$	ò]x-/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["qu", [["a.m.", "p.m."], u, u], u, [["D", "L", "M", "X", "J", "V", "S"], ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sab"], ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"], ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sab"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Dic"], ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Setiembre", "Octubre", "Noviembre", "Diciembre"]], u, [["a.d.", "dC"], ["a.d.", "d.C."], ["ñawpa cristu", "chanta cristu"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{0} {1}", "{1} {0}"], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00", "#E0"], "PEN", "S/", "Sol Peruano", { "BBD": ["BBG", "$"], "BMD": ["DBM", "$"], "BZD": ["DBZ", "$"], "CAD": ["$CA", "$"], "GHS": [u, "GHC"], "JPY": ["JP¥", "¥"], "PEN": ["S/"], "PHP": [u, "₱"], "USD": ["$US", "$"] }, "ltr", plural];
//# sourceMappingURL=qu.js.map'Un_x export default [!	4xI/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["miezul nopții", "la amiază", "dimineața", "după-amiaza", "seara", "noaptea"], ["miezul nopții", "amiază", "dimineața", "după-amiaza", "seara", "noaptea"], ["la miezul nopții", "la amiază", "dimineața", "după-amiaza", "seara", "noaptea"]], [["miezul nopții", "amiază", "dimineața", "după-amiaza", "seara", "noaptea"], u, ["la miezul nopții", "la amiază", "dimineața", "după-amiaza", "seara", "noaptea"]], ["00:00", "12:00", ["05:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "05:00"]]];
//# sourceMappingURL=ro.js.mapp3x:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["полн.", "полд.", "утра", "дня", "веч.", "ночи"], ["полн.", "полд.", "утра", "дня", "вечера", "ночи"], ["полночь", "полдень", "утра", "дня", "вечера", "ночи"]], [["полн.", "полд.", "утро", "день", "веч.", "ночь"], u, ["полночь", "полдень", "утро", "день", "вечер", "ночь"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=ru-KG.js.mapJSo3x7/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["полн.", "полд.", "утра", "дня", "веч.", "ночи"], ["полн.", "полд.", "утра", "дня", "вечера", "ночи"], ["полночь", "полдень", "утра", "дня", "вечера", "ночи"]], [["полн.", "полд.", "утро", "день", "веч.", "ночь"], u, ["полночь", "полдень", "утро", "день", "вечер", "ночь"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=ru.js.mapSR5x^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["o poln.", "nap.", "ráno", "dop.", "pop.", "več.", "v n."], ["o poln.", "napol.", "ráno", "dopol.", "popol.", "večer", "v noci"], ["o polnoci", "napoludnie", "ráno", "dopoludnia", "popoludní", "večer", "v noci"]], [["poln.", "pol.", "ráno", "dop.", "pop.", "več.", "noc"], ["poln.", "pol.", "ráno", "dopol.", "popol.", "večer", "noc"], ["polnoc", "poludnie", "ráno", "dopoludnie", "popoludnie", "večer", "noc"]], ["00:00", "12:00", ["04:00", "09:00"], ["09:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "04:00"]]];
//# sourceMappingURL=sk.js.map-z 3x2/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["24.00", "12.00", "zj", "d", "p", "zv", "po"], ["opoln.", "opold.", "zjut.", "dop.", "pop.", "zveč.", "ponoči"], ["opolnoči", "opoldne", "zjutraj", "dopoldan", "popoldan", "zvečer", "ponoči"]], [["24.00", "12.00", "j", "d", "p", "v", "n"], ["poln.", "pold.", "jut.", "dop.", "pop.", "zveč.", "noč"], ["polnoč", "poldne", "jutro", "dopoldne", "popoldne", "večer", "noč"]], ["00:00", "12:00", ["06:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "22:00"], ["22:00", "06:00"]]];
//# sourceMappingURL=sl.js.mapRNkxA{"version":3,"file":"sl.js","sourceRoot":"","sources":["sl.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"24.00\",\"12.00\",\"zj\",\"d\",\"p\",\"zv\",\"po\"],[\"opoln.\",\"opold.\",\"zjut.\",\"dop.\",\"pop.\",\"zveč.\",\"ponoči\"],[\"opolnoči\",\"opoldne\",\"zjutraj\",\"dopoldan\",\"popoldan\",\"zvečer\",\"ponoči\"]],[[\"24.00\",\"12.00\",\"j\",\"d\",\"p\",\"v\",\"n\"],[\"poln.\",\"pold.\",\"jut.\",\"dop.\",\"pop.\",\"zveč.\",\"noč\"],[\"polnoč\",\"poldne\",\"jutro\",\"dopoldne\",\"popoldne\",\"večer\",\"noč\"]],[\"00:00\",\"12:00\",[\"06:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"22:00\"],[\"22:00\",\"06:00\"]]];\n"]}@ 꿽Vxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["sn", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "C", "C", "C", "C", "M"], ["Svo", "Muv", "Chp", "Cht", "Chn", "Chs", "Mug"], ["Svondo", "Muvhuro", "Chipiri", "Chitatu", "China", "Chishanu", "Mugovera"], ["Sv", "Mu", "Cp", "Ct", "Cn", "Cs", "Mg"]], u, [["N", "K", "K", "K", "C", "C", "C", "N", "G", "G", "M", "Z"], ["Ndi", "Kuk", "Kur", "Kub", "Chv", "Chk", "Chg", "Nya", "Gun", "Gum", "Mbu", "Zvi"], ["Ndira", "Kukadzi", "Kurume", "Kubvumbi", "Chivabvu", "Chikumi", "Chikunguru", "Nyamavhuvhu", "Gunyana", "Gumiguru", "Mbudzi", "Zvita"]], u, [["BC", "AD"], u, ["Kristo asati auya", "mugore ramambo vedu"]], 0, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "US$", "Dora re Amerika", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=sn.js.mapz#zx 
export default [L!	x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["so-DJ", [["h", "d"], ["GH", "GD"], u], [["AM", "GD"], u, ["GH", "GD"]], [["A", "I", "T", "A", "Kh", "J", "S"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"], ["Axad", "Isniin", "Talaado", "Arbaco", "Khamiis", "Jimco", "Sabti"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"]], [["A", "I", "T", "A", "Kh", "J", "S"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"], ["Axad", "Isniin", "Talaado", "Arbaco", "Khamiis", "Jimco", "Sabti"], ["Axd", "Isn", "Tldo", "Arbaco", "Khms", "Jmc", "Sbti"]], [["J", "F", "M", "A", "M", "J", "L", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "May", "Jun", "Lul", "Ogs", "Seb", "Okt", "Nof", "Dis"], ["Bisha Koobaad", "Bisha Labaad", "Bisha Saddexaad", "Bisha Afraad", "Bisha Shanaad", "Bisha Lixaad", "Bisha Todobaad", "Bisha Sideedaad", "Bisha Sagaalaad", "Bisha Tobnaad", "Bisha Kow iyo Tobnaad", "Bisha Laba iyo Tobnaad"]], [["J", "F", "M", "A", "M", "J", "L", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "May", "Jun", "Lul", "Ogs", "Seb", "Okt", "Nof", "Dis"], ["Jannaayo", "Febraayo", "Maarso", "Abriil", "May", "Juun", "Luuliyo", "Ogost", "Sebtembar", "Oktoobar", "Nofembar", "Desembar"]], [["B", "A"], ["BC", "AD"], ["Ciise Hortii", "Ciise Dabadii"]], 6, [6, 0], ["dd/MM/yy", "dd-MMM-y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1} 'ee' {0}", u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "MaL", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "DJF", "Fdj", "Faran Jabuuti", { "BBD": ["DBB", "$"], "DJF": ["Fdj"], "JPY": ["JP¥", "¥"], "SOS": ["S"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=so-DJ.js.map`S*'!x export default [$
 vxm{"version":3,"file":"sw-KE.js","sourceRoot":"","sources":["sw-KE.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"usiku\",\"mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"adhuhuri\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"]],[[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"adhuhuri\",\"alfajiri\",\"asubuhi\",\"alasiri\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"]],[\"00:00\",\"12:00\",[\"04:00\",\"07:00\"],[\"07:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"19:00\"],[\"19:00\",\"04:00\"]]];\n"]}-Wzx& teo$teo=eEAAE^B];\n"]}75x s%s>9@'x|/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["e mesnatës", "e mesditës", "e mëngjesit", "e paradites", "e pasdites", "e mbrëmjes", "e natës"], u, u], [["mesnatë", "mesditë", "mëngjes", "paradite", "pasdite", "mbrëmje", "natë"], u, u], ["00:00", "12:00", ["04:00", "09:00"], ["09:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=sq.js.map˵0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["поноћ", "подне", "јутро", "по под.", "вече", "ноћ"], ["поноћ", "подне", "јутро", "по под.", "вече", "ноћу"], ["поноћ", "подне", "ујутро", "по подне", "увече", "ноћу"]], [["поноћ", "подне", "јутро", "поподне", "вече", "ноћ"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=sr-Cyrl-BA.js.map;;h0x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["поноћ", "подне", "јутро", "по под.", "вече", "ноћ"], ["поноћ", "подне", "јутро", "по под.", "увече", "ноћу"], ["поноћ", "подне", "ујутро", "по подне", "увече", "ноћу"]], [["поноћ", "подне", "јутро", "поподне", "вече", "ноћ"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=sr-Cyrl-XK.js.mapZ<ܵ+xJ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["поноћ", "подне", "ујутру", "по подне", "увече", "ноћу"], ["поноћ", "подне", "ујутро", "по подне", "увече", "ноћу"], u], [["поноћ", "подне", "јутро", "поподне", "вече", "ноћ"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=sr.js.map/Ox/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["su-Latn", [["AM", "PM"], u, u], u, [["M", "S", "S", "R", "K", "J", "S"], ["Mng", "Sen", "Sal", "Reb", "Kem", "Jum", "Sap"], ["Minggu", "Senén", "Salasa", "Rebo", "Kemis", "Jumaah", "Saptu"], ["Mng", "Sen", "Sal", "Reb", "Kem", "Jum", "Sap"]], u, [["J", "P", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Péb", "Mar", "Apr", "Méi", "Jun", "Jul", "Ags", "Sép", "Okt", "Nop", "Dés"], ["Januari", "Pébruari", "Maret", "April", "Méi", "Juni", "Juli", "Agustus", "Séptémber", "Oktober", "Nopémber", "Désémber"]], u, [["SM", "M"], u, u], 0, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["H.mm", "H.mm.ss", "H.mm.ss z", "H.mm.ss zzzz"], ["{1}, {0}", u, "{1} 'jam' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "IDR", "Rp", "Rupee Indonésia", { "IDR": ["Rp"] }, "ltr", plural];
//# sourceMappingURL=su-Latn.js.mapɅa6x 	export default [&5
:7x{/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["midn.", "på morg.", "på förm.", "på efterm.", "på kvällen", "på natten"], ["midnatt", "på morg.", "på förm.", "på efterm.", "på kvällen", "på natten"], ["midnatt", "på morgonen", "på förmiddagen", "på eftermiddagen", "på kvällen", "på natten"]], [["midn.", "morg.", "förm.", "efterm.", "kväll", "natt"], ["midnatt", "morgon", "förm.", "efterm.", "kväll", "natt"], ["midnatt", "morgon", "förmiddag", "eftermiddag", "kväll", "natt"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=sv-FI.js.mapC,Xlx>{"version":3,"file":"sv-FI.js","sourceRoot":"","sources":["sv-FI.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,WAAW,CAAC,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,UAAU,EAAC,YAAY,EAAC,YAAY,EAAC,WAAW,CAAC,EAAC,CAAC,SAAS,EAAC,aAAa,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,YAAY,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,MAAM,CAAC,EAAC,CAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,OAAO,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"midn.\",\"på morg.\",\"på förm.\",\"på efterm.\",\"på kvällen\",\"på natten\"],[\"midnatt\",\"på morg.\",\"på förm.\",\"på efterm.\",\"på kvällen\",\"på natten\"],[\"midnatt\",\"på morgonen\",\"på förmiddagen\",\"på eftermiddagen\",\"på kvällen\",\"på natten\"]],[[\"midn.\",\"morg.\",\"förm.\",\"efterm.\",\"kväll\",\"natt\"],[\"midnatt\",\"morgon\",\"förm.\",\"efterm.\",\"kväll\",\"natt\"],[\"midnatt\",\"morgon\",\"förmiddag\",\"eftermiddag\",\"kväll\",\"natt\"]],[\"00:00\",[\"05:00\",\"10:00\"],[\"10:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"24:00\"],[\"00:00\",\"05:00\"]]];\n"]}O	7xx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["midn.", "på morg.", "på förm.", "på efterm.", "på kvällen", "på natten"], ["midnatt", "på morg.", "på förm.", "på efterm.", "på kvällen", "på natten"], ["midnatt", "på morgonen", "på förmiddagen", "på eftermiddagen", "på kvällen", "på natten"]], [["midn.", "morg.", "förm.", "efterm.", "kväll", "natt"], ["midnatt", "morgon", "förm.", "efterm.", "kväll", "natt"], ["midnatt", "morgon", "förmiddag", "eftermiddag", "kväll", "natt"]], ["00:00", ["05:00", "10:00"], ["10:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=sv.js.map.<x1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["usiku", "mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "adhuhuri", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"]], [["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "adhuhuri", "alfajiri", "asubuhi", "alasiri", "jioni", "usiku"], ["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"]], ["00:00", "12:00", ["04:00", "07:00"], ["07:00", "12:00"], ["12:00", "16:00"], ["16:00", "19:00"], ["19:00", "04:00"]]];
//# sourceMappingURL=sw-CD.js.map&	vxm{"version":3,"file":"sw-CD.js","sourceRoot":"","sources":["sw-CD.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,mBAAmB,EAAC,oBAAoB,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"usiku\",\"mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"adhuhuri\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"]],[[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"adhuhuri\",\"alfajiri\",\"asubuhi\",\"alasiri\",\"jioni\",\"usiku\"],[\"saa sita za usiku\",\"saa sita za mchana\",\"alfajiri\",\"asubuhi\",\"mchana\",\"jioni\",\"usiku\"]],[\"00:00\",\"12:00\",[\"04:00\",\"07:00\"],[\"07:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"19:00\"],[\"19:00\",\"04:00\"]]];\n"]}-E<x1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["usiku", "mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "adhuhuri", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"]], [["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "adhuhuri", "alfajiri", "asubuhi", "alasiri", "jioni", "usiku"], ["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"]], ["00:00", "12:00", ["04:00", "07:00"], ["07:00", "12:00"], ["12:00", "16:00"], ["16:00", "19:00"], ["19:00", "04:00"]]];
//# sourceMappingURL=sw-KE.js.mapT&<x1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["usiku", "mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "adhuhuri", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"]], [["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "adhuhuri", "alfajiri", "asubuhi", "alasiri", "jioni", "usiku"], ["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"]], ["00:00", "12:00", ["04:00", "07:00"], ["07:00", "12:00"], ["12:00", "16:00"], ["16:00", "19:00"], ["19:00", "04:00"]]];
//# sourceMappingURL=sw-UG.js.map&<x4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["usiku", "mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "adhuhuri", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"]], [["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"], ["saa sita za usiku", "adhuhuri", "alfajiri", "asubuhi", "alasiri", "jioni", "usiku"], ["saa sita za usiku", "saa sita za mchana", "alfajiri", "asubuhi", "mchana", "jioni", "usiku"]], ["00:00", "12:00", ["04:00", "07:00"], ["07:00", "12:00"], ["12:00", "16:00"], ["16:00", "19:00"], ["19:00", "04:00"]]];
//# sourceMappingURL=sw.js.map-%UIxi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["நள்.", "நண்.", "அதி.", "கா.", "மதி.", "பிற்.", "மா.", "அந்தி மா.", "இர."], ["நள்ளிரவு", "நண்பகல்", "அதிகாலை", "காலை", "மதியம்", "பிற்பகல்", "மாலை", "அந்தி மாலை", "இரவு"], u], [["நள்.", "நண்.", "அதி.", "கா.", "மதி.", "பிற்.", "மா.", "அந்தி மா.", "இ."], ["நள்ளிரவு", "நண்பகல்", "அதிகாலை", "காலை", "மதியம்", "பிற்பகல்", "மாலை", "அந்தி மாலை", "இரவு"], u], ["00:00", "12:00", ["03:00", "05:00"], ["05:00", "12:00"], ["12:00", "14:00"], ["14:00", "16:00"], ["16:00", "18:00"], ["18:00", "21:00"], ["21:00", "03:00"]]];
//# sourceMappingURL=ta-LK.js.mapIIxi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["நள்.", "நண்.", "அதி.", "கா.", "மதி.", "பிற்.", "மா.", "அந்தி மா.", "இர."], ["நள்ளிரவு", "நண்பகல்", "அதிகாலை", "காலை", "மதியம்", "பிற்பகல்", "மாலை", "அந்தி மாலை", "இரவு"], u], [["நள்.", "நண்.", "அதி.", "கா.", "மதி.", "பிற்.", "மா.", "அந்தி மா.", "இ."], ["நள்ளிரவு", "நண்பகல்", "அதிகாலை", "காலை", "மதியம்", "பிற்பகல்", "மாலை", "அந்தி மாலை", "இரவு"], u], ["00:00", "12:00", ["03:00", "05:00"], ["05:00", "12:00"], ["12:00", "14:00"], ["14:00", "16:00"], ["16:00", "18:00"], ["18:00", "21:00"], ["21:00", "03:00"]]];
//# sourceMappingURL=ta-MY.js.mapIxi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["நள்.", "நண்.", "அதி.", "கா.", "மதி.", "பிற்.", "மா.", "அந்தி மா.", "இர."], ["நள்ளிரவு", "நண்பகல்", "அதிகாலை", "காலை", "மதியம்", "பிற்பகல்", "மாலை", "அந்தி மாலை", "இரவு"], u], [["நள்.", "நண்.", "அதி.", "கா.", "மதி.", "பிற்.", "மா.", "அந்தி மா.", "இ."], ["நள்ளிரவு", "நண்பகல்", "அதிகாலை", "காலை", "மதியம்", "பிற்பகல்", "மாலை", "அந்தி மாலை", "இரவு"], u], ["00:00", "12:00", ["03:00", "05:00"], ["05:00", "12:00"], ["12:00", "14:00"], ["14:00", "16:00"], ["16:00", "18:00"], ["18:00", "21:00"], ["21:00", "03:00"]]];
//# sourceMappingURL=ta-SG.js.maphx!{"version":3,"file":"ta-SG.js","sourceRoot":"","sources":["ta-SG.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,WAAW,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"நள்.\",\"நண்.\",\"அதி.\",\"கா.\",\"மதி.\",\"பிற்.\",\"மா.\",\"அந்தி மா.\",\"இர.\"],[\"நள்ளிரவு\",\"நண்பகல்\",\"அதிகாலை\",\"காலை\",\"மதியம்\",\"பிற்பகல்\",\"மாலை\",\"அந்தி மாலை\",\"இரவு\"],u],[[\"நள்.\",\"நண்.\",\"அதி.\",\"கா.\",\"மதி.\",\"பிற்.\",\"மா.\",\"அந்தி மா.\",\"இ.\"],[\"நள்ளிரவு\",\"நண்பகல்\",\"அதிகாலை\",\"காலை\",\"மதியம்\",\"பிற்பகல்\",\"மாலை\",\"அந்தி மாலை\",\"இரவு\"],u],[\"00:00\",\"12:00\",[\"03:00\",\"05:00\"],[\"05:00\",\"12:00\"],[\"12:00\",\"14:00\"],[\"14:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"03:00\"]]];\n"]}4Ixl/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["நள்.", "நண்.", "அதி.", "கா.", "மதி.", "பிற்.", "மா.", "அந்தி மா.", "இர."], ["நள்ளிரவு", "நண்பகல்", "அதிகாலை", "காலை", "மதியம்", "பிற்பகல்", "மாலை", "அந்தி மாலை", "இரவு"], u], [["நள்.", "நண்.", "அதி.", "கா.", "மதி.", "பிற்.", "மா.", "அந்தி மா.", "இ."], ["நள்ளிரவு", "நண்பகல்", "அதிகாலை", "காலை", "மதியம்", "பிற்பகல்", "மாலை", "அந்தி மாலை", "இரவு"], u], ["00:00", "12:00", ["03:00", "05:00"], ["05:00", "12:00"], ["12:00", "14:00"], ["14:00", "16:00"], ["16:00", "18:00"], ["18:00", "21:00"], ["21:00", "03:00"]]];
//# sourceMappingURL=ta.js.map\v&x{"version":3,"file":"ta.js","sourceRoot":"","sources":["ta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,WAAW,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"நள்.\",\"நண்.\",\"அதி.\",\"கா.\",\"மதி.\",\"பிற்.\",\"மா.\",\"அந்தி மா.\",\"இர.\"],[\"நள்ளிரவு\",\"நண்பகல்\",\"அதிகாலை\",\"காலை\",\"மதியம்\",\"பிற்பகல்\",\"மாலை\",\"அந்தி மாலை\",\"இரவு\"],u],[[\"நள்.\",\"நண்.\",\"அதி.\",\"கா.\",\"மதி.\",\"பிற்.\",\"மா.\",\"அந்தி மா.\",\"இ.\"],[\"நள்ளிரவு\",\"நண்பகல்\",\"அதிகாலை\",\"காலை\",\"மதியம்\",\"பிற்பகல்\",\"மாலை\",\"அந்தி மாலை\",\"இரவு\"],u],[\"00:00\",\"12:00\",[\"03:00\",\"05:00\"],[\"05:00\",\"12:00\"],[\"12:00\",\"14:00\"],[\"14:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"03:00\"]]];\n"]}6qx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['te'] = ["te",[["ఉ","సా"],["AM","PM"],u],[["AM","PM"],u,u],[["ఆ","సో","మ","బు","గు","శు","శ"],["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],["ఆది","సోమ","మం","బుధ","గురు","శుక్ర","శని"]],u,[["జ","ఫి","మా","ఏ","మే","జూ","జు","ఆ","సె","అ","న","డి"],["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగ","సెప్టెం","అక్టో","నవం","డిసెం"],["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జులై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"]],u,[["క్రీపూ","క్రీశ"],u,["క్రీస్తు పూర్వం","క్రీస్తు శకం"]],0,[0,0],["dd-MM-yy","d MMM, y","d MMMM, y","d, MMMM y, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1} {0}కి",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##0%","¤#,##,##0.00","#E0"],"INR","₹","భారతదేశ రూపాయి",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["అర్ధరాత్రి","ఉదయం","మధ్యాహ్నం","సాయంత్రం","రాత్రి"],u,u],u,["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    3Cx ˑ+#const u = undefined;
export default% "ఉదయం", K i "రాత్రి"], u, u], u, ["00:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=te.js.maplKɹx{"version":3,"file":"te.js","sourceRoot":"","sources":["te.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,WAAW,EAAC,SAAS,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,SAAS,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,iBAAiB,EAAC,cAAc,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,WAAW,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,QAAQ,EAAC,cAAc,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,gBAAgB,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"te\",[[\"ఉ\",\"సా\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"ఆ\",\"సో\",\"మ\",\"బు\",\"గు\",\"శు\",\"శ\"],[\"ఆది\",\"సోమ\",\"మంగళ\",\"బుధ\",\"గురు\",\"శుక్ర\",\"శని\"],[\"ఆదివారం\",\"సోమవారం\",\"మంగళవారం\",\"బుధవారం\",\"గురువారం\",\"శుక్రవారం\",\"శనివారం\"],[\"ఆది\",\"సోమ\",\"మం\",\"బుధ\",\"గురు\",\"శుక్ర\",\"శని\"]],u,[[\"జ\",\"ఫి\",\"మా\",\"ఏ\",\"మే\",\"జూ\",\"జు\",\"ఆ\",\"సె\",\"అ\",\"న\",\"డి\"],[\"జన\",\"ఫిబ్ర\",\"మార్చి\",\"ఏప్రి\",\"మే\",\"జూన్\",\"జులై\",\"ఆగ\",\"సెప్టెం\",\"అక్టో\",\"నవం\",\"డిసెం\"],[\"జనవరి\",\"ఫిబ్రవరి\",\"మార్చి\",\"ఏప్రిల్\",\"మే\",\"జూన్\",\"జులై\",\"ఆగస్టు\",\"సెప్టెంబర్\",\"అక్టోబర్\",\"నవంబర్\",\"డిసెంబర్\"]],u,[[\"క్రీపూ\",\"క్రీశ\"],u,[\"క్రీస్తు పూర్వం\",\"క్రీస్తు శకం\"]],0,[0,0],[\"dd-MM-yy\",\"d MMM, y\",\"d MMMM, y\",\"d, MMMM y, EEEE\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,\"{1} {0}కి\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##0%\",\"¤#,##,##0.00\",\"#E0\"],\"INR\",\"₹\",\"భారతదేశ రూపాయి\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}r@'xz ,eAAe,CAAC,CAAC,CAAC,YAAY,EAAC,MAAM,EAAC,WAAW 

OAAO,CAAC,CAAC\7export default [[[\"అర్ధరాత్రి\",\"ఉదయం\",\"మధ్యాహ్నం\",\"సాయంత్ర\",\"రాత్రి\"],u,u],u,[\"00:00\",[\"06:00\",\"12:00\"],[\"12:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}Söxv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['th'] = ["th",[["a","p"],["ก่อนเที่ยง","หลังเที่ยง"],u],[["ก่อนเที่ยง","หลังเที่ยง"],u,u],[["อา","จ","อ","พ","พฤ","ศ","ส"],["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."]],u,[["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],u,["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"]],u,[["ก่อน ค.ศ.","ค.ศ."],u,["ปีก่อนคริสตกาล","คริสต์ศักราช"]],0,[6,0],["d/M/yy","d MMM y","d MMMM G y","EEEEที่ d MMMM G y"],["HH:mm","HH:mm:ss","H นาฬิกา mm นาที ss วินาที z","H นาฬิกา mm นาที ss วินาที zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"THB","฿","บาท",{"AUD":["AU$","$"],"BYN":[u,"р."],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["เที่ยงคืน","เที่ยง","เช้า","เที่ยง","บ่าย","เย็น","ค่ำ","กลางคืน"],["เที่ยงคืน","เที่ยง","ในตอนเช้า","ในตอนบ่าย","บ่าย","ในตอนเย็น","ค่ำ","กลางคืน"],u],[["เที่ยงคืน","เที่ยง","เช้า","ช่วงเที่ยง","บ่าย","เย็น","ค่ำ","กลางคืน"],["เที่ยงคืน","เที่ยง","ในตอนเช้า","ในตอนบ่าย","บ่าย","ในตอนเย็น","ค่ำ","กลางคืน"],u],["00:00","12:00",["06:00","12:00"],["12:00","13:00"],["13:00","16:00"],["16:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    +Cʒ!x	ˑ+#const u = undefined;
export default" 1 "เช้า", 1. "บ่าย", "เย็น", "ค่ำ", 
 [1.
 1   "บ่าย", 
	 "ค่ำ", 
 u],   1 "เช้า", 	!. "บ่าย", "เย็น", "ค่ำ", 
 [1.
 1   "บ่าย", 
	 "ค่ำ", 
 u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "13:00"], ["13:00", "16:00"], ["16:00", "18:00"], ["18:00", "21:00"], ["211:00", "06:00"]]];
//# sourceMappingURL=th.js.mapp<x{"version":3,"file":"th.js","sourceRoot":"","sources":["th.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,WAAW,EAAC,MAAM,EAAC,WAAW,EAAC,KAAK,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,MAAM,EAAC,YAAY,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,WAAW,EAAC,MAAM,EAAC,WAAW,EAAC,KAAK,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"เที่ยงคืน\",\"เที่ยง\",\"เช้า\",\"เที่ยง\",\"บ่าย\",\"เย็น\",\"ค่ำ\",\"กลางคืน\"],[\"เที่ยงคืน\",\"เที่ยง\",\"ในตอนเช้า\",\"ในตอนบ่าย\",\"บ่าย\",\"ในตอนเย็น\",\"ค่ำ\",\"กลางคืน\"],u],[[\"เที่ยงคืน\",\"เที่ยง\",\"เช้า\",\"ช่วงเที่ยง\",\"บ่าย\",\"เย็น\",\"ค่ำ\",\"กลางคืน\"],[\"เที่ยงคืน\",\"เที่ยง\",\"ในตอนเช้า\",\"ในตอนบ่าย\",\"บ่าย\",\"ในตอนเย็น\",\"ค่ำ\",\"กลางคืน\"],u],[\"00:00\",\"12:00\",[\"06:00\",\"12:00\"],[\"12:00\",\"13:00\"],[\"13:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"21:00\"],[\"21:00\",\"06:00\"]]];\n"]}:1x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["gece", "ö", "sabah", "öğleden önce", "öğleden sonra", "akşamüstü", "akşam", "gece"], ["gece yarısı", "öğle", "sabah", "öğleden önce", "öğleden sonra", "akşamüstü", "akşam", "gece"], u], [["gece yarısı", "öğle", "sabah", "öğleden önce", "öğleden sonra", "akşamüstü", "akşam", "gece"], u, u], ["00:00", "12:00", ["06:00", "11:00"], ["11:00", "12:00"], ["12:00", "18:00"], ["18:00", "19:00"], ["19:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=tr-CY.js.map-(*xP/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["північ", "п", "ранку", "дня", "вечора", "ночі"], ["опівночі", "пополудні", "ранку", "дня", "вечора", "ночі"], u], [["північ", "полудень", "ранок", "день", "вечір", "ніч"], u, u], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "24:00"], ["00:00", "04:00"]]];
//# sourceMappingURL=uk.js.mapB$r)xf/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["mi", "n", "in the morning", "in the afternoon", "in the evening", "at night"], ["midnight", "noon", "in the morning", "in the afternoon", "in the evening", "at night"], u], [["midnight", "noon", "morning", "afternoon", "evening", "night"], u, u], ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "06:00"]]];
//# sourceMappingURL=und.js.mapƿ,x=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["آدھی رات", "صبح", "دوپہر", "سہ پہر", "شام", "رات"], u, ["آدھی رات", "صبح میں", "دوپہر میں", "سہ پہر", "شام میں", "رات میں"]], [["آدھی رات", "صبح", "دوپہر", "سہ پہر", "شام", "رات"], u, u], ["00:00", ["04:00", "12:00"], ["12:00", "16:00"], ["16:00", "18:00"], ["18:00", "20:00"], ["20:00", "04:00"]]];
//# sourceMappingURL=ur.js.mapqSx8{"version":3,"file":"ur.js","sourceRoot":"","sources":["ur.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,eAAe,CAAC,CAAC,CAAC,UAAU,EAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nexport default [[[\"آدھی رات\",\"صبح\",\"دوپہر\",\"سہ پہر\",\"شام\",\"رات\"],u,[\"آدھی رات\",\"صبح میں\",\"دوپہر میں\",\"سہ پہر\",\"شام میں\",\"رات میں\"]],[[\"آدھی رات\",\"صبح\",\"دوپہر\",\"سہ پہر\",\"شام\",\"رات\"],u,u],[\"00:00\",[\"04:00\",\"12:00\"],[\"12:00\",\"16:00\"],[\"16:00\",\"18:00\"],[\"18:00\",\"20:00\"],[\"20:00\",\"04:00\"]]];\n"]}<"x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["ярим тун", "туш пайти", "эрталаб", "кундузи", "кечқурун", "кечаси"], u, u], u, ["00:00", "12:00", ["06:00", "11:00"], ["11:00", "18:00"], ["18:00", "22:00"], ["22:00", "06:00"]]];
//# sourceMappingURL=uz-Cyrl.js.mapվx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["yarim tun", "tush payti", "ertalab", "kunduzi", "kechqurun", "kechasi"], u, u], u, ["00:00", "12:00", ["06:00", "11:00"], ["11:00", "18:00"], ["18:00", "22:00"], ["22:00", "06:00"]]];
//# sourceMappingURL=uz.js.map37-x#/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["nửa đêm", "tr", "sáng", "chiều", "tối", "đêm"], ["nửa đêm", "TR", "sáng", "chiều", "tối", "đêm"], u], [["nửa đêm", "trưa", "sáng", "chiều", "tối", "đêm"], ["nửa đêm", "TR", "sáng", "chiều", "tối", "đêm"], ["nửa đêm", "trưa", "sáng", "chiều", "tối", "đêm"]], ["00:00", "12:00", ["04:00", "12:00"], ["12:00", "18:00"], ["18:00", "21:00"], ["21:00", "04:00"]]];
//# sourceMappingURL=vi.js.mapgxI"x#/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["pituna pyterupé", "iandé-ara-pyturepé", "kuêma ramẽ", "karuka ramẽ", "pituna ramẽ", "pitunaeté ramẽ"], u, u], u, ["00:00", "12:00", ["06:00", "12:00"], ["12:00", "19:00"], ["19:00", "24:00"], ["00:00", "06:00"]]];
//# sourceMappingURL=yrl-VE.js.map%!x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["午夜", "清晨", "上午", "中午", "下午", "晚上", "凌晨"], u, u], u, ["00:00", ["05:00", "08:00"], ["08:00", "12:00"], ["12:00", "13:00"], ["13:00", "19:00"], ["19:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=zh-Hant.js.map.j"x@ 2$朝早", "中午", "下晝", "夜晚Vyue-Hant.js.map *x]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
export default [[["午夜", "早上", "上午", "中午", "下午", "晚上", "凌晨"], u, ["午夜", "清晨", "上午", "中午", "下午", "晚上", "凌晨"]], [["午夜", "早上", "上午", "中午", "下午", "晚上", "凌晨"], u, u], ["00:00", ["05:00", "08:00"], ["08:00", "12:00"], ["12:00", "13:00"], ["13:00", "19:00"], ["19:00", "24:00"], ["00:00", "05:00"]]];
//# sourceMappingURL=zh.js.mapoTx$/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["fa-AF", [["ق", "ب"], ["ق.ظ.", "ب.ظ."], ["قبل‌ازظهر", "بعدازظهر"]], u, [["ی", "د", "س", "چ", "پ", "ج", "ش"], ["یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], u, ["۱ش", "۲ش", "۳ش", "۴ش", "۵ش", "ج", "ش"]], u, [["ج", "ف", "م", "ا", "م", "ج", "ج", "ا", "س", "ا", "ن", "د"], ["جنو", "فبروری", "مارچ", "اپریل", "می", "جون", "جول", "اگست", "سپتمبر", "اکتوبر", "نومبر", "دسم"], ["جنوری", "فبروری", "مارچ", "اپریل", "می", "جون", "جولای", "اگست", "سپتمبر", "اکتوبر", "نومبر", "دسمبر"]], [["ج", "ف", "م", "ا", "م", "ج", "ج", "ا", "س", "ا", "ن", "د"], ["جنوری", "فبروری", "مارچ", "اپریل", "می", "جون", "جولای", "اگست", "سپتمبر", "اکتوبر", "نومبر", "دسمبر"], u], [["ق", "م"], ["ق.م.", "م."], ["قبل از میلاد", "میلادی"]], 6, [4, 5], ["y/M/d", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["H:mm", "H:mm:ss", "H:mm:ss (z)", "H:mm:ss (zzzz)"], ["{1}،‏ {0}", u, "{1}، ساعت {0}", u], [".", ",", ";", "%", "‎+", "‎−", "E", "×", "‰", "∞", "ناعدد", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "AFN", "؋", "افغانی افغانستان", { "AFN": ["؋"], "BYN": [u, "р."], "CAD": ["$CA", "$"], "CNY": ["¥CN", "¥"], "HKD": ["$HK", "$"], "IRR": ["ریال"], "MXN": ["$MX", "$"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "THB": ["฿"], "XCD": ["$EC", "$"], "XOF": ["فرانک CFA"] }, "rtl", plural];
//# sourceMappingURL=fa-AF.js.mapp:]x;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["fa", [["ق", "ب"], ["ق.ظ.", "ب.ظ."], ["قبل‌ازظهر", "بعدازظهر"]], u, [["ی", "د", "س", "چ", "پ", "ج", "ش"], ["یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], u, ["۱ش", "۲ش", "۳ش", "۴ش", "۵ش", "ج", "ش"]], u, [["ژ", "ف", "م", "آ", "م", "ژ", "ژ", "ا", "س", "ا", "ن", "د"], ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"], ["ژانویهٔ", "فوریهٔ", "مارس", "آوریل", "مهٔ", "ژوئن", "ژوئیهٔ", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"]], [["ژ", "ف", "م", "آ", "م", "ژ", "ژ", "ا", "س", "ا", "ن", "د"], ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"], u], [["ق", "م"], ["ق.م.", "م."], ["قبل از میلاد", "میلادی"]], 6, [5, 5], ["y/M/d", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["H:mm", "H:mm:ss", "H:mm:ss (z)", "H:mm:ss (zzzz)"], ["{1}،‏ {0}", u, "{1}، ساعت {0}", u], [".", ",", ";", "%", "‎+", "‎−", "E", "×", "‰", "∞", "ناعدد", ":"], ["#,##0.###", "#,##0%", "‎¤ #,##0.00", "#E0"], "IRR", "ریال", "ریال ایران", { "AFN": ["؋"], "BYN": [u, "р."], "CAD": ["$CA", "$"], "CNY": ["¥CN", "¥"], "HKD": ["$HK", "$"], "IRR": ["ریال"], "MXN": ["$MX", "$"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "THB": ["฿"], "XCD": ["$EC", "$"], "XOF": ["فرانک CFA"] }, "rtl", plural];
//# sourceMappingURL=fa.js.mapKxY{"version":3,"file":"fa.js","sourceRoot":"","sources":["fa.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"fa\",[[\"ق\",\"ب\"],[\"ق.ظ.\",\"ب.ظ.\"],[\"قبل‌ازظهر\",\"بعدازظهر\"]],u,[[\"ی\",\"د\",\"س\",\"چ\",\"پ\",\"ج\",\"ش\"],[\"یکشنبه\",\"دوشنبه\",\"سه‌شنبه\",\"چهارشنبه\",\"پنجشنبه\",\"جمعه\",\"شنبه\"],u,[\"۱ش\",\"۲ش\",\"۳ش\",\"۴ش\",\"۵ش\",\"ج\",\"ش\"]],u,[[\"ژ\",\"ف\",\"م\",\"آ\",\"م\",\"ژ\",\"ژ\",\"ا\",\"س\",\"ا\",\"ن\",\"د\"],[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"],[\"ژانویهٔ\",\"فوریهٔ\",\"مارس\",\"آوریل\",\"مهٔ\",\"ژوئن\",\"ژوئیهٔ\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"]],[[\"ژ\",\"ف\",\"م\",\"آ\",\"م\",\"ژ\",\"ژ\",\"ا\",\"س\",\"ا\",\"ن\",\"د\"],[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"],u],[[\"ق\",\"م\"],[\"ق.م.\",\"م.\"],[\"قبل از میلاد\",\"میلادی\"]],6,[5,5],[\"y/M/d\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss (z)\",\"H:mm:ss (zzzz)\"],[\"{1}،‏ {0}\",u,\"{1}، ساعت {0}\",u],[\".\",\",\",\";\",\"%\",\"‎+\",\"‎−\",\"E\",\"×\",\"‰\",\"∞\",\"ناعدد\",\":\"],[\"#,##0.###\",\"#,##0%\",\"‎¤ #,##0.00\",\"#E0\"],\"IRR\",\"ریال\",\"ریال ایران\",{\"AFN\":[\"؋\"],\"BYN\":[u,\"р.\"],\"CAD\":[\"$CA\",\"$\"],\"CNY\":[\"¥CN\",\"¥\"],\"HKD\":[\"$HK\",\"$\"],\"IRR\":[\"ریال\"],\"MXN\":[\"$MX\",\"$\"],\"NZD\":[\"$NZ\",\"$\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"XCD\":[\"$EC\",\"$\"],\"XOF\":[\"فرانک CFA\"]},\"rtl\", plural];\n"]}^Sx3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-BF", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XOF", "𞤅𞤊𞤀", "𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-BF.js.mapF5~ߺx*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-CM", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XAF", "𞤊𞤅𞤊𞤀", "𞤊𞤢𞤪𞤢𞤲 𞤚𞤵𞤦𞤮𞥅𞤪𞤭 𞤀𞤬𞤪𞤭𞤳𞤭𞤲𞤳𞤮", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-CM.js.mapyx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-GH", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "GHS", "GH₵", "𞤅𞤭𞤣𞤭 𞤘𞤢𞤲𞤢𞤲𞤳𞤮", { "BYN": [u, "р."], "GHS": ["GH₵"], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-GH.js.map[x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-GM", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "GMD", "D", "𞤁𞤢𞤤𞤢𞤧𞤭 𞤘𞤢𞤥𞤦𞤭𞤲𞤳𞤮", { "BYN": [u, "р."], "GMD": ["D"], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-GM.js.mapP_Ax3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-GW", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XOF", "𞤅𞤊𞤀", "𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-GW.js.map6x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-LR", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "LRD", "$", "𞤁𞤢𞤤𞤢 𞤂𞤭𞤦𞤫𞤪𞤭𞤴𞤢𞤲𞤳𞤮", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "LRD": ["$"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-LR.js.mapbx"/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-MR", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MRU", "UM", "𞤓𞤺𞤭𞤴𞤢 𞤃𞤮𞤪𞤭𞤼𞤢𞤲𞤭𞤴𞤢𞤲𞤳𞤮", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "MRU": ["UM"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-MR.js.maplx3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-NE", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XOF", "𞤅𞤊𞤀", "𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-NE.js.map~x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ff-Adlm-SL", [["𞤢", "𞤩"], ["𞤀𞤎", "𞤇𞤎"], u], [["𞤀𞤎", "𞤇𞤎"], u, u], [["𞤈", "𞤀𞥄", "𞤃", "𞤔", "𞤐", "𞤃", "𞤖"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"], ["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫", "𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫", "𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫", "𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫", "𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫", "𞤃𞤢𞤱𞤲𞤣𞤫", "𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"], ["𞤈𞤫𞤬", "𞤀𞥄𞤩𞤵", "𞤃𞤢𞤦", "𞤔𞤫𞤧", "𞤐𞤢𞥄𞤧", "𞤃𞤢𞤣", "𞤖𞤮𞤪"]], u, [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"], u], [["𞤅", "𞤕", "𞤄", "𞤅", "𞤁", "𞤑", "𞤃", "𞤔", "𞤅", "𞤒", "𞤔", "𞤄"], ["𞤅𞤭𞥅𞤤", "𞤕𞤮𞤤", "𞤐𞤦𞤮𞥅𞤴", "𞤅𞤫𞥅𞤼", "𞤁𞤵𞥅𞤶", "𞤑𞤮𞤪", "𞤃𞤮𞤪", "𞤔𞤵𞤳", "𞤅𞤭𞤤", "𞤒𞤢𞤪", "𞤔𞤮𞤤", "𞤄𞤮𞤱"], ["𞤅𞤭𞥅𞤤𞤮", "𞤕𞤮𞤤𞤼𞤮", "𞤐𞤦𞤮𞥅𞤴𞤮", "𞤅𞤫𞥅𞤼𞤮", "𞤁𞤵𞥅𞤶𞤮", "𞤑𞤮𞤪𞤧𞤮", "𞤃𞤮𞤪𞤧𞤮", "𞤔𞤵𞤳𞤮", "𞤅𞤭𞤤𞤼𞤮", "𞤒𞤢𞤪𞤳𞤮", "𞤔𞤮𞤤𞤮", "𞤄𞤮𞤱𞤼𞤮"]], [["𞤀𞤀𞤋", "𞤇𞤀𞤋"], u, ["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄", "𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]], 1, [6, 0], ["d-M-y", "d MMM⹁ y", "d MMMM⹁ y", "EEEE d MMMM⹁ y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1} 𞤉 {0}", u], [".", "⹁", ";", "%", "+", "-", "E", "×", "‰", "∞", "𞤏𞤮𞤈", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "SLL", "Le", "𞤂𞤫𞤴𞤮𞤲 𞤅𞤫𞤪𞤢𞤤𞤭𞤴𞤢𞤲𞤳𞤮", { "BYN": [u, "р."], "GNF": [u, "𞤊𞤘"], "JPY": ["JP¥", "¥"], "NGN": ["𞤐𞤐𞤘", "₦"], "PGK": ["𞤑𞤆𞤘"], "PHP": ["𞤆𞤆𞤖", "₱"], "SLL": ["Le"], "USD": ["US$", "$"], "XAF": ["𞤊𞤅𞤊𞤀"], "XOF": ["𞤅𞤊𞤀"] }, "rtl", plural];
//# sourceMappingURL=ff-Adlm-SL.js.mapf0Xxq/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn-GM", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "GMD", "D", "Dalasi Gammbi", { "GMD": ["D"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn-GM.js.map1YXx|/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff-Latn", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "Mbuuɗu Seefaa BCEAO", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff-Latn.js.map׍Wxy/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["ff", [["subaka", "kikiiɗe"], u, u], u, [["d", "a", "m", "n", "n", "m", "h"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"], ["dewo", "aaɓnde", "mawbaare", "njeslaare", "naasaande", "mawnde", "hoore-biir"], ["dew", "aaɓ", "maw", "nje", "naa", "mwd", "hbi"]], u, [["s", "c", "m", "s", "d", "k", "m", "j", "s", "y", "j", "b"], ["sii", "col", "mbo", "see", "duu", "kor", "mor", "juk", "slt", "yar", "jol", "bow"], ["siilo", "colte", "mbooy", "seeɗto", "duujal", "korse", "morso", "juko", "siilto", "yarkomaa", "jolal", "bowte"]], u, [["H-I", "C-I"], u, ["Hade Iisa", "Caggal Iisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "Mbuuɗu Seefaa BCEAO", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ff.js.mapɊ}x4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["fi", [["ap.", "ip."], u, u], u, [["S", "M", "T", "K", "T", "P", "L"], ["su", "ma", "ti", "ke", "to", "pe", "la"], ["sunnuntaina", "maanantaina", "tiistaina", "keskiviikkona", "torstaina", "perjantaina", "lauantaina"], ["su", "ma", "ti", "ke", "to", "pe", "la"]], [["S", "M", "T", "K", "T", "P", "L"], ["su", "ma", "ti", "ke", "to", "pe", "la"], ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai"], ["su", "ma", "ti", "ke", "to", "pe", "la"]], [["T", "H", "M", "H", "T", "K", "H", "E", "S", "L", "M", "J"], ["tammik.", "helmik.", "maalisk.", "huhtik.", "toukok.", "kesäk.", "heinäk.", "elok.", "syysk.", "lokak.", "marrask.", "jouluk."], ["tammikuuta", "helmikuuta", "maaliskuuta", "huhtikuuta", "toukokuuta", "kesäkuuta", "heinäkuuta", "elokuuta", "syyskuuta", "lokakuuta", "marraskuuta", "joulukuuta"]], [["T", "H", "M", "H", "T", "K", "H", "E", "S", "L", "M", "J"], ["tammi", "helmi", "maalis", "huhti", "touko", "kesä", "heinä", "elo", "syys", "loka", "marras", "joulu"], ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"]], [["eKr", "jKr"], ["eKr.", "jKr."], ["ennen Kristuksen syntymää", "jälkeen Kristuksen syntymän"]], 1, [6, 0], ["d.M.y", u, "d. MMMM y", "cccc d. MMMM y"], ["H.mm", "H.mm.ss", "H.mm.ss z", "H.mm.ss zzzz"], ["{1} {0}", "{1} 'klo' {0}", u, u], [",", " ", ";", "%", "+", "−", "E", "×", "‰", "∞", "epäluku", "."], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AOA": [], "ARS": [], "AUD": [], "BAM": [], "BBD": [], "BDT": [], "BMD": [], "BND": [], "BOB": [], "BRL": [], "BSD": [], "BWP": [], "BZD": [], "CAD": [], "CLP": [], "CNY": [], "COP": [], "CRC": [], "CUC": [], "CUP": [], "CZK": [], "DKK": [], "DOP": [], "EGP": [], "ESP": [], "FIM": ["mk"], "FJD": [], "FKP": [], "GEL": [], "GIP": [], "GNF": [], "GTQ": [], "GYD": [], "HKD": [], "HNL": [], "HRK": [], "HUF": [], "IDR": [], "ILS": [], "INR": [], "ISK": [], "JMD": [], "KHR": [], "KMF": [], "KPW": [], "KRW": [], "KYD": [], "KZT": [], "LAK": [], "LBP": [], "LKR": [], "LRD": [], "LTL": [], "LVL": [], "MGA": [], "MMK": [], "MNT": [], "MUR": [], "MXN": [], "MYR": [], "NAD": [], "NGN": [], "NIO": [], "NOK": [], "NPR": [], "NZD": [], "PHP": [], "PKR": [], "PLN": [], "PYG": [], "RON": [], "RWF": [], "SBD": [], "SEK": [], "SGD": [], "SHP": [], "SRD": [], "SSP": [], "STN": [u, "STD"], "SYP": [], "THB": [], "TOP": [], "TRY": [], "TTD": [], "TWD": [], "UAH": [], "UYU": [], "VEF": [], "VND": [], "XCD": [], "XPF": [], "XXX": [], "ZAR": [], "ZMW": [] }, "ltr", plural];
//# sourceMappingURL=fi.js.mapSRxL{"version":3,"file":"fi.js","sourceRoot":"","sources":["fi.ts"],"names":[],"mappings":"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AC,GAAG,EAAC,MAAM,EAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;\nreturn 5;\n}\n\nexport default [\"fi\",[[\"ap.\",\"ip.\"],u,u],u,[[\"S\",\"M\",\"T\",\"K\",\"T\",\"P\",\"L\"],[\"su\",\"ma\",\"ti\",\"ke\",\"to\",\"pe\",\"la\"],[\"sunnuntaina\",\"maanantaina\",\"tiistaina\",\"keskiviikkona\",\"torstaina\",\"perjantaina\",\"lauantaina\"],[\"su\",\"ma\",\"ti\",\"ke\",\"to\",\"pe\",\"la\"]],[[\"S\",\"M\",\"T\",\"K\",\"T\",\"P\",\"L\"],[\"su\",\"ma\",\"ti\",\"ke\",\"to\",\"pe\",\"la\"],[\"sunnuntai\",\"maanantai\",\"tiistai\",\"keskiviikko\",\"torstai\",\"perjantai\",\"lauantai\"],[\"su\",\"ma\",\"ti\",\"ke\",\"to\",\"pe\",\"la\"]],[[\"T\",\"H\",\"M\",\"H\",\"T\",\"K\",\"H\",\"E\",\"S\",\"L\",\"M\",\"J\"],[\"tammik.\",\"helmik.\",\"maalisk.\",\"huhtik.\",\"toukok.\",\"kesäk.\",\"heinäk.\",\"elok.\",\"syysk.\",\"lokak.\",\"marrask.\",\"jouluk.\"],[\"tammikuuta\",\"helmikuuta\",\"maaliskuuta\",\"huhtikuuta\",\"toukokuuta\",\"kesäkuuta\",\"heinäkuuta\",\"elokuuta\",\"syyskuuta\",\"lokakuuta\",\"marraskuuta\",\"joulukuuta\"]],[[\"T\",\"H\",\"M\",\"H\",\"T\",\"K\",\"H\",\"E\",\"S\",\"L\",\"M\",\"J\"],[\"tammi\",\"helmi\",\"maalis\",\"huhti\",\"touko\",\"kesä\",\"heinä\",\"elo\",\"syys\",\"loka\",\"marras\",\"joulu\"],[\"tammikuu\",\"helmikuu\",\"maaliskuu\",\"huhtikuu\",\"toukokuu\",\"kesäkuu\",\"heinäkuu\",\"elokuu\",\"syyskuu\",\"lokakuu\",\"marraskuu\",\"joulukuu\"]],[[\"eKr\",\"jKr\"],[\"eKr.\",\"jKr.\"],[\"ennen Kristuksen syntymää\",\"jälkeen Kristuksen syntymän\"]],1,[6,0],[\"d.M.y\",u,\"d. MMMM y\",\"cccc d. MMMM y\"],[\"H.mm\",\"H.mm.ss\",\"H.mm.ss z\",\"H.mm.ss zzzz\"],[\"{1} {0}\",\"{1} 'klo' {0}\",u,u],[\",\",\" \",\";\",\"%\",\"+\",\"−\",\"E\",\"×\",\"‰\",\"∞\",\"epäluku\",\".\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"AOA\":[],\"ARS\":[],\"AUD\":[],\"BAM\":[],\"BBD\":[],\"BDT\":[],\"BMD\":[],\"BND\":[],\"BOB\":[],\"BRL\":[],\"BSD\":[],\"BWP\":[],\"BZD\":[],\"CAD\":[],\"CLP\":[],\"CNY\":[],\"COP\":[],\"CRC\":[],\"CUC\":[],\"CUP\":[],\"CZK\":[],\"DKK\":[],\"DOP\":[],\"EGP\":[],\"ESP\":[],\"FIM\":[\"mk\"],\"FJD\":[],\"FKP\":[],\"GEL\":[],\"GIP\":[],\"GNF\":[],\"GTQ\":[],\"GYD\":[],\"HKD\":[],\"HNL\":[],\"HRK\":[],\"HUF\":[],\"IDR\":[],\"ILS\":[],\"INR\":[],\"ISK\":[],\"JMD\":[],\"KHR\":[],\"KMF\":[],\"KPW\":[],\"KRW\":[],\"KYD\":[],\"KZT\":[],\"LAK\":[],\"LBP\":[],\"LKR\":[],\"LRD\":[],\"LTL\":[],\"LVL\":[],\"MGA\":[],\"MMK\":[],\"MNT\":[],\"MUR\":[],\"MXN\":[],\"MYR\":[],\"NAD\":[],\"NGN\":[],\"NIO\":[],\"NOK\":[],\"NPR\":[],\"NZD\":[],\"PHP\":[],\"PKR\":[],\"PLN\":[],\"PYG\":[],\"RON\":[],\"RWF\":[],\"SBD\":[],\"SEK\":[],\"SGD\":[],\"SHP\":[],\"SRD\":[],\"SSP\":[],\"STN\":[u,\"STD\"],\"SYP\":[],\"THB\":[],\"TOP\":[],\"TRY\":[],\"TTD\":[],\"TWD\":[],\"UAH\":[],\"UYU\":[],\"VEF\":[],\"VND\":[],\"XCD\":[],\"XPF\":[],\"XXX\":[],\"ZAR\":[],\"ZMW\":[]},\"ltr\", plural];\n"]}7F_wxw/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i === 1 || (i === 2 || i === 3)) || (v === 0 && !(i % 10 === 4 || (i % 10 === 6 || i % 10 === 9)) || !(v === 0) && !(f % 10 === 4 || (f % 10 === 6 || f % 10 === 9))))
        return 1;
    return 5;
}
export default ["fil", [["am", "pm"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["Lin", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab"], u, ["Linggo", "Lunes", "Martes", "Miyerkules", "Huwebes", "Biyernes", "Sabado"], ["Li", "Lu", "Ma", "Mi", "Hu", "Bi", "Sa"]], u, [["Ene", "Peb", "Mar", "Abr", "May", "Hun", "Hul", "Ago", "Set", "Okt", "Nob", "Dis"], u, ["Enero", "Pebrero", "Marso", "Abril", "Mayo", "Hunyo", "Hulyo", "Agosto", "Setyembre", "Oktubre", "Nobyembre", "Disyembre"]], [["E", "P", "M", "A", "M", "Hun", "Hul", "Ago", "Set", "Okt", "Nob", "Dis"], ["Ene", "Peb", "Mar", "Abr", "May", "Hun", "Hul", "Ago", "Set", "Okt", "Nob", "Dis"], ["Enero", "Pebrero", "Marso", "Abril", "Mayo", "Hunyo", "Hulyo", "Agosto", "Setyembre", "Oktubre", "Nobyembre", "Disyembre"]], [["BC", "AD"], u, ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'nang' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "PHP", "₱", "Piso ng Pilipinas", { "BYN": [u, "р."], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=fil.js.map	}xT{"version":3,"file":"fil.js","sourceRoot":"","sources":["fil.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i === 1 || (i === 2 || i === 3)) || (v === 0 && !(i % 10 === 4 || (i % 10 === 6 || i % 10 === 9)) || !(v === 0) && !(f % 10 === 4 || (f % 10 === 6 || f % 10 === 9))))\n    return 1;\nreturn 5;\n}\n\nexport default [\"fil\",[[\"am\",\"pm\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"Lin\",\"Lun\",\"Mar\",\"Miy\",\"Huw\",\"Biy\",\"Sab\"],u,[\"Linggo\",\"Lunes\",\"Martes\",\"Miyerkules\",\"Huwebes\",\"Biyernes\",\"Sabado\"],[\"Li\",\"Lu\",\"Ma\",\"Mi\",\"Hu\",\"Bi\",\"Sa\"]],u,[[\"Ene\",\"Peb\",\"Mar\",\"Abr\",\"May\",\"Hun\",\"Hul\",\"Ago\",\"Set\",\"Okt\",\"Nob\",\"Dis\"],u,[\"Enero\",\"Pebrero\",\"Marso\",\"Abril\",\"Mayo\",\"Hunyo\",\"Hulyo\",\"Agosto\",\"Setyembre\",\"Oktubre\",\"Nobyembre\",\"Disyembre\"]],[[\"E\",\"P\",\"M\",\"A\",\"M\",\"Hun\",\"Hul\",\"Ago\",\"Set\",\"Okt\",\"Nob\",\"Dis\"],[\"Ene\",\"Peb\",\"Mar\",\"Abr\",\"May\",\"Hun\",\"Hul\",\"Ago\",\"Set\",\"Okt\",\"Nob\",\"Dis\"],[\"Enero\",\"Pebrero\",\"Marso\",\"Abril\",\"Mayo\",\"Hunyo\",\"Hulyo\",\"Agosto\",\"Setyembre\",\"Oktubre\",\"Nobyembre\",\"Disyembre\"]],[[\"BC\",\"AD\"],u,[\"Before Christ\",\"Anno Domini\"]],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'nang' {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"PHP\",\"₱\",\"Piso ng Pilipinas\",{\"BYN\":[u,\"р.\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}W|x0/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["fo-DK", [["AM", "PM"], u, u], u, [["S", "M", "T", "M", "H", "F", "L"], ["sun.", "mán.", "týs.", "mik.", "hós.", "frí.", "ley."], ["sunnudagur", "mánadagur", "týsdagur", "mikudagur", "hósdagur", "fríggjadagur", "leygardagur"], ["su.", "má.", "tý.", "mi.", "hó.", "fr.", "le."]], [["S", "M", "T", "M", "H", "F", "L"], ["sun", "mán", "týs", "mik", "hós", "frí", "ley"], ["sunnudagur", "mánadagur", "týsdagur", "mikudagur", "hósdagur", "fríggjadagur", "leygardagur"], ["su", "má", "tý", "mi", "hó", "fr", "le"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mar.", "apr.", "mai", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "des."], ["januar", "februar", "mars", "apríl", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des"], ["januar", "februar", "mars", "apríl", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["fKr", "eKr"], ["f.Kr.", "e.Kr."], ["fyri Krist", "eftir Krist"]], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'kl'. {0}", u], [",", ".", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "DKK", "kr.", "donsk króna", { "BYN": [u, "р."], "DKK": ["kr.", "kr"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=fo-DK.js.map)8|x>/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["fo", [["AM", "PM"], u, u], u, [["S", "M", "T", "M", "H", "F", "L"], ["sun.", "mán.", "týs.", "mik.", "hós.", "frí.", "ley."], ["sunnudagur", "mánadagur", "týsdagur", "mikudagur", "hósdagur", "fríggjadagur", "leygardagur"], ["su.", "má.", "tý.", "mi.", "hó.", "fr.", "le."]], [["S", "M", "T", "M", "H", "F", "L"], ["sun", "mán", "týs", "mik", "hós", "frí", "ley"], ["sunnudagur", "mánadagur", "týsdagur", "mikudagur", "hósdagur", "fríggjadagur", "leygardagur"], ["su", "má", "tý", "mi", "hó", "fr", "le"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mar.", "apr.", "mai", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "des."], ["januar", "februar", "mars", "apríl", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des"], ["januar", "februar", "mars", "apríl", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["fKr", "eKr"], ["f.Kr.", "e.Kr."], ["fyri Krist", "eftir Krist"]], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'kl'. {0}", u], [",", ".", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "DKK", "kr", "donsk króna", { "BYN": [u, "р."], "DKK": ["kr"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=fo.js.map4x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-BE", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["d/MM/yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "H 'h' mm 'min' ss 's' zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-BE.js.mapꛂx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-BF", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "franc CFA (BCEAO)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-BF.js.map x6 NCPF", "FCFP", "franc CFPB	NC.js.mapgQx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-BI", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "BIF", "FBu", "franc burundais", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BIF": ["FBu"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-BI.js.map7HJ
x5 REEUR", "€", "euro<@g	RE.js.mapPyx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-BJ", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "franc CFA (BCEAO)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-BJ.js.map)x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-BL", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-BL.js.mapx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-CA", [["a", "p"], ["a.m.", "p.m."], u], [["a.m.", "p.m."], u, u], [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juill.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 0, [6, 0], ["y-MM-dd", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH 'h' mm", "HH 'h' mm 'min' ss 's'", "HH 'h' mm 'min' ss 's' z", "HH 'h' mm 'min' ss 's' zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "CAD", "$", "dollar canadien", { "AUD": ["$ AU", "$"], "BEF": ["FB"], "BYN": [u, "Br"], "CAD": ["$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FRF": ["F"], "GEL": [], "HKD": ["$ HK", "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ILS": [u, "₪"], "INR": [u, "₹"], "ITL": ["₤IT"], "KRW": [u, "₩"], "LBP": [u, "£L"], "MTP": ["£MT"], "MXN": [u, "$"], "NZD": ["$ NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SGD": ["$ SG", "$"], "TOP": [u, "$T"], "TWD": [u, "NT$"], "USD": ["$ US", "$"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XOF": [], "XPF": [] }, "ltr", plural];
//# sourceMappingURL=fr-CA.js.maplx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-CD", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "CDF", "FC", "franc congolais", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CDF": ["FC"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-CD.js.mapDx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-CF", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "franc CFA (BEAC)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-CF.js.map,x 
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-SC", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "SCR", "SR", "roupie des Seychelles", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SCR": ["SR"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-SC.js.mapgxB CGXAF", "FCFA", "franc CFA (BEAC)A	CG.js.map_x5 GFEUR", "€", "euroA	GF.js.mapax	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-CH", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd.MM.yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH.mm:ss 'h' zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":", "."], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "CHF", "CHF", "franc suisse", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-CH.js.mapx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-CI", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "franc CFA (BCEAO)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-CI.js.map)x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-CM", [["mat.", "soir"], u, ["matin", "soir"]], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "franc CFA (BEAC)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-CM.js.map2С)x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-DJ", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 6, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "DJF", "Fdj", "franc djiboutien", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "DJF": ["Fdj"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-DJ.js.mapܡM\x?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    ARS: string[];
    AUD: string[];
    BEF: string[];
    BMD: string[];
    BND: string[];
    BYN: (string | undefined)[];
    BZD: string[];
    CAD: string[];
    CLP: string[];
    CNY: (string | undefined)[];
    COP: string[];
    CYP: string[];
    EGP: (string | undefined)[];
    FJD: string[];
    FKP: string[];
    FRF: string[];
    GBP: string[];
    GIP: string[];
    HKD: (string | undefined)[];
    IEP: string[];
    ILP: string[];
    ITL: string[];
    JPY: (string | undefined)[];
    KMF: (string | undefined)[];
    LBP: string[];
    MTP: string[];
    MXN: string[];
    NAD: string[];
    NIO: (string | undefined)[];
    NZD: string[];
    PHP: (string | undefined)[];
    RHD: string[];
    RON: (string | undefined)[];
    RWF: string[];
    SBD: string[];
    SGD: string[];
    SRD: string[];
    TOP: (string | undefined)[];
    TTD: string[];
    TWD: (string | undefined)[];
    USD: string[];
    UYU: string[];
    WST: string[];
    XCD: (string | undefined)[];
    XPF: string[];
    ZMW: (string | undefined)[];
} | undefined)[];
export default _default;
>zMx yDZDi}Crdux o}VUV!ox	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-DZ", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 6, [5, 6], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "DZD", "DA", "dinar algérien", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "DZD": ["DA"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-DZ.js.mapx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-GA", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "franc CFA (BEAC)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-GA.js.map
,*x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-GN", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "GNF", "FG", "franc guinéen", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "GNF": ["FG"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-GN.js.map@xF KMKMF", "CF", "franc comori8p^"CF"	KM.js.map!x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-GP", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-GP.js.mapQx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-SN", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "franc CFA (BCEAO)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-SN.js.mapn x< GQAF", "FCFA", "franc CFA (BEACA	GQ.js.map-_x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-HT", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "HTG", "G", "gourde haïtienne", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "HTG": ["G"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-HT.js.map2x	 /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-LU", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "LUF": ["F"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-LU.js.mapɖںx

/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-MA", [["AM", "PM"], u, ["a.m.", "p.m."]], [["AM", "PM"], u, u], [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fév.", "mar.", "avr.", "mai", "jui.", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "MAD", "MAD", "dirham marocain", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-MA.js.map x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-MC", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-MC.js.mapߘx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-MF", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-MF.js.mapꘘx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-MG", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "MGA", "Ar", "ariary malgache", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MGA": ["Ar"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-MG.js.map	yx< PFXPF", "FCFP", "franc CFP;:	PF.js.mapFx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-ML", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "franc CFA (BCEAO)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-ML.js.map<zx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-MQ", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-MQ.js.mapG̘x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-MR", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "MRU", "UM", "ouguiya mauritanien", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MRU": ["UM"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-MR.js.map3R/x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-MU", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "MUR", "Rs", "roupie mauricienne", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MUR": ["Rs"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-MU.js.mapx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-NE", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "franc CFA (BCEAO)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-NE.js.map]x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-PM", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-PM.js.map@yx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-RW", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "RWF", "RF", "franc rwandais", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": ["RF", "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-RW.js.map~^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    ARS: string[];
    AUD: string[];
    BEF: string[];
    BMD: string[];
    BND: string[];
    BYN: (string | undefined)[];
    BZD: string[];
    CAD: string[];
    CLP: string[];
    CNY: (string | undefined)[];
    COP: string[];
    CYP: string[];
    EGP: (string | undefined)[];
    FJD: string[];
    FKP: string[];
    FRF: string[];
    GBP: string[];
    GIP: string[];
    HKD: (string | undefined)[];
    IEP: string[];
    ILP: string[];
    ITL: string[];
    JPY: (string | undefined)[];
    KMF: (string | undefined)[];
    LBP: string[];
    MTP: string[];
    MXN: string[];
    NAD: string[];
    NIO: (string | undefined)[];
    NZD: string[];
    PHP: (string | undefined)[];
    RHD: string[];
    RON: (string | undefined)[];
    RWF: (string | undefined)[];
    SBD: string[];
    SGD: string[];
    SRD: string[];
    SYP: string[];
    TOP: (string | undefined)[];
    TTD: string[];
    TWD: (string | undefined)[];
    USD: string[];
    UYU: string[];
    WST: string[];
    XCD: (string | undefined)[];
    XPF: string[];
    ZMW: (string | undefined)[];
} | undefined)[];
export default _default;
5ೠx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-SY", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 6, [5, 6], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "SYP", "LS", "livre syrienne", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "SYP": ["LS", "£"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-SY.js.mapAx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-TD", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "franc CFA (BEAC)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-TD.js.mapXx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-TG", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XOF", "F CFA", "franc CFA (BCEAO)", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-TG.js.mapx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-TN", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "TND", "DT", "dinar tunisien", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TND": ["DT"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-TN.js.mapv⽟x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-VU", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "VUV", "VT", "vatu vanuatuan", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "VUV": ["VT"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-VU.js.mapMdxe YT+HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:sstEUR", "€", "euro>:	m	YT.js.mapmR뷞x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr-WF", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "XPF", "FCFP", "franc CFP", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr-WF.js.mapx	$/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 0 || i === 1)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["fr", [["AM", "PM"], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], ["di", "lu", "ma", "me", "je", "ve", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."], ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]], u, [["av. J.-C.", "ap. J.-C."], u, ["avant Jésus-Christ", "après Jésus-Christ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", "{1} 'à' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "ARS": ["$AR", "$"], "AUD": ["$AU", "$"], "BEF": ["FB"], "BMD": ["$BM", "$"], "BND": ["$BN", "$"], "BYN": [u, "р."], "BZD": ["$BZ", "$"], "CAD": ["$CA", "$"], "CLP": ["$CL", "$"], "CNY": [u, "¥"], "COP": ["$CO", "$"], "CYP": ["£CY"], "EGP": [u, "£E"], "FJD": ["$FJ", "$"], "FKP": ["£FK", "£"], "FRF": ["F"], "GBP": ["£GB", "£"], "GIP": ["£GI", "£"], "HKD": [u, "$"], "IEP": ["£IE"], "ILP": ["£IL"], "ITL": ["₤IT"], "JPY": [u, "¥"], "KMF": [u, "FC"], "LBP": ["£LB", "£L"], "MTP": ["£MT"], "MXN": ["$MX", "$"], "NAD": ["$NA", "$"], "NIO": [u, "$C"], "NZD": ["$NZ", "$"], "PHP": [u, "₱"], "RHD": ["$RH"], "RON": [u, "L"], "RWF": [u, "FR"], "SBD": ["$SB", "$"], "SGD": ["$SG", "$"], "SRD": ["$SR", "$"], "TOP": [u, "$T"], "TTD": ["$TT", "$"], "TWD": [u, "NT$"], "USD": ["$US", "$"], "UYU": ["$UY", "$"], "WST": ["$WS"], "XCD": [u, "$"], "XPF": ["FCFP"], "ZMW": [u, "Kw"] }, "ltr", plural];
//# sourceMappingURL=fr.js.mapRx&/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["fur", [["a.", "p."], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dom", "lun", "mar", "mie", "joi", "vin", "sab"], ["domenie", "lunis", "martars", "miercus", "joibe", "vinars", "sabide"], ["dom", "lun", "mar", "mie", "joi", "vin", "sab"]], u, [["Z", "F", "M", "A", "M", "J", "L", "A", "S", "O", "N", "D"], ["Zen", "Fev", "Mar", "Avr", "Mai", "Jug", "Lui", "Avo", "Set", "Otu", "Nov", "Dic"], ["Zenâr", "Fevrâr", "Març", "Avrîl", "Mai", "Jugn", "Lui", "Avost", "Setembar", "Otubar", "Novembar", "Dicembar"]], u, [["pdC", "ddC"], u, u], 1, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'di' MMMM 'dal' y", "EEEE d 'di' MMMM 'dal' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "EUR", "€", "euro", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=fur.js.map4iMdxN/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    if (n === Math.floor(n) && (n >= 3 && n <= 6))
        return 3;
    if (n === Math.floor(n) && (n >= 7 && n <= 10))
        return 4;
    return 5;
}
export default ["ga", [["r.n.", "i.n."], u, u], u, [["D", "L", "M", "C", "D", "A", "S"], ["Domh", "Luan", "Máirt", "Céad", "Déar", "Aoine", "Sath"], ["Dé Domhnaigh", "Dé Luain", "Dé Máirt", "Dé Céadaoin", "Déardaoin", "Dé hAoine", "Dé Sathairn"], ["Do", "Lu", "Má", "Cé", "Dé", "Ao", "Sa"]], u, [["E", "F", "M", "A", "B", "M", "I", "L", "M", "D", "S", "N"], ["Ean", "Feabh", "Márta", "Aib", "Beal", "Meith", "Iúil", "Lún", "MFómh", "DFómh", "Samh", "Noll"], ["Eanáir", "Feabhra", "Márta", "Aibreán", "Bealtaine", "Meitheamh", "Iúil", "Lúnasa", "Meán Fómhair", "Deireadh Fómhair", "Samhain", "Nollaig"]], u, [["RC", "AD"], u, ["Roimh Chríost", "Anno Domini"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "Nuimh", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "EUR", "€", "Euro", { "RUR": [u, "р."], "THB": ["฿"], "TWD": ["NT$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ga.js.map
ǂx#/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1 || n === 11)
        return 1;
    if (n === 2 || n === 12)
        return 2;
    if (n === Math.floor(n) && (n >= 3 && n <= 10 || n >= 13 && n <= 19))
        return 3;
    return 5;
}
export default ["gd", [["m", "f"], u, u], u, [["D", "L", "M", "C", "A", "H", "S"], ["DiD", "DiL", "DiM", "DiC", "Dia", "Dih", "DiS"], ["DiDòmhnaich", "DiLuain", "DiMàirt", "DiCiadain", "DiarDaoin", "DihAoine", "DiSathairne"], ["Dò", "Lu", "Mà", "Ci", "Da", "hA", "Sa"]], u, [["F", "G", "M", "G", "C", "Ò", "I", "L", "S", "D", "S", "D"], ["Faoi", "Gearr", "Màrt", "Gibl", "Cèit", "Ògmh", "Iuch", "Lùna", "Sult", "Dàmh", "Samh", "Dùbh"], ["dhen Fhaoilleach", "dhen Ghearran", "dhen Mhàrt", "dhen Ghiblean", "dhen Chèitean", "dhen Ògmhios", "dhen Iuchar", "dhen Lùnastal", "dhen t-Sultain", "dhen Dàmhair", "dhen t-Samhain", "dhen Dùbhlachd"]], [["F", "G", "M", "G", "C", "Ò", "I", "L", "S", "D", "S", "D"], ["Faoi", "Gearr", "Màrt", "Gibl", "Cèit", "Ògmh", "Iuch", "Lùna", "Sult", "Dàmh", "Samh", "Dùbh"], ["Am Faoilleach", "An Gearran", "Am Màrt", "An Giblean", "An Cèitean", "An t-Ògmhios", "An t-Iuchar", "An Lùnastal", "An t-Sultain", "An Dàmhair", "An t-Samhain", "An Dùbhlachd"]], [["R", "A"], ["RC", "AD"], ["Ro Chrìosta", "An dèidh Chrìosta"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d'mh' MMMM y", "EEEE, d'mh' MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GBP", "£", "Punnd Sasannach", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "leu"], "RUR": [u, "р."], "THB": ["฿"], "TWD": ["NT$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=gd.js.maptoM⿇x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["gl", [["a.m.", "p.m."], u, u], u, [["d.", "l.", "m.", "m.", "x.", "v.", "s."], ["dom.", "luns", "mar.", "mér.", "xov.", "ven.", "sáb."], ["domingo", "luns", "martes", "mércores", "xoves", "venres", "sábado"], ["do.", "lu.", "ma.", "mé.", "xo.", "ve.", "sá."]], [["D", "L", "M", "M", "X", "V", "S"], ["Dom.", "Luns", "Mar.", "Mér.", "Xov.", "Ven.", "Sáb."], ["Domingo", "Luns", "Martes", "Mércores", "Xoves", "Venres", "Sábado"], ["Do", "Lu", "Ma", "Mé", "Xo", "Ve", "Sá"]], [["x.", "f.", "m.", "a.", "m.", "x.", "x.", "a.", "s.", "o.", "n.", "d."], ["xan.", "feb.", "mar.", "abr.", "maio", "xuño", "xul.", "ago.", "set.", "out.", "nov.", "dec."], ["xaneiro", "febreiro", "marzo", "abril", "maio", "xuño", "xullo", "agosto", "setembro", "outubro", "novembro", "decembro"]], [["X", "F", "M", "A", "M", "X", "X", "A", "S", "O", "N", "D"], ["Xan.", "Feb.", "Mar.", "Abr.", "Maio", "Xuño", "Xul.", "Ago.", "Set.", "Out.", "Nov.", "Dec."], ["Xaneiro", "Febreiro", "Marzo", "Abril", "Maio", "Xuño", "Xullo", "Agosto", "Setembro", "Outubro", "Novembro", "Decembro"]], [["a.C.", "d.C."], u, ["antes de Cristo", "despois de Cristo"]], 1, [6, 0], ["dd/MM/yy", "d 'de' MMM 'de' y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{0}, {1}", u, "{0} 'do' {1}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "BYN": [u, "Br"], "ESP": ["₧"], "JPY": ["JP¥", "¥"], "KMF": [u, "FC"], "MXN": ["$MX", "$"], "PHP": [u, "₱"], "RUB": [u, "руб"], "THB": ["฿"], "TWD": ["NT$"], "XCD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=gl.js.mapeYxl{"version":3,"file":"si.js","sourceRoot":"","sources":["si.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (n === 0 || n === 1 || i === 0 && f === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"si\",[[\"පෙ\",\"ප\"],[\"පෙ.ව.\",\"ප.ව.\"],u],[[\"පෙ.ව.\",\"ප.ව.\"],u,u],[[\"ඉ\",\"ස\",\"අ\",\"බ\",\"බ්‍ර\",\"සි\",\"සෙ\"],[\"ඉරිදා\",\"සඳුදා\",\"අඟහ\",\"බදාදා\",\"බ්‍රහස්\",\"සිකු\",\"සෙන\"],[\"ඉරිදා\",\"සඳුදා\",\"අඟහරුවාදා\",\"බදාදා\",\"බ්‍රහස්පතින්දා\",\"සිකුරාදා\",\"සෙනසුරාදා\"],[\"ඉරි\",\"සඳු\",\"අඟ\",\"බදා\",\"බ්‍රහ\",\"සිකු\",\"සෙන\"]],u,[[\"ජ\",\"පෙ\",\"මා\",\"අ\",\"මැ\",\"ජූ\",\"ජූ\",\"අ\",\"සැ\",\"ඔ\",\"නෙ\",\"දෙ\"],[\"ජන\",\"පෙබ\",\"මාර්තු\",\"අප්‍රේල්\",\"මැයි\",\"ජූනි\",\"ජූලි\",\"අගෝ\",\"සැප්\",\"ඔක්\",\"නොවැ\",\"දෙසැ\"],[\"ජනවාරි\",\"පෙබරවාරි\",\"මාර්තු\",\"අප්‍රේල්\",\"මැයි\",\"ජූනි\",\"ජූලි\",\"අගෝස්තු\",\"සැප්තැම්බර්\",\"ඔක්තෝබර්\",\"නොවැම්බර්\",\"දෙසැම්බර්\"]],[[\"ජ\",\"පෙ\",\"මා\",\"අ\",\"මැ\",\"ජූ\",\"ජූ\",\"අ\",\"සැ\",\"ඔ\",\"නෙ\",\"දෙ\"],[\"ජන\",\"පෙබ\",\"මාර්\",\"අප්‍රේල්\",\"මැයි\",\"ජූනි\",\"ජූලි\",\"අගෝ\",\"සැප්\",\"ඔක්\",\"නොවැ\",\"දෙසැ\"],[\"ජනවාරි\",\"පෙබරවාරි\",\"මාර්තු\",\"අප්‍රේල්\",\"මැයි\",\"ජූනි\",\"ජූලි\",\"අගෝස්තු\",\"සැප්තැම්බර්\",\"ඔක්තෝබර්\",\"නොවැම්බර්\",\"දෙසැම්බර්\"]],[[\"ක්‍රි.පූ.\",\"ක්‍රි.ව.\"],u,[\"ක්‍රිස්තු පූර්ව\",\"ක්‍රිස්තු වර්ෂ\"]],1,[6,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\"HH.mm\",\"HH.mm.ss\",\"HH.mm.ss z\",\"HH.mm.ss zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\".\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#\"],\"LKR\",\"රු.\",\"ශ්‍රී ලංකා රුපියල\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"LKR\":[\"රු.\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XOF\":[\"සිෆ්එ\"]},\"ltr\", plural];\n"]}-O!x	-)gl!gl:$7CAAC,MAAM,CAAC;IAEj});QAClBQ



3==
;MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,CAAC	




p6A
C/"==
BMAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,C




gp








3====
UAAU,E86OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAUap6d

C/"====
UAAU,E86OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,UAAUap
OmBAAm`>'UAAU,EAAC,mBAAmB,EAAC,oBAAoB,EAAC,0BAA0CUAAU,EAAC,CAAC,EAAC,cAAcSAAS,EAAC,YAAY,E	GAAG,EAAC,MAAMB	#	#	P	(CAAC,E	"	<	"
v = (".length;\n\nif (i === 1 && v === 024gl\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"d.\",\"l.\",\"m.\",\"m.\",\"x.\",\"v.\",\"s.\"],[\"dom.\",\"luns\",\"mar.\",\"mér.\",\"xov.\",\"ven.\",\"sáb.\"],[\"domingo\",\"luns\",\"martes\",\"mércores\",\"xoves\",\"venres\",\"sábado\"],[\"do.\",\"lu.\",\"ma.\",\"mé.\",\"xo.\",\"ve.\",\"sá.\"]],[[\"D\",\"L\",\"M\",\"M\",\"X\",\"V\",\"S\"],[\"Dom.\",\"Luns\",\"Mar.\",\"Mér.\",\"Xov.\",\"Ven.\",\"Sáb.\"],[\"Domingo\",\"Luns\",\"Martes\",\"Mércores\",\"Xoves\",\"Venres\",\"Sábado\"],[\"Do\",\"Lu\",\"Ma\",\"Mé\",\"Xo\",\"Ve\",\"Sá\"]],[[\"x.\",\"f.\",\"m.\",\"a.\",\"m.\",\"x.\",\"x.\",\"a.\",\"s.\",\"o.\",\"n.\",\"d.\"],[\"xan.\",\"feb.\",\"mar.\",\"abr.\",\"maio\",\"xuño\",\"xul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dec.\"],[\"xaneiro\",\"febreiro\",\"marzo\",\"abril\",\"maio\",\"xuño\",\"xullo\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"decembro\"]],[[\"X\",\"F\",\"M\",\"A\",\"M\",\"X\",\"X\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Xan.\",\"Feb.\",\"Mar.\",\"Abr.\",\"Maio\",\"Xuño\",\"Xul.\",\"Ago.\",\"Set.\",\"Out.\",\"Nov.\",\"Dec.\"],[\"Xaneiro\",\"Febreiro\",\"Marzo\",\"Abril\",\"Maio\",\"Xuño\",\"Xullo\",\"Agosto\",\"Setembro\",\"Outubro\",\"Novembro\",\"Decembro\"]],[[\"a.C.\",\"d.C.\"],u,[\"antes de Cristo\",\"despois de Cristo\"]],1,[6,0],[\"dd/MM/yy\",\"d 'de' MMM 'de' y\",\"d 'de' MMMM 'de' y\",\"EEEE, d 'de' MMMM 'de' y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:Kmm:ss z\",\"HH:mm:ss zzzz\"],[\"{0}, {1}\",u,\"{0} 'do' {1}\",u],[\",\",\".
B:M[ %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"BYN\":[u,\"Br\"],\"ESP\":[\"₧ %KMF\":[u,\"FC\"],\"MXN\":[\"$MX\",\"$
RUB\":[u,\"руГ+'XCD\":[u,\"$\"]},\"ltr\", plural];\n"]}Apxx
)$kk!kk:"CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACPQk--NA+
*P
&+
+
EAAC,MAAM,EAAC,OAAO,CAAC,E!O-NQAAQ
2WAAW1NQAAQ
2WAAW1QAAQ-
0BAA0B,EAAC,kBAAkB1-2eAAe,EAAC,eAAe,EAAC,qBAAq|W -	PUAAU WAAW,EAAC,QAAQ	3mBAAmB,E
"	
_	

U


-5;\n\nif (n === 1#4kk\",[[\"AM\",\"PM\"],u,u],u,[[\"Ж\",\"Д\",\"С\",\"С\",\"Б\",\"Ж\",\"С\"],[\"жс\",\"дс\",\"сс\",\"ср\",\"бс\",\"жм\",\"сб\"],[\"жексенбі\",\"дүйсенбі\",\"сейсенбі\",\"сәрсенбі\",\"бейсенбі\",\"жұма\",\"сенбі\"],[\"жс\",\"дс\",\"сс\",\"ср\",\"бс\",\"жм\",\"сб\"]],u,[[\"Қ\",\"А\",\"Н\",\"С\",\"М\",\"М\",\"Ш\",\"Т\",\"Қ\",\"Қ\",\"Қ\",\"Ж\"],[\"қаң.\",\"ақп.\",\"нау.\",\"сәу.\",\"мам.\",\"мау.\",\"шіл.\",\"там.\",\"қыр.\",\"қаз.\",\"қар.\",\"жел.\"],[\"қаңтар\",\"ақпан\",\"наурыз\",\"әуір\",\"мамыр\",\"маусым\",\"шілде\",\"тамыз\",\"қыркүйек\",\"қазан\",\"қараша\",\"желтоқсан\"]],[[\"Қ\",\"А\",\"Н\",\"С\",\"М\",\"М\",\"Ш\",\"Т\",\"Қ\",\"Қ\",\"Қ\",\"Ж\"],[\"қаң.\",\"ақп.\",\"нау.\",\"сәу.\",\"мам.\",\"мау.\",\"шіл.\",\"там.\",\"қыр.\",\"қаз.\",\"қар.\",\"жел.\"],[\"Қаңтар\",\"Ақпан\",\"Наурыз\",\"Сәуір\",\"Мамыр\",\"Маусым\",\"Шілде\",\"Тамы\",\"Қыркүйек\",\"Қазан\",\"Қараша\",\"Желтоқсан\"]],[[\"б.з.д.\",\"б.з.\"],u,[\"Біздің заманымызға дейін\",\"біздің заманымыз\"]],1,[6,0],[\"dd.MM.yy\",\"y 'ж'. dd MMM\",\"y 'ж'. d MMMM\",\"y 'ж'. d MMMM, EEEEB1}, {0}\",u,u,u],[\",\",\" :сан емесT v EKZT\",\"₸\",\"Қазақстан теңгесі\",{\"BYN\":[u,\"р.! ZT\":[\"₸\"],\"LSL\":[\"ЛСЛ!\"₽?'},\"ltr\", plural];\n"]})nx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['af-na'] = ["af-NA",[["v","n"],["vm.","nm."],u],u,[["S","M","D","W","D","V","S"],["So.","Ma.","Di.","Wo.","Do.","Vr.","Sa."],["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],["So.","Ma.","Di.","Wo.","Do.","Vr.","Sa."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan.","Feb.","Mrt.","Apr.","Mei","Jun.","Jul.","Aug.","Sep.","Okt.","Nov.","Des."],["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"]],u,[["v.C.","n.C."],u,["voor Christus","na Christus"]],1,[6,0],["y-MM-dd","dd MMM y","dd MMMM y","EEEE dd MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZAR","R","Suid-Afrikaanse rand",{"BYN":[u,"р."],"CAD":[u,"$"],"JPY":["JP¥","¥"],"MXN":[u,"$"],"NAD":["$"],"PHP":[u,"₱"],"RON":[u,"leu"],"THB":["฿"],"TWD":["NT$"],"USD":[u,"$"],"ZAR":["R"]},"ltr", plural, [[["mn","o","m","a","n"],["middernag","die oggend","die middag","die aand","die nag"],u],[["mn","o","m","a","n"],["middernag","oggend","middag","aand","nag"],u],["00:00",["05:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    Oxlx5/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['af'] = ["af",[["v","n"],["vm.","nm."],u],u,[["S","M","D","W","D","V","S"],["So.","Ma.","Di.","Wo.","Do.","Vr.","Sa."],["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],["So.","Ma.","Di.","Wo.","Do.","Vr.","Sa."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan.","Feb.","Mrt.","Apr.","Mei","Jun.","Jul.","Aug.","Sep.","Okt.","Nov.","Des."],["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"]],u,[["v.C.","n.C."],u,["voor Christus","na Christus"]],0,[6,0],["y-MM-dd","dd MMM y","dd MMMM y","EEEE dd MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZAR","R","Suid-Afrikaanse rand",{"BYN":[u,"р."],"CAD":[u,"$"],"JPY":["JP¥","¥"],"MXN":[u,"$"],"PHP":[u,"₱"],"RON":[u,"leu"],"THB":["฿"],"TWD":["NT$"],"USD":[u,"$"],"ZAR":["R"]},"ltr", plural, [[["mn","o","m","a","n"],["middernag","die oggend","die middag","die aand","die nag"],u],[["mn","o","m","a","n"],["middernag","oggend","middag","aand","nag"],u],["00:00",["05:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    龺bx*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['agq'] = ["agq",[["a.g","a.k"],u,u],u,[["n","k","g","t","u","g","d"],["nts","kpa","ghɔ","tɔm","ume","ghɨ","dzk"],["tsuʔntsɨ","tsuʔukpà","tsuʔughɔe","tsuʔutɔ̀mlò","tsuʔumè","tsuʔughɨ̂m","tsuʔndzɨkɔʔɔ"],["nts","kpa","ghɔ","tɔm","ume","ghɨ","dzk"]],u,[["n","k","t","t","s","z","k","f","d","l","c","f"],["nùm","kɨz","tɨd","taa","see","nzu","dum","fɔe","dzu","lɔm","kaa","fwo"],["ndzɔ̀ŋɔ̀nùm","ndzɔ̀ŋɔ̀kƗ̀zùʔ","ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà","ndzɔ̀ŋɔ̀tǎafʉ̄ghā","ndzɔ̀ŋèsèe","ndzɔ̀ŋɔ̀nzùghò","ndzɔ̀ŋɔ̀dùmlo","ndzɔ̀ŋɔ̀kwîfɔ̀e","ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù","ndzɔ̀ŋɔ̀ghǔuwelɔ̀m","ndzɔ̀ŋɔ̀chwaʔàkaa wo","ndzɔ̀ŋèfwòo"]],u,[["SK","BK"],u,["Sěe Kɨ̀lesto","Bǎa Kɨ̀lesto"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"XAF","FCFA","CFA Fàlâŋ BEAC",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    h4_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['ak'] = ["ak",[["AN","EW"],u,u],u,[["K","D","B","W","Y","F","M"],["Kwe","Dwo","Ben","Wuk","Yaw","Fia","Mem"],["Kwesida","Dwowda","Benada","Wukuda","Yawda","Fida","Memeneda"],["Kwe","Dwo","Ben","Wuk","Yaw","Fia","Mem"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["S-Ɔ","K-Ɔ","E-Ɔ","E-O","E-K","O-A","A-K","D-Ɔ","F-Ɛ","Ɔ-A","Ɔ-O","M-Ɔ"],["Sanda-Ɔpɛpɔn","Kwakwar-Ɔgyefuo","Ebɔw-Ɔbenem","Ebɔbira-Oforisuo","Esusow Aketseaba-Kɔtɔnimba","Obirade-Ayɛwohomumu","Ayɛwoho-Kitawonsa","Difuu-Ɔsandaa","Fankwa-Ɛbɔ","Ɔbɛsɛ-Ahinime","Ɔberɛfɛw-Obubuo","Mumu-Ɔpɛnimba"]],u,[["AK","KE"],u,["Ansa Kristo","Kristo Ekyiri"]],1,[6,0],["yy/MM/dd","y MMM d","y MMMM d","EEEE, y MMMM dd"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GHS","GH₵","Ghana Sidi",{"GHS":["GH₵"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ͤxE	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['am'] = ["am",[["ጠ","ከ"],["ጥዋት","ከሰዓት"],u],u,[["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"],["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]],u,[["ጃ","ፌ","ማ","ኤ","ሜ","ጁ","ጁ","ኦ","ሴ","ኦ","ኖ","ዲ"],["ጃንዩ","ፌብሩ","ማርች","ኤፕሪ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክቶ","ኖቬም","ዲሴም"],["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር"]],u,[["ዓ/ዓ","ዓ/ም"],u,["ዓመተ ዓለም","ዓመተ ምሕረት"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","y MMMM d, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ETB","ብር","የኢትዮጵያ ብር",{"AUD":["AU$","$"],"BYN":[u,"р."],"CNH":["የቻይና ዩዋን"],"ETB":["ብር"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["እኩለ ሌሊት","ቀ","ጥዋት1","ከሰዓት1","ማታ1","ሌሊት1"],["እኩለ ሌሊት","ቀትር","ጥዋት1","ከሰዓት 7","ማታ1","ሌሊት1"],["እኩለ ሌሊት","ቀትር","ጥዋት1","ከሰዓት 7 ሰዓት","ማታ1","ሌሊት1"]],[["እኩለ ሌሊት","ቀትር","ጥዋት","ከሰዓት በኋላ","ማታ","ሌሊት"],["እኩለ ሌሊት","ቀትር","ጥዋት1","ከሰዓት በኋላ","ማታ","ሌሊት"],u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    }mx?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-qa'] = ["ar-QA",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"QAR","ر.ق.‏","ريال قطري",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    KMxU ae'] = ["ar-AEZ6,0?'AED","د.إ.‏","درهم إماراتvmL;$xE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-bh'] = ["ar-BH",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"BHD","د.ب.‏","دينار بحريني",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    P=xK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-dj'] = ["ar-DJ",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"DJF","Fdj","فرنك جيبوتي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DJF":["Fdj"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    sM۽x=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-dz'] = ["ar-DZ",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ج","ف","م","أ","م","ج","ج","أ","س","أ","ن","د"],["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[",",".",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"DZD","د.ج.‏","دينار جزائري",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    iJ޿x?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-eg'] = ["ar-EG",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"EGP","ج.م.‏","جنيه مصري",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    JKxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-eh'] = ["ar-EH",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MAD","د.م.‏","درهم مغربي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    BMAx$/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-iq'] = ["ar-IQ",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ك","ش","آ","ن","أ","ح","ت","آ","أ","ت","ت","ك"],["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"]],[["ك","ش","آ","ن","أ","ح","ت","آ","أ","ت","ت","ك"],["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],u],[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"IQD","د.ع.‏","دينار عراقي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    d 2xGer'] = ["ar-ER7","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يdنيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u=1,[6,0 !ERN","Nfk","ناكفا أريتر[7
ERN":["Nfk	帞7xB/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-il'] = ["ar-IL",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],0,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"ILS","₪","شيكل إسرائيلي جديد",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    Rxa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-jo'] = ["ar-JO",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ك","ش","آ","ن","أ","ح","ت","آ","أ","ت","ت","ك"],["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"JOD","د.أ.‏","دينار أردني",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    R=b]xJ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-km'] = ["ar-KM",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"KMF","CF","فرنك جزر القمر",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KMF":["CF"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    NxC/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-kw'] = ["ar-KW",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"KWD","د.ك.‏","دينار كويتي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    NxP/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-lb'] = ["ar-LB",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ك","ش","آ","ن","أ","ح","ت","آ","أ","ت","ت","ك"],["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[",",".",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"LBP","ل.ل.‏","جنيه لبناني",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    [x9/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-ly'] = ["ar-LY",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[",",".",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"LYD","د.ل.‏","دينار ليبي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ل"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    pGx3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-ma'] = ["ar-MA",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","م","ن","ل","غ","ش","ك","ب","د"],["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} في {0}",u],[",",".",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MAD","د.م.‏","درهم مغربي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    %DxB/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-mr'] = ["ar-MR",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","إ","و","ن","ل","غ","ش","ك","ب","د"],["يناير","فبراير","مارس","إبريل","مايو","يونيو","يوليو","أغشت","شتمبر","أكتوبر","نوفمبر","دجمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[",",".",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MRU","أ.م.","أوقية موريتانية",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    iMxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-om'] = ["ar-OM",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"OMR","ر.ع.‏","ريال عماني",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    Mxh/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-ps'] = ["ar-PS",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ك","ش","آ","ن","أ","ح","ت","آ","أ","ت","ت","ك"],["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"ILS","₪","شيكل إسرائيلي جديد",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    hx4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-sa'] = ["ar-SA",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],0,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","٪","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"SAR","ر.س.‏","ريال سعودي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ل"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    Evx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-sd'] = ["ar-SD",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"SDG","ج.س.","جنيه سوداني",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    3L԰x@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-so'] = ["ar-SO",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","٪","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"SOS","S","شلن صومالي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SOS":["S"],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    HĻx[/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-ss'] = ["ar-SS",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"SSP","£","جنيه جنوب السودان",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["GB£","UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SSP":["£"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    MBXx_/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-sy'] = ["ar-SY",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ك","ش","آ","ن","أ","ح","ت","آ","أ","ت","ت","ك"],["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"SYP","ل.س.‏","ليرة سورية",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    {axE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-td'] = ["ar-TD",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XAF","FCFA","فرنك وسط أفريقي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    Nлx;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-tn'] = ["ar-TN",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ج","ف","م","أ","م","ج","ج","أ","س","أ","ن","د"],["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],1,[6,0],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[",",".",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"TND","د.ت.‏","دينار تونسي",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    Ix?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar-ye'] = ["ar-YE",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],0,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"YER","ر.ي.‏","ريال يمني",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    Kx9/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 3 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 99))
    return 4;
return 5;
}
    global.ng.common.locales['ar'] = ["ar",[["ص","م"],u,u],[["ص","م"],u,["صباحًا","مساءً"]],[["ح","ن","ث","ر","خ","ج","س"],["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],u,["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]],u,[["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],u],u,[["ق.م","م"],u,["قبل الميلاد","ميلادي"]],6,[5,6],["d‏/M‏/y","dd‏/MM‏/y","d MMMM y","EEEE، d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} في {0}",u],[".",",",";","‎%‎","‎+","‎-","E","×","‰","∞","ليس رقمًا",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"EGP","ج.م.‏","جنيه مصري",{"AED":["د.إ.‏"],"ARS":[u,"AR$"],"AUD":["AU$"],"BBD":[u,"BB$"],"BHD":["د.ب.‏"],"BMD":[u,"BM$"],"BND":[u,"BN$"],"BSD":[u,"BS$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":["CA$"],"CLP":[u,"CL$"],"CNY":["CN¥"],"COP":[u,"CO$"],"CUP":[u,"CU$"],"DOP":[u,"DO$"],"DZD":["د.ج.‏"],"EGP":["ج.م.‏","E£"],"FJD":[u,"FJ$"],"GBP":["UK£"],"GYD":[u,"GY$"],"HKD":["HK$"],"IQD":["د.ع.‏"],"IRR":["ر.إ."],"JMD":[u,"JM$"],"JOD":["د.أ.‏"],"JPY":["JP¥"],"KWD":["د.ك.‏"],"KYD":[u,"KY$"],"LBP":["ل.ل.‏","L£"],"LRD":[u,"$LR"],"LYD":["د.ل.‏"],"MAD":["د.م.‏"],"MRU":["أ.م."],"MXN":["MX$"],"NZD":["NZ$"],"OMR":["ر.ع.‏"],"PHP":[u,"₱"],"QAR":["ر.ق.‏"],"SAR":["ر.س.‏"],"SBD":[u,"SB$"],"SDD":["د.س.‏"],"SDG":["ج.س."],"SRD":[u,"SR$"],"SYP":["ل.س.‏","£"],"THB":["฿"],"TND":["د.ت.‏"],"TTD":[u,"TT$"],"TWD":["NT$"],"USD":["US$"],"UYU":[u,"UY$"],"YER":["ر.ي.‏"]},"rtl", plural, [[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"],["في الصباح","صباحًا","ظهرًا","بعد الظهر","مساءً","في المساء","ليلاً"]],[["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","ص","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"],["فجرًا","صباحًا","ظهرًا","بعد الظهر","مساءً","منتصف الليل","ليلاً"]],[["03:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","01:00"],["01:00","03:00"]]]];
  })(globalThis);
    ԀIx:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['as'] = ["as",[["পূৰ্বাহ্ন","অপৰাহ্ন"],u,u],u,[["দ","স","ম","ব","ব","শ","শ"],["দেও","সোম","মঙ্গল","বুধ","বৃহ","শুক্ৰ","শনি"],["দেওবাৰ","সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্ৰবাৰ","শনিবাৰ"],["দেও","সোম","মঙ্গল","বুধ","বৃহ","শুক্ৰ","শনি"]],u,[["জ","ফ","ম","এ","ম","জ","জ","আ","ছ","অ","ন","ড"],["জানু","ফেব্ৰু","মাৰ্চ","এপ্ৰিল","মে’","জুন","জুলাই","আগ","ছেপ্তে","অক্টো","নৱে","ডিচে"],["জানুৱাৰী","ফেব্ৰুৱাৰী","মাৰ্চ","এপ্ৰিল","মে’","জুন","জুলাই","আগষ্ট","ছেপ্তেম্বৰ","অক্টোবৰ","নৱেম্বৰ","ডিচেম্বৰ"]],u,[["খ্ৰীঃ পূঃ","খ্ৰীঃ"],u,["খ্ৰীষ্টপূৰ্ব","খ্ৰীষ্টাব্দ"]],0,[0,0],["d-M-y","dd-MM-y","d MMMM, y","EEEE, d MMMM, y"],["a h.mm","a h.mm.ss","a h.mm.ss z","a h.mm.ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤ #,##,##0.00","#E0"],"INR","₹","ভাৰতীয় ৰুপী",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    *Wxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['asa'] = ["asa",[["icheheavo","ichamthi"],u,u],u,[["J","J","J","J","A","I","J"],["Jpi","Jtt","Jnn","Jtn","Alh","Ijm","Jmo"],["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],["Jpi","Jtt","Jnn","Jtn","Alh","Ijm","Jmo"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec"],["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KM","BM"],u,["Kabla yakwe Yethu","Baada yakwe Yethu"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"TZS","TSh","shilingi ya Tandhania",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    :TVvxn/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ast'] = ["ast",[["a","p"],["AM","PM"],["de la mañana","de la tarde"]],[["a","p"],["AM","PM"],["mañana","tarde"]],[["D","L","M","M","X","V","S"],["dom","llu","mar","mié","xue","vie","sáb"],["domingu","llunes","martes","miércoles","xueves","vienres","sábadu"],["do","ll","ma","mi","xu","vi","sá"]],u,[["X","F","M","A","M","X","X","A","S","O","P","A"],["xin","feb","mar","abr","may","xun","xnt","ago","set","och","pay","avi"],["de xineru","de febreru","de marzu","d’abril","de mayu","de xunu","de xunetu","d’agostu","de setiembre","d’ochobre","de payares","d’avientu"]],[["X","F","M","A","M","X","X","A","S","O","P","A"],["Xin","Feb","Mar","Abr","May","Xun","Xnt","Ago","Set","Och","Pay","Avi"],["xineru","febreru","marzu","abril","mayu","xunu","xunetu","agostu","setiembre","ochobre","payares","avientu"]],[["e.C.","d.C."],u,["enantes de Cristu","después de Cristu"]],1,[6,0],["d/M/yy","d MMM y","d MMMM 'de' y","EEEE, d MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'a' 'les' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","ND",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"DKK":[],"HRK":[],"ISK":[],"NOK":[],"PHP":[u,"₱"],"PLN":[],"SEK":[],"THB":["฿"],"TWD":["NT$"],"XXX":[]},"ltr", plural, []];
  })(globalThis);
    #t1ҽx]	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['az-cyrl'] = ["az-Cyrl",[["а","п"],["АМ","ПМ"],u],[["АМ","ПМ"],u,u],[["7","1","2","3","4","5","6"],["Б.","Б.Е.","Ч.А.","Ч.","Ҹ.А.","Ҹ.","Ш."],["базар","базар ертәси","чәршәнбә ахшамы","чәршәнбә","ҹүмә ахшамы","ҹүмә","шәнбә"],["Б.","Б.Е.","Ч.А.","Ч.","Ҹ.А.","Ҹ.","Ш."]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["јан","фев","мар","апр","май","ијн","ијл","авг","сен","окт","ној","дек"],["јанвар","феврал","март","апрел","май","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["јан","фев","мар","апр","май","ијн","ијл","авг","сен","окт","ној","дек"],["Јанвар","Феврал","Март","Апрел","Май","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр"]],[["е.ә.","ј.е."],u,["ерамыздан әввәл","јени ера"]],1,[6,0],["dd.MM.yy","d MMM y","d MMMM y","d MMMM y, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"AZN","₼","AZN",{"AZN":["₼"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["ҝеҹәјары","ҝ","сүбһ","сәһәр","ҝүндүз","ахшамүстү","ахшам","ҝеҹә"],["ҝеҹәјары","ҝүнорта","сүбһ","сәһәр","ҝүндүз","ахшамүстү","ахшам","ҝеҹә"],u],[["ҝеҹәјары","ҝүнорта","сүбһ","сәһәр","ҝүндүз","ахшамүстү","ахшам","ҝеҹә"],u,u],["00:00","12:00",["04:00","06:00"],["06:00","12:00"],["12:00","17:00"],["17:00","19:00"],["19:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    /xc/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['az-latn'] = ["az-Latn",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["7","1","2","3","4","5","6"],["B.","B.e.","Ç.a.","Ç.","C.a.","C.","Ş."],["bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],["B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş."]],[["7","1","2","3","4","5","6"],["B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş."],["bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],["B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş."]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["yan","fev","mar","apr","may","iyn","iyl","avq","sen","okt","noy","dek"],["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"]],u,[["e.ə.","y.e."],u,["eramızdan əvvəl","yeni era"]],1,[6,0],["dd.MM.yy","d MMM y","d MMMM y","d MMMM y, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"AZN","₼","Azərbaycan Manatı",{"AZN":["₼"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"ley"],"SYP":[u,"S£"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["gecəyarı","g","sübh","səhər","gündüz","axşamüstü","axşam","gecə"],["gecəyarı","günorta","sübh","səhər","gündüz","axşamüstü","axşam","gecə"],u],[["gecəyarı","günorta","sübh","səhər","gündüz","axşamüstü","axşam","gecə"],u,u],["00:00","12:00",["04:00","06:00"],["06:00","12:00"],["12:00","17:00"],["17:00","19:00"],["19:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    wҥxY/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['az'] = ["az",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["7","1","2","3","4","5","6"],["B.","B.e.","Ç.a.","Ç.","C.a.","C.","Ş."],["bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],["B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş."]],[["7","1","2","3","4","5","6"],["B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş."],["bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],["B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş."]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["yan","fev","mar","apr","may","iyn","iyl","avq","sen","okt","noy","dek"],["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"]],u,[["e.ə.","y.e."],u,["eramızdan əvvəl","yeni era"]],1,[6,0],["dd.MM.yy","d MMM y","d MMMM y","d MMMM y, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"AZN","₼","Azərbaycan Manatı",{"AZN":["₼"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"ley"],"SYP":[u,"S£"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["gecəyarı","g","sübh","səhər","gündüz","axşamüstü","axşam","gecə"],["gecəyarı","günorta","sübh","səhər","gündüz","axşamüstü","axşam","gecə"],u],[["gecəyarı","günorta","sübh","səhər","gündüz","axşamüstü","axşam","gecə"],u,u],["00:00","12:00",["04:00","06:00"],["06:00","12:00"],["12:00","17:00"],["17:00","19:00"],["19:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    aZb[xK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['bas'] = ["bas",[["I bikɛ̂glà","I ɓugajɔp"],u,u],u,[["n","n","u","ŋ","m","k","j"],["nɔy","nja","uum","ŋge","mbɔ","kɔɔ","jon"],["ŋgwà nɔ̂y","ŋgwà njaŋgumba","ŋgwà ûm","ŋgwà ŋgê","ŋgwà mbɔk","ŋgwà kɔɔ","ŋgwà jôn"],["nɔy","nja","uum","ŋge","mbɔ","kɔɔ","jon"]],u,[["k","m","m","m","m","h","n","h","d","b","m","l"],["kɔn","mac","mat","mto","mpu","hil","nje","hik","dip","bio","may","liɓ"],["Kɔndɔŋ","Màcɛ̂l","Màtùmb","Màtop","M̀puyɛ","Hìlòndɛ̀","Njèbà","Hìkaŋ","Dìpɔ̀s","Bìòôm","Màyɛsèp","Lìbuy li ńyèe"]],u,[["b.Y.K","m.Y.K"],u,["bisū bi Yesù Krǐstò","i mbūs Yesù Krǐstò"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XAF","FCFA","Frǎŋ CFA (BEAC)",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    Hx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n % 10 === 1 && !(n % 100 === 11))
    return 1;
if (n % 10 === Math.floor(n % 10) && (n % 10 >= 2 && n % 10 <= 4) && !(n % 100 >= 12 && n % 100 <= 14))
    return 3;
if (n % 10 === 0 || (n % 10 === Math.floor(n % 10) && (n % 10 >= 5 && n % 10 <= 9) || n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 14)))
    return 4;
return 5;
}
    global.ng.common.locales['be-tarask'] = ["be-tarask",[["am","pm"],["AM","PM"],u],[["AM","PM"],u,u],[["н","п","а","с","ч","п","с"],["нд","пн","аў","ср","чц","пт","сб"],["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],["нд","пн","аў","ср","чц","пт","сб"]],u,[["с","л","с","к","м","ч","л","ж","в","к","л","с"],["сту","лют","сак","кра","мая","чэр","ліп","жні","вер","кас","ліс","сне"],["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня"]],[["с","л","с","к","м","ч","л","ж","в","к","л","с"],["сту","лют","сак","кра","май","чэр","ліп","жні","вер","кас","ліс","сне"],["студзень","люты","сакавік","красавік","май","чэрвень","ліпень","жнівень","верасень","кастрычнік","лістапад","снежань"]],[["да н.э.","н.э."],u,["да нараджэння Хрыстова","ад нараджэння Хрыстова"]],1,[6,0],["d.MM.yy","d MMM y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss, zzzz"],["{1}, {0}",u,"{1} 'у' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"BYN","Br","беларускі рубель",{"AUD":["A$"],"BBD":[u,"Bds$"],"BMD":[u,"BD$"],"BRL":[u,"R$"],"BSD":[u,"B$"],"BYN":["Br"],"BZD":[u,"BZ$"],"CAD":[u,"CA$"],"CUC":[u,"CUC$"],"CUP":[u,"$MN"],"DOP":[u,"RD$"],"FJD":[u,"FJ$"],"FKP":[u,"FK£"],"GYD":[u,"G$"],"ISK":[u,"Íkr"],"JMD":[u,"J$"],"KYD":[u,"CI$"],"LRD":[u,"L$"],"MXN":["MX$"],"NAD":[u,"N$"],"NZD":[u,"NZ$"],"PHP":[u,"₱"],"RUB":["₽","руб."],"SBD":[u,"SI$"],"SGD":[u,"S$"],"TTD":[u,"TT$"],"UYU":[u,"$U"],"XCD":["EC$"]},"ltr", plural, []];
  })(globalThis);
    }OIx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n % 10 === 1 && !(n % 100 === 11))
    return 1;
if (n % 10 === Math.floor(n % 10) && (n % 10 >= 2 && n % 10 <= 4) && !(n % 100 >= 12 && n % 100 <= 14))
    return 3;
if (n % 10 === 0 || (n % 10 === Math.floor(n % 10) && (n % 10 >= 5 && n % 10 <= 9) || n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 14)))
    return 4;
return 5;
}
    global.ng.common.locales['be'] = ["be",[["am","pm"],["AM","PM"],u],[["AM","PM"],u,u],[["н","п","а","с","ч","п","с"],["нд","пн","аў","ср","чц","пт","сб"],["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],["нд","пн","аў","ср","чц","пт","сб"]],u,[["с","л","с","к","м","ч","л","ж","в","к","л","с"],["сту","лют","сак","кра","мая","чэр","ліп","жні","вер","кас","ліс","сне"],["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня"]],[["с","л","с","к","м","ч","л","ж","в","к","л","с"],["сту","лют","сак","кра","май","чэр","ліп","жні","вер","кас","ліс","сне"],["студзень","люты","сакавік","красавік","май","чэрвень","ліпень","жнівень","верасень","кастрычнік","лістапад","снежань"]],[["да н.э.","н.э."],u,["да нараджэння Хрыстова","ад нараджэння Хрыстова"]],1,[6,0],["d.MM.yy","d MMM y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss, zzzz"],["{1}, {0}",u,"{1} 'у' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"BYN","Br","беларускі рубель",{"AUD":["A$"],"BBD":[u,"Bds$"],"BMD":[u,"BD$"],"BRL":[u,"R$"],"BSD":[u,"B$"],"BYN":["Br"],"BZD":[u,"BZ$"],"CAD":[u,"CA$"],"CUC":[u,"CUC$"],"CUP":[u,"$MN"],"DOP":[u,"RD$"],"FJD":[u,"FJ$"],"FKP":[u,"FK£"],"GYD":[u,"G$"],"ISK":[u,"Íkr"],"JMD":[u,"J$"],"KYD":[u,"CI$"],"LRD":[u,"L$"],"MXN":["MX$"],"NAD":[u,"N$"],"NZD":[u,"NZ$"],"PHP":[u,"₱"],"RUB":["₽","руб."],"SBD":[u,"SI$"],"SGD":[u,"S$"],"TTD":[u,"TT$"],"UYU":[u,"$U"],"XCD":["EC$"]},"ltr", plural, []];
  })(globalThis);
    /CQx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['bem'] = ["bem",[["uluchelo","akasuba"],u,u],u,[["S","M","T","W","T","F","S"],["Pa Mulungu","Palichimo","Palichibuli","Palichitatu","Palichine","Palichisano","Pachibelushi"],u,u],u,[["J","F","M","E","M","J","J","O","S","O","N","D"],["Jan","Feb","Mac","Epr","Mei","Jun","Jul","Oga","Sep","Okt","Nov","Dis"],["Januari","Februari","Machi","Epreo","Mei","Juni","Julai","Ogasti","Septemba","Oktoba","Novemba","Disemba"]],u,[["BC","AD"],u,["Before Yesu","After Yesu"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZMW","K","ZMW",{"JPY":["JP¥","¥"],"USD":["US$","$"],"ZMW":["K","ZK"]},"ltr", plural, []];
  })(globalThis);
    %wbx)/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['bez'] = ["bez",[["pamilau","pamunyi"],u,u],u,[["M","J","H","H","H","W","J"],["Mul","Vil","Hiv","Hid","Hit","Hih","Lem"],["pa mulungu","pa shahuviluha","pa hivili","pa hidatu","pa hitayi","pa hihanu","pa shahulembela"],["Mul","Vil","Hiv","Hid","Hit","Hih","Lem"]],u,[["H","V","D","T","H","S","S","N","T","K","K","K"],["Hut","Vil","Dat","Tai","Han","Sit","Sab","Nan","Tis","Kum","Kmj","Kmb"],["pa mwedzi gwa hutala","pa mwedzi gwa wuvili","pa mwedzi gwa wudatu","pa mwedzi gwa wutai","pa mwedzi gwa wuhanu","pa mwedzi gwa sita","pa mwedzi gwa saba","pa mwedzi gwa nane","pa mwedzi gwa tisa","pa mwedzi gwa kumi","pa mwedzi gwa kumi na moja","pa mwedzi gwa kumi na mbili"]],u,[["KM","BM"],u,["Kabla ya Mtwaa","Baada ya Mtwaa"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"TZS","TSh","Shilingi ya Hutanzania",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ƞԣx_	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['bg'] = ["bg",[["am","pm"],u,["пр.об.","сл.об."]],[["am","pm"],u,u],[["н","п","в","с","ч","п","с"],["нд","пн","вт","ср","чт","пт","сб"],["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],["нд","пн","вт","ср","чт","пт","сб"]],u,[["я","ф","м","а","м","ю","ю","а","с","о","н","д"],["яну","фев","март","апр","май","юни","юли","авг","сеп","окт","ное","дек"],["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"]],u,[["пр.Хр.","сл.Хр."],u,["преди Христа","след Христа"]],1,[6,0],["d.MM.yy 'г'.","d.MM.y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["H:mm 'ч'.","H:mm:ss 'ч'.","H:mm:ss 'ч'. z","H:mm:ss 'ч'. zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","0.00 ¤","#E0"],"BGN","лв.","Български лев",{"AFN":[u,"Af"],"AMD":[],"ARS":[],"AUD":[],"AZN":[],"BBD":[],"BDT":[],"BGN":["лв."],"BMD":[],"BND":[],"BRL":[],"BSD":[],"BZD":[],"CAD":[],"CLP":[],"CNY":[],"COP":[],"CRC":[],"CUP":[],"DOP":[],"FJD":[],"FKP":[],"GBP":[u,"£"],"GHS":[],"GIP":[],"GYD":[],"HKD":[],"ILS":[],"INR":[],"JMD":[],"JPY":[u,"¥"],"KHR":[],"KRW":[],"KYD":[],"KZT":[],"LAK":[],"LRD":[],"MNT":[],"MXN":[],"NAD":[],"NGN":[],"NZD":[],"PHP":[],"PYG":[],"RON":[],"SBD":[],"SGD":[],"SRD":[],"SSP":[],"TRY":[],"TTD":[],"TWD":[],"UAH":[],"USD":["щ.д.","$"],"UYU":[],"VND":[],"XCD":[u,"$"]},"ltr", plural, [[["полунощ","сутринта","на обяд","следобед","вечерта","през нощта"],u,u],u,["00:00",["04:00","11:00"],["11:00","14:00"],["14:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    oirx&/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['zgh'] = ["zgh",[["ⵜⵉⴼⴰⵡⵜ","ⵜⴰⴷⴳⴳⵯⴰⵜ"],u,u],u,[["S","M","T","W","T","F","S"],["ⴰⵙⴰ","ⴰⵢⵏ","ⴰⵙⵉ","ⴰⴽⵕ","ⴰⴽⵡ","ⴰⵙⵉⵎ","ⴰⵙⵉⴹ"],["ⴰⵙⴰⵎⴰⵙ","ⴰⵢⵏⴰⵙ","ⴰⵙⵉⵏⴰⵙ","ⴰⴽⵕⴰⵙ","ⴰⴽⵡⴰⵙ","ⴰⵙⵉⵎⵡⴰⵙ","ⴰⵙⵉⴹⵢⴰⵙ"],["ⴰⵙⴰ","ⴰⵢⵏ","ⴰⵙⵉ","ⴰⴽⵕ","ⴰⴽⵡ","ⴰⵙⵉⵎ","ⴰⵙⵉⴹ"]],u,[["ⵉ","ⴱ","ⵎ","ⵉ","ⵎ","ⵢ","ⵢ","ⵖ","ⵛ","ⴽ","ⵏ","ⴷ"],["ⵉⵏⵏ","ⴱⵕⴰ","ⵎⴰⵕ","ⵉⴱⵔ","ⵎⴰⵢ","ⵢⵓⵏ","ⵢⵓⵍ","ⵖⵓⵛ","ⵛⵓⵜ","ⴽⵜⵓ","ⵏⵓⵡ","ⴷⵓⵊ"],["ⵉⵏⵏⴰⵢⵔ","ⴱⵕⴰⵢⵕ","ⵎⴰⵕⵚ","ⵉⴱⵔⵉⵔ","ⵎⴰⵢⵢⵓ","ⵢⵓⵏⵢⵓ","ⵢⵓⵍⵢⵓⵣ","ⵖⵓⵛⵜ","ⵛⵓⵜⴰⵏⴱⵉⵔ","ⴽⵜⵓⴱⵔ","ⵏⵓⵡⴰⵏⴱⵉⵔ","ⴷⵓⵊⴰⵏⴱⵉⵔ"]],u,[["ⴷⴰⵄ","ⴷⴼⵄ"],u,["ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ","ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00¤","#E0"],"MAD","MAD","ⴰⴷⵔⵉⵎ ⵏ ⵍⵎⵖⵔⵉⴱ",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    EL,'3xx
bm'] = ["bm",[["AM","PM"],u,u],u,[["K","N","T","A","A","J","S"],["kar","ntɛ","tar","ara","ala","jum","sib"],["kari","ntɛnɛ","tarata","araba","alamisa","juma","sibiri"],["kar","ntɛ","tar","ara","ala","jum","sib"]],u,[["Z","F","M","A","M","Z","Z","U","S","Ɔ","N","D"],["zan","feb","mar","awi","mɛ","zuw","zul","uti","sɛt","ɔku","now","des"],["zanwuye","feburuye","marisi","awirili","mɛ","zuwɛn","zuluye","uti","sɛtanburu","ɔkutɔburu","nowanburu","desanburu"]],u,[["J.-C. ɲɛ","ni J.-C."],u,["jezu# krisiti ɲɛ","jezu krisiti minkɛ.",",AE:%","¤#,##0.00","#E0"],"XOF","F CFA","sefa Fraŋ (BCEAO)TŠ:x G, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
if (n === Math.floor(n) && (n >= 2 && n <= 10))
    return 3;+shi-tfng'] = ["shi-Tfngޤ4䱾x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['bn-in'] = ["bn-IN",[["AM","PM"],u,u],u,[["র","সো","ম","বু","বৃ","শু","শ"],["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],["রঃ","সোঃ","মঃ","বুঃ","বৃঃ","শুঃ","শনি"]],u,[["জা","ফে","মা","এ","মে","জুন","জু","আ","সে","অ","ন","ডি"],["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]],[["জা","ফে","মা","এ","মে","জুন","জু","আ","সে","অ","ন","ডি"],["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],u],[["খ্রিস্টপূর্ব","খৃষ্টাব্দ"],u,["খ্রিস্টপূর্ব","খ্রীষ্টাব্দ"]],0,[0,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","#,##,##0.00¤","#E0"],"INR","₹","ভারতীয় রুপি",{"BDT":["৳"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["ভোর","সকাল","দুপুর","বিকাল","সন্ধ্যা","রাত্রি"],u,["ভোর","সকাল","দুপুর","বিকাল","সন্ধ্যা","রাত্রিতে"]],[["ভোর","সকাল","দুপুর","বিকাল","সন্ধ্যা","রাত্রি"],u,u],[["04:00","06:00"],["06:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    бx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['bn'] = ["bn",[["AM","PM"],u,u],u,[["র","সো","ম","বু","বৃ","শু","শ"],["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],["রঃ","সোঃ","মঃ","বুঃ","বৃঃ","শুঃ","শনি"]],u,[["জা","ফে","মা","এ","মে","জুন","জু","আ","সে","অ","ন","ডি"],["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"]],[["জা","ফে","মা","এ","মে","জুন","জু","আ","সে","অ","ন","ডি"],["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],u],[["খ্রিস্টপূর্ব","খৃষ্টাব্দ"],u,["খ্রিস্টপূর্ব","খ্রীষ্টাব্দ"]],0,[6,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","#,##,##0.00¤","#E0"],"BDT","৳","বাংলাদেশী টাকা",{"BDT":["৳"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["ভোর","সকাল","দুপুর","বিকাল","সন্ধ্যা","রাত্রি"],u,["ভোর","সকাল","দুপুর","বিকাল","সন্ধ্যা","রাত্রিতে"]],[["ভোর","সকাল","দুপুর","বিকাল","সন্ধ্যা","রাত্রি"],u,u],[["04:00","06:00"],["06:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    M0Sx8/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['bo-in'] = ["bo-IN",[["སྔ་དྲོ་","ཕྱི་དྲོ་"],u,u],u,[["ཉི","ཟླ","མིག","ལྷག","ཕུར","སངས","སྤེན"],["ཉི་མ་","ཟླ་བ་","མིག་དམར་","ལྷག་པ་","ཕུར་བུ་","པ་སངས་","སྤེན་པ་"],["གཟའ་ཉི་མ་","གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་པ་","གཟའ་ཕུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་པ་"],["ཉི་མ་","ཟླ་བ་","མིག་དམར་","ལྷག་པ་","ཕུར་བུ་","པ་སངས་","སྤེན་པ་"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"],["ཟླ་བ་དང་པོ","ཟླ་བ་གཉིས་པ","ཟླ་བ་གསུམ་པ","ཟླ་བ་བཞི་པ","ཟླ་བ་ལྔ་པ","ཟླ་བ་དྲུག་པ","ཟླ་བ་བདུན་པ","ཟླ་བ་བརྒྱད་པ","ཟླ་བ་དགུ་པ","ཟླ་བ་བཅུ་པ","ཟླ་བ་བཅུ་གཅིག་པ","ཟླ་བ་བཅུ་གཉིས་པ"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"],["ཟླ་བ་དང་པོ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་པ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུན་པ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"]],[["སྤྱི་ལོ་སྔོན་","སྤྱི་ལོ་"],u,u],0,[0,0],["y-MM-dd","y ལོའི་MMMཚེས་d","སྤྱི་ལོ་y MMMMའི་ཚེས་d","y MMMMའི་ཚེས་d, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","རྒྱ་གར་སྒོར་",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
     x(/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['bo'] = ["bo",[["སྔ་དྲོ་","ཕྱི་དྲོ་"],u,u],u,[["ཉི","ཟླ","མིག","ལྷག","ཕུར","སངས","སྤེན"],["ཉི་མ་","ཟླ་བ་","མིག་དམར་","ལྷག་པ་","ཕུར་བུ་","པ་སངས་","སྤེན་པ་"],["གཟའ་ཉི་མ་","གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་པ་","གཟའ་ཕུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་པ་"],["ཉི་མ་","ཟླ་བ་","མིག་དམར་","ལྷག་པ་","ཕུར་བུ་","པ་སངས་","སྤེན་པ་"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"],["ཟླ་བ་དང་པོ","ཟླ་བ་གཉིས་པ","ཟླ་བ་གསུམ་པ","ཟླ་བ་བཞི་པ","ཟླ་བ་ལྔ་པ","ཟླ་བ་དྲུག་པ","ཟླ་བ་བདུན་པ","ཟླ་བ་བརྒྱད་པ","ཟླ་བ་དགུ་པ","ཟླ་བ་བཅུ་པ","ཟླ་བ་བཅུ་གཅིག་པ","ཟླ་བ་བཅུ་གཉིས་པ"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"],["ཟླ་བ་དང་པོ་","ཟླ་བ་གཉིས་པ་","ཟླ་བ་གསུམ་པ་","ཟླ་བ་བཞི་པ་","ཟླ་བ་ལྔ་པ་","ཟླ་བ་དྲུག་པ་","ཟླ་བ་བདུན་པ་","ཟླ་བ་བརྒྱད་པ་","ཟླ་བ་དགུ་པ་","ཟླ་བ་བཅུ་པ་","ཟླ་བ་བཅུ་གཅིག་པ་","ཟླ་བ་བཅུ་གཉིས་པ་"]],[["སྤྱི་ལོ་སྔོན་","སྤྱི་ལོ་"],u,u],0,[6,0],["y-MM-dd","y ལོའི་MMMཚེས་d","སྤྱི་ལོ་y MMMMའི་ཚེས་d","y MMMMའི་ཚེས་d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"CNY","¥","ཡུ་ཨན་",{"CNY":["¥"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    Ĵxn/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n % 10 === 1 && !(n % 100 === 11 || (n % 100 === 71 || n % 100 === 91)))
    return 1;
if (n % 10 === 2 && !(n % 100 === 12 || (n % 100 === 72 || n % 100 === 92)))
    return 2;
if (n % 10 === Math.floor(n % 10) && (n % 10 >= 3 && n % 10 <= 4 || n % 10 === 9) && !(n % 100 >= 10 && n % 100 <= 19 || (n % 100 >= 70 && n % 100 <= 79 || n % 100 >= 90 && n % 100 <= 99)))
    return 3;
if (!(n === 0) && n % 1000000 === 0)
    return 4;
return 5;
}
    global.ng.common.locales['br'] = ["br",[["am","gm"],["A.M.","G.M."],u],[["A.M.","G.M."],u,u],[["Su","L","Mz","Mc","Y","G","Sa"],["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],["Sul","Lun","Meurzh","Mercʼher","Yaou","Gwener","Sadorn"],["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."]],u,[["01","02","03","04","05","06","07","08","09","10","11","12"],["Gen.","Cʼhwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu."],["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"]],u,[["a-raok J.K.","goude J.K."],u,["a-raok Jezuz-Krist","goude Jezuz-Krist"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'da' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":["$A","$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":["$CA","$"],"CNY":[u,"¥"],"EGP":[u,"£ E"],"GBP":["£ RU","£"],"HKD":["$ HK","$"],"ILS":[u,"₪"],"JPY":[u,"¥"],"KRW":[u,"₩"],"LBP":[u,"£L"],"NZD":["$ ZN","$"],"PHP":[u,"₱"],"RUR":[u,"р."],"TOP":[u,"$ T"],"TWD":[u,"$"],"USD":["$ SU","$"],"VND":[u,"₫"],"XCD":[u,"$"],"XXX":[]},"ltr", plural, []];
  })(globalThis);
    (E{xI/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['brx'] = ["brx",[["फुं","बेलासे"],u,u],u,[["र","स","मं","बु","बि","सु","सु"],["रबि","सम","मंगल","बुध","बिस्थि","सुखुर","सुनि"],["रबिबार","समबार","मंगलबार","बुधबार","बिस्थिबार","सुखुरबार","सुनिबार"],["रबि","सम","मंगल","बुध","बिस्थि","सुखुर","सुनि"]],u,[["ज","फ","म","ए","म","ज","ज","आ","स","अ","न","ड"],["जान","फेब","मार्च","एप्रि","मे","जुन","जुल","आग","सेप","अक्ट’","नवे","डिसे"],["जानुवारी","फेब्रूवारी","मार्च","एप्रिल","मे","जुन","जुलाई","आगष्ट","सेप्थेम्बर","अक्ट’बर","नवेम्बर","डिसेम्बर"]],u,[["बि.सि.","ए.दि"],u,u],0,[0,0],["y-MM-dd","MMM d, y","MMMM d, y","y MMMM d, EEEE"],["a नि h:mm","a h:mm:ss","a h:mm:ss z","a h:mm:ss zzzz"],["{1}, {0}",u,"{1} नि {0} याव",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤ #,##,##0.00","#E0"],"INR","₹","भारतनि रुपी",{"CNY":["सिएन¥","¥"],"JPY":["JP¥","¥"],"RUB":["रूब","₽"]},"ltr", plural, []];
  })(globalThis);
    sx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['sr-cyrl'] = ["sr-Cyrl",[["AM","PM"],u,u],[["пре подне","по подне"],["AM","PM"],u],[["н","п","у","с","ч","п","с"],["нед","пон","уто","сре","чет","пет","суб"],["недеља","понедељак","уторак","среда","четвртак","петак","субота"],["не","по","ут","ср","че","пе","су"]],u,[["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"]],u,[["п.н.е.","н.е."],["п. н. е.","н. е."],["пре нове ере","нове ере"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"RSD","RSD","српски динар",{"AUD":[u,"$"],"BAM":["КМ","KM"],"BYN":[u,"р."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["поноћ","подне","ујутру","по подне","увече","ноћу"],["поноћ","подне","ујутро","по подне","увече","ноћу"],u],[["поноћ","подне","јутро","поподне","вече","ноћ"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ܊(x1;
+bs-cyrl'] = ["bs-Cyrl"Gподне"],u,["прије подне","послије подне"]],uI`&јеља","понедјј>C`!уrи","јули","ау+ј=d.MM.y.","dd. MMMM y.","EEEE, dBAM","КМ","Конвертибилна марка",{"BAM":["КМ","KM"],"CZK":["Кч","Kč"],"PLN":["зл","zł"],"RSD":["ди*н."],"TRY":["Тл","₺"],"USD":["US$","$@у*	'O	2
слийе	:4	=4	 'x	%/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['bs-latn'] = ["bs-Latn",[["prijepodne","popodne"],["AM","PM"],["prijepodne","popodne"]],u,[["N","P","U","S","Č","P","S"],["ned","pon","uto","sri","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ned","pon","uto","sri","čet","pet","sub"]],[["n","p","u","s","č","p","s"],["ned","pon","uto","sri","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ned","pon","uto","sri","čet","pet","sub"]],[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],["januar","februar","mart","april","maj","juni","juli","august","septembar","oktobar","novembar","decembar"]],u,[["p.n.e.","n. e."],["p. n. e.","n. e."],["prije nove ere","nove ere"]],1,[6,0],["d. M. y.","d. MMM y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'u' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"BAM","KM","Bosanskohercegovačka konvertibilna marka",{"AUD":[u,"$"],"BAM":["KM"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"GBP":[u,"£"],"HKD":[u,"$"],"HRK":["kn"],"ILS":[u,"₪"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RSD":["din."],"THB":["฿"],"TWD":["NT$"],"USD":[u,"$"],"XCD":[u,"$"],"XPF":[]},"ltr", plural, [[["ponoć","podne","ujutro","poslijepodne","navečer","po noći"],u,u],u,["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    ,Yx	//**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['bs'] = ["bs",[["prijepodne","popodne"],["AM","PM"],["prijepodne","popodne"]],u,[["N","P","U","S","Č","P","S"],["ned","pon","uto","sri","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ned","pon","uto","sri","čet","pet","sub"]],[["n","p","u","s","č","p","s"],["ned","pon","uto","sri","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ned","pon","uto","sri","čet","pet","sub"]],[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],["januar","februar","mart","april","maj","juni","juli","august","septembar","oktobar","novembar","decembar"]],u,[["p.n.e.","n. e."],["p. n. e.","n. e."],["prije nove ere","nove ere"]],1,[6,0],["d. M. y.","d. MMM y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'u' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"BAM","KM","Bosanskohercegovačka konvertibilna marka",{"AUD":[u,"$"],"BAM":["KM"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"GBP":[u,"£"],"HKD":[u,"$"],"HRK":["kn"],"ILS":[u,"₪"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RSD":["din."],"THB":["฿"],"TWD":["NT$"],"USD":[u,"$"],"XCD":[u,"$"],"XPF":[]},"ltr", plural, [[["ponoć","podne","ujutro","poslijepodne","navečer","po noći"],u,u],u,["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ca-ad'] = ["ca-AD",[["a. m.","p. m."],u,u],u,[["dg","dl","dt","dc","dj","dv","ds"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."],["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."]],u,[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."],["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"]],[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"]],[["aC","dC"],u,["abans de Crist","després de Crist"]],1,[6,0],["d/M/yy","d MMM y","d MMMM 'de' y","EEEE, d MMMM 'de' y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1} {0}","{1}, {0}","{1}, 'a' 'les' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":["AU$","$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"MXN":[u,"$"],"PHP":[u,"₱"],"THB":["฿"],"USD":[u,"$"],"VEF":[u,"Bs F"],"XCD":[u,"$"],"XXX":[]},"ltr", plural, [[["mitjanit","mat.","matí","md","tarda","vespre","nit"],["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u],[["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u,u],["00:00",["00:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","21:00"],["21:00","24:00"]]]];
  })(globalThis);
    cvyx#	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ca-es-valencia'] = ["ca-ES-valencia",[["a. m.","p. m."],u,u],u,[["dg","dl","dt","dc","dj","dv","ds"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."],["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."]],u,[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."],["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"]],[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"]],[["aC","dC"],u,["abans de Crist","després de Crist"]],1,[6,0],["d/M/yy","d MMM y","d MMMM 'de' y","EEEE, d MMMM 'de' y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1} {0}","{1}, {0}","{1}, 'a' 'les' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":["AU$","$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"MXN":[u,"$"],"PHP":[u,"₱"],"THB":["฿"],"USD":[u,"$"],"VEF":[u,"Bs F"],"XCD":[u,"$"],"XXX":[]},"ltr", plural, [[["mitjanit","mat.","matí","md","tarda","vespre","nit"],["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u],[["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u,u],["00:00",["00:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","21:00"],["21:00","24:00"]]]];
  })(globalThis);
    x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ca-fr'] = ["ca-FR",[["a. m.","p. m."],u,u],u,[["dg","dl","dt","dc","dj","dv","ds"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."],["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."]],u,[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."],["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"]],[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"]],[["aC","dC"],u,["abans de Crist","després de Crist"]],1,[6,0],["d/M/yy","d MMM y","d MMMM 'de' y","EEEE, d MMMM 'de' y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1} {0}","{1}, {0}","{1}, 'a' 'les' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":["AU$","$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"FRF":["F"],"MXN":[u,"$"],"PHP":[u,"₱"],"THB":["฿"],"USD":[u,"$"],"VEF":[u,"Bs F"],"XCD":[u,"$"],"XXX":[]},"ltr", plural, [[["mitjanit","mat.","matí","md","tarda","vespre","nit"],["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u],[["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u,u],["00:00",["00:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","21:00"],["21:00","24:00"]]]];
  })(globalThis);
    <ܩix	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ca-it'] = ["ca-IT",[["a. m.","p. m."],u,u],u,[["dg","dl","dt","dc","dj","dv","ds"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."],["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."]],u,[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."],["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"]],[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"]],[["aC","dC"],u,["abans de Crist","després de Crist"]],1,[6,0],["d/M/yy","d MMM y","d MMMM 'de' y","EEEE, d MMMM 'de' y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1} {0}","{1}, {0}","{1}, 'a' 'les' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":["AU$","$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"MXN":[u,"$"],"PHP":[u,"₱"],"THB":["฿"],"USD":[u,"$"],"VEF":[u,"Bs F"],"XCD":[u,"$"],"XXX":[]},"ltr", plural, [[["mitjanit","mat.","matí","md","tarda","vespre","nit"],["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u],[["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u,u],["00:00",["00:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","21:00"],["21:00","24:00"]]]];
  })(globalThis);
    x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ca'] = ["ca",[["a. m.","p. m."],u,u],u,[["dg","dl","dt","dc","dj","dv","ds"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."],["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],["dg.","dl.","dt.","dc.","dj.","dv.","ds."]],u,[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."],["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"]],[["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"]],[["aC","dC"],u,["abans de Crist","després de Crist"]],1,[6,0],["d/M/yy","d MMM y","d MMMM 'de' y","EEEE, d MMMM 'de' y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1} {0}","{1}, {0}","{1}, 'a' 'les' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":["AU$","$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"MXN":[u,"$"],"PHP":[u,"₱"],"THB":["฿"],"USD":[u,"$"],"VEF":[u,"Bs F"],"XCD":[u,"$"],"XXX":[]},"ltr", plural, [[["mitjanit","mat.","matí","md","tarda","vespre","nit"],["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u],[["mitjanit","matinada","matí","migdia","tarda","vespre","nit"],u,u],["00:00",["00:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","21:00"],["21:00","24:00"]]]];
  })(globalThis);
    վxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ccp-in'] = ["ccp-IN",[["AM","PM"],u,u],u,[["𑄢𑄧","𑄥𑄧","𑄟𑄧","𑄝𑄪","𑄝𑄳𑄢𑄨","𑄥𑄪","𑄥𑄧"],["𑄢𑄧𑄝𑄨","𑄥𑄧𑄟𑄴","𑄟𑄧𑄁𑄉𑄧𑄣𑄴","𑄝𑄪𑄖𑄴","𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴","𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴","𑄥𑄧𑄚𑄨"],["𑄢𑄧𑄝𑄨𑄝𑄢𑄴","𑄥𑄧𑄟𑄴𑄝𑄢𑄴","𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴","𑄝𑄪𑄖𑄴𑄝𑄢𑄴","𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴","𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴","𑄥𑄧𑄚𑄨𑄝𑄢𑄴"],["𑄢𑄧𑄝𑄨","𑄥𑄧𑄟𑄴","𑄟𑄧𑄁𑄉𑄧𑄣𑄴","𑄝𑄪𑄖𑄴","𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴","𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴","𑄥𑄧𑄚𑄨"]],u,[["𑄎","𑄜𑄬","𑄟","𑄃𑄬","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪","𑄃","𑄥𑄬","𑄃𑄧","𑄚𑄧","𑄓𑄨"],["𑄎𑄚𑄪","𑄜𑄬𑄛𑄴","𑄟𑄢𑄴𑄌𑄧","𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪𑄣𑄭","𑄃𑄉𑄧𑄌𑄴𑄑𑄴","𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴","𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴"],["𑄎𑄚𑄪𑄠𑄢𑄨","𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨","𑄟𑄢𑄴𑄌𑄧","𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪𑄣𑄭","𑄃𑄉𑄧𑄌𑄴𑄑𑄴","𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴","𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴"]],[["𑄎","𑄜𑄬","𑄟","𑄃𑄬","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪","𑄃","𑄥𑄬","𑄃𑄧","𑄚𑄧","𑄓𑄨"],["𑄎𑄚𑄪𑄠𑄢𑄨","𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨","𑄟𑄢𑄴𑄌𑄧","𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴","𑄟𑄬","𑄎𑄪𑄚𑄴","𑄎𑄪𑄣𑄭","𑄃𑄉𑄧𑄌𑄴𑄑𑄴","𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴","𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴","𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴"],u],[["𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧","𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧"],u,u],0,[0,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","#,##,##0.00¤","#E0"],"INR","₹","𑄃𑄨𑄚𑄴𑄘𑄨𑄠𑄚𑄴 𑄢𑄪𑄛𑄨",{"BDT":["৳"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"STD":[u,"Db"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬","𑄝𑄬𑄚𑄳𑄠𑄬","𑄘𑄨𑄝𑄪𑄎𑄳𑄠","𑄝𑄬𑄣𑄳𑄠𑄬","𑄥𑄎𑄧𑄚𑄳𑄠","𑄢𑄬𑄖𑄴"],u,u],u,[["04:00","06:00"],["06:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    *zx^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ce'] = ["ce",[["AM","PM"],u,u],u,[["кӀи","ор","ши","кха","еа","пӀе","шуо"],u,["кӀира","оршот","шинара","кхаара","еара","пӀераска","шуот"],["кӀи","ор","ши","кха","еа","пӀе","шуо"]],[["кӀ","о","ш","кх","е","пӀ","ш"],["кӀи","ор","ши","кха","еа","пӀе","шуо"],["кӀира","оршот","шинара","кхаара","еара","пӀераска","шуот"],["кӀи","ор","ши","кха","еа","пӀе","шуо"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"],["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],u,[["в. э. тӀ. я","в. э"],u,["Ӏийса пайхамар вина де кхачале","Ӏийса пайхамар вина дийнахь дуьйна"]],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","Терхьаш дац",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"RUB","₽","Российн сом",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"лей"],"RUB":["₽"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    nLkxH/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i === 1 || (i === 2 || i === 3)) || (v === 0 && !(i % 10 === 4 || (i % 10 === 6 || i % 10 === 9)) || !(v === 0) && !(f % 10 === 4 || (f % 10 === 6 || f % 10 === 9))))
    return 1;
return 5;
}
    global.ng.common.locales['ceb'] = ["ceb",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["D","L","M","M","H","B","S"],["Dom","Lun","Mar","Miy","Huw","Biy","Sab"],["Domingo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],["Dom","Lun","Mar","Miy","Huw","Biy","Sab"]],u,[["E","P","M","A","M","H","H","A","S","O","N","D"],["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"]],u,[["BC","AD"],u,["Sa Wala Pa Si Kristo","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'sa' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"PHP","₱","Philippine Piso",{"JPY":["JP¥","¥"],"USD":["US $","$"]},"ltr", plural, []];
  })(globalThis);
    -⨵[xJ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['cgg'] = ["cgg",[["AM","PM"],u,u],u,[["S","K","R","S","N","T","M"],["SAN","ORK","OKB","OKS","OKN","OKT","OMK"],["Sande","Orwokubanza","Orwakabiri","Orwakashatu","Orwakana","Orwakataano","Orwamukaaga"],["SAN","ORK","OKB","OKS","OKN","OKT","OMK"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["KBZ","KBR","KST","KKN","KTN","KMK","KMS","KMN","KMW","KKM","KNK","KNB"],["Okwokubanza","Okwakabiri","Okwakashatu","Okwakana","Okwakataana","Okwamukaaga","Okwamushanju","Okwamunaana","Okwamwenda","Okwaikumi","Okwaikumi na kumwe","Okwaikumi na ibiri"]],u,[["BC","AD"],u,["Kurisito Atakaijire","Kurisito Yaijire"]],1,[0,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"UGX","USh","Eshiringi ya Uganda",{"JPY":["JP¥","¥"],"UGX":["USh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    Ե}x*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['chr'] = ["chr",[["Ꮜ","Ꮢ"],["ᏌᎾᎴ","ᏒᎯᏱᎢ"],["ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"]],[["ᏌᎾᎴ","ᏒᎯᏱᎢ"],u,["ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"]],[["Ꮖ","Ꮙ","Ꮤ","Ꮶ","Ꮕ","Ꮷ","Ꭴ"],["ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ"],["ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ"],["ᏍᎬ","ᏅᎯ","ᏔᎵ","ᏦᎢ","ᏅᎩ","ᏧᎾ","ᏕᎾ"]],u,[["Ꭴ","Ꭷ","Ꭰ","Ꭷ","Ꭰ","Ꮥ","Ꭻ","Ꭶ","Ꮪ","Ꮪ","Ꮕ","Ꭵ"],["ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ"],["ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ"]],u,[["BC","AD"],u,["ᏧᏓᎷᎸ ᎤᎷᎯᏍᏗ ᎦᎶᏁᏛ","ᎠᏃ ᏙᎻᏂ"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} ᎤᎾᎢ {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","$","US ᎠᏕᎳ",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"]},"ltr", plural, [[["Ꭲ","ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"],["ᎢᎦ","ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"],u],[["ᎢᎦ","ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"],u,u],["12:00",["00:00","12:00"],["12:00","24:00"]]]];
  })(globalThis);
    |OZx^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ckb-ir'] = ["ckb-IR",[["ب.ن","د.ن"],u,u],u,[["ی","د","س","چ","پ","ھ","ش"],["یەکشەممە","دووشەممە","سێشەممە","چوارشەممە","پێنجشەممە","ھەینی","شەممە"],u,["١ش","٢ش","٣ش","٤ش","٥ش","ھ","ش"]],u,[["ک","ش","ئ","ن","ئ","ح","ت","ئ","ئ","ت","ت","ک"],["کانوونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەمووز","ئاب","ئەیلوول","تشرینی یەکەم","تشرینی دووەم","کانونی یەکەم"],u],u,[["پێش زایین","زایینی"],u,u],6,[5,5],["y-MM-dd","y MMM d","dی MMMMی y","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","‎+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"IRR","IRR","IRR",{"IQD":["د.ع.‏"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"rtl", plural, []];
  })(globalThis);
    g87ZxZ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ckb'] = ["ckb",[["ب.ن","د.ن"],u,u],u,[["ی","د","س","چ","پ","ھ","ش"],["یەکشەممە","دووشەممە","سێشەممە","چوارشەممە","پێنجشەممە","ھەینی","شەممە"],u,["١ش","٢ش","٣ش","٤ش","٥ش","ھ","ش"]],u,[["ک","ش","ئ","ن","ئ","ح","ت","ئ","ئ","ت","ت","ک"],["کانوونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەمووز","ئاب","ئەیلوول","تشرینی یەکەم","تشرینی دووەم","کانونی یەکەم"],u],u,[["پێش زایین","زایینی"],u,u],6,[5,6],["y-MM-dd","y MMM d","dی MMMMی y","y MMMM d, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","‎+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"IQD","د.ع.‏","IQD",{"IQD":["د.ع.‏"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"rtl", plural, []];
  })(globalThis);
    c<&x	c/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
if (i === Math.floor(i) && (i >= 2 && i <= 4) && v === 0)
    return 3;
if (!(v === 0))
    return 4;
return 5;
}
    global.ng.common.locales['cs'] = ["cs",[["dop.","odp."],u,u],u,[["N","P","Ú","S","Č","P","S"],["ne","po","út","st","čt","pá","so"],["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],["ne","po","út","st","čt","pá","so"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro"],["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro"],["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"]],[["př.n.l.","n.l."],["př. n. l.","n. l."],["před naším letopočtem","našeho letopočtu"]],1,[6,0],["dd.MM.yy","d. M. y","d. MMMM y","EEEE d. MMMM y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"CZK","Kč","česká koruna",{"AUD":["AU$","$"],"BYN":[u,"р."],"CSK":["Kčs"],"CZK":["Kč"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"],"XEU":["ECU"],"XXX":[]},"ltr", plural, [[["půl.","pol.","r.","d.","o.","v.","n."],["půln.","pol.","r.","dop.","odp.","več.","v n."],["půlnoc","poledne","ráno","dopoledne","odpoledne","večer","v noci"]],[["půl.","pol.","ráno","dop.","odp.","več.","noc"],["půlnoc","poledne","ráno","dopoledne","odpoledne","večer","noc"],u],["00:00","12:00",["04:00","09:00"],["09:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    Ｘx	G/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n === 3)
    return 3;
if (n === 6)
    return 4;
return 5;
}
    global.ng.common.locales['cy'] = ["cy",[["b","h"],["AM","PM"],["yb","yh"]],[["AM","PM"],u,u],[["S","Ll","M","M","I","G","S"],["Sul","Llun","Maw","Mer","Iau","Gwen","Sad"],["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],["Su","Ll","Ma","Me","Ia","Gw","Sa"]],[["S","Ll","M","M","I","G","S"],["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],["Su","Ll","Ma","Me","Ia","Gw","Sa"]],[["I","Ch","M","E","M","M","G","A","M","H","T","Rh"],["Ion","Chwef","Maw","Ebr","Mai","Meh","Gorff","Awst","Medi","Hyd","Tach","Rhag"],["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"]],[["I","Ch","M","E","M","M","G","A","M","H","T","Rh"],["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Awst","Medi","Hyd","Tach","Rhag"],["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"]],[["C","O"],["CC","OC"],["Cyn Crist","Oed Crist"]],1,[6,0],["dd/MM/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'am' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GBP","£","Punt Prydain",{"BDT":[u,"TK"],"BWP":[],"BYN":[u,"р."],"HKD":["HK$"],"JPY":["JP¥","¥"],"KRW":[u,"₩"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XXX":[],"ZAR":[],"ZMW":[]},"ltr", plural, [[["canol nos","canol dydd","yn y bore","yn y prynhawn","min nos"],["canol nos","canol dydd","y bore","y prynhawn","yr hwyr"],u],[["canol nos","canol dydd","bore","prynhawn","min nos"],["canol nos","canol dydd","bore","prynhawn","yr hwyr"],["canol nos","canol dydd","y bore","y prynhawn","yr hwyr"]],["00:00","12:00",["00:00","12:00"],["12:00","18:00"],["18:00","24:00"]]]];
  })(globalThis);
    a>xQ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), t = parseInt(val.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0;

if (n === 1 || !(t === 0) && (i === 0 || i === 1))
    return 1;
return 5;
}
    global.ng.common.locales['da-gl'] = ["da-GL",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","O","T","F","L"],["søn.","man.","tir.","ons.","tor.","fre.","lør."],["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],["sø","ma","ti","on","to","fr","lø"]],[["S","M","T","O","T","F","L"],["søn","man","tir","ons","tor","fre","lør"],["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],["sø","ma","ti","on","to","fr","lø"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"]],u,[["fKr","eKr"],["f.Kr.","e.Kr."],u],1,[6,0],["dd.MM.y","d. MMM y","d. MMMM y","EEEE 'den' d. MMMM y"],["HH.mm","HH.mm.ss","HH.mm.ss z","HH.mm.ss zzzz"],["{1} {0}",u,"{1} 'kl'. {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN","."],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"DKK","kr.","dansk krone",{"AUD":["AU$","$"],"BYN":[u,"Br."],"DKK":["kr."],"ISK":[u,"kr."],"JPY":["JP¥","¥"],"NOK":[u,"kr."],"PHP":[u,"₱"],"RON":[u,"L"],"SEK":[u,"kr."],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["midnat","om morgenen","om formiddagen","om eftermiddagen","om aftenen","om natten"],u,u],[["midnat","morgen","formiddag","eftermiddag","aften","nat"],u,u],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    exK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), t = parseInt(val.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0;

if (n === 1 || !(t === 0) && (i === 0 || i === 1))
    return 1;
return 5;
}
    global.ng.common.locales['da'] = ["da",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","O","T","F","L"],["søn.","man.","tir.","ons.","tor.","fre.","lør."],["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],["sø","ma","ti","on","to","fr","lø"]],[["S","M","T","O","T","F","L"],["søn","man","tir","ons","tor","fre","lør"],["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],["sø","ma","ti","on","to","fr","lø"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"]],u,[["fKr","eKr"],["f.Kr.","e.Kr."],u],1,[6,0],["dd.MM.y","d. MMM y","d. MMMM y","EEEE 'den' d. MMMM y"],["HH.mm","HH.mm.ss","HH.mm.ss z","HH.mm.ss zzzz"],["{1} {0}",u,"{1} 'kl'. {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN","."],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"DKK","kr.","dansk krone",{"AUD":["AU$","$"],"BYN":[u,"Br."],"DKK":["kr."],"ISK":[u,"kr."],"JPY":["JP¥","¥"],"NOK":[u,"kr."],"PHP":[u,"₱"],"RON":[u,"L"],"SEK":[u,"kr."],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["midnat","om morgenen","om formiddagen","om eftermiddagen","om aftenen","om natten"],u,u],[["midnat","morgen","formiddag","eftermiddag","aften","nat"],u,u],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    Uc`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['dav'] = ["dav",[["Luma lwa K","luma lwa p"],u,u],u,[["J","J","K","K","K","K","N"],["Jum","Jim","Kaw","Kad","Kan","Kas","Ngu"],["Ituku ja jumwa","Kuramuka jimweri","Kuramuka kawi","Kuramuka kadadu","Kuramuka kana","Kuramuka kasanu","Kifula nguwo"],["Jum","Jim","Kaw","Kad","Kan","Kas","Ngu"]],u,[["I","K","K","K","K","K","M","W","I","I","I","I"],["Imb","Kaw","Kad","Kan","Kas","Kar","Mfu","Wun","Ike","Iku","Imw","Iwi"],["Mori ghwa imbiri","Mori ghwa kawi","Mori ghwa kadadu","Mori ghwa kana","Mori ghwa kasanu","Mori ghwa karandadu","Mori ghwa mfungade","Mori ghwa wunyanya","Mori ghwa ikenda","Mori ghwa ikumi","Mori ghwa ikumi na imweri","Mori ghwa ikumi na iwi"]],u,[["KK","BK"],u,["Kabla ya Kristo","Baada ya Kristo"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Shilingi ya Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    wRx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['de-at'] = ["de-AT",[["AM","PM"],u,u],[["vm.","nm."],["AM","PM"],u],[["S","M","D","M","D","F","S"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["S","M","D","M","D","F","S"],["So","Mo","Di","Mi","Do","Fr","Sa"],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jän.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'um' {0}",u],[","," ",";","%","+","-","E","·","‰","∞","NaN",":",u,"."],["#,##0.###","#,##0 %","¤ #,##0.00","#E0"],"EUR","€","Euro",{"ATS":["öS"],"AUD":["AU$","$"],"BGM":["BGK"],"BGO":["BGJ"],"BYN":[u,"р."],"CUC":[u,"Cub$"],"DEM":["DM"],"FKP":[u,"Fl£"],"GHS":[u,"₵"],"GNF":[u,"F.G."],"KMF":[u,"FC"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"RWF":[u,"F.Rw"],"SYP":[],"THB":["฿"],"TWD":["NT$"],"XXX":[],"ZMW":[u,"K"]},"ltr", plural, [[["Mitternacht","morgens","vorm.","mittags","nachm.","abends","nachts"],u,["Mitternacht","morgens","vormittags","mittags","nachmittags","abends","nachts"]],[["Mitternacht","Morgen","Vorm.","Mittag","Nachm.","Abend","Nacht"],u,["Mitternacht","Morgen","Vormittag","Mittag","Nachmittag","Abend","Nacht"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    Wx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['de-be'] = ["de-BE",[["AM","PM"],u,u],u,[["S","M","D","M","D","F","S"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["S","M","D","M","D","F","S"],["So","Mo","Di","Mi","Do","Fr","Sa"],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sept.","Okt.","Nov.","Dez."],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'um' {0}",u],[",",".",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euro",{"ATS":["öS"],"AUD":["AU$","$"],"BGM":["BGK"],"BGO":["BGJ"],"BYN":[u,"р."],"CUC":[u,"Cub$"],"DEM":["DM"],"FKP":[u,"Fl£"],"GHS":[u,"₵"],"GNF":[u,"F.G."],"KMF":[u,"FC"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"RWF":[u,"F.Rw"],"SYP":[],"THB":["฿"],"TWD":["NT$"],"XXX":[],"ZMW":[u,"K"]},"ltr", plural, [[["Mitternacht","morgens","vorm.","mittags","nachm.","abends","nachts"],u,["Mitternacht","morgens","vormittags","mittags","nachmittags","abends","nachts"]],[["Mitternacht","Morgen","Vorm.","Mittag","Nachm.","Abend","Nacht"],u,["Mitternacht","Morgen","Vormittag","Mittag","Nachmittag","Abend","Nacht"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    Җx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['de-ch'] = ["de-CH",[["AM","PM"],u,u],u,[["S","M","D","M","D","F","S"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So","Mo","Di","Mi","Do","Fr","Sa"]],[["S","M","D","M","D","F","S"],["So","Mo","Di","Mi","Do","Fr","Sa"],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sept.","Okt.","Nov.","Dez."],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'um' {0}",u],[".","’",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤-#,##0.00","#E0"],"CHF","CHF","Schweizer Franken",{"ATS":["öS"],"AUD":["AU$","$"],"BGM":["BGK"],"BGO":["BGJ"],"BYN":[u,"р."],"CUC":[u,"Cub$"],"DEM":["DM"],"EUR":[],"FKP":[u,"Fl£"],"GHS":[u,"₵"],"GNF":[u,"F.G."],"KMF":[u,"FC"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"RWF":[u,"F.Rw"],"SYP":[],"THB":["฿"],"TWD":["NT$"],"XXX":[],"ZMW":[u,"K"]},"ltr", plural, [[["Mitternacht","morgens","vorm.","mittags","nachm.","abends","nachts"],u,["Mitternacht","morgens","vormittags","mittags","nachmittags","abends","nachts"]],[["Mitternacht","Morgen","Vorm.","Mittag","Nachm.","Abend","Nacht"],u,["Mitternacht","Morgen","Vormittag","Mittag","Nachmittag","Abend","Nacht"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    Jpܷx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['de-it'] = ["de-IT",[["AM","PM"],u,u],u,[["S","M","D","M","D","F","S"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["S","M","D","M","D","F","S"],["So","Mo","Di","Mi","Do","Fr","Sa"],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jän.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'um' {0}",u],[",",".",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euro",{"ATS":["öS"],"AUD":["AU$","$"],"BGM":["BGK"],"BGO":["BGJ"],"BYN":[u,"р."],"CUC":[u,"Cub$"],"DEM":["DM"],"FKP":[u,"Fl£"],"GHS":[u,"₵"],"GNF":[u,"F.G."],"KMF":[u,"FC"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"RWF":[u,"F.Rw"],"SYP":[],"THB":["฿"],"TWD":["NT$"],"XXX":[],"ZMW":[u,"K"]},"ltr", plural, [[["Mitternacht","morgens","vorm.","mittags","nachm.","abends","nachts"],u,["Mitternacht","morgens","vormittags","mittags","nachmittags","abends","nachts"]],[["Mitternacht","Morgen","Vorm.","Mittag","Nachm.","Abend","Nacht"],u,["Mitternacht","Morgen","Vormittag","Mittag","Nachmittag","Abend","Nacht"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    `x-
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['de-li'] = ["de-LI",[["AM","PM"],u,u],[["vm.","nm."],["AM","PM"],u],[["S","M","D","M","D","F","S"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["S","M","D","M","D","F","S"],["So","Mo","Di","Mi","Do","Fr","Sa"],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sept.","Okt.","Nov.","Dez."],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'um' {0}",u],[".","’",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"CHF","CHF","Schweizer Franken",{"ATS":["öS"],"AUD":["AU$","$"],"BGM":["BGK"],"BGO":["BGJ"],"BYN":[u,"р."],"CUC":[u,"Cub$"],"DEM":["DM"],"EUR":[u,"€"],"FKP":[u,"Fl£"],"GHS":[u,"₵"],"GNF":[u,"F.G."],"KMF":[u,"FC"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"RWF":[u,"F.Rw"],"SYP":[],"THB":["฿"],"TWD":["NT$"],"XXX":[],"ZMW":[u,"K"]},"ltr", plural, [[["Mitternacht","morgens","vorm.","mittags","nachm.","abends","nachts"],u,["Mitternacht","morgens","vormittags","mittags","nachmittags","abends","nachts"]],[["Mitternacht","Morgen","Vorm.","Mittag","Nachm.","Abend","Nacht"],u,["Mitternacht","Morgen","Vormittag","Mittag","Nachmittag","Abend","Nacht"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    3x!
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['de-lu'] = ["de-LU",[["vorm.","nachm."],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","D","M","D","F","S"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["S","M","D","M","D","F","S"],["So","Mo","Di","Mi","Do","Fr","Sa"],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sept.","Okt.","Nov.","Dez."],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'um' {0}",u],[",",".",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euro",{"ATS":["öS"],"AUD":["AU$","$"],"BGM":["BGK"],"BGO":["BGJ"],"BYN":[u,"р."],"CUC":[u,"Cub$"],"DEM":["DM"],"FKP":[u,"Fl£"],"GHS":[u,"₵"],"GNF":[u,"F.G."],"KMF":[u,"FC"],"LUF":["F"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"RWF":[u,"F.Rw"],"SYP":[],"THB":["฿"],"TWD":["NT$"],"XXX":[],"ZMW":[u,"K"]},"ltr", plural, [[["Mitternacht","morgens","vorm.","mittags","nachm.","abends","nachts"],u,["Mitternacht","morgens","vormittags","mittags","nachmittags","abends","nachts"]],[["Mitternacht","Morgen","Vorm.","Mittag","Nachm.","Abend","Nacht"],u,["Mitternacht","Morgen","Vormittag","Mittag","Nachmittag","Abend","Nacht"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    ׾x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['de'] = ["de",[["AM","PM"],u,u],u,[["S","M","D","M","D","F","S"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["S","M","D","M","D","F","S"],["So","Mo","Di","Mi","Do","Fr","Sa"],["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sept.","Okt.","Nov.","Dez."],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]],[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'um' {0}",u],[",",".",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euro",{"ATS":["öS"],"AUD":["AU$","$"],"BGM":["BGK"],"BGO":["BGJ"],"BYN":[u,"р."],"CUC":[u,"Cub$"],"DEM":["DM"],"FKP":[u,"Fl£"],"GHS":[u,"₵"],"GNF":[u,"F.G."],"KMF":[u,"FC"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"RWF":[u,"F.Rw"],"SYP":[],"THB":["฿"],"TWD":["NT$"],"XXX":[],"ZMW":[u,"K"]},"ltr", plural, [[["Mitternacht","morgens","vorm.","mittags","nachm.","abends","nachts"],u,["Mitternacht","morgens","vormittags","mittags","nachmittags","abends","nachts"]],[["Mitternacht","Morgen","Vorm.","Mittag","Nachm.","Abend","Nacht"],u,["Mitternacht","Morgen","Vormittag","Mittag","Nachmittag","Abend","Nacht"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","13:00"],["13:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    ֪Tx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['dje'] = ["dje",[["Subbaahi","Zaarikay b"],u,u],u,[["H","T","T","L","M","Z","S"],["Alh","Ati","Ata","Ala","Alm","Alz","Asi"],["Alhadi","Atinni","Atalaata","Alarba","Alhamisi","Alzuma","Asibti"],["Alh","Ati","Ata","Ala","Alm","Alz","Asi"]],u,[["Ž","F","M","A","M","Ž","Ž","U","S","O","N","D"],["Žan","Fee","Mar","Awi","Me","Žuw","Žuy","Ut","Sek","Okt","Noo","Dee"],["Žanwiye","Feewiriye","Marsi","Awiril","Me","Žuweŋ","Žuyye","Ut","Sektanbur","Oktoobur","Noowanbur","Deesanbur"]],u,[["IJ","IZ"],u,["Isaa jine","Isaa zamanoo"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],["."," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"XOF","F CFA","CFA Fraŋ (BCEAO)",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    |⌦x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['doi'] = ["doi",[["सवेर","स’ञ"],u,["सवेर","बाद दपैहर"]],[["सवेर","स’ञ"],u,u],[["ऐ.","सो.","म.","बु.","बी.","शु.","श."],["ऐत","सोम","मंगल","बुध","बीर","शुक्र","शनि"],["ऐतबार","सोमबार","मंगलबार","बुधबार","बीरबार","शुक्रबार","शनीबार"],["ऐत","सोम","मंगल","बुध","बीर","शुक्र","शनि"]],[["ऐ","सो","म.","बु.","बी.","शु.","श."],["ऐत","सोम","मंगल","बुध","बीर","शुक्र","शनि"],["ऐतबार","सोमबार","मंगलबार","बुधबार","बीरबार","शुक्रबार","शनिबार"],["ऐत","सोम","मंगल","बुध","बीर","शुक्र","शनि"]],[["ज","फ","मा","अ","मे","जू","जु","अ","सि","अ","न","दि"],["जन.","फर.","मार्च","अप्रैल","मेई","जून","जुलाई","अग.","सित.","अक्तू.","नव.","दिस."],["जनवरी","फरवरी","मार्च","अप्रैल","मेई","जून","जुलाई","अगस्त","सितंबर","अत्तूबर","नवंबर","दिसंबर"]],[["ज","फ","मा","अ","मे","जू","जु","अ","सि","अ","न","दि"],["जन.","फर.","मार्च","अप्रैल","मेई","जून","जुलाई","अग.","सित.","अक्तू.","नव.","दिस."],["जनवरी","फरवरी","मार्च","अप्रैल","मेई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"]],[["ई.पू.","ईसवी"],u,["ई.पू.","ई. सन्"]],0,[0,0],["d/M/yy","d, MMM y","d, MMMM y","EEEE, d, MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} गी {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"INR","₹","भारती रपेऽ",{},"ltr", plural, []];
  })(globalThis);
    skxT/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && i % 100 === 1 || f % 100 === 1)
    return 1;
if (v === 0 && i % 100 === 2 || f % 100 === 2)
    return 2;
if (v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 3 && i % 100 <= 4)) || f % 100 === Math.floor(f % 100) && (f % 100 >= 3 && f % 100 <= 4))
    return 3;
return 5;
}
    global.ng.common.locales['dsb'] = ["dsb",[["dop.","wótp."],["dopołdnja","wótpołdnja"],u],[["am","pm"],u,["dopołdnja","wótpołdnja"]],[["n","p","w","s","s","p","s"],["nje","pón","wał","srj","stw","pět","sob"],["njeźela","pónjeźele","wałtora","srjoda","stwórtk","pětk","sobota"],["nj","pó","wa","sr","st","pě","so"]],u,[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan.","feb.","měr.","apr.","maj.","jun.","jul.","awg.","sep.","okt.","now.","dec."],["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra"]],[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec"],["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december"]],[["pś.Chr.n.","pó Chr.n."],u,["pśed Kristusowym naroźenim","pó Kristusowem naroźenju"]],1,[6,0],["d.M.yy","d.M.y","d. MMMM y","EEEE, d. MMMM y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":[u,"$"],"PLN":["zł"],"THB":["฿"]},"ltr", plural, []];
  })(globalThis);
    yXxp/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['dua'] = ["dua",[["idiɓa","ebyámu"],u,u],u,[["e","m","k","m","ŋ","ɗ","e"],["ét","mɔ́s","kwa","muk","ŋgi","ɗón","esa"],["éti","mɔ́sú","kwasú","mukɔ́sú","ŋgisú","ɗónɛsú","esaɓasú"],["ét","mɔ́s","kwa","muk","ŋgi","ɗón","esa"]],u,[["d","ŋ","s","d","e","e","m","d","n","m","t","e"],["di","ŋgɔn","sɔŋ","diɓ","emi","esɔ","mad","diŋ","nyɛt","may","tin","elá"],["dimɔ́di","ŋgɔndɛ","sɔŋɛ","diɓáɓá","emiasele","esɔpɛsɔpɛ","madiɓɛ́díɓɛ́","diŋgindi","nyɛtɛki","mayésɛ́","tiníní","eláŋgɛ́"]],u,[["ɓ.Ys","mb.Ys"],u,["ɓoso ɓwá yáɓe lá","mbúsa kwédi a Yés"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XAF","FCFA","XAF",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    xRx!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['dyo'] = ["dyo",[["AM","PM"],u,u],u,[["D","T","T","A","A","A","S"],["Dim","Ten","Tal","Ala","Ara","Arj","Sib"],["Dimas","Teneŋ","Talata","Alarbay","Aramisay","Arjuma","Sibiti"],["Dim","Ten","Tal","Ala","Ara","Arj","Sib"]],u,[["S","F","M","A","M","S","S","U","S","O","N","D"],["Sa","Fe","Ma","Ab","Me","Su","Sú","Ut","Se","Ok","No","De"],["Sanvie","Fébirie","Mars","Aburil","Mee","Sueŋ","Súuyee","Ut","Settembar","Oktobar","Novembar","Disambar"]],u,[["ArY","AtY"],u,["Ariŋuu Yeesu","Atooŋe Yeesu"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XOF","F CFA","seefa yati BCEAO",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    k}RxE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['dz'] = ["dz",[["སྔ་ཆ་","ཕྱི་ཆ་"],u,u],u,[["ཟླ","མིར","ལྷག","ཕུར","སངྶ","སྤེན","ཉི"],["ཟླ་","མིར་","ལྷག་","ཕུར་","སངས་","སྤེན་","ཉི་"],["གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་པ་","གཟའ་ཕུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་པ་","གཟའ་ཉི་མ་"],["ཟླ་","མིར་","ལྷག་","ཕུར་","སངས་","སྤེན་","ཉི་"]],u,[["༡","༢","༣","4","༥","༦","༧","༨","9","༡༠","༡༡","༡༢"],["༡","༢","༣","༤","༥","༦","༧","༨","༩","༡༠","༡༡","12"],["ཟླ་དངཔ་","ཟླ་གཉིས་པ་","ཟླ་གསུམ་པ་","ཟླ་བཞི་པ་","ཟླ་ལྔ་པ་","ཟླ་དྲུག་པ","ཟླ་བདུན་པ་","ཟླ་བརྒྱད་པ་","ཟླ་དགུ་པ་","ཟླ་བཅུ་པ་","ཟླ་བཅུ་གཅིག་པ་","ཟླ་བཅུ་གཉིས་པ་"]],[["༡","༢","༣","༤","༥","༦","༧","༨","༩","༡༠","༡༡","༡༢"],["ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢"],["སྤྱི་ཟླ་དངཔ་","སྤྱི་ཟླ་གཉིས་པ་","སྤྱི་ཟླ་གསུམ་པ་","སྤྱི་ཟླ་བཞི་པ","སྤྱི་ཟླ་ལྔ་པ་","སྤྱི་ཟླ་དྲུག་པ","སྤྱི་ཟླ་བདུན་པ་","སྤྱི་ཟླ་བརྒྱད་པ་","སྤྱི་ཟླ་དགུ་པ་","སྤྱི་ཟླ་བཅུ་པ་","སྤྱི་ཟླ་བཅུ་གཅིག་པ་","སྤྱི་ཟླ་བཅུ་གཉིས་པ་"]],[["BCE","CE"],u,u],0,[6,0],["y-MM-dd","སྤྱི་ལོ་y ཟླ་MMM ཚེས་dd","སྤྱི་ལོ་y MMMM ཚེས་ dd","EEEE, སྤྱི་ལོ་y MMMM ཚེས་dd"],["ཆུ་ཚོད་ h སྐར་མ་ mm a","ཆུ་ཚོད་h:mm:ss a","ཆུ་ཚོད་ h སྐར་མ་ mm:ss a z","ཆུ་ཚོད་ h སྐར་མ་ mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0 %","¤#,##,##0.00","#E0"],"INR","₹","རྒྱ་གར་གྱི་དངུལ་ རུ་པི",{"AUD":["AU$","$"],"BTN":["Nu."],"ILS":[u,"₪"],"JPY":["JP¥","¥"],"KRW":["KR₩","₩"],"THB":["TH฿","฿"],"USD":["US$","$"],"XAF":[]},"ltr", plural, []];
  })(globalThis);
    '\x4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ebu'] = ["ebu",[["KI","UT"],u,u],u,[["K","N","N","N","A","M","N"],["Kma","Tat","Ine","Tan","Arm","Maa","NMM"],["Kiumia","Njumatatu","Njumaine","Njumatano","Aramithi","Njumaa","NJumamothii"],["Kma","Tat","Ine","Tan","Arm","Maa","NMM"]],u,[["M","K","K","K","G","G","M","K","K","I","I","I"],["Mbe","Kai","Kat","Kan","Gat","Gan","Mug","Knn","Ken","Iku","Imw","Igi"],["Mweri wa mbere","Mweri wa kaĩri","Mweri wa kathatũ","Mweri wa kana","Mweri wa gatano","Mweri wa gatantatũ","Mweri wa mũgwanja","Mweri wa kanana","Mweri wa kenda","Mweri wa ikũmi","Mweri wa ikũmi na ũmwe","Mweri wa ikũmi na Kaĩrĩ"]],u,[["MK","TK"],u,["Mbere ya Kristo","Thutha wa Kristo"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Shilingi ya Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ڹgxw/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ee-tg'] = ["ee-TG",[["ŋ","ɣ"],["ŋdi","ɣetrɔ"],u],u,[["k","d","b","k","y","f","m"],["kɔs","dzo","bla","kuɖ","yaw","fiɖ","mem"],["kɔsiɖa","dzoɖa","blaɖa","kuɖa","yawoɖa","fiɖa","memleɖa"],["kɔs","dzo","bla","kuɖ","yaw","fiɖ","mem"]],u,[["d","d","t","a","d","m","s","d","a","k","a","d"],["dzv","dzd","ted","afɔ","dam","mas","sia","dea","any","kel","ade","dzm"],["dzove","dzodze","tedoxe","afɔfĩe","dama","masa","siamlɔm","deasiamime","anyɔnyɔ","kele","adeɛmekpɔxe","dzome"]],u,[["HYV","Yŋ"],u,["Hafi Yesu Va","Yesu ŋɔli"]],1,[6,0],["M/d/yy","MMM d 'lia', y","MMMM d 'lia' y","EEEE, MMMM d 'lia' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{0} {1}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","mnn",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"XOF","F CFA","ɣetoɖofe afrikaga CFA franc BCEAO",{"AUD":["AU$","$"],"BYN":[u,"р."],"GHS":["GH₵"],"JPY":["JP¥","¥"],"THB":["฿"],"USD":["US$","$"]},"ltr", plural, [[["fɔŋli","ŋdi","ŋdɔ","ɣetrɔ","fiẽ","zã"],u,u],u,[["04:00","05:00"],["05:00","12:00"],["12:00","14:00"],["14:00","18:00"],["18:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    fxo/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ee'] = ["ee",[["ŋ","ɣ"],["ŋdi","ɣetrɔ"],u],u,[["k","d","b","k","y","f","m"],["kɔs","dzo","bla","kuɖ","yaw","fiɖ","mem"],["kɔsiɖa","dzoɖa","blaɖa","kuɖa","yawoɖa","fiɖa","memleɖa"],["kɔs","dzo","bla","kuɖ","yaw","fiɖ","mem"]],u,[["d","d","t","a","d","m","s","d","a","k","a","d"],["dzv","dzd","ted","afɔ","dam","mas","sia","dea","any","kel","ade","dzm"],["dzove","dzodze","tedoxe","afɔfĩe","dama","masa","siamlɔm","deasiamime","anyɔnyɔ","kele","adeɛmekpɔxe","dzome"]],u,[["HYV","Yŋ"],u,["Hafi Yesu Va","Yesu ŋɔli"]],1,[6,0],["M/d/yy","MMM d 'lia', y","MMMM d 'lia' y","EEEE, MMMM d 'lia' y"],["a 'ga' h:mm","a 'ga' h:mm:ss","a 'ga' h:mm:ss z","a 'ga' h:mm:ss zzzz"],["{0} {1}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","mnn",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GHS","GH₵","ghana siɖi",{"AUD":["AU$","$"],"BYN":[u,"р."],"GHS":["GH₵"],"JPY":["JP¥","¥"],"THB":["฿"],"USD":["US$","$"]},"ltr", plural, [[["fɔŋli","ŋdi","ŋdɔ","ɣetrɔ","fiẽ","zã"],u,u],u,[["04:00","05:00"],["05:00","12:00"],["12:00","14:00"],["14:00","18:00"],["18:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    ܓ'x	U/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['el-cy'] = ["el-CY",[["πμ","μμ"],["π.μ.","μ.μ."],u],u,[["Κ","Δ","Τ","Τ","Π","Π","Σ"],["Κυρ","Δευ","Τρί","Τετ","Πέμ","Παρ","Σάβ"],["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],["Κυ","Δε","Τρ","Τε","Πέ","Πα","Σά"]],u,[["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],["Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"]],[["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],["Ιαν","Φεβ","Μάρ","Απρ","Μάι","Ιούν","Ιούλ","Αύγ","Σεπ","Οκτ","Νοέ","Δεκ"],["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"]],[["π.Χ.","μ.Χ."],u,["προ Χριστού","μετά Χριστόν"]],1,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} - {0}",u],[",",".",";","%","+","-","e","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","Ευρώ",{"BYN":[u,"р."],"GRD":["Δρχ"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"]},"ltr", plural, [[["πρωί","μεσημ.","απόγ.","βράδυ"],u,["το πρωί","το μεσημέρι","το απόγευμα","το βράδυ"]],[["πρωί","μεσημ.","απόγ.","βράδυ"],u,["πρωί","μεσημέρι","απόγευμα","βράδυ"]],[["04:00","12:00"],["12:00","17:00"],["17:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    |[fx	[/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['el'] = ["el",[["πμ","μμ"],["π.μ.","μ.μ."],u],u,[["Κ","Δ","Τ","Τ","Π","Π","Σ"],["Κυρ","Δευ","Τρί","Τετ","Πέμ","Παρ","Σάβ"],["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],["Κυ","Δε","Τρ","Τε","Πέ","Πα","Σά"]],u,[["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],["Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"]],[["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],["Ιαν","Φεβ","Μάρ","Απρ","Μάι","Ιούν","Ιούλ","Αύγ","Σεπ","Οκτ","Νοέ","Δεκ"],["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"]],[["π.Χ.","μ.Χ."],u,["προ Χριστού","μετά Χριστόν"]],1,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} - {0}",u],[",",".",";","%","+","-","e","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","Ευρώ",{"BYN":[u,"р."],"GRD":["Δρχ"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"]},"ltr", plural, [[["πρωί","μεσημ.","απόγ.","βράδυ"],u,["το πρωί","το μεσημέρι","το απόγευμα","το βράδυ"]],[["πρωί","μεσημ.","απόγ.","βράδυ"],u,["πρωί","μεσημέρι","απόγευμα","βράδυ"]],[["04:00","12:00"],["12:00","17:00"],["17:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    hkYox/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-150'] = ["en-150",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],u,u,u,{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    'x^ O001'] = ["en-001_O,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss ax
¤#,##0.00Z ox/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ae'] = ["en-AE",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],6,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"AED","AED","United Arab Emirates Dirham",{},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    %yrx!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ag'] = ["en-AG",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"XCD","$","East Caribbean Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"],"XCD":["$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    	.x uOie'] = ["en-IE]["a.m.","p.m."]w1q,6 d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ssEUR","€","Euro(j(qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-nf'] = ["en-NF",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"AUD","$","Australian Dollar",{"AUD":["$"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ;
A&xP Oai'] = ["en-AI]"XCD","$","East Caribbean Dollar",{%,"XCD":[n	
x YO4bi'] = ["en-BI",[["a","p"],["AM","PM"],u],[["AM","PM,-M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d,)BIF","FBu","Burundian Franc",{"BIF":["FBul.¾qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-er'] = ["en-ER",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ERN","Nfk","Eritrean Nakfa",{"ERN":["Nfk"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    `	+x bO4as'] = ["en-AS",[["a","p"],["AM","PM"],u],[["AM","PM,70,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d,USD","$","US Dollar",{j7?*Wx	;
!+(lrc-iq'] = ["lrc-IQ",[["AM","PM"],u,u],uLu,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["جانڤیە","فئڤریە","مارس","آڤریل","مئی","وٙأن","جوٙلا","آگوست","سئپتامر","ئوکتوڤر","نوڤامر","دئسامر"],u],u,[["BCE","CE"],u,u],66,[5,6],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE>	 {0}",u,uV= #,##0.00","#E0"],"IQD","د.ع.‏","IQD",{"IQD":["د.ع.‏+)rtl", plural, []];
  })(globalThis);
    οn+x" Omp'] = ["en-MP]1pu'	qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-lr'] = ["en-LR",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"LRD","$","Liberian Dollar",{"JPY":["JP¥","¥"],"LRD":["$"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    5

(x ^Oat'] = ["en-AT]O(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss*,",".",";","%","+","-","E","· ,, %","¤ #,##0.00","#E0"],"EUR","€","Euro}z{,XxH Oto'] = ["en-TO]TOP","T$","Tongan Paʻanga}TOP":["Tfxg	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-au'] = ["en-AU",[["am","pm"],u,u],u,[["Su.","M.","Tu.","W.","Th.","F.","Sa."],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mon","Tu","Wed","Th","Fri","Sat"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","June","July","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","e","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"AUD","$","Australian Dollar",{"AUD":["$"],"BDT":[u,"Tk"],"BRL":[u,"R$"],"CAD":[u,"$"],"CNY":[u,"¥"],"CUP":[u,"₱"],"EGP":[u,"£"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"ISK":[u,"Kr"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"PYG":[u,"Gs"],"SCR":["Rs"],"SEK":[u,"Kr"],"TWD":[u,"$"],"USD":[u,"$"],"UYU":[u,"$U"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[],"XPF":["CFP"]},"ltr", plural, [[["midnight","midday","morning","afternoon","evening","night"],u,["midnight","midday","in the morning","in the afternoon","in the evening","at night"]],[["midnight","midday","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ^qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-bb'] = ["en-BB",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"BBD","$","Barbadian Dollar",{"BBD":["$"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    
rx!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-lc'] = ["en-LC",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"XCD","$","East Caribbean Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"],"XCD":["$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    .x sObe'] = ["en-BE]$y","d((HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss*,",".I&#,##0.00 ¤","#E0"],"EUR","€","Euro(j'
Ix ^Ode'] = ["en-DE]O(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss*,",".",";","%","+","-","E","· ,, %","#,##0.00 ¤","#E0"],"EUR","€","Euro(jc,yx Ogd'] = ["en-GD]rQqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-cm'] = ["en-CM",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"XAF","FCFA","Central African CFA Franc",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    
%xz Obm'] = ["en-B\P,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a)BMD","$","Bermudian Dollar",{"BMD":["$"],#.xe Osi'] = ["en-SI],",".",";","%","+","-","e5&#,##0.00 ¤","#E0"],"EUR","€","Euroeqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-zm'] = ["en-ZM",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZMW","K","Zambian Kwacha",{"JPY":["JP¥","¥"],"USD":["US$","$"],"ZMW":["K","ZK"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    |,xS Obs'] = ["en-BS]0q(BSD","$","Bahamian Dollar",{"BSD":["$"],%jsx6/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ss'] = ["en-SS",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"SSP","£","South Sudanese Pound",{"GBP":["GB£","£"],"JPY":["JP¥","¥"],"SSP":["£"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ˁCx "Obw'] = ["en-BW]0,[6,0],["dd/MM/yy","dd MMM y","dd MMMM y","EEEE, dd MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"u8BWP","P","Botswanan Pula",{"BWP":["P"],"JPY":["JP¥","¥~@}/xx Omt'] = ["en-MT]0qd MMM y","d(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ssEUR","€","Euro,z#κqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-vu'] = ["en-VU",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"VUV","VT","Vanuatu Vatu",{"JPY":["JP¥","¥"],"USD":["US$","$"],"VUV":["VT"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    Ln?'x 0Obz'] = ["en-BZ]0,[6,0],["dd/MM/yy","dd-MMM-y","dd MMMM y","EEEE, dd MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"u&BZD","$","Belize Dollar",{"BZD":["$"],~%j{:x5 Ocy'] = ["en-CY]EUR","€","Euro{(jIxn Omw'] = ["en-MW]MMWK","MK","Malawian Kwacha",{"JPY":["JP¥","¥"],"MWK":["MK"],"USD":["US$","$lVSsx6/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ca'] = ["en-CA",[["am","pm"],["a.m.","p.m."],u],[["a.m.","pm"],["a.m.","p.m."],u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["y-MM-dd","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"CAD","$","Canadian Dollar",{"CAD":["$"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mid","n","mor","aft","eve","night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["mid","noon","mor","aft","eve","night"],["midnight","noon","morning","afternoon","evening","night"],u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ]/qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-cc'] = ["en-CC",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"AUD","$","Australian Dollar",{"AUD":["$"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    
%&x< Ogb'] = ["en-GB]GBP","£","British Pound",{	qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ch'] = ["en-CH",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".","’",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤-#,##0.00","#E0"],"CHF","CHF","Swiss Franc",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    1&xe Ogg'] = ["en-GG],",";","%","+","-","E","×2%#,##0.00","#E0"],"GBP","£","UK Pound
x WOsd'] = ["en-SD]6,[5,6v6,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a.,",";","%","+","-","E","×2,#,##0.00","#E0"],"SDG","SDG","Sudanese Pound,Mqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ki'] = ["en-KI",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"AUD","$","Australian Dollar",{"AUD":["$"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    *x uOck'] = ["en-CK]O(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss<NZD","$","New Zealand Dollar",{"JPY":["JP¥","¥"],"NZD":["$~)kCx> Ofj'] = ["en-FJ]FJD","$","Fijian Dollar",{"FJ<q	x bO4mh'] = ["en-MH",[["a","p"],["AM","PM"],u],[["AM","PM,70,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d,USD","$","US Dollar",{j7*<xo Osg'] = ["en-SG]0,[6,0],["d/M/y:SGD","$","Singapore Dollar",{"JPY":["JP¥","¥"],"SGD":["$~ qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ws'] = ["en-WS",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"WST","WS$","Samoan Tala",{"JPY":["JP¥","¥"],"USD":["US$","$"],"WST":["WS$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    7
(x }Ocx'] = ["en-CX]1q;(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss*AUD","$","Australian Dollar",{"AUD":["$"],~%j&x] Onu'] = ["en-NU]<NZD","$","New Zealand Dollar",{"JPY":["JP¥","¥"],"NZD":["$~Epx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-tc'] = ["en-TC",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","US$","US Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ]KUxI Odg'] = ["en-DG]O(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss3;rx!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-dk'] = ["en-DK",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH.mm","HH.mm.ss","HH.mm.ss z","HH.mm.ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[",",".",";","%","+","-","E","·","‰","∞","NaN","."],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"DKK","kr.","Danish Krone",{"DKK":["kr.","kr"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    a2.xPO4ph'] = ["en-PH",[["a","p"],["AM","PM"],u],[["AM","PM,0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u.",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"PHP","₱","Philippine Peso",{j5l[)px/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-fm'] = ["en-FM",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","US$","US Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    7MxK Odm'] = ["en-D\0qXCD","$","East Caribbeanr/,"XCD":[n mErxs Oil'] = ["en-IL]0,[5,6v6$H:mm","H:mm:ss","H:mm:ss z","H:mm:ssILS","₪","Israeli New Shekelyf#		tx hO4vi'] = ["en-VI",[["a","p"],["AM","PM"],u],[["AM","PM,70,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d,$","US Dollar",{jA)qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ng'] = ["en-NG",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"NGN","₦","Nigerian Naira",{"JPY":["JP¥","¥"],"NGN":["₦"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    
'x VOfi'] = ["en-FI]P!.mm","H.mm.ss","H.mm.ss z","H.mm.,,"," .W."],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euro",{"JPY":["JP¥","¥~ 5/Bsx4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-fk'] = ["en-FK",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"FKP","£","Falkland Islands Pound",{"FKP":["£"],"GBP":["GB£","£"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    KAxe Oug'] = ["en-UG]0t>UGX","USh","Ugandan Shilling",{"JPY":["JP¥","¥"],"UGX":["USh~9$5xj Ovg'] = ["en-VG]O,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss aUSD","US$","US Dollar",{"rx!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-gh'] = ["en-GH",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GHS","GH₵","Ghanaian Cedi",{"GHS":["GH₵"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    _.x -Ose'] = ["en-SE]y-MM-dd+(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss*,"," ",";","%","+","-","×10^1U %","#,##0.00 ¤","#E0"],"SEK","kr","Swedish Krona",{"JPY":["JP¥","¥"],"SEK":["kr~U<Drx"/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-pg'] = ["en-PG",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"PGK","K","Papua New Guinean Kina",{"JPY":["JP¥","¥"],"PGK":["K"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    B	/x bOgi'] = ["en-GI]O(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ssOGIP","£","Gibraltar Pound",{"GBP":["GB£","£"],"GIP":["£"],"JPY":["JP¥","¥~91qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-gm'] = ["en-GM",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GMD","D","Gambian Dalasi",{"GMD":["D"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    X
lnx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-gu'] = ["en-GU",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    Hrx	O4ms'] = ["en-MS",[["a","p"],["am","pm"],u],[["am","pm,td1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ssSXCD","$","East Caribbean Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"],"XCD":["$"]{j/KVqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-tv'] = ["en-TV",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"AUD","$","Australian Dollar",{"AUD":["$"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    
m&xj Opw'] = ["en-PW]O,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss aUSD","US$","US Dollar",{yxJ Ogy'] = ["en-GY])GYD","$","Guyanaese Dollar",{"GYD":["$"],|lٰqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-hk'] = ["en-HK",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"HKD","HK$","Hong Kong Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    
x _Osh'] = ["en-SH]1,[6,0],["dd/M|.(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss1SHP","£","St Helena Pound",{"GBP":["GB£","£"],	SHP":["£~0Qpx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-im'] = ["en-IM",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GBP","£","UK Pound",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    z	x aOpk'] = ["en-PK]0qd-MMM-",h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a;PKR","Rs","Pakistani Rupee",{"JPY":["JP¥","¥"],"PKR":["Rs~!/=px/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-in'] = ["en-IN",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[0,0],["dd/MM/yy","dd-MMM-y","d MMMM y","EEEE, d MMMM, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤#,##,##0.00","#E0"],"INR","₹","Indian Rupee",{"JPY":["JP¥","¥"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    mqpx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-io'] = ["en-IO",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","US$","US Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
     qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ke'] = ["en-KE",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Kenyan Shilling",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    T$|(xd Osc'] = ["en-SC]1q=SCR","SR","Seychellois Rupee",{"JPY":["JP¥","¥"],"SCR":["SR~g
x XOza'] = ["en-ZA](y/MM/dd","dd MMM y","dd MMMM y","EEEE, d_,"," ]NZAR","R","South African Rand",{"JPY":["JP¥","¥"],"USD":["US$","$"],"ZAR":["RlL.)x8 Oje'] = ["en-JE]GBP","£","UK Pound|z7qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-jm'] = ["en-JM",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"JMD","$","Jamaican Dollar",{"JMD":["$"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    c
	(x lOnl'] = ["en-NL]1q;(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss*,",".K5 #,##0.00;¤ -#,##0.00","#E0"],"EUR","€","Euro",{E)rx"/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-sl'] = ["en-SL",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"SLL","Le","Sierra Leonean Leone",{"JPY":["JP¥","¥"],"SLL":["Le"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    /xp Okn'] = ["en-KN]OXCD","$","East Caribbean Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"],"XCD":[n rx+/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-sx'] = ["en-SX",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ANG","NAf.","Netherlands Antillean Guilder",{"ANG":["NAf."],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    	8x nOky'] = ["en-KY]O,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a?KYD","$","Cayman Islands Dollar",{"JPY":["JP¥","¥"],"KYD":["$~w],WXx pOmy'] = ["en-MY]O,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a=MYR","RM","Malaysian Ringgit",{"JPY":["JP¥","¥"],"MYR":["RM~2,;vxZ Orw'] = ["en-RW]9RWF","RF","Rwandan Franc",{"JPY":["JP¥","¥"],"RWF":["RF~qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-ls'] = ["en-LS",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZAR","R","South African Rand",{"JPY":["JP¥","¥"],"USD":["US$","$"],"ZAR":["R"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    )7+x| Onr'] = ["en-NR]O(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss*AUD","$","Australian Dollar",{"AUD":["$"],%j$	6x bO4pr'] = ["en-PR",[["a","p"],["AM","PM"],u],[["AM","PM,70,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d,USD","$","US Dollar",{jF+qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-mg'] = ["en-MG",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"MGA","Ar","Malagasy Ariary",{"JPY":["JP¥","¥"],"MGA":["Ar"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    
zrx!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-mo'] = ["en-MO",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"MOP","MOP$","Macanese Pataca",{"JPY":["JP¥","¥"],"MOP":["MOP$"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ?.x| Opn'] = ["en-PN]1q;(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ssNZD","$","New Zealand DollarNZD":["$c	9x lO4um'] = ["en-UM",[["a","p"],["AM","PM"],u],[["AM","PM,-M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d,USD","$","US Dollar",{j(͹qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-mu'] = ["en-MU",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"MUR","Rs","Mauritian Rupee",{"JPY":["JP¥","¥"],"MUR":["Rs"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    px/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-mv'] = ["en-MV",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],5,[6,0],["d-M-yy","dd-MM-y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MVR","Rf","Maldivian Rufiyaa",{"JPY":["JP¥","¥"],"MVR":["Rf"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    	1x Ott'] = ["en-TT]0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}"V4#,##0.00","#E0"],"TTD","$","Trinidad & Tobago DollarnTTD":["$~C{rx /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-na'] = ["en-NA",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZAR","ZAR","South African Rand",{"JPY":["JP¥","¥"],"NAD":["$"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    jqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-nz'] = ["en-NZ",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["d/MM/yy","d/MM/y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"NZD","$","New Zealand Dollar",{"JPY":["JP¥","¥"],"NZD":["$"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    	*x bOzw'] = ["en-ZW]e0,[6,0],["d/M/y","dd MMM,y","dd MMMM y","EEEE, dd MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ssUSD","US$","USxz4+rx"/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-sb'] = ["en-SB",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"SBD","$","Solomon Islands Dollar",{"JPY":["JP¥","¥"],"SBD":["$"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    fqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-tz'] = ["en-TZ",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"TZS","TSh","Tanzanian Shilling",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    M"+xw Osz'] = ["en-S\P,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss aSZL","E","Swazi Lilangeni~SZL":["E~R'$qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-tk'] = ["en-TK",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"NZD","$","New Zealand Dollar",{"JPY":["JP¥","¥"],"NZD":["$"],"USD":["US$","$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    q
prx!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en-vc'] = ["en-VC",[["a","p"],["am","pm"],u],[["am","pm"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"XCD","$","East Caribbean Dollar",{"JPY":["JP¥","¥"],"USD":["US$","$"],"XCD":["$"]},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    gɿmx /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['en'] = ["en",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    vRx(/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['eo'] = ["eo",[["atm","ptm"],u,u],u,[["S","M","T","W","T","F","S"],["di","lu","ma","me","ĵa","ve","sa"],["dimanĉo","lundo","mardo","merkredo","ĵaŭdo","vendredo","sabato"],["di","lu","ma","me","ĵa","ve","sa"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["jan","feb","mar","apr","maj","jun","jul","aŭg","sep","okt","nov","dec"],["januaro","februaro","marto","aprilo","majo","junio","julio","aŭgusto","septembro","oktobro","novembro","decembro"]],u,[["aK","pK"],u,u],1,[6,0],["yy-MM-dd","y-MMM-dd","y-MMMM-dd","EEEE, d-'a' 'de' MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","H-'a' 'horo' 'kaj' m:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],u,u,u,{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    a%Vx|	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-419'] = ["es-419",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"EUR","EUR","euro",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    Áx9	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-ar'] = ["es-AR",[["a. m.","p. m."],u,u],u,[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],u,[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00","#E0"],"ARS","$","peso argentino",{"ARS":["$"],"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":["US$","$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],["mediodía","madrugada","mañana","tarde","noche"],u],[["m.","madrugada","mañana","tarde","noche"],["mediodía","madrugada","mañana","tarde","noche"],u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    43x	o/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-bo'] = ["es-BO",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM 'de' y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"BOB","Bs","boliviano",{"AUD":[u,"$"],"BOB":["Bs"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    ėIxu	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-br'] = ["es-BR",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"BRL","R$","real brasileño",{"AUD":[u,"$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    *ఙx	o/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-bz'] = ["es-BZ",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"BZD","$","dólar beliceño",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"BZD":["$"],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    ܻx
d/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-cl'] = ["es-CL",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["do","lu","ma","mi","ju","vi","sá"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["dd-MM-yy","dd-MM-y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00;¤-#,##0.00","#E0"],"CLP","$","Peso chileno",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CLP":["$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":["US$","$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    J	)x gni'] = ["es-NIn'u@0,[6,0],["d/M/yy","d MMM .",",mU+","#E0"],"NIO","C$","córdoba nicaragüense@:IO":["ChuI	R:d/簴x@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-co'] = ["es-CO",[["a. m.","p. m."],u,u],u,[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/MM/yy","d/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00","#E0"],"COP","$","peso colombiano",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"COP":["$"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":["US$","$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],["m.","de la madrugada","de la mañana","de la tarde","de la noche"],["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"]],[["m.","madrugada","mañana","tarde","noche"],u,["mediodía","madrugada","mañana","tarde","noche"]],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    Epx	f/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-cr'] = ["es-CR",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"CRC","₡","colón costarricense",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"CRC":["₡"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    I'x gq'] = ["es-GQ!D","L","M","XuG:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1}, {0}",u,u,u],[",",".o_*XAF","FCFA","franco CFA de África CentralNEGP":[],"ESP":["₧u
THB":["฿,	"US$","$"t%$?EJx	p/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-cu'] = ["es-CU",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"CUP","$","peso cubano",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"CUP":["$"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":["US$","$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    TOxg gt'] = ["es-GT0,[6,0],["d/MM/yy","d/MM/GTQ","Q","quetzalN<>GTQ":["Qvu=R; x	l/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-hn'] = ["es-HN",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/M/yy","d MMM y","dd 'de' MMMM 'de' y","EEEE dd 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"HNL","L","lempira hondureño",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"HNL":["L"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    DG"!x do'] = ["es-DO!uR 'de' MMMM 'de' y","EEEE, ,h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a<DOP","RD$","peso dominicanODOP":["RD$","$4P"US$"AZ-mediodía","día","mañana","tarde","noche"],Q],[["m.)5&	mNߺxj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-ea'] = ["es-EA",[["a. m.","p. m."],u,u],u,[["D","L","M","X","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],u,[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1}, {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EGP":[],"ESP":["₧"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"THB":["฿"],"TWD":[u,"NT$"],"USD":["US$","$"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    4kUx	x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-ec'] = ["es-EC",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00;¤-#,##0.00","#E0"],"USD","$","dólar estadounidense",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    Xuxj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-ic'] = ["es-IC",[["a. m.","p. m."],u,u],u,[["D","L","M","X","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],u,[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1}, {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EGP":[],"ESP":["₧"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"THB":["฿"],"TWD":[u,"NT$"],"USD":["US$","$"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    kax$/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-mx'] = ["es-MX",[["a. m.","p. m."],u,u],u,[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],u,[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["dd/MM/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"MXN","$","peso mexicano",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"p."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MRO":["MRU"],"MRU":["UM"],"MXN":["$"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","mañana","de la tarde","de la noche"],["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    gx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-pa'] = ["es-PA",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["MM/dd/yy","MM/dd/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"PAB","B/.","balboa panameño",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PAB":["B/."],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],["mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    j|Yx
k/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-pe'] = ["es-PE",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","set.","oct.","nov.","dic."],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["Ene.","Feb.","Mar.","Abr.","May.","Jun.","Jul.","Ago.","Set.","Oct.","Nov.","Dic."],["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Setiembre","Octubre","Noviembre","Diciembre"]],[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/MM/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00","#E0"],"PEN","S/","sol peruano",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PEN":["S/"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    Rxi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-ph'] = ["es-PH",[["a. m.","p. m."],u,u],u,[["D","L","M","X","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],u,[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"PHP","₱","peso filipino",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EGP":[],"ESP":["₧"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"RON":[u,"L"],"THB":["฿"],"TWD":[u,"NT$"],"USD":["US$","$"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    Dkޱx	~/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-pr'] = ["es-PR",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["MM/dd/yy","MM/dd/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"USD","$","dólar estadounidense",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    Pѳx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-py'] = ["es-PY",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["do","lu","ma","mi","ju","vi","sa"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["Do","Lu","Ma","Mi","Ju","Vi","Sa"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00;¤ -#,##0.00","#E0"],"PYG","Gs.","guaraní paraguayo",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"PYG":["Gs.","₲"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["m.","madrugada","mañana","tarde","noche"],["mediodía","madrugada","mañana","tarde","noche"],u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    8?x{	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-sv'] = ["es-SV",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"USD","$","dólar estadounidense",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    ܾxV/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-us'] = ["es-US",[["a. m.","p. m."],u,u],u,[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],u,[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/M/y","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00","#E0"],"USD","$","dólar estadounidense",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"NT$"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    @rhx
[/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-uy'] = ["es-UY",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","set.","oct.","nov.","dic."],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","setiembre","octubre","noviembre","diciembre"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["Ene.","Feb.","Mar.","Abr.","May.","Jun.","Jul.","Ago.","Set.","Oct.","Nov.","Dic."],["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Setiembre","Octubre","Noviembre","Diciembre"]],[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00","#E0"],"UYU","$","peso uruguayo",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":["US$","$"],"UYU":["$"],"UYW":["UP"],"VEF":[u,"BsF"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    q9x	#/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es-ve'] = ["es-VE",[["a. m.","p. m."],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["Do","Lu","Ma","Mi","Ju","Vi","Sa"]],[["D","L","M","M","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["Do","Lu","Ma","Mi","Ju","Vi","Sa"]],[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],0,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}","{1} {0}","{1}, {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00;¤-#,##0.00","#E0"],"VES","Bs.S","bolívar soberano",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"ESP":["₧"],"EUR":[u,"€"],"FKP":[u,"FK£"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SSP":[u,"SD£"],"SYP":[u,"S£"],"TWD":[u,"NT$"],"USD":[u,"$"],"VEF":["Bs."],"VES":["Bs.S"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["m.","madrugada","mañana","tarde","noche"],["mediodía","madrugada","mañana","tarde","noche"],u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    QԴxd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (n === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['es'] = ["es",[["a. m.","p. m."],u,u],u,[["D","L","M","X","J","V","S"],["dom","lun","mar","mié","jue","vie","sáb"],["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],["DO","LU","MA","MI","JU","VI","SA"]],u,[["E","F","M","A","M","J","J","A","S","O","N","D"],["ene","feb","mar","abr","may","jun","jul","ago","sept","oct","nov","dic"],["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]],u,[["a. C.","d. C."],u,["antes de Cristo","después de Cristo"]],1,[6,0],["d/M/yy","d MMM y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss (zzzz)"],["{1}, {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EGP":[],"ESP":["₧"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"THB":["฿"],"TWD":[u,"NT$"],"USD":["US$","$"],"XAF":[],"XCD":[u,"$"],"XOF":[]},"ltr", plural, [[["del mediodía","de la madrugada","de la mañana","de la tarde","de la noche"],u,u],[["mediodía","madrugada","mañana","tarde","noche"],u,u],["12:00",["00:00","06:00"],["06:00","12:00"],["12:00","20:00"],["20:00","24:00"]]]];
  })(globalThis);
    ijxX/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['et'] = ["et",[["AM","PM"],u,u],u,[["P","E","T","K","N","R","L"],u,["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],["P","E","T","K","N","R","L"]],u,[["J","V","M","A","M","J","J","A","S","O","N","D"],["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets"],["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"]],u,[["eKr","pKr"],u,["enne Kristust","pärast Kristust"]],1,[6,0],["dd.MM.yy","d. MMM y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","×10^","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":["AU$","$"],"EEK":["kr"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["keskööl","keskpäeval","hommikul","pärastlõunal","õhtul","öösel"],u,u],[["kesköö","keskpäev","hommik","pärastlõuna","õhtu","öö"],u,u],["00:00","12:00",["05:00","12:00"],["12:00","18:00"],["18:00","23:00"],["23:00","05:00"]]]];
  })(globalThis);
    IPx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['eu'] = ["eu",[["g","a"],["AM","PM"],u],[["AM","PM"],u,u],[["I","A","A","A","O","O","L"],["ig.","al.","ar.","az.","og.","or.","lr."],["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],["ig.","al.","ar.","az.","og.","or.","lr."]],u,[["U","O","M","A","M","E","U","A","I","U","A","A"],["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],["urtarrilak","otsailak","martxoak","apirilak","maiatzak","ekainak","uztailak","abuztuak","irailak","urriak","azaroak","abenduak"]],[["U","O","M","A","M","E","U","A","I","U","A","A"],["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"]],[["a","o"],["K.a.","K.o."],["K.a.","Kristo ondoren"]],1,[6,0],["yy/M/d","y('e')'ko' MMM d('a')","y('e')'ko' MMMM'ren' d('a')","y('e')'ko' MMMM'ren' d('a'), EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss (z)","HH:mm:ss (zzzz)"],["{1} {0}",u,u,u],[",",".",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","% #,##0","#,##0.00 ¤","#E0"],"EUR","€","euroa",{"BYN":[u,"р."],"ESP":["₧"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["gauerdia","goizald.","goizeko","eguerd.","arrats.","iluntz.","gaueko"],u,["gauerdia","goizaldeko","goizeko","eguerdiko","arratsaldeko","iluntzeko","gaueko"]],[["gauerdia","goizald.","goiza","eguerd.","arrats.","iluntz.","gaua"],["gauerdia","goiz.","goiza","eguerd.","arrats.","iluntz.","gaua"],["gauerdia","goizaldea","goiza","eguerdia","arratsaldea","iluntzea","gaua"]],["00:00",["00:00","06:00"],["06:00","12:00"],["12:00","14:00"],["14:00","19:00"],["19:00","21:00"],["21:00","24:00"]]]];
  })(globalThis);
    9CB_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ewo'] = ["ewo",[["kíkíríg","ngəgógəle"],u,u],u,[["s","m","s","s","s","f","s"],["sɔ́n","mɔ́n","smb","sml","smn","fúl","sér"],["sɔ́ndɔ","mɔ́ndi","sɔ́ndɔ məlú mə́bɛ̌","sɔ́ndɔ məlú mə́lɛ́","sɔ́ndɔ məlú mə́nyi","fúladé","séradé"],["sɔ́n","mɔ́n","smb","sml","smn","fúl","sér"]],u,[["o","b","l","n","t","s","z","m","e","a","d","b"],["ngo","ngb","ngl","ngn","ngt","ngs","ngz","ngm","nge","nga","ngad","ngab"],["ngɔn osú","ngɔn bɛ̌","ngɔn lála","ngɔn nyina","ngɔn tána","ngɔn saməna","ngɔn zamgbála","ngɔn mwom","ngɔn ebulú","ngɔn awóm","ngɔn awóm ai dziá","ngɔn awóm ai bɛ̌"]],u,[["oyk","ayk"],u,["osúsúa Yésus kiri","ámvus Yésus Kirís"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XAF","FCFA","Fəláŋ CFA (BEAC)",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    nڱxa	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['fa-af'] = ["fa-AF",[["ق","ب"],["ق.ظ.","ب.ظ."],["قبل‌ازظهر","بعدازظهر"]],u,[["ی","د","س","چ","پ","ج","ش"],["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],u,["۱ش","۲ش","۳ش","۴ش","۵ش","ج","ش"]],u,[["ج","ف","م","ا","م","ج","ج","ا","س","ا","ن","د"],["جنو","فبروری","مارچ","اپریل","می","جون","جول","اگست","سپتمبر","اکتوبر","نومبر","دسم"],["جنوری","فبروری","مارچ","اپریل","می","جون","جولای","اگست","سپتمبر","اکتوبر","نومبر","دسمبر"]],[["ج","ف","م","ا","م","ج","ج","ا","س","ا","ن","د"],["جنوری","فبروری","مارچ","اپریل","می","جون","جولای","اگست","سپتمبر","اکتوبر","نومبر","دسمبر"],u],[["ق","م"],["ق.م.","م."],["قبل از میلاد","میلادی"]],6,[4,5],["y/M/d","d MMM y","d MMMM y","EEEE d MMMM y"],["H:mm","H:mm:ss","H:mm:ss (z)","H:mm:ss (zzzz)"],["{1}،‏ {0}",u,"{1}، ساعت {0}",u],[".",",",";","%","‎+","‎−","E","×","‰","∞","ناعدد",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"AFN","؋","افغانی افغانستان",{"AFN":["؋"],"BYN":[u,"р."],"CAD":["$CA","$"],"CNY":["¥CN","¥"],"HKD":["$HK","$"],"IRR":["ریال"],"MXN":["$MX","$"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"THB":["฿"],"XCD":["$EC","$"],"XOF":["فرانک CFA"]},"rtl", plural, [[["ب","ص","ظ","ع","ش","ن"],["بامداد","صبح","ظهر","بعدازچاشت","شب","نیمه‌شب"],u],[["ب","ص","بعد از چاشت","ع","ش","ن"],["بامداد","صبح","ظهر","بعدازچاشت","شب","نیمه‌شب"],u],[["01:00","04:00"],["04:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","01:00"]]]];
  })(globalThis);
    ;觻x	d/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['fa'] = ["fa",[["ق","ب"],["ق.ظ.","ب.ظ."],["قبل‌ازظهر","بعدازظهر"]],u,[["ی","د","س","چ","پ","ج","ش"],["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],u,["۱ش","۲ش","۳ش","۴ش","۵ش","ج","ش"]],u,[["ژ","ف","م","آ","م","ژ","ژ","ا","س","ا","ن","د"],["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],["ژانویهٔ","فوریهٔ","مارس","آوریل","مهٔ","ژوئن","ژوئیهٔ","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"]],[["ژ","ف","م","آ","م","ژ","ژ","ا","س","ا","ن","د"],["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],u],[["ق","م"],["ق.م.","م."],["قبل از میلاد","میلادی"]],6,[5,5],["y/M/d","d MMM y","d MMMM y","EEEE d MMMM y"],["H:mm","H:mm:ss","H:mm:ss (z)","H:mm:ss (zzzz)"],["{1}،‏ {0}",u,"{1}، ساعت {0}",u],[".",",",";","%","‎+","‎−","E","×","‰","∞","ناعدد",":"],["#,##0.###","#,##0%","‎¤ #,##0.00","#E0"],"IRR","ریال","ریال ایران",{"AFN":["؋"],"BYN":[u,"р."],"CAD":["$CA","$"],"CNY":["¥CN","¥"],"HKD":["$HK","$"],"IRR":["ریال"],"MXN":["$MX","$"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"THB":["฿"],"XCD":["$EC","$"],"XOF":["فرانک CFA"]},"rtl", plural, [[["ب","ص","ظ","ع","ش","ن"],["بامداد","صبح","ظهر","عصر","شب","نیمه‌شب"],["بامداد","صبح","بعدازظهر","عصر","شب","نیمه‌شب"]],[["ب","ص","ظ","ع","ش","ن"],["بامداد","صبح","ظهر","عصر","شب","نیمه‌شب"],u],[["01:00","04:00"],["04:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","01:00"]]]];
  })(globalThis);
    
x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-bf'] = ["ff-Adlm-BF",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XOF","𞤅𞤊𞤀","𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    8Ƿx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-cm'] = ["ff-Adlm-CM",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XAF","𞤊𞤅𞤊𞤀","𞤊𞤢𞤪𞤢𞤲 𞤚𞤵𞤦𞤮𞥅𞤪𞤭 𞤀𞤬𞤪𞤭𞤳𞤭𞤲𞤳𞤮",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    2 {x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-gh'] = ["ff-Adlm-GH",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"GHS","GH₵","𞤅𞤭𞤣𞤭 𞤘𞤢𞤲𞤢𞤲𞤳𞤮",{"BYN":[u,"р."],"GHS":["GH₵"],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    KlFx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-gm'] = ["ff-Adlm-GM",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"GMD","D","𞤁𞤢𞤤𞤢𞤧𞤭 𞤘𞤢𞤥𞤦𞤭𞤲𞤳𞤮",{"BYN":[u,"р."],"GMD":["D"],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    o鰱x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-gw'] = ["ff-Adlm-GW",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XOF","𞤅𞤊𞤀","𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    ̄x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-lr'] = ["ff-Adlm-LR",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"LRD","$","𞤁𞤢𞤤𞤢 𞤂𞤭𞤦𞤫𞤪𞤭𞤴𞤢𞤲𞤳𞤮",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"LRD":["$"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    jrx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-mr'] = ["ff-Adlm-MR",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MRU","UM","𞤓𞤺𞤭𞤴𞤢 𞤃𞤮𞤪𞤭𞤼𞤢𞤲𞤭𞤴𞤢𞤲𞤳𞤮",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"MRU":["UM"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    |x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-ne'] = ["ff-Adlm-NE",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XOF","𞤅𞤊𞤀","𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    Տݶx
)/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-ng'] = ["ff-Adlm-NG",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"NGN","₦","𞤐𞤢𞤴𞤪𞤢 𞤐𞤢𞤶𞤭𞤪𞤢𞤴𞤢𞤲𞤳𞤮",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    jx

/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-sl'] = ["ff-Adlm-SL",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"SLL","Le","𞤂𞤫𞤴𞤮𞤲 𞤅𞤫𞤪𞤢𞤤𞤭𞤴𞤢𞤲𞤳𞤮",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"SLL":["Le"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    *vذx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm-sn'] = ["ff-Adlm-SN",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XOF","𞤅𞤊𞤀","𞤊𞤢𞤪𞤢𞤲 𞤅𞤊𞤀 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢",{"BYN":[u,"р."],"GNF":[u,"𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    x
./**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ff-adlm'] = ["ff-Adlm",[["𞤢","𞤩"],["𞤀𞤎","𞤇𞤎"],u],[["𞤀𞤎","𞤇𞤎"],u,u],[["𞤈","𞤀𞥄","𞤃","𞤔","𞤐","𞤃","𞤖"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"],["𞤈𞤫𞤬𞤦𞤭𞤪𞥆𞤫","𞤀𞥄𞤩𞤵𞤲𞥋𞤣𞤫","𞤃𞤢𞤱𞤦𞤢𞥄𞤪𞤫","𞤐𞤶𞤫𞤧𞤤𞤢𞥄𞤪𞤫","𞤐𞤢𞥄𞤧𞤢𞥄𞤲𞤣𞤫","𞤃𞤢𞤱𞤲𞤣𞤫","𞤖𞤮𞤪𞤦𞤭𞤪𞥆𞤫"],["𞤈𞤫𞤬","𞤀𞥄𞤩𞤵","𞤃𞤢𞤦","𞤔𞤫𞤧","𞤐𞤢𞥄𞤧","𞤃𞤢𞤣","𞤖𞤮𞤪"]],u,[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"],u],[["𞤅","𞤕","𞤄","𞤅","𞤁","𞤑","𞤃","𞤔","𞤅","𞤒","𞤔","𞤄"],["𞤅𞤭𞥅𞤤","𞤕𞤮𞤤","𞤐𞤦𞤮𞥅𞤴","𞤅𞤫𞥅𞤼","𞤁𞤵𞥅𞤶","𞤑𞤮𞤪","𞤃𞤮𞤪","𞤔𞤵𞤳","𞤅𞤭𞤤","𞤒𞤢𞤪","𞤔𞤮𞤤","𞤄𞤮𞤱"],["𞤅𞤭𞥅𞤤𞤮","𞤕𞤮𞤤𞤼𞤮","𞤐𞤦𞤮𞥅𞤴𞤮","𞤅𞤫𞥅𞤼𞤮","𞤁𞤵𞥅𞤶𞤮","𞤑𞤮𞤪𞤧𞤮","𞤃𞤮𞤪𞤧𞤮","𞤔𞤵𞤳𞤮","𞤅𞤭𞤤𞤼𞤮","𞤒𞤢𞤪𞤳𞤮","𞤔𞤮𞤤𞤮","𞤄𞤮𞤱𞤼𞤮"]],[["𞤀𞤀𞤋","𞤇𞤀𞤋"],u,["𞤀𞤣𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄","𞤇𞤢𞥄𞤱𞤮 𞤀𞤲𞥆𞤢𞤦𞤭 𞤋𞥅𞤧𞤢𞥄"]],1,[6,0],["d-M-y","d MMM⹁ y","d MMMM⹁ y","EEEE d MMMM⹁ y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 𞤉 {0}",u],[".","⹁",";","%","+","-","E","×","‰","∞","𞤏𞤮𞤈",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"GNF","FG","𞤊𞤢𞤪𞤢𞤲 𞤘𞤭𞤲𞤫𞤲𞤳𞤮",{"BYN":[u,"р."],"GNF":["FG","𞤊𞤘"],"JPY":["JP¥","¥"],"NGN":["𞤐𞤐𞤘","₦"],"PGK":["𞤑𞤆𞤘"],"PHP":["𞤆𞤆𞤖","₱"],"USD":["US$","$"],"XAF":["𞤊𞤅𞤊𞤀"],"XOF":["𞤅𞤊𞤀"]},"rtl", plural, []];
  })(globalThis);
    e"Xxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-bf'] = ["ff-Latn-BF",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XOF","F CFA","Mbuuɗu Seefaa BCEAO",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    "Xxw/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-cm'] = ["ff-Latn-CM",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XAF","FCFA","Mbuuɗi Seefaa BEAC",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
     ^Xxr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-gh'] = ["ff-Latn-GH",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"GHS","GH₵","GHS",{"GHS":["GH₵"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    TXxp/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-gm'] = ["ff-Latn-GM",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"GMD","D","Dalasi Gammbi",{"GMD":["D"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    Xx|/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-gn'] = ["ff-Latn-GN",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"GNF","FG","GNF",{"GNF":["FG"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    0Xxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-gw'] = ["ff-Latn-GW",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XOF","F CFA","Mbuuɗu Seefaa BCEAO",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    )3Yxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-lr'] = ["ff-Latn-LR",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"LRD","$","Dolaar Liberiyaa",{"JPY":["JP¥","¥"],"LRD":["$"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    |Yxl/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-mr'] = ["ff-Latn-MR",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"MRU","UM","Ugiyya Muritani",{"JPY":["JP¥","¥"],"MRU":["UM"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ՗Xxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-ne'] = ["ff-Latn-NE",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XOF","F CFA","Mbuuɗu Seefaa BCEAO",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    4Yxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-ng'] = ["ff-Latn-NG",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"NGN","₦","Nayraa Nijeriyaa",{"JPY":["JP¥","¥"],"NGN":["₦"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    P0^Yxi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff-latn-sl'] = ["ff-Latn-SL",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"SLL","Le","Lewoon Seraa Liyon",{"JPY":["JP¥","¥"],"SLL":["Le"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ǳUxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['shi-latn'] = ["shi-Latn",[["tifawt","tadggʷat"],u,u],u,[["S","M","T","W","T","F","S"],["asa","ayn","asi","akṛ","akw","asim","asiḍ"],["asamas","aynas","asinas","akṛas","akwas","asimwas","asiḍyas"],["asa","ayn","asi","akṛ","akw","asim","asiḍ"]],u,[["i","b","m","i","m","y","y","ɣ","c","k","n","d"],["inn","bṛa","maṛ","ibr","may","yun","yul","ɣuc","cut","ktu","nuw","duj"],["innayr","bṛayṛ","maṛṣ","ibrir","mayyu","yunyu","yulyuz","ɣuct","cutanbir","ktubr","nuwanbir","dujanbir"]],u,[["daɛ","dfɛ"],u,["dat n ɛisa","dffir n ɛisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"MAD","MAD","adrim n lmɣrib",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    d\)`xa
G, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;+ff-latn'] = ["ff-Latn",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal I1¤","#E0"],"XOF","F CFA","Mbuuɗu Seefaa BCEAOTˀx
#vai-latn'] = ["vai-Latn",[["AM","PM+lahadi","tɛɛnɛɛ","talata","alaba","aimisa","aijima","siɓiti"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["M01","M02","M03","M04","M05","M06","M07","M08","M09","M10","M11","M12"],u],u,[["BCE","CE"],u,u],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-",7+¤#,##0.00","#E0"],"LRD","$","Laibhiya DalaLRD":["$@IăWx|/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ff'] = ["ff",[["subaka","kikiiɗe"],u,u],u,[["d","a","m","n","n","m","h"],["dew","aaɓ","maw","nje","naa","mwd","hbi"],["dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir"],["dew","aaɓ","maw","nje","naa","mwd","hbi"]],u,[["s","c","m","s","d","k","m","j","s","y","j","b"],["sii","col","mbo","see","duu","kor","mor","juk","slt","yar","jol","bow"],["siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte"]],u,[["H-I","C-I"],u,["Hade Iisa","Caggal Iisa"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XOF","F CFA","Mbuuɗu Seefaa BCEAO",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ŰxP/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['fi'] = ["fi",[["ap.","ip."],u,u],u,[["S","M","T","K","T","P","L"],["su","ma","ti","ke","to","pe","la"],["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"],["su","ma","ti","ke","to","pe","la"]],[["S","M","T","K","T","P","L"],["su","ma","ti","ke","to","pe","la"],["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],["su","ma","ti","ke","to","pe","la"]],[["T","H","M","H","T","K","H","E","S","L","M","J"],["tammik.","helmik.","maalisk.","huhtik.","toukok.","kesäk.","heinäk.","elok.","syysk.","lokak.","marrask.","jouluk."],["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"]],[["T","H","M","H","T","K","H","E","S","L","M","J"],["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"]],[["eKr","jKr"],["eKr.","jKr."],["ennen Kristuksen syntymää","jälkeen Kristuksen syntymän"]],1,[6,0],["d.M.y",u,"d. MMMM y","cccc d. MMMM y"],["H.mm","H.mm.ss","H.mm.ss z","H.mm.ss zzzz"],["{1} {0}","{1} 'klo' {0}",u,u],[","," ",";","%","+","−","E","×","‰","∞","epäluku","."],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AOA":[],"ARS":[],"AUD":[],"BAM":[],"BBD":[],"BDT":[],"BMD":[],"BND":[],"BOB":[],"BRL":[],"BSD":[],"BWP":[],"BZD":[],"CAD":[],"CLP":[],"CNY":[],"COP":[],"CRC":[],"CUC":[],"CUP":[],"CZK":[],"DKK":[],"DOP":[],"EGP":[],"ESP":[],"FIM":["mk"],"FJD":[],"FKP":[],"GEL":[],"GIP":[],"GNF":[],"GTQ":[],"GYD":[],"HKD":[],"HNL":[],"HRK":[],"HUF":[],"IDR":[],"ILS":[],"INR":[],"ISK":[],"JMD":[],"KHR":[],"KMF":[],"KPW":[],"KRW":[],"KYD":[],"KZT":[],"LAK":[],"LBP":[],"LKR":[],"LRD":[],"LTL":[],"LVL":[],"MGA":[],"MMK":[],"MNT":[],"MUR":[],"MXN":[],"MYR":[],"NAD":[],"NGN":[],"NIO":[],"NOK":[],"NPR":[],"NZD":[],"PHP":[],"PKR":[],"PLN":[],"PYG":[],"RON":[],"RWF":[],"SBD":[],"SEK":[],"SGD":[],"SHP":[],"SRD":[],"SSP":[],"STN":[u,"STD"],"SYP":[],"THB":[],"TOP":[],"TRY":[],"TTD":[],"TWD":[],"UAH":[],"UYU":[],"VEF":[],"VND":[],"XCD":[],"XPF":[],"XXX":[],"ZAR":[],"ZMW":[]},"ltr", plural, [[["ky.","kp.","aamulla","ap.","ip.","illalla","yöllä"],["keskiyöllä","keskip.","aamulla","aamup.","iltap.","illalla","yöllä"],["keskiyöllä","keskipäivällä","aamulla","aamupäivällä","iltapäivällä","illalla","yöllä"]],[["ky.","kp.","aamu","ap.","ip.","ilta","yö"],["keskiyö","keskip.","aamu","aamup.","iltap.","ilta","yö"],["keskiyö","keskipäivä","aamu","aamupäivä","iltapäivä","ilta","yö"]],["00:00","12:00",["05:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","23:00"],["23:00","05:00"]]]];
  })(globalThis);
    SPYx	s/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i === 1 || (i === 2 || i === 3)) || (v === 0 && !(i % 10 === 4 || (i % 10 === 6 || i % 10 === 9)) || !(v === 0) && !(f % 10 === 4 || (f % 10 === 6 || f % 10 === 9))))
    return 1;
return 5;
}
    global.ng.common.locales['fil'] = ["fil",[["am","pm"],["AM","PM"],u],[["AM","PM"],u,u],[["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],u,["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],["Li","Lu","Ma","Mi","Hu","Bi","Sa"]],u,[["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],u,["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"]],[["E","P","M","A","M","Hun","Hul","Ago","Set","Okt","Nob","Dis"],["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"]],[["BC","AD"],u,["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'nang' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"PHP","₱","Piso ng Pilipinas",{"BYN":[u,"р."],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["hatinggabi","tanghaling-tapat","umaga","madaling-araw","sa hapon","sa gabi","gabi"],["hatinggabi","tanghaling-tapat","nang umaga","madaling-araw","tanghali","ng hapon","gabi"],["hatinggabi","tanghaling-tapat","nang umaga","madaling-araw","tanghali","ng hapon","ng gabi"]],[["hatinggabi","tanghaling-tapat","umaga","madaling-araw","tanghali","gabi","gabi"],["hatinggabi","tanghaling-tapat","umaga","madaling-araw","tanghali","hapon","gabi"],u],["00:00","12:00",["00:00","06:00"],["06:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","24:00"]]]];
  })(globalThis);
    Eۺxxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['fo-dk'] = ["fo-DK",[["AM","PM"],u,u],u,[["S","M","T","M","H","F","L"],["sun.","mán.","týs.","mik.","hós.","frí.","ley."],["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],["su.","má.","tý.","mi.","hó.","fr.","le."]],[["S","M","T","M","H","F","L"],["sun","mán","týs","mik","hós","frí","ley"],["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],["su","má","tý","mi","hó","fr","le"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"]],[["fKr","eKr"],["f.Kr.","e.Kr."],["fyri Krist","eftir Krist"]],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'kl'. {0}",u],[",",".",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"DKK","kr.","donsk króna",{"BYN":[u,"р."],"DKK":["kr.","kr"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    BDwx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['fo'] = ["fo",[["AM","PM"],u,u],u,[["S","M","T","M","H","F","L"],["sun.","mán.","týs.","mik.","hós.","frí.","ley."],["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],["su.","má.","tý.","mi.","hó.","fr.","le."]],[["S","M","T","M","H","F","L"],["sun","mán","týs","mik","hós","frí","ley"],["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],["su","má","tý","mi","hó","fr","le"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"]],[["fKr","eKr"],["f.Kr.","e.Kr."],["fyri Krist","eftir Krist"]],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'kl'. {0}",u],[",",".",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"DKK","kr","donsk króna",{"BYN":[u,"р."],"DKK":["kr"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    YA(x
T/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-be'] = ["fr-BE",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["d/MM/yy","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","H 'h' mm 'min' ss 's' zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    D)x
P/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-bf'] = ["fr-BF",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XOF","F CFA","franc CFA (BCEAO)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    Ƴ?=x6 nc'] = ["fr-NC
#PF","FCFP","franc CFPMbBx
8/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-re'] = ["fr-RE",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],["min.","midi","mat.","ap.m.","soir","nuit"],["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["min.","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    & UxZ bi'] = ["fr-BI
"BIF","FBu","franc burundais<6	IF":["FBum
	<N	*
cx
P/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-bj'] = ["fr-BJ",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XOF","F CFA","franc CFA (BCEAO)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    "Gx
a/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-bl'] = ["fr-BL",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    .?5xV
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-ca'] = ["fr-CA",[["a","p"],["a.m.","p.m."],u],[["a.m.","p.m."],u,u],[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juill.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],0,[6,0],["y-MM-dd","d MMM y","d MMMM y","EEEE d MMMM y"],["HH 'h' mm","HH 'h' mm 'min' ss 's'","HH 'h' mm 'min' ss 's' z","HH 'h' mm 'min' ss 's' zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"CAD","$","dollar canadien",{"AUD":["$ AU","$"],"BEF":["FB"],"BYN":[u,"Br"],"CAD":["$"],"CYP":["£CY"],"EGP":[u,"£E"],"FRF":["F"],"GEL":[],"HKD":["$ HK","$"],"IEP":["£IE"],"ILP":["£IL"],"ILS":[u,"₪"],"INR":[u,"₹"],"ITL":["₤IT"],"KRW":[u,"₩"],"LBP":[u,"£L"],"MTP":["£MT"],"MXN":[u,"$"],"NZD":["$ NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SGD":["$ SG","$"],"TOP":[u,"$T"],"TWD":[u,"NT$"],"USD":["$ US","$"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XOF":[],"XPF":[]},"ltr", plural, [[["minuit","midi","mat.","après-midi","soir","mat."],["minuit","midi","du mat.","après-midi","du soir","du mat."],["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","après-midi","soir","mat."],["minuit","midi","mat.","après-midi","soir","nuit"],["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    9x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-cd'] = ["fr-CD",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"CDF","FC","franc congolais",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CDF":["FC"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["min.","midi","mat.","ap.m.","soir","nuit"],["minuit","midi","mat.","ap.m.","soir","nuit"],["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["min.","midi","mat.","ap.m.","soir","nuit"],["minuit","midi","mat.","ap.m.","soir","nuit"],["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    h`x
T/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-cf'] = ["fr-CF",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XAF","FCFA","franc CFA (BEAC)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    $ӻx
D/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-sc'] = ["fr-SC",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"SCR","SR","roupie des Seychelles",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SCR":["SR"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    ~IxC cg'] = ["fr-CG
"XAF","FCFA","franc CFA (BEAC)LJ`.x6 gf'] = ["fr-GF
"EUR","€","euroLJӟrx
E/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-ch'] = ["fr-CH",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd.MM.yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH.mm:ss 'h' zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":","."],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"CHF","CHF","franc suisse",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["min.","midi","du mat.","de l’ap.m.","du soir","du mat."],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["min.","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    X,x
J/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-mg'] = ["fr-MG",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"MGA","Ar","ariary malgache",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MGA":["Ar"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    CxG ci'] = ["fr-CI
"!XOF","F CFA","franc CFA (BCEAO)F\x< pf'] = ["fr-PF
"XPF","FCFP","franc CFPF$4x
A/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-cm'] = ["fr-CM",[["mat.","soir"],u,["matin","soir"]],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XAF","FCFA","franc CFA (BEAC)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    4x
C/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-dj'] = ["fr-DJ",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],6,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"DJF","Fdj","franc djiboutien",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"DJF":["Fdj"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    oùx
F/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-dz'] = ["fr-DZ",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],6,[5,6],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"DZD","DA","dinar algérien",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"DZD":["DA"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    ex
T/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-ga'] = ["fr-GA",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XAF","FCFA","franc CFA (BEAC)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    Ѵx
K/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-gn'] = ["fr-GN",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"GNF","FG","franc guinéen",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"GNF":["FG"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    zBxF km'] = ["fr-KM
"KMF","CF","franc comoriC;Q"CF"x
a/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-gp'] = ["fr-GP",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    /Gx
T/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-gq'] = ["fr-GQ",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XAF","FCFA","franc CFA (BEAC)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    9xP sn'] = ["fr-SN
#OF","F CFA","franc CFA (BCEAOH.^	w.^	;
ַx
H/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-ht'] = ["fr-HT",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"HTG","G","gourde haïtienne",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"HTG":["G"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","de la nuit"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    ~ x
c/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-lu'] = ["fr-LU",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"LUF":["F"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    Zx
</**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-ma'] = ["fr-MA",[["AM","PM"],u,["a.m.","p.m."]],[["AM","PM"],u,u],[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fév.","mar.","avr.","mai","jui.","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"MAD","MAD","dirham marocain",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
     6x
a/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-mc'] = ["fr-MC",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    L9x
a/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-mf'] = ["fr-MF",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    zc?x
X/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-ml'] = ["fr-ML",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XOF","F CFA","franc CFA (BCEAO)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    8!x
a/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-mq'] = ["fr-MQ",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    !Ux
B/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-mr'] = ["fr-MR",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"MRU","UM","ouguiya mauritanien",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MRU":["UM"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    #x
G/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-mu'] = ["fr-MU",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"MUR","Rs","roupie mauricienne",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MUR":["Rs"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    Mx
P/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-ne'] = ["fr-NE",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XOF","F CFA","franc CFA (BCEAO)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    oUx
a/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-pm'] = ["fr-PM",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    Sx
U/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-rw'] = ["fr-RW",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"RWF","RF","franc rwandais",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":["RF","FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    d9%x
B/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-sy'] = ["fr-SY",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],6,[5,6],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"SYP","LS","livre syrienne",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"SYP":["LS","£"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    wx
P/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-td'] = ["fr-TD",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XAF","FCFA","franc CFA (BEAC)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    QUx
P/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-tg'] = ["fr-TG",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XOF","F CFA","franc CFA (BCEAO)",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    nex
G/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-tn'] = ["fr-TN",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"TND","DT","dinar tunisien",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TND":["DT"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
     Xx
G/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-vu'] = ["fr-VU",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"VUV","VT","vatu vanuatuan",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"VUV":["VT"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    _ Fxc yt'] = ["fr-YT
`(HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ssEUR","€","euroI	(x
[/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr-wf'] = ["fr-WF",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"XPF","FCFP","franc CFP",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    tx
g/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 0 || i === 1)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['fr'] = ["fr",[["AM","PM"],u,u],u,[["D","L","M","M","J","V","S"],["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],["di","lu","ma","me","je","ve","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]],u,[["av. J.-C.","ap. J.-C."],u,["avant Jésus-Christ","après Jésus-Christ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} 'à' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"ARS":["$AR","$"],"AUD":["$AU","$"],"BEF":["FB"],"BMD":["$BM","$"],"BND":["$BN","$"],"BYN":[u,"р."],"BZD":["$BZ","$"],"CAD":["$CA","$"],"CLP":["$CL","$"],"CNY":[u,"¥"],"COP":["$CO","$"],"CYP":["£CY"],"EGP":[u,"£E"],"FJD":["$FJ","$"],"FKP":["£FK","£"],"FRF":["F"],"GBP":["£GB","£"],"GIP":["£GI","£"],"HKD":[u,"$"],"IEP":["£IE"],"ILP":["£IL"],"ITL":["₤IT"],"JPY":[u,"¥"],"KMF":[u,"FC"],"LBP":["£LB","£L"],"MTP":["£MT"],"MXN":["$MX","$"],"NAD":["$NA","$"],"NIO":[u,"$C"],"NZD":["$NZ","$"],"PHP":[u,"₱"],"RHD":["$RH"],"RON":[u,"L"],"RWF":[u,"FR"],"SBD":["$SB","$"],"SGD":["$SG","$"],"SRD":["$SR","$"],"TOP":[u,"$T"],"TTD":["$TT","$"],"TWD":[u,"NT$"],"USD":["$US","$"],"UYU":["$UY","$"],"WST":["$WS"],"XCD":[u,"$"],"XPF":["FCFP"],"ZMW":[u,"Kw"]},"ltr", plural, [[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","du matin","de l’après-midi","du soir","du matin"]],[["minuit","midi","mat.","ap.m.","soir","nuit"],u,["minuit","midi","matin","après-midi","soir","nuit"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    Rx*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['fur'] = ["fur",[["a.","p."],u,u],u,[["D","L","M","M","J","V","S"],["dom","lun","mar","mie","joi","vin","sab"],["domenie","lunis","martars","miercus","joibe","vinars","sabide"],["dom","lun","mar","mie","joi","vin","sab"]],u,[["Z","F","M","A","M","J","L","A","S","O","N","D"],["Zen","Fev","Mar","Avr","Mai","Jug","Lui","Avo","Set","Otu","Nov","Dic"],["Zenâr","Fevrâr","Març","Avrîl","Mai","Jugn","Lui","Avost","Setembar","Otubar","Novembar","Dicembar"]],u,[["pdC","ddC"],u,u],1,[6,0],["dd/MM/yy","dd/MM/y","d 'di' MMMM 'dal' y","EEEE d 'di' MMMM 'dal' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"EUR","€","euro",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    g~ax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['fy'] = ["fy",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["si","mo","ti","wo","to","fr","so"],["snein","moandei","tiisdei","woansdei","tongersdei","freed","sneon"],["si","mo","ti","wo","to","fr","so"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mrt","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Des"],["Jannewaris","Febrewaris","Maart","April","Maaie","Juny","July","Augustus","Septimber","Oktober","Novimber","Desimber"]],u,[["f.K.","n.K."],["f.Kr.","n.Kr."],["Foar Kristus","nei Kristus"]],1,[6,0],["dd-MM-yy","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'om' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤ #,##0.00-","#E0"],"EUR","€","Euro",{"AUD":["AU$","$"],"CAD":["C$","$"],"FJD":["FJ$","$"],"JPY":["JP¥","¥"],"SBD":["SI$","$"],"THB":["฿"],"USD":["US$","$"],"XPF":[]},"ltr", plural, []];
  })(globalThis);
    eokdxE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n === Math.floor(n) && (n >= 3 && n <= 6))
    return 3;
if (n === Math.floor(n) && (n >= 7 && n <= 10))
    return 4;
return 5;
}
    global.ng.common.locales['ga-gb'] = ["ga-GB",[["r.n.","i.n."],u,u],u,[["D","L","M","C","D","A","S"],["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],["Do","Lu","Má","Cé","Dé","Ao","Sa"]],u,[["E","F","M","A","B","M","I","L","M","D","S","N"],["Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll"],["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"]],u,[["RC","AD"],u,["Roimh Chríost","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","Nuimh",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GBP","£","Punt Steirling",{"RUR":[u,"р."],"THB":["฿"],"TWD":["NT$"],"XXX":[]},"ltr", plural, []];
  })(globalThis);
    s5cx6/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
if (n === Math.floor(n) && (n >= 3 && n <= 6))
    return 3;
if (n === Math.floor(n) && (n >= 7 && n <= 10))
    return 4;
return 5;
}
    global.ng.common.locales['ga'] = ["ga",[["r.n.","i.n."],u,u],u,[["D","L","M","C","D","A","S"],["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],["Do","Lu","Má","Cé","Dé","Ao","Sa"]],u,[["E","F","M","A","B","M","I","L","M","D","S","N"],["Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll"],["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"]],u,[["RC","AD"],u,["Roimh Chríost","Anno Domini"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","Nuimh",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"EUR","€","Euro",{"RUR":[u,"р."],"THB":["฿"],"TWD":["NT$"],"XXX":[]},"ltr", plural, []];
  })(globalThis);
    j~x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1 || n === 11)
    return 1;
if (n === 2 || n === 12)
    return 2;
if (n === Math.floor(n) && (n >= 3 && n <= 10 || n >= 13 && n <= 19))
    return 3;
return 5;
}
    global.ng.common.locales['gd'] = ["gd",[["m","f"],u,u],u,[["D","L","M","C","A","H","S"],["DiD","DiL","DiM","DiC","Dia","Dih","DiS"],["DiDòmhnaich","DiLuain","DiMàirt","DiCiadain","DiarDaoin","DihAoine","DiSathairne"],["Dò","Lu","Mà","Ci","Da","hA","Sa"]],u,[["F","G","M","G","C","Ò","I","L","S","D","S","D"],["Faoi","Gearr","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùna","Sult","Dàmh","Samh","Dùbh"],["dhen Fhaoilleach","dhen Ghearran","dhen Mhàrt","dhen Ghiblean","dhen Chèitean","dhen Ògmhios","dhen Iuchar","dhen Lùnastal","dhen t-Sultain","dhen Dàmhair","dhen t-Samhain","dhen Dùbhlachd"]],[["F","G","M","G","C","Ò","I","L","S","D","S","D"],["Faoi","Gearr","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùna","Sult","Dàmh","Samh","Dùbh"],["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd"]],[["R","A"],["RC","AD"],["Ro Chrìosta","An dèidh Chrìosta"]],1,[6,0],["dd/MM/y","d MMM y","d'mh' MMMM y","EEEE, d'mh' MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GBP","£","Punnd Sasannach",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"leu"],"RUR":[u,"р."],"THB":["฿"],"TWD":["NT$"],"XXX":[]},"ltr", plural, []];
  })(globalThis);
    Zʻx+	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['gl'] = ["gl",[["a.m.","p.m."],u,u],u,[["d.","l.","m.","m.","x.","v.","s."],["dom.","luns","mar.","mér.","xov.","ven.","sáb."],["domingo","luns","martes","mércores","xoves","venres","sábado"],["do.","lu.","ma.","mé.","xo.","ve.","sá."]],[["D","L","M","M","X","V","S"],["Dom.","Luns","Mar.","Mér.","Xov.","Ven.","Sáb."],["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],["Do","Lu","Ma","Mé","Xo","Ve","Sá"]],[["x.","f.","m.","a.","m.","x.","x.","a.","s.","o.","n.","d."],["xan.","feb.","mar.","abr.","maio","xuño","xul.","ago.","set.","out.","nov.","dec."],["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro"]],[["X","F","M","A","M","X","X","A","S","O","N","D"],["Xan.","Feb.","Mar.","Abr.","Maio","Xuño","Xul.","Ago.","Set.","Out.","Nov.","Dec."],["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"]],[["a.C.","d.C."],u,["antes de Cristo","despois de Cristo"]],1,[6,0],["dd/MM/yy","d 'de' MMM 'de' y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{0}, {1}",u,"{0} 'do' {1}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"BYN":[u,"Br"],"ESP":["₧"],"JPY":["JP¥","¥"],"KMF":[u,"FC"],"MXN":["$MX","$"],"PHP":[u,"₱"],"RUB":[u,"руб"],"THB":["฿"],"TWD":["NT$"],"XCD":[u,"$"]},"ltr", plural, [[["da noite","da madrugada","da mañá","do mediodía","da tarde","da noite"],u,u],[["medianoite","madrugada","mañá","mediodía","tarde","noite"],u,u],["00:00",["00:00","06:00"],["06:00","12:00"],["12:00","13:00"],["13:00","21:00"],["21:00","24:00"]]]];
  })(globalThis);
    W׭jxP/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['gsw-fr'] = ["gsw-FR",[["vorm.","nam."],u,["am Vormittag","am Namittag"]],[["vorm.","nam."],u,["Vormittag","Namittag"]],[["S","M","D","M","D","F","S"],["Su.","Mä.","Zi.","Mi.","Du.","Fr.","Sa."],["Sunntig","Määntig","Ziischtig","Mittwuch","Dunschtig","Friitig","Samschtig"],["Su.","Mä.","Zi.","Mi.","Du.","Fr.","Sa."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","März","April","Mai","Juni","Juli","Auguscht","Septämber","Oktoober","Novämber","Dezämber"]],u,[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".","’",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euro",{"ATS":["öS"]},"ltr", plural, [[["Mitternacht","am Morge","zmittag","am Namittag","zaabig","znacht"],u,u],[["Mitternacht","am Morge","zmittag","am Namittag","zaabig","znacht"],u,["Mitternacht","Morge","Mittag","Namittag","Aabig","Nacht"]],["00:00",["05:00","12:00"],["12:00","14:00"],["14:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    ^SkxD/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['gsw-li'] = ["gsw-LI",[["vorm.","nam."],u,["am Vormittag","am Namittag"]],[["vorm.","nam."],u,["Vormittag","Namittag"]],[["S","M","D","M","D","F","S"],["Su.","Mä.","Zi.","Mi.","Du.","Fr.","Sa."],["Sunntig","Määntig","Ziischtig","Mittwuch","Dunschtig","Friitig","Samschtig"],["Su.","Mä.","Zi.","Mi.","Du.","Fr.","Sa."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","März","April","Mai","Juni","Juli","Auguscht","Septämber","Oktoober","Novämber","Dezämber"]],u,[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".","’",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"CHF","CHF","Schwiizer Franke",{"ATS":["öS"]},"ltr", plural, [[["Mitternacht","am Morge","zmittag","am Namittag","zaabig","znacht"],u,u],[["Mitternacht","am Morge","zmittag","am Namittag","zaabig","znacht"],u,["Mitternacht","Morge","Mittag","Namittag","Aabig","Nacht"]],["00:00",["05:00","12:00"],["12:00","14:00"],["14:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    {kxJ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['gsw'] = ["gsw",[["vorm.","nam."],u,["am Vormittag","am Namittag"]],[["vorm.","nam."],u,["Vormittag","Namittag"]],[["S","M","D","M","D","F","S"],["Su.","Mä.","Zi.","Mi.","Du.","Fr.","Sa."],["Sunntig","Määntig","Ziischtig","Mittwuch","Dunschtig","Friitig","Samschtig"],["Su.","Mä.","Zi.","Mi.","Du.","Fr.","Sa."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","März","April","Mai","Juni","Juli","Auguscht","Septämber","Oktoober","Novämber","Dezämber"]],u,[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","dd.MM.y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".","’",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"CHF","CHF","Schwiizer Franke",{"ATS":["öS"]},"ltr", plural, [[["Mitternacht","am Morge","zmittag","am Namittag","zaabig","znacht"],u,u],[["Mitternacht","am Morge","zmittag","am Namittag","zaabig","znacht"],u,["Mitternacht","Morge","Mittag","Namittag","Aabig","Nacht"]],["00:00",["05:00","12:00"],["12:00","14:00"],["14:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    spTx]
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['gu'] = ["gu",[["AM","PM"],u,u],u,[["ર","સો","મં","બુ","ગુ","શુ","શ"],["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],["ર","સો","મં","બુ","ગુ","શુ","શ"]],u,[["જા","ફે","મા","એ","મે","જૂ","જુ","ઑ","સ","ઑ","ન","ડિ"],["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"],["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"]],u,[["ઇ સ પુ","ઇસ"],["ઈ.સ.પૂર્વે","ઈ.સ."],["ઈસવીસન પૂર્વે","ઇસવીસન"]],0,[0,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["hh:mm a","hh:mm:ss a","hh:mm:ss a z","hh:mm:ss a zzzz"],["{1} {0}",u,"{1} એ {0} વાગ્યે",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤#,##,##0.00","[#E0]"],"INR","₹","ભારતીય રૂપિયા",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"MUR":[u,"રૂ."],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["મ.રાત્રિ","સવારે","બપોરે","સાંજે","રાત્રે"],["મધ્યરાત્રિ","સવારે","બપોરે","સાંજે","રાત્રે"],u],[["મધ્યરાત્રિ","સવારે","બપોરે","સાંજે","રાત્રે"],u,["મધ્યરાત્રિ","સવાર","બપોર","સાંજ","રાત્રિ"]],["00:00",["04:00","12:00"],["12:00","16:00"],["16:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    $?Vxd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['guz'] = ["guz",[["Ma","Mo"],u,["Mambia","Mog"]],[["Ma","Mo"],u,u],[["C","C","C","C","A","I","E"],["Cpr","Ctt","Cmn","Cmt","Ars","Icm","Est"],["Chumapiri","Chumatato","Chumaine","Chumatano","Aramisi","Ichuma","Esabato"],["Cpr","Ctt","Cmn","Cmt","Ars","Icm","Est"]],u,[["C","F","M","A","M","J","C","A","S","O","N","D"],["Can","Feb","Mac","Apr","Mei","Jun","Cul","Agt","Sep","Okt","Nob","Dis"],["Chanuari","Feburari","Machi","Apiriri","Mei","Juni","Chulai","Agosti","Septemba","Okitoba","Nobemba","Disemba"]],u,[["YA","YK"],u,["Yeso ataiborwa","Yeso kaiboirwe"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Shilingi ya Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    }#qx=

luy'] = ["luy",[["a.m.","p.m."],u,u],u,[["S","M","T","W","T","F","S"],["J2","J3","J4","J5","Al","Ij","J1"],["Jumapiri","Jumatatu","Jumanne","Jumatano","Murwa wa Kanne","Murwa wa Katano","Jumamosi"],["J2","J3","J4","J5","Al","Ij","J1"]],u,[["J","F","M","A)J","A","S","O","N","D"],["Jan","Feb","Mar!Jul","Ago","Sep","Okt","Nov","Des"],["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","NPovemba","Desemba"]],u,[["BC","AD"],u,["Imberi ya Kuuza Kwa","Muhiga Kuvita Kuuza*;¤- #,##0.00","#E0"],"KES","Ksh","SirinjlݣŷkxH/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && i % 10 === 1)
    return 1;
if (v === 0 && i % 10 === 2)
    return 2;
if (v === 0 && (i % 100 === 0 || (i % 100 === 20 || (i % 100 === 40 || (i % 100 === 60 || i % 100 === 80)))))
    return 3;
if (!(v === 0))
    return 4;
return 5;
}
    global.ng.common.locales['gv'] = ["gv",[["a.m.","p.m."],u,u],u,[["S","M","T","W","T","F","S"],["Jed","Jel","Jem","Jerc","Jerd","Jeh","Jes"],["Jedoonee","Jelhein","Jemayrt","Jercean","Jerdein","Jeheiney","Jesarn"],["Jed","Jel","Jem","Jerc","Jerd","Jeh","Jes"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["J-guer","T-arree","Mayrnt","Avrril","Boaldyn","M-souree","J-souree","Luanistyn","M-fouyir","J-fouyir","M-Houney","M-Nollick"],["Jerrey-geuree","Toshiaght-arree","Mayrnt","Averil","Boaldyn","Mean-souree","Jerrey-souree","Luanistyn","Mean-fouyir","Jerrey-fouyir","Mee Houney","Mee ny Nollick"]],u,[["RC","AD"],u,u],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GBP","£","GBP",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
     Xxy/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ha-gh'] = ["ha-GH",[["SF","YM"],u,["Safiya","Yamma"]],[["SF","YM"],u,u],[["L","L","T","L","A","J","A"],["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],["Lahadi","Litinin","Talata","Laraba","Alhamis","Jummaʼa","Asabar"],["Lh","Li","Ta","Lr","Al","Ju","As"]],u,[["J","F","M","A","M","Y","Y","A","S","O","N","D"],["Jan","Fab","Mar","Afi","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis"],["Janairu","Faburairu","Maris","Afirilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktoba","Nuwamba","Disamba"]],u,[["K.H","BHAI"],u,["Kafin haihuwar annab","Bayan haihuwar annab"]],1,[6,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE d MMMM, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'da' {0}","{1} {0}"],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"GHS","GH₵","Sidi na Ghana",{"GHS":["GH₵"],"NGN":["₦"]},"ltr", plural, []];
  })(globalThis);
     }Xxz/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ha-ne'] = ["ha-NE",[["SF","YM"],u,["Safiya","Yamma"]],[["SF","YM"],u,u],[["L","L","T","L","A","J","A"],["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],["Lahadi","Litinin","Talata","Laraba","Alhamis","Jummaʼa","Asabar"],["Lh","Li","Ta","Lr","Al","Ju","As"]],u,[["J","F","M","A","M","Y","Y","A","S","O","N","D"],["Jan","Fab","Mar","Afi","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis"],["Janairu","Faburairu","Maris","Afirilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktoba","Nuwamba","Disamba"]],u,[["K.H","BHAI"],u,["Kafin haihuwar annab","Bayan haihuwar annab"]],1,[6,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE d MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'da' {0}","{1} {0}"],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XOF","F CFA","Kuɗin Sefa na Afirka Ta Yamma",{"NGN":["₦"]},"ltr", plural, []];
  })(globalThis);
    jۼVxl/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ha'] = ["ha",[["SF","YM"],u,["Safiya","Yamma"]],[["SF","YM"],u,u],[["L","L","T","L","A","J","A"],["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],["Lahadi","Litinin","Talata","Laraba","Alhamis","Jummaʼa","Asabar"],["Lh","Li","Ta","Lr","Al","Ju","As"]],u,[["J","F","M","A","M","Y","Y","A","S","O","N","D"],["Jan","Fab","Mar","Afi","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis"],["Janairu","Faburairu","Maris","Afirilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktoba","Nuwamba","Disamba"]],u,[["K.H","BHAI"],u,["Kafin haihuwar annab","Bayan haihuwar annab"]],1,[6,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE d MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'da' {0}","{1} {0}"],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"NGN","₦","Nairar Najeriya",{"NGN":["₦"]},"ltr", plural, []];
  })(globalThis);
    ͲRx"/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['haw'] = ["haw",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["LP","P1","P2","P3","P4","P5","P6"],["Lāpule","Poʻakahi","Poʻalua","Poʻakolu","Poʻahā","Poʻalima","Poʻaono"],["LP","P1","P2","P3","P4","P5","P6"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Ian.","Pep.","Mal.","ʻAp.","Mei","Iun.","Iul.","ʻAu.","Kep.","ʻOk.","Now.","Kek."],["Ianuali","Pepeluali","Malaki","ʻApelila","Mei","Iune","Iulai","ʻAukake","Kepakemapa","ʻOkakopa","Nowemapa","Kekemapa"]],u,[["BCE","CE"],u,u],0,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","$","USD",{"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    {x`
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
if (i === 2 && v === 0)
    return 2;
if (v === 0 && (!(n >= 0 && n <= 10) && n % 10 === 0))
    return 4;
return 5;
}
    global.ng.common.locales['he'] = ["he",[["לפנה״צ","אחה״צ"],u,u],[["לפנה״צ","אחה״צ"],["AM","PM"],u],[["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"]],u,[["לפני","אחריי"],["לפנה״ס","לספירה"],["לפני הספירה","לספירה"]],0,[5,6],["d.M.y","d בMMM y","d בMMMM y","EEEE, d בMMMM y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss zzzz"],["{1}, {0}",u,"{1} בשעה {0}",u],[".",",",";","%","‎+","‎-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","‏#,##0.00 ¤;‏-#,##0.00 ¤","#E0"],"ILS","₪","שקל חדש",{"BYN":[u,"р"],"CNY":["‎CN¥‎","¥"],"ILP":["ל״י"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"rtl", plural, [[["חצות","בבוקר","בצהריים","אחה״צ","בערב","בלילה","לפנות בוקר"],["חצות","בוקר","צהריים","אחר הצהריים","ערב","לילה","לפנות בוקר"],["חצות","בבוקר","בצהריים","אחר הצהריים","בערב","בלילה","לפנות בוקר"]],[["חצות","בוקר","צהריים","אחה״צ","ערב","לילה","לפנות בוקר"],u,["חצות","בוקר","צהריים","אחר הצהריים","ערב","לילה","לפנות בוקר"]],["00:00",["06:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","22:00"],["22:00","03:00"],["03:00","06:00"]]]];
  })(globalThis);
    cuȼx\/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['hi-latn'] = ["hi-Latn",[["a","p"],["AM","PM"],u],[["am","pm"],u,["AM","PM"]],[["ra","so","ma","bu","gu","su","sa"],["ravi","som","mangal","budh","guru","shukra","shani"],["ravivaar","somvaar","mangalvaar","budhvaar","guruvaar","shukravaar","shanivaar"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[0,0],["dd/MM/y","dd-MMM-y","d MMMM y","EEEE, d MMMM, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1}, {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤#,##,##0.00","[#E0]"],"INR","₹","Indian Rupee",{"JPY":["JP¥","¥"]},"ltr", plural, [[["mi","in the morning","in the afternoon","in the evening","at night"],["midnight","in the morning","in the afternoon","in the evening","at night"],["aadhi raat","subah","dopahar","shaam","raat"]],[["midnight","morning","afternoon","evening","night"],u,["aadhi raat","subah","dopahar","shaam","raat"]],["00:00",["04:00","12:00"],["12:00","16:00"],["16:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    hnx4	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['hi'] = ["hi",[["am","pm"],u,u],u,[["र","सो","मं","बु","गु","शु","श"],["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],["र","सो","मं","बु","गु","शु","श"]],u,[["ज","फ़","मा","अ","म","जू","जु","अ","सि","अ","न","दि"],["जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"],["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"]],u,[["ईसा-पूर्व","ईस्वी"],u,["ईसा-पूर्व","ईसवी सन"]],0,[0,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} को {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤#,##,##0.00","[#E0]"],"INR","₹","भारतीय रुपया",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"लेई"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["मध्यरात्रि","सुबह","दोपहर","शाम","रात"],u,u],[["आधी रात","सुबह","दोपहर","शाम","रात"],["मध्यरात्रि","सुबह","दोपहर","शाम","रात"],u],["00:00",["04:00","12:00"],["12:00","16:00"],["16:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    Z3x
?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['hr-ba'] = ["hr-BA",[["AM","PM"],u,u],u,[["N","P","U","S","Č","P","S"],["ned","pon","uto","sri","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ned","pon","uto","sri","čet","pet","sub"]],u,[["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca"]],[["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac"]],[["pr.n.e.","AD"],["pr. Kr.","po. Kr."],["prije Krista","poslije Krista"]],1,[6,0],["d. M. yy.","d. MMM y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss (zzzz)"],["{1} {0}",u,"{1} 'u' {0}",u],[",",".",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"BAM","KM","konvertibilna marka",{"AUD":[u,"$"],"BAM":["KM"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"HRK":["kn"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RUR":[u,"р."],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XCD":[u,"$"],"XPF":[],"XXX":[]},"ltr", plural, [[["ponoć","podne","ujutro","popodne","navečer","noću"],u,["ponoć","podne","ujutro","poslije podne","navečer","noću"]],[["ponoć","podne","ujutro","popodne","navečer","noću"],u,u],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    xl/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['hr'] = ["hr",[["AM","PM"],u,u],u,[["N","P","U","S","Č","P","S"],["ned","pon","uto","sri","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ned","pon","uto","sri","čet","pet","sub"]],[["n","p","u","s","č","p","s"],["ned","pon","uto","sri","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ned","pon","uto","sri","čet","pet","sub"]],[["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca"]],[["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac"]],[["pr.n.e.","AD"],["pr. Kr.","po. Kr."],["prije Krista","poslije Krista"]],1,[6,0],["dd. MM. y.","d. MMM y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss (zzzz)"],["{1} {0}",u,"{1} 'u' {0}",u],[",",".",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"HRK","kn","hrvatska kuna",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"HRK":["kn"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RUR":[u,"р."],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XCD":[u,"$"],"XPF":[],"XXX":[]},"ltr", plural, [[["ponoć","podne","ujutro","popodne","navečer","noću"],u,["ponoć","podne","ujutro","poslije podne","navečer","noću"]],[["ponoć","podne","ujutro","popodne","navečer","noću"],u,u],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    7FTxV/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && i % 100 === 1 || f % 100 === 1)
    return 1;
if (v === 0 && i % 100 === 2 || f % 100 === 2)
    return 2;
if (v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 3 && i % 100 <= 4)) || f % 100 === Math.floor(f % 100) && (f % 100 >= 3 && f % 100 <= 4))
    return 3;
return 5;
}
    global.ng.common.locales['hsb'] = ["hsb",[["dop.","pop."],["dopołdnja","popołdnju"],u],[["am","pm"],u,["dopołdnja","popołdnju"]],[["n","p","w","s","š","p","s"],["nje","pón","wut","srj","štw","pja","sob"],["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],["nj","pó","wu","sr","št","pj","so"]],u,[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan.","feb.","měr.","apr.","mej.","jun.","jul.","awg.","sep.","okt.","now.","dec."],["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra"]],[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec"],["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december"]],[["př.Chr.n.","po Chr.n."],u,["před Chrystowym narodźenjom","po Chrystowym narodźenju"]],1,[6,0],["d.M.yy","d.M.y","d. MMMM y","EEEE, d. MMMM y"],["H:mm 'hodź'.","H:mm:ss","H:mm:ss z","H:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":[u,"$"],"PLN":["zł"],"THB":["฿"]},"ltr", plural, []];
  })(globalThis);
    vyxj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['hu'] = ["hu",[["de.","du."],u,u],u,[["V","H","K","Sz","Cs","P","Sz"],["V","H","K","Sze","Cs","P","Szo"],["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],["V","H","K","Sze","Cs","P","Szo"]],u,[["J","F","M","Á","M","J","J","A","Sz","O","N","D"],["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."],["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"]],u,[["ie.","isz."],["i. e.","i. sz."],["Krisztus előtt","időszámításunk szerint"]],1,[6,0],["y. MM. dd.","y. MMM d.","y. MMMM d.","y. MMMM d., EEEE"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"HUF","Ft","magyar forint",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"HUF":["Ft"],"ILS":[u,"₪"],"INR":[u,"₹"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XCD":[u,"$"]},"ltr", plural, [[["éjfél","dél","reggel","de.","du.","este","éjjel","hajnal"],u,["éjfél","dél","reggel","délelőtt","délután","este","éjjel","hajnal"]],u,["00:00","12:00",["06:00","09:00"],["09:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","04:00"],["04:00","06:00"]]]];
  })(globalThis);
    hDվxN
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['hy'] = ["hy",[["ա","հ"],["AM","PM"],u],[["AM","PM"],u,u],[["Կ","Ե","Ե","Չ","Հ","Ո","Շ"],["կիր","երկ","երք","չրք","հնգ","ուր","շբթ"],["կիրակի","երկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],["կր","եկ","եք","չք","հգ","ու","շբ"]],u,[["Հ","Փ","Մ","Ա","Մ","Հ","Հ","Օ","Ս","Հ","Ն","Դ"],["հնվ","փտվ","մրտ","ապր","մյս","հնս","հլս","օգս","սեպ","հոկ","նոյ","դեկ"],["հունվարի","փետրվարի","մարտի","ապրիլի","մայիսի","հունիսի","հուլիսի","օգոստոսի","սեպտեմբերի","հոկտեմբերի","նոյեմբերի","դեկտեմբերի"]],[["Հ","Փ","Մ","Ա","Մ","Հ","Հ","Օ","Ս","Հ","Ն","Դ"],["հնվ","փտվ","մրտ","ապր","մյս","հնս","հլս","օգս","սեպ","հոկ","նոյ","դեկ"],["հունվար","փետրվար","մարտ","ապրիլ","մայիս","հունիս","հուլիս","օգոստոս","սեպտեմբեր","հոկտեմբեր","նոյեմբեր","դեկտեմբեր"]],[["մ.թ.ա.","մ.թ."],u,["Քրիստոսից առաջ","Քրիստոսից հետո"]],1,[6,0],["dd.MM.yy","dd MMM, y թ.","dd MMMM, y թ.","y թ. MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","ՈչԹ",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"AMD","֏","հայկական դրամ",{"AMD":["֏"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["կգ․","կօ․","առվ","ցրկ","երկ","գշր"],["կեսգիշեր","կեսօր","առավոտյան","ցերեկը","երեկոյան","գիշերը"],["կեսգիշերին","կեսօրին","առավոտյան","ցերեկվա","երեկոյան","գիշերվա"]],[["կեսգիշեր","կեսօր","առավոտ","ցերեկ","երեկո","գիշեր"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    ,鼼kxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ia'] = ["ia",[["AM","PM"],u,u],u,[["d","l","m","m","j","v","s"],["dom","lun","mar","mer","jov","ven","sab"],["dominica","lunedi","martedi","mercuridi","jovedi","venerdi","sabbato"],["do","lu","ma","me","jo","ve","sa"]],u,[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mar","apr","mai","jun","jul","aug","sep","oct","nov","dec"],["januario","februario","martio","april","maio","junio","julio","augusto","septembre","octobre","novembre","decembre"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["jan","feb","mar","apr","mai","jun","jul","aug","sep","oct","nov","dec"],["januario","februario","martio","april","maio","junio","julio","augusto","septembre","octobre","novembre","decembre"]],[["a.Chr.","p.Chr."],u,["ante Christo","post Christo"]],1,[6,0],["dd-MM-y","d MMM y","d 'de' MMMM y","EEEE 'le' d 'de' MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'a' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],u,u,u,{"JPY":["JP¥","¥"],"NLG":["ƒ"],"RUB":["₽"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    /bx-/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['id'] = ["id",[["AM","PM"],u,u],u,[["M","S","S","R","K","J","S"],["Min","Sen","Sel","Rab","Kam","Jum","Sab"],["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],["Min","Sen","Sel","Rab","Kam","Jum","Sab"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des"],["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]],u,[["SM","M"],u,["Sebelum Masehi","Masehi"]],0,[6,0],["dd/MM/yy","d MMM y","d MMMM y","EEEE, dd MMMM y"],["HH.mm","HH.mm.ss","HH.mm.ss z","HH.mm.ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN","."],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"IDR","Rp","Rupiah Indonesia",{"AUD":["AU$","$"],"BYN":[u,"р."],"IDR":["Rp"],"INR":["Rs","₹"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["tengah malam","tengah hari","pagi","siang","sore","malam"],u,u],u,["00:00","12:00",["00:00","10:00"],["10:00","15:00"],["15:00","18:00"],["18:00","24:00"]]]];
  })(globalThis);
    DXxq/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ig'] = ["ig",[["A.M.","P.M."],u,["N’ụtụtụ","N’abali"]],[["A.M.","P.M."],u,u],[["S","M","T","W","T","F","S"],["Sọn","Mọn","Tiu","Wen","Tọọ","Fraị","Sat"],["Sọndee","Mọnde","Tiuzdee","Wenezdee","Tọọzdee","Fraịdee","Satọdee"],["Sọn","Mọn","Tiu","Wen","Tọọ","Fraị","Sat"]],u,[["J","F","M","E","M","J","J","Ọ","S","Ọ","N","D"],["Jen","Feb","Maa","Epr","Mee","Juu","Jul","Ọgọ","Sep","Ọkt","Nov","Dis"],["Jenụwarị","Febrụwarị","Maachị","Epreel","Mee","Juun","Julaị","Ọgọọst","Septemba","Ọktoba","Novemba","Disemba"]],u,[["T.K.","A.K."],u,["Tupu Kraist","Afọ Kraịst"]],1,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'na' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"NGN","₦","Naịra",{"NGN":["₦"]},"ltr", plural, []];
  })(globalThis);
    &oRx&/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ii'] = ["ii",[["ꎸꄑ","ꁯꋒ"],u,u],u,[["ꆏ","ꋍ","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"],["ꑭꆏ","ꆏꋍ","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],["ꑭꆏꑍ","ꆏꊂꋍ","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],["ꑭꆏ","ꆏꋍ","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊰꊪꆪ","ꊰꑋꆪ"],u],u,[["ꃅꋊꂿ","ꃅꋊꊂ"],u,u],0,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"CNY","¥","CNY",{"CNY":["¥"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    5~ԃxh/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), t = parseInt(val.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0;

if (t === 0 && (i % 10 === 1 && !(i % 100 === 11)) || !(t === 0))
    return 1;
return 5;
}
    global.ng.common.locales['is'] = ["is",[["f.","e."],["f.h.","e.h."],u],[["f.h.","e.h."],u,u],[["S","M","Þ","M","F","F","L"],["sun.","mán.","þri.","mið.","fim.","fös.","lau."],["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],["su.","má.","þr.","mi.","fi.","fö.","la."]],u,[["J","F","M","A","M","J","J","Á","S","O","N","D"],["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des."],["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"]],u,[["f.k.","e.k."],["f.Kr.","e.Kr."],["fyrir Krist","eftir Krist"]],1,[6,0],["d.M.y","d. MMM y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'kl'. {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"ISK","ISK","íslensk króna",{"AUD":[u,"$"],"BRL":[u,"R$"],"CAD":[u,"$"],"EUR":[u,"€"],"GBP":[u,"£"],"INR":[u,"₹"],"JPY":["JP¥","¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"]},"ltr", plural, [[["mn.","h.","mrg.","sd.","kv.","n."],["miðnætti","hádegi","að morgni","síðdegis","að kvöldi","að nóttu"],u],[["mn.","hd.","mrg.","sd.","kv.","n."],["miðnætti","hádegi","morgunn","síðdegis","kvöld","nótt"],["miðnætti","hádegi","morgunn","eftir hádegi","kvöld","nótt"]],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    xw/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 1 && v === 0)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['it-ch'] = ["it-CH",[["m.","p."],["AM","PM"],u],u,[["D","L","M","M","G","V","S"],["dom","lun","mar","mer","gio","ven","sab"],["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],["dom","lun","mar","mer","gio","ven","sab"]],u,[["G","F","M","A","M","G","L","A","S","O","N","D"],["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"]],u,[["aC","dC"],["a.C.","d.C."],["avanti Cristo","dopo Cristo"]],1,[6,0],["dd.MM.yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[".","’",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤-#,##0.00","#E0"],"CHF","CHF","franco svizzero",{"BRL":[u,"R$"],"BYN":[u,"Br"],"EGP":[u,"£E"],"HKD":[u,"$"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NOK":[u,"NKr"],"THB":["฿"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"]},"ltr", plural, [[["mezzanotte","mezzogiorno","di mattina","di pomeriggio","di sera","di notte"],u,["mezzanotte","mezzogiorno","di mattina","del pomeriggio","di sera","di notte"]],[["mezzanotte","mezzogiorno","mattina","pomeriggio","sera","notte"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    vx]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 1 && v === 0)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['it-sm'] = ["it-SM",[["m.","p."],["AM","PM"],u],u,[["D","L","M","M","G","V","S"],["dom","lun","mar","mer","gio","ven","sab"],["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],["dom","lun","mar","mer","gio","ven","sab"]],u,[["G","F","M","A","M","G","L","A","S","O","N","D"],["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"]],u,[["aC","dC"],["a.C.","d.C."],["avanti Cristo","dopo Cristo"]],1,[6,0],["dd/MM/yy","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"BRL":[u,"R$"],"BYN":[u,"Br"],"EGP":[u,"£E"],"HKD":[u,"$"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NOK":[u,"NKr"],"THB":["฿"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"]},"ltr", plural, [[["mezzanotte","mezzogiorno","di mattina","di pomeriggio","di sera","di notte"],u,["mezzanotte","mezzogiorno","di mattina","del pomeriggio","di sera","di notte"]],[["mezzanotte","mezzogiorno","mattina","pomeriggio","sera","notte"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    Hnx]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 1 && v === 0)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['it-va'] = ["it-VA",[["m.","p."],["AM","PM"],u],u,[["D","L","M","M","G","V","S"],["dom","lun","mar","mer","gio","ven","sab"],["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],["dom","lun","mar","mer","gio","ven","sab"]],u,[["G","F","M","A","M","G","L","A","S","O","N","D"],["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"]],u,[["aC","dC"],["a.C.","d.C."],["avanti Cristo","dopo Cristo"]],1,[6,0],["dd/MM/yy","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"BRL":[u,"R$"],"BYN":[u,"Br"],"EGP":[u,"£E"],"HKD":[u,"$"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NOK":[u,"NKr"],"THB":["฿"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"]},"ltr", plural, [[["mezzanotte","mezzogiorno","di mattina","di pomeriggio","di sera","di notte"],u,["mezzanotte","mezzogiorno","di mattina","del pomeriggio","di sera","di notte"]],[["mezzanotte","mezzogiorno","mattina","pomeriggio","sera","notte"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    ^nxW/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === 1 && v === 0)
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['it'] = ["it",[["m.","p."],["AM","PM"],u],u,[["D","L","M","M","G","V","S"],["dom","lun","mar","mer","gio","ven","sab"],["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],["dom","lun","mar","mer","gio","ven","sab"]],u,[["G","F","M","A","M","G","L","A","S","O","N","D"],["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"]],u,[["aC","dC"],["a.C.","d.C."],["avanti Cristo","dopo Cristo"]],1,[6,0],["dd/MM/yy","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"BRL":[u,"R$"],"BYN":[u,"Br"],"EGP":[u,"£E"],"HKD":[u,"$"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NOK":[u,"NKr"],"THB":["฿"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"]},"ltr", plural, [[["mezzanotte","mezzogiorno","di mattina","di pomeriggio","di sera","di notte"],u,["mezzanotte","mezzogiorno","di mattina","del pomeriggio","di sera","di notte"]],[["mezzanotte","mezzogiorno","mattina","pomeriggio","sera","notte"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    l˽Yxb/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ja'] = ["ja",[["午前","午後"],u,u],u,[["日","月","火","水","木","金","土"],u,["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],["日","月","火","水","木","金","土"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],u],u,[["BC","AD"],["紀元前","西暦"],u],0,[6,0],["y/MM/dd",u,"y年M月d日","y年M月d日EEEE"],["H:mm","H:mm:ss","H:mm:ss z","H時mm分ss秒 zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"JPY","￥","日本円",{"BYN":[u,"р."],"CNY":["元","￥"],"JPY":["￥"],"PHP":[u,"₱"],"RON":[u,"レイ"],"XXX":[]},"ltr", plural, [[["真夜中","正午","朝","昼","夕方","夜","夜中"],u,u],u,["00:00","12:00",["04:00","12:00"],["12:00","16:00"],["16:00","19:00"],["19:00","23:00"],["23:00","04:00"]]]];
  })(globalThis);
    .^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['jgo'] = ["jgo",[["mbaꞌmbaꞌ","ŋka mbɔ́t nji"],u,u],u,[["Sɔ́","Mɔ́","ÁM","Wɛ́","Tɔ́","Fɛ","Sá"],["Sɔ́ndi","Mɔ́ndi","Ápta Mɔ́ndi","Wɛ́nɛsɛdɛ","Tɔ́sɛdɛ","Fɛlâyɛdɛ","Sásidɛ"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Nduŋmbi Saŋ","Pɛsaŋ Pɛ́pá","Pɛsaŋ Pɛ́tát","Pɛsaŋ Pɛ́nɛ́kwa","Pɛsaŋ Pataa","Pɛsaŋ Pɛ́nɛ́ntúkú","Pɛsaŋ Saambá","Pɛsaŋ Pɛ́nɛ́fɔm","Pɛsaŋ Pɛ́nɛ́pfúꞋú","Pɛsaŋ Nɛgɛ́m","Pɛsaŋ Ntsɔ̌pmɔ́","Pɛsaŋ Ntsɔ̌ppá"],u],u,[["BCE","CE"],u,["tsɛttsɛt mɛŋguꞌ mi ɛ́ lɛɛnɛ Kɛlísɛtɔ gɔ ńɔ́","tsɛttsɛt mɛŋguꞌ mi ɛ́ fúnɛ Kɛlísɛtɔ tɔ́ mɔ́"]],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","EEEE, y MMMM dd"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XAF","FCFA","Fɛlâŋ",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    !ܾVxn/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['jmc'] = ["jmc",[["utuko","kyiukonyi"],u,u],u,[["J","J","J","J","A","I","J"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"],["Jumapilyi","Jumatatuu","Jumanne","Jumatanu","Alhamisi","Ijumaa","Jumamosi"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],["Januari","Februari","Machi","Aprilyi","Mei","Junyi","Julyai","Agusti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KK","BK"],u,["Kabla ya Kristu","Baada ya Kristu"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"TZS","TSh","Shilingi ya Tanzania",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    Ց){xc
*kde'] = ["kde",[["Muhi","Chilo"],u,u],u,[["2","3","4","5","6","7","1"],["Ll2","Ll3","Ll4","Ll5","Ll6","Ll7","Ll1"],["Liduva lyapili","Liduva lyatatu","Liduva lyanchechi","Liduva lyannyano","Liduva lyannyano na linji","Liduva lyannyano na mavili","Liduva 3litandi"],["Ll2","Ll3","Ll4","Ll5","Ll6","Ll7","Ll1Mwedi Ntandi","Mwedi wa Pili","Mwedi wa Tatu","Mwedi wa Nchechi","Mwedi wa Nnyano","Mwedi wa Nnyano na Umo","Mwedi wa Nnyano na Mivili","Mwedi wa Nnyano na Mitatu","Mwedi wa Nnyano na Nchechi","Mwedi wa Nnyano na Nnyano","Mwedi wa Nnyano na Nnyano na U",S"Mwedi wa Nnyano na Nnyano na M"]],u,[["AY","NY"],u,["Akanapawa Yesu","Nankuida YesisSx6/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['jv'] = ["jv",[["Isuk","Wengi"],u,u],u,[["A","S","S","R","K","J","S"],["Ahad","Sen","Sel","Rab","Kam","Jum","Sab"],["Ahad","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],["Ahad","Sen","Sel","Rab","Kam","Jum","Sab"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]],u,[["SM","M"],u,["Sakdurunge Masehi","Masehi"]],0,[6,0],["dd-MM-y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"IDR","Rp","Rupiah Indonesia",{"IDR":["Rp"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    t~xy
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ka'] = ["ka",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["კ","ო","ს","ო","ხ","პ","შ"],["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],["კვ","ორ","სმ","ოთ","ხთ","პრ","შბ"]],u,[["ი","თ","მ","ა","მ","ი","ი","ა","ს","ო","ნ","დ"],["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"]],u,[["ძვ. წ.","ახ. წ."],u,["ძველი წელთაღრიცხვით","ახალი წელთაღრიცხვით"]],1,[6,0],["dd.MM.yy","d MMM. y","d MMMM, y","EEEE, dd MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","არ არის რიცხვი",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"GEL","₾","ქართული ლარი",{"AUD":[u,"$"],"BYN":[u,"р."],"CNY":[u,"¥"],"GEL":["₾"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["შუაღამეს","შუადღ.","დილ.","ნაშუადღ.","საღ.","ღამ."],u,["შუაღამეს","შუადღეს","დილით","ნაშუადღევს","საღამოს","ღამით"]],[["შუაღამე","შუადღე","დილა","ნაშუადღევი","საღამო","ღამე"],u,u],["00:00","12:00",["05:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","05:00"]]]];
  })(globalThis);
    ~ܦ\x9/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || i === 1)
    return 1;
return 5;
}
    global.ng.common.locales['kab'] = ["kab",[["n tufat","n tmeddit"],u,u],u,[["Y","S","K","K","S","S","S"],["Yan","San","Kraḍ","Kuẓ","Sam","Sḍis","Say"],["Yanass","Sanass","Kraḍass","Kuẓass","Samass","Sḍisass","Sayass"],["Yan","San","Kraḍ","Kuẓ","Sam","Sḍis","Say"]],u,[["Y","F","M","Y","M","Y","Y","Ɣ","C","T","N","D"],["Yen","Fur","Meɣ","Yeb","May","Yun","Yul","Ɣuc","Cte","Tub","Nun","Duǧ"],["Yennayer","Fuṛar","Meɣres","Yebrir","Mayyu","Yunyu","Yulyu","Ɣuct","Ctembeṛ","Tubeṛ","Nunembeṛ","Duǧembeṛ"]],u,[["snd. T.Ɛ","sld. T.Ɛ"],u,["send talalit n Ɛisa","seld talalit n Ɛisa"]],6,[5,6],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"DZD","DA","Adinar Azzayri",{"DZD":["DA"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    +UĽ]x%/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['kam'] = ["kam",[["Ĩyakwakya","Ĩyawĩoo"],u,u],u,[["Y","W","E","A","A","A","A"],["Wky","Wkw","Wkl","Wtũ","Wkn","Wtn","Wth"],["Wa kyumwa","Wa kwambĩlĩlya","Wa kelĩ","Wa katatũ","Wa kana","Wa katano","Wa thanthatũ"],["Wky","Wkw","Wkl","Wtũ","Wkn","Wtn","Wth"]],u,[["M","K","K","K","K","T","M","N","K","Ĩ","Ĩ","Ĩ"],["Mbe","Kel","Ktũ","Kan","Ktn","Tha","Moo","Nya","Knd","Ĩku","Ĩkm","Ĩkl"],["Mwai wa mbee","Mwai wa kelĩ","Mwai wa katatũ","Mwai wa kana","Mwai wa katano","Mwai wa thanthatũ","Mwai wa muonza","Mwai wa nyaanya","Mwai wa kenda","Mwai wa ĩkumi","Mwai wa ĩkumi na ĩmwe","Mwai wa ĩkumi na ilĩ"]],u,[["MY","IY"],u,["Mbee wa Yesũ","Ĩtina wa Yesũ"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Silingi ya Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    n˸Xx|/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['kea'] = ["kea",[["am","pm"],u,u],u,[["D","S","T","K","K","S","S"],["dum","sig","ter","kua","kin","ses","sab"],["dumingu","sigunda-fera","tersa-fera","kuarta-fera","kinta-fera","sesta-fera","sábadu"],["du","si","te","ku","ki","se","sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Otu","Nuv","Diz"],["Janeru","Febreru","Marsu","Abril","Maiu","Junhu","Julhu","Agostu","Setenbru","Otubru","Nuvenbru","Dizenbru"]],u,[["AK","DK"],u,["antis di Kristu","dispos di Kristu"]],1,[6,0],["dd/MM/y","d MMM y","d 'di' MMMM 'di' y","EEEE, d 'di' MMMM 'di' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"CVE","​","Skudu Kabuverdianu",{"AUD":["AU$","$"],"CVE":["​"],"JPY":["JP¥","¥"],"THB":["฿"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    \px	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['kgp'] = ["kgp",[["AM","PM"],u,u],u,[["N.","P.","R.","T.","V.","P.","S."],["num.","pir.","rég.","tẽg.","vẽn.","pén.","sav."],["numĩggu","pir-kurã-há","régre-kurã-há","tẽgtũ-kurã-há","vẽnhkãgra-kurã-há","pénkar-kurã-há","savnu"],["N.","1kh.","2kh.","3kh.","4kh.","5kh.","S."]],u,[["1K","2K","3K","4K","5K","6K","7K","8K","9K","10K","11K","12K"],["1Ky.","2Ky.","3Ky.","4Ky.","5Ky.","6Ky.","7Ky.","8Ky.","9Ky.","10Ky.","11Ky.","12Ky."],["1-Kysã","2-Kysã","3-Kysã","4-Kysã","5-Kysã","6-Kysã","7-Kysã","8-Kysã","9-Kysã","10-Kysã","11-Kysã","12-Kysã"]],u,[["C.j.","C.kk."],u,["Cristo jo","Cristo kar kỹ"]],0,[6,0],["dd/MM/y","d 'ne' MMM, y","d 'ne' MMMM, y","EEEE, d 'ne' MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"BRL","R$","Mrasir Rejar",{"AUD":["AU$","$"],"BYN":[u,"p."],"FJD":["FJC","$"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["Vẽj."],"RON":[u,"L"],"SYP":[u,"S£"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XOF":["CFA"],"ZMK":["SMK"]},"ltr", plural, [[["kuty-si","kurã-kuju","kusãg ki","rãkãnh kỹ","kuty kỹ","kurã ge"],u,u],u,["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    S+Sx:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['khq'] = ["khq",[["Adduha","Aluula"],u,u],u,[["H","T","T","L","L","L","S"],["Alh","Ati","Ata","Ala","Alm","Alj","Ass"],["Alhadi","Atini","Atalata","Alarba","Alhamiisa","Aljuma","Assabdu"],["Alh","Ati","Ata","Ala","Alm","Alj","Ass"]],u,[["Ž","F","M","A","M","Ž","Ž","U","S","O","N","D"],["Žan","Fee","Mar","Awi","Me","Žuw","Žuy","Ut","Sek","Okt","Noo","Dee"],["Žanwiye","Feewiriye","Marsi","Awiril","Me","Žuweŋ","Žuyye","Ut","Sektanbur","Oktoobur","Noowanbur","Deesanbur"]],u,[["IJ","IZ"],u,["Isaa jine","Isaa jamanoo"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],["."," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"XOF","F CFA","CFA Fraŋ (BCEAO)",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    `ϊT[xC/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ki'] = ["ki",[["Kiroko","Hwaĩ-inĩ"],u,u],u,[["K","N","N","N","A","N","N"],["KMA","NTT","NMN","NMT","ART","NMA","NMM"],["Kiumia","Njumatatũ","Njumaine","Njumatana","Aramithi","Njumaa","Njumamothi"],["KMA","NTT","NMN","NMT","ART","NMA","NMM"]],u,[["J","K","G","K","G","G","M","K","K","I","I","D"],["JEN","WKR","WGT","WKN","WTN","WTD","WMJ","WNN","WKD","WIK","WMW","DIT"],["Njenuarĩ","Mwere wa kerĩ","Mwere wa gatatũ","Mwere wa kana","Mwere wa gatano","Mwere wa gatandatũ","Mwere wa mũgwanja","Mwere wa kanana","Mwere wa kenda","Mwere wa ikũmi","Mwere wa ikũmi na ũmwe","Ndithemba"]],u,[["MK","TK"],u,["Mbere ya Kristo","Thutha wa Kristo"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Ciringi ya Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
     x	3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['kk'] = ["kk",[["AM","PM"],u,u],u,[["Ж","Д","С","С","Б","Ж","С"],["жс","дс","сс","ср","бс","жм","сб"],["жексенбі","дүйсенбі","сейсенбі","сәрсенбі","бейсенбі","жұма","сенбі"],["жс","дс","сс","ср","бс","жм","сб"]],u,[["Қ","А","Н","С","М","М","Ш","Т","Қ","Қ","Қ","Ж"],["қаң.","ақп.","нау.","сәу.","мам.","мау.","шіл.","там.","қыр.","қаз.","қар.","жел."],["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан"]],[["Қ","А","Н","С","М","М","Ш","Т","Қ","Қ","Қ","Ж"],["қаң.","ақп.","нау.","сәу.","мам.","мау.","шіл.","там.","қыр.","қаз.","қар.","жел."],["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"]],[["б.з.д.","б.з."],u,["Біздің заманымызға дейін","біздің заманымыз"]],1,[6,0],["dd.MM.yy","y 'ж'. dd MMM","y 'ж'. d MMMM","y 'ж'. d MMMM, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","сан емес",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"KZT","₸","Қазақстан теңгесі",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"KZT":["₸"],"LSL":["ЛСЛ"],"PHP":[u,"₱"],"RUB":["₽"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["түнгі","түскі","таңғы","түстен кейінгі","кешкі","түнгі"],["түн жарымы","түскі","таңғы","түстен кейінгі","кешкі","түнгі"],u],[["түн жарымы","талтүс","таң","түстен кейін","кеш","түн"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    VUx_/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['kkj'] = ["kkj",[["AM","PM"],u,u],u,[["so","lu","ma","mɛ","ye","va","ms"],["sɔndi","lundi","mardi","mɛrkɛrɛdi","yedi","vaŋdɛrɛdi","mɔnɔ sɔndi"],u,u],[["so","lu","ma","mɛ","ye","va","ms"],["sɔndi","lundi","mardi","mɛrkɛrɛdi","yedi","vaŋdɛrɛdi","mɔnɔ sɔndi"],u,["so","lu","ma","mɛ","ye","va","ms"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["pamba","wanja","mbiyɔ mɛndoŋgɔ","Nyɔlɔmbɔŋgɔ","Mɔnɔ ŋgbanja","Nyaŋgwɛ ŋgbanja","kuŋgwɛ","fɛ","njapi","nyukul","M11","ɓulɓusɛ"],u],u,[["BCE","CE"],u,u],1,[6,0],["dd/MM y","d MMM y","d MMMM y","EEEE dd MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XAF","FCFA","Franc CFA",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    /@hx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['kl'] = ["kl",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["sap","ata","mar","pin","sis","tal","arf"],["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],["sap","ata","mar","pin","sis","tal","arf"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["jan","febr","mar","apr","maj","jun","jul","aug","sept","okt","nov","dec"],["januaarip","februaarip","marsip","apriilip","maajip","juunip","juulip","aggustip","septembarip","oktobarip","novembarip","decembarip"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["jan","febr","mar","apr","maj","jun","jul","aug","sept","okt","nov","dec"],["januaari","februaari","marsi","apriili","maaji","juuni","juuli","aggusti","septembari","oktobari","novembari","decembari"]],[["BCE","CE"],u,u],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH.mm","HH.mm.ss","HH.mm.ss z","HH.mm.ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤#,##0.00;¤-#,##0.00","#E0"],"DKK","kr.","DKK",{"DKK":["kr.","kr"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    2Yxc/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['kln'] = ["kln",[["krn","koosk"],u,["karoon","kooskoliny"]],[["krn","koosk"],u,u],[["T","T","O","S","A","M","L"],["Kts","Kot","Koo","Kos","Koa","Kom","Kol"],["Kotisap","Kotaai","Koaeng’","Kosomok","Koang’wan","Komuut","Kolo"],["Kts","Kot","Koo","Kos","Koa","Kom","Kol"]],u,[["M","N","T","I","M","P","N","R","B","E","K","K"],["Mul","Ngat","Taa","Iwo","Mam","Paa","Nge","Roo","Bur","Epe","Kpt","Kpa"],["Mulgul","Ng’atyaato","Kiptaamo","Iwootkuut","Mamuut","Paagi","Ng’eiyeet","Rooptui","Bureet","Epeeso","Kipsuunde ne taai","Kipsuunde nebo aeng’"]],u,[["AM","KO"],u,["Amait kesich Jesu","Kokakesich Jesu"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Silingitab ya Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    }̱]x./**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ko-kp'] = ["ko-KP",[["AM","PM"],u,["오전","오후"]],u,[["일","월","화","수","목","금","토"],u,["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],["일","월","화","수","목","금","토"]],u,[["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],u,u],u,[["BC","AD"],u,["기원전","서기"]],1,[6,0],["yy. M. d.","y. M. d.","y년 M월 d일","y년 M월 d일 EEEE"],["a h:mm","a h:mm:ss","a h시 m분 s초 z","a h시 m분 s초 zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KPW","KPW","조선 민주주의 인민 공화국 원",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"L"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["자정","정오","새벽","오전","오후","저녁","밤"],u,u],u,["00:00","12:00",["03:00","06:00"],["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","03:00"]]]];
  })(globalThis);
    {γ[xL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ko'] = ["ko",[["AM","PM"],u,["오전","오후"]],u,[["일","월","화","수","목","금","토"],u,["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],["일","월","화","수","목","금","토"]],u,[["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],u,u],u,[["BC","AD"],u,["기원전","서기"]],0,[6,0],["yy. M. d.","y. M. d.","y년 M월 d일","y년 M월 d일 EEEE"],["a h:mm","a h:mm:ss","a h시 m분 s초 z","a h시 m분 s초 zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KRW","₩","대한민국 원",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"L"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["자정","정오","새벽","오전","오후","저녁","밤"],u,u],u,["00:00","12:00",["03:00","06:00"],["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","03:00"]]]];
  })(globalThis);
    sx	Y/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['kok'] = ["kok",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["आ","सो","मं","बु","बि","शु","शे"],["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","शुक्रार","शेनवार"],u,["आय","सोम","मंगळ","बुध","बिरे","शुक्र","शेन"]],[["आ","सो","मं","बु","ब","शु","शे"],["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","शुक्रार","शेनवार"],u,["आय","सोम","मंगळ","बुध","बिरे","शुक्र","शेन"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["जानेवारी","फेब्रुवारी","मार्च","एप्रील","मे","जून","जुलय","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],u],[["1","2","3","4","5","6","7","8","9","10","11","12"],["जाने","फेब्रु","मार्च","एप्री","मे","जून","जुल","ऑग","सप्टें","ऑक्टो","नो","डिसे"],["जानेवारी","फेब्रुवारी","मार्च","एप्रील","मे","जून","जुलय","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"]],[["क्रिस्तपूर्व","क्रिस्तशखा"],u,u],0,[0,0],["d-M-yy","d-MMM-y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","भारतीय रुपया",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":["रॉन","लेई"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
     ax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ks-arab'] = ["ks-Arab",[["AM","PM"],u,u],u,[["ا","ژ","ب","ب","ب","ج","ب"],["آتھوار","ژٔندٕروار","بۆموار","بودوار","برؠسوار","جُمہ","بٹوار"],["اَتھوار","ژٔندرٕروار","بۆموار","بودوار","برؠسوار","جُمہ","بٹوار"],["آتھوار","ژٔندٕروار","بۆموار","بودوار","برؠسوار","جُمہ","بٹوار"]],u,[["ج","ف","م","ا","م","ج","ج","ا","س","س","ا","ن"],["جنؤری","فرؤری","مارٕچ","اپریل","مئی","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"],u],u,[["بی سی","اے ڈی"],u,["قبٕل مسیٖح","عیٖسوی سنہٕ"]],0,[0,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{0} پٮ۪ٹھۍ {1}",u],[".","،",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"INR","₹","ہِندُستٲنۍ رۄپَے",{},"rtl", plural, []];
  })(globalThis);
    Q) #x	*pa-arab'] = ["paS","M","T","W","T","F","S"],["اتوار","پیر","منگل","بُدھ","جمعرات","جمعہ","ہفتہ"],u,u],u,[["1","2"O,"3","4","5","6","7","8","9","10","11","12"],["جنوری","فروری","مار","جون","جولائ"%I*Tيساپورو","سں"],u,u],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, dd MMMM@) {0}",u,u,u],[".",",",";","%","‎+","‎n<e #,##0.00","#E0"],"PKR","ر","روپئیہ",{"JPY":["JP¥","¥"],"PKR":["ر","Rs"],"USD":["US$","$"],H[!Wxy/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ks-deva'] = ["ks-Deva",[["AM","PM"],u,u],u,[["अ","च","ब","ब","ब","ज","ब"],["आथवार","चंदिरवार","बुवार","बोदवार","ब्रेसवार","जुम्मा","बटवार"],u,u],u,[["ज","फ़","म","अ","म","ज","ज","अ","स","ओ","न","द"],["जनवरी","फ़रवरी","मार्च","अप्रैल","मे","जून","जुलाई","अगस्त","सतुंबर","अकतुम्बर","नवूमबर","दसूमबर"],u],u,[["BC","AD"],u,u],0,[0,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["a h:mm","a h:mm:ss","a h:mm:ss z","a h:mm:ss zzzz"],["{1}, {0}",u,"{0} पेठ {1}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","इंडियन रूपी",{"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    <o`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ks'] = ["ks",[["AM","PM"],u,u],u,[["ا","ژ","ب","ب","ب","ج","ب"],["آتھوار","ژٔندٕروار","بۆموار","بودوار","برؠسوار","جُمہ","بٹوار"],["اَتھوار","ژٔندرٕروار","بۆموار","بودوار","برؠسوار","جُمہ","بٹوار"],["آتھوار","ژٔندٕروار","بۆموار","بودوار","برؠسوار","جُمہ","بٹوار"]],u,[["ج","ف","م","ا","م","ج","ج","ا","س","س","ا","ن"],["جنؤری","فرؤری","مارٕچ","اپریل","مئی","جوٗن","جوٗلایی","اگست","ستمبر","اکتوٗبر","نومبر","دسمبر"],u],u,[["بی سی","اے ڈی"],u,["قبٕل مسیٖح","عیٖسوی سنہٕ"]],0,[0,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{0} پٮ۪ٹھۍ {1}",u],[".","،",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"INR","₹","ہِندُستٲنۍ رۄپَے",{},"rtl", plural, []];
  })(globalThis);
    M-3Vxk/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ksb'] = ["ksb",[["makeo","nyiaghuo"],u,u],u,[["2","3","4","5","A","I","1"],["Jpi","Jtt","Jmn","Jtn","Alh","Iju","Jmo"],["Jumaapii","Jumaatatu","Jumaane","Jumaatano","Alhamisi","Ijumaa","Jumaamosi"],["Jpi","Jtt","Jmn","Jtn","Alh","Iju","Jmo"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],["Januali","Febluali","Machi","Aplili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KK","BK"],u,["Kabla ya Klisto","Baada ya Klisto"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"TZS","TSh","shilingi ya Tanzania",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    `rax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ksf'] = ["ksf",[["sárúwá","cɛɛ́nko"],u,u],u,[["s","l","m","m","j","j","s"],["sɔ́n","lǝn","maa","mɛk","jǝǝ","júm","sam"],["sɔ́ndǝ","lǝndí","maadí","mɛkrɛdí","jǝǝdí","júmbá","samdí"],["sɔ́n","lǝn","maa","mɛk","jǝǝ","júm","sam"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ŋ1","ŋ2","ŋ3","ŋ4","ŋ5","ŋ6","ŋ7","ŋ8","ŋ9","ŋ10","ŋ11","ŋ12"],["ŋwíí a ntɔ́ntɔ","ŋwíí akǝ bɛ́ɛ","ŋwíí akǝ ráá","ŋwíí akǝ nin","ŋwíí akǝ táan","ŋwíí akǝ táafɔk","ŋwíí akǝ táabɛɛ","ŋwíí akǝ táaraa","ŋwíí akǝ táanin","ŋwíí akǝ ntɛk","ŋwíí akǝ ntɛk di bɔ́k","ŋwíí akǝ ntɛk di bɛ́ɛ"]],u,[["d.Y.","k.Y."],u,["di Yɛ́sus aká yálɛ","cámɛɛn kǝ kǝbɔpka Y"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XAF","FCFA","fráŋ",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
     Knx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ksh'] = ["ksh",[["v.M.","n.M."],u,["Uhr vörmiddaachs","Uhr nommendaachs"]],[["v.M.","n.M."],u,["Vörmeddaach","Nommendaach"]],[["S","M","D","M","D","F","S"],["Su.","Mo.","Di.","Me.","Du.","Fr.","Sa."],["Sunndaach","Mohndaach","Dinnsdaach","Metwoch","Dunnersdaach","Friidaach","Samsdaach"],["Su","Mo","Di","Me","Du","Fr","Sa"]],u,[["J","F","M","A","M","J","J","O","S","O","N","D"],["Jan","Fäb","Mäz","Apr","Mai","Jun","Jul","Ouj","Säp","Okt","Nov","Dez"],["Jannewa","Fäbrowa","Määz","Aprell","Mai","Juuni","Juuli","Oujoß","Septämber","Oktohber","Novämber","Dezämber"]],[["J","F","M","A","M","J","J","O","S","O","N","D"],["Jan.","Fäb.","Mäz.","Apr.","Mai","Jun.","Jul.","Ouj.","Säp.","Okt.","Nov.","Dez."],["Jannewa","Fäbrowa","Määz","Aprell","Mai","Juuni","Juuli","Oujoß","Septämber","Oktohber","Novämber","Dezämber"]],[["vC","nC"],["v. Chr.","n. Chr."],["vür Krestos","noh Krestos"]],1,[6,0],["d. M. y","d. MMM. y","d. MMMM y","EEEE, 'dä' d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","×10^","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euro",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ۲gxr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ku'] = ["ku",[["BN","PN"],u,u],u,[["Y","D","S","Ç","P","Î","Ş"],["yş","dş","sş","çş","pş","în","ş"],["yekşem","duşem","sêşem","çarşem","pêncşem","în","şemî"],["yş","dş","sş","çş","pş","în","ş"]],u,[["R","R","A","A","G","P","T","G","R","K","S","B"],["rêb","reş","ada","avr","gul","pûş","tîr","gel","rez","kew","ser","ber"],["rêbendanê","reşemiyê","adarê","avrêlê","gulanê","pûşperê","tîrmehê","gelawêjê","rezberê","kewçêrê","sermawezê","berfanbarê"]],[["R","R","A","A","G","P","T","G","R","K","S","B"],["rêb","reş","ada","avr","gul","pûş","tîr","gel","rez","kew","ser","ber"],["rêbendan","reşemî","adar","avrêl","gulan","pûşper","tîrmeh","gelawêj","rezber","kewçêr","sermawez","berfanbar"]],[["BZ","PZ"],u,["berî zayînê","piştî zayînê"]],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","%#,##0","#,##0.00 ¤","#E0"],"TRY","₺","TRY",{"JPY":["JP¥","¥"],"TRY":["₺"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    )zxX/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 0)
    return 0;
if (n === 1)
    return 1;
if (n % 100 === 2 || (n % 100 === 22 || (n % 100 === 42 || (n % 100 === 62 || n % 100 === 82))) || (n % 1000 === 0 && (n % 100000 === Math.floor(n % 100000) && (n % 100000 >= 1000 && n % 100000 <= 20000 || (n % 100000 === 40000 || (n % 100000 === 60000 || n % 100000 === 80000)))) || !(n === 0) && n % 1000000 === 100000))
    return 2;
if (n % 100 === 3 || (n % 100 === 23 || (n % 100 === 43 || (n % 100 === 63 || n % 100 === 83))))
    return 3;
if (!(n === 1) && (n % 100 === 1 || (n % 100 === 21 || (n % 100 === 41 || (n % 100 === 61 || n % 100 === 81)))))
    return 4;
return 5;
}
    global.ng.common.locales['kw'] = ["kw",[["a.m.","p.m."],u,u],u,[["S","M","T","W","T","F","S"],["Sul","Lun","Mth","Mhr","Yow","Gwe","Sad"],["dy Sul","dy Lun","dy Meurth","dy Merher","dy Yow","dy Gwener","dy Sadorn"],["Sul","Lun","Mth","Mhr","Yow","Gwe","Sad"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Gen","Hwe","Meu","Ebr","Me","Met","Gor","Est","Gwn","Hed","Du","Kev"],["mis Genver","mis Hwevrer","mis Meurth","mis Ebrel","mis Me","mis Metheven","mis Gortheren","mis Est","mis Gwynngala","mis Hedra","mis Du","mis Kevardhu"]],u,[["RC","AD"],u,u],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"GBP","£","GBP",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    x)/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ky'] = ["ky",[["тң","тк"],u,["таңкы","түштөн кийинки"]],u,[["Ж","Д","Ш","Ш","Б","Ж","И"],["жек.","дүй.","шейш.","шарш.","бейш.","жума","ишм."],["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],["жш.","дш.","шш.","шр.","бш.","жм.","иш."]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","фев.","мар.","апр.","май","июн.","июл.","авг.","сен.","окт.","ноя.","дек."],["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"]],[["б.з.ч.","б.з."],u,["биздин заманга чейин","биздин заман"]],1,[6,0],["d/M/yy","y-'ж'., d-MMM","y-'ж'., d-MMMM","y-'ж'., d-MMMM, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","сан эмес",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"KGS","сом","Кыргызстан сому",{"AUD":[u,"$"],"BMD":[u,"BD$"],"BRL":[u,"R$"],"BSD":[u,"B$"],"BYN":[u,"р."],"BZD":[u,"BZ$"],"CAD":[u,"C$"],"DOP":[u,"RD$"],"EGP":[u,"LE"],"GBP":[u,"£"],"HKD":[u,"HK$"],"HRK":[u,"Kn"],"ILS":[u,"₪"],"INR":[u,"₹"],"JMD":[u,"J$"],"JPY":["JP¥","¥"],"KGS":["сом"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"THB":["฿"],"TTD":[u,"TT$"],"TWD":[u,"NT$"],"USD":[u,"$"],"XCD":[u,"$"]},"ltr", plural, [[["түн орт","чт","эртң мн","түшт кйн","кечк","түн"],["түн ортосу","чак түш","эртең менен","түштөн кийин","кечинде","түн ичинде"],u],[["түн ортосу","чак түш","эртең менен","түштөн кийин","кечкурун","түн"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    odxO/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (n === 0)
    return 0;
if ((i === 0 || i === 1) && !(n === 0))
    return 1;
return 5;
}
    global.ng.common.locales['lag'] = ["lag",[["TOO","MUU"],u,u],u,[["P","T","E","O","A","I","M"],["Píili","Táatu","Íne","Táano","Alh","Ijm","Móosi"],["Jumapíiri","Jumatátu","Jumaíne","Jumatáano","Alamíisi","Ijumáa","Jumamóosi"],["Píili","Táatu","Íne","Táano","Alh","Ijm","Móosi"]],u,[["F","N","K","I","I","I","M","V","S","I","S","S"],["Fúngatɨ","Naanɨ","Keenda","Ikúmi","Inyambala","Idwaata","Mʉʉnchɨ","Vɨɨrɨ","Saatʉ","Inyi","Saano","Sasatʉ"],["Kʉfúngatɨ","Kʉnaanɨ","Kʉkeenda","Kwiikumi","Kwiinyambála","Kwiidwaata","Kʉmʉʉnchɨ","Kʉvɨɨrɨ","Kʉsaatʉ","Kwiinyi","Kʉsaano","Kʉsasatʉ"]],u,[["KSA","KA"],u,["Kɨrɨsitʉ sɨ anavyaal","Kɨrɨsitʉ akavyaalwe"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"TZS","TSh","Shilíingi ya Taansanía",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    )\xm
;

if (n === 1	;g'] = ["lg",[["AM","PM"],u,u],u,[["S","B","L","L","L","L","L"],["Sab","Bal","Lw2","Lw3","Lw4","Lw5","Lw6"],["Sabbiiti","Balaza","Lwakubiri","Lwakusatu","Lwakuna","Lwakutaano","Lwamukaaga"],["Sab","Bal","Lw2","Lw3","Lw4","Lw5","Lw6"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apu","Maa","Juu","Jul","Agu","Seb","Oki","Nov","Des"],["Janwaliyo","Febwaliyo","Marisi","Apuli","Maayi","Juuni","Julaayi","Agusito","Sebuttemba","Okitobba","Novemba","Desemba"]],u,[["BC","AD"],u,["Kuli/sito nga tannaza","Bukya Kulisito Azaal"]],1,[02#,##0.00¤","#E0"],"UGX","USh","Silingi eya YugandUGX":["UB!vxh/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['lb'] = ["lb",[["mo.","nomë."],["moies","nomëttes"],u],[["moies","nomëttes"],u,u],[["S","M","D","M","D","F","S"],["Son.","Méi.","Dën.","Mët.","Don.","Fre.","Sam."],["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],["So.","Mé.","Dë.","Më.","Do.","Fr.","Sa."]],[["S","M","D","M","D","F","S"],["Son","Méi","Dën","Mët","Don","Fre","Sam"],["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],["So.","Mé.","Dë.","Më.","Do.","Fr.","Sa."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan.","Feb.","Mäe.","Abr.","Mee","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"]],[["v. Chr.","n. Chr."],u,u],1,[6,0],["dd.MM.yy","d. MMM y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euro",{"ATS":["öS"],"AUD":["AU$","$"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, []];
  })(globalThis);
    F#.\x=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['lkt'] = ["lkt",[["AM","PM"],u,u],u,[["A","W","N","Y","T","Z","O"],["Aŋpétuwakȟaŋ","Aŋpétuwaŋži","Aŋpétunuŋpa","Aŋpétuyamni","Aŋpétutopa","Aŋpétuzaptaŋ","Owáŋgyužažapi"],u,u],[["S","M","T","W","T","F","S"],["Aŋpétuwakȟaŋ","Aŋpétuwaŋži","Aŋpétunuŋpa","Aŋpétuyamni","Aŋpétutopa","Aŋpétuzaptaŋ","Owáŋgyužažapi"],u,u],[["1","2","3","4","5","6","7","8","9","10","11","12"],["Wiótheȟika Wí","Thiyóȟeyuŋka Wí","Ištáwičhayazaŋ Wí","Pȟežítȟo Wí","Čhaŋwápetȟo Wí","Wípazukȟa-wašté Wí","Čhaŋpȟásapa Wí","Wasútȟuŋ Wí","Čhaŋwápeǧi Wí","Čhaŋwápe-kasná Wí","Waníyetu Wí","Tȟahékapšuŋ Wí"],u],u,[["BCE","CE"],u,u],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"USD","$","USD",{"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    ixj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['ln-ao'] = ["ln-AO",[["ntɔ́ngɔ́","mpókwa"],u,u],u,[["e","y","m","m","m","m","p"],["eye","ybo","mbl","mst","min","mtn","mps"],["eyenga","mokɔlɔ mwa yambo","mokɔlɔ mwa míbalé","mokɔlɔ mwa mísáto","mokɔlɔ ya mínéi","mokɔlɔ ya mítáno","mpɔ́sɔ"],["eye","ybo","mbl","mst","min","mtn","mps"]],u,[["y","f","m","a","m","y","y","a","s","ɔ","n","d"],["yan","fbl","msi","apl","mai","yun","yul","agt","stb","ɔtb","nvb","dsb"],["sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé"]],u,[["libóso ya","nsima ya Y"],u,["Yambo ya Yézu Krís","Nsima ya Yézu Krís"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"AOA","Kz","Kwanza ya Angóla",{"AOA":["Kz"],"CDF":["FC"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    -hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['ln-cf'] = ["ln-CF",[["ntɔ́ngɔ́","mpókwa"],u,u],u,[["e","y","m","m","m","m","p"],["eye","ybo","mbl","mst","min","mtn","mps"],["eyenga","mokɔlɔ mwa yambo","mokɔlɔ mwa míbalé","mokɔlɔ mwa mísáto","mokɔlɔ ya mínéi","mokɔlɔ ya mítáno","mpɔ́sɔ"],["eye","ybo","mbl","mst","min","mtn","mps"]],u,[["y","f","m","a","m","y","y","a","s","ɔ","n","d"],["yan","fbl","msi","apl","mai","yun","yul","agt","stb","ɔtb","nvb","dsb"],["sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé"]],u,[["libóso ya","nsima ya Y"],u,["Yambo ya Yézu Krís","Nsima ya Yézu Krís"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XAF","FCFA","Falánga CFA BEAC",{"CDF":["FC"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    o))hxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['ln-cg'] = ["ln-CG",[["ntɔ́ngɔ́","mpókwa"],u,u],u,[["e","y","m","m","m","m","p"],["eye","ybo","mbl","mst","min","mtn","mps"],["eyenga","mokɔlɔ mwa yambo","mokɔlɔ mwa míbalé","mokɔlɔ mwa mísáto","mokɔlɔ ya mínéi","mokɔlɔ ya mítáno","mpɔ́sɔ"],["eye","ybo","mbl","mst","min","mtn","mps"]],u,[["y","f","m","a","m","y","y","a","s","ɔ","n","d"],["yan","fbl","msi","apl","mai","yun","yul","agt","stb","ɔtb","nvb","dsb"],["sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé"]],u,[["libóso ya","nsima ya Y"],u,["Yambo ya Yézu Krís","Nsima ya Yézu Krís"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XAF","FCFA","Falánga CFA BEAC",{"CDF":["FC"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    x	)hx|/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['ln'] = ["ln",[["ntɔ́ngɔ́","mpókwa"],u,u],u,[["e","y","m","m","m","m","p"],["eye","ybo","mbl","mst","min","mtn","mps"],["eyenga","mokɔlɔ mwa yambo","mokɔlɔ mwa míbalé","mokɔlɔ mwa mísáto","mokɔlɔ ya mínéi","mokɔlɔ ya mítáno","mpɔ́sɔ"],["eye","ybo","mbl","mst","min","mtn","mps"]],u,[["y","f","m","a","m","y","y","a","s","ɔ","n","d"],["yan","fbl","msi","apl","mai","yun","yul","agt","stb","ɔtb","nvb","dsb"],["sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé"]],u,[["libóso ya","nsima ya Y"],u,["Yambo ya Yézu Krís","Nsima ya Yézu Krís"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"CDF","FC","Falánga ya Kongó",{"CDF":["FC"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    )aIxf/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['lrc'] = ["lrc",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["جانڤیە","فئڤریە","مارس","آڤریل","مئی","جوٙأن","جوٙلا","آگوست","سئپتامر","ئوکتوڤر","نوڤامر","دئسامر"],u],u,[["BCE","CE"],u,u],6,[5,5],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"IRR","IRR","IRR",{"IQD":["د.ع.‏"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"rtl", plural, []];
  })(globalThis);
    Ox	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (n % 10 === 1 && !(n % 100 >= 11 && n % 100 <= 19))
    return 1;
if (n % 10 === Math.floor(n % 10) && (n % 10 >= 2 && n % 10 <= 9) && !(n % 100 >= 11 && n % 100 <= 19))
    return 3;
if (!(f === 0))
    return 4;
return 5;
}
    global.ng.common.locales['lt'] = ["lt",[["pr. p.","pop."],["priešpiet","popiet"],u],u,[["S","P","A","T","K","P","Š"],["sk","pr","an","tr","kt","pn","št"],["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],["Sk","Pr","An","Tr","Kt","Pn","Št"]],u,[["S","V","K","B","G","B","L","R","R","S","L","G"],["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."],["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio"]],[["S","V","K","B","G","B","L","R","R","S","L","G"],["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."],["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis"]],[["pr. Kr.","po Kr."],u,["prieš Kristų","po Kristaus"]],1,[6,0],["y-MM-dd",u,"y 'm'. MMMM d 'd'.","y 'm'. MMMM d 'd'., EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","×10^","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","Euras",{"AUD":[u,"$"],"BDT":[],"BRL":[u,"R$"],"BYN":[u,"Br"],"CAD":[u,"$"],"CNY":[u,"¥"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[],"INR":[],"JPY":[u,"¥"],"KHR":[],"KRW":[u,"₩"],"LAK":[],"MNT":[],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"PLN":[u,"zl"],"PYG":[u,"Gs"],"RUB":[u,"rb"],"TWD":[u,"$"],"USD":[u,"$"],"VND":[],"XAF":[],"XCD":[u,"$"],"XOF":[],"XPF":[]},"ltr", plural, [[["vidurnaktis","perpiet","rytas","popietė","vakaras","naktis"],u,u],[["vidurnaktis","vidurdienis","rytas","diena","vakaras","naktis"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    jL戸Wxx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['lu'] = ["lu",[["Dinda","Dilolo"],u,u],u,[["L","N","N","N","N","N","L"],["Lum","Nko","Ndy","Ndg","Njw","Ngv","Lub"],["Lumingu","Nkodya","Ndàayà","Ndangù","Njòwa","Ngòvya","Lubingu"],["Lum","Nko","Ndy","Ndg","Njw","Ngv","Lub"]],u,[["C","L","L","M","L","L","K","L","L","L","K","C"],["Cio","Lui","Lus","Muu","Lum","Luf","Kab","Lush","Lut","Lun","Kas","Cis"],["Ciongo","Lùishi","Lusòlo","Mùuyà","Lumùngùlù","Lufuimi","Kabàlàshìpù","Lùshìkà","Lutongolo","Lungùdi","Kaswèkèsè","Ciswà"]],u,[["kmp. Y.K.","kny. Y. K."],u,["Kumpala kwa Yezu Kli","Kunyima kwa Yezu Kli"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"CDF","FC","Nfalanga wa Kongu",{"CDF":["FC"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    θ[xG/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['luo'] = ["luo",[["OD","OT"],u,u],u,[["J","W","T","T","T","T","N"],["JMP","WUT","TAR","TAD","TAN","TAB","NGS"],["Jumapil","Wuok Tich","Tich Ariyo","Tich Adek","Tich Ang’wen","Tich Abich","Ngeso"],["JMP","WUT","TAR","TAD","TAN","TAB","NGS"]],u,[["C","R","D","N","B","U","B","B","C","P","C","P"],["DAC","DAR","DAD","DAN","DAH","DAU","DAO","DAB","DOC","DAP","DGI","DAG"],["Dwe mar Achiel","Dwe mar Ariyo","Dwe mar Adek","Dwe mar Ang’wen","Dwe mar Abich","Dwe mar Auchiel","Dwe mar Abiriyo","Dwe mar Aboro","Dwe mar Ochiko","Dwe mar Apar","Dwe mar gi achiel","Dwe mar Apar gi ariyo"]],u,[["BC","AD"],u,["Kapok Kristo obiro","Ka Kristo osebiro"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"KES","Ksh","Siling mar Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ^ᱤxA
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (n % 10 === 0 || (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 19) || v === 2 && (f % 100 === Math.floor(f % 100) && (f % 100 >= 11 && f % 100 <= 19))))
    return 0;
if (n % 10 === 1 && !(n % 100 === 11) || (v === 2 && (f % 10 === 1 && !(f % 100 === 11)) || !(v === 2) && f % 10 === 1))
    return 1;
return 5;
}
    global.ng.common.locales['lv'] = ["lv",[["priekšp.","pēcp."],u,["priekšpusdienā","pēcpusdienā"]],[["priekšp.","pēcpusd."],u,["priekšpusdiena","pēcpusdiena"]],[["S","P","O","T","C","P","S"],["svētd.","pirmd.","otrd.","trešd.","ceturtd.","piektd.","sestd."],["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],["Sv","Pr","Ot","Tr","Ce","Pk","Se"]],[["S","P","O","T","C","P","S"],["Svētd.","Pirmd.","Otrd.","Trešd.","Ceturtd.","Piektd.","Sestd."],["Svētdiena","Pirmdiena","Otrdiena","Trešdiena","Ceturtdiena","Piektdiena","Sestdiena"],["Sv","Pr","Ot","Tr","Ce","Pk","Se"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["janv.","febr.","marts","apr.","maijs","jūn.","jūl.","aug.","sept.","okt.","nov.","dec."],["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"]],u,[["p.m.ē.","m.ē."],u,["pirms mūsu ēras","mūsu ērā"]],1,[6,0],["dd.MM.yy","y. 'gada' d. MMM","y. 'gada' d. MMMM","EEEE, y. 'gada' d. MMMM"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NS",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","eiro",{"AUD":["AU$","$"],"BYN":[u,"р."],"GHS":[],"LVL":["Ls"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["pusnaktī","pusd.","no rīta","pēcpusd.","vakarā","naktī"],u,["pusnaktī","pusdienlaikā","no rīta","pēcpusdienā","vakarā","naktī"]],[["pusnakts","pusd.","rīts","pēcpusd.","vakars","nakts"],u,["pusnakts","pusdienlaiks","rīts","pēcpusdiena","vakars","nakts"]],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","23:00"],["23:00","06:00"]]]];
  })(globalThis);
    `%#xA	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['mai'] = ["mai",[["AM","PM"],u,["भोर","सांझ"]],[["AM","PM"],u,u],[["र","सो","मं","बु","गु","शु","श"],["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],["रवि दिन","सोम दिन","मंगल दिन","बुध दिन","बृहस्पति दिन","शुक्र दिन","शनि दिन"],["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"]],u,[["ज","फ","मा","अ","म","जू","जु","अ","सि","अ","न","दि"],["जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"],["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"]],[["ज","फ","मा","अ","म","जू","जु","अ","सि","अ","न","दि"],["जन॰","फर॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"],["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"]],[["ईसा-पूर्व","ईसवी"],u,u],0,[0,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} के {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","[#E0]"],"INR","₹","भारतीय रुपया",{"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    !{`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['mas-tz'] = ["mas-TZ",[["Ɛnkakɛnyá","Ɛndámâ"],u,u],u,[["2","3","4","5","6","7","1"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"],["Jumapílí","Jumatátu","Jumane","Jumatánɔ","Alaámisi","Jumáa","Jumamósi"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Dal","Ará","Ɔɛn","Doy","Lép","Rok","Sás","Bɔ́r","Kús","Gís","Shʉ́","Ntʉ́"],["Oladalʉ́","Arát","Ɔɛnɨ́ɔɨŋɔk","Olodoyíóríê inkókúâ","Oloilépūnyīē inkókúâ","Kújúɔrɔk","Mórusásin","Ɔlɔ́ɨ́bɔ́rárɛ","Kúshîn","Olgísan","Pʉshʉ́ka","Ntʉ́ŋʉ́s"]],u,[["MY","EY"],u,["Meínō Yɛ́sʉ","Eínō Yɛ́sʉ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"TZS","TSh","Iropiyianí e Tanzania",{"JPY":["JP¥","¥"],"KES":["Ksh"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    y6^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['mas'] = ["mas",[["Ɛnkakɛnyá","Ɛndámâ"],u,u],u,[["2","3","4","5","6","7","1"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"],["Jumapílí","Jumatátu","Jumane","Jumatánɔ","Alaámisi","Jumáa","Jumamósi"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Dal","Ará","Ɔɛn","Doy","Lép","Rok","Sás","Bɔ́r","Kús","Gís","Shʉ́","Ntʉ́"],["Oladalʉ́","Arát","Ɔɛnɨ́ɔɨŋɔk","Olodoyíóríê inkókúâ","Oloilépūnyīē inkókúâ","Kújúɔrɔk","Mórusásin","Ɔlɔ́ɨ́bɔ́rárɛ","Kúshîn","Olgísan","Pʉshʉ́ka","Ntʉ́ŋʉ́s"]],u,[["MY","EY"],u,["Meínō Yɛ́sʉ","Eínō Yɛ́sʉ"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Iropiyianí e Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    @B#yx5
+er'] = ["mer",[["RŨ","ŨG"],u,u],u,[["K","M","W","W","W","W","J"],["KIU","MRA","WAI","WET","WEN","WTN","JUM"],["Kiumia","Muramuko","Wairi","Wethatu","Wena","Wetano","Jumamosi"],["KIU","MRA","WAI","WET","WEN","WTN","JUM"]],u,[["J","F","M","Ĩ","M","N","N","A","S","O","N","D"],["JAN","FEB","MAC","ĨPU","MĨĨ","NJU","NJR","AGA","SPT","OKT","NOV","DEC"],["Januarĩ","Feburuarĩ","Machi","Ĩpurũ","Mĩĩ","Njuni","Njuraĩ","Agasti","Septemba","Oktũba","Novemba","Dicemba"]],u,[["MK","NK"],u,["Mbere ya Kristũ","Nyuma ya KristũShilingi yahRx(/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['mfe'] = ["mfe",[["AM","PM"],u,u],u,[["d","l","m","m","z","v","s"],["dim","lin","mar","mer","ze","van","sam"],["dimans","lindi","mardi","merkredi","zedi","vandredi","samdi"],["dim","lin","mar","mer","ze","van","sam"]],u,[["z","f","m","a","m","z","z","o","s","o","n","d"],["zan","fev","mar","avr","me","zin","zil","out","sep","okt","nov","des"],["zanvie","fevriye","mars","avril","me","zin","zilye","out","septam","oktob","novam","desam"]],u,[["av. Z-K","ap. Z-K"],u,["avan Zezi-Krist","apre Zezi-Krist"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],["."," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MUR","Rs","roupi morisien",{"JPY":["JP¥","¥"],"MUR":["Rs"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    PXx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['mg'] = ["mg",[["AM","PM"],u,u],u,[["A","A","T","A","A","Z","A"],["Alah","Alats","Tal","Alar","Alak","Zom","Asab"],["Alahady","Alatsinainy","Talata","Alarobia","Alakamisy","Zoma","Asabotsy"],["Alah","Alats","Tal","Alar","Alak","Zom","Asab"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","Mey","Jon","Jol","Aog","Sep","Okt","Nov","Des"],["Janoary","Febroary","Martsa","Aprily","Mey","Jona","Jolay","Aogositra","Septambra","Oktobra","Novambra","Desambra"]],u,[["BC","AD"],u,["Alohan’i JK","Aorian’i JK"]],1,[6,0],["y-MM-dd","y MMM d","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MGA","Ar","Ariary",{"JPY":["JP¥","¥"],"MGA":["Ar"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    B\x?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['mgh'] = ["mgh",[["wichishu","mchochil’l"],u,u],u,[["S","J","J","J","A","I","J"],["Sab","Jtt","Jnn","Jtn","Ara","Iju","Jmo"],["Sabato","Jumatatu","Jumanne","Jumatano","Arahamisi","Ijumaa","Jumamosi"],["Sab","Jtt","Jnn","Jtn","Ara","Iju","Jmo"]],u,[["K","U","R","C","T","M","S","N","T","K","M","Y"],["Kwa","Una","Rar","Che","Tha","Moc","Sab","Nan","Tis","Kum","Moj","Yel"],["Mweri wo kwanza","Mweri wo unayeli","Mweri wo uneraru","Mweri wo unecheshe","Mweri wo unethanu","Mweri wo thanu na mocha","Mweri wo saba","Mweri wo nane","Mweri wo tisa","Mweri wo kumi","Mweri wo kumi na moja","Mweri wo kumi na yel’li"]],u,[["HY","YY"],u,["Hinapiya yesu","Yopia yesu"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MZN","MTn","MZN",{"JPY":["JP¥","¥"],"MZN":["MTn"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    |@κ[xE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['mgo'] = ["mgo",[["AM","PM"],u,u],u,[["A1","A2","A3","A4","A5","A6","A7"],["Aneg 1","Aneg 2","Aneg 3","Aneg 4","Aneg 5","Aneg 6","Aneg 7"],u,["1","2","3","4","5","6","7"]],u,[["M1","A2","M3","N4","F5","I6","A7","I8","K9","10","11","12"],["mbegtug","imeg àbùbì","imeg mbəŋchubi","iməg ngwə̀t","iməg fog","iməg ichiibɔd","iməg àdùmbə̀ŋ","iməg ichika","iməg kud","iməg tèsiʼe","iməg zò","iməg krizmed"],["iməg mbegtug","imeg àbùbì","imeg mbəŋchubi","iməg ngwə̀t","iməg fog","iməg ichiibɔd","iməg àdùmbə̀ŋ","iməg ichika","iməg kud","iməg tèsiʼe","iməg zò","iməg krizmed"]],u,[["BCE","CE"],u,u],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","EEEE, y MMMM dd"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XAF","FCFA","shirè",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ˡTxJ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['mi'] = ["mi",[["AM","PM"],u,u],u,[["T","H","T","A","P","M","H"],["Tap","Hin","Tū","Apa","Par","Mer","Hor"],["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],["Tap","Hin","Tū","Apa","Par","Mer","Hor"]],u,[["K","H","P","P","H","P","H","H","M","N","R","H"],["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki"],["Kohitātea","Huitanguru","Poutūterangi","Paengawhāwhā","Haratua","Pipiri","Hōngongoi","Hereturikōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea"]],u,[["BCE","CE"],u,u],1,[6,0],["dd-MM-y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"NZD","$","Tāra o Aotearoa",{"NZD":["$"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    @x{/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
return 5;
}
    global.ng.common.locales['mk'] = ["mk",[["претпл.","попл."],u,["претпладне","попладне"]],u,[["н","п","в","с","ч","п","с"],["нед.","пон.","вто.","сре.","чет.","пет.","саб."],["недела","понеделник","вторник","среда","четврток","петок","сабота"],["нед.","пон.","вто.","сре.","чет.","пет.","саб."]],u,[["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],["јан.","фев.","мар.","апр.","мај","јун.","јул.","авг.","септ.","окт.","ноем.","дек."],["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"]],u,[["п.н.е.","н.е."],u,["пред нашата ера","од нашата ера"]],1,[6,0],["d.M.yy","d.M.y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, 'во' {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"MKD","ден.","Македонски денар",{"AUD":[u,"$"],"BYN":[u,"р."],"CNY":[u,"¥"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MKD":["ден."],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["полн.","напл.","утро","претпл.","попл.","веч.","ноќе"],["полноќ","напладне","наутро","претпладне","попладне","навечер","ноќе"],["полноќ","напладне","наутро","претпладне","попладне","навечер","по полноќ"]],[["полноќ","пладне","наутро","претпл.","попл.","навечер","по полноќ"],["полноќ","напладне","наутро","претпл.","попл.","навечер","по полноќ"],["на полноќ","напладне","наутро","претпладне","попладне","навечер","по полноќ"]],["00:00","12:00",["04:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    6xw/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['mn'] = ["mn",[["ү.ө.","ү.х."],u,u],u,[["Ня","Да","Мя","Лх","Пү","Ба","Бя"],u,["ням","даваа","мягмар","лхагва","пүрэв","баасан","бямба"],["Ня","Да","Мя","Лх","Пү","Ба","Бя"]],[["Ня","Да","Мя","Лх","Пү","Ба","Бя"],u,["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],["Ня","Да","Мя","Лх","Пү","Ба","Бя"]],[["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII"],["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"],["нэгдүгээр сар","хоёрдугаар сар","гуравдугаар сар","дөрөвдүгээр сар","тавдугаар сар","зургаадугаар сар","долоодугаар сар","наймдугаар сар","есдүгээр сар","аравдугаар сар","арван нэгдүгээр сар","арван хоёрдугаар сар"]],[["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII"],["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"],["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургаадугаар сар","Долоодугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"]],[["МЭӨ","МЭ"],u,["манай эриний өмнөх","манай эриний"]],1,[6,0],["y.MM.dd","y 'оны' MMM'ын' d","y 'оны' MMMM'ын' d","y 'оны' MMMM'ын' d, EEEE 'гараг'"],["HH:mm","HH:mm:ss","HH:mm:ss (z)","HH:mm:ss (zzzz)"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MNT","₮","Монгол төгрөг",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"MNT":["₮"],"PHP":[u,"₱"],"SEK":[u,"кр"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["шөнө дунд","үд дунд","өглөө","өдөр","орой","шөнө"],u,u],u,["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    9;x	>/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['mni-beng'] = ["mni-Beng",[["নুমাং","PM"],u,["এ এম","পি এম"]],[["নুমাং","PM"],u,u],[["নোং","নিং","লৈবা","য়ুম","শগো","ইরা","থাং"],["নোংমাইজিং","নিংথৌকাবা","লৈবাকপোকপা","য়ুমশকৈশা","শগোলশেন","ইরাই","থাংজ"],u,u],[["নো","নিং","লৈ","য়ুম","শগ","ইরা","থাং"],["নোংমাইজিং","নিংথৌকাবা","লৈবাকপোকপা","য়ুমশকৈশা","শগোলশেন","ইরাই","থাংজ"],u,u],[["জা","ফে","মার","এপ","মে","জুন","জুল","আ","সে","ওক","নব","ডি"],["জানুৱারি","ফেব্রুৱারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","ওক্টোবর","নভেম্বর","ডিসেম্বর"],u],[["জা","ফে","মার","এপ","মে","জুন","জুল","আ","সে","ও","নব","ডি"],["জানু","ফেব্রু","মার","এপ্রি","মে","জুন","জুলা","আগ","সেপ্ট","ওক্টো","নভে","ডিসে"],["জানুৱারি","ফেব্রুৱারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","ওগষ্ট","সেপ্টেম্বর","ওক্টোবর","নবেম্বর","ডিসেম্বর"]],[["খৃ: মমাং","খৃ: মতুং"],u,u],0,[0,0],["d/M/yy","MMM d, y","MMMM d, y","MMMM d, y, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} গী {0} দা",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","ইন্দিয়ান রুপী",{"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    h"귛x	H/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['mni'] = ["mni",[["নুমাং","PM"],u,["এ এম","পি এম"]],[["নুমাং","PM"],u,u],[["নোং","নিং","লৈবা","য়ুম","শগো","ইরা","থাং"],["নোংমাইজিং","নিংথৌকাবা","লৈবাকপোকপা","য়ুমশকৈশা","শগোলশেন","ইরাই","থাংজ"],u,u],[["নো","নিং","লৈ","য়ুম","শগ","ইরা","থাং"],["নোংমাইজিং","নিংথৌকাবা","লৈবাকপোকপা","য়ুমশকৈশা","শগোলশেন","ইরাই","থাংজ"],u,u],[["জা","ফে","মার","এপ","মে","জুন","জুল","আ","সে","ওক","নব","ডি"],["জানুৱারি","ফেব্রুৱারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","ওক্টোবর","নভেম্বর","ডিসেম্বর"],u],[["জা","ফে","মার","এপ","মে","জুন","জুল","আ","সে","ও","নব","ডি"],["জানু","ফেব্রু","মার","এপ্রি","মে","জুন","জুলা","আগ","সেপ্ট","ওক্টো","নভে","ডিসে"],["জানুৱারি","ফেব্রুৱারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","ওগষ্ট","সেপ্টেম্বর","ওক্টোবর","নবেম্বর","ডিসেম্বর"]],[["খৃ: মমাং","খৃ: মতুং"],u,u],0,[0,0],["d/M/yy","MMM d, y","MMMM d, y","MMMM d, y, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} গী {0} দা",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","ইন্দিয়ান রুপী",{"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    sxxY
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['mr'] = ["mr",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["र","सो","मं","बु","गु","शु","श"],["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],["र","सो","मं","बु","गु","शु","श"]],u,[["जा","फे","मा","ए","मे","जू","जु","ऑ","स","ऑ","नो","डि"],["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"],["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"]],u,[["इ. स. पू.","इ. स."],u,["ईसवीसनपूर्व","ईसवीसन"]],0,[0,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} रोजी {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##0%","¤#,##0.00","[#E0]"],"INR","₹","भारतीय रुपया",{"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["म.रा.","दु","प","स","दु","सं","सा","रा"],["मध्यरात्र","मध्यान्ह","पहाट","सकाळ","दुपार","संध्याकाळ","सायंकाळ","रात्र"],u],[["म.रा.","म","प","स","दु","सं","सा","रात्र"],["मध्यरात्र","मध्यान्ह","पहाट","सकाळ","दुपार","संध्याकाळ","सायंकाळ","रात्र"],u],["00:00","12:00",["04:00","06:00"],["06:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    apеixj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ms-bn'] = ["ms-BN",[["a","p"],["PG","PTG"],u],u,[["A","I","S","R","K","J","S"],["Ahd","Isn","Sel","Rab","Kha","Jum","Sab"],["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],["Ah","Is","Se","Ra","Kh","Ju","Sa"]],u,[["J","F","M","A","M","J","J","O","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"]],u,[["S.M.","TM"],u,u],1,[6,0],["d/MM/yy","d MMM y","d MMMM y","dd MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"BND","$","Dolar Brunei",{"BND":["$"],"BYN":[u,"р."],"CAD":[u,"$"],"JPY":["JP¥","¥"],"MXN":[u,"$"],"MYR":["RM"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":[u,"$"]},"ltr", plural, [[["pagi","pagi","tengah hari","petang","malam"],u,["tengah malam","pagi","tengah hari","petang","malam"]],[["pagi","pagi","tengah hari","petang","malam"],["tengah malam","pagi","tengah hari","petang","malam"],u],[["00:00","01:00"],["01:00","12:00"],["12:00","14:00"],["14:00","19:00"],["19:00","24:00"]]]];
  })(globalThis);
    BҼixc/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ms-id'] = ["ms-ID",[["a","p"],["PG","PTG"],u],u,[["A","I","S","R","K","J","S"],["Ahd","Isn","Sel","Rab","Kha","Jum","Sab"],["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],["Ah","Is","Se","Ra","Kh","Ju","Sa"]],u,[["J","F","M","A","M","J","J","O","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"]],u,[["S.M.","TM"],u,u],0,[6,0],["dd/MM/yy","d MMM y","d MMMM y","EEEE, dd MMMM y"],["HH.mm","HH.mm.ss","HH.mm.ss z","HH.mm.ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN","."],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"IDR","Rp","Rupiah Indonesia",{"BYN":[u,"р."],"CAD":[u,"$"],"IDR":["Rp"],"JPY":["JP¥","¥"],"MXN":[u,"$"],"MYR":["RM"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":[u,"$"]},"ltr", plural, [[["pagi","pagi","tengah hari","petang","malam"],u,["tengah malam","pagi","tengah hari","petang","malam"]],[["pagi","pagi","tengah hari","petang","malam"],["tengah malam","pagi","tengah hari","petang","malam"],u],[["00:00","01:00"],["01:00","12:00"],["12:00","14:00"],["14:00","19:00"],["19:00","24:00"]]]];
  })(globalThis);
    ;jgixd/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ms-sg'] = ["ms-SG",[["a","p"],["PG","PTG"],u],u,[["A","I","S","R","K","J","S"],["Ahd","Isn","Sel","Rab","Kha","Jum","Sab"],["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],["Ah","Is","Se","Ra","Kh","Ju","Sa"]],u,[["J","F","M","A","M","J","J","O","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"]],u,[["S.M.","TM"],u,u],0,[6,0],["d/MM/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"SGD","$","Dolar Singapura",{"BYN":[u,"р."],"CAD":[u,"$"],"JPY":["JP¥","¥"],"MXN":[u,"$"],"MYR":["RM"],"PHP":[u,"₱"],"SGD":["$"],"TWD":["NT$"],"USD":[u,"$"]},"ltr", plural, [[["pagi","pagi","tengah hari","petang","malam"],u,["tengah malam","pagi","tengah hari","petang","malam"]],[["pagi","pagi","tengah hari","petang","malam"],["tengah malam","pagi","tengah hari","petang","malam"],u],[["00:00","01:00"],["01:00","12:00"],["12:00","14:00"],["14:00","19:00"],["19:00","24:00"]]]];
  })(globalThis);
    Xػhxt/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ms'] = ["ms",[["a","p"],["PG","PTG"],u],u,[["A","I","S","R","K","J","S"],["Ahd","Isn","Sel","Rab","Kha","Jum","Sab"],["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],["Ah","Is","Se","Ra","Kh","Ju","Sa"]],u,[["J","F","M","A","M","J","J","O","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"]],u,[["S.M.","TM"],u,u],1,[6,0],["d/MM/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"MYR","RM","Ringgit Malaysia",{"BYN":[u,"р."],"CAD":[u,"$"],"JPY":["JP¥","¥"],"MXN":[u,"$"],"MYR":["RM"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":[u,"$"]},"ltr", plural, [[["pagi","pagi","tengah hari","petang","malam"],u,["tengah malam","pagi","tengah hari","petang","malam"]],[["pagi","pagi","tengah hari","petang","malam"],["tengah malam","pagi","tengah hari","petang","malam"],u],[["00:00","01:00"],["01:00","12:00"],["12:00","14:00"],["14:00","19:00"],["19:00","24:00"]]]];
  })(globalThis);
    yax!/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 10))
    return 3;
if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 19))
    return 4;
return 5;
}
    global.ng.common.locales['mt'] = ["mt",[["am","pm"],["AM","PM"],u],u,[["Ħd","T","Tl","Er","Ħm","Ġm","Sb"],["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"]],[["Ħd","Tn","Tl","Er","Ħm","Ġm","Sb"],["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"]],[["J","F","M","A","M","Ġ","L","A","S","O","N","D"],["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"],["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"]],[["Jn","Fr","Mz","Ap","Mj","Ġn","Lj","Aw","St","Ob","Nv","Dċ"],["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"],["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"]],[["QK","WK"],u,["Qabel Kristu","Wara Kristu"]],0,[6,0],["dd/MM/y","dd MMM y","d 'ta'’ MMMM y","EEEE, d 'ta'’ MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"EUR","€","ewro",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
     fXxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['mua'] = ["mua",[["comme","lilli"],u,u],u,[["Y","L","Z","O","A","G","E"],["Cya","Cla","Czi","Cko","Cka","Cga","Cze"],["Com’yakke","Comlaaɗii","Comzyiiɗii","Comkolle","Comkaldǝɓlii","Comgaisuu","Comzyeɓsuu"],["Cya","Cla","Czi","Cko","Cka","Cga","Cze"]],u,[["O","A","I","F","D","B","L","M","E","U","W","Y"],["FLO","CLA","CKI","FMF","MAD","MBI","MLI","MAM","FDE","FMU","FGW","FYU"],["Fĩi Loo","Cokcwaklaŋne","Cokcwaklii","Fĩi Marfoo","Madǝǝuutǝbijaŋ","Mamǝŋgwãafahbii","Mamǝŋgwãalii","Madǝmbii","Fĩi Dǝɓlii","Fĩi Mundaŋ","Fĩi Gwahlle","Fĩi Yuru"]],u,[["KK","PK"],u,["KǝPel Kristu","Pel Kristu"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"XAF","FCFA","solai BEAC",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    yx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['my'] = ["my",[["နံနက်","ညနေ"],u,u],u,[["တ","တ","အ","ဗ","က","သ","စ"],["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],u,u],u,[["ဇ","ဖ","မ","ဧ","မ","ဇ","ဇ","ဩ","စ","အ","န","ဒ"],["ဇန်","ဖေ","မတ်","ဧ","မေ","ဇွန်","ဇူ","ဩ","စက်","အောက်","နို","ဒီ"],["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"]],u,[["ဘီစီ","အဒေီ"],u,["ခရစ်တော် မပေါ်မီနှစ်","ခရစ်နှစ်"]],0,[6,0],["dd-MM-yy","y- MMM d","y- MMMM d","y- MMMM d- EEEE"],["H:mm","H:mm:ss","z HH:mm:ss","zzzz HH:mm:ss"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","ဂဏန်းမဟုတ်သော",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"MMK","K","မြန်မာ ကျပ်",{"ANG":["NAf"],"AWG":["Afl"],"BBD":[u,"Bds$"],"BSD":[u,"B$"],"BYN":[u,"р."],"HTG":["G"],"JPY":["JP¥","¥"],"MMK":["K"],"PAB":["B/."],"PHP":[u,"₱"],"THB":["฿"],"TTD":["TT$","$"],"USD":["US$","$"]},"ltr", plural, [[["သန်းခေါင်ယံ","မွန်းတည့်","နံနက်","နေ့လယ်","ညနေ","ည"],u,u],u,["00:00","12:00",["00:00","12:00"],["12:00","16:00"],["16:00","19:00"],["19:00","24:00"]]]];
  })(globalThis);
    2wLx?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['mzn'] = ["mzn",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],u],u,[["پ.م","م."],u,["قبل میلاد","بعد میلاد"]],6,[5,5],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"IRR","IRR","ایران ریال",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"]},"rtl", plural, []];
  })(globalThis);
    cU^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
return 5;
}
    global.ng.common.locales['naq'] = ["naq",[["ǁgoagas","ǃuias"],u,u],u,[["S","M","E","W","D","F","A"],["Son","Ma","De","Wu","Do","Fr","Sat"],["Sontaxtsees","Mantaxtsees","Denstaxtsees","Wunstaxtsees","Dondertaxtsees","Fraitaxtsees","Satertaxtsees"],["Son","Ma","De","Wu","Do","Fr","Sat"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["ǃKhanni","ǃKhanǀgôab","ǀKhuuǁkhâb","ǃHôaǂkhaib","ǃKhaitsâb","Gamaǀaeb","ǂKhoesaob","Aoǁkhuumûǁkhâb","Taraǀkhuumûǁkhâb","ǂNûǁnâiseb","ǀHooǂgaeb","Hôasoreǁkhâb"]],u,[["BC","AD"],u,["Xristub aiǃâ","Xristub khaoǃgâ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZAR","ZAR","South African Randi",{"JPY":["JP¥","¥"],"NAD":["$"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    p=-xM	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['nb-sj'] = ["nb-SJ",[["a","p"],["a.m.","p.m."],u],[["a.m.","p.m."],u,u],[["S","M","T","O","T","F","L"],["søn.","man.","tir.","ons.","tor.","fre.","lør."],["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],["sø.","ma.","ti.","on.","to.","fr.","lø."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"]],[["f.Kr.","e.Kr."],u,["før Kristus","etter Kristus"]],1,[6,0],["dd.MM.y","d. MMM y","d. MMMM y","EEEE d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'kl'. {0}",u],[","," ",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00;¤ -#,##0.00","#E0"],"NOK","kr","norske kroner",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NOK":["kr"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XPF":[],"XXX":[]},"ltr", plural, [[["mn.","mg.","fm.","em.","kv.","nt."],["midn.","morg.","form.","etterm.","kveld","natt"],["midnatt","på morgenen","på formiddagen","på ettermiddagen","på kvelden","på natten"]],[["mn.","mg.","fm.","em.","kv.","nt."],["midn.","morg.","form.","etterm.","kveld","natt"],["midnatt","morgen","formiddag","ettermiddag","kveld","natt"]],["00:00",["06:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    ?xG	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['nb'] = ["nb",[["a","p"],["a.m.","p.m."],u],[["a.m.","p.m."],u,u],[["S","M","T","O","T","F","L"],["søn.","man.","tir.","ons.","tor.","fre.","lør."],["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],["sø.","ma.","ti.","on.","to.","fr.","lø."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"]],[["f.Kr.","e.Kr."],u,["før Kristus","etter Kristus"]],1,[6,0],["dd.MM.y","d. MMM y","d. MMMM y","EEEE d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'kl'. {0}",u],[","," ",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00;¤ -#,##0.00","#E0"],"NOK","kr","norske kroner",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NOK":["kr"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XPF":[],"XXX":[]},"ltr", plural, [[["mn.","mg.","fm.","em.","kv.","nt."],["midn.","morg.","form.","etterm.","kveld","natt"],["midnatt","på morgenen","på formiddagen","på ettermiddagen","på kvelden","på natten"]],[["mn.","mg.","fm.","em.","kv.","nt."],["midn.","morg.","form.","etterm.","kveld","natt"],["midnatt","morgen","formiddag","ettermiddag","kveld","natt"]],["00:00",["06:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    69!Vxe/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['nd'] = ["nd",[["AM","PM"],u,u],u,[["S","M","S","S","S","S","M"],["Son","Mvu","Sib","Sit","Sin","Sih","Mgq"],["Sonto","Mvulo","Sibili","Sithathu","Sine","Sihlanu","Mgqibelo"],["Son","Mvu","Sib","Sit","Sin","Sih","Mgq"]],u,[["Z","N","M","M","N","N","N","N","M","M","L","M"],["Zib","Nhlo","Mbi","Mab","Nkw","Nhla","Ntu","Ncw","Mpan","Mfu","Lwe","Mpal"],["Zibandlela","Nhlolanja","Mbimbitho","Mabasa","Nkwenkwezi","Nhlangula","Ntulikazi","Ncwabakazi","Mpandula","Mfumfu","Lwezi","Mpalakazi"]],u,[["BC","AD"],u,["UKristo angakabuyi","Ukristo ebuyile"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","US$","Dola yase Amelika",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    'v\x3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['qu-bo'] = ["qu-BO",[["a.m.","p.m."],u,u],u,[["D","L","M","X","J","V","S"],["Dom","Lun","Mar","Mié","Jue","Vie","Sab"],["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],["Dom","Lun","Mar","Mié","Jue","Vie","Sab"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Set","Oct","Nov","Dic"],["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Setiembre","Octubre","Noviembre","Diciembre"]],u,[["a.d.","dC"],["a.d.","d.C."],["ñawpa cristu","chanta cristu"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{0} {1}","{1} {0}"],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00","#E0"],"BOB","Bs","Boliviano",{"BBD":["BBG","$"],"BMD":["DBM","$"],"BOB":["Bs"],"BZD":["DBZ","$"],"CAD":["$CA","$"],"GHS":[u,"GHC"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"USD":["$US","$"]},"ltr", plural, []];
  })(globalThis);
    ݧYxvnds-nl'] = ["nds-NL",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],u,u],u,[["14M01","M02","M03","M04","M05","M06","M07","M08","M09","M10","M11","M12"],u],u,[["BCE","CE"],u,u],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE0Bu,u],[".",",EK%","¤ #,##0.00","#E0"],"EUR","€","EUR",{"JPY":["JP¥","¥"],"USD":["US$2QeABx'/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['nds'] = ["nds",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["M01","M02","M03","M04","M05","M06","M07","M08","M09","M10","M11","M12"],u],u,[["BCE","CE"],u,u],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"EUR","€","EUR",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    O%%bx5
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ne-in'] = ["ne-IN",[["पूर्वाह्न","अपराह्न"],u,u],u,[["आ","सो","म","बु","बि","शु","श"],["आइत","सोम","मङ्गल","बुध","बिहि","शुक्र","शनि"],["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहिबार","शुक्रबार","शनिबार"],["आइत","सोम","मङ्गल","बुध","बिहि","शुक्र","शनि"]],u,[["जन","फेब","मार्च","अप्र","मे","जुन","जुल","अग","सेप","अक्टो","नोभे","डिसे"],["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],u],[["जन","फेेब","मार्च","अप्र","मे","जुन","जुल","अग","सेप","अक्टो","नोभे","डिसे"],["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],u],[["ईसा पूर्व","सन्"],u,u],0,[0,0],["yy/M/d","y MMM d","y MMMM d","y MMMM d, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤ #,##,##0.00","#E0"],"INR","₹","भारतीय रूपिँया",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"NPR":["नेरू","रू"],"PHP":[u,"₱"],"THB":["฿"],"USD":["US$","$"]},"ltr", plural, [[["मध्यरात","मध्यान्ह","बिहान","अपरान्ह","साँझ","बेलुकी","रात"],u,u],u,["00:00","12:00",["04:00","12:00"],["12:00","16:00"],["16:00","19:00"],["19:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    ֟x4
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ne'] = ["ne",[["पूर्वाह्न","अपराह्न"],u,u],u,[["आ","सो","म","बु","बि","शु","श"],["आइत","सोम","मङ्गल","बुध","बिहि","शुक्र","शनि"],["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहिबार","शुक्रबार","शनिबार"],["आइत","सोम","मङ्गल","बुध","बिहि","शुक्र","शनि"]],u,[["जन","फेब","मार्च","अप्र","मे","जुन","जुल","अग","सेप","अक्टो","नोभे","डिसे"],["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],u],[["जन","फेेब","मार्च","अप्र","मे","जुन","जुल","अग","सेप","अक्टो","नोभे","डिसे"],["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],u],[["ईसा पूर्व","सन्"],u,u],0,[6,0],["yy/M/d","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤ #,##,##0.00","#E0"],"NPR","नेरू","नेपाली रूपैयाँ",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"NPR":["नेरू","रू"],"PHP":[u,"₱"],"THB":["฿"],"USD":["US$","$"]},"ltr", plural, [[["मध्यरात","मध्यान्ह","बिहान","अपरान्ह","साँझ","बेलुकी","रात"],u,u],u,["00:00","12:00",["04:00","12:00"],["12:00","16:00"],["16:00","19:00"],["19:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    jvxo/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['nl-aw'] = ["nl-AW",[["a.m.","p.m."],u,u],u,[["Z","M","D","W","D","V","Z"],["zo","ma","di","wo","do","vr","za"],["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],["zo","ma","di","wo","do","vr","za"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]],u,[["v.C.","n.C."],["v.Chr.","n.Chr."],["voor Christus","na Christus"]],1,[6,0],["dd-MM-y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'om' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤ -#,##0.00","#E0"],"AWG","Afl.","Arubaanse gulden",{"AUD":["AU$","$"],"AWG":["Afl."],"BYN":[u,"р."],"CAD":["C$","$"],"FJD":["FJ$","$"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RUR":[u,"р."],"SBD":["SI$","$"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XPF":[],"XXX":[]},"ltr", plural, [[["middernacht","’s ochtends","’s middags","’s avonds","’s nachts"],u,u],[["middernacht","ochtend","middag","avond","nacht"],u,u],["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    Y$uxR/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['nl-be'] = ["nl-BE",[["a.m.","p.m."],u,u],u,[["Z","M","D","W","D","V","Z"],["zo","ma","di","wo","do","vr","za"],["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],["zo","ma","di","wo","do","vr","za"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]],u,[["v.C.","n.C."],["v.Chr.","n.Chr."],["voor Christus","na Christus"]],1,[6,0],["d/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'om' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤ -#,##0.00","#E0"],"EUR","€","Euro",{"AUD":["AU$","$"],"BYN":[u,"р."],"CAD":["C$","$"],"FJD":["FJ$","$"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RUR":[u,"р."],"SBD":["SI$","$"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XPF":[],"XXX":[]},"ltr", plural, [[["middernacht","’s ochtends","’s middags","’s avonds","’s nachts"],u,u],[["middernacht","ochtend","middag","avond","nacht"],u,u],["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    9txM/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['nl-bq'] = ["nl-BQ",[["a.m.","p.m."],u,u],u,[["Z","M","D","W","D","V","Z"],["zo","ma","di","wo","do","vr","za"],["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],["zo","ma","di","wo","do","vr","za"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]],u,[["v.C.","n.C."],["v.Chr.","n.Chr."],["voor Christus","na Christus"]],1,[6,0],["dd-MM-y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'om' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤ -#,##0.00","#E0"],"USD","$","Amerikaanse dollar",{"AUD":["AU$","$"],"BYN":[u,"р."],"CAD":["C$","$"],"FJD":["FJ$","$"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RUR":[u,"р."],"SBD":["SI$","$"],"THB":["฿"],"TWD":["NT$"],"XPF":[],"XXX":[]},"ltr", plural, [[["middernacht","’s ochtends","’s middags","’s avonds","’s nachts"],u,u],[["middernacht","ochtend","middag","avond","nacht"],u,u],["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    Iwx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['nl-cw'] = ["nl-CW",[["a.m.","p.m."],u,u],u,[["Z","M","D","W","D","V","Z"],["zo","ma","di","wo","do","vr","za"],["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],["zo","ma","di","wo","do","vr","za"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]],u,[["v.C.","n.C."],["v.Chr.","n.Chr."],["voor Christus","na Christus"]],1,[6,0],["dd-MM-y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'om' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤ -#,##0.00","#E0"],"ANG","NAf.","Nederlands-Antilliaanse gulden",{"ANG":["NAf."],"AUD":["AU$","$"],"BYN":[u,"р."],"CAD":["C$","$"],"FJD":["FJ$","$"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RUR":[u,"р."],"SBD":["SI$","$"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XPF":[],"XXX":[]},"ltr", plural, [[["middernacht","’s ochtends","’s middags","’s avonds","’s nachts"],u,u],[["middernacht","ochtend","middag","avond","nacht"],u,u],["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    4)ֺvxj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['nl-sr'] = ["nl-SR",[["a.m.","p.m."],u,u],u,[["Z","M","D","W","D","V","Z"],["zo","ma","di","wo","do","vr","za"],["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],["zo","ma","di","wo","do","vr","za"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]],u,[["v.C.","n.C."],["v.Chr.","n.Chr."],["voor Christus","na Christus"]],1,[6,0],["dd-MM-y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'om' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤ -#,##0.00","#E0"],"SRD","$","Surinaamse dollar",{"AUD":["AU$","$"],"BYN":[u,"р."],"CAD":["C$","$"],"FJD":["FJ$","$"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RUR":[u,"р."],"SBD":["SI$","$"],"SRD":["$"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XPF":[],"XXX":[]},"ltr", plural, [[["middernacht","’s ochtends","’s middags","’s avonds","’s nachts"],u,u],[["middernacht","ochtend","middag","avond","nacht"],u,u],["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    #)wx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['nl-sx'] = ["nl-SX",[["a.m.","p.m."],u,u],u,[["Z","M","D","W","D","V","Z"],["zo","ma","di","wo","do","vr","za"],["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],["zo","ma","di","wo","do","vr","za"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]],u,[["v.C.","n.C."],["v.Chr.","n.Chr."],["voor Christus","na Christus"]],1,[6,0],["dd-MM-y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'om' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤ -#,##0.00","#E0"],"ANG","NAf.","Nederlands-Antilliaanse gulden",{"ANG":["NAf."],"AUD":["AU$","$"],"BYN":[u,"р."],"CAD":["C$","$"],"FJD":["FJ$","$"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RUR":[u,"р."],"SBD":["SI$","$"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XPF":[],"XXX":[]},"ltr", plural, [[["middernacht","’s ochtends","’s middags","’s avonds","’s nachts"],u,u],[["middernacht","ochtend","middag","avond","nacht"],u,u],["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    )txM/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['nl'] = ["nl",[["a.m.","p.m."],u,u],u,[["Z","M","D","W","D","V","Z"],["zo","ma","di","wo","do","vr","za"],["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],["zo","ma","di","wo","do","vr","za"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]],u,[["v.C.","n.C."],["v.Chr.","n.Chr."],["voor Christus","na Christus"]],1,[6,0],["dd-MM-y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'om' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00;¤ -#,##0.00","#E0"],"EUR","€","Euro",{"AUD":["AU$","$"],"BYN":[u,"р."],"CAD":["C$","$"],"FJD":["FJ$","$"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RUR":[u,"р."],"SBD":["SI$","$"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XPF":[],"XXX":[]},"ltr", plural, [[["middernacht","’s ochtends","’s middags","’s avonds","’s nachts"],u,u],[["middernacht","ochtend","middag","avond","nacht"],u,u],["00:00",["06:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    _f\x2/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['nmg'] = ["nmg",[["maná","kugú"],u,u],u,[["s","m","s","s","s","m","s"],["sɔ́n","mɔ́n","smb","sml","smn","mbs","sas"],["sɔ́ndɔ","mɔ́ndɔ","sɔ́ndɔ mafú mába","sɔ́ndɔ mafú málal","sɔ́ndɔ mafú mána","mabágá má sukul","sásadi"],["sɔ́n","mɔ́n","smb","sml","smn","mbs","sas"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ng1","ng2","ng3","ng4","ng5","ng6","ng7","ng8","ng9","ng10","ng11","kris"],["ngwɛn matáhra","ngwɛn ńmba","ngwɛn ńlal","ngwɛn ńna","ngwɛn ńtan","ngwɛn ńtuó","ngwɛn hɛmbuɛrí","ngwɛn lɔmbi","ngwɛn rɛbvuâ","ngwɛn wum","ngwɛn wum navǔr","krísimin"]],u,[["BL","PB"],u,["Bó Lahlɛ̄","Pfiɛ Burī"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XAF","FCFA","Fraŋ CFA BEAC",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    
ᠹx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['nn'] = ["nn",[["a","p"],["f.m.","e.m."],["a.m.","p.m."]],[["f.m.","e.m."],["a.m.","p.m."],u],[["S","M","T","O","T","F","L"],["sø.","må.","ty.","on.","to.","fr.","la."],["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],["sø.","må.","ty.","on.","to.","fr.","la."]],[["S","M","T","O","T","F","L"],["søn","mån","tys","ons","tor","fre","lau"],["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],["sø.","må.","ty.","on.","to.","fr.","la."]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mars","apr.","mai","juni","juli","aug.","sep.","okt.","nov.","des."],["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"]],[["f.Kr.","e.Kr."],u,["før Kristus","etter Kristus"]],1,[6,0],["dd.MM.y","d. MMM y","d. MMMM y","EEEE d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","'kl'. HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'kl'. {0}","{1} {0}"],[","," ",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"NOK","kr","norske kroner",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NOK":["kr"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"$"],"USD":[u,"$"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XPF":[],"XXX":[]},"ltr", plural, [[["mn.","mg.","fm.","em.","kv.","nt."],["midn.","morg.","form.","etterm.","kveld","natt"],["midnatt","på morgonen","på formiddagen","på ettermiddagen","på kvelden","på natta"]],[["mn.","mg.","fm.","em.","kv.","nt."],["midn.","morg.","form.","etterm.","kveld","natt"],["midnatt","morgon","formiddag","ettermiddag","kveld","natt"]],["00:00",["06:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    Tճ_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['nnh'] = ["nnh",[["mbaʼámbaʼ","ncwònzém"],u,u],u,[["S","M","T","W","T","F","S"],["lyɛʼɛ́ sẅíŋtè","mvfò lyɛ̌ʼ","mbɔ́ɔntè mvfò lyɛ̌ʼ","tsètsɛ̀ɛ lyɛ̌ʼ","mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ","mvfò màga lyɛ̌ʼ","màga lyɛ̌ʼ"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["saŋ tsetsɛ̀ɛ lùm","saŋ kàg ngwóŋ","saŋ lepyè shúm","saŋ cÿó","saŋ tsɛ̀ɛ cÿó","saŋ njÿoláʼ","saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ","saŋ mbʉ̀ŋ","saŋ ngwɔ̀ʼ mbÿɛ","saŋ tàŋa tsetsáʼ","saŋ mejwoŋó","saŋ lùm"],u],u,[["m.z.Y.","m.g.n.Y."],u,["mé zyé Yěsô","mé gÿo ńzyé Yěsô"]],1,[6,0],["dd/MM/yy","d MMM, y","'lyɛ'̌ʼ d 'na' MMMM, y","EEEE , 'lyɛ'̌ʼ d 'na' MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1}, {0}","{1},{0}"],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XAF","FCFA","feláŋ CFA",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    y :xG	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['no'] = ["no",[["a","p"],["a.m.","p.m."],u],[["a.m.","p.m."],u,u],[["S","M","T","O","T","F","L"],["søn.","man.","tir.","ons.","tor.","fre.","lør."],["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],["sø.","ma.","ti.","on.","to.","fr.","lø."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"]],[["f.Kr.","e.Kr."],u,["før Kristus","etter Kristus"]],1,[6,0],["dd.MM.y","d. MMM y","d. MMMM y","EEEE d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'kl'. {0}",u],[","," ",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00;¤ -#,##0.00","#E0"],"NOK","kr","norske kroner",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NOK":["kr"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XAF":[],"XCD":[u,"$"],"XPF":[],"XXX":[]},"ltr", plural, [[["mn.","mg.","fm.","em.","kv.","nt."],["midn.","morg.","form.","etterm.","kveld","natt"],["midnatt","på morgenen","på formiddagen","på ettermiddagen","på kvelden","på natten"]],[["mn.","mg.","fm.","em.","kv.","nt."],["midn.","morg.","form.","etterm.","kveld","natt"],["midnatt","morgen","formiddag","ettermiddag","kveld","natt"]],["00:00",["06:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    ;[xB/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['nus'] = ["nus",[["RW","TŊ"],u,u],u,[["C","J","R","D","Ŋ","D","B"],["Cäŋ","Jiec","Rɛw","Diɔ̱k","Ŋuaan","Dhieec","Bäkɛl"],["Cäŋ kuɔth","Jiec la̱t","Rɛw lätni","Diɔ̱k lätni","Ŋuaan lätni","Dhieec lätni","Bäkɛl lätni"],["Cäŋ","Jiec","Rɛw","Diɔ̱k","Ŋuaan","Dhieec","Bäkɛl"]],u,[["T","P","D","G","D","K","P","T","T","L","K","T"],["Tiop","Pɛt","Duɔ̱ɔ̱","Guak","Duä","Kor","Pay","Thoo","Tɛɛ","Laa","Kur","Tid"],["Tiop thar pɛt","Pɛt","Duɔ̱ɔ̱ŋ","Guak","Duät","Kornyoot","Pay yie̱tni","Tho̱o̱r","Tɛɛr","Laath","Kur","Tio̱p in di̱i̱t"]],u,[["AY","ƐY"],u,["A ka̱n Yecu ni dap","Ɛ ca Yecu dap"]],1,[6,0],["d/MM/y","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","z h:mm:ss a","zzzz h:mm:ss a"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"SSP","£","SSP",{"GBP":["GB£","£"],"JPY":["JP¥","¥"],"SSP":["£"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    іS[xJ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['nyn'] = ["nyn",[["AM","PM"],u,u],u,[["S","K","R","S","N","T","M"],["SAN","ORK","OKB","OKS","OKN","OKT","OMK"],["Sande","Orwokubanza","Orwakabiri","Orwakashatu","Orwakana","Orwakataano","Orwamukaaga"],["SAN","ORK","OKB","OKS","OKN","OKT","OMK"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["KBZ","KBR","KST","KKN","KTN","KMK","KMS","KMN","KMW","KKM","KNK","KNB"],["Okwokubanza","Okwakabiri","Okwakashatu","Okwakana","Okwakataana","Okwamukaaga","Okwamushanju","Okwamunaana","Okwamwenda","Okwaikumi","Okwaikumi na kumwe","Okwaikumi na ibiri"]],u,[["BC","AD"],u,["Kurisito Atakaijire","Kurisito Yaijire"]],1,[0,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"UGX","USh","Eshiringi ya Uganda",{"JPY":["JP¥","¥"],"UGX":["USh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    gxr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['om-ke'] = ["om-KE",[["WD","WB"],u,u],u,[["D","W","Q","R","K","J","S"],["Dil","Wix","Qib","Rob","Kam","Jim","San"],["Dilbata","Wiixata","Qibxata","Roobii","Kamiisa","Jimaata","Sanbata"],["Dil","Wix","Qib","Rob","Kam","Jim","San"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Ama","Gur","Bit","Elb","Cam","Wax","Ado","Hag","Ful","Onk","Sad","Mud"],["Amajjii","Guraandhala","Bitooteessa","Elba","Caamsa","Waxabajjii","Adooleessa","Hagayya","Fuulbana","Onkololeessa","Sadaasa","Muddee"]],[["A","G","B","E","C","W","A","H","F","O","S","M"],["Ama","Gur","Bit","Elb","Cam","Wax","Ado","Hag","Ful","Onk","Sad","Mud"],["Amajjii","Guraandhala","Bitooteessa","Elba","Caamsa","Waxabajjii","Adooleessa","Hagayya","Fuulbana","Onkololeessa","Sadaasa","Muddee"]],[["KD","CE"],u,["Dheengadda Jeesu","CE"]],0,[6,0],["dd/MM/yy","dd-MMM-y","dd MMMM y","EEEE, MMMM d, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","KES",{"ETB":["Br"],"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    Vxk/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['om'] = ["om",[["WD","WB"],u,u],u,[["S","M","T","W","T","F","S"],["Dil","Wix","Qib","Rob","Kam","Jim","San"],["Dilbata","Wiixata","Qibxata","Roobii","Kamiisa","Jimaata","Sanbata"],["Dil","Wix","Qib","Rob","Kam","Jim","San"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Ama","Gur","Bit","Elb","Cam","Wax","Ado","Hag","Ful","Onk","Sad","Mud"],["Amajjii","Guraandhala","Bitooteessa","Elba","Caamsa","Waxabajjii","Adooleessa","Hagayya","Fuulbana","Onkololeessa","Sadaasa","Muddee"]],u,[["BCE","CE"],u,["Dheengadda Jeesu","CE"]],0,[6,0],["dd/MM/yy","dd-MMM-y","dd MMMM y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ETB","Br","Itoophiyaa Birrii",{"ETB":["Br"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    {avxg/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['or'] = ["or",[["ପୂ","ଅ"],["AM","PM"],u],[["AM","ଅପରାହ୍ନ"],["ପୂର୍ବାହ୍ନ","ଅପରାହ୍ନ"],u],[["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"],["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"]],u,[["ଜା","ଫେ","ମା","ଅ","ମଇ","ଜୁ","ଜୁ","ଅ","ସେ","ଅ","ନ","ଡି"],["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],u],u,[["BC","AD"],u,["ଖ୍ରୀଷ୍ଟପୂର୍ବ","ଖ୍ରୀଷ୍ଟାବ୍ଦ"]],0,[0,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{0} ଠାରେ {1}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##0%","¤#,##0.00","#E0"],"INR","₹","ଭାରତୀୟ ଟଙ୍କା",{"BYN":[u,"р."],"PHP":[u,"₱"]},"ltr", plural, []];
  })(globalThis);
    :hkx(	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['os-ru'] = ["os-RU",[["AM","PM"],u,["ӕмбисбоны размӕ","ӕмбисбоны фӕстӕ"]],[["AM","PM"],u,u],[["Х","К","Д","Ӕ","Ц","М","С"],["хцб","крс","дцг","ӕрт","цпр","мрб","сбт"],["хуыцаубон","къуырисӕр","дыццӕг","ӕртыццӕг","цыппӕрӕм","майрӕмбон","сабат"],["хцб","крс","дцг","ӕрт","цпр","мрб","сбт"]],[["Х","К","Д","Ӕ","Ц","М","С"],["Хцб","Крс","Дцг","Ӕрт","Цпр","Мрб","Сбт"],["Хуыцаубон","Къуырисӕр","Дыццӕг","Ӕртыццӕг","Цыппӕрӕм","Майрӕмбон","Сабат"],["хцб","крс","дцг","ӕрт","цпр","мрб","сбт"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","фев.","мар.","апр.","майы","июны","июлы","авг.","сен.","окт.","ноя.","дек."],["январы","февралы","мартъийы","апрелы","майы","июны","июлы","августы","сентябры","октябры","ноябры","декабры"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["Янв.","Февр.","Март.","Апр.","Май","Июнь","Июль","Авг.","Сент.","Окт.","Нояб.","Дек."],["Январь","Февраль","Мартъи","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"]],[["н.д.а.","н.д."],u,u],1,[6,0],["dd.MM.yy","dd MMM y 'аз'","d MMMM, y 'аз'","EEEE, d MMMM, y 'аз'"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","НН",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"RUB","₽","Сом",{"JPY":["JP¥","¥"],"RUB":["₽"]},"ltr", plural, []];
  })(globalThis);
    2Ӳx"	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['os'] = ["os",[["AM","PM"],u,["ӕмбисбоны размӕ","ӕмбисбоны фӕстӕ"]],[["AM","PM"],u,u],[["Х","К","Д","Ӕ","Ц","М","С"],["хцб","крс","дцг","ӕрт","цпр","мрб","сбт"],["хуыцаубон","къуырисӕр","дыццӕг","ӕртыццӕг","цыппӕрӕм","майрӕмбон","сабат"],["хцб","крс","дцг","ӕрт","цпр","мрб","сбт"]],[["Х","К","Д","Ӕ","Ц","М","С"],["Хцб","Крс","Дцг","Ӕрт","Цпр","Мрб","Сбт"],["Хуыцаубон","Къуырисӕр","Дыццӕг","Ӕртыццӕг","Цыппӕрӕм","Майрӕмбон","Сабат"],["хцб","крс","дцг","ӕрт","цпр","мрб","сбт"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","фев.","мар.","апр.","майы","июны","июлы","авг.","сен.","окт.","ноя.","дек."],["январы","февралы","мартъийы","апрелы","майы","июны","июлы","августы","сентябры","октябры","ноябры","декабры"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["Янв.","Февр.","Март.","Апр.","Май","Июнь","Июль","Авг.","Сент.","Окт.","Нояб.","Дек."],["Январь","Февраль","Мартъи","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"]],[["н.д.а.","н.д."],u,u],1,[6,0],["dd.MM.yy","dd MMM y 'аз'","d MMMM, y 'аз'","EEEE, d MMMM, y 'аз'"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","НН",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"GEL","₾","Лар",{"GEL":["₾"],"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    |x	'/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['pa-guru'] = ["pa-Guru",[["ਸ.","ਸ਼."],["ਪੂ.ਦੁ.","ਬਾ.ਦੁ."],u],[["ਪੂ.ਦੁ.","ਬਾ.ਦੁ."],u,u],[["ਐ","ਸੋ","ਮੰ","ਬੁੱ","ਵੀ","ਸ਼ੁੱ","ਸ਼"],["ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ"],["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],["ਐਤ","ਸੋਮ","ਮੰਗ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕ","ਸ਼ਨਿੱ"]],u,[["ਜ","ਫ਼","ਮਾ","ਅ","ਮ","ਜੂ","ਜੁ","ਅ","ਸ","ਅ","ਨ","ਦ"],["ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ"],["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"]],u,[["ਈ.ਪੂ.","ਸੰਨ"],["ਈ. ਪੂ.","ਸੰਨ"],["ਈਸਵੀ ਪੂਰਵ","ਈਸਵੀ ਸੰਨ"]],0,[0,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤ #,##,##0.00","[#E0]"],"INR","₹","ਭਾਰਤੀ ਰੁਪਇਆ",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["ਅੱਧੀ ਰਾਤ","ਸਵੇਰੇ","ਦੁਪਹਿਰੇ","ਸ਼ਾਮੀਂ","ਰਾਤੀਂ"],u,u],[["ਅੱਧੀ ਰਾਤ","ਸਵੇਰੇ","ਦੁਪਹਿਰੇ","ਸ਼ਾਮੀਂ","ਰਾਤੀਂ"],u,["ਅੱਧੀ ਰਾਤ","ਸਵੇਰੇ","ਦੁਪਹਿਰੇ","ਸ਼ਾਮ","ਰਾਤ"]],["00:00",["04:00","12:00"],["12:00","16:00"],["16:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    w x	1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['pa'] = ["pa",[["ਸ.","ਸ਼."],["ਪੂ.ਦੁ.","ਬਾ.ਦੁ."],u],[["ਪੂ.ਦੁ.","ਬਾ.ਦੁ."],u,u],[["ਐ","ਸੋ","ਮੰ","ਬੁੱ","ਵੀ","ਸ਼ੁੱ","ਸ਼"],["ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ"],["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],["ਐਤ","ਸੋਮ","ਮੰਗ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕ","ਸ਼ਨਿੱ"]],u,[["ਜ","ਫ਼","ਮਾ","ਅ","ਮ","ਜੂ","ਜੁ","ਅ","ਸ","ਅ","ਨ","ਦ"],["ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ"],["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"]],u,[["ਈ.ਪੂ.","ਸੰਨ"],["ਈ. ਪੂ.","ਸੰਨ"],["ਈਸਵੀ ਪੂਰਵ","ਈਸਵੀ ਸੰਨ"]],0,[0,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤ #,##,##0.00","[#E0]"],"INR","₹","ਭਾਰਤੀ ਰੁਪਇਆ",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["ਅੱਧੀ ਰਾਤ","ਸਵੇਰੇ","ਦੁਪਹਿਰੇ","ਸ਼ਾਮੀਂ","ਰਾਤੀਂ"],u,u],[["ਅੱਧੀ ਰਾਤ","ਸਵੇਰੇ","ਦੁਪਹਿਰੇ","ਸ਼ਾਮੀਂ","ਰਾਤੀਂ"],u,["ਅੱਧੀ ਰਾਤ","ਸਵੇਰੇ","ਦੁਪਹਿਰੇ","ਸ਼ਾਮ","ਰਾਤ"]],["00:00",["04:00","12:00"],["12:00","16:00"],["16:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    "Զvxf/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['pcm'] = ["pcm",[["AM","PM"],u,["Fọ mọ́nin","Fọ ívnin"]],u,[["S","M","T","W","T","F","S"],["Sọ́n","Mọ́n","Tiú","Wẹ́n","Tọ́z","Fraí","Sát"],["Sọ́ndè","Mọ́ndè","Tiúzdè","Wẹ́nẹ́zdè","Tọ́zdè","Fraídè","Sátọdè"],["Sọ́n","Mọ́n","Tiú","Wẹ́n","Tọ́z","Fraí","Sát"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jén","Fẹ́b","Mach","Épr","Mee","Jun","Jul","Ọgọ","Sẹp","Ọkt","Nọv","Dis"],["Jénúári","Fẹ́búári","Mach","Éprel","Mee","Jun","Julai","Ọgọst","Sẹptẹ́mba","Ọktóba","Nọvẹ́mba","Disẹ́mba"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jén","Fẹ́b","Mach","Épr","Mee","Jun","Jul","Ọ́gọ","Sẹp","Ọkt","Nọv","Dis"],["Jénúári","Fẹ́búári","Mach","Éprel","Mee","Jun","Julai","Ọgọst","Sẹptẹ́mba","Ọktóba","Nọvẹ́mba","Disẹ́mba"]],[["BK","KIY"],u,["Bifọ́ Kraist","Kraist Im Yiẹ"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","H:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{1} 'fọ' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"NGN","₦","Naijíriá Naíra",{"BYN":[u,"p."],"CAD":["KA$","$"],"JPY":["JP¥","¥"],"NGN":["₦"],"PHP":[u,"₱"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    vxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
    return 3;
if (v === 0 && (!(i === 1) && (i % 10 === Math.floor(i % 10) && (i % 10 >= 0 && i % 10 <= 1))) || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 12 && i % 100 <= 14))))
    return 4;
return 5;
}
    global.ng.common.locales['pl'] = ["pl",[["a","p"],["AM","PM"],u],u,[["n","p","w","ś","c","p","s"],["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],["nie","pon","wto","śro","czw","pią","sob"]],[["N","P","W","Ś","C","P","S"],["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],["nie","pon","wto","śro","czw","pią","sob"]],[["s","l","m","k","m","c","l","s","w","p","l","g"],["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"]],[["S","L","M","K","M","C","L","S","W","P","L","G"],["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"]],[["p.n.e.","n.e."],u,["przed naszą erą","naszej ery"]],1,[6,0],["d.MM.y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"PLN","zł","złoty polski",{"AUD":[u,"$"],"CAD":[u,"$"],"CNY":[u,"¥"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"PLN":["zł"],"RON":[u,"lej"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"]},"ltr", plural, [[["o półn.","w poł.","rano","przed poł.","po poł.","wiecz.","w nocy"],["o północy","w południe","rano","przed południem","po południu","wieczorem","w nocy"],u],[["półn.","poł.","rano","przedpoł.","popoł.","wiecz.","noc"],["północ","południe","rano","przedpołudnie","popołudnie","wieczór","noc"],u],["00:00","12:00",["06:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    *pymx /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ps-pk'] = ["ps-PK",[["غ.م.","غ.و."],u,u],u,[["S","M","T","W","T","F","S"],["يونۍ","دونۍ","درېنۍ","څلرنۍ","پينځنۍ","جمعه","اونۍ"],u,u],u,[["ج","ف","م","ا","م","ج","ج","ا","س","ا","ن","د"],["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سېپتمبر","اکتوبر","نومبر","دسمبر"],u],[["1","2","3","4","5","6","7","8","9","10","11","12"],["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"],["جنوري","فېبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"]],[["له میلاد وړاندې","م."],u,["له میلاد څخه وړاندې","له میلاد څخه وروسته"]],0,[6,0],["y/M/d","y MMM d","د y د MMMM d","EEEE د y د MMMM d"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[",",".",";","%","‎+","‎−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"PKR","Rs","پاکستانۍ کلداره",{"AFN":["؋"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PKR":["Rs"]},"rtl", plural, []];
  })(globalThis);
    YhkxH/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ps'] = ["ps",[["غ.م.","غ.و."],u,u],u,[["S","M","T","W","T","F","S"],["يونۍ","دونۍ","درېنۍ","څلرنۍ","پينځنۍ","جمعه","اونۍ"],u,u],u,[["ج","ف","م","ا","م","ج","ج","ا","س","ا","ن","د"],["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سېپتمبر","اکتوبر","نومبر","دسمبر"],u],[["1","2","3","4","5","6","7","8","9","10","11","12"],["جنوري","فبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"],["جنوري","فېبروري","مارچ","اپریل","مۍ","جون","جولای","اګست","سپتمبر","اکتوبر","نومبر","دسمبر"]],[["له میلاد وړاندې","م."],u,["له میلاد څخه وړاندې","له میلاد څخه وروسته"]],6,[4,5],["y/M/d","y MMM d","د y د MMMM d","EEEE د y د MMMM d"],["H:mm","H:mm:ss","H:mm:ss (z)","H:mm:ss (zzzz)"],["{1} {0}",u,u,u],[",",".",";","%","‎+","‎−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"AFN","؋","افغانۍ",{"AFN":["؋"],"BYN":[u,"р."],"JPY":["JP¥","¥"]},"rtl", plural, []];
  })(globalThis);
     öx9/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-ao'] = ["pt-AO",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],1,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"AOA","Kz","kwanza angolano",{"AOA":["Kz"],"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["​"],"RON":[u,"L"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    ~2xF/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-ch'] = ["pt-CH",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],1,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"CHF","CHF","franco suíço",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["​"],"RON":[u,"L"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    3\ǿx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-cv'] = ["pt-CV",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],1,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"CVE","​","escudo cabo-verdiano",{"AUD":["AU$","$"],"BYN":[u,"р."],"CVE":["​"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"RON":[u,"L"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    ώxB/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-gq'] = ["pt-GQ",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],1,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XAF","FCFA","franco CFA (BEAC)",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["​"],"RON":[u,"L"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    Cx)/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-st'] = ["pt-ST",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],1,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"STN","Db","dobra de São Tomé e Príncipe",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["​"],"RON":[u,"L"],"STN":["Db"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    ԖJdxG gw'] = ["pt-GW!"XOF","F CFA","franco CFA (BCEAO)fR	xD/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-lu'] = ["pt-LU",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],1,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"LUF":["F"],"PHP":[u,"₱"],"PTE":["​"],"RON":[u,"L"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    RIx' pt'] = ["pt-PT!0R;x1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-mo'] = ["pt-MO",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],0,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"MOP","MOP$","pataca macaense",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"MOP":["MOP$"],"PHP":[u,"₱"],"PTE":["​"],"RON":[u,"L"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    Ex2/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-mz'] = ["pt-MZ",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],0,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"MZN","MTn","metical moçambicano",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"MZN":["MTn"],"PHP":[u,"₱"],"PTE":["​"],"RON":[u,"L"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    tx;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt-tl'] = ["pt-TL",[["a.m.","p.m."],u,["da manhã","da tarde"]],[["a.m.","p.m."],u,["manhã","tarde"]],[["D","S","T","Q","Q","S","S"],["domingo","segunda","terça","quarta","quinta","sexta","sábado"],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],1,[6,0],["dd/MM/yy","dd/MM/y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'às' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"USD","US$","dólar dos Estados Unidos",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["​"],"RON":[u,"L"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    Ax1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;

if (i === Math.floor(i) && (i >= 0 && i <= 1))
    return 1;
if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
    return 4;
return 5;
}
    global.ng.common.locales['pt'] = ["pt",[["AM","PM"],u,u],u,[["D","S","T","Q","Q","S","S"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."],["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],["dom.","seg.","ter.","qua.","qui.","sex.","sáb."]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","fev.","mar.","abr.","mai.","jun.","jul.","ago.","set.","out.","nov.","dez."],["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"]],u,[["a.C.","d.C."],u,["antes de Cristo","depois de Cristo"]],0,[6,0],["dd/MM/y","d 'de' MMM 'de' y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"BRL","R$","Real brasileiro",{"AUD":["AU$","$"],"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["Esc."],"RON":[u,"L"],"SYP":[u,"S£"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["meia-noite","meio-dia","da manhã","da tarde","da noite","da madrugada"],u,u],[["meia-noite","meio-dia","manhã","tarde","noite","madrugada"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    X[xL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['qu-ec'] = ["qu-EC",[["a.m.","p.m."],u,u],u,[["D","L","M","X","J","V","S"],["Dom","Lun","Mar","Mié","Jue","Vie","Sab"],["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],["Dom","Lun","Mar","Mié","Jue","Vie","Sab"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Set","Oct","Nov","Dic"],["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Setiembre","Octubre","Noviembre","Diciembre"]],u,[["a.d.","dC"],["a.d.","d.C."],["ñawpa cristu","chanta cristu"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{0} {1}","{1} {0}"],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00","#E0"],"USD","$","Dólar Americano",{"BBD":["BBG","$"],"BMD":["DBM","$"],"BZD":["DBZ","$"],"CAD":["$CA","$"],"GHS":[u,"GHC"],"JPY":["JP¥","¥"],"PHP":[u,"₱"]},"ltr", plural, []];
  })(globalThis);
    ;\x7/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['qu'] = ["qu",[["a.m.","p.m."],u,u],u,[["D","L","M","X","J","V","S"],["Dom","Lun","Mar","Mié","Jue","Vie","Sab"],["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],["Dom","Lun","Mar","Mié","Jue","Vie","Sab"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Set","Oct","Nov","Dic"],["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Setiembre","Octubre","Noviembre","Diciembre"]],u,[["a.d.","dC"],["a.d.","d.C."],["ñawpa cristu","chanta cristu"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,"{0} {1}","{1} {0}"],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","¤ #,##0.00","#E0"],"PEN","S/","Sol Peruano",{"BBD":["BBG","$"],"BMD":["DBM","$"],"BZD":["DBZ","$"],"CAD":["$CA","$"],"GHS":[u,"GHC"],"JPY":["JP¥","¥"],"PEN":["S/"],"PHP":[u,"₱"],"USD":["$US","$"]},"ltr", plural, []];
  })(globalThis);
    hxz/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['rm'] = ["rm",[["AM","PM"],u,u],u,[["D","G","M","M","G","V","S"],["du","gli","ma","me","gie","ve","so"],["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],["du","gli","ma","me","gie","ve","so"]],u,[["S","F","M","A","M","Z","F","A","S","O","N","D"],["schan.","favr.","mars","avr.","matg","zercl.","fan.","avust","sett.","oct.","nov.","dec."],["da schaner","da favrer","da mars","d’avrigl","da matg","da zercladur","da fanadur","d’avust","da settember","d’october","da november","da december"]],[["S","F","M","A","M","Z","F","A","S","O","N","D"],["schan.","favr.","mars","avr.","matg","zercl.","fan.","avust","sett.","oct.","nov.","dec."],["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december"]],[["av. Cr.","s. Cr."],u,["avant Cristus","suenter Cristus"]],1,[6,0],["dd-MM-yy","dd-MM-y","d MMMM y","EEEE, 'ils' d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".","’",";","%","+","−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"CHF","CHF","franc svizzer",{"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    .Yxe/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['rn'] = ["rn",[["Z.MU.","Z.MW."],u,u],u,[["S","M","T","W","T","F","S"],["cu.","mbe.","kab.","gtu.","kan.","gnu.","gnd."],["Ku w’indwi","Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu"],["cu.","mbe.","kab.","gtu.","kan.","gnu.","gnd."]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Mut.","Gas.","Wer.","Mat.","Gic.","Kam.","Nya.","Kan.","Nze.","Ukw.","Ugu.","Uku."],["Nzero","Ruhuhuma","Ntwarante","Ndamukiza","Rusama","Ruheshi","Mukakaro","Nyandagaro","Nyakanga","Gitugutu","Munyonyo","Kigarama"]],u,[["Mb.Y.","Ny.Y"],u,["Mbere ya Yezu","Nyuma ya Yezu"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00¤","#E0"],"BIF","FBu","Ifaranga ry’Uburundi",{"BIF":["FBu"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    SȺx:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
if (!(v === 0) || (n === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 19)))
    return 3;
return 5;
}
    global.ng.common.locales['ro-md'] = ["ro-MD",[["a.m.","p.m."],u,u],u,[["D","L","Ma","Mi","J","V","S"],["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],["Du","Lu","Ma","Mi","Jo","Vi","Sâ"]],u,[["I","F","M","A","M","I","I","A","S","O","N","D"],["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"]],u,[["î.Hr.","d.Hr."],u,["înainte de Hristos","după Hristos"]],1,[6,0],["dd.MM.y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"MDL","L","leu moldovenesc",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MDL":["L"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XCD":[u,"$"]},"ltr", plural, [[["miezul nopții","amiază","dimineață","după-amiază","seară","noapte"],["miezul nopții","amiază","dimineața","după-amiaza","seara","noaptea"],u],u,["00:00","12:00",["05:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","05:00"]]]];
  })(globalThis);
    /fzx!	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
if (!(v === 0) || (n === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 19)))
    return 3;
return 5;
}
    global.ng.common.locales['ro'] = ["ro",[["a.m.","p.m."],u,u],u,[["D","L","M","M","J","V","S"],["dum.","lun.","mar.","mie.","joi","vin.","sâm."],["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],["du.","lu.","ma.","mi.","joi","vi.","sâ."]],u,[["I","F","M","A","M","I","I","A","S","O","N","D"],["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"]],u,[["î.Hr.","d.Hr."],u,["înainte de Hristos","după Hristos"]],1,[6,0],["dd.MM.y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"RON","RON","leu românesc",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XCD":[u,"$"]},"ltr", plural, [[["miezul nopții","la amiază","dimineața","după-amiaza","seara","noaptea"],["miezul nopții","amiază","dimineața","după-amiaza","seara","noaptea"],["la miezul nopții","la amiază","dimineața","după-amiaza","seara","noaptea"]],[["miezul nopții","amiază","dimineața","după-amiaza","seara","noaptea"],u,["la miezul nopții","la amiază","dimineața","după-amiaza","seara","noaptea"]],["00:00","12:00",["05:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","05:00"]]]];
  })(globalThis);
    G]x)/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['rof'] = ["rof",[["kang’ama","kingoto"],u,u],u,[["2","3","4","5","6","7","1"],["Ijp","Ijt","Ijn","Ijtn","Alh","Iju","Ijm"],["Ijumapili","Ijumatatu","Ijumanne","Ijumatano","Alhamisi","Ijumaa","Ijumamosi"],["Ijp","Ijt","Ijn","Ijtn","Alh","Iju","Ijm"]],u,[["K","K","K","K","T","S","S","N","T","I","I","I"],["M1","M2","M3","M4","M5","M6","M7","M8","M9","M10","M11","M12"],["Mweri wa kwanza","Mweri wa kaili","Mweri wa katatu","Mweri wa kaana","Mweri wa tanu","Mweri wa sita","Mweri wa saba","Mweri wa nane","Mweri wa tisa","Mweri wa ikumi","Mweri wa ikumi na moja","Mweri wa ikumi na mbili"]],u,[["KM","BM"],u,["Kabla ya Mayesu","Baada ya Mayesu"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"TZS","TSh","heleri sa Tanzania",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    x+/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
    return 3;
if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
    return 4;
return 5;
}
    global.ng.common.locales['ru-by'] = ["ru-BY",[["AM","PM"],u,u],u,[["В","П","В","С","Ч","П","С"],["вс","пн","вт","ср","чт","пт","сб"],["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],["вс","пн","вт","ср","чт","пт","сб"]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","мар.","апр.","мая","июн.","июл.","авг.","сент.","окт.","нояб.","дек."],["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],[["до н.э.","н.э."],["до н. э.","н. э."],["до Рождества Христова","от Рождества Христова"]],1,[6,0],["dd.MM.y","d MMM y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","не число",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"BYN","Br","белорусский рубль",{"BYN":["Br"],"GEL":[u,"ლ"],"PHP":[u,"₱"],"RON":[u,"L"],"RUB":["₽"],"THB":["฿"],"TMT":["ТМТ"],"TWD":["NT$"],"UAH":["₴"],"XXX":["XXXX"]},"ltr", plural, [[["полн.","полд.","утра","дня","веч.","ночи"],["полн.","полд.","утра","дня","вечера","ночи"],["полночь","полдень","утра","дня","вечера","ночи"]],[["полн.","полд.","утро","день","веч.","ночь"],u,["полночь","полдень","утро","день","вечер","ночь"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    >uxK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
    return 3;
if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
    return 4;
return 5;
}
    global.ng.common.locales['ru-kg'] = ["ru-KG",[["AM","PM"],u,u],u,[["В","П","В","С","Ч","П","С"],["вс","пн","вт","ср","чт","пт","сб"],["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],["вс","пн","вт","ср","чт","пт","сб"]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","мар.","апр.","мая","июн.","июл.","авг.","сент.","окт.","нояб.","дек."],["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],[["до н.э.","н.э."],["до н. э.","н. э."],["до Рождества Христова","от Рождества Христова"]],1,[6,0],["dd.MM.y","d MMM y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","не число",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"KGS","сом","киргизский сом",{"BYN":[u,"р."],"GEL":[u,"ლ"],"KGS":["сом"],"PHP":[u,"₱"],"RON":[u,"L"],"RUB":["₽"],"RUR":["р."],"THB":["฿"],"TMT":["ТМТ"],"TWD":["NT$"],"UAH":["₴"],"XXX":["XXXX"]},"ltr", plural, [[["полн.","полд.","утра","дня","веч.","ночи"],["полн.","полд.","утра","дня","вечера","ночи"],["полночь","полдень","утра","дня","вечера","ночи"]],[["полн.","полд.","утро","день","веч.","ночь"],u,["полночь","полдень","утро","день","вечер","ночь"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    hշxG/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
    return 3;
if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
    return 4;
return 5;
}
    global.ng.common.locales['ru-kz'] = ["ru-KZ",[["AM","PM"],u,u],u,[["В","П","В","С","Ч","П","С"],["вс","пн","вт","ср","чт","пт","сб"],["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],["вс","пн","вт","ср","чт","пт","сб"]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","мар.","апр.","мая","июн.","июл.","авг.","сент.","окт.","нояб.","дек."],["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],[["до н.э.","н.э."],["до н. э.","н. э."],["до Рождества Христова","от Рождества Христова"]],1,[6,0],["dd.MM.y","d MMM y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","не число",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"KZT","₸","казахский тенге",{"BYN":[u,"р."],"GEL":[u,"ლ"],"KZT":["₸"],"PHP":[u,"₱"],"RON":[u,"L"],"RUB":["₽"],"RUR":["р."],"THB":["฿"],"TMT":["ТМТ"],"TWD":["NT$"],"UAH":["₴"],"XXX":["XXXX"]},"ltr", plural, [[["полн.","полд.","утра","дня","веч.","ночи"],["полн.","полд.","утра","дня","вечера","ночи"],["полночь","полдень","утра","дня","вечера","ночи"]],[["полн.","полд.","утро","день","веч.","ночь"],u,["полночь","полдень","утро","день","вечер","ночь"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    ]xA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
    return 3;
if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
    return 4;
return 5;
}
    global.ng.common.locales['ru-md'] = ["ru-MD",[["AM","PM"],u,u],u,[["В","П","В","С","Ч","П","С"],["вс","пн","вт","ср","чт","пт","сб"],["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],["вс","пн","вт","ср","чт","пт","сб"]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","мар.","апр.","мая","июн.","июл.","авг.","сент.","окт.","нояб.","дек."],["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],[["до н.э.","н.э."],["до н. э.","н. э."],["до Рождества Христова","от Рождества Христова"]],1,[6,0],["dd.MM.y","d MMM y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","не число",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"MDL","L","молдавский лей",{"BYN":[u,"р."],"GEL":[u,"ლ"],"MDL":["L"],"PHP":[u,"₱"],"RON":[u,"L"],"RUB":["₽"],"RUR":["р."],"THB":["฿"],"TMT":["ТМТ"],"TWD":["NT$"],"UAH":["₴"],"XXX":["XXXX"]},"ltr", plural, [[["полн.","полд.","утра","дня","веч.","ночи"],["полн.","полд.","утра","дня","вечера","ночи"],["полночь","полдень","утра","дня","вечера","ночи"]],[["полн.","полд.","утро","день","веч.","ночь"],u,["полночь","полдень","утро","день","вечер","ночь"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    Yx=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
    return 3;
if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
    return 4;
return 5;
}
    global.ng.common.locales['ru-ua'] = ["ru-UA",[["AM","PM"],u,u],u,[["В","П","В","С","Ч","П","С"],["вс","пн","вт","ср","чт","пт","сб"],["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],["вс","пн","вт","ср","чт","пт","сб"]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","мар.","апр.","мая","июн.","июл.","авг.","сент.","окт.","нояб.","дек."],["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],[["до н.э.","н.э."],["до н. э.","н. э."],["до Рождества Христова","от Рождества Христова"]],1,[6,0],["dd.MM.y","d MMM y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","не число",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"UAH","₴","украинская гривна",{"BYN":[u,"р."],"GEL":[u,"ლ"],"PHP":[u,"₱"],"RON":[u,"L"],"RUB":["₽"],"RUR":["р."],"THB":["฿"],"TMT":["ТМТ"],"TWD":["NT$"],"UAH":["₴"],"XXX":["XXXX"]},"ltr", plural, [[["полн.","полд.","утра","дня","веч.","ночи"],["полн.","полд.","утра","дня","вечера","ночи"],["полночь","полдень","утра","дня","вечера","ночи"]],[["полн.","полд.","утро","день","веч.","ночь"],u,["полночь","полдень","утро","день","вечер","ночь"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    ax5/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
    return 3;
if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
    return 4;
return 5;
}
    global.ng.common.locales['ru'] = ["ru",[["AM","PM"],u,u],u,[["В","П","В","С","Ч","П","С"],["вс","пн","вт","ср","чт","пт","сб"],["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],["вс","пн","вт","ср","чт","пт","сб"]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","мар.","апр.","мая","июн.","июл.","авг.","сент.","окт.","нояб.","дек."],["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"]],[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],[["до н.э.","н.э."],["до н. э.","н. э."],["до Рождества Христова","от Рождества Христова"]],1,[6,0],["dd.MM.y","d MMM y 'г'.","d MMMM y 'г'.","EEEE, d MMMM y 'г'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","не число",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"RUB","₽","российский рубль",{"BYN":[u,"р."],"GEL":[u,"ლ"],"PHP":[u,"₱"],"RON":[u,"L"],"RUB":["₽"],"RUR":["р."],"THB":["฿"],"TMT":["ТМТ"],"TWD":["NT$"],"UAH":["₴"],"XXX":["XXXX"]},"ltr", plural, [[["полн.","полд.","утра","дня","веч.","ночи"],["полн.","полд.","утра","дня","вечера","ночи"],["полночь","полдень","утра","дня","вечера","ночи"]],[["полн.","полд.","утро","день","веч.","ночь"],u,["полночь","полдень","утро","день","вечер","ночь"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    1JUxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['rw'] = ["rw",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["cyu.","mbe.","kab.","gtu.","kan.","gnu.","gnd."],["Ku cyumweru","Kuwa mbere","Kuwa kabiri","Kuwa gatatu","Kuwa kane","Kuwa gatanu","Kuwa gatandatu"],["cyu.","mbe.","kab.","gtu.","kan.","gnu.","gnd."]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["mut.","gas.","wer.","mat.","gic.","kam.","nya.","kan.","nze.","ukw.","ugu.","uku."],["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza"]],u,[["BCE","CE"],u,u],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"RWF","RF","RWF",{"JPY":["JP¥","¥"],"RWF":["RF"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    J2Vxn/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['rwk'] = ["rwk",[["utuko","kyiukonyi"],u,u],u,[["J","J","J","J","A","I","J"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"],["Jumapilyi","Jumatatuu","Jumanne","Jumatanu","Alhamisi","Ijumaa","Jumamosi"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],["Januari","Februari","Machi","Aprilyi","Mei","Junyi","Julyai","Agusti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KK","BK"],u,["Kabla ya Kristu","Baada ya Kristu"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"TZS","TSh","Shilingi ya Tanzania",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ޑʱx
^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sa'] = ["sa",[["AM","PM"],u,["पूर्वाह्न","अपराह्न"]],[["AM","PM"],u,u],[["र","सो","मं","बु","गु","शु","श"],["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],["रविवासरः","सोमवासरः","मंगलवासरः","बुधवासरः","गुरुवासर:","शुक्रवासरः","शनिवासरः"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]],u,[["ज","फ","मा","अ","म","जू","जु","अ","सि","अ","न","दि"],["जनवरी:","फरवरी:","मार्च:","अप्रैल:","मई","जून:","जुलाई:","अगस्त:","सितंबर:","अक्तूबर:","नवंबर:","दिसंबर:"],["जनवरीमासः","फरवरीमासः","मार्चमासः","अप्रैलमासः","मईमासः","जूनमासः","जुलाईमासः","अगस्तमासः","सितंबरमासः","अक्तूबरमासः","नवंबरमासः","दिसंबरमासः"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["जनवरी:","फरवरी:","मार्च:","अप्रैल:","मई","जून:","जुलाई:","अगस्त:","सितंबर:","अक्तूबर:","नवंबर:","दिसंबर:"],["जनवरीमासः","फरवरीमासः","मार्चमासः","अप्रैलमासः","मईमासः","जूनमासः","जुलाईमासः","अगस्तमासः","सितंबरमासः","अक्तूबरमासः","नवंबरमासः","दिसंबरमासः"]],[["BCE","CE"],u,u],0,[0,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} तदा {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤#,##,##0.00","[#E0]"],"INR","₹","भारतीय रूप्यकम्",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    O)Ux3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sah'] = ["sah",[["ЭИ","ЭК"],u,u],u,[["Б","Б","О","С","Ч","Б","С"],["бс","бн","оп","сэ","чп","бэ","сб"],["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","Бээтиҥсэ","субуота"],["бс","бн","оп","сэ","чп","бэ","сб"]],u,[["Т","О","К","М","Ы","Б","О","А","Б","А","С","А"],["Тохс","Олун","Клн","Мсу","Ыам","Бэс","Отй","Атр","Блҕ","Алт","Сэт","Ахс"],["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйын","Бэс ыйын","От ыйын","Атырдьых ыйын","Балаҕан ыйын","Алтынньы","Сэтинньи","ахсынньы"]],[["Т","О","К","М","Ы","Б","О","А","Б","А","С","А"],["Тохс","Олун","Клн","Мсу","Ыам","Бэс","Отй","Атр","Блҕ","Алт","Сэт","Ахс"],["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйа","бэс ыйа","от ыйа","атырдьых ыйа","балаҕан ыйа","алтынньы","сэтинньи","ахсынньы"]],[["б. э. и.","б. э"],u,u],1,[6,0],["yy/M/d","y, MMM d","y, MMMM d","y 'сыл' MMMM d 'күнэ', EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","чыыһыла буотах",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"RUB","₽","Арассыыйа солкуобайа",{"JPY":["JP¥","¥"],"RUB":["₽"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    2G_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['saq'] = ["saq",[["Tesiran","Teipa"],u,u],u,[["A","K","O","I","I","S","K"],["Are","Kun","Ong","Ine","Ile","Sap","Kwe"],["Mderot ee are","Mderot ee kuni","Mderot ee ong’wan","Mderot ee inet","Mderot ee ile","Mderot ee sapa","Mderot ee kwe"],["Are","Kun","Ong","Ine","Ile","Sap","Kwe"]],u,[["O","W","O","O","I","I","S","I","S","T","T","T"],["Obo","Waa","Oku","Ong","Ime","Ile","Sap","Isi","Saa","Tom","Tob","Tow"],["Lapa le obo","Lapa le waare","Lapa le okuni","Lapa le ong’wan","Lapa le imet","Lapa le ile","Lapa le sapa","Lapa le isiet","Lapa le saal","Lapa le tomon","Lapa le tomon obo","Lapa le tomon waare"]],u,[["KK","BK"],u,["Kabla ya Christo","Baada ya Christo"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Njilingi eel Kenya",{"JPY":["JP¥","¥"],"KES":["Ksh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    sԻsx;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
return 5;
}
    global.ng.common.locales['sat-olck'] = ["sat-Olck",[["AM","PM"],u,["ᱥᱮᱛᱟᱜ","ᱧᱤᱫᱟᱹ"]],[["AM","PM"],u,u],[["ᱥ","ᱚ","ᱵ","ᱥ","ᱥ","ᱡ","ᱧ"],["ᱥᱤᱸ","ᱚᱛ","ᱵᱟ","ᱥᱟᱹ","ᱥᱟᱹᱨ","ᱡᱟᱹ","ᱧᱩ"],["ᱥᱤᱸᱜᱮ","ᱚᱛᱮ","ᱵᱟᱞᱮ","ᱥᱟᱹᱜᱩᱱ","ᱥᱟᱹᱨᱫᱤ","ᱡᱟᱹᱨᱩᱢ","ᱧᱩᱦᱩᱢ"],["ᱥᱤᱸ","ᱚᱛ","ᱵᱟ","ᱥᱟᱹ","ᱥᱟᱹᱨ","ᱡᱟᱹ","ᱧᱩ"]],u,[["ᱡ","ᱯ","ᱢ","ᱟ","ᱢ","ᱡ","ᱡ","ᱟ","ᱥ","ᱚ","ᱱ","ᱫ"],["ᱡᱟᱱ","ᱯᱷᱟ","ᱢᱟᱨ","ᱟᱯᱨ","ᱢᱮ","ᱡᱩᱱ","ᱡᱩᱞ","ᱟᱜᱟ","ᱥᱮᱯ","ᱚᱠᱴ","ᱱᱟᱣ","ᱫᱤᱥ"],["ᱡᱟᱱᱣᱟᱨᱤ","ᱯᱷᱟᱨᱣᱟᱨᱤ","ᱢᱟᱨᱪ","ᱟᱯᱨᱮᱞ","ᱢᱮ","ᱡᱩᱱ","ᱡᱩᱞᱟᱭ","ᱟᱜᱟᱥᱛ","ᱥᱮᱯᱴᱮᱢᱵᱟᱨ","ᱚᱠᱴᱚᱵᱟᱨ","ᱱᱟᱣᱟᱢᱵᱟᱨ","ᱫᱤᱥᱟᱢᱵᱟᱨ"]],u,[["ᱥᱮᱨᱢᱟ ᱞᱟᱦᱟ","ᱤᱥᱣᱤ"],u,u],0,[0,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","ᱥᱤᱧᱚᱛ ᱨᱮᱱᱟᱜ ᱴᱟᱠᱟ",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    :(sx1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
return 5;
}
    global.ng.common.locales['sat'] = ["sat",[["AM","PM"],u,["ᱥᱮᱛᱟᱜ","ᱧᱤᱫᱟᱹ"]],[["AM","PM"],u,u],[["ᱥ","ᱚ","ᱵ","ᱥ","ᱥ","ᱡ","ᱧ"],["ᱥᱤᱸ","ᱚᱛ","ᱵᱟ","ᱥᱟᱹ","ᱥᱟᱹᱨ","ᱡᱟᱹ","ᱧᱩ"],["ᱥᱤᱸᱜᱮ","ᱚᱛᱮ","ᱵᱟᱞᱮ","ᱥᱟᱹᱜᱩᱱ","ᱥᱟᱹᱨᱫᱤ","ᱡᱟᱹᱨᱩᱢ","ᱧᱩᱦᱩᱢ"],["ᱥᱤᱸ","ᱚᱛ","ᱵᱟ","ᱥᱟᱹ","ᱥᱟᱹᱨ","ᱡᱟᱹ","ᱧᱩ"]],u,[["ᱡ","ᱯ","ᱢ","ᱟ","ᱢ","ᱡ","ᱡ","ᱟ","ᱥ","ᱚ","ᱱ","ᱫ"],["ᱡᱟᱱ","ᱯᱷᱟ","ᱢᱟᱨ","ᱟᱯᱨ","ᱢᱮ","ᱡᱩᱱ","ᱡᱩᱞ","ᱟᱜᱟ","ᱥᱮᱯ","ᱚᱠᱴ","ᱱᱟᱣ","ᱫᱤᱥ"],["ᱡᱟᱱᱣᱟᱨᱤ","ᱯᱷᱟᱨᱣᱟᱨᱤ","ᱢᱟᱨᱪ","ᱟᱯᱨᱮᱞ","ᱢᱮ","ᱡᱩᱱ","ᱡᱩᱞᱟᱭ","ᱟᱜᱟᱥᱛ","ᱥᱮᱯᱴᱮᱢᱵᱟᱨ","ᱚᱠᱴᱚᱵᱟᱨ","ᱱᱟᱣᱟᱢᱵᱟᱨ","ᱫᱤᱥᱟᱢᱵᱟᱨ"]],u,[["ᱥᱮᱨᱢᱟ ᱞᱟᱦᱟ","ᱤᱥᱣᱤ"],u,u],0,[0,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","ᱥᱤᱧᱚᱛ ᱨᱮᱱᱟᱜ ᱴᱟᱠᱟ",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    56Wx{/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sbp'] = ["sbp",[["Lwamilawu","Pashamihe"],u,u],u,[["M","J","J","J","A","I","J"],["Mul","Jtt","Jnn","Jtn","Alh","Iju","Jmo"],["Mulungu","Jumatatu","Jumanne","Jumatano","Alahamisi","Ijumaa","Jumamosi"],["Mul","Jtt","Jnn","Jtn","Alh","Iju","Jmo"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Mup","Mwi","Msh","Mun","Mag","Muj","Msp","Mpg","Mye","Mok","Mus","Muh"],["Mupalangulwa","Mwitope","Mushende","Munyi","Mushende Magali","Mujimbi","Mushipepo","Mupuguto","Munyense","Mokhu","Musongandembwe","Muhaano"]],u,[["AK","PK"],u,["Ashanali uKilisito","Pamwandi ya Kilisto"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"TZS","TSh","Ihela ya Tansaniya",{"JPY":["JP¥","¥"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    wbx*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['sc'] = ["sc",[["m.","b."],["AM","PM"],u],[["AM","PM"],u,u],[["D","L","M","M","G","C","S"],["dom","lun","mar","mèr","giò","che","sàb"],["domìniga","lunis","martis","mèrcuris","giòbia","chenàbura","sàbadu"],["dom","lun","mar","mèr","giò","che","sàb"]],u,[["G","F","M","A","M","L","T","A","C","S","S","N"],["ghe","fre","mar","abr","maj","làm","trì","aus","cab","stG","stA","nad"],["ghennàrgiu","freàrgiu","martzu","abrile","maju","làmpadas","trìulas","austu","cabudanni","santugaine","santandria","nadale"]],u,[["a.C.","p.C."],u,["in antis de Cristu","a pustis de Cristu"]],1,[6,0],["dd/MM/y","d 'de' MMM y","d 'de' MMMM 'de' 'su' y","d 'de' MMMM 'de' 'su' y, 'de' EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'a' 'sas' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","èuro",{"JPY":["JP¥","¥"],"USD":["US$","$"],"XDR":["DIP"]},"ltr", plural, []];
  })(globalThis);
    uJax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['sd-arab'] = ["sd-Arab",[["صبح، منجهند","منجهند، شام"],["صبح، منجهند","شام، منجهند"],["صبح، منجهند","منجهند، شام"]],[["صبح، منجهند","منجهند، شام"],u,u],[["آچر","سو","اڱارو","اربع","خم","جمعو","ڇنڇر"],["آچر","سومر","اڱارو","اربع","خميس","جمعو","ڇنڇر"],u,u],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["جنوري","فيبروري","مارچ","اپريل","مئي","جون","جولاءِ","آگسٽ","سيپٽمبر","آڪٽوبر","نومبر","ڊسمبر"],u],u,[["BC","CD"],u,["قبل مسيح","عيسوي کان پهرين"]],0,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"PKR","Rs","پاڪستاني رپي",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PKR":["Rs"],"USD":["US$","$"]},"rtl", plural, []];
  })(globalThis);
    :JsLxp
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sd-deva'] = ["sd-Deva",[["AM","PM"],u,["मंझंदि खां पहिंरियों","मंझंदि खां पोइ"]],[["AM","PM"],u,u],[["आ","सू","मं","बु॒","वि","जु","छं"],["आर्त","सू","मंग","बु॒ध","विस","जुम","छंछ"],["आर्तवार","सूमर","मंगलु","बु॒धर","विस्पत","जुमो","छंछर"],["आर्त","सू","मंग","बु॒ध","विस","जुम","छंछ"]],[["आ","सू","मं","बु॒","वि","जु","छं"],["आ","सू","मं","बुध","विस","जु","छंछ"],["आर्त","सू","मं","बु॒ध","विस","जुम","छंछ"],["आर्त","सू","मंग","बु॒ध","विस","जुम","छंछ"]],[["ज","फ़","मा","अ","मा","जू","जु","अग","स","ऑ","न","डि"],["जन","फर","मार्च","अप्रै","मई","जून","जु","अग","सप्टे","ऑक्टो","नवं","डिसं"],["जनवरी","फरवरी","मार्चु","अप्रैल","मई","जून","जुलाई","अगस्ट","सप्टेंबर","ऑक्टोबर","नवंबर","डिसंबर"]],[["ज","फ़","म","अ","मा","जू","जु","अग","स","ऑ","न","डि"],["जन","फर","मार्च","अप्रै","मई","जून","जुला","अग","सप्टे","ऑक्टो","नवं","डिसं"],["जनवरी","फरवरी","मार्चु","अप्रैल","मई","जून","जुलाई","अगस्ट","सप्टेंबर","ऑक्टोबर","नवंबर","डिसंबर"]],[["बीसी","एडी"],u,u],0,[0,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} ते {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","हिंदुस्तानी रुपयो",{},"ltr", plural, []];
  })(globalThis);
    #:v`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['sd'] = ["sd",[["صبح، منجهند","منجهند، شام"],["صبح، منجهند","شام، منجهند"],["صبح، منجهند","منجهند، شام"]],[["صبح، منجهند","منجهند، شام"],u,u],[["آچر","سو","اڱارو","اربع","خم","جمعو","ڇنڇر"],["آچر","سومر","اڱارو","اربع","خميس","جمعو","ڇنڇر"],u,u],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["جنوري","فيبروري","مارچ","اپريل","مئي","جون","جولاءِ","آگسٽ","سيپٽمبر","آڪٽوبر","نومبر","ڊسمبر"],u],u,[["BC","CD"],u,["قبل مسيح","عيسوي کان پهرين"]],0,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"PKR","Rs","پاڪستاني رپي",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PKR":["Rs"],"USD":["US$","$"]},"rtl", plural, []];
  })(globalThis);
    3Qobx-/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
return 5;
}
    global.ng.common.locales['se-fi'] = ["se-FI",[["i","e"],["ib","eb"],u],[["ib","eb"],u,u],[["S","M","D","G","D","B","L"],["so","má","di","ga","du","be","lá"],["sotnabeaivi","mánnodat","disdat","gaskavahkku","duorastat","bearjadat","lávvordat"],["so","má","di","ga","du","be","lá"]],u,[["O","G","N","C","M","G","S","B","Č","G","S","J"],["ođđj","guov","njuk","cuoŋ","mies","geas","suoi","borg","čakč","golg","skáb","juov"],["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"]],u,[["oKr.","mKr."],u,["ovdal Kristusa","maŋŋel Kristusa"]],1,[6,0],["dd.MM.y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","·10^","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"DKK":["Dkr","kr"],"JPY":["JP¥","¥"],"NOK":["kr"],"SEK":["Skr","kr"],"THB":["฿"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    Vrixh/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
return 5;
}
    global.ng.common.locales['se-se'] = ["se-SE",[["i.b.","e.b."],u,["iđitbeaivet","eahketbeaivet"]],[["i.b.","e.b."],u,["iđitbeaivi","eahketbeaivi"]],[["S","V","M","G","D","B","L"],["sotn","vuos","maŋ","gask","duor","bear","láv"],["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorasdat","bearjadat","lávvardat"],["sotn","vuos","maŋ","gask","duor","bear","láv"]],u,[["O","G","N","C","M","G","S","B","Č","G","S","J"],["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov"],["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"]],u,[["o.Kr.","m.Kr."],u,["ovdal Kristtusa","maŋŋel Kristtusa"]],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","·10^","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"SEK","kr","ruoŧŧa kruvdno",{"DKK":["Dkr","kr"],"JPY":["JP¥","¥"],"NOK":["Nkr","kr"],"SEK":["kr"],"THB":["฿"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    hxp/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
return 5;
}
    global.ng.common.locales['se'] = ["se",[["i.b.","e.b."],u,["iđitbeaivet","eahketbeaivet"]],[["i.b.","e.b."],u,["iđitbeaivi","eahketbeaivi"]],[["S","V","M","G","D","B","L"],["sotn","vuos","maŋ","gask","duor","bear","láv"],["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorasdat","bearjadat","lávvardat"],["sotn","vuos","maŋ","gask","duor","bear","láv"]],u,[["O","G","N","C","M","G","S","B","Č","G","S","J"],["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov"],["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"]],u,[["o.Kr.","m.Kr."],u,["ovdal Kristtusa","maŋŋel Kristtusa"]],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","·10^","·","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"NOK","kr","norgga kruvdno",{"DKK":["Dkr","kr"],"JPY":["JP¥","¥"],"NOK":["kr"],"SEK":["Skr","kr"],"THB":["฿"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    4Wxx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['seh'] = ["seh",[["AM","PM"],u,u],u,[["D","P","C","T","N","S","S"],["Dim","Pos","Pir","Tat","Nai","Sha","Sab"],["Dimingu","Chiposi","Chipiri","Chitatu","Chinai","Chishanu","Sabudu"],["Dim","Pos","Pir","Tat","Nai","Sha","Sab"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Aug","Set","Otu","Nov","Dec"],["Janeiro","Fevreiro","Marco","Abril","Maio","Junho","Julho","Augusto","Setembro","Otubro","Novembro","Decembro"]],u,[["AC","AD"],u,["Antes de Cristo","Anno Domini"]],0,[6,0],["d/M/y","d 'de' MMM 'de' y","d 'de' MMMM 'de' y","EEEE, d 'de' MMMM 'de' y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"MZN","MTn","Metical de Moçambique",{"JPY":["JP¥","¥"],"MZN":["MTn"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    g)Sx;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['ses'] = ["ses",[["Adduha","Aluula"],u,u],u,[["H","T","T","L","L","L","S"],["Alh","Ati","Ata","Ala","Alm","Alz","Asi"],["Alhadi","Atinni","Atalaata","Alarba","Alhamiisa","Alzuma","Asibti"],["Alh","Ati","Ata","Ala","Alm","Alz","Asi"]],u,[["Ž","F","M","A","M","Ž","Ž","U","S","O","N","D"],["Žan","Fee","Mar","Awi","Me","Žuw","Žuy","Ut","Sek","Okt","Noo","Dee"],["Žanwiye","Feewiriye","Marsi","Awiril","Me","Žuweŋ","Žuyye","Ut","Sektanbur","Oktoobur","Noowanbur","Deesanbur"]],u,[["IJ","IZ"],u,["Isaa jine","Isaa zamanoo"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],["."," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"XOF","F CFA","CFA Fraŋ (BCEAO)",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    Wxv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sg'] = ["sg",[["ND","LK"],u,u],u,[["K","S","T","S","K","P","Y"],["Bk1","Bk2","Bk3","Bk4","Bk5","Lâp","Lây"],["Bikua-ôko","Bïkua-ûse","Bïkua-ptâ","Bïkua-usïö","Bïkua-okü","Lâpôsö","Lâyenga"],["Bk1","Bk2","Bk3","Bk4","Bk5","Lâp","Lây"]],u,[["N","F","M","N","B","F","L","K","M","N","N","K"],["Nye","Ful","Mbä","Ngu","Bêl","Fön","Len","Kük","Mvu","Ngb","Nab","Kak"],["Nyenye","Fulundïgi","Mbängü","Ngubùe","Bêläwü","Föndo","Lengua","Kükürü","Mvuka","Ngberere","Nabändüru","Kakauka"]],u,[["KnK","NpK"],u,["Kôzo na Krîstu","Na pekô tî Krîstu"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00;¤-#,##0.00","#E0"],"XAF","FCFA","farânga CFA (BEAC)",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ǬǴzx[/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
if (n === Math.floor(n) && (n >= 2 && n <= 10))
    return 3;
return 5;
}
    global.ng.common.locales['shi'] = ["shi",[["ⵜⵉⴼⴰⵡⵜ","ⵜⴰⴷⴳⴳⵯⴰⵜ"],u,u],u,[["S","M","T","W","T","F","S"],["ⴰⵙⴰ","ⴰⵢⵏ","ⴰⵙⵉ","ⴰⴽⵕ","ⴰⴽⵡ","ⴰⵙⵉⵎ","ⴰⵙⵉⴹ"],["ⴰⵙⴰⵎⴰⵙ","ⴰⵢⵏⴰⵙ","ⴰⵙⵉⵏⴰⵙ","ⴰⴽⵕⴰⵙ","ⴰⴽⵡⴰⵙ","ⵙⵉⵎⵡⴰⵙ","ⴰⵙⵉⴹⵢⴰⵙ"],["ⴰⵙⴰ","ⴰⵢⵏ","ⴰⵙⵉ","ⴰⴽⵕ","ⴰⴽⵡ","ⴰⵙⵉⵎ","ⴰⵙⵉⴹ"]],u,[["ⵉ","ⴱ","ⵎ","ⵉ","ⵎ","ⵢ","ⵢ","ⵖ","ⵛ","ⴽ","ⵏ","ⴷ"],["ⵉⵏⵏ","ⴱⵕⴰ","ⵎⴰⵕ","ⵉⴱⵔ","ⵎⴰⵢ","ⵢⵓⵏ","ⵢⵓⵍ","ⵖⵓⵛ","ⵛⵓⵜ","ⴽⵜⵓ","ⵏⵓⵡ","ⴷⵓⵊ"],["ⵉⵏⵏⴰⵢⵔ","ⴱⵕⴰⵢⵕ","ⵎⴰⵕⵚ","ⵉⴱⵔⵉⵔ","ⵎⴰⵢⵢⵓ","ⵢⵓⵏⵢⵓ","ⵢⵓⵍⵢⵓⵣ","ⵖⵓⵛⵜ","ⵛⵓⵜⴰⵏⴱⵉⵔ","ⴽⵜⵓⴱⵔ","ⵏⵓⵡⴰⵏⴱⵉⵔ","ⴷⵓⵊⴰⵏⴱⵉⵔ"]],u,[["ⴷⴰⵄ","ⴷⴼⵄ"],u,["ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ","ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ"]],1,[6,0],["d/M/y","d MMM, y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"MAD","MAD","ⴰⴷⵔⵉⵎ ⵏ ⵍⵎⵖⵔⵉⴱ",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    kx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (n === 0 || n === 1 || i === 0 && f === 1)
    return 1;
return 5;
}
    global.ng.common.locales['si'] = ["si",[["පෙ","ප"],["පෙ.ව.","ප.ව."],u],[["පෙ.ව.","ප.ව."],u,u],[["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],["ඉරිදා","සඳුදා","අඟහ","බදාදා","බ්‍රහස්","සිකු","සෙන"],["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],["ඉරි","සඳු","අඟ","බදා","බ්‍රහ","සිකු","සෙන"]],u,[["ජ","පෙ","මා","අ","මැ","ජූ","ජූ","අ","සැ","ඔ","නෙ","දෙ"],["ජන","පෙබ","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නොවැ","දෙසැ"],["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"]],[["ජ","පෙ","මා","අ","මැ","ජූ","ජූ","අ","සැ","ඔ","නෙ","දෙ"],["ජන","පෙබ","මාර්","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නොවැ","දෙසැ"],["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"]],[["ක්‍රි.පූ.","ක්‍රි.ව."],u,["ක්‍රිස්තු පූර්ව","ක්‍රිස්තු වර්ෂ"]],1,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH.mm","HH.mm.ss","HH.mm.ss z","HH.mm.ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN","."],["#,##0.###","#,##0%","¤#,##0.00","#"],"LKR","රු.","ශ්‍රී ලංකා රුපියල",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"LKR":["රු."],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XOF":["සිෆ්එ"]},"ltr", plural, [[["මැ","ම","පා","උ","ද","හ","රෑ","මැ"],["මැදියම","මධ්‍යාහ්නය","පාන්දර","උදේ","දවල්","හවස","රෑ","මැදියමට පසු"],u],[["මැදියම","මධ්‍යාහ්නය","පාන්දර","උදේ","දවල්","හවස","රෑ","මැදියමට පසු"],u,u],["00:00","12:00",["01:00","06:00"],["06:00","12:00"],["12:00","14:00"],["14:00","18:00"],["18:00","24:00"],["00:00","01:00"]]]];
  })(globalThis);
    Yx	0/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
if (i === Math.floor(i) && (i >= 2 && i <= 4) && v === 0)
    return 3;
if (!(v === 0))
    return 4;
return 5;
}
    global.ng.common.locales['sk'] = ["sk",[["AM","PM"],u,u],u,[["n","p","u","s","š","p","s"],["ne","po","ut","st","št","pi","so"],["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],["ne","po","ut","st","št","pi","so"]],u,[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra"]],[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"]],[["pred Kr.","po Kr."],u,["pred Kristom","po Kristovi"]],1,[6,0],["d. M. y",u,"d. MMMM y","EEEE d. MMMM y"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss zzzz"],["{1} {0}","{1}, {0}",u,u],[","," ",";","%","+","-","e","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":["NIS","₪"],"INR":[u,"₹"],"JPY":[u,"¥"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"RUR":[u,"р."],"TWD":[u,"NT$"],"USD":[u,"$"],"VND":[u,"₫"],"XXX":[]},"ltr", plural, [[["o poln.","nap.","ráno","dop.","pop.","več.","v n."],["o poln.","napol.","ráno","dopol.","popol.","večer","v noci"],["o polnoci","napoludnie","ráno","dopoludnia","popoludní","večer","v noci"]],[["poln.","pol.","ráno","dop.","pop.","več.","noc"],["poln.","pol.","ráno","dopol.","popol.","večer","noc"],["polnoc","poludnie","ráno","dopoludnie","popoludnie","večer","noc"]],["00:00","12:00",["04:00","09:00"],["09:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","04:00"]]]];
  })(globalThis);
    #x$/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && i % 100 === 1)
    return 1;
if (v === 0 && i % 100 === 2)
    return 2;
if (v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 3 && i % 100 <= 4)) || !(v === 0))
    return 3;
return 5;
}
    global.ng.common.locales['sl'] = ["sl",[["d","p"],["dop.","pop."],u],[["d","p"],["dop.","pop."],["dopoldne","popoldne"]],[["n","p","t","s","č","p","s"],["ned.","pon.","tor.","sre.","čet.","pet.","sob."],["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],["ned.","pon.","tor.","sre.","čet.","pet.","sob."]],u,[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan.","feb.","mar.","apr.","maj","jun.","jul.","avg.","sep.","okt.","nov.","dec."],["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"]],u,[["pr. Kr.","po Kr."],u,["pred Kristusom","po Kristusu"]],1,[6,0],["d. MM. yy","d. MMM y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} {0}",u],[",",".",";","%","+","−","e","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","evro",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"GBP":[u,"£"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":[u,"NT$"],"XCD":[u,"$"]},"ltr", plural, [[["24.00","12.00","zj","d","p","zv","po"],["opoln.","opold.","zjut.","dop.","pop.","zveč.","ponoči"],["opolnoči","opoldne","zjutraj","dopoldan","popoldan","zvečer","ponoči"]],[["24.00","12.00","j","d","p","v","n"],["poln.","pold.","jut.","dop.","pop.","zveč.","noč"],["polnoč","poldne","jutro","dopoldne","popoldne","večer","noč"]],["00:00","12:00",["06:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","22:00"],["22:00","06:00"]]]];
  })(globalThis);
    TCnx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
if (n === 2)
    return 2;
return 5;
}
    global.ng.common.locales['smn'] = ["smn",[["ip.","ep."],u,u],u,[["p","V","M","K","T","V","L"],["pas","vuo","maj","kos","tuo","vás","láv"],["pasepeeivi","vuossaargâ","majebaargâ","koskoho","tuorâstuv","vástuppeeivi","lávurduv"],["pa","vu","ma","ko","tu","vá","lá"]],[["S","M","T","W","T","F","S"],["pas","vuo","maj","kos","tuo","vás","láv"],["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávurdâh"],["pa","vu","ma","ko","tu","vá","lá"]],[["U","K","NJ","C","V","K","S","P","Č","R","S","J"],["uđiv","kuovâ","njuhčâ","cuáŋui","vyesi","kesi","syeini","porge","čohčâ","roovvâd","skammâ","juovlâ"],["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu"]],u,[["oKr.","mKr."],u,["Ovdil Kristus šoddâm","maŋa Kristus šoddâm"]],1,[6,0],["d.M.y","MMM d. y","MMMM d. y","cccc, MMMM d. y"],["H.mm","H.mm.ss","H.mm.ss z","H.mm.ss zzzz"],["{1} {0}","{1} 'tme' {0}",u,u],[","," ",";","%","+","-","E","×","‰","∞","epiloho","."],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    fKؼVxl/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['sn'] = ["sn",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","C","C","C","C","M"],["Svo","Muv","Chp","Cht","Chn","Chs","Mug"],["Svondo","Muvhuro","Chipiri","Chitatu","China","Chishanu","Mugovera"],["Sv","Mu","Cp","Ct","Cn","Cs","Mg"]],u,[["N","K","K","K","C","C","C","N","G","G","M","Z"],["Ndi","Kuk","Kur","Kub","Chv","Chk","Chg","Nya","Gun","Gum","Mbu","Zvi"],["Ndira","Kukadzi","Kurume","Kubvumbi","Chivabvu","Chikumi","Chikunguru","Nyamavhuvhu","Gunyana","Gumiguru","Mbudzi","Zvita"]],u,[["BC","AD"],u,["Kristo asati auya","mugore ramambo vedu"]],0,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","US$","Dora re Amerika",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    |x4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['so-dj'] = ["so-DJ",[["h","d"],["GH","GD"],u],[["AM","GD"],u,["GH","GD"]],[["A","I","T","A","Kh","J","S"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"],["Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"]],[["A","I","T","A","Kh","J","S"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"],["Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti"],["Axd","Isn","Tldo","Arbaco","Khms","Jmc","Sbti"]],[["J","F","M","A","M","J","L","O","S","O","N","D"],["Jan","Feb","Mar","Abr","May","Jun","Lul","Ogs","Seb","Okt","Nof","Dis"],["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"]],[["J","F","M","A","M","J","L","O","S","O","N","D"],["Jan","Feb","Mar","Abr","May","Jun","Lul","Ogs","Seb","Okt","Nof","Dis"],["Jannaayo","Febraayo","Maarso","Abriil","May","Juun","Luuliyo","Ogost","Sebtembar","Oktoobar","Nofembar","Desembar"]],[["B","A"],["BC","AD"],["Ciise Hortii","Ciise Dabadii"]],6,[6,0],["dd/MM/yy","dd-MMM-y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1} 'ee' {0}",u,u],[".",",",";","%","+","-","E","×","‰","∞","MaL",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"DJF","Fdj","Faran Jabuuti",{"BBD":["DBB","$"],"DJF":["Fdj"],"JPY":["JP¥","¥"],"SOS":["S"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    I6O|x4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['so-et'] = ["so-ET",[["h","d"],["GH","GD"],u],[["AM","GD"],u,["GH","GD"]],[["A","I","T","A","Kh","J","S"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"],["Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"]],[["A","I","T","A","Kh","J","S"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"],["Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti"],["Axd","Isn","Tldo","Arbaco","Khms","Jmc","Sbti"]],[["J","F","M","A","M","J","L","O","S","O","N","D"],["Jan","Feb","Mar","Abr","May","Jun","Lul","Ogs","Seb","Okt","Nof","Dis"],["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"]],[["J","F","M","A","M","J","L","O","S","O","N","D"],["Jan","Feb","Mar","Abr","May","Jun","Lul","Ogs","Seb","Okt","Nof","Dis"],["Jannaayo","Febraayo","Maarso","Abriil","May","Juun","Luuliyo","Ogost","Sebtembar","Oktoobar","Nofembar","Desembar"]],[["B","A"],["BC","AD"],["Ciise Hortii","Ciise Dabadii"]],0,[6,0],["dd/MM/yy","dd-MMM-y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1} 'ee' {0}",u,u],[".",",",";","%","+","-","E","×","‰","∞","MaL",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ETB","Br","Birta Itoobbiya",{"BBD":["DBB","$"],"ETB":["Br"],"JPY":["JP¥","¥"],"SOS":["S"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    o6|x6/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['so-ke'] = ["so-KE",[["h","d"],["GH","GD"],u],[["AM","GD"],u,["GH","GD"]],[["A","I","T","A","Kh","J","S"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"],["Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"]],[["A","I","T","A","Kh","J","S"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"],["Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti"],["Axd","Isn","Tldo","Arbaco","Khms","Jmc","Sbti"]],[["J","F","M","A","M","J","L","O","S","O","N","D"],["Jan","Feb","Mar","Abr","May","Jun","Lul","Ogs","Seb","Okt","Nof","Dis"],["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"]],[["J","F","M","A","M","J","L","O","S","O","N","D"],["Jan","Feb","Mar","Abr","May","Jun","Lul","Ogs","Seb","Okt","Nof","Dis"],["Jannaayo","Febraayo","Maarso","Abriil","May","Juun","Luuliyo","Ogost","Sebtembar","Oktoobar","Nofembar","Desembar"]],[["B","A"],["BC","AD"],["Ciise Hortii","Ciise Dabadii"]],0,[6,0],["dd/MM/yy","dd-MMM-y","MMMM d, y","EEEE, MMMM d, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1} 'ee' {0}",u,u],[".",",",";","%","+","-","E","×","‰","∞","MaL",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"KES","Ksh","Shilingka Kenya",{"BBD":["DBB","$"],"JPY":["JP¥","¥"],"KES":["Ksh"],"SOS":["S"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    l6{xC/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['so'] = ["so",[["h","d"],["GH","GD"],u],[["AM","GD"],u,["GH","GD"]],[["A","I","T","A","Kh","J","S"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"],["Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"]],[["A","I","T","A","Kh","J","S"],["Axd","Isn","Tldo","Arbc","Khms","Jmc","Sbti"],["Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti"],["Axd","Isn","Tldo","Arbaco","Khms","Jmc","Sbti"]],[["J","F","M","A","M","J","L","O","S","O","N","D"],["Jan","Feb","Mar","Abr","May","Jun","Lul","Ogs","Seb","Okt","Nof","Dis"],["Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad"]],[["J","F","M","A","M","J","L","O","S","O","N","D"],["Jan","Feb","Mar","Abr","May","Jun","Lul","Ogs","Seb","Okt","Nof","Dis"],["Jannaayo","Febraayo","Maarso","Abriil","May","Juun","Luuliyo","Ogost","Sebtembar","Oktoobar","Nofembar","Desembar"]],[["B","A"],["BC","AD"],["Ciise Hortii","Ciise Dabadii"]],1,[6,0],["dd/MM/yy","dd-MMM-y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1} 'ee' {0}",u,u],[".",",",";","%","+","-","E","×","‰","∞","MaL",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"SOS","S","Shilingka Soomaaliya",{"BBD":["DBB","$"],"JPY":["JP¥","¥"],"SOS":["S"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    F3Sxf/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['sq-mk'] = ["sq-MK",[["p.d.","m.d."],u,["e paradites","e pasdites"]],[["p.d.","m.d."],u,["paradite","pasdite"]],[["d","h","m","m","e","p","sh"],["Die","Hën","Mar","Mër","Enj","Pre","Sht"],["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],["die","hën","mar","mër","enj","pre","sht"]],[["d","h","m","m","e","p","sh"],["die","hën","mar","mër","enj","pre","sht"],["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],["die","hën","mar","mër","enj","pre","sht"]],[["j","sh","m","p","m","q","k","g","sh","t","n","dh"],["jan","shk","mar","pri","maj","qer","korr","gush","sht","tet","nën","dhj"],["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"]],u,[["p.K.","mb.K."],u,["para Krishtit","mbas Krishtit"]],1,[6,0],["d.M.yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'në' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"MKD","den","Denari maqedonas",{"AFN":[],"ALL":["Lekë"],"AMD":[],"AOA":[],"ARS":[],"AUD":["A$","AUD"],"AZN":[],"BAM":[],"BBD":[],"BDT":[],"BMD":[],"BND":[],"BOB":[],"BRL":[],"BSD":[],"BWP":[],"BZD":[],"CAD":["CA$","CAD"],"CLP":[],"CNY":["CN¥","CNY"],"COP":[],"CRC":[],"CUC":[],"CUP":[],"CZK":[],"DKK":[],"DOP":[],"EGP":[],"FJD":[],"FKP":[],"GBP":["£","GBP"],"GEL":[],"GIP":[],"GNF":[],"GTQ":[],"GYD":[],"HKD":["HK$","HKS"],"HNL":[],"HRK":[],"HUF":[],"IDR":[],"ILS":["₪","ILS"],"INR":["₹","INR"],"ISK":[],"JMD":[],"JPY":["JP¥","JPY"],"KHR":[],"KMF":[],"KPW":[],"KRW":["₩","KRW"],"KYD":[],"KZT":[],"LAK":[],"LBP":[],"LKR":[],"LRD":[],"MGA":[],"MKD":["den"],"MMK":[],"MNT":[],"MUR":[],"MXN":["MX$","MXN"],"MYR":[],"NAD":[],"NGN":[],"NIO":[],"NOK":[],"NPR":[],"NZD":["NZ$","NZD"],"PHP":[],"PKR":[],"PLN":[],"PYG":[],"RON":[],"RUB":[],"RWF":[],"SBD":[],"SEK":[],"SGD":[],"SHP":[],"SRD":[],"SSP":[],"STN":[],"SYP":[],"THB":["฿","THB"],"TOP":[],"TRY":[],"TTD":[],"TWD":["NT$","TWD"],"UAH":[],"USD":["US$","USD"],"UYU":[],"VND":["₫","VND"],"XCD":["EC$","XCD"],"ZAR":[],"ZMW":[]},"ltr", plural, [[["e mesnatës","e mesditës","e mëngjesit","e paradites","e pasdites","e mbrëmjes","e natës"],u,u],[["mesnatë","mesditë","mëngjes","paradite","pasdite","mbrëmje","natë"],u,u],["00:00","12:00",["04:00","09:00"],["09:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    4T걸x~/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['sq-xk'] = ["sq-XK",[["p.d.","m.d."],u,["e paradites","e pasdites"]],[["p.d.","m.d."],u,["paradite","pasdite"]],[["d","h","m","m","e","p","sh"],["Die","Hën","Mar","Mër","Enj","Pre","Sht"],["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],["die","hën","mar","mër","enj","pre","sht"]],[["d","h","m","m","e","p","sh"],["die","hën","mar","mër","enj","pre","sht"],["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],["die","hën","mar","mër","enj","pre","sht"]],[["j","sh","m","p","m","q","k","g","sh","t","n","dh"],["jan","shk","mar","pri","maj","qer","korr","gush","sht","tet","nën","dhj"],["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"]],u,[["p.K.","mb.K."],u,["para Krishtit","mbas Krishtit"]],1,[6,0],["d.M.yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'në' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","Euroja",{"AFN":[],"ALL":["Lekë"],"AMD":[],"AOA":[],"ARS":[],"AUD":["A$","AUD"],"AZN":[],"BAM":[],"BBD":[],"BDT":[],"BMD":[],"BND":[],"BOB":[],"BRL":[],"BSD":[],"BWP":[],"BZD":[],"CAD":["CA$","CAD"],"CLP":[],"CNY":["CN¥","CNY"],"COP":[],"CRC":[],"CUC":[],"CUP":[],"CZK":[],"DKK":[],"DOP":[],"EGP":[],"FJD":[],"FKP":[],"GBP":["£","GBP"],"GEL":[],"GIP":[],"GNF":[],"GTQ":[],"GYD":[],"HKD":["HK$","HKS"],"HNL":[],"HRK":[],"HUF":[],"IDR":[],"ILS":["₪","ILS"],"INR":["₹","INR"],"ISK":[],"JMD":[],"JPY":["JP¥","JPY"],"KHR":[],"KMF":[],"KPW":[],"KRW":["₩","KRW"],"KYD":[],"KZT":[],"LAK":[],"LBP":[],"LKR":[],"LRD":[],"MGA":[],"MMK":[],"MNT":[],"MUR":[],"MXN":["MX$","MXN"],"MYR":[],"NAD":[],"NGN":[],"NIO":[],"NOK":[],"NPR":[],"NZD":["NZ$","NZD"],"PHP":[],"PKR":[],"PLN":[],"PYG":[],"RON":[],"RUB":[],"RWF":[],"SBD":[],"SEK":[],"SGD":[],"SHP":[],"SRD":[],"SSP":[],"STN":[],"SYP":[],"THB":["฿","THB"],"TOP":[],"TRY":[],"TTD":[],"TWD":["NT$","TWD"],"UAH":[],"USD":["US$","USD"],"UYU":[],"VND":["₫","VND"],"XCD":["EC$","XCD"],"ZAR":[],"ZMW":[]},"ltr", plural, [[["e mesnatës","e mesditës","e mëngjesit","e paradites","e pasdites","e mbrëmjes","e natës"],u,u],[["mesnatë","mesditë","mëngjes","paradite","pasdite","mbrëmje","natë"],u,u],["00:00","12:00",["04:00","09:00"],["09:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    Njxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['sq'] = ["sq",[["p.d.","m.d."],u,["e paradites","e pasdites"]],[["p.d.","m.d."],u,["paradite","pasdite"]],[["d","h","m","m","e","p","sh"],["Die","Hën","Mar","Mër","Enj","Pre","Sht"],["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],["die","hën","mar","mër","enj","pre","sht"]],[["d","h","m","m","e","p","sh"],["die","hën","mar","mër","enj","pre","sht"],["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],["die","hën","mar","mër","enj","pre","sht"]],[["j","sh","m","p","m","q","k","g","sh","t","n","dh"],["jan","shk","mar","pri","maj","qer","korr","gush","sht","tet","nën","dhj"],["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"]],u,[["p.K.","mb.K."],u,["para Krishtit","mbas Krishtit"]],1,[6,0],["d.M.yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a, z","h:mm:ss a, zzzz"],["{1}, {0}",u,"{1} 'në' {0}",u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"ALL","Lekë","Leku shqiptar",{"AFN":[],"ALL":["Lekë"],"AMD":[],"AOA":[],"ARS":[],"AUD":["A$","AUD"],"AZN":[],"BAM":[],"BBD":[],"BDT":[],"BMD":[],"BND":[],"BOB":[],"BRL":[],"BSD":[],"BWP":[],"BZD":[],"CAD":["CA$","CAD"],"CLP":[],"CNY":["CN¥","CNY"],"COP":[],"CRC":[],"CUC":[],"CUP":[],"CZK":[],"DKK":[],"DOP":[],"EGP":[],"FJD":[],"FKP":[],"GBP":["£","GBP"],"GEL":[],"GIP":[],"GNF":[],"GTQ":[],"GYD":[],"HKD":["HK$","HKS"],"HNL":[],"HRK":[],"HUF":[],"IDR":[],"ILS":["₪","ILS"],"INR":["₹","INR"],"ISK":[],"JMD":[],"JPY":["JP¥","JPY"],"KHR":[],"KMF":[],"KPW":[],"KRW":["₩","KRW"],"KYD":[],"KZT":[],"LAK":[],"LBP":[],"LKR":[],"LRD":[],"MGA":[],"MMK":[],"MNT":[],"MUR":[],"MXN":["MX$","MXN"],"MYR":[],"NAD":[],"NGN":[],"NIO":[],"NOK":[],"NPR":[],"NZD":["NZ$","NZD"],"PHP":[],"PKR":[],"PLN":[],"PYG":[],"RON":[],"RUB":[],"RWF":[],"SBD":[],"SEK":[],"SGD":[],"SHP":[],"SRD":[],"SSP":[],"STN":[],"SYP":[],"THB":["฿","THB"],"TOP":[],"TRY":[],"TTD":[],"TWD":["NT$","TWD"],"UAH":[],"USD":["US$","USD"],"UYU":[],"VND":["₫","VND"],"XCD":["EC$","XCD"],"ZAR":[],"ZMW":[]},"ltr", plural, [[["e mesnatës","e mesditës","e mëngjesit","e paradites","e pasdites","e mbrëmjes","e natës"],u,u],[["mesnatë","mesditë","mëngjes","paradite","pasdite","mbrëmje","natë"],u,u],["00:00","12:00",["04:00","09:00"],["09:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    9Qdx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['sr-cyrl-ba'] = ["sr-Cyrl-BA",[["AM","PM"],["прије подне","по подне"],u],[["а","p"],["прије подне","по подне"],u],[["н","п","у","с","ч","п","с"],["нед","пон","уто","сре","чет","пет","суб"],["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],["не","по","ут","ср","че","пе","су"]],[["н","п","у","с","ч","п","с"],["нед","пон","уто","сри","чет","пет","суб"],["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],["не","по","ут","ср","че","пе","су"]],[["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"]],u,[["п.н.е.","н.е."],["п. н. е.","н. е."],["прије нове ере","нове ере"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"BAM","КМ","Босанскохерцеговачка конвертибилна марка",{"AUD":[u,"$"],"BAM":["КМ","KM"],"BYN":[u,"р."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["поноћ","подне","јутро","по под.","вече","ноћ"],["поноћ","подне","јутро","по под.","вече","ноћу"],["поноћ","подне","ујутро","по подне","увече","ноћу"]],[["поноћ","подне","јутро","поподне","вече","ноћ"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    mx
q/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['sr-cyrl-me'] = ["sr-Cyrl-ME",[["AM","PM"],["прије подне","по подне"],u],[["a","p"],["прије подне","по подне"],u],[["н","п","у","с","ч","п","с"],["нед","пон","уто","сре","чет","пет","суб"],["недјеља","понедељак","уторак","сриједа","четвртак","петак","субота"],["не","по","ут","ср","че","пе","су"]],u,[["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],["јан","феб","март","апр","мај","јун","јул","авг","септ","окт","нов","дец"],["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"]],u,[["п.н.е.","н.е."],["п. н. е.","н. е."],["прије нове ере","нове ере"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","Евро",{"AUD":[u,"$"],"BAM":["КМ","KM"],"BYN":[u,"р."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["поноћ","подне","јутро","по под.","вече","ноћ"],["поноћ","подне","јутро","по под.","вече","ноћу"],["поноћ","подне","ујутро","по подне","увече","ноћу"]],[["поноћ","подне","јутро","поподне","вече","ноћ"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    "ἣx<
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['sr-cyrl-xk'] = ["sr-Cyrl-XK",[["AM","PM"],u,u],[["a","p"],["AM","PM"],u],[["н","п","у","с","ч","п","с"],["нед","пон","уто","сре","чет","пет","суб"],["недеља","понедељак","уторак","среда","четвртак","петак","субота"],["не","по","ут","ср","че","пе","су"]],u,[["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],["јан","феб","март","апр","мај","јун","јул","авг","септ","окт","нов","дец"],["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"]],u,[["п.н.е.","н.е."],["п. н. е.","н. е."],["пре нове ере","нове ере"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","Евро",{"AUD":[u,"$"],"BAM":["КМ","KM"],"BYN":[u,"р."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["поноћ","подне","јутро","по под.","вече","ноћ"],["поноћ","подне","јутро","по под.","увече","ноћу"],["поноћ","подне","ујутро","по подне","увече","ноћу"]],[["поноћ","подне","јутро","поподне","вече","ноћ"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sr-latn-ba'] = ["sr-Latn-BA",[["AM","PM"],["prije podne","po podne"],u],[["a","p"],["prije podne","po podne"],u],[["n","p","u","s","č","p","s"],["ned","pon","uto","sre","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ne","po","ut","sr","če","pe","su"]],[["n","p","u","s","č","p","s"],["ned","pon","uto","sri","čet","pet","sub"],["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],["ne","po","ut","sr","če","pe","su"]],[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"]],u,[["p.n.e.","n.e."],["p. n. e.","n. e."],["prije nove ere","nove ere"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"BAM","KM","Bosanskohercegovačka konvertibilna marka",{"AUD":[u,"$"],"BAM":["KM"],"BYN":[u,"r."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["ponoć","podne","jutro","po pod.","veče","noć"],["ponoć","podne","jutro","po pod.","veče","noću"],["ponoć","podne","ujutro","po podne","uveče","noću"]],[["ponoć","podne","jutro","popodne","veče","noć"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    frx-/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sr-latn-me'] = ["sr-Latn-ME",[["AM","PM"],["prije podne","po podne"],u],[["a","p"],["prije podne","po podne"],u],[["n","p","u","s","č","p","s"],["ned","pon","uto","sre","čet","pet","sub"],["nedjelja","ponedeljak","utorak","srijeda","četvrtak","petak","subota"],["ne","po","ut","sr","če","pe","su"]],u,[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mart","apr","maj","jun","jul","avg","sept","okt","nov","dec"],["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"]],u,[["p.n.e.","n.e."],["p. n. e.","n. e."],["prije nove ere","nove ere"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","Evro",{"AUD":[u,"$"],"BAM":["KM"],"BYN":[u,"r."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["ponoć","podne","jutro","po pod.","veče","noć"],["ponoć","podne","jutro","po pod.","veče","noću"],["ponoć","podne","ujutro","po podne","uveče","noću"]],[["ponoć","podne","jutro","popodne","veče","noć"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ypx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sr-latn-xk'] = ["sr-Latn-XK",[["AM","PM"],u,u],[["a","p"],["AM","PM"],u],[["n","p","u","s","č","p","s"],["ned","pon","uto","sre","čet","pet","sub"],["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],["ne","po","ut","sr","če","pe","su"]],u,[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mart","apr","maj","jun","jul","avg","sept","okt","nov","dec"],["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"]],u,[["p.n.e.","n.e."],["p. n. e.","n. e."],["pre nove ere","nove ere"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"EUR","€","Evro",{"AUD":[u,"$"],"BAM":["KM"],"BYN":[u,"r."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["ponoć","podne","jutro","po pod.","veče","noć"],["ponoć","podne","jutro","po pod.","uveče","noću"],["ponoć","podne","ujutro","po podne","uveče","noću"]],[["ponoć","podne","jutro","popodne","veče","noć"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ׻jnx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['sr-latn'] = ["sr-Latn",[["AM","PM"],u,u],[["pre podne","po podne"],["AM","PM"],u],[["n","p","u","s","č","p","s"],["ned","pon","uto","sre","čet","pet","sub"],["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],["ne","po","ut","sr","če","pe","su"]],u,[["j","f","m","a","m","j","j","a","s","o","n","d"],["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"]],u,[["p.n.e.","n.e."],["p. n. e.","n. e."],["pre nove ere","nove ere"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"RSD","RSD","srpski dinar",{"AUD":[u,"$"],"BAM":["KM"],"BYN":[u,"r."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["ponoć","podne","ujutru","po podne","uveče","noću"],["ponoć","podne","ujutro","po podne","uveče","noću"],u],[["ponoć","podne","jutro","popodne","veče","noć"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    bVx
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
    return 3;
return 5;
}
    global.ng.common.locales['sr'] = ["sr",[["AM","PM"],u,u],[["пре подне","по подне"],["AM","PM"],u],[["н","п","у","с","ч","п","с"],["нед","пон","уто","сре","чет","пет","суб"],["недеља","понедељак","уторак","среда","четвртак","петак","субота"],["не","по","ут","ср","че","пе","су"]],u,[["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"]],u,[["п.н.е.","н.е."],["п. н. е.","н. е."],["пре нове ере","нове ере"]],1,[6,0],["d.M.yy.","d. M. y.","d. MMMM y.","EEEE, d. MMMM y."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"RSD","RSD","српски динар",{"AUD":[u,"$"],"BAM":["КМ","KM"],"BYN":[u,"р."],"GEL":[u,"ლ"],"KRW":[u,"₩"],"NZD":[u,"$"],"PHP":[u,"₱"],"TWD":["NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["поноћ","подне","ујутру","по подне","увече","ноћу"],["поноћ","подне","ујутро","по подне","увече","ноћу"],u],[["поноћ","подне","јутро","поподне","вече","ноћ"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ܴPx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['su-latn'] = ["su-Latn",[["AM","PM"],u,u],u,[["M","S","S","R","K","J","S"],["Mng","Sen","Sal","Reb","Kem","Jum","Sap"],["Minggu","Senén","Salasa","Rebo","Kemis","Jumaah","Saptu"],["Mng","Sen","Sal","Reb","Kem","Jum","Sap"]],u,[["J","P","M","A","M","J","J","A","S","O","N","D"],["Jan","Péb","Mar","Apr","Méi","Jun","Jul","Ags","Sép","Okt","Nop","Dés"],["Januari","Pébruari","Maret","April","Méi","Juni","Juli","Agustus","Séptémber","Oktober","Nopémber","Désémber"]],u,[["SM","M"],u,u],0,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["H.mm","H.mm.ss","H.mm.ss z","H.mm.ss zzzz"],["{1}, {0}",u,"{1} 'jam' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN","."],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"IDR","Rp","Rupee Indonésia",{"IDR":["Rp"]},"ltr", plural, []];
  })(globalThis);
    `x>Ox/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['su'] = ["su",[["AM","PM"],u,u],u,[["M","S","S","R","K","J","S"],["Mng","Sen","Sal","Reb","Kem","Jum","Sap"],["Minggu","Senén","Salasa","Rebo","Kemis","Jumaah","Saptu"],["Mng","Sen","Sal","Reb","Kem","Jum","Sap"]],u,[["J","P","M","A","M","J","J","A","S","O","N","D"],["Jan","Péb","Mar","Apr","Méi","Jun","Jul","Ags","Sép","Okt","Nop","Dés"],["Januari","Pébruari","Maret","April","Méi","Juni","Juli","Agustus","Séptémber","Oktober","Nopémber","Désémber"]],u,[["SM","M"],u,u],0,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE, d MMMM y"],["H.mm","H.mm.ss","H.mm.ss z","H.mm.ss zzzz"],["{1}, {0}",u,"{1} 'jam' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN","."],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"IDR","Rp","Rupee Indonésia",{"IDR":["Rp"]},"ltr", plural, []];
  })(globalThis);
    tx	Q/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['sv-ax'] = ["sv-AX",[["fm","em"],u,u],[["fm","em"],["f.m.","e.m."],["förmiddag","eftermiddag"]],[["S","M","T","O","T","F","L"],["sön","mån","tis","ons","tors","fre","lör"],["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],["sö","må","ti","on","to","fr","lö"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mars","apr.","maj","juni","juli","aug.","sep.","okt.","nov.","dec."],["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"]],u,[["f.Kr.","e.Kr."],u,["före Kristus","efter Kristus"]],1,[6,0],["y-MM-dd","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","×10^","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":[u,"$"],"BBD":["Bds$","$"],"BMD":["BM$","$"],"BRL":["BR$","R$"],"BSD":["BS$","$"],"BYN":[u,"р."],"BZD":["BZ$","$"],"CNY":[u,"¥"],"DKK":["Dkr","kr"],"DOP":["RD$","$"],"EEK":["Ekr"],"EGP":["EG£","E£"],"ESP":[],"GBP":[u,"£"],"HKD":[u,"$"],"IEP":["IE£"],"INR":[u,"₹"],"ISK":["Ikr","kr"],"JMD":["JM$","$"],"JPY":[u,"¥"],"KRW":[u,"₩"],"NOK":["Nkr","kr"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SEK":["kr"],"TWD":[u,"NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["midn.","på morg.","på förm.","på efterm.","på kvällen","på natten"],["midnatt","på morg.","på förm.","på efterm.","på kvällen","på natten"],["midnatt","på morgonen","på förmiddagen","på eftermiddagen","på kvällen","på natten"]],[["midn.","morg.","förm.","efterm.","kväll","natt"],["midnatt","morgon","förm.","efterm.","kväll","natt"],["midnatt","morgon","förmiddag","eftermiddag","kväll","natt"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    x	Q/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['sv-fi'] = ["sv-FI",[["fm","em"],u,u],[["fm","em"],["f.m.","e.m."],["förmiddag","eftermiddag"]],[["S","M","T","O","T","F","L"],["sön","mån","tis","ons","tors","fre","lör"],["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],["sö","må","ti","on","to","fr","lö"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mars","apr.","maj","juni","juli","aug.","sep.","okt.","nov.","dec."],["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"]],u,[["f.Kr.","e.Kr."],u,["före Kristus","efter Kristus"]],1,[6,0],["y-MM-dd","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","×10^","×","‰","∞","NaN","."],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"EUR","€","euro",{"AUD":[u,"$"],"BBD":["Bds$","$"],"BMD":["BM$","$"],"BRL":["BR$","R$"],"BSD":["BS$","$"],"BYN":[u,"р."],"BZD":["BZ$","$"],"CNY":[u,"¥"],"DKK":["Dkr","kr"],"DOP":["RD$","$"],"EEK":["Ekr"],"EGP":["EG£","E£"],"ESP":[],"GBP":[u,"£"],"HKD":[u,"$"],"IEP":["IE£"],"INR":[u,"₹"],"ISK":["Ikr","kr"],"JMD":["JM$","$"],"JPY":[u,"¥"],"KRW":[u,"₩"],"NOK":["Nkr","kr"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SEK":["kr"],"TWD":[u,"NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["midn.","på morg.","på förm.","på efterm.","på kvällen","på natten"],["midnatt","på morg.","på förm.","på efterm.","på kvällen","på natten"],["midnatt","på morgonen","på förmiddagen","på eftermiddagen","på kvällen","på natten"]],[["midn.","morg.","förm.","efterm.","kväll","natt"],["midnatt","morgon","förm.","efterm.","kväll","natt"],["midnatt","morgon","förmiddag","eftermiddag","kväll","natt"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    O忚x	P/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['sv'] = ["sv",[["fm","em"],u,u],[["fm","em"],["f.m.","e.m."],["förmiddag","eftermiddag"]],[["S","M","T","O","T","F","L"],["sön","mån","tis","ons","tors","fre","lör"],["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],["sö","må","ti","on","to","fr","lö"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["jan.","feb.","mars","apr.","maj","juni","juli","aug.","sep.","okt.","nov.","dec."],["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"]],u,[["f.Kr.","e.Kr."],u,["före Kristus","efter Kristus"]],1,[6,0],["y-MM-dd","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","−","×10^","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"SEK","kr","svensk krona",{"AUD":[u,"$"],"BBD":["Bds$","$"],"BMD":["BM$","$"],"BRL":["BR$","R$"],"BSD":["BS$","$"],"BYN":[u,"р."],"BZD":["BZ$","$"],"CNY":[u,"¥"],"DKK":["Dkr","kr"],"DOP":["RD$","$"],"EEK":["Ekr"],"EGP":["EG£","E£"],"ESP":[],"GBP":[u,"£"],"HKD":[u,"$"],"IEP":["IE£"],"INR":[u,"₹"],"ISK":["Ikr","kr"],"JMD":["JM$","$"],"JPY":[u,"¥"],"KRW":[u,"₩"],"NOK":["Nkr","kr"],"NZD":[u,"$"],"PHP":[u,"₱"],"RON":[u,"L"],"SEK":["kr"],"TWD":[u,"NT$"],"USD":["US$","$"],"VND":[u,"₫"]},"ltr", plural, [[["midn.","på morg.","på förm.","på efterm.","på kvällen","på natten"],["midnatt","på morg.","på förm.","på efterm.","på kvällen","på natten"],["midnatt","på morgonen","på förmiddagen","på eftermiddagen","på kvällen","på natten"]],[["midn.","morg.","förm.","efterm.","kväll","natt"],["midnatt","morgon","förm.","efterm.","kväll","natt"],["midnatt","morgon","förmiddag","eftermiddag","kväll","natt"]],["00:00",["05:00","10:00"],["10:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    Tx5/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['sw-cd'] = ["sw-CD",[["am","pm"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],u,u],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KK","BK"],u,["Kabla ya Kristo","Baada ya Kristo"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"CDF","FC","Faranga ya Kongo",{"BYN":[u,"р."],"CDF":["FC"],"JPY":["JP¥","¥"],"KES":["Ksh"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, [[["usiku","mchana","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","adhuhuri","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"]],[["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","adhuhuri","alfajiri","asubuhi","alasiri","jioni","usiku"],["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"]],["00:00","12:00",["04:00","07:00"],["07:00","12:00"],["12:00","16:00"],["16:00","19:00"],["19:00","04:00"]]]];
  })(globalThis);
    gihx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['sw-ke'] = ["sw-KE",[["am","pm"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],u,u],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KK","BK"],u,["Kabla ya Kristo","Baada ya Kristo"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"KES","Ksh","Shilingi ya Kenya",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"KES":["Ksh"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"TZS":["TSh"]},"ltr", plural, [[["usiku","mchana","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","adhuhuri","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"]],[["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","adhuhuri","alfajiri","asubuhi","alasiri","jioni","usiku"],["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"]],["00:00","12:00",["04:00","07:00"],["07:00","12:00"],["12:00","16:00"],["16:00","19:00"],["19:00","04:00"]]]];
  })(globalThis);
    [Rc)&x`;

if (n === 1:teo-ke'] = ["teo-KE",[["Taparachu","Ebongi"],u,u],u,[["J","B","A","U","U","K","S"],["Jum","Bar","Aar","Uni","Ung","Kan","Sab"],["Nakaejuma","Nakaebarasa","Nakaare","Nakauni","Nakaung’on","Nakakany","Nakasabiti"],["Jum","Bar","Aar","Uni","Ung","Kan","Sab"]],u,[["R","M","K","D","M","M","J","P","S","T","L","P"],["Rar","Muk","Kwa","Dun","Mar","Mod","Jol","Ped","Sok","Tib","Lab","Poo"],["Orara","Omuk","Okwamg’","Odung’el","Omaruk","Omodok’king’ol","Ojola","Opedel","Osokosokoma","Otibar","Olabor","Opoo Christo","Baada ya Ch9#,##0.00","#E0"],"KES","Ksh","Ango’otol lok’ Kenya",{7#UGX":["USh"],"USD":["US$","$w'x9/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['sw-ug'] = ["sw-UG",[["am","pm"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],u,u],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KK","BK"],u,["Kabla ya Kristo","Baada ya Kristo"]],1,[0,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"UGX","USh","Shilingi ya Uganda",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"KES":["Ksh"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"TZS":["TSh"],"UGX":["USh"],"USD":["US$","$"]},"ltr", plural, [[["usiku","mchana","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","adhuhuri","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"]],[["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","adhuhuri","alfajiri","asubuhi","alasiri","jioni","usiku"],["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"]],["00:00","12:00",["04:00","07:00"],["07:00","12:00"],["12:00","16:00"],["16:00","19:00"],["19:00","04:00"]]]];
  })(globalThis);
    kx'/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['sw'] = ["sw",[["am","pm"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],u,u],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KK","BK"],u,["Kabla ya Kristo","Baada ya Kristo"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"TZS","TSh","Shilingi ya Tanzania",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"KES":["Ksh"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"TZS":["TSh"],"USD":["US$","$"]},"ltr", plural, [[["usiku","mchana","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","adhuhuri","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"]],[["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"],["saa sita za usiku","adhuhuri","alfajiri","asubuhi","alasiri","jioni","usiku"],["saa sita za usiku","saa sita za mchana","alfajiri","asubuhi","mchana","jioni","usiku"]],["00:00","12:00",["04:00","07:00"],["07:00","12:00"],["12:00","16:00"],["16:00","19:00"],["19:00","04:00"]]]];
  })(globalThis);
    wg=xA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ta-lk'] = ["ta-LK",[["மு.ப","பி.ப"],["முற்பகல்","பிற்பகல்"],u],u,[["ஞா","தி","செ","பு","வி","வெ","ச"],["ஞாயி.","திங்.","செவ்.","புத.","வியா.","வெள்.","சனி"],["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],["ஞா","தி","செ","பு","வி","வெ","ச"]],u,[["ஜ","பி","மா","ஏ","மே","ஜூ","ஜூ","ஆ","செ","அ","ந","டி"],["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"]],u,[["கி.மு.","கி.பி."],u,["கிறிஸ்துவுக்கு முன்","அன்னோ டோமினி"]],1,[6,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} அன்று {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤ #,##,##0.00","#E0"],"LKR","Rs.","இலங்கை ரூபாய்",{"BYN":[u,"р."],"LKR":["Rs.","Rs"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["நள்.","நண்.","அதி.","கா.","மதி.","பிற்.","மா.","அந்தி மா.","இர."],["நள்ளிரவு","நண்பகல்","அதிகாலை","காலை","மதியம்","பிற்பகல்","மாலை","அந்தி மாலை","இரவு"],u],[["நள்.","நண்.","அதி.","கா.","மதி.","பிற்.","மா.","அந்தி மா.","இ."],["நள்ளிரவு","நண்பகல்","அதிகாலை","காலை","மதியம்","பிற்பகல்","மாலை","அந்தி மாலை","இரவு"],u],["00:00","12:00",["03:00","05:00"],["05:00","12:00"],["12:00","14:00"],["14:00","16:00"],["16:00","18:00"],["18:00","21:00"],["21:00","03:00"]]]];
  })(globalThis);
    |rOxR/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ta-my'] = ["ta-MY",[["மு.ப","பி.ப"],["முற்பகல்","பிற்பகல்"],u],u,[["ஞா","தி","செ","பு","வி","வெ","ச"],["ஞாயி.","திங்.","செவ்.","புத.","வியா.","வெள்.","சனி"],["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],["ஞா","தி","செ","பு","வி","வெ","ச"]],u,[["ஜ","பி","மா","ஏ","மே","ஜூ","ஜூ","ஆ","செ","அ","ந","டி"],["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"]],u,[["கி.மு.","கி.பி."],u,["கிறிஸ்துவுக்கு முன்","அன்னோ டோமினி"]],1,[6,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["a h:mm","a h:mm:ss","a h:mm:ss z","a h:mm:ss zzzz"],["{1}, {0}",u,"{1} அன்று {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"MYR","RM","மலேஷியன் ரிங்கிட்",{"BYN":[u,"р."],"MYR":["RM"],"PHP":[u,"₱"],"SGD":["S$","$"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["நள்.","நண்.","அதி.","கா.","மதி.","பிற்.","மா.","அந்தி மா.","இர."],["நள்ளிரவு","நண்பகல்","அதிகாலை","காலை","மதியம்","பிற்பகல்","மாலை","அந்தி மாலை","இரவு"],u],[["நள்.","நண்.","அதி.","கா.","மதி.","பிற்.","மா.","அந்தி மா.","இ."],["நள்ளிரவு","நண்பகல்","அதிகாலை","காலை","மதியம்","பிற்பகல்","மாலை","அந்தி மாலை","இரவு"],u],["00:00","12:00",["03:00","05:00"],["05:00","12:00"],["12:00","14:00"],["14:00","16:00"],["16:00","18:00"],["18:00","21:00"],["21:00","03:00"]]]];
  })(globalThis);
    Q}x^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ta-sg'] = ["ta-SG",[["மு.ப","பி.ப"],["முற்பகல்","பிற்பகல்"],u],u,[["ஞா","தி","செ","பு","வி","வெ","ச"],["ஞாயி.","திங்.","செவ்.","புத.","வியா.","வெள்.","சனி"],["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],["ஞா","தி","செ","பு","வி","வெ","ச"]],u,[["ஜ","பி","மா","ஏ","மே","ஜூ","ஜூ","ஆ","செ","அ","ந","டி"],["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"]],u,[["கி.மு.","கி.பி."],u,["கிறிஸ்துவுக்கு முன்","அன்னோ டோமினி"]],0,[6,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["a h:mm","a h:mm:ss","a h:mm:ss z","a h:mm:ss zzzz"],["{1}, {0}",u,"{1} அன்று {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"SGD","$","சிங்கப்பூர் டாலர்",{"BYN":[u,"р."],"MYR":["RM"],"PHP":[u,"₱"],"SGD":["$"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"]},"ltr", plural, [[["நள்.","நண்.","அதி.","கா.","மதி.","பிற்.","மா.","அந்தி மா.","இர."],["நள்ளிரவு","நண்பகல்","அதிகாலை","காலை","மதியம்","பிற்பகல்","மாலை","அந்தி மாலை","இரவு"],u],[["நள்.","நண்.","அதி.","கா.","மதி.","பிற்.","மா.","அந்தி மா.","இ."],["நள்ளிரவு","நண்பகல்","அதிகாலை","காலை","மதியம்","பிற்பகல்","மாலை","அந்தி மாலை","இரவு"],u],["00:00","12:00",["03:00","05:00"],["05:00","12:00"],["12:00","14:00"],["14:00","16:00"],["16:00","18:00"],["18:00","21:00"],["21:00","03:00"]]]];
  })(globalThis);
    qqx,/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ta'] = ["ta",[["மு.ப","பி.ப"],["முற்பகல்","பிற்பகல்"],u],u,[["ஞா","தி","செ","பு","வி","வெ","ச"],["ஞாயி.","திங்.","செவ்.","புத.","வியா.","வெள்.","சனி"],["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],["ஞா","தி","செ","பு","வி","வெ","ச"]],u,[["ஜ","பி","மா","ஏ","மே","ஜூ","ஜூ","ஆ","செ","அ","ந","டி"],["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"]],u,[["கி.மு.","கி.பி."],u,["கிறிஸ்துவுக்கு முன்","அன்னோ டோமினி"]],0,[0,0],["d/M/yy","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["a h:mm","a h:mm:ss","a h:mm:ss z","a h:mm:ss zzzz"],["{1}, {0}",u,"{1} அன்று {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##,##0.###","#,##,##0%","¤ #,##,##0.00","#E0"],"INR","₹","இந்திய ரூபாய்",{"BYN":[u,"р."],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"ltr", plural, [[["நள்.","நண்.","அதி.","கா.","மதி.","பிற்.","மா.","அந்தி மா.","இர."],["நள்ளிரவு","நண்பகல்","அதிகாலை","காலை","மதியம்","பிற்பகல்","மாலை","அந்தி மாலை","இரவு"],u],[["நள்.","நண்.","அதி.","கா.","மதி.","பிற்.","மா.","அந்தி மா.","இ."],["நள்ளிரவு","நண்பகல்","அதிகாலை","காலை","மதியம்","பிற்பகல்","மாலை","அந்தி மாலை","இரவு"],u],["00:00","12:00",["03:00","05:00"],["05:00","12:00"],["12:00","14:00"],["14:00","16:00"],["16:00","18:00"],["18:00","21:00"],["21:00","03:00"]]]];
  })(globalThis);
    UlnXxq/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['teo'] = ["teo",[["Taparachu","Ebongi"],u,u],u,[["J","B","A","U","U","K","S"],["Jum","Bar","Aar","Uni","Ung","Kan","Sab"],["Nakaejuma","Nakaebarasa","Nakaare","Nakauni","Nakaung’on","Nakakany","Nakasabiti"],["Jum","Bar","Aar","Uni","Ung","Kan","Sab"]],u,[["R","M","K","D","M","M","J","P","S","T","L","P"],["Rar","Muk","Kwa","Dun","Mar","Mod","Jol","Ped","Sok","Tib","Lab","Poo"],["Orara","Omuk","Okwamg’","Odung’el","Omaruk","Omodok’king’ol","Ojola","Opedel","Osokosokoma","Otibar","Olabor","Opoo"]],u,[["KK","BK"],u,["Kabla ya Christo","Baada ya Christo"]],1,[0,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"UGX","USh","Ango’otol lok’ Uganda",{"JPY":["JP¥","¥"],"UGX":["USh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    /`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['tg'] = ["tg",[["AM","PM"],u,u],u,[["Я","Д","С","Ч","П","Ҷ","Ш"],["Яшб","Дшб","Сшб","Чшб","Пшб","Ҷмъ","Шнб"],["Якшанбе","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],["Яшб","Дшб","Сшб","Чшб","Пшб","Ҷмъ","Шнб"]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"]],u,[["ПеМ","ПаМ"],u,["Пеш аз милод","Пас аз милод"]],1,[6,0],["dd/MM/yy","dd MMM y","dd MMMM y","EEEE, dd MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"TJS","сом.","Сомонӣ",{"JPY":["JP¥","¥"],"TJS":["сом."]},"ltr", plural, []];
  })(globalThis);
    ,{hx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['ti-er'] = ["ti-ER",[["ቅ.ቀ.","ድ.ቀ."],u,u],u,[["ሰ","ሰ","ሰ","ረ","ሓ","ዓ","ቀ"],["ሰን","ሰኑ","ሰሉ","ረቡ","ሓሙ","ዓር","ቀዳ"],["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],["ሰን","ሰኑ","ሰሉ","ረቡ","ሓሙ","ዓር","ቀዳ"]],u,[["ጥ","ለ","መ","ሚ","ግ","ሰ","ሓ","ነ","መ","ጥ","ሕ","ታ"],["ጥሪ","ለካ","መጋ","ሚያ","ግን","ሰነ","ሓም","ነሓ","መስ","ጥቅ","ሕዳ","ታሕ"],["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"]],u,[["ዓ/ዓ","ዓ/ም"],u,["ዓመተ ዓለም","ዓመተ ምሕረት"]],1,[6,0],["dd/MM/yy","d MMM y","d MMMM y","EEEE፣ d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1} ሰዓት {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ERN","Nfk","ናቕፋ",{"CNY":[u,"¥"],"ERN":["Nfk"],"ETB":["Br"],"JPY":[u,"¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    8gxp/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1))
    return 1;
return 5;
}
    global.ng.common.locales['ti'] = ["ti",[["ቅ.ቀ.","ድ.ቀ."],u,u],u,[["ሰ","ሰ","ሰ","ረ","ሓ","ዓ","ቀ"],["ሰን","ሰኑ","ሰሉ","ረቡ","ሓሙ","ዓር","ቀዳ"],["ሰንበት","ሰኑይ","ሰሉስ","ረቡዕ","ሓሙስ","ዓርቢ","ቀዳም"],["ሰን","ሰኑ","ሰሉ","ረቡ","ሓሙ","ዓር","ቀዳ"]],u,[["ጥ","ለ","መ","ሚ","ግ","ሰ","ሓ","ነ","መ","ጥ","ሕ","ታ"],["ጥሪ","ለካ","መጋ","ሚያ","ግን","ሰነ","ሓም","ነሓ","መስ","ጥቅ","ሕዳ","ታሕ"],["ጥሪ","ለካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰነ","ሓምለ","ነሓሰ","መስከረም","ጥቅምቲ","ሕዳር","ታሕሳስ"]],u,[["ዓ/ዓ","ዓ/ም"],u,["ቅድመ ክርስቶስ","ዓመተ ምሕረት"]],0,[6,0],["dd/MM/yy","d MMM y","d MMMM y","EEEE፣ d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,"{1} ሰዓት {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ETB","Br","ብር",{"CNY":[u,"¥"],"ETB":["Br"],"JPY":[u,"¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ~
~x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['tk'] = ["tk",[["öň","soň"],["go.öň","go.soň"],["günortadan öň","günortadan soň"]],[["öň","soň"],["g.öň","g.soň"],["günortadan öň","günortadan soň"]],[["Ý","D","S","Ç","P","A","Ş"],["ýek","duş","siş","çar","pen","ann","şen"],["ýekşenbe","duşenbe","sişenbe","çarşenbe","penşenbe","anna","şenbe"],["ýb","db","sb","çb","pb","an","şb"]],[["Ý","D","S","Ç","P","A","Ş"],["Ýek","Duş","Siş","Çar","Pen","Ann","Şen"],["Ýekşenbe","Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe"],["Ýb","Db","Sb","Çb","Pb","An","Şb"]],[["Ý","F","M","A","M","I","I","A","S","O","N","D"],["ýan","few","mart","apr","maý","iýun","iýul","awg","sen","okt","noý","dek"],["ýanwar","fewral","mart","aprel","maý","iýun","iýul","awgust","sentýabr","oktýabr","noýabr","dekabr"]],[["Ý","F","M","A","M","I","I","A","S","O","N","D"],["Ýan","Few","Mar","Apr","Maý","Iýun","Iýul","Awg","Sen","Okt","Noý","Dek"],["Ýanwar","Fewral","Mart","Aprel","Maý","Iýun","Iýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr"]],[["B.e.öň","B.e."],u,["Isadan öň","Isadan soň"]],1,[6,0],["dd.MM.y","d MMM y","d MMMM y","d MMMM y EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","san däl",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"TMT","TMT","Türkmen manady",{"BYN":[u,"р."],"EUR":[u,"€"],"GBP":[u,"£"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    QP^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['to'] = ["to",[["AM","PM"],u,["hengihengi","efiafi"]],[["AM","PM"],u,["HH","EA"]],[["S","M","T","P","T","F","T"],["Sāp","Mōn","Tūs","Pul","Tuʻa","Fal","Tok"],["Sāpate","Mōnite","Tūsite","Pulelulu","Tuʻapulelulu","Falaite","Tokonaki"],["Sāp","Mōn","Tūs","Pul","Tuʻa","Fal","Tok"]],u,[["S","F","M","E","M","S","S","A","S","O","N","T"],["Sān","Fēp","Maʻa","ʻEpe","Mē","Sun","Siu","ʻAok","Sep","ʻOka","Nōv","Tīs"],["Sānuali","Fēpueli","Maʻasi","ʻEpeleli","Mē","Sune","Siulai","ʻAokosi","Sepitema","ʻOkatopa","Nōvema","Tīsema"]],u,[["KM","TS"],u,["ki muʻa","taʻu ʻo Sīsū"]],1,[6,0],["d/M/yy","d MMM y","d MMMM y","EEEE d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}","{1}, {0}",u,u],[".",",",";","%","+","-","E","×","‰","∞","TF",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"TOP","T$","Paʻanga fakatonga",{"AUD":["AUD$","AU$"],"FJD":[u,"F$"],"JPY":["JP¥","¥"],"NZD":["NZD$","NZ$"],"SBD":[u,"S$"],"TOP":["T$"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ssvxc/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['tr-cy'] = ["tr-CY",[["öö","ös"],["ÖÖ","ÖS"],u],[["ÖÖ","ÖS"],u,u],[["P","P","S","Ç","P","C","C"],["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],["Pa","Pt","Sa","Ça","Pe","Cu","Ct"]],u,[["O","Ş","M","N","M","H","T","A","E","E","K","A"],["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"]],u,[["MÖ","MS"],u,["Milattan Önce","Milattan Sonra"]],1,[6,0],["d.MM.y","d MMM y","d MMMM y","d MMMM y EEEE"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","%#,##0","¤#,##0.00","#E0"],"EUR","€","Euro",{"AUD":["AU$","$"],"BYN":[u,"р."],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"THB":["฿"],"TRY":["₺"],"TWD":["NT$"]},"ltr", plural, [[["gece","ö","sabah","öğleden önce","öğleden sonra","akşamüstü","akşam","gece"],["gece yarısı","öğle","sabah","öğleden önce","öğleden sonra","akşamüstü","akşam","gece"],u],[["gece yarısı","öğle","sabah","öğleden önce","öğleden sonra","akşamüstü","akşam","gece"],u,u],["00:00","12:00",["06:00","11:00"],["11:00","12:00"],["12:00","18:00"],["18:00","19:00"],["19:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    
Jvxb/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['tr'] = ["tr",[["öö","ös"],["ÖÖ","ÖS"],u],[["ÖÖ","ÖS"],u,u],[["P","P","S","Ç","P","C","C"],["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],["Pa","Pt","Sa","Ça","Pe","Cu","Ct"]],u,[["O","Ş","M","N","M","H","T","A","E","E","K","A"],["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"]],u,[["MÖ","MS"],u,["Milattan Önce","Milattan Sonra"]],1,[6,0],["d.MM.y","d MMM y","d MMMM y","d MMMM y EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","%#,##0","¤#,##0.00","#E0"],"TRY","₺","Türk Lirası",{"AUD":["AU$","$"],"BYN":[u,"р."],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"THB":["฿"],"TRY":["₺"],"TWD":["NT$"]},"ltr", plural, [[["gece","ö","sabah","öğleden önce","öğleden sonra","akşamüstü","akşam","gece"],["gece yarısı","öğle","sabah","öğleden önce","öğleden sonra","akşamüstü","akşam","gece"],u],[["gece yarısı","öğle","sabah","öğleden önce","öğleden sonra","akşamüstü","akşam","gece"],u,u],["00:00","12:00",["06:00","11:00"],["11:00","12:00"],["12:00","18:00"],["18:00","19:00"],["19:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    LexX/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['tt'] = ["tt",[["AM","PM"],u,u],u,[["Я","Д","С","Ч","П","Җ","Ш"],["якш.","дүш.","сиш.","чәр.","пәнҗ.","җом.","шим."],["якшәмбе","дүшәмбе","сишәмбе","чәршәмбе","пәнҗешәмбе","җомга","шимбә"],["якш.","дүш.","сиш.","чәр.","пәнҗ.","җом.","шим."]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["гыйн.","фев.","мар.","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],["гыйнвар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]],u,[["б.э.к.","милади"],u,["безнең эрага кадәр","милади"]],1,[6,0],["dd.MM.y","d MMM, y 'ел'","d MMMM, y 'ел'","d MMMM, y 'ел', EEEE"],["H:mm","H:mm:ss","H:mm:ss z","H:mm:ss zzzz"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0 %","#,##0.00 ¤","#E0"],"RUB","₽","Россия сумы",{"JPY":["JP¥","¥"],"RUB":["₽"]},"ltr", plural, []];
  })(globalThis);
    .Tx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['twq'] = ["twq",[["Subbaahi","Zaarikay b"],u,u],u,[["H","T","T","L","L","L","S"],["Alh","Ati","Ata","Ala","Alm","Alz","Asi"],["Alhadi","Atinni","Atalaata","Alarba","Alhamiisa","Alzuma","Asibti"],["Alh","Ati","Ata","Ala","Alm","Alz","Asi"]],u,[["Ž","F","M","A","M","Ž","Ž","U","S","O","N","D"],["Žan","Fee","Mar","Awi","Me","Žuw","Žuy","Ut","Sek","Okt","Noo","Dee"],["Žanwiye","Feewiriye","Marsi","Awiril","Me","Žuweŋ","Žuyye","Ut","Sektanbur","Oktoobur","Noowanbur","Deesanbur"]],u,[["IJ","IZ"],u,["Isaa jine","Isaa zamanoo"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],["."," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00¤","#E0"],"XOF","F CFA","CFA Fraŋ (BCEAO)",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    ğ\x;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === Math.floor(n) && (n >= 0 && n <= 1) || n === Math.floor(n) && (n >= 11 && n <= 99))
    return 1;
return 5;
}
    global.ng.common.locales['tzm'] = ["tzm",[["Zdat azal","Ḍeffir aza"],u,u],u,[["A","A","A","A","A","A","A"],["Asa","Ayn","Asn","Akr","Akw","Asm","Asḍ"],["Asamas","Aynas","Asinas","Akras","Akwas","Asimwas","Asiḍyas"],["Asa","Ayn","Asn","Akr","Akw","Asm","Asḍ"]],u,[["Y","Y","M","I","M","Y","Y","Ɣ","C","K","N","D"],["Yen","Yeb","Mar","Ibr","May","Yun","Yul","Ɣuc","Cut","Kṭu","Nwa","Duj"],["Yennayer","Yebrayer","Mars","Ibrir","Mayyu","Yunyu","Yulyuz","Ɣuct","Cutanbir","Kṭuber","Nwanbir","Dujanbir"]],u,[["ZƐ","ḌƐ"],u,["Zdat Ɛisa (TAƔ)","Ḍeffir Ɛisa (TAƔ)"]],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"MAD","MAD","Derhem Umeṛṛuki",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    (Qx
1:vun'] = ["vun",[["utuko","kyiukonyi"],u,u],u,[["J","J","J","J","A","I","J"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"],["Jumapilyi","Jumatatuu","Jumanne","Jumatanu","Alhamisi","Ijumaa","Jumamosi"],["Jpi","Jtt","Jnn","Jtn","Alh","Iju","Jmo"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],["Januari","Februari","Machi","Aprilyi","Mei","Junyi","Julyai","Agusti","Septemba","Oktoba","Novemba","Desemba"]],u,[["KK","BK"],u,["Kabla ya Kristu","Baada ya Kristuh.",",I4¤#,##0.00","#E0"],"TZS","TSh","Shilingi ya Tanzaniap
TZS":["TSh@!$Bax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['ug'] = ["ug",[["ب","ك"],["چ.ب","چ.ك"],["چۈشتىن بۇرۇن","چۈشتىن كېيىن"]],[["چ.ب","چ.ك"],u,u],[["ي","د","س","چ","پ","ج","ش"],["يە","دۈ","سە","چا","پە","جۈ","شە"],["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],["ي","د","س","چ","پ","ج","ش"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["يانۋار","فېۋرال","مارت","ئاپرېل","ماي","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر"],u],u,[["BCE","مىلادىيە"],u,["مىلادىيەدىن بۇرۇن","مىلادىيە"]],0,[6,0],["y-MM-dd","d-MMM، y","d-MMMM، y","y d-MMMM، EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}، {0}",u,"{1} {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"CNY","￥","جۇڭگو يۈەنى",{"CNY":["￥","¥"],"JPY":["JP¥","¥"]},"rtl", plural, []];
  })(globalThis);
    dmKx>/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
    return 1;
if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
    return 3;
if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
    return 4;
return 5;
}
    global.ng.common.locales['uk'] = ["uk",[["дп","пп"],u,u],u,[["Н","П","В","С","Ч","П","С"],["нд","пн","вт","ср","чт","пт","сб"],["неділя","понеділок","вівторок","середа","четвер","пʼятниця","субота"],["нд","пн","вт","ср","чт","пт","сб"]],u,[["с","л","б","к","т","ч","л","с","в","ж","л","г"],["січ.","лют.","бер.","квіт.","трав.","черв.","лип.","серп.","вер.","жовт.","лист.","груд."],["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня"]],[["С","Л","Б","К","Т","Ч","Л","С","В","Ж","Л","Г"],["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру"],["січень","лютий","березень","квітень","травень","червень","липень","серпень","вересень","жовтень","листопад","грудень"]],[["до н.е.","н.е."],["до н. е.","н. е."],["до нашої ери","нашої ери"]],1,[6,0],["dd.MM.yy","d MMM y 'р'.","d MMMM y 'р'.","EEEE, d MMMM y 'р'."],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1}, {0}",u,"{1} 'о' {0}",u],[","," ",";","%","+","-","Е","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"UAH","₴","українська гривня",{"AUD":[u,"$"],"BRL":[u,"R$"],"BYN":[u,"р."],"CAD":[u,"$"],"CNY":[u,"¥"],"EUR":[u,"€"],"GBP":[u,"£"],"HKD":[u,"$"],"ILS":[u,"₪"],"INR":[u,"₹"],"KRW":[u,"₩"],"MXN":[u,"$"],"NZD":[u,"$"],"PHP":[u,"₱"],"RUR":[u,"р."],"TWD":[u,"$"],"UAH":["₴"],"UAK":["крб."],"USD":[u,"$"],"VND":[u,"₫"],"XCD":[u,"$"]},"ltr", plural, [[["північ","п","ранку","дня","вечора","ночі"],["опівночі","пополудні","ранку","дня","вечора","ночі"],u],[["північ","полудень","ранок","день","вечір","ніч"],u,u],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","24:00"],["00:00","04:00"]]]];
  })(globalThis);
    %Jnx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['und'] = ["und",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr", plural, [[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]];
  })(globalThis);
    ^ox/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ur-in'] = ["ur-IN",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],u,u],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],u],u,[["قبل مسیح","عیسوی"],u,u],0,[0,0],["d/M/yy","d MMM، y","d MMMM، y","EEEE، d MMMM، y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","‎+","‎-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"INR","₹","بھارتی روپیہ",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"]},"rtl", plural, [[["آدھی رات","صبح","دوپہر","سہ پہر","شام","رات"],u,["آدھی رات","صبح میں","دوپہر میں","سہ پہر","شام میں","رات میں"]],[["آدھی رات","صبح","دوپہر","سہ پہر","شام","رات"],u,u],["00:00",["04:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    	ox/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['ur'] = ["ur",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],u,u],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],u],u,[["قبل مسیح","عیسوی"],u,u],0,[6,0],["d/M/yy","d MMM، y","d MMMM، y","EEEE، d MMMM، y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","‎+","‎-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"PKR","Rs","پاکستانی روپیہ",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PKR":["Rs"],"THB":["฿"],"TWD":["NT$"]},"rtl", plural, [[["آدھی رات","صبح","دوپہر","سہ پہر","شام","رات"],u,["آدھی رات","صبح میں","دوپہر میں","سہ پہر","شام میں","رات میں"]],[["آدھی رات","صبح","دوپہر","سہ پہر","شام","رات"],u,u],["00:00",["04:00","12:00"],["12:00","16:00"],["16:00","18:00"],["18:00","20:00"],["20:00","04:00"]]]];
  })(globalThis);
    z-Yxi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['uz-arab'] = ["uz-Arab",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["ی.","د.","س.","چ.","پ.","ج.","ش."],["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],["ی.","د.","س.","چ.","پ.","ج.","ش."]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["جنو","فبر","مار","اپر","می","جون","جول","اگس","سپت","اکت","نوم","دسم"],["جنوری","فبروری","مارچ","اپریل","می","جون","جولای","اگست","سپتمبر","اکتوبر","نومبر","دسمبر"]],u,[["BCE","CE"],u,u],6,[4,5],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","‎+","‎−","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"AFN","؋","افغانی",{"AFN":["؋"],"JPY":["JP¥","¥"],"USD":["US$","$"]},"rtl", plural, []];
  })(globalThis);
    
$rx(/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['uz-cyrl'] = ["uz-Cyrl",[["ТО","ТК"],u,u],u,[["Я","Д","С","Ч","П","Ж","Ш"],["якш","душ","сеш","чор","пай","жум","шан"],["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],["як","ду","се","чо","па","жу","ша"]],u,[["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"],["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр"]],u,[["м.а.","милодий"],u,["милоддан аввалги","милодий"]],1,[6,0],["dd/MM/yy","d MMM, y","d MMMM, y","EEEE, dd MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss (z)","HH:mm:ss (zzzz)"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","ҳақиқий сон эмас",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"UZS","сўм","Ўзбекистон сўм",{"JPY":["JP¥","¥"],"THB":["฿"],"USD":["US$","$"],"UZS":["сўм"]},"ltr", plural, [[["ярим тун","туш пайти","эрталаб","кундузи","кечқурун","кечаси"],u,u],u,["00:00","12:00",["06:00","11:00"],["11:00","18:00"],["18:00","22:00"],["22:00","06:00"]]]];
  })(globalThis);
    qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['uz-latn'] = ["uz-Latn",[["TO","TK"],u,u],u,[["Y","D","S","C","P","J","S"],["Yak","Dush","Sesh","Chor","Pay","Jum","Shan"],["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],["Ya","Du","Se","Ch","Pa","Ju","Sh"]],u,[["Y","F","M","A","M","I","I","A","S","O","N","D"],["yan","fev","mar","apr","may","iyn","iyl","avg","sen","okt","noy","dek"],["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentabr","oktabr","noyabr","dekabr"]],[["Y","F","M","A","M","I","I","A","S","O","N","D"],["Yan","Fev","Mar","Apr","May","Iyn","Iyl","Avg","Sen","Okt","Noy","Dek"],["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"]],[["m.a.","milodiy"],u,["miloddan avvalgi","milodiy"]],1,[6,0],["dd/MM/yy","d-MMM, y","d-MMMM, y","EEEE, d-MMMM, y"],["HH:mm","HH:mm:ss","H:mm:ss (z)","H:mm:ss (zzzz)"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","son emas",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"UZS","soʻm","O‘zbekiston so‘mi",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"USD":["US$","$"],"UZS":["soʻm"]},"ltr", plural, [[["yarim tun","tush payti","ertalab","kunduzi","kechqurun","kechasi"],u,u],u,["00:00","12:00",["06:00","11:00"],["11:00","18:00"],["18:00","22:00"],["22:00","06:00"]]]];
  })(globalThis);
    $px/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['uz'] = ["uz",[["TO","TK"],u,u],u,[["Y","D","S","C","P","J","S"],["Yak","Dush","Sesh","Chor","Pay","Jum","Shan"],["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],["Ya","Du","Se","Ch","Pa","Ju","Sh"]],u,[["Y","F","M","A","M","I","I","A","S","O","N","D"],["yan","fev","mar","apr","may","iyn","iyl","avg","sen","okt","noy","dek"],["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentabr","oktabr","noyabr","dekabr"]],[["Y","F","M","A","M","I","I","A","S","O","N","D"],["Yan","Fev","Mar","Apr","May","Iyn","Iyl","Avg","Sen","Okt","Noy","Dek"],["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"]],[["m.a.","milodiy"],u,["miloddan avvalgi","milodiy"]],1,[6,0],["dd/MM/yy","d-MMM, y","d-MMMM, y","EEEE, d-MMMM, y"],["HH:mm","HH:mm:ss","H:mm:ss (z)","H:mm:ss (zzzz)"],["{1}, {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","son emas",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"UZS","soʻm","O‘zbekiston so‘mi",{"BYN":[u,"р."],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"USD":["US$","$"],"UZS":["soʻm"]},"ltr", plural, [[["yarim tun","tush payti","ertalab","kunduzi","kechqurun","kechasi"],u,u],u,["00:00","12:00",["06:00","11:00"],["11:00","18:00"],["18:00","22:00"],["22:00","06:00"]]]];
  })(globalThis);
    
UxW/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['vai-vaii'] = ["vai-Vaii",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["ꕞꕌꔵ","ꗳꗡꘉ","ꕚꕞꕚ","ꕉꕞꕒ","ꕉꔤꕆꕢ","ꕉꔤꕀꕮ","ꔻꔬꔳ"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ꖨꖕꔞ","ꕒꕡ","ꕾꖺ","ꖢꖕ","ꖑꕱ","ꖱꘋ","ꖱꕞ","ꗛꔕ","ꕢꕌ","ꕭꖃ","ꔞꘋ","ꖨꖕꗏ"],["ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ","ꕒꕡꖝꖕ","ꕾꖺ","ꖢꖕ","ꖑꕱ","ꖱꘋ","ꖱꕞꔤ","ꗛꔕ","ꕢꕌ","ꕭꖃ","ꔞꘋꕔꕿ ꕸꖃꗏ","ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ"]],u,[["BCE","CE"],u,u],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"LRD","$","ꕞꔤꔫꕩ ꕜꕞꕌ",{"JPY":["JP¥","¥"],"LRD":["$"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    TxM/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['vai'] = ["vai",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["ꕞꕌꔵ","ꗳꗡꘉ","ꕚꕞꕚ","ꕉꕞꕒ","ꕉꔤꕆꕢ","ꕉꔤꕀꕮ","ꔻꔬꔳ"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["ꖨꖕꔞ","ꕒꕡ","ꕾꖺ","ꖢꖕ","ꖑꕱ","ꖱꘋ","ꖱꕞ","ꗛꔕ","ꕢꕌ","ꕭꖃ","ꔞꘋ","ꖨꖕꗏ"],["ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ","ꕒꕡꖝꖕ","ꕾꖺ","ꖢꖕ","ꖑꕱ","ꖱꘋ","ꖱꕞꔤ","ꗛꔕ","ꕢꕌ","ꕭꖃ","ꔞꘋꕔꕿ ꕸꖃꗏ","ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ"]],u,[["BCE","CE"],u,u],1,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"LRD","$","ꕞꔤꔫꕩ ꕜꕞꕌ",{"JPY":["JP¥","¥"],"LRD":["$"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    |kxT/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['vi'] = ["vi",[["s","c"],["SA","CH"],u],[["SA","CH"],u,u],[["CN","T2","T3","T4","T5","T6","T7"],["CN","Th 2","Th 3","Th 4","Th 5","Th 6","Th 7"],["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],["CN","T2","T3","T4","T5","T6","T7"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["thg 1","thg 2","thg 3","thg 4","thg 5","thg 6","thg 7","thg 8","thg 9","thg 10","thg 11","thg 12"],["tháng 1","tháng 2","tháng 3","tháng 4","tháng 5","tháng 6","tháng 7","tháng 8","tháng 9","tháng 10","tháng 11","tháng 12"]],[["1","2","3","4","5","6","7","8","9","10","11","12"],["Thg 1","Thg 2","Thg 3","Thg 4","Thg 5","Thg 6","Thg 7","Thg 8","Thg 9","Thg 10","Thg 11","Thg 12"],["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"]],[["tr. CN","sau CN"],["Trước CN","Sau CN"],["Trước Thiên Chúa","Sau Công Nguyên"]],1,[6,0],["dd/MM/y","d MMM, y","d MMMM, y","EEEE, d MMMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{0}, {1}",u,"{0} {1}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"VND","₫","Đồng Việt Nam",{"AUD":["AU$","$"],"BYN":[u,"р."],"PHP":[u,"₱"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["nửa đêm","tr","sáng","chiều","tối","đêm"],["nửa đêm","TR","sáng","chiều","tối","đêm"],u],[["nửa đêm","trưa","sáng","chiều","tối","đêm"],["nửa đêm","TR","sáng","chiều","tối","đêm"],["nửa đêm","trưa","sáng","chiều","tối","đêm"]],["00:00","12:00",["04:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","04:00"]]]];
  })(globalThis);
    ^xRx+/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['wae'] = ["wae",[["AM","PM"],u,u],u,[["S","M","Z","M","F","F","S"],["Sun","Män","Ziš","Mit","Fró","Fri","Sam"],["Sunntag","Mäntag","Zištag","Mittwuč","Fróntag","Fritag","Samštag"],["Sun","Män","Ziš","Mit","Fró","Fri","Sam"]],u,[["J","H","M","A","M","B","H","Ö","H","W","W","C"],["Jen","Hor","Mär","Abr","Mei","Brá","Hei","Öig","Her","Wím","Win","Chr"],["Jenner","Hornig","Märze","Abrille","Meije","Bráčet","Heiwet","Öigšte","Herbštmánet","Wímánet","Wintermánet","Chrištmánet"]],u,[["v. Chr.","n. Chr"],u,u],1,[6,0],["y-MM-dd","d. MMM y","d. MMMM y","EEEE, d. MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",","’",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"CHF","CHF","CHF",{},"ltr", plural, []];
  })(globalThis);
    Qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['wo'] = ["wo",[["Sub","Ngo"],u,u],u,[["Dib","Alt","Tal","Àla","Alx","Àjj","Ase"],u,["Dibéer","Altine","Talaata","Àlarba","Alxamis","Àjjuma","Aseer"],["Dib","Alt","Tal","Àla","Alx","Àjj","Ase"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Sam","Few","Mar","Awr","Mee","Suw","Sul","Ut","Sàt","Okt","Now","Des"],["Samwiyee","Fewriyee","Mars","Awril","Mee","Suwe","Sulet","Ut","Sàttumbar","Oktoobar","Nowàmbar","Desàmbar"]],u,[["JC","AD"],u,["av. JC","AD"]],1,[6,0],["dd-MM-y","d MMM, y","d MMMM, y","EEEE, d MMM, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} - {0}",u,"{1} 'ci' {0}",u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"XOF","F CFA","Franc CFA bu Afrik Sowwu-jant",{"JPY":["JP¥","¥"]},"ltr", plural, []];
  })(globalThis);
    L~]TxE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['xh'] = ["xh",[["AM","PM"],u,u],u,[["S","M","T","W","T","F","S"],["Caw","Mvu","Bin","Tha","Sin","Hla","Mgq"],["Cawe","Mvulo","Lwesibini","Lwesithathu","Lwesine","Lwesihlanu","Mgqibelo"],["Caw","Mvu","Bin","Tha","Sin","Hla","Mgq"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["Jan","Feb","Mat","Epr","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"],["Janyuwari","Februwari","Matshi","Epreli","Meyi","Juni","Julayi","Agasti","Septemba","Okthoba","Novemba","Disemba"]],u,[["BC","AD"],u,u],0,[6,0],["y-MM-dd","y MMM d","y MMMM d","y MMMM d, EEEE"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],["."," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZAR","R","iRandi yaseMzanzi Afrika",{"JPY":["JP¥","¥"],"USD":["US$","$"],"ZAR":["R"]},"ltr", plural, []];
  })(globalThis);
    O.Xxp/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

if (n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['xog'] = ["xog",[["Munkyo","Eigulo"],u,u],u,[["S","B","B","S","K","K","M"],["Sabi","Bala","Kubi","Kusa","Kuna","Kuta","Muka"],["Sabiiti","Balaza","Owokubili","Owokusatu","Olokuna","Olokutaanu","Olomukaaga"],["Sabi","Bala","Kubi","Kusa","Kuna","Kuta","Muka"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apu","Maa","Juu","Jul","Agu","Seb","Oki","Nov","Des"],["Janwaliyo","Febwaliyo","Marisi","Apuli","Maayi","Juuni","Julaayi","Agusito","Sebuttemba","Okitobba","Novemba","Desemba"]],u,[["AZ","AF"],u,["Kulisto nga azilawo","Kulisto nga affile"]],1,[0,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"UGX","USh","Silingi eya Yuganda",{"JPY":["JP¥","¥"],"UGX":["USh"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    _x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['yav'] = ["yav",[["kiɛmɛ́ɛm","kisɛ́ndɛ"],u,u],u,[["s","m","m","e","k","f","s"],["sd","md","mw","et","kl","fl","ss"],["sɔ́ndiɛ","móndie","muányáŋmóndie","metúkpíápɛ","kúpélimetúkpiapɛ","feléte","séselé"],["sd","md","mw","et","kl","fl","ss"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["o.1","o.2","o.3","o.4","o.5","o.6","o.7","o.8","o.9","o.10","o.11","o.12"],["pikítíkítie, oólí ú kutúan","siɛyɛ́, oóli ú kándíɛ","ɔnsúmbɔl, oóli ú kátátúɛ","mesiŋ, oóli ú kénie","ensil, oóli ú kátánuɛ","ɔsɔn","efute","pisuyú","imɛŋ i puɔs","imɛŋ i putúk,oóli ú kátíɛ","makandikɛ","pilɔndɔ́"]],u,[["k.Y.","+J.C."],u,["katikupíen Yésuse","ékélémkúnupíén n"]],1,[6,0],["d/M/y","d MMM y","d MMMM y","EEEE d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[","," ",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","#,##0.00 ¤","#E0"],"XAF","FCFA","XAF",{"JPY":["JP¥","¥"],"USD":["US$","$"]},"ltr", plural, []];
  })(globalThis);
    tqx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;

if (i === 1 && v === 0)
    return 1;
return 5;
}
    global.ng.common.locales['yi'] = ["yi",[["פֿאַרמיטאָג","נאָכמיטאָג"],u,u],u,[["S","M","T","W","T","F","S"],["זונטיק","מאָנטיק","דינסטיק","מיטוואך","דאנערשטיק","פֿרײַטיק","שבת"],u,u],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["יאַנואַר","פֿעברואַר","מערץ","אַפּריל","מיי","יוני","יולי","אויגוסט","סעפּטעמבער","אקטאבער","נאוועמבער","דעצעמבער"],u],[["1","2","3","4","5","6","7","8","9","10","11","12"],["יאַנ","פֿעב","מערץ","אַפּר","מיי","יוני","יולי","אויג","סעפּ","אקט","נאוו","דעצ"],["יאַנואַר","פֿעברואַר","מערץ","אַפּריל","מיי","יוני","יולי","אויגוסט","סעפּטעמבער","אקטאבער","נאוועמבער","דעצעמבער"]],[["BCE","CE"],u,u],1,[6,0],["dd/MM/yy","dטן MMM y","dטן MMMM y","EEEE, dטן MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}","{1}, {0}","{1} {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],u,u,u,{"JPY":["JP¥","¥"],"USD":["US$","$"]},"rtl", plural, []];
  })(globalThis);
    x;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['yo-bj'] = ["yo-BJ",[["Àárɔ̀","Ɔ̀sán"],u,u],u,[["À","A","Ì","Ɔ","Ɔ","Ɛ","À"],["Àìk","Aj","Ìsɛ́g","Ɔjɔ́r","Ɔjɔ́b","Ɛt","Àbám"],["Ɔjɔ́ Àìkú","Ɔjɔ́ Ajé","Ɔjɔ́ Ìsɛ́gun","Ɔjɔ́rú","Ɔjɔ́bɔ","Ɔjɔ́ Ɛtì","Ɔjɔ́ Àbámɛ́ta"],["Àìk","Aj","Ìsɛ́g","Ɔjɔ́r","Ɔjɔ́b","Ɛt","Àbám"]],[["À","A","Ì","Ɔ","Ɔ","Ɛ","À"],["Àìk","Aj","Ìsɛ́g","Ɔjɔ́r","Ɔjɔ́b","Ɛt","Àbám"],["Àìkú","Ajé","Ìsɛ́gun","Ɔjɔ́rú","Ɔjɔ́bɔ","Ɛtì","Àbámɛ́ta"],["Àìk","Aj","Ìsɛ́g","Ɔjɔ́r","Ɔjɔ́b","Ɛt","Àbám"]],[["S","È","Ɛ","Ì","Ɛ̀","Ò","A","Ò","O","Ɔ̀","B","Ɔ̀"],["Shɛ́r","Èrèl","Ɛrɛ̀n","Ìgb","Ɛ̀bi","Òkú","Agɛ","Ògú","Owe","Ɔ̀wà","Bél","Ɔ̀pɛ"],["Oshù Shɛ́rɛ́","Oshù Èrèlè","Oshù Ɛrɛ̀nà","Oshù Ìgbé","Oshù Ɛ̀bibi","Oshù Òkúdu","Oshù Agɛmɔ","Oshù Ògún","Oshù Owewe","Oshù Ɔ̀wàrà","Oshù Bélú","Oshù Ɔ̀pɛ̀"]],[["S","È","Ɛ","Ì","Ɛ̀","Ò","A","Ò","O","Ɔ̀","B","Ɔ̀"],["Shɛ́","Èr","Ɛr","Ìg","Ɛ̀b","Òk","Ag","Òg","Ow","Ɔ̀w","Bé","Ɔ̀p"],["Shɛ́rɛ́","Èrèlè","Ɛrɛ̀nà","Ìgbé","Ɛ̀bibi","Òkúdu","Agɛmɔ","Ògún","Owewe","Ɔ̀wàrà","Bélú","Ɔ̀pɛ̀"]],[["BCE","AD"],u,["Saju Kristi","Lehin Kristi"]],1,[6,0],["d/M/y","d MM y","d MMM y","EEEE, d MMM y"],["H:m","H:m:s","H:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"XOF","F CFA","Faransì ìwɔ̀-oorùn Afíríkà",{"JPY":["JP¥","¥"],"NGN":["₦"],"RUB":["₽"]},"ltr", plural, []];
  })(globalThis);
    u)xg/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['yo'] = ["yo",[["Àárọ̀","Ọ̀sán"],u,u],u,[["À","A","Ì","Ọ","Ọ","Ẹ","À"],["Àìk","Aj","Ìsẹ́g","Ọjọ́r","Ọjọ́b","Ẹt","Àbám"],["Ọjọ́ Àìkú","Ọjọ́ Ajé","Ọjọ́ Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ọjọ́ Ẹtì","Ọjọ́ Àbámẹ́ta"],["Àìk","Aj","Ìsẹ́g","Ọjọ́r","Ọjọ́b","Ẹt","Àbám"]],[["À","A","Ì","Ọ","Ọ","Ẹ","À"],["Àìk","Aj","Ìsẹ́g","Ọjọ́r","Ọjọ́b","Ẹt","Àbám"],["Àìkú","Ajé","Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ẹtì","Àbámẹ́ta"],["Àìk","Aj","Ìsẹ́g","Ọjọ́r","Ọjọ́b","Ẹt","Àbám"]],[["S","È","Ẹ","Ì","Ẹ̀","Ò","A","Ò","O","Ọ̀","B","Ọ̀"],["Ṣẹ́r","Èrèl","Ẹrẹ̀n","Ìgb","Ẹ̀bi","Òkú","Agẹ","Ògú","Owe","Ọ̀wà","Bél","Ọ̀pẹ"],["Oṣù Ṣẹ́rẹ́","Oṣù Èrèlè","Oṣù Ẹrẹ̀nà","Oṣù Ìgbé","Oṣù Ẹ̀bibi","Oṣù Òkúdu","Oṣù Agẹmọ","Oṣù Ògún","Oṣù Owewe","Oṣù Ọ̀wàrà","Oṣù Bélú","Oṣù Ọ̀pẹ̀"]],[["S","È","Ẹ","Ì","Ẹ̀","Ò","A","Ò","O","Ọ̀","B","Ọ̀"],["Ṣẹ́","Èr","Ẹr","Ìg","Ẹ̀b","Òk","Ag","Òg","Ow","Ọ̀w","Bé","Ọ̀p"],["Ṣẹ́rẹ́","Èrèlè","Ẹrẹ̀nà","Ìgbé","Ẹ̀bibi","Òkúdu","Agẹmọ","Ògún","Owewe","Ọ̀wàrà","Bélú","Ọ̀pẹ̀"]],[["BCE","AD"],u,["Saju Kristi","Lehin Kristi"]],1,[6,0],["d/M/y","d MM y","d MMM y","EEEE, d MMM y"],["H:m","H:m:s","H:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"NGN","₦","Náírà Nàìjíríà",{"JPY":["JP¥","¥"],"NGN":["₦"],"RUB":["₽"]},"ltr", plural, []];
  })(globalThis);
    6sx?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['yrl-co'] = ["yrl-CO",[["a. m.","p. m."],u,u],u,[["M","M","M","M","S","Y","S"],["mit","mur","mmk","mms","sup","yuk","sau"],["mituú","murakipí","murakí-mukũi","murakí-musapíri","supapá","yukuakú","saurú"],["mit","mur","mmk","mms","sup","yuk","sau"]],u,[["Y","M","M","I","P","P","P","P","P","Y","Y","Y"],["ye","mk","ms","id","pu","py","pm","ps","pi","yp","yy","ym"],["yepé","mukũi","musapíri","irũdí","pú","pú-yepé","pú-mukũi","pú-musapíri","pú-irũdí","yepé-putimaã","yepé-yepé","yepé-mukũi"]],u,[["K.s.","K.a."],u,["Kiristu senũdé","Kiristu ariré"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"COP","$","Peso Kurũbiyawara",{"AUD":["AU$","$"],"BOB":["BUB","Bs"],"BYN":[u,"p."],"COP":["$","COP"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["Esc."],"RON":[u,"L"],"SCR":["SCRu"],"SYP":[u,"S£"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"VES":["Bs.S","VES"],"XAF":["FCF"],"XOF":["CFA"],"XPF":["CFP"],"ZMW":[u,"Zk"]},"ltr", plural, [[["pituna pyterupé","iandé-ara-pyturepé","kuêma ramẽ","karuka ramẽ","pituna ramẽ","pitunaeté ramẽ"],u,u],u,["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    u:txF/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['yrl-ve'] = ["yrl-VE",[["a. m.","p. m."],u,u],u,[["M","M","M","M","S","Y","S"],["mit","mur","mmk","mms","sup","yuk","sau"],["mituú","murakipí","murakí-mukũi","murakí-musapíri","supapá","yukuakú","saurú"],["mit","mur","mmk","mms","sup","yuk","sau"]],u,[["Y","M","M","I","P","P","P","P","P","Y","Y","Y"],["ye","mk","ms","id","pu","py","pm","ps","pi","yp","yy","ym"],["yepé","mukũi","musapíri","irũdí","pú","pú-yepé","pú-mukũi","pú-musapíri","pú-irũdí","yepé-putimaã","yepé-yepé","yepé-mukũi"]],u,[["K.s.","K.a."],u,["Kiristu senũdé","Kiristu ariré"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"VES","Bs.S","Buriwari Wenesuerawara",{"AUD":["AU$","$"],"BOB":["BUB","Bs"],"BYN":[u,"p."],"COP":["$","COP"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["Esc."],"RON":[u,"L"],"SCR":["SCRu"],"SYP":[u,"S£"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"VES":["Bs.S","VES"],"XAF":["FCF"],"XOF":["CFA"],"XPF":["CFP"],"ZMW":[u,"Zk"]},"ltr", plural, [[["pituna pyterupé","iandé-ara-pyturepé","kuêma ramẽ","karuka ramẽ","pituna ramẽ","pitunaeté ramẽ"],u,u],u,["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    +<_rx+/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['yrl'] = ["yrl",[["AM","PM"],u,u],u,[["M","M","M","M","S","Y","S"],["mit","mur","mmk","mms","sup","yuk","sau"],["mituú","murakipí","murakí-mukũi","murakí-musapíri","supapá","yukuakú","saurú"],["mit","mur","mmk","mms","sup","yuk","sau"]],u,[["Y","M","M","I","P","P","P","P","P","Y","Y","Y"],["ye","mk","ms","id","pu","py","pm","ps","pi","yp","yy","ym"],["yepé","mukũi","musapíri","irũdí","pú","pú-yepé","pú-mukũi","pú-musapíri","pú-irũdí","yepé-putimaã","yepé-yepé","yepé-mukũi"]],u,[["K.s.","K.a."],u,["Kiristu senũdé","Kiristu ariré"]],0,[6,0],["dd/MM/y","d MMM y","d MMMM y","EEEE, d MMMM y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[",",".",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤ #,##0.00","#E0"],"BRL","R$","Reau Brasiuwara",{"AUD":["AU$","$"],"BOB":["BUB","Bs"],"BYN":[u,"p."],"COP":["$","COP"],"JPY":["JP¥","¥"],"PHP":[u,"₱"],"PTE":["Esc."],"RON":[u,"L"],"SCR":["SCRu"],"SYP":[u,"S£"],"THB":["฿"],"TWD":["NT$"],"USD":["US$","$"],"VES":["Bs.S","VES"],"XAF":["FCF"],"XOF":["CFA"],"XPF":["CFP"],"ZMW":[u,"Zk"]},"ltr", plural, [[["pituna pyterupé","iandé-ara-pyturepé","kuêma ramẽ","karuka ramẽ","pituna ramẽ","pitunaeté ramẽ"],u,u],u,["00:00","12:00",["06:00","12:00"],["12:00","19:00"],["19:00","24:00"],["00:00","06:00"]]]];
  })(globalThis);
    I1`txA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['zh-hans'] = ["zh-Hans",[["上午","下午"],u,u],u,[["日","一","二","三","四","五","六"],["周日","周一","周二","周三","周四","周五","周六"],["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],["周日","周一","周二","周三","周四","周五","周六"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]],u,[["公元前","公元"],u,u],0,[6,0],["y/M/d","y年M月d日",u,"y年M月d日EEEE"],["HH:mm","HH:mm:ss","z HH:mm:ss","zzzz HH:mm:ss"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"CNY","¥","人民币",{"AUD":["AU$","$"],"BYN":[u,"р."],"CNY":["¥"],"ILR":["ILS"],"JPY":["JP¥","¥"],"KRW":["￦","₩"],"PHP":[u,"₱"],"RUR":[u,"р."],"TWD":["NT$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["午夜","早上","上午","中午","下午","晚上","凌晨"],u,["午夜","清晨","上午","中午","下午","晚上","凌晨"]],[["午夜","早上","上午","中午","下午","晚上","凌晨"],u,u],["00:00",["05:00","08:00"],["08:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    w,	Nx fyue-hans'] = ["yue4西元前","西&	非数值8ￓ:￥","¥`L8;晨","朝早","中午","下昼","夜晚","凌晨"],u,u],u`Fƽax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['zh-hant'] = ["zh-Hant",[["上午","下午"],u,u],u,[["日","一","二","三","四","五","六"],["週日","週一","週二","週三","週四","週五","週六"],["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],["日","一","二","三","四","五","六"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],u],u,[["西元前","西元"],u,u],0,[6,0],["y/M/d","y年M月d日",u,"y年M月d日 EEEE"],["Bh:mm","Bh:mm:ss","Bh:mm:ss [z]","Bh:mm:ss [zzzz]"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","非數值",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"TWD","$","新台幣",{"AUD":["AU$","$"],"BYN":[u,"р."],"KRW":["￦","₩"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"TWD":["$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["午夜","清晨","上午","中午","下午","晚上","凌晨"],u,u],u,["00:00",["05:00","08:00"],["08:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    	*x dyue-hant'] = ["yueRvTu#ah:mm","ah:mm:ss","ah:mm:ss [z]","aHKD","HK$","港NUR":[u,"р.D!朝早","中午","下晝","夜晚{ 9[xD/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['yue'] = ["yue",[["上午","下午"],u,u],u,[["日","一","二","三","四","五","六"],["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],u,["日","一","二","三","四","五","六"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],u],u,[["西元前","西元"],u,u],0,[6,0],["y/M/d","y年M月d日",u,"y年M月d日 EEEE"],["ah:mm","ah:mm:ss","ah:mm:ss [z]","ah:mm:ss [zzzz]"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","非數值",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"HKD","HK$","港幣",{"AUD":["AU$","$"],"BYN":[u,"р."],"KRW":["￦","₩"],"PHP":[u,"₱"],"RUR":[u,"р."],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["午夜","清晨","朝早","中午","下晝","夜晚","凌晨"],u,u],u,["00:00",["05:00","08:00"],["08:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    !`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['zh-hant-hk'] = ["zh-Hant-HK",[["上午","下午"],u,u],u,[["日","一","二","三","四","五","六"],["週日","週一","週二","週三","週四","週五","週六"],["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],["日","一","二","三","四","五","六"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],u],u,[["公元前","公元"],u,u],0,[6,0],["d/M/y","y年M月d日",u,"y年M月d日EEEE"],["ah:mm","ah:mm:ss","ah:mm:ss [z]","ah:mm:ss [zzzz]"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","非數值",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"HKD","HK$","港元",{"AUD":["AU$","$"],"BYN":[u,"р."],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["午夜","早上","上午","中午","下午","晚上","凌晨"],u,u],u,["00:00",["05:00","08:00"],["08:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    _x0s-hk'] = ["zh-HansP9周日","周一","周二","周三","周四","周五","周t^9周日","周一","周二","周三","周四","周五","周["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]],u,[["公兓$=z ah:mm:ss","zzzz ah:mm:ssDNaNfj`ILR":["ILS"],"JPY":["JP¥","¥"],"KRW":["￦","₩"],"PHP":[u,"₱"],"RUR":[u,"р."],"TWD":["NT$s["午夜","清晨;/],)GrΆax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['zh-hant-mo'] = ["zh-Hant-MO",[["上午","下午"],u,u],u,[["日","一","二","三","四","五","六"],["週日","週一","週二","週三","週四","週五","週六"],["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],["日","一","二","三","四","五","六"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],u],u,[["公元前","公元"],u,u],0,[6,0],["d/M/y","y年M月d日",u,"y年M月d日EEEE"],["ah:mm","ah:mm:ss","ah:mm:ss [z]","ah:mm:ss [zzzz]"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","非數值",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"MOP","MOP$","澳門元",{"AUD":["AU$","$"],"BYN":[u,"р."],"MOP":["MOP$"],"PHP":[u,"₱"],"RON":[u,"L"],"RUR":[u,"р."],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["午夜","早上","上午","中午","下午","晚上","凌晨"],u,u],u,["00:00",["05:00","08:00"],["08:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    u!x6s-mo'] = ["zh-HansP9周日","周一","周二","周三","周四","周五","周t^9周日","周一","周二","周三","周四","周五","周["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]],u,[["公兓$=z ah:mm:ss","zzzz ah:mm:ssDNaNfC币&2ILR":["ILS"],"JPY":["JP¥","¥"],"KRW":["￦","₩$UR":[u,"р."],"TWD":["NT$s["午夜","清晨N/],<GtxK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['zh-hans-sg'] = ["zh-Hans-SG",[["上午","下午"],u,u],u,[["日","一","二","三","四","五","六"],["周日","周一","周二","周三","周四","周五","周六"],["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],["周日","周一","周二","周三","周四","周五","周六"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]],u,[["公元前","公元"],u,u],0,[6,0],["dd/MM/yy","y年M月d日",u,"y年M月d日EEEE"],["ah:mm","ah:mm:ss","z ah:mm:ss","zzzz ah:mm:ss"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"SGD","$","新加坡元",{"AUD":["AU$","$"],"BYN":[u,"р."],"ILR":["ILS"],"JPY":["JP¥","¥"],"KRW":["￦","₩"],"PHP":[u,"₱"],"RUR":[u,"р."],"SGD":["$"],"TWD":["NT$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["午夜","早上","上午","中午","下午","晚上","凌晨"],u,["午夜","清晨","上午","中午","下午","晚上","凌晨"]],[["午夜","早上","上午","中午","下午","晚上","凌晨"],u,u],["00:00",["05:00","08:00"],["08:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    )vsx7/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val;

return 5;
}
    global.ng.common.locales['zh'] = ["zh",[["上午","下午"],u,u],u,[["日","一","二","三","四","五","六"],["周日","周一","周二","周三","周四","周五","周六"],["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],["周日","周一","周二","周三","周四","周五","周六"]],u,[["1","2","3","4","5","6","7","8","9","10","11","12"],["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]],u,[["公元前","公元"],u,u],0,[6,0],["y/M/d","y年M月d日",u,"y年M月d日EEEE"],["HH:mm","HH:mm:ss","z HH:mm:ss","zzzz HH:mm:ss"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"CNY","¥","人民币",{"AUD":["AU$","$"],"BYN":[u,"р."],"CNY":["¥"],"ILR":["ILS"],"JPY":["JP¥","¥"],"KRW":["￦","₩"],"PHP":[u,"₱"],"RUR":[u,"р."],"TWD":["NT$"],"USD":["US$","$"],"XXX":[]},"ltr", plural, [[["午夜","早上","上午","中午","下午","晚上","凌晨"],u,["午夜","清晨","上午","中午","下午","晚上","凌晨"]],[["午夜","早上","上午","中午","下午","晚上","凌晨"],u,u],["00:00",["05:00","08:00"],["08:00","12:00"],["12:00","13:00"],["13:00","19:00"],["19:00","24:00"],["00:00","05:00"]]]];
  })(globalThis);
    yyxb/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

// THIS CODE IS GENERATED - DO NOT MODIFY.
  (function(global) {
    global.ng ??= {};
    global.ng.common ??= {};
    global.ng.common.locales ??= {};
    const u = undefined;
    function plural(val) {
const n = val, i = Math.floor(Math.abs(val));

if (i === 0 || n === 1)
    return 1;
return 5;
}
    global.ng.common.locales['zu'] = ["zu",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","B","T","S","H","M"],["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],["ISonto","UMsombuluko","ULwesibili","ULwesithathu","ULwesine","ULwesihlanu","UMgqibelo"],["Son","Mso","Bil","Tha","Sin","Hla","Mgq"]],u,[["J","F","M","E","M","J","J","A","S","O","N","D"],["Jan","Feb","Mas","Eph","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"],["Januwari","Februwari","Mashi","Ephreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"]],[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mas","Eph","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"],["Januwari","Februwari","Mashi","Ephreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"]],[["BC","AD"],u,u],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["HH:mm","HH:mm:ss","HH:mm:ss z","HH:mm:ss zzzz"],["{1} {0}",u,u,u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"ZAR","R","i-South African Rand",{"BYN":[u,"P."],"DKK":[u,"Kr"],"HRK":[u,"Kn"],"ISK":[u,"Kr"],"JPY":["JP¥","¥"],"NOK":[u,"Kr"],"PHP":[u,"₱"],"PLN":[u,"Zł"],"SEK":[u,"Kr"],"THB":["฿"],"TWD":["NT$"],"ZAR":["R"]},"ltr", plural, [[["entathakusa","ekuseni","emini","ntambama","ebusuku"],u,u],u,[["00:00","06:00"],["06:00","10:00"],["10:00","13:00"],["13:00","19:00"],["19:00","24:00"]]]];
  })(globalThis);
    x'2Wxy/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["gsw-FR", [["vorm.", "nam."], u, ["am Vormittag", "am Namittag"]], [["vorm.", "nam."], u, ["Vormittag", "Namittag"]], [["S", "M", "D", "M", "D", "F", "S"], ["Su.", "Mä.", "Zi.", "Mi.", "Du.", "Fr.", "Sa."], ["Sunntig", "Määntig", "Ziischtig", "Mittwuch", "Dunschtig", "Friitig", "Samschtig"], ["Su.", "Mä.", "Zi.", "Mi.", "Du.", "Fr.", "Sa."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "Auguscht", "Septämber", "Oktoober", "Novämber", "Dezämber"]], u, [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", "’", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euro", { "ATS": ["öS"] }, "ltr", plural];
//# sourceMappingURL=gsw-FR.js.map;Xxz/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["gsw-LI", [["vorm.", "nam."], u, ["am Vormittag", "am Namittag"]], [["vorm.", "nam."], u, ["Vormittag", "Namittag"]], [["S", "M", "D", "M", "D", "F", "S"], ["Su.", "Mä.", "Zi.", "Mi.", "Du.", "Fr.", "Sa."], ["Sunntig", "Määntig", "Ziischtig", "Mittwuch", "Dunschtig", "Friitig", "Samschtig"], ["Su.", "Mä.", "Zi.", "Mi.", "Du.", "Fr.", "Sa."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "Auguscht", "Septämber", "Oktoober", "Novämber", "Dezämber"]], u, [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", "’", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "CHF", "CHF", "Schwiizer Franke", { "ATS": ["öS"] }, "ltr", plural];
//# sourceMappingURL=gsw-LI.js.mapoWx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["gsw", [["vorm.", "nam."], u, ["am Vormittag", "am Namittag"]], [["vorm.", "nam."], u, ["Vormittag", "Namittag"]], [["S", "M", "D", "M", "D", "F", "S"], ["Su.", "Mä.", "Zi.", "Mi.", "Du.", "Fr.", "Sa."], ["Sunntig", "Määntig", "Ziischtig", "Mittwuch", "Dunschtig", "Friitig", "Samschtig"], ["Su.", "Mä.", "Zi.", "Mi.", "Du.", "Fr.", "Sa."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "Auguscht", "Septämber", "Oktoober", "Novämber", "Dezämber"]], u, [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "dd.MM.y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", "’", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "CHF", "CHF", "Schwiizer Franke", { "ATS": ["öS"] }, "ltr", plural];
//# sourceMappingURL=gsw.js.mapS븆xh/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["gu", [["AM", "PM"], u, u], u, [["ર", "સો", "મં", "બુ", "ગુ", "શુ", "શ"], ["રવિ", "સોમ", "મંગળ", "બુધ", "ગુરુ", "શુક્ર", "શનિ"], ["રવિવાર", "સોમવાર", "મંગળવાર", "બુધવાર", "ગુરુવાર", "શુક્રવાર", "શનિવાર"], ["ર", "સો", "મં", "બુ", "ગુ", "શુ", "શ"]], u, [["જા", "ફે", "મા", "એ", "મે", "જૂ", "જુ", "ઑ", "સ", "ઑ", "ન", "ડિ"], ["જાન્યુ", "ફેબ્રુ", "માર્ચ", "એપ્રિલ", "મે", "જૂન", "જુલાઈ", "ઑગસ્ટ", "સપ્ટે", "ઑક્ટો", "નવે", "ડિસે"], ["જાન્યુઆરી", "ફેબ્રુઆરી", "માર્ચ", "એપ્રિલ", "મે", "જૂન", "જુલાઈ", "ઑગસ્ટ", "સપ્ટેમ્બર", "ઑક્ટોબર", "નવેમ્બર", "ડિસેમ્બર"]], u, [["ઇ સ પુ", "ઇસ"], ["ઈ.સ.પૂર્વે", "ઈ.સ."], ["ઈસવીસન પૂર્વે", "ઇસવીસન"]], 0, [0, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["hh:mm a", "hh:mm:ss a", "hh:mm:ss a z", "hh:mm:ss a zzzz"], ["{1} {0}", u, "{1} એ {0} વાગ્યે", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤#,##,##0.00", "[#E0]"], "INR", "₹", "ભારતીય રૂપિયા", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "MUR": [u, "રૂ."], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=gu.js.mapWCx>{"version":3,"file":"gu.js","sourceRoot":"","sources":["gu.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,IAAI,CAAC,EAAC,CAAC,YAAY,EAAC,MAAM,CAAC,EAAC,CAAC,eAAe,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,SAAS,EAAC,YAAY,EAAC,cAAc,EAAC,iBAAiB,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,kBAAkB,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,cAAc,EAAC,OAAO,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,eAAe,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"gu\",[[\"AM\",\"PM\"],u,u],u,[[\"ર\",\"સો\",\"મં\",\"બુ\",\"ગુ\",\"શુ\",\"શ\"],[\"રવિ\",\"સોમ\",\"મંગળ\",\"બુધ\",\"ગુરુ\",\"શુક્ર\",\"શનિ\"],[\"રવિવાર\",\"સોમવાર\",\"મંગળવાર\",\"બુધવાર\",\"ગુરુવાર\",\"શુક્રવાર\",\"શનિવાર\"],[\"ર\",\"સો\",\"મં\",\"બુ\",\"ગુ\",\"શુ\",\"શ\"]],u,[[\"જા\",\"ફે\",\"મા\",\"એ\",\"મે\",\"જૂ\",\"જુ\",\"ઑ\",\"સ\",\"ઑ\",\"ન\",\"ડિ\"],[\"જાન્યુ\",\"ફેબ્રુ\",\"માર્ચ\",\"એપ્રિલ\",\"મે\",\"જૂન\",\"જુલાઈ\",\"ઑગસ્ટ\",\"સપ્ટે\",\"ઑક્ટો\",\"નવે\",\"ડિસે\"],[\"જાન્યુઆરી\",\"ફેબ્રુઆરી\",\"માર્ચ\",\"એપ્રિલ\",\"મે\",\"જૂન\",\"જુલાઈ\",\"ઑગસ્ટ\",\"સપ્ટેમ્બર\",\"ઑક્ટોબર\",\"નવેમ્બર\",\"ડિસેમ્બર\"]],u,[[\"ઇ સ પુ\",\"ઇસ\"],[\"ઈ.સ.પૂર્વે\",\"ઈ.સ.\"],[\"ઈસવીસન પૂર્વે\",\"ઇસવીસન\"]],0,[0,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"hh:mm a\",\"hh:mm:ss a\",\"hh:mm:ss a z\",\"hh:mm:ss a zzzz\"],[\"{1} {0}\",u,\"{1} એ {0} વાગ્યે\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤#,##,##0.00\",\"[#E0]\"],\"INR\",\"₹\",\"ભારતીય રૂપિયા\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"MUR\":[u,\"રૂ.\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}w?Իlx4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && i % 10 === 1)
        return 1;
    if (v === 0 && i % 10 === 2)
        return 2;
    if (v === 0 && (i % 100 === 0 || (i % 100 === 20 || (i % 100 === 40 || (i % 100 === 60 || i % 100 === 80)))))
        return 3;
    if (!(v === 0))
        return 4;
    return 5;
}
export default ["gv", [["a.m.", "p.m."], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Jed", "Jel", "Jem", "Jerc", "Jerd", "Jeh", "Jes"], ["Jedoonee", "Jelhein", "Jemayrt", "Jercean", "Jerdein", "Jeheiney", "Jesarn"], ["Jed", "Jel", "Jem", "Jerc", "Jerd", "Jeh", "Jes"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["J-guer", "T-arree", "Mayrnt", "Avrril", "Boaldyn", "M-souree", "J-souree", "Luanistyn", "M-fouyir", "J-fouyir", "M-Houney", "M-Nollick"], ["Jerrey-geuree", "Toshiaght-arree", "Mayrnt", "Averil", "Boaldyn", "Mean-souree", "Jerrey-souree", "Luanistyn", "Mean-fouyir", "Jerrey-fouyir", "Mee Houney", "Mee ny Nollick"]], u, [["RC", "AD"], u, u], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GBP", "£", "GBP", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=gv.js.mappԉXxz/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ha-GH", [["SF", "YM"], u, ["Safiya", "Yamma"]], [["SF", "YM"], u, u], [["L", "L", "T", "L", "A", "J", "A"], ["Lah", "Lit", "Tal", "Lar", "Alh", "Jum", "Asa"], ["Lahadi", "Litinin", "Talata", "Laraba", "Alhamis", "Jummaʼa", "Asabar"], ["Lh", "Li", "Ta", "Lr", "Al", "Ju", "As"]], u, [["J", "F", "M", "A", "M", "Y", "Y", "A", "S", "O", "N", "D"], ["Jan", "Fab", "Mar", "Afi", "May", "Yun", "Yul", "Agu", "Sat", "Okt", "Nuw", "Dis"], ["Janairu", "Faburairu", "Maris", "Afirilu", "Mayu", "Yuni", "Yuli", "Agusta", "Satumba", "Oktoba", "Nuwamba", "Disamba"]], u, [["K.H", "BHAI"], u, ["Kafin haihuwar annab", "Bayan haihuwar annab"]], 1, [6, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE d MMMM, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'da' {0}", "{1} {0}"], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "GHS", "GH₵", "Sidi na Ghana", { "GHS": ["GH₵"], "NGN": ["₦"] }, "ltr", plural];
//# sourceMappingURL=ha-GH.js.mapWy5Xx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ha-NE", [["SF", "YM"], u, ["Safiya", "Yamma"]], [["SF", "YM"], u, u], [["L", "L", "T", "L", "A", "J", "A"], ["Lah", "Lit", "Tal", "Lar", "Alh", "Jum", "Asa"], ["Lahadi", "Litinin", "Talata", "Laraba", "Alhamis", "Jummaʼa", "Asabar"], ["Lh", "Li", "Ta", "Lr", "Al", "Ju", "As"]], u, [["J", "F", "M", "A", "M", "Y", "Y", "A", "S", "O", "N", "D"], ["Jan", "Fab", "Mar", "Afi", "May", "Yun", "Yul", "Agu", "Sat", "Okt", "Nuw", "Dis"], ["Janairu", "Faburairu", "Maris", "Afirilu", "Mayu", "Yuni", "Yuli", "Agusta", "Satumba", "Oktoba", "Nuwamba", "Disamba"]], u, [["K.H", "BHAI"], u, ["Kafin haihuwar annab", "Bayan haihuwar annab"]], 1, [6, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE d MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'da' {0}", "{1} {0}"], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XOF", "F CFA", "Kuɗin Sefa na Afirka Ta Yamma", { "NGN": ["₦"] }, "ltr", plural];
//# sourceMappingURL=ha-NE.js.mapSVxi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ha", [["SF", "YM"], u, ["Safiya", "Yamma"]], [["SF", "YM"], u, u], [["L", "L", "T", "L", "A", "J", "A"], ["Lah", "Lit", "Tal", "Lar", "Alh", "Jum", "Asa"], ["Lahadi", "Litinin", "Talata", "Laraba", "Alhamis", "Jummaʼa", "Asabar"], ["Lh", "Li", "Ta", "Lr", "Al", "Ju", "As"]], u, [["J", "F", "M", "A", "M", "Y", "Y", "A", "S", "O", "N", "D"], ["Jan", "Fab", "Mar", "Afi", "May", "Yun", "Yul", "Agu", "Sat", "Okt", "Nuw", "Dis"], ["Janairu", "Faburairu", "Maris", "Afirilu", "Mayu", "Yuni", "Yuli", "Agusta", "Satumba", "Oktoba", "Nuwamba", "Disamba"]], u, [["K.H", "BHAI"], u, ["Kafin haihuwar annab", "Bayan haihuwar annab"]], 1, [6, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE d MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'da' {0}", "{1} {0}"], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "NGN", "₦", "Nairar Najeriya", { "NGN": ["₦"] }, "ltr", plural];
//# sourceMappingURL=ha.js.mapzQx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["haw", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["LP", "P1", "P2", "P3", "P4", "P5", "P6"], ["Lāpule", "Poʻakahi", "Poʻalua", "Poʻakolu", "Poʻahā", "Poʻalima", "Poʻaono"], ["LP", "P1", "P2", "P3", "P4", "P5", "P6"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Ian.", "Pep.", "Mal.", "ʻAp.", "Mei", "Iun.", "Iul.", "ʻAu.", "Kep.", "ʻOk.", "Now.", "Kek."], ["Ianuali", "Pepeluali", "Malaki", "ʻApelila", "Mei", "Iune", "Iulai", "ʻAukake", "Kepakemapa", "ʻOkakopa", "Nowemapa", "Kekemapa"]], u, [["BCE", "CE"], u, u], 0, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "USD", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=haw.js.mapeڹx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    if (i === 2 && v === 0)
        return 2;
    if (v === 0 && (!(n >= 0 && n <= 10) && n % 10 === 0))
        return 4;
    return 5;
}
export default ["he", [["לפנה״צ", "אחה״צ"], u, u], [["לפנה״צ", "אחה״צ"], ["AM", "PM"], u], [["א׳", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳"], ["יום א׳", "יום ב׳", "יום ג׳", "יום ד׳", "יום ה׳", "יום ו׳", "שבת"], ["יום ראשון", "יום שני", "יום שלישי", "יום רביעי", "יום חמישי", "יום שישי", "יום שבת"], ["א׳", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ינו׳", "פבר׳", "מרץ", "אפר׳", "מאי", "יוני", "יולי", "אוג׳", "ספט׳", "אוק׳", "נוב׳", "דצמ׳"], ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"]], u, [["לפני", "אחריי"], ["לפנה״ס", "לספירה"], ["לפני הספירה", "לספירה"]], 0, [5, 6], ["d.M.y", "d בMMM y", "d בMMMM y", "EEEE, d בMMMM y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1}, {0}", u, "{1} בשעה {0}", u], [".", ",", ";", "%", "‎+", "‎-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "‏#,##0.00 ¤;‏-#,##0.00 ¤", "#E0"], "ILS", "₪", "שקל חדש", { "BYN": [u, "р"], "CNY": ["‎CN¥‎", "¥"], "ILP": ["ל״י"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "rtl", plural];
//# sourceMappingURL=he.js.map4ox /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["hi-Latn", [["a", "p"], ["AM", "PM"], u], [["am", "pm"], u, ["AM", "PM"]], [["ra", "so", "ma", "bu", "gu", "su", "sa"], ["ravi", "som", "mangal", "budh", "guru", "shukra", "shani"], ["ravivaar", "somvaar", "mangalvaar", "budhvaar", "guruvaar", "shukravaar", "shanivaar"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [0, 0], ["dd/MM/y", "dd-MMM-y", "d MMMM y", "EEEE, d MMMM, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1}, {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤#,##,##0.00", "[#E0]"], "INR", "₹", "Indian Rupee", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=hi-Latn.js.map@b鹷}x(/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["hi", [["am", "pm"], u, u], u, [["र", "सो", "मं", "बु", "गु", "शु", "श"], ["रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि"], ["रविवार", "सोमवार", "मंगलवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार"], ["र", "सो", "मं", "बु", "गु", "शु", "श"]], u, [["ज", "फ़", "मा", "अ", "म", "जू", "जु", "अ", "सि", "अ", "न", "दि"], ["जन॰", "फ़र॰", "मार्च", "अप्रैल", "मई", "जून", "जुल॰", "अग॰", "सित॰", "अक्तू॰", "नव॰", "दिस॰"], ["जनवरी", "फ़रवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितंबर", "अक्तूबर", "नवंबर", "दिसंबर"]], u, [["ईसा-पूर्व", "ईस्वी"], u, ["ईसा-पूर्व", "ईसवी सन"]], 0, [0, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} को {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤#,##,##0.00", "[#E0]"], "INR", "₹", "भारतीय रुपया", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "लेई"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=hi.js.map
h x{"version":3,"file":"hi.js","sourceRoot":"","sources":["hi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,WAAW,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,YAAY,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,cAAc,EAAC,OAAO,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"hi\",[[\"am\",\"pm\"],u,u],u,[[\"र\",\"सो\",\"मं\",\"बु\",\"गु\",\"शु\",\"श\"],[\"रवि\",\"सोम\",\"मंगल\",\"बुध\",\"गुरु\",\"शुक्र\",\"शनि\"],[\"रविवार\",\"सोमवार\",\"मंगलवार\",\"बुधवार\",\"गुरुवार\",\"शुक्रवार\",\"शनिवार\"],[\"र\",\"सो\",\"मं\",\"बु\",\"गु\",\"शु\",\"श\"]],u,[[\"ज\",\"फ़\",\"मा\",\"अ\",\"म\",\"जू\",\"जु\",\"अ\",\"सि\",\"अ\",\"न\",\"दि\"],[\"जन॰\",\"फ़र॰\",\"मार्च\",\"अप्रैल\",\"मई\",\"जून\",\"जुल॰\",\"अग॰\",\"सित॰\",\"अक्तू॰\",\"नव॰\",\"दिस॰\"],[\"जनवरी\",\"फ़रवरी\",\"मार्च\",\"अप्रैल\",\"मई\",\"जून\",\"जुलाई\",\"अगस्त\",\"सितंबर\",\"अक्तूबर\",\"नवंबर\",\"दिसंबर\"]],u,[[\"ईसा-पूर्व\",\"ईस्वी\"],u,[\"ईसा-पूर्व\",\"ईसवी सन\"]],0,[0,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} को {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤#,##,##0.00\",\"[#E0]\"],\"INR\",\"₹\",\"भारतीय रुपया\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"लेई\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}jI^zxund!und:ZEAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjGke)7)7#"KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK`8.WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,CAAC,EAAC,C6Z#TKAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK`EOAAO,EAAC,OAAOWAAW?UAAUeAAe,EAAC,aAAa
o
UAAU,EAAC,WAAW,EAAC,iBAAi^YcAAc
x
QAAQ,EAAC,WAAW`WAAW,EAAC,EAAEP, v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0<	4und\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm 3L'at'b`0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"USD\",\"$\",\"US Dollar\",{},\"ltr\", plural];\n"]}ox
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["hr-BA", [["AM", "PM"], u, u], u, [["N", "P", "U", "S", "Č", "P", "S"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"]], u, [["1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.", "11.", "12."], ["sij", "velj", "ožu", "tra", "svi", "lip", "srp", "kol", "ruj", "lis", "stu", "pro"], ["siječnja", "veljače", "ožujka", "travnja", "svibnja", "lipnja", "srpnja", "kolovoza", "rujna", "listopada", "studenoga", "prosinca"]], [["1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.", "11.", "12."], ["sij", "velj", "ožu", "tra", "svi", "lip", "srp", "kol", "ruj", "lis", "stu", "pro"], ["siječanj", "veljača", "ožujak", "travanj", "svibanj", "lipanj", "srpanj", "kolovoz", "rujan", "listopad", "studeni", "prosinac"]], [["pr.n.e.", "AD"], ["pr. Kr.", "po. Kr."], ["prije Krista", "poslije Krista"]], 1, [6, 0], ["d. M. yy.", "d. MMM y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss (zzzz)"], ["{1} {0}", u, "{1} 'u' {0}", u], [",", ".", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "BAM", "KM", "konvertibilna marka", { "AUD": [u, "$"], "BAM": ["KM"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "HRK": ["kn"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RUR": [u, "р."], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XCD": [u, "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=hr-BA.js.mapx
'/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["hr", [["AM", "PM"], u, u], u, [["N", "P", "U", "S", "Č", "P", "S"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"]], [["n", "p", "u", "s", "č", "p", "s"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"]], [["1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.", "11.", "12."], ["sij", "velj", "ožu", "tra", "svi", "lip", "srp", "kol", "ruj", "lis", "stu", "pro"], ["siječnja", "veljače", "ožujka", "travnja", "svibnja", "lipnja", "srpnja", "kolovoza", "rujna", "listopada", "studenoga", "prosinca"]], [["1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.", "11.", "12."], ["sij", "velj", "ožu", "tra", "svi", "lip", "srp", "kol", "ruj", "lis", "stu", "pro"], ["siječanj", "veljača", "ožujak", "travanj", "svibanj", "lipanj", "srpanj", "kolovoz", "rujan", "listopad", "studeni", "prosinac"]], [["pr.n.e.", "AD"], ["pr. Kr.", "po. Kr."], ["prije Krista", "poslije Krista"]], 1, [6, 0], ["dd. MM. y.", "d. MMM y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss (zzzz)"], ["{1} {0}", u, "{1} 'u' {0}", u], [",", ".", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "HRK", "kn", "hrvatska kuna", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "HRK": ["kn"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RUR": [u, "р."], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XCD": [u, "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=hr.js.map#E씼xs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && i % 100 === 1 || f % 100 === 1)
        return 1;
    if (v === 0 && i % 100 === 2 || f % 100 === 2)
        return 2;
    if (v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 3 && i % 100 <= 4)) || f % 100 === Math.floor(f % 100) && (f % 100 >= 3 && f % 100 <= 4))
        return 3;
    return 5;
}
export default ["hsb", [["dop.", "pop."], ["dopołdnja", "popołdnju"], u], [["am", "pm"], u, ["dopołdnja", "popołdnju"]], [["n", "p", "w", "s", "š", "p", "s"], ["nje", "pón", "wut", "srj", "štw", "pja", "sob"], ["njedźela", "póndźela", "wutora", "srjeda", "štwórtk", "pjatk", "sobota"], ["nj", "pó", "wu", "sr", "št", "pj", "so"]], u, [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan.", "feb.", "měr.", "apr.", "mej.", "jun.", "jul.", "awg.", "sep.", "okt.", "now.", "dec."], ["januara", "februara", "měrca", "apryla", "meje", "junija", "julija", "awgusta", "septembra", "oktobra", "nowembra", "decembra"]], [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "měr", "apr", "mej", "jun", "jul", "awg", "sep", "okt", "now", "dec"], ["januar", "februar", "měrc", "apryl", "meja", "junij", "julij", "awgust", "september", "oktober", "nowember", "december"]], [["př.Chr.n.", "po Chr.n."], u, ["před Chrystowym narodźenjom", "po Chrystowym narodźenju"]], 1, [6, 0], ["d.M.yy", "d.M.y", "d. MMMM y", "EEEE, d. MMMM y"], ["H:mm 'hodź'.", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": [u, "$"], "PLN": ["zł"], "THB": ["฿"] }, "ltr", plural];
//# sourceMappingURL=hsb.js.maphkxL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["hu", [["de.", "du."], u, u], u, [["V", "H", "K", "Sz", "Cs", "P", "Sz"], ["V", "H", "K", "Sze", "Cs", "P", "Szo"], ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"], ["V", "H", "K", "Sze", "Cs", "P", "Szo"]], u, [["J", "F", "M", "Á", "M", "J", "J", "A", "Sz", "O", "N", "D"], ["jan.", "febr.", "márc.", "ápr.", "máj.", "jún.", "júl.", "aug.", "szept.", "okt.", "nov.", "dec."], ["január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"]], u, [["ie.", "isz."], ["i. e.", "i. sz."], ["Krisztus előtt", "időszámításunk szerint"]], 1, [6, 0], ["y. MM. dd.", "y. MMM d.", "y. MMMM d.", "y. MMMM d., EEEE"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "HUF", "Ft", "magyar forint", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "HUF": ["Ft"], "ILS": [u, "₪"], "INR": [u, "₹"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XCD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=hu.js.mapݯYxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["hy", [["ա", "հ"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["Կ", "Ե", "Ե", "Չ", "Հ", "Ո", "Շ"], ["կիր", "երկ", "երք", "չրք", "հնգ", "ուր", "շբթ"], ["կիրակի", "երկուշաբթի", "երեքշաբթի", "չորեքշաբթի", "հինգշաբթի", "ուրբաթ", "շաբաթ"], ["կր", "եկ", "եք", "չք", "հգ", "ու", "շբ"]], u, [["Հ", "Փ", "Մ", "Ա", "Մ", "Հ", "Հ", "Օ", "Ս", "Հ", "Ն", "Դ"], ["հնվ", "փտվ", "մրտ", "ապր", "մյս", "հնս", "հլս", "օգս", "սեպ", "հոկ", "նոյ", "դեկ"], ["հունվարի", "փետրվարի", "մարտի", "ապրիլի", "մայիսի", "հունիսի", "հուլիսի", "օգոստոսի", "սեպտեմբերի", "հոկտեմբերի", "նոյեմբերի", "դեկտեմբերի"]], [["Հ", "Փ", "Մ", "Ա", "Մ", "Հ", "Հ", "Օ", "Ս", "Հ", "Ն", "Դ"], ["հնվ", "փտվ", "մրտ", "ապր", "մյս", "հնս", "հլս", "օգս", "սեպ", "հոկ", "նոյ", "դեկ"], ["հունվար", "փետրվար", "մարտ", "ապրիլ", "մայիս", "հունիս", "հուլիս", "օգոստոս", "սեպտեմբեր", "հոկտեմբեր", "նոյեմբեր", "դեկտեմբեր"]], [["մ.թ.ա.", "մ.թ."], u, ["Քրիստոսից առաջ", "Քրիստոսից հետո"]], 1, [6, 0], ["dd.MM.yy", "dd MMM, y թ.", "dd MMMM, y թ.", "y թ. MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "ՈչԹ", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "AMD", "֏", "հայկական դրամ", { "AMD": ["֏"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=hy.js.map)jnx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["ia", [["AM", "PM"], u, u], u, [["d", "l", "m", "m", "j", "v", "s"], ["dom", "lun", "mar", "mer", "jov", "ven", "sab"], ["dominica", "lunedi", "martedi", "mercuridi", "jovedi", "venerdi", "sabbato"], ["do", "lu", "ma", "me", "jo", "ve", "sa"]], u, [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], ["januario", "februario", "martio", "april", "maio", "junio", "julio", "augusto", "septembre", "octobre", "novembre", "decembre"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], ["januario", "februario", "martio", "april", "maio", "junio", "julio", "augusto", "septembre", "octobre", "novembre", "decembre"]], [["a.Chr.", "p.Chr."], u, ["ante Christo", "post Christo"]], 1, [6, 0], ["dd-MM-y", "d MMM y", "d 'de' MMMM y", "EEEE 'le' d 'de' MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'a' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], u, u, u, { "JPY": ["JP¥", "¥"], "NLG": ["ƒ"], "RUB": ["₽"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ia.js.map瀸Yxg/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["id", [["AM", "PM"], u, u], u, [["M", "S", "S", "R", "K", "J", "S"], ["Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"], ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"], ["Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"]], u, [["SM", "M"], u, ["Sebelum Masehi", "Masehi"]], 0, [6, 0], ["dd/MM/yy", "d MMM y", "d MMMM y", "EEEE, dd MMMM y"], ["HH.mm", "HH.mm.ss", "HH.mm.ss z", "HH.mm.ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "IDR", "Rp", "Rupiah Indonesia", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "IDR": ["Rp"], "INR": ["Rs", "₹"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=id.js.mapɂXx|/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ig", [["A.M.", "P.M."], u, ["N’ụtụtụ", "N’abali"]], [["A.M.", "P.M."], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sọn", "Mọn", "Tiu", "Wen", "Tọọ", "Fraị", "Sat"], ["Sọndee", "Mọnde", "Tiuzdee", "Wenezdee", "Tọọzdee", "Fraịdee", "Satọdee"], ["Sọn", "Mọn", "Tiu", "Wen", "Tọọ", "Fraị", "Sat"]], u, [["J", "F", "M", "E", "M", "J", "J", "Ọ", "S", "Ọ", "N", "D"], ["Jen", "Feb", "Maa", "Epr", "Mee", "Juu", "Jul", "Ọgọ", "Sep", "Ọkt", "Nov", "Dis"], ["Jenụwarị", "Febrụwarị", "Maachị", "Epreel", "Mee", "Juun", "Julaị", "Ọgọọst", "Septemba", "Ọktoba", "Novemba", "Disemba"]], u, [["T.K.", "A.K."], u, ["Tupu Kraist", "Afọ Kraịst"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'na' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "NGN", "₦", "Naịra", { "NGN": ["₦"] }, "ltr", plural];
//# sourceMappingURL=ig.js.map'tx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), t = parseInt(val.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0;
    if (t === 0 && (i % 10 === 1 && !(i % 100 === 11)) || !(t === 0))
        return 1;
    return 5;
}
export default ["is", [["f.", "e."], ["f.h.", "e.h."], u], [["f.h.", "e.h."], u, u], [["S", "M", "Þ", "M", "F", "F", "L"], ["sun.", "mán.", "þri.", "mið.", "fim.", "fös.", "lau."], ["sunnudagur", "mánudagur", "þriðjudagur", "miðvikudagur", "fimmtudagur", "föstudagur", "laugardagur"], ["su.", "má.", "þr.", "mi.", "fi.", "fö.", "la."]], u, [["J", "F", "M", "A", "M", "J", "J", "Á", "S", "O", "N", "D"], ["jan.", "feb.", "mar.", "apr.", "maí", "jún.", "júl.", "ágú.", "sep.", "okt.", "nóv.", "des."], ["janúar", "febrúar", "mars", "apríl", "maí", "júní", "júlí", "ágúst", "september", "október", "nóvember", "desember"]], u, [["f.k.", "e.k."], ["f.Kr.", "e.Kr."], ["fyrir Krist", "eftir Krist"]], 1, [6, 0], ["d.M.y", "d. MMM y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'kl'. {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "ISK", "ISK", "íslensk króna", { "AUD": [u, "$"], "BRL": [u, "R$"], "CAD": [u, "$"], "EUR": [u, "€"], "GBP": [u, "£"], "INR": [u, "₹"], "JPY": ["JP¥", "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=is.js.mapsx?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 1 && v === 0)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["it-SM", [["m.", "p."], ["AM", "PM"], u], u, [["D", "L", "M", "M", "G", "V", "S"], ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], ["domenica", "lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato"], ["dom", "lun", "mar", "mer", "gio", "ven", "sab"]], u, [["G", "F", "M", "A", "M", "G", "L", "A", "S", "O", "N", "D"], ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"]], u, [["aC", "dC"], ["a.C.", "d.C."], ["avanti Cristo", "dopo Cristo"]], 1, [6, 0], ["dd/MM/yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "BRL": [u, "R$"], "BYN": [u, "Br"], "EGP": [u, "£E"], "HKD": [u, "$"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NOK": [u, "NKr"], "THB": ["฿"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=it-SM.js.mapKsx?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 1 && v === 0)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["it-VA", [["m.", "p."], ["AM", "PM"], u], u, [["D", "L", "M", "M", "G", "V", "S"], ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], ["domenica", "lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato"], ["dom", "lun", "mar", "mer", "gio", "ven", "sab"]], u, [["G", "F", "M", "A", "M", "G", "L", "A", "S", "O", "N", "D"], ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"]], u, [["aC", "dC"], ["a.C.", "d.C."], ["avanti Cristo", "dopo Cristo"]], 1, [6, 0], ["dd/MM/yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "BRL": [u, "R$"], "BYN": [u, "Br"], "EGP": [u, "£E"], "HKD": [u, "$"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NOK": [u, "NKr"], "THB": ["฿"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=it-VA.js.mapœ9sx9/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === 1 && v === 0)
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["it", [["m.", "p."], ["AM", "PM"], u], u, [["D", "L", "M", "M", "G", "V", "S"], ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], ["domenica", "lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato"], ["dom", "lun", "mar", "mer", "gio", "ven", "sab"]], u, [["G", "F", "M", "A", "M", "G", "L", "A", "S", "O", "N", "D"], ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"]], u, [["aC", "dC"], ["a.C.", "d.C."], ["avanti Cristo", "dopo Cristo"]], 1, [6, 0], ["dd/MM/yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "BRL": [u, "R$"], "BYN": [u, "Br"], "EGP": [u, "£E"], "HKD": [u, "$"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NOK": [u, "NKr"], "THB": ["฿"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=it.js.map	Mx"/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ja", [["午前", "午後"], u, u], u, [["日", "月", "火", "水", "木", "金", "土"], u, ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"], ["日", "月", "火", "水", "木", "金", "土"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], u], u, [["BC", "AD"], ["紀元前", "西暦"], u], 0, [6, 0], ["y/MM/dd", u, "y年M月d日", "y年M月d日EEEE"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H時mm分ss秒 zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "JPY", "￥", "日本円", { "BYN": [u, "р."], "CNY": ["元", "￥"], "JPY": ["￥"], "PHP": [u, "₱"], "RON": [u, "レイ"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=ja.js.mapAK]x-/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["jgo", [["mbaꞌmbaꞌ", "ŋka mbɔ́t nji"], u, u], u, [["Sɔ́", "Mɔ́", "ÁM", "Wɛ́", "Tɔ́", "Fɛ", "Sá"], ["Sɔ́ndi", "Mɔ́ndi", "Ápta Mɔ́ndi", "Wɛ́nɛsɛdɛ", "Tɔ́sɛdɛ", "Fɛlâyɛdɛ", "Sásidɛ"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Nduŋmbi Saŋ", "Pɛsaŋ Pɛ́pá", "Pɛsaŋ Pɛ́tát", "Pɛsaŋ Pɛ́nɛ́kwa", "Pɛsaŋ Pataa", "Pɛsaŋ Pɛ́nɛ́ntúkú", "Pɛsaŋ Saambá", "Pɛsaŋ Pɛ́nɛ́fɔm", "Pɛsaŋ Pɛ́nɛ́pfúꞋú", "Pɛsaŋ Nɛgɛ́m", "Pɛsaŋ Ntsɔ̌pmɔ́", "Pɛsaŋ Ntsɔ̌ppá"], u], u, [["BCE", "CE"], u, ["tsɛttsɛt mɛŋguꞌ mi ɛ́ lɛɛnɛ Kɛlísɛtɔ gɔ ńɔ́", "tsɛttsɛt mɛŋguꞌ mi ɛ́ fúnɛ Kɛlísɛtɔ tɔ́ mɔ́"]], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "EEEE, y MMMM dd"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XAF", "FCFA", "Fɛlâŋ", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=jgo.js.mapLG	Vxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["jmc", [["utuko", "kyiukonyi"], u, u], u, [["J", "J", "J", "J", "A", "I", "J"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"], ["Jumapilyi", "Jumatatuu", "Jumanne", "Jumatanu", "Alhamisi", "Ijumaa", "Jumamosi"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Machi", "Aprilyi", "Mei", "Junyi", "Julyai", "Agusti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KK", "BK"], u, ["Kabla ya Kristu", "Baada ya Kristu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "TZS", "TSh", "Shilingi ya Tanzania", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=jmc.js.map!|Rx-/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["jv", [["Isuk", "Wengi"], u, u], u, [["A", "S", "S", "R", "K", "J", "S"], ["Ahad", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"], ["Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"], ["Ahad", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agt", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"]], u, [["SM", "M"], u, ["Sakdurunge Masehi", "Masehi"]], 0, [6, 0], ["dd-MM-y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "IDR", "Rp", "Rupiah Indonesia", { "IDR": ["Rp"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=jv.js.mapNhxK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ka", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["კ", "ო", "ს", "ო", "ხ", "პ", "შ"], ["კვი", "ორშ", "სამ", "ოთხ", "ხუთ", "პარ", "შაბ"], ["კვირა", "ორშაბათი", "სამშაბათი", "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი"], ["კვ", "ორ", "სმ", "ოთ", "ხთ", "პრ", "შბ"]], u, [["ი", "თ", "მ", "ა", "მ", "ი", "ი", "ა", "ს", "ო", "ნ", "დ"], ["იან", "თებ", "მარ", "აპრ", "მაი", "ივნ", "ივლ", "აგვ", "სექ", "ოქტ", "ნოე", "დეკ"], ["იანვარი", "თებერვალი", "მარტი", "აპრილი", "მაისი", "ივნისი", "ივლისი", "აგვისტო", "სექტემბერი", "ოქტომბერი", "ნოემბერი", "დეკემბერი"]], u, [["ძვ. წ.", "ახ. წ."], u, ["ძველი წელთაღრიცხვით", "ახალი წელთაღრიცხვით"]], 1, [6, 0], ["dd.MM.yy", "d MMM. y", "d MMMM, y", "EEEE, dd MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "არ არის რიცხვი", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "GEL", "₾", "ქართული ლარი", { "AUD": [u, "$"], "BYN": [u, "р."], "CNY": [u, "¥"], "GEL": ["₾"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=ka.js.map@枦\x:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || i === 1)
        return 1;
    return 5;
}
export default ["kab", [["n tufat", "n tmeddit"], u, u], u, [["Y", "S", "K", "K", "S", "S", "S"], ["Yan", "San", "Kraḍ", "Kuẓ", "Sam", "Sḍis", "Say"], ["Yanass", "Sanass", "Kraḍass", "Kuẓass", "Samass", "Sḍisass", "Sayass"], ["Yan", "San", "Kraḍ", "Kuẓ", "Sam", "Sḍis", "Say"]], u, [["Y", "F", "M", "Y", "M", "Y", "Y", "Ɣ", "C", "T", "N", "D"], ["Yen", "Fur", "Meɣ", "Yeb", "May", "Yun", "Yul", "Ɣuc", "Cte", "Tub", "Nun", "Duǧ"], ["Yennayer", "Fuṛar", "Meɣres", "Yebrir", "Mayyu", "Yunyu", "Yulyu", "Ɣuct", "Ctembeṛ", "Tubeṛ", "Nunembeṛ", "Duǧembeṛ"]], u, [["snd. T.Ɛ", "sld. T.Ɛ"], u, ["send talalit n Ɛisa", "seld talalit n Ɛisa"]], 6, [5, 6], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "DZD", "DA", "Adinar Azzayri", { "DZD": ["DA"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kab.js.mapM]x./**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["kam", [["Ĩyakwakya", "Ĩyawĩoo"], u, u], u, [["Y", "W", "E", "A", "A", "A", "A"], ["Wky", "Wkw", "Wkl", "Wtũ", "Wkn", "Wtn", "Wth"], ["Wa kyumwa", "Wa kwambĩlĩlya", "Wa kelĩ", "Wa katatũ", "Wa kana", "Wa katano", "Wa thanthatũ"], ["Wky", "Wkw", "Wkl", "Wtũ", "Wkn", "Wtn", "Wth"]], u, [["M", "K", "K", "K", "K", "T", "M", "N", "K", "Ĩ", "Ĩ", "Ĩ"], ["Mbe", "Kel", "Ktũ", "Kan", "Ktn", "Tha", "Moo", "Nya", "Knd", "Ĩku", "Ĩkm", "Ĩkl"], ["Mwai wa mbee", "Mwai wa kelĩ", "Mwai wa katatũ", "Mwai wa kana", "Mwai wa katano", "Mwai wa thanthatũ", "Mwai wa muonza", "Mwai wa nyaanya", "Mwai wa kenda", "Mwai wa ĩkumi", "Mwai wa ĩkumi na ĩmwe", "Mwai wa ĩkumi na ilĩ"]], u, [["MY", "IY"], u, ["Mbee wa Yesũ", "Ĩtina wa Yesũ"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Silingi ya Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kam.js.mapxB{"version":3,"file":"uk.js","sourceRoot":"","sources":["uk.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))\n    return 3;\nif (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))\n    return 4;\nreturn 5;\n}\n\nexport default [\"uk\",[[\"дп\",\"пп\"],u,u],u,[[\"Н\",\"П\",\"В\",\"С\",\"Ч\",\"П\",\"С\"],[\"нд\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],[\"неділя\",\"понеділок\",\"вівторок\",\"середа\",\"четвер\",\"пʼятниця\",\"субота\"],[\"нд\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"]],u,[[\"с\",\"л\",\"б\",\"к\",\"т\",\"ч\",\"л\",\"с\",\"в\",\"ж\",\"л\",\"г\"],[\"січ.\",\"лют.\",\"бер.\",\"квіт.\",\"трав.\",\"черв.\",\"лип.\",\"серп.\",\"вер.\",\"жовт.\",\"лист.\",\"груд.\"],[\"січня\",\"лютого\",\"березня\",\"квітня\",\"травня\",\"червня\",\"липня\",\"серпня\",\"вересня\",\"жовтня\",\"листопада\",\"грудня\"]],[[\"С\",\"Л\",\"Б\",\"К\",\"Т\",\"Ч\",\"Л\",\"С\",\"В\",\"Ж\",\"Л\",\"Г\"],[\"січ\",\"лют\",\"бер\",\"кві\",\"тра\",\"чер\",\"лип\",\"сер\",\"вер\",\"жов\",\"лис\",\"гру\"],[\"січень\",\"лютий\",\"березень\",\"квітень\",\"травень\",\"червень\",\"липень\",\"серпень\",\"вересень\",\"жовтень\",\"листопад\",\"грудень\"]],[[\"до н.е.\",\"н.е.\"],[\"до н. е.\",\"н. е.\"],[\"до нашої ери\",\"нашої ери\"]],1,[6,0],[\"dd.MM.yy\",\"d MMM y 'р'.\",\"d MMMM y 'р'.\",\"EEEE, d MMMM y 'р'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} 'о' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"Е\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"UAH\",\"₴\",\"українська гривня\",{\"AUD\":[u,\"$\"],\"BRL\":[u,\"R$\"],\"BYN\":[u,\"р.\"],\"CAD\":[u,\"$\"],\"CNY\":[u,\"¥\"],\"EUR\":[u,\"€\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"RUR\":[u,\"р.\"],\"TWD\":[u,\"$\"],\"UAH\":[\"₴\"],\"UAK\":[\"крб.\"],\"USD\":[u,\"$\"],\"VND\":[u,\"₫\"],\"XCD\":[u,\"$\"]},\"ltr\", plural];\n"]})[IKx~56pl!pl:J	;QAClB3/M}/CAAC`M/M9P~Q
e_
9
MAAMMAAM,EAAC,KAAK	*
cAAc,E"{A*

U
MAAMMAAM,EAAC,KAAK	*
cAAc,E"{A*

F2l

MAAM,EAAC,SAAS	
		EAAC,SAASF2l	EAAC,QAAQ,EAAC,UAAU,EAAC,KAAK1EAAC,UAAU,EAAC,UAAU,EAAC,aAAa,EAAC,UAAU,EAAC,UAAUQAAQ	
iBAAiB,EAAC,YAAY$_
_

M	
gBAAgB]N
<SAAS_idUIAAI,EAAC,cAAcqL(KAAK$KAAK[i === 1 && v === 0(!(i === 1)x10 && i % 10 <= 1)))l+4pl\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],u,[[\"n\",\"p\",\"w\",\"ś\",\"c\",\"p\",\"s\"],[\"niedz.\",\"pon.\",\"wt.\",\"śr.\",\"czw.\",\"pt.\",\"sob.\"],[\"niedziela\",\"poniedziałek\",\"wtorek\",\"środa\",\"czwartek\",\"piątek\",\"sobota\"],[\"nie\",\"pon\",\"wto\",\"śro\",\"czw\",\"pią\",\"sob\"]],[[\"N\",\"P\",\"W\",\"Ś\",\"C\",\"P\",\"S\"],[\"niedz.\",\"pon.\",\"wt.\",\"śr.\",\"czw.\",\"pt.\",\"sob.\"],[\"niedziela\",\"poniedziałek\",\"wtorek\",\"środa\",\"czwartek\",\"piątek\",\"sobota\"],[\"nie\",\"pon\",\"wto\",\"śro\",\"czw\",\"pią\",\"sob\"]],[[\"s\",\"l\",\"m\",\"k\",\"m\",\"c\",\"l\",\"s\",\"w\",\"p\",\"l\",\"g\"],[\"sty\",\"lut\",\"mar\",\"kwi\",\"maj\",\"cze\",\"lip\",\"sie\",\"wrz\",\"paź\",\"lis\",\"gru\"],[\"stycznia\",\"lutego\",\"marca\",\"kwietnia\",\"maja\",\"czerwca\",\"lipca\",\"sierpnia\",\"września\",\"października\",\"listopada\",\"grudnia\"]],[[\"S\",\"L\",\"M\",\"K\",\"M\",\"C\",\"L\",\"S\",\"W\",\"P\",\"L\",\"G\"],[\"sty\",\"lut\",\"mar\",\"kwi\",\"maj\",\"cze\",\"lip\",\"sie\",\"wrz\",\"paź\",\"lis\",\"gru\"],[\"styczeń\",\"luty\",\"marzec\",\"kwiecień\",\"maj\",\"czerwiec\",\"lipiec\",\"sierpień\",\"wrzesień\",\"październik\",\"listopad\",\"grudzień\"]],[[\"p.n.e.\",\"n.e.\"],u,[\"przed naszą erą\"O,\"naszej ery\"]],1,[6,0],[\"d.MM.y\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM yTN1E_PLN\",\"zł\",\"złoty polskiP%MJPY\":[u,\"¥R4PLN\":[\"zł\"],\"RON\":[u,\"lej\"],\"TWD\":[u,\"NT$j)},\"ltr\", plural];\n"]}`oYx
5)s"s9K	;QAClB$/IAAI,CAAC,IAAI;QACpDCAAC`;QACV~A{C	OAAO,EAAC,QAAQ
SAAS,EAAC,WAAWQ	UAAUF2l
EW	UAAU
cAAc,EAAC,aAAa$_
_$SAAS,EAAC,CAAC,EAAC,WAAW,EAAC,gBAAgB$SAAS,EAAC,WAAW,EAAC,cAAc,CAAC,EAAC,C?	U_id(SAAS83MAAMq2{
`P`P`A(KAAKeEAAEq\i === 1 && v === 0)\n    return 1;\nif (i === Math.floor(i) && (i >= 2 && i <= 4) && v === 0?	!(v === 05sk\",[[\"AM\",\"PM\"],u,u],u,[[\"n\",\"p\",\"u\",\"s\",\"š\",\"p\",\"s\"],[\"ne\",\"po\",\"ut\",\"st\",\"št\",\"pi\",\"so\"],[\"nedeľa\",\"pondelok\",\"utorok\",\"streda\",\"štvrtok\",\"piatok\",\"sobota\"],[\"ne\",\"po\",\"ut\",\"st\",\"št\",\"pi\",\"so\"]],u,[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"máj\",\"jún\",\"júl\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"],[\"januára\",\"februára\",\"marca\",\"apríla\",\"mája\",\"júna\",\"júla\",\"augusta\",\"septembra\",\"októbra\",\"novembra\",\"decembra\"]],[[\"j\",\"f\",\"m\",\"a\",\"m\",\"j\",\"j\",\"a\",\"s\",\"o\",\"n\",\"d\"],[\"jan\",\"feb\",\"mar\",\"apr\",\"máj\",\"jún\",\"júl\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"],[\"január\",\"február\",\"marec\",\"apríl\",\"máj\",\"jún\",\"júl\",\"august\",\"september\",\"október\",\"november\",\"december\"]],[[\"pred Kr.\",\"po Kr.\"],u,[\"pred Kristom\",\"po Kristovi\"]],1,[6,0],[\"d. M. y\",u,\"d. MMMM y\",\"EEEE d.\ MMMM y\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"H:mm:ss zzzz\"],[\"{1} {0}\",\"{1}, {0}\",uS,e?  EUR\",\"€\",\"eurod,\"NIS\" JPY\":[u,\"¥ENT$j-XX\":[]},\"ltr\", plural];\n"]}&J]xU5't"t9	CAAC;IAEd;QACP~[KAAK]eAAe,EAAC,gBAAgB
KAAK	eAAe,EAAC,gBAAgBU{A

	M	
UAAU!	UU{A

	M	
UAAU!	UF2l#MAAM-
'KAAKQAAQ	F2lA-
'KAAKQAAQ	QAAQ	
*
YAAY$_
_%	M	
b
m
N
(SAASOidSAAS*
SAAS8)
gBAAgp%(F{
`7{
;\n\nif (n === 1)\n    return 1%tk\",[[\"öň\",\"soň\"],[\"go.öň\",\"go.soň\"],[\"günortadan öň\",\"günortadan soň\"]],[[\"öň\",\"soň\"],[\"g.öň\",\"g.soň\"],[\"günortadan öň\",\"günortadan soň\"]],[[\"Ý\",\"D\",\"S\",\"Ç\",\"P\",\"A\",\"Ş\"],[\"ýek\",\"duş\",\"siş\",\"çar\",\"pen\",\"ann\",\"şen\"],[\"ýekşenbe\",\"duşenbe\",\"sişenbe\",\"çarşenbe\",\"penşenbe\",\"anna\",\"enbe\"],[\"ýb\",\"db\",\"sb\",\"çb\",\"pb\",\"an\",\"şb\"]],[[\"Ý\",\"D\",\"S\",\"Ç\",\"P\",\"A\",\"Ş\"],[\"Ýek\",\"Du\",\"Siş\",\"Çar\",\"Pen\",\"Ann\",\"Şen\"],[\"Ýekşenbe\",\"Duşenbe\",\"Sişenbe\",\"Çarşenbe\",\"Penşenbe\",\"Anna\",\"Şenbe\"],[\"Ýb\",\"Db\",\"Sb\",\"Çb\",\"Pb\",\"An\",\"Şb\"]],[[\"Ý\",\"F\",\"M\",\"A\",\"M\",\"I\",\"I\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"ýan\",\"few\",\"mart\",\"apr\",\"maý\",\"iýun\",\"iýul\",\"awg\",\"sen\",\"okt\",\"noý\",\"dek\"],[\"anwar\",\"fewral\",\"mart\",\"aprel\",\"maý\",\"iýun\",\"iýul\",\"awgust\",\"sentýabr\",\"oktýabr\",\"noýabr\",\"dekabr\"]],[[\"Ý\",\"F\",\"M\",\"A\",\"M\",\"I\",\"I\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Ýan\",\"Few\",\"Mar\",\"Apr\",\"Maý\",\"Iun\",\"Iýul\",\"Awg\",\"Sen\",\"Okt\",\"Noý\",\"Dek\"],[\"Ýanwar\",\"Fewral\",\"Mart\",\"Aprel\",\"Maý\",\"Iýun\",\"Iýul\",\"Awgust\",\"Sentýabr\",\"Oktýabr\",\"Noýabr\",\"Dekabr\"]],[[\"B.e.öň\",\"B.e.\"],u,[\"Isadan öň\",\"Isadan soň\"]]+\",\"d MMM y\",\"d MMMM y\",\"d MMMM y EEEED
 {0}\",u,uS,E	san däl   3TMT\",\"TMT\",\"Türkmen manady\",{\"BYN\":[u,\"р.o-<JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"USD\":[\"US$\"[ixK) nl!nl:nq<MAAM,EAAC,MAAM⓻
CAAC,EAAC,Cqppp

.
}}
KAAKm$}}1#_
sUAAU,E#MAAM,EAAC,MAAMeAAe,EAAC,aAAa$
@
6eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe0CAAC,EAAC,cAAcGd(QAAQ,EAAC,wBAAwB1l	
0	#k
2	IAAI	$k
(k
Z	k
(		f
(EAAEj"nl\",[[\"a.m.\",\"p.m.\"],u,u],u,[[\"Z\",\"M\",\"D\",\"W\",\"D\",\"V\",\"Z\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"jan.\",\"feb.\",\"mrt.\",\"apr.\",\"mei\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],[\"januari\",\"februari\",\"maart\",\"april\",\"mei\5",\"juni\",\"juli\",\"augustus\",\"september\",\"okto"u,[[\"v.C.\",\"n.C.\"],[\"v.Chr.\",\"n.Chr.\"],[\"voor Christus\",\"na Christus\"]],1,[6,0],[\"dd-MM-y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,\"{1} 'om' {0}\",u],[\",\",\".\"E? %\",\"¤ #,##0.00;¤ -#,##0.00`Euro\",{\"AUD\":[\"AU$\",\""<\"C$\",\"$\"],\"FJD\":[\"FJ$\",\"$\"],\"JPY\":[\"JP¥\",\"¥l.[SBD\":[\"SI$\",\"$\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XPF\":[$ȹquCxT !ksh!ksh:OCAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP=@o
kBAAkB,EAAC,kBAAkB o
aAAaX~Ak6KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKECAAC,WAAW,EAAC,WAAW,EAAC,YAAY,EAAC,SAAS,EAAC,cAAc,EAAC,WAAW,EAAC,WAAW
hKAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAKMAAM,EAAC,QAAQ,EAAC,KAAK
WAAW~
MAAM,EAAC,QAAQ,EAAC,KAAK
WAAWzCAAC,EAAC,CAAC,aAAaXQWAAW,EAAC,WAAW,EAAC,sBAAsBV o+F
g(
YAAYo-;\n\nif (n === 0)\n    return 0;\nif (n === 1
4ksh\",[[\"v.M.\",\"n.M.\"],u,[\"Uhr vörmiddaachs\",\"Uhr nommendaachs\"]],[[\"v.M.\",\"n.M.\"],u,[\"Vörmeddaach\",\"Nommendaach\"]],[[\"S\",\"M\",\"D\",\"M\",\"D\",\"F\",\"S\"],[\"Su.\",\"Mo.\",\"Di.\",\"Me.\",\"Du.\",\"Fr.\",\"Sa.\"],[\"Sunndaach\",\"Mohndaach\",\"Dinnsdaach\",\"Metwoch\",\"Dunnersdaach\",\"Friidaach\",\"Samsdaach\"],[\"Su\",\"Mo\",\"Di\",\"Me\",\"Du\",\"Fr\",\"S6O6Jan\",\"Fäb\",\"Mäz\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Ouj\",\"Säp\",\"Okt\",\"Nov\",\"Dez\"],[\"Jannewa\",\"Fäbrowa\",\"Määz\",\"Aprell\",\"Mai\",\"Juuni\",\"Juuli\",\"Oujoß\",\"Septämber\",\"Oktohber\",\"Novämber\",\"Dezämber\"]],[[\"J\",\"F#O6Jan.\",\"Fäb.\",\"Mäz.\",\"Apr.\",\"Mai\",\"Jun.\",\"Jul.\",\"Ouj.\",\"Säp.\",\"Okt.\",\"Nov.\",\"Dez.\"],[\"Jannewa\",\"Fäbrowa\",\"Määz\",\"Aprell\",\"Mai\",\"Juuni\",\"Juuli\",\"Oujoß\",\"Septämber\",\"Oktohber\",\"Novämber\",\"Dezämber\"]],[[\"vC\",\"nC\"],[\"v. Chr.\",\"n. Chr.\"],[\"vür Krestos\",\"noh Krestos\"]],1,[6,0],[\"d. M. y\",\"d. MMM. y\",\"d. MMMM y\",\"EEEE, 'dä' d.T4u,u],[\",\",\" \",\";\",\"%\",\"+\",\"−\",\"×10^d? %\",\"#,##0.00 ¤(JPY\":[\"JP¥\",\"¥z77TxJ'kam!kam:(	WAAW,EAAC,SAAS,CAAC,EN
gBAAgB,EAAC,SAAS,E?	WAAW,EAAC,cAAcVNA2PoocAAc,EAAC,cAAc,EAAC,gBAAgB,EAAC,cAAc,EAAC,gBAAgB,EAAC,mBAAmB,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,eAAe,EAAC,eAAe,EAAC,uBAAuB,EAAC,sBAAsB$
z
"EAAC,CAAC,EAAC,CAAC,cAAc,EAAC,eAAe[gBAAgBMKAAK
QAAQ,EAAC,WAAW[	)kBAAk	
(a		l
&"kam\",[[\"Ĩyakwakya\",\"Ĩyawĩoo\"],u,u],u,[[\"Y\",\"W\",\"E\",\"A\",\"A\",\"A\",\"A\"],[\"Wky\",\"Wkw\",\"Wkl\",\"Wtũ\",\"Wkn\",\"Wtn\",\"Wth\"],[\"Wa kyumwa\",\"Wa kwambĩlĩlya\",\"Wa kelĩ\",\"Wa katatũ\",\"Wa kana\",\"Wa katano\",\"Wa thanthatũ\"],[\"Wky\",\"Wkw\",\"Wkl\",\"Wtũ\",\"Wkn\",\"Wtn\",\"Wth\"]],u,[[\"M\",\"K\",\"K\",\"K\",\"K\",\"T\",\"M\",\"N\",\"K\",\"Ĩ\",\"Ĩ\",\"Ĩ\"],[\"Mbe\",\"Kel\",\"Ktũ\",\"Kan\",\"Ktn\",\"Tha\",\"Moo\",\"Nya\",\"Knd\",\"Ĩku\",\"Ĩkm\",\"Ĩkl\"],[\"Mwai wa mbee\",\"Mwai wa kelĩ\",\"Mwai wa katatũ\",\"Mwai wa kana\",\"Mwai wa katano\",\"Mwai wa thanthatũ\",\"Mwai wa muonza\",\"Mwai wa nyaanya\",\"Mwai wa kenda\",\"Mwai wa ĩkumi\",\"Mwai wa ĩkumi na ĩmwe\",\"Mwai wa ĩkumi na ilĩ\"]],u,[[\"MY\",\"IAY\"],u,[\"Mbee wa Yesũ\",\"Ĩtina wa Yesũ\"]],0,[6,0],[\"dd/MM/EEEE, d MMMM yU.\",\",X:NaN B%\",\"¤#,##0.00\",\"#E0\"],\"KES\",\"Ksh\",\"Silingi ya Kenya\",{;KES\":[\"Kshe3cx:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["kde", [["Muhi", "Chilo"], u, u], u, [["2", "3", "4", "5", "6", "7", "1"], ["Ll2", "Ll3", "Ll4", "Ll5", "Ll6", "Ll7", "Ll1"], ["Liduva lyapili", "Liduva lyatatu", "Liduva lyanchechi", "Liduva lyannyano", "Liduva lyannyano na linji", "Liduva lyannyano na mavili", "Liduva litandi"], ["Ll2", "Ll3", "Ll4", "Ll5", "Ll6", "Ll7", "Ll1"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Mwedi Ntandi", "Mwedi wa Pili", "Mwedi wa Tatu", "Mwedi wa Nchechi", "Mwedi wa Nnyano", "Mwedi wa Nnyano na Umo", "Mwedi wa Nnyano na Mivili", "Mwedi wa Nnyano na Mitatu", "Mwedi wa Nnyano na Nchechi", "Mwedi wa Nnyano na Nnyano", "Mwedi wa Nnyano na Nnyano na U", "Mwedi wa Nnyano na Nnyano na M"]], u, [["AY", "NY"], u, ["Akanapawa Yesu", "Nankuida Yesu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "TZS", "TSh", "Shilingi ya Tanzania", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kde.js.mapĜWx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["kea", [["am", "pm"], u, u], u, [["D", "S", "T", "K", "K", "S", "S"], ["dum", "sig", "ter", "kua", "kin", "ses", "sab"], ["dumingu", "sigunda-fera", "tersa-fera", "kuarta-fera", "kinta-fera", "sesta-fera", "sábadu"], ["du", "si", "te", "ku", "ki", "se", "sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Otu", "Nuv", "Diz"], ["Janeru", "Febreru", "Marsu", "Abril", "Maiu", "Junhu", "Julhu", "Agostu", "Setenbru", "Otubru", "Nuvenbru", "Dizenbru"]], u, [["AK", "DK"], u, ["antis di Kristu", "dispos di Kristu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d 'di' MMMM 'di' y", "EEEE, d 'di' MMMM 'di' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "CVE", "​", "Skudu Kabuverdianu", { "AUD": ["AU$", "$"], "CVE": ["​"], "JPY": ["JP¥", "¥"], "THB": ["฿"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kea.js.mapIfxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["kgp", [["AM", "PM"], u, u], u, [["N.", "P.", "R.", "T.", "V.", "P.", "S."], ["num.", "pir.", "rég.", "tẽg.", "vẽn.", "pén.", "sav."], ["numĩggu", "pir-kurã-há", "régre-kurã-há", "tẽgtũ-kurã-há", "vẽnhkãgra-kurã-há", "pénkar-kurã-há", "savnu"], ["N.", "1kh.", "2kh.", "3kh.", "4kh.", "5kh.", "S."]], u, [["1K", "2K", "3K", "4K", "5K", "6K", "7K", "8K", "9K", "10K", "11K", "12K"], ["1Ky.", "2Ky.", "3Ky.", "4Ky.", "5Ky.", "6Ky.", "7Ky.", "8Ky.", "9Ky.", "10Ky.", "11Ky.", "12Ky."], ["1-Kysã", "2-Kysã", "3-Kysã", "4-Kysã", "5-Kysã", "6-Kysã", "7-Kysã", "8-Kysã", "9-Kysã", "10-Kysã", "11-Kysã", "12-Kysã"]], u, [["C.j.", "C.kk."], u, ["Cristo jo", "Cristo kar kỹ"]], 0, [6, 0], ["dd/MM/y", "d 'ne' MMM, y", "d 'ne' MMMM, y", "EEEE, d 'ne' MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "BRL", "R$", "Mrasir Rejar", { "AUD": ["AU$", "$"], "BYN": [u, "p."], "FJD": ["FJC", "$"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["Vẽj."], "RON": [u, "L"], "SYP": [u, "S£"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XOF": ["CFA"], "ZMK": ["SMK"] }, "ltr", plural];
//# sourceMappingURL=kgp.js.mapd[xL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ki", [["Kiroko", "Hwaĩ-inĩ"], u, u], u, [["K", "N", "N", "N", "A", "N", "N"], ["KMA", "NTT", "NMN", "NMT", "ART", "NMA", "NMM"], ["Kiumia", "Njumatatũ", "Njumaine", "Njumatana", "Aramithi", "Njumaa", "Njumamothi"], ["KMA", "NTT", "NMN", "NMT", "ART", "NMA", "NMM"]], u, [["J", "K", "G", "K", "G", "G", "M", "K", "K", "I", "I", "D"], ["JEN", "WKR", "WGT", "WKN", "WTN", "WTD", "WMJ", "WNN", "WKD", "WIK", "WMW", "DIT"], ["Njenuarĩ", "Mwere wa kerĩ", "Mwere wa gatatũ", "Mwere wa kana", "Mwere wa gatano", "Mwere wa gatandatũ", "Mwere wa mũgwanja", "Mwere wa kanana", "Mwere wa kenda", "Mwere wa ikũmi", "Mwere wa ikũmi na ũmwe", "Ndithemba"]], u, [["MK", "TK"], u, ["Mbere ya Kristo", "Thutha wa Kristo"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Ciringi ya Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ki.js.mapwjxo/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["kk", [["AM", "PM"], u, u], u, [["Ж", "Д", "С", "С", "Б", "Ж", "С"], ["жс", "дс", "сс", "ср", "бс", "жм", "сб"], ["жексенбі", "дүйсенбі", "сейсенбі", "сәрсенбі", "бейсенбі", "жұма", "сенбі"], ["жс", "дс", "сс", "ср", "бс", "жм", "сб"]], u, [["Қ", "А", "Н", "С", "М", "М", "Ш", "Т", "Қ", "Қ", "Қ", "Ж"], ["қаң.", "ақп.", "нау.", "сәу.", "мам.", "мау.", "шіл.", "там.", "қыр.", "қаз.", "қар.", "жел."], ["қаңтар", "ақпан", "наурыз", "сәуір", "мамыр", "маусым", "шілде", "тамыз", "қыркүйек", "қазан", "қараша", "желтоқсан"]], [["Қ", "А", "Н", "С", "М", "М", "Ш", "Т", "Қ", "Қ", "Қ", "Ж"], ["қаң.", "ақп.", "нау.", "сәу.", "мам.", "мау.", "шіл.", "там.", "қыр.", "қаз.", "қар.", "жел."], ["Қаңтар", "Ақпан", "Наурыз", "Сәуір", "Мамыр", "Маусым", "Шілде", "Тамыз", "Қыркүйек", "Қазан", "Қараша", "Желтоқсан"]], [["б.з.д.", "б.з."], u, ["Біздің заманымызға дейін", "біздің заманымыз"]], 1, [6, 0], ["dd.MM.yy", "y 'ж'. dd MMM", "y 'ж'. d MMMM", "y 'ж'. d MMMM, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "сан емес", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "KZT", "₸", "Қазақстан теңгесі", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "KZT": ["₸"], "LSL": ["ЛСЛ"], "PHP": [u, "₱"], "RUB": ["₽"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=kk.js.mapCijx]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["kl", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["sap", "ata", "mar", "pin", "sis", "tal", "arf"], ["sapaat", "ataasinngorneq", "marlunngorneq", "pingasunngorneq", "sisamanngorneq", "tallimanngorneq", "arfininngorneq"], ["sap", "ata", "mar", "pin", "sis", "tal", "arf"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["jan", "febr", "mar", "apr", "maj", "jun", "jul", "aug", "sept", "okt", "nov", "dec"], ["januaarip", "februaarip", "marsip", "apriilip", "maajip", "juunip", "juulip", "aggustip", "septembarip", "oktobarip", "novembarip", "decembarip"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["jan", "febr", "mar", "apr", "maj", "jun", "jul", "aug", "sept", "okt", "nov", "dec"], ["januaari", "februaari", "marsi", "apriili", "maaji", "juuni", "juuli", "aggusti", "septembari", "oktobari", "novembari", "decembari"]], [["BCE", "CE"], u, u], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH.mm", "HH.mm.ss", "HH.mm.ss z", "HH.mm.ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤#,##0.00;¤-#,##0.00", "#E0"], "DKK", "kr.", "DKK", { "DKK": ["kr.", "kr"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kl.js.mapV֊Yxh/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["kln", [["krn", "koosk"], u, ["karoon", "kooskoliny"]], [["krn", "koosk"], u, u], [["T", "T", "O", "S", "A", "M", "L"], ["Kts", "Kot", "Koo", "Kos", "Koa", "Kom", "Kol"], ["Kotisap", "Kotaai", "Koaeng’", "Kosomok", "Koang’wan", "Komuut", "Kolo"], ["Kts", "Kot", "Koo", "Kos", "Koa", "Kom", "Kol"]], u, [["M", "N", "T", "I", "M", "P", "N", "R", "B", "E", "K", "K"], ["Mul", "Ngat", "Taa", "Iwo", "Mam", "Paa", "Nge", "Roo", "Bur", "Epe", "Kpt", "Kpa"], ["Mulgul", "Ng’atyaato", "Kiptaamo", "Iwootkuut", "Mamuut", "Paagi", "Ng’eiyeet", "Rooptui", "Bureet", "Epeeso", "Kipsuunde ne taai", "Kipsuunde nebo aeng’"]], u, [["AM", "KO"], u, ["Amait kesich Jesu", "Kokakesich Jesu"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Silingitab ya Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kln.js.map3Dx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["km", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["អ", "ច", "អ", "ព", "ព", "ស", "ស"], ["អាទិត្យ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រហ", "សុក្រ", "សៅរ៍"], ["អាទិត្យ", "ច័ន្ទ", "អង្គារ", "ពុធ", "ព្រហស្បតិ៍", "សុក្រ", "សៅរ៍"], ["អា", "ច", "អ", "ពុ", "ព្រ", "សុ", "ស"]], [["អ", "ច", "អ", "ព", "ព", "ស", "ស"], ["អាទិត្យ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រហ", "សុក្រ", "សៅរ៍"], ["អាទិត្យ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រហស្បតិ៍", "សុក្រ", "សៅរ៍"], ["អា", "ច", "អ", "ពុ", "ព្រ", "សុ", "ស"]], [["ម", "ក", "ម", "ម", "ឧ", "ម", "ក", "ស", "ក", "ត", "វ", "ធ"], ["មករា", "កុម្ភៈ", "មីនា", "មេសា", "ឧសភា", "មិថុនា", "កក្កដា", "សីហា", "កញ្ញា", "តុលា", "វិច្ឆិកា", "ធ្នូ"], u], u, [["មុន គ.ស.", "គ.ស."], u, ["មុន​គ្រិស្តសករាជ", "គ្រិស្តសករាជ"]], 0, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} នៅ​ម៉ោង {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "KHR", "៛", "រៀល​កម្ពុជា", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "KHR": ["៛"], "LSL": ["ឡូទី"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=km.js.map4#xJ{"version":3,"file":"km.js","sourceRoot":"","sources":["km.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"km\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"អ\",\"ច\",\"អ\",\"ព\",\"ព\",\"ស\",\"ស\"],[\"អាទិត្យ\",\"ចន្ទ\",\"អង្គារ\",\"ពុធ\",\"ព្រហ\",\"សុក្រ\",\"សៅរ៍\"],[\"អាទិត្យ\",\"ច័ន្ទ\",\"អង្គារ\",\"ពុធ\",\"ព្រហស្បតិ៍\",\"សុក្រ\",\"សៅរ៍\"],[\"អា\",\"ច\",\"អ\",\"ពុ\",\"ព្រ\",\"សុ\",\"ស\"]],[[\"អ\",\"ច\",\"អ\",\"ព\",\"ព\",\"ស\",\"ស\"],[\"អាទិត្យ\",\"ចន្ទ\",\"អង្គារ\",\"ពុធ\",\"ព្រហ\",\"សុក្រ\",\"សៅរ៍\"],[\"អាទិត្យ\",\"ចន្ទ\",\"អង្គារ\",\"ពុធ\",\"ព្រហស្បតិ៍\",\"សុក្រ\",\"សៅរ៍\"],[\"អា\",\"ច\",\"អ\",\"ពុ\",\"ព្រ\",\"សុ\",\"ស\"]],[[\"ម\",\"ក\",\"ម\",\"ម\",\"ឧ\",\"ម\",\"ក\",\"ស\",\"ក\",\"ត\",\"វ\",\"ធ\"],[\"មករា\",\"កុម្ភៈ\",\"មីនា\",\"មេសា\",\"ឧសភា\",\"មិថុនា\",\"កក្កដា\",\"សីហា\",\"កញ្ញា\",\"តុលា\",\"វិច្ឆិកា\",\"ធ្នូ\"],u],u,[[\"មុន គ.ស.\",\"គ.ស.\"],u,[\"មុន​គ្រិស្តសករាជ\",\"គ្រិស្តសករាជ\"]],0,[6,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} នៅ​ម៉ោង {0}\",u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00¤\",\"#E0\"],\"KHR\",\"៛\",\"រៀល​កម្ពុជា\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"KHR\":[\"៛\"],\"LSL\":[\"ឡូទី\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}a)x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    return 5;
}
export default ["kn", [["ಪೂ", "ಅ"], ["ಪೂರ್ವಾಹ್ನ", "ಅಪರಾಹ್ನ"], u], [["ಪೂರ್ವಾಹ್ನ", "ಅಪರಾಹ್ನ"], u, u], [["ಭಾ", "ಸೋ", "ಮಂ", "ಬು", "ಗು", "ಶು", "ಶ"], ["ಭಾನು", "ಸೋಮ", "ಮಂಗಳ", "ಬುಧ", "ಗುರು", "ಶುಕ್ರ", "ಶನಿ"], ["ಭಾನುವಾರ", "ಸೋಮವಾರ", "ಮಂಗಳವಾರ", "ಬುಧವಾರ", "ಗುರುವಾರ", "ಶುಕ್ರವಾರ", "ಶನಿವಾರ"], ["ಭಾನು", "ಸೋಮ", "ಮಂಗಳ", "ಬುಧ", "ಗುರು", "ಶುಕ್ರ", "ಶನಿ"]], u, [["ಜ", "ಫೆ", "ಮಾ", "ಏ", "ಮೇ", "ಜೂ", "ಜು", "ಆ", "ಸೆ", "ಅ", "ನ", "ಡಿ"], ["ಜನವರಿ", "ಫೆಬ್ರವರಿ", "ಮಾರ್ಚ್", "ಏಪ್ರಿ", "ಮೇ", "ಜೂನ್", "ಜುಲೈ", "ಆಗ", "ಸೆಪ್ಟೆಂ", "ಅಕ್ಟೋ", "ನವೆಂ", "ಡಿಸೆಂ"], ["ಜನವರಿ", "ಫೆಬ್ರವರಿ", "ಮಾರ್ಚ್", "ಏಪ್ರಿಲ್", "ಮೇ", "ಜೂನ್", "ಜುಲೈ", "ಆಗಸ್ಟ್", "ಸೆಪ್ಟೆಂಬರ್", "ಅಕ್ಟೋಬರ್", "ನವೆಂಬರ್", "ಡಿಸೆಂಬರ್"]], [["ಜ", "ಫೆ", "ಮಾ", "ಏ", "ಮೇ", "ಜೂ", "ಜು", "ಆ", "ಸೆ", "ಅ", "ನ", "ಡಿ"], ["ಜನ", "ಫೆಬ್ರ", "ಮಾರ್ಚ್", "ಏಪ್ರಿ", "ಮೇ", "ಜೂನ್", "ಜುಲೈ", "ಆಗ", "ಸೆಪ್ಟೆಂ", "ಅಕ್ಟೋ", "ನವೆಂ", "ಡಿಸೆಂ"], ["ಜನವರಿ", "ಫೆಬ್ರವರಿ", "ಮಾರ್ಚ್", "ಏಪ್ರಿಲ್", "ಮೇ", "ಜೂನ್", "ಜುಲೈ", "ಆಗಸ್ಟ್", "ಸೆಪ್ಟೆಂಬರ್", "ಅಕ್ಟೋಬರ್", "ನವೆಂಬರ್", "ಡಿಸೆಂಬರ್"]], [["ಕ್ರಿ.ಪೂ", "ಕ್ರಿ.ಶ"], u, ["ಕ್ರಿಸ್ತ ಪೂರ್ವ", "ಕ್ರಿಸ್ತ ಶಕ"]], 0, [0, 0], ["d/M/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["hh:mm a", "hh:mm:ss a", "hh:mm:ss a z", "hh:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "INR", "₹", "ಭಾರತೀಯ ರೂಪಾಯಿ", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "ಲೀ"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=kn.js.mapTxRx{"version":3,"file":"kn.js","sourceRoot":"","sources":["kn.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val));\n\nif (i === 0 || n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"kn\",[[\"ಪೂ\",\"ಅ\"],[\"ಪೂರ್ವಾಹ್ನ\",\"ಅಪರಾಹ್ನ\"],u],[[\"ಪೂರ್ವಾಹ್ನ\",\"ಅಪರಾಹ್ನ\"],u,u],[[\"ಭಾ\",\"ಸೋ\",\"ಮಂ\",\"ಬು\",\"ಗು\",\"ಶು\",\"ಶ\"],[\"ಭಾನು\",\"ಸೋಮ\",\"ಮಂಗಳ\",\"ಬುಧ\",\"ಗುರು\",\"ಶುಕ್ರ\",\"ಶನಿ\"],[\"ಭಾನುವಾರ\",\"ಸೋಮವಾರ\",\"ಮಂಗಳವಾರ\",\"ಬುಧವಾರ\",\"ಗುರುವಾರ\",\"ಶುಕ್ರವಾರ\",\"ಶನಿವಾರ\"],[\"ಭಾನು\",\"ಸೋಮ\",\"ಮಂಗಳ\",\"ಬುಧ\",\"ಗುರು\",\"ಶುಕ್ರ\",\"ಶನಿ\"]],u,[[\"ಜ\",\"ಫೆ\",\"ಮಾ\",\"ಏ\",\"ಮೇ\",\"ಜೂ\",\"ಜು\",\"ಆ\",\"ಸೆ\",\"ಅ\",\"ನ\",\"ಡಿ\"],[\"ಜನವರಿ\",\"ಫೆಬ್ರವರಿ\",\"ಮಾರ್ಚ್\",\"ಏಪ್ರಿ\",\"ಮೇ\",\"ಜೂನ್\",\"ಜುಲೈ\",\"ಆಗ\",\"ಸೆಪ್ಟೆಂ\",\"ಅಕ್ಟೋ\",\"ನವೆಂ\",\"ಡಿಸೆಂ\"],[\"ಜನವರಿ\",\"ಫೆಬ್ರವರಿ\",\"ಮಾರ್ಚ್\",\"ಏಪ್ರಿಲ್\",\"ಮೇ\",\"ಜೂನ್\",\"ಜುಲೈ\",\"ಆಗಸ್ಟ್\",\"ಸೆಪ್ಟೆಂಬರ್\",\"ಅಕ್ಟೋಬರ್\",\"ನವೆಂಬರ್\",\"ಡಿಸೆಂಬರ್\"]],[[\"ಜ\",\"ಫೆ\",\"ಮಾ\",\"ಏ\",\"ಮೇ\",\"ಜೂ\",\"ಜು\",\"ಆ\",\"ಸೆ\",\"ಅ\",\"ನ\",\"ಡಿ\"],[\"ಜನ\",\"ಫೆಬ್ರ\",\"ಮಾರ್ಚ್\",\"ಏಪ್ರಿ\",\"ಮೇ\",\"ಜೂನ್\",\"ಜುಲೈ\",\"ಆಗ\",\"ಸೆಪ್ಟೆಂ\",\"ಅಕ್ಟೋ\",\"ನವೆಂ\",\"ಡಿಸೆಂ\"],[\"ಜನವರಿ\",\"ಫೆಬ್ರವರಿ\",\"ಮಾರ್ಚ್\",\"ಏಪ್ರಿಲ್\",\"ಮೇ\",\"ಜೂನ್\",\"ಜುಲೈ\",\"ಆಗಸ್ಟ್\",\"ಸೆಪ್ಟೆಂಬರ್\",\"ಅಕ್ಟೋಬರ್\",\"ನವೆಂಬರ್\",\"ಡಿಸೆಂಬರ್\"]],[[\"ಕ್ರಿ.ಪೂ\",\"ಕ್ರಿ.ಶ\"],u,[\"ಕ್ರಿಸ್ತ ಪೂರ್ವ\",\"ಕ್ರಿಸ್ತ ಶಕ\"]],0,[0,0],[\"d/M/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"hh:mm a\",\"hh:mm:ss a\",\"hh:mm:ss a z\",\"hh:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"INR\",\"₹\",\"ಭಾರತೀಯ ರೂಪಾಯಿ\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"ಲೀ\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}>¸Px/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ko-KP", [["AM", "PM"], u, ["오전", "오후"]], u, [["일", "월", "화", "수", "목", "금", "토"], u, ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"], ["일", "월", "화", "수", "목", "금", "토"]], u, [["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"], u, u], u, [["BC", "AD"], u, ["기원전", "서기"]], 1, [6, 0], ["yy. M. d.", "y. M. d.", "y년 M월 d일", "y년 M월 d일 EEEE"], ["a h:mm", "a h:mm:ss", "a h시 m분 s초 z", "a h시 m분 s초 zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KPW", "KPW", "조선 민주주의 인민 공화국 원", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "L"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ko-KP.js.map hNx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ko", [["AM", "PM"], u, ["오전", "오후"]], u, [["일", "월", "화", "수", "목", "금", "토"], u, ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"], ["일", "월", "화", "수", "목", "금", "토"]], u, [["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"], u, u], u, [["BC", "AD"], u, ["기원전", "서기"]], 0, [6, 0], ["yy. M. d.", "y. M. d.", "y년 M월 d일", "y년 M월 d일 EEEE"], ["a h:mm", "a h:mm:ss", "a h시 m분 s초 z", "a h시 m분 s초 zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KRW", "₩", "대한민국 원", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "L"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ko.js.map󥢽xB{"version":3,"file":"lo.js","sourceRoot":"","sources":["lo.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,CAAC,EAAC,CAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,kBAAkB,EAAC,cAAc,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,oBAAoB,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,0BAA0B,EAAC,6BAA6B,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,iBAAiB,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,sBAAsB,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,SAAS,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"lo\",[[\"ກ່ອນທ່ຽງ\",\"ຫຼັງທ່ຽງ\"],u,u],u,[[\"ອາ\",\"ຈ\",\"ອ\",\"ພ\",\"ພຫ\",\"ສຸ\",\"ສ\"],[\"ອາທິດ\",\"ຈັນ\",\"ອັງຄານ\",\"ພຸດ\",\"ພະຫັດ\",\"ສຸກ\",\"ເສົາ\"],[\"ວັນອາທິດ\",\"ວັນຈັນ\",\"ວັນອັງຄານ\",\"ວັນພຸດ\",\"ວັນພະຫັດ\",\"ວັນສຸກ\",\"ວັນເສົາ\"],[\"ອາ.\",\"ຈ.\",\"ອ.\",\"ພ.\",\"ພຫ.\",\"ສຸ.\",\"ສ.\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"ມ.ກ.\",\"ກ.ພ.\",\"ມ.ນ.\",\"ມ.ສ.\",\"ພ.ພ.\",\"ມິ.ຖ.\",\"ກ.ລ.\",\"ສ.ຫ.\",\"ກ.ຍ.\",\"ຕ.ລ.\",\"ພ.ຈ.\",\"ທ.ວ.\"],[\"ມັງກອນ\",\"ກຸມພາ\",\"ມີນາ\",\"ເມສາ\",\"ພຶດສະພາ\",\"ມິຖຸນາ\",\"ກໍລະກົດ\",\"ສິງຫາ\",\"ກັນຍາ\",\"ຕຸລາ\",\"ພະຈິກ\",\"ທັນວາ\"]],u,[[\"ກ່ອນ ຄ.ສ.\",\"ຄ.ສ.\"],u,[\"ກ່ອນຄຣິດສັກກະລາດ\",\"ຄຣິດສັກກະລາດ\"]],0,[6,0],[\"d/M/y\",\"d MMM y\",\"d MMMM y\",\"EEEE ທີ d MMMM G y\"],[\"H:mm\",\"H:mm:ss\",\"H ໂມງ m ນາທີ ss ວິນາທີ z\",\"H ໂມງ m ນາທີ ss ວິນາທີ zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"ບໍ່​ແມ່ນ​ໂຕ​ເລກ\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00;¤-#,##0.00\",\"#\"],\"LAK\",\"₭\",\"ລາວ ກີບ\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"LAK\":[\"₭\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}ƼHKxk"k9ғU0
Udl
0
@KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK@Q#U_
_
_
_
_
_
_KAAK U0
s2

jWAAW,EAAC,UAAU,EAAC,UAAU,EAAC,eAAe,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,cAAc,EAAC,iBAAiB,CAAC,EAAC,CAAC,SAAS0
Pd]WAAW,EAAC,KAAK
QAAQ,E5P((ko\",[[\"AM\",\"PM\"],u,[\"오전\",\"오후\"]],u,[[\"일\",\"월\",\"화\",\"수\",\"목\",\"금\",\"토\"],u,[\"일요일\",\"월요일\",\"화요일\",\"수요일\",\"목요일\",\"금요일\",\"토요일\"],[\"일\",\"월\",\"화\",\"수\",\"목\",\"금\",\"토\"]],u,[[\"1월\",\"2월\",\"3월\",\"4월\",\"5월\",\"6월\",\"7월\",\"8월\",\"9월\",\"10월\",\"11월\",\"12\"],u,u],u,[[\"BC\",\"AD\"],u,[\"기원전\",\"서기\"]],0,[6,0],[\"yy. M. d.\",\"y. M. d.\",\"y년 M월 d일\",\"y년 M월 d일 EEEE\"],[\"a h:mm\",\"a h:mm:ss\",\"a h시 m분 s초 z\",\"a h시 m분 s초 zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\"H2NaN0J\",\"#E0\"],\"KRW\",\"₩\",\"대한민국 원\",{\"AUD\":[\"AU$\",\"$\"],0 PHP\":[u,\"₱\"],\"RON\":[u,\"LxEo_x	1/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["kok", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["आ", "सो", "मं", "बु", "बि", "शु", "शे"], ["आयतार", "सोमार", "मंगळार", "बुधवार", "बिरेस्तार", "शुक्रार", "शेनवार"], u, ["आय", "सोम", "मंगळ", "बुध", "बिरे", "शुक्र", "शेन"]], [["आ", "सो", "मं", "बु", "ब", "शु", "शे"], ["आयतार", "सोमार", "मंगळार", "बुधवार", "बिरेस्तार", "शुक्रार", "शेनवार"], u, ["आय", "सोम", "मंगळ", "बुध", "बिरे", "शुक्र", "शेन"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["जानेवारी", "फेब्रुवारी", "मार्च", "एप्रील", "मे", "जून", "जुलय", "ऑगस्ट", "सप्टेंबर", "ऑक्टोबर", "नोव्हेंबर", "डिसेंबर"], u], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["जाने", "फेब्रु", "मार्च", "एप्री", "मे", "जून", "जुल", "ऑग", "सप्टें", "ऑक्टो", "नो", "डिसे"], ["जानेवारी", "फेब्रुवारी", "मार्च", "एप्रील", "मे", "जून", "जुलय", "ऑगस्ट", "सप्टेंबर", "ऑक्टोबर", "नोव्हेंबर", "डिसेंबर"]], [["क्रिस्तपूर्व", "क्रिस्तशखा"], u, u], 0, [0, 0], ["d-M-yy", "d-MMM-y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "INR", "₹", "भारतीय रुपया", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": ["रॉन", "लेई"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kok.js.map]#xd{"version":3,"file":"kok.js","sourceRoot":"","sources":["kok.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"kok\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"आ\",\"सो\",\"मं\",\"बु\",\"बि\",\"शु\",\"शे\"],[\"आयतार\",\"सोमार\",\"मंगळार\",\"बुधवार\",\"बिरेस्तार\",\"शुक्रार\",\"शेनवार\"],u,[\"आय\",\"सोम\",\"मंगळ\",\"बुध\",\"बिरे\",\"शुक्र\",\"शेन\"]],[[\"आ\",\"सो\",\"मं\",\"बु\",\"ब\",\"शु\",\"शे\"],[\"आयतार\",\"सोमार\",\"मंगळार\",\"बुधवार\",\"बिरेस्तार\",\"शुक्रार\",\"शेनवार\"],u,[\"आय\",\"सोम\",\"मंगळ\",\"बुध\",\"बिरे\",\"शुक्र\",\"शेन\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"जानेवारी\",\"फेब्रुवारी\",\"मार्च\",\"एप्रील\",\"मे\",\"जून\",\"जुलय\",\"ऑगस्ट\",\"सप्टेंबर\",\"ऑक्टोबर\",\"नोव्हेंबर\",\"डिसेंबर\"],u],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"जाने\",\"फेब्रु\",\"मार्च\",\"एप्री\",\"मे\",\"जून\",\"जुल\",\"ऑग\",\"सप्टें\",\"ऑक्टो\",\"नो\",\"डिसे\"],[\"जानेवारी\",\"फेब्रुवारी\",\"मार्च\",\"एप्रील\",\"मे\",\"जून\",\"जुलय\",\"ऑगस्ट\",\"सप्टेंबर\",\"ऑक्टोबर\",\"नोव्हेंबर\",\"डिसेंबर\"]],[[\"क्रिस्तपूर्व\",\"क्रिस्तशखा\"],u,u],0,[0,0],[\"d-M-yy\",\"d-MMM-y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"INR\",\"₹\",\"भारतीय रुपया\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"RON\":[\"रॉन\",\"लेई\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}&0`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ks-Arab", [["AM", "PM"], u, u], u, [["ا", "ژ", "ب", "ب", "ب", "ج", "ب"], ["آتھوار", "ژٔندٕروار", "بۆموار", "بودوار", "برؠسوار", "جُمہ", "بٹوار"], ["اَتھوار", "ژٔندرٕروار", "بۆموار", "بودوار", "برؠسوار", "جُمہ", "بٹوار"], ["آتھوار", "ژٔندٕروار", "بۆموار", "بودوار", "برؠسوار", "جُمہ", "بٹوار"]], u, [["ج", "ف", "م", "ا", "م", "ج", "ج", "ا", "س", "س", "ا", "ن"], ["جنؤری", "فرؤری", "مارٕچ", "اپریل", "مئی", "جوٗن", "جوٗلایی", "اگست", "ستمبر", "اکتوٗبر", "نومبر", "دسمبر"], u], u, [["بی سی", "اے ڈی"], u, ["قبٕل مسیٖح", "عیٖسوی سنہٕ"]], 0, [0, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{0} پٮ۪ٹھۍ {1}", u], [".", "،", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "INR", "₹", "ہِندُستٲنۍ رۄپَے", {}, "rtl", plural];
//# sourceMappingURL=ks-Arab.js.mapr3zUxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ks-Deva", [["AM", "PM"], u, u], u, [["अ", "च", "ब", "ब", "ब", "ज", "ब"], ["आथवार", "चंदिरवार", "बुवार", "बोदवार", "ब्रेसवार", "जुम्मा", "बटवार"], u, u], u, [["ज", "फ़", "म", "अ", "म", "ज", "ज", "अ", "स", "ओ", "न", "द"], ["जनवरी", "फ़रवरी", "मार्च", "अप्रैल", "मे", "जून", "जुलाई", "अगस्त", "सतुंबर", "अकतुम्बर", "नवूमबर", "दसूमबर"], u], u, [["BC", "AD"], u, u], 0, [0, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["a h:mm", "a h:mm:ss", "a h:mm:ss z", "a h:mm:ss zzzz"], ["{1}, {0}", u, "{0} पेठ {1}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "INR", "₹", "इंडियन रूपी", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=ks-Deva.js.mapi"_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ks", [["AM", "PM"], u, u], u, [["ا", "ژ", "ب", "ب", "ب", "ج", "ب"], ["آتھوار", "ژٔندٕروار", "بۆموار", "بودوار", "برؠسوار", "جُمہ", "بٹوار"], ["اَتھوار", "ژٔندرٕروار", "بۆموار", "بودوار", "برؠسوار", "جُمہ", "بٹوار"], ["آتھوار", "ژٔندٕروار", "بۆموار", "بودوار", "برؠسوار", "جُمہ", "بٹوار"]], u, [["ج", "ف", "م", "ا", "م", "ج", "ج", "ا", "س", "س", "ا", "ن"], ["جنؤری", "فرؤری", "مارٕچ", "اپریل", "مئی", "جوٗن", "جوٗلایی", "اگست", "ستمبر", "اکتوٗبر", "نومبر", "دسمبر"], u], u, [["بی سی", "اے ڈی"], u, ["قبٕل مسیٖح", "عیٖسوی سنہٕ"]], 0, [0, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{0} پٮ۪ٹھۍ {1}", u], [".", "،", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "INR", "₹", "ہِندُستٲنۍ رۄپَے", {}, "rtl", plural];
//# sourceMappingURL=ks.js.mapp>wx_{"version":3,"file":"or.js","sourceRoot":"","sources":["or.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,SAAS,CAAC,EAAC,CAAC,WAAW,EAAC,SAAS,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,cAAc,EAAC,aAAa,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,cAAc,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,QAAQ,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"or\",[[\"ପୂ\",\"ଅ\"],[\"AM\",\"PM\"],u],[[\"AM\",\"ଅପରାହ୍ନ\"],[\"ପୂର୍ବାହ୍ନ\",\"ଅପରାହ୍ନ\"],u],[[\"ର\",\"ସୋ\",\"ମ\",\"ବୁ\",\"ଗୁ\",\"ଶୁ\",\"ଶ\"],[\"ରବି\",\"ସୋମ\",\"ମଙ୍ଗଳ\",\"ବୁଧ\",\"ଗୁରୁ\",\"ଶୁକ୍ର\",\"ଶନି\"],[\"ରବିବାର\",\"ସୋମବାର\",\"ମଙ୍ଗଳବାର\",\"ବୁଧବାର\",\"ଗୁରୁବାର\",\"ଶୁକ୍ରବାର\",\"ଶନିବାର\"],[\"ରବି\",\"ସୋମ\",\"ମଙ୍ଗଳ\",\"ବୁଧ\",\"ଗୁରୁ\",\"ଶୁକ୍ର\",\"ଶନି\"]],u,[[\"ଜା\",\"ଫେ\",\"ମା\",\"ଅ\",\"ମଇ\",\"ଜୁ\",\"ଜୁ\",\"ଅ\",\"ସେ\",\"ଅ\",\"ନ\",\"ଡି\"],[\"ଜାନୁଆରୀ\",\"ଫେବୃଆରୀ\",\"ମାର୍ଚ୍ଚ\",\"ଅପ୍ରେଲ\",\"ମଇ\",\"ଜୁନ\",\"ଜୁଲାଇ\",\"ଅଗଷ୍ଟ\",\"ସେପ୍ଟେମ୍ବର\",\"ଅକ୍ଟୋବର\",\"ନଭେମ୍ବର\",\"ଡିସେମ୍ବର\"],u],u,[[\"BC\",\"AD\"],u,[\"ଖ୍ରୀଷ୍ଟପୂର୍ବ\",\"ଖ୍ରୀଷ୍ଟାବ୍ଦ\"]],0,[0,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{0} ଠାରେ {1}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"INR\",\"₹\",\"ଭାରତୀୟ ଟଙ୍କା\",{\"BYN\":[u,\"р.\"],\"PHP\":[u,\"₱\"]},\"ltr\", plural];\n"]}IULmx8ks!ks:`?5eAQAAQMAAM,EAAC,OAAOYAAY,EAAC,QAAQMAAM,EAAC,OAAO
QAAQMAAM,EAAC,OAAO*$eZ

OAAO,EAAC,OAAO,EAAC,OAAO6$SAASJSAAS,EAAC,OAAO,EAAC,OAAO .OAAO,EAAC,OAAO/YAAYzgBAAgBAWAAW=kBAAkB,EAAC,EAAE|ks\",[[\"AM\",\"PM\"],u,u],u,[[\"ا\",\"ژ\",\"ب\",\"ب\",\"ب\",\"ج\",\"ب\"],[\"آتھوار\",\"ژٔندٕروار\",\"بموار\",\"بودوار\",\"برؠسوار\",\"جُمہ\",\"بٹوار\"],[\"اَتھوار\",\"ژٔندرٕروار\",\"بموار\",\"بودوار\",\"برؠسوار\",\"جُمہ\",\"بٹوار\"],[\"آتھوار\",\"ژٔندٕروار\",\"بۆمار\",\"بودوار\",\"برؠسوار\",\"جُمہ\",\"بٹوار\"]],u,[[\"ج\",\"ف\",\"م\",\"ا\",\"م\",\"ج\",\"ج\",\"ا\",\"س\",\"س\",\"ا\",\"ن\"],[\"جنؤری\",\"فرؤری\",\"مارٕچ\",\"اپریل\",\"مئی\",\"جوٗن\",\"جوٗلایی\",\"اگست\",\"ستمبر\",\"اکتوٗبر\",\"نومبر\",\"دسمبر\"],u],u,[[\"بی سی\",\"اے ڈی\"],2u,[\"قبٕل مسیٖح\",\"عیٖسوی سنہٕ!پٮ۪ٹھۍ {1}\",u],[\".\",\"،lN=;ہِندُستٲنۍ رۄپَے\",{},\"rtl\", plural];\n"]}5Vxj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ksb", [["makeo", "nyiaghuo"], u, u], u, [["2", "3", "4", "5", "A", "I", "1"], ["Jpi", "Jtt", "Jmn", "Jtn", "Alh", "Iju", "Jmo"], ["Jumaapii", "Jumaatatu", "Jumaane", "Jumaatano", "Alhamisi", "Ijumaa", "Jumaamosi"], ["Jpi", "Jtt", "Jmn", "Jtn", "Alh", "Iju", "Jmo"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januali", "Febluali", "Machi", "Aplili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KK", "BK"], u, ["Kabla ya Klisto", "Baada ya Klisto"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "TZS", "TSh", "shilingi ya Tanzania", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ksb.js.mapOz`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ksf", [["sárúwá", "cɛɛ́nko"], u, u], u, [["s", "l", "m", "m", "j", "j", "s"], ["sɔ́n", "lǝn", "maa", "mɛk", "jǝǝ", "júm", "sam"], ["sɔ́ndǝ", "lǝndí", "maadí", "mɛkrɛdí", "jǝǝdí", "júmbá", "samdí"], ["sɔ́n", "lǝn", "maa", "mɛk", "jǝǝ", "júm", "sam"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ŋ1", "ŋ2", "ŋ3", "ŋ4", "ŋ5", "ŋ6", "ŋ7", "ŋ8", "ŋ9", "ŋ10", "ŋ11", "ŋ12"], ["ŋwíí a ntɔ́ntɔ", "ŋwíí akǝ bɛ́ɛ", "ŋwíí akǝ ráá", "ŋwíí akǝ nin", "ŋwíí akǝ táan", "ŋwíí akǝ táafɔk", "ŋwíí akǝ táabɛɛ", "ŋwíí akǝ táaraa", "ŋwíí akǝ táanin", "ŋwíí akǝ ntɛk", "ŋwíí akǝ ntɛk di bɔ́k", "ŋwíí akǝ ntɛk di bɛ́ɛ"]], u, [["d.Y.", "k.Y."], u, ["di Yɛ́sus aká yálɛ", "cámɛɛn kǝ kǝbɔpka Y"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "fráŋ", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ksf.js.map
qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ksh", [["v.M.", "n.M."], u, ["Uhr vörmiddaachs", "Uhr nommendaachs"]], [["v.M.", "n.M."], u, ["Vörmeddaach", "Nommendaach"]], [["S", "M", "D", "M", "D", "F", "S"], ["Su.", "Mo.", "Di.", "Me.", "Du.", "Fr.", "Sa."], ["Sunndaach", "Mohndaach", "Dinnsdaach", "Metwoch", "Dunnersdaach", "Friidaach", "Samsdaach"], ["Su", "Mo", "Di", "Me", "Du", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "O", "S", "O", "N", "D"], ["Jan", "Fäb", "Mäz", "Apr", "Mai", "Jun", "Jul", "Ouj", "Säp", "Okt", "Nov", "Dez"], ["Jannewa", "Fäbrowa", "Määz", "Aprell", "Mai", "Juuni", "Juuli", "Oujoß", "Septämber", "Oktohber", "Novämber", "Dezämber"]], [["J", "F", "M", "A", "M", "J", "J", "O", "S", "O", "N", "D"], ["Jan.", "Fäb.", "Mäz.", "Apr.", "Mai", "Jun.", "Jul.", "Ouj.", "Säp.", "Okt.", "Nov.", "Dez."], ["Jannewa", "Fäbrowa", "Määz", "Aprell", "Mai", "Juuni", "Juuli", "Oujoß", "Septämber", "Oktohber", "Novämber", "Dezämber"]], [["vC", "nC"], ["v. Chr.", "n. Chr."], ["vür Krestos", "noh Krestos"]], 1, [6, 0], ["d. M. y", "d. MMM. y", "d. MMMM y", "EEEE, 'dä' d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "×10^", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euro", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ksh.js.mapixk/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ku", [["BN", "PN"], u, u], u, [["Y", "D", "S", "Ç", "P", "Î", "Ş"], ["yş", "dş", "sş", "çş", "pş", "în", "ş"], ["yekşem", "duşem", "sêşem", "çarşem", "pêncşem", "în", "şemî"], ["yş", "dş", "sş", "çş", "pş", "în", "ş"]], u, [["R", "R", "A", "A", "G", "P", "T", "G", "R", "K", "S", "B"], ["rêb", "reş", "ada", "avr", "gul", "pûş", "tîr", "gel", "rez", "kew", "ser", "ber"], ["rêbendanê", "reşemiyê", "adarê", "avrêlê", "gulanê", "pûşperê", "tîrmehê", "gelawêjê", "rezberê", "kewçêrê", "sermawezê", "berfanbarê"]], [["R", "R", "A", "A", "G", "P", "T", "G", "R", "K", "S", "B"], ["rêb", "reş", "ada", "avr", "gul", "pûş", "tîr", "gel", "rez", "kew", "ser", "ber"], ["rêbendan", "reşemî", "adar", "avrêl", "gulan", "pûşper", "tîrmeh", "gelawêj", "rezber", "kewçêr", "sermawez", "berfanbar"]], [["BZ", "PZ"], u, ["berî zayînê", "piştî zayînê"]], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "%#,##0", "#,##0.00 ¤", "#E0"], "TRY", "₺", "TRY", { "JPY": ["JP¥", "¥"], "TRY": ["₺"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ku.js.mapLܳ|x</**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 0)
        return 0;
    if (n === 1)
        return 1;
    if (n % 100 === 2 || (n % 100 === 22 || (n % 100 === 42 || (n % 100 === 62 || n % 100 === 82))) || (n % 1000 === 0 && (n % 100000 === Math.floor(n % 100000) && (n % 100000 >= 1000 && n % 100000 <= 20000 || (n % 100000 === 40000 || (n % 100000 === 60000 || n % 100000 === 80000)))) || !(n === 0) && n % 1000000 === 100000))
        return 2;
    if (n % 100 === 3 || (n % 100 === 23 || (n % 100 === 43 || (n % 100 === 63 || n % 100 === 83))))
        return 3;
    if (!(n === 1) && (n % 100 === 1 || (n % 100 === 21 || (n % 100 === 41 || (n % 100 === 61 || n % 100 === 81)))))
        return 4;
    return 5;
}
export default ["kw", [["a.m.", "p.m."], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Sul", "Lun", "Mth", "Mhr", "Yow", "Gwe", "Sad"], ["dy Sul", "dy Lun", "dy Meurth", "dy Merher", "dy Yow", "dy Gwener", "dy Sadorn"], ["Sul", "Lun", "Mth", "Mhr", "Yow", "Gwe", "Sad"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Gen", "Hwe", "Meu", "Ebr", "Me", "Met", "Gor", "Est", "Gwn", "Hed", "Du", "Kev"], ["mis Genver", "mis Hwevrer", "mis Meurth", "mis Ebrel", "mis Me", "mis Metheven", "mis Gortheren", "mis Est", "mis Gwynngala", "mis Hedra", "mis Du", "mis Kevardhu"]], u, [["RC", "AD"], u, u], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "GBP", "£", "GBP", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=kw.js.map6[Cx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ky", [["тң", "тк"], u, ["таңкы", "түштөн кийинки"]], u, [["Ж", "Д", "Ш", "Ш", "Б", "Ж", "И"], ["жек.", "дүй.", "шейш.", "шарш.", "бейш.", "жума", "ишм."], ["жекшемби", "дүйшөмбү", "шейшемби", "шаршемби", "бейшемби", "жума", "ишемби"], ["жш.", "дш.", "шш.", "шр.", "бш.", "жм.", "иш."]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "фев.", "мар.", "апр.", "май", "июн.", "июл.", "авг.", "сен.", "окт.", "ноя.", "дек."], ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"], ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]], [["б.з.ч.", "б.з."], u, ["биздин заманга чейин", "биздин заман"]], 1, [6, 0], ["d/M/yy", "y-'ж'., d-MMM", "y-'ж'., d-MMMM", "y-'ж'., d-MMMM, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "сан эмес", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "KGS", "сом", "Кыргызстан сому", { "AUD": [u, "$"], "BMD": [u, "BD$"], "BRL": [u, "R$"], "BSD": [u, "B$"], "BYN": [u, "р."], "BZD": [u, "BZ$"], "CAD": [u, "C$"], "DOP": [u, "RD$"], "EGP": [u, "LE"], "GBP": [u, "£"], "HKD": [u, "HK$"], "HRK": [u, "Kn"], "ILS": [u, "₪"], "INR": [u, "₹"], "JMD": [u, "J$"], "JPY": ["JP¥", "¥"], "KGS": ["сом"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "THB": ["฿"], "TTD": [u, "TT$"], "TWD": [u, "NT$"], "USD": [u, "$"], "XCD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=ky.js.map0Nxe{"version":3,"file":"ky.js","sourceRoot":"","sources":["ky.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ky\",[[\"тң\",\"тк\"],u,[\"таңкы\",\"түштөн кийинки\"]],u,[[\"Ж\",\"Д\",\"Ш\",\"Ш\",\"Б\",\"Ж\",\"И\"],[\"жек.\",\"дүй.\",\"шейш.\",\"шарш.\",\"бейш.\",\"жума\",\"ишм.\"],[\"жекшемби\",\"дүйшөмбү\",\"шейшемби\",\"шаршемби\",\"бейшемби\",\"жума\",\"ишемби\"],[\"жш.\",\"дш.\",\"шш.\",\"шр.\",\"бш.\",\"жм.\",\"иш.\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"фев.\",\"мар.\",\"апр.\",\"май\",\"июн.\",\"июл.\",\"авг.\",\"сен.\",\"окт.\",\"ноя.\",\"дек.\"],[\"январь\",\"февраль\",\"март\",\"апрель\",\"май\",\"июнь\",\"июль\",\"август\",\"сентябрь\",\"октябрь\",\"ноябрь\",\"декабрь\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"Янв\",\"Фев\",\"Мар\",\"Апр\",\"Май\",\"Июн\",\"Июл\",\"Авг\",\"Сен\",\"Окт\",\"Ноя\",\"Дек\"],[\"Январь\",\"Февраль\",\"Март\",\"Апрель\",\"Май\",\"Июнь\",\"Июль\",\"Август\",\"Сентябрь\",\"Октябрь\",\"Ноябрь\",\"Декабрь\"]],[[\"б.з.ч.\",\"б.з.\"],u,[\"биздин заманга чейин\",\"биздин заман\"]],1,[6,0],[\"d/M/yy\",\"y-'ж'., d-MMM\",\"y-'ж'., d-MMMM\",\"y-'ж'., d-MMMM, EEEE\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"сан эмес\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"KGS\",\"сом\",\"Кыргызстан сому\",{\"AUD\":[u,\"$\"],\"BMD\":[u,\"BD$\"],\"BRL\":[u,\"R$\"],\"BSD\":[u,\"B$\"],\"BYN\":[u,\"р.\"],\"BZD\":[u,\"BZ$\"],\"CAD\":[u,\"C$\"],\"DOP\":[u,\"RD$\"],\"EGP\":[u,\"LE\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"HK$\"],\"HRK\":[u,\"Kn\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JMD\":[u,\"J$\"],\"JPY\":[\"JP¥\",\"¥\"],\"KGS\":[\"сом\"],\"KRW\":[u,\"₩\"],\"MXN\":[u,\"$\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TTD\":[u,\"TT$\"],\"TWD\":[u,\"NT$\"],\"USD\":[u,\"$\"],\"XCD\":[u,\"$\"]},\"ltr\", plural];\n"]}rhJ(xT-rw!rw:d_A[7BaAAa,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgBZ8qd0IAAI,E4"j(--UAAU,EAAC,aAAaUAAU,QAAQ,E"SAASp$
B__$SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgBPR
7IAAI,EAAC,KAAKO
\
4
7"rw\",[[\"AM\",\"PM\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"cyu.\",\"mbe.\",\"kab.\",\"gtu.\",\"kan.\",\"gnu.\",\"gnd.\"],[\"Ku cyumweru\",\"Kuwa mbere\",\"Kuwa kabiri\",\"Kuwa gatatu\",\"Kuwa kane\",\"Kuwa gatanu\",\"Kuwa gatandatu\"],[\"cyu.\",\"mbe.\",\"kab.\",\"gtu.\",\"kan.\",\"gnu.\",\"gnd.\"]],u,[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"mut.\",\"gas.\",\"wer.\",\"mat.\",\"gic.\",\"kam.\",\"nya.\",\"kan.\",\"nze.\",\"ukw.\",\"ugu.\",\"uku.\"],[\"Mutarama\",\"Gashyantare\",\"Werurwe\",\"Mata\",\"Gicurasi\",\"Kamena\",\"Nyakanga\",\"Kanama\",\"Nzeli\",\"Ukwakira\",\"Ugushyingo\",\"Ukuboza\"]],u,[[\"BCE\",\"CE\"],u,u],1,[6,0],[\"y-MM-dd\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\"HH:mm\",{L.:NaN&0¤ #,##0.00\",\"#E0\"],\"RWF\",\"RF\",\"RWF\",{RWF\":[\"RF\"],\"USD\":[\"US$\"{\`exV/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (n === 0)
        return 0;
    if ((i === 0 || i === 1) && !(n === 0))
        return 1;
    return 5;
}
export default ["lag", [["TOO", "MUU"], u, u], u, [["P", "T", "E", "O", "A", "I", "M"], ["Píili", "Táatu", "Íne", "Táano", "Alh", "Ijm", "Móosi"], ["Jumapíiri", "Jumatátu", "Jumaíne", "Jumatáano", "Alamíisi", "Ijumáa", "Jumamóosi"], ["Píili", "Táatu", "Íne", "Táano", "Alh", "Ijm", "Móosi"]], u, [["F", "N", "K", "I", "I", "I", "M", "V", "S", "I", "S", "S"], ["Fúngatɨ", "Naanɨ", "Keenda", "Ikúmi", "Inyambala", "Idwaata", "Mʉʉnchɨ", "Vɨɨrɨ", "Saatʉ", "Inyi", "Saano", "Sasatʉ"], ["Kʉfúngatɨ", "Kʉnaanɨ", "Kʉkeenda", "Kwiikumi", "Kwiinyambála", "Kwiidwaata", "Kʉmʉʉnchɨ", "Kʉvɨɨrɨ", "Kʉsaatʉ", "Kwiinyi", "Kʉsaano", "Kʉsasatʉ"]], u, [["KSA", "KA"], u, ["Kɨrɨsitʉ sɨ anavyaal", "Kɨrɨsitʉ akavyaalwe"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "TZS", "TSh", "Shilíingi ya Taansanía", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=lag.js.map3zxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["lb", [["mo.", "nomë."], ["moies", "nomëttes"], u], [["moies", "nomëttes"], u, u], [["S", "M", "D", "M", "D", "F", "S"], ["Son.", "Méi.", "Dën.", "Mët.", "Don.", "Fre.", "Sam."], ["Sonndeg", "Méindeg", "Dënschdeg", "Mëttwoch", "Donneschdeg", "Freideg", "Samschdeg"], ["So.", "Mé.", "Dë.", "Më.", "Do.", "Fr.", "Sa."]], [["S", "M", "D", "M", "D", "F", "S"], ["Son", "Méi", "Dën", "Mët", "Don", "Fre", "Sam"], ["Sonndeg", "Méindeg", "Dënschdeg", "Mëttwoch", "Donneschdeg", "Freideg", "Samschdeg"], ["So.", "Mé.", "Dë.", "Më.", "Do.", "Fr.", "Sa."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan.", "Feb.", "Mäe.", "Abr.", "Mee", "Juni", "Juli", "Aug.", "Sep.", "Okt.", "Nov.", "Dez."], ["Januar", "Februar", "Mäerz", "Abrëll", "Mee", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mäe", "Abr", "Mee", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], ["Januar", "Februar", "Mäerz", "Abrëll", "Mee", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]], [["v. Chr.", "n. Chr."], u, u], 1, [6, 0], ["dd.MM.yy", "d. MMM y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euro", { "ATS": ["öS"], "AUD": ["AU$", "$"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=lb.js.map!Wxx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["lg", [["AM", "PM"], u, u], u, [["S", "B", "L", "L", "L", "L", "L"], ["Sab", "Bal", "Lw2", "Lw3", "Lw4", "Lw5", "Lw6"], ["Sabbiiti", "Balaza", "Lwakubiri", "Lwakusatu", "Lwakuna", "Lwakutaano", "Lwamukaaga"], ["Sab", "Bal", "Lw2", "Lw3", "Lw4", "Lw5", "Lw6"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apu", "Maa", "Juu", "Jul", "Agu", "Seb", "Oki", "Nov", "Des"], ["Janwaliyo", "Febwaliyo", "Marisi", "Apuli", "Maayi", "Juuni", "Julaayi", "Agusito", "Sebuttemba", "Okitobba", "Novemba", "Desemba"]], u, [["BC", "AD"], u, ["Kulisito nga tannaza", "Bukya Kulisito Azaal"]], 1, [0, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "UGX", "USh", "Silingi eya Yuganda", { "JPY": ["JP¥", "¥"], "UGX": ["USh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=lg.js.mapq~ZxT/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["lkt", [["AM", "PM"], u, u], u, [["A", "W", "N", "Y", "T", "Z", "O"], ["Aŋpétuwakȟaŋ", "Aŋpétuwaŋži", "Aŋpétunuŋpa", "Aŋpétuyamni", "Aŋpétutopa", "Aŋpétuzaptaŋ", "Owáŋgyužažapi"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Aŋpétuwakȟaŋ", "Aŋpétuwaŋži", "Aŋpétunuŋpa", "Aŋpétuyamni", "Aŋpétutopa", "Aŋpétuzaptaŋ", "Owáŋgyužažapi"], u, u], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Wiótheȟika Wí", "Thiyóȟeyuŋka Wí", "Ištáwičhayazaŋ Wí", "Pȟežítȟo Wí", "Čhaŋwápetȟo Wí", "Wípazukȟa-wašté Wí", "Čhaŋpȟásapa Wí", "Wasútȟuŋ Wí", "Čhaŋwápeǧi Wí", "Čhaŋwápe-kasná Wí", "Waníyetu Wí", "Tȟahékapšuŋ Wí"], u], u, [["BCE", "CE"], u, u], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "USD", "$", "USD", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=lkt.js.mapxn{"version":3,"file":"ln-AO.js","sourceRoot":"","sources":["ln-AO.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,mBAAmB,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,QAAQ,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,eAAe,EAAC,yBAAyB,EAAC,yBAAyB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,YAAY,CAAC,EAAC,CAAC,EAAC,CAAC,oBAAoB,EAAC,oBAAoB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,kBAAkB,EAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === Math.floor(n) && (n >= 0 && n <= 1))\n    return 1;\nreturn 5;\n}\n\nexport default [\"ln-AO\",[[\"ntɔ́ngɔ́\",\"mpókwa\"],u,u],u,[[\"e\",\"y\",\"m\",\"m\",\"m\",\"m\",\"p\"],[\"eye\",\"ybo\",\"mbl\",\"mst\",\"min\",\"mtn\",\"mps\"],[\"eyenga\",\"mokɔlɔ mwa yambo\",\"mokɔlɔ mwa míbalé\",\"mokɔlɔ mwa mísáto\",\"mokɔlɔ ya mínéi\",\"mokɔlɔ ya mítáno\",\"mpɔ́sɔ\"],[\"eye\",\"ybo\",\"mbl\",\"mst\",\"min\",\"mtn\",\"mps\"]],u,[[\"y\",\"f\",\"m\",\"a\",\"m\",\"y\",\"y\",\"a\",\"s\",\"ɔ\",\"n\",\"d\"],[\"yan\",\"fbl\",\"msi\",\"apl\",\"mai\",\"yun\",\"yul\",\"agt\",\"stb\",\"ɔtb\",\"nvb\",\"dsb\"],[\"sánzá ya yambo\",\"sánzá ya míbalé\",\"sánzá ya mísáto\",\"sánzá ya mínei\",\"sánzá ya mítáno\",\"sánzá ya motóbá\",\"sánzá ya nsambo\",\"sánzá ya mwambe\",\"sánzá ya libwa\",\"sánzá ya zómi\",\"sánzá ya zómi na mɔ̌kɔ́\",\"sánzá ya zómi na míbalé\"]],u,[[\"libóso ya\",\"nsima ya Y\"],u,[\"Yambo ya Yézu Krís\",\"Nsima ya Yézu Krís\"]],1,[6,0],[\"d/M/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"AOA\",\"Kz\",\"Kwanza ya Angóla\",{\"AOA\":[\"Kz\"],\"CDF\":[\"FC\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}BHhxv/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["ln-CG", [["ntɔ́ngɔ́", "mpókwa"], u, u], u, [["e", "y", "m", "m", "m", "m", "p"], ["eye", "ybo", "mbl", "mst", "min", "mtn", "mps"], ["eyenga", "mokɔlɔ mwa yambo", "mokɔlɔ mwa míbalé", "mokɔlɔ mwa mísáto", "mokɔlɔ ya mínéi", "mokɔlɔ ya mítáno", "mpɔ́sɔ"], ["eye", "ybo", "mbl", "mst", "min", "mtn", "mps"]], u, [["y", "f", "m", "a", "m", "y", "y", "a", "s", "ɔ", "n", "d"], ["yan", "fbl", "msi", "apl", "mai", "yun", "yul", "agt", "stb", "ɔtb", "nvb", "dsb"], ["sánzá ya yambo", "sánzá ya míbalé", "sánzá ya mísáto", "sánzá ya mínei", "sánzá ya mítáno", "sánzá ya motóbá", "sánzá ya nsambo", "sánzá ya mwambe", "sánzá ya libwa", "sánzá ya zómi", "sánzá ya zómi na mɔ̌kɔ́", "sánzá ya zómi na míbalé"]], u, [["libóso ya", "nsima ya Y"], u, ["Yambo ya Yézu Krís", "Nsima ya Yézu Krís"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "Falánga CFA BEAC", { "CDF": ["FC"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ln-CG.js.mapq_Vhx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["ln", [["ntɔ́ngɔ́", "mpókwa"], u, u], u, [["e", "y", "m", "m", "m", "m", "p"], ["eye", "ybo", "mbl", "mst", "min", "mtn", "mps"], ["eyenga", "mokɔlɔ mwa yambo", "mokɔlɔ mwa míbalé", "mokɔlɔ mwa mísáto", "mokɔlɔ ya mínéi", "mokɔlɔ ya mítáno", "mpɔ́sɔ"], ["eye", "ybo", "mbl", "mst", "min", "mtn", "mps"]], u, [["y", "f", "m", "a", "m", "y", "y", "a", "s", "ɔ", "n", "d"], ["yan", "fbl", "msi", "apl", "mai", "yun", "yul", "agt", "stb", "ɔtb", "nvb", "dsb"], ["sánzá ya yambo", "sánzá ya míbalé", "sánzá ya mísáto", "sánzá ya mínei", "sánzá ya mítáno", "sánzá ya motóbá", "sánzá ya nsambo", "sánzá ya mwambe", "sánzá ya libwa", "sánzá ya zómi", "sánzá ya zómi na mɔ̌kɔ́", "sánzá ya zómi na míbalé"]], u, [["libóso ya", "nsima ya Y"], u, ["Yambo ya Yézu Krís", "Nsima ya Yézu Krís"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "CDF", "FC", "Falánga ya Kongó", { "CDF": ["FC"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ln.js.mapYx7{"version":3,"file":"ln.js","sourceRoot":"","sources":["ln.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,mBAAmB,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,QAAQ,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,eAAe,EAAC,yBAAyB,EAAC,yBAAyB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,YAAY,CAAC,EAAC,CAAC,EAAC,CAAC,oBAAoB,EAAC,oBAAoB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,eAAe,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,kBAAkB,EAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === Math.floor(n) && (n >= 0 && n <= 1))\n    return 1;\nreturn 5;\n}\n\nexport default [\"ln\",[[\"ntɔ́ngɔ́\",\"mpókwa\"],u,u],u,[[\"e\",\"y\",\"m\",\"m\",\"m\",\"m\",\"p\"],[\"eye\",\"ybo\",\"mbl\",\"mst\",\"min\",\"mtn\",\"mps\"],[\"eyenga\",\"mokɔlɔ mwa yambo\",\"mokɔlɔ mwa míbalé\",\"mokɔlɔ mwa mísáto\",\"mokɔlɔ ya mínéi\",\"mokɔlɔ ya mítáno\",\"mpɔ́sɔ\"],[\"eye\",\"ybo\",\"mbl\",\"mst\",\"min\",\"mtn\",\"mps\"]],u,[[\"y\",\"f\",\"m\",\"a\",\"m\",\"y\",\"y\",\"a\",\"s\",\"ɔ\",\"n\",\"d\"],[\"yan\",\"fbl\",\"msi\",\"apl\",\"mai\",\"yun\",\"yul\",\"agt\",\"stb\",\"ɔtb\",\"nvb\",\"dsb\"],[\"sánzá ya yambo\",\"sánzá ya míbalé\",\"sánzá ya mísáto\",\"sánzá ya mínei\",\"sánzá ya mítáno\",\"sánzá ya motóbá\",\"sánzá ya nsambo\",\"sánzá ya mwambe\",\"sánzá ya libwa\",\"sánzá ya zómi\",\"sánzá ya zómi na mɔ̌kɔ́\",\"sánzá ya zómi na míbalé\"]],u,[[\"libóso ya\",\"nsima ya Y\"],u,[\"Yambo ya Yézu Krís\",\"Nsima ya Yézu Krís\"]],1,[6,0],[\"d/M/y\",\"d MMM y\",\"d MMMM y\",\"EEEE d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"CDF\",\"FC\",\"Falánga ya Kongó\",{\"CDF\":[\"FC\"],\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}P\;x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["lo", [["ກ່ອນທ່ຽງ", "ຫຼັງທ່ຽງ"], u, u], u, [["ອາ", "ຈ", "ອ", "ພ", "ພຫ", "ສຸ", "ສ"], ["ອາທິດ", "ຈັນ", "ອັງຄານ", "ພຸດ", "ພະຫັດ", "ສຸກ", "ເສົາ"], ["ວັນອາທິດ", "ວັນຈັນ", "ວັນອັງຄານ", "ວັນພຸດ", "ວັນພະຫັດ", "ວັນສຸກ", "ວັນເສົາ"], ["ອາ.", "ຈ.", "ອ.", "ພ.", "ພຫ.", "ສຸ.", "ສ."]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ມ.ກ.", "ກ.ພ.", "ມ.ນ.", "ມ.ສ.", "ພ.ພ.", "ມິ.ຖ.", "ກ.ລ.", "ສ.ຫ.", "ກ.ຍ.", "ຕ.ລ.", "ພ.ຈ.", "ທ.ວ."], ["ມັງກອນ", "ກຸມພາ", "ມີນາ", "ເມສາ", "ພຶດສະພາ", "ມິຖຸນາ", "ກໍລະກົດ", "ສິງຫາ", "ກັນຍາ", "ຕຸລາ", "ພະຈິກ", "ທັນວາ"]], u, [["ກ່ອນ ຄ.ສ.", "ຄ.ສ."], u, ["ກ່ອນຄຣິດສັກກະລາດ", "ຄຣິດສັກກະລາດ"]], 0, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE ທີ d MMMM G y"], ["H:mm", "H:mm:ss", "H ໂມງ m ນາທີ ss ວິນາທີ z", "H ໂມງ m ນາທີ ss ວິນາທີ zzzz"], ["{1}, {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "ບໍ່​ແມ່ນ​ໂຕ​ເລກ", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00;¤-#,##0.00", "#"], "LAK", "₭", "ລາວ ກີບ", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "LAK": ["₭"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=lo.js.map:eHxw/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["lrc-IQ", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["جانڤیە", "فئڤریە", "مارس", "آڤریل", "مئی", "جوٙأن", "جوٙلا", "آگوست", "سئپتامر", "ئوکتوڤر", "نوڤامر", "دئسامر"], u], u, [["BCE", "CE"], u, u], 6, [5, 6], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "IQD", "د.ع.‏", "IQD", { "IQD": ["د.ع.‏"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=lrc-IQ.js.mapqJGxx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["lrc", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["جانڤیە", "فئڤریە", "مارس", "آڤریل", "مئی", "جوٙأن", "جوٙلا", "آگوست", "سئپتامر", "ئوکتوڤر", "نوڤامر", "دئسامر"], u], u, [["BCE", "CE"], u, u], 6, [5, 5], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "IRR", "IRR", "IRR", { "IQD": ["د.ع.‏"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=lrc.js.map
ix|	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (n % 10 === 1 && !(n % 100 >= 11 && n % 100 <= 19))
        return 1;
    if (n % 10 === Math.floor(n % 10) && (n % 10 >= 2 && n % 10 <= 9) && !(n % 100 >= 11 && n % 100 <= 19))
        return 3;
    if (!(f === 0))
        return 4;
    return 5;
}
export default ["lt", [["pr. p.", "pop."], ["priešpiet", "popiet"], u], u, [["S", "P", "A", "T", "K", "P", "Š"], ["sk", "pr", "an", "tr", "kt", "pn", "št"], ["sekmadienis", "pirmadienis", "antradienis", "trečiadienis", "ketvirtadienis", "penktadienis", "šeštadienis"], ["Sk", "Pr", "An", "Tr", "Kt", "Pn", "Št"]], u, [["S", "V", "K", "B", "G", "B", "L", "R", "R", "S", "L", "G"], ["saus.", "vas.", "kov.", "bal.", "geg.", "birž.", "liep.", "rugp.", "rugs.", "spal.", "lapkr.", "gruod."], ["sausio", "vasario", "kovo", "balandžio", "gegužės", "birželio", "liepos", "rugpjūčio", "rugsėjo", "spalio", "lapkričio", "gruodžio"]], [["S", "V", "K", "B", "G", "B", "L", "R", "R", "S", "L", "G"], ["saus.", "vas.", "kov.", "bal.", "geg.", "birž.", "liep.", "rugp.", "rugs.", "spal.", "lapkr.", "gruod."], ["sausis", "vasaris", "kovas", "balandis", "gegužė", "birželis", "liepa", "rugpjūtis", "rugsėjis", "spalis", "lapkritis", "gruodis"]], [["pr. Kr.", "po Kr."], u, ["prieš Kristų", "po Kristaus"]], 1, [6, 0], ["y-MM-dd", u, "y 'm'. MMMM d 'd'.", "y 'm'. MMMM d 'd'., EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "×10^", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euras", { "AUD": [u, "$"], "BDT": [], "BRL": [u, "R$"], "BYN": [u, "Br"], "CAD": [u, "$"], "CNY": [u, "¥"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [], "INR": [], "JPY": [u, "¥"], "KHR": [], "KRW": [u, "₩"], "LAK": [], "MNT": [], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "PLN": [u, "zl"], "PYG": [u, "Gs"], "RUB": [u, "rb"], "TWD": [u, "$"], "USD": [u, "$"], "VND": [], "XAF": [], "XCD": [u, "$"], "XOF": [], "XPF": [] }, "ltr", plural];
//# sourceMappingURL=lt.js.map
x3d#nds", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["M01", "M02", "M03", "M04", "M05", "M06", "M07", "M08", "7M09", "M10", "M11", "M12"], u], u, [["BCE", "CE"], u, um "y MMM d", "y MMMM d", "y MMMM dX.", ",", ";", "%", "+", "-", "E18%", "¤ #,##0.00|0UR", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"I	*
nds.js.map|lIVxo/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["lu", [["Dinda", "Dilolo"], u, u], u, [["L", "N", "N", "N", "N", "N", "L"], ["Lum", "Nko", "Ndy", "Ndg", "Njw", "Ngv", "Lub"], ["Lumingu", "Nkodya", "Ndàayà", "Ndangù", "Njòwa", "Ngòvya", "Lubingu"], ["Lum", "Nko", "Ndy", "Ndg", "Njw", "Ngv", "Lub"]], u, [["C", "L", "L", "M", "L", "L", "K", "L", "L", "L", "K", "C"], ["Cio", "Lui", "Lus", "Muu", "Lum", "Luf", "Kab", "Lush", "Lut", "Lun", "Kas", "Cis"], ["Ciongo", "Lùishi", "Lusòlo", "Mùuyà", "Lumùngùlù", "Lufuimi", "Kabàlàshìpù", "Lùshìkà", "Lutongolo", "Lungùdi", "Kaswèkèsè", "Ciswà"]], u, [["kmp. Y.K.", "kny. Y. K."], u, ["Kumpala kwa Yezu Kli", "Kunyima kwa Yezu Kli"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "CDF", "FC", "Nfalanga wa Kongu", { "CDF": ["FC"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=lu.js.mapDƿZxP/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["luo", [["OD", "OT"], u, u], u, [["J", "W", "T", "T", "T", "T", "N"], ["JMP", "WUT", "TAR", "TAD", "TAN", "TAB", "NGS"], ["Jumapil", "Wuok Tich", "Tich Ariyo", "Tich Adek", "Tich Ang’wen", "Tich Abich", "Ngeso"], ["JMP", "WUT", "TAR", "TAD", "TAN", "TAB", "NGS"]], u, [["C", "R", "D", "N", "B", "U", "B", "B", "C", "P", "C", "P"], ["DAC", "DAR", "DAD", "DAN", "DAH", "DAU", "DAO", "DAB", "DOC", "DAP", "DGI", "DAG"], ["Dwe mar Achiel", "Dwe mar Ariyo", "Dwe mar Adek", "Dwe mar Ang’wen", "Dwe mar Abich", "Dwe mar Auchiel", "Dwe mar Abiriyo", "Dwe mar Aboro", "Dwe mar Ochiko", "Dwe mar Apar", "Dwe mar gi achiel", "Dwe mar Apar gi ariyo"]], u, [["BC", "AD"], u, ["Kapok Kristo obiro", "Ka Kristo osebiro"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "KES", "Ksh", "Siling mar Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=luo.js.map9ٶx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (n % 10 === 0 || (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 19) || v === 2 && (f % 100 === Math.floor(f % 100) && (f % 100 >= 11 && f % 100 <= 19))))
        return 0;
    if (n % 10 === 1 && !(n % 100 === 11) || (v === 2 && (f % 10 === 1 && !(f % 100 === 11)) || !(v === 2) && f % 10 === 1))
        return 1;
    return 5;
}
export default ["lv", [["priekšp.", "pēcp."], u, ["priekšpusdienā", "pēcpusdienā"]], [["priekšp.", "pēcpusd."], u, ["priekšpusdiena", "pēcpusdiena"]], [["S", "P", "O", "T", "C", "P", "S"], ["svētd.", "pirmd.", "otrd.", "trešd.", "ceturtd.", "piektd.", "sestd."], ["svētdiena", "pirmdiena", "otrdiena", "trešdiena", "ceturtdiena", "piektdiena", "sestdiena"], ["Sv", "Pr", "Ot", "Tr", "Ce", "Pk", "Se"]], [["S", "P", "O", "T", "C", "P", "S"], ["Svētd.", "Pirmd.", "Otrd.", "Trešd.", "Ceturtd.", "Piektd.", "Sestd."], ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena"], ["Sv", "Pr", "Ot", "Tr", "Ce", "Pk", "Se"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["janv.", "febr.", "marts", "apr.", "maijs", "jūn.", "jūl.", "aug.", "sept.", "okt.", "nov.", "dec."], ["janvāris", "februāris", "marts", "aprīlis", "maijs", "jūnijs", "jūlijs", "augusts", "septembris", "oktobris", "novembris", "decembris"]], u, [["p.m.ē.", "m.ē."], u, ["pirms mūsu ēras", "mūsu ērā"]], 1, [6, 0], ["dd.MM.yy", "y. 'gada' d. MMM", "y. 'gada' d. MMMM", "EEEE, y. 'gada' d. MMMM"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NS", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "eiro", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "GHS": [], "LVL": ["Ls"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=lv.js.map؟wxN{"version":3,"file":"ru.js","sourceRoot":"","sources":["ru.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))\n    return 3;\nif (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ru\",[[\"AM\",\"PM\"],u,u],u,[[\"В\",\"П\",\"В\",\"С\",\"Ч\",\"П\",\"С\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],[\"воскресенье\",\"понедельник\",\"вторник\",\"среда\",\"четверг\",\"пятница\",\"суббота\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"мар.\",\"апр.\",\"мая\",\"июн.\",\"июл.\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"января\",\"февраля\",\"марта\",\"апреля\",\"мая\",\"июня\",\"июля\",\"августа\",\"сентября\",\"октября\",\"ноября\",\"декабря\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"март\",\"апр.\",\"май\",\"июнь\",\"июль\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"январь\",\"февраль\",\"март\",\"апрель\",\"май\",\"июнь\",\"июль\",\"август\",\"сентябрь\",\"октябрь\",\"ноябрь\",\"декабрь\"]],[[\"до н.э.\",\"н.э.\"],[\"до н. э.\",\"н. э.\"],[\"до Рождества Христова\",\"от Рождества Христова\"]],1,[6,0],[\"dd.MM.y\",\"d MMM y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"не число\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"RUB\",\"₽\",\"российский рубль\",{\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUB\":[\"₽\"],\"RUR\":[\"р.\"],\"THB\":[\"฿\"],\"TMT\":[\"ТМТ\"],\"TWD\":[\"NT$\"],\"UAH\":[\"₴\"],\"XXX\":[\"XXXX\"]},\"ltr\", plural];\n"]}Á\x	M0+lv!lv:AEAAE,CAAC,GAAG,QAAQ,CAAC8#EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAElI.
s>zK#%7 "f
CAAC;QACnH~Qz

	
gBAAgB,EAAC,aAAaz

UAAUgBAAgB,EAAC,aAAaUm
QAAQ{M	6WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,aAAa,EAAC,YAAY,EAAC,WAAWeUm
QAAQ{M	6WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,aAAa,EAAC,YAAY,EAAC,WAAWeF2OAAO,EAAC,OAAOO,E,	WAAW6QAAQ,EAAC,SAAS,EAAC,YAAY,EAAC,UAAU,EAAC,WAAW,EAAC,WAAW$QAAQ	
iBAAiB,EAAC,UAAU$

z

kBAAkB,EAAC,mBAAmB,EAAC,yBAAy7
CSAAS	
dIAAI.
QAAQ<3MAAM,EqEAAEM(/3, f = parseInt((%, 10) || 0;\n\nif (n % 10 === 0 || (n=n % 100) && (n % 100 >= 11 && n % 100 <= 19) || v === 2 && (ff % 100) && (f % 100 >= 11 && f % 100 <= 19))))\n    return 0;\nif (n % 10 === 1 && !(n % 100 === 11) || (v === 2 && (f % 10 ==G= 1 && !(f % 100 === 11)) || !(v === 2) && f % 10 === 1))\n    return 1a%lv\",[[\"priekšp.\",\"pēcp.\"],u,[\"priekšpusdienā\",\"pēcpusdienā\"]],[[\"priekšp.\",\"pēcpusd.\"],u,[\"priekšpusdiena\",\"pēcpusdiena\"]],[[\"S\",\"P\",\"O\",\"T\",\"C\",\"P\",\"S\"],[\"svētd.\",\"pirmd.\",\"otrd.\",\"trešd.\",\"ceturtd.\",\"piektd.\",\"sestd.\"],[\"svētdiena\",\"pirmdiena\",\"otrdiena\",\"trešdiena\",\"ceturtdiena\",\"piektdiena\",\"sestdiena\"],[\"Sv\",\"Pr\",\"Ot\",\"Tr\",\"Ce\",\"Pk\",\"Se\"]],[[\"S\",\"P\",\"O\",\"T\",\"C\",\"P\",\"S\"],[\"Svētd.\",\"Pirmd.\",\"Otrd.\",\"Trešd.\",\"Ceturtd.\",\"Piektd.\",\"Sestd.\"],[\"Svētdiena\",\"Pirmdiena\",\"Otrdiena\",\"Trešdiena\",\"Ceturtdiena\",\"Piektdiena\",\"Sestdiena\"],[\"Sv\",\"Pr\",\"Ot\",\"Tr\",\"Ce\",\"Pk\",\"Se\"]],[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"janv.\",\"febr.\",\"marts\",\"apr.\",\"maijs\",\"jūn.\",\"jūl.\",\"aug.\",\"sept.\",\"okt.\",\"nov.\",\"dec.\"],[\"janvāris\",\"februāris\",\"marts\",\"aprīlis\",\"maijs\",\"jūnijs\",\"jūlijs\",\"augusts\",\"septembris\",\"oktobris\",\"novembris\",\"decembris\"]],u,[[\"p.m.ē.\",\"m.ē.\"],u,[\"pirms mūsu ēras\",\"mūsu ērā\"]],1,[6,0T],[\"dd.MM.yy\",\"y. 'gada' d. MMM\",\"y. 'gada' d. MMMM\",\"EEEE, y. 'gada' d. MMMMJDS"NS\",\":\"],[\"#,##0.###\",\"#,##0 \EUR\",\"€\",\"eiro\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"GHS\":[],\"LVL\":[\"Ls9THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}b+Cx>0tt!tt:	CAAC;IAEdӓ
'E,
	\

OAAO	
'E,
d~
	dSAAS	QAAQ,EAAC,QAAQoBAAoB,EAAC,QAAQ$

&SAAS,EAAC,eAAe,EAAC,gBAAgB,EAAC,sBAAsBSAAS,EAAC,WAAW,EAAC,cAAcj
KAAK.AaAAa,Eq ;\nb$tt \",\"Д\",\"С\",\"Ч\",\"П\",\"Җ\",\"Ш\"],[\"якш.\",\"дүш.\",\"сиш.\",\"чәр.\",\"пәнҗ.\",\"җом.\",\"шм.\"],[\"якшәмбе\",\"дүшәмбе\",\"сишәмбе\",\"чәршәмбе\",\"пәнҗешәмбе\",\"җомга\",\"шимбә\"],[\"якш.\",\"дүш.\",\"сиш.\",\"чәр.\",\"пәнҗ.\",\"җом.\",\"шим.\"]],u,[[\"1\",\"2\",\"3\",Q\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"гыйн.\",\"фев]"9cгыйнвар\u,[[\"б.э.к.\",\"милади\"],u,[\"безнең эрага кадәр\",\"милади!d, y 'ел'\",\"d MMMM, y 'ел'\",\"d MMMM, y 'ел', EEEE\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss z\",\"xjNaNR/Россия сумы\",{\"JPY\":[\"JP¥\",\"¥},\"ltr\", plural];\n"]}8jE`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["mas-TZ", [["Ɛnkakɛnyá", "Ɛndámâ"], u, u], u, [["2", "3", "4", "5", "6", "7", "1"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"], ["Jumapílí", "Jumatátu", "Jumane", "Jumatánɔ", "Alaámisi", "Jumáa", "Jumamósi"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Dal", "Ará", "Ɔɛn", "Doy", "Lép", "Rok", "Sás", "Bɔ́r", "Kús", "Gís", "Shʉ́", "Ntʉ́"], ["Oladalʉ́", "Arát", "Ɔɛnɨ́ɔɨŋɔk", "Olodoyíóríê inkókúâ", "Oloilépūnyīē inkókúâ", "Kújúɔrɔk", "Mórusásin", "Ɔlɔ́ɨ́bɔ́rárɛ", "Kúshîn", "Olgísan", "Pʉshʉ́ka", "Ntʉ́ŋʉ́s"]], u, [["MY", "EY"], u, ["Meínō Yɛ́sʉ", "Eínō Yɛ́sʉ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "TZS", "TSh", "Iropiyianí e Tanzania", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mas-TZ.js.map^猻^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["mas", [["Ɛnkakɛnyá", "Ɛndámâ"], u, u], u, [["2", "3", "4", "5", "6", "7", "1"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"], ["Jumapílí", "Jumatátu", "Jumane", "Jumatánɔ", "Alaámisi", "Jumáa", "Jumamósi"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Dal", "Ará", "Ɔɛn", "Doy", "Lép", "Rok", "Sás", "Bɔ́r", "Kús", "Gís", "Shʉ́", "Ntʉ́"], ["Oladalʉ́", "Arát", "Ɔɛnɨ́ɔɨŋɔk", "Olodoyíóríê inkókúâ", "Oloilépūnyīē inkókúâ", "Kújúɔrɔk", "Mórusásin", "Ɔlɔ́ɨ́bɔ́rárɛ", "Kúshîn", "Olgísan", "Pʉshʉ́ka", "Ntʉ́ŋʉ́s"]], u, [["MY", "EY"], u, ["Meínō Yɛ́sʉ", "Eínō Yɛ́sʉ"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Iropiyianí e Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mas.js.mapQx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mfe", [["AM", "PM"], u, u], u, [["d", "l", "m", "m", "z", "v", "s"], ["dim", "lin", "mar", "mer", "ze", "van", "sam"], ["dimans", "lindi", "mardi", "merkredi", "zedi", "vandredi", "samdi"], ["dim", "lin", "mar", "mer", "ze", "van", "sam"]], u, [["z", "f", "m", "a", "m", "z", "z", "o", "s", "o", "n", "d"], ["zan", "fev", "mar", "avr", "me", "zin", "zil", "out", "sep", "okt", "nov", "des"], ["zanvie", "fevriye", "mars", "avril", "me", "zin", "zilye", "out", "septam", "oktob", "novam", "desam"]], u, [["av. Z-K", "ap. Z-K"], u, ["avan Zezi-Krist", "apre Zezi-Krist"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MUR", "Rs", "roupi morisien", { "JPY": ["JP¥", "¥"], "MUR": ["Rs"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mfe.js.maplHWx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["mg", [["AM", "PM"], u, u], u, [["A", "A", "T", "A", "A", "Z", "A"], ["Alah", "Alats", "Tal", "Alar", "Alak", "Zom", "Asab"], ["Alahady", "Alatsinainy", "Talata", "Alarobia", "Alakamisy", "Zoma", "Asabotsy"], ["Alah", "Alats", "Tal", "Alar", "Alak", "Zom", "Asab"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "Mey", "Jon", "Jol", "Aog", "Sep", "Okt", "Nov", "Des"], ["Janoary", "Febroary", "Martsa", "Aprily", "Mey", "Jona", "Jolay", "Aogositra", "Septambra", "Oktobra", "Novambra", "Desambra"]], u, [["BC", "AD"], u, ["Alohan’i JK", "Aorian’i JK"]], 1, [6, 0], ["y-MM-dd", "y MMM d", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MGA", "Ar", "Ariary", { "JPY": ["JP¥", "¥"], "MGA": ["Ar"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mg.js.map[xH/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mgh", [["wichishu", "mchochil’l"], u, u], u, [["S", "J", "J", "J", "A", "I", "J"], ["Sab", "Jtt", "Jnn", "Jtn", "Ara", "Iju", "Jmo"], ["Sabato", "Jumatatu", "Jumanne", "Jumatano", "Arahamisi", "Ijumaa", "Jumamosi"], ["Sab", "Jtt", "Jnn", "Jtn", "Ara", "Iju", "Jmo"]], u, [["K", "U", "R", "C", "T", "M", "S", "N", "T", "K", "M", "Y"], ["Kwa", "Una", "Rar", "Che", "Tha", "Moc", "Sab", "Nan", "Tis", "Kum", "Moj", "Yel"], ["Mweri wo kwanza", "Mweri wo unayeli", "Mweri wo uneraru", "Mweri wo unecheshe", "Mweri wo unethanu", "Mweri wo thanu na mocha", "Mweri wo saba", "Mweri wo nane", "Mweri wo tisa", "Mweri wo kumi", "Mweri wo kumi na moja", "Mweri wo kumi na yel’li"]], u, [["HY", "YY"], u, ["Hinapiya yesu", "Yopia yesu"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MZN", "MTn", "MZN", { "JPY": ["JP¥", "¥"], "MZN": ["MTn"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mgh.js.mapmpư[xO/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["mgo", [["AM", "PM"], u, u], u, [["A1", "A2", "A3", "A4", "A5", "A6", "A7"], ["Aneg 1", "Aneg 2", "Aneg 3", "Aneg 4", "Aneg 5", "Aneg 6", "Aneg 7"], u, ["1", "2", "3", "4", "5", "6", "7"]], u, [["M1", "A2", "M3", "N4", "F5", "I6", "A7", "I8", "K9", "10", "11", "12"], ["mbegtug", "imeg àbùbì", "imeg mbəŋchubi", "iməg ngwə̀t", "iməg fog", "iməg ichiibɔd", "iməg àdùmbə̀ŋ", "iməg ichika", "iməg kud", "iməg tèsiʼe", "iməg zò", "iməg krizmed"], ["iməg mbegtug", "imeg àbùbì", "imeg mbəŋchubi", "iməg ngwə̀t", "iməg fog", "iməg ichiibɔd", "iməg àdùmbə̀ŋ", "iməg ichika", "iməg kud", "iməg tèsiʼe", "iməg zò", "iməg krizmed"]], u, [["BCE", "CE"], u, u], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "EEEE, y MMMM dd"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XAF", "FCFA", "shirè", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mgo.js.map_ySx=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mi", [["AM", "PM"], u, u], u, [["T", "H", "T", "A", "P", "M", "H"], ["Tap", "Hin", "Tū", "Apa", "Par", "Mer", "Hor"], ["Rātapu", "Rāhina", "Rātū", "Rāapa", "Rāpare", "Rāmere", "Rāhoroi"], ["Tap", "Hin", "Tū", "Apa", "Par", "Mer", "Hor"]], u, [["K", "H", "P", "P", "H", "P", "H", "H", "M", "N", "R", "H"], ["Kohi", "Hui", "Pou", "Pae", "Hara", "Pipi", "Hōngo", "Here", "Mahu", "Nuku", "Rangi", "Haki"], ["Kohitātea", "Huitanguru", "Poutūterangi", "Paengawhāwhā", "Haratua", "Pipiri", "Hōngongoi", "Hereturikōkā", "Mahuru", "Whiringa-ā-nuku", "Whiringa-ā-rangi", "Hakihea"]], u, [["BCE", "CE"], u, u], 1, [6, 0], ["dd-MM-y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "NZD", "$", "Tāra o Aotearoa", { "NZD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mi.js.mapQj~x}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    return 5;
}
export default ["mk", [["претпл.", "попл."], u, ["претпладне", "попладне"]], u, [["н", "п", "в", "с", "ч", "п", "с"], ["нед.", "пон.", "вто.", "сре.", "чет.", "пет.", "саб."], ["недела", "понеделник", "вторник", "среда", "четврток", "петок", "сабота"], ["нед.", "пон.", "вто.", "сре.", "чет.", "пет.", "саб."]], u, [["ј", "ф", "м", "а", "м", "ј", "ј", "а", "с", "о", "н", "д"], ["јан.", "фев.", "мар.", "апр.", "мај", "јун.", "јул.", "авг.", "септ.", "окт.", "ноем.", "дек."], ["јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"]], u, [["п.н.е.", "н.е."], u, ["пред нашата ера", "од нашата ера"]], 1, [6, 0], ["d.M.yy", "d.M.y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, 'во' {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "MKD", "ден.", "Македонски денар", { "AUD": [u, "$"], "BYN": [u, "р."], "CNY": [u, "¥"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MKD": ["ден."], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=mk.js.map?xj{"version":3,"file":"mk.js","sourceRoot":"","sources":["mk.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))\n    return 1;\nreturn 5;\n}\n\nexport default [\"mk\",[[\"претпл.\",\"попл.\"],u,[\"претпладне\",\"попладне\"]],u,[[\"н\",\"п\",\"в\",\"с\",\"ч\",\"п\",\"с\"],[\"нед.\",\"пон.\",\"вто.\",\"сре.\",\"чет.\",\"пет.\",\"саб.\"],[\"недела\",\"понеделник\",\"вторник\",\"среда\",\"четврток\",\"петок\",\"сабота\"],[\"нед.\",\"пон.\",\"вто.\",\"сре.\",\"чет.\",\"пет.\",\"саб.\"]],u,[[\"ј\",\"ф\",\"м\",\"а\",\"м\",\"ј\",\"ј\",\"а\",\"с\",\"о\",\"н\",\"д\"],[\"јан.\",\"фев.\",\"мар.\",\"апр.\",\"мај\",\"јун.\",\"јул.\",\"авг.\",\"септ.\",\"окт.\",\"ноем.\",\"дек.\"],[\"јануари\",\"февруари\",\"март\",\"април\",\"мај\",\"јуни\",\"јули\",\"август\",\"септември\",\"октомври\",\"ноември\",\"декември\"]],u,[[\"п.н.е.\",\"н.е.\"],u,[\"пред нашата ера\",\"од нашата ера\"]],1,[6,0],[\"d.M.yy\",\"d.M.y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, 'во' {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"MKD\",\"ден.\",\"Македонски денар\",{\"AUD\":[u,\"$\"],\"BYN\":[u,\"р.\"],\"CNY\":[u,\"¥\"],\"GBP\":[u,\"£\"],\"HKD\":[u,\"$\"],\"ILS\":[u,\"₪\"],\"INR\":[u,\"₹\"],\"JPY\":[u,\"¥\"],\"KRW\":[u,\"₩\"],\"MKD\":[\"ден.\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"TWD\":[u,\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}l7x>
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ml", [["AM", "PM"], u, u], u, [["ഞ", "തി", "ചൊ", "ബു", "വ്യാ", "വെ", "ശ"], ["ഞായർ", "തിങ്കൾ", "ചൊവ്വ", "ബുധൻ", "വ്യാഴം", "വെള്ളി", "ശനി"], ["ഞായറാഴ്‌ച", "തിങ്കളാഴ്‌ച", "ചൊവ്വാഴ്ച", "ബുധനാഴ്‌ച", "വ്യാഴാഴ്‌ച", "വെള്ളിയാഴ്‌ച", "ശനിയാഴ്‌ച"], ["ഞാ", "തി", "ചൊ", "ബു", "വ്യാ", "വെ", "ശ"]], [["ഞാ", "തി", "ചൊ", "ബു", "വ്യാ", "വെ", "ശ"], ["ഞായർ", "തിങ്കൾ", "ചൊവ്വ", "ബുധൻ", "വ്യാഴം", "വെള്ളി", "ശനി"], ["ഞായറാഴ്‌ച", "തിങ്കളാഴ്‌ച", "ചൊവ്വാഴ്‌ച", "ബുധനാഴ്‌ച", "വ്യാഴാഴ്‌ച", "വെള്ളിയാഴ്‌ച", "ശനിയാഴ്‌ച"], ["ഞാ", "തി", "ചൊ", "ബു", "വ്യാ", "വെ", "ശ"]], [["ജ", "ഫെ", "മാ", "ഏ", "മെ", "ജൂൺ", "ജൂ", "ഓ", "സെ", "ഒ", "ന", "ഡി"], ["ജനു", "ഫെബ്രു", "മാർ", "ഏപ്രി", "മേയ്", "ജൂൺ", "ജൂലൈ", "ഓഗ", "സെപ്റ്റം", "ഒക്ടോ", "നവം", "ഡിസം"], ["ജനുവരി", "ഫെബ്രുവരി", "മാർച്ച്", "ഏപ്രിൽ", "മേയ്", "ജൂൺ", "ജൂലൈ", "ഓഗസ്റ്റ്", "സെപ്റ്റംബർ", "ഒക്‌ടോബർ", "നവംബർ", "ഡിസംബർ"]], u, [["ക്രി.മു.", "എഡി"], u, ["ക്രിസ്‌തുവിന് മുമ്പ്", "ആന്നോ ഡൊമിനി"]], 0, [0, 0], ["d/M/yy", "y, MMM d", "y, MMMM d", "y, MMMM d, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "INR", "₹", "ഇന്ത്യൻ രൂപ", { "BYN": [u, "р."], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=ml.js.map!аx {"version":3,"file":"ml.js","sourceRoot":"","sources":["ml.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ml\",[[\"AM\",\"PM\"],u,u],u,[[\"ഞ\",\"തി\",\"ചൊ\",\"ബു\",\"വ്യാ\",\"വെ\",\"ശ\"],[\"ഞായർ\",\"തിങ്കൾ\",\"ചൊവ്വ\",\"ബുധൻ\",\"വ്യാഴം\",\"വെള്ളി\",\"ശനി\"],[\"ഞായറാഴ്‌ച\",\"തിങ്കളാഴ്‌ച\",\"ചൊവ്വാഴ്ച\",\"ബുധനാഴ്‌ച\",\"വ്യാഴാഴ്‌ച\",\"വെള്ളിയാഴ്‌ച\",\"ശനിയാഴ്‌ച\"],[\"ഞാ\",\"തി\",\"ചൊ\",\"ബു\",\"വ്യാ\",\"വെ\",\"ശ\"]],[[\"ഞാ\",\"തി\",\"ചൊ\",\"ബു\",\"വ്യാ\",\"വെ\",\"ശ\"],[\"ഞായർ\",\"തിങ്കൾ\",\"ചൊവ്വ\",\"ബുധൻ\",\"വ്യാഴം\",\"വെള്ളി\",\"ശനി\"],[\"ഞായറാഴ്‌ച\",\"തിങ്കളാഴ്‌ച\",\"ചൊവ്വാഴ്‌ച\",\"ബുധനാഴ്‌ച\",\"വ്യാഴാഴ്‌ച\",\"വെള്ളിയാഴ്‌ച\",\"ശനിയാഴ്‌ച\"],[\"ഞാ\",\"തി\",\"ചൊ\",\"ബു\",\"വ്യാ\",\"വെ\",\"ശ\"]],[[\"ജ\",\"ഫെ\",\"മാ\",\"ഏ\",\"മെ\",\"ജൂൺ\",\"ജൂ\",\"ഓ\",\"സെ\",\"ഒ\",\"ന\",\"ഡി\"],[\"ജനു\",\"ഫെബ്രു\",\"മാർ\",\"ഏപ്രി\",\"മേയ്\",\"ജൂൺ\",\"ജൂലൈ\",\"ഓഗ\",\"സെപ്റ്റം\",\"ഒക്ടോ\",\"നവം\",\"ഡിസം\"],[\"ജനുവരി\",\"ഫെബ്രുവരി\",\"മാർച്ച്\",\"ഏപ്രിൽ\",\"മേയ്\",\"ജൂൺ\",\"ജൂലൈ\",\"ഓഗസ്റ്റ്\",\"സെപ്റ്റംബർ\",\"ഒക്‌ടോബർ\",\"നവംബർ\",\"ഡിസംബർ\"]],u,[[\"ക്രി.മു.\",\"എഡി\"],u,[\"ക്രിസ്‌തുവിന് മുമ്പ്\",\"ആന്നോ ഡൊമിനി\"]],0,[0,0],[\"d/M/yy\",\"y, MMM d\",\"y, MMMM d\",\"y, MMMM d, EEEE\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"INR\",\"₹\",\"ഇന്ത്യൻ രൂപ\",{\"BYN\":[u,\"р.\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}͒x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["mn", [["ү.ө.", "ү.х."], u, u], u, [["Ня", "Да", "Мя", "Лх", "Пү", "Ба", "Бя"], u, ["ням", "даваа", "мягмар", "лхагва", "пүрэв", "баасан", "бямба"], ["Ня", "Да", "Мя", "Лх", "Пү", "Ба", "Бя"]], [["Ня", "Да", "Мя", "Лх", "Пү", "Ба", "Бя"], u, ["Ням", "Даваа", "Мягмар", "Лхагва", "Пүрэв", "Баасан", "Бямба"], ["Ня", "Да", "Мя", "Лх", "Пү", "Ба", "Бя"]], [["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"], ["1-р сар", "2-р сар", "3-р сар", "4-р сар", "5-р сар", "6-р сар", "7-р сар", "8-р сар", "9-р сар", "10-р сар", "11-р сар", "12-р сар"], ["нэгдүгээр сар", "хоёрдугаар сар", "гуравдугаар сар", "дөрөвдүгээр сар", "тавдугаар сар", "зургаадугаар сар", "долоодугаар сар", "наймдугаар сар", "есдүгээр сар", "аравдугаар сар", "арван нэгдүгээр сар", "арван хоёрдугаар сар"]], [["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"], ["1-р сар", "2-р сар", "3-р сар", "4-р сар", "5-р сар", "6-р сар", "7-р сар", "8-р сар", "9-р сар", "10-р сар", "11-р сар", "12-р сар"], ["Нэгдүгээр сар", "Хоёрдугаар сар", "Гуравдугаар сар", "Дөрөвдүгээр сар", "Тавдугаар сар", "Зургаадугаар сар", "Долоодугаар сар", "Наймдугаар сар", "Есдүгээр сар", "Аравдугаар сар", "Арван нэгдүгээр сар", "Арван хоёрдугаар сар"]], [["МЭӨ", "МЭ"], u, ["манай эриний өмнөх", "манай эриний"]], 1, [6, 0], ["y.MM.dd", "y 'оны' MMM'ын' d", "y 'оны' MMMM'ын' d", "y 'оны' MMMM'ын' d, EEEE 'гараг'"], ["HH:mm", "HH:mm:ss", "HH:mm:ss (z)", "HH:mm:ss (zzzz)"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MNT", "₮", "Монгол төгрөг", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "MNT": ["₮"], "PHP": [u, "₱"], "SEK": [u, "кр"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=mn.js.mapsܺxj{"version":3,"file":"mn.js","sourceRoot":"","sources":["mn.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"mn\",[[\"ү.ө.\",\"ү.х.\"],u,u],u,[[\"Ня\",\"Да\",\"Мя\",\"Лх\",\"Пү\",\"Ба\",\"Бя\"],u,[\"ням\",\"даваа\",\"мягмар\",\"лхагва\",\"пүрэв\",\"баасан\",\"бямба\"],[\"Ня\",\"Да\",\"Мя\",\"Лх\",\"Пү\",\"Ба\",\"Бя\"]],[[\"Ня\",\"Да\",\"Мя\",\"Лх\",\"Пү\",\"Ба\",\"Бя\"],u,[\"Ням\",\"Даваа\",\"Мягмар\",\"Лхагва\",\"Пүрэв\",\"Баасан\",\"Бямба\"],[\"Ня\",\"Да\",\"Мя\",\"Лх\",\"Пү\",\"Ба\",\"Бя\"]],[[\"I\",\"II\",\"III\",\"IV\",\"V\",\"VI\",\"VII\",\"VIII\",\"IX\",\"X\",\"XI\",\"XII\"],[\"1-р сар\",\"2-р сар\",\"3-р сар\",\"4-р сар\",\"5-р сар\",\"6-р сар\",\"7-р сар\",\"8-р сар\",\"9-р сар\",\"10-р сар\",\"11-р сар\",\"12-р сар\"],[\"нэгдүгээр сар\",\"хоёрдугаар сар\",\"гуравдугаар сар\",\"дөрөвдүгээр сар\",\"тавдугаар сар\",\"зургаадугаар сар\",\"долоодугаар сар\",\"наймдугаар сар\",\"есдүгээр сар\",\"аравдугаар сар\",\"арван нэгдүгээр сар\",\"арван хоёрдугаар сар\"]],[[\"I\",\"II\",\"III\",\"IV\",\"V\",\"VI\",\"VII\",\"VIII\",\"IX\",\"X\",\"XI\",\"XII\"],[\"1-р сар\",\"2-р сар\",\"3-р сар\",\"4-р сар\",\"5-р сар\",\"6-р сар\",\"7-р сар\",\"8-р сар\",\"9-р сар\",\"10-р сар\",\"11-р сар\",\"12-р сар\"],[\"Нэгдүгээр сар\",\"Хоёрдугаар сар\",\"Гуравдугаар сар\",\"Дөрөвдүгээр сар\",\"Тавдугаар сар\",\"Зургаадугаар сар\",\"Долоодугаар сар\",\"Наймдугаар сар\",\"Есдүгээр сар\",\"Аравдугаар сар\",\"Арван нэгдүгээр сар\",\"Арван хоёрдугаар сар\"]],[[\"МЭӨ\",\"МЭ\"],u,[\"манай эриний өмнөх\",\"манай эриний\"]],1,[6,0],[\"y.MM.dd\",\"y 'оны' MMM'ын' d\",\"y 'оны' MMMM'ын' d\",\"y 'оны' MMMM'ын' d, EEEE 'гараг'\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss (z)\",\"HH:mm:ss (zzzz)\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"MNT\",\"₮\",\"Монгол төгрөг\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"MNT\":[\"₮\"],\"PHP\":[u,\"₱\"],\"SEK\":[u,\"кр\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}ϒx	./**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mni-Beng", [["নুমাং", "PM"], u, ["এ এম", "পি এম"]], [["নুমাং", "PM"], u, u], [["নোং", "নিং", "লৈবা", "য়ুম", "শগো", "ইরা", "থাং"], ["নোংমাইজিং", "নিংথৌকাবা", "লৈবাকপোকপা", "য়ুমশকৈশা", "শগোলশেন", "ইরাই", "থাংজ"], u, u], [["নো", "নিং", "লৈ", "য়ুম", "শগ", "ইরা", "থাং"], ["নোংমাইজিং", "নিংথৌকাবা", "লৈবাকপোকপা", "য়ুমশকৈশা", "শগোলশেন", "ইরাই", "থাংজ"], u, u], [["জা", "ফে", "মার", "এপ", "মে", "জুন", "জুল", "আ", "সে", "ওক", "নব", "ডি"], ["জানুৱারি", "ফেব্রুৱারি", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "আগস্ট", "সেপ্টেম্বর", "ওক্টোবর", "নভেম্বর", "ডিসেম্বর"], u], [["জা", "ফে", "মার", "এপ", "মে", "জুন", "জুল", "আ", "সে", "ও", "নব", "ডি"], ["জানু", "ফেব্রু", "মার", "এপ্রি", "মে", "জুন", "জুলা", "আগ", "সেপ্ট", "ওক্টো", "নভে", "ডিসে"], ["জানুৱারি", "ফেব্রুৱারি", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "ওগষ্ট", "সেপ্টেম্বর", "ওক্টোবর", "নবেম্বর", "ডিসেম্বর"]], [["খৃ: মমাং", "খৃ: মতুং"], u, u], 0, [0, 0], ["d/M/yy", "MMM d, y", "MMMM d, y", "MMMM d, y, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} গী {0} দা", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "INR", "₹", "ইন্দিয়ান রুপী", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=mni-Beng.js.map*lⷜx	8/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mni", [["নুমাং", "PM"], u, ["এ এম", "পি এম"]], [["নুমাং", "PM"], u, u], [["নোং", "নিং", "লৈবা", "য়ুম", "শগো", "ইরা", "থাং"], ["নোংমাইজিং", "নিংথৌকাবা", "লৈবাকপোকপা", "য়ুমশকৈশা", "শগোলশেন", "ইরাই", "থাংজ"], u, u], [["নো", "নিং", "লৈ", "য়ুম", "শগ", "ইরা", "থাং"], ["নোংমাইজিং", "নিংথৌকাবা", "লৈবাকপোকপা", "য়ুমশকৈশা", "শগোলশেন", "ইরাই", "থাংজ"], u, u], [["জা", "ফে", "মার", "এপ", "মে", "জুন", "জুল", "আ", "সে", "ওক", "নব", "ডি"], ["জানুৱারি", "ফেব্রুৱারি", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "আগস্ট", "সেপ্টেম্বর", "ওক্টোবর", "নভেম্বর", "ডিসেম্বর"], u], [["জা", "ফে", "মার", "এপ", "মে", "জুন", "জুল", "আ", "সে", "ও", "নব", "ডি"], ["জানু", "ফেব্রু", "মার", "এপ্রি", "মে", "জুন", "জুলা", "আগ", "সেপ্ট", "ওক্টো", "নভে", "ডিসে"], ["জানুৱারি", "ফেব্রুৱারি", "মার্চ", "এপ্রিল", "মে", "জুন", "জুলাই", "ওগষ্ট", "সেপ্টেম্বর", "ওক্টোবর", "নবেম্বর", "ডিসেম্বর"]], [["খৃ: মমাং", "খৃ: মতুং"], u, u], 0, [0, 0], ["d/M/yy", "MMM d, y", "MMMM d, y", "MMMM d, y, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} গী {0} দা", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "INR", "₹", "ইন্দিয়ান রুপী", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=mni.js.map}ѐx{"version":3,"file":"mni.js","sourceRoot":"","sources":["mni.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,KAAK,EAAC,CAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,YAAY,EAAC,WAAW,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,YAAY,EAAC,WAAW,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,CAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,gBAAgB,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"mni\",[[\"নুমাং\",\"PM\"],u,[\"এ এম\",\"পি এম\"]],[[\"নুমাং\",\"PM\"],u,u],[[\"নোং\",\"নিং\",\"লৈবা\",\"য়ুম\",\"শগো\",\"ইরা\",\"থাং\"],[\"নোংমাইজিং\",\"নিংথৌকাবা\",\"লৈবাকপোকপা\",\"য়ুমশকৈশা\",\"শগোলশেন\",\"ইরাই\",\"থাংজ\"],u,u],[[\"নো\",\"নিং\",\"লৈ\",\"য়ুম\",\"শগ\",\"ইরা\",\"থাং\"],[\"নোংমাইজিং\",\"নিংথৌকাবা\",\"লৈবাকপোকপা\",\"য়ুমশকৈশা\",\"শগোলশেন\",\"ইরাই\",\"থাংজ\"],u,u],[[\"জা\",\"ফে\",\"মার\",\"এপ\",\"মে\",\"জুন\",\"জুল\",\"আ\",\"সে\",\"ওক\",\"নব\",\"ডি\"],[\"জানুৱারি\",\"ফেব্রুৱারি\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"আগস্ট\",\"সেপ্টেম্বর\",\"ওক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"],u],[[\"জা\",\"ফে\",\"মার\",\"এপ\",\"মে\",\"জুন\",\"জুল\",\"আ\",\"সে\",\"ও\",\"নব\",\"ডি\"],[\"জানু\",\"ফেব্রু\",\"মার\",\"এপ্রি\",\"মে\",\"জুন\",\"জুলা\",\"আগ\",\"সেপ্ট\",\"ওক্টো\",\"নভে\",\"ডিসে\"],[\"জানুৱারি\",\"ফেব্রুৱারি\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"ওগষ্ট\",\"সেপ্টেম্বর\",\"ওক্টোবর\",\"নবেম্বর\",\"ডিসেম্বর\"]],[[\"খৃ: মমাং\",\"খৃ: মতুং\"],u,u],0,[0,0],[\"d/M/yy\",\"MMM d, y\",\"MMMM d, y\",\"MMMM d, y, EEEE\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} গী {0} দা\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"INR\",\"₹\",\"ইন্দিয়ান রুপী\",{\"JPY\":[\"JP¥\",\"¥\"]},\"ltr\", plural];\n"]}25#}x$/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["mr", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["र", "सो", "मं", "बु", "गु", "शु", "श"], ["रवि", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि"], ["रविवार", "सोमवार", "मंगळवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार"], ["र", "सो", "मं", "बु", "गु", "शु", "श"]], u, [["जा", "फे", "मा", "ए", "मे", "जू", "जु", "ऑ", "स", "ऑ", "नो", "डि"], ["जाने", "फेब्रु", "मार्च", "एप्रि", "मे", "जून", "जुलै", "ऑग", "सप्टें", "ऑक्टो", "नोव्हें", "डिसें"], ["जानेवारी", "फेब्रुवारी", "मार्च", "एप्रिल", "मे", "जून", "जुलै", "ऑगस्ट", "सप्टेंबर", "ऑक्टोबर", "नोव्हेंबर", "डिसेंबर"]], u, [["इ. स. पू.", "इ. स."], u, ["ईसवीसनपूर्व", "ईसवीसन"]], 0, [0, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} रोजी {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##0%", "¤#,##0.00", "[#E0]"], "INR", "₹", "भारतीय रुपया", { "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=mr.js.mapb8{pxs{"version":3,"file":"mr.js","sourceRoot":"","sources":["mr.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,UAAU,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,OAAO,CAAC,EAAC,CAAC,EAAC,CAAC,aAAa,EAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,cAAc,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,cAAc,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"mr\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"र\",\"सो\",\"मं\",\"बु\",\"गु\",\"शु\",\"श\"],[\"रवि\",\"सोम\",\"मंगळ\",\"बुध\",\"गुरु\",\"शुक्र\",\"शनि\"],[\"रविवार\",\"सोमवार\",\"मंगळवार\",\"बुधवार\",\"गुरुवार\",\"शुक्रवार\",\"शनिवार\"],[\"र\",\"सो\",\"मं\",\"बु\",\"गु\",\"शु\",\"श\"]],u,[[\"जा\",\"फे\",\"मा\",\"ए\",\"मे\",\"जू\",\"जु\",\"ऑ\",\"स\",\"ऑ\",\"नो\",\"डि\"],[\"जाने\",\"फेब्रु\",\"मार्च\",\"एप्रि\",\"मे\",\"जून\",\"जुलै\",\"ऑग\",\"सप्टें\",\"ऑक्टो\",\"नोव्हें\",\"डिसें\"],[\"जानेवारी\",\"फेब्रुवारी\",\"मार्च\",\"एप्रिल\",\"मे\",\"जून\",\"जुलै\",\"ऑगस्ट\",\"सप्टेंबर\",\"ऑक्टोबर\",\"नोव्हेंबर\",\"डिसेंबर\"]],u,[[\"इ. स. पू.\",\"इ. स.\"],u,[\"ईसवीसनपूर्व\",\"ईसवीसन\"]],0,[0,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} रोजी {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"[#E0]\"],\"INR\",\"₹\",\"भारतीय रुपया\",{\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}y@Vxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ms-BN", [["a", "p"], ["PG", "PTG"], u], u, [["A", "I", "S", "R", "K", "J", "S"], ["Ahd", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab"], ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu"], ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"], ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"]], u, [["S.M.", "TM"], u, u], 1, [6, 0], ["d/MM/yy", "d MMM y", "d MMMM y", "dd MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "BND", "$", "Dolar Brunei", { "BND": ["$"], "BYN": [u, "р."], "CAD": [u, "$"], "JPY": ["JP¥", "¥"], "MXN": [u, "$"], "MYR": ["RM"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=ms-BN.js.mapqWxt/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ms-ID", [["a", "p"], ["PG", "PTG"], u], u, [["A", "I", "S", "R", "K", "J", "S"], ["Ahd", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab"], ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu"], ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"], ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"]], u, [["S.M.", "TM"], u, u], 0, [6, 0], ["dd/MM/yy", "d MMM y", "d MMMM y", "EEEE, dd MMMM y"], ["HH.mm", "HH.mm.ss", "HH.mm.ss z", "HH.mm.ss zzzz"], ["{1}, {0}", u, "{1} {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "IDR", "Rp", "Rupiah Indonesia", { "BYN": [u, "р."], "CAD": [u, "$"], "IDR": ["Rp"], "JPY": ["JP¥", "¥"], "MXN": [u, "$"], "MYR": ["RM"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=ms-ID.js.map;>sMWxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ms-SG", [["a", "p"], ["PG", "PTG"], u], u, [["A", "I", "S", "R", "K", "J", "S"], ["Ahd", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab"], ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu"], ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"], ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"]], u, [["S.M.", "TM"], u, u], 0, [6, 0], ["d/MM/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "SGD", "$", "Dolar Singapura", { "BYN": [u, "р."], "CAD": [u, "$"], "JPY": ["JP¥", "¥"], "MXN": [u, "$"], "MYR": ["RM"], "PHP": [u, "₱"], "SGD": ["$"], "TWD": ["NT$"], "USD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=ms-SG.js.mapJ)rVxa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ms", [["a", "p"], ["PG", "PTG"], u], u, [["A", "I", "S", "R", "K", "J", "S"], ["Ahd", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab"], ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu"], ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"], ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"]], u, [["S.M.", "TM"], u, u], 1, [6, 0], ["d/MM/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "MYR", "RM", "Ringgit Malaysia", { "BYN": [u, "р."], "CAD": [u, "$"], "JPY": ["JP¥", "¥"], "MXN": [u, "$"], "MYR": ["RM"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=ms.js.map oGxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 10))
        return 3;
    if (n % 100 === Math.floor(n % 100) && (n % 100 >= 11 && n % 100 <= 19))
        return 4;
    return 5;
}
export default ["mt", [["am", "pm"], ["AM", "PM"], u], u, [["Ħd", "T", "Tl", "Er", "Ħm", "Ġm", "Sb"], ["Ħad", "Tne", "Tli", "Erb", "Ħam", "Ġim", "Sib"], ["Il-Ħadd", "It-Tnejn", "It-Tlieta", "L-Erbgħa", "Il-Ħamis", "Il-Ġimgħa", "Is-Sibt"], ["Ħad", "Tne", "Tli", "Erb", "Ħam", "Ġim", "Sib"]], [["Ħd", "Tn", "Tl", "Er", "Ħm", "Ġm", "Sb"], ["Ħad", "Tne", "Tli", "Erb", "Ħam", "Ġim", "Sib"], ["Il-Ħadd", "It-Tnejn", "It-Tlieta", "L-Erbgħa", "Il-Ħamis", "Il-Ġimgħa", "Is-Sibt"], ["Ħad", "Tne", "Tli", "Erb", "Ħam", "Ġim", "Sib"]], [["J", "F", "M", "A", "M", "Ġ", "L", "A", "S", "O", "N", "D"], ["Jan", "Fra", "Mar", "Apr", "Mej", "Ġun", "Lul", "Aww", "Set", "Ott", "Nov", "Diċ"], ["Jannar", "Frar", "Marzu", "April", "Mejju", "Ġunju", "Lulju", "Awwissu", "Settembru", "Ottubru", "Novembru", "Diċembru"]], [["Jn", "Fr", "Mz", "Ap", "Mj", "Ġn", "Lj", "Aw", "St", "Ob", "Nv", "Dċ"], ["Jan", "Fra", "Mar", "Apr", "Mej", "Ġun", "Lul", "Aww", "Set", "Ott", "Nov", "Diċ"], ["Jannar", "Frar", "Marzu", "April", "Mejju", "Ġunju", "Lulju", "Awwissu", "Settembru", "Ottubru", "Novembru", "Diċembru"]], [["QK", "WK"], u, ["Qabel Kristu", "Wara Kristu"]], 0, [6, 0], ["dd/MM/y", "dd MMM y", "d 'ta'’ MMMM y", "EEEE, d 'ta'’ MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "EUR", "€", "ewro", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mt.js.map=[Wx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mua", [["comme", "lilli"], u, u], u, [["Y", "L", "Z", "O", "A", "G", "E"], ["Cya", "Cla", "Czi", "Cko", "Cka", "Cga", "Cze"], ["Com’yakke", "Comlaaɗii", "Comzyiiɗii", "Comkolle", "Comkaldǝɓlii", "Comgaisuu", "Comzyeɓsuu"], ["Cya", "Cla", "Czi", "Cko", "Cka", "Cga", "Cze"]], u, [["O", "A", "I", "F", "D", "B", "L", "M", "E", "U", "W", "Y"], ["FLO", "CLA", "CKI", "FMF", "MAD", "MBI", "MLI", "MAM", "FDE", "FMU", "FGW", "FYU"], ["Fĩi Loo", "Cokcwaklaŋne", "Cokcwaklii", "Fĩi Marfoo", "Madǝǝuutǝbijaŋ", "Mamǝŋgwãafahbii", "Mamǝŋgwãalii", "Madǝmbii", "Fĩi Dǝɓlii", "Fĩi Mundaŋ", "Fĩi Gwahlle", "Fĩi Yuru"]], u, [["KK", "PK"], u, ["KǝPel Kristu", "Pel Kristu"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XAF", "FCFA", "solai BEAC", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=mua.js.maphٖͶvxf/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["my", [["နံနက်", "ညနေ"], u, u], u, [["တ", "တ", "အ", "ဗ", "က", "သ", "စ"], ["တနင်္ဂနွေ", "တနင်္လာ", "အင်္ဂါ", "ဗုဒ္ဓဟူး", "ကြာသပတေး", "သောကြာ", "စနေ"], u, u], u, [["ဇ", "ဖ", "မ", "ဧ", "မ", "ဇ", "ဇ", "ဩ", "စ", "အ", "န", "ဒ"], ["ဇန်", "ဖေ", "မတ်", "ဧ", "မေ", "ဇွန်", "ဇူ", "ဩ", "စက်", "အောက်", "နို", "ဒီ"], ["ဇန်နဝါရီ", "ဖေဖော်ဝါရီ", "မတ်", "ဧပြီ", "မေ", "ဇွန်", "ဇူလိုင်", "ဩဂုတ်", "စက်တင်ဘာ", "အောက်တိုဘာ", "နိုဝင်ဘာ", "ဒီဇင်ဘာ"]], u, [["ဘီစီ", "အဒေီ"], u, ["ခရစ်တော် မပေါ်မီနှစ်", "ခရစ်နှစ်"]], 0, [6, 0], ["dd-MM-yy", "y- MMM d", "y- MMMM d", "y- MMMM d- EEEE"], ["H:mm", "H:mm:ss", "z HH:mm:ss", "zzzz HH:mm:ss"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "ဂဏန်းမဟုတ်သော", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "MMK", "K", "မြန်မာ ကျပ်", { "ANG": ["NAf"], "AWG": ["Afl"], "BBD": [u, "Bds$"], "BSD": [u, "B$"], "BYN": [u, "р."], "HTG": ["G"], "JPY": ["JP¥", "¥"], "MMK": ["K"], "PAB": ["B/."], "PHP": [u, "₱"], "THB": ["฿"], "TTD": ["TT$", "$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=my.js.maprCxY{"version":3,"file":"my.js","sourceRoot":"","sources":["my.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,SAAS,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,GAAG,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,GAAG,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,YAAY,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,OAAO,EAAC,UAAU,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,sBAAsB,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,YAAY,EAAC,eAAe,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,eAAe,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,aAAa,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,MAAM,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"my\",[[\"နံနက်\",\"ညနေ\"],u,u],u,[[\"တ\",\"တ\",\"အ\",\"ဗ\",\"က\",\"သ\",\"စ\"],[\"တနင်္ဂနွေ\",\"တနင်္လာ\",\"အင်္ဂါ\",\"ဗုဒ္ဓဟူး\",\"ကြာသပတေး\",\"သောကြာ\",\"စနေ\"],u,u],u,[[\"ဇ\",\"ဖ\",\"မ\",\"ဧ\",\"မ\",\"ဇ\",\"ဇ\",\"ဩ\",\"စ\",\"အ\",\"န\",\"ဒ\"],[\"ဇန်\",\"ဖေ\",\"မတ်\",\"ဧ\",\"မေ\",\"ဇွန်\",\"ဇူ\",\"ဩ\",\"စက်\",\"အောက်\",\"နို\",\"ဒီ\"],[\"ဇန်နဝါရီ\",\"ဖေဖော်ဝါရီ\",\"မတ်\",\"ဧပြီ\",\"မေ\",\"ဇွန်\",\"ဇူလိုင်\",\"ဩဂုတ်\",\"စက်တင်ဘာ\",\"အောက်တိုဘာ\",\"နိုဝင်ဘာ\",\"ဒီဇင်ဘာ\"]],u,[[\"ဘီစီ\",\"အဒေီ\"],u,[\"ခရစ်တော် မပေါ်မီနှစ်\",\"ခရစ်နှစ်\"]],0,[6,0],[\"dd-MM-yy\",\"y- MMM d\",\"y- MMMM d\",\"y- MMMM d- EEEE\"],[\"H:mm\",\"H:mm:ss\",\"z HH:mm:ss\",\"zzzz HH:mm:ss\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"ဂဏန်းမဟုတ်သော\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"MMK\",\"K\",\"မြန်မာ ကျပ်\",{\"ANG\":[\"NAf\"],\"AWG\":[\"Afl\"],\"BBD\":[u,\"Bds$\"],\"BSD\":[u,\"B$\"],\"BYN\":[u,\"р.\"],\"HTG\":[\"G\"],\"JPY\":[\"JP¥\",\"¥\"],\"MMK\":[\"K\"],\"PAB\":[\"B/.\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TTD\":[\"TT$\",\"$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}d7OJx^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["mzn", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"], u], u, [["پ.م", "م."], u, ["قبل میلاد", "بعد میلاد"]], 6, [5, 5], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "IRR", "IRR", "ایران ریال", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"] }, "rtl", plural];
//# sourceMappingURL=mzn.js.map*_x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    return 5;
}
export default ["naq", [["ǁgoagas", "ǃuias"], u, u], u, [["S", "M", "E", "W", "D", "F", "A"], ["Son", "Ma", "De", "Wu", "Do", "Fr", "Sat"], ["Sontaxtsees", "Mantaxtsees", "Denstaxtsees", "Wunstaxtsees", "Dondertaxtsees", "Fraitaxtsees", "Satertaxtsees"], ["Son", "Ma", "De", "Wu", "Do", "Fr", "Sat"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["ǃKhanni", "ǃKhanǀgôab", "ǀKhuuǁkhâb", "ǃHôaǂkhaib", "ǃKhaitsâb", "Gamaǀaeb", "ǂKhoesaob", "Aoǁkhuumûǁkhâb", "Taraǀkhuumûǁkhâb", "ǂNûǁnâiseb", "ǀHooǂgaeb", "Hôasoreǁkhâb"]], u, [["BC", "AD"], u, ["Xristub aiǃâ", "Xristub khaoǃgâ"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ZAR", "ZAR", "South African Randi", { "JPY": ["JP¥", "¥"], "NAD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=naq.js.map)%x	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["nb-SJ", [["a", "p"], ["a.m.", "p.m."], u], [["a.m.", "p.m."], u, u], [["S", "M", "T", "O", "T", "F", "L"], ["søn.", "man.", "tir.", "ons.", "tor.", "fre.", "lør."], ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], ["sø.", "ma.", "ti.", "on.", "to.", "fr.", "lø."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mar.", "apr.", "mai", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "des."], ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des"], ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["f.Kr.", "e.Kr."], u, ["før Kristus", "etter Kristus"]], 1, [6, 0], ["dd.MM.y", "d. MMM y", "d. MMMM y", "EEEE d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'kl'. {0}", u], [",", " ", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "NOK", "kr", "norske kroner", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NOK": ["kr"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nb-SJ.js.map?*Zx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["nb", [["a", "p"], ["a.m.", "p.m."], u], [["a.m.", "p.m."], u, u], [["S", "M", "T", "O", "T", "F", "L"], ["søn.", "man.", "tir.", "ons.", "tor.", "fre.", "lør."], ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], ["sø.", "ma.", "ti.", "on.", "to.", "fr.", "lø."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mar.", "apr.", "mai", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "des."], ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des"], ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["f.Kr.", "e.Kr."], u, ["før Kristus", "etter Kristus"]], 1, [6, 0], ["dd.MM.y", "d. MMM y", "d. MMMM y", "EEEE d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'kl'. {0}", u], [",", " ", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "NOK", "kr", "norske kroner", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NOK": ["kr"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nb.js.map(ƲVxb/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["nd", [["AM", "PM"], u, u], u, [["S", "M", "S", "S", "S", "S", "M"], ["Son", "Mvu", "Sib", "Sit", "Sin", "Sih", "Mgq"], ["Sonto", "Mvulo", "Sibili", "Sithathu", "Sine", "Sihlanu", "Mgqibelo"], ["Son", "Mvu", "Sib", "Sit", "Sin", "Sih", "Mgq"]], u, [["Z", "N", "M", "M", "N", "N", "N", "N", "M", "M", "L", "M"], ["Zib", "Nhlo", "Mbi", "Mab", "Nkw", "Nhla", "Ntu", "Ncw", "Mpan", "Mfu", "Lwe", "Mpal"], ["Zibandlela", "Nhlolanja", "Mbimbitho", "Mabasa", "Nkwenkwezi", "Nhlangula", "Ntulikazi", "Ncwabakazi", "Mpandula", "Mfumfu", "Lwezi", "Mpalakazi"]], u, [["BC", "AD"], u, ["UKristo angakabuyi", "Ukristo ebuyile"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "US$", "Dola yase Amelika", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=nd.js.map {.xG	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ne-IN", [["पूर्वाह्न", "अपराह्न"], u, u], u, [["आ", "सो", "म", "बु", "बि", "शु", "श"], ["आइत", "सोम", "मङ्गल", "बुध", "बिहि", "शुक्र", "शनि"], ["आइतबार", "सोमबार", "मङ्गलबार", "बुधबार", "बिहिबार", "शुक्रबार", "शनिबार"], ["आइत", "सोम", "मङ्गल", "बुध", "बिहि", "शुक्र", "शनि"]], u, [["जन", "फेब", "मार्च", "अप्र", "मे", "जुन", "जुल", "अग", "सेप", "अक्टो", "नोभे", "डिसे"], ["जनवरी", "फेब्रुअरी", "मार्च", "अप्रिल", "मे", "जुन", "जुलाई", "अगस्ट", "सेप्टेम्बर", "अक्टोबर", "नोभेम्बर", "डिसेम्बर"], u], [["जन", "फेेब", "मार्च", "अप्र", "मे", "जुन", "जुल", "अग", "सेप", "अक्टो", "नोभे", "डिसे"], ["जनवरी", "फेब्रुअरी", "मार्च", "अप्रिल", "मे", "जुन", "जुलाई", "अगस्ट", "सेप्टेम्बर", "अक्टोबर", "नोभेम्बर", "डिसेम्बर"], u], [["ईसा पूर्व", "सन्"], u, u], 0, [0, 0], ["yy/M/d", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤ #,##,##0.00", "#E0"], "INR", "₹", "भारतीय रूपिँया", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "NPR": ["नेरू", "रू"], "PHP": [u, "₱"], "THB": ["฿"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ne-IN.js.map~`xc{"version":3,"file":"ne-IN.js","sourceRoot":"","sources":["ne-IN.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,WAAW,EAAC,SAAS,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,eAAe,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,gBAAgB,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,MAAM,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ne-IN\",[[\"पूर्वाह्न\",\"अपराह्न\"],u,u],u,[[\"आ\",\"सो\",\"म\",\"बु\",\"बि\",\"शु\",\"श\"],[\"आइत\",\"सोम\",\"मङ्गल\",\"बुध\",\"बिहि\",\"शुक्र\",\"शनि\"],[\"आइतबार\",\"सोमबार\",\"मङ्गलबार\",\"बुधबार\",\"बिहिबार\",\"शुक्रबार\",\"शनिबार\"],[\"आइत\",\"सोम\",\"मङ्गल\",\"बुध\",\"बिहि\",\"शुक्र\",\"शनि\"]],u,[[\"जन\",\"फेब\",\"मार्च\",\"अप्र\",\"मे\",\"जुन\",\"जुल\",\"अग\",\"सेप\",\"अक्टो\",\"नोभे\",\"डिसे\"],[\"जनवरी\",\"फेब्रुअरी\",\"मार्च\",\"अप्रिल\",\"मे\",\"जुन\",\"जुलाई\",\"अगस्ट\",\"सेप्टेम्बर\",\"अक्टोबर\",\"नोभेम्बर\",\"डिसेम्बर\"],u],[[\"जन\",\"फेेब\",\"मार्च\",\"अप्र\",\"मे\",\"जुन\",\"जुल\",\"अग\",\"सेप\",\"अक्टो\",\"नोभे\",\"डिसे\"],[\"जनवरी\",\"फेब्रुअरी\",\"मार्च\",\"अप्रिल\",\"मे\",\"जुन\",\"जुलाई\",\"अगस्ट\",\"सेप्टेम्बर\",\"अक्टोबर\",\"नोभेम्बर\",\"डिसेम्बर\"],u],[[\"ईसा पूर्व\",\"सन्\"],u,u],0,[0,0],[\"yy/M/d\",\"y MMM d\",\"y MMMM d\",\"y MMMM d, EEEE\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤ #,##,##0.00\",\"#E0\"],\"INR\",\"₹\",\"भारतीय रूपिँया\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"NPR\":[\"नेरू\",\"रू\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}βxF	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ne", [["पूर्वाह्न", "अपराह्न"], u, u], u, [["आ", "सो", "म", "बु", "बि", "शु", "श"], ["आइत", "सोम", "मङ्गल", "बुध", "बिहि", "शुक्र", "शनि"], ["आइतबार", "सोमबार", "मङ्गलबार", "बुधबार", "बिहिबार", "शुक्रबार", "शनिबार"], ["आइत", "सोम", "मङ्गल", "बुध", "बिहि", "शुक्र", "शनि"]], u, [["जन", "फेब", "मार्च", "अप्र", "मे", "जुन", "जुल", "अग", "सेप", "अक्टो", "नोभे", "डिसे"], ["जनवरी", "फेब्रुअरी", "मार्च", "अप्रिल", "मे", "जुन", "जुलाई", "अगस्ट", "सेप्टेम्बर", "अक्टोबर", "नोभेम्बर", "डिसेम्बर"], u], [["जन", "फेेब", "मार्च", "अप्र", "मे", "जुन", "जुल", "अग", "सेप", "अक्टो", "नोभे", "डिसे"], ["जनवरी", "फेब्रुअरी", "मार्च", "अप्रिल", "मे", "जुन", "जुलाई", "अगस्ट", "सेप्टेम्बर", "अक्टोबर", "नोभेम्बर", "डिसेम्बर"], u], [["ईसा पूर्व", "सन्"], u, u], 0, [6, 0], ["yy/M/d", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤ #,##,##0.00", "#E0"], "NPR", "नेरू", "नेपाली रूपैयाँ", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "NPR": ["नेरू", "रू"], "PHP": [u, "₱"], "THB": ["฿"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ne.js.map'dkx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["nl-CW", [["a.m.", "p.m."], u, u], u, [["Z", "M", "D", "W", "D", "V", "Z"], ["zo", "ma", "di", "wo", "do", "vr", "za"], ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], ["zo", "ma", "di", "wo", "do", "vr", "za"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mrt.", "apr.", "mei", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"]], u, [["v.C.", "n.C."], ["v.Chr.", "n.Chr."], ["voor Christus", "na Christus"]], 1, [6, 0], ["dd-MM-y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'om' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "ANG", "NAf.", "Nederlands-Antilliaanse gulden", { "ANG": ["NAf."], "AUD": ["AU$", "$"], "BYN": [u, "р."], "CAD": ["C$", "$"], "FJD": ["FJ$", "$"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RUR": [u, "р."], "SBD": ["SI$", "$"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nl-CW.js.map W?LxQ A"WG", "Afl.", "Arubaanse gulden", {AWG": ["Afl.	AW.js.maphxu/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["nl-BQ", [["a.m.", "p.m."], u, u], u, [["Z", "M", "D", "W", "D", "V", "Z"], ["zo", "ma", "di", "wo", "do", "vr", "za"], ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], ["zo", "ma", "di", "wo", "do", "vr", "za"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mrt.", "apr.", "mei", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"]], u, [["v.C.", "n.C."], ["v.Chr.", "n.Chr."], ["voor Christus", "na Christus"]], 1, [6, 0], ["dd-MM-y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'om' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "USD", "$", "Amerikaanse dollar", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CAD": ["C$", "$"], "FJD": ["FJ$", "$"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RUR": [u, "р."], "SBD": ["SI$", "$"], "THB": ["฿"], "TWD": ["NT$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nl-BQ.js.mapCujxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["nl-SR", [["a.m.", "p.m."], u, u], u, [["Z", "M", "D", "W", "D", "V", "Z"], ["zo", "ma", "di", "wo", "do", "vr", "za"], ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], ["zo", "ma", "di", "wo", "do", "vr", "za"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mrt.", "apr.", "mei", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"]], u, [["v.C.", "n.C."], ["v.Chr.", "n.Chr."], ["voor Christus", "na Christus"]], 1, [6, 0], ["dd-MM-y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'om' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "SRD", "$", "Surinaamse dollar", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CAD": ["C$", "$"], "FJD": ["FJ$", "$"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RUR": [u, "р."], "SBD": ["SI$", "$"], "SRD": ["$"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nl-SR.js.mapϒhxr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["nl", [["a.m.", "p.m."], u, u], u, [["Z", "M", "D", "W", "D", "V", "Z"], ["zo", "ma", "di", "wo", "do", "vr", "za"], ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], ["zo", "ma", "di", "wo", "do", "vr", "za"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mrt.", "apr.", "mei", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"]], u, [["v.C.", "n.C."], ["v.Chr.", "n.Chr."], ["voor Christus", "na Christus"]], 1, [6, 0], ["dd-MM-y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1} 'om' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "EUR", "€", "Euro", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CAD": ["C$", "$"], "FJD": ["FJ$", "$"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RUR": [u, "р."], "SBD": ["SI$", "$"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nl.js.map(ϲ\x=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["nmg", [["maná", "kugú"], u, u], u, [["s", "m", "s", "s", "s", "m", "s"], ["sɔ́n", "mɔ́n", "smb", "sml", "smn", "mbs", "sas"], ["sɔ́ndɔ", "mɔ́ndɔ", "sɔ́ndɔ mafú mába", "sɔ́ndɔ mafú málal", "sɔ́ndɔ mafú mána", "mabágá má sukul", "sásadi"], ["sɔ́n", "mɔ́n", "smb", "sml", "smn", "mbs", "sas"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ng1", "ng2", "ng3", "ng4", "ng5", "ng6", "ng7", "ng8", "ng9", "ng10", "ng11", "kris"], ["ngwɛn matáhra", "ngwɛn ńmba", "ngwɛn ńlal", "ngwɛn ńna", "ngwɛn ńtan", "ngwɛn ńtuó", "ngwɛn hɛmbuɛrí", "ngwɛn lɔmbi", "ngwɛn rɛbvuâ", "ngwɛn wum", "ngwɛn wum navǔr", "krísimin"]], u, [["BL", "PB"], u, ["Bó Lahlɛ̄", "Pfiɛ Burī"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "Fraŋ CFA BEAC", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=nmg.js.mapXx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["nn", [["a", "p"], ["f.m.", "e.m."], ["a.m.", "p.m."]], [["f.m.", "e.m."], ["a.m.", "p.m."], u], [["S", "M", "T", "O", "T", "F", "L"], ["sø.", "må.", "ty.", "on.", "to.", "fr.", "la."], ["søndag", "måndag", "tysdag", "onsdag", "torsdag", "fredag", "laurdag"], ["sø.", "må.", "ty.", "on.", "to.", "fr.", "la."]], [["S", "M", "T", "O", "T", "F", "L"], ["søn", "mån", "tys", "ons", "tor", "fre", "lau"], ["søndag", "måndag", "tysdag", "onsdag", "torsdag", "fredag", "laurdag"], ["sø.", "må.", "ty.", "on.", "to.", "fr.", "la."]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mars", "apr.", "mai", "juni", "juli", "aug.", "sep.", "okt.", "nov.", "des."], ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des"], ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["f.Kr.", "e.Kr."], u, ["før Kristus", "etter Kristus"]], 1, [6, 0], ["dd.MM.y", "d. MMM y", "d. MMMM y", "EEEE d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "'kl'. HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'kl'. {0}", "{1} {0}"], [",", " ", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "NOK", "kr", "norske kroner", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NOK": ["kr"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "$"], "USD": [u, "$"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=nn.js.mapZjx]x&/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["nnh", [["mbaʼámbaʼ", "ncwònzém"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["lyɛʼɛ́ sẅíŋtè", "mvfò lyɛ̌ʼ", "mbɔ́ɔntè mvfò lyɛ̌ʼ", "tsètsɛ̀ɛ lyɛ̌ʼ", "mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ", "mvfò màga lyɛ̌ʼ", "màga lyɛ̌ʼ"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["saŋ tsetsɛ̀ɛ lùm", "saŋ kàg ngwóŋ", "saŋ lepyè shúm", "saŋ cÿó", "saŋ tsɛ̀ɛ cÿó", "saŋ njÿoláʼ", "saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ", "saŋ mbʉ̀ŋ", "saŋ ngwɔ̀ʼ mbÿɛ", "saŋ tàŋa tsetsáʼ", "saŋ mejwoŋó", "saŋ lùm"], u], u, [["m.z.Y.", "m.g.n.Y."], u, ["mé zyé Yěsô", "mé gÿo ńzyé Yěsô"]], 1, [6, 0], ["dd/MM/yy", "d MMM, y", "'lyɛ'̌ʼ d 'na' MMMM, y", "EEEE , 'lyɛ'̌ʼ d 'na' MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, "{1}, {0}", "{1},{0}"], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XAF", "FCFA", "feláŋ CFA", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=nnh.js.map'x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["no", [["a", "p"], ["a.m.", "p.m."], u], [["a.m.", "p.m."], u, u], [["S", "M", "T", "O", "T", "F", "L"], ["søn.", "man.", "tir.", "ons.", "tor.", "fre.", "lør."], ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], ["sø.", "ma.", "ti.", "on.", "to.", "fr.", "lø."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mar.", "apr.", "mai", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "des."], ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des"], ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"]], [["f.Kr.", "e.Kr."], u, ["før Kristus", "etter Kristus"]], 1, [6, 0], ["dd.MM.y", "d. MMM y", "d. MMMM y", "EEEE d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'kl'. {0}", u], [",", " ", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "¤ #,##0.00;¤ -#,##0.00", "#E0"], "NOK", "kr", "norske kroner", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NOK": ["kr"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XAF": [], "XCD": [u, "$"], "XPF": [], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=no.js.maps([xH/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["nus", [["RW", "TŊ"], u, u], u, [["C", "J", "R", "D", "Ŋ", "D", "B"], ["Cäŋ", "Jiec", "Rɛw", "Diɔ̱k", "Ŋuaan", "Dhieec", "Bäkɛl"], ["Cäŋ kuɔth", "Jiec la̱t", "Rɛw lätni", "Diɔ̱k lätni", "Ŋuaan lätni", "Dhieec lätni", "Bäkɛl lätni"], ["Cäŋ", "Jiec", "Rɛw", "Diɔ̱k", "Ŋuaan", "Dhieec", "Bäkɛl"]], u, [["T", "P", "D", "G", "D", "K", "P", "T", "T", "L", "K", "T"], ["Tiop", "Pɛt", "Duɔ̱ɔ̱", "Guak", "Duä", "Kor", "Pay", "Thoo", "Tɛɛ", "Laa", "Kur", "Tid"], ["Tiop thar pɛt", "Pɛt", "Duɔ̱ɔ̱ŋ", "Guak", "Duät", "Kornyoot", "Pay yie̱tni", "Tho̱o̱r", "Tɛɛr", "Laath", "Kur", "Tio̱p in di̱i̱t"]], u, [["AY", "ƐY"], u, ["A ka̱n Yecu ni dap", "Ɛ ca Yecu dap"]], 1, [6, 0], ["d/MM/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "z h:mm:ss a", "zzzz h:mm:ss a"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "SSP", "£", "SSP", { "GBP": ["GB£", "£"], "JPY": ["JP¥", "¥"], "SSP": ["£"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=nus.js.map![xK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["nyn", [["AM", "PM"], u, u], u, [["S", "K", "R", "S", "N", "T", "M"], ["SAN", "ORK", "OKB", "OKS", "OKN", "OKT", "OMK"], ["Sande", "Orwokubanza", "Orwakabiri", "Orwakashatu", "Orwakana", "Orwakataano", "Orwamukaaga"], ["SAN", "ORK", "OKB", "OKS", "OKN", "OKT", "OMK"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["KBZ", "KBR", "KST", "KKN", "KTN", "KMK", "KMS", "KMN", "KMW", "KKM", "KNK", "KNB"], ["Okwokubanza", "Okwakabiri", "Okwakashatu", "Okwakana", "Okwakataana", "Okwamukaaga", "Okwamushanju", "Okwamunaana", "Okwamwenda", "Okwaikumi", "Okwaikumi na kumwe", "Okwaikumi na ibiri"]], u, [["BC", "AD"], u, ["Kurisito Atakaijire", "Kurisito Yaijire"]], 1, [0, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "UGX", "USh", "Eshiringi ya Uganda", { "JPY": ["JP¥", "¥"], "UGX": ["USh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=nyn.js.mapixi/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["om-KE", [["WD", "WB"], u, u], u, [["D", "W", "Q", "R", "K", "J", "S"], ["Dil", "Wix", "Qib", "Rob", "Kam", "Jim", "San"], ["Dilbata", "Wiixata", "Qibxata", "Roobii", "Kamiisa", "Jimaata", "Sanbata"], ["Dil", "Wix", "Qib", "Rob", "Kam", "Jim", "San"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Ama", "Gur", "Bit", "Elb", "Cam", "Wax", "Ado", "Hag", "Ful", "Onk", "Sad", "Mud"], ["Amajjii", "Guraandhala", "Bitooteessa", "Elba", "Caamsa", "Waxabajjii", "Adooleessa", "Hagayya", "Fuulbana", "Onkololeessa", "Sadaasa", "Muddee"]], [["A", "G", "B", "E", "C", "W", "A", "H", "F", "O", "S", "M"], ["Ama", "Gur", "Bit", "Elb", "Cam", "Wax", "Ado", "Hag", "Ful", "Onk", "Sad", "Mud"], ["Amajjii", "Guraandhala", "Bitooteessa", "Elba", "Caamsa", "Waxabajjii", "Adooleessa", "Hagayya", "Fuulbana", "Onkololeessa", "Sadaasa", "Muddee"]], [["KD", "CE"], u, ["Dheengadda Jeesu", "CE"]], 0, [6, 0], ["dd/MM/yy", "dd-MMM-y", "dd MMMM y", "EEEE, MMMM d, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "KES", { "ETB": ["Br"], "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=om-KE.js.mapCVxj/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["om", [["WD", "WB"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Dil", "Wix", "Qib", "Rob", "Kam", "Jim", "San"], ["Dilbata", "Wiixata", "Qibxata", "Roobii", "Kamiisa", "Jimaata", "Sanbata"], ["Dil", "Wix", "Qib", "Rob", "Kam", "Jim", "San"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Ama", "Gur", "Bit", "Elb", "Cam", "Wax", "Ado", "Hag", "Ful", "Onk", "Sad", "Mud"], ["Amajjii", "Guraandhala", "Bitooteessa", "Elba", "Caamsa", "Waxabajjii", "Adooleessa", "Hagayya", "Fuulbana", "Onkololeessa", "Sadaasa", "Muddee"]], u, [["BCE", "CE"], u, ["Dheengadda Jeesu", "CE"]], 0, [6, 0], ["dd/MM/yy", "dd-MMM-y", "dd MMMM y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ETB", "Br", "Itoophiyaa Birrii", { "ETB": ["Br"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=om.js.mapyyux^/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["or", [["ପୂ", "ଅ"], ["AM", "PM"], u], [["AM", "ଅପରାହ୍ନ"], ["ପୂର୍ବାହ୍ନ", "ଅପରାହ୍ନ"], u], [["ର", "ସୋ", "ମ", "ବୁ", "ଗୁ", "ଶୁ", "ଶ"], ["ରବି", "ସୋମ", "ମଙ୍ଗଳ", "ବୁଧ", "ଗୁରୁ", "ଶୁକ୍ର", "ଶନି"], ["ରବିବାର", "ସୋମବାର", "ମଙ୍ଗଳବାର", "ବୁଧବାର", "ଗୁରୁବାର", "ଶୁକ୍ରବାର", "ଶନିବାର"], ["ରବି", "ସୋମ", "ମଙ୍ଗଳ", "ବୁଧ", "ଗୁରୁ", "ଶୁକ୍ର", "ଶନି"]], u, [["ଜା", "ଫେ", "ମା", "ଅ", "ମଇ", "ଜୁ", "ଜୁ", "ଅ", "ସେ", "ଅ", "ନ", "ଡି"], ["ଜାନୁଆରୀ", "ଫେବୃଆରୀ", "ମାର୍ଚ୍ଚ", "ଅପ୍ରେଲ", "ମଇ", "ଜୁନ", "ଜୁଲାଇ", "ଅଗଷ୍ଟ", "ସେପ୍ଟେମ୍ବର", "ଅକ୍ଟୋବର", "ନଭେମ୍ବର", "ଡିସେମ୍ବର"], u], u, [["BC", "AD"], u, ["ଖ୍ରୀଷ୍ଟପୂର୍ବ", "ଖ୍ରୀଷ୍ଟାବ୍ଦ"]], 0, [0, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{0} ଠାରେ {1}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "INR", "₹", "ଭାରତୀୟ ଟଙ୍କା", { "BYN": [u, "р."], "PHP": [u, "₱"] }, "ltr", plural];
//# sourceMappingURL=or.js.mapUUxe	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["os-RU", [["AM", "PM"], u, ["ӕмбисбоны размӕ", "ӕмбисбоны фӕстӕ"]], [["AM", "PM"], u, u], [["Х", "К", "Д", "Ӕ", "Ц", "М", "С"], ["хцб", "крс", "дцг", "ӕрт", "цпр", "мрб", "сбт"], ["хуыцаубон", "къуырисӕр", "дыццӕг", "ӕртыццӕг", "цыппӕрӕм", "майрӕмбон", "сабат"], ["хцб", "крс", "дцг", "ӕрт", "цпр", "мрб", "сбт"]], [["Х", "К", "Д", "Ӕ", "Ц", "М", "С"], ["Хцб", "Крс", "Дцг", "Ӕрт", "Цпр", "Мрб", "Сбт"], ["Хуыцаубон", "Къуырисӕр", "Дыццӕг", "Ӕртыццӕг", "Цыппӕрӕм", "Майрӕмбон", "Сабат"], ["хцб", "крс", "дцг", "ӕрт", "цпр", "мрб", "сбт"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "фев.", "мар.", "апр.", "майы", "июны", "июлы", "авг.", "сен.", "окт.", "ноя.", "дек."], ["январы", "февралы", "мартъийы", "апрелы", "майы", "июны", "июлы", "августы", "сентябры", "октябры", "ноябры", "декабры"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["Янв.", "Февр.", "Март.", "Апр.", "Май", "Июнь", "Июль", "Авг.", "Сент.", "Окт.", "Нояб.", "Дек."], ["Январь", "Февраль", "Мартъи", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]], [["н.д.а.", "н.д."], u, u], 1, [6, 0], ["dd.MM.yy", "dd MMM y 'аз'", "d MMMM, y 'аз'", "EEEE, d MMMM, y 'аз'"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "НН", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "RUB", "₽", "Сом", { "JPY": ["JP¥", "¥"], "RUB": ["₽"] }, "ltr", plural];
//# sourceMappingURL=os-RU.js.mapdKx_	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["os", [["AM", "PM"], u, ["ӕмбисбоны размӕ", "ӕмбисбоны фӕстӕ"]], [["AM", "PM"], u, u], [["Х", "К", "Д", "Ӕ", "Ц", "М", "С"], ["хцб", "крс", "дцг", "ӕрт", "цпр", "мрб", "сбт"], ["хуыцаубон", "къуырисӕр", "дыццӕг", "ӕртыццӕг", "цыппӕрӕм", "майрӕмбон", "сабат"], ["хцб", "крс", "дцг", "ӕрт", "цпр", "мрб", "сбт"]], [["Х", "К", "Д", "Ӕ", "Ц", "М", "С"], ["Хцб", "Крс", "Дцг", "Ӕрт", "Цпр", "Мрб", "Сбт"], ["Хуыцаубон", "Къуырисӕр", "Дыццӕг", "Ӕртыццӕг", "Цыппӕрӕм", "Майрӕмбон", "Сабат"], ["хцб", "крс", "дцг", "ӕрт", "цпр", "мрб", "сбт"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "фев.", "мар.", "апр.", "майы", "июны", "июлы", "авг.", "сен.", "окт.", "ноя.", "дек."], ["январы", "февралы", "мартъийы", "апрелы", "майы", "июны", "июлы", "августы", "сентябры", "октябры", "ноябры", "декабры"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["Янв.", "Февр.", "Март.", "Апр.", "Май", "Июнь", "Июль", "Авг.", "Сент.", "Окт.", "Нояб.", "Дек."], ["Январь", "Февраль", "Мартъи", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]], [["н.д.а.", "н.д."], u, u], 1, [6, 0], ["dd.MM.yy", "dd MMM y 'аз'", "d MMMM, y 'аз'", "EEEE, d MMMM, y 'аз'"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "НН", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "GEL", "₾", "Лар", { "GEL": ["₾"], "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=os.js.map34xE{"version":3,"file":"os.js","sourceRoot":"","sources":["os.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"os\",[[\"AM\",\"PM\"],u,[\"ӕмбисбоны размӕ\",\"ӕмбисбоны фӕстӕ\"]],[[\"AM\",\"PM\"],u,u],[[\"Х\",\"К\",\"Д\",\"Ӕ\",\"Ц\",\"М\",\"С\"],[\"хцб\",\"крс\",\"дцг\",\"ӕрт\",\"цпр\",\"мрб\",\"сбт\"],[\"хуыцаубон\",\"къуырисӕр\",\"дыццӕг\",\"ӕртыццӕг\",\"цыппӕрӕм\",\"майрӕмбон\",\"сабат\"],[\"хцб\",\"крс\",\"дцг\",\"ӕрт\",\"цпр\",\"мрб\",\"сбт\"]],[[\"Х\",\"К\",\"Д\",\"Ӕ\",\"Ц\",\"М\",\"С\"],[\"Хцб\",\"Крс\",\"Дцг\",\"Ӕрт\",\"Цпр\",\"Мрб\",\"Сбт\"],[\"Хуыцаубон\",\"Къуырисӕр\",\"Дыццӕг\",\"Ӕртыццӕг\",\"Цыппӕрӕм\",\"Майрӕмбон\",\"Сабат\"],[\"хцб\",\"крс\",\"дцг\",\"ӕрт\",\"цпр\",\"мрб\",\"сбт\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"фев.\",\"мар.\",\"апр.\",\"майы\",\"июны\",\"июлы\",\"авг.\",\"сен.\",\"окт.\",\"ноя.\",\"дек.\"],[\"январы\",\"февралы\",\"мартъийы\",\"апрелы\",\"майы\",\"июны\",\"июлы\",\"августы\",\"сентябры\",\"октябры\",\"ноябры\",\"декабры\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"Янв.\",\"Февр.\",\"Март.\",\"Апр.\",\"Май\",\"Июнь\",\"Июль\",\"Авг.\",\"Сент.\",\"Окт.\",\"Нояб.\",\"Дек.\"],[\"Январь\",\"Февраль\",\"Мартъи\",\"Апрель\",\"Май\",\"Июнь\",\"Июль\",\"Август\",\"Сентябрь\",\"Октябрь\",\"Ноябрь\",\"Декабрь\"]],[[\"н.д.а.\",\"н.д.\"],u,u],1,[6,0],[\"dd.MM.yy\",\"dd MMM y 'аз'\",\"d MMMM, y 'аз'\",\"EEEE, d MMMM, y 'аз'\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"НН\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"GEL\",\"₾\",\"Лар\",{\"GEL\":[\"₾\"],\"JPY\":[\"JP¥\",\"¥\"]},\"ltr\", plural];\n"]}KxK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["pa-Arab", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["اتوار", "پیر", "منگل", "بُدھ", "جمعرات", "جمعہ", "ہفتہ"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["جنوری", "فروری", "مارچ", "اپریل", "مئ", "جون", "جولائی", "اگست", "ستمبر", "اکتوبر", "نومبر", "دسمبر"], u], u, [["ايساپورو", "سں"], u, u], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, dd MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "‎+", "‎-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "PKR", "ر", "روپئیہ", { "JPY": ["JP¥", "¥"], "PKR": ["ر", "Rs"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=pa-Arab.js.mapҚxS/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["pa-Guru", [["ਸ.", "ਸ਼."], ["ਪੂ.ਦੁ.", "ਬਾ.ਦੁ."], u], [["ਪੂ.ਦੁ.", "ਬਾ.ਦੁ."], u, u], [["ਐ", "ਸੋ", "ਮੰ", "ਬੁੱ", "ਵੀ", "ਸ਼ੁੱ", "ਸ਼"], ["ਐਤ", "ਸੋਮ", "ਮੰਗਲ", "ਬੁੱਧ", "ਵੀਰ", "ਸ਼ੁੱਕਰ", "ਸ਼ਨਿੱਚਰ"], ["ਐਤਵਾਰ", "ਸੋਮਵਾਰ", "ਮੰਗਲਵਾਰ", "ਬੁੱਧਵਾਰ", "ਵੀਰਵਾਰ", "ਸ਼ੁੱਕਰਵਾਰ", "ਸ਼ਨਿੱਚਰਵਾਰ"], ["ਐਤ", "ਸੋਮ", "ਮੰਗ", "ਬੁੱਧ", "ਵੀਰ", "ਸ਼ੁੱਕ", "ਸ਼ਨਿੱ"]], u, [["ਜ", "ਫ਼", "ਮਾ", "ਅ", "ਮ", "ਜੂ", "ਜੁ", "ਅ", "ਸ", "ਅ", "ਨ", "ਦ"], ["ਜਨ", "ਫ਼ਰ", "ਮਾਰਚ", "ਅਪ੍ਰੈ", "ਮਈ", "ਜੂਨ", "ਜੁਲਾ", "ਅਗ", "ਸਤੰ", "ਅਕਤੂ", "ਨਵੰ", "ਦਸੰ"], ["ਜਨਵਰੀ", "ਫ਼ਰਵਰੀ", "ਮਾਰਚ", "ਅਪ੍ਰੈਲ", "ਮਈ", "ਜੂਨ", "ਜੁਲਾਈ", "ਅਗਸਤ", "ਸਤੰਬਰ", "ਅਕਤੂਬਰ", "ਨਵੰਬਰ", "ਦਸੰਬਰ"]], u, [["ਈ.ਪੂ.", "ਸੰਨ"], ["ਈ. ਪੂ.", "ਸੰਨ"], ["ਈਸਵੀ ਪੂਰਵ", "ਈਸਵੀ ਸੰਨ"]], 0, [0, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤ #,##,##0.00", "[#E0]"], "INR", "₹", "ਭਾਰਤੀ ਰੁਪਇਆ", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=pa-Guru.js.map7x+{"version":3,"file":"pa-Guru.js","sourceRoot":"","sources":["pa-Guru.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,SAAS,EAAC,CAAC,CAAC,IAAI,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,CAAC,EAAC,CAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,YAAY,CAAC,EAAC,CAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,eAAe,EAAC,OAAO,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,aAAa,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === Math.floor(n) && (n >= 0 && n <= 1))\n    return 1;\nreturn 5;\n}\n\nexport default [\"pa-Guru\",[[\"ਸ.\",\"ਸ਼.\"],[\"ਪੂ.ਦੁ.\",\"ਬਾ.ਦੁ.\"],u],[[\"ਪੂ.ਦੁ.\",\"ਬਾ.ਦੁ.\"],u,u],[[\"ਐ\",\"ਸੋ\",\"ਮੰ\",\"ਬੁੱ\",\"ਵੀ\",\"ਸ਼ੁੱ\",\"ਸ਼\"],[\"ਐਤ\",\"ਸੋਮ\",\"ਮੰਗਲ\",\"ਬੁੱਧ\",\"ਵੀਰ\",\"ਸ਼ੁੱਕਰ\",\"ਸ਼ਨਿੱਚਰ\"],[\"ਐਤਵਾਰ\",\"ਸੋਮਵਾਰ\",\"ਮੰਗਲਵਾਰ\",\"ਬੁੱਧਵਾਰ\",\"ਵੀਰਵਾਰ\",\"ਸ਼ੁੱਕਰਵਾਰ\",\"ਸ਼ਨਿੱਚਰਵਾਰ\"],[\"ਐਤ\",\"ਸੋਮ\",\"ਮੰਗ\",\"ਬੁੱਧ\",\"ਵੀਰ\",\"ਸ਼ੁੱਕ\",\"ਸ਼ਨਿੱ\"]],u,[[\"ਜ\",\"ਫ਼\",\"ਮਾ\",\"ਅ\",\"ਮ\",\"ਜੂ\",\"ਜੁ\",\"ਅ\",\"ਸ\",\"ਅ\",\"ਨ\",\"ਦ\"],[\"ਜਨ\",\"ਫ਼ਰ\",\"ਮਾਰਚ\",\"ਅਪ੍ਰੈ\",\"ਮਈ\",\"ਜੂਨ\",\"ਜੁਲਾ\",\"ਅਗ\",\"ਸਤੰ\",\"ਅਕਤੂ\",\"ਨਵੰ\",\"ਦਸੰ\"],[\"ਜਨਵਰੀ\",\"ਫ਼ਰਵਰੀ\",\"ਮਾਰਚ\",\"ਅਪ੍ਰੈਲ\",\"ਮਈ\",\"ਜੂਨ\",\"ਜੁਲਾਈ\",\"ਅਗਸਤ\",\"ਸਤੰਬਰ\",\"ਅਕਤੂਬਰ\",\"ਨਵੰਬਰ\",\"ਦਸੰਬਰ\"]],u,[[\"ਈ.ਪੂ.\",\"ਸੰਨ\"],[\"ਈ. ਪੂ.\",\"ਸੰਨ\"],[\"ਈਸਵੀ ਪੂਰਵ\",\"ਈਸਵੀ ਸੰਨ\"]],0,[0,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤ #,##,##0.00\",\"[#E0]\"],\"INR\",\"₹\",\"ਭਾਰਤੀ ਰੁਪਇਆ\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XXX\":[]},\"ltr\", plural];\n"]}pYxI/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["pa", [["ਸ.", "ਸ਼."], ["ਪੂ.ਦੁ.", "ਬਾ.ਦੁ."], u], [["ਪੂ.ਦੁ.", "ਬਾ.ਦੁ."], u, u], [["ਐ", "ਸੋ", "ਮੰ", "ਬੁੱ", "ਵੀ", "ਸ਼ੁੱ", "ਸ਼"], ["ਐਤ", "ਸੋਮ", "ਮੰਗਲ", "ਬੁੱਧ", "ਵੀਰ", "ਸ਼ੁੱਕਰ", "ਸ਼ਨਿੱਚਰ"], ["ਐਤਵਾਰ", "ਸੋਮਵਾਰ", "ਮੰਗਲਵਾਰ", "ਬੁੱਧਵਾਰ", "ਵੀਰਵਾਰ", "ਸ਼ੁੱਕਰਵਾਰ", "ਸ਼ਨਿੱਚਰਵਾਰ"], ["ਐਤ", "ਸੋਮ", "ਮੰਗ", "ਬੁੱਧ", "ਵੀਰ", "ਸ਼ੁੱਕ", "ਸ਼ਨਿੱ"]], u, [["ਜ", "ਫ਼", "ਮਾ", "ਅ", "ਮ", "ਜੂ", "ਜੁ", "ਅ", "ਸ", "ਅ", "ਨ", "ਦ"], ["ਜਨ", "ਫ਼ਰ", "ਮਾਰਚ", "ਅਪ੍ਰੈ", "ਮਈ", "ਜੂਨ", "ਜੁਲਾ", "ਅਗ", "ਸਤੰ", "ਅਕਤੂ", "ਨਵੰ", "ਦਸੰ"], ["ਜਨਵਰੀ", "ਫ਼ਰਵਰੀ", "ਮਾਰਚ", "ਅਪ੍ਰੈਲ", "ਮਈ", "ਜੂਨ", "ਜੁਲਾਈ", "ਅਗਸਤ", "ਸਤੰਬਰ", "ਅਕਤੂਬਰ", "ਨਵੰਬਰ", "ਦਸੰਬਰ"]], u, [["ਈ.ਪੂ.", "ਸੰਨ"], ["ਈ. ਪੂ.", "ਸੰਨ"], ["ਈਸਵੀ ਪੂਰਵ", "ਈਸਵੀ ਸੰਨ"]], 0, [0, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤ #,##,##0.00", "[#E0]"], "INR", "₹", "ਭਾਰਤੀ ਰੁਪਇਆ", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=pa.js.mapdhx:{"version":3,"file":"pa.js","sourceRoot":"","sources":["pa.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,IAAI,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,CAAC,EAAC,CAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,YAAY,CAAC,EAAC,CAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,eAAe,EAAC,OAAO,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,aAAa,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === Math.floor(n) && (n >= 0 && n <= 1))\n    return 1;\nreturn 5;\n}\n\nexport default [\"pa\",[[\"ਸ.\",\"ਸ਼.\"],[\"ਪੂ.ਦੁ.\",\"ਬਾ.ਦੁ.\"],u],[[\"ਪੂ.ਦੁ.\",\"ਬਾ.ਦੁ.\"],u,u],[[\"ਐ\",\"ਸੋ\",\"ਮੰ\",\"ਬੁੱ\",\"ਵੀ\",\"ਸ਼ੁੱ\",\"ਸ਼\"],[\"ਐਤ\",\"ਸੋਮ\",\"ਮੰਗਲ\",\"ਬੁੱਧ\",\"ਵੀਰ\",\"ਸ਼ੁੱਕਰ\",\"ਸ਼ਨਿੱਚਰ\"],[\"ਐਤਵਾਰ\",\"ਸੋਮਵਾਰ\",\"ਮੰਗਲਵਾਰ\",\"ਬੁੱਧਵਾਰ\",\"ਵੀਰਵਾਰ\",\"ਸ਼ੁੱਕਰਵਾਰ\",\"ਸ਼ਨਿੱਚਰਵਾਰ\"],[\"ਐਤ\",\"ਸੋਮ\",\"ਮੰਗ\",\"ਬੁੱਧ\",\"ਵੀਰ\",\"ਸ਼ੁੱਕ\",\"ਸ਼ਨਿੱ\"]],u,[[\"ਜ\",\"ਫ਼\",\"ਮਾ\",\"ਅ\",\"ਮ\",\"ਜੂ\",\"ਜੁ\",\"ਅ\",\"ਸ\",\"ਅ\",\"ਨ\",\"ਦ\"],[\"ਜਨ\",\"ਫ਼ਰ\",\"ਮਾਰਚ\",\"ਅਪ੍ਰੈ\",\"ਮਈ\",\"ਜੂਨ\",\"ਜੁਲਾ\",\"ਅਗ\",\"ਸਤੰ\",\"ਅਕਤੂ\",\"ਨਵੰ\",\"ਦਸੰ\"],[\"ਜਨਵਰੀ\",\"ਫ਼ਰਵਰੀ\",\"ਮਾਰਚ\",\"ਅਪ੍ਰੈਲ\",\"ਮਈ\",\"ਜੂਨ\",\"ਜੁਲਾਈ\",\"ਅਗਸਤ\",\"ਸਤੰਬਰ\",\"ਅਕਤੂਬਰ\",\"ਨਵੰਬਰ\",\"ਦਸੰਬਰ\"]],u,[[\"ਈ.ਪੂ.\",\"ਸੰਨ\"],[\"ਈ. ਪੂ.\",\"ਸੰਨ\"],[\"ਈਸਵੀ ਪੂਰਵ\",\"ਈਸਵੀ ਸੰਨ\"]],0,[0,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤ #,##,##0.00\",\"[#E0]\"],\"INR\",\"₹\",\"ਭਾਰਤੀ ਰੁਪਇਆ\",{\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XXX\":[]},\"ltr\", plural];\n"]})Ƽx
s/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
        return 3;
    if (v === 0 && (!(i === 1) && (i % 10 === Math.floor(i % 10) && (i % 10 >= 0 && i % 10 <= 1))) || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 12 && i % 100 <= 14))))
        return 4;
    return 5;
}
export default ["pl", [["a", "p"], ["AM", "PM"], u], u, [["n", "p", "w", "ś", "c", "p", "s"], ["niedz.", "pon.", "wt.", "śr.", "czw.", "pt.", "sob."], ["niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota"], ["nie", "pon", "wto", "śro", "czw", "pią", "sob"]], [["N", "P", "W", "Ś", "C", "P", "S"], ["niedz.", "pon.", "wt.", "śr.", "czw.", "pt.", "sob."], ["niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota"], ["nie", "pon", "wto", "śro", "czw", "pią", "sob"]], [["s", "l", "m", "k", "m", "c", "l", "s", "w", "p", "l", "g"], ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "paź", "lis", "gru"], ["stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"]], [["S", "L", "M", "K", "M", "C", "L", "S", "W", "P", "L", "G"], ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "paź", "lis", "gru"], ["styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień"]], [["p.n.e.", "n.e."], u, ["przed naszą erą", "naszej ery"]], 1, [6, 0], ["d.MM.y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "PLN", "zł", "złoty polski", { "AUD": [u, "$"], "CAD": [u, "$"], "CNY": [u, "¥"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "PLN": ["zł"], "RON": [u, "lej"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=pl.js.mapnnx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ps-PK", [["غ.م.", "غ.و."], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["يونۍ", "دونۍ", "درېنۍ", "څلرنۍ", "پينځنۍ", "جمعه", "اونۍ"], u, u], u, [["ج", "ف", "م", "ا", "م", "ج", "ج", "ا", "س", "ا", "ن", "د"], ["جنوري", "فبروري", "مارچ", "اپریل", "مۍ", "جون", "جولای", "اګست", "سېپتمبر", "اکتوبر", "نومبر", "دسمبر"], u], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["جنوري", "فبروري", "مارچ", "اپریل", "مۍ", "جون", "جولای", "اګست", "سپتمبر", "اکتوبر", "نومبر", "دسمبر"], ["جنوري", "فېبروري", "مارچ", "اپریل", "مۍ", "جون", "جولای", "اګست", "سپتمبر", "اکتوبر", "نومبر", "دسمبر"]], [["له میلاد وړاندې", "م."], u, ["له میلاد څخه وړاندې", "له میلاد څخه وروسته"]], 0, [6, 0], ["y/M/d", "y MMM d", "د y د MMMM d", "EEEE د y د MMMM d"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "‎+", "‎−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "PKR", "Rs", "پاکستانۍ کلداره", { "AFN": ["؋"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PKR": ["Rs"] }, "rtl", plural];
//# sourceMappingURL=ps-PK.js.mapalx=/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ps", [["غ.م.", "غ.و."], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["يونۍ", "دونۍ", "درېنۍ", "څلرنۍ", "پينځنۍ", "جمعه", "اونۍ"], u, u], u, [["ج", "ف", "م", "ا", "م", "ج", "ج", "ا", "س", "ا", "ن", "د"], ["جنوري", "فبروري", "مارچ", "اپریل", "مۍ", "جون", "جولای", "اګست", "سېپتمبر", "اکتوبر", "نومبر", "دسمبر"], u], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["جنوري", "فبروري", "مارچ", "اپریل", "مۍ", "جون", "جولای", "اګست", "سپتمبر", "اکتوبر", "نومبر", "دسمبر"], ["جنوري", "فېبروري", "مارچ", "اپریل", "مۍ", "جون", "جولای", "اګست", "سپتمبر", "اکتوبر", "نومبر", "دسمبر"]], [["له میلاد وړاندې", "م."], u, ["له میلاد څخه وړاندې", "له میلاد څخه وروسته"]], 6, [4, 5], ["y/M/d", "y MMM d", "د y د MMMM d", "EEEE د y د MMMM d"], ["H:mm", "H:mm:ss", "H:mm:ss (z)", "H:mm:ss (zzzz)"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "‎+", "‎−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "AFN", "؋", "افغانۍ", { "AFN": ["؋"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"] }, "rtl", plural];
//# sourceMappingURL=ps.js.map ;xh{"version":3,"file":"ps.js","sourceRoot":"","sources":["ps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,iBAAiB,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,qBAAqB,EAAC,qBAAqB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,cAAc,EAAC,mBAAmB,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,QAAQ,EAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ps\",[[\"غ.م.\",\"غ.و.\"],u,u],u,[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"يونۍ\",\"دونۍ\",\"درېنۍ\",\"څلرنۍ\",\"پينځنۍ\",\"جمعه\",\"اونۍ\"],u,u],u,[[\"ج\",\"ف\",\"م\",\"ا\",\"م\",\"ج\",\"ج\",\"ا\",\"س\",\"ا\",\"ن\",\"د\"],[\"جنوري\",\"فبروري\",\"مارچ\",\"اپریل\",\"مۍ\",\"جون\",\"جولای\",\"اګست\",\"سېپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"],u],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"جنوري\",\"فبروري\",\"مارچ\",\"اپریل\",\"مۍ\",\"جون\",\"جولای\",\"اګست\",\"سپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"],[\"جنوري\",\"فېبروري\",\"مارچ\",\"اپریل\",\"مۍ\",\"جون\",\"جولای\",\"اګست\",\"سپتمبر\",\"اکتوبر\",\"نومبر\",\"دسمبر\"]],[[\"له میلاد وړاندې\",\"م.\"],u,[\"له میلاد څخه وړاندې\",\"له میلاد څخه وروسته\"]],6,[4,5],[\"y/M/d\",\"y MMM d\",\"د y د MMMM d\",\"EEEE د y د MMMM d\"],[\"H:mm\",\"H:mm:ss\",\"H:mm:ss (z)\",\"H:mm:ss (zzzz)\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"‎+\",\"‎−\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"AFN\",\"؋\",\"افغانۍ\",{\"AFN\":[\"؋\"],\"BYN\":[u,\"р.\"],\"JPY\":[\"JP¥\",\"¥\"]},\"rtl\", plural];\n"]}Th{xG/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt-AO", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 1, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'às' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "AOA", "Kz", "kwanza angolano", { "AOA": ["Kz"], "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["​"], "RON": [u, "L"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt-AO.js.mapUt%zxP/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt-CV", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 1, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'às' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "CVE", "​", "escudo cabo-verdiano", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CVE": ["​"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "RON": [u, "L"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt-CV.js.map	%:zxR/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt-GQ", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 1, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'às' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "franco CFA (BEAC)", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["​"], "RON": [u, "L"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt-GQ.js.maph!|x7/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt-ST", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 1, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'às' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "STN", "Db", "dobra de São Tomé e Príncipe", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["​"], "RON": [u, "L"], "STN": ["Db"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt-ST.js.map,UxK GW"$XOF", "F CFA", "franco CFA (BCEAO)ya^	GW.js.mapzxR/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt-LU", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 1, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'às' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "LUF": ["F"], "PHP": [u, "₱"], "PTE": ["​"], "RON": [u, "L"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt-LU.js.map":x) PT"0~	PT.js.map(p|x?/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt-MO", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 0, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'às' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "MOP", "MOP$", "pataca macaense", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "MOP": ["MOP$"], "PHP": [u, "₱"], "PTE": ["​"], "RON": [u, "L"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt-MO.js.map['˿{x@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt-MZ", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 0, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'às' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "MZN", "MTn", "metical moçambicano", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "MZN": ["MTn"], "PHP": [u, "₱"], "PTE": ["​"], "RON": [u, "L"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt-MZ.js.mapM)E{xK/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt-TL", [["a.m.", "p.m."], u, ["da manhã", "da tarde"]], [["a.m.", "p.m."], u, ["manhã", "tarde"]], [["D", "S", "T", "Q", "Q", "S", "S"], ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 1, [6, 0], ["dd/MM/yy", "dd/MM/y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'às' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "USD", "US$", "dólar dos Estados Unidos", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["​"], "RON": [u, "L"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt-TL.js.map&ux\/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, e = parseInt(val.toString().replace(/^[^e]*(e([-+]?\d+))?/, '$2')) || 0;
    if (i === Math.floor(i) && (i >= 0 && i <= 1))
        return 1;
    if (e === 0 && (!(i === 0) && (i % 1000000 === 0 && v === 0)) || !(e >= 0 && e <= 5))
        return 4;
    return 5;
}
export default ["pt", [["AM", "PM"], u, u], u, [["D", "S", "T", "Q", "Q", "S", "S"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."], ["domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado"], ["dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "fev.", "mar.", "abr.", "mai.", "jun.", "jul.", "ago.", "set.", "out.", "nov.", "dez."], ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]], u, [["a.C.", "d.C."], u, ["antes de Cristo", "depois de Cristo"]], 0, [6, 0], ["dd/MM/y", "d 'de' MMM 'de' y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "BRL", "R$", "Real brasileiro", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["Esc."], "RON": [u, "L"], "SYP": [u, "S£"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=pt.js.map4`jx]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["rm", [["AM", "PM"], u, u], u, [["D", "G", "M", "M", "G", "V", "S"], ["du", "gli", "ma", "me", "gie", "ve", "so"], ["dumengia", "glindesdi", "mardi", "mesemna", "gievgia", "venderdi", "sonda"], ["du", "gli", "ma", "me", "gie", "ve", "so"]], u, [["S", "F", "M", "A", "M", "Z", "F", "A", "S", "O", "N", "D"], ["schan.", "favr.", "mars", "avr.", "matg", "zercl.", "fan.", "avust", "sett.", "oct.", "nov.", "dec."], ["da schaner", "da favrer", "da mars", "d’avrigl", "da matg", "da zercladur", "da fanadur", "d’avust", "da settember", "d’october", "da november", "da december"]], [["S", "F", "M", "A", "M", "Z", "F", "A", "S", "O", "N", "D"], ["schan.", "favr.", "mars", "avr.", "matg", "zercl.", "fan.", "avust", "sett.", "oct.", "nov.", "dec."], ["schaner", "favrer", "mars", "avrigl", "matg", "zercladur", "fanadur", "avust", "settember", "october", "november", "december"]], [["av. Cr.", "s. Cr."], u, ["avant Cristus", "suenter Cristus"]], 1, [6, 0], ["dd-MM-yy", "dd-MM-y", "d MMMM y", "EEEE, 'ils' d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", "’", ";", "%", "+", "−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "CHF", "CHF", "franc svizzer", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=rm.js.map,ݫYxn/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["rn", [["Z.MU.", "Z.MW."], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["cu.", "mbe.", "kab.", "gtu.", "kan.", "gnu.", "gnd."], ["Ku w’indwi", "Ku wa mbere", "Ku wa kabiri", "Ku wa gatatu", "Ku wa kane", "Ku wa gatanu", "Ku wa gatandatu"], ["cu.", "mbe.", "kab.", "gtu.", "kan.", "gnu.", "gnd."]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Mut.", "Gas.", "Wer.", "Mat.", "Gic.", "Kam.", "Nya.", "Kan.", "Nze.", "Ukw.", "Ugu.", "Uku."], ["Nzero", "Ruhuhuma", "Ntwarante", "Ndamukiza", "Rusama", "Ruheshi", "Mukakaro", "Nyandagaro", "Nyakanga", "Gitugutu", "Munyonyo", "Kigarama"]], u, [["Mb.Y.", "Ny.Y"], u, ["Mbere ya Yezu", "Nyuma ya Yezu"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00¤", "#E0"], "BIF", "FBu", "Ifaranga ry’Uburundi", { "BIF": ["FBu"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=rn.js.map'wx}/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    if (!(v === 0) || (n === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 19)))
        return 3;
    return 5;
}
export default ["ro-MD", [["a.m.", "p.m."], u, u], u, [["D", "L", "Ma", "Mi", "J", "V", "S"], ["Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm"], ["duminică", "luni", "marți", "miercuri", "joi", "vineri", "sâmbătă"], ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ"]], u, [["I", "F", "M", "A", "M", "I", "I", "A", "S", "O", "N", "D"], ["ian.", "feb.", "mar.", "apr.", "mai", "iun.", "iul.", "aug.", "sept.", "oct.", "nov.", "dec."], ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"]], u, [["î.Hr.", "d.Hr."], u, ["înainte de Hristos", "după Hristos"]], 1, [6, 0], ["dd.MM.y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "MDL", "L", "leu moldovenesc", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MDL": ["L"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XCD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=ro-MD.js.map:wxt/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    if (!(v === 0) || (n === 0 || n % 100 === Math.floor(n % 100) && (n % 100 >= 2 && n % 100 <= 19)))
        return 3;
    return 5;
}
export default ["ro", [["a.m.", "p.m."], u, u], u, [["D", "L", "M", "M", "J", "V", "S"], ["dum.", "lun.", "mar.", "mie.", "joi", "vin.", "sâm."], ["duminică", "luni", "marți", "miercuri", "joi", "vineri", "sâmbătă"], ["du.", "lu.", "ma.", "mi.", "joi", "vi.", "sâ."]], u, [["I", "F", "M", "A", "M", "I", "I", "A", "S", "O", "N", "D"], ["ian.", "feb.", "mar.", "apr.", "mai", "iun.", "iul.", "aug.", "sept.", "oct.", "nov.", "dec."], ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"]], u, [["î.Hr.", "d.Hr."], u, ["înainte de Hristos", "după Hristos"]], 1, [6, 0], ["dd.MM.y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "RON", "RON", "leu românesc", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XCD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=ro.js.mapG
]x*/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["rof", [["kang’ama", "kingoto"], u, u], u, [["2", "3", "4", "5", "6", "7", "1"], ["Ijp", "Ijt", "Ijn", "Ijtn", "Alh", "Iju", "Ijm"], ["Ijumapili", "Ijumatatu", "Ijumanne", "Ijumatano", "Alhamisi", "Ijumaa", "Ijumamosi"], ["Ijp", "Ijt", "Ijn", "Ijtn", "Alh", "Iju", "Ijm"]], u, [["K", "K", "K", "K", "T", "S", "S", "N", "T", "I", "I", "I"], ["M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12"], ["Mweri wa kwanza", "Mweri wa kaili", "Mweri wa katatu", "Mweri wa kaana", "Mweri wa tanu", "Mweri wa sita", "Mweri wa saba", "Mweri wa nane", "Mweri wa tisa", "Mweri wa ikumi", "Mweri wa ikumi na moja", "Mweri wa ikumi na mbili"]], u, [["KM", "BM"], u, ["Kabla ya Mayesu", "Baada ya Mayesu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "TZS", "TSh", "heleri sa Tanzania", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=rof.js.map	x
e/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
        return 3;
    if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
        return 4;
    return 5;
}
export default ["ru-BY", [["AM", "PM"], u, u], u, [["В", "П", "В", "С", "Ч", "П", "С"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"], ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "мар.", "апр.", "мая", "июн.", "июл.", "авг.", "сент.", "окт.", "нояб.", "дек."], ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "март", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."], ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], [["до н.э.", "н.э."], ["до н. э.", "н. э."], ["до Рождества Христова", "от Рождества Христова"]], 1, [6, 0], ["dd.MM.y", "d MMM y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "не число", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "BYN", "Br", "белорусский рубль", { "BYN": ["Br"], "GEL": [u, "ლ"], "PHP": [u, "₱"], "RON": [u, "L"], "RUB": ["₽"], "THB": ["฿"], "TMT": ["ТМТ"], "TWD": ["NT$"], "UAH": ["₴"], "XXX": ["XXXX"] }, "ltr", plural];
//# sourceMappingURL=ru-BY.js.mapx
@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
        return 3;
    if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
        return 4;
    return 5;
}
export default ["ru-KG", [["AM", "PM"], u, u], u, [["В", "П", "В", "С", "Ч", "П", "С"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"], ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "мар.", "апр.", "мая", "июн.", "июл.", "авг.", "сент.", "окт.", "нояб.", "дек."], ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "март", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."], ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], [["до н.э.", "н.э."], ["до н. э.", "н. э."], ["до Рождества Христова", "от Рождества Христова"]], 1, [6, 0], ["dd.MM.y", "d MMM y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "не число", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "KGS", "сом", "киргизский сом", { "BYN": [u, "р."], "GEL": [u, "ლ"], "KGS": ["сом"], "PHP": [u, "₱"], "RON": [u, "L"], "RUB": ["₽"], "RUR": ["р."], "THB": ["฿"], "TMT": ["ТМТ"], "TWD": ["NT$"], "UAH": ["₴"], "XXX": ["XXXX"] }, "ltr", plural];
//# sourceMappingURL=ru-KG.js.map+x
D/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
        return 3;
    if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
        return 4;
    return 5;
}
export default ["ru-KZ", [["AM", "PM"], u, u], u, [["В", "П", "В", "С", "Ч", "П", "С"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"], ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "мар.", "апр.", "мая", "июн.", "июл.", "авг.", "сент.", "окт.", "нояб.", "дек."], ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "март", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."], ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], [["до н.э.", "н.э."], ["до н. э.", "н. э."], ["до Рождества Христова", "от Рождества Христова"]], 1, [6, 0], ["dd.MM.y", "d MMM y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "не число", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "KZT", "₸", "казахский тенге", { "BYN": [u, "р."], "GEL": [u, "ლ"], "KZT": ["₸"], "PHP": [u, "₱"], "RON": [u, "L"], "RUB": ["₽"], "RUR": ["р."], "THB": ["฿"], "TMT": ["ТМТ"], "TWD": ["NT$"], "UAH": ["₴"], "XXX": ["XXXX"] }, "ltr", plural];
//# sourceMappingURL=ru-KZ.js.mapǵxz{"version":3,"file":"ru-KZ.js","sourceRoot":"","sources":["ru-KZ.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))\n    return 3;\nif (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))\n    return 4;\nreturn 5;\n}\n\nexport default [\"ru-KZ\",[[\"AM\",\"PM\"],u,u],u,[[\"В\",\"П\",\"В\",\"С\",\"Ч\",\"П\",\"С\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],[\"воскресенье\",\"понедельник\",\"вторник\",\"среда\",\"четверг\",\"пятница\",\"суббота\"],[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"]],u,[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"мар.\",\"апр.\",\"мая\",\"июн.\",\"июл.\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"января\",\"февраля\",\"марта\",\"апреля\",\"мая\",\"июня\",\"июля\",\"августа\",\"сентября\",\"октября\",\"ноября\",\"декабря\"]],[[\"Я\",\"Ф\",\"М\",\"А\",\"М\",\"И\",\"И\",\"А\",\"С\",\"О\",\"Н\",\"Д\"],[\"янв.\",\"февр.\",\"март\",\"апр.\",\"май\",\"июнь\",\"июль\",\"авг.\",\"сент.\",\"окт.\",\"нояб.\",\"дек.\"],[\"январь\",\"февраль\",\"март\",\"апрель\",\"май\",\"июнь\",\"июль\",\"август\",\"сентябрь\",\"октябрь\",\"ноябрь\",\"декабрь\"]],[[\"до н.э.\",\"н.э.\"],[\"до н. э.\",\"н. э.\"],[\"до Рождества Христова\",\"от Рождества Христова\"]],1,[6,0],[\"dd.MM.y\",\"d MMM y 'г'.\",\"d MMMM y 'г'.\",\"EEEE, d MMMM y 'г'.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"не число\",\":\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"KZT\",\"₸\",\"казахский тенге\",{\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"KZT\":[\"₸\"],\"PHP\":[u,\"₱\"],\"RON\":[u,\"L\"],\"RUB\":[\"₽\"],\"RUR\":[\"р.\"],\"THB\":[\"฿\"],\"TMT\":[\"ТМТ\"],\"TWD\":[\"NT$\"],\"UAH\":[\"₴\"],\"XXX\":[\"XXXX\"]},\"ltr\", plural];\n"]}Qһx
J/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
        return 3;
    if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
        return 4;
    return 5;
}
export default ["ru-MD", [["AM", "PM"], u, u], u, [["В", "П", "В", "С", "Ч", "П", "С"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"], ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "мар.", "апр.", "мая", "июн.", "июл.", "авг.", "сент.", "окт.", "нояб.", "дек."], ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "март", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."], ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], [["до н.э.", "н.э."], ["до н. э.", "н. э."], ["до Рождества Христова", "от Рождества Христова"]], 1, [6, 0], ["dd.MM.y", "d MMM y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "не число", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "MDL", "L", "молдавский лей", { "BYN": [u, "р."], "GEL": [u, "ლ"], "MDL": ["L"], "PHP": [u, "₱"], "RON": [u, "L"], "RUB": ["₽"], "RUR": ["р."], "THB": ["฿"], "TMT": ["ТМТ"], "TWD": ["NT$"], "UAH": ["₴"], "XXX": ["XXXX"] }, "ltr", plural];
//# sourceMappingURL=ru-MD.js.mapWx
P/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
        return 3;
    if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
        return 4;
    return 5;
}
export default ["ru-UA", [["AM", "PM"], u, u], u, [["В", "П", "В", "С", "Ч", "П", "С"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"], ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "мар.", "апр.", "мая", "июн.", "июл.", "авг.", "сент.", "окт.", "нояб.", "дек."], ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "март", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."], ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], [["до н.э.", "н.э."], ["до н. э.", "н. э."], ["до Рождества Христова", "от Рождества Христова"]], 1, [6, 0], ["dd.MM.y", "d MMM y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "не число", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "UAH", "₴", "украинская гривна", { "BYN": [u, "р."], "GEL": [u, "ლ"], "PHP": [u, "₱"], "RON": [u, "L"], "RUB": ["₽"], "RUR": ["р."], "THB": ["฿"], "TMT": ["ТМТ"], "TWD": ["NT$"], "UAH": ["₴"], "XXX": ["XXXX"] }, "ltr", plural];
//# sourceMappingURL=ru-UA.js.mapQ{9x
X/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
        return 3;
    if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
        return 4;
    return 5;
}
export default ["ru", [["AM", "PM"], u, u], u, [["В", "П", "В", "С", "Ч", "П", "С"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"], ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"], ["вс", "пн", "вт", "ср", "чт", "пт", "сб"]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "мар.", "апр.", "мая", "июн.", "июл.", "авг.", "сент.", "окт.", "нояб.", "дек."], ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"]], [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв.", "февр.", "март", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."], ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], [["до н.э.", "н.э."], ["до н. э.", "н. э."], ["до Рождества Христова", "от Рождества Христова"]], 1, [6, 0], ["dd.MM.y", "d MMM y 'г'.", "d MMMM y 'г'.", "EEEE, d MMMM y 'г'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "не число", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "RUB", "₽", "российский рубль", { "BYN": [u, "р."], "GEL": [u, "ლ"], "PHP": [u, "₱"], "RON": [u, "L"], "RUB": ["₽"], "RUR": ["р."], "THB": ["฿"], "TMT": ["ТМТ"], "TWD": ["NT$"], "UAH": ["₴"], "XXX": ["XXXX"] }, "ltr", plural];
//# sourceMappingURL=ru.js.mapTxI/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["rw", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["cyu.", "mbe.", "kab.", "gtu.", "kan.", "gnu.", "gnd."], ["Ku cyumweru", "Kuwa mbere", "Kuwa kabiri", "Kuwa gatatu", "Kuwa kane", "Kuwa gatanu", "Kuwa gatandatu"], ["cyu.", "mbe.", "kab.", "gtu.", "kan.", "gnu.", "gnd."]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["mut.", "gas.", "wer.", "mat.", "gic.", "kam.", "nya.", "kan.", "nze.", "ukw.", "ugu.", "uku."], ["Mutarama", "Gashyantare", "Werurwe", "Mata", "Gicurasi", "Kamena", "Nyakanga", "Kanama", "Nzeli", "Ukwakira", "Ugushyingo", "Ukuboza"]], u, [["BCE", "CE"], u, u], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "RWF", "RF", "RWF", { "JPY": ["JP¥", "¥"], "RWF": ["RF"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=rw.js.mapqVxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["rwk", [["utuko", "kyiukonyi"], u, u], u, [["J", "J", "J", "J", "A", "I", "J"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"], ["Jumapilyi", "Jumatatuu", "Jumanne", "Jumatanu", "Alhamisi", "Ijumaa", "Jumamosi"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Machi", "Aprilyi", "Mei", "Junyi", "Julyai", "Agusti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KK", "BK"], u, ["Kabla ya Kristu", "Baada ya Kristu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "TZS", "TSh", "Shilingi ya Tanzania", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=rwk.js.map|¼x
C/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sa", [["AM", "PM"], u, ["पूर्वाह्न", "अपराह्न"]], [["AM", "PM"], u, u], [["र", "सो", "मं", "बु", "गु", "शु", "श"], ["रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि"], ["रविवासरः", "सोमवासरः", "मंगलवासरः", "बुधवासरः", "गुरुवासर:", "शुक्रवासरः", "शनिवासरः"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]], u, [["ज", "फ", "मा", "अ", "म", "जू", "जु", "अ", "सि", "अ", "न", "दि"], ["जनवरी:", "फरवरी:", "मार्च:", "अप्रैल:", "मई", "जून:", "जुलाई:", "अगस्त:", "सितंबर:", "अक्तूबर:", "नवंबर:", "दिसंबर:"], ["जनवरीमासः", "फरवरीमासः", "मार्चमासः", "अप्रैलमासः", "मईमासः", "जूनमासः", "जुलाईमासः", "अगस्तमासः", "सितंबरमासः", "अक्तूबरमासः", "नवंबरमासः", "दिसंबरमासः"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["जनवरी:", "फरवरी:", "मार्च:", "अप्रैल:", "मई", "जून:", "जुलाई:", "अगस्त:", "सितंबर:", "अक्तूबर:", "नवंबर:", "दिसंबर:"], ["जनवरीमासः", "फरवरीमासः", "मार्चमासः", "अप्रैलमासः", "मईमासः", "जूनमासः", "जुलाईमासः", "अगस्तमासः", "सितंबरमासः", "अक्तूबरमासः", "नवंबरमासः", "दिसंबरमासः"]], [["BCE", "CE"], u, u], 0, [0, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} तदा {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤#,##,##0.00", "[#E0]"], "INR", "₹", "भारतीय रूप्यकम्", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=sa.js.mapg\Cxa{"version":3,"file":"sa.js","sourceRoot":"","sources":["sa.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"sa\",[[\"AM\",\"PM\"],u,[\"पूर्वाह्न\",\"अपराह्न\"]],[[\"AM\",\"PM\"],u,u],[[\"र\",\"सो\",\"मं\",\"बु\",\"गु\",\"शु\",\"श\"],[\"रवि\",\"सोम\",\"मंगल\",\"बुध\",\"गुरु\",\"शुक्र\",\"शनि\"],[\"रविवासरः\",\"सोमवासरः\",\"मंगलवासरः\",\"बुधवासरः\",\"गुरुवासर:\",\"शुक्रवासरः\",\"शनिवासरः\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"]],u,[[\"ज\",\"फ\",\"मा\",\"अ\",\"म\",\"जू\",\"जु\",\"अ\",\"सि\",\"अ\",\"न\",\"दि\"],[\"जनवरी:\",\"फरवरी:\",\"मार्च:\",\"अप्रैल:\",\"मई\",\"जून:\",\"जुलाई:\",\"अगस्त:\",\"सितंबर:\",\"अक्तूबर:\",\"नवंबर:\",\"दिसंबर:\"],[\"जनवरीमासः\",\"फरवरीमासः\",\"मार्चमासः\",\"अप्रैलमासः\",\"मईमासः\",\"जूनमासः\",\"जुलाईमासः\",\"अगस्तमासः\",\"सितंबरमासः\",\"अक्तूबरमासः\",\"नवंबरमासः\",\"दिसंबरमासः\"]],[[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],[\"जनवरी:\",\"फरवरी:\",\"मार्च:\",\"अप्रैल:\",\"मई\",\"जून:\",\"जुलाई:\",\"अगस्त:\",\"सितंबर:\",\"अक्तूबर:\",\"नवंबर:\",\"दिसंबर:\"],[\"जनवरीमासः\",\"फरवरीमासः\",\"मार्चमासः\",\"अप्रैलमासः\",\"मईमासः\",\"जूनमासः\",\"जुलाईमासः\",\"अगस्तमासः\",\"सितंबरमासः\",\"अक्तूबरमासः\",\"नवंबरमासः\",\"दिसंबरमासः\"]],[[\"BCE\",\"CE\"],u,u],0,[0,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} तदा {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤#,##,##0.00\",\"[#E0]\"],\"INR\",\"₹\",\"भारतीय रूप्यकम्\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}LxL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sah", [["ЭИ", "ЭК"], u, u], u, [["Б", "Б", "О", "С", "Ч", "Б", "С"], ["бс", "бн", "оп", "сэ", "чп", "бэ", "сб"], ["баскыһыанньа", "бэнидиэнньик", "оптуорунньук", "сэрэдэ", "чэппиэр", "Бээтиҥсэ", "субуота"], ["бс", "бн", "оп", "сэ", "чп", "бэ", "сб"]], u, [["Т", "О", "К", "М", "Ы", "Б", "О", "А", "Б", "А", "С", "А"], ["Тохс", "Олун", "Клн", "Мсу", "Ыам", "Бэс", "Отй", "Атр", "Блҕ", "Алт", "Сэт", "Ахс"], ["Тохсунньу", "Олунньу", "Кулун тутар", "Муус устар", "Ыам ыйын", "Бэс ыйын", "От ыйын", "Атырдьых ыйын", "Балаҕан ыйын", "Алтынньы", "Сэтинньи", "ахсынньы"]], [["Т", "О", "К", "М", "Ы", "Б", "О", "А", "Б", "А", "С", "А"], ["Тохс", "Олун", "Клн", "Мсу", "Ыам", "Бэс", "Отй", "Атр", "Блҕ", "Алт", "Сэт", "Ахс"], ["тохсунньу", "олунньу", "кулун тутар", "муус устар", "ыам ыйа", "бэс ыйа", "от ыйа", "атырдьых ыйа", "балаҕан ыйа", "алтынньы", "сэтинньи", "ахсынньы"]], [["б. э. и.", "б. э"], u, u], 1, [6, 0], ["yy/M/d", "y, MMM d", "y, MMMM d", "y 'сыл' MMMM d 'күнэ', EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "чыыһыла буотах", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "RUB", "₽", "Арассыыйа солкуобайа", { "JPY": ["JP¥", "¥"], "RUB": ["₽"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=sah.js.mapvtxC/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    return 5;
}
export default ["sat-Olck", [["AM", "PM"], u, ["ᱥᱮᱛᱟᱜ", "ᱧᱤᱫᱟᱹ"]], [["AM", "PM"], u, u], [["ᱥ", "ᱚ", "ᱵ", "ᱥ", "ᱥ", "ᱡ", "ᱧ"], ["ᱥᱤᱸ", "ᱚᱛ", "ᱵᱟ", "ᱥᱟᱹ", "ᱥᱟᱹᱨ", "ᱡᱟᱹ", "ᱧᱩ"], ["ᱥᱤᱸᱜᱮ", "ᱚᱛᱮ", "ᱵᱟᱞᱮ", "ᱥᱟᱹᱜᱩᱱ", "ᱥᱟᱹᱨᱫᱤ", "ᱡᱟᱹᱨᱩᱢ", "ᱧᱩᱦᱩᱢ"], ["ᱥᱤᱸ", "ᱚᱛ", "ᱵᱟ", "ᱥᱟᱹ", "ᱥᱟᱹᱨ", "ᱡᱟᱹ", "ᱧᱩ"]], u, [["ᱡ", "ᱯ", "ᱢ", "ᱟ", "ᱢ", "ᱡ", "ᱡ", "ᱟ", "ᱥ", "ᱚ", "ᱱ", "ᱫ"], ["ᱡᱟᱱ", "ᱯᱷᱟ", "ᱢᱟᱨ", "ᱟᱯᱨ", "ᱢᱮ", "ᱡᱩᱱ", "ᱡᱩᱞ", "ᱟᱜᱟ", "ᱥᱮᱯ", "ᱚᱠᱴ", "ᱱᱟᱣ", "ᱫᱤᱥ"], ["ᱡᱟᱱᱣᱟᱨᱤ", "ᱯᱷᱟᱨᱣᱟᱨᱤ", "ᱢᱟᱨᱪ", "ᱟᱯᱨᱮᱞ", "ᱢᱮ", "ᱡᱩᱱ", "ᱡᱩᱞᱟᱭ", "ᱟᱜᱟᱥᱛ", "ᱥᱮᱯᱴᱮᱢᱵᱟᱨ", "ᱚᱠᱴᱚᱵᱟᱨ", "ᱱᱟᱣᱟᱢᱵᱟᱨ", "ᱫᱤᱥᱟᱢᱵᱟᱨ"]], u, [["ᱥᱮᱨᱢᱟ ᱞᱟᱦᱟ", "ᱤᱥᱣᱤ"], u, u], 0, [0, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "INR", "₹", "ᱥᱤᱧᱚᱛ ᱨᱮᱱᱟᱜ ᱴᱟᱠᱟ", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=sat-Olck.js.map& sx9/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    return 5;
}
export default ["sat", [["AM", "PM"], u, ["ᱥᱮᱛᱟᱜ", "ᱧᱤᱫᱟᱹ"]], [["AM", "PM"], u, u], [["ᱥ", "ᱚ", "ᱵ", "ᱥ", "ᱥ", "ᱡ", "ᱧ"], ["ᱥᱤᱸ", "ᱚᱛ", "ᱵᱟ", "ᱥᱟᱹ", "ᱥᱟᱹᱨ", "ᱡᱟᱹ", "ᱧᱩ"], ["ᱥᱤᱸᱜᱮ", "ᱚᱛᱮ", "ᱵᱟᱞᱮ", "ᱥᱟᱹᱜᱩᱱ", "ᱥᱟᱹᱨᱫᱤ", "ᱡᱟᱹᱨᱩᱢ", "ᱧᱩᱦᱩᱢ"], ["ᱥᱤᱸ", "ᱚᱛ", "ᱵᱟ", "ᱥᱟᱹ", "ᱥᱟᱹᱨ", "ᱡᱟᱹ", "ᱧᱩ"]], u, [["ᱡ", "ᱯ", "ᱢ", "ᱟ", "ᱢ", "ᱡ", "ᱡ", "ᱟ", "ᱥ", "ᱚ", "ᱱ", "ᱫ"], ["ᱡᱟᱱ", "ᱯᱷᱟ", "ᱢᱟᱨ", "ᱟᱯᱨ", "ᱢᱮ", "ᱡᱩᱱ", "ᱡᱩᱞ", "ᱟᱜᱟ", "ᱥᱮᱯ", "ᱚᱠᱴ", "ᱱᱟᱣ", "ᱫᱤᱥ"], ["ᱡᱟᱱᱣᱟᱨᱤ", "ᱯᱷᱟᱨᱣᱟᱨᱤ", "ᱢᱟᱨᱪ", "ᱟᱯᱨᱮᱞ", "ᱢᱮ", "ᱡᱩᱱ", "ᱡᱩᱞᱟᱭ", "ᱟᱜᱟᱥᱛ", "ᱥᱮᱯᱴᱮᱢᱵᱟᱨ", "ᱚᱠᱴᱚᱵᱟᱨ", "ᱱᱟᱣᱟᱢᱵᱟᱨ", "ᱫᱤᱥᱟᱢᱵᱟᱨ"]], u, [["ᱥᱮᱨᱢᱟ ᱞᱟᱦᱟ", "ᱤᱥᱣᱤ"], u, u], 0, [0, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "INR", "₹", "ᱥᱤᱧᱚᱛ ᱨᱮᱱᱟᱜ ᱴᱟᱠᱟ", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=sat.js.map<"Wxr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sbp", [["Lwamilawu", "Pashamihe"], u, u], u, [["M", "J", "J", "J", "A", "I", "J"], ["Mul", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"], ["Mulungu", "Jumatatu", "Jumanne", "Jumatano", "Alahamisi", "Ijumaa", "Jumamosi"], ["Mul", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Mup", "Mwi", "Msh", "Mun", "Mag", "Muj", "Msp", "Mpg", "Mye", "Mok", "Mus", "Muh"], ["Mupalangulwa", "Mwitope", "Mushende", "Munyi", "Mushende Magali", "Mujimbi", "Mushipepo", "Mupuguto", "Munyense", "Mokhu", "Musongandembwe", "Muhaano"]], u, [["AK", "PK"], u, ["Ashanali uKilisito", "Pamwandi ya Kilisto"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "TZS", "TSh", "Ihela ya Tansaniya", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=sbp.js.mapg䄝bx-/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["sc", [["m.", "b."], ["AM", "PM"], u], [["AM", "PM"], u, u], [["D", "L", "M", "M", "G", "C", "S"], ["dom", "lun", "mar", "mèr", "giò", "che", "sàb"], ["domìniga", "lunis", "martis", "mèrcuris", "giòbia", "chenàbura", "sàbadu"], ["dom", "lun", "mar", "mèr", "giò", "che", "sàb"]], u, [["G", "F", "M", "A", "M", "L", "T", "A", "C", "S", "S", "N"], ["ghe", "fre", "mar", "abr", "maj", "làm", "trì", "aus", "cab", "stG", "stA", "nad"], ["ghennàrgiu", "freàrgiu", "martzu", "abrile", "maju", "làmpadas", "trìulas", "austu", "cabudanni", "santugaine", "santandria", "nadale"]], u, [["a.C.", "p.C."], u, ["in antis de Cristu", "a pustis de Cristu"]], 1, [6, 0], ["dd/MM/y", "d 'de' MMM y", "d 'de' MMMM 'de' 'su' y", "d 'de' MMMM 'de' 'su' y, 'de' EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'a' 'sas' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "èuro", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "XDR": ["DIP"] }, "ltr", plural];
//# sourceMappingURL=sc.js.map|º`x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["sd-Arab", [["صبح، منجهند", "منجهند، شام"], ["صبح، منجهند", "شام، منجهند"], ["صبح، منجهند", "منجهند، شام"]], [["صبح، منجهند", "منجهند، شام"], u, u], [["آچر", "سو", "اڱارو", "اربع", "خم", "جمعو", "ڇنڇر"], ["آچر", "سومر", "اڱارو", "اربع", "خميس", "جمعو", "ڇنڇر"], u, u], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["جنوري", "فيبروري", "مارچ", "اپريل", "مئي", "جون", "جولاءِ", "آگسٽ", "سيپٽمبر", "آڪٽوبر", "نومبر", "ڊسمبر"], u], u, [["BC", "CD"], u, ["قبل مسيح", "عيسوي کان پهرين"]], 0, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "PKR", "Rs", "پاڪستاني رپي", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PKR": ["Rs"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=sd-Arab.js.mapr\x
`/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sd-Deva", [["AM", "PM"], u, ["मंझंदि खां पहिंरियों", "मंझंदि खां पोइ"]], [["AM", "PM"], u, u], [["आ", "सू", "मं", "बु॒", "वि", "जु", "छं"], ["आर्त", "सू", "मंग", "बु॒ध", "विस", "जुम", "छंछ"], ["आर्तवार", "सूमर", "मंगलु", "बु॒धर", "विस्पत", "जुमो", "छंछर"], ["आर्त", "सू", "मंग", "बु॒ध", "विस", "जुम", "छंछ"]], [["आ", "सू", "मं", "बु॒", "वि", "जु", "छं"], ["आ", "सू", "मं", "बुध", "विस", "जु", "छंछ"], ["आर्त", "सू", "मं", "बु॒ध", "विस", "जुम", "छंछ"], ["आर्त", "सू", "मंग", "बु॒ध", "विस", "जुम", "छंछ"]], [["ज", "फ़", "मा", "अ", "मा", "जू", "जु", "अग", "स", "ऑ", "न", "डि"], ["जन", "फर", "मार्च", "अप्रै", "मई", "जून", "जु", "अग", "सप्टे", "ऑक्टो", "नवं", "डिसं"], ["जनवरी", "फरवरी", "मार्चु", "अप्रैल", "मई", "जून", "जुलाई", "अगस्ट", "सप्टेंबर", "ऑक्टोबर", "नवंबर", "डिसंबर"]], [["ज", "फ़", "म", "अ", "मा", "जू", "जु", "अग", "स", "ऑ", "न", "डि"], ["जन", "फर", "मार्च", "अप्रै", "मई", "जून", "जुला", "अग", "सप्टे", "ऑक्टो", "नवं", "डिसं"], ["जनवरी", "फरवरी", "मार्चु", "अप्रैल", "मई", "जून", "जुलाई", "अगस्ट", "सप्टेंबर", "ऑक्टोबर", "नवंबर", "डिसंबर"]], [["बीसी", "एडी"], u, u], 0, [0, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} ते {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "INR", "₹", "हिंदुस्तानी रुपयो", {}, "ltr", plural];
//# sourceMappingURL=sd-Deva.js.mapg*Nxm{"version":3,"file":"sd-Deva.js","sourceRoot":"","sources":["sd-Deva.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"sd-Deva\",[[\"AM\",\"PM\"],u,[\"मंझंदि खां पहिंरियों\",\"मंझंदि खां पोइ\"]],[[\"AM\",\"PM\"],u,u],[[\"आ\",\"सू\",\"मं\",\"बु॒\",\"वि\",\"जु\",\"छं\"],[\"आर्त\",\"सू\",\"मंग\",\"बु॒ध\",\"विस\",\"जुम\",\"छंछ\"],[\"आर्तवार\",\"सूमर\",\"मंगलु\",\"बु॒धर\",\"विस्पत\",\"जुमो\",\"छंछर\"],[\"आर्त\",\"सू\",\"मंग\",\"बु॒ध\",\"विस\",\"जुम\",\"छंछ\"]],[[\"आ\",\"सू\",\"मं\",\"बु॒\",\"वि\",\"जु\",\"छं\"],[\"आ\",\"सू\",\"मं\",\"बुध\",\"विस\",\"जु\",\"छंछ\"],[\"आर्त\",\"सू\",\"मं\",\"बु॒ध\",\"विस\",\"जुम\",\"छंछ\"],[\"आर्त\",\"सू\",\"मंग\",\"बु॒ध\",\"विस\",\"जुम\",\"छंछ\"]],[[\"ज\",\"फ़\",\"मा\",\"अ\",\"मा\",\"जू\",\"जु\",\"अग\",\"स\",\"ऑ\",\"न\",\"डि\"],[\"जन\",\"फर\",\"मार्च\",\"अप्रै\",\"मई\",\"जून\",\"जु\",\"अग\",\"सप्टे\",\"ऑक्टो\",\"नवं\",\"डिसं\"],[\"जनवरी\",\"फरवरी\",\"मार्चु\",\"अप्रैल\",\"मई\",\"जून\",\"जुलाई\",\"अगस्ट\",\"सप्टेंबर\",\"ऑक्टोबर\",\"नवंबर\",\"डिसंबर\"]],[[\"ज\",\"फ़\",\"म\",\"अ\",\"मा\",\"जू\",\"जु\",\"अग\",\"स\",\"ऑ\",\"न\",\"डि\"],[\"जन\",\"फर\",\"मार्च\",\"अप्रै\",\"मई\",\"जून\",\"जुला\",\"अग\",\"सप्टे\",\"ऑक्टो\",\"नवं\",\"डिसं\"],[\"जनवरी\",\"फरवरी\",\"मार्चु\",\"अप्रैल\",\"मई\",\"जून\",\"जुलाई\",\"अगस्ट\",\"सप्टेंबर\",\"ऑक्टोबर\",\"नवंबर\",\"डिसंबर\"]],[[\"बीसी\",\"एडी\"],u,u],0,[0,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} ते {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"INR\",\"₹\",\"हिंदुस्तानी रुपयो\",{},\"ltr\", plural];\n"]}?ӆ`x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["sd", [["صبح، منجهند", "منجهند، شام"], ["صبح، منجهند", "شام، منجهند"], ["صبح، منجهند", "منجهند، شام"]], [["صبح، منجهند", "منجهند، شام"], u, u], [["آچر", "سو", "اڱارو", "اربع", "خم", "جمعو", "ڇنڇر"], ["آچر", "سومر", "اڱارو", "اربع", "خميس", "جمعو", "ڇنڇر"], u, u], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["جنوري", "فيبروري", "مارچ", "اپريل", "مئي", "جون", "جولاءِ", "آگسٽ", "سيپٽمبر", "آڪٽوبر", "نومبر", "ڊسمبر"], u], u, [["BC", "CD"], u, ["قبل مسيح", "عيسوي کان پهرين"]], 0, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "PKR", "Rs", "پاڪستاني رپي", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PKR": ["Rs"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=sd.js.mapY^dx@/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    return 5;
}
export default ["se-FI", [["i", "e"], ["ib", "eb"], u], [["ib", "eb"], u, u], [["S", "M", "D", "G", "D", "B", "L"], ["so", "má", "di", "ga", "du", "be", "lá"], ["sotnabeaivi", "mánnodat", "disdat", "gaskavahkku", "duorastat", "bearjadat", "lávvordat"], ["so", "má", "di", "ga", "du", "be", "lá"]], u, [["O", "G", "N", "C", "M", "G", "S", "B", "Č", "G", "S", "J"], ["ođđj", "guov", "njuk", "cuoŋ", "mies", "geas", "suoi", "borg", "čakč", "golg", "skáb", "juov"], ["ođđajagemánnu", "guovvamánnu", "njukčamánnu", "cuoŋománnu", "miessemánnu", "geassemánnu", "suoidnemánnu", "borgemánnu", "čakčamánnu", "golggotmánnu", "skábmamánnu", "juovlamánnu"]], u, [["oKr.", "mKr."], u, ["ovdal Kristusa", "maŋŋel Kristusa"]], 1, [6, 0], ["dd.MM.y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "·10^", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "DKK": ["Dkr", "kr"], "JPY": ["JP¥", "¥"], "NOK": ["kr"], "SEK": ["Skr", "kr"], "THB": ["฿"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=se-FI.js.mapvܪjxT/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    return 5;
}
export default ["se-SE", [["i.b.", "e.b."], u, ["iđitbeaivet", "eahketbeaivet"]], [["i.b.", "e.b."], u, ["iđitbeaivi", "eahketbeaivi"]], [["S", "V", "M", "G", "D", "B", "L"], ["sotn", "vuos", "maŋ", "gask", "duor", "bear", "láv"], ["sotnabeaivi", "vuossárga", "maŋŋebárga", "gaskavahkku", "duorasdat", "bearjadat", "lávvardat"], ["sotn", "vuos", "maŋ", "gask", "duor", "bear", "láv"]], u, [["O", "G", "N", "C", "M", "G", "S", "B", "Č", "G", "S", "J"], ["ođđj", "guov", "njuk", "cuo", "mies", "geas", "suoi", "borg", "čakč", "golg", "skáb", "juov"], ["ođđajagemánnu", "guovvamánnu", "njukčamánnu", "cuoŋománnu", "miessemánnu", "geassemánnu", "suoidnemánnu", "borgemánnu", "čakčamánnu", "golggotmánnu", "skábmamánnu", "juovlamánnu"]], u, [["o.Kr.", "m.Kr."], u, ["ovdal Kristtusa", "maŋŋel Kristtusa"]], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "·10^", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "SEK", "kr", "ruoŧŧa kruvdno", { "DKK": ["Dkr", "kr"], "JPY": ["JP¥", "¥"], "NOK": ["Nkr", "kr"], "SEK": ["kr"], "THB": ["฿"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=se-SE.js.map]jx\/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    return 5;
}
export default ["se", [["i.b.", "e.b."], u, ["iđitbeaivet", "eahketbeaivet"]], [["i.b.", "e.b."], u, ["iđitbeaivi", "eahketbeaivi"]], [["S", "V", "M", "G", "D", "B", "L"], ["sotn", "vuos", "maŋ", "gask", "duor", "bear", "láv"], ["sotnabeaivi", "vuossárga", "maŋŋebárga", "gaskavahkku", "duorasdat", "bearjadat", "lávvardat"], ["sotn", "vuos", "maŋ", "gask", "duor", "bear", "láv"]], u, [["O", "G", "N", "C", "M", "G", "S", "B", "Č", "G", "S", "J"], ["ođđj", "guov", "njuk", "cuo", "mies", "geas", "suoi", "borg", "čakč", "golg", "skáb", "juov"], ["ođđajagemánnu", "guovvamánnu", "njukčamánnu", "cuoŋománnu", "miessemánnu", "geassemánnu", "suoidnemánnu", "borgemánnu", "čakčamánnu", "golggotmánnu", "skábmamánnu", "juovlamánnu"]], u, [["o.Kr.", "m.Kr."], u, ["ovdal Kristtusa", "maŋŋel Kristtusa"]], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "·10^", "·", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "NOK", "kr", "norgga kruvdno", { "DKK": ["Dkr", "kr"], "JPY": ["JP¥", "¥"], "NOK": ["kr"], "SEK": ["Skr", "kr"], "THB": ["฿"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=se.js.map/̷Wxw/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["seh", [["AM", "PM"], u, u], u, [["D", "P", "C", "T", "N", "S", "S"], ["Dim", "Pos", "Pir", "Tat", "Nai", "Sha", "Sab"], ["Dimingu", "Chiposi", "Chipiri", "Chitatu", "Chinai", "Chishanu", "Sabudu"], ["Dim", "Pos", "Pir", "Tat", "Nai", "Sha", "Sab"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Aug", "Set", "Otu", "Nov", "Dec"], ["Janeiro", "Fevreiro", "Marco", "Abril", "Maio", "Junho", "Julho", "Augusto", "Setembro", "Otubro", "Novembro", "Decembro"]], u, [["AC", "AD"], u, ["Antes de Cristo", "Anno Domini"]], 0, [6, 0], ["d/M/y", "d 'de' MMM 'de' y", "d 'de' MMMM 'de' y", "EEEE, d 'de' MMMM 'de' y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "MZN", "MTn", "Metical de Moçambique", { "JPY": ["JP¥", "¥"], "MZN": ["MTn"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=seh.js.mapr({zSx0/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["ses", [["Adduha", "Aluula"], u, u], u, [["H", "T", "T", "L", "L", "L", "S"], ["Alh", "Ati", "Ata", "Ala", "Alm", "Alz", "Asi"], ["Alhadi", "Atinni", "Atalaata", "Alarba", "Alhamiisa", "Alzuma", "Asibti"], ["Alh", "Ati", "Ata", "Ala", "Alm", "Alz", "Asi"]], u, [["Ž", "F", "M", "A", "M", "Ž", "Ž", "U", "S", "O", "N", "D"], ["Žan", "Fee", "Mar", "Awi", "Me", "Žuw", "Žuy", "Ut", "Sek", "Okt", "Noo", "Dee"], ["Žanwiye", "Feewiriye", "Marsi", "Awiril", "Me", "Žuweŋ", "Žuyye", "Ut", "Sektanbur", "Oktoobur", "Noowanbur", "Deesanbur"]], u, [["IJ", "IZ"], u, ["Isaa jine", "Isaa zamanoo"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "XOF", "F CFA", "CFA Fraŋ (BCEAO)", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ses.js.maptVxk/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sg", [["ND", "LK"], u, u], u, [["K", "S", "T", "S", "K", "P", "Y"], ["Bk1", "Bk2", "Bk3", "Bk4", "Bk5", "Lâp", "Lây"], ["Bikua-ôko", "Bïkua-ûse", "Bïkua-ptâ", "Bïkua-usïö", "Bïkua-okü", "Lâpôsö", "Lâyenga"], ["Bk1", "Bk2", "Bk3", "Bk4", "Bk5", "Lâp", "Lây"]], u, [["N", "F", "M", "N", "B", "F", "L", "K", "M", "N", "N", "K"], ["Nye", "Ful", "Mbä", "Ngu", "Bêl", "Fön", "Len", "Kük", "Mvu", "Ngb", "Nab", "Kak"], ["Nyenye", "Fulundïgi", "Mbängü", "Ngubùe", "Bêläwü", "Föndo", "Lengua", "Kükürü", "Mvuka", "Ngberere", "Nabändüru", "Kakauka"]], u, [["KnK", "NpK"], u, ["Kôzo na Krîstu", "Na pekô tî Krîstu"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00;¤-#,##0.00", "#E0"], "XAF", "FCFA", "farânga CFA (BEAC)", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=sg.js.mapTxH/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["shi-Latn", [["tifawt", "tadggʷat"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["asa", "ayn", "asi", "akṛ", "akw", "asim", "asiḍ"], ["asamas", "aynas", "asinas", "akṛas", "akwas", "asimwas", "asiḍyas"], ["asa", "ayn", "asi", "akṛ", "akw", "asim", "asiḍ"]], u, [["i", "b", "m", "i", "m", "y", "y", "ɣ", "c", "k", "n", "d"], ["inn", "bṛa", "maṛ", "ibr", "may", "yun", "yul", "ɣuc", "cut", "ktu", "nuw", "duj"], ["innayr", "bṛayṛ", "maṛṣ", "ibrir", "mayyu", "yunyu", "yulyuz", "ɣuct", "cutanbir", "ktubr", "nuwanbir", "dujanbir"]], u, [["daɛ", "dfɛ"], u, ["dat n ɛisa", "dffir n ɛisa"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "MAD", "MAD", "adrim n lmɣrib", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=shi-Latn.js.mapz\Ux
Vvai-Latn", [["AM", "PMw6lahadi", "tɛɛnɛɛ", "talata", "alaba", "aimisa", "aijima", "siɓiti"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["M01", "M02", "M03", "M04", "M05", "M06", "M07", "M08", "M09", "M10", "M11", "M12"], u], u, [["BCE", "C)E"], u, u], 1, [6, 0], ["dd/MM/y", "d MMM?, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a0!.", ",XV/¤#,##0.00", "#E0"], "LRD", "$", "Laibhiya Dala	LRD": ["$@vai-Latn.js.map}w{xL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    if (n === Math.floor(n) && (n >= 2 && n <= 10))
        return 3;
    return 5;
}
export default ["shi-Tfng", [["ⵜⵉⴼⴰⵡⵜ", "ⵜⴰⴷⴳⴳⵯⴰⵜ"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["ⴰⵙⴰ", "ⴰⵢⵏ", "ⴰⵙⵉ", "ⴰⴽⵕ", "ⴰⴽⵡ", "ⴰⵙⵉⵎ", "ⴰⵙⵉⴹ"], ["ⴰⵙⴰⵎⴰⵙ", "ⴰⵢⵏⴰⵙ", "ⴰⵙⵉⵏⴰⵙ", "ⴰⴽⵕⴰⵙ", "ⴰⴽⵡⴰⵙ", "ⵙⵉⵎⵡⴰⵙ", "ⴰⵙⵉⴹⵢⴰⵙ"], ["ⴰⵙⴰ", "ⴰⵢⵏ", "ⴰⵙⵉ", "ⴰⴽⵕ", "ⴰⴽⵡ", "ⴰⵙⵉⵎ", "ⴰⵙⵉⴹ"]], u, [["ⵉ", "ⴱ", "ⵎ", "ⵉ", "ⵎ", "ⵢ", "ⵢ", "ⵖ", "ⵛ", "ⴽ", "ⵏ", "ⴷ"], ["ⵉⵏⵏ", "ⴱⵕⴰ", "ⵎⴰⵕ", "ⵉⴱⵔ", "ⵎⴰⵢ", "ⵢⵓⵏ", "ⵢⵓⵍ", "ⵖⵓⵛ", "ⵛⵓⵜ", "ⴽⵜⵓ", "ⵏⵓⵡ", "ⴷⵓⵊ"], ["ⵉⵏⵏⴰⵢⵔ", "ⴱⵕⴰⵢⵕ", "ⵎⴰⵕⵚ", "ⵉⴱⵔⵉⵔ", "ⵎⴰⵢⵢⵓ", "ⵢⵓⵏⵢⵓ", "ⵢⵓⵍⵢⵓⵣ", "ⵖⵓⵛⵜ", "ⵛⵓⵜⴰⵏⴱⵉⵔ", "ⴽⵜⵓⴱⵔ", "ⵏⵓⵡⴰⵏⴱⵉⵔ", "ⴷⵓⵊⴰⵏⴱⵉⵔ"]], u, [["ⴷⴰⵄ", "ⴷⴼⵄ"], u, ["ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ", "ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "MAD", "MAD", "ⴰⴷⵔⵉⵎ ⵏ ⵍⵎⵖⵔⵉⴱ", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=shi-Tfng.js.mapZ3zxV/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val));
    if (i === 0 || n === 1)
        return 1;
    if (n === Math.floor(n) && (n >= 2 && n <= 10))
        return 3;
    return 5;
}
export default ["shi", [["ⵜⵉⴼⴰⵡⵜ", "ⵜⴰⴷⴳⴳⵯⴰⵜ"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["ⴰⵙⴰ", "ⴰⵢⵏ", "ⴰⵙⵉ", "ⴰⴽⵕ", "ⴰⴽⵡ", "ⴰⵙⵉⵎ", "ⴰⵙⵉⴹ"], ["ⴰⵙⴰⵎⴰⵙ", "ⴰⵢⵏⴰⵙ", "ⴰⵙⵉⵏⴰⵙ", "ⴰⴽⵕⴰⵙ", "ⴰⴽⵡⴰⵙ", "ⵙⵉⵎⵡⴰⵙ", "ⴰⵙⵉⴹⵢⴰⵙ"], ["ⴰⵙⴰ", "ⴰⵢⵏ", "ⴰⵙⵉ", "ⴰⴽⵕ", "ⴰⴽⵡ", "ⴰⵙⵉⵎ", "ⴰⵙⵉⴹ"]], u, [["ⵉ", "ⴱ", "ⵎ", "ⵉ", "ⵎ", "ⵢ", "ⵢ", "ⵖ", "ⵛ", "ⴽ", "ⵏ", "ⴷ"], ["ⵉⵏⵏ", "ⴱⵕⴰ", "ⵎⴰⵕ", "ⵉⴱⵔ", "ⵎⴰⵢ", "ⵢⵓⵏ", "ⵢⵓⵍ", "ⵖⵓⵛ", "ⵛⵓⵜ", "ⴽⵜⵓ", "ⵏⵓⵡ", "ⴷⵓⵊ"], ["ⵉⵏⵏⴰⵢⵔ", "ⴱⵕⴰⵢⵕ", "ⵎⴰⵕⵚ", "ⵉⴱⵔⵉⵔ", "ⵎⴰⵢⵢⵓ", "ⵢⵓⵏⵢⵓ", "ⵢⵓⵍⵢⵓⵣ", "ⵖⵓⵛⵜ", "ⵛⵓⵜⴰⵏⴱⵉⵔ", "ⴽⵜⵓⴱⵔ", "ⵏⵓⵡⴰⵏⴱⵉⵔ", "ⴷⵓⵊⴰⵏⴱⵉⵔ"]], u, [["ⴷⴰⵄ", "ⴷⴼⵄ"], u, ["ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ", "ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "MAD", "MAD", "ⴰⴷⵔⵉⵎ ⵏ ⵍⵎⵖⵔⵉⴱ", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=shi.js.mapVxN/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (n === 0 || n === 1 || i === 0 && f === 1)
        return 1;
    return 5;
}
export default ["si", [["පෙ", "ප"], ["පෙ.ව.", "ප.ව."], u], [["පෙ.ව.", "ප.ව."], u, u], [["ඉ", "ස", "අ", "බ", "බ්‍ර", "සි", "සෙ"], ["ඉරිදා", "සඳුදා", "අඟහ", "බදාදා", "බ්‍රහස්", "සිකු", "සෙන"], ["ඉරිදා", "සඳුදා", "අඟහරුවාදා", "බදාදා", "බ්‍රහස්පතින්දා", "සිකුරාදා", "සෙනසුරාදා"], ["ඉරි", "සඳු", "අඟ", "බදා", "බ්‍රහ", "සිකු", "සෙන"]], u, [["ජ", "පෙ", "මා", "අ", "මැ", "ජූ", "ජූ", "අ", "සැ", "ඔ", "නෙ", "දෙ"], ["ජන", "පෙබ", "මාර්තු", "අප්‍රේල්", "මැයි", "ජූනි", "ජූලි", "අගෝ", "සැප්", "ඔක්", "නොවැ", "දෙසැ"], ["ජනවාරි", "පෙබරවාරි", "මාර්තු", "අප්‍රේල්", "මැයි", "ජූනි", "ජූලි", "අගෝස්තු", "සැප්තැම්බර්", "ඔක්තෝබර්", "නොවැම්බර්", "දෙසැම්බර්"]], [["ජ", "පෙ", "මා", "අ", "මැ", "ජූ", "ජූ", "අ", "සැ", "ඔ", "නෙ", "දෙ"], ["ජන", "පෙබ", "මාර්", "අප්‍රේල්", "මැයි", "ජූනි", "ජූලි", "අගෝ", "සැප්", "ඔක්", "නොවැ", "දෙසැ"], ["ජනවාරි", "පෙබරවාරි", "මාර්තු", "අප්‍රේල්", "මැයි", "ජූනි", "ජූලි", "අගෝස්තු", "සැප්තැම්බර්", "ඔක්තෝබර්", "නොවැම්බර්", "දෙසැම්බර්"]], [["ක්‍රි.පූ.", "ක්‍රි.ව."], u, ["ක්‍රිස්තු පූර්ව", "ක්‍රිස්තු වර්ෂ"]], 1, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH.mm", "HH.mm.ss", "HH.mm.ss z", "HH.mm.ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0%", "¤#,##0.00", "#"], "LKR", "රු.", "ශ්‍රී ලංකා රුපියල", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "LKR": ["රු."], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XOF": ["සිෆ්එ"] }, "ltr", plural];
//# sourceMappingURL=si.js.mapmxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    if (i === Math.floor(i) && (i >= 2 && i <= 4) && v === 0)
        return 3;
    if (!(v === 0))
        return 4;
    return 5;
}
export default ["sk", [["AM", "PM"], u, u], u, [["n", "p", "u", "s", "š", "p", "s"], ["ne", "po", "ut", "st", "št", "pi", "so"], ["nedeľa", "pondelok", "utorok", "streda", "štvrtok", "piatok", "sobota"], ["ne", "po", "ut", "st", "št", "pi", "so"]], u, [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mar", "apr", "máj", "jún", "júl", "aug", "sep", "okt", "nov", "dec"], ["januára", "februára", "marca", "apríla", "mája", "júna", "júla", "augusta", "septembra", "októbra", "novembra", "decembra"]], [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mar", "apr", "máj", "jún", "júl", "aug", "sep", "okt", "nov", "dec"], ["január", "február", "marec", "apríl", "máj", "jún", "júl", "august", "september", "október", "november", "december"]], [["pred Kr.", "po Kr."], u, ["pred Kristom", "po Kristovi"]], 1, [6, 0], ["d. M. y", u, "d. MMMM y", "EEEE d. MMMM y"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1} {0}", "{1}, {0}", u, u], [",", " ", ";", "%", "+", "-", "e", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": ["NIS", "₪"], "INR": [u, "₹"], "JPY": [u, "¥"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "RUR": [u, "р."], "TWD": [u, "NT$"], "USD": [u, "$"], "VND": [u, "₫"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=sk.js.mapu]QtxE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && i % 100 === 1)
        return 1;
    if (v === 0 && i % 100 === 2)
        return 2;
    if (v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 3 && i % 100 <= 4)) || !(v === 0))
        return 3;
    return 5;
}
export default ["sl", [["d", "p"], ["dop.", "pop."], u], [["d", "p"], ["dop.", "pop."], ["dopoldne", "popoldne"]], [["n", "p", "t", "s", "č", "p", "s"], ["ned.", "pon.", "tor.", "sre.", "čet.", "pet.", "sob."], ["nedelja", "ponedeljek", "torek", "sreda", "četrtek", "petek", "sobota"], ["ned.", "pon.", "tor.", "sre.", "čet.", "pet.", "sob."]], u, [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan.", "feb.", "mar.", "apr.", "maj", "jun.", "jul.", "avg.", "sep.", "okt.", "nov.", "dec."], ["januar", "februar", "marec", "april", "maj", "junij", "julij", "avgust", "september", "oktober", "november", "december"]], u, [["pr. Kr.", "po Kr."], u, ["pred Kristusom", "po Kristusu"]], 1, [6, 0], ["d. MM. yy", "d. MMM y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} {0}", u], [",", ".", ";", "%", "+", "−", "e", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "evro", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "GBP": [u, "£"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": [u, "NT$"], "XCD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=sl.js.mapNgpx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    if (n === 2)
        return 2;
    return 5;
}
export default ["smn", [["ip.", "ep."], u, u], u, [["p", "V", "M", "K", "T", "V", "L"], ["pas", "vuo", "maj", "kos", "tuo", "vás", "láv"], ["pasepeeivi", "vuossaargâ", "majebaargâ", "koskoho", "tuorâstuv", "vástuppeeivi", "lávurduv"], ["pa", "vu", "ma", "ko", "tu", "vá", "lá"]], [["S", "M", "T", "W", "T", "F", "S"], ["pas", "vuo", "maj", "kos", "tuo", "vás", "láv"], ["pasepeivi", "vuossargâ", "majebargâ", "koskokko", "tuorâstâh", "vástuppeivi", "lávurdâh"], ["pa", "vu", "ma", "ko", "tu", "vá", "lá"]], [["U", "K", "NJ", "C", "V", "K", "S", "P", "Č", "R", "S", "J"], ["uđiv", "kuovâ", "njuhčâ", "cuáŋui", "vyesi", "kesi", "syeini", "porge", "čohčâ", "roovvâd", "skammâ", "juovlâ"], ["uđđâivemáánu", "kuovâmáánu", "njuhčâmáánu", "cuáŋuimáánu", "vyesimáánu", "kesimáánu", "syeinimáánu", "porgemáánu", "čohčâmáánu", "roovvâdmáánu", "skammâmáánu", "juovlâmáánu"]], u, [["oKr.", "mKr."], u, ["Ovdil Kristus šoddâm", "maŋa Kristus šoddâm"]], 1, [6, 0], ["d.M.y", "MMM d. y", "MMMM d. y", "cccc, MMMM d. y"], ["H.mm", "H.mm.ss", "H.mm.ss z", "H.mm.ss zzzz"], ["{1} {0}", "{1} 'tme' {0}", u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "epiloho", "."], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=smn.js.mapcv:xC{"version":3,"file":"smn.js","sourceRoot":"","sources":["smn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,KAAK,EAAC,CAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,YAAY,EAAC,YAAY,EAAC,YAAY,EAAC,SAAS,EAAC,WAAW,EAAC,cAAc,EAAC,UAAU,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,WAAW,EAAC,WAAW,EAAC,WAAW,EAAC,UAAU,EAAC,WAAW,EAAC,aAAa,EAAC,UAAU,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,cAAc,EAAC,YAAY,EAAC,aAAa,EAAC,aAAa,EAAC,YAAY,EAAC,WAAW,EAAC,aAAa,EAAC,YAAY,EAAC,YAAY,EAAC,cAAc,EAAC,aAAa,EAAC,aAAa,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,sBAAsB,EAAC,qBAAqB,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,EAAC,WAAW,EAAC,cAAc,CAAC,EAAC,CAAC,SAAS,EAAC,eAAe,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,SAAS,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,SAAS,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,MAAM,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nif (n === 2)\n    return 2;\nreturn 5;\n}\n\nexport default [\"smn\",[[\"ip.\",\"ep.\"],u,u],u,[[\"p\",\"V\",\"M\",\"K\",\"T\",\"V\",\"L\"],[\"pas\",\"vuo\",\"maj\",\"kos\",\"tuo\",\"vás\",\"láv\"],[\"pasepeeivi\",\"vuossaargâ\",\"majebaargâ\",\"koskoho\",\"tuorâstuv\",\"vástuppeeivi\",\"lávurduv\"],[\"pa\",\"vu\",\"ma\",\"ko\",\"tu\",\"vá\",\"lá\"]],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"pas\",\"vuo\",\"maj\",\"kos\",\"tuo\",\"vás\",\"láv\"],[\"pasepeivi\",\"vuossargâ\",\"majebargâ\",\"koskokko\",\"tuorâstâh\",\"vástuppeivi\",\"lávurdâh\"],[\"pa\",\"vu\",\"ma\",\"ko\",\"tu\",\"vá\",\"lá\"]],[[\"U\",\"K\",\"NJ\",\"C\",\"V\",\"K\",\"S\",\"P\",\"Č\",\"R\",\"S\",\"J\"],[\"uđiv\",\"kuovâ\",\"njuhčâ\",\"cuáŋui\",\"vyesi\",\"kesi\",\"syeini\",\"porge\",\"čohčâ\",\"roovvâd\",\"skammâ\",\"juovlâ\"],[\"uđđâivemáánu\",\"kuovâmáánu\",\"njuhčâmáánu\",\"cuáŋuimáánu\",\"vyesimáánu\",\"kesimáánu\",\"syeinimáánu\",\"porgemáánu\",\"čohčâmáánu\",\"roovvâdmáánu\",\"skammâmáánu\",\"juovlâmáánu\"]],u,[[\"oKr.\",\"mKr.\"],u,[\"Ovdil Kristus šoddâm\",\"maŋa Kristus šoddâm\"]],1,[6,0],[\"d.M.y\",\"MMM d. y\",\"MMMM d. y\",\"cccc, MMMM d. y\"],[\"H.mm\",\"H.mm.ss\",\"H.mm.ss z\",\"H.mm.ss zzzz\"],[\"{1} {0}\",\"{1} 'tme' {0}\",u,u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"epiloho\",\".\"],[\"#,##0.###\",\"#,##0 %\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"euro\",{\"JPY\":[\"JP¥\",\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}<x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["so-ET", [["h", "d"], ["GH", "GD"], u], [["AM", "GD"], u, ["GH", "GD"]], [["A", "I", "T", "A", "Kh", "J", "S"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"], ["Axad", "Isniin", "Talaado", "Arbaco", "Khamiis", "Jimco", "Sabti"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"]], [["A", "I", "T", "A", "Kh", "J", "S"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"], ["Axad", "Isniin", "Talaado", "Arbaco", "Khamiis", "Jimco", "Sabti"], ["Axd", "Isn", "Tldo", "Arbaco", "Khms", "Jmc", "Sbti"]], [["J", "F", "M", "A", "M", "J", "L", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "May", "Jun", "Lul", "Ogs", "Seb", "Okt", "Nof", "Dis"], ["Bisha Koobaad", "Bisha Labaad", "Bisha Saddexaad", "Bisha Afraad", "Bisha Shanaad", "Bisha Lixaad", "Bisha Todobaad", "Bisha Sideedaad", "Bisha Sagaalaad", "Bisha Tobnaad", "Bisha Kow iyo Tobnaad", "Bisha Laba iyo Tobnaad"]], [["J", "F", "M", "A", "M", "J", "L", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "May", "Jun", "Lul", "Ogs", "Seb", "Okt", "Nof", "Dis"], ["Jannaayo", "Febraayo", "Maarso", "Abriil", "May", "Juun", "Luuliyo", "Ogost", "Sebtembar", "Oktoobar", "Nofembar", "Desembar"]], [["B", "A"], ["BC", "AD"], ["Ciise Hortii", "Ciise Dabadii"]], 0, [6, 0], ["dd/MM/yy", "dd-MMM-y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1} 'ee' {0}", u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "MaL", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ETB", "Br", "Birta Itoobbiya", { "BBD": ["DBB", "$"], "ETB": ["Br"], "JPY": ["JP¥", "¥"], "SOS": ["S"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=so-ET.js.map*]x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["so-KE", [["h", "d"], ["GH", "GD"], u], [["AM", "GD"], u, ["GH", "GD"]], [["A", "I", "T", "A", "Kh", "J", "S"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"], ["Axad", "Isniin", "Talaado", "Arbaco", "Khamiis", "Jimco", "Sabti"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"]], [["A", "I", "T", "A", "Kh", "J", "S"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"], ["Axad", "Isniin", "Talaado", "Arbaco", "Khamiis", "Jimco", "Sabti"], ["Axd", "Isn", "Tldo", "Arbaco", "Khms", "Jmc", "Sbti"]], [["J", "F", "M", "A", "M", "J", "L", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "May", "Jun", "Lul", "Ogs", "Seb", "Okt", "Nof", "Dis"], ["Bisha Koobaad", "Bisha Labaad", "Bisha Saddexaad", "Bisha Afraad", "Bisha Shanaad", "Bisha Lixaad", "Bisha Todobaad", "Bisha Sideedaad", "Bisha Sagaalaad", "Bisha Tobnaad", "Bisha Kow iyo Tobnaad", "Bisha Laba iyo Tobnaad"]], [["J", "F", "M", "A", "M", "J", "L", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "May", "Jun", "Lul", "Ogs", "Seb", "Okt", "Nof", "Dis"], ["Jannaayo", "Febraayo", "Maarso", "Abriil", "May", "Juun", "Luuliyo", "Ogost", "Sebtembar", "Oktoobar", "Nofembar", "Desembar"]], [["B", "A"], ["BC", "AD"], ["Ciise Hortii", "Ciise Dabadii"]], 0, [6, 0], ["dd/MM/yy", "dd-MMM-y", "MMMM d, y", "EEEE, MMMM d, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", "{1} 'ee' {0}", u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "MaL", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Shilingka Kenya", { "BBD": ["DBB", "$"], "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "SOS": ["S"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=so-KE.js.map)ٲx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["so", [["h", "d"], ["GH", "GD"], u], [["AM", "GD"], u, ["GH", "GD"]], [["A", "I", "T", "A", "Kh", "J", "S"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"], ["Axad", "Isniin", "Talaado", "Arbaco", "Khamiis", "Jimco", "Sabti"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"]], [["A", "I", "T", "A", "Kh", "J", "S"], ["Axd", "Isn", "Tldo", "Arbc", "Khms", "Jmc", "Sbti"], ["Axad", "Isniin", "Talaado", "Arbaco", "Khamiis", "Jimco", "Sabti"], ["Axd", "Isn", "Tldo", "Arbaco", "Khms", "Jmc", "Sbti"]], [["J", "F", "M", "A", "M", "J", "L", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "May", "Jun", "Lul", "Ogs", "Seb", "Okt", "Nof", "Dis"], ["Bisha Koobaad", "Bisha Labaad", "Bisha Saddexaad", "Bisha Afraad", "Bisha Shanaad", "Bisha Lixaad", "Bisha Todobaad", "Bisha Sideedaad", "Bisha Sagaalaad", "Bisha Tobnaad", "Bisha Kow iyo Tobnaad", "Bisha Laba iyo Tobnaad"]], [["J", "F", "M", "A", "M", "J", "L", "O", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Abr", "May", "Jun", "Lul", "Ogs", "Seb", "Okt", "Nof", "Dis"], ["Jannaayo", "Febraayo", "Maarso", "Abriil", "May", "Juun", "Luuliyo", "Ogost", "Sebtembar", "Oktoobar", "Nofembar", "Desembar"]], [["B", "A"], ["BC", "AD"], ["Ciise Hortii", "Ciise Dabadii"]], 1, [6, 0], ["dd/MM/yy", "dd-MMM-y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1} 'ee' {0}", u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "MaL", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "SOS", "S", "Shilingka Soomaaliya", { "BBD": ["DBB", "$"], "JPY": ["JP¥", "¥"], "SOS": ["S"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=so.js.mapM'+xr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    AFN: never[];
    ALL: string[];
    AMD: never[];
    AOA: never[];
    ARS: never[];
    AUD: string[];
    AZN: never[];
    BAM: never[];
    BBD: never[];
    BDT: never[];
    BMD: never[];
    BND: never[];
    BOB: never[];
    BRL: never[];
    BSD: never[];
    BWP: never[];
    BZD: never[];
    CAD: string[];
    CLP: never[];
    CNY: string[];
    COP: never[];
    CRC: never[];
    CUC: never[];
    CUP: never[];
    CZK: never[];
    DKK: never[];
    DOP: never[];
    EGP: never[];
    FJD: never[];
    FKP: never[];
    GBP: string[];
    GEL: never[];
    GIP: never[];
    GNF: never[];
    GTQ: never[];
    GYD: never[];
    HKD: string[];
    HNL: never[];
    HRK: never[];
    HUF: never[];
    IDR: never[];
    ILS: string[];
    INR: string[];
    ISK: never[];
    JMD: never[];
    JPY: string[];
    KHR: never[];
    KMF: never[];
    KPW: never[];
    KRW: string[];
    KYD: never[];
    KZT: never[];
    LAK: never[];
    LBP: never[];
    LKR: never[];
    LRD: never[];
    MGA: never[];
    MKD: string[];
    MMK: never[];
    MNT: never[];
    MUR: never[];
    MXN: string[];
    MYR: never[];
    NAD: never[];
    NGN: never[];
    NIO: never[];
    NOK: never[];
    NPR: never[];
    NZD: string[];
    PHP: never[];
    PKR: never[];
    PLN: never[];
    PYG: never[];
    RON: never[];
    RUB: never[];
    RWF: never[];
    SBD: never[];
    SEK: never[];
    SGD: never[];
    SHP: never[];
    SRD: never[];
    SSP: never[];
    STN: never[];
    SYP: never[];
    THB: string[];
    TOP: never[];
    TRY: never[];
    TTD: never[];
    TWD: string[];
    UAH: never[];
    USD: string[];
    UYU: never[];
    VND: string[];
    XCD: string[];
    ZAR: never[];
    ZMW: never[];
} | undefined)[];
export default _default;
hֽx]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["sq-MK", [["p.d.", "m.d."], u, ["e paradites", "e pasdites"]], [["p.d.", "m.d."], u, ["paradite", "pasdite"]], [["d", "h", "m", "m", "e", "p", "sh"], ["Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Sht"], ["e diel", "e hënë", "e martë", "e mërkurë", "e enjte", "e premte", "e shtunë"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"]], [["d", "h", "m", "m", "e", "p", "sh"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"], ["e diel", "e hënë", "e martë", "e mërkurë", "e enjte", "e premte", "e shtunë"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"]], [["j", "sh", "m", "p", "m", "q", "k", "g", "sh", "t", "n", "dh"], ["jan", "shk", "mar", "pri", "maj", "qer", "korr", "gush", "sht", "tet", "nën", "dhj"], ["janar", "shkurt", "mars", "prill", "maj", "qershor", "korrik", "gusht", "shtator", "tetor", "nëntor", "dhjetor"]], u, [["p.K.", "mb.K."], u, ["para Krishtit", "mbas Krishtit"]], 1, [6, 0], ["d.M.yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'në' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "MKD", "den", "Denari maqedonas", { "AFN": [], "ALL": ["Lekë"], "AMD": [], "AOA": [], "ARS": [], "AUD": ["A$", "AUD"], "AZN": [], "BAM": [], "BBD": [], "BDT": [], "BMD": [], "BND": [], "BOB": [], "BRL": [], "BSD": [], "BWP": [], "BZD": [], "CAD": ["CA$", "CAD"], "CLP": [], "CNY": ["CN¥", "CNY"], "COP": [], "CRC": [], "CUC": [], "CUP": [], "CZK": [], "DKK": [], "DOP": [], "EGP": [], "FJD": [], "FKP": [], "GBP": ["£", "GBP"], "GEL": [], "GIP": [], "GNF": [], "GTQ": [], "GYD": [], "HKD": ["HK$", "HKS"], "HNL": [], "HRK": [], "HUF": [], "IDR": [], "ILS": ["₪", "ILS"], "INR": ["₹", "INR"], "ISK": [], "JMD": [], "JPY": ["JP¥", "JPY"], "KHR": [], "KMF": [], "KPW": [], "KRW": ["₩", "KRW"], "KYD": [], "KZT": [], "LAK": [], "LBP": [], "LKR": [], "LRD": [], "MGA": [], "MKD": ["den"], "MMK": [], "MNT": [], "MUR": [], "MXN": ["MX$", "MXN"], "MYR": [], "NAD": [], "NGN": [], "NIO": [], "NOK": [], "NPR": [], "NZD": ["NZ$", "NZD"], "PHP": [], "PKR": [], "PLN": [], "PYG": [], "RON": [], "RUB": [], "RWF": [], "SBD": [], "SEK": [], "SGD": [], "SHP": [], "SRD": [], "SSP": [], "STN": [], "SYP": [], "THB": ["฿", "THB"], "TOP": [], "TRY": [], "TTD": [], "TWD": ["NT$", "TWD"], "UAH": [], "USD": ["US$", "USD"], "UYU": [], "VND": ["₫", "VND"], "XCD": ["EC$", "XCD"], "ZAR": [], "ZMW": [] }, "ltr", plural];
//# sourceMappingURL=sq-MK.js.mapY=x_/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare function plural(val: number): number;
declare const _default: (string | number | number[] | (string | undefined)[] | typeof plural | (string[] | undefined)[] | {
    AFN: never[];
    ALL: string[];
    AMD: never[];
    AOA: never[];
    ARS: never[];
    AUD: string[];
    AZN: never[];
    BAM: never[];
    BBD: never[];
    BDT: never[];
    BMD: never[];
    BND: never[];
    BOB: never[];
    BRL: never[];
    BSD: never[];
    BWP: never[];
    BZD: never[];
    CAD: string[];
    CLP: never[];
    CNY: string[];
    COP: never[];
    CRC: never[];
    CUC: never[];
    CUP: never[];
    CZK: never[];
    DKK: never[];
    DOP: never[];
    EGP: never[];
    FJD: never[];
    FKP: never[];
    GBP: string[];
    GEL: never[];
    GIP: never[];
    GNF: never[];
    GTQ: never[];
    GYD: never[];
    HKD: string[];
    HNL: never[];
    HRK: never[];
    HUF: never[];
    IDR: never[];
    ILS: string[];
    INR: string[];
    ISK: never[];
    JMD: never[];
    JPY: string[];
    KHR: never[];
    KMF: never[];
    KPW: never[];
    KRW: string[];
    KYD: never[];
    KZT: never[];
    LAK: never[];
    LBP: never[];
    LKR: never[];
    LRD: never[];
    MGA: never[];
    MMK: never[];
    MNT: never[];
    MUR: never[];
    MXN: string[];
    MYR: never[];
    NAD: never[];
    NGN: never[];
    NIO: never[];
    NOK: never[];
    NPR: never[];
    NZD: string[];
    PHP: never[];
    PKR: never[];
    PLN: never[];
    PYG: never[];
    RON: never[];
    RUB: never[];
    RWF: never[];
    SBD: never[];
    SEK: never[];
    SGD: never[];
    SHP: never[];
    SRD: never[];
    SSP: never[];
    STN: never[];
    SYP: never[];
    THB: string[];
    TOP: never[];
    TRY: never[];
    TTD: never[];
    TWD: string[];
    UAH: never[];
    USD: string[];
    UYU: never[];
    VND: string[];
    XCD: string[];
    ZAR: never[];
    ZMW: never[];
} | undefined)[];
export default _default;
GcxC/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["sq-XK", [["p.d.", "m.d."], u, ["e paradites", "e pasdites"]], [["p.d.", "m.d."], u, ["paradite", "pasdite"]], [["d", "h", "m", "m", "e", "p", "sh"], ["Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Sht"], ["e diel", "e hënë", "e martë", "e mërkurë", "e enjte", "e premte", "e shtunë"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"]], [["d", "h", "m", "m", "e", "p", "sh"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"], ["e diel", "e hënë", "e martë", "e mërkurë", "e enjte", "e premte", "e shtunë"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"]], [["j", "sh", "m", "p", "m", "q", "k", "g", "sh", "t", "n", "dh"], ["jan", "shk", "mar", "pri", "maj", "qer", "korr", "gush", "sht", "tet", "nën", "dhj"], ["janar", "shkurt", "mars", "prill", "maj", "qershor", "korrik", "gusht", "shtator", "tetor", "nëntor", "dhjetor"]], u, [["p.K.", "mb.K."], u, ["para Krishtit", "mbas Krishtit"]], 1, [6, 0], ["d.M.yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'në' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "Euroja", { "AFN": [], "ALL": ["Lekë"], "AMD": [], "AOA": [], "ARS": [], "AUD": ["A$", "AUD"], "AZN": [], "BAM": [], "BBD": [], "BDT": [], "BMD": [], "BND": [], "BOB": [], "BRL": [], "BSD": [], "BWP": [], "BZD": [], "CAD": ["CA$", "CAD"], "CLP": [], "CNY": ["CN¥", "CNY"], "COP": [], "CRC": [], "CUC": [], "CUP": [], "CZK": [], "DKK": [], "DOP": [], "EGP": [], "FJD": [], "FKP": [], "GBP": ["£", "GBP"], "GEL": [], "GIP": [], "GNF": [], "GTQ": [], "GYD": [], "HKD": ["HK$", "HKS"], "HNL": [], "HRK": [], "HUF": [], "IDR": [], "ILS": ["₪", "ILS"], "INR": ["₹", "INR"], "ISK": [], "JMD": [], "JPY": ["JP¥", "JPY"], "KHR": [], "KMF": [], "KPW": [], "KRW": ["₩", "KRW"], "KYD": [], "KZT": [], "LAK": [], "LBP": [], "LKR": [], "LRD": [], "MGA": [], "MMK": [], "MNT": [], "MUR": [], "MXN": ["MX$", "MXN"], "MYR": [], "NAD": [], "NGN": [], "NIO": [], "NOK": [], "NPR": [], "NZD": ["NZ$", "NZD"], "PHP": [], "PKR": [], "PLN": [], "PYG": [], "RON": [], "RUB": [], "RWF": [], "SBD": [], "SEK": [], "SGD": [], "SHP": [], "SRD": [], "SSP": [], "STN": [], "SYP": [], "THB": ["฿", "THB"], "TOP": [], "TRY": [], "TTD": [], "TWD": ["NT$", "TWD"], "UAH": [], "USD": ["US$", "USD"], "UYU": [], "VND": ["₫", "VND"], "XCD": ["EC$", "XCD"], "ZAR": [], "ZMW": [] }, "ltr", plural];
//# sourceMappingURL=sq-XK.js.map9jnxB{"version":3,"file":"sq-XK.js","sourceRoot":"","sources":["sq-XK.ts"],"names":[],"mappings":"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C,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"sq-XK\",[[\"p.d.\",\"m.d.\"],u,[\"e paradites\",\"e pasdites\"]],[[\"p.d.\",\"m.d.\"],u,[\"paradite\",\"pasdite\"]],[[\"d\",\"h\",\"m\",\"m\",\"e\",\"p\",\"sh\"],[\"Die\",\"Hën\",\"Mar\",\"Mër\",\"Enj\",\"Pre\",\"Sht\"],[\"e diel\",\"e hënë\",\"e martë\",\"e mërkurë\",\"e enjte\",\"e premte\",\"e shtunë\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"]],[[\"d\",\"h\",\"m\",\"m\",\"e\",\"p\",\"sh\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"],[\"e diel\",\"e hënë\",\"e martë\",\"e mërkurë\",\"e enjte\",\"e premte\",\"e shtunë\"],[\"die\",\"hën\",\"mar\",\"mër\",\"enj\",\"pre\",\"sht\"]],[[\"j\",\"sh\",\"m\",\"p\",\"m\",\"q\",\"k\",\"g\",\"sh\",\"t\",\"n\",\"dh\"],[\"jan\",\"shk\",\"mar\",\"pri\",\"maj\",\"qer\",\"korr\",\"gush\",\"sht\",\"tet\",\"nën\",\"dhj\"],[\"janar\",\"shkurt\",\"mars\",\"prill\",\"maj\",\"qershor\",\"korrik\",\"gusht\",\"shtator\",\"tetor\",\"nëntor\",\"dhjetor\"]],u,[[\"p.K.\",\"mb.K.\"],u,[\"para Krishtit\",\"mbas Krishtit\"]],1,[6,0],[\"d.M.yy\",\"d MMM y\",\"d MMMM y\",\"EEEE, d MMMM y\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} 'në' {0}\",u],[\",\",\" \",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"EUR\",\"€\",\"Euroja\",{\"AFN\":[],\"ALL\":[\"Lekë\"],\"AMD\":[],\"AOA\":[],\"ARS\":[],\"AUD\":[\"A$\",\"AUD\"],\"AZN\":[],\"BAM\":[],\"BBD\":[],\"BDT\":[],\"BMD\":[],\"BND\":[],\"BOB\":[],\"BRL\":[],\"BSD\":[],\"BWP\":[],\"BZD\":[],\"CAD\":[\"CA$\",\"CAD\"],\"CLP\":[],\"CNY\":[\"CN¥\",\"CNY\"],\"COP\":[],\"CRC\":[],\"CUC\":[],\"CUP\":[],\"CZK\":[],\"DKK\":[],\"DOP\":[],\"EGP\":[],\"FJD\":[],\"FKP\":[],\"GBP\":[\"£\",\"GBP\"],\"GEL\":[],\"GIP\":[],\"GNF\":[],\"GTQ\":[],\"GYD\":[],\"HKD\":[\"HK$\",\"HKS\"],\"HNL\":[],\"HRK\":[],\"HUF\":[],\"IDR\":[],\"ILS\":[\"₪\",\"ILS\"],\"INR\":[\"₹\",\"INR\"],\"ISK\":[],\"JMD\":[],\"JPY\":[\"JP¥\",\"JPY\"],\"KHR\":[],\"KMF\":[],\"KPW\":[],\"KRW\":[\"₩\",\"KRW\"],\"KYD\":[],\"KZT\":[],\"LAK\":[],\"LBP\":[],\"LKR\":[],\"LRD\":[],\"MGA\":[],\"MMK\":[],\"MNT\":[],\"MUR\":[],\"MXN\":[\"MX$\",\"MXN\"],\"MYR\":[],\"NAD\":[],\"NGN\":[],\"NIO\":[],\"NOK\":[],\"NPR\":[],\"NZD\":[\"NZ$\",\"NZD\"],\"PHP\":[],\"PKR\":[],\"PLN\":[],\"PYG\":[],\"RON\":[],\"RUB\":[],\"RWF\":[],\"SBD\":[],\"SEK\":[],\"SGD\":[],\"SHP\":[],\"SRD\":[],\"SSP\":[],\"STN\":[],\"SYP\":[],\"THB\":[\"฿\",\"THB\"],\"TOP\":[],\"TRY\":[],\"TTD\":[],\"TWD\":[\"NT$\",\"TWD\"],\"UAH\":[],\"USD\":[\"US$\",\"USD\"],\"UYU\":[],\"VND\":[\"₫\",\"VND\"],\"XCD\":[\"EC$\",\"XCD\"],\"ZAR\":[],\"ZMW\":[]},\"ltr\", plural];\n"]}ExL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["sq", [["p.d.", "m.d."], u, ["e paradites", "e pasdites"]], [["p.d.", "m.d."], u, ["paradite", "pasdite"]], [["d", "h", "m", "m", "e", "p", "sh"], ["Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Sht"], ["e diel", "e hënë", "e martë", "e mërkurë", "e enjte", "e premte", "e shtunë"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"]], [["d", "h", "m", "m", "e", "p", "sh"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"], ["e diel", "e hënë", "e martë", "e mërkurë", "e enjte", "e premte", "e shtunë"], ["die", "hën", "mar", "mër", "enj", "pre", "sht"]], [["j", "sh", "m", "p", "m", "q", "k", "g", "sh", "t", "n", "dh"], ["jan", "shk", "mar", "pri", "maj", "qer", "korr", "gush", "sht", "tet", "nën", "dhj"], ["janar", "shkurt", "mars", "prill", "maj", "qershor", "korrik", "gusht", "shtator", "tetor", "nëntor", "dhjetor"]], u, [["p.K.", "mb.K."], u, ["para Krishtit", "mbas Krishtit"]], 1, [6, 0], ["d.M.yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a, z", "h:mm:ss a, zzzz"], ["{1}, {0}", u, "{1} 'në' {0}", u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "ALL", "Lekë", "Leku shqiptar", { "AFN": [], "ALL": ["Lekë"], "AMD": [], "AOA": [], "ARS": [], "AUD": ["A$", "AUD"], "AZN": [], "BAM": [], "BBD": [], "BDT": [], "BMD": [], "BND": [], "BOB": [], "BRL": [], "BSD": [], "BWP": [], "BZD": [], "CAD": ["CA$", "CAD"], "CLP": [], "CNY": ["CN¥", "CNY"], "COP": [], "CRC": [], "CUC": [], "CUP": [], "CZK": [], "DKK": [], "DOP": [], "EGP": [], "FJD": [], "FKP": [], "GBP": ["£", "GBP"], "GEL": [], "GIP": [], "GNF": [], "GTQ": [], "GYD": [], "HKD": ["HK$", "HKS"], "HNL": [], "HRK": [], "HUF": [], "IDR": [], "ILS": ["₪", "ILS"], "INR": ["₹", "INR"], "ISK": [], "JMD": [], "JPY": ["JP¥", "JPY"], "KHR": [], "KMF": [], "KPW": [], "KRW": ["₩", "KRW"], "KYD": [], "KZT": [], "LAK": [], "LBP": [], "LKR": [], "LRD": [], "MGA": [], "MMK": [], "MNT": [], "MUR": [], "MXN": ["MX$", "MXN"], "MYR": [], "NAD": [], "NGN": [], "NIO": [], "NOK": [], "NPR": [], "NZD": ["NZ$", "NZD"], "PHP": [], "PKR": [], "PLN": [], "PYG": [], "RON": [], "RUB": [], "RWF": [], "SBD": [], "SEK": [], "SGD": [], "SHP": [], "SRD": [], "SSP": [], "STN": [], "SYP": [], "THB": ["฿", "THB"], "TOP": [], "TRY": [], "TTD": [], "TWD": ["NT$", "TWD"], "UAH": [], "USD": ["US$", "USD"], "UYU": [], "VND": ["₫", "VND"], "XCD": ["EC$", "XCD"], "ZAR": [], "ZMW": [] }, "ltr", plural];
//# sourceMappingURL=sq.js.maptx
z/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["sr-Cyrl-BA", [["AM", "PM"], ["прије подне", "по подне"], u], [["а", "p"], ["прије подне", "по подне"], u], [["н", "п", "у", "с", "ч", "п", "с"], ["нед", "пон", "уто", "сре", "чет", "пет", "суб"], ["недјеља", "понедјељак", "уторак", "сриједа", "четвртак", "петак", "субота"], ["не", "по", "ут", "ср", "че", "пе", "су"]], [["н", "п", "у", "с", "ч", "п", "с"], ["нед", "пон", "уто", "сри", "чет", "пет", "суб"], ["недјеља", "понедјељак", "уторак", "сриједа", "четвртак", "петак", "субота"], ["не", "по", "ут", "ср", "че", "пе", "су"]], [["ј", "ф", "м", "а", "м", "ј", "ј", "а", "с", "о", "н", "д"], ["јан", "феб", "мар", "апр", "мај", "јун", "јул", "авг", "сеп", "окт", "нов", "дец"], ["јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"]], u, [["п.н.е.", "н.е."], ["п. н. е.", "н. е."], ["прије нове ере", "нове ере"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "BAM", "КМ", "Босанскохерцеговачка конвертибилна марка", { "AUD": [u, "$"], "BAM": ["КМ", "KM"], "BYN": [u, "р."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr-Cyrl-BA.js.mapx	/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["sr-Cyrl-ME", [["AM", "PM"], ["прије подне", "по подне"], u], [["a", "p"], ["прије подне", "по подне"], u], [["н", "п", "у", "с", "ч", "п", "с"], ["нед", "пон", "уто", "сре", "чет", "пет", "суб"], ["недјеља", "понедељак", "уторак", "сриједа", "четвртак", "петак", "субота"], ["не", "по", "ут", "ср", "че", "пе", "су"]], u, [["ј", "ф", "м", "а", "м", "ј", "ј", "а", "с", "о", "н", "д"], ["јан", "феб", "март", "апр", "мај", "јун", "јул", "авг", "септ", "окт", "нов", "дец"], ["јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"]], u, [["п.н.е.", "н.е."], ["п. н. е.", "н. е."], ["прије нове ере", "нове ере"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "Евро", { "AUD": [u, "$"], "BAM": ["КМ", "KM"], "BYN": [u, "р."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr-Cyrl-ME.js.mapBxB/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["sr-Cyrl-XK", [["AM", "PM"], u, u], [["a", "p"], ["AM", "PM"], u], [["н", "п", "у", "с", "ч", "п", "с"], ["нед", "пон", "уто", "сре", "чет", "пет", "суб"], ["недеља", "понедељак", "уторак", "среда", "четвртак", "петак", "субота"], ["не", "по", "ут", "ср", "че", "пе", "су"]], u, [["ј", "ф", "м", "а", "м", "ј", "ј", "а", "с", "о", "н", "д"], ["јан", "феб", "март", "апр", "мај", "јун", "јул", "авг", "септ", "окт", "нов", "дец"], ["јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"]], u, [["п.н.е.", "н.е."], ["п. н. е.", "н. е."], ["пре нове ере", "нове ере"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "Евро", { "AUD": [u, "$"], "BAM": ["КМ", "KM"], "BYN": [u, "р."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr-Cyrl-XK.js.mapȳpx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sr-Latn-BA", [["AM", "PM"], ["prije podne", "po podne"], u], [["a", "p"], ["prije podne", "po podne"], u], [["n", "p", "u", "s", "č", "p", "s"], ["ned", "pon", "uto", "sre", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ne", "po", "ut", "sr", "če", "pe", "su"]], [["n", "p", "u", "s", "č", "p", "s"], ["ned", "pon", "uto", "sri", "čet", "pet", "sub"], ["nedjelja", "ponedjeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ne", "po", "ut", "sr", "če", "pe", "su"]], [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "avg", "sep", "okt", "nov", "dec"], ["januar", "februar", "mart", "april", "maj", "jun", "jul", "avgust", "septembar", "oktobar", "novembar", "decembar"]], u, [["p.n.e.", "n.e."], ["p. n. e.", "n. e."], ["prije nove ere", "nove ere"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "BAM", "KM", "Bosanskohercegovačka konvertibilna marka", { "AUD": [u, "$"], "BAM": ["KM"], "BYN": [u, "r."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr-Latn-BA.js.map2`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sr-Latn-ME", [["AM", "PM"], ["prije podne", "po podne"], u], [["a", "p"], ["prije podne", "po podne"], u], [["n", "p", "u", "s", "č", "p", "s"], ["ned", "pon", "uto", "sre", "čet", "pet", "sub"], ["nedjelja", "ponedeljak", "utorak", "srijeda", "četvrtak", "petak", "subota"], ["ne", "po", "ut", "sr", "če", "pe", "su"]], u, [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mart", "apr", "maj", "jun", "jul", "avg", "sept", "okt", "nov", "dec"], ["januar", "februar", "mart", "april", "maj", "jun", "jul", "avgust", "septembar", "oktobar", "novembar", "decembar"]], u, [["p.n.e.", "n.e."], ["p. n. e.", "n. e."], ["prije nove ere", "nove ere"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "Evro", { "AUD": [u, "$"], "BAM": ["KM"], "BYN": [u, "r."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr-Latn-ME.js.mapԭ]x%/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sr-Latn-XK", [["AM", "PM"], u, u], [["a", "p"], ["AM", "PM"], u], [["n", "p", "u", "s", "č", "p", "s"], ["ned", "pon", "uto", "sre", "čet", "pet", "sub"], ["nedelja", "ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota"], ["ne", "po", "ut", "sr", "če", "pe", "su"]], u, [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mart", "apr", "maj", "jun", "jul", "avg", "sept", "okt", "nov", "dec"], ["januar", "februar", "mart", "april", "maj", "jun", "jul", "avgust", "septembar", "oktobar", "novembar", "decembar"]], u, [["p.n.e.", "n.e."], ["p. n. e.", "n. e."], ["pre nove ere", "nove ere"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "EUR", "€", "Evro", { "AUD": [u, "$"], "BAM": ["KM"], "BYN": [u, "r."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr-Latn-XK.js.map^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["sr-Latn", [["AM", "PM"], u, u], [["pre podne", "po podne"], ["AM", "PM"], u], [["n", "p", "u", "s", "č", "p", "s"], ["ned", "pon", "uto", "sre", "čet", "pet", "sub"], ["nedelja", "ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota"], ["ne", "po", "ut", "sr", "če", "pe", "su"]], u, [["j", "f", "m", "a", "m", "j", "j", "a", "s", "o", "n", "d"], ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "avg", "sep", "okt", "nov", "dec"], ["januar", "februar", "mart", "april", "maj", "jun", "jul", "avgust", "septembar", "oktobar", "novembar", "decembar"]], u, [["p.n.e.", "n.e."], ["p. n. e.", "n. e."], ["pre nove ere", "nove ere"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "RSD", "RSD", "srpski dinar", { "AUD": [u, "$"], "BAM": ["KM"], "BYN": [u, "r."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr-Latn.js.mapT&x)/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))
        return 3;
    return 5;
}
export default ["sr", [["AM", "PM"], u, u], [["пре подне", "по подне"], ["AM", "PM"], u], [["н", "п", "у", "с", "ч", "п", "с"], ["нед", "пон", "уто", "сре", "чет", "пет", "суб"], ["недеља", "понедељак", "уторак", "среда", "четвртак", "петак", "субота"], ["не", "по", "ут", "ср", "че", "пе", "су"]], u, [["ј", "ф", "м", "а", "м", "ј", "ј", "а", "с", "о", "н", "д"], ["јан", "феб", "мар", "апр", "мај", "јун", "јул", "авг", "сеп", "окт", "нов", "дец"], ["јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"]], u, [["п.н.е.", "н.е."], ["п. н. е.", "н. е."], ["пре нове ере", "нове ере"]], 1, [6, 0], ["d.M.yy.", "d. M. y.", "d. MMMM y.", "EEEE, d. MMMM y."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "RSD", "RSD", "српски динар", { "AUD": [u, "$"], "BAM": ["КМ", "KM"], "BYN": [u, "р."], "GEL": [u, "ლ"], "KRW": [u, "₩"], "NZD": [u, "$"], "PHP": [u, "₱"], "TWD": ["NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sr.js.maph{x{"version":3,"file":"sr.js","sourceRoot":"","sources":["sr.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length, f = parseInt(val.toString().replace(/^[^.]*\\.?/, ''), 10) || 0;\n\nif (v === 0 && (i % 10 === 1 && !(i % 100 === 11)) || f % 10 === 1 && !(f % 100 === 11))\n    return 1;\nif (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)) || f % 10 === Math.floor(f % 10) && (f % 10 >= 2 && f % 10 <= 4) && !(f % 100 >= 12 && f % 100 <= 14))\n    return 3;\nreturn 5;\n}\n\nexport default [\"sr\",[[\"AM\",\"PM\"],u,u],[[\"пре подне\",\"по подне\"],[\"AM\",\"PM\"],u],[[\"н\",\"п\",\"у\",\"с\",\"ч\",\"п\",\"с\"],[\"нед\",\"пон\",\"уто\",\"сре\",\"чет\",\"пет\",\"суб\"],[\"недеља\",\"понедељак\",\"уторак\",\"среда\",\"четвртак\",\"петак\",\"субота\"],[\"не\",\"по\",\"ут\",\"ср\",\"че\",\"пе\",\"су\"]],u,[[\"ј\",\"ф\",\"м\",\"а\",\"м\",\"ј\",\"ј\",\"а\",\"с\",\"о\",\"н\",\"д\"],[\"јан\",\"феб\",\"мар\",\"апр\",\"мај\",\"јун\",\"јул\",\"авг\",\"сеп\",\"окт\",\"нов\",\"дец\"],[\"јануар\",\"фебруар\",\"март\",\"април\",\"мај\",\"јун\",\"јул\",\"август\",\"септембар\",\"октобар\",\"новембар\",\"децембар\"]],u,[[\"п.н.е.\",\"н.е.\"],[\"п. н. е.\",\"н. е.\"],[\"пре нове ере\",\"нове ере\"]],1,[6,0],[\"d.M.yy.\",\"d. M. y.\",\"d. MMMM y.\",\"EEEE, d. MMMM y.\"],[\"HH:mm\",\"HH:mm:ss\",\"HH:mm:ss z\",\"HH:mm:ss zzzz\"],[\"{1} {0}\",u,u,u],[\",\",\".\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"#,##0.00 ¤\",\"#E0\"],\"RSD\",\"RSD\",\"српски динар\",{\"AUD\":[u,\"$\"],\"BAM\":[\"КМ\",\"KM\"],\"BYN\":[u,\"р.\"],\"GEL\":[u,\"ლ\"],\"KRW\":[u,\"₩\"],\"NZD\":[u,\"$\"],\"PHP\":[u,\"₱\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"VND\":[u,\"₫\"]},\"ltr\", plural];\n"]}ZhNx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["su", [["AM", "PM"], u, u], u, [["M", "S", "S", "R", "K", "J", "S"], ["Mng", "Sen", "Sal", "Reb", "Kem", "Jum", "Sap"], ["Minggu", "Senén", "Salasa", "Rebo", "Kemis", "Jumaah", "Saptu"], ["Mng", "Sen", "Sal", "Reb", "Kem", "Jum", "Sap"]], u, [["J", "P", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Péb", "Mar", "Apr", "Méi", "Jun", "Jul", "Ags", "Sép", "Okt", "Nop", "Dés"], ["Januari", "Pébruari", "Maret", "April", "Méi", "Juni", "Juli", "Agustus", "Séptémber", "Oktober", "Nopémber", "Désémber"]], u, [["SM", "M"], u, u], 0, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["H.mm", "H.mm.ss", "H.mm.ss z", "H.mm.ss zzzz"], ["{1}, {0}", u, "{1} 'jam' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "IDR", "Rp", "Rupee Indonésia", { "IDR": ["Rp"] }, "ltr", plural];
//# sourceMappingURL=su.js.mapE]~x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["sv-AX", [["fm", "em"], u, u], [["fm", "em"], ["f.m.", "e.m."], ["förmiddag", "eftermiddag"]], [["S", "M", "T", "O", "T", "F", "L"], ["sön", "mån", "tis", "ons", "tors", "fre", "lör"], ["söndag", "måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag"], ["sö", "må", "ti", "on", "to", "fr", "lö"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mars", "apr.", "maj", "juni", "juli", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"]], u, [["f.Kr.", "e.Kr."], u, ["före Kristus", "efter Kristus"]], 1, [6, 0], ["y-MM-dd", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "×10^", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": [u, "$"], "BBD": ["Bds$", "$"], "BMD": ["BM$", "$"], "BRL": ["BR$", "R$"], "BSD": ["BS$", "$"], "BYN": [u, "р."], "BZD": ["BZ$", "$"], "CNY": [u, "¥"], "DKK": ["Dkr", "kr"], "DOP": ["RD$", "$"], "EEK": ["Ekr"], "EGP": ["EG£", "E£"], "ESP": [], "GBP": [u, "£"], "HKD": [u, "$"], "IEP": ["IE£"], "INR": [u, "₹"], "ISK": ["Ikr", "kr"], "JMD": ["JM$", "$"], "JPY": [u, "¥"], "KRW": [u, "₩"], "NOK": ["Nkr", "kr"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SEK": ["kr"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sv-AX.js.mapK,~x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["sv-FI", [["fm", "em"], u, u], [["fm", "em"], ["f.m.", "e.m."], ["förmiddag", "eftermiddag"]], [["S", "M", "T", "O", "T", "F", "L"], ["sön", "mån", "tis", "ons", "tors", "fre", "lör"], ["söndag", "måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag"], ["sö", "må", "ti", "on", "to", "fr", "lö"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mars", "apr.", "maj", "juni", "juli", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"]], u, [["f.Kr.", "e.Kr."], u, ["före Kristus", "efter Kristus"]], 1, [6, 0], ["y-MM-dd", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "×10^", "×", "‰", "∞", "NaN", "."], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "EUR", "€", "euro", { "AUD": [u, "$"], "BBD": ["Bds$", "$"], "BMD": ["BM$", "$"], "BRL": ["BR$", "R$"], "BSD": ["BS$", "$"], "BYN": [u, "р."], "BZD": ["BZ$", "$"], "CNY": [u, "¥"], "DKK": ["Dkr", "kr"], "DOP": ["RD$", "$"], "EEK": ["Ekr"], "EGP": ["EG£", "E£"], "ESP": [], "GBP": [u, "£"], "HKD": [u, "$"], "IEP": ["IE£"], "INR": [u, "₹"], "ISK": ["Ikr", "kr"], "JMD": ["JM$", "$"], "JPY": [u, "¥"], "KRW": [u, "₩"], "NOK": ["Nkr", "kr"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SEK": ["kr"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sv-FI.js.mapm,x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["sv", [["fm", "em"], u, u], [["fm", "em"], ["f.m.", "e.m."], ["förmiddag", "eftermiddag"]], [["S", "M", "T", "O", "T", "F", "L"], ["sön", "mån", "tis", "ons", "tors", "fre", "lör"], ["söndag", "måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag"], ["sö", "må", "ti", "on", "to", "fr", "lö"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["jan.", "feb.", "mars", "apr.", "maj", "juni", "juli", "aug.", "sep.", "okt.", "nov.", "dec."], ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"]], u, [["f.Kr.", "e.Kr."], u, ["före Kristus", "efter Kristus"]], 1, [6, 0], ["y-MM-dd", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "−", "×10^", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "SEK", "kr", "svensk krona", { "AUD": [u, "$"], "BBD": ["Bds$", "$"], "BMD": ["BM$", "$"], "BRL": ["BR$", "R$"], "BSD": ["BS$", "$"], "BYN": [u, "р."], "BZD": ["BZ$", "$"], "CNY": [u, "¥"], "DKK": ["Dkr", "kr"], "DOP": ["RD$", "$"], "EEK": ["Ekr"], "EGP": ["EG£", "E£"], "ESP": [], "GBP": [u, "£"], "HKD": [u, "$"], "IEP": ["IE£"], "INR": [u, "₹"], "ISK": ["Ikr", "kr"], "JMD": ["JM$", "$"], "JPY": [u, "¥"], "KRW": [u, "₩"], "NOK": ["Nkr", "kr"], "NZD": [u, "$"], "PHP": [u, "₱"], "RON": [u, "L"], "SEK": ["kr"], "TWD": [u, "NT$"], "USD": ["US$", "$"], "VND": [u, "₫"] }, "ltr", plural];
//# sourceMappingURL=sv.js.map-]x//**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["sw", [["am", "pm"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Jumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi"], u, u], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KK", "BK"], u, ["Kabla ya Kristo", "Baada ya Kristo"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "TZS", "TSh", "Shilingi ya Tanzania", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=sw.js.map̴x$/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ta-LK", [["மு.ப", "பி.ப"], ["முற்பகல்", "பிற்பகல்"], u], u, [["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"], ["ஞாயி.", "திங்.", "செவ்.", "புத.", "வியா.", "வெள்.", "சனி"], ["ஞாயிறு", "திங்கள்", "செவ்வாய்", "புதன்", "வியாழன்", "வெள்ளி", "சனி"], ["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"]], u, [["ஜ", "பி", "மா", "ஏ", "மே", "ஜூ", "ஜூ", "ஆ", "செ", "அ", "ந", "டி"], ["ஜன.", "பிப்.", "மார்.", "ஏப்.", "மே", "ஜூன்", "ஜூலை", "ஆக.", "செப்.", "அக்.", "நவ.", "டிச."], ["ஜனவரி", "பிப்ரவரி", "மார்ச்", "ஏப்ரல்", "மே", "ஜூன்", "ஜூலை", "ஆகஸ்ட்", "செப்டம்பர்", "அக்டோபர்", "நவம்பர்", "டிசம்பர்"]], u, [["கி.மு.", "கி.பி."], u, ["கிறிஸ்துவுக்கு முன்", "அன்னோ டோமினி"]], 1, [6, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} அன்று {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤ #,##,##0.00", "#E0"], "LKR", "Rs.", "இலங்கை ரூபாய்", { "BYN": [u, "р."], "LKR": ["Rs.", "Rs"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=ta-LK.js.mapnx7/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ta-MY", [["மு.ப", "பி.ப"], ["முற்பகல்", "பிற்பகல்"], u], u, [["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"], ["ஞாயி.", "திங்.", "செவ்.", "புத.", "வியா.", "வெள்.", "சனி"], ["ஞாயிறு", "திங்கள்", "செவ்வாய்", "புதன்", "வியாழன்", "வெள்ளி", "சனி"], ["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"]], u, [["ஜ", "பி", "மா", "ஏ", "மே", "ஜூ", "ஜூ", "ஆ", "செ", "அ", "ந", "டி"], ["ஜன.", "பிப்.", "மார்.", "ஏப்.", "மே", "ஜூன்", "ஜூலை", "ஆக.", "செப்.", "அக்.", "நவ.", "டிச."], ["ஜனவரி", "பிப்ரவரி", "மார்ச்", "ஏப்ரல்", "மே", "ஜூன்", "ஜூலை", "ஆகஸ்ட்", "செப்டம்பர்", "அக்டோபர்", "நவம்பர்", "டிசம்பர்"]], u, [["கி.மு.", "கி.பி."], u, ["கிறிஸ்துவுக்கு முன்", "அன்னோ டோமினி"]], 1, [6, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["a h:mm", "a h:mm:ss", "a h:mm:ss z", "a h:mm:ss zzzz"], ["{1}, {0}", u, "{1} அன்று {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "MYR", "RM", "மலேஷியன் ரிங்கிட்", { "BYN": [u, "р."], "MYR": ["RM"], "PHP": [u, "₱"], "SGD": ["S$", "$"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=ta-MY.js.mapYqx{"version":3,"file":"ta-MY.js","sourceRoot":"","sources":["ta-MY.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,qBAAqB,EAAC,cAAc,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,mBAAmB,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ta-MY\",[[\"மு.ப\",\"பி.ப\"],[\"முற்பகல்\",\"பிற்பகல்\"],u],u,[[\"ஞா\",\"தி\",\"செ\",\"பு\",\"வி\",\"வெ\",\"ச\"],[\"ஞாயி.\",\"திங்.\",\"செவ்.\",\"புத.\",\"வியா.\",\"வெள்.\",\"சனி\"],[\"ஞாயிறு\",\"திங்கள்\",\"செவ்வாய்\",\"புதன்\",\"வியாழன்\",\"வெள்ளி\",\"சனி\"],[\"ஞா\",\"தி\",\"செ\",\"பு\",\"வி\",\"வெ\",\"ச\"]],u,[[\"ஜ\",\"பி\",\"மா\",\"ஏ\",\"மே\",\"ஜூ\",\"ஜூ\",\"ஆ\",\"செ\",\"அ\",\"ந\",\"டி\"],[\"ஜன.\",\"பிப்.\",\"மார்.\",\"ஏப்.\",\"மே\",\"ஜூன்\",\"ஜூலை\",\"ஆக.\",\"செப்.\",\"அக்.\",\"நவ.\",\"டிச.\"],[\"ஜனவரி\",\"பிப்ரவரி\",\"மார்ச்\",\"ஏப்ரல்\",\"மே\",\"ஜூன்\",\"ஜூலை\",\"ஆகஸ்ட்\",\"செப்டம்பர்\",\"அக்டோபர்\",\"நவம்பர்\",\"டிசம்பர்\"]],u,[[\"கி.மு.\",\"கி.பி.\"],u,[\"கிறிஸ்துவுக்கு முன்\",\"அன்னோ டோமினி\"]],1,[6,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"a h:mm\",\"a h:mm:ss\",\"a h:mm:ss z\",\"a h:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} அன்று {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"MYR\",\"RM\",\"மலேஷியன் ரிங்கிட்\",{\"BYN\":[u,\"р.\"],\"MYR\":[\"RM\"],\"PHP\":[u,\"₱\"],\"SGD\":[\"S$\",\"$\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}WxE/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ta-SG", [["மு.ப", "பி.ப"], ["முற்பகல்", "பிற்பகல்"], u], u, [["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"], ["ஞாயி.", "திங்.", "செவ்.", "புத.", "வியா.", "வெள்.", "சனி"], ["ஞாயிறு", "திங்கள்", "செவ்வாய்", "புதன்", "வியாழன்", "வெள்ளி", "சனி"], ["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"]], u, [["ஜ", "பி", "மா", "ஏ", "மே", "ஜூ", "ஜூ", "ஆ", "செ", "அ", "ந", "டி"], ["ஜன.", "பிப்.", "மார்.", "ஏப்.", "மே", "ஜூன்", "ஜூலை", "ஆக.", "செப்.", "அக்.", "நவ.", "டிச."], ["ஜனவரி", "பிப்ரவரி", "மார்ச்", "ஏப்ரல்", "மே", "ஜூன்", "ஜூலை", "ஆகஸ்ட்", "செப்டம்பர்", "அக்டோபர்", "நவம்பர்", "டிசம்பர்"]], u, [["கி.மு.", "கி.பி."], u, ["கிறிஸ்துவுக்கு முன்", "அன்னோ டோமினி"]], 0, [6, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["a h:mm", "a h:mm:ss", "a h:mm:ss z", "a h:mm:ss zzzz"], ["{1}, {0}", u, "{1} அன்று {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "SGD", "$", "சிங்கப்பூர் டாலர்", { "BYN": [u, "р."], "MYR": ["RM"], "PHP": [u, "₱"], "SGD": ["$"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ta-SG.js.mapݸx3{"version":3,"file":"ta-SG.js","sourceRoot":"","sources":["ta-SG.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,OAAO,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,qBAAqB,EAAC,cAAc,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,YAAY,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,mBAAmB,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ta-SG\",[[\"மு.ப\",\"பி.ப\"],[\"முற்பகல்\",\"பிற்பகல்\"],u],u,[[\"ஞா\",\"தி\",\"செ\",\"பு\",\"வி\",\"வெ\",\"ச\"],[\"ஞாயி.\",\"திங்.\",\"செவ்.\",\"புத.\",\"வியா.\",\"வெள்.\",\"சனி\"],[\"ஞாயிறு\",\"திங்கள்\",\"செவ்வாய்\",\"புதன்\",\"வியாழன்\",\"வெள்ளி\",\"சனி\"],[\"ஞா\",\"தி\",\"செ\",\"பு\",\"வி\",\"வெ\",\"ச\"]],u,[[\"ஜ\",\"பி\",\"மா\",\"ஏ\",\"மே\",\"ஜூ\",\"ஜூ\",\"ஆ\",\"செ\",\"அ\",\"ந\",\"டி\"],[\"ஜன.\",\"பிப்.\",\"மார்.\",\"ஏப்.\",\"மே\",\"ஜூன்\",\"ஜூலை\",\"ஆக.\",\"செப்.\",\"அக்.\",\"நவ.\",\"டிச.\"],[\"ஜனவரி\",\"பிப்ரவரி\",\"மார்ச்\",\"ஏப்ரல்\",\"மே\",\"ஜூன்\",\"ஜூலை\",\"ஆகஸ்ட்\",\"செப்டம்பர்\",\"அக்டோபர்\",\"நவம்பர்\",\"டிசம்பர்\"]],u,[[\"கி.மு.\",\"கி.பி.\"],u,[\"கிறிஸ்துவுக்கு முன்\",\"அன்னோ டோமினி\"]],0,[6,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"a h:mm\",\"a h:mm:ss\",\"a h:mm:ss z\",\"a h:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} அன்று {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤ #,##0.00\",\"#E0\"],\"SGD\",\"$\",\"சிங்கப்பூர் டாலர்\",{\"BYN\":[u,\"р.\"],\"MYR\":[\"RM\"],\"PHP\":[u,\"₱\"],\"SGD\":[\"$\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}^򶼀x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ta", [["மு.ப", "பி.ப"], ["முற்பகல்", "பிற்பகல்"], u], u, [["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"], ["ஞாயி.", "திங்.", "செவ்.", "புத.", "வியா.", "வெள்.", "சனி"], ["ஞாயிறு", "திங்கள்", "செவ்வாய்", "புதன்", "வியாழன்", "வெள்ளி", "சனி"], ["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"]], u, [["ஜ", "பி", "மா", "ஏ", "மே", "ஜூ", "ஜூ", "ஆ", "செ", "அ", "ந", "டி"], ["ஜன.", "பிப்.", "மார்.", "ஏப்.", "மே", "ஜூன்", "ஜூலை", "ஆக.", "செப்.", "அக்.", "நவ.", "டிச."], ["ஜனவரி", "பிப்ரவரி", "மார்ச்", "ஏப்ரல்", "மே", "ஜூன்", "ஜூலை", "ஆகஸ்ட்", "செப்டம்பர்", "அக்டோபர்", "நவம்பர்", "டிசம்பர்"]], u, [["கி.மு.", "கி.பி."], u, ["கிறிஸ்துவுக்கு முன்", "அன்னோ டோமினி"]], 0, [0, 0], ["d/M/yy", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["a h:mm", "a h:mm:ss", "a h:mm:ss z", "a h:mm:ss zzzz"], ["{1}, {0}", u, "{1} அன்று {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##,##0%", "¤ #,##,##0.00", "#E0"], "INR", "₹", "இந்திய ரூபாய்", { "BYN": [u, "р."], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=ta.js.map1xu{"version":3,"file":"ta.js","sourceRoot":"","sources":["ta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,CAAC;QACP,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,CAAC,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,QAAQ,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,CAAC,EAAC,CAAC,qBAAqB,EAAC,cAAc,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,cAAc,EAAC,WAAW,EAAC,eAAe,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,eAAe,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === 1)\n    return 1;\nreturn 5;\n}\n\nexport default [\"ta\",[[\"மு.ப\",\"பி.ப\"],[\"முற்பகல்\",\"பிற்பகல்\"],u],u,[[\"ஞா\",\"தி\",\"செ\",\"பு\",\"வி\",\"வெ\",\"ச\"],[\"ஞாயி.\",\"திங்.\",\"செவ்.\",\"புத.\",\"வியா.\",\"வெள்.\",\"சனி\"],[\"ஞாயிறு\",\"திங்கள்\",\"செவ்வாய்\",\"புதன்\",\"வியாழன்\",\"வெள்ளி\",\"சனி\"],[\"ஞா\",\"தி\",\"செ\",\"பு\",\"வி\",\"வெ\",\"ச\"]],u,[[\"ஜ\",\"பி\",\"மா\",\"ஏ\",\"மே\",\"ஜூ\",\"ஜூ\",\"ஆ\",\"செ\",\"அ\",\"ந\",\"டி\"],[\"ஜன.\",\"பிப்.\",\"மார்.\",\"ஏப்.\",\"மே\",\"ஜூன்\",\"ஜூலை\",\"ஆக.\",\"செப்.\",\"அக்.\",\"நவ.\",\"டிச.\"],[\"ஜனவரி\",\"பிப்ரவரி\",\"மார்ச்\",\"ஏப்ரல்\",\"மே\",\"ஜூன்\",\"ஜூலை\",\"ஆகஸ்ட்\",\"செப்டம்பர்\",\"அக்டோபர்\",\"நவம்பர்\",\"டிசம்பர்\"]],u,[[\"கி.மு.\",\"கி.பி.\"],u,[\"கிறிஸ்துவுக்கு முன்\",\"அன்னோ டோமினி\"]],0,[0,0],[\"d/M/yy\",\"d MMM, y\",\"d MMMM, y\",\"EEEE, d MMMM, y\"],[\"a h:mm\",\"a h:mm:ss\",\"a h:mm:ss z\",\"a h:mm:ss zzzz\"],[\"{1}, {0}\",u,\"{1} அன்று {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##,##0.###\",\"#,##,##0%\",\"¤ #,##,##0.00\",\"#E0\"],\"INR\",\"₹\",\"இந்திய ரூபாய்\",{\"BYN\":[u,\"р.\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"]},\"ltr\", plural];\n"]}bx;/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["te", [["ఉ", "సా"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["ఆ", "సో", "మ", "బు", "గు", "శు", "శ"], ["ఆది", "సోమ", "మంగళ", "బుధ", "గురు", "శుక్ర", "శని"], ["ఆదివారం", "సోమవారం", "మంగళవారం", "బుధవారం", "గురువారం", "శుక్రవారం", "శనివారం"], ["ఆది", "సోమ", "మం", "బుధ", "గురు", "శుక్ర", "శని"]], u, [["జ", "ఫి", "మా", "ఏ", "మే", "జూ", "జు", "ఆ", "సె", "అ", "న", "డి"], ["జన", "ఫిబ్ర", "మార్చి", "ఏప్రి", "మే", "జూన్", "జులై", "ఆగ", "సెప్టెం", "అక్టో", "నవం", "డిసెం"], ["జనవరి", "ఫిబ్రవరి", "మార్చి", "ఏప్రిల్", "మే", "జూన్", "జులై", "ఆగస్టు", "సెప్టెంబర్", "అక్టోబర్", "నవంబర్", "డిసెంబర్"]], u, [["క్రీపూ", "క్రీశ"], u, ["క్రీస్తు పూర్వం", "క్రీస్తు శకం"]], 0, [0, 0], ["dd-MM-yy", "d MMM, y", "d MMMM, y", "d, MMMM y, EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1} {0}కి", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##,##0.###", "#,##0%", "¤#,##,##0.00", "#E0"], "INR", "₹", "భారతదేశ రూపాయి", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=te.js.mapNòZx]/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["teo-KE", [["Taparachu", "Ebongi"], u, u], u, [["J", "B", "A", "U", "U", "K", "S"], ["Jum", "Bar", "Aar", "Uni", "Ung", "Kan", "Sab"], ["Nakaejuma", "Nakaebarasa", "Nakaare", "Nakauni", "Nakaung’on", "Nakakany", "Nakasabiti"], ["Jum", "Bar", "Aar", "Uni", "Ung", "Kan", "Sab"]], u, [["R", "M", "K", "D", "M", "M", "J", "P", "S", "T", "L", "P"], ["Rar", "Muk", "Kwa", "Dun", "Mar", "Mod", "Jol", "Ped", "Sok", "Tib", "Lab", "Poo"], ["Orara", "Omuk", "Okwamg’", "Odung’el", "Omaruk", "Omodok’king’ol", "Ojola", "Opedel", "Osokosokoma", "Otibar", "Olabor", "Opoo"]], u, [["KK", "BK"], u, ["Kabla ya Christo", "Baada ya Christo"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "KES", "Ksh", "Ango’otol lok’ Kenya", { "JPY": ["JP¥", "¥"], "KES": ["Ksh"], "UGX": ["USh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=teo-KE.js.mapXxr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["teo", [["Taparachu", "Ebongi"], u, u], u, [["J", "B", "A", "U", "U", "K", "S"], ["Jum", "Bar", "Aar", "Uni", "Ung", "Kan", "Sab"], ["Nakaejuma", "Nakaebarasa", "Nakaare", "Nakauni", "Nakaung’on", "Nakakany", "Nakasabiti"], ["Jum", "Bar", "Aar", "Uni", "Ung", "Kan", "Sab"]], u, [["R", "M", "K", "D", "M", "M", "J", "P", "S", "T", "L", "P"], ["Rar", "Muk", "Kwa", "Dun", "Mar", "Mod", "Jol", "Ped", "Sok", "Tib", "Lab", "Poo"], ["Orara", "Omuk", "Okwamg’", "Odung’el", "Omaruk", "Omodok’king’ol", "Ojola", "Opedel", "Osokosokoma", "Otibar", "Olabor", "Opoo"]], u, [["KK", "BK"], u, ["Kabla ya Christo", "Baada ya Christo"]], 1, [0, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "UGX", "USh", "Ango’otol lok’ Uganda", { "JPY": ["JP¥", "¥"], "UGX": ["USh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=teo.js.map_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["tg", [["AM", "PM"], u, u], u, [["Я", "Д", "С", "Ч", "П", "Ҷ", "Ш"], ["Яшб", "Дшб", "Сшб", "Чшб", "Пшб", "Ҷмъ", "Шнб"], ["Якшанбе", "Душанбе", "Сешанбе", "Чоршанбе", "Панҷшанбе", "Ҷумъа", "Шанбе"], ["Яшб", "Дшб", "Сшб", "Чшб", "Пшб", "Ҷмъ", "Шнб"]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"], ["Январ", "Феврал", "Март", "Апрел", "Май", "Июн", "Июл", "Август", "Сентябр", "Октябр", "Ноябр", "Декабр"]], u, [["ПеМ", "ПаМ"], u, ["Пеш аз милод", "Пас аз милод"]], 1, [6, 0], ["dd/MM/yy", "dd MMM y", "dd MMMM y", "EEEE, dd MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "TJS", "сом.", "Сомонӣ", { "JPY": ["JP¥", "¥"], "TJS": ["сом."] }, "ltr", plural];
//# sourceMappingURL=tg.js.mapAdx%/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["th", [["a", "p"], ["ก่อนเที่ยง", "หลังเที่ยง"], u], [["ก่อนเที่ยง", "หลังเที่ยง"], u, u], [["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส"], ["อา.", "จ.", "อ.", "พ.", "พฤ.", "ศ.", "ส."], ["วันอาทิตย์", "วันจันทร์", "วันอังคาร", "วันพุธ", "วันพฤหัสบดี", "วันศุกร์", "วันเสาร์"], ["อา.", "จ.", "อ.", "พ.", "พฤ.", "ศ.", "ส."]], u, [["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."], u, ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"]], u, [["ก่อน ค.ศ.", "ค.ศ."], u, ["ปีก่อนคริสตกาล", "คริสต์ศักราช"]], 0, [6, 0], ["d/M/yy", "d MMM y", "d MMMM G y", "EEEEที่ d MMMM G y"], ["HH:mm", "HH:mm:ss", "H นาฬิกา mm นาที ss วินาที z", "H นาฬิกา mm นาที ss วินาที zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "THB", "฿", "บาท", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=th.js.mapoFxk{"version":3,"file":"th.js","sourceRoot":"","sources":["th.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,YAAY,EAAC,YAAY,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,YAAY,EAAC,YAAY,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,YAAY,EAAC,WAAW,EAAC,WAAW,EAAC,QAAQ,EAAC,aAAa,EAAC,UAAU,EAAC,UAAU,CAAC,EAAC,CAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,WAAW,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,gBAAgB,EAAC,cAAc,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,YAAY,EAAC,oBAAoB,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,EAAC,8BAA8B,EAAC,iCAAiC,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,KAAK,EAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nreturn 5;\n}\n\nexport default [\"th\",[[\"a\",\"p\"],[\"ก่อนเที่ยง\",\"หลังเที่ยง\"],u],[[\"ก่อนเที่ยง\",\"หลังเที่ยง\"],u,u],[[\"อา\",\"จ\",\"อ\",\"พ\",\"พฤ\",\"ศ\",\"ส\"],[\"อา.\",\"จ.\",\"อ.\",\"พ.\",\"พฤ.\",\"ศ.\",\"ส.\"],[\"วันอาทิตย์\",\"วันจันทร์\",\"วันอังคาร\",\"วันพุธ\",\"วันพฤหัสบดี\",\"วันศุกร์\",\"วันเสาร์\"],[\"อา.\",\"จ.\",\"อ.\",\"พ.\",\"พฤ.\",\"ศ.\",\"ส.\"]],u,[[\"ม.ค.\",\"ก.พ.\",\"มี.ค.\",\"เม.ย.\",\"พ.ค.\",\"มิ.ย.\",\"ก.ค.\",\"ส.ค.\",\"ก.ย.\",\"ต.ค.\",\"พ.ย.\",\"ธ.ค.\"],u,[\"มกราคม\",\"กุมภาพันธ์\",\"มีนาคม\",\"เมษายน\",\"พฤษภาคม\",\"มิถุนายน\",\"กรกฎาคม\",\"สิงหาคม\",\"กันยายน\",\"ตุลาคม\",\"พฤศจิกายน\",\"ธันวาคม\"]],u,[[\"ก่อน ค.ศ.\",\"ค.ศ.\"],u,[\"ปีก่อนคริสตกาล\",\"คริสต์ศักราช\"]],0,[6,0],[\"d/M/yy\",\"d MMM y\",\"d MMMM G y\",\"EEEEที่ d MMMM G y\"],[\"HH:mm\",\"HH:mm:ss\",\"H นาฬิกา mm นาที ss วินาที z\",\"H นาฬิกา mm นาที ss วินาที zzzz\"],[\"{1} {0}\",u,u,u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"THB\",\"฿\",\"บาท\",{\"AUD\":[\"AU$\",\"$\"],\"BYN\":[u,\"р.\"],\"PHP\":[u,\"₱\"],\"THB\":[\"฿\"],\"TWD\":[\"NT$\"],\"USD\":[\"US$\",\"$\"],\"XXX\":[]},\"ltr\", plural];\n"]}gxr/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1))
        return 1;
    return 5;
}
export default ["ti", [["ቅ.ቀ.", "ድ.ቀ."], u, u], u, [["ሰ", "ሰ", "ሰ", "ረ", "ሓ", "ዓ", "ቀ"], ["ሰን", "ሰኑ", "ሰሉ", "ረቡ", "ሓሙ", "ዓር", "ቀዳ"], ["ሰንበት", "ሰኑይ", "ሰሉስ", "ረቡዕ", "ሓሙስ", "ዓርቢ", "ቀዳም"], ["ሰን", "ሰኑ", "ሰሉ", "ረቡ", "ሓሙ", "ዓር", "ቀዳ"]], u, [["ጥ", "ለ", "መ", "ሚ", "ግ", "ሰ", "ሓ", "ነ", "መ", "ጥ", "ሕ", "ታ"], ["ጥሪ", "ለካ", "መጋ", "ሚያ", "ግን", "ሰነ", "ሓም", "ነሓ", "መስ", "ጥቅ", "ሕዳ", "ታሕ"], ["ጥሪ", "ለካቲት", "መጋቢት", "ሚያዝያ", "ግንቦት", "ሰነ", "ሓምለ", "ነሓሰ", "መስከረም", "ጥቅምቲ", "ሕዳር", "ታሕሳስ"]], u, [["ዓ/ዓ", "ዓ/ም"], u, ["ቅድመ ክርስቶስ", "ዓመተ ምሕረት"]], 0, [6, 0], ["dd/MM/yy", "d MMM y", "d MMMM y", "EEEE፣ d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, "{1} ሰዓት {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ETB", "Br", "ብር", { "CNY": [u, "¥"], "ETB": ["Br"], "JPY": [u, "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=ti.js.mapp'ibx.{"version":3,"file":"ti.js","sourceRoot":"","sources":["ti.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,MAAM,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC;IAEd,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACT,CAAC;AAED,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,WAAW,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,UAAU,EAAC,SAAS,EAAC,UAAU,EAAC,gBAAgB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,SAAS,EAAC,CAAC,EAAC,aAAa,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val;\n\nif (n === Math.floor(n) && (n >= 0 && n <= 1))\n    return 1;\nreturn 5;\n}\n\nexport default [\"ti\",[[\"ቅ.ቀ.\",\"ድ.ቀ.\"],u,u],u,[[\"ሰ\",\"ሰ\",\"ሰ\",\"ረ\",\"ሓ\",\"ዓ\",\"ቀ\"],[\"ሰን\",\"ሰኑ\",\"ሰሉ\",\"ረቡ\",\"ሓሙ\",\"ዓር\",\"ቀዳ\"],[\"ሰንበት\",\"ሰኑይ\",\"ሰሉስ\",\"ረቡዕ\",\"ሓሙስ\",\"ዓርቢ\",\"ቀዳም\"],[\"ሰን\",\"ሰኑ\",\"ሰሉ\",\"ረቡ\",\"ሓሙ\",\"ዓር\",\"ቀዳ\"]],u,[[\"ጥ\",\"ለ\",\"መ\",\"ሚ\",\"ግ\",\"ሰ\",\"ሓ\",\"ነ\",\"መ\",\"ጥ\",\"ሕ\",\"ታ\"],[\"ጥሪ\",\"ለካ\",\"መጋ\",\"ሚያ\",\"ግን\",\"ሰነ\",\"ሓም\",\"ነሓ\",\"መስ\",\"ጥቅ\",\"ሕዳ\",\"ታሕ\"],[\"ጥሪ\",\"ለካቲት\",\"መጋቢት\",\"ሚያዝያ\",\"ግንቦት\",\"ሰነ\",\"ሓምለ\",\"ነሓሰ\",\"መስከረም\",\"ጥቅምቲ\",\"ሕዳር\",\"ታሕሳስ\"]],u,[[\"ዓ/ዓ\",\"ዓ/ም\"],u,[\"ቅድመ ክርስቶስ\",\"ዓመተ ምሕረት\"]],0,[6,0],[\"dd/MM/yy\",\"d MMM y\",\"d MMMM y\",\"EEEE፣ d MMMM y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1} {0}\",u,\"{1} ሰዓት {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"ETB\",\"Br\",\"ብር\",{\"CNY\":[u,\"¥\"],\"ETB\":[\"Br\"],\"JPY\":[u,\"¥\"],\"USD\":[\"US$\",\"$\"]},\"ltr\", plural];\n"]}8x4/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["tk", [["öň", "soň"], ["go.öň", "go.soň"], ["günortadan öň", "günortadan soň"]], [["öň", "soň"], ["g.öň", "g.soň"], ["günortadan öň", "günortadan soň"]], [["Ý", "D", "S", "Ç", "P", "A", "Ş"], ["ýek", "duş", "siş", "çar", "pen", "ann", "şen"], ["ýekşenbe", "duşenbe", "sişenbe", "çarşenbe", "penşenbe", "anna", "şenbe"], ["ýb", "db", "sb", "çb", "pb", "an", "şb"]], [["Ý", "D", "S", "Ç", "P", "A", "Ş"], ["Ýek", "Duş", "Siş", "Çar", "Pen", "Ann", "Şen"], ["Ýekşenbe", "Duşenbe", "Sişenbe", "Çarşenbe", "Penşenbe", "Anna", "Şenbe"], ["Ýb", "Db", "Sb", "Çb", "Pb", "An", "Şb"]], [["Ý", "F", "M", "A", "M", "I", "I", "A", "S", "O", "N", "D"], ["ýan", "few", "mart", "apr", "maý", "iýun", "iýul", "awg", "sen", "okt", "noý", "dek"], ["ýanwar", "fewral", "mart", "aprel", "maý", "iýun", "iýul", "awgust", "sentýabr", "oktýabr", "noýabr", "dekabr"]], [["Ý", "F", "M", "A", "M", "I", "I", "A", "S", "O", "N", "D"], ["Ýan", "Few", "Mar", "Apr", "Maý", "Iýun", "Iýul", "Awg", "Sen", "Okt", "Noý", "Dek"], ["Ýanwar", "Fewral", "Mart", "Aprel", "Maý", "Iýun", "Iýul", "Awgust", "Sentýabr", "Oktýabr", "Noýabr", "Dekabr"]], [["B.e.öň", "B.e."], u, ["Isadan öň", "Isadan soň"]], 1, [6, 0], ["dd.MM.y", "d MMM y", "d MMMM y", "d MMMM y EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "san däl", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "TMT", "TMT", "Türkmen manady", { "BYN": [u, "р."], "EUR": [u, "€"], "GBP": [u, "£"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=tk.js.map(^x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["to", [["AM", "PM"], u, ["hengihengi", "efiafi"]], [["AM", "PM"], u, ["HH", "EA"]], [["S", "M", "T", "P", "T", "F", "T"], ["Sāp", "Mōn", "Tūs", "Pul", "Tuʻa", "Fal", "Tok"], ["Sāpate", "Mōnite", "Tūsite", "Pulelulu", "Tuʻapulelulu", "Falaite", "Tokonaki"], ["Sāp", "Mōn", "Tūs", "Pul", "Tuʻa", "Fal", "Tok"]], u, [["S", "F", "M", "E", "M", "S", "S", "A", "S", "O", "N", "T"], ["Sān", "Fēp", "Maʻa", "ʻEpe", "Mē", "Sun", "Siu", "ʻAok", "Sep", "ʻOka", "Nōv", "Tīs"], ["Sānuali", "Fēpueli", "Maʻasi", "ʻEpeleli", "Mē", "Sune", "Siulai", "ʻAokosi", "Sepitema", "ʻOkatopa", "Nōvema", "Tīsema"]], u, [["KM", "TS"], u, ["ki muʻa", "taʻu ʻo Sīsū"]], 1, [6, 0], ["d/M/yy", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", "{1}, {0}", u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "TF", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "TOP", "T$", "Paʻanga fakatonga", { "AUD": ["AUD$", "AU$"], "FJD": [u, "F$"], "JPY": ["JP¥", "¥"], "NZD": ["NZD$", "NZ$"], "SBD": [u, "S$"], "TOP": ["T$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=to.js.mapᴋ\x8/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["tr-CY", [["öö", "ös"], ["ÖÖ", "ÖS"], u], [["ÖÖ", "ÖS"], u, u], [["P", "P", "S", "Ç", "P", "C", "C"], ["Paz", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt"], ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"], ["Pa", "Pt", "Sa", "Ça", "Pe", "Cu", "Ct"]], u, [["O", "Ş", "M", "N", "M", "H", "T", "A", "E", "E", "K", "A"], ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"], ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"]], u, [["MÖ", "MS"], u, ["Milattan Önce", "Milattan Sonra"]], 1, [6, 0], ["d.MM.y", "d MMM y", "d MMMM y", "d MMMM y EEEE"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "%#,##0", "¤#,##0.00", "#E0"], "EUR", "€", "Euro", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "THB": ["฿"], "TRY": ["₺"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=tr-CY.js.mapxc\x9/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["tr", [["öö", "ös"], ["ÖÖ", "ÖS"], u], [["ÖÖ", "ÖS"], u, u], [["P", "P", "S", "Ç", "P", "C", "C"], ["Paz", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt"], ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"], ["Pa", "Pt", "Sa", "Ça", "Pe", "Cu", "Ct"]], u, [["O", "Ş", "M", "N", "M", "H", "T", "A", "E", "E", "K", "A"], ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"], ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"]], u, [["MÖ", "MS"], u, ["Milattan Önce", "Milattan Sonra"]], 1, [6, 0], ["d.MM.y", "d MMM y", "d MMMM y", "d MMMM y EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "%#,##0", "¤#,##0.00", "#E0"], "TRY", "₺", "Türk Lirası", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "THB": ["฿"], "TRY": ["₺"], "TWD": ["NT$"] }, "ltr", plural];
//# sourceMappingURL=tr.js.mapl3dxL/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["tt", [["AM", "PM"], u, u], u, [["Я", "Д", "С", "Ч", "П", "Җ", "Ш"], ["якш.", "дүш.", "сиш.", "чәр.", "пәнҗ.", "җом.", "шим."], ["якшәмбе", "дүшәмбе", "сишәмбе", "чәршәмбе", "пәнҗешәмбе", "җомга", "шимбә"], ["якш.", "дүш.", "сиш.", "чәр.", "пәнҗ.", "җом.", "шим."]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["гыйн.", "фев.", "мар.", "апр.", "май", "июнь", "июль", "авг.", "сент.", "окт.", "нояб.", "дек."], ["гыйнвар", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]], u, [["б.э.к.", "милади"], u, ["безнең эрага кадәр", "милади"]], 1, [6, 0], ["dd.MM.y", "d MMM, y 'ел'", "d MMMM, y 'ел'", "d MMMM, y 'ел', EEEE"], ["H:mm", "H:mm:ss", "H:mm:ss z", "H:mm:ss zzzz"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00 ¤", "#E0"], "RUB", "₽", "Россия сумы", { "JPY": ["JP¥", "¥"], "RUB": ["₽"] }, "ltr", plural];
//# sourceMappingURL=tt.js.mapfSx5/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["twq", [["Subbaahi", "Zaarikay b"], u, u], u, [["H", "T", "T", "L", "L", "L", "S"], ["Alh", "Ati", "Ata", "Ala", "Alm", "Alz", "Asi"], ["Alhadi", "Atinni", "Atalaata", "Alarba", "Alhamiisa", "Alzuma", "Asibti"], ["Alh", "Ati", "Ata", "Ala", "Alm", "Alz", "Asi"]], u, [["Ž", "F", "M", "A", "M", "Ž", "Ž", "U", "S", "O", "N", "D"], ["Žan", "Fee", "Mar", "Awi", "Me", "Žuw", "Žuy", "Ut", "Sek", "Okt", "Noo", "Dee"], ["Žanwiye", "Feewiriye", "Marsi", "Awiril", "Me", "Žuweŋ", "Žuyye", "Ut", "Sektanbur", "Oktoobur", "Noowanbur", "Deesanbur"]], u, [["IJ", "IZ"], u, ["Isaa jine", "Isaa zamanoo"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00¤", "#E0"], "XOF", "F CFA", "CFA Fraŋ (BCEAO)", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=twq.js.mapvֱ\x>/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === Math.floor(n) && (n >= 0 && n <= 1) || n === Math.floor(n) && (n >= 11 && n <= 99))
        return 1;
    return 5;
}
export default ["tzm", [["Zdat azal", "Ḍeffir aza"], u, u], u, [["A", "A", "A", "A", "A", "A", "A"], ["Asa", "Ayn", "Asn", "Akr", "Akw", "Asm", "Asḍ"], ["Asamas", "Aynas", "Asinas", "Akras", "Akwas", "Asimwas", "Asiḍyas"], ["Asa", "Ayn", "Asn", "Akr", "Akw", "Asm", "Asḍ"]], u, [["Y", "Y", "M", "I", "M", "Y", "Y", "Ɣ", "C", "K", "N", "D"], ["Yen", "Yeb", "Mar", "Ibr", "May", "Yun", "Yul", "Ɣuc", "Cut", "Kṭu", "Nwa", "Duj"], ["Yennayer", "Yebrayer", "Mars", "Ibrir", "Mayyu", "Yunyu", "Yulyuz", "Ɣuct", "Cutanbir", "Kṭuber", "Nwanbir", "Dujanbir"]], u, [["ZƐ", "ḌƐ"], u, ["Zdat Ɛisa (TAƔ)", "Ḍeffir Ɛisa (TAƔ)"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "MAD", "MAD", "Derhem Umeṛṛuki", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=tzm.js.map3bw`x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["ug", [["ب", "ك"], ["چ.ب", "چ.ك"], ["چۈشتىن بۇرۇن", "چۈشتىن كېيىن"]], [["چ.ب", "چ.ك"], u, u], [["ي", "د", "س", "چ", "پ", "ج", "ش"], ["يە", "دۈ", "سە", "چا", "پە", "جۈ", "شە"], ["يەكشەنبە", "دۈشەنبە", "سەيشەنبە", "چارشەنبە", "پەيشەنبە", "جۈمە", "شەنبە"], ["ي", "د", "س", "چ", "پ", "ج", "ش"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["يانۋار", "فېۋرال", "مارت", "ئاپرېل", "ماي", "ئىيۇن", "ئىيۇل", "ئاۋغۇست", "سېنتەبىر", "ئۆكتەبىر", "نويابىر", "دېكابىر"], u], u, [["BCE", "مىلادىيە"], u, ["مىلادىيەدىن بۇرۇن", "مىلادىيە"]], 0, [6, 0], ["y-MM-dd", "d-MMM، y", "d-MMMM، y", "y d-MMMM، EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}، {0}", u, "{1} {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "CNY", "￥", "جۇڭگو يۈەنى", { "CNY": ["￥", "¥"], "JPY": ["JP¥", "¥"] }, "rtl", plural];
//# sourceMappingURL=ug.js.mapv2WCxQ/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (v === 0 && (i % 10 === 1 && !(i % 100 === 11)))
        return 1;
    if (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 2 && i % 10 <= 4) && !(i % 100 >= 12 && i % 100 <= 14)))
        return 3;
    if (v === 0 && i % 10 === 0 || (v === 0 && (i % 10 === Math.floor(i % 10) && (i % 10 >= 5 && i % 10 <= 9)) || v === 0 && (i % 100 === Math.floor(i % 100) && (i % 100 >= 11 && i % 100 <= 14))))
        return 4;
    return 5;
}
export default ["uk", [["дп", "пп"], u, u], u, [["Н", "П", "В", "С", "Ч", "П", "С"], ["нд", "пн", "вт", "ср", "чт", "пт", "сб"], ["неділя", "понеділок", "вівторок", "середа", "четвер", "пʼятниця", "субота"], ["нд", "пн", "вт", "ср", "чт", "пт", "сб"]], u, [["с", "л", "б", "к", "т", "ч", "л", "с", "в", "ж", "л", "г"], ["січ.", "лют.", "бер.", "квіт.", "трав.", "черв.", "лип.", "серп.", "вер.", "жовт.", "лист.", "груд."], ["січня", "лютого", "березня", "квітня", "травня", "червня", "липня", "серпня", "вересня", "жовтня", "листопада", "грудня"]], [["С", "Л", "Б", "К", "Т", "Ч", "Л", "С", "В", "Ж", "Л", "Г"], ["січ", "лют", "бер", "кві", "тра", "чер", "лип", "сер", "вер", "жов", "лис", "гру"], ["січень", "лютий", "березень", "квітень", "травень", "червень", "липень", "серпень", "вересень", "жовтень", "листопад", "грудень"]], [["до н.е.", "н.е."], ["до н. е.", "н. е."], ["до нашої ери", "нашої ери"]], 1, [6, 0], ["dd.MM.yy", "d MMM y 'р'.", "d MMMM y 'р'.", "EEEE, d MMMM y 'р'."], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1}, {0}", u, "{1} 'о' {0}", u], [",", " ", ";", "%", "+", "-", "Е", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "UAH", "₴", "українська гривня", { "AUD": [u, "$"], "BRL": [u, "R$"], "BYN": [u, "р."], "CAD": [u, "$"], "CNY": [u, "¥"], "EUR": [u, "€"], "GBP": [u, "£"], "HKD": [u, "$"], "ILS": [u, "₪"], "INR": [u, "₹"], "KRW": [u, "₩"], "MXN": [u, "$"], "NZD": [u, "$"], "PHP": [u, "₱"], "RUR": [u, "р."], "TWD": [u, "$"], "UAH": ["₴"], "UAK": ["крб."], "USD": [u, "$"], "VND": [u, "₫"], "XCD": [u, "$"] }, "ltr", plural];
//# sourceMappingURL=uk.js.map3Yxa/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["und", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
//# sourceMappingURL=und.js.map Xxw/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
export default ["ur", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["اتوار", "پیر", "منگل", "بدھ", "جمعرات", "جمعہ", "ہفتہ"], u, u], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["جنوری", "فروری", "مارچ", "اپریل", "مئی", "جون", "جولائی", "اگست", "ستمبر", "اکتوبر", "نومبر", "دسمبر"], u], u, [["قبل مسیح", "عیسوی"], u, u], 0, [6, 0], ["d/M/yy", "d MMM، y", "d MMMM، y", "EEEE، d MMMM، y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "‎+", "‎-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "PKR", "Rs", "پاکستانی روپیہ", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PKR": ["Rs"], "THB": ["฿"], "TWD": ["NT$"] }, "rtl", plural];
//# sourceMappingURL=ur.js.map0Xxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["uz-Arab", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["ی.", "د.", "س.", "چ.", "پ.", "ج.", "ش."], ["یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], ["ی.", "د.", "س.", "چ.", "پ.", "ج.", "ش."]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["جنو", "فبر", "مار", "اپر", "می", "جون", "جول", "اگس", "سپت", "اکت", "نوم", "دسم"], ["جنوری", "فبروری", "مارچ", "اپریل", "می", "جون", "جولای", "اگست", "سپتمبر", "اکتوبر", "نومبر", "دسمبر"]], u, [["BCE", "CE"], u, u], 6, [4, 5], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "‎+", "‎−", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "AFN", "؋", "افغانی", { "AFN": ["؋"], "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "rtl", plural];
//# sourceMappingURL=uz-Arab.js.map3ʹexT/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["uz-Cyrl", [["ТО", "ТК"], u, u], u, [["Я", "Д", "С", "Ч", "П", "Ж", "Ш"], ["якш", "душ", "сеш", "чор", "пай", "жум", "шан"], ["якшанба", "душанба", "сешанба", "чоршанба", "пайшанба", "жума", "шанба"], ["як", "ду", "се", "чо", "па", "жу", "ша"]], u, [["Я", "Ф", "М", "А", "М", "И", "И", "А", "С", "О", "Н", "Д"], ["янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"], ["январ", "феврал", "март", "апрел", "май", "июн", "июл", "август", "сентябр", "октябр", "ноябр", "декабр"]], u, [["м.а.", "милодий"], u, ["милоддан аввалги", "милодий"]], 1, [6, 0], ["dd/MM/yy", "d MMM, y", "d MMMM, y", "EEEE, dd MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss (z)", "HH:mm:ss (zzzz)"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "ҳақиқий сон эмас", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "UZS", "сўм", "Ўзбекистон сўм", { "JPY": ["JP¥", "¥"], "THB": ["฿"], "USD": ["US$", "$"], "UZS": ["сўм"] }, "ltr", plural];
//# sourceMappingURL=uz-Cyrl.js.mapc)ixe/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["uz-Latn", [["TO", "TK"], u, u], u, [["Y", "D", "S", "C", "P", "J", "S"], ["Yak", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan"], ["yakshanba", "dushanba", "seshanba", "chorshanba", "payshanba", "juma", "shanba"], ["Ya", "Du", "Se", "Ch", "Pa", "Ju", "Sh"]], u, [["Y", "F", "M", "A", "M", "I", "I", "A", "S", "O", "N", "D"], ["yan", "fev", "mar", "apr", "may", "iyn", "iyl", "avg", "sen", "okt", "noy", "dek"], ["yanvar", "fevral", "mart", "aprel", "may", "iyun", "iyul", "avgust", "sentabr", "oktabr", "noyabr", "dekabr"]], [["Y", "F", "M", "A", "M", "I", "I", "A", "S", "O", "N", "D"], ["Yan", "Fev", "Mar", "Apr", "May", "Iyn", "Iyl", "Avg", "Sen", "Okt", "Noy", "Dek"], ["Yanvar", "Fevral", "Mart", "Aprel", "May", "Iyun", "Iyul", "Avgust", "Sentabr", "Oktabr", "Noyabr", "Dekabr"]], [["m.a.", "milodiy"], u, ["miloddan avvalgi", "milodiy"]], 1, [6, 0], ["dd/MM/yy", "d-MMM, y", "d-MMMM, y", "EEEE, d-MMMM, y"], ["HH:mm", "HH:mm:ss", "H:mm:ss (z)", "H:mm:ss (zzzz)"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "son emas", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "UZS", "soʻm", "O‘zbekiston so‘mi", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "USD": ["US$", "$"], "UZS": ["soʻm"] }, "ltr", plural];
//# sourceMappingURL=uz-Latn.js.mapg&ixo/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["uz", [["TO", "TK"], u, u], u, [["Y", "D", "S", "C", "P", "J", "S"], ["Yak", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan"], ["yakshanba", "dushanba", "seshanba", "chorshanba", "payshanba", "juma", "shanba"], ["Ya", "Du", "Se", "Ch", "Pa", "Ju", "Sh"]], u, [["Y", "F", "M", "A", "M", "I", "I", "A", "S", "O", "N", "D"], ["yan", "fev", "mar", "apr", "may", "iyn", "iyl", "avg", "sen", "okt", "noy", "dek"], ["yanvar", "fevral", "mart", "aprel", "may", "iyun", "iyul", "avgust", "sentabr", "oktabr", "noyabr", "dekabr"]], [["Y", "F", "M", "A", "M", "I", "I", "A", "S", "O", "N", "D"], ["Yan", "Fev", "Mar", "Apr", "May", "Iyn", "Iyl", "Avg", "Sen", "Okt", "Noy", "Dek"], ["Yanvar", "Fevral", "Mart", "Aprel", "May", "Iyun", "Iyul", "Avgust", "Sentabr", "Oktabr", "Noyabr", "Dekabr"]], [["m.a.", "milodiy"], u, ["miloddan avvalgi", "milodiy"]], 1, [6, 0], ["dd/MM/yy", "d-MMM, y", "d-MMMM, y", "EEEE, d-MMMM, y"], ["HH:mm", "HH:mm:ss", "H:mm:ss (z)", "H:mm:ss (zzzz)"], ["{1}, {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "son emas", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "UZS", "soʻm", "O‘zbekiston so‘mi", { "BYN": [u, "р."], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "USD": ["US$", "$"], "UZS": ["soʻm"] }, "ltr", plural];
//# sourceMappingURL=uz.js.map76ήTxA/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["vai-Vaii", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["ꕞꕌꔵ", "ꗳꗡꘉ", "ꕚꕞꕚ", "ꕉꕞꕒ", "ꕉꔤꕆꕢ", "ꕉꔤꕀꕮ", "ꔻꔬꔳ"], u, u], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["ꖨꖕꔞ", "ꕒꕡ", "ꕾꖺ", "ꖢꖕ", "ꖑꕱ", "ꖱꘋ", "ꖱꕞ", "ꗛꔕ", "ꕢꕌ", "ꕭꖃ", "ꔞꘋ", "ꖨꖕꗏ"], ["ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ", "ꕒꕡꖝꖕ", "ꕾꖺ", "ꖢꖕ", "ꖑꕱ", "ꖱꘋ", "ꖱꕞꔤ", "ꗛꔕ", "ꕢꕌ", "ꕭꖃ", "ꔞꘋꕔꕿ ꕸꖃꗏ", "ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ"]], u, [["BCE", "CE"], u, u], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "LRD", "$", "ꕞꔤꔫꕩ ꕜꕞꕌ", { "JPY": ["JP¥", "¥"], "LRD": ["$"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=vai-Vaii.js.mapX:/ux\/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["vi", [["s", "c"], ["SA", "CH"], u], [["SA", "CH"], u, u], [["CN", "T2", "T3", "T4", "T5", "T6", "T7"], ["CN", "Th 2", "Th 3", "Th 4", "Th 5", "Th 6", "Th 7"], ["Chủ Nhật", "Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy"], ["CN", "T2", "T3", "T4", "T5", "T6", "T7"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["thg 1", "thg 2", "thg 3", "thg 4", "thg 5", "thg 6", "thg 7", "thg 8", "thg 9", "thg 10", "thg 11", "thg 12"], ["tháng 1", "tháng 2", "tháng 3", "tháng 4", "tháng 5", "tháng 6", "tháng 7", "tháng 8", "tháng 9", "tháng 10", "tháng 11", "tháng 12"]], [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Thg 1", "Thg 2", "Thg 3", "Thg 4", "Thg 5", "Thg 6", "Thg 7", "Thg 8", "Thg 9", "Thg 10", "Thg 11", "Thg 12"], ["Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"]], [["tr. CN", "sau CN"], ["Trước CN", "Sau CN"], ["Trước Thiên Chúa", "Sau Công Nguyên"]], 1, [6, 0], ["dd/MM/y", "d MMM, y", "d MMMM, y", "EEEE, d MMMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{0}, {1}", u, "{0} {1}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "VND", "₫", "Đồng Việt Nam", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "PHP": [u, "₱"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=vi.js.map9(Vxm/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["vun", [["utuko", "kyiukonyi"], u, u], u, [["J", "J", "J", "J", "A", "I", "J"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"], ["Jumapilyi", "Jumatatuu", "Jumanne", "Jumatanu", "Alhamisi", "Ijumaa", "Jumamosi"], ["Jpi", "Jtt", "Jnn", "Jtn", "Alh", "Iju", "Jmo"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], ["Januari", "Februari", "Machi", "Aprilyi", "Mei", "Junyi", "Julyai", "Agusti", "Septemba", "Oktoba", "Novemba", "Desemba"]], u, [["KK", "BK"], u, ["Kabla ya Kristu", "Baada ya Kristu"]], 1, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "TZS", "TSh", "Shilingi ya Tanzania", { "JPY": ["JP¥", "¥"], "TZS": ["TSh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=vun.js.map|̰Rx /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["wae", [["AM", "PM"], u, u], u, [["S", "M", "Z", "M", "F", "F", "S"], ["Sun", "Män", "Ziš", "Mit", "Fró", "Fri", "Sam"], ["Sunntag", "Mäntag", "Zištag", "Mittwuč", "Fróntag", "Fritag", "Samštag"], ["Sun", "Män", "Ziš", "Mit", "Fró", "Fri", "Sam"]], u, [["J", "H", "M", "A", "M", "B", "H", "Ö", "H", "W", "W", "C"], ["Jen", "Hor", "Mär", "Abr", "Mei", "Brá", "Hei", "Öig", "Her", "Wím", "Win", "Chr"], ["Jenner", "Hornig", "Märze", "Abrille", "Meije", "Bráčet", "Heiwet", "Öigšte", "Herbštmánet", "Wímánet", "Wintermánet", "Chrištmánet"]], u, [["v. Chr.", "n. Chr"], u, u], 1, [6, 0], ["y-MM-dd", "d. MMM y", "d. MMMM y", "EEEE, d. MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", "’", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "CHF", "CHF", "CHF", {}, "ltr", plural];
//# sourceMappingURL=wae.js.mapVyPx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["wo", [["Sub", "Ngo"], u, u], u, [["Dib", "Alt", "Tal", "Àla", "Alx", "Àjj", "Ase"], u, ["Dibéer", "Altine", "Talaata", "Àlarba", "Alxamis", "Àjjuma", "Aseer"], ["Dib", "Alt", "Tal", "Àla", "Alx", "Àjj", "Ase"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Sam", "Few", "Mar", "Awr", "Mee", "Suw", "Sul", "Ut", "Sàt", "Okt", "Now", "Des"], ["Samwiyee", "Fewriyee", "Mars", "Awril", "Mee", "Suwe", "Sulet", "Ut", "Sàttumbar", "Oktoobar", "Nowàmbar", "Desàmbar"]], u, [["JC", "AD"], u, ["av. JC", "AD"]], 1, [6, 0], ["dd-MM-y", "d MMM, y", "d MMMM, y", "EEEE, d MMM, y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} - {0}", u, "{1} 'ci' {0}", u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "XOF", "F CFA", "Franc CFA bu Afrik Sowwu-jant", { "JPY": ["JP¥", "¥"] }, "ltr", plural];
//# sourceMappingURL=wo.js.mapbfTxC/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["xh", [["AM", "PM"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["Caw", "Mvu", "Bin", "Tha", "Sin", "Hla", "Mgq"], ["Cawe", "Mvulo", "Lwesibini", "Lwesithathu", "Lwesine", "Lwesihlanu", "Mgqibelo"], ["Caw", "Mvu", "Bin", "Tha", "Sin", "Hla", "Mgq"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["Jan", "Feb", "Mat", "Epr", "Mey", "Jun", "Jul", "Aga", "Sep", "Okt", "Nov", "Dis"], ["Janyuwari", "Februwari", "Matshi", "Epreli", "Meyi", "Juni", "Julayi", "Agasti", "Septemba", "Okthoba", "Novemba", "Disemba"]], u, [["BC", "AD"], u, u], 0, [6, 0], ["y-MM-dd", "y MMM d", "y MMMM d", "y MMMM d, EEEE"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "ZAR", "R", "iRandi yaseMzanzi Afrika", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"], "ZAR": ["R"] }, "ltr", plural];
//# sourceMappingURL=xh.js.mapmXxq/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    if (n === 1)
        return 1;
    return 5;
}
export default ["xog", [["Munkyo", "Eigulo"], u, u], u, [["S", "B", "B", "S", "K", "K", "M"], ["Sabi", "Bala", "Kubi", "Kusa", "Kuna", "Kuta", "Muka"], ["Sabiiti", "Balaza", "Owokubili", "Owokusatu", "Olokuna", "Olokutaanu", "Olomukaaga"], ["Sabi", "Bala", "Kubi", "Kusa", "Kuna", "Kuta", "Muka"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apu", "Maa", "Juu", "Jul", "Agu", "Seb", "Oki", "Nov", "Des"], ["Janwaliyo", "Febwaliyo", "Marisi", "Apuli", "Maayi", "Juuni", "Julaayi", "Agusito", "Sebuttemba", "Okitobba", "Novemba", "Desemba"]], u, [["AZ", "AF"], u, ["Kulisto nga azilawo", "Kulisto nga affile"]], 1, [0, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "UGX", "USh", "Silingi eya Yuganda", { "JPY": ["JP¥", "¥"], "UGX": ["USh"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=xog.js.map'_x/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["yav", [["kiɛmɛ́ɛm", "kisɛ́ndɛ"], u, u], u, [["s", "m", "m", "e", "k", "f", "s"], ["sd", "md", "mw", "et", "kl", "fl", "ss"], ["sɔ́ndiɛ", "móndie", "muányáŋmóndie", "metúkpíápɛ", "kúpélimetúkpiapɛ", "feléte", "séselé"], ["sd", "md", "mw", "et", "kl", "fl", "ss"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["o.1", "o.2", "o.3", "o.4", "o.5", "o.6", "o.7", "o.8", "o.9", "o.10", "o.11", "o.12"], ["pikítíkítie, oólí ú kutúan", "siɛyɛ́, oóli ú kándíɛ", "ɔnsúmbɔl, oóli ú kátátúɛ", "mesiŋ, oóli ú kénie", "ensil, oóli ú kátánuɛ", "ɔsɔn", "efute", "pisuyú", "imɛŋ i puɔs", "imɛŋ i putúk,oóli ú kátíɛ", "makandikɛ", "pilɔndɔ́"]], u, [["k.Y.", "+J.C."], u, ["katikupíen Yésuse", "ékélémkúnupíén n"]], 1, [6, 0], ["d/M/y", "d MMM y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "#,##0.00 ¤", "#E0"], "XAF", "FCFA", "XAF", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=yav.js.map袿xo/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["yo-BJ", [["Àárɔ̀", "Ɔ̀sán"], u, u], u, [["À", "A", "Ì", "Ɔ", "Ɔ", "Ɛ", "À"], ["Àìk", "Aj", "Ìsɛ́g", "Ɔjɔ́r", "Ɔjɔ́b", "Ɛt", "Àbám"], ["Ɔjɔ́ Àìkú", "Ɔjɔ́ Ajé", "Ɔjɔ́ Ìsɛ́gun", "Ɔjɔ́rú", "Ɔjɔ́bɔ", "Ɔjɔ́ Ɛtì", "Ɔjɔ́ Àbámɛ́ta"], ["Àìk", "Aj", "Ìsɛ́g", "Ɔjɔ́r", "Ɔjɔ́b", "Ɛt", "Àbám"]], [["À", "A", "Ì", "Ɔ", "Ɔ", "Ɛ", "À"], ["Àìk", "Aj", "Ìsɛ́g", "Ɔjɔ́r", "Ɔjɔ́b", "Ɛt", "Àbám"], ["Àìkú", "Ajé", "Ìsɛ́gun", "Ɔjɔ́rú", "Ɔjɔ́bɔ", "Ɛtì", "Àbámɛ́ta"], ["Àìk", "Aj", "Ìsɛ́g", "Ɔjɔ́r", "Ɔjɔ́b", "Ɛt", "Àbám"]], [["S", "È", "Ɛ", "Ì", "Ɛ̀", "Ò", "A", "Ò", "O", "Ɔ̀", "B", "Ɔ̀"], ["Shɛ́r", "Èrèl", "Ɛrɛ̀n", "Ìgb", "Ɛ̀bi", "Òkú", "Agɛ", "Ògú", "Owe", "Ɔ̀wà", "Bél", "Ɔ̀pɛ"], ["Oshù Shɛ́rɛ́", "Oshù Èrèlè", "Oshù Ɛrɛ̀nà", "Oshù Ìgbé", "Oshù Ɛ̀bibi", "Oshù Òkúdu", "Oshù Agɛmɔ", "Oshù Ògún", "Oshù Owewe", "Oshù Ɔ̀wàrà", "Oshù Bélú", "Oshù Ɔ̀pɛ̀"]], [["S", "È", "Ɛ", "Ì", "Ɛ̀", "Ò", "A", "Ò", "O", "Ɔ̀", "B", "Ɔ̀"], ["Shɛ́", "Èr", "Ɛr", "Ìg", "Ɛ̀b", "Òk", "Ag", "Òg", "Ow", "Ɔ̀w", "Bé", "Ɔ̀p"], ["Shɛ́rɛ́", "Èrèlè", "Ɛrɛ̀nà", "Ìgbé", "Ɛ̀bibi", "Òkúdu", "Agɛmɔ", "Ògún", "Owewe", "Ɔ̀wàrà", "Bélú", "Ɔ̀pɛ̀"]], [["BCE", "AD"], u, ["Saju Kristi", "Lehin Kristi"]], 1, [6, 0], ["d/M/y", "d MM y", "d MMM y", "EEEE, d MMM y"], ["H:m", "H:m:s", "H:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "XOF", "F CFA", "Faransì ìwɔ̀-oorùn Afíríkà", { "JPY": ["JP¥", "¥"], "NGN": ["₦"], "RUB": ["₽"] }, "ltr", plural];
//# sourceMappingURL=yo-BJ.js.map?vx3/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["yo", [["Àárọ̀", "Ọ̀sán"], u, u], u, [["À", "A", "Ì", "Ọ", "Ọ", "Ẹ", "À"], ["Àìk", "Aj", "Ìsẹ́g", "Ọjọ́r", "Ọjọ́b", "Ẹt", "Àbám"], ["Ọjọ́ Àìkú", "Ọjọ́ Ajé", "Ọjọ́ Ìsẹ́gun", "Ọjọ́rú", "Ọjọ́bọ", "Ọjọ́ Ẹtì", "Ọjọ́ Àbámẹ́ta"], ["Àìk", "Aj", "Ìsẹ́g", "Ọjọ́r", "Ọjọ́b", "Ẹt", "Àbám"]], [["À", "A", "Ì", "Ọ", "Ọ", "Ẹ", "À"], ["Àìk", "Aj", "Ìsẹ́g", "Ọjọ́r", "Ọjọ́b", "Ẹt", "Àbám"], ["Àìkú", "Ajé", "Ìsẹ́gun", "Ọjọ́rú", "Ọjọ́bọ", "Ẹtì", "Àbámẹ́ta"], ["Àìk", "Aj", "Ìsẹ́g", "Ọjọ́r", "Ọjọ́b", "Ẹt", "Àbám"]], [["S", "È", "Ẹ", "Ì", "Ẹ̀", "Ò", "A", "Ò", "O", "Ọ̀", "B", "Ọ̀"], ["Ṣẹ́r", "Èrèl", "Ẹrẹ̀n", "Ìgb", "Ẹ̀bi", "Òkú", "Agẹ", "Ògú", "Owe", "Ọ̀wà", "Bél", "Ọ̀pẹ"], ["Oṣù Ṣẹ́rẹ́", "Oṣù Èrèlè", "Oṣù Ẹrẹ̀nà", "Oṣù Ìgbé", "Oṣù Ẹ̀bibi", "Oṣù Òkúdu", "Oṣù Agẹmọ", "Oṣù Ògún", "Oṣù Owewe", "Oṣù Ọ̀wàrà", "Oṣù Bélú", "Oṣù Ọ̀pẹ̀"]], [["S", "È", "Ẹ", "Ì", "Ẹ̀", "Ò", "A", "Ò", "O", "Ọ̀", "B", "Ọ̀"], ["Ṣẹ́", "Èr", "Ẹr", "Ìg", "Ẹ̀b", "Òk", "Ag", "Òg", "Ow", "Ọ̀w", "Bé", "Ọ̀p"], ["Ṣẹ́rẹ́", "Èrèlè", "Ẹrẹ̀nà", "Ìgbé", "Ẹ̀bibi", "Òkúdu", "Agẹmọ", "Ògún", "Owewe", "Ọ̀wàrà", "Bélú", "Ọ̀pẹ̀"]], [["BCE", "AD"], u, ["Saju Kristi", "Lehin Kristi"]], 1, [6, 0], ["d/M/y", "d MM y", "d MMM y", "EEEE, d MMM y"], ["H:m", "H:m:s", "H:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "NGN", "₦", "Náírà Nàìjíríà", { "JPY": ["JP¥", "¥"], "NGN": ["₦"], "RUB": ["₽"] }, "ltr", plural];
//# sourceMappingURL=yo.js.map0s-hxs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["yrl-CO", [["a. m.", "p. m."], u, u], u, [["M", "M", "M", "M", "S", "Y", "S"], ["mit", "mur", "mmk", "mms", "sup", "yuk", "sau"], ["mituú", "murakipí", "murakí-mukũi", "murakí-musapíri", "supapá", "yukuakú", "saurú"], ["mit", "mur", "mmk", "mms", "sup", "yuk", "sau"]], u, [["Y", "M", "M", "I", "P", "P", "P", "P", "P", "Y", "Y", "Y"], ["ye", "mk", "ms", "id", "pu", "py", "pm", "ps", "pi", "yp", "yy", "ym"], ["yepé", "mukũi", "musapíri", "irũdí", "pú", "pú-yepé", "pú-mukũi", "pú-musapíri", "pú-irũdí", "yepé-putimaã", "yepé-yepé", "yepé-mukũi"]], u, [["K.s.", "K.a."], u, ["Kiristu senũdé", "Kiristu ariré"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "COP", "$", "Peso Kurũbiyawara", { "AUD": ["AU$", "$"], "BOB": ["BUB", "Bs"], "BYN": [u, "p."], "COP": ["$", "COP"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["Esc."], "RON": [u, "L"], "SCR": ["SCRu"], "SYP": [u, "S£"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "VES": ["Bs.S", "VES"], "XAF": ["FCF"], "XOF": ["CFA"], "XPF": ["CFP"], "ZMW": [u, "Zk"] }, "ltr", plural];
//# sourceMappingURL=yrl-CO.js.map`伳ixl/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["yrl-VE", [["a. m.", "p. m."], u, u], u, [["M", "M", "M", "M", "S", "Y", "S"], ["mit", "mur", "mmk", "mms", "sup", "yuk", "sau"], ["mituú", "murakipí", "murakí-mukũi", "murakí-musapíri", "supapá", "yukuakú", "saurú"], ["mit", "mur", "mmk", "mms", "sup", "yuk", "sau"]], u, [["Y", "M", "M", "I", "P", "P", "P", "P", "P", "Y", "Y", "Y"], ["ye", "mk", "ms", "id", "pu", "py", "pm", "ps", "pi", "yp", "yy", "ym"], ["yepé", "mukũi", "musapíri", "irũdí", "pú", "pú-yepé", "pú-mukũi", "pú-musapíri", "pú-irũdí", "yepé-putimaã", "yepé-yepé", "yepé-mukũi"]], u, [["K.s.", "K.a."], u, ["Kiristu senũdé", "Kiristu ariré"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "VES", "Bs.S", "Buriwari Wenesuerawara", { "AUD": ["AU$", "$"], "BOB": ["BUB", "Bs"], "BYN": [u, "p."], "COP": ["$", "COP"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["Esc."], "RON": [u, "L"], "SCR": ["SCRu"], "SYP": [u, "S£"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "VES": ["Bs.S", "VES"], "XAF": ["FCF"], "XOF": ["CFA"], "XPF": ["CFP"], "ZMW": [u, "Zk"] }, "ltr", plural];
//# sourceMappingURL=yrl-VE.js.mapEgxx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["yrl", [["AM", "PM"], u, u], u, [["M", "M", "M", "M", "S", "Y", "S"], ["mit", "mur", "mmk", "mms", "sup", "yuk", "sau"], ["mituú", "murakipí", "murakí-mukũi", "murakí-musapíri", "supapá", "yukuakú", "saurú"], ["mit", "mur", "mmk", "mms", "sup", "yuk", "sau"]], u, [["Y", "M", "M", "I", "P", "P", "P", "P", "P", "Y", "Y", "Y"], ["ye", "mk", "ms", "id", "pu", "py", "pm", "ps", "pi", "yp", "yy", "ym"], ["yepé", "mukũi", "musapíri", "irũdí", "pú", "pú-yepé", "pú-mukũi", "pú-musapíri", "pú-irũdí", "yepé-putimaã", "yepé-yepé", "yepé-mukũi"]], u, [["K.s.", "K.a."], u, ["Kiristu senũdé", "Kiristu ariré"]], 0, [6, 0], ["dd/MM/y", "d MMM y", "d MMMM y", "EEEE, d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", ".", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤ #,##0.00", "#E0"], "BRL", "R$", "Reau Brasiuwara", { "AUD": ["AU$", "$"], "BOB": ["BUB", "Bs"], "BYN": [u, "p."], "COP": ["$", "COP"], "JPY": ["JP¥", "¥"], "PHP": [u, "₱"], "PTE": ["Esc."], "RON": [u, "L"], "SCR": ["SCRu"], "SYP": [u, "S£"], "THB": ["฿"], "TWD": ["NT$"], "USD": ["US$", "$"], "VES": ["Bs.S", "VES"], "XAF": ["FCF"], "XOF": ["CFA"], "XPF": ["CFP"], "ZMW": [u, "Zk"] }, "ltr", plural];
//# sourceMappingURL=yrl.js.map1E`x
/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["zh-Hans", [["上午", "下午"], u, u], u, [["日", "一", "二", "三", "四", "五", "六"], ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]], u, [["公元前", "公元"], u, u], 0, [6, 0], ["y/M/d", "y年M月d日", u, "y年M月d日EEEE"], ["HH:mm", "HH:mm:ss", "z HH:mm:ss", "zzzz HH:mm:ss"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "CNY", "¥", "人民币", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CNY": ["¥"], "ILR": ["ILS"], "JPY": ["JP¥", "¥"], "KRW": ["￦", "₩"], "PHP": [u, "₱"], "RUR": [u, "р."], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=zh-Hans.js.mapR$Vx\ VyueX|西元前", "西	非数值?ￓD	￥", "¥MYFyue-Hans.js.map)*Ux[/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["zh-Hant", [["上午", "下午"], u, u], u, [["日", "一", "二", "三", "四", "五", "六"], ["週日", "週一", "週二", "週三", "週四", "週五", "週六"], ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], ["日", "一", "二", "三", "四", "五", "六"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], u], u, [["西元前", "西元"], u, u], 0, [6, 0], ["y/M/d", "y年M月d日", u, "y年M月d日 EEEE"], ["Bh:mm", "Bh:mm:ss", "Bh:mm:ss [z]", "Bh:mm:ss [zzzz]"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "非數值", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "TWD", "$", "新台幣", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "KRW": ["￦", "₩"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "TWD": ["$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=zh-Hant.js.mapHhxs 
	VyueX_[uXH&ah:mm", "ah:mm:ss", "ah:mm:ss [z]", "aHKD", "HK$", "港z\Fyue-Hant.js.map}%&Nx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["yue", [["上午", "下午"], u, u], u, [["日", "一", "二", "三", "四", "五", "六"], ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], u, ["日", "一", "二", "三", "四", "五", "六"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], u], u, [["西元前", "西元"], u, u], 0, [6, 0], ["y/M/d", "y年M月d日", u, "y年M月d日 EEEE"], ["ah:mm", "ah:mm:ss", "ah:mm:ss [z]", "ah:mm:ss [zzzz]"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "非數值", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "HKD", "HK$", "港幣", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "KRW": ["￦", "₩"], "PHP": [u, "₱"], "RUR": [u, "р."], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=yue.js.mapR/qx/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["zgh", [["ⵜⵉⴼⴰⵡⵜ", "ⵜⴰⴷⴳⴳⵯⴰⵜ"], u, u], u, [["S", "M", "T", "W", "T", "F", "S"], ["ⴰⵙⴰ", "ⴰⵢⵏ", "ⴰⵙⵉ", "ⴰⴽⵕ", "ⴰⴽⵡ", "ⴰⵙⵉⵎ", "ⴰⵙⵉⴹ"], ["ⴰⵙⴰⵎⴰⵙ", "ⴰⵢⵏⴰⵙ", "ⴰⵙⵉⵏⴰⵙ", "ⴰⴽⵕⴰⵙ", "ⴰⴽⵡⴰⵙ", "ⴰⵙⵉⵎⵡⴰⵙ", "ⴰⵙⵉⴹⵢⴰⵙ"], ["ⴰⵙⴰ", "ⴰⵢⵏ", "ⴰⵙⵉ", "ⴰⴽⵕ", "ⴰⴽⵡ", "ⴰⵙⵉⵎ", "ⴰⵙⵉⴹ"]], u, [["ⵉ", "ⴱ", "ⵎ", "ⵉ", "ⵎ", "ⵢ", "ⵢ", "ⵖ", "ⵛ", "ⴽ", "ⵏ", "ⴷ"], ["ⵉⵏⵏ", "ⴱⵕⴰ", "ⵎⴰⵕ", "ⵉⴱⵔ", "ⵎⴰⵢ", "ⵢⵓⵏ", "ⵢⵓⵍ", "ⵖⵓⵛ", "ⵛⵓⵜ", "ⴽⵜⵓ", "ⵏⵓⵡ", "ⴷⵓⵊ"], ["ⵉⵏⵏⴰⵢⵔ", "ⴱⵕⴰⵢⵕ", "ⵎⴰⵕⵚ", "ⵉⴱⵔⵉⵔ", "ⵎⴰⵢⵢⵓ", "ⵢⵓⵏⵢⵓ", "ⵢⵓⵍⵢⵓⵣ", "ⵖⵓⵛⵜ", "ⵛⵓⵜⴰⵏⴱⵉⵔ", "ⴽⵜⵓⴱⵔ", "ⵏⵓⵡⴰⵏⴱⵉⵔ", "ⴷⵓⵊⴰⵏⴱⵉⵔ"]], u, [["ⴷⴰⵄ", "ⴷⴼⵄ"], u, ["ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ", "ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ"]], 1, [6, 0], ["d/M/y", "d MMM, y", "d MMMM y", "EEEE d MMMM y"], ["HH:mm", "HH:mm:ss", "HH:mm:ss z", "HH:mm:ss zzzz"], ["{1} {0}", u, u, u], [",", " ", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0 %", "#,##0.00¤", "#E0"], "MAD", "MAD", "ⴰⴷⵔⵉⵎ ⵏ ⵍⵎⵖⵔⵉⴱ", { "JPY": ["JP¥", "¥"], "USD": ["US$", "$"] }, "ltr", plural];
//# sourceMappingURL=zgh.js.map5Sx:/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["zh-Hant-HK", [["上午", "下午"], u, u], u, [["日", "一", "二", "三", "四", "五", "六"], ["週日", "週一", "週二", "週三", "週四", "週五", "週六"], ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], ["日", "一", "二", "三", "四", "五", "六"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], u], u, [["公元前", "公元"], u, u], 0, [6, 0], ["d/M/y", "y年M月d日", u, "y年M月d日EEEE"], ["ah:mm", "ah:mm:ss", "ah:mm:ss [z]", "ah:mm:ss [zzzz]"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "非數值", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "HKD", "HK$", "港元", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=zh-Hant-HK.js.mapＸGx*
\s]]?周日", "周一", "周二", "周三", "周四", "周五", "周f?周日", "周一", "周二", "周三", "周四", "周五", "周["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]]=8tCz ah:mm:ss", "zzzz ah:mm:ssSNaN2zILR": ["ILS"], "JPY": ["JP¥", "¥"], "KRW": ["￦", "₩"], "PHP": [u, "₱"], "RUR": [u, "р."], "TWD": ["NT$"], "USD": ["US$As-HK.js.map9PTxO/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["zh-Hant-MO", [["上午", "下午"], u, u], u, [["日", "一", "二", "三", "四", "五", "六"], ["週日", "週一", "週二", "週三", "週四", "週五", "週六"], ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], ["日", "一", "二", "三", "四", "五", "六"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], u], u, [["公元前", "公元"], u, u], 0, [6, 0], ["d/M/y", "y年M月d日", u, "y年M月d日EEEE"], ["ah:mm", "ah:mm:ss", "ah:mm:ss [z]", "ah:mm:ss [zzzz]"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "非數值", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "MOP", "MOP$", "澳門元", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "MOP": ["MOP$"], "PHP": [u, "₱"], "RON": [u, "L"], "RUR": [u, "р."], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=zh-Hant-MO.js.map#\xR
\s]]?周日", "周一", "周二", "周三", "周四", "周五", "周f?周日", "周一", "周二", "周三", "周四", "周五", "周["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]]=8tCz ah:mm:ss", "zzzz ah:mm:ssSNaN2K币.9ILR": ["ILS"], "JPY": ["JP¥", "¥"], "KRW": ["￦", "₩*TWD": ["NT$Qs-MO.js.mapsax/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["zh-Hans-SG", [["上午", "下午"], u, u], u, [["日", "一", "二", "三", "四", "五", "六"], ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]], u, [["公元前", "公元"], u, u], 0, [6, 0], ["dd/MM/yy", "y年M月d日", u, "y年M月d日EEEE"], ["ah:mm", "ah:mm:ss", "z ah:mm:ss", "zzzz ah:mm:ss"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "SGD", "$", "新加坡元", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "ILR": ["ILS"], "JPY": ["JP¥", "¥"], "KRW": ["￦", "₩"], "PHP": [u, "₱"], "RUR": [u, "р."], "SGD": ["$"], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=zh-Hans-SG.js.map`x /**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// THIS CODE IS GENERATED - DO NOT MODIFY.
const u = undefined;
function plural(val) {
    const n = val;
    return 5;
}
export default ["zh", [["上午", "下午"], u, u], u, [["日", "一", "二", "三", "四", "五", "六"], ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]], u, [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]], u, [["公元前", "公元"], u, u], 0, [6, 0], ["y/M/d", "y年M月d日", u, "y年M月d日EEEE"], ["HH:mm", "HH:mm:ss", "z HH:mm:ss", "zzzz HH:mm:ss"], ["{1} {0}", u, u, u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "CNY", "¥", "人民币", { "AUD": ["AU$", "$"], "BYN": [u, "р."], "CNY": ["¥"], "ILR": ["ILS"], "JPY": ["JP¥", "¥"], "KRW": ["￦", "₩"], "PHP": [u, "₱"], "RUR": [u, "р."], "TWD": ["NT$"], "USD": ["US$", "$"], "XXX": [] }, "ltr", plural];
//# sourceMappingURL=zh.js.map軥x[r/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { ModuleWithProviders } from '@angular/core';

/**
 * A token used to manipulate and access values stored in `HttpContext`.
 *
 * @publicApi
 */
declare class HttpContextToken<T> {
    readonly defaultValue: () => T;
    constructor(defaultValue: () => T);
}
/**
 * Http context stores arbitrary user defined values and ensures type safety without
 * actually knowing the types. It is backed by a `Map` and guarantees that keys do not clash.
 *
 * This context is mutable and is shared between cloned requests unless explicitly specified.
 *
 * @usageNotes
 *
 * ### Usage Example
 *
 * ```ts
 * // inside cache.interceptors.ts
 * export const IS_CACHE_ENABLED = new HttpContextToken<boolean>(() => false);
 *
 * export class CacheInterceptor implements HttpInterceptor {
 *
 *   intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {
 *     if (req.context.get(IS_CACHE_ENABLED) === true) {
 *       return ...;
 *     }
 *     return delegate.handle(req);
 *   }
 * }
 *
 * // inside a service
 *
 * this.httpClient.get('/api/weather', {
 *   context: new HttpContext().set(IS_CACHE_ENABLED, true)
 * }).subscribe(...);
 * ```
 *
 * @publicApi
 */
declare class HttpContext {
    private readonly map;
    /**
     * Store a value in the context. If a value is already present it will be overwritten.
     *
     * @param token The reference to an instance of `HttpContextToken`.
     * @param value The value to store.
     *
     * @returns A reference to itself for easy chaining.
     */
    set<T>(token: HttpContextToken<T>, value: T): HttpContext;
    /**
     * Retrieve the value associated with the given token.
     *
     * @param token The reference to an instance of `HttpContextToken`.
     *
     * @returns The stored value or default if one is defined.
     */
    get<T>(token: HttpContextToken<T>): T;
    /**
     * Delete the value associated with the given token.
     *
     * @param token The reference to an instance of `HttpContextToken`.
     *
     * @returns A reference to itself for easy chaining.
     */
    delete(token: HttpContextToken<unknown>): HttpContext;
    /**
     * Checks for existence of a given token.
     *
     * @param token The reference to an instance of `HttpContextToken`.
     *
     * @returns True if the token exists, false otherwise.
     */
    has(token: HttpContextToken<unknown>): boolean;
    /**
     * @returns a list of tokens currently stored in the context.
     */
    keys(): IterableIterator<HttpContextToken<unknown>>;
}

/**
 * Represents the header configuration options for an HTTP request.
 * Instances are immutable. Modifying methods return a cloned
 * instance with the change. The original object is never changed.
 *
 * @publicApi
 */
declare class HttpHeaders {
    /**
     * Internal map of lowercase header names to values.
     */
    private headers;
    /**
     * Internal map of lowercased header names to the normalized
     * form of the name (the form seen first).
     */
    private normalizedNames;
    /**
     * Complete the lazy initialization of this object (needed before reading).
     */
    private lazyInit;
    /**
     * Queued updates to be materialized the next initialization.
     */
    private lazyUpdate;
    /**  Constructs a new HTTP header object with the given values.*/
    constructor(headers?: string | {
        [name: string]: string | number | (string | number)[];
    } | Headers);
    /**
     * Checks for existence of a given header.
     *
     * @param name The header name to check for existence.
     *
     * @returns True if the header exists, false otherwise.
     */
    has(name: string): boolean;
    /**
     * Retrieves the first value of a given header.
     *
     * @param name The header name.
     *
     * @returns The value string if the header exists, null otherwise
     */
    get(name: string): string | null;
    /**
     * Retrieves the names of the headers.
     *
     * @returns A list of header names.
     */
    keys(): string[];
    /**
     * Retrieves a list of values for a given header.
     *
     * @param name The header name from which to retrieve values.
     *
     * @returns A string of values if the header exists, null otherwise.
     */
    getAll(name: string): string[] | null;
    /**
     * Appends a new value to the existing set of values for a header
     * and returns them in a clone of the original instance.
     *
     * @param name The header name for which to append the values.
     * @param value The value to append.
     *
     * @returns A clone of the HTTP headers object with the value appended to the given header.
     */
    append(name: string, value: string | string[]): HttpHeaders;
    /**
     * Sets or modifies a value for a given header in a clone of the original instance.
     * If the header already exists, its value is replaced with the given value
     * in the returned object.
     *
     * @param name The header name.
     * @param value The value or values to set or override for the given header.
     *
     * @returns A clone of the HTTP headers object with the newly set header value.
     */
    set(name: string, value: string | string[]): HttpHeaders;
    /**
     * Deletes values for a given header in a clone of the original instance.
     *
     * @param name The header name.
     * @param value The value or values to delete for the given header.
     *
     * @returns A clone of the HTTP headers object with the given value deleted.
     */
    delete(name: string, value?: string | string[]): HttpHeaders;
    private maybeSetNormalizedName;
    private init;
    private copyFrom;
    private clone;
    private applyUpdate;
    private addHeaderEntry;
    private setHeaderEntries;
}

/**
 * A codec for encoding and decoding parameters in URLs.
 *
 * Used by `HttpParams`.
 *
 * @publicApi
 **/
interface HttpParameterCodec {
    encodeKey(key: string): string;
    encodeValue(value: string): string;
    decodeKey(key: string): string;
    decodeValue(value: string): string;
}
/**
 * Provides encoding and decoding of URL parameter and query-string values.
 *
 * Serializes and parses URL parameter keys and values to encode and decode them.
 * If you pass URL query parameters without encoding,
 * the query parameters can be misinterpreted at the receiving end.
 *
 *
 * @publicApi
 */
declare class HttpUrlEncodingCodec implements HttpParameterCodec {
    /**
     * Encodes a key name for a URL parameter or query-string.
     * @param key The key name.
     * @returns The encoded key name.
     */
    encodeKey(key: string): string;
    /**
     * Encodes the value of a URL parameter or query-string.
     * @param value The value.
     * @returns The encoded value.
     */
    encodeValue(value: string): string;
    /**
     * Decodes an encoded URL parameter or query-string key.
     * @param key The encoded key name.
     * @returns The decoded key name.
     */
    decodeKey(key: string): string;
    /**
     * Decodes an encoded URL parameter or query-string value.
     * @param value The encoded value.
     * @returns The decoded value.
     */
    decodeValue(value: string): string;
}
/**
 * Options used to construct an `HttpParams` instance.
 *
 * @publicApi
 */
interface HttpParamsOptions {
    /**
     * String representation of the HTTP parameters in URL-query-string format.
     * Mutually exclusive with `fromObject`.
     */
    fromString?: string;
    /** Object map of the HTTP parameters. Mutually exclusive with `fromString`. */
    fromObject?: {
        [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;
    };
    /** Encoding codec used to parse and serialize the parameters. */
    encoder?: HttpParameterCodec;
}
/**
 * An HTTP request/response body that represents serialized parameters,
 * per the MIME type `application/x-www-form-urlencoded`.
 *
 * This class is immutable; all mutation operations return a new instance.
 *
 * @publicApi
 */
declare class HttpParams {
    private map;
    private encoder;
    private updates;
    private cloneFrom;
    constructor(options?: HttpParamsOptions);
    /**
     * Reports whether the body includes one or more values for a given parameter.
     * @param param The parameter name.
     * @returns True if the parameter has one or more values,
     * false if it has no value or is not present.
     */
    has(param: string): boolean;
    /**
     * Retrieves the first value for a parameter.
     * @param param The parameter name.
     * @returns The first value of the given parameter,
     * or `null` if the parameter is not present.
     */
    get(param: string): string | null;
    /**
     * Retrieves all values for a  parameter.
     * @param param The parameter name.
     * @returns All values in a string array,
     * or `null` if the parameter not present.
     */
    getAll(param: string): string[] | null;
    /**
     * Retrieves all the parameters for this body.
     * @returns The parameter names in a string array.
     */
    keys(): string[];
    /**
     * Appends a new value to existing values for a parameter.
     * @param param The parameter name.
     * @param value The new value to add.
     * @return A new body with the appended value.
     */
    append(param: string, value: string | number | boolean): HttpParams;
    /**
     * Constructs a new body with appended values for the given parameter name.
     * @param params parameters and values
     * @return A new body with the new value.
     */
    appendAll(params: {
        [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;
    }): HttpParams;
    /**
     * Replaces the value for a parameter.
     * @param param The parameter name.
     * @param value The new value.
     * @return A new body with the new value.
     */
    set(param: string, value: string | number | boolean): HttpParams;
    /**
     * Removes a given value or all values from a parameter.
     * @param param The parameter name.
     * @param value The value to remove, if provided.
     * @return A new body with the given value removed, or with all values
     * removed if no value is specified.
     */
    delete(param: string, value?: string | number | boolean): HttpParams;
    /**
     * Serializes the body to an encoded string, where key-value pairs (separated by `=`) are
     * separated by `&`s.
     */
    toString(): string;
    private clone;
    private init;
}

/**
 * An outgoing HTTP request with an optional typed body.
 *
 * `HttpRequest` represents an outgoing request, including URL, method,
 * headers, body, and other request configuration options. Instances should be
 * assumed to be immutable. To modify a `HttpRequest`, the `clone`
 * method should be used.
 *
 * @publicApi
 */
declare class HttpRequest<T> {
    readonly url: string;
    /**
     * The request body, or `null` if one isn't set.
     *
     * Bodies are not enforced to be immutable, as they can include a reference to any
     * user-defined data type. However, interceptors should take care to preserve
     * idempotence by treating them as such.
     */
    readonly body: T | null;
    /**
     * Outgoing headers for this request.
     */
    readonly headers: HttpHeaders;
    /**
     * Shared and mutable context that can be used by interceptors
     */
    readonly context: HttpContext;
    /**
     * Whether this request should be made in a way that exposes progress events.
     *
     * Progress events are expensive (change detection runs on each event) and so
     * they should only be requested if the consumer intends to monitor them.
     *
     * Note: The `FetchBackend` doesn't support progress report on uploads.
     */
    readonly reportProgress: boolean;
    /**
     * Whether this request should be sent with outgoing credentials (cookies).
     */
    readonly withCredentials: boolean;
    /**
     * The expected response type of the server.
     *
     * This is used to parse the response appropriately before returning it to
     * the requestee.
     */
    readonly responseType: 'arraybuffer' | 'blob' | 'json' | 'text';
    /**
     * The outgoing HTTP request method.
     */
    readonly method: string;
    /**
     * Outgoing URL parameters.
     *
     * To pass a string representation of HTTP parameters in the URL-query-string format,
     * the `HttpParamsOptions`' `fromString` may be used. For example:
     *
     * ```ts
     * new HttpParams({fromString: 'angular=awesome'})
     * ```
     */
    readonly params: HttpParams;
    /**
     * The outgoing URL with all URL parameters set.
     */
    readonly urlWithParams: string;
    /**
     * The HttpTransferCache option for the request
     */
    readonly transferCache?: {
        includeHeaders?: string[];
    } | boolean;
    constructor(method: 'GET' | 'HEAD', url: string, init?: {
        headers?: HttpHeaders;
        context?: HttpContext;
        reportProgress?: boolean;
        params?: HttpParams;
        responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
        withCredentials?: boolean;
        /**
         * This property accepts either a boolean to enable/disable transferring cache for eligible
         * requests performed using `HttpClient`, or an object, which allows to configure cache
         * parameters, such as which headers should be included (no headers are included by default).
         *
         * Setting this property will override the options passed to `provideClientHydration()` for this
         * particular request
         */
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    });
    constructor(method: 'DELETE' | 'JSONP' | 'OPTIONS', url: string, init?: {
        headers?: HttpHeaders;
        context?: HttpContext;
        reportProgress?: boolean;
        params?: HttpParams;
        responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
        withCredentials?: boolean;
    });
    constructor(method: 'POST', url: string, body: T | null, init?: {
        headers?: HttpHeaders;
        context?: HttpContext;
        reportProgress?: boolean;
        params?: HttpParams;
        responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
        withCredentials?: boolean;
        /**
         * This property accepts either a boolean to enable/disable transferring cache for eligible
         * requests performed using `HttpClient`, or an object, which allows to configure cache
         * parameters, such as which headers should be included (no headers are included by default).
         *
         * Setting this property will override the options passed to `provideClientHydration()` for this
         * particular request
         */
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    });
    constructor(method: 'PUT' | 'PATCH', url: string, body: T | null, init?: {
        headers?: HttpHeaders;
        context?: HttpContext;
        reportProgress?: boolean;
        params?: HttpParams;
        responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
        withCredentials?: boolean;
    });
    constructor(method: string, url: string, body: T | null, init?: {
        headers?: HttpHeaders;
        context?: HttpContext;
        reportProgress?: boolean;
        params?: HttpParams;
        responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
        withCredentials?: boolean;
        /**
         * This property accepts either a boolean to enable/disable transferring cache for eligible
         * requests performed using `HttpClient`, or an object, which allows to configure cache
         * parameters, such as which headers should be included (no headers are included by default).
         *
         * Setting this property will override the options passed to `provideClientHydration()` for this
         * particular request
         */
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
    });
    /**
     * Transform the free-form body into a serialized format suitable for
     * transmission to the server.
     */
    serializeBody(): ArrayBuffer | Blob | FormData | URLSearchParams | string | null;
    /**
     * Examine the body and attempt to infer an appropriate MIME type
     * for it.
     *
     * If no such type can be inferred, this method will return `null`.
     */
    detectContentTypeHeader(): string | null;
    clone(): HttpRequest<T>;
    clone(update: {
        headers?: HttpHeaders;
        context?: HttpContext;
        reportProgress?: boolean;
        params?: HttpParams;
        responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
        body?: T | null;
        method?: string;
        url?: string;
        setHeaders?: {
            [name: string]: string | string[];
        };
        setParams?: {
            [param: string]: string;
        };
    }): HttpRequest<T>;
    clone<V>(update: {
        headers?: HttpHeaders;
        context?: HttpContext;
        reportProgress?: boolean;
        params?: HttpParams;
        responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
        withCredentials?: boolean;
        transferCache?: {
            includeHeaders?: string[];
        } | boolean;
        body?: V | null;
        method?: string;
        url?: string;
        setHeaders?: {
            [name: string]: string | string[];
        };
        setParams?: {
            [param: string]: string;
        };
    }): HttpRequest<V>;
}

/**
 * Type enumeration for the different kinds of `HttpEvent`.
 *
 * @publicApi
 */
declare enum HttpEventType {
    /**
     * The request was sent out over the wire.
     */
    Sent = 0,
    /**
     * An upload progress event was received.
     *
     * Note: The `FetchBackend` doesn't support progress report on uploads.
     */
    UploadProgress = 1,
    /**
     * The response status code and headers were received.
     */
    ResponseHeader = 2,
    /**
     * A download progress event was received.
     */
    DownloadProgress = 3,
    /**
     * The full response including the body was received.
     */
    Response = 4,
    /**
     * A custom event from an interceptor or a backend.
     */
    User = 5
}
/**
 * Base interface for progress events.
 *
 * @publicApi
 */
interface HttpProgressEvent {
    /**
     * Progress event type is either upload or download.
     */
    type: HttpEventType.DownloadProgress | HttpEventType.UploadProgress;
    /**
     * Number of bytes uploaded or downloaded.
     */
    loaded: number;
    /**
     * Total number of bytes to upload or download. Depending on the request or
     * response, this may not be computable and thus may not be present.
     */
    total?: number;
}
/**
 * A download progress event.
 *
 * @publicApi
 */
interface HttpDownloadProgressEvent extends HttpProgressEvent {
    type: HttpEventType.DownloadProgress;
    /**
     * The partial response body as downloaded so far.
     *
     * Only present if the responseType was `text`.
     */
    partialText?: string;
}
/**
 * An upload progress event.
 *
 * Note: The `FetchBackend` doesn't support progress report on uploads.
 *
 * @publicApi
 */
interface HttpUploadProgressEvent extends HttpProgressEvent {
    type: HttpEventType.UploadProgress;
}
/**
 * An event indicating that the request was sent to the server. Useful
 * when a request may be retried multiple times, to distinguish between
 * retries on the final event stream.
 *
 * @publicApi
 */
interface HttpSentEvent {
    type: HttpEventType.Sent;
}
/**
 * A user-defined event.
 *
 * Grouping all custom events under this type ensures they will be handled
 * and forwarded by all implementations of interceptors.
 *
 * @publicApi
 */
interface HttpUserEvent<T> {
    type: HttpEventType.User;
}
/**
 * Union type for all possible events on the response stream.
 *
 * Typed according to the expected type of the response.
 *
 * @publicApi
 */
type HttpEvent<T> = HttpSentEvent | HttpHeaderResponse | HttpResponse<T> | HttpProgressEvent | HttpUserEvent<T>;
/**
 * Base class for both `HttpResponse` and `HttpHeaderResponse`.
 *
 * @publicApi
 */
declare abstract class HttpResponseBase {
    /**
     * All response headers.
     */
    readonly headers: HttpHeaders;
    /**
     * Response status code.
     */
    readonly status: number;
    /**
     * Textual description of response status code, defaults to OK.
     *
     * Do not depend on this.
     */
    readonly statusText: string;
    /**
     * URL of the resource retrieved, or null if not available.
     */
    readonly url: string | null;
    /**
     * Whether the status code falls in the 2xx range.
     */
    readonly ok: boolean;
    /**
     * Type of the response, narrowed to either the full response or the header.
     */
    readonly type: HttpEventType.Response | HttpEventType.ResponseHeader;
    /**
     * Super-constructor for all responses.
     *
     * The single parameter accepted is an initialization hash. Any properties
     * of the response passed there will override the default values.
     */
    constructor(init: {
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    }, defaultStatus?: number, defaultStatusText?: string);
}
/**
 * A partial HTTP response which only includes the status and header data,
 * but no response body.
 *
 * `HttpHeaderResponse` is a `HttpEvent` available on the response
 * event stream, only when progress events are requested.
 *
 * @publicApi
 */
declare class HttpHeaderResponse extends HttpResponseBase {
    /**
     * Create a new `HttpHeaderResponse` with the given parameters.
     */
    constructor(init?: {
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    });
    readonly type: HttpEventType.ResponseHeader;
    /**
     * Copy this `HttpHeaderResponse`, overriding its contents with the
     * given parameter hash.
     */
    clone(update?: {
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    }): HttpHeaderResponse;
}
/**
 * A full HTTP response, including a typed response body (which may be `null`
 * if one was not returned).
 *
 * `HttpResponse` is a `HttpEvent` available on the response event
 * stream.
 *
 * @publicApi
 */
declare class HttpResponse<T> extends HttpResponseBase {
    /**
     * The response body, or `null` if one was not returned.
     */
    readonly body: T | null;
    /**
     * Construct a new `HttpResponse`.
     */
    constructor(init?: {
        body?: T | null;
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    });
    readonly type: HttpEventType.Response;
    clone(): HttpResponse<T>;
    clone(update: {
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    }): HttpResponse<T>;
    clone<V>(update: {
        body?: V | null;
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    }): HttpResponse<V>;
}
/**
 * A response that represents an error or failure, either from a
 * non-successful HTTP status, an error while executing the request,
 * or some other failure which occurred during the parsing of the response.
 *
 * Any error returned on the `Observable` response stream will be
 * wrapped in an `HttpErrorResponse` to provide additional context about
 * the state of the HTTP layer when the error occurred. The error property
 * will contain either a wrapped Error object or the error response returned
 * from the server.
 *
 * @publicApi
 */
declare class HttpErrorResponse extends HttpResponseBase implements Error {
    readonly name = "HttpErrorResponse";
    readonly message: string;
    readonly error: any | null;
    /**
     * Errors are never okay, even when the status code is in the 2xx success range.
     */
    readonly ok = false;
    constructor(init: {
        error?: any;
        headers?: HttpHeaders;
        status?: number;
        statusText?: string;
        url?: string;
    });
}
/**
 * Http status codes.
 * As per https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
 * @publicApi
 */
declare enum HttpStatusCode {
    Continue = 100,
    SwitchingProtocols = 101,
    Processing = 102,
    EarlyHints = 103,
    Ok = 200,
    Created = 201,
    Accepted = 202,
    NonAuthoritativeInformation = 203,
    NoContent = 204,
    ResetContent = 205,
    PartialContent = 206,
    MultiStatus = 207,
    AlreadyReported = 208,
    ImUsed = 226,
    MultipleChoices = 300,
    MovedPermanently = 301,
    Found = 302,
    SeeOther = 303,
    NotModified = 304,
    UseProxy = 305,
    Unused = 306,
    TemporaryRedirect = 307,
    PermanentRedirect = 308,
    BadRequest = 400,
    Unauthorized = 401,
    PaymentRequired = 402,
    Forbidden = 403,
    NotFound = 404,
    MethodNotAllowed = 405,
    NotAcceptable = 406,
    ProxyAuthenticationRequired = 407,
    RequestTimeout = 408,
    Conflict = 409,
    Gone = 410,
    LengthRequired = 411,
    PreconditionFailed = 412,
    PayloadTooLarge = 413,
    UriTooLong = 414,
    UnsupportedMediaType = 415,
    RangeNotSatisfiable = 416,
    ExpectationFailed = 417,
    ImATeapot = 418,
    MisdirectedRequest = 421,
    UnprocessableEntity = 422,
    Locked = 423,
    FailedDependency = 424,
    TooEarly = 425,
    UpgradeRequired = 426,
    PreconditionRequired = 428,
    TooManyRequests = 429,
    RequestHeaderFieldsTooLarge = 431,
    UnavailableForLegalReasons = 451,
    InternalServerError = 500,
    NotImplemented = 501,
    BadGateway = 502,
    ServiceUnavailable = 503,
    GatewayTimeout = 504,
    HttpVersionNotSupported = 505,
    VariantAlsoNegotiates = 506,
    InsufficientStorage = 507,
    LoopDetected = 508,
    NotExtended = 510,
    NetworkAuthenticationRequired = 511
}

/**
 * Configures XSRF protection support for outgoing requests.
 *
 * For a server that supports a cookie-based XSRF protection system,
 * use directly to configure XSRF protection with the correct
 * cookie and header names.
 *
 * If no names are supplied, the default cookie name is `XSRF-TOKEN`
 * and the default header name is `X-XSRF-TOKEN`.
 *
 * @publicApi
 * @deprecated Use withXsrfConfiguration({cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN'}) as
 *     providers instead or `withNoXsrfProtection` if you want to disabled XSRF protection.
 */
declare class HttpClientXsrfModule {
    /**
     * Disable the default XSRF protection.
     */
    static disable(): ModuleWithProviders<HttpClientXsrfModule>;
    /**
     * Configure XSRF protection.
     * @param options An object that can specify either or both
     * cookie name or header name.
     * - Cookie name default is `XSRF-TOKEN`.
     * - Header name default is `X-XSRF-TOKEN`.
     *
     */
    static withOptions(options?: {
        cookieName?: string;
        headerName?: string;
    }): ModuleWithProviders<HttpClientXsrfModule>;
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpClientXsrfModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<HttpClientXsrfModule, never, never, never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<HttpClientXsrfModule>;
}
/**
 * Configures the dependency injector for `HttpClient`
 * with supporting services for XSRF. Automatically imported by `HttpClientModule`.
 *
 * You can add interceptors to the chain behind `HttpClient` by binding them to the
 * multiprovider for built-in DI token `HTTP_INTERCEPTORS`.
 *
 * @publicApi
 * @deprecated use `provideHttpClient(withInterceptorsFromDi())` as providers instead
 */
declare class HttpClientModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpClientModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<HttpClientModule, never, never, never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<HttpClientModule>;
}
/**
 * Configures the dependency injector for `HttpClient`
 * with supporting services for JSONP.
 * Without this module, Jsonp requests reach the backend
 * with method JSONP, where they are rejected.
 *
 * @publicApi
 * @deprecated `withJsonpSupport()` as providers instead
 */
declare class HttpClientJsonpModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<HttpClientJsonpModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<HttpClientJsonpModule, never, never, never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<HttpClientJsonpModule>;
}

export { HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContext, HttpContextToken, HttpErrorResponse, HttpEventType, HttpHeaderResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse, HttpResponseBase, HttpStatusCode, HttpUrlEncodingCodec };
export type { HttpDownloadProgressEvent, HttpEvent, HttpParameterCodec, HttpParamsOptions, HttpProgressEvent, HttpSentEvent, HttpUploadProgressEvent, HttpUserEvent };
oKx|x?{
  "name": "@angular/common",
  "version": "19.2.14",
  "description": "Angular - commonly needed directives and services",
  "author": "angular",
  "license": "MIT",
  "engines": {
    "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
  },
  "locales": "locales",
  "dependencies": {
    "tslib": "^2.3.0"
  },
  "exports": {
    "./locales/global/*": {
      "default": "./locales/global/*.js"
    },
    "./locales/*": {
      "types": "./locales/*.d.ts",
      "default": "./locales/*.js"
    },
    "./package.json": {
      "default": "./package.json"
    },
    ".": {
      "types": "./index.d.ts",
      "default": "./fesm2022/common.mjs"
    },
    "./http": {
      "types": "./http/index.d.ts",
      "default": "./fesm2022/http.mjs"
    },
    "./http/testing": {
      "types": "./http/testing/index.d.ts",
      "default": "./fesm2022/http/testing.mjs"
    },
    "./testing": {
      "types": "./testing/index.d.ts",
      "default": "./fesm2022/testing.mjs"
    },
    "./upgrade": {
      "types": "./upgrade/index.d.ts",
      "default": "./fesm2022/upgrade.mjs"
    }
  },
  "peerDependencies": {
    "@angular/core": "19.2.14",
    "rxjs": "^6.5.3 || ^7.4.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/angular/angular.git",
    "directory": "packages/common"
  },
  "ng-update": {
    "packageGroup": [
      "@angular/core",
      "@angular/bazel",
      "@angular/common",
      "@angular/compiler",
      "@angular/compiler-cli",
      "@angular/animations",
      "@angular/elements",
      "@angular/platform-browser",
      "@angular/platform-browser-dynamic",
      "@angular/forms",
      "@angular/platform-server",
      "@angular/upgrade",
      "@angular/router",
      "@angular/language-service",
      "@angular/localize",
      "@angular/service-worker"
    ]
  },
  "sideEffects": [
    "**/global/*.js",
    "**/closure-locale.*"
  ],
  "module": "./fesm2022/common.mjs",
  "typings": "./index.d.ts",
  "type": "module"
}-/t*Mx\re7the core frameworkzt5schematics/*	schematicevent-dispatch-contract.min.jsevent-dispatch-contract.min#re.mjs"
    },
    "./primitives/diprimitives/di!+:primitives/di.mjs"
    },
    "./primitives/event-dispatchprimitives/event-dispatch!+?primitives/event-dispatch.mjs"
    },
    "./primitives/signalsprimitives/signals!+2primitives/signals.mjs"
    },
    "./rxjs-interoprxjs-interop!+rxjs-interopXv
  }4B|,
    "zone.js": "~0.15Kre"
  },
  "ng-update": {
    "migrations": "./schematics/migrations.json",-Bchematics": "./schematics/collection.json",
  "sideEffects": falsehre8M %x/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { InjectionToken } from '@angular/core';

/**
 * This class should not be used directly by an application developer. Instead, use
 * {@link Location}.
 *
 * `PlatformLocation` encapsulates all calls to DOM APIs, which allows the Router to be
 * platform-agnostic.
 * This means that we can have different implementation of `PlatformLocation` for the different
 * platforms that Angular supports. For example, `@angular/platform-browser` provides an
 * implementation specific to the browser environment, while `@angular/platform-server` provides
 * one suitable for use with server-side rendering.
 *
 * The `PlatformLocation` class is used directly by all implementations of {@link LocationStrategy}
 * when they need to interact with the DOM APIs like pushState, popState, etc.
 *
 * {@link LocationStrategy} in turn is used by the {@link Location} service which is used directly
 * by the {@link /api/router/Router Router} in order to navigate between routes. Since all interactions between
 * {@link /api/router/Router Router} /
 * {@link Location} / {@link LocationStrategy} and DOM APIs flow through the `PlatformLocation`
 * class, they are all platform-agnostic.
 *
 * @publicApi
 */
declare abstract class PlatformLocation {
    abstract getBaseHrefFromDOM(): string;
    abstract getState(): unknown;
    /**
     * Returns a function that, when executed, removes the `popstate` event handler.
     */
    abstract onPopState(fn: LocationChangeListener): VoidFunction;
    /**
     * Returns a function that, when executed, removes the `hashchange` event handler.
     */
    abstract onHashChange(fn: LocationChangeListener): VoidFunction;
    abstract get href(): string;
    abstract get protocol(): string;
    abstract get hostname(): string;
    abstract get port(): string;
    abstract get pathname(): string;
    abstract get search(): string;
    abstract get hash(): string;
    abstract replaceState(state: any, title: string, url: string): void;
    abstract pushState(state: any, title: string, url: string): void;
    abstract forward(): void;
    abstract back(): void;
    historyGo?(relativePosition: number): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<PlatformLocation, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<PlatformLocation>;
}
/**
 * @description
 * Indicates when a location is initialized.
 *
 * @publicApi
 */
declare const LOCATION_INITIALIZED: InjectionToken<Promise<any>>;
/**
 * @description
 * A serializable version of the event from `onPopState` or `onHashChange`
 *
 * @publicApi
 */
interface LocationChangeEvent {
    type: string;
    state: any;
}
/**
 * @publicApi
 */
interface LocationChangeListener {
    (event: LocationChangeEvent): any;
}
/**
 * `PlatformLocation` encapsulates all of the direct calls to platform APIs.
 * This class should not be used directly by an application developer. Instead, use
 * {@link Location}.
 *
 * @publicApi
 */
declare class BrowserPlatformLocation extends PlatformLocation {
    private _location;
    private _history;
    private _doc;
    constructor();
    getBaseHrefFromDOM(): string;
    onPopState(fn: LocationChangeListener): VoidFunction;
    onHashChange(fn: LocationChangeListener): VoidFunction;
    get href(): string;
    get protocol(): string;
    get hostname(): string;
    get port(): string;
    get pathname(): string;
    get search(): string;
    get hash(): string;
    set pathname(newPath: string);
    pushState(state: any, title: string, url: string): void;
    replaceState(state: any, title: string, url: string): void;
    forward(): void;
    back(): void;
    historyGo(relativePosition?: number): void;
    getState(): unknown;
    static ɵfac: i0.ɵɵFactoryDeclaration<BrowserPlatformLocation, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<BrowserPlatformLocation>;
}

export { BrowserPlatformLocation, LOCATION_INITIALIZED, PlatformLocation };
export type { LocationChangeEvent, LocationChangeListener };
.yPx/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { Provider, InjectionToken } from '@angular/core';
export { ɵFakeNavigation } from '@angular/core/testing';
import { Location, LocationStrategy } from '@angular/common';
import { SubscriptionLike } from 'rxjs';
import { PlatformLocation, LocationChangeListener } from '../platform_location.d-Lbv6Ueec.js';

/**
 * Return a provider for the `FakeNavigation` in place of the real Navigation API.
 */
declare function provideFakePlatformNavigation(): Provider[];

/**
 * A spy for {@link Location} that allows tests to fire simulated location events.
 *
 * @publicApi
 */
declare class SpyLocation implements Location {
    urlChanges: string[];
    private _history;
    private _historyIndex;
    /** @docs-private */
    ngOnDestroy(): void;
    setInitialPath(url: string): void;
    setBaseHref(url: string): void;
    path(): string;
    getState(): unknown;
    isCurrentPathEqualTo(path: string, query?: string): boolean;
    simulateUrlPop(pathname: string): void;
    simulateHashChange(pathname: string): void;
    prepareExternalUrl(url: string): string;
    go(path: string, query?: string, state?: any): void;
    replaceState(path: string, query?: string, state?: any): void;
    forward(): void;
    back(): void;
    historyGo(relativePosition?: number): void;
    onUrlChange(fn: (url: string, state: unknown) => void): VoidFunction;
    subscribe(onNext: (value: any) => void, onThrow?: ((error: any) => void) | null, onReturn?: (() => void) | null): SubscriptionLike;
    normalize(url: string): string;
    private pushHistory;
    static ɵfac: i0.ɵɵFactoryDeclaration<SpyLocation, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SpyLocation>;
}

/**
 * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated
 * location events.
 *
 * @publicApi
 */
declare class MockLocationStrategy extends LocationStrategy {
    internalBaseHref: string;
    internalPath: string;
    internalTitle: string;
    urlChanges: string[];
    private stateChanges;
    constructor();
    simulatePopState(url: string): void;
    path(includeHash?: boolean): string;
    prepareExternalUrl(internal: string): string;
    pushState(ctx: any, title: string, path: string, query: string): void;
    replaceState(ctx: any, title: string, path: string, query: string): void;
    onPopState(fn: (value: any) => void): void;
    getBaseHref(): string;
    back(): void;
    forward(): void;
    getState(): unknown;
    static ɵfac: i0.ɵɵFactoryDeclaration<MockLocationStrategy, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MockLocationStrategy>;
}

/**
 * Mock platform location config
 *
 * @publicApi
 */
interface MockPlatformLocationConfig {
    startUrl?: string;
    appBaseHref?: string;
}
/**
 * Provider for mock platform location config
 *
 * @publicApi
 */
declare const MOCK_PLATFORM_LOCATION_CONFIG: InjectionToken<MockPlatformLocationConfig>;
/**
 * Mock implementation of URL state.
 *
 * @publicApi
 */
declare class MockPlatformLocation implements PlatformLocation {
    private baseHref;
    private hashUpdate;
    private popStateSubject;
    private urlChangeIndex;
    private urlChanges;
    constructor(config?: MockPlatformLocationConfig);
    get hostname(): string;
    get protocol(): string;
    get port(): string;
    get pathname(): string;
    get search(): string;
    get hash(): string;
    get state(): unknown;
    getBaseHrefFromDOM(): string;
    onPopState(fn: LocationChangeListener): VoidFunction;
    onHashChange(fn: LocationChangeListener): VoidFunction;
    get href(): string;
    get url(): string;
    private parseChanges;
    replaceState(state: any, title: string, newUrl: string): void;
    pushState(state: any, title: string, newUrl: string): void;
    forward(): void;
    back(): void;
    historyGo(relativePosition?: number): void;
    getState(): unknown;
    /**
     * Browsers are inconsistent in when they fire events and perform the state updates
     * The most easiest thing to do in our mock is synchronous and that happens to match
     * Firefox and Chrome, at least somewhat closely
     *
     * https://github.com/WICG/navigation-api#watching-for-navigations
     * https://docs.google.com/document/d/1Pdve-DJ1JCGilj9Yqf5HxRJyBKSel5owgOvUJqTauwU/edit#heading=h.3ye4v71wsz94
     * popstate is always sent before hashchange:
     * https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#when_popstate_is_sent
     */
    private emitEvents;
    static ɵfac: i0.ɵɵFactoryDeclaration<MockPlatformLocation, [{ optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MockPlatformLocation>;
}

/**
 * Returns mock providers for the `Location` and `LocationStrategy` classes.
 * The mocks are helpful in tests to fire simulated location events.
 *
 * @publicApi
 */
declare function provideLocationMocks(): Provider[];

export { MOCK_PLATFORM_LOCATION_CONFIG, MockLocationStrategy, MockPlatformLocation, SpyLocation, provideLocationMocks, provideFakePlatformNavigation as ɵprovideFakePlatformNavigation };
export type { MockPlatformLocationConfig };
>x98/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { Location, LocationStrategy, CommonModule } from '../common_module.d-NEF7UaHr.js';
import { PlatformLocation } from '../platform_location.d-Lbv6Ueec.js';
import { UpgradeModule } from '@angular/upgrade/static';
import * as i0 from '@angular/core';
import { InjectionToken, ModuleWithProviders } from '@angular/core';
import 'rxjs';

/**
 * A codec for encoding and decoding URL parts.
 *
 * @publicApi
 **/
declare abstract class UrlCodec {
    /**
     * Encodes the path from the provided string
     *
     * @param path The path string
     */
    abstract encodePath(path: string): string;
    /**
     * Decodes the path from the provided string
     *
     * @param path The path string
     */
    abstract decodePath(path: string): string;
    /**
     * Encodes the search string from the provided string or object
     *
     * @param path The path string or object
     */
    abstract encodeSearch(search: string | {
        [k: string]: unknown;
    }): string;
    /**
     * Decodes the search objects from the provided string
     *
     * @param path The path string
     */
    abstract decodeSearch(search: string): {
        [k: string]: unknown;
    };
    /**
     * Encodes the hash from the provided string
     *
     * @param path The hash string
     */
    abstract encodeHash(hash: string): string;
    /**
     * Decodes the hash from the provided string
     *
     * @param path The hash string
     */
    abstract decodeHash(hash: string): string;
    /**
     * Normalizes the URL from the provided string
     *
     * @param path The URL string
     */
    abstract normalize(href: string): string;
    /**
     * Normalizes the URL from the provided string, search, hash, and base URL parameters
     *
     * @param path The URL path
     * @param search The search object
     * @param hash The has string
     * @param baseUrl The base URL for the URL
     */
    abstract normalize(path: string, search: {
        [k: string]: unknown;
    }, hash: string, baseUrl?: string): string;
    /**
     * Checks whether the two strings are equal
     * @param valA First string for comparison
     * @param valB Second string for comparison
     */
    abstract areEqual(valA: string, valB: string): boolean;
    /**
     * Parses the URL string based on the base URL
     *
     * @param url The full URL string
     * @param base The base for the URL
     */
    abstract parse(url: string, base?: string): {
        href: string;
        protocol: string;
        host: string;
        search: string;
        hash: string;
        hostname: string;
        port: string;
        pathname: string;
    };
}
/**
 * A `UrlCodec` that uses logic from AngularJS to serialize and parse URLs
 * and URL parameters.
 *
 * @publicApi
 */
declare class AngularJSUrlCodec implements UrlCodec {
    encodePath(path: string): string;
    encodeSearch(search: string | {
        [k: string]: unknown;
    }): string;
    encodeHash(hash: string): string;
    decodePath(path: string, html5Mode?: boolean): string;
    decodeSearch(search: string): {
        [k: string]: unknown;
    };
    decodeHash(hash: string): string;
    normalize(href: string): string;
    normalize(path: string, search: {
        [k: string]: unknown;
    }, hash: string, baseUrl?: string): string;
    areEqual(valA: string, valB: string): boolean;
    parse(url: string, base?: string): {
        href: string;
        protocol: string;
        host: string;
        search: string;
        hash: string;
        hostname: string;
        port: string;
        pathname: string;
    };
}

/**
 * Location service that provides a drop-in replacement for the $location service
 * provided in AngularJS.
 *
 * @see [Using the Angular Unified Location Service](guide/upgrade#using-the-unified-angular-location-service)
 *
 * @publicApi
 */
declare class $locationShim {
    private location;
    private platformLocation;
    private urlCodec;
    private locationStrategy;
    private initializing;
    private updateBrowser;
    private $$absUrl;
    private $$url;
    private $$protocol;
    private $$host;
    private $$port;
    private $$replace;
    private $$path;
    private $$search;
    private $$hash;
    private $$state;
    private $$changeListeners;
    private cachedState;
    private urlChanges;
    private readonly removeOnUrlChangeFn;
    constructor($injector: any, location: Location, platformLocation: PlatformLocation, urlCodec: UrlCodec, locationStrategy: LocationStrategy);
    private initialize;
    private resetBrowserUpdate;
    private lastHistoryState;
    private lastBrowserUrl;
    private browserUrl;
    private lastCachedState;
    private cacheState;
    /**
     * This function emulates the $browser.state() function from AngularJS. It will cause
     * history.state to be cached unless changed with deep equality check.
     */
    private browserState;
    private stripBaseUrl;
    private getServerBase;
    private parseAppUrl;
    /**
     * Registers listeners for URL changes. This API is used to catch updates performed by the
     * AngularJS framework. These changes are a subset of the `$locationChangeStart` and
     * `$locationChangeSuccess` events which fire when AngularJS updates its internally-referenced
     * version of the browser URL.
     *
     * It's possible for `$locationChange` events to happen, but for the browser URL
     * (window.location) to remain unchanged. This `onChange` callback will fire only when AngularJS
     * actually updates the browser URL (window.location).
     *
     * @param fn The callback function that is triggered for the listener when the URL changes.
     * @param err The callback function that is triggered when an error occurs.
     */
    onChange(fn: (url: string, state: unknown, oldUrl: string, oldState: unknown) => void, err?: (e: Error) => void): void;
    /**
     * Parses the provided URL, and sets the current URL to the parsed result.
     *
     * @param url The URL string.
     */
    $$parse(url: string): void;
    /**
     * Parses the provided URL and its relative URL.
     *
     * @param url The full URL string.
     * @param relHref A URL string relative to the full URL string.
     */
    $$parseLinkUrl(url: string, relHref?: string | null): boolean;
    private setBrowserUrlWithFallback;
    private composeUrls;
    /**
     * Retrieves the full URL representation with all segments encoded according to
     * rules specified in
     * [RFC 3986](https://tools.ietf.org/html/rfc3986).
     *
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let absUrl = $location.absUrl();
     * // => "http://example.com/#/some/path?foo=bar&baz=xoxo"
     * ```
     */
    absUrl(): string;
    /**
     * Retrieves the current URL, or sets a new URL. When setting a URL,
     * changes the path, search, and hash, and returns a reference to its own instance.
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let url = $location.url();
     * // => "/some/path?foo=bar&baz=xoxo"
     * ```
     */
    url(): string;
    url(url: string): this;
    /**
     * Retrieves the protocol of the current URL.
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let protocol = $location.protocol();
     * // => "http"
     * ```
     */
    protocol(): string;
    /**
     * Retrieves the protocol of the current URL.
     *
     * In contrast to the non-AngularJS version `location.host` which returns `hostname:port`, this
     * returns the `hostname` portion only.
     *
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let host = $location.host();
     * // => "example.com"
     *
     * // given URL http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo
     * host = $location.host();
     * // => "example.com"
     * host = location.host;
     * // => "example.com:8080"
     * ```
     */
    host(): string;
    /**
     * Retrieves the port of the current URL.
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let port = $location.port();
     * // => 80
     * ```
     */
    port(): number | null;
    /**
     * Retrieves the path of the current URL, or changes the path and returns a reference to its own
     * instance.
     *
     * Paths should always begin with forward slash (/). This method adds the forward slash
     * if it is missing.
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let path = $location.path();
     * // => "/some/path"
     * ```
     */
    path(): string;
    path(path: string | number | null): this;
    /**
     * Retrieves a map of the search parameters of the current URL, or changes a search
     * part and returns a reference to its own instance.
     *
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo
     * let searchObject = $location.search();
     * // => {foo: 'bar', baz: 'xoxo'}
     *
     * // set foo to 'yipee'
     * $location.search('foo', 'yipee');
     * // $location.search() => {foo: 'yipee', baz: 'xoxo'}
     * ```
     *
     * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or
     * hash object.
     *
     * When called with a single argument the method acts as a setter, setting the `search` component
     * of `$location` to the specified value.
     *
     * If the argument is a hash object containing an array of values, these values will be encoded
     * as duplicate search parameters in the URL.
     *
     * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number,
     *     then `paramValue`
     * will override only a single search property.
     *
     * If `paramValue` is an array, it will override the property of the `search` component of
     * `$location` specified via the first argument.
     *
     * If `paramValue` is `null`, the property specified via the first argument will be deleted.
     *
     * If `paramValue` is `true`, the property specified via the first argument will be added with no
     * value nor trailing equal sign.
     *
     * @return {Object} The parsed `search` object of the current URL, or the changed `search` object.
     */
    search(): {
        [key: string]: unknown;
    };
    search(search: string | number | {
        [key: string]: unknown;
    }): this;
    search(search: string | number | {
        [key: string]: unknown;
    }, paramValue: null | undefined | string | number | boolean | string[]): this;
    /**
     * Retrieves the current hash fragment, or changes the hash fragment and returns a reference to
     * its own instance.
     *
     * ```js
     * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue
     * let hash = $location.hash();
     * // => "hashValue"
     * ```
     */
    hash(): string;
    hash(hash: string | number | null): this;
    /**
     * Changes to `$location` during the current `$digest` will replace the current
     * history record, instead of adding a new one.
     */
    replace(): this;
    /**
     * Retrieves the history state object when called without any parameter.
     *
     * Change the history state object when called with one parameter and return `$location`.
     * The state object is later passed to `pushState` or `replaceState`.
     *
     * This method is supported only in HTML5 mode and only in browsers supporting
     * the HTML5 History API methods such as `pushState` and `replaceState`. If you need to support
     * older browsers (like Android < 4.0), don't use this method.
     *
     */
    state(): unknown;
    state(state: unknown): this;
}
/**
 * The factory function used to create an instance of the `$locationShim` in Angular,
 * and provides an API-compatible `$locationProvider` for AngularJS.
 *
 * @publicApi
 */
declare class $locationShimProvider {
    private ngUpgrade;
    private location;
    private platformLocation;
    private urlCodec;
    private locationStrategy;
    constructor(ngUpgrade: UpgradeModule, location: Location, platformLocation: PlatformLocation, urlCodec: UrlCodec, locationStrategy: LocationStrategy);
    /**
     * Factory method that returns an instance of the $locationShim
     */
    $get(): $locationShim;
    /**
     * Stub method used to keep API compatible with AngularJS. This setting is configured through
     * the LocationUpgradeModule's `config` method in your Angular app.
     */
    hashPrefix(prefix?: string): void;
    /**
     * Stub method used to keep API compatible with AngularJS. This setting is configured through
     * the LocationUpgradeModule's `config` method in your Angular app.
     */
    html5Mode(mode?: any): void;
}

/**
 * Configuration options for LocationUpgrade.
 *
 * @publicApi
 */
interface LocationUpgradeConfig {
    /**
     * Configures whether the location upgrade module should use the `HashLocationStrategy`
     * or the `PathLocationStrategy`
     */
    useHash?: boolean;
    /**
     * Configures the hash prefix used in the URL when using the `HashLocationStrategy`
     */
    hashPrefix?: string;
    /**
     * Configures the URL codec for encoding and decoding URLs. Default is the `AngularJSCodec`
     */
    urlCodec?: typeof UrlCodec;
    /**
     * Configures the base href when used in server-side rendered applications
     */
    serverBaseHref?: string;
    /**
     * Configures the base href when used in client-side rendered applications
     */
    appBaseHref?: string;
}
/**
 * A provider token used to configure the location upgrade module.
 *
 * @publicApi
 */
declare const LOCATION_UPGRADE_CONFIGURATION: InjectionToken<LocationUpgradeConfig>;
/**
 * `NgModule` used for providing and configuring Angular's Unified Location Service for upgrading.
 *
 * @see [Using the Unified Angular Location Service](https://angular.io/guide/upgrade#using-the-unified-angular-location-service)
 *
 * @publicApi
 */
declare class LocationUpgradeModule {
    static config(config?: LocationUpgradeConfig): ModuleWithProviders<LocationUpgradeModule>;
    static ɵfac: i0.ɵɵFactoryDeclaration<LocationUpgradeModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<LocationUpgradeModule, never, [typeof CommonModule], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<LocationUpgradeModule>;
}

export { $locationShim, $locationShimProvider, AngularJSUrlCodec, LOCATION_UPGRADE_CONFIGURATION, LocationUpgradeModule, UrlCodec };
export type { LocationUpgradeConfig };
@Ilx/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

/**
 * A wrapper around the `XMLHttpRequest` constructor.
 *
 * @publicApi
 */
declare abstract class XhrFactory {
    abstract build(): XMLHttpRequest;
}

export { XhrFactory };
+WKx#(()=>{function p(t,n,r,o,e,i,f,m){return{eventType:t,event:n,targetElement:r,eic:o,timeStamp:e,eia:i,eirp:f,eiack:m}}function u(t){let n=[],r=e=>{n.push(e)};return{c:t,q:n,et:[],etc:[],d:r,h:e=>{r(p(e.type,e,e.target,t,Date.now()))}}}function s(t,n,r){for(let o=0;o<n.length;o++){let e=n[o];(r?t.etc:t.et).push(e),t.c.addEventListener(e,t.h,r)}}function c(t,n,r,o,e=window){let i=u(t);e._ejsas||(e._ejsas={}),e._ejsas[n]=i,s(i,r),s(i,o,!0)}window.__jsaction_bootstrap=c;})();
>[bx9/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

declare global {
    /**
     * Values of ngDevMode
     * Depending on the current state of the application, ngDevMode may have one of several values.
     *
     * For convenience, the “truthy” value which enables dev mode is also an object which contains
     * Angular’s performance counters. This is not necessary, but cuts down on boilerplate for the
     * perf counters.
     *
     * ngDevMode may also be set to false. This can happen in one of a few ways:
     * - The user explicitly sets `window.ngDevMode = false` somewhere in their app.
     * - The user calls `enableProdMode()`.
     * - The URL contains a `ngDevMode=false` text.
     * Finally, ngDevMode may not have been defined at all.
     */
    const ngDevMode: null | NgDevModePerfCounters;
    interface NgDevModePerfCounters {
        namedConstructors: boolean;
        firstCreatePass: number;
        tNode: number;
        tView: number;
        rendererCreateTextNode: number;
        rendererSetText: number;
        rendererCreateElement: number;
        rendererAddEventListener: number;
        rendererSetAttribute: number;
        rendererRemoveAttribute: number;
        rendererSetProperty: number;
        rendererSetClassName: number;
        rendererAddClass: number;
        rendererRemoveClass: number;
        rendererSetStyle: number;
        rendererRemoveStyle: number;
        rendererDestroy: number;
        rendererDestroyNode: number;
        rendererMoveNode: number;
        rendererRemoveNode: number;
        rendererAppendChild: number;
        rendererInsertBefore: number;
        rendererCreateComment: number;
        hydratedNodes: number;
        hydratedComponents: number;
        dehydratedViewsRemoved: number;
        dehydratedViewsCleanupRuns: number;
        componentsSkippedHydration: number;
        deferBlocksWithIncrementalHydration: number;
    }
}

/**
 * Records information about the action that should handle a given `Event`.
 */
interface ActionInfo {
    name: string;
    element: Element;
}
type ActionInfoInternal = [name: string, element: Element];
/**
 * Records information for later handling of events. This type is
 * shared, and instances of it are passed, between the eventcontract
 * and the dispatcher jsbinary. Therefore, the fields of this type are
 * referenced by string literals rather than property literals
 * throughout the code.
 *
 * 'targetElement' is the element the action occurred on, 'actionElement'
 * is the element that has the jsaction handler.
 *
 * A null 'actionElement' identifies an EventInfo instance that didn't match a
 * jsaction attribute.  This allows us to execute global event handlers with the
 * appropriate event type (including a11y clicks and custom events).
 * The declare portion of this interface creates a set of externs that make sure
 * renaming doesn't happen for EventInfo. This is important since EventInfo
 * is shared across multiple binaries.
 */
declare interface EventInfo {
    eventType: string;
    event: Event;
    targetElement: Element;
    /** The element that is the container for this Event. */
    eic: Element;
    timeStamp: number;
    /**
     * The action parsed from the JSAction element.
     */
    eia?: ActionInfoInternal;
    /**
     * Whether this `Event` is a replay event, meaning no dispatcher was
     * installed when this `Event` was originally dispatched.
     */
    eirp?: boolean;
    /**
     * Whether this `Event` represents a `keydown` event that should be processed
     * as a `click`. Only used when a11y click events is on.
     */
    eiack?: boolean;
    /** Whether action resolution has already run on this `EventInfo`. */
    eir?: boolean;
}
/**
 * Utility class around an `EventInfo`.
 *
 * This should be used in compilation units that are less sensitive to code
 * size.
 */
declare class EventInfoWrapper {
    readonly eventInfo: EventInfo;
    constructor(eventInfo: EventInfo);
    getEventType(): string;
    setEventType(eventType: string): void;
    getEvent(): Event;
    setEvent(event: Event): void;
    getTargetElement(): Element;
    setTargetElement(targetElement: Element): void;
    getContainer(): Element;
    setContainer(container: Element): void;
    getTimestamp(): number;
    setTimestamp(timestamp: number): void;
    getAction(): {
        name: string;
        element: Element;
    } | undefined;
    setAction(action: ActionInfo | undefined): void;
    getIsReplay(): boolean | undefined;
    setIsReplay(replay: boolean): void;
    getResolved(): boolean | undefined;
    setResolved(resolved: boolean): void;
    clone(): EventInfoWrapper;
}

declare interface EarlyJsactionDataContainer {
    _ejsa?: EarlyJsactionData;
    _ejsas?: {
        [appId: string]: EarlyJsactionData | undefined;
    };
}
declare global {
    interface Window {
        _ejsa?: EarlyJsactionData;
        _ejsas?: {
            [appId: string]: EarlyJsactionData | undefined;
        };
    }
}
/**
 * Defines the early jsaction data types.
 */
declare interface EarlyJsactionData {
    /** List used to keep track of the early JSAction event types. */
    et: string[];
    /** List used to keep track of the early JSAction capture event types. */
    etc: string[];
    /** Early JSAction handler for all events. */
    h: (event: Event) => void;
    /** Dispatcher handler. Initializes to populating `q`. */
    d: (eventInfo: EventInfo) => void;
    /** List used to push `EventInfo` objects if the dispatcher is not registered. */
    q: EventInfo[];
    /** Container for listening to events. */
    c: HTMLElement;
}

/**
 * An `EventContractContainerManager` provides the common interface for managing
 * containers.
 */
interface EventContractContainerManager {
    addEventListener(eventType: string, getHandler: (element: Element) => (event: Event) => void, passive?: boolean): void;
    cleanUp(): void;
}
/**
 * A class representing a container node and all the event handlers
 * installed on it. Used so that handlers can be cleaned up if the
 * container is removed from the contract.
 */
declare class EventContractContainer implements EventContractContainerManager {
    readonly element: Element;
    /**
     * Array of event handlers and their corresponding event types that are
     * installed on this container.
     *
     */
    private handlerInfos;
    /**
     * @param element The container Element.
     */
    constructor(element: Element);
    /**
     * Installs the provided installer on the element owned by this container,
     * and maintains a reference to resulting handler in order to remove it
     * later if desired.
     */
    addEventListener(eventType: string, getHandler: (element: Element) => (event: Event) => void, passive?: boolean): void;
    /**
     * Removes all the handlers installed on this container.
     */
    cleanUp(): void;
}

/**
 * @fileoverview An enum to control who can call certain jsaction APIs.
 */
declare enum Restriction {
    I_AM_THE_JSACTION_FRAMEWORK = 0
}

/**
 * @fileoverview Implements the local event handling contract. This
 * allows DOM objects in a container that enters into this contract to
 * define event handlers which are executed in a local context.
 *
 * One EventContract instance can manage the contract for multiple
 * containers, which are added using the addContainer() method.
 *
 * Events can be registered using the addEvent() method.
 *
 * A Dispatcher is added using the registerDispatcher() method. Until there is
 * a dispatcher, events are queued. The idea is that the EventContract
 * class is inlined in the HTML of the top level page and instantiated
 * right after the start of <body>. The Dispatcher class is contained
 * in the external deferred js, and instantiated and registered with
 * EventContract when the external javascript in the page loads. The
 * external javascript will also register the jsaction handlers, which
 * then pick up the queued events at the time of registration.
 *
 * Since this class is meant to be inlined in the main page HTML, the
 * size of the binary compiled from this file MUST be kept as small as
 * possible and thus its dependencies to a minimum.
 */

/**
 * The API of an EventContract that is safe to call from any compilation unit.
 */
declare interface UnrenamedEventContract {
    ecrd(dispatcher: Dispatcher, restriction: Restriction): void;
}
/** A function that is called to handle events captured by the EventContract. */
type Dispatcher = (eventInfo: EventInfo, globalDispatch?: boolean) => void;
/**
 * A function that handles an event dispatched from the browser.
 *
 * eventType: May differ from `event.type` if JSAction uses a
 * short-hand name or is patching over an non-bubbling event with a bubbling
 * variant.
 * event: The native browser event.
 * container: The container for this dispatch.
 */
type EventHandler = (eventType: string, event: Event, container: Element) => void;
/**
 * EventContract intercepts events in the bubbling phase at the
 * boundary of a container element, and maps them to generic actions
 * which are specified using the custom jsaction attribute in
 * HTML. Behavior of the application is then specified in terms of
 * handler for such actions, cf. jsaction.Dispatcher in dispatcher.js.
 *
 * This has several benefits: (1) No DOM event handlers need to be
 * registered on the specific elements in the UI. (2) The set of
 * events that the application has to handle can be specified in terms
 * of the semantics of the application, rather than in terms of DOM
 * events. (3) Invocation of handlers can be delayed and handlers can
 * be delay loaded in a generic way.
 */
declare class EventContract implements UnrenamedEventContract {
    static MOUSE_SPECIAL_SUPPORT: boolean;
    private containerManager;
    /**
     * The DOM events which this contract covers. Used to prevent double
     * registration of event types. The value of the map is the
     * internally created DOM event handler function that handles the
     * DOM events. See addEvent().
     *
     */
    private eventHandlers;
    private browserEventTypeToExtraEventTypes;
    /**
     * The dispatcher function. Events are passed to this function for
     * handling once it was set using the registerDispatcher() method. This is
     * done because the function is passed from another jsbinary, so passing the
     * instance and invoking the method here would require to leave the method
     * unobfuscated.
     */
    private dispatcher;
    /**
     * The list of suspended `EventInfo` that will be dispatched
     * as soon as the `Dispatcher` is registered.
     */
    private queuedEventInfos;
    constructor(containerManager: EventContractContainerManager);
    private handleEvent;
    /**
     * Handle an `EventInfo`.
     */
    private handleEventInfo;
    /**
     * Enables jsaction handlers to be called for the event type given by
     * name.
     *
     * If the event is already registered, this does nothing.
     *
     * @param prefixedEventType If supplied, this event is used in
     *     the actual browser event registration instead of the name that is
     *     exposed to jsaction. Use this if you e.g. want users to be able
     *     to subscribe to jsaction="transitionEnd:foo" while the underlying
     *     event is webkitTransitionEnd in one browser and mozTransitionEnd
     *     in another.
     *
     * @param passive A boolean value that, if `true`, indicates that the event
     *     handler will never call `preventDefault()`.
     */
    addEvent(eventType: string, prefixedEventType?: string, passive?: boolean): void;
    /**
     * Gets the queued early events and replay them using the appropriate handler
     * in the provided event contract. Once all the events are replayed, it cleans
     * up the early contract.
     */
    replayEarlyEvents(earlyJsactionData?: EarlyJsactionData | undefined): void;
    /**
     * Replays all the early `EventInfo` objects, dispatching them through the normal
     * `EventContract` flow.
     */
    replayEarlyEventInfos(earlyEventInfos: EventInfo[]): void;
    /**
     * Returns all JSAction event types that have been registered for a given
     * browser event type.
     */
    private getEventTypesForBrowserEventType;
    /**
     * Returns the event handler function for a given event type.
     */
    handler(eventType: string): EventHandler | undefined;
    /**
     * Cleans up the event contract. This resets all of the `EventContract`'s
     * internal state. Users are responsible for not using this `EventContract`
     * after it has been cleaned up.
     */
    cleanUp(): void;
    /**
     * Register a dispatcher function. Event info of each event mapped to
     * a jsaction is passed for handling to this callback. The queued
     * events are passed as well to the dispatcher for later replaying
     * once the dispatcher is registered. Clears the event queue to null.
     *
     * @param dispatcher The dispatcher function.
     * @param restriction
     */
    registerDispatcher(dispatcher: Dispatcher, restriction: Restriction): void;
    /**
     * Unrenamed alias for registerDispatcher. Necessary for any codebases that
     * split the `EventContract` and `Dispatcher` code into different compilation
     * units.
     */
    ecrd(dispatcher: Dispatcher, restriction: Restriction): void;
}

/** An internal symbol used to indicate whether propagation should be stopped or not. */
declare const PROPAGATION_STOPPED_SYMBOL: unique symbol;
/** Extra event phases beyond what the browser provides. */
declare const EventPhase: {
    REPLAY: number;
};
declare global {
    interface Event {
        [PROPAGATION_STOPPED_SYMBOL]?: boolean;
    }
}
/**
 * A dispatcher that uses browser-based `Event` semantics, for example bubbling, `stopPropagation`,
 * `currentTarget`, etc.
 */
declare class EventDispatcher {
    private readonly dispatchDelegate;
    private readonly clickModSupport;
    private readonly actionResolver;
    private readonly dispatcher;
    constructor(dispatchDelegate: (event: Event, actionName: string) => void, clickModSupport?: boolean);
    /**
     * The entrypoint for the `EventContract` dispatch.
     */
    dispatch(eventInfo: EventInfo): void;
    /** Internal method that does basic disaptching. */
    private dispatchToDelegate;
}
/**
 * Registers deferred functionality for an EventContract and a Jsaction
 * Dispatcher.
 */
declare function registerDispatcher(eventContract: UnrenamedEventContract, dispatcher: EventDispatcher): void;

export { EventContract, EventContractContainer, EventDispatcher, EventInfoWrapper, EventPhase, Restriction, registerDispatcher };
export type { EarlyJsactionDataContainer, EventInfo };
C1!x   /**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { SIGNAL_NODE, signalSetFn, SIGNAL, producerAccessed, getActiveConsumer, setActiveConsumer as setActiveConsumer$1, createSignal, signalUpdateFn, consumerDestroy, REACTIVE_NODE, consumerPollProducersForChange, consumerBeforeComputation, consumerAfterComputation, createComputed, setThrowInvalidWriteToSignalError, untracked as untracked$1, isInNotificationPhase, createLinkedSignal, linkedSignalSetFn, linkedSignalUpdateFn } from './untracked-BKcld_ew.mjs';
export { setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl } from './untracked-BKcld_ew.mjs';
import { getCurrentInjector, NOT_FOUND as NOT_FOUND$1, setCurrentInjector } from './primitives/di.mjs';
import { setActiveConsumer, createWatch } from '@angular/core/primitives/signals';
import { NOT_FOUND as NOT_FOUND$2 } from '@angular/core/primitives/di';
import { BehaviorSubject, Subject, Subscription } from 'rxjs';
import { Attribute as Attribute$1, clearAppScopedEarlyEventContract, EventContract, EventContractContainer, getAppScopedQueuedEventInfos, EventDispatcher, registerDispatcher, EventPhase, isEarlyEventType, isCaptureEventType } from './primitives/event-dispatch.mjs';
import { map } from 'rxjs/operators';

/**
 * Base URL for the error details page.
 *
 * Keep this constant in sync across:
 *  - packages/compiler-cli/src/ngtsc/diagnostics/src/error_details_base_url.ts
 *  - packages/core/src/error_details_base_url.ts
 */
const ERROR_DETAILS_PAGE_BASE_URL = 'https://angular.dev/errors';
/**
 * URL for the XSS security documentation.
 */
const XSS_SECURITY_URL = 'https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss';

/**
 * Class that represents a runtime error.
 * Formats and outputs the error message in a consistent way.
 *
 * Example:
 * ```ts
 *  throw new RuntimeError(
 *    RuntimeErrorCode.INJECTOR_ALREADY_DESTROYED,
 *    ngDevMode && 'Injector has already been destroyed.');
 * ```
 *
 * Note: the `message` argument contains a descriptive error message as a string in development
 * mode (when the `ngDevMode` is defined). In production mode (after tree-shaking pass), the
 * `message` argument becomes `false`, thus we account for it in the typings and the runtime
 * logic.
 */
class RuntimeError extends Error {
    code;
    constructor(code, message) {
        super(formatRuntimeError(code, message));
        this.code = code;
    }
}
function formatRuntimeErrorCode(code) {
    // Error code might be a negative number, which is a special marker that instructs the logic to
    // generate a link to the error details page on angular.io.
    // We also prepend `0` to non-compile-time errors.
    return `NG0${Math.abs(code)}`;
}
/**
 * Called to format a runtime error.
 * See additional info on the `message` argument type in the `RuntimeError` class description.
 */
function formatRuntimeError(code, message) {
    const fullCode = formatRuntimeErrorCode(code);
    let errorMessage = `${fullCode}${message ? ': ' + message : ''}`;
    if (ngDevMode && code < 0) {
        const addPeriodSeparator = !errorMessage.match(/[.,;!?\n]$/);
        const separator = addPeriodSeparator ? '.' : '';
        errorMessage = `${errorMessage}${separator} Find more at ${ERROR_DETAILS_PAGE_BASE_URL}/${fullCode}`;
    }
    return errorMessage;
}

const REQUIRED_UNSET_VALUE = /* @__PURE__ */ Symbol('InputSignalNode#UNSET');
// Note: Using an IIFE here to ensure that the spread assignment is not considered
// a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
const INPUT_SIGNAL_NODE = /* @__PURE__ */ (() => {
    return {
        ...SIGNAL_NODE,
        transformFn: undefined,
        applyValueToInputSignal(node, value) {
            signalSetFn(node, value);
        },
    };
})();

const ɵINPUT_SIGNAL_BRAND_WRITE_TYPE = /* @__PURE__ */ Symbol();
/**
 * Creates an input signal.
 *
 * @param initialValue The initial value.
 *   Can be set to {@link REQUIRED_UNSET_VALUE} for required inputs.
 * @param options Additional options for the input. e.g. a transform, or an alias.
 */
function createInputSignal(initialValue, options) {
    const node = Object.create(INPUT_SIGNAL_NODE);
    node.value = initialValue;
    // Perf note: Always set `transformFn` here to ensure that `node` always
    // has the same v8 class shape, allowing monomorphic reads on input signals.
    node.transformFn = options?.transform;
    function inputValueFn() {
        // Record that someone looked at this signal.
        producerAccessed(node);
        if (node.value === REQUIRED_UNSET_VALUE) {
            let message = null;
            if (ngDevMode) {
                const name = options?.debugName ?? options?.alias;
                message = `Input${name ? ` "${name}"` : ''} is required but no value is available yet.`;
            }
            throw new RuntimeError(-950 /* RuntimeErrorCode.REQUIRED_INPUT_NO_VALUE */, message);
        }
        return node.value;
    }
    inputValueFn[SIGNAL] = node;
    if (ngDevMode) {
        inputValueFn.toString = () => `[Input Signal: ${inputValueFn()}]`;
        node.debugName = options?.debugName;
    }
    return inputValueFn;
}

/**
 * Convince closure compiler that the wrapped function has no side-effects.
 *
 * Closure compiler always assumes that `toString` has no side-effects. We use this quirk to
 * allow us to execute a function but have closure compiler mark the call as no-side-effects.
 * It is important that the return value for the `noSideEffects` function be assigned
 * to something which is retained otherwise the call to `noSideEffects` will be removed by closure
 * compiler.
 */
function noSideEffects(fn) {
    return { toString: fn }.toString();
}

const ANNOTATIONS = '__annotations__';
const PARAMETERS = '__parameters__';
const PROP_METADATA = '__prop__metadata__';
/**
 * @suppress {globalThis}
 */
function makeDecorator(name, props, parentClass, additionalProcessing, typeFn) {
    return noSideEffects(() => {
        const metaCtor = makeMetadataCtor(props);
        function DecoratorFactory(...args) {
            if (this instanceof DecoratorFactory) {
                metaCtor.call(this, ...args);
                return this;
            }
            const annotationInstance = new DecoratorFactory(...args);
            return function TypeDecorator(cls) {
                if (typeFn)
                    typeFn(cls, ...args);
                // Use of Object.defineProperty is important since it creates non-enumerable property which
                // prevents the property is copied during subclassing.
                const annotations = cls.hasOwnProperty(ANNOTATIONS)
                    ? cls[ANNOTATIONS]
                    : Object.defineProperty(cls, ANNOTATIONS, { value: [] })[ANNOTATIONS];
                annotations.push(annotationInstance);
                return cls;
            };
        }
        if (parentClass) {
            DecoratorFactory.prototype = Object.create(parentClass.prototype);
        }
        DecoratorFactory.prototype.ngMetadataName = name;
        DecoratorFactory.annotationCls = DecoratorFactory;
        return DecoratorFactory;
    });
}
function makeMetadataCtor(props) {
    return function ctor(...args) {
        if (props) {
            const values = props(...args);
            for (const propName in values) {
                this[propName] = values[propName];
            }
        }
    };
}
function makeParamDecorator(name, props, parentClass) {
    return noSideEffects(() => {
        const metaCtor = makeMetadataCtor(props);
        function ParamDecoratorFactory(...args) {
            if (this instanceof ParamDecoratorFactory) {
                metaCtor.apply(this, args);
                return this;
            }
            const annotationInstance = new ParamDecoratorFactory(...args);
            ParamDecorator.annotation = annotationInstance;
            return ParamDecorator;
            function ParamDecorator(cls, unusedKey, index) {
                // Use of Object.defineProperty is important since it creates non-enumerable property which
                // prevents the property is copied during subclassing.
                const parameters = cls.hasOwnProperty(PARAMETERS)
                    ? cls[PARAMETERS]
                    : Object.defineProperty(cls, PARAMETERS, { value: [] })[PARAMETERS];
                // there might be gaps if some in between parameters do not have annotations.
                // we pad with nulls.
                while (parameters.length <= index) {
                    parameters.push(null);
                }
                (parameters[index] = parameters[index] || []).push(annotationInstance);
                return cls;
            }
        }
        ParamDecoratorFactory.prototype.ngMetadataName = name;
        ParamDecoratorFactory.annotationCls = ParamDecoratorFactory;
        return ParamDecoratorFactory;
    });
}
function makePropDecorator(name, props, parentClass, additionalProcessing) {
    return noSideEffects(() => {
        const metaCtor = makeMetadataCtor(props);
        function PropDecoratorFactory(...args) {
            if (this instanceof PropDecoratorFactory) {
                metaCtor.apply(this, args);
                return this;
            }
            const decoratorInstance = new PropDecoratorFactory(...args);
            function PropDecorator(target, name) {
                // target is undefined with standard decorators. This case is not supported and will throw
                // if this decorator is used in JIT mode with standard decorators.
                if (target === undefined) {
                    throw new Error('Standard Angular field decorators are not supported in JIT mode.');
                }
                const constructor = target.constructor;
                // Use of Object.defineProperty is important because it creates a non-enumerable property
                // which prevents the property from being copied during subclassing.
                const meta = constructor.hasOwnProperty(PROP_METADATA)
                    ? constructor[PROP_METADATA]
                    : Object.defineProperty(constructor, PROP_METADATA, { value: {} })[PROP_METADATA];
                meta[name] = (meta.hasOwnProperty(name) && meta[name]) || [];
                meta[name].unshift(decoratorInstance);
            }
            return PropDecorator;
        }
        if (parentClass) {
            PropDecoratorFactory.prototype = Object.create(parentClass.prototype);
        }
        PropDecoratorFactory.prototype.ngMetadataName = name;
        PropDecoratorFactory.annotationCls = PropDecoratorFactory;
        return PropDecoratorFactory;
    });
}

const _global = globalThis;

function ngDevModeResetPerfCounters() {
    const locationString = typeof location !== 'undefined' ? location.toString() : '';
    const newCounters = {
        namedConstructors: locationString.indexOf('ngDevMode=namedConstructors') != -1,
        firstCreatePass: 0,
        tNode: 0,
        tView: 0,
        rendererCreateTextNode: 0,
        rendererSetText: 0,
        rendererCreateElement: 0,
        rendererAddEventListener: 0,
        rendererSetAttribute: 0,
        rendererRemoveAttribute: 0,
        rendererSetProperty: 0,
        rendererSetClassName: 0,
        rendererAddClass: 0,
        rendererRemoveClass: 0,
        rendererSetStyle: 0,
        rendererRemoveStyle: 0,
        rendererDestroy: 0,
        rendererDestroyNode: 0,
        rendererMoveNode: 0,
        rendererRemoveNode: 0,
        rendererAppendChild: 0,
        rendererInsertBefore: 0,
        rendererCreateComment: 0,
        hydratedNodes: 0,
        hydratedComponents: 0,
        dehydratedViewsRemoved: 0,
        dehydratedViewsCleanupRuns: 0,
        componentsSkippedHydration: 0,
        deferBlocksWithIncrementalHydration: 0,
    };
    // Make sure to refer to ngDevMode as ['ngDevMode'] for closure.
    const allowNgDevModeTrue = locationString.indexOf('ngDevMode=false') === -1;
    if (!allowNgDevModeTrue) {
        _global['ngDevMode'] = false;
    }
    else {
        if (typeof _global['ngDevMode'] !== 'object') {
            _global['ngDevMode'] = {};
        }
        Object.assign(_global['ngDevMode'], newCounters);
    }
    return newCounters;
}
/**
 * This function checks to see if the `ngDevMode` has been set. If yes,
 * then we honor it, otherwise we default to dev mode with additional checks.
 *
 * The idea is that unless we are doing production build where we explicitly
 * set `ngDevMode == false` we should be helping the developer by providing
 * as much early warning and errors as possible.
 *
 * `ɵɵdefineComponent` is guaranteed to have been called before any component template functions
 * (and thus Ivy instructions), so a single initialization there is sufficient to ensure ngDevMode
 * is defined for the entire instruction set.
 *
 * When checking `ngDevMode` on toplevel, always init it before referencing it
 * (e.g. `((typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode())`), otherwise you can
 *  get a `ReferenceError` like in https://github.com/angular/angular/issues/31595.
 *
 * Details on possible values for `ngDevMode` can be found on its docstring.
 *
 * NOTE:
 * - changes to the `ngDevMode` name must be synced with `compiler-cli/src/tooling.ts`.
 */
function initNgDevMode() {
    // The below checks are to ensure that calling `initNgDevMode` multiple times does not
    // reset the counters.
    // If the `ngDevMode` is not an object, then it means we have not created the perf counters
    // yet.
    if (typeof ngDevMode === 'undefined' || ngDevMode) {
        if (typeof ngDevMode !== 'object' || Object.keys(ngDevMode).length === 0) {
            ngDevModeResetPerfCounters();
        }
        return typeof ngDevMode !== 'undefined' && !!ngDevMode;
    }
    return false;
}

function getClosureSafeProperty(objWithPropertyToExtract) {
    for (let key in objWithPropertyToExtract) {
        if (objWithPropertyToExtract[key] === getClosureSafeProperty) {
            return key;
        }
    }
    throw Error('Could not find renamed property on target object.');
}
/**
 * Sets properties on a target object from a source object, but only if
 * the property doesn't already exist on the target object.
 * @param target The target to set properties on
 * @param source The source of the property keys and values to set
 */
function fillProperties(target, source) {
    for (const key in source) {
        if (source.hasOwnProperty(key) && !target.hasOwnProperty(key)) {
            target[key] = source[key];
        }
    }
}

function stringify(token) {
    if (typeof token === 'string') {
        return token;
    }
    if (Array.isArray(token)) {
        return `[${token.map(stringify).join(', ')}]`;
    }
    if (token == null) {
        return '' + token;
    }
    const name = token.overriddenName || token.name;
    if (name) {
        return `${name}`;
    }
    const result = token.toString();
    if (result == null) {
        return '' + result;
    }
    const newLineIndex = result.indexOf('\n');
    return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result;
}
/**
 * Concatenates two strings with separator, allocating new strings only when necessary.
 *
 * @param before before string.
 * @param separator separator string.
 * @param after after string.
 * @returns concatenated string.
 */
function concatStringsWithSpace(before, after) {
    if (!before)
        return after || '';
    if (!after)
        return before;
    return `${before} ${after}`;
}
/**
 * Ellipses the string in the middle when longer than the max length
 *
 * @param string
 * @param maxLength of the output string
 * @returns ellipsed string with ... in the middle
 */
function truncateMiddle(str, maxLength = 100) {
    if (!str || maxLength < 1 || str.length <= maxLength)
        return str;
    if (maxLength == 1)
        return str.substring(0, 1) + '...';
    const halfLimit = Math.round(maxLength / 2);
    return str.substring(0, halfLimit) + '...' + str.substring(str.length - halfLimit);
}

const __forward_ref__ = getClosureSafeProperty({ __forward_ref__: getClosureSafeProperty });
/**
 * Allows to refer to references which are not yet defined.
 *
 * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of
 * DI is declared, but not yet defined. It is also used when the `token` which we use when creating
 * a query is not yet defined.
 *
 * `forwardRef` is also used to break circularities in standalone components imports.
 *
 * @usageNotes
 * ### Circular dependency example
 * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref'}
 *
 * ### Circular standalone reference import example
 * ```angular-ts
 * @Component({
 *   standalone: true,
 *   imports: [ChildComponent],
 *   selector: 'app-parent',
 *   template: `<app-child [hideParent]="hideParent"></app-child>`,
 * })
 * export class ParentComponent {
 *   @Input() hideParent: boolean;
 * }
 *
 *
 * @Component({
 *   standalone: true,
 *   imports: [CommonModule, forwardRef(() => ParentComponent)],
 *   selector: 'app-child',
 *   template: `<app-parent *ngIf="!hideParent"></app-parent>`,
 * })
 * export class ChildComponent {
 *   @Input() hideParent: boolean;
 * }
 * ```
 *
 * @publicApi
 */
function forwardRef(forwardRefFn) {
    forwardRefFn.__forward_ref__ = forwardRef;
    forwardRefFn.toString = function () {
        return stringify(this());
    };
    return forwardRefFn;
}
/**
 * Lazily retrieves the reference value from a forwardRef.
 *
 * Acts as the identity function when given a non-forward-ref value.
 *
 * @usageNotes
 * ### Example
 *
 * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='resolve_forward_ref'}
 *
 * @see {@link forwardRef}
 * @publicApi
 */
function resolveForwardRef(type) {
    return isForwardRef(type) ? type() : type;
}
/** Checks whether a function is wrapped by a `forwardRef`. */
function isForwardRef(fn) {
    return (typeof fn === 'function' &&
        fn.hasOwnProperty(__forward_ref__) &&
        fn.__forward_ref__ === forwardRef);
}

// The functions in this file verify that the assumptions we are making
// about state in an instruction are correct before implementing any logic.
// They are meant only to be called in dev mode as sanity checks.
function assertNumber(actual, msg) {
    if (!(typeof actual === 'number')) {
        throwError(msg, typeof actual, 'number', '===');
    }
}
function assertNumberInRange(actual, minInclusive, maxInclusive) {
    assertNumber(actual, 'Expected a number');
    assertLessThanOrEqual(actual, maxInclusive, 'Expected number to be less than or equal to');
    assertGreaterThanOrEqual(actual, minInclusive, 'Expected number to be greater than or equal to');
}
function assertString(actual, msg) {
    if (!(typeof actual === 'string')) {
        throwError(msg, actual === null ? 'null' : typeof actual, 'string', '===');
    }
}
function assertFunction(actual, msg) {
    if (!(typeof actual === 'function')) {
        throwError(msg, actual === null ? 'null' : typeof actual, 'function', '===');
    }
}
function assertEqual(actual, expected, msg) {
    if (!(actual == expected)) {
        throwError(msg, actual, expected, '==');
    }
}
function assertNotEqual(actual, expected, msg) {
    if (!(actual != expected)) {
        throwError(msg, actual, expected, '!=');
    }
}
function assertSame(actual, expected, msg) {
    if (!(actual === expected)) {
        throwError(msg, actual, expected, '===');
    }
}
function assertNotSame(actual, expected, msg) {
    if (!(actual !== expected)) {
        throwError(msg, actual, expected, '!==');
    }
}
function assertLessThan(actual, expected, msg) {
    if (!(actual < expected)) {
        throwError(msg, actual, expected, '<');
    }
}
function assertLessThanOrEqual(actual, expected, msg) {
    if (!(actual <= expected)) {
        throwError(msg, actual, expected, '<=');
    }
}
function assertGreaterThan(actual, expected, msg) {
    if (!(actual > expected)) {
        throwError(msg, actual, expected, '>');
    }
}
function assertGreaterThanOrEqual(actual, expected, msg) {
    if (!(actual >= expected)) {
        throwError(msg, actual, expected, '>=');
    }
}
function assertDefined(actual, msg) {
    if (actual == null) {
        throwError(msg, actual, null, '!=');
    }
}
function throwError(msg, actual, expected, comparison) {
    throw new Error(`ASSERTION ERROR: ${msg}` +
        (comparison == null ? '' : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`));
}
function assertDomNode(node) {
    if (!(node instanceof Node)) {
        throwError(`The provided value must be an instance of a DOM Node but got ${stringify(node)}`);
    }
}
function assertElement(node) {
    if (!(node instanceof Element)) {
        throwError(`The provided value must be an element but got ${stringify(node)}`);
    }
}
function assertIndexInRange(arr, index) {
    assertDefined(arr, 'Array must be defined.');
    const maxLen = arr.length;
    if (index < 0 || index >= maxLen) {
        throwError(`Index expected to be less than ${maxLen} but got ${index}`);
    }
}
function assertOneOf(value, ...validValues) {
    if (validValues.indexOf(value) !== -1)
        return true;
    throwError(`Expected value to be one of ${JSON.stringify(validValues)} but was ${JSON.stringify(value)}.`);
}
function assertNotReactive(fn) {
    if (getActiveConsumer() !== null) {
        throwError(`${fn}() should never be called in a reactive context.`);
    }
}

/**
 * Construct an injectable definition which defines how a token will be constructed by the DI
 * system, and in which injectors (if any) it will be available.
 *
 * This should be assigned to a static `ɵprov` field on a type, which will then be an
 * `InjectableType`.
 *
 * Options:
 * * `providedIn` determines which injectors will include the injectable, by either associating it
 *   with an `@NgModule` or other `InjectorType`, or by specifying that this injectable should be
 *   provided in the `'root'` injector, which will be the application-level injector in most apps.
 * * `factory` gives the zero argument function which will create an instance of the injectable.
 *   The factory can call [`inject`](api/core/inject) to access the `Injector` and request injection
 * of dependencies.
 *
 * @codeGenApi
 * @publicApi This instruction has been emitted by ViewEngine for some time and is deployed to npm.
 */
function ɵɵdefineInjectable(opts) {
    return {
        token: opts.token,
        providedIn: opts.providedIn || null,
        factory: opts.factory,
        value: undefined,
    };
}
/**
 * @deprecated in v8, delete after v10. This API should be used only by generated code, and that
 * code should now use ɵɵdefineInjectable instead.
 * @publicApi
 */
const defineInjectable = ɵɵdefineInjectable;
/**
 * Construct an `InjectorDef` which configures an injector.
 *
 * This should be assigned to a static injector def (`ɵinj`) field on a type, which will then be an
 * `InjectorType`.
 *
 * Options:
 *
 * * `providers`: an optional array of providers to add to the injector. Each provider must
 *   either have a factory or point to a type which has a `ɵprov` static property (the
 *   type must be an `InjectableType`).
 * * `imports`: an optional array of imports of other `InjectorType`s or `InjectorTypeWithModule`s
 *   whose providers will also be added to the injector. Locally provided types will override
 *   providers from imports.
 *
 * @codeGenApi
 */
function ɵɵdefineInjector(options) {
    return { providers: options.providers || [], imports: options.imports || [] };
}
/**
 * Read the injectable def (`ɵprov`) for `type` in a way which is immune to accidentally reading
 * inherited value.
 *
 * @param type A type which may have its own (non-inherited) `ɵprov`.
 */
function getInjectableDef(type) {
    return getOwnDefinition(type, NG_PROV_DEF) || getOwnDefinition(type, NG_INJECTABLE_DEF);
}
function isInjectable(type) {
    return getInjectableDef(type) !== null;
}
/**
 * Return definition only if it is defined directly on `type` and is not inherited from a base
 * class of `type`.
 */
function getOwnDefinition(type, field) {
    return type.hasOwnProperty(field) ? type[field] : null;
}
/**
 * Read the injectable def (`ɵprov`) for `type` or read the `ɵprov` from one of its ancestors.
 *
 * @param type A type which may have `ɵprov`, via inheritance.
 *
 * @deprecated Will be removed in a future version of Angular, where an error will occur in the
 *     scenario if we find the `ɵprov` on an ancestor only.
 */
function getInheritedInjectableDef(type) {
    const def = type && (type[NG_PROV_DEF] || type[NG_INJECTABLE_DEF]);
    if (def) {
        ngDevMode &&
            console.warn(`DEPRECATED: DI is instantiating a token "${type.name}" that inherits its @Injectable decorator but does not provide one itself.\n` +
                `This will become an error in a future version of Angular. Please add @Injectable() to the "${type.name}" class.`);
        return def;
    }
    else {
        return null;
    }
}
/**
 * Read the injector def type in a way which is immune to accidentally reading inherited value.
 *
 * @param type type which may have an injector def (`ɵinj`)
 */
function getInjectorDef(type) {
    return type && (type.hasOwnProperty(NG_INJ_DEF) || type.hasOwnProperty(NG_INJECTOR_DEF))
        ? type[NG_INJ_DEF]
        : null;
}
const NG_PROV_DEF = getClosureSafeProperty({ ɵprov: getClosureSafeProperty });
const NG_INJ_DEF = getClosureSafeProperty({ ɵinj: getClosureSafeProperty });
// We need to keep these around so we can read off old defs if new defs are unavailable
const NG_INJECTABLE_DEF = getClosureSafeProperty({
    ngInjectableDef: getClosureSafeProperty,
});
const NG_INJECTOR_DEF = getClosureSafeProperty({
    ngInjectorDef: getClosureSafeProperty,
});

/**
 * Creates a token that can be used in a DI Provider.
 *
 * Use an `InjectionToken` whenever the type you are injecting is not reified (does not have a
 * runtime representation) such as when injecting an interface, callable type, array or
 * parameterized type.
 *
 * `InjectionToken` is parameterized on `T` which is the type of object which will be returned by
 * the `Injector`. This provides an additional level of type safety.
 *
 * <div class="docs-alert docs-alert-helpful">
 *
 * **Important Note**: Ensure that you use the same instance of the `InjectionToken` in both the
 * provider and the injection call. Creating a new instance of `InjectionToken` in different places,
 * even with the same description, will be treated as different tokens by Angular's DI system,
 * leading to a `NullInjectorError`.
 *
 * </div>
 *
 * {@example injection-token/src/main.ts region='InjectionToken'}
 *
 * When creating an `InjectionToken`, you can optionally specify a factory function which returns
 * (possibly by creating) a default value of the parameterized type `T`. This sets up the
 * `InjectionToken` using this factory as a provider as if it was defined explicitly in the
 * application's root injector. If the factory function, which takes zero arguments, needs to inject
 * dependencies, it can do so using the [`inject`](api/core/inject) function.
 * As you can see in the Tree-shakable InjectionToken example below.
 *
 * Additionally, if a `factory` is specified you can also specify the `providedIn` option, which
 * overrides the above behavior and marks the token as belonging to a particular `@NgModule` (note:
 * this option is now deprecated). As mentioned above, `'root'` is the default value for
 * `providedIn`.
 *
 * The `providedIn: NgModule` and `providedIn: 'any'` options are deprecated.
 *
 * @usageNotes
 * ### Basic Examples
 *
 * ### Plain InjectionToken
 *
 * {@example core/di/ts/injector_spec.ts region='InjectionToken'}
 *
 * ### Tree-shakable InjectionToken
 *
 * {@example core/di/ts/injector_spec.ts region='ShakableInjectionToken'}
 *
 * @publicApi
 */
class InjectionToken {
    _desc;
    /** @internal */
    ngMetadataName = 'InjectionToken';
    ɵprov;
    /**
     * @param _desc   Description for the token,
     *                used only for debugging purposes,
     *                it should but does not need to be unique
     * @param options Options for the token's usage, as described above
     */
    constructor(_desc, options) {
        this._desc = _desc;
        this.ɵprov = undefined;
        if (typeof options == 'number') {
            (typeof ngDevMode === 'undefined' || ngDevMode) &&
                assertLessThan(options, 0, 'Only negative numbers are supported here');
            // This is a special hack to assign __NG_ELEMENT_ID__ to this instance.
            // See `InjectorMarkers`
            this.__NG_ELEMENT_ID__ = options;
        }
        else if (options !== undefined) {
            this.ɵprov = ɵɵdefineInjectable({
                token: this,
                providedIn: options.providedIn || 'root',
                factory: options.factory,
            });
        }
    }
    /**
     * @internal
     */
    get multi() {
        return this;
    }
    toString() {
        return `InjectionToken ${this._desc}`;
    }
}

let _injectorProfilerContext;
function getInjectorProfilerContext() {
    !ngDevMode && throwError('getInjectorProfilerContext should never be called in production mode');
    return _injectorProfilerContext;
}
function setInjectorProfilerContext(context) {
    !ngDevMode && throwError('setInjectorProfilerContext should never be called in production mode');
    const previous = _injectorProfilerContext;
    _injectorProfilerContext = context;
    return previous;
}
let injectorProfilerCallback = null;
/**
 * Sets the callback function which will be invoked during certain DI events within the
 * runtime (for example: injecting services, creating injectable instances, configuring providers)
 *
 * Warning: this function is *INTERNAL* and should not be relied upon in application's code.
 * The contract of the function might be changed in any release and/or the function can be removed
 * completely.
 *
 * @param profiler function provided by the caller or null value to disable profiling.
 */
const setInjectorProfiler = (injectorProfiler) => {
    !ngDevMode && throwError('setInjectorProfiler should never be called in production mode');
    injectorProfilerCallback = injectorProfiler;
};
/**
 * Injector profiler function which emits on DI events executed by the runtime.
 *
 * @param event InjectorProfilerEvent corresponding to the DI event being emitted
 */
function injectorProfiler(event) {
    !ngDevMode && throwError('Injector profiler should never be called in production mode');
    if (injectorProfilerCallback != null /* both `null` and `undefined` */) {
        injectorProfilerCallback(event);
    }
}
/**
 * Emits an InjectorProfilerEventType.ProviderConfigured to the injector profiler. The data in the
 * emitted event includes the raw provider, as well as the token that provider is providing.
 *
 * @param eventProvider A provider object
 */
function emitProviderConfiguredEvent(eventProvider, isViewProvider = false) {
    !ngDevMode && throwError('Injector profiler should never be called in production mode');
    let token;
    // if the provider is a TypeProvider (typeof provider is function) then the token is the
    // provider itself
    if (typeof eventProvider === 'function') {
        token = eventProvider;
    }
    // if the provider is an injection token, then the token is the injection token.
    else if (eventProvider instanceof InjectionToken) {
        token = eventProvider;
    }
    // in all other cases we can access the token via the `provide` property of the provider
    else {
        token = resolveForwardRef(eventProvider.provide);
    }
    let provider = eventProvider;
    // Injection tokens may define their own default provider which gets attached to the token itself
    // as `ɵprov`. In this case, we want to emit the provider that is attached to the token, not the
    // token itself.
    if (eventProvider instanceof InjectionToken) {
        provider = eventProvider.ɵprov || eventProvider;
    }
    injectorProfiler({
        type: 2 /* InjectorProfilerEventType.ProviderConfigured */,
        context: getInjectorProfilerContext(),
        providerRecord: { token, provider, isViewProvider },
    });
}
/**
 * Emits an event to the injector profiler with the instance that was created. Note that
 * the injector associated with this emission can be accessed by using getDebugInjectContext()
 *
 * @param instance an object created by an injector
 */
function emitInstanceCreatedByInjectorEvent(instance) {
    !ngDevMode && throwError('Injector profiler should never be called in production mode');
    injectorProfiler({
        type: 1 /* InjectorProfilerEventType.InstanceCreatedByInjector */,
        context: getInjectorProfilerContext(),
        instance: { value: instance },
    });
}
/**
 * @param token DI token associated with injected service
 * @param value the instance of the injected service (i.e the result of `inject(token)`)
 * @param flags the flags that the token was injected with
 */
function emitInjectEvent(token, value, flags) {
    !ngDevMode && throwError('Injector profiler should never be called in production mode');
    injectorProfiler({
        type: 0 /* InjectorProfilerEventType.Inject */,
        context: getInjectorProfilerContext(),
        service: { token, value, flags },
    });
}
function emitEffectCreatedEvent(effect) {
    !ngDevMode && throwError('Injector profiler should never be called in production mode');
    injectorProfiler({
        type: 3 /* InjectorProfilerEventType.EffectCreated */,
        context: getInjectorProfilerContext(),
        effect,
    });
}
function runInInjectorProfilerContext(injector, token, callback) {
    !ngDevMode &&
        throwError('runInInjectorProfilerContext should never be called in production mode');
    const prevInjectContext = setInjectorProfilerContext({ injector, token });
    try {
        callback();
    }
    finally {
        setInjectorProfilerContext(prevInjectContext);
    }
}

function isEnvironmentProviders(value) {
    return value && !!value.ɵproviders;
}

const NG_COMP_DEF = getClosureSafeProperty({ ɵcmp: getClosureSafeProperty });
const NG_DIR_DEF = getClosureSafeProperty({ ɵdir: getClosureSafeProperty });
const NG_PIPE_DEF = getClosureSafeProperty({ ɵpipe: getClosureSafeProperty });
const NG_MOD_DEF = getClosureSafeProperty({ ɵmod: getClosureSafeProperty });
const NG_FACTORY_DEF = getClosureSafeProperty({ ɵfac: getClosureSafeProperty });
/**
 * If a directive is diPublic, bloomAdd sets a property on the type with this constant as
 * the key and the directive's unique ID as the value. This allows us to map directives to their
 * bloom filter bit for DI.
 */
// TODO(misko): This is wrong. The NG_ELEMENT_ID should never be minified.
const NG_ELEMENT_ID = getClosureSafeProperty({
    __NG_ELEMENT_ID__: getClosureSafeProperty,
});
/**
 * The `NG_ENV_ID` field on a DI token indicates special processing in the `EnvironmentInjector`:
 * getting such tokens from the `EnvironmentInjector` will bypass the standard DI resolution
 * strategy and instead will return implementation produced by the `NG_ENV_ID` factory function.
 *
 * This particular retrieval of DI tokens is mostly done to eliminate circular dependencies and
 * improve tree-shaking.
 */
const NG_ENV_ID = getClosureSafeProperty({ __NG_ENV_ID__: getClosureSafeProperty });

/**
 * Used for stringify render output in Ivy.
 * Important! This function is very performance-sensitive and we should
 * be extra careful not to introduce megamorphic reads in it.
 * Check `core/test/render3/perf/render_stringify` for benchmarks and alternate implementations.
 */
function renderStringify(value) {
    if (typeof value === 'string')
        return value;
    if (value == null)
        return '';
    // Use `String` so that it invokes the `toString` method of the value. Note that this
    // appears to be faster than calling `value.toString` (see `render_stringify` benchmark).
    return String(value);
}
/**
 * Used to stringify a value so that it can be displayed in an error message.
 *
 * Important! This function contains a megamorphic read and should only be
 * used for error messages.
 */
function stringifyForError(value) {
    if (typeof value === 'function')
        return value.name || value.toString();
    if (typeof value === 'object' && value != null && typeof value.type === 'function') {
        return value.type.name || value.type.toString();
    }
    return renderStringify(value);
}
/**
 * Used to stringify a `Type` and including the file path and line number in which it is defined, if
 * possible, for better debugging experience.
 *
 * Important! This function contains a megamorphic read and should only be used for error messages.
 */
function debugStringifyTypeForError(type) {
    // TODO(pmvald): Do some refactoring so that we can use getComponentDef here without creating
    // circular deps.
    let componentDef = type[NG_COMP_DEF] || null;
    if (componentDef !== null && componentDef.debugInfo) {
        return stringifyTypeFromDebugInfo(componentDef.debugInfo);
    }
    return stringifyForError(type);
}
// TODO(pmvald): Do some refactoring so that we can use the type ClassDebugInfo for the param
// debugInfo here without creating circular deps.
function stringifyTypeFromDebugInfo(debugInfo) {
    if (!debugInfo.filePath || !debugInfo.lineNumber) {
        return debugInfo.className;
    }
    else {
        return `${debugInfo.className} (at ${debugInfo.filePath}:${debugInfo.lineNumber})`;
    }
}

/** Called when directives inject each other (creating a circular dependency) */
function throwCyclicDependencyError(token, path) {
    throw new RuntimeError(-200 /* RuntimeErrorCode.CYCLIC_DI_DEPENDENCY */, ngDevMode
        ? `Circular dependency in DI detected for ${token}${path ? `. Dependency path: ${path.join(' > ')} > ${token}` : ''}`
        : token);
}
function throwMixedMultiProviderError() {
    throw new Error(`Cannot mix multi providers and regular providers`);
}
function throwInvalidProviderError(ngModuleType, providers, provider) {
    if (ngModuleType && providers) {
        const providerDetail = providers.map((v) => (v == provider ? '?' + provider + '?' : '...'));
        throw new Error(`Invalid provider for the NgModule '${stringify(ngModuleType)}' - only instances of Provider and Type are allowed, got: [${providerDetail.join(', ')}]`);
    }
    else if (isEnvironmentProviders(provider)) {
        if (provider.ɵfromNgModule) {
            throw new RuntimeError(207 /* RuntimeErrorCode.PROVIDER_IN_WRONG_CONTEXT */, `Invalid providers from 'importProvidersFrom' present in a non-environment injector. 'importProvidersFrom' can't be used for component providers.`);
        }
        else {
            throw new RuntimeError(207 /* RuntimeErrorCode.PROVIDER_IN_WRONG_CONTEXT */, `Invalid providers present in a non-environment injector. 'EnvironmentProviders' can't be used for component providers.`);
        }
    }
    else {
        throw new Error('Invalid provider');
    }
}
/** Throws an error when a token is not found in DI. */
function throwProviderNotFoundError(token, injectorName) {
    const errorMessage = ngDevMode &&
        `No provider for ${stringifyForError(token)} found${injectorName ? ` in ${injectorName}` : ''}`;
    throw new RuntimeError(-201 /* RuntimeErrorCode.PROVIDER_NOT_FOUND */, errorMessage);
}

/**
 * Injection flags for DI.
 *
 * @publicApi
 * @deprecated use an options object for [`inject`](api/core/inject) instead.
 */
var InjectFlags;
(function (InjectFlags) {
    // TODO(alxhub): make this 'const' (and remove `InternalInjectFlags` enum) when ngc no longer
    // writes exports of it into ngfactory files.
    /** Check self and check parent injector if needed */
    InjectFlags[InjectFlags["Default"] = 0] = "Default";
    /**
     * Specifies that an injector should retrieve a dependency from any injector until reaching the
     * host element of the current component. (Only used with Element Injector)
     */
    InjectFlags[InjectFlags["Host"] = 1] = "Host";
    /** Don't ascend to ancestors of the node requesting injection. */
    InjectFlags[InjectFlags["Self"] = 2] = "Self";
    /** Skip the node that is requesting injection. */
    InjectFlags[InjectFlags["SkipSelf"] = 4] = "SkipSelf";
    /** Inject `defaultValue` instead if token not found. */
    InjectFlags[InjectFlags["Optional"] = 8] = "Optional";
})(InjectFlags || (InjectFlags = {}));

/**
 * Current implementation of inject.
 *
 * By default, it is `injectInjectorOnly`, which makes it `Injector`-only aware. It can be changed
 * to `directiveInject`, which brings in the `NodeInjector` system of ivy. It is designed this
 * way for two reasons:
 *  1. `Injector` should not depend on ivy logic.
 *  2. To maintain tree shake-ability we don't want to bring in unnecessary code.
 */
let _injectImplementation;
function getInjectImplementation() {
    return _injectImplementation;
}
/**
 * Sets the current inject implementation.
 */
function setInjectImplementation(impl) {
    const previous = _injectImplementation;
    _injectImplementation = impl;
    return previous;
}
/**
 * Injects `root` tokens in limp mode.
 *
 * If no injector exists, we can still inject tree-shakable providers which have `providedIn` set to
 * `"root"`. This is known as the limp mode injection. In such case the value is stored in the
 * injectable definition.
 */
function injectRootLimpMode(token, notFoundValue, flags) {
    const injectableDef = getInjectableDef(token);
    if (injectableDef && injectableDef.providedIn == 'root') {
        return injectableDef.value === undefined
            ? (injectableDef.value = injectableDef.factory())
            : injectableDef.value;
    }
    if (flags & InjectFlags.Optional)
        return null;
    if (notFoundValue !== undefined)
        return notFoundValue;
    throwProviderNotFoundError(token, 'Injector');
}
/**
 * Assert that `_injectImplementation` is not `fn`.
 *
 * This is useful, to prevent infinite recursion.
 *
 * @param fn Function which it should not equal to
 */
function assertInjectImplementationNotEqual(fn) {
    ngDevMode &&
        assertNotEqual(_injectImplementation, fn, 'Calling ɵɵinject would cause infinite recursion');
}

const _THROW_IF_NOT_FOUND = {};
const THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;
/*
 * Name of a property (that we patch onto DI decorator), which is used as an annotation of which
 * InjectFlag this decorator represents. This allows to avoid direct references to the DI decorators
 * in the code, thus making them tree-shakable.
 */
const DI_DECORATOR_FLAG = '__NG_DI_FLAG__';
class RetrievingInjector {
    injector;
    constructor(injector) {
        this.injector = injector;
    }
    retrieve(token, options) {
        const ngOptions = options;
        return this.injector.get(token, ngOptions.optional ? NOT_FOUND$1 : THROW_IF_NOT_FOUND, ngOptions);
    }
}
const NG_TEMP_TOKEN_PATH = 'ngTempTokenPath';
const NG_TOKEN_PATH = 'ngTokenPath';
const NEW_LINE = /\n/gm;
const NO_NEW_LINE = 'ɵ';
const SOURCE = '__source';
function injectInjectorOnly(token, flags = InjectFlags.Default) {
    if (getCurrentInjector() === undefined) {
        throw new RuntimeError(-203 /* RuntimeErrorCode.MISSING_INJECTION_CONTEXT */, ngDevMode &&
            `The \`${stringify(token)}\` token injection failed. \`inject()\` function must be called from an injection context such as a constructor, a factory function, a field initializer, or a function used with \`runInInjectionContext\`.`);
    }
    else if (getCurrentInjector() === null) {
        return injectRootLimpMode(token, undefined, flags);
    }
    else {
        const currentInjector = getCurrentInjector();
        let injector;
        if (currentInjector instanceof RetrievingInjector) {
            injector = currentInjector.injector;
        }
        else {
            injector = currentInjector;
        }
        const value = injector.get(token, flags & InjectFlags.Optional ? null : undefined, flags);
        ngDevMode && emitInjectEvent(token, value, flags);
        return value;
    }
}
function ɵɵinject(token, flags = InjectFlags.Default) {
    return (getInjectImplementation() || injectInjectorOnly)(resolveForwardRef(token), flags);
}
/**
 * Throws an error indicating that a factory function could not be generated by the compiler for a
 * particular class.
 *
 * The name of the class is not mentioned here, but will be in the generated factory function name
 * and thus in the stack trace.
 *
 * @codeGenApi
 */
function ɵɵinvalidFactoryDep(index) {
    throw new RuntimeError(202 /* RuntimeErrorCode.INVALID_FACTORY_DEPENDENCY */, ngDevMode &&
        `This constructor is not compatible with Angular Dependency Injection because its dependency at index ${index} of the parameter list is invalid.
This can happen if the dependency type is a primitive like a string or if an ancestor of this class is missing an Angular decorator.

Please check that 1) the type for the parameter at index ${index} is correct and 2) the correct Angular decorators are defined for this class and its ancestors.`);
}
/**
 * Injects a token from the currently active injector.
 * `inject` is only supported in an [injection context](guide/di/dependency-injection-context). It
 * can be used during:
 * - Construction (via the `constructor`) of a class being instantiated by the DI system, such
 * as an `@Injectable` or `@Component`.
 * - In the initializer for fields of such classes.
 * - In the factory function specified for `useFactory` of a `Provider` or an `@Injectable`.
 * - In the `factory` function specified for an `InjectionToken`.
 * - In a stackframe of a function call in a DI context
 *
 * @param token A token that represents a dependency that should be injected.
 * @param flags Optional flags that control how injection is executed.
 * The flags correspond to injection strategies that can be specified with
 * parameter decorators `@Host`, `@Self`, `@SkipSelf`, and `@Optional`.
 * @returns the injected value if operation is successful, `null` otherwise.
 * @throws if called outside of a supported context.
 *
 * @usageNotes
 * In practice the `inject()` calls are allowed in a constructor, a constructor parameter and a
 * field initializer:
 *
 * ```ts
 * @Injectable({providedIn: 'root'})
 * export class Car {
 *   radio: Radio|undefined;
 *   // OK: field initializer
 *   spareTyre = inject(Tyre);
 *
 *   constructor() {
 *     // OK: constructor body
 *     this.radio = inject(Radio);
 *   }
 * }
 * ```
 *
 * It is also legal to call `inject` from a provider's factory:
 *
 * ```ts
 * providers: [
 *   {provide: Car, useFactory: () => {
 *     // OK: a class factory
 *     const engine = inject(Engine);
 *     return new Car(engine);
 *   }}
 * ]
 * ```
 *
 * Calls to the `inject()` function outside of the class creation context will result in error. Most
 * notably, calls to `inject()` are disallowed after a class instance was created, in methods
 * (including lifecycle hooks):
 *
 * ```ts
 * @Component({ ... })
 * export class CarComponent {
 *   ngOnInit() {
 *     // ERROR: too late, the component instance was already created
 *     const engine = inject(Engine);
 *     engine.start();
 *   }
 * }
 * ```
 *
 * @publicApi
 */
function inject(token, flags = InjectFlags.Default) {
    // The `as any` here _shouldn't_ be necessary, but without it JSCompiler
    // throws a disambiguation  error due to the multiple signatures.
    return ɵɵinject(token, convertToBitFlags(flags));
}
// Converts object-based DI flags (`InjectOptions`) to bit flags (`InjectFlags`).
function convertToBitFlags(flags) {
    if (typeof flags === 'undefined' || typeof flags === 'number') {
        return flags;
    }
    // While TypeScript doesn't accept it without a cast, bitwise OR with false-y values in
    // JavaScript is a no-op. We can use that for a very codesize-efficient conversion from
    // `InjectOptions` to `InjectFlags`.
    return (0 /* InternalInjectFlags.Default */ | // comment to force a line break in the formatter
        (flags.optional && 8 /* InternalInjectFlags.Optional */) |
        (flags.host && 1 /* InternalInjectFlags.Host */) |
        (flags.self && 2 /* InternalInjectFlags.Self */) |
        (flags.skipSelf && 4 /* InternalInjectFlags.SkipSelf */));
}
function injectArgs(types) {
    const args = [];
    for (let i = 0; i < types.length; i++) {
        const arg = resolveForwardRef(types[i]);
        if (Array.isArray(arg)) {
            if (arg.length === 0) {
                throw new RuntimeError(900 /* RuntimeErrorCode.INVALID_DIFFER_INPUT */, ngDevMode && 'Arguments array must have arguments.');
            }
            let type = undefined;
            let flags = InjectFlags.Default;
            for (let j = 0; j < arg.length; j++) {
                const meta = arg[j];
                const flag = getInjectFlag(meta);
                if (typeof flag === 'number') {
                    // Special case when we handle @Inject decorator.
                    if (flag === -1 /* DecoratorFlags.Inject */) {
                        type = meta.token;
                    }
                    else {
                        flags |= flag;
                    }
                }
                else {
                    type = meta;
                }
            }
            args.push(ɵɵinject(type, flags));
        }
        else {
            args.push(ɵɵinject(arg));
        }
    }
    return args;
}
/**
 * Attaches a given InjectFlag to a given decorator using monkey-patching.
 * Since DI decorators can be used in providers `deps` array (when provider is configured using
 * `useFactory`) without initialization (e.g. `Host`) and as an instance (e.g. `new Host()`), we
 * attach the flag to make it available both as a static property and as a field on decorator
 * instance.
 *
 * @param decorator Provided DI decorator.
 * @param flag InjectFlag that should be applied.
 */
function attachInjectFlag(decorator, flag) {
    decorator[DI_DECORATOR_FLAG] = flag;
    decorator.prototype[DI_DECORATOR_FLAG] = flag;
    return decorator;
}
/**
 * Reads monkey-patched property that contains InjectFlag attached to a decorator.
 *
 * @param token Token that may contain monkey-patched DI flags property.
 */
function getInjectFlag(token) {
    return token[DI_DECORATOR_FLAG];
}
function catchInjectorError(e, token, injectorErrorName, source) {
    const tokenPath = e[NG_TEMP_TOKEN_PATH];
    if (token[SOURCE]) {
        tokenPath.unshift(token[SOURCE]);
    }
    e.message = formatError('\n' + e.message, tokenPath, injectorErrorName, source);
    e[NG_TOKEN_PATH] = tokenPath;
    e[NG_TEMP_TOKEN_PATH] = null;
    throw e;
}
function formatError(text, obj, injectorErrorName, source = null) {
    text = text && text.charAt(0) === '\n' && text.charAt(1) == NO_NEW_LINE ? text.slice(2) : text;
    let context = stringify(obj);
    if (Array.isArray(obj)) {
        context = obj.map(stringify).join(' -> ');
    }
    else if (typeof obj === 'object') {
        let parts = [];
        for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
                let value = obj[key];
                parts.push(key + ':' + (typeof value === 'string' ? JSON.stringify(value) : stringify(value)));
            }
        }
        context = `{${parts.join(', ')}}`;
    }
    return `${injectorErrorName}${source ? '(' + source + ')' : ''}[${context}]: ${text.replace(NEW_LINE, '\n  ')}`;
}

/**
 * Inject decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const Inject = attachInjectFlag(
// Disable tslint because `DecoratorFlags` is a const enum which gets inlined.
makeParamDecorator('Inject', (token) => ({ token })), -1 /* DecoratorFlags.Inject */);
/**
 * Optional decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const Optional = 
// Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
// tslint:disable-next-line: no-toplevel-property-access
attachInjectFlag(makeParamDecorator('Optional'), 8 /* InternalInjectFlags.Optional */);
/**
 * Self decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const Self = 
// Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
// tslint:disable-next-line: no-toplevel-property-access
attachInjectFlag(makeParamDecorator('Self'), 2 /* InternalInjectFlags.Self */);
/**
 * `SkipSelf` decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const SkipSelf = 
// Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
// tslint:disable-next-line: no-toplevel-property-access
attachInjectFlag(makeParamDecorator('SkipSelf'), 4 /* InternalInjectFlags.SkipSelf */);
/**
 * Host decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const Host = 
// Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
// tslint:disable-next-line: no-toplevel-property-access
attachInjectFlag(makeParamDecorator('Host'), 1 /* InternalInjectFlags.Host */);

function getFactoryDef(type, throwNotFound) {
    const hasFactoryDef = type.hasOwnProperty(NG_FACTORY_DEF);
    if (!hasFactoryDef && throwNotFound === true && ngDevMode) {
        throw new Error(`Type ${stringify(type)} does not have 'ɵfac' property.`);
    }
    return hasFactoryDef ? type[NG_FACTORY_DEF] : null;
}

/**
 * Determines if the contents of two arrays is identical
 *
 * @param a first array
 * @param b second array
 * @param identityAccessor Optional function for extracting stable object identity from a value in
 *     the array.
 */
function arrayEquals(a, b, identityAccessor) {
    if (a.length !== b.length)
        return false;
    for (let i = 0; i < a.length; i++) {
        let valueA = a[i];
        let valueB = b[i];
        if (identityAccessor) {
            valueA = identityAccessor(valueA);
            valueB = identityAccessor(valueB);
        }
        if (valueB !== valueA) {
            return false;
        }
    }
    return true;
}
/**
 * Flattens an array.
 */
function flatten(list) {
    return list.flat(Number.POSITIVE_INFINITY);
}
function deepForEach(input, fn) {
    input.forEach((value) => (Array.isArray(value) ? deepForEach(value, fn) : fn(value)));
}
function addToArray(arr, index, value) {
    // perf: array.push is faster than array.splice!
    if (index >= arr.length) {
        arr.push(value);
    }
    else {
        arr.splice(index, 0, value);
    }
}
function removeFromArray(arr, index) {
    // perf: array.pop is faster than array.splice!
    if (index >= arr.length - 1) {
        return arr.pop();
    }
    else {
        return arr.splice(index, 1)[0];
    }
}
function newArray(size, value) {
    const list = [];
    for (let i = 0; i < size; i++) {
        list.push(value);
    }
    return list;
}
/**
 * Remove item from array (Same as `Array.splice()` but faster.)
 *
 * `Array.splice()` is not as fast because it has to allocate an array for the elements which were
 * removed. This causes memory pressure and slows down code when most of the time we don't
 * care about the deleted items array.
 *
 * https://jsperf.com/fast-array-splice (About 20x faster)
 *
 * @param array Array to splice
 * @param index Index of element in array to remove.
 * @param count Number of items to remove.
 */
function arraySplice(array, index, count) {
    const length = array.length - count;
    while (index < length) {
        array[index] = array[index + count];
        index++;
    }
    while (count--) {
        array.pop(); // shrink the array
    }
}
/**
 * Same as `Array.splice2(index, 0, value1, value2)` but faster.
 *
 * `Array.splice()` is not fast because it has to allocate an array for the elements which were
 * removed. This causes memory pressure and slows down code when most of the time we don't
 * care about the deleted items array.
 *
 * @param array Array to splice.
 * @param index Index in array where the `value` should be added.
 * @param value1 Value to add to array.
 * @param value2 Value to add to array.
 */
function arrayInsert2(array, index, value1, value2) {
    ngDevMode && assertLessThanOrEqual(index, array.length, "Can't insert past array end.");
    let end = array.length;
    if (end == index) {
        // inserting at the end.
        array.push(value1, value2);
    }
    else if (end === 1) {
        // corner case when we have less items in array than we have items to insert.
        array.push(value2, array[0]);
        array[0] = value1;
    }
    else {
        end--;
        array.push(array[end - 1], array[end]);
        while (end > index) {
            const previousEnd = end - 2;
            array[end] = array[previousEnd];
            end--;
        }
        array[index] = value1;
        array[index + 1] = value2;
    }
}
/**
 * Set a `value` for a `key`.
 *
 * @param keyValueArray to modify.
 * @param key The key to locate or create.
 * @param value The value to set for a `key`.
 * @returns index (always even) of where the value vas set.
 */
function keyValueArraySet(keyValueArray, key, value) {
    let index = keyValueArrayIndexOf(keyValueArray, key);
    if (index >= 0) {
        // if we found it set it.
        keyValueArray[index | 1] = value;
    }
    else {
        index = ~index;
        arrayInsert2(keyValueArray, index, key, value);
    }
    return index;
}
/**
 * Retrieve a `value` for a `key` (on `undefined` if not found.)
 *
 * @param keyValueArray to search.
 * @param key The key to locate.
 * @return The `value` stored at the `key` location or `undefined if not found.
 */
function keyValueArrayGet(keyValueArray, key) {
    const index = keyValueArrayIndexOf(keyValueArray, key);
    if (index >= 0) {
        // if we found it retrieve it.
        return keyValueArray[index | 1];
    }
    return undefined;
}
/**
 * Retrieve a `key` index value in the array or `-1` if not found.
 *
 * @param keyValueArray to search.
 * @param key The key to locate.
 * @returns index of where the key is (or should have been.)
 *   - positive (even) index if key found.
 *   - negative index if key not found. (`~index` (even) to get the index where it should have
 *     been inserted.)
 */
function keyValueArrayIndexOf(keyValueArray, key) {
    return _arrayIndexOfSorted(keyValueArray, key, 1);
}
/**
 * INTERNAL: Get an index of an `value` in a sorted `array` by grouping search by `shift`.
 *
 * NOTE:
 * - This uses binary search algorithm for fast removals.
 *
 * @param array A sorted array to binary search.
 * @param value The value to look for.
 * @param shift grouping shift.
 *   - `0` means look at every location
 *   - `1` means only look at every other (even) location (the odd locations are to be ignored as
 *         they are values.)
 * @returns index of the value.
 *   - positive index if value found.
 *   - negative index if value not found. (`~index` to get the value where it should have been
 * inserted)
 */
function _arrayIndexOfSorted(array, value, shift) {
    ngDevMode && assertEqual(Array.isArray(array), true, 'Expecting an array');
    let start = 0;
    let end = array.length >> shift;
    while (end !== start) {
        const middle = start + ((end - start) >> 1); // find the middle.
        const current = array[middle << shift];
        if (value === current) {
            return middle << shift;
        }
        else if (current > value) {
            end = middle;
        }
        else {
            start = middle + 1; // We already searched middle so make it non-inclusive by adding 1
        }
    }
    return ~(end << shift);
}

/**
 * This file contains reuseable "empty" symbols that can be used as default return values
 * in different parts of the rendering code. Because the same symbols are returned, this
 * allows for identity checks against these values to be consistently used by the framework
 * code.
 */
const EMPTY_OBJ = {};
const EMPTY_ARRAY = [];
// freezing the values prevents any code from accidentally inserting new values in
if ((typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode()) {
    // These property accesses can be ignored because ngDevMode will be set to false
    // when optimizing code and the whole if statement will be dropped.
    // tslint:disable-next-line:no-toplevel-property-access
    Object.freeze(EMPTY_OBJ);
    // tslint:disable-next-line:no-toplevel-property-access
    Object.freeze(EMPTY_ARRAY);
}

/**
 * A multi-provider token for initialization functions that will run upon construction of an
 * environment injector.
 *
 * @deprecated from v19.0.0, use provideEnvironmentInitializer instead
 *
 * @see {@link provideEnvironmentInitializer}
 *
 * Note: As opposed to the `APP_INITIALIZER` token, the `ENVIRONMENT_INITIALIZER` functions are not awaited,
 * hence they should not be `async`.
 *
 * @publicApi
 */
const ENVIRONMENT_INITIALIZER = new InjectionToken(ngDevMode ? 'ENVIRONMENT_INITIALIZER' : '');

/**
 * An InjectionToken that gets the current `Injector` for `createInjector()`-style injectors.
 *
 * Requesting this token instead of `Injector` allows `StaticInjector` to be tree-shaken from a
 * project.
 *
 * @publicApi
 */
const INJECTOR$1 = new InjectionToken(ngDevMode ? 'INJECTOR' : '', 
// Disable tslint because this is const enum which gets inlined not top level prop access.
// tslint:disable-next-line: no-toplevel-property-access
-1 /* InjectorMarkers.Injector */);

const INJECTOR_DEF_TYPES = new InjectionToken(ngDevMode ? 'INJECTOR_DEF_TYPES' : '');

class NullInjector {
    get(token, notFoundValue = THROW_IF_NOT_FOUND) {
        if (notFoundValue === THROW_IF_NOT_FOUND) {
            const error = new Error(`NullInjectorError: No provider for ${stringify(token)}!`);
            error.name = 'NullInjectorError';
            throw error;
        }
        return notFoundValue;
    }
}

function getNgModuleDef(type, throwNotFound) {
    const ngModuleDef = type[NG_MOD_DEF] || null;
    if (!ngModuleDef && throwNotFound === true) {
        throw new Error(`Type ${stringify(type)} does not have 'ɵmod' property.`);
    }
    return ngModuleDef;
}
/**
 * The following getter methods retrieve the definition from the type. Currently the retrieval
 * honors inheritance, but in the future we may change the rule to require that definitions are
 * explicit. This would require some sort of migration strategy.
 */
function getComponentDef(type) {
    return type[NG_COMP_DEF] || null;
}
function getDirectiveDef(type) {
    return type[NG_DIR_DEF] || null;
}
function getPipeDef$1(type) {
    return type[NG_PIPE_DEF] || null;
}
/**
 * Checks whether a given Component, Directive or Pipe is marked as standalone.
 * This will return false if passed anything other than a Component, Directive, or Pipe class
 * See [this guide](guide/components/importing) for additional information:
 *
 * @param type A reference to a Component, Directive or Pipe.
 * @publicApi
 */
function isStandalone(type) {
    const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef$1(type);
    return def !== null && def.standalone;
}

/**
 * Wrap an array of `Provider`s into `EnvironmentProviders`, preventing them from being accidentally
 * referenced in `@Component` in a component injector.
 *
 * @publicApi
 */
function makeEnvironmentProviders(providers) {
    return {
        ɵproviders: providers,
    };
}
/**
 * @description
 * This function is used to provide initialization functions that will be executed upon construction
 * of an environment injector.
 *
 * Note that the provided initializer is run in the injection context.
 *
 * Previously, this was achieved using the `ENVIRONMENT_INITIALIZER` token which is now deprecated.
 *
 * @see {@link ENVIRONMENT_INITIALIZER}
 *
 * @usageNotes
 * The following example illustrates how to configure an initialization function using
 * `provideEnvironmentInitializer()`
 * ```ts
 * createEnvironmentInjector(
 *   [
 *     provideEnvironmentInitializer(() => {
 *       console.log('environment initialized');
 *     }),
 *   ],
 *   parentInjector
 * );
 * ```
 *
 * @publicApi
 */
function provideEnvironmentInitializer(initializerFn) {
    return makeEnvironmentProviders([
        {
            provide: ENVIRONMENT_INITIALIZER,
            multi: true,
            useValue: initializerFn,
        },
    ]);
}
/**
 * Collects providers from all NgModules and standalone components, including transitively imported
 * ones.
 *
 * Providers extracted via `importProvidersFrom` are only usable in an application injector or
 * another environment injector (such as a route injector). They should not be used in component
 * providers.
 *
 * More information about standalone components can be found in [this
 * guide](guide/components/importing).
 *
 * @usageNotes
 * The results of the `importProvidersFrom` call can be used in the `bootstrapApplication` call:
 *
 * ```ts
 * await bootstrapApplication(RootComponent, {
 *   providers: [
 *        importProvidersFrom(NgModuleOne, NgModuleTwo)
 *   ]
 * });
 * ```
 *
 * You can also use the `importProvidersFrom` results in the `providers` field of a route, when a
 * standalone component is used:
 *
 * ```ts
 * export const ROUTES: Route[] = [
 *   {
 *     path: 'foo',
 *     providers: [
 *       importProvidersFrom(NgModuleOne, NgModuleTwo)
 *     ],
 *     component: YourStandaloneComponent
 *   }
 * ];
 * ```
 *
 * @returns Collected providers from the specified list of types.
 * @publicApi
 */
function importProvidersFrom(...sources) {
    return {
        ɵproviders: internalImportProvidersFrom(true, sources),
        ɵfromNgModule: true,
    };
}
function internalImportProvidersFrom(checkForStandaloneCmp, ...sources) {
    const providersOut = [];
    const dedup = new Set(); // already seen types
    let injectorTypesWithProviders;
    const collectProviders = (provider) => {
        providersOut.push(provider);
    };
    deepForEach(sources, (source) => {
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && checkForStandaloneCmp) {
            const cmpDef = getComponentDef(source);
            if (cmpDef?.standalone) {
                throw new RuntimeError(800 /* RuntimeErrorCode.IMPORT_PROVIDERS_FROM_STANDALONE */, `Importing providers supports NgModule or ModuleWithProviders but got a standalone component "${stringifyForError(source)}"`);
            }
        }
        // Narrow `source` to access the internal type analogue for `ModuleWithProviders`.
        const internalSource = source;
        if (walkProviderTree(internalSource, collectProviders, [], dedup)) {
            injectorTypesWithProviders ||= [];
            injectorTypesWithProviders.push(internalSource);
        }
    });
    // Collect all providers from `ModuleWithProviders` types.
    if (injectorTypesWithProviders !== undefined) {
        processInjectorTypesWithProviders(injectorTypesWithProviders, collectProviders);
    }
    return providersOut;
}
/**
 * Collects all providers from the list of `ModuleWithProviders` and appends them to the provided
 * array.
 */
function processInjectorTypesWithProviders(typesWithProviders, visitor) {
    for (let i = 0; i < typesWithProviders.length; i++) {
        const { ngModule, providers } = typesWithProviders[i];
        deepForEachProvider(providers, (provider) => {
            ngDevMode && validateProvider(provider, providers || EMPTY_ARRAY, ngModule);
            visitor(provider, ngModule);
        });
    }
}
/**
 * The logic visits an `InjectorType`, an `InjectorTypeWithProviders`, or a standalone
 * `ComponentType`, and all of its transitive providers and collects providers.
 *
 * If an `InjectorTypeWithProviders` that declares providers besides the type is specified,
 * the function will return "true" to indicate that the providers of the type definition need
 * to be processed. This allows us to process providers of injector types after all imports of
 * an injector definition are processed. (following View Engine semantics: see FW-1349)
 */
function walkProviderTree(container, visitor, parents, dedup) {
    container = resolveForwardRef(container);
    if (!container)
        return false;
    // The actual type which had the definition. Usually `container`, but may be an unwrapped type
    // from `InjectorTypeWithProviders`.
    let defType = null;
    let injDef = getInjectorDef(container);
    const cmpDef = !injDef && getComponentDef(container);
    if (!injDef && !cmpDef) {
        // `container` is not an injector type or a component type. It might be:
        //  * An `InjectorTypeWithProviders` that wraps an injector type.
        //  * A standalone directive or pipe that got pulled in from a standalone component's
        //    dependencies.
        // Try to unwrap it as an `InjectorTypeWithProviders` first.
        const ngModule = container
            .ngModule;
        injDef = getInjectorDef(ngModule);
        if (injDef) {
            defType = ngModule;
        }
        else {
            // Not a component or injector type, so ignore it.
            return false;
        }
    }
    else if (cmpDef && !cmpDef.standalone) {
        return false;
    }
    else {
        defType = container;
    }
    // Check for circular dependencies.
    if (ngDevMode && parents.indexOf(defType) !== -1) {
        const defName = stringify(defType);
        const path = parents.map(stringify);
        throwCyclicDependencyError(defName, path);
    }
    // Check for multiple imports of the same module
    const isDuplicate = dedup.has(defType);
    if (cmpDef) {
        if (isDuplicate) {
            // This component definition has already been processed.
            return false;
        }
        dedup.add(defType);
        if (cmpDef.dependencies) {
            const deps = typeof cmpDef.dependencies === 'function' ? cmpDef.dependencies() : cmpDef.dependencies;
            for (const dep of deps) {
                walkProviderTree(dep, visitor, parents, dedup);
            }
        }
    }
    else if (injDef) {
        // First, include providers from any imports.
        if (injDef.imports != null && !isDuplicate) {
            // Before processing defType's imports, add it to the set of parents. This way, if it ends
            // up deeply importing itself, this can be detected.
            ngDevMode && parents.push(defType);
            // Add it to the set of dedups. This way we can detect multiple imports of the same module
            dedup.add(defType);
            let importTypesWithProviders;
            try {
                deepForEach(injDef.imports, (imported) => {
                    if (walkProviderTree(imported, visitor, parents, dedup)) {
                        importTypesWithProviders ||= [];
                        // If the processed import is an injector type with providers, we store it in the
                        // list of import types with providers, so that we can process those afterwards.
                        importTypesWithProviders.push(imported);
                    }
                });
            }
            finally {
                // Remove it from the parents set when finished.
                ngDevMode && parents.pop();
            }
            // Imports which are declared with providers (TypeWithProviders) need to be processed
            // after all imported modules are processed. This is similar to how View Engine
            // processes/merges module imports in the metadata resolver. See: FW-1349.
            if (importTypesWithProviders !== undefined) {
                processInjectorTypesWithProviders(importTypesWithProviders, visitor);
            }
        }
        if (!isDuplicate) {
            // Track the InjectorType and add a provider for it.
            // It's important that this is done after the def's imports.
            const factory = getFactoryDef(defType) || (() => new defType());
            // Append extra providers to make more info available for consumers (to retrieve an injector
            // type), as well as internally (to calculate an injection scope correctly and eagerly
            // instantiate a `defType` when an injector is created).
            // Provider to create `defType` using its factory.
            visitor({ provide: defType, useFactory: factory, deps: EMPTY_ARRAY }, defType);
            // Make this `defType` available to an internal logic that calculates injector scope.
            visitor({ provide: INJECTOR_DEF_TYPES, useValue: defType, multi: true }, defType);
            // Provider to eagerly instantiate `defType` via `INJECTOR_INITIALIZER`.
            visitor({ provide: ENVIRONMENT_INITIALIZER, useValue: () => ɵɵinject(defType), multi: true }, defType);
        }
        // Next, include providers listed on the definition itself.
        const defProviders = injDef.providers;
        if (defProviders != null && !isDuplicate) {
            const injectorType = container;
            deepForEachProvider(defProviders, (provider) => {
                ngDevMode && validateProvider(provider, defProviders, injectorType);
                visitor(provider, injectorType);
            });
        }
    }
    else {
        // Should not happen, but just in case.
        return false;
    }
    return (defType !== container && container.providers !== undefined);
}
function validateProvider(provider, providers, containerType) {
    if (isTypeProvider(provider) ||
        isValueProvider(provider) ||
        isFactoryProvider(provider) ||
        isExistingProvider(provider)) {
        return;
    }
    // Here we expect the provider to be a `useClass` provider (by elimination).
    const classRef = resolveForwardRef(provider && (provider.useClass || provider.provide));
    if (!classRef) {
        throwInvalidProviderError(containerType, providers, provider);
    }
}
function deepForEachProvider(providers, fn) {
    for (let provider of providers) {
        if (isEnvironmentProviders(provider)) {
            provider = provider.ɵproviders;
        }
        if (Array.isArray(provider)) {
            deepForEachProvider(provider, fn);
        }
        else {
            fn(provider);
        }
    }
}
const USE_VALUE$1 = getClosureSafeProperty({
    provide: String,
    useValue: getClosureSafeProperty,
});
function isValueProvider(value) {
    return value !== null && typeof value == 'object' && USE_VALUE$1 in value;
}
function isExistingProvider(value) {
    return !!(value && value.useExisting);
}
function isFactoryProvider(value) {
    return !!(value && value.useFactory);
}
function isTypeProvider(value) {
    return typeof value === 'function';
}
function isClassProvider(value) {
    return !!value.useClass;
}

/**
 * An internal token whose presence in an injector indicates that the injector should treat itself
 * as a root scoped injector when processing requests for unknown tokens which may indicate
 * they are provided in the root scope.
 */
const INJECTOR_SCOPE = new InjectionToken(ngDevMode ? 'Set Injector scope.' : '');

/**
 * Marker which indicates that a value has not yet been created from the factory function.
 */
const NOT_YET = {};
/**
 * Marker which indicates that the factory function for a token is in the process of being called.
 *
 * If the injector is asked to inject a token with its value set to CIRCULAR, that indicates
 * injection of a dependency has recursively attempted to inject the original token, and there is
 * a circular dependency among the providers.
 */
const CIRCULAR = {};
/**
 * A lazily initialized NullInjector.
 */
let NULL_INJECTOR = undefined;
function getNullInjector() {
    if (NULL_INJECTOR === undefined) {
        NULL_INJECTOR = new NullInjector();
    }
    return NULL_INJECTOR;
}
/**
 * An `Injector` that's part of the environment injector hierarchy, which exists outside of the
 * component tree.
 */
class EnvironmentInjector {
}
class R3Injector extends EnvironmentInjector {
    parent;
    source;
    scopes;
    /**
     * Map of tokens to records which contain the instances of those tokens.
     * - `null` value implies that we don't have the record. Used by tree-shakable injectors
     * to prevent further searches.
     */
    records = new Map();
    /**
     * Set of values instantiated by this injector which contain `ngOnDestroy` lifecycle hooks.
     */
    _ngOnDestroyHooks = new Set();
    _onDestroyHooks = [];
    /**
     * Flag indicating that this injector was previously destroyed.
     */
    get destroyed() {
        return this._destroyed;
    }
    _destroyed = false;
    injectorDefTypes;
    constructor(providers, parent, source, scopes) {
        super();
        this.parent = parent;
        this.source = source;
        this.scopes = scopes;
        // Start off by creating Records for every provider.
        forEachSingleProvider(providers, (provider) => this.processProvider(provider));
        // Make sure the INJECTOR token provides this injector.
        this.records.set(INJECTOR$1, makeRecord(undefined, this));
        // And `EnvironmentInjector` if the current injector is supposed to be env-scoped.
        if (scopes.has('environment')) {
            this.records.set(EnvironmentInjector, makeRecord(undefined, this));
        }
        // Detect whether this injector has the APP_ROOT_SCOPE token and thus should provide
        // any injectable scoped to APP_ROOT_SCOPE.
        const record = this.records.get(INJECTOR_SCOPE);
        if (record != null && typeof record.value === 'string') {
            this.scopes.add(record.value);
        }
        this.injectorDefTypes = new Set(this.get(INJECTOR_DEF_TYPES, EMPTY_ARRAY, InjectFlags.Self));
    }
    retrieve(token, options) {
        const ngOptions = options;
        return this.get(token, ngOptions.optional ? NOT_FOUND$2 : THROW_IF_NOT_FOUND, ngOptions);
    }
    /**
     * Destroy the injector and release references to every instance or provider associated with it.
     *
     * Also calls the `OnDestroy` lifecycle hooks of every instance that was created for which a
     * hook was found.
     */
    destroy() {
        assertNotDestroyed(this);
        // Set destroyed = true first, in case lifecycle hooks re-enter destroy().
        this._destroyed = true;
        const prevConsumer = setActiveConsumer(null);
        try {
            // Call all the lifecycle hooks.
            for (const service of this._ngOnDestroyHooks) {
                service.ngOnDestroy();
            }
            const onDestroyHooks = this._onDestroyHooks;
            // Reset the _onDestroyHooks array before iterating over it to prevent hooks that unregister
            // themselves from mutating the array during iteration.
            this._onDestroyHooks = [];
            for (const hook of onDestroyHooks) {
                hook();
            }
        }
        finally {
            // Release all references.
            this.records.clear();
            this._ngOnDestroyHooks.clear();
            this.injectorDefTypes.clear();
            setActiveConsumer(prevConsumer);
        }
    }
    onDestroy(callback) {
        assertNotDestroyed(this);
        this._onDestroyHooks.push(callback);
        return () => this.removeOnDestroy(callback);
    }
    runInContext(fn) {
        assertNotDestroyed(this);
        const previousInjector = setCurrentInjector(this);
        const previousInjectImplementation = setInjectImplementation(undefined);
        let prevInjectContext;
        if (ngDevMode) {
            prevInjectContext = setInjectorProfilerContext({ injector: this, token: null });
        }
        try {
            return fn();
        }
        finally {
            setCurrentInjector(previousInjector);
            setInjectImplementation(previousInjectImplementation);
            ngDevMode && setInjectorProfilerContext(prevInjectContext);
        }
    }
    get(token, notFoundValue = THROW_IF_NOT_FOUND, flags = InjectFlags.Default) {
        assertNotDestroyed(this);
        if (token.hasOwnProperty(NG_ENV_ID)) {
            return token[NG_ENV_ID](this);
        }
        flags = convertToBitFlags(flags);
        // Set the injection context.
        let prevInjectContext;
        if (ngDevMode) {
            prevInjectContext = setInjectorProfilerContext({ injector: this, token: token });
        }
        const previousInjector = setCurrentInjector(this);
        const previousInjectImplementation = setInjectImplementation(undefined);
        try {
            // Check for the SkipSelf flag.
            if (!(flags & InjectFlags.SkipSelf)) {
                // SkipSelf isn't set, check if the record belongs to this injector.
                let record = this.records.get(token);
                if (record === undefined) {
                    // No record, but maybe the token is scoped to this injector. Look for an injectable
                    // def with a scope matching this injector.
                    const def = couldBeInjectableType(token) && getInjectableDef(token);
                    if (def && this.injectableDefInScope(def)) {
                        // Found an injectable def and it's scoped to this injector. Pretend as if it was here
                        // all along.
                        if (ngDevMode) {
                            runInInjectorProfilerContext(this, token, () => {
                                emitProviderConfiguredEvent(token);
                            });
                        }
                        record = makeRecord(injectableDefOrInjectorDefFactory(token), NOT_YET);
                    }
                    else {
                        record = null;
                    }
                    this.records.set(token, record);
                }
                // If a record was found, get the instance for it and return it.
                if (record != null /* NOT null || undefined */) {
                    return this.hydrate(token, record, flags);
                }
            }
            // Select the next injector based on the Self flag - if self is set, the next injector is
            // the NullInjector, otherwise it's the parent.
            const nextInjector = !(flags & InjectFlags.Self) ? this.parent : getNullInjector();
            // Set the notFoundValue based on the Optional flag - if optional is set and notFoundValue
            // is undefined, the value is null, otherwise it's the notFoundValue.
            notFoundValue =
                flags & InjectFlags.Optional && notFoundValue === THROW_IF_NOT_FOUND ? null : notFoundValue;
            return nextInjector.get(token, notFoundValue);
        }
        catch (e) {
            if (e.name === 'NullInjectorError') {
                const path = (e[NG_TEMP_TOKEN_PATH] = e[NG_TEMP_TOKEN_PATH] || []);
                path.unshift(stringify(token));
                if (previousInjector) {
                    // We still have a parent injector, keep throwing
                    throw e;
                }
                else {
                    // Format & throw the final error message when we don't have any previous injector
                    return catchInjectorError(e, token, 'R3InjectorError', this.source);
                }
            }
            else {
                throw e;
            }
        }
        finally {
            // Lastly, restore the previous injection context.
            setInjectImplementation(previousInjectImplementation);
            setCurrentInjector(previousInjector);
            ngDevMode && setInjectorProfilerContext(prevInjectContext);
        }
    }
    /** @internal */
    resolveInjectorInitializers() {
        const prevConsumer = setActiveConsumer(null);
        const previousInjector = setCurrentInjector(this);
        const previousInjectImplementation = setInjectImplementation(undefined);
        let prevInjectContext;
        if (ngDevMode) {
            prevInjectContext = setInjectorProfilerContext({ injector: this, token: null });
        }
        try {
            const initializers = this.get(ENVIRONMENT_INITIALIZER, EMPTY_ARRAY, InjectFlags.Self);
            if (ngDevMode && !Array.isArray(initializers)) {
                throw new RuntimeError(-209 /* RuntimeErrorCode.INVALID_MULTI_PROVIDER */, 'Unexpected type of the `ENVIRONMENT_INITIALIZER` token value ' +
                    `(expected an array, but got ${typeof initializers}). ` +
                    'Please check that the `ENVIRONMENT_INITIALIZER` token is configured as a ' +
                    '`multi: true` provider.');
            }
            for (const initializer of initializers) {
                initializer();
            }
        }
        finally {
            setCurrentInjector(previousInjector);
            setInjectImplementation(previousInjectImplementation);
            ngDevMode && setInjectorProfilerContext(prevInjectContext);
            setActiveConsumer(prevConsumer);
        }
    }
    toString() {
        const tokens = [];
        const records = this.records;
        for (const token of records.keys()) {
            tokens.push(stringify(token));
        }
        return `R3Injector[${tokens.join(', ')}]`;
    }
    /**
     * Process a `SingleProvider` and add it.
     */
    processProvider(provider) {
        // Determine the token from the provider. Either it's its own token, or has a {provide: ...}
        // property.
        provider = resolveForwardRef(provider);
        let token = isTypeProvider(provider)
            ? provider
            : resolveForwardRef(provider && provider.provide);
        // Construct a `Record` for the provider.
        const record = providerToRecord(provider);
        if (ngDevMode) {
            runInInjectorProfilerContext(this, token, () => {
                // Emit InjectorProfilerEventType.Create if provider is a value provider because
                // these are the only providers that do not go through the value hydration logic
                // where this event would normally be emitted from.
                if (isValueProvider(provider)) {
                    emitInstanceCreatedByInjectorEvent(provider.useValue);
                }
                emitProviderConfiguredEvent(provider);
            });
        }
        if (!isTypeProvider(provider) && provider.multi === true) {
            // If the provider indicates that it's a multi-provider, process it specially.
            // First check whether it's been defined already.
            let multiRecord = this.records.get(token);
            if (multiRecord) {
                // It has. Throw a nice error if
                if (ngDevMode && multiRecord.multi === undefined) {
                    throwMixedMultiProviderError();
                }
            }
            else {
                multiRecord = makeRecord(undefined, NOT_YET, true);
                multiRecord.factory = () => injectArgs(multiRecord.multi);
                this.records.set(token, multiRecord);
            }
            token = provider;
            multiRecord.multi.push(provider);
        }
        else {
            if (ngDevMode) {
                const existing = this.records.get(token);
                if (existing && existing.multi !== undefined) {
                    throwMixedMultiProviderError();
                }
            }
        }
        this.records.set(token, record);
    }
    hydrate(token, record, flags) {
        const prevConsumer = setActiveConsumer(null);
        try {
            if (record.value === CIRCULAR) {
                throwCyclicDependencyError(stringify(token));
            }
            else if (record.value === NOT_YET) {
                record.value = CIRCULAR;
                if (ngDevMode) {
                    runInInjectorProfilerContext(this, token, () => {
                        record.value = record.factory(undefined, flags);
                        emitInstanceCreatedByInjectorEvent(record.value);
                    });
                }
                else {
                    record.value = record.factory(undefined, flags);
                }
            }
            if (typeof record.value === 'object' && record.value && hasOnDestroy(record.value)) {
                this._ngOnDestroyHooks.add(record.value);
            }
            return record.value;
        }
        finally {
            setActiveConsumer(prevConsumer);
        }
    }
    injectableDefInScope(def) {
        if (!def.providedIn) {
            return false;
        }
        const providedIn = resolveForwardRef(def.providedIn);
        if (typeof providedIn === 'string') {
            return providedIn === 'any' || this.scopes.has(providedIn);
        }
        else {
            return this.injectorDefTypes.has(providedIn);
        }
    }
    removeOnDestroy(callback) {
        const destroyCBIdx = this._onDestroyHooks.indexOf(callback);
        if (destroyCBIdx !== -1) {
            this._onDestroyHooks.splice(destroyCBIdx, 1);
        }
    }
}
function injectableDefOrInjectorDefFactory(token) {
    // Most tokens will have an injectable def directly on them, which specifies a factory directly.
    const injectableDef = getInjectableDef(token);
    const factory = injectableDef !== null ? injectableDef.factory : getFactoryDef(token);
    if (factory !== null) {
        return factory;
    }
    // InjectionTokens should have an injectable def (ɵprov) and thus should be handled above.
    // If it's missing that, it's an error.
    if (token instanceof InjectionToken) {
        throw new RuntimeError(204 /* RuntimeErrorCode.INVALID_INJECTION_TOKEN */, ngDevMode && `Token ${stringify(token)} is missing a ɵprov definition.`);
    }
    // Undecorated types can sometimes be created if they have no constructor arguments.
    if (token instanceof Function) {
        return getUndecoratedInjectableFactory(token);
    }
    // There was no way to resolve a factory for this token.
    throw new RuntimeError(204 /* RuntimeErrorCode.INVALID_INJECTION_TOKEN */, ngDevMode && 'unreachable');
}
function getUndecoratedInjectableFactory(token) {
    // If the token has parameters then it has dependencies that we cannot resolve implicitly.
    const paramLength = token.length;
    if (paramLength > 0) {
        throw new RuntimeError(204 /* RuntimeErrorCode.INVALID_INJECTION_TOKEN */, ngDevMode &&
            `Can't resolve all parameters for ${stringify(token)}: (${newArray(paramLength, '?').join(', ')}).`);
    }
    // The constructor function appears to have no parameters.
    // This might be because it inherits from a super-class. In which case, use an injectable
    // def from an ancestor if there is one.
    // Otherwise this really is a simple class with no dependencies, so return a factory that
    // just instantiates the zero-arg constructor.
    const inheritedInjectableDef = getInheritedInjectableDef(token);
    if (inheritedInjectableDef !== null) {
        return () => inheritedInjectableDef.factory(token);
    }
    else {
        return () => new token();
    }
}
function providerToRecord(provider) {
    if (isValueProvider(provider)) {
        return makeRecord(undefined, provider.useValue);
    }
    else {
        const factory = providerToFactory(provider);
        return makeRecord(factory, NOT_YET);
    }
}
/**
 * Converts a `SingleProvider` into a factory function.
 *
 * @param provider provider to convert to factory
 */
function providerToFactory(provider, ngModuleType, providers) {
    let factory = undefined;
    if (ngDevMode && isEnvironmentProviders(provider)) {
        throwInvalidProviderError(undefined, providers, provider);
    }
    if (isTypeProvider(provider)) {
        const unwrappedProvider = resolveForwardRef(provider);
        return getFactoryDef(unwrappedProvider) || injectableDefOrInjectorDefFactory(unwrappedProvider);
    }
    else {
        if (isValueProvider(provider)) {
            factory = () => resolveForwardRef(provider.useValue);
        }
        else if (isFactoryProvider(provider)) {
            factory = () => provider.useFactory(...injectArgs(provider.deps || []));
        }
        else if (isExistingProvider(provider)) {
            factory = (_, flags) => ɵɵinject(resolveForwardRef(provider.useExisting), flags !== undefined && flags & InjectFlags.Optional ? InjectFlags.Optional : undefined);
        }
        else {
            const classRef = resolveForwardRef(provider &&
                (provider.useClass || provider.provide));
            if (ngDevMode && !classRef) {
                throwInvalidProviderError(ngModuleType, providers, provider);
            }
            if (hasDeps(provider)) {
                factory = () => new classRef(...injectArgs(provider.deps));
            }
            else {
                return getFactoryDef(classRef) || injectableDefOrInjectorDefFactory(classRef);
            }
        }
    }
    return factory;
}
function assertNotDestroyed(injector) {
    if (injector.destroyed) {
        throw new RuntimeError(205 /* RuntimeErrorCode.INJECTOR_ALREADY_DESTROYED */, ngDevMode && 'Injector has already been destroyed.');
    }
}
function makeRecord(factory, value, multi = false) {
    return {
        factory: factory,
        value: value,
        multi: multi ? [] : undefined,
    };
}
function hasDeps(value) {
    return !!value.deps;
}
function hasOnDestroy(value) {
    return (value !== null &&
        typeof value === 'object' &&
        typeof value.ngOnDestroy === 'function');
}
function couldBeInjectableType(value) {
    return (typeof value === 'function' || (typeof value === 'object' && value instanceof InjectionToken));
}
function forEachSingleProvider(providers, fn) {
    for (const provider of providers) {
        if (Array.isArray(provider)) {
            forEachSingleProvider(provider, fn);
        }
        else if (provider && isEnvironmentProviders(provider)) {
            forEachSingleProvider(provider.ɵproviders, fn);
        }
        else {
            fn(provider);
        }
    }
}

/**
 * Runs the given function in the [context](guide/di/dependency-injection-context) of the given
 * `Injector`.
 *
 * Within the function's stack frame, [`inject`](api/core/inject) can be used to inject dependencies
 * from the given `Injector`. Note that `inject` is only usable synchronously, and cannot be used in
 * any asynchronous callbacks or after any `await` points.
 *
 * @param injector the injector which will satisfy calls to [`inject`](api/core/inject) while `fn`
 *     is executing
 * @param fn the closure to be run in the context of `injector`
 * @returns the return value of the function, if any
 * @publicApi
 */
function runInInjectionContext(injector, fn) {
    let internalInjector;
    if (injector instanceof R3Injector) {
        assertNotDestroyed(injector);
        internalInjector = injector;
    }
    else {
        internalInjector = new RetrievingInjector(injector);
    }
    let prevInjectorProfilerContext;
    if (ngDevMode) {
        prevInjectorProfilerContext = setInjectorProfilerContext({ injector, token: null });
    }
    const prevInjector = setCurrentInjector(internalInjector);
    const previousInjectImplementation = setInjectImplementation(undefined);
    try {
        return fn();
    }
    finally {
        setCurrentInjector(prevInjector);
        ngDevMode && setInjectorProfilerContext(prevInjectorProfilerContext);
        setInjectImplementation(previousInjectImplementation);
    }
}
/**
 * Whether the current stack frame is inside an injection context.
 */
function isInInjectionContext() {
    return getInjectImplementation() !== undefined || getCurrentInjector() != null;
}
/**
 * Asserts that the current stack frame is within an [injection
 * context](guide/di/dependency-injection-context) and has access to `inject`.
 *
 * @param debugFn a reference to the function making the assertion (used for the error message).
 *
 * @publicApi
 */
function assertInInjectionContext(debugFn) {
    // Taking a `Function` instead of a string name here prevents the unminified name of the function
    // from being retained in the bundle regardless of minification.
    if (!isInInjectionContext()) {
        throw new RuntimeError(-203 /* RuntimeErrorCode.MISSING_INJECTION_CONTEXT */, ngDevMode &&
            debugFn.name +
                '() can only be used within an injection context such as a constructor, a factory function, a field initializer, or a function used with `runInInjectionContext`');
    }
}

var FactoryTarget;
(function (FactoryTarget) {
    FactoryTarget[FactoryTarget["Directive"] = 0] = "Directive";
    FactoryTarget[FactoryTarget["Component"] = 1] = "Component";
    FactoryTarget[FactoryTarget["Injectable"] = 2] = "Injectable";
    FactoryTarget[FactoryTarget["Pipe"] = 3] = "Pipe";
    FactoryTarget[FactoryTarget["NgModule"] = 4] = "NgModule";
})(FactoryTarget || (FactoryTarget = {}));
var R3TemplateDependencyKind;
(function (R3TemplateDependencyKind) {
    R3TemplateDependencyKind[R3TemplateDependencyKind["Directive"] = 0] = "Directive";
    R3TemplateDependencyKind[R3TemplateDependencyKind["Pipe"] = 1] = "Pipe";
    R3TemplateDependencyKind[R3TemplateDependencyKind["NgModule"] = 2] = "NgModule";
})(R3TemplateDependencyKind || (R3TemplateDependencyKind = {}));
var ViewEncapsulation$1;
(function (ViewEncapsulation) {
    ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
    // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.
    ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
    ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
})(ViewEncapsulation$1 || (ViewEncapsulation$1 = {}));

function getCompilerFacade(request) {
    const globalNg = _global['ng'];
    if (globalNg && globalNg.ɵcompilerFacade) {
        return globalNg.ɵcompilerFacade;
    }
    if (typeof ngDevMode === 'undefined' || ngDevMode) {
        // Log the type as an error so that a developer can easily navigate to the type from the
        // console.
        console.error(`JIT compilation failed for ${request.kind}`, request.type);
        let message = `The ${request.kind} '${request.type.name}' needs to be compiled using the JIT compiler, but '@angular/compiler' is not available.\n\n`;
        if (request.usage === 1 /* JitCompilerUsage.PartialDeclaration */) {
            message += `The ${request.kind} is part of a library that has been partially compiled.\n`;
            message += `However, the Angular Linker has not processed the library such that JIT compilation is used as fallback.\n`;
            message += '\n';
            message += `Ideally, the library is processed using the Angular Linker to become fully AOT compiled.\n`;
        }
        else {
            message += `JIT compilation is discouraged for production use-cases! Consider using AOT mode instead.\n`;
        }
        message += `Alternatively, the JIT compiler should be loaded by bootstrapping using '@angular/platform-browser-dynamic' or '@angular/platform-server',\n`;
        message += `or manually provide the compiler with 'import "@angular/compiler";' before bootstrapping.`;
        throw new Error(message);
    }
    else {
        throw new Error('JIT compiler unavailable');
    }
}

/**
 * A mapping of the @angular/core API surface used in generated expressions to the actual symbols.
 *
 * This should be kept up to date with the public exports of @angular/core.
 */
const angularCoreDiEnv = {
    'ɵɵdefineInjectable': ɵɵdefineInjectable,
    'ɵɵdefineInjector': ɵɵdefineInjector,
    'ɵɵinject': ɵɵinject,
    'ɵɵinvalidFactoryDep': ɵɵinvalidFactoryDep,
    'resolveForwardRef': resolveForwardRef,
};

/**
 * @description
 *
 * Represents a type that a Component or other object is instances of.
 *
 * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is represented by
 * the `MyCustomComponent` constructor function.
 *
 * @publicApi
 */
const Type = Function;
function isType(v) {
    return typeof v === 'function';
}

/*
 * #########################
 * Attention: These Regular expressions have to hold even if the code is minified!
 * ##########################
 */
/**
 * Regular expression that detects pass-through constructors for ES5 output. This Regex
 * intends to capture the common delegation pattern emitted by TypeScript and Babel. Also
 * it intends to capture the pattern where existing constructors have been downleveled from
 * ES2015 to ES5 using TypeScript w/ downlevel iteration. e.g.
 *
 * ```ts
 *   function MyClass() {
 *     var _this = _super.apply(this, arguments) || this;
 * ```
 *
 * downleveled to ES5 with `downlevelIteration` for TypeScript < 4.2:
 * ```ts
 *   function MyClass() {
 *     var _this = _super.apply(this, __spread(arguments)) || this;
 * ```
 *
 * or downleveled to ES5 with `downlevelIteration` for TypeScript >= 4.2:
 * ```ts
 *   function MyClass() {
 *     var _this = _super.apply(this, __spreadArray([], __read(arguments), false)) || this;
 * ```
 *
 * More details can be found in: https://github.com/angular/angular/issues/38453.
 */
const ES5_DELEGATE_CTOR = /^function\s+\S+\(\)\s*{[\s\S]+\.apply\(this,\s*(arguments|(?:[^()]+\(\[\],)?[^()]+\(arguments\).*)\)/;
/** Regular expression that detects ES2015 classes which extend from other classes. */
const ES2015_INHERITED_CLASS = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{/;
/**
 * Regular expression that detects ES2015 classes which extend from other classes and
 * have an explicit constructor defined.
 */
const ES2015_INHERITED_CLASS_WITH_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(/;
/**
 * Regular expression that detects ES2015 classes which extend from other classes
 * and inherit a constructor.
 */
const ES2015_INHERITED_CLASS_WITH_DELEGATE_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(\)\s*{[^}]*super\(\.\.\.arguments\)/;
/**
 * Determine whether a stringified type is a class which delegates its constructor
 * to its parent.
 *
 * This is not trivial since compiled code can actually contain a constructor function
 * even if the original source code did not. For instance, when the child class contains
 * an initialized instance property.
 */
function isDelegateCtor(typeStr) {
    return (ES5_DELEGATE_CTOR.test(typeStr) ||
        ES2015_INHERITED_CLASS_WITH_DELEGATE_CTOR.test(typeStr) ||
        (ES2015_INHERITED_CLASS.test(typeStr) && !ES2015_INHERITED_CLASS_WITH_CTOR.test(typeStr)));
}
class ReflectionCapabilities {
    _reflect;
    constructor(reflect) {
        this._reflect = reflect || _global['Reflect'];
    }
    factory(t) {
        return (...args) => new t(...args);
    }
    /** @internal */
    _zipTypesAndAnnotations(paramTypes, paramAnnotations) {
        let result;
        if (typeof paramTypes === 'undefined') {
            result = newArray(paramAnnotations.length);
        }
        else {
            result = newArray(paramTypes.length);
        }
        for (let i = 0; i < result.length; i++) {
            // TS outputs Object for parameters without types, while Traceur omits
            // the annotations. For now we preserve the Traceur behavior to aid
            // migration, but this can be revisited.
            if (typeof paramTypes === 'undefined') {
                result[i] = [];
            }
            else if (paramTypes[i] && paramTypes[i] != Object) {
                result[i] = [paramTypes[i]];
            }
            else {
                result[i] = [];
            }
            if (paramAnnotations && paramAnnotations[i] != null) {
                result[i] = result[i].concat(paramAnnotations[i]);
            }
        }
        return result;
    }
    _ownParameters(type, parentCtor) {
        const typeStr = type.toString();
        // If we have no decorators, we only have function.length as metadata.
        // In that case, to detect whether a child class declared an own constructor or not,
        // we need to look inside of that constructor to check whether it is
        // just calling the parent.
        // This also helps to work around for https://github.com/Microsoft/TypeScript/issues/12439
        // that sets 'design:paramtypes' to []
        // if a class inherits from another class but has no ctor declared itself.
        if (isDelegateCtor(typeStr)) {
            return null;
        }
        // Prefer the direct API.
        if (type.parameters && type.parameters !== parentCtor.parameters) {
            return type.parameters;
        }
        // API of tsickle for lowering decorators to properties on the class.
        const tsickleCtorParams = type.ctorParameters;
        if (tsickleCtorParams && tsickleCtorParams !== parentCtor.ctorParameters) {
            // Newer tsickle uses a function closure
            // Retain the non-function case for compatibility with older tsickle
            const ctorParameters = typeof tsickleCtorParams === 'function' ? tsickleCtorParams() : tsickleCtorParams;
            const paramTypes = ctorParameters.map((ctorParam) => ctorParam && ctorParam.type);
            const paramAnnotations = ctorParameters.map((ctorParam) => ctorParam && convertTsickleDecoratorIntoMetadata(ctorParam.decorators));
            return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);
        }
        // API for metadata created by invoking the decorators.
        const paramAnnotations = type.hasOwnProperty(PARAMETERS) && type[PARAMETERS];
        const paramTypes = this._reflect &&
            this._reflect.getOwnMetadata &&
            this._reflect.getOwnMetadata('design:paramtypes', type);
        if (paramTypes || paramAnnotations) {
            return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);
        }
        // If a class has no decorators, at least create metadata
        // based on function.length.
        // Note: We know that this is a real constructor as we checked
        // the content of the constructor above.
        return newArray(type.length);
    }
    parameters(type) {
        // Note: only report metadata if we have at least one class decorator
        // to stay in sync with the static reflector.
        if (!isType(type)) {
            return [];
        }
        const parentCtor = getParentCtor(type);
        let parameters = this._ownParameters(type, parentCtor);
        if (!parameters && parentCtor !== Object) {
            parameters = this.parameters(parentCtor);
        }
        return parameters || [];
    }
    _ownAnnotations(typeOrFunc, parentCtor) {
        // Prefer the direct API.
        if (typeOrFunc.annotations && typeOrFunc.annotations !== parentCtor.annotations) {
            let annotations = typeOrFunc.annotations;
            if (typeof annotations === 'function' && annotations.annotations) {
                annotations = annotations.annotations;
            }
            return annotations;
        }
        // API of tsickle for lowering decorators to properties on the class.
        if (typeOrFunc.decorators && typeOrFunc.decorators !== parentCtor.decorators) {
            return convertTsickleDecoratorIntoMetadata(typeOrFunc.decorators);
        }
        // API for metadata created by invoking the decorators.
        if (typeOrFunc.hasOwnProperty(ANNOTATIONS)) {
            return typeOrFunc[ANNOTATIONS];
        }
        return null;
    }
    annotations(typeOrFunc) {
        if (!isType(typeOrFunc)) {
            return [];
        }
        const parentCtor = getParentCtor(typeOrFunc);
        const ownAnnotations = this._ownAnnotations(typeOrFunc, parentCtor) || [];
        const parentAnnotations = parentCtor !== Object ? this.annotations(parentCtor) : [];
        return parentAnnotations.concat(ownAnnotations);
    }
    _ownPropMetadata(typeOrFunc, parentCtor) {
        // Prefer the direct API.
        if (typeOrFunc.propMetadata &&
            typeOrFunc.propMetadata !== parentCtor.propMetadata) {
            let propMetadata = typeOrFunc.propMetadata;
            if (typeof propMetadata === 'function' && propMetadata.propMetadata) {
                propMetadata = propMetadata.propMetadata;
            }
            return propMetadata;
        }
        // API of tsickle for lowering decorators to properties on the class.
        if (typeOrFunc.propDecorators &&
            typeOrFunc.propDecorators !== parentCtor.propDecorators) {
            const propDecorators = typeOrFunc.propDecorators;
            const propMetadata = {};
            Object.keys(propDecorators).forEach((prop) => {
                propMetadata[prop] = convertTsickleDecoratorIntoMetadata(propDecorators[prop]);
            });
            return propMetadata;
        }
        // API for metadata created by invoking the decorators.
        if (typeOrFunc.hasOwnProperty(PROP_METADATA)) {
            return typeOrFunc[PROP_METADATA];
        }
        return null;
    }
    propMetadata(typeOrFunc) {
        if (!isType(typeOrFunc)) {
            return {};
        }
        const parentCtor = getParentCtor(typeOrFunc);
        const propMetadata = {};
        if (parentCtor !== Object) {
            const parentPropMetadata = this.propMetadata(parentCtor);
            Object.keys(parentPropMetadata).forEach((propName) => {
                propMetadata[propName] = parentPropMetadata[propName];
            });
        }
        const ownPropMetadata = this._ownPropMetadata(typeOrFunc, parentCtor);
        if (ownPropMetadata) {
            Object.keys(ownPropMetadata).forEach((propName) => {
                const decorators = [];
                if (propMetadata.hasOwnProperty(propName)) {
                    decorators.push(...propMetadata[propName]);
                }
                decorators.push(...ownPropMetadata[propName]);
                propMetadata[propName] = decorators;
            });
        }
        return propMetadata;
    }
    ownPropMetadata(typeOrFunc) {
        if (!isType(typeOrFunc)) {
            return {};
        }
        return this._ownPropMetadata(typeOrFunc, getParentCtor(typeOrFunc)) || {};
    }
    hasLifecycleHook(type, lcProperty) {
        return type instanceof Type && lcProperty in type.prototype;
    }
}
function convertTsickleDecoratorIntoMetadata(decoratorInvocations) {
    if (!decoratorInvocations) {
        return [];
    }
    return decoratorInvocations.map((decoratorInvocation) => {
        const decoratorType = decoratorInvocation.type;
        const annotationCls = decoratorType.annotationCls;
        const annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : [];
        return new annotationCls(...annotationArgs);
    });
}
function getParentCtor(ctor) {
    const parentProto = ctor.prototype ? Object.getPrototypeOf(ctor.prototype) : null;
    const parentCtor = parentProto ? parentProto.constructor : null;
    // Note: We always use `Object` as the null value
    // to simplify checking later on.
    return parentCtor || Object;
}

// Below are constants for LView indices to help us look up LView members
// without having to remember the specific indices.
// Uglify will inline these when minifying so there shouldn't be a cost.
const HOST = 0;
const TVIEW = 1;
// Shared with LContainer
const FLAGS = 2;
const PARENT = 3;
const NEXT = 4;
const T_HOST = 5;
// End shared with LContainer
const HYDRATION = 6;
const CLEANUP = 7;
const CONTEXT = 8;
const INJECTOR = 9;
const ENVIRONMENT = 10;
const RENDERER = 11;
const CHILD_HEAD = 12;
const CHILD_TAIL = 13;
// FIXME(misko): Investigate if the three declarations aren't all same thing.
const DECLARATION_VIEW = 14;
const DECLARATION_COMPONENT_VIEW = 15;
const DECLARATION_LCONTAINER = 16;
const PREORDER_HOOK_FLAGS = 17;
const QUERIES = 18;
const ID = 19;
const EMBEDDED_VIEW_INJECTOR = 20;
const ON_DESTROY_HOOKS = 21;
const EFFECTS_TO_SCHEDULE = 22;
const EFFECTS = 23;
const REACTIVE_TEMPLATE_CONSUMER = 24;
const AFTER_RENDER_SEQUENCES_TO_ADD = 25;
/**
 * Size of LView's header. Necessary to adjust for it when setting slots.
 *
 * IMPORTANT: `HEADER_OFFSET` should only be referred to the in the `ɵɵ*` instructions to translate
 * instruction index into `LView` index. All other indexes should be in the `LView` index space and
 * there should be no need to refer to `HEADER_OFFSET` anywhere else.
 */
const HEADER_OFFSET = 26;

/**
 * Special location which allows easy identification of type. If we have an array which was
 * retrieved from the `LView` and that array has `true` at `TYPE` location, we know it is
 * `LContainer`.
 */
const TYPE = 1;
/**
 * Below are constants for LContainer indices to help us look up LContainer members
 * without having to remember the specific indices.
 * Uglify will inline these when minifying so there shouldn't be a cost.
 */
// FLAGS, PARENT, NEXT, and T_HOST are indices 2, 3, 4, and 5
// As we already have these constants in LView, we don't need to re-create them.
const DEHYDRATED_VIEWS = 6;
const NATIVE = 7;
const VIEW_REFS = 8;
const MOVED_VIEWS = 9;
/**
 * Size of LContainer's header. Represents the index after which all views in the
 * container will be inserted. We need to keep a record of current views so we know
 * which views are already in the DOM (and don't need to be re-added) and so we can
 * remove views from the DOM when they are no longer required.
 */
const CONTAINER_HEADER_OFFSET = 10;

/**
 * True if `value` is `LView`.
 * @param value wrapped value of `RNode`, `LView`, `LContainer`
 */
function isLView(value) {
    return Array.isArray(value) && typeof value[TYPE] === 'object';
}
/**
 * True if `value` is `LContainer`.
 * @param value wrapped value of `RNode`, `LView`, `LContainer`
 */
function isLContainer(value) {
    return Array.isArray(value) && value[TYPE] === true;
}
function isContentQueryHost(tNode) {
    return (tNode.flags & 4 /* TNodeFlags.hasContentQuery */) !== 0;
}
function isComponentHost(tNode) {
    return tNode.componentOffset > -1;
}
function isDirectiveHost(tNode) {
    return (tNode.flags & 1 /* TNodeFlags.isDirectiveHost */) === 1 /* TNodeFlags.isDirectiveHost */;
}
function isComponentDef(def) {
    return !!def.template;
}
function isRootView(target) {
    // Determines whether a given LView is marked as a root view.
    return (target[FLAGS] & 512 /* LViewFlags.IsRoot */) !== 0;
}
function isProjectionTNode(tNode) {
    return (tNode.type & 16 /* TNodeType.Projection */) === 16 /* TNodeType.Projection */;
}
function hasI18n(lView) {
    return (lView[FLAGS] & 32 /* LViewFlags.HasI18n */) === 32 /* LViewFlags.HasI18n */;
}
function isDestroyed(lView) {
    // Determines whether a given LView is marked as destroyed.
    return (lView[FLAGS] & 256 /* LViewFlags.Destroyed */) === 256 /* LViewFlags.Destroyed */;
}

// [Assert functions do not constraint type when they are guarded by a truthy
// expression.](https://github.com/microsoft/TypeScript/issues/37295)
function assertTNodeForLView(tNode, lView) {
    assertTNodeForTView(tNode, lView[TVIEW]);
}
function assertTNodeForTView(tNode, tView) {
    assertTNode(tNode);
    const tData = tView.data;
    for (let i = HEADER_OFFSET; i < tData.length; i++) {
        if (tData[i] === tNode) {
            return;
        }
    }
    throwError('This TNode does not belong to this TView.');
}
function assertTNode(tNode) {
    assertDefined(tNode, 'TNode must be defined');
    if (!(tNode && typeof tNode === 'object' && tNode.hasOwnProperty('directiveStylingLast'))) {
        throwError('Not of type TNode, got: ' + tNode);
    }
}
function assertTIcu(tIcu) {
    assertDefined(tIcu, 'Expected TIcu to be defined');
    if (!(typeof tIcu.currentCaseLViewIndex === 'number')) {
        throwError('Object is not of TIcu type.');
    }
}
function assertComponentType(actual, msg = "Type passed in is not ComponentType, it does not have 'ɵcmp' property.") {
    if (!getComponentDef(actual)) {
        throwError(msg);
    }
}
function assertNgModuleType(actual, msg = "Type passed in is not NgModuleType, it does not have 'ɵmod' property.") {
    if (!getNgModuleDef(actual)) {
        throwError(msg);
    }
}
function assertHasParent(tNode) {
    assertDefined(tNode, 'currentTNode should exist!');
    assertDefined(tNode.parent, 'currentTNode should have a parent');
}
function assertLContainer(value) {
    assertDefined(value, 'LContainer must be defined');
    assertEqual(isLContainer(value), true, 'Expecting LContainer');
}
function assertLViewOrUndefined(value) {
    value && assertEqual(isLView(value), true, 'Expecting LView or undefined or null');
}
function assertLView(value) {
    assertDefined(value, 'LView must be defined');
    assertEqual(isLView(value), true, 'Expecting LView');
}
function assertFirstCreatePass(tView, errMessage) {
    assertEqual(tView.firstCreatePass, true, errMessage || 'Should only be called in first create pass.');
}
function assertFirstUpdatePass(tView, errMessage) {
    assertEqual(tView.firstUpdatePass, true, 'Should only be called in first update pass.');
}
/**
 * This is a basic sanity check that an object is probably a directive def. DirectiveDef is
 * an interface, so we can't do a direct instanceof check.
 */
function assertDirectiveDef(obj) {
    if (obj.type === undefined || obj.selectors == undefined || obj.inputs === undefined) {
        throwError(`Expected a DirectiveDef/ComponentDef and this object does not seem to have the expected shape.`);
    }
}
function assertIndexInDeclRange(tView, index) {
    assertBetween(HEADER_OFFSET, tView.bindingStartIndex, index);
}
function assertIndexInExpandoRange(lView, index) {
    const tView = lView[1];
    assertBetween(tView.expandoStartIndex, lView.length, index);
}
function assertBetween(lower, upper, index) {
    if (!(lower <= index && index < upper)) {
        throwError(`Index out of range (expecting ${lower} <= ${index} < ${upper})`);
    }
}
function assertProjectionSlots(lView, errMessage) {
    assertDefined(lView[DECLARATION_COMPONENT_VIEW], 'Component views should exist.');
    assertDefined(lView[DECLARATION_COMPONENT_VIEW][T_HOST].projection, 'Components with projection nodes (<ng-content>) must have projection slots defined.');
}
function assertParentView(lView, errMessage) {
    assertDefined(lView, "Component views should always have a parent view (component's host view)");
}
/**
 * This is a basic sanity check that the `injectorIndex` seems to point to what looks like a
 * NodeInjector data structure.
 *
 * @param lView `LView` which should be checked.
 * @param injectorIndex index into the `LView` where the `NodeInjector` is expected.
 */
function assertNodeInjector(lView, injectorIndex) {
    assertIndexInExpandoRange(lView, injectorIndex);
    assertIndexInExpandoRange(lView, injectorIndex + 8 /* NodeInjectorOffset.PARENT */);
    assertNumber(lView[injectorIndex + 0], 'injectorIndex should point to a bloom filter');
    assertNumber(lView[injectorIndex + 1], 'injectorIndex should point to a bloom filter');
    assertNumber(lView[injectorIndex + 2], 'injectorIndex should point to a bloom filter');
    assertNumber(lView[injectorIndex + 3], 'injectorIndex should point to a bloom filter');
    assertNumber(lView[injectorIndex + 4], 'injectorIndex should point to a bloom filter');
    assertNumber(lView[injectorIndex + 5], 'injectorIndex should point to a bloom filter');
    assertNumber(lView[injectorIndex + 6], 'injectorIndex should point to a bloom filter');
    assertNumber(lView[injectorIndex + 7], 'injectorIndex should point to a bloom filter');
    assertNumber(lView[injectorIndex + 8 /* NodeInjectorOffset.PARENT */], 'injectorIndex should point to parent injector');
}

/**
 * Represents a basic change from a previous to a new value for a single
 * property on a directive instance. Passed as a value in a
 * {@link SimpleChanges} object to the `ngOnChanges` hook.
 *
 * @see {@link OnChanges}
 *
 * @publicApi
 */
class SimpleChange {
    previousValue;
    currentValue;
    firstChange;
    constructor(previousValue, currentValue, firstChange) {
        this.previousValue = previousValue;
        this.currentValue = currentValue;
        this.firstChange = firstChange;
    }
    /**
     * Check whether the new value is the first value assigned.
     */
    isFirstChange() {
        return this.firstChange;
    }
}

function applyValueToInputField(instance, inputSignalNode, privateName, value) {
    if (inputSignalNode !== null) {
        inputSignalNode.applyValueToInputSignal(inputSignalNode, value);
    }
    else {
        instance[privateName] = value;
    }
}

/**
 * The NgOnChangesFeature decorates a component with support for the ngOnChanges
 * lifecycle hook, so it should be included in any component that implements
 * that hook.
 *
 * If the component or directive uses inheritance, the NgOnChangesFeature MUST
 * be included as a feature AFTER {@link InheritDefinitionFeature}, otherwise
 * inherited properties will not be propagated to the ngOnChanges lifecycle
 * hook.
 *
 * Example usage:
 *
 * ```ts
 * static ɵcmp = defineComponent({
 *   ...
 *   inputs: {name: 'publicName'},
 *   features: [NgOnChangesFeature]
 * });
 * ```
 *
 * @codeGenApi
 */
const ɵɵNgOnChangesFeature = /* @__PURE__ */ (() => {
    const ɵɵNgOnChangesFeatureImpl = () => NgOnChangesFeatureImpl;
    // This option ensures that the ngOnChanges lifecycle hook will be inherited
    // from superclasses (in InheritDefinitionFeature).
    /** @nocollapse */
    ɵɵNgOnChangesFeatureImpl.ngInherit = true;
    return ɵɵNgOnChangesFeatureImpl;
})();
function NgOnChangesFeatureImpl(definition) {
    if (definition.type.prototype.ngOnChanges) {
        definition.setInput = ngOnChangesSetInput;
    }
    return rememberChangeHistoryAndInvokeOnChangesHook;
}
/**
 * This is a synthetic lifecycle hook which gets inserted into `TView.preOrderHooks` to simulate
 * `ngOnChanges`.
 *
 * The hook reads the `NgSimpleChangesStore` data from the component instance and if changes are
 * found it invokes `ngOnChanges` on the component instance.
 *
 * @param this Component instance. Because this function gets inserted into `TView.preOrderHooks`,
 *     it is guaranteed to be called with component instance.
 */
function rememberChangeHistoryAndInvokeOnChangesHook() {
    const simpleChangesStore = getSimpleChangesStore(this);
    const current = simpleChangesStore?.current;
    if (current) {
        const previous = simpleChangesStore.previous;
        if (previous === EMPTY_OBJ) {
            simpleChangesStore.previous = current;
        }
        else {
            // New changes are copied to the previous store, so that we don't lose history for inputs
            // which were not changed this time
            for (let key in current) {
                previous[key] = current[key];
            }
        }
        simpleChangesStore.current = null;
        this.ngOnChanges(current);
    }
}
function ngOnChangesSetInput(instance, inputSignalNode, value, publicName, privateName) {
    const declaredName = this.declaredInputs[publicName];
    ngDevMode && assertString(declaredName, 'Name of input in ngOnChanges has to be a string');
    const simpleChangesStore = getSimpleChangesStore(instance) ||
        setSimpleChangesStore(instance, { previous: EMPTY_OBJ, current: null });
    const current = simpleChangesStore.current || (simpleChangesStore.current = {});
    const previous = simpleChangesStore.previous;
    const previousChange = previous[declaredName];
    current[declaredName] = new SimpleChange(previousChange && previousChange.currentValue, value, previous === EMPTY_OBJ);
    applyValueToInputField(instance, inputSignalNode, privateName, value);
}
const SIMPLE_CHANGES_STORE = '__ngSimpleChanges__';
function getSimpleChangesStore(instance) {
    return instance[SIMPLE_CHANGES_STORE] || null;
}
function setSimpleChangesStore(instance, store) {
    return (instance[SIMPLE_CHANGES_STORE] = store);
}

let profilerCallback = null;
/**
 * Sets the callback function which will be invoked before and after performing certain actions at
 * runtime (for example, before and after running change detection).
 *
 * Warning: this function is *INTERNAL* and should not be relied upon in application's code.
 * The contract of the function might be changed in any release and/or the function can be removed
 * completely.
 *
 * @param profiler function provided by the caller or null value to disable profiling.
 */
const setProfiler = (profiler) => {
    profilerCallback = profiler;
};
/**
 * Profiler function which wraps user code executed by the runtime.
 *
 * @param event ProfilerEvent corresponding to the execution context
 * @param instance component instance
 * @param hookOrListener lifecycle hook function or output listener. The value depends on the
 *  execution context
 * @returns
 */
const profiler = function (event, instance = null, hookOrListener) {
    if (profilerCallback != null /* both `null` and `undefined` */) {
        profilerCallback(event, instance, hookOrListener);
    }
};

const SVG_NAMESPACE = 'svg';
const MATH_ML_NAMESPACE = 'math';

/**
 * For efficiency reasons we often put several different data types (`RNode`, `LView`, `LContainer`)
 * in same location in `LView`. This is because we don't want to pre-allocate space for it
 * because the storage is sparse. This file contains utilities for dealing with such data types.
 *
 * How do we know what is stored at a given location in `LView`.
 * - `Array.isArray(value) === false` => `RNode` (The normal storage value)
 * - `Array.isArray(value) === true` => then the `value[0]` represents the wrapped value.
 *   - `typeof value[TYPE] === 'object'` => `LView`
 *      - This happens when we have a component at a given location
 *   - `typeof value[TYPE] === true` => `LContainer`
 *      - This happens when we have `LContainer` binding at a given location.
 *
 *
 * NOTE: it is assumed that `Array.isArray` and `typeof` operations are very efficient.
 */
/**
 * Returns `RNode`.
 * @param value wrapped value of `RNode`, `LView`, `LContainer`
 */
function unwrapRNode(value) {
    while (Array.isArray(value)) {
        value = value[HOST];
    }
    return value;
}
/**
 * Returns `LView` or `null` if not found.
 * @param value wrapped value of `RNode`, `LView`, `LContainer`
 */
function unwrapLView(value) {
    while (Array.isArray(value)) {
        // This check is same as `isLView()` but we don't call at as we don't want to call
        // `Array.isArray()` twice and give JITer more work for inlining.
        if (typeof value[TYPE] === 'object')
            return value;
        value = value[HOST];
    }
    return null;
}
/**
 * Retrieves an element value from the provided `viewData`, by unwrapping
 * from any containers, component views, or style contexts.
 */
function getNativeByIndex(index, lView) {
    ngDevMode && assertIndexInRange(lView, index);
    ngDevMode && assertGreaterThanOrEqual(index, HEADER_OFFSET, 'Expected to be past HEADER_OFFSET');
    return unwrapRNode(lView[index]);
}
/**
 * Retrieve an `RNode` for a given `TNode` and `LView`.
 *
 * This function guarantees in dev mode to retrieve a non-null `RNode`.
 *
 * @param tNode
 * @param lView
 */
function getNativeByTNode(tNode, lView) {
    ngDevMode && assertTNodeForLView(tNode, lView);
    ngDevMode && assertIndexInRange(lView, tNode.index);
    const node = unwrapRNode(lView[tNode.index]);
    return node;
}
/**
 * Retrieve an `RNode` or `null` for a given `TNode` and `LView`.
 *
 * Some `TNode`s don't have associated `RNode`s. For example `Projection`
 *
 * @param tNode
 * @param lView
 */
function getNativeByTNodeOrNull(tNode, lView) {
    const index = tNode === null ? -1 : tNode.index;
    if (index !== -1) {
        ngDevMode && assertTNodeForLView(tNode, lView);
        const node = unwrapRNode(lView[index]);
        return node;
    }
    return null;
}
// fixme(misko): The return Type should be `TNode|null`
function getTNode(tView, index) {
    ngDevMode && assertGreaterThan(index, -1, 'wrong index for TNode');
    ngDevMode && assertLessThan(index, tView.data.length, 'wrong index for TNode');
    const tNode = tView.data[index];
    ngDevMode && tNode !== null && assertTNode(tNode);
    return tNode;
}
/** Retrieves a value from any `LView` or `TData`. */
function load(view, index) {
    ngDevMode && assertIndexInRange(view, index);
    return view[index];
}
/** Store a value in the `data` at a given `index`. */
function store(tView, lView, index, value) {
    // We don't store any static data for local variables, so the first time
    // we see the template, we should store as null to avoid a sparse array
    if (index >= tView.data.length) {
        tView.data[index] = null;
        tView.blueprint[index] = null;
    }
    lView[index] = value;
}
function getComponentLViewByIndex(nodeIndex, hostView) {
    // Could be an LView or an LContainer. If LContainer, unwrap to find LView.
    ngDevMode && assertIndexInRange(hostView, nodeIndex);
    const slotValue = hostView[nodeIndex];
    const lView = isLView(slotValue) ? slotValue : slotValue[HOST];
    return lView;
}
/** Checks whether a given view is in creation mode */
function isCreationMode(view) {
    return (view[FLAGS] & 4 /* LViewFlags.CreationMode */) === 4 /* LViewFlags.CreationMode */;
}
/**
 * Returns a boolean for whether the view is attached to the change detection tree.
 *
 * Note: This determines whether a view should be checked, not whether it's inserted
 * into a container. For that, you'll want `viewAttachedToContainer` below.
 */
function viewAttachedToChangeDetector(view) {
    return (view[FLAGS] & 128 /* LViewFlags.Attached */) === 128 /* LViewFlags.Attached */;
}
/** Returns a boolean for whether the view is attached to a container. */
function viewAttachedToContainer(view) {
    return isLContainer(view[PARENT]);
}
function getConstant(consts, index) {
    if (index === null || index === undefined)
        return null;
    ngDevMode && assertIndexInRange(consts, index);
    return consts[index];
}
/**
 * Resets the pre-order hook flags of the view.
 * @param lView the LView on which the flags are reset
 */
function resetPreOrderHookFlags(lView) {
    lView[PREORDER_HOOK_FLAGS] = 0;
}
/**
 * Adds the `RefreshView` flag from the lView and updates HAS_CHILD_VIEWS_TO_REFRESH flag of
 * parents.
 */
function    markViewForRefresh(lView) {
    if (lView[FLAGS] & 1024 /* LViewFlags.RefreshView */) {
        return;
    }
    lView[FLAGS] |= 1024 /* LViewFlags.RefreshView */;
    if (viewAttachedToChangeDetector(lView)) {
        markAncestorsForTraversal(lView);
    }
}
/**
 * Walks up the LView hierarchy.
 * @param nestingLevel Number of times to walk up in hierarchy.
 * @param currentView View from which to start the lookup.
 */
function walkUpViews(nestingLevel, currentView) {
    while (nestingLevel > 0) {
        ngDevMode &&
            assertDefined(currentView[DECLARATION_VIEW], 'Declaration view should be defined if nesting level is greater than 0.');
        currentView = currentView[DECLARATION_VIEW];
        nestingLevel--;
    }
    return currentView;
}
function requiresRefreshOrTraversal(lView) {
    return !!(lView[FLAGS] & (1024 /* LViewFlags.RefreshView */ | 8192 /* LViewFlags.HasChildViewsToRefresh */) ||
        lView[REACTIVE_TEMPLATE_CONSUMER]?.dirty);
}
/**
 * Updates the `HasChildViewsToRefresh` flag on the parents of the `LView` as well as the
 * parents above.
 */
function updateAncestorTraversalFlagsOnAttach(lView) {
    lView[ENVIRONMENT].changeDetectionScheduler?.notify(8 /* NotificationSource.ViewAttached */);
    if (lView[FLAGS] & 64 /* LViewFlags.Dirty */) {
        lView[FLAGS] |= 1024 /* LViewFlags.RefreshView */;
    }
    if (requiresRefreshOrTraversal(lView)) {
        markAncestorsForTraversal(lView);
    }
}
/**
 * Ensures views above the given `lView` are traversed during change detection even when they are
 * not dirty.
 *
 * This is done by setting the `HAS_CHILD_VIEWS_TO_REFRESH` flag up to the root, stopping when the
 * flag is already `true` or the `lView` is detached.
 */
function markAncestorsForTraversal(lView) {
    lView[ENVIRONMENT].changeDetectionScheduler?.notify(0 /* NotificationSource.MarkAncestorsForTraversal */);
    let parent = getLViewParent(lView);
    while (parent !== null) {
        // We stop adding markers to the ancestors once we reach one that already has the marker. This
        // is to avoid needlessly traversing all the way to the root when the marker already exists.
        if (parent[FLAGS] & 8192 /* LViewFlags.HasChildViewsToRefresh */) {
            break;
        }
        parent[FLAGS] |= 8192 /* LViewFlags.HasChildViewsToRefresh */;
        if (!viewAttachedToChangeDetector(parent)) {
            break;
        }
        parent = getLViewParent(parent);
    }
}
/**
 * Stores a LView-specific destroy callback.
 */
function storeLViewOnDestroy(lView, onDestroyCallback) {
    if (isDestroyed(lView)) {
        throw new RuntimeError(911 /* RuntimeErrorCode.VIEW_ALREADY_DESTROYED */, ngDevMode && 'View has already been destroyed.');
    }
    if (lView[ON_DESTROY_HOOKS] === null) {
        lView[ON_DESTROY_HOOKS] = [];
    }
    lView[ON_DESTROY_HOOKS].push(onDestroyCallback);
}
/**
 * Removes previously registered LView-specific destroy callback.
 */
function removeLViewOnDestroy(lView, onDestroyCallback) {
    if (lView[ON_DESTROY_HOOKS] === null)
        return;
    const destroyCBIdx = lView[ON_DESTROY_HOOKS].indexOf(onDestroyCallback);
    if (destroyCBIdx !== -1) {
        lView[ON_DESTROY_HOOKS].splice(destroyCBIdx, 1);
    }
}
/**
 * Gets the parent LView of the passed LView, if the PARENT is an LContainer, will get the parent of
 * that LContainer, which is an LView
 * @param lView the lView whose parent to get
 */
function getLViewParent(lView) {
    ngDevMode && assertLView(lView);
    const parent = lView[PARENT];
    return isLContainer(parent) ? parent[PARENT] : parent;
}
function getOrCreateLViewCleanup(view) {
    // top level variables should not be exported for performance reasons (PERF_NOTES.md)
    return (view[CLEANUP] ??= []);
}
function getOrCreateTViewCleanup(tView) {
    return (tView.cleanup ??= []);
}
/**
 * Saves context for this cleanup function in LView.cleanupInstances.
 *
 * On the first template pass, saves in TView:
 * - Cleanup function
 * - Index of context we just saved in LView.cleanupInstances
 */
function storeCleanupWithContext(tView, lView, context, cleanupFn) {
    const lCleanup = getOrCreateLViewCleanup(lView);
    // Historically the `storeCleanupWithContext` was used to register both framework-level and
    // user-defined cleanup callbacks, but over time those two types of cleanups were separated.
    // This dev mode checks assures that user-level cleanup callbacks are _not_ stored in data
    // structures reserved for framework-specific hooks.
    ngDevMode &&
        assertDefined(context, 'Cleanup context is mandatory when registering framework-level destroy hooks');
    lCleanup.push(context);
    if (tView.firstCreatePass) {
        getOrCreateTViewCleanup(tView).push(cleanupFn, lCleanup.length - 1);
    }
    else {
        // Make sure that no new framework-level cleanup functions are registered after the first
        // template pass is done (and TView data structures are meant to fully constructed).
        if (ngDevMode) {
            Object.freeze(getOrCreateTViewCleanup(tView));
        }
    }
}

const instructionState = {
    lFrame: createLFrame(null),
    bindingsEnabled: true,
    skipHydrationRootTNode: null,
};
var CheckNoChangesMode;
(function (CheckNoChangesMode) {
    CheckNoChangesMode[CheckNoChangesMode["Off"] = 0] = "Off";
    CheckNoChangesMode[CheckNoChangesMode["Exhaustive"] = 1] = "Exhaustive";
    CheckNoChangesMode[CheckNoChangesMode["OnlyDirtyViews"] = 2] = "OnlyDirtyViews";
})(CheckNoChangesMode || (CheckNoChangesMode = {}));
/**
 * In this mode, any changes in bindings will throw an ExpressionChangedAfterChecked error.
 *
 * Necessary to support ChangeDetectorRef.checkNoChanges().
 *
 * The `checkNoChanges` function is invoked only in ngDevMode=true and verifies that no unintended
 * changes exist in the change detector or its children.
 */
let _checkNoChangesMode = 0; /* CheckNoChangesMode.Off */
/**
 * Flag used to indicate that we are in the middle running change detection on a view
 *
 * @see detectChangesInViewWhileDirty
 */
let _isRefreshingViews = false;
function getElementDepthCount() {
    return instructionState.lFrame.elementDepthCount;
}
function increaseElementDepthCount() {
    instructionState.lFrame.elementDepthCount++;
}
function decreaseElementDepthCount() {
    instructionState.lFrame.elementDepthCount--;
}
function getBindingsEnabled() {
    return instructionState.bindingsEnabled;
}
/**
 * Returns true if currently inside a skip hydration block.
 * @returns boolean
 */
function isInSkipHydrationBlock$1() {
    return instructionState.skipHydrationRootTNode !== null;
}
/**
 * Returns true if this is the root TNode of the skip hydration block.
 * @param tNode the current TNode
 * @returns boolean
 */
function isSkipHydrationRootTNode(tNode) {
    return instructionState.skipHydrationRootTNode === tNode;
}
/**
 * Enables directive matching on elements.
 *
 *  * Example:
 * ```html
 * <my-comp my-directive>
 *   Should match component / directive.
 * </my-comp>
 * <div ngNonBindable>
 *   <!-- ɵɵdisableBindings() -->
 *   <my-comp my-directive>
 *     Should not match component / directive because we are in ngNonBindable.
 *   </my-comp>
 *   <!-- ɵɵenableBindings() -->
 * </div>
 * ```
 *
 * @codeGenApi
 */
function ɵɵenableBindings() {
    instructionState.bindingsEnabled = true;
}
/**
 * Sets a flag to specify that the TNode is in a skip hydration block.
 * @param tNode the current TNode
 */
function enterSkipHydrationBlock(tNode) {
    instructionState.skipHydrationRootTNode = tNode;
}
/**
 * Disables directive matching on element.
 *
 *  * Example:
 * ```html
 * <my-comp my-directive>
 *   Should match component / directive.
 * </my-comp>
 * <div ngNonBindable>
 *   <!-- ɵɵdisableBindings() -->
 *   <my-comp my-directive>
 *     Should not match component / directive because we are in ngNonBindable.
 *   </my-comp>
 *   <!-- ɵɵenableBindings() -->
 * </div>
 * ```
 *
 * @codeGenApi
 */
function ɵɵdisableBindings() {
    instructionState.bindingsEnabled = false;
}
/**
 * Clears the root skip hydration node when leaving a skip hydration block.
 */
function leaveSkipHydrationBlock() {
    instructionState.skipHydrationRootTNode = null;
}
/**
 * Return the current `LView`.
 */
function getLView() {
    return instructionState.lFrame.lView;
}
/**
 * Return the current `TView`.
 */
function getTView() {
    return instructionState.lFrame.tView;
}
/**
 * Restores `contextViewData` to the given OpaqueViewState instance.
 *
 * Used in conjunction with the getCurrentView() instruction to save a snapshot
 * of the current view and restore it when listeners are invoked. This allows
 * walking the declaration view tree in listeners to get vars from parent views.
 *
 * @param viewToRestore The OpaqueViewState instance to restore.
 * @returns Context of the restored OpaqueViewState instance.
 *
 * @codeGenApi
 */
function ɵɵrestoreView(viewToRestore) {
    instructionState.lFrame.contextLView = viewToRestore;
    return viewToRestore[CONTEXT];
}
/**
 * Clears the view set in `ɵɵrestoreView` from memory. Returns the passed in
 * value so that it can be used as a return value of an instruction.
 *
 * @codeGenApi
 */
function ɵɵresetView(value) {
    instructionState.lFrame.contextLView = null;
    return value;
}
function getCurrentTNode() {
    let currentTNode = getCurrentTNodePlaceholderOk();
    while (currentTNode !== null && currentTNode.type === 64 /* TNodeType.Placeholder */) {
        currentTNode = currentTNode.parent;
    }
    return currentTNode;
}
function getCurrentTNodePlaceholderOk() {
    return instructionState.lFrame.currentTNode;
}
function getCurrentParentTNode() {
    const lFrame = instructionState.lFrame;
    const currentTNode = lFrame.currentTNode;
    return lFrame.isParent ? currentTNode : currentTNode.parent;
}
function setCurrentTNode(tNode, isParent) {
    ngDevMode && tNode && assertTNodeForTView(tNode, instructionState.lFrame.tView);
    const lFrame = instructionState.lFrame;
    lFrame.currentTNode = tNode;
    lFrame.isParent = isParent;
}
function isCurrentTNodeParent() {
    return instructionState.lFrame.isParent;
}
function setCurrentTNodeAsNotParent() {
    instructionState.lFrame.isParent = false;
}
function getContextLView() {
    const contextLView = instructionState.lFrame.contextLView;
    ngDevMode && assertDefined(contextLView, 'contextLView must be defined.');
    return contextLView;
}
function isInCheckNoChangesMode() {
    !ngDevMode && throwError('Must never be called in production mode');
    return _checkNoChangesMode !== CheckNoChangesMode.Off;
}
function isExhaustiveCheckNoChanges() {
    !ngDevMode && throwError('Must never be called in production mode');
    return _checkNoChangesMode === CheckNoChangesMode.Exhaustive;
}
function setIsInCheckNoChangesMode(mode) {
    !ngDevMode && throwError('Must never be called in production mode');
    _checkNoChangesMode = mode;
}
function isRefreshingViews() {
    return _isRefreshingViews;
}
function setIsRefreshingViews(mode) {
    const prev = _isRefreshingViews;
    _isRefreshingViews = mode;
    return prev;
}
// top level variables should not be exported for performance reasons (PERF_NOTES.md)
function getBindingRoot() {
    const lFrame = instructionState.lFrame;
    let index = lFrame.bindingRootIndex;
    if (index === -1) {
        index = lFrame.bindingRootIndex = lFrame.tView.bindingStartIndex;
    }
    return index;
}
function getBindingIndex() {
    return instructionState.lFrame.bindingIndex;
}
function setBindingIndex(value) {
    return (instructionState.lFrame.bindingIndex = value);
}
function nextBindingIndex() {
    return instructionState.lFrame.bindingIndex++;
}
function incrementBindingIndex(count) {
    const lFrame = instructionState.lFrame;
    const index = lFrame.bindingIndex;
    lFrame.bindingIndex = lFrame.bindingIndex + count;
    return index;
}
function isInI18nBlock() {
    return instructionState.lFrame.inI18n;
}
function setInI18nBlock(isInI18nBlock) {
    instructionState.lFrame.inI18n = isInI18nBlock;
}
/**
 * Set a new binding root index so that host template functions can execute.
 *
 * Bindings inside the host template are 0 index. But because we don't know ahead of time
 * how many host bindings we have we can't pre-compute them. For this reason they are all
 * 0 index and we just shift the root so that they match next available location in the LView.
 *
 * @param bindingRootIndex Root index for `hostBindings`
 * @param currentDirectiveIndex `TData[currentDirectiveIndex]` will point to the current directive
 *        whose `hostBindings` are being processed.
 */
function setBindingRootForHostBindings(bindingRootIndex, currentDirectiveIndex) {
    const lFrame = instructionState.lFrame;
    lFrame.bindingIndex = lFrame.bindingRootIndex = bindingRootIndex;
    setCurrentDirectiveIndex(currentDirectiveIndex);
}
/**
 * When host binding is executing this points to the directive index.
 * `TView.data[getCurrentDirectiveIndex()]` is `DirectiveDef`
 * `LView[getCurrentDirectiveIndex()]` is directive instance.
 */
function getCurrentDirectiveIndex() {
    return instructionState.lFrame.currentDirectiveIndex;
}
/**
 * Sets an index of a directive whose `hostBindings` are being processed.
 *
 * @param currentDirectiveIndex `TData` index where current directive instance can be found.
 */
function setCurrentDirectiveIndex(currentDirectiveIndex) {
    instructionState.lFrame.currentDirectiveIndex = currentDirectiveIndex;
}
/**
 * Retrieve the current `DirectiveDef` which is active when `hostBindings` instruction is being
 * executed.
 *
 * @param tData Current `TData` where the `DirectiveDef` will be looked up at.
 */
function getCurrentDirectiveDef(tData) {
    const currentDirectiveIndex = instructionState.lFrame.currentDirectiveIndex;
    return currentDirectiveIndex === -1 ? null : tData[currentDirectiveIndex];
}
function getCurrentQueryIndex() {
    return instructionState.lFrame.currentQueryIndex;
}
function setCurrentQueryIndex(value) {
    instructionState.lFrame.currentQueryIndex = value;
}
/**
 * Returns a `TNode` of the location where the current `LView` is declared at.
 *
 * @param lView an `LView` that we want to find parent `TNode` for.
 */
function getDeclarationTNode(lView) {
    const tView = lView[TVIEW];
    // Return the declaration parent for embedded views
    if (tView.type === 2 /* TViewType.Embedded */) {
        ngDevMode && assertDefined(tView.declTNode, 'Embedded TNodes should have declaration parents.');
        return tView.declTNode;
    }
    // Components don't have `TView.declTNode` because each instance of component could be
    // inserted in different location, hence `TView.declTNode` is meaningless.
    // Falling back to `T_HOST` in case we cross component boundary.
    if (tView.type === 1 /* TViewType.Component */) {
        return lView[T_HOST];
    }
    // Remaining TNode type is `TViewType.Root` which doesn't have a parent TNode.
    return null;
}
/**
 * This is a light weight version of the `enterView` which is needed by the DI system.
 *
 * @param lView `LView` location of the DI context.
 * @param tNode `TNode` for DI context
 * @param flags DI context flags. if `SkipSelf` flag is set than we walk up the declaration
 *     tree from `tNode`  until we find parent declared `TElementNode`.
 * @returns `true` if we have successfully entered DI associated with `tNode` (or with declared
 *     `TNode` if `flags` has  `SkipSelf`). Failing to enter DI implies that no associated
 *     `NodeInjector` can be found and we should instead use `ModuleInjector`.
 *     - If `true` than this call must be fallowed by `leaveDI`
 *     - If `false` than this call failed and we should NOT call `leaveDI`
 */
function enterDI(lView, tNode, flags) {
    ngDevMode && assertLViewOrUndefined(lView);
    if (flags & InjectFlags.SkipSelf) {
        ngDevMode && assertTNodeForTView(tNode, lView[TVIEW]);
        let parentTNode = tNode;
        let parentLView = lView;
        while (true) {
            ngDevMode && assertDefined(parentTNode, 'Parent TNode should be defined');
            parentTNode = parentTNode.parent;
            if (parentTNode === null && !(flags & InjectFlags.Host)) {
                parentTNode = getDeclarationTNode(parentLView);
                if (parentTNode === null)
                    break;
                // In this case, a parent exists and is definitely an element. So it will definitely
                // have an existing lView as the declaration view, which is why we can assume it's defined.
                ngDevMode && assertDefined(parentLView, 'Parent LView should be defined');
                parentLView = parentLView[DECLARATION_VIEW];
                // In Ivy there are Comment nodes that correspond to ngIf and NgFor embedded directives
                // We want to skip those and look only at Elements and ElementContainers to ensure
                // we're looking at true parent nodes, and not content or other types.
                if (parentTNode.type & (2 /* TNodeType.Element */ | 8 /* TNodeType.ElementContainer */)) {
                    break;
                }
            }
            else {
                break;
            }
        }
        if (parentTNode === null) {
            // If we failed to find a parent TNode this means that we should use module injector.
            return false;
        }
        else {
            tNode = parentTNode;
            lView = parentLView;
        }
    }
    ngDevMode && assertTNodeForLView(tNode, lView);
    const lFrame = (instructionState.lFrame = allocLFrame());
    lFrame.currentTNode = tNode;
    lFrame.lView = lView;
    return true;
}
/**
 * Swap the current lView with a new lView.
 *
 * For performance reasons we store the lView in the top level of the module.
 * This way we minimize the number of properties to read. Whenever a new view
 * is entered we have to store the lView for later, and when the view is
 * exited the state has to be restored
 *
 * @param newView New lView to become active
 * @returns the previously active lView;
 */
function enterView(newView) {
    ngDevMode && assertNotEqual(newView[0], newView[1], '????');
    ngDevMode && assertLViewOrUndefined(newView);
    const newLFrame = allocLFrame();
    if (ngDevMode) {
        assertEqual(newLFrame.isParent, true, 'Expected clean LFrame');
        assertEqual(newLFrame.lView, null, 'Expected clean LFrame');
        assertEqual(newLFrame.tView, null, 'Expected clean LFrame');
        assertEqual(newLFrame.selectedIndex, -1, 'Expected clean LFrame');
        assertEqual(newLFrame.elementDepthCount, 0, 'Expected clean LFrame');
        assertEqual(newLFrame.currentDirectiveIndex, -1, 'Expected clean LFrame');
        assertEqual(newLFrame.currentNamespace, null, 'Expected clean LFrame');
        assertEqual(newLFrame.bindingRootIndex, -1, 'Expected clean LFrame');
        assertEqual(newLFrame.currentQueryIndex, 0, 'Expected clean LFrame');
    }
    const tView = newView[TVIEW];
    instructionState.lFrame = newLFrame;
    ngDevMode && tView.firstChild && assertTNodeForTView(tView.firstChild, tView);
    newLFrame.currentTNode = tView.firstChild;
    newLFrame.lView = newView;
    newLFrame.tView = tView;
    newLFrame.contextLView = newView;
    newLFrame.bindingIndex = tView.bindingStartIndex;
    newLFrame.inI18n = false;
}
/**
 * Allocates next free LFrame. This function tries to reuse the `LFrame`s to lower memory pressure.
 */
function allocLFrame() {
    const currentLFrame = instructionState.lFrame;
    const childLFrame = currentLFrame === null ? null : currentLFrame.child;
    const newLFrame = childLFrame === null ? createLFrame(currentLFrame) : childLFrame;
    return newLFrame;
}
function createLFrame(parent) {
    const lFrame = {
        currentTNode: null,
        isParent: true,
        lView: null,
        tView: null,
        selectedIndex: -1,
        contextLView: null,
        elementDepthCount: 0,
        currentNamespace: null,
        currentDirectiveIndex: -1,
        bindingRootIndex: -1,
        bindingIndex: -1,
        currentQueryIndex: 0,
        parent: parent,
        child: null,
        inI18n: false,
    };
    parent !== null && (parent.child = lFrame); // link the new LFrame for reuse.
    return lFrame;
}
/**
 * A lightweight version of leave which is used with DI.
 *
 * This function only resets `currentTNode` and `LView` as those are the only properties
 * used with DI (`enterDI()`).
 *
 * NOTE: This function is reexported as `leaveDI`. However `leaveDI` has return type of `void` where
 * as `leaveViewLight` has `LFrame`. This is so that `leaveViewLight` can be used in `leaveView`.
 */
function leaveViewLight() {
    const oldLFrame = instructionState.lFrame;
    instructionState.lFrame = oldLFrame.parent;
    oldLFrame.currentTNode = null;
    oldLFrame.lView = null;
    return oldLFrame;
}
/**
 * This is a lightweight version of the `leaveView` which is needed by the DI system.
 *
 * NOTE: this function is an alias so that we can change the type of the function to have `void`
 * return type.
 */
const leaveDI = leaveViewLight;
/**
 * Leave the current `LView`
 *
 * This pops the `LFrame` with the associated `LView` from the stack.
 *
 * IMPORTANT: We must zero out the `LFrame` values here otherwise they will be retained. This is
 * because for performance reasons we don't release `LFrame` but rather keep it for next use.
 */
function leaveView() {
    const oldLFrame = leaveViewLight();
    oldLFrame.isParent = true;
    oldLFrame.tView = null;
    oldLFrame.selectedIndex = -1;
    oldLFrame.contextLView = null;
    oldLFrame.elementDepthCount = 0;
    oldLFrame.currentDirectiveIndex = -1;
    oldLFrame.currentNamespace = null;
    oldLFrame.bindingRootIndex = -1;
    oldLFrame.bindingIndex = -1;
    oldLFrame.currentQueryIndex = 0;
}
function nextContextImpl(level) {
    const contextLView = (instructionState.lFrame.contextLView = walkUpViews(level, instructionState.lFrame.contextLView));
    return contextLView[CONTEXT];
}
/**
 * Gets the currently selected element index.
 *
 * Used with {@link property} instruction (and more in the future) to identify the index in the
 * current `LView` to act on.
 */
function getSelectedIndex() {
    return instructionState.lFrame.selectedIndex;
}
/**
 * Sets the most recent index passed to {@link select}
 *
 * Used with {@link property} instruction (and more in the future) to identify the index in the
 * current `LView` to act on.
 *
 * (Note that if an "exit function" was set earlier (via `setElementExitFn()`) then that will be
 * run if and when the provided `index` value is different from the current selected index value.)
 */
function setSelectedIndex(index) {
    ngDevMode &&
        index !== -1 &&
        assertGreaterThanOrEqual(index, HEADER_OFFSET, 'Index must be past HEADER_OFFSET (or -1).');
    ngDevMode &&
        assertLessThan(index, instructionState.lFrame.lView.length, "Can't set index passed end of LView");
    instructionState.lFrame.selectedIndex = index;
}
/**
 * Gets the `tNode` that represents currently selected element.
 */
function getSelectedTNode() {
    const lFrame = instructionState.lFrame;
    return getTNode(lFrame.tView, lFrame.selectedIndex);
}
/**
 * Sets the namespace used to create elements to `'http://www.w3.org/2000/svg'` in global state.
 *
 * @codeGenApi
 */
function ɵɵnamespaceSVG() {
    instructionState.lFrame.currentNamespace = SVG_NAMESPACE;
}
/**
 * Sets the namespace used to create elements to `'http://www.w3.org/1998/MathML/'` in global state.
 *
 * @codeGenApi
 */
function ɵɵnamespaceMathML() {
    instructionState.lFrame.currentNamespace = MATH_ML_NAMESPACE;
}
/**
 * Sets the namespace used to create elements to `null`, which forces element creation to use
 * `createElement` rather than `createElementNS`.
 *
 * @codeGenApi
 */
function ɵɵnamespaceHTML() {
    namespaceHTMLInternal();
}
/**
 * Sets the namespace used to create elements to `null`, which forces element creation to use
 * `createElement` rather than `createElementNS`.
 */
function namespaceHTMLInternal() {
    instructionState.lFrame.currentNamespace = null;
}
function getNamespace() {
    return instructionState.lFrame.currentNamespace;
}
let _wasLastNodeCreated = true;
/**
 * Retrieves a global flag that indicates whether the most recent DOM node
 * was created or hydrated.
 */
function wasLastNodeCreated() {
    return _wasLastNodeCreated;
}
/**
 * Sets a global flag to indicate whether the most recent DOM node
 * was created or hydrated.
 */
function lastNodeWasCreated(flag) {
    _wasLastNodeCreated = flag;
}

/**
 * Adds all directive lifecycle hooks from the given `DirectiveDef` to the given `TView`.
 *
 * Must be run *only* on the first template pass.
 *
 * Sets up the pre-order hooks on the provided `tView`,
 * see {@link HookData} for details about the data structure.
 *
 * @param directiveIndex The index of the directive in LView
 * @param directiveDef The definition containing the hooks to setup in tView
 * @param tView The current TView
 */
function registerPreOrderHooks(directiveIndex, directiveDef, tView) {
    ngDevMode && assertFirstCreatePass(tView);
    const { ngOnChanges, ngOnInit, ngDoCheck } = directiveDef.type.prototype;
    if (ngOnChanges) {
        const wrappedOnChanges = NgOnChangesFeatureImpl(directiveDef);
        (tView.preOrderHooks ??= []).push(directiveIndex, wrappedOnChanges);
        (tView.preOrderCheckHooks ??= []).push(directiveIndex, wrappedOnChanges);
    }
    if (ngOnInit) {
        (tView.preOrderHooks ??= []).push(0 - directiveIndex, ngOnInit);
    }
    if (ngDoCheck) {
        (tView.preOrderHooks ??= []).push(directiveIndex, ngDoCheck);
        (tView.preOrderCheckHooks ??= []).push(directiveIndex, ngDoCheck);
    }
}
/**
 *
 * Loops through the directives on the provided `tNode` and queues hooks to be
 * run that are not initialization hooks.
 *
 * Should be executed during `elementEnd()` and similar to
 * preserve hook execution order. Content, view, and destroy hooks for projected
 * components and directives must be called *before* their hosts.
 *
 * Sets up the content, view, and destroy hooks on the provided `tView`,
 * see {@link HookData} for details about the data structure.
 *
 * NOTE: This does not set up `onChanges`, `onInit` or `doCheck`, those are set up
 * separately at `elementStart`.
 *
 * @param tView The current TView
 * @param tNode The TNode whose directives are to be searched for hooks to queue
 */
function registerPostOrderHooks(tView, tNode) {
    ngDevMode && assertFirstCreatePass(tView);
    // It's necessary to loop through the directives at elementEnd() (rather than processing in
    // directiveCreate) so we can preserve the current hook order. Content, view, and destroy
    // hooks for projected components and directives must be called *before* their hosts.
    for (let i = tNode.directiveStart, end = tNode.directiveEnd; i < end; i++) {
        const directiveDef = tView.data[i];
        ngDevMode && assertDefined(directiveDef, 'Expecting DirectiveDef');
        const lifecycleHooks = directiveDef.type.prototype;
        const { ngAfterContentInit, ngAfterContentChecked, ngAfterViewInit, ngAfterViewChecked, ngOnDestroy, } = lifecycleHooks;
        if (ngAfterContentInit) {
            (tView.contentHooks ??= []).push(-i, ngAfterContentInit);
        }
        if (ngAfterContentChecked) {
            (tView.contentHooks ??= []).push(i, ngAfterContentChecked);
            (tView.contentCheckHooks ??= []).push(i, ngAfterContentChecked);
        }
        if (ngAfterViewInit) {
            (tView.viewHooks ??= []).push(-i, ngAfterViewInit);
        }
        if (ngAfterViewChecked) {
            (tView.viewHooks ??= []).push(i, ngAfterViewChecked);
            (tView.viewCheckHooks ??= []).push(i, ngAfterViewChecked);
        }
        if (ngOnDestroy != null) {
            (tView.destroyHooks ??= []).push(i, ngOnDestroy);
        }
    }
}
/**
 * Executing hooks requires complex logic as we need to deal with 2 constraints.
 *
 * 1. Init hooks (ngOnInit, ngAfterContentInit, ngAfterViewInit) must all be executed once and only
 * once, across many change detection cycles. This must be true even if some hooks throw, or if
 * some recursively trigger a change detection cycle.
 * To solve that, it is required to track the state of the execution of these init hooks.
 * This is done by storing and maintaining flags in the view: the {@link InitPhaseState},
 * and the index within that phase. They can be seen as a cursor in the following structure:
 * [[onInit1, onInit2], [afterContentInit1], [afterViewInit1, afterViewInit2, afterViewInit3]]
 * They are stored as flags in LView[FLAGS].
 *
 * 2. Pre-order hooks can be executed in batches, because of the select instruction.
 * To be able to pause and resume their execution, we also need some state about the hook's array
 * that is being processed:
 * - the index of the next hook to be executed
 * - the number of init hooks already found in the processed part of the  array
 * They are stored as flags in LView[PREORDER_HOOK_FLAGS].
 */
/**
 * Executes pre-order check hooks ( OnChanges, DoChanges) given a view where all the init hooks were
 * executed once. This is a light version of executeInitAndCheckPreOrderHooks where we can skip read
 * / write of the init-hooks related flags.
 * @param lView The LView where hooks are defined
 * @param hooks Hooks to be run
 * @param nodeIndex 3 cases depending on the value:
 * - undefined: all hooks from the array should be executed (post-order case)
 * - null: execute hooks only from the saved index until the end of the array (pre-order case, when
 * flushing the remaining hooks)
 * - number: execute hooks only from the saved index until that node index exclusive (pre-order
 * case, when executing select(number))
 */
function executeCheckHooks(lView, hooks, nodeIndex) {
    callHooks(lView, hooks, 3 /* InitPhaseState.InitPhaseCompleted */, nodeIndex);
}
/**
 * Executes post-order init and check hooks (one of AfterContentInit, AfterContentChecked,
 * AfterViewInit, AfterViewChecked) given a view where there are pending init hooks to be executed.
 * @param lView The LView where hooks are defined
 * @param hooks Hooks to be run
 * @param initPhase A phase for which hooks should be run
 * @param nodeIndex 3 cases depending on the value:
 * - undefined: all hooks from the array should be executed (post-order case)
 * - null: execute hooks only from the saved index until the end of the array (pre-order case, when
 * flushing the remaining hooks)
 * - number: execute hooks only from the saved index until that node index exclusive (pre-order
 * case, when executing select(number))
 */
function executeInitAndCheckHooks(lView, hooks, initPhase, nodeIndex) {
    ngDevMode &&
        assertNotEqual(initPhase, 3 /* InitPhaseState.InitPhaseCompleted */, 'Init pre-order hooks should not be called more than once');
    if ((lView[FLAGS] & 3 /* LViewFlags.InitPhaseStateMask */) === initPhase) {
        callHooks(lView, hooks, initPhase, nodeIndex);
    }
}
function incrementInitPhaseFlags(lView, initPhase) {
    ngDevMode &&
        assertNotEqual(initPhase, 3 /* InitPhaseState.InitPhaseCompleted */, 'Init hooks phase should not be incremented after all init hooks have been run.');
    let flags = lView[FLAGS];
    if ((flags & 3 /* LViewFlags.InitPhaseStateMask */) === initPhase) {
        flags &= 16383 /* LViewFlags.IndexWithinInitPhaseReset */;
        flags += 1 /* LViewFlags.InitPhaseStateIncrementer */;
        lView[FLAGS] = flags;
    }
}
/**
 * Calls lifecycle hooks with their contexts, skipping init hooks if it's not
 * the first LView pass
 *
 * @param currentView The current view
 * @param arr The array in which the hooks are found
 * @param initPhaseState the current state of the init phase
 * @param currentNodeIndex 3 cases depending on the value:
 * - undefined: all hooks from the array should be executed (post-order case)
 * - null: execute hooks only from the saved index until the end of the array (pre-order case, when
 * flushing the remaining hooks)
 * - number: execute hooks only from the saved index until that node index exclusive (pre-order
 * case, when executing select(number))
 */
function callHooks(currentView, arr, initPhase, currentNodeIndex) {
    ngDevMode &&
        assertEqual(isInCheckNoChangesMode(), false, 'Hooks should never be run when in check no changes mode.');
    const startIndex = currentNodeIndex !== undefined
        ? currentView[PREORDER_HOOK_FLAGS] & 65535 /* PreOrderHookFlags.IndexOfTheNextPreOrderHookMaskMask */
        : 0;
    const nodeIndexLimit = currentNodeIndex != null ? currentNodeIndex : -1;
    const max = arr.length - 1; // Stop the loop at length - 1, because we look for the hook at i + 1
    let lastNodeIndexFound = 0;
    for (let i = startIndex; i < max; i++) {
        const hook = arr[i + 1];
        if (typeof hook === 'number') {
            lastNodeIndexFound = arr[i];
            if (currentNodeIndex != null && lastNodeIndexFound >= currentNodeIndex) {
                break;
            }
        }
        else {
            const isInitHook = arr[i] < 0;
            if (isInitHook) {
                currentView[PREORDER_HOOK_FLAGS] += 65536 /* PreOrderHookFlags.NumberOfInitHooksCalledIncrementer */;
            }
            if (lastNodeIndexFound < nodeIndexLimit || nodeIndexLimit == -1) {
                callHook(currentView, initPhase, arr, i);
                currentView[PREORDER_HOOK_FLAGS] =
                    (currentView[PREORDER_HOOK_FLAGS] & 4294901760 /* PreOrderHookFlags.NumberOfInitHooksCalledMask */) +
                        i +
                        2;
            }
            i++;
        }
    }
}
/**
 * Executes a single lifecycle hook, making sure that:
 * - it is called in the non-reactive context;
 * - profiling data are registered.
 */
function callHookInternal(directive, hook) {
    profiler(4 /* ProfilerEvent.LifecycleHookStart */, directive, hook);
    const prevConsumer = setActiveConsumer$1(null);
    try {
        hook.call(directive);
    }
    finally {
        setActiveConsumer$1(prevConsumer);
        profiler(5 /* ProfilerEvent.LifecycleHookEnd */, directive, hook);
    }
}
/**
 * Execute one hook against the current `LView`.
 *
 * @param currentView The current view
 * @param initPhaseState the current state of the init phase
 * @param arr The array in which the hooks are found
 * @param i The current index within the hook data array
 */
function callHook(currentView, initPhase, arr, i) {
    const isInitHook = arr[i] < 0;
    const hook = arr[i + 1];
    const directiveIndex = isInitHook ? -arr[i] : arr[i];
    const directive = currentView[directiveIndex];
    if (isInitHook) {
        const indexWithintInitPhase = currentView[FLAGS] >> 14 /* LViewFlags.IndexWithinInitPhaseShift */;
        // The init phase state must be always checked here as it may have been recursively updated.
        if (indexWithintInitPhase <
            currentView[PREORDER_HOOK_FLAGS] >> 16 /* PreOrderHookFlags.NumberOfInitHooksCalledShift */ &&
            (currentView[FLAGS] & 3 /* LViewFlags.InitPhaseStateMask */) === initPhase) {
            currentView[FLAGS] += 16384 /* LViewFlags.IndexWithinInitPhaseIncrementer */;
            callHookInternal(directive, hook);
        }
    }
    else {
        callHookInternal(directive, hook);
    }
}

const NO_PARENT_INJECTOR = -1;
/**
 * Each injector is saved in 9 contiguous slots in `LView` and 9 contiguous slots in
 * `TView.data`. This allows us to store information about the current node's tokens (which
 * can be shared in `TView`) as well as the tokens of its ancestor nodes (which cannot be
 * shared, so they live in `LView`).
 *
 * Each of these slots (aside from the last slot) contains a bloom filter. This bloom filter
 * determines whether a directive is available on the associated node or not. This prevents us
 * from searching the directives array at this level unless it's probable the directive is in it.
 *
 * See: https://en.wikipedia.org/wiki/Bloom_filter for more about bloom filters.
 *
 * Because all injectors have been flattened into `LView` and `TViewData`, they cannot typed
 * using interfaces as they were previously. The start index of each `LInjector` and `TInjector`
 * will differ based on where it is flattened into the main array, so it's not possible to know
 * the indices ahead of time and save their types here. The interfaces are still included here
 * for documentation purposes.
 *
 * export interface LInjector extends Array<any> {
 *
 *    // Cumulative bloom for directive IDs 0-31  (IDs are % BLOOM_SIZE)
 *    [0]: number;
 *
 *    // Cumulative bloom for directive IDs 32-63
 *    [1]: number;
 *
 *    // Cumulative bloom for directive IDs 64-95
 *    [2]: number;
 *
 *    // Cumulative bloom for directive IDs 96-127
 *    [3]: number;
 *
 *    // Cumulative bloom for directive IDs 128-159
 *    [4]: number;
 *
 *    // Cumulative bloom for directive IDs 160 - 191
 *    [5]: number;
 *
 *    // Cumulative bloom for directive IDs 192 - 223
 *    [6]: number;
 *
 *    // Cumulative bloom for directive IDs 224 - 255
 *    [7]: number;
 *
 *    // We need to store a reference to the injector's parent so DI can keep looking up
 *    // the injector tree until it finds the dependency it's looking for.
 *    [PARENT_INJECTOR]: number;
 * }
 *
 * export interface TInjector extends Array<any> {
 *
 *    // Shared node bloom for directive IDs 0-31  (IDs are % BLOOM_SIZE)
 *    [0]: number;
 *
 *    // Shared node bloom for directive IDs 32-63
 *    [1]: number;
 *
 *    // Shared node bloom for directive IDs 64-95
 *    [2]: number;
 *
 *    // Shared node bloom for directive IDs 96-127
 *    [3]: number;
 *
 *    // Shared node bloom for directive IDs 128-159
 *    [4]: number;
 *
 *    // Shared node bloom for directive IDs 160 - 191
 *    [5]: number;
 *
 *    // Shared node bloom for directive IDs 192 - 223
 *    [6]: number;
 *
 *    // Shared node bloom for directive IDs 224 - 255
 *    [7]: number;
 *
 *    // Necessary to find directive indices for a particular node.
 *    [TNODE]: TElementNode|TElementContainerNode|TContainerNode;
 *  }
 */
/**
 * Factory for creating instances of injectors in the NodeInjector.
 *
 * This factory is complicated by the fact that it can resolve `multi` factories as well.
 *
 * NOTE: Some of the fields are optional which means that this class has two hidden classes.
 * - One without `multi` support (most common)
 * - One with `multi` values, (rare).
 *
 * Since VMs can cache up to 4 inline hidden classes this is OK.
 *
 * - Single factory: Only `resolving` and `factory` is defined.
 * - `providers` factory: `componentProviders` is a number and `index = -1`.
 * - `viewProviders` factory: `componentProviders` is a number and `index` points to `providers`.
 */
class NodeInjectorFactory {
    factory;
    /**
     * The inject implementation to be activated when using the factory.
     */
    injectImpl;
    /**
     * Marker set to true during factory invocation to see if we get into recursive loop.
     * Recursive loop causes an error to be displayed.
     */
    resolving = false;
    /**
     * Marks that the token can see other Tokens declared in `viewProviders` on the same node.
     */
    canSeeViewProviders;
    /**
     * An array of factories to use in case of `multi` provider.
     */
    multi;
    /**
     * Number of `multi`-providers which belong to the component.
     *
     * This is needed because when multiple components and directives declare the `multi` provider
     * they have to be concatenated in the correct order.
     *
     * Example:
     *
     * If we have a component and directive active an a single element as declared here
     * ```ts
     * component:
     *   providers: [ {provide: String, useValue: 'component', multi: true} ],
     *   viewProviders: [ {provide: String, useValue: 'componentView', multi: true} ],
     *
     * directive:
     *   providers: [ {provide: String, useValue: 'directive', multi: true} ],
     * ```
     *
     * Then the expected results are:
     *
     * ```ts
     * providers: ['component', 'directive']
     * viewProviders: ['component', 'componentView', 'directive']
     * ```
     *
     * The way to think about it is that the `viewProviders` have been inserted after the component
     * but before the directives, which is why we need to know how many `multi`s have been declared by
     * the component.
     */
    componentProviders;
    /**
     * Current index of the Factory in the `data`. Needed for `viewProviders` and `providers` merging.
     * See `providerFactory`.
     */
    index;
    /**
     * Because the same `multi` provider can be declared in `providers` and `viewProviders` it is
     * possible for `viewProviders` to shadow the `providers`. For this reason we store the
     * `provideFactory` of the `providers` so that `providers` can be extended with `viewProviders`.
     *
     * Example:
     *
     * Given:
     * ```ts
     * providers: [ {provide: String, useValue: 'all', multi: true} ],
     * viewProviders: [ {provide: String, useValue: 'viewOnly', multi: true} ],
     * ```
     *
     * We have to return `['all']` in case of content injection, but `['all', 'viewOnly']` in case
     * of view injection. We further have to make sure that the shared instances (in our case
     * `all`) are the exact same instance in both the content as well as the view injection. (We
     * have to make sure that we don't double instantiate.) For this reason the `viewProviders`
     * `Factory` has a pointer to the shadowed `providers` factory so that it can instantiate the
     * `providers` (`['all']`) and then extend it with `viewProviders` (`['all'] + ['viewOnly'] =
     * ['all', 'viewOnly']`).
     */
    providerFactory;
    constructor(
    /**
     * Factory to invoke in order to create a new instance.
     */
    factory, 
    /**
     * Set to `true` if the token is declared in `viewProviders` (or if it is component).
     */
    isViewProvider, injectImplementation) {
        this.factory = factory;
        ngDevMode && assertDefined(factory, 'Factory not specified');
        ngDevMode && assertEqual(typeof factory, 'function', 'Expected factory function.');
        this.canSeeViewProviders = isViewProvider;
        this.injectImpl = injectImplementation;
    }
}

/**
 * Converts `TNodeType` into human readable text.
 * Make sure this matches with `TNodeType`
 */
function toTNodeTypeAsString(tNodeType) {
    let text = '';
    tNodeType & 1 /* TNodeType.Text */ && (text += '|Text');
    tNodeType & 2 /* TNodeType.Element */ && (text += '|Element');
    tNodeType & 4 /* TNodeType.Container */ && (text += '|Container');
    tNodeType & 8 /* TNodeType.ElementContainer */ && (text += '|ElementContainer');
    tNodeType & 16 /* TNodeType.Projection */ && (text += '|Projection');
    tNodeType & 32 /* TNodeType.Icu */ && (text += '|IcuContainer');
    tNodeType & 64 /* TNodeType.Placeholder */ && (text += '|Placeholder');
    tNodeType & 128 /* TNodeType.LetDeclaration */ && (text += '|LetDeclaration');
    return text.length > 0 ? text.substring(1) : text;
}
/**
 * Helper function to detect if a given value matches a `TNode` shape.
 *
 * The logic uses the `insertBeforeIndex` and its possible values as
 * a way to differentiate a TNode shape from other types of objects
 * within the `TView.data`. This is not a perfect check, but it can
 * be a reasonable differentiator, since we control the shapes of objects
 * within `TView.data`.
 */
function isTNodeShape(value) {
    return (value != null &&
        typeof value === 'object' &&
        (value.insertBeforeIndex === null ||
            typeof value.insertBeforeIndex === 'number' ||
            Array.isArray(value.insertBeforeIndex)));
}
function isLetDeclaration(tNode) {
    return !!(tNode.type & 128 /* TNodeType.LetDeclaration */);
}
/**
 * Returns `true` if the `TNode` has a directive which has `@Input()` for `class` binding.
 *
 * ```html
 * <div my-dir [class]="exp"></div>
 * ```
 * and
 * ```ts
 * @Directive({
 * })
 * class MyDirective {
 *   @Input()
 *   class: string;
 * }
 * ```
 *
 * In the above case it is necessary to write the reconciled styling information into the
 * directive's input.
 *
 * @param tNode
 */
function hasClassInput(tNode) {
    return (tNode.flags & 8 /* TNodeFlags.hasClassInput */) !== 0;
}
/**
 * Returns `true` if the `TNode` has a directive which has `@Input()` for `style` binding.
 *
 * ```html
 * <div my-dir [style]="exp"></div>
 * ```
 * and
 * ```ts
 * @Directive({
 * })
 * class MyDirective {
 *   @Input()
 *   class: string;
 * }
 * ```
 *
 * In the above case it is necessary to write the reconciled styling information into the
 * directive's input.
 *
 * @param tNode
 */
function hasStyleInput(tNode) {
    return (tNode.flags & 16 /* TNodeFlags.hasStyleInput */) !== 0;
}

function assertTNodeType(tNode, expectedTypes, message) {
    assertDefined(tNode, 'should be called with a TNode');
    if ((tNode.type & expectedTypes) === 0) {
        throwError(message ||
            `Expected [${toTNodeTypeAsString(expectedTypes)}] but got ${toTNodeTypeAsString(tNode.type)}.`);
    }
}
function assertPureTNodeType(type) {
    if (!(type === 2 /* TNodeType.Element */ ||
        type === 1 /* TNodeType.Text */ ||
        type === 4 /* TNodeType.Container */ ||
        type === 8 /* TNodeType.ElementContainer */ ||
        type === 32 /* TNodeType.Icu */ ||
        type === 16 /* TNodeType.Projection */ ||
        type === 64 /* TNodeType.Placeholder */ ||
        type === 128 /* TNodeType.LetDeclaration */)) {
        throwError(`Expected TNodeType to have only a single type selected, but got ${toTNodeTypeAsString(type)}.`);
    }
}

/**
 * Assigns all attribute values to the provided element via the inferred renderer.
 *
 * This function accepts two forms of attribute entries:
 *
 * default: (key, value):
 *  attrs = [key1, value1, key2, value2]
 *
 * namespaced: (NAMESPACE_MARKER, uri, name, value)
 *  attrs = [NAMESPACE_MARKER, uri, name, value, NAMESPACE_MARKER, uri, name, value]
 *
 * The `attrs` array can contain a mix of both the default and namespaced entries.
 * The "default" values are set without a marker, but if the function comes across
 * a marker value then it will attempt to set a namespaced value. If the marker is
 * not of a namespaced value then the function will quit and return the index value
 * where it stopped during the iteration of the attrs array.
 *
 * See [AttributeMarker] to understand what the namespace marker value is.
 *
 * Note that this instruction does not support assigning style and class values to
 * an element. See `elementStart` and `elementHostAttrs` to learn how styling values
 * are applied to an element.
 * @param renderer The renderer to be used
 * @param native The element that the attributes will be assigned to
 * @param attrs The attribute array of values that will be assigned to the element
 * @returns the index value that was last accessed in the attributes array
 */
function setUpAttributes(renderer, native, attrs) {
    let i = 0;
    while (i < attrs.length) {
        const value = attrs[i];
        if (typeof value === 'number') {
            // only namespaces are supported. Other value types (such as style/class
            // entries) are not supported in this function.
            if (value !== 0 /* AttributeMarker.NamespaceURI */) {
                break;
            }
            // we just landed on the marker value ... therefore
            // we should skip to the next entry
            i++;
            const namespaceURI = attrs[i++];
            const attrName = attrs[i++];
            const attrVal = attrs[i++];
            ngDevMode && ngDevMode.rendererSetAttribute++;
            renderer.setAttribute(native, attrName, attrVal, namespaceURI);
        }
        else {
            // attrName is string;
            const attrName = value;
            const attrVal = attrs[++i];
            // Standard attributes
            ngDevMode && ngDevMode.rendererSetAttribute++;
            if (isAnimationProp(attrName)) {
                renderer.setProperty(native, attrName, attrVal);
            }
            else {
                renderer.setAttribute(native, attrName, attrVal);
            }
            i++;
        }
    }
    // another piece of code may iterate over the same attributes array. Therefore
    // it may be helpful to return the exact spot where the attributes array exited
    // whether by running into an unsupported marker or if all the static values were
    // iterated over.
    return i;
}
/**
 * Test whether the given value is a marker that indicates that the following
 * attribute values in a `TAttributes` array are only the names of attributes,
 * and not name-value pairs.
 * @param marker The attribute marker to test.
 * @returns true if the marker is a "name-only" marker (e.g. `Bindings`, `Template` or `I18n`).
 */
function isNameOnlyAttributeMarker(marker) {
    return (marker === 3 /* AttributeMarker.Bindings */ ||
        marker === 4 /* AttributeMarker.Template */ ||
        marker === 6 /* AttributeMarker.I18n */);
}
function isAnimationProp(name) {
    // Perf note: accessing charCodeAt to check for the first character of a string is faster as
    // compared to accessing a character at index 0 (ex. name[0]). The main reason for this is that
    // charCodeAt doesn't allocate memory to return a substring.
    return name.charCodeAt(0) === 64 /* CharCode.AT_SIGN */;
}
/**
 * Merges `src` `TAttributes` into `dst` `TAttributes` removing any duplicates in the process.
 *
 * This merge function keeps the order of attrs same.
 *
 * @param dst Location of where the merged `TAttributes` should end up.
 * @param src `TAttributes` which should be appended to `dst`
 */
function mergeHostAttrs(dst, src) {
    if (src === null || src.length === 0) ;
    else if (dst === null || dst.length === 0) {
        // We have source, but dst is empty, just make a copy.
        dst = src.slice();
    }
    else {
        let srcMarker = -1 /* AttributeMarker.ImplicitAttributes */;
        for (let i = 0; i < src.length; i++) {
            const item = src[i];
            if (typeof item === 'number') {
                srcMarker = item;
            }
            else {
                if (srcMarker === 0 /* AttributeMarker.NamespaceURI */) ;
                else if (srcMarker === -1 /* AttributeMarker.ImplicitAttributes */ ||
                    srcMarker === 2 /* AttributeMarker.Styles */) {
                    // Case where we have to consume `key1` and `value` only.
                    mergeHostAttribute(dst, srcMarker, item, null, src[++i]);
                }
                else {
                    // Case where we have to consume `key1` only.
                    mergeHostAttribute(dst, srcMarker, item, null, null);
                }
            }
        }
    }
    return dst;
}
/**
 * Append `key`/`value` to existing `TAttributes` taking region marker and duplicates into account.
 *
 * @param dst `TAttributes` to append to.
 * @param marker Region where the `key`/`value` should be added.
 * @param key1 Key to add to `TAttributes`
 * @param key2 Key to add to `TAttributes` (in case of `AttributeMarker.NamespaceURI`)
 * @param value Value to add or to overwrite to `TAttributes` Only used if `marker` is not Class.
 */
function mergeHostAttribute(dst, marker, key1, key2, value) {
    let i = 0;
    // Assume that new markers will be inserted at the end.
    let markerInsertPosition = dst.length;
    // scan until correct type.
    if (marker === -1 /* AttributeMarker.ImplicitAttributes */) {
        markerInsertPosition = -1;
    }
    else {
        while (i < dst.length) {
            const dstValue = dst[i++];
            if (typeof dstValue === 'number') {
                if (dstValue === marker) {
                    markerInsertPosition = -1;
                    break;
                }
                else if (dstValue > marker) {
                    // We need to save this as we want the markers to be inserted in specific order.
                    markerInsertPosition = i - 1;
                    break;
                }
            }
        }
    }
    // search until you find place of insertion
    while (i < dst.length) {
        const item = dst[i];
        if (typeof item === 'number') {
            // since `i` started as the index after the marker, we did not find it if we are at the next
            // marker
            break;
        }
        else if (item === key1) {
            // We already have same token
            {
                if (value !== null) {
                    dst[i + 1] = value;
                }
                return;
            }
        }
        // Increment counter.
        i++;
        if (value !== null)
            i++;
    }
    // insert at location.
    if (markerInsertPosition !== -1) {
        dst.splice(markerInsertPosition, 0, marker);
        i = markerInsertPosition + 1;
    }
    dst.splice(i++, 0, key1);
    if (value !== null) {
        dst.splice(i++, 0, value);
    }
}

/// Parent Injector Utils ///////////////////////////////////////////////////////////////
function hasParentInjector(parentLocation) {
    return parentLocation !== NO_PARENT_INJECTOR;
}
function getParentInjectorIndex(parentLocation) {
    if (ngDevMode) {
        assertNumber(parentLocation, 'Number expected');
        assertNotEqual(parentLocation, -1, 'Not a valid state.');
        const parentInjectorIndex = parentLocation & 32767 /* RelativeInjectorLocationFlags.InjectorIndexMask */;
        assertGreaterThan(parentInjectorIndex, HEADER_OFFSET, 'Parent injector must be pointing past HEADER_OFFSET.');
    }
    return parentLocation & 32767 /* RelativeInjectorLocationFlags.InjectorIndexMask */;
}
function getParentInjectorViewOffset(parentLocation) {
    return parentLocation >> 16 /* RelativeInjectorLocationFlags.ViewOffsetShift */;
}
/**
 * Unwraps a parent injector location number to find the view offset from the current injector,
 * then walks up the declaration view tree until the view is found that contains the parent
 * injector.
 *
 * @param location The location of the parent injector, which contains the view offset
 * @param startView The LView instance from which to start walking up the view tree
 * @returns The LView instance that contains the parent injector
 */
function getParentInjectorView(location, startView) {
    let viewOffset = getParentInjectorViewOffset(location);
    let parentView = startView;
    // For most cases, the parent injector can be found on the host node (e.g. for component
    // or container), but we must keep the loop here to support the rarer case of deeply nested
    // <ng-template> tags or inline views, where the parent injector might live many views
    // above the child injector.
    while (viewOffset > 0) {
        parentView = parentView[DECLARATION_VIEW];
        viewOffset--;
    }
    return parentView;
}

/**
 * Defines if the call to `inject` should include `viewProviders` in its resolution.
 *
 * This is set to true when we try to instantiate a component. This value is reset in
 * `getNodeInjectable` to a value which matches the declaration location of the token about to be
 * instantiated. This is done so that if we are injecting a token which was declared outside of
 * `viewProviders` we don't accidentally pull `viewProviders` in.
 *
 * Example:
 *
 * ```ts
 * @Injectable()
 * class MyService {
 *   constructor(public value: String) {}
 * }
 *
 * @Component({
 *   providers: [
 *     MyService,
 *     {provide: String, value: 'providers' }
 *   ]
 *   viewProviders: [
 *     {provide: String, value: 'viewProviders'}
 *   ]
 * })
 * class MyComponent {
 *   constructor(myService: MyService, value: String) {
 *     // We expect that Component can see into `viewProviders`.
 *     expect(value).toEqual('viewProviders');
 *     // `MyService` was not declared in `viewProviders` hence it can't see it.
 *     expect(myService.value).toEqual('providers');
 *   }
 * }
 *
 * ```
 */
let includeViewProviders = true;
function setIncludeViewProviders(v) {
    const oldValue = includeViewProviders;
    includeViewProviders = v;
    return oldValue;
}
/**
 * The number of slots in each bloom filter (used by DI). The larger this number, the fewer
 * directives that will share slots, and thus, the fewer false positives when checking for
 * the existence of a directive.
 */
const BLOOM_SIZE = 256;
const BLOOM_MASK = BLOOM_SIZE - 1;
/**
 * The number of bits that is represented by a single bloom bucket. JS bit operations are 32 bits,
 * so each bucket represents 32 distinct tokens which accounts for log2(32) = 5 bits of a bloom hash
 * number.
 */
const BLOOM_BUCKET_BITS = 5;
/** Counter used to generate unique IDs for directives. */
let nextNgElementId = 0;
/** Value used when something wasn't found by an injector. */
const NOT_FOUND = {};
/**
 * Registers this directive as present in its node's injector by flipping the directive's
 * corresponding bit in the injector's bloom filter.
 *
 * @param injectorIndex The index of the node injector where this token should be registered
 * @param tView The TView for the injector's bloom filters
 * @param type The directive token to register
 */
function bloomAdd(injectorIndex, tView, type) {
    ngDevMode && assertEqual(tView.firstCreatePass, true, 'expected firstCreatePass to be true');
    let id;
    if (typeof type === 'string') {
        id = type.charCodeAt(0) || 0;
    }
    else if (type.hasOwnProperty(NG_ELEMENT_ID)) {
        id = type[NG_ELEMENT_ID];
    }
    // Set a unique ID on the directive type, so if something tries to inject the directive,
    // we can easily retrieve the ID and hash it into the bloom bit that should be checked.
    if (id == null) {
        id = type[NG_ELEMENT_ID] = nextNgElementId++;
    }
    // We only have BLOOM_SIZE (256) slots in our bloom filter (8 buckets * 32 bits each),
    // so all unique IDs must be modulo-ed into a number from 0 - 255 to fit into the filter.
    const bloomHash = id & BLOOM_MASK;
    // Create a mask that targets the specific bit associated with the directive.
    // JS bit operations are 32 bits, so this will be a number between 2^0 and 2^31, corresponding
    // to bit positions 0 - 31 in a 32 bit integer.
    const mask = 1 << bloomHash;
    // Each bloom bucket in `tData` represents `BLOOM_BUCKET_BITS` number of bits of `bloomHash`.
    // Any bits in `bloomHash` beyond `BLOOM_BUCKET_BITS` indicate the bucket offset that the mask
    // should be written to.
    tView.data[injectorIndex + (bloomHash >> BLOOM_BUCKET_BITS)] |= mask;
}
/**
 * Creates (or gets an existing) injector for a given element or container.
 *
 * @param tNode for which an injector should be retrieved / created.
 * @param lView View where the node is stored
 * @returns Node injector
 */
function getOrCreateNodeInjectorForNode(tNode, lView) {
    const existingInjectorIndex = getInjectorIndex(tNode, lView);
    if (existingInjectorIndex !== -1) {
        return existingInjectorIndex;
    }
    const tView = lView[TVIEW];
    if (tView.firstCreatePass) {
        tNode.injectorIndex = lView.length;
        insertBloom(tView.data, tNode); // foundation for node bloom
        insertBloom(lView, null); // foundation for cumulative bloom
        insertBloom(tView.blueprint, null);
    }
    const parentLoc = getParentInjectorLocation(tNode, lView);
    const injectorIndex = tNode.injectorIndex;
    // If a parent injector can't be found, its location is set to -1.
    // In that case, we don't need to set up a cumulative bloom
    if (hasParentInjector(parentLoc)) {
        const parentIndex = getParentInjectorIndex(parentLoc);
        const parentLView = getParentInjectorView(parentLoc, lView);
        const parentData = parentLView[TVIEW].data;
        // Creates a cumulative bloom filter that merges the parent's bloom filter
        // and its own cumulative bloom (which contains tokens for all ancestors)
        for (let i = 0; i < 8 /* NodeInjectorOffset.BLOOM_SIZE */; i++) {
            lView[injectorIndex + i] = parentLView[parentIndex + i] | parentData[parentIndex + i];
        }
    }
    lView[injectorIndex + 8 /* NodeInjectorOffset.PARENT */] = parentLoc;
    return injectorIndex;
}
function insertBloom(arr, footer) {
    arr.push(0, 0, 0, 0, 0, 0, 0, 0, footer);
}
function getInjectorIndex(tNode, lView) {
    if (tNode.injectorIndex === -1 ||
        // If the injector index is the same as its parent's injector index, then the index has been
        // copied down from the parent node. No injector has been created yet on this node.
        (tNode.parent && tNode.parent.injectorIndex === tNode.injectorIndex) ||
        // After the first template pass, the injector index might exist but the parent values
        // might not have been calculated yet for this instance
        lView[tNode.injectorIndex + 8 /* NodeInjectorOffset.PARENT */] === null) {
        return -1;
    }
    else {
        ngDevMode && assertIndexInRange(lView, tNode.injectorIndex);
        return tNode.injectorIndex;
    }
}
/**
 * Finds the index of the parent injector, with a view offset if applicable. Used to set the
 * parent injector initially.
 *
 * @returns Returns a number that is the combination of the number of LViews that we have to go up
 * to find the LView containing the parent inject AND the index of the injector within that LView.
 */
function getParentInjectorLocation(tNode, lView) {
    if (tNode.parent && tNode.parent.injectorIndex !== -1) {
        // If we have a parent `TNode` and there is an injector associated with it we are done, because
        // the parent injector is within the current `LView`.
        return tNode.parent.injectorIndex; // ViewOffset is 0
    }
    // When parent injector location is computed it may be outside of the current view. (ie it could
    // be pointing to a declared parent location). This variable stores number of declaration parents
    // we need to walk up in order to find the parent injector location.
    let declarationViewOffset = 0;
    let parentTNode = null;
    let lViewCursor = lView;
    // The parent injector is not in the current `LView`. We will have to walk the declared parent
    // `LView` hierarchy and look for it. If we walk of the top, that means that there is no parent
    // `NodeInjector`.
    while (lViewCursor !== null) {
        parentTNode = getTNodeFromLView(lViewCursor);
        if (parentTNode === null) {
            // If we have no parent, than we are done.
            return NO_PARENT_INJECTOR;
        }
        ngDevMode && parentTNode && assertTNodeForLView(parentTNode, lViewCursor[DECLARATION_VIEW]);
        // Every iteration of the loop requires that we go to the declared parent.
        declarationViewOffset++;
        lViewCursor = lViewCursor[DECLARATION_VIEW];
        if (parentTNode.injectorIndex !== -1) {
            // We found a NodeInjector which points to something.
            return (parentTNode.injectorIndex |
                (declarationViewOffset <<
                    16 /* RelativeInjectorLocationFlags.ViewOffsetShift */));
        }
    }
    return NO_PARENT_INJECTOR;
}
/**
 * Makes a type or an injection token public to the DI system by adding it to an
 * injector's bloom filter.
 *
 * @param di The node injector in which a directive will be added
 * @param token The type or the injection token to be made public
 */
function diPublicInInjector(injectorIndex, tView, token) {
    bloomAdd(injectorIndex, tView, token);
}
/**
 * Inject static attribute value into directive constructor.
 *
 * This method is used with `factory` functions which are generated as part of
 * `defineDirective` or `defineComponent`. The method retrieves the static value
 * of an attribute. (Dynamic attributes are not supported since they are not resolved
 *  at the time of injection and can change over time.)
 *
 * # Example
 * Given:
 * ```ts
 * @Component(...)
 * class MyComponent {
 *   constructor(@Attribute('title') title: string) { ... }
 * }
 * ```
 * When instantiated with
 * ```html
 * <my-component title="Hello"></my-component>
 * ```
 *
 * Then factory method generated is:
 * ```ts
 * MyComponent.ɵcmp = defineComponent({
 *   factory: () => new MyComponent(injectAttribute('title'))
 *   ...
 * })
 * ```
 *
 * @publicApi
 */
function injectAttributeImpl(tNode, attrNameToInject) {
    ngDevMode && assertTNodeType(tNode, 12 /* TNodeType.AnyContainer */ | 3 /* TNodeType.AnyRNode */);
    ngDevMode && assertDefined(tNode, 'expecting tNode');
    if (attrNameToInject === 'class') {
        return tNode.classes;
    }
    if (attrNameToInject === 'style') {
        return tNode.styles;
    }
    const attrs = tNode.attrs;
    if (attrs) {
        const attrsLength = attrs.length;
        let i = 0;
        while (i < attrsLength) {
            const value = attrs[i];
            // If we hit a `Bindings` or `Template` marker then we are done.
            if (isNameOnlyAttributeMarker(value   ))
                break;
            // Skip namespaced attributes
            if (value === 0 /* AttributeMarker.NamespaceURI */) {
                // we skip the next two values
                // as namespaced attributes looks like
                // [..., AttributeMarker.NamespaceURI, 'http://someuri.com/test', 'test:exist',
                // 'existValue', ...]
                i = i + 2;
            }
            else if (typeof value === 'number') {
                // Skip to the first value of the marked attribute.
                i++;
                while (i < attrsLength && typeof attrs[i] === 'string') {
                    i++;
                }
            }
            else if (value === attrNameToInject) {
                return attrs[i + 1];
            }
            else {
                i = i + 2;
            }
        }
    }
    return null;
}
function notFoundValueOrThrow(notFoundValue, token, flags) {
    if (flags & InjectFlags.Optional || notFoundValue !== undefined) {
        return notFoundValue;
    }
    else {
        throwProviderNotFoundError(token, 'NodeInjector');
    }
}
/**
 * Returns the value associated to the given token from the ModuleInjector or throws exception
 *
 * @param lView The `LView` that contains the `tNode`
 * @param token The token to look for
 * @param flags Injection flags
 * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`
 * @returns the value from the injector or throws an exception
 */
function lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue) {
    if (flags & InjectFlags.Optional && notFoundValue === undefined) {
        // This must be set or the NullInjector will throw for optional deps
        notFoundValue = null;
    }
    if ((flags & (InjectFlags.Self | InjectFlags.Host)) === 0) {
        const moduleInjector = lView[INJECTOR];
        // switch to `injectInjectorOnly` implementation for module injector, since module injector
        // should not have access to Component/Directive DI scope (that may happen through
        // `directiveInject` implementation)
        const previousInjectImplementation = setInjectImplementation(undefined);
        try {
            if (moduleInjector) {
                return moduleInjector.get(token, notFoundValue, flags & InjectFlags.Optional);
            }
            else {
                return injectRootLimpMode(token, notFoundValue, flags & InjectFlags.Optional);
            }
        }
        finally {
            setInjectImplementation(previousInjectImplementation);
        }
    }
    return notFoundValueOrThrow(notFoundValue, token, flags);
}
/**
 * Returns the value associated to the given token from the NodeInjectors => ModuleInjector.
 *
 * Look for the injector providing the token by walking up the node injector tree and then
 * the module injector tree.
 *
 * This function patches `token` with `__NG_ELEMENT_ID__` which contains the id for the bloom
 * filter. `-1` is reserved for injecting `Injector` (implemented by `NodeInjector`)
 *
 * @param tNode The Node where the search for the injector should start
 * @param lView The `LView` that contains the `tNode`
 * @param token The token to look for
 * @param flags Injection flags
 * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`
 * @returns the value from the injector, `null` when not found, or `notFoundValue` if provided
 */
function getOrCreateInjectable(tNode, lView, token, flags = InjectFlags.Default, notFoundValue) {
    if (tNode !== null) {
        // If the view or any of its ancestors have an embedded
        // view injector, we have to look it up there first.
        if (lView[FLAGS] & 2048 /* LViewFlags.HasEmbeddedViewInjector */ &&
            // The token must be present on the current node injector when the `Self`
            // flag is set, so the lookup on embedded view injector(s) can be skipped.
            !(flags & InjectFlags.Self)) {
            const embeddedInjectorValue = lookupTokenUsingEmbeddedInjector(tNode, lView, token, flags, NOT_FOUND);
            if (embeddedInjectorValue !== NOT_FOUND) {
                return embeddedInjectorValue;
            }
        }
        // Otherwise try the node injector.
        const value = lookupTokenUsingNodeInjector(tNode, lView, token, flags, NOT_FOUND);
        if (value !== NOT_FOUND) {
            return value;
        }
    }
    // Finally, fall back to the module injector.
    return lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue);
}
/**
 * Returns the value associated to the given token from the node injector.
 *
 * @param tNode The Node where the search for the injector should start
 * @param lView The `LView` that contains the `tNode`
 * @param token The token to look for
 * @param flags Injection flags
 * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`
 * @returns the value from the injector, `null` when not found, or `notFoundValue` if provided
 */
function lookupTokenUsingNodeInjector(tNode, lView, token, flags, notFoundValue) {
    const bloomHash = bloomHashBitOrFactory(token);
    // If the ID stored here is a function, this is a special object like ElementRef or TemplateRef
    // so just call the factory function to create it.
    if (typeof bloomHash === 'function') {
        if (!enterDI(lView, tNode, flags)) {
            // Failed to enter DI, try module injector instead. If a token is injected with the @Host
            // flag, the module injector is not searched for that token in Ivy.
            return flags & InjectFlags.Host
                ? notFoundValueOrThrow(notFoundValue, token, flags)
                : lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue);
        }
        try {
            let value;
            if (ngDevMode) {
                runInInjectorProfilerContext(new NodeInjector(getCurrentTNode(), getLView()), token, () => {
                    value = bloomHash(flags);
                    if (value != null) {
                        emitInstanceCreatedByInjectorEvent(value);
                    }
                });
            }
            else {
                value = bloomHash(flags);
            }
            if (value == null && !(flags & InjectFlags.Optional)) {
                throwProviderNotFoundError(token);
            }
            else {
                return value;
            }
        }
        finally {
            leaveDI();
        }
    }
    else if (typeof bloomHash === 'number') {
        // A reference to the previous injector TView that was found while climbing the element
        // injector tree. This is used to know if viewProviders can be accessed on the current
        // injector.
        let previousTView = null;
        let injectorIndex = getInjectorIndex(tNode, lView);
        let parentLocation = NO_PARENT_INJECTOR;
        let hostTElementNode = flags & InjectFlags.Host ? lView[DECLARATION_COMPONENT_VIEW][T_HOST] : null;
        // If we should skip this injector, or if there is no injector on this node, start by
        // searching the parent injector.
        if (injectorIndex === -1 || flags & InjectFlags.SkipSelf) {
            parentLocation =
                injectorIndex === -1
                    ? getParentInjectorLocation(tNode, lView)
                    : lView[injectorIndex + 8 /* NodeInjectorOffset.PARENT */];
            if (parentLocation === NO_PARENT_INJECTOR || !shouldSearchParent(flags, false)) {
                injectorIndex = -1;
            }
            else {
                previousTView = lView[TVIEW];
                injectorIndex = getParentInjectorIndex(parentLocation);
                lView = getParentInjectorView(parentLocation, lView);
            }
        }
        // Traverse up the injector tree until we find a potential match or until we know there
        // *isn't* a match.
        while (injectorIndex !== -1) {
            ngDevMode && assertNodeInjector(lView, injectorIndex);
            // Check the current injector. If it matches, see if it contains token.
            const tView = lView[TVIEW];
            ngDevMode &&
                assertTNodeForLView(tView.data[injectorIndex + 8 /* NodeInjectorOffset.TNODE */], lView);
            if (bloomHasToken(bloomHash, injectorIndex, tView.data)) {
                // At this point, we have an injector which *may* contain the token, so we step through
                // the providers and directives associated with the injector's corresponding node to get
                // the instance.
                const instance = searchTokensOnInjector(injectorIndex, lView, token, previousTView, flags, hostTElementNode);
                if (instance !== NOT_FOUND) {
                    return instance;
                }
            }
            parentLocation = lView[injectorIndex + 8 /* NodeInjectorOffset.PARENT */];
            if (parentLocation !== NO_PARENT_INJECTOR &&
                shouldSearchParent(flags, lView[TVIEW].data[injectorIndex + 8 /* NodeInjectorOffset.TNODE */] === hostTElementNode) &&
                bloomHasToken(bloomHash, injectorIndex, lView)) {
                // The def wasn't found anywhere on this node, so it was a false positive.
                // Traverse up the tree and continue searching.
                previousTView = tView;
                injectorIndex = getParentInjectorIndex(parentLocation);
                lView = getParentInjectorView(parentLocation, lView);
            }
            else {
                // If we should not search parent OR If the ancestor bloom filter value does not have the
                // bit corresponding to the directive we can give up on traversing up to find the specific
                // injector.
                injectorIndex = -1;
            }
        }
    }
    return notFoundValue;
}
function searchTokensOnInjector(injectorIndex, lView, token, previousTView, flags, hostTElementNode) {
    const currentTView = lView[TVIEW];
    const tNode = currentTView.data[injectorIndex + 8 /* NodeInjectorOffset.TNODE */];
    // First, we need to determine if view providers can be accessed by the starting element.
    // There are two possibilities
    const canAccessViewProviders = previousTView == null
        ? // 1) This is the first invocation `previousTView == null` which means that we are at the
            // `TNode` of where injector is starting to look. In such a case the only time we are allowed
            // to look into the ViewProviders is if:
            // - we are on a component
            // - AND the injector set `includeViewProviders` to true (implying that the token can see
            // ViewProviders because it is the Component or a Service which itself was declared in
            // ViewProviders)
            isComponentHost(tNode) && includeViewProviders
        : // 2) `previousTView != null` which means that we are now walking across the parent nodes.
            // In such a case we are only allowed to look into the ViewProviders if:
            // - We just crossed from child View to Parent View `previousTView != currentTView`
            // - AND the parent TNode is an Element.
            // This means that we just came from the Component's View and therefore are allowed to see
            // into the ViewProviders.
            previousTView != currentTView && (tNode.type & 3 /* TNodeType.AnyRNode */) !== 0;
    // This special case happens when there is a @host on the inject and when we are searching
    // on the host element node.
    const isHostSpecialCase = flags & InjectFlags.Host && hostTElementNode === tNode;
    const injectableIdx = locateDirectiveOrProvider(tNode, currentTView, token, canAccessViewProviders, isHostSpecialCase);
    if (injectableIdx !== null) {
        return getNodeInjectable(lView, currentTView, injectableIdx, tNode, flags);
    }
    else {
        return NOT_FOUND;
    }
}
/**
 * Searches for the given token among the node's directives and providers.
 *
 * @param tNode TNode on which directives are present.
 * @param tView The tView we are currently processing
 * @param token Provider token or type of a directive to look for.
 * @param canAccessViewProviders Whether view providers should be considered.
 * @param isHostSpecialCase Whether the host special case applies.
 * @returns Index of a found directive or provider, or null when none found.
 */
function locateDirectiveOrProvider(tNode, tView, token, canAccessViewProviders, isHostSpecialCase) {
    const nodeProviderIndexes = tNode.providerIndexes;
    const tInjectables = tView.data;
    const injectablesStart = nodeProviderIndexes & 1048575 /* TNodeProviderIndexes.ProvidersStartIndexMask */;
    const directivesStart = tNode.directiveStart;
    const directiveEnd = tNode.directiveEnd;
    const cptViewProvidersCount = nodeProviderIndexes >> 20 /* TNodeProviderIndexes.CptViewProvidersCountShift */;
    const startingIndex = canAccessViewProviders
        ? injectablesStart
        : injectablesStart + cptViewProvidersCount;
    // When the host special case applies, only the viewProviders and the component are visible
    const endIndex = isHostSpecialCase ? injectablesStart + cptViewProvidersCount : directiveEnd;
    for (let i = startingIndex; i < endIndex; i++) {
        const providerTokenOrDef = tInjectables[i];
        if ((i < directivesStart && token === providerTokenOrDef) ||
            (i >= directivesStart && providerTokenOrDef.type === token)) {
            return i;
        }
    }
    if (isHostSpecialCase) {
        const dirDef = tInjectables[directivesStart];
        if (dirDef && isComponentDef(dirDef) && dirDef.type === token) {
            return directivesStart;
        }
    }
    return null;
}
/**
 * Retrieve or instantiate the injectable from the `LView` at particular `index`.
 *
 * This function checks to see if the value has already been instantiated and if so returns the
 * cached `injectable`. Otherwise if it detects that the value is still a factory it
 * instantiates the `injectable` and caches the value.
 */
function getNodeInjectable(lView, tView, index, tNode, flags) {
    let value = lView[index];
    const tData = tView.data;
    if (value instanceof NodeInjectorFactory) {
        const factory = value;
        if (factory.resolving) {
            throwCyclicDependencyError(stringifyForError(tData[index]));
        }
        const previousIncludeViewProviders = setIncludeViewProviders(factory.canSeeViewProviders);
        factory.resolving = true;
        let prevInjectContext;
        if (ngDevMode) {
            // tData indexes mirror the concrete instances in its corresponding LView.
            // lView[index] here is either the injectable instace itself or a factory,
            // therefore tData[index] is the constructor of that injectable or a
            // definition object that contains the constructor in a `.type` field.
            const token = tData[index].type || tData[index];
            const injector = new NodeInjector(tNode, lView);
            prevInjectContext = setInjectorProfilerContext({ injector, token });
        }
        const previousInjectImplementation = factory.injectImpl
            ? setInjectImplementation(factory.injectImpl)
            : null;
        const success = enterDI(lView, tNode, InjectFlags.Default);
        ngDevMode &&
            assertEqual(success, true, "Because flags do not contain `SkipSelf' we expect this to always succeed.");
        try {
            value = lView[index] = factory.factory(undefined, flags, tData, lView, tNode);
            ngDevMode && emitInstanceCreatedByInjectorEvent(value);
            // This code path is hit for both directives and providers.
            // For perf reasons, we want to avoid searching for hooks on providers.
            // It does no harm to try (the hooks just won't exist), but the extra
            // checks are unnecessary and this is a hot path. So we check to see
            // if the index of the dependency is in the directive range for this
            // tNode. If it's not, we know it's a provider and skip hook registration.
            if (tView.firstCreatePass && index >= tNode.directiveStart) {
                ngDevMode && assertDirectiveDef(tData[index]);
                registerPreOrderHooks(index, tData[index], tView);
            }
        }
        finally {
            ngDevMode && setInjectorProfilerContext(prevInjectContext);
            previousInjectImplementation !== null &&
                setInjectImplementation(previousInjectImplementation);
            setIncludeViewProviders(previousIncludeViewProviders);
            factory.resolving = false;
            leaveDI();
        }
    }
    return value;
}
/**
 * Returns the bit in an injector's bloom filter that should be used to determine whether or not
 * the directive might be provided by the injector.
 *
 * When a directive is public, it is added to the bloom filter and given a unique ID that can be
 * retrieved on the Type. When the directive isn't public or the token is not a directive `null`
 * is returned as the node injector can not possibly provide that token.
 *
 * @param token the injection token
 * @returns the matching bit to check in the bloom filter or `null` if the token is not known.
 *   When the returned value is negative then it represents special values such as `Injector`.
 */
function bloomHashBitOrFactory(token) {
    ngDevMode && assertDefined(token, 'token must be defined');
    if (typeof token === 'string') {
        return token.charCodeAt(0) || 0;
    }
    const tokenId = 
    // First check with `hasOwnProperty` so we don't get an inherited ID.
    token.hasOwnProperty(NG_ELEMENT_ID) ? token[NG_ELEMENT_ID] : undefined;
    // Negative token IDs are used for special objects such as `Injector`
    if (typeof tokenId === 'number') {
        if (tokenId >= 0) {
            return tokenId & BLOOM_MASK;
        }
        else {
            ngDevMode &&
                assertEqual(tokenId, -1 /* InjectorMarkers.Injector */, 'Expecting to get Special Injector Id');
            return createNodeInjector;
        }
    }
    else {
        return tokenId;
    }
}
function bloomHasToken(bloomHash, injectorIndex, injectorView) {
    // Create a mask that targets the specific bit associated with the directive we're looking for.
    // JS bit operations are 32 bits, so this will be a number between 2^0 and 2^31, corresponding
    // to bit positions 0 - 31 in a 32 bit integer.
    const mask = 1 << bloomHash;
    // Each bloom bucket in `injectorView` represents `BLOOM_BUCKET_BITS` number of bits of
    // `bloomHash`. Any bits in `bloomHash` beyond `BLOOM_BUCKET_BITS` indicate the bucket offset
    // that should be used.
    const value = injectorView[injectorIndex + (bloomHash >> BLOOM_BUCKET_BITS)];
    // If the bloom filter value has the bit corresponding to the directive's bloomBit flipped on,
    // this injector is a potential match.
    return !!(value & mask);
}
/** Returns true if flags prevent parent injector from being searched for tokens */
function shouldSearchParent(flags, isFirstHostTNode) {
    return !(flags & InjectFlags.Self) && !(flags & InjectFlags.Host && isFirstHostTNode);
}
function getNodeInjectorLView(nodeInjector) {
    return nodeInjector._lView;
}
function getNodeInjectorTNode(nodeInjector) {
    return nodeInjector._tNode;
}
class NodeInjector {
    _tNode;
    _lView;
    constructor(_tNode, _lView) {
        this._tNode = _tNode;
        this._lView = _lView;
    }
    get(token, notFoundValue, flags) {
        return getOrCreateInjectable(this._tNode, this._lView, token, convertToBitFlags(flags), notFoundValue);
    }
}
/** Creates a `NodeInjector` for the current node. */
function createNodeInjector() {
    return new NodeInjector(getCurrentTNode(), getLView());
}
/**
 * @codeGenApi
 */
function ɵɵgetInheritedFactory(type) {
    return noSideEffects(() => {
        const ownConstructor = type.prototype.constructor;
        const ownFactory = ownConstructor[NG_FACTORY_DEF] || getFactoryOf(ownConstructor);
        const objectPrototype = Object.prototype;
        let parent = Object.getPrototypeOf(type.prototype).constructor;
        // Go up the prototype until we hit `Object`.
        while (parent && parent !== objectPrototype) {
            const factory = parent[NG_FACTORY_DEF] || getFactoryOf(parent);
            // If we hit something that has a factory and the factory isn't the same as the type,
            // we've found the inherited factory. Note the check that the factory isn't the type's
            // own factory is redundant in most cases, but if the user has custom decorators on the
            // class, this lookup will start one level down in the prototype chain, causing us to
            // find the own factory first and potentially triggering an infinite loop downstream.
            if (factory && factory !== ownFactory) {
                return factory;
            }
            parent = Object.getPrototypeOf(parent);
        }
        // There is no factory defined. Either this was improper usage of inheritance
        // (no Angular decorator on the superclass) or there is no constructor at all
        // in the inheritance chain. Since the two cases cannot be distinguished, the
        // latter has to be assumed.
        return (t) => new t();
    });
}
function getFactoryOf(type) {
    if (isForwardRef(type)) {
        return () => {
            const factory = getFactoryOf(resolveForwardRef(type));
            return factory && factory();
        };
    }
    return getFactoryDef(type);
}
/**
 * Returns a value from the closest embedded or node injector.
 *
 * @param tNode The Node where the search for the injector should start
 * @param lView The `LView` that contains the `tNode`
 * @param token The token to look for
 * @param flags Injection flags
 * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`
 * @returns the value from the injector, `null` when not found, or `notFoundValue` if provided
 */
function lookupTokenUsingEmbeddedInjector(tNode, lView, token, flags, notFoundValue) {
    let currentTNode = tNode;
    let currentLView = lView;
    // When an LView with an embedded view injector is inserted, it'll likely be interlaced with
    // nodes who may have injectors (e.g. node injector -> embedded view injector -> node injector).
    // Since the bloom filters for the node injectors have already been constructed and we don't
    // have a way of extracting the records from an injector, the only way to maintain the correct
    // hierarchy when resolving the value is to walk it node-by-node while attempting to resolve
    // the token at each level.
    while (currentTNode !== null &&
        currentLView !== null &&
        currentLView[FLAGS] & 2048 /* LViewFlags.HasEmbeddedViewInjector */ &&
        !isRootView(currentLView)) {
        ngDevMode && assertTNodeForLView(currentTNode, currentLView);
        // Note that this lookup on the node injector is using the `Self` flag, because
        // we don't want the node injector to look at any parent injectors since we
        // may hit the embedded view injector first.
        const nodeInjectorValue = lookupTokenUsingNodeInjector(currentTNode, currentLView, token, flags | InjectFlags.Self, NOT_FOUND);
        if (nodeInjectorValue !== NOT_FOUND) {
            return nodeInjectorValue;
        }
        // Has an explicit type due to a TS bug: https://github.com/microsoft/TypeScript/issues/33191
        let parentTNode = currentTNode.parent;
        // `TNode.parent` includes the parent within the current view only. If it doesn't exist,
        // it means that we've hit the view boundary and we need to go up to the next view.
        if (!parentTNode) {
            // Before we go to the next LView, check if the token exists on the current embedded injector.
            const embeddedViewInjector = currentLView[EMBEDDED_VIEW_INJECTOR];
            if (embeddedViewInjector) {
                const embeddedViewInjectorValue = embeddedViewInjector.get(token, NOT_FOUND, flags);
                if (embeddedViewInjectorValue !== NOT_FOUND) {
                    return embeddedViewInjectorValue;
                }
            }
            // Otherwise keep going up the tree.
            parentTNode = getTNodeFromLView(currentLView);
            currentLView = currentLView[DECLARATION_VIEW];
        }
        currentTNode = parentTNode;
    }
    return notFoundValue;
}
/** Gets the TNode associated with an LView inside of the declaration view. */
function getTNodeFromLView(lView) {
    const tView = lView[TVIEW];
    const tViewType = tView.type;
    // The parent pointer differs based on `TView.type`.
    if (tViewType === 2 /* TViewType.Embedded */) {
        ngDevMode && assertDefined(tView.declTNode, 'Embedded TNodes should have declaration parents.');
        return tView.declTNode;
    }
    else if (tViewType === 1 /* TViewType.Component */) {
        // Components don't have `TView.declTNode` because each instance of component could be
        // inserted in different location, hence `TView.declTNode` is meaningless.
        return lView[T_HOST];
    }
    return null;
}

/**
 * Facade for the attribute injection from DI.
 *
 * @codeGenApi
 */
function ɵɵinjectAttribute(attrNameToInject) {
    return injectAttributeImpl(getCurrentTNode(), attrNameToInject);
}

/**
 * Attribute decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const Attribute = makeParamDecorator('Attribute', (attributeName) => ({
    attributeName,
    __NG_ELEMENT_ID__: () => ɵɵinjectAttribute(attributeName),
}));

let _reflect = null;
function getReflect() {
    return (_reflect = _reflect || new ReflectionCapabilities());
}
function reflectDependencies(type) {
    return convertDependencies(getReflect().parameters(type));
}
function convertDependencies(deps) {
    return deps.map((dep) => reflectDependency(dep));
}
function reflectDependency(dep) {
    const meta = {
        token: null,
        attribute: null,
        host: false,
        optional: false,
        self: false,
        skipSelf: false,
    };
    if (Array.isArray(dep) && dep.length > 0) {
        for (let j = 0; j < dep.length; j++) {
            const param = dep[j];
            if (param === undefined) {
                // param may be undefined if type of dep is not set by ngtsc
                continue;
            }
            const proto = Object.getPrototypeOf(param);
            if (param instanceof Optional || proto.ngMetadataName === 'Optional') {
                meta.optional = true;
            }
            else if (param instanceof SkipSelf || proto.ngMetadataName === 'SkipSelf') {
                meta.skipSelf = true;
            }
            else if (param instanceof Self || proto.ngMetadataName === 'Self') {
                meta.self = true;
            }
            else if (param instanceof Host || proto.ngMetadataName === 'Host') {
                meta.host = true;
            }
            else if (param instanceof Inject) {
                meta.token = param.token;
            }
            else if (param instanceof Attribute) {
                if (param.attributeName === undefined) {
                    throw new RuntimeError(204 /* RuntimeErrorCode.INVALID_INJECTION_TOKEN */, ngDevMode && `Attribute name must be defined.`);
                }
                meta.attribute = param.attributeName;
            }
            else {
                meta.token = param;
            }
        }
    }
    else if (dep === undefined || (Array.isArray(dep) && dep.length === 0)) {
        meta.token = null;
    }
    else {
        meta.token = dep;
    }
    return meta;
}

/**
 * Compile an Angular injectable according to its `Injectable` metadata, and patch the resulting
 * injectable def (`ɵprov`) onto the injectable type.
 */
function compileInjectable(type, meta) {
    let ngInjectableDef = null;
    let ngFactoryDef = null;
    // if NG_PROV_DEF is already defined on this class then don't overwrite it
    if (!type.hasOwnProperty(NG_PROV_DEF)) {
        Object.defineProperty(type, NG_PROV_DEF, {
            get: () => {
                if (ngInjectableDef === null) {
                    const compiler = getCompilerFacade({
                        usage: 0 /* JitCompilerUsage.Decorator */,
                        kind: 'injectable',
                        type,
                    });
                    ngInjectableDef = compiler.compileInjectable(angularCoreDiEnv, `ng:///${type.name}/ɵprov.js`, getInjectableMetadata(type, meta));
                }
                return ngInjectableDef;
            },
        });
    }
    // if NG_FACTORY_DEF is already defined on this class then don't overwrite it
    if (!type.hasOwnProperty(NG_FACTORY_DEF)) {
        Object.defineProperty(type, NG_FACTORY_DEF, {
            get: () => {
                if (ngFactoryDef === null) {
                    const compiler = getCompilerFacade({
                        usage: 0 /* JitCompilerUsage.Decorator */,
                        kind: 'injectable',
                        type,
                    });
                    ngFactoryDef = compiler.compileFactory(angularCoreDiEnv, `ng:///${type.name}/ɵfac.js`, {
                        name: type.name,
                        type,
                        typeArgumentCount: 0, // In JIT mode types are not available nor used.
                        deps: reflectDependencies(type),
                        target: compiler.FactoryTarget.Injectable,
                    });
                }
                return ngFactoryDef;
            },
            // Leave this configurable so that the factories from directives or pipes can take precedence.
            configurable: true,
        });
    }
}
const USE_VALUE = getClosureSafeProperty({
    provide: String,
    useValue: getClosureSafeProperty,
});
function isUseClassProvider(meta) {
    return meta.useClass !== undefined;
}
function isUseValueProvider(meta) {
    return USE_VALUE in meta;
}
function isUseFactoryProvider(meta) {
    return meta.useFactory !== undefined;
}
function isUseExistingProvider(meta) {
    return meta.useExisting !== undefined;
}
function getInjectableMetadata(type, srcMeta) {
    // Allow the compilation of a class with a `@Injectable()` decorator without parameters
    const meta = srcMeta || { providedIn: null };
    const compilerMeta = {
        name: type.name,
        type: type,
        typeArgumentCount: 0,
        providedIn: meta.providedIn,
    };
    if ((isUseClassProvider(meta) || isUseFactoryProvider(meta)) && meta.deps !== undefined) {
        compilerMeta.deps = convertDependencies(meta.deps);
    }
    // Check to see if the user explicitly provided a `useXxxx` property.
    if (isUseClassProvider(meta)) {
        compilerMeta.useClass = meta.useClass;
    }
    else if (isUseValueProvider(meta)) {
        compilerMeta.useValue = meta.useValue;
    }
    else if (isUseFactoryProvider(meta)) {
        compilerMeta.useFactory = meta.useFactory;
    }
    else if (isUseExistingProvider(meta)) {
        compilerMeta.useExisting = meta.useExisting;
    }
    return compilerMeta;
}

/**
 * Injectable decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const Injectable = makeDecorator('Injectable', undefined, undefined, undefined, (type, meta) => compileInjectable(type, meta));

/**
 * Create a new `Injector` which is configured using a `defType` of `InjectorType<any>`s.
 */
function createInjector(defType, parent = null, additionalProviders = null, name) {
    const injector = createInjectorWithoutInjectorInstances(defType, parent, additionalProviders, name);
    injector.resolveInjectorInitializers();
    return injector;
}
/**
 * Creates a new injector without eagerly resolving its injector types. Can be used in places
 * where resolving the injector types immediately can lead to an infinite loop. The injector types
 * should be resolved at a later point by calling `_resolveInjectorDefTypes`.
 */
function createInjectorWithoutInjectorInstances(defType, parent = null, additionalProviders = null, name, scopes = new Set()) {
    const providers = [additionalProviders || EMPTY_ARRAY, importProvidersFrom(defType)];
    name = name || (typeof defType === 'object' ? undefined : stringify(defType));
    return new R3Injector(providers, parent || getNullInjector(), name || null, scopes);
}

/**
 * Concrete injectors implement this interface. Injectors are configured
 * with [providers](guide/di/dependency-injection-providers) that associate
 * dependencies of various types with [injection tokens](guide/di/dependency-injection-providers).
 *
 * @see [DI Providers](guide/di/dependency-injection-providers).
 * @see {@link StaticProvider}
 *
 * @usageNotes
 *
 *  The following example creates a service injector instance.
 *
 * {@example core/di/ts/provider_spec.ts region='ConstructorProvider'}
 *
 * ### Usage example
 *
 * {@example core/di/ts/injector_spec.ts region='Injector'}
 *
 * `Injector` returns itself when given `Injector` as a token:
 *
 * {@example core/di/ts/injector_spec.ts region='injectInjector'}
 *
 * @publicApi
 */
class Injector {
    static THROW_IF_NOT_FOUND = THROW_IF_NOT_FOUND;
    static NULL = new NullInjector();
    static create(options, parent) {
        if (Array.isArray(options)) {
            return createInjector({ name: '' }, parent, options, '');
        }
        else {
            const name = options.name ?? '';
            return createInjector({ name }, options.parent, options.providers, name);
        }
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: Injector,
        providedIn: 'any',
        factory: () => ɵɵinject(INJECTOR$1),
    });
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ELEMENT_ID__ = -1 /* InjectorMarkers.Injector */;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Creates a token that can be used to inject static attributes of the host node.
 *
 * @usageNotes
 * ### Injecting an attribute that is known to exist
 * ```ts
 * @Directive()
 * class MyDir {
 *   attr: string = inject(new HostAttributeToken('some-attr'));
 * }
 * ```
 *
 * ### Optionally injecting an attribute
 * ```ts
 * @Directive()
 * class MyDir {
 *   attr: string | null = inject(new HostAttributeToken('some-attr'), {optional: true});
 * }
 * ```
 * @publicApi
 */
class HostAttributeToken {
    attributeName;
    constructor(attributeName) {
        this.attributeName = attributeName;
    }
    /** @internal */
    __NG_ELEMENT_ID__ = () => ɵɵinjectAttribute(this.attributeName);
    toString() {
        return `HostAttributeToken ${this.attributeName}`;
    }
}

/**
 * A token that can be used to inject the tag name of the host node.
 *
 * @usageNotes
 * ### Injecting a tag name that is known to exist
 * ```ts
 * @Directive()
 * class MyDir {
 *   tagName: string = inject(HOST_TAG_NAME);
 * }
 * ```
 *
 * ### Optionally injecting a tag name
 * ```ts
 * @Directive()
 * class MyDir {
 *   tagName: string | null = inject(HOST_TAG_NAME, {optional: true});
 * }
 * ```
 * @publicApi
 */
const HOST_TAG_NAME = new InjectionToken(ngDevMode ? 'HOST_TAG_NAME' : '');
// HOST_TAG_NAME should be resolved at the current node, similar to e.g. ElementRef,
// so we manually specify __NG_ELEMENT_ID__ here, instead of using a factory.
// tslint:disable-next-line:no-toplevel-property-access
HOST_TAG_NAME.__NG_ELEMENT_ID__ = (flags) => {
    const tNode = getCurrentTNode();
    if (tNode === null) {
        throw new RuntimeError(204 /* RuntimeErrorCode.INVALID_INJECTION_TOKEN */, ngDevMode &&
            'HOST_TAG_NAME can only be injected in directives and components ' +
                'during construction time (in a class constructor or as a class field initializer)');
    }
    if (tNode.type & 2 /* TNodeType.Element */) {
        return tNode.value;
    }
    if (flags & InjectFlags.Optional) {
        return null;
    }
    throw new RuntimeError(204 /* RuntimeErrorCode.INVALID_INJECTION_TOKEN */, ngDevMode &&
        `HOST_TAG_NAME was used on ${getDevModeNodeName(tNode)} which doesn't have an underlying element in the DOM. ` +
            `This is invalid, and so the dependency should be marked as optional.`);
};
function getDevModeNodeName(tNode) {
    if (tNode.type & 8 /* TNodeType.ElementContainer */) {
        return 'an <ng-container>';
    }
    else if (tNode.type & 4 /* TNodeType.Container */) {
        return 'an <ng-template>';
    }
    else if (tNode.type & 128 /* TNodeType.LetDeclaration */) {
        return 'an @let declaration';
    }
    else {
        return 'a node';
    }
}

const SCHEDULE_IN_ROOT_ZONE_DEFAULT = false;

/**
 * `DestroyRef` lets you set callbacks to run for any cleanup or destruction behavior.
 * The scope of this destruction depends on where `DestroyRef` is injected. If `DestroyRef`
 * is injected in a component or directive, the callbacks run when that component or
 * directive is destroyed. Otherwise the callbacks run when a corresponding injector is destroyed.
 *
 * @publicApi
 */
class DestroyRef {
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ELEMENT_ID__ = injectDestroyRef;
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ENV_ID__ = (injector) => injector;
}
class NodeInjectorDestroyRef extends DestroyRef {
    _lView;
    constructor(_lView) {
        super();
        this._lView = _lView;
    }
    onDestroy(callback) {
        const lView = this._lView;
        // Checking if `lView` is already destroyed before storing the `callback` enhances
        // safety and integrity for applications.
        // If `lView` is destroyed, we call the `callback` immediately to ensure that
        // any necessary cleanup is handled gracefully.
        // With this approach, we're providing better reliability in managing resources.
        // One of the use cases is `takeUntilDestroyed`, which aims to replace `takeUntil`
        // in existing applications. While `takeUntil` can be safely called once the view
        // is destroyed — resulting in no errors and finalizing the subscription depending
        // on whether a subject or replay subject is used, replacing it with
        // `takeUntilDestroyed` introduces a breaking change, as it throws an error if
        // the `lView` is destroyed (https://github.com/angular/angular/issues/54527).
        if (isDestroyed(lView)) {
            callback();
            // We return a "noop" callback, which, when executed, does nothing because
            // we haven't stored anything on the `lView`, and thus there's nothing to remove.
            return () => { };
        }
        storeLViewOnDestroy(lView, callback);
        return () => removeLViewOnDestroy(lView, callback);
    }
}
function injectDestroyRef() {
    return new NodeInjectorDestroyRef(getLView());
}

/**
 * Injectable that is notified when an `LView` is made aware of changes to application state.
 */
class ChangeDetectionScheduler {
}
/** Token used to indicate if zoneless was enabled via provideZonelessChangeDetection(). */
const ZONELESS_ENABLED = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'Zoneless enabled' : '', { providedIn: 'root', factory: () => false });
/** Token used to indicate `provideExperimentalZonelessChangeDetection` was used. */
const PROVIDED_ZONELESS = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'Zoneless provided' : '', { providedIn: 'root', factory: () => false });
const ZONELESS_SCHEDULER_DISABLED = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'scheduler disabled' : '');
// TODO(atscott): Remove in v19. Scheduler should be done with runOutsideAngular.
const SCHEDULE_IN_ROOT_ZONE = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'run changes outside zone in root' : '');

/**
 * Internal implementation of the pending tasks service.
 */
class PendingTasksInternal {
    taskId = 0;
    pendingTasks = new Set();
    get _hasPendingTasks() {
        return this.hasPendingTasks.value;
    }
    hasPendingTasks = new BehaviorSubject(false);
    add() {
        if (!this._hasPendingTasks) {
            this.hasPendingTasks.next(true);
        }
        const taskId = this.taskId++;
        this.pendingTasks.add(taskId);
        return taskId;
    }
    has(taskId) {
        return this.pendingTasks.has(taskId);
    }
    remove(taskId) {
        this.pendingTasks.delete(taskId);
        if (this.pendingTasks.size === 0 && this._hasPendingTasks) {
            this.hasPendingTasks.next(false);
        }
    }
    ngOnDestroy() {
        this.pendingTasks.clear();
        if (this._hasPendingTasks) {
            this.hasPendingTasks.next(false);
        }
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: PendingTasksInternal,
        providedIn: 'root',
        factory: () => new PendingTasksInternal(),
    });
}
/**
 * Service that keeps track of pending tasks contributing to the stableness of Angular
 * application. While several existing Angular services (ex.: `HttpClient`) will internally manage
 * tasks influencing stability, this API gives control over stability to library and application
 * developers for specific cases not covered by Angular internals.
 *
 * The concept of stability comes into play in several important scenarios:
 * - SSR process needs to wait for the application stability before serializing and sending rendered
 * HTML;
 * - tests might want to delay assertions until the application becomes stable;
 *
 * @usageNotes
 * ```ts
 * const pendingTasks = inject(PendingTasks);
 * const taskCleanup = pendingTasks.add();
 * // do work that should block application's stability and then:
 * taskCleanup();
 * ```
 *
 * @publicApi
 * @developerPreview
 */
class PendingTasks {
    internalPendingTasks = inject(PendingTasksInternal);
    scheduler = inject(ChangeDetectionScheduler);
    /**
     * Adds a new task that should block application's stability.
     * @returns A cleanup function that removes a task when called.
     */
    add() {
        const taskId = this.internalPendingTasks.add();
        return () => {
            if (!this.internalPendingTasks.has(taskId)) {
                // This pending task has already been cleared.
                return;
            }
            // Notifying the scheduler will hold application stability open until the next tick.
            this.scheduler.notify(11 /* NotificationSource.PendingTaskRemoved */);
            this.internalPendingTasks.remove(taskId);
        };
    }
    /**
     * Runs an asynchronous function and blocks the application's stability until the function completes.
     *
     * ```ts
     * pendingTasks.run(async () => {
     *   const userData = await fetch('/api/user');
     *   this.userData.set(userData);
     * });
     * ```
     *
     * Application stability is at least delayed until the next tick after the `run` method resolves
     * so it is safe to make additional updates to application state that would require UI synchronization:
     *
     * ```ts
     * const userData = await pendingTasks.run(() => fetch('/api/user'));
     * this.userData.set(userData);
     * ```
     *
     * @param fn The asynchronous function to execute
     */
    async run(fn) {
        const removeTask = this.add();
        try {
            return await fn();
        }
        finally {
            removeTask();
        }
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: PendingTasks,
        providedIn: 'root',
        factory: () => new PendingTasks(),
    });
}

class EventEmitter_ extends Subject {
    // tslint:disable-next-line:require-internal-with-underscore
    __isAsync;
    destroyRef = undefined;
    pendingTasks = undefined;
    constructor(isAsync = false) {
        super();
        this.__isAsync = isAsync;
        // Attempt to retrieve a `DestroyRef` and `PendingTasks` optionally.
        // For backwards compatibility reasons, this cannot be required.
        if (isInInjectionContext()) {
            // `DestroyRef` is optional because it is not available in all contexts.
            // But it is useful to properly complete the `EventEmitter` if used with `outputToObservable`
            // when the component/directive is destroyed. (See `outputToObservable` for more details.)
            this.destroyRef = inject(DestroyRef, { optional: true }) ?? undefined;
            this.pendingTasks = inject(PendingTasksInternal, { optional: true }) ?? undefined;
        }
    }
    emit(value) {
        const prevConsumer = setActiveConsumer$1(null);
        try {
            super.next(value);
        }
        finally {
            setActiveConsumer$1(prevConsumer);
        }
    }
    subscribe(observerOrNext, error, complete) {
        let nextFn = observerOrNext;
        let errorFn = error || (() => null);
        let completeFn = complete;
        if (observerOrNext && typeof observerOrNext === 'object') {
            const observer = observerOrNext;
            nextFn = observer.next?.bind(observer);
            errorFn = observer.error?.bind(observer);
            completeFn = observer.complete?.bind(observer);
        }
        if (this.__isAsync) {
            errorFn = this.wrapInTimeout(errorFn);
            if (nextFn) {
                nextFn = this.wrapInTimeout(nextFn);
            }
            if (completeFn) {
                completeFn = this.wrapInTimeout(completeFn);
            }
        }
        const sink = super.subscribe({ next: nextFn, error: errorFn, complete: completeFn });
        if (observerOrNext instanceof Subscription) {
            observerOrNext.add(sink);
        }
        return sink;
    }
    wrapInTimeout(fn) {
        return (value) => {
            const taskId = this.pendingTasks?.add();
            setTimeout(() => {
                try {
                    fn(value);
                }
                finally {
                    if (taskId !== undefined) {
                        this.pendingTasks?.remove(taskId);
                    }
                }
            });
        };
    }
}
/**
 * @publicApi
 */
const EventEmitter = EventEmitter_;

function noop(...args) {
    // Do nothing.
}

/**
 * Gets a scheduling function that runs the callback after the first of setTimeout and
 * requestAnimationFrame resolves.
 *
 * - `requestAnimationFrame` ensures that change detection runs ahead of a browser repaint.
 * This ensures that the create and update passes of a change detection always happen
 * in the same frame.
 * - When the browser is resource-starved, `rAF` can execute _before_ a `setTimeout` because
 * rendering is a very high priority process. This means that `setTimeout` cannot guarantee
 * same-frame create and update pass, when `setTimeout` is used to schedule the update phase.
 * - While `rAF` gives us the desirable same-frame updates, it has two limitations that
 * prevent it from being used alone. First, it does not run in background tabs, which would
 * prevent Angular from initializing an application when opened in a new tab (for example).
 * Second, repeated calls to requestAnimationFrame will execute at the refresh rate of the
 * hardware (~16ms for a 60Hz display). This would cause significant slowdown of tests that
 * are written with several updates and asserts in the form of "update; await stable; assert;".
 * - Both `setTimeout` and `rAF` are able to "coalesce" several events from a single user
 * interaction into a single change detection. Importantly, this reduces view tree traversals when
 * compared to an alternative timing mechanism like `queueMicrotask`, where change detection would
 * then be interleaves between each event.
 *
 * By running change detection after the first of `setTimeout` and `rAF` to execute, we get the
 * best of both worlds.
 *
 * @returns a function to cancel the scheduled callback
 */
function scheduleCallbackWithRafRace(callback) {
    let timeoutId;
    let animationFrameId;
    function cleanup() {
        callback = noop;
        try {
            if (animationFrameId !== undefined && typeof cancelAnimationFrame === 'function') {
                cancelAnimationFrame(animationFrameId);
            }
            if (timeoutId !== undefined) {
                clearTimeout(timeoutId);
            }
        }
        catch {
            // Clearing/canceling can fail in tests due to the timing of functions being patched and unpatched
            // Just ignore the errors - we protect ourselves from this issue by also making the callback a no-op.
        }
    }
    timeoutId = setTimeout(() => {
        callback();
        cleanup();
    });
    if (typeof requestAnimationFrame === 'function') {
        animationFrameId = requestAnimationFrame(() => {
            callback();
            cleanup();
        });
    }
    return () => cleanup();
}
function scheduleCallbackWithMicrotask(callback) {
    queueMicrotask(() => callback());
    return () => {
        callback = noop;
    };
}

class AsyncStackTaggingZoneSpec {
    createTask;
    constructor(namePrefix, consoleAsyncStackTaggingImpl = console) {
        this.name = 'asyncStackTagging for ' + namePrefix;
        this.createTask = consoleAsyncStackTaggingImpl?.createTask ?? (() => null);
    }
    // ZoneSpec implementation below.
    name;
    onScheduleTask(delegate, _current, target, task) {
        task.consoleTask = this.createTask(`Zone - ${task.source || task.type}`);
        return delegate.scheduleTask(target, task);
    }
    onInvokeTask(delegate, _currentZone, targetZone, task, applyThis, applyArgs) {
        let ret;
        if (task.consoleTask) {
            ret = task.consoleTask.run(() => delegate.invokeTask(targetZone, task, applyThis, applyArgs));
        }
        else {
            ret = delegate.invokeTask(targetZone, task, applyThis, applyArgs);
        }
        return ret;
    }
}

const isAngularZoneProperty = 'isAngularZone';
const angularZoneInstanceIdProperty = isAngularZoneProperty + '_ID';
let ngZoneInstanceId = 0;
/**
 * An injectable service for executing work inside or outside of the Angular zone.
 *
 * The most common use of this service is to optimize performance when starting a work consisting of
 * one or more asynchronous tasks that don't require UI updates or error handling to be handled by
 * Angular. Such tasks can be kicked off via {@link #runOutsideAngular} and if needed, these tasks
 * can reenter the Angular zone via {@link #run}.
 *
 * <!-- TODO: add/fix links to:
 *   - docs explaining zones and the use of zones in Angular and change-detection
 *   - link to runOutsideAngular/run (throughout this file!)
 *   -->
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import {Component, NgZone} from '@angular/core';
 * import {NgIf} from '@angular/common';
 *
 * @Component({
 *   selector: 'ng-zone-demo',
 *   template: `
 *     <h2>Demo: NgZone</h2>
 *
 *     <p>Progress: {{progress}}%</p>
 *     <p *ngIf="progress >= 100">Done processing {{label}} of Angular zone!</p>
 *
 *     <button (click)="processWithinAngularZone()">Process within Angular zone</button>
 *     <button (click)="processOutsideOfAngularZone()">Process outside of Angular zone</button>
 *   `,
 * })
 * export class NgZoneDemo {
 *   progress: number = 0;
 *   label: string;
 *
 *   constructor(private _ngZone: NgZone) {}
 *
 *   // Loop inside the Angular zone
 *   // so the UI DOES refresh after each setTimeout cycle
 *   processWithinAngularZone() {
 *     this.label = 'inside';
 *     this.progress = 0;
 *     this._increaseProgress(() => console.log('Inside Done!'));
 *   }
 *
 *   // Loop outside of the Angular zone
 *   // so the UI DOES NOT refresh after each setTimeout cycle
 *   processOutsideOfAngularZone() {
 *     this.label = 'outside';
 *     this.progress = 0;
 *     this._ngZone.runOutsideAngular(() => {
 *       this._increaseProgress(() => {
 *         // reenter the Angular zone and display done
 *         this._ngZone.run(() => { console.log('Outside Done!'); });
 *       });
 *     });
 *   }
 *
 *   _increaseProgress(doneCallback: () => void) {
 *     this.progress += 1;
 *     console.log(`Current progress: ${this.progress}%`);
 *
 *     if (this.progress < 100) {
 *       window.setTimeout(() => this._increaseProgress(doneCallback), 10);
 *     } else {
 *       doneCallback();
 *     }
 *   }
 * }
 * ```
 *
 * @publicApi
 */
class NgZone {
    hasPendingMacrotasks = false;
    hasPendingMicrotasks = false;
    /**
     * Whether there are no outstanding microtasks or macrotasks.
     */
    isStable = true;
    /**
     * Notifies when code enters Angular Zone. This gets fired first on VM Turn.
     */
    onUnstable = new EventEmitter(false);
    /**
     * Notifies when there is no more microtasks enqueued in the current VM Turn.
     * This is a hint for Angular to do change detection, which may enqueue more microtasks.
     * For this reason this event can fire multiple times per VM Turn.
     */
    onMicrotaskEmpty = new EventEmitter(false);
    /**
     * Notifies when the last `onMicrotaskEmpty` has run and there are no more microtasks, which
     * implies we are about to relinquish VM turn.
     * This event gets called just once.
     */
    onStable = new EventEmitter(false);
    /**
     * Notifies that an error has been delivered.
     */
    onError = new EventEmitter(false);
    constructor(options) {
        const { enableLongStackTrace = false, shouldCoalesceEventChangeDetection = false, shouldCoalesceRunChangeDetection = false, scheduleInRootZone = SCHEDULE_IN_ROOT_ZONE_DEFAULT, } = options;
        if (typeof Zone == 'undefined') {
            throw new RuntimeError(908 /* RuntimeErrorCode.MISSING_ZONEJS */, ngDevMode && `In this configuration Angular requires Zone.js`);
        }
        Zone.assertZonePatched();
        const self = this;
        self._nesting = 0;
        self._outer = self._inner = Zone.current;
        // AsyncStackTaggingZoneSpec provides `linked stack traces` to show
        // where the async operation is scheduled. For more details, refer
        // to this article, https://developer.chrome.com/blog/devtools-better-angular-debugging/
        // And we only import this AsyncStackTaggingZoneSpec in development mode,
        // in the production mode, the AsyncStackTaggingZoneSpec will be tree shaken away.
        if (ngDevMode) {
            self._inner = self._inner.fork(new AsyncStackTaggingZoneSpec('Angular'));
        }
        if (Zone['TaskTrackingZoneSpec']) {
            self._inner = self._inner.fork(new Zone['TaskTrackingZoneSpec']());
        }
        if (enableLongStackTrace && Zone['longStackTraceZoneSpec']) {
            self._inner = self._inner.fork(Zone['longStackTraceZoneSpec']);
        }
        // if shouldCoalesceRunChangeDetection is true, all tasks including event tasks will be
        // coalesced, so shouldCoalesceEventChangeDetection option is not necessary and can be skipped.
        self.shouldCoalesceEventChangeDetection =
            !shouldCoalesceRunChangeDetection && shouldCoalesceEventChangeDetection;
        self.shouldCoalesceRunChangeDetection = shouldCoalesceRunChangeDetection;
        self.callbackScheduled = false;
        self.scheduleInRootZone = scheduleInRootZone;
        forkInnerZoneWithAngularBehavior(self);
    }
    /**
      This method checks whether the method call happens within an Angular Zone instance.
    */
    static isInAngularZone() {
        // Zone needs to be checked, because this method might be called even when NoopNgZone is used.
        return typeof Zone !== 'undefined' && Zone.current.get(isAngularZoneProperty) === true;
    }
    /**
      Assures that the method is called within the Angular Zone, otherwise throws an error.
    */
    static assertInAngularZone() {
        if (!NgZone.isInAngularZone()) {
            throw new RuntimeError(909 /* RuntimeErrorCode.UNEXPECTED_ZONE_STATE */, ngDevMode && 'Expected to be in Angular Zone, but it is not!');
        }
    }
    /**
      Assures that the method is called outside of the Angular Zone, otherwise throws an error.
    */
    static assertNotInAngularZone() {
        if (NgZone.isInAngularZone()) {
            throw new RuntimeError(909 /* RuntimeErrorCode.UNEXPECTED_ZONE_STATE */, ngDevMode && 'Expected to not be in Angular Zone, but it is!');
        }
    }
    /**
     * Executes the `fn` function synchronously within the Angular zone and returns value returned by
     * the function.
     *
     * Running functions via `run` allows you to reenter Angular zone from a task that was executed
     * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
     *
     * Any future tasks or microtasks scheduled from within this function will continue executing from
     * within the Angular zone.
     *
     * If a synchronous error happens it will be rethrown and not reported via `onError`.
     */
    run(fn, applyThis, applyArgs) {
        return this._inner.run(fn, applyThis, applyArgs);
    }
    /**
     * Executes the `fn` function synchronously within the Angular zone as a task and returns value
     * returned by the function.
     *
     * Running functions via `runTask` allows you to reenter Angular zone from a task that was executed
     * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
     *
     * Any future tasks or microtasks scheduled from within this function will continue executing from
     * within the Angular zone.
     *
     * If a synchronous error happens it will be rethrown and not reported via `onError`.
     */
    runTask(fn, applyThis, applyArgs, name) {
        const zone = this._inner;
        const task = zone.scheduleEventTask('NgZoneEvent: ' + name, fn, EMPTY_PAYLOAD, noop, noop);
        try {
            return zone.runTask(task, applyThis, applyArgs);
        }
        finally {
            zone.cancelTask(task);
        }
    }
    /**
     * Same as `run`, except that synchronous errors are caught and forwarded via `onError` and not
     * rethrown.
     */
    runGuarded(fn, applyThis, applyArgs) {
        return this._inner.runGuarded(fn, applyThis, applyArgs);
    }
    /**
     * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by
     * the function.
     *
     * Running functions via {@link #runOutsideAngular} allows you to escape Angular's zone and do
     * work that
     * doesn't trigger Angular change-detection or is subject to Angular's error handling.
     *
     * Any future tasks or microtasks scheduled from within this function will continue executing from
     * outside of the Angular zone.
     *
     * Use {@link #run} to reenter the Angular zone and do work that updates the application model.
     */
    runOutsideAngular(fn) {
        return this._outer.run(fn);
    }
}
const EMPTY_PAYLOAD = {};
function checkStable(zone) {
    // TODO: @JiaLiPassion, should check zone.isCheckStableRunning to prevent
    // re-entry. The case is:
    //
    // @Component({...})
    // export class AppComponent {
    // constructor(private ngZone: NgZone) {
    //   this.ngZone.onStable.subscribe(() => {
    //     this.ngZone.run(() => console.log('stable'););
    //   });
    // }
    //
    // The onStable subscriber run another function inside ngZone
    // which causes `checkStable()` re-entry.
    // But this fix causes some issues in g3, so this fix will be
    // launched in another PR.
    if (zone._nesting == 0 && !zone.hasPendingMicrotasks && !zone.isStable) {
        try {
            zone._nesting++;
            zone.onMicrotaskEmpty.emit(null);
        }
        finally {
            zone._nesting--;
            if (!zone.hasPendingMicrotasks) {
                try {
                    zone.runOutsideAngular(() => zone.onStable.emit(null));
                }
                finally {
                    zone.isStable = true;
                }
            }
        }
    }
}
function delayChangeDetectionForEvents(zone) {
    /**
     * We also need to check _nesting here
     * Consider the following case with shouldCoalesceRunChangeDetection = true
     *
     * ngZone.run(() => {});
     * ngZone.run(() => {});
     *
     * We want the two `ngZone.run()` only trigger one change detection
     * when shouldCoalesceRunChangeDetection is true.
     * And because in this case, change detection run in async way(requestAnimationFrame),
     * so we also need to check the _nesting here to prevent multiple
     * change detections.
     */
    if (zone.isCheckStableRunning || zone.callbackScheduled) {
        return;
    }
    zone.callbackScheduled = true;
    function scheduleCheckStable() {
        scheduleCallbackWithRafRace(() => {
            zone.callbackScheduled = false;
            updateMicroTaskStatus(zone);
            zone.isCheckStableRunning = true;
            checkStable(zone);
            zone.isCheckStableRunning = false;
        });
    }
    if (zone.scheduleInRootZone) {
        Zone.root.run(() => {
            scheduleCheckStable();
        });
    }
    else {
        zone._outer.run(() => {
            scheduleCheckStable();
        });
    }
    updateMicroTaskStatus(zone);
}
function forkInnerZoneWithAngularBehavior(zone) {
    const delayChangeDetectionForEventsDelegate = () => {
        delayChangeDetectionForEvents(zone);
    };
    const instanceId = ngZoneInstanceId++;
    zone._inner = zone._inner.fork({
        name: 'angular',
        properties: {
            [isAngularZoneProperty]: true,
            [angularZoneInstanceIdProperty]: instanceId,
            [angularZoneInstanceIdProperty + instanceId]: true,
        },
        onInvokeTask: (delegate, current, target, task, applyThis, applyArgs) => {
            // Prevent triggering change detection when the flag is detected.
            if (shouldBeIgnoredByZone(applyArgs)) {
                return delegate.invokeTask(target, task, applyThis, applyArgs);
            }
            try {
                onEnter(zone);
                return delegate.invokeTask(target, task, applyThis, applyArgs);
            }
            finally {
                if ((zone.shouldCoalesceEventChangeDetection && task.type === 'eventTask') ||
                    zone.shouldCoalesceRunChangeDetection) {
                    delayChangeDetectionForEventsDelegate();
                }
                onLeave(zone);
            }
        },
        onInvoke: (delegate, current, target, callback, applyThis, applyArgs, source) => {
            try {
                onEnter(zone);
                return delegate.invoke(target, callback, applyThis, applyArgs, source);
            }
            finally {
                if (zone.shouldCoalesceRunChangeDetection &&
                    // Do not delay change detection when the task is the scheduler's tick.
                    // We need to synchronously trigger the stability logic so that the
                    // zone-based scheduler can prevent a duplicate ApplicationRef.tick
                    // by first checking if the scheduler tick is running. This does seem a bit roundabout,
                    // but we _do_ still want to trigger all the correct events when we exit the zone.run
                    // (`onMicrotaskEmpty` and `onStable` _should_ emit; developers can have code which
                    // relies on these events happening after change detection runs).
                    // Note: `zone.callbackScheduled` is already in delayChangeDetectionForEventsDelegate
                    // but is added here as well to prevent reads of applyArgs when not necessary
                    !zone.callbackScheduled &&
                    !isSchedulerTick(applyArgs)) {
                    delayChangeDetectionForEventsDelegate();
                }
                onLeave(zone);
            }
        },
        onHasTask: (delegate, current, target, hasTaskState) => {
            delegate.hasTask(target, hasTaskState);
            if (current === target) {
                // We are only interested in hasTask events which originate from our zone
                // (A child hasTask event is not interesting to us)
                if (hasTaskState.change == 'microTask') {
                    zone._hasPendingMicrotasks = hasTaskState.microTask;
                    updateMicroTaskStatus(zone);
                    checkStable(zone);
                }
                else if (hasTaskState.change == 'macroTask') {
                    zone.hasPendingMacrotasks = hasTaskState.macroTask;
                }
            }
        },
        onHandleError: (delegate, current, target, error) => {
            delegate.handleError(target, error);
            zone.runOutsideAngular(() => zone.onError.emit(error));
            return false;   
        },
    });
}
function updateMicroTaskStatus(zone) {
    if (zone._hasPendingMicrotasks ||
        ((zone.shouldCoalesceEventChangeDetection || zone.shouldCoalesceRunChangeDetection) &&
            zone.callbackScheduled === true)) {
        zone.hasPendingMicrotasks = true;
    }
    else {
        zone.hasPendingMicrotasks = false;
    }
}
function onEnter(zone) {
    zone._nesting++;
    if (zone.isStable) {
        zone.isStable = false;
        zone.onUnstable.emit(null);
    }
}
function onLeave(zone) {
    zone._nesting--;
    checkStable(zone);
}
/**
 * Provides a noop implementation of `NgZone` which does nothing. This zone requires explicit calls
 * to framework to perform rendering.
 */
class NoopNgZone {
    hasPendingMicrotasks = false;
    hasPendingMacrotasks = false;
    isStable = true;
    onUnstable = new EventEmitter();
    onMicrotaskEmpty = new EventEmitter();
    onStable = new EventEmitter();
    onError = new EventEmitter();
    run(fn, applyThis, applyArgs) {
        return fn.apply(applyThis, applyArgs);
    }
    runGuarded(fn, applyThis, applyArgs) {
        return fn.apply(applyThis, applyArgs);
    }
    runOutsideAngular(fn) {
        return fn();
    }
    runTask(fn, applyThis, applyArgs, name) {
        return fn.apply(applyThis, applyArgs);
    }
}
function shouldBeIgnoredByZone(applyArgs) {
    return hasApplyArgsData(applyArgs, '__ignore_ng_zone__');
}
function isSchedulerTick(applyArgs) {
    return hasApplyArgsData(applyArgs, '__scheduler_tick__');
}
function hasApplyArgsData(applyArgs, key) {
    if (!Array.isArray(applyArgs)) {
        return false;
    }
    // We should only ever get 1 arg passed through to invokeTask.
    // Short circuit here incase that behavior changes.
    if (applyArgs.length !== 1) {
        return false;
    }
    return applyArgs[0]?.data?.[key] === true;
}
function getNgZone(ngZoneToUse = 'zone.js', options) {
    if (ngZoneToUse === 'noop') {
        return new NoopNgZone();
    }
    if (ngZoneToUse === 'zone.js') {
        return new NgZone(options);
    }
    return ngZoneToUse;
}

/**
 * Provides a hook for centralized exception handling.
 *
 * The default implementation of `ErrorHandler` prints error messages to the `console`. To
 * intercept error handling, write a custom exception handler that replaces this default as
 * appropriate for your app.
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * class MyErrorHandler implements ErrorHandler {
 *   handleError(error) {
 *     // do something with the exception
 *   }
 * }
 *
 * // Provide in standalone apps
 * bootstrapApplication(AppComponent, {
 *   providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
 * })
 *
 * // Provide in module-based apps
 * @NgModule({
 *   providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
 * })
 * class MyModule {}
 * ```
 *
 * @publicApi
 */
class ErrorHandler {
    /**
     * @internal
     */
    _console = console;
    handleError(error) {
        this._console.error('ERROR', error);
    }
}
/**
 * `InjectionToken` used to configure how to call the `ErrorHandler`.
 *
 * `NgZone` is provided by default today so the default (and only) implementation for this
 * is calling `ErrorHandler.handleError` outside of the Angular zone.
 */
const INTERNAL_APPLICATION_ERROR_HANDLER = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'internal error handler' : '', {
    providedIn: 'root',
    factory: () => {
        const zone = inject(NgZone);
        const userErrorHandler = inject(ErrorHandler);
        return (e) => zone.runOutsideAngular(() => userErrorHandler.handleError(e));
    },
});

/**
 * An `OutputEmitterRef` is created by the `output()` function and can be
 * used to emit values to consumers of your directive or component.
 *
 * Consumers of your directive/component can bind to the output and
 * subscribe to changes via the bound event syntax. For example:
 *
 * ```html
 * <my-comp (valueChange)="processNewValue($event)" />
 * ```
 *
 * @publicAPI
 */
class OutputEmitterRef {
    destroyed = false;
    listeners = null;
    errorHandler = inject(ErrorHandler, { optional: true });
    /** @internal */
    destroyRef = inject(DestroyRef);
    constructor() {
        // Clean-up all listeners and mark as destroyed upon destroy.
        this.destroyRef.onDestroy(() => {
            this.destroyed = true;
            this.listeners = null;
        });
    }
    subscribe(callback) {
        if (this.destroyed) {
            throw new RuntimeError(953 /* RuntimeErrorCode.OUTPUT_REF_DESTROYED */, ngDevMode &&
                'Unexpected subscription to destroyed `OutputRef`. ' +
                    'The owning directive/component is destroyed.');
        }
        (this.listeners ??= []).push(callback);
        return {
            unsubscribe: () => {
                const idx = this.listeners?.indexOf(callback);
                if (idx !== undefined && idx !== -1) {
                    this.listeners?.splice(idx, 1);
                }
            },
        };
    }
    /** Emits a new value to the output. */
    emit(value) {
        if (this.destroyed) {
            console.warn(formatRuntimeError(953 /* RuntimeErrorCode.OUTPUT_REF_DESTROYED */, ngDevMode &&
                'Unexpected emit for destroyed `OutputRef`. ' +
                    'The owning directive/component is destroyed.'));
            return;
        }
        if (this.listeners === null) {
            return;
        }
        const previousConsumer = setActiveConsumer$1(null);
        try {
            for (const listenerFn of this.listeners) {
                try {
                    listenerFn(value);
                }
                catch (err) {
                    this.errorHandler?.handleError(err);
                }
            }
        }
        finally {
            setActiveConsumer$1(previousConsumer);
        }
    }
}
/** Gets the owning `DestroyRef` for the given output. */
function getOutputDestroyRef(ref) {
    return ref.destroyRef;
}

/**
 * The `output` function allows declaration of Angular outputs in
 * directives and components.
 *
 * You can use outputs to emit values to parent directives and component.
 * Parents can subscribe to changes via:
 *
 * - template event bindings. For example, `(myOutput)="doSomething($event)"`
 * - programmatic subscription by using `OutputRef#subscribe`.
 *
 * @usageNotes
 *
 * To use `output()`, import the function from `@angular/core`.
 *
 * ```ts
 * import {output} from '@angular/core';
 * ```
 *
 * Inside your component, introduce a new class member and initialize
 * it with a call to `output`.
 *
 * ```ts
 * @Directive({
 *   ...
 * })
 * export class MyDir {
 *   nameChange = output<string>();    // OutputEmitterRef<string>
 *   onClick    = output();            // OutputEmitterRef<void>
 * }
 * ```
 *
 * You can emit values to consumers of your directive, by using
 * the `emit` method from `OutputEmitterRef`.
 *
 * ```ts
 * updateName(newName: string): void {
 *   this.nameChange.emit(newName);
 * }
 * ```
 * @initializerApiFunction {"showTypesInSignaturePreview": true}
 * @publicAPI
 */
function output(opts) {
    ngDevMode && assertInInjectionContext(output);
    return new OutputEmitterRef();
}

function inputFunction(initialValue, opts) {
    ngDevMode && assertInInjectionContext(input);
    return createInputSignal(initialValue, opts);
}
function inputRequiredFunction(opts) {
    ngDevMode && assertInInjectionContext(input);
    return createInputSignal(REQUIRED_UNSET_VALUE, opts);
}
/**
 * The `input` function allows declaration of Angular inputs in directives
 * and components.
 *
 * There are two variants of inputs that can be declared:
 *
 *   1. **Optional inputs** with an initial value.
 *   2. **Required inputs** that consumers need to set.
 *
 * By default, the `input` function will declare optional inputs that
 * always have an initial value. Required inputs can be declared
 * using the `input.required()` function.
 *
 * Inputs are signals. The values of an input are exposed as a `Signal`.
 * The signal always holds the latest value of the input that is bound
 * from the parent.
 *
 * @usageNotes
 * To use signal-based inputs, import `input` from `@angular/core`.
 *
 * ```ts
 * import {input} from '@angular/core`;
 * ```
 *
 * Inside your component, introduce a new class member and initialize
 * it with a call to `input` or `input.required`.
 *
 * ```ts
 * @Component({
 *   ...
 * })
 * export class UserProfileComponent {
 *   firstName = input<string>();             // Signal<string|undefined>
 *   lastName  = input.required<string>();    // Signal<string>
 *   age       = input(0)                     // Signal<number>
 * }
 * ```
 *
 * Inside your component template, you can display values of the inputs
 * by calling the signal.
 *
 * ```html
 * <span>{{firstName()}}</span>
 * ```
 *
 * @publicAPI
 * @initializerApiFunction
 */
const input = (() => {
    // Note: This may be considered a side-effect, but nothing will depend on
    // this assignment, unless this `input` constant export is accessed. It's a
    // self-contained side effect that is local to the user facing`input` export.
    inputFunction.required = inputRequiredFunction;
    return inputFunction;
})();

/**
 * Creates an ElementRef from the most recent node.
 *
 * @returns The ElementRef instance to use
 */
function injectElementRef() {
    return createElementRef(getCurrentTNode(), getLView());
}
/**
 * Creates an ElementRef given a node.
 *
 * @param tNode The node for which you'd like an ElementRef
 * @param lView The view to which the node belongs
 * @returns The ElementRef instance to use
 */
function createElementRef(tNode, lView) {
    return new ElementRef(getNativeByTNode(tNode, lView));
}
/**
 * A wrapper around a native element inside of a View.
 *
 * An `ElementRef` is backed by a render-specific element. In the browser, this is usually a DOM
 * element.
 *
 * @security Permitting direct access to the DOM can make your application more vulnerable to
 * XSS attacks. Carefully review any use of `ElementRef` in your code. For more detail, see the
 * [Security Guide](https://g.co/ng/security).
 *
 * @publicApi
 */
// Note: We don't expose things like `Injector`, `ViewContainer`, ... here,
// i.e. users have to ask for what they need. With that, we can build better analysis tools
// and could do better codegen in the future.
class ElementRef {
    /**
     * <div class="docs-alert docs-alert-important">
     *   <header>Use with caution</header>
     *   <p>
     *    Use this API as the last resort when direct access to DOM is needed. Use templating and
     *    data-binding provided by Angular instead. If used, it is recommended in combination with
     *    {@link /best-practices/security#direct-use-of-the-dom-apis-and-explicit-sanitization-calls DomSanitizer}
     *    for maxiumum security;
     *   </p>
     * </div>
     */
    nativeElement;
    constructor(nativeElement) {
        this.nativeElement = nativeElement;
    }
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ELEMENT_ID__ = injectElementRef;
}
/**
 * Unwraps `ElementRef` and return the `nativeElement`.
 *
 * @param value value to unwrap
 * @returns `nativeElement` if `ElementRef` otherwise returns value as is.
 */
function unwrapElementRef(value) {
    return value instanceof ElementRef ? value.nativeElement : value;
}

/**
 * Checks if the given `value` is a reactive `Signal`.
 */
function isSignal(value) {
    return typeof value === 'function' && value[SIGNAL] !== undefined;
}

/**
 * Utility function used during template type checking to extract the value from a `WritableSignal`.
 * @codeGenApi
 */
function ɵunwrapWritableSignal(value) {
    // Note: the function uses `WRITABLE_SIGNAL` as a brand instead of `WritableSignal<T>`,
    // because the latter incorrectly unwraps non-signal getter functions.
    return null;
}
/**
 * Create a `Signal` that can be set or updated directly.
 */
function signal(initialValue, options) {
    const signalFn = createSignal(initialValue, options?.equal);
    const node = signalFn[SIGNAL];
    signalFn.set = (newValue) => signalSetFn(node, newValue);
    signalFn.update = (updateFn) => signalUpdateFn(node, updateFn);
    signalFn.asReadonly = signalAsReadonlyFn.bind(signalFn);
    if (ngDevMode) {
        signalFn.toString = () => `[Signal: ${signalFn()}]`;
        node.debugName = options?.debugName;
    }
    return signalFn;
}
function signalAsReadonlyFn() {
    const node = this[SIGNAL];
    if (node.readonlyFn === undefined) {
        const readonlyFn = () => this();
        readonlyFn[SIGNAL] = node;
        node.readonlyFn = readonlyFn;
    }
    return node.readonlyFn;
}
/**
 * Checks if the given `value` is a writeable signal.
 */
function isWritableSignal(value) {
    return isSignal(value) && typeof value.set === 'function';
}

function symbolIterator() {
    // @ts-expect-error accessing a private member
    return this._results[Symbol.iterator]();
}
/**
 * An unmodifiable list of items that Angular keeps up to date when the state
 * of the application changes.
 *
 * The type of object that {@link ViewChildren}, {@link ContentChildren}, and {@link QueryList}
 * provide.
 *
 * Implements an iterable interface, therefore it can be used in both ES6
 * javascript `for (var i of items)` loops as well as in Angular templates with
 * `*ngFor="let i of myList"`.
 *
 * Changes can be observed by subscribing to the changes `Observable`.
 *
 * NOTE: In the future this class will implement an `Observable` interface.
 *
 * @usageNotes
 * ### Example
 * ```ts
 * @Component({...})
 * class Container {
 *   @ViewChildren(Item) items:QueryList<Item>;
 * }
 * ```
 *
 * @publicApi
 */
class QueryList {
    _emitDistinctChangesOnly;
    dirty = true;
    _onDirty = undefined;
    _results = [];
    _changesDetected = false;
    _changes = undefined;
    length = 0;
    first = undefined;
    last = undefined;
    /**
     * Returns `Observable` of `QueryList` notifying the subscriber of changes.
     */
    get changes() {
        return (this._changes ??= new Subject());
    }
    /**
     * @param emitDistinctChangesOnly Whether `QueryList.changes` should fire only when actual change
     *     has occurred. Or if it should fire when query is recomputed. (recomputing could resolve in
     *     the same result)
     */
    constructor(_emitDistinctChangesOnly = false) {
        this._emitDistinctChangesOnly = _emitDistinctChangesOnly;
    }
    /**
     * Returns the QueryList entry at `index`.
     */
    get(index) {
        return this._results[index];
    }
    /**
     * See
     * [Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
     */
    map(fn) {
        return this._results.map(fn);
    }
    filter(fn) {
        return this._results.filter(fn);
    }
    /**
     * See
     * [Array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
     */
    find(fn) {
        return this._results.find(fn);
    }
    /**
     * See
     * [Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
     */
    reduce(fn, init) {
        return this._results.reduce(fn, init);
    }
    /**
     * See
     * [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
     */
    forEach(fn) {
        this._results.forEach(fn);
    }
    /**
     * See
     * [Array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
     */
    some(fn) {
        return this._results.some(fn);
    }
    /**
     * Returns a copy of the internal results list as an Array.
     */
    toArray() {
        return this._results.slice();
    }
    toString() {
        return this._results.toString();
    }
    /**
     * Updates the stored data of the query list, and resets the `dirty` flag to `false`, so that
     * on change detection, it will not notify of changes to the queries, unless a new change
     * occurs.
     *
     * @param resultsTree The query results to store
     * @param identityAccessor Optional function for extracting stable object identity from a value
     *    in the array. This function is executed for each element of the query result list while
     *    comparing current query list with the new one (provided as a first argument of the `reset`
     *    function) to detect if the lists are different. If the function is not provided, elements
     *    are compared as is (without any pre-processing).
     */
    reset(resultsTree, identityAccessor) {
        this.dirty = false;
        const newResultFlat = flatten(resultsTree);
        if ((this._changesDetected = !arrayEquals(this._results, newResultFlat, identityAccessor))) {
            this._results = newResultFlat;
            this.length = newResultFlat.length;
            this.last = newResultFlat[this.length - 1];
            this.first = newResultFlat[0];
        }
    }
    /**
     * Triggers a change event by emitting on the `changes` {@link EventEmitter}.
     */
    notifyOnChanges() {
        if (this._changes !== undefined && (this._changesDetected || !this._emitDistinctChangesOnly))
            this._changes.next(this);
    }
    /** @internal */
    onDirty(cb) {
        this._onDirty = cb;
    }
    /** internal */
    setDirty() {
        this.dirty = true;
        this._onDirty?.();
    }
    /** internal */
    destroy() {
        if (this._changes !== undefined) {
            this._changes.complete();
            this._changes.unsubscribe();
        }
    }
    [Symbol.iterator] = (() => symbolIterator)();
}

/**
 * The name of an attribute that can be added to the hydration boundary node
 * (component host node) to disable hydration for the content within that boundary.
 */
const SKIP_HYDRATION_ATTR_NAME = 'ngSkipHydration';
/** Lowercase name of the `ngSkipHydration` attribute used for case-insensitive comparisons. */
const SKIP_HYDRATION_ATTR_NAME_LOWER_CASE = 'ngskiphydration';
/**
 * Helper function to check if a given TNode has the 'ngSkipHydration' attribute.
 */
function hasSkipHydrationAttrOnTNode(tNode) {
    const attrs = tNode.mergedAttrs;
    if (attrs === null)
        return false;
    // only ever look at the attribute name and skip the values
    for (let i = 0; i < attrs.length; i += 2) {
        const value = attrs[i];
        // This is a marker, which means that the static attributes section is over,
        // so we can exit early.
        if (typeof value === 'number')
            return false;
        if (typeof value === 'string' && value.toLowerCase() === SKIP_HYDRATION_ATTR_NAME_LOWER_CASE) {
            return true;
        }
    }
    return false;
}
/**
 * Helper function to check if a given RElement has the 'ngSkipHydration' attribute.
 */
function hasSkipHydrationAttrOnRElement(rNode) {
    return rNode.hasAttribute(SKIP_HYDRATION_ATTR_NAME);
}
/**
 * Checks whether a TNode has a flag to indicate that it's a part of
 * a skip hydration block.
 */
function hasInSkipHydrationBlockFlag(tNode) {
    return (tNode.flags & 128 /* TNodeFlags.inSkipHydrationBlock */) === 128 /* TNodeFlags.inSkipHydrationBlock */;
}
/**
 * Helper function that determines if a given node is within a skip hydration block
 * by navigating up the TNode tree to see if any parent nodes have skip hydration
 * attribute.
 */
function isInSkipHydrationBlock(tNode) {
    if (hasInSkipHydrationBlockFlag(tNode)) {
        return true;
    }
    let currentTNode = tNode.parent;
    while (currentTNode) {
        if (hasInSkipHydrationBlockFlag(tNode) || hasSkipHydrationAttrOnTNode(currentTNode)) {
            return true;
        }
        currentTNode = currentTNode.parent;
    }
    return false;
}
/**
 * Check if an i18n block is in a skip hydration section by looking at a parent TNode
 * to determine if this TNode is in a skip hydration section or the TNode has
 * the `ngSkipHydration` attribute.
 */
function isI18nInSkipHydrationBlock(parentTNode) {
    return (hasInSkipHydrationBlockFlag(parentTNode) ||
        hasSkipHydrationAttrOnTNode(parentTNode) ||
        isInSkipHydrationBlock(parentTNode));
}

/**
 * The strategy that the default change detector uses to detect changes.
 * When set, takes effect the next time change detection is triggered.
 *
 * @see {@link /api/core/ChangeDetectorRef?tab=usage-notes Change detection usage}
 * @see {@link /best-practices/skipping-subtrees Skipping component subtrees}
 *
 * @publicApi
 */
var ChangeDetectionStrategy;
(function (ChangeDetectionStrategy) {
    /**
     * Use the `CheckOnce` strategy, meaning that automatic change detection is deactivated
     * until reactivated by setting the strategy to `Default` (`CheckAlways`).
     * Change detection can still be explicitly invoked.
     * This strategy applies to all child directives and cannot be overridden.
     */
    ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush";
    /**
     * Use the default `CheckAlways` strategy, in which change detection is automatic until
     * explicitly deactivated.
     */
    ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default";
})(ChangeDetectionStrategy || (ChangeDetectionStrategy = {}));

// Keeps track of the currently-active LViews.
const TRACKED_LVIEWS = new Map();
// Used for generating unique IDs for LViews.
let uniqueIdCounter = 0;
/** Gets a unique ID that can be assigned to an LView. */
function getUniqueLViewId() {
    return uniqueIdCounter++;
}
/** Starts tracking an LView. */
function registerLView(lView) {
    ngDevMode && assertNumber(lView[ID], 'LView must have an ID in order to be registered');
    TRACKED_LVIEWS.set(lView[ID], lView);
}
/** Gets an LView by its unique ID. */
function getLViewById(id) {
    ngDevMode && assertNumber(id, 'ID used for LView lookup must be a number');
    return TRACKED_LVIEWS.get(id) || null;
}
/** Stops tracking an LView. */
function unregisterLView(lView) {
    ngDevMode && assertNumber(lView[ID], 'Cannot stop tracking an LView that does not have an ID');
    TRACKED_LVIEWS.delete(lView[ID]);
}
/** Gets the currently-tracked views. */
function getTrackedLViews() {
    return TRACKED_LVIEWS;
}

/**
 * The internal view context which is specific to a given DOM element, directive or
 * component instance. Each value in here (besides the LView and element node details)
 * can be present, null or undefined. If undefined then it implies the value has not been
 * looked up yet, otherwise, if null, then a lookup was executed and nothing was found.
 *
 * Each value will get filled when the respective value is examined within the getContext
 * function. The component, element and each directive instance will share the same instance
 * of the context.
 */
class LContext {
    lViewId;
    nodeIndex;
    native;
    /**
     * The instance of the Component node.
     */
    component;
    /**
     * The list of active directives that exist on this element.
     */
    directives;
    /**
     * The map of local references (local reference name => element or directive instance) that
     * exist on this element.
     */
    localRefs;
    /** Component's parent view data. */
    get lView() {
        return getLViewById(this.lViewId);
    }
    constructor(
    /**
     * ID of the component's parent view data.
     */
    lViewId, 
    /**
     * The index instance of the node.
     */
    nodeIndex, 
    /**
     * The instance of the DOM node that is attached to the lNode.
     */
    native) {
        this.lViewId = lViewId;
        this.nodeIndex = nodeIndex;
        this.native = native;
    }
}

/**
 * Returns the matching `LContext` data for a given DOM node, directive or component instance.
 *
 * This function will examine the provided DOM element, component, or directive instance\'s
 * monkey-patched property to derive the `LContext` data. Once called then the monkey-patched
 * value will be that of the newly created `LContext`.
 *
 * If the monkey-patched value is the `LView` instance then the context value for that
 * target will be created and the monkey-patch reference will be updated. Therefore when this
 * function is called it may mutate the provided element\'s, component\'s or any of the associated
 * directive\'s monkey-patch values.
 *
 * If the monkey-patch value is not detected then the code will walk up the DOM until an element
 * is found which contains a monkey-patch reference. When that occurs then the provided element
 * will be updated with a new context (which is then returned). If the monkey-patch value is not
 * detected for a component/directive instance then it will throw an error (all components and
 * directives should be automatically monkey-patched by ivy).
 *
 * @param target Component, Directive or DOM Node.
 */
function getLContext(target) {
    let mpValue = readPatchedData(target);
    if (mpValue) {
        // only when it's an array is it considered an LView instance
        // ... otherwise it's an already constructed LContext instance
        if (isLView(mpValue)) {
            const lView = mpValue;
            let nodeIndex;
            let component = undefined;
            let directives = undefined;
            if (isComponentInstance(target)) {
                nodeIndex = findViaComponent(lView, target);
                if (nodeIndex == -1) {
                    throw new Error('The provided component was not found in the application');
                }
                component = target;
            }
            else if (isDirectiveInstance(target)) {
                nodeIndex = findViaDirective(lView, target);
                if (nodeIndex == -1) {
                    throw new Error('The provided directive was not found in the application');
                }
                directives = getDirectivesAtNodeIndex(nodeIndex, lView);
            }
            else {
                nodeIndex = findViaNativeElement(lView, target);
                if (nodeIndex == -1) {
                    return null;
                }
            }
            // the goal is not to fill the entire context full of data because the lookups
            // are expensive. Instead, only the target data (the element, component, container, ICU
            // expression or directive details) are filled into the context. If called multiple times
            // with different target values then the missing target data will be filled in.
            const native = unwrapRNode(lView[nodeIndex]);
            const existingCtx = readPatchedData(native);
            const context = existingCtx && !Array.isArray(existingCtx)
                ? existingCtx
                : createLContext(lView, nodeIndex, native);
            // only when the component has been discovered then update the monkey-patch
            if (component && context.component === undefined) {
                context.component = component;
                attachPatchData(context.component, context);
            }
            // only when the directives have been discovered then update the monkey-patch
            if (directives && context.directives === undefined) {
                context.directives = directives;
                for (let i = 0; i < directives.length; i++) {
                    attachPatchData(directives[i], context);
                }
            }
            attachPatchData(context.native, context);
            mpValue = context;
        }
    }
    else {
        const rElement = target;
        ngDevMode && assertDomNode(rElement);
        // if the context is not found then we need to traverse upwards up the DOM
        // to find the nearest element that has already been monkey patched with data
        let parent = rElement;
        while ((parent = parent.parentNode)) {
            const parentContext = readPatchedData(parent);
            if (parentContext) {
                const lView = Array.isArray(parentContext) ? parentContext : parentContext.lView;
                // the edge of the app was also reached here through another means
                // (maybe because the DOM was changed manually).
                if (!lView) {
                    return null;
                }
                const index = findViaNativeElement(lView, rElement);
                if (index >= 0) {
                    const native = unwrapRNode(lView[index]);
                    const context = createLContext(lView, index, native);
                    attachPatchData(native, context);
                    mpValue = context;
                    break;
                }
            }
        }
    }
    return mpValue || null;
}
/**
 * Creates an empty instance of a `LContext` context
 */
function createLContext(lView, nodeIndex, native) {
    return new LContext(lView[ID], nodeIndex, native);
}
/**
 * Takes a component instance and returns the view for that component.
 *
 * @param componentInstance
 * @returns The component's view
 */
function getComponentViewByInstance(componentInstance) {
    let patchedData = readPatchedData(componentInstance);
    let lView;
    if (isLView(patchedData)) {
        const contextLView = patchedData;
        const nodeIndex = findViaComponent(contextLView, componentInstance);
        lView = getComponentLViewByIndex(nodeIndex, contextLView);
        const context = createLContext(contextLView, nodeIndex, lView[HOST]);
        context.component = componentInstance;
        attachPatchData(componentInstance, context);
        attachPatchData(context.native, context);
    }
    else {
        const context = patchedData;
        const contextLView = context.lView;
        ngDevMode && assertLView(contextLView);
        lView = getComponentLViewByIndex(context.nodeIndex, contextLView);
    }
    return lView;
}
/**
 * This property will be monkey-patched on elements, components and directives.
 */
const MONKEY_PATCH_KEY_NAME = '__ngContext__';
/**
 * Assigns the given data to the given target (which could be a component,
 * directive or DOM node instance) using monkey-patching.
 */
function attachPatchData(target, data) {
    ngDevMode && assertDefined(target, 'Target expected');
    // Only attach the ID of the view in order to avoid memory leaks (see #41047). We only do this
    // for `LView`, because we have control over when an `LView` is created and destroyed, whereas
    // we can't know when to remove an `LContext`.
    if (isLView(data)) {
        target[MONKEY_PATCH_KEY_NAME] = data[ID];
        registerLView(data);
    }
    else {
        target[MONKEY_PATCH_KEY_NAME] = data;
    }
}
/**
 * Returns the monkey-patch value data present on the target (which could be
 * a component, directive or a DOM node).
 */
function readPatchedData(target) {
    ngDevMode && assertDefined(target, 'Target expected');
    const data = target[MONKEY_PATCH_KEY_NAME];
    return typeof data === 'number' ? getLViewById(data) : data || null;
}
function readPatchedLView(target) {
    const value = readPatchedData(target);
    if (value) {
        return (isLView(value) ? value : value.lView);
    }
    return null;
}
function isComponentInstance(instance) {
    return instance && instance.constructor && instance.constructor.ɵcmp;
}
function isDirectiveInstance(instance) {
    return instance && instance.constructor && instance.constructor.ɵdir;
}
/**
 * Locates the element within the given LView and returns the matching index
 */
function findViaNativeElement(lView, target) {
    const tView = lView[TVIEW];
    for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
        if (unwrapRNode(lView[i]) === target) {
            return i;
        }
    }
    return -1;
}
/**
 * Locates the next tNode (child, sibling or parent).
 */
function traverseNextElement(tNode) {
    if (tNode.child) {
        return tNode.child;
    }
    else if (tNode.next) {
        return tNode.next;
    }
    else {
        // Let's take the following template: <div><span>text</span></div><component/>
        // After checking the text node, we need to find the next parent that has a "next" TNode,
        // in this case the parent `div`, so that we can find the component.
        while (tNode.parent && !tNode.parent.next) {
            tNode = tNode.parent;
        }
        return tNode.parent && tNode.parent.next;
    }
}
/**
 * Locates the component within the given LView and returns the matching index
 */
function findViaComponent(lView, componentInstance) {
    const componentIndices = lView[TVIEW].components;
    if (componentIndices) {
        for (let i = 0; i < componentIndices.length; i++) {
            const elementComponentIndex = componentIndices[i];
            const componentView = getComponentLViewByIndex(elementComponentIndex, lView);
            if (componentView[CONTEXT] === componentInstance) {
                return elementComponentIndex;
            }
        }
    }
    else {
        const rootComponentView = getComponentLViewByIndex(HEADER_OFFSET, lView);
        const rootComponent = rootComponentView[CONTEXT];
        if (rootComponent === componentInstance) {
            // we are dealing with the root element here therefore we know that the
            // element is the very first element after the HEADER data in the lView
            return HEADER_OFFSET;
        }
    }
    return -1;
}
/**
 * Locates the directive within the given LView and returns the matching index
 */
function findViaDirective(lView, directiveInstance) {
    // if a directive is monkey patched then it will (by default)
    // have a reference to the LView of the current view. The
    // element bound to the directive being search lives somewhere
    // in the view data. We loop through the nodes and check their
    // list of directives for the instance.
    let tNode = lView[TVIEW].firstChild;
    while (tNode) {
        const directiveIndexStart = tNode.directiveStart;
        const directiveIndexEnd = tNode.directiveEnd;
        for (let i = directiveIndexStart; i < directiveIndexEnd; i++) {
            if (lView[i] === directiveInstance) {
                return tNode.index;
            }
        }
        tNode = traverseNextElement(tNode);
    }
    return -1;
}
/**
 * Returns a list of directives applied to a node at a specific index. The list includes
 * directives matched by selector and any host directives, but it excludes components.
 * Use `getComponentAtNodeIndex` to find the component applied to a node.
 *
 * @param nodeIndex The node index
 * @param lView The target view data
 */
function getDirectivesAtNodeIndex(nodeIndex, lView) {
    const tNode = lView[TVIEW].data[nodeIndex];
    if (tNode.directiveStart === 0)
        return EMPTY_ARRAY;
    const results = [];
    for (let i = tNode.directiveStart; i < tNode.directiveEnd; i++) {
        const directiveInstance = lView[i];
        if (!isComponentInstance(directiveInstance)) {
            results.push(directiveInstance);
        }
    }
    return results;
}
function getComponentAtNodeIndex(nodeIndex, lView) {
    const tNode = lView[TVIEW].data[nodeIndex];
    return isComponentHost(tNode) ? lView[tNode.directiveStart + tNode.componentOffset] : null;
}
/**
 * Returns a map of local references (local reference name => element or directive instance) that
 * exist on a given element.
 */
function discoverLocalRefs(lView, nodeIndex) {
    const tNode = lView[TVIEW].data[nodeIndex];
    if (tNode && tNode.localNames) {
        const result = {};
        let localIndex = tNode.index + 1;
        for (let i = 0; i < tNode.localNames.length; i += 2) {
            result[tNode.localNames[i]] = lView[localIndex];
            localIndex++;
        }
        return result;
    }
    return null;
}

/**
 * Retrieve the root view from any component or `LView` by walking the parent `LView` until
 * reaching the root `LView`.
 *
 * @param componentOrLView any component or `LView`
 */
function getRootView(componentOrLView) {
    ngDevMode && assertDefined(componentOrLView, 'component');
    let lView = isLView(componentOrLView) ? componentOrLView : readPatchedLView(componentOrLView);
    while (lView && !isRootView(lView)) {
        lView = getLViewParent(lView);
    }
    ngDevMode && assertLView(lView);
    return lView;
}
/**
 * Returns the context information associated with the application where the target is situated. It
 * does this by walking the parent views until it gets to the root view, then getting the context
 * off of that.
 *
 * @param viewOrComponent the `LView` or component to get the root context for.
 */
function getRootContext(viewOrComponent) {
    const rootView = getRootView(viewOrComponent);
    ngDevMode &&
        assertDefined(rootView[CONTEXT], 'Root view has no context. Perhaps it is disconnected?');
    return rootView[CONTEXT];
}
/**
 * Gets the first `LContainer` in the LView or `null` if none exists.
 */
function getFirstLContainer(lView) {
    return getNearestLContainer(lView[CHILD_HEAD]);
}
/**
 * Gets the next `LContainer` that is a sibling of the given container.
 */
function getNextLContainer(container) {
    return getNearestLContainer(container[NEXT]);
}
function getNearestLContainer(viewOrContainer) {
    while (viewOrContainer !== null && !isLContainer(viewOrContainer)) {
        viewOrContainer = viewOrContainer[NEXT];
    }
    return viewOrContainer;
}

/**
 * Retrieves the component instance associated with a given DOM element.
 *
 * @usageNotes
 * Given the following DOM structure:
 *
 * ```html
 * <app-root>
 *   <div>
 *     <child-comp></child-comp>
 *   </div>
 * </app-root>
 * ```
 *
 * Calling `getComponent` on `<child-comp>` will return the instance of `ChildComponent`
 * associated with this DOM element.
 *
 * Calling the function on `<app-root>` will return the `MyApp` instance.
 *
 *
 * @param element DOM element from which the component should be retrieved.
 * @returns Component instance associated with the element or `null` if there
 *    is no component associated with it.
 *
 * @publicApi
 */
function getComponent(element) {
    ngDevMode && assertDomElement(element);
    const context = getLContext(element);
    if (context === null)
        return null;
    if (context.component === undefined) {
        const lView = context.lView;
        if (lView === null) {
            return null;
        }
        context.component = getComponentAtNodeIndex(context.nodeIndex, lView);
    }
    return context.component;
}
/**
 * If inside an embedded view (e.g. `*ngIf` or `*ngFor`), retrieves the context of the embedded
 * view that the element is part of. Otherwise retrieves the instance of the component whose view
 * owns the element (in this case, the result is the same as calling `getOwningComponent`).
 *
 * @param element Element for which to get the surrounding component instance.
 * @returns Instance of the component that is around the element or null if the element isn't
 *    inside any component.
 *
 * @publicApi
 */
function getContext(element) {
    assertDomElement(element);
    const context = getLContext(element);
    const lView = context ? context.lView : null;
    return lView === null ? null : lView[CONTEXT];
}
/**
 * Retrieves the component instance whose view contains the DOM element.
 *
 * For example, if `<child-comp>` is used in the template of `<app-comp>`
 * (i.e. a `ViewChild` of `<app-comp>`), calling `getOwningComponent` on `<child-comp>`
 * would return `<app-comp>`.
 *
 * @param elementOrDir DOM element, component or directive instance
 *    for which to retrieve the root components.
 * @returns Component instance whose view owns the DOM element or null if the element is not
 *    part of a component view.
 *
 * @publicApi
 */
function getOwningComponent(elementOrDir) {
    const context = getLContext(elementOrDir);
    let lView = context ? context.lView : null;
    if (lView === null)
        return null;
    let parent;
    while (lView[TVIEW].type === 2 /* TViewType.Embedded */ && (parent = getLViewParent(lView))) {
        lView = parent;
    }
    return isRootView(lView) ? null : lView[CONTEXT];
}
/**
 * Retrieves all root components associated with a DOM element, directive or component instance.
 * Root components are those which have been bootstrapped by Angular.
 *
 * @param elementOrDir DOM element, component or directive instance
 *    for which to retrieve the root components.
 * @returns Root components associated with the target object.
 *
 * @publicApi
 */
function getRootComponents(elementOrDir) {
    const lView = readPatchedLView(elementOrDir);
    return lView !== null ? [getRootContext(lView)] : [];
}
/**
 * Retrieves an `Injector` associated with an element, component or directive instance.
 *
 * @param elementOrDir DOM element, component or directive instance for which to
 *    retrieve the injector.
 * @returns Injector associated with the element, component or directive instance.
 *
 * @publicApi
 */
function getInjector(elementOrDir) {
    const context = getLContext(elementOrDir);
    const lView = context ? context.lView : null;
    if (lView === null)
        return Injector.NULL;
    const tNode = lView[TVIEW].data[context.nodeIndex];
    return new NodeInjector(tNode, lView);
}
/**
 * Retrieve a set of injection tokens at a given DOM node.
 *
 * @param element Element for which the injection tokens should be retrieved.
 */
function getInjectionTokens(element) {
    const context = getLContext(element);
    const lView = context ? context.lView : null;
    if (lView === null)
        return [];
    const tView = lView[TVIEW];
    const tNode = tView.data[context.nodeIndex];
    const providerTokens = [];
    const startIndex = tNode.providerIndexes & 1048575 /* TNodeProviderIndexes.ProvidersStartIndexMask */;
    const endIndex = tNode.directiveEnd;
    for (let i = startIndex; i < endIndex; i++) {
        let value = tView.data[i];
        if (isDirectiveDefHack(value)) {
            // The fact that we sometimes store Type and sometimes DirectiveDef in this location is a
            // design flaw.  We should always store same type so that we can be monomorphic. The issue
            // is that for Components/Directives we store the def instead the type. The correct behavior
            // is that we should always be storing injectable type in this location.
            value = value.type;
        }
        providerTokens.push(value);
    }
    return providerTokens;
}
/**
 * Retrieves directive instances associated with a given DOM node. Does not include
 * component instances.
 *
 * @usageNotes
 * Given the following DOM structure:
 *
 * ```html
 * <app-root>
 *   <button my-button></button>
 *   <my-comp></my-comp>
 * </app-root>
 * ```
 *
 * Calling `getDirectives` on `<button>` will return an array with an instance of the `MyButton`
 * directive that is associated with the DOM node.
 *
 * Calling `getDirectives` on `<my-comp>` will return an empty array.
 *
 * @param node DOM node for which to get the directives.
 * @returns Array of directives associated with the node.
 *
 * @publicApi
 */
function getDirectives(node) {
    // Skip text nodes because we can't have directives associated with them.
    if (node instanceof Text) {
        return [];
    }
    const context = getLContext(node);
    const lView = context ? context.lView : null;
    if (lView === null) {
        return [];
    }
    const tView = lView[TVIEW];
    const nodeIndex = context.nodeIndex;
    if (!tView?.data[nodeIndex]) {
        return [];
    }
    if (context.directives === undefined) {
        context.directives = getDirectivesAtNodeIndex(nodeIndex, lView);
    }
    // The `directives` in this case are a named array called `LComponentView`. Clone the
    // result so we don't expose an internal data structure in the user's console.
    return context.directives === null ? [] : [...context.directives];
}
/**
 * Returns the debug (partial) metadata for a particular directive or component instance.
 * The function accepts an instance of a directive or component and returns the corresponding
 * metadata.
 *
 * @param directiveOrComponentInstance Instance of a directive or component
 * @returns metadata of the passed directive or component
 *
 * @publicApi
 */
function getDirectiveMetadata$1(directiveOrComponentInstance) {
    const { constructor } = directiveOrComponentInstance;
    if (!constructor) {
        throw new Error('Unable to find the instance constructor');
    }
    // In case a component inherits from a directive, we may have component and directive metadata
    // To ensure we don't get the metadata of the directive, we want to call `getComponentDef` first.
    const componentDef = getComponentDef(constructor);
    if (componentDef) {
        const inputs = extractInputDebugMetadata(componentDef.inputs);
        return {
            inputs,
            outputs: componentDef.outputs,
            encapsulation: componentDef.encapsulation,
            changeDetection: componentDef.onPush
                ? ChangeDetectionStrategy.OnPush
                : ChangeDetectionStrategy.Default,
        };
    }
    const directiveDef = getDirectiveDef(constructor);
    if (directiveDef) {
        const inputs = extractInputDebugMetadata(directiveDef.inputs);
        return { inputs, outputs: directiveDef.outputs };
    }
    return null;
}
/**
 * Retrieve map of local references.
 *
 * The references are retrieved as a map of local reference name to element or directive instance.
 *
 * @param target DOM element, component or directive instance for which to retrieve
 *    the local references.
 */
function getLocalRefs(target) {
    const context = getLContext(target);
    if (context === null)
        return {};
    if (context.localRefs === undefined) {
        const lView = context.lView;
        if (lView === null) {
            return {};
        }
        context.localRefs = discoverLocalRefs(lView, context.nodeIndex);
    }
    return context.localRefs || {};
}
/**
 * Retrieves the host element of a component or directive instance.
 * The host element is the DOM element that matched the selector of the directive.
 *
 * @param componentOrDirective Component or directive instance for which the host
 *     element should be retrieved.
 * @returns Host element of the target.
 *
 * @publicApi
 */
function getHostElement(componentOrDirective) {
    return getLContext(componentOrDirective).native;
}
/**
 * Retrieves a list of event listeners associated with a DOM element. The list does include host
 * listeners, but it does not include event listeners defined outside of the Angular context
 * (e.g. through `addEventListener`).
 *
 * @usageNotes
 * Given the following DOM structure:
 *
 * ```html
 * <app-root>
 *   <div (click)="doSomething()"></div>
 * </app-root>
 * ```
 *
 * Calling `getListeners` on `<div>` will return an object that looks as follows:
 *
 * ```ts
 * {
 *   name: 'click',
 *   element: <div>,
 *   callback: () => doSomething(),
 *   useCapture: false
 * }
 * ```
 *
 * @param element Element for which the DOM listeners should be retrieved.
 * @returns Array of event listeners on the DOM element.
 *
 * @publicApi
 */
function getListeners(element) {
    ngDevMode && assertDomElement(element);
    const lContext = getLContext(element);
    const lView = lContext === null ? null : lContext.lView;
    if (lView === null)
        return [];
    const tView = lView[TVIEW];
    const lCleanup = lView[CLEANUP];
    const tCleanup = tView.cleanup;
    const listeners = [];
    if (tCleanup && lCleanup) {
        for (let i = 0; i < tCleanup.length;) {
            const firstParam = tCleanup[i++];
            const secondParam = tCleanup[i++];
            if (typeof firstParam === 'string') {
                const name = firstParam;
                const listenerElement = unwrapRNode(lView[secondParam]);
                const callback = lCleanup[tCleanup[i++]];
                const useCaptureOrIndx = tCleanup[i++];
                // if useCaptureOrIndx is boolean then report it as is.
                // if useCaptureOrIndx is positive number then it in unsubscribe method
                // if useCaptureOrIndx is negative number then it is a Subscription
                const type = typeof useCaptureOrIndx === 'boolean' || useCaptureOrIndx >= 0 ? 'dom' : 'output';
                const useCapture = typeof useCaptureOrIndx === 'boolean' ? useCaptureOrIndx : false;
                if (element == listenerElement) {
                    listeners.push({ element, name, callback, useCapture, type });
                }
            }
        }
    }
    listeners.sort(sortListeners);
    return listeners;
}
function sortListeners(a, b) {
    if (a.name == b.name)
        return 0;
    return a.name < b.name ? -1 : 1;
}
/**
 * This function should not exist because it is megamorphic and only mostly correct.
 *
 * See call site for more info.
 */
function isDirectiveDefHack(obj) {
    return (obj.type !== undefined &&
        obj.declaredInputs !== undefined &&
        obj.findHostDirectiveDefs !== undefined);
}
/** Asserts that a value is a DOM Element. */
function assertDomElement(value) {
    if (typeof Element !== 'undefined' && !(value instanceof Element)) {
        throw new Error('Expecting instance of DOM Element');
    }
}
/**
 * A directive definition holds additional metadata using bitwise flags to indicate
 * for example whether it is signal based.
 *
 * This information needs to be separate from the `publicName -> minifiedName`
 * mappings for backwards compatibility.
 */
function extractInputDebugMetadata(inputs) {
    const res = {};
    for (const key in inputs) {
        if (inputs.hasOwnProperty(key)) {
            const value = inputs[key];
            if (value !== undefined) {
                res[key] = value[0];
            }
        }
    }
    return res;
}

/**
 * Most of the use of `document` in Angular is from within the DI system so it is possible to simply
 * inject the `DOCUMENT` token and are done.
 *
 * Ivy is special because it does not rely upon the DI and must get hold of the document some other
 * way.
 *
 * The solution is to define `getDocument()` and `setDocument()` top-level functions for ivy.
 * Wherever ivy needs the global document, it calls `getDocument()` instead.
 *
 * When running ivy outside of a browser environment, it is necessary to call `setDocument()` to
 * tell ivy what the global `document` is.
 *
 * Angular does this for us in each of the standard platforms (`Browser` and `Server`)
 * by calling `setDocument()` when providing the `DOCUMENT` token.
 */
let DOCUMENT = undefined;
/**
 * Tell ivy what the `document` is for this platform.
 *
 * It is only necessary to call this if the current platform is not a browser.
 *
 * @param document The object representing the global `document` in this environment.
 */
function setDocument(document) {
    DOCUMENT = document;
}
/**
 * Access the object that represents the `document` for this platform.
 *
 * Ivy calls this whenever it needs to access the `document` object.
 * For example to create the renderer or to do sanitization.
 */
function getDocument() {
    if (DOCUMENT !== undefined) {
        return DOCUMENT;
    }
    else if (typeof document !== 'undefined') {
        return document;
    }
    throw new RuntimeError(210 /* RuntimeErrorCode.MISSING_DOCUMENT */, (typeof ngDevMode === 'undefined' || ngDevMode) &&
        `The document object is not available in this context. Make sure the DOCUMENT injection token is provided.`);
    // No "document" can be found. This should only happen if we are running ivy outside Angular and
    // the current platform is not a browser. Since this is not a supported scenario at the moment
    // this should not happen in Angular apps.
    // Once we support running ivy outside of Angular we will need to publish `setDocument()` as a
    // public API.
}

/**
 * A DI token representing a string ID, used
 * primarily for prefixing application attributes and CSS styles when
 * {@link ViewEncapsulation#Emulated} is being used.
 *
 * The token is needed in cases when multiple applications are bootstrapped on a page
 * (for example, using `bootstrapApplication` calls). In this case, ensure that those applications
 * have different `APP_ID` value setup. For example:
 *
 * ```ts
 * bootstrapApplication(ComponentA, {
 *   providers: [
 *     { provide: APP_ID, useValue: 'app-a' },
 *     // ... other providers ...
 *   ]
 * });
 *
 * bootstrapApplication(ComponentB, {
 *   providers: [
 *     { provide: APP_ID, useValue: 'app-b' },
 *     // ... other providers ...
 *   ]
 * });
 * ```
 *
 * By default, when there is only one application bootstrapped, you don't need to provide the
 * `APP_ID` token (the `ng` will be used as an app ID).
 *
 * @publicApi
 */
const APP_ID = new InjectionToken(ngDevMode ? 'AppId' : '', {
    providedIn: 'root',
    factory: () => DEFAULT_APP_ID,
});
/** Default value of the `APP_ID` token. */
const DEFAULT_APP_ID = 'ng';
/**
 * A function that is executed when a platform is initialized.
 *
 * @deprecated from v19.0.0, use providePlatformInitializer instead
 *
 * @see {@link providePlatformInitializer}
 *
 * @publicApi
 */
const PLATFORM_INITIALIZER = new InjectionToken(ngDevMode ? 'Platform Initializer' : '');
/**
 * A token that indicates an opaque platform ID.
 * @publicApi
 */
const PLATFORM_ID = new InjectionToken(ngDevMode ? 'Platform ID' : '', {
    providedIn: 'platform',
    factory: () => 'unknown', // set a default platform name, when none set explicitly
});
/**
 * A DI token that indicates the root directory of
 * the application
 * @publicApi
 * @deprecated
 */
const PACKAGE_ROOT_URL = new InjectionToken(ngDevMode ? 'Application Packages Root URL' : '');
// We keep this token here, rather than the animations package, so that modules that only care
// about which animations module is loaded (e.g. the CDK) can retrieve it without having to
// include extra dependencies. See #44970 for more context.
/**
 * A [DI token](api/core/InjectionToken) that indicates which animations
 * module has been loaded.
 * @publicApi
 */
const ANIMATION_MODULE_TYPE = new InjectionToken(ngDevMode ? 'AnimationModuleType' : '');
// TODO(crisbeto): link to CSP guide here.
/**
 * Token used to configure the [Content Security Policy](https://web.dev/strict-csp/) nonce that
 * Angular will apply when inserting inline styles. If not provided, Angular will look up its value
 * from the `ngCspNonce` attribute of the application root node.
 *
 * @publicApi
 */
const CSP_NONCE = new InjectionToken(ngDevMode ? 'CSP nonce' : '', {
    providedIn: 'root',
    factory: () => {
        // Ideally we wouldn't have to use `querySelector` here since we know that the nonce will be on
        // the root node, but because the token value is used in renderers, it has to be available
        // *very* early in the bootstrapping process. This should be a fairly shallow search, because
        // the app won't have been added to the DOM yet. Some approaches that were considered:
        // 1. Find the root node through `ApplicationRef.components[i].location` - normally this would
        // be enough for our purposes, but the token is injected very early so the `components` array
        // isn't populated yet.
        // 2. Find the root `LView` through the current `LView` - renderers are a prerequisite to
        // creating the `LView`. This means that no `LView` will have been entered when this factory is
        // invoked for the root component.
        // 3. Have the token factory return `() => string` which is invoked when a nonce is requested -
        // the slightly later execution does allow us to get an `LView` reference, but the fact that
        // it is a function means that it could be executed at *any* time (including immediately) which
        // may lead to weird bugs.
        // 4. Have the `ComponentFactory` read the attribute and provide it to the injector under the
        // hood - has the same problem as #1 and #2 in that the renderer is used to query for the root
        // node and the nonce value needs to be available when the renderer is created.
        return getDocument().body?.querySelector('[ngCspNonce]')?.getAttribute('ngCspNonce') || null;
    },
});
const IMAGE_CONFIG_DEFAULTS = {
    breakpoints: [16, 32, 48, 64, 96, 128, 256, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840],
    placeholderResolution: 30,
    disableImageSizeWarning: false,
    disableImageLazyLoadWarning: false,
};
/**
 * Injection token that configures the image optimized image functionality.
 * See {@link ImageConfig} for additional information about parameters that
 * can be used.
 *
 * @see {@link NgOptimizedImage}
 * @see {@link ImageConfig}
 * @publicApi
 */
const IMAGE_CONFIG = new InjectionToken(ngDevMode ? 'ImageConfig' : '', {
    providedIn: 'root',
    factory: () => IMAGE_CONFIG_DEFAULTS,
});

/**
 * Create a `StateKey<T>` that can be used to store value of type T with `TransferState`.
 *
 * Example:
 *
 * ```ts
 * const COUNTER_KEY = makeStateKey<number>('counter');
 * let value = 10;
 *
 * transferState.set(COUNTER_KEY, value);
 * ```
 *
 * @publicApi
 */
function makeStateKey(key) {
    return key;
}
function initTransferState() {
    const transferState = new TransferState();
    if (typeof ngServerMode === 'undefined' || !ngServerMode) {
        transferState.store = retrieveTransferredState(getDocument(), inject(APP_ID));
    }
    return transferState;
}
/**
 * A key value store that is transferred from the application on the server side to the application
 * on the client side.
 *
 * The `TransferState` is available as an injectable token.
 * On the client, just inject this token using DI and use it, it will be lazily initialized.
 * On the server it's already included if `renderApplication` function is used. Otherwise, import
 * the `ServerTransferStateModule` module to make the `TransferState` available.
 *
 * The values in the store are serialized/deserialized using JSON.stringify/JSON.parse. So only
 * boolean, number, string, null and non-class objects will be serialized and deserialized in a
 * non-lossy manner.
 *
 * @publicApi
 */
class TransferState {
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: TransferState,
        providedIn: 'root',
        factory: initTransferState,
    });
    /** @internal */
    store = {};
    onSerializeCallbacks = {};
    /**
     * Get the value corresponding to a key. Return `defaultValue` if key is not found.
     */
    get(key, defaultValue) {
        return this.store[key] !== undefined ? this.store[key] : defaultValue;
    }
    /**
     * Set the value corresponding to a key.
     */
    set(key, value) {
        this.store[key] = value;
    }
    /**
     * Remove a key from the store.
     */
    remove(key) {
        delete this.store[key];
    }
    /**
     * Test whether a key exists in the store.
     */
    hasKey(key) {
        return this.store.hasOwnProperty(key);
    }
    /**
     * Indicates whether the state is empty.
     */
    get isEmpty() {
        return Object.keys(this.store).length === 0;
    }
    /**
     * Register a callback to provide the value for a key when `toJson` is called.
     */
    onSerialize(key, callback) {
        this.onSerializeCallbacks[key] = callback;
    }
    /**
     * Serialize the current state of the store to JSON.
     */
    toJson() {
        // Call the onSerialize callbacks and put those values into the store.
        for (const key in this.onSerializeCallbacks) {
            if (this.onSerializeCallbacks.hasOwnProperty(key)) {
                try {
                    this.store[key] = this.onSerializeCallbacks[key]();
                }
                catch (e) {
                    console.warn('Exception in onSerialize callback: ', e);
                }
            }
        }
        // Escape script tag to avoid break out of <script> tag in serialized output.
        // Encoding of `<` is the same behaviour as G3 script_builders.
        return JSON.stringify(this.store).replace(/</g, '\\u003C');
    }
}
function retrieveTransferredState(doc, appId) {
    // Locate the script tag with the JSON data transferred from the server.
    // The id of the script tag is set to the Angular appId + 'state'.
    const script = doc.getElementById(appId + '-state');
    if (script?.textContent) {
        try {
            // Avoid using any here as it triggers lint errors in google3 (any is not allowed).
            // Decoding of `<` is done of the box by browsers and node.js, same behaviour as G3
            // script_builders.
            return JSON.parse(script.textContent);
        }
        catch (e) {
            console.warn('Exception while restoring TransferState for app ' + appId, e);
        }
    }
    return {};
}

/** Encodes that the node lookup should start from the host node of this component. */
const REFERENCE_NODE_HOST = 'h';
/** Encodes that the node lookup should start from the document body node. */
const REFERENCE_NODE_BODY = 'b';
const NODE_NAVIGATION_STEP_FIRST_CHILD = 'f';
const NODE_NAVIGATION_STEP_NEXT_SIBLING = 'n';
/**
 * Keys within serialized view data structure to represent various
 * parts. See the `SerializedView` interface below for additional information.
 */
const ELEMENT_CONTAINERS = 'e';
const TEMPLATES = 't';
const CONTAINERS = 'c';
const MULTIPLIER = 'x';
const NUM_ROOT_NODES = 'r';
const TEMPLATE_ID = 'i'; // as it's also an "id"
const NODES = 'n';
const DISCONNECTED_NODES = 'd';
const I18N_DATA = 'l';
const DEFER_BLOCK_ID = 'di';
const DEFER_BLOCK_STATE$1 = 's';
const DEFER_PARENT_BLOCK_ID = 'p';
const DEFER_HYDRATE_TRIGGERS = 't';

/**
 * Internal token that specifies whether DOM reuse logic
 * during hydration is enabled.
 */
const IS_HYDRATION_DOM_REUSE_ENABLED = new InjectionToken(typeof ngDevMode === 'undefined' || !!ngDevMode ? 'IS_HYDRATION_DOM_REUSE_ENABLED' : '');
// By default (in client rendering mode), we remove all the contents
// of the host element and render an application after that.
const PRESERVE_HOST_CONTENT_DEFAULT = false;
/**
 * Internal token that indicates whether host element content should be
 * retained during the bootstrap.
 */
const PRESERVE_HOST_CONTENT = new InjectionToken(typeof ngDevMode === 'undefined' || !!ngDevMode ? 'PRESERVE_HOST_CONTENT' : '', {
    providedIn: 'root',
    factory: () => PRESERVE_HOST_CONTENT_DEFAULT,
});
/**
 * Internal token that indicates whether hydration support for i18n
 * is enabled.
 */
const IS_I18N_HYDRATION_ENABLED = new InjectionToken(typeof ngDevMode === 'undefined' || !!ngDevMode ? 'IS_I18N_HYDRATION_ENABLED' : '');
/**
 * Internal token that indicates whether event replay support for SSR
 * is enabled.
 */
const IS_EVENT_REPLAY_ENABLED = new InjectionToken(typeof ngDevMode === 'undefined' || !!ngDevMode ? 'IS_EVENT_REPLAY_ENABLED' : '');
const EVENT_REPLAY_ENABLED_DEFAULT = false;
/**
 * Internal token that indicates whether incremental hydration support
 * is enabled.
 */
const IS_INCREMENTAL_HYDRATION_ENABLED = new InjectionToken(typeof ngDevMode === 'undefined' || !!ngDevMode ? 'IS_INCREMENTAL_HYDRATION_ENABLED' : '');
/**
 * A map of DOM elements with `jsaction` attributes grouped by action names.
 */
const JSACTION_BLOCK_ELEMENT_MAP = new InjectionToken(ngDevMode ? 'JSACTION_BLOCK_ELEMENT_MAP' : '', {
    providedIn: 'root',
    factory: () => new Map(),
});

/** Actions that are supported by the tracing framework. */
var TracingAction;
(function (TracingAction) {
    TracingAction[TracingAction["CHANGE_DETECTION"] = 0] = "CHANGE_DETECTION";
    TracingAction[TracingAction["AFTER_NEXT_RENDER"] = 1] = "AFTER_NEXT_RENDER";
})(TracingAction || (TracingAction = {}));
/**
 * Injection token for a `TracingService`, optionally provided.
 */
const TracingService = new InjectionToken(ngDevMode ? 'TracingService' : '');

const markedFeatures = new Set();
// tslint:disable:ban
/**
 * A guarded `performance.mark` for feature marking.
 *
 * This method exists because while all supported browser and node.js version supported by Angular
 * support performance.mark API. This is not the case for other environments such as JSDOM and
 * Cloudflare workers.
 */
function performanceMarkFeature(feature) {
    if (markedFeatures.has(feature)) {
        return;
    }
    markedFeatures.add(feature);
    performance?.mark?.('mark_feature_usage', { detail: { feature } });
}

/**
 * Asserts that the current stack frame is not within a reactive context. Useful
 * to disallow certain code from running inside a reactive context (see {@link /api/core/rxjs/toSignal toSignal})
 *
 * @param debugFn a reference to the function making the assertion (used for the error message).
 *
 * @publicApi
 */
function assertNotInReactiveContext(debugFn, extraContext) {
    // Taking a `Function` instead of a string name here prevents the un-minified name of the function
    // from being retained in the bundle regardless of minification.
    if (getActiveConsumer() !== null) {
        throw new RuntimeError(-602 /* RuntimeErrorCode.ASSERTION_NOT_INSIDE_REACTIVE_CONTEXT */, ngDevMode &&
            `${debugFn.name}() cannot be called from w   ithin a reactive context.${extraContext ? ` ${extraContext}` : ''}`);
    }
}

class ViewContext {
    view;
    node;
    constructor(view, node) {
        this.view = view;
        this.node = node;
    }
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ELEMENT_ID__ = injectViewContext;
}
function injectViewContext() {
    return new ViewContext(getLView(), getCurrentTNode());
}

/**
 * The phase to run an `afterRender` or `afterNextRender` callback in.
 *
 * Callbacks in the same phase run in the order they are registered. Phases run in the
 * following order after each render:
 *
 *   1. `AfterRenderPhase.EarlyRead`
 *   2. `AfterRenderPhase.Write`
 *   3. `AfterRenderPhase.MixedReadWrite`
 *   4. `AfterRenderPhase.Read`
 *
 * Angular is unable to verify or enforce that phases are used correctly, and instead
 * relies on each developer to follow the guidelines documented for each value and
 * carefully choose the appropriate one, refactoring their code if necessary. By doing
 * so, Angular is better able to minimize the performance degradation associated with
 * manual DOM access, ensuring the best experience for the end users of your application
 * or library.
 *
 * @deprecated Specify the phase for your callback to run in by passing a spec-object as the first
 *   parameter to `afterRender` or `afterNextRender` instead of a function.
 */
var AfterRenderPhase;
(function (AfterRenderPhase) {
    /**
     * Use `AfterRenderPhase.EarlyRead` for callbacks that only need to **read** from the
     * DOM before a subsequent `AfterRenderPhase.Write` callback, for example to perform
     * custom layout that the browser doesn't natively support. Prefer the
     * `AfterRenderPhase.Read` phase if reading can wait until after the write phase.
     * **Never** write to the DOM in this phase.
     *
     * <div class="docs-alert docs-alert-important">
     *
     * Using this value can degrade performance.
     * Instead, prefer using built-in browser functionality when possible.
     *
     * </div>
     */
    AfterRenderPhase[AfterRenderPhase["EarlyRead"] = 0] = "EarlyRead";
    /**
     * Use `AfterRenderPhase.Write` for callbacks that only **write** to the DOM. **Never**
     * read from the DOM in this phase.
     */
    AfterRenderPhase[AfterRenderPhase["Write"] = 1] = "Write";
    /**
     * Use `AfterRenderPhase.MixedReadWrite` for callbacks that read from or write to the
     * DOM, that haven't been refactored to use a different phase. **Never** use this phase if
     * it is possible to divide the work among the other phases instead.
     *
     * <div class="docs-alert docs-alert-critical">
     *
     * Using this value can **significantly** degrade performance.
     * Instead, prefer dividing work into the appropriate phase callbacks.
     *
     * </div>
     */
    AfterRenderPhase[AfterRenderPhase["MixedReadWrite"] = 2] = "MixedReadWrite";
    /**
     * Use `AfterRenderPhase.Read` for callbacks that only **read** from the DOM. **Never**
     * write to the DOM in this phase.
     */
    AfterRenderPhase[AfterRenderPhase["Read"] = 3] = "Read";
})(AfterRenderPhase || (AfterRenderPhase = {}));

class AfterRenderManager {
    impl = null;
    execute() {
        this.impl?.execute();
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: AfterRenderManager,
        providedIn: 'root',
        factory: () => new AfterRenderManager(),
    });
}
const AFTER_RENDER_PHASES = /* @__PURE__ **/ (() => [
    AfterRenderPhase.EarlyRead,
    AfterRenderPhase.Write,
    AfterRenderPhase.MixedReadWrite,
    AfterRenderPhase.Read,
])();
class AfterRenderImpl {
    ngZone = inject(NgZone);
    scheduler = inject(ChangeDetectionScheduler);
    errorHandler = inject(ErrorHandler, { optional: true });
    /** Current set of active sequences. */
    sequences = new Set();
    /** Tracks registrations made during the current set of executions. */
    deferredRegistrations = new Set();
    /** Whether the `AfterRenderManager` is currently executing hooks. */
    executing = false;
    constructor() {
        // Inject the tracing service to make sure it's initialized.
        inject(TracingService, { optional: true });
    }
    /**
     * Run the sequence of phases of hooks, once through. As a result of executing some hooks, more
     * might be scheduled.
     */
    execute() {
        const hasSequencesToExecute = this.sequences.size > 0;
        if (hasSequencesToExecute) {
            profiler(16 /* ProfilerEvent.AfterRenderHooksStart */);
        }
        this.executing = true;
        for (const phase of AFTER_RENDER_PHASES) {
            for (const sequence of this.sequences) {
                if (sequence.erroredOrDestroyed || !sequence.hooks[phase]) {
                    continue;
                }
                try {
                    sequence.pipelinedValue = this.ngZone.runOutsideAngular(() => this.maybeTrace(() => {
                        const hookFn = sequence.hooks[phase];
                        const value = hookFn(sequence.pipelinedValue);
                        return value;
                    }, sequence.snapshot));
                }
                catch (err) {
                    sequence.erroredOrDestroyed = true;
                    this.errorHandler?.handleError(err);
                }
            }
        }
        this.executing = false;
        // Cleanup step to reset sequence state and also collect one-shot sequences for removal.
        for (const sequence of this.sequences) {
            sequence.afterRun();
            if (sequence.once) {
                this.sequences.delete(sequence);
                // Destroy the sequence so its on destroy callbacks can be cleaned up
                // immediately, instead of waiting until the injector is destroyed.
                sequence.destroy();
            }
        }
        for (const sequence of this.deferredRegistrations) {
            this.sequences.add(sequence);
        }
        if (this.deferredRegistrations.size > 0) {
            this.scheduler.notify(7 /* NotificationSource.RenderHook */);
        }
        this.deferredRegistrations.clear();
        if (hasSequencesToExecute) {
            profiler(17 /* ProfilerEvent.AfterRenderHooksEnd */);
        }
    }
    register(sequence) {
        const { view } = sequence;
        if (view !== undefined) {
            // Delay adding it to the manager, add it to the view instead.
            (view[AFTER_RENDER_SEQUENCES_TO_ADD] ??= []).push(sequence);
            // Mark the view for traversal to ensure we eventually schedule the afterNextRender.
            markAncestorsForTraversal(view);
            view[FLAGS] |= 8192 /* LViewFlags.HasChildViewsToRefresh */;
        }
        else if (!this.executing) {
            this.addSequence(sequence);
        }
        else {
            this.deferredRegistrations.add(sequence);
        }
    }
    addSequence(sequence) {
        this.sequences.add(sequence);
        // Trigger an `ApplicationRef.tick()` if one is not already pending/running, because we have a
        // new render hook that needs to run.
        this.scheduler.notify(7 /* NotificationSource.RenderHook */);
    }
    unregister(sequence) {
        if (this.executing && this.sequences.has(sequence)) {
            // We can't remove an `AfterRenderSequence` in the middle of iteration.
            // Instead, mark it as destroyed so it doesn't run any more, and mark it as one-shot so it'll
            // be removed at the end of the current execution.
            sequence.erroredOrDestroyed = true;
            sequence.pipelinedValue = undefined;
            sequence.once = true;
        }
        else {
            // It's safe to directly remove this sequence.
            this.sequences.delete(sequence);
            this.deferredRegistrations.delete(sequence);
        }
    }
    maybeTrace(fn, snapshot) {
        // Only trace the execution if the snapshot is defined.
        return snapshot ? snapshot.run(TracingAction.AFTER_NEXT_RENDER, fn) : fn();
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: AfterRenderImpl,
        providedIn: 'root',
        factory: () => new AfterRenderImpl(),
    });
}
class AfterRenderSequence {
    impl;
    hooks;
    view;
    once;
    snapshot;
    /**
     * Whether this sequence errored or was destroyed during this execution, and hooks should no
     * longer run for it.
     */
    erroredOrDestroyed = false;
    /**
     * The value returned by the last hook execution (if any), ready to be pipelined into the next
     * one.
     */
    pipelinedValue = undefined;
    unregisterOnDestroy;
    constructor(impl, hooks, view, once, destroyRef, snapshot = null) {
        this.impl = impl;
        this.hooks = hooks;
        this.view = view;
        this.once = once;
        this.snapshot = snapshot;
        this.unregisterOnDestroy = destroyRef?.onDestroy(() => this.destroy());
    }
    afterRun() {
        this.erroredOrDestroyed = false;
        this.pipelinedValue = undefined;
        // Clear the tracing snapshot after the initial run. This snapshot only
        // associates the initial run of the hook with the context that created it.
        // Follow-up runs are independent of that initial context and have different
        // triggers.
        this.snapshot?.dispose();
        this.snapshot = null;
    }
    destroy() {
        this.impl.unregister(this);
        this.unregisterOnDestroy?.();
        const scheduled = this.view?.[AFTER_RENDER_SEQUENCES_TO_ADD];
        if (scheduled) {
            this.view[AFTER_RENDER_SEQUENCES_TO_ADD] = scheduled.filter((s) => s !== this);
        }
    }
}

function afterRender(callbackOrSpec, options) {
    ngDevMode &&
        assertNotInReactiveContext(afterRender, 'Call `afterRender` outside of a reactive context. For example, schedule the render ' +
            'callback inside the component constructor`.');
    !options?.injector && assertInInjectionContext(afterRender);
    const injector = options?.injector ?? inject(Injector);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        return NOOP_AFTER_RENDER_REF;
    }
    performanceMarkFeature('NgAfterRender');
    return afterRenderImpl(callbackOrSpec, injector, options, /* once */ false);
}
function afterNextRender(callbackOrSpec, options) {
    !options?.injector && assertInInjectionContext(afterNextRender);
    const injector = options?.injector ?? inject(Injector);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        return NOOP_AFTER_RENDER_REF;
    }
    performanceMarkFeature('NgAfterNextRender');
    return afterRenderImpl(callbackOrSpec, injector, options, /* once */ true);
}
function getHooks(callbackOrSpec, phase) {
    if (callbackOrSpec instanceof Function) {
        const hooks = [undefined, undefined, undefined, undefined];
        hooks[phase] = callbackOrSpec;
        return hooks;
    }
    else {
        return [
            callbackOrSpec.earlyRead,
            callbackOrSpec.write,
            callbackOrSpec.mixedReadWrite,
            callbackOrSpec.read,
        ];
    }
}
/**
 * Shared implementation for `afterRender` and `afterNextRender`.
 */
function afterRenderImpl(callbackOrSpec, injector, options, once) {
    const manager = injector.get(AfterRenderManager);
    // Lazily initialize the handler implementation, if necessary. This is so that it can be
    // tree-shaken if `afterRender` and `afterNextRender` aren't used.
    manager.impl ??= injector.get(AfterRenderImpl);
    const tracing = injector.get(TracingService, null, { optional: true });
    const hooks = options?.phase ?? AfterRenderPhase.MixedReadWrite;
    const destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;
    const viewContext = injector.get(ViewContext, null, { optional: true });
    const sequence = new AfterRenderSequence(manager.impl, getHooks(callbackOrSpec, hooks), viewContext?.view, once, destroyRef, tracing?.snapshot(null));
    manager.impl.register(sequence);
    return sequence;
}
/** `AfterRenderRef` that does nothing. */
const NOOP_AFTER_RENDER_REF = {
    destroy() { },
};

/**
 * Describes the state of defer block dependency loading.
 */
var DeferDependenciesLoadingState;
(function (DeferDependenciesLoadingState) {
    /** Initial state, dependency loading is not yet triggered */
    DeferDependenciesLoadingState[DeferDependenciesLoadingState["NOT_STARTED"] = 0] = "NOT_STARTED";
    /** Dependency loading is in progress */
    DeferDependenciesLoadingState[DeferDependenciesLoadingState["IN_PROGRESS"] = 1] = "IN_PROGRESS";
    /** Dependency loading has completed successfully */
    DeferDependenciesLoadingState[DeferDependenciesLoadingState["COMPLETE"] = 2] = "COMPLETE";
    /** Dependency loading has failed */
    DeferDependenciesLoadingState[DeferDependenciesLoadingState["FAILED"] = 3] = "FAILED";
})(DeferDependenciesLoadingState || (DeferDependenciesLoadingState = {}));
/** Slot index where `minimum` parameter value is stored. */
const MINIMUM_SLOT = 0;
/** Slot index where `after` parameter value is stored. */
const LOADING_AFTER_SLOT = 1;
/**
 * Describes the current state of this defer block instance.
 *
 * @publicApi
 */
var DeferBlockState;
(function (DeferBlockState) {
    /** The placeholder block content is rendered */
    DeferBlockState[DeferBlockState["Placeholder"] = 0] = "Placeholder";
    /** The loading block content is rendered */
    DeferBlockState[DeferBlockState["Loading"] = 1] = "Loading";
    /** The main content block content is rendered */
    DeferBlockState[DeferBlockState["Complete"] = 2] = "Complete";
    /** The error block content is rendered */
    DeferBlockState[DeferBlockState["Error"] = 3] = "Error";
})(DeferBlockState || (DeferBlockState = {}));
/**
 * Describes the initial state of this defer block instance.
 *
 * Note: this state is internal only and *must* be represented
 * with a number lower than any value in the `DeferBlockState` enum.
 */
var DeferBlockInternalState;
(function (DeferBlockInternalState) {
    /** Initial state. Nothing is rendered yet. */
    DeferBlockInternalState[DeferBlockInternalState["Initial"] = -1] = "Initial";
})(DeferBlockInternalState || (DeferBlockInternalState = {}));
const NEXT_DEFER_BLOCK_STATE = 0;
// Note: it's *important* to keep the state in this slot, because this slot
// is used by runtime logic to differentiate between LViews, LContainers and
// other types (see `isLView` and `isLContainer` functions). In case of defer
// blocks, this slot would always be a number.
const DEFER_BLOCK_STATE = 1;
const STATE_IS_FROZEN_UNTIL = 2;
const LOADING_AFTER_CLEANUP_FN = 3;
const TRIGGER_CLEANUP_FNS = 4;
const PREFETCH_TRIGGER_CLEANUP_FNS = 5;
const SSR_UNIQUE_ID = 6;
const SSR_BLOCK_STATE = 7;
const ON_COMPLETE_FNS = 8;
const HYDRATE_TRIGGER_CLEANUP_FNS = 9;
/**
 * Options for configuring defer blocks behavior.
 * @publicApi
 */
var DeferBlockBehavior;
(function (DeferBlockBehavior) {
    /**
     * Manual triggering mode for defer blocks. Provides control over when defer blocks render
     * and which state they render.
     */
    DeferBlockBehavior[DeferBlockBehavior["Manual"] = 0] = "Manual";
    /**
     * Playthrough mode for defer blocks. This mode behaves like defer blocks would in a browser.
     * This is the default behavior in test environments.
     */
    DeferBlockBehavior[DeferBlockBehavior["Playthrough"] = 1] = "Playthrough";
})(DeferBlockBehavior || (DeferBlockBehavior = {}));

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Registers a cleanup function associated with a prefetching trigger
 * or a regular trigger of a defer block.
 */
function storeTriggerCleanupFn(type, lDetails, cleanupFn) {
    const key = getCleanupFnKeyByType(type);
    if (lDetails[key] === null) {
        lDetails[key] = [];
    }
    lDetails[key].push(cleanupFn);
}
/**
 * Invokes registered cleanup functions either for prefetch or for regular triggers.
 */
function invokeTriggerCleanupFns(type, lDetails) {
    const key = getCleanupFnKeyByType(type);
    const cleanupFns = lDetails[key];
    if (cleanupFns !== null) {
        for (const cleanupFn of cleanupFns) {
            cleanupFn();
        }
        lDetails[key] = null;
    }
}
/**
 * Invokes registered cleanup functions for prefetch, hydrate, and regular triggers.
 */
function invokeAllTriggerCleanupFns(lDetails) {
    invokeTriggerCleanupFns(1 /* TriggerType.Prefetch */, lDetails);
    invokeTriggerCleanupFns(0 /* TriggerType.Regular */, lDetails);
    invokeTriggerCleanupFns(2 /* TriggerType.Hydrate */, lDetails);
}
function getCleanupFnKeyByType(type) {
    let key = TRIGGER_CLEANUP_FNS;
    if (type === 1 /* TriggerType.Prefetch */) {
        key = PREFETCH_TRIGGER_CLEANUP_FNS;
    }
    else if (type === 2 /* TriggerType.Hydrate */) {
        key = HYDRATE_TRIGGER_CLEANUP_FNS;
    }
    return key;
}

/**
 * Calculates a data slot index for defer block info (either static or
 * instance-specific), given an index of a defer instruction.
 */
function getDeferBlockDataIndex(deferBlockIndex) {
    // Instance state is located at the *next* position
    // after the defer block slot in an LView or TView.data.
    return deferBlockIndex + 1;
}
/** Retrieves a defer block state from an LView, given a TNode that represents a block. */
function getLDeferBlockDetails(lView, tNode) {
    const tView = lView[TVIEW];
    const slotIndex = getDeferBlockDataIndex(tNode.index);
    ngDevMode && assertIndexInDeclRange(tView, slotIndex);
    return lView[slotIndex];
}
/** Stores a defer block instance state in LView. */
function setLDeferBlockDetails(lView, deferBlockIndex, lDetails) {
    const tView = lView[TVIEW];
    const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
    ngDevMode && assertIndexInDeclRange(tView, slotIndex);
    lView[slotIndex] = lDetails;
}
/** Retrieves static info about a defer block, given a TView and a TNode that represents a block. */
function getTDeferBlockDetails(tView, tNode) {
    const slotIndex = getDeferBlockDataIndex(tNode.index);
    ngDevMode && assertIndexInDeclRange(tView, slotIndex);
    return tView.data[slotIndex];
}
/** Stores a defer block static info in `TView.data`. */
function setTDeferBlockDetails(tView, deferBlockIndex, deferBlockConfig) {
    const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
    ngDevMode && assertIndexInDeclRange(tView, slotIndex);
    tView.data[slotIndex] = deferBlockConfig;
}
function getTemplateIndexForState(newState, hostLView, tNode) {
    const tView = hostLView[TVIEW];
    const tDetails = getTDeferBlockDetails(tView, tNode);
    switch (newState) {
        case DeferBlockState.Complete:
            return tDetails.primaryTmplIndex;
        case DeferBlockState.Loading:
            return tDetails.loadingTmplIndex;
        case DeferBlockState.Error:
            return tDetails.errorTmplIndex;
        case DeferBlockState.Placeholder:
            return tDetails.placeholderTmplIndex;
        default:
            ngDevMode && throwError(`Unexpected defer block state: ${newState}`);
            return null;
    }
}
/**
 * Returns a minimum amount of time that a given state should be rendered for,
 * taking into account `minimum` parameter value. If the `minimum` value is
 * not specified - returns `null`.
 */
function getMinimumDurationForState(tDetails, currentState) {
    if (currentState === DeferBlockState.Placeholder) {
        return tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null;
    }
    else if (currentState === DeferBlockState.Loading) {
        return tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null;
    }
    return null;
}
/** Retrieves the value of the `after` parameter on the @loading block. */
function getLoadingBlockAfter(tDetails) {
    return tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null;
}
/**
 * Adds downloaded dependencies into a directive or a pipe registry,
 * making sure that a dependency doesn't yet exist in the registry.
 */
function addDepsToRegistry(currentDeps, newDeps) {
    if (!currentDeps || currentDeps.length === 0) {
        return newDeps;
    }
    const currentDepSet = new Set(currentDeps);
    for (const dep of newDeps) {
        currentDepSet.add(dep);
    }
    // If `currentDeps` is the same length, there were no new deps and can
    // return the original array.
    return currentDeps.length === currentDepSet.size ? currentDeps : Array.from(currentDepSet);
}
/** Retrieves a TNode that represents main content of a defer block. */
function getPrimaryBlockTNode(tView, tDetails) {
    const adjustedIndex = tDetails.primaryTmplIndex + HEADER_OFFSET;
    return getTNode(tView, adjustedIndex);
}
/**
 * Asserts whether all dependencies for a defer block are loaded.
 * Always run this function (in dev mode) before rendering a defer
 * block in completed state.
 */
function assertDeferredDependenciesLoaded(tDetails) {
    assertEqual(tDetails.loadingState, DeferDependenciesLoadingState.COMPLETE, 'Expecting all deferred dependencies to be loaded.');
}
/**
 * Determines if a given value matches the expected structure of a defer block
 *
 * We can safely rely on the primaryTmplIndex because every defer block requires
 * that a primary template exists. All the other template options are optional.
 */
function isTDeferBlockDetails(value) {
    return (value !== null &&
        typeof value === 'object' &&
        typeof value.primaryTmplIndex === 'number');
}
/**
 * Whether a given TNode represents a defer block.
 */
function isDeferBlock(tView, tNode) {
    let tDetails = null;
    const slotIndex = getDeferBlockDataIndex(tNode.index);
    // Check if a slot index is in the reasonable range.
    // Note: we do `-1` on the right border, since defer block details are stored
    // in the `n+1` slot, see `getDeferBlockDataIndex` for more info.
    if (HEADER_OFFSET < slotIndex && slotIndex < tView.bindingStartIndex) {
        tDetails = getTDeferBlockDetails(tView, tNode);
    }
    return !!tDetails && isTDeferBlockDetails(tDetails);
}
/**
 * Tracks debugging information about a trigger.
 * @param tView TView in which the trigger is declared.
 * @param tNode TNode on which the trigger is declared.
 * @param textRepresentation Text representation of the trigger to be used for debugging purposes.
 */
function trackTriggerForDebugging(tView, tNode, textRepresentation) {
    const tDetails = getTDeferBlockDetails(tView, tNode);
    tDetails.debug ??= {};
    tDetails.debug.triggers ??= new Set();
    tDetails.debug.triggers.add(textRepresentation);
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/** Configuration object used to register passive and capturing events. */
const eventListenerOptions = {
    passive: true,
    capture: true,
};
/** Keeps track of the currently-registered `on hover` triggers. */
const hoverTriggers = new WeakMap();
/** Keeps track of the currently-registered `on interaction` triggers. */
const interactionTriggers = new WeakMap();
/** Currently-registered `viewport` triggers. */
const viewportTriggers = new WeakMap();
/** Names of the events considered as interaction events. */
const interactionEventNames = ['click', 'keydown'];
/** Names of the events considered as hover events. */
const hoverEventNames = ['mouseenter', 'mouseover', 'focusin'];
/** `IntersectionObserver` used to observe `viewport` triggers. */
let intersectionObserver = null;
/** Number of elements currently observed with `viewport` triggers. */
let observedViewportElements = 0;
/** Object keeping track of registered callbacks for a deferred block trigger. */
class DeferEventEntry {
    callbacks = new Set();
    listener = () => {
        for (const callback of this.callbacks) {
            callback();
        }
    };
}
/**
 * Registers an interaction trigger.
 * @param trigger Element that is the trigger.
 * @param callback Callback to be invoked when the trigger is interacted with.
 */
function onInteraction(trigger, callback) {
    let entry = interactionTriggers.get(trigger);
    // If this is the first entry for this element, add the listeners.
    if (!entry) {
        // Note that managing events centrally like this lends itself well to using global
        // event delegation. It currently does delegation at the element level, rather than the
        // document level, because:
        // 1. Global delegation is the most effective when there are a lot of events being registered
        // at the same time. Deferred blocks are unlikely to be used in such a way.
        // 2. Matching events to their target isn't free. For each `click` and `keydown` event we
        // would have look through all the triggers and check if the target either is the element
        // itself or it's contained within the element. Given that `click` and `keydown` are some
        // of the most common events, this may end up introducing a lot of runtime overhead.
        // 3. We're still registering only two events per element, no matter how many deferred blocks
        // are referencing it.
        entry = new DeferEventEntry();
        interactionTriggers.set(trigger, entry);
        for (const name of interactionEventNames) {
            trigger.addEventListener(name, entry.listener, eventListenerOptions);
        }
    }
    entry.callbacks.add(callback);
    return () => {
        const { callbacks, listener } = entry;
        callbacks.delete(callback);
        if (callbacks.size === 0) {
            interactionTriggers.delete(trigger);
            for (const name of interactionEventNames) {
                trigger.removeEventListener(name, listener, eventListenerOptions);
            }
        }
    };
}
/**
 * Registers a hover trigger.
 * @param trigger Element that is the trigger.
 * @param callback Callback to be invoked when the trigger is hovered over.
 */
function onHover(trigger, callback) {
    let entry = hoverTriggers.get(trigger);
    // If this is the first entry for this element, add the listener.
    if (!entry) {
        entry = new DeferEventEntry();
        hoverTriggers.set(trigger, entry);
        for (const name of hoverEventNames) {
            trigger.addEventListener(name, entry.listener, eventListenerOptions);
        }
    }
    entry.callbacks.add(callback);
    return () => {
        const { callbacks, listener } = entry;
        callbacks.delete(callback);
        if (callbacks.size === 0) {
            for (const name of hoverEventNames) {
                trigger.removeEventListener(name, listener, eventListenerOptions);
            }
            hoverTriggers.delete(trigger);
        }
    };
}
/**
 * Registers a viewport trigger.
 * @param trigger Element that is the trigger.
 * @param callback Callback to be invoked when the trigger comes into the viewport.
 * @param injector Injector that can be used by the trigger to resolve DI tokens.
 */
function onViewport(trigger, callback, injector) {
    const ngZone = injector.get(NgZone);
    let entry = viewportTriggers.get(trigger);
    intersectionObserver =
        intersectionObserver ||
            ngZone.runOutsideAngular(() => {
                return new IntersectionObserver((entries) => {
                    for (const current of entries) {
                        // Only invoke the callbacks if the specific element is intersecting.
                        if (current.isIntersecting && viewportTriggers.has(current.target)) {
                            ngZone.run(viewportTriggers.get(current.target).listener);
                        }
                    }
                });
            });
    if (!entry) {
        entry = new DeferEventEntry();
        ngZone.runOutsideAngular(() => intersectionObserver.observe(trigger));
        viewportTriggers.set(trigger, entry);
        observedViewportElements++;
    }
    entry.callbacks.add(callback);
    return () => {
        // It's possible that a different cleanup callback fully removed this element already.
        if (!viewportTriggers.has(trigger)) {
            return;
        }
        entry.callbacks.delete(callback);
        if (entry.callbacks.size === 0) {
            intersectionObserver?.unobserve(trigger);
            viewportTriggers.delete(trigger);
            observedViewportElements--;
        }
        if (observedViewportElements === 0) {
            intersectionObserver?.disconnect();
            intersectionObserver = null;
        }
    };
}
/**
 * Helper function to get the LView in which a deferred block's trigger is rendered.
 * @param deferredHostLView LView in which the deferred block is defined.
 * @param deferredTNode TNode defining the deferred block.
 * @param walkUpTimes Number of times to go up in the view hierarchy to find the trigger's view.
 *   A negative value means that the trigger is inside the block's placeholder, while an undefined
 *   value means that the trigger is in the same LView as the deferred block.
 */
function getTriggerLView(deferredHostLView, deferredTNode, walkUpTimes) {
    // The trigger is in the same view, we don't need to traverse.
    if (walkUpTimes == null) {
        return deferredHostLView;
    }
    // A positive value or zero means that the trigger is in a parent view.
    if (walkUpTimes >= 0) {
        return walkUpViews(walkUpTimes, deferredHostLView);
    }
    // If the value is negative, it means that the trigger is inside the placeholder.
    const deferredContainer = deferredHostLView[deferredTNode.index];
    ngDevMode && assertLContainer(deferredContainer);
    const triggerLView = deferredContainer[CONTAINER_HEADER_OFFSET] ?? null;
    // We need to null check, because the placeholder might not have been rendered yet.
    if (ngDevMode && triggerLView !== null) {
        const lDetails = getLDeferBlockDetails(deferredHostLView, deferredTNode);
        const renderedState = lDetails[DEFER_BLOCK_STATE];
        assertEqual(renderedState, DeferBlockState.Placeholder, 'Expected a placeholder to be rendered in this defer block.');
        assertLView(triggerLView);
    }
    return triggerLView;
}
/**
 * Gets the element that a deferred block's trigger is pointing to.
 * @param triggerLView LView in which the trigger is defined.
 * @param triggerIndex Index at which the trigger element should've been rendered.
 */
function getTriggerElement(triggerLView, triggerIndex) {
    const element = getNativeByIndex(HEADER_OFFSET + triggerIndex, triggerLView);
    ngDevMode && assertElement(element);
    return element;
}
/**
 * Registers a DOM-node based trigger.
 * @param initialLView LView in which the defer block is rendered.
 * @param tNode TNode representing the defer block.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to go up/down in the view hierarchy to find the trigger.
 * @param registerFn Function that will register the DOM events.
 * @param callback Callback to be invoked when the trigger receives the event that should render
 *     the deferred block.
 * @param type Trigger type to distinguish between regular and prefetch triggers.
 */
function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback, type) {
    const injector = initialLView[INJECTOR];
    const zone = injector.get(NgZone);
    let poll;
    function pollDomTrigger() {
        // If the initial view was destroyed, we don't need to do anything.
        if (isDestroyed(initialLView)) {
            poll.destroy();
            return;
        }
        const lDetails = getLDeferBlockDetails(initialLView, tNode);
        const renderedState = lDetails[DEFER_BLOCK_STATE];
        // If the block was loaded before the trigger was resolved, we don't need to do anything.
        if (renderedState !== DeferBlockInternalState.Initial &&
            renderedState !== DeferBlockState.Placeholder) {
            poll.destroy();
            return;
        }
        const triggerLView = getTriggerLView(initialLView, tNode, walkUpTimes);
        // Keep polling until we resolve the trigger's LView.
        if (!triggerLView) {
            // Keep polling.
            return;
        }
        poll.destroy();
        // It's possible that the trigger's view was destroyed before we resolved the trigger element.
        if (isDestroyed(triggerLView)) {
            return;
        }
        const element = getTriggerElement(triggerLView, triggerIndex);
        const cleanup = registerFn(element, () => {
            // `pollDomTrigger` runs outside the zone (because of `afterNextRender`) and registers its
            // listeners outside the zone, so we jump back into the zone prior to running the callback.
            zone.run(() => {
                if (initialLView !== triggerLView) {
                    removeLViewOnDestroy(triggerLView, cleanup);
                }
                callback();
            });
        }, injector);
        // The trigger and deferred block might be in different LViews.
        // For the main LView the cleanup would happen as a part of
        // `storeTriggerCleanupFn` logic. For trigger LView we register
        // a cleanup function there to remove event handlers in case an
        // LView gets destroyed before a trigger is invoked.
        if (initialLView !== triggerLView) {
            storeLViewOnDestroy(triggerLView, cleanup);
        }
        storeTriggerCleanupFn(type, lDetails, cleanup);
    }
    // Begin polling for the trigger.
    poll = afterRender({ read: pollDomTrigger }, { injector });
}

const DEFER_BLOCK_SSR_ID_ATTRIBUTE = 'ngb';
function setJSActionAttributes(nativeElement, eventTypes, parentDeferBlockId = null) {
    // jsaction attributes specifically should be applied to elements and not comment nodes.
    // Comment nodes also have no setAttribute function. So this avoids errors.
    if (eventTypes.length === 0 || nativeElement.nodeType !== Node.ELEMENT_NODE) {
        return;
    }
    const existingAttr = nativeElement.getAttribute(Attribute$1.JSACTION);
    // we dedupe cases where hydrate triggers are used as it's possible that
    // someone may have added an event binding to the root node that matches what the
    // hydrate trigger adds.
    const parts = eventTypes.reduce((prev, curr) => {
        // if there is no existing attribute OR it's not in the existing one, we need to add it
        return (existingAttr?.indexOf(curr) ?? -1) === -1 ? prev + curr + ':;' : prev;
    }, '');
    //  This is required to be a module accessor to appease security tests on setAttribute.
    nativeElement.setAttribute(Attribute$1.JSACTION, `${existingAttr ?? ''}${parts}`);
    const blockName = parentDeferBlockId ?? '';
    if (blockName !== '' && parts.length > 0) {
        nativeElement.setAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE, blockName);
    }
}
const sharedStashFunction = (rEl, eventType, listenerFn) => {
    const el = rEl;
    const eventListenerMap = el.__jsaction_fns ?? new Map();
    const eventListeners = eventListenerMap.get(eventType) ?? [];
    eventListeners.push(listenerFn);
    eventListenerMap.set(eventType, eventListeners);
    el.__jsaction_fns = eventListenerMap;
};
const sharedMapFunction = (rEl, jsActionMap) => {
    const el = rEl;
    let blockName = el.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE) ?? '';
    const blockSet = jsActionMap.get(blockName) ?? new Set();
    if (!blockSet.has(el)) {
        blockSet.add(el);
    }
    jsActionMap.set(blockName, blockSet);
};
function removeListenersFromBlocks(blockNames, jsActionMap) {
    if (blockNames.length > 0) {
        let blockList = [];
        for (let blockName of blockNames) {
            if (jsActionMap.has(blockName)) {
                blockList = [...blockList, ...jsActionMap.get(blockName)];
            }
        }
        const replayList = new Set(blockList);
        replayList.forEach(removeListeners);
    }
}
const removeListeners = (el) => {
    el.removeAttribute(Attribute$1.JSACTION);
    el.removeAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE);
    el.__jsaction_fns = undefined;
};
const JSACTION_EVENT_CONTRACT = new InjectionToken(ngDevMode ? 'EVENT_CONTRACT_DETAILS' : '', {
    providedIn: 'root',
    factory: () => ({}),
});
function invokeListeners(event, currentTarget) {
    const handlerFns = currentTarget?.__jsaction_fns?.get(event.type);
    if (!handlerFns || !currentTarget?.isConnected) {
        return;
    }
    for (const handler of handlerFns) {
        handler(event);
    }
}
const stashEventListeners = new Map();
/**
 * Registers a stashing function for a specific application ID.
 *
 * @param appId The unique identifier for the application instance.
 * @param fn The stashing function to associate with this app ID.
 * @returns A cleanup function that removes the stashing function when called.
 */
function setStashFn(appId, fn) {
    stashEventListeners.set(appId, fn);
    return () => stashEventListeners.delete(appId);
}
/**
 * Indicates whether the stashing code was added, prevents adding it multiple times.
 */
let isStashEventListenerImplEnabled = false;
let _stashEventListenerImpl = (lView, target, eventName, listenerFn) => { };
/**
 * Optionally stashes an event listener for later replay during hydration.
 *
 * This function delegates to an internal `_stashEventListenerImpl`, which may
 * be a no-op unless the event replay feature is enabled. When active, this
 * allows capturing event listener metadata before hydration completes, so that
 * user interactions during SSR can be replayed.
 *
 * @param lView The logical view (LView) where the listener is being registered.
 * @param target The DOM element or event target the listener is attached to.
 * @param eventName The name of the event being listened for (e.g., 'click').
 * @param listenerFn The event handler that was registered.
 */
function stashEventListenerImpl(lView, target, eventName, listenerFn) {
    _stashEventListenerImpl(lView, target, eventName, listenerFn);
}
/**
 * Enables the event listener stashing logic in a tree-shakable way.
 *
 * This function lazily sets the implementation of `_stashEventListenerImpl`
 * so that it becomes active only when `withEventReplay` is invoked. This ensures
 * that the stashing logic is excluded from production builds unless needed.
 */
function enableStashEventListenerImpl() {
    if (!isStashEventListenerImplEnabled) {
        _stashEventListenerImpl = (lView, target, eventName, listenerFn) => {
            const appId = lView[INJECTOR].get(APP_ID);
            const stashEventListener = stashEventListeners.get(appId);
            stashEventListener?.(target, eventName, listenerFn);
        };
        isStashEventListenerImplEnabled = true;
    }
}

/**
 * An internal injection token to reference `DehydratedBlockRegistry` implementation
 * in a tree-shakable way.
 */
const DEHYDRATED_BLOCK_REGISTRY = new InjectionToken(ngDevMode ? 'DEHYDRATED_BLOCK_REGISTRY' : '');
/**
 * The DehydratedBlockRegistry is used for incremental hydration purposes. It keeps
 * track of the Defer Blocks that need hydration so we can effectively
 * navigate up to the top dehydrated defer block and fire appropriate cleanup
 * functions post hydration.
 */
class DehydratedBlockRegistry {
    registry = new Map();
    cleanupFns = new Map();
    jsActionMap = inject(JSACTION_BLOCK_ELEMENT_MAP);
    contract = inject(JSACTION_EVENT_CONTRACT);
    add(blockId, info) {
        this.registry.set(blockId, info);
        // It's possible that hydration is queued that's waiting for the
        // resolution of a lazy loaded route. In this case, we ensure
        // the callback function is called to continue the hydration process
        // for the queued block set.
        if (this.awaitingCallbacks.has(blockId)) {
            const awaitingCallbacks = this.awaitingCallbacks.get(blockId);
            for (const cb of awaitingCallbacks) {
                cb();
            }
        }
    }
    get(blockId) {
        return this.registry.get(blockId) ?? null;
    }
    has(blockId) {
        return this.registry.has(blockId);
    }
    cleanup(hydratedBlocks) {
        removeListenersFromBlocks(hydratedBlocks, this.jsActionMap);
        for (let blockId of hydratedBlocks) {
            this.registry.delete(blockId);
            this.jsActionMap.delete(blockId);
            this.invokeTriggerCleanupFns(blockId);
            this.hydrating.delete(blockId);
            this.awaitingCallbacks.delete(blockId);
        }
        if (this.size === 0) {
            this.contract.instance?.cleanUp();
        }
    }
    get size() {
        return this.registry.size;
    }
    // we have to leave the lowest block Id in the registry
    // unless that block has no children
    addCleanupFn(blockId, fn) {
        let cleanupFunctions = [];
        if (this.cleanupFns.has(blockId)) {
            cleanupFunctions = this.cleanupFns.get(blockId);
        }
        cleanupFunctions.push(fn);
        this.cleanupFns.set(blockId, cleanupFunctions);
    }
    invokeTriggerCleanupFns(blockId) {
        const fns = this.cleanupFns.get(blockId) ?? [];
        for (let fn of fns) {
            fn();
        }
        this.cleanupFns.delete(blockId);
    }
    // Blocks that are being hydrated.
    hydrating = new Map();
    // Blocks that are awaiting a defer instruction finish.
    awaitingCallbacks = new Map();
    awaitParentBlock(topmostParentBlock, callback) {
        const parentBlockAwaitCallbacks = this.awaitingCallbacks.get(topmostParentBlock) ?? [];
        parentBlockAwaitCallbacks.push(callback);
        this.awaitingCallbacks.set(topmostParentBlock, parentBlockAwaitCallbacks);
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: DehydratedBlockRegistry,
        providedIn: null,
        factory: () => new DehydratedBlockRegistry(),
    });
}

/**
 * The name of the key used in the TransferState collection,
 * where hydration information is located.
 */
const TRANSFER_STATE_TOKEN_ID = '__nghData__';
/**
 * Lookup key used to reference DOM hydration data (ngh) in `TransferState`.
 */
const NGH_DATA_KEY = makeStateKey(TRANSFER_STATE_TOKEN_ID);
/**
 * The name of the key used in the TransferState collection,
 * where serialized defer block information is located.
 */
const TRANSFER_STATE_DEFER_BLOCKS_INFO = '__nghDeferData__';
/**
 * Lookup key used to retrieve defer block datain `TransferState`.
 */
const NGH_DEFER_BLOCKS_KEY = makeStateKey(TRANSFER_STATE_DEFER_BLOCKS_INFO);
/**
 * The name of the attribute that would be added to host component
 * nodes and contain a reference to a particular slot in transferred
 * state that contains the necessary hydration info for this component.
 */
const NGH_ATTR_NAME = 'ngh';
/**
 * Marker used in a comment node to ensure hydration content integrity
 */
const SSR_CONTENT_INTEGRITY_MARKER = 'nghm';
/**
 * Reference to a function that reads `ngh` attribute value from a given RNode
 * and retrieves hydration information from the TransferState using that value
 * as an index. Returns `null` by default, when hydration is not enabled.
 *
 * @param rNode Component's host element.
 * @param injector Injector that this component has access to.
 * @param isRootView Specifies whether we trying to read hydration info for the root view.
 */
let _retrieveHydrationInfoImpl = () => null;
function retrieveHydrationInfoImpl(rNode, injector, isRootView = false) {
    let nghAttrValue = rNode.getAttribute(NGH_ATTR_NAME);
    if (nghAttrValue == null)
        return null;
    // For cases when a root component also acts as an anchor node for a ViewContainerRef
    // (for example, when ViewContainerRef is injected in a root component), there is a need
    // to serialize information about the component itself, as well as an LContainer that
    // represents this ViewContainerRef. Effectively, we need to serialize 2 pieces of info:
    // (1) hydration info for the root component itself and (2) hydration info for the
    // ViewContainerRef instance (an LContainer). Each piece of information is included into
    // the hydration data (in the TransferState object) separately, thus we end up with 2 ids.
    // Since we only have 1 root element, we encode both bits of info into a single string:
    // ids are separated by the `|` char (e.g. `10|25`, where `10` is the ngh for a component view
    // and 25 is the `ngh` for a root view which holds LContainer).
    const [componentViewNgh, rootViewNgh] = nghAttrValue.split('|');
    nghAttrValue = isRootView ? rootViewNgh : componentViewNgh;
    if (!nghAttrValue)
        return null;
    // We've read one of the ngh ids, keep the remaining one, so that
    // we can set it back on the DOM element.
    const rootNgh = rootViewNgh ? `|${rootViewNgh}` : '';
    const remainingNgh = isRootView ? componentViewNgh : rootNgh;
    let data = {};
    // An element might have an empty `ngh` attribute value (e.g. `<comp ngh="" />`),
    // which means that no special annotations are required. Do not attempt to read
    // from the TransferState in this case.
    if (nghAttrValue !== '') {
        const transferState = injector.get(TransferState, null, { optional: true });
        if (transferState !== null) {
            const nghData = transferState.get(NGH_DATA_KEY, []);
            // The nghAttrValue is always a number referencing an index
            // in the hydration TransferState data.
            data = nghData[Number(nghAttrValue)];
            // If the `ngh` attribute exists and has a non-empty value,
            // the hydration info *must* be present in the TransferState.
            // If there is no data for some reasons, this is an error.
            ngDevMode && assertDefined(data, 'Unable to retrieve hydration info from the TransferState.');
        }
    }
    const dehydratedView = {
        data,
        firstChild: rNode.firstChild ?? null,
    };
    if (isRootView) {
        // If there is hydration info present for the root view, it means that there was
        // a ViewContainerRef injected in the root component. The root component host element
        // acted as an anchor node in this scenario. As a result, the DOM nodes that represent
        // embedded views in this ViewContainerRef are located as siblings to the host node,
        // i.e. `<app-root /><#VIEW1><#VIEW2>...<!--container-->`. In this case, the current
        // node becomes the first child of this root view and the next sibling is the first
        // element in the DOM segment.
        dehydratedView.firstChild = rNode;
        // We use `0` here, since this is the slot (right after the HEADER_OFFSET)
        // where a component LView or an LContainer is located in a root LView.
        setSegmentHead(dehydratedView, 0, rNode.nextSibling);
    }
    if (remainingNgh) {
        // If we have only used one of the ngh ids, store the remaining one
        // back on this RNode.
        rNode.setAttribute(NGH_ATTR_NAME, remainingNgh);
    }
    else {
        // The `ngh` attribute is cleared from the DOM node now
        // that the data has been retrieved for all indices.
        rNode.removeAttribute(NGH_ATTR_NAME);
    }
    // Note: don't check whether this node was claimed for hydration,
    // because this node might've been previously claimed while processing
    // template instructions.
    ngDevMode && markRNodeAsClaimedByHydration(rNode, /* checkIfAlreadyClaimed */ false);
    ngDevMode && ngDevMode.hydratedComponents++;
    return dehydratedView;
}
/**
 * Sets the implementation for the `retrieveHydrationInfo` function.
 */
function enableRetrieveHydrationInfoImpl() {
    _retrieveHydrationInfoImpl = retrieveHydrationInfoImpl;
}
/**
 * Retrieves hydration info by reading the value from the `ngh` attribute
 * and accessing a corresponding slot in TransferState storage.
 */
function retrieveHydrationInfo(rNode, injector, isRootView = false) {
    return _retrieveHydrationInfoImpl(rNode, injector, isRootView);
}
/**
 * Retrieves the necessary object from a given ViewRef to serialize:
 *  - an LView for component views
 *  - an LContainer for cases when component acts as a ViewContainerRef anchor
 *  - `null` in case of an embedded view
 */
function getLNodeForHydration(viewRef) {
    // Reading an internal field from `ViewRef` instance.
    let lView = viewRef._lView;
    const tView = lView[TVIEW];
    // A registered ViewRef might represent an instance of an
    // embedded view, in which case we do not need to annotate it.
    if (tView.type === 2 /* TViewType.Embedded */) {
        return null;
    }
    // Check if it's a root view and if so, retrieve component's
    // LView from the first slot after the header.
    if (isRootView(lView)) {
        lView = lView[HEADER_OFFSET];
    }
    return lView;
}
function getTextNodeContent(node) {
    return node.textContent?.replace(/\s/gm, '');
}
/**
 * Restores text nodes and separators into the DOM that were lost during SSR
 * serialization. The hydration process replaces empty text nodes and text
 * nodes that are immediately adjacent to other text nodes with comment nodes
 * that this method filters on to restore those missing nodes that the
 * hydration process is expecting to be present.
 *
 * @param node The app's root HTML Element
 */
function processTextNodeMarkersBeforeHydration(node) {
    const doc = getDocument();
    const commentNodesIterator = doc.createNodeIterator(node, NodeFilter.SHOW_COMMENT, {
        acceptNode(node) {
            const content = getTextNodeContent(node);
            const isTextNodeMarker = content === "ngetn" /* TextNodeMarker.EmptyNode */ || content === "ngtns" /* TextNodeMarker.Separator */;
            return isTextNodeMarker ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
        },
    });
    let currentNode;
    // We cannot modify the DOM while using the commentIterator,
    // because it throws off the iterator state.
    // So we collect all marker nodes first and then follow up with
    // applying the changes to the DOM: either inserting an empty node
    // or just removing the marker if it was used as a separator.
    const nodes = [];
    while ((currentNode = commentNodesIterator.nextNode())) {
        nodes.push(currentNode);
    }
    for (const node of nodes) {
        if (node.textContent === "ngetn" /* TextNodeMarker.EmptyNode */) {
            node.replaceWith(doc.createTextNode(''));
        }
        else {
            node.remove();
        }
    }
}
/**
 * Internal type that represents a claimed node.
 * Only used in dev mode.
 */
var HydrationStatus;
(function (HydrationStatus) {
    HydrationStatus["Hydrated"] = "hydrated";
    HydrationStatus["Skipped"] = "skipped";
    HydrationStatus["Mismatched"] = "mismatched";
})(HydrationStatus || (HydrationStatus = {}));
const HYDRATION_INFO_KEY = '__ngDebugHydrationInfo__';
function patchHydrationInfo(node, info) {
    node[HYDRATION_INFO_KEY] = info;
}
function readHydrationInfo(node) {
    return node[HYDRATION_INFO_KEY] ?? null;
}
/**
 * Marks a node as "claimed" by hydration process.
 * This is needed to make assessments in tests whether
 * the hydration process handled all nodes.
 */
function markRNodeAsClaimedByHydration(node, checkIfAlreadyClaimed = true) {
    if (!ngDevMode) {
        throw new Error('Calling `markRNodeAsClaimedByHydration` in prod mode ' +
            'is not supported and likely a mistake.');
    }
    if (checkIfAlreadyClaimed && isRNodeClaimedForHydration(node)) {
        throw new Error('Trying to claim a node, which was claimed already.');
    }
    patchHydrationInfo(node, { status: HydrationStatus.Hydrated });
    ngDevMode.hydratedNodes++;
}
function markRNodeAsSkippedByHydration(node) {
    if (!ngDevMode) {
        throw new Error('Calling `markRNodeAsSkippedByHydration` in prod mode ' +
            'is not supported and likely a mistake.');
    }
    patchHydrationInfo(node, { status: HydrationStatus.Skipped });
    ngDevMode.componentsSkippedHydration++;
}
function countBlocksSkippedByHydration(injector) {
    const transferState = injector.get(TransferState);
    const nghDeferData = transferState.get(NGH_DEFER_BLOCKS_KEY, {});
    if (ngDevMode) {
        ngDevMode.deferBlocksWithIncrementalHydration = Object.keys(nghDeferData).length;
    }
}
function markRNodeAsHavingHydrationMismatch(node, expectedNodeDetails = null, actualNodeDetails = null) {
    if (!ngDevMode) {
        throw new Error('Calling `markRNodeAsMismatchedByHydration` in prod mode ' +
            'is not supported and likely a mistake.');
    }
    // The RNode can be a standard HTMLElement (not an Angular component or directive)
    // The devtools component tree only displays Angular components & directives
    // Therefore we attach the debug info to the closest component/directive
    while (node && !getComponent(node)) {
        node = node?.parentNode;
    }
    if (node) {
        patchHydrationInfo(node, {
            status: HydrationStatus.Mismatched,
            expectedNodeDetails,
            actualNodeDetails,
        });
    }
}
function isRNodeClaimedForHydration(node) {
    return readHydrationInfo(node)?.status === HydrationStatus.Hydrated;
}
function setSegmentHead(hydrationInfo, index, node) {
    hydrationInfo.segmentHeads ??= {};
    hydrationInfo.segmentHeads[index] = node;
}
function getSegmentHead(hydrationInfo, index) {
    return hydrationInfo.segmentHeads?.[index] ?? null;
}
function isIncrementalHydrationEnabled(injector) {
    return injector.get(IS_INCREMENTAL_HYDRATION_ENABLED, false, {
        optional: true,
    });
}
/** Throws an error if the incremental hydration is not enabled */
function assertIncrementalHydrationIsConfigured(injector) {
    if (!isIncrementalHydrationEnabled(injector)) {
        throw new RuntimeError(508 /* RuntimeErrorCode.MISCONFIGURED_INCREMENTAL_HYDRATION */, 'Angular has detected that some `@defer` blocks use `hydrate` triggers, ' +
            'but incremental hydration was not enabled. Please ensure that the `withIncrementalHydration()` ' +
            'call is added as an argument for the `provideClientHydration()` function call ' +
            'in your application config.');
    }
}
/** Throws an error if the ssrUniqueId on the LDeferBlockDetails is not present  */
function assertSsrIdDefined(ssrUniqueId) {
    assertDefined(ssrUniqueId, 'Internal error: expecting an SSR id for a defer block that should be hydrated, but the id is not present');
}
/**
 * Returns the size of an <ng-container>, using either the information
 * serialized in `ELEMENT_CONTAINERS` (element container size) or by
 * computing the sum of root nodes in all dehydrated views in a given
 * container (in case this `<ng-container>` was also used as a view
 * container host node, e.g. <ng-container *ngIf>).
 */
function getNgContainerSize(hydrationInfo, index) {
    const data = hydrationInfo.data;
    let size = data[ELEMENT_CONTAINERS]?.[index] ?? null;
    // If there is no serialized information available in the `ELEMENT_CONTAINERS` slot,
    // check if we have info about view containers at this location (e.g.
    // `<ng-container *ngIf>`) and use container size as a number of root nodes in this
    // element container.
    if (size === null && data[CONTAINERS]?.[index]) {
        size = calcSerializedContainerSize(hydrationInfo, index);
    }
    return size;
}
function isSerializedElementContainer(hydrationInfo, index) {
    return hydrationInfo.data[ELEMENT_CONTAINERS]?.[index] !== undefined;
}
function getSerializedContainerViews(hydrationInfo, index) {
    return hydrationInfo.data[CONTAINERS]?.[index] ?? null;
}
/**
 * Computes the size of a serialized container (the number of root nodes)
 * by calculating the sum of root nodes in all dehydrated views in this container.
 */
function calcSerializedContainerSize(hydrationInfo, index) {
    const views = getSerializedContainerViews(hydrationInfo, index) ?? [];
    let numNodes = 0;
    for (let view of views) {
        numNodes += view[NUM_ROOT_NODES] * (view[MULTIPLIER] ?? 1);
    }
    return numNodes;
}
/**
 * Attempt to initialize the `disconnectedNodes` field of the given
 * `DehydratedView`. Returns the initialized value.
 */
function initDisconnectedNodes(hydrationInfo) {
    // Check if we are processing disconnected info for the first time.
    if (typeof hydrationInfo.disconnectedNodes === 'undefined') {
        const nodeIds = hydrationInfo.data[DISCONNECTED_NODES];
        hydrationInfo.disconnectedNodes = nodeIds ? new Set(nodeIds) : null;
    }
    return hydrationInfo.disconnectedNodes;
}
/**
 * Checks whether a node is annotated as "disconnected", i.e. not present
 * in the DOM at serialization time. We should not attempt hydration for
 * such nodes and instead, use a regular "creation mode".
 */
function isDisconnectedNode$1(hydrationInfo, index) {
    // Check if we are processing disconnected info for the first time.
    if (typeof hydrationInfo.disconnectedNodes === 'undefined') {
        const nodeIds = hydrationInfo.data[DISCONNECTED_NODES];
        hydrationInfo.disconnectedNodes = nodeIds ? new Set(nodeIds) : null;
    }
    return !!initDisconnectedNodes(hydrationInfo)?.has(index);
}
/**
 * Helper function to prepare text nodes for serialization by ensuring
 * that seperate logical text blocks in the DOM remain separate after
 * serialization.
 */
function processTextNodeBeforeSerialization(context, node) {
    // Handle cases where text nodes can be lost after DOM serialization:
    //  1. When there is an *empty text node* in DOM: in this case, this
    //     node would not make it into the serialized string and as a result,
    //     this node wouldn't be created in a browser. This would result in
    //     a mismatch during the hydration, where the runtime logic would expect
    //     a text node to be present in live DOM, but no text node would exist.
    //     Example: `<span>{{ name }}</span>` when the `name` is an empty string.
    //     This would result in `<span></span>` string after serialization and
    //     in a browser only the `span` element would be created. To resolve that,
    //     an extra comment node is appended in place of an empty text node and
    //     that special comment node is replaced with an empty text node *before*
    //     hydration.
    //  2. When there are 2 consecutive text nodes present in the DOM.
    //     Example: `<div>Hello <ng-container *ngIf="true">world</ng-container></div>`.
    //     In this scenario, the live DOM would look like this:
    //       <div>#text('Hello ') #text('world') #comment('container')</div>
    //     Serialized string would look like this: `<div>Hello world<!--container--></div>`.
    //     The live DOM in a browser after that would be:
    //       <div>#text('Hello world') #comment('container')</div>
    //     Notice how 2 text nodes are now "merged" into one. This would cause hydration
    //     logic to fail, since it'd expect 2 text nodes being present, not one.
    //     To fix this, we insert a special comment node in between those text nodes, so
    //     serialized representation is: `<div>Hello <!--ngtns-->world<!--container--></div>`.
    //     This forces browser to create 2 text nodes separated by a comment node.
    //     Before running a hydration process, this special comment node is removed, so the
    //     live DOM has exactly the same state as it was before serialization.
    // Collect this node as required special annotation only when its
    // contents is empty. Otherwise, such text node would be present on
    // the client after server-side rendering and no special handling needed.
    const el = node;
    const corruptedTextNodes = context.corruptedTextNodes;
    if (el.textContent === '') {
        corruptedTextNodes.set(el, "ngetn" /* TextNodeMarker.EmptyNode */);
    }
    else if (el.nextSibling?.nodeType === Node.TEXT_NODE) {
        corruptedTextNodes.set(el, "ngtns" /* TextNodeMarker.Separator */);
    }
}
function convertHydrateTriggersToJsAction(triggers) {
    let actionList = [];
    if (triggers !== null) {
        if (triggers.has(4 /* DeferBlockTrigger.Hover */)) {
            actionList.push(...hoverEventNames);
        }
        if (triggers.has(3 /* DeferBlockTrigger.Interaction */)) {
            actionList.push(...interactionEventNames);
        }
    }
    return actionList;
}
/**
 * Builds a queue of blocks that need to be hydrated, looking up the
 * tree to the topmost defer block that exists in the tree that hasn't
 * been hydrated, but exists in the registry. This queue is in top down
 * hierarchical order as a list of defer block ids.
 * Note: This is utilizing serialized information to navigate up the tree
 */
function getParentBlockHydrationQueue(deferBlockId, injector) {
    const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
    const transferState = injector.get(TransferState);
    const deferBlockParents = transferState.get(NGH_DEFER_BLOCKS_KEY, {});
    let isTopMostDeferBlock = false;
    let currentBlockId = deferBlockId;
    let parentBlockPromise = null;
    const hydrationQueue = [];
    while (!isTopMostDeferBlock && currentBlockId) {
        ngDevMode &&
            assertEqual(hydrationQueue.indexOf(currentBlockId), -1, 'Internal error: defer block hierarchy has a cycle.');
        isTopMostDeferBlock = dehydratedBlockRegistry.has(currentBlockId);
        const hydratingParentBlock = dehydratedBlockRegistry.hydrating.get(currentBlockId);
        if (parentBlockPromise === null && hydratingParentBlock != null) {
            parentBlockPromise = hydratingParentBlock.promise;
            break;
        }
        hydrationQueue.unshift(currentBlockId);
        currentBlockId = deferBlockParents[currentBlockId][DEFER_PARENT_BLOCK_ID];
    }
    return { parentBlockPromise, hydrationQueue };
}
function gatherDeferBlocksByJSActionAttribute(doc) {
    const jsactionNodes = doc.body.querySelectorAll('[jsaction]');
    const blockMap = new Set();
    const eventTypes = [hoverEventNames.join(':;'), interactionEventNames.join(':;')].join('|');
    for (let node of jsactionNodes) {
        const attr = node.getAttribute('jsaction');
        const blockId = node.getAttribute('ngb');
        if (attr?.match(eventTypes) && blockId !== null) {
            blockMap.add(node);
        }
    }
    return blockMap;
}
function appendDeferBlocksToJSActionMap(doc, injector) {
    const blockMap = gatherDeferBlocksByJSActionAttribute(doc);
    const jsActionMap = injector.get(JSACTION_BLOCK_ELEMENT_MAP);
    for (let rNode of blockMap) {
        sharedMapFunction(rNode, jsActionMap);
    }
}
/**
 * Retrieves defer block hydration information from the TransferState.
 *
 * @param injector Injector that this component has access to.
 */
let _retrieveDeferBlockDataImpl = () => {
    return {};
};
function retrieveDeferBlockDataImpl(injector) {
    const transferState = injector.get(TransferState, null, { optional: true });
    if (transferState !== null) {
        const nghDeferData = transferState.get(NGH_DEFER_BLOCKS_KEY, {});
        ngDevMode &&
            assertDefined(nghDeferData, 'Unable to retrieve defer block info from the TransferState.');
        return nghDeferData;
    }
    return {};
}
/**
 * Sets the implementation for the `retrieveDeferBlockData` function.
 */
function enableRetrieveDeferBlockDataImpl() {
    _retrieveDeferBlockDataImpl = retrieveDeferBlockDataImpl;
}
/**
 * Retrieves defer block data from TransferState storage
 */
function retrieveDeferBlockData(injector) {
    return _retrieveDeferBlockDataImpl(injector);
}
function isTimerTrigger(triggerInfo) {
    return typeof triggerInfo === 'object' && triggerInfo.trigger === 5 /* DeferBlockTrigger.Timer */;
}
function getHydrateTimerTrigger(blockData) {
    const trigger = blockData[DEFER_HYDRATE_TRIGGERS]?.find((t) => isTimerTrigger(t));
    return trigger?.delay ?? null;
}
function hasHydrateTrigger(blockData, trigger) {
    return blockData[DEFER_HYDRATE_TRIGGERS]?.includes(trigger) ?? false;
}
/**
 * Creates a summary of the given serialized defer block, which is used later to properly initialize
 * specific triggers.
 */
function createBlockSummary(blockInfo) {
    return {
        data: blockInfo,
        hydrate: {
            idle: hasHydrateTrigger(blockInfo, 0 /* DeferBlockTrigger.Idle */),
            immediate: hasHydrateTrigger(blockInfo, 1 /* DeferBlockTrigger.Immediate */),
            timer: getHydrateTimerTrigger(blockInfo),
            viewport: hasHydrateTrigger(blockInfo, 2 /* DeferBlockTrigger.Viewport */),
        },
    };
}
/**
 * Processes all of the defer block data in the transfer state and creates a map of the summaries
 */
function processBlockData(injector) {
    const blockData = retrieveDeferBlockData(injector);
    let blockDetails = new Map();
    for (let blockId in blockData) {
        blockDetails.set(blockId, createBlockSummary(blockDat   a[blockId]));
    }
    return blockDetails;
}
function isSsrContentsIntegrity(node) {
    return (!!node &&
        node.nodeType === Node.COMMENT_NODE &&
        node.textContent?.trim() === SSR_CONTENT_INTEGRITY_MARKER);
}
function skipTextNodes(node) {
    // Ignore whitespace. Before the <body>, we shouldn't find text nodes that aren't whitespace.
    while (node && node.nodeType === Node.TEXT_NODE) {
        node = node.previousSibling;
    }
    return node;
}
/**
 * Verifies whether the DOM contains a special marker added during SSR time to make sure
 * there is no SSR'ed contents transformations happen after SSR is completed. Typically that
 * happens either by CDN or during the build process as an optimization to remove comment nodes.
 * Hydration process requires comment nodes produced by Angular to locate correct DOM segments.
 * When this special marker is *not* present - throw an error and do not proceed with hydration,
 * since it will not be able to function correctly.
 *
 * Note: this function is invoked only on the client, so it's safe to use DOM APIs.
 */
function verifySsrContentsIntegrity(doc) {
    for (const node of doc.body.childNodes) {
        if (isSsrContentsIntegrity(node)) {
            return;
        }
    }
    // Check if the HTML parser may have moved the marker to just before the <body> tag,
    // e.g. because the body tag was implicit and not present in the markup. An implicit body
    // tag is unlikely to interfer with whitespace/comments inside of the app's root element.
    // Case 1: Implicit body. Example:
    //   <!doctype html><head><title>Hi</title></head><!--nghm--><app-root></app-root>
    const beforeBody = skipTextNodes(doc.body.previousSibling);
    if (isSsrContentsIntegrity(beforeBody)) {
        return;
    }
    // Case 2: Implicit body & head. Example:
    //   <!doctype html><head><title>Hi</title><!--nghm--><app-root></app-root>
    let endOfHead = skipTextNodes(doc.head.lastChild);
    if (isSsrContentsIntegrity(endOfHead)) {
        return;
    }
    throw new RuntimeError(-507 /* RuntimeErrorCode.MISSING_SSR_CONTENT_INTEGRITY_MARKER */, typeof ngDevMode !== 'undefined' &&
        ngDevMode &&
        'Angular hydration logic detected that HTML content of this page was modified after it ' +
            'was produced during server side rendering. Make sure that there are no optimizations ' +
            'that remove comment nodes from HTML enabled on your CDN. Angular hydration ' +
            'relies on HTML produced by the server, including whitespaces and comment nodes.');
}

/** Refreshes all content queries declared by directives in a given view */
function refreshContentQueries(tView, lView) {
    const contentQueries = tView.contentQueries;
    if (contentQueries !== null) {
        const prevConsumer = setActiveConsumer$1(null);
        try {
            for (let i = 0; i < contentQueries.length; i += 2) {
                const queryStartIdx = contentQueries[i];
                const directiveDefIdx = contentQueries[i + 1];
                if (directiveDefIdx !== -1) {
                    const directiveDef = tView.data[directiveDefIdx];
                    ngDevMode && assertDefined(directiveDef, 'DirectiveDef not found.');
                    ngDevMode &&
                        assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined');
                    setCurrentQueryIndex(queryStartIdx);
                    directiveDef.contentQueries(2 /* RenderFlags.Update */, lView[directiveDefIdx], directiveDefIdx);
                }
            }
        }
        finally {
            setActiveConsumer$1(prevConsumer);
        }
    }
}
function executeViewQueryFn(flags, viewQueryFn, component) {
    ngDevMode && assertDefined(viewQueryFn, 'View queries function to execute must be defined.');
    setCurrentQueryIndex(0);
    const prevConsumer = setActiveConsumer$1(null);
    try {
        viewQueryFn(flags, component);
    }
    finally {
        setActiveConsumer$1(prevConsumer);
    }
}
function executeContentQueries(tView, tNode, lView) {
    if (isContentQueryHost(tNode)) {
        const prevConsumer = setActiveConsumer$1(null);
        try {
            const start = tNode.directiveStart;
            const end = tNode.directiveEnd;
            for (let directiveIndex = start; directiveIndex < end; directiveIndex++) {
                const def = tView.data[directiveIndex];
                if (def.contentQueries) {
                    const directiveInstance = lView[directiveIndex];
                    ngDevMode &&
                        assertDefined(directiveIndex, 'Incorrect reference to a directive defining a content query');
                    def.contentQueries(1 /* RenderFlags.Create */, directiveInstance, directiveIndex);
                }
            }
        }
        finally {
            setActiveConsumer$1(prevConsumer);
        }
    }
}

/**
 * Defines the CSS styles encapsulation policies for the {@link /api/core/Component Component} decorator's
 * `encapsulation` option.
 *
 * See {@link Component#encapsulation encapsulation}.
 *
 * @usageNotes
 * ### Example
 *
 * {@example core/ts/metadata/encapsulation.ts region='longform'}
 *
 * @publicApi
 */
var ViewEncapsulation;
(function (ViewEncapsulation) {
    // TODO: consider making `ViewEncapsulation` a `const enum` instead. See
    // https://github.com/angular/angular/issues/44119 for additional information.
    /**
     * Emulates a native Shadow DOM encapsulation behavior by adding a specific attribute to the
     * component's host element and applying the same attribute to all the CSS selectors provided
     * via {@link Component#styles styles} or {@link Component#styleUrls styleUrls}.
     *
     * This is the default option.
     */
    ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
    // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.
    /**
     * Doesn't provide any sort of CSS style encapsulation, meaning that all the styles provided
     * via {@link Component#styles styles} or {@link Component#styleUrls styleUrls} are applicable
     * to any HTML element of the application regardless of their host Component.
     */
    ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
    /**
     * Uses the browser's native Shadow DOM API to encapsulate CSS styles, meaning that it creates
     * a ShadowRoot for the component's host element which is then used to encapsulate
     * all the Component's styling.
     */
    ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
})(ViewEncapsulation || (ViewEncapsulation = {}));

/**
 * @fileoverview
 * A module to facilitate use of a Trusted Types policy internally within
 * Angular. It lazily constructs the Trusted Types policy, providing helper
 * utilities for promoting strings to Trusted Types. When Trusted Types are not
 * available, strings are used as a fallback.
 * @security All use of this module is security-sensitive and should go through
 * security review.
 */
/**
 * The Trusted Types policy, or null if Trusted Types are not
 * enabled/supported, or undefined if the policy has not been created yet.
 */
let policy$1;
/**
 * Returns the Trusted Types policy, or null if Trusted Types are not
 * enabled/supported. The first call to this function will create the policy.
 */
function getPolicy$1() {
    if (policy$1 === undefined) {
        policy$1 = null;
        if (_global.trustedTypes) {
            try {
                policy$1 = _global.trustedTypes.createPolicy('angular', {
                    createHTML: (s) => s,
                    createScript: (s) => s,
                    createScriptURL: (s) => s,
                });
            }
            catch {
                // trustedTypes.createPolicy throws if called with a name that is
                // already registered, even in report-only mode. Until the API changes,
                // catch the error not to break the applications functionally. In such
                // cases, the code will fall back to using strings.
            }
        }
    }
    return policy$1;
}
/**
 * Unsafely promote a string to a TrustedHTML, falling back to strings when
 * Trusted Types are not available.
 * @security This is a security-sensitive function; any use of this function
 * must go through security review. In particular, it must be assured that the
 * provided string will never cause an XSS vulnerability if used in a context
 * that will be interpreted as HTML by a browser, e.g. when assigning to
 * element.innerHTML.
 */
function trustedHTMLFromString(html) {
    return getPolicy$1()?.createHTML(html) || html;
}
/**
 * Unsafely promote a string to a TrustedScriptURL, falling back to strings
 * when Trusted Types are not available.
 * @security This is a security-sensitive function; any use of this function
 * must go through security review. In particular, it must be assured that the
 * provided string will never cause an XSS vulnerability if used in a context
 * that will cause a browser to load and execute a resource, e.g. when
 * assigning to script.src.
 */
function trustedScriptURLFromString(url) {
    return getPolicy$1()?.createScriptURL(url) || url;
}

/**
 * @fileoverview
 * A module to facilitate use of a Trusted Types policy internally within
 * Angular specifically for bypassSecurityTrust* and custom sanitizers. It
 * lazily constructs the Trusted Types policy, providing helper utilities for
 * promoting strings to Trusted Types. When Trusted Types are not available,
 * strings are used as a fallback.
 * @security All use of this module is security-sensitive and should go through
 * security review.
 */
/**
 * The Trusted Types policy, or null if Trusted Types are not
 * enabled/supported, or undefined if the policy has not been created yet.
 */
let policy;
/**
 * Returns the Trusted Types policy, or null if Trusted Types are not
 * enabled/supported. The first call to this function will create the policy.
 */
function getPolicy() {
    if (policy === undefined) {
        policy = null;
        if (_global.trustedTypes) {
            try {
                policy = _global.trustedTypes.createPolicy('angular#unsafe-bypass', {
                    createHTML: (s) => s,
                    createScript: (s) => s,
                    createScriptURL: (s) => s,
                });
            }
            catch {
                // trustedTypes.createPolicy throws if called with a name that is
                // already registered, even in report-only mode. Until the API changes,
                // catch the error not to break the applications functionally. In such
                // cases, the code will fall back to using strings.
            }
        }
    }
    return policy;
}
/**
 * Unsafely promote a string to a TrustedHTML, falling back to strings when
 * Trusted Types are not available.
 * @security This is a security-sensitive function; any use of this function
 * must go through security review. In particular, it must be assured that it
 * is only passed strings that come directly from custom sanitizers or the
 * bypassSecurityTrust* functions.
 */
function trustedHTMLFromStringBypass(html) {
    return getPolicy()?.createHTML(html) || html;
}
/**
 * Unsafely promote a string to a TrustedScript, falling back to strings when
 * Trusted Types are not available.
 * @security This is a security-sensitive function; any use of this function
 * must go through security review. In particular, it must be assured that it
 * is only passed strings that come directly from custom sanitizers or the
 * bypassSecurityTrust* functions.
 */
function trustedScriptFromStringBypass(script) {
    return getPolicy()?.createScript(script) || script;
}
/**
 * Unsafely promote a string to a TrustedScriptURL, falling back to strings
 * when Trusted Types are not available.
 * @security This is a security-sensitive function; any use of this function
 * must go through security review. In particular, it must be assured that it
 * is only passed strings that come directly from custom sanitizers or the
 * bypassSecurityTrust* functions.
 */
function trustedScriptURLFromStringBypass(url) {
    return getPolicy()?.createScriptURL(url) || url;
}

class SafeValueImpl {
    changingThisBreaksApplicationSecurity;
    constructor(changingThisBreaksApplicationSecurity) {
        this.changingThisBreaksApplicationSecurity = changingThisBreaksApplicationSecurity;
    }
    toString() {
        return (`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity}` +
            ` (see ${XSS_SECURITY_URL})`);
    }
}
class SafeHtmlImpl extends SafeValueImpl {
    getTypeName() {
        return "HTML" /* BypassType.Html */;
    }
}
class SafeStyleImpl extends SafeValueImpl {
    getTypeName() {
        return "Style" /* BypassType.Style */;
    }
}
class SafeScriptImpl extends SafeValueImpl {
    getTypeName() {
        return "Script" /* BypassType.Script */;
    }
}
class SafeUrlImpl extends SafeValueImpl {
    getTypeName() {
        return "URL" /* BypassType.Url */;
    }
}
class SafeResourceUrlImpl extends SafeValueImpl {
    getTypeName() {
        return "ResourceURL" /* BypassType.ResourceUrl */;
    }
}
function unwrapSafeValue(value) {
    return value instanceof SafeValueImpl
        ? value.changingThisBreaksApplicationSecurity
        : value;
}
function allowSanitizationBypassAndThrow(value, type) {
    const actualType = getSanitizationBypassType(value);
    if (actualType != null && actualType !== type) {
        // Allow ResourceURLs in URL contexts, they are strictly more trusted.
        if (actualType === "ResourceURL" /* BypassType.ResourceUrl */ && type === "URL" /* BypassType.Url */)
            return true;
        throw new Error(`Required a safe ${type}, got a ${actualType} (see ${XSS_SECURITY_URL})`);
    }
    return actualType === type;
}
function getSanitizationBypassType(value) {
    return (value instanceof SafeValueImpl && value.getTypeName()) || null;
}
/**
 * Mark `html` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link htmlSanitizer} to be trusted implicitly.
 *
 * @param trustedHtml `html` string which needs to be implicitly trusted.
 * @returns a `html` which has been branded to be implicitly trusted.
 */
function bypassSanitizationTrustHtml(trustedHtml) {
    return new SafeHtmlImpl(trustedHtml);
}
/**
 * Mark `style` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link styleSanitizer} to be trusted implicitly.
 *
 * @param trustedStyle `style` string which needs to be implicitly trusted.
 * @returns a `style` hich has been branded to be implicitly trusted.
 */
function bypassSanitizationTrustStyle(trustedStyle) {
    return new SafeStyleImpl(trustedStyle);
}
/**
 * Mark `script` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link scriptSanitizer} to be trusted implicitly.
 *
 * @param trustedScript `script` string which needs to be implicitly trusted.
 * @returns a `script` which has been branded to be implicitly trusted.
 */
function bypassSanitizationTrustScript(trustedScript) {
    return new SafeScriptImpl(trustedScript);
}
/**
 * Mark `url` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link urlSanitizer} to be trusted implicitly.
 *
 * @param trustedUrl `url` string which needs to be implicitly trusted.
 * @returns a `url`  which has been branded to be implicitly trusted.
 */
function bypassSanitizationTrustUrl(trustedUrl) {
    return new SafeUrlImpl(trustedUrl);
}
/**
 * Mark `url` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link resourceUrlSanitizer} to be trusted implicitly.
 *
 * @param trustedResourceUrl `url` string which needs to be implicitly trusted.
 * @returns a `url` which has been branded to be implicitly trusted.
 */
function bypassSanitizationTrustResourceUrl(trustedResourceUrl) {
    return new SafeResourceUrlImpl(trustedResourceUrl);
}

/**
 * This helper is used to get hold of an inert tree of DOM elements containing dirty HTML
 * that needs sanitizing.
 * Depending upon browser support we use one of two strategies for doing this.
 * Default: DOMParser strategy
 * Fallback: InertDocument strategy
 */
function getInertBodyHelper(defaultDoc) {
    const inertDocumentHelper = new InertDocumentHelper(defaultDoc);
    return isDOMParserAvailable() ? new DOMParserHelper(inertDocumentHelper) : inertDocumentHelper;
}
/**
 * Uses DOMParser to create and fill an inert body element.
 * This is the default strategy used in browsers that support it.
 */
class DOMParserHelper {
    inertDocumentHelper;
    constructor(inertDocumentHelper) {
        this.inertDocumentHelper = inertDocumentHelper;
    }
    getInertBodyElement(html) {
        // We add these extra elements to ensure that the rest of the content is parsed as expected
        // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the
        // `<head>` tag. Note that the `<body>` tag is closed implicitly to prevent unclosed tags
        // in `html` from consuming the otherwise explicit `</body>` tag.
        html = '<body><remove></remove>' + html;
        try {
            const body = new window.DOMParser().parseFromString(trustedHTMLFromString(html), 'text/html').body;
            if (body === null) {
                // In some browsers (e.g. Mozilla/5.0 iPad AppleWebKit Mobile) the `body` property only
                // becomes available in the following tick of the JS engine. In that case we fall back to
                // the `inertDocumentHelper` instead.
                return this.inertDocumentHelper.getInertBodyElement(html);
            }
            body.firstChild?.remove();
            return body;
        }
        catch {
            return null;
        }
    }
}
/**
 * Use an HTML5 `template` element to create and fill an inert DOM element.
 * This is the fallback strategy if the browser does not support DOMParser.
 */
class InertDocumentHelper {
    defaultDoc;
    inertDocument;
    constructor(defaultDoc) {
        this.defaultDoc = defaultDoc;
        this.inertDocument = this.defaultDoc.implementation.createHTMLDocument('sanitization-inert');
    }
    getInertBodyElement(html) {
        const templateEl = this.inertDocument.createElement('template');
        templateEl.innerHTML = trustedHTMLFromString(html);
        return templateEl;
    }
}
/**
 * We need to determine whether the DOMParser exists in the global context and
 * supports parsing HTML; HTML parsing support is not as wide as other formats, see
 * https://developer.mozilla.org/en-US/docs/Web/API/DOMParser#Browser_compatibility.
 *
 * @suppress {uselessCode}
 */
function isDOMParserAvailable() {
    try {
        return !!new window.DOMParser().parseFromString(trustedHTMLFromString(''), 'text/html');
    }
    catch {
        return false;
    }
}

/**
 * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation
 * contexts.
 *
 * This regular expression matches a subset of URLs that will not cause script
 * execution if used in URL context within a HTML document. Specifically, this
 * regular expression matches if:
 * (1) Either a protocol that is not javascript:, and that has valid characters
 *     (alphanumeric or [+-.]).
 * (2) or no protocol.  A protocol must be followed by a colon. The below
 *     allows that by allowing colons only after one of the characters [/?#].
 *     A colon after a hash (#) must be in the fragment.
 *     Otherwise, a colon after a (?) must be in a query.
 *     Otherwise, a colon after a single solidus (/) must be in a path.
 *     Otherwise, a colon after a double solidus (//) must be in the authority
 *     (before port).
 *
 * The pattern disallows &, used in HTML entity declarations before
 * one of the characters in [/?#]. This disallows HTML entities used in the
 * protocol name, which should never happen, e.g. "h&#116;tp" for "http".
 * It also disallows HTML entities in the first path part of a relative path,
 * e.g. "foo&lt;bar/baz".  Our existing escaping functions should not produce
 * that. More importantly, it disallows masking of a colon,
 * e.g. "javascript&#58;...".
 *
 * This regular expression was taken from the Closure sanitization library.
 */
const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\/?#]*(?:[\/?#]|$))/i;
function _sanitizeUrl(url) {
    url = String(url);
    if (url.match(SAFE_URL_PATTERN))
        return url;
    if (typeof ngDevMode === 'undefined' || ngDevMode) {
        console.warn(`WARNING: sanitizing unsafe URL value ${url} (see ${XSS_SECURITY_URL})`);
    }
    return 'unsafe:' + url;
}

function tagSet(tags) {
    const res = {};
    for (const t of tags.split(','))
        res[t] = true;
    return res;
}
function merge(...sets) {
    const res = {};
    for (const s of sets) {
        for (const v in s) {
            if (s.hasOwnProperty(v))
                res[v] = true;
        }
    }
    return res;
}
// Good source of info about elements and attributes
// https://html.spec.whatwg.org/#semantics
// https://simon.html5.org/html-elements
// Safe Void Elements - HTML5
// https://html.spec.whatwg.org/#void-elements
const VOID_ELEMENTS = tagSet('area,br,col,hr,img,wbr');
// Elements that you can, intentionally, leave open (and which close themselves)
// https://html.spec.whatwg.org/#optional-tags
const OPTIONAL_END_TAG_BLOCK_ELEMENTS = tagSet('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr');
const OPTIONAL_END_TAG_INLINE_ELEMENTS = tagSet('rp,rt');
const OPTIONAL_END_TAG_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, OPTIONAL_END_TAG_BLOCK_ELEMENTS);
// Safe Block Elements - HTML5
const BLOCK_ELEMENTS = merge(OPTIONAL_END_TAG_BLOCK_ELEMENTS, tagSet('address,article,' +
    'aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +
    'h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul'));
// Inline Elements - HTML5
const INLINE_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, tagSet('a,abbr,acronym,audio,b,' +
    'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,' +
    'samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video'));
const VALID_ELEMENTS = merge(VOID_ELEMENTS, BLOCK_ELEMENTS, INLINE_ELEMENTS, OPTIONAL_END_TAG_ELEMENTS);
// Attributes that have href and hence need to be sanitized
const URI_ATTRS = tagSet('background,cite,href,itemtype,longdesc,poster,src,xlink:href');
const HTML_ATTRS = tagSet('abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,' +
    'compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,' +
    'ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,' +
    'scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,' +
    'valign,value,vspace,width');
// Accessibility attributes as per WAI-ARIA 1.1 (W3C Working Draft 14 December 2018)
const ARIA_ATTRS = tagSet('aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,' +
    'aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,' +
    'aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,' +
    'aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,' +
    'aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,' +
    'aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,' +
    'aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext');
// NB: This currently consciously doesn't support SVG. SVG sanitization has had several security
// issues in the past, so it seems safer to leave it out if possible. If support for binding SVG via
// innerHTML is required, SVG attributes should be added here.
// NB: Sanitization does not allow <form> elements or other active elements (<button> etc). Those
// can be sanitized, but they increase security surface area without a legitimate use case, so they
// are left out here.
const VALID_ATTRS = merge(URI_ATTRS, HTML_ATTRS, ARIA_ATTRS);
// Elements whose content should not be traversed/preserved, if the elements themselves are invalid.
//
// Typically, `<invalid>Some content</invalid>` would traverse (and in this case preserve)
// `Some content`, but strip `invalid-element` opening/closing tags. For some elements, though, we
// don't want to preserve the content, if the elements themselves are going to be removed.
const SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS = tagSet('script,style,template');
/**
 * SanitizingHtmlSerializer serializes a DOM fragment, stripping out any unsafe elements and unsafe
 * attributes.
 */
class SanitizingHtmlSerializer {
    // Explicitly track if something was stripped, to avoid accidentally warning of sanitization just
    // because characters were re-encoded.
    sanitizedSomething = false;
    buf = [];
    sanitizeChildren(el) {
        // This cannot use a TreeWalker, as it has to run on Angular's various DOM adapters.
        // However this code never accesses properties off of `document` before deleting its contents
        // again, so it shouldn't be vulnerable to DOM clobbering.
        let current = el.firstChild;
        let traverseContent = true;
        let parentNodes = [];
        while (current) {
            if (current.nodeType === Node.ELEMENT_NODE) {
                traverseContent = this.startElement(current);
            }
            else if (current.nodeType === Node.TEXT_NODE) {
                this.chars(current.nodeValue);
            }
            else {
                // Strip non-element, non-text nodes.
                this.sanitizedSomething = true;
            }
            if (traverseContent && current.firstChild) {
                // Push current node to the parent stack before entering its content.
                parentNodes.push(current);
                current = getFirstChild(current);
                continue;
            }
            while (current) {
                // Leaving the element.
                // Walk up and to the right, closing tags as we go.
                if (current.nodeType === Node.ELEMENT_NODE) {
                    this.endElement(current);
                }
                let next = getNextSibling(current);
                if (next) {
                    current = next;
                    break;
                }
                // There was no next sibling, walk up to the parent node (extract it from the stack).
                current = parentNodes.pop();
            }
        }
        return this.buf.join('');
    }
    /**
     * Sanitizes an opening element tag (if valid) and returns whether the element's contents should
     * be traversed. Element content must always be traversed (even if the element itself is not
     * valid/safe), unless the element is one of `SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS`.
     *
     * @param element The element to sanitize.
     * @return True if the element's contents should be traversed.
     */
    startElement(element) {
        const tagName = getNodeName(element).toLowerCase();
        if (!VALID_ELEMENTS.hasOwnProperty(tagName)) {
            this.sanitizedSomething = true;
            return !SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS.hasOwnProperty(tagName);
        }
        this.buf.push('<');
        this.buf.push(tagName);
        const elAttrs = element.attributes;
        for (let i = 0; i < elAttrs.length; i++) {
            const elAttr = elAttrs.item(i);
            const attrName = elAttr.name;
            const lower = attrName.toLowerCase();
            if (!VALID_ATTRS.hasOwnProperty(lower)) {
                this.sanitizedSomething = true;
                continue;
            }
            let value = elAttr.value;
            // TODO(martinprobst): Special case image URIs for data:image/...
            if (URI_ATTRS[lower])
                value = _sanitizeUrl(value);
            this.buf.push(' ', attrName, '="', encodeEntities(value), '"');
        }
        this.buf.push('>');
        return true;
    }
    endElement(current) {
        const tagName = getNodeName(current).toLowerCase();
        if (VALID_ELEMENTS.hasOwnProperty(tagName) && !VOID_ELEMENTS.hasOwnProperty(tagName)) {
            this.buf.push('</');
            this.buf.push(tagName);
            this.buf.push('>');
        }
    }
    chars(chars) {
        this.buf.push(encodeEntities(chars));
    }
}
/**
 * Verifies whether a given child node is a descendant of a given parent node.
 * It may not be the case when properties like `.firstChild` are clobbered and
 * accessing `.firstChild` results in an unexpected node returned.
 */
function isClobberedElement(parentNode, childNode) {
    return ((parentNode.compareDocumentPosition(childNode) & Node.DOCUMENT_POSITION_CONTAINED_BY) !==
        Node.DOCUMENT_POSITION_CONTAINED_BY);
}
/**
 * Retrieves next sibling node and makes sure that there is no
 * clobbering of the `nextSibling` property happening.
 */
function getNextSibling(node) {
    const nextSibling = node.nextSibling;
    // Make sure there is no `nextSibling` clobbering: navigating to
    // the next sibling and going back to the previous one should result
    // in the original node.
    if (nextSibling && node !== nextSibling.previousSibling) {
        throw clobberedElementError(nextSibling);
    }
    return nextSibling;
}
/**
 * Retrieves first child node and makes sure that there is no
 * clobbering of the `firstChild` property happening.
 */
function getFirstChild(node) {
    const firstChild = node.firstChild;
    if (firstChild && isClobberedElement(node, firstChild)) {
        throw clobberedElementError(firstChild);
    }
    return firstChild;
}
/** Gets a reasonable nodeName, even for clobbered nodes. */
function getNodeName(node) {
    const nodeName = node.nodeName;
    // If the property is clobbered, assume it is an `HTMLFormElement`.
    return typeof nodeName === 'string' ? nodeName : 'FORM';
}
function clobberedElementError(node) {
    return new Error(`Failed to sanitize html because the element is clobbered: ${node.outerHTML}`);
}
// Regular Expressions for parsing tags and attributes
const SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
// ! to ~ is the ASCII range.
const NON_ALPHANUMERIC_REGEXP = /([^\#-~ |!])/g;
/**
 * Escapes all potentially dangerous characters, so that the
 * resulting string can be safely inserted into attribute or
 * element text.
 * @param value
 */
function encodeEntities(value) {
    return value
        .replace(/&/g, '&amp;')
        .replace(SURROGATE_PAIR_REGEXP, function (match) {
        const hi = match.charCodeAt(0);
        const low = match.charCodeAt(1);
        return '&#' + ((hi - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000) + ';';
    })
        .replace(NON_ALPHANUMERIC_REGEXP, function (match) {
        return '&#' + match.charCodeAt(0) + ';';
    })
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;');
}
let inertBodyHelper;
/**
 * Sanitizes the given unsafe, untrusted HTML fragment, and returns HTML text that is safe to add to
 * the DOM in a browser environment.
 */
function _sanitizeHtml(defaultDoc, unsafeHtmlInput) {
    let inertBodyElement = null;
    try {
        inertBodyHelper = inertBodyHelper || getInertBodyHelper(defaultDoc);
        // Make sure unsafeHtml is actually a string (TypeScript types are not enforced at runtime).
        let unsafeHtml = unsafeHtmlInput ? String(unsafeHtmlInput) : '';
        inertBodyElement = inertBodyHelper.getInertBodyElement(unsafeHtml);
        // mXSS protection. Repeatedly parse the document to make sure it stabilizes, so that a browser
        // trying to auto-correct incorrect HTML cannot cause formerly inert HTML to become dangerous.
        let mXSSAttempts = 5;
        let parsedHtml = unsafeHtml;
        do {
            if (mXSSAttempts === 0) {
                throw new Error('Failed to sanitize html because the input is unstable');
            }
            mXSSAttempts--;
            unsafeHtml = parsedHtml;
            parsedHtml = inertBodyElement.innerHTML;
            inertBodyElement = inertBodyHelper.getInertBodyElement(unsafeHtml);
        } while (unsafeHtml !== parsedHtml);
        const sanitizer = new SanitizingHtmlSerializer();
        const safeHtml = sanitizer.sanitizeChildren(getTemplateContent(inertBodyElement) || inertBodyElement);
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && sanitizer.sanitizedSomething) {
            console.warn(`WARNING: sanitizing HTML stripped some content, see ${XSS_SECURITY_URL}`);
        }
        return trustedHTMLFromString(safeHtml);
    }
    finally {
        // In case anything goes wrong, clear out inertElement to reset the entire DOM structure.
        if (inertBodyElement) {
            const parent = getTemplateContent(inertBodyElement) || inertBodyElement;
            while (parent.firstChild) {
                parent.firstChild.remove();
            }
        }
    }
}
function getTemplateContent(el) {
    return 'content' in el /** Microsoft/TypeScript#21517 */ && isTemplateElement(el)
        ? el.content
        : null;
}
function isTemplateElement(el) {
    return el.nodeType === Node.ELEMENT_NODE && el.nodeName === 'TEMPLATE';
}

/**
 * A SecurityContext marks a location that has dangerous security implications, e.g. a DOM property
 * like `innerHTML` that could cause Cross Site Scripting (XSS) security bugs when improperly
 * handled.
 *
 * See DomSanitizer for more details on security in Angular applications.
 *
 * @publicApi
 */
var SecurityContext;
(function (SecurityContext) {
    SecurityContext[SecurityContext["NONE"] = 0] = "NONE";
    SecurityContext[SecurityContext["HTML"] = 1] = "HTML";
    SecurityContext[SecurityContext["STYLE"] = 2] = "STYLE";
    SecurityContext[SecurityContext["SCRIPT"] = 3] = "SCRIPT";
    SecurityContext[SecurityContext["URL"] = 4] = "URL";
    SecurityContext[SecurityContext["RESOURCE_URL"] = 5] = "RESOURCE_URL";
})(SecurityContext || (SecurityContext = {}));

/**
 * An `html` sanitizer which converts untrusted `html` **string** into trusted string by removing
 * dangerous content.
 *
 * This method parses the `html` and locates potentially dangerous content (such as urls and
 * javascript) and removes it.
 *
 * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustHtml}.
 *
 * @param unsafeHtml untrusted `html`, typically from the user.
 * @returns `html` string which is safe to display to user, because all of the dangerous javascript
 * and urls have been removed.
 *
 * @codeGenApi
 */
function ɵɵsanitizeHtml(unsafeHtml) {
    const sanitizer = getSanitizer();
    if (sanitizer) {
        return trustedHTMLFromStringBypass(sanitizer.sanitize(SecurityContext.HTML, unsafeHtml) || '');
    }
    if (allowSanitizationBypassAndThrow(unsafeHtml, "HTML" /* BypassType.Html */)) {
        return trustedHTMLFromStringBypass(unwrapSafeValue(unsafeHtml));
    }
    return _sanitizeHtml(getDocument(), renderStringify(unsafeHtml));
}
/**
 * A `style` sanitizer which converts untrusted `style` **string** into trusted string by removing
 * dangerous content.
 *
 * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustStyle}.
 *
 * @param unsafeStyle untrusted `style`, typically from the user.
 * @returns `style` string which is safe to bind to the `style` properties.
 *
 * @codeGenApi
 */
function ɵɵsanitizeStyle(unsafeStyle) {
    const sanitizer = getSanitizer();
    if (sanitizer) {
        return sanitizer.sanitize(SecurityContext.STYLE, unsafeStyle) || '';
    }
    if (allowSanitizationBypassAndThrow(unsafeStyle, "Style" /* BypassType.Style */)) {
        return unwrapSafeValue(unsafeStyle);
    }
    return renderStringify(unsafeStyle);
}
/**
 * A `url` sanitizer which converts untrusted `url` **string** into trusted string by removing
 * dangerous
 * content.
 *
 * This method parses the `url` and locates potentially dangerous content (such as javascript) and
 * removes it.
 *
 * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustUrl}.
 *
 * @param unsafeUrl untrusted `url`, typically from the user.
 * @returns `url` string which is safe to bind to the `src` properties such as `<img src>`, because
 * all of the dangerous javascript has been removed.
 *
 * @codeGenApi
 */
function ɵɵsanitizeUrl(unsafeUrl) {
    const sanitizer = getSanitizer();
    if (sanitizer) {
        return sanitizer.sanitize(SecurityContext.URL, unsafeUrl) || '';
    }
    if (allowSanitizationBypassAndThrow(unsafeUrl, "URL" /* BypassType.Url */)) {
        return unwrapSafeValue(unsafeUrl);
    }
    return _sanitizeUrl(renderStringify(unsafeUrl));
}
/**
 * A `url` sanitizer which only lets trusted `url`s through.
 *
 * This passes only `url`s marked trusted by calling {@link bypassSanitizationTrustResourceUrl}.
 *
 * @param unsafeResourceUrl untrusted `url`, typically from the user.
 * @returns `url` string which is safe to bind to the `src` properties such as `<img src>`, because
 * only trusted `url`s have been allowed to pass.
 *
 * @codeGenApi
 */
function ɵɵsanitizeResourceUrl(unsafeResourceUrl) {
    const sanitizer = getSanitizer();
    if (sanitizer) {
        return trustedScriptURLFromStringBypass(sanitizer.sanitize(SecurityContext.RESOURCE_URL, unsafeResourceUrl) || '');
    }
    if (allowSanitizationBypassAndThrow(unsafeResourceUrl, "ResourceURL" /* BypassType.ResourceUrl */)) {
        return trustedScriptURLFromStringBypass(unwrapSafeValue(unsafeResourceUrl));
    }
    throw new RuntimeError(904 /* RuntimeErrorCode.UNSAFE_VALUE_IN_RESOURCE_URL */, ngDevMode && `unsafe value used in a resource URL context (see ${XSS_SECURITY_URL})`);
}
/**
 * A `script` sanitizer which only lets trusted javascript through.
 *
 * This passes only `script`s marked trusted by calling {@link
 * bypassSanitizationTrustScript}.
 *
 * @param unsafeScript untrusted `script`, typically from the user.
 * @returns `url` string which is safe to bind to the `<script>` element such as `<img src>`,
 * because only trusted `scripts` have been allowed to pass.
 *
 * @codeGenApi
 */
function ɵɵsanitizeScript(unsafeScript) {
    const sanitizer = getSanitizer();
    if (sanitizer) {
        return trustedScriptFromStringBypass(sanitizer.sanitize(SecurityContext.SCRIPT, unsafeScript) || '');
    }
    if (allowSanitizationBypassAndThrow(unsafeScript, "Script" /* BypassType.Script */)) {
        return trustedScriptFromStringBypass(unwrapSafeValue(unsafeScript));
    }
    throw new RuntimeError(905 /* RuntimeErrorCode.UNSAFE_VALUE_IN_SCRIPT */, ngDevMode && 'unsafe value used in a script context');
}
/**
 * A template tag function for promoting the associated constant literal to a
 * TrustedHTML. Interpolation is explicitly not allowed.
 *
 * @param html constant template literal containing trusted HTML.
 * @returns TrustedHTML wrapping `html`.
 *
 * @security This is a security-sensitive function and should only be used to
 * convert constant values of attributes and properties found in
 * application-provided Angular templates to TrustedHTML.
 *
 * @codeGenApi
 */
function ɵɵtrustConstantHtml(html) {
    // The following runtime check ensures that the function was called as a
    // template tag (e.g. ɵɵtrustConstantHtml`content`), without any interpolation
    // (e.g. not ɵɵtrustConstantHtml`content ${variable}`). A TemplateStringsArray
    // is an array with a `raw` property that is also an array. The associated
    // template literal has no interpolation if and only if the length of the
    // TemplateStringsArray is 1.
    if (ngDevMode && (!Array.isArray(html) || !Array.isArray(html.raw) || html.length !== 1)) {
        throw new Error(`Unexpected interpolation in trusted HTML constant: ${html.join('?')}`);
    }
    return trustedHTMLFromString(html[0]);
}
/**
 * A template tag function for promoting the associated constant literal to a
 * TrustedScriptURL. Interpolation is explicitly not allowed.
 *
 * @param url constant template literal containing a trusted script URL.
 * @returns TrustedScriptURL wrapping `url`.
 *
 * @security This is a security-sensitive function and should only be used to
 * convert constant values of attributes and properties found in
 * application-provided Angular templates to TrustedScriptURL.
 *
 * @codeGenApi
 */
function ɵɵtrustConstantResourceUrl(url) {
    // The following runtime check ensures that the function was called as a
    // template tag (e.g. ɵɵtrustConstantResourceUrl`content`), without any
    // interpolation (e.g. not ɵɵtrustConstantResourceUrl`content ${variable}`). A
    // TemplateStringsArray is an array with a `raw` property that is also an
    // array. The associated template literal has no interpolation if and only if
    // the length of the TemplateStringsArray is 1.
    if (ngDevMode && (!Array.isArray(url) || !Array.isArray(url.raw) || url.length !== 1)) {
        throw new Error(`Unexpected interpolation in trusted URL constant: ${url.join('?')}`);
    }
    return trustedScriptURLFromString(url[0]);
}
/**
 * Detects which sanitizer to use for URL property, based on tag name and prop name.
 *
 * The rules are based on the RESOURCE_URL context config from
 * `packages/compiler/src/schema/dom_security_schema.ts`.
 * If tag and prop names don't match Resource URL schema, use URL sanitizer.
 */
function getUrlSanitizer(tag, prop) {
    if ((prop === 'src' &&
        (tag === 'embed' ||
            tag === 'frame' ||
            tag === 'iframe' ||
            tag === 'media' ||
            tag === 'script')) ||
        (prop === 'href' && (tag === 'base' || tag === 'link'))) {
        return ɵɵsanitizeResourceUrl;
    }
    return ɵɵsanitizeUrl;
}
/**
 * Sanitizes URL, selecting sanitizer function based on tag and property names.
 *
 * This function is used in case we can't define security context at compile time, when only prop
 * name is available. This happens when we generate host bindings for Directives/Components. The
 * host element is unknown at compile time, so we defer calculation of specific sanitizer to
 * runtime.
 *
 * @param unsafeUrl untrusted `url`, typically from the user.
 * @param tag target element tag name.
 * @param prop name of the property that contains the value.
 * @returns `url` string which is safe to bind.
 *
 * @codeGenApi
 */
function ɵɵsanitizeUrlOrResourceUrl(unsafeUrl, tag, prop) {
    return getUrlSanitizer(tag, prop)(unsafeUrl);
}
function validateAgainstEventProperties(name) {
    if (name.toLowerCase().startsWith('on')) {
        const errorMessage = `Binding to event property '${name}' is disallowed for security reasons, ` +
            `please use (${name.slice(2)})=...` +
            `\nIf '${name}' is a directive input, make sure the directive is imported by the` +
            ` current module.`;
        throw new RuntimeError(306 /* RuntimeErrorCode.INVALID_EVENT_BINDING */, errorMessage);
    }
}
function validateAgainstEventAttributes(name) {
    if (name.toLowerCase().startsWith('on')) {
        const errorMessage = `Binding to event attribute '${name}' is disallowed for security reasons, ` +
            `please use (${name.slice(2)})=...`;
        throw new RuntimeError(306 /* RuntimeErrorCode.INVALID_EVENT_BINDING */, errorMessage);
    }
}
function getSanitizer() {
    const lView = getLView();
    return lView && lView[ENVIRONMENT].sanitizer;
}

/**
 * Disallowed strings in the comment.
 *
 * see: https://html.spec.whatwg.org/multipage/syntax.html#comments
 */
const COMMENT_DISALLOWED = /^>|^->|<!--|-->|--!>|<!-$/g;
/**
 * Delimiter in the disallowed strings which needs to be wrapped with zero with character.
 */
const COMMENT_DELIMITER = /(<|>)/g;
const COMMENT_DELIMITER_ESCAPED = '\u200B$1\u200B';
/**
 * Escape the content of comment strings so that it can be safely inserted into a comment node.
 *
 * The issue is that HTML does not specify any way to escape comment end text inside the comment.
 * Consider: `<!-- The way you close a comment is with ">", and "->" at the beginning or by "-->" or
 * "--!>" at the end. -->`. Above the `"-->"` is meant to be text not an end to the comment. This
 * can be created programmatically through DOM APIs. (`<!--` are also disallowed.)
 *
 * see: https://html.spec.whatwg.org/multipage/syntax.html#comments
 *
 * ```ts
 * div.innerHTML = div.innerHTML
 * ```
 *
 * One would expect that the above code would be safe to do, but it turns out that because comment
 * text is not escaped, the comment may contain text which will prematurely close the comment
 * opening up the application for XSS attack. (In SSR we programmatically create comment nodes which
 * may contain such text and expect them to be safe.)
 *
 * This function escapes the comment text by looking for comment delimiters (`<` and `>`) and
 * surrounding them with `_>_` where the `_` is a zero width space `\u200B`. The result is that if a
 * comment contains any of the comment start/end delimiters (such as `<!--`, `-->` or `--!>`) the
 * text it will render normally but it will not cause the HTML parser to close/open the comment.
 *
 * @param value text to make safe for comment node by escaping the comment open/close character
 *     sequence.
 */
function escapeCommentText(value) {
    return value.replace(COMMENT_DISALLOWED, (text) => text.replace(COMMENT_DELIMITER, COMMENT_DELIMITER_ESCAPED));
}

function normalizeDebugBindingName(name) {
    // Attribute names with `$` (eg `x-y$`) are valid per spec, but unsupported by some browsers
    name = camelCaseToDashCase(name.replace(/[$@]/g, '_'));
    return `ng-reflect-${name}`;
}
const CAMEL_CASE_REGEXP = /([A-Z])/g;
function camelCaseToDashCase(input) {
    return input.replace(CAMEL_CASE_REGEXP, (...m) => '-' + m[1].toLowerCase());
}
function normalizeDebugBindingValue(value) {
    try {
        // Limit the size of the value as otherwise the DOM just gets polluted.
        return value != null ? value.toString().slice(0, 30) : value;
    }
    catch (e) {
        return '[ERROR] Exception while trying to serialize the value';
    }
}

/**
 * Defines a schema that allows an NgModule to contain the following:
 * - Non-Angular elements named with dash case (`-`).
 * - Element properties named with dash case (`-`).
 * Dash case is the naming convention for custom elements.
 *
 * @publicApi
 */
const CUSTOM_ELEMENTS_SCHEMA = {
    name: 'custom-elements',
};
/**
 * Defines a schema that allows any property on any element.
 *
 * This schema allows you to ignore the errors related to any unknown elements or properties in a
 * template. The usage of this schema is generally discouraged because it prevents useful validation
 * and may hide real errors in your template. Consider using the `CUSTOM_ELEMENTS_SCHEMA` instead.
 *
 * @publicApi
 */
const NO_ERRORS_SCHEMA = {
    name: 'no-errors-schema',
};

let shouldThrowErrorOnUnknownElement = false;
/**
 * Sets a strict mode for JIT-compiled components to throw an error on unknown elements,
 * instead of just logging the error.
 * (for AOT-compiled ones this check happens at build time).
 */
function ɵsetUnknownElementStrictMode(shouldThrow) {
    shouldThrowErrorOnUnknownElement = shouldThrow;
}
/**
 * Gets the current value of the strict mode.
 */
function ɵgetUnknownElementStrictMode() {
    return shouldThrowErrorOnUnknownElement;
}
let shouldThrowErrorOnUnknownProperty = false;
/**
 * Sets a strict mode for JIT-compiled components to throw an error on unknown properties,
 * instead of just logging the error.
 * (for AOT-compiled ones this check happens at build time).
 */
function ɵsetUnknownPropertyStrictMode(shouldThrow) {
    shouldThrowErrorOnUnknownProperty = shouldThrow;
}
/**
 * Gets the current value of the strict mode.
 */
function ɵgetUnknownPropertyStrictMode() {
    return shouldThrowErrorOnUnknownProperty;
}
/**
 * Validates that the element is known at runtime and produces
 * an error if it's not the case.
 * This check is relevant for JIT-compiled components (for AOT-compiled
 * ones this check happens at build time).
 *
 * The element is considered known if either:
 * - it's a known HTML element
 * - it's a known custom element
 * - the element matches any directive
 * - the element is allowed by one of the schemas
 *
 * @param element Element to validate
 * @param lView An `LView` that represents a current component that is being rendered
 * @param tagName Name of the tag to check
 * @param schemas Array of schemas
 * @param hasDirectives Boolean indicating that the element matches any directive
 */
function validateElementIsKnown(element, lView, tagName, schemas, hasDirectives) {
    // If `schemas` is set to `null`, that's an indication that this Component was compiled in AOT
    // mode where this check happens at compile time. In JIT mode, `schemas` is always present and
    // defined as an array (as an empty array in case `schemas` field is not defined) and we should
    // execute the check below.
    if (schemas === null)
        return;
    // If the element matches any directive, it's considered as valid.
    if (!hasDirectives && tagName !== null) {
        // The element is unknown if it's an instance of HTMLUnknownElement, or it isn't registered
        // as a custom element. Note that unknown elements with a dash in their name won't be instances
        // of HTMLUnknownElement in browsers that support web components.
        const isUnknown = 
        // Note that we can't check for `typeof HTMLUnknownElement === 'function'` because
        // Domino doesn't expose HTMLUnknownElement globally.
        (typeof HTMLUnknownElement !== 'undefined' &&
            HTMLUnknownElement &&
            element instanceof HTMLUnknownElement) ||
            (typeof customElements !== 'undefined' &&
                tagName.indexOf('-') > -1 &&
                !customElements.get(tagName));
        if (isUnknown && !matchingSchemas(schemas, tagName)) {
            const isHostStandalone = isHostComponentStandalone(lView);
            const templateLocation = getTemplateLocationDetails(lView);
            const schemas = `'${isHostStandalone ? '@Component' : '@NgModule'}.schemas'`;
            let message = `'${tagName}' is not a known element${templateLocation}:\n`;
            message += `1. If '${tagName}' is an Angular component, then verify that it is ${isHostStandalone
                ? "included in the '@Component.imports' of this component"
                : 'a part of an @NgModule where this component is declared'}.\n`;
            if (tagName && tagName.indexOf('-') > -1) {
                message += `2. If '${tagName}' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the ${schemas} of this component to suppress this message.`;
            }
            else {
                message += `2. To allow any element add 'NO_ERRORS_SCHEMA' to the ${schemas} of this component.`;
            }
            if (shouldThrowErrorOnUnknownElement) {
                throw new RuntimeError(304 /* RuntimeErrorCode.UNKNOWN_ELEMENT */, message);
            }
            else {
                console.error(formatRuntimeError(304 /* RuntimeErrorCode.UNKNOWN_ELEMENT */, message));
            }
        }
    }
}
/**
 * Validates that the property of the element is known at runtime and returns
 * false if it's not the case.
 * This check is relevant for JIT-compiled components (for AOT-compiled
 * ones this check happens at build time).
 *
 * The property is considered known if either:
 * - it's a known property of the element
 * - the element is allowed by one of the schemas
 * - the property is used for animations
 *
 * @param element Element to validate
 * @param propName Name of the property to check
 * @param tagName Name of the tag hosting the property
 * @param schemas Array of schemas
 */
function isPropertyValid(element, propName, tagName, schemas) {
    // If `schemas` is set to `null`, that's an indication that this Component was compiled in AOT
    // mode where this check happens at compile time. In JIT mode, `schemas` is always present and
    // defined as an array (as an empty array in case `schemas` field is not defined) and we should
    // execute the check below.
    if (schemas === null)
        return true;
    // The property is considered valid if the element matches the schema, it exists on the element,
    // or it is synthetic.
    if (matchingSchemas(schemas, tagName) || propName in element || isAnimationProp(propName)) {
        return true;
    }
    // Note: `typeof Node` returns 'function' in most browsers, but is undefined with domino.
    return typeof Node === 'undefined' || Node === null || !(element instanceof Node);
}
/**
 * Logs or throws an error that a property is not supported on an element.
 *
 * @param propName Name of the invalid property
 * @param tagName Name of the tag hosting the property
 * @param nodeType Type of the node hosting the property
 * @param lView An `LView` that represents a current component
 */
function handleUnknownPropertyError(propName, tagName, nodeType, lView) {
    // Special-case a situation when a structural directive is applied to
    // an `<ng-template>` element, for example: `<ng-template *ngIf="true">`.
    // In this case the compiler generates the `ɵɵtemplate` instruction with
    // the `null` as the tagName. The directive matching logic at runtime relies
    // on this effect (see `isInlineTemplate`), thus using the 'ng-template' as
    // a default value of the `tNode.value` is not feasible at this moment.
    if (!tagName && nodeType === 4 /* TNodeType.Container */) {
        tagName = 'ng-template';
    }
    const isHostStandalone = isHostComponentStandalone(lView);
    const templateLocation = getTemplateLocationDetails(lView);
    let message = `Can't bind to '${propName}' since it isn't a known property of '${tagName}'${templateLocation}.`;
    const schemas = `'${isHostStandalone ? '@Component' : '@NgModule'}.schemas'`;
    const importLocation = isHostStandalone
        ? "included in the '@Component.imports' of this component"
        : 'a part of an @NgModule where this component is declared';
    if (KNOWN_CONTROL_FLOW_DIRECTIVES.has(propName)) {
        // Most likely this is a control flow directive (such as `*ngIf`) used in
        // a template, but the directive or the `CommonModule` is not imported.
        const correspondingImport = KNOWN_CONTROL_FLOW_DIRECTIVES.get(propName);
        message +=
            `\nIf the '${propName}' is an Angular control flow directive, ` +
                `please make sure that either the '${correspondingImport}' directive or the 'CommonModule' is ${importLocation}.`;
    }
    else {
        // May be an Angular component, which is not imported/declared?
        message +=
            `\n1. If '${tagName}' is an Angular component and it has the ` +
                `'${propName}' input, then verify that it is ${importLocation}.`;
        // May be a Web Component?
        if (tagName && tagName.indexOf('-') > -1) {
            message +=
                `\n2. If '${tagName}' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' ` +
                    `to the ${schemas} of this component to suppress this message.`;
            message +=
                `\n3. To allow any property add 'NO_ERRORS_SCHEMA' to ` +
                    `the ${schemas} of this component.`;
        }
        else {
            // If it's expected, the error can be suppressed by the `NO_ERRORS_SCHEMA` schema.
            message +=
                `\n2. To allow any property add 'NO_ERRORS_SCHEMA' to ` +
                    `the ${schemas} of this component.`;
        }
    }
    reportUnknownPropertyError(message);
}
function reportUnknownPropertyError(message) {
    if (shouldThrowErrorOnUnknownProperty) {
        throw new RuntimeError(303 /* RuntimeErrorCode.UNKNOWN_BINDING */, message);
    }
    else {
        console.error(formatRuntimeError(303 /* RuntimeErrorCode.UNKNOWN_BINDING */, message));
    }
}
/**
 * WARNING: this is a **dev-mode only** function (thus should always be guarded by the `ngDevMode`)
 * and must **not** be used in production bundles. The function makes megamorphic reads, which might
 * be too slow for production mode and also it relies on the constructor function being available.
 *
 * Gets a reference to the host component def (where a current component is declared).
 *
 * @param lView An `LView` that represents a current component that is being rendered.
 */
function getDeclarationComponentDef(lView) {
    !ngDevMode && throwError('Must never be called in production mode');
    const declarationLView = lView[DECLARATION_COMPONENT_VIEW];
    const context = declarationLView[CONTEXT];
    // Unable to obtain a context.
    if (!context)
        return null;
    return context.constructor ? getComponentDef(context.constructor) : null;
}
/**
 * WARNING: this is a **dev-mode only** function (thus should always be guarded by the `ngDevMode`)
 * and must **not** be used in production bundles. The function makes megamorphic reads, which might
 * be too slow for production mode.
 *
 * Checks if the current component is declared inside of a standalone component template.
 *
 * @param lView An `LView` that represents a current component that is being rendered.
 */
function isHostComponentStandalone(lView) {
    !ngDevMode && throwError('Must never be called in production mode');
    const componentDef = getDeclarationComponentDef(lView);
    // Treat host component as non-standalone if we can't obtain the def.
    return !!componentDef?.standalone;
}
/**
 * WARNING: this is a **dev-mode only** function (thus should always be guarded by the `ngDevMode`)
 * and must **not** be used in production bundles. The function makes megamorphic reads, which might
 * be too slow for production mode.
 *
 * Constructs a string describing the location of the host component template. The function is used
 * in dev mode to produce error messages.
 *
 * @param lView An `LView` that represents a current component that is being rendered.
 */
function getTemplateLocationDetails(lView) {
    !ngDevMode && throwError('Must never be called in production mode');
    const hostComponentDef = getDeclarationComponentDef(lView);
    const componentClassName = hostComponentDef?.type?.name;
    return componentClassName ? ` (used in the '${componentClassName}' component template)` : '';
}
/**
 * The set of known control flow directives and their corresponding imports.
 * We use this set to produce a more precises error message with a note
 * that the `CommonModule` should also be included.
 */
const KNOWN_CONTROL_FLOW_DIRECTIVES = new Map([
    ['ngIf', 'NgIf'],
    ['ngFor', 'NgFor'],
    ['ngSwitchCase', 'NgSwitchCase'],
    ['ngSwitchDefault', 'NgSwitchDefault'],
]);
/**
 * Returns true if the tag name is allowed by specified schemas.
 * @param schemas Array of schemas
 * @param tagName Name of the tag
 */
function matchingSchemas(schemas, tagName) {
    if (schemas !== null) {
        for (let i = 0; i < schemas.length; i++) {
            const schema = schemas[i];
            if (schema === NO_ERRORS_SCHEMA ||
                (schema === CUSTOM_ELEMENTS_SCHEMA && tagName && tagName.indexOf('-') > -1)) {
                return true;
            }
        }
    }
    return false;
}

/**
 *
 * @codeGenApi
 */
function ɵɵresolveWindow(element) {
    return element.ownerDocument.defaultView;
}
/**
 *
 * @codeGenApi
 */
function ɵɵresolveDocument(element) {
    return element.ownerDocument;
}
/**
 *
 * @codeGenApi
 */
function ɵɵresolveBody(element) {
    return element.ownerDocument.body;
}
/**
 * The special delimiter we use to separate property names, prefixes, and suffixes
 * in property binding metadata. See storeBindingMetadata().
 *
 * We intentionally use the Unicode "REPLACEMENT CHARACTER" (U+FFFD) as a delimiter
 * because it is a very uncommon character that is unlikely to be part of a user's
 * property names or interpolation strings. If it is in fact used in a property
 * binding, DebugElement.properties will not return the correct value for that
 * binding. However, there should be no runtime effect for real applications.
 *
 * This character is typically rendered as a question mark inside of a diamond.
 * See https://en.wikipedia.org/wiki/Specials_(Unicode_block)
 *
 */
const INTERPOLATION_DELIMITER = `�`;
/**
 * Unwrap a value which might be behind a closure (for forward declaration reasons).
 */
function maybeUnwrapFn(value) {
    if (value instanceof Function) {
        return value();
    }
    else {
        return value;
    }
}

/**
 * The max length of the string representation of a value in an error message
 */
const VALUE_STRING_LENGTH_LIMIT = 200;
/** Verifies that a given type is a Standalone Component. */
function assertStandaloneComponentType(type) {
    assertComponentDef(type);
    const componentDef = getComponentDef(type);
    if (!componentDef.standalone) {
        throw new RuntimeError(907 /* RuntimeErrorCode.TYPE_IS_NOT_STANDALONE */, `The ${stringifyForError(type)} component is not marked as standalone, ` +
            `but Angular expects to have a standalone component here. ` +
            `Please make sure the ${stringifyForError(type)} component has ` +
            `the \`standalone: true\` flag in the decorator.`);
    }
}
/** Verifies whether a given type is a component */
function assertComponentDef(type) {
    if (!getComponentDef(type)) {
        throw new RuntimeError(906 /* RuntimeErrorCode.MISSING_GENERATED_DEF */, `The ${stringifyForError(type)} is not an Angular component, ` +
            `make sure it has the \`@Component\` decorator.`);
    }
}
/** Called when there are multiple component selectors that match a given node */
function throwMultipleComponentError(tNode, first, second) {
    throw new RuntimeError(-300 /* RuntimeErrorCode.MULTIPLE_COMPONENTS_MATCH */, `Multiple components match node with tagname ${tNode.value}: ` +
        `${stringifyForError(first)} and ` +
        `${stringifyForError(second)}`);
}
/** Throws an ExpressionChangedAfterChecked error if checkNoChanges mode is on. */
function throwErrorIfNoChangesMode(creationMode, oldValue, currValue, propName, lView) {
    const hostComponentDef = getDeclarationComponentDef(lView);
    const componentClassName = hostComponentDef?.type?.name;
    const field = propName ? ` for '${propName}'` : '';
    let msg = `ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value${field}: '${formatValue(oldValue)}'. Current value: '${formatValue(currValue)}'.${componentClassName ? ` Expression location: ${componentClassName} component` : ''}`;
    if (creationMode) {
        msg +=
            ` It seems like the view has been created after its parent and its children have been dirty checked.` +
                ` Has it been created in a change detection hook?`;
    }
    throw new RuntimeError(-100 /* RuntimeErrorCode.EXPRESSION_CHANGED_AFTER_CHECKED */, msg);
}
function formatValue(value) {
    let strValue = String(value);
    // JSON.stringify will throw on circular references
    try {
        if (Array.isArray(value) || strValue === '[object Object]') {
            strValue = JSON.stringify(value);
        }
    }
    catch (error) { }
    return strValue.length > VALUE_STRING_LENGTH_LIMIT
        ? strValue.substring(0, VALUE_STRING_LENGTH_LIMIT) + '…'
        : strValue;
}
function constructDetailsForInterpolation(lView, rootIndex, expressionIndex, meta, changedValue) {
    const [propName, prefix, ...chunks] = meta.split(INTERPOLATION_DELIMITER);
    let oldValue = prefix, newValue = prefix;
    for (let i = 0; i < chunks.length; i++) {
        const slotIdx = rootIndex + i;
        oldValue += `${lView[slotIdx]}${chunks[i]}`;
        newValue += `${slotIdx === expressionIndex ? changedValue : lView[slotIdx]}${chunks[i]}`;
    }
    return { propName, oldValue, newValue };
}
/**
 * Constructs an object that contains details for the ExpressionChangedAfterItHasBeenCheckedError:
 * - property name (for property bindings or interpolations)
 * - old and new values, enriched using information from metadata
 *
 * More information on the metadata storage format can be found in `storePropertyBindingMetadata`
 * function description.
 */
function getExpressionChangedErrorDetails(lView, bindingIndex, oldValue, newValue) {
    const tData = lView[TVIEW].data;
    const metadata = tData[bindingIndex];
    if    (typeof metadata === 'string') {
        // metadata for property interpolation
        if (metadata.indexOf(INTERPOLATION_DELIMITER) > -1) {
            return constructDetailsForInterpolation(lView, bindingIndex, bindingIndex, metadata, newValue);
        }
        // metadata for property binding
        return { propName: metadata, oldValue, newValue };
    }
    // metadata is not available for this expression, check if this expression is a part of the
    // property interpolation by going from the current binding index left and look for a string that
    // contains INTERPOLATION_DELIMITER, the layout in tView.data for this case will look like this:
    // [..., 'id�Prefix � and � suffix', null, null, null, ...]
    if (metadata === null) {
        let idx = bindingIndex - 1;
        while (typeof tData[idx] !== 'string' && tData[idx + 1] === null) {
            idx--;
        }
        const meta = tData[idx];
        if (typeof meta === 'string') {
            const matches = meta.match(new RegExp(INTERPOLATION_DELIMITER, 'g'));
            // first interpolation delimiter separates property name from interpolation parts (in case of
            // property interpolations), so we subtract one from total number of found delimiters
            if (matches && matches.length - 1 > bindingIndex - idx) {
                return constructDetailsForInterpolation(lView, idx, bindingIndex, meta, newValue);
            }
        }
    }
    return { propName: undefined, oldValue, newValue };
}

/**
 * Returns an index of `classToSearch` in `className` taking token boundaries into account.
 *
 * `classIndexOf('AB A', 'A', 0)` will be 3 (not 0 since `AB!==A`)
 *
 * @param className A string containing classes (whitespace separated)
 * @param classToSearch A class name to locate
 * @param startingIndex Starting location of search
 * @returns an index of the located class (or -1 if not found)
 */
function classIndexOf(className, classToSearch, startingIndex) {
    ngDevMode && assertNotEqual(classToSearch, '', 'can not look for "" string.');
    let end = className.length;
    while (true) {
        const foundIndex = className.indexOf(classToSearch, startingIndex);
        if (foundIndex === -1)
            return foundIndex;
        if (foundIndex === 0 || className.charCodeAt(foundIndex - 1) <= 32 /* CharCode.SPACE */) {
            // Ensure that it has leading whitespace
            const length = classToSearch.length;
            if (foundIndex + length === end ||
                className.charCodeAt(foundIndex + length) <= 32 /* CharCode.SPACE */) {
                // Ensure that it has trailing whitespace
                return foundIndex;
            }
        }
        // False positive, keep searching from where we left off.
        startingIndex = foundIndex + 1;
    }
}

const NG_TEMPLATE_SELECTOR = 'ng-template';
/**
 * Search the `TAttributes` to see if it contains `cssClassToMatch` (case insensitive)
 *
 * @param tNode static data of the node to match
 * @param attrs `TAttributes` to search through.
 * @param cssClassToMatch class to match (lowercase)
 * @param isProjectionMode Whether or not class matching should look into the attribute `class` in
 *    addition to the `AttributeMarker.Classes`.
 */
function isCssClassMatching(tNode, attrs, cssClassToMatch, isProjectionMode) {
    ngDevMode &&
        assertEqual(cssClassToMatch, cssClassToMatch.toLowerCase(), 'Class name expected to be lowercase.');
    let i = 0;
    if (isProjectionMode) {
        for (; i < attrs.length && typeof attrs[i] === 'string'; i += 2) {
            // Search for an implicit `class` attribute and check if its value matches `cssClassToMatch`.
            if (attrs[i] === 'class' &&
                classIndexOf(attrs[i + 1].toLowerCase(), cssClassToMatch, 0) !== -1) {
                return true;
            }
        }
    }
    else if (isInlineTemplate(tNode)) {
        // Matching directives (i.e. when not matching for projection mode) should not consider the
        // class bindings that are present on inline templates, as those class bindings only target
        // the root node of the template, not the template itself.
        return false;
    }
    // Resume the search for classes after the `Classes` marker.
    i = attrs.indexOf(1 /* AttributeMarker.Classes */, i);
    if (i > -1) {
        // We found the classes section. Start searching for the class.
        let item;
        while (++i < attrs.length && typeof (item = attrs[i]) === 'string') {
            if (item.toLowerCase() === cssClassToMatch) {
                return true;
            }
        }
    }
    return false;
}
/**
 * Checks whether the `tNode` represents an inline template (e.g. `*ngFor`).
 *
 * @param tNode current TNode
 */
function isInlineTemplate(tNode) {
    return tNode.type === 4 /* TNodeType.Container */ && tNode.value !== NG_TEMPLATE_SELECTOR;
}
/**
 * Function that checks whether a given tNode matches tag-based selector and has a valid type.
 *
 * Matching can be performed in 2 modes: projection mode (when we project nodes) and regular
 * directive matching mode:
 * - in the "directive matching" mode we do _not_ take TContainer's tagName into account if it is
 * different from NG_TEMPLATE_SELECTOR (value different from NG_TEMPLATE_SELECTOR indicates that a
 * tag name was extracted from * syntax so we would match the same directive twice);
 * - in the "projection" mode, we use a tag name potentially extracted from the * syntax processing
 * (applicable to TNodeType.Container only).
 */
function hasTagAndTypeMatch(tNode, currentSelector, isProjectionMode) {
    const tagNameToCompare = tNode.type === 4 /* TNodeType.Container */ && !isProjectionMode ? NG_TEMPLATE_SELECTOR : tNode.value;
    return currentSelector === tagNameToCompare;
}
/**
 * A utility function to match an Ivy node static data against a simple CSS selector
 *
 * @param tNode static data of the node to match
 * @param selector The selector to try matching against the node.
 * @param isProjectionMode if `true` we are matching for content projection, otherwise we are doing
 * directive matching.
 * @returns true if node matches the selector.
 */
function isNodeMatchingSelector(tNode, selector, isProjectionMode) {
    ngDevMode && assertDefined(selector[0], 'Selector should have a tag name');
    let mode = 4 /* SelectorFlags.ELEMENT */;
    const nodeAttrs = tNode.attrs;
    // Find the index of first attribute that has no value, only a name.
    const nameOnlyMarkerIdx = nodeAttrs !== null ? getNameOnlyMarkerIndex(nodeAttrs) : 0;
    // When processing ":not" selectors, we skip to the next ":not" if the
    // current one doesn't match
    let skipToNextSelector = false;
    for (let i = 0; i < selector.length; i++) {
        const current = selector[i];
        if (typeof current === 'number') {
            // If we finish processing a :not selector and it hasn't failed, return false
            if (!skipToNextSelector && !isPositive(mode) && !isPositive(current)) {
                return false;
            }
            // If we are skipping to the next :not() and this mode flag is positive,
            // it's a part of the current :not() selector, and we should keep skipping
            if (skipToNextSelector && isPositive(current))
                continue;
            skipToNextSelector = false;
            mode = current | (mode & 1 /* SelectorFlags.NOT */);
            continue;
        }
        if (skipToNextSelector)
            continue;
        if (mode & 4 /* SelectorFlags.ELEMENT */) {
            mode = 2 /* SelectorFlags.ATTRIBUTE */ | (mode & 1 /* SelectorFlags.NOT */);
            if ((current !== '' && !hasTagAndTypeMatch(tNode, current, isProjectionMode)) ||
                (current === '' && selector.length === 1)) {
                if (isPositive(mode))
                    return false;
                skipToNextSelector = true;
            }
        }
        else if (mode & 8 /* SelectorFlags.CLASS */) {
            if (nodeAttrs === null || !isCssClassMatching(tNode, nodeAttrs, current, isProjectionMode)) {
                if (isPositive(mode))
                    return false;
                skipToNextSelector = true;
            }
        }
        else {
            const selectorAttrValue = selector[++i];
            const attrIndexInNode = findAttrIndexInNode(current, nodeAttrs, isInlineTemplate(tNode), isProjectionMode);
            if (attrIndexInNode === -1) {
                if (isPositive(mode))
                    return false;
                skipToNextSelector = true;
                continue;
            }
            if (selectorAttrValue !== '') {
                let nodeAttrValue;
                if (attrIndexInNode > nameOnlyMarkerIdx) {
                    nodeAttrValue = '';
                }
                else {
                    ngDevMode &&
                        assertNotEqual(nodeAttrs[attrIndexInNode], 0 /* AttributeMarker.NamespaceURI */, 'We do not match directives on namespaced attributes');
                    // we lowercase the attribute value to be able to match
                    // selectors without case-sensitivity
                    // (selectors are already in lowercase when generated)
                    nodeAttrValue = nodeAttrs[attrIndexInNode + 1].toLowerCase();
                }
                if (mode & 2 /* SelectorFlags.ATTRIBUTE */ && selectorAttrValue !== nodeAttrValue) {
                    if (isPositive(mode))
                        return false;
                    skipToNextSelector = true;
                }
            }
        }
    }
    return isPositive(mode) || skipToNextSelector;
}
function isPositive(mode) {
    return (mode & 1 /* SelectorFlags.NOT */) === 0;
}
/**
 * Examines the attribute's definition array for a node to find the index of the
 * attribute that matches the given `name`.
 *
 * NOTE: This will not match namespaced attributes.
 *
 * Attribute matching depends upon `isInlineTemplate` and `isProjectionMode`.
 * The following table summarizes which types of attributes we attempt to match:
 *
 * ===========================================================================================================
 * Modes                   | Normal Attributes | Bindings Attributes | Template Attributes | I18n
 * Attributes
 * ===========================================================================================================
 * Inline + Projection     | YES               | YES                 | NO                  | YES
 * -----------------------------------------------------------------------------------------------------------
 * Inline + Directive      | NO                | NO                  | YES                 | NO
 * -----------------------------------------------------------------------------------------------------------
 * Non-inline + Projection | YES               | YES                 | NO                  | YES
 * -----------------------------------------------------------------------------------------------------------
 * Non-inline + Directive  | YES               | YES                 | NO                  | YES
 * ===========================================================================================================
 *
 * @param name the name of the attribute to find
 * @param attrs the attribute array to examine
 * @param isInlineTemplate true if the node being matched is an inline template (e.g. `*ngFor`)
 * rather than a manually expanded template node (e.g `<ng-template>`).
 * @param isProjectionMode true if we are matching against content projection otherwise we are
 * matching against directives.
 */
function findAttrIndexInNode(name, attrs, isInlineTemplate, isProjectionMode) {
    if (attrs === null)
        return -1;
    let i = 0;
    if (isProjectionMode || !isInlineTemplate) {
        let bindingsMode = false;
        while (i < attrs.length) {
            const maybeAttrName = attrs[i];
            if (maybeAttrName === name) {
                return i;
            }
            else if (maybeAttrName === 3 /* AttributeMarker.Bindings */ ||
                maybeAttrName === 6 /* AttributeMarker.I18n */) {
                bindingsMode = true;
            }
            else if (maybeAttrName === 1 /* AttributeMarker.Classes */ ||
                maybeAttrName === 2 /* AttributeMarker.Styles */) {
                let value = attrs[++i];
                // We should skip classes here because we have a separate mechanism for
                // matching classes in projection mode.
                while (typeof value === 'string') {
                    value = attrs[++i];
                }
                continue;
            }
            else if (maybeAttrName === 4 /* AttributeMarker.Template */) {
                // We do not care about Template attributes in this scenario.
                break;
            }
            else if (maybeAttrName === 0 /* AttributeMarker.NamespaceURI */) {
                // Skip the whole namespaced attribute and value. This is by design.
                i += 4;
                continue;
            }
            // In binding mode there are only names, rather than name-value pairs.
            i += bindingsMode ? 1 : 2;
        }
        // We did not match the attribute
        return -1;
    }
    else {
        return matchTemplateAttribute(attrs, name);
    }
}
function isNodeMatchingSelectorList(tNode, selector, isProjectionMode = false) {
    for (let i = 0; i < selector.length; i++) {
        if (isNodeMatchingSelector(tNode, selector[i], isProjectionMode)) {
            return true;
        }
    }
    return false;
}
function getProjectAsAttrValue(tNode) {
    const nodeAttrs = tNode.attrs;
    if (nodeAttrs != null) {
        const ngProjectAsAttrIdx = nodeAttrs.indexOf(5 /* AttributeMarker.ProjectAs */);
        // only check for ngProjectAs in attribute names, don't accidentally match attribute's value
        // (attribute names are stored at even indexes)
        if ((ngProjectAsAttrIdx & 1) === 0) {
            return nodeAttrs[ngProjectAsAttrIdx + 1];
        }
    }
    return null;
}
function getNameOnlyMarkerIndex(nodeAttrs) {
    for (let i = 0; i < nodeAttrs.length; i++) {
        const nodeAttr = nodeAttrs[i];
        if (isNameOnlyAttributeMarker(nodeAttr)) {
            return i;
        }
    }
    return nodeAttrs.length;
}
function matchTemplateAttribute(attrs, name) {
    let i = attrs.indexOf(4 /* AttributeMarker.Template */);
    if (i > -1) {
        i++;
        while (i < attrs.length) {
            const attr = attrs[i];
            // Return in case we checked all template attrs and are switching to the next section in the
            // attrs array (that starts with a number that represents an attribute marker).
            if (typeof attr === 'number')
                return -1;
            if (attr === name)
                return i;
            i++;
        }
    }
    return -1;
}
/**
 * Checks whether a selector is inside a CssSelectorList
 * @param selector Selector to be checked.
 * @param list List in which to look for the selector.
 */
function isSelectorInSelectorList(selector, list) {
    selectorListLoop: for (let i = 0; i < list.length; i++) {
        const currentSelectorInList = list[i];
        if (selector.length !== currentSelectorInList.length) {
            continue;
        }
        for (let j = 0; j < selector.length; j++) {
            if (selector[j] !== currentSelectorInList[j]) {
                continue selectorListLoop;
            }
        }
        return true;
    }
    return false;
}
function maybeWrapInNotSelector(isNegativeMode, chunk) {
    return isNegativeMode ? ':not(' + chunk.trim() + ')' : chunk;
}
function stringifyCSSSelector(selector) {
    let result = selector[0];
    let i = 1;
    let mode = 2 /* SelectorFlags.ATTRIBUTE */;
    let currentChunk = '';
    let isNegativeMode = false;
    while (i < selector.length) {
        let valueOrMarker = selector[i];
        if (typeof valueOrMarker === 'string') {
            if (mode & 2 /* SelectorFlags.ATTRIBUTE */) {
                const attrValue = selector[++i];
                currentChunk +=
                    '[' + valueOrMarker + (attrValue.length > 0 ? '="' + attrValue + '"' : '') + ']';
            }
            else if (mode & 8 /* SelectorFlags.CLASS */) {
                currentChunk += '.' + valueOrMarker;
            }
            else if (mode & 4 /* SelectorFlags.ELEMENT */) {
                currentChunk += ' ' + valueOrMarker;
            }
        }
        else {
            //
            // Append current chunk to the final result in case we come across SelectorFlag, which
            // indicates that the previous section of a selector is over. We need to accumulate content
            // between flags to make sure we wrap the chunk later in :not() selector if needed, e.g.
            // ```
            //  ['', Flags.CLASS, '.classA', Flags.CLASS | Flags.NOT, '.classB', '.classC']
            // ```
            // should be transformed to `.classA :not(.classB .classC)`.
            //
            // Note: for negative selector part, we accumulate content between flags until we find the
            // next negative flag. This is needed to support a case where `:not()` rule contains more than
            // one chunk, e.g. the following selector:
            // ```
            //  ['', Flags.ELEMENT | Flags.NOT, 'p', Flags.CLASS, 'foo', Flags.CLASS | Flags.NOT, 'bar']
            // ```
            // should be stringified to `:not(p.foo) :not(.bar)`
            //
            if (currentChunk !== '' && !isPositive(valueOrMarker)) {
                result += maybeWrapInNotSelector(isNegativeMode, currentChunk);
                currentChunk = '';
            }
            mode = valueOrMarker;
            // According to CssSelector spec, once we come across `SelectorFlags.NOT` flag, the negative
            // mode is maintained for remaining chunks of a selector.
            isNegativeMode = isNegativeMode || !isPositive(mode);
        }
        i++;
    }
    if (currentChunk !== '') {
        result += maybeWrapInNotSelector(isNegativeMode, currentChunk);
    }
    return result;
}
/**
 * Generates string representation of CSS selector in parsed form.
 *
 * ComponentDef and DirectiveDef are generated with the selector in parsed form to avoid doing
 * additional parsing at runtime (for example, for directive matching). However in some cases (for
 * example, while bootstrapping a component), a string version of the selector is required to query
 * for the host element on the page. This function takes the parsed form of a selector and returns
 * its string representation.
 *
 * @param selectorList selector in parsed form
 * @returns string representation of a given selector
 */
function stringifyCSSSelectorList(selectorList) {
    return selectorList.map(stringifyCSSSelector).join(',');
}
/**
 * Extracts attributes and classes information from a given CSS selector.
 *
 * This function is used while creating a component dynamically. In this case, the host element
 * (that is created dynamically) should contain attributes and classes specified in component's CSS
 * selector.
 *
 * @param selector CSS selector in parsed form (in a form of array)
 * @returns object with `attrs` and `classes` fields that contain extracted information
 */
function extractAttrsAndClassesFromSelector(selector) {
    const attrs = [];
    const classes = [];
    let i = 1;
    let mode = 2 /* SelectorFlags.ATTRIBUTE */;
    while (i < selector.length) {
        let valueOrMarker = selector[i];
        if (typeof valueOrMarker === 'string') {
            if (mode === 2 /* SelectorFlags.ATTRIBUTE */) {
                if (valueOrMarker !== '') {
                    attrs.push(valueOrMarker, selector[++i]);
                }
            }
            else if (mode === 8 /* SelectorFlags.CLASS */) {
                classes.push(valueOrMarker);
            }
        }
        else {
            // According to CssSelector spec, once we come across `SelectorFlags.NOT` flag, the negative
            // mode is maintained for remaining chunks of a selector. Since attributes and classes are
            // extracted only for "positive" part of the selector, we can stop here.
            if (!isPositive(mode))
                break;
            mode = valueOrMarker;
        }
        i++;
    }
    if (classes.length) {
        attrs.push(1 /* AttributeMarker.Classes */, ...classes);
    }
    return attrs;
}

/** A special value which designates that a value has not changed. */
const NO_CHANGE = typeof ngDevMode === 'undefined' || ngDevMode ? { __brand__: 'NO_CHANGE' } : {};

function createTextNode(renderer, value) {
    ngDevMode && ngDevMode.rendererCreateTextNode++;
    ngDevMode && ngDevMode.rendererSetText++;
    return renderer.createText(value);
}
function updateTextNode(renderer, rNode, value) {
    ngDevMode && ngDevMode.rendererSetText++;
    renderer.setValue(rNode, value);
}
function createCommentNode(renderer, value) {
    ngDevMode && ngDevMode.rendererCreateComment++;
    return renderer.createComment(escapeCommentText(value));
}
/**
 * Creates a native element from a tag name, using a renderer.
 * @param renderer A renderer to use
 * @param name the tag name
 * @param namespace Optional namespace for element.
 * @returns the element created
 */
function createElementNode(renderer, name, namespace) {
    ngDevMode && ngDevMode.rendererCreateElement++;
    return renderer.createElement(name, namespace);
}
/**
 * Inserts a native node before another native node for a given parent.
 * This is a utility function that can be used when native nodes were determined.
 */
function nativeInsertBefore(renderer, parent, child, beforeNode, isMove) {
    ngDevMode && ngDevMode.rendererInsertBefore++;
    renderer.insertBefore(parent, child, beforeNode, isMove);
}
function nativeAppendChild(renderer, parent, child) {
    ngDevMode && ngDevMode.rendererAppendChild++;
    ngDevMode && assertDefined(parent, 'parent node must be defined');
    renderer.appendChild(parent, child);
}
function nativeAppendOrInsertBefore(renderer, parent, child, beforeNode, isMove) {
    if (beforeNode !== null) {
        nativeInsertBefore(renderer, parent, child, beforeNode, isMove);
    }
    else {
        nativeAppendChild(renderer, parent, child);
    }
}
/**
 * Removes a native node itself using a given renderer. To remove the node we are looking up its
 * parent from the native tree as not all platforms / browsers support the equivalent of
 * node.remove().
 *
 * @param renderer A renderer to be used
 * @param rNode The native node that should be removed
 * @param isHostElement A flag indicating if a node to be removed is a host of a component.
 */
function nativeRemoveNode(renderer, rNode, isHostElement) {
    ngDevMode && ngDevMode.rendererRemoveNode++;
    renderer.removeChild(null, rNode, isHostElement);
}
/**
 * Clears the contents of a given RElement.
 *
 * @param rElement the native RElement to be cleared
 */
function clearElementContents(rElement) {
    rElement.textContent = '';
}
/**
 * Write `cssText` to `RElement`.
 *
 * This function does direct write without any reconciliation. Used for writing initial values, so
 * that static styling values do not pull in the style parser.
 *
 * @param renderer Renderer to use
 * @param element The element which needs to be updated.
 * @param newValue The new class list to write.
 */
function writeDirectStyle(renderer, element, newValue) {
    ngDevMode && assertString(newValue, "'newValue' should be a string");
    renderer.setAttribute(element, 'style', newValue);
    ngDevMode && ngDevMode.rendererSetStyle++;
}
/**
 * Write `className` to `RElement`.
 *
 * This function does direct write without any reconciliation. Used for writing initial values, so
 * that static styling values do not pull in the style parser.
 *
 * @param renderer Renderer to use
 * @param element The element which needs to be updated.
 * @param newValue The new class list to write.
 */
function writeDirectClass(renderer, element, newValue) {
    ngDevMode && assertString(newValue, "'newValue' should be a string");
    if (newValue === '') {
        // There are tests in `google3` which expect `element.getAttribute('class')` to be `null`.
        renderer.removeAttribute(element, 'class');
    }
    else {
        renderer.setAttribute(element, 'class', newValue);
    }
    ngDevMode && ngDevMode.rendererSetClassName++;
}
/** Sets up the static DOM attributes on an `RNode`. */
function setupStaticAttributes(renderer, element, tNode) {
    const { mergedAttrs, classes, styles } = tNode;
    if (mergedAttrs !== null) {
        setUpAttributes(renderer, element, mergedAttrs);
    }
    if (classes !== null) {
        writeDirectClass(renderer, element, classes);
    }
    if (styles !== null) {
        writeDirectStyle(renderer, element, styles);
    }
}

/**
 * Creates a TView instance
 *
 * @param type Type of `TView`.
 * @param declTNode Declaration location of this `TView`.
 * @param templateFn Template function
 * @param decls The number of nodes, local refs, and pipes in this template
 * @param directives Registry of directives for this view
 * @param pipes Registry of pipes for this view
 * @param viewQuery View queries for this view
 * @param schemas Schemas for this view
 * @param consts Constants for this view
 */
function createTView(type, declTNode, templateFn, decls, vars, directives, pipes, viewQuery, schemas, constsOrFactory, ssrId) {
    ngDevMode && ngDevMode.tView++;
    const bindingStartIndex = HEADER_OFFSET + decls;
    // This length does not yet contain host bindings from child directives because at this point,
    // we don't know which directives are active on this template. As soon as a directive is matched
    // that has a host binding, we will update the blueprint with that def's hostVars count.
    const initialViewLength = bindingStartIndex + vars;
    const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength);
    const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory;
    const tView = (blueprint[TVIEW] = {
        type: type,
        blueprint: blueprint,
        template: templateFn,
        queries: null,
        viewQuery: viewQuery,
        declTNode: declTNode,
        data: blueprint.slice().fill(null, bindingStartIndex),
        bindingStartIndex: bindingStartIndex,
        expandoStartIndex: initialViewLength,
        hostBindingOpCodes: null,
        firstCreatePass: true,
        firstUpdatePass: true,
        staticViewQueries: false,
        staticContentQueries: false,
        preOrderHooks: null,
        preOrderCheckHooks: null,
        contentHooks: null,
        contentCheckHooks: null,
        viewHooks: null,
        viewCheckHooks: null,
        destroyHooks: null,
        cleanup: null,
        contentQueries: null,
        components: null,
        directiveRegistry: typeof directives === 'function' ? directives() : directives,
        pipeRegistry: typeof pipes === 'function' ? pipes() : pipes,
        firstChild: null,
        schemas: schemas,
        consts: consts,
        incompleteFirstPass: false,
        ssrId,
    });
    if (ngDevMode) {
        // For performance reasons it is important that the tView retains the same shape during runtime.
        // (To make sure that all of the code is monomorphic.) For this reason we seal the object to
        // prevent class transitions.
        Object.seal(tView);
    }
    return tView;
}
function createViewBlueprint(bindingStartIndex, initialViewLength) {
    const blueprint = [];
    for (let i = 0; i < initialViewLength; i++) {
        blueprint.push(i < bindingStartIndex ? null : NO_CHANGE);
    }
    return blueprint;
}
/**
 * Gets TView from a template function or creates a new TView
 * if it doesn't already exist.
 *
 * @param def ComponentDef
 * @returns TView
 */
function getOrCreateComponentTView(def) {
    const tView = def.tView;
    // Create a TView if there isn't one, or recreate it if the first create pass didn't
    // complete successfully since we can't know for sure whether it's in a usable shape.
    if (tView === null || tView.incompleteFirstPass) {
        // Declaration node here is null since this function is called when we dynamically create a
        // component and hence there is no declaration.
        const declTNode = null;
        return (def.tView = createTView(1 /* TViewType.Component */, declTNode, def.template, def.decls, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, def.schemas, def.consts, def.id));
    }
    return tView;
}
function createLView(parentLView, tView, context, flags, host, tHostNode, environment, renderer, injector, embeddedViewInjector, hydrationInfo) {
    const lView = tView.blueprint.slice();
    lView[HOST] = host;
    lView[FLAGS] =
        flags |
            4 /* LViewFlags.CreationMode */ |
            128 /* LViewFlags.Attached */ |
            8 /* LViewFlags.FirstLViewPass */ |
            64 /* LViewFlags.Dirty */ |
            1024 /* LViewFlags.RefreshView */;
    if (embeddedViewInjector !== null ||
        (parentLView && parentLView[FLAGS] & 2048 /* LViewFlags.HasEmbeddedViewInjector */)) {
        lView[FLAGS] |= 2048 /* LViewFlags.HasEmbeddedViewInjector */;
    }
    resetPreOrderHookFlags(lView);
    ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView);
    lView[PARENT] = lView[DECLARATION_VIEW] = parentLView;
    lView[CONTEXT] = context;
    lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]));
    ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required');
    lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]));
    ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required');
    lView[INJECTOR] = injector || (parentLView && parentLView[INJECTOR]) || null;
    lView[T_HOST] = tHostNode;
    lView[ID] = getUniqueLViewId();
    lView[HYDRATION] = hydrationInfo;
    lView[EMBEDDED_VIEW_INJECTOR] = embeddedViewInjector;
    ngDevMode &&
        assertEqual(tView.type == 2 /* TViewType.Embedded */ ? parentLView !== null : true, true, 'Embedded views must have parentLView');
    lView[DECLARATION_COMPONENT_VIEW] =
        tView.type == 2 /* TViewType.Embedded */ ? parentLView[DECLARATION_COMPONENT_VIEW] : lView;
    return lView;
}
function createComponentLView(lView, hostTNode, def) {
    const native = getNativeByTNode(hostTNode, lView);
    const tView = getOrCreateComponentTView(def);
    // Only component views should be added to the view tree directly. Embedded views are
    // accessed through their containers because they may be removed / re-added later.
    const rendererFactory = lView[ENVIRONMENT].rendererFactory;
    const componentView = addToEndOfViewTree(lView, createLView(lView, tView, null, getInitialLViewFlagsFromDef(def), native, hostTNode, null, rendererFactory.createRenderer(native, def), null, null, null));
    // Component view will always be created before any injected LContainers,
    // so this is a regular element, wrap it with the component view
    return (lView[hostTNode.index] = componentView);
}
/**
 * Gets the initial set of LView flags based on the component definition that the LView represents.
 * @param def Component definition from which to determine the flags.
 */
function getInitialLViewFlagsFromDef(def) {
    let flags = 16 /* LViewFlags.CheckAlways */;
    if (def.signals) {
        flags = 4096 /* LViewFlags.SignalView */;
    }
    else if (def.onPush) {
        flags = 64 /* LViewFlags.Dirty */;
    }
    return flags;
}
/**
 * When elements are created dynamically after a view blueprint is created (e.g. through
 * i18nApply()), we need to adjust the blueprint for future template passes.
 *
 * @param tView `TView` associated with `LView`
 * @param lView The `LView` containing the blueprint to adjust
 * @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0
 * @param initialValue Initial value to store in blueprint
 */
function allocExpando(tView, lView, numSlotsToAlloc, initialValue) {
    if (numSlotsToAlloc === 0)
        return -1;
    if (ngDevMode) {
        assertFirstCreatePass(tView);
        assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!');
        assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView');
        assertEqual(tView.data.length, tView.blueprint.length, 'Expecting Blueprint to be same size as TView');
        assertFirstUpdatePass(tView);
    }
    const allocIdx = lView.length;
    for (let i = 0; i < numSlotsToAlloc; i++) {
        lView.push(initialValue);
        tView.blueprint.push(initialValue);
        tView.data.push(null);
    }
    return allocIdx;
}
/**
 * Adds LView or LContainer to the end of the current view tree.
 *
 * This structure will be used to traverse through nested views to remove listeners
 * and call onDestroy callbacks.
 *
 * @param lView The view where LView or LContainer should be added
 * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header
 * @param lViewOrLContainer The LView or LContainer to add to the view tree
 * @returns The state passed in
 */
function addToEndOfViewTree(lView, lViewOrLContainer) {
    // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer
    // to the end of the queue, which means if the developer retrieves the LContainers from RNodes out
    // of order, the change detection will run out of order, as the act of retrieving the the
    // LContainer from the RNode is what adds it to the queue.
    if (lView[CHILD_HEAD]) {
        lView[CHILD_TAIL][NEXT] = lViewOrLContainer;
    }
    else {
        lView[CHILD_HEAD] = lViewOrLContainer;
    }
    lView[CHILD_TAIL] = lViewOrLContainer;
    return lViewOrLContainer;
}

/**
 * Advances to an element for later binding instructions.
 *
 * Used in conjunction with instructions like {@link property} to act on elements with specified
 * indices, for example those created with {@link element} or {@link elementStart}.
 *
 * ```ts
 * (rf: RenderFlags, ctx: any) => {
 *   if (rf & 1) {
 *     text(0, 'Hello');
 *     text(1, 'Goodbye')
 *     element(2, 'div');
 *   }
 *   if (rf & 2) {
 *     advance(2); // Advance twice to the <div>.
 *     property('title', 'test');
 *   }
 *  }
 * ```
 * @param delta Number of elements to advance forwards by.
 *
 * @codeGenApi
 */
function ɵɵadvance(delta = 1) {
    ngDevMode && assertGreaterThan(delta, 0, 'Can only advance forward');
    selectIndexInternal(getTView(), getLView(), getSelectedIndex() + delta, !!ngDevMode && isInCheckNoChangesMode());
}
function selectIndexInternal(tView, lView, index, checkNoChangesMode) {
    ngDevMode && assertIndexInDeclRange(lView[TVIEW], index);
    // Flush the initial hooks for elements in the view that have been added up to this point.
    // PERF WARNING: do NOT extract this to a separate function without running benchmarks
    if (!checkNoChangesMode) {
        const hooksInitPhaseCompleted = (lView[FLAGS] & 3 /* LViewFlags.InitPhaseStateMask */) === 3 /* InitPhaseState.InitPhaseCompleted */;
        if (hooksInitPhaseCompleted) {
            const preOrderCheckHooks = tView.preOrderCheckHooks;
            if (preOrderCheckHooks !== null) {
                executeCheckHooks(lView, preOrderCheckHooks, index);
            }
        }
        else {
            const preOrderHooks = tView.preOrderHooks;
            if (preOrderHooks !== null) {
                executeInitAndCheckHooks(lView, preOrderHooks, 0 /* InitPhaseState.OnInitHooksToBeRun */, index);
            }
        }
    }
    // We must set the selected index *after* running the hooks, because hooks may have side-effects
    // that cause other template functions to run, thus updating the selected index, which is global
    // state. If we run `setSelectedIndex` *before* we run the hooks, in some cases the selected index
    // will be altered by the time we leave the `ɵɵadvance` instruction.
    setSelectedIndex(index);
}

/** Flags describing an input for a directive. */
var InputFlags;
(function (InputFlags) {
    InputFlags[InputFlags["None"] = 0] = "None";
    InputFlags[InputFlags["SignalBased"] = 1] = "SignalBased";
    InputFlags[InputFlags["HasDecoratorInputTransform"] = 2] = "HasDecoratorInputTransform";
})(InputFlags || (InputFlags = {}));

function writeToDirectiveInput(def, instance, publicName, value) {
    const prevConsumer = setActiveConsumer$1(null);
    try {
        if (ngDevMode) {
            if (!def.inputs.hasOwnProperty(publicName)) {
                throw new Error(`ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of "${publicName}"`);
            }
            // Usually we resolve the directive instance using `LView[someIndex]` before writing to an
            // input, however if the read happens to early, the `LView[someIndex]` might actually be a
            // `NodeInjectorFactory`. Check for this specific case here since it can break in subtle ways.
            if (instance instanceof NodeInjectorFactory) {
                throw new Error(`ASSERTION ERROR: Cannot write input to factory for type ${def.type.name}. Directive has not been created yet.`);
            }
        }
        const [privateName, flags, transform] = def.inputs[publicName];
        // If we know we are dealing with a signal input, we cache its reference
        // in a tree-shakable way. The input signal node can then be used for
        // value transform execution or actual value updates without introducing
        // additional megamorphic accesses for accessing the instance field.
        let inputSignalNode = null;
        if ((flags & InputFlags.SignalBased) !== 0) {
            const field = instance[privateName];
            inputSignalNode = field[SIGNAL];
        }
        // If there is a signal node and a transform, run it before potentially
        // delegating to features like `NgOnChanges`.
        if (inputSignalNode !== null && inputSignalNode.transformFn !== undefined) {
            value = inputSignalNode.transformFn(value);
        }
        else if (transform !== null) {
            // If there is a decorator input transform, run it.
            value = transform.call(instance, value);
        }
        if (def.setInput !== null) {
            def.setInput(instance, inputSignalNode, value, publicName, privateName);
        }
        else {
            applyValueToInputField(instance, inputSignalNode, privateName, value);
        }
    }
    finally {
        setActiveConsumer$1(prevConsumer);
    }
}

function executeTemplate(tView, lView, templateFn, rf, context) {
    const prevSelectedIndex = getSelectedIndex();
    const isUpdatePhase = rf & 2 /* RenderFlags.Update */;
    try {
        setSelectedIndex(-1);
        if (isUpdatePhase && lView.length > HEADER_OFFSET) {
            // When we're updating, inherently select 0 so we don't
            // have to generate that instruction for most update blocks.
            selectIndexInternal(tView, lView, HEADER_OFFSET, !!ngDevMode && isInCheckNoChangesMode());
        }
        const preHookType = isUpdatePhase
            ? 2 /* ProfilerEvent.TemplateUpdateStart */
            : 0 /* ProfilerEvent.TemplateCreateStart */;
        profiler(preHookType, context);
        templateFn(rf, context);
    }
    finally {
        setSelectedIndex(prevSelectedIndex);
        const postHookType = isUpdatePhase
            ? 3 /* ProfilerEvent.TemplateUpdateEnd */
            : 1 /* ProfilerEvent.TemplateCreateEnd */;
        profiler(postHookType, context);
    }
}
/**
 * Creates directive instances.
 */
function createDirectivesInstances(tView, lView, tNode) {
    instantiateAllDirectives(tView, lView, tNode);
    if ((tNode.flags & 64 /* TNodeFlags.hasHostBindings */) === 64 /* TNodeFlags.hasHostBindings */) {
        invokeDirectivesHostBindings(tView, lView, tNode);
    }
}
/**
 * Takes a list of local names and indices and pushes the resolved local variable values
 * to LView in the same order as they are loaded in the template with load().
 */
function saveResolvedLocalsInData(viewData, tNode, localRefExtractor = getNativeByTNode) {
    const localNames = tNode.localNames;
    if (localNames !== null) {
        let localIndex = tNode.index + 1;
        for (let i = 0; i < localNames.length; i += 2) {
            const index = localNames[i + 1];
            const value = index === -1
                ? localRefExtractor(tNode, viewData)
                : viewData[index];
            viewData[localIndex++] = value;
        }
    }
}
/**
 * Locates the host native element, used for bootstrapping existing nodes into rendering pipeline.
 *
 * @param renderer the renderer used to locate the element.
 * @param elementOrSelector Render element or CSS selector to locate the element.
 * @param encapsulation View Encapsulation defined for component that requests host element.
 * @param injector Root view injector instance.
 */
function locateHostElement(renderer, elementOrSelector, encapsulation, injector) {
    // Note: we use default value for the `PRESERVE_HOST_CONTENT` here even though it's a
    // tree-shakable one (providedIn:'root'). This code path can be triggered during dynamic
    // component creation (after calling ViewContainerRef.createComponent) when an injector
    // instance can be provided. The injector instance might be disconnected from the main DI
    // tree, thus the `PRESERVE_HOST_CONTENT` would not be able to instantiate. In this case, the
    // default value will be used.
    const preserveHostContent = injector.get(PRESERVE_HOST_CONTENT, PRESERVE_HOST_CONTENT_DEFAULT);
    // When using native Shadow DOM, do not clear host element to allow native slot
    // projection.
    const preserveContent = preserveHostContent || encapsulation === ViewEncapsulation.ShadowDom;
    const rootElement = renderer.selectRootElement(elementOrSelector, preserveContent);
    applyRootElementTransform(rootElement);
    return rootElement;
}
/**
 * Applies any root element transformations that are needed. If hydration is enabled,
 * this will process corrupted text nodes.
 *
 * @param rootElement the app root HTML Element
 */
function applyRootElementTransform(rootElement) {
    _applyRootElementTransformImpl(rootElement);
}
/**
 * Reference to a function that applies transformations to the root HTML element
 * of an app. When hydration is enabled, this processes any corrupt text nodes
 * so they are properly hydratable on the client.
 *
 * @param rootElement the app root HTML Element
 */
let _applyRootElementTransformImpl = () => null;
/**
 * Processes text node markers before hydration begins. This replaces any special comment
 * nodes that were added prior to serialization are swapped out to restore proper text
 * nodes before hydration.
 *
 * @param rootElement the app root HTML Element
 */
function applyRootElementTransformImpl(rootElement) {
    if (hasSkipHydrationAttrOnRElement(rootElement)) {
        // Handle a situation when the `ngSkipHydration` attribute is applied
        // to the root node of an application. In this case, we should clear
        // the contents and render everything from scratch.
        clearElementContents(rootElement);
    }
    else {
        processTextNodeMarkersBeforeHydration(rootElement);
    }
}
/**
 * Sets the implementation for the `applyRootElementTransform` function.
 */
function enableApplyRootElementTransformImpl() {
    _applyRootElementTransformImpl = applyRootElementTransformImpl;
}
/**
 * Mapping between attributes names that don't correspond to their element property names.
 *
 * Performance note: this function is written as a series of if checks (instead of, say, a property
 * object lookup) for performance reasons - the series of `if` checks seems to be the fastest way of
 * mapping property names. Do NOT change without benchmarking.
 *
 * Note: this mapping has to be kept in sync with the equally named mapping in the template
 * type-checking machinery of ngtsc.
 */
function mapPropName(name) {
    if (name === 'class')
        return 'className';
    if (name === 'for')
        return 'htmlFor';
    if (name === 'formaction')
        return 'formAction';
    if (name === 'innerHtml')
        return 'innerHTML';
    if (name === 'readonly')
        return 'readOnly';
    if (name === 'tabindex')
        return 'tabIndex';
    return name;
}
function elementPropertyInternal(tView, tNode, lView, propName, value, renderer, sanitizer, nativeOnly) {
    ngDevMode && assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
    if (!nativeOnly) {
        const hasSetInput = setAllInputsForProperty(tNode, tView, lView, propName, value);
        if (hasSetInput) {
            isComponentHost(tNode) && markDirtyIfOnPush(lView, tNode.index);
            ngDevMode && setNgReflectProperties(lView, tView, tNode, propName, value);
            return; // Stop propcessing if we've matched at least one input.
        }
    }
    if (tNode.type & 3 /* TNodeType.AnyRNode */) {
        const element = getNativeByTNode(tNode, lView);
        propName = mapPropName(propName);
        if (ngDevMode) {
            validateAgainstEventProperties(propName);
            if (!isPropertyValid(element, propName, tNode.value, tView.schemas)) {
                handleUnknownPropertyError(propName, tNode.value, tNode.type, lView);
            }
            ngDevMode.rendererSetProperty++;
        }
        // It is assumed that the sanitizer is only added when the compiler determines that the
        // property is risky, so sanitization can be done without further checks.
        value = sanitizer != null ? sanitizer(value, tNode.value || '', propName) : value;
        renderer.setProperty(element, propName, value);
    }
    else if (tNode.type & 12 /* TNodeType.AnyContainer */) {
        // If the node is a container and the property didn't
        // match any of the inputs or schemas we should throw.
        if (ngDevMode && !matchingSchemas(tView.schemas, tNode.value)) {
            handleUnknownPropertyError(propName, tNode.value, tNode.type, lView);
        }
    }
}
/** If node is an OnPush component, marks its LView dirty. */
function markDirtyIfOnPush(lView, viewIndex) {
    ngDevMode && assertLView(lView);
    const childComponentLView = getComponentLViewByIndex(viewIndex, lView);
    if (!(childComponentLView[FLAGS] & 16 /* LViewFlags.CheckAlways */)) {
        childComponentLView[FLAGS] |= 64 /* LViewFlags.Dirty */;
    }
}
function setNgReflectProperty(lView, tNode, attrName, value) {
    const element = getNativeByTNode(tNode, lView);
    const renderer = lView[RENDERER];
    attrName = normalizeDebugBindingName(attrName);
    const debugValue = normalizeDebugBindingValue(value);
    if (tNode.type & 3 /* TNodeType.AnyRNode */) {
        if (value == null) {
            renderer.removeAttribute(element, attrName);
        }
        else {
            renderer.setAttribute(element, attrName, debugValue);
        }
    }
    else {
        const textContent = escapeCommentText(`bindings=${JSON.stringify({ [attrName]: debugValue }, null, 2)}`);
        renderer.setValue(element, textContent);
    }
}
function setNgReflectProperties(lView, tView, tNode, publicName, value) {
    if (!(tNode.type & (3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */))) {
        return;
    }
    const inputConfig = tNode.inputs?.[publicName];
    const hostInputConfig = tNode.hostDirectiveInputs?.[publicName];
    if (hostInputConfig) {
        for (let i = 0; i < hostInputConfig.length; i += 2) {
            const index = hostInputConfig[i];
            const publicName = hostInputConfig[i + 1];
            const def = tView.data[index];
            setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);
        }
    }
    // Note: we set the private name of the input as the reflected property, not the public one.
    if (inputConfig) {
        for (const index of inputConfig) {
            const def = tView.data[index];
            setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);
        }
    }
}
/**
 * Instantiate all the directives that were previously resolved on the current node.
 */
function instantiateAllDirectives(tView, lView, tNode) {
    const start = tNode.directiveStart;
    const end = tNode.directiveEnd;
    // The component view needs to be created before creating the node injector
    // since it is used to inject some special symbols like `ChangeDetectorRef`.
    if (isComponentHost(tNode)) {
        ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */);
        createComponentLView(lView, tNode, tView.data[start + tNode.componentOffset]);
    }
    if (!tView.firstCreatePass) {
        getOrCreateNodeInjectorForNode(tNode, lView);
    }
    const initialInputs = tNode.initialInputs;
    for (let i = start; i < end; i++) {
        const def = tView.data[i];
        const directive = getNodeInjectable(lView, tView, i, tNode);
        attachPatchData(directive, lView);
        if (initialInputs !== null) {
            setInputsFromAttrs(lView, i - start, directive, def, tNode, initialInputs);
        }
        if (isComponentDef(def)) {
            const componentView = getComponentLViewByIndex(tNode.index, lView);
            componentView[CONTEXT] = getNodeInjectable(lView, tView, i, tNode);
        }
    }
}
function invokeDirectivesHostBindings(tView, lView, tNode) {
    const start = tNode.directiveStart;
    const end = tNode.directiveEnd;
    const elementIndex = tNode.index;
    const currentDirectiveIndex = getCurrentDirectiveIndex();
    try {
        setSelectedIndex(elementIndex);
        for (let dirIndex = start; dirIndex < end; dirIndex++) {
            const def = tView.data[dirIndex];
            const directive = lView[dirIndex];
            setCurrentDirectiveIndex(dirIndex);
            if (def.hostBindings !== null || def.hostVars !== 0 || def.hostAttrs !== null) {
                invokeHostBindingsInCreationMode(def, directive);
            }
        }
    }
    finally {
        setSelectedIndex(-1);
        setCurrentDirectiveIndex(currentDirectiveIndex);
    }
}
/**
 * Invoke the host bindings in creation mode.
 *
 * @param def `DirectiveDef` which may contain the `hostBindings` function.
 * @param directive Instance of directive.
 */
function invokeHostBindingsInCreationMode(def, directive) {
    if (def.hostBindings !== null) {
        def.hostBindings(1 /* RenderFlags.Create */, directive);
    }
}
/**
 * Matches the current node against all available selectors.
 * If a component is matched (at most one), it is returned in first position in the array.
 */
function findDirectiveDefMatches(tView, tNode) {
    ngDevMode && assertFirstCreatePass(tView);
    ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */);
    const registry = tView.directiveRegistry;
    let matches = null;
    if (registry) {
        for (let i = 0; i < registry.length; i++) {
            const def = registry[i];
            if (isNodeMatchingSelectorList(tNode, def.selectors, /* isProjectionMode */ false)) {
                matches ??= [];
                if (isComponentDef(def)) {
                    if (ngDevMode) {
                        assertTNodeType(tNode, 2 /* TNodeType.Element */, `"${tNode.value}" tags cannot be used as component hosts. ` +
                            `Please use a different tag to activate the ${stringify(def.type)} component.`);
                        if (matches.length && isComponentDef(matches[0])) {
                            throwMultipleComponentError(tNode, matches.find(isComponentDef).type, def.type);
                        }
                    }
                    matches.unshift(def);
                }
                else {
                    matches.push(def);
                }
            }
        }
    }
    return matches;
}
function elementAttributeInternal(tNode, lView, name, value, sanitizer, namespace) {
    if (ngDevMode) {
        assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
        validateAgainstEventAttributes(name);
        assertTNodeType(tNode, 2 /* TNodeType.Element */, `Attempted to set attribute \`${name}\` on a container node. ` +
            `Host bindings are not valid on ng-container or ng-template.`);
    }
    const element = getNativeByTNode(tNode, lView);
    setElementAttribute(lView[RENDERER], element, namespace, tNode.value, name, value, sanitizer);
}
function setElementAttribute(renderer, element, namespace, tagName, name, value, sanitizer) {
    if (value == null) {
        ngDevMode && ngDevMode.rendererRemoveAttribute++;
        renderer.removeAttribute(element, name, namespace);
    }
    else {
        ngDevMode && ngDevMode.rendererSetAttribute++;
        const strValue = sanitizer == null ? renderStringify(value) : sanitizer(value, tagName || '', name);
        renderer.setAttribute(element, name, strValue, namespace);
    }
}
/**
 * Sets initial input properties on directive instances from attribute data
 *
 * @param lView Current LView that is being processed.
 * @param directiveIndex Index of the directive in directives array
 * @param instance Instance of the directive on which to set the initial inputs
 * @param def The directive def that contains the list of inputs
 * @param tNode The static data for this node
 */
function setInputsFromAttrs(lView, directiveIndex, instance, def, tNode, initialInputData) {
    const initialInputs = initialInputData[directiveIndex];
    if (initialInputs !== null) {
        for (let i = 0; i < initialInputs.length; i += 2) {
            const lookupName = initialInputs[i];
            const value = initialInputs[i + 1];
            writeToDirectiveInput(def, instance, lookupName, value);
            if (ngDevMode) {
                setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value);
            }
        }
    }
}
///////////////////////////////
//// Bindings & interpolations
///////////////////////////////
/**
 * Stores meta-data for a property binding to be used by TestBed's `DebugElement.properties`.
 *
 * In order to support TestBed's `DebugElement.properties` we need to save, for each binding:
 * - a bound property name;
 * - a static parts of interpolated strings;
 *
 * A given property metadata is saved at the binding's index in the `TView.data` (in other words, a
 * property binding metadata will be stored in `TView.data` at the same index as a bound value in
 * `LView`). Metadata are represented as `INTERPOLATION_DELIMITER`-delimited string with the
 * following format:
 * - `propertyName` for bound properties;
 * - `propertyName�prefix�interpolation_static_part1�..interpolation_static_partN�suffix` for
 * interpolated properties.
 *
 * @param tData `TData` where meta-data will be saved;
 * @param tNode `TNode` that is a target of the binding;
 * @param propertyName bound property name;
 * @param bindingIndex binding index in `LView`
 * @param interpolationParts static interpolation parts (for property interpolations)
 */
function storePropertyBindingMetadata(tData, tNode, propertyName, bindingIndex, ...interpolationParts) {
    // Binding meta-data are stored only the first time a given property instruction is processed.
    // Since we don't have a concept of the "first update pass" we need to check for presence of the
    // binding meta-data to decide if one should be stored (or if was stored already).
    if (tData[bindingIndex] === null) {
        if (!tNode.inputs?.[propertyName] && !tNode.hostDirectiveInputs?.[propertyName]) {
            const propBindingIdxs = tNode.propertyBindings || (tNode.propertyBindings = []);
            propBindingIdxs.push(bindingIndex);
            let bindingMetadata = propertyName;
            if (interpolationParts.length > 0) {
                bindingMetadata +=
                    INTERPOLATION_DELIMITER + interpolationParts.join(INTERPOLATION_DELIMITER);
            }
            tData[bindingIndex] = bindingMetadata;
        }
    }
}
/**
 * There are cases where the sub component's renderer needs to be included
 * instead of the current renderer (see the componentSyntheticHost* instructions).
 */
function loadComponentRenderer(currentDef, tNode, lView) {
    // TODO(FW-2043): the `currentDef` is null when host bindings are invoked while creating root
    // component (see packages/core/src/render3/component.ts). This is not consistent with the process
    // of creating inner components, when current directive index is available in the state. In order
    // to avoid relying on current def being `null` (thus special-casing root component creation), the
    // process of creating root component should be unified with the process of creating inner
    // components.
    if (currentDef === null || isComponentDef(currentDef)) {
        lView = unwrapLView(lView[tNode.index]);
    }
    return lView[RENDERER];
}
/** Handles an error thrown in an LView. */
function handleError$1(lView, error) {
    const injector = lView[INJECTOR];
    const errorHandler = injector ? injector.get(ErrorHandler, null) : null;
    errorHandler && errorHandler.handleError(error);
}
/**
 * Set all directive inputs with the specific public name on the node.
 *
 * @param tNode TNode on which the input is being set.
 * @param tView Current TView
 * @param lView `LView` which contains the directives.
 * @param publicName Public name of the input being set.
 * @param value Value to set.
 */
function setAllInputsForProperty(tNode, tView, lView, publicName, value) {
    const inputs = tNode.inputs?.[publicName];
    const hostDirectiveInputs = tNode.hostDirectiveInputs?.[publicName];
    let hasMatch = false;
    if (hostDirectiveInputs) {
        for (let i = 0; i < hostDirectiveInputs.length; i += 2) {
            const index = hostDirectiveInputs[i];
            ngDevMode && assertIndexInRange(lView, index);
            const publicName = hostDirectiveInputs[i + 1];
            const def = tView.data[index];
            writeToDirectiveInput(def, lView[index], publicName, value);
            hasMatch = true;
        }
    }
    if (inputs) {
        for (const index of inputs) {
            ngDevMode && assertIndexInRange(lView, index);
            const instance = lView[index];
            const def = tView.data[index];
            writeToDirectiveInput(def, instance, publicName, value);
            hasMatch = true;
        }
    }
    return hasMatch;
}

function renderComponent(hostLView, componentHostIdx) {
    ngDevMode && assertEqual(isCreationMode(hostLView), true, 'Should be run in creation mode');
    const componentView = getComponentLViewByIndex(componentHostIdx, hostLView);
    const componentTView = componentView[TVIEW];
    syncViewWithBlueprint(componentTView, componentView);
    const hostRNode = componentView[HOST];
    // Populate an LView with hydration info retrieved from the DOM via TransferState.
    if (hostRNode !== null && componentView[HYDRATION] === null) {
        componentView[HYDRATION] = retrieveHydrationInfo(hostRNode, componentView[INJECTOR]);
    }
    profiler(18 /* ProfilerEvent.ComponentStart */);
    renderView(componentTView, componentView, componentView[CONTEXT]);
    profiler(19 /* ProfilerEvent.ComponentEnd */, componentView[CONTEXT]);
}
/**
 * Syncs an LView instance with its blueprint if they have gotten out of sync.
 *
 * Typically, blueprints and their view instances should always be in sync, so the loop here
 * will be skipped. However, consider this case of two components side-by-side:
 *
 * App template:
 * ```html
 * <comp></comp>
 * <comp></comp>
 * ```
 *
 * The following will happen:
 * 1. App template begins processing.
 * 2. First <comp> is matched as a component and its LView is created.
 * 3. Second <comp> is matched as a component and its LView is created.
 * 4. App template completes processing, so it's time to check child templates.
 * 5. First <comp> template is checked. It has a directive, so its def is pushed to blueprint.
 * 6. Second <comp> template is checked. Its blueprint has been updated by the first
 * <comp> template, but its LView was created before this update, so it is out of sync.
 *
 * Note that embedded views inside ngFor loops will never be out of sync because these views
 * are processed as soon as they are created.
 *
 * @param tView The `TView` that contains the blueprint for syncing
 * @param lView The view to sync
 */
function syncViewWithBlueprint(tView, lView) {
    for (let i = lView.length; i < tView.blueprint.length; i++) {
        lView.push(tView.blueprint[i]);
    }
}
/**
 * Processes a view in the creation mode. This includes a number of steps in a specific order:
 * - creating view query functions (if any);
 * - executing a template function in the creation mode;
 * - updating static queries (if any);
 * - creating child components defined in a given view.
 */
function renderView(tView, lView, context) {
    ngDevMode && assertEqual(isCreationMode(lView), true, 'Should be run in creation mode');
    ngDevMode && assertNotReactive(renderView.name);
    enterView(lView);
    try {
        const viewQuery = tView.viewQuery;
        if (viewQuery !== null) {
            executeViewQueryFn(1 /* RenderFlags.Create */, viewQuery, context);
        }
        // Execute a template associated with this view, if it exists. A template function might not be
        // defined for the root component views.
        const templateFn = tView.template;
        if (templateFn !== null) {
            executeTemplate(tView, lView, templateFn, 1 /* RenderFlags.Create */, context);
        }
        // This needs to be set before children are processed to support recursive components.
        // This must be set to false immediately after the first creation run because in an
        // ngFor loop, all the views will be created together before update mode runs and turns
        // off firstCreatePass. If we don't set it here, instances will perform directive
        // matching, etc again and again.
        if (tView.firstCreatePass) {
            tView.firstCreatePass = false;
        }
        // Mark all queries active in this view as dirty. This is necessary for signal-based queries to
        // have a clear marking point where we can read query results atomically (for a given view).
        lView[QUERIES]?.finishViewCreation(tView);
        // We resolve content queries specifically marked as `static` in creation mode. Dynamic
        // content queries are resolved during change detection (i.e. update mode), after embedded
        // views are refreshed (see block above).
        if (tView.staticContentQueries) {
            refreshContentQueries(tView, lView);
        }
        // We must materialize query results before child components are processed
        // in case a child component has projected a container. The LContainer needs
        // to exist so the embedded views are properly attached by the container.
        if (tView.staticViewQueries) {
            executeViewQueryFn(2 /* RenderFlags.Update */, tView.viewQuery, context);
        }
        // Render child component views.
        const components = tView.components;
        if (components !== null) {
            renderChildComponents(lView, components);
        }
    }
    catch (error) {
        // If we didn't manage to get past the first template pass due to
        // an error, mark the view as corrupted so we can try to recover.
        if (tView.firstCreatePass) {
            tView.incompleteFirstPass = true;
            tView.firstCreatePass = false;
        }
        throw error;
    }
    finally {
        lView[FLAGS] &= -5 /* LViewFlags.CreationMode */;
        leaveView();
    }
}
/** Renders child components in the current view (creation mode). */
function renderChildComponents(hostLView, components) {
    for (let i = 0; i < components.length; i++) {
        renderComponent(hostLView, components[i]);
    }
}

function createAndRenderEmbeddedLView(declarationLView, templateTNode, context, options) {
    const prevConsumer = setActiveConsumer$1(null);
    try {
        const embeddedTView = templateTNode.tView;
        ngDevMode && assertDefined(embeddedTView, 'TView must be defined for a template node.');
        ngDevMode && assertTNodeForLView(templateTNode, declarationLView);
        // Embedded views follow the change detection strategy of the view they're declared in.
        const isSignalView = declarationLView[FLAGS] & 4096 /* LViewFlags.SignalView */;
        const viewFlags = isSignalView ? 4096 /* LViewFlags.SignalView */ : 16 /* LViewFlags.CheckAlways */;
        const embeddedLView = createLView(declarationLView, embeddedTView, context, viewFlags, null, templateTNode, null, null, options?.injector ?? null, options?.embeddedViewInjector ?? null, options?.dehydratedView ?? null);
        const declarationLContainer = declarationLView[templateTNode.index];
        ngDevMode && assertLCo   ntainer(declarationLContainer);
        embeddedLView[DECLARATION_LCONTAINER] = declarationLContainer;
        const declarationViewLQueries = declarationLView[QUERIES];
        if (declarationViewLQueries !== null) {
            embeddedLView[QUERIES] = declarationViewLQueries.createEmbeddedView(embeddedTView);
        }
        // execute creation mode of a view
        renderView(embeddedTView, embeddedLView, context);
        return embeddedLView;
    }
    finally {
        setActiveConsumer$1(prevConsumer);
    }
}
/**
 * Returns whether an elements that belong to a view should be
 * inserted into the DOM. For client-only cases, DOM elements are
 * always inserted. For hydration cases, we check whether serialized
 * info is available for a view and the view is not in a "skip hydration"
 * block (in which case view contents was re-created, thus needing insertion).
 */
function shouldAddViewToDom(tNode, dehydratedView) {
    return (!dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode));
}

let _icuContainerIterate;
/**
 * Iterator which provides ability to visit all of the `TIcuContainerNode` root `RNode`s.
 */
function icuContainerIterate(tIcuContainerNode, lView) {
    return _icuContainerIterate(tIcuContainerNode, lView);
}
/**
 * Ensures that `IcuContainerVisitor`'s implementation is present.
 *
 * This function is invoked when i18n instruction comes across an ICU. The purpose is to allow the
 * bundler to tree shake ICU logic and only load it if ICU instruction is executed.
 */
function ensureIcuContainerVisitorLoaded(loader) {
    if (_icuContainerIterate === undefined) {
        // Do not inline this function. We want to keep `ensureIcuContainerVisitorLoaded` light, so it
        // can be inlined into call-site.
        _icuContainerIterate = loader();
    }
}

/**
 * Flags for renderer-specific style modifiers.
 * @publicApi
 */
var RendererStyleFlags2;
(function (RendererStyleFlags2) {
    // TODO(misko): This needs to be refactored into a separate file so that it can be imported from
    // `node_manipulation.ts` Currently doing the import cause resolution order to change and fails
    // the tests. The work around is to have hard coded value in `node_manipulation.ts` for now.
    /**
     * Marks a style as important.
     */
    RendererStyleFlags2[RendererStyleFlags2["Important"] = 1] = "Important";
    /**
     * Marks a style as using dash case naming (this-is-dash-case).
     */
    RendererStyleFlags2[RendererStyleFlags2["DashCase"] = 2] = "DashCase";
})(RendererStyleFlags2 || (RendererStyleFlags2 = {}));

/**
 * Checks whether a TNode is considered detached, i.e. not present in the
 * translated i18n template. We should not attempt hydration for such nodes
 * and instead, use a regular "creation mode".
 */
function isDetachedByI18n(tNode) {
    return (tNode.flags & 32 /* TNodeFlags.isDetached */) === 32 /* TNodeFlags.isDetached */;
}

/**
 * NOTE: for performance reasons, the possible actions are inlined within the function instead of
 * being passed as an argument.
 */
function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode) {
    // If this slot was allocated for a text node dynamically created by i18n, the text node itself
    // won't be created until i18nApply() in the update block, so this node should be skipped.
    // For more info, see "ICU expressions should work inside an ngTemplateOutlet inside an ngFor"
    // in `i18n_spec.ts`.
    if (lNodeToHandle != null) {
        let lContainer;
        let isComponent = false;
        // We are expecting an RNode, but in the case of a component or LContainer the `RNode` is
        // wrapped in an array which needs to be unwrapped. We need to know if it is a component and if
        // it has LContainer so that we can process all of those cases appropriately.
        if (isLContainer(lNodeToHandle)) {
            lContainer = lNodeToHandle;
        }
        else if (isLView(lNodeToHandle)) {
            isComponent = true;
            ngDevMode && assertDefined(lNodeToHandle[HOST], 'HOST must be defined for a component LView');
            lNodeToHandle = lNodeToHandle[HOST];
        }
        const rNode = unwrapRNode(lNodeToHandle);
        if (action === 0 /* WalkTNodeTreeAction.Create */ && parent !== null) {
            if (beforeNode == null) {
                nativeAppendChild(renderer, parent, rNode);
            }
            else {
                nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);
            }
        }
        else if (action === 1 /* WalkTNodeTreeAction.Insert */ && parent !== null) {
            nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);
        }
        else if (action === 2 /* WalkTNodeTreeAction.Detach */) {
            nativeRemoveNode(renderer, rNode, isComponent);
        }
        else if (action === 3 /* WalkTNodeTreeAction.Destroy */) {
            ngDevMode && ngDevMode.rendererDestroyNode++;
            renderer.destroyNode(rNode);
        }
        if (lContainer != null) {
            applyContainer(renderer, action, lContainer, parent, beforeNode);
        }
    }
}
/**
 * Removes all DOM elements associated with a view.
 *
 * Because some root nodes of the view may be containers, we sometimes need
 * to propagate deeply into the nested containers to remove all elements in the
 * views beneath it.
 *
 * @param tView The `TView' of the `LView` from which elements should be added or removed
 * @param lView The view from which elements should be added or removed
 */
function removeViewFromDOM(tView, lView) {
    detachViewFromDOM(tView, lView);
    lView[HOST] = null;
    lView[T_HOST] = null;
}
/**
 * Adds all DOM elements associated with a view.
 *
 * Because some root nodes of the view may be containers, we sometimes need
 * to propagate deeply into the nested containers to add all elements in the
 * views beneath it.
 *
 * @param tView The `TView' of the `LView` from which elements should be added or removed
 * @param parentTNode The `TNode` where the `LView` should be attached to.
 * @param renderer Current renderer to use for DOM manipulations.
 * @param lView The view from which elements should be added or removed
 * @param parentNativeNode The parent `RElement` where it should be inserted into.
 * @param beforeNode The node before which elements should be added, if insert mode
 */
function addViewToDOM(tView, parentTNode, renderer, lView, parentNativeNode, beforeNode) {
    lView[HOST] = parentNativeNode;
    lView[T_HOST] = parentTNode;
    applyView(tView, lView, renderer, 1 /* WalkTNodeTreeAction.Insert */, parentNativeNode, beforeNode);
}
/**
 * Detach a `LView` from the DOM by detaching its nodes.
 *
 * @param tView The `TView' of the `LView` to be detached
 * @param lView the `LView` to be detached.
 */
function detachViewFromDOM(tView, lView) {
    // When we remove a view from the DOM, we need to rerun afterRender hooks
    // We don't necessarily needs to run change detection. DOM removal only requires
    // change detection if animations are enabled (this notification is handled by animations).
    lView[ENVIRONMENT].changeDetectionScheduler?.notify(9 /* NotificationSource.ViewDetachedFromDOM */);
    applyView(tView, lView, lView[RENDERER], 2 /* WalkTNodeTreeAction.Detach */, null, null);
}
/**
 * Traverses down and up the tree of views and containers to remove listeners and
 * call onDestroy callbacks.
 *
 * Notes:
 *  - Because it's used for onDestroy calls, it needs to be bottom-up.
 *  - Must process containers instead of their views to avoid splicing
 *  when views are destroyed and re-added.
 *  - Using a while loop because it's faster than recursion
 *  - Destroy only called on movement to sibling or movement to parent (laterally or up)
 *
 *  @param rootView The view to destroy
 */
function destroyViewTree(rootView) {
    // If the view has no children, we can clean it up and return early.
    let lViewOrLContainer = rootView[CHILD_HEAD];
    if (!lViewOrLContainer) {
        return cleanUpView(rootView[TVIEW], rootView);
    }
    while (lViewOrLContainer) {
        let next = null;
        if (isLView(lViewOrLContainer)) {
            // If LView, traverse down to child.
            next = lViewOrLContainer[CHILD_HEAD];
        }
        else {
            ngDevMode && assertLContainer(lViewOrLContainer);
            // If container, traverse down to its first LView.
            const firstView = lViewOrLContainer[CONTAINER_HEADER_OFFSET];
            if (firstView)
                next = firstView;
        }
        if (!next) {
            // Only clean up view when moving to the side or up, as destroy hooks
            // should be called in order from the bottom up.
            while (lViewOrLContainer && !lViewOrLContainer[NEXT] && lViewOrLContainer !== rootView) {
                if (isLView(lViewOrLContainer)) {
                    cleanUpView(lViewOrLContainer[TVIEW], lViewOrLContainer);
                }
                lViewOrLContainer = lViewOrLContainer[PARENT];
            }
            if (lViewOrLContainer === null)
                lViewOrLContainer = rootView;
            if (isLView(lViewOrLContainer)) {
                cleanUpView(lViewOrLContainer[TVIEW], lViewOrLContainer);
            }
            next = lViewOrLContainer && lViewOrLContainer[NEXT];
        }
        lViewOrLContainer = next;
    }
}
function detachMovedView(declarationContainer, lView) {
    ngDevMode && assertLContainer(declarationContainer);
    ngDevMode &&
        assertDefined(declarationContainer[MOVED_VIEWS], 'A projected view should belong to a non-empty projected views collection');
    const movedViews = declarationContainer[MOVED_VIEWS];
    const declarationViewIndex = movedViews.indexOf(lView);
    movedViews.splice(declarationViewIndex, 1);
}
/**
 * A standalone function which destroys an LView,
 * conducting clean up (e.g. removing listeners, calling onDestroys).
 *
 * @param tView The `TView' of the `LView` to be destroyed
 * @param lView The view to be destroyed.
 */
function destroyLView(tView, lView) {
    if (isDestroyed(lView)) {
        return;
    }
    const renderer = lView[RENDERER];
    if (renderer.destroyNode) {
        applyView(tView, lView, renderer, 3 /* WalkTNodeTreeAction.Destroy */, null, null);
    }
    destroyViewTree(lView);
}
/**
 * Calls onDestroys hooks for all directives and pipes in a given view and then removes all
 * listeners. Listeners are removed as the last step so events delivered in the onDestroys hooks
 * can be propagated to @Output listeners.
 *
 * @param tView `TView` for the `LView` to clean up.
 * @param lView The LView to clean up
 */
function cleanUpView(tView, lView) {
    if (isDestroyed(lView)) {
        return;
    }
    const prevConsumer = setActiveConsumer$1(null);
    try {
        // Usually the Attached flag is removed when the view is detached from its parent, however
        // if it's a root view, the flag won't be unset hence why we're also removing on destroy.
        lView[FLAGS] &= ~128 /* LViewFlags.Attached */;
        // Mark the LView as destroyed *before* executing the onDestroy hooks. An onDestroy hook
        // runs arbitrary user code, which could include its own `viewRef.destroy()` (or similar). If
        // We don't flag the view as destroyed before the hooks, this could lead to an infinite loop.
        // This also aligns with the ViewEngine behavior. It also means that the onDestroy hook is
        // really more of an "afterDestroy" hook if you think about it.
        lView[FLAGS] |= 256 /* LViewFlags.Destroyed */;
        lView[REACTIVE_TEMPLATE_CONSUMER] && consumerDestroy(lView[REACTIVE_TEMPLATE_CONSUMER]);
        executeOnDestroys(tView, lView);
        processCleanups(tView, lView);
        // For component views only, the local renderer is destroyed at clean up time.
        if (lView[TVIEW].type === 1 /* TViewType.Component */) {
            ngDevMode && ngDevMode.rendererDestroy++;
            lView[RENDERER].destroy();
        }
        const declarationContainer = lView[DECLARATION_LCONTAINER];
        // we are dealing with an embedded view that is still inserted into a container
        if (declarationContainer !== null && isLContainer(lView[PARENT])) {
            // and this is a projected view
            if (declarationContainer !== lView[PARENT]) {
                detachMovedView(declarationContainer, lView);
            }
            // For embedded views still attached to a container: remove query result from this view.
            const lQueries = lView[QUERIES];
            if (lQueries !== null) {
                lQueries.detachView(tView);
            }
        }
        // Unregister the view once everything else has been cleaned up.
        unregisterLView(lView);
    }
    finally {
        setActiveConsumer$1(prevConsumer);
    }
}
/** Removes listeners and unsubscribes from output subscriptions */
function processCleanups(tView, lView) {
    ngDevMode && assertNotReactive(processCleanups.name);
    const tCleanup = tView.cleanup;
    const lCleanup = lView[CLEANUP];
    if (tCleanup !== null) {
        for (let i = 0; i < tCleanup.length - 1; i += 2) {
            if (typeof tCleanup[i] === 'string') {
                // This is a native DOM listener. It will occupy 4 entries in the TCleanup array (hence i +=
                // 2 at the end of this block).
                const targetIdx = tCleanup[i + 3];
                ngDevMode && assertNumber(targetIdx, 'cleanup target must be a number');
                if (targetIdx >= 0) {
                    // Destroy anything whose teardown is a function call (e.g. QueryList, ModelSignal).
                    lCleanup[targetIdx]();
                }
                else {
                    // Subscription
                    lCleanup[-targetIdx].unsubscribe();
                }
                i += 2;
            }
            else {
                // This is a cleanup function that is grouped with the index of its context
                const context = lCleanup[tCleanup[i + 1]];
                tCleanup[i].call(context);
            }
        }
    }
    if (lCleanup !== null) {
        lView[CLEANUP] = null;
    }
    const destroyHooks = lView[ON_DESTROY_HOOKS];
    if (destroyHooks !== null) {
        // Reset the ON_DESTROY_HOOKS array before iterating over it to prevent hooks that unregister
        // themselves from mutating the array during iteration.
        lView[ON_DESTROY_HOOKS] = null;
        for (let i = 0; i < destroyHooks.length; i++) {
            const destroyHooksFn = destroyHooks[i];
            ngDevMode && assertFunction(destroyHooksFn, 'Expecting destroy hook to be a function.');
            destroyHooksFn();
        }
    }
    // Destroy effects registered to the view. Many of these will have been processed above.
    const effects = lView[EFFECTS];
    if (effects !== null) {
        lView[EFFECTS] = null;
        for (const effect of effects) {
            effect.destroy();
        }
    }
}
/** Calls onDestroy hooks for this view */
function executeOnDestroys(tView, lView) {
    ngDevMode && assertNotReactive(executeOnDestroys.name);
    let destroyHooks;
    if (tView != null && (destroyHooks = tView.destroyHooks) != null) {
        for (let i = 0; i < destroyHooks.length; i += 2) {
            const context = lView[destroyHooks[i]];
            // Only call the destroy hook if the context has been requested.
            if (!(context instanceof NodeInjectorFactory)) {
                const toCall = destroyHooks[i + 1];
                if (Array.isArray(toCall)) {
                    for (let j = 0; j < toCall.length; j += 2) {
                        const callContext = context[toCall[j]];
                        const hook = toCall[j + 1];
                        profiler(4 /* ProfilerEvent.LifecycleHookStart */, callContext, hook);
                        try {
                            hook.call(callContext);
                        }
                        finally {
                            profiler(5 /* ProfilerEvent.LifecycleHookEnd */, callContext, hook);
                        }
                    }
                }
                else {
                    profiler(4 /* ProfilerEvent.LifecycleHookStart */, context, toCall);
                    try {
                        toCall.call(context);
                    }
                    finally {
                        profiler(5 /* ProfilerEvent.LifecycleHookEnd */, context, toCall);
                    }
                }
            }
        }
    }
}
/**
 * Returns a native element if a node can be inserted into the given parent.
 *
 * There are two reasons why we may not be able to insert a element immediately.
 * - Projection: When creating a child content element of a component, we have to skip the
 *   insertion because the content of a component will be projected.
 *   `<component><content>delayed due to projection</content></component>`
 * - Parent container is disconnected: This can happen when we are inserting a view into
 *   parent container, which itself is disconnected. For example the parent container is part
 *   of a View which has not be inserted or is made for projection but has not been inserted
 *   into destination.
 *
 * @param tView: Current `TView`.
 * @param tNode: `TNode` for which we wish to retrieve render parent.
 * @param lView: Current `LView`.
 */
function getParentRElement(tView, tNode, lView) {
    return getClosestRElement(tView, tNode.parent, lView);
}
/**
 * Get closest `RElement` or `null` if it can't be found.
 *
 * If `TNode` is `TNodeType.Element` => return `RElement` at `LView[tNode.index]` location.
 * If `TNode` is `TNodeType.ElementContainer|IcuContain` => return the parent (recursively).
 * If `TNode` is `null` then return host `RElement`:
 *   - return `null` if projection
 *   - return `null` if parent container is disconnected (we have no parent.)
 *
 * @param tView: Current `TView`.
 * @param tNode: `TNode` for which we wish to retrieve `RElement` (or `null` if host element is
 *     needed).
 * @param lView: Current `LView`.
 * @returns `null` if the `RElement` can't be determined at this time (no parent / projection)
 */
function getClosestRElement(tView, tNode, lView) {
    let parentTNode = tNode;
    // Skip over element and ICU containers as those are represented by a comment node and
    // can't be used as a render parent. Also skip let declarations since they don't have a
    // corresponding DOM node at all.
    while (parentTNode !== null &&
        parentTNode.type & (8 /* TNodeType.ElementContainer */ | 32 /* TNodeType.Icu */ | 128 /* TNodeType.LetDeclaration */)) {
        tNode = parentTNode;
        parentTNode = tNode.parent;
    }
    // If the parent tNode is null, then we are inserting across views: either into an embedded view
    // or a component view.
    if (parentTNode === null) {
        // We are inserting a root element of the component view into the component host element and
        // it should always be eager.
        return lView[HOST];
    }
    else {
        ngDevMode && assertTNodeType(parentTNode, 3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */);
        if (isComponentHost(parentTNode)) {
            ngDevMode && assertTNodeForLView(parentTNode, lView);
            const { encapsulation } = tView.data[parentTNode.directiveStart + parentTNode.componentOffset];
            // We've got a parent which is an element in the current view. We just need to verify if the
            // parent element is not a component. Component's content nodes are not inserted immediately
            // because they will be projected, and so doing insert at this point would be wasteful.
            // Since the projection would then move it to its final destination. Note that we can't
            // make this assumption when using the Shadow DOM, because the native projection placeholders
            // (<content> or <slot>) have to be in place as elements are being inserted.
            if (encapsulation === ViewEncapsulation.None ||
                encapsulation === ViewEncapsulation.Emulated) {
                return null;
            }
        }
        return getNativeByTNode(parentTNode, lView);
    }
}
/**
 * Find a node in front of which `currentTNode` should be inserted.
 *
 * This method determines the `RNode` in front of which we should insert the `currentRNode`. This
 * takes `TNode.insertBeforeIndex` into account if i18n code has been invoked.
 *
 * @param parentTNode parent `TNode`
 * @param currentTNode current `TNode` (The node which we would like to insert into the DOM)
 * @param lView current `LView`
 */
function getInsertInFrontOfRNode(parentTNode, currentTNode, lView) {
    return _getInsertInFrontOfRNodeWithI18n(parentTNode, currentTNode, lView);
}
/**
 * Find a node in front of which `currentTNode` should be inserted. (Does not take i18n into
 * account)
 *
 * This method determines the `RNode` in front of which we should insert the `currentRNode`. This
 * does not take `TNode.insertBeforeIndex` into account.
 *
 * @param parentTNode parent `TNode`
 * @param currentTNode current `TNode` (The node which we would like to insert into the DOM)
 * @param lView current `LView`
 */
function getInsertInFrontOfRNodeWithNoI18n(parentTNode, currentTNode, lView) {
    if (parentTNode.type & (8 /* TNodeType.ElementContainer */ | 32 /* TNodeType.Icu */)) {
        return getNativeByTNode(parentTNode, lView);
    }
    return null;
}
/**
 * Tree shakable boundary for `getInsertInFrontOfRNodeWithI18n` function.
 *
 * This function will only be set if i18n code runs.
 */
let _getInsertInFrontOfRNodeWithI18n = getInsertInFrontOfRNodeWithNoI18n;
/**
 * Tree shakable boundary for `processI18nInsertBefore` function.
 *
 * This function will only be set if i18n code runs.
 */
let _processI18nInsertBefore;
function setI18nHandling(getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore) {
    _getInsertInFrontOfRNodeWithI18n = getInsertInFrontOfRNodeWithI18n;
    _processI18nInsertBefore = processI18nInsertBefore;
}
/**
 * Appends the `child` native node (or a collection of nodes) to the `parent`.
 *
 * @param tView The `TView' to be appended
 * @param lView The current LView
 * @param childRNode The native child (or children) that should be appended
 * @param childTNode The TNode of the child element
 */
function appendChild(tView, lView, childRNode, childTNode) {
    const parentRNode = getParentRElement(tView, childTNode, lView);
    const renderer = lView[RENDERER];
    const parentTNode = childTNode.parent || lView[T_HOST];
    const anchorNode = getInsertInFrontOfRNode(parentTNode, childTNode, lView);
    if (parentRNode != null) {
        if (Array.isArray(childRNode)) {
            for (let i = 0; i < childRNode.length; i++) {
                nativeAppendOrInsertBefore(renderer, parentRNode, childRNode[i], anchorNode, false);
            }
        }
        else {
            nativeAppendOrInsertBefore(renderer, parentRNode, childRNode, anchorNode, false);
        }
    }
    _processI18nInsertBefore !== undefined &&
        _processI18nInsertBefore(renderer, childTNode, lView, childRNode, parentRNode);
}
/**
 * Returns the first native node for a given LView, starting from the provided TNode.
 *
 * Native nodes are returned in the order in which those appear in the native tree (DOM).
 */
function getFirstNativeNode(lView, tNode) {
    if (tNode !== null) {
        ngDevMode &&
            assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ |
                12 /* TNodeType.AnyContainer */ |
                32 /* TNodeType.Icu */ |
                16 /* TNodeType.Projection */ |
                128 /* TNodeType.LetDeclaration */);
        const tNodeType = tNode.type;
        if (tNodeType & 3 /* TNodeType.AnyRNode */) {
            return getNativeByTNode(tNode, lView);
        }
        else if (tNodeType & 4 /* TNodeType.Container */) {
            return getBeforeNodeForView(-1, lView[tNode.index]);
        }
        else if (tNodeType & 8 /* TNodeType.ElementContainer */) {
            const elIcuContainerChild = tNode.child;
            if (elIcuContainerChild !== null) {
                return getFirstNativeNode(lView, elIcuContainerChild);
            }
            else {
                const rNodeOrLContainer = lView[tNode.index];
                if (isLContainer(rNodeOrLContainer)) {
                    return getBeforeNodeForView(-1, rNodeOrLContainer);
                }
                else {
                    return unwrapRNode(rNodeOrLContainer);
                }
            }
        }
        else if (tNodeType & 128 /* TNodeType.LetDeclaration */) {
            return getFirstNativeNode(lView, tNode.next);
        }
        else if (tNodeType & 32 /* TNodeType.Icu */) {
            let nextRNode = icuContainerIterate(tNode, lView);
            let rNode = nextRNode();
            // If the ICU container has no nodes, than we use the ICU anchor as the node.
            return rNode || unwrapRNode(lView[tNode.index]);
        }
        else {
            const projectionNodes = getProjectionNodes(lView, tNode);
            if (projectionNodes !== null) {
                if (Array.isArray(projectionNodes)) {
                    return projectionNodes[0];
                }
                const parentView = getLViewParent(lView[DECLARATION_COMPONENT_VIEW]);
                ngDevMode && assertParentView(parentView);
                return getFirstNativeNode(parentView, projectionNodes);
            }
            else {
                return getFirstNativeNode(lView, tNode.next);
            }
        }
    }
    return null;
}
function getProjectionNodes(lView, tNode) {
    if (tNode !== null) {
        const componentView = lView[DECLARATION_COMPONENT_VIEW];
        const componentHost = componentView[T_HOST];
        const slotIdx = tNode.projection;
        ngDevMode && assertProjectionSlots(lView);
        return componentHost.projection[slotIdx];
    }
    return null;
}
function getBeforeNodeForView(viewIndexInContainer, lContainer) {
    const nextViewIndex = CONTAINER_HEADER_OFFSET + viewIndexInContainer + 1;
    if (nextViewIndex < lContainer.length) {
        const lView = lContainer[nextViewIndex];
        const firstTNodeOfView = lView[TVIEW].firstChild;
        if (firstTNodeOfView !== null) {
            return getFirstNativeNode(lView, firstTNodeOfView);
        }
    }
    return lContainer[NATIVE];
}
/**
 * Performs the operation of `action` on the node. Typically this involves inserting or removing
 * nodes on the LView or projection boundary.
 */
function applyNodes(renderer, action, tNode, lView, parentRElement, beforeNode, isProjection) {
    while (tNode != null) {
        ngDevMode && assertTNodeForLView(tNode, lView);
        // Let declarations don't have corresponding DOM nodes so we skip over them.
        if (tNode.type === 128 /* TNodeType.LetDeclaration */) {
            tNode = tNode.next;
            continue;
        }
        ngDevMode &&
            assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */ | 16 /* TNodeType.Projection */ | 32 /* TNodeType.Icu */);
        const rawSlotValue = lView[tNode.index];
        const tNodeType = tNode.type;
        if (isProjection) {
            if (action === 0 /* WalkTNodeTreeAction.Create */) {
                rawSlotValue && attachPatchData(unwrapRNode(rawSlotValue), lView);
                tNode.flags |= 2 /* TNodeFlags.isProjected */;
            }
        }
        if (!isDetachedByI18n(tNode)) {
            if (tNodeType & 8 /* TNodeType.ElementContainer */) {
                applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false);
                applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
            }
            else if (tNodeType & 32 /* TNodeType.Icu */) {
                const nextRNode = icuContainerIterate(tNode, lView);
                let rNode;
                while ((rNode = nextRNode())) {
                    applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
                }
                applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
            }
            else if (tNodeType & 16 /* TNodeType.Projection */) {
                applyProjectionRecursive(renderer, action, lView, tNode, parentRElement, beforeNode);
            }
            else {
                ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */);
                applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
            }
        }
        tNode = isProjection ? tNode.projectionNext : tNode.next;
    }
}
function applyView(tView, lView, renderer, action, parentRElement, beforeNode) {
    applyNodes(renderer, action, tView.firstChild, lView, parentRElement, beforeNode, false);
}
/**
 * `applyProjection` performs operation on the projection.
 *
 * Inserting a projection requires us to locate the projected nodes from the parent component. The
 * complication is that those nodes themselves could be re-projected from their parent component.
 *
 * @param tView The `TView` of `LView` which needs to be inserted, detached, destroyed
 * @param lView The `LView` which needs to be inserted, detached, destroyed.
 * @param tProjectionNode node to project
 */
function applyProjection(tView, lView, tProjectionNode) {
    const renderer = lView[RENDERER];
    const parentRNode = getParentRElement(tView, tProjectionNode, lView);
    const parentTNode = tProjectionNode.parent || lView[T_HOST];
    let beforeNode = getInsertInFrontOfRNode(parentTNode, tProjectionNode, lView);
    applyProjectionRecursive(renderer, 0 /* WalkTNodeTreeAction.Create */, lView, tProjectionNode, parentRNode, beforeNode);
}
/**
 * `applyProjectionRecursive` performs operation on the projection specified by `action` (insert,
 * detach, destroy)
 *
 * Inserting a projection requires us to locate the projected nodes from the parent component. The
 * complication is that those nodes themselves could be re-projected from their parent component.
 *
 * @param renderer Render to use
 * @param action action to perform (insert, detach, destroy)
 * @param lView The LView which needs to be inserted, detached, destroyed.
 * @param tProjectionNode node to project
 * @param parentRElement parent DOM element for insertion/removal.
 * @param beforeNode Before which node the insertions should happen.
 */
function applyProjectionRecursive(renderer, action, lView, tProjectionNode, parentRElement, beforeNode) {
    const componentLView = lView[DECLARATION_COMPONENT_VIEW];
    const componentNode = componentLView[T_HOST];
    ngDevMode &&
        assertEqual(typeof tProjectionNode.projection, 'number', 'expecting projection index');
    const nodeToProjectOrRNodes = componentNode.projection[tProjectionNode.projection];
    if (Array.isArray(nodeToProjectOrRNodes)) {
        // This should not exist, it is a bit of a hack. When we bootstrap a top level node and we
        // need to support passing projectable nodes, so we cheat and put them in the TNode
        // of the Host TView. (Yes we put instance info at the T Level). We can get away with it
        // because we know that TView is not shared and therefore it will not be a problem.
        // This should be refactored and cleaned up.
        for (let i = 0; i < nodeToProjectOrRNodes.length; i++) {
            const rNode = nodeToProjectOrRNodes[i];
            applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
        }
    }
    else {
        let nodeToProject = nodeToProjectOrRNodes;
        const projectedComponentLView = componentLView[PARENT];
        // If a parent <ng-content> is located within a skip hydration block,
        // annotate an actual node that is being projected with the same flag too.
        if (hasInSkipHydrationBlockFlag(tProjectionNode)) {
            nodeToProject.flags |= 128 /* TNodeFlags.inSkipHydrationBlock */;
        }
        applyNodes(renderer, action, nodeToProject, projectedComponentLView, parentRElement, beforeNode, true);
    }
}
/**
 * `applyContainer` performs an operation on the container and its views as specified by
 * `action` (insert, detach, destroy)
 *
 * Inserting a Container is complicated by the fact that the container may have Views which
 * themselves have containers or projections.
 *
 * @param renderer Renderer to use
 * @param action action to perform (insert, detach, destroy)
 * @param lContainer The LContainer which needs to be inserted, detached, destroyed.
 * @param parentRElement parent DOM element for insertion/removal.
 * @param beforeNode Before which node the insertions should happen.
 */
function applyContainer(renderer, action, lContainer, parentRElement, beforeNode) {
    ngDevMode && assertLContainer(lContainer);
    const anchor = lContainer[NATIVE]; // LContainer has its own before node.
    const native = unwrapRNode(lContainer);
    // An LContainer can be created dynamically on any node by injecting ViewContainerRef.
    // Asking for a ViewContainerRef on an element will result in a creation of a separate anchor
    // node (comment in the DOM) that will be different from the LContainer's host node. In this
    // particular case we need to execute action on 2 nodes:
    // - container's host node (this is done in the executeActionOnElementOrContainer)
    // - container's host node (this is done here)
    if (anchor !== native) {
        // This is very strange to me (Misko). I would expect that the native is same as anchor. I
        // don't see a reason why they should be different, but they are.
        //
        // If they are we need to process the second anchor as well.
        applyToElementOrContainer(action, renderer, parentRElement, anchor, beforeNode);
    }
    for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
        const lView = lContainer[i];
        applyView(lView[TVIEW], lView, renderer, action, parentRElement, anchor);
    }
}
/**
 * Writes class/style to element.
 *
 * @param renderer Renderer to use.
 * @param isClassBased `true` if it should be written to `class` (`false` to write to `style`)
 * @param rNode The Node to write to.
 * @param prop Property to write to. This would be the class/style name.
 * @param value Value to write. If `null`/`undefined`/`false` this is considered a remove (set/add
 *        otherwise).
 */
function applyStyling(renderer, isClassBased, rNode, prop, value) {
    if (isClassBased) {
        // We actually want JS true/false here because any truthy value should add the class
        if (!value) {
            ngDevMode && ngDevMode.rendererRemoveClass++;
            renderer.removeClass(rNode, prop);
        }
        else {
            ngDevMode && ngDevMode.rendererAddClass++;
            renderer.addClass(rNode, prop);
        }
    }
    else {
        let flags = prop.indexOf('-') === -1 ? undefined : RendererStyleFlags2.DashCase;
        if (value == null /** || value === undefined */) {
            ngDevMode && ngDevMode.rendererRemoveStyle++;
            renderer.removeStyle(rNode, prop, flags);
        }
        else {
            // A value is important if it ends with `!important`. The style
            // parser strips any semicolons at the end of the value.
            const isImportant = typeof value === 'string' ? value.endsWith('!important') : false;
            if (isImportant) {
                // !important has to be stripped from the value for it to be valid.
                value = value.slice(0, -10);
                flags |= RendererStyleFlags2.Important;
            }
            ngDevMode && ngDevMode.rendererSetStyle++;
            renderer.setStyle(rNode, prop, value, flags);
        }
    }
}

function collectNativeNodes(tView, lView, tNode, result, isProjection = false) {
    while (tNode !== null) {
        // Let declarations don't have corresponding DOM nodes so we skip over them.
        if (tNode.type === 128 /* TNodeType.LetDeclaration */) {
            tNode = isProjection ? tNode.projectionNext : tNode.next;
            continue;
        }
        ngDevMode &&
            assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */ | 16 /* TNodeType.Projection */ | 32 /* TNodeType.Icu */);
        const lNode = lView[tNode.index];
        if (lNode !== null) {
            result.push(unwrapRNode(lNode));
        }
        // A given lNode can represent either a native node or a LContainer (when it is a host of a
        // ViewContainerRef). When we find a LContainer we need to descend into it to collect root nodes
        // from the views in this container.
        if (isLContainer(lNode)) {
            collectNativeNodesInLContainer(lNode, result);
        }
        const tNodeType = tNode.type;
        if (tNodeType & 8 /* TNodeType.ElementContainer */) {
            collectNativeNodes(tView, lView, tNode.child, result);
        }
        else if (tNodeType & 32 /* TNodeType.Icu */) {
            const nextRNode = icuContainerIterate(tNode, lView);
            let rNode;
            while ((rNode = nextRNode())) {
                result.push(rNode);
            }
        }
        else if (tNodeType & 16 /* TNodeType.Projection */) {
            const nodesInSlot = getProjectionNodes(lView, tNode);
            if (Array.isArray(nodesInSlot)) {
                result.push(...nodesInSlot);
            }
            else {
                const parentView = getLViewParent(lView[DECLARATION_COMPONENT_VIEW]);
                ngDevMode && assertParentView(parentView);
                collectNativeNodes(parentView[TVIEW], parentView, nodesInSlot, result, true);
            }
        }
        tNode = isProjection ? tNode.projectionNext : tNode.next;
    }
    return result;
}
/**
 * Collects all root nodes in all views in a given LContainer.
 */
function collectNativeNodesInLContainer(lContainer, result) {
    for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
        const lViewInAContainer = lContainer[i];
        const lViewFirstChildTNode = lViewInAContainer[TVIEW].firstChild;
        if (lViewFirstChildTNode !== null) {
            collectNativeNodes(lViewInAContainer[TVIEW], lViewInAContainer, lViewFirstChildTNode, result);
        }
    }
    // When an LContainer is created, the anchor (comment) node is:
    // - (1) either reused in case of an ElementContainer (<ng-container>)
    // - (2) or a new comment node is created
    // In the first case, the anchor comment node would be added to the final
    // list by the code in the `collectNativeNodes` function
    // (see the `result.push(unwrapRNode(lNode))` line), but the second
    // case requires extra handling: the anchor node needs to be added to the
    // final list manually. See additional information in the `createAnchorNode`
    // function in the `view_container_ref.ts`.
    //
    // In the first case, the same reference would be stored in the `NATIVE`
    // and `HOST` slots in an LContainer. Otherwise, this is the second case and
    // we should add an element to the final list.
    if (lContainer[NATIVE] !== lContainer[HOST]) {
        result.push(lContainer[NATIVE]);
    }
}

function addAfterRenderSequencesForView(lView) {
    if (lView[AFTER_RENDER_SEQUENCES_TO_ADD] !== null) {
        for (const sequence of lView[AFTER_RENDER_SEQUENCES_TO_ADD]) {
            sequence.impl.addSequence(sequence);
        }
        lView[AFTER_RENDER_SEQUENCES_TO_ADD].length = 0;
    }
}

let freeConsumers = [];
/**
 * Create a new template consumer pointing at the specified LView.
 * Sometimes, a previously created consumer may be reused, in order to save on allocations. In that
 * case, the LView will be updated.
 */
function getOrBorrowReactiveLViewConsumer(lView) {
    return lView[REACTIVE_TEMPLATE_CONSUMER] ?? borrowReactiveLViewConsumer(lView);
}
function borrowReactiveLViewConsumer(lView) {
    const consumer = freeConsumers.pop() ?? Object.create(REACTIVE_LVIEW_CONSUMER_NODE);
    consumer.lView = lView;
    return consumer;
}
function maybeReturnReactiveLViewConsumer(consumer) {
    if (consumer.lView[REACTIVE_TEMPLATE_CONSUMER] === consumer) {
        // The consumer got committed.
        return;
    }
    consumer.lView = null;
    freeConsumers.push(consumer);
}
const REACTIVE_LVIEW_CONSUMER_NODE = {
    ...REACTIVE_NODE,
    consumerIsAlwaysLive: true,
    kind: 'template',
    consumerMarkedDirty: (node) => {
        markAncestorsForTraversal(node.lView);
    },
    consumerOnSignalRead() {
        this.lView[REACTIVE_TEMPLATE_CONSUMER] = this;
    },
};
/**
 * Creates a temporary consumer for use with `LView`s that should not have consumers.
 * If the LView already has a consumer, returns the existing one instead.
 *
 * This is necessary because some APIs may cause change detection directly on an LView
 * that we do not want to have a consumer (Embedded views today). As a result, there
 * would be no active consumer from running change detection on its host component
 * and any signals in the LView template would be untracked. Instead, we create
 * this temporary consumer that marks the first parent that _should_ have a consumer
 * for refresh. Once change detection runs as part of that refresh, we throw away
 * this consumer because its signals will then be tracked by the parent's consumer.
 */
function getOrCreateTemporaryConsumer(lView) {
    const consumer = lView[REACTIVE_TEMPLATE_CONSUMER] ?? Object.create(TEMPORARY_CONSUMER_NODE);
    consumer.lView = lView;
    return consumer;
}
const TEMPORARY_CONSUMER_NODE = {
    ...REACTIVE_NODE,
    consumerIsAlwaysLive: true,
    kind: 'template',
    consumerMarkedDirty: (node) => {
        let parent = getLViewParent(node.lView);
        while (parent && !viewShouldHaveReactiveConsumer(parent[TVIEW])) {
            parent = getLViewParent(parent);
        }
        if (!parent) {
            // If we can't find an appropriate parent that should have a consumer, we
            // don't have a way of appropriately refreshing this LView as part of application synchronization.
            return;
        }
        markViewForRefresh(parent);
    },
    consumerOnSignalRead() {
        this.lView[REACTIVE_TEMPLATE_CONSUMER] = this;
    },
};
/**
 * Indicates if the view should get its own reactive consumer node.
 *
 * In the current design, all embedded views share a consumer with the component view. This allows
 * us to refresh at the component level rather than at a per-view level. In addition, root views get
 * their own reactive node because root component will have a host view that executes the
 * component's host bindings. This needs to be tracked in a consumer as well.
 *
 * To get a more granular change detection than per-component, all we would just need to update the
 * condition here so that a given view gets a reactive consumer which can become dirty independently
 * from its parent component. For example embedded views for signal components could be created with
 * a new type "SignalEmbeddedView" and the condition here wouldn't even need updating in order to
 * get granular per-view change detection for signal components.
 */
function viewShouldHaveReactiveConsumer(tView) {
    return tView.type !== 2 /* TViewType.Embedded */;
}

function runEffectsInView(view) {
    if (view[EFFECTS] === null) {
        return;
    }
    // Since effects can make other effects dirty, we flush them in a loop until there are no more to
    // flush.
    let tryFlushEffects = true;
    while (tryFlushEffects) {
        let foundDirtyEffect = false;
        for (const effect of view[EFFECTS]) {
            if (!effect.dirty) {
                continue;
            }
            foundDirtyEffect = true;
            // `runEffectsInView` is called during change detection, and therefore runs
            // in the Angular zone if it's available.
            if (effect.zone === null || Zone.current === effect.zone) {
                effect.run();
            }
            else {
                effect.zone.run(() => effect.run());
            }
        }
        // Check if we need to continue flushing. If we didn't find any dirty effects, then there's
        // no need to loop back. Otherwise, check the view to see if it was marked for traversal
        // again. If so, there's a chance that one of the effects we ran caused another effect to
        // become dirty.
        tryFlushEffects = foundDirtyEffect && !!(view[FLAGS] & 8192 /* LViewFlags.HasChildViewsToRefresh */);
    }
}

/**
 * The maximum number of times the change detection traversal will rerun before throwing an error.
 */
const MAXIMUM_REFRESH_RERUNS$1 = 100;
function detectChangesInternal(lView, notifyErrorHandler = true, mode = 0 /* ChangeDetectionMode.Global */) {
    const environment = lView[ENVIRONMENT];
    const rendererFactory = environment.rendererFactory;
    // Check no changes mode is a dev only mode used to verify that bindings have not changed
    // since they were assigned. We do not want to invoke renderer factory functions in that mode
    // to avoid any possible side-effects.
    const checkNoChangesMode = !!ngDevMode && isInCheckNoChangesMode();
    if (!checkNoChangesMode) {
        rendererFactory.begin?.();
    }
    try {
        detectChangesInViewWhileDirty(lView, mode);
    }
    catch (error) {
        if (notifyErrorHandler) {
            handleError$1(lView, error);
        }
        throw error;
    }
    finally {
        if (!checkNoChangesMode) {
            rendererFactory.end?.();
        }
    }
}
function detectChangesInViewWhileDirty(lView, mode) {
    const lastIsRefreshingViewsValue = isRefreshingViews();
    try {
        setIsRefreshingViews(true);
        detectChangesInView(lView, mode);
        // We don't need or want to do any looping when in exhaustive checkNoChanges because we
        // already traverse all the views and nothing should change so we shouldn't have to do
        // another pass to pick up new changes.
        if (ngDevMode && isExhaustiveCheckNoChanges()) {
            return;
        }
        let retries = 0;
        // If after running change detection, this view still needs to be refreshed or there are
        // descendants views that need to be refreshed due to re-dirtying during the change detection
        // run, detect changes on the view again. We run change detection in `Targeted` mode to only
        // refresh views with the `RefreshView` flag.
        while (requiresRefreshOrTraversal(lView)) {
            if (retries === MAXIMUM_REFRESH_RERUNS$1) {
                throw new RuntimeError(103 /* RuntimeErrorCode.INFINITE_CHANGE_DETECTION */, ngDevMode &&
                    'Infinite change detection while trying to refresh views. ' +
                        'There may be components which each cause the other to require a refresh, ' +
                        'causing an infinite loop.');
            }
            retries++;
            // Even if this view is detached, we still detect changes in targeted mode because this was
            // the root of the change detection run.
            detectChangesInView(lView, 1 /* ChangeDetectionMode.Targeted */);
        }
    }
    finally {
        // restore state to what it was before entering this change detection loop
        setIsRefreshingViews(lastIsRefreshingViewsValue);
    }
}
function checkNoChangesInternal(lView, mode, notifyErrorHandler = true) {
    setIsInCheckNoChangesMode(mode);
    try {
        detectChangesInternal(lView, notifyErrorHandler);
    }
    finally {
        setIsInCheckNoChangesMode(CheckNoChangesMode.Off);
    }
}
/**
 * Processes a view in update mode. This includes a number of steps in a specific order:
 * - executing a template function in update mode;
 * - executing hooks;
 * - refreshing queries;
 * - setting host bindings;
 * - refreshing child (embedded and component) views.
 */
function refreshView(tView, lView, templateFn, context) {
    ngDevMode && assertEqual(isCreationMode(lView), false, 'Should be run in update mode');
    if (isDestroyed(lView))
        return;
    const flags = lView[FLAGS];
    // Check no changes mode is a dev only mode used to verify that bindings have not changed
    // since they were assigned. We do not want to execute lifecycle hooks in that mode.
    const isInCheckNoChangesPass = ngDevMode && isInCheckNoChangesMode();
    const isInExhaustiveCheckNoChangesPass = ngDevMode && isExhaustiveCheckNoChanges();
    // Start component reactive context
    // - We might already be in a reactive context if this is an embedded view of the host.
    // - We might be descending into a view that needs a consumer.
    enterView(lView);
    let returnConsumerToPool = true;
    let prevConsumer = null;
    let currentConsumer = null;
    if (!isInCheckNoChangesPass) {
        if (viewShouldHaveReactiveConsumer(tView)) {
            currentConsumer = getOrBorrowReactiveLViewConsumer(lView);
            prevConsumer = consumerBeforeComputation(currentConsumer);
        }
        else if (getActiveConsumer() === null) {
            // If the current view should not have a reactive consumer but we don't have an active consumer,
            // we still need to create a temporary consumer to track any signal reads in this template.
            // This is a rare case that can happen with `viewContainerRef.createEmbeddedView(...).detectChanges()`.
            // This temporary consumer marks the first parent that _should_ have a consumer for refresh.
            // Once that refresh happens, the signals will be tracked in the parent consumer and we can destroy
            // the temporary one.
            returnConsumerToPool = false;
            currentConsumer = getOrCreateTemporaryConsumer(lView);
            prevConsumer = consumerBeforeComputation(currentConsumer);
        }
        else if (lView[REACTIVE_TEMPLATE_CONSUMER]) {
            consumerDestroy(lView[REACTIVE_TEMPLATE_CONSUMER]);
            lView[REACTIVE_TEMPLATE_CONSUMER] = null;
        }
    }
    try {
        resetPreOrderHookFlags(lView);
        setBindingIndex(tView.bindingStartIndex);
        if (templateFn !== null) {
            executeTemplate(tView, lView, templateFn, 2 /* RenderFlags.Update */, context);
        }
        const hooksInitPhaseCompleted = (flags & 3 /* LViewFlags.InitPhaseStateMask */) === 3 /* InitPhaseState.InitPhaseCompleted */;
        // execute pre-order hooks (OnInit, OnChanges, DoCheck)
        // PERF WARNING: do NOT extract this to a separate function without running benchmarks
        if (!isInCheckNoChangesPass) {
            if (hooksInitPhaseCompleted) {
                const preOrderCheckHooks = tView.preOrderCheckHooks;
                if (preOrderCheckHooks !== null) {
                    executeCheckHooks(lView, preOrderCheckHooks, null);
                }
            }
            else {
                const preOrderHooks = tView.preOrderHooks;
                if (preOrderHooks !== null) {
                    executeInitAndCheckHooks(lView, preOrderHooks, 0 /* InitPhaseState.OnInitHooksToBeRun */, null);
                }
                incrementInitPhaseFlags(lView, 0 /* InitPhaseState.OnInitHooksToBeRun */);
            }
        }
        // We do not need to mark transplanted views for refresh when doing exhaustive checks
        // because all views will be reached anyways during the traversal.
        if (!isInExhaustiveCheckNoChangesPass) {
            // First mark transplanted views that are declared in this lView as needing a refresh at their
            // insertion points. This is needed to avoid the situation where the template is defined in this
            // `LView` but its declaration appears after the insertion component.
            markTransplantedViewsForRefresh(lView);
        }
        runEffectsInView(lView);
        detectChangesInEmbeddedViews(lView, 0 /* ChangeDetectionMode.Global */);
        // Content query results must be refreshed before content hooks are called.
        if (tView.contentQueries !== null) {
            refreshContentQueries(tView, lView);
        }
        // execute content hooks (AfterContentInit, AfterContentChecked)
        // PERF WARNING: do NOT extract this to a separate function without running benchmarks
        if (!isInCheckNoChangesPass) {
            if (hooksInitPhaseCompleted) {
                const contentCheckHooks = tView.contentCheckHooks;
                if (contentCheckHooks !== null) {
                    executeCheckHooks(lView, contentCheckHooks);
                }
            }
            else {
                const contentHooks = tView.contentHooks;
                if (contentHooks !== null) {
                    executeInitAndCheckHooks(lView, contentHooks, 1 /* InitPhaseState.AfterContentInitHooksToBeRun */);
                }
                incrementInitPhaseFlags(lView, 1 /* InitPhaseState.AfterContentInitHooksToBeRun */);
            }
        }
        processHostBindingOpCodes(tView, lView);
        // Refresh child component views.
        const components = tView.components;
        if (components !== null) {
            detectChangesInChildComponents(lView, components, 0 /* ChangeDetectionMode.Global */);
        }
        // View queries must execute after refreshing child components because a template in this view
        // could be inserted in a child component. If the view query executes before child component
        // refresh, the template might not yet be inserted.
        const viewQuery = tView.viewQuery;
        if (viewQuery !== null) {
            executeViewQueryFn(2 /* RenderFlags.Update */, viewQuery, context);
        }
        // execute view hooks (AfterViewInit, AfterViewChecked)
        // PERF WARNING: do NOT extract this to a separate function without running benchmarks
        if (!isInCheckNoChangesPass) {
            if (hooksInitPhaseCompleted) {
                const viewCheckHooks = tView.viewCheckHooks;
                if (viewCheckHooks !== null) {
                    executeCheckHooks(lView, viewCheckHooks);
                }
            }
            else {
                const viewHooks = tView.viewHooks;
                if (viewHooks !== null) {
                    executeInitAndCheckHooks(lView, viewHooks, 2 /* InitPhaseState.AfterViewInitHooksToBeRun */);
                }
                incrementInitPhaseFlags(lView, 2 /* InitPhaseState.AfterViewInitHooksToBeRun */);
            }
        }
        if (tView.firstUpdatePass === true) {
            // We need to make sure that we only flip the flag on successful `refreshView` only
            // Don't do this in `finally` block.
            // If we did this in `finally` block then an exception could block the execution of styling
            // instructions which in turn would be unable to insert themselves into the styling linked
            // list. The result of this would be that if the exception would not be throw on subsequent CD
            // the styling would be unable to process it data and reflect to the DOM.
            tView.firstUpdatePass = false;
        }
        // Schedule any effects that are waiting on the update pass of this view.
        if (lView[EFFECTS_TO_SCHEDULE]) {
            for (const notifyEffect of lView[EFFECTS_TO_SCHEDULE]) {
                notifyEffect();
            }
            // Once they've been run, we can drop the array.
            lView[EFFECTS_TO_SCHEDULE] = null;
        }
        // Do not reset the dirty state when running in check no changes mode. We don't want components
        // to behave differently depending on whether check no changes is enabled or not. For example:
        // Marking an OnPush component as dirty from within the `ngAfterViewInit` hook in order to
        // refresh a `NgClass` binding should work. If we would reset the dirty state in the check
        // no changes cycle, the component would be not be dirty for the next update pass. This would
        // be different in production mode where the component dirty state is not reset.
        if (!isInCheckNoChangesPass) {
            addAfterRenderSequencesForView(lView);
            lView[FLAGS] &= ~(64 /* LViewFlags.Dirty */ | 8 /* LViewFlags.FirstLViewPass */);
        }
    }
    catch (e) {
        if (!isInCheckNoChangesPass) {
            // If refreshing a view causes an error, we need to remark the ancestors as needing traversal
            // because the error might have caused a situation where views below the current location are
            // dirty but will be unreachable because the "has dirty children" flag in the ancestors has been
            // cleared during change detection and we failed to run to completion.
            markAncestorsForTraversal(lView);
        }
        throw e;
    }
    finally {
        if (currentConsumer !== null) {
            consumerAfterComputation(currentConsumer, prevConsumer);
            if (returnConsumerToPool) {
                maybeReturnReactiveLViewConsumer(currentConsumer);
            }
        }
        leaveView();
    }
}
/**
 * Goes over embedded views (ones created through ViewContainerRef APIs) and refreshes
 * them by executing an associated template function.
 */
function detectChangesInEmbeddedViews(lView, mode) {
    for (let lContainer = getFirstLContainer(lView); lContainer !== null; lContainer = getNextLContainer(lContainer)) {
        for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
            const embeddedLView = lContainer[i];
            detectChangesInViewIfAttached(embeddedLView, mode);
        }
    }
}
/**
 * Mark transplanted views as needing to be refreshed at their attachment points.
 *
 * @param lView The `LView` that may have transplanted views.
 */
function markTransplantedViewsForRefresh(lView) {
    for (let lContainer = getFirstLContainer(lView); lContainer !== null; lContainer = getNextLContainer(lContainer)) {
        if (!(lContainer[FLAGS] & 2 /* LContainerFlags.HasTransplantedViews */))
            continue;
        const movedViews = lContainer[MOVED_VIEWS];
        ngDevMode && assertDefined(movedViews, 'Transplanted View flags set but missing MOVED_VIEWS');
        for (let i = 0; i < movedViews.length; i++) {
            const movedLView = movedViews[i];
            markViewForRefresh(movedLView);
        }
    }
}
/**
 * Detects changes in a component by entering the component view and processing its bindings,
 * queries, etc. if it is CheckAlways, OnPush and Dirty, etc.
 *
 * @param componentHostIdx  Element index in LView[] (adjusted for HEADER_OFFSET)
 */
function detectChangesInComponent(hostLView, componentHostIdx, mode) {
    ngDevMode && assertEqual(isCreationMode(hostLView), false, 'Should be run in update mode');
    profiler(18 /* ProfilerEvent.ComponentStart */);
    const componentView = getComponentLViewByIndex(componentHostIdx, hostLView);
    detectChangesInViewIfAttached(componentView, mode);
    profiler(19 /* ProfilerEvent.ComponentEnd */, componentView[CONTEXT]);
}
/**
 * Visits a view as part of change detection traversal.
 *
 * If the view is detached, no additional traversal happens.
 */
function detectChangesInViewIfAttached(lView, mode) {
    if (!viewAttachedToChangeDetector(lView)) {
        return;
    }
    detectChangesInView(lView, mode);
}
/**
 * Visits a view as part of change detection traversal.
 *
 * The view is refreshed if:
 * - If the view is CheckAlways or Dirty and ChangeDetectionMode is `Global`
 * - If the view has the `RefreshView` flag
 *
 * The view is not refreshed, but descendants are traversed in `ChangeDetectionMode.Targeted` if the
 * view HasChildViewsToRefresh flag is set.
 */
function detectChangesInView(lView, mode) {
    const isInCheckNoChangesPass = ngDevMode && isInCheckNoChangesMode();
    const tView = lView[TVIEW];
    const flags = lView[FLAGS];
    const consumer = lView[REACTIVE_TEMPLATE_CONSUMER];
    // Refresh CheckAlways views in Global mode.
    let shouldRefreshView = !!(mode === 0 /* ChangeDetectionMode.Global */ && flags & 16 /* LViewFlags.CheckAlways */);
    // Refresh Dirty views in Global mode, as long as we're not in checkNoChanges.
    // CheckNoChanges never worked with `OnPush` components because the `Dirty` flag was
    // cleared before checkNoChanges ran. Because there is now a loop for to check for
    // backwards views, it gives an opportunity for `OnPush` components to be marked `Dirty`
    // before the CheckNoChanges pass. We don't want existing errors that are hidden by the
    // current CheckNoChanges bug to surface when making unrelated changes.
    shouldRefreshView ||= !!(flags & 64 /* LViewFlags.Dirty */ &&
        mode === 0 /* ChangeDetectionMode.Global */ &&
        !isInCheckNoChangesPass);
    // Always refresh views marked for refresh, regardless of mode.
    shouldRefreshView ||= !!(flags & 1024 /* LViewFlags.RefreshView */);
    // Refresh views when they have a dirty reactive consumer, regardless of mode.
    shouldRefreshView ||= !!(consumer?.dirty && consumerPollProducersForChange(consumer));
    shouldRefreshView ||= !!(ngDevMode && isExhaustiveCheckNoChanges());
    // Mark the Flags and `ReactiveNode` as not dirty before refreshing the component, so that they
    // can be re-dirtied during the refresh process.
    if (consumer) {
        consumer.dirty = false;
    }
    lView[FLAGS] &= -9217;
    if (shouldRefreshView) {
        refreshView(tView, lView, tView.template, lView[CONTEXT]);
    }
    else if (flags & 8192 /* LViewFlags.HasChildViewsToRefresh */) {
        if (!isInCheckNoChangesPass) {
            runEffectsInView(lView);
        }
        detectChangesInEmbeddedViews(lView, 1 /* ChangeDetectionMode.Targeted */);
        const components = tView.components;
        if (components !== null) {
            detectChangesInChildComponents(lView, components, 1 /* ChangeDetectionMode.Targeted */);
        }
        if (!isInCheckNoChangesPass) {
            addAfterRenderSequencesForView(lView);
        }
    }
}
/** Refreshes child components in the current view (update mode). */
function detectChangesInChildComponents(hostLView, components, mode) {
    for (let i = 0; i < components.length; i++) {
        detectChangesInComponent(hostLView, components[i], mode);
    }
}
/**
 * Invoke `HostBindingsFunction`s for view.
 *
 * This methods executes `TView.hostBindingOpCodes`. It is used to execute the
 * `HostBindingsFunction`s associated with the current `LView`.
 *
 * @param tView Current `TView`.
 * @param lView Current `LView`.
 */
function processHostBindingOpCodes(tView, lView) {
    const hostBindingOpCodes = tView.hostBindingOpCodes;
    if (hostBindingOpCodes === null)
        return;
    try {
        for (let i = 0; i < hostBindingOpCodes.length; i++) {
            const opCode = hostBindingOpCodes[i];
            if (opCode < 0) {
                // Negative numbers are element indexes.
                setSelectedIndex(~opCode);
            }
            else {
                // Positive numbers are NumberTuple which store bindingRootIndex and directiveIndex.
                const directiveIdx = opCode;
                const bindingRootIndx = hostBindingOpCodes[++i];
                const hostBindingFn = hostBindingOpCodes[++i];
                setBindingRootForHostBindings(bindingRootIndx, directiveIdx);
                const context = lView[directiveIdx];
                profiler(24 /* ProfilerEvent.HostBindingsUpdateStart */, context);
                hostBindingFn(2 /* RenderFlags.Update */, context);
                profiler(25 /* ProfilerEvent.HostBindingsUpdateEnd */, context);
            }
        }
    }
    finally {
        setSelectedIndex(-1);
    }
}

/**
 * Marks current view and all ancestors dirty.
 *
 * Returns the root view because it is found as a byproduct of marking the view tree
 * dirty, and can be used by methods that consume markViewDirty() to easily schedule
 * change detection. Otherwise, such methods would need to traverse up the view tree
 * an additional time to get the root view and schedule a tick on it.
 *
 * @param lView The starting LView to mark dirty
 * @returns the root LView
 */
function markViewDirty(lView, source) {
    const dirtyBitsToUse = isRefreshingViews()
        ? // When we are actively refreshing views, we only use the `Dirty` bit to mark a view
            64 /* LViewFlags.Dirty */
        : // When we are not actively refreshing a view tree, it is absolutely
            // valid to update state and mark views dirty. We use the `RefreshView` flag in this
            // case to allow synchronously rerunning change detection. This applies today to
            // afterRender hooks as well as animation listeners which execute after detecting
            // changes in a view when the render factory flushes.
            1024 /* LViewFlags.RefreshView */ | 64 /* LViewFlags.Dirty */;
    lView[ENVIRONMENT].changeDetectionScheduler?.notify(source);
    while (lView) {
        lView[FLAGS] |= dirtyBitsToUse;
        const    parent = getLViewParent(lView);
        // Stop traversing up as soon as you find a root view that wasn't attached to any container
        if (isRootView(lView) && !parent) {
            return lView;
        }
        // continue otherwise
        lView = parent;
    }
    return null;
}

/**
 * Creates a LContainer, either from a container instruction, or for a ViewContainerRef.
 *
 * @param hostNative The host element for the LContainer
 * @param hostTNode The host TNode for the LContainer
 * @param currentView The parent view of the LContainer
 * @param native The native comment element
 * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case
 * @returns LContainer
 */
function createLContainer(hostNative, currentView, native, tNode) {
    ngDevMode && assertLView(currentView);
    const lContainer = [
        hostNative, // host native
        true, // Boolean `true` in this position signifies that this is an `LContainer`
        0, // flags
        currentView, // parent
        null, // next
        tNode, // t_host
        null, // dehydrated views
        native, // native,
        null, // view refs
        null, // moved views
    ];
    ngDevMode &&
        assertEqual(lContainer.length, CONTAINER_HEADER_OFFSET, 'Should allocate correct number of slots for LContainer header.');
    return lContainer;
}
function getLViewFromLContainer(lContainer, index) {
    const adjustedIndex = CONTAINER_HEADER_OFFSET + index;
    // avoid reading past the array boundaries
    if (adjustedIndex < lContainer.length) {
        const lView = lContainer[adjustedIndex];
        ngDevMode && assertLView(lView);
        return lView;
    }
    return undefined;
}
function addLViewToLContainer(lContainer, lView, index, addToDOM = true) {
    const tView = lView[TVIEW];
    // Insert into the view tree so the new view can be change-detected
    insertView(tView, lView, lContainer, index);
    // Insert elements that belong to this view into the DOM tree
    if (addToDOM) {
        const beforeNode = getBeforeNodeForView(index, lContainer);
        const renderer = lView[RENDERER];
        const parentRNode = renderer.parentNode(lContainer[NATIVE]);
        if (parentRNode !== null) {
            addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode);
        }
    }
    // When in hydration mode, reset the pointer to the first child in
    // the dehydrated view. This indicates that the view was hydrated and
    // further attaching/detaching should work with this view as normal.
    const hydrationInfo = lView[HYDRATION];
    if (hydrationInfo !== null && hydrationInfo.firstChild !== null) {
        hydrationInfo.firstChild = null;
    }
}
function removeLViewFromLContainer(lContainer, index) {
    const lView = detachView(lContainer, index);
    if (lView !== undefined) {
        destroyLView(lView[TVIEW], lView);
    }
    return lView;
}
/**
 * Detaches a view from a container.
 *
 * This method removes the view from the container's array of active views. It also
 * removes the view's elements from the DOM.
 *
 * @param lContainer The container from which to detach a view
 * @param removeIndex The index of the view to detach
 * @returns Detached LView instance.
 */
function detachView(lContainer, removeIndex) {
    if (lContainer.length <= CONTAINER_HEADER_OFFSET)
        return;
    const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex;
    const viewToDetach = lContainer[indexInContainer];
    if (viewToDetach) {
        const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER];
        if (declarationLContainer !== null && declarationLContainer !== lContainer) {
            detachMovedView(declarationLContainer, viewToDetach);
        }
        if (removeIndex > 0) {
            lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT];
        }
        const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex);
        removeViewFromDOM(viewToDetach[TVIEW], viewToDetach);
        // notify query that a view has been removed
        const lQueries = removedLView[QUERIES];
        if (lQueries !== null) {
            lQueries.detachView(removedLView[TVIEW]);
        }
        viewToDetach[PARENT] = null;
        viewToDetach[NEXT] = null;
        // Unsets the attached flag
        viewToDetach[FLAGS] &= -129 /* LViewFlags.Attached */;
    }
    return viewToDetach;
}
/**
 * Inserts a view into a container.
 *
 * This adds the view to the container's array of active views in the correct
 * position. It also adds the view's elements to the DOM if the container isn't a
 * root node of another view (in that case, the view's elements will be added when
 * the container's parent view is added later).
 *
 * @param tView The `TView' of the `LView` to insert
 * @param lView The view to insert
 * @param lContainer The container into which the view should be inserted
 * @param index Which index in the container to insert the child view into
 */
function insertView(tView, lView, lContainer, index) {
    ngDevMode && assertLView(lView);
    ngDevMode && assertLContainer(lContainer);
    const indexInContainer = CONTAINER_HEADER_OFFSET + index;
    const containerLength = lContainer.length;
    if (index > 0) {
        // This is a new view, we need to add it to the children.
        lContainer[indexInContainer - 1][NEXT] = lView;
    }
    if (index < containerLength - CONTAINER_HEADER_OFFSET) {
        lView[NEXT] = lContainer[indexInContainer];
        addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView);
    }
    else {
        lContainer.push(lView);
        lView[NEXT] = null;
    }
    lView[PARENT] = lContainer;
    // track views where declaration and insertion points are different
    const declarationLContainer = lView[DECLARATION_LCONTAINER];
    if (declarationLContainer !== null && lContainer !== declarationLContainer) {
        trackMovedView(declarationLContainer, lView);
    }
    // notify query that a new view has been added
    const lQueries = lView[QUERIES];
    if (lQueries !== null) {
        lQueries.insertView(tView);
    }
    updateAncestorTraversalFlagsOnAttach(lView);
    // Sets the attached flag
    lView[FLAGS] |= 128 /* LViewFlags.Attached */;
}
/**
 * Track views created from the declaration container (TemplateRef) and inserted into a
 * different LContainer or attached directly to ApplicationRef.
 */
function trackMovedView(declarationContainer, lView) {
    ngDevMode && assertDefined(lView, 'LView required');
    ngDevMode && assertLContainer(declarationContainer);
    const movedViews = declarationContainer[MOVED_VIEWS];
    const parent = lView[PARENT];
    ngDevMode && assertDefined(parent, 'missing parent');
    if (isLView(parent)) {
        declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
    }
    else {
        const insertedComponentLView = parent[PARENT][DECLARATION_COMPONENT_VIEW];
        ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView');
        const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW];
        ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView');
        if (declaredComponentLView !== insertedComponentLView) {
            // At this point the declaration-component is not same as insertion-component; this means that
            // this is a transplanted view. Mark the declared lView as having transplanted views so that
            // those views can participate in CD.
            declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
        }
    }
    if (movedViews === null) {
        declarationContainer[MOVED_VIEWS] = [lView];
    }
    else {
        movedViews.push(lView);
    }
}

let ViewRef$1 = class ViewRef {
    _lView;
    _cdRefInjectingView;
    notifyErrorHandler;
    _appRef = null;
    _attachedToViewContainer = false;
    get rootNodes() {
        const lView = this._lView;
        const tView = lView[TVIEW];
        return collectNativeNodes(tView, lView, tView.firstChild, []);
    }
    constructor(
    /**
     * This represents `LView` associated with the component when ViewRef is a ChangeDetectorRef.
     *
     * When ViewRef is created for a dynamic component, this also represents the `LView` for the
     * component.
     *
     * For a "regular" ViewRef created for an embedded view, this is the `LView` for the embedded
     * view.
     *
     * @internal
     */
    _lView, 
    /**
     * This represents the `LView` associated with the point where `ChangeDetectorRef` was
     * requested.
     *
     * This may be different from `_lView` if the `_cdRefInjectingView` is an embedded view.
     */
    _cdRefInjectingView, notifyErrorHandler = true) {
        this._lView = _lView;
        this._cdRefInjectingView = _cdRefInjectingView;
        this.notifyErrorHandler = notifyErrorHandler;
    }
    get context() {
        return this._lView[CONTEXT];
    }
    /**
     * @deprecated Replacing the full context object is not supported. Modify the context
     *   directly, or consider using a `Proxy` if you need to replace the full object.
     * // TODO(devversion): Remove this.
     */
    set context(value) {
        if (ngDevMode) {
            // Note: We have a warning message here because the `@deprecated` JSDoc will not be picked
            // up for assignments on the setter. We want to let users know about the deprecated usage.
            console.warn('Angular: Replacing the `context` object of an `EmbeddedViewRef` is deprecated.');
        }
        this._lView[CONTEXT] = value;
    }
    get destroyed() {
        return isDestroyed(this._lView);
    }
    destroy() {
        if (this._appRef) {
            this._appRef.detachView(this);
        }
        else if (this._attachedToViewContainer) {
            const parent = this._lView[PARENT];
            if (isLContainer(parent)) {
                const viewRefs = parent[VIEW_REFS];
                const index = viewRefs ? viewRefs.indexOf(this) : -1;
                if (index > -1) {
                    ngDevMode &&
                        assertEqual(index, parent.indexOf(this._lView) - CONTAINER_HEADER_OFFSET, 'An attached view should be in the same position within its container as its ViewRef in the VIEW_REFS array.');
                    detachView(parent, index);
                    removeFromArray(viewRefs, index);
                }
            }
            this._attachedToViewContainer = false;
        }
        destroyLView(this._lView[TVIEW], this._lView);
    }
    onDestroy(callback) {
        storeLViewOnDestroy(this._lView, callback);
    }
    /**
     * Marks a view and all of its ancestors dirty.
     *
     * This can be used to ensure an {@link ChangeDetectionStrategy#OnPush} component is
     * checked when it needs to be re-rendered but the two normal triggers haven't marked it
     * dirty (i.e. inputs haven't changed and events haven't fired in the view).
     *
     * <!-- TODO: Add a link to a chapter on OnPush components -->
     *
     * @usageNotes
     * ### Example
     *
     * ```ts
     * @Component({
     *   selector: 'app-root',
     *   template: `Number of ticks: {{numberOfTicks}}`
     *   changeDetection: ChangeDetectionStrategy.OnPush,
     * })
     * class AppComponent {
     *   numberOfTicks = 0;
     *
     *   constructor(private ref: ChangeDetectorRef) {
     *     setInterval(() => {
     *       this.numberOfTicks++;
     *       // the following is required, otherwise the view will not be updated
     *       this.ref.markForCheck();
     *     }, 1000);
     *   }
     * }
     * ```
     */
    markForCheck() {
        markViewDirty(this._cdRefInjectingView || this._lView, 4 /* NotificationSource.MarkForCheck */);
    }
    /**
     * Detaches the view from the change detection tree.
     *
     * Detached views will not be checked during change detection runs until they are
     * re-attached, even if they are dirty. `detach` can be used in combination with
     * {@link ChangeDetectorRef#detectChanges} to implement local change
     * detection checks.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
     *
     * @usageNotes
     * ### Example
     *
     * The following example defines a component with a large list of readonly data.
     * Imagine the data changes constantly, many times per second. For performance reasons,
     * we want to check and update the list every five seconds. We can do that by detaching
     * the component's change detector and doing a local check every five seconds.
     *
     * ```ts
     * class DataProvider {
     *   // in a real application the returned data will be different every time
     *   get data() {
     *     return [1,2,3,4,5];
     *   }
     * }
     *
     * @Component({
     *   selector: 'giant-list',
     *   template: `
     *     <li *ngFor="let d of dataProvider.data">Data {{d}}</li>
     *   `,
     * })
     * class GiantList {
     *   constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {
     *     ref.detach();
     *     setInterval(() => {
     *       this.ref.detectChanges();
     *     }, 5000);
     *   }
     * }
     *
     * @Component({
     *   selector: 'app',
     *   providers: [DataProvider],
     *   template: `
     *     <giant-list><giant-list>
     *   `,
     * })
     * class App {
     * }
     * ```
     */
    detach() {
        this._lView[FLAGS] &= -129 /* LViewFlags.Attached */;
    }
    /**
     * Re-attaches a view to the change detection tree.
     *
     * This can be used to re-attach views that were previously detached from the tree
     * using {@link ChangeDetectorRef#detach}. Views are attached to the tree by default.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     *
     * @usageNotes
     * ### Example
     *
     * The following example creates a component displaying `live` data. The component will detach
     * its change detector from the main change detector tree when the component's live property
     * is set to false.
     *
     * ```ts
     * class DataProvider {
     *   data = 1;
     *
     *   constructor() {
     *     setInterval(() => {
     *       this.data = this.data * 2;
     *     }, 500);
     *   }
     * }
     *
     * @Component({
     *   selector: 'live-data',
     *   inputs: ['live'],
     *   template: 'Data: {{dataProvider.data}}'
     * })
     * class LiveData {
     *   constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {}
     *
     *   set live(value) {
     *     if (value) {
     *       this.ref.reattach();
     *     } else {
     *       this.ref.detach();
     *     }
     *   }
     * }
     *
     * @Component({
     *   selector: 'app-root',
     *   providers: [DataProvider],
     *   template: `
     *     Live Update: <input type="checkbox" [(ngModel)]="live">
     *     <live-data [live]="live"><live-data>
     *   `,
     * })
     * class AppComponent {
     *   live = true;
     * }
     * ```
     */
    reattach() {
        updateAncestorTraversalFlagsOnAttach(this._lView);
        this._lView[FLAGS] |= 128 /* LViewFlags.Attached */;
    }
    /**
     * Checks the view and its children.
     *
     * This can also be used in combination with {@link ChangeDetectorRef#detach} to implement
     * local change detection checks.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
     *
     * @usageNotes
     * ### Example
     *
     * The following example defines a component with a large list of readonly data.
     * Imagine, the data changes constantly, many times per second. For performance reasons,
     * we want to check and update the list every five seconds.
     *
     * We can do that by detaching the component's change detector and doing a local change detection
     * check every five seconds.
     *
     * See {@link ChangeDetectorRef#detach} for more information.
     */
    detectChanges() {
        // Add `RefreshView` flag to ensure this view is refreshed if not already dirty.
        // `RefreshView` flag is used intentionally over `Dirty` because it gets cleared before
        // executing any of the actual refresh code while the `Dirty` flag doesn't get cleared
        // until the end of the refresh. Using `RefreshView` prevents creating a potential difference
        // in the state of the LViewFlags during template execution.
        this._lView[FLAGS] |= 1024 /* LViewFlags.RefreshView */;
        detectChangesInternal(this._lView, this.notifyErrorHandler);
    }
    /**
     * Checks the change detector and its children, and throws if any changes are detected.
     *
     * This is used in development mode to verify that running change detection doesn't
     * introduce other changes.
     */
    checkNoChanges() {
        if (ngDevMode) {
            checkNoChangesInternal(this._lView, CheckNoChangesMode.OnlyDirtyViews, this.notifyErrorHandler);
        }
    }
    attachToViewContainerRef() {
        if (this._appRef) {
            throw new RuntimeError(902 /* RuntimeErrorCode.VIEW_ALREADY_ATTACHED */, ngDevMode && 'This view is already attached directly to the ApplicationRef!');
        }
        this._attachedToViewContainer = true;
    }
    detachFromAppRef() {
        this._appRef = null;
        const isRoot = isRootView(this._lView);
        const declarationContainer = this._lView[DECLARATION_LCONTAINER];
        if (declarationContainer !== null && !isRoot) {
            detachMovedView(declarationContainer, this._lView);
        }
        detachViewFromDOM(this._lView[TVIEW], this._lView);
    }
    attachToAppRef(appRef) {
        if (this._attachedToViewContainer) {
            throw new RuntimeError(902 /* RuntimeErrorCode.VIEW_ALREADY_ATTACHED */, ngDevMode && 'This view is already attached to a ViewContainer!');
        }
        this._appRef = appRef;
        const isRoot = isRootView(this._lView);
        const declarationContainer = this._lView[DECLARATION_LCONTAINER];
        if (declarationContainer !== null && !isRoot) {
            trackMovedView(declarationContainer, this._lView);
        }
        updateAncestorTraversalFlagsOnAttach(this._lView);
    }
};
/**
 * Reports whether the given view is considered dirty according to the different marking mechanisms.
 */
function isViewDirty(view) {
    return requiresRefreshOrTraversal(view._lView) || !!(view._lView[FLAGS] & 64 /* LViewFlags.Dirty */);
}
function markForRefresh(view) {
    markViewForRefresh(view['_cdRefInjectingView'] || view._lView);
}

/**
 * Represents an embedded template that can be used to instantiate embedded views.
 * To instantiate embedded views based on a template, use the `ViewContainerRef`
 * method `createEmbeddedView()`.
 *
 * Access a `TemplateRef` instance by placing a directive on an `<ng-template>`
 * element (or directive prefixed with `*`). The `TemplateRef` for the embedded view
 * is injected into the constructor of the directive,
 * using the `TemplateRef` token.
 *
 * You can also use a `Query` to find a `TemplateRef` associated with
 * a component or a directive.
 *
 * @see {@link ViewContainerRef}
 *
 * @publicApi
 */
class TemplateRef {
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ELEMENT_ID__ = injectTemplateRef;
}
const ViewEngineTemplateRef = TemplateRef;
// TODO(alxhub): combine interface and implementation. Currently this is challenging since something
// in g3 depends on them being separate.
const R3TemplateRef = class TemplateRef extends ViewEngineTemplateRef {
    _declarationLView;
    _declarationTContainer;
    elementRef;
    constructor(_declarationLView, _declarationTContainer, elementRef) {
        super();
        this._declarationLView = _declarationLView;
        this._declarationTContainer = _declarationTContainer;
        this.elementRef = elementRef;
    }
    /**
     * Returns an `ssrId` associated with a TView, which was used to
     * create this instance of the `TemplateRef`.
     *
     * @internal
     */
    get ssrId() {
        return this._declarationTContainer.tView?.ssrId || null;
    }
    createEmbeddedView(context, injector) {
        return this.createEmbeddedViewImpl(context, injector);
    }
    /**
     * @internal
     */
    createEmbeddedViewImpl(context, injector, dehydratedView) {
        const embeddedLView = createAndRenderEmbeddedLView(this._declarationLView, this._declarationTContainer, context, { embeddedViewInjector: injector, dehydratedView });
        return new ViewRef$1(embeddedLView);
    }
};
/**
 * Creates a TemplateRef given a node.
 *
 * @returns The TemplateRef instance to use
 */
function injectTemplateRef() {
    return createTemplateRef(getCurrentTNode(), getLView());
}
/**
 * Creates a TemplateRef and stores it on the injector.
 *
 * @param hostTNode The node on which a TemplateRef is requested
 * @param hostLView The `LView` to which the node belongs
 * @returns The TemplateRef instance or null if we can't create a TemplateRef on a given node type
 */
function createTemplateRef(hostTNode, hostLView) {
    if (hostTNode.type & 4 /* TNodeType.Container */) {
        ngDevMode && assertDefined(hostTNode.tView, 'TView must be allocated');
        return new R3TemplateRef(hostLView, hostTNode, createElementRef(hostTNode, hostLView));
    }
    return null;
}

const AT_THIS_LOCATION = '<-- AT THIS LOCATION';
/**
 * Retrieves a user friendly string for a given TNodeType for use in
 * friendly error messages
 *
 * @param tNodeType
 * @returns
 */
function getFriendlyStringFromTNodeType(tNodeType) {
    switch (tNodeType) {
        case 4 /* TNodeType.Container */:
            return 'view container';
        case 2 /* TNodeType.Element */:
            return 'element';
        case 8 /* TNodeType.ElementContainer */:
            return 'ng-container';
        case 32 /* TNodeType.Icu */:
            return 'icu';
        case 64 /* TNodeType.Placeholder */:
            return 'i18n';
        case 16 /* TNodeType.Projection */:
            return 'projection';
        case 1 /* TNodeType.Text */:
            return 'text';
        case 128 /* TNodeType.LetDeclaration */:
            return '@let';
        default:
            // This should not happen as we cover all possible TNode types above.
            return '<unknown>';
    }
}
/**
 * Validates that provided nodes match during the hydration process.
 */
function validateMatchingNode(node, nodeType, tagName, lView, tNode, isViewContainerAnchor = false) {
    if (!node ||
        node.nodeType !== nodeType ||
        (node.nodeType === Node.ELEMENT_NODE &&
            node.tagName.toLowerCase() !== tagName?.toLowerCase())) {
        const expectedNode = shortRNodeDescription(nodeType, tagName, null);
        let header = `During hydration Angular expected ${expectedNode} but `;
        const hostComponentDef = getDeclarationComponentDef(lView);
        const componentClassName = hostComponentDef?.type?.name;
        const expectedDom = describeExpectedDom(lView, tNode, isViewContainerAnchor);
        const expected = `Angular expected this DOM:\n\n${expectedDom}\n\n`;
        let actual = '';
        const componentHostElement = unwrapRNode(lView[HOST]);
        if (!node) {
            // No node found during hydration.
            header += `the node was not found.\n\n`;
            // Since the node is missing, we use the closest node to attach the error to
            markRNodeAsHavingHydrationMismatch(componentHostElement, expectedDom);
        }
        else {
            const actualNode = shortRNodeDescription(node.nodeType, node.tagName ?? null, node.textContent ?? null);
            header += `found ${actualNode}.\n\n`;
            const actualDom = describeDomFromNode(node);
            actual = `Actual DOM is:\n\n${actualDom}\n\n`;
            // DevTools only report hydration issues on the component level, so we attach extra debug
            // info to a component host element to make it available to DevTools.
            markRNodeAsHavingHydrationMismatch(componentHostElement, expectedDom, actualDom);
        }
        const footer = getHydrationErrorFooter(componentClassName);
        const message = header + expected + actual + getHydrationAttributeNote() + footer;
        throw new RuntimeError(-500 /* RuntimeErrorCode.HYDRATION_NODE_MISMATCH */, message);
    }
}
/**
 * Validates that a given node has sibling nodes
 */
function validateSiblingNodeExists(node) {
    validateNodeExists(node);
    if (!node.nextSibling) {
        const header = 'During hydration Angular expected more sibling nodes to be present.\n\n';
        const actual = `Actual DOM is:\n\n${describeDomFromNode(node)}\n\n`;
        const footer = getHydrationErrorFooter();
        const message = header + actual + footer;
        markRNodeAsHavingHydrationMismatch(node, '', actual);
        throw new RuntimeError(-501 /* RuntimeErrorCode.HYDRATION_MISSING_SIBLINGS */, message);
    }
}
/**
 * Validates that a node exists or throws
 */
function validateNodeExists(node, lView = null, tNode = null) {
    if (!node) {
        const header = 'During hydration, Angular expected an element to be present at this location.\n\n';
        let expected = '';
        let footer = '';
        if (lView !== null && tNode !== null) {
            expected = describeExpectedDom(lView, tNode, false);
            footer = getHydrationErrorFooter();
            // Since the node is missing, we use the closest node to attach the error to
            markRNodeAsHavingHydrationMismatch(unwrapRNode(lView[HOST]), expected, '');
        }
        throw new RuntimeError(-502 /* RuntimeErrorCode.HYDRATION_MISSING_NODE */, `${header}${expected}\n\n${footer}`);
    }
}
/**
 * Builds the hydration error message when a node is not found
 *
 * @param lView the LView where the node exists
 * @param tNode the TNode
 */
function nodeNotFoundError(lView, tNode) {
    const header = 'During serialization, Angular was unable to find an element in the DOM:\n\n';
    const expected = `${describeExpectedDom(lView, tNode, false)}\n\n`;
    const footer = getHydrationErrorFooter();
    throw new RuntimeError(-502 /* RuntimeErrorCode.HYDRATION_MISSING_NODE */, header + expected + footer);
}
/**
 * Builds a hydration error message when a node is not found at a path location
 *
 * @param host the Host Node
 * @param path the path to the node
 */
function nodeNotFoundAtPathError(host, path) {
    const header = `During hydration Angular was unable to locate a node ` +
        `using the "${path}" path, starting from the ${describeRNode(host)} node.\n\n`;
    const footer = getHydrationErrorFooter();
    markRNodeAsHavingHydrationMismatch(host);
    throw new RuntimeError(-502 /* RuntimeErrorCode.HYDRATION_MISSING_NODE */, header + footer);
}
/**
 * Builds the hydration error message in the case that dom nodes are created outside of
 * the Angular context and are being used as projected nodes
 *
 * @param lView the LView
 * @param tNode the TNode
 * @returns an error
 */
function unsupportedProjectionOfDomNodes(rNode) {
    const header = 'During serialization, Angular detected DOM nodes ' +
        'that were created outside of Angular context and provided as projectable nodes ' +
        '(likely via `ViewContainerRef.createComponent` or `createComponent` APIs). ' +
        'Hydration is not supported for such cases, consider refactoring the code to avoid ' +
        'this pattern or using `ngSkipHydration` on the host element of the component.\n\n';
    const actual = `${describeDomFromNode(rNode)}\n\n`;
    const message = header + actual + getHydrationAttributeNote();
    return new RuntimeError(-503 /* RuntimeErrorCode.UNSUPPORTED_PROJECTION_DOM_NODES */, message);
}
/**
 * Builds the hydration error message in the case that ngSkipHydration was used on a
 * node that is not a component host element or host binding
 *
 * @param rNode the HTML Element
 * @returns an error
 */
function invalidSkipHydrationHost(rNode) {
    const header = 'The `ngSkipHydration` flag is applied on a node ' +
        "that doesn't act as a component host. Hydration can be " +
        'skipped only on per-component basis.\n\n';
    const actual = `${describeDomFromNode(rNode)}\n\n`;
    const footer = 'Please move the `ngSkipHydration` attribute to the component host element.\n\n';
    const message = header + actual + footer;
    return new RuntimeError(-504 /* RuntimeErrorCode.INVALID_SKIP_HYDRATION_HOST */, message);
}
// Stringification methods
/**
 * Stringifies a given TNode's attributes
 *
 * @param tNode a provided TNode
 * @returns string
 */
function stringifyTNodeAttrs(tNode) {
    const results = [];
    if (tNode.attrs) {
        for (let i = 0; i < tNode.attrs.length;) {
            const attrName = tNode.attrs[i++];
            // Once we reach the first flag, we know that the list of
            // attributes is over.
            if (typeof attrName == 'number') {
                break;
            }
            const attrValue = tNode.attrs[i++];
            results.push(`${attrName}="${shorten(attrValue)}"`);
        }
    }
    return results.join(' ');
}
/**
 * The list of internal attributes that should be filtered out while
 * producing an error message.
 */
const internalAttrs = new Set(['ngh', 'ng-version', 'ng-server-context']);
/**
 * Stringifies an HTML Element's attributes
 *
 * @param rNode an HTML Element
 * @returns string
 */
function stringifyRNodeAttrs(rNode) {
    const results = [];
    for (let i = 0; i < rNode.attributes.length; i++) {
        const attr = rNode.attributes[i];
        if (internalAttrs.has(attr.name))
            continue;
        results.push(`${attr.name}="${shorten(attr.value)}"`);
    }
    return results.join(' ');
}
// Methods for Describing the DOM
/**
 * Converts a tNode to a helpful readable string value for use in error messages
 *
 * @param tNode a given TNode
 * @param innerContent the content of the node
 * @returns string
 */
function describeTNode(tNode, innerContent = '…') {
    switch (tNode.type) {
        case 1 /* TNodeType.Text */:
            const content = tNode.value ? `(${tNode.value})` : '';
            return `#text${content}`;
        case 2 /* TNodeType.Element */:
            const attrs = stringifyTNodeAttrs(tNode);
            const tag = tNode.value.toLowerCase();
            return `<${tag}${attrs ? ' ' + attrs : ''}>${innerContent}</${tag}>`;
        case 8 /* TNodeType.ElementContainer */:
            return '<!-- ng-container -->';
        case 4 /* TNodeType.Container */:
            return '<!-- container -->';
        default:
            const typeAsString = getFriendlyStringFromTNodeType(tNode.type);
            return `#node(${typeAsString})`;
    }
}
/**
 * Converts an RNode to a helpful readable string value for use in error messages
 *
 * @param rNode a given RNode
 * @param innerContent the content of the node
 * @returns string
 */
function describeRNode(rNode, innerContent = '…') {
    const node = rNode;
    switch (node.nodeType) {
        case Node.ELEMENT_NODE:
            const tag = node.tagName.toLowerCase();
            const attrs = stringifyRNodeAttrs(node);
            return `<${tag}${attrs ? ' ' + attrs : ''}>${innerContent}</${tag}>`;
        case Node.TEXT_NODE:
            const content = node.textContent ? shorten(node.textContent) : '';
            return `#text${content ? `(${content})` : ''}`;
        case Node.COMMENT_NODE:
            return `<!-- ${shorten(node.textContent ?? '')} -->`;
        default:
            return `#node(${node.nodeType})`;
    }
}
/**
 * Builds the string containing the expected DOM present given the LView and TNode
 * values for a readable error message
 *
 * @param lView the lView containing the DOM
 * @param tNode the tNode
 * @param isViewContainerAnchor boolean
 * @returns string
 */
function describeExpectedDom(lView, tNode, isViewContainerAnchor) {
    const spacer = '  ';
    let content = '';
    if (tNode.prev) {
        content += spacer + '…\n';
        content += spacer + describeTNode(tNode.prev) + '\n';
    }
    else if (tNode.type && tNode.type & 12 /* TNodeType.AnyContainer */) {
        content += spacer + '…\n';
    }
    if (isViewContainerAnchor) {
        content += spacer + describeTNode(tNode) + '\n';
        content += spacer + `<!-- container -->  ${AT_THIS_LOCATION}\n`;
    }
    else {
        content += spacer + describeTNode(tNode) + `  ${AT_THIS_LOCATION}\n`;
    }
    content += spacer + '…\n';
    const parentRNode = tNode.type ? getParentRElement(lView[TVIEW], tNode, lView) : null;
    if (parentRNode) {
        content = describeRNode(parentRNode, '\n' + content);
    }
    return content;
}
/**
 * Builds the string containing the DOM present around a given RNode for a
 * readable error message
 *
 * @param node the RNode
 * @returns string
 */
function describeDomFromNode(node) {
    const spacer = '  ';
    let content = '';
    const currentNode = node;
    if (currentNode.previousSibling) {
        content += spacer + '…\n';
        content += spacer + describeRNode(currentNode.previousSibling) + '\n';
    }
    content += spacer + describeRNode(currentNode) + `  ${AT_THIS_LOCATION}\n`;
    if (node.nextSibling) {
        content += spacer + '…\n';
    }
    if (node.parentNode) {
        content = describeRNode(currentNode.parentNode, '\n' + content);
    }
    return content;
}
/**
 * Shortens the description of a given RNode by its type for readability
 *
 * @param nodeType the type of node
 * @param tagName the node tag name
 * @param textContent the text content in the node
 * @returns string
 */
function shortRNodeDescription(nodeType, tagName, textContent) {
    switch (nodeType) {
        case Node.ELEMENT_NODE:
            return `<${tagName.toLowerCase()}>`;
        case Node.TEXT_NODE:
            const content = textContent ? ` (with the "${shorten(textContent)}" content)` : '';
            return `a text node${content}`;
        case Node.COMMENT_NODE:
            return 'a comment node';
        default:
            return `#node(nodeType=${nodeType})`;
    }
}
/**
 * Builds the footer hydration error message
 *
 * @param componentClassName the name of the component class
 * @returns string
 */
function getHydrationErrorFooter(componentClassName) {
    const componentInfo = componentClassName ? `the "${componentClassName}"` : 'corresponding';
    return (`To fix this problem:\n` +
        `  * check ${componentInfo} component for hydration-related issues\n` +
        `  * check to see if your template has valid HTML structure\n` +
        `  * or skip hydration by adding the \`ngSkipHydration\` attribute ` +
        `to its host node in a template\n\n`);
}
/**
 * An attribute related note for hydration errors
 */
function getHydrationAttributeNote() {
    return ('Note: attributes are only displayed to better represent the DOM' +
        ' but have no effect on hydration mismatches.\n\n');
}
// Node string utility functions
/**
 * Strips all newlines out of a given string
 *
 * @param input a string to be cleared of new line characters
 * @returns
 */
function stripNewlines(input) {
    return input.replace(/\s+/gm, '');
}
/**
 * Reduces a string down to a maximum length of characters with ellipsis for readability
 *
 * @param input a string input
 * @param maxLength a maximum length in characters
 * @returns string
 */
function shorten(input, maxLength = 50) {
    if (!input) {
        return '';
    }
    input = stripNewlines(input);
    return input.length > maxLength ? `${input.substring(0, maxLength - 1)}…` : input;
}

/**
 * Find a node in front of which `currentTNode` should be inserted (takes i18n into account).
 *
 * This method determines the `RNode` in front of which we should insert the `currentRNode`. This
 * takes `TNode.insertBeforeIndex` into account.
 *
 * @param parentTNode parent `TNode`
 * @param currentTNode current `TNode` (The node which we would like to insert into the DOM)
 * @param lView current `LView`
 */
function getInsertInFrontOfRNodeWithI18n(parentTNode, currentTNode, lView) {
    const tNodeInsertBeforeIndex = currentTNode.insertBeforeIndex;
    const insertBeforeIndex = Array.isArray(tNodeInsertBeforeIndex)
        ? tNodeInsertBeforeIndex[0]
        : tNodeInsertBeforeIndex;
    if (insertBeforeIndex === null) {
        return getInsertInFrontOfRNodeWithNoI18n(parentTNode, currentTNode, lView);
    }
    else {
        ngDevMode && assertIndexInRange(lView, insertBeforeIndex);
        return unwrapRNode(lView[insertBeforeIndex]);
    }
}
/**
 * Process `TNode.insertBeforeIndex` by adding i18n text nodes.
 *
 * See `TNode.insertBeforeIndex`
 */
function processI18nInsertBefore(renderer, childTNode, lView, childRNode, parentRElement) {
    const tNodeInsertBeforeIndex = childTNode.insertBeforeIndex;
    if (Array.isArray(tNodeInsertBeforeIndex)) {
        // An array indicates that there are i18n nodes that need to be added as children of this
        // `childRNode`. These i18n nodes were created before this `childRNode` was available and so
        // only now can be added. The first element of the array is the normal index where we should
        // insert the `childRNode`. Additional elements are the extra nodes to be added as children of
        // `childRNode`.
        ngDevMode && assertDomNode(childRNode);
        let i18nParent = childRNode;
        let anchorRNode = null;
        if (!(childTNode.type & 3 /* TNodeType.AnyRNode */)) {
            anchorRNode = i18nParent;
            i18nParent = parentRElement;
        }
        if (i18nParent !== null && childTNode.componentOffset === -1) {
            for (let i = 1; i < tNodeInsertBeforeIndex.length; i++) {
                // No need to `unwrapRNode` because all of the indexes point to i18n text nodes.
                // see `assertDomNode` below.
                const i18nChild = lView[tNodeInsertBeforeIndex[i]];
                nativeInsertBefore(renderer, i18nParent, i18nChild, anchorRNode, false);
            }
        }
    }
}

function getOrCreateTNode(tView, index, type, name, attrs) {
    ngDevMode &&
        index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in
        // `view_engine_compatibility` for additional context.
        assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header.");
    // Keep this function short, so that the VM will inline it.
    ngDevMode && assertPureTNodeType(type);
    let tNode = tView.data[index];
    if (tNode === null) {
        tNode = createTNodeAtIndex(tView, index, type, name, attrs);
        if (isInI18nBlock()) {
            // If we are in i18n block then all elements should be pre declared through `Placeholder`
            // See `TNodeType.Placeholder` and `LFrame.inI18n` for more context.
            // If the `TNode` was not pre-declared than it means it was not mentioned which means it was
            // removed, so we mark it as detached.
            tNode.flags |= 32 /* TNodeFlags.isDetached */;
        }
    }
    else if (tNode.type & 64 /* TNodeType.Placeholder */) {
        tNode.type = type;
        tNode.value = name;
        tNode.attrs = attrs;
        const parent = getCurrentParentTNode();
        tNode.injectorIndex = parent === null ? -1 : parent.injectorIndex;
        ngDevMode && assertTNodeForTView(tNode, tView);
        ngDevMode && assertEqual(index, tNode.index, 'Expecting same index');
    }
    setCurrentTNode(tNode, true);
    return tNode;
}
function createTNodeAtIndex(tView, index, type, name, attrs) {
    const currentTNode = getCurrentTNodePlaceholderOk();
    const isParent = isCurrentTNodeParent();
    const parent = isParent ? currentTNode : currentTNode && currentTNode.parent;
    // Parents cannot cross component boundaries because components will be used in multiple places.
    const tNode = (tView.data[index] = createTNode(tView, parent, type, index, name, attrs));
    // Assign a pointer to the first child node of a given view. The first node is not always the one
    // at index 0, in case of i18n, index 0 can be the instruction `i18nStart` and the first node has
    // the index 1 or more, so we can't just check node index.
    linkTNodeInTView(tView, tNode, currentTNode, isParent);
    return tNode;
}
function linkTNodeInTView(tView, tNode, currentTNode, isParent) {
    if (tView.firstChild === null) {
        tView.firstChild = tNode;
    }
    if (currentTNode !== null) {
        if (isParent) {
            // FIXME(misko): This logic looks unnecessarily complicated. Could we simplify?
            if (currentTNode.child == null && tNode.parent !== null) {
                // We are in the same view, which means we are adding content node to the parent view.
                currentTNode.child = tNode;
            }
        }
        else {
            if (currentTNode.next === null) {
                // In the case of i18n the `currentTNode` may already be linked, in which case we don't want
                // to break the links which i18n created.
                currentTNode.next = tNode;
                tNode.prev = currentTNode;
            }
        }
    }
}
function createTNode(tView, tParent, type, index, value, attrs) {
    ngDevMode &&
        index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in
        // `view_engine_compatibility` for additional context.
        assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header.");
    ngDevMode && assertNotSame(attrs, undefined, "'undefined' is not valid value for 'attrs'");
    ngDevMode && ngDevMode.tNode++;
    ngDevMode && tParent && assertTNodeForTView(tParent, tView);
    let injectorIndex = tParent ? tParent.injectorIndex : -1;
    let flags = 0;
    if (isInSkipHydrationBlock$1()) {
        flags |= 128 /* TNodeFlags.inSkipHydrationBlock */;
    }
    // TODO: would it be helpful to use a prototypal inheritance here, similar to the way we do so with signals?
    const tNode = {
        type,
        index,
        insertBeforeIndex: null,
        injectorIndex,
        directiveStart: -1,
        directiveEnd: -1,
        directiveStylingLast: -1,
        componentOffset: -1,
        propertyBindings: null,
        flags,
        providerIndexes: 0,
        value: value,
        attrs: attrs,
        mergedAttrs: null,
        localNames: null,
        initialInputs: null,
        inputs: null,
        hostDirectiveInputs: null,
        outputs: null,
        hostDirectiveOutputs: null,
        directiveToIndex: null,
        tView: null,
        next: null,
        prev: null,
        projectionNext: null,
        child: null,
        parent: tParent,
        projection: null,
        styles: null,
        stylesWithoutHost: null,
        residualStyles: undefined,
        classes: null,
        classesWithoutHost: null,
        residualClasses: undefined,
        classBindings: 0,
        styleBindings: 0,
    };
    if (ngDevMode) {
        // For performance reasons it is important that the tNode retains the same shape during runtime.
        // (To make sure that all of the code is monomorphic.) For this reason we seal the object to
        // prevent class transitions.
        Object.seal(tNode);
    }
    return tNode;
}

/**
 * Add `tNode` to `previousTNodes` list and update relevant `TNode`s in `previousTNodes` list
 * `tNode.insertBeforeIndex`.
 *
 * Things to keep in mind:
 * 1. All i18n text nodes are encoded as `TNodeType.Element` and are created eagerly by the
 *    `ɵɵi18nStart` instruction.
 * 2. All `TNodeType.Placeholder` `TNodes` are elements which will be created later by
 *    `ɵɵelementStart` instruction.
 * 3. `ɵɵelementStart` instruction will create `TNode`s in the ascending `TNode.index` order. (So a
 *    smaller index `TNode` is guaranteed to be created before a larger one)
 *
 * We use the above three invariants to determine `TNode.insertBeforeIndex`.
 *
 * In an ideal world `TNode.insertBeforeIndex` would always be `TNode.next.index`. However,
 * this will not work because `TNode.next.index` may be larger than `TNode.index` which means that
 * the next node is not yet created and therefore we can't insert in front of it.
 *
 * Rule1: `TNode.insertBeforeIndex = null` if `TNode.next === null` (Initial condition, as we don't
 *        know if there will be further `TNode`s inserted after.)
 * Rule2: If `previousTNode` is created after the `tNode` being inserted, then
 *        `previousTNode.insertBeforeNode = tNode.index` (So when a new `tNode` is added we check
 *        previous to see if we can update its `insertBeforeTNode`)
 *
 * See `TNode.insertBeforeIndex` for more context.
 *
 * @param previousTNodes A list of previous TNodes so that we can easily traverse `TNode`s in
 *     reverse order. (If `TNode` would have `previous` this would not be necessary.)
 * @param newTNode A TNode to add to the `previousTNodes` list.
 */
function addTNodeAndUpdateInsertBeforeIndex(previousTNodes, newTNode) {
    // Start with Rule1
    ngDevMode &&
        assertEqual(newTNode.insertBeforeIndex, null, 'We expect that insertBeforeIndex is not set');
    previousTNodes.push(newTNode);
    if (previousTNodes.length > 1) {
        for (let i = previousTNodes.length - 2; i >= 0; i--) {
            const existingTNode = previousTNodes[i];
            // Text nodes are created eagerly and so they don't need their `indexBeforeIndex` updated.
            // It is safe to ignore them.
            if (!isI18nText(existingTNode)) {
                if (isNewTNodeCreatedBefore(existingTNode, newTNode) &&
                    getInsertBeforeIndex(existingTNode) === null) {
                    // If it was created before us in time, (and it does not yet have `insertBeforeIndex`)
                    // then add the `insertBeforeIndex`.
                    setInsertBeforeIndex(existingTNode, newTNode.index);
                }
            }
        }
    }
}
function isI18nText(tNode) {
    return !(tNode.type & 64 /* TNodeType.Placeholder */);
}
function isNewTNodeCreatedBefore(existingTNode, newTNode) {
    return isI18nText(newTNode) || existingTNode.index > newTNode.index;
}
function getInsertBeforeIndex(tNode) {
    const index = tNode.insertBeforeIndex;
    return Array.isArray(index) ? index[0] : index;
}
function setInsertBeforeIndex(tNode, value) {
    const index = tNode.insertBeforeIndex;
    if (Array.isArray(index)) {
        // Array is stored if we have to insert child nodes. See `TNode.insertBeforeIndex`
        index[0] = value;
    }
    else {
        setI18nHandling(getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore);
        tNode.insertBeforeIndex = value;
    }
}

/**
 * Retrieve `TIcu` at a given `index`.
 *
 * The `TIcu` can be stored either directly (if it is nested ICU) OR
 * it is stored inside tho `TIcuContainer` if it is top level ICU.
 *
 * The reason for this is that the top level ICU need a `TNode` so that they are part of the render
 * tree, but nested ICU's have no TNode, because we don't know ahead of time if the nested ICU is
 * expressed (parent ICU may have selected a case which does not contain it.)
 *
 * @param tView Current `TView`.
 * @param index Index where the value should be read from.
 */
function getTIcu(tView, index) {
    const value = tView.data[index];
    if (value === null || typeof value === 'string')
        return null;
    if (ngDevMode &&
        !(value.hasOwnProperty('tView') || value.hasOwnProperty('currentCaseLViewIndex'))) {
        throwError("We expect to get 'null'|'TIcu'|'TIcuContainer', but got: " + value);
    }
    // Here the `value.hasOwnProperty('currentCaseLViewIndex')` is a polymorphic read as it can be
    // either TIcu or TIcuContainerNode. This is not ideal, but we still think it is OK because it
    // will be just two cases which fits into the browser inline cache (inline cache can take up to
    // 4)
    const tIcu = value.hasOwnProperty('currentCaseLViewIndex')
        ? value
        : value.value;
    ngDevMode && assertTIcu(tIcu);
    return tIcu;
}
/**
 * Store `TIcu` at a give `index`.
 *
 * The `TIcu` can be stored either directly (if it is nested ICU) OR
 * it is stored inside tho `TIcuContainer` if it is top level ICU.
 *
 * The reason for this is that the top level ICU need a `TNode` so that they are part of the render
 * tree, but nested ICU's have no TNode, because we don't know ahead of time if the nested ICU is
 * expressed (parent ICU may have selected a case which does not contain it.)
 *
 * @param tView Current `TView`.
 * @param index Index where the value should be stored at in `Tview.data`
 * @param tIcu The TIcu to store.
 */
function setTIcu(tView, index, tIcu) {
    const tNode = tView.data[index];
    ngDevMode &&
        assertEqual(tNode === null || tNode.hasOwnProperty('tView'), true, "We expect to get 'null'|'TIcuContainer'");
    if (tNode === null) {
        tView.data[index] = tIcu;
    }
    else {
        ngDevMode && assertTNodeType(tNode, 32 /* TNodeType.Icu */);
        tNode.value = tIcu;
    }
}
/**
 * Set `TNode.insertBeforeIndex` taking the `Array` into account.
 *
 * See `TNode.insertBeforeIndex`
 */
function setTNodeInsertBeforeIndex(tNode, index) {
    ngDevMode && assertTNode(tNode);
    let insertBeforeIndex = tNode.insertBeforeIndex;
    if (insertBeforeIndex === null) {
        setI18nHandling(getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore);
        insertBeforeIndex = tNode.insertBeforeIndex = [
            null /* may be updated to number later */,
            index,
        ];
    }
    else {
        assertEqual(Array.isArray(insertBeforeIndex), true, 'Expecting array here');
        insertBeforeIndex.push(index);
    }
}
/**
 * Create `TNode.type=TNodeType.Placeholder` node.
 *
 * See `TNodeType.Placeholder` for more information.
 */
function createTNodePlaceholder(tView, previousTNodes, index) {
    const tNode = createTNodeAtIndex(tView, index, 64 /* TNodeType.Placeholder */, null, null);
    addTNodeAndUpdateInsertBeforeIndex(previousTNodes, tNode);
    return tNode;
}
/**
 * Returns current ICU case.
 *
 * ICU cases are stored as index into the `TIcu.cases`.
 * At times it is necessary to communicate that the ICU case just switched and that next ICU update
 * should update all bindings regardless of the mask. In such a case the we store negative numbers
 * for cases which have just been switched. This function removes the negative flag.
 */
function getCurrentICUCaseIndex(tIcu, lView) {
    const currentCase = lView[tIcu.currentCaseLViewIndex];
    return currentCase === null ? currentCase : currentCase < 0 ? ~currentCase : currentCase;
}
function getParentFromIcuCreateOpCode(mergedCode) {
    return mergedCode >>> 17 /* IcuCreateOpCode.SHIFT_PARENT */;
}
function getRefFromIcuCreateOpCode(mergedCode) {
    return (mergedCode & 131070 /* IcuCreateOpCode.MASK_REF */) >>> 1 /* IcuCreateOpCode.SHIFT_REF */;
}
function getInstructionFromIcuCreateOpCode(mergedCode) {
    return mergedCode & 1 /* IcuCreateOpCode.MASK_INSTRUCTION */;
}
function icuCreateOpCode(opCode, parentIdx, refIdx) {
    ngDevMode && assertGreaterThanOrEqual(parentIdx, 0, 'Missing parent index');
    ngDevMode && assertGreaterThan(refIdx, 0, 'Missing ref index');
    return (opCode | (parentIdx << 17 /* IcuCreateOpCode.SHIFT_PARENT */) | (refIdx << 1 /* IcuCreateOpCode.SHIFT_REF */));
}
// Returns whether the given value corresponds to a root template message,
// or a sub-template.
function isRootTemplateMessage(subTemplateIndex) {
    return subTemplateIndex === -1;
}

function enterIcu(state, tIcu, lView) {
    state.index = 0;
    const currentCase = getCurrentICUCaseIndex(tIcu, lView);
    if (currentCase !== null) {
        ngDevMode && assertNumberInRange(currentCase, 0, tIcu.cases.length - 1);
        state.removes = tIcu.remove[currentCase];
    }
    else {
        state.removes = EMPTY_ARRAY;
    }
}
function icuContainerIteratorNext(state) {
    if (state.index < state.removes.length) {
        const removeOpCode = state.removes[state.index++];
        ngDevMode && assertNumber(removeOpCode, 'Expecting OpCode number');
        if (removeOpCode > 0) {
            const rNode = state.lView[removeOpCode];
            ngDevMode && assertDomNode(rNode);
            return rNode;
        }
        else {
            state.stack.push(state.index, state.removes);
            // ICUs are represented by negative indices
            const tIcuIndex = ~removeOpCode;
            const tIcu = state.lView[TVIEW].data[tIcuIndex];
            ngDevMode && assertTIcu(tIcu);
            enterIcu(state, tIcu, state.lView);
            return icuContainerIteratorNext(state);
        }
    }
    else {
        if (state.stack.length === 0) {
            return null;
        }
        else {
            state.removes = state.stack.pop();
            state.index = state.stack.pop();
            return icuContainerIteratorNext(state);
        }
    }
}
function loadIcuContainerVisitor() {
    const _state = {
        stack: [],
        index: -1,
    };
    /**
     * Retrieves a set of root nodes from `TIcu.remove`. Used by `TNodeType.ICUContainer`
     * to determine which root belong to the ICU.
     *
     * Example of usage.
     * ```ts
     * const nextRNode = icuContainerIteratorStart(tIcuContainerNode, lView);
     * let rNode: RNode|null;
     * while(rNode = nextRNode()) {
     *   console.log(rNode);
     * }
     * ```
     *
     * @param tIcuContainerNode Current `TIcuContainerNode`
     * @param lView `LView` where the `RNode`s should be looked up.
     */
    function icuContainerIteratorStart(tIcuContainerNode, lView) {
        _state.lView = lView;
        while (_state.stack.length)
            _state.stack.pop();
        ngDevMode && assertTNodeForLView(tIcuContainerNode, lView);
        enterIcu(_state, tIcuContainerNode.value, lView);
        return icuContainerIteratorNext.bind(null, _state);
    }
    return icuContainerIteratorStart;
}
function createIcuIterator(tIcu, lView) {
    const state = {
        stack: [],
        index: -1,
        lView,
    };
    ngDevMode && assertTIcu(tIcu);
    enterIcu(state, tIcu, lView);
    return icuContainerIteratorNext.bind(null, state);
}

/**
 * Regexp that extracts a reference node information from the compressed node location.
 * The reference node is represented as either:
 *  - a number which points to an LView slot
 *  - the `b` char which indicates that the lookup should start from the `document.body`
 *  - the `h` char to start lookup from the component host node (`lView[HOST]`)
 */
const REF_EXTRACTOR_REGEXP = /* @__PURE__ */ new RegExp(`^(\\d+)*(${REFERENCE_NODE_BODY}|${REFERENCE_NODE_HOST})*(.*)`);
/**
 * Helper function that takes a reference node location and a set of navigation steps
 * (from the reference node) to a target node and outputs a string that represents
 * a location.
 *
 * For example, given: referenceNode = 'b' (body) and path = ['firstChild', 'firstChild',
 * 'nextSibling'], the function returns: `bf2n`.
 */
function compressNodeLocation(referenceNode, path) {
    const result = [referenceNode];
    for (const segment of path) {
        const lastIdx = result.length - 1;
        if (lastIdx > 0 && result[lastIdx - 1] === segment) {
            // An empty string in a count slot represents 1 occurrence of an instruction.
            const value = (result[lastIdx] || 1);
            result[lastIdx] = value + 1;
        }
        else {
            // Adding a new segment to the path.
            // Using an empty string in a counter field to avoid encoding `1`s
            // into the path, since they are implicit (e.g. `f1n1` vs `fn`), so
            // it's enough to have a single char in this case.
            result.push(segment, '');
        }
    }
    return result.join('');
}
/**
 * Helper function that reverts the `compressNodeLocation` and transforms a given
 * string into an array where at 0th position there is a reference node info and
 * after that it contains information (in pairs) about a navigation step and the
 * number of repetitions.
 *
 * For example, the path like 'bf2n' will be transformed to:
 * ['b', 'firstChild', 2, 'nextSibling', 1].
 *
 * This information is later consumed by the code that navigates the DOM to find
 * a given node by its location.
 */
function decompressNodeLocation(path) {
    const matches = path.match(REF_EXTRACTOR_REGEXP);
    const [_, refNodeId, refNodeName, rest] = matches;
    // If a reference node is represented by an index, transform it to a number.
    const ref = refNodeId ? parseInt(refNodeId, 10) : refNodeName;
    const steps = [];
    // Match all segments in a path.
    for (const [_, step, count] of rest.matchAll(/(f|n)(\d*)/g)) {
        const repeat = parseInt(count, 10) || 1;
        steps.push(step, repeat);
    }
    return [ref, ...steps];
}

/** Whether current TNode is a first node in an <ng-container>. */
function isFirstElementInNgContainer(tNode) {
    return !tNode.prev && tNode.parent?.type === 8 /* TNodeType.ElementContainer */;
}
/** Returns an instruction index (subtracting HEADER_OFFSET). */
function getNoOffsetIndex(tNode) {
    return tNode.index - HEADER_OFFSET;
}
/**
 * Check whether a given node exists, but is disconnected from the DOM.
 */
function isDisconnectedNode(tNode, lView) {
    return (!(tNode.type & (16 /* TNodeType.Projection */ | 128 /* TNodeType.LetDeclaration */)) &&
        !!lView[tNode.index] &&
        isDisconnectedRNode(unwrapRNode(lView[tNode.index])));
}
/**
 * Check whether the given node exists, but is disconnected from the DOM.
 *
 * Note: we leverage the fact that we have this information available in the DOM emulation
 * layer (in Domino) for now. Longer-term solution should not rely on the DOM emulation and
 * only use internal data structures and state to compute this information.
 */
function isDisconnectedRNode(rNode) {
    return !!rNode && !rNode.isConnected;
}
/**
 * Locate a node in an i18n tree that corresponds to a given instruction index.
 *
 * @param hydrationInfo The hydration annotation data
 * @param noOffsetIndex the instruction index
 * @returns an RNode that corresponds to the instruction index
 */
function locateI18nRNodeByIndex(hydrationInfo, noOffsetIndex) {
    const i18nNodes = hydrationInfo.i18nNodes;
    if (i18nNodes) {
        return i18nNodes.get(noOffsetIndex);
    }
    return undefined;
}
/**
 * Attempt to locate an RNode by a path, if it exists.
 *
 * @param hydrationInfo The hydration annotation data
 * @param lView the current lView
 * @param noOffsetIndex the instruction index
 * @returns an RNode that corresponds to the instruction index or null if no path exists
 */
function tryLocateRNodeByPath(hydrationInfo, lView, noOffsetIndex) {
    const nodes = hydrationInfo.data[NODES];
    const path = nodes?.[noOffsetIndex];
    return path ? locateRNodeByPath(path, lView) : null;
}
/**
 * Locate a node in DOM tree that corresponds to a given TNode.
 *
 * @param hydrationInfo The hydration annotation data
 * @param tView the current tView
 * @param lView the current lView
 * @param tNode the current tNode
 * @returns an RNode that represents a given tNode
 */
function locateNextRNode(hydrationInfo, tView, lView, tNode) {
    const noOffsetIndex = getNoOffsetIndex(tNode);
    let native = locateI18nRNodeByIndex(hydrationInfo, noOffsetIndex);
    if (native === undefined) {
        const nodes = hydrationInfo.data[NODES];
        if (nodes?.[noOffsetIndex]) {
            // We know the exact location of the node.
            native = locateRNodeByPath(nodes[noOffsetIndex], lView);
        }
        else if (tView.firstChild === tNode) {
            // We create a first node in this view, so we use a reference
            // to the first child in this DOM segment.
            native = hydrationInfo.firstChild;
        }
        else {
            // Locate a node based on a previous sibling or a parent node.
            const previousTNodeParent = tNode.prev === null;
            const previousTNode = (tNode.prev ?? tNode.parent);
            ngDevMode &&
                assertDefined(previousTNode, 'Unexpected state: current TNode does not have a connection ' +
                    'to the previous node or a parent node.');
            if (isFirstElementInNgContainer(tNode)) {
                const noOffsetParentIndex = getNoOffsetIndex(tNode.parent);
                native = getSegmentHead(hydrationInfo, noOffsetParentIndex);
            }
            else {
                let previousRElement = getNativeByTNode(previousTNode, lView);
                if (previousTNodeParent) {
                    native = previousRElement.firstChild;
                }
                else {
                    // If the previous node is an element, but it also has container info,
                    // this means that we are processing a node like `<div #vcrTarget>`, which is
                    // represented in the DOM as `<div></div>...<!--container-->`.
                    // In this case, there are nodes *after* this element and we need to skip
                    // all of them to reach an element that we are looking for.
                    const noOffsetPrevSiblingIndex = getNoOffsetIndex(previousTNode);
                    const segmentHead = getSegmentHead(hydrationInfo, noOffsetPrevSiblingIndex);
                    if (previousTNode.type === 2 /* TNodeType.Element */ && segmentHead) {
                        const numRootNodesToSkip = calcSerializedContainerSize(hydrationInfo, noOffsetPrevSiblingIndex);
                        // `+1` stands for an anchor comment node after all the views in this container.
                        const nodesToSkip = numRootNodesToSkip + 1;
                        // First node after this segment.
                        native = siblingAfter(nodesToSkip, segmentHead);
                    }
                    else {
                        native = previousRElement.nextSibling;
                    }
                }
            }
        }
    }
    return native;
}
/**
 * Skips over a specified number of nodes and returns the next sibling node after that.
 */
function siblingAfter(skip, from) {
    let currentNode = from;
    for (let i = 0; i < skip; i++) {
        ngDevMode && validateSiblingNodeExists(currentNode);
        currentNode = currentNode.nextSibling;
    }
    return currentNode;
}
/**
 * Helper function to produce a string representation of the navigation steps
 * (in terms of `nextSibling` and `firstChild` navigations). Used in error
 * messages in dev mode.
 */
function stringifyNavigationInstructions(instructions) {
    const container = [];
    for (let i = 0; i < instructions.length; i += 2) {
        const step = instructions[i];
        const repeat = instructions[i + 1];
        for (let r = 0; r < repeat; r++) {
            container.push(step === NODE_NAVIGATION_STEP_FIRST_CHILD ? 'firstChild' : 'nextSibling');
        }
    }
    return container.join('.');
}
/**
 * Helper function that navigates from a starting point node (the `from` node)
 * using provided set of navigation instructions (within `path` argument).
 */
function navigateToNode(from, instructions) {
    let node = from;
    for (let i = 0; i < instructions.length; i += 2) {
        const step = instructions[i];
        const repeat = instructions[i + 1];
        for (let r = 0; r < repeat; r++) {
            if (ngDevMode && !node) {
                throw nodeNotFoundAtPathError(from, stringifyNavigationInstructions(instructions));
            }
            switch (step) {
                case NODE_NAVIGATION_STEP_FIRST_CHILD:
                    node = node.firstChild;
                    break;
                case NODE_NAVIGATION_STEP_NEXT_SIBLING:
                    node = node.nextSibling;
                    break;
            }
        }
    }
    if (ngDevMode && !node) {
        throw nodeNotFoundAtPathError(from, stringifyNavigationInstructions(instructions));
    }
    return node;
}
/**
 * Locates an RNode given a set of navigation instructions (which also contains
 * a starting point node info).
 */
function locateRNodeByPath(path, lView) {
    const [referenceNode, ...navigationInstructions] = decompressNodeLocation(path);
    let ref;
    if (referenceNode === REFERENCE_NODE_HOST) {
        ref = lView[DECLARATION_COMPONENT_VIEW][HOST];
    }
    else if (referenceNode === REFERENCE_NODE_BODY) {
        ref = ɵɵresolveBody(lView[DECLARATION_COMPONENT_VIEW][HOST]);
    }
    else {
        const parentElementId = Number(referenceNode);
        ref = unwrapRNode(lView[parentElementId + HEADER_OFFSET]);
    }
    return navigateToNode(ref, navigationInstructions);
}
/**
 * Generate a list of DOM navigation operations to get from node `start` to node `finish`.
 *
 * Note: assumes that node `start` occurs before node `finish` in an in-order traversal of the DOM
 * tree. That is, we should be able to get fro   m `start` to `finish` purely by using `.firstChild`
 * and `.nextSibling` operations.
 */
function navigateBetween(start, finish) {
    if (start === finish) {
        return [];
    }
    else if (start.parentElement == null || finish.parentElement == null) {
        return null;
    }
    else if (start.parentElement === finish.parentElement) {
        return navigateBetweenSiblings(start, finish);
    }
    else {
        // `finish` is a child of its parent, so the parent will always have a child.
        const parent = finish.parentElement;
        const parentPath = navigateBetween(start, parent);
        const childPath = navigateBetween(parent.firstChild, finish);
        if (!parentPath || !childPath)
            return null;
        return [
            // First navigate to `finish`'s parent
            ...parentPath,
            // Then to its first child.
            NODE_NAVIGATION_STEP_FIRST_CHILD,
            // And finally from that node to `finish` (maybe a no-op if we're already there).
            ...childPath,
        ];
    }
}
/**
 * Calculates a path between 2 sibling nodes (generates a number of `NextSibling` navigations).
 * Returns `null` if no such path exists between the given nodes.
 */
function navigateBetweenSiblings(start, finish) {
    const nav = [];
    let node = null;
    for (node = start; node != null && node !== finish; node = node.nextSibling) {
        nav.push(NODE_NAVIGATION_STEP_NEXT_SIBLING);
    }
    // If the `node` becomes `null` or `undefined` at the end, that means that we
    // didn't find the `end` node, thus return `null` (which would trigger serialization
    // error to be produced).
    return node == null ? null : nav;
}
/**
 * Calculates a path between 2 nodes in terms of `nextSibling` and `firstChild`
 * navigations:
 * - the `from` node is a known node, used as an starting point for the lookup
 *   (the `fromNodeName` argument is a string representation of the node).
 * - the `to` node is a node that the runtime logic would be looking up,
 *   using the path generated by this function.
 */
function calcPathBetween(from, to, fromNodeName) {
    const path = navigateBetween(from, to);
    return path === null ? null : compressNodeLocation(fromNodeName, path);
}
/**
 * Invoked at serialization time (on the server) when a set of navigation
 * instructions needs to be generated for a TNode.
 */
function calcPathForNode(tNode, lView, excludedParentNodes) {
    let parentTNode = tNode.parent;
    let parentIndex;
    let parentRNode;
    let referenceNodeName;
    // Skip over all parent nodes that are disconnected from the DOM, such nodes
    // can not be used as anchors.
    //
    // This might happen in certain content projection-based use-cases, where
    // a content of an element is projected and used, when a parent element
    // itself remains detached from DOM. In this scenario we try to find a parent
    // element that is attached to DOM and can act as an anchor instead.
    //
    // It can also happen that the parent node should be excluded, for example,
    // because it belongs to an i18n block, which requires paths which aren't
    // relative to other views in an i18n block.
    while (parentTNode !== null &&
        (isDisconnectedNode(parentTNode, lView) || excludedParentNodes?.has(parentTNode.index))) {
        parentTNode = parentTNode.parent;
    }
    if (parentTNode === null || !(parentTNode.type & 3 /* TNodeType.AnyRNode */)) {
        // If there is no parent TNode or a parent TNode does not represent an RNode
        // (i.e. not a DOM node), use component host element as a reference node.
        parentIndex = referenceNodeName = REFERENCE_NODE_HOST;
        parentRNode = lView[DECLARATION_COMPONENT_VIEW][HOST];
    }
    else {
        // Use parent TNode as a reference node.
        parentIndex = parentTNode.index;
        parentRNode = unwrapRNode(lView[parentIndex]);
        referenceNodeName = renderStringify(parentIndex - HEADER_OFFSET);
    }
    let rNode = unwrapRNode(lView[tNode.index]);
    if (tNode.type & (12 /* TNodeType.AnyContainer */ | 32 /* TNodeType.Icu */)) {
        // For <ng-container> nodes, instead of serializing a reference
        // to the anchor comment node, serialize a location of the first
        // DOM element. Paired with the container size (serialized as a part
        // of `ngh.containers`), it should give enough information for runtime
        // to hydrate nodes in this container.
        const firstRNode = getFirstNativeNode(lView, tNode);
        // If container is not empty, use a reference to the first element,
        // otherwise, rNode would point to an anchor comment node.
        if (firstRNode) {
            rNode = firstRNode;
        }
    }
    let path = calcPathBetween(parentRNode, rNode, referenceNodeName);
    if (path === null && parentRNode !== rNode) {
        // Searching for a path between elements within a host node failed.
        // Trying to find a path to an element starting from the `document.body` instead.
        //
        // Important note: this type of reference is relatively unstable, since Angular
        // may not be able to control parts of the page that the runtime logic navigates
        // through. This is mostly needed to cover "portals" use-case (like menus, dialog boxes,
        // etc), where nodes are content-projected (including direct DOM manipulations) outside
        // of the host node. The better solution is to provide APIs to work with "portals",
        // at which point this code path would not be needed.
        const body = parentRNode.ownerDocument.body;
        path = calcPathBetween(body, rNode, REFERENCE_NODE_BODY);
        if (path === null) {
            // If the path is still empty, it's likely that this node is detached and
            // won't be found during hydration.
            throw nodeNotFoundError(lView, tNode);
        }
    }
    return path;
}
/**
 * Retrieves all comments nodes that contain ngh comments referring to a defer block
 */
function gatherDeferBlocksCommentNodes(doc, node) {
    const commentNodesIterator = doc.createNodeIterator(node, NodeFilter.SHOW_COMMENT, { acceptNode });
    let currentNode;
    const nodesByBlockId = new Map();
    while ((currentNode = commentNodesIterator.nextNode())) {
        const nghPattern = 'ngh=';
        const content = currentNode?.textContent;
        const nghIdx = content?.indexOf(nghPattern) ?? -1;
        if (nghIdx > -1) {
            const nghValue = content.substring(nghIdx + nghPattern.length).trim();
            // Make sure the value has an expected format.
            ngDevMode &&
                assertEqual(nghValue.startsWith('d'), true, 'Invalid defer block id found in a comment node.');
            nodesByBlockId.set(nghValue, currentNode);
        }
    }
    return nodesByBlockId;
}
function acceptNode(node) {
    return node.textContent?.trimStart().startsWith('ngh=')
        ? NodeFilter.FILTER_ACCEPT
        : NodeFilter.FILTER_REJECT;
}

let _isI18nHydrationSupportEnabled = false;
let _prepareI18nBlockForHydrationImpl = () => {
    // noop unless `enablePrepareI18nBlockForHydrationImpl` is invoked.
};
function setIsI18nHydrationSupportEnabled(enabled) {
    _isI18nHydrationSupportEnabled = enabled;
}
function isI18nHydrationSupportEnabled() {
    return _isI18nHydrationSupportEnabled;
}
/**
 * Prepares an i18n block and its children, located at the given
 * view and instruction index, for hydration.
 *
 * @param lView lView with the i18n block
 * @param index index of the i18n block in the lView
 * @param parentTNode TNode of the parent of the i18n block
 * @param subTemplateIndex sub-template index, or -1 for the main template
 */
function prepareI18nBlockForHydration(lView, index, parentTNode, subTemplateIndex) {
    _prepareI18nBlockForHydrationImpl(lView, index, parentTNode, subTemplateIndex);
}
function enablePrepareI18nBlockForHydrationImpl() {
    _prepareI18nBlockForHydrationImpl = prepareI18nBlockForHydrationImpl;
}
function isI18nHydrationEnabled(injector) {
    injector = injector ?? inject(Injector);
    return injector.get(IS_I18N_HYDRATION_ENABLED, false);
}
/**
 * Collects, if not already cached, all of the indices in the
 * given TView which are children of an i18n block.
 *
 * Since i18n blocks don't introduce a parent TNode, this is necessary
 * in order to determine which indices in a LView are translated.
 */
function getOrComputeI18nChildren(tView, context) {
    let i18nChildren = context.i18nChildren.get(tView);
    if (i18nChildren === undefined) {
        i18nChildren = collectI18nChildren(tView);
        context.i18nChildren.set(tView, i18nChildren);
    }
    return i18nChildren;
}
function collectI18nChildren(tView) {
    const children = new Set();
    function collectI18nViews(node) {
        children.add(node.index);
        switch (node.kind) {
            case 1 /* I18nNodeKind.ELEMENT */:
            case 2 /* I18nNodeKind.PLACEHOLDER */: {
                for (const childNode of node.children) {
                    collectI18nViews(childNode);
                }
                break;
            }
            case 3 /* I18nNodeKind.ICU */: {
                for (const caseNodes of node.cases) {
                    for (const caseNode of caseNodes) {
                        collectI18nViews(caseNode);
                    }
                }
                break;
            }
        }
    }
    // Traverse through the AST of each i18n block in the LView,
    // and collect every instruction index.
    for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
        const tI18n = tView.data[i];
        if (!tI18n || !tI18n.ast) {
            continue;
        }
        for (const node of tI18n.ast) {
            collectI18nViews(node);
        }
    }
    return children.size === 0 ? null : children;
}
/**
 * Attempts to serialize i18n data for an i18n block, located at
 * the given view and instruction index.
 *
 * @param lView lView with the i18n block
 * @param index index of the i18n block in the lView
 * @param context the hydration context
 * @returns the i18n data, or null if there is no relevant data
 */
function trySerializeI18nBlock(lView, index, context) {
    if (!context.isI18nHydrationEnabled) {
        return null;
    }
    const tView = lView[TVIEW];
    const tI18n = tView.data[index];
    if (!tI18n || !tI18n.ast) {
        return null;
    }
    const parentTNode = tView.data[tI18n.parentTNodeIndex];
    if (parentTNode && isI18nInSkipHydrationBlock(parentTNode)) {
        return null;
    }
    const serializedI18nBlock = {
        caseQueue: [],
        disconnectedNodes: new Set(),
        disjointNodes: new Set(),
    };
    serializeI18nBlock(lView, serializedI18nBlock, context, tI18n.ast);
    return serializedI18nBlock.caseQueue.length === 0 &&
        serializedI18nBlock.disconnectedNodes.size === 0 &&
        serializedI18nBlock.disjointNodes.size === 0
        ? null
        : serializedI18nBlock;
}
function serializeI18nBlock(lView, serializedI18nBlock, context, nodes) {
    let prevRNode = null;
    for (const node of nodes) {
        const nextRNode = serializeI18nNode(lView, serializedI18nBlock, context, node);
        if (nextRNode) {
            if (isDisjointNode(prevRNode, nextRNode)) {
                serializedI18nBlock.disjointNodes.add(node.index - HEADER_OFFSET);
            }
            prevRNode = nextRNode;
        }
    }
    return prevRNode;
}
/**
 * Helper to determine whether the given nodes are "disjoint".
 *
 * The i18n hydration process walks through the DOM and i18n nodes
 * at the same time. It expects the sibling DOM node of the previous
 * i18n node to be the first node of the next i18n node.
 *
 * In cases of content projection, this won't always be the case. So
 * when we detect that, we mark the node as "disjoint", ensuring that
 * we will serialize the path to the node. This way, when we hydrate the
 * i18n node, we will be able to find the correct place to start.
 */
function isDisjointNode(prevNode, nextNode) {
    return prevNode && prevNode.nextSibling !== nextNode;
}
/**
 * Process the given i18n node for serialization.
 * Returns the first RNode for the i18n node to begin hydration.
 */
function serializeI18nNode(lView, serializedI18nBlock, context, node) {
    const maybeRNode = unwrapRNode(lView[node.index]);
    if (!maybeRNode || isDisconnectedRNode(maybeRNode)) {
        serializedI18nBlock.disconnectedNodes.add(node.index - HEADER_OFFSET);
        return null;
    }
    const rNode = maybeRNode;
    switch (node.kind) {
        case 0 /* I18nNodeKind.TEXT */: {
            processTextNodeBeforeSerialization(context, rNode);
            break;
        }
        case 1 /* I18nNodeKind.ELEMENT */:
        case 2 /* I18nNodeKind.PLACEHOLDER */: {
            serializeI18nBlock(lView, serializedI18nBlock, context, node.children);
            break;
        }
        case 3 /* I18nNodeKind.ICU */: {
            const currentCase = lView[node.currentCaseLViewIndex];
            if (currentCase != null) {
                // i18n uses a negative value to signal a change to a new case, so we
                // need to invert it to get the proper value.
                const caseIdx = currentCase < 0 ? ~currentCase : currentCase;
                serializedI18nBlock.caseQueue.push(caseIdx);
                serializeI18nBlock(lView, serializedI18nBlock, context, node.cases[caseIdx]);
            }
            break;
        }
    }
    return getFirstNativeNodeForI18nNode(lView, node);
}
/**
 * Helper function to get the first native node to begin hydrating
 * the given i18n node.
 */
function getFirstNativeNodeForI18nNode(lView, node) {
    const tView = lView[TVIEW];
    const maybeTNode = tView.data[node.index];
    if (isTNodeShape(maybeTNode)) {
        // If the node is backed by an actual TNode, we can simply delegate.
        return getFirstNativeNode(lView, maybeTNode);
    }
    else if (node.kind === 3 /* I18nNodeKind.ICU */) {
        // A nested ICU container won't have an actual TNode. In that case, we can use
        // an iterator to find the first child.
        const icuIterator = createIcuIterator(maybeTNode, lView);
        let rNode = icuIterator();
        // If the ICU container has no nodes, then we use the ICU anchor as the node.
        return rNode ?? unwrapRNode(lView[node.index]);
    }
    else {
        // Otherwise, the node is a text or trivial element in an ICU container,
        // and we can just use the RNode directly.
        return unwrapRNode(lView[node.index]) ?? null;
    }
}
function setCurrentNode(state, node) {
    state.currentNode = node;
}
/**
 * Marks the current RNode as the hydration root for the given
 * AST node.
 */
function appendI18nNodeToCollection(context, state, astNode) {
    const noOffsetIndex = astNode.index - HEADER_OFFSET;
    const { disconnectedNodes } = context;
    const currentNode = state.currentNode;
    if (state.isConnected) {
        context.i18nNodes.set(noOffsetIndex, currentNode);
        // We expect the node to be connected, so ensure that it
        // is not in the set, regardless of whether we found it,
        // so that the downstream error handling can provide the
        // proper context.
        disconnectedNodes.delete(noOffsetIndex);
    }
    else {
        disconnectedNodes.add(noOffsetIndex);
    }
    return currentNode;
}
/**
 * Skip over some sibling nodes during hydration.
 *
 * Note: we use this instead of `siblingAfter` as it's expected that
 * sometimes we might encounter null nodes. In those cases, we want to
 * defer to downstream error handling to provide proper context.
 */
function skipSiblingNodes(state, skip) {
    let currentNode = state.currentNode;
    for (let i = 0; i < skip; i++) {
        if (!currentNode) {
            break;
        }
        currentNode = currentNode?.nextSibling ?? null;
    }
    return currentNode;
}
/**
 * Fork the given state into a new state for hydrating children.
 */
function forkHydrationState(state, nextNode) {
    return { currentNode: nextNode, isConnected: state.isConnected };
}
function prepareI18nBlockForHydrationImpl(lView, index, parentTNode, subTemplateIndex) {
    const hydrationInfo = lView[HYDRATION];
    if (!hydrationInfo) {
        return;
    }
    if (!isI18nHydrationSupportEnabled() ||
        (parentTNode &&
            (isI18nInSkipHydrationBlock(parentTNode) ||
                isDisconnectedNode$1(hydrationInfo, parentTNode.index - HEADER_OFFSET)))) {
        return;
    }
    const tView = lView[TVIEW];
    const tI18n = tView.data[index];
    ngDevMode &&
        assertDefined(tI18n, 'Expected i18n data to be present in a given TView slot during hydration');
    function findHydrationRoot() {
        if (isRootTemplateMessage(subTemplateIndex)) {
            // This is the root of an i18n block. In this case, our hydration root will
            // depend on where our parent TNode (i.e. the block with i18n applied) is
            // in the DOM.
            ngDevMode && assertDefined(parentTNode, 'Expected parent TNode while hydrating i18n root');
            const rootNode = locateNextRNode(hydrationInfo, tView, lView, parentTNode);
            // If this i18n block is attached to an <ng-container>, then we want to begin
            // hydrating directly with the RNode. Otherwise, for a TNode with a physical DOM
            // element, we want to recurse into the first child and begin there.
            return parentTNode.type & 8 /* TNodeType.ElementContainer */ ? rootNode : rootNode.firstChild;
        }
        // This is a nested template in an i18n block. In this case, the entire view
        // is translated, and part of a dehydrated view in a container. This means that
        // we can simply begin hydration with the first dehydrated child.
        return hydrationInfo?.firstChild;
    }
    const currentNode = findHydrationRoot();
    ngDevMode && assertDefined(currentNode, 'Expected root i18n node during hydration');
    const disconnectedNodes = initDisconnectedNodes(hydrationInfo) ?? new Set();
    const i18nNodes = (hydrationInfo.i18nNodes ??= new Map());
    const caseQueue = hydrationInfo.data[I18N_DATA]?.[index - HEADER_OFFSET] ?? [];
    const dehydratedIcuData = (hydrationInfo.dehydratedIcuData ??= new Map());
    collectI18nNodesFromDom({ hydrationInfo, lView, i18nNodes, disconnectedNodes, caseQueue, dehydratedIcuData }, { currentNode, isConnected: true }, tI18n.ast);
    // Nodes from inactive ICU cases should be considered disconnected. We track them above
    // because they aren't (and shouldn't be) serialized. Since we may mutate or create a
    // new set, we need to be sure to write the expected value back to the DehydratedView.
    hydrationInfo.disconnectedNodes = disconnectedNodes.size === 0 ? null : disconnectedNodes;
}
function collectI18nNodesFromDom(context, state, nodeOrNodes) {
    if (Array.isArray(nodeOrNodes)) {
        let nextState = state;
        for (const node of nodeOrNodes) {
            // Whenever a node doesn't directly follow the previous RNode, it
            // is given a path. We need to resume collecting nodes from that location
            // until and unless we find another disjoint node.
            const targetNode = tryLocateRNodeByPath(context.hydrationInfo, context.lView, node.index - HEADER_OFFSET);
            if (targetNode) {
                nextState = forkHydrationState(state, targetNode);
            }
            collectI18nNodesFromDom(context, nextState, node);
        }
    }
    else {
        if (context.disconnectedNodes.has(nodeOrNodes.index - HEADER_OFFSET)) {
            // i18n nodes can be considered disconnected if e.g. they were projected.
            // In that case, we have to make sure to skip over them.
            return;
        }
        switch (nodeOrNodes.kind) {
            case 0 /* I18nNodeKind.TEXT */: {
                // Claim a text node for hydration
                const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);
                setCurrentNode(state, currentNode?.nextSibling ?? null);
                break;
            }
            case 1 /* I18nNodeKind.ELEMENT */: {
                // Recurse into the current element's children...
                collectI18nNodesFromDom(context, forkHydrationState(state, state.currentNode?.firstChild ?? null), nodeOrNodes.children);
                // And claim the parent element itself.
                const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);
                setCurrentNode(state, currentNode?.nextSibling ?? null);
                break;
            }
            case 2 /* I18nNodeKind.PLACEHOLDER */: {
                const noOffsetIndex = nodeOrNodes.index - HEADER_OFFSET;
                const { hydrationInfo } = context;
                const containerSize = getNgContainerSize(hydrationInfo, noOffsetIndex);
                switch (nodeOrNodes.type) {
                    case 0 /* I18nPlaceholderType.ELEMENT */: {
                        // Hydration expects to find the head of the element.
                        const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);
                        // A TNode for the node may not yet if we're hydrating during the first pass,
                        // so use the serialized data to determine if this is an <ng-container>.
                        if (isSerializedElementContainer(hydrationInfo, noOffsetIndex)) {
                            // An <ng-container> doesn't have a physical DOM node, so we need to
                            // continue hydrating from siblings.
                            collectI18nNodesFromDom(context, state, nodeOrNodes.children);
                            // Skip over the anchor element. It will be claimed by the
                            // downstream container hydration.
                            const nextNode = skipSiblingNodes(state, 1);
                            setCurrentNode(state, nextNode);
                        }
                        else {
                            // Non-container elements represent an actual node in the DOM, so we
                            // need to continue hydration with the children, and claim the node.
                            collectI18nNodesFromDom(context, forkHydrationState(state, state.currentNode?.firstChild ?? null), nodeOrNodes.children);
                            setCurrentNode(state, currentNode?.nextSibling ?? null);
                            // Elements can also be the anchor of a view container, so there may
                            // be elements after this node that we need to skip.
                            if (containerSize !== null) {
                                // `+1` stands for an anchor node after all of the views in the container.
                                const nextNode = skipSiblingNodes(state, containerSize + 1);
                                setCurrentNode(state, nextNode);
                            }
                        }
                        break;
                    }
                    case 1 /* I18nPlaceholderType.SUBTEMPLATE */: {
                        ngDevMode &&
                            assertNotEqual(containerSize, null, 'Expected a container size while hydrating i18n subtemplate');
                        // Hydration expects to find the head of the template.
                        appendI18nNodeToCollection(context, state, nodeOrNodes);
                        // Skip over all of the template children, as well as the anchor
                        // node, since the template itself will handle them instead.
                        const nextNode = skipSiblingNodes(state, containerSize + 1);
                        setCurrentNode(state, nextNode);
                        break;
                    }
                }
                break;
            }
            case 3 /* I18nNodeKind.ICU */: {
                // If the current node is connected, we need to pop the next case from the
                // queue, so that the active case is also considered connected.
                const selectedCase = state.isConnected ? context.caseQueue.shift() : null;
                const childState = { currentNode: null, isConnected: false };
                // We traverse through each case, even if it's not active,
                // so that we correctly populate disconnected nodes.
                for (let i = 0; i < nodeOrNodes.cases.length; i++) {
                    collectI18nNodesFromDom(context, i === selectedCase ? state : childState, nodeOrNodes.cases[i]);
                }
                if (selectedCase !== null) {
                    // ICUs represent a branching state, and the selected case could be different
                    // than what it was on the server. In that case, we need to be able to clean
                    // up the nodes from the original case. To do that, we store the selected case.
                    context.dehydratedIcuData.set(nodeOrNodes.index, { case: selectedCase, node: nodeOrNodes });
                }
                // Hydration expects to find the ICU anchor element.
                const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);
                setCurrentNode(state, currentNode?.nextSibling ?? null);
                break;
            }
        }
    }
}
let _claimDehydratedIcuCaseImpl = () => {
    // noop unless `enableClaimDehydratedIcuCaseImpl` is invoked
};
/**
 * Mark the case for the ICU node at the given index in the view as claimed,
 * allowing its nodes to be hydrated and not cleaned up.
 */
function claimDehydratedIcuCase(lView, icuIndex, caseIndex) {
    _claimDehydratedIcuCaseImpl(lView, icuIndex, caseIndex);
}
function enableClaimDehydratedIcuCaseImpl() {
    _claimDehydratedIcuCaseImpl = claimDehydratedIcuCaseImpl;
}
function claimDehydratedIcuCaseImpl(lView, icuIndex, caseIndex) {
    const dehydratedIcuDataMap = lView[HYDRATION]?.dehydratedIcuData;
    if (dehydratedIcuDataMap) {
        const dehydratedIcuData = dehydratedIcuDataMap.get(icuIndex);
        if (dehydratedIcuData?.case === caseIndex) {
            // If the case we're attempting to claim matches the dehydrated one,
            // we remove it from the map to mark it as "claimed."
            dehydratedIcuDataMap.delete(icuIndex);
        }
    }
}
/**
 * Clean up all i18n hydration data associated with the given view.
 */
function cleanupI18nHydrationData(lView) {
    const hydrationInfo = lView[HYDRATION];
    if (hydrationInfo) {
        const { i18nNodes, dehydratedIcuData: dehydratedIcuDataMap } = hydrationInfo;
        if (i18nNodes && dehydratedIcuDataMap) {
            const renderer = lView[RENDERER];
            for (const dehydratedIcuData of dehydratedIcuDataMap.values()) {
                cleanupDehydratedIcuData(renderer, i18nNodes, dehydratedIcuData);
            }
        }
        hydrationInfo.i18nNodes = undefined;
        hydrationInfo.dehydratedIcuData = undefined;
    }
}
function cleanupDehydratedIcuData(renderer, i18nNodes, dehydratedIcuData) {
    for (const node of dehydratedIcuData.node.cases[dehydratedIcuData.case]) {
        const rNode = i18nNodes.get(node.index - HEADER_OFFSET);
        if (rNode) {
            nativeRemoveNode(renderer, rNode, false);
        }
    }
}

/**
 * Removes all dehydrated views from a given LContainer:
 * both in internal data structure, as well as removing
 * corresponding DOM nodes that belong to that dehydrated view.
 */
function removeDehydratedViews(lContainer) {
    const views = lContainer[DEHYDRATED_VIEWS] ?? [];
    const parentLView = lContainer[PARENT];
    const renderer = parentLView[RENDERER];
    const retainedViews = [];
    for (const view of views) {
        // Do not clean up contents of `@defer` blocks.
        // The cleanup for this content would happen once a given block
        // is triggered and hydrated.
        if (view.data[DEFER_BLOCK_ID] !== undefined) {
            retainedViews.push(view);
        }
        else {
            removeDehydratedView(view, renderer);
            ngDevMode && ngDevMode.dehydratedViewsRemoved++;
        }
    }
    // Reset the value to an array to indicate that no
    // further processing of dehydrated views is needed for
    // this view container (i.e. do not trigger the lookup process
    // once again in case a `ViewContainerRef` is created later).
    lContainer[DEHYDRATED_VIEWS] = retainedViews;
}
function removeDehydratedViewList(deferBlock) {
    const { lContainer } = deferBlock;
    const dehydratedViews = lContainer[DEHYDRATED_VIEWS];
    if (dehydratedViews === null)
        return;
    const parentLView = lContainer[PARENT];
    const renderer = parentLView[RENDERER];
    for (const view of dehydratedViews) {
        removeDehydratedView(view, renderer);
        ngDevMode && ngDevMode.dehydratedViewsRemoved++;
    }
}
/**
 * Helper function to remove all nodes from a dehydrated view.
 */
function removeDehydratedView(dehydratedView, renderer) {
    let nodesRemoved = 0;
    let currentRNode = dehydratedView.firstChild;
    if (currentRNode) {
        const numNodes = dehydratedView.data[NUM_ROOT_NODES];
        while (nodesRemoved < numNodes) {
            ngDevMode && validateSiblingNodeExists(currentRNode);
            const nextSibling = currentRNode.nextSibling;
            nativeRemoveNode(renderer, currentRNode, false);
            currentRNode = nextSibling;
            nodesRemoved++;
        }
    }
}
/**
 * Walks over all views within this LContainer invokes dehydrated views
 * cleanup function for each one.
 */
function cleanupLContainer(lContainer) {
    removeDehydratedViews(lContainer);
    // The host could be an LView if this container is on a component node.
    // In this case, descend into host LView for further cleanup. See also
    // LContainer[HOST] docs for additional information.
    const hostLView = lContainer[HOST];
    if (isLView(hostLView)) {
        cleanupLView(hostLView);
    }
    for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
        cleanupLView(lContainer[i]);
    }
}
/**
 * Walks over `LContainer`s and components registered within
 * this LView and invokes dehydrated views cleanup function for each one.
 */
function cleanupLView(lView) {
    cleanupI18nHydrationData(lView);
    const tView = lView[TVIEW];
    for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
        if (isLContainer(lView[i])) {
            const lContainer = lView[i];
            cleanupLContainer(lContainer);
        }
        else if (isLView(lView[i])) {
            // This is a component, enter the `cleanupLView` recursively.
            cleanupLView(lView[i]);
        }
    }
}
/**
 * Walks over all views registered within the ApplicationRef and removes
 * all dehydrated views from all `LContainer`s along the way.
 */
function cleanupDehydratedViews(appRef) {
    const viewRefs = appRef._views;
    for (const viewRef of viewRefs) {
        const lNode = getLNodeForHydration(viewRef);
        // An `lView` might be `null` if a `ViewRef` represents
        // an embedded view (not a component view).
        if (lNode !== null && lNode[HOST] !== null) {
            if (isLView(lNode)) {
                cleanupLView(lNode);
            }
            else {
                // Cleanup in all views within this view container
                cleanupLContainer(lNode);
            }
            ngDevMode && ngDevMode.dehydratedViewsCleanupRuns++;
        }
    }
}
/**
 * post hydration cleanup handling for defer blocks that were incrementally
 * hydrated. This removes all the jsaction attributes, timers, observers,
 * dehydrated views and containers
 */
function cleanupHydratedDeferBlocks(deferBlock, hydratedBlocks, registry, appRef) {
    if (deferBlock !== null) {
        registry.cleanup(hydratedBlocks);
        cleanupLContainer(deferBlock.lContainer);
        cleanupDehydratedViews(appRef);
    }
}

/**
 * Given a current DOM node and a serialized information about the views
 * in a container, walks over the DOM structure, collecting the list of
 * dehydrated views.
 */
function locateDehydratedViewsInContainer(currentRNode, serializedViews) {
    const dehydratedViews = [];
    for (const serializedView of serializedViews) {
        // Repeats a view multiple times as needed, based on the serialized information
        // (for example, for *ngFor-produced views).
        for (let i = 0; i < (serializedView[MULTIPLIER] ?? 1); i++) {
            const view = {
                data: serializedView,
                firstChild: null,
            };
            if (serializedView[NUM_ROOT_NODES] > 0) {
                // Keep reference to the first node in this view,
                // so it can be accessed while invoking template instructions.
                view.firstChild = currentRNode;
                // Move over to the next node after this view, which can
                // either be a first node of the next view or an anchor comment
                // node after the last view in a container.
                currentRNode = siblingAfter(serializedView[NUM_ROOT_NODES], currentRNode);
            }
            dehydratedViews.push(view);
        }
    }
    return [currentRNode, dehydratedViews];
}
/**
 * Reference to a function that searches for a matching dehydrated views
 * stored on a given lContainer.
 * Returns `null` by default, when hydration is not enabled.
 */
let _findMatchingDehydratedViewImpl = () => null;
/**
 * Retrieves the next dehydrated view from the LContainer and verifies that
 * it matches a given template id (from the TView that was used to create this
 * instance of a view). If the id doesn't match, that means that we are in an
 * unexpected state and can not complete the reconciliation process. Thus,
 * all dehydrated views from this LContainer are removed (including corresponding
 * DOM nodes) and the rendering is performed as if there were no dehydrated views
 * in this container.
 */
function findMatchingDehydratedViewImpl(lContainer, template) {
    const views = lContainer[DEHYDRATED_VIEWS];
    if (!template || views === null || views.length === 0) {
        return null;
    }
    const view = views[0];
    // Verify whether the first dehydrated view in the container matches
    // the template id passed to this function (that originated from a TView
    // that was used to create an instance of an embedded or component views.
    if (view.data[TEMPLATE_ID] === template) {
        // If the template id matches - extract the first view and return it.
        return views.shift();
    }
    else {
        // Otherwise, we are at the state when reconciliation can not be completed,
        // thus we remove all dehydrated views within this container (remove them
        // from internal data structures as well as delete associated elements from
        // the DOM tree).
        removeDehydratedViews(lContainer);
        return null;
    }
}
function enableFindMatchingDehydratedViewImpl() {
    _findMatchingDehydratedViewImpl = findMatchingDehydratedViewImpl;
}
function findMatchingDehydratedView(lContainer, template) {
    return _findMatchingDehydratedViewImpl(lContainer, template);
}

/**
 * Represents a component created by a `ComponentFactory`.
 * Provides access to the component instance and related objects,
 * and provides the means of destroying the instance.
 *
 * @publicApi
 */
let ComponentRef$1 = class ComponentRef {
};
/**
 * Base class for a factory that can create a component dynamically.
 * Instantiate a factory for a given type of component with `resolveComponentFactory()`.
 * Use the resulting `ComponentFactory.create()` method to create a component of that type.
 *
 * @publicApi
 *
 * @deprecated Angular no longer requires Component factories. Please use other APIs where
 *     Component class can be used directly.
 */
let ComponentFactory$1 = class ComponentFactory {
};

class _NullComponentFactoryResolver {
    resolveComponentFactory(component) {
        throw Error(`No component factory found for ${stringify(component)}.`);
    }
}
/**
 * A simple registry that maps `Components` to generated `ComponentFactory` classes
 * that can be used to create instances of components.
 * Use to obtain the factory for a given component type,
 * then use the factory's `create()` method to create a component of that type.
 *
 * Note: since v13, dynamic component creation via
 * [`ViewContainerRef.createComponent`](api/core/ViewContainerRef#createComponent)
 * does **not** require resolving component factory: component class can be used directly.
 *
 * @publicApi
 *
 * @deprecated Angular no longer requires Component factories. Please use other APIs where
 *     Component class can be used directly.
 */
let ComponentFactoryResolver$1 = class ComponentFactoryResolver {
    static NULL = new _NullComponentFactoryResolver();
};

/**
 * Creates and initializes a custom renderer that implements the `Renderer2` base class.
 *
 * @publicApi
 */
class RendererFactory2 {
}
/**
 * Extend this base class to implement custom rendering. By default, Angular
 * renders a template into DOM. You can use custom rendering to intercept
 * rendering calls, or to render to something other than DOM.
 *
 * <div class="docs-alert docs-alert-important">
 * <p>
 * Please be aware that usage of `Renderer2`, in context of accessing DOM elements, provides no
 * extra security which makes it equivalent to
 * {@link /best-practices/security#direct-use-of-the-dom-apis-and-explicit-sanitization-calls Security vulnerabilities}.
 * </p>
 * </div>
 *
 * Create your custom renderer using `RendererFactory2`.
 *
 * Use a custom renderer to bypass Angular's templating and
 * make custom UI changes that can't be expressed declaratively.
 * For example if you need to set a property or an attribute whose name is
 * not statically known, use the `setProperty()` or
 * `setAttribute()` method.
 *
 * @publicApi
 */
class Renderer2 {
    /**
     * If null or undefined, the view engine won't call it.
     * This is used as a performance optimization for production mode.
     */
    destroyNode = null;
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ELEMENT_ID__ = () => injectRenderer2();
}
/** Injects a Renderer2 for the current component. */
function injectRenderer2() {
    // We need the Renderer to be based on the component that it's being injected into, however since
    // DI happens before we've entered its view, `getLView` will return the parent view instead.
    const lView = getLView();
    const tNode = getCurrentTNode();
    const nodeAtIndex = getComponentLViewByIndex(tNode.index, lView);
    return (isLView(nodeAtIndex) ? nodeAtIndex : lView)[RENDERER];
}

/**
 * Sanitizer is used by the views to sanitize potentially dangerous values.
 *
 * @publicApi
 */
class Sanitizer {
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: Sanitizer,
        providedIn: 'root',
        factory: () => null,
    });
}

function isModuleWithProviders(value) {
    return value.ngModule !== undefined;
}
function isNgModule(value) {
    return !!getNgModuleDef(value);
}
function isPipe(value) {
    return !!getPipeDef$1(value);
}
function isDirective(value) {
    return !!getDirectiveDef(value);
}
function isComponent(value) {
    return !!getComponentDef(value);
}
function getDependencyTypeForError(type) {
    if (getComponentDef(type))
        return 'component';
    if (getDirectiveDef(type))
        return 'directive';
    if (getPipeDef$1(type))
        return 'pipe';
    return 'type';
}
function verifyStandaloneImport(depType, importingType) {
    if (isForwardRef(depType)) {
        depType = resolveForwardRef(depType);
        if (!depType) {
            throw new Error(`Expected forwardRef function, imported from "${stringifyForError(importingType)}", to return a standalone entity or NgModule but got "${stringifyForError(depType) || depType}".`);
        }
    }
    if (getNgModuleDef(depType) == null) {
        const def = getComponentDef(depType) || getDirectiveDef(depType) || getPipeDef$1(depType);
        if (def != null) {
            // if a component, directive or pipe is imported make sure that it is standalone
            if (!def.standalone) {
                throw new Error(`The "${stringifyForError(depType)}" ${getDependencyTypeForError(depType)}, imported from "${stringifyForError(importingType)}", is not standalone. Did you forget to add the standalone: true flag?`);
            }
        }
        else {
            // it can be either a module with provider or an unknown (not annotated) type
            if (isModuleWithProviders(depType)) {
                throw new Error(`A module with providers was imported from "${stringifyForError(importingType)}". Modules with providers are not supported in standalone components imports.`);
            }
            else {
                throw new Error(`The "${stringifyForError(depType)}" type, imported from "${stringifyForError(importingType)}", must be a standalone component / directive / pipe or an NgModule. Did you forget to add the required @Component / @Directive / @Pipe or @NgModule annotation?`);
            }
        }
    }
}

/**
 * Indicates whether to use the runtime dependency tracker for scope calculation in JIT compilation.
 * The value "false" means the old code path based on patching scope info into the types will be
 * used.
 *
 * @deprecated For migration purposes only, to be removed soon.
 */
const USE_RUNTIME_DEPS_TRACKER_FOR_JIT = true;
/**
 * An implementation of DepsTrackerApi which will be used for JIT and local compilation.
 */
class DepsTracker {
    ownerNgModule = new Map();
    ngModulesWithSomeUnresolvedDecls = new Set();
    ngModulesScopeCache = new Map();
    standaloneComponentsScopeCache = new Map();
    /**
     * Attempts to resolve ng module's forward ref declarations as much as possible and add them to
     * the `ownerNgModule` map. This method normally should be called after the initial parsing when
     * all the forward refs are resolved (e.g., when trying to render a component)
     */
    resolveNgModulesDecls() {
        if (this.ngModulesWithSomeUnresolvedDecls.size === 0) {
            return;
        }
        for (const moduleType of this.ngModulesWithSomeUnresolvedDecls) {
            const def = getNgModuleDef(moduleType);
            if (def?.declarations) {
                for (const decl of maybeUnwrapFn(def.declarations)) {
                    if (isComponent(decl)) {
                        this.ownerNgModule.set(decl, moduleType);
                    }
                }
            }
        }
        this.ngModulesWithSomeUnresolvedDecls.clear();
    }
    /** @override */
    getComponentDependencies(type, rawImports) {
        this.resolveNgModulesDecls();
        const def = getComponentDef(type);
        if (def === null) {
            throw new Error(`Attempting to get component dependencies for a type that is not a component: ${type}`);
        }
        if (def.standalone) {
            const scope = this.getStandaloneComponentScope(type, rawImports);
            if (scope.compilation.isPoisoned) {
                return { dependencies: [] };
            }
            return {
                dependencies: [
                    ...scope.compilation.directives,
                    ...scope.compilation.pipes,
                    ...scope.compilation.ngModules,
                ],
            };
        }
        else {
            if (!this.ownerNgModule.has(type)) {
                // This component is orphan! No need to handle the error since the component rendering
                // pipeline (e.g., view_container_ref) will check for this error based on configs.
                return { dependencies: [] };
            }
            const scope = this.getNgModuleScope(this.ownerNgModule.get(type));
            if (scope.compilation.isPoisoned) {
                return { dependencies: [] };
            }
            return {
                dependencies: [...scope.compilation.directives, ...scope.compilation.pipes],
            };
        }
    }
    /**
     * @override
     * This implementation does not make use of param scopeInfo since it assumes the scope info is
     * already added to the type itself through methods like {@link ɵɵsetNgModuleScope}
     */
    registerNgModule(type, scopeInfo) {
        if (!isNgModule(type)) {
            throw new Error(`Attempting to register a Type which is not NgModule as NgModule: ${type}`);
        }
        // Lazily process the NgModules later when needed.
        this.ngModulesWithSomeUnresolvedDecls.add(type);
    }
    /** @override */
    clearScopeCacheFor(type) {
        this.ngModulesScopeCache.delete(type);
        this.standaloneComponentsScopeCache.delete(type);
    }
    /** @override */
    getNgModuleScope(type) {
        if (this.ngModulesScopeCache.has(type)) {
            return this.ngModulesScopeCache.get(type);
        }
        const scope = this.computeNgModuleScope(type);
        this.ngModulesScopeCache.set(type, scope);
        return scope;
    }
    /** Compute NgModule scope afresh. */
    computeNgModuleScope(type) {
        const def = getNgModuleDef(type, true);
        const scope = {
            exported: { directives: new Set(), pipes: new Set() },
            compilation: { directives: new Set(), pipes: new Set() },
        };
        // Analyzing imports
        for (const imported of maybeUnwrapFn(def.imports)) {
            if (isNgModule(imported)) {
                const importedScope = this.getNgModuleScope(imported);
                // When this module imports another, the imported module's exported directives and pipes
                // are added to the compilation scope of this module.
                addSet(importedScope.exported.directives, scope.compilation.directives);
                addSet(importedScope.exported.pipes, scope.compilation.pipes);
            }
            else if (isStandalone(imported)) {
                if (isDirective(imported) || isComponent(imported)) {
                    scope.compilation.directives.add(imported);
                }
                else if (isPipe(imported)) {
                    scope.compilation.pipes.add(imported);
                }
                else {
                    // The standalone thing is neither a component nor a directive nor a pipe ... (what?)
                    throw new RuntimeError(980 /* RuntimeErrorCode.RUNTIME_DEPS_INVALID_IMPORTED_TYPE */, 'The standalone imported type is neither a component nor a directive nor a pipe');
                }
            }
            else {
                // The import is neither a module nor a module-with-providers nor a standalone thing. This
                // is going to be an error. So we short circuit.
                scope.compilation.isPoisoned = true;
                break;
            }
        }
        // Analyzing declarations
        if (!scope.compilation.isPoisoned) {
            for (const decl of maybeUnwrapFn(def.declarations)) {
                // Cannot declare another NgModule or a standalone thing
                if (isNgModule(decl) || isStandalone(decl)) {
                    scope.compilation.isPoisoned = true;
                    break;
                }
                if (isPipe(decl)) {
                    scope.compilation.pipes.add(decl);
                }
                else {
                    // decl is either a directive or a component. The component may not yet have the ɵcmp due
                    // to async compilation.
                    scope.compilation.directives.add(decl);
                }
            }
        }
        // Analyzing exports
        for (const exported of maybeUnwrapFn(def.exports)) {
            if (isNgModule(exported)) {
                // When this module exports another, the exported module's exported directives and pipes
                // are added to both the compilation and exported scopes of this module.
                const exportedScope = this.getNgModuleScope(exported);
                // Based on the current logic there is no way to have poisoned exported scope. So no need to
                // check for it.
                addSet(exportedScope.exported.directives, scope.exported.directives);
                addSet(exportedScope.exported.pipes, scope.exported.pipes);
                // Some test toolings which run in JIT mode depend on this behavior that the exported scope
                // should also be present in the compilation scope, even though AoT does not support this
                // and it is also in odds with NgModule metadata definitions. Without this some tests in
                // Google will fail.
                addSet(exportedScope.exported.directives, scope.compilation.directives);
                addSet(exportedScope.exported.pipes, scope.compilation.pipes);
            }
            else if (isPipe(exported)) {
                scope.exported.pipes.add(exported);
            }
            else {
                scope.exported.directives.add(exported);
            }
        }
        return scope;
    }
    /** @override */
    getStandaloneComponentScope(type, rawImports) {
        if (this.standaloneComponentsScopeCache.has(type)) {
            return this.standaloneComponentsScopeCache.get(type);
        }
        const ans = this.computeStandaloneComponentScope(type, rawImports);
        this.standaloneComponentsScopeCache.set(type, ans);
        return ans;
    }
    computeStandaloneComponentScope(type, rawImports) {
        const ans = {
            compilation: {
                // Standalone components are always able to self-reference.
                directives: new Set([type]),
                pipes: new Set(),
                ngModules: new Set(),
            },
        };
        for (const rawImport of flatten(rawImports ?? [])) {
            const imported = resolveForwardRef(rawImport);
            try {
                verifyStandaloneImport(imported, type);
            }
            catch (e) {
                // Short-circuit if an import is not valid
                ans.compilation.isPoisoned = true;
                return ans;
            }
            if (isNgModule(imported)) {
                ans.compilation.ngModules.add(imported);
                const importedScope = this.getNgModuleScope(imported);
                // Short-circuit if an imported NgModule has corrupted exported scope.
                if (importedScope.exported.isPoisoned) {
                    ans.compilation.isPoisoned = true;
                    return ans;
                }
                addSet(importedScope.exported.directives, ans.compilation.directives);
                addSet(importedScope.exported.pipes, ans.compilation.pipes);
            }
            else if (isPipe(imported)) {
                ans.compilation.pipes.add(imported);
            }
            else if (isDirective(imported) || isComponent(imported)) {
                ans.compilation.directives.add(imported);
            }
            else {
                // The imported thing is not module/pipe/directive/component, so we error and short-circuit
                // here
                ans.compilation.isPoisoned = true;
                return ans;
            }
        }
        return ans;
    }
    /** @override */
    isOrphanComponent(cmp) {
        const def = getComponentDef(cmp);
        if (!def || def.standalone) {
            return false;
        }
        this.resolveNgModulesDecls();
        return !this.ownerNgModule.has(cmp);
    }
}
function addSet(sourceSet, targetSet) {
    for (const m of sourceSet) {
        targetSet.add(m);
    }
}
/** The deps tracker to be used in the current Angular app in dev mode. */
const depsTracker = new DepsTracker();

// This default value is when checking the hierarchy for a token.
//
// It means both:
// - the token is not provided by the current injector,
// - only the element injectors should be checked (ie do not check module injectors
//
//          mod1
//         /
//       el1   mod2
//         \  /
//         el2
//
// When requesting el2.injector.get(token), we should check in the following order and return the
// first found value:
// - el2.injector.get(token, default)
// - el1.injector.get(token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR) -> do not check the module
// - mod2.injector.get(token, default)
const NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR = {};

/**
 * Injector that looks up a value using a specific injector, before falling back to the module
 * injector. Used primarily when creating components or embedded views dynamically.
 */
class ChainedInjector {
    injector;
    parentInjector;
    constructor(injector, parentInjector) {
        this.injector = injector;
        this.parentInjector = parentInjector;
    }
    get(token, notFoundValue, flags) {
        flags = convertToBitFlags(flags);
        const value = this.injector.get(token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, flags);
        if (value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR ||
            notFoundValue === NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR) {
            // Return the value from the root element injector when
            // - it provides it
            //   (value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR)
            // - the module injector should not be checked
            //   (notFoundValue === NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR)
            return value;
        }
        return this.parentInjector.get(token, notFoundValue, flags);
    }
}

/**
 * Compute the static styling (class/style) from `TAttributes`.
 *
 * This function should be called during `firstCreatePass` only.
 *
 * @param tNode The `TNode` into which the styling information should be loaded.
 * @param attrs `TAttributes` containing the styling information.
 * @param writeToHost Where should the resulting static styles be written?
 *   - `false` Write to `TNode.stylesWithoutHost` / `TNode.classesWithoutHost`
 *   - `true` Write to `TNode.styles` / `TNode.classes`
 */
function computeStaticStyling(tNode, attrs, writeToHost) {
    ngDevMode &&
        assertFirstCreatePass(getTView(), 'Expecting to be called in first template pass only');
    let styles = writeToHost ? tNode.styles : null;
    let classes = writeToHost ? tNode.classes : null;
    let mode = 0;
    if (attrs !== null) {
        for (let i = 0; i < attrs.length; i++) {
            const value = attrs[i];
            if (typeof value === 'number') {
                mode = value;
            }
            else if (mode == 1 /* AttributeMarker.Classes */) {
                classes = concatStringsWithSpace(classes, value);
            }
            else if (mode == 2 /* AttributeMarker.Styles */) {
                const style = value;
                const styleValue = attrs[++i];
                styles = concatStringsWithSpace(styles, style + ': ' + styleValue + ';');
            }
        }
    }
    writeToHost ? (tNode.styles = styles) : (tNode.stylesWithoutHost = styles);
    writeToHost ? (tNode.classes = classes) : (tNode.classesWithoutHost = classes);
}

function ɵɵdirectiveInject(token, flags = InjectFlags.Default) {
    const lView = getLView();
    // Fall back to inject() if view hasn't been created. This situation can happen in tests
    // if inject utilities are used before bootstrapping.
    if (lView === null) {
        // Verify that we will not get into infinite loop.
        ngDevMode && assertInjectImplementationNotEqual(ɵɵdirectiveInject);
        return ɵɵinject(token, flags);
    }
    const tNode = getCurrentTNode();
    const value = getOrCreateInjectable(tNode, lView, resolveForwardRef(token), flags);
    ngDevMode && emitInjectEvent(token, value, flags);
    return value;
}
/**
 * Throws an error indicating that a factory function could not be generated by the compiler for a
 * particular class.
 *
 * This instruction allows the actual error message to be optimized away when ngDevMode is turned
 * off, saving bytes of generated code while still providing a good experience in dev mode.
 *
 * The name of the class is not mentioned here, but will be in the generated factory function name
 * and thus in the stack trace.
 *
 * @codeGenApi
 */
function ɵɵinvalidFactory() {
    const msg = ngDevMode
        ? `This constructor was not compatible with Dependency Injection.`
        : 'invalid';
    throw new Error(msg);
}

/**
 * Resolve the matched directives on a node.
 */
function resolveDirectives(tView, lView, tNode, localRefs, directiveMatcher) {
    // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in tsickle.
    ngDevMode && assertFirstCreatePass(tView);
    const exportsMap = localRefs === null ? null : { '': -1 };
    const matchedDirectiveDefs = directiveMatcher(tView, tNode);
    if (matchedDirectiveDefs !== null) {
        let directiveDefs;
        let hostDirectiveDefs = null;
        let hostDirectiveRanges = null;
        const hostDirectiveResolution = resolveHostDirectives(matchedDirectiveDefs);
        if (hostDirectiveResolution === null) {
            directiveDefs = matchedDirectiveDefs;
        }
        else {
            [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] = hostDirectiveResolution;
        }
        initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs, hostDirectiveRanges);
    }
    if (exportsMap !== null && localRefs !== null) {
        cacheMatchingLocalNames(tNode, localRefs, exportsMap);
    }
}
/** Caches local names and their matching directive indices for query and template lookups. */
function cacheMatchingLocalNames(tNode, localRefs, exportsMap) {
    const localNames = (tNode.localNames = []);
    // Local names must be stored in tNode in the same order that localRefs are defined
    // in the template to ensure the data is loaded in the same slots as their refs
    // in the template (for template queries).
    for (let i = 0; i < localRefs.length; i += 2) {
        const index = exportsMap[localRefs[i + 1]];
        if (index == null)
            throw new RuntimeError(-301 /* RuntimeErrorCode.EXPORT_NOT_FOUND */, ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`);
        localNames.push(localRefs[i], index);
    }
}
function resolveHostDirectives(matches) {
    let componentDef = null;
    let hasHostDirectives = false;
    for (let i = 0; i < matches.length; i++) {
        const def = matches[i];
        if (i === 0 && isComponentDef(def)) {
            componentDef = def;
        }
        if (def.findHostDirectiveDefs !== null) {
            hasHostDirectives = true;
            break;
        }
    }
    if (!hasHostDirectives) {
        return null;
    }
    let allDirectiveDefs = null;
    let hostDirectiveDefs = null;
    let hostDirectiveRanges = null;
    // Components are inserted at the front of the matches array so that their lifecycle
    // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine
    // compatibility. This logic doesn't make sense with host directives, because it
    // would allow the host directives to undo any overrides the host may have made.
    // To handle this case, the host directives of components are inserted at the beginning
    // of the array, followed by the component. As such, the insertion order is as follows:
    // 1. Host directives belonging to the selector-matched component.
    // 2. Selector-matched component.
    // 3. Host directives belonging to selector-matched directives.
    // 4. Selector-matched dir
    for (const def of matches) {
        if (def.findHostDirectiveDefs !== null) {
            allDirectiveDefs ??= [];
            hostDirectiveDefs ??= new Map();
            hostDirectiveRanges ??= new Map();
            resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs);
        }
        // Component definition needs to be pushed early to maintain the correct ordering.
        if (def === componentDef) {
            allDirectiveDefs ??= [];
            allDirectiveDefs.push(def);
        }
    }
    if (allDirectiveDefs !== null) {
        allDirectiveDefs.push(...(componentDef === null ? matches : matches.slice(1)));
        ngDevMode && assertNoDuplicateDirectives(allDirectiveDefs);
        return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges];
    }
    return null;
}
function resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs) {
    ngDevMode && assertDefined(def.findHostDirectiveDefs, 'Expected host directive resolve function');
    const start = allDirectiveDefs.length;
    // TODO(pk): probably could return matches instead of taking in an array to fill in?
    def.findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
    // Note that these indexes are within the offset by `directiveStart`. We can't do the
    // offsetting here, because `directiveStart` hasn't been initialized on the TNode yet.
    hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]);
}
/**
 * Marks a given TNode as a component's host. This consists of:
 * - setting the component offset on the TNode.
 * - storing index of component's host element so it will be queued for view refresh during CD.
 */
function markAsComponentHost(tView, hostTNode, componentOffset) {
    ngDevMode && assertFirstCreatePass(tView);
    ngDevMode && assertGreaterThan(componentOffset, -1, 'componentOffset must be great than -1');
    hostTNode.componentOffset = componentOffset;
    (tView.components ??= []).push(hostTNode.index);
}
/** Initializes the data structures necessary for a list of directives to be instantiated. */
function initializeDirectives(tView, lView, tNode, directives, exportsMap, hostDirectiveDefs, hostDirectiveRanges) {
    ngDevMode && assertFirstCreatePass(tView);
    const directivesLength = directives.length;
    let hasSeenComponent = false;
    // Publishes the directive types to DI so they can be injected. Needs to
    // happen in a separate pass before the TNode flags have been initialized.
    for (let i = 0; i < directivesLength; i++) {
        const def = directives[i];
        if (!hasSeenComponent && isComponentDef(def)) {
            hasSeenComponent = true;
            markAsComponentHost(tView, tNode, i);
        }
        diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, def.type);
    }
    initTNodeFlags(tNode, tView.data.length, directivesLength);
    // When the same token is provided by several directives on the same node, some rules apply in
    // the viewEngine:
    // - viewProviders have priority over providers
    // - the last directive in NgModule.declarations has priority over the previous one
    // So to match these rules, the order in which providers are added in the arrays is very
    // important.
    for (let i = 0; i < directivesLength; i++) {
        const def = directives[i];
        if (def.providersResolver)
            def.providersResolver(def);
    }
    let preOrderHooksFound = false;
    let preOrderCheckHooksFound = false;
    let directiveIdx = allocExpando(tView, lView, directivesLength, null);
    ngDevMode &&
        assertSame(directiveIdx, tNode.directiveStart, 'TNode.directiveStart should point to just allocated space');
    // If there's at least one directive, we'll have to track it so initialize the map.
    if (directivesLength > 0) {
        tNode.directiveToIndex = new Map();
    }
    for (let i = 0; i < directivesLength; i++) {
        const def = directives[i];
        // Merge the attrs in the order of matches. This assumes that the first directive is the
        // component itself, so that the component has the least priority.
        tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs);
        configureViewWithDirective(tView, tNode, lView, directiveIdx, def);
        saveNameToExportMap(directiveIdx, def, exportsMap);
        // If a directive has host directives, we need to track both its index and the range within
        // the host directives are declared. Host directives are not tracked, but should be resolved
        // by looking up the host and getting its indexes from there.
        if (hostDirectiveRanges !== null && hostDirectiveRanges.has(def)) {
            const [start, end] = hostDirectiveRanges.get(def);
            tNode.directiveToIndex.set(def.type, [
                directiveIdx,
                start + tNode.directiveStart,
                end + tNode.directiveStart,
            ]);
        }
        else if (hostDirectiveDefs === null || !hostDirectiveDefs.has(def)) {
            tNode.directiveToIndex.set(def.type, directiveIdx);
        }
        if (def.contentQueries !== null)
            tNode.flags |= 4 /* TNodeFlags.hasContentQuery */;
        if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0)
            tNode.flags |= 64 /* TNodeFlags.hasHostBindings */;
        const lifeCycleHooks = def.type.prototype;
        // Only push a node index into the pr   eOrderHooks array if this is the first
        // pre-order hook found on this node.
        if (!preOrderHooksFound &&
            (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngOnInit || lifeCycleHooks.ngDoCheck)) {
            // We will push the actual hook function into this array later during dir instantiation.
            // We cannot do it now because we must ensure hooks are registered in the same
            // order that directives are created (i.e. injection order).
            (tView.preOrderHooks ??= []).push(tNode.index);
            preOrderHooksFound = true;
        }
        if (!preOrderCheckHooksFound && (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngDoCheck)) {
            (tView.preOrderCheckHooks ??= []).push(tNode.index);
            preOrderCheckHooksFound = true;
        }
        directiveIdx++;
    }
    initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs);
}
/**
 * Initializes data structures required to work with directive inputs and outputs.
 * Initialization is done for all directives matched on a given TNode.
 */
function initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs) {
    ngDevMode && assertFirstCreatePass(tView);
    for (let index = tNode.directiveStart; index < tNode.directiveEnd; index++) {
        const directiveDef = tView.data[index];
        if (hostDirectiveDefs === null || !hostDirectiveDefs.has(directiveDef)) {
            setupSelectorMatchedInputsOrOutputs(0 /* BindingType.Inputs */, tNode, directiveDef, index);
            setupSelectorMatchedInputsOrOutputs(1 /* BindingType.Outputs */, tNode, directiveDef, index);
            setupInitialInputs(tNode, index, false);
        }
        else {
            const hostDirectiveDef = hostDirectiveDefs.get(directiveDef);
            setupHostDirectiveInputsOrOutputs(0 /* BindingType.Inputs */, tNode, hostDirectiveDef, index);
            setupHostDirectiveInputsOrOutputs(1 /* BindingType.Outputs */, tNode, hostDirectiveDef, index);
            setupInitialInputs(tNode, index, true);
        }
    }
}
/**
 * Sets up the input/output bindings for a directive that was matched in the template through its
 * selector. This method is called repeatedly to build up all of the available inputs on a node.
 *
 * @param mode Whether inputs or outputs are being contructed.
 * @param tNode Node on which the bindings are being set up.
 * @param def Directive definition for which the bindings are being set up.
 * @param directiveIndex Index at which the directive instance will be stored in the LView.
 */
function setupSelectorMatchedInputsOrOutputs(mode, tNode, def, directiveIndex) {
    const aliasMap = mode === 0 /* BindingType.Inputs */ ? def.inputs : def.outputs;
    for (const publicName in aliasMap) {
        if (aliasMap.hasOwnProperty(publicName)) {
            let bindings;
            if (mode === 0 /* BindingType.Inputs */) {
                bindings = tNode.inputs ??= {};
            }
            else {
                bindings = tNode.outputs ??= {};
            }
            bindings[publicName] ??= [];
            bindings[publicName].push(directiveIndex);
            setShadowStylingInputFlags(tNode, publicName);
        }
    }
}
/**
 * Sets up input/output bindings that were defined through host directives on a specific node.
 * @param mode Whether inputs or outputs are being contructed.
 * @param tNode Node on which the bindings are being set up.
 * @param config Host directive definition that is being set up.
 * @param directiveIndex Index at which the directive instance will be stored in the LView.
 */
function setupHostDirectiveInputsOrOutputs(mode, tNode, config, directiveIndex) {
    const aliasMap = mode === 0 /* BindingType.Inputs */ ? config.inputs : config.outputs;
    for (const initialName in aliasMap) {
        if (aliasMap.hasOwnProperty(initialName)) {
            const publicName = aliasMap[initialName];
            let bindings;
            if (mode === 0 /* BindingType.Inputs */) {
                bindings = tNode.hostDirectiveInputs ??= {};
            }
            else {
                bindings = tNode.hostDirectiveOutputs ??= {};
            }
            bindings[publicName] ??= [];
            bindings[publicName].push(directiveIndex, initialName);
            setShadowStylingInputFlags(tNode, publicName);
        }
    }
}
function setShadowStylingInputFlags(tNode, publicName) {
    if (publicName === 'class') {
        tNode.flags |= 8 /* TNodeFlags.hasClassInput */;
    }
    else if (publicName === 'style') {
        tNode.flags |= 16 /* TNodeFlags.hasStyleInput */;
    }
}
/**
 * Sets up the initialInputData for a node and stores it in the template's static storage
 * so subsequent template invocations don't have to recalculate it.
 *
 * initialInputData is an array containing values that need to be set as input properties
 * for directives on this node, but only once on creation. We need this array to support
 * the case where you set an @Input property of a directive using attribute-like syntax.
 * e.g. if you have a `name` @Input, you can set it once like this:
 *
 * <my-component name="Bess"></my-component>
 *
 * @param tNode TNode on which to set up the initial inputs.
 * @param directiveIndex Index of the directive that is currently being processed.
 */
function setupInitialInputs(tNode, directiveIndex, isHostDirective) {
    const { attrs, inputs, hostDirectiveInputs } = tNode;
    if (attrs === null ||
        (!isHostDirective && inputs === null) ||
        (isHostDirective && hostDirectiveInputs === null) ||
        // Do not use unbound attributes as inputs to structural directives, since structural
        // directive inputs can only be set using microsyntax (e.g. `<div *dir="exp">`).
        isInlineTemplate(tNode)) {
        tNode.initialInputs ??= [];
        tNode.initialInputs.push(null);
        return;
    }
    let inputsToStore = null;
    let i = 0;
    while (i < attrs.length) {
        const attrName = attrs[i];
        if (attrName === 0 /* AttributeMarker.NamespaceURI */) {
            // We do not allow inputs on namespaced attributes.
            i += 4;
            continue;
        }
        else if (attrName === 5 /* AttributeMarker.ProjectAs */) {
            // Skip over the `ngProjectAs` value.
            i += 2;
            continue;
        }
        else if (typeof attrName === 'number') {
            // If we hit any other attribute markers, we're done anyway. None of those are valid inputs.
            break;
        }
        if (!isHostDirective && inputs.hasOwnProperty(attrName)) {
            // Find the input's public name from the input store. Note that we can be found easier
            // through the directive def, but we want to do it using the inputs store so that it can
            // account for host directive aliases.
            const inputConfig = inputs[attrName];
            for (const index of inputConfig) {
                if (index === directiveIndex) {
                    inputsToStore ??= [];
                    inputsToStore.push(attrName, attrs[i + 1]);
                    // A directive can't have multiple inputs with the same name so we can break here.
                    break;
                }
            }
        }
        else if (isHostDirective && hostDirectiveInputs.hasOwnProperty(attrName)) {
            const config = hostDirectiveInputs[attrName];
            for (let j = 0; j < config.length; j += 2) {
                if (config[j] === directiveIndex) {
                    inputsToStore ??= [];
                    inputsToStore.push(config[j + 1], attrs[i + 1]);
                    break;
                }
            }
        }
        i += 2;
    }
    tNode.initialInputs ??= [];
    tNode.initialInputs.push(inputsToStore);
}
/**
 * Setup directive for instantiation.
 *
 * We need to create a `NodeInjectorFactory` which is then inserted in both the `Blueprint` as well
 * as `LView`. `TView` gets the `DirectiveDef`.
 *
 * @param tView `TView`
 * @param tNode `TNode`
 * @param lView `LView`
 * @param directiveIndex Index where the directive will be stored in the Expando.
 * @param def `DirectiveDef`
 */
function configureViewWithDirective(tView, tNode, lView, directiveIndex, def) {
    ngDevMode &&
        assertGreaterThanOrEqual(directiveIndex, HEADER_OFFSET, 'Must be in Expando section');
    tView.data[directiveIndex] = def;
    const directiveFactory = def.factory || (def.factory = getFactoryDef(def.type, true));
    // Even though `directiveFactory` will already be using `ɵɵdirectiveInject` in its generated code,
    // we also want to support `inject()` directly from the directive constructor context so we set
    // `ɵɵdirectiveInject` as the inject implementation here too.
    const nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), ɵɵdirectiveInject);
    tView.blueprint[directiveIndex] = nodeInjectorFactory;
    lView[directiveIndex] = nodeInjectorFactory;
    registerHostBindingOpCodes(tView, tNode, directiveIndex, allocExpando(tView, lView, def.hostVars, NO_CHANGE), def);
}
/**
 * Add `hostBindings` to the `TView.hostBindingOpCodes`.
 *
 * @param tView `TView` to which the `hostBindings` should be added.
 * @param tNode `TNode` the element which contains the directive
 * @param directiveIdx Directive index in view.
 * @param directiveVarsIdx Where will the directive's vars be stored
 * @param def `ComponentDef`/`DirectiveDef`, which contains the `hostVars`/`hostBindings` to add.
 */
function registerHostBindingOpCodes(tView, tNode, directiveIdx, directiveVarsIdx, def) {
    ngDevMode && assertFirstCreatePass(tView);
    const hostBindings = def.hostBindings;
    if (hostBindings) {
        let hostBindingOpCodes = tView.hostBindingOpCodes;
        if (hostBindingOpCodes === null) {
            hostBindingOpCodes = tView.hostBindingOpCodes = [];
        }
        const elementIndx = ~tNode.index;
        if (lastSelectedElementIdx(hostBindingOpCodes) != elementIndx) {
            // Conditionally add select element so that we are more efficient in execution.
            // NOTE: this is strictly not necessary and it trades code size for runtime perf.
            // (We could just always add it.)
            hostBindingOpCodes.push(elementIndx);
        }
        hostBindingOpCodes.push(directiveIdx, directiveVarsIdx, hostBindings);
    }
}
/**
 * Returns the last selected element index in the `HostBindingOpCodes`
 *
 * For perf reasons we don't need to update the selected element index in `HostBindingOpCodes` only
 * if it changes. This method returns the last index (or '0' if not found.)
 *
 * Selected element index are only the ones which are negative.
 */
function lastSelectedElementIdx(hostBindingOpCodes) {
    let i = hostBindingOpCodes.length;
    while (i > 0) {
        const value = hostBindingOpCodes[--i];
        if (typeof value === 'number' && value < 0) {
            return value;
        }
    }
    return 0;
}
/**
 * Builds up an export map as directives are created, so local refs can be quickly mapped
 * to their directive instances.
 */
function saveNameToExportMap(directiveIdx, def, exportsMap) {
    if (exportsMap) {
        if (def.exportAs) {
            for (let i = 0; i < def.exportAs.length; i++) {
                exportsMap[def.exportAs[i]] = directiveIdx;
            }
        }
        if (isComponentDef(def))
            exportsMap[''] = directiveIdx;
    }
}
/**
 * Initializes the flags on the current node, setting all indices to the initial index,
 * the directive count to 0, and adding the isComponent flag.
 * @param index the initial index
 */
function initTNodeFlags(tNode, index, numberOfDirectives) {
    ngDevMode &&
        assertNotEqual(numberOfDirectives, tNode.directiveEnd - tNode.directiveStart, 'Reached the max number of directives');
    tNode.flags |= 1 /* TNodeFlags.isDirectiveHost */;
    // When the first directive is created on a node, save the index
    tNode.directiveStart = index;
    tNode.directiveEnd = index + numberOfDirectives;
    tNode.providerIndexes = index;
}
function assertNoDuplicateDirectives(directives) {
    // The array needs at least two elements in order to have duplicates.
    if (directives.length < 2) {
        return;
    }
    const seenDirectives = new Set();
    for (const current of directives) {
        if (seenDirectives.has(current)) {
            throw new RuntimeError(309 /* RuntimeErrorCode.DUPLICATE_DIRECTIVE */, `Directive ${current.type.name} matches multiple times on the same element. ` +
                `Directives can only match an element once.`);
        }
        seenDirectives.add(current);
    }
}

function elementStartFirstCreatePass(index, tView, lView, name, directiveMatcher, bindingsEnabled, attrsIndex, localRefsIndex) {
    ngDevMode && assertFirstCreatePass(tView);
    ngDevMode && ngDevMode.firstCreatePass++;
    const tViewConsts = tView.consts;
    const attrs = getConstant(tViewConsts, attrsIndex);
    const tNode = getOrCreateTNode(tView, index, 2 /* TNodeType.Element */, name, attrs);
    if (bindingsEnabled) {
        resolveDirectives(tView, lView, tNode, getConstant(tViewConsts, localRefsIndex), directiveMatcher);
    }
    // Merge the template attrs last so that they have the highest priority.
    tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);
    if (tNode.attrs !== null) {
        computeStaticStyling(tNode, tNode.attrs, false);
    }
    if (tNode.mergedAttrs !== null) {
        computeStaticStyling(tNode, tNode.mergedAttrs, true);
    }
    if (tView.queries !== null) {
        tView.queries.elementStart(tView, tNode);
    }
    return tNode;
}
function elementEndFirstCreatePass(tView, tNode) {
    ngDevMode && assertFirstCreatePass(tView);
    registerPostOrderHooks(tView, tNode);
    if (isContentQueryHost(tNode)) {
        tView.queries.elementEnd(tNode);
    }
}

class ComponentFactoryResolver extends ComponentFactoryResolver$1 {
    ngModule;
    /**
     * @param ngModule The NgModuleRef to which all resolved factories are bound.
     */
    constructor(ngModule) {
        super();
        this.ngModule = ngModule;
    }
    resolveComponentFactory(component) {
        ngDevMode && assertComponentType(component);
        const componentDef = getComponentDef(component);
        return new ComponentFactory(componentDef, this.ngModule);
    }
}
function toInputRefArray(map) {
    return Object.keys(map).map((name) => {
        const [propName, flags, transform] = map[name];
        const inputData = {
            propName: propName,
            templateName: name,
            isSignal: (flags & InputFlags.SignalBased) !== 0,
        };
        if (transform) {
            inputData.transform = transform;
        }
        return inputData;
    });
}
function toOutputRefArray(map) {
    return Object.keys(map).map((name) => ({ propName: map[name], templateName: name }));
}
function verifyNotAnOrphanComponent(componentDef) {
    // TODO(pk): create assert that verifies ngDevMode
    if ((typeof ngJitMode === 'undefined' || ngJitMode) &&
        componentDef.debugInfo?.forbidOrphanRendering) {
        if (depsTracker.isOrphanComponent(componentDef.type)) {
            throw new RuntimeError(981 /* RuntimeErrorCode.RUNTIME_DEPS_ORPHAN_COMPONENT */, `Orphan component found! Trying to render the component ${debugStringifyTypeForError(componentDef.type)} without first loading the NgModule that declares it. It is recommended to make this component standalone in order to avoid this error. If this is not possible now, import the component's NgModule in the appropriate NgModule, or the standalone component in which you are trying to render this component. If this is a lazy import, load the NgModule lazily as well and use its module injector.`);
        }
    }
}
function createRootViewInjector(componentDef, environmentInjector, injector) {
    let realEnvironmentInjector = environmentInjector instanceof EnvironmentInjector
        ? environmentInjector
        : environmentInjector?.injector;
    if (realEnvironmentInjector && componentDef.getStandaloneInjector !== null) {
        realEnvironmentInjector =
            componentDef.getStandaloneInjector(realEnvironmentInjector) || realEnvironmentInjector;
    }
    const rootViewInjector = realEnvironmentInjector
        ? new ChainedInjector(injector, realEnvironmentInjector)
        : injector;
    return rootViewInjector;
}
function createRootLViewEnvironment(rootLViewInjector) {
    const rendererFactory = rootLViewInjector.get(RendererFactory2, null);
    if (rendererFactory === null) {
        throw new RuntimeError(407 /* RuntimeErrorCode.RENDERER_NOT_FOUND */, ngDevMode &&
            'Angular was not able to inject a renderer (RendererFactory2). ' +
                'Likely this is due to a broken DI hierarchy. ' +
                'Make sure that any injector used to create this component has a correct parent.');
    }
    const sanitizer = rootLViewInjector.get(Sanitizer, null);
    const changeDetectionScheduler = rootLViewInjector.get(ChangeDetectionScheduler, null);
    return {
        rendererFactory,
        sanitizer,
        changeDetectionScheduler,
    };
}
function createHostElement(componentDef, render) {
    // Determine a tag name used for creating host elements when this component is created
    // dynamically. Default to 'div' if this component did not specify any tag name in its
    // selector.
    const tagName = (componentDef.selectors[0][0] || 'div').toLowerCase();
    const namespace = tagName === 'svg' ? SVG_NAMESPACE : tagName === 'math' ? MATH_ML_NAMESPACE : null;
    return createElementNode(render, tagName, namespace);
}
/**
 * ComponentFactory interface implementation.
 */
class ComponentFactory extends ComponentFactory$1 {
    componentDef;
    ngModule;
    selector;
    componentType;
    ngContentSelectors;
    isBoundToModule;
    cachedInputs = null;
    cachedOutputs = null;
    get inputs() {
        this.cachedInputs ??= toInputRefArray(this.componentDef.inputs);
        return this.cachedInputs;
    }
    get outputs() {
        this.cachedOutputs ??= toOutputRefArray(this.componentDef.outputs);
        return this.cachedOutputs;
    }
    /**
     * @param componentDef The component definition.
     * @param ngModule The NgModuleRef to which the factory is bound.
     */
    constructor(componentDef, ngModule) {
        super();
        this.componentDef = componentDef;
        this.ngModule = ngModule;
        this.componentType = componentDef.type;
        this.selector = stringifyCSSSelectorList(componentDef.selectors);
        this.ngContentSelectors = componentDef.ngContentSelectors ?? [];
        this.isBoundToModule = !!ngModule;
    }
    create(injector, projectableNodes, rootSelectorOrNode, environmentInjector) {
        profiler(22 /* ProfilerEvent.DynamicComponentStart */);
        const prevConsumer = setActiveConsumer$1(null);
        try {
            const cmpDef = this.componentDef;
            ngDevMode && verifyNotAnOrphanComponent(cmpDef);
            const tAttributes = rootSelectorOrNode
                ? ['ng-version', '19.2.14']
                : // Extract attributes and classes from the first selector only to match VE behavior.
                    extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]);
            // Create the root view. Uses empty TView and ContentTemplate.
            const rootTView = createTView(0 /* TViewType.Root */, null, null, 1, 0, null, null, null, null, [tAttributes], null);
            const rootViewInjector = createRootViewInjector(cmpDef, environmentInjector || this.ngModule, injector);
            const environment = createRootLViewEnvironment(rootViewInjector);
            const hostRenderer = environment.rendererFactory.createRenderer(null, cmpDef);
            const hostElement = rootSelectorOrNode
                ? locateHostElement(hostRenderer, rootSelectorOrNode, cmpDef.encapsulation, rootViewInjector)
                : createHostElement(cmpDef, hostRenderer);
            const rootLView = createLView(null, rootTView, null, 512 /* LViewFlags.IsRoot */ | getInitialLViewFlagsFromDef(cmpDef), null, null, environment, hostRenderer, rootViewInjector, null, retrieveHydrationInfo(hostElement, rootViewInjector, true /* isRootView */));
            rootLView[HEADER_OFFSET] = hostElement;
            // rootView is the parent when bootstrapping
            // TODO(misko): it looks like we are entering view here but we don't really need to as
            // `renderView` does that. However as the code is written it is needed because
            // `createRootComponentView` and `createRootComponent` both read global state. Fixing those
            // issues would allow us to drop this.
            enterView(rootLView);
            let componentView = null;
            try {
                const hostTNode = elementStartFirstCreatePass(HEADER_OFFSET, rootTView, rootLView, '#host', () => [this.componentDef], true, 0);
                // ---- element instruction
                // TODO(crisbeto): in practice `hostRNode` should always be defined, but there are some
                // tests where the renderer is mocked out and `undefined` is returned. We should update the
                // tests so that this check can be removed.
                if (hostElement) {
                    setupStaticAttributes(hostRenderer, hostElement, hostTNode);
                    attachPatchData(hostElement, rootLView);
                }
                // TODO(pk): this logic is similar to the instruction code where a node can have directives
                createDirectivesInstances(rootTView, rootLView, hostTNode);
                executeContentQueries(rootTView, hostTNode, rootLView);
                elementEndFirstCreatePass(rootTView, hostTNode);
                if (projectableNodes !== undefined) {
                    projectNodes(hostTNode, this.ngContentSelectors, projectableNodes);
                }
                componentView = getComponentLViewByIndex(hostTNode.index, rootLView);
                // TODO(pk): why do we need this logic?
                rootLView[CONTEXT] = componentView[CONTEXT];
                renderView(rootTView, rootLView, null);
            }
            catch (e) {
                // Stop tracking the views if creation failed since
                // the consumer won't have a way to dereference them.
                if (componentView !== null) {
                    unregisterLView(componentView);
                }
                unregisterLView(rootLView);
                throw e;
            }
            finally {
                profiler(23 /* ProfilerEvent.DynamicComponentEnd */);
                leaveView();
            }
            return new ComponentRef(this.componentType, rootLView);
        }
        finally {
            setActiveConsumer$1(prevConsumer);
        }
    }
}
/**
 * Represents an instance of a Component created via a {@link ComponentFactory}.
 *
 * `ComponentRef` provides access to the Component Instance as well other objects related to this
 * Component Instance and allows you to destroy the Component Instance via the {@link #destroy}
 * method.
 *
 */
class ComponentRef extends ComponentRef$1 {
    _rootLView;
    instance;
    hostView;
    changeDetectorRef;
    componentType;
    location;
    previousInputValues = null;
    _tNode;
    constructor(componentType, _rootLView) {
        super();
        this._rootLView = _rootLView;
        this._tNode = getTNode(_rootLView[TVIEW], HEADER_OFFSET);
        this.location = createElementRef(this._tNode, _rootLView);
        this.instance = getComponentLViewByIndex(this._tNode.index, _rootLView)[CONTEXT];
        this.hostView = this.changeDetectorRef = new ViewRef$1(_rootLView, undefined /* _cdRefInjectingView */, false /* notifyErrorHandler */);
        this.componentType = componentType;
    }
    setInput(name, value) {
        const tNode = this._tNode;
        this.previousInputValues ??= new Map();
        // Do not set the input if it is the same as the last value
        // This behavior matches `bindingUpdated` when binding inputs in templates.
        if (this.previousInputValues.has(name) &&
            Object.is(this.previousInputValues.get(name), value)) {
            return;
        }
        const lView = this._rootLView;
        const hasSetInput = setAllInputsForProperty(tNode, lView[TVIEW], lView, name, value);
        this.previousInputValues.set(name, value);
        const childComponentLView = getComponentLViewByIndex(tNode.index, lView);
        markViewDirty(childComponentLView, 1 /* NotificationSource.SetInput */);
        if (ngDevMode && !hasSetInput) {
            const cmpNameForError = stringifyForError(this.componentType);
            let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `;
            message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`;
            reportUnknownPropertyError(message);
        }
    }
    get injector() {
        return new NodeInjector(this._tNode, this._rootLView);
    }
    destroy() {
        this.hostView.destroy();
    }
    onDestroy(callback) {
        this.hostView.onDestroy(callback);
    }
}
/** Projects the `projectableNodes` that were specified when creating a root component. */
function projectNodes(tNode, ngContentSelectors, projectableNodes) {
    const projection = (tNode.projection = []);
    for (let i = 0; i < ngContentSelectors.length; i++) {
        const nodesforSlot = projectableNodes[i];
        // Projectable nodes can be passed as array of arrays or an array of iterables (ngUpgrade
        // case). Here we do normalize passed data structure to be an array of arrays to avoid
        // complex checks down the line.
        // We also normalize the length of the passed in projectable nodes (to match the number of
        // <ng-container> slots defined by a component).
        projection.push(nodesforSlot != null && nodesforSlot.length ? Array.from(nodesforSlot) : null);
    }
}

/**
 * Represents a container where one or more views can be attached to a component.
 *
 * Can contain *host views* (created by instantiating a
 * component with the `createComponent()` method), and *embedded views*
 * (created by instantiating a `TemplateRef` with the `createEmbeddedView()` method).
 *
 * A view container instance can contain other view containers,
 * creating a view hierarchy.
 *
 * @usageNotes
 *
 * The example below demonstrates how the `createComponent` function can be used
 * to create an instance of a ComponentRef dynamically and attach it to an ApplicationRef,
 * so that it gets included into change detection cycles.
 *
 * Note: the example uses standalone components, but the function can also be used for
 * non-standalone components (declared in an NgModule) as well.
 *
 * ```angular-ts
 * @Component({
 *   standalone: true,
 *   selector: 'dynamic',
 *   template: `<span>This is a content of a dynamic component.</span>`,
 * })
 * class DynamicComponent {
 *   vcr = inject(ViewContainerRef);
 * }
 *
 * @Component({
 *   standalone: true,
 *   selector: 'app',
 *   template: `<main>Hi! This is the main content.</main>`,
 * })
 * class AppComponent {
 *   vcr = inject(ViewContainerRef);
 *
 *   ngAfterViewInit() {
 *     const compRef = this.vcr.createComponent(DynamicComponent);
 *     compRef.changeDetectorRef.detectChanges();
 *   }
 * }
 * ```
 *
 * @see {@link ComponentRef}
 * @see {@link EmbeddedViewRef}
 *
 * @publicApi
 */
class ViewContainerRef {
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ELEMENT_ID__ = injectViewContainerRef;
}
/**
 * Creates a ViewContainerRef and stores it on the injector. Or, if the ViewContainerRef
 * already exists, retrieves the existing ViewContainerRef.
 *
 * @returns The ViewContainerRef instance to use
 */
function injectViewContainerRef() {
    const previousTNode = getCurrentTNode();
    return createContainerRef(previousTNode, getLView());
}
const VE_ViewContainerRef = ViewContainerRef;
// TODO(alxhub): cleaning up this indirection triggers a subtle bug in Closure in g3. Once the fix
// for that lands, this can be cleaned up.
const R3ViewContainerRef = class ViewContainerRef extends VE_ViewContainerRef {
    _lContainer;
    _hostTNode;
    _hostLView;
    constructor(_lContainer, _hostTNode, _hostLView) {
        super();
        this._lContainer = _lContainer;
        this._hostTNode = _hostTNode;
        this._hostLView = _hostLView;
    }
    get element() {
        return createElementRef(this._hostTNode, this._hostLView);
    }
    get injector() {
        return new NodeInjector(this._hostTNode, this._hostLView);
    }
    /** @deprecated No replacement */
    get parentInjector() {
        const parentLocation = getParentInjectorLocation(this._hostTNode, this._hostLView);
        if (hasParentInjector(parentLocation)) {
            const parentView = getParentInjectorView(parentLocation, this._hostLView);
            const injectorIndex = getParentInjectorIndex(parentLocation);
            ngDevMode && assertNodeInjector(parentView, injectorIndex);
            const parentTNode = parentView[TVIEW].data[injectorIndex + 8 /* NodeInjectorOffset.TNODE */];
            return new NodeInjector(parentTNode, parentView);
        }
        else {
            return new NodeInjector(null, this._hostLView);
        }
    }
    clear() {
        while (this.length > 0) {
            this.remove(this.length - 1);
        }
    }
    get(index) {
        const viewRefs = getViewRefs(this._lContainer);
        return (viewRefs !== null && viewRefs[index]) || null;
    }
    get length() {
        return this._lContainer.length - CONTAINER_HEADER_OFFSET;
    }
    createEmbeddedView(templateRef, context, indexOrOptions) {
        let index;
        let injector;
        if (typeof indexOrOptions === 'number') {
            index = indexOrOptions;
        }
        else if (indexOrOptions != null) {
            index = indexOrOptions.index;
            injector = indexOrOptions.injector;
        }
        const dehydratedView = findMatchingDehydratedView(this._lContainer, templateRef.ssrId);
        const viewRef = templateRef.createEmbeddedViewImpl(context || {}, injector, dehydratedView);
        this.insertImpl(viewRef, index, shouldAddViewToDom(this._hostTNode, dehydratedView));
        return viewRef;
    }
    createComponent(componentFactoryOrType, indexOrOptions, injector, projectableNodes, environmentInjector) {
        const isComponentFactory = componentFactoryOrType && !isType(componentFactoryOrType);
        let index;
        // This function supports 2 signatures and we need to handle options correctly for both:
        //   1. When first argument is a Component type. This signature also requires extra
        //      options to be provided as object (more ergonomic option).
        //   2. First argument is a Component factory. In this case extra options are represented as
        //      positional arguments. This signature is less ergonomic and will be deprecated.
        if (isComponentFactory) {
            if (ngDevMode) {
                assertEqual(typeof indexOrOptions !== 'object', true, 'It looks like Component factory was provided as the first argument ' +
                    'and an options object as the second argument. This combination of arguments ' +
                    'is incompatible. You can either change the first argument to provide Component ' +
                    'type or change the second argument to be a number (representing an index at ' +
                    "which to insert the new component's host view into this container)");
            }
            index = indexOrOptions;
        }
        else {
            if (ngDevMode) {
                assertDefined(getComponentDef(componentFactoryOrType), `Provided Component class doesn't contain Component definition. ` +
                    `Please check whether provided class has @Component decorator.`);
                assertEqual(typeof indexOrOptions !== 'number', true, 'It looks like Component type was provided as the first argument ' +
                    "and a number (representing an index at which to insert the new component's " +
                    'host view into this container as the second argument. This combination of arguments ' +
                    'is incompatible. Please use an object as the second argument instead.');
            }
            const options = (indexOrOptions || {});
            if (ngDevMode && options.environmentInjector && options.ngModuleRef) {
                throwError(`Cannot pass both environmentInjector and ngModuleRef options to createComponent().`);
            }
            index = options.index;
            injector = options.injector;
            projectableNodes = options.projectableNodes;
            environmentInjector = options.environmentInjector || options.ngModuleRef;
        }
        const componentFactory = isComponentFactory
            ? componentFactoryOrType
            : new ComponentFactory(getComponentDef(componentFactoryOrType));
        const contextInjector = injector || this.parentInjector;
        // If an `NgModuleRef` is not provided explicitly, try retrieving it from the DI tree.
        if (!environmentInjector && componentFactory.ngModule == null) {
            // For the `ComponentFactory` case, entering this logic is very unlikely, since we expect that
            // an instance of a `ComponentFactory`, resolved via `ComponentFactoryResolver` would have an
            // `ngModule` field. This is possible in some test scenarios and potentially in some JIT-based
            // use-cases. For the `ComponentFactory` case we preserve backwards-compatibility and try
            // using a provided injector first, then fall back to the parent injector of this
            // `ViewContainerRef` instance.
            //
            // For the factory-less case, it's critical to establish a connection with the module
            // injector tree (by retrieving an instance of an `NgModuleRef` and accessing its injector),
            // so that a component can use DI tokens provided in MgModules. For this reason, we can not
            // rely on the provided injector, since it might be detached from the DI tree (for example, if
            // it was created via `Injector.create` without specifying a parent injector, or if an
            // injector is retrieved from an `NgModuleRef` created via `createNgModule` using an
            // NgModule outside of a module tree). Instead, we always use `ViewContainerRef`'s parent
            // injector, which is normally connected to the DI tree, which includes module injector
            // subtree.
            const _injector = isComponentFactory ? contextInjector : this.parentInjector;
            // DO NOT REFACTOR. The code here used to have a `injector.get(NgModuleRef, null) ||
            // undefined` expression which seems to cause internal google apps to fail. This is documented
            // in the following internal bug issue: go/b/142967802
            const result = _injector.get(EnvironmentInjector, null);
            if (result) {
                environmentInjector = result;
            }
        }
        const componentDef = getComponentDef(componentFactory.componentType ?? {});
        const dehydratedView = findMatchingDehydratedView(this._lContainer, componentDef?.id ?? null);
        const rNode = dehydratedView?.firstChild ?? null;
        const componentRef = componentFactory.create(contextInjector, projectableNodes, rNode, environmentInjector);
        this.insertImpl(componentRef.hostView, index, shouldAddViewToDom(this._hostTNode, dehydratedView));
        return componentRef;
    }
    insert(viewRef, index) {
        return this.insertImpl(viewRef, index, true);
    }
    insertImpl(viewRef, index, addToDOM) {
        const lView = viewRef._lView;
        if (ngDevMode && viewRef.destroyed) {
            throw new Error('Cannot insert a destroyed View in a ViewContainer!');
        }
        if (viewAttachedToContainer(lView)) {
            // If view is already attached, detach it first so we clean up references appropriately.
            const prevIdx = this.indexOf(viewRef);
            // A view might be attached either to this or a different container. The `prevIdx` for
            // those cases will be:
            // equal to -1 for views attached to this ViewContainerRef
            // >= 0 for views attached to a different ViewContainerRef
            if (prevIdx !== -1) {
                this.detach(prevIdx);
            }
            else {
                const prevLContainer = lView[PARENT];
                ngDevMode &&
                    assertEqual(isLContainer(prevLContainer), true, 'An attached view should have its PARENT point to a container.');
                // We need to re-create a R3ViewContainerRef instance since those are not stored on
                // LView (nor anywhere else).
                const prevVCRef = new R3ViewContainerRef(prevLContainer, prevLContainer[T_HOST], prevLContainer[PARENT]);
                prevVCRef.detach(prevVCRef.indexOf(viewRef));
            }
        }
        // Logical operation of adding `LView` to `LContainer`
        const adjustedIdx = this._adjustIndex(index);
        const lContainer = this._lContainer;
        addLViewToLContainer(lContainer, lView, adjustedIdx, addToDOM);
        viewRef.attachToViewContainerRef();
        addToArray(getOrCreateViewRefs(lContainer), adjustedIdx, viewRef);
        return viewRef;
    }
    move(viewRef, newIndex) {
        if (ngDevMode && viewRef.destroyed) {
            throw new Error('Cannot move a destroyed View in a ViewContainer!');
        }
        return this.insert(viewRef, newIndex);
    }
    indexOf(viewRef) {
        const viewRefsArr = getViewRefs(this._lContainer);
        return viewRefsArr !== null ? viewRefsArr.indexOf(viewRef) : -1;
    }
    remove(index) {
        const adjustedIdx = this._adjustIndex(index, -1);
        const detachedView = detachView(this._lContainer, adjustedIdx);
        if (detachedView) {
            // Before destroying the view, remove it from the container's array of `ViewRef`s.
            // This ensures the view container length is updated before calling
            // `destroyLView`, which could recursively call view container methods that
            // rely on an accurate container length.
            // (e.g. a method on this view container being called by a child directive's OnDestroy
            // lifecycle hook)
            removeFromArray(getOrCreateViewRefs(this._lContainer), adjustedIdx);
            destroyLView(detachedView[TVIEW], detachedView);
        }
    }
    detach(index) {
        const adjustedIdx = this._adjustIndex(index, -1);
        const view = detachView(this._lContainer, adjustedIdx);
        const wasDetached = view && removeFromArray(getOrCreateViewRefs(this._lContainer), adjustedIdx) != null;
        return wasDetached ? new ViewRef$1(view) : null;
    }
    _adjustIndex(index, shift = 0) {
        if (index == null) {
            return this.length + shift;
        }
        if (ngDevMode) {
            assertGreaterThan(index, -1, `ViewRef index must be positive, got ${index}`);
            // +1 because it's legal to insert at the end.
            assertLessThan(index, this.length + 1 + shift, 'index');
        }
        return index;
    }
};
function getViewRefs(lContainer) {
    return lContainer[VIEW_REFS];
}
function getOrCreateViewRefs(lContainer) {
    return (lContainer[VIEW_REFS] || (lContainer[VIEW_REFS] = []));
}
/**
 * Creates a ViewContainerRef and stores it on the injector.
 *
 * @param hostTNode The node that is requesting a ViewContainerRef
 * @param hostLView The view to which the node belongs
 * @returns The ViewContainerRef instance to use
 */
function createContainerRef(hostTNode, hostLView) {
    ngDevMode && assertTNodeType(hostTNode, 12 /* TNodeType.AnyContainer */ | 3 /* TNodeType.AnyRNode */);
    let lContainer;
    const slotValue = hostLView[hostTNode.index];
    if (isLContainer(slotValue)) {
        // If the host is a container, we don't need to create a new LContainer
        lContainer = slotValue;
    }
    else {
        // An LContainer anchor can not be `null`, but we set it here temporarily
        // and update to the actual value later in this function (see
        // `_locateOrCreateAnchorNode`).
        lContainer = createLContainer(slotValue, hostLView, null, hostTNode);
        hostLView[hostTNode.index] = lContainer;
        addToEndOfViewTree(hostLView, lContainer);
    }
    _locateOrCreateAnchorNode(lContainer, hostLView, hostTNode, slotValue);
    return new R3ViewContainerRef(lContainer, hostTNode, hostLView);
}
/**
 * Creates and inserts a comment node that acts as an anchor for a view container.
 *
 * If the host is a regular element, we have to insert a comment node manually which will
 * be used as an anchor when inserting elements. In this specific case we use low-level DOM
 * manipulation to insert it.
 */
function insertAnchorNode(hostLView, hostTNode) {
    const renderer = hostLView[RENDERER];
    ngDevMode && ngDevMode.rendererCreateComment++;
    const commentNode = renderer.createComment(ngDevMode ? 'container' : '');
    const hostNative = getNativeByTNode(hostTNode, hostLView);
    const parentOfHostNative = renderer.parentNode(hostNative);
    nativeInsertBefore(renderer, parentOfHostNative, commentNode, renderer.nextSibling(hostNative), false);
    return commentNode;
}
let _locateOrCreateAnchorNode = createAnchorNode;
let _populateDehydratedViewsInLContainer = () => false; // noop by default
/**
 * Looks up dehydrated views that belong to a given LContainer and populates
 * this information into the `LContainer[DEHYDRATED_VIEWS]` slot. When running
 * in client-only mode, this function is a noop.
 *
 * @param lContainer LContainer that should be populated.
 * @param tNode Corresponding TNode.
 * @param hostLView LView that hosts LContainer.
 * @returns a boolean flag that indicates whether a populating operation
 *   was successful. The operation might be unsuccessful in case is has completed
 *   previously, we are rendering in client-only mode or this content is located
 *   in a skip hydration section.
 */
function populateDehydratedViewsInLContainer(lContainer, tNode, hostLView) {
    return _populateDehydratedViewsInLContainer(lContainer, tNode, hostLView);
}
/**
 * Regular creation mode: an anchor is created and
 * assigned to the `lContainer[NATIVE]` slot.
 */
function createAnchorNode(lContainer, hostLView, hostTNode, slotValue) {
    // We already have a native element (anchor) set, return.
    if (lContainer[NATIVE])
        return;
    let commentNode;
    // If the host is an element container, the native host element is guaranteed to be a
    // comment and we can reuse that comment as anchor element for the new LContainer.
    // The comment node in question is already part of the DOM structure so we don't need to append
    // it again.
    if (hostTNode.type & 8 /* TNodeType.ElementContainer */) {
        commentNode = unwrapRNode(slotValue);
    }
    else {
        commentNode = insertAnchorNode(hostLView, hostTNode);
    }
    lContainer[NATIVE] = commentNode;
}
/**
 * Hydration logic that looks up all dehydrated views in this container
 * and puts them into `lContainer[DEHYDRATED_VIEWS]` slot.
 *
 * @returns a boolean flag that indicates whether a populating operation
 *   was successful. The operation might be unsuccessful in case is has completed
 *   previously, we are rendering in client-only mode or this content is located
 *   in a skip hydration section.
 */
function populateDehydratedViewsInLContainerImpl(lContainer, tNode, hostLView) {
    // We already have a native element (anchor) set and the process
    // of finding dehydrated views happened (so the `lContainer[DEHYDRATED_VIEWS]`
    // is not null), exit early.
    if (lContainer[NATIVE] && lContainer[DEHYDRATED_VIEWS]) {
        return true;
    }
    const hydrationInfo = hostLView[HYDRATION];
    const noOffsetIndex = tNode.index - HEADER_OFFSET;
    const isNodeCreationMode = !hydrationInfo ||
        isInSkipHydrationBlock(tNode) ||
        isDisconnectedNode$1(hydrationInfo, noOffsetIndex);
    // Regular creation mode.
    if (isNodeCreationMode) {
        return false;
    }
    // Hydration mode, looking up an anchor node and dehydrated views in DOM.
    const currentRNode = getSegmentHead(hydrationInfo, noOffsetIndex);
    const serializedViews = hydrationInfo.data[CONTAINERS]?.[noOffsetIndex];
    ngDevMode &&
        assertDefined(serializedViews, 'Unexpected state: no hydration info available for a given TNode, ' +
            'which represents a view container.');
    const [commentNode, dehydratedViews] = locateDehydratedViewsInContainer(currentRNode, serializedViews);
    if (ngDevMode) {
        validateMatchingNode(commentNode, Node.COMMENT_NODE, null, hostLView, tNode, true);
        // Do not throw in case this node is already claimed (thus `false` as a second
        // argument). If this container is created based on an `<ng-template>`, the comment
        // node would be already claimed from the `template` instruction. If an element acts
        // as an anchor (e.g. <div #vcRef>), a separate comment node would be created/located,
        // so we need to claim it here.
        markRNodeAsClaimedByHydration(commentNode, false);
    }
    lContainer[NATIVE] = commentNode;
    lContainer[DEHYDRATED_VIEWS] = dehydratedViews;
    return true;
}
function locateOrCreateAnchorNode(lContainer, hostLView, hostTNode, slotValue) {
    if (!_populateDehydratedViewsInLContainer(lContainer, hostTNode, hostLView)) {
        // Populating dehydrated views operation returned `false`, which indicates
        // that the logic was running in client-only mode, this an anchor comment
        // node should be created for this container.
        createAnchorNode(lContainer, hostLView, hostTNode, slotValue);
    }
}
function enableLocateOrCreateContainerRefImpl() {
    _locateOrCreateAnchorNode = locateOrCreateAnchorNode;
    _populateDehydratedViewsInLContainer = populateDehydratedViewsInLContainerImpl;
}

class LQuery_ {
    queryList;
    matches = null;
    constructor(queryList) {
        this.queryList = queryList;
    }
    clone() {
        return new LQuery_(this.queryList);
    }
    setDirty() {
        this.queryList.setDirty();
    }
}
class LQueries_ {
    queries;
    constructor(queries = []) {
        this.queries = queries;
    }
    createEmbeddedView(tView) {
        const tQueries = tView.queries;
        if (tQueries !== null) {
            const noOfInheritedQueries = tView.contentQueries !== null ? tView.contentQueries[0] : tQueries.length;
            const viewLQueries = [];
            // An embedded view has queries propagated from a declaration view at the beginning of the
            // TQueries collection and up until a first content query declared in the embedded view. Only
            // propagated LQueries are created at this point (LQuery corresponding to declared content
            // queries will be instantiated from the content query instructions for each directive).
            for (let i = 0; i < noOfInheritedQueries; i++) {
                const tQuery = tQueries.getByIndex(i);
                const parentLQuery = this.queries[tQuery.indexInDeclarationView];
                viewLQueries.push(parentLQuery.clone());
            }
            return new LQueries_(viewLQueries);
        }
        return null;
    }
    insertView(tView) {
        this.dirtyQueriesWithMatches(tView);
    }
    detachView(tView) {
        this.dirtyQueriesWithMatches(tView);
    }
    finishViewCreation(tView) {
        this.dirtyQueriesWithMatches(tView);
    }
    dirtyQueriesWithMatches(tView) {
        for (let i = 0; i < this.queries.length; i++) {
            if (getTQuery(tView, i).matches !== null) {
                this.queries[i].setDirty();
            }
        }
    }
}
class TQueryMetadata_ {
    flags;
    read;
    predicate;
    constructor(predicate, flags, read = null) {
        this.flags = flags;
        this.read = read;
        // Compiler might not be able to pre-optimize and split multiple selectors.
        if (typeof predicate === 'string') {
            this.predicate = splitQueryMultiSelectors(predicate);
        }
        else {
            this.predicate = predicate;
        }
    }
}
class TQueries_ {
    queries;
    constructor(queries = []) {
        this.queries = queries;
    }
    elementStart(tView, tNode) {
        ngDevMode &&
            assertFirstCreatePass(tView, 'Queries should collect results on the first template pass only');
        for (let i = 0; i < this.queries.length; i++) {
            this.queries[i].elementStart(tView, tNode);
        }
    }
    elementEnd(tNode) {
        for (let i = 0; i < this.queries.length; i++) {
            this.queries[i].elementEnd(tNode);
        }
    }
    embeddedTView(tNode) {
        let queriesForTemplateRef = null;
        for (let i = 0; i < this.length; i++) {
            const childQueryIndex = queriesForTemplateRef !== null ? queriesForTemplateRef.length : 0;
            const tqueryClone = this.getByIndex(i).embeddedTView(tNode, childQueryIndex);
            if (tqueryClone) {
                tqueryClone.indexInDeclarationView = i;
                if (queriesForTemplateRef !== null) {
                    queriesForTemplateRef.push(tqueryClone);
                }
                else {
                    queriesForTemplateRef = [tqueryClone];
                }
            }
        }
        return queriesForTemplateRef !== null ? new TQueries_(queriesForTemplateRef) : null;
    }
    template(tView, tNode) {
        ngDevMode &&
            assertFirstCreatePass(tView, 'Queries should collect results on the first template pass only');
        for (let i = 0; i < this.queries.length; i++) {
            this.queries[i].template(tView, tNode);
        }
    }
    getByIndex(index) {
        ngDevMode && assertIndexInRange(this.queries, index);
        return this.queries[index];
    }
    get length() {
        return this.queries.length;
    }
    track(tquery) {
        this.queries.push(tquery);
    }
}
class TQuery_ {
    metadata;
    matches = null;
    indexInDeclarationView = -1;
    crossesNgTemplate = false;
    /**
     * A node index on which a query was declared (-1 for view queries and ones inherited from the
     * declaration template). We use this index (alongside with _appliesToNextNode flag) to know
     * when to apply content queries to elements in a template.
     */
    _declarationNodeIndex;
    /**
     * A flag indicating if a given query still applies to nodes it is crossing. We use this flag
     * (alongside with _declarationNodeIndex) to know when to stop applying content queries to
     * elements in a template.
     */
    _appliesToNextNode = true;
    constructor(metadata, nodeIndex = -1) {
        this.metadata = metadata;
        this._declarationNodeIndex = nodeIndex;
    }
    elementStart(tView, tNode) {
        if (this.isApplyingToNode(tNode)) {
            this.matchTNode(tView, tNode);
        }
    }
    elementEnd(tNode) {
        if (this._declarationNodeIndex === tNode.index) {
            this._appliesToNextNode = false;
        }
    }
    template(tView, tNode) {
        this.elementStart(tView, tNode);
    }
    embeddedTView(tNode, childQueryIndex) {
        if (this.isApplyingToNode(tNode)) {
            this.crossesNgTemplate = true;
            // A marker indicating a `<ng-template>` element (a placeholder for query results from
            // embedded views created based on this `<ng-template>`).
            this.addMatch(-tNode.index, childQueryIndex);
            return new TQuery_(this.metadata);
        }
        return null;
    }
    isApplyingToNode(tNode) {
        if (this._appliesToNextNode &&
            (this.metadata.flags & 1 /* QueryFlags.descendants */) !== 1 /* QueryFlags.descendants */) {
            const declarationNodeIdx = this._declarationNodeIndex;
            let parent = tNode.parent;
            // Determine if a given TNode is a "direct" child of a node on which a content query was
            // declared (only direct children of query's host node can match with the descendants: false
            // option). There are 3 main use-case / conditions to consider here:
            // - <needs-target><i #target></i></needs-target>: here <i #target> parent node is a query
            // host node;
            // - <needs-target><ng-template [ngIf]="true"><i #target></i></ng-template></needs-target>:
            // here <i #target> parent node is null;
            // - <needs-target><ng-container><i #target></i></ng-container></needs-target>: here we need
            // to go past `<ng-container>` to determine <i #target> parent node (but we shouldn't traverse
            // up past the query's host node!).
            while (parent !== null &&
                parent.type & 8 /* TNodeType.ElementContainer */ &&
                parent.index !== declarationNodeIdx) {
                parent = parent.parent;
            }
            return declarationNodeIdx === (parent !== null ? parent.index : -1);
        }
        return this._appliesToNextNode;
    }
    matchTNode(tView, tNode) {
        const predicate = this.metadata.predicate;
        if (Array.isArray(predicate)) {
            for (let i = 0; i < predicate.length; i++) {
                const name = predicate[i];
                this.matchTNodeWithReadOption(tView, tNode, getIdxOfMatchingSelector(tNode, name));
                // Also try matching the name to a provider since strings can be used as DI tokens too.
                this.matchTNodeWithReadOption(tView, tNode, locateDirectiveOrProvider(tNode, tView, name, false, false));
            }
        }
        else {
            if (predicate === TemplateRef) {
                if (tNode.type & 4 /* TNodeType.Container */) {
                    this.matchTNodeWithReadOption(tView, tNode, -1);
                }
            }
            else {
                this.matchTNodeWithReadOption(tView, tNode, locateDirectiveOrProvider(tNode, tView, predicate, false, false));
            }
        }
    }
    matchTNodeWithReadOption(tView, tNode, nodeMatchIdx) {
        if (nodeMatchIdx !== null) {
            const read = this.metadata.read;
            if (read !== null) {
                if (read === ElementRef ||
                    read === ViewContainerRef ||
                    (read === TemplateRef && tNode.type & 4 /* TNodeType.Container */)) {
                    this.addMatch(tNode.index, -2);
                }
                else {
                    const directiveOrProviderIdx = locateDirectiveOrProvider(tNode, tView, read, false, false);
                    if (directiveOrProviderIdx !== null) {
                        this.addMatch(tNode.index, directiveOrProviderIdx);
                    }
                }
            }
            else {
                this.addMatch(tNode.index, nodeMatchIdx);
            }
        }
    }
    addMatch(tNodeIdx, matchIdx) {
        if (this.matches === null) {
            this.matches = [tNodeIdx, matchIdx];
        }
        else {
            this.matches.push(tNodeIdx, matchIdx);
        }
    }
}
/**
 * Iterates over local names for a given node and returns directive index
 * (or -1 if a local name points to an element).
 *
 * @param tNode static data of a node to check
 * @param selector selector to match
 * @returns directive index, -1 or null if a selector didn't match any of the local names
 */
function getIdxOfMatchingSelector(tNode, selector) {
    const localNames = tNode.localNames;
    if (localNames !== null) {
        for (let i = 0; i < localNames.length; i += 2) {
            if (localNames[i] === selector) {
                return localNames[i + 1];
            }
        }
    }
    return null;
}
function createResultByTNodeType(tNode, currentView) {
    if (tNode.type & (3 /* TNodeType.AnyRNode */ | 8 /* TNodeType.ElementContainer */)) {
        return createElementRef(tNode, currentView);
    }
    else if (tNode.type & 4 /* TNodeType.Container */) {
        return createTemplateRef(tNode, currentView);
    }
    return null;
}
function createResultForNode(lView, tNode, matchingIdx, read) {
    if (matchingIdx === -1) {
        // if read token and / or strategy is not specified, detect it using appropriate tNode type
        return createResultByTNodeType(tNode, lView);
    }
    else if (matchingIdx === -2) {
        // read a special token from a node injector
        return createSpecialToken(lView, tNode, read);
    }
    else {
        // read a token
        return getNodeInjectable(lView, lView[TVIEW], matchingIdx, tNode);
    }
}
function createSpecialToken(lView, tNode, read) {
    if (read === ElementRef) {
        return createElementRef(tNode, lView);
    }
    else if (read === TemplateRef) {
        return createTemplateRef(tNode, lView);
    }
    else if (read === ViewContainerRef) {
        ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */);
        return createContainerRef(tNode, lView);
    }
    else {
        ngDevMode &&
            throwError(`Special token to read should be one of ElementRef, TemplateRef or ViewContainerRef but got ${stringify(read)}.`);
    }
}
/**
 * A helper function that creates query results for a given view. This function is meant to do the
 * processing once and only once for a given view instance (a set of results for a given view
 * doesn't change).
 */
function materializeViewResults(tView, lView, tQuery, queryIndex) {
    const lQuery = lView[QUERIES].queries[queryIndex];
    if (lQuery.matches === null) {
        const tViewData = tView.data;
        const tQueryMatches = tQuery.matches;
        const result = [];
        for (let i = 0; tQueryMatches !== null && i < tQueryMatches.length; i += 2) {
            const matchedNodeIdx = tQueryMatches[i];
            if (matchedNodeIdx < 0) {
                // we at the <ng-template> marker which might have results in views created based on this
                // <ng-template> - those results will be in separate views though, so here we just leave
                // null as a placeholder
                result.push(null);
            }
            else {
                ngDevMode && assertIndexInRange(tViewData, matchedNodeIdx);
                const tNode = tViewData[matchedNodeIdx];
                result.push(createResultForNode(lView, tNode, tQueryMatches[i + 1], tQuery.metadata.read));
            }
        }
        lQuery.matches = result;
    }
    return lQuery.matches;
}
/**
 * A helper function that collects (already materialized) query results from a tree of views,
 * starting with a provided LView.
 */
function collectQueryResults(tView, lView, queryIndex, result) {
    const tQuery = tView.queries.getByIndex(queryIndex);
    const tQueryMatches = tQuery.matches;
    if (tQueryMatches !== null) {
        const lViewResults = materializeViewResults(tView, lView, tQuery, queryIndex);
        for (let i = 0; i < tQueryMatches.length; i += 2) {
            const tNodeIdx = tQueryMatches[i];
            if (tNodeIdx > 0) {
                result.push(lViewResults[i / 2]);
            }
            else {
                const childQueryIndex = tQueryMatches[i + 1];
                const declarationLContainer = lView[-tNodeIdx];
                ngDevMode && assertLContainer(declarationLContainer);
                // collect matches for views inserted in this container
                for (let i = CONTAINER_HEADER_OFFSET; i < declarationLContainer.length; i++) {
                    const embeddedLView = declarationLContainer[i];
                    if (embeddedLView[DECLARATION_LCONTAINER] === embeddedLView[PARENT]) {
                        collectQueryResults(embeddedLView[TVIEW], embeddedLView, childQueryIndex, result);
                    }
                }
                // collect matches for views created from this declaration container and inserted into
                // different containers
                if (declarationLContainer[MOVED_VIEWS] !== null) {
                    const embeddedLViews = declarationLContainer[MOVED_VIEWS];
                    for (let i = 0; i < embeddedLViews.length; i++) {
                        const embeddedLView = embeddedLViews[i];
                        collectQueryResults(embeddedLView[TVIEW], embeddedLView, childQueryIndex, result);
                    }
                }
            }
        }
    }
    return result;
}
function loadQueryInternal(lView, queryIndex) {
    ngDevMode &&
        assertDefined(lView[QUERIES], 'LQueries should be defined when trying to load a query');
    ngDevMode && assertIndexInRange(lView[QUERIES].queries, queryIndex);
    return lView[QUERIES].queries[queryIndex].queryList;
}
/**
 * Creates a new instance of LQuery and returns its index in the collection of LQuery objects.
 *
 * @returns index in the collection of LQuery objects
 */
function createLQuery(tView, lView, flags) {
    const queryList = new QueryList((flags & 4 /* QueryFlags.emitDistinctChangesOnly */) === 4 /* QueryFlags.emitDistinctChangesOnly */);
    storeCleanupWithContext(tView, lView, queryList, queryList.destroy);
    const lQueries = (lView[QUERIES] ??= new LQueries_()).queries;
    return lQueries.push(new LQuery_(queryList)) - 1;
}
function createViewQuery(predicate, flags, read) {
    ngDevMode && assertNumber(flags, 'Expecting flags');
    const tView = getTView();
    if (tView.firstCreatePass) {
        createTQuery(tView, new TQueryMetadata_(predicate, flags, read), -1);
        if ((flags & 2 /* QueryFlags.isStatic */) === 2 /* QueryFlags.isStatic */) {
            tView.staticViewQueries = true;
        }
    }
    return createLQuery(tView, getLView(), flags);
}
function createContentQuery(directiveIndex, predicate, flags, read) {
    ngDevMode && assertNumber(flags, 'Expecting flags');
    const tView = getTView();
    if (tView.firstCreatePass) {
        const tNode = getCurrentTNode();
        createTQuery(tView, new TQueryMetadata_(predicate, flags, read), tNode.index);
        saveContentQueryAndDirectiveIndex(tView, directiveIndex);
        if ((flags & 2 /* QueryFlags.isStatic */) === 2 /* QueryFlags.isStatic */) {
            tView.staticContentQueries = true;
        }
    }
    return createLQuery(tView, getLView(), flags);
}
/** Splits multiple selectors in the locator. */
function splitQueryMultiSelectors(locator) {
    return locator.split(',').map((s) => s.trim());
}
function createTQuery(tView, metadata, nodeIndex) {
    if (tView.queries === null)
        tView.queries = new TQueries_();
    tView.queries.track(new TQuery_(metadata, nodeIndex));
}
function saveContentQueryAndDirectiveIndex(tView, directiveIndex) {
    const tViewContentQueries = tView.contentQueries || (tView.contentQueries = []);
    const lastSavedDirectiveIndex = tViewContentQueries.length
        ? tViewContentQueries[tViewContentQueries.length - 1]
        : -1;
    if (directiveIndex !== lastSavedDirectiveIndex) {
        tViewContentQueries.push(tView.queries.length - 1, directiveIndex);
    }
}
function getTQuery(tView, index) {
    ngDevMode && assertDefined(tView.queries, 'TQueries must be defined to retrieve a TQuery');
    return tView.queries.getByIndex(index);
}
/**
 * A helper function collecting results from all the views where a given query was active.
 * @param lView
 * @param queryIndex
 */
function getQueryResults(lView, queryIndex) {
    const tView = lView[TVIEW];
    const tQuery = getTQuery(tView, queryIndex);
    return tQuery.crossesNgTemplate
        ? collectQueryResults(tView, lView, queryIndex, [])
        : materializeViewResults(tView, lView, tQuery, queryIndex);
}

/**
 * A signal factory function in charge of creating a new computed signal capturing query
 * results. This centralized creation function is used by all types of queries (child / children,
 * required / optional).
 *
 * @param firstOnly indicates if all or only the first result should be returned
 * @param required indicates if at least one result is required
 * @returns a read-only signal with query results
 */
function createQuerySignalFn(firstOnly, required, opts) {
    let node;
    const signalFn = createComputed(() => {
        // A dedicated signal that increments its value every time a query changes its dirty status. By
        // using this signal we can implement a query as computed and avoid creation of a specialized
        // reactive node type. Please note that a query gets marked dirty under the following
        // circumstances:
        // - a view (where a query is active) finished its first creation pass;
        // - a new view is inserted / deleted and it impacts query results.
        node._dirtyCounter();
        const value = refreshSignalQuery(node, firstOnly);
        if (required && value === un   defined) {
            throw new RuntimeError(-951 /* RuntimeErrorCode.REQUIRED_QUERY_NO_VALUE */, ngDevMode && 'Child query result is required but no value is available.');
        }
        return value;
    });
    node = signalFn[SIGNAL];
    node._dirtyCounter = signal(0);
    node._flatValue = undefined;
    if (ngDevMode) {
        signalFn.toString = () => `[Query Signal]`;
        node.debugName = opts?.debugName;
    }
    return signalFn;
}
function createSingleResultOptionalQuerySignalFn(opts) {
    return createQuerySignalFn(/* firstOnly */ true, /* required */ false, opts);
}
function createSingleResultRequiredQuerySignalFn(opts) {
    return createQuerySignalFn(/* firstOnly */ true, /* required */ true, opts);
}
function createMultiResultQuerySignalFn(opts) {
    return createQuerySignalFn(/* firstOnly */ false, /* required */ false, opts);
}
function bindQueryToSignal(target, queryIndex) {
    const node = target[SIGNAL];
    node._lView = getLView();
    node._queryIndex = queryIndex;
    node._queryList = loadQueryInternal(node._lView, queryIndex);
    node._queryList.onDirty(() => node._dirtyCounter.update((v) => v + 1));
}
function refreshSignalQuery(node, firstOnly) {
    const lView = node._lView;
    const queryIndex = node._queryIndex;
    // There are 2 conditions under which we want to return "empty" results instead of the ones
    // collected by a query:
    //
    // 1) a given query wasn't created yet (this is a period of time between the directive creation
    // and execution of the query creation function) - in this case a query doesn't exist yet and we
    // don't have any results to return.
    //
    // 2) we are in the process of constructing a view (the first
    // creation pass didn't finish) and a query might have partial results, but we don't want to
    // return those - instead we do delay results collection until all nodes had a chance of matching
    // and we can present consistent, "atomic" (on a view level) results.
    if (lView === undefined || queryIndex === undefined || lView[FLAGS] & 4 /* LViewFlags.CreationMode */) {
        return (firstOnly ? undefined : EMPTY_ARRAY);
    }
    const queryList = loadQueryInternal(lView, queryIndex);
    const results = getQueryResults(lView, queryIndex);
    queryList.reset(results, unwrapElementRef);
    if (firstOnly) {
        return queryList.first;
    }
    else {
        // TODO: remove access to the private _changesDetected field by abstracting / removing usage of
        // QueryList in the signal-based queries (perf follow-up)
        const resultChanged = queryList._changesDetected;
        if (resultChanged || node._flatValue === undefined) {
            return (node._flatValue = queryList.toArray());
        }
        return node._flatValue;
    }
}

function viewChildFn(locator, opts) {
    ngDevMode && assertInInjectionContext(viewChild);
    return createSingleResultOptionalQuerySignalFn(opts);
}
function viewChildRequiredFn(locator, opts) {
    ngDevMode && assertInInjectionContext(viewChild);
    return createSingleResultRequiredQuerySignalFn(opts);
}
/**
 * Initializes a view child query.
 *
 * Consider using `viewChild.required` for queries that should always match.
 *
 * @usageNotes
 * Create a child query in your component by declaring a
 * class field and initializing it with the `viewChild()` function.
 *
 * ```angular-ts
 * @Component({template: '<div #el></div><my-component #cmp />'})
 * export class TestComponent {
 *   divEl = viewChild<ElementRef>('el');                   // Signal<ElementRef|undefined>
 *   divElRequired = viewChild.required<ElementRef>('el');  // Signal<ElementRef>
 *   cmp = viewChild(MyComponent);                          // Signal<MyComponent|undefined>
 *   cmpRequired = viewChild.required(MyComponent);         // Signal<MyComponent>
 * }
 * ```
 *
 * @publicAPI
 * @initializerApiFunction
 */
const viewChild = (() => {
    // Note: This may be considered a side-effect, but nothing will depend on
    // this assignment, unless this `viewChild` constant export is accessed. It's a
    // self-contained side effect that is local to the user facing `viewChild` export.
    viewChildFn.required = viewChildRequiredFn;
    return viewChildFn;
})();
/**
 * Initializes a view children query.
 *
 * Query results are represented as a signal of a read-only collection containing all matched
 * elements.
 *
 * @usageNotes
 * Create a children query in your component by declaring a
 * class field and initializing it with the `viewChildren()` function.
 *
 * ```ts
 * @Component({...})
 * export class TestComponent {
 *   divEls = viewChildren<ElementRef>('el');   // Signal<ReadonlyArray<ElementRef>>
 * }
 * ```
 *
 * @initializerApiFunction
 * @publicAPI
 */
function viewChildren(locator, opts) {
    ngDevMode && assertInInjectionContext(viewChildren);
    return createMultiResultQuerySignalFn(opts);
}
function contentChildFn(locator, opts) {
    ngDevMode && assertInInjectionContext(contentChild);
    return createSingleResultOptionalQuerySignalFn(opts);
}
function contentChildRequiredFn(locator, opts) {
    ngDevMode && assertInInjectionContext(contentChildren);
    return createSingleResultRequiredQuerySignalFn(opts);
}
/**
 * Initializes a content child query. Consider using `contentChild.required` for queries that should
 * always match.
 *
 * @usageNotes
 * Create a child query in your component by declaring a
 * class field and initializing it with the `contentChild()` function.
 *
 * ```ts
 * @Component({...})
 * export class TestComponent {
 *   headerEl = contentChild<ElementRef>('h');                    // Signal<ElementRef|undefined>
 *   headerElElRequired = contentChild.required<ElementRef>('h'); // Signal<ElementRef>
 *   header = contentChild(MyHeader);                             // Signal<MyHeader|undefined>
 *   headerRequired = contentChild.required(MyHeader);            // Signal<MyHeader>
 * }
 * ```
 *
 * @initializerApiFunction
 * @publicAPI
 */
const contentChild = (() => {
    // Note: This may be considered a side-effect, but nothing will depend on
    // this assignment, unless this `viewChild` constant export is accessed. It's a
    // self-contained side effect that is local to the user facing `viewChild` export.
    contentChildFn.required = contentChildRequiredFn;
    return contentChildFn;
})();
/**
 * Initializes a content children query.
 *
 * Query results are represented as a signal of a read-only collection containing all matched
 * elements.
 *
 * @usageNotes
 * Create a children query in your component by declaring a
 * class field and initializing it with the `contentChildren()` function.
 *
 * ```ts
 * @Component({...})
 * export class TestComponent {
 *   headerEl = contentChildren<ElementRef>('h');   // Signal<ReadonlyArray<ElementRef>>
 * }
 * ```
 *
 * @initializerApiFunction
 * @publicAPI
 */
function contentChildren(locator, opts) {
    return createMultiResultQuerySignalFn(opts);
}

/**
 * Creates a model signal.
 *
 * @param initialValue The initial value.
 *   Can be set to {@link REQUIRED_UNSET_VALUE} for required model signals.
 * @param options Additional options for the model.
 */
function createModelSignal(initialValue, opts) {
    const node = Object.create(INPUT_SIGNAL_NODE);
    const emitterRef = new OutputEmitterRef();
    node.value = initialValue;
    function getter() {
        producerAccessed(node);
        assertModelSet(node.value);
        return node.value;
    }
    getter[SIGNAL] = node;
    getter.asReadonly = signalAsReadonlyFn.bind(getter);
    // TODO: Should we throw an error when updating a destroyed model?
    getter.set = (newValue) => {
        if (!node.equal(node.value, newValue)) {
            signalSetFn(node, newValue);
            emitterRef.emit(newValue);
        }
    };
    getter.update = (updateFn) => {
        assertModelSet(node.value);
        getter.set(updateFn(node.value));
    };
    getter.subscribe = emitterRef.subscribe.bind(emitterRef);
    getter.destroyRef = emitterRef.destroyRef;
    if (ngDevMode) {
        getter.toString = () => `[Model Signal: ${getter()}]`;
        node.debugName = opts?.debugName;
    }
    return getter;
}
/** Asserts that a model's value is set. */
function assertModelSet(value) {
    if (value === REQUIRED_UNSET_VALUE) {
        throw new RuntimeError(952 /* RuntimeErrorCode.REQUIRED_MODEL_NO_VALUE */, ngDevMode && 'Model is required but no value is available yet.');
    }
}

function modelFunction(initialValue, opts) {
    ngDevMode && assertInInjectionContext(model);
    return createModelSignal(initialValue, opts);
}
function modelRequiredFunction(opts) {
    ngDevMode && assertInInjectionContext(model);
    return createModelSignal(REQUIRED_UNSET_VALUE, opts);
}
/**
 * `model` declares a writeable signal that is exposed as an input/output
 * pair on the containing directive.
 *
 * The input name is taken either from the class member or from the `alias` option.
 * The output name is generated by taking the input name and appending `Change`.
 *
 * @usageNotes
 *
 * To use `model()`, import the function from `@angular/core`.
 *
 * ```ts
 * import {model} from '@angular/core`;
 * ```
 *
 * Inside your component, introduce a new class member and initialize
 * it with a call to `model` or `model.required`.
 *
 * ```ts
 * @Directive({
 *   ...
 * })
 * export class MyDir {
 *   firstName = model<string>();            // ModelSignal<string|undefined>
 *   lastName  = model.required<string>();   // ModelSignal<string>
 *   age       = model(0);                   // ModelSignal<number>
 * }
 * ```
 *
 * Inside your component template, you can display the value of a `model`
 * by calling the signal.
 *
 * ```html
 * <span>{{firstName()}}</span>
 * ```
 *
 * Updating the `model` is equivalent to updating a writable signal.
 *
 * ```ts
 * updateName(newFirstName: string): void {
 *   this.firstName.set(newFirstName);
 * }
 * ```
 *
 * @publicAPI
 * @initializerApiFunction
 */
const model = (() => {
    // Note: This may be considered a side-effect, but nothing will depend on
    // this assignment, unless this `model` constant export is accessed. It's a
    // self-contained side effect that is local to the user facing `model` export.
    modelFunction.required = modelRequiredFunction;
    return modelFunction;
})();

// Stores the default value of `emitDistinctChangesOnly` when the `emitDistinctChangesOnly` is not
// explicitly set.
const emitDistinctChangesOnlyDefaultValue = true;
/**
 * Base class for query metadata.
 *
 * @see {@link ContentChildren}
 * @see {@link ContentChild}
 * @see {@link ViewChildren}
 * @see {@link ViewChild}
 *
 * @publicApi
 */
class Query {
}
/**
 * ContentChildren decorator and metadata.
 *
 *
 * @Annotation
 * @publicApi
 */
const ContentChildren = makePropDecorator('ContentChildren', (selector, opts = {}) => ({
    selector,
    first: false,
    isViewQuery: false,
    descendants: false,
    emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue,
    ...opts,
}), Query);
/**
 * ContentChild decorator and metadata.
 *
 *
 * @Annotation
 *
 * @publicApi
 */
const ContentChild = makePropDecorator('ContentChild', (selector, opts = {}) => ({
    selector,
    first: true,
    isViewQuery: false,
    descendants: true,
    ...opts,
}), Query);
/**
 * ViewChildren decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const ViewChildren = makePropDecorator('ViewChildren', (selector, opts = {}) => ({
    selector,
    first: false,
    isViewQuery: true,
    descendants: true,
    emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue,
    ...opts,
}), Query);
/**
 * ViewChild decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const ViewChild = makePropDecorator('ViewChild', (selector, opts) => ({
    selector,
    first: true,
    isViewQuery: true,
    descendants: true,
    ...opts,
}), Query);

/**
 * Used to resolve resource URLs on `@Component` when used with JIT compilation.
 *
 * Example:
 * ```ts
 * @Component({
 *   selector: 'my-comp',
 *   templateUrl: 'my-comp.html', // This requires asynchronous resolution
 * })
 * class MyComponent{
 * }
 *
 * // Calling `renderComponent` will fail because `renderComponent` is a synchronous process
 * // and `MyComponent`'s `@Component.templateUrl` needs to be resolved asynchronously.
 *
 * // Calling `resolveComponentResources()` will resolve `@Component.templateUrl` into
 * // `@Component.template`, which allows `renderComponent` to proceed in a synchronous manner.
 *
 * // Use browser's `fetch()` function as the default resource resolution strategy.
 * resolveComponentResources(fetch).then(() => {
 *   // After resolution all URLs have been converted into `template` strings.
 *   renderComponent(MyComponent);
 * });
 *
 * ```
 *
 * NOTE: In AOT the resolution happens during compilation, and so there should be no need
 * to call this method outside JIT mode.
 *
 * @param resourceResolver a function which is responsible for returning a `Promise` to the
 * contents of the resolved URL. Browser's `fetch()` method is a good default implementation.
 */
function resolveComponentResources(resourceResolver) {
    // Store all promises which are fetching the resources.
    const componentResolved = [];
    // Cache so that we don't fetch the same resource more than once.
    const urlMap = new Map();
    function cachedResourceResolve(url) {
        let promise = urlMap.get(url);
        if (!promise) {
            const resp = resourceResolver(url);
            urlMap.set(url, (promise = resp.then(unwrapResponse)));
        }
        return promise;
    }
    componentResourceResolutionQueue.forEach((component, type) => {
        const promises = [];
        if (component.templateUrl) {
            promises.push(cachedResourceResolve(component.templateUrl).then((template) => {
                component.template = template;
            }));
        }
        const styles = typeof component.styles === 'string' ? [component.styles] : component.styles || [];
        component.styles = styles;
        if (component.styleUrl && component.styleUrls?.length) {
            throw new Error('@Component cannot define both `styleUrl` and `styleUrls`. ' +
                'Use `styleUrl` if the component has one stylesheet, or `styleUrls` if it has multiple');
        }
        else if (component.styleUrls?.length) {
            const styleOffset = component.styles.length;
            const styleUrls = component.styleUrls;
            component.styleUrls.forEach((styleUrl, index) => {
                styles.push(''); // pre-allocate array.
                promises.push(cachedResourceResolve(styleUrl).then((style) => {
                    styles[styleOffset + index] = style;
                    styleUrls.splice(styleUrls.indexOf(styleUrl), 1);
                    if (styleUrls.length == 0) {
                        component.styleUrls = undefined;
                    }
                }));
            });
        }
        else if (component.styleUrl) {
            promises.push(cachedResourceResolve(component.styleUrl).then((style) => {
                styles.push(style);
                component.styleUrl = undefined;
            }));
        }
        const fullyResolved = Promise.all(promises).then(() => componentDefResolved(type));
        componentResolved.push(fullyResolved);
    });
    clearResolutionOfComponentResourcesQueue();
    return Promise.all(componentResolved).then(() => undefined);
}
let componentResourceResolutionQueue = new Map();
// Track when existing ɵcmp for a Type is waiting on resources.
const componentDefPendingResolution = new Set();
function maybeQueueResolutionOfComponentResources(type, metadata) {
    if (componentNeedsResolution(metadata)) {
        componentResourceResolutionQueue.set(type, metadata);
        componentDefPendingResolution.add(type);
    }
}
function isComponentDefPendingResolution(type) {
    return componentDefPendingResolution.has(type);
}
function componentNeedsResolution(component) {
    return !!((component.templateUrl && !component.hasOwnProperty('template')) ||
        (component.styleUrls && component.styleUrls.length) ||
        component.styleUrl);
}
function clearResolutionOfComponentResourcesQueue() {
    const old = componentResourceResolutionQueue;
    componentResourceResolutionQueue = new Map();
    return old;
}
function restoreComponentResolutionQueue(queue) {
    componentDefPendingResolution.clear();
    queue.forEach((_, type) => componentDefPendingResolution.add(type));
    componentResourceResolutionQueue = queue;
}
function isComponentResourceResolutionQueueEmpty() {
    return componentResourceResolutionQueue.size === 0;
}
function unwrapResponse(response) {
    return typeof response == 'string' ? response : response.text();
}
function componentDefResolved(type) {
    componentDefPendingResolution.delete(type);
}

/**
 * Map of module-id to the corresponding NgModule.
 */
const modules = new Map();
/**
 * Whether to check for duplicate NgModule registrations.
 *
 * This can be disabled for testing.
 */
let checkForDuplicateNgModules = true;
function assertSameOrNotExisting(id, type, incoming) {
    if (type && type !== incoming && checkForDuplicateNgModules) {
        throw new Error(`Duplicate module registered for ${id} - ${stringify(type)} vs ${stringify(type.name)}`);
    }
}
/**
 * Adds the given NgModule type to Angular's NgModule registry.
 *
 * This is generated as a side-effect of NgModule compilation. Note that the `id` is passed in
 * explicitly and not read from the NgModule definition. This is for two reasons: it avoids a
 * megamorphic read, and in JIT there's a chicken-and-egg problem where the NgModule may not be
 * fully resolved when it's registered.
 *
 * @codeGenApi
 */
function registerNgModuleType(ngModuleType, id) {
    const existing = modules.get(id) || null;
    assertSameOrNotExisting(id, existing, ngModuleType);
    modules.set(id, ngModuleType);
}
function getRegisteredNgModuleType(id) {
    return modules.get(id);
}
/**
 * Control whether the NgModule registration system enforces that each NgModule type registered has
 * a unique id.
 *
 * This is useful for testing as the NgModule registry cannot be properly reset between tests with
 * Angular's current API.
 */
function setAllowDuplicateNgModuleIdsForTest(allowDuplicates) {
    checkForDuplicateNgModules = !allowDuplicates;
}

/**
 * Validation function invoked at runtime for each binding that might potentially
 * represent a security-sensitive attribute of an <iframe>.
 * See `IFRAME_SECURITY_SENSITIVE_ATTRS` in the
 * `packages/compiler/src/schema/dom_security_schema.ts` script for the full list
 * of such attributes.
 *
 * @codeGenApi
 */
function ɵɵvalidateIframeAttribute(attrValue, tagName, attrName) {
    const lView = getLView();
    const tNode = getSelectedTNode();
    const element = getNativeByTNode(tNode, lView);
    // Restrict any dynamic bindings of security-sensitive attributes/properties
    // on an <iframe> for security reasons.
    if (tNode.type === 2 /* TNodeType.Element */ && tagName.toLowerCase() === 'iframe') {
        const iframe = element;
        // Unset previously applied `src` and `srcdoc` if we come across a situation when
        // a security-sensitive attribute is set later via an attribute/property binding.
        iframe.src = '';
        iframe.srcdoc = trustedHTMLFromString('');
        // Also remove the <iframe> from the document.
        nativeRemoveNode(lView[RENDERER], iframe);
        const errorMessage = ngDevMode &&
            `Angular has detected that the \`${attrName}\` was applied ` +
                `as a binding to an <iframe>${getTemplateLocationDetails(lView)}. ` +
                `For security reasons, the \`${attrName}\` can be set on an <iframe> ` +
                `as a static attribute only. \n` +
                `To fix this, switch the \`${attrName}\` binding to a static attribute ` +
                `in a template or in host bindings section.`;
        throw new RuntimeError(-910 /* RuntimeErrorCode.UNSAFE_IFRAME_ATTRS */, errorMessage);
    }
    return attrValue;
}

/**
 * Represents an instance of an `NgModule` created by an `NgModuleFactory`.
 * Provides access to the `NgModule` instance and related objects.
 *
 * @publicApi
 */
let NgModuleRef$1 = class NgModuleRef {
};
/**
 * @publicApi
 *
 * @deprecated
 * This class was mostly used as a part of ViewEngine-based JIT API and is no longer needed in Ivy
 * JIT mode. Angular provides APIs that accept NgModule classes directly (such as
 * [PlatformRef.bootstrapModule](api/core/PlatformRef#bootstrapModule) and
 * [createNgModule](api/core/createNgModule)), consider switching to those APIs instead of
 * using factory-based ones.
 */
let NgModuleFactory$1 = class NgModuleFactory {
};

/**
 * Returns a new NgModuleRef instance based on the NgModule class and parent injector provided.
 *
 * @param ngModule NgModule class.
 * @param parentInjector Optional injector instance to use as a parent for the module injector. If
 *     not provided, `NullInjector` will be used instead.
 * @returns NgModuleRef that represents an NgModule instance.
 *
 * @publicApi
 */
function createNgModule(ngModule, parentInjector) {
    return new NgModuleRef(ngModule, parentInjector ?? null, []);
}
/**
 * The `createNgModule` function alias for backwards-compatibility.
 * Please avoid using it directly and use `createNgModule` instead.
 *
 * @deprecated Use `createNgModule` instead.
 */
const createNgModuleRef = createNgModule;
class NgModuleRef extends NgModuleRef$1 {
    ngModuleType;
    _parent;
    // tslint:disable-next-line:require-internal-with-underscore
    _bootstrapComponents = [];
    _r3Injector;
    instance;
    destroyCbs = [];
    // When bootstrapping a module we have a dependency graph that looks like this:
    // ApplicationRef -> ComponentFactoryResolver -> NgModuleRef. The problem is that if the
    // module being resolved tries to inject the ComponentFactoryResolver, it'll create a
    // circular dependency which will result in a runtime error, because the injector doesn't
    // exist yet. We work around the issue by creating the ComponentFactoryResolver ourselves
    // and providing it, rather than letting the injector resolve it.
    componentFactoryResolver = new ComponentFactoryResolver(this);
    constructor(ngModuleType, _parent, additionalProviders, runInjectorInitializers = true) {
        super();
        this.ngModuleType = ngModuleType;
        this._parent = _parent;
        const ngModuleDef = getNgModuleDef(ngModuleType);
        ngDevMode &&
            assertDefined(ngModuleDef, `NgModule '${stringify(ngModuleType)}' is not a subtype of 'NgModuleType'.`);
        this._bootstrapComponents = maybeUnwrapFn(ngModuleDef.bootstrap);
        this._r3Injector = createInjectorWithoutInjectorInstances(ngModuleType, _parent, [
            { provide: NgModuleRef$1, useValue: this },
            {
                provide: ComponentFactoryResolver$1,
                useValue: this.componentFactoryResolver,
            },
            ...additionalProviders,
        ], stringify(ngModuleType), new Set(['environment']));
        // We need to resolve the injector types separately from the injector creation, because
        // the module might be trying to use this ref in its constructor for DI which will cause a
        // circular error that will eventually error out, because the injector isn't created yet.
        if (runInjectorInitializers) {
            this.resolveInjectorInitializers();
        }
    }
    resolveInjectorInitializers() {
        this._r3Injector.resolveInjectorInitializers();
        this.instance = this._r3Injector.get(this.ngModuleType);
    }
    get injector() {
        return this._r3Injector;
    }
    destroy() {
        ngDevMode && assertDefined(this.destroyCbs, 'NgModule already destroyed');
        const injector = this._r3Injector;
        !injector.destroyed && injector.destroy();
        this.destroyCbs.forEach((fn) => fn());
        this.destroyCbs = null;
    }
    onDestroy(callback) {
        ngDevMode && assertDefined(this.destroyCbs, 'NgModule already destroyed');
        this.destroyCbs.push(callback);
    }
}
class NgModuleFactory extends NgModuleFactory$1 {
    moduleType;
    constructor(moduleType) {
        super();
        this.moduleType = moduleType;
    }
    create(parentInjector) {
        return new NgModuleRef(this.moduleType, parentInjector, []);
    }
}
function createNgModuleRefWithProviders(moduleType, parentInjector, additionalProviders) {
    return new NgModuleRef(moduleType, parentInjector, additionalProviders, false);
}
class EnvironmentNgModuleRefAdapter extends NgModuleRef$1 {
    injector;
    componentFactoryResolver = new ComponentFactoryResolver(this);
    instance = null;
    constructor(config) {
        super();
        const injector = new R3Injector([
            ...config.providers,
            { provide: NgModuleRef$1, useValue: this },
            { provide: ComponentFactoryResolver$1, useValue: this.componentFactoryResolver },
        ], config.parent || getNullInjector(), config.debugName, new Set(['environment']));
        this.injector = injector;
        if (config.runEnvironmentInitializers) {
            injector.resolveInjectorInitializers();
        }
    }
    destroy() {
        this.injector.destroy();
    }
    onDestroy(callback) {
        this.injector.onDestroy(callback);
    }
}
/**
 * Create a new environment injector.
 *
 * @param providers An array of providers.
 * @param parent A parent environment injector.
 * @param debugName An optional name for this injector instance, which will be used in error
 *     messages.
 *
 * @publicApi
 */
function createEnvironmentInjector(providers, parent, debugName = null) {
    const adapter = new EnvironmentNgModuleRefAdapter({
        providers,
        parent,
        debugName,
        runEnvironmentInitializers: true,
    });
    return adapter.injector;
}

/**
 * A service used by the framework to create instances of standalone injectors. Those injectors are
 * created on demand in case of dynamic component instantiation and contain ambient providers
 * collected from the imports graph rooted at a given standalone component.
 */
class StandaloneService {
    _injector;
    cachedInjectors = new Map();
    constructor(_injector) {
        this._injector = _injector;
    }
    getOrCreateStandaloneInjector(componentDef) {
        if (!componentDef.standalone) {
            return null;
        }
        if (!this.cachedInjectors.has(componentDef)) {
            const providers = internalImportProvidersFrom(false, componentDef.type);
            const standaloneInjector = providers.length > 0
                ? createEnvironmentInjector([providers], this._injector, `Standalone[${componentDef.type.name}]`)
                : null;
            this.cachedInjectors.set(componentDef, standaloneInjector);
        }
        return this.cachedInjectors.get(componentDef);
    }
    ngOnDestroy() {
        try {
            for (const injector of this.cachedInjectors.values()) {
                if (injector !== null) {
                    injector.destroy();
                }
            }
        }
        finally {
            this.cachedInjectors.clear();
        }
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: StandaloneService,
        providedIn: 'environment',
        factory: () => new StandaloneService(ɵɵinject(EnvironmentInjector)),
    });
}

/**
 * Create a component definition object.
 *
 *
 * # Example
 * ```ts
 * class MyComponent {
 *   // Generated by Angular Template Compiler
 *   // [Symbol] syntax will not be supported by TypeScript until v2.7
 *   static ɵcmp = defineComponent({
 *     ...
 *   });
 * }
 * ```
 * @codeGenApi
 */
function ɵɵdefineComponent(componentDefinition) {
    return noSideEffects(() => {
        // Initialize ngDevMode. This must be the first statement in ɵɵdefineComponent.
        // See the `initNgDevMode` docstring for more information.
        (typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode();
        const baseDef = getNgDirectiveDef(componentDefinition);
        const def = {
            ...baseDef,
            decls: componentDefinition.decls,
            vars: componentDefinition.vars,
            template: componentDefinition.template,
            consts: componentDefinition.consts || null,
            ngContentSelectors: componentDefinition.ngContentSelectors,
            onPush: componentDefinition.changeDetection === ChangeDetectionStrategy.OnPush,
            directiveDefs: null, // assigned in noSideEffects
            pipeDefs: null, // assigned in noSideEffects
            dependencies: (baseDef.standalone && componentDefinition.dependencies) || null,
            getStandaloneInjector: baseDef.standalone
                ? (parentInjector) => {
                    return parentInjector.get(StandaloneService).getOrCreateStandaloneInjector(def);
                }
                : null,
            getExternalStyles: null,
            signals: componentDefinition.signals ?? false,
            data: componentDefinition.data || {},
            encapsulation: componentDefinition.encapsulation || ViewEncapsulation.Emulated,
            styles: componentDefinition.styles || EMPTY_ARRAY,
            _: null,
            schemas: componentDefinition.schemas || null,
            tView: null,
            id: '',
        };
        // TODO: Do we still need/want this ?
        if (baseDef.standalone) {
            performanceMarkFeature('NgStandalone');
        }
        initFeatures(def);
        const dependencies = componentDefinition.dependencies;
        def.directiveDefs = extractDefListOrFactory(dependencies, /* pipeDef */ false);
        def.pipeDefs = extractDefListOrFactory(dependencies, /* pipeDef */ true);
        def.id = getComponentId(def);
        return def;
    });
}
function extractDirectiveDef(type) {
    return getComponentDef(type) || getDirectiveDef(type);
}
function nonNull(value) {
    return value !== null;
}
/**
 * @codeGenApi
 */
function ɵɵdefineNgModule(def) {
    return noSideEffects(() => {
        const res = {
            type: def.type,
            bootstrap: def.bootstrap || EMPTY_ARRAY,
            declarations: def.declarations || EMPTY_ARRAY,
            imports: def.imports || EMPTY_ARRAY,
            exports: def.exports || EMPTY_ARRAY,
            transitiveCompileScopes: null,
            schemas: def.schemas || null,
            id: def.id || null,
        };
        return res;
    });
}
/**
 * Converts binding objects from the `DirectiveDefinition` into more efficient
 * lookup dictionaries that are optimized for the framework runtime.
 *
 * This function converts inputs or output directive information into new objects
 * where the public name conveniently maps to the minified internal field name.
 *
 * For inputs, the input flags are additionally persisted into the new data structure,
 * so that those can be quickly retrieved when needed.
 *
 * e.g. for
 *
 * ```ts
 * class Comp {
 *   @Input()
 *   propName1: string;
 *
 *   @Input('publicName2')
 *   declaredPropName2: number;
 *
 *   inputSignal = input(3);
 * }
 * ```
 *
 * will be serialized as
 *
 * ```ts
 * {
 *   propName1: 'propName1',
 *   declaredPropName2: ['publicName2', 'declaredPropName2'],
 *   inputSignal: [InputFlags.SignalBased, 'inputSignal'],
 * }
 * ```
 *
 * which is than translated by the minifier as:
 *
 * ```ts
 * {
 *   minifiedPropName1: 'propName1',
 *   minifiedPropName2: ['publicName2', 'declaredPropName2'],
 *   minifiedInputSignal: [InputFlags.SignalBased, 'inputSignal'],
 * }
 * ```
 *
 * becomes: (public name => minifiedName + isSignal if needed)
 *
 * ```ts
 * {
 *  'propName1': 'minifiedPropName1',
 *  'publicName2': 'minifiedPropName2',
 *  'inputSignal': ['minifiedInputSignal', InputFlags.SignalBased],
 * }
 * ```
 *
 * Optionally the function can take `declaredInputs` which will result
 * in: (public name => declared name)
 *
 * ```ts
 * {
 *  'propName1': 'propName1',
 *  'publicName2': 'declaredPropName2',
 *  'inputSignal': 'inputSignal',
 * }
 * ```
 *

 */
function parseAndConvertInputsForDefinition(obj, declaredInputs) {
    if (obj == null)
        return EMPTY_OBJ;
    const newLookup = {};
    for (const minifiedKey in obj) {
        if (obj.hasOwnProperty(minifiedKey)) {
            const value = obj[minifiedKey];
            let publicName;
            let declaredName;
            let inputFlags;
            let transform;
            if (Array.isArray(value)) {
                inputFlags = value[0];
                publicName = value[1];
                declaredName = value[2] ?? publicName; // declared name might not be set to save bytes.
                transform = value[3] || null;
            }
            else {
                publicName = value;
                declaredName = value;
                inputFlags = InputFlags.None;
                transform = null;
            }
            newLookup[publicName] = [minifiedKey, inputFlags, transform];
            declaredInputs[publicName] = declaredName;
        }
    }
    return newLookup;
}
function parseAndConvertOutputsForDefinition(obj) {
    if (obj == null)
        return EMPTY_OBJ;
    const newLookup = {};
    for (const minifiedKey in obj) {
        if (obj.hasOwnProperty(minifiedKey)) {
            newLookup[obj[minifiedKey]] = minifiedKey;
        }
    }
    return newLookup;
}
/**
 * Create a directive definition object.
 *
 * # Example
 * ```ts
 * class MyDirective {
 *   // Generated by Angular Template Compiler
 *   // [Symbol] syntax will not be supported by TypeScript until v2.7
 *   static ɵdir = ɵɵdefineDirective({
 *     ...
 *   });
 * }
 * ```
 *
 * @codeGenApi
 */
function ɵɵdefineDirective(directiveDefinition) {
    return noSideEffects(() => {
        const def = getNgDirectiveDef(directiveDefinition);
        initFeatures(def);
        return def;
    });
}
/**
 * Create a pipe definition object.
 *
 * # Example
 * ```ts
 * class MyPipe implements PipeTransform {
 *   // Generated by Angular Template Compiler
 *   static ɵpipe = definePipe({
 *     ...
 *   });
 * }
 * ```
 * @param pipeDef Pipe definition generated by the compiler
 *
 * @codeGenApi
 */
function ɵɵdefinePipe(pipeDef) {
    return {
        type: pipeDef.type,
        name: pipeDef.name,
        factory: null,
        pure: pipeDef.pure !== false,
        standalone: pipeDef.standalone ?? true,
        onDestroy: pipeDef.type.prototype.ngOnDestroy || null,
    };
}
function getNgDirectiveDef(directiveDefinition) {
    const declaredInputs = {};
    return {
        type: directiveDefinition.type,
        providersResolver: null,
        factory: null,
        hostBindings: directiveDefinition.hostBindings || null,
        hostVars: directiveDefinition.hostVars || 0,
        hostAttrs: directiveDefinition.hostAttrs || null,
        contentQueries: directiveDefinition.contentQueries || null,
        declaredInputs: declaredInputs,
        inputConfig: directiveDefinition.inputs || EMPTY_OBJ,
        exportAs: directiveDefinition.exportAs || null,
        standalone: directiveDefinition.standalone ?? true,
        signals: directiveDefinition.signals === true,
        selectors: directiveDefinition.selectors || EMPTY_ARRAY,
        viewQuery: directiveDefinition.viewQuery || null,
        features: directiveDefinition.features || null,
        setInput: null,
        findHostDirectiveDefs: null,
        hostDirectives: null,
        inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs),
        outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs),
        debugInfo: null,
    };
}
function initFeatures(definition) {
    definition.features?.forEach((fn) => fn(definition));
}
function extractDefListOrFactory(dependencies, pipeDef) {
    if (!dependencies) {
        return null;
    }
    const defExtractor = pipeDef ? getPipeDef$1 : extractDirectiveDef;
    return () => (typeof dependencies === 'function' ? dependencies() : dependencies)
        .map((dep) => defExtractor(dep))
        .filter(nonNull);
}
/**
 * A map that contains the generated component IDs and type.
 */
const GENERATED_COMP_IDS = new Map();
/**
 * A method can returns a component ID from the component definition using a variant of DJB2 hash
 * algorithm.
 */
function getComponentId(componentDef) {
    let hash = 0;
    // For components with i18n in templates, the `consts` array is generated by the compiler
    // as a function. If client and server bundles were produced with different minification
    // configurations, the serializable contents of the function body would be different on
    // the client and on the server. This might result in different ids generated. To avoid this
    // issue, we do not take the `consts` contents into account if it's a function.
    // See https://github.com/angular/angular/issues/58713.
    const componentDefConsts = typeof componentDef.consts === 'function' ? '' : componentDef.consts;
    // We cannot rely solely on the component selector as the same selector can be used in different
    // modules.
    //
    // `componentDef.style` is not used, due to it causing inconsistencies. Ex: when server
    // component styles has no sourcemaps and browsers do.
    //
    // Example:
    // https://github.com/angular/components/blob/d9f82c8f95309e77a6d82fd574c65871e91354c2/src/material/core/option/option.ts#L248
    // https://github.com/angular/components/blob/285f46dc2b4c5b127d356cb7c4714b221f03ce50/src/material/legacy-core/option/option.ts#L32
    const hashSelectors = [
        componentDef.selectors,
        componentDef.ngContentSelectors,
        componentDef.hostVars,
        componentDef.hostAttrs,
        componentDefConsts,
        componentDef.vars,
        componentDef.decls,
        componentDef.encapsulation,
        componentDef.standalone,
        componentDef.signals,
        componentDef.exportAs,
        JSON.stringify(componentDef.inputs),
        JSON.stringify(componentDef.outputs),
        // We cannot use 'componentDef.type.name' as the name of the symbol will change and will not
        // match in the server and browser bundles.
        Object.getOwnPropertyNames(componentDef.type.prototype),
        !!componentDef.contentQueries,
        !!componentDef.viewQuery,
    ];
    if (typeof ngDevMode === 'undefined' || ngDevMode) {
        // If client and server bundles were produced with different minification configurations,
        // the serializable contents of the function body would be different on the client and on
        // the server. Ensure that we do not accidentally use functions in component id computation.
        for (const item of hashSelectors) {
            assertNotEqual(typeof item, 'function', 'Internal error: attempting to use a function in component id computation logic.');
        }
    }
    for (const char of hashSelectors.join('|')) {
        hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;
    }
    // Force positive number hash.
    // 2147483647 = equivalent of Integer.MAX_VALUE.
    hash += 2147483647 + 1;
    const compId = 'c' + hash;
    if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
        // Skip the check on the server since we can't guarantee the same component instance between
        // requests. Note that we can't use DI to check if we're on the server, because the component
        // hasn't been instantiated yet.
        (typeof ngServerMode === 'undefined' || !ngServerMode)) {
        if (GENERATED_COMP_IDS.has(compId)) {
            const previousCompDefType = GENERATED_COMP_IDS.get(compId);
            if (previousCompDefType !== componentDef.type) {
                console.warn(formatRuntimeError(-912 /* RuntimeErrorCode.COMPONENT_ID_COLLISION */, `Component ID generation collision detected. Components '${previousCompDefType.name}' and '${componentDef.type.name}' with selector '${stringifyCSSSelectorList(componentDef.selectors)}' generated the same component ID. To fix this, you can change the selector of one of those components or add an extra host attribute to force a different ID.`));
            }
        }
        else {
            GENERATED_COMP_IDS.set(compId, componentDef.type);
        }
    }
    return compId;
}

function getSuperType(type) {
    return Object.getPrototypeOf(type.prototype).constructor;
}
/**
 * Merges the definition from a super class to a sub class.
 * @param definition The definition that is a SubClass of another directive of component
 *
 * @codeGenApi
 */
function ɵɵInheritDefinitionFeature(definition) {
    let superType = getSuperType(definition.type);
    let shouldInheritFields = true;
    const inheritanceChain = [definition];
    while (superType) {
        let superDef = undefined;
        if (isComponentDef(definition)) {
            // Don't use getComponentDef/getDirectiveDef. This logic relies on inheritance.
            superDef = superType.ɵcmp || superType.ɵdir;
        }
        else {
            if (superType.ɵcmp) {
                throw new RuntimeError(903 /* RuntimeErrorCode.INVALID_INHERITANCE */, ngDevMode &&
                    `Directives cannot inherit Components. Directive ${stringifyForError(definition.type)} is attempting to extend component ${stringifyForError(superType)}`);
            }
            // Don't use getComponentDef/getDirectiveDef. This logic relies on inheritance.
            superDef = superType.ɵdir;
        }
        if (superDef) {
            if (shouldInheritFields) {
                inheritanceChain.push(superDef);
                // Some fields in the definition may be empty, if there were no values to put in them that
                // would've justified object creation. Unwrap them if necessary.
                const writeableDef = definition;
                writeableDef.inputs = maybeUnwrapEmpty(definition.inputs);
                writeableDef.declaredInputs = maybeUnwrapEmpty(definition.declaredInputs);
                writeableDef.outputs = maybeUnwrapEmpty(definition.outputs);
                // Merge hostBindings
                const superHostBindings = superDef.hostBindings;
                superHostBindings && inheritHostBindings(definition, superHostBindings);
                // Merge queries
                const superViewQuery = superDef.viewQuery;
                const superContentQueries = superDef.contentQueries;
                superViewQuery && inheritViewQuery(definition, superViewQuery);
                superContentQueries && inheritContentQueries(definition, superContentQueries);
                // Merge inputs and outputs
                mergeInputsWithTransforms(definition, superDef);
                fillProperties(definition.outputs, superDef.outputs);
                // Merge animations metadata.
                // If `superDef` is a Component, the `data` field is present (defaults to an empty object).
                if (isComponentDef(superDef) && superDef.data.animation) {
                    // If super def is a Component, the `definition` is also a Component, since Directives can
                    // not inherit Components (we throw an error above and cannot reach this code).
                    const defData = definition.data;
                    defData.animation = (defData.animation || []).concat(superDef.data.animation);
                }
            }
            // Run parent features
            const features = superDef.features;
            if (features) {
                for (let i = 0; i < features.length; i++) {
                    const feature = features[i];
                    if (feature && feature.ngInherit) {
                        feature(definition);
                    }
                    // If `InheritDefinitionFeature` is a part of the current `superDef`, it means that this
                    // def already has all the necessary information inherited from its super class(es), so we
                    // can stop merging fields from super classes. However we need to iterate through the
                    // prototype chain to look for classes that might contain other "features" (like
                    // NgOnChanges), which we should invoke for the original `definition`. We set the
                    // `shouldInheritFields` flag to indicate that, essentially skipping fields inheritance
                    // logic and only invoking functions from the "features" list.
                    if (feature === ɵɵInheritDefinitionFeature) {
                        shouldInheritFields = false;
                    }
                }
            }
        }
        superType = Object.getPrototypeOf(superType);
    }
    mergeHostAttrsAcrossInheritance(inheritanceChain);
}
function mergeInputsWithTransforms(target, source) {
    for (const key in source.inputs) {
        if (!source.inputs.hasOwnProperty(key)) {
            continue;
        }
        if (target.inputs.hasOwnProperty(key)) {
            continue;
        }
        const value = source.inputs[key];
        if (value !== undefined) {
            target.inputs[key] = value;
            target.declaredInputs[key] = source.declaredInputs[key];
        }
    }
}
/**
 * Merge the `hostAttrs` and `hostVars` from the inherited parent to the base class.
 *
 * @param inheritanceChain A list of `WritableDefs` starting at the top most type and listing
 * sub-types in order. For each type take the `hostAttrs` and `hostVars` and merge it with the child
 * type.
 */
function mergeHostAttrsAcrossInheritance(inheritanceChain) {
    let hostVars = 0;
    let hostAttrs = null;
    // We process the inheritance order from the base to the leaves here.
    for (let i = inheritanceChain.length - 1; i >= 0; i--) {
        const def = inheritanceChain[i];
        // For each `hostVars`, we need to add the superclass amount.
        def.hostVars = hostVars += def.hostVars;
        // for each `hostAttrs` we need to merge it with superclass.
        def.hostAttrs = mergeHostAttrs(def.hostAttrs, (hostAttrs = mergeHostAttrs(hostAttrs, def.hostAttrs)));
    }
}
function maybeUnwrapEmpty(value) {
    if (value === EMPTY_OBJ) {
        return {};
    }
    else if (value === EMPTY_ARRAY) {
        return [];
    }
    else {
        return value;
    }
}
function inheritViewQuery(definition, superViewQuery) {
    const prevViewQuery = definition.viewQuery;
    if (prevViewQuery) {
        definition.viewQuery = (rf, ctx) => {
            superViewQuery(rf, ctx);
            prevViewQuery(rf, ctx);
        };
    }
    else {
        definition.viewQuery = superViewQuery;
    }
}
function inheritContentQueries(definition, superContentQueries) {
    const prevContentQueries = definition.contentQueries;
    if (prevContentQueries) {
        definition.contentQueries = (rf, ctx, directiveIndex) => {
            superContentQueries(rf, ctx, directiveIndex);
            prevContentQueries(rf, ctx, directiveIndex);
        };
    }
    else {
        definition.contentQueries = superContentQueries;
    }
}
function inheritHostBindings(definition, superHostBindings) {
    const prevHostBindings = definition.hostBindings;
    if (prevHostBindings) {
        definition.hostBindings = (rf, ctx) => {
            superHostBindings(rf, ctx);
            prevHostBindings(rf, ctx);
        };
    }
    else {
        definition.hostBindings = superHostBindings;
    }
}

/**
 * Fields which exist on either directive or component definitions, and need to be copied from
 * parent to child classes by the `ɵɵCopyDefinitionFeature`.
 */
const COPY_DIRECTIVE_FIELDS = [
    // The child class should use the providers of its parent.
    'providersResolver',
    // Not listed here are any fields which are handled by the `ɵɵInheritDefinitionFeature`, such
    // as inputs, outputs, and host binding functions.
];
/**
 * Fields which exist only on component definitions, and need to be copied from parent to child
 * classes by the `ɵɵCopyDefinitionFeature`.
 *
 * The type here allows any field of `ComponentDef` which is not also a property of `DirectiveDef`,
 * since those should go in `COPY_DIRECTIVE_FIELDS` above.
 */
const COPY_COMPONENT_FIELDS = [
    // The child class should use the template function of its parent, including all template
    // semantics.
    'template',
    'decls',
    'consts',
    'vars',
    'onPush',
    'ngContentSelectors',
    // The child class should use the CSS styles of its parent, including all styling semantics.
    'styles',
    'encapsulation',
    // The child class should be checked by the runtime in the same way as its parent.
    'schemas',
];
/**
 * Copies the fields not handled by the `ɵɵInheritDefinitionFeature` from the supertype of a
 * definition.
 *
 * This exists primarily to support ngcc migration of an existing View Engine pattern, where an
 * entire decorator is inherited from a parent to a child class. When ngcc detects this case, it
 * generates a skeleton definition on the child class, and applies this feature.
 *
 * The `ɵɵCopyDefinitionFeature` then copies any needed fields from the parent class' definition,
 * including things like the component template function.
 *
 * @param definition The definition of a child class which inherits from a parent class with its
 * own definition.
 *
 * @codeGenApi
 */
function ɵɵCopyDefinitionFeature(definition) {
    let superType = getSuperType(definition.type);
    let superDef = undefined;
    if (isComponentDef(definition)) {
        // Don't use getComponentDef/getDirectiveDef. This logic relies on inheritance.
        superDef = superType.ɵcmp;
    }
    else {
        // Don't use getComponentDef/getDirectiveDef. This logic relies on inheritance.
        superDef = superType.ɵdir;
    }
    // Needed because `definition` fields are readonly.
    const defAny = definition;
    // Copy over any fields that apply to either directives or components.
    for (const field of COPY_DIRECTIVE_FIELDS) {
        defAny[field] = superDef[field];
    }
    if (isComponentDef(superDef)) {
        // Copy over any component-specific fields.
        for (const field of COPY_COMPONENT_FIELDS) {
            defAny[field] = superDef[field];
        }
    }
}

/**
 * This feature adds the host directives behavior to a directive definition by patching a
 * function onto it. The expectation is that the runtime will invoke the function during
 * directive matching.
 *
 * For example:
 * ```ts
 * class ComponentWithHostDirective {
 *   static ɵcmp = defineComponent({
 *    type: ComponentWithHostDirective,
 *    features: [ɵɵHostDirectivesFeature([
 *      SimpleHostDirective,
 *      {directive: AdvancedHostDirective, inputs: ['foo: alias'], outputs: ['bar']},
 *    ])]
 *  });
 * }
 * ```
 *
 * @codeGenApi
 */
function ɵɵHostDirectivesFeature(rawHostDirectives) {
    const feature = (definition) => {
        const isEager = Array.isArray(rawHostDirectives);
        if (definition.hostDirectives === null) {
            definition.findHostDirectiveDefs = findHostDirectiveDefs;
            definition.hostDirectives = isEager
                ? rawHostDirectives.map(createHostDirectiveDef)
                : [rawHostDirectives];
        }
        else if (isEager) {
            definition.hostDirectives.unshift(...rawHostDirectives.map(createHostDirectiveDef));
        }
        else {
            definition.hostDirectives.unshift(rawHostDirectives);
        }
    };
    feature.ngInherit = true;
    return feature;
}
function findHostDirectiveDefs(currentDef, matchedDefs, hostDirectiveDefs) {
    if (currentDef.hostDirectives !== null) {
        for (const configOrFn of currentDef.hostDirectives) {
            if (typeof configOrFn === 'function') {
                const resolved = configOrFn();
                for (const config of resolved) {
                    trackHostDirectiveDef(createHostDirectiveDef(config), matchedDefs, hostDirectiveDefs);
                }
            }
            else {
                trackHostDirectiveDef(configOrFn, matchedDefs, hostDirectiveDefs);
            }
        }
    }
}
/** Tracks a single host directive during directive matching. */
function trackHostDirectiveDef(def, matchedDefs, hostDirectiveDefs) {
    const hostDirectiveDef = getDirectiveDef(def.directive);
    if (typeof ngDevMode === 'undefined' || ngDevMode) {
        validateHostDirective(def, hostDirectiveDef);
    }
    // We need to patch the `declaredInputs` so that
    // `ngOnChanges` can map the properties correctly.
    patchDeclaredInputs(hostDirectiveDef.declaredInputs, def.inputs);
    // Host directives execute before the host so that its host bindings can be overwritten.
    findHostDirectiveDefs(hostDirectiveDef, matchedDefs, hostDirectiveDefs);
    hostDirectiveDefs.set(hostDirectiveDef, def);
    matchedDefs.push(hostDirectiveDef);
}
/** Creates a `HostDirectiveDef` from a used-defined host directive configuration. */
function createHostDirectiveDef(config) {
    return typeof config === 'function'
        ? { directive: resolveForwardRef(config), inputs: EMPTY_OBJ, outputs: EMPTY_OBJ }
        : {
            directive: resolveForwardRef(config.directive),
            inputs: bindingArrayToMap(config.inputs),
            outputs: bindingArrayToMap(config.outputs),
        };
}
/**
 * Converts an array in the form of `['publicName', 'alias', 'otherPublicName', 'otherAlias']` into
 * a map in the form of `{publicName: 'alias', otherPublicName: 'otherAlias'}`.
 */
function bindingArrayToMap(bindings) {
    if (bindings === undefined || bindings.length === 0) {
        return EMPTY_OBJ;
    }
    const result = {};
    for (let i = 0; i < bindings.length; i += 2) {
        result[bindings[i]] = bindings[i + 1];
    }
    return result;
}
/**
 * `ngOnChanges` has some leftover legacy ViewEngine behavior where the keys inside the
 * `SimpleChanges` event refer to the *declared* name of the input, not its public name or its
 * minified name. E.g. in `@Input('alias') foo: string`, the name in the `SimpleChanges` object
 * will always be `foo`, and not `alias` or the minified name of `foo` in apps using property
 * minification.
 *
 * This is achieved through the `DirectiveDef.declaredInputs` map that is constructed when the
 * definition is declared. When a property is written to the directive instance, the
 * `NgOnChangesFeature` will try to remap the property name being written to using the
 * `declaredInputs`.
 *
 * Since the host directive input remapping happens during directive matching, `declaredInputs`
 * won't contain the new alias that the input is available under. This function addresses the
 * issue by patching the host directive aliases to the `declaredInputs`. There is *not* a risk of
 * this patching accidentally introducing new inputs to the host directive, because `declaredInputs`
 * is used *only* by the `NgOnChangesFeature` when determining what name is used in the
 * `SimpleChanges` object which won't be reached if an input doesn't exist.
 */
function patchDeclaredInputs(declaredInputs, exposedInputs) {
    for (const publicName in exposedInputs) {
        if (exposedInputs.hasOwnProperty(publicName)) {
            const remappedPublicName = exposedInputs[publicName];
            const privateName = declaredInputs[publicName];
            // We *technically* shouldn't be able to hit this case because we can't have multiple
            // inputs on the same property and we have validations against conflicting aliases in
            // `validateMappings`. If we somehow did, it would lead to `ngOnChanges` being invoked
            // with the wrong name so we have a non-user-friendly assertion here just in case.
            if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
                declaredInputs.hasOwnProperty(remappedPublicName)) {
                assertEqual(declaredInputs[remappedPublicName], declaredInputs[publicName], `Conflicting host directive input alias ${publicName}.`);
            }
            declaredInputs[remappedPublicName] = privateName;
        }
    }
}
/**
 * Verifies that the host directive has been configured correctly.
 * @param hostDirectiveConfig Host directive configuration object.
 * @param directiveDef Directive definition of the host directive.
 */
function validateHostDirective(hostDirectiveConfig, directiveDef) {
    const type = hostDirectiveConfig.directive;
    if (directiveDef === null) {
        if (getComponentDef(type) !== null) {
            throw new RuntimeError(310 /* RuntimeErrorCode.HOST_DIRECTIVE_COMPONENT */, `Host directive ${type.name} cannot be a component.`);
        }
        throw new RuntimeError(307 /* RuntimeErrorCode.HOST_DIRECTIVE_UNRESOLVABLE */, `Could not resolve metadata for host directive ${type.name}. ` +
            `Make sure that the ${type.name} class is annotated with an @Directive decorator.`);
    }
    if (!directiveDef.standalone) {
        throw new RuntimeError(308 /* RuntimeErrorCode.HOST_DIRECTIVE_NOT_STANDALONE */, `Host directive ${directiveDef.type.name} must be standalone.`);
    }
    validateMappings('input', directiveDef, hostDirectiveConfig.inputs);
    validateMappings('output', directiveDef, hostDirectiveConfig.outputs);
}
/**
 * Checks that the host directive inputs/outputs configuration is valid.
 * @param bindingType Kind of binding that is being validated. Used in the error message.
 * @param def Definition of the host directive that is being validated against.
 * @param hostDirectiveBindings Host directive mapping object that shold be validated.
 */
function validateMappings(bindingType, def, hostDirectiveBindings) {
    const className = def.type.name;
    const bindings = bindingType === 'input' ? def.inputs : def.outputs;
    for (const publicName in hostDirectiveBindings) {
        if (hostDirectiveBindings.hasOwnProperty(publicName)) {
            if (!bindings.hasOwnProperty(publicName)) {
                throw new RuntimeError(311 /* RuntimeErrorCode.HOST_DIRECTIVE_UNDEFINED_BINDING */, `Directive ${className} does not have an ${bindingType} with a public name of ${publicName}.`);
            }
            const remappedPublicName = hostDirectiveBindings[publicName];
            if (bindings.hasOwnProperty(remappedPublicName) && remappedPublicName !== publicName) {
                throw new RuntimeError(312 /* RuntimeErrorCode.HOST_DIRECTIVE_CONFLICTING_ALIAS */, `Cannot alias ${bindingType} ${publicName} of host directive ${className} to ${remappedPublicName}, because it already has a different ${bindingType} with the same public name.`);
            }
        }
    }
}

function isListLikeIterable(obj) {
    if (!isJsObject(obj))
        return false;
    return (Array.isArray(obj) ||
        (!(obj instanceof Map) && // JS Map are iterables but return entries as [k, v]
            Symbol.iterator in obj)); // JS Iterable have a Symbol.iterator prop
}
function areIterablesEqual(a, b, comparator) {
    const iterator1 = a[Symbol.iterator]();
    const iterator2 = b[Symbol.iterator]();
    while (true) {
        const item1 = iterator1.next();
        const item2 = iterator2.next();
        if (item1.done && item2.done)
            return true;
        if (item1.done || item2.done)
            return false;
        if (!comparator(item1.value, item2.value))
            return false;
    }
}
function iterateListLike(obj, fn) {
    if (Array.isArray(obj)) {
        for (let i = 0; i < obj.length; i++) {
            fn(obj[i]);
        }
    }
    else {
        const iterator = obj[Symbol.iterator]();
        let item;
        while (!(item = iterator.next()).done) {
            fn(item.value);
        }
    }
}
function isJsObject(o) {
    return o !== null && (typeof o === 'function' || typeof o === 'object');
}

function devModeEqual(a, b) {
    const isListLikeIterableA = isListLikeIterable(a);
    const isListLikeIterableB = isListLikeIterable(b);
    if (isListLikeIterableA && isListLikeIterableB) {
        return areIterablesEqual(a, b, devModeEqual);
    }
    else {
        const isAObject = a && (typeof a === 'object' || typeof a === 'function');
        const isBObject = b && (typeof b === 'object' || typeof b === 'function');
        if (!isListLikeIterableA && isAObject && !isListLikeIterableB && isBObject) {
            return true;
        }
        else {
            return Object.is(a, b);
        }
    }
}

// TODO(misko): consider inlining
/** Updates binding and returns the value. */
function updateBinding(lView, bindingIndex, value) {
    return (lView[bindingIndex] = value);
}
/** Gets the current binding value. */
function getBinding(lView, bindingIndex) {
    ngDevMode && assertIndexInRange(lView, bindingIndex);
    ngDevMode &&
        assertNotSame(lView[bindingIndex], NO_CHANGE, 'Stored value should never be NO_CHANGE.');
    return lView[bindingIndex];
}
/**
 * Updates binding if changed, then returns whether it was updated.
 *
 * This function also checks the `CheckNoChangesMode` and throws if changes are made.
 * Some changes (Objects/iterables) during `CheckNoChangesMode` are exempt to comply with VE
 * behavior.
 *
 * @param lView current `LView`
 * @param bindingIndex The binding in the `LView` to check
 * @param value New value to check against `lView[bindingIndex]`
 * @returns `true` if the bindings has changed. (Throws if binding has changed during
 *          `CheckNoChangesMode`)
 */
function bindingUpdated(lView, bindingIndex, value) {
    ngDevMode && assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
    ngDevMode &&
        assertLessThan(bindingIndex, lView.length, `Slot should have been initialized to NO_CHANGE`);
    const oldValue = lView[bindingIndex];
    if (Object.is(oldValue, value)) {
        return false;
    }
    else {
        if (ngDevMode && isInCheckNoChangesMode()) {
            // View engine didn't report undefined values as changed on the first checkNoChanges pass
            // (before the change detection was run).
            const oldValueToCompare = oldValue !== NO_CHANGE ? oldValue : undefined;
            if (!devModeEqual(oldValueToCompare, value)) {
                const details = getExpressionChangedErrorDetails(lView, bindingIndex, oldValueToCompare, value);
                throwErrorIfNoChangesMode(oldValue === NO_CHANGE, details.oldValue, details.newValue, details.propName, lView);
            }
            // There was a change, but the `devModeEqual` decided that the change is exempt from an error.
            // For this reason we exit as if no change. The early exit is needed to prevent the changed
            // value to be written into `LView` (If we would write the new value that we would not see it
            // as change on next CD.)
            return false;
        }
        lView[bindingIndex] = value;
        return true;
    }
}
/** Updates 2 bindings if changed, then returns whether either was updated. */
function bindingUpdated2(lView, bindingIndex, exp1, exp2) {
    const different = bindingUpdated(lView, bindingIndex, exp1);
    return bindingUpdated(lView, bindingIndex + 1, exp2) || different;
}
/** Updates 3 bindings if changed, then returns whether any was updated. */
function bindingUpdated3(lView, bindingIndex, exp1, exp2, exp3) {
    const different = bindingUpdated2(lView, bindingIndex, exp1, exp2);
    return bindingUpdated(lView, bindingIndex + 2, exp3) || different;
}
/** Updates 4 bindings if changed, then returns whether any was updated. */
function bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4) {
    const different = bindingUpdated2(lView, bindingIndex, exp1, exp2);
    return bindingUpdated2(lView, bindingIndex + 2, exp3, exp4) || different;
}

function templateFirstCreatePass(index, tView, lView, templateFn, decls, vars, tagName, attrs, localRefsIndex) {
    ngDevMode && assertFirstCreatePass(tView);
    ngDevMode && ngDevMode.firstCreatePass++;
    const tViewConsts = tView.consts;
    // TODO(pk): refactor getOrCreateTNode to have the "create" only version
    const tNode = getOrCreateTNode(tView, index, 4 /* TNodeType.Container */, tagName || null, attrs || null);
    if (getBindingsEnabled()) {
        resolveDirectives(tView, lView, tNode, getConstant(tViewConsts, localRefsIndex), findDirectiveDefMatches);
    }
    // Merge the template attrs last so that they have the highest priority.
    tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);
    registerPostOrderHooks(tView, tNode);
    const embeddedTView = (tNode.tView = createTView(2 /* TViewType.Embedded */, tNode, templateFn, decls, vars, tView.directiveRegistry, tView.pipeRegistry, null, tView.schemas, tViewConsts, null /* ssrId */));
    if (tView.queries !== null) {
        tView.queries.template(tView, tNode);
        embeddedTView.queries = tView.queries.embeddedTView(tNode);
    }
    return tNode;
}
/**
 * Creates an LContainer for an embedded view.
 *
 * @param declarationLView LView in which the template was declared.
 * @param declarationTView TView in which the template wa declared.
 * @param index The index of the conta   iner in the data array
 * @param templateFn Inline template
 * @param decls The number of nodes, local refs, and pipes for this template
 * @param vars The number of bindings for this template
 * @param tagName The name of the container element, if applicable
 * @param attrsIndex Index of template attributes in the `consts` array.
 * @param localRefs Index of the local references in the `consts` array.
 * @param localRefExtractor A function which extracts local-refs values from the template.
 *        Defaults to the current element associated with the local-ref.
 */
function declareTemplate(declarationLView, declarationTView, index, templateFn, decls, vars, tagName, attrs, localRefsIndex, localRefExtractor) {
    const adjustedIndex = index + HEADER_OFFSET;
    const tNode = declarationTView.firstCreatePass
        ? templateFirstCreatePass(adjustedIndex, declarationTView, declarationLView, templateFn, decls, vars, tagName, attrs, localRefsIndex)
        : declarationTView.data[adjustedIndex];
    setCurrentTNode(tNode, false);
    const comment = _locateOrCreateContainerAnchor(declarationTView, declarationLView, tNode, index);
    if (wasLastNodeCreated()) {
        appendChild(declarationTView, declarationLView, comment, tNode);
    }
    attachPatchData(comment, declarationLView);
    const lContainer = createLContainer(comment, declarationLView, comment, tNode);
    declarationLView[adjustedIndex] = lContainer;
    addToEndOfViewTree(declarationLView, lContainer);
    // If hydration is enabled, looks up dehydrated views in the DOM
    // using hydration annotation info and stores those views on LContainer.
    // In client-only mode, this function is a noop.
    populateDehydratedViewsInLContainer(lContainer, tNode, declarationLView);
    if (isDirectiveHost(tNode)) {
        createDirectivesInstances(declarationTView, declarationLView, tNode);
    }
    if (localRefsIndex != null) {
        saveResolvedLocalsInData(declarationLView, tNode, localRefExtractor);
    }
    return tNode;
}
/**
 * Creates an LContainer for an ng-template (dynamically-inserted view), e.g.
 *
 * <ng-template #foo>
 *    <div></div>
 * </ng-template>
 *
 * @param index The index of the container in the data array
 * @param templateFn Inline template
 * @param decls The number of nodes, local refs, and pipes for this template
 * @param vars The number of bindings for this template
 * @param tagName The name of the container element, if applicable
 * @param attrsIndex Index of template attributes in the `consts` array.
 * @param localRefs Index of the local references in the `consts` array.
 * @param localRefExtractor A function which extracts local-refs values from the template.
 *        Defaults to the current element associated with the local-ref.
 *
 * @codeGenApi
 */
function ɵɵtemplate(index, templateFn, decls, vars, tagName, attrsIndex, localRefsIndex, localRefExtractor) {
    const lView = getLView();
    const tView = getTView();
    const attrs = getConstant(tView.consts, attrsIndex);
    declareTemplate(lView, tView, index, templateFn, decls, vars, tagName, attrs, localRefsIndex, localRefExtractor);
    return ɵɵtemplate;
}
let _locateOrCreateContainerAnchor = createContainerAnchorImpl;
/**
 * Regular creation mode for LContainers and their anchor (comment) nodes.
 */
function createContainerAnchorImpl(tView, lView, tNode, index) {
    lastNodeWasCreated(true);
    return lView[RENDERER].createComment(ngDevMode ? 'container' : '');
}
/**
 * Enables hydration code path (to lookup existing elements in DOM)
 * in addition to the regular creation mode for LContainers and their
 * anchor (comment) nodes.
 */
function locateOrCreateContainerAnchorImpl(tView, lView, tNode, index) {
    const hydrationInfo = lView[HYDRATION];
    const isNodeCreationMode = !hydrationInfo ||
        isInSkipHydrationBlock$1() ||
        isDetachedByI18n(tNode) ||
        isDisconnectedNode$1(hydrationInfo, index);
    lastNodeWasCreated(isNodeCreationMode);
    // Regular creation mode.
    if (isNodeCreationMode) {
        return createContainerAnchorImpl(tView, lView);
    }
    const ssrId = hydrationInfo.data[TEMPLATES]?.[index] ?? null;
    // Apply `ssrId` value to the underlying TView if it was not previously set.
    //
    // There might be situations when the same component is present in a template
    // multiple times and some instances are opted-out of using hydration via
    // `ngSkipHydration` attribute. In this scenario, at the time a TView is created,
    // the `ssrId` might be `null` (if the first component is opted-out of hydration).
    // The code below makes sure that the `ssrId` is applied to the TView if it's still
    // `null` and verifies we never try to override it with a different value.
    if (ssrId !== null && tNode.tView !== null) {
        if (tNode.tView.ssrId === null) {
            tNode.tView.ssrId = ssrId;
        }
        else {
            ngDevMode &&
                assertEqual(tNode.tView.ssrId, ssrId, 'Unexpected value of the `ssrId` for this TView');
        }
    }
    // Hydration mode, looking up existing elements in DOM.
    const currentRNode = locateNextRNode(hydrationInfo, tView, lView, tNode);
    ngDevMode && validateNodeExists(currentRNode, lView, tNode);
    setSegmentHead(hydrationInfo, index, currentRNode);
    const viewContainerSize = calcSerializedContainerSize(hydrationInfo, index);
    const comment = siblingAfter(viewContainerSize, currentRNode);
    if (ngDevMode) {
        validateMatchingNode(comment, Node.COMMENT_NODE, null, lView, tNode);
        markRNodeAsClaimedByHydration(comment);
    }
    return comment;
}
function enableLocateOrCreateContainerAnchorImpl() {
    _locateOrCreateContainerAnchor = locateOrCreateContainerAnchorImpl;
}

/**
 * Helper function to schedule a callback to be invoked when a browser becomes idle.
 *
 * @param callback A function to be invoked when a browser becomes idle.
 * @param injector injector for the app
 */
function onIdle(callback, injector) {
    const scheduler = injector.get(IdleScheduler);
    const cleanupFn = () => scheduler.remove(callback);
    scheduler.add(callback);
    return cleanupFn;
}
/**
 * Use shims for the `requestIdleCallback` and `cancelIdleCallback` functions for
 * environments where those functions are not available (e.g. Node.js and Safari).
 *
 * Note: we wrap the `requestIdleCallback` call into a function, so that it can be
 * overridden/mocked in test environment and picked up by the runtime code.
 */
const _requestIdleCallback = () => typeof requestIdleCallback !== 'undefined' ? requestIdleCallback : setTimeout;
const _cancelIdleCallback = () => typeof requestIdleCallback !== 'undefined' ? cancelIdleCallback : clearTimeout;
/**
 * Helper service to schedule `requestIdleCallback`s for batches of defer blocks,
 * to avoid calling `requestIdleCallback` for each defer block (e.g. if
 * defer blocks are defined inside a for loop).
 */
class IdleScheduler {
    // Indicates whether current callbacks are being invoked.
    executingCallbacks = false;
    // Currently scheduled idle callback id.
    idleId = null;
    // Set of callbacks to be invoked next.
    current = new Set();
    // Set of callbacks collected while invoking current set of callbacks.
    // Those callbacks are scheduled for the next idle period.
    deferred = new Set();
    ngZone = inject(NgZone);
    requestIdleCallbackFn = _requestIdleCallback().bind(globalThis);
    cancelIdleCallbackFn = _cancelIdleCallback().bind(globalThis);
    add(callback) {
        const target = this.executingCallbacks ? this.deferred : this.current;
        target.add(callback);
        if (this.idleId === null) {
            this.scheduleIdleCallback();
        }
    }
    remove(callback) {
        const { current, deferred } = this;
        current.delete(callback);
        deferred.delete(callback);
        // If the last callback was removed and there is a pending
        // idle callback - cancel it.
        if (current.size === 0 && deferred.size === 0) {
            this.cancelIdleCallback();
        }
    }
    scheduleIdleCallback() {
        const callback = () => {
            this.cancelIdleCallback();
            this.executingCallbacks = true;
            for (const callback of this.current) {
                callback();
            }
            this.current.clear();
            this.executingCallbacks = false;
            // If there are any callbacks added during an invocation
            // of the current ones - make them "current" and schedule
            // a new idle callback.
            if (this.deferred.size > 0) {
                for (const callback of this.deferred) {
                    this.current.add(callback);
                }
                this.deferred.clear();
                this.scheduleIdleCallback();
            }
        };
        // Ensure that the callback runs in the NgZone since
        // the `requestIdleCallback` is not currently patched by Zone.js.
        this.idleId = this.requestIdleCallbackFn(() => this.ngZone.run(callback));
    }
    cancelIdleCallback() {
        if (this.idleId !== null) {
            this.cancelIdleCallbackFn(this.idleId);
            this.idleId = null;
        }
    }
    ngOnDestroy() {
        this.cancelIdleCallback();
        this.current.clear();
        this.deferred.clear();
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: IdleScheduler,
        providedIn: 'root',
        factory: () => new IdleScheduler(),
    });
}

/**
 * Returns a function that captures a provided delay.
 * Invoking the returned function schedules a trigger.
 */
function onTimer(delay) {
    return (callback, injector) => scheduleTimerTrigger(delay, callback, injector);
}
/**
 * Schedules a callback to be invoked after a given timeout.
 *
 * @param delay A number of ms to wait until firing a callback.
 * @param callback A function to be invoked after a timeout.
 * @param injector injector for the app.
 */
function scheduleTimerTrigger(delay, callback, injector) {
    const scheduler = injector.get(TimerScheduler);
    const ngZone = injector.get(NgZone);
    const cleanupFn = () => scheduler.remove(callback);
    scheduler.add(delay, callback, ngZone);
    return cleanupFn;
}
/**
 * Helper service to schedule `setTimeout`s for batches of defer blocks,
 * to avoid calling `setTimeout` for each defer block (e.g. if defer blocks
 * are created inside a for loop).
 */
class TimerScheduler {
    // Indicates whether current callbacks are being invoked.
    executingCallbacks = false;
    // Currently scheduled `setTimeout` id.
    timeoutId = null;
    // When currently scheduled timer would fire.
    invokeTimerAt = null;
    // List of callbacks to be invoked.
    // For each callback we also store a timestamp on when the callback
    // should be invoked. We store timestamps and callback functions
    // in a flat array to avoid creating new objects for each entry.
    // [timestamp1, callback1, timestamp2, callback2, ...]
    current = [];
    // List of callbacks collected while invoking current set of callbacks.
    // Those callbacks are added to the "current" queue at the end of
    // the current callback invocation. The shape of this list is the same
    // as the shape of the `current` list.
    deferred = [];
    add(delay, callback, ngZone) {
        const target = this.executingCallbacks ? this.deferred : this.current;
        this.addToQueue(target, Date.now() + delay, callback);
        this.scheduleTimer(ngZone);
    }
    remove(callback) {
        const { current, deferred } = this;
        const callbackIndex = this.removeFromQueue(current, callback);
        if (callbackIndex === -1) {
            // Try cleaning up deferred queue only in case
            // we didn't find a callback in the "current" queue.
            this.removeFromQueue(deferred, callback);
        }
        // If the last callback was removed and there is a pending timeout - cancel it.
        if (current.length === 0 && deferred.length === 0) {
            this.clearTimeout();
        }
    }
    addToQueue(target, invokeAt, callback) {
        let insertAtIndex = target.length;
        for (let i = 0; i < target.length; i += 2) {
            const invokeQueuedCallbackAt = target[i];
            if (invokeQueuedCallbackAt > invokeAt) {
                // We've reached a first timer that is scheduled
                // for a later time than what we are trying to insert.
                // This is the location at which we need to insert,
                // no need to iterate further.
                insertAtIndex = i;
                break;
            }
        }
        arrayInsert2(target, insertAtIndex, invokeAt, callback);
    }
    removeFromQueue(target, callback) {
        let index = -1;
        for (let i = 0; i < target.length; i += 2) {
            const queuedCallback = target[i + 1];
            if (queuedCallback === callback) {
                index = i;
                break;
            }
        }
        if (index > -1) {
            // Remove 2 elements: a timestamp slot and
            // the following slot with a callback function.
            arraySplice(target, index, 2);
        }
        return index;
    }
    scheduleTimer(ngZone) {
        const callback = () => {
            this.clearTimeout();
            this.executingCallbacks = true;
            // Clone the current state of the queue, since it might be altered
            // as we invoke callbacks.
            const current = [...this.current];
            // Invoke callbacks that were scheduled to run before the current time.
            const now = Date.now();
            for (let i = 0; i < current.length; i += 2) {
                const invokeAt = current[i];
                const callback = current[i + 1];
                if (invokeAt <= now) {
                    callback();
                }
                else {
                    // We've reached a timer that should not be invoked yet.
                    break;
                }
            }
            // The state of the queue might've changed after callbacks invocation,
            // run the cleanup logic based on the *current* state of the queue.
            let lastCallbackIndex = -1;
            for (let i = 0; i < this.current.length; i += 2) {
                const invokeAt = this.current[i];
                if (invokeAt <= now) {
                    // Add +1 to account for a callback function that
                    // goes after the timestamp in events array.
                    lastCallbackIndex = i + 1;
                }
                else {
                    // We've reached a timer that should not be invoked yet.
                    break;
                }
            }
            if (lastCallbackIndex >= 0) {
                arraySplice(this.current, 0, lastCallbackIndex + 1);
            }
            this.executingCallbacks = false;
            // If there are any callbacks added during an invocation
            // of the current ones - move them over to the "current"
            // queue.
            if (this.deferred.length > 0) {
                for (let i = 0; i < this.deferred.length; i += 2) {
                    const invokeAt = this.deferred[i];
                    const callback = this.deferred[i + 1];
                    this.addToQueue(this.current, invokeAt, callback);
                }
                this.deferred.length = 0;
            }
            this.scheduleTimer(ngZone);
        };
        // Avoid running timer callbacks more than once per
        // average frame duration. This is needed for better
        // batching and to avoid kicking off excessive change
        // detection cycles.
        const FRAME_DURATION_MS = 16; // 1000ms / 60fps
        if (this.current.length > 0) {
            const now = Date.now();
            // First element in the queue points at the timestamp
            // of the first (earliest) event.
            const invokeAt = this.current[0];
            if (this.timeoutId === null ||
                // Reschedule a timer in case a queue contains an item with
                // an earlier timestamp and the delta is more than an average
                // frame duration.
                (this.invokeTimerAt && this.invokeTimerAt - invokeAt > FRAME_DURATION_MS)) {
                // There was a timeout already, but an earlier event was added
                // into the queue. In this case we drop an old timer and setup
                // a new one with an updated (smaller) timeout.
                this.clearTimeout();
                const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS);
                this.invokeTimerAt = invokeAt;
                this.timeoutId = ngZone.runOutsideAngular(() => {
                    return setTimeout(() => ngZone.run(callback), timeout);
                });
            }
        }
    }
    clearTimeout() {
        if (this.timeoutId !== null) {
            clearTimeout(this.timeoutId);
            this.timeoutId = null;
        }
    }
    ngOnDestroy() {
        this.clearTimeout();
        this.current.length = 0;
        this.deferred.length = 0;
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: TimerScheduler,
        providedIn: 'root',
        factory: () => new TimerScheduler(),
    });
}

/**
 * A service used by the framework to create and cache injector instances.
 *
 * This service is used to create a single injector instance for each defer
 * block definition, to avoid creating an injector for each defer block instance
 * of a certain type.
 */
class CachedInjectorService {
    cachedInjectors = new Map();
    getOrCreateInjector(key, parentInjector, providers, debugName) {
        if (!this.cachedInjectors.has(key)) {
            const injector = providers.length > 0
                ? createEnvironmentInjector(providers, parentInjector, debugName)
                : null;
            this.cachedInjectors.set(key, injector);
        }
        return this.cachedInjectors.get(key);
    }
    ngOnDestroy() {
        try {
            for (const injector of this.cachedInjectors.values()) {
                if (injector !== null) {
                    injector.destroy();
                }
            }
        }
        finally {
            this.cachedInjectors.clear();
        }
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: CachedInjectorService,
        providedIn: 'environment',
        factory: () => new CachedInjectorService(),
    });
}

/**
 * **INTERNAL**, avoid referencing it in application code.
 * *
 * Injector token that allows to provide `DeferBlockDependencyInterceptor` class
 * implementation.
 *
 * This token is only injected in devMode
 */
const DEFER_BLOCK_DEPENDENCY_INTERCEPTOR = 
/* @__PURE__ */ new InjectionToken('DEFER_BLOCK_DEPENDENCY_INTERCEPTOR');
/**
 * **INTERNAL**, token used for configuring defer block behavior.
 */
const DEFER_BLOCK_CONFIG = new InjectionToken(ngDevMode ? 'DEFER_BLOCK_CONFIG' : '');
/**
 * Checks whether there is a cached injector associated with a given defer block
 * declaration and returns if it exists. If there is no cached injector present -
 * creates a new injector and stores in the cache.
 */
function getOrCreateEnvironmentInjector(parentInjector, tDetails, providers) {
    return parentInjector
        .get(CachedInjectorService)
        .getOrCreateInjector(tDetails, parentInjector, providers, ngDevMode ? 'DeferBlock Injector' : '');
}
/** Injector Helpers */
/**
 * Creates a new injector, which contains providers collected from dependencies (NgModules) of
 * defer-loaded components. This function detects different types of parent injectors and creates
 * a new injector based on that.
 */
function createDeferBlockInjector(parentInjector, tDetails, providers) {
    // Check if the parent injector is an instance of a `ChainedInjector`.
    //
    // In this case, we retain the shape of the injector and use a newly created
    // `EnvironmentInjector` as a parent in the `ChainedInjector`. That is needed to
    // make sure that the primary injector gets consulted first (since it's typically
    // a NodeInjector) and `EnvironmentInjector` tree is consulted after that.
    if (parentInjector instanceof ChainedInjector) {
        const origInjector = parentInjector.injector;
        // Guaranteed to be an environment injector
        const parentEnvInjector = parentInjector.parentInjector;
        const envInjector = getOrCreateEnvironmentInjector(parentEnvInjector, tDetails, providers);
        return new ChainedInjector(origInjector, envInjector);
    }
    const parentEnvInjector = parentInjector.get(EnvironmentInjector);
    // If the `parentInjector` is *not* an `EnvironmentInjector` - we need to create
    // a new `ChainedInjector` with the following setup:
    //
    //  - the provided `parentInjector` becomes a primary injector
    //  - an existing (real) `EnvironmentInjector` becomes a parent injector for
    //    a newly-created one, which contains extra providers
    //
    // So the final order in which injectors would be consulted in this case would look like this:
    //
    //  1. Provided `parentInjector`
    //  2. Newly-created `EnvironmentInjector` with extra providers
    //  3. `EnvironmentInjector` from the `parentInjector`
    if (parentEnvInjector !== parentInjector) {
        const envInjector = getOrCreateEnvironmentInjector(parentEnvInjector, tDetails, providers);
        return new ChainedInjector(parentInjector, envInjector);
    }
    // The `parentInjector` is an instance of an `EnvironmentInjector`.
    // No need for special handling, we can use `parentInjector` as a
    // parent injector directly.
    return getOrCreateEnvironmentInjector(parentInjector, tDetails, providers);
}
/** Rendering Helpers */
/**
 * Transitions a defer block to the new state. Updates the  necessary
 * data structures and renders corresponding block.
 *
 * @param newState New state that should be applied to the defer block.
 * @param tNode TNode that represents a defer block.
 * @param lContainer Represents an instance of a defer block.
 * @param skipTimerScheduling Indicates that `@loading` and `@placeholder` block
 *   should be rendered immediately, even if they have `after` or `minimum` config
 *   options setup. This flag to needed for testing APIs to transition defer block
 *   between states via `DeferFixture.render` method.
 */
function renderDeferBlockState(newState, tNode, lContainer, skipTimerScheduling = false) {
    const hostLView = lContainer[PARENT];
    const hostTView = hostLView[TVIEW];
    // Check if this view is not destroyed. Since the loading process was async,
    // the view might end up being destroyed by the time rendering happens.
    if (isDestroyed(hostLView))
        return;
    // Make sure this TNode belongs to TView that represents host LView.
    ngDevMode && assertTNodeForLView(tNode, hostLView);
    const lDetails = getLDeferBlockDetails(hostLView, tNode);
    ngDevMode && assertDefined(lDetails, 'Expected a defer block state defined');
    const currentState = lDetails[DEFER_BLOCK_STATE];
    const ssrState = lDetails[SSR_BLOCK_STATE];
    if (ssrState !== null && newState < ssrState) {
        return; // trying to render a previous state, exit
    }
    if (isValidStateChange(currentState, newState) &&
        isValidStateChange(lDetails[NEXT_DEFER_BLOCK_STATE] ?? -1, newState)) {
        const tDetails = getTDeferBlockDetails(hostTView, tNode);
        // Skips scheduling on the server since it can delay the server response.
        const needsScheduling = !skipTimerScheduling &&
            (typeof ngServerMode === 'undefined' || !ngServerMode) &&
            (getLoadingBlockAfter(tDetails) !== null ||
                getMinimumDurationForState(tDetails, DeferBlockState.Loading) !== null ||
                getMinimumDurationForState(tDetails, DeferBlockState.Placeholder));
        if (ngDevMode && needsScheduling) {
            assertDefined(applyDeferBlockStateWithSchedulingImpl, 'Expected scheduling function to be defined');
        }
        const applyStateFn = needsScheduling
            ? applyDeferBlockStateWithSchedulingImpl
            : applyDeferBlockState;
        try {
            applyStateFn(newState, lDetails, lContainer, tNode, hostLView);
        }
        catch (error) {
            handleError$1(hostLView, error);
        }
    }
}
function findMatchingDehydratedViewForDeferBlock(lContainer, lDetails) {
    const dehydratedViewIx = lContainer[DEHYDRATED_VIEWS]?.findIndex((view) => view.data[DEFER_BLOCK_STATE$1] === lDetails[DEFER_BLOCK_STATE]) ?? -1;
    const dehydratedView = dehydratedViewIx > -1 ? lContainer[DEHYDRATED_VIEWS][dehydratedViewIx] : null;
    return { dehydratedView, dehydratedViewIx };
}
/**
 * Applies changes to the DOM to reflect a given state.
 */
function applyDeferBlockState(newState, lDetails, lContainer, tNode, hostLView) {
    profiler(20 /* ProfilerEvent.DeferBlockStateStart */);
    const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode);
    if (stateTmplIndex !== null) {
        lDetails[DEFER_BLOCK_STATE] = newState;
        const hostTView = hostLView[TVIEW];
        const adjustedIndex = stateTmplIndex + HEADER_OFFSET;
        // The TNode that represents a template that will activated in the defer block
        const activeBlockTNode = getTNode(hostTView, adjustedIndex);
        // There is only 1 view that can be present in an LContainer that
        // represents a defer block, so always refer to the first one.
        const viewIndex = 0;
        removeLViewFromLContainer(lContainer, viewIndex);
        let injector;
        if (newState === DeferBlockState.Complete) {
            // When we render a defer block in completed state, there might be
            // newly loaded standalone components used within the block, which may
            // import NgModules with providers. In order to make those providers
            // available for components declared in that NgModule, we create an instance
            // of an environment injector to host those providers and pass this injector
            // to the logic that creates a view.
            const tDetails = getTDeferBlockDetails(hostTView, tNode);
            const providers = tDetails.providers;
            if (providers && providers.length > 0) {
                injector = createDeferBlockInjector(hostLView[INJECTOR], tDetails, providers);
            }
        }
        const { dehydratedView, dehydratedViewIx } = findMatchingDehydratedViewForDeferBlock(lContainer, lDetails);
        const embeddedLView = createAndRenderEmbeddedLView(hostLView, activeBlockTNode, null, {
            injector,
            dehydratedView,
        });
        addLViewToLContainer(lContainer, embeddedLView, viewIndex, shouldAddViewToDom(activeBlockTNode, dehydratedView));
        markViewDirty(embeddedLView, 2 /* NotificationSource.DeferBlockStateUpdate */);
        if (dehydratedViewIx > -1) {
            // Erase dehydrated view info in a given LContainer, so that the view is not
            // removed later by post-hydration cleanup process (which iterates over all
            // dehydrated views in component tree). This clears only the dehydrated view
            // that was found for this render, which in most cases will be the only view.
            // In the case that there was control flow that changed, there may be either
            // more than one or the views would not match up due to the server rendered
            // content being a different branch of the control flow.
            lContainer[DEHYDRATED_VIEWS]?.splice(dehydratedViewIx, 1);
        }
        if ((newState === DeferBlockState.Complete || newState === DeferBlockState.Error) &&
            Array.isArray(lDetails[ON_COMPLETE_FNS])) {
            for (const callback of lDetails[ON_COMPLETE_FNS]) {
                callback();
            }
            lDetails[ON_COMPLETE_FNS] = null;
        }
    }
    profiler(21 /* ProfilerEvent.DeferBlockStateEnd */);
}
/**
 * Extends the `applyDeferBlockState` with timer-based scheduling.
 * This function becomes available on a page if there are defer blocks
 * that use `after` or `minimum` parameters in the `@loading` or
 * `@placeholder` blocks.
 */
function applyDeferBlockStateWithScheduling(newState, lDetails, lContainer, tNode, hostLView) {
    const now = Date.now();
    const hostTView = hostLView[TVIEW];
    const tDetails = getTDeferBlockDetails(hostTView, tNode);
    if (lDetails[STATE_IS_FROZEN_UNTIL] === null || lDetails[STATE_IS_FROZEN_UNTIL] <= now) {
        lDetails[STATE_IS_FROZEN_UNTIL] = null;
        const loadingAfter = getLoadingBlockAfter(tDetails);
        const inLoadingAfterPhase = lDetails[LOADING_AFTER_CLEANUP_FN] !== null;
        if (newState === DeferBlockState.Loading && loadingAfter !== null && !inLoadingAfterPhase) {
            // Trying to render loading, but it has an `after` config,
            // so schedule an update action after a timeout.
            lDetails[NEXT_DEFER_BLOCK_STATE] = newState;
            const cleanupFn = scheduleDeferBlockUpdate(loadingAfter, lDetails, tNode, lContainer, hostLView);
            lDetails[LOADING_AFTER_CLEANUP_FN] = cleanupFn;
        }
        else {
            // If we transition to a complete or an error state and there is a pending
            // operation to render loading after a timeout - invoke a cleanup operation,
            // which stops the timer.
            if (newState > DeferBlockState.Loading && inLoadingAfterPhase) {
                lDetails[LOADING_AFTER_CLEANUP_FN]();
                lDetails[LOADING_AFTER_CLEANUP_FN] = null;
                lDetails[NEXT_DEFER_BLOCK_STATE] = null;
            }
            applyDeferBlockState(newState, lDetails, lContainer, tNode, hostLView);
            const duration = getMinimumDurationForState(tDetails, newState);
            if (duration !== null) {
                lDetails[STATE_IS_FROZEN_UNTIL] = now + duration;
                scheduleDeferBlockUpdate(duration, lDetails, tNode, lContainer, hostLView);
            }
        }
    }
    else {
        // We are still rendering the previous state.
        // Update the `NEXT_DEFER_BLOCK_STATE`, which would be
        // picked up once it's time to transition to the next state.
        lDetails[NEXT_DEFER_BLOCK_STATE] = newState;
    }
}
/**
 * Schedules an update operation after a specified timeout.
 */
function scheduleDeferBlockUpdate(timeout, lDetails, tNode, lContainer, hostLView) {
    const callback = () => {
        const nextState = lDetails[NEXT_DEFER_BLOCK_STATE];
        lDetails[STATE_IS_FROZEN_UNTIL] = null;
        lDetails[NEXT_DEFER_BLOCK_STATE] = null;
        if (nextState !== null) {
            renderDeferBlockState(nextState, tNode, lContainer);
        }
    };
    return scheduleTimerTrigger(timeout, callback, hostLView[INJECTOR]);
}
/**
 * Checks whether we can transition to the next state.
 *
 * We transition to the next state if the previous state was represented
 * with a number that is less than the next state. For example, if the current
 * state is "loading" (represented as `1`), we should not show a placeholder
 * (represented as `0`), but we can show a completed state (represented as `2`)
 * or an error state (represented as `3`).
 */
function isValidStateChange(currentState, newState) {
    return currentState < newState;
}
/** Utility function to render placeholder content (if present) */
function renderPlaceholder(lView, tNode) {
    const lContainer = lView[tNode.index];
    ngDevMode && assertLContainer(lContainer);
    renderDeferBlockState(DeferBlockState.Placeholder, tNode, lContainer);
}
/**
 * Subscribes to the "loading" Promise and renders corresponding defer sub-block,
 * based on the loading results.
 *
 * @param lContainer Represents an instance of a defer block.
 * @param tNode Represents defer block info shared across all instances.
 */
function renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer) {
    ngDevMode &&
        assertDefined(tDetails.loadingPromise, 'Expected loading Promise to exist on this defer block');
    tDetails.loadingPromise.then(() => {
        if (tDetails.loadingState === DeferDependenciesLoadingState.COMPLETE) {
            ngDevMode && assertDeferredDependenciesLoaded(tDetails);
            // Everything is loaded, show the primary block content
            renderDeferBlockState(DeferBlockState.Complete, tNode, lContainer);
        }
        else if (tDetails.loadingState === DeferDependenciesLoadingState.FAILED) {
            renderDeferBlockState(DeferBlockState.Error, tNode, lContainer);
        }
    });
}
/**
 * Reference to the timer-based scheduler implementation of defer block state
 * rendering method. It's used to make timer-based scheduling tree-shakable.
 * If `minimum` or `after` parameters are used, compiler generates an extra
 * argument for the `ɵɵdefer` instruction, which references a timer-based
 * implementation.
 */
let applyDeferBlockStateWithSchedulingImpl = null;
/**
 * Enables timer-related scheduling if `after` or `minimum` parameters are setup
 * on the `@loading` or `@placeholder` blocks.
 */
function ɵɵdeferEnableTimerScheduling(tView, tDetails, placeholderConfigIndex, loadingConfigIndex) {
    const tViewConsts = tView.consts;
    if (placeholderConfigIndex != null) {
        tDetails.placeholderBlockConfig = getConstant(tViewConsts, placeholderConfigIndex);
    }
    if (loadingConfigIndex != null) {
        tDetails.loadingBlockConfig = getConstant(tViewConsts, loadingConfigIndex);
    }
    // Enable implementation that supports timer-based scheduling.
    if (applyDeferBlockStateWithSchedulingImpl === null) {
        applyDeferBlockStateWithSchedulingImpl = applyDeferBlockStateWithScheduling;
    }
}

/**
 * The name of a field that Angular monkey-patches onto a component
 * class to store a function that loads defer-loadable dependencies
 * and applies metadata to a class.
 */
const ASYNC_COMPONENT_METADATA_FN = '__ngAsyncComponentMetadataFn__';
/**
 * If a given component has unresolved async metadata - returns a reference
 * to a function that applies component metadata after resolving defer-loadable
 * dependencies. Otherwise - this function returns `null`.
 */
function getAsyncClassMetadataFn(type) {
    const componentClass = type; // cast to `any`, so that we can read a monkey-patched field
    return componentClass[ASYNC_COMPONENT_METADATA_FN] ?? null;
}
/**
 * Handles the process of applying metadata info to a component class in case
 * component template has defer blocks (thus some dependencies became deferrable).
 *
 * @param type Component class where metadata should be added
 * @param dependencyLoaderFn Function that loads dependencies
 * @param metadataSetterFn Function that forms a scope in which the `setClassMetadata` is invoked
 */
function setClassMetadataAsync(type, dependencyLoaderFn, metadataSetterFn) {
    const componentClass = type; // cast to `any`, so that we can monkey-patch it
    componentClass[ASYNC_COMPONENT_METADATA_FN] = () => Promise.all(dependencyLoaderFn()).then((dependencies) => {
        metadataSetterFn(...dependencies);
        // Metadata is now set, reset field value to indicate that this component
        // can by used/compiled synchronously.
        componentClass[ASYNC_COMPONENT_METADATA_FN] = null;
        return dependencies;
    });
    return componentClass[ASYNC_COMPONENT_METADATA_FN];
}
/**
 * Adds decorator, constructor, and property metadata to a given type via static metadata fields
 * on the type.
 *
 * These metadata fields can later be read with Angular's `ReflectionCapabilities` API.
 *
 * Calls to `setClassMetadata` can be guarded by ngDevMode, resulting in the metadata assignments
 * being tree-shaken away during production builds.
 */
function setClassMetadata(type, decorators, ctorParameters, propDecorators) {
    return noSideEffects(() => {
        const clazz = type;
        if (decorators !== null) {
            if (clazz.hasOwnProperty('decorators') && clazz.decorators !== undefined) {
                clazz.decorators.push(...decorators);
            }
            else {
                clazz.decorators = decorators;
            }
        }
        if (ctorParameters !== null) {
            // Rather than merging, clobber the existing parameters. If other projects exist which
            // use tsickle-style annotations and reflect over them in the same way, this could
            // cause issues, but that is vanishingly unlikely.
            clazz.ctorParameters = ctorParameters;
        }
        if (propDecorators !== null) {
            // The property decorator objects are merged as it is possible different fields have
            // different decorator types. Decorators on individual fields are not merged, as it's
            // also incredibly unlikely that a field will be decorated both with an Angular
            // decorator and a non-Angular decorator that's also been downleveled.
            if (clazz.hasOwnProperty('propDecorators') && clazz.propDecorators !== undefined) {
                clazz.propDecorators = { ...clazz.propDecorators, ...propDecorators };
            }
            else {
                clazz.propDecorators = propDecorators;
            }
        }
    });
}

class Console {
    log(message) {
        // tslint:disable-next-line:no-console
        console.log(message);
    }
    // Note: for reporting errors use `DOM.logError()` as it is platform specific
    warn(message) {
        console.warn(message);
    }
    static ɵfac = function Console_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || Console)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: Console, factory: Console.ɵfac, providedIn: 'platform' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Console, [{
        type: Injectable,
        args: [{ providedIn: 'platform' }]
    }], null, null); })();

/**
 * These are the data structures that our framework injector profiler will fill with data in order
 * to support DI debugging APIs.
 *
 * resolverToTokenToDependencies: Maps an injector to a Map of tokens to an Array of
 * dependencies. Injector -> Token -> Dependencies This is used to support the
 * getDependenciesFromInjectable API, which takes in an injector and a token and returns it's
 * dependencies.
 *
 * resolverToProviders: Maps a DI resolver (an Injector or a TNode) to the providers configured
 * within it This is used to support the getInjectorProviders API, which takes in an injector and
 * returns the providers that it was configured with. Note that for the element injector case we
 * use the TNode instead of the LView as the DI resolver. This is because the registration of
 * providers happens only once per type of TNode. If an injector is created with an identical TNode,
 * the providers for that injector will not be reconfigured.
 *
 * standaloneInjectorToComponent: Maps the injector of a standalone component to the standalone
 * component that it is associated with. Used in the getInjectorProviders API, specificially in the
 * discovery of import paths for each provider. This is necessary because the imports array of a
 * standalone component is processed and configured in its standalone injector, but exists within
 * the component's definition. Because getInjectorProviders takes in an injector, if that injector
 * is the injector of a standalone component, we need to be able to discover the place where the
 * imports array is located (the component) in order to flatten the imports array within it to
 * discover all of it's providers.
 *
 *
 * All of these data structures are instantiated with WeakMaps. This will ensure that the presence
 * of any object in the keys of these maps does not prevent the garbage collector from collecting
 * those objects. Because of this property of WeakMaps, these data structures will never be the
 * source of a memory leak.
 *
 * An example of this advantage: When components are destroyed, we don't need to do
 * any additional work to remove that component from our mappings.
 *
 */
class DIDebugData {
    resolverToTokenToDependencies = new WeakMap();
    resolverToProviders = new WeakMap();
    resolverToEffects = new WeakMap();
    standaloneInjectorToComponent = new WeakMap();
    reset() {
        this.resolverToTokenToDependencies = new WeakMap();
        this.resolverToProviders = new WeakMap();
        this.standaloneInjectorToComponent = new WeakMap();
    }
}
let frameworkDIDebugData = new DIDebugData();
function getFrameworkDIDebugData() {
    return frameworkDIDebugData;
}
/**
 * Initalize default handling of injector events. This handling parses events
 * as they are emitted and constructs the data structures necessary to support
 * some of debug APIs.
 *
 * See handleInjectEvent, handleCreateEvent and handleProviderConfiguredEvent
 * for descriptions of each handler
 *
 * Supported APIs:
 *               - getDependenciesFromInjectable
 *               - getInjectorProviders
 */
function setupFrameworkInjectorProfiler() {
    frameworkDIDebugData.reset();
    setInjectorProfiler((injectorProfilerEvent) => handleInjectorProfilerEvent(injectorProfilerEvent));
}
function handleInjectorProfilerEvent(injectorProfilerEvent) {
    const { context, type } = injectorProfilerEvent;
    if (type === 0 /* InjectorProfilerEventType.Inject */) {
        handleInjectEvent(context, injectorProfilerEvent.service);
    }
    else if (type === 1 /* InjectorProfilerEventType.InstanceCreatedByInjector */) {
        handleInstanceCreatedByInjectorEvent(context, injectorProfilerEvent.instance);
    }
    else if (type === 2 /* InjectorProfilerEventType.ProviderConfigured */) {
        handleProviderConfiguredEvent(context, injectorProfilerEvent.providerRecord);
    }
    else if (type === 3 /* InjectorProfilerEventType.EffectCreated */) {
        handleEffectCreatedEvent(context, injectorProfilerEvent.effect);
    }
}
function handleEffectCreatedEvent(context, effect) {
    const diResolver = getDIResolver(context.injector);
    if (diResolver === null) {
        throwError('An EffectCreated event must be run within an injection context.');
    }
    const { resolverToEffects } = frameworkDIDebugData;
    if (!resolverToEffects.has(diResolver)) {
        resolverToEffects.set(diResolver, []);
    }
    resolverToEffects.get(diResolver).push(effect);
}
/**
 *
 * Stores the injected service in frameworkDIDebugData.resolverToTokenToDependencies
 * based on it's injector and token.
 *
 * @param context InjectorProfilerContext the injection context that this event occurred in.
 * @param data InjectedService the service associated with this inject event.
 *
 */
function handleInjectEvent(context, data) {
    const diResolver = getDIResolver(context.injector);
    if (diResolver === null) {
        throwError('An Inject event must be run within an injection context.');
    }
    const diResolverToInstantiatedToken = frameworkDIDebugData.resolverToTokenToDependencies;
    if (!diResolverToInstantiatedToken.has(diResolver)) {
        diResolverToInstantiatedToken.set(diResolver, new WeakMap());
    }
    // if token is a primitive type, ignore this event. We do this because we cannot keep track of
    // non-primitive tokens in WeakMaps since they are not garbage collectable.
    if (!canBeHeldWeakly(context.token)) {
        return;
    }
    const instantiatedTokenToDependencies = diResolverToInstantiatedToken.get(diResolver);
    if (!instantiatedTokenToDependencies.has(context.token)) {
        instantiatedTokenToDependencies.set(context.token, []);
    }
    const { token, value, flags } = data;
    assertDefined(context.token, 'Injector profiler context token is undefined.');
    const dependencies = instantiatedTokenToDependencies.get(context.token);
    assertDefined(dependencies, 'Could not resolve dependencies for token.');
    if (context.injector instanceof NodeInjector) {
        dependencies.push({ token, value, flags, injectedIn: getNodeInjectorContext(context.injector) });
    }
    else {
        dependencies.push({ token, value, flags });
    }
}
/**
 *
 * Returns the LView and TNode associated with a NodeInjector. Returns undefined if the injector
 * is not a NodeInjector.
 *
 * @param injector
 * @returns {lView: LView, tNode: TNode}|undefined
 */
function getNodeInjectorContext(injector) {
    if (!(injector instanceof NodeInjector)) {
        throwError('getNodeInjectorContext must be called with a NodeInjector');
    }
    const lView = getNodeInjectorLView(injector);
    const tNode = getNodeInjectorTNode(injector);
    if (tNode === null) {
        return;
    }
    assertTNodeForLView(tNode, lView);
    return { lView, tNode };
}
/**
 *
 * If the created instance is an instance of a standalone component, maps the injector to that
 * standalone component in frameworkDIDebugData.standaloneInjectorToComponent
 *
 * @param context InjectorProfilerContext the injection context that this event occurred in.
 * @param data InjectorCreatedInstance an object containing the instance that was just created
 *
 */
function handleInstanceCreatedByInjectorEvent(context, data) {
    const { value } = data;
    if (getDIResolver(context.injector) === null) {
        throwError('An InjectorCreatedInstance event must be run within an injection context.');
    }
    // if our value is an instance of a standalone component, map the injector of that standalone
    // component to the component class. Otherwise, this event is a noop.
    let standaloneComponent = undefined;
    if (typeof value === 'object') {
        standaloneComponent = value?.constructor;
    }
    // We want to also cover if `standaloneComponent === null` in addition to `undefined`
    if (standaloneComponent == undefined || !isStandaloneComponent(standaloneComponent)) {
        return;
    }
    const environmentInjector = context.injector.get(EnvironmentInjector, null, { optional: true });
    // Standalone components should have an environment injector. If one cannot be
    // found we may be in a test case for low level functionality that did not explicitly
    // setup this injector. In those cases, we simply ignore this event.
    if (environmentInjector === null) {
        return;
    }
    const { standaloneInjectorToComponent } = frameworkDIDebugData;
    // If our injector has already been mapped, as is the case
    // when a standalone component imports another standalone component,
    // we consider the original component (the component doing the importing)
    // as the component connected to our injector.
    if (standaloneInjectorToComponent.has(environmentInjector)) {
        return;
    }
    // If our injector hasn't been mapped, then we map it to the standalone component
    standaloneInjectorToComponent.set(environmentInjector, standaloneComponent);
}
function isStandaloneComponent(value) {
    const def = getComponentDef(value);
    return !!def?.standalone;
}
/**
 *
 * Stores the emitted ProviderRecords from the InjectorProfilerEventType.ProviderConfigured
 * event in frameworkDIDebugData.resolverToProviders
 *
 * @param context InjectorProfilerContext the injection context that this event occurred in.
 * @param data ProviderRecord an object containing the instance that was just created
 *
 */
function handleProviderConfiguredEvent(context, data) {
    const { resolverToProviders } = frameworkDIDebugData;
    let diResolver;
    if (context?.injector instanceof NodeInjector) {
        diResolver = getNodeInjectorTNode(context.injector);
    }
    else {
        diResolver = context.injector;
    }
    if (diResolver === null) {
        throwError('A ProviderConfigured event must be run within an injection context.');
    }
    if (!resolverToProviders.has(diResolver)) {
        resolverToProviders.set(diResolver, []);
    }
    resolverToProviders.get(diResolver).push(data);
}
function getDIResolver(injector) {
    let diResolver = null;
    if (injector === undefined) {
        return diResolver;
    }
    // We use the LView as the diResolver for NodeInjectors because they
    // do not persist anywhere in the framework. They are simply wrappers around an LView and a TNode
    // that do persist. Because of this, we rely on the LView of the NodeInjector in order to use
    // as a concrete key to represent this injector. If we get the same LView back later, we know
    // we're looking at the same injector.
    if (injector instanceof NodeInjector) {
        diResolver = getNodeInjectorLView(injector);
    }
    // Other injectors can be used a keys for a map because their instances
    // persist
    else {
        diResolver = injector;
    }
    return diResolver;
}
// inspired by
// https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-canbeheldweakly
function canBeHeldWeakly(value) {
    // we check for value !== null here because typeof null === 'object
    return (value !== null &&
        (typeof value === 'object' || typeof value === 'function' || typeof value === 'symbol'));
}

/**
 * Marks a component for check (in case of OnPush components) and synchronously
 * performs change detection on the application this component belongs to.
 *
 * @param component Component to {@link /api/core/ChangeDetectorRef#markForCheck mark for check}
 *
 * @publicApi
 */
function applyChanges(component) {
    ngDevMode && assertDefined(component, 'component');
    markViewDirty(getComponentViewByInstance(component), 3 /* NotificationSource.DebugApplyChanges */);
    getRootComponents(component).forEach((rootComponent) => detectChanges(rootComponent));
}
/**
 * Synchronously perform change detection on a component (and possibly its sub-components).
 *
 * This function triggers change detection in a synchronous way on a component.
 *
 * @param component The component which the change detection should be performed on.
 */
function detectChanges(component) {
    const view = getComponentViewByInstance(component);
    view[FLAGS] |= 1024 /* LViewFlags.RefreshView */;
    detectChangesInternal(view);
}

/**
 * Retrieves all defer blocks in a given LView.
 *
 * @param lView lView with defer blocks
 * @param deferBlocks defer block aggregator array
 */
function getDeferBlocks$1(lView, deferBlocks) {
    const tView = lView[TVIEW];
    for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
        if (isLContainer(lView[i])) {
            const lContainer = lView[i];
            // An LContainer may represent an instance of a defer block, in which case
            // we store it as a result. Otherwise, keep iterating over LContainer views and
            // look for defer blocks.
            const isLast = i === tView.bindingStartIndex - 1;
            if (!isLast) {
                const tNode = tView.data[i];
                const tDetails = getTDeferBlockDetails(tView, tNode);
                if (isTDeferBlockDetails(tDetails)) {
                    deferBlocks.push({ lContainer, lView, tNode, tDetails });
                    // This LContainer represents a defer block, so we exit
                    // this iteration and don't inspect views in this LContainer.
                    continue;
                }
            }
            for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
                getDeferBlocks$1(lContainer[i], deferBlocks);
            }
        }
        else if (isLView(lView[i])) {
            // This is a component, enter the `getDeferBlocks` recursively.
            getDeferBlocks$1(lView[i], deferBlocks);
        }
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Gets all of the `@defer` blocks that are present inside the specified DOM node.
 * @param node Node in which to look for `@defer` blocks.
 *
 * @publicApi
 */
function getDeferBlocks(node) {
    const results = [];
    const lView = getLContext(node)?.lView;
    if (lView) {
        findDeferBlocks(node, lView, results);
    }
    return results;
}
/**
 * Finds all the `@defer` blocks inside a specific node and view.
 * @param node Node in which to search for blocks.
 * @param lView View within the node in which to search for blocks.
 * @param results Array to which to add blocks once they're found.
 */
function findDeferBlocks(node, lView, results) {
    const registry = lView[INJECTOR].get(DEHYDRATED_BLOCK_REGISTRY, null, { optional: true });
    const blocks = [];
    getDeferBlocks$1(lView, blocks);
    for (const details of blocks) {
        const native = getNativeByTNode(details.tNode, details.lView);
        const lDetails = getLDeferBlockDetails(details.lView, details.tNode);
        // The LView from `getLContext` might be the view the element is placed in.
        // Filter out defer blocks that aren't inside the specified root node.
        if (!node.contains(native)) {
            continue;
        }
        const tDetails = details.tDetails;
        const renderedLView = getRendererLView(details);
        const rootNodes = [];
        if (renderedLView !== null) {
            collectNativeNodes(renderedLView[TVIEW], renderedLView, renderedLView[TVIEW].firstChild, rootNodes);
        }
        const data = {
            state: stringifyState(lDetails[DEFER_BLOCK_STATE]),
            incrementalHydrationState: inferHydrationState(tDetails, lDetails, registry),
            hasErrorBlock: tDetails.errorTmplIndex !== null,
            loadingBlock: {
                exists: tDetails.loadingTmplIndex !== null,
                minimumTime: tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null,
                afterTime: tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null,
            },
            placeholderBlock: {
                exists: tDetails.placeholderTmplIndex !== null,
                minimumTime: tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null,
            },
            triggers: tDetails.debug?.triggers ? Array.from(tDetails.debug.triggers).sort() : [],
            rootNodes,
        };
        results.push(data);
        // `getDeferBlocks` does not resolve nested defer blocks so we have to recurse manually.
        if (renderedLView !== null) {
            findDeferBlocks(node, renderedLView, results);
        }
    }
}
/**
 * Turns the `DeferBlockState` into a string which is more readable than the enum form.
 *
 * @param lDetails Information about the
 * @returns
 */
function stringifyState(state) {
    switch (state) {
        case DeferBlockState.Complete:
            return 'complete';
        case DeferBlockState.Loading:
            return 'loading';
        case DeferBlockState.Placeholder:
            return 'placeholder';
        case DeferBlockState.Error:
            return 'error';
        case DeferBlockInternalState.Initial:
            return 'initial';
        default:
            throw new Error(`Unrecognized state ${state}`);
    }
}
/**
 * Infers the hydration state of a specific defer block.
 * @param tDetails Static defer block information.
 * @param lDetails Instance defer block information.
 * @param registry Registry coordinating the hydration of defer blocks.
 */
function inferHydrationState(tDetails, lDetails, registry) {
    if (registry === null ||
        lDetails[SSR_UNIQUE_ID] === null ||
        tDetails.hydrateTriggers === null ||
        tDetails.hydrateTriggers.has(7 /* DeferBlockTrigger.Never */)) {
        return 'not-configured';
    }
    return registry.has(lDetails[SSR_UNIQUE_ID]) ? 'dehydrated' : 'hydrated';
}
/**
 * Gets the current LView that is rendered out in a defer block.
 * @param details Instance information about the block.
 */
function getRendererLView(details) {
    // Defer block containers can only ever contain one view.
    // If they're empty, it means that nothing is rendered.
    if (details.lContainer.length <= CONTAINER_HEADER_OFFSET) {
        return null;
    }
    const lView = details.lContainer[CONTAINER_HEADER_OFFSET];
    ngDevMode && assertLView(lView);
    return lView;
}

/**
 * Discovers the dependencies of an injectable instance. Provides DI information about each
 * dependency that the injectable was instantiated with, including where they were provided from.
 *
 * @param injector An injector instance
 * @param token a DI token that was constructed by the given injector instance
 * @returns an object that contains the created instance of token as well as all of the dependencies
 * that it was instantiated with OR undefined if the token was not created within the given
 * injector.
 */
function getDependenciesFromInjectable(injector, token) {
    // First we check to see if the token given maps to an actual instance in the injector given.
    // We use `self: true` because we only want to look at the injector we were given.
    // We use `optional: true` because it's possible that the token we were given was never
    // constructed by the injector we were given.
    const instance = injector.get(token, null, { self: true, optional: true });
    if (instance === null) {
        throw new Error(`Unable to determine instance of ${token} in given injector`);
    }
    const unformattedDependencies = getDependenciesForTokenInInjector(token, injector);
    const resolutionPath = getInjectorResolutionPath(injector);
    const dependencies = unformattedDependencies.map((dep) => {
        // injectedIn contains private fields, so we omit it from the response
        const formattedDependency = {
            value: dep.value,
        };
        // convert injection flags to booleans
        const flags = dep.flags;
        formattedDependency.flags = {
            optional: (8 /* InternalInjectFlags.Optional */ & flags) === 8 /* InternalInjectFlags.Optional */,
            host: (1 /* InternalInjectFlags.Host */ & flags) === 1 /* InternalInjectFlags.Host */,
            self: (2 /* InternalInjectFlags.Self */ & flags) === 2 /* InternalInjectFlags.Self */,
            skipSelf: (4 /* InternalInjectFlags.SkipSelf */ & flags) === 4 /* InternalInjectFlags.SkipSelf */,
        };
        // find the injector that provided the dependency
        for (let i = 0; i < resolutionPath.length; i++) {
            const injectorToCheck = resolutionPath[i];
            // if skipSelf is true we skip the first injector
            if (i === 0 && formattedDependency.flags.skipSelf) {
                continue;
            }
            // host only applies to NodeInjectors
            if (formattedDependency.flags.host && injectorToCheck instanceof EnvironmentInjector) {
                break;
            }
            const instance = injectorToCheck.get(dep.token, null, {
                self: true,
                optional: true,
            });
            if (instance !== null) {
                // if host flag is true we double check that we can get the service from the first element
                // in the resolution path by using the host flag. This is done to make sure that we've found
                // the correct providing injector, and not a node injector that is connected to our path via
                // a router outlet.
                if (formattedDependency.flags.host) {
                    const firstInjector = resolutionPath[0];
                    const lookupFromFirstInjector = firstInjector.get(dep.token, null, {
                        ...formattedDependency.flags,
                        optional: true,
                    });
                    if (lookupFromFirstInjector !== null) {
                        formattedDependency.providedIn = injectorToCheck;
                    }
                    break;
                }
                formattedDependency.providedIn = injectorToCheck;
                break;
            }
            // if self is true we stop after the first injector
            if (i === 0 && formattedDependency.flags.self) {
                break;
            }
        }
        if (dep.token)
            formattedDependency.token = dep.token;
        return formattedDependency;
    });
    return { instance, dependencies };
}
function getDependenciesForTokenInInjector(token, injector) {
    const { resolverToTokenToDependencies } = getFrameworkDIDebugData();
    if (!(injector instanceof NodeInjector)) {
        return resolverToTokenToDependencies.get(injector)?.get?.(token) ?? [];
    }
    const lView = getNodeInjectorLView(injector);
    const tokenDependencyMap = resolverToTokenToDependencies.get(lView);
    const dependencies = tokenDependencyMap?.get(token) ?? [];
    // In the NodeInjector case, all injections for every node are stored in the same lView.
    // We use the injectedIn field of the dependency to filter out the dependencies that
    // do not come from the same node as the instance we're looking at.
    return dependencies.filter((dependency) => {
        const dependencyNode = dependency.injectedIn?.tNode;
        if (dependencyNode === undefined) {
            return false;
        }
        const instanceNode = getNodeInjectorTNode(injector);
        assertTNode(dependencyNode);
        assertTNode(instanceNode);
        return dependencyNode === instanceNode;
    });
}
/**
 * Gets the class associated with an injector that contains a provider `imports` array in it's
 * definition
 *
 * For Module Injectors this returns the NgModule constructor.
 *
 * For Standalone injectors this returns the standalone component constructor.
 *
 * @param injector Injector an injector instance
 * @returns the constructor where the `imports` array that configures this injector is located
 */
function getProviderImportsContainer(injector) {
    const { standaloneInjectorToComponent } = getFrameworkDIDebugData();
    // standalone components configure providers through a component def, so we have to
    // use the standalone component associated with this injector if Injector represents
    // a standalone components EnvironmentInjector
    if (standaloneInjectorToComponent.has(injector)) {
        return standaloneInjectorToComponent.get(injector);
    }
    // Module injectors configure providers through their NgModule def, so we use the
    // injector to lookup its NgModuleRef and through that grab its instance
    const defTypeRef = injector.get(NgModuleRef$1, null, { self: true, optional: true });
    // If we can't find an associated imports container, return null.
    // This could be the case if this function is called with an R3Injector that does not represent
    // a standalone component or NgModule.
    if (defTypeRef === null) {
        return null;
    }
    // In standalone applications, the root environment injector created by bootstrapApplication
    // may have no associated "instance".
    if (defTypeRef.instance === null) {
        return null;
    }
    return defTypeRef.instance.constructor;
}
/**
 * Gets the providers configured on a NodeInjector
 *
 * @param injector A NodeInjector instance
 * @returns ProviderRecord[] an array of objects representing the providers configured on this
 *     injector
 */
function getNodeInjectorProviders(injector) {
    const diResolver = getNodeInjectorTNode(injector);
    const { resolverToProviders } = getFrameworkDIDebugData();
    return resolverToProviders.get(diResolver) ?? [];
}
/**
 * Gets a mapping of providers configured on an injector to their import paths
 *
 * ModuleA -> imports ModuleB
 * ModuleB -> imports ModuleC
 * ModuleB -> provides MyServiceA
 * ModuleC -> provides MyServiceB
 *
 * getProviderImportPaths(ModuleA)
 * > Map(2) {
 *   MyServiceA => [ModuleA, ModuleB]
 *   MyServiceB => [ModuleA, ModuleB, ModuleC]
 *  }
 *
 * @param providerImportsContainer constructor of class that contains an `imports` array in it's
 *     definition
 * @returns A Map object that maps providers to an array of constructors representing it's import
 *     path
 *
 */
function getProviderImportPaths(providerImportsContainer) {
    const providerToPath = new Map();
    const visitedContainers = new Set();
    const visitor = walkProviderTreeToDiscoverImportPaths(providerToPath, visitedContainers);
    walkProviderTree(providerImportsContainer, visitor, [], new Set());
    return providerToPath;
}
/**
 *
 * Higher order function that returns a visitor for WalkProviderTree
 *
 * Takes in a Map and Set to keep track of the providers and containers
 * visited, so that we can discover the import paths of these providers
 * during the traversal.
 *
 * This visitor takes advantage of the fact that walkProviderTree performs a
 * postorder traversal of the provider tree for the passed in container. Because postorder
 * traversal recursively processes subtrees from leaf nodes until the traversal reaches the root,
 * we write a visitor that constructs provider import paths in reverse.
 *
 *
 * We use the visitedContainers set defined outside this visitor
 * because we want to run some logic onl   y once for
 * each container in the tree. That logic can be described as:
 *
 *
 * 1. for each discovered_provider and discovered_path in the incomplete provider paths we've
 * already discovered
 * 2. get the first container in discovered_path
 * 3. if that first container is in the imports array of the container we're visiting
 *    Then the container we're visiting is also in the import path of discovered_provider, so we
 *    unshift discovered_path with the container we're currently visiting
 *
 *
 * Example Run:
 * ```
 *                 ┌──────────┐
 *                 │containerA│
 *      ┌─imports-─┤          ├──imports─┐
 *      │          │  provA   │          │
 *      │          │  provB   │          │
 *      │          └──────────┘          │
 *      │                                │
 *     ┌▼─────────┐             ┌────────▼─┐
 *     │containerB│             │containerC│
 *     │          │             │          │
 *     │  provD   │             │  provF   │
 *     │  provE   │             │  provG   │
 *     └──────────┘             └──────────┘
 * ```
 *
 * Each step of the traversal,
 *
 * ```
 * visitor(provD, containerB)
 * providerToPath === Map { provD => [containerB] }
 * visitedContainers === Set { containerB }
 *
 * visitor(provE, containerB)
 * providerToPath === Map { provD => [containerB], provE => [containerB] }
 * visitedContainers === Set { containerB }
 *
 * visitor(provF, containerC)
 * providerToPath === Map { provD => [containerB], provE => [containerB], provF => [containerC] }
 * visitedContainers === Set { containerB, containerC }
 *
 * visitor(provG, containerC)
 * providerToPath === Map {
 *   provD => [containerB], provE => [containerB], provF => [containerC], provG => [containerC]
 * }
 * visitedContainers === Set { containerB, containerC }
 *
 * visitor(provA, containerA)
 * providerToPath === Map {
 *   provD => [containerA, containerB],
 *   provE => [containerA, containerB],
 *   provF => [containerA, containerC],
 *   provG => [containerA, containerC],
 *   provA => [containerA]
 * }
 * visitedContainers === Set { containerB, containerC, containerA }
 *
 * visitor(provB, containerA)
 * providerToPath === Map {
 *   provD => [containerA, containerB],
 *   provE => [containerA, containerB],
 *   provF => [containerA, containerC],
 *   provG => [containerA, containerC],
 *   provA => [containerA]
 *   provB => [containerA]
 * }
 * visitedContainers === Set { containerB, containerC, containerA }
 * ```
 *
 * @param providerToPath Map map of providers to paths that this function fills
 * @param visitedContainers Set a set to keep track of the containers we've already visited
 * @return function(provider SingleProvider, container: Type<unknown> | InjectorType<unknown>) =>
 *     void
 */
function walkProviderTreeToDiscoverImportPaths(providerToPath, visitedContainers) {
    return (provider, container) => {
        // If the provider is not already in the providerToPath map,
        // add an entry with the provider as the key and an array containing the current container as
        // the value
        if (!providerToPath.has(provider)) {
            providerToPath.set(provider, [container]);
        }
        // This block will run exactly once for each container in the import tree.
        // This is where we run the logic to check the imports array of the current
        // container to see if it's the next container in the path for our currently
        // discovered providers.
        if (!visitedContainers.has(container)) {
            // Iterate through the providers we've already seen
            for (const prov of providerToPath.keys()) {
                const existingImportPath = providerToPath.get(prov);
                let containerDef = getInjectorDef(container);
                if (!containerDef) {
                    const ngModule = container.ngModule;
                    containerDef = getInjectorDef(ngModule);
                }
                if (!containerDef) {
                    return;
                }
                const lastContainerAddedToPath = existingImportPath[0];
                let isNextStepInPath = false;
                deepForEach(containerDef.imports, (moduleImport) => {
                    if (isNextStepInPath) {
                        return;
                    }
                    isNextStepInPath =
                        moduleImport.ngModule === lastContainerAddedToPath ||
                            moduleImport === lastContainerAddedToPath;
                    if (isNextStepInPath) {
                        providerToPath.get(prov)?.unshift(container);
                    }
                });
            }
        }
        visitedContainers.add(container);
    };
}
/**
 * Gets the providers configured on an EnvironmentInjector
 *
 * @param injector EnvironmentInjector
 * @returns an array of objects representing the providers of the given injector
 */
function getEnvironmentInjectorProviders(injector) {
    const providerRecordsWithoutImportPaths = getFrameworkDIDebugData().resolverToProviders.get(injector) ?? [];
    // platform injector has no provider imports container so can we skip trying to
    // find import paths
    if (isPlatformInjector(injector)) {
        return providerRecordsWithoutImportPaths;
    }
    const providerImportsContainer = getProviderImportsContainer(injector);
    if (providerImportsContainer === null) {
        // We assume that if an environment injector exists without an associated provider imports
        // container, it was created without such a container. Some examples cases where this could
        // happen:
        // - The root injector of a standalone application
        // - A router injector created by using the providers array in a lazy loaded route
        // - A manually created injector that is attached to the injector tree
        // Since each of these cases has no provider container, there is no concept of import paths,
        // so we can simply return the provider records.
        return providerRecordsWithoutImportPaths;
    }
    const providerToPath = getProviderImportPaths(providerImportsContainer);
    const providerRecords = [];
    for (const providerRecord of providerRecordsWithoutImportPaths) {
        const provider = providerRecord.provider;
        // Ignore these special providers for now until we have a cleaner way of
        // determing when they are provided by the framework vs provided by the user.
        const token = provider.provide;
        if (token === ENVIRONMENT_INITIALIZER || token === INJECTOR_DEF_TYPES) {
            continue;
        }
        let importPath = providerToPath.get(provider) ?? [];
        const def = getComponentDef(providerImportsContainer);
        const isStandaloneComponent = !!def?.standalone;
        // We prepend the component constructor in the standalone case
        // because walkProviderTree does not visit this constructor during it's traversal
        if (isStandaloneComponent) {
            importPath = [providerImportsContainer, ...importPath];
        }
        providerRecords.push({ ...providerRecord, importPath });
    }
    return providerRecords;
}
function isPlatformInjector(injector) {
    return injector instanceof R3Injector && injector.scopes.has('platform');
}
/**
 * Gets the providers configured on an injector.
 *
 * @param injector the injector to lookup the providers of
 * @returns ProviderRecord[] an array of objects representing the providers of the given injector
 */
function getInjectorProviders(injector) {
    if (injector instanceof NodeInjector) {
        return getNodeInjectorProviders(injector);
    }
    else if (injector instanceof EnvironmentInjector) {
        return getEnvironmentInjectorProviders(injector);
    }
    throwError('getInjectorProviders only supports NodeInjector and EnvironmentInjector');
}
/**
 *
 * Given an injector, this function will return
 * an object containing the type and source of the injector.
 *
 * |              | type        | source                                                      |
 * |--------------|-------------|-------------------------------------------------------------|
 * | NodeInjector | element     | DOM element that created this injector                      |
 * | R3Injector   | environment | `injector.source`                                           |
 * | NullInjector | null        | null                                                        |
 *
 * @param injector the Injector to get metadata for
 * @returns an object containing the type and source of the given injector. If the injector metadata
 *     cannot be determined, returns null.
 */
function getInjectorMetadata(injector) {
    if (injector instanceof NodeInjector) {
        const lView = getNodeInjectorLView(injector);
        const tNode = getNodeInjectorTNode(injector);
        assertTNodeForLView(tNode, lView);
        return { type: 'element', source: getNativeByTNode(tNode, lView) };
    }
    if (injector instanceof R3Injector) {
        return { type: 'environment', source: injector.source ?? null };
    }
    if (injector instanceof NullInjector) {
        return { type: 'null', source: null };
    }
    return null;
}
function getInjectorResolutionPath(injector) {
    const resolutionPath = [injector];
    getInjectorResolutionPathHelper(injector, resolutionPath);
    return resolutionPath;
}
function getInjectorResolutionPathHelper(injector, resolutionPath) {
    const parent = getInjectorParent(injector);
    // if getInjectorParent can't find a parent, then we've either reached the end
    // of the path, or we need to move from the Element Injector tree to the
    // module injector tree using the first injector in our path as the connection point.
    if (parent === null) {
        if (injector instanceof NodeInjector) {
            const firstInjector = resolutionPath[0];
            if (firstInjector instanceof NodeInjector) {
                const moduleInjector = getModuleInjectorOfNodeInjector(firstInjector);
                if (moduleInjector === null) {
                    throwError('NodeInjector must have some connection to the module injector tree');
                }
                resolutionPath.push(moduleInjector);
                getInjectorResolutionPathHelper(moduleInjector, resolutionPath);
            }
            return resolutionPath;
        }
    }
    else {
        resolutionPath.push(parent);
        getInjectorResolutionPathHelper(parent, resolutionPath);
    }
    return resolutionPath;
}
/**
 * Gets the parent of an injector.
 *
 * This function is not able to make the jump from the Element Injector Tree to the Module
 * injector tree. This is because the "parent" (the next step in the reoslution path)
 * of a root NodeInjector is dependent on which NodeInjector ancestor initiated
 * the DI lookup. See getInjectorResolutionPath for a function that can make this jump.
 *
 * In the below diagram:
 * ```ts
 * getInjectorParent(NodeInjectorB)
 *  > NodeInjectorA
 * getInjectorParent(NodeInjectorA) // or getInjectorParent(getInjectorParent(NodeInjectorB))
 *  > null // cannot jump to ModuleInjector tree
 * ```
 *
 * ```
 *                ┌───────┐                ┌───────────────────┐
 *    ┌───────────┤ModuleA├───Injector────►│EnvironmentInjector│
 *    │           └───┬───┘                └───────────────────┘
 *    │               │
 *    │           bootstraps
 *    │               │
 *    │               │
 *    │          ┌────▼─────┐                 ┌─────────────┐
 * declares      │ComponentA├────Injector────►│NodeInjectorA│
 *    │          └────┬─────┘                 └─────▲───────┘
 *    │               │                             │
 *    │            renders                        parent
 *    │               │                             │
 *    │          ┌────▼─────┐                 ┌─────┴───────┐
 *    └─────────►│ComponentB├────Injector────►│NodeInjectorB│
 *               └──────────┘                 └─────────────┘
 *```
 *
 * @param injector an Injector to get the parent of
 * @returns Injector the parent of the given injector
 */
function getInjectorParent(injector) {
    if (injector instanceof R3Injector) {
        return injector.parent;
    }
    let tNode;
    let lView;
    if (injector instanceof NodeInjector) {
        tNode = getNodeInjectorTNode(injector);
        lView = getNodeInjectorLView(injector);
    }
    else if (injector instanceof NullInjector) {
        return null;
    }
    else if (injector instanceof ChainedInjector) {
        return injector.parentInjector;
    }
    else {
        throwError('getInjectorParent only support injectors of type R3Injector, NodeInjector, NullInjector');
    }
    const parentLocation = getParentInjectorLocation(tNode, lView);
    if (hasParentInjector(parentLocation)) {
        const parentInjectorIndex = getParentInjectorIndex(parentLocation);
        const parentLView = getParentInjectorView(parentLocation, lView);
        const parentTView = parentLView[TVIEW];
        const parentTNode = parentTView.data[parentInjectorIndex + 8 /* NodeInjectorOffset.TNODE */];
        return new NodeInjector(parentTNode, parentLView);
    }
    else {
        const chainedInjector = lView[INJECTOR];
        // Case where chainedInjector.injector is an OutletInjector and chainedInjector.injector.parent
        // is a NodeInjector.
        // todo(aleksanderbodurri): ideally nothing in packages/core should deal
        // directly with router concerns. Refactor this so that we can make the jump from
        // NodeInjector -> OutletInjector -> NodeInjector
        // without explicitly relying on types contracts from packages/router
        const injectorParent = chainedInjector.injector?.parent;
        if (injectorParent instanceof NodeInjector) {
            return injectorParent;
        }
    }
    return null;
}
/**
 * Gets the module injector of a NodeInjector.
 *
 * @param injector NodeInjector to get module injector of
 * @returns Injector representing module injector of the given NodeInjector
 */
function getModuleInjectorOfNodeInjector(injector) {
    let lView;
    if (injector instanceof NodeInjector) {
        lView = getNodeInjectorLView(injector);
    }
    else {
        throwError('getModuleInjectorOfNodeInjector must be called with a NodeInjector');
    }
    const inj = lView[INJECTOR];
    const moduleInjector = inj instanceof ChainedInjector ? inj.parentInjector : inj.parent;
    if (!moduleInjector) {
        throwError('NodeInjector must have some connection to the module injector tree');
    }
    return moduleInjector;
}

function isComputedNode(node) {
    return node.kind === 'computed';
}
function isTemplateEffectNode(node) {
    return node.kind === 'template';
}
function isEffectNode(node) {
    return node.kind === 'effect';
}
function isSignalNode(node) {
    return node.kind === 'signal';
}
/**
 *
 * @param injector
 * @returns Template consumer of given NodeInjector
 */
function getTemplateConsumer(injector) {
    const tNode = getNodeInjectorTNode(injector);
    assertTNode(tNode);
    const lView = getNodeInjectorLView(injector);
    assertLView(lView);
    const templateLView = lView[tNode.index];
    assertLView(templateLView);
    return templateLView[REACTIVE_TEMPLATE_CONSUMER];
}
function getNodesAndEdgesFromSignalMap(signalMap) {
    const nodes = Array.from(signalMap.keys());
    const debugSignalGraphNodes = [];
    const edges = [];
    for (const [consumer, producers] of signalMap.entries()) {
        const consumerIndex = nodes.indexOf(consumer);
        // collect node
        if (isComputedNode(consumer) || isSignalNode(consumer)) {
            debugSignalGraphNodes.push({
                label: consumer.debugName,
                value: consumer.value,
                kind: consumer.kind,
            });
        }
        else if (isTemplateEffectNode(consumer)) {
            debugSignalGraphNodes.push({
                label: consumer.debugName ?? consumer.lView?.[HOST]?.tagName?.toLowerCase?.(),
                kind: consumer.kind,
            });
        }
        else if (isEffectNode(consumer)) {
            debugSignalGraphNodes.push({
                label: consumer.debugName,
                kind: consumer.kind,
            });
        }
        else {
            debugSignalGraphNodes.push({
                label: consumer.debugName,
                kind: consumer.kind,
            });
        }
        // collect edges for node
        for (const producer of producers) {
            edges.push({ consumer: consumerIndex, producer: nodes.indexOf(producer) });
        }
    }
    return { nodes: debugSignalGraphNodes, edges };
}
function extractEffectsFromInjector(injector) {
    let diResolver = injector;
    if (injector instanceof NodeInjector) {
        const lView = getNodeInjectorLView(injector);
        diResolver = lView;
    }
    const resolverToEffects = getFrameworkDIDebugData().resolverToEffects;
    const effects = resolverToEffects.get(diResolver) ?? [];
    return effects.map((effect) => effect[SIGNAL]);
}
function extractSignalNodesAndEdgesFromRoots(nodes, signalDependenciesMap = new Map()) {
    for (const node of nodes) {
        if (signalDependenciesMap.has(node)) {
            continue;
        }
        const producerNodes = (node.producerNode ?? []);
        signalDependenciesMap.set(node, producerNodes);
        extractSignalNodesAndEdgesFromRoots(producerNodes, signalDependenciesMap);
    }
    return signalDependenciesMap;
}
/**
 * Returns a debug representation of the signal graph for the given injector.
 *
 * Currently only supports element injectors. Starts by discovering the consumer nodes
 * and then traverses their producer nodes to build the signal graph.
 *
 * @param injector The injector to get the signal graph for.
 * @returns A debug representation of the signal graph.
 * @throws If the injector is an environment injector.
 */
function getSignalGraph(injector) {
    let templateConsumer = null;
    if (!(injector instanceof NodeInjector) && !(injector instanceof R3Injector)) {
        return throwError('getSignalGraph must be called with a NodeInjector or R3Injector');
    }
    if (injector instanceof NodeInjector) {
        templateConsumer = getTemplateConsumer(injector);
    }
    const nonTemplateEffectNodes = extractEffectsFromInjector(injector);
    const signalNodes = templateConsumer
        ? [templateConsumer, ...nonTemplateEffectNodes]
        : nonTemplateEffectNodes;
    const signalDependenciesMap = extractSignalNodesAndEdgesFromRoots(signalNodes);
    return getNodesAndEdgesFromSignalMap(signalDependenciesMap);
}

/// <reference path="../../../../goog.d.ts" />
/**
 * This file introduces series of globally accessible debug tools
 * to allow for the Angular debugging story to function.
 *
 * To see this in action run the following command:
 *
 *   bazel run //packages/core/test/bundling/todo:devserver
 *
 *  Then load `localhost:5432` and start using the console tools.
 */
/**
 * This value reflects the property on the window where the dev
 * tools are patched (window.ng).
 * */
const GLOBAL_PUBLISH_EXPANDO_KEY = 'ng';
const globalUtilsFunctions = {
    /**
     * Warning: functions that start with `ɵ` are considered *INTERNAL* and should not be relied upon
     * in application's code. The contract of those functions might be changed in any release and/or a
     * function can be removed completely.
     */
    'ɵgetDependenciesFromInjectable': getDependenciesFromInjectable,
    'ɵgetInjectorProviders': getInjectorProviders,
    'ɵgetInjectorResolutionPath': getInjectorResolutionPath,
    'ɵgetInjectorMetadata': getInjectorMetadata,
    'ɵsetProfiler': setProfiler,
    'ɵgetSignalGraph': getSignalGraph,
    'ɵgetDeferBlocks': getDeferBlocks,
    'getDirectiveMetadata': getDirectiveMetadata$1,
    'getComponent': getComponent,
    'getContext': getContext,
    'getListeners': getListeners,
    'getOwningComponent': getOwningComponent,
    'getHostElement': getHostElement,
    'getInjector': getInjector,
    'getRootComponents': getRootComponents,
    'getDirectives': getDirectives,
    'applyChanges': applyChanges,
    'isSignal': isSignal,
};
let _published = false;
/**
 * Publishes a collection of default debug tools onto`window.ng`.
 *
 * These functions are available globally when Angular is in development
 * mode and are automatically stripped away from prod mode is on.
 */
function publishDefaultGlobalUtils$1() {
    if (!_published) {
        _published = true;
        if (typeof window !== 'undefined') {
            // Only configure the injector profiler when running in the browser.
            setupFrameworkInjectorProfiler();
        }
        for (const [methodName, method] of Object.entries(globalUtilsFunctions)) {
            publishGlobalUtil(methodName, method);
        }
    }
}
/**
 * Publishes the given function to `window.ng` so that it can be
 * used from the browser console when an application is not in production.
 */
function publishGlobalUtil(name, fn) {
    publishUtil(name, fn);
}
/**
 * Publishes the given function to `window.ng` from package other than @angular/core
 * So that it can be used from the browser console when an application is not in production.
 */
function publishExternalGlobalUtil(name, fn) {
    publishUtil(name, fn);
}
function publishUtil(name, fn) {
    if (typeof COMPILED === 'undefined' || !COMPILED) {
        // Note: we can't export `ng` when using closure enhanced optimization as:
        // - closure declares globals itself for minified names, which sometimes clobber our `ng` global
        // - we can't declare a closure extern as the namespace `ng` is already used within Google
        //   for typings for AngularJS (via `goog.provide('ng....')`).
        const w = _global;
        ngDevMode && assertDefined(fn, 'function not defined');
        w[GLOBAL_PUBLISH_EXPANDO_KEY] ??= {};
        w[GLOBAL_PUBLISH_EXPANDO_KEY][name] = fn;
    }
}

/**
 * Internal injection token that can used to access an instance of a Testability class.
 *
 * This token acts as a bridge between the core bootstrap code and the `Testability` class. This is
 * needed to ensure that there are no direct references to the `Testability` class, so it can be
 * tree-shaken away (if not referenced). For the environments/setups when the `Testability` class
 * should be available, this token is used to add a provider that references the `Testability`
 * class. Otherwise, only this token is retained in a bundle, but the `Testability` class is not.
 */
const TESTABILITY = new InjectionToken('');
/**
 * Internal injection token to retrieve Testability getter class instance.
 */
const TESTABILITY_GETTER = new InjectionToken('');
/**
 * The Testability service provides testing hooks that can be accessed from
 * the browser.
 *
 * Angular applications bootstrapped using an NgModule (via `@NgModule.bootstrap` field) will also
 * instantiate Testability by default (in both development and production modes).
 *
 * For applications bootstrapped using the `bootstrapApplication` function, Testability is not
 * included by default. You can include it into your applications by getting the list of necessary
 * providers using the `provideProtractorTestingSupport()` function and adding them into the
 * `options.providers` array. Example:
 *
 * ```ts
 * import {provideProtractorTestingSupport} from '@angular/platform-browser';
 *
 * await bootstrapApplication(RootComponent, providers: [provideProtractorTestingSupport()]);
 * ```
 *
 * @publicApi
 */
class Testability {
    _ngZone;
    registry;
    _isZoneStable = true;
    _callbacks = [];
    _taskTrackingZone = null;
    _destroyRef;
    constructor(_ngZone, registry, testabilityGetter) {
        this._ngZone = _ngZone;
        this.registry = registry;
        // Attempt to retrieve a `DestroyRef` optionally.
        // For backwards compatibility reasons, this cannot be required.
        if (isInInjectionContext()) {
            this._destroyRef = inject(DestroyRef, { optional: true }) ?? undefined;
        }
        // If there was no Testability logic registered in the global scope
        // before, register the current testability getter as a global one.
        if (!_testabilityGetter) {
            setTestabilityGetter(testabilityGetter);
            testabilityGetter.addToWindow(registry);
        }
        this._watchAngularEvents();
        _ngZone.run(() => {
            this._taskTrackingZone =
                typeof Zone == 'undefined' ? null : Zone.current.get('TaskTrackingZone');
        });
    }
    _watchAngularEvents() {
        const onUnstableSubscription = this._ngZone.onUnstable.subscribe({
            next: () => {
                this._isZoneStable = false;
            },
        });
        const onStableSubscription = this._ngZone.runOutsideAngular(() => this._ngZone.onStable.subscribe({
            next: () => {
                NgZone.assertNotInAngularZone();
                queueMicrotask(() => {
                    this._isZoneStable = true;
                    this._runCallbacksIfReady();
                });
            },
        }));
        this._destroyRef?.onDestroy(() => {
            onUnstableSubscription.unsubscribe();
            onStableSubscription.unsubscribe();
        });
    }
    /**
     * Whether an associated application is stable
     */
    isStable() {
        return this._isZoneStable && !this._ngZone.hasPendingMacrotasks;
    }
    _runCallbacksIfReady() {
        if (this.isStable()) {
            // Schedules the call backs in a new frame so that it is always async.
            queueMicrotask(() => {
                while (this._callbacks.length !== 0) {
                    let cb = this._callbacks.pop();
                    clearTimeout(cb.timeoutId);
                    cb.doneCb();
                }
            });
        }
        else {
            // Still not stable, send updates.
            let pending = this.getPendingTasks();
            this._callbacks = this._callbacks.filter((cb) => {
                if (cb.updateCb && cb.updateCb(pending)) {
                    clearTimeout(cb.timeoutId);
                    return false;
                }
                return true;
            });
        }
    }
    getPendingTasks() {
        if (!this._taskTrackingZone) {
            return [];
        }
        // Copy the tasks data so that we don't leak tasks.
        return this._taskTrackingZone.macroTasks.map((t) => {
            return {
                source: t.source,
                // From TaskTrackingZone:
                // https://github.com/angular/zone.js/blob/master/lib/zone-spec/task-tracking.ts#L40
                creationLocation: t.creationLocation,
                data: t.data,
            };
        });
    }
    addCallback(cb, timeout, updateCb) {
        let timeoutId = -1;
        if (timeout && timeout > 0) {
            timeoutId = setTimeout(() => {
                this._callbacks = this._callbacks.filter((cb) => cb.timeoutId !== timeoutId);
                cb();
            }, timeout);
        }
        this._callbacks.push({ doneCb: cb, timeoutId: timeoutId, updateCb: updateCb });
    }
    /**
     * Wait for the application to be stable with a timeout. If the timeout is reached before that
     * happens, the callback receives a list of the macro tasks that were pending, otherwise null.
     *
     * @param doneCb The callback to invoke when Angular is stable or the timeout expires
     *    whichever comes first.
     * @param timeout Optional. The maximum time to wait for Angular to become stable. If not
     *    specified, whenStable() will wait forever.
     * @param updateCb Optional. If specified, this callback will be invoked whenever the set of
     *    pending macrotasks changes. If this callback returns true doneCb will not be invoked
     *    and no further updates will be issued.
     */
    whenStable(doneCb, timeout, updateCb) {
        if (updateCb && !this._taskTrackingZone) {
            throw new Error('Task tracking zone is required when passing an update callback to ' +
                'whenStable(). Is "zone.js/plugins/task-tracking" loaded?');
        }
        this.addCallback(doneCb, timeout, updateCb);
        this._runCallbacksIfReady();
    }
    /**
     * Registers an application with a testability hook so that it can be tracked.
     * @param token token of application, root element
     *
     * @internal
     */
    registerApplication(token) {
        this.registry.registerApplication(token, this);
    }
    /**
     * Unregisters an application.
     * @param token token of application, root element
     *
     * @internal
     */
    unregisterApplication(token) {
        this.registry.unregisterApplication(token);
    }
    /**
     * Find providers by name
     * @param using The root element to search from
     * @param provider The name of binding variable
     * @param exactMatch Whether using exactMatch
     */
    findProviders(using, provider, exactMatch) {
        // TODO(juliemr): implement.
        return [];
    }
    static ɵfac = function Testability_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || Testability)(ɵɵinject(NgZone), ɵɵinject(TestabilityRegistry), ɵɵinject(TESTABILITY_GETTER)); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: Testability, factory: Testability.ɵfac });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Testability, [{
        type: Injectable
    }], () => [{ type: NgZone }, { type: TestabilityRegistry }, { type: undefined, decorators: [{
                type: Inject,
                args: [TESTABILITY_GETTER]
            }] }], null); })();
/**
 * A global registry of {@link Testability} instances for specific elements.
 * @publicApi
 */
class TestabilityRegistry {
    /** @internal */
    _applications = new Map();
    /**
     * Registers an application with a testability hook so that it can be tracked
     * @param token token of application, root element
     * @param testability Testability hook
     */
    registerApplication(token, testability) {
        this._applications.set(token, testability);
    }
    /**
     * Unregisters an application.
     * @param token token of application, root element
     */
    unregisterApplication(token) {
        this._applications.delete(token);
    }
    /**
     * Unregisters all applications
     */
    unregisterAllApplications() {
        this._applications.clear();
    }
    /**
     * Get a testability hook associated with the application
     * @param elem root element
     */
    getTestability(elem) {
        return this._applications.get(elem) || null;
    }
    /**
     * Get all registered testabilities
     */
    getAllTestabilities() {
        return Array.from(this._applications.values());
    }
    /**
     * Get all registered applications(root elements)
     */
    getAllRootElements() {
        return Array.from(this._applications.keys());
    }
    /**
     * Find testability of a node in the Tree
     * @param elem node
     * @param findInAncestors whether finding testability in ancestors if testability was not found in
     * current node
     */
    findTestabilityInTree(elem, findInAncestors = true) {
        return _testabilityGetter?.findTestabilityInTree(this, elem, findInAncestors) ?? null;
    }
    static ɵfac = function TestabilityRegistry_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestabilityRegistry)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: TestabilityRegistry, factory: TestabilityRegistry.ɵfac, providedIn: 'platform' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(TestabilityRegistry, [{
        type: Injectable,
        args: [{ providedIn: 'platform' }]
    }], null, null); })();
/**
 * Set the {@link GetTestability} implementation used by the Angular testing framework.
 * @publicApi
 */
function setTestabilityGetter(getter) {
    _testabilityGetter = getter;
}
let _testabilityGetter;

/**
 * A scheduler which manages the execution of effects.
 */
class EffectScheduler {
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: EffectScheduler,
        providedIn: 'root',
        factory: () => new ZoneAwareEffectScheduler(),
    });
}
/**
 * A wrapper around `ZoneAwareQueueingScheduler` that schedules flushing via the microtask queue
 * when.
 */
class ZoneAwareEffectScheduler {
    queuedEffectCount = 0;
    queues = new Map();
    schedule(handle) {
        this.enqueue(handle);
    }
    remove(handle) {
        const zone = handle.zone;
        const queue = this.queues.get(zone);
        if (!queue.has(handle)) {
            return;
        }
        queue.delete(handle);
        this.queuedEffectCount--;
    }
    enqueue(handle) {
        const zone = handle.zone;
        if (!this.queues.has(zone)) {
            this.queues.set(zone, new Set());
        }
        const queue = this.queues.get(zone);
        if (queue.has(handle)) {
            return;
        }
        this.queuedEffectCount++;
        queue.add(handle);
    }
    /**
     * Run all scheduled effects.
     *
     * Execution order of effects within the same zone is guaranteed to be FIFO, but there is no
     * ordering guarantee between effects scheduled in different zones.
     */
    flush() {
        while (this.queuedEffectCount > 0) {
            for (const [zone, queue] of this.queues) {
                // `zone` here must be defined.
                if (zone === null) {
                    this.flushQueue(queue);
                }
                else {
                    zone.run(() => this.flushQueue(queue));
                }
            }
        }
    }
    flushQueue(queue) {
        for (const handle of queue) {
            queue.delete(handle);
            this.queuedEffectCount--;
            // TODO: what happens if this throws an error?
            handle.run();
        }
    }
}

/**
 * Determine if the argument is shaped like a Promise
 */
function isPromise(obj) {
    // allow any Promise/A+ compliant thenable.
    // It's up to the caller to ensure that obj.then conforms to the spec
    return !!obj && typeof obj.then === 'function';
}
/**
 * Determine if the argument is a Subscribable
 */
function isSubscribable(obj) {
    return !!obj && typeof obj.subscribe === 'function';
}

/**
 * A DI token that you can use to provide
 * one or more initialization functions.
 *
 * The provided functions are injected at application startup and executed during
 * app initialization. If any of these functions returns a Promise or an Observable, initialization
 * does not complete until the Promise is resolved or the Observable is completed.
 *
 * You can, for example, create a factory function that loads language data
 * or an external configuration, and provide that function to the `APP_INITIALIZER` token.
 * The function is executed during the application bootstrap process,
 * and the needed data is available on startup.
 *
 * Note that the provided initializer is run in the injection context.
 *
 * @deprecated from v19.0.0, use provideAppInitializer instead
 *
 * @see {@link ApplicationInitStatus}
 * @see {@link provideAppInitializer}
 *
 * @usageNotes
 *
 * The following example illustrates how to configure a multi-provider using `APP_INITIALIZER` token
 * and a function returning a promise.
 * ### Example with NgModule-based application
 * ```ts
 *  function initializeApp(): Promise<any> {
 *    const http = inject(HttpClient);
 *    return firstValueFrom(
 *      http
 *        .get("https://someUrl.com/api/user")
 *        .pipe(tap(user => { ... }))
 *    );
 *  }
 *
 *  @NgModule({
 *   imports: [BrowserModule],
 *   declarations: [AppComponent],
 *   bootstrap: [AppComponent],
 *   providers: [{
 *     provide: APP_INITIALIZER,
 *     useValue: initializeApp,
 *     multi: true,
 *    }]
 *   })
 *  export class AppModule {}
 * ```
 *
 * ### Example with standalone application
 * ```ts
 * function initializeApp() {
 *   const http = inject(HttpClient);
 *   return firstValueFrom(
 *     http
 *       .get("https://someUrl.com/api/user")
 *       .pipe(tap(user => { ... }))
 *   );
 * }
 *
 * bootstrapApplication(App, {
 *   providers: [
 *     provideHttpClient(),
 *     {
 *       provide: APP_INITIALIZER,
 *       useValue: initializeApp,
 *       multi: true,
 *     },
 *   ],
 * });

 * ```
 *
 *
 * It's also possible to configure a multi-provider using `APP_INITIALIZER` token and a function
 * returning an observable, see an example below. Note: the `HttpClient` in this example is used for
 * demo purposes to illustrate how the factory function can work with other providers available
 * through DI.
 *
 * ### Example with NgModule-based application
 * ```ts
 * function initializeApp() {
 *   const http = inject(HttpClient);
 *   return firstValueFrom(
 *     http
 *       .get("https://someUrl.com/api/user")
 *       .pipe(tap(user => { ... }))
 *   );
 * }
 *
 * @NgModule({
 *   imports: [BrowserModule, HttpClientModule],
 *   declarations: [AppComponent],
 *   bootstrap: [AppComponent],
 *   providers: [{
 *     provide: APP_INITIALIZER,
 *     useValue: initializeApp,
 *     multi: true,
 *   }]
 * })
 * export class AppModule {}
 * ```
 *
 * ### Example with standalone application
 * ```ts
 * function initializeApp() {
 *   const http = inject(HttpClient);
 *   return firstValueFrom(
 *     http
 *       .get("https://someUrl.com/api/user")
 *       .pipe(tap(user => { ... }))
 *   );
 * }
 *
 * bootstrapApplication(App, {
 *   providers: [
 *     provideHttpClient(),
 *     {
 *       provide: APP_INITIALIZER,
 *       useValue: initializeApp,
 *       multi: true,
 *     },
 *   ],
 * });
 * ```
 *
 * @publicApi
 */
const APP_INITIALIZER = new InjectionToken(ngDevMode ? 'Application Initializer' : '');
/**
 * @description
 * The provided function is injected at application startup and executed during
 * app initialization. If the function returns a Promise or an Observable, initialization
 * does not complete until the Promise is resolved or the Observable is completed.
 *
 * You can, for example, create a function that loads language data
 * or an external configuration, and provide that function using `provideAppInitializer()`.
 * The function is executed during the application bootstrap process,
 * and the needed data is available on startup.
 *
 * Note that the provided initializer is run in the injection context.
 *
 * Previously, this was achieved using the `APP_INITIALIZER` token which is now deprecated.
 *
 * @see {@link APP_INITIALIZER}
 *
 * @usageNotes
 * The following example illustrates how to configure an initialization function using
 * `provideAppInitializer()`
 * ```ts
 * bootstrapApplication(App, {
 *   providers: [
 *     provideAppInitializer(() => {
 *       const http = inject(HttpClient);
 *       return firstValueFrom(
 *         http
 *           .get("https://someUrl.com/api/user")
 *           .pipe(tap(user => { ... }))
 *       );
 *     }),
 *     provideHttpClient(),
 *   ],
 * });
 * ```
 *
 * @publicApi
 */
function provideAppInitializer(initializerFn) {
    return makeEnvironmentProviders([
        {
            provide: APP_INITIALIZER,
            multi: true,
            useValue: initializerFn,
        },
    ]);
}
/**
 * A class that reflects the state of running {@link APP_INITIALIZER} functions.
 *
 * @publicApi
 */
class ApplicationInitStatus {
    // Using non null assertion, these fields are defined below
    // within the `new Promise` callback (synchronously).
    resolve;
    reject;
    initialized = false;
    done = false;
    donePromise = new Promise((res, rej) => {
        this.resolve = res;
        this.reject = rej;
    });
    appInits = inject(APP_INITIALIZER, { optional: true }) ?? [];
    injector = inject(Injector);
    constructor() {
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && !Array.isArray(this.appInits)) {
            throw new RuntimeError(-209 /* RuntimeErrorCode.INVALID_MULTI_PROVIDER */, 'Unexpected type of the `APP_INITIALIZER` token value ' +
                `(expected an array, but got ${typeof this.appInits}). ` +
                'Please check that the `APP_INITIALIZER` token is configured as a ' +
                '`multi: true` provider.');
        }
    }
    /** @internal */
    runInitializers() {
        if (this.initialized) {
            return;
        }
        const asyncInitPromises = [];
        for (const appInits of this.appInits) {
            const initResult = runInInjectionContext(this.injector, appInits);
            if (isPromise(initResult)) {
                asyncInitPromises.push(initResult);
            }
            else if (isSubscribable(initResult)) {
                const observableAsPromise = new Promise((resolve, reject) => {
                    initResult.subscribe({ complete: resolve, error: reject });
                });
                asyncInitPromises.push(observableAsPromise);
            }
        }
        const complete = () => {
            // @ts-expect-error overwriting a readonly
            this.done = true;
            this.resolve();
        };
        Promise.all(asyncInitPromises)
            .then(() => {
            complete();
        })
            .catch((e) => {
            this.reject(e);
        });
        if (asyncInitPromises.length === 0) {
            complete();
        }
        this.initialized = true;
    }
    static ɵfac = function ApplicationInitStatus_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ApplicationInitStatus)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: ApplicationInitStatus, factory: ApplicationInitStatus.ɵfac, providedIn: 'root' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ApplicationInitStatus, [{
        type: Injectable,
        args: [{ providedIn: 'root' }]
    }], () => [], null); })();

/**
 * A DI token that provides a set of callbacks to
 * be called for every component that is bootstrapped.
 *
 * Each callback must take a `ComponentRef` instance and return nothing.
 *
 * `(componentRef: ComponentRef) => void`
 *
 * @publicApi
 */
const APP_BOOTSTRAP_LISTENER = new InjectionToken(ngDevMode ? 'appBootstrapListener' : '');
function publishDefaultGlobalUtils() {
    ngDevMode && publishDefaultGlobalUtils$1();
}
/**
 * Sets the error for an invalid write to a signal to be an Angular `RuntimeError`.
 */
function publishSignalConfiguration() {
    setThrowInvalidWriteToSignalError(() => {
        throw new RuntimeError(600 /* RuntimeErrorCode.SIGNAL_WRITE_FROM_ILLEGAL_CONTEXT */, ngDevMode && 'Writing to signals is not allowed in a `computed`.');
    });
}
function isBoundToModule(cf) {
    return cf.isBoundToModule;
}
/**
 * A token for third-party components that can register themselves with NgProbe.
 *
 * @deprecated
 * @publicApi
 */
class NgProbeToken {
    name;
    token;
    constructor(name, token) {
        this.name = name;
        this.token = token;
    }
}
/** Maximum number of times ApplicationRef will refresh all attached views in a single tick. */
const MAXIMUM_REFRESH_RERUNS = 10;
function optionsReducer(dst, objs) {
    if (Array.isArray(objs)) {
        return objs.reduce(optionsReducer, dst);
    }
    return { ...dst, ...objs };
}
/**
 * A reference to an Angular application running on a page.
 *
 * @usageNotes
 * ### isStable examples and caveats
 *
 * Note two important points about `isStable`, demonstrated in the examples below:
 * - the application will never be stable if you start any kind
 * of recurrent asynchronous task when the application starts
 * (for example for a polling process, started with a `setInterval`, a `setTimeout`
 * or using RxJS operators like `interval`);
 * - the `isStable` Observable runs outside of the Angular zone.
 *
 * Let's imagine that you start a recurrent task
 * (here incrementing a counter, using RxJS `interval`),
 * and at the same time subscribe to `isStable`.
 *
 * ```ts
 * constructor(appRef: ApplicationRef) {
 *   appRef.isStable.pipe(
 *      filter(stable => stable)
 *   ).subscribe(() => console.log('App is stable now');
 *   interval(1000).subscribe(counter => console.log(counter));
 * }
 * ```
 * In this example, `isStable` will never emit `true`,
 * and the trace "App is stable now" will never get logged.
 *
 * If you want to execute something when the app is stable,
 * you have to wait for the application to be stable
 * before starting your polling process.
 *
 * ```ts
 * constructor(appRef: ApplicationRef) {
 *   appRef.isStable.pipe(
 *     first(stable => stable),
 *     tap(stable => console.log('App is stable now')),
 *     switchMap(() => interval(1000))
 *   ).subscribe(counter => console.log(counter));
 * }
 * ```
 * In this example, the trace "App is stable now" will be logged
 * and then the counter starts incrementing every second.
 *
 * Note also that this Observable runs outside of the Angular zone,
 * which means that the code in the subscription
 * to this Observable will not trigger the change detection.
 *
 * Let's imagine that instead of logging the counter value,
 * you update a field of your component
 * and display it in its template.
 *
 * ```ts
 * constructor(appRef: ApplicationRef) {
 *   appRef.isStable.pipe(
 *     first(stable => stable),
 *     switchMap(() => interval(1000))
 *   ).subscribe(counter => this.value = counter);
 * }
 * ```
 * As the `isStable` Observable runs outside the zone,
 * the `value` field will be updated properly,
 * but the template will not be refreshed!
 *
 * You'll have to manually trigger the change detection to update the template.
 *
 * ```ts
 * constructor(appRef: ApplicationRef, cd: ChangeDetectorRef) {
 *   appRef.isStable.pipe(
 *     first(stable => stable),
 *     switchMap(() => interval(1000))
 *   ).subscribe(counter => {
 *     this.value = counter;
 *     cd.detectChanges();
 *   });
 * }
 * ```
 *
 * Or make the subscription callback run inside the zone.
 *
 * ```ts
 * constructor(appRef: ApplicationRef, zone: NgZone) {
 *   appRef.isStable.pipe(
 *     first(stable => stable),
 *     switchMap(() => interval(1000))
 *   ).subscribe(counter => zone.run(() => this.value = counter));
 * }
 * ```
 *
 * @publicApi
 */
class ApplicationRef {
    /** @internal */
    _runningTick = false;
    _destroyed = false;
    _destroyListeners = [];
    /** @internal */
    _views = [];
    internalErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
    afterRenderManager = inject(AfterRenderManager);
    zonelessEnabled = inject(ZONELESS_ENABLED);
    rootEffectScheduler = inject(EffectScheduler);
    /**
     * Current dirty state of the application across a number of dimensions (views, afterRender hooks,
     * etc).
     *
     * A flag set here means that `tick()` will attempt to resolve the dirtiness when executed.
     *
     * @internal
     */
    dirtyFlags = 0 /* ApplicationRefDirtyFlags.None */;
    /**
     * Most recent snapshot from the `TracingService`, if any.
     *
     * This snapshot attempts to capture the context when `tick()` was first
     * scheduled. It then runs wrapped in this context.
     *
     * @internal
     */
    tracingSnapshot = null;
    // Needed for ComponentFixture temporarily during migration of autoDetect behavior
    // Eventually the hostView of the fixture should just attach to ApplicationRef.
    externalTestViews = new Set();
    /** @internal */
    afterTick = new Subject();
    /** @internal */
    get allViews() {
        return [...this.externalTestViews.keys(), ...this._views];
    }
    /**
     * Indicates whether this instance was destroyed.
     */
    get destroyed() {
        return this._destroyed;
    }
    /**
     * Get a list of component types registered to this application.
     * This list is populated even before the component is created.
     */
    componentTypes = [];
    /**
     * Get a list of components registered to this application.
     */
    components = [];
    /**
     * Returns an Observable that indicates when the application is stable or unstable.
     */
    isStable = inject(PendingTasksInternal).hasPendingTasks.pipe(map((pending) => !pending));
    constructor() {
        // Inject the tracing service to initialize it.
        inject(TracingService, { optional: true });
    }
    /**
     * @returns A promise that resolves when the application becomes stable
     */
    whenStable() {
        let subscription;
        return new Promise((resolve) => {
            subscription = this.isStable.subscribe({
                next: (stable) => {
                    if (stable) {
                        resolve();
                    }
                },
            });
        }).finally(() => {
            subscription.unsubscribe();
        });
    }
    _injector = inject(EnvironmentInjector);
    _rendererFactory = null;
    /**
     * The `EnvironmentInjector` used to create this application.
     */
    get injector() {
        return this._injector;
    }
    /**
     * Bootstrap a component onto the element identified by its selector or, optionally, to a
     * specified element.
     *
     * @usageNotes
     * ### Bootstrap process
     *
     * When bootstrapping a component, Angular mounts it onto a target DOM element
     * and kicks off automatic change detection. The target DOM element can be
     * provided using the `rootSelectorOrNode` argument.
     *
     * If the target DOM element is not provided, Angular tries to find one on a page
     * using the `selector` of the component that is being bootstrapped
     * (first matched element is used).
     *
     * ### Example
     *
     * Generally, we define the component to bootstrap in the `bootstrap` array of `NgModule`,
     * but it requires us to know the component while writing the application code.
     *
     * Imagine a situation where we have to wait for an API call to decide about the component to
     * bootstrap. We can use the `ngDoBootstrap` hook of the `NgModule` and call this method to
     * dynamically bootstrap a component.
     *
     * {@example core/ts/platform/platform.ts region='componentSelector'}
     *
     * Optionally, a component can be mounted onto a DOM element that does not match the
     * selector of the bootstrapped component.
     *
     * In the following example, we are providing a CSS selector to match the target element.
     *
     * {@example core/ts/platform/platform.ts region='cssSelector'}
     *
     * While in this example, we are providing reference to a DOM node.
     *
     * {@example core/ts/platform/platform.ts region='domNode'}
     */
    bootstrap(componentOrFactory, rootSelectorOrNode) {
        return this.bootstrapImpl(componentOrFactory, rootSelectorOrNode);
    }
    bootstrapImpl(componentOrFactory, rootSelectorOrNode, injector = Injector.NULL) {
        profiler(10 /* ProfilerEvent.BootstrapComponentStart */);
        (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);
        const isComponentFactory = componentOrFactory instanceof ComponentFactory$1;
        const initStatus = this._injector.get(ApplicationInitStatus);
        if (!initStatus.done) {
            let errorMessage = '';
            if (typeof ngDevMode === 'undefined' || ngDevMode) {
                const standalone = !isComponentFactory && isStandalone(componentOrFactory);
                errorMessage =
                    'Cannot bootstrap as there are still asynchronous initializers running.' +
                        (standalone
                            ? ''
                            : ' Bootstrap components in the `ngDoBootstrap` method of the root module.');
            }
            throw new RuntimeError(405 /* RuntimeErrorCode.ASYNC_INITIALIZERS_STILL_RUNNING */, errorMessage);
        }
        let componentFactory;
        if (isComponentFactory) {
            componentFactory = componentOrFactory;
        }
        else {
            const resolver = this._injector.get(ComponentFactoryResolver$1);
            componentFactory = resolver.resolveComponentFactory(componentOrFactory);
        }
        this.componentTypes.push(componentFactory.componentType);
        // Create a factory associated with the current module if it's not bound to some other
        const ngModule = isBoundToModule(componentFactory)
            ? undefined
            : this._injector.get(NgModuleRef$1);
        const selectorOrNode = rootSelectorOrNode || componentFactory.selector;
        const compRef = componentFactory.create(injector, [], selectorOrNode, ngModule);
        const nativeElement = compRef.location.nativeElement;
        const testability = compRef.injector.get(TESTABILITY, null);
        testability?.registerApplication(nativeElement);
        compRef.onDestroy(() => {
            this.detachView(compRef.hostView);
            remove(this.components, compRef);
            testability?.unregisterApplication(nativeElement);
        });
        this._loadComponent(compRef);
        if (typeof ngDevMode === 'undefined' || ngDevMode) {
            const _console = this._injector.get(Console);
            _console.log(`Angular is running in development mode.`);
        }
        profiler(11 /* ProfilerEvent.BootstrapComponentEnd */, compRef);
        return compRef;
    }
    /**
     * Invoke this method to explicitly process change detection and its side-effects.
     *
     * In development mode, `tick()` also performs a second change detection cycle to ensure that no
     * further changes are detected. If additional changes are picked up during this second cycle,
     * bindings in the app have side-effects that cannot be resolved in a single change detection
     * pass.
     * In this case, Angular throws an error, since an Angular application can only have one change
     * detection pass during which all change detection must complete.
     */
    tick() {
        if (!this.zonelessEnabled) {
            this.dirtyFlags |= 1 /* ApplicationRefDirtyFlags.ViewTreeGlobal */;
        }
        this._tick();
    }
    /** @internal */
    _tick() {
        profiler(12 /* ProfilerEvent.ChangeDetectionStart */);
        if (this.tracingSnapshot !== null) {
            // Ensure we always run `tickImpl()` in the context of the most recent snapshot,
            // if one exists. Snapshots may be reference counted by the implementation so
            // we want to ensure that if we request a snapshot that we use it.
            this.tracingSnapshot.run(TracingAction.CHANGE_DETECTION, this.tickImpl);
        }
        else {
            this.tickImpl();
        }
    }
    tickImpl = () => {
        (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);
        if (this._runningTick) {
            throw new RuntimeError(101 /* RuntimeErrorCode.RECURSIVE_APPLICATION_REF_TICK */, ngDevMode && 'ApplicationRef.tick is called recursively');
        }
        const prevConsumer = setActiveConsumer$1(null);
        try {
            this._runningTick = true;
            this.synchronize();
            if (typeof ngDevMode === 'undefined' || ngDevMode) {
                for (let view of this.allViews) {
                    view.checkNoChanges();
                }
            }
        }
        catch (e) {
            // Attention: Don't rethrow as it could cancel subscriptions to Observables!
            this.internalErrorHandler(e);
        }
        finally {
            this._runningTick = false;
            this.tracingSnapshot?.dispose();
            this.tracingSnapshot = null;
            setActiveConsumer$1(prevConsumer);
            this.afterTick.next();
            profiler(13 /* ProfilerEvent.ChangeDetectionEnd */);
        }
    };
    /**
     * Performs the core work of synchronizing the application state with the UI, resolving any
     * pending dirtiness (potentially in a loop).
     */
    synchronize() {
        if (this._rendererFactory === null && !this._injector.destroyed) {
            this._rendererFactory = this._injector.get(RendererFactory2, null, { optional: true });
        }
        let runs = 0;
        while (this.dirtyFlags !== 0 /* ApplicationRefDirtyFlags.None */ && runs++ < MAXIMUM_REFRESH_RERUNS) {
            profiler(14 /* ProfilerEvent.ChangeDetectionSyncStart */);
            this.synchronizeOnce();
            profiler(15 /* ProfilerEvent.ChangeDetectionSyncEnd */);
        }
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && runs >= MAXIMUM_REFRESH_RERUNS) {
            throw new RuntimeError(103 /* RuntimeErrorCode.INFINITE_CHANGE_DETECTION */, ngDevMode &&
                'Infinite change detection while refreshing application views. ' +
                    'Ensure views are not calling `markForCheck` on every template execution or ' +
                    'that afterRender hooks always mark views for check.');
        }
    }
    /**
     * Perform a single synchronization pass.
     */
    synchronizeOnce() {
        // First, process any dirty root effects.
        if (this.dirtyFlags & 16 /* ApplicationRefDirtyFlags.RootEffects */) {
            this.dirtyFlags &= -17 /* ApplicationRefDirtyFlags.RootEffects */;
            this.rootEffectScheduler.flush();
        }
        // First check dirty views, if there are any.
        if (this.dirtyFlags & 7 /* ApplicationRefDirtyFlags.ViewTreeAny */) {
            // Change detection on views starts in targeted mode (only check components if they're
            // marked as dirty) unless global checking is specifically requested via APIs like
            // `ApplicationRef.tick()` and the `NgZone` integration.
            const useGlobalCheck = Boolean(this.dirtyFlags & 1 /* ApplicationRefDirtyFlags.ViewTreeGlobal */);
            // Clear the view-related dirty flags.
            this.dirtyFlags &= -8 /* ApplicationRefDirtyFlags.ViewTreeAny */;
            // Set the AfterRender bit, as we're checking views and will need to run afterRender hooks.
            this.dirtyFlags |= 8 /* ApplicationRefDirtyFlags.AfterRender */;
            // Check all potentially dirty views.
            for (let { _lView, notifyErrorHandler } of this.allViews) {
                detectChangesInViewIfRequired(_lView, notifyErrorHandler, useGlobalCheck, this.zonelessEnabled);
            }
            // If `markForCheck()` was called during view checking, it will have set the `ViewTreeCheck`
            // flag. We clear the flag here because, for backwards compatibility, `markForCheck()`
            // during view checking doesn't cause the view to be re-checked.
            this.dirtyFlags &= -5 /* ApplicationRefDirtyFlags.ViewTreeCheck */;
            // Check if any views are still dirty after checking and we need to loop back.
            this.syncDirtyFlagsWithViews();
            if (this.dirtyFlags &
                (7 /* ApplicationRefDirtyFlags.ViewTreeAny */ | 16 /* ApplicationRefDirtyFlags.RootEffects */)) {
                // If any views or effects are still dirty after checking, loop back before running render
                // hooks.
                return;
            }
        }
        else {
            // If we skipped refreshing views above, there might still be unflushed animations
            // because we never called `detectChangesInternal` on the views.
            this._rendererFactory?.begin?.();
            this._rendererFactory?.end?.();
        }
        // Even if there were no dirty views, afterRender hooks might still be dirty.
        if (this.dirtyFlags & 8 /* ApplicationRefDirtyFlags.AfterRender */) {
            this.dirtyFlags &= -9 /* ApplicationRefDirtyFlags.AfterRender */;
            this.afterRenderManager.execute();
            // afterRender hooks might influence dirty flags.
        }
        this.syncDirtyFlagsWithViews();
    }
    /**
     * Checks `allViews` for views which require refresh/traversal, and updates `dirtyFlags`
     * accordingly, with two potential behaviors:
     *
     * 1. If any of our views require updating, then this adds the `ViewTreeTraversal` dirty flag.
     *    This _should_ be a no-op, since the scheduler should've added the flag at the same time the
     *    view was marked as needing updating.
     *
     *    TODO(alxhub): figure out if this behavior is still needed for edge cases.
     *
     * 2. If none of our views require updating, then clear the view-related `dirtyFlag`s. This
     *    happens when the scheduler is notified of a view becoming dirty, but the view itself isn't
     *    reachable through traversal from our roots (e.g. it's detached from the CD tree).
     */
    syncDirtyFlagsWithViews() {
        if (this.allViews.some(({ _lView }) => requiresRefreshOrTraversal(_lView))) {
            // If after running all afterRender callbacks new views are dirty, ensure we loop back.
            this.dirtyFlags |= 2 /* ApplicationRefDirtyFlags.ViewTreeTraversal */;
            return;
        }
        else {
            // Even though this flag may be set, none of _our_ views require traversal, and so the
            // `ApplicationRef` doesn't require any repeated checking.
            this.dirtyFlags &= -8 /* ApplicationRefDirtyFlags.ViewTreeAny */;
        }
    }
    /**
     * Attaches a view so that it will be dirty checked.
     * The view will be automatically detached when it is destroyed.
     * This will throw if the view is already attached to a ViewContainer.
     */
    attachView(viewRef) {
        (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);
        const view = viewRef;
        this._views.push(view);
        view.attachToAppRef(this);
    }
    /**
     * Detaches a view from dirty checking again.
     */
    detachView(viewRef) {
        (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);
        const view = viewRef;
        remove(this._views, view);
        view.detachFromAppRef();
    }
    _loadComponent(componentRef) {
        this.attachView(componentRef.hostView);
        this.tick();
        this.components.push(componentRef);
        // Get the listeners lazily to prevent DI cycles.
        const listeners = this._injector.get(APP_BOOTSTRAP_LISTENER, []);
        if (ngDevMode && !Array.isArray(listeners)) {
            throw new RuntimeError(-209 /* RuntimeErrorCode.INVALID_MULTI_PROVIDER */, 'Unexpected type of the `APP_BOOTSTRAP_LISTENER` token value ' +
                `(expected an array, but got ${typeof listeners}). ` +
                'Please check that the `APP_BOOTSTRAP_LISTENER` token is configured as a ' +
                '`multi: true` provider.');
        }
        listeners.forEach((listener) => listener(componentRef));
    }
    /** @internal */
    ngOnDestroy() {
        if (this._destroyed)
            return;
        try {
            // Call all the lifecycle hooks.
            this._destroyListeners.forEach((listener) => listener());
            // Destroy all registered views.
            this._views.slice().forEach((view) => view.destroy());
        }
        finally {
            // Indicate that this instance is destroyed.
            this._destroyed = true;
            // Release all references.
            this._views = [];
            this._destroyListeners = [];
        }
    }
    /**
     * Registers a listener to be called when an instance is destroyed.
     *
     * @param callback A callback function to add as a listener.
     * @returns A function which unregisters a listener.
     */
    onDestroy(callback) {
        (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);
        this._destroyListeners.push(callback);
        return () => remove(this._destroyListeners, callback);
    }
    /**
     * Destroys an Angular application represented by this `ApplicationRef`. Calling this function
     * will destroy the associated environment injectors as well as all the bootstrapped components
     * with their views.
     */
    destroy() {
        if (this._destroyed) {
            throw new RuntimeError(406 /* RuntimeErrorCode.APPLICATION_REF_ALREADY_DESTROYED */, ngDevMode && 'This instance of the `ApplicationRef` has already been destroyed.');
        }
        const injector = this._injector;
        // Check that this injector instance supports destroy operation.
        if (injector.dest   roy && !injector.destroyed) {
            // Destroying an underlying injector will trigger the `ngOnDestroy` lifecycle
            // hook, which invokes the remaining cleanup actions.
            injector.destroy();
        }
    }
    /**
     * Returns the number of attached views.
     */
    get viewCount() {
        return this._views.length;
    }
    static ɵfac = function ApplicationRef_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ApplicationRef)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: ApplicationRef, factory: ApplicationRef.ɵfac, providedIn: 'root' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ApplicationRef, [{
        type: Injectable,
        args: [{ providedIn: 'root' }]
    }], () => [], null); })();
function warnIfDestroyed(destroyed) {
    if (destroyed) {
        console.warn(formatRuntimeError(406 /* RuntimeErrorCode.APPLICATION_REF_ALREADY_DESTROYED */, 'This instance of the `ApplicationRef` has already been destroyed.'));
    }
}
function remove(list, el) {
    const index = list.indexOf(el);
    if (index > -1) {
        list.splice(index, 1);
    }
}
function detectChangesInViewIfRequired(lView, notifyErrorHandler, isFirstPass, zonelessEnabled) {
    // When re-checking, only check views which actually need it.
    if (!isFirstPass && !requiresRefreshOrTraversal(lView)) {
        return;
    }
    const mode = isFirstPass && !zonelessEnabled
        ? // The first pass is always in Global mode, which includes `CheckAlways` views.
            0 /* ChangeDetectionMode.Global */
        : // Only refresh views with the `RefreshView` flag or views is a changed signal
            1 /* ChangeDetectionMode.Targeted */;
    detectChangesInternal(lView, notifyErrorHandler, mode);
}

/**
 * Schedules triggering of a defer block for `on idle` and `on timer` conditions.
 */
function scheduleDelayedTrigger(scheduleFn) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    renderPlaceholder(lView, tNode);
    // Exit early to avoid invoking `scheduleFn`, which would
    // add `setTimeout` call and potentially delay serialization
    // on the server unnecessarily.
    if (!shouldTriggerDeferBlock(0 /* TriggerType.Regular */, lView))
        return;
    const injector = lView[INJECTOR];
    const lDetails = getLDeferBlockDetails(lView, tNode);
    const cleanupFn = scheduleFn(() => triggerDeferBlock(0 /* TriggerType.Regular */, lView, tNode), injector);
    storeTriggerCleanupFn(0 /* TriggerType.Regular */, lDetails, cleanupFn);
}
/**
 * Schedules prefetching for `on idle` and `on timer` triggers.
 *
 * @param scheduleFn A function that does the scheduling.
 */
function scheduleDelayedPrefetching(scheduleFn, trigger) {
    if (typeof ngServerMode !== 'undefined' && ngServerMode)
        return;
    const lView = getLView();
    const injector = lView[INJECTOR];
    // Only trigger the scheduled trigger on the browser
    // since we don't want to delay the server response.
    const tNode = getCurrentTNode();
    const tView = lView[TVIEW];
    const tDetails = getTDeferBlockDetails(tView, tNode);
    if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
        const lDetails = getLDeferBlockDetails(lView, tNode);
        const prefetch = () => triggerPrefetching(tDetails, lView, tNode);
        const cleanupFn = scheduleFn(prefetch, injector);
        storeTriggerCleanupFn(1 /* TriggerType.Prefetch */, lDetails, cleanupFn);
    }
}
/**
 * Schedules hydration triggering of a defer block for `on idle` and `on timer` conditions.
 */
function scheduleDelayedHydrating(scheduleFn, lView, tNode) {
    if (typeof ngServerMode !== 'undefined' && ngServerMode)
        return;
    // Only trigger the scheduled trigger on the browser
    // since we don't want to delay the server response.
    const injector = lView[INJECTOR];
    const lDetails = getLDeferBlockDetails(lView, tNode);
    const ssrUniqueId = lDetails[SSR_UNIQUE_ID];
    ngDevMode && assertSsrIdDefined(ssrUniqueId);
    const cleanupFn = scheduleFn(() => triggerHydrationFromBlockName(injector, ssrUniqueId), injector);
    storeTriggerCleanupFn(2 /* TriggerType.Hydrate */, lDetails, cleanupFn);
}
/**
 * Trigger prefetching of dependencies for a defer block.
 *
 * @param tDetails Static information about this defer block.
 * @param lView LView of a host view.
 * @param tNode TNode that represents a defer block.
 */
function triggerPrefetching(tDetails, lView, tNode) {
    triggerResourceLoading(tDetails, lView, tNode);
}
/**
 * Trigger loading of defer block dependencies if the process hasn't started yet.
 *
 * @param tDetails Static information about this defer block.
 * @param lView LView of a host view.
 */
function triggerResourceLoading(tDetails, lView, tNode) {
    const injector = lView[INJECTOR];
    const tView = lView[TVIEW];
    if (tDetails.loadingState !== DeferDependenciesLoadingState.NOT_STARTED) {
        // If the loading status is different from initial one, it means that
        // the loading of dependencies is in progress and there is nothing to do
        // in this function. All details can be obtained from the `tDetails` object.
        return tDetails.loadingPromise ?? Promise.resolve();
    }
    const lDetails = getLDeferBlockDetails(lView, tNode);
    const primaryBlockTNode = getPrimaryBlockTNode(tView, tDetails);
    // Switch from NOT_STARTED -> IN_PROGRESS state.
    tDetails.loadingState = DeferDependenciesLoadingState.IN_PROGRESS;
    // Prefetching is triggered, cleanup all registered prefetch triggers.
    invokeTriggerCleanupFns(1 /* TriggerType.Prefetch */, lDetails);
    let dependenciesFn = tDetails.dependencyResolverFn;
    if (ngDevMode) {
        // Check if dependency function interceptor is configured.
        const deferDependencyInterceptor = injector.get(DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, null, {
            optional: true,
        });
        if (deferDependencyInterceptor) {
            dependenciesFn = deferDependencyInterceptor.intercept(dependenciesFn);
        }
    }
    // Indicate that an application is not stable and has a pending task.
    const removeTask = injector.get(PendingTasks).add();
    // The `dependenciesFn` might be `null` when all dependencies within
    // a given defer block were eagerly referenced elsewhere in a file,
    // thus no dynamic `import()`s were produced.
    if (!dependenciesFn) {
        tDetails.loadingPromise = Promise.resolve().then(() => {
            tDetails.loadingPromise = null;
            tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;
            removeTask();
        });
        return tDetails.loadingPromise;
    }
    // Start downloading of defer block dependencies.
    tDetails.loadingPromise = Promise.allSettled(dependenciesFn()).then((results) => {
        let failed = false;
        const directiveDefs = [];
        const pipeDefs = [];
        for (const result of results) {
            if (result.status === 'fulfilled') {
                const dependency = result.value;
                const directiveDef = getComponentDef(dependency) || getDirectiveDef(dependency);
                if (directiveDef) {
                    directiveDefs.push(directiveDef);
                }
                else {
                    const pipeDef = getPipeDef$1(dependency);
                    if (pipeDef) {
                        pipeDefs.push(pipeDef);
                    }
                }
            }
            else {
                failed = true;
                break;
            }
        }
        if (failed) {
            tDetails.loadingState = DeferDependenciesLoadingState.FAILED;
            if (tDetails.errorTmplIndex === null) {
                const templateLocation = ngDevMode ? getTemplateLocationDetails(lView) : '';
                const error = new RuntimeError(-750 /* RuntimeErrorCode.DEFER_LOADING_FAILED */, ngDevMode &&
                    'Loading dependencies for `@defer` block failed, ' +
                        `but no \`@error\` block was configured${templateLocation}. ` +
                        'Consider using the `@error` block to render an error state.');
                handleError$1(lView, error);
            }
        }
        else {
            tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;
            // Update directive and pipe registries to add newly downloaded dependencies.
            const primaryBlockTView = primaryBlockTNode.tView;
            if (directiveDefs.length > 0) {
                primaryBlockTView.directiveRegistry = addDepsToRegistry(primaryBlockTView.directiveRegistry, directiveDefs);
                // Extract providers from all NgModules imported by standalone components
                // used within this defer block.
                const directiveTypes = directiveDefs.map((def) => def.type);
                const providers = internalImportProvidersFrom(false, ...directiveTypes);
                tDetails.providers = providers;
            }
            if (pipeDefs.length > 0) {
                primaryBlockTView.pipeRegistry = addDepsToRegistry(primaryBlockTView.pipeRegistry, pipeDefs);
            }
        }
    });
    return tDetails.loadingPromise.finally(() => {
        // Loading is completed, we no longer need the loading Promise
        // and a pending task should also be removed.
        tDetails.loadingPromise = null;
        removeTask();
    });
}
/**
 * Defines whether we should proceed with triggering a given defer block.
 */
function shouldTriggerDeferBlock(triggerType, lView) {
    // prevents triggering regular triggers when on the server.
    if (triggerType === 0 /* TriggerType.Regular */ && typeof ngServerMode !== 'undefined' && ngServerMode) {
        return false;
    }
    // prevents triggering in the case of a test run with manual defer block configuration.
    const injector = lView[INJECTOR];
    const config = injector.get(DEFER_BLOCK_CONFIG, null, { optional: true });
    if (config?.behavior === DeferBlockBehavior.Manual) {
        return false;
    }
    return true;
}
/**
 * Attempts to trigger loading of defer block dependencies.
 * If the block is already in a loading, completed or an error state -
 * no additional actions are taken.
 */
function triggerDeferBlock(triggerType, lView, tNode) {
    const tView = lView[TVIEW];
    const lContainer = lView[tNode.index];
    ngDevMode && assertLContainer(lContainer);
    if (!shouldTriggerDeferBlock(triggerType, lView))
        return;
    const lDetails = getLDeferBlockDetails(lView, tNode);
    const tDetails = getTDeferBlockDetails(tView, tNode);
    // Defer block is triggered, cleanup all registered trigger functions.
    invokeAllTriggerCleanupFns(lDetails);
    switch (tDetails.loadingState) {
        case DeferDependenciesLoadingState.NOT_STARTED:
            renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer);
            triggerResourceLoading(tDetails, lView, tNode);
            // The `loadingState` might have changed to "loading".
            if (tDetails.loadingState ===
                DeferDependenciesLoadingState.IN_PROGRESS) {
                renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer);
            }
            break;
        case DeferDependenciesLoadingState.IN_PROGRESS:
            renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer);
            renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer);
            break;
        case DeferDependenciesLoadingState.COMPLETE:
            ngDevMode && assertDeferredDependenciesLoaded(tDetails);
            renderDeferBlockState(DeferBlockState.Complete, tNode, lContainer);
            break;
        case DeferDependenciesLoadingState.FAILED:
            renderDeferBlockState(DeferBlockState.Error, tNode, lContainer);
            break;
        default:
            if (ngDevMode) {
                throwError('Unknown defer block state');
            }
    }
}
/**
 * The core mechanism for incremental hydration. This triggers or
 * queues hydration for all the blocks in the tree that need to be hydrated
 * and keeps track of all those blocks that were hydrated along the way.
 *
 * Note: the `replayQueuedEventsFn` is only provided when hydration is invoked
 * as a result of an event replay (via JsAction). When hydration is invoked from
 * an instruction set (e.g. `deferOnImmediate`) - there is no need to replay any
 * events.
 */
async function triggerHydrationFromBlockName(injector, blockName, replayQueuedEventsFn) {
    const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
    const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;
    // Make sure we don't hydrate/trigger the same thing multiple times
    if (blocksBeingHydrated.has(blockName)) {
        return;
    }
    // Trigger resource loading and hydration for the blocks in the queue in the order of highest block
    // to lowest block. Once a block has finished resource loading, after next render fires after hydration
    // finishes. The new block will have its defer instruction called and will be in the registry.
    // Due to timing related to potential nested control flow, this has to be scheduled after the next render.
    const { parentBlockPromise, hydrationQueue } = getParentBlockHydrationQueue(blockName, injector);
    if (hydrationQueue.length === 0)
        return;
    // It's possible that the hydrationQueue topmost item is actually in the process of hydrating and has
    // a promise already. In that case, we don't want to destroy that promise and queue it again.
    if (parentBlockPromise !== null) {
        hydrationQueue.shift();
    }
    // The hydrating map in the registry prevents re-triggering hydration for a block that's already in
    // the hydration queue. Here we generate promises for each of the blocks about to be hydrated
    populateHydratingStateForQueue(dehydratedBlockRegistry, hydrationQueue);
    // We await this after populating the hydration state so we can prevent re-triggering hydration for
    // the same blocks while this promise is being awaited.
    if (parentBlockPromise !== null) {
        await parentBlockPromise;
    }
    const topmostParentBlock = hydrationQueue[0];
    if (dehydratedBlockRegistry.has(topmostParentBlock)) {
        // the topmost parent block is already in the registry and we can proceed
        // with hydration.
        await triggerHydrationForBlockQueue(injector, hydrationQueue, replayQueuedEventsFn);
    }
    else {
        // the topmost parent block is not yet in the registry, which may mean
        // a lazy loaded route, a control flow branch was taken, a route has
        // been navigated, etc. So we need to queue up the hydration process
        // so that it can be finished after the top block has had its defer
        // instruction executed.
        dehydratedBlockRegistry.awaitParentBlock(topmostParentBlock, async () => await triggerHydrationForBlockQueue(injector, hydrationQueue, replayQueuedEventsFn));
    }
}
/**
 * The core mechanism for incremental hydration. This triggers
 * hydration for all the blocks in the tree that need to be hydrated
 * and keeps track of all those blocks that were hydrated along the way.
 *
 * Note: the `replayQueuedEventsFn` is only provided when hydration is invoked
 * as a result of an event replay (via JsAction). When hydration is invoked from
 * an instruction set (e.g. `deferOnImmediate`) - there is no need to replay any
 * events.
 */
async function triggerHydrationForBlockQueue(injector, hydrationQueue, replayQueuedEventsFn) {
    const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
    const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;
    // Indicate that we have some pending async work.
    const pendingTasks = injector.get(PendingTasksInternal);
    const taskId = pendingTasks.add();
    // Actually do the triggering and hydration of the queue of blocks
    for (let blockQueueIdx = 0; blockQueueIdx < hydrationQueue.length; blockQueueIdx++) {
        const dehydratedBlockId = hydrationQueue[blockQueueIdx];
        const dehydratedDeferBlock = dehydratedBlockRegistry.get(dehydratedBlockId);
        if (dehydratedDeferBlock != null) {
            // trigger the block resources and await next render for hydration. This should result
            // in the next block ɵɵdefer instruction being called and that block being added to the dehydrated registry.
            await triggerResourceLoadingForHydration(dehydratedDeferBlock);
            await nextRender(injector);
            // if the content has changed since server rendering, we need to check for the expected block
            // being in the registry or if errors occurred. In that case, we need to clean up the remaining expected
            // content that won't be rendered or fetched.
            if (deferBlockHasErrored(dehydratedDeferBlock)) {
                // Either the expected block has not yet had its ɵɵdefer instruction called or the block errored out when fetching
                // resources. In the former case, either we're hydrating too soon or the client and server differ. In both cases,
                // we need to clean up child content and promises.
                removeDehydratedViewList(dehydratedDeferBlock);
                cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);
                break;
            }
            // The defer block has not errored and we've finished fetching resources and rendering.
            // At this point it is safe to resolve the hydration promise.
            blocksBeingHydrated.get(dehydratedBlockId).resolve();
        }
        else {
            // The expected block has not yet had its ɵɵdefer instruction called. This is likely due to content changing between
            // client and server. We need to clean up the dehydrated DOM in the container since it no longer is valid.
            cleanupParentContainer(blockQueueIdx, hydrationQueue, dehydratedBlockRegistry);
            cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);
            break;
        }
    }
    const lastBlockName = hydrationQueue[hydrationQueue.length - 1];
    // Await hydration completion for the last block.
    await blocksBeingHydrated.get(lastBlockName)?.promise;
    // All async work is done, remove the taskId from the registry.
    pendingTasks.remove(taskId);
    // Replay any queued events, if any exist and the replay operation was requested.
    if (replayQueuedEventsFn) {
        replayQueuedEventsFn(hydrationQueue);
    }
    // Cleanup after hydration of all affected defer blocks.
    cleanupHydratedDeferBlocks(dehydratedBlockRegistry.get(lastBlockName), hydrationQueue, dehydratedBlockRegistry, injector.get(ApplicationRef));
}
function deferBlockHasErrored(deferBlock) {
    return (getLDeferBlockDetails(deferBlock.lView, deferBlock.tNode)[DEFER_BLOCK_STATE] ===
        DeferBlockState.Error);
}
/**
 * Clean up the parent container of a block where content changed between server and client.
 * The parent of a block going through `triggerHydrationFromBlockName` will contain the
 * dehydrated content that needs to be cleaned up. So we have to do the clean up from that location
 * in the tree.
 */
function cleanupParentContainer(currentBlockIdx, hydrationQueue, dehydratedBlockRegistry) {
    // If a parent block exists, it's in the hydration queue in front of the current block.
    const parentDeferBlockIdx = currentBlockIdx - 1;
    const parentDeferBlock = parentDeferBlockIdx > -1
        ? dehydratedBlockRegistry.get(hydrationQueue[parentDeferBlockIdx])
        : null;
    if (parentDeferBlock) {
        cleanupLContainer(parentDeferBlock.lContainer);
    }
}
function cleanupRemainingHydrationQueue(hydrationQueue, dehydratedBlockRegistry) {
    const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;
    for (const dehydratedBlockId in hydrationQueue) {
        blocksBeingHydrated.get(dehydratedBlockId)?.reject();
    }
    dehydratedBlockRegistry.cleanup(hydrationQueue);
}
/**
 * Generates a new promise for every defer block in the hydrating queue
 */
function populateHydratingStateForQueue(registry, queue) {
    for (let blockId of queue) {
        registry.hydrating.set(blockId, Promise.withResolvers());
    }
}
// Waits for the next render cycle to complete
function nextRender(injector) {
    return new Promise((resolveFn) => afterNextRender(resolveFn, { injector }));
}
async function triggerResourceLoadingForHydration(dehydratedBlock) {
    const { tNode, lView } = dehydratedBlock;
    const lDetails = getLDeferBlockDetails(lView, tNode);
    return new Promise((resolve) => {
        onDeferBlockCompletion(lDetails, resolve);
        triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
    });
}
/**
 * Registers cleanup functions for a defer block when the block has finished
 * fetching and rendering
 */
function onDeferBlockCompletion(lDetails, callback) {
    if (!Array.isArray(lDetails[ON_COMPLETE_FNS])) {
        lDetails[ON_COMPLETE_FNS] = [];
    }
    lDetails[ON_COMPLETE_FNS].push(callback);
}
/**
 * Determines whether specific trigger types should be attached during an instruction firing
 * to ensure the proper triggers for a given type are used.
 */
function shouldAttachTrigger(triggerType, lView, tNode) {
    if (triggerType === 0 /* TriggerType.Regular */) {
        return shouldAttachRegularTrigger(lView, tNode);
    }
    else if (triggerType === 2 /* TriggerType.Hydrate */) {
        return !shouldAttachRegularTrigger(lView, tNode);
    }
    // TriggerType.Prefetch is active only on the client
    return !(typeof ngServerMode !== 'undefined' && ngServerMode);
}
/**
 * Defines whether a regular trigger logic (e.g. "on viewport") should be attached
 * to a defer block. This function defines a condition, which mutually excludes
 * `deferOn*` and `deferHydrateOn*` triggers, to make sure only one of the trigger
 * types is active for a block with the current state.
 */
function shouldAttachRegularTrigger(lView, tNode) {
    const injector = lView[INJECTOR];
    const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);
    const incrementalHydrationEnabled = isIncrementalHydrationEnabled(injector);
    const hasHydrateTriggers = tDetails.flags !== null &&
        (tDetails.flags & 1 /* TDeferDetailsFlags.HasHydrateTriggers */) ===
            1 /* TDeferDetailsFlags.HasHydrateTriggers */;
    // On the server:
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        // Regular triggers are activated on the server when:
        //  - Either Incremental Hydration is *not* enabled
        //  - Or Incremental Hydration is enabled, but a given block doesn't have "hydrate" triggers
        return !incrementalHydrationEnabled || !hasHydrateTriggers;
    }
    // On the client:
    const lDetails = getLDeferBlockDetails(lView, tNode);
    const wasServerSideRendered = lDetails[SSR_UNIQUE_ID] !== null;
    if (hasHydrateTriggers && wasServerSideRendered && incrementalHydrationEnabled) {
        return false;
    }
    return true;
}
/**
 * Retrives a Defer Block's list of hydration triggers
 */
function getHydrateTriggers(tView, tNode) {
    const tDetails = getTDeferBlockDetails(tView, tNode);
    return (tDetails.hydrateTriggers ??= new Map());
}
/**
 * Loops through all defer block summaries and ensures all the blocks triggers are
 * properly initialized
 */
function processAndInitTriggers(injector, blockData, nodes) {
    const idleElements = [];
    const timerElements = [];
    const viewportElements = [];
    const immediateElements = [];
    for (let [blockId, blockSummary] of blockData) {
        const commentNode = nodes.get(blockId);
        if (commentNode !== undefined) {
            const numRootNodes = blockSummary.data[NUM_ROOT_NODES];
            let currentNode = commentNode;
            for (let i = 0; i < numRootNodes; i++) {
                currentNode = currentNode.previousSibling;
                if (currentNode.nodeType !== Node.ELEMENT_NODE) {
                    continue;
                }
                const elementTrigger = { el: currentNode, blockName: blockId };
                // hydrate
                if (blockSummary.hydrate.idle) {
                    idleElements.push(elementTrigger);
                }
                if (blockSummary.hydrate.immediate) {
                    immediateElements.push(elementTrigger);
                }
                if (blockSummary.hydrate.timer !== null) {
                    elementTrigger.delay = blockSummary.hydrate.timer;
                    timerElements.push(elementTrigger);
                }
                if (blockSummary.hydrate.viewport) {
                    viewportElements.push(elementTrigger);
                }
            }
        }
    }
    setIdleTriggers(injector, idleElements);
    setImmediateTriggers(injector, immediateElements);
    setViewportTriggers(injector, viewportElements);
    setTimerTriggers(injector, timerElements);
}
function setIdleTriggers(injector, elementTriggers) {
    for (const elementTrigger of elementTriggers) {
        const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
        const onInvoke = () => triggerHydrationFromBlockName(injector, elementTrigger.blockName);
        const cleanupFn = onIdle(onInvoke, injector);
        registry.addCleanupFn(elementTrigger.blockName, cleanupFn);
    }
}
function setViewportTriggers(injector, elementTriggers) {
    if (elementTriggers.length > 0) {
        const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
        for (let elementTrigger of elementTriggers) {
            const cleanupFn = onViewport(elementTrigger.el, () => triggerHydrationFromBlockName(injector, elementTrigger.blockName), injector);
            registry.addCleanupFn(elementTrigger.blockName, cleanupFn);
        }
    }
}
function setTimerTriggers(injector, elementTriggers) {
    for (const elementTrigger of elementTriggers) {
        const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
        const onInvoke = () => triggerHydrationFromBlockName(injector, elementTrigger.blockName);
        const timerFn = onTimer(elementTrigger.delay);
        const cleanupFn = timerFn(onInvoke, injector);
        registry.addCleanupFn(elementTrigger.blockName, cleanupFn);
    }
}
function setImmediateTriggers(injector, elementTriggers) {
    for (const elementTrigger of elementTriggers) {
        // Note: we intentionally avoid awaiting each call and instead kick off
        // the hydration process simultaneously for all defer blocks with this trigger;
        triggerHydrationFromBlockName(injector, elementTrigger.blockName);
    }
}

/**
 * Indicates whether we've already produced a warning,
 * prevents the logic from producing it multiple times.
 */
let _hmrWarningProduced = false;
/**
 * Logs a message into the console to indicate that `@defer` block
 * dependencies are loaded eagerly when the HMR mode is enabled.
 */
function logHmrWarning(injector) {
    if (!_hmrWarningProduced) {
        _hmrWarningProduced = true;
        const console = injector.get(Console);
        // tslint:disable-next-line:no-console
        console.log(formatRuntimeError(-751 /* RuntimeErrorCode.DEFER_IN_HMR_MODE */, 'Angular has detected that this application contains `@defer` blocks ' +
            'and the hot module replacement (HMR) mode is enabled. All `@defer` ' +
            'block dependencies will be loaded eagerly.'));
    }
}
/**
 * Creates runtime data structures for defer blocks.
 *
 * @param index Index of the `defer` instruction.
 * @param primaryTmplIndex Index of the template with the primary block content.
 * @param dependencyResolverFn Function that contains dependencies for this defer block.
 * @param loadingTmplIndex Index of the template with the loading block content.
 * @param placeholderTmplIndex Index of the template with the placeholder block content.
 * @param errorTmplIndex Index of the template with the error block content.
 * @param loadingConfigIndex Index in the constants array of the configuration of the loading.
 *     block.
 * @param placeholderConfigIndex Index in the constants array of the configuration of the
 *     placeholder block.
 * @param enableTimerScheduling Function that enables timer-related scheduling if `after`
 *     or `minimum` parameters are setup on the `@loading` or `@placeholder` blocks.
 * @param flags A set of flags to define a particular behavior (e.g. to indicate that
 *              hydrate triggers are present and regular triggers should be deactivated
 *              in certain scenarios).
 *
 * @codeGenApi
 */
function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplIndex, placeholderTmplIndex, errorTmplIndex, loadingConfigIndex, placeholderConfigIndex, enableTimerScheduling, flags) {
    const lView = getLView();
    const tView = getTView();
    const adjustedIndex = index + HEADER_OFFSET;
    const tNode = declareTemplate(lView, tView, index, null, 0, 0);
    const injector = lView[INJECTOR];
    if (tView.firstCreatePass) {
        performanceMarkFeature('NgDefer');
        if (ngDevMode && typeof ngHmrMode !== 'undefined' && ngHmrMode) {
            logHmrWarning(injector);
        }
        const tDetails = {
            primaryTmplIndex,
            loadingTmplIndex: loadingTmplIndex ?? null,
            placeholderTmplIndex: placeholderTmplIndex ?? null,
            errorTmplIndex: errorTmplIndex ?? null,
            placeholderBlockConfig: null,
            loadingBlockConfig: null,
            dependencyResolverFn: dependencyResolverFn ?? null,
            loadingState: DeferDependenciesLoadingState.NOT_STARTED,
            loadingPromise: null,
            providers: null,
            hydrateTriggers: null,
            debug: null,
            flags: flags ?? 0 /* TDeferDetailsFlags.Default */,
        };
        enableTimerScheduling?.(tView, tDetails, placeholderConfigIndex, loadingConfigIndex);
        setTDeferBlockDetails(tView, adjustedIndex, tDetails);
    }
    const lContainer = lView[adjustedIndex];
    // If hydration is enabled, looks up dehydrated views in the DOM
    // using hydration annotation info and stores those views on LContainer.
    // In client-only mode, this function is a noop.
    populateDehydratedViewsInLContainer(lContainer, tNode, lView);
    let ssrBlockState = null;
    let ssrUniqueId = null;
    if (lContainer[DEHYDRATED_VIEWS]?.length > 0) {
        const info = lContainer[DEHYDRATED_VIEWS][0].data;
        ssrUniqueId = info[DEFER_BLOCK_ID] ?? null;
        ssrBlockState = info[DEFER_BLOCK_STATE$1];
    }
    // Init instance-specific defer details and store it.
    const lDetails = [
        null, // NEXT_DEFER_BLOCK_STATE
        DeferBlockInternalState.Initial, // DEFER_BLOCK_STATE
        null, // STATE_IS_FROZEN_UNTIL
        null, // LOADING_AFTER_CLEANUP_FN
        null, // TRIGGER_CLEANUP_FNS
        null, // PREFETCH_TRIGGER_CLEANUP_FNS
        ssrUniqueId, // SSR_UNIQUE_ID
        ssrBlockState, // SSR_BLOCK_STATE
        null, // ON_COMPLETE_FNS
        null, // HYDRATE_TRIGGER_CLEANUP_FNS
    ];
    setLDeferBlockDetails(lView, adjustedIndex, lDetails);
    let registry = null;
    if (ssrUniqueId !== null) {
        ngDevMode && assertIncrementalHydrationIsConfigured(injector);
        // Store this defer block in the registry, to have an access to
        // internal data structures from hydration runtime code.
        registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
        registry.add(ssrUniqueId, { lView, tNode, lContainer });
    }
    const onLViewDestroy = () => {
        invokeAllTriggerCleanupFns(lDetails);
        if (ssrUniqueId !== null) {
            registry?.cleanup([ssrUniqueId]);
        }
    };
    // When defer block is triggered - unsubscribe from LView destroy cleanup.
    storeTriggerCleanupFn(0 /* TriggerType.Regular */, lDetails, () => removeLViewOnDestroy(lView, onLViewDestroy));
    storeLViewOnDestroy(lView, onLViewDestroy);
}
/**
 * Loads defer block dependencies when a trigger value becomes truthy.
 * @codeGenApi
 */
function ɵɵdeferWhen(rawValue) {
    const lView = getLView();
    const tNode = getSelectedTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'when <expression>');
    }
    if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
        return;
    const bindingIndex = nextBindingIndex();
    if (bindingUpdated(lView, bindingIndex, rawValue)) {
        const prevConsumer = setActiveConsumer$1(null);
        try {
            const value = Boolean(rawValue); // handle truthy or falsy values
            const lDetails = getLDeferBlockDetails(lView, tNode);
            const renderedState = lDetails[DEFER_BLOCK_STATE];
            if (value === false && renderedState === DeferBlockInternalState.Initial) {
                // If nothing is rendered yet, render a placeholder (if defined).
                renderPlaceholder(lView, tNode);
            }
            else if (value === true &&
                (renderedState === DeferBlockInternalState.Initial ||
                    renderedState === DeferBlockState.Placeholder)) {
                triggerDeferBlock(0 /* TriggerType.Regular */, lView, tNode);
            }
        }
        finally {
            setActiveConsumer$1(prevConsumer);
        }
    }
}
/**
 * Prefetches the deferred content when a value becomes truthy.
 * @codeGenApi
 */
function ɵɵdeferPrefetchWhen(rawValue) {
    const lView = getLView();
    const tNode = getSelectedTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'prefetch when <expression>');
    }
    if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
        return;
    const bindingIndex = nextBindingIndex();
    if (bindingUpdated(lView, bindingIndex, rawValue)) {
        const prevConsumer = setActiveConsumer$1(null);
        try {
            const value = Boolean(rawValue); // handle truthy or falsy values
            const tView = lView[TVIEW];
            const tNode = getSelectedTNode();
            const tDetails = getTDeferBlockDetails(tView, tNode);
            if (value === true && tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
                // If loading has not been started yet, trigger it now.
                triggerPrefetching(tDetails, lView, tNode);
            }
        }
        finally {
            setActiveConsumer$1(prevConsumer);
        }
    }
}
/**
 * Hydrates the deferred content when a value becomes truthy.
 * @codeGenApi
 */
function ɵɵdeferHydrateWhen(rawValue) {
    const lView = getLView();
    const tNode = getSelectedTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate when <expression>');
    }
    if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
        return;
    // TODO(incremental-hydration): audit all defer instructions to reduce unnecessary work by
    // moving function calls inside their relevant control flow blocks
    const bindingIndex = nextBindingIndex();
    const tView = getTView();
    const hydrateTriggers = getHydrateTriggers(tView, tNode);
    hydrateTriggers.set(6 /* DeferBlockTrigger.When */, null);
    if (bindingUpdated(lView, bindingIndex, rawValue)) {
        if (typeof ngServerMode !== 'undefined' && ngServerMode) {
            // We are on the server and SSR for defer blocks is enabled.
            triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
        }
        else {
            const injector = lView[INJECTOR];
            const prevConsumer = setActiveConsumer$1(null);
            try {
                const value = Boolean(rawValue); // handle truthy or falsy values
                if (value === true) {
                    // The `when` condition has changed to `true`, trigger defer block loading
                    // if the block is either in initial (nothing is rendered) or a placeholder
                    // state.
                    const lDetails = getLDeferBlockDetails(lView, tNode);
                    const ssrUniqueId = lDetails[SSR_UNIQUE_ID];
                    ngDevMode && assertSsrIdDefined(ssrUniqueId);
                    triggerHydrationFromBlockName(injector, ssrUniqueId);
                }
            }
            finally {
                setActiveConsumer$1(prevConsumer);
            }
        }
    }
}
/**
 * Specifies that hydration never occurs.
 * @codeGenApi
 */
function ɵɵdeferHydrateNever() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate never');
    }
    if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
        return;
    const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
    hydrateTriggers.set(7 /* DeferBlockTrigger.Never */, null);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        // We are on the server and SSR for defer blocks is enabled.
        triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
    }
}
/**
 * Sets up logic to handle the `on idle` deferred trigger.
 * @codeGenApi
 */
function ɵɵdeferOnIdle() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'on idle');
    }
    if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
        return;
    scheduleDelayedTrigger(onIdle);
}
/**
 * Sets up logic to handle the `prefetch on idle` deferred trigger.
 * @codeGenApi
 */
function ɵɵdeferPrefetchOnIdle() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'prefetch on idle');
    }
    if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
        return;
    scheduleDelayedPrefetching(onIdle);
}
/**
 * Sets up logic to handle the `on idle` deferred trigger.
 * @codeGenApi
 */
function ɵɵdeferHydrateOnIdle() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on idle');
    }
    if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
        return;
    const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
    hydrateTriggers.set(0 /* DeferBlockTrigger.Idle */, null);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        // We are on the server and SSR for defer blocks is enabled.
        triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
    }
    else {
        scheduleDelayedHydrating(onIdle, lView, tNode);
    }
}
/**
 * Sets up logic to handle the `on immediate` deferred trigger.
 * @codeGenApi
 */
function ɵɵdeferOnImmediate() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'on immediate');
    }
    if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
        return;
    // Render placeholder block only if loading template is not present and we're on
    // the client to avoid content flickering, since it would be immediately replaced
    // by the loading block.
    const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);
    if (tDetails.loadingTmplIndex === null) {
        renderPlaceholder(lView, tNode);
    }
    triggerDeferBlock(0 /* TriggerType.Regular */, lView, tNode);
}
/**
 * Sets up logic to handle the `prefetch on immediate` deferred trigger.
 * @codeGenApi
 */
function ɵɵdeferPrefetchOnImmediate() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'prefetch on immediate');
    }
    if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
        return;
    const tView = lView[TVIEW];
    const tDetails = getTDeferBlockDetails(tView, tNode);
    if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
        triggerResourceLoading(tDetails, lView, tNode);
    }
}
/**
 * Sets up logic to handle the `on immediate` hydrate trigger.
 * @codeGenApi
 */
function ɵɵdeferHydrateOnImmediate() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on immediate');
    }
    if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
        return;
    const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
    hydrateTriggers.set(1 /* DeferBlockTrigger.Immediate */, null);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
    }
    else {
        const injector = lView[INJECTOR];
        const lDetails = getLDeferBlockDetails(lView, tNode);
        const ssrUniqueId = lDetails[SSR_UNIQUE_ID];
        ngDevMode && assertSsrIdDefined(ssrUniqueId);
        triggerHydrationFromBlockName(injector, ssrUniqueId);
    }
}
/**
 * Creates runtime data structures for the `on timer` deferred trigger.
 * @param delay Amount of time to wait before loading the content.
 * @codeGenApi
 */
function ɵɵdeferOnTimer(delay) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `on timer(${delay}ms)`);
    }
    if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
        return;
    scheduleDelayedTrigger(onTimer(delay));
}
/**
 * Creates runtime data structures for the `prefetch on timer` deferred trigger.
 * @param delay Amount of time to wait before prefetching the content.
 * @codeGenApi
 */
function ɵɵdeferPrefetchOnTimer(delay) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on timer(${delay}ms)`);
    }
    if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
        return;
    scheduleDelayedPrefetching(onTimer(delay));
}
/**
 * Creates runtime data structures for the `on timer` hydrate trigger.
 * @param delay Amount of time to wait before loading the content.
 * @codeGenApi
 */
function ɵɵdeferHydrateOnTimer(delay) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `hydrate on timer(${delay}ms)`);
    }
    if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
        return;
    const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
    hydrateTriggers.set(5 /* DeferBlockTrigger.Timer */, { delay });
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        // We are on the server and SSR for defer blocks is enabled.
        triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
    }
    else {
        scheduleDelayedHydrating(onTimer(delay), lView, tNode);
    }
}
/**
 * Creates runtime data structures for the `on hover` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
function ɵɵdeferOnHover(triggerIndex, walkUpTimes) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `on hover${walkUpTimes === -1 ? '' : '(<target>)'}`);
    }
    if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
        return;
    renderPlaceholder(lView, tNode);
    // Avoid adding event listeners when this instruction is invoked on the server.
    if (!(typeof ngServerMode !== 'undefined' && ngServerMode)) {
        registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onHover, () => triggerDeferBlock(0 /* TriggerType.Regular */, lView, tNode), 0 /* TriggerType.Regular */);
    }
}
/**
 * Creates runtime data structures for the `prefetch on hover` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
function ɵɵdeferPrefetchOnHover(triggerIndex, walkUpTimes) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on hover${walkUpTimes === -1 ? '' : '(<target>)'}`);
    }
    if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
        return;
    const tView = lView[TVIEW];
    const tDetails = getTDeferBlockDetails(tView, tNode);
    if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
        registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onHover, () => triggerPrefetching(tDetails, lView, tNode), 1 /* TriggerType.Prefetch */);
    }
}
/**
 * Creates runtime data structures for the `on hover` hydrate trigger.
 * @codeGenApi
 */
function ɵɵdeferHydrateOnHover() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on hover');
    }
    if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
        return;
    const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
    hydrateTriggers.set(4 /* DeferBlockTrigger.Hover */, null);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        // We are on the server and SSR for defer blocks is enabled.
        triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
    }
    // The actual triggering of hydration on hover is handled by JSAction in
    // event_replay.ts.
}
/**
 * Creates runtime data structures for the `on interaction` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
function ɵɵdeferOnInteraction(triggerIndex, walkUpTimes) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `on interaction${walkUpTimes === -1 ? '' : '(<target>)'}`);
    }
    if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
        return;
    renderPlaceholder(lView, tNode);
    // Avoid adding event listeners when this instruction is invoked on the server.
    if (!(typeof ngServerMode !== 'undefined' && ngServerMode)) {
        registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onInteraction, () => triggerDeferBlock(0 /* TriggerType.Regular */, lView, tNode), 0 /* TriggerType.Regular */);
    }
}
/**
 * Creates runtime data structures for the `prefetch on interaction` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
function ɵɵdeferPrefetchOnInteraction(triggerIndex, walkUpTimes) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on interaction${walkUpTimes === -1 ? '' : '(<target>)'}`);
    }
    if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
        return;
    const tView = lView[TVIEW];
    const tDetails = getTDeferBlockDetails(tView, tNode);
    if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
        registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onInteraction, () => triggerPrefetching(tDetails, lView, tNode), 1 /* TriggerType.Prefetch */);
    }
}
/**
 * Creates runtime data structures for the `on interaction` hydrate trigger.
 * @codeGenApi
 */
function ɵɵdeferHydrateOnInteraction() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on interaction');
    }
    if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
        return;
    const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
    hydrateTriggers.set(3 /* DeferBlockTrigger.Interaction */, null);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        // We are on the server and SSR for defer blocks is enabled.
        triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
    }
    // The actual triggering of hydration on interaction is handled by JSAction in
    // event_replay.ts.
}
/**
 * Creates runtime data structures for the `on viewport` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
function ɵɵdeferOnViewport(triggerIndex, walkUpTimes) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `on viewport${walkUpTimes === -1 ? '' : '(<target>)'}`);
    }
    if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
        return;
    renderPlaceholder(lView, tNode);
    // Avoid adding event listeners when this instruction is invoked on the server.
    if (!(typeof ngServerMode !== 'undefined' && ngServerMode)) {
        registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewport, () => triggerDeferBlock(0 /* TriggerType.Regular */, lView, tNode), 0 /* TriggerType.Regular */);
    }
}
/**
 * Creates runtime data structures for the `prefetch on viewport` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
function ɵɵdeferPrefetchOnViewport(triggerIndex, walkUpTimes) {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on viewport${walkUpTimes === -1 ? '' : '(<target>)'}`);
    }
    if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
        return;
    const tView = lView[TVIEW];
    const tDetails = getTDeferBlockDetails(tView, tNode);
    if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
        registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewport, () => triggerPrefetching(tDetails, lView, tNode), 1 /* TriggerType.Prefetch */);
    }
}
/**
 * Creates runtime data structures for the `on viewport` hydrate trigger.
 * @codeGenApi
 */
function ɵɵdeferHydrateOnViewport() {
    const lView = getLView();
    const tNode = getCurrentTNode();
    if (ngDevMode) {
        trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on viewport');
    }
    if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
        return;
    const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
    hydrateTriggers.set(2 /* DeferBlockTrigger.Viewport */, null);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        // We are on the server and SSR for defer blocks is enabled.
        triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
    }
    // The actual triggering of hydration on viewport happens in triggering.ts,
    // since these instructions won't exist for dehydrated content.
}

/**
 * Updates the value of or removes a bound attribute on an Element.
 *
 * Used in the case of `[attr.title]="value"`
 *
 * @param name name The name of the attribute.
 * @param value value The attribute is removed when value is `null` or `undefined`.
 *                  Otherwise the attribute value is set to the stringified value.
 * @param sanitizer An optional function used to sanitize the value.
 * @param namespace Optional namespace to use when setting the attribute.
 *
 * @codeGenApi
 */
function ɵɵattribute(name, value, sanitizer, namespace) {
    const lView = getLView();
    const bindingIndex = nextBindingIndex();
    if (bindingUpdated(lView, bindingIndex, value)) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, name, value, sanitizer, namespace);
        ngDevMode && storePropertyBindingMetadata(tView.data, tNode, 'attr.' + name, bindingIndex);
    }
    return ɵɵattribute;
}

/**
 * Create interpolation bindings with a variable number of expressions.
 *
 * If there are 1 to 8 expressions `interpolation1()` to `interpolation8()` should be used instead.
 * Those are faster because there is no need to create an array of expressions and iterate over it.
 *
 * `values`:
 * - has static text at even indexes,
 * - has evaluated expressions at odd indexes.
 *
 * Returns the concatenated string when any of the arguments changes, `NO_CHANGE` otherwise.
 */
function interpolationV(lView, values) {
    ngDevMode && assertLessThan(2, values.length, 'should have at least 3 values');
    ngDevMode && assertEqual(values.length % 2, 1, 'should have an odd number of values');
    let isBindingUpdated = false;
    let bindingIndex = getBindingIndex();
    for (let i = 1; i < values.length; i += 2) {
        // Check if bindings (odd indexes) have changed
        isBindingUpdated = bindingUpdated(lView, bindingIndex++, values[i]) || isBindingUpdated;
    }
    setBindingIndex(bindingIndex);
    if (!isBindingUpdated) {
        return NO_CHANGE;
    }
    // Build the updated content
    let content = values[0];
    for (let i = 1; i < values.length; i += 2) {
        content += renderStringify(values[i]) + values[i + 1];
    }
    return content;
}
/**
 * Creates an interpolation binding with 1 expression.
 *
 * @param prefix static value used for concatenation only.
 * @param v0 value checked for change.
 * @param suffix static value used for concatenation only.
 */
function interpolation1(lView, prefix, v0, suffix) {
    const different = bindingUpdated(lView, nextBindingIndex(), v0);
    return different ? prefix + renderStringify(v0) + suffix : NO_CHANGE;
}
/**
 * Creates an interpolation binding with 2 expressions.
 */
function interpolation2(lView, prefix, v0, i0, v1, suffix) {
    const bindingIndex = getBindingIndex();
    const different = bindingUpdated2(lView, bindingIndex, v0, v1);
    incrementBindingIndex(2);
    return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + suffix : NO_CHANGE;
}
/**
 * Creates an interpolation binding with 3 expressions.
 */
function interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix) {
    const bindingIndex = getBindingIndex();
    const different = bindingUpdated3(lView, bindingIndex, v0, v1, v2);
    incrementBindingIndex(3);
    return different
        ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + suffix
        : NO_CHANGE;
}
/**
 * Create an interpolation binding with 4 expressions.
 */
function interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix) {
    const bindingIndex = getBindingIndex();
    const different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
    incrementBindingIndex(4);
    return different
        ? prefix +
            renderStringify(v0) +
            i0 +
            renderStringify(v1) +
            i1 +
            renderStringify(v2) +
            i2 +
            renderStringify(v3) +
            suffix
        : NO_CHANGE;
}
/**
 * Creates an interpolation binding with 5 expressions.
 */
function interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix) {
    const bindingIndex = getBindingIndex();
    let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
    different = bindingUpdated(lView, bindingIndex + 4, v4) || different;
    incrementBindingIndex(5);
    return different
        ? prefix +
            renderStringify(v0) +
            i0 +
            renderStringify(v1) +
            i1 +
            renderStringify(v2) +
            i2 +
            renderStringify(v3) +
            i3 +
            renderStringify(v4) +
            suffix
        : NO_CHANGE;
}
/**
 * Creates an interpolation binding with 6 expressions.
 */
function interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix) {
    const bindingIndex = getBindingIndex();
    let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
    different = bindingUpdated2(lView, bindingIndex + 4, v4, v5) || different;
    incrementBindingIndex(6);
    return different
        ? prefix +
            renderStringify(v0) +
            i0 +
            renderStringify(v1) +
            i1 +
            renderStringify(v2) +
            i2 +
            renderStringify(v3) +
            i3 +
            renderStringify(v4) +
            i4 +
            renderStringify(v5) +
            suffix
        : NO_CHANGE;
}
/**
 * Creates an interpolation binding with 7 expressions.
 */
function interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix) {
    const bindingIndex = getBindingIndex();
    let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
    different = bindingUpdated3(lView, bindingIndex + 4, v4, v5, v6) || different;
    incrementBindingIndex(7);
    return different
        ? prefix +
            renderStringify(v0) +
            i0 +
            renderStringify(v1) +
            i1 +
            renderStringify(v2) +
            i2 +
            renderStringify(v3) +
            i3 +
            renderStringify(v4) +
            i4 +
            renderStringify(v5) +
            i5 +
            renderStringify(v6) +
            suffix
        : NO_CHANGE;
}
/**
 * Creates an interpolation binding with 8 expressions.
 */
function interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix) {
    const bindingIndex = getBindingIndex();
    let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
    different = bindingUpdated4(lView, bindingIndex + 4, v4, v5, v6, v7) || different;
    incrementBindingIndex(8);
    return different
        ? prefix +
            renderStringify(v0) +
            i0 +
            renderStringify(v1) +
            i1 +
            renderStringify(v2) +
            i2 +
            renderStringify(v3) +
            i3 +
            renderStringify(v4) +
            i4 +
            renderStringify(v5) +
            i5 +
            renderStringify(v6) +
            i6 +
            renderStringify(v7) +
            suffix
        : NO_CHANGE;
}

/**
 *
 * Update an interpolated attribute on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate1('title', 'prefix', v0, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolate1(attrName, prefix, v0, suffix, sanitizer, namespace) {
    const lView = getLView();
    const interpolatedValue = interpolation1(lView, prefix, v0, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);
        ngDevMode &&
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - 1, prefix, suffix);
    }
    return ɵɵattributeInterpolate1;
}
/**
 *
 * Update an interpolated attribute on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate2('title', 'prefix', v0, '-', v1, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolate2(attrName, prefix, v0, i0, v1, suffix, sanitizer, namespace) {
    const lView = getLView();
    const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);
        ngDevMode &&
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - 2, prefix, i0, suffix);
    }
    return ɵɵattributeInterpolate2;
}
/**
 *
 * Update an interpolated attribute on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate3(
 * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolate3(attrName, prefix, v0, i0, v1, i1, v2, suffix, sanitizer, namespace) {
    const lView = getLView();
    const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);
        ngDevMode &&
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - 3, prefix, i0, i1, suffix);
    }
    return ɵɵattributeInterpolate3;
}
/**
 *
 * Update an interpolated attribute on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate4(
 * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolate4(attrName, prefix, v0, i0, v1, i1, v2, i2, v3, suffix, sanitizer, namespace) {
    const lView = getLView();
    const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);
        ngDevMode &&
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - 4, prefix, i0, i1, i2, suffix);
    }
    return ɵɵattributeInterpolate4;
}
/**
 *
 * Update an interpolated attribute on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate5(
 * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param    v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolate5(attrName, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix, sanitizer, namespace) {
    const lView = getLView();
    const interpolatedValue = interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);
        ngDevMode &&
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - 5, prefix, i0, i1, i2, i3, suffix);
    }
    return ɵɵattributeInterpolate5;
}
/**
 *
 * Update an interpolated attribute on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate6(
 *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolate6(attrName, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix, sanitizer, namespace) {
    const lView = getLView();
    const interpolatedValue = interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);
        ngDevMode &&
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - 6, prefix, i0, i1, i2, i3, i4, suffix);
    }
    return ɵɵattributeInterpolate6;
}
/**
 *
 * Update an interpolated attribute on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate7(
 *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolate7(attrName, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix, sanitizer, namespace) {
    const lView = getLView();
    const interpolatedValue = interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);
        ngDevMode &&
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - 7, prefix, i0, i1, i2, i3, i4, i5, suffix);
    }
    return ɵɵattributeInterpolate7;
}
/**
 *
 * Update an interpolated attribute on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate8(
 *  'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolate8(attrName, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix, sanitizer, namespace) {
    const lView = getLView();
    const interpolatedValue = interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);
        ngDevMode &&
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - 8, prefix, i0, i1, i2, i3, i4, i5, i6, suffix);
    }
    return ɵɵattributeInterpolate8;
}
/**
 * Update an interpolated attribute on an element with 9 or more bound values surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolateV(
 *  'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *
 * @param attrName The name of the attribute to update.
 * @param values The collection of values and the strings in-between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵattributeInterpolateV(attrName, values, sanitizer, namespace) {
    const lView = getLView();
    const interpolated = interpolationV(lView, values);
    if (interpolated !== NO_CHANGE) {
        const tNode = getSelectedTNode();
        elementAttributeInternal(tNode, lView, attrName, interpolated, sanitizer, namespace);
        if (ngDevMode) {
            const interpolationInBetween = [values[0]]; // prefix
            for (let i = 2; i < values.length; i += 2) {
                interpolationInBetween.push(values[i]);
            }
            storePropertyBindingMetadata(getTView().data, tNode, 'attr.' + attrName, getBindingIndex() - interpolationInBetween.length + 1, ...interpolationInBetween);
        }
    }
    return ɵɵattributeInterpolateV;
}

function toTStylingRange(prev, next) {
    ngDevMode && assertNumberInRange(prev, 0, 32767 /* StylingRange.UNSIGNED_MASK */);
    ngDevMode && assertNumberInRange(next, 0, 32767 /* StylingRange.UNSIGNED_MASK */);
    return ((prev << 17 /* StylingRange.PREV_SHIFT */) | (next << 2 /* StylingRange.NEXT_SHIFT */));
}
function getTStylingRangePrev(tStylingRange) {
    ngDevMode && assertNumber(tStylingRange, 'expected number');
    return (tStylingRange >> 17 /* StylingRange.PREV_SHIFT */) & 32767 /* StylingRange.UNSIGNED_MASK */;
}
function getTStylingRangePrevDuplicate(tStylingRange) {
    ngDevMode && assertNumber(tStylingRange, 'expected number');
    return (tStylingRange & 2 /* StylingRange.PREV_DUPLICATE */) == 2 /* StylingRange.PREV_DUPLICATE */;
}
function setTStylingRangePrev(tStylingRange, previous) {
    ngDevMode && assertNumber(tStylingRange, 'expected number');
    ngDevMode && assertNumberInRange(previous, 0, 32767 /* StylingRange.UNSIGNED_MASK */);
    return ((tStylingRange & 131071 /* StylingRange.PREV_MASK */) |
        (previous << 17 /* StylingRange.PREV_SHIFT */));
}
function setTStylingRangePrevDuplicate(tStylingRange) {
    ngDevMode && assertNumber(tStylingRange, 'expected number');
    return (tStylingRange | 2 /* StylingRange.PREV_DUPLICATE */);
}
function getTStylingRangeNext(tStylingRange) {
    ngDevMode && assertNumber(tStylingRange, 'expected number');
    return (tStylingRange & 131068 /* StylingRange.NEXT_MASK */) >> 2 /* StylingRange.NEXT_SHIFT */;
}
function setTStylingRangeNext(tStylingRange, next) {
    ngDevMode && assertNumber(tStylingRange, 'expected number');
    ngDevMode && assertNumberInRange(next, 0, 32767 /* StylingRange.UNSIGNED_MASK */);
    return ((tStylingRange & -131069 /* StylingRange.NEXT_MASK */) | //
        (next << 2 /* StylingRange.NEXT_SHIFT */));
}
function getTStylingRangeNextDuplicate(tStylingRange) {
    ngDevMode && assertNumber(tStylingRange, 'expected number');
    return (tStylingRange & 1 /* StylingRange.NEXT_DUPLICATE */) === 1 /* StylingRange.NEXT_DUPLICATE */;
}
function setTStylingRangeNextDuplicate(tStylingRange) {
    ngDevMode && assertNumber(tStylingRange, 'expected number');
    return (tStylingRange | 1 /* StylingRange.NEXT_DUPLICATE */);
}

/**
 * Insert new `tStyleValue` at `TData` and link existing style bindings such that we maintain linked
 * list of styles and compute the duplicate flag.
 *
 * Note: this function is executed during `firstUpdatePass` only to populate the `TView.data`.
 *
 * The function works by keeping track of `tStylingRange` which contains two pointers pointing to
 * the head/tail of the template portion of the styles.
 *  - if `isHost === false` (we are template) then insertion is at tail of `TStylingRange`
 *  - if `isHost === true` (we are host binding) then insertion is at head of `TStylingRange`
 *
 * @param tData The `TData` to insert into.
 * @param tNode `TNode` associated with the styling element.
 * @param tStylingKey See `TStylingKey`.
 * @param index location of where `tStyleValue` should be stored (and linked into list.)
 * @param isHostBinding `true` if the insertion is for a `hostBinding`. (insertion is in front of
 *               template.)
 * @param isClassBinding True if the associated `tStylingKey` as a `class` styling.
 *                       `tNode.classBindings` should be used (or `tNode.styleBindings` otherwise.)
 */
function insertTStylingBinding(tData, tNode, tStylingKeyWithStatic, index, isHostBinding, isClassBinding) {
    ngDevMode && assertFirstUpdatePass(getTView());
    let tBindings = isClassBinding ? tNode.classBindings : tNode.styleBindings;
    let tmplHead = getTStylingRangePrev(tBindings);
    let tmplTail = getTStylingRangeNext(tBindings);
    tData[index] = tStylingKeyWithStatic;
    let isKeyDuplicateOfStatic = false;
    let tStylingKey;
    if (Array.isArray(tStylingKeyWithStatic)) {
        // We are case when the `TStylingKey` contains static fields as well.
        const staticKeyValueArray = tStylingKeyWithStatic;
        tStylingKey = staticKeyValueArray[1]; // unwrap.
        // We need to check if our key is present in the static so that we can mark it as duplicate.
        if (tStylingKey === null ||
            keyValueArrayIndexOf(staticKeyValueArray, tStylingKey) > 0) {
            // tStylingKey is present in the statics, need to mark it as duplicate.
            isKeyDuplicateOfStatic = true;
        }
    }
    else {
        tStylingKey = tStylingKeyWithStatic;
    }
    if (isHostBinding) {
        // We are inserting host bindings
        // If we don't have template bindings then `tail` is 0.
        const hasTemplateBindings = tmplTail !== 0;
        // This is important to know because that means that the `head` can't point to the first
        // template bindings (there are none.) Instead the head points to the tail of the template.
        if (hasTemplateBindings) {
            // template head's "prev" will point to last host binding or to 0 if no host bindings yet
            const previousNode = getTStylingRangePrev(tData[tmplHead + 1]);
            tData[index + 1] = toTStylingRange(previousNode, tmplHead);
            // if a host binding has already been registered, we need to update the next of that host
            // binding to point to this one
            if (previousNode !== 0) {
                // We need to update the template-tail value to point to us.
                tData[previousNode + 1] = setTStylingRangeNext(tData[previousNode + 1], index);
            }
            // The "previous" of the template binding head should point to this host binding
            tData[tmplHead + 1] = setTStylingRangePrev(tData[tmplHead + 1], index);
        }
        else {
            tData[index + 1] = toTStylingRange(tmplHead, 0);
            // if a host binding has already been registered, we need to update the next of that host
            // binding to point to this one
            if (tmplHead !== 0) {
                // We need to update the template-tail value to point to us.
                tData[tmplHead + 1] = setTStylingRangeNext(tData[tmplHead + 1], index);
            }
            // if we don't have template, the head points to template-tail, and needs to be advanced.
            tmplHead = index;
        }
    }
    else {
        // We are inserting in template section.
        // We need to set this binding's "previous" to the current template tail
        tData[index + 1] = toTStylingRange(tmplTail, 0);
        ngDevMode &&
            assertEqual(tmplHead !== 0 && tmplTail === 0, false, 'Adding template bindings after hostBindings is not allowed.');
        if (tmplHead === 0) {
            tmplHead = index;
        }
        else {
            // We need to update the previous value "next" to point to this binding
            tData[tmplTail + 1] = setTStylingRangeNext(tData[tmplTail + 1], index);
        }
        tmplTail = index;
    }
    // Now we need to update / compute the duplicates.
    // Starting with our location search towards head (least priority)
    if (isKeyDuplicateOfStatic) {
        tData[index + 1] = setTStylingRangePrevDuplicate(tData[index + 1]);
    }
    markDuplicates(tData, tStylingKey, index, true);
    markDuplicates(tData, tStylingKey, index, false);
    markDuplicateOfResidualStyling(tNode, tStylingKey, tData, index, isClassBinding);
    tBindings = toTStylingRange(tmplHead, tmplTail);
    if (isClassBinding) {
        tNode.classBindings = tBindings;
    }
    else {
        tNode.styleBindings = tBindings;
    }
}
/**
 * Look into the residual styling to see if the current `tStylingKey` is duplicate of residual.
 *
 * @param tNode `TNode` where the residual is stored.
 * @param tStylingKey `TStylingKey` to store.
 * @param tData `TData` associated with the current `LView`.
 * @param index location of where `tStyleValue` should be stored (and linked into list.)
 * @param isClassBinding True if the associated `tStylingKey` as a `class` styling.
 *                       `tNode.classBindings` should be used (or `tNode.styleBindings` otherwise.)
 */
function markDuplicateOfResidualStyling(tNode, tStylingKey, tData, index, isClassBinding) {
    const residual = isClassBinding ? tNode.residualClasses : tNode.residualStyles;
    if (residual != null /* or undefined */ &&
        typeof tStylingKey == 'string' &&
        keyValueArrayIndexOf(residual, tStylingKey) >= 0) {
        // We have duplicate in the residual so mark ourselves as duplicate.
        tData[index + 1] = setTStylingRangeNextDuplicate(tData[index + 1]);
    }
}
/**
 * Marks `TStyleValue`s as duplicates if another style binding in the list has the same
 * `TStyleValue`.
 *
 * NOTE: this function is intended to be called twice once with `isPrevDir` set to `true` and once
 * with it set to `false` to search both the previous as well as next items in the list.
 *
 * No duplicate case
 * ```
 *   [style.color]
 *   [style.width.px] <<- index
 *   [style.height.px]
 * ```
 *
 * In the above case adding `[style.width.px]` to the existing `[style.color]` produces no
 * duplicates because `width` is not found in any other part of the linked list.
 *
 * Duplicate case
 * ```
 *   [style.color]
 *   [style.width.em]
 *   [style.width.px] <<- index
 * ```
 * In the above case adding `[style.width.px]` will produce a duplicate with `[style.width.em]`
 * because `width` is found in the chain.
 *
 * Map case 1
 * ```
 *   [style.width.px]
 *   [style.color]
 *   [style]  <<- index
 * ```
 * In the above case adding `[style]` will produce a duplicate with any other bindings because
 * `[style]` is a Map and as such is fully dynamic and could produce `color` or `width`.
 *
 * Map case 2
 * ```
 *   [style]
 *   [style.width.px]
 *   [style.color]  <<- index
 * ```
 * In the above case adding `[style.color]` will produce a duplicate because there is already a
 * `[style]` binding which is a Map and as such is fully dynamic and could produce `color` or
 * `width`.
 *
 * NOTE: Once `[style]` (Map) is added into the system all things are mapped as duplicates.
 * NOTE: We use `style` as example, but same logic is applied to `class`es as well.
 *
 * @param tData `TData` where the linked list is stored.
 * @param tStylingKey `TStylingKeyPrimitive` which contains the value to compare to other keys in
 *        the linked list.
 * @param index Starting location in the linked list to search from
 * @param isPrevDir Direction.
 *        - `true` for previous (lower priority);
 *        - `false` for next (higher priority).
 */
function markDuplicates(tData, tStylingKey, index, isPrevDir) {
    const tStylingAtIndex = tData[index + 1];
    const isMap = tStylingKey === null;
    let cursor = isPrevDir
        ? getTStylingRangePrev(tStylingAtIndex)
        : getTStylingRangeNext(tStylingAtIndex);
    let foundDuplicate = false;
    // We keep iterating as long as we have a cursor
    // AND either:
    // - we found what we are looking for, OR
    // - we are a map in which case we have to continue searching even after we find what we were
    //   looking for since we are a wild card and everything needs to be flipped to duplicate.
    while (cursor !== 0 && (foundDuplicate === false || isMap)) {
        ngDevMode && assertIndexInRange(tData, cursor);
        const tStylingValueAtCursor = tData[cursor];
        const tStyleRangeAtCursor = tData[cursor + 1];
        if (isStylingMatch(tStylingValueAtCursor, tStylingKey)) {
            foundDuplicate = true;
            tData[cursor + 1] = isPrevDir
                ? setTStylingRangeNextDuplicate(tStyleRangeAtCursor)
                : setTStylingRangePrevDuplicate(tStyleRangeAtCursor);
        }
        cursor = isPrevDir
            ? getTStylingRangePrev(tStyleRangeAtCursor)
            : getTStylingRangeNext(tStyleRangeAtCursor);
    }
    if (foundDuplicate) {
        // if we found a duplicate, than mark ourselves.
        tData[index + 1] = isPrevDir
            ? setTStylingRangePrevDuplicate(tStylingAtIndex)
            : setTStylingRangeNextDuplicate(tStylingAtIndex);
    }
}
/**
 * Determines if two `TStylingKey`s are a match.
 *
 * When computing whether a binding contains a duplicate, we need to compare if the instruction
 * `TStylingKey` has a match.
 *
 * Here are examples of `TStylingKey`s which match given `tStylingKeyCursor` is:
 * - `color`
 *    - `color`    // Match another color
 *    - `null`     // That means that `tStylingKey` is a `classMap`/`styleMap` instruction
 *    - `['', 'color', 'other', true]` // wrapped `color` so match
 *    - `['', null, 'other', true]`       // wrapped `null` so match
 *    - `['', 'width', 'color', 'value']` // wrapped static value contains a match on `'color'`
 * - `null`       // `tStylingKeyCursor` always match as it is `classMap`/`styleMap` instruction
 *
 * @param tStylingKeyCursor
 * @param tStylingKey
 */
function isStylingMatch(tStylingKeyCursor, tStylingKey) {
    ngDevMode &&
        assertNotEqual(Array.isArray(tStylingKey), true, "Expected that 'tStylingKey' has been unwrapped");
    if (tStylingKeyCursor === null || // If the cursor is `null` it means that we have map at that
        // location so we must assume that we have a match.
        tStylingKey == null || // If `tStylingKey` is `null` then it is a map therefor assume that it
        // contains a match.
        (Array.isArray(tStylingKeyCursor) ? tStylingKeyCursor[1] : tStylingKeyCursor) === tStylingKey // If the keys match explicitly than we are a match.
    ) {
        return true;
    }
    else if (Array.isArray(tStylingKeyCursor) && typeof tStylingKey === 'string') {
        // if we did not find a match, but `tStylingKeyCursor` is `KeyValueArray` that means cursor has
        // statics and we need to check those as well.
        return keyValueArrayIndexOf(tStylingKeyCursor, tStylingKey) >= 0; // see if we are matching the key
    }
    return false;
}

// Global state of the parser. (This makes parser non-reentrant, but that is not an issue)
const parserState = {
    textEnd: 0,
    key: 0,
    keyEnd: 0,
    value: 0,
    valueEnd: 0,
};
/**
 * Retrieves the last parsed `key` of style.
 * @param text the text to substring the key from.
 */
function getLastParsedKey(text) {
    return text.substring(parserState.key, parserState.keyEnd);
}
/**
 * Retrieves the last parsed `value` of style.
 * @param text the text to substring the key from.
 */
function getLastParsedValue(text) {
    return text.substring(parserState.value, parserState.valueEnd);
}
/**
 * Initializes `className` string for parsing and parses the first token.
 *
 * This function is intended to be used in this format:
 * ```ts
 * for (let i = parseClassName(text); i >= 0; i = parseClassNameNext(text, i)) {
 *   const key = getLastParsedKey();
 *   ...
 * }
 * ```
 * @param text `className` to parse
 * @returns index where the next invocation of `parseClassNameNext` should resume.
 */
function parseClassName(text) {
    resetParserState(text);
    return parseClassNameNext(text, consumeWhitespace(text, 0, parserState.textEnd));
}
/**
 * Parses next `className` token.
 *
 * This function is intended to be used in this format:
 * ```ts
 * for (let i = parseClassName(text); i >= 0; i = parseClassNameNext(text, i)) {
 *   const key = getLastParsedKey();
 *   ...
 * }
 * ```
 *
 * @param text `className` to parse
 * @param index where the parsing should resume.
 * @returns index where the next invocation of `parseClassNameNext` should resume.
 */
function parseClassNameNext(text, index) {
    const end = parserState.textEnd;
    if (end === index) {
        return -1;
    }
    index = parserState.keyEnd = consumeClassToken(text, (parserState.key = index), end);
    return consumeWhitespace(text, index, end);
}
/**
 * Initializes `cssText` string for parsing and parses the first key/values.
 *
 * This function is intended to be used in this format:
 * ```ts
 * for (let i = parseStyle(text); i >= 0; i = parseStyleNext(text, i))) {
 *   const key = getLastParsedKey();
 *   const value = getLastParsedValue();
 *   ...
 * }
 * ```
 * @param text `cssText` to parse
 * @returns index where the next invocation of `parseStyleNext` should resume.
 */
function parseStyle(text) {
    resetParserState(text);
    return parseStyleNext(text, consumeWhitespace(text, 0, parserState.textEnd));
}
/**
 * Parses the next `cssText` key/values.
 *
 * This function is intended to be used in this format:
 * ```ts
 * for (let i = parseStyle(text); i >= 0; i = parseStyleNext(text, i))) {
 *   const key = getLastParsedKey();
 *   const value = getLastParsedValue();
 *   ...
 * }
 *
 * @param text `cssText` to parse
 * @param index where the parsing should resume.
 * @returns index where the next invocation of `parseStyleNext` should resume.
 */
function parseStyleNext(text, startIndex) {
    const end = parserState.textEnd;
    let index = (parserState.key = consumeWhitespace(text, startIndex, end));
    if (end === index) {
        // we reached an end so just quit
        return -1;
    }
    index = parserState.keyEnd = consumeStyleKey(text, index, end);
    index = consumeSeparator(text, index, end, 58 /* CharCode.COLON */);
    index = parserState.value = consumeWhitespace(text, index, end);
    index = parserState.valueEnd = consumeStyleValue(text, index, end);
    return consumeSeparator(text, index, end, 59 /* CharCode.SEMI_COLON */);
}
/**
 * Reset the global state of the styling parser.
 * @param text The styling text to parse.
 */
function resetParserState(text) {
    parserState.key = 0;
    parserState.keyEnd = 0;
    parserState.value = 0;
    parserState.valueEnd = 0;
    parserState.textEnd = text.length;
}
/**
 * Returns index of next non-whitespace character.
 *
 * @param text Text to scan
 * @param startIndex Starting index of character where the scan should start.
 * @param endIndex Ending index of character where the scan should end.
 * @returns Index of next non-whitespace character (May be the same as `start` if no whitespace at
 *          that location.)
 */
function consumeWhitespace(text, startIndex, endIndex) {
    while (startIndex < endIndex && text.charCodeAt(startIndex) <= 32 /* CharCode.SPACE */) {
        startIndex++;
    }
    return startIndex;
}
/**
 * Returns index of last char in class token.
 *
 * @param text Text to scan
 * @param startIndex Starting index of character where the scan should start.
 * @param endIndex Ending index of character where the scan should end.
 * @returns Index after last char in class token.
 */
function consumeClassToken(text, startIndex, endIndex) {
    while (startIndex < endIndex && text.charCodeAt(startIndex) > 32 /* CharCode.SPACE */) {
        startIndex++;
    }
    return startIndex;
}
/**
 * Consumes all of the characters belonging to style key and token.
 *
 * @param text Text to scan
 * @param startIndex Starting index of character where the scan should start.
 * @param endIndex Ending index of character where the scan should end.
 * @returns Index after last style key character.
 */
function consumeStyleKey(text, startIndex, endIndex) {
    let ch;
    while (startIndex < endIndex &&
        ((ch = text.charCodeAt(startIndex)) === 45 /* CharCode.DASH */ ||
            ch === 95 /* CharCode.UNDERSCORE */ ||
            ((ch & -33 /* CharCode.UPPER_CASE */) >= 65 /* CharCode.A */ && (ch & -33 /* CharCode.UPPER_CASE */) <= 90 /* CharCode.Z */) ||
            (ch >= 48 /* CharCode.ZERO */ && ch <= 57 /* CharCode.NINE */))) {
        startIndex++;
    }
    return startIndex;
}
/**
 * Consumes all whitespace and the separator `:` after the style key.
 *
 * @param text Text to scan
 * @param startIndex Starting index of character where the scan should start.
 * @param endIndex Ending index of character where the scan should end.
 * @returns Index after separator and surrounding whitespace.
 */
function consumeSeparator(text, startIndex, endIndex, separator) {
    startIndex = consumeWhitespace(text, startIndex, endIndex);
    if (startIndex < endIndex) {
        if (ngDevMode && text.charCodeAt(startIndex) !== separator) {
            malformedStyleError(text, String.fromCharCode(separator), startIndex);
        }
        startIndex++;
    }
    return startIndex;
}
/**
 * Consumes style value honoring `url()` and `""` text.
 *
 * @param text Text to scan
 * @param startIndex Starting index of character where the scan should start.
 * @param endIndex Ending index of character where the scan should end.
 * @returns Index after last style value character.
 */
function consumeStyleValue(text, startIndex, endIndex) {
    let ch1 = -1; // 1st previous character
    let ch2 = -1; // 2nd previous character
    let ch3 = -1; // 3rd previous character
    let i = startIndex;
    let lastChIndex = i;
    while (i < endIndex) {
        const ch = text.charCodeAt(i++);
        if (ch === 59 /* CharCode.SEMI_COLON */) {
            return lastChIndex;
        }
        else if (ch === 34 /* CharCode.DOUBLE_QUOTE */ || ch === 39 /* CharCode.SINGLE_QUOTE */) {
            lastChIndex = i = consumeQuotedText(text, ch, i, endIndex);
        }
        else if (startIndex === i - 4 && // We have seen only 4 characters so far "URL(" (Ignore "foo_URL()")
            ch3 === 85 /* CharCode.U */ &&
            ch2 === 82 /* CharCode.R */ &&
            ch1 === 76 /* CharCode.L */ &&
            ch === 40 /* CharCode.OPEN_PAREN */) {
            lastChIndex = i = consumeQuotedText(text, 41 /* CharCode.CLOSE_PAREN */, i, endIndex);
        }
        else if (ch > 32 /* CharCode.SPACE */) {
            // if we have a non-whitespace character then capture its location
            lastChIndex = i;
        }
        ch3 = ch2;
        ch2 = ch1;
        ch1 = ch & -33 /* CharCode.UPPER_CASE */;
    }
    return lastChIndex;
}
/**
 * Consumes all of the quoted characters.
 *
 * @param text Text to scan
 * @param quoteCharCode CharCode of either `"` or `'` quote or `)` for `url(...)`.
 * @param startIndex Starting index of character where the scan should start.
 * @param endIndex Ending index of character where the scan should end.
 * @returns Index after quoted characters.
 */
function consumeQuotedText(text, quoteCharCode, startIndex, endIndex) {
    let ch1 = -1; // 1st previous character
    let index = startIndex;
    while (index < endIndex) {
        const ch = text.charCodeAt(index++);
        if (ch == quoteCharCode && ch1 !== 92 /* CharCode.BACK_SLASH */) {
            return index;
        }
        if (ch == 92 /* CharCode.BACK_SLASH */ && ch1 === 92 /* CharCode.BACK_SLASH */) {
            // two back slashes cancel each other out. For example `"\\"` should properly end the
            // quotation. (It should not assume that the last `"` is escaped.)
            ch1 = 0;
        }
        else {
            ch1 = ch;
        }
    }
    throw ngDevMode
        ? malformedStyleError(text, String.fromCharCode(quoteCharCode), endIndex)
        : new Error();
}
function malformedStyleError(text, expecting, index) {
    ngDevMode && assertEqual(typeof text === 'string', true, 'String expected here');
    throw throwError(`Malformed style at location ${index} in string '` +
        text.substring(0, index) +
        '[>>' +
        text.substring(index, index + 1) +
        '<<]' +
        text.slice(index + 1) +
        `'. Expecting '${expecting}'.`);
}

/**
 * Update a property on a selected element.
 *
 * Operates on the element selected by index via the {@link select} instruction.
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled
 *
 * @param propName Name of property. Because it is going to DOM, this is not subject to
 *        renaming as part of minification.
 * @param value New value to write.
 * @param sanitizer An optional function used to sanitize the value.
 * @returns This function returns itself so that it may be chained
 * (e.g. `property('name', ctx.name)('title', ctx.title)`)
 *
 * @codeGenApi
 */
function ɵɵproperty(propName, value, sanitizer) {
    const lView = getLView();
    const bindingIndex = nextBindingIndex();
    if (bindingUpdated(lView, bindingIndex, value)) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, value, lView[RENDERER], sanitizer, false);
        ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);
    }
    return ɵɵproperty;
}
/**
 * Given `<div style="..." my-dir>` and `MyDir` with `@Input('style')` we need to write to
 * directive input.
 */
function setDirectiveInputsWhichShadowsStyling(tView, tNode, lView, value, isClassBased) {
    // We support both 'class' and `className` hence the fallback.
    setAllInputsForProperty(tNode, tView, lView, isClassBased ? 'class' : 'style', value);
}

/**
 * Update a style binding on an element with the provided value.
 *
 * If the style value is falsy then it will be removed from the element
 * (or assigned a different value depending if there are any styles placed
 * on the element with `styleMap` or any static styles that are
 * present from when the element was created with `styling`).
 *
 * Note that the styling element is updated as part of `stylingApply`.
 *
 * @param prop A valid CSS property.
 * @param value New value to write (`null` or an empty string to remove).
 * @param suffix Optional suffix. Used with scalar values to add unit such as `px`.
 *
 * Note that this will apply the provided style value to the host element if this function is called
 * within a host binding function.
 *
 * @codeGenApi
 */
function ɵɵstyleProp(prop, value, suffix) {
    checkStylingProperty(prop, value, suffix, false);
    return ɵɵstyleProp;
}
/**
 * Update a class binding on an element with the provided value.
 *
 * This instruction is meant to handle the `[class.foo]="exp"` case and,
 * therefore, the class binding itself must already be allocated using
 * `styling` within the creation block.
 *
 * @param prop A valid CSS class (only one).
 * @param value A true/false value which will turn the class on or off.
 *
 * Note that this will apply the provided class value to the host element if this function
 * is called within a host binding function.
 *
 * @codeGenApi
 */
function ɵɵclassProp(className, value) {
    checkStylingProperty(className, value, null, true);
    return ɵɵclassProp;
}
/**
 * Update style bindings using an object literal on an element.
 *
 * This instruction is meant to apply styling via the `[style]="exp"` template bindings.
 * When styles are applied to the element they will then be updated with respect to
 * any styles/classes set via `styleProp`. If any styles are set to falsy
 * then they will be removed from the element.
 *
 * Note that the styling instruction will not be applied until `stylingApply` is called.
 *
 * @param styles A key/value style map of the styles that will be applied to the given element.
 *        Any missing styles (that have already been applied to the element beforehand) will be
 *        removed (unset) from the element's styling.
 *
 * Note that this will apply the provided styleMap value to the host element if this function
 * is called within a host binding.
 *
 * @codeGenApi
 */
function ɵɵstyleMap(styles) {
    checkStylingMap(styleKeyValueArraySet, styleStringParser, styles, false);
}
/**
 * Parse text as style and add values to KeyValueArray.
 *
 * This code is pulled out to a separate function so that it can be tree shaken away if it is not
 * needed. It is only referenced from `ɵɵstyleMap`.
 *
 * @param keyValueArray KeyValueArray to add parsed values to.
 * @param text text to parse.
 */
function styleStringParser(keyValueArray, text) {
    for (let i = parseStyle(text); i >= 0; i = parseStyleNext(text, i)) {
        styleKeyValueArraySet(keyValueArray, getLastParsedKey(text), getLastParsedValue(text));
    }
}
/**
 * Update class bindings using an object literal or class-string on an element.
 *
 * This instruction is meant to apply styling via the `[class]="exp"` template bindings.
 * When classes are applied to the element they will then be updated with
 * respect to any styles/classes set via `classProp`. If any
 * classes are set to falsy then they will be removed from the element.
 *
 * Note that the styling instruction will not be applied until `stylingApply` is called.
 * Note that this will the provided classMap value to the host element if this function is called
 * within a host binding.
 *
 * @param classes A key/value map or string of CSS classes that will be added to the
 *        given element. Any missing classes (that have already been applied to the element
 *        beforehand) will be removed (unset) from the element's list of CSS classes.
 *
 * @codeGenApi
 */
function ɵɵclassMap(classes) {
    checkStylingMap(classKeyValueArraySet, classStringParser, classes, true);
}
/**
 * Parse text as class and add values to KeyValueArray.
 *
 * This code is pulled out to a separate function so that it can be tree shaken away if it is not
 * needed. It is only referenced from `ɵɵclassMap`.
 *
 * @param keyValueArray KeyValueArray to add parsed values to.
 * @param text text to parse.
 */
function classStringParser(keyValueArray, text) {
    for (let i = parseClassName(text); i >= 0; i = parseClassNameNext(text, i)) {
        keyValueArraySet(keyValueArray, getLastParsedKey(text), true);
    }
}
/**
 * Common code between `ɵɵclassProp` and `ɵɵstyleProp`.
 *
 * @param prop property name.
 * @param value binding value.
 * @param suffix suffix for the property (e.g. `em` or `px`)
 * @param isClassBased `true` if `class` change (`false` if `style`)
 */
function checkStylingProperty(prop, value, suffix, isClassBased) {
    const lView = getLView();
    const tView = getTView();
    // Styling instructions use 2 slots per binding.
    // 1. one for the value / TStylingKey
    // 2. one for the intermittent-value / TStylingRange
    const bindingIndex = incrementBindingIndex(2);
    if (tView.firstUpdatePass) {
        stylingFirstUpdatePass(tView, prop, bindingIndex, isClassBased);
    }
    if (value !== NO_CHANGE && bindingUpdated(lView, bindingIndex, value)) {
        const tNode = tView.data[getSelectedIndex()];
        updateStyling(tView, tNode, lView, lView[RENDERER], prop, (lView[bindingIndex + 1] = normalizeSuffix(value, suffix)), isClassBased, bindingIndex);
    }
}
/**
 * Common code between `ɵɵclassMap` and `ɵɵstyleMap`.
 *
 * @param keyValueArraySet (See `keyValueArraySet` in "util/array_utils") Gets passed in as a
 *        function so that `style` can be processed. This is done for tree shaking purposes.
 * @param stringParser Parser used to parse `value` if `string`. (Passed in as `style` and `class`
 *        have different parsers.)
 * @param value bound value from application
 * @param isClassBased `true` if `class` change (`false` if `style`)
 */
function checkStylingMap(keyValueArraySet, stringParser, value, isClassBased) {
    const tView = getTView();
    const bindingIndex = incrementBindingIndex(2);
    if (tView.firstUpdatePass) {
        stylingFirstUpdatePass(tView, null, bindingIndex, isClassBased);
    }
    const lView = getLView();
    if (value !== NO_CHANGE && bindingUpdated(lView, bindingIndex, value)) {
        // `getSelectedIndex()` should be here (rather than in instruction) so that it is guarded by the
        // if so as not to read unnecessarily.
        const tNode = tView.data[getSelectedIndex()];
        if (hasStylingInputShadow(tNode, isClassBased) && !isInHostBindings(tView, bindingIndex)) {
            if (ngDevMode) {
                // verify that if we are shadowing then `TData` is appropriately marked so that we skip
                // processing this binding in styling resolution.
                const tStylingKey = tView.data[bindingIndex];
                assertEqual(Array.isArray(tStylingKey) ? tStylingKey[1] : tStylingKey, false, "Styling linked list shadow input should be marked as 'false'");
            }
            // VE does not concatenate the static portion like we are doing here.
            // Instead VE just ignores the static completely if dynamic binding is present.
            // Because of locality we have already set the static portion because we don't know if there
            // is a dynamic portion until later. If we would ignore the static portion it would look like
            // the binding has removed it. This would confuse `[ngStyle]`/`[ngClass]` to do the wrong
            // thing as it would think that the static portion was removed. For this reason we
            // concatenate it so that `[ngStyle]`/`[ngClass]`  can continue to work on changed.
            let staticPrefix = isClassBased ? tNode.classesWithoutHost : tNode.stylesWithoutHost;
            ngDevMode &&
                isClassBased === false &&
                staticPrefix !== null &&
                assertEqual(staticPrefix.endsWith(';'), true, "Expecting static portion to end with ';'");
            if (staticPrefix !== null) {
                // We want to make sure that falsy values of `value` become empty strings.
                value = concatStringsWithSpace(staticPrefix, value ? value : '');
            }
            // Given `<div [style] my-dir>` such that `my-dir` has `@Input('style')`.
            // This takes over the `[style]` binding. (Same for `[class]`)
            setDirectiveInputsWhichShadowsStyling(tView, tNode, lView, value, isClassBased);
        }
        else {
            updateStylingMap(tView, tNode, lView, lView[RENDERER], lView[bindingIndex + 1], (lView[bindingIndex + 1] = toStylingKeyValueArray(keyValueArraySet, stringParser, value)), isClassBased, bindingIndex);
        }
    }
}
/**
 * Determines when the binding is in `hostBindings` section
 *
 * @param tView Current `TView`
 * @param bindingIndex index of binding which we would like if it is in `hostBindings`
 */
function isInHostBindings(tView, bindingIndex) {
    // All host bindings are placed after the expando section.
    return bindingIndex >= tView.expandoStartIndex;
}
/**
 * Collects the necessary information to insert the binding into a linked list of style bindings
 * using `insertTStylingBinding`.
 *
 * @param tView `TView` where the binding linked list will be stored.
 * @param tStylingKey Property/key of the binding.
 * @param bindingIndex Index of binding associated with the `prop`
 * @param isClassBased `true` if `class` change (`false` if `style`)
 */
function stylingFirstUpdatePass(tView, tStylingKey, bindingIndex, isClassBased) {
    ngDevMode && assertFirstUpdatePass(tView);
    const tData = tView.data;
    if (tData[bindingIndex + 1] === null) {
        // The above check is necessary because we don't clear first update pass until first successful
        // (no exception) template execution. This prevents the styling instruction from double adding
        // itself to the list.
        // `getSelectedIndex()` should be here (rather than in instruction) so that it is guarded by the
        // if so as not to read unnecessarily.
        const tNode = tData[getSelectedIndex()];
        ngDevMode && assertDefined(tNode, 'TNode expected');
        const isHostBindings = isInHostBindings(tView, bindingIndex);
        if (hasStylingInputShadow(tNode, isClassBased) && tStylingKey === null && !isHostBindings) {
            // `tStylingKey === null` implies that we are either `[style]` or `[class]` binding.
            // If there is a directive which uses `@Input('style')` or `@Input('class')` than
            // we need to neutralize this binding since that directive is shadowing it.
            // We turn this into a noop by setting the key to `false`
            tStylingKey = false;
        }
        tStylingKey = wrapInStaticStylingKey(tData, tNode, tStylingKey, isClassBased);
        insertTStylingBinding(tData, tNode, tStylingKey, bindingIndex, isHostBindings, isClassBased);
    }
}
/**
 * Adds static styling information to the binding if applicable.
 *
 * The linked list of styles not only stores the list and keys, but also stores static styling
 * information on some of the keys. This function determines if the key should contain the styling
 * information and computes it.
 *
 * See `TStylingStatic` for more details.
 *
 * @param tData `TData` where the linked list is stored.
 * @param tNode `TNode` for which the styling is being computed.
 * @param stylingKey `TStylingKeyPrimitive` which may need to be wrapped into `TStylingKey`
 * @param isClassBased `true` if `class` (`false` if `style`)
 */
function wrapInStaticStylingKey(tData, tNode, stylingKey, isClassBased) {
    const hostDirectiveDef = getCurrentDirectiveDef(tData);
    let residual = isClassBased ? tNode.residualClasses : tNode.residualStyles;
    if (hostDirectiveDef === null) {
        // We are in template node.
        // If template node already had styling instruction then it has already collected the static
        // styling and there is no need to collect them again. We know that we are the first styling
        // instruction because the `TNode.*Bindings` points to 0 (nothing has been inserted yet).
        const isFirstStylingInstructionInTemplate = (isClassBased ? tNode.classBindings : tNode.styleBindings) === 0;
        if (isFirstStylingInstructionInTemplate) {
            // It would be nice to be able to get the statics from `mergeAttrs`, however, at this point
            // they are already merged and it would not be possible to figure which property belongs where
            // in the priority.
            stylingKey = collectStylingFromDirectives(null, tData, tNode, stylingKey, isClassBased);
            stylingKey = collectStylingFromTAttrs(stylingKey, tNode.attrs, isClassBased);
            // We know that if we have styling binding in template we can't have residual.
            residual = null;
        }
    }
    else {
        // We are in host binding node and there was no binding instruction in template node.
        // This means that we need to compute the residual.
        const directiveStylingLast = tNode.directiveStylingLast;
        const isFirstStylingInstructionInHostBinding = directiveStylingLast === -1 || tData[directiveStylingLast] !== hostDirectiveDef;
        if (isFirstStylingInstructionInHostBinding) {
            stylingKey = collectStylingFromDirectives(hostDirectiveDef, tData, tNode, stylingKey, isClassBased);
            if (residual === null) {
                // - If `null` than either:
                //    - Template styling instruction already ran and it has consumed the static
                //      styling into its `TStylingKey` and so there is no need to update residual. Instead
                //      we need to update the `TStylingKey` associated with the first template node
                //      instruction. OR
                //    - Some other styling instruction ran and determined that there are no residuals
                let templateStylingKey = getTemplateHeadTStylingKey(tData, tNode, isClassBased);
                if (templateStylingKey !== undefined && Array.isArray(templateStylingKey)) {
                    // Only recompute if `templateStylingKey` had static values. (If no static value found
                    // then there is nothing to do since this operation can only produce less static keys, not
                    // more.)
                    templateStylingKey = collectStylingFromDirectives(null, tData, tNode, templateStylingKey[1] /* unwrap previous statics */, isClassBased);
                    templateStylingKey = collectStylingFromTAttrs(templateStylingKey, tNode.attrs, isClassBased);
                    setTemplateHeadTStylingKey(tData, tNode, isClassBased, templateStylingKey);
                }
            }
            else {
                // We only need to recompute residual if it is not `null`.
                // - If existing residual (implies there was no template styling). This means that some of
                //   the statics may have moved from the residual to the `stylingKey` and so we have to
                //   recompute.
                // - If `undefined` this is the first time we are running.
                residual = collectResidual(tData, tNode, isClassBased);
            }
        }
    }
    if (residual !== undefined) {
        isClassBased ? (tNode.residualClasses = residual) : (tNode.residualStyles = residual);
    }
    return stylingKey;
}
/**
 * Retrieve the `TStylingKey` for the template styling instruction.
 *
 * This is needed since `hostBinding` styling instructions are inserted after the template
 * instruction. While the template instruction needs to update the residual in `TNode` the
 * `hostBinding` instructions need to update the `TStylingKey` of the template instruction because
 * the template instruction is downstream from the `hostBindings` instructions.
 *
 * @param tData `TData` where the linked list is stored.
 * @param tNode `TNode` for which the styling is being computed.
 * @param isClassBased `true` if `class` (`false` if `style`)
 * @return `TStylingKey` if found or `undefined` if not found.
 */
function getTemplateHeadTStylingKey(tData, tNode, isClassBased) {
    const bindings = isClassBased ? tNode.classBindings : tNode.styleBindings;
    if (getTStylingRangeNext(bindings) === 0) {
        // There does not seem to be a styling instruction in the `template`.
        return undefined;
    }
    return tData[getTStylingRangePrev(bindings)];
}
/**
 * Update the `TStylingKey` of the first template instruction in `TNode`.
 *
 * Logically `hostBindings` styling instructions are of lower priority than that of the template.
 * However, they execute after the template styling instructions. This means that they get inserted
 * in front of the template styling instructions.
 *
 * If we have a template styling instruction and a new `hostBindings` styling instruction is
 * executed it means that it may need to steal static fields from the template instruction. This
 * method allows us to update the first template instruction `TStylingKey` with a new value.
 *
 * Assume:
 * ```angular-ts
 * <div my-dir style="color: red" [style.color]="tmplExp"></div>
 *
 * @Directive({
 *   host: {
 *     'style': 'width: 100px',
 *     '[style.color]': 'dirExp',
 *   }
 * })
 * class MyDir {}
 * ```
 *
 * when `[style.color]="tmplExp"` executes it creates this data structure.
 * ```ts
 *  ['', 'color', 'color', 'red', 'width', '100px'],
 * ```
 *
 * The reason for this is that the template instruction does not know if there are styling
 * instructions and must assume that there are none and must collect all of the static styling.
 * (both
 * `color' and 'width`)
 *
 * When `'[style.color]': 'dirExp',` executes we need to insert a new data into the linked list.
 * ```ts
 *  ['', 'color', 'width', '100px'],  // newly inserted
 *  ['', 'color', 'color', 'red', 'width', '100px'], // this is wrong
 * ```
 *
 * Notice that the template statics is now wrong as it incorrectly contains `width` so we need to
 * update it like so:
 * ```ts
 *  ['', 'color', 'width', '100px'],
 *  ['', 'color', 'color', 'red'],    // UPDATE
 * ```
 *
 * @param tData `TData` where the linked list is stored.
 * @param tNode `TNode` for which the styling is being computed.
 * @param isClassBased `true` if `class` (`false` if `style`)
 * @param tStylingKey New `TStylingKey` which is replacing the old one.
 */
function setTemplateHeadTStylingKey(tData, tNode, isClassBased, tStylingKey) {
    const bindings = isClassBased ? tNode.classBindings : tNode.styleBindings;
    ngDevMode &&
        assertNotEqual(getTStylingRangeNext(bindings), 0, 'Expecting to have at least one template styling binding.');
    tData[getTStylingRangePrev(bindings)] = tStylingKey;
}
/**
 * Collect all static values after the current `TNode.directiveStylingLast` index.
 *
 * Collect the remaining styling information which has not yet been collected by an existing
 * styling instruction.
 *
 * @param tData `TData` where the `DirectiveDefs` are stored.
 * @param tNode `TNode` which contains the directive range.
 * @param isClassBased `true` if `class` (`false` if `style`)
 */
function collectResidual(tData, tNode, isClassBased) {
    let residual = undefined;
    const directiveEnd = tNode.directiveEnd;
    ngDevMode &&
        assertNotEqual(tNode.directiveStylingLast, -1, 'By the time this function gets called at least one hostBindings-node styling instruction must have executed.');
    // We add `1 + tNode.directiveStart` because we need to skip the current directive (as we are
    // collecting things after the last `hostBindings` directive which had a styling instruction.)
    for (let i = 1 + tNode.directiveStylingLast; i < directiveEnd; i++) {
        const attrs = tData[i].hostAttrs;
        residual = collectStylingFromTAttrs(residual, attrs, isClassBased);
    }
    return collectStylingFromTAttrs(residual, tNode.attrs, isClassBased);
}
/**
 * Collect the static styling information with lower priority than `hostDirectiveDef`.
 *
 * (This is opposite of residual styling.)
 *
 * @param hostDirectiveDef `DirectiveDef` for which we want to collect lower priority static
 *        styling. (Or `null` if template styling)
 * @param tData `TData` where the linked list is stored.
 * @param tNode `TNode` for which the styling is being computed.
 * @param stylingKey Existing `TStylingKey` to update or wrap.
 * @param isClassBased `true` if `class` (`false` if `style`)
 */
function collectStylingFromDirectives(hostDirectiveDef, tData, tNode, stylingKey, isClassBased) {
    // We need to loop because there can be directives which have `hostAttrs` but don't have
    // `hostBindings` so this loop catches up to the current directive..
    let currentDirective = null;
    const directiveEnd = tNode.directiveEnd;
    let directiveStylingLast = tNode.directiveStylingLast;
    if (directiveStylingLast === -1) {
        directiveStylingLast = tNode.directiveStart;
    }
    else {
        directiveStylingLast++;
    }
    while (directiveStylingLast < directiveEnd) {
        currentDirective = tData[directiveStylingLast];
        ngDevMode && assertDefined(currentDirective, 'expected to be defined');
        stylingKey = collectStylingFromTAttrs(stylingKey, currentDirective.hostAttrs, isClassBased);
        if (currentDirective === hostDirectiveDef)
            break;
        directiveStylingLast++;
    }
    if (hostDirectiveDef !== null) {
        // we only advance the styling cursor if we are collecting data from host bindings.
        // Template executes before host bindings and so if we would update the index,
        // host bindings would not get their statics.
        tNode.directiveStylingLast = directiveStylingLast;
    }
    return stylingKey;
}
/**
 * Convert `TAttrs` into `TStylingStatic`.
 *
 * @param stylingKey existing `TStylingKey` to update or wrap.
 * @param attrs `TAttributes` to process.
 * @param isClassBased `true` if `class` (`false` if `style`)
 */
function collectStylingFromTAttrs(stylingKey, attrs, isClassBased) {
    const desiredMarker = isClassBased ? 1 /* AttributeMarker.Classes */ : 2 /* AttributeMarker.Styles */;
    let currentMarker = -1 /* AttributeMarker.ImplicitAttributes */;
    if (attrs !== null) {
        for (let i = 0; i < attrs.length; i++) {
            const item = attrs[i];
            if (typeof item === 'number') {
                currentMarker = item;
            }
            else {
                if (currentMarker === desiredMarker) {
                    if (!Array.isArray(stylingKey)) {
                        stylingKey = stylingKey === undefined ? [] : ['', stylingKey];
                    }
                    keyValueArraySet(stylingKey, item, isClassBased ? true : attrs[++i]);
                }
            }
        }
    }
    return stylingKey === undefined ? null : stylingKey;
}
/**
 * Convert user input to `KeyValueArray`.
 *
 * This function takes user input which could be `string`, Object literal, or iterable and converts
 * it into a consistent representation. The output of this is `KeyValueArray` (which is an array
 * where
 * even indexes contain keys and odd indexes contain values for those keys).
 *
 * The advantage of converting to `KeyValueArray` is that we can perform diff in an input
 * independent
 * way.
 * (ie we can compare `foo bar` to `['bar', 'baz'] and determine a set of changes which need to be
 * applied)
 *
 * The fact that `KeyValueArray` is sorted is very important because it allows us to compute the
 * difference in linear fashion without the need to allocate any additional data.
 *
 * For example if we kept this as a `Map` we would have to iterate over previous `Map` to determine
 * which values need to be deleted, over the new `Map` to determine additions, and we would have to
 * keep additional `Map` to keep track of duplicates or items which have not yet been visited.
 *
 * @param keyValueArraySet (See `keyValueArraySet` in "util/array_utils") Gets passed in as a
 *        function so that `style` can be processed. This is done
 *        for tree shaking purposes.
 * @param stringParser The parser is passed in so that it will be tree shakable. See
 *        `styleStringParser` and `classStringParser`
 * @param value The value to parse/convert to `KeyValueArray`
 */
function toStylingKeyValueArray(keyValueArraySet, stringParser, value) {
    if (value == null /*|| value === undefined */ || value === '')
        return EMPTY_ARRAY;
    const styleKeyValueArray = [];
    const unwrappedValue = unwrapSafeValue(value);
    if (Array.isArray(unwrappedValue)) {
        for (let i = 0; i < unwrappedValue.length; i++) {
            keyValueArraySet(styleKeyValueArray, unwrappedValue[i], true);
        }
    }
    else if (typeof unwrappedValue === 'object') {
        for (const key in unwrappedValue) {
            if (unwrappedValue.hasOwnProperty(key)) {
                keyValueArraySet(styleKeyValueArray, key, unwrappedValue[key]);
            }
        }
    }
    else if (typeof unwrappedValue === 'string') {
        stringParser(styleKeyValueArray, unwrappedValue);
    }
    else {
        ngDevMode &&
            throwError('Unsupported styling type: ' + typeof unwrappedValue + ' (' + unwrappedValue + ')');
    }
    return styleKeyValueArray;
}
/**
 * Set a `value` for a `key`.
 *
 * See: `keyValueArraySet` for details
 *
 * @param keyValueArray KeyValueArray to add to.
 * @param key Style key to add.
 * @param value The value to set.
 */
function styleKeyValueArraySet(keyValueArray, key, value) {
    keyValueArraySet(keyValueArray, key, unwrapSafeValue(value));
}
/**
 * Class-binding-specific function for setting the `value` for a `key`.
 *
 * See: `keyValueArraySet` for details
 *
 * @param keyValueArray KeyValueArray to add to.
 * @param key Style key to add.
 * @param value The value to set.
 */
function classKeyValueArraySet(keyValueArray, key, value) {
    // We use `classList.add` to eventually add the CSS classes to the DOM node. Any value passed into
    // `add` is stringified and added to the `class` attribute, e.g. even null, undefined or numbers
    // will be added. Stringify the key here so that our internal data structure matches the value in
    // the DOM. The only exceptions are empty strings and strings that contain spaces for which
    // the browser throws an error. We ignore such values, because the error is somewhat cryptic.
    const stringKey = String(key);
    if (stringKey !== '' && !stringKey.includes(' ')) {
        keyValueArraySet(keyValueArray, stringKey, value);
    }
}
/**
 * Update map based styling.
 *
 * Map based styling could be anything which contains more than one binding. For example `string`,
 * or object literal. Dealing with all of these types would complicate the logic so
 * instead this function expects that the complex input is first converted into normalized
 * `KeyValueArray`. The advantage of normalization is that we get the values sorted, which makes it
 * very cheap to compute deltas between the previous and current value.
 *
 * @param tView Associated `TView.data` contains the linked list of binding priorities.
 * @param tNode `TNode` where the binding is located.
 * @param lView `LView` contains the values associated with other styling binding at this `TNode`.
 * @param renderer Renderer to use if any updates.
 * @param oldKeyValueArray Previous value represented as `KeyValueArray`
 * @param newKeyValueArray Current value represented as `KeyValueArray`
 * @param isClassBased `true` if `class` (`false` if `style`)
 * @param bindingIndex Binding index of the binding.
 */
function updateStylingMap(tView, tNode, lView, renderer, oldKeyValueArray, newKeyValueArray, isClassBased, bindingIndex) {
    if (oldKeyValueArray === NO_CHANGE) {
        // On first execution the oldKeyValueArray is NO_CHANGE => treat it as empty KeyValueArray.
        oldKeyValueArray = EMPTY_ARRAY;
    }
    let oldIndex = 0;
    let newIndex = 0;
    let oldKey = 0 < oldKeyValueArray.length ? oldKeyValueArray[0] : null;
    let newKey = 0 < newKeyValueArray.length ? newKeyValueArray[0] : null;
    while (oldKey !== null || newKey !== null) {
        ngDevMode && assertLessThan(oldIndex, 999, 'Are we stuck in infinite loop?');
        ngDevMode && assertLessThan(newIndex, 999, 'Are we stuck in infinite loop?');
        const oldValue = oldIndex < oldKeyValueArray.length ? oldKeyValueArray[oldIndex + 1] : undefined;
        const newValue = newIndex < newKeyValueArray.length ? newKeyValueArray[newIndex + 1] : undefined;
        let setKey = null;
        let setValue = undefined;
        if (oldKey === newKey) {
            // UPDATE: Keys are equal => new value is overwriting old value.
            oldIndex += 2;
            newIndex += 2;
            if (oldValue !== newValue) {
                setKey = newKey;
                setValue = newValue;
            }
        }
        else if (newKey === null || (oldKey !== null && oldKey < newKey)) {
            // DELETE: oldKey key is missing or we did not find the oldKey in the newValue
            // (because the keyValueArray is sorted and `newKey` is found later alphabetically).
            // `"background" < "color"` so we need to delete `"background"` because it is not found in the
            // new array.
            oldIndex += 2;
            setKey = oldKey;
        }
        else {
            // CREATE: newKey's is earlier alphabetically than oldKey's (or no oldKey) => we have new key.
            // `"color" > "background"` so we need to add `color` because it is in new array but not in
            // old array.
            ngDevMode && assertDefined(newKey, 'Expecting to have a valid key');
            newIndex += 2;
            setKey = newKey;
            setValue = newValue;
        }
        if (setKey !== null) {
            updateStyling(tView, tNode, lView, renderer, setKey, setValue, isClassBased, bindingIndex);
        }
        oldKey = oldIndex < oldKeyValueArray.length ? oldKeyValueArray[oldIndex] : null;
        newKey = newIndex < newKeyValueArray.length ? newKeyValueArray[newIndex] : null;
    }
}
/**
 * Update a simple (property name) styling.
 *
 * This function takes `prop` and updates the DOM to that value. The function takes the binding
 * value as well as binding priority into consideration to determine which value should be written
 * to DOM. (For example it may be determined that there is a higher priority overwrite which blocks
 * the DOM write, or if the value goes to `undefined` a lower priority overwrite may be consulted.)
 *
 * @param tView Associated `TView.data` contains the linked list of binding priorities.
 * @param tNode `TNode` where the binding is located.
 * @param lView `LView` contains the values associated with other styling binding at this `TNode`.
 * @param renderer Renderer to use if any updates.
 * @param prop Either style property name or a class name.
 * @param value Either style value for `prop` or `true`/`false` if `prop` is class.
 * @param isClassBased `true` if `class` (`false` if `style`)
 * @param bindingIndex Binding index of the binding.
 *   /
function updateStyling(tView, tNode, lView, renderer, prop, value, isClassBased, bindingIndex) {
    if (!(tNode.type & 3 /* TNodeType.AnyRNode */)) {
        // It is possible to have styling on non-elements (such as ng-container).
        // This is rare, but it does happen. In such a case, just ignore the binding.
        return;
    }
    const tData = tView.data;
    const tRange = tData[bindingIndex + 1];
    const higherPriorityValue = getTStylingRangeNextDuplicate(tRange)
        ? findStylingValue(tData, tNode, lView, prop, getTStylingRangeNext(tRange), isClassBased)
        : undefined;
    if (!isStylingValuePresent(higherPriorityValue)) {
        // We don't have a next duplicate, or we did not find a duplicate value.
        if (!isStylingValuePresent(value)) {
            // We should delete current value or restore to lower priority value.
            if (getTStylingRangePrevDuplicate(tRange)) {
                // We have a possible prev duplicate, let's retrieve it.
                value = findStylingValue(tData, null, lView, prop, bindingIndex, isClassBased);
            }
        }
        const rNode = getNativeByIndex(getSelectedIndex(), lView);
        applyStyling(renderer, isClassBased, rNode, prop, value);
    }
}
/**
 * Search for styling value with higher priority which is overwriting current value, or a
 * value of lower priority to which we should fall back if the value is `undefined`.
 *
 * When value is being applied at a location, related values need to be consulted.
 * - If there is a higher priority binding, we should be using that one instead.
 *   For example `<div  [style]="{color:exp1}" [style.color]="exp2">` change to `exp1`
 *   requires that we check `exp2` to see if it is set to value other than `undefined`.
 * - If there is a lower priority binding and we are changing to `undefined`
 *   For example `<div  [style]="{color:exp1}" [style.color]="exp2">` change to `exp2` to
 *   `undefined` requires that we check `exp1` (and static values) and use that as new value.
 *
 * NOTE: The styling stores two values.
 * 1. The raw value which came from the application is stored at `index + 0` location. (This value
 *    is used for dirty checking).
 * 2. The normalized value is stored at `index + 1`.
 *
 * @param tData `TData` used for traversing the priority.
 * @param tNode `TNode` to use for resolving static styling. Also controls search direction.
 *   - `TNode` search next and quit as soon as `isStylingValuePresent(value)` is true.
 *      If no value found consult `tNode.residualStyle`/`tNode.residualClass` for default value.
 *   - `null` search prev and go all the way to end. Return last value where
 *     `isStylingValuePresent(value)` is true.
 * @param lView `LView` used for retrieving the actual values.
 * @param prop Property which we are interested in.
 * @param index Starting index in the linked list of styling bindings where the search should start.
 * @param isClassBased `true` if `class` (`false` if `style`)
 */
function findStylingValue(tData, tNode, lView, prop, index, isClassBased) {
    // `TNode` to use for resolving static styling. Also controls search direction.
    //   - `TNode` search next and quit as soon as `isStylingValuePresent(value)` is true.
    //      If no value found consult `tNode.residualStyle`/`tNode.residualClass` for default value.
    //   - `null` search prev and go all the way to end. Return last value where
    //     `isStylingValuePresent(value)` is true.
    const isPrevDirection = tNode === null;
    let value = undefined;
    while (index > 0) {
        const rawKey = tData[index];
        const containsStatics = Array.isArray(rawKey);
        // Unwrap the key if we contain static values.
        const key = containsStatics ? rawKey[1] : rawKey;
        const isStylingMap = key === null;
        let valueAtLViewIndex = lView[index + 1];
        if (valueAtLViewIndex === NO_CHANGE) {
            // In firstUpdatePass the styling instructions create a linked list of styling.
            // On subsequent passes it is possible for a styling instruction to try to read a binding
            // which
            // has not yet executed. In that case we will find `NO_CHANGE` and we should assume that
            // we have `undefined` (or empty array in case of styling-map instruction) instead. This
            // allows the resolution to apply the value (which may later be overwritten when the
            // binding actually executes.)
            valueAtLViewIndex = isStylingMap ? EMPTY_ARRAY : undefined;
        }
        let currentValue = isStylingMap
            ? keyValueArrayGet(valueAtLViewIndex, prop)
            : key === prop
                ? valueAtLViewIndex
                : undefined;
        if (containsStatics && !isStylingValuePresent(currentValue)) {
            currentValue = keyValueArrayGet(rawKey, prop);
        }
        if (isStylingValuePresent(currentValue)) {
            value = currentValue;
            if (isPrevDirection) {
                return value;
            }
        }
        const tRange = tData[index + 1];
        index = isPrevDirection ? getTStylingRangePrev(tRange) : getTStylingRangeNext(tRange);
    }
    if (tNode !== null) {
        // in case where we are going in next direction AND we did not find anything, we need to
        // consult residual styling
        let residual = isClassBased ? tNode.residualClasses : tNode.residualStyles;
        if (residual != null /** OR residual !=== undefined */) {
            value = keyValueArrayGet(residual, prop);
        }
    }
    return value;
}
/**
 * Determines if the binding value should be used (or if the value is 'undefined' and hence priority
 * resolution should be used.)
 *
 * @param value Binding style value.
 */
function isStylingValuePresent(value) {
    // Currently only `undefined` value is considered non-binding. That is `undefined` says I don't
    // have an opinion as to what this binding should be and you should consult other bindings by
    // priority to determine the valid value.
    // This is extracted into a single function so that we have a single place to control this.
    return value !== undefined;
}
/**
 * Normalizes and/or adds a suffix to the value.
 *
 * If value is `null`/`undefined` no suffix is added
 * @param value
 * @param suffix
 */
function normalizeSuffix(value, suffix) {
    if (value == null || value === '') ;
    else if (typeof suffix === 'string') {
        value = value + suffix;
    }
    else if (typeof value === 'object') {
        value = stringify(unwrapSafeValue(value));
    }
    return value;
}
/**
 * Tests if the `TNode` has input shadow.
 *
 * An input shadow is when a directive steals (shadows) the input by using `@Input('style')` or
 * `@Input('class')` as input.
 *
 * @param tNode `TNode` which we would like to see if it has shadow.
 * @param isClassBased `true` if `class` (`false` if `style`)
 */
function hasStylingInputShadow(tNode, isClassBased) {
    return (tNode.flags & (isClassBased ? 8 /* TNodeFlags.hasClassInput */ : 16 /* TNodeFlags.hasStyleInput */)) !== 0;
}

/**
 *
 * Update an interpolated class on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div class="prefix{{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate1('prefix', v0, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵclassMapInterpolate1(prefix, v0, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation1(lView, prefix, v0, suffix);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}
/**
 *
 * Update an interpolated class on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate2('prefix', v0, '-', v1, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵclassMapInterpolate2(prefix, v0, i0, v1, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}
/**
 *
 * Update an interpolated class on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate3(
 * 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵclassMapInterpolate3(prefix, v0, i0, v1, i1, v2, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}
/**
 *
 * Update an interpolated class on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate4(
 * 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵclassMapInterpolate4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}
/**
 *
 * Update an interpolated class on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate5(
 * 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵclassMapInterpolate5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}
/**
 *
 * Update an interpolated class on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate6(
 *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵclassMapInterpolate6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}
/**
 *
 * Update an interpolated class on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate7(
 *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵclassMapInterpolate7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}
/**
 *
 * Update an interpolated class on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate8(
 *  'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵclassMapInterpolate8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}
/**
 * Update an interpolated class on an element with 9 or more bound values surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolateV(
 *  ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *.
 * @param values The collection of values and the strings in-between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 * @codeGenApi
 */
function ɵɵclassMapInterpolateV(values) {
    const lView = getLView();
    const interpolatedValue = interpolationV(lView, values);
    checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Instruction that returns the component instance in which the current instruction is executing.
 * This is a constant-time version of `nextContent` for the case where we know that we need the
 * component instance specifically, rather than the context of a particular template.
 *
 * @codeGenApi
 */
function ɵɵcomponentInstance() {
    const instance = getLView()[DECLARATION_COMPONENT_VIEW][CONTEXT];
    ngDevMode && assertDefined(instance, 'Expected component instance to be defined');
    return instance;
}

/**
 * A type representing the live collection to be reconciled with any new (incoming) collection. This
 * is an adapter class that makes it possible to work with different internal data structures,
 * regardless of the actual values of the incoming collection.
 */
class LiveCollection {
    destroy(item) {
        // noop by default
    }
    updateValue(index, value) {
        // noop by default
    }
    // operations below could be implemented on top of the operations defined so far, but having
    // them explicitly allow clear expression of intent and potentially more performant
    // implementations
    swap(index1, index2) {
        const startIdx = Math.min(index1, index2);
        const endIdx = Math.max(index1, index2);
        const endItem = this.detach(endIdx);
        if (endIdx - startIdx > 1) {
            const startItem = this.detach(startIdx);
            this.attach(startIdx, endItem);
            this.attach(endIdx, startItem);
        }
        else {
            this.attach(startIdx, endItem);
        }
    }
    move(prevIndex, newIdx) {
        this.attach(newIdx, this.detach(prevIndex));
    }
}
function valuesMatching(liveIdx, liveValue, newIdx, newValue, trackBy) {
    if (liveIdx === newIdx && Object.is(liveValue, newValue)) {
        // matching and no value identity to update
        return 1;
    }
    else if (Object.is(trackBy(liveIdx, liveValue), trackBy(newIdx, newValue))) {
        // matching but requires value identity update
        return -1;
    }
    return 0;
}
function recordDuplicateKeys(keyToIdx, key, idx) {
    const idxSoFar = keyToIdx.get(key);
    if (idxSoFar !== undefined) {
        idxSoFar.add(idx);
    }
    else {
        keyToIdx.set(key, new Set([idx]));
    }
}
/**
 * The live collection reconciliation algorithm that perform various in-place operations, so it
 * reflects the content of the new (incoming) collection.
 *
 * The reconciliation algorithm has 2 code paths:
 * - "fast" path that don't require any memory allocation;
 * - "slow" path that requires additional memory allocation for intermediate data structures used to
 * collect additional information about the live collection.
 * It might happen that the algorithm switches between the two modes in question in a single
 * reconciliation path - generally it tries to stay on the "fast" path as much as possible.
 *
 * The overall complexity of the algorithm is O(n + m) for speed and O(n) for memory (where n is the
 * length of the live collection and m is the length of the incoming collection). Given the problem
 * at hand the complexity / performance constraints makes it impossible to perform the absolute
 * minimum of operation to reconcile the 2 collections. The algorithm makes different tradeoffs to
 * stay within reasonable performance bounds and may apply sub-optimal number of operations in
 * certain situations.
 *
 * @param liveCollection the current, live collection;
 * @param newCollection the new, incoming collection;
 * @param trackByFn key generation function that determines equality between items in the life and
 *     incoming collection;
 */
function reconcile(liveCollection, newCollection, trackByFn) {
    let detachedItems = undefined;
    let liveKeysInTheFuture = undefined;
    let liveStartIdx = 0;
    let liveEndIdx = liveCollection.length - 1;
    const duplicateKeys = ngDevMode ? new Map() : undefined;
    if (Array.isArray(newCollection)) {
        let newEndIdx = newCollection.length - 1;
        while (liveStartIdx <= liveEndIdx && liveStartIdx <= newEndIdx) {
            // compare from the beginning
            const liveStartValue = liveCollection.at(liveStartIdx);
            const newStartValue = newCollection[liveStartIdx];
            if (ngDevMode) {
                recordDuplicateKeys(duplicateKeys, trackByFn(liveStartIdx, newStartValue), liveStartIdx);
            }
            const isStartMatching = valuesMatching(liveStartIdx, liveStartValue, liveStartIdx, newStartValue, trackByFn);
            if (isStartMatching !== 0) {
                if (isStartMatching < 0) {
                    liveCollection.updateValue(liveStartIdx, newStartValue);
                }
                liveStartIdx++;
                continue;
            }
            // compare from the end
            // TODO(perf): do _all_ the matching from the end
            const liveEndValue = liveCollection.at(liveEndIdx);
            const newEndValue = newCollection[newEndIdx];
            if (ngDevMode) {
                recordDuplicateKeys(duplicateKeys, trackByFn(newEndIdx, newEndValue), newEndIdx);
            }
            const isEndMatching = valuesMatching(liveEndIdx, liveEndValue, newEndIdx, newEndValue, trackByFn);
            if (isEndMatching !== 0) {
                if (isEndMatching < 0) {
                    liveCollection.updateValue(liveEndIdx, newEndValue);
                }
                liveEndIdx--;
                newEndIdx--;
                continue;
            }
            // Detect swap and moves:
            const liveStartKey = trackByFn(liveStartIdx, liveStartValue);
            const liveEndKey = trackByFn(liveEndIdx, liveEndValue);
            const newStartKey = trackByFn(liveStartIdx, newStartValue);
            if (Object.is(newStartKey, liveEndKey)) {
                const newEndKey = trackByFn(newEndIdx, newEndValue);
                // detect swap on both ends;
                if (Object.is(newEndKey, liveStartKey)) {
                    liveCollection.swap(liveStartIdx, liveEndIdx);
                    liveCollection.updateValue(liveEndIdx, newEndValue);
                    newEndIdx--;
                    liveEndIdx--;
                }
                else {
                    // the new item is the same as the live item with the end pointer - this is a move forward
                    // to an earlier index;
                    liveCollection.move(liveEndIdx, liveStartIdx);
                }
                liveCollection.updateValue(liveStartIdx, newStartValue);
                liveStartIdx++;
                continue;
            }
            // Fallback to the slow path: we need to learn more about the content of the live and new
            // collections.
            detachedItems ??= new UniqueValueMultiKeyMap();
            liveKeysInTheFuture ??= initLiveItemsInTheFuture(liveCollection, liveStartIdx, liveEndIdx, trackByFn);
            // Check if I'm inserting a previously detached item: if so, attach it here
            if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newStartKey)) {
                liveCollection.updateValue(liveStartIdx, newStartValue);
                liveStartIdx++;
                liveEndIdx++;
            }
            else if (!liveKeysInTheFuture.has(newStartKey)) {
                // Check if we seen a new item that doesn't exist in the old collection and must be INSERTED
                const newItem = liveCollection.create(liveStartIdx, newCollection[liveStartIdx]);
                liveCollection.attach(liveStartIdx, newItem);
                liveStartIdx++;
                liveEndIdx++;
            }
            else {
                // We know that the new item exists later on in old collection but we don't know its index
                // and as the consequence can't move it (don't know where to find it). Detach the old item,
                // hoping that it unlocks the fast path again.
                detachedItems.set(liveStartKey, liveCollection.detach(liveStartIdx));
                liveEndIdx--;
            }
        }
        // Final cleanup steps:
        // - more items in the new collection => insert
        while (liveStartIdx <= newEndIdx) {
            createOrAttach(liveCollection, detachedItems, trackByFn, liveStartIdx, newCollection[liveStartIdx]);
            liveStartIdx++;
        }
    }
    else if (newCollection != null) {
        // iterable - immediately fallback to the slow path
        const newCollectionIterator = newCollection[Symbol.iterator]();
        let newIterationResult = newCollectionIterator.next();
        while (!newIterationResult.done && liveStartIdx <= liveEndIdx) {
            const liveValue = liveCollection.at(liveStartIdx);
            const newValue = newIterationResult.value;
            if (ngDevMode) {
                recordDuplicateKeys(duplicateKeys, trackByFn(liveStartIdx, newValue), liveStartIdx);
            }
            const isStartMatching = valuesMatching(liveStartIdx, liveValue, liveStartIdx, newValue, trackByFn);
            if (isStartMatching !== 0) {
                // found a match - move on, but update value
                if (isStartMatching < 0) {
                    liveCollection.updateValue(liveStartIdx, newValue);
                }
                liveStartIdx++;
                newIterationResult = newCollectionIterator.next();
            }
            else {
                detachedItems ??= new UniqueValueMultiKeyMap();
                liveKeysInTheFuture ??= initLiveItemsInTheFuture(liveCollection, liveStartIdx, liveEndIdx, trackByFn);
                // Check if I'm inserting a previously detached item: if so, attach it here
                const newKey = trackByFn(liveStartIdx, newValue);
                if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newKey)) {
                    liveCollection.updateValue(liveStartIdx, newValue);
                    liveStartIdx++;
                    liveEndIdx++;
                    newIterationResult = newCollectionIterator.next();
                }
                else if (!liveKeysInTheFuture.has(newKey)) {
                    liveCollection.attach(liveStartIdx, liveCollection.create(liveStartIdx, newValue));
                    liveStartIdx++;
                    liveEndIdx++;
                    newIterationResult = newCollectionIterator.next();
                }
                else {
                    // it is a move forward - detach the current item without advancing in collections
                    const liveKey = trackByFn(liveStartIdx, liveValue);
                    detachedItems.set(liveKey, liveCollection.detach(liveStartIdx));
                    liveEndIdx--;
                }
            }
        }
        // this is a new item as we run out of the items in the old collection - create or attach a
        // previously detached one
        while (!newIterationResult.done) {
            createOrAttach(liveCollection, detachedItems, trackByFn, liveCollection.length, newIterationResult.value);
            newIterationResult = newCollectionIterator.next();
        }
    }
    // Cleanups common to the array and iterable:
    // - more items in the live collection => delete starting from the end;
    while (liveStartIdx <= liveEndIdx) {
        liveCollection.destroy(liveCollection.detach(liveEndIdx--));
    }
    // - destroy items that were detached but never attached again.
    detachedItems?.forEach((item) => {
        liveCollection.destroy(item);
    });
    // report duplicate keys (dev mode only)
    if (ngDevMode) {
        let duplicatedKeysMsg = [];
        for (const [key, idxSet] of duplicateKeys) {
            if (idxSet.size > 1) {
                const idx = [...idxSet].sort((a, b) => a - b);
                for (let i = 1; i < idx.length; i++) {
                    duplicatedKeysMsg.push(`key "${stringifyForError(key)}" at index "${idx[i - 1]}" and "${idx[i]}"`);
                }
            }
        }
        if (duplicatedKeysMsg.length > 0) {
            const message = formatRuntimeError(-955 /* RuntimeErrorCode.LOOP_TRACK_DUPLICATE_KEYS */, 'The provided track expression resulted in duplicated keys for a given collection. ' +
                'Adjust the tracking expression such that it uniquely identifies all the items in the collection. ' +
                'Duplicated keys were: \n' +
                duplicatedKeysMsg.join(', \n') +
                '.');
            console.warn(message);
        }
    }
}
function attachPreviouslyDetached(prevCollection, detachedItems, index, key) {
    if (detachedItems !== undefined && detachedItems.has(key)) {
        prevCollection.attach(index, detachedItems.get(key));
        detachedItems.delete(key);
        return true;
    }
    return false;
}
function createOrAttach(liveCollection, detachedItems, trackByFn, index, value) {
    if (!attachPreviouslyDetached(liveCollection, detachedItems, index, trackByFn(index, value))) {
        const newItem = liveCollection.create(index, value);
        liveCollection.attach(index, newItem);
    }
    else {
        liveCollection.updateValue(index, value);
    }
}
function initLiveItemsInTheFuture(liveCollection, start, end, trackByFn) {
    const keys = new Set();
    for (let i = start; i <= end; i++) {
        keys.add(trackByFn(i, liveCollection.at(i)));
    }
    return keys;
}
/**
 * A specific, partial implementation of the Map interface with the following characteristics:
 * - allows multiple values for a given key;
 * - maintain FIFO order for multiple values corresponding to a given key;
 * - assumes that all values are unique.
 *
 * The implementation aims at having the minimal overhead for cases where keys are _not_ duplicated
 * (the most common case in the list reconciliation algorithm). To achieve this, the first value for
 * a given key is stored in a regular map. Then, when more values are set for a given key, we
 * maintain a form of linked list in a separate map. To maintain this linked list we assume that all
 * values (in the entire collection) are unique.
 */
class UniqueValueMultiKeyMap {
    // A map from a key to the first value corresponding to this key.
    kvMap = new Map();
    // A map that acts as a linked list of values - each value maps to the next value in this "linked
    // list" (this only works if values are unique). Allocated lazily to avoid memory consumption when
    // there are no duplicated values.
    _vMap = undefined;
    has(key) {
        return this.kvMap.has(key);
    }
    delete(key) {
        if (!this.has(key))
            return false;
        const value = this.kvMap.get(key);
        if (this._vMap !== undefined && this._vMap.has(value)) {
            this.kvMap.set(key, this._vMap.get(value));
            this._vMap.delete(value);
        }
        else {
            this.kvMap.delete(key);
        }
        return true;
    }
    get(key) {
        return this.kvMap.get(key);
    }
    set(key, value) {
        if (this.kvMap.has(key)) {
            let prevValue = this.kvMap.get(key);
            // Note: we don't use `assertNotSame`, because the value needs to be stringified even if
            // there is no error which can freeze the browser for large values (see #58509).
            if (ngDevMode && prevValue === value) {
                throw new Error(`Detected a duplicated value ${value} for the key ${key}`);
            }
            if (this._vMap === undefined) {
                this._vMap = new Map();
            }
            const vMap = this._vMap;
            while (vMap.has(prevValue)) {
                prevValue = vMap.get(prevValue);
            }
            vMap.set(prevValue, value);
        }
        else {
            this.kvMap.set(key, value);
        }
    }
    forEach(cb) {
        for (let [key, value] of this.kvMap) {
            cb(value, key);
            if (this._vMap !== undefined) {
                const vMap = this._vMap;
                while (vMap.has(value)) {
                    value = vMap.get(value);
                    cb(value, key);
                }
            }
        }
    }
}

/**
 * The conditional instruction represents the basic building block on the runtime side to support
 * built-in "if" and "switch". On the high level this instruction is responsible for adding and
 * removing views selected by a conditional expression.
 *
 * @param matchingTemplateIndex Index of a template TNode representing a conditional view to be
 *     inserted; -1 represents a special case when there is no view to insert.
 * @param contextValue Value that should be exposed as the context of the conditional.
 * @codeGenApi
 */
function ɵɵconditional(matchingTemplateIndex, contextValue) {
    performanceMarkFeature('NgControlFlow');
    const hostLView = getLView();
    const bindingIndex = nextBindingIndex();
    const prevMatchingTemplateIndex = hostLView[bindingIndex] !== NO_CHANGE ? hostLView[bindingIndex] : -1;
    const prevContainer = prevMatchingTemplateIndex !== -1
        ? getLContainer(hostLView, HEADER_OFFSET + prevMatchingTemplateIndex)
        : undefined;
    const viewInContainerIdx = 0;
    if (bindingUpdated(hostLView, bindingIndex, matchingTemplateIndex)) {
        const prevConsumer = setActiveConsumer$1(null);
        try {
            // The index of the view to show changed - remove the previously displayed one
            // (it is a noop if there are no active views in a container).
            if (prevContainer !== undefined) {
                removeLViewFromLContainer(prevContainer, viewInContainerIdx);
            }
            // Index -1 is a special case where none of the conditions evaluates to
            // a truthy value and as the consequence we've got no view to show.
            if (matchingTemplateIndex !== -1) {
                const nextLContainerIndex = HEADER_OFFSET + matchingTemplateIndex;
                const nextContainer = getLContainer(hostLView, nextLContainerIndex);
                const templateTNode = getExistingTNode(hostLView[TVIEW], nextLContainerIndex);
                const dehydratedView = findMatchingDehydratedView(nextContainer, templateTNode.tView.ssrId);
                const embeddedLView = createAndRenderEmbeddedLView(hostLView, templateTNode, contextValue, {
                    dehydratedView,
                });
                addLViewToLContainer(nextContainer, embeddedLView, viewInContainerIdx, shouldAddViewToDom(templateTNode, dehydratedView));
            }
        }
        finally {
            setActiveConsumer$1(prevConsumer);
        }
    }
    else if (prevContainer !== undefined) {
        // We might keep displaying the same template but the actual value of the expression could have
        // changed - re-bind in context.
        const lView = getLViewFromLContainer(prevContainer, viewInContainerIdx);
        if (lView !== undefined) {
            lView[CONTEXT] = contextValue;
        }
    }
}
class RepeaterContext {
    lContainer;
    $implicit;
    $index;
    constructor(lContainer, $implicit, $index) {
        this.lContainer = lContainer;
        this.$implicit = $implicit;
        this.$index = $index;
    }
    get $count() {
        return this.lContainer.length - CONTAINER_HEADER_OFFSET;
    }
}
/**
 * A built-in trackBy function used for situations where users specified collection index as a
 * tracking expression. Having this function body in the runtime avoids unnecessary code generation.
 *
 * @param index
 * @returns
 */
function ɵɵrepeaterTrackByIndex(index) {
    return index;
}
/**
 * A built-in trackBy function used for situations where users specified collection item reference
 * as a tracking expression. Having this function body in the runtime avoids unnecessary code
 * generation.
 *
 * @param index
 * @returns
 */
function ɵɵrepeaterTrackByIdentity(_, value) {
    return value;
}
class RepeaterMetadata {
    hasEmptyBlock;
    trackByFn;
    liveCollection;
    constructor(hasEmptyBlock, trackByFn, liveCollection) {
        this.hasEmptyBlock = hasEmptyBlock;
        this.trackByFn = trackByFn;
        this.liveCollection = liveCollection;
    }
}
/**
 * The repeaterCreate instruction runs in the creation part of the template pass and initializes
 * internal data structures required by the update pass of the built-in repeater logic. Repeater
 * metadata are allocated in the data part of LView with the following layout:
 * - LView[HEADER_OFFSET + index] - metadata
 * - LView[HEADER_OFFSET + index + 1] - reference to a template function rendering an item
 * - LView[HEADER_OFFSET + index + 2] - optional reference to a template function rendering an empty
 * block
 *
 * @param index Index at which to store the metadata of the repeater.
 * @param templateFn Reference to the template of the main repeater block.
 * @param decls The number of nodes, local refs, and pipes for the main block.
 * @param vars The number of bindings for the main block.
 * @param tagName The name of the container element, if applicable
 * @param attrsIndex Index of template attributes in the `consts` array.
 * @param trackByFn Reference to the tracking function.
 * @param trackByUsesComponentInstance Whether the tracking function has any references to the
 *  component instance. If it doesn't, we can avoid rebinding it.
 * @param emptyTemplateFn Reference to the template function of the empty block.
 * @param emptyDecls The number of nodes, local refs, and pipes for the empty block.
 * @param emptyVars The number of bindings for the empty block.
 * @param emptyTagName The name of the empty block container element, if applicable
 * @param emptyAttrsIndex Index of the empty block template attributes in the `consts` array.
 *
 * @codeGenApi
 */
function ɵɵrepeaterCreate(index, templateFn, decls, vars, tagName, attrsIndex, trackByFn, trackByUsesComponentInstance, emptyTemplateFn, emptyDecls, emptyVars, emptyTagName, emptyAttrsIndex) {
    performanceMarkFeature('NgControlFlow');
    ngDevMode &&
        assertFunction(trackByFn, `A track expression must be a function, was ${typeof trackByFn} instead.`);
    const lView = getLView();
    const tView = getTView();
    const hasEmptyBlock = emptyTemplateFn !== undefined;
    const hostLView = getLView();
    const boundTrackBy = trackByUsesComponentInstance
        ? // We only want to bind when necessary, because it produces a
            // new function. For pure functions it's not necessary.
            trackByFn.bind(hostLView[DECLARATION_COMPONENT_VIEW][CONTEXT])
        : trackByFn;
    const metadata = new RepeaterMetadata(hasEmptyBlock, boundTrackBy);
    hostLView[HEADER_OFFSET + index] = metadata;
    declareTemplate(lView, tView, index + 1, templateFn, decls, vars, tagName, getConstant(tView.consts, attrsIndex));
    if (hasEmptyBlock) {
        ngDevMode &&
            assertDefined(emptyDecls, 'Missing number of declarations for the empty repeater block.');
        ngDevMode &&
            assertDefined(emptyVars, 'Missing number of bindings for the empty repeater block.');
        declareTemplate(lView, tView, index + 2, emptyTemplateFn, emptyDecls, emptyVars, emptyTagName, getConstant(tView.consts, emptyAttrsIndex));
    }
}
function isViewExpensiveToRecreate(lView) {
    // assumption: anything more than a text node with a binding is considered "expensive"
    return lView.length - HEADER_OFFSET > 2;
}
class OperationsCounter {
    created = 0;
    destroyed = 0;
    reset() {
        this.created = 0;
        this.destroyed = 0;
    }
    recordCreate() {
        this.created++;
    }
    recordDestroy() {
        this.destroyed++;
    }
    /**
     * A method indicating if the entire collection was re-created as part of the reconciliation pass.
     * Used to warn developers about the usage of a tracking function that might result in excessive
     * amount of view creation / destroy operations.
     *
     * @returns boolean value indicating if a live collection was re-created
     */
    wasReCreated(collectionLen) {
        return collectionLen > 0 && this.created === this.destroyed && this.created === collectionLen;
    }
}
class LiveCollectionLContainerImpl extends LiveCollection {
    lContainer;
    hostLView;
    templateTNode;
    operationsCounter = ngDevMode ? new OperationsCounter() : undefined;
    /**
     Property indicating if indexes in the repeater context need to be updated following the live
     collection changes. Index updates are necessary if and only if views are inserted / removed in
     the middle of LContainer. Adds and removals at the end don't require index updates.
   */
    needsIndexUpdate = false;
    constructor(lContainer, hostLView, templateTNode) {
        super();
        this.lContainer = lContainer;
        this.hostLView = hostLView;
        this.templateTNode = templateTNode;
    }
    get length() {
        return this.lContainer.length - CONTAINER_HEADER_OFFSET;
    }
    at(index) {
        return this.getLView(index)[CONTEXT].$implicit;
    }
    attach(index, lView) {
        const dehydratedView = lView[HYDRATION];
        this.needsIndexUpdate ||= index !== this.length;
        addLViewToLContainer(this.lContainer, lView, index, shouldAddViewToDom(this.templateTNode, dehydratedView));
    }
    detach(index) {
        this.needsIndexUpdate ||= index !== this.length - 1;
        return detachExistingView(this.lContainer, index);
    }
    create(index, value) {
        const dehydratedView = findMatchingDehydratedView(this.lContainer, this.templateTNode.tView.ssrId);
        const embeddedLView = createAndRenderEmbeddedLView(this.hostLView, this.templateTNode, new RepeaterContext(this.lContainer, value, index), { dehydratedView });
        this.operationsCounter?.recordCreate();
        return embeddedLView;
    }
    destroy(lView) {
        destroyLView(lView[TVIEW], lView);
        this.operationsCounter?.recordDestroy();
    }
    updateValue(index, value) {
        this.getLView(index)[CONTEXT].$implicit = value;
    }
    reset() {
        this.needsIndexUpdate = false;
        this.operationsCounter?.reset();
    }
    updateIndexes() {
        if (this.needsIndexUpdate) {
            for (let i = 0; i < this.length; i++) {
                this.getLView(i)[CONTEXT].$index = i;
            }
        }
    }
    getLView(index) {
        return getExistingLViewFromLContainer(this.lContainer, index);
    }
}
/**
 * The repeater instruction does update-time diffing of a provided collection (against the
 * collection seen previously) and maps changes in the collection to views structure (by adding,
 * removing or moving views as needed).
 * @param collection - the collection instance to be checked for changes
 * @codeGenApi
 */
function ɵɵrepeater(collection) {
    const prevConsumer = setActiveConsumer$1(null);
    const metadataSlotIdx = getSelectedIndex();
    try {
        const hostLView = getLView();
        const hostTView = hostLView[TVIEW];
        const metadata = hostLView[metadataSlotIdx];
        const containerIndex = metadataSlotIdx + 1;
        const lContainer = getLContainer(hostLView, containerIndex);
        if (metadata.liveCollection === undefined) {
            const itemTemplateTNode = getExistingTNode(hostTView, containerIndex);
            metadata.liveCollection = new LiveCollectionLContainerImpl(lContainer, hostLView, itemTemplateTNode);
        }
        else {
            metadata.liveCollection.reset();
        }
        const liveCollection = metadata.liveCollection;
        reconcile(liveCollection, collection, metadata.trackByFn);
        // Warn developers about situations where the entire collection was re-created as part of the
        // reconciliation pass. Note that this warning might be "overreacting" and report cases where
        // the collection re-creation is the intended behavior. Still, the assumption is that most of
        // the time it is undesired.
        if (ngDevMode &&
            metadata.trackByFn === ɵɵrepeaterTrackByIdentity &&
            liveCollection.operationsCounter?.wasReCreated(liveCollection.length) &&
            isViewExpensiveToRecreate(getExistingLViewFromLContainer(lContainer, 0))) {
            const message = formatRuntimeError(-956 /* RuntimeErrorCode.LOOP_TRACK_RECREATE */, `The configured tracking expression (track by identity) caused re-creation of the entire collection of size ${liveCollection.length}. ` +
                'This is an expensive operation requiring destruction and subsequent creation of DOM nodes, directives, components etc. ' +
                'Please review the "track expression" and make sure that it uniquely identifies items in a collection.');
            console.warn(message);
        }
        // moves in the container might caused context's index to get out of order, re-adjust if needed
        liveCollection.updateIndexes();
        // handle empty blocks
        if (metadata.hasEmptyBlock) {
            const bindingIndex = nextBindingIndex();
            const isCollectionEmpty = liveCollection.length === 0;
            if (bindingUpdated(hostLView, bindingIndex, isCollectionEmpty)) {
                const emptyTemplateIndex = metadataSlotIdx + 2;
                const lContainerForEmpty = getLContainer(hostLView, emptyTemplateIndex);
                if (isCollectionEmpty) {
                    const emptyTemplateTNode = getExistingTNode(hostTView, emptyTemplateIndex);
                    const dehydratedView = findMatchingDehydratedView(lContainerForEmpty, emptyTemplateTNode.tView.ssrId);
                    const embeddedLView = createAndRenderEmbeddedLView(hostLView, emptyTemplateTNode, undefined, { dehydratedView });
                    addLViewToLContainer(lContainerForEmpty, embeddedLView, 0, shouldAddViewToDom(emptyTemplateTNode, dehydratedView));
                }
                else {
                    removeLViewFromLContainer(lContainerForEmpty, 0);
                }
            }
        }
    }
    finally {
        setActiveConsumer$1(prevConsumer);
    }
}
function getLContainer(lView, index) {
    const lContainer = lView[index];
    ngDevMode && assertLContainer(lContainer);
    return lContainer;
}
function detachExistingView(lContainer, index) {
    const existingLView = detachView(lContainer, index);
    ngDevMode && assertLView(existingLView);
    return existingLView;
}
function getExistingLViewFromLContainer(lContainer, index) {
    const existingLView = getLViewFromLContainer(lContainer, index);
    ngDevMode && assertLView(existingLView);
    return existingLView;
}
function getExistingTNode(tView, index) {
    const tNode = getTNode(tView, index);
    ngDevMode && assertTNode(tNode);
    return tNode;
}

/**
 * Create DOM element. The instruction must later be followed by `elementEnd()` call.
 *
 * @param index Index of the element in the LView array
 * @param name Name of the DOM Node
 * @param attrsIndex Index of the element's attributes in the `consts` array.
 * @param localRefsIndex Index of the element's local references in the `consts` array.
 * @returns This function returns itself so that it may be chained.
 *
 * Attributes and localRefs are passed as an array of strings where elements with an even index
 * hold an attribute name and elements with an odd index hold an attribute value, ex.:
 * ['id', 'warning5', 'class', 'alert']
 *
 * @codeGenApi
 */
function ɵɵelementStart(index, name, attrsIndex, localRefsIndex) {
    const lView = getLView();
    const tView = getTView();
    const adjustedIndex = HEADER_OFFSET + index;
    ngDevMode &&
        assertEqual(getBindingIndex(), tView.bindingStartIndex, 'elements should be created before any bindings');
    ngDevMode && assertIndexInRange(lView, adjustedIndex);
    const renderer = lView[RENDERER];
    const tNode = tView.firstCreatePass
        ? elementStartFirstCreatePass(adjustedIndex, tView, lView, name, findDirectiveDefMatches, getBindingsEnabled(), attrsIndex, localRefsIndex)
        : tView.data[adjustedIndex];
    const native = _locateOrCreateElementNode(tView, lView, tNode, renderer, name, index);
    lView[adjustedIndex] = native;
    const hasDirectives = isDirectiveHost(tNode);
    if (ngDevMode && tView.firstCreatePass) {
        validateElementIsKnown(native, lView, tNode.value, tView.schemas, hasDirectives);
    }
    setCurrentTNode(tNode, true);
    setupStaticAttributes(renderer, native, tNode);
    if (!isDetachedByI18n(tNode) && wasLastNodeCreated()) {
        // In the i18n case, the translation may have removed this element, so only add it if it is not
        // detached. See `TNodeType.Placeholder` and `LFrame.inI18n` for more context.
        appendChild(tView, lView, native, tNode);
    }
    // any immediate children of a component or template container must be pre-emptively
    // monkey-patched with the component view data so that the element can be inspected
    // later on using any element discovery utility methods (see `element_discovery.ts`)
    if (getElementDepthCount() === 0 || hasDirectives) {
        attachPatchData(native, lView);
    }
    increaseElementDepthCount();
    if (hasDirectives) {
        createDirectivesInstances(tView, lView, tNode);
        executeContentQueries(tView, tNode, lView);
    }
    if (localRefsIndex !== null) {
        saveResolvedLocalsInData(lView, tNode);
    }
    return ɵɵelementStart;
}
/**
 * Mark the end of the element.
 * @returns This function returns itself so that it may be chained.
 *
 * @codeGenApi
 */
function ɵɵelementEnd() {
    let currentTNode = getCurrentTNode();
    ngDevMode && assertDefined(currentTNode, 'No parent node to close.');
    if (isCurrentTNodeParent()) {
        setCurrentTNodeAsNotParent();
    }
    else {
        ngDevMode && assertHasParent(getCurrentTNode());
        currentTNode = currentTNode.parent;
        setCurrentTNode(currentTNode, false);
    }
    const tNode = currentTNode;
    ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */);
    if (isSkipHydrationRootTNode(tNode)) {
        leaveSkipHydrationBlock();
    }
    decreaseElementDepthCount();
    const tView = getTView();
    if (tView.firstCreatePass) {
        elementEndFirstCreatePass(tView, tNode);
    }
    if (tNode.classesWithoutHost != null && hasClassInput(tNode)) {
        setDirectiveInputsWhichShadowsStyling(tView, tNode, getLView(), tNode.classesWithoutHost, true);
    }
    if (tNode.stylesWithoutHost != null && hasStyleInput(tNode)) {
        setDirectiveInputsWhichShadowsStyling(tView, tNode, getLView(), tNode.stylesWithoutHost, false);
    }
    return ɵɵelementEnd;
}
/**
 * Creates an empty element using {@link elementStart} and {@link elementEnd}
 *
 * @param index Index of the element in the data array
 * @param name Name of the DOM Node
 * @param attrsIndex Index of the element's attributes in the `consts` array.
 * @param localRefsIndex Index of the element's local references in the `consts` array.
 * @returns This function returns itself so that it may be chained.
 *
 * @codeGenApi
 */
function ɵɵelement(index, name, attrsIndex, localRefsIndex) {
    ɵɵelementStart(index, name, attrsIndex, localRefsIndex);
    ɵɵelementEnd();
    return ɵɵelement;
}
let _locateOrCreateElementNode = (tView, lView, tNode, renderer, name, index) => {
    lastNodeWasCreated(true);
    return createElementNode(renderer, name, getNamespace());
};
/**
 * Enables hydration code path (to lookup existing elements in DOM)
 * in addition to the regular creation mode of element nodes.
 */
function locateOrCreateElementNodeImpl(tView, lView, tNode, renderer, name, index) {
    const hydrationInfo = lView[HYDRATION];
    const isNodeCreationMode = !hydrationInfo ||
        isInSkipHydrationBlock$1() ||
        isDetachedByI18n(tNode) ||
        isDisconnectedNode$1(hydrationInfo, index);
    lastNodeWasCreated(isNodeCreationMode);
    // Regular creation mode.
    if (isNodeCreationMode) {
        return createElementNode(renderer, name, getNamespace());
    }
    // Hydration mode, looking up an existing element in DOM.
    const native = locateNextRNode(hydrationInfo, tView, lView, tNode);
    ngDevMode && validateMatchingNode(native, Node.ELEMENT_NODE, name, lView, tNode);
    ngDevMode && markRNodeAsClaimedByHydration(native);
    // This element might also be an anchor of a view container.
    if (getSerializedContainerViews(hydrationInfo, index)) {
        // Important note: this element acts as an anchor, but it's **not** a part
        // of the embedded view, so we start the segment **after** this element, taking
        // a reference to the next sibling. For example, the following template:
        // `<div #vcrTarget>` is represented in the DOM as `<div></div>...<!--container-->`,
        // so while processing a `<div>` instruction, point to the next sibling as a
        // start of a segment.
        ngDevMode && validateNodeExists(native.nextSibling, lView, tNode);
        setSegmentHead(hydrationInfo, index, native.nextSibling);
    }
    // Checks if the skip hydration attribute is present during hydration so we know to
    // skip attempting to hydrate this block. We check both TNode and RElement for an
    // attribute: the RElement case is needed for i18n cases, when we add it to host
    // elements during the annotation phase (after all internal data structures are setup).
    if (hydrationInfo &&
        (hasSkipHydrationAttrOnTNode(tNode) || hasSkipHydrationAttrOnRElement(native))) {
        if (isComponentHost(tNode)) {
            enterSkipHydrationBlock(tNode);
            // Since this isn't hydratable, we need to empty the node
            // so there's no duplicate content after render
            clearElementContents(native);
            ngDevMode && markRNodeAsSkippedByHydration(native);
        }
        else if (ngDevMode) {
            // If this is not a component host, throw an error.
            // Hydration can be skipped on per-component basis only.
            throw invalidSkipHydrationHost(native);
        }
    }
    return native;
}
function enableLocateOrCreateElementNodeImpl() {
    _locateOrCreateElementNode = locateOrCreateElementNodeImpl;
}

function elementContainerStartFirstCreatePass(index, tView, lView, attrsIndex, localRefsIndex) {
    ngDevMode && ngDevMode.firstCreatePass++;
    const tViewConsts = tView.consts;
    const attrs = getConstant(tViewConsts, attrsIndex);
    const tNode = getOrCreateTNode(tView, index, 8 /* TNodeType.ElementContainer */, 'ng-container', attrs);
    // While ng-container doesn't necessarily support styling, we use the style context to identify
    // and execute directives on the ng-container.
    if (attrs !== null) {
        computeStaticStyling(tNode, attrs, true);
    }
    const localRefs = getConstant(tViewConsts, localRefsIndex);
    if (getBindingsEnabled()) {
        resolveDirectives(tView, lView, tNode, localRefs, findDirectiveDefMatches);
    }
    // Merge the template attrs last so that they have the highest priority.
    tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);
    if (tView.queries !== null) {
        tView.queries.elementStart(tView, tNode);
    }
    return tNode;
}
/**
 * Creates a logical container for other nodes (<ng-container>) backed by a comment node in the DOM.
 * The instruction must later be followed by `elementContainerEnd()` call.
 *
 * @param index Index of the element in the LView array
 * @param attrsIndex Index of the container attributes in the `consts` array.
 * @param localRefsIndex Index of the container's local references in the `consts` array.
 * @returns This function returns itself so that it may be chained.
 *
 * Even if this instruction accepts a set of attributes no actual attribute values are propagated to
 * the DOM (as a comment node can't have attributes). Attributes are here only for directive
 * matching purposes and setting initial inputs of directives.
 *
 * @codeGenApi
 */
function ɵɵelementContainerStart(index, attrsIndex, localRefsIndex) {
    const lView = getLView();
    const tView = getTView();
    const adjustedIndex = index + HEADER_OFFSET;
    ngDevMode && assertIndexInRange(lView, adjustedIndex);
    ngDevMode &&
        assertEqual(getBindingIndex(), tView.bindingStartIndex, 'element containers should be created before any bindings');
    const tNode = tView.firstCreatePass
        ? elementContainerStartFirstCreatePass(adjustedIndex, tView, lView, attrsIndex, localRefsIndex)
        : tView.data[adjustedIndex];
    setCurrentTNode(tNode, true);
    const comment = _locateOrCreateElementContainerNode(tView, lView, tNode, index);
    lView[adjustedIndex] = comment;
    if (wasLastNodeCreated()) {
        appendChild(tView, lView, comment, tNode);
    }
    attachPatchData(comment, lView);
    if (isDirectiveHost(tNode)) {
        createDirectivesInstances(tView, lView, tNode);
        executeContentQueries(tView, tNode, lView);
    }
    if (localRefsIndex != null) {
        saveResolvedLocalsInData(lView, tNode);
    }
    return ɵɵelementContainerStart;
}
/**
 * Mark the end of the <ng-container>.
 * @returns This function returns itself so that it may be chained.
 *
 * @codeGenApi
 */
function ɵɵelementContainerEnd() {
    let currentTNode = getCurrentTNode();
    const tView = getTView();
    if (isCurrentTNodeParent()) {
        setCurrentTNodeAsNotParent();
    }
    else {
        ngDevMode && assertHasParent(currentTNode);
        currentTNode = currentTNode.parent;
        setCurrentTNode(currentTNode, false);
    }
    ngDevMode && assertTNodeType(currentTNode, 8 /* TNodeType.ElementContainer */);
    if (tView.firstCreatePass) {
        registerPostOrderHooks(tView, currentTNode);
        if (isContentQueryHost(currentTNode)) {
            tView.queries.elementEnd(currentTNode);
        }
    }
    return ɵɵelementContainerEnd;
}
/**
 * Creates an empty logical container using {@link elementContainerStart}
 * and {@link elementContainerEnd}
 *
 * @param index Index of the element in the LView array
 * @param attrsIndex Index of the container attributes in the `consts` array.
 * @param localRefsIndex Index of the container's local references in the `consts` array.
 * @returns This function returns itself so that it may be chained.
 *
 * @codeGenApi
 */
function ɵɵelementContainer(index, attrsIndex, localRefsIndex) {
    ɵɵelementContainerStart(index, attrsIndex, localRefsIndex);
    ɵɵelementContainerEnd();
    return ɵɵelementContainer;
}
let _locateOrCreateElementContainerNode = (tView, lView, tNode, index) => {
    lastNodeWasCreated(true);
    return createCommentNode(lView[RENDERER], ngDevMode ? 'ng-container' : '');
};
/**
 * Enables hydration code path (to lookup existing elements in DOM)
 * in addition to the regular creation mode of comment nodes that
 * represent <ng-container>'s anchor.
 */
function locateOrCreateElementContainerNode(tView, lView, tNode, index) {
    let comment;
    const hydrationInfo = lView[HYDRATION];
    const isNodeCreationMode = !hydrationInfo ||
        isInSkipHydrationBlock$1() ||
        isDisconnectedNode$1(hydrationInfo, index) ||
        isDetachedByI18n(tNode);
    lastNodeWasCreated(isNodeCreationMode);
    // Regular creation mode.
    if (isNodeCreationMode) {
        return createCommentNode(lView[RENDERER], ngDevMode ? 'ng-container' : '');
    }
    // Hydration mode, looking up existing elements in DOM.
    const currentRNode = locateNextRNode(hydrationInfo, tView, lView, tNode);
    ngDevMode && validateNodeExists(currentRNode, lView, tNode);
    const ngContainerSize = getNgContainerSize(hydrationInfo, index);
    ngDevMode &&
        assertNumber(ngContainerSize, 'Unexpected state: hydrating an <ng-container>, ' + 'but no hydration info is available.');
    setSegmentHead(hydrationInfo, index, currentRNode);
    comment = siblingAfter(ngContainerSize, currentRNode);
    if (ngDevMode) {
        validateMatchingNode(comment, Node.COMMENT_NODE, null, lView, tNode);
        markRNodeAsClaimedByHydration(comment);
    }
    return comment;
}
function enableLocateOrCreateElementContainerNodeImpl() {
    _locateOrCreateElementContainerNode = locateOrCreateElementContainerNode;
}

/**
 * Returns the current OpaqueViewState instance.
 *
 * Used in conjunction with the restoreView() instruction to save a snapshot
 * of the current view and restore it when listeners are invoked. This allows
 * walking the declaration view tree in listeners to get vars from parent views.
 *
 * @codeGenApi
 */
function ɵɵgetCurrentView() {
    return getLView();
}

/**
 * Update a property on a host element. Only applies to native node properties, not inputs.
 *
 * Operates on the element selected by index via the {@link select} instruction.
 *
 * @param propName Name of property. Because it is going to DOM, this is not subject to
 *        renaming as part of minification.
 * @param value New value to write.
 * @param sanitizer An optional function used to sanitize the value.
 * @returns This function returns itself so that it may be chained
 * (e.g. `property('name', ctx.name)('title', ctx.title)`)
 *
 * @codeGenApi
 */
function ɵɵhostProperty(propName, value, sanitizer) {
    const lView = getLView();
    const bindingIndex = nextBindingIndex();
    if (bindingUpdated(lView, bindingIndex, value)) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, value, lView[RENDERER], sanitizer, true);
        ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);
    }
    return ɵɵhostProperty;
}
/**
 * Updates a synthetic host binding (e.g. `[@foo]`) on a component or directive.
 *
 * This instruction is for compatibility purposes and is designed to ensure that a
 * synthetic host binding (e.g. `@HostBinding('@foo')`) properly gets rendered in
 * the component's renderer. Normally all host bindings are evaluated with the parent
 * component's renderer, but, in the case of animation @triggers, they need to be
 * evaluated with the sub component's renderer (because that's where the animation
 * triggers are defined).
 *
 * Do not use this instruction as a replacement for `elementProperty`. This instruction
 * only exists to ensure compatibility with the ViewEngine's host binding behavior.
 *
 * @param index The index of the element to update in the data array
 * @param propName Name of property. Because it is going to DOM, this is not subject to
 *        renaming as part of minification.
 * @param value New value to write.
 * @param sanitizer An optional function used to sanitize the value.
 *
 * @codeGenApi
 */
function ɵɵsyntheticHostProperty(propName, value, sanitizer) {
    const lView = getLView();
    const bindingIndex = nextBindingIndex();
    if (bindingUpdated(lView, bindingIndex, value)) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        const currentDef = getCurrentDirectiveDef(tView.data);
        const renderer = loadComponentRenderer(currentDef, tNode, lView);
        elementPropertyInternal(tView, tNode, lView, propName, value, renderer, sanitizer, true);
        ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);
    }
    return ɵɵsyntheticHostProperty;
}

// THIS CODE IS GENERATED - DO N   OT MODIFY.
const u = undefined;
function plural(val) {
    const i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, '').length;
    if (i === 1 && v === 0)
        return 1;
    return 5;
}
var localeEn = ["en", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];

/**
 * This const is used to store the locale data registered with `registerLocaleData`
 */
let LOCALE_DATA = {};
/**
 * Register locale data to be used internally by Angular. See the
 * ["I18n guide"](guide/i18n/format-data-locale) to know how to import additional locale
 * data.
 *
 * The signature `registerLocaleData(data: any, extraData?: any)` is deprecated since v5.1
 */
function registerLocaleData(data, localeId, extraData) {
    if (typeof localeId !== 'string') {
        extraData = localeId;
        localeId = data[LocaleDataIndex.LocaleId];
    }
    localeId = localeId.toLowerCase().replace(/_/g, '-');
    LOCALE_DATA[localeId] = data;
    if (extraData) {
        LOCALE_DATA[localeId][LocaleDataIndex.ExtraData] = extraData;
    }
}
/**
 * Finds the locale data for a given locale.
 *
 * @param locale The locale code.
 * @returns The locale data.
 * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
 */
function findLocaleData(locale) {
    const normalizedLocale = normalizeLocale(locale);
    let match = getLocaleData(normalizedLocale);
    if (match) {
        return match;
    }
    // let's try to find a parent locale
    const parentLocale = normalizedLocale.split('-')[0];
    match = getLocaleData(parentLocale);
    if (match) {
        return match;
    }
    if (parentLocale === 'en') {
        return localeEn;
    }
    throw new RuntimeError(701 /* RuntimeErrorCode.MISSING_LOCALE_DATA */, ngDevMode && `Missing locale data for the locale "${locale}".`);
}
/**
 * Retrieves the default currency code for the given locale.
 *
 * The default is defined as the first currency which is still in use.
 *
 * @param locale The code of the locale whose currency code we want.
 * @returns The code of the default currency for the given locale.
 *
 */
function getLocaleCurrencyCode(locale) {
    const data = findLocaleData(locale);
    return data[LocaleDataIndex.CurrencyCode] || null;
}
/**
 * Retrieves the plural function used by ICU expressions to determine the plural case to use
 * for a given locale.
 * @param locale A locale code for the locale format rules to use.
 * @returns The plural function for the locale.
 * @see {@link NgPlural}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 */
function getLocalePluralCase(locale) {
    const data = findLocaleData(locale);
    return data[LocaleDataIndex.PluralCase];
}
/**
 * Helper function to get the given `normalizedLocale` from `LOCALE_DATA`
 * or from the global `ng.common.locale`.
 */
function getLocaleData(normalizedLocale) {
    if (!(normalizedLocale in LOCALE_DATA)) {
        LOCALE_DATA[normalizedLocale] =
            _global.ng &&
                _global.ng.common &&
                _global.ng.common.locales &&
                _global.ng.common.locales[normalizedLocale];
    }
    return LOCALE_DATA[normalizedLocale];
}
/**
 * Helper function to remove all the locale data from `LOCALE_DATA`.
 */
function unregisterAllLocaleData() {
    LOCALE_DATA = {};
}
/**
 * Index of each type of locale data from the locale data array
 */
var LocaleDataIndex;
(function (LocaleDataIndex) {
    LocaleDataIndex[LocaleDataIndex["LocaleId"] = 0] = "LocaleId";
    LocaleDataIndex[LocaleDataIndex["DayPeriodsFormat"] = 1] = "DayPeriodsFormat";
    LocaleDataIndex[LocaleDataIndex["DayPeriodsStandalone"] = 2] = "DayPeriodsStandalone";
    LocaleDataIndex[LocaleDataIndex["DaysFormat"] = 3] = "DaysFormat";
    LocaleDataIndex[LocaleDataIndex["DaysStandalone"] = 4] = "DaysStandalone";
    LocaleDataIndex[LocaleDataIndex["MonthsFormat"] = 5] = "MonthsFormat";
    LocaleDataIndex[LocaleDataIndex["MonthsStandalone"] = 6] = "MonthsStandalone";
    LocaleDataIndex[LocaleDataIndex["Eras"] = 7] = "Eras";
    LocaleDataIndex[LocaleDataIndex["FirstDayOfWeek"] = 8] = "FirstDayOfWeek";
    LocaleDataIndex[LocaleDataIndex["WeekendRange"] = 9] = "WeekendRange";
    LocaleDataIndex[LocaleDataIndex["DateFormat"] = 10] = "DateFormat";
    LocaleDataIndex[LocaleDataIndex["TimeFormat"] = 11] = "TimeFormat";
    LocaleDataIndex[LocaleDataIndex["DateTimeFormat"] = 12] = "DateTimeFormat";
    LocaleDataIndex[LocaleDataIndex["NumberSymbols"] = 13] = "NumberSymbols";
    LocaleDataIndex[LocaleDataIndex["NumberFormats"] = 14] = "NumberFormats";
    LocaleDataIndex[LocaleDataIndex["CurrencyCode"] = 15] = "CurrencyCode";
    LocaleDataIndex[LocaleDataIndex["CurrencySymbol"] = 16] = "CurrencySymbol";
    LocaleDataIndex[LocaleDataIndex["CurrencyName"] = 17] = "CurrencyName";
    LocaleDataIndex[LocaleDataIndex["Currencies"] = 18] = "Currencies";
    LocaleDataIndex[LocaleDataIndex["Directionality"] = 19] = "Directionality";
    LocaleDataIndex[LocaleDataIndex["PluralCase"] = 20] = "PluralCase";
    LocaleDataIndex[LocaleDataIndex["ExtraData"] = 21] = "ExtraData";
})(LocaleDataIndex || (LocaleDataIndex = {}));
/**
 * Returns the canonical form of a locale name - lowercase with `_` replaced with `-`.
 */
function normalizeLocale(locale) {
    return locale.toLowerCase().replace(/_/g, '-');
}

const pluralMapping = ['zero', 'one', 'two', 'few', 'many'];
/**
 * Returns the plural case based on the locale
 */
function getPluralCase(value, locale) {
    const plural = getLocalePluralCase(locale)(parseInt(value, 10));
    const result = pluralMapping[plural];
    return result !== undefined ? result : 'other';
}
/**
 * The locale id that the application is using by default (for translations and ICU expressions).
 */
const DEFAULT_LOCALE_ID = 'en-US';
/**
 * USD currency code that the application uses by default for CurrencyPipe when no
 * DEFAULT_CURRENCY_CODE is provided.
 */
const USD_CURRENCY_CODE = 'USD';

/**
 * Marks that the next string is an element name.
 *
 * See `I18nMutateOpCodes` documentation.
 */
const ELEMENT_MARKER = {
    marker: 'element',
};
/**
 * Marks that the next string is comment text need for ICU.
 *
 * See `I18nMutateOpCodes` documentation.
 */
const ICU_MARKER = {
    marker: 'ICU',
};
/**
 * See `I18nCreateOpCodes`
 */
var I18nCreateOpCode;
(function (I18nCreateOpCode) {
    /**
     * Number of bits to shift index so that it can be combined with the `APPEND_EAGERLY` and
     * `COMMENT`.
     */
    I18nCreateOpCode[I18nCreateOpCode["SHIFT"] = 2] = "SHIFT";
    /**
     * Should the node be appended to parent immediately after creation.
     */
    I18nCreateOpCode[I18nCreateOpCode["APPEND_EAGERLY"] = 1] = "APPEND_EAGERLY";
    /**
     * If set the node should be comment (rather than a text) node.
     */
    I18nCreateOpCode[I18nCreateOpCode["COMMENT"] = 2] = "COMMENT";
})(I18nCreateOpCode || (I18nCreateOpCode = {}));

/**
 * The locale id that the application is currently using (for translations and ICU expressions).
 * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
 * but is now defined as a global value.
 */
let LOCALE_ID$1 = DEFAULT_LOCALE_ID;
/**
 * Sets the locale id that will be used for translations and ICU expressions.
 * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
 * but is now defined as a global value.
 *
 * @param localeId
 */
function setLocaleId(localeId) {
    ngDevMode && assertDefined(localeId, `Expected localeId to be defined`);
    if (typeof localeId === 'string') {
        LOCALE_ID$1 = localeId.toLowerCase().replace(/_/g, '-');
    }
}
/**
 * Gets the locale id that will be used for translations and ICU expressions.
 * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
 * but is now defined as a global value.
 */
function getLocaleId() {
    return LOCALE_ID$1;
}

/**
 * Keep track of which input bindings in `ɵɵi18nExp` have changed.
 *
 * This is used to efficiently update expressions in i18n only when the corresponding input has
 * changed.
 *
 * 1) Each bit represents which of the `ɵɵi18nExp` has changed.
 * 2) There are 32 bits allowed in JS.
 * 3) Bit 32 is special as it is shared for all changes past 32. (In other words if you have more
 * than 32 `ɵɵi18nExp` then all changes past 32nd `ɵɵi18nExp` will be mapped to same bit. This means
 * that we may end up changing more than we need to. But i18n expressions with 32 bindings is rare
 * so in practice it should not be an issue.)
 */
let changeMask = 0b0;
/**
 * Keeps track of which bit needs to be updated in `changeMask`
 *
 * This value gets incremented on every call to `ɵɵi18nExp`
 */
let changeMaskCounter = 0;
/**
 * Keep track of which input bindings in `ɵɵi18nExp` have changed.
 *
 * `setMaskBit` gets invoked by each call to `ɵɵi18nExp`.
 *
 * @param hasChange did `ɵɵi18nExp` detect a change.
 */
function setMaskBit(hasChange) {
    if (hasChange) {
        changeMask = changeMask | (1 << Math.min(changeMaskCounter, 31));
    }
    changeMaskCounter++;
}
function applyI18n(tView, lView, index) {
    if (changeMaskCounter > 0) {
        ngDevMode && assertDefined(tView, `tView should be defined`);
        const tI18n = tView.data[index];
        // When `index` points to an `ɵɵi18nAttributes` then we have an array otherwise `TI18n`
        const updateOpCodes = Array.isArray(tI18n)
            ? tI18n
            : tI18n.update;
        const bindingsStartIndex = getBindingIndex() - changeMaskCounter - 1;
        applyUpdateOpCodes(tView, lView, updateOpCodes, bindingsStartIndex, changeMask);
    }
    // Reset changeMask & maskBit to default for the next update cycle
    changeMask = 0b0;
    changeMaskCounter = 0;
}
function createNodeWithoutHydration(lView, textOrName, nodeType) {
    const renderer = lView[RENDERER];
    switch (nodeType) {
        case Node.COMMENT_NODE:
            return createCommentNode(renderer, textOrName);
        case Node.TEXT_NODE:
            return createTextNode(renderer, textOrName);
        case Node.ELEMENT_NODE:
            return createElementNode(renderer, textOrName, null);
    }
}
let _locateOrCreateNode = (lView, index, textOrName, nodeType) => {
    lastNodeWasCreated(true);
    return createNodeWithoutHydration(lView, textOrName, nodeType);
};
function locateOrCreateNodeImpl(lView, index, textOrName, nodeType) {
    const hydrationInfo = lView[HYDRATION];
    const noOffsetIndex = index - HEADER_OFFSET;
    const isNodeCreationMode = !isI18nHydrationSupportEnabled() ||
        !hydrationInfo ||
        isInSkipHydrationBlock$1() ||
        isDisconnectedNode$1(hydrationInfo, noOffsetIndex);
    lastNodeWasCreated(isNodeCreationMode);
    if (isNodeCreationMode) {
        return createNodeWithoutHydration(lView, textOrName, nodeType);
    }
    const native = locateI18nRNodeByIndex(hydrationInfo, noOffsetIndex);
    // TODO: Improve error handling
    //
    // Other hydration paths use validateMatchingNode() in order to provide
    // detailed information in development mode about the expected DOM.
    // However, not every node in an i18n block has a TNode. Instead, we
    // need to be able to use the AST to generate a similar message.
    ngDevMode && assertDefined(native, 'expected native element');
    ngDevMode && assertEqual(native.nodeType, nodeType, 'expected matching nodeType');
    ngDevMode &&
        nodeType === Node.ELEMENT_NODE &&
        assertEqual(native.tagName.toLowerCase(), textOrName.toLowerCase(), 'expecting matching tagName');
    ngDevMode && markRNodeAsClaimedByHydration(native);
    return native;
}
function enableLocateOrCreateI18nNodeImpl() {
    _locateOrCreateNode = locateOrCreateNodeImpl;
}
/**
 * Apply `I18nCreateOpCodes` op-codes as stored in `TI18n.create`.
 *
 * Creates text (and comment) nodes which are internationalized.
 *
 * @param lView Current lView
 * @param createOpCodes Set of op-codes to apply
 * @param parentRNode Parent node (so that direct children can be added eagerly) or `null` if it is
 *     a root node.
 * @param insertInFrontOf DOM node that should be used as an anchor.
 */
function applyCreateOpCodes(lView, createOpCodes, parentRNode, insertInFrontOf) {
    const renderer = lView[RENDERER];
    for (let i = 0; i < createOpCodes.length; i++) {
        const opCode = createOpCodes[i++];
        const text = createOpCodes[i];
        const isComment = (opCode & I18nCreateOpCode.COMMENT) === I18nCreateOpCode.COMMENT;
        const appendNow = (opCode & I18nCreateOpCode.APPEND_EAGERLY) === I18nCreateOpCode.APPEND_EAGERLY;
        const index = opCode >>> I18nCreateOpCode.SHIFT;
        let rNode = lView[index];
        let lastNodeWasCreated = false;
        if (rNode === null) {
            // We only create new DOM nodes if they don't already exist: If ICU switches case back to a
            // case which was already instantiated, no need to create new DOM nodes.
            rNode = lView[index] = _locateOrCreateNode(lView, index, text, isComment ? Node.COMMENT_NODE : Node.TEXT_NODE);
            lastNodeWasCreated = wasLastNodeCreated();
        }
        if (appendNow && parentRNode !== null && lastNodeWasCreated) {
            nativeInsertBefore(renderer, parentRNode, rNode, insertInFrontOf, false);
        }
    }
}
/**
 * Apply `I18nMutateOpCodes` OpCodes.
 *
 * @param tView Current `TView`
 * @param mutableOpCodes Mutable OpCodes to process
 * @param lView Current `LView`
 * @param anchorRNode place where the i18n node should be inserted.
 */
function applyMutableOpCodes(tView, mutableOpCodes, lView, anchorRNode) {
    ngDevMode && assertDomNode(anchorRNode);
    const renderer = lView[RENDERER];
    // `rootIdx` represents the node into which all inserts happen.
    let rootIdx = null;
    // `rootRNode` represents the real node into which we insert. This can be different from
    // `lView[rootIdx]` if we have projection.
    //  - null we don't have a parent (as can be the case in when we are inserting into a root of
    //    LView which has no parent.)
    //  - `RElement` The element representing the root after taking projection into account.
    let rootRNode;
    for (let i = 0; i < mutableOpCodes.length; i++) {
        const opCode = mutableOpCodes[i];
        if (typeof opCode == 'string') {
            const textNodeIndex = mutableOpCodes[++i];
            if (lView[textNodeIndex] === null) {
                ngDevMode && ngDevMode.rendererCreateTextNode++;
                ngDevMode && assertIndexInRange(lView, textNodeIndex);
                lView[textNodeIndex] = _locateOrCreateNode(lView, textNodeIndex, opCode, Node.TEXT_NODE);
            }
        }
        else if (typeof opCode == 'number') {
            switch (opCode & 1 /* IcuCreateOpCode.MASK_INSTRUCTION */) {
                case 0 /* IcuCreateOpCode.AppendChild */:
                    const parentIdx = getParentFromIcuCreateOpCode(opCode);
                    if (rootIdx === null) {
                        // The first operation should save the `rootIdx` because the first operation
                        // must insert into the root. (Only subsequent operations can insert into a dynamic
                        // parent)
                        rootIdx = parentIdx;
                        rootRNode = renderer.parentNode(anchorRNode);
                    }
                    let insertInFrontOf;
                    let parentRNode;
                    if (parentIdx === rootIdx) {
                        insertInFrontOf = anchorRNode;
                        parentRNode = rootRNode;
                    }
                    else {
                        insertInFrontOf = null;
                        parentRNode = unwrapRNode(lView[parentIdx]);
                    }
                    // FIXME(misko): Refactor with `processI18nText`
                    if (parentRNode !== null) {
                        // This can happen if the `LView` we are adding to is not attached to a parent `LView`.
                        // In such a case there is no "root" we can attach to. This is fine, as we still need to
                        // create the elements. When the `LView` gets later added to a parent these "root" nodes
                        // get picked up and added.
                        ngDevMode && assertDomNode(parentRNode);
                        const refIdx = getRefFromIcuCreateOpCode(opCode);
                        ngDevMode && assertGreaterThan(refIdx, HEADER_OFFSET, 'Missing ref');
                        // `unwrapRNode` is not needed here as all of these point to RNodes as part of the i18n
                        // which can't have components.
                        const child = lView[refIdx];
                        ngDevMode && assertDomNode(child);
                        nativeInsertBefore(renderer, parentRNode, child, insertInFrontOf, false);
                        const tIcu = getTIcu(tView, refIdx);
                        if (tIcu !== null && typeof tIcu === 'object') {
                            // If we just added a comment node which has ICU then that ICU may have already been
                            // rendered and therefore we need to re-add it here.
                            ngDevMode && assertTIcu(tIcu);
                            const caseIndex = getCurrentICUCaseIndex(tIcu, lView);
                            if (caseIndex !== null) {
                                applyMutableOpCodes(tView, tIcu.create[caseIndex], lView, lView[tIcu.anchorIdx]);
                            }
                        }
                    }
                    break;
                case 1 /* IcuCreateOpCode.Attr */:
                    const elementNodeIndex = opCode >>> 1 /* IcuCreateOpCode.SHIFT_REF */;
                    const attrName = mutableOpCodes[++i];
                    const attrValue = mutableOpCodes[++i];
                    // This code is used for ICU expressions only, since we don't support
                    // directives/components in ICUs, we don't need to worry about inputs here
                    setElementAttribute(renderer, getNativeByIndex(elementNodeIndex, lView), null, null, attrName, attrValue, null);
                    break;
                default:
                    if (ngDevMode) {
                        throw new RuntimeError(700 /* RuntimeErrorCode.INVALID_I18N_STRUCTURE */, `Unable to determine the type of mutate operation for "${opCode}"`);
                    }
            }
        }
        else {
            switch (opCode) {
                case ICU_MARKER:
                    const commentValue = mutableOpCodes[++i];
                    const commentNodeIndex = mutableOpCodes[++i];
                    if (lView[commentNodeIndex] === null) {
                        ngDevMode &&
                            assertEqual(typeof commentValue, 'string', `Expected "${commentValue}" to be a comment node value`);
                        ngDevMode && ngDevMode.rendererCreateComment++;
                        ngDevMode && assertIndexInExpandoRange(lView, commentNodeIndex);
                        const commentRNode = (lView[commentNodeIndex] = _locateOrCreateNode(lView, commentNodeIndex, commentValue, Node.COMMENT_NODE));
                        // FIXME(misko): Attaching patch data is only needed for the root (Also add tests)
                        attachPatchData(commentRNode, lView);
                    }
                    break;
                case ELEMENT_MARKER:
                    const tagName = mutableOpCodes[++i];
                    const elementNodeIndex = mutableOpCodes[++i];
                    if (lView[elementNodeIndex] === null) {
                        ngDevMode &&
                            assertEqual(typeof tagName, 'string', `Expected "${tagName}" to be an element node tag name`);
                        ngDevMode && ngDevMode.rendererCreateElement++;
                        ngDevMode && assertIndexInExpandoRange(lView, elementNodeIndex);
                        const elementRNode = (lView[elementNodeIndex] = _locateOrCreateNode(lView, elementNodeIndex, tagName, Node.ELEMENT_NODE));
                        // FIXME(misko): Attaching patch data is only needed for the root (Also add tests)
                        attachPatchData(elementRNode, lView);
                    }
                    break;
                default:
                    ngDevMode &&
                        throwError(`Unable to determine the type of mutate operation for "${opCode}"`);
            }
        }
    }
}
/**
 * Apply `I18nUpdateOpCodes` OpCodes
 *
 * @param tView Current `TView`
 * @param lView Current `LView`
 * @param updateOpCodes OpCodes to process
 * @param bindingsStartIndex Location of the first `ɵɵi18nApply`
 * @param changeMask Each bit corresponds to a `ɵɵi18nExp` (Counting backwards from
 *     `bindingsStartIndex`)
 */
function applyUpdateOpCodes(tView, lView, updateOpCodes, bindingsStartIndex, changeMask) {
    for (let i = 0; i < updateOpCodes.length; i++) {
        // bit code to check if we should apply the next update
        const checkBit = updateOpCodes[i];
        // Number of opCodes to skip until next set of update codes
        const skipCodes = updateOpCodes[++i];
        if (checkBit & changeMask) {
            // The value has been updated since last checked
            let value = '';
            for (let j = i + 1; j <= i + skipCodes; j++) {
                const opCode = updateOpCodes[j];
                if (typeof opCode == 'string') {
                    value += opCode;
                }
                else if (typeof opCode == 'number') {
                    if (opCode < 0) {
                        // Negative opCode represent `i18nExp` values offset.
                        value += renderStringify(lView[bindingsStartIndex - opCode]);
                    }
                    else {
                        const nodeIndex = opCode >>> 2 /* I18nUpdateOpCode.SHIFT_REF */;
                        switch (opCode & 3 /* I18nUpdateOpCode.MASK_OPCODE */) {
                            case 1 /* I18nUpdateOpCode.Attr */:
                                const propName = updateOpCodes[++j];
                                const sanitizeFn = updateOpCodes[++j];
                                const tNodeOrTagName = tView.data[nodeIndex];
                                ngDevMode && assertDefined(tNodeOrTagName, 'Experting TNode or string');
                                if (typeof tNodeOrTagName === 'string') {
                                    // IF we don't have a `TNode`, then we are an element in ICU (as ICU content does
                                    // not have TNode), in which case we know that there are no directives, and hence
                                    // we use attribute setting.
                                    setElementAttribute(lView[RENDERER], lView[nodeIndex], null, tNodeOrTagName, propName, value, sanitizeFn);
                                }
                                else {
                                    elementPropertyInternal(tView, tNodeOrTagName, lView, propName, value, lView[RENDERER], sanitizeFn, false);
                                }
                                break;
                            case 0 /* I18nUpdateOpCode.Text */:
                                const rText = lView[nodeIndex];
                                rText !== null && updateTextNode(lView[RENDERER], rText, value);
                                break;
                            case 2 /* I18nUpdateOpCode.IcuSwitch */:
                                applyIcuSwitchCase(tView, getTIcu(tView, nodeIndex), lView, value);
                                break;
                            case 3 /* I18nUpdateOpCode.IcuUpdate */:
                                applyIcuUpdateCase(tView, getTIcu(tView, nodeIndex), bindingsStartIndex, lView);
                                break;
                        }
                    }
                }
            }
        }
        else {
            const opCode = updateOpCodes[i + 1];
            if (opCode > 0 && (opCode & 3 /* I18nUpdateOpCode.MASK_OPCODE */) === 3 /* I18nUpdateOpCode.IcuUpdate */) {
                // Special case for the `icuUpdateCase`. It could be that the mask did not match, but
                // we still need to execute `icuUpdateCase` because the case has changed recently due to
                // previous `icuSwitchCase` instruction. (`icuSwitchCase` and `icuUpdateCase` always come in
                // pairs.)
                const nodeIndex = opCode >>> 2 /* I18nUpdateOpCode.SHIFT_REF */;
                const tIcu = getTIcu(tView, nodeIndex);
                const currentIndex = lView[tIcu.currentCaseLViewIndex];
                if (currentIndex < 0) {
                    applyIcuUpdateCase(tView, tIcu, bindingsStartIndex, lView);
                }
            }
        }
        i += skipCodes;
    }
}
/**
 * Apply OpCodes associated with updating an existing ICU.
 *
 * @param tView Current `TView`
 * @param tIcu Current `TIcu`
 * @param bindingsStartIndex Location of the first `ɵɵi18nApply`
 * @param lView Current `LView`
 */
function applyIcuUpdateCase(tView, tIcu, bindingsStartIndex, lView) {
    ngDevMode && assertIndexInRange(lView, tIcu.currentCaseLViewIndex);
    let activeCaseIndex = lView[tIcu.currentCaseLViewIndex];
    if (activeCaseIndex !== null) {
        let mask = changeMask;
        if (activeCaseIndex < 0) {
            // Clear the flag.
            // Negative number means that the ICU was freshly created and we need to force the update.
            activeCaseIndex = lView[tIcu.currentCaseLViewIndex] = ~activeCaseIndex;
            // -1 is same as all bits on, which simulates creation since it marks all bits dirty
            mask = -1;
        }
        applyUpdateOpCodes(tView, lView, tIcu.update[activeCaseIndex], bindingsStartIndex, mask);
    }
}
/**
 * Apply OpCodes associated with switching a case on ICU.
 *
 * This involves tearing down existing case and than building up a new case.
 *
 * @param tView Current `TView`
 * @param tIcu Current `TIcu`
 * @param lView Current `LView`
 * @param value Value of the case to update to.
 */
function applyIcuSwitchCase(tView, tIcu, lView, value) {
    // Rebuild a new case for this ICU
    const caseIndex = getCaseIndex(tIcu, value);
    let activeCaseIndex = getCurrentICUCaseIndex(tIcu, lView);
    if (activeCaseIndex !== caseIndex) {
        applyIcuSwitchCaseRemove(tView, tIcu, lView);
        lView[tIcu.currentCaseLViewIndex] = caseIndex === null ? null : ~caseIndex;
        if (caseIndex !== null) {
            // Add the nodes for the new case
            const anchorRNode = lView[tIcu.anchorIdx];
            if (anchorRNode) {
                ngDevMode && assertDomNode(anchorRNode);
                applyMutableOpCodes(tView, tIcu.create[caseIndex], lView, anchorRNode);
            }
            claimDehydratedIcuCase(lView, tIcu.anchorIdx, caseIndex);
        }
    }
}
/**
 * Apply OpCodes associated with tearing ICU case.
 *
 * This involves tearing down existing case and than building up a new case.
 *
 * @param tView Current `TView`
 * @param tIcu Current `TIcu`
 * @param lView Current `LView`
 */
function applyIcuSwitchCaseRemove(tView, tIcu, lView) {
    let activeCaseIndex = getCurrentICUCaseIndex(tIcu, lView);
    if (activeCaseIndex !== null) {
        const removeCodes = tIcu.remove[activeCaseIndex];
        for (let i = 0; i < removeCodes.length; i++) {
            const nodeOrIcuIndex = removeCodes[i];
            if (nodeOrIcuIndex > 0) {
                // Positive numbers are `RNode`s.
                const rNode = getNativeByIndex(nodeOrIcuIndex, lView);
                rNode !== null && nativeRemoveNode(lView[RENDERER], rNode);
            }
            else {
                // Negative numbers are ICUs
                applyIcuSwitchCaseRemove(tView, getTIcu(tView, ~nodeOrIcuIndex), lView);
            }
        }
    }
}
/**
 * Returns the index of the current case of an ICU expression depending on the main binding value
 *
 * @param icuExpression
 * @param bindingValue The value of the main binding used by this ICU expression
 */
function getCaseIndex(icuExpression, bindingValue) {
    let index = icuExpression.cases.indexOf(bindingValue);
    if (index === -1) {
        switch (icuExpression.type) {
            case 1 /* IcuType.plural */: {
                const resolvedCase = getPluralCase(bindingValue, getLocaleId());
                index = icuExpression.cases.indexOf(resolvedCase);
                if (index === -1 && resolvedCase !== 'other') {
                    index = icuExpression.cases.indexOf('other');
                }
                break;
            }
            case 0 /* IcuType.select */: {
                index = icuExpression.cases.indexOf('other');
                break;
            }
        }
    }
    return index === -1 ? null : index;
}

/**
 * Converts `I18nCreateOpCodes` array into a human readable format.
 *
 * This function is attached to the `I18nCreateOpCodes.debug` property if `ngDevMode` is enabled.
 * This function provides a human readable view of the opcodes. This is useful when debugging the
 * application as well as writing more readable tests.
 *
 * @param this `I18nCreateOpCodes` if attached as a method.
 * @param opcodes `I18nCreateOpCodes` if invoked as a function.
 */
function i18nCreateOpCodesToString(opcodes) {
    const createOpCodes = opcodes || (Array.isArray(this) ? this : []);
    let lines = [];
    for (let i = 0; i < createOpCodes.length; i++) {
        const opCode = createOpCodes[i++];
        const text = createOpCodes[i];
        const isComment = (opCode & I18nCreateOpCode.COMMENT) === I18nCreateOpCode.COMMENT;
        const appendNow = (opCode & I18nCreateOpCode.APPEND_EAGERLY) === I18nCreateOpCode.APPEND_EAGERLY;
        const index = opCode >>> I18nCreateOpCode.SHIFT;
        lines.push(`lView[${index}] = document.${isComment ? 'createComment' : 'createText'}(${JSON.stringify(text)});`);
        if (appendNow) {
            lines.push(`parent.appendChild(lView[${index}]);`);
        }
    }
    return lines;
}
/**
 * Converts `I18nUpdateOpCodes` array into a human readable format.
 *
 * This function is attached to the `I18nUpdateOpCodes.debug` property if `ngDevMode` is enabled.
 * This function provides a human readable view of the opcodes. This is useful when debugging the
 * application as well as writing more readable tests.
 *
 * @param this `I18nUpdateOpCodes` if attached as a method.
 * @param opcodes `I18nUpdateOpCodes` if invoked as a function.
 */
function i18nUpdateOpCodesToString(opcodes) {
    const parser = new OpCodeParser(opcodes || (Array.isArray(this) ? this : []));
    let lines = [];
    function consumeOpCode(value) {
        const ref = value >>> 2 /* I18nUpdateOpCode.SHIFT_REF */;
        const opCode = value & 3 /* I18nUpdateOpCode.MASK_OPCODE */;
        switch (opCode) {
            case 0 /* I18nUpdateOpCode.Text */:
                return `(lView[${ref}] as Text).textContent = $$$`;
            case 1 /* I18nUpdateOpCode.Attr */:
                const attrName = parser.consumeString();
                const sanitizationFn = parser.consumeFunction();
                const value = sanitizationFn ? `(${sanitizationFn})($$$)` : '$$$';
                return `(lView[${ref}] as Element).setAttribute('${attrName}', ${value})`;
            case 2 /* I18nUpdateOpCode.IcuSwitch */:
                return `icuSwitchCase(${ref}, $$$)`;
            case 3 /* I18nUpdateOpCode.IcuUpdate */:
                return `icuUpdateCase(${ref})`;
        }
        throw new Error('unexpected OpCode');
    }
    while (parser.hasMore()) {
        let mask = parser.consumeNumber();
        let size = parser.consumeNumber();
        const end = parser.i + size;
        const statements = [];
        let statement = '';
        while (parser.i < end) {
            let value = parser.consumeNumberOrString();
            if (typeof value === 'string') {
                statement += value;
            }
            else if (value < 0) {
                // Negative numbers are ref indexes
                // Here `i` refers to current binding index. It is to signify that the value is relative,
                // rather than absolute.
                statement += '${lView[i' + value + ']}';
            }
            else {
                // Positive numbers are operations.
                const opCodeText = consumeOpCode(value);
                statements.push(opCodeText.replace('$$$', '`' + statement + '`') + ';');
                statement = '';
            }
        }
        lines.push(`if (mask & 0b${mask.toString(2)}) { ${statements.join(' ')} }`);
    }
    return lines;
}
/**
 * Converts `I18nCreateOpCodes` array into a human readable format.
 *
 * This function is attached to the `I18nCreateOpCodes.debug` if `ngDevMode` is enabled. This
 * function provides a human readable view of the opcodes. This is useful when debugging the
 * application as well as writing more readable tests.
 *
 * @param this `I18nCreateOpCodes` if attached as a method.
 * @param opcodes `I18nCreateOpCodes` if invoked as a function.
 */
function icuCreateOpCodesToString(opcodes) {
    const parser = new OpCodeParser(opcodes || (Array.isArray(this) ? this : []));
    let lines = [];
    function consumeOpCode(opCode) {
        const parent = getParentFromIcuCreateOpCode(opCode);
        const ref = getRefFromIcuCreateOpCode(opCode);
        switch (getInstructionFromIcuCreateOpCode(opCode)) {
            case 0 /* IcuCreateOpCode.AppendChild */:
                return `(lView[${parent}] as Element).appendChild(lView[${lastRef}])`;
            case 1 /* IcuCreateOpCode.Attr */:
                return `(lView[${ref}] as Element).setAttribute("${parser.consumeString()}", "${parser.consumeString()}")`;
        }
        throw new Error('Unexpected OpCode: ' + getInstructionFromIcuCreateOpCode(opCode));
    }
    let lastRef = -1;
    while (parser.hasMore()) {
        let value = parser.consumeNumberStringOrMarker();
        if (value === ICU_MARKER) {
            const text = parser.consumeString();
            lastRef = parser.consumeNumber();
            lines.push(`lView[${lastRef}] = document.createComment("${text}")`);
        }
        else if (value === ELEMENT_MARKER) {
            const text = parser.consumeString();
            lastRef = parser.consumeNumber();
            lines.push(`lView[${lastRef}] = document.createElement("${text}")`);
        }
        else if (typeof value === 'string') {
            lastRef = parser.consumeNumber();
            lines.push(`lView[${lastRef}] = document.createTextNode("${value}")`);
        }
        else if (typeof value === 'number') {
            const line = consumeOpCode(value);
            line && lines.push(line);
        }
        else {
            throw new Error('Unexpected value');
        }
    }
    return lines;
}
/**
 * Converts `I18nRemoveOpCodes` array into a human readable format.
 *
 * This function is attached to the `I18nRemoveOpCodes.debug` if `ngDevMode` is enabled. This
 * function provides a human readable view of the opcodes. This is useful when debugging the
 * application as well as writing more readable tests.
 *
 * @param this `I18nRemoveOpCodes` if attached as a method.
 * @param opcodes `I18nRemoveOpCodes` if invoked as a function.
 */
function i18nRemoveOpCodesToString(opcodes) {
    const removeCodes = opcodes || (Array.isArray(this) ? this : []);
    let lines = [];
    for (let i = 0; i < removeCodes.length; i++) {
        const nodeOrIcuIndex = removeCodes[i];
        if (nodeOrIcuIndex > 0) {
            // Positive numbers are `RNode`s.
            lines.push(`remove(lView[${nodeOrIcuIndex}])`);
        }
        else {
            // Negative numbers are ICUs
            lines.push(`removeNestedICU(${~nodeOrIcuIndex})`);
        }
    }
    return lines;
}
class OpCodeParser {
    i = 0;
    codes;
    constructor(codes) {
        this.codes = codes;
    }
    hasMore() {
        return this.i < this.codes.length;
    }
    consumeNumber() {
        let value = this.codes[this.i++];
        assertNumber(value, 'expecting number in OpCode');
        return value;
    }
    consumeString() {
        let value = this.codes[this.i++];
        assertString(value, 'expecting string in OpCode');
        return value;
    }
    consumeFunction() {
        let value = this.codes[this.i++];
        if (value === null || typeof value === 'function') {
            return value;
        }
        throw new Error('expecting function in OpCode');
    }
    consumeNumberOrString() {
        let value = this.codes[this.i++];
        if (typeof value === 'string') {
            return value;
        }
        assertNumber(value, 'expecting number or string in OpCode');
        return value;
    }
    consumeNumberStringOrMarker() {
        let value = this.codes[this.i++];
        if (typeof value === 'string' ||
            typeof value === 'number' ||
            value == ICU_MARKER ||
            value == ELEMENT_MARKER) {
            return value;
        }
        assertNumber(value, 'expecting number, string, ICU_MARKER or ELEMENT_MARKER in OpCode');
        return value;
    }
}

const BINDING_REGEXP = /�(\d+):?\d*�/gi;
const ICU_REGEXP = /({\s*�\d+:?\d*�\s*,\s*\S{6}\s*,[\s\S]*})/gi;
const NESTED_ICU = /�(\d+)�/;
const ICU_BLOCK_REGEXP = /^\s*(�\d+:?\d*�)\s*,\s*(select|plural)\s*,/;
const MARKER = `�`;
const SUBTEMPLATE_REGEXP = /�\/?\*(\d+:\d+)�/gi;
const PH_REGEXP = /�(\/?[#*]\d+):?\d*�/gi;
/**
 * Angular uses the special entity &ngsp; as a placeholder for non-removable space.
 * It's replaced by the 0xE500 PUA (Private Use Areas) unicode character and later on replaced by a
 * space.
 * We are re-implementing the same idea since translations might contain this special character.
 */
const NGSP_UNICODE_REGEXP = /\uE500/g;
function replaceNgsp(value) {
    return value.replace(NGSP_UNICODE_REGEXP, ' ');
}
/**
 * Patch a `debug` property getter on top of the existing object.
 *
 * NOTE: always call this method with `ngDevMode && attachDebugObject(...)`
 *
 * @param obj Object to patch
 * @param debugGetter Getter returning a value to patch
 */
function attachDebugGetter(obj, debugGetter) {
    if (ngDevMode) {
        Object.defineProperty(obj, 'debug', { get: debugGetter, enumerable: false });
    }
    else {
        throw new Error('This method should be guarded with `ngDevMode` so that it can be tree shaken in production!');
    }
}
/**
 * Create dynamic nodes from i18n translation block.
 *
 * - Text nodes are created synchronously
 * - TNodes are linked into tree lazily
 *
 * @param tView Current `TView`
 * @parentTNodeIndex index to the parent TNode of this i18n block
 * @param lView Current `LView`
 * @param index Index of `ɵɵi18nStart` instruction.
 * @param message Message to translate.
 * @param subTemplateIndex Index into the sub template of message translation. (ie in case of
 *     `ngIf`) (-1 otherwise)
 */
function i18nStartFirstCreatePass(tView, parentTNodeIndex, lView, index, message, subTemplateIndex) {
    const rootTNode = getCurrentParentTNode();
    const createOpCodes = [];
    const updateOpCodes = [];
    const existingTNodeStack = [[]];
    const astStack = [[]];
    if (ngDevMode) {
        attachDebugGetter(createOpCodes, i18nCreateOpCodesToString);
        attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);
    }
    message = getTranslationForTemplate(message, subTemplateIndex);
    const msgParts = replaceNgsp(message).split(PH_REGEXP);
    for (let i = 0; i < msgParts.length; i++) {
        let value = msgParts[i];
        if ((i & 1) === 0) {
            // Even indexes are text (including bindings & ICU expressions)
            const parts = i18nParseTextIntoPartsAndICU(value);
            for (let j = 0; j < parts.length; j++) {
                let part = parts[j];
                if ((j & 1) === 0) {
                    // `j` is odd therefore `part` is string
                    const text = part;
                    ngDevMode && assertString(text, 'Parsed ICU part should be string');
                    if (text !== '') {
                        i18nStartFirstCreatePassProcessTextNode(astStack[0], tView, rootTNode, existingTNodeStack[0], createOpCodes, updateOpCodes, lView, text);
                    }
                }
                else {
                    // `j` is Even therefor `part` is an `ICUExpression`
                    const icuExpression = part;
                    // Verify that ICU expression has the right shape. Translations might contain invalid
                    // constructions (while original messages were correct), so ICU parsing at runtime may
                    // not succeed (thus `icuExpression` remains a string).
                    // Note: we intentionally retain the error here by not using `ngDevMode`, because
                    // the value can change based on the locale and users aren't guaranteed to hit
                    // an invalid string while they're developing.
                    if (typeof icuExpression !== 'object') {
                        throw new Error(`Unable to parse ICU expression in "${message}" message.`);
                    }
                    const icuContainerTNode = createTNodeAndAddOpCode(tView, rootTNode, existingTNodeStack[0], lView, createOpCodes, ngDevMode ? `ICU ${index}:${icuExpression.mainBinding}` : '', true);
                    const icuNodeIndex = icuContainerTNode.index;
                    ngDevMode &&
                        assertGreaterThanOrEqual(icuNodeIndex, HEADER_OFFSET, 'Index must be in absolute LView offset');
                    icuStart(astStack[0], tView, lView, updateOpCodes, parentTNodeIndex, icuExpression, icuNodeIndex);
                }
            }
        }
        else {
            // Odd indexes are placeholders (elements and sub-templates)
            // At this point value is something like: '/#1:2' (originally coming from '�/#1:2�')
            const isClosing = value.charCodeAt(0) === 47 /* CharCode.SLASH */;
            const type = value.charCodeAt(isClosing ? 1 : 0);
            ngDevMode && assertOneOf(type, 42 /* CharCode.STAR */, 35 /* CharCode.HASH */);
            const index = HEADER_OFFSET + Number.parseInt(value.substring(isClosing ? 2 : 1));
            if (isClosing) {
                existingTNodeStack.shift();
                astStack.shift();
                setCurrentTNode(getCurrentParentTNode(), false);
            }
            else {
                const tNode = createTNodePlaceholder(tView, existingTNodeStack[0], index);
                existingTNodeStack.unshift([]);
                setCurrentTNode(tNode, true);
                const placeholderNode = {
                    kind: 2 /* I18nNodeKind.PLACEHOLDER */,
                    index,
                    children: [],
                    type: type === 35 /* CharCode.HASH */ ? 0 /* I18nPlaceholderType.ELEMENT */ : 1 /* I18nPlaceholderType.SUBTEMPLATE */,
                };
                astStack[0].push(placeholderNode);
                astStack.unshift(placeholderNode.children);
            }
        }
    }
    tView.data[index] = {
        create: createOpCodes,
        update: updateOpCodes,
        ast: astStack[0],
        parentTNodeIndex,
    };
}
/**
 * Allocate space in i18n Range add create OpCode instruction to create a text or comment node.
 *
 * @param tView Current `TView` needed to allocate space in i18n range.
 * @param rootTNode Root `TNode` of the i18n block. This node determines if the new TNode will be
 *     added as part of the `i18nStart` instruction or as part of the `TNode.insertBeforeIndex`.
 * @param existingTNodes internal state for `addTNodeAndUpdateInsertBeforeIndex`.
 * @param lView Current `LView` needed to allocate space in i18n range.
 * @param createOpCodes Array storing `I18nCreateOpCodes` where new opCodes will be added.
 * @param text Text to be added when the `Text` or `Comment` node will be created.
 * @param isICU true if a `Comment` node for ICU (instead of `Text`) node should be created.
 */
function createTNodeAndAddOpCode(tView, rootTNode, existingTNodes, lView, createOpCodes, text, isICU) {
    const i18nNodeIdx = allocExpando(tView, lView, 1, null);
    let opCode = i18nNodeIdx << I18nCreateOpCode.SHIFT;
    let parentTNode = getCurrentParentTNode();
    if (rootTNode === parentTNode) {
        // FIXME(misko): A null `parentTNode` should represent when we fall of the `LView` boundary.
        // (there is no parent), but in some circumstances (because we are inconsistent about how we set
        // `previousOrParentTNode`) it could point to `rootTNode` So this is a work around.
        parentTNode = null;
    }
    if (parentTNode === null) {
        // If we don't have a parent that means that we can eagerly add nodes.
        // If we have a parent than these nodes can't be added now (as the parent has not been created
        // yet) and instead the `parentTNode` is responsible for adding it. See
        // `TNode.insertBeforeIndex`
        opCode |= I18nCreateOpCode.APPEND_EAGERLY;
    }
    if (isICU) {
        opCode |= I18nCreateOpCode.COMMENT;
        ensureIcuContainerVisitorLoaded(loadIcuContainerVisitor);
    }
    createOpCodes.push(opCode, text === null ? '' : text);
    // We store `{{?}}` so that when looking at debug `TNodeType.template` we can see where the
    // bindings are.
    const tNode = createTNodeAtIndex(tView, i18nNodeIdx, isICU ? 32 /* TNodeType.Icu */ : 1 /* TNodeType.Text */, text === null ? (ngDevMode ? '{{?}}' : '') : text, null);
    addTNodeAndUpdateInsertBeforeIndex(existingTNodes, tNode);
    const tNodeIdx = tNode.index;
    setCurrentTNode(tNode, false /* Text nodes are self closing */);
    if (parentTNode !== null && rootTNode !== parentTNode) {
        // We are a child of deeper node (rather than a direct child of `i18nStart` instruction.)
        // We have to make sure to add ourselves to the parent.
        setTNodeInsertBeforeIndex(parentTNode, tNodeIdx);
    }
    return tNode;
}
/**
 * Processes text node in i18n block.
 *
 * Text nodes can have:
 * - Create instruction in `createOpCodes` for creating the text node.
 * - Allocate spec for text node in i18n range of `LView`
 * - If contains binding:
 *    - bindings => allocate space in i18n range of `LView` to store the binding value.
 *    - populate `updateOpCodes` with update instructions.
 *
 * @param tView Current `TView`
 * @param rootTNode Root `TNode` of the i18n block. This node determines if the new TNode will
 *     be added as part of the `i18nStart` instruction or as part of the
 *     `TNode.insertBeforeIndex`.
 * @param existingTNodes internal state for `addTNodeAndUpdateInsertBeforeIndex`.
 * @param createOpCodes Location where the creation OpCodes will be stored.
 * @param lView Current `LView`
 * @param text The translated text (which may contain binding)
 */
function i18nStartFirstCreatePassProcessTextNode(ast, tView, rootTNode, existingTNodes, createOpCodes, updateOpCodes, lView, text) {
    const hasBinding = text.match(BINDING_REGEXP);
    const tNode = createTNodeAndAddOpCode(tView, rootTNode, existingTNodes, lView, createOpCodes, hasBinding ? null : text, false);
    const index = tNode.index;
    if (hasBinding) {
        generateBindingUpdateOpCodes(updateOpCodes, text, index, null, 0, null);
    }
    ast.push({ kind: 0 /* I18nNodeKind.TEXT */, index });
}
/**
 * See `i18nAttributes` above.
 */
function i18nAttributesFirstPass(tView, index, values) {
    const previousElement = getCurrentTNode();
    const previousElementIndex = previousElement.index;
    const updateOpCodes = [];
    if (ngDevMode) {
        attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);
    }
    if (tView.firstCreatePass && tView.data[index] === null) {
        for (let i = 0; i < values.length; i += 2) {
            const attrName = values[i];
            const message = values[i + 1];
            if (message !== '') {
                // Check if attribute value contains an ICU and throw an error if that's the case.
                // ICUs in element attributes are not supported.
                // Note: we intentionally retain the error here by not using `ngDevMode`, because
                // the `value` can change based on the locale and users aren't guaranteed to hit
                // an invalid string while they're developing.
                if (ICU_REGEXP.test(message)) {
                    throw new Error(`ICU expressions are not supported in attributes. Message: "${message}".`);
                }
                // i18n attributes that hit this code path are guaranteed to have bindings, because
                // the compiler treats static i18n attributes as regular attribute bindings.
                // Since this may not be the first i18n attribute on this element we need to pass in how
                // many previous bindings there have already been.
                generateBindingUpdateOpCodes(updateOpCodes, message, previousElementIndex, attrName, countBindings(updateOpCodes), null);
            }
        }
        tView.data[index] = updateOpCodes;
    }
}
/**
 * Generate the OpCodes to update the bindings of a string.
 *
 * @param updateOpCodes Place where the update opcodes will be stored.
 * @param str The string containing the bindings.
 * @param destinationNode Index of the destination node which will receive the binding.
 * @param attrName Name of the attribute, if the string belongs to an attribute.
 * @param sanitizeFn Sanitization function used to sanitize the string after update, if necessary.
 * @param bindingStart The lView index of the next expression that can be bound via an opCode.
 * @returns The mask value for these bindings
 */
function generateBindingUpdateOpCodes(updateOpCodes, str, destinationNode, attrName, bindingStart, sanitizeFn) {
    ngDevMode &&
        assertGreaterThanOrEqual(destinationNode, HEADER_OFFSET, 'Index must be in absolute LView offset');
    const maskIndex = updateOpCodes.length; // Location of mask
    const sizeIndex = maskIndex + 1; // location of size for skipping
    updateOpCodes.push(null, null); // Alloc space for mask and size
    const startIndex = maskIndex + 2; // location of first allocation.
    if (ngDevMode) {
        attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);
    }
    const textParts = str.split(BINDING_REGEXP);
    let mask = 0;
    for (let j = 0; j < textParts.length; j++) {
        const textValue = textParts[j];
        if (j & 1) {
            // Odd indexes are bindings
            const bindingIndex = bindingStart + parseInt(textValue, 10);
            updateOpCodes.push(-1 - bindingIndex);
            mask = mask | toMaskBit(bindingIndex);
        }
        else if (textValue !== '') {
            // Even indexes are text
            updateOpCodes.push(textValue);
        }
    }
    updateOpCodes.push((destinationNode << 2 /* I18nUpdateOpCode.SHIFT_REF */) |
        (attrName ? 1 /* I18nUpdateOpCode.Attr */ : 0 /* I18nUpdateOpCode.Text */));
    if (attrName) {
        updateOpCodes.push(attrName, sanitizeFn);
    }
    updateOpCodes[maskIndex] = mask;
    updateOpCodes[sizeIndex] = updateOpCodes.length - startIndex;
    return mask;
}
/**
 * Count the number of bindings in the given `opCodes`.
 *
 * It could be possible to speed this up, by passing the number of bindings found back from
 * `generateBindingUpdateOpCodes()` to `i18nAttributesFirstPass()` but this would then require more
 * complexity in the code and/or transient objects to be created.
 *
 * Since this function is only called once when the template is instantiated, is trivial in the
 * first instance (since `opCodes` will be an empty array), and it is not common for elements to
 * contain multiple i18n bound attributes, it seems like this is a reasonable compromise.
 */
function countBindings(opCodes) {
    let count = 0;
    for (let i = 0; i < opCodes.length; i++) {
        const opCode = opCodes[i];
        // Bindings are negative numbers.
        if (typeof opCode === 'number' && opCode < 0) {
            count++;
        }
    }
    return count;
}
/**
 * Convert binding index to mask bit.
 *
 * Each index represents a single bit on the bit-mask. Because bit-mask only has 32 bits, we make
 * the 32nd bit share all masks for all bindings higher than 32. Since it is extremely rare to
 * have more than 32 bindings this will be hit very rarely. The downside of hitting this corner
 * case is that we will execute binding code more often than necessary. (penalty of performance)
 */
function toMaskBit(bindingIndex) {
    return 1 << Math.min(bindingIndex, 31);
}
/**
 * Removes everything inside the sub-templates of a message.
 */
function removeInnerTemplateTranslation(message) {
    let match;
    let res = '';
    let index = 0;
    let inTemplate = false;
    let tagMatched;
    while ((match = SUBTEMPLATE_REGEXP.exec(message)) !== null) {
        if (!inTemplate) {
            res += message.substring(index, match.index + match[0].length);
            tagMatched = match[1];
            inTemplate = true;
        }
        else {
            if (match[0] === `${MARKER}/*${tagMatched}${MARKER}`) {
                index = match.index;
                inTemplate = false;
            }
        }
    }
    ngDevMode &&
        assertEqual(inTemplate, false, `Tag mismatch: unable to find the end of the sub-template in the translation "${message}"`);
    res += message.slice(index);
    return res;
}
/**
 * Extracts a part of a message and removes the rest.
 *
 * This method is used for extracting a part of the message associated with a template. A
 * translated message can span multiple templates.
 *
 * Example:
 * ```html
 * <div i18n>Translate <span *ngIf>me</span>!</div>
 * ```
 *
 * @param message The message to crop
 * @param subTemplateIndex Index of the sub-template to extract. If undefined it returns the
 * external template and removes all sub-templates.
 */
function getTranslationForTemplate(message, subTemplateIndex) {
    if (isRootTemplateMessage(subTemplateIndex)) {
        // We want the root template message, ignore all sub-templates
        return removeInnerTemplateTranslation(message);
    }
    else {
        // We want a specific sub-template
        const start = message.indexOf(`:${subTemplateIndex}${MARKER}`) + 2 + subTemplateIndex.toString().length;
        const end = message.search(new RegExp(`${MARKER}\\/\\*\\d+:${subTemplateIndex}${MARKER}`));
        return removeInnerTemplateTranslation(message.substring(start, end));
    }
}
/**
 * Generate the OpCodes for ICU expressions.
 *
 * @param icuExpression
 * @param index Index where the anchor is stored and an optional `TIcuContainerNode`
 *   - `lView[anchorIdx]` points to a `Comment` node representing the anchor for the ICU.
 *   - `tView.data[anchorIdx]` points to the `TIcuContainerNode` if ICU is root (`null` otherwise)
 */
function icuStart(ast, tView, lView, updateOpCodes, parentIdx, icuExpression, anchorIdx) {
    ngDevMode && assertDefined(icuExpression, 'ICU expression must be defined');
    let bindingMask = 0;
    const tIcu = {
        type: icuExpression.type,
        currentCaseLViewIndex: allocExpando(tView, lView, 1, null),
        anchorIdx,
        cases: [],
        create: [],
        remove: [],
        update: [],
    };
    addUpdateIcuSwitch(updateOpCodes, icuExpression, anchorIdx);
    setTIcu(tView, anchorIdx, tIcu);
    const values = icuExpression.values;
    const cases = [];
    for (let i = 0; i < values.length; i++) {
        // Each value is an array of strings & other ICU expressions
        const valueArr = values[i];
        const nestedIcus = [];
        for (let j = 0; j < valueArr.length; j++) {
            const value = valueArr[j];
            if (typeof value !== 'string') {
                // It is an nested ICU expression
                const icuIndex = nestedIcus.push(value) - 1;
                // Replace nested ICU expression by a comment node
                valueArr[j] = `<!--�${icuIndex}�-->`;
            }
        }
        const caseAst = [];
        cases.push(caseAst);
        bindingMask =
            parseIcuCase(caseAst, tView, tIcu, lView, updateOpCodes, parentIdx, icuExpression.cases[i], valueArr.join(''), nestedIcus) | bindingMask;
    }
    if (bindingMask) {
        addUpdateIcuUpdate(updateOpCodes, bindingMask, anchorIdx);
    }
    ast.push({
        kind: 3 /* I18nNodeKind.ICU */,
        index: anchorIdx,
        cases,
        currentCaseLViewIndex: tIcu.currentCaseLViewIndex,
    });
}
/**
 * Parses text containing an ICU expression and produces a JSON object for it.
 * Original code from closure library, modified for Angular.
 *
 * @param pattern Text containing an ICU expression that needs to be parsed.
 *
 */
function parseICUBlock(pattern) {
    const cases = [];
    const values = [];
    let icuType = 1 /* IcuType.plural */;
    let mainBinding = 0;
    pattern = pattern.replace(ICU_BLOCK_REGEXP, function (str, binding, type) {
        if (type === 'select') {
            icuType = 0 /* IcuType.select */;
        }
        else {
            icuType = 1 /* IcuType.plural */;
        }
        mainBinding = parseInt(binding.slice(1), 10);
        return '';
    });
    const parts = i18nParseTextIntoPartsAndICU(pattern);
    // Looking for (key block)+ sequence. One of the keys has to be "other".
    for (let pos = 0; pos < parts.length;) {
        let key = parts[pos++].trim();
        if (icuType === 1 /* IcuType.plural */) {
            // Key can be "=x", we just want "x"
            key = key.replace(/\s*(?:=)?(\w+)\s*/, '$1');
        }
        if (key.length) {
            cases.push(key);
        }
        const blocks = i18nParseTextIntoPartsAndICU(parts[pos++]);
        if (cases.length > values.length) {
            values.push(blocks);
        }
    }
    // TODO(ocombe): support ICU expressions in attributes, see #21615
    return { type: icuType, mainBinding: mainBinding, cases, values };
}
/**
 * Breaks pattern into strings and top level {...} blocks.
 * Can be used to break a message into text and ICU expressions, or to break an ICU expression
 * into keys and cases. Original code from closure library, modified for Angular.
 *
 * @param pattern (sub)Pattern to be broken.
 * @returns An `Array<string|IcuExpression>` where:
 *   - odd positions: `string` => text between ICU expressions
 *   - even positions: `ICUExpression` => ICU expression parsed into `ICUExpression` record.
 */
function i18nParseTextIntoPartsAndICU(pattern) {
    if (!pattern) {
        return [];
    }
    let prevPos = 0;
    const braceStack = [];
    const results = [];
    const braces = /[{}]/g;
    // lastIndex doesn't get set to 0 so we have to.
    braces.lastIndex = 0;
    let match;
    while ((match = braces.exec(pattern))) {
        const pos = match.index;
        if (match[0] == '}') {
            braceStack.pop();
            if (braceStack.length == 0) {
                // End of the block.
                const block = pattern.substring(prevPos, pos);
                if (ICU_BLOCK_REGEXP.test(block)) {
                    results.push(parseICUBlock(block));
                }
                else {
                    results.push(block);
                }
                prevPos = pos + 1;
            }
        }
        else {
            if (braceStack.length == 0) {
                const substring = pattern.substring(prevPos, pos);
                results.push(substring);
                prevPos = pos + 1;
            }
            braceStack.push('{');
        }
    }
    const substring = pattern.substring(prevPos);
    results.push(substring);
    return results;
}
/**
 * Parses a node, its children and its siblings, and generates the mutate & update OpCodes.
 *
 */
function parseIcuCase(ast, tView, tIcu, lView, updateOpCodes, parentIdx, caseName, unsafeCaseHtml, nestedIcus) {
    const create = [];
    const remove = [];
    const update = [];
    if (ngDevMode) {
        attachDebugGetter(create, icuCreateOpCodesToString);
        attachDebugGetter(remove, i18nRemoveOpCodesToString);
        attachDebugGetter(update, i18nUpdateOpCodesToString);
    }
    tIcu.cases.push(caseName);
    tIcu.create.push(create);
    tIcu.remove.push(remove);
    tIcu.update.push(update);
    const inertBodyHelper = getInertBodyHelper(getDocument());
    const inertBodyElement = inertBodyHelper.getInertBodyElement(unsafeCaseHtml);
    ngDevMode && assertDefined(inertBodyElement, 'Unable to generate inert body element');
    const inertRootNode = getTemplateContent(inertBodyElement) || inertBodyElement;
    if (inertRootNode) {
        return walkIcuTree(ast, tView, tIcu, lView, updateOpCodes, create, remove, update, inertRootNode, parentIdx, nestedIcus, 0);
    }
    else {
        return 0;
    }
}
function walkIcuTree(ast, tView, tIcu, lView, sharedUpdateOpCodes, create, remove, update, parentNode, parentIdx, nestedIcus, depth) {
    let bindingMask = 0;
    let currentNode = parentNode.firstChild;
    while (currentNode) {
        const newIndex = allocExpando(tView, lView, 1, null);
        switch (currentNode.nodeType) {
            case Node.ELEMENT_NODE:
                const element = currentNode;
                const tagName = element.tagName.toLowerCase();
                if (VALID_ELEMENTS.hasOwnProperty(tagName)) {
                    addCreateNodeAndAppend(create, ELEMENT_MARKER, tagName, parentIdx, newIndex);
                    tView.data[newIndex] = tagName;
                    const elAttrs = element.attributes;
                    for (let i = 0; i < elAttrs.length; i++) {
                        const attr = elAttrs.item(i);
                        const lowerAttrName = attr.name.toLowerCase();
                        const hasBinding = !!attr.value.match(BINDING_REGEXP);
                        // we assume the input string is safe, unless it's using a binding
                        if (hasBinding) {
                            if (VALID_ATTRS.hasOwnProperty(lowerAttrName)) {
                                if (URI_ATTRS[lowerAttrName]) {
                                    generateBindingUpdateOpCodes(update, attr.value, newIndex, attr.name, 0, _sanitizeUrl);
                                }
                                else {
                                    generateBindingUpdateOpCodes(update, attr.value, newIndex, attr.name, 0, null);
                                }
                            }
                            else {
                                ngDevMode &&
                                    console.warn(`WARNING: ignoring unsafe attribute value ` +
                                        `${lowerAttrName} on element ${tagName} ` +
                                        `(see ${XSS_SECURITY_URL})`);
                            }
                        }
                        else {
                            addCreateAttribute(create, newIndex, attr);
                        }
                    }
                    const elementNode = {
                        kind: 1 /* I18nNodeKind.ELEMENT */,
                        index: newIndex,
                        children: [],
                    };
                    ast.push(elementNode);
                    // Parse the children of this node (if any)
                    bindingMask =
                        walkIcuTree(elementNode.children, tView, tIcu, lView, sharedUpdateOpCodes, create, remove, update, currentNode, newIndex, nestedIcus, depth + 1) | bindingMask;
                    addRemoveNode(remove, newIndex, depth);
                }
                break;
            case Node.TEXT_NODE:
                const value = currentNode.textContent || '';
                const hasBinding = value.match(BINDING_REGEXP);
                addCreateNodeAndAppend(create, null, hasBinding ? '' : value, parentIdx, newIndex);
                addRemoveNode(remove, newIndex, depth);
                if (hasBinding) {
                    bindingMask =
                        generateBindingUpdateOpCodes(update, value, newIndex, null, 0, null) | bindingMask;
                }
                   ast.push({
                    kind: 0 /* I18nNodeKind.TEXT */,
                    index: newIndex,
                });
                break;
            case Node.COMMENT_NODE:
                // Check if the comment node is a placeholder for a nested ICU
                const isNestedIcu = NESTED_ICU.exec(currentNode.textContent || '');
                if (isNestedIcu) {
                    const nestedIcuIndex = parseInt(isNestedIcu[1], 10);
                    const icuExpression = nestedIcus[nestedIcuIndex];
                    // Create the comment node that will anchor the ICU expression
                    addCreateNodeAndAppend(create, ICU_MARKER, ngDevMode ? `nested ICU ${nestedIcuIndex}` : '', parentIdx, newIndex);
                    icuStart(ast, tView, lView, sharedUpdateOpCodes, parentIdx, icuExpression, newIndex);
                    addRemoveNestedIcu(remove, newIndex, depth);
                }
                break;
        }
        currentNode = currentNode.nextSibling;
    }
    return bindingMask;
}
function addRemoveNode(remove, index, depth) {
    if (depth === 0) {
        remove.push(index);
    }
}
function addRemoveNestedIcu(remove, index, depth) {
    if (depth === 0) {
        remove.push(~index); // remove ICU at `index`
        remove.push(index); // remove ICU comment at `index`
    }
}
function addUpdateIcuSwitch(update, icuExpression, index) {
    update.push(toMaskBit(icuExpression.mainBinding), 2, -1 - icuExpression.mainBinding, (index << 2 /* I18nUpdateOpCode.SHIFT_REF */) | 2 /* I18nUpdateOpCode.IcuSwitch */);
}
function addUpdateIcuUpdate(update, bindingMask, index) {
    update.push(bindingMask, 1, (index << 2 /* I18nUpdateOpCode.SHIFT_REF */) | 3 /* I18nUpdateOpCode.IcuUpdate */);
}
function addCreateNodeAndAppend(create, marker, text, appendToParentIdx, createAtIdx) {
    if (marker !== null) {
        create.push(marker);
    }
    create.push(text, createAtIdx, icuCreateOpCode(0 /* IcuCreateOpCode.AppendChild */, appendToParentIdx, createAtIdx));
}
function addCreateAttribute(create, newIndex, attr) {
    create.push((newIndex << 1 /* IcuCreateOpCode.SHIFT_REF */) | 1 /* IcuCreateOpCode.Attr */, attr.name, attr.value);
}

// i18nPostprocess consts
const ROOT_TEMPLATE_ID = 0;
const PP_MULTI_VALUE_PLACEHOLDERS_REGEXP = /\[(�.+?�?)\]/;
const PP_PLACEHOLDERS_REGEXP = /\[(�.+?�?)\]|(�\/?\*\d+:\d+�)/g;
const PP_ICU_VARS_REGEXP = /({\s*)(VAR_(PLURAL|SELECT)(_\d+)?)(\s*,)/g;
const PP_ICU_PLACEHOLDERS_REGEXP = /{([A-Z0-9_]+)}/g;
const PP_ICUS_REGEXP = /�I18N_EXP_(ICU(_\d+)?)�/g;
const PP_CLOSE_TEMPLATE_REGEXP = /\/\*/;
const PP_TEMPLATE_ID_REGEXP = /\d+\:(\d+)/;
/**
 * Handles message string post-processing for internationalization.
 *
 * Handles message string post-processing by transforming it from intermediate
 * format (that might contain some markers that we need to replace) to the final
 * form, consumable by i18nStart instruction. Post processing steps include:
 *
 * 1. Resolve all multi-value cases (like [�*1:1��#2:1�|�#4:1�|�5�])
 * 2. Replace all ICU vars (like "VAR_PLURAL")
 * 3. Replace all placeholders used inside ICUs in a form of {PLACEHOLDER}
 * 4. Replace all ICU references with corresponding values (like �ICU_EXP_ICU_1�)
 *    in case multiple ICUs have the same placeholder name
 *
 * @param message Raw translation string for post processing
 * @param replacements Set of replacements that should be applied
 *
 * @returns Transformed string that can be consumed by i18nStart instruction
 *
 * @codeGenApi
 */
function i18nPostprocess(message, replacements = {}) {
    /**
     * Step 1: resolve all multi-value placeholders like [�#5�|�*1:1��#2:1�|�#4:1�]
     *
     * Note: due to the way we process nested templates (BFS), multi-value placeholders are typically
     * grouped by templates, for example: [�#5�|�#6�|�#1:1�|�#3:2�] where �#5� and �#6� belong to root
     * template, �#1:1� belong to nested template with index 1 and �#1:2� - nested template with index
     * 3. However in real templates the order might be different: i.e. �#1:1� and/or �#3:2� may go in
     * front of �#6�. The post processing step restores the right order by keeping track of the
     * template id stack and looks for placeholders that belong to the currently active template.
     */
    let result = message;
    if (PP_MULTI_VALUE_PLACEHOLDERS_REGEXP.test(message)) {
        const matches = {};
        const templateIdsStack = [ROOT_TEMPLATE_ID];
        result = result.replace(PP_PLACEHOLDERS_REGEXP, (m, phs, tmpl) => {
            const content = phs || tmpl;
            const placeholders = matches[content] || [];
            if (!placeholders.length) {
                content.split('|').forEach((placeholder) => {
                    const match = placeholder.match(PP_TEMPLATE_ID_REGEXP);
                    const templateId = match ? parseInt(match[1], 10) : ROOT_TEMPLATE_ID;
                    const isCloseTemplateTag = PP_CLOSE_TEMPLATE_REGEXP.test(placeholder);
                    placeholders.push([templateId, isCloseTemplateTag, placeholder]);
                });
                matches[content] = placeholders;
            }
            if (!placeholders.length) {
                throw new Error(`i18n postprocess: unmatched placeholder - ${content}`);
            }
            const currentTemplateId = templateIdsStack[templateIdsStack.length - 1];
            let idx = 0;
            // find placeholder index that matches current template id
            for (let i = 0; i < placeholders.length; i++) {
                if (placeholders[i][0] === currentTemplateId) {
                    idx = i;
                    break;
                }
            }
            // update template id stack based on the current tag extracted
            const [templateId, isCloseTemplateTag, placeholder] = placeholders[idx];
            if (isCloseTemplateTag) {
                templateIdsStack.pop();
            }
            else if (currentTemplateId !== templateId) {
                templateIdsStack.push(templateId);
            }
            // remove processed tag from the list
            placeholders.splice(idx, 1);
            return placeholder;
        });
    }
    // return current result if no replacements specified
    if (!Object.keys(replacements).length) {
        return result;
    }
    /**
     * Step 2: replace all ICU vars (like "VAR_PLURAL")
     */
    result = result.replace(PP_ICU_VARS_REGEXP, (match, start, key, _type, _idx, end) => {
        return replacements.hasOwnProperty(key) ? `${start}${replacements[key]}${end}` : match;
    });
    /**
     * Step 3: replace all placeholders used inside ICUs in a form of {PLACEHOLDER}
     */
    result = result.replace(PP_ICU_PLACEHOLDERS_REGEXP, (match, key) => {
        return replacements.hasOwnProperty(key) ? replacements[key] : match;
    });
    /**
     * Step 4: replace all ICU references with corresponding values (like �ICU_EXP_ICU_1�) in case
     * multiple ICUs have the same placeholder name
     */
    result = result.replace(PP_ICUS_REGEXP, (match, key) => {
        if (replacements.hasOwnProperty(key)) {
            const list = replacements[key];
            if (!list.length) {
                throw new Error(`i18n postprocess: unmatched ICU - ${match} with key: ${key}`);
            }
            return list.shift();
        }
        return match;
    });
    return result;
}

/**
 * Marks a block of text as translatable.
 *
 * The instructions `i18nStart` and `i18nEnd` mark the translation block in the template.
 * The translation `message` is the value which is locale specific. The translation string may
 * contain placeholders which associate inner elements and sub-templates within the translation.
 *
 * The translation `message` placeholders are:
 * - `�{index}(:{block})�`: *Binding Placeholder*: Marks a location where an expression will be
 *   interpolated into. The placeholder `index` points to the expression binding index. An optional
 *   `block` that matches the sub-template in which it was declared.
 * - `�#{index}(:{block})�`/`�/#{index}(:{block})�`: *Element Placeholder*:  Marks the beginning
 *   and end of DOM element that were embedded in the original translation block. The placeholder
 *   `index` points to the element index in the template instructions set. An optional `block` that
 *   matches the sub-template in which it was declared.
 * - `�*{index}:{block}�`/`�/*{index}:{block}�`: *Sub-template Placeholder*: Sub-templates must be
 *   split up and translated separately in each angular template function. The `index` points to the
 *   `template` instruction index. A `block` that matches the sub-template in which it was declared.
 *
 * @param index A unique index of the translation in the static block.
 * @param messageIndex An index of the translation message from the `def.consts` array.
 * @param subTemplateIndex Optional sub-template index in the `message`.
 *
 * @codeGenApi
 */
function ɵɵi18nStart(index, messageIndex, subTemplateIndex = -1) {
    const tView = getTView();
    const lView = getLView();
    const adjustedIndex = HEADER_OFFSET + index;
    ngDevMode && assertDefined(tView, `tView should be defined`);
    const message = getConstant(tView.consts, messageIndex);
    const parentTNode = getCurrentParentTNode();
    if (tView.firstCreatePass) {
        i18nStartFirstCreatePass(tView, parentTNode === null ? 0 : parentTNode.index, lView, adjustedIndex, message, subTemplateIndex);
    }
    // Set a flag that this LView has i18n blocks.
    // The flag is later used to determine whether this component should
    // be hydrated (currently hydration is not supported for i18n blocks).
    if (tView.type === 2 /* TViewType.Embedded */) {
        // Annotate host component's LView (not embedded view's LView),
        // since hydration can be skipped on per-component basis only.
        const componentLView = lView[DECLARATION_COMPONENT_VIEW];
        componentLView[FLAGS] |= 32 /* LViewFlags.HasI18n */;
    }
    else {
        lView[FLAGS] |= 32 /* LViewFlags.HasI18n */;
    }
    const tI18n = tView.data[adjustedIndex];
    const sameViewParentTNode = parentTNode === lView[T_HOST] ? null : parentTNode;
    const parentRNode = getClosestRElement(tView, sameViewParentTNode, lView);
    // If `parentTNode` is an `ElementContainer` than it has `<!--ng-container--->`.
    // When we do inserts we have to make sure to insert in front of `<!--ng-container--->`.
    const insertInFrontOf = parentTNode && parentTNode.type & 8 /* TNodeType.ElementContainer */ ? lView[parentTNode.index] : null;
    prepareI18nBlockForHydration(lView, adjustedIndex, parentTNode, subTemplateIndex);
    applyCreateOpCodes(lView, tI18n.create, parentRNode, insertInFrontOf);
    setInI18nBlock(true);
}
/**
 * Translates a translation block marked by `i18nStart` and `i18nEnd`. It inserts the text/ICU nodes
 * into the render tree, moves the placeholder nodes and removes the deleted nodes.
 *
 * @codeGenApi
 */
function ɵɵi18nEnd() {
    setInI18nBlock(false);
}
/**
 *
 * Use this instruction to create a translation block that doesn't contain any placeholder.
 * It calls both {@link i18nStart} and {@link i18nEnd} in one instruction.
 *
 * The translation `message` is the value which is locale specific. The translation string may
 * contain placeholders which associate inner elements and sub-templates within the translation.
 *
 * The translation `message` placeholders are:
 * - `�{index}(:{block})�`: *Binding Placeholder*: Marks a location where an expression will be
 *   interpolated into. The placeholder `index` points to the expression binding index. An optional
 *   `block` that matches the sub-template in which it was declared.
 * - `�#{index}(:{block})�`/`�/#{index}(:{block})�`: *Element Placeholder*:  Marks the beginning
 *   and end of DOM element that were embedded in the original translation block. The placeholder
 *   `index` points to the element index in the template instructions set. An optional `block` that
 *   matches the sub-template in which it was declared.
 * - `�*{index}:{block}�`/`�/*{index}:{block}�`: *Sub-template Placeholder*: Sub-templates must be
 *   split up and translated separately in each angular template function. The `index` points to the
 *   `template` instruction index. A `block` that matches the sub-template in which it was declared.
 *
 * @param index A unique index of the translation in the static block.
 * @param messageIndex An index of the translation message from the `def.consts` array.
 * @param subTemplateIndex Optional sub-template index in the `message`.
 *
 * @codeGenApi
 */
function ɵɵi18n(index, messageIndex, subTemplateIndex) {
    ɵɵi18nStart(index, messageIndex, subTemplateIndex);
    ɵɵi18nEnd();
}
/**
 * Marks a list of attributes as translatable.
 *
 * @param index A unique index in the static block
 * @param values
 *
 * @codeGenApi
 */
function ɵɵi18nAttributes(index, attrsIndex) {
    const tView = getTView();
    ngDevMode && assertDefined(tView, `tView should be defined`);
    const attrs = getConstant(tView.consts, attrsIndex);
    i18nAttributesFirstPass(tView, index + HEADER_OFFSET, attrs);
}
/**
 * Stores the values of the bindings during each update cycle in order to determine if we need to
 * update the translated nodes.
 *
 * @param value The binding's value
 * @returns This function returns itself so that it may be chained
 * (e.g. `i18nExp(ctx.name)(ctx.title)`)
 *
 * @codeGenApi
 */
function ɵɵi18nExp(value) {
    const lView = getLView();
    setMaskBit(bindingUpdated(lView, nextBindingIndex(), value));
    return ɵɵi18nExp;
}
/**
 * Updates a translation block or an i18n attribute when the bindings have changed.
 *
 * @param index Index of either {@link i18nStart} (translation block) or {@link i18nAttributes}
 * (i18n attribute) on which it should update the content.
 *
 * @codeGenApi
 */
function ɵɵi18nApply(index) {
    applyI18n(getTView(), getLView(), index + HEADER_OFFSET);
}
/**
 * Handles message string post-processing for internationalization.
 *
 * Handles message string post-processing by transforming it from intermediate
 * format (that might contain some markers that we need to replace) to the final
 * form, consumable by i18nStart instruction. Post processing steps include:
 *
 * 1. Resolve all multi-value cases (like [�*1:1��#2:1�|�#4:1�|�5�])
 * 2. Replace all ICU vars (like "VAR_PLURAL")
 * 3. Replace all placeholders used inside ICUs in a form of {PLACEHOLDER}
 * 4. Replace all ICU references with corresponding values (like �ICU_EXP_ICU_1�)
 *    in case multiple ICUs have the same placeholder name
 *
 * @param message Raw translation string for post processing
 * @param replacements Set of replacements that should be applied
 *
 * @returns Transformed string that can be consumed by i18nStart instruction
 *
 * @codeGenApi
 */
function ɵɵi18nPostprocess(message, replacements = {}) {
    return i18nPostprocess(message, replacements);
}

/**
 * Wraps an event listener with a function that marks ancestors dirty and prevents default behavior,
 * if applicable.
 *
 * @param tNode The TNode associated with this listener
 * @param lView The LView that contains this listener
 * @param listenerFn The listener function to call
 * @param wrapWithPreventDefault Whether or not to prevent default behavior
 * (the procedural renderer does this already, so in those cases, we should skip)
 */
function wrapListener(tNode, lView, listenerFn) {
    // Note: we are performing most of the work in the listener function itself
    // to optimize listener registration.
    return function wrapListenerIn_markDirtyAndPreventDefault(e) {
        // Ivy uses `Function` as a special token that allows us to unwrap the function
        // so that it can be invoked programmatically by `DebugNode.triggerEventHandler`.
        if (e === Function) {
            return listenerFn;
        }
        // In order to be backwards compatible with View Engine, events on component host nodes
        // must also mark the component view itself dirty (i.e. the view that it owns).
        const startView = isComponentHost(tNode) ? getComponentLViewByIndex(tNode.index, lView) : lView;
        markViewDirty(startView, 5 /* NotificationSource.Listener */);
        const context = lView[CONTEXT];
        let result = executeListenerWithErrorHandling(lView, context, listenerFn, e);
        // A just-invoked listener function might have coalesced listeners so we need to check for
        // their presence and invoke as needed.
        let nextListenerFn = wrapListenerIn_markDirtyAndPreventDefault.__ngNextListenerFn__;
        while (nextListenerFn) {
            // We should prevent default if any of the listeners explicitly return false
            result = executeListenerWithErrorHandling(lView, context, nextListenerFn, e) && result;
            nextListenerFn = nextListenerFn.__ngNextListenerFn__;
        }
        return result;
    };
}
function executeListenerWithErrorHandling(lView, context, listenerFn, e) {
    const prevConsumer = setActiveConsumer(null);
    try {
        profiler(6 /* ProfilerEvent.OutputStart */, context, listenerFn);
        // Only explicitly returning false from a listener should preventDefault
        return listenerFn(e) !== false;
    }
    catch (error) {
        // TODO(atscott): This should report to the application error handler, not the ErrorHandler on LView injector
        handleError(lView, error);
        return false;
    }
    finally {
        profiler(7 /* ProfilerEvent.OutputEnd */, context, listenerFn);
        setActiveConsumer(prevConsumer);
    }
}
/** Handles an error thrown in an LView. */
function handleError(lView, error) {
    const injector = lView[INJECTOR];
    const errorHandler = injector ? injector.get(ErrorHandler, null) : null;
    errorHandler && errorHandler.handleError(error);
}

function listenToOutput(tNode, lView, directiveIndex, lookupName, eventName, listenerFn) {
    ngDevMode && assertIndexInRange(lView, directiveIndex);
    const instance = lView[directiveIndex];
    const tView = lView[TVIEW];
    const def = tView.data[directiveIndex];
    const propertyName = def.outputs[lookupName];
    const output = instance[propertyName];
    if (ngDevMode && !isOutputSubscribable(output)) {
        throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`);
    }
    // TODO(pk): introduce utility to store cleanup or find a different way of sharing code with listener
    const tCleanup = tView.firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
    const lCleanup = getOrCreateLViewCleanup(lView);
    const subscription = output.subscribe(listenerFn);
    const idx = lCleanup.length;
    lCleanup.push(listenerFn, subscription);
    tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));
}
/**
 * Whether the given value represents a subscribable output.
 *
 * For example, an `EventEmitter, a `Subject`, an `Observable` or an
 * `OutputEmitter`.
 */
function isOutputSubscribable(value) {
    return (value != null && typeof value.subscribe === 'function');
}

/**
 * Adds an event listener to the current node.
 *
 * If an output exists on one of the node's directives, it also subscribes to the output
 * and saves the subscription for later cleanup.
 *
 * @param eventName Name of the event
 * @param listenerFn The function to be called when event emits
 * @param useCapture Whether or not to use capture in event listener - this argument is a reminder
 *     from the Renderer3 infrastructure and should be removed from the instruction arguments
 * @param eventTargetResolver Function that returns global target information in case this listener
 * should be attached to a global object like window, document or body
 *
 * @codeGenApi
 */
function ɵɵlistener(eventName, listenerFn, useCapture, eventTargetResolver) {
    const lView = getLView();
    const tView = getTView();
    const tNode = getCurrentTNode();
    listenerInternal(tView, lView, lView[RENDERER], tNode, eventName, listenerFn, eventTargetResolver);
    return ɵɵlistener;
}
/**
 * Registers a synthetic host listener (e.g. `(@foo.start)`) on a component or directive.
 *
 * This instruction is for compatibility purposes and is designed to ensure that a
 * synthetic host listener (e.g. `@HostListener('@foo.start')`) properly gets rendered
 * in the component's renderer. Normally all host listeners are evaluated with the
 * parent component's renderer, but, in the case of animation @triggers, they need
 * to be evaluated with the sub component's renderer (because that's where the
 * animation triggers are defined).
 *
 * Do not use this instruction as a replacement for `listener`. This instruction
 * only exists to ensure compatibility with the ViewEngine's host binding behavior.
 *
 * @param eventName Name of the event
 * @param listenerFn The function to be called when event emits
 * @param useCapture Whether or not to use capture in event listener
 * @param eventTargetResolver Function that returns global target information in case this listener
 * should be attached to a global object like window, document or body
 *
 * @codeGenApi
 */
function ɵɵsyntheticHostListener(eventName, listenerFn) {
    const tNode = getCurrentTNode();
    const lView = getLView();
    const tView = getTView();
    const currentDef = getCurrentDirectiveDef(tView.data);
    const renderer = loadComponentRenderer(currentDef, tNode, lView);
    listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn);
    return ɵɵsyntheticHostListener;
}
/**
 * A utility function that checks if a given element has already an event handler registered for an
 * event with a specified name. The TView.cleanup data structure is used to find out which events
 * are registered for a given element.
 */
function findExistingListener(tView, lView, eventName, tNodeIdx) {
    const tCleanup = tView.cleanup;
    if (tCleanup != null) {
        for (let i = 0; i < tCleanup.length - 1; i += 2) {
            const cleanupEventName = tCleanup[i];
            if (cleanupEventName === eventName && tCleanup[i + 1] === tNodeIdx) {
                // We have found a matching event name on the same node but it might not have been
                // registered yet, so we must explicitly verify entries in the LView cleanup data
                // structures.
                const lCleanup = lView[CLEANUP];
                const listenerIdxInLCleanup = tCleanup[i + 2];
                return lCleanup.length > listenerIdxInLCleanup ? lCleanup[listenerIdxInLCleanup] : null;
            }
            // TView.cleanup can have a mix of 4-elements entries (for event handler cleanups) or
            // 2-element entries (for directive and queries destroy hooks). As such we can encounter
            // blocks of 4 or 2 items in the tView.cleanup and this is why we iterate over 2 elements
            // first and jump another 2 elements if we detect listeners cleanup (4 elements). Also check
            // documentation of TView.cleanup for more details of this data structure layout.
            if (typeof cleanupEventName === 'string') {
                i += 2;
            }
        }
    }
    return null;
}
function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn, eventTargetResolver) {
    const isTNodeDirectiveHost = isDirectiveHost(tNode);
    const firstCreatePass = tView.firstCreatePass;
    const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
    // When the ɵɵlistener instruction was generated and is executed we know that there is either a
    // native listener or a directive output on this element. As such we we know that we will have to
    // register a listener and store its cleanup function on LView.
    const lCleanup = getOrCreateLViewCleanup(lView);
    ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */);
    let processOutputs = true;
    // Adding a native event listener is applicable when:
    // - The corresponding TNode represents a DOM element.
    // - The event target has a resolver (usually resulting in a global object,
    //   such as `window` or `document`).
    if (tNode.type & 3 /* TNodeType.AnyRNode */ || eventTargetResolver) {
        const native = getNativeByTNode(tNode, lView);
        const target = eventTargetResolver ? eventTargetResolver(native) : native;
        const lCleanupIndex = lCleanup.length;
        const idxOrTargetGetter = eventTargetResolver
            ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
            : tNode.index;
        // In order to match current behavior, native DOM event listeners must be added for all
        // events (including outputs).
        // There might be cases where multiple directives on the same element try to register an event
        // handler function for the same event. In this situation we want to avoid registration of
        // several native listeners as each registration would be intercepted by NgZone and
        // trigger change detection. This would mean that a single user action would result in several
        // change detections being invoked. To avoid this situation we want to have only one call to
        // native handler registration (for the same element and same type of event).
        //
        // In order to have just one native event handler in presence of multiple handler functions,
        // we just register a first handler function as a native event listener and then chain
        // (coalesce) other handler functions on top of the first native handler function.
        let existingListener = null;
        // Please note that the coalescing described here doesn't happen for events specifying an
        // alternative target (ex. (document:click)) - this is to keep backward compatibility with the
        // view engine.
        // Also, we don't have to search for existing listeners is there are no directives
        // matching on a given node as we can't register multiple event handlers for the same event in
        // a template (this would mean having duplicate attributes).
        if (!eventTargetResolver && isTNodeDirectiveHost) {
            existingListener = findExistingListener(tView, lView, eventName, tNode.index);
        }
        if (existingListener !== null) {
            // Attach a new listener to coalesced listeners list, maintaining the order in which
            // listeners are registered. For performance reasons, we keep a reference to the last
            // listener in that list (in `__ngLastListenerFn__` field), so we can avoid going through
            // the entire set each time we need to add a new listener.
            const lastListenerFn = existingListener.__ngLastListenerFn__ || existingListener;
            lastListenerFn.__ngNextListenerFn__ = listenerFn;
            existingListener.__ngLastListenerFn__ = listenerFn;
            processOutputs = false;
        }
        else {
            listenerFn = wrapListener(tNode, lView, listenerFn);
            stashEventListenerImpl(lView, target, eventName, listenerFn);
            const cleanupFn = renderer.listen(target, eventName, listenerFn);
            ngDevMode && ngDevMode.rendererAddEventListener++;
            lCleanup.push(listenerFn, cleanupFn);
            tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, lCleanupIndex + 1);
        }
    }
    else {
        // Even if there is no native listener to add, we still need to wrap the listener so that OnPush
        // ancestors are marked dirty when an event occurs.
        listenerFn = wrapListener(tNode, lView, listenerFn);
    }
    if (processOutputs) {
        const outputConfig = tNode.outputs?.[eventName];
        const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName];
        if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) {
            for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) {
                const index = hostDirectiveOutputConfig[i];
                const lookupName = hostDirectiveOutputConfig[i + 1];
                listenToOutput(tNode, lView, index, lookupName, eventName, listenerFn);
            }
        }
        if (outputConfig && outputConfig.length) {
            for (const index of outputConfig) {
                listenToOutput(tNode, lView, index, eventName, eventName, listenerFn);
            }
        }
    }
}

/**
 * Retrieves a context at the level specified and saves it as the global, contextViewData.
 * Will get the next level up if level is not specified.
 *
 * This is used to save contexts of parent views so they can be bound in embedded views, or
 * in conjunction with reference() to bind a ref from a parent view.
 *
 * @param level The relative level of the view from which to grab context compared to contextVewData
 * @returns context
 *
 * @codeGenApi
 */
function ɵɵnextContext(level = 1) {
    return nextContextImpl(level);
}

/**
 * Checks a given node against matching projection slots and returns the
 * determined slot index. Returns "null" if no slot matched the given node.
 *
 * This function takes into account the parsed ngProjectAs selector from the
 * node's attributes. If present, it will check whether the ngProjectAs selector
 * matches any of the projection slot selectors.
 */
function matchingProjectionSlotIndex(tNode, projectionSlots) {
    let wildcardNgContentIndex = null;
    const ngProjectAsAttrVal = getProjectAsAttrValue(tNode);
    for (let i = 0; i < projectionSlots.length; i++) {
        const slotValue = projectionSlots[i];
        // The last wildcard projection slot should match all nodes which aren't matching
        // any selector. This is necessary to be backwards compatible with view engine.
        if (slotValue === '*') {
            wildcardNgContentIndex = i;
            continue;
        }
        // If we ran into an `ngProjectAs` attribute, we should match its parsed selector
        // to the list of selectors, otherwise we fall back to matching against the node.
        if (ngProjectAsAttrVal === null
            ? isNodeMatchingSelectorList(tNode, slotValue, /* isProjectionMode */ true)
            : isSelectorInSelectorList(ngProjectAsAttrVal, slotValue)) {
            return i; // first matching selector "captures" a given node
        }
    }
    return wildcardNgContentIndex;
}
/**
 * Instruction to distribute projectable nodes among <ng-content> occurrences in a given template.
 * It takes all the selectors from the entire component's template and decides where
 * each projected node belongs (it re-distributes nodes among "buckets" where each "bucket" is
 * backed by a selector).
 *
 * This function requires CSS selectors to be provided in 2 forms: parsed (by a compiler) and text,
 * un-parsed form.
 *
 * The parsed form is needed for efficient matching of a node against a given CSS selector.
 * The un-parsed, textual form is needed for support of the ngProjectAs attribute.
 *
 * Having a CSS selector in 2 different formats is not ideal, but alternatives have even more
 * drawbacks:
 * - having only a textual form would require runtime parsing of CSS selectors;
 * - we can't have only a parsed as we can't re-construct textual form from it (as entered by a
 * template author).
 *
 * @param projectionSlots? A collection of projection slots. A projection slot can be based
 *        on a parsed CSS selectors or set to the wildcard selector ("*") in order to match
 *        all nodes which do not match any selector. If not specified, a single wildcard
 *        selector projection slot will be defined.
 *
 * @codeGenApi
 */
function ɵɵprojectionDef(projectionSlots) {
    const componentNode = getLView()[DECLARATION_COMPONENT_VIEW][T_HOST];
    if (!componentNode.projection) {
        // If no explicit projection slots are defined, fall back to a single
        // projection slot with the wildcard selector.
        const numProjectionSlots = projectionSlots ? projectionSlots.length : 1;
        const projectionHeads = (componentNode.projection = newArray(numProjectionSlots, null));
        const tails = projectionHeads.slice();
        let componentChild = componentNode.child;
        while (componentChild !== null) {
            // Do not project let declarations so they don't occupy a slot.
            if (componentChild.type !== 128 /* TNodeType.LetDeclaration */) {
                const slotIndex = projectionSlots
                    ? matchingProjectionSlotIndex(componentChild, projectionSlots)
                    : 0;
                if (slotIndex !== null) {
                    if (tails[slotIndex]) {
                        tails[slotIndex].projectionNext = componentChild;
                    }
                    else {
                        projectionHeads[slotIndex] = componentChild;
                    }
                    tails[slotIndex] = componentChild;
                }
            }
            componentChild = componentChild.next;
        }
    }
}
/**
 * Inserts previously re-distributed projected nodes. This instruction must be preceded by a call
 * to the projectionDef instruction.
 *
 * @param nodeIndex Index of the projection node.
 * @param selectorIndex Index of the slot selector.
 *  - 0 when the selector is `*` (or unspecified as this is the default value),
 *  - 1 based index of the selector from the {@link projectionDef}
 * @param attrs Static attributes set on the `ng-content` node.
 * @param fallbackTemplateFn Template function with fallback content.
 *   Will be rendered if the slot is empty at runtime.
 * @param fallbackDecls Number of declarations in the fallback template.
 * @param fallbackVars Number of variables in the fallback template.
 *
 * @codeGenApi
 */
function ɵɵprojection(nodeIndex, selectorIndex = 0, attrs, fallbackTemplateFn, fallbackDecls, fallbackVars) {
    const lView = getLView();
    const tView = getTView();
    const fallbackIndex = fallbackTemplateFn ? nodeIndex + 1 : null;
    // Fallback content needs to be declared no matter whether the slot is empty since different
    // instances of the component may or may not insert it. Also it needs to be declare *before*
    // the projection node in order to work correctly with hydration.
    if (fallbackIndex !== null) {
        declareTemplate(lView, tView, fallbackIndex, fallbackTemplateFn, fallbackDecls, fallbackVars, null, attrs);
    }
    const tProjectionNode = getOrCreateTNode(tView, HEADER_OFFSET + nodeIndex, 16 /* TNodeType.Projection */, null, attrs || null);
    // We can't use viewData[HOST_NODE] because projection nodes can be nested in embedded views.
    if (tProjectionNode.projection === null) {
        tProjectionNode.projection = selectorIndex;
    }
    // `<ng-content>` has no content. Even if there's fallback
    // content, the fallback is shown next to it.
    setCurrentTNodeAsNotParent();
    const hydrationInfo = lView[HYDRATION];
    const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock$1();
    const componentHostNode = lView[DECLARATION_COMPONENT_VIEW][T_HOST];
    const isEmpty = componentHostNode.projection[tProjectionNode.projection] === null;
    if (isEmpty && fallbackIndex !== null) {
        insertFallbackContent(lView, tView, fallbackIndex);
    }
    else if (isNodeCreationMode && !isDetachedByI18n(tProjectionNode)) {
        // re-distribution of projectable nodes is stored on a component's view level
        applyProjection(tView, lView, tProjectionNode);
    }
}
/** Inserts the fallback content of a projection slot. Assumes there's no projected content. */
function insertFallbackContent(lView, tView, fallbackIndex) {
    const adjustedIndex = HEADER_OFFSET + fallbackIndex;
    const fallbackTNode = tView.data[adjustedIndex];
    const fallbackLContainer = lView[adjustedIndex];
    ngDevMode && assertTNode(fallbackTNode);
    ngDevMode && assertLContainer(fallbackLContainer);
    const dehydratedView = findMatchingDehydratedView(fallbackLContainer, fallbackTNode.tView.ssrId);
    const fallbackLView = createAndRenderEmbeddedLView(lView, fallbackTNode, undefined, {
        dehydratedView,
    });
    addLViewToLContainer(fallbackLContainer, fallbackLView, 0, shouldAddViewToDom(fallbackTNode, dehydratedView));
}

/**
 *
 * Update an interpolated property on an element with a lone bound value
 *
 * Used when the value passed to a property has 1 interpolated value in it, an no additional text
 * surrounds that interpolated value:
 *
 * ```html
 * <div title="{{v0}}"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate('title', v0);
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate(propName, v0, sanitizer) {
    ɵɵpropertyInterpolate1(propName, '', v0, '', sanitizer);
    return ɵɵpropertyInterpolate;
}
/**
 *
 * Update an interpolated property on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div title="prefix{{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate1('title', 'prefix', v0, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate1(propName, prefix, v0, suffix, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolation1(lView, prefix, v0, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        ngDevMode &&
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - 1, prefix, suffix);
    }
    return ɵɵpropertyInterpolate1;
}
/**
 *
 * Update an interpolated property on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate2('title', 'prefix', v0, '-', v1, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate2(propName, prefix, v0, i0, v1, suffix, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        ngDevMode &&
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - 2, prefix, i0, suffix);
    }
    return ɵɵpropertyInterpolate2;
}
/**
 *
 * Update an interpolated property on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate3(
 * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate3(propName, prefix, v0, i0, v1, i1, v2, suffix, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        ngDevMode &&
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - 3, prefix, i0, i1, suffix);
    }
    return ɵɵpropertyInterpolate3;
}
/**
 *
 * Update an interpolated property on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate4(
 * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate4(propName, prefix, v0, i0, v1, i1, v2, i2, v3, suffix, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        ngDevMode &&
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - 4, prefix, i0, i1, i2, suffix);
    }
    return ɵɵpropertyInterpolate4;
}
/**
 *
 * Update an interpolated property on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate5(
 * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate5(propName, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        ngDevMode &&
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - 5, prefix, i0, i1, i2, i3, suffix);
    }
    return ɵɵpropertyInterpolate5;
}
/**
 *
 * Update an interpolated property on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate6(
 *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate6(propName, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        ngDevMode &&
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - 6, prefix, i0, i1, i2, i3, i4, suffix);
    }
    return ɵɵpropertyInterpolate6;
}
/**
 *
 * Update an interpolated property on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate7(
 *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate7(propName, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        ngDevMode &&
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - 7, prefix, i0, i1, i2, i3, i4, i5, suffix);
    }
    return ɵɵpropertyInterpolate7;
}
/**
 *
 * Update an interpolated property on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate8(
 *  'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolate8(propName, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        ngDevMode &&
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - 8, prefix, i0, i1, i2, i3, i4, i5, i6, suffix);
    }
    return ɵɵpropertyInterpolate8;
}
/**
 * Update an interpolated property on an element with 9 or more bound values surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolateV(
 *  'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update.
 * @param values The collection of values and the strings in between those values, beginning with a
 * string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵpropertyInterpolateV(propName, values, sanitizer) {
    const lView = getLView();
    const interpolatedValue = interpolationV(lView, values);
    if (interpolatedValue !== NO_CHANGE) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, interpolatedValue, lView[RENDERER], sanitizer, false);
        if (ngDevMode) {
            const interpolationInBetween = [values[0]]; // prefix
            for (let i = 2; i < values.length; i += 2) {
                interpolationInBetween.push(values[i]);
            }
            storePropertyBindingMetadata(tView.data, tNode, propName, getBindingIndex() - interpolationInBetween.length + 1, ...interpolationInBetween);
        }
    }
    return ɵɵpropertyInterpolateV;
}

/**
 * Registers a QueryList, associated with a content query, for later refresh (part of a view
 * refresh).
 *
 * @param directiveIndex Current directive index
 * @param predicate The type for which the query will search
 * @param flags Flags associated with the query
 * @param read What to save in the query
 * @returns QueryList<T>
 *
 * @codeGenApi
 */
function ɵɵcontentQuery(directiveIndex, predicate, flags, read) {
    createContentQuery(directiveIndex, predicate, flags, read);
}
/**
 * Creates a new view query by initializing internal data structures.
 *
 * @param predicate The type for which the query will search
 * @param flags Flags associated with the query
 * @param read What to save in the query
 *
 * @codeGenApi
 */
function ɵɵviewQuery(predicate, flags, read) {
    createViewQuery(predicate, flags, read);
}
/**
 * Refreshes a query by combining matches from all active views and removing matches from deleted
 * views.
 *
 * @returns `true` if a query got dirty during change detection or if this is a static query
 * resolving in creation mode, `false` otherwise.
 *
 * @codeGenApi
 */
function ɵɵqueryRefresh(queryList) {
    const lView = getLView();
    const tView = getTView();
    const queryIndex = getCurrentQueryIndex();
    setCurrentQueryIndex(queryIndex + 1);
    const tQuery = getTQuery(tView, queryIndex);
    if (queryList.dirty &&
        isCreationMode(lView) ===
            ((tQuery.metadata.flags & 2 /* QueryFlags.isStatic */) === 2 /* QueryFlags.isStatic */)) {
        if (tQuery.matches === null) {
            queryList.reset([]);
        }
        else {
            const result = getQueryResults(lView, queryIndex);
            queryList.reset(result, unwrapElementRef);
            queryList.notifyOnChanges();
        }
        return true;
    }
    return false;
}
/**
 * Loads a QueryList corresponding to the current view or content query.
 *
 * @codeGenApi
 */
function ɵɵloadQuery() {
    return loadQueryInternal(getLView(), getCurrentQueryIndex());
}

/**
 * Creates a new content query and binds it to a signal created by an authoring function.
 *
 * @param directiveIndex Current directive index
 * @param target The target signal to which the query should be bound
 * @param predicate The type for which the query will search
 * @param flags Flags associated with the query
 * @param read What to save in the query
 *
 * @codeGenApi
 */
function ɵɵcontentQuerySignal(directiveIndex, target, predicate, flags, read) {
    bindQueryToSignal(target, createContentQuery(directiveIndex, predicate, flags, read));
}
/**
 * Creates a new view query by initializing internal data structures and binding a new query to the
 * target signal.
 *
 * @param target The target signal to assign the query results to.
 * @param predicate The type or label that should match a given query
 * @param flags Flags associated with the query
 * @param read What to save in the query
 *
 * @codeGenApi
 */
function ɵɵviewQuerySignal(target, predicate, flags, read) {
    bindQueryToSignal(target, createViewQuery(predicate, flags, read));
}
/**
 * Advances the current query index by a specified offset.
 *
 * Adjusting the current query index is necessary in cases where a given directive has a mix of
 * zone-based and signal-based queries. The signal-based queries don't require tracking of the
 * current index (those are refreshed on demand and not during change detection) so this instruction
 * is only necessary for backward-compatibility.
 *
 * @param index offset to apply to the current query index (defaults to 1)
 *
 * @codeGenApi
 */
function ɵɵqueryAdvance(indexOffset = 1) {
    setCurrentQueryIndex(getCurrentQueryIndex() + indexOffset);
}

/**
 * Retrieves a local reference from the current contextViewData.
 *
 * If the reference to retrieve is in a parent view, this instruction is used in conjunction
 * with a nextContext() call, which walks up the tree and updates the contextViewData instance.
 *
 * @param index The index of the local ref in contextViewData.
 *
 * @codeGenApi
 */
function ɵɵreference(index) {
    const contextLView = getContextLView();
    return load(contextLView, HEADER_OFFSET + index);
}

/**
 *
 * Update an interpolated style on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div style="key: {{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate1('key: ', v0, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵstyleMapInterpolate1(prefix, v0, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation1(lView, prefix, v0, suffix);
    ɵɵstyleMap(interpolatedValue);
}
/**
 *
 * Update an interpolated style on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate2('key: ', v0, '; key1: ', v1, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵstyleMapInterpolate2(prefix, v0, i0, v1, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);
    ɵɵstyleMap(interpolatedValue);
}
/**
 *
 * Update an interpolated style on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key2: {{v1}}; key2: {{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate3(
 *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵstyleMapInterpolate3(prefix, v0, i0, v1, i1, v2, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);
    ɵɵstyleMap(interpolatedValue);
}
/**
 *
 * Update an interpolated style on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate4(
 *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵstyleMapInterpolate4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
    ɵɵstyleMap(interpolatedValue);
}
/**
 *
 * Update an interpolated style on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate5(
 *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵstyleMapInterpolate5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
    ɵɵstyleMap(interpolatedValue);
}
/**
 *
 * Update an interpolated style on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}};
 *             key5: {{v5}}suffix"></d   iv>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate6(
 *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,
 *    'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵstyleMapInterpolate6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
    ɵɵstyleMap(interpolatedValue);
}
/**
 *
 * Update an interpolated style on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};
 *             key6: {{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate7(
 *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,
 *    '; key6: ', v6, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵstyleMapInterpolate7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
    ɵɵstyleMap(interpolatedValue);
}
/**
 *
 * Update an interpolated style on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};
 *             key6: {{v6}}; key7: {{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate8(
 *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,
 *    '; key6: ', v6, '; key7: ', v7, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
function ɵɵstyleMapInterpolate8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix) {
    const lView = getLView();
    const interpolatedValue = interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
    ɵɵstyleMap(interpolatedValue);
}
/**
 * Update an interpolated style on an element with 9 or more bound values surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  class="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};
 *         key6: {{v6}}; key7: {{v7}}; key8: {{v8}}; key9: {{v9}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolateV(
 *    ['key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,
 *     '; key6: ', v6, '; key7: ', v7, '; key8: ', v8, '; key9: ', v9, 'suffix']);
 * ```
 *.
 * @param values The collection of values and the strings in-between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '; key2: ', value1, '; key2: ', value2, ..., value99, 'suffix']`)
 * @codeGenApi
 */
function ɵɵstyleMapInterpolateV(values) {
    const lView = getLView();
    const interpolatedValue = interpolationV(lView, values);
    ɵɵstyleMap(interpolatedValue);
}

/**
 *
 * Update an interpolated style property on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate1(0, 'prefix', v0, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolate1(prop, prefix, v0, suffix, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolation1(lView, prefix, v0, suffix);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolate1;
}
/**
 *
 * Update an interpolated style property on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate2(0, 'prefix', v0, '-', v1, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolate2(prop, prefix, v0, i0, v1, suffix, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolate2;
}
/**
 *
 * Update an interpolated style property on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate3(0, 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolate3(prop, prefix, v0, i0, v1, i1, v2, suffix, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolate3;
}
/**
 *
 * Update an interpolated style property on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate4(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolate4(prop, prefix, v0, i0, v1, i1, v2, i2, v3, suffix, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolate4;
}
/**
 *
 * Update an interpolated style property on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate5(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolate5(prop, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolate5;
}
/**
 *
 * Update an interpolated style property on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate6(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolate6(prop, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolate6;
}
/**
 *
 * Update an interpolated style property on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate7(
 *    0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolate7(prop, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolate7;
}
/**
 *
 * Update an interpolated style property on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate8(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6,
 * '-', v7, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolate8(prop, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolate8;
}
/**
 * Update an interpolated style property on an element with 9 or more bound values surrounded by
 * text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix">
 * </div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolateV(
 *  0, ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`..
 * @param values The collection of values and the strings in-between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵstylePropInterpolateV(prop, values, valueSuffix) {
    const lView = getLView();
    const interpolatedValue = interpolationV(lView, values);
    checkStylingProperty(prop, interpolatedValue, valueSuffix, false);
    return ɵɵstylePropInterpolateV;
}

/**
 * Create static text node
 *
 * @param index Index of the node in the data array
 * @param value Static string value to write.
 *
 * @codeGenApi
 */
function ɵɵtext(index, value = '') {
    const lView = getLView();
    const tView = getTView();
    const adjustedIndex = index + HEADER_OFFSET;
    ngDevMode &&
        assertEqual(getBindingIndex(), tView.bindingStartIndex, 'text nodes should be created before any bindings');
    ngDevMode && assertIndexInRange(lView, adjustedIndex);
    const tNode = tView.firstCreatePass
        ? getOrCreateTNode(tView, adjustedIndex, 1 /* TNodeType.Text */, value, null)
        : tView.data[adjustedIndex];
    const textNative = _locateOrCreateTextNode(tView, lView, tNode, value, index);
    lView[adjustedIndex] = textNative;
    if (wasLastNodeCreated()) {
        appendChild(tView, lView, textNative, tNode);
    }
    // Text nodes are self closing.
    setCurrentTNode(tNode, false);
}
let _locateOrCreateTextNode = (tView, lView, tNode, value, index) => {
    lastNodeWasCreated(true);
    return createTextNode(lView[RENDERER], value);
};
/**
 * Enables hydration code path (to lookup existing elements in DOM)
 * in addition to the regular creation mode of text nodes.
 */
function locateOrCreateTextNodeImpl(tView, lView, tNode, value, index) {
    const hydrationInfo = lView[HYDRATION];
    const isNodeCreationMode = !hydrationInfo ||
        isInSkipHydrationBlock$1() ||
        isDetachedByI18n(tNode) ||
        isDisconnectedNode$1(hydrationInfo, index);
    lastNodeWasCreated(isNodeCreationMode);
    // Regular creation mode.
    if (isNodeCreationMode) {
        return createTextNode(lView[RENDERER], value);
    }
    // Hydration mode, looking up an existing element in DOM.
    const textNative = locateNextRNode(hydrationInfo, tView, lView, tNode);
    ngDevMode && validateMatchingNode(textNative, Node.TEXT_NODE, null, lView, tNode);
    ngDevMode && markRNodeAsClaimedByHydration(textNative);
    return textNative;
}
function enableLocateOrCreateTextNodeImpl() {
    _locateOrCreateTextNode = locateOrCreateTextNodeImpl;
}

/**
 *
 * Update text content with a lone bound value
 *
 * Used when a text node has 1 interpolated value in it, an no additional text
 * surrounds that interpolated value:
 *
 * ```html
 * <div>{{v0}}</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate(v0);
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate(v0) {
    ɵɵtextInterpolate1('', v0, '');
    return ɵɵtextInterpolate;
}
/**
 *
 * Update text content with single bound value surrounded by other text.
 *
 * Used when a text node has 1 interpolated value in it:
 *
 * ```html
 * <div>prefix{{v0}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate1('prefix', v0, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate1(prefix, v0, suffix) {
    const lView = getLView();
    const interpolated = interpolation1(lView, prefix, v0, suffix);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolate1;
}
/**
 *
 * Update text content with 2 bound values surrounded by other text.
 *
 * Used when a text node has 2 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate2('prefix', v0, '-', v1, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate2(prefix, v0, i0, v1, suffix) {
    const lView = getLView();
    const interpolated = interpolation2(lView, prefix, v0, i0, v1, suffix);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolate2;
}
/**
 *
 * Update text content with 3 bound values surrounded by other text.
 *
 * Used when a text node has 3 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate3(
 * 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate3(prefix, v0, i0, v1, i1, v2, suffix) {
    const lView = getLView();
    const interpolated = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolate3;
}
/**
 *
 * Update text content with 4 bound values surrounded by other text.
 *
 * Used when a text node has 4 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate4(
 * 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see ɵɵtextInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix) {
    const lView = getLView();
    const interpolated = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolate4;
}
/**
 *
 * Update text content with 5 bound values surrounded by other text.
 *
 * Used when a text node has 5 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate5(
 * 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix) {
    const lView = getLView();
    const interpolated = interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolate5;
}
/**
 *
 * Update text content with 6 bound values surrounded by other text.
 *
 * Used when a text node has 6 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate6(
 *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change. @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix) {
    const lView = getLView();
    const interpolated = interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolate6;
}
/**
 *
 * Update text content with 7 bound values surrounded by other text.
 *
 * Used when a text node has 7 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate7(
 *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix) {
    const lView = getLView();
    const interpolated = interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolate7;
}
/**
 *
 * Update text content with 8 bound values surrounded by other text.
 *
 * Used when a text node has 8 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate8(
 *  'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
function ɵɵtextInterpolate8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix) {
    const lView = getLView();
    const interpolated = interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolate8;
}
/**
 * Update text content with 9 or more bound values other surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolateV(
 *  ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *.
 * @param values The collection of values and the strings in between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 *
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
function ɵɵtextInterpolateV(values) {
    const lView = getLView();
    const interpolated = interpolationV(lView, values);
    if (interpolated !== NO_CHANGE) {
        textBindingInternal(lView, getSelectedIndex(), interpolated);
    }
    return ɵɵtextInterpolateV;
}
/**
 * Updates a text binding at a given index in a given LView.
 */
function textBindingInternal(lView, index, value) {
    ngDevMode && assertString(value, 'Value should be a string');
    ngDevMode && assertNotSame(value, NO_CHANGE, 'value should not be NO_CHANGE');
    ngDevMode && assertIndexInRange(lView, index);
    const element = getNativeByIndex(index, lView);
    ngDevMode && assertDefined(element, 'native element should exist');
    updateTextNode(lView[RENDERER], element, value);
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Update a two-way bound property on a selected element.
 *
 * Operates on the element selected by index via the {@link select} instruction.
 *
 * @param propName Name of property.
 * @param value New value to write.
 * @param sanitizer An optional function used to sanitize the value.
 * @returns This function returns itself so that it may be chained
 * (e.g. `twoWayProperty('name', ctx.name)('title', ctx.title)`)
 *
 * @codeGenApi
 */
function ɵɵtwoWayProperty(propName, value, sanitizer) {
    // TODO(crisbeto): perf impact of re-evaluating this on each change detection?
    if (isWritableSignal(value)) {
        value = value();
    }
    const lView = getLView();
    const bindingIndex = nextBindingIndex();
    if (bindingUpdated(lView, bindingIndex, value)) {
        const tView = getTView();
        const tNode = getSelectedTNode();
        elementPropertyInternal(tView, tNode, lView, propName, value, lView[RENDERER], sanitizer, false);
        ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);
    }
    return ɵɵtwoWayProperty;
}
/**
 * Function used inside two-way listeners to conditionally set the value of the bound expression.
 *
 * @param target Field on which to set the value.
 * @param value Value to be set to the field.
 *
 * @codeGenApi
 */
function ɵɵtwoWayBindingSet(target, value) {
    const canWrite = isWritableSignal(target);
    canWrite && target.set(value);
    return canWrite;
}
/**
 * Adds an event listener that updates a two-way binding to the current node.
 *
 * @param eventName Name of the event.
 * @param listenerFn The function to be called when event emits.
 *
 * @codeGenApi
 */
function ɵɵtwoWayListener(eventName, listenerFn) {
    const lView = getLView();
    const tView = getTView();
    const tNode = getCurrentTNode();
    listenerInternal(tView, lView, lView[RENDERER], tNode, eventName, listenerFn);
    return ɵɵtwoWayListener;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/** Object that indicates the value of a `@let` declaration that hasn't been initialized yet. */
const UNINITIALIZED_LET = {};
/**
 * Declares an `@let` at a specific data slot. Returns itself to allow chaining.
 *
 * @param index Index at which to declare the `@let`.
 *
 * @codeGenApi
 */
function ɵɵdeclareLet(index) {
    const tView = getTView();
    const lView = getLView();
    const adjustedIndex = index + HEADER_OFFSET;
    const tNode = getOrCreateTNode(tView, adjustedIndex, 128 /* TNodeType.LetDeclaration */, null, null);
    setCurrentTNode(tNode, false);
    store(tView, lView, adjustedIndex, UNINITIALIZED_LET);
    return ɵɵdeclareLet;
}
/**
 * Instruction that stores the value of a `@let` declaration on the current view.
 * Returns the value to allow usage inside variable initializers.
 *
 * @codeGenApi
 */
function ɵɵstoreLet(value) {
    performanceMarkFeature('NgLet');
    const tView = getTView();
    const lView = getLView();
    const index = getSelectedIndex();
    store(tView, lView, index, value);
    return value;
}
/**
 * Retrieves the value of a `@let` declaration defined in a parent view.
 *
 * @param index Index of the declaration within the view.
 *
 * @codeGenApi
 */
function ɵɵreadContextLet(index) {
    const contextLView = getContextLView();
    const value = load(contextLView, HEADER_OFFSET + index);
    if (value === UNINITIALIZED_LET) {
        throw new RuntimeError(314 /* RuntimeErrorCode.UNINITIALIZED_LET_ACCESS */, ngDevMode && 'Attempting to access a @let declaration whose value is not available yet');
    }
    return value;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Sets the location within the source template at which
 * each element in the current view was defined.
 *
 * @param index Index at which the DOM node was created.
 * @param templatePath Path to the template at which the node was defined.
 * @param locations Element locations to which to attach the source location.
 *
 * @codeGenApi
 */
function ɵɵattachSourceLocations(templatePath, locations) {
    const tView = getTView();
    const lView = getLView();
    const renderer = lView[RENDERER];
    const attributeName = 'data-ng-source-location';
    for (const [index, offset, line, column] of locations) {
        const tNode = getTNode(tView, index + HEADER_OFFSET);
        // The compiler shouldn't generate the instruction for non-element nodes, but assert just in case.
        ngDevMode && assertTNodeType(tNode, 2 /* TNodeType.Element */);
        const node = getNativeByIndex(index + HEADER_OFFSET, lView);
        // Set the attribute directly in the DOM so it doesn't participate in directive matching.
        if (!node.hasAttribute(attributeName)) {
            const attributeValue = `${templatePath}@o:${offset},l:${line},c:${column}`;
            renderer.setAttribute(node, attributeName, attributeValue);
        }
    }
}

/**
 * Resolves the providers which are defined in the DirectiveDef.
 *
 * When inserting the tokens and the factories in their respective arrays, we can assume that
 * this method is called first for the component (if any), and then for other directives on the same
 * node.
 * As a consequence,the providers are always processed in that order:
 * 1) The view providers of the component
 * 2) The providers of the component
 * 3) The providers of the other directives
 * This matches the structure of the injectables arrays of a view (for each node).
 * So the tokens and the factories can be pushed at the end of the arrays, except
 * in one case for multi providers.
 *
 * @param def the directive definition
 * @param providers: Array of `providers`.
 * @param viewProviders: Array of `viewProviders`.
 */
function providersResolver(def, providers, viewProviders) {
    const tView = getTView();
    if (tView.firstCreatePass) {
        const isComponent = isComponentDef(def);
        // The list of view providers is processed first, and the flags are updated
        resolveProvider(viewProviders, tView.data, tView.blueprint, isComponent, true);
        // Then, the list of providers is processed, and the flags are updated
        resolveProvider(providers, tView.data, tView.blueprint, isComponent, false);
    }
}
/**
 * Resolves a provider and publishes it to the DI system.
 */
function resolveProvider(provider, tInjectables, lInjectablesBlueprint, isComponent, isViewProvider) {
    provider = resolveForwardRef(provider);
    if (Array.isArray(provider)) {
        // Recursively call `resolveProvider`
        // Recursion is OK in this case because this code will not be in hot-path once we implement
        // cloning of the initial state.
        for (let i = 0; i < provider.length; i++) {
            resolveProvider(provider[i], tInjectables, lInjectablesBlueprint, isComponent, isViewProvider);
        }
    }
    else {
        const tView = getTView();
        const lView = getLView();
        const tNode = getCurrentTNode();
        let token = isTypeProvider(provider) ? provider : resolveForwardRef(provider.provide);
        const providerFactory = providerToFactory(provider);
        if (ngDevMode) {
            const injector = new NodeInjector(tNode, lView);
            runInInjectorProfilerContext(injector, token, () => {
                emitProviderConfiguredEvent(provider, isViewProvider);
            });
        }
        const beginIndex = tNode.providerIndexes & 1048575 /* TNodeProviderIndexes.ProvidersStartIndexMask */;
        const endIndex = tNode.directiveStart;
        const cptViewProvidersCount = tNode.providerIndexes >> 20 /* TNodeProviderIndexes.CptViewProvidersCountShift */;
        if (isTypeProvider(provider) || !provider.multi) {
            // Single provider case: the factory is created and pushed immediately
            const factory = new NodeInjectorFactory(providerFactory, isViewProvider, ɵɵdirectiveInject);
            const existingFactoryIndex = indexOf(token, tInjectables, isViewProvider ? beginIndex : beginIndex + cptViewProvidersCount, endIndex);
            if (existingFactoryIndex === -1) {
                diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, token);
                registerDestroyHooksIfSupported(tView, provider, tInjectables.length);
                tInjectables.push(token);
                tNode.directiveStart++;
                tNode.directiveEnd++;
                if (isViewProvider) {
                    tNode.providerIndexes += 1048576 /* TNodeProviderIndexes.CptViewProvidersCountShifter */;
                }
                lInjectablesBlueprint.push(factory);
                lView.push(factory);
            }
            else {
                lInjectablesBlueprint[existingFactoryIndex] = factory;
                lView[existingFactoryIndex] = factory;
            }
        }
        else {
            // Multi provider case:
            // We create a multi factory which is going to aggregate all the values.
            // Since the output of such a factory depends on content or view injection,
            // we create two of them, which are linked together.
            //
            // The first one (for view providers) is always in the first block of the injectables array,
            // and the second one (for providers) is always in the second block.
            // This is important because view providers have higher priority. When a multi token
            // is being looked up, the view providers should be found first.
            // Note that it is not possible to have a multi factory in the third block (directive block).
            //
            // The algorithm to process multi providers is as follows:
            // 1) If the multi provider comes from the `viewProviders` of the component:
            //   a) If the special view providers factory doesn't exist, it is created and pushed.
            //   b) Else, the multi provider is added to the existing multi factory.
            // 2) If the multi provider comes from the `providers` of the component or of another
            // directive:
            //   a) If the multi factory doesn't exist, it is created and provider pushed into it.
            //      It is also linked to the multi factory for view providers, if it exists.
            //   b) Else, the multi provider is added to the existing multi factory.
            const existingProvidersFactoryIndex = indexOf(token, tInjectables, beginIndex + cptViewProvidersCount, endIndex);
            const existingViewProvidersFactoryIndex = indexOf(token, tInjectables, beginIndex, beginIndex + cptViewProvidersCount);
            const doesProvidersFactoryExist = existingProvidersFactoryIndex >= 0 && lInjectablesBlueprint[existingProvidersFactoryIndex];
            const doesViewProvidersFactoryExist = existingViewProvidersFactoryIndex >= 0 &&
                lInjectablesBlueprint[existingViewProvidersFactoryIndex];
            if ((isViewProvider && !doesViewProvidersFactoryExist) ||
                (!isViewProvider && !doesProvidersFactoryExist)) {
                // Cases 1.a and 2.a
                diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, token);
                const factory = multiFactory(isViewProvider ? multiViewProvidersFactoryResolver : multiProvidersFactoryResolver, lInjectablesBlueprint.length, isViewProvider, isComponent, providerFactory);
                if (!isViewProvider && doesViewProvidersFactoryExist) {
                    lInjectablesBlueprint[existingViewProvidersFactoryIndex].providerFactory = factory;
                }
                registerDestroyHooksIfSupported(tView, provider, tInjectables.length, 0);
                tInjectables.push(token);
                tNode.directiveStart++;
                tNode.directiveEnd++;
                if (isViewProvider) {
                    tNode.providerIndexes += 1048576 /* TNodeProviderIndexes.CptViewProvidersCountShifter */;
                }
                lInjectablesBlueprint.push(factory);
                lView.push(factory);
            }
            else {
                // Cases 1.b and 2.b
                const indexInFactory = multiFactoryAdd(lInjectablesBlueprint[isViewProvider ? existingViewProvidersFactoryIndex : existingProvidersFactoryIndex], providerFactory, !isViewProvider && isComponent);
                registerDestroyHooksIfSupported(tView, provider, existingProvidersFactoryIndex > -1
                    ? existingProvidersFactoryIndex
                    : existingViewProvidersFactoryIndex, indexInFactory);
            }
            if (!isViewProvider && isComponent && doesViewProvidersFactoryExist) {
                lInjectablesBlueprint[existingViewProvidersFactoryIndex].componentProviders++;
            }
        }
    }
}
/**
 * Registers the `ngOnDestroy` hook of a provider, if the provider supports destroy hooks.
 * @param tView `TView` in which to register the hook.
 * @param provider Provider whose hook should be registered.
 * @param contextIndex Index under which to find the context for the hook when it's being invoked.
 * @param indexInFactory Only required for `multi` providers. Index of the provider in the multi
 * provider factory.
 */
function registerDestroyHooksIfSupported(tView, provider, contextIndex, indexInFactory) {
    const providerIsTypeProvider = isTypeProvider(provider);
    const providerIsClassProvider = isClassProvider(provider);
    if (providerIsTypeProvider || providerIsClassProvider) {
        // Resolve forward references as `useClass` can hold a forward reference.
        const classToken = providerIsClassProvider ? resolveForwardRef(provider.useClass) : provider;
        const prototype = classToken.prototype;
        const ngOnDestroy = prototype.ngOnDestroy;
        if (ngOnDestroy) {
            const hooks = tView.destroyHooks || (tView.destroyHooks = []);
            if (!providerIsTypeProvider && provider.multi) {
                ngDevMode &&
                    assertDefined(indexInFactory, 'indexInFactory when registering multi factory destroy hook');
                const existingCallbacksIndex = hooks.indexOf(contextIndex);
                if (existingCallbacksIndex === -1) {
                    hooks.push(contextIndex, [indexInFactory, ngOnDestroy]);
                }
                else {
                    hooks[existingCallbacksIndex + 1].push(indexInFactory, ngOnDestroy);
                }
            }
            else {
                hooks.push(contextIndex, ngOnDestroy);
            }
        }
    }
}
/**
 * Add a factory in a multi factory.
 * @returns Index at which the factory was inserted.
 */
function multiFactoryAdd(multiFactory, factory, isComponentProvider) {
    if (isComponentProvider) {
        multiFactory.componentProviders++;
    }
    return multiFactory.multi.push(factory) - 1;
}
/**
 * Returns the index of item in the array, but only in the begin to end range.
 */
function indexOf(item, arr, begin, end) {
    for (let i = begin; i < end; i++) {
        if (arr[i] === item)
            return i;
    }
    return -1;
}
/**
 * Use this with `multi` `providers`.
 */
function multiProvidersFactoryResolver(_, flags, tData, lData, tNode) {
    return multiResolve(this.multi, []);
}
/**
 * Use this with `multi` `viewProviders`.
 *
 * This factory knows how to concatenate itself with the existing `multi` `providers`.
 */
function multiViewProvidersFactoryResolver(_, _flags, _tData, lView, tNode) {
    const factories = this.multi;
    let result;
    if (this.providerFactory) {
        const componentCount = this.providerFactory.componentProviders;
        const multiProviders = getNodeInjectable(lView, lView[TVIEW], this.providerFactory.index, tNode);
        // Copy the section of the array which contains `multi` `providers` from the component
        result = multiProviders.slice(0, componentCount);
        // Insert the `viewProvider` instances.
        multiResolve(factories, result);
        // Copy the section of the array which contains `multi` `providers` from other directives
        for (let i = componentCount; i < multiProviders.length; i++) {
            result.push(multiProviders[i]);
        }
    }
    else {
        result = [];
        // Insert the `viewProvider` instances.
        multiResolve(factories, result);
    }
    return result;
}
/**
 * Maps an array of factories into an array of values.
 */
function multiResolve(factories, result) {
    for (let i = 0; i < factories.length; i++) {
        const factory = factories[i];
        result.push(factory());
    }
    return result;
}
/**
 * Creates a multi factory.
 */
function multiFactory(factoryFn, index, isViewProvider, isComponent, f) {
    const factory = new NodeInjectorFactory(factoryFn, isViewProvider, ɵɵdirectiveInject);
    factory.multi = [];
    factory.index = index;
    factory.componentProviders = 0;
    multiFactoryAdd(factory, f, isComponent && !isViewProvider);
    return factory;
}

/**
 * This feature resolves the providers of a directive (or component),
 * and publish them into the DI system, making it visible to others for injection.
 *
 * For example:
 * ```ts
 * class ComponentWithProviders {
 *   constructor(private greeter: GreeterDE) {}
 *
 *   static ɵcmp = defineComponent({
 *     type: ComponentWithProviders,
 *     selectors: [['component-with-providers']],
 *    factory: () => new ComponentWithProviders(directiveInject(GreeterDE as any)),
 *    decls: 1,
 *    vars: 1,
 *    template: function(fs: RenderFlags, ctx: ComponentWithProviders) {
 *      if (fs & RenderFlags.Create) {
 *        ɵɵtext(0);
 *      }
 *      if (fs & RenderFlags.Update) {
 *        ɵɵtextInterpolate(ctx.greeter.greet());
 *      }
 *    },
 *    features: [ɵɵProvidersFeature([GreeterDE])]
 *  });
 * }
 * ```
 *
 * @param definition
 *
 * @codeGenApi
 */
function ɵɵProvidersFeature(providers, viewProviders = []) {
    return (definition) => {
        definition.providersResolver = (def, processProvidersFn) => {
            return providersResolver(def, //
            processProvidersFn ? processProvidersFn(providers) : providers, //
            viewProviders);
        };
    };
}

/**
 * A feature that adds support for external runtime styles for a component.
 * An external runtime style is a URL to a CSS stylesheet that contains the styles
 * for a given component. For browsers, this URL will be used in an appended `link` element
 * when the component is rendered. This feature is typically used for Hot Module Replacement
 * (HMR) of component stylesheets by leveraging preexisting global stylesheet HMR available
 * in most development servers.
 *
 * @codeGenApi
 */
function ɵɵExternalStylesFeature(styleUrls) {
    return (definition) => {
        if (styleUrls.length < 1) {
            return;
        }
        definition.getExternalStyles = (encapsulationId) => {
            // Add encapsulation ID search parameter `ngcomp` to support external style encapsulation as well as the encapsulation mode
            // for usage tracking.
            const urls = styleUrls.map((value) => value +
                '?ngcomp' +
                (encapsulationId ? '=' + encodeURIComponent(encapsulationId) : '') +
                '&e=' +
                definition.encapsulation);
            return urls;
        };
    };
}

/**
 * Generated next to NgModules to monkey-patch directive and pipe references onto a component's
 * definition, when generating a direct reference in the component file would otherwise create an
 * import cycle.
 *
 * See [this explanation](https://hackmd.io/Odw80D0pR6yfsOjg_7XCJg?view) for more details.
 *
 * @codeGenApi
 */
function ɵɵsetComponentScope(type, directives, pipes) {
    const def = type.ɵcmp;
    def.directiveDefs = extractDefListOrFactory(directives, /* pipeDef */ false);
    def.pipeDefs = extractDefListOrFactory(pipes, /* pipeDef */ true);
}
/**
 * Adds the module metadata that is necessary to compute the module's transitive scope to an
 * existing module definition.
 *
 * Scope metadata of modules is not used in production builds, so calls to this function can be
 * marked pure to tree-shake it from the bundle, allowing for all referenced declarations
 * to become eligible for tree-shaking as well.
 *
 * @codeGenApi
 */
function ɵɵsetNgModuleScope(type, scope) {
    return noSideEffects(() => {
        const ngModuleDef = getNgModuleDef(type, true);
        ngModuleDef.declarations = convertToTypeArray(scope.declarations || EMPTY_ARRAY);
        ngModuleDef.imports = convertToTypeArray(scope.imports || EMPTY_ARRAY);
        ngModuleDef.exports = convertToTypeArray(scope.exports || EMPTY_ARRAY);
        if (scope.bootstrap) {
            // This only happens in local compilation mode.
            ngModuleDef.bootstrap = convertToTypeArray(scope.bootstrap);
        }
        depsTracker.registerNgModule(type, scope);
    });
}
function convertToTypeArray(values) {
    if (typeof values === 'function') {
        return values;
    }
    const flattenValues = flatten(values);
    if (flattenValues.some(isForwardRef)) {
        return () => flattenValues.map(resolveForwardRef).map(maybeUnwrapModuleWithProviders);
    }
    else {
        return flattenValues.map(maybeUnwrapModuleWithProviders);
    }
}
function maybeUnwrapModuleWithProviders(value) {
    return isModuleWithProviders(value) ? value.ngModule : value;
}

/**
 * Bindings for pure functions are stored after regular bindings.
 *
 * |-------decls------|---------vars---------|                 |----- hostVars (dir1) ------|
 * ------------------------------------------------------------------------------------------
 * | nodes/refs/pipes | bindings | fn slots  | injector | dir1 | host bindings | host slots |
 * ------------------------------------------------------------------------------------------
 *                    ^                      ^
 *      TView.bindingStartIndex      TView.expandoStartIndex
 *
 * Pure function instructions are given an offset from the binding root. Adding the offset to the
 * binding root gives the first index where the bindings are stored. In component views, the binding
 * root is the bindingStartIndex. In host bindings, the binding root is the expandoStartIndex +
 * any directive instances + any hostVars in directives evaluated before it.
 *
 * See VIEW_DATA.md for more information about host binding resolution.
 */
/**
 * If the value hasn't been saved, calls the pure function to store and return the
 * value. If it has been saved, returns the saved value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn Function that returns a value
 * @param thisArg Optional calling context of pureFn
 * @returns value
 *
 * @codeGenApi
 */
function ɵɵpureFunction0(slotOffset, pureFn, thisArg) {
    const bindingIndex = getBindingRoot() + slotOffset;
    const lView = getLView();
    return lView[bindingIndex] === NO_CHANGE
        ? updateBinding(lView, bindingIndex, thisArg ? pureFn.call(thisArg) : pureFn())
        : getBinding(lView, bindingIndex);
}
/**
 * If the value of the provided exp has changed, calls the pure function to return
 * an updated value. Or if the value has not changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn Function that returns an updated value
 * @param exp Updated expression value
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunction1(slotOffset, pureFn, exp, thisArg) {
    return pureFunction1Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp, thisArg);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunction2(slotOffset, pureFn, exp1, exp2, thisArg) {
    return pureFunction2Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp1, exp2, thisArg);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunction3(slotOffset, pureFn, exp1, exp2, exp3, thisArg) {
    return pureFunction3Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp1, exp2, exp3, thisArg);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunction4(slotOffset, pureFn, exp1, exp2, exp3, exp4, thisArg) {
    return pureFunction4Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp1, exp2, exp3, exp4, thisArg);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param exp5
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunction5(slotOffset, pureFn, exp1, exp2, exp3, exp4, exp5, thisArg) {
    const bindingIndex = getBindingRoot() + slotOffset;
    const lView = getLView();
    const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);
    return bindingUpdated(lView, bindingIndex + 4, exp5) || different
        ? updateBinding(lView, bindingIndex + 5, thisArg
            ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5)
            : pureFn(exp1, exp2, exp3, exp4, exp5))
        : getBinding(lView, bindingIndex + 5);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param exp5
 * @param exp6
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunction6(slotOffset, pureFn, exp1, exp2, exp3, exp4, exp5, exp6, thisArg) {
    const bindingIndex = getBindingRoot() + slotOffset;
    const lView = getLView();
    const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);
    return bindingUpdated2(lView, bindingIndex + 4, exp5, exp6) || different
        ? updateBinding(lView, bindingIndex + 6, thisArg
            ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6)
            : pureFn(exp1, exp2, exp3, exp4, exp5, exp6))
        : getBinding(lView, bindingIndex + 6);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param exp5
 * @param exp6
 * @param exp7
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunction7(slotOffset, pureFn, exp1, exp2, exp3, exp4, exp5, exp6, exp7, thisArg) {
    const bindingIndex = getBindingRoot() + slotOffset;
    const lView = getLView();
    let different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);
    return bindingUpdated3(lView, bindingIndex + 4, exp5, exp6, exp7) || different
        ? updateBinding(lView, bindingIndex + 7, thisArg
            ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6, exp7)
            : pureFn(exp1, exp2, exp3, exp4, exp5, exp6, exp7))
        : getBinding(lView, bindingIndex + 7);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param exp5
 * @param exp6
 * @param exp7
 * @param exp8
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunction8(slotOffset, pureFn, exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8, thisArg) {
    const bindingIndex = getBindingRoot() + slotOffset;
    const lView = getLView();
    const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);
    return bindingUpdated4(lView, bindingIndex + 4, exp5, exp6, exp7, exp8) || different
        ? updateBinding(lView, bindingIndex + 8, thisArg
            ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8)
            : pureFn(exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8))
        : getBinding(lView, bindingIndex + 8);
}
/**
 * pureFunction instruction that can support any number of bindings.
 *
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn A pure function that takes binding values and builds an object or array
 * containing those values.
 * @param exps An array of binding values
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
function ɵɵpureFunctionV(slotOffset, pureFn, exps, thisArg) {
    return pureFunctionVInternal(getLView(), getBindingRoot(), slotOffset, pureFn, exps, thisArg);
}
/**
 * Results of a pure function invocation are stored in LView in a dedicated slot that is initialized
 * to NO_CHANGE. In rare situations a pure pipe might throw an exception on the very first
 * invocation and not produce any valid results. In this case LView would keep holding the NO_CHANGE
 * value. The NO_CHANGE is not something that we can use in expressions / bindings thus we convert
 * it to `undefined`.
 */
function getPureFunctionReturnValue(lView, returnValueIndex) {
    ngDevMode && assertIndexInRange(lView, returnValueIndex);
    const lastReturnValue = lView[returnValueIndex];
    return lastReturnValue === NO_CHANGE ? undefined : lastReturnValue;
}
/**
 * If the value of the provided exp has changed, calls the pure function to return
 * an updated value. Or if the value has not changed, returns cached value.
 *
 * @param lView LView in which the function is being executed.
 * @param bindingRoot Binding root index.
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn Function that returns an updated value
 * @param exp Updated expression value
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 */
function pureFunction1Internal(lView, bindingRoot, slotOffset, pureFn, exp, thisArg) {
    const bindingIndex = bindingRoot + slotOffset;
    return bindingUpdated(lView, bindingIndex, exp)
        ? updateBinding(lView, bindingIndex + 1, thisArg ? pureFn.call(thisArg, exp) : pureFn(exp))
        : getPureFunctionReturnValue(lView, bindingIndex + 1);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param lView LView in which the function is being executed.
 * @param bindingRoot Binding root index.
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 */
function pureFunction2Internal(lView, bindingRoot, slotOffset, pureFn, exp1, exp2, thisArg) {
    const bindingIndex = bindingRoot + slotOffset;
    return bindingUpdated2(lView, bindingIndex, exp1, exp2)
        ? updateBinding(lView, bindingIndex + 2, thisArg ? pureFn.call(thisArg, exp1, exp2) : pureFn(exp1, exp2))
        : getPureFunctionReturnValue(lView, bindingIndex + 2);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param lView LView in which the function is being executed.
 * @param bindingRoot Binding root index.
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 */
function pureFunction3Internal(lView, bindingRoot, slotOffset, pureFn, exp1, exp2, exp3, thisArg) {
    const bindingIndex = bindingRoot + slotOffset;
    return bindingUpdated3(lView, bindingIndex, exp1, exp2, exp3)
        ? updateBinding(lView, bindingIndex + 3, thisArg ? pureFn.call(thisArg, exp1, exp2, exp3) : pureFn(exp1, exp2, exp3))
        : getPureFunctionReturnValue(lView, bindingIndex + 3);
}
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param lView LView in which the function is being executed.
 * @param bindingRoot Binding root index.
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 */
function pureFunction4Internal(lView, bindingRoot, slotOffset, pureFn, exp1, exp2, exp3, exp4, thisArg) {
    const bindingIndex = bindingRoot + slotOffset;
    return bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4)
        ? updateBinding(lView, bindingIndex + 4, thisArg ? pureFn.call(thisArg, exp1, exp2, exp3, exp4) : pureFn(exp1, exp2, exp3, exp4))
        : getPureFunctionReturnValue(lView, bindingIndex + 4);
}
/**
 * pureFunction instruction that can support any n   umber of bindings.
 *
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param lView LView in which the function is being executed.
 * @param bindingRoot Binding root index.
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn A pure function that takes binding values and builds an object or array
 * containing those values.
 * @param exps An array of binding values
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 */
function pureFunctionVInternal(lView, bindingRoot, slotOffset, pureFn, exps, thisArg) {
    let bindingIndex = bindingRoot + slotOffset;
    let different = false;
    for (let i = 0; i < exps.length; i++) {
        bindingUpdated(lView, bindingIndex++, exps[i]) && (different = true);
    }
    return different
        ? updateBinding(lView, bindingIndex, pureFn.apply(thisArg, exps))
        : getPureFunctionReturnValue(lView, bindingIndex);
}

/**
 * Create a pipe.
 *
 * @param index Pipe index where the pipe will be stored.
 * @param pipeName The name of the pipe
 * @returns T the instance of the pipe.
 *
 * @codeGenApi
 */
function ɵɵpipe(index, pipeName) {
    const tView = getTView();
    let pipeDef;
    const adjustedIndex = index + HEADER_OFFSET;
    if (tView.firstCreatePass) {
        // The `getPipeDef` throws if a pipe with a given name is not found
        // (so we use non-null assertion below).
        pipeDef = getPipeDef(pipeName, tView.pipeRegistry);
        tView.data[adjustedIndex] = pipeDef;
        if (pipeDef.onDestroy) {
            (tView.destroyHooks ??= []).push(adjustedIndex, pipeDef.onDestroy);
        }
    }
    else {
        pipeDef = tView.data[adjustedIndex];
    }
    const pipeFactory = pipeDef.factory || (pipeDef.factory = getFactoryDef(pipeDef.type, true));
    let previousInjectorProfilerContext;
    if (ngDevMode) {
        previousInjectorProfilerContext = setInjectorProfilerContext({
            injector: new NodeInjector(getCurrentTNode(), getLView()),
            token: pipeDef.type,
        });
    }
    const previousInjectImplementation = setInjectImplementation(ɵɵdirectiveInject);
    try {
        // DI for pipes is supposed to behave like directives when placed on a component
        // host node, which means that we have to disable access to `viewProviders`.
        const previousIncludeViewProviders = setIncludeViewProviders(false);
        const pipeInstance = pipeFactory();
        setIncludeViewProviders(previousIncludeViewProviders);
        store(tView, getLView(), adjustedIndex, pipeInstance);
        return pipeInstance;
    }
    finally {
        // we have to restore the injector implementation in finally, just in case the creation of the
        // pipe throws an error.
        setInjectImplementation(previousInjectImplementation);
        ngDevMode && setInjectorProfilerContext(previousInjectorProfilerContext);
    }
}
/**
 * Searches the pipe registry for a pipe with the given name. If one is found,
 * returns the pipe. Otherwise, an error is thrown because the pipe cannot be resolved.
 *
 * @param name Name of pipe to resolve
 * @param registry Full list of available pipes
 * @returns Matching PipeDef
 */
function getPipeDef(name, registry) {
    if (registry) {
        if (ngDevMode) {
            const pipes = registry.filter((pipe) => pipe.name === name);
            // TODO: Throw an error in the next major
            if (pipes.length > 1) {
                console.warn(formatRuntimeError(313 /* RuntimeErrorCode.MULTIPLE_MATCHING_PIPES */, getMultipleMatchingPipesMessage(name)));
            }
        }
        for (let i = registry.length - 1; i >= 0; i--) {
            const pipeDef = registry[i];
            if (name === pipeDef.name) {
                return pipeDef;
            }
        }
    }
    if (ngDevMode) {
        throw new RuntimeError(-302 /* RuntimeErrorCode.PIPE_NOT_FOUND */, getPipeNotFoundErrorMessage(name));
    }
    return;
}
/**
 * Generates a helpful error message for the user when multiple pipes match the name.
 *
 * @param name Name of the pipe
 * @returns The error message
 */
function getMultipleMatchingPipesMessage(name) {
    const lView = getLView();
    const declarationLView = lView[DECLARATION_COMPONENT_VIEW];
    const context = declarationLView[CONTEXT];
    const hostIsStandalone = isHostComponentStandalone(lView);
    const componentInfoMessage = context ? ` in the '${context.constructor.name}' component` : '';
    const verifyMessage = `check ${hostIsStandalone ? "'@Component.imports' of this component" : 'the imports of this module'}`;
    const errorMessage = `Multiple pipes match the name \`${name}\`${componentInfoMessage}. ${verifyMessage}`;
    return errorMessage;
}
/**
 * Generates a helpful error message for the user when a pipe is not found.
 *
 * @param name Name of the missing pipe
 * @returns The error message
 */
function getPipeNotFoundErrorMessage(name) {
    const lView = getLView();
    const declarationLView = lView[DECLARATION_COMPONENT_VIEW];
    const context = declarationLView[CONTEXT];
    const hostIsStandalone = isHostComponentStandalone(lView);
    const componentInfoMessage = context ? ` in the '${context.constructor.name}' component` : '';
    const verifyMessage = `Verify that it is ${hostIsStandalone
        ? "included in the '@Component.imports' of this component"
        : 'declared or imported in this module'}`;
    const errorMessage = `The pipe '${name}' could not be found${componentInfoMessage}. ${verifyMessage}`;
    return errorMessage;
}
/**
 * Invokes a pipe with 1 arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param offset the binding offset
 * @param v1 1st argument to {@link PipeTransform#transform}.
 *
 * @codeGenApi
 */
function ɵɵpipeBind1(index, offset, v1) {
    const adjustedIndex = index + HEADER_OFFSET;
    const lView = getLView();
    const pipeInstance = load(lView, adjustedIndex);
    return isPure(lView, adjustedIndex)
        ? pureFunction1Internal(lView, getBindingRoot(), offset, pipeInstance.transform, v1, pipeInstance)
        : pipeInstance.transform(v1);
}
/**
 * Invokes a pipe with 2 arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param slotOffset the offset in the reserved slot space
 * @param v1 1st argument to {@link PipeTransform#transform}.
 * @param v2 2nd argument to {@link PipeTransform#transform}.
 *
 * @codeGenApi
 */
function ɵɵpipeBind2(index, slotOffset, v1, v2) {
    const adjustedIndex = index + HEADER_OFFSET;
    const lView = getLView();
    const pipeInstance = load(lView, adjustedIndex);
    return isPure(lView, adjustedIndex)
        ? pureFunction2Internal(lView, getBindingRoot(), slotOffset, pipeInstance.transform, v1, v2, pipeInstance)
        : pipeInstance.transform(v1, v2);
}
/**
 * Invokes a pipe with 3 arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param slotOffset the offset in the reserved slot space
 * @param v1 1st argument to {@link PipeTransform#transform}.
 * @param v2 2nd argument to {@link PipeTransform#transform}.
 * @param v3 4rd argument to {@link PipeTransform#transform}.
 *
 * @codeGenApi
 */
function ɵɵpipeBind3(index, slotOffset, v1, v2, v3) {
    const adjustedIndex = index + HEADER_OFFSET;
    const lView = getLView();
    const pipeInstance = load(lView, adjustedIndex);
    return isPure(lView, adjustedIndex)
        ? pureFunction3Internal(lView, getBindingRoot(), slotOffset, pipeInstance.transform, v1, v2, v3, pipeInstance)
        : pipeInstance.transform(v1, v2, v3);
}
/**
 * Invokes a pipe with 4 arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param slotOffset the offset in the reserved slot space
 * @param v1 1st argument to {@link PipeTransform#transform}.
 * @param v2 2nd argument to {@link PipeTransform#transform}.
 * @param v3 3rd argument to {@link PipeTransform#transform}.
 * @param v4 4th argument to {@link PipeTransform#transform}.
 *
 * @codeGenApi
 */
function ɵɵpipeBind4(index, slotOffset, v1, v2, v3, v4) {
    const adjustedIndex = index + HEADER_OFFSET;
    const lView = getLView();
    const pipeInstance = load(lView, adjustedIndex);
    return isPure(lView, adjustedIndex)
        ? pureFunction4Internal(lView, getBindingRoot(), slotOffset, pipeInstance.transform, v1, v2, v3, v4, pipeInstance)
        : pipeInstance.transform(v1, v2, v3, v4);
}
/**
 * Invokes a pipe with variable number of arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param slotOffset the offset in the reserved slot space
 * @param values Array of arguments to pass to {@link PipeTransform#transform} method.
 *
 * @codeGenApi
 */
function ɵɵpipeBindV(index, slotOffset, values) {
    const adjustedIndex = index + HEADER_OFFSET;
    const lView = getLView();
    const pipeInstance = load(lView, adjustedIndex);
    return isPure(lView, adjustedIndex)
        ? pureFunctionVInternal(lView, getBindingRoot(), slotOffset, pipeInstance.transform, values, pipeInstance)
        : pipeInstance.transform.apply(pipeInstance, values);
}
function isPure(lView, index) {
    return lView[TVIEW].data[index].pure;
}

/**
 * Retrieves `TemplateRef` instance from `Injector` when a local reference is placed on the
 * `<ng-template>` element.
 *
 * @codeGenApi
 */
function ɵɵtemplateRefExtractor(tNode, lView) {
    return createTemplateRef(tNode, lView);
}

function ɵɵgetComponentDepsFactory(type, rawImports) {
    return () => {
        try {
            return depsTracker.getComponentDependencies(type, rawImports).dependencies;
        }
        catch (e) {
            console.error(`Computing dependencies in local compilation mode for the component "${type.name}" failed with the exception:`, e);
            throw e;
        }
    };
}

/**
 * Sets the debug info for an Angular class.
 *
 * This runtime is guarded by ngDevMode flag.
 */
function ɵsetClassDebugInfo(type, debugInfo) {
    const def = getComponentDef(type);
    if (def !== null) {
        def.debugInfo = debugInfo;
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Gets the URL from which the client will fetch a new version of a component's metadata so it
 * can be replaced during hot module reloading.
 * @param id Unique ID for the component, generated during compile time.
 * @param timestamp Time at which the request happened.
 * @param base Base URL against which to resolve relative paths.
 * @codeGenApi
 */
function ɵɵgetReplaceMetadataURL(id, timestamp, base) {
    const url = `./@ng/component?c=${id}&t=${encodeURIComponent(timestamp)}`;
    return new URL(url, base).href;
}
/**
 * Replaces the metadata of a component type and re-renders all live instances of the component.
 * @param type Class whose metadata will be replaced.
 * @param applyMetadata Callback that will apply a new set of metadata on the `type` when invoked.
 * @param environment Syntehtic namespace imports that need to be passed along to the callback.
 * @param locals Local symbols from the source location that have to be exposed to the callback.
 * @param importMeta `import.meta` from the call site of the replacement function. Optional since
 *   it isn't used internally.
 * @param id ID to the class being replaced. **Not** the same as the component definition ID.
 *   Optional since the ID might not be available internally.
 * @codeGenApi
 */
function ɵɵreplaceMetadata(type, applyMetadata, namespaces, locals, importMeta = null, id = null) {
    ngDevMode && assertComponentDef(type);
    const currentDef = getComponentDef(type);
    // The reason `applyMetadata` is a callback that is invoked (almost) immediately is because
    // the compiler usually produces more code than just the component definition, e.g. there
    // can be functions for embedded views, the variables for the constant pool and `setClassMetadata`
    // calls. The callback allows us to keep them isolate from the rest of the app and to invoke
    // them at the right time.
    applyMetadata.apply(null, [type, namespaces, ...locals]);
    const { newDef, oldDef } = mergeWithExistingDefinition(currentDef, getComponentDef(type));
    // TODO(crisbeto): the `applyMetadata` call above will replace the definition on the type.
    // Ideally we should adjust the compiler output so the metadata is returned, however that'll
    // require some internal changes. We re-add the metadata here manually.
    type[NG_COMP_DEF] = newDef;
    // If a `tView` hasn't been created yet, it means that this component hasn't been instantianted
    // before. In this case there's nothing left for us to do aside from patching it in.
    if (oldDef.tView) {
        const trackedViews = getTrackedLViews().values();
        for (const root of trackedViews) {
            // Note: we have the additional check, because `IsRoot` can also indicate
            // a component created through something like `createComponent`.
            if (isRootView(root) && root[PARENT] === null) {
                recreateMatchingLViews(importMeta, id, newDef, oldDef, root);
            }
        }
    }
}
/**
 * Merges two component definitions while preseving the original one in place.
 * @param currentDef Definition that should receive the new metadata.
 * @param newDef Source of the new metadata.
 */
function mergeWithExistingDefinition(currentDef, newDef) {
    // Clone the current definition since we reference its original data further
    // down in the replacement process (e.g. when destroying the renderer).
    const clone = { ...currentDef };
    // Assign the new metadata in place while preserving the object literal. It's important to
    // Keep the object in place, because there can be references to it, for example in the
    // `directiveDefs` of another definition.
    const replacement = Object.assign(currentDef, newDef, {
        // We need to keep the existing directive and pipe defs, because they can get patched on
        // by a call to `setComponentScope` from a module file. That call won't make it into the
        // HMR replacement function, because it lives in an entirely different file.
        directiveDefs: clone.directiveDefs,
        pipeDefs: clone.pipeDefs,
        // Preserve the old `setInput` function, because it has some state.
        // This is fine, because the component instance is preserved as well.
        setInput: clone.setInput,
        // Externally this is redundant since we redeclare the definition using the original type.
        // Internally we may receive a definition with an alternate, but identical, type so we have
        // to ensure that the original one is preserved.
        type: clone.type,
    });
    ngDevMode && assertEqual(replacement, currentDef, 'Expected definition to be merged in place');
    return { newDef: replacement, oldDef: clone };
}
/**
 * Finds all LViews matching a specific component definition and recreates them.
 * @param importMeta `import.meta` information.
 * @param id HMR ID of the component.
 * @param oldDef Component definition to search for.
 * @param rootLView View from which to start the search.
 */
function recreateMatchingLViews(importMeta, id, newDef, oldDef, rootLView) {
    ngDevMode &&
        assertDefined(oldDef.tView, 'Expected a component definition that has been instantiated at least once');
    const tView = rootLView[TVIEW];
    // Use `tView` to match the LView since `instanceof` can
    // produce false positives when using inheritance.
    if (tView === oldDef.tView) {
        ngDevMode && assertComponentDef(oldDef.type);
        recreateLView(importMeta, id, newDef, oldDef, rootLView);
        return;
    }
    for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
        const current = rootLView[i];
        if (isLContainer(current)) {
            // The host can be an LView if a component is injecting `ViewContainerRef`.
            if (isLView(current[HOST])) {
                recreateMatchingLViews(importMeta, id, newDef, oldDef, current[HOST]);
            }
            for (let j = CONTAINER_HEADER_OFFSET; j < current.length; j++) {
                recreateMatchingLViews(importMeta, id, newDef, oldDef, current[j]);
            }
        }
        else if (isLView(current)) {
            recreateMatchingLViews(importMeta, id, newDef, oldDef, current);
        }
    }
}
/**
 * Removes any cached renderers from the factory for the provided type.
 * This is currently used by the HMR logic to ensure Renderers are kept
 * synchronized with any definition metadata updates.
 * @param factory A RendererFactory2 instance.
 * @param def A ComponentDef instance.
 */
function clearRendererCache(factory, def) {
    // Cast to read a private field.
    // NOTE: This must be kept synchronized with the renderer factory implementation in
    // platform-browser and platform-browser/animations.
    factory.componentReplaced?.(def.id);
}
/**
 * Recreates an LView in-place from a new component definition.
 * @param importMeta `import.meta` information.
 * @param id HMR ID for the component.
 * @param newDef Definition from which to recreate the view.
 * @param oldDef Previous component definition being swapped out.
 * @param lView View to be recreated.
 */
function recreateLView(importMeta, id, newDef, oldDef, lView) {
    const instance = lView[CONTEXT];
    let host = lView[HOST];
    // In theory the parent can also be an LContainer, but it appears like that's
    // only the case for embedded views which we won't be replacing here.
    const parentLView = lView[PARENT];
    ngDevMode && assertLView(parentLView);
    const tNode = lView[T_HOST];
    ngDevMode && assertTNodeType(tNode, 2 /* TNodeType.Element */);
    ngDevMode && assertNotEqual(newDef, oldDef, 'Expected different component definition');
    const zone = lView[INJECTOR].get(NgZone, null);
    const recreate = () => {
        // If we're recreating a component with shadow DOM encapsulation, it will have attached a
        // shadow root. The browser will throw if we attempt to attach another one and there's no way
        // to detach it. Our only option is to make a clone only of the root node, replace the node
        // with the clone and use it for the newly-created LView.
        if (oldDef.encapsulation === ViewEncapsulation.ShadowDom) {
            const newHost = host.cloneNode(false);
            host.replaceWith(newHost);
            host = newHost;
        }
        // Recreate the TView since the template might've changed.
        const newTView = getOrCreateComponentTView(newDef);
        // Create a new LView from the new TView, but reusing the existing TNode and DOM node.
        const newLView = createLView(parentLView, newTView, instance, getInitialLViewFlagsFromDef(newDef), host, tNode, null, null, // The renderer will be created a bit further down once the old one is destroyed.
        null, null, null);
        // Detach the LView from its current place in the tree so we don't
        // start traversing any siblings and modifying their structure.
        replaceLViewInTree(parentLView, lView, newLView, tNode.index);
        // Destroy the detached LView.
        destroyLView(lView[TVIEW], lView);
        // Always force the creation of a new renderer to ensure state captured during construction
        // stays consistent with the new component definition by clearing any old ached factories.
        const rendererFactory = lView[ENVIRONMENT].rendererFactory;
        clearRendererCache(rendererFactory, oldDef);
        // Patch a brand-new renderer onto the new view only after the old
        // view is destroyed so that the runtime doesn't try to reuse it.
        newLView[RENDERER] = rendererFactory.createRenderer(host, newDef);
        // Remove the nodes associated with the destroyed LView. This removes the
        // descendants, but not the host which we want to stay in place.
        removeViewFromDOM(lView[TVIEW], lView);
        // Reset the content projection state of the TNode before the first render.
        // Note that this has to happen after the LView has been destroyed or we
        // risk some projected nodes not being removed correctly.
        resetProjectionState(tNode);
        // Creation pass for the new view.
        renderView(newTView, newLView, instance);
        // Update pass for the new view.
        refreshView(newTView, newLView, newTView.template, instance);
    };
    // The callback isn't guaranteed to be inside the Zone so we need to bring it in ourselves.
    if (zone === null) {
        executeWithInvalidateFallback(importMeta, id, recreate);
    }
    else {
        zone.run(() => executeWithInvalidateFallback(importMeta, id, recreate));
    }
}
/**
 * Runs an HMR-related function and falls back to
 * invalidating the HMR data if it throws an error.
 */
function executeWithInvalidateFallback(importMeta, id, callback) {
    try {
        callback();
    }
    catch (e) {
        const error = e;
        // If we have all the necessary information and APIs to send off the invalidation
        // request, send it before rethrowing so the dev server can decide what to do.
        if (id !== null && error.message) {
            const toLog = error.message + (error.stack ? '\n' + error.stack : '');
            importMeta?.hot?.send?.('angular:invalidate', { id, message: toLog, error: true });
        }
        // Throw the error in case the page doesn't get refreshed.
        throw e;
    }
}
/**
 * Replaces one LView in the tree with another one.
 * @param parentLView Parent of the LView being replaced.
 * @param oldLView LView being replaced.
 * @param newLView Replacement LView to be inserted.
 * @param index Index at which the LView should be inserted.
 */
function replaceLViewInTree(parentLView, oldLView, newLView, index) {
    // Update the sibling whose `NEXT` pointer refers to the old view.
    for (let i = HEADER_OFFSET; i < parentLView[TVIEW].bindingStartIndex; i++) {
        const current = parentLView[i];
        if ((isLView(current) || isLContainer(current)) && current[NEXT] === oldLView) {
            current[NEXT] = newLView;
            break;
        }
    }
    // Set the new view as the head, if the old view was first.
    if (parentLView[CHILD_HEAD] === oldLView) {
        parentLView[CHILD_HEAD] = newLView;
    }
    // Set the new view as the tail, if the old view was last.
    if (parentLView[CHILD_TAIL] === oldLView) {
        parentLView[CHILD_TAIL] = newLView;
    }
    // Update the `NEXT` pointer to the same as the old view.
    newLView[NEXT] = oldLView[NEXT];
    // Clear out the `NEXT` of the old view.
    oldLView[NEXT] = null;
    // Insert the new LView at the correct index.
    parentLView[index] = newLView;
}
/**
 * Child nodes mutate the `projection` state of their parent node as they're being projected.
 * This function resets the `project` back to its initial state.
 * @param tNode
 */
function resetProjectionState(tNode) {
    // The `projection` is mutated by child nodes as they're being projected. We need to
    // reset it to the initial state so projection works after the template is swapped out.
    if (tNode.projection !== null) {
        for (const current of tNode.projection) {
            if (isTNodeShape(current)) {
                // Reset `projectionNext` since it can affect the traversal order during projection.
                current.projectionNext = null;
                current.flags &= -3 /* TNodeFlags.isProjected */;
            }
        }
        tNode.projection = null;
    }
}

/**
 * A mapping of the @angular/core API surface used in generated expressions to the actual symbols.
 *
 * This should be kept up to date with the public exports of @angular/core.
 */
const angularCoreEnv = (() => ({
    'ɵɵattribute': ɵɵattribute,
    'ɵɵattributeInterpolate1': ɵɵattributeInterpolate1,
    'ɵɵattributeInterpolate2': ɵɵattributeInterpolate2,
    'ɵɵattributeInterpolate3': ɵɵattributeInterpolate3,
    'ɵɵattributeInterpolate4': ɵɵattributeInterpolate4,
    'ɵɵattributeInterpolate5': ɵɵattributeInterpolate5,
    'ɵɵattributeInterpolate6': ɵɵattributeInterpolate6,
    'ɵɵattributeInterpolate7': ɵɵattributeInterpolate7,
    'ɵɵattributeInterpolate8': ɵɵattributeInterpolate8,
    'ɵɵattributeInterpolateV': ɵɵattributeInterpolateV,
    'ɵɵdefineComponent': ɵɵdefineComponent,
    'ɵɵdefineDirective': ɵɵdefineDirective,
    'ɵɵdefineInjectable': ɵɵdefineInjectable,
    'ɵɵdefineInjector': ɵɵdefineInjector,
    'ɵɵdefineNgModule': ɵɵdefineNgModule,
    'ɵɵdefinePipe': ɵɵdefinePipe,
    'ɵɵdirectiveInject': ɵɵdirectiveInject,
    'ɵɵgetInheritedFactory': ɵɵgetInheritedFactory,
    'ɵɵinject': ɵɵinject,
    'ɵɵinjectAttribute': ɵɵinjectAttribute,
    'ɵɵinvalidFactory': ɵɵinvalidFactory,
    'ɵɵinvalidFactoryDep': ɵɵinvalidFactoryDep,
    'ɵɵtemplateRefExtractor': ɵɵtemplateRefExtractor,
    'ɵɵresetView': ɵɵresetView,
    'ɵɵHostDirectivesFeature': ɵɵHostDirectivesFeature,
    'ɵɵNgOnChangesFeature': ɵɵNgOnChangesFeature,
    'ɵɵProvidersFeature': ɵɵProvidersFeature,
    'ɵɵCopyDefinitionFeature': ɵɵCopyDefinitionFeature,
    'ɵɵInheritDefinitionFeature': ɵɵInheritDefinitionFeature,
    'ɵɵExternalStylesFeature': ɵɵExternalStylesFeature,
    'ɵɵnextContext': ɵɵnextContext,
    'ɵɵnamespaceHTML': ɵɵnamespaceHTML,
    'ɵɵnamespaceMathML': ɵɵnamespaceMathML,
    'ɵɵnamespaceSVG': ɵɵnamespaceSVG,
    'ɵɵenableBindings': ɵɵenableBindings,
    'ɵɵdisableBindings': ɵɵdisableBindings,
    'ɵɵelementStart': ɵɵelementStart,
    'ɵɵelementEnd': ɵɵelementEnd,
    'ɵɵelement': ɵɵelement,
    'ɵɵelementContainerStart': ɵɵelementContainerStart,
    'ɵɵelementContainerEnd': ɵɵelementContainerEnd,
    'ɵɵelementContainer': ɵɵelementContainer,
    'ɵɵpureFunction0': ɵɵpureFunction0,
    'ɵɵpureFunction1': ɵɵpureFunction1,
    'ɵɵpureFunction2': ɵɵpureFunction2,
    'ɵɵpureFunction3': ɵɵpureFunction3,
    'ɵɵpureFunction4': ɵɵpureFunction4,
    'ɵɵpureFunction5': ɵɵpureFunction5,
    'ɵɵpureFunction6': ɵɵpureFunction6,
    'ɵɵpureFunction7': ɵɵpureFunction7,
    'ɵɵpureFunction8': ɵɵpureFunction8,
    'ɵɵpureFunctionV': ɵɵpureFunctionV,
    'ɵɵgetCurrentView': ɵɵgetCurrentView,
    'ɵɵrestoreView': ɵɵrestoreView,
    'ɵɵlistener': ɵɵlistener,
    'ɵɵprojection': ɵɵprojection,
    'ɵɵsyntheticHostProperty': ɵɵsyntheticHostProperty,
    'ɵɵsyntheticHostListener': ɵɵsyntheticHostListener,
    'ɵɵpipeBind1': ɵɵpipeBind1,
    'ɵɵpipeBind2': ɵɵpipeBind2,
    'ɵɵpipeBind3': ɵɵpipeBind3,
    'ɵɵpipeBind4': ɵɵpipeBind4,
    'ɵɵpipeBindV': ɵɵpipeBindV,
    'ɵɵprojectionDef': ɵɵprojectionDef,
    'ɵɵhostProperty': ɵɵhostProperty,
    'ɵɵproperty': ɵɵproperty,
    'ɵɵpropertyInterpolate': ɵɵpropertyInterpolate,
    'ɵɵpropertyInterpolate1': ɵɵpropertyInterpolate1,
    'ɵɵpropertyInterpolate2': ɵɵpropertyInterpolate2,
    'ɵɵpropertyInterpolate3': ɵɵpropertyInterpolate3,
    'ɵɵpropertyInterpolate4': ɵɵpropertyInterpolate4,
    'ɵɵpropertyInterpolate5': ɵɵpropertyInterpolate5,
    'ɵɵpropertyInterpolate6': ɵɵpropertyInterpolate6,
    'ɵɵpropertyInterpolate7': ɵɵpropertyInterpolate7,
    'ɵɵpropertyInterpolate8': ɵɵpropertyInterpolate8,
    'ɵɵpropertyInterpolateV': ɵɵpropertyInterpolateV,
    'ɵɵpipe': ɵɵpipe,
    'ɵɵqueryRefresh': ɵɵqueryRefresh,
    'ɵɵqueryAdvance': ɵɵqueryAdvance,
    'ɵɵviewQuery': ɵɵviewQuery,
    'ɵɵviewQuerySignal': ɵɵviewQuerySignal,
    'ɵɵloadQuery': ɵɵloadQuery,
    'ɵɵcontentQuery': ɵɵcontentQuery,
    'ɵɵcontentQuerySignal': ɵɵcontentQuerySignal,
    'ɵɵreference': ɵɵreference,
    'ɵɵclassMap': ɵɵclassMap,
    'ɵɵclassMapInterpolate1': ɵɵclassMapInterpolate1,
    'ɵɵclassMapInterpolate2': ɵɵclassMapInterpolate2,
    'ɵɵclassMapInterpolate3': ɵɵclassMapInterpolate3,
    'ɵɵclassMapInterpolate4': ɵɵclassMapInterpolate4,
    'ɵɵclassMapInterpolate5': ɵɵclassMapInterpolate5,
    'ɵɵclassMapInterpolate6': ɵɵclassMapInterpolate6,
    'ɵɵclassMapInterpolate7': ɵɵclassMapInterpolate7,
    'ɵɵclassMapInterpolate8': ɵɵclassMapInterpolate8,
    'ɵɵclassMapInterpolateV': ɵɵclassMapInterpolateV,
    'ɵɵstyleMap': ɵɵstyleMap,
    'ɵɵstyleMapInterpolate1': ɵɵstyleMapInterpolate1,
    'ɵɵstyleMapInterpolate2': ɵɵstyleMapInterpolate2,
    'ɵɵstyleMapInterpolate3': ɵɵstyleMapInterpolate3,
    'ɵɵstyleMapInterpolate4': ɵɵstyleMapInterpolate4,
    'ɵɵstyleMapInterpolate5': ɵɵstyleMapInterpolate5,
    'ɵɵstyleMapInterpolate6': ɵɵstyleMapInterpolate6,
    'ɵɵstyleMapInterpolate7': ɵɵstyleMapInterpolate7,
    'ɵɵstyleMapInterpolate8': ɵɵstyleMapInterpolate8,
    'ɵɵstyleMapInterpolateV': ɵɵstyleMapInterpolateV,
    'ɵɵstyleProp': ɵɵstyleProp,
    'ɵɵstylePropInterpolate1': ɵɵstylePropInterpolate1,
    'ɵɵstylePropInterpolate2': ɵɵstylePropInterpolate2,
    'ɵɵstylePropInterpolate3': ɵɵstylePropInterpolate3,
    'ɵɵstylePropInterpolate4': ɵɵstylePropInterpolate4,
    'ɵɵstylePropInterpolate5': ɵɵstylePropInterpolate5,
    'ɵɵstylePropInterpolate6': ɵɵstylePropInterpolate6,
    'ɵɵstylePropInterpolate7': ɵɵstylePropInterpolate7,
    'ɵɵstylePropInterpolate8': ɵɵstylePropInterpolate8,
    'ɵɵstylePropInterpolateV': ɵɵstylePropInterpolateV,
    'ɵɵclassProp': ɵɵclassProp,
    'ɵɵadvance': ɵɵadvance,
    'ɵɵtemplate': ɵɵtemplate,
    'ɵɵconditional': ɵɵconditional,
    'ɵɵdefer': ɵɵdefer,
    'ɵɵdeferWhen': ɵɵdeferWhen,
    'ɵɵdeferOnIdle': ɵɵdeferOnIdle,
    'ɵɵdeferOnImmediate': ɵɵdeferOnImmediate,
    'ɵɵdeferOnTimer': ɵɵdeferOnTimer,
    'ɵɵdeferOnHover': ɵɵdeferOnHover,
    'ɵɵdeferOnInteraction': ɵɵdeferOnInteraction,
    'ɵɵdeferOnViewport': ɵɵdeferOnViewport,
    'ɵɵdeferPrefetchWhen': ɵɵdeferPrefetchWhen,
    'ɵɵdeferPrefetchOnIdle': ɵɵdeferPrefetchOnIdle,
    'ɵɵdeferPrefetchOnImmediate': ɵɵdeferPrefetchOnImmediate,
    'ɵɵdeferPrefetchOnTimer': ɵɵdeferPrefetchOnTimer,
    'ɵɵdeferPrefetchOnHover': ɵɵdeferPrefetchOnHover,
    'ɵɵdeferPrefetchOnInteraction': ɵɵdeferPrefetchOnInteraction,
    'ɵɵdeferPrefetchOnViewport': ɵɵdeferPrefetchOnViewport,
    'ɵɵdeferHydrateWhen': ɵɵdeferHydrateWhen,
    'ɵɵdeferHydrateNever': ɵɵdeferHydrateNever,
    'ɵɵdeferHydrateOnIdle': ɵɵdeferHydrateOnIdle,
    'ɵɵdeferHydrateOnImmediate': ɵɵdeferHydrateOnImmediate,
    'ɵɵdeferHydrateOnTimer': ɵɵdeferHydrateOnTimer,
    'ɵɵdeferHydrateOnHover': ɵɵdeferHydrateOnHover,
    'ɵɵdeferHydrateOnInteraction': ɵɵdeferHydrateOnInteraction,
    'ɵɵdeferHydrateOnViewport': ɵɵdeferHydrateOnViewport,
    'ɵɵdeferEnableTimerScheduling': ɵɵdeferEnableTimerScheduling,
    'ɵɵrepeater': ɵɵrepeater,
    'ɵɵrepeaterCreate': ɵɵrepeaterCreate,
    'ɵɵrepeaterTrackByIndex': ɵɵrepeaterTrackByIndex,
    'ɵɵrepeaterTrackByIdentity': ɵɵrepeaterTrackByIdentity,
    'ɵɵcomponentInstance': ɵɵcomponentInstance,
    'ɵɵtext': ɵɵtext,
    'ɵɵtextInterpolate': ɵɵtextInterpolate,
    'ɵɵtextInterpolate1': ɵɵtextInterpolate1,
    'ɵɵtextInterpolate2': ɵɵtextInterpolate2,
    'ɵɵtextInterpolate3': ɵɵtextInterpolate3,
    'ɵɵtextInterpolate4': ɵɵtextInterpolate4,
    'ɵɵtextInterpolate5': ɵɵtextInterpolate5,
    'ɵɵtextInterpolate6': ɵɵtextInterpolate6,
    'ɵɵtextInterpolate7': ɵɵtextInterpolate7,
    'ɵɵtextInterpolate8': ɵɵtextInterpolate8,
    'ɵɵtextInterpolateV': ɵɵtextInterpolateV,
    'ɵɵi18n': ɵɵi18n,
    'ɵɵi18nAttributes': ɵɵi18nAttributes,
    'ɵɵi18nExp': ɵɵi18nExp,
    'ɵɵi18nStart': ɵɵi18nStart,
    'ɵɵi18nEnd': ɵɵi18nEnd,
    'ɵɵi18nApply': ɵɵi18nApply,
    'ɵɵi18nPostprocess': ɵɵi18nPostprocess,
    'ɵɵresolveWindow': ɵɵresolveWindow,
    'ɵɵresolveDocument': ɵɵresolveDocument,
    'ɵɵresolveBody': ɵɵresolveBody,
    'ɵɵsetComponentScope': ɵɵsetComponentScope,
    'ɵɵsetNgModuleScope': ɵɵsetNgModuleScope,
    'ɵɵregisterNgModuleType': registerNgModuleType,
    'ɵɵgetComponentDepsFactory': ɵɵgetComponentDepsFactory,
    'ɵsetClassDebugInfo': ɵsetClassDebugInfo,
    'ɵɵdeclareLet': ɵɵdeclareLet,
    'ɵɵstoreLet': ɵɵstoreLet,
    'ɵɵreadContextLet': ɵɵreadContextLet,
    'ɵɵattachSourceLocations': ɵɵattachSourceLocations,
    'ɵɵsanitizeHtml': ɵɵsanitizeHtml,
    'ɵɵsanitizeStyle': ɵɵsanitizeStyle,
    'ɵɵsanitizeResourceUrl': ɵɵsanitizeResourceUrl,
    'ɵɵsanitizeScript': ɵɵsanitizeScript,
    'ɵɵsanitizeUrl': ɵɵsanitizeUrl,
    'ɵɵsanitizeUrlOrResourceUrl': ɵɵsanitizeUrlOrResourceUrl,
    'ɵɵtrustConstantHtml': ɵɵtrustConstantHtml,
    'ɵɵtrustConstantResourceUrl': ɵɵtrustConstantResourceUrl,
    'ɵɵvalidateIframeAttribute': ɵɵvalidateIframeAttribute,
    'forwardRef': forwardRef,
    'resolveForwardRef': resolveForwardRef,
    'ɵɵtwoWayProperty': ɵɵtwoWayProperty,
    'ɵɵtwoWayBindingSet': ɵɵtwoWayBindingSet,
    'ɵɵtwoWayListener': ɵɵtwoWayListener,
    'ɵɵreplaceMetadata': ɵɵreplaceMetadata,
    'ɵɵgetReplaceMetadataURL': ɵɵgetReplaceMetadataURL,
}))();

let jitOptions = null;
function setJitOptions(options) {
    if (jitOptions !== null) {
        if (options.defaultEncapsulation !== jitOptions.defaultEncapsulation) {
            ngDevMode &&
                console.error('Provided value for `defaultEncapsulation` can not be changed once it has been set.');
            return;
        }
        if (options.preserveWhitespaces !== jitOptions.preserveWhitespaces) {
            ngDevMode &&
                console.error('Provided value for `preserveWhitespaces` can not be changed once it has been set.');
            return;
        }
    }
    jitOptions = options;
}
function getJitOptions() {
    return jitOptions;
}
function resetJitOptions() {
    jitOptions = null;
}

const moduleQueue = [];
/**
 * Enqueues moduleDef to be checked later to see if scope can be set on its
 * component declarations.
 */
function enqueueModuleForDelayedScoping(moduleType, ngModule) {
    moduleQueue.push({ moduleType, ngModule });
}
let flushingModuleQueue = false;
/**
 * Loops over queued module definitions, if a given module definition has all of its
 * declarations resolved, it dequeues that module definition and sets the scope on
 * its declarations.
 */
function flushModuleScopingQueueAsMuchAsPossible() {
    if (!flushingModuleQueue) {
        flushingModuleQueue = true;
        try {
            for (let i = moduleQueue.length - 1; i >= 0; i--) {
                const { moduleType, ngModule } = moduleQueue[i];
                if (ngModule.declarations && ngModule.declarations.every(isResolvedDeclaration)) {
                    // dequeue
                    moduleQueue.splice(i, 1);
                    setScopeOnDeclaredComponents(moduleType, ngModule);
                }
            }
        }
        finally {
            flushingModuleQueue = false;
        }
    }
}
/**
 * Returns truthy if a declaration has resolved. If the declaration happens to be
 * an array of declarations, it will recurse to check each declaration in that array
 * (which may also be arrays).
 */
function isResolvedDeclaration(declaration) {
    if (Array.isArray(declaration)) {
        return declaration.every(isResolvedDeclaration);
    }
    return !!resolveForwardRef(declaration);
}
/**
 * Compiles a module in JIT mode.
 *
 * This function automatically gets called when a class has a `@NgModule` decorator.
 */
function compileNgModule(moduleType, ngModule = {}) {
    compileNgModuleDefs(moduleType, ngModule);
    if (ngModule.id !== undefined) {
        registerNgModuleType(moduleType, ngModule.id);
    }
    // Because we don't know if all declarations have resolved yet at the moment the
    // NgModule decorator is executing, we're enqueueing the setting of module scope
    // on its declarations to be run at a later time when all declarations for the module,
    // including forward refs, have resolved.
    enqueueModuleForDelayedScoping(moduleType, ngModule);
}
/**
 * Compiles and adds the `ɵmod`, `ɵfac` and `ɵinj` properties to the module class.
 *
 * It's possible to compile a module via this API which will allow duplicate declarations in its
 * root.
 */
function compileNgModuleDefs(moduleType, ngModule, allowDuplicateDeclarationsInRoot = false) {
    ngDevMode && assertDefined(moduleType, 'Required value moduleType');
    ngDevMode && assertDefined(ngModule, 'Required value ngModule');
    const declarations = flatten(ngModule.declarations || EMPTY_ARRAY);
    let ngModuleDef = null;
    Object.defineProperty(moduleType, NG_MOD_DEF, {
        configurable: true,
        get: () => {
            if (ngModuleDef === null) {
                if (ngDevMode && ngModule.imports && ngModule.imports.indexOf(moduleType) > -1) {
                    // We need to assert this immediately, because allowing it to continue will cause it to
                    // go into an infinite loop before we've reached the point where we throw all the errors.
                    throw new Error(`'${stringifyForError(moduleType)}' module can't import itself`);
                }
                const compiler = getCompilerFacade({
                    usage: 0 /* JitCompilerUsage.Decorator */,
                    kind: 'NgModule',
                    type: moduleType,
                });
                ngModuleDef = compiler.compileNgModule(angularCoreEnv, `ng:///${moduleType.name}/ɵmod.js`, {
                    type: moduleType,
                    bootstrap: flatten(ngModule.bootstrap || EMPTY_ARRAY).map(resolveForwardRef),
                    declarations: declarations.map(resolveForwardRef),
                    imports: flatten(ngModule.imports || EMPTY_ARRAY)
                        .map(resolveForwardRef)
                        .map(expandModuleWithProviders),
                    exports: flatten(ngModule.exports || EMPTY_ARRAY)
                        .map(resolveForwardRef)
                        .map(expandModuleWithProviders),
                    schemas: ngModule.schemas ? flatten(ngModule.schemas) : null,
                    id: ngModule.id || null,
                });
                // Set `schemas` on ngModuleDef to an empty array in JIT mode to indicate that runtime
                // should verify that there are no unknown elements in a template. In AOT mode, that check
                // happens at compile time and `schemas` information is not present on Component and Module
                // defs after compilation (so the check doesn't happen the second time at runtime).
                if (!ngModuleDef.schemas) {
                    ngModuleDef.schemas = [];
                }
            }
            return ngModuleDef;
        },
    });
    let ngFactoryDef = null;
    Object.defineProperty(moduleType, NG_FACTORY_DEF, {
        get: () => {
            if (ngFactoryDef === null) {
                const compiler = getCompilerFacade({
                    usage: 0 /* JitCompilerUsage.Decorator */,
                    kind: 'NgModule',
                    type: moduleType,
                });
                ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${moduleType.name}/ɵfac.js`, {
                    name: moduleType.name,
                    type: moduleType,
                    deps: reflectDependencies(moduleType),
                    target: compiler.FactoryTarget.NgModule,
                    typeArgumentCount: 0,
                });
            }
            return ngFactoryDef;
        },
        // Make the property configurable in dev mode to allow overriding in tests
        configurable: !!ngDevMode,
    });
    let ngInjectorDef = null;
    Object.defineProperty(moduleType, NG_INJ_DEF, {
        get: () => {
            if (ngInjectorDef === null) {
                ngDevMode && verifySemanticsOfNgModuleDef(moduleType, allowDuplicateDeclarationsInRoot);
                const meta = {
                    name: moduleType.name,
                    type: moduleType,
                    providers: ngModule.providers || EMPTY_ARRAY,
                    imports: [
                        (ngModule.imports || EMPTY_ARRAY).map(resolveForwardRef),
                        (ngModule.exports || EMPTY_ARRAY).map(resolveForwardRef),
                    ],
                };
                const compiler = getCompilerFacade({
                    usage: 0 /* JitCompilerUsage.Decorator */,
                    kind: 'NgModule',
                    type: moduleType,
                });
                ngInjectorDef = compiler.compileInjector(angularCoreEnv, `ng:///${moduleType.name}/ɵinj.js`, meta);
            }
            return ngInjectorDef;
        },
        // Make the property configurable in dev mode to allow overriding in tests
        configurable: !!ngDevMode,
    });
}
function generateStandaloneInDeclarationsError(type, location) {
    const prefix = `Unexpected "${stringifyForError(type)}" found in the "declarations" array of the`;
    const suffix = `"${stringifyForError(type)}" is marked as standalone and can't be declared ` +
        'in any NgModule - did you intend to import it instead (by adding it to the "imports" array)?';
    return `${prefix} ${location}, ${suffix}`;
}
function verifySemanticsOfNgModuleDef(moduleType, allowDuplicateDeclarationsInRoot, importingModule) {
    if (verifiedNgModule.get(moduleType))
        return;
    // skip verifications of standalone components, directives, and pipes
    if (isStandalone(moduleType))
        return;
    verifiedNgModule.set(moduleType, true);
    moduleType = resolveForwardRef(moduleType);
    let ngModuleDef;
    if (importingModule) {
        ngModuleDef = getNgModuleDef(moduleType);
        if (!ngModuleDef) {
            throw new Error(`Unexpected value '${moduleType.name}' imported by the module '${importingModule.name}'. Please add an @NgModule annotation.`);
        }
    }
    else {
        ngModuleDef = getNgModuleDef(moduleType, true);
    }
    const errors = [];
    const declarations = maybeUnwrapFn(ngModuleDef.declarations);
    const imports = maybeUnwrapFn(ngModuleDef.imports);
    flatten(imports)
        .map(unwrapModuleWithProvidersImports)
        .forEach((modOrStandaloneCmpt) => {
        verifySemanticsOfNgModuleImport(modOrStandaloneCmpt, moduleType);
        verifySemanticsOfNgModuleDef(modOrStandaloneCmpt, false, moduleType);
    });
    const exports = maybeUnwrapFn(ngModuleDef.exports);
    declarations.forEach(verifyDeclarationsHaveDefinitions);
    declarations.forEach(verifyDirectivesHaveSelector);
    declarations.forEach((declarationType) => verifyNotStandalone(declarationType, moduleType));
    const combinedDeclarations = [
        ...declarations.map(resolveForwardRef),
        ...flatten(imports.map(computeCombinedExports)).map(resolveForwardRef),
    ];
    exports.forEach(verifyExportsAreDeclaredOrReExported);
    declarations.forEach((decl) => verifyDeclarationIsUnique(decl, allowDuplicateDeclarationsInRoot));
    const ngModule = getAnnotation(moduleType, 'NgModule');
    if (ngModule) {
        ngModule.imports &&
            flatten(ngModule.imports)
                .map(unwrapModuleWithProvidersImports)
                .forEach((mod) => {
                verifySemanticsOfNgModuleImport(mod, moduleType);
                verifySemanticsOfNgModuleDef(mod, false, moduleType);
            });
        ngModule.bootstrap && deepForEach(ngModule.bootstrap, verifyCorrectBootstrapType);
        ngModule.bootstrap && deepForEach(ngModule.bootstrap, verifyComponentIsPartOfNgModule);
    }
    // Throw Error if any errors were detected.
    if (errors.length) {
        throw new Error(errors.join('\n'));
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    function verifyDeclarationsHaveDefinitions(type) {
        type = resolveForwardRef(type);
        const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef$1(type);
        if (!def) {
            errors.push(`Unexpected value '${stringifyForError(type)}' declared by the module '${stringifyForError(moduleType)}'. Please add a @Pipe/@Directive/@Component annotation.`);
        }
    }
    function verifyDirectivesHaveSelector(type) {
        type = resolveForwardRef(type);
        const def = getDirectiveDef(type);
        if (!getComponentDef(type) && def && def.selectors.length == 0) {
            errors.push(`Directive ${stringifyForError(type)} has no selector, please add it!`);
        }
    }
    function verifyNotStandalone(type, moduleType) {
        type = resolveForwardRef(type);
        const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef$1(type);
        if (def?.standalone) {
            const location = `"${stringifyForError(moduleType)}" NgModule`;
            errors.push(generateStandaloneInDeclarationsError(type, location));
        }
    }
    function verifyExportsAreDeclaredOrReExported(type) {
        type = resolveForwardRef(type);
        const kind = (getComponentDef(type) && 'component') ||
            (getDirectiveDef(type) && 'directive') ||
            (getPipeDef$1(type) && 'pipe');
        if (kind) {
            // only checked if we are declared as Component, Directive, or Pipe
            // Modules don't need to be declared or imported.
            if (combinedDeclarations.lastIndexOf(type) === -1) {
                // We are exporting something which we don't explicitly declare or import.
                errors.push(`Can't export ${kind} ${stringifyForError(type)} from ${stringifyForError(moduleType)} as it was neither declared nor imported!`);
            }
        }
    }
    function verifyDeclarationIsUnique(type, suppressErrors) {
        type = resolveForwardRef(type);
        const existingModule = ownerNgModule.get(type);
        if (existingModule && existingModule !== moduleType) {
            if (!suppressErrors) {
                const modules = [existingModule, moduleType].map(stringifyForError).sort();
                errors.push(`Type ${stringifyForError(type)} is part of the declarations of 2 modules: ${modules[0]} and ${modules[1]}! ` +
                    `Please consider moving ${stringifyForError(type)} to a higher module that imports ${modules[0]} and ${modules[1]}. ` +
                    `You can also create a new NgModule that exports and includes ${stringifyForError(type)} then import that NgModule in ${modules[0]} and ${modules[1]}.`);
            }
        }
        else {
            // Mark type as having owner.
            ownerNgModule.set(type, moduleType);
        }
    }
    function verifyComponentIsPartOfNgModule(type) {
        type = resolveForwardRef(type);
        const existingModule = ownerNgModule.get(type);
        if (!existingModule && !isStandalone(type)) {
            errors.push(`Component ${stringifyForError(type)} is not part of any NgModule or the module has not been imported into your module.`);
        }
    }
    function verifyCorrectBootstrapType(type) {
        type = resolveForwardRef(type);
        if (!getComponentDef(type)) {
            errors.push(`${stringifyForError(type)} cannot be used as an entry component.`);
        }
        if (isStandalone(type)) {
            // Note: this error should be the same as the
            // `NGMODULE_BOOTSTRAP_IS_STANDALONE` one in AOT compiler.
            errors.push(`The \`${stringifyForError(type)}\` class is a standalone component, which can ` +
                `not be used in the \`@NgModule.bootstrap\` array. Use the \`bootstrapApplication\` ` +
                `function for bootstrap instead.`);
        }
    }
    function verifySemanticsOfNgModuleImport(type, importingModule) {
        type = resolveForwardRef(type);
        const directiveDef = getComponentDef(type) || getDirectiveDef(type);
        if (directiveDef !== null && !directiveDef.standalone) {
            throw new Error(`Unexpected directive '${type.name}' imported by the module '${importingModule.name}'. Please add an @NgModule annotation.`);
        }
        const pipeDef = getPipeDef$1(type);
        if (pipeDef !== null && !pipeDef.standalone) {
            throw new Error(`Unexpected pipe '${type.name}' imported by the module '${importingModule.name}'. Please add an @NgModule annotation.`);
        }
    }
}
function unwrapModuleWithProvidersImports(typeOrWithProviders) {
    typeOrWithProviders = resolveForwardRef(typeOrWithProviders);
    return typeOrWithProviders.ngModule || typeOrWithProviders;
}
function getAnnotation(type, name) {
    let annotation = null;
    collect(type.__annotations__);
    collect(type.decorators);
    return annotation;
    function collect(annotations) {
        if (annotations) {
            annotations.forEach(readAnnotation);
        }
    }
    function readAnnotation(decorator) {
        if (!annotation) {
            const proto = Object.getPrototypeOf(decorator);
            if (proto.ngMetadataName == name) {
                annotation = decorator;
            }
            else if (decorator.type) {
                const proto = Object.getPrototypeOf(decorator.type);
                if (proto.ngMetadataName == name) {
                    annotation = decorator.args[0];
                }
            }
        }
    }
}
/**
 * Keep track of compiled components. This is needed because in tests we often want to compile the
 * same component with more than one NgModule. This would cause an error unless we reset which
 * NgModule the component belongs to. We keep the list of compiled components here so that the
 * TestBed can reset it later.
 */
let ownerNgModule = new WeakMap();
let verifiedNgModule = new WeakMap();
function resetCompiledComponents() {
    ownerNgModule = new WeakMap();
    verifiedNgModule = new WeakMap();
    moduleQueue.length = 0;
    GENERATED_COMP_IDS.clear();
}
/**
 * Computes the combined declarations of explicit declarations, as well as declarations inherited by
 * traversing the exports of imported modules.
 * @param type
 */
function computeCombinedExports(type) {
    type = resolveForwardRef(type);
    const ngModuleDef = getNgModuleDef(type);
    // a standalone component, directive or pipe
    if (ngModuleDef === null) {
        return [type];
    }
    return flatten(maybeUnwrapFn(ngModuleDef.exports).map((type) => {
        const ngModuleDef = getNgModuleDef(type);
        if (ngModuleDef) {
            verifySemanticsOfNgModuleDef(type, false);
            return computeCombinedExports(type);
        }
        else {
            return type;
        }
    }));
}
/**
 * Some declared components may be compiled asynchronously, and thus may not have their
 * ɵcmp set yet. If this is the case, then a reference to the module is written into
 * the `ngSelectorScope` property of the declared type.
 */
function setScopeOnDeclaredComponents(moduleType, ngModule) {
    const declarations = flatten(ngModule.declarations || EMPTY_ARRAY);
    const transitiveScopes = transitiveScopesFor(moduleType);
    declarations.forEach((declaration) => {
        declaration = resolveForwardRef(declaration);
        if (declaration.hasOwnProperty(NG_COMP_DEF)) {
            // A `ɵcmp` field exists - go ahead and patch the component directly.
            const component = declaration;
            const componentDef = getComponentDef(component);
            patchComponentDefWithScope(componentDef, transitiveScopes);
        }
        else if (!declaration.hasOwnProperty(NG_DIR_DEF) &&
            !declaration.hasOwnProperty(NG_PIPE_DEF)) {
            // Set `ngSelectorScope` for future reference when the component compilation finishes.
            declaration.ngSelectorScope = moduleType;
        }
    });
}
/**
 * Patch the definition of a component with directives and pipes from the compilation scope of
 * a given module.
 */
function patchComponentDefWithScope(componentDef, transitiveScopes) {
    componentDef.directiveDefs = () => Array.from(transitiveScopes.compilation.directives)
        .map((dir) => dir.hasOwnProperty(NG_COMP_DEF) ? getComponentDef(dir) : getDirectiveDef(dir))
        .filter((def) => !!def);
    componentDef.pipeDefs = () => Array.from(transitiveScopes.compilation.pipes).map((pipe) => getPipeDef$1(pipe));
    componentDef.schemas = transitiveScopes.schemas;
    // Since we avoid Components/Directives/Pipes recompiling in case there are no overrides, we
    // may face a problem where previously compiled defs available to a given Component/Directive
    // are cached in TView and may become stale (in case any of these defs gets recompiled). In
    // order to avoid this problem, we force fresh TView to be created.
    componentDef.tView = null;
}
/**
 * Compute the pair of transitive scopes (compilation scope and exported scope) for a given type
 * (either a NgModule or a standalone component / directive / pipe).
 */
function transitiveScopesFor(type) {
    if (isNgModule(type)) {
        {
            const scope = depsTracker.getNgModuleScope(type);
            const def = getNgModuleDef(type, true);
            return {
                schemas: def.schemas || null,
                ...scope,
            };
        }
    }
    else if (isStandalone(type)) {
        const directiveDef = getComponentDef(type) || getDirectiveDef(type);
        if (directiveDef !== null) {
            return {
                schemas: null,
                compilation: {
                    directives: new Set(),
                    pipes: new Set(),
                },
                exported: {
                    directives: new Set([type]),
                    pipes: new Set(),
                },
            };
        }
        const pipeDef = getPipeDef$1(type);
        if (pipeDef !== null) {
            return {
                schemas: null,
                compilation: {
                    directives: new Set(),
                    pipes: new Set(),
                },
                exported: {
                    directives: new Set(),
                    pipes: new Set([type]),
                },
            };
        }
    }
    // TODO: change the error message to be more user-facing and take standalone into account
    throw new Error(`${type.name} does not have a module def (ɵmod property)`);
}
function expandModuleWithProviders(value) {
    if (isModuleWithProviders(value)) {
        return value.ngModule;
    }
    return value;
}

/**
 * Keep track of the compilation depth to avoid reentrancy issues during JIT compilation. This
 * matters in the following scenario:
 *
 * Consider a component 'A' that extends component 'B', both declared in module 'M'. During
 * the compilation of 'A' the definition of 'B' is requested to capture the inheritance chain,
 * potentially triggering compilation of 'B'. If this nested compilation were to trigger
 * `flushModuleScopingQueueAsMuchAsPossible` it may happen that module 'M' is still pending in the
 * queue, resulting in 'A' and 'B' to be patched with the NgModule scope. As the compilation of
 * 'A' is still in progress, this would introduce a circular dependency on its compilation. To avoid
 * this issue, the module scope queue is only flushed for compilations at the depth 0, to ensure
 * all compilations have finished.
 */
let compilationDepth = 0;
/**
 * Compile an Angular component according to its decorator metadata, and patch the resulting
 * component def (ɵcmp) onto the component type.
 *
 * Compilation may be asynchronous (due to the need to resolve URLs for the component template or
 * other resources, for example). In the event that compilation is not immediate, `compileComponent`
 * will enqueue resource resolution into a global queue and will fail to return the `ɵcmp`
 * until the global queue has been resolved with a call to `resolveComponentResources`.
 */
function compileComponent(type, metadata) {
    // Initialize ngDevMode. This must be the first statement in compileComponent.
    // See the `initNgDevMode` docstring for more information.
    (typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode();
    let ngComponentDef = null;
    // Metadata may have resources which need to be resolved.
    maybeQueueResolutionOfComponentResources(type, metadata);
    // Note that we're using the same function as `Directive`, because that's only subset of metadata
    // that we need to create the ngFactoryDef. We're avoiding using the component metadata
    // because we'd have to resolve the asynchronous templates.
    addDirectiveFactoryDef(type, metadata);
    Object.defineProperty(type, NG_COMP_DEF, {
        get: () => {
            if (ngComponentDef === null) {
                const compiler = getCompilerFacade({
                    usage: 0 /* JitCompilerUsage.Decorator */,
                    kind: 'component',
                    type: type,
                });
                if (componentNeedsResolution(metadata)) {
                    const error = [`Component '${type.name}' is not resolved:`];
                    if (metadata.templateUrl) {
                        error.push(` - templateUrl: ${metadata.templateUrl}`);
                    }
                    if (metadata.styleUrls && metadata.styleUrls.length) {
                        error.push(` - styleUrls: ${JSON.stringify(metadata.styleUrls)}`);
                    }
                    if (metadata.styleUrl) {
                        error.push(` - styleUrl: ${metadata.styleUrl}`);
                    }
                    error.push(`Did you run and wait for 'resolveComponentResources()'?`);
                    throw new Error(error.join('\n'));
                }
                // This const was called `jitOptions` previously but had to be renamed to `options` because
                // of a bug with Terser that caused optimized JIT builds to throw a `ReferenceError`.
                // This bug was investigated in https://github.com/angular/angular-cli/issues/17264.
                // We should not rename it back until https://github.com/terser/terser/issues/615 is fixed.
                const options = getJitOptions();
                let preserveWhitespaces = metadata.preserveWhitespaces;
                if (preserveWhitespaces === undefined) {
                    if (options !== null && options.preserveWhitespaces !== undefined) {
                        preserveWhitespaces = options.preserveWhitespaces;
                    }
                    else {
                        preserveWhitespaces = false;
                    }
                }
                let encapsulation = metadata.encapsulation;
                if (encapsulation === undefined) {
                    if (options !== null && options.defaultEncapsulation !== undefined) {
                        encapsulation = options.defaultEncapsulation;
                    }
                    else {
                        encapsulation = ViewEncapsulation.Emulated;
                    }
                }
                const templateUrl = metadata.templateUrl || `ng:///${type.name}/template.html`;
                const meta = {
                    ...directiveMetadata(type, metadata),
                    typeSourceSpan: compiler.createParseSourceSpan('Component', type.name, templateUrl),
                    template: metadata.template || '',
                    preserveWhitespaces,
                    styles: typeof metadata.styles === 'string'
                        ? [metadata.styles]
                        : metadata.styles || EMPTY_ARRAY,
                    animations: metadata.animations,
                    // JIT components are always compiled against an empty set of `declarations`. Instead, the
                    // `directiveDefs` and `pipeDefs` are updated at a later point:
                    //  * for NgModule-based components, they're set when the NgModule which declares the
                    //    component resolves in the module scoping queue
                    //  * for standalone components, they're set just below, after `compileComponent`.
                    declarations: [],
                    changeDetection: metadata.changeDetection,
                    encapsulation,
                    interpolation: metadata.interpolation,
                    viewProviders: metadata.viewProviders || null,
                };
                compilationDepth++;
                try {
                    if (meta.usesInheritance) {
                        addDirectiveDefToUndecoratedParents(type);
                    }
                    ngComponentDef = compiler.compileComponent(angularCoreEnv, templateUrl, meta);
                    if (meta.isStandalone) {
                        // Patch the component definition for standalone components with `directiveDefs` and
                        // `pipeDefs` functions which lazily compute the directives/pipes available in the
                        // standalone component. Also set `dependencies` to the lazily resolved list of imports.
                        const imports = flatten(metadata.imports || EMPTY_ARRAY);
                        const { directiveDefs, pipeDefs } = getStandaloneDefFunctions(type, imports);
                        ngComponentDef.directiveDefs = directiveDefs;
                        ngComponentDef.pipeDefs = pipeDefs;
                        ngComponentDef.dependencies = () => imports.map(resolveForwardRef);
                    }
                }
                finally {
                    // Ensure that the compilation depth is decremented even when the compilation failed.
                    compilationDepth--;
                }
                if (compilationDepth === 0) {
                    // When NgModule decorator executed, we enqueued the module definition such that
                    // it would only dequeue and add itself as module scope to all of its declarations,
                    // but only if  if all of its declarations had resolved. This call runs the check
                    // to see if any modules that are in the queue can be dequeued and add scope to
                    // their declarations.
                    flushModuleScopingQueueAsMuchAsPossible();
                }
                // If component compilation is async, then the @NgModule annotation which declares the
                // component may execute and set an ngSelectorScope property on the component type. This
                // allows the component to patch itself with directiveDefs from the module after it
                // finishes compiling.
                if (hasSelectorScope(type)) {
                    const scopes = transitiveScopesFor(type.ngSelectorScope);
                    patchComponentDefWithScope(ngComponentDef, scopes);
                }
                if (metadata.schemas) {
                    if (meta.isStandalone) {
                        ngComponentDef.schemas = metadata.schemas;
                    }
                    else {
                        throw new Error(`The 'schemas' was specified for the ${stringifyForError(type)} but is only valid on a component that is standalone.`);
                    }
                }
                else if (meta.isStandalone) {
                    ngComponentDef.schemas = [];
                }
            }
            return ngComponentDef;
        },
        set: (def) => {
            ngComponentDef = def;
        },
        // Make the property configurable in dev mode to allow overriding in tests
        configurable: !!ngDevMode,
    });
}
/**
 * Build memoized `directiveDefs` and `pipeDefs` functions for the component definition of a
 * standalone component, which process `imports` and filter out directives and pipes. The use of
 * memoized functions here allows for the delayed resolution of any `forwardRef`s present in the
 * component's `imports`.
 */
function getStandaloneDefFunctions(type, imports) {
    const directiveDefs = () => {
        {
            if (ngDevMode) {
                for (const rawDep of imports) {
                    verifyStandaloneI   mport(rawDep, type);
                }
            }
            if (!isComponent(type)) {
                return [];
            }
            const scope = depsTracker.getStandaloneComponentScope(type, imports);
            return [...scope.compilation.directives]
                .map((p) => (getComponentDef(p) || getDirectiveDef(p)))
                .filter((d) => d !== null);
        }
    };
    const pipeDefs = () => {
        {
            if (ngDevMode) {
                for (const rawDep of imports) {
                    verifyStandaloneImport(rawDep, type);
                }
            }
            if (!isComponent(type)) {
                return [];
            }
            const scope = depsTracker.getStandaloneComponentScope(type, imports);
            return [...scope.compilation.pipes].map((p) => getPipeDef$1(p)).filter((d) => d !== null);
        }
    };
    return {
        directiveDefs,
        pipeDefs,
    };
}
function hasSelectorScope(component) {
    return component.ngSelectorScope !== undefined;
}
/**
 * Compile an Angular directive according to its decorator metadata, and patch the resulting
 * directive def onto the component type.
 *
 * In the event that compilation is not immediate, `compileDirective` will return a `Promise` which
 * will resolve when compilation completes and the directive becomes usable.
 */
function compileDirective(type, directive) {
    let ngDirectiveDef = null;
    addDirectiveFactoryDef(type, directive || {});
    Object.defineProperty(type, NG_DIR_DEF, {
        get: () => {
            if (ngDirectiveDef === null) {
                // `directive` can be null in the case of abstract directives as a base class
                // that use `@Directive()` with no selector. In that case, pass empty object to the
                // `directiveMetadata` function instead of null.
                const meta = getDirectiveMetadata(type, directive || {});
                const compiler = getCompilerFacade({
                    usage: 0 /* JitCompilerUsage.Decorator */,
                    kind: 'directive',
                    type,
                });
                ngDirectiveDef = compiler.compileDirective(angularCoreEnv, meta.sourceMapUrl, meta.metadata);
            }
            return ngDirectiveDef;
        },
        // Make the property configurable in dev mode to allow overriding in tests
        configurable: !!ngDevMode,
    });
}
function getDirectiveMetadata(type, metadata) {
    const name = type && type.name;
    const sourceMapUrl = `ng:///${name}/ɵdir.js`;
    const compiler = getCompilerFacade({ usage: 0 /* JitCompilerUsage.Decorator */, kind: 'directive', type });
    const facade = directiveMetadata(type, metadata);
    facade.typeSourceSpan = compiler.createParseSourceSpan('Directive', name, sourceMapUrl);
    if (facade.usesInheritance) {
        addDirectiveDefToUndecoratedParents(type);
    }
    return { metadata: facade, sourceMapUrl };
}
function addDirectiveFactoryDef(type, metadata) {
    let ngFactoryDef = null;
    Object.defineProperty(type, NG_FACTORY_DEF, {
        get: () => {
            if (ngFactoryDef === null) {
                const meta = getDirectiveMetadata(type, metadata);
                const compiler = getCompilerFacade({
                    usage: 0 /* JitCompilerUsage.Decorator */,
                    kind: 'directive',
                    type,
                });
                ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${type.name}/ɵfac.js`, {
                    name: meta.metadata.name,
                    type: meta.metadata.type,
                    typeArgumentCount: 0,
                    deps: reflectDependencies(type),
                    target: compiler.FactoryTarget.Directive,
                });
            }
            return ngFactoryDef;
        },
        // Make the property configurable in dev mode to allow overriding in tests
        configurable: !!ngDevMode,
    });
}
function extendsDirectlyFromObject(type) {
    return Object.getPrototypeOf(type.prototype) === Object.prototype;
}
/**
 * Extract the `R3DirectiveMetadata` for a particular directive (either a `Directive` or a
 * `Component`).
 */
function directiveMetadata(type, metadata) {
    // Reflect inputs and outputs.
    const reflect = getReflect();
    const propMetadata = reflect.ownPropMetadata(type);
    return {
        name: type.name,
        type: type,
        selector: metadata.selector !== undefined ? metadata.selector : null,
        host: metadata.host || EMPTY_OBJ,
        propMetadata: propMetadata,
        inputs: metadata.inputs || EMPTY_ARRAY,
        outputs: metadata.outputs || EMPTY_ARRAY,
        queries: extractQueriesMetadata(type, propMetadata, isContentQuery),
        lifecycle: { usesOnChanges: reflect.hasLifecycleHook(type, 'ngOnChanges') },
        typeSourceSpan: null,
        usesInheritance: !extendsDirectlyFromObject(type),
        exportAs: extractExportAs(metadata.exportAs),
        providers: metadata.providers || null,
        viewQueries: extractQueriesMetadata(type, propMetadata, isViewQuery),
        isStandalone: metadata.standalone === undefined ? true : !!metadata.standalone,
        isSignal: !!metadata.signals,
        hostDirectives: metadata.hostDirectives?.map((directive) => typeof directive === 'function' ? { directive } : directive) || null,
    };
}
/**
 * Adds a directive definition to all parent classes of a type that don't have an Angular decorator.
 */
function addDirectiveDefToUndecoratedParents(type) {
    const objPrototype = Object.prototype;
    let parent = Object.getPrototypeOf(type.prototype).constructor;
    // Go up the prototype until we hit `Object`.
    while (parent && parent !== objPrototype) {
        // Since inheritance works if the class was annotated already, we only need to add
        // the def if there are no annotations and the def hasn't been created already.
        if (!getDirectiveDef(parent) &&
            !getComponentDef(parent) &&
            shouldAddAbstractDirective(parent)) {
            compileDirective(parent, null);
        }
        parent = Object.getPrototypeOf(parent);
    }
}
function convertToR3QueryPredicate(selector) {
    return typeof selector === 'string' ? splitByComma(selector) : resolveForwardRef(selector);
}
function convertToR3QueryMetadata(propertyName, ann) {
    return {
        propertyName: propertyName,
        predicate: convertToR3QueryPredicate(ann.selector),
        descendants: ann.descendants,
        first: ann.first,
        read: ann.read ? ann.read : null,
        static: !!ann.static,
        emitDistinctChangesOnly: !!ann.emitDistinctChangesOnly,
        isSignal: !!ann.isSignal,
    };
}
function extractQueriesMetadata(type, propMetadata, isQueryAnn) {
    const queriesMeta = [];
    for (const field in propMetadata) {
        if (propMetadata.hasOwnProperty(field)) {
            const annotations = propMetadata[field];
            annotations.forEach((ann) => {
                if (isQueryAnn(ann)) {
                    if (!ann.selector) {
                        throw new Error(`Can't construct a query for the property "${field}" of ` +
                            `"${stringifyForError(type)}" since the query selector wasn't defined.`);
                    }
                    if (annotations.some(isInputAnnotation)) {
                        throw new Error(`Cannot combine @Input decorators with query decorators`);
                    }
                    queriesMeta.push(convertToR3QueryMetadata(field, ann));
                }
            });
        }
    }
    return queriesMeta;
}
function extractExportAs(exportAs) {
    return exportAs === undefined ? null : splitByComma(exportAs);
}
function isContentQuery(value) {
    const name = value.ngMetadataName;
    return name === 'ContentChild' || name === 'ContentChildren';
}
function isViewQuery(value) {
    const name = value.ngMetadataName;
    return name === 'ViewChild' || name === 'ViewChildren';
}
function isInputAnnotation(value) {
    return value.ngMetadataName === 'Input';
}
function splitByComma(value) {
    return value.split(',').map((piece) => piece.trim());
}
const LIFECYCLE_HOOKS = [
    'ngOnChanges',
    'ngOnInit',
    'ngOnDestroy',
    'ngDoCheck',
    'ngAfterViewInit',
    'ngAfterViewChecked',
    'ngAfterContentInit',
    'ngAfterContentChecked',
];
function shouldAddAbstractDirective(type) {
    const reflect = getReflect();
    if (LIFECYCLE_HOOKS.some((hookName) => reflect.hasLifecycleHook(type, hookName))) {
        return true;
    }
    const propMetadata = reflect.propMetadata(type);
    for (const field in propMetadata) {
        const annotations = propMetadata[field];
        for (let i = 0; i < annotations.length; i++) {
            const current = annotations[i];
            const metadataName = current.ngMetadataName;
            if (isInputAnnotation(current) ||
                isContentQuery(current) ||
                isViewQuery(current) ||
                metadataName === 'Output' ||
                metadataName === 'HostBinding' ||
                metadataName === 'HostListener') {
                return true;
            }
        }
    }
    return false;
}

function compilePipe(type, meta) {
    let ngPipeDef = null;
    let ngFactoryDef = null;
    Object.defineProperty(type, NG_FACTORY_DEF, {
        get: () => {
            if (ngFactoryDef === null) {
                const metadata = getPipeMetadata(type, meta);
                const compiler = getCompilerFacade({
                    usage: 0 /* JitCompilerUsage.Decorator */,
                    kind: 'pipe',
                    type: metadata.type,
                });
                ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${metadata.name}/ɵfac.js`, {
                    name: metadata.name,
                    type: metadata.type,
                    typeArgumentCount: 0,
                    deps: reflectDependencies(type),
                    target: compiler.FactoryTarget.Pipe,
                });
            }
            return ngFactoryDef;
        },
        // Make the property configurable in dev mode to allow overriding in tests
        configurable: !!ngDevMode,
    });
    Object.defineProperty(type, NG_PIPE_DEF, {
        get: () => {
            if (ngPipeDef === null) {
                const metadata = getPipeMetadata(type, meta);
                const compiler = getCompilerFacade({
                    usage: 0 /* JitCompilerUsage.Decorator */,
                    kind: 'pipe',
                    type: metadata.type,
                });
                ngPipeDef = compiler.compilePipe(angularCoreEnv, `ng:///${metadata.name}/ɵpipe.js`, metadata);
            }
            return ngPipeDef;
        },
        // Make the property configurable in dev mode to allow overriding in tests
        configurable: !!ngDevMode,
    });
}
function getPipeMetadata(type, meta) {
    return {
        type: type,
        name: type.name,
        pipeName: meta.name,
        pure: meta.pure !== undefined ? meta.pure : true,
        isStandalone: meta.standalone === undefined ? true : !!meta.standalone,
    };
}

/**
 * Type of the Directive metadata.
 *
 * @publicApi
 */
const Directive = makeDecorator('Directive', (dir = {}) => dir, undefined, undefined, (type, meta) => compileDirective(type, meta));
/**
 * Component decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
const Component = makeDecorator('Component', (c = {}) => ({ changeDetection: ChangeDetectionStrategy.Default, ...c }), Directive, undefined, (type, meta) => compileComponent(type, meta));
/**
 * @Annotation
 * @publicApi
 */
const Pipe = makeDecorator('Pipe', (p) => ({ pure: true, ...p }), undefined, undefined, (type, meta) => compilePipe(type, meta));
/**
 * @Annotation
 * @publicApi
 */
const Input = makePropDecorator('Input', (arg) => {
    if (!arg) {
        return {};
    }
    return typeof arg === 'string' ? { alias: arg } : arg;
});
/**
 * @Annotation
 * @publicApi
 */
const Output = makePropDecorator('Output', (alias) => ({ alias }));
/**
 * @Annotation
 * @publicApi
 */
const HostBinding = makePropDecorator('HostBinding', (hostPropertyName) => ({ hostPropertyName }));
/**
 * @Annotation
 * @publicApi
 */
const HostListener = makePropDecorator('HostListener', (eventName, args) => ({ eventName, args }));

/**
 * @Annotation
 */
const NgModule = makeDecorator('NgModule', (ngModule) => ngModule, undefined, undefined, 
/**
 * Decorator that marks the following class as an NgModule, and supplies
 * configuration metadata for it.
 *
 * * The `declarations` option configures the compiler
 * with information about what belongs to the NgModule.
 * * The `providers` options configures the NgModule's injector to provide
 * dependencies the NgModule members.
 * * The `imports` and `exports` options bring in members from other modules, and make
 * this module's members available to others.
 */
(type, meta) => compileNgModule(type, meta));

/**
 * @description Represents the version of Angular
 *
 * @publicApi
 */
class Version {
    full;
    major;
    minor;
    patch;
    constructor(full) {
        this.full = full;
        const parts = full.split('.');
        this.major = parts[0];
        this.minor = parts[1];
        this.patch = parts.slice(2).join('.');
    }
}
/**
 * @publicApi
 */
const VERSION = new Version('19.2.14');

/**
 * Combination of NgModuleFactory and ComponentFactories.
 *
 * @publicApi
 *
 * @deprecated
 * Ivy JIT mode doesn't require accessing this symbol.
 */
class ModuleWithComponentFactories {
    ngModuleFactory;
    componentFactories;
    constructor(ngModuleFactory, componentFactories) {
        this.ngModuleFactory = ngModuleFactory;
        this.componentFactories = componentFactories;
    }
}
/**
 * Low-level service for running the angular compiler during runtime
 * to create {@link ComponentFactory}s, which
 * can later be used to create and render a Component instance.
 *
 * Each `@NgModule` provides an own `Compiler` to its injector,
 * that will use the directives/pipes of the ng module for compilation
 * of components.
 *
 * @publicApi
 *
 * @deprecated
 * Ivy JIT mode doesn't require accessing this symbol.
 */
class Compiler {
    /**
     * Compiles the given NgModule and all of its components. All templates of the components
     * have to be inlined.
     */
    compileModuleSync(moduleType) {
        return new NgModuleFactory(moduleType);
    }
    /**
     * Compiles the given NgModule and all of its components
     */
    compileModuleAsync(moduleType) {
        return Promise.resolve(this.compileModuleSync(moduleType));
    }
    /**
     * Same as {@link Compiler#compileModuleSync compileModuleSync} but also creates ComponentFactories for all components.
     */
    compileModuleAndAllComponentsSync(moduleType) {
        const ngModuleFactory = this.compileModuleSync(moduleType);
        const moduleDef = getNgModuleDef(moduleType);
        const componentFactories = maybeUnwrapFn(moduleDef.declarations).reduce((factories, declaration) => {
            const componentDef = getComponentDef(declaration);
            componentDef && factories.push(new ComponentFactory(componentDef));
            return factories;
        }, []);
        return new ModuleWithComponentFactories(ngModuleFactory, componentFactories);
    }
    /**
     * Same as {@link Compiler#compileModuleAsync compileModuleAsync} but also creates ComponentFactories for all components.
     */
    compileModuleAndAllComponentsAsync(moduleType) {
        return Promise.resolve(this.compileModuleAndAllComponentsSync(moduleType));
    }
    /**
     * Clears all caches.
     */
    clearCache() { }
    /**
     * Clears the cache for the given component/ngModule.
     */
    clearCacheFor(type) { }
    /**
     * Returns the id for a given NgModule, if one is defined and known to the compiler.
     */
    getModuleId(moduleType) {
        return undefined;
    }
    static ɵfac = function Compiler_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || Compiler)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: Compiler, factory: Compiler.ɵfac, providedIn: 'root' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Compiler, [{
        type: Injectable,
        args: [{ providedIn: 'root' }]
    }], null, null); })();
/**
 * Token to provide CompilerOptions in the platform injector.
 *
 * @publicApi
 */
const COMPILER_OPTIONS = new InjectionToken(ngDevMode ? 'compilerOptions' : '');
/**
 * A factory for creating a Compiler
 *
 * @publicApi
 *
 * @deprecated
 * Ivy JIT mode doesn't require accessing this symbol.
 */
class CompilerFactory {
}

function compileNgModuleFactory(injector, options, moduleType) {
    ngDevMode && assertNgModuleType(moduleType);
    const moduleFactory = new NgModuleFactory(moduleType);
    // All of the logic below is irrelevant for AOT-compiled code.
    if (typeof ngJitMode !== 'undefined' && !ngJitMode) {
        return Promise.resolve(moduleFactory);
    }
    const compilerOptions = injector.get(COMPILER_OPTIONS, []).concat(options);
    // Configure the compiler to use the provided options. This call may fail when multiple modules
    // are bootstrapped with incompatible options, as a component can only be compiled according to
    // a single set of options.
    setJitOptions({
        defaultEncapsulation: _lastDefined(compilerOptions.map((opts) => opts.defaultEncapsulation)),
        preserveWhitespaces: _lastDefined(compilerOptions.map((opts) => opts.preserveWhitespaces)),
    });
    if (isComponentResourceResolutionQueueEmpty()) {
        return Promise.resolve(moduleFactory);
    }
    const compilerProviders = compilerOptions.flatMap((option) => option.providers ?? []);
    // In case there are no compiler providers, we just return the module factory as
    // there won't be any resource loader. This can happen with Ivy, because AOT compiled
    // modules can be still passed through "bootstrapModule". In that case we shouldn't
    // unnecessarily require the JIT compiler.
    if (compilerProviders.length === 0) {
        return Promise.resolve(moduleFactory);
    }
    const compiler = getCompilerFacade({
        usage: 0 /* JitCompilerUsage.Decorator */,
        kind: 'NgModule',
        type: moduleType,
    });
    const compilerInjector = Injector.create({ providers: compilerProviders });
    const resourceLoader = compilerInjector.get(compiler.ResourceLoader);
    // The resource loader can also return a string while the "resolveComponentResources"
    // always expects a promise. Therefore we need to wrap the returned value in a promise.
    return resolveComponentResources((url) => Promise.resolve(resourceLoader.get(url))).then(() => moduleFactory);
}
function _lastDefined(args) {
    for (let i = args.length - 1; i >= 0; i--) {
        if (args[i] !== undefined) {
            return args[i];
        }
    }
    return undefined;
}

class NgZoneChangeDetectionScheduler {
    zone = inject(NgZone);
    changeDetectionScheduler = inject(ChangeDetectionScheduler);
    applicationRef = inject(ApplicationRef);
    _onMicrotaskEmptySubscription;
    initialize() {
        if (this._onMicrotaskEmptySubscription) {
            return;
        }
        this._onMicrotaskEmptySubscription = this.zone.onMicrotaskEmpty.subscribe({
            next: () => {
                // `onMicroTaskEmpty` can happen _during_ the zoneless scheduler change detection because
                // zone.run(() => {}) will result in `checkStable` at the end of the `zone.run` closure
                // and emit `onMicrotaskEmpty` synchronously if run coalsecing is false.
                if (this.changeDetectionScheduler.runningTick) {
                    return;
                }
                this.zone.run(() => {
                    this.applicationRef.tick();
                });
            },
        });
    }
    ngOnDestroy() {
        this._onMicrotaskEmptySubscription?.unsubscribe();
    }
    static ɵfac = function NgZoneChangeDetectionScheduler_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || NgZoneChangeDetectionScheduler)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: NgZoneChangeDetectionScheduler, factory: NgZoneChangeDetectionScheduler.ɵfac, providedIn: 'root' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgZoneChangeDetectionScheduler, [{
        type: Injectable,
        args: [{ providedIn: 'root' }]
    }], null, null); })();
/**
 * Internal token used to verify that `provideZoneChangeDetection` is not used
 * with the bootstrapModule API.
 */
const PROVIDED_NG_ZONE = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'provideZoneChangeDetection token' : '', { factory: () => false });
function internalProvideZoneChangeDetection({ ngZoneFactory, ignoreChangesOutsideZone, scheduleInRootZone, }) {
    ngZoneFactory ??= () => new NgZone({ ...getNgZoneOptions(), scheduleInRootZone });
    return [
        { provide: NgZone, useFactory: ngZoneFactory },
        {
            provide: ENVIRONMENT_INITIALIZER,
            multi: true,
            useFactory: () => {
                const ngZoneChangeDetectionScheduler = inject(NgZoneChangeDetectionScheduler, {
                    optional: true,
                });
                if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
                    ngZoneChangeDetectionScheduler === null) {
                    throw new RuntimeError(402 /* RuntimeErrorCode.MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP */, `A required Injectable was not found in the dependency injection tree. ` +
                        'If you are bootstrapping an NgModule, make sure that the `BrowserModule` is imported.');
                }
                return () => ngZoneChangeDetectionScheduler.initialize();
            },
        },
        {
            provide: ENVIRONMENT_INITIALIZER,
            multi: true,
            useFactory: () => {
                const service = inject(ZoneStablePendingTask);
                return () => {
                    service.initialize();
                };
            },
        },
        // Always disable scheduler whenever explicitly disabled, even if another place called
        // `provideZoneChangeDetection` without the 'ignore' option.
        ignoreChangesOutsideZone === true ? { provide: ZONELESS_SCHEDULER_DISABLED, useValue: true } : [],
        {
            provide: SCHEDULE_IN_ROOT_ZONE,
            useValue: scheduleInRootZone ?? SCHEDULE_IN_ROOT_ZONE_DEFAULT,
        },
    ];
}
/**
 * Provides `NgZone`-based change detection for the application bootstrapped using
 * `bootstrapApplication`.
 *
 * `NgZone` is already provided in applications by default. This provider allows you to configure
 * options like `eventCoalescing` in the `NgZone`.
 * This provider is not available for `platformBrowser().bootstrapModule`, which uses
 * `BootstrapOptions` instead.
 *
 * @usageNotes
 * ```ts
 * bootstrapApplication(MyApp, {providers: [
 *   provideZoneChangeDetection({eventCoalescing: true}),
 * ]});
 * ```
 *
 * @publicApi
 * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}
 * @see {@link NgZoneOptions}
 */
function provideZoneChangeDetection(options) {
    const ignoreChangesOutsideZone = options?.ignoreChangesOutsideZone;
    const scheduleInRootZone = options?.scheduleInRootZone;
    const zoneProviders = internalProvideZoneChangeDetection({
        ngZoneFactory: () => {
            const ngZoneOptions = getNgZoneOptions(options);
            ngZoneOptions.scheduleInRootZone = scheduleInRootZone;
            if (ngZoneOptions.shouldCoalesceEventChangeDetection) {
                performanceMarkFeature('NgZone_CoalesceEvent');
            }
            return new NgZone(ngZoneOptions);
        },
        ignoreChangesOutsideZone,
        scheduleInRootZone,
    });
    return makeEnvironmentProviders([
        { provide: PROVIDED_NG_ZONE, useValue: true },
        { provide: ZONELESS_ENABLED, useValue: false },
        zoneProviders,
    ]);
}
// Transforms a set of `BootstrapOptions` (supported by the NgModule-based bootstrap APIs) ->
// `NgZoneOptions` that are recognized by the NgZone constructor. Passing no options will result in
// a set of default options returned.
function getNgZoneOptions(options) {
    return {
        enableLongStackTrace: typeof ngDevMode === 'undefined' ? false : !!ngDevMode,
        shouldCoalesceEventChangeDetection: options?.eventCoalescing ?? false,
        shouldCoalesceRunChangeDetection: options?.runCoalescing ?? false,
    };
}
class ZoneStablePendingTask {
    subscription = new Subscription();
    initialized = false;
    zone = inject(NgZone);
    pendingTasks = inject(PendingTasksInternal);
    initialize() {
        if (this.initialized) {
            return;
        }
        this.initialized = true;
        let task = null;
        if (!this.zone.isStable && !this.zone.hasPendingMacrotasks && !this.zone.hasPendingMicrotasks) {
            task = this.pendingTasks.add();
        }
        this.zone.runOutsideAngular(() => {
            this.subscription.add(this.zone.onStable.subscribe(() => {
                NgZone.assertNotInAngularZone();
                // Check whether there are no pending macro/micro tasks in the next tick
                // to allow for NgZone to update the state.
                queueMicrotask(() => {
                    if (task !== null &&
                        !this.zone.hasPendingMacrotasks &&
                        !this.zone.hasPendingMicrotasks) {
                        this.pendingTasks.remove(task);
                        task = null;
                    }
                });
            }));
        });
        this.subscription.add(this.zone.onUnstable.subscribe(() => {
            NgZone.assertInAngularZone();
            task ??= this.pendingTasks.add();
        }));
    }
    ngOnDestroy() {
        this.subscription.unsubscribe();
    }
    static ɵfac = function ZoneStablePendingTask_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ZoneStablePendingTask)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: ZoneStablePendingTask, factory: ZoneStablePendingTask.ɵfac, providedIn: 'root' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ZoneStablePendingTask, [{
        type: Injectable,
        args: [{ providedIn: 'root' }]
    }], null, null); })();

const CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT = 100;
let consecutiveMicrotaskNotifications = 0;
let stackFromLastFewNotifications = [];
function trackMicrotaskNotificationForDebugging() {
    consecutiveMicrotaskNotifications++;
    if (CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT - consecutiveMicrotaskNotifications < 5) {
        const stack = new Error().stack;
        if (stack) {
            stackFromLastFewNotifications.push(stack);
        }
    }
    if (consecutiveMicrotaskNotifications === CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT) {
        throw new RuntimeError(103 /* RuntimeErrorCode.INFINITE_CHANGE_DETECTION */, 'Angular could not stabilize because there were endless change notifications within the browser event loop. ' +
            'The stack from the last several notifications: \n' +
            stackFromLastFewNotifications.join('\n'));
    }
}
class ChangeDetectionSchedulerImpl {
    appRef = inject(ApplicationRef);
    taskService = inject(PendingTasksInternal);
    ngZone = inject(NgZone);
    zonelessEnabled = inject(ZONELESS_ENABLED);
    tracing = inject(TracingService, { optional: true });
    disableScheduling = inject(ZONELESS_SCHEDULER_DISABLED, { optional: true }) ?? false;
    zoneIsDefined = typeof Zone !== 'undefined' && !!Zone.root.run;
    schedulerTickApplyArgs = [{ data: { '__scheduler_tick__': true } }];
    subscriptions = new Subscription();
    angularZoneId = this.zoneIsDefined
        ? this.ngZone._inner?.get(angularZoneInstanceIdProperty)
        : null;
    scheduleInRootZone = !this.zonelessEnabled &&
        this.zoneIsDefined &&
        (inject(SCHEDULE_IN_ROOT_ZONE, { optional: true }) ?? false);
    cancelScheduledCallback = null;
    useMicrotaskScheduler = false;
    runningTick = false;
    pendingRenderTaskId = null;
    constructor() {
        this.subscriptions.add(this.appRef.afterTick.subscribe(() => {
            // If the scheduler isn't running a tick but the application ticked, that means
            // someone called ApplicationRef.tick manually. In this case, we should cancel
            // any change detections that had been scheduled so we don't run an extra one.
            if (!this.runningTick) {
                this.cleanup();
            }
        }));
        this.subscriptions.add(this.ngZone.onUnstable.subscribe(() => {
            // If the zone becomes unstable when we're not running tick (this happens from the zone.run),
            // we should cancel any scheduled change detection here because at this point we
            // know that the zone will stabilize at some point and run change detection itself.
            if (!this.runningTick) {
                this.cleanup();
            }
        }));
        // TODO(atscott): These conditions will need to change when zoneless is the default
        // Instead, they should flip to checking if ZoneJS scheduling is provided
        this.disableScheduling ||=
            !this.zonelessEnabled &&
                // NoopNgZone without enabling zoneless means no scheduling whatsoever
                (this.ngZone instanceof NoopNgZone ||
                    // The same goes for the lack of Zone without enabling zoneless scheduling
                    !this.zoneIsDefined);
    }
    notify(source) {
        if (!this.zonelessEnabled && source === 5 /* NotificationSource.Listener */) {
            // When the notification comes from a listener, we skip the notification unless the
            // application has enabled zoneless. Ideally, listeners wouldn't notify the scheduler at all
            // automatically. We do not know that a developer made a change in the listener callback that
            // requires an `ApplicationRef.tick` (synchronize templates / run render hooks). We do this
            // only for an easier migration from OnPush components to zoneless. Because listeners are
            // usually executed inside the Angular zone and listeners automatically call `markViewDirty`,
            // developers never needed to manually use `ChangeDetectorRef.markForCheck` or some other API
            // to make listener callbacks work correctly with `OnPush` components.
            return;
        }
        let force = false;
        switch (source) {
            case 0 /* NotificationSource.MarkAncestorsForTraversal */: {
                this.appRef.dirtyFlags |= 2 /* ApplicationRefDirtyFlags.ViewTreeTraversal */;
                break;
            }
            case 3 /* NotificationSource.DebugApplyChanges */:
            case 2 /* NotificationSource.DeferBlockStateUpdate */:
            case 4 /* NotificationSource.MarkForCheck */:
            case 5 /* NotificationSource.Listener */:
            case 1 /* NotificationSource.SetInput */: {
                this.appRef.dirtyFlags |= 4 /* ApplicationRefDirtyFlags.ViewTreeCheck */;
                break;
            }
            case 6 /* NotificationSource.CustomElement */: {
                // We use `ViewTreeTraversal` to ensure we refresh the element even if this is triggered
                // during CD. In practice this is a no-op since the elements code also calls via a
                // `markForRefresh()` API which sends `NotificationSource.MarkAncestorsForTraversal` anyway.
                this.appRef.dirtyFlags |= 2 /* ApplicationRefDirtyFlags.ViewTreeTraversal */;
                force = true;
                break;
            }
            case 12 /* NotificationSource.RootEffect */: {
                this.appRef.dirtyFlags |= 16 /* ApplicationRefDirtyFlags.RootEffects */;
                // Root effects still force a CD, even if the scheduler is disabled. This ensures that
                // effects always run, even when triggered from outside the zone when the scheduler is
                // otherwise disabled.
                force = true;
                break;
            }
            case 13 /* NotificationSource.ViewEffect */: {
                // This is technically a no-op, since view effects will also send a
                // `MarkAncestorsForTraversal` notification. Still, we set this for logical consistency.
                this.appRef.dirtyFlags |= 2 /* ApplicationRefDirtyFlags.ViewTreeTraversal */;
                // View effects still force a CD, even if the scheduler is disabled. This ensures that
                // effects always run, even when triggered from outside the zone when the scheduler is
                // otherwise disabled.
                force = true;
                break;
            }
            case 11 /* NotificationSource.PendingTaskRemoved */: {
                // Removing a pending task via the public API forces a scheduled tick, ensuring that
                // stability is async and delayed until there was at least an opportunity to run
                // application synchronization. This prevents some footguns when working with the
                // public API for pending tasks where developers attempt to update application state
                // immediately after removing the last task.
                force = true;
                break;
            }
            case 9 /* NotificationSource.ViewDetachedFromDOM */:
            case 8 /* NotificationSource.ViewAttached */:
            case 7 /* NotificationSource.RenderHook */:
            case 10 /* NotificationSource.AsyncAnimationsLoaded */:
            default: {
                // These notifications only schedule a tick but do not change whether we should refresh
                // views. Instead, we only need to run render hooks unless another notification from the
                // other set is also received before `tick` happens.
                this.appRef.dirtyFlags |= 8 /* ApplicationRefDirtyFlags.AfterRender */;
            }
        }
        // If not already defined, attempt to capture a tracing snapshot of this
        // notification so that the resulting CD run can be attributed to the
        // context which produced the notification.
        this.appRef.tracingSnapshot = this.tracing?.snapshot(this.appRef.tracingSnapshot) ?? null;
        if (!this.shouldScheduleTick(force)) {
            return;
        }
        if (typeof ngDevMode === 'undefined' || ngDevMode) {
            if (this.useMicrotaskScheduler) {
                trackMicrotaskNotificationForDebugging();
            }
            else {
                consecutiveMicrotaskNotifications = 0;
                stackFromLastFewNotifications.length = 0;
            }
        }
        const scheduleCallback = this.useMicrotaskScheduler
            ? scheduleCallbackWithMicrotask
            : scheduleCallbackWithRafRace;
        this.pendingRenderTaskId = this.taskService.add();
        if (this.scheduleInRootZone) {
            this.cancelScheduledCallback = Zone.root.run(() => scheduleCallback(() => this.tick()));
        }
        else {
            this.cancelScheduledCallback = this.ngZone.runOutsideAngular(() => scheduleCallback(() => this.tick()));
        }
    }
    shouldScheduleTick(force) {
        if ((this.disableScheduling && !force) || this.appRef.destroyed) {
            return false;
        }
        // already scheduled or running
        if (this.pendingRenderTaskId !== null || this.runningTick || this.appRef._runningTick) {
            return false;
        }
        // If we're inside the zone don't bother with scheduler. Zone will stabilize
        // eventually and run change detection.
        if (!this.zonelessEnabled &&
            this.zoneIsDefined &&
            Zone.current.get(angularZoneInstanceIdProperty + this.angularZoneId)) {
            return false;
        }
        return true;
    }
    /**
     * Calls ApplicationRef._tick inside the `NgZone`.
     *
     * Calling `tick` directly runs change detection and cancels any change detection that had been
     * scheduled previously.
     *
     * @param shouldRefreshViews Passed directly to `ApplicationRef._tick` and skips straight to
     *     render hooks when `false`.
     */
    tick() {
        // When ngZone.run below exits, onMicrotaskEmpty may emit if the zone is
        // stable. We want to prevent double ticking so we track whether the tick is
        // already running and skip it if so.
        if (this.runningTick || this.appRef.destroyed) {
            return;
        }
        // If we reach the tick and there is no work to be done in ApplicationRef.tick,
        // skip it altogether and clean up. There may be no work if, for example, the only
        // event that notified the scheduler was the removal of a pending task.
        if (this.appRef.dirtyFlags === 0 /* ApplicationRefDirtyFlags.None */) {
            this.cleanup();
            return;
        }
        // The scheduler used to pass "whether to check views" as a boolean flag instead of setting
        // fine-grained dirtiness flags, and global checking was always used on the first pass. This
        // created an interesting edge case: if a notification made a view dirty and then ticked via the
        // scheduler (and not the zone) a global check was still performed.
        //
        // Ideally, this would not be the case, and only zone-based ticks would do global passes.
        // However this is a breaking change and requires fixes in g3. Until this cleanup can be done,
        // we add the `ViewTreeGlobal` flag to request a global check if any views are dirty in a
        // scheduled tick (unless zoneless is enabled, in which case global checks aren't really a
        // thing).
        //
        // TODO(alxhub): clean up and remove this workaround as a breaking change.
        if (!this.zonelessEnabled && this.appRef.dirtyFlags & 7 /* ApplicationRefDirtyFlags.ViewTreeAny */) {
            this.appRef.dirtyFlags |= 1 /* ApplicationRefDirtyFlags.ViewTreeGlobal */;
        }
        const task = this.taskService.add();
        try {
            this.ngZone.run(() => {
                this.runningTick = true;
                this.appRef._tick();
            }, undefined, this.schedulerTickApplyArgs);
        }
        catch (e) {
            this.taskService.remove(task);
            throw e;
        }
        finally {
            this.cleanup();
        }
        // If we're notified of a change within 1 microtask of running change
        // detection, run another round in the same event loop. This allows code
        // which uses Promise.resolve (see NgModel) to avoid
        // ExpressionChanged...Error to still be reflected in a single browser
        // paint, even if that spans multiple rounds of change detection.
        this.useMicrotaskScheduler = true;
        scheduleCallbackWithMicrotask(() => {
            this.useMicrotaskScheduler = false;
            this.taskService.remove(task);
        });
    }
    ngOnDestroy() {
        this.subscriptions.unsubscribe();
        this.cleanup();
    }
    cleanup() {
        this.runningTick = false;
        this.cancelScheduledCallback?.();
        this.cancelScheduledCallback = null;
        // If this is the last task, the service will synchronously emit a stable
        // notification. If there is a subscriber that then acts in a way that
        // tries to notify the scheduler again, we need to be able to respond to
        // schedule a new change detection. Therefore, we should clear the task ID
        // before removing it from the pending tasks (or the tasks service should
        // not synchronously emit stable, similar to how Zone stableness only
        // happens if it's still stable after a microtask).
        if (this.pendingRenderTaskId !== null) {
            const taskId = this.pendingRenderTaskId;
            this.pendingRenderTaskId = null;
            this.taskService.remove(taskId);
        }
    }
    static ɵfac = function ChangeDetectionSchedulerImpl_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ChangeDetectionSchedulerImpl)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: ChangeDetectionSchedulerImpl, factory: ChangeDetectionSchedulerImpl.ɵfac, providedIn: 'root' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ChangeDetectionSchedulerImpl, [{
        type: Injectable,
        args: [{ providedIn: 'root' }]
    }], () => [], null); })();
/**
 * Provides change detection without ZoneJS for the application bootstrapped using
 * `bootstrapApplication`.
 *
 * This function allows you to configure the application to not use the state/state changes of
 * ZoneJS to schedule change detection in the application. This will work when ZoneJS is not present
 * on the page at all or if it exists because something else is using it (either another Angular
 * application which uses ZoneJS for scheduling or some other library that relies on ZoneJS).
 *
 * This can also be added to the `TestBed` providers to configure the test environment to more
 * closely match production behavior. This will help give higher confidence that components are
 * compatible with zoneless change detection.
 *
 * ZoneJS uses browser events to trigger change detection. When using this provider, Angular will
 * instead use Angular APIs to schedule change detection. These APIs include:
 *
 * - `ChangeDetectorRef.markForCheck`
 * - `ComponentRef.setInput`
 * - updating a signal that is read in a template
 * - when bound host or template listeners are triggered
 * - attaching a view that was marked dirty by one of the above
 * - removing a view
 * - registering a render hook (templates are only refreshed if render hooks do one of the above)
 *
 * @usageNotes
 * ```ts
 * bootstrapApplication(MyApp, {providers: [
 *   provideExperimentalZonelessChangeDetection(),
 * ]});
 * ```
 *
 * This API is experimental. Neither the shape, nor the underlying behavior is stable and can change
 * in patch versions. There are known feature gaps and API ergonomic considerations. We will iterate
 * on the exact API based on the feedback and our understanding of the problem and solution space.
 *
 * @publicApi
 * @experimental
 * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}
 */
function provideExperimentalZonelessChangeDetection() {
    performanceMarkFeature('NgZoneless');
    if ((typeof ngDevMode === 'undefined' || ngDevMode) && typeof Zone !== 'undefined' && Zone) {
        const message = formatRuntimeError(914 /* RuntimeErrorCode.UNEXPECTED_ZONEJS_PRESENT_IN_ZONELESS_MODE */, `The application is using zoneless change detection, but is still loading Zone.js. ` +
            `Consider removing Zone.js to get the full benefits of zoneless. ` +
            `In applications using the Angular CLI, Zone.js is typically included in the "polyfills" section of the angular.json file.`);
        console.warn(message);
    }
    return makeEnvironmentProviders([
        { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
        { provide: NgZone, useClass: NoopNgZone },
        { provide: ZONELESS_ENABLED, useValue: true },
        { provide: SCHEDULE_IN_ROOT_ZONE, useValue: false },
        typeof ngDevMode === 'undefined' || ngDevMode
            ? [{ provide: PROVIDED_ZONELESS, useValue: true }]
            : [],
    ]);
}

/// <reference path="../../../goog.d.ts" />
/**
 * Work out the locale from the potential global properties.
 *
 * * Closure Compiler: use `goog.LOCALE`.
 * * Ivy enabled: use `$localize.locale`
 */
function getGlobalLocale() {
    if (typeof ngI18nClosureMode !== 'undefined' &&
        ngI18nClosureMode &&
        typeof goog !== 'undefined' &&
        goog.LOCALE !== 'en') {
        // * The default `goog.LOCALE` value is `en`, while Angular used `en-US`.
        // * In order to preserve backwards compatibility, we use Angular default value over
        //   Closure Compiler's one.
        return goog.LOCALE;
    }
    else {
        // KEEP `typeof $localize !== 'undefined' && $localize.locale` IN SYNC WITH THE LOCALIZE
        // COMPILE-TIME INLINER.
        //
        // * During compile time inlining of translations the expression will be replaced
        //   with a string literal that is the current locale. Other forms of this expression are not
        //   guaranteed to be replaced.
        //
        // * During runtime translation evaluation, the developer is required to set `$localize.locale`
        //   if required, or just to provide their own `LOCALE_ID` provider.
        return (typeof $localize !== 'undefined' && $localize.locale) || DEFAULT_LOCALE_ID;
    }
}
/**
 * Provide this token to set the locale of your application.
 * It is used for i18n extraction, by i18n pipes (DatePipe, I18nPluralPipe, CurrencyPipe,
 * DecimalPipe and PercentPipe) and by ICU expressions.
 *
 * See the [i18n guide](guide/i18n/locale-id) for more information.
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import { LOCALE_ID } from '@angular/core';
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   providers: [{provide: LOCALE_ID, useValue: 'en-US' }]
 * });
 * ```
 *
 * @publicApi
 */
const LOCALE_ID = new InjectionToken(ngDevMode ? 'LocaleId' : '', {
    providedIn: 'root',
    factory: () => inject(LOCALE_ID, InjectFlags.Optional | InjectFlags.SkipSelf) || getGlobalLocale(),
});
/**
 * Provide this token to set the default currency code your application uses for
 * CurrencyPipe when there is no currency code passed into it. This is only used by
 * CurrencyPipe and has no relation to locale currency. Defaults to USD if not configured.
 *
 * See the [i18n guide](guide/i18n/locale-id) for more information.
 *
 * <div class="docs-alert docs-alert-helpful">
 *
 * The default currency code is currently always `USD`.
 *
 * If you need the previous behavior then set it by creating a `DEFAULT_CURRENCY_CODE` provider in
 * your application `NgModule`:
 *
 * ```ts
 * {provide: DEFAULT_CURRENCY_CODE, useValue: 'USD'}
 * ```
 *
 * </div>
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   providers: [{provide: DEFAULT_CURRENCY_CODE, useValue: 'EUR' }]
 * });
 * ```
 *
 * @publicApi
 */
const DEFAULT_CURRENCY_CODE = new InjectionToken(ngDevMode ? 'DefaultCurrencyCode' : '', {
    providedIn: 'root',
    factory: () => USD_CURRENCY_CODE,
});
/**
 * Use this token at bootstrap to provide the content of your translation file (`xtb`,
 * `xlf` or `xlf2`) when you want to translate your application in another language.
 *
 * See the [i18n guide](guide/i18n/merge) for more information.
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import { TRANSLATIONS } from '@angular/core';
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * // content of your translation file
 * const translations = '....';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   providers: [{provide: TRANSLATIONS, useValue: translations }]
 * });
 * ```
 *
 * @publicApi
 */
const TRANSLATIONS = new InjectionToken(ngDevMode ? 'Translations' : '');
/**
 * Provide this token at bootstrap to set the format of your {@link TRANSLATIONS}: `xtb`,
 * `xlf` or `xlf2`.
 *
 * See the [i18n guide](guide/i18n/merge) for more information.
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import { TRANSLATIONS_FORMAT } from '@angular/core';
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   providers: [{provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }]
 * });
 * ```
 *
 * @publicApi
 */
const TRANSLATIONS_FORMAT = new InjectionToken(ngDevMode ? 'TranslationsFormat' : '');
/**
 * Use this enum at bootstrap as an option of `bootstrapModule` to define the strategy
 * that the compiler should use in case of missing translations:
 * - Error: throw if you have missing translations.
 * - Warning (default): show a warning in the console and/or shell.
 * - Ignore: do nothing.
 *
 * See the [i18n guide](guide/i18n/merge#report-missing-translations) for more information.
 *
 * @usageNotes
 * ### Example
 * ```ts
 * import { MissingTranslationStrategy } from '@angular/core';
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   missingTranslation: MissingTranslationStrategy.Error
 * });
 * ```
 *
 * @publicApi
 */
var MissingTranslationStrategy;
(function (MissingTranslationStrategy) {
    MissingTranslationStrategy[MissingTranslationStrategy["Error"] = 0] = "Error";
    MissingTranslationStrategy[MissingTranslationStrategy["Warning"] = 1] = "Warning";
    MissingTranslationStrategy[MissingTranslationStrategy["Ignore"] = 2] = "Ignore";
})(MissingTranslationStrategy || (MissingTranslationStrategy = {}));

// A delay in milliseconds before the scan is run after onLoad, to avoid any
// potential race conditions with other LCP-related functions. This delay
// happens outside of the main JavaScript execution and will only effect the timing
// on when the warning becomes visible in the console.
const SCAN_DELAY = 200;
const OVERSIZED_IMAGE_TOLERANCE = 1200;
class ImagePerformanceWarning {
    // Map of full image URLs -> original `ngSrc` values.
    window = null;
    observer = null;
    options = inject(IMAGE_CONFIG);
    lcpImageUrl;
    start() {
        if ((typeof ngServerMode !== 'undefined' && ngServerMode) ||
            typeof PerformanceObserver === 'undefined' ||
            (this.options?.disableImageSizeWarning && this.options?.disableImageLazyLoadWarning)) {
            return;
        }
        this.observer = this.initPerformanceObserver();
        const doc = getDocument();
        const win = doc.defaultView;
        if (win) {
            this.window = win;
            // Wait to avoid race conditions where LCP image triggers
            // load event before it's recorded by the performance observer
            const waitToScan = () => {
                setTimeout(this.scanImages.bind(this), SCAN_DELAY);
            };
            const setup = () => {
                // Consider the case when the application is created and destroyed multiple times.
                // Typically, applications are created instantly once the page is loaded, and the
                // `window.load` listener is always triggered. However, the `window.load` event will never
                // be fired if the page is loaded, and the application is created later. Checking for
                // `readyState` is the easiest way to determine whether the page has been loaded or not.
                if (doc.readyState === 'complete') {
                    waitToScan();
                }
                else {
                    this.window?.addEventListener('load', waitToScan, { once: true });
                }
            };
            // Angular doesn't have to run change detection whenever any asynchronous tasks are invoked in
            // the scope of this functionality.
            if (typeof Zone !== 'undefined') {
                Zone.root.run(() => setup());
            }
            else {
                setup();
            }
        }
    }
    ngOnDestroy() {
        this.observer?.disconnect();
    }
    initPerformanceObserver() {
        if (typeof PerformanceObserver === 'undefined') {
            return null;
        }
        const observer = new PerformanceObserver((entryList) => {
            const entries = entryList.getEntries();
            if (entries.length === 0)
                return;
            // We use the latest entry produced by the `PerformanceObserver` as the best
            // signal on which element is actually an LCP one. As an example, the first image to load on
            // a page, by virtue of being the only thing on the page so far, is often a LCP candidate
            // and gets reported by PerformanceObserver, but isn't necessarily the LCP element.
            const lcpElement = entries[entries.length - 1];
            // Cast to `any` due to missing `element` on the `LargestContentfulPaint` type of entry.
            // See https://developer.mozilla.org/en-US/docs/Web/API/LargestContentfulPaint
            const imgSrc = lcpElement.element?.src ?? '';
            // Exclude `data:` and `blob:` URLs, since they are fetched resources.
            if (imgSrc.startsWith('data:') || imgSrc.startsWith('blob:'))
                return;
            this.lcpImageUrl = imgSrc;
        });
        observer.observe({ type: 'largest-contentful-paint', buffered: true });
        return observer;
    }
    scanImages() {
        const images = getDocument().querySelectorAll('img');
        let lcpElementFound, lcpElementLoadedCorrectly = false;
        images.forEach((image) => {
            if (!this.options?.disableImageSizeWarning) {
                // Image elements using the NgOptimizedImage directive are excluded,
                // as that directive has its own version of this check.
                if (!image.getAttribute('ng-img') && this.isOversized(image)) {
                    logOversizedImageWarning(image.src);
                }
            }
            if (!this.options?.disableImageLazyLoadWarning && this.lcpImageUrl) {
                if (image.src === this.lcpImageUrl) {
                    lcpElementFound = true;
                    if (image.loading !== 'lazy' || image.getAttribute('ng-img')) {
                        // This variable is set to true and never goes back to false to account
                        // for the case where multiple images have the same src url, and some
                        // have lazy loading while others don't.
                        // Also ignore NgOptimizedImage because there's a different warning for that.
                        lcpElementLoadedCorrectly = true;
                    }
                }
            }
        });
        if (lcpElementFound &&
            !lcpElementLoadedCorrectly &&
            this.lcpImageUrl &&
            !this.options?.disableImageLazyLoadWarning) {
            logLazyLCPWarning(this.lcpImageUrl);
        }
    }
    isOversized(image) {
        if (!this.window) {
            return false;
        }
        // The `isOversized` check may not be applicable or may require adjustments
        // for several types of image formats or scenarios. Currently, we specify only
        // `svg`, but this may also include `gif` since their quality isn’t tied to
        // dimensions in the same way as raster images.
        const nonOversizedImageExtentions = [
            // SVG images are vector-based, which means they can scale
            // to any size without losing quality.
            '.svg',
        ];
        // Convert it to lowercase because this may have uppercase
        // extensions, such as `IMAGE.SVG`.
        // We fallback to an empty string because `src` may be `undefined`
        // if it is explicitly set to `null` by some third-party code
        // (e.g., `image.src = null`).
        const imageSource = (image.src || '').toLowerCase();
        if (nonOversizedImageExtentions.some((extension) => imageSource.endsWith(extension))) {
            return false;
        }
        const computedStyle = this.window.getComputedStyle(image);
        let renderedWidth = parseFloat(computedStyle.getPropertyValue('width'));
        let renderedHeight = parseFloat(computedStyle.getPropertyValue('height'));
        const boxSizing = computedStyle.getPropertyValue('box-sizing');
        const objectFit = computedStyle.getPropertyValue('object-fit');
        if (objectFit === `cover`) {
            // Object fit cover may indicate a use case such as a sprite sheet where
            // this warning does not apply.
            return false;
        }
        if (boxSizing === 'border-box') {
            // If the image `box-sizing` is set to `border-box`, we adjust the rendered
            // dimensions by subtracting padding values.
            const paddingTop = computedStyle.getPropertyValue('padding-top');
            const paddingRight = computedStyle.getPropertyValue('padding-right');
            const paddingBottom = computedStyle.getPropertyValue('padding-bottom');
            const paddingLeft = computedStyle.getPropertyValue('padding-left');
            renderedWidth -= parseFloat(paddingRight) + parseFloat(paddingLeft);
            renderedHeight -= parseFloat(paddingTop) + parseFloat(paddingBottom);
        }
        const intrinsicWidth = image.naturalWidth;
        const intrinsicHeight = image.naturalHeight;
        const recommendedWidth = this.window.devicePixelRatio * renderedWidth;
        const recommendedHeight = this.window.devicePixelRatio * renderedHeight;
        const oversizedWidth = intrinsicWidth - recommendedWidth >= OVERSIZED_IMAGE_TOLERANCE;
        const oversizedHeight = intrinsicHeight - recommendedHeight >= OVERSIZED_IMAGE_TOLERANCE;
        return oversizedWidth || oversizedHeight;
    }
    static ɵfac = function ImagePerformanceWarning_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ImagePerformanceWarning)(); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: ImagePerformanceWarning, factory: ImagePerformanceWarning.ɵfac, providedIn: 'root' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ImagePerformanceWarning, [{
        type: Injectable,
        args: [{ providedIn: 'root' }]
    }], null, null); })();
function logLazyLCPWarning(src) {
    console.warn(formatRuntimeError(-913 /* RuntimeErrorCode.IMAGE_PERFORMANCE_WARNING */, `An image with src ${src} is the Largest Contentful Paint (LCP) element ` +
        `but was given a "loading" value of "lazy", which can negatively impact ` +
        `application loading performance. This warning can be addressed by ` +
        `changing the loading value of the LCP image to "eager", or by using the ` +
        `NgOptimizedImage directive's prioritization utilities. For more ` +
        `information about addressing or disabling this warning, see ` +
        `https://angular.dev/errors/NG0913`));
}
function logOversizedImageWarning(src) {
    console.warn(formatRuntimeError(-913 /* RuntimeErrorCode.IMAGE_PERFORMANCE_WARNING */, `An image with src ${src} has intrinsic file dimensions much larger than its ` +
        `rendered size. This can negatively impact application loading performance. ` +
        `For more information about addressing or disabling this warning, see ` +
        `https://angular.dev/errors/NG0913`));
}

/**
 * Internal token that allows to register extra callbacks that should be invoked during the
 * `PlatformRef.destroy` operation. This token is needed to avoid a direct reference to the
 * `PlatformRef` class (i.e. register the callback via `PlatformRef.onDestroy`), thus making the
 * entire class tree-shakeable.
 */
const PLATFORM_DESTROY_LISTENERS = new InjectionToken(ngDevMode ? 'PlatformDestroyListeners' : '');

/**
 * InjectionToken to control root component bootstrap behavior.
 *
 * This token is primarily used in Angular's server-side rendering (SSR) scenarios,
 * particularly by the `@angular/ssr` package, to manage whether the root component
 * should be bootstrapped during the application initialization process.
 *
 * ## Purpose:
 * During SSR route extraction, setting this token to `false` prevents Angular from
 * bootstrapping the root component. This avoids unnecessary component rendering,
 * enabling route extraction without requiring additional APIs or triggering
 * component logic.
 *
 * ## Behavior:
 * - **`false`**: Prevents the root component from being bootstrapped.
 * - **`true`** (default): Proceeds with the normal root component bootstrap process.
 *
 * This mechanism ensures SSR can efficiently separate route extraction logic
 * from component rendering.
 */
const ENABLE_ROOT_COMPONENT_BOOTSTRAP = new InjectionToken(ngDevMode ? 'ENABLE_ROOT_COMPONENT_BOOTSTRAP' : '');
function isApplicationBootstrapConfig(config) {
    return !config.moduleRef;
}
function bootstrap(config) {
    const envInjector = isApplicationBootstrapConfig(config)
        ? config.r3Injector
        : config.moduleRef.injector;
    const ngZone = envInjector.get(NgZone);
    return ngZone.run(() => {
        if (isApplicationBootstrapConfig(config)) {
            config.r3Injector.resolveInjectorInitializers();
        }
        else {
            config.moduleRef.resolveInjectorInitializers();
        }
        const exceptionHandler = envInjector.get(ErrorHandler, null);
        if (typeof ngDevMode === 'undefined' || ngDevMode) {
            if (exceptionHandler === null) {
                const errorMessage = isApplicationBootstrapConfig(config)
                    ? 'No `ErrorHandler` found in the Dependency Injection tree.'
                    : 'No ErrorHandler. Is platform module (BrowserModule) included';
                throw new RuntimeError(402 /* RuntimeErrorCode.MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP */, errorMessage);
            }
            if (envInjector.get(PROVIDED_ZONELESS) && envInjector.get(PROVIDED_NG_ZONE)) {
                throw new RuntimeError(408 /* RuntimeErrorCode.PROVIDED_BOTH_ZONE_AND_ZONELESS */, 'Invalid change detection configuration: ' +
                    'provideZoneChangeDetection and provideExperimentalZonelessChangeDetection cannot be used together.');
            }
        }
        let onErrorSubscription;
        ngZone.runOutsideAngular(() => {
            onErrorSubscription = ngZone.onError.subscribe({
                next: (error) => {
                    exceptionHandler.handleError(error);
                },
            });
        });
        // If the whole platform is destroyed, invoke the `destroy` method
        // for all bootstrapped applications as well.
        if (isApplicationBootstrapConfig(config)) {
            const destroyListener = () => envInjector.destroy();
            const onPlatformDestroyListeners = config.platformInjector.get(PLATFORM_DESTROY_LISTENERS);
            onPlatformDestroyListeners.add(destroyListener);
            envInjector.onDestroy(() => {
                onErrorSubscription.unsubscribe();
                onPlatformDestroyListeners.delete(destroyListener);
            });
        }
        else {
            const destroyListener = () => config.moduleRef.destroy();
            const onPlatformDestroyListeners = config.platformInjector.get(PLATFORM_DESTROY_LISTENERS);
            onPlatformDestroyListeners.add(destroyListener);
            config.moduleRef.onDestroy(() => {
                remove(config.allPlatformModules, config.moduleRef);
                onErrorSubscription.unsubscribe();
                onPlatformDestroyListeners.delete(destroyListener);
            });
        }
        return _callAndReportToErrorHandler(exceptionHandler, ngZone, () => {
            const initStatus = envInjector.get(ApplicationInitStatus);
            initStatus.runInitializers();
            return initStatus.donePromise.then(() => {
                // If the `LOCALE_ID` provider is defined at bootstrap then we set the value for ivy
                const localeId = envInjector.get(LOCALE_ID, DEFAULT_LOCALE_ID);
                setLocaleId(localeId || DEFAULT_LOCALE_ID);
                const enableRootComponentBoostrap = envInjector.get(ENABLE_ROOT_COMPONENT_BOOTSTRAP, true);
                if (!enableRootComponentBoostrap) {
                    if (isApplicationBootstrapConfig(config)) {
                        return envInjector.get(ApplicationRef);
                    }
                    config.allPlatformModules.push(config.moduleRef);
                    return config.moduleRef;
                }
                if (typeof ngDevMode === 'undefined' || ngDevMode) {
                    const imagePerformanceService = envInjector.get(ImagePerformanceWarning);
                    imagePerformanceService.start();
                }
                if (isApplicationBootstrapConfig(config)) {
                    const appRef = envInjector.get(ApplicationRef);
                    if (config.rootComponent !== undefined) {
                        appRef.bootstrap(config.rootComponent);
                    }
                    return appRef;
                }
                else {
                    moduleDoBootstrap(config.moduleRef, config.allPlatformModules);
                    return config.moduleRef;
                   }
            });
        });
    });
}
function moduleDoBootstrap(moduleRef, allPlatformModules) {
    const appRef = moduleRef.injector.get(ApplicationRef);
    if (moduleRef._bootstrapComponents.length > 0) {
        moduleRef._bootstrapComponents.forEach((f) => appRef.bootstrap(f));
    }
    else if (moduleRef.instance.ngDoBootstrap) {
        moduleRef.instance.ngDoBootstrap(appRef);
    }
    else {
        throw new RuntimeError(-403 /* RuntimeErrorCode.BOOTSTRAP_COMPONENTS_NOT_FOUND */, ngDevMode &&
            `The module ${stringify(moduleRef.instance.constructor)} was bootstrapped, ` +
                `but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. ` +
                `Please define one of these.`);
    }
    allPlatformModules.push(moduleRef);
}
function _callAndReportToErrorHandler(errorHandler, ngZone, callback) {
    try {
        const result = callback();
        if (isPromise(result)) {
            return result.catch((e) => {
                ngZone.runOutsideAngular(() => errorHandler.handleError(e));
                // rethrow as the exception handler might not do it
                throw e;
            });
        }
        return result;
    }
    catch (e) {
        ngZone.runOutsideAngular(() => errorHandler.handleError(e));
        // rethrow as the exception handler might not do it
        throw e;
    }
}

/**
 * The Angular platform is the entry point for Angular on a web page.
 * Each page has exactly one platform. Services (such as reflection) which are common
 * to every Angular application running on the page are bound in its scope.
 * A page's platform is initialized implicitly when a platform is created using a platform
 * factory such as `PlatformBrowser`, or explicitly by calling the `createPlatform()` function.
 *
 * @publicApi
 */
class PlatformRef {
    _injector;
    _modules = [];
    _destroyListeners = [];
    _destroyed = false;
    /** @internal */
    constructor(_injector) {
        this._injector = _injector;
    }
    /**
     * Creates an instance of an `@NgModule` for the given platform.
     *
     * @deprecated Passing NgModule factories as the `PlatformRef.bootstrapModuleFactory` function
     *     argument is deprecated. Use the `PlatformRef.bootstrapModule` API instead.
     */
    bootstrapModuleFactory(moduleFactory, options) {
        const scheduleInRootZone = options?.scheduleInRootZone;
        const ngZoneFactory = () => getNgZone(options?.ngZone, {
            ...getNgZoneOptions({
                eventCoalescing: options?.ngZoneEventCoalescing,
                runCoalescing: options?.ngZoneRunCoalescing,
            }),
            scheduleInRootZone,
        });
        const ignoreChangesOutsideZone = options?.ignoreChangesOutsideZone;
        const allAppProviders = [
            internalProvideZoneChangeDetection({
                ngZoneFactory,
                ignoreChangesOutsideZone,
            }),
            { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
        ];
        const moduleRef = createNgModuleRefWithProviders(moduleFactory.moduleType, this.injector, allAppProviders);
        return bootstrap({
            moduleRef,
            allPlatformModules: this._modules,
            platformInjector: this.injector,
        });
    }
    /**
     * Creates an instance of an `@NgModule` for a given platform.
     *
     * @usageNotes
     * ### Simple Example
     *
     * ```ts
     * @NgModule({
     *   imports: [BrowserModule]
     * })
     * class MyModule {}
     *
     * let moduleRef = platformBrowser().bootstrapModule(MyModule);
     * ```
     *
     */
    bootstrapModule(moduleType, compilerOptions = []) {
        const options = optionsReducer({}, compilerOptions);
        return compileNgModuleFactory(this.injector, options, moduleType).then((moduleFactory) => this.bootstrapModuleFactory(moduleFactory, options));
    }
    /**
     * Registers a listener to be called when the platform is destroyed.
     */
    onDestroy(callback) {
        this._destroyListeners.push(callback);
    }
    /**
     * Retrieves the platform {@link Injector}, which is the parent injector for
     * every Angular application on the page and provides singleton providers.
     */
    get injector() {
        return this._injector;
    }
    /**
     * Destroys the current Angular platform and all Angular applications on the page.
     * Destroys all modules and listeners registered with the platform.
     */
    destroy() {
        if (this._destroyed) {
            throw new RuntimeError(404 /* RuntimeErrorCode.PLATFORM_ALREADY_DESTROYED */, ngDevMode && 'The platform has already been destroyed!');
        }
        this._modules.slice().forEach((module) => module.destroy());
        this._destroyListeners.forEach((listener) => listener());
        const destroyListeners = this._injector.get(PLATFORM_DESTROY_LISTENERS, null);
        if (destroyListeners) {
            destroyListeners.forEach((listener) => listener());
            destroyListeners.clear();
        }
        this._destroyed = true;
    }
    /**
     * Indicates whether this instance was destroyed.
     */
    get destroyed() {
        return this._destroyed;
    }
    static ɵfac = function PlatformRef_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PlatformRef)(ɵɵinject(Injector)); };
    static ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: PlatformRef, factory: PlatformRef.ɵfac, providedIn: 'platform' });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(PlatformRef, [{
        type: Injectable,
        args: [{ providedIn: 'platform' }]
    }], () => [{ type: Injector }], null); })();

let _platformInjector = null;
/**
 * Internal token to indicate whether having multiple bootstrapped platform should be allowed (only
 * one bootstrapped platform is allowed by default). This token helps to support SSR scenarios.
 */
const ALLOW_MULTIPLE_PLATFORMS = new InjectionToken(ngDevMode ? 'AllowMultipleToken' : '');
/**
 * Creates a platform.
 * Platforms must be created on launch using this function.
 *
 * @publicApi
 */
function createPlatform(injector) {
    if (_platformInjector && !_platformInjector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
        throw new RuntimeError(400 /* RuntimeErrorCode.MULTIPLE_PLATFORMS */, ngDevMode && 'There can be only one platform. Destroy the previous one to create a new one.');
    }
    publishDefaultGlobalUtils();
    publishSignalConfiguration();
    _platformInjector = injector;
    const platform = injector.get(PlatformRef);
    runPlatformInitializers(injector);
    return platform;
}
/**
 * Creates a factory for a platform. Can be used to provide or override `Providers` specific to
 * your application's runtime needs, such as `PLATFORM_INITIALIZER` and `PLATFORM_ID`.
 * @param parentPlatformFactory Another platform factory to modify. Allows you to compose factories
 * to build up configurations that might be required by different libraries or parts of the
 * application.
 * @param name Identifies the new platform factory.
 * @param providers A set of dependency providers for platforms created with the new factory.
 *
 * @publicApi
 */
function createPlatformFactory(parentPlatformFactory, name, providers = []) {
    const desc = `Platform: ${name}`;
    const marker = new InjectionToken(desc);
    return (extraProviders = []) => {
        let platform = getPlatform();
        if (!platform || platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
            const platformProviders = [
                ...providers,
                ...extraProviders,
                { provide: marker, useValue: true },
            ];
            if (parentPlatformFactory) {
                parentPlatformFactory(platformProviders);
            }
            else {
                createPlatform(createPlatformInjector(platformProviders, desc));
            }
        }
        return assertPlatform(marker);
    };
}
/**
 * Helper function to create an instance of a platform injector (that maintains the 'platform'
 * scope).
 */
function createPlatformInjector(providers = [], name) {
    return Injector.create({
        name,
        providers: [
            { provide: INJECTOR_SCOPE, useValue: 'platform' },
            { provide: PLATFORM_DESTROY_LISTENERS, useValue: new Set([() => (_platformInjector = null)]) },
            ...providers,
        ],
    });
}
/**
 * Checks that there is currently a platform that contains the given token as a provider.
 *
 * @publicApi
 */
function assertPlatform(requiredToken) {
    const platform = getPlatform();
    if (!platform) {
        throw new RuntimeError(401 /* RuntimeErrorCode.PLATFORM_NOT_FOUND */, ngDevMode && 'No platform exists!');
    }
    if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
        !platform.injector.get(requiredToken, null)) {
        throw new RuntimeError(400 /* RuntimeErrorCode.MULTIPLE_PLATFORMS */, 'A platform with a different configuration has been created. Please destroy it first.');
    }
    return platform;
}
/**
 * Returns the current platform.
 *
 * @publicApi
 */
function getPlatform() {
    return _platformInjector?.get(PlatformRef) ?? null;
}
/**
 * Destroys the current Angular platform and all Angular applications on the page.
 * Destroys all modules and listeners registered with the platform.
 *
 * @publicApi
 */
function destroyPlatform() {
    getPlatform()?.destroy();
}
/**
 * The goal of this function is to bootstrap a platform injector,
 * but avoid referencing `PlatformRef` class.
 * This function is needed for bootstrapping a Standalone Component.
 */
function createOrReusePlatformInjector(providers = []) {
    // If a platform injector already exists, it means that the platform
    // is already bootstrapped and no additional actions are required.
    if (_platformInjector)
        return _platformInjector;
    publishDefaultGlobalUtils();
    // Otherwise, setup a new platform injector and run platform initializers.
    const injector = createPlatformInjector(providers);
    _platformInjector = injector;
    publishSignalConfiguration();
    runPlatformInitializers(injector);
    return injector;
}
/**
 * @description
 * This function is used to provide initialization functions that will be executed upon
 * initialization of the platform injector.
 *
 * Note that the provided initializer is run in the injection context.
 *
 * Previously, this was achieved using the `PLATFORM_INITIALIZER` token which is now deprecated.
 *
 * @see {@link PLATFORM_INITIALIZER}
 *
 * @publicApi
 */
function providePlatformInitializer(initializerFn) {
    return makeEnvironmentProviders([
        {
            provide: PLATFORM_INITIALIZER,
            useValue: initializerFn,
            multi: true,
        },
    ]);
}
function runPlatformInitializers(injector) {
    const inits = injector.get(PLATFORM_INITIALIZER, null);
    runInInjectionContext(injector, () => {
        inits?.forEach((init) => init());
    });
}

/**
 * Used to periodically verify no expressions have changed after they were checked.
 *
 * @param options Used to configure when the check will execute.
 *   - `interval` will periodically run exhaustive `checkNoChanges` on application views
 *   - `useNgZoneOnStable` will use ZoneJS to determine when change detection might have run
 *      in an application using ZoneJS to drive change detection. When the `NgZone.onStable` would
 *      have emitted, all views attached to the `ApplicationRef` are checked for changes.
 *   - 'exhaustive' means that all views attached to `ApplicationRef` and all the descendants of those views will be
 *     checked for changes (excluding those subtrees which are detached via `ChangeDetectorRef.detach()`).
 *     This is useful because the check that runs after regular change detection does not work for components using `ChangeDetectionStrategy.OnPush`.
 *     This check is will surface any existing errors hidden by `OnPush` components. By default, this check is exhaustive
 *     and will always check all views, regardless of their "dirty" state and `ChangeDetectionStrategy`.
 *
 * When the `useNgZoneOnStable` option is `true`, this function will provide its own `NgZone` implementation and needs
 * to come after any other `NgZone` provider, including `provideZoneChangeDetection()` and `provideExperimentalZonelessChangeDetection()`.
 *
 * @experimental
 * @publicApi
 */
function provideExperimentalCheckNoChangesForDebug(options) {
    if (typeof ngDevMode === 'undefined' || ngDevMode) {
        if (options.interval === undefined && !options.useNgZoneOnStable) {
            throw new Error('Must provide one of `useNgZoneOnStable` or `interval`');
        }
        const checkNoChangesMode = options?.exhaustive === false
            ? CheckNoChangesMode.OnlyDirtyViews
            : CheckNoChangesMode.Exhaustive;
        return makeEnvironmentProviders([
            options?.useNgZoneOnStable
                ? { provide: NgZone, useFactory: () => new DebugNgZoneForCheckNoChanges(checkNoChangesMode) }
                : [],
            options?.interval !== undefined
                ? exhaustiveCheckNoChangesInterval(options.interval, checkNoChangesMode)
                : [],
            {
                provide: ENVIRONMENT_INITIALIZER,
                multi: true,
                useValue: () => {
                    if (options?.useNgZoneOnStable &&
                        !(inject(NgZone) instanceof DebugNgZoneForCheckNoChanges)) {
                        throw new Error('`provideExperimentalCheckNoChangesForDebug` with `useNgZoneOnStable` must be after any other provider for `NgZone`.');
                    }
                },
            },
        ]);
    }
    else {
        return makeEnvironmentProviders([]);
    }
}
class DebugNgZoneForCheckNoChanges extends NgZone {
    checkNoChangesMode;
    applicationRef;
    scheduler;
    errorHandler;
    injector = inject(EnvironmentInjector);
    constructor(checkNoChangesMode) {
        const zonelessEnabled = inject(ZONELESS_ENABLED);
        // Use coalescing to ensure we aren't ever running this check synchronously
        super({
            shouldCoalesceEventChangeDetection: true,
            shouldCoalesceRunChangeDetection: zonelessEnabled,
        });
        this.checkNoChangesMode = checkNoChangesMode;
        if (zonelessEnabled) {
            // prevent emits to ensure code doesn't rely on these
            this.onMicrotaskEmpty.emit = () => { };
            this.onStable.emit = () => {
                this.scheduler ||= this.injector.get(ChangeDetectionSchedulerImpl);
                if (this.scheduler.pendingRenderTaskId || this.scheduler.runningTick) {
                    return;
                }
                this.checkApplicationViews();
            };
            this.onUnstable.emit = () => { };
        }
        else {
            this.runOutsideAngular(() => {
                this.onStable.subscribe(() => {
                    this.checkApplicationViews();
                });
            });
        }
    }
    checkApplicationViews() {
        this.applicationRef ||= this.injector.get(ApplicationRef);
        for (const view of this.applicationRef.allViews) {
            try {
                checkNoChangesInternal(view._lView, this.checkNoChangesMode, view.notifyErrorHandler);
            }
            catch (e) {
                this.errorHandler ||= this.injector.get(ErrorHandler);
                this.errorHandler.handleError(e);
            }
        }
    }
}
function exhaustiveCheckNoChangesInterval(interval, checkNoChangesMode) {
    return {
        provide: ENVIRONMENT_INITIALIZER,
        multi: true,
        useFactory: () => {
            const applicationRef = inject(ApplicationRef);
            const errorHandler = inject(ErrorHandler);
            const scheduler = inject(ChangeDetectionSchedulerImpl);
            const ngZone = inject(NgZone);
            return () => {
                function scheduleCheckNoChanges() {
                    ngZone.runOutsideAngular(() => {
                        setTimeout(() => {
                            if (applicationRef.destroyed) {
                                return;
                            }
                            if (scheduler.pendingRenderTaskId || scheduler.runningTick) {
                                scheduleCheckNoChanges();
                                return;
                            }
                            for (const view of applicationRef.allViews) {
                                try {
                                    checkNoChangesInternal(view._lView, checkNoChangesMode, view.notifyErrorHandler);
                                }
                                catch (e) {
                                    errorHandler.handleError(e);
                                }
                            }
                            scheduleCheckNoChanges();
                        }, interval);
                    });
                }
                scheduleCheckNoChanges();
            };
        },
    };
}

/**
 * Returns whether Angular is in development mode.
 *
 * By default, this is true, unless `enableProdMode` is invoked prior to calling this method or the
 * application is built using the Angular CLI with the `optimization` option.
 * @see {@link /cli/build ng build}
 *
 * @publicApi
 */
function isDevMode() {
    return typeof ngDevMode === 'undefined' || !!ngDevMode;
}
/**
 * Disable Angular's development mode, which turns off assertions and other
 * checks within the framework.
 *
 * One important assertion this disables verifies that a change detection pass
 * does not result in additional changes to any bindings (also known as
 * unidirectional data flow).
 *
 * Using this method is discouraged as the Angular CLI will set production mode when using the
 * `optimization` option.
 * @see {@link /cli/build ng build}
 *
 * @publicApi
 */
function enableProdMode() {
    // The below check is there so when ngDevMode is set via terser
    // `global['ngDevMode'] = false;` is also dropped.
    if (typeof ngDevMode === 'undefined' || ngDevMode) {
        _global['ngDevMode'] = false;
    }
}

/**
 * Returns the NgModuleFactory with the given id (specified using [@NgModule.id
 * field](api/core/NgModule#id)), if it exists and has been loaded. Factories for NgModules that do
 * not specify an `id` cannot be retrieved. Throws if an NgModule cannot be found.
 * @publicApi
 * @deprecated Use `getNgModuleById` instead.
 */
function getModuleFactory(id) {
    const type = getRegisteredNgModuleType(id);
    if (!type)
        throw noModuleError(id);
    return new NgModuleFactory(type);
}
/**
 * Returns the NgModule class with the given id (specified using [@NgModule.id
 * field](api/core/NgModule#id)), if it exists and has been loaded. Classes for NgModules that do
 * not specify an `id` cannot be retrieved. Throws if an NgModule cannot be found.
 * @publicApi
 */
function getNgModuleById(id) {
    const type = getRegisteredNgModuleType(id);
    if (!type)
        throw noModuleError(id);
    return type;
}
function noModuleError(id) {
    return new Error(`No module with ID ${id} loaded`);
}

/**
 * Base class that provides change detection functionality.
 * A change-detection tree collects all views that are to be checked for changes.
 * Use the methods to add and remove views from the tree, initiate change-detection,
 * and explicitly mark views as _dirty_, meaning that they have changed and need to be re-rendered.
 *
 * @see [Using change detection hooks](guide/components/lifecycle#using-change-detection-hooks)
 * @see [Defining custom change detection](guide/components/lifecycle#defining-custom-change-detection)
 *
 * @usageNotes
 *
 * The following examples demonstrate how to modify default change-detection behavior
 * to perform explicit detection when needed.
 *
 * ### Use `markForCheck()` with `CheckOnce` strategy
 *
 * The following example sets the `OnPush` change-detection strategy for a component
 * (`CheckOnce`, rather than the default `CheckAlways`), then forces a second check
 * after an interval.
 *
 * {@example core/ts/change_detect/change-detection.ts region='mark-for-check'}
 *
 * ### Detach change detector to limit how often check occurs
 *
 * The following example defines a component with a large list of read-only data
 * that is expected to change constantly, many times per second.
 * To improve performance, we want to check and update the list
 * less often than the changes actually occur. To do that, we detach
 * the component's change detector and perform an explicit local check every five seconds.
 *
 * {@example core/ts/change_detect/change-detection.ts region='detach'}
 *
 *
 * ### Reattaching a detached component
 *
 * The following example creates a component displaying live data.
 * The component detaches its change detector from the main change detector tree
 * when the `live` property is set to false, and reattaches it when the property
 * becomes true.
 *
 * {@example core/ts/change_detect/change-detection.ts region='reattach'}
 *
 * @publicApi
 */
class ChangeDetectorRef {
    /**
     * @internal
     * @nocollapse
     */
    static __NG_ELEMENT_ID__ = injectChangeDetectorRef;
}
/** Returns a ChangeDetectorRef (a.k.a. a ViewRef) */
function injectChangeDetectorRef(flags) {
    return createViewRef(getCurrentTNode(), getLView(), (flags & 16 /* InternalInjectFlags.ForPipe */) === 16 /* InternalInjectFlags.ForPipe */);
}
/**
 * Creates a ViewRef and stores it on the injector as ChangeDetectorRef (public alias).
 *
 * @param tNode The node that is requesting a ChangeDetectorRef
 * @param lView The view to which the node belongs
 * @param isPipe Whether the view is being injected into a pipe.
 * @returns The ChangeDetectorRef to use
 */
function createViewRef(tNode, lView, isPipe) {
    if (isComponentHost(tNode) && !isPipe) {
        // The LView represents the location where the component is declared.
        // Instead we want the LView for the component View and so we need to look it up.
        const componentView = getComponentLViewByIndex(tNode.index, lView); // look down
        return new ViewRef$1(componentView, componentView);
    }
    else if (tNode.type &
        (3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */ | 32 /* TNodeType.Icu */ | 128 /* TNodeType.LetDeclaration */)) {
        // The LView represents the location where the injection is requested from.
        // We need to locate the containing LView (in case where the `lView` is an embedded view)
        const hostComponentView = lView[DECLARATION_COMPONENT_VIEW]; // look up
        return new ViewRef$1(hostComponentView, lView);
    }
    return null;
}

/**
 * Represents an Angular view.
 *
 * @see {@link /api/core/ChangeDetectorRef?tab=usage-notes Change detection usage}
 *
 * @publicApi
 */
class ViewRef extends ChangeDetectorRef {
}
/**
 * Represents an Angular view in a view container.
 * An embedded view can be referenced from a component
 * other than the hosting component whose template defines it, or it can be defined
 * independently by a `TemplateRef`.
 *
 * Properties of elements in a view can change, but the structure (number and order) of elements in
 * a view cannot. Change the structure of elements by inserting, moving, or
 * removing nested views in a view container.
 *
 * @see {@link ViewContainerRef}
 *
 * @usageNotes
 *
 * The following template breaks down into two separate `TemplateRef` instances,
 * an outer one and an inner one.
 *
 * ```html
 * Count: {{items.length}}
 * <ul>
 *   <li *ngFor="let  item of items">{{item}}</li>
 * </ul>
 * ```
 *
 * This is the outer `TemplateRef`:
 *
 * ```html
 * Count: {{items.length}}
 * <ul>
 *   <ng-template ngFor let-item [ngForOf]="items"></ng-template>
 * </ul>
 * ```
 *
 * This is the inner `TemplateRef`:
 *
 * ```html
 *   <li>{{item}}</li>
 * ```
 *
 * The outer and inner `TemplateRef` instances are assembled into views as follows:
 *
 * ```html
 * <!-- ViewRef: outer-0 -->
 * Count: 2
 * <ul>
 *   <ng-template view-container-ref></ng-template>
 *   <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->
 *   <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->
 * </ul>
 * <!-- /ViewRef: outer-0 -->
 * ```
 * @publicApi
 */
class EmbeddedViewRef extends ViewRef {
}

/**
 * @publicApi
 */
class DebugEventListener {
    name;
    callback;
    constructor(name, callback) {
        this.name = name;
        this.callback = callback;
    }
}
/**
 * @publicApi
 */
function asNativeElements(debugEls) {
    return debugEls.map((el) => el.nativeElement);
}
/**
 * @publicApi
 */
class DebugNode {
    /**
     * The underlying DOM node.
     */
    nativeNode;
    constructor(nativeNode) {
        this.nativeNode = nativeNode;
    }
    /**
     * The `DebugElement` parent. Will be `null` if this is the root element.
     */
    get parent() {
        const parent = this.nativeNode.parentNode;
        return parent ? new DebugElement(parent) : null;
    }
    /**
     * The host dependency injector. For example, the root element's component instance injector.
     */
    get injector() {
        return getInjector(this.nativeNode);
    }
    /**
     * The element's own component instance, if it has one.
     */
    get componentInstance() {
        const nativeElement = this.nativeNode;
        return (nativeElement && (getComponent(nativeElement) || getOwningComponent(nativeElement)));
    }
    /**
     * An object that provides parent context for this element. Often an ancestor component instance
     * that governs this element.
     *
     * When an element is repeated within *ngFor, the context is an `NgForOf` whose `$implicit`
     * property is the value of the row instance value. For example, the `hero` in `*ngFor="let hero
     * of heroes"`.
     */
    get context() {
        return getComponent(this.nativeNode) || getContext(this.nativeNode);
    }
    /**
     * The callbacks attached to the component's @Output properties and/or the element's event
     * properties.
     */
    get listeners() {
        return getListeners(this.nativeNode).filter((listener) => listener.type === 'dom');
    }
    /**
     * Dictionary of objects associated with template local variables (e.g. #foo), keyed by the local
     * variable name.
     */
    get references() {
        return getLocalRefs(this.nativeNode);
    }
    /**
     * This component's injector lookup tokens. Includes the component itself plus the tokens that the
     * component lists in its providers metadata.
     */
    get providerTokens() {
        return getInjectionTokens(this.nativeNode);
    }
}
/**
 * @publicApi
 *
 * @see [Component testing scenarios](guide/testing/components-scenarios)
 * @see [Basics of testing components](guide/testing/components-basics)
 * @see [Testing utility APIs](guide/testing/utility-apis)
 */
class DebugElement extends DebugNode {
    constructor(nativeNode) {
        ngDevMode && assertDomNode(nativeNode);
        super(nativeNode);
    }
    /**
     * The underlying DOM element at the root of the component.
     */
    get nativeElement() {
        return this.nativeNode.nodeType == Node.ELEMENT_NODE ? this.nativeNode : null;
    }
    /**
     * The element tag name, if it is an element.
     */
    get name() {
        const context = getLContext(this.nativeNode);
        const lView = context ? context.lView : null;
        if (lView !== null) {
            const tData = lView[TVIEW].data;
            const tNode = tData[context.nodeIndex];
            return tNode.value;
        }
        else {
            return this.nativeNode.nodeName;
        }
    }
    /**
     *  Gets a map of property names to property values for an element.
     *
     *  This map includes:
     *  - Regular property bindings (e.g. `[id]="id"`)
     *  - Host property bindings (e.g. `host: { '[id]': "id" }`)
     *  - Interpolated property bindings (e.g. `id="{{ value }}")
     *
     *  It does not include:
     *  - input property bindings (e.g. `[myCustomInput]="value"`)
     *  - attribute bindings (e.g. `[attr.role]="menu"`)
     */
    get properties() {
        const context = getLContext(this.nativeNode);
        const lView = context ? context.lView : null;
        if (lView === null) {
            return {};
        }
        const tData = lView[TVIEW].data;
        const tNode = tData[context.nodeIndex];
        const properties = {};
        // Collect properties from the DOM.
        copyDomProperties(this.nativeElement, properties);
        // Collect properties from the bindings. This is needed for animation renderer which has
        // synthetic properties which don't get reflected into the DOM.
        collectPropertyBindings(properties, tNode, lView, tData);
        return properties;
    }
    /**
     *  A map of attribute names to attribute values for an element.
     */
    // TODO: replace null by undefined in the return type
    get attributes() {
        const attributes = {};
        const element = this.nativeElement;
        if (!element) {
            return attributes;
        }
        const context = getLContext(element);
        const lView = context ? context.lView : null;
        if (lView === null) {
            return {};
        }
        const tNodeAttrs = lView[TVIEW].data[context.nodeIndex].attrs;
        const lowercaseTNodeAttrs = [];
        // For debug nodes we take the element's attribute directly from the DOM since it allows us
        // to account for ones that weren't set via bindings (e.g. ViewEngine keeps track of the ones
        // that are set through `Renderer2`). The problem is that the browser will lowercase all names,
        // however since we have the attributes already on the TNode, we can preserve the case by going
        // through them once, adding them to the `attributes` map and putting their lower-cased name
        // into an array. Afterwards when we're going through the native DOM attributes, we can check
        // whether we haven't run into an attribute already through the TNode.
        if (tNodeAttrs) {
            let i = 0;
            while (i < tNodeAttrs.length) {
                const attrName = tNodeAttrs[i];
                // Stop as soon as we hit a marker. We only care about the regular attributes. Everything
                // else will be handled below when we read the final attributes off the DOM.
                if (typeof attrName !== 'string')
                    break;
                const attrValue = tNodeAttrs[i + 1];
                attributes[attrName] = attrValue;
                lowercaseTNodeAttrs.push(attrName.toLowerCase());
                i += 2;
            }
        }
        for (const attr of element.attributes) {
            // Make sure that we don't assign the same attribute both in its
            // case-sensitive form and the lower-cased one from the browser.
            if (!lowercaseTNodeAttrs.includes(attr.name)) {
                attributes[attr.name] = attr.value;
            }
        }
        return attributes;
    }
    /**
     * The inline styles of the DOM element.
     */
    // TODO: replace null by undefined in the return type
    get styles() {
        const element = this.nativeElement;
        return (element?.style ?? {});
    }
    /**
     * A map containing the class names on the element as keys.
     *
     * This map is derived from the `className` property of the DOM element.
     *
     * Note: The values of this object will always be `true`. The class key will not appear in the KV
     * object if it does not exist on the element.
     *
     * @see [Element.className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className)
     */
    get classes() {
        const result = {};
        const element = this.nativeElement;
        // SVG elements return an `SVGAnimatedString` instead of a plain string for the `className`.
        const className = element.className;
        const classes = typeof className !== 'string' ? className.baseVal.split(' ') : className.split(' ');
        classes.forEach((value) => (result[value] = true));
        return result;
    }
    /**
     * The `childNodes` of the DOM element as a `DebugNode` array.
     *
     * @see [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes)
     */
    get childNodes() {
        const childNodes = this.nativeNode.childNodes;
        const children = [];
        for (let i = 0; i < childNodes.length; i++) {
            const element = childNodes[i];
            children.push(getDebugNode(element));
        }
        return children;
    }
    /**
     * The immediate `DebugElement` children. Walk the tree by descending through `children`.
     */
    get children() {
        const nativeElement = this.nativeElement;
        if (!nativeElement)
            return [];
        const childNodes = nativeElement.children;
        const children = [];
        for (let i = 0; i < childNodes.length; i++) {
            const element = childNodes[i];
            children.push(getDebugNode(element));
        }
        return children;
    }
    /**
     * @returns the first `DebugElement` that matches the predicate at any depth in the subtree.
     */
    query(predicate) {
        const results = this.queryAll(predicate);
        return results[0] || null;
    }
    /**
     * @returns All `DebugElement` matches for the predicate at any depth in the subtree.
     */
    queryAll(predicate) {
        const matches = [];
        _queryAll(this, predicate, matches, true);
        return matches;
    }
    /**
     * @returns All `DebugNode` matches for the predicate at any depth in the subtree.
     */
    queryAllNodes(predicate) {
        const matches = [];
        _queryAll(this, predicate, matches, false);
        return matches;
    }
    /**
     * Triggers the event by its name if there is a corresponding listener in the element's
     * `listeners` collection.
     *
     * If the event lacks a listener or there's some other problem, consider
     * calling `nativeElement.dispatchEvent(eventObject)`.
     *
     * @param eventName The name of the event to trigger
     * @param eventObj The _event object_ expected by the handler
     *
     * @see [Testing components scenarios](guide/testing/components-scenarios#trigger-event-handler)
     */
    triggerEventHandler(eventName, eventObj) {
        const node = this.nativeNode;
        const invokedListeners = [];
        this.listeners.forEach((listener) => {
            if (listener.name === eventName) {
                const callback = listener.callback;
                callback.call(node, eventObj);
                invokedListeners.push(callback);
            }
        });
        // We need to check whether `eventListeners` exists, because it's something
        // that Zone.js only adds to `EventTarget` in browser environments.
        if (typeof node.eventListeners === 'function') {
            // Note that in Ivy we wrap event listeners with a call to `event.preventDefault` in some
            // cases. We use '__ngUnwrap__' as a special token that gives us access to the actual event
            // listener.
            node.eventListeners(eventName).forEach((listener) => {
                // In order to ensure that we can detect the special __ngUnwrap__ token described above, we
                // use `toString` on the listener and see if it contains the token. We use this approach to
                // ensure that it still worked with compiled code since it cannot remove or rename string
                // literals. We also considered using a special function name (i.e. if(listener.name ===
                // special)) but that was more cumbersome and we were also concerned the compiled code could
                // strip the name, turning the condition in to ("" === "") and always returning true.
                if (listener.toString().indexOf('__ngUnwrap__') !== -1) {
                    const unwrappedListener = listener('__ngUnwrap__');
                    return (invokedListeners.indexOf(unwrappedListener) === -1 &&
                        unwrappedListener.call(node, eventObj));
                }
            });
        }
    }
}
function copyDomProperties(element, properties) {
    if (element) {
        // Skip own properties (as those are patched)
        let obj = Object.getPrototypeOf(element);
        const NodePrototype = Node.prototype;
        while (obj !== null && obj !== NodePrototype) {
            const descriptors = Object.getOwnPropertyDescriptors(obj);
            for (let key in descriptors) {
                if (!key.startsWith('__') && !key.startsWith('on')) {
                    // don't include properties starting with `__` and `on`.
                    // `__` are patched values which should not be included.
                    // `on` are listeners which also should not be included.
                    const value = element[key];
                    if (isPrimitiveValue(value)) {
                        properties[key] = value;
                    }
                }
            }
            obj = Object.getPrototypeOf(obj);
        }
    }
}
function isPrimitiveValue(value) {
    return (typeof value === 'string' ||
        typeof value === 'boolean' ||
        typeof value === 'number' ||
        value === null);
}
function _queryAll(parentElement, predicate, matches, elementsOnly) {
    const context = getLContext(parentElement.nativeNode);
    const lView = context ? context.lView : null;
    if (lView !== null) {
        const parentTNode = lView[TVIEW].data[context.nodeIndex];
        _queryNodeChildren(parentTNode, lView, predicate, matches, elementsOnly, parentElement.nativeNode);
    }
    else {
        // If the context is null, then `parentElement` was either created with Renderer2 or native DOM
        // APIs.
        _queryNativeNodeDescendants(parentElement.nativeNode, predicate, matches, elementsOnly);
    }
}
/**
 * Recursively match the current TNode against the predicate, and goes on with the next ones.
 *
 * @param tNode the current TNode
 * @param lView the LView of this TNode
 * @param predicate the predicate to match
 * @param matches the list of positive matches
 * @param elementsOnly whether only elements should be searched
 * @param rootNativeNode the root native node on which predicate should not be matched
 */
function _queryNodeChildren(tNode, lView, predicate, matches, elementsOnly, rootNativeNode) {
    ngDevMode && assertTNodeForLView(tNode, lView);
    const nativeNode = getNativeByTNodeOrNull(tNode, lView);
    // For each type of TNode, specific logic is executed.
    if (tNode.type & (3 /* TNodeType.AnyRNode */ | 8 /* TNodeType.ElementContainer */)) {
        // Case 1: the TNode is an element
        // The native node has to be checked.
        _addQueryMatch(nativeNode, predicate, matches, elementsOnly, rootNativeNode);
        if (isComponentHost(tNode)) {
            // If the element is the host of a component, then all nodes in its view have to be processed.
            // Note: the component's content (tNode.child) will be processed from the insertion points.
            const componentView = getComponentLViewByIndex(tNode.index, lView);
            if (componentView && componentView[TVIEW].firstChild) {
                _queryNodeChildren(componentView[TVIEW].firstChild, componentView, predicate, matches, elementsOnly, rootNativeNode);
            }
        }
        else {
            if (tNode.child) {
                // Otherwise, its children have to be processed.
                _queryNodeChildren(tNode.child, lView, predicate, matches, elementsOnly, rootNativeNode);
            }
            // We also have to query the DOM directly in order to catch elements inserted through
            // Renderer2. Note that this is __not__ optimal, because we're walking similar trees multiple
            // times. ViewEngine could do it more efficiently, because all the insertions go through
            // Renderer2, however that's not the case in Ivy. This approach is being used because:
            // 1. Matching the ViewEngine behavior would mean potentially introducing a dependency
            //    from `Renderer2` to Ivy which could bring Ivy code into ViewEngine.
            // 2. It allows us to capture nodes that were inserted directly via the DOM.
            nativeNode && _queryNativeNodeDescendants(nativeNode, predicate, matches, elementsOnly);
        }
        // In all cases, if a dynamic container exists for this node, each view inside it has to be
        // processed.
        const nodeOrContainer = lView[tNode.index];
        if (isLContainer(nodeOrContainer)) {
            _queryNodeChildrenInContainer(nodeOrContainer, predicate, matches, elementsOnly, rootNativeNode);
        }
    }
    else if (tNode.type & 4 /* TNodeType.Container */) {
        // Case 2: the TNode is a container
        // The native node has to be checked.
        const lContainer = lView[tNode.index];
        _addQueryMatch(lContainer[NATIVE], predicate, matches, elementsOnly, rootNativeNode);
        // Each view inside the container has to be processed.
        _queryNodeChildrenInContainer(lContainer, predicate, matches, elementsOnly, rootNativeNode);
    }
    else if (tNode.type & 16 /* TNodeType.Projection */) {
        // Case 3: the TNode is a projection insertion point (i.e. a <ng-content>).
        // The nodes projected at this location all need to be processed.
        const componentView = lView[DECLARATION_COMPONENT_VIEW];
        const componentHost = componentView[T_HOST];
        const head = componentHost.projection[tNode.projection];
        if (Array.isArray(head)) {
            for (let nativeNode of head) {
                _addQueryMatch(nativeNode, predicate, matches, elementsOnly, rootNativeNode);
            }
        }
        else if (head) {
            const nextLView = componentView[PARENT];
            const nextTNode = nextLView[TVIEW].data[head.index];
            _queryNodeChildren(nextTNode, nextLView, predicate, matches, elementsOnly, rootNativeNode);
        }
    }
    else if (tNode.child) {
        // Case 4: the TNode is a view.
        _queryNodeChildren(tNode.child, lView, predicate, matches, elementsOnly, rootNativeNode);
    }
    // We don't want to go to the next sibling of the root node.
    if (rootNativeNode !== nativeNode) {
        // To determine the next node to be processed, we need to use the next or the projectionNext
        // link, depending on whether the current node has been projected.
        const nextTNode = tNode.flags & 2 /* TNodeFlags.isProjected */ ? tNode.projectionNext : tNode.next;
        if (nextTNode) {
            _queryNodeChildren(nextTNode, lView, predicate, matches, elementsOnly, rootNativeNode);
        }
    }
}
/**
 * Process all TNodes in a given container.
 *
 * @param lContainer the container to be processed
 * @param predicate the predicate to match
 * @param matches the list of positive matches
 * @param elementsOnly whether only elements should be searched
 * @param rootNativeNode the root native node on which predicate should not be matched
 */
function _queryNodeChildrenInContainer(lContainer, predicate, matches, elementsOnly, rootNativeNode) {
    for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
        const childView = lContainer[i];
        const firstChild = childView[TVIEW].firstChild;
        if (firstChild) {
            _queryNodeChildren(firstChild, childView, predicate, matches, elementsOnly, rootNativeNode);
        }
    }
}
/**
 * Match the current native node against the predicate.
 *
 * @param nativeNode the current native node
 * @param predicate the predicate to match
 * @param matches the list of positive matches
 * @param elementsOnly whether only elements should be searched
 * @param rootNativeNode the root native node on which predicate should not be matched
 */
function _addQueryMatch(nativeNode, predicate, matches, elementsOnly, rootNativeNode) {
    if (rootNativeNode !== nativeNode) {
        const debugNode = getDebugNode(nativeNode);
        if (!debugNode) {
            return;
        }
        // Type of the "predicate and "matches" array are set based on the value of
        // the "elementsOnly" parameter. TypeScript is not able to properly infer these
        // types with generics, so we manually cast the parameters accordingly.
        if (elementsOnly &&
            debugNode instanceof DebugElement &&
            predicate(debugNode) &&
            matches.indexOf(debugNode) === -1) {
            matches.push(debugNode);
        }
        else if (!elementsOnly &&
            predicate(debugNode) &&
            matches.indexOf(debugNode) === -1) {
            matches.push(debugNode);
        }
    }
}
/**
 * Match all the descendants of a DOM node against a predicate.
 *
 * @param nativeNode the current native node
 * @param predicate the predicate to match
 * @param matches the list where matches are stored
 * @param elementsOnly whether only elements should be searched
 */
function _queryNativeNodeDescendants(parentNode, predicate, matches, elementsOnly) {
    const nodes = parentNode.childNodes;
    const length = nodes.length;
    for (let i = 0; i < length; i++) {
        const node = nodes[i];
        const debugNode = getDebugNode(node);
        if (debugNode) {
            if (elementsOnly &&
                debugNode instanceof DebugElement &&
                predicate(debugNode) &&
                matches.indexOf(debugNode) === -1) {
                matches.push(debugNode);
            }
            else if (!elementsOnly &&
                predicate(debugNode) &&
                matches.indexOf(debugNode) === -1) {
                matches.push(debugNode);
            }
            _queryNativeNodeDescendants(node, predicate, matches, elementsOnly);
        }
    }
}
/**
 * Iterates through the property bindings for a given node and generates
 * a map of property names to values. This map only contains property bindings
 * defined in templates, not in host bindings.
 */
function collectPropertyBindings(properties, tNode, lView, tData) {
    let bindingIndexes = tNode.propertyBindings;
    if (bindingIndexes !== null) {
        for (let i = 0; i < bindingIndexes.length; i++) {
            const bindingIndex = bindingIndexes[i];
            const propMetadata = tData[bindingIndex];
            const metadataParts = propMetadata.split(INTERPOLATION_DELIMITER);
            const propertyName = metadataParts[0];
            if (metadataParts.length > 1) {
                let value = metadataParts[1];
                for (let j = 1; j < metadataParts.length - 1; j++) {
                    value += renderStringify(lView[bindingIndex + j - 1]) + metadataParts[j + 1];
                }
                properties[propertyName] = value;
            }
            else {
                properties[propertyName] = lView[bindingIndex];
            }
        }
    }
}
const NG_DEBUG_PROPERTY = '__ng_debug__';
/**
 * @publicApi
 */
function getDebugNode(nativeNode) {
    if (nativeNode instanceof Node) {
        if (!nativeNode.hasOwnProperty(NG_DEBUG_PROPERTY)) {
            nativeNode[NG_DEBUG_PROPERTY] =
                nativeNode.nodeType == Node.ELEMENT_NODE
                    ? new DebugElement(nativeNode)
                    : new DebugNode(nativeNode);
        }
        return nativeNode[NG_DEBUG_PROPERTY];
    }
    return null;
}

class DefaultIterableDifferFactory {
    constructor() { }
    supports(obj) {
        return isListLikeIterable(obj);
    }
    create(trackByFn) {
        return new DefaultIterableDiffer(trackByFn);
    }
}
const trackByIdentity = (index, item) => item;
/**
 * @deprecated v4.0.0 - Should not be part of public API.
 * @publicApi
 */
class DefaultIterableDiffer {
    length = 0;
    // TODO: confirm the usage of `collection` as it's unused, readonly and on a non public API.
    collection;
    // Keeps track of the used records at any point in time (during & across `_check()` calls)
    _linkedRecords = null;
    // Keeps track of the removed records at any point in time during `_check()` calls.
    _unlinkedRecords = null;
    _previousItHead = null;
    _itHead = null;
    _itTail = null;
    _additionsHead = null;
    _additionsTail = null;
    _movesHead = null;
    _movesTail = null;
    _removalsHead = null;
    _removalsTail = null;
    // Keeps track of records where custom track by is the same, but item identity has changed
    _identityChangesHead = null;
    _identityChangesTail = null;
    _trackByFn;
    constructor(trackByFn) {
        this._trackByFn = trackByFn || trackByIdentity;
    }
    forEachItem(fn) {
        let record;
        for (record = this._itHead; record !== null; record = record._next) {
            fn(record);
        }
    }
    forEachOperation(fn) {
        let nextIt = this._itHead;
        let nextRemove = this._removalsHead;
        let addRemoveOffset = 0;
        let moveOffsets = null;
        while (nextIt || nextRemove) {
            // Figure out which is the next record to process
            // Order: remove, add, move
            const record = !nextRemove ||
                (nextIt &&
                    nextIt.currentIndex < getPreviousIndex(nextRemove, addRemoveOffset, moveOffsets))
                ? nextIt
                : nextRemove;
            const adjPreviousIndex = getPreviousIndex(record, addRemoveOffset, moveOffsets);
            const currentIndex = record.currentIndex;
            // consume the item, and adjust the addRemoveOffset and update moveDistance if necessary
            if (record === nextRemove) {
                addRemoveOffset--;
                nextRemove = nextRemove._nextRemoved;
            }
            else {
                nextIt = nextIt._next;
                if (record.previousIndex == null) {
                    addRemoveOffset++;
                }
                else {
                    // INVARIANT:  currentIndex < previousIndex
                    if (!moveOffsets)
                        moveOffsets = [];
                    const localMovePreviousIndex = adjPreviousIndex - addRemoveOffset;
                    const localCurrentIndex = currentIndex - addRemoveOffset;
                    if (localMovePreviousIndex != localCurrentIndex) {
                        for (let i = 0; i < localMovePreviousIndex; i++) {
                            const offset = i < moveOffsets.length ? moveOffsets[i] : (moveOffsets[i] = 0);
                            const index = offset + i;
                            if (localCurrentIndex <= index && index < localMovePreviousIndex) {
                                moveOffsets[i] = offset + 1;
                            }
                        }
                        const previousIndex = record.previousIndex;
                        moveOffsets[previousIndex] = localCurrentIndex - localMovePreviousIndex;
                    }
                }
            }
            if (adjPreviousIndex !== currentIndex) {
                fn(record, adjPreviousIndex, currentIndex);
            }
        }
    }
    forEachPreviousItem(fn) {
        let record;
        for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
            fn(record);
        }
    }
    forEachAddedItem(fn) {
        let record;
        for (record = this._additionsHead; record !== null; record = record._nextAdded) {
            fn(record);
        }
    }
    forEachMovedItem(fn) {
        let record;
        for (record = this._movesHead; record !== null; record = record._nextMoved) {
            fn(record);
        }
    }
    forEachRemovedItem(fn) {
        let record;
        for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
            fn(record);
        }
    }
    forEachIdentityChange(fn) {
        let record;
        for (record = this._identityChangesHead; record !== null; record = record._nextIdentityChange) {
            fn(record);
        }
    }
    diff(collection) {
        if (collection == null)
            collection = [];
        if (!isListLikeIterable(collection)) {
            throw new RuntimeError(900 /* RuntimeErrorCode.INVALID_DIFFER_INPUT */, ngDevMode &&
                `Error trying to diff '${stringify(collection)}'. Only arrays and iterables are allowed`);
        }
        if (this.check(collection)) {
            return this;
        }
        else {
            return null;
        }
    }
    onDestroy() { }
    check(collection) {
        this._reset();
        let record = this._itHead;
        let mayBeDirty = false;
        let index;
        let item;
        let itemTrackBy;
        if (Array.isArray(collection)) {
            this.length = collection.length;
            for (let index = 0; index < this.length; index++) {
                item = collection[index];
                itemTrackBy = this._trackByFn(index, item);
                if (record === null || !Object.is(record.trackById, itemTrackBy)) {
                    record = this._mismatch(record, item, itemTrackBy, index);
                    mayBeDirty = true;
                }
                else {
                    if (mayBeDirty) {
                        // TODO(misko): can we limit this to duplicates only?
                        record = this._verifyReinsertion(record, item, itemTrackBy, index);
                    }
                    if (!Object.is(record.item, item))
                        this._addIdentityChange(record, item);
                }
                record = record._next;
            }
        }
        else {
            index = 0;
            iterateListLike(collection, (item) => {
                itemTrackBy = this._trackByFn(index, item);
                if (record === null || !Object.is(record.trackById, itemTrackBy)) {
                    record = this._mismatch(record, item, itemTrackBy, index);
                    mayBeDirty = true;
                }
                else {
                    if (mayBeDirty) {
                        // TODO(misko): can we limit this to duplicates only?
                        record = this._verifyReinsertion(record, item, itemTrackBy, index);
                    }
                    if (!Object.is(record.item, item))
                        this._addIdentityChange(record, item);
                }
                record = record._next;
                index++;
            });
            this.length = index;
        }
        this._truncate(record);
        this.collection = collection;
        return this.isDirty;
    }
    /* CollectionChanges is considered dirty if it has any additions, moves, removals, or identity
     * changes.
     */
    get isDirty() {
        return (this._additionsHead !== null ||
            this._movesHead !== null ||
            this._removalsHead !== null ||
            this._identityChangesHead !== null);
    }
    /**
     * Reset the state of the change objects to show no changes. This means set previousKey to
     * currentKey, and clear all of the queues (additions, moves, removals).
     * Set the previousIndexes of moved and added items to their currentIndexes
     * Reset the list of additions, moves and removals
     *
     * @internal
     */
    _reset() {
        if (this.isDirty) {
            let record;
            for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {
                record._nextPrevious = record._next;
            }
            for (record = this._additionsHead; record !== null; record = record._nextAdded) {
                record.previousIndex = record.currentIndex;
            }
            this._additionsHead = this._additionsTail = null;
            for (record = this._movesHead; record !== null; record = record._nextMoved) {
                record.previousIndex = record.currentIndex;
            }
            this._movesHead = this._movesTail = null;
            this._removalsHead = this._removalsTail = null;
            this._identityChangesHead = this._identityChangesTail = null;
            // TODO(vicb): when assert gets supported
            // assert(!this.isDirty);
        }
    }
    /**
     * This is the core function which handles differences between collections.
     *
     * - `record` is the record which we saw at this position last time. If null then it is a new
     *   item.
     * - `item` is the current item in the collection
     * - `index` is the position of the item in the collection
     *
     * @internal
     */
    _mismatch(record, item, itemTrackBy, index) {
        // The previous record after which we will append the current one.
        let previousRecord;
        if (record === null) {
            previousRecord = this._itTail;
        }
        else {
            previousRecord = record._prev;
            // Remove the record from the collection since we know it does not match the item.
            this._remove(record);
        }
        // See if we have evicted the item, which used to be at some anterior position of _itHead list.
        record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy, null);
        if (record !== null) {
            // It is an item which we have evicted earlier: reinsert it back into the list.
            // But first we need to check if identity changed, so we can update in view if necessary.
            if (!Object.is(record.item, item))
                this._addIdentityChange(record, item);
            this._reinsertAfter(record, previousRecord, index);
        }
        else {
            // Attempt to see if the item is at some posterior position of _itHead list.
            record = this._linkedRecords === null ? null : this._linkedRecords.get(itemTrackBy, index);
            if (record !== null) {
                // We have the item in _itHead at/after `index` position. We need to move it forward in the
                // collection.
                // But first we need to check if identity changed, so we can update in view if necessary.
                if (!Object.is(record.item, item))
                    this._addIdentityChange(record, item);
                this._moveAfter(record, previousRecord, index);
            }
            else {
                // It is a new item: add it.
                record = this._addAfter(new IterableChangeRecord_(item, itemTrackBy), previousRecord, index);
            }
        }
        return record;
    }
    /**
     * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)
     *
     * Use case: `[a, a]` => `[b, a, a]`
     *
     * If we did not have this check then the insertion of `b` would:
     *   1) evict first `a`
     *   2) insert `b` at `0` index.
     *   3) leave `a` at index `1` as is. <-- this is wrong!
     *   3) reinsert `a` at index 2. <-- this is wrong!
     *
     * The correct behavior is:
     *   1) evict first `a`
     *   2) insert `b` at `0` index.
     *   3) reinsert `a` at index 1.
     *   3) move `a` at from `1` to `2`.
     *
     *
     * Double check that we have not evicted a duplicate item. We need to check if the item type may
     * have already been removed:
     * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted
     * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a
     * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'
     * at the end.
     *
     * @internal
     */
    _verifyReinsertion(record, item, itemTrackBy, index) {
        let reinsertRecord = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy, null);
        if (reinsertRecord !== null) {
            record = this._reinsertAfter(reinsertRecord, record._prev, index);
        }
        else if (record.currentIndex != index) {
            record.currentIndex = index;
            this._addToMoves(record, index);
        }
        return record;
    }
    /**
     * Get rid of any excess {@link IterableChangeRecord_}s from the previous collection
     *
     * - `record` The first excess {@link IterableChangeRecord_}.
     *
     * @internal
     */
    _truncate(record) {
        // Anything after that needs to be removed;
        while (record !== null) {
            const nextRecord = record._next;
            this._addToRemovals(this._unlink(record));
            record = nextRecord;
        }
        if (this._unlinkedRecords !== null) {
            this._unlinkedRecords.clear();
        }
        if (this._additionsTail !== null) {
            this._additionsTail._nextAdded = null;
        }
        if (this._movesTail !== null) {
            this._movesTail._nextMoved = null;
        }
        if (this._itTail !== null) {
            this._itTail._next = null;
        }
        if (this._removalsTail !== null) {
            this._removalsTail._nextRemoved = null;
        }
        if (this._identityChangesTail !== null) {
            this._identityChangesTail._nextIdentityChange = null;
        }
    }
    /** @internal */
    _reinsertAfter(record, prevRecord, index) {
        if (this._unlinkedRecords !== null) {
            this._unlinkedRecords.remove(record);
        }
        const prev = record._prevRemoved;
        const next = record._nextRemoved;
        if (prev === null) {
            this._removalsHead = next;
        }
        else {
            prev._nextRemoved = next;
        }
        if (next === null) {
            this._removalsTail = prev;
        }
        else {
            next._prevRemoved = prev;
        }
        this._insertAfter(record, prevRecord, index);
        this._addToMoves(record, index);
        return record;
    }
    /** @internal */
    _moveAfter(record, prevRecord, index) {
        this._unlink(record);
        this._insertAfter(record, prevRecord, index);
        this._addToMoves(record, index);
        return record;
    }
    /** @internal */
    _addAfter(record, prevRecord, index) {
        this._insertAfter(record, prevRecord, index);
        if (this._additionsTail === null) {
            // TODO(vicb):
            // assert(this._additionsHead === null);
            this._additionsTail = this._additionsHead = record;
        }
        else {
            // TODO(vicb):
            // assert(_additionsTail._nextAdded === null);
            // assert(record._nextAdded === null);
            this._additionsTail = this._additionsTail._nextAdded = record;
        }
        return record;
    }
    /** @internal */
    _insertAfter(record, prevRecord, index) {
        // TODO(vicb):
        // assert(record != prevRecord);
        // assert(record._next === null);
        // assert(record._prev === null);
        const next = prevRecord === null ? this._itHead : prevRecord._next;
        // TODO(vicb):
        // assert(next != record);
        // assert(prevRecord != record);
        record._next = next;
        record._prev = prevRecord;
        if (next === null) {
            this._itTail = record;
        }
        else {
            next._prev = record;
        }
        if (prevRecord === null) {
            this._itHead = record;
        }
        else {
            prevRecord._next = record;
        }
        if (this._linkedRecords === null) {
            this._linkedRecords = new _DuplicateMap();
        }
        this._linkedRecords.put(record);
        record.currentIndex = index;
        return record;
    }
    /** @internal */
    _remove(record) {
        return this._addToRemovals(this._unlink(record));
    }
    /** @internal */
    _unlink(record) {
        if (this._linkedRecords !== null) {
            this._linkedRecords.remove(record);
        }
        const prev = record._prev;
        const next = record._next;
        // TODO(vicb):
        // assert((record._prev = null) === null);
        // assert((record._next = null) === null);
        if (prev === null) {
            this._itHead = next;
        }
        else {
            prev._next = next;
        }
        if (next === null) {
            this._itTail = prev;
        }
        else {
            next._prev = prev;
        }
        return record;
    }
    /** @internal */
    _addToMoves(record, toIndex) {
        // TODO(vicb):
        // assert(record._nextMoved === null);
        if (record.previousIndex === toIndex) {
            return record;
        }
        if (this._movesTail === null) {
            // TODO(vicb):
            // assert(_movesHead === null);
            this._movesTail = this._movesHead = record;
        }
        else {
            // TODO(vicb):
            // assert(_movesTail._nextMoved === null);
            this._movesTail = this._movesTail._nextMoved = record;
        }
        return record;
    }
    _addToRemovals(record) {
        if (this._unlinkedRecords === null) {
            this._unlinkedRecords = new _DuplicateMap();
        }
        this._unlinkedRecords.put(record);
        record.current   Index = null;
        record._nextRemoved = null;
        if (this._removalsTail === null) {
            // TODO(vicb):
            // assert(_removalsHead === null);
            this._removalsTail = this._removalsHead = record;
            record._prevRemoved = null;
        }
        else {
            // TODO(vicb):
            // assert(_removalsTail._nextRemoved === null);
            // assert(record._nextRemoved === null);
            record._prevRemoved = this._removalsTail;
            this._removalsTail = this._removalsTail._nextRemoved = record;
        }
        return record;
    }
    /** @internal */
    _addIdentityChange(record, item) {
        record.item = item;
        if (this._identityChangesTail === null) {
            this._identityChangesTail = this._identityChangesHead = record;
        }
        else {
            this._identityChangesTail = this._identityChangesTail._nextIdentityChange = record;
        }
        return record;
    }
}
class IterableChangeRecord_ {
    item;
    trackById;
    currentIndex = null;
    previousIndex = null;
    /** @internal */
    _nextPrevious = null;
    /** @internal */
    _prev = null;
    /** @internal */
    _next = null;
    /** @internal */
    _prevDup = null;
    /** @internal */
    _nextDup = null;
    /** @internal */
    _prevRemoved = null;
    /** @internal */
    _nextRemoved = null;
    /** @internal */
    _nextAdded = null;
    /** @internal */
    _nextMoved = null;
    /** @internal */
    _nextIdentityChange = null;
    constructor(item, trackById) {
        this.item = item;
        this.trackById = trackById;
    }
}
// A linked list of IterableChangeRecords with the same IterableChangeRecord_.item
class _DuplicateItemRecordList {
    /** @internal */
    _head = null;
    /** @internal */
    _tail = null;
    /**
     * Append the record to the list of duplicates.
     *
     * Note: by design all records in the list of duplicates hold the same value in record.item.
     */
    add(record) {
        if (this._head === null) {
            this._head = this._tail = record;
            record._nextDup = null;
            record._prevDup = null;
        }
        else {
            // TODO(vicb):
            // assert(record.item ==  _head.item ||
            //       record.item is num && record.item.isNaN && _head.item is num && _head.item.isNaN);
            this._tail._nextDup = record;
            record._prevDup = this._tail;
            record._nextDup = null;
            this._tail = record;
        }
    }
    // Returns a IterableChangeRecord_ having IterableChangeRecord_.trackById == trackById and
    // IterableChangeRecord_.currentIndex >= atOrAfterIndex
    get(trackById, atOrAfterIndex) {
        let record;
        for (record = this._head; record !== null; record = record._nextDup) {
            if ((atOrAfterIndex === null || atOrAfterIndex <= record.currentIndex) &&
                Object.is(record.trackById, trackById)) {
                return record;
            }
        }
        return null;
    }
    /**
     * Remove one {@link IterableChangeRecord_} from the list of duplicates.
     *
     * Returns whether the list of duplicates is empty.
     */
    remove(record) {
        // TODO(vicb):
        // assert(() {
        //  // verify that the record being removed is in the list.
        //  for (IterableChangeRecord_ cursor = _head; cursor != null; cursor = cursor._nextDup) {
        //    if (identical(cursor, record)) return true;
        //  }
        //  return false;
        //});
        const prev = record._prevDup;
        const next = record._nextDup;
        if (prev === null) {
            this._head = next;
        }
        else {
            prev._nextDup = next;
        }
        if (next === null) {
            this._tail = prev;
        }
        else {
            next._prevDup = prev;
        }
        return this._head === null;
    }
}
class _DuplicateMap {
    map = new Map();
    put(record) {
        const key = record.trackById;
        let duplicates = this.map.get(key);
        if (!duplicates) {
            duplicates = new _DuplicateItemRecordList();
            this.map.set(key, duplicates);
        }
        duplicates.add(record);
    }
    /**
     * Retrieve the `value` using key. Because the IterableChangeRecord_ value may be one which we
     * have already iterated over, we use the `atOrAfterIndex` to pretend it is not there.
     *
     * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we
     * have any more `a`s needs to return the second `a`.
     */
    get(trackById, atOrAfterIndex) {
        const key = trackById;
        const recordList = this.map.get(key);
        return recordList ? recordList.get(trackById, atOrAfterIndex) : null;
    }
    /**
     * Removes a {@link IterableChangeRecord_} from the list of duplicates.
     *
     * The list of duplicates also is removed from the map if it gets empty.
     */
    remove(record) {
        const key = record.trackById;
        const recordList = this.map.get(key);
        // Remove the list of duplicates when it gets empty
        if (recordList.remove(record)) {
            this.map.delete(key);
        }
        return record;
    }
    get isEmpty() {
        return this.map.size === 0;
    }
    clear() {
        this.map.clear();
    }
}
function getPreviousIndex(item, addRemoveOffset, moveOffsets) {
    const previousIndex = item.previousIndex;
    if (previousIndex === null)
        return previousIndex;
    let moveOffset = 0;
    if (moveOffsets && previousIndex < moveOffsets.length) {
        moveOffset = moveOffsets[previousIndex];
    }
    return previousIndex + addRemoveOffset + moveOffset;
}

class DefaultKeyValueDifferFactory {
    constructor() { }
    supports(obj) {
        return obj instanceof Map || isJsObject(obj);
    }
    create() {
        return new DefaultKeyValueDiffer();
    }
}
class DefaultKeyValueDiffer {
    _records = new Map();
    _mapHead = null;
    // _appendAfter is used in the check loop
    _appendAfter = null;
    _previousMapHead = null;
    _changesHead = null;
    _changesTail = null;
    _additionsHead = null;
    _additionsTail = null;
    _removalsHead = null;
    _removalsTail = null;
    get isDirty() {
        return (this._additionsHead !== null || this._changesHead !== null || this._removalsHead !== null);
    }
    forEachItem(fn) {
        let record;
        for (record = this._mapHead; record !== null; record = record._next) {
            fn(record);
        }
    }
    forEachPreviousItem(fn) {
        let record;
        for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
            fn(record);
        }
    }
    forEachChangedItem(fn) {
        let record;
        for (record = this._changesHead; record !== null; record = record._nextChanged) {
            fn(record);
        }
    }
    forEachAddedItem(fn) {
        let record;
        for (record = this._additionsHead; record !== null; record = record._nextAdded) {
            fn(record);
        }
    }
    forEachRemovedItem(fn) {
        let record;
        for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
            fn(record);
        }
    }
    diff(map) {
        if (!map) {
            map = new Map();
        }
        else if (!(map instanceof Map || isJsObject(map))) {
            throw new RuntimeError(900 /* RuntimeErrorCode.INVALID_DIFFER_INPUT */, ngDevMode && `Error trying to diff '${stringify(map)}'. Only maps and objects are allowed`);
        }
        return this.check(map) ? this : null;
    }
    onDestroy() { }
    /**
     * Check the current state of the map vs the previous.
     * The algorithm is optimised for when the keys do no change.
     */
    check(map) {
        this._reset();
        let insertBefore = this._mapHead;
        this._appendAfter = null;
        this._forEach(map, (value, key) => {
            if (insertBefore && insertBefore.key === key) {
                this._maybeAddToChanges(insertBefore, value);
                this._appendAfter = insertBefore;
                insertBefore = insertBefore._next;
            }
            else {
                const record = this._getOrCreateRecordForKey(key, value);
                insertBefore = this._insertBeforeOrAppend(insertBefore, record);
            }
        });
        // Items remaining at the end of the list have been deleted
        if (insertBefore) {
            if (insertBefore._prev) {
                insertBefore._prev._next = null;
            }
            this._removalsHead = insertBefore;
            for (let record = insertBefore; record !== null; record = record._nextRemoved) {
                if (record === this._mapHead) {
                    this._mapHead = null;
                }
                this._records.delete(record.key);
                record._nextRemoved = record._next;
                record.previousValue = record.currentValue;
                record.currentValue = null;
                record._prev = null;
                record._next = null;
            }
        }
        // Make sure tails have no next records from previous runs
        if (this._changesTail)
            this._changesTail._nextChanged = null;
        if (this._additionsTail)
            this._additionsTail._nextAdded = null;
        return this.isDirty;
    }
    /**
     * Inserts a record before `before` or append at the end of the list when `before` is null.
     *
     * Notes:
     * - This method appends at `this._appendAfter`,
     * - This method updates `this._appendAfter`,
     * - The return value is the new value for the insertion pointer.
     */
    _insertBeforeOrAppend(before, record) {
        if (before) {
            const prev = before._prev;
            record._next = before;
            record._prev = prev;
            before._prev = record;
            if (prev) {
                prev._next = record;
            }
            if (before === this._mapHead) {
                this._mapHead = record;
            }
            this._appendAfter = before;
            return before;
        }
        if (this._appendAfter) {
            this._appendAfter._next = record;
            record._prev = this._appendAfter;
        }
        else {
            this._mapHead = record;
        }
        this._appendAfter = record;
        return null;
    }
    _getOrCreateRecordForKey(key, value) {
        if (this._records.has(key)) {
            const record = this._records.get(key);
            this._maybeAddToChanges(record, value);
            const prev = record._prev;
            const next = record._next;
            if (prev) {
                prev._next = next;
            }
            if (next) {
                next._prev = prev;
            }
            record._next = null;
            record._prev = null;
            return record;
        }
        const record = new KeyValueChangeRecord_(key);
        this._records.set(key, record);
        record.currentValue = value;
        this._addToAdditions(record);
        return record;
    }
    /** @internal */
    _reset() {
        if (this.isDirty) {
            let record;
            // let `_previousMapHead` contain the state of the map before the changes
            this._previousMapHead = this._mapHead;
            for (record = this._previousMapHead; record !== null; record = record._next) {
                record._nextPrevious = record._next;
            }
            // Update `record.previousValue` with the value of the item before the changes
            // We need to update all changed items (that's those which have been added and changed)
            for (record = this._changesHead; record !== null; record = record._nextChanged) {
                record.previousValue = record.currentValue;
            }
            for (record = this._additionsHead; record != null; record = record._nextAdded) {
                record.previousValue = record.currentValue;
            }
            this._changesHead = this._changesTail = null;
            this._additionsHead = this._additionsTail = null;
            this._removalsHead = null;
        }
    }
    // Add the record or a given key to the list of changes only when the value has actually changed
    _maybeAddToChanges(record, newValue) {
        if (!Object.is(newValue, record.currentValue)) {
            record.previousValue = record.currentValue;
            record.currentValue = newValue;
            this._addToChanges(record);
        }
    }
    _addToAdditions(record) {
        if (this._additionsHead === null) {
            this._additionsHead = this._additionsTail = record;
        }
        else {
            this._additionsTail._nextAdded = record;
            this._additionsTail = record;
        }
    }
    _addToChanges(record) {
        if (this._changesHead === null) {
            this._changesHead = this._changesTail = record;
        }
        else {
            this._changesTail._nextChanged = record;
            this._changesTail = record;
        }
    }
    /** @internal */
    _forEach(obj, fn) {
        if (obj instanceof Map) {
            obj.forEach(fn);
        }
        else {
            Object.keys(obj).forEach((k) => fn(obj[k], k));
        }
    }
}
class KeyValueChangeRecord_ {
    key;
    previousValue = null;
    currentValue = null;
    /** @internal */
    _nextPrevious = null;
    /** @internal */
    _next = null;
    /** @internal */
    _prev = null;
    /** @internal */
    _nextAdded = null;
    /** @internal */
    _nextRemoved = null;
    /** @internal */
    _nextChanged = null;
    constructor(key) {
        this.key = key;
    }
}

function defaultIterableDiffersFactory() {
    return new IterableDiffers([new DefaultIterableDifferFactory()]);
}
/**
 * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.
 *
 * @publicApi
 */
class IterableDiffers {
    factories;
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: IterableDiffers,
        providedIn: 'root',
        factory: defaultIterableDiffersFactory,
    });
    constructor(factories) {
        this.factories = factories;
    }
    static create(factories, parent) {
        if (parent != null) {
            const copied = parent.factories.slice();
            factories = factories.concat(copied);
        }
        return new IterableDiffers(factories);
    }
    /**
     * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the
     * inherited {@link IterableDiffers} instance with the provided factories and return a new
     * {@link IterableDiffers} instance.
     *
     * @usageNotes
     * ### Example
     *
     * The following example shows how to extend an existing list of factories,
     * which will only be applied to the injector for this component and its children.
     * This step is all that's required to make a new {@link IterableDiffer} available.
     *
     * ```ts
     * @Component({
     *   viewProviders: [
     *     IterableDiffers.extend([new ImmutableListDiffer()])
     *   ]
     * })
     * ```
     */
    static extend(factories) {
        return {
            provide: IterableDiffers,
            useFactory: (parent) => {
                // if parent is null, it means that we are in the root injector and we have just overridden
                // the default injection mechanism for IterableDiffers, in such a case just assume
                // `defaultIterableDiffersFactory`.
                return IterableDiffers.create(factories, parent || defaultIterableDiffersFactory());
            },
            // Dependency technically isn't optional, but we can provide a better error message this way.
            deps: [[IterableDiffers, new SkipSelf(), new Optional()]],
        };
    }
    find(iterable) {
        const factory = this.factories.find((f) => f.supports(iterable));
        if (factory != null) {
            return factory;
        }
        else {
            throw new RuntimeError(901 /* RuntimeErrorCode.NO_SUPPORTING_DIFFER_FACTORY */, ngDevMode &&
                `Cannot find a differ supporting object '${iterable}' of type '${getTypeNameForDebugging(iterable)}'`);
        }
    }
}
function getTypeNameForDebugging(type) {
    return type['name'] || typeof type;
}

function defaultKeyValueDiffersFactory() {
    return new KeyValueDiffers([new DefaultKeyValueDifferFactory()]);
}
/**
 * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.
 *
 * @publicApi
 */
class KeyValueDiffers {
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: KeyValueDiffers,
        providedIn: 'root',
        factory: defaultKeyValueDiffersFactory,
    });
    factories;
    constructor(factories) {
        this.factories = factories;
    }
    static create(factories, parent) {
        if (parent) {
            const copied = parent.factories.slice();
            factories = factories.concat(copied);
        }
        return new KeyValueDiffers(factories);
    }
    /**
     * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the
     * inherited {@link KeyValueDiffers} instance with the provided factories and return a new
     * {@link KeyValueDiffers} instance.
     *
     * @usageNotes
     * ### Example
     *
     * The following example shows how to extend an existing list of factories,
     * which will only be applied to the injector for this component and its children.
     * This step is all that's required to make a new {@link KeyValueDiffer} available.
     *
     * ```ts
     * @Component({
     *   viewProviders: [
     *     KeyValueDiffers.extend([new ImmutableMapDiffer()])
     *   ]
     * })
     * ```
     */
    static extend(factories) {
        return {
            provide: KeyValueDiffers,
            useFactory: (parent) => {
                // if parent is null, it means that we are in the root injector and we have just overridden
                // the default injection mechanism for KeyValueDiffers, in such a case just assume
                // `defaultKeyValueDiffersFactory`.
                return KeyValueDiffers.create(factories, parent || defaultKeyValueDiffersFactory());
            },
            // Dependency technically isn't optional, but we can provide a better error message this way.
            deps: [[KeyValueDiffers, new SkipSelf(), new Optional()]],
        };
    }
    find(kv) {
        const factory = this.factories.find((f) => f.supports(kv));
        if (factory) {
            return factory;
        }
        throw new RuntimeError(901 /* RuntimeErrorCode.NO_SUPPORTING_DIFFER_FACTORY */, ngDevMode && `Cannot find a differ supporting object '${kv}'`);
    }
}

/**
 * Structural diffing for `Object`s and `Map`s.
 */
const keyValDiff = [new DefaultKeyValueDifferFactory()];
/**
 * Structural diffing for `Iterable` types such as `Array`s.
 */
const iterableDiff = [new DefaultIterableDifferFactory()];
const defaultIterableDiffers = new IterableDiffers(iterableDiff);
const defaultKeyValueDiffers = new KeyValueDiffers(keyValDiff);

/**
 * This platform has to be included in any other platform
 *
 * @publicApi
 */
const platformCore = createPlatformFactory(null, 'core', []);

/**
 * Re-exported by `BrowserModule`, which is included automatically in the root
 * `AppModule` when you create a new app with the CLI `new` command. Eagerly injects
 * `ApplicationRef` to instantiate it.
 *
 * @publicApi
 */
class ApplicationModule {
    // Inject ApplicationRef to make it eager...
    constructor(appRef) { }
    static ɵfac = function ApplicationModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ApplicationModule)(ɵɵinject(ApplicationRef)); };
    static ɵmod = /*@__PURE__*/ ɵɵdefineNgModule({ type: ApplicationModule });
    static ɵinj = /*@__PURE__*/ ɵɵdefineInjector({});
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ApplicationModule, [{
        type: NgModule
    }], () => [{ type: ApplicationRef }], null); })();

/**
 * Internal create application API that implements the core application creation logic and optional
 * bootstrap logic.
 *
 * Platforms (such as `platform-browser`) may require different set of application and platform
 * providers for an application to function correctly. As a result, platforms may use this function
 * internally and supply the necessary providers during the bootstrap, while exposing
 * platform-specific APIs as a part of their public API.
 *
 * @returns A promise that returns an `ApplicationRef` instance once resolved.
 */
function internalCreateApplication(config) {
    profiler(8 /* ProfilerEvent.BootstrapApplicationStart */);
    try {
        const { rootComponent, appProviders, platformProviders } = config;
        if ((typeof ngDevMode === 'undefined' || ngDevMode) && rootComponent !== undefined) {
            assertStandaloneComponentType(rootComponent);
        }
        const platformInjector = createOrReusePlatformInjector(platformProviders);
        // Create root application injector based on a set of providers configured at the platform
        // bootstrap level as well as providers passed to the bootstrap call by a user.
        const allAppProviders = [
            internalProvideZoneChangeDetection({}),
            { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
            ...(appProviders || []),
        ];
        const adapter = new EnvironmentNgModuleRefAdapter({
            providers: allAppProviders,
            parent: platformInjector,
            debugName: typeof ngDevMode === 'undefined' || ngDevMode ? 'Environment Injector' : '',
            // We skip environment initializers because we need to run them inside the NgZone, which
            // happens after we get the NgZone instance from the Injector.
            runEnvironmentInitializers: false,
        });
        return bootstrap({
            r3Injector: adapter.injector,
            platformInjector,
            rootComponent,
        });
    }
    catch (e) {
        return Promise.reject(e);
    }
    finally {
        profiler(9 /* ProfilerEvent.BootstrapApplicationEnd */);
    }
}

/** Apps in which we've enabled event replay.
 *  This is to prevent initializing event replay more than once per app.
 */
const appsWithEventReplay = new WeakSet();
/**
 * The key that represents all replayable elements that are not in defer blocks.
 */
const EAGER_CONTENT_LISTENERS_KEY = '';
/**
 * A list of block events that need to be replayed
 */
let blockEventQueue = [];
/**
 * Determines whether Event Replay feature should be activated on the client.
 */
function shouldEnableEventReplay(injector) {
    return injector.get(IS_EVENT_REPLAY_ENABLED, EVENT_REPLAY_ENABLED_DEFAULT);
}
/**
 * Returns a set of providers required to setup support for event replay.
 * Requires hydration to be enabled separately.
 */
function withEventReplay() {
    const providers = [
        {
            provide: IS_EVENT_REPLAY_ENABLED,
            useFactory: () => {
                let isEnabled = true;
                if (typeof ngServerMode === 'undefined' || !ngServerMode) {
                    // Note: globalThis[CONTRACT_PROPERTY] may be undefined in case Event Replay feature
                    // is enabled, but there are no events configured in this application, in which case
                    // we don't activate this feature, since there are no events to replay.
                    const appId = inject(APP_ID);
                    isEnabled = !!window._ejsas?.[appId];
                }
                if (isEnabled) {
                    performanceMarkFeature('NgEventReplay');
                }
                return isEnabled;
            },
        },
    ];
    if (typeof ngServerMode === 'undefined' || !ngServerMode) {
        providers.push({
            provide: ENVIRONMENT_INITIALIZER,
            useValue: () => {
                const appRef = inject(ApplicationRef);
                const { injector } = appRef;
                // We have to check for the appRef here due to the possibility of multiple apps
                // being present on the same page. We only want to enable event replay for the
                // apps that actually want it.
                if (!appsWithEventReplay.has(appRef)) {
                    const jsActionMap = inject(JSACTION_BLOCK_ELEMENT_MAP);
                    if (shouldEnableEventReplay(injector)) {
                        enableStashEventListenerImpl();
                        const appId = injector.get(APP_ID);
                        const clearStashFn = setStashFn(appId, (rEl, eventName, listenerFn) => {
                            // If a user binds to a ng-container and uses a directive that binds using a host listener,
                            // this element could be a comment node. So we need to ensure we have an actual element
                            // node before stashing anything.
                            if (rEl.nodeType !== Node.ELEMENT_NODE)
                                return;
                            sharedStashFunction(rEl, eventName, listenerFn);
                            sharedMapFunction(rEl, jsActionMap);
                        });
                        // Clean up the reference to the function set by the environment initializer,
                        // as the function closure may capture injected elements and prevent them
                        // from being properly garbage collected.
                        appRef.onDestroy(clearStashFn);
                    }
                }
            },
            multi: true,
        }, {
            provide: APP_BOOTSTRAP_LISTENER,
            useFactory: () => {
                const appRef = inject(ApplicationRef);
                const { injector } = appRef;
                return () => {
                    // We have to check for the appRef here due to the possibility of multiple apps
                    // being present on the same page. We only want to enable event replay for the
                    // apps that actually want it.
                    if (!shouldEnableEventReplay(injector) || appsWithEventReplay.has(appRef)) {
                        return;
                    }
                    appsWithEventReplay.add(appRef);
                    appRef.onDestroy(() => {
                        appsWithEventReplay.delete(appRef);
                        // Ensure that we're always safe calling this in the browser.
                        if (typeof ngServerMode !== 'undefined' && !ngServerMode) {
                            const appId = injector.get(APP_ID);
                            // `_ejsa` should be deleted when the app is destroyed, ensuring that
                            // no elements are still captured in the global list and are not prevented
                            // from being garbage collected.
                            clearAppScopedEarlyEventContract(appId);
                        }
                    });
                    // Kick off event replay logic once hydration for the initial part
                    // of the application is completed. This timing is similar to the unclaimed
                    // dehydrated views cleanup timing.
                    appRef.whenStable().then(() => {
                        // Note: we have to check whether the application is destroyed before
                        // performing other operations with the `injector`.
                        // The application may be destroyed **before** it becomes stable, so when
                        // the `whenStable` resolves, the injector might already be in
                        // a destroyed state. Thus, calling `injector.get` would throw an error
                        // indicating that the injector has already been destroyed.
                        if (appRef.destroyed) {
                            return;
                        }
                        const eventContractDetails = injector.get(JSACTION_EVENT_CONTRACT);
                        initEventReplay(eventContractDetails, injector);
                        const jsActionMap = injector.get(JSACTION_BLOCK_ELEMENT_MAP);
                        jsActionMap.get(EAGER_CONTENT_LISTENERS_KEY)?.forEach(removeListeners);
                        jsActionMap.delete(EAGER_CONTENT_LISTENERS_KEY);
                        const eventContract = eventContractDetails.instance;
                        // This removes event listeners registered through the container manager,
                        // as listeners registered on `document.body` might never be removed if we
                        // don't clean up the contract.
                        if (isIncrementalHydrationEnabled(injector)) {
                            // When incremental hydration is enabled, we cannot clean up the event
                            // contract immediately because we're unaware if there are any deferred
                            // blocks to hydrate. We can only schedule a contract cleanup when the
                            // app is destroyed.
                            appRef.onDestroy(() => eventContract.cleanUp());
                        }
                        else {
                            eventContract.cleanUp();
                        }
                    });
                };
            },
            multi: true,
        });
    }
    return providers;
}
const initEventReplay = (eventDelegation, injector) => {
    const appId = injector.get(APP_ID);
    // This is set in packages/platform-server/src/utils.ts
    const earlyJsactionData = window._ejsas[appId];
    const eventContract = (eventDelegation.instance = new EventContract(new EventContractContainer(earlyJsactionData.c)));
    for (const et of earlyJsactionData.et) {
        eventContract.addEvent(et);
    }
    for (const et of earlyJsactionData.etc) {
        eventContract.addEvent(et);
    }
    const eventInfos = getAppScopedQueuedEventInfos(appId);
    eventContract.replayEarlyEventInfos(eventInfos);
    clearAppScopedEarlyEventContract(appId);
    const dispatcher = new EventDispatcher((event) => {
        invokeRegisteredReplayListeners(injector, event, event.currentTarget);
    });
    registerDispatcher(eventContract, dispatcher);
};
/**
 * Extracts information about all DOM events (added in a template) registered on elements in a give
 * LView. Maps collected events to a corresponding DOM element (an element is used as a key).
 */
function collectDomEventsInfo(tView, lView, eventTypesToReplay) {
    const domEventsInfo = new Map();
    const lCleanup = lView[CLEANUP];
    const tCleanup = tView.cleanup;
    if (!tCleanup || !lCleanup) {
        return domEventsInfo;
    }
    for (let i = 0; i < tCleanup.length;) {
        const firstParam = tCleanup[i++];
        const secondParam = tCleanup[i++];
        if (typeof firstParam !== 'string') {
            continue;
        }
        const eventType = firstParam;
        if (!isEarlyEventType(eventType)) {
            continue;
        }
        if (isCaptureEventType(eventType)) {
            eventTypesToReplay.capture.add(eventType);
        }
        else {
            eventTypesToReplay.regular.add(eventType);
        }
        const listenerElement = unwrapRNode(lView[secondParam]);
        i++; // move the cursor to the next position (location of the listener idx)
        const useCaptureOrIndx = tCleanup[i++];
        // if useCaptureOrIndx is boolean then report it as is.
        // if useCaptureOrIndx is positive number then it in unsubscribe method
        // if useCaptureOrIndx is negative number then it is a Subscription
        const isDomEvent = typeof useCaptureOrIndx === 'boolean' || useCaptureOrIndx >= 0;
        if (!isDomEvent) {
            continue;
        }
        if (!domEventsInfo.has(listenerElement)) {
            domEventsInfo.set(listenerElement, [eventType]);
        }
        else {
            domEventsInfo.get(listenerElement).push(eventType);
        }
    }
    return domEventsInfo;
}
function invokeRegisteredReplayListeners(injector, event, currentTarget) {
    const blockName = (currentTarget && currentTarget.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE)) ?? '';
    if (/d\d+/.test(blockName)) {
        hydrateAndInvokeBlockListeners(blockName, injector, event, currentTarget);
    }
    else if (event.eventPhase === EventPhase.REPLAY) {
        invokeListeners(event, currentTarget);
    }
}
function hydrateAndInvokeBlockListeners(blockName, injector, event, currentTarget) {
    blockEventQueue.push({ event, currentTarget });
    triggerHydrationFromBlockName(injector, blockName, replayQueuedBlockEvents);
}
function replayQueuedBlockEvents(hydratedBlocks) {
    // clone the queue
    const queue = [...blockEventQueue];
    const hydrated = new Set(hydratedBlocks);
    // empty it
    blockEventQueue = [];
    for (let { event, currentTarget } of queue) {
        const blockName = currentTarget.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE);
        if (hydrated.has(blockName)) {
            invokeListeners(event, currentTarget);
        }
        else {
            // requeue events that weren't yet hydrated
            blockEventQueue.push({ event, currentTarget });
        }
    }
}

/**
 * A collection that tracks all serialized views (`ngh` DOM annotations)
 * to avoid duplication. An attempt to add a duplicate view results in the
 * collection returning the index of the previously collected serialized view.
 * This reduces the number of annotations needed for a given page.
 */
class SerializedViewCollection {
    views = [];
    indexByContent = new Map();
    add(serializedView) {
        const viewAsString = JSON.stringify(serializedView);
        if (!this.indexByContent.has(viewAsString)) {
            const index = this.views.length;
            this.views.push(serializedView);
            this.indexByContent.set(viewAsString, index);
            return index;
        }
        return this.indexByContent.get(viewAsString);
    }
    getAll() {
        return this.views;
    }
}
/**
 * Global counter that is used to generate a unique id for TViews
 * during the serialization process.
 */
let tViewSsrId = 0;
/**
 * Generates a unique id for a given TView and returns this id.
 * The id is also stored on this instance of a TView and reused in
 * subsequent calls.
 *
 * This id is needed to uniquely identify and pick up dehydrated views
 * at runtime.
 */
function getSsrId(tView) {
    if (!tView.ssrId) {
        tView.ssrId = `t${tViewSsrId++}`;
    }
    return tView.ssrId;
}
/**
 * Computes the number of root nodes in a given view
 * (or child nodes in a given container if a tNode is provided).
 */
function calcNumRootNodes(tView, lView, tNode) {
    const rootNodes = [];
    collectNativeNodes(tView, lView, tNode, rootNodes);
    return rootNodes.length;
}
/**
 * Computes the number of root nodes in all views in a given LContainer.
 */
function calcNumRootNodesInLContainer(lContainer) {
    const rootNodes = [];
    collectNativeNodesInLContainer(lContainer, rootNodes);
    return rootNodes.length;
}
/**
 * Annotates root level component's LView for hydration,
 * see `annotateHostElementForHydration` for additional information.
 */
function annotateComponentLViewForHydration(lView, context, injector) {
    const hostElement = lView[HOST];
    // Root elements might also be annotated with the `ngSkipHydration` attribute,
    // check if it's present before starting the serialization process.
    if (hostElement && !hostElement.hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {
        return annotateHostElementForHydration(hostElement, lView, null, context);
    }
    return null;
}
/**
 * Annotates root level LContainer for hydration. This happens when a root component
 * injects ViewContainerRef, thus making the component an anchor for a view container.
 * This function serializes the component itself as well as all views from the view
 * container.
 */
function annotateLContainerForHydration(lContainer, context, injector) {
    const componentLView = unwrapLView(lContainer[HOST]);
    // Serialize the root component itself.
    const componentLViewNghIndex = annotateComponentLViewForHydration(componentLView, context);
    if (componentLViewNghIndex === null) {
        // Component was not serialized (for example, if hydration was skipped by adding
        // the `ngSkipHydration` attribute or this component uses i18n blocks in the template,
        // but `withI18nSupport()` was not added), avoid annotating host element with the `ngh`
        // attribute.
        return;
    }
    const hostElement = unwrapRNode(componentLView[HOST]);
    // Serialize all views within this view container.
    const rootLView = lContainer[PARENT];
    const rootLViewNghIndex = annotateHostElementForHydration(hostElement, rootLView, null, context);
    const renderer = componentLView[RENDERER];
    // For cases when a root component also acts as an anchor node for a ViewContainerRef
    // (for example, when ViewContainerRef is injected in a root component), there is a need
    // to serialize information about the component itself, as well as an LContainer that
    // represents this ViewContainerRef. Effectively, we need to serialize 2 pieces of info:
    // (1) hydration info for the root component itself and (2) hydration info for the
    // ViewContainerRef instance (an LContainer). Each piece of information is included into
    // the hydration data (in the TransferState object) separately, thus we end up with 2 ids.
    // Since we only have 1 root element, we encode both bits of info into a single string:
    // ids are separated by the `|` char (e.g. `10|25`, where `10` is the ngh for a component view
    // and 25 is the `ngh` for a root view which holds LContainer).
    const finalIndex = `${componentLViewNghIndex}|${rootLViewNghIndex}`;
    renderer.setAttribute(hostElement, NGH_ATTR_NAME, finalIndex);
}
/**
 * Annotates all components bootstrapped in a given ApplicationRef
 * with info needed for hydration.
 *
 * @param appRef An instance of an ApplicationRef.
 * @param doc A reference to the current Document instance.
 * @return event types that need to be replayed
 */
function annotateForHydration(appRef, doc) {
    const injector = appRef.injector;
    const isI18nHydrationEnabledVal = isI18nHydrationEnabled(injector);
    const isIncrementalHydrationEnabledVal = isIncrementalHydrationEnabled(injector);
    const serializedViewCollection = new SerializedViewCollection();
    const corruptedTextNodes = new Map();
    const viewRefs = appRef._views;
    const shouldReplayEvents = injector.get(IS_EVENT_REPLAY_ENABLED, EVENT_REPLAY_ENABLED_DEFAULT);
    const eventTypesToReplay = {
        regular: new Set(),
        capture: new Set(),
    };
    const deferBlocks = new Map();
    appRef.injector.get(APP_ID);
    for (const viewRef of viewRefs) {
        const lNode = getLNodeForHydration(viewRef);
        // An `lView` might be `null` if a `ViewRef` represents
        // an embedded view (not a component view).
        if (lNode !== null) {
            const context = {
                serializedViewCollection,
                corruptedTextNodes,
                isI18nHydrationEnabled: isI18nHydrationEnabledVal,
                isIncrementalHydrationEnabled: isIncrementalHydrationEnabledVal,
                i18nChildren: new Map(),
                eventTypesToReplay,
                shouldReplayEvents,
                deferBlocks,
            };
            if (isLContainer(lNode)) {
                annotateLContainerForHydration(lNode, context);
            }
            else {
                annotateComponentLViewForHydration(lNode, context);
            }
            insertCorruptedTextNodeMarkers(corruptedTextNodes, doc);
        }
    }
    // Note: we *always* include hydration info key and a corresponding value
    // into the TransferState, even if the list of serialized views is empty.
    // This is needed as a signal to the client that the server part of the
    // hydration logic was setup and enabled correctly. Otherwise, if a client
    // hydration doesn't find a key in the transfer state - an error is produced.
    const serializedViews = serializedViewCollection.getAll();
    const transferState = injector.get(TransferState);
    transferState.set(NGH_DATA_KEY, serializedViews);
    if (deferBlocks.size > 0) {
        const blocks = {};
        for (const [id, info] of deferBlocks.entries()) {
            blocks[id] = info;
        }
        transferState.set(NGH_DEFER_BLOCKS_KEY, blocks);
    }
    return eventTypesToReplay;
}
/**
 * Serializes the lContainer data into a list of SerializedView objects,
 * that represent views within this lContainer.
 *
 * @param lContainer the lContainer we are serializing
 * @param tNode the TNode that contains info about this LContainer
 * @param lView that hosts this LContainer
 * @param parentDeferBlockId the defer block id of the parent if it exists
 * @param context the hydration context
 * @returns an array of the `SerializedView` objects
 */
function serializeLContainer(lContainer, tNode, lView, parentDeferBlockId, context) {
    const views = [];
    let lastViewAsString = '';
    for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
        let childLView = lContainer[i];
        let template;
        let numRootNodes;
        let serializedView;
        if (isRootView(childLView)) {
            // If this is a root view, get an LView for the underlying component,
            // because it contains information about the view to serialize.
            childLView = childLView[HEADER_OFFSET];
            // If we have an LContainer at this position, this indicates that the
            // host element was used as a ViewContainerRef anchor (e.g. a `ViewContainerRef`
            // was injected within the component class). This case requires special handling.
            if (isLContainer(childLView)) {
                // Calculate the number of root nodes in all views in a given container
                // and increment by one to account for an anchor node itself, i.e. in this
                // scenario we'll have a layout that would look like this:
                // `<app-root /><#VIEW1><#VIEW2>...<!--container-->`
                // The `+1` is to capture the `<app-root />` element.
                numRootNodes = calcNumRootNodesInLContainer(childLView) + 1;
                annotateLContainerForHydration(childLView, context);
                const componentLView = unwrapLView(childLView[HOST]);
                serializedView = {
                    [TEMPLATE_ID]: componentLView[TVIEW].ssrId,
                    [NUM_ROOT_NODES]: numRootNodes,
                };
            }
        }
        if (!serializedView) {
            const childTView = childLView[TVIEW];
            if (childTView.type === 1 /* TViewType.Component */) {
                template = childTView.ssrId;
                // This is a component view, thus it has only 1 root node: the component
                // host node itself (other nodes would be inside that host node).
                numRootNodes = 1;
            }
            else {
                template = getSsrId(childTView);
                numRootNodes = calcNumRootNodes(childTView, childLView, childTView.firstChild);
            }
            serializedView = {
                [TEMPLATE_ID]: template,
                [NUM_ROOT_NODES]: numRootNodes,
            };
            let isHydrateNeverBlock = false;
            // If this is a defer block, serialize extra info.
            if (isDeferBlock(lView[TVIEW], tNode)) {
                const lDetails = getLDeferBlockDetails(lView, tNode);
                const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);
                if (context.isIncrementalHydrationEnabled && tDetails.hydrateTriggers !== null) {
                    const deferBlockId = `d${context.deferBlocks.size}`;
                    if (tDetails.hydrateTriggers.has(7 /* DeferBlockTrigger.Never */)) {
                        isHydrateNeverBlock = true;
                    }
                    let rootNodes = [];
                    collectNativeNodesInLContainer(lContainer, rootNodes);
                    // Add defer block into info context.deferBlocks
                    const deferBlockInfo = {
                        [NUM_ROOT_NODES]: rootNodes.length,
                        [DEFER_BLOCK_STATE$1]: lDetails[DEFER_BLOCK_STATE],
                    };
                    const serializedTriggers = serializeHydrateTriggers(tDetails.hydrateTriggers);
                    if (serializedTriggers.length > 0) {
                        deferBlockInfo[DEFER_HYDRATE_TRIGGERS] = serializedTriggers;
                    }
                    if (parentDeferBlockId !== null) {
                        // Serialize parent id only when it's present.
                        deferBlockInfo[DEFER_PARENT_BLOCK_ID] = parentDeferBlockId;
                    }
                    context.deferBlocks.set(deferBlockId, deferBlockInfo);
                    const node = unwrapRNode(lContainer);
                    if (node !== undefined) {
                        if (node.nodeType === Node.COMMENT_NODE) {
                            annotateDeferBlockAnchorForHydration(node, deferBlockId);
                        }
                    }
                    else {
                        ngDevMode && validateNodeExists(node, childLView, tNode);
                        ngDevMode &&
                            validateMatchingNode(node, Node.COMMENT_NODE, null, childLView, tNode, true);
                        annotateDeferBlockAnchorForHydration(node, deferBlockId);
                    }
                    if (!isHydrateNeverBlock) {
                        // Add JSAction attributes for root nodes that use some hydration triggers
                        annotateDeferBlockRootNodesWithJsAction(tDetails, rootNodes, deferBlockId, context);
                    }
                    // Use current block id as parent for nested routes.
                    parentDeferBlockId = deferBlockId;
                    // Serialize extra info into the view object.
                    // TODO(incremental-hydration): this should be serialized and included at a different level
                    // (not at the view level).
                    serializedView[DEFER_BLOCK_ID] = deferBlockId;
                }
                // DEFER_BLOCK_STATE is used for reconciliation in hydration, both regular and incremental.
                // We need to know which template is rendered when hydrating. So we serialize this state
                // regardless of hydration type.
                serializedView[DEFER_BLOCK_STATE$1] = lDetails[DEFER_BLOCK_STATE];
            }
            if (!isHydrateNeverBlock) {
                Object.assign(serializedView, serializeLView(lContainer[i], parentDeferBlockId, context));
            }
        }
        // Check if the previous view has the same shape (for example, it was
        // produced by the *ngFor), in which case bump the counter on the previous
        // view instead of including the same information again.
        const currentViewAsString = JSON.stringify(serializedView);
        if (views.length > 0 && currentViewAsString === lastViewAsString) {
            const previousView = views[views.length - 1];
            previousView[MULTIPLIER] ??= 1;
            previousView[MULTIPLIER]++;
        }
        else {
            // Record this view as most recently added.
            lastViewAsString = currentViewAsString;
            views.push(serializedView);
        }
    }
    return views;
}
function serializeHydrateTriggers(triggerMap) {
    const serializableDeferBlockTrigger = new Set([
        0 /* DeferBlockTrigger.Idle */,
        1 /* DeferBlockTrigger.Immediate */,
        2 /* DeferBlockTrigger.Viewport */,
        5 /* DeferBlockTrigger.Timer */,
    ]);
    let triggers = [];
    for (let [trigger, details] of triggerMap) {
        if (serializableDeferBlockTrigger.has(trigger)) {
            if (details === null) {
                triggers.push(trigger);
            }
            else {
                triggers.push({ trigger, delay: details.delay });
            }
        }
    }
    return triggers;
}
/**
 * Helper function to produce a node path (which navigation steps runtime logic
 * needs to take to locate a node) and stores it in the `NODES` section of the
 * current serialized view.
 */
function appendSerializedNodePath(ngh, tNode, lView, excludedParentNodes) {
    const noOffsetIndex = tNode.index - HEADER_OFFSET;
    ngh[NODES] ??= {};
    // Ensure we don't calculate the path multiple times.
    ngh[NODES][noOffsetIndex] ??= calcPathForNode(tNode, lView, excludedParentNodes);
}
/**
 * Helper function to append information about a disconnected node.
 * This info is needed at runtime to avoid DOM lookups for this element
 * and instead, the element would be created from scratch.
 */
function appendDisconnectedNodeIndex(ngh, tNodeOrNoOffsetIndex) {
    const noOffsetIndex = typeof tNodeOrNoOffsetIndex === 'number'
        ? tNodeOrNoOffsetIndex
        : tNodeOrNoOffsetIndex.index - HEADER_OFFSET;
    ngh[DISCONNECTED_NODES] ??= [];
    if (!ngh[DISCONNECTED_NODES].includes(noOffsetIndex)) {
        ngh[DISCONNECTED_NODES].push(noOffsetIndex);
    }
}
/**
 * Serializes the lView data into a SerializedView object that will later be added
 * to the TransferState storage and referenced using the `ngh` attribute on a host
 * element.
 *
 * @param lView the lView we are serializing
 * @param context the hydration context
 * @returns the `SerializedView` object containing the data to be added to the host node
 */
function serializeLView(lView, parentDeferBlockId = null, context) {
    const ngh = {};
    const tView = lView[TVIEW];
    const i18nChildren = getOrComputeI18nChildren(tView, context);
    const nativeElementsToEventTypes = context.shouldReplayEvents
        ? collectDomEventsInfo(tView, lView, context.eventTypesToReplay)
        : null;
    // Iterate over DOM element references in an LView.
    for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
        const tNode = tView.data[i];
        const noOffsetIndex = i - HEADER_OFFSET;
        // Attempt to serialize any i18n data for the given slot. We do this first, as i18n
        // has its own process for serialization.
        const i18nData = trySerializeI18nBlock(lView, i, context);
        if (i18nData) {
            ngh[I18N_DATA] ??= {};
            ngh[I18N_DATA][noOffsetIndex] = i18nData.caseQueue;
            for (const nodeNoOffsetIndex of i18nData.disconnectedNodes) {
                appendDisconnectedNodeIndex(ngh, nodeNoOffsetIndex);
            }
            for (const nodeNoOffsetIndex of i18nData.disjointNodes) {
                const tNode = tView.data[nodeNoOffsetIndex + HEADER_OFFSET];
                ngDevMode && assertTNode(tNode);
                appendSerializedNodePath(ngh, tNode, lView, i18nChildren);
            }
            continue;
        }
        // Skip processing of a given slot in the following cases:
        // - Local refs (e.g. <div #localRef>) take up an extra slot in LViews
        //   to store the same element. In this case, there is no information in
        //   a corresponding slot in TNode data structure.
        // - When a slot contains something other than a TNode. For example, there
        //   might be some metadata information about a defer block or a control flow block.
        if (!isTNodeShape(tNode)) {
            continue;
        }
        // Skip any nodes that are in an i18n block but are considered detached (i.e. not
        // present in the template). These nodes are disconnected from the DOM tree, and
        // so we don't want to serialize any information about them.
        if (isDetachedByI18n(tNode)) {
            continue;
        }
        // Check if a native node that represents a given TNode is disconnected from the DOM tree.
        // Such nodes must be excluded from the hydration (since the hydration won't be able to
        // find them), so the TNode ids are collected and used at runtime to skip the hydration.
        //
        // This situation may happen during the content projection, when some nodes don't make it
        // into one of the content projection slots (for example, when there is no default
        // <ng-content /> slot in projector component's template).
        if (isDisconnectedNode(tNode, lView) && isContentProjectedNode(tNode)) {
            appendDisconnectedNodeIndex(ngh, tNode);
            continue;
        }
        if (Array.isArray(tNode.projection)) {
            for (const projectionHeadTNode of tNode.projection) {
                // We may have `null`s in slots with no projected content.
                if (!projectionHeadTNode)
                    continue;
                if (!Array.isArray(projectionHeadTNode)) {
                    // If we process re-projected content (i.e. `<ng-content>`
                    // appears at projection location), skip annotations for this content
                    // since all DOM nodes in this projection were handled while processing
                    // a parent lView, which contains those nodes.
                    if (!isProjectionTNode(projectionHeadTNode) &&
                        !isInSkipHydrationBlock(projectionHeadTNode)) {
                        if (isDisconnectedNode(projectionHeadTNode, lView)) {
                            // Check whether this node is connected, since we may have a TNode
                            // in the data structure as a projection segment head, but the
                            // content projection slot might be disabled (e.g.
                            // <ng-content *ngIf="false" />).
                            appendDisconnectedNodeIndex(ngh, projectionHeadTNode);
                        }
                        else {
                            appendSerializedNodePath(ngh, projectionHeadTNode, lView, i18nChildren);
                        }
                    }
                }
                else {
                    // If a value is an array, it means that we are processing a projection
                    // where projectable nodes were passed in as DOM nodes (for example, when
                    // calling `ViewContainerRef.createComponent(CmpA, {projectableNodes: [...]})`).
                    //
                    // In this scenario, nodes can come from anywhere (either created manually,
                    // accessed via `document.querySelector`, etc) and may be in any state
                    // (attached or detached from the DOM tree). As a result, we can not reliably
                    // restore the state for such cases during hydration.
                    throw unsupportedProjectionOfDomNodes(unwrapRNode(lView[i]));
                }
            }
        }
        conditionallyAnnotateNodePath(ngh, tNode, lView, i18nChildren);
        if (isLContainer(lView[i])) {
            // Serialize information about a template.
            const embeddedTView = tNode.tView;
            if (embeddedTView !== null) {
                ngh[TEMPLATES] ??= {};
                ngh[TEMPLATES][noOffsetIndex] = getSsrId(embeddedTView);
            }
            // Serialize views within this LContainer.
            const hostNode = lView[i][HOST]; // host node of this container
            // LView[i][HOST] can be of 2 different types:
            // - either a DOM node
            // - or an array that represents an LView of a component
            if (Array.isArray(hostNode)) {
                // This is a component, serialize info about it.
                const targetNode = unwrapRNode(hostNode);
                if (!targetNode.hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {
                    annotateHostElementForHydration(targetNode, hostNode, parentDeferBlockId, context);
                }
            }
            ngh[CONTAINERS] ??= {};
            ngh[CONTAINERS][noOffsetIndex] = serializeLContainer(lView[i], tNode, lView, parentDeferBlockId, context);
        }
        else if (Array.isArray(lView[i]) && !isLetDeclaration(tNode)) {
            // This is a component, annotate the host node with an `ngh` attribute.
            // Note: Let declarations that return an array are also storing an array in the LView,
            // we need to exclude them.
            const targetNode = unwrapRNode(lView[i][HOST]);
            if (!targetNode.hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {
                annotateHostElementForHydration(targetNode, lView[i], parentDeferBlockId, context);
            }
        }
        else {
            // <ng-container> case
            if (tNode.type & 8 /* TNodeType.ElementContainer */) {
                // An <ng-container> is represented by the number of
                // top-level nodes. This information is needed to skip over
                // those nodes to reach a corresponding anchor node (comment node).
                ngh[ELEMENT_CONTAINERS] ??= {};
                ngh[ELEMENT_CONTAINERS][noOffsetIndex] = calcNumRootNodes(tView, lView, tNode.child);
            }
            else if (tNode.type & (16 /* TNodeType.Projection */ | 128 /* TNodeType.LetDeclaration */)) {
                // Current TNode represents an `<ng-content>` slot or `@let` declaration,
                // thus it has no DOM elements associated with it, so the **next sibling**
                // node would not be able to find an anchor. In this case, use full path instead.
                let nextTNode = tNode.next;
                // Skip over all `<ng-content>` slots and `@let` declarations in a row.
                while (nextTNode !== null &&
                    nextTNode.type & (16 /* TNodeType.Projection */ | 128 /* TNodeType.LetDeclaration */)) {
                    nextTNode = nextTNode.next;
                }
                if (nextTNode && !isInSkipHydrationBlock(nextTNode)) {
                    // Handle a tNode after the `<ng-content>` slot.
                    appendSerializedNodePath(ngh, nextTNode, lView, i18nChildren);
                }
            }
            else if (tNode.type & 1 /* TNodeType.Text */) {
                const rNode = unwrapRNode(lView[i]);
                processTextNodeBeforeSerialization(context, rNode);
            }
        }
        // Attach `jsaction` attribute to elements that have registered listeners,
        // thus potentially having a need to do an event replay.
        if (nativeElementsToEventTypes && tNode.type & 2 /* TNodeType.Element */) {
            const nativeElement = unwrapRNode(lView[i]);
            if (nativeElementsToEventTypes.has(nativeElement)) {
                setJSActionAttributes(nativeElement, nativeElementsToEventTypes.get(nativeElement), parentDeferBlockId);
            }
        }
    }
    return ngh;
}
/**
 * Serializes node location in cases when it's needed, specifically:
 *
 *  1. If `tNode.projectionNext` is different from `tNode.next` - it means that
 *     the next `tNode` after projection is different from the one in the original
 *     template. Since hydration relies on `tNode.next`, this serialized info
 *     is required to help runtime code find the node at the correct location.
 *  2. In certain content projection-based use-cases, it's possible that only
 *     a content of a projected element is rendered. In this case, content nodes
 *     require an extra annotation, since runtime logic can't rely on parent-child
 *     connection to identify the location of a node.
 */
function conditionallyAnnotateNodePath(ngh, tNode, lView, excludedParentNodes) {
    if (isProjectionTNode(tNode)) {
        // Do not annotate projection nodes (<ng-content />), since
        // they don't have a corresponding DOM node representing them.
        return;
    }
    // Handle case #1 described above.
    if (tNode.projectionNext &&
        tNode.projectionNext !== tNode.next &&
        !isInSkipHydrationBlock(tNode.projectionNext)) {
        appendSerializedNodePath(ngh, tNode.projectionNext, lView, excludedParentNodes);
    }
    // Handle case #2 described above.
    // Note: we only do that for the first node (i.e. when `tNode.prev === null`),
    // the rest of the nodes would rely on the current node location, so no extra
    // annotation is needed.
    if (tNode.prev === null &&
        tNode.parent !== null &&
        isDisconnectedNode(tNode.parent, lView) &&
        !isDisconnectedNode(tNode, lView)) {
        appendSerializedNodePath(ngh, tNode, lView, excludedParentNodes);
    }
}
/**
 * Determines whether a component instance that is represented
 * by a given LView uses `ViewEncapsulation.ShadowDom`.
 */
function componentUsesShadowDomEncapsulation(lView) {
    const instance = lView[CONTEXT];
    return instance?.constructor
        ? getComponentDef(instance.constructor)?.encapsulation === ViewEncapsulation.ShadowDom
        : false;
}
/**
 * Annotates component host element for hydration:
 * - by either adding the `ngh` attribute and collecting hydration-related info
 *   for the serialization and transferring to the client
 * - or by adding the `ngSkipHydration` attribute in case Angular detects that
 *   component contents is not compatible with hydration.
 *
 * @param element The Host element to be annotated
 * @param lView The associated LView
 * @param context The hydration context
 * @returns An index of serialized view from the transfer state object
 *          or `null` when a given component can not be serialized.
 */
function annotateHostElementForHydration(element, lView, parentDeferBlockId, context) {
    const renderer = lView[RENDERER];
    if ((hasI18n(lView) && !isI18nHydrationSupportEnabled()) ||
        componentUsesShadowDomEncapsulation(lView)) {
        // Attach the skip hydration attribute if this component:
        // - either has i18n blocks, since hydrating such blocks is not yet supported
        // - or uses ShadowDom view encapsulation, since Domino doesn't support
        //   shadow DOM, so we can not guarantee that client and server representations
        //   would exactly match
        renderer.setAttribute(element, SKIP_HYDRATION_ATTR_NAME, '');
        return null;
    }
    else {
        const ngh = serializeLView(lView, parentDeferBlockId, context);
        const index = context.serializedViewCollection.add(ngh);
        renderer.setAttribute(element, NGH_ATTR_NAME, index.toString());
        return index;
    }
}
/**
 * Annotates defer block comment node for hydration:
 *
 * @param comment The Host element to be annotated
 * @param deferBlockId the id of the target defer block
 */
function annotateDeferBlockAnchorForHydration(comment, deferBlockId) {
    comment.textContent = `ngh=${deferBlockId}`;
}
/**
 * Physically inserts the comment nodes to ensure empty text nodes and adjacent
 * text node separators are preserved after server serialization of the DOM.
 * These get swapped back for empty text nodes or separators once hydration happens
 * on the client.
 *
 * @param corruptedTextNodes The Map of text nodes to be replaced with comments
 * @param doc The document
 */
function insertCorruptedTextNodeMarkers(corruptedTextNodes, doc) {
    for (const [textNode, marker] of corruptedTextNodes) {
        textNode.after(doc.createComment(marker));
    }
}
/**
 * Detects whether a given TNode represents a node that
 * is being content projected.
 */
function isContentProjectedNode(tNode) {
    let currentTNode = tNode;
    while (currentTNode != null) {
        // If we come across a component host node in parent nodes -
        // this TNode is in the content projection section.
        if (isComponentHost(currentTNode)) {
            return true;
        }
        currentTNode = currentTNode.parent;
    }
    return false;
}
/**
 * Incremental hydration requires that any defer block root node
 * with interaction or hover triggers have all of their root nodes
 * trigger hydration with those events. So we need to make sure all
 * the root nodes of that block have the proper jsaction attribute
 * to ensure hydration is triggered, since the content is dehydrated
 */
function annotateDeferBlockRootNodesWithJsAction(tDetails, rootNodes, parentDeferBlockId, context) {
    const actionList = convertHydrateTriggersToJsAction(tDetails.hydrateTriggers);
    for (let et of actionList) {
        context.eventTypesToReplay.regular.add(et);
    }
    if (actionList.length > 0) {
        const elementNodes = rootNodes.filter((rn) => rn.nodeType === Node.ELEMENT_NODE);
        for (let rNode of elementNodes) {
            setJSActionAttributes(rNode, actionList, parentDeferBlockId);
        }
    }
}

/**
 * Indicates whether the hydration-related code was added,
 * prevents adding it multiple times.
 */
let isHydrationSupportEnabled = false;
/**
 * Indicates whether the i18n-re   lated code was added,
 * prevents adding it multiple times.
 *
 * Note: This merely controls whether the code is loaded,
 * while `setIsI18nHydrationSupportEnabled` determines
 * whether i18n blocks are serialized or hydrated.
 */
let isI18nHydrationRuntimeSupportEnabled = false;
/**
 * Indicates whether the incremental hydration code was added,
 * prevents adding it multiple times.
 */
let isIncrementalHydrationRuntimeSupportEnabled = false;
/**
 * Defines a period of time that Angular waits for the `ApplicationRef.isStable` to emit `true`.
 * If there was no event with the `true` value during this time, Angular reports a warning.
 */
const APPLICATION_IS_STABLE_TIMEOUT = 10_000;
/**
 * Brings the necessary hydration code in tree-shakable manner.
 * The code is only present when the `provideClientHydration` is
 * invoked. Otherwise, this code is tree-shaken away during the
 * build optimization step.
 *
 * This technique allows us to swap implementations of methods so
 * tree shaking works appropriately when hydration is disabled or
 * enabled. It brings in the appropriate version of the method that
 * supports hydration only when enabled.
 */
function enableHydrationRuntimeSupport() {
    if (!isHydrationSupportEnabled) {
        isHydrationSupportEnabled = true;
        enableRetrieveHydrationInfoImpl();
        enableLocateOrCreateElementNodeImpl();
        enableLocateOrCreateTextNodeImpl();
        enableLocateOrCreateElementContainerNodeImpl();
        enableLocateOrCreateContainerAnchorImpl();
        enableLocateOrCreateContainerRefImpl();
        enableFindMatchingDehydratedViewImpl();
        enableApplyRootElementTransformImpl();
    }
}
/**
 * Brings the necessary i18n hydration code in tree-shakable manner.
 * Similar to `enableHydrationRuntimeSupport`, the code is only
 * present when `withI18nSupport` is invoked.
 */
function enableI18nHydrationRuntimeSupport() {
    if (!isI18nHydrationRuntimeSupportEnabled) {
        isI18nHydrationRuntimeSupportEnabled = true;
        enableLocateOrCreateI18nNodeImpl();
        enablePrepareI18nBlockForHydrationImpl();
        enableClaimDehydratedIcuCaseImpl();
    }
}
/**
 * Brings the necessary incremental hydration code in tree-shakable manner.
 * Similar to `enableHydrationRuntimeSupport`, the code is only
 * present when `enableIncrementalHydrationRuntimeSupport` is invoked.
 */
function enableIncrementalHydrationRuntimeSupport() {
    if (!isIncrementalHydrationRuntimeSupportEnabled) {
        isIncrementalHydrationRuntimeSupportEnabled = true;
        enableRetrieveDeferBlockDataImpl();
    }
}
/**
 * Outputs a message with hydration stats into a console.
 */
function printHydrationStats(injector) {
    const console = injector.get(Console);
    const message = `Angular hydrated ${ngDevMode.hydratedComponents} component(s) ` +
        `and ${ngDevMode.hydratedNodes} node(s), ` +
        `${ngDevMode.componentsSkippedHydration} component(s) were skipped. ` +
        (isIncrementalHydrationEnabled(injector)
            ? `${ngDevMode.deferBlocksWithIncrementalHydration} defer block(s) were configured to use incremental hydration. `
            : '') +
        `Learn more at https://angular.dev/guide/hydration.`;
    // tslint:disable-next-line:no-console
    console.log(message);
}
/**
 * Returns a Promise that is resolved when an application becomes stable.
 */
function whenStableWithTimeout(appRef) {
    const whenStablePromise = appRef.whenStable();
    if (typeof ngDevMode !== 'undefined' && ngDevMode) {
        const timeoutTime = APPLICATION_IS_STABLE_TIMEOUT;
        const console = appRef.injector.get(Console);
        const ngZone = appRef.injector.get(NgZone);
        // The following call should not and does not prevent the app to become stable
        // We cannot use RxJS timer here because the app would remain unstable.
        // This also avoids an extra change detection cycle.
        const timeoutId = ngZone.runOutsideAngular(() => {
            return setTimeout(() => logWarningOnStableTimedout(timeoutTime, console), timeoutTime);
        });
        whenStablePromise.finally(() => clearTimeout(timeoutId));
    }
    return whenStablePromise;
}
/**
 * Defines a name of an attribute that is added to the <body> tag
 * in the `index.html` file in case a given route was configured
 * with `RenderMode.Client`. 'cm' is an abbreviation for "Client Mode".
 */
const CLIENT_RENDER_MODE_FLAG = 'ngcm';
/**
 * Checks whether the `RenderMode.Client` was defined for the current route.
 */
function isClientRenderModeEnabled() {
    const doc = getDocument();
    return ((typeof ngServerMode === 'undefined' || !ngServerMode) &&
        doc.body.hasAttribute(CLIENT_RENDER_MODE_FLAG));
}
/**
 * Returns a set of providers required to setup hydration support
 * for an application that is server side rendered. This function is
 * included into the `provideClientHydration` public API function from
 * the `platform-browser` package.
 *
 * The function sets up an internal flag that would be recognized during
 * the server side rendering time as well, so there is no need to
 * configure or change anything in NgUniversal to enable the feature.
 */
function withDomHydration() {
    const providers = [
        {
            provide: IS_HYDRATION_DOM_REUSE_ENABLED,
            useFactory: () => {
                let isEnabled = true;
                if (typeof ngServerMode === 'undefined' || !ngServerMode) {
                    // On the client, verify that the server response contains
                    // hydration annotations. Otherwise, keep hydration disabled.
                    const transferState = inject(TransferState, { optional: true });
                    isEnabled = !!transferState?.get(NGH_DATA_KEY, null);
                }
                if (isEnabled) {
                    performanceMarkFeature('NgHydration');
                }
                return isEnabled;
            },
        },
        {
            provide: ENVIRONMENT_INITIALIZER,
            useValue: () => {
                // i18n support is enabled by calling withI18nSupport(), but there's
                // no way to turn it off (e.g. for tests), so we turn it off by default.
                setIsI18nHydrationSupportEnabled(false);
                if (typeof ngServerMode !== 'undefined' && ngServerMode) {
                    // Since this function is used across both server and client,
                    // make sure that the runtime code is only added when invoked
                    // on the client (see the `enableHydrationRuntimeSupport` function
                    // call below).
                    return;
                }
                if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {
                    verifySsrContentsIntegrity(getDocument());
                    enableHydrationRuntimeSupport();
                }
                else if (typeof ngDevMode !== 'undefined' && ngDevMode && !isClientRenderModeEnabled()) {
                    const console = inject(Console);
                    const message = formatRuntimeError(-505 /* RuntimeErrorCode.MISSING_HYDRATION_ANNOTATIONS */, 'Angular hydration was requested on the client, but there was no ' +
                        'serialized information present in the server response, ' +
                        'thus hydration was not enabled. ' +
                        'Make sure the `provideClientHydration()` is included into the list ' +
                        'of providers in the server part of the application configuration.');
                    console.warn(message);
                }
            },
            multi: true,
        },
    ];
    if (typeof ngServerMode === 'undefined' || !ngServerMode) {
        providers.push({
            provide: PRESERVE_HOST_CONTENT,
            useFactory: () => {
                // Preserve host element content only in a browser
                // environment and when hydration is configured properly.
                // On a server, an application is rendered from scratch,
                // so the host content needs to be empty.
                return inject(IS_HYDRATION_DOM_REUSE_ENABLED);
            },
        }, {
            provide: APP_BOOTSTRAP_LISTENER,
            useFactory: () => {
                if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {
                    const appRef = inject(ApplicationRef);
                    return () => {
                        // Wait until an app becomes stable and cleanup all views that
                        // were not claimed during the application bootstrap process.
                        // The timing is similar to when we start the serialization process
                        // on the server.
                        //
                        // Note: the cleanup task *MUST* be scheduled within the Angular zone in Zone apps
                        // to ensure that change detection is properly run afterward.
                        whenStableWithTimeout(appRef).then(() => {
                            // Note: we have to check whether the application is destroyed before
                            // performing other operations with the `injector`.
                            // The application may be destroyed **before** it becomes stable, so when
                            // the `whenStableWithTimeout` resolves, the injector might already be in
                            // a destroyed state. Thus, calling `injector.get` would throw an error
                            // indicating that the injector has already been destroyed.
                            if (appRef.destroyed) {
                                return;
                            }
                            cleanupDehydratedViews(appRef);
                            if (typeof ngDevMode !== 'undefined' && ngDevMode) {
                                countBlocksSkippedByHydration(appRef.injector);
                                printHydrationStats(appRef.injector);
                            }
                        });
                    };
                }
                return () => { }; // noop
            },
            multi: true,
        });
    }
    return makeEnvironmentProviders(providers);
}
/**
 * Returns a set of providers required to setup support for i18n hydration.
 * Requires hydration to be enabled separately.
 */
function withI18nSupport() {
    return [
        {
            provide: IS_I18N_HYDRATION_ENABLED,
            useFactory: () => inject(IS_HYDRATION_DOM_REUSE_ENABLED),
        },
        {
            provide: ENVIRONMENT_INITIALIZER,
            useValue: () => {
                if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {
                    enableI18nHydrationRuntimeSupport();
                    setIsI18nHydrationSupportEnabled(true);
                    performanceMarkFeature('NgI18nHydration');
                }
            },
            multi: true,
        },
    ];
}
/**
 * Returns a set of providers required to setup support for incremental hydration.
 * Requires hydration to be enabled separately.
 * Enabling incremental hydration also enables event replay for the entire app.
 *
 * @developerPreview
 */
function withIncrementalHydration() {
    const providers = [
        withEventReplay(),
        {
            provide: IS_INCREMENTAL_HYDRATION_ENABLED,
            useValue: true,
        },
        {
            provide: DEHYDRATED_BLOCK_REGISTRY,
            useClass: DehydratedBlockRegistry,
        },
        {
            provide: ENVIRONMENT_INITIALIZER,
            useValue: () => {
                enableIncrementalHydrationRuntimeSupport();
                performanceMarkFeature('NgIncrementalHydration');
            },
            multi: true,
        },
    ];
    if (typeof ngServerMode === 'undefined' || !ngServerMode) {
        providers.push({
            provide: APP_BOOTSTRAP_LISTENER,
            useFactory: () => {
                const injector = inject(Injector);
                const doc = getDocument();
                return () => {
                    const deferBlockData = processBlockData(injector);
                    const commentsByBlockId = gatherDeferBlocksCommentNodes(doc, doc.body);
                    processAndInitTriggers(injector, deferBlockData, commentsByBlockId);
                    appendDeferBlocksToJSActionMap(doc, injector);
                };
            },
            multi: true,
        });
    }
    return providers;
}
/**
 *
 * @param time The time in ms until the stable timedout warning message is logged
 */
function logWarningOnStableTimedout(time, console) {
    const message = `Angular hydration expected the ApplicationRef.isStable() to emit \`true\`, but it ` +
        `didn't happen within ${time}ms. Angular hydration logic depends on the application becoming stable ` +
        `as a signal to complete hydration process.`;
    console.warn(formatRuntimeError(-506 /* RuntimeErrorCode.HYDRATION_STABLE_TIMEDOUT */, message));
}

/**
 * Transforms a value (typically a string) to a boolean.
 * Intended to be used as a transform function of an input.
 *
 *  @usageNotes
 *  ```ts
 *  @Input({ transform: booleanAttribute }) status!: boolean;
 *  ```
 * @param value Value to be transformed.
 *
 * @publicApi
 */
function booleanAttribute(value) {
    return typeof value === 'boolean' ? value : value != null && value !== 'false';
}
/**
 * Transforms a value (typically a string) to a number.
 * Intended to be used as a transform function of an input.
 * @param value Value to be transformed.
 * @param fallbackValue Value to use if the provided value can't be parsed as a number.
 *
 *  @usageNotes
 *  ```ts
 *  @Input({ transform: numberAttribute }) id!: number;
 *  ```
 *
 * @publicApi
 */
function numberAttribute(value, fallbackValue = NaN) {
    // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,
    // and other non-number values as NaN, where Number just uses 0) but it considers the string
    // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.
    const isNumberValue = !isNaN(parseFloat(value)) && !isNaN(Number(value));
    return isNumberValue ? Number(value) : fallbackValue;
}

const PERFORMANCE_MARK_PREFIX = '🅰️';
let enablePerfLogging = false;
/**
 * Function that will start measuring against the performance API
 * Should be used in pair with stopMeasuring
 */
function startMeasuring(label) {
    if (!enablePerfLogging) {
        return;
    }
    const { startLabel } = labels(label);
    /* tslint:disable:ban */
    performance.mark(startLabel);
    /* tslint:enable:ban */
}
/**
 * Function that will stop measuring against the performance API
 * Should be used in pair with stopMeasuring
 */
function stopMeasuring(label) {
    if (!enablePerfLogging) {
        return;
    }
    const { startLabel, labelName, endLabel } = labels(label);
    /* tslint:disable:ban */
    performance.mark(endLabel);
    performance.measure(labelName, startLabel, endLabel);
    performance.clearMarks(startLabel);
    performance.clearMarks(endLabel);
    /* tslint:enable:ban */
}
function labels(label) {
    const labelName = `${PERFORMANCE_MARK_PREFIX}:${label}`;
    return {
        labelName,
        startLabel: `start:${labelName}`,
        endLabel: `end:${labelName}`,
    };
}
let warningLogged = false;
/**
 * This enables an internal performance profiler
 *
 * It should not be imported in application code
 */
function enableProfiling() {
    if (!warningLogged &&
        (typeof performance === 'undefined' || !performance.mark || !performance.measure)) {
        warningLogged = true;
        console.warn('Performance API is not supported on this platform');
        return;
    }
    enablePerfLogging = true;
}
function disableProfiling() {
    enablePerfLogging = false;
}

/**
 * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
 * can, optionally, return a value.
 */
function untracked(nonReactiveReadsFn) {
    return untracked$1(nonReactiveReadsFn);
}

/**
 * Create a computed `Signal` which derives a reactive value from an expression.
 */
function computed(computation, options) {
    const getter = createComputed(computation, options?.equal);
    if (ngDevMode) {
        getter.toString = () => `[Computed: ${getter()}]`;
        getter[SIGNAL].debugName = options?.debugName;
    }
    return getter;
}

class MicrotaskEffectScheduler extends ZoneAwareEffectScheduler {
    pendingTasks = inject(PendingTasksInternal);
    taskId = null;
    schedule(effect) {
        // Check whether there are any pending effects _before_ queueing in the base class.
        super.schedule(effect);
        if (this.taskId === null) {
            this.taskId = this.pendingTasks.add();
            queueMicrotask(() => this.flush());
        }
    }
    flush() {
        try {
            super.flush();
        }
        finally {
            if (this.taskId !== null) {
                this.pendingTasks.remove(this.taskId);
                this.taskId = null;
            }
        }
    }
    /** @nocollapse */
    static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({
        token: MicrotaskEffectScheduler,
        providedIn: 'root',
        factory: () => new MicrotaskEffectScheduler(),
    });
}
/**
 * Core reactive node for an Angular effect.
 *
 * `EffectHandle` combines the reactive graph's `Watch` base node for effects with the framework's
 * scheduling abstraction (`MicrotaskEffectScheduler`) as well as automatic cleanup via `DestroyRef`
 * if available/requested.
 */
class EffectHandle {
    scheduler;
    effectFn;
    zone;
    injector;
    unregisterOnDestroy;
    watcher;
    constructor(scheduler, effectFn, zone, destroyRef, injector, allowSignalWrites) {
        this.scheduler = scheduler;
        this.effectFn = effectFn;
        this.zone = zone;
        this.injector = injector;
        this.watcher = createWatch((onCleanup) => this.runEffect(onCleanup), () => this.schedule(), allowSignalWrites);
        this.unregisterOnDestroy = destroyRef?.onDestroy(() => this.destroy());
    }
    runEffect(onCleanup) {
        try {
            this.effectFn(onCleanup);
        }
        catch (err) {
            // Inject the `ErrorHandler` here in order to avoid circular DI error
            // if the effect is used inside of a custom `ErrorHandler`.
            const errorHandler = this.injector.get(ErrorHandler, null, { optional: true });
            errorHandler?.handleError(err);
        }
    }
    run() {
        this.watcher.run();
    }
    schedule() {
        this.scheduler.schedule(this);
    }
    destroy() {
        this.watcher.destroy();
        this.unregisterOnDestroy?.();
        // Note: if the effect is currently scheduled, it's not un-scheduled, and so the scheduler will
        // retain a reference to it. Attempting to execute it will be a no-op.
    }
}
// Just used for the name for the debug error below.
function effect$1() { }
/**
 * Create a global `Effect` for the given reactive function.
 */
function microtaskEffect(effectFn, options) {
    ngDevMode &&
        assertNotInReactiveContext(effect$1, 'Call `effect` outside of a reactive context. For example, schedule the ' +
            'effect inside the component constructor.');
    !options?.injector && assertInInjectionContext(effect$1);
    const injector = options?.injector ?? inject(Injector);
    const destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;
    const handle = new EffectHandle(injector.get(MicrotaskEffectScheduler), effectFn, typeof Zone === 'undefined' ? null : Zone.current, destroyRef, injector, options?.allowSignalWrites ?? false);
    // Effects need to be marked dirty manually to trigger their initial run. The timing of this
    // marking matters, because the effects may read signals that track component inputs, which are
    // only available after those components have had their first update pass.
    //
    // We inject `ChangeDetectorRef` optionally, to determine whether this effect is being created in
    // the context of a component or not. If it is, then we check whether the component has already
    // run its update pass, and defer the effect's initial scheduling until the update pass if it
    // hasn't already run.
    const cdr = injector.get(ChangeDetectorRef, null, { optional: true });
    if (!cdr || !(cdr._lView[FLAGS] & 8 /* LViewFlags.FirstLViewPass */)) {
        // This effect is either not running in a view injector, or the view has already
        // undergone its first change detection pass, which is necessary for any required inputs to be
        // set.
        handle.watcher.notify();
    }
    else {
        // Delay the initialization of the effect until the view is fully initialized.
        (cdr._lView[EFFECTS_TO_SCHEDULE] ??= []).push(handle.watcher.notify);
    }
    return handle;
}

class EffectRefImpl {
    [SIGNAL];
    constructor(node) {
        this[SIGNAL] = node;
    }
    destroy() {
        this[SIGNAL].destroy();
    }
}
/**
 * Registers an "effect" that will be scheduled & executed whenever the signals that it reads
 * changes.
 *
 * Angular has two different kinds of effect: component effects and root effects. Component effects
 * are created when `effect()` is called from a component, directive, or within a service of a
 * component/directive. Root effects are created when `effect()` is called from outside the
 * component tree, such as in a root service, or when the `forceRoot` option is provided.
 *
 * The two effect types differ in their timing. Component effects run as a component lifecycle
 * event during Angular's synchronization (change detection) process, and can safely read input
 * signals or create/destroy views that depend on component state. Root effects run as microtasks
 * and have no connection to the component tree or change detection.
 *
 * `effect()` must be run in injection context, unless the `injector` option is manually specified.
 *
 * @developerPreview
 */
function effect(effectFn, options) {
    ngDevMode &&
        assertNotInReactiveContext(effect, 'Call `effect` outside of a reactive context. For example, schedule the ' +
            'effect inside the component constructor.');
    !options?.injector && assertInInjectionContext(effect);
    if (ngDevMode && options?.allowSignalWrites !== undefined) {
        console.warn(`The 'allowSignalWrites' flag is deprecated and no longer impacts effect() (writes are always allowed)`);
    }
    const injector = options?.injector ?? inject(Injector);
    let destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;
    let node;
    const viewContext = injector.get(ViewContext, null, { optional: true });
    const notifier = injector.get(ChangeDetectionScheduler);
    if (viewContext !== null && !options?.forceRoot) {
        // This effect was created in the context of a view, and will be associated with the view.
        node = createViewEffect(viewContext.view, notifier, effectFn);
        if (destroyRef instanceof NodeInjectorDestroyRef && destroyRef._lView === viewContext.view) {
            // The effect is being created in the same view as the `DestroyRef` references, so it will be
            // automatically destroyed without the need for an explicit `DestroyRef` registration.
            destroyRef = null;
        }
    }
    else {
        // This effect was created outside the context of a view, and will be scheduled independently.
        node = createRootEffect(effectFn, injector.get(EffectScheduler), notifier);
    }
    node.injector = injector;
    if (destroyRef !== null) {
        // If we need to register for cleanup, do that here.
        node.onDestroyFn = destroyRef.onDestroy(() => node.destroy());
    }
    const effectRef = new EffectRefImpl(node);
    if (ngDevMode) {
        node.debugName = options?.debugName ?? '';
        const prevInjectorProfilerContext = setInjectorProfilerContext({ injector, token: null });
        try {
            emitEffectCreatedEvent(effectRef);
        }
        finally {
            setInjectorProfilerContext(prevInjectorProfilerContext);
        }
    }
    return effectRef;
}
const BASE_EFFECT_NODE = 
/* @__PURE__ */ (() => ({
    ...REACTIVE_NODE,
    consumerIsAlwaysLive: true,
    consumerAllowSignalWrites: true,
    dirty: true,
    hasRun: false,
    cleanupFns: undefined,
    zone: null,
    kind: 'effect',
    onDestroyFn: noop,
    run() {
        this.dirty = false;
        if (ngDevMode && isInNotificationPhase()) {
            throw new Error(`Schedulers cannot synchronously execute watches while scheduling.`);
        }
        if (this.hasRun && !consumerPollProducersForChange(this)) {
            return;
        }
        this.hasRun = true;
        const registerCleanupFn = (cleanupFn) => (this.cleanupFns ??= []).push(cleanupFn);
        const prevNode = consumerBeforeComputation(this);
        // We clear `setIsRefreshingViews` so that `markForCheck()` within the body of an effect will
        // cause CD to reach the component in question.
        const prevRefreshingViews = setIsRefreshingViews(false);
        try {
            this.maybeCleanup();
            this.fn(registerCleanupFn);
        }
        finally {
            setIsRefreshingViews(prevRefreshingViews);
            consumerAfterComputation(this, prevNode);
        }
    },
    maybeCleanup() {
        if (!this.cleanupFns?.length) {
            return;
        }
        try {
            // Attempt to run the cleanup functions. Regardless of failure or success, we consider
            // cleanup "completed" and clear the list for the next run of the effect. Note that an error
            // from the cleanup function will still crash the current run of the effect.
            while (this.cleanupFns.length) {
                this.cleanupFns.pop()();
            }
        }
        finally {
            this.cleanupFns = [];
        }
    },
}))();
const ROOT_EFFECT_NODE = 
/* @__PURE__ */ (() => ({
    ...BASE_EFFECT_NODE,
    consumerMarkedDirty() {
        this.scheduler.schedule(this);
        this.notifier.notify(12 /* NotificationSource.RootEffect */);
    },
    destroy() {
        consumerDestroy(this);
        this.onDestroyFn();
        this.maybeCleanup();
        this.scheduler.remove(this);
    },
}))();
const VIEW_EFFECT_NODE = 
/* @__PURE__ */ (() => ({
    ...BASE_EFFECT_NODE,
    consumerMarkedDirty() {
        this.view[FLAGS] |= 8192 /* LViewFlags.HasChildViewsToRefresh */;
        markAncestorsForTraversal(this.view);
        this.notifier.notify(13 /* NotificationSource.ViewEffect */);
    },
    destroy() {
        consumerDestroy(this);
        this.onDestroyFn();
        this.maybeCleanup();
        this.view[EFFECTS]?.delete(this);
    },
}))();
function createViewEffect(view, notifier, fn) {
    const node = Object.create(VIEW_EFFECT_NODE);
    node.view = view;
    node.zone = typeof Zone !== 'undefined' ? Zone.current : null;
    node.notifier = notifier;
    node.fn = fn;
    view[EFFECTS] ??= new Set();
    view[EFFECTS].add(node);
    node.consumerMarkedDirty(node);
    return node;
}
function createRootEffect(fn, scheduler, notifier) {
    const node = Object.create(ROOT_EFFECT_NODE);
    node.fn = fn;
    node.scheduler = scheduler;
    node.notifier = notifier;
    node.zone = typeof Zone !== 'undefined' ? Zone.current : null;
    node.scheduler.schedule(node);
    node.notifier.notify(12 /* NotificationSource.RootEffect */);
    return node;
}

/**
 * Status of a `Resource`.
 *
 * @experimental
 */
var ResourceStatus;
(function (ResourceStatus) {
    /**
     * The resource has no valid request and will not perform any loading.
     *
     * `value()` will be `undefined`.
     */
    ResourceStatus[ResourceStatus["Idle"] = 0] = "Idle";
    /**
     * Loading failed with an error.
     *
     * `value()` will be `undefined`.
     */
    ResourceStatus[ResourceStatus["Error"] = 1] = "Error";
    /**
     * The resource is currently loading a new value as a result of a change in its `request`.
     *
     * `value()` will be `undefined`.
     */
    ResourceStatus[ResourceStatus["Loading"] = 2] = "Loading";
    /**
     * The resource is currently reloading a fresh value for the same request.
     *
     * `value()` will continue to return the previously fetched value during the reloading operation.
     */
    ResourceStatus[ResourceStatus["Reloading"] = 3] = "Reloading";
    /**
     * Loading has completed and the resource has the value returned from the loader.
     */
    ResourceStatus[ResourceStatus["Resolved"] = 4] = "Resolved";
    /**
     * The resource's value was set locally via `.set()` or `.update()`.
     */
    ResourceStatus[ResourceStatus["Local"] = 5] = "Local";
})(ResourceStatus || (ResourceStatus = {}));

const identityFn = (v) => v;
function linkedSignal(optionsOrComputation, options) {
    if (typeof optionsOrComputation === 'function') {
        const getter = createLinkedSignal(optionsOrComputation, (identityFn), options?.equal);
        return upgradeLinkedSignalGetter(getter);
    }
    else {
        const getter = createLinkedSignal(optionsOrComputation.source, optionsOrComputation.computation, optionsOrComputation.equal);
        return upgradeLinkedSignalGetter(getter);
    }
}
function upgradeLinkedSignalGetter(getter) {
    if (ngDevMode) {
        getter.toString = () => `[LinkedSignal: ${getter()}]`;
    }
    const node = getter[SIGNAL];
    const upgradedGetter = getter;
    upgradedGetter.set = (newValue) => linkedSignalSetFn(node, newValue);
    upgradedGetter.update = (updateFn) => linkedSignalUpdateFn(node, updateFn);
    upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter);
    return upgradedGetter;
}

function resource(options) {
    options?.injector || assertInInjectionContext(resource);
    const request = (options.request ?? (() => null));
    return new ResourceImpl(request, getLoader(options), options.defaultValue, options.equal ? wrapEqualityFn(options.equal) : undefined, options.injector ?? inject(Injector));
}
/**
 * Base class which implements `.value` as a `WritableSignal` by delegating `.set` and `.update`.
 */
class BaseWritableResource {
    value;
    constructor(value) {
        this.value = value;
        this.value.set = this.set.bind(this);
        this.value.update = this.update.bind(this);
        this.value.asReadonly = signalAsReadonlyFn;
    }
    update(updateFn) {
        this.set(updateFn(untracked(this.value)));
    }
    isLoading = computed(() => this.status() === ResourceStatus.Loading || this.status() === ResourceStatus.Reloading);
    hasValue() {
        return this.value() !== undefined;
    }
    asReadonly() {
        return this;
    }
}
/**
 * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state.
 */
class ResourceImpl extends BaseWritableResource {
    loaderFn;
    defaultValue;
    equal;
    pendingTasks;
    /**
     * The current state of the resource. Status, value, and error are derived from this.
     */
    state;
    /**
     * Combines the current request with a reload counter which allows the resource to be reloaded on
     * imperative command.
     */
    extRequest;
    effectRef;
    pendingController;
    resolvePendingTask = undefined;
    destroyed = false;
    constructor(request, loaderFn, defaultValue, equal, injector) {
        super(
        // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a
        // `WritableSignal` that delegates to `ResourceImpl.set`.
        computed(() => {
            const streamValue = this.state().stream?.();
            return streamValue && isResolved(streamValue) ? streamValue.value : this.defaultValue;
        }, { equal }));
        this.loaderFn = loaderFn;
        this.defaultValue = defaultValue;
        this.equal = equal;
        // Extend `request()` to include a writable reload signal.
        this.extRequest = linkedSignal({
            source: request,
            computation: (request) => ({ request, reload: 0 }),
        });
        // The main resource state is managed in a `linkedSignal`, which allows the resource to change
        // state instantaneously when the request signal changes.
        this.state = linkedSignal({
            // Whenever the request changes,
            source: this.extRequest,
            // Compute the state of the resource given a change in status.
            computation: (extRequest, previous) => {
                const status = extRequest.request === undefined ? ResourceStatus.Idle : ResourceStatus.Loading;
                if (!previous) {
                    return {
                        extRequest,
                        status,
                        previousStatus: ResourceStatus.Idle,
                        stream: undefined,
                    };
                }
                else {
                    return {
                        extRequest,
                        status,
                        previousStatus: projectStatusOfState(previous.value),
                        // If the request hasn't changed, keep the previous stream.
                        stream: previous.value.extRequest.request === extRequest.request
                            ? previous.value.stream
                            : undefined,
                    };
                }
            },
        });
        this.effectRef = effect(this.loadEffect.bind(this), {
            injector,
            manualCleanup: true,
        });
        this.pendingTasks = injector.get(PendingTasks);
        // Cancel any pending request when the resource itself is destroyed.
        injector.get(DestroyRef).onDestroy(() => this.destroy());
    }
    status = computed(() => projectStatusOfState(this.state()));
    error = computed(() => {
        const stream = this.state().stream?.();
        return stream && !isResolved(stream) ? stream.error : undefined;
    });
    /**
     * Called either directly via `WritableResource.set` or via `.value.set()`.
     */
    set(value) {
        if (this.destroyed) {
            return;
        }
        const current = untracked(this.value);
        const state = untracked(this.state);
        if (state.status === ResourceStatus.Local &&
            (this.equal ? this.equal(current, value) : current === value)) {
            return;
        }
        // Enter Local state with the user-defined value.
        this.state.set({
            extRequest: state.extRequest,
            status: ResourceStatus.Local,
            previousStatus: ResourceStatus.Local,
            stream: signal({ value }),
        });
        // We're departing from whatever state the resource was in previously, so cancel any in-progress
        // loading operations.
        this.abortInProgressLoad();
    }
    reload() {
        // We don't want to restart in-progress loads.
        const { status } = untracked(this.state);
        if (status === ResourceStatus.Idle || status === ResourceStatus.Loading) {
            return false;
        }
        // Increment the request reload to trigger the `state` linked signal to switch us to `Reload`
        this.extRequest.update(({ request, reload }) => ({ request, reload: reload + 1 }));
        return true;
    }
    destroy() {
        this.destroyed = true;
        this.effectRef.destroy();
        this.abortInProgressLoad();
        // Destroyed resources enter Idle state.
        this.state.set({
            extRequest: { request: undefined, reload: 0 },
            status: ResourceStatus.Idle,
            previousStatus: ResourceStatus.Idle,
            stream: undefined,
        });
    }
    async loadEffect() {
        const extRequest = this.extRequest();
        // Capture the previous status before any state transitions. Note that this is `untracked` since
        // we do not want the effect to depend on the state of the resource, only on the request.
        const { status: currentStatus, previousStatus } = untracked(this.state);
        if (extRequest.request === undefined) {
            // Nothing to load (and we should already be in a non-loading state).
            return;
        }
        else if (currentStatus !== ResourceStatus.Loading) {
            // We're not in a loading or reloading state, so this loading request is stale.
            return;
        }
        // Cancel any previous loading attempts.
        this.abortInProgressLoad();
        // Capturing _this_ load's pending task in a local variable is important here. We may attempt to
        // resolve it twice:
        //
        //  1. when the loading function promise resolves/rejects
        //  2. when cancelling the loading operation
        //
        // After the loading operation is cancelled, `this.resolvePendingTask` no longer represents this
        // particular task, but this `await` may eventually resolve/reject. Thus, when we cancel in
        // response to (1) below, we need to cancel the locally saved task.
        let resolvePendingTask = (this.resolvePendingTask =
            this.pendingTasks.add());
        const { signal: abortSignal } = (this.pendingController = new AbortController());
        try {
            // The actual loading is run through `untracked` - only the request side of `resource` is
            // reactive. This avoids any confusion with signals tracking or not tracking depending on
            // which side of the `await` they are.
            const stream = await untracked(() => {
                return this.loaderFn({
                    request: extRequest.request,
                    abortSignal,
                    previous: {
                        status: previousStatus,
                    },
                });
            });
            // If this request has been aborted, or the current request no longer
            // matches this load, then we should ignore this resolution.
            if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) {
                return;
            }
            this.state.set({
                extRequest,
                status: ResourceStatus.Resolved,
                previousStatus: ResourceStatus.Resolved,
                stream,
            });
        }
        catch (err) {
            if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) {
                return;
            }
            this.state.set({
                extRequest,
                status: ResourceStatus.Resolved,
                previousStatus: ResourceStatus.Error,
                stream: signal({ error: err }),
            });
        }
        finally {
            // Resolve the pending task now that the resource has a value.
            resolvePendingTask?.();
            resolvePendingTask = undefined;
        }
    }
    abortInProgressLoad() {
        untracked(() => this.pendingController?.abort());
        this.pendingController = undefined;
        // Once the load is aborted, we no longer want to block stability on its resolution.
        this.resolvePendingTask?.();
        this.resolvePendingTask = undefined;
    }
}
/**
 * Wraps an equality function to handle either value being `undefined`.
 */
function wrapEqualityFn(equal) {
    return (a, b) => (a === undefined || b === undefined ? a === b : equal(a, b));
}
function getLoader(options) {
    if (isStreamingResourceOptions(options)) {
        return options.stream;
    }
    return async (params) => {
        try {
            return signal({ value: await options.loader(params) });
        }
        catch (err) {
            return signal({ error: err });
        }
    };
}
function isStreamingResourceOptions(options) {
    return !!options.stream;
}
/**
 * Project from a state with `ResourceInternalStatus` to the user-facing `ResourceStatus`
 */
function projectStatusOfState(state) {
    switch (state.status) {
        case ResourceStatus.Loading:
            return state.extRequest.reload === 0 ? ResourceStatus.Loading : ResourceStatus.Reloading;
        case ResourceStatus.Resolved:
            return isResolved(untracked(state.stream)) ? ResourceStatus.Resolved : ResourceStatus.Error;
        default:
            return state.status;
    }
}
function isResolved(state) {
    return state.error === undefined;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Gets the class name of the closest component to a node.
 * Warning! this function will return minified names if the name of the component is minified. The
 * consumer of the function is responsible for resolving the minified name to its original name.
 * @param node Node from which to start the search.
 */
function getClosestComponentName(node) {
    let currentNode = node;
    while (currentNode) {
        const lView = readPatchedLView(currentNode);
        if (lView !== null) {
            for (let i = HEADER_OFFSET; i < lView.length; i++) {
                const current = lView[i];
                if ((!isLView(current) && !isLContainer(current)) || current[HOST] !== currentNode) {
                    continue;
                }
                const tView = lView[TVIEW];
                const tNode = getTNode(tView, i);
                if (isComponentHost(tNode)) {
                    const def = tView.data[tNode.directiveStart + tNode.componentOffset];
                    const name = def.debugInfo?.className || def.type.name;
                    // Note: the name may be an empty string if the class name is
                    // dropped due to minification. In such cases keep going up the tree.
                    if (name) {
                        return name;
                    }
                    else {
                        break;
                    }
                }
            }
        }
        currentNode = currentNode.parentNode;
    }
    return null;
}

/**
 * Compiles a partial directive declaration object into a full directive definition object.
 *
 * @codeGenApi
 */
function ɵɵngDeclareDirective(decl) {
    const compiler = getCompilerFacade({
        usage: 1 /* JitCompilerUsage.PartialDeclaration */,
        kind: 'directive',
        type: decl.type,
    });
    return compiler.compileDirectiveDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
}
/**
 * Evaluates the class metadata declaration.
 *
 * @codeGenApi
 */
function ɵɵngDeclareClassMetadata(decl) {
    setClassMetadata(decl.type, decl.decorators, decl.ctorParameters ?? null, decl.propDecorators ?? null);
}
/**
 * Evaluates the class metadata of a component that contains deferred blocks.
 *
 * @codeGenApi
 */
function ɵɵngDeclareClassMetadataAsync(decl) {
    setClassMetadataAsync(decl.type, decl.resolveDeferredDeps, (...types) => {
        const meta = decl.resolveMetadata(...types);
        setClassMetadata(decl.type, meta.decorators, meta.ctorParameters, meta.propDecorators);
    });
}
/**
 * Compiles a partial component declaration object into a full component definition object.
 *
 * @codeGenApi
 */
function ɵɵngDeclareComponent(decl) {
    const compiler = getCompilerFacade({
        usage: 1 /* JitCompilerUsage.PartialDeclaration */,
        kind: 'component',
        type: decl.type,
    });
    return compiler.compileComponentDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵcmp.js`, decl);
}
/**
 * Compiles a partial pipe declaration object into a full pipe definition object.
 *
 * @codeGenApi
 */
function ɵɵngDeclareFactory(decl) {
    const compiler = getCompilerFacade({
        usage: 1 /* JitCompilerUsage.PartialDeclaration */,
        kind: getFactoryKind(decl.target),
        type: decl.type,
    });
    return compiler.compileFactoryDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
}
function getFactoryKind(target) {
    switch (target) {
        case FactoryTarget.Directive:
            return 'directive';
        case FactoryTarget.Component:
            return 'component';
        case FactoryTarget.Injectable:
            return 'injectable';
        case FactoryTarget.Pipe:
            return 'pipe';
        case FactoryTarget.NgModule:
            return 'NgModule';
    }
}
/**
 * Compiles a partial injectable declaration object into a full injectable definition object.
 *
 * @codeGenApi
 */
function ɵɵngDeclareInjectable(decl) {
    const compiler = getCompilerFacade({
        usage: 1 /* JitCompilerUsage.PartialDeclaration */,
        kind: 'injectable',
        type: decl.type,
    });
    return compiler.compileInjectableDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵprov.js`, decl);
}
/**
 * Compiles a partial injector declaration object into a full injector definition object.
 *
 * @codeGenApi
 */
function ɵɵngDeclareInjector(decl) {
    const compiler = getCompilerFacade({
        usage: 1 /* JitCompilerUsage.PartialDeclaration */,
        kind: 'NgModule',
        type: decl.type,
    });
    return compiler.compileInjectorDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵinj.js`, decl);
}
/**
 * Compiles a partial NgModule declaration object into a full NgModule definition object.
 *
 * @codeGenApi
 */
function ɵɵngDeclareNgModule(decl) {
    const compiler = getCompilerFacade({
        usage: 1 /* JitCompilerUsage.PartialDeclaration */,
        kind: 'NgModule',
        type: decl.type,
    });
    return compiler.compileNgModuleDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵmod.js`, decl);
}
/**
 * Compiles a partial pipe declaration object into a full pipe definition object.
 *
 * @codeGenApi
 */
function ɵɵngDeclarePipe(decl) {
    const compiler = getCompilerFacade({
        usage: 1 /* JitCompilerUsage.PartialDeclaration */,
        kind: 'pipe',
        type: decl.type,
    });
    return compiler.compilePipeDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵpipe.js`, decl);
}

const NOT_SET = /* @__PURE__ */ Symbol('NOT_SET');
const EMPTY_CLEANUP_SET = /* @__PURE__ */ new Set();
const AFTER_RENDER_PHASE_EFFECT_NODE = /* @__PURE__ */ (() => ({
    ...SIGNAL_NODE,
    consumerIsAlwaysLive: true,
    consumerAllowSignalWrites: true,
    value: NOT_SET,
    cleanup: null,
    /** Called when the effect becomes dirty */
    consumerMarkedDirty() {
        if (this.sequence.impl.executing) {
            // If hooks are in the middle of executing, then it matters whether this node has yet been
            // executed within its sequence. If not, then we don't want to notify the scheduler since
            // this node will be reached naturally.
            if (this.sequence.lastPhase === null || this.sequence.lastPhase < this.phase) {
                return;
            }
            // If during the execution of a later phase an earlier phase became dirty, then we should not
            // run any further phases until the earlier one reruns.
            this.sequence.erroredOrDestroyed = true;
        }
        // Either hooks are not running, or we're marking a node dirty that has already run within its
        // sequence.
        this.sequence.scheduler.notify(7 /* NotificationSource.RenderHook */);
    },
    phaseFn(previousValue) {
        this.sequence.lastPhase = this.phase;
        if (!this.dirty) {
            return this.signal;
        }
        this.dirty = false;
        if (this.value !== NOT_SET && !consumerPollProducersForChange(this)) {
            // None of our producers report a change since the last time they were read, so no
            // recomputation of our value is necessary.
            return this.signal;
        }
        // Run any needed cleanup functions.
        try {
            for (const cleanupFn of this.cleanup ?? EMPTY_CLEANUP_SET) {
                cleanupFn();
            }
        }
        finally {
            // Even if a cleanup function errors, ensure it's cleared.
            this.cleanup?.clear();
        }
        // Prepare to call the user's effect callback. If there was a previous phase, then it gave us
        // its value as a `Signal`, otherwise `previousValue` will be `undefined`.
        const args = [];
        if (previousValue !== undefined) {
            args.push(previousValue);
        }
        args.push(this.registerCleanupFn);
        // Call the user's callback in our reactive context.
        const prevConsumer = consumerBeforeComputation(this);
        let newValue;
        try {
            newValue = this.userFn.apply(null, args);
        }
        finally {
            consumerAfterComputation(this, prevConsumer);
        }
        if (this.value === NOT_SET || !this.equal(this.value, newValue)) {
            this.value = newValue;
            this.version++;
        }
        return this.signal;
    },
}))();
/**
 * An `AfterRenderSequence` that manages an `afterRenderEffect`'s phase effects.
 */
class AfterRenderEffectSequence extends AfterRenderSequence {
    scheduler;
    /**
     * While this sequence is executing, this tracks the last phase which was called by the
     * `afterRender` machinery.
     *
     * When a phase effect is marked dirty, this is used to determine whether it's already run or not.
     */
    lastPhase = null;
    /**
     * The reactive nodes for each phase, if a phase effect is defined for that phase.
     *
     * These are initialized to `undefined` but set in the constructor.
     */
    nodes = [undefined, undefined, undefined, undefined];
    constructor(impl, effectHooks, view, scheduler, destroyRef, snapshot = null) {
        // Note that we also initialize the underlying `AfterRenderSequence` hooks to `undefined` and
        // populate them as we create reactive nodes below.
        super(impl, [undefined, undefined, undefined, undefined], view, false, destroyRef, snapshot);
        this.scheduler = scheduler;
        // Setup a reactive node for each phase.
        for (const phase of AFTER_RENDER_PHASES) {
            const effectHook = effectHooks[phase];
            if (effectHook === undefined) {
                continue;
            }
            const node = Object.create(AFTER_RENDER_PHASE_EFFECT_NODE);
            node.sequence = this;
            node.phase = phase;
            node.userFn = effectHook;
            node.dirty = true;
            node.signal = (() => {
                producerAccessed(node);
                return node.value;
            });
            node.signal[SIGNAL] = node;
            node.registerCleanupFn = (fn) => (node.cleanup ??= new Set()).add(fn);
            this.nodes[phase] = node;
            // Install the upstream hook which runs the `phaseFn` for this phase.
            this.hooks[phase] = (value) => node.phaseFn(value);
        }
    }
    afterRun() {
        super.afterRun();
        // We're done running this sequence, so reset `lastPhase`.
        this.lastPhase = null;
    }
    destroy() {
        super.destroy();
        // Run the cleanup functions for each node.
        for (const node of this.nodes) {
            for (const fn of node?.cleanup ?? EMPTY_CLEANUP_SET) {
                fn();
            }
        }
    }
}
/**
 * @experimental
 */
function afterRenderEffect(callbackOrSpec, options) {
    ngDevMode &&
        assertNotInReactiveContext(afterRenderEffect, 'Call `afterRenderEffect` outside of a reactive context. For example, create the render ' +
            'effect inside the component constructor`.');
    !options?.injector && assertInInjectionContext(afterRenderEffect);
    if (typeof ngServerMode !== 'undefined' && ngServerMode) {
        return NOOP_AFTER_RENDER_REF;
    }
    const injector = options?.injector ?? inject(Injector);
    const scheduler = injector.get(ChangeDetectionScheduler);
    const manager = injector.get(AfterRenderManager);
    const tracing = injector.get(TracingService, null, { optional: true });
    manager.impl ??= injector.get(AfterRenderImpl);
    let spec = callbackOrSpec;
    if (typeof spec === 'function') {
        spec = { mixedReadWrite: callbackOrSpec };
    }
    const viewContext = injector.get(ViewContext, null, { optional: true });
    const sequence = new AfterRenderEffectSequence(manager.impl, [spec.earlyRead, spec.write, spec.mixedReadWrite, spec.read], viewContext?.view, scheduler, injector.get(DestroyRef), tracing?.snapshot(null));
    manager.impl.register(sequence);
    return sequence;
}

/**
 * Creates a `ComponentRef` instance based on provided component type and a set of options.
 *
 * @usageNotes
 *
 * The example below demonstrates how the `createComponent` function can be used
 * to create an instance of a ComponentRef dynamically and attach it to an ApplicationRef,
 * so that it gets included into change detection cycles.
 *
 * Note: the example uses standalone components, but the function can also be used for
 * non-standalone components (declared in an NgModule) as well.
 *
 * ```angular-ts
 * @Component({
 *   standalone: true,
 *   template: `Hello {{ name }}!`
 * })
 * class HelloComponent {
 *   name = 'Angular';
 * }
 *
 * @Component({
 *   standalone: true,
 *   template: `<div id="hello-component-host"></div>`
 * })
 * class RootComponent {}
 *
 * // Bootstrap an application.
 * const applicationRef = await bootstrapApplication(RootComponent);
 *
 * // Locate a DOM node that would be used as a host.
 * const hostElement = document.getElementById('hello-component-host');
 *
 * // Get an `EnvironmentInjector` instance from the `ApplicationRef`.
 * const environmentInjector = applicationRef.injector;
 *
 * // We can now create a `ComponentRef` instance.
 * const componentRef = createComponent(HelloComponent, {hostElement, environmentInjector});
 *
 * // Last step is to register the newly created ref using the `ApplicationRef` instance
 * // to include the component view into change detection cycles.
 * applicationRef.attachView(componentRef.hostView);
 * componentRef.changeDetectorRef.detectChanges();
 * ```
 *
 * @param component Component class reference.
 * @param options Set of options to use:
 *  * `environmentInjector`: An `EnvironmentInjector` instance to be used for the component.
 *  * `hostElement` (optional): A DOM node that should act as a host node for the component. If not
 * provided, Angular creates one based on the tag name used in the component selector (and falls
 * back to using `div` if selector doesn't have tag name info).
 *  * `elementInjector` (optional): An `ElementInjector` instance, see additional info about it
 * [here](guide/di/hierarchical-dependency-injection#elementinjector).
 *  * `projectableNodes` (optional): A list of DOM nodes that should be projected through
 * [`<ng-content>`](api/core/ng-content) of the new component instance, e.g.,
 * `[[element1, element2]]`: projects `element1` and `element2` into the same `<ng-content>`.
 * `[[element1, element2], [element3]]`: projects `element1` and `element2` into one `<ng-content>`,
 * and `element3` into a separate `<ng-content>`.
 * @returns ComponentRef instance that represents a given Component.
 *
 * @publicApi
 */
function createComponent(component, options) {
    ngDevMode && assertComponentDef(component);
    const componentDef = getComponentDef(component);
    const elementInjector = options.elementInjector || getNullInjector();
    const factory = new ComponentFactory(componentDef);
    return factory.create(elementInjector, options.projectableNodes, options.hostElement, options.environmentInjector);
}
/**
 * Creates an object that allows to retrieve component metadata.
 *
 * @usageNotes
 *
 * The example below demonstrates how to use the function and how the fields
 * of the returned object map to the component metadata.
 *
 * ```angular-ts
 * @Component({
 *   standalone: true,
 *   selector: 'foo-component',
 *   template: `
 *     <ng-content></ng-content>
 *     <ng-content select="content-selector-a"></ng-content>
 *   `,
 * })
 * class FooComponent {
 *   @Input('inputName') inputPropName: string;
 *   @Output('outputName') outputPropName = new EventEmitter<void>();
 * }
 *
 * const mirror = reflectComponentType(FooComponent);
 * expect(mirror.type).toBe(FooComponent);
 * expect(mirror.selector).toBe('foo-component');
 * expect(mirror.isStandalone).toBe(true);
 * expect(mirror.inputs).toEqual([{propName: 'inputName', templateName: 'inputPropName'}]);
 * expect(mirror.outputs).toEqual([{propName: 'outputName', templateName: 'outputPropName'}]);
 * expect(mirror.ngContentSelectors).toEqual([
 *   '*',                 // first `<ng-content>` in a template, the selector defaults to `*`
 *   'content-selector-a' // second `<ng-content>` in a template
 * ]);
 * ```
 *
 * @param component Component class reference.
 * @returns An object that allows to retrieve component metadata.
 *
 * @publicApi
 */
function reflectComponentType(component) {
    const componentDef = getComponentDef(component);
    if (!componentDef)
        return null;
    const factory = new ComponentFactory(componentDef);
    return {
        get selector() {
            return factory.selector;
        },
        get type() {
            return factory.componentType;
        },
        get inputs() {
            return factory.inputs;
        },
        get outputs() {
            return factory.outputs;
        },
        get ngContentSelectors() {
            return factory.ngContentSelectors;
        },
        get isStandalone() {
            return componentDef.standalone;
        },
        get isSignal() {
            return componentDef.signals;
        },
    };
}

/**
 * Merge multiple application configurations from left to right.
 *
 * @param configs Two or more configurations to be merged.
 * @returns A merged [ApplicationConfig](api/core/ApplicationConfig).
 *
 * @publicApi
 */
function mergeApplicationConfig(...configs) {
    return configs.reduce((prev, curr) => {
        return Object.assign(prev, curr, { providers: [...prev.providers, ...curr.providers] });
    }, { providers: [] });
}

/**
 * Injection token representing the current HTTP request object.
 *
 * Use this token to access the current request when handling server-side
 * rendering (SSR).
 *
 * @remarks
 * This token may be `null` in the following scenarios:
 *
 * * During the build processes.
 * * When the application is rendered in the browser (client-side rendering).
 * * When performing static site generation (SSG).
 * * During route extraction in development (at the time of the request).
 *
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Request | `Request` on MDN}
 *
 * @developerPreview
 */
const REQUEST = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'REQUEST' : '', {
    providedIn: 'platform',
    factory: () => null,
});
/**
 * Injection token for response initialization options.
 *
 * Use this token to provide response options for configuring or initializing
 * HTTP responses in server-side rendering or API endpoints.
 *
 * @remarks
 * This token may be `null` in the following scenarios:
 *
 * * During the build processes.
 * * When the application is rendered in the browser (client-side rendering).
 * * When performing static site generation (SSG).
 * * During route extraction in development (at the time of the request).
 *
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response | `ResponseInit` on MDN}
 *
 * @developerPreview
 */
const RESPONSE_INIT = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'RESPONSE_INIT' : '', {
    providedIn: 'platform',
    factory: () => null,
});
/**
 * Injection token for additional request context.
 *
 * Use this token to pass custom metadata or context related to the current request in server-side rendering.
 *
 * @remarks
 * This token is only available during server-side rendering and will be `null` in other contexts.
 *
 * @developerPreview
 */
const REQUEST_CONTEXT = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'REQUEST_CONTEXT' : '', {
    providedIn: 'platform',
    factory: () => null,
});

export { ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AfterRenderPhase, ApplicationInitStatus, ApplicationModule, ApplicationRef, Attribute, COMPILER_OPTIONS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Compiler, CompilerFactory, Component, ComponentFactory$1 as ComponentFactory, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ContentChild, ContentChildren, DEFAULT_CURRENCY_CODE, DebugElement, DebugEventListener, DebugNode, DefaultIterableDiffer, DestroyRef, Directive, ENVIRONMENT_INITIALIZER, ElementRef, EmbeddedViewRef, EnvironmentInjector, ErrorHandler, EventEmitter, HOST_TAG_NAME, Host, HostAttributeToken, HostBinding, HostListener, INJECTOR$1 as INJECTOR, Inject, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory$1 as NgModuleFactory, NgModuleRef$1 as NgModuleRef, NgProbeToken, NgZone, Optional, Output, OutputEmitterRef, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PendingTasks, Pipe, PlatformRef, Query, QueryList, REQUEST, REQUEST_CONTEXT, RESPONSE_INIT, Renderer2, RendererFactory2, RendererStyleFlags2, ResourceStatus, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation, ViewRef, afterNextRender, afterRender, afterRenderEffect, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, contentChild, contentChildren, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, input, isDevMode, isSignal, isStandalone, linkedSignal, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, model, numberAttribute, output, platformCore, provideAppInitializer, provideEnvironmentInitializer, provideExperimentalCheckNoChangesForDebug, provideExperimentalZonelessChangeDetection, providePlatformInitializer, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, resource, runInInjectionContext, setTestabilityGetter, signal, untracked, viewChild, viewChildren, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderManager as ɵAfterRenderManager, CLIENT_RENDER_MODE_FLAG as ɵCLIENT_RENDER_MODE_FLAG, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ChangeDetectionScheduler as ɵChangeDetectionScheduler, ChangeDetectionSchedulerImpl as ɵChangeDetectionSchedulerImpl, ComponentFactory$1 as ɵComponentFactory, Console as ɵConsole, DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG as ɵDEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR as ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DEHYDRATED_BLOCK_REGISTRY as ɵDEHYDRATED_BLOCK_REGISTRY, DeferBlockBehavior as ɵDeferBlockBehavior, DeferBlockState as ɵDeferBlockState, ENABLE_ROOT_COMPONENT_BOOTSTRAP as ɵENABLE_ROOT_COMPONENT_BOOTSTRAP, EffectScheduler as ɵEffectScheduler, HydrationStatus as ɵHydrationStatus, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, INJECTOR_SCOPE as ɵINJECTOR_SCOPE, ɵINPUT_SIGNAL_BRAND_WRITE_TYPE, INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED as ɵIS_INCREMENTAL_HYDRATION_ENABLED, JSACTION_BLOCK_ELEMENT_MAP as ɵJSACTION_BLOCK_ELEMENT_MAP, JSACTION_EVENT_CONTRACT as ɵJSACTION_EVENT_CONTRACT, LContext as ɵLContext, LocaleDataIndex as ɵLocaleDataIndex, MicrotaskEffectScheduler as ɵMicrotaskEffectScheduler, NG_COMP_DEF as ɵNG_COMP_DEF, NG_DIR_DEF as ɵNG_DIR_DEF, NG_ELEMENT_ID as ɵNG_ELEMENT_ID, NG_INJ_DEF as ɵNG_INJ_DEF, NG_MOD_DEF as ɵNG_MOD_DEF, NG_PIPE_DEF as ɵNG_PIPE_DEF, NG_PROV_DEF as ɵNG_PROV_DEF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE as ɵNO_CHANGE, NgModuleFactory as ɵNgModuleFactory, NoopNgZone as ɵNoopNgZone, PERFORMANCE_MARK_PREFIX as ɵPERFORMANCE_MARK_PREFIX, PROVIDED_NG_ZONE as ɵPROVIDED_NG_ZONE, PendingTasksInternal as ɵPendingTasksInternal, R3Injector as ɵR3Injector, ReflectionCapabilities as ɵReflectionCapabilities, ComponentFactory as ɵRender3ComponentFactory, ComponentRef as ɵRender3ComponentRef, NgModuleRef as ɵRender3NgModuleRef, ResourceImpl as ɵResourceImpl, RuntimeError as ɵRuntimeError, SIGNAL as ɵSIGNAL, SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER, TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER, TimerScheduler as ɵTimerScheduler, TracingAction as ɵTracingAction, TracingService as ɵTracingService, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef"R, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZONELESS_ENABLED as ɵZONELESS_ENABLED, _sanitizeHtml as ɵ_sanitizeHtml, _sanitizeUrl as ɵ_sanitizeUrl, allowSanitizationBypassAndThrow as ɵallowSanitizationBypassAndThrow, annotateForHydration as ɵannotateForHydration, bypassSanitizationTrustHtml as ɵbypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl as ɵbypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript as ɵbypassSanitizationTrustScript, bypassSanitizationTrustStyle as ɵbypassSanitizationTrustStyle, bypassSanitizationTrustUrl as ɵbypassSanitizationTrustUrl, clearResolutionOfComponentResourcesQueue as ɵclearResolutionOfComponentResourcesQueue, compileComponent as ɵcompileComponent, compileDirective as ɵcompileDirective, compileNgModule as ɵcompileNgModule, compileNgModuleDefs as ɵcompileNgModuleDefs, compileNgModuleFactory as ɵcompileNgModuleFactory, compilePipe as ɵcompilePipe, convertToBitFlags as ɵconvertToBitFlags, createInjector as ɵcreateInjector, createOrReusePlatformInjector as ɵcreateOrReusePlatformInjector, defaultIterableDiffers as ɵdefaultIterableDiffers, defaultKeyValueDiffers as ɵdefaultKeyValueDiffers, depsTracker as ɵdepsTracker, detectChangesInViewIfRequired as ɵdetectChangesInViewIfRequired, devModeEqual as ɵdevModeEqual, disableProfiling as ɵdisableProfiling, enableProfiling as ɵenableProfiling, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn, getClosestComponentName as ɵgetClosestComponentName, getComponentDef as ɵgetComponentDef, getDebugNode as ɵgetDebugNode, getDeferBlocks$1 as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getDocument as ɵgetDocument, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getOutputDestroyRef as ɵgetOutputDestroyRef, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalCreateApplication as ɵinternalCreateApplication, internalProvideZoneChangeDetection as ɵinternalProvideZoneChangeDetection, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, isViewDirty as ɵisViewDirty, markForRefresh as ɵmarkForRefresh, microtaskEffect as ɵmicrotaskEffect, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, performanceMarkFeature as ɵperformanceMarkFeature, publishExternalGlobalUtil as ɵpublishExternalGlobalUtil, readHydrationInfo as ɵreadHydrationInfo, registerLocaleData as ɵregisterLocaleData, renderDeferBlockState as ɵrenderDeferBlockState, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setCurrentInjector as ɵsetCurrentInjector, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, startMeasuring as ɵstartMeasuring, stopMeasuring as ɵstopMeasuring, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, ɵunwrapWritableSignal, withDomHydration as ɵwithDomHydration, withEventReplay as ɵwithEventReplay, withI18nSupport as ɵwithI18nSupport, withIncrementalHydration as ɵwithIncrementalHydration, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵattachSourceLocations, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdisableBindings, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵenableBindings, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵgetReplaceMetadataURL, ɵɵhostProperty, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinject, ɵɵinjectAttribute, ɵɵinvalidFactory, ɵɵinvalidFactoryDep, ɵɵlistener, ɵɵloadQuery, ɵɵnamespaceHTML, ɵɵnamespaceMathML, ɵɵnamespaceSVG, ɵɵnextContext, ɵɵngDeclareClassMetadata, ɵɵngDeclareClassMetadataAsync, ɵɵngDeclareComponent, ɵɵngDeclareDirective, ɵɵngDeclareFactory, ɵɵngDeclareInjectable, ɵɵngDeclareInjector, ɵɵngDeclareNgModule, ɵɵngDeclarePipe, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpropertyInterpolate, ɵɵpropertyInterpolate1, ɵɵpropertyInterpolate2, ɵɵpropertyInterpolate3, ɵɵpropertyInterpolate4, ɵɵpropertyInterpolate5, ɵɵpropertyInterpolate6, ɵɵpropertyInterpolate7, ɵɵpropertyInterpolate8, ɵɵpropertyInterpolateV, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵstyleMap, ɵɵstyleMapInterpolate1, ɵɵstyleMapInterpolate2, ɵɵstyleMapInterpolate3, ɵɵstyleMapInterpolate4, ɵɵstyleMapInterpolate5, ɵɵstyleMapInterpolate6, ɵɵstyleMapInterpolate7, ɵɵstyleMapInterpolate8, ɵɵstyleMapInterpolateV, ɵɵstyleProp, ɵɵstylePropInterpolate1, ɵɵstylePropInterpolate2, ɵɵstylePropInterpolate3, ɵɵstylePropInterpolate4, ɵɵstylePropInterpolate5, ɵɵstylePropInterpolate6, ɵɵstylePropInterpolate7, ɵɵstylePropInterpolate8, ɵɵstylePropInterpolateV, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
//# sourceMappingURL=core.mjs.map
 ɸx   {"version":3,"file":"core.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/error_details_base_url.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/errors.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/authoring/input/input_signal_node.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/authoring/input/input_signal.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/closure.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/decorators.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/global.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/ng_dev_mode.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/property.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/stringify.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/forward_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/assert.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/interface/defs.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/injection_token.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/debug/injector_profiler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/interface/provider.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/fields.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/stringify_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/errors_di.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/interface/injector.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/inject_switch.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/injector_compatibility.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/metadata.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/definition_factory.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/array_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/empty.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/initializer_token.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/injector_token.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/internal_tokens.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/null_injector.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/def_getters.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/provider_collection.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/scope.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/r3_injector.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/contextual.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/compiler/compiler_facade_interface.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/compiler/compiler_facade.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/jit/environment.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/interface/type.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/reflection/reflection_capabilities.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/view.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/container.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/type_checks.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/assert.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/interface/simple_change.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/apply_value_input_field.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/features/ng_onchanges_feature.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/profiler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/namespaces.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/view_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/state.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/hooks.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/injector.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/node.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/node_assert.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/attrs_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/injector_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/di.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/di_attr.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/metadata_attr.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/jit/util.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/jit/injectable.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/injectable.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/create_injector.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/injector.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/host_attribute_token.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/di/host_tag_name_token.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/scheduling/flags.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/destroy_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/scheduling/zoneless_scheduling.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/pending_tasks.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/event_emitter.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/noop.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/callback_scheduler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/zone/async-stack-tagging.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/zone/ng_zone.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/error_handler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/authoring/output/output_emitter_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/authoring/output/output.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/authoring/input/input.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/element_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/api.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/signal.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/query_list.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/skip_hydration.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/constants.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/lview_tracking.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/context.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/context_discovery.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/view_traversal_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/discovery_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/document.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/application_tokens.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/transfer_state.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/interfaces.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/tokens.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/tracing.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/performance.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/asserts.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view_context.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/after_render/api.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/after_render/manager.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/after_render/hooks.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/interfaces.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/cleanup.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/dom_triggers.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/event_delegation_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/registry.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/queries/query_execution.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/metadata/view.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/security/trusted_types.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/security/trusted_types_bypass.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/sanitization/bypass.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/sanitization/inert_body.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/sanitization/url_sanitizer.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/sanitization/html_sanitizer.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/sanitization/security.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/sanitization/sanitization.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/dom.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/ng_reflect.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/metadata/schema.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/element_validation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/misc_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/errors.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/styling/class_differ.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/node_selector_matcher.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/tokens.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/dom_node_manipulation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view/construction.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/advance.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/input_flags.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/write_to_directive_input.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/shared.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/render.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view_manipulation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_tree_shaking.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render/api_flags.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/i18n/utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/node_manipulation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/collect_native_nodes.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/after_render/view.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactive_lview_consumer.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/view_effect_runner.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/change_detection.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/mark_view_dirty.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view/container.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/template_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/error_handling.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/node_manipulation_i18n.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/tnode_manipulation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_insert_before_index.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_util.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_icu_container_visitor.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/compression.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/node_lookup_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/i18n.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/cleanup.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/views.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/component_factory.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/component_factory_resolver.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render/api.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/sanitization/sanitizer.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/jit/util.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/deps_tracker/deps_tracker.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/view/provider_flags.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/chained_injector.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/styling/static_styling.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/di.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view/directives.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view/elements.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/component_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/view_container_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/queries/query.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/queries/query_reactive.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/authoring/queries.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/authoring/model/model_signal.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/authoring/model/model.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/metadata/di.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/metadata/resource_loading.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/ng_module_registration.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/sanitization/iframe_attrs_validation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/ng_module_factory.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/ng_module_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/standalone_service.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/definition.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/features/inherit_definition_feature.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/features/copy_definition_feature.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/features/host_directives_feature.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/iterable.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/comparison.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/bindings.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/template.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/idle_scheduler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/timer_scheduler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/cached_injector_service.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/rendering.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/metadata.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/console.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/debug/framework_injector_profiler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/change_detection_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/discovery.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/defer.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/injector_discovery_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/signal_debug.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/util/global_utils.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/testability/testability.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/root_effect_scheduler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/lang.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/application_init.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/application_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/triggering.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/defer/instructions.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/attribute.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/interpolation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/attribute_interpolation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/styling.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/styling/style_binding_list.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/styling/styling_parser.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/property.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/styling.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/class_map_interpolation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/component_instance.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/list_reconciliation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/control_flow.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/element.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/element_container.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/get_current_view.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/host_property.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/i18n/locale_en.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/i18n/locale_data_api.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/i18n/localization.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/interfaces/i18n.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_locale_id.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_apply.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_debug.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_parse.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/i18n/i18n_postprocess.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/i18n.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view/listeners.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view/directive_outputs.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/listener.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/next_context.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/projection.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/property_interpolation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/queries.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/queries_signals.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/storage.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/style_map_interpolation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/style_prop_interpolation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/text.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/text_interpolation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/two_way.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/let_declaration.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/instructions/attach_source_locations.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/di_setup.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/features/providers_feature.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/features/external_styles_feature.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/scope.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/pure_function.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/view_engine_compatibility_prebound.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/local_compilation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/debug/set_debug_info.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/hmr.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/jit/environment.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/jit/jit_options.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/jit/module.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/jit/directive.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/jit/pipe.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/metadata/directives.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/metadata/ng_module.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/version.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/compiler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/application_ngmodule_factory_compiler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/scheduling/zoneless_scheduling_impl.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/i18n/tokens.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/image_performance_warning.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/platform/platform_destroy_listeners.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/platform/bootstrap.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/platform/platform_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/platform/platform.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/scheduling/exhaustive_check_no_changes.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/is_dev_mode.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/ng_module_factory_loader.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/change_detector_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/linker/view_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/debug/debug_node.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/differs/default_iterable_differ.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/differs/default_keyvalue_differ.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/differs/iterable_differs.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/differs/keyvalue_differs.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/change_detection/change_detection.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/platform/platform_core_providers.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/application_module.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/create_application.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/event_replay.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/annotate.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/hydration/api.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/util/coercion.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/profiler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/untracked.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/computed.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/microtask_effect.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/effect.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/resource/api.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/linked_signal.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/resource/resource.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/internal/get_closest_component_name.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/jit/partial.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/reactivity/after_render_effect.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/render3/component.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/application_config.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/src/application/platform_tokens.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Base URL for the error details page.\n *\n * Keep this constant in sync across:\n *  - packages/compiler-cli/src/ngtsc/diagnostics/src/error_details_base_url.ts\n *  - packages/core/src/error_details_base_url.ts\n */\nexport const ERROR_DETAILS_PAGE_BASE_URL = 'https://angular.dev/errors';\n\n/**\n * URL for the XSS security documentation.\n */\nexport const XSS_SECURITY_URL =\n  'https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ERROR_DETAILS_PAGE_BASE_URL} from './error_details_base_url';\n\n/**\n * The list of error codes used in runtime code of the `core` package.\n * Reserved error code range: 100-999.\n *\n * Note: the minus sign denotes the fact that a particular code has a detailed guide on\n * angular.io. This extra annotation is needed to avoid introducing a separate set to store\n * error codes which have guides, which might leak into runtime code.\n *\n * Full list of available error guides can be found at https://angular.dev/errors.\n *\n * Error code ranges per package:\n *  - core (this package): 100-999\n *  - forms: 1000-1999\n *  - common: 2000-2999\n *  - animations: 3000-3999\n *  - router: 4000-4999\n *  - platform-browser: 5000-5500\n */\nexport const enum RuntimeErrorCode {\n  // Change Detection Errors\n  EXPRESSION_CHANGED_AFTER_CHECKED = -100,\n  RECURSIVE_APPLICATION_REF_TICK = 101,\n  INFINITE_CHANGE_DETECTION = 103,\n\n  // Dependency Injection Errors\n  CYCLIC_DI_DEPENDENCY = -200,\n  PROVIDER_NOT_FOUND = -201,\n  INVALID_FACTORY_DEPENDENCY = 202,\n  MISSING_INJECTION_CONTEXT = -203,\n  INVALID_INJECTION_TOKEN = 204,\n  INJECTOR_ALREADY_DESTROYED = 205,\n  PROVIDER_IN_WRONG_CONTEXT = 207,\n  MISSING_INJECTION_TOKEN = 208,\n  INVALID_MULTI_PROVIDER = -209,\n  MISSING_DOCUMENT = 210,\n\n  // Template Errors\n  MULTIPLE_COMPONENTS_MATCH = -300,\n  EXPORT_NOT_FOUND = -301,\n  PIPE_NOT_FOUND = -302,\n  UNKNOWN_BINDING = 303,\n  UNKNOWN_ELEMENT = 304,\n  TEMPLATE_STRUCTURE_ERROR = 305,\n  INVALID_EVENT_BINDING = 306,\n  HOST_DIRECTIVE_UNRESOLVABLE = 307,\n  HOST_DIRECTIVE_NOT_STANDALONE = 308,\n  DUPLICATE_DIRECTIVE = 309,\n  HOST_DIRECTIVE_COMPONENT = 310,\n  HOST_DIRECTIVE_UNDEFINED_BINDING = 311,\n  HOST_DIRECTIVE_CONFLICTING_ALIAS = 312,\n  MULTIPLE_MATCHING_PIPES = 313,\n  UNINITIALIZED_LET_ACCESS = 314,\n\n  // Bootstrap Errors\n  MULTIPLE_PLATFORMS = 400,\n  PLATFORM_NOT_FOUND = 401,\n  MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP = 402,\n  BOOTSTRAP_COMPONENTS_NOT_FOUND = -403,\n  PLATFORM_ALREADY_DESTROYED = 404,\n  ASYNC_INITIALIZERS_STILL_RUNNING = 405,\n  APPLICATION_REF_ALREADY_DESTROYED = 406,\n  RENDERER_NOT_FOUND = 407,\n  PROVIDED_BOTH_ZONE_AND_ZONELESS = 408,\n\n  // Hydration Errors\n  HYDRATION_NODE_MISMATCH = -500,\n  HYDRATION_MISSING_SIBLINGS = -501,\n  HYDRATION_MISSING_NODE = -502,\n  UNSUPPORTED_PROJECTION_DOM_NODES = -503,\n  INVALID_SKIP_HYDRATION_HOST = -504,\n  MISSING_HYDRATION_ANNOTATIONS = -505,\n  HYDRATION_STABLE_TIMEDOUT = -506,\n  MISSING_SSR_CONTENT_INTEGRITY_MARKER = -507,\n  MISCONFIGURED_INCREMENTAL_HYDRATION = 508,\n\n  // Signal Errors\n  SIGNAL_WRITE_FROM_ILLEGAL_CONTEXT = 600,\n  REQUIRE_SYNC_WITHOUT_SYNC_EMIT = 601,\n  ASSERTION_NOT_INSIDE_REACTIVE_CONTEXT = -602,\n\n  // Styling Errors\n\n  // Declarations Errors\n\n  // i18n Errors\n  INVALID_I18N_STRUCTURE = 700,\n  MISSING_LOCALE_DATA = 701,\n\n  // Defer errors (750-799 range)\n  DEFER_LOADING_FAILED = -750,\n  DEFER_IN_HMR_MODE = -751,\n\n  // standalone errors\n  IMPORT_PROVIDERS_FROM_STANDALONE = 800,\n\n  // JIT Compilation Errors\n  // Other\n  INVALID_DIFFER_INPUT = 900,\n  NO_SUPPORTING_DIFFER_FACTORY = 901,\n  VIEW_ALREADY_ATTACHED = 902,\n  INVALID_INHERITANCE = 903,\n  UNSAFE_VALUE_IN_RESOURCE_URL = 904,\n  UNSAFE_VALUE_IN_SCRIPT = 905,\n  MISSING_GENERATED_DEF = 906,\n  TYPE_IS_NOT_STANDALONE = 907,\n  MISSING_ZONEJS = 908,\n  UNEXPECTED_ZONE_STATE = 909,\n  UNSAFE_IFRAME_ATTRS = -910,\n  VIEW_ALREADY_DESTROYED = 911,\n  COMPONENT_ID_COLLISION = -912,\n  IMAGE_PERFORMANCE_WARNING = -913,\n  UNEXPECTED_ZONEJS_PRESENT_IN_ZONELESS_MODE = 914,\n\n  // Signal integration errors\n  REQUIRED_INPUT_NO_VALUE = -950,\n  REQUIRED_QUERY_NO_VALUE = -951,\n  REQUIRED_MODEL_NO_VALUE = 952,\n\n  // Output()\n  OUTPUT_REF_DESTROYED = 953,\n\n  // Repeater errors\n  LOOP_TRACK_DUPLICATE_KEYS = -955,\n  LOOP_TRACK_RECREATE = -956,\n\n  // Runtime dependency tracker errors\n  RUNTIME_DEPS_INVALID_IMPORTED_TYPE = 980,\n  RUNTIME_DEPS_ORPHAN_COMPONENT = 981,\n\n  // Upper bounds for core runtime errors is 999\n}\n\n/**\n * Class that represents a runtime error.\n * Formats and outputs the error message in a consistent way.\n *\n * Example:\n * ```ts\n *  throw new RuntimeError(\n *    RuntimeErrorCode.INJECTOR_ALREADY_DESTROYED,\n *    ngDevMode && 'Injector has already been destroyed.');\n * ```\n *\n * Note: the `message` argument contains a descriptive error message as a string in development\n * mode (when the `ngDevMode` is defined). In production mode (after tree-shaking pass), the\n * `message` argument becomes `false`, thus we account for it in the typings and the runtime\n * logic.\n */\nexport class RuntimeError<T extends number = RuntimeErrorCode> extends Error {\n  constructor(\n    public code: T,\n    message: null | false | string,\n  ) {\n    super(formatRuntimeError<T>(code, message));\n  }\n}\n\nexport function formatRuntimeErrorCode<T extends number = RuntimeErrorCode>(code: T): string {\n  // Error code might be a negative number, which is a special marker that instructs the logic to\n  // generate a link to the error details page on angular.io.\n  // We also prepend `0` to non-compile-time errors.\n  return `NG0${Math.abs(code)}`;\n}\n\n/**\n * Called to format a runtime error.\n * See additional info on the `message` argument type in the `RuntimeError` class description.\n */\nexport function formatRuntimeError<T extends number = RuntimeErrorCode>(\n  code: T,\n  message: null | false | string,\n): string {\n  const fullCode = formatRuntimeErrorCode(code);\n\n  let errorMessage = `${fullCode}${message ? ': ' + message : ''}`;\n\n  if (ngDevMode && code < 0) {\n    const addPeriodSeparator = !errorMessage.match(/[.,;!?\\n]$/);\n    const separator = addPeriodSeparator ? '.' : '';\n    errorMessage = `${errorMessage}${separator} Find more at ${ERROR_DETAILS_PAGE_BASE_URL}/${fullCode}`;\n  }\n  return errorMessage;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {SIGNAL_NODE, SignalNode, signalSetFn} from '../../../primitives/signals';\n\nexport const REQUIRED_UNSET_VALUE: unique symbol = /* @__PURE__ */ Symbol('InputSignalNode#UNSET');\n\n/**\n * Reactive node type for an input signal. An input signal extends a signal.\n * There are special properties to enable transforms and required inputs.\n */\nexport interface InputSignalNode<T, TransformT> extends SignalNode<T> {\n  /**\n   * User-configured transform that will run whenever a new value is applied\n   * to the input signal node.\n   */\n  transformFn: ((value: TransformT) => T) | undefined;\n\n  /**\n   * Applies a new value to the input signal. Expects transforms to be run\n   * manually before.\n   *\n   * This function is called by the framework runtime code whenever a binding\n   * changes. The value can in practice be anything at runtime, but for typing\n   * purposes we assume it's a valid `T` value. Type-checking will enforce that.\n   */\n  applyValueToInputSignal<T, TransformT>(node: InputSignalNode<T, TransformT>, value: T): void;\n\n  /**\n   * A debug name for the input signal. Used in Angular DevTools to identify the signal.\n   */\n  debugName?: string;\n}\n\n// Note: Using an IIFE here to ensure that the spread assignment is not considered\n// a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.\n// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.\nexport const INPUT_SIGNAL_NODE: InputSignalNode<unknown, unknown> = /* @__PURE__ */ (() => {\n  return {\n    ...SIGNAL_NODE,\n    transformFn: undefined,\n\n    applyValueToInputSignal<T, TransformT>(node: InputSignalNode<T, TransformT>, value: T) {\n      signalSetFn(node, value);\n    },\n  };\n})();\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {producerAccessed, SIGNAL} from '../../../primitives/signals';\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {Signal} from '../../render3/reactivity/api';\n\nimport {INPUT_SIGNAL_NODE, InputSignalNode, REQUIRED_UNSET_VALUE} from './input_signal_node';\n\n/**\n * @publicAPI\n *\n * Options for signal inputs.\n */\nexport interface InputOptions<T, TransformT> {\n  /** Optional public name for the input. By default, the class field name is used. */\n  alias?: string;\n  /**\n   * Optional transform that runs whenever a new value is bound. Can be used to\n   * transform the input value before the input is updated.\n   *\n   * The transform function can widen the type of the input. For example, consider\n   * an input for `disabled`. In practice, as the component author, you want to only\n   * deal with a boolean, but users may want to bind a string if they just use the\n   * attribute form to bind to the input via `<my-dir input>`. A transform can then\n   * handle such string values and convert them to `boolean`. See: {@link booleanAttribute}.\n   */\n  transform?: (v: TransformT) => T;\n\n  /**\n   * A debug name for the input signal. Used in Angular DevTools to identify the signal.\n   */\n  debugName?: string;\n}\n\n/**\n * Signal input options without the transform option.\n *\n * @publicAPI\n */\nexport type InputOptionsWithoutTransform<T> =\n  // Note: We still keep a notion of `transform` for auto-completion.\n  Omit<InputOptions<T, T>, 'transform'> & {transform?: undefined};\n/**\n * Signal input options with the transform option required.\n *\n * @publicAPI\n */\nexport type InputOptionsWithTransform<T, TransformT> = Required<\n  Pick<InputOptions<T, TransformT>, 'transform'>\n> &\n  InputOptions<T, TransformT>;\n\nexport const ɵINPUT_SIGNAL_BRAND_READ_TYPE: unique symbol = /* @__PURE__ */ Symbol();\nexport const ɵINPUT_SIGNAL_BRAND_WRITE_TYPE: unique symbol = /* @__PURE__ */ Symbol();\n\n/**\n * `InputSignalWithTransform` represents a special `Signal` for a\n * directive/component input with a `transform` function.\n *\n * Signal inputs with transforms capture an extra generic for their transform write\n * type. Transforms can expand the accepted bound values for an input while ensuring\n * value retrievals of the signal input are still matching the generic input type.\n *\n * ```ts\n * class MyDir {\n *   disabled = input(false, {\n *     transform: (v: string|boolean) => convertToBoolean(v),\n *   }); // InputSignalWithTransform<boolean, string|boolean>\n *\n *   click() {\n *     this.disabled() // always returns a `boolean`.\n *   }\n * }\n * ```\n *\n * @see {@link InputSignal} for additional information.\n *\n * @publicAPI\n */\nexport interface InputSignalWithTransform<T, TransformT> extends Signal<T> {\n  [SIGNAL]: InputSignalNode<T, TransformT>;\n  [ɵINPUT_SIGNAL_BRAND_READ_TYPE]: T;\n  [ɵINPUT_SIGNAL_BRAND_WRITE_TYPE]: TransformT;\n}\n\n/**\n * `InputSignal` represents a special `Signal` for a directive/component input.\n *\n * An input signal is similar to a non-writable signal except that it also\n * carries additional type-information for transforms, and that Angular internally\n * updates the signal whenever a new value is bound.\n *\n * @see {@link InputOptionsWithTransform} for inputs with transforms.\n *\n * @publicAPI\n */\nexport interface InputSignal<T> extends InputSignalWithTransform<T, T> {}\n\n/**\n * Creates an input signal.\n *\n * @param initialValue The initial value.\n *   Can be set to {@link REQUIRED_UNSET_VALUE} for required inputs.\n * @param options Additional options for the input. e.g. a transform, or an alias.\n */\nexport function createInputSignal<T, TransformT>(\n  initialValue: T,\n  options?: InputOptions<T, TransformT>,\n): InputSignalWithTransform<T, TransformT> {\n  const node: InputSignalNode<T, TransformT> = Object.create(INPUT_SIGNAL_NODE);\n\n  node.value = initialValue;\n\n  // Perf note: Always set `transformFn` here to ensure that `node` always\n  // has the same v8 class shape, allowing monomorphic reads on input signals.\n  node.transformFn = options?.transform;\n\n  function inputValueFn() {\n    // Record that someone looked at this signal.\n    producerAccessed(node);\n\n    if (node.value === REQUIRED_UNSET_VALUE) {\n      let message: string | null = null;\n      if (ngDevMode) {\n        const name = options?.debugName ?? options?.alias;\n        message = `Input${name ? ` \"${name}\"` : ''} is required but no value is available yet.`;\n      }\n      throw new RuntimeError(RuntimeErrorCode.REQUIRED_INPUT_NO_VALUE, message);\n    }\n\n    return node.value;\n  }\n\n  (inputValueFn as any)[SIGNAL] = node;\n\n  if (ngDevMode) {\n    inputValueFn.toString = () => `[Input Signal: ${inputValueFn()}]`;\n    node.debugName = options?.debugName;\n  }\n\n  return inputValueFn as InputSignalWithTransform<T, TransformT>;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Convince closure compiler that the wrapped function has no side-effects.\n *\n * Closure compiler always assumes that `toString` has no side-effects. We use this quirk to\n * allow us to execute a function but have closure compiler mark the call as no-side-effects.\n * It is important that the return value for the `noSideEffects` function be assigned\n * to something which is retained otherwise the call to `noSideEffects` will be removed by closure\n * compiler.\n */\nexport function noSideEffects<T>(fn: () => T): T {\n  return {toString: fn}.toString() as unknown as T;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\n\nimport {noSideEffects} from './closure';\n\n/**\n * An interface implemented by all Angular type decorators, which allows them to be used as\n * decorators as well as Angular syntax.\n *\n * ```ts\n * @ng.Component({...})\n * class MyClass {...}\n * ```\n *\n * @publicApi\n */\nexport interface TypeDecorator {\n  /**\n   * Invoke as decorator.\n   */\n  <T extends Type<any>>(type: T): T;\n\n  // Make TypeDecorator assignable to built-in ParameterDecorator type.\n  // ParameterDecorator is declared in lib.d.ts as a `declare type`\n  // so we cannot declare this interface as a subtype.\n  // see https://github.com/angular/angular/issues/3379#issuecomment-126169417\n  (target: Object, propertyKey?: string | symbol, parameterIndex?: number): void;\n  // Standard (non-experimental) Decorator signature that avoids direct usage of\n  // any TS 5.0+ specific types.\n  (target: unknown, context: unknown): void;\n}\n\nexport const ANNOTATIONS = '__annotations__';\nexport const PARAMETERS = '__parameters__';\nexport const PROP_METADATA = '__prop__metadata__';\n\n/**\n * @suppress {globalThis}\n */\nexport function makeDecorator<T>(\n  name: string,\n  props?: (...args: any[]) => any,\n  parentClass?: any,\n  additionalProcessing?: (type: Type<T>) => void,\n  typeFn?: (type: Type<T>, ...args: any[]) => void,\n): {new (...args: any[]): any; (...args: any[]): any; (...args: any[]): (cls: any) => any} {\n  return noSideEffects(() => {\n    const metaCtor = makeMetadataCtor(props);\n\n    function DecoratorFactory(\n      this: unknown | typeof DecoratorFactory,\n      ...args: any[]\n    ): (cls: Type<T>) => any {\n      if (this instanceof DecoratorFactory) {\n        metaCtor.call(this, ...args);\n        return this as typeof DecoratorFactory;\n      }\n\n      const annotationInstance = new (DecoratorFactory as any)(...args);\n      return function TypeDecorator(cls: Type<T>) {\n        if (typeFn) typeFn(cls, ...args);\n        // Use of Object.defineProperty is important since it creates non-enumerable property which\n        // prevents the property is copied during subclassing.\n        const annotations = cls.hasOwnProperty(ANNOTATIONS)\n          ? (cls as any)[ANNOTATIONS]\n          : (Object.defineProperty(cls, ANNOTATIONS, {value: []}) as any)[ANNOTATIONS];\n        annotations.push(annotationInstance);\n\n        if (additionalProcessing) additionalProcessing(cls);\n\n        return cls;\n      };\n    }\n\n    if (parentClass) {\n      DecoratorFactory.prototype = Object.create(parentClass.prototype);\n    }\n\n    DecoratorFactory.prototype.ngMetadataName = name;\n    (DecoratorFactory as any).annotationCls = DecoratorFactory;\n    return DecoratorFactory as any;\n  });\n}\n\nfunction makeMetadataCtor(props?: (...args: any[]) => any): any {\n  return function ctor(this: any, ...args: any[]) {\n    if (props) {\n      const values = props(...args);\n      for (const propName in values) {\n        this[propName] = values[propName];\n      }\n    }\n  };\n}\n\nexport function makeParamDecorator(\n  name: string,\n  props?: (...args: any[]) => any,\n  parentClass?: any,\n): any {\n  return noSideEffects(() => {\n    const metaCtor = makeMetadataCtor(props);\n    function ParamDecoratorFactory(\n      this: unknown | typeof ParamDecoratorFactory,\n      ...args: any[]\n    ): any {\n      if (this instanceof ParamDecoratorFactory) {\n        metaCtor.apply(this, args);\n        return this;\n      }\n      const annotationInstance = new (<any>ParamDecoratorFactory)(...args);\n\n      (<any>ParamDecorator).annotation = annotationInstance;\n      return ParamDecorator;\n\n      function ParamDecorator(cls: any, unusedKey: any, index: number): any {\n        // Use of Object.defineProperty is important since it creates non-enumerable property which\n        // prevents the property is copied during subclassing.\n        const parameters = cls.hasOwnProperty(PARAMETERS)\n          ? (cls as any)[PARAMETERS]\n          : Object.defineProperty(cls, PARAMETERS, {value: []})[PARAMETERS];\n\n        // there might be gaps if some in between parameters do not have annotations.\n        // we pad with nulls.\n        while (parameters.length <= index) {\n          parameters.push(null);\n        }\n\n        (parameters[index] = parameters[index] || []).push(annotationInstance);\n        return cls;\n      }\n    }\n    if (parentClass) {\n      ParamDecoratorFactory.prototype = Object.create(parentClass.prototype);\n    }\n    ParamDecoratorFactory.prototype.ngMetadataName = name;\n    (<any>ParamDecoratorFactory).annotationCls = ParamDecoratorFactory;\n    return ParamDecoratorFactory;\n  });\n}\n\nexport function makePropDecorator(\n  name: string,\n  props?: (...args: any[]) => any,\n  parentClass?: any,\n  additionalProcessing?: (target: any, name: string, ...args: any[]) => void,\n): any {\n  return noSideEffects(() => {\n    const metaCtor = makeMetadataCtor(props);\n\n    function PropDecoratorFactory(\n      this: unknown | typeof PropDecoratorFactory,\n      ...args: any[]\n    ): any {\n      if (this instanceof PropDecoratorFactory) {\n        metaCtor.apply(this, args);\n        return this;\n      }\n\n      const decoratorInstance = new (<any>PropDecoratorFactory)(...args);\n\n      function PropDecorator(target: any, name: string) {\n        // target is undefined with standard decorators. This case is not supported and will throw\n        // if this decorator is used in JIT mode with standard decorators.\n        if (target === undefined) {\n          throw new Error('Standard Angular field decorators are not supported in JIT mode.');\n        }\n\n        const constructor = target.constructor;\n        // Use of Object.defineProperty is important because it creates a non-enumerable property\n        // which prevents the property from being copied during subclassing.\n        const meta = constructor.hasOwnProperty(PROP_METADATA)\n          ? (constructor as any)[PROP_METADATA]\n          : Object.defineProperty(constructor, PROP_METADATA, {value: {}})[PROP_METADATA];\n        meta[name] = (meta.hasOwnProperty(name) && meta[name]) || [];\n        meta[name].unshift(decoratorInstance);\n\n        if (additionalProcessing) additionalProcessing(target, name, ...args);\n      }\n\n      return PropDecorator;\n    }\n\n    if (parentClass) {\n      PropDecoratorFactory.prototype = Object.create(parentClass.prototype);\n    }\n\n    PropDecoratorFactory.prototype.ngMetadataName = name;\n    (<any>PropDecoratorFactory).annotationCls = PropDecoratorFactory;\n    return PropDecoratorFactory;\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nconst _global: any = globalThis;\n\n/**\n * Attention: whenever providing a new value, be sure to add an\n * entry into the corresponding `....externs.js` file,\n * so that closure won't use that global for its purposes.\n */\nexport {_global as global};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {global} from './global';\n\ndeclare global {\n  /**\n   * Values of ngDevMode\n   * Depending on the current state of the application, ngDevMode may have one of several values.\n   *\n   * For convenience, the “truthy” value which enables dev mode is also an object which contains\n   * Angular’s performance counters. This is not necessary, but cuts down on boilerplate for the\n   * perf counters.\n   *\n   * ngDevMode may also be set to false. This can happen in one of a few ways:\n   * - The user explicitly sets `window.ngDevMode = false` somewhere in their app.\n   * - The user calls `enableProdMode()`.\n   * - The URL contains a `ngDevMode=false` text.\n   * Finally, ngDevMode may not have been defined at all.\n   */\n  const ngDevMode: null | NgDevModePerfCounters;\n\n  interface NgDevModePerfCounters {\n    namedConstructors: boolean;\n    firstCreatePass: number;\n    tNode: number;\n    tView: number;\n    rendererCreateTextNode: number;\n    rendererSetText: number;\n    rendererCreateElement: number;\n    rendererAddEventListener: number;\n    rendererSetAttribute: number;\n    rendererRemoveAttribute: number;\n    rendererSetProperty: number;\n    rendererSetClassName: number;\n    rendererAddClass: number;\n    rendererRemoveClass: number;\n    rendererSetStyle: number;\n    rendererRemoveStyle: number;\n    rendererDestroy: number;\n    rendererDestroyNode: number;\n    rendererMoveNode: number;\n    rendererRemoveNode: number;\n    rendererAppendChild: number;\n    rendererInsertBefore: number;\n    rendererCreateComment: number;\n    hydratedNodes: number;\n    hydratedComponents: number;\n    dehydratedViewsRemoved: number;\n    dehydratedViewsCleanupRuns: number;\n    componentsSkippedHydration: number;\n    deferBlocksWithIncrementalHydration: number;\n  }\n}\n\nexport function ngDevModeResetPerfCounters(): NgDevModePerfCounters {\n  const locationString = typeof location !== 'undefined' ? location.toString() : '';\n  const newCounters: NgDevModePerfCounters = {\n    namedConstructors: locationString.indexOf('ngDevMode=namedConstructors') != -1,\n    firstCreatePass: 0,\n    tNode: 0,\n    tView: 0,\n    rendererCreateTextNode: 0,\n    rendererSetText: 0,\n    rendererCreateElement: 0,\n    rendererAddEventListener: 0,\n    rendererSetAttribute: 0,\n    rendererRemoveAttribute: 0,\n    rendererSetProperty: 0,\n    rendererSetClassName: 0,\n    rendererAddClass: 0,\n    rendererRemoveClass: 0,\n    rendererSetStyle: 0,\n    rendererRemoveStyle: 0,\n    rendererDestroy: 0,\n    rendererDestroyNode: 0,\n    rendererMoveNode: 0,\n    rendererRemoveNode: 0,\n    rendererAppendChild: 0,\n    rendererInsertBefore: 0,\n    rendererCreateComment: 0,\n    hydratedNodes: 0,\n    hydratedComponents: 0,\n    dehydratedViewsRemoved: 0,\n    dehydratedViewsCleanupRuns: 0,\n    componentsSkippedHydration: 0,\n    deferBlocksWithIncrementalHydration: 0,\n  };\n\n  // Make sure to refer to ngDevMode as ['ngDevMode'] for closure.\n  const allowNgDevModeTrue = locationString.indexOf('ngDevMode=false') === -1;\n  if (!allowNgDevModeTrue) {\n    global['ngDevMode'] = false;\n  } else {\n    if (typeof global['ngDevMode'] !== 'object') {\n      global['ngDevMode'] = {};\n    }\n    Object.assign(global['ngDevMode'], newCounters);\n  }\n  return newCounters;\n}\n\n/**\n * This function checks to see if the `ngDevMode` has been set. If yes,\n * then we honor it, otherwise we default to dev mode with additional checks.\n *\n * The idea is that unless we are doing production build where we explicitly\n * set `ngDevMode == false` we should be helping the developer by providing\n * as much early warning and errors as possible.\n *\n * `ɵɵdefineComponent` is guaranteed to have been called before any component template functions\n * (and thus Ivy instructions), so a single initialization there is sufficient to ensure ngDevMode\n * is defined for the entire instruction set.\n *\n * When checking `ngDevMode` on toplevel, always init it before referencing it\n * (e.g. `((typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode())`), otherwise you can\n *  get a `ReferenceError` like in https://github.com/angular/angular/issues/31595.\n *\n * Details on possible values for `ngDevMode` can be found on its docstring.\n *\n * NOTE:\n * - changes to the `ngDevMode` name must be synced with `compiler-cli/src/tooling.ts`.\n */\nexport function initNgDevMode(): boolean {\n  // The below checks are to ensure that calling `initNgDevMode` multiple times does not\n  // reset the counters.\n  // If the `ngDevMode` is not an object, then it means we have not created the perf counters\n  // yet.\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    if (typeof ngDevMode !== 'object' || Object.keys(ngDevMode).length === 0) {\n      ngDevModeResetPerfCounters();\n    }\n    return typeof ngDevMode !== 'undefined' && !!ngDevMode;\n  }\n  return false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport function getClosureSafeProperty<T>(objWithPropertyToExtract: T): string {\n  for (let key in objWithPropertyToExtract) {\n    if (objWithPropertyToExtract[key] === (getClosureSafeProperty as any)) {\n      return key;\n    }\n  }\n  throw Error('Could not find renamed property on target object.');\n}\n\n/**\n * Sets properties on a target object from a source object, but only if\n * the property doesn't already exist on the target object.\n * @param target The target to set properties on\n * @param source The source of the property keys and values to set\n */\nexport function fillProperties(target: Record<string, unknown>, source: Record<string, unknown>) {\n  for (const key in source) {\n    if (source.hasOwnProperty(key) && !target.hasOwnProperty(key)) {\n      target[key] = source[key];\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport function stringify(token: any): string {\n  if (typeof token === 'string') {\n    return token;\n  }\n\n  if (Array.isArray(token)) {\n    return `[${token.map(stringify).join(', ')}]`;\n  }\n\n  if (token == null) {\n    return '' + token;\n  }\n\n  const name = token.overriddenName || token.name;\n  if (name) {\n    return `${name}`;\n  }\n\n  const result = token.toString();\n\n  if (result == null) {\n    return '' + result;\n  }\n\n  const newLineIndex = result.indexOf('\\n');\n  return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result;\n}\n\n/**\n * Concatenates two strings with separator, allocating new strings only when necessary.\n *\n * @param before before string.\n * @param separator separator string.\n * @param after after string.\n * @returns concatenated string.\n */\nexport function concatStringsWithSpace(before: string | null, after: string | null): string {\n  if (!before) return after || '';\n  if (!after) return before;\n  return `${before} ${after}`;\n}\n\n/**\n * Ellipses the string in the middle when longer than the max length\n *\n * @param string\n * @param maxLength of the output string\n * @returns ellipsed string with ... in the middle\n */\nexport function truncateMiddle(str: string, maxLength = 100): string {\n  if (!str || maxLength < 1 || str.length <= maxLength) return str;\n  if (maxLength == 1) return str.substring(0, 1) + '...';\n\n  const halfLimit = Math.round(maxLength / 2);\n  return str.substring(0, halfLimit) + '...' + str.substring(str.length - halfLimit);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {getClosureSafeProperty} from '../util/property';\nimport {stringify} from '../util/stringify';\n\n/**\n * An interface that a function passed into `forwardRef` has to implement.\n *\n * @usageNotes\n * ### Example\n *\n * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref_fn'}\n * @publicApi\n */\nexport interface ForwardRefFn {\n  (): any;\n}\n\nconst __forward_ref__ = getClosureSafeProperty({__forward_ref__: getClosureSafeProperty});\n\n/**\n * Allows to refer to references which are not yet defined.\n *\n * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of\n * DI is declared, but not yet defined. It is also used when the `token` which we use when creating\n * a query is not yet defined.\n *\n * `forwardRef` is also used to break circularities in standalone components imports.\n *\n * @usageNotes\n * ### Circular dependency example\n * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref'}\n *\n * ### Circular standalone reference import example\n * ```angular-ts\n * @Component({\n *   standalone: true,\n *   imports: [ChildComponent],\n *   selector: 'app-parent',\n *   template: `<app-child [hideParent]=\"hideParent\"></app-child>`,\n * })\n * export class ParentComponent {\n *   @Input() hideParent: boolean;\n * }\n *\n *\n * @Component({\n *   standalone: true,\n *   imports: [CommonModule, forwardRef(() => ParentComponent)],\n *   selector: 'app-child',\n *   template: `<app-parent *ngIf=\"!hideParent\"></   app-parent>`,\n * })\n * export class ChildComponent {\n *   @Input() hideParent: boolean;\n * }\n * ```\n *\n * @publicApi\n */\nexport function forwardRef(forwardRefFn: ForwardRefFn): Type<any> {\n  (<any>forwardRefFn).__forward_ref__ = forwardRef;\n  (<any>forwardRefFn).toString = function () {\n    return stringify(this());\n  };\n  return <Type<any>>(<any>forwardRefFn);\n}\n\n/**\n * Lazily retrieves the reference value from a forwardRef.\n *\n * Acts as the identity function when given a non-forward-ref value.\n *\n * @usageNotes\n * ### Example\n *\n * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='resolve_forward_ref'}\n *\n * @see {@link forwardRef}\n * @publicApi\n */\nexport function resolveForwardRef<T>(type: T): T {\n  return isForwardRef(type) ? type() : type;\n}\n\n/** Checks whether a function is wrapped by a `forwardRef`. */\nexport function isForwardRef(fn: any): fn is () => any {\n  return (\n    typeof fn === 'function' &&\n    fn.hasOwnProperty(__forward_ref__) &&\n    fn.__forward_ref__ === forwardRef\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// The functions in this file verify that the assumptions we are making\n// about state in an instruction are correct before implementing any logic.\n// They are meant only to be called in dev mode as sanity checks.\n\nimport {getActiveConsumer} from '../../primitives/signals';\n\nimport {stringify} from './stringify';\n\nexport function assertNumber(actual: any, msg: string): asserts actual is number {\n  if (!(typeof actual === 'number')) {\n    throwError(msg, typeof actual, 'number', '===');\n  }\n}\n\nexport function assertNumberInRange(\n  actual: any,\n  minInclusive: number,\n  maxInclusive: number,\n): asserts actual is number {\n  assertNumber(actual, 'Expected a number');\n  assertLessThanOrEqual(actual, maxInclusive, 'Expected number to be less than or equal to');\n  assertGreaterThanOrEqual(actual, minInclusive, 'Expected number to be greater than or equal to');\n}\n\nexport function assertString(actual: any, msg: string): asserts actual is string {\n  if (!(typeof actual === 'string')) {\n    throwError(msg, actual === null ? 'null' : typeof actual, 'string', '===');\n  }\n}\n\nexport function assertFunction(actual: any, msg: string): asserts actual is Function {\n  if (!(typeof actual === 'function')) {\n    throwError(msg, actual === null ? 'null' : typeof actual, 'function', '===');\n  }\n}\n\nexport function assertEqual<T>(actual: T, expected: T, msg: string) {\n  if (!(actual == expected)) {\n    throwError(msg, actual, expected, '==');\n  }\n}\n\nexport function assertNotEqual<T>(actual: T, expected: T, msg: string): asserts actual is T {\n  if (!(actual != expected)) {\n    throwError(msg, actual, expected, '!=');\n  }\n}\n\nexport function assertSame<T>(actual: T, expected: T, msg: string): asserts actual is T {\n  if (!(actual === expected)) {\n    throwError(msg, actual, expected, '===');\n  }\n}\n\nexport function assertNotSame<T>(actual: T, expected: T, msg: string) {\n  if (!(actual !== expected)) {\n    throwError(msg, actual, expected, '!==');\n  }\n}\n\nexport function assertLessThan<T>(actual: T, expected: T, msg: string): asserts actual is T {\n  if (!(actual < expected)) {\n    throwError(msg, actual, expected, '<');\n  }\n}\n\nexport function assertLessThanOrEqual<T>(actual: T, expected: T, msg: string): asserts actual is T {\n  if (!(actual <= expected)) {\n    throwError(msg, actual, expected, '<=');\n  }\n}\n\nexport function assertGreaterThan<T>(actual: T, expected: T, msg: string): asserts actual is T {\n  if (!(actual > expected)) {\n    throwError(msg, actual, expected, '>');\n  }\n}\n\nexport function assertGreaterThanOrEqual<T>(\n  actual: T,\n  expected: T,\n  msg: string,\n): asserts actual is T {\n  if (!(actual >= expected)) {\n    throwError(msg, actual, expected, '>=');\n  }\n}\n\nexport function assertNotDefined<T>(actual: T, msg: string) {\n  if (actual != null) {\n    throwError(msg, actual, null, '==');\n  }\n}\n\nexport function assertDefined<T>(actual: T | null | undefined, msg: string): asserts actual is T {\n  if (actual == null) {\n    throwError(msg, actual, null, '!=');\n  }\n}\n\nexport function throwError(msg: string): never;\nexport function throwError(msg: string, actual: any, expected: any, comparison: string): never;\nexport function throwError(msg: string, actual?: any, expected?: any, comparison?: string): never {\n  throw new Error(\n    `ASSERTION ERROR: ${msg}` +\n      (comparison == null ? '' : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`),\n  );\n}\n\nexport function assertDomNode(node: any): asserts node is Node {\n  if (!(node instanceof Node)) {\n    throwError(`The provided value must be an instance of a DOM Node but got ${stringify(node)}`);\n  }\n}\n\nexport function assertElement(node: any): asserts node is Element {\n  if (!(node instanceof Element)) {\n    throwError(`The provided value must be an element but got ${stringify(node)}`);\n  }\n}\n\nexport function assertIndexInRange(arr: any[], index: number) {\n  assertDefined(arr, 'Array must be defined.');\n  const maxLen = arr.length;\n  if (index < 0 || index >= maxLen) {\n    throwError(`Index expected to be less than ${maxLen} but got ${index}`);\n  }\n}\n\nexport function assertOneOf(value: any, ...validValues: any[]) {\n  if (validValues.indexOf(value) !== -1) return true;\n  throwError(\n    `Expected value to be one of ${JSON.stringify(validValues)} but was ${JSON.stringify(value)}.`,\n  );\n}\n\nexport function assertNotReactive(fn: string): void {\n  if (getActiveConsumer() !== null) {\n    throwError(`${fn}() should never be called in a reactive context.`);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../../interface/type';\nimport {getClosureSafeProperty} from '../../util/property';\n\nimport {\n  ClassProvider,\n  ConstructorProvider,\n  EnvironmentProviders,\n  ExistingProvider,\n  FactoryProvider,\n  StaticClassProvider,\n  ValueProvider,\n} from './provider';\n\n/**\n * Information about how a type or `InjectionToken` interfaces with the DI system.\n *\n * At a minimum, this includes a `factory` which defines how to create the given type `T`, possibly\n * requesting injection of other types if necessary.\n *\n * Optionally, a `providedIn` parameter specifies that the given type belongs to a particular\n * `Injector`, `NgModule`, or a special scope (e.g. `'root'`). A value of `null` indicates\n * that the injectable does not belong to any scope.\n *\n * @codeGenApi\n * @publicApi The ViewEngine compiler emits code with this type for injectables. This code is\n *   deployed to npm, and should be treated as public api.\n\n */\nexport interface ɵɵInjectableDeclaration<T> {\n  /**\n   * Specifies that the given type belongs to a particular injector:\n   * - `InjectorType` such as `NgModule`,\n   * - `'root'` the root injector\n   * - `'any'` all injectors.\n   * - `null`, does not belong to any injector. Must be explicitly listed in the injector\n   *   `providers`.\n   */\n  providedIn: InjectorType<any> | 'root' | 'platform' | 'any' | 'environment' | null;\n\n  /**\n   * The token to which this definition belongs.\n   *\n   * Note that this may not be the same as the type that the `factory` will create.\n   */\n  token: unknown;\n\n  /**\n   * Factory method to execute to create an instance of the injectable.\n   */\n  factory: (t?: Type<any>) => T;\n\n  /**\n   * In a case of no explicit injector, a location where the instance of the injectable is stored.\n   */\n  value: T | undefined;\n}\n\n/**\n * Information about the providers to be included in an `Injector` as well as how the given type\n * which carries the information should be created by the DI system.\n *\n * An `InjectorDef` can import other types which have `InjectorDefs`, forming a deep nested\n * structure of providers with a defined priority (identically to how `NgModule`s also have\n * an import/dependency structure).\n *\n * NOTE: This is a private type and should not be exported\n *\n * @codeGenApi\n */\nexport interface ɵɵInjectorDef<T> {\n  // TODO(alxhub): Narrow down the type here once decorators properly change the return type of the\n  // class they are decorating (to add the ɵprov property for example).\n  providers: (\n    | Type<any>\n    | ValueProvider\n    | ExistingProvider\n    | FactoryProvider\n    | ConstructorProvider\n    | StaticClassProvider\n    | ClassProvider\n    | EnvironmentProviders\n    | any[]\n  )[];\n\n  imports: (InjectorType<any> | InjectorTypeWithProviders<any>)[];\n}\n\n/**\n * A `Type` which has a `ɵprov: ɵɵInjectableDeclaration` static field.\n *\n * `InjectableType`s contain their own Dependency Injection metadata and are usable in an\n * `InjectorDef`-based `StaticInjector`.\n *\n * @publicApi\n */\nexport interface InjectableType<T> extends Type<T> {\n  /**\n   * Opaque type whose structure is highly version dependent. Do not rely on any properties.\n   */\n  ɵprov: unknown;\n}\n\n/**\n * A type which has an `InjectorDef` static field.\n *\n * `InjectorTypes` can be used to configure a `StaticInjector`.\n *\n * This is an opaque type whose structure is highly version dependent. Do not rely on any\n * properties.\n *\n * @publicApi\n */\nexport interface InjectorType<T> extends Type<T> {\n  ɵfac?: unknown;\n  ɵinj: unknown;\n}\n\n/**\n * Describes the `InjectorDef` equivalent of a `ModuleWithProviders`, an `InjectorType` with an\n * associated array of providers.\n *\n * Objects of this type can be listed in the imports section of an `InjectorDef`.\n *\n * NOTE: This is a private type and should not be exported\n */\nexport interface InjectorTypeWithProviders<T> {\n  ngModule: InjectorType<T>;\n  providers?: (\n    | Type<any>\n    | ValueProvider\n    | ExistingProvider\n    | FactoryProvider\n    | ConstructorProvider\n    | StaticClassProvider\n    | ClassProvider\n    | EnvironmentProviders\n    | any[]\n  )[];\n}\n\n/**\n * Construct an injectable definition which defines how a token will be constructed by the DI\n * system, and in which injectors (if any) it will be available.\n *\n * This should be assigned to a static `ɵprov` field on a type, which will then be an\n * `InjectableType`.\n *\n * Options:\n * * `providedIn` determines which injectors will include the injectable, by either associating it\n *   with an `@NgModule` or other `InjectorType`, or by specifying that this injectable should be\n *   provided in the `'root'` injector, which will be the application-level injector in most apps.\n * * `factory` gives the zero argument function which will create an instance of the injectable.\n *   The factory can call [`inject`](api/core/inject) to access the `Injector` and request injection\n * of dependencies.\n *\n * @codeGenApi\n * @publicApi This instruction has been emitted by ViewEngine for some time and is deployed to npm.\n */\nexport function ɵɵdefineInjectable<T>(opts: {\n  token: unknown;\n  providedIn?: Type<any> | 'root' | 'platform' | 'any' | 'environment' | null;\n  factory: () => T;\n}): unknown {\n  return {\n    token: opts.token,\n    providedIn: (opts.providedIn as any) || null,\n    factory: opts.factory,\n    value: undefined,\n  } as ɵɵInjectableDeclaration<T>;\n}\n\n/**\n * @deprecated in v8, delete after v10. This API should be used only by generated code, and that\n * code should now use ɵɵdefineInjectable instead.\n * @publicApi\n */\nexport const defineInjectable = ɵɵdefineInjectable;\n\n/**\n * Construct an `InjectorDef` which configures an injector.\n *\n * This should be assigned to a static injector def (`ɵinj`) field on a type, which will then be an\n * `InjectorType`.\n *\n * Options:\n *\n * * `providers`: an optional array of providers to add to the injector. Each provider must\n *   either have a factory or point to a type which has a `ɵprov` static property (the\n *   type must be an `InjectableType`).\n * * `imports`: an optional array of imports of other `InjectorType`s or `InjectorTypeWithModule`s\n *   whose providers will also be added to the injector. Locally provided types will override\n *   providers from imports.\n *\n * @codeGenApi\n */\nexport function ɵɵdefineInjector(options: {providers?: any[]; imports?: any[]}): unknown {\n  return {providers: options.providers || [], imports: options.imports || []};\n}\n\n/**\n * Read the injectable def (`ɵprov`) for `type` in a way which is immune to accidentally reading\n * inherited value.\n *\n * @param type A type which may have its own (non-inherited) `ɵprov`.\n */\nexport function getInjectableDef<T>(type: any): ɵɵInjectableDeclaration<T> | null {\n  return getOwnDefinition(type, NG_PROV_DEF) || getOwnDefinition(type, NG_INJECTABLE_DEF);\n}\n\nexport function isInjectable(type: any): boolean {\n  return getInjectableDef(type) !== null;\n}\n\n/**\n * Return definition only if it is defined directly on `type` and is not inherited from a base\n * class of `type`.\n */\nfunction getOwnDefinition<T>(type: any, field: string): ɵɵInjectableDeclaration<T> | null {\n  return type.hasOwnProperty(field) ? type[field] : null;\n}\n\n/**\n * Read the injectable def (`ɵprov`) for `type` or read the `ɵprov` from one of its ancestors.\n *\n * @param type A type which may have `ɵprov`, via inheritance.\n *\n * @deprecated Will be removed in a future version of Angular, where an error will occur in the\n *     scenario if we find the `ɵprov` on an ancestor only.\n */\nexport function getInheritedInjectableDef<T>(type: any): ɵɵInjectableDeclaration<T> | null {\n  const def = type && (type[NG_PROV_DEF] || type[NG_INJECTABLE_DEF]);\n\n  if (def) {\n    ngDevMode &&\n      console.warn(\n        `DEPRECATED: DI is instantiating a token \"${type.name}\" that inherits its @Injectable decorator but does not provide one itself.\\n` +\n          `This will become an error in a future version of Angular. Please add @Injectable() to the \"${type.name}\" class.`,\n      );\n    return def;\n  } else {\n    return null;\n  }\n}\n\n/**\n * Read the injector def type in a way which is immune to accidentally reading inherited value.\n *\n * @param type type which may have an injector def (`ɵinj`)\n */\nexport function getInjectorDef<T>(type: any): ɵɵInjectorDef<T> | null {\n  return type && (type.hasOwnProperty(NG_INJ_DEF) || type.hasOwnProperty(NG_INJECTOR_DEF))\n    ? (type as any)[NG_INJ_DEF]\n    : null;\n}\n\nexport const NG_PROV_DEF: string = getClosureSafeProperty({ɵprov: getClosureSafeProperty});\nexport const NG_INJ_DEF: string = getClosureSafeProperty({ɵinj: getClosureSafeProperty});\n\n// We need to keep these around so we can read off old defs if new defs are unavailable\nexport const NG_INJECTABLE_DEF: string = getClosureSafeProperty({\n  ngInjectableDef: getClosureSafeProperty,\n});\nexport const NG_INJECTOR_DEF: string = getClosureSafeProperty({\n  ngInjectorDef: getClosureSafeProperty,\n});\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {assertLessThan} from '../util/assert';\n\nimport {ɵɵdefineInjectable} from './interface/defs';\n\n/**\n * Creates a token that can be used in a DI Provider.\n *\n * Use an `InjectionToken` whenever the type you are injecting is not reified (does not have a\n * runtime representation) such as when injecting an interface, callable type, array or\n * parameterized type.\n *\n * `InjectionToken` is parameterized on `T` which is the type of object which will be returned by\n * the `Injector`. This provides an additional level of type safety.\n *\n * <div class=\"docs-alert docs-alert-helpful\">\n *\n * **Important Note**: Ensure that you use the same instance of the `InjectionToken` in both the\n * provider and the injection call. Creating a new instance of `InjectionToken` in different places,\n * even with the same description, will be treated as different tokens by Angular's DI system,\n * leading to a `NullInjectorError`.\n *\n * </div>\n *\n * {@example injection-token/src/main.ts region='InjectionToken'}\n *\n * When creating an `InjectionToken`, you can optionally specify a factory function which returns\n * (possibly by creating) a default value of the parameterized type `T`. This sets up the\n * `InjectionToken` using this factory as a provider as if it was defined explicitly in the\n * application's root injector. If the factory function, which takes zero arguments, needs to inject\n * dependencies, it can do so using the [`inject`](api/core/inject) function.\n * As you can see in the Tree-shakable InjectionToken example below.\n *\n * Additionally, if a `factory` is specified you can also specify the `providedIn` option, which\n * overrides the above behavior and marks the token as belonging to a particular `@NgModule` (note:\n * this option is now deprecated). As mentioned above, `'root'` is the default value for\n * `providedIn`.\n *\n * The `providedIn: NgModule` and `providedIn: 'any'` options are deprecated.\n *\n * @usageNotes\n * ### Basic Examples\n *\n * ### Plain InjectionToken\n *\n * {@example core/di/ts/injector_spec.ts region='InjectionToken'}\n *\n * ### Tree-shakable InjectionToken\n *\n * {@example core/di/ts/injector_spec.ts region='ShakableInjectionToken'}\n *\n * @publicApi\n */\nexport class InjectionToken<T> {\n  /** @internal */\n  readonly ngMetadataName = 'InjectionToken';\n\n  readonly ɵprov: unknown;\n\n  /**\n   * @param _desc   Description for the token,\n   *                used only for debugging purposes,\n   *                it should but does not need to be unique\n   * @param options Options for the token's usage, as described above\n   */\n  constructor(\n    protected _desc: string,\n    options?: {\n      providedIn?: Type<any> | 'root' | 'platform' | 'any' | null;\n      factory: () => T;\n    },\n  ) {\n    this.ɵprov = undefined;\n    if (typeof options == 'number') {\n      (typeof ngDevMode === 'undefined' || ngDevMode) &&\n        assertLessThan(options, 0, 'Only negative numbers are supported here');\n      // This is a special hack to assign __NG_ELEMENT_ID__ to this instance.\n      // See `InjectorMarkers`\n      (this as any).__NG_ELEMENT_ID__ = options;\n    } else if (options !== undefined) {\n      this.ɵprov = ɵɵdefineInjectable({\n        token: this,\n        providedIn: options.providedIn || 'root',\n        factory: options.factory,\n      });\n    }\n  }\n\n  /**\n   * @internal\n   */\n  get multi(): InjectionToken<Array<T>> {\n    return this as InjectionToken<Array<T>>;\n  }\n\n  toString(): string {\n    return `InjectionToken ${this._desc}`;\n  }\n}\n\nexport interface InjectableDefToken<T> extends InjectionToken<T> {\n  ɵprov: unknown;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {FactoryProvider} from '../../di';\nimport {resolveForwardRef} from '../../di/forward_ref';\nimport {InjectionToken} from '../../di/injection_token';\nimport type {Injector} from '../../di/injector';\nimport {InjectFlags, InjectOptions, InternalInjectFlags} from '../../di/interface/injector';\nimport type {SingleProvider} from '../../di/provider_collection';\nimport {Type} from '../../interface/type';\nimport {throwError} from '../../util/assert';\nimport type {TNode} from '../interfaces/node';\nimport type {LView} from '../interfaces/view';\nimport type {EffectRef} from '../reactivity/effect';\n\n/**\n * An enum describing the types of events that can be emitted from the injector profiler\n */\nexport const enum InjectorProfilerEventType {\n  /**\n   * Emits when a service is injected.\n   */\n  Inject,\n\n  /**\n   * Emits when an Angular class instance is created by an injector.\n   */\n  InstanceCreatedByInjector,\n\n  /**\n   * Emits when an injector configures a provider.\n   */\n  ProviderConfigured,\n\n  /**\n   * Emits when an effect is created.\n   */\n  EffectCreated,\n}\n\n/**\n * An object that defines an injection context for the injector profiler.\n */\nexport interface InjectorProfilerContext {\n  /**\n   *  The Injector that service is being injected into.\n   *      - Example: if ModuleA --provides--> ServiceA --injects--> ServiceB\n   *                 then inject(ServiceB) in ServiceA has ModuleA as an injector context\n   */\n  injector: Injector;\n\n  /**\n   *  The class where the constructor that is calling `inject` is located\n   *      - Example: if ModuleA --provides--> ServiceA --injects--> ServiceB\n   *                 then inject(ServiceB) in ServiceA has ServiceA as a construction context\n   */\n  token: Type<unknown> | null;\n}\n\nexport interface InjectedServiceEvent {\n  type: InjectorProfilerEventType.Inject;\n  context: InjectorProfilerContext;\n  service: InjectedService;\n}\n\nexport interface InjectorCreatedInstanceEvent {\n  type: InjectorProfilerEventType.InstanceCreatedByInjector;\n  context: InjectorProfilerContext;\n  instance: InjectorCreatedInstance;\n}\n\nexport interface ProviderConfiguredEvent {\n  type: InjectorProfilerEventType.ProviderConfigured;\n  context: InjectorProfilerContext;\n  providerRecord: ProviderRecord;\n}\n\nexport interface EffectCreatedEvent {\n  type: InjectorProfilerEventType.EffectCreated;\n  context: InjectorProfilerContext;\n  effect: EffectRef;\n}\n\n/**\n * An object representing an event that is emitted through the injector profiler\n */\n\nexport type InjectorProfilerEvent =\n  | InjectedServiceEvent\n  | InjectorCreatedInstanceEvent\n  | ProviderConfiguredEvent\n  | EffectCreatedEvent;\n\n/**\n * An object that contains information about a provider that has been configured\n *\n * TODO: rename to indicate that it is a debug structure eg. ProviderDebugInfo.\n */\nexport interface ProviderRecord {\n  /**\n   * DI token that this provider is configuring\n   */\n  token: Type<unknown> | InjectionToken<unknown>;\n\n  /**\n   * Determines if provider is configured as view provider.\n   */\n  isViewProvider: boolean;\n\n  /**\n   * The raw provider associated with this ProviderRecord.\n   */\n  provider: SingleProvider;\n\n  /**\n   * The path of DI containers that were followed to import this provider\n   */\n  importPath?: Type<unknown>[];\n}\n\n/**\n * An object that contains information about a value that has been constructed within an injector\n */\nexport interface InjectorCreatedInstance {\n  /**\n   * Value of the created instance\n   */\n  value: unknown;\n}\n\n/**\n * An object that contains information a service that has been injected within an\n * InjectorProfilerContext\n */\nexport interface InjectedService {\n  /**\n   * DI token of the Service that is injected\n   */\n  token?: Type<unknown> | InjectionToken<unknown>;\n\n  /**\n   * Value of the injected service\n   */\n  value: unknown;\n\n  /**\n   * Flags that this service was injected with\n   */\n  flags?: InternalInjectFlags | InjectFlags | InjectOptions;\n\n  /**\n   * Injector that this service was provided in.\n   */\n  providedIn?: Injector;\n\n  /**\n   * In NodeInjectors, the LView and TNode that serviced this injection.\n   */\n  injectedIn?: {lView: LView; tNode: TNode};\n}\n\nexport interface InjectorProfiler {\n  (event: InjectorProfilerEvent): void;\n}\n\nlet _injectorProfilerContext: InjectorProfilerContext;\nexport function getInjectorProfilerContext() {\n  !ngDevMode && throwError('getInjectorProfilerContext should never be called in production mode');\n  return _injectorProfilerContext;\n}\n\nexport function setInjectorProfilerContext(context: InjectorProfilerContext) {\n  !ngDevMode && throwError('setInjectorProfilerContext should never be called in production mode');\n\n  const previous = _injectorProfilerContext;\n  _injectorProfilerContext = context;\n  return previous;\n}\n\nlet injectorProfilerCallback: InjectorProfiler | null = null;\n\n/**\n * Sets the callback function which will be invoked during certain DI events within the\n * runtime (for example: injecting services, creating injectable instances, configuring providers)\n *\n * Warning: this function is *INTERNAL* and should not be relied upon in application's code.\n * The contract of the function might be changed in any release and/or the function can be removed\n * completely.\n *\n * @param profiler function provided by the caller or null value to disable profiling.\n */\nexport const setInjectorProfiler = (injectorProfiler: InjectorProfiler | null) => {\n  !ngDevMode && throwError('setInjectorProfiler should never be called in production mode');\n  injectorProfilerCallback = injectorProfiler;\n};\n\n/**\n * Injector profiler function which emits on DI events executed by the runtime.\n *\n * @param event InjectorProfilerEvent corresponding to the DI event being emitted\n */\nfunction injectorProfiler(event: InjectorProfilerEvent): void {\n  !ngDevMode && throwError('Injector profiler should never be called in production mode');\n\n  if (injectorProfilerCallback != null /* both `null` and `undefined` */) {\n    injectorProfilerCallback!(event);\n  }\n}\n\n/**\n * Emits an InjectorProfilerEventType.ProviderConfigured to the injector profiler. The data in the\n * emitted event includes the raw provider, as well as the token that provider is providing.\n *\n * @param eventProvider A provider object\n */\nexport function emitProviderConfiguredEvent(\n  eventProvider: SingleProvider,\n  isViewProvider: boolean = false,\n): void {\n  !ngDevMode && throwError('Injector profiler should never be called in production mode');\n\n  let token;\n  // if the provider is a TypeProvider (typeof provider is function) then the token is the\n  // provider itself\n  if (typeof eventProvider === 'function') {\n    token = eventProvider;\n  }\n  // if the provider is an injection token, then the token is the injection token.\n  else if (eventProvider instanceof InjectionToken) {\n    token = eventProvider;\n  }\n  // in all other cases we can access the token via the `provide` property of the provider\n  else {\n    token = resolveForwardRef(eventProvider.provide);\n  }\n\n  let provider = eventProvider;\n  // Injection tokens may define their own default provider which gets attached to the token itself\n  // as `ɵprov`. In this case, we want to emit the provider that is attached to the token, not the\n  // token itself.\n  if (eventProvider instanceof InjectionToken) {\n    provider = (eventProvider.ɵprov as FactoryProvider) || eventProvider;\n  }\n\n  injectorProfiler({\n    type: InjectorProfilerEventType.ProviderConfigured,\n    context: getInjectorProfilerContext(),\n    providerRecord: {token, provider, isViewProvider},\n  });\n}\n\n/**\n * Emits an event to the injector profiler with the instance that was created. Note that\n * the injector associated with this emission can be accessed by using getDebugInjectContext()\n *\n * @param instance an object created by an injector\n */\nexport function emitInstanceCreatedByInjectorEvent(instance: unknown): void {\n  !ngDevMode && throwError('Injector profiler should never be called in production mode');\n\n  injectorProfiler({\n    type: InjectorProfilerEventType.InstanceCreatedByInjector,\n    context: getInjectorProfilerContext(),\n    instance: {value: instance},\n  });\n}\n\n/**\n * @param token DI token associated with injected service\n * @param value the instance of the injected service (i.e the result of `inject(token)`)\n * @param flags the flags that the token was injected with\n */\nexport function emitInjectEvent(token: Type<unknown>, value: unknown, flags: InjectFlags): void {\n  !ngDevMode && throwError('Injector profiler should never be called in production mode');\n\n  injectorProfiler({\n    type: InjectorProfilerEventType.Inject,\n    context: getInjectorProfilerContext(),\n    service: {token, value, flags},\n  });\n}\n\nexport function emitEffectCreatedEvent(effect: EffectRef): void {\n  !ngDevMode && throwError('Injector profiler should never be called in production mode');\n\n  injectorProfiler({\n    type: InjectorProfilerEventType.EffectCreated,\n    context: getInjectorProfilerContext(),\n    effect,\n  });\n}\n\nexport function runInInjectorProfilerContext(\n  injector: Injector,\n  token: Type<unknown>,\n  callback: () => void,\n): void {\n  !ngDevMode &&\n    throwError('runInInjectorProfilerContext should never be called in production mode');\n\n  const prevInjectContext = setInjectorProfilerContext({injector, token});\n  try {\n    callback();\n  } finally {\n    setInjectorProfilerContext(prevInjectContext);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../../interface/type';\n\n/**\n * Configures the `Injector` to return a value for a token.\n * Base for `ValueProvider` decorator.\n *\n * @publicApi\n */\nexport interface ValueSansProvider {\n  /**\n   * The value to inject.\n   */\n  useValue: any;\n}\n\n/**\n * Configures the `Injector` to return a value for a token.\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example core/di/ts/provider_spec.ts region='ValueProvider'}\n *\n * ### Multi-value example\n *\n * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}\n *\n * @publicApi\n */\nexport interface ValueProvider extends ValueSansProvider {\n  /**\n   * An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.\n   */\n  provide: any;\n\n  /**\n   * When true, injector returns an array of instances. This is useful to allow multiple\n   * providers spread across many files to provide configuration information to a common token.\n   */\n  multi?: boolean;\n}\n\n/**\n * Configures the `Injector` to return an instance of `useClass` for a token.\n * Base for `StaticClassProvider` decorator.\n *\n * @publicApi\n */\nexport interface StaticClassSansProvider {\n  /**\n   * An optional class to instantiate for the `token`. By default, the `provide`\n   * class is instantiated.\n   */\n  useClass: Type<any>;\n\n  /**\n   * A list of `token`s to be resolved by the injector. The list of values is then\n   * used as arguments to the `useClass` constructor.\n   */\n  deps: any[];\n}\n\n/**\n * Configures the `Injector` to return an instance of `useClass` for a token.\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @usageNotes\n *\n * {@example core/di/ts/provider_spec.ts region='StaticClassProvider'}\n *\n * Note that following two providers are not equal:\n *\n * {@example core/di/ts/provider_spec.ts region='StaticClassProviderDifference'}\n *\n * ### Multi-value example\n *\n * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}\n *\n * @publicApi\n */\nexport interface StaticClassProvider extends StaticClassSansProvider {\n  /**\n   * An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.\n   */\n  provide: any;\n\n  /**\n   * When true, injector returns an array of instances. This is useful to allow multiple\n   * providers spread across many files to provide configuration information to a common token.\n   */\n  multi?: boolean;\n}\n\n/**\n * Configures the `Injector` to return an instance of a token.\n *\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @usageNotes\n *\n * ```ts\n * @Injectable(SomeModule, {deps: []})\n * class MyService {}\n * ```\n *\n * @publicApi\n */\nexport interface ConstructorSansProvider {\n  /**\n   * A list of `token`s to be resolved by the injector.\n   */\n  deps?: any[];\n}\n\n/**\n * Configures the `Injector` to return an instance of a token.\n *\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @usageNotes\n *\n * {@example core/di/ts/provider_spec.ts region='ConstructorProvider'}\n *\n * ### Multi-value example\n *\n * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}\n *\n * @publicApi\n */\nexport interface ConstructorProvider extends ConstructorSansProvider {\n  /**\n   * An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.\n   */\n  provide: Type<any>;\n\n  /**\n   * When true, injector returns an array of instances. This is useful to allow multiple\n   * providers spread across many files to provide configuration information to a common token.\n   */\n  multi?: boolean;\n}\n\n/**\n * Configures the `Injector` to return a value of another `useExisting` token.\n *\n * @see {@link ExistingProvider}\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @publicApi\n */\nexport interface ExistingSansProvider {\n  /**\n   * Existing `token` to return. (Equivalent to `injector.get(useExisting)`)\n   */\n  useExisting: any;\n}\n\n/**\n * Configures the `Injector` to return a value of another `useExisting` token.\n *\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @usageNotes\n *\n * {@example core/di/ts/provider_spec.ts region='ExistingProvider'}\n *\n * ### Multi-value example\n *\n * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}\n *\n * @publicApi\n */\nexport interface ExistingProvider extends ExistingSansProvider {\n  /**\n   * An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.\n   */\n  provide: any;\n\n  /**\n   * When true, injector returns an array of instances. This is useful to allow multiple\n   * providers spread across many files to provide configuration information to a common token.\n   */\n  multi?: boolean;\n}\n\n/**\n * Configures the `Injector` to return a value by invoking a `useFactory` function.\n *\n * @see {@link FactoryProvider}\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @publicApi\n */\nexport interface FactorySansProvider {\n  /**\n   * A function to invoke to create a value for this `token`. The function is invoked with\n   * resolved values of `token`s in the `deps` field.\n   */\n  useFactory: Function;\n\n  /**\n   * A list of `token`s to be resolved by the injector. The list of values is then\n   * used as arguments to the `useFactory` function.\n   */\n  deps?: any[];\n}\n\n/**\n * Configures the `Injector` to return a value by invoking a `useFactory` function.\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @usageNotes\n *\n * {@example core/di/ts/provider_spec.ts region='FactoryProvider'}\n *\n * Dependencies can also be marked as optional:\n *\n * {@example core/di/ts/provider_spec.ts region='FactoryProviderOptionalDeps'}\n *\n * ### Multi-value example\n *\n * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}\n *\n * @publicApi\n */\nexport interface FactoryProvider extends FactorySansProvider {\n  /**\n   * An injection token. (Typically an instance of `Type` or `InjectionToken`, but can be `any`).\n   */\n  provide: any;\n\n  /**\n   * When true, injector returns an array of instances. This is useful to allow multiple\n   * providers spread across many files to provide configuration information to a common token.\n   */\n  multi?: boolean;\n}\n\n/**\n * Describes how an `Injector` should be configured as static (that is, without reflection).\n * A static provider provides tokens to an injector for various types of dependencies.\n *\n * @see {@link Injector.create()}\n * @see [Dependency Injection Guide](guide/di/dependency-injection-providers).\n *\n * @publicApi\n */\nexport type StaticProvider =\n  | ValueProvider\n  | ExistingProvider\n  | StaticClassProvider\n  | ConstructorProvider\n  | FactoryProvider\n  | any[];\n\n/**\n * Configures the `Injector` to return an instance of `Type` when `Type' is used as the token.\n *\n * Create an instance by invoking the `new` operator and supplying additional arguments.\n * This form is a short form of `TypeProvider`;\n *\n * For more details, see the [\"Dependency Injection Guide\"](guide/di/dependency-injection.\n *\n * @usageNotes\n *\n * {@example core/di/ts/provider_spec.ts region='TypeProvider'}\n *\n * @publicApi\n */\nexport interface TypeProvider extends Type<any> {}\n\n/**\n * Configures the `Injector` to return a value by invoking a `useClass` function.\n * Base for `ClassProvider` decorator.\n *\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @publicApi\n */\nexport interface ClassSansProvider {\n  /**\n   * Class to instantiate for the `token`.\n   */\n  useClass: Type<any>;\n}\n\n/**\n * Configures the `Injector` to return an instance of `useClass` for a token.\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @usageNotes\n *\n * {@example core/di/ts/provider_spec.ts region='ClassProvider'}\n *\n * Note that following two providers are not equal:\n *\n * {@example core/di/ts/provider_spec.ts region='ClassProviderDifference'}\n *\n * ### Multi-value example\n *\n * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}\n *\n * @publicApi\n */\nexport interface ClassProvider extends ClassSansProvider {\n  /**\n   * An injection token. (Typically an instance of `Type` or `InjectionToken`, but can be `any`).\n   */\n  provide: any;\n\n  /**\n   * When true, injector returns an array of instances. This is useful to allow multiple\n   * providers spread across many files to provide configuration information to a common token.\n   */\n  multi?: boolean;\n}\n\n/**\n * Describes how the `Injector` should be configured.\n * @see [Dependency Injection Guide](guide/di/dependency-injection.\n *\n * @see {@link StaticProvider}\n *\n * @publicApi\n */\nexport type Provider =\n  | TypeProvider\n  | ValueProvider\n  | ClassProvider\n  | ConstructorProvider\n  | ExistingProvider\n  | FactoryProvider\n  | any[];\n\n/**\n * Encapsulated `Provider`s that are only accepted during creation of an `EnvironmentInjector` (e.g.\n * in an `NgModule`).\n *\n * Using this wrapper type prevents providers which are only designed to work in\n * application/environment injectors from being accidentally included in\n * `@Component.providers` and ending up in a component injector.\n *\n * This wrapper type prevents access to the `Provider`s inside.\n *\n * @see {@link makeEnvironmentProviders}\n * @see {@link importProvidersFrom}\n *\n * @publicApi\n */\nexport type EnvironmentProviders = {\n  ɵbrand: 'EnvironmentProviders';\n};\n\nexport interface InternalEnvironmentProviders extends EnvironmentProviders {\n  ɵproviders: (Provider | EnvironmentProviders)[];\n\n  /**\n   * If present, indicates that the `EnvironmentProviders` were derived from NgModule providers.\n   *\n   * This is used to produce clearer error messages.\n   */\n  ɵfromNgModule?: true;\n}\n\nexport function isEnvironmentProviders(\n  value: Provider | EnvironmentProviders | InternalEnvironmentProviders,\n): value is InternalEnvironmentProviders {\n  return value && !!(value as InternalEnvironmentProviders).ɵproviders;\n}\n\n/**\n * Describes a function that is used to process provider lists (such as provider\n * overrides).\n */\nexport type ProcessProvidersFunction = (providers: Provider[]) => Provider[];\n\n/**\n * A wrapper around an NgModule that associates it with providers\n * Usage without a generic type is deprecated.\n *\n * @publicApi\n */\nexport interface ModuleWithProviders<T> {\n  ngModule: Type<T>;\n  providers?: Array<Provider | EnvironmentProviders>;\n}\n\n/**\n * Providers that were imported from NgModules via the `importProvidersFrom` function.\n *\n * These providers are meant for use in an application injector (or other environment injectors) and\n * should not be used in component injectors.\n *\n * This type cannot be directly implemented. It's returned from the `importProvidersFrom` function\n * and serves to prevent the extracted NgModule providers from being used in the wrong contexts.\n *\n * @see {@link importProvidersFrom}\n *\n * @publicApi\n * @deprecated replaced by `EnvironmentProviders`\n */\nexport type ImportedNgModuleProviders = EnvironmentProviders;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {getClosureSafeProperty} from '../util/property';\n\nexport const NG_COMP_DEF: string = getClosureSafeProperty({ɵcmp: getClosureSafeProperty});\nexport const NG_DIR_DEF: string = getClosureSafeProperty({ɵdir: getClosureSafeProperty});\nexport const NG_PIPE_DEF: string = getClosureSafeProperty({ɵpipe: getClosureSafeProperty});\nexport const NG_MOD_DEF: string = getClosureSafeProperty({ɵmod: getClosureSafeProperty});\nexport const NG_FACTORY_DEF: string = getClosureSafeProperty({ɵfac: getClosureSafeProperty});\n\n/**\n * If a directive is diPublic, bloomAdd sets a property on the type with this constant as\n * the key and the directive's unique ID as the value. This allows us to map directives to their\n * bloom filter bit for DI.\n */\n// TODO(misko): This is wrong. The NG_ELEMENT_ID should never be minified.\nexport const NG_ELEMENT_ID: string = getClosureSafeProperty({\n  __NG_ELEMENT_ID__: getClosureSafeProperty,\n});\n\n/**\n * The `NG_ENV_ID` field on a DI token indicates special processing in the `EnvironmentInjector`:\n * getting such tokens from the `EnvironmentInjector` will bypass the standard DI resolution\n * strategy and instead will return implementation produced by the `NG_ENV_ID` factory function.\n *\n * This particular retrieval of DI tokens is mostly done to eliminate circular dependencies and\n * improve tree-shaking.\n */\nexport const NG_ENV_ID: string = getClosureSafeProperty({__NG_ENV_ID__: getClosureSafeProperty});\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../../interface/type';\nimport {NG_COMP_DEF} from '../fields';\n\n/**\n * Used for stringify render output in Ivy.\n * Important! This function is very performance-sensitive and we should\n * be extra careful not to introduce megamorphic reads in it.\n * Check `core/test/render3/perf/render_stringify` for benchmarks and alternate implementations.\n */\nexport function renderStringify(value: any): string {\n  if (typeof value === 'string') return value;\n  if (value == null) return '';\n  // Use `String` so that it invokes the `toString` method of the value. Note that this\n  // appears to be faster than calling `value.toString` (see `render_stringify` benchmark).\n  return String(value);\n}\n\n/**\n * Used to stringify a value so that it can be displayed in an error message.\n *\n * Important! This function contains a megamorphic read and should only be\n * used for error messages.\n */\nexport function stringifyForError(value: any): string {\n  if (typeof value === 'function') return value.name || value.toString();\n  if (typeof value === 'object' && value != null && typeof value.type === 'function') {\n    return value.type.name || value.type.toString();\n  }\n\n  return renderStringify(value);\n}\n\n/**\n * Used to stringify a `Type` and including the file path and line number in which it is defined, if\n * possible, for better debugging experience.\n *\n * Important! This function contains a megamorphic read and should only be used for error messages.\n */\nexport function debugStringifyTypeForError(type: Type<any>): string {\n  // TODO(pmvald): Do some refactoring so that we can use getComponentDef here without creating\n  // circular deps.\n  let componentDef = (type as any)[NG_COMP_DEF] || null;\n  if (componentDef !== null && componentDef.debugInfo) {\n    return stringifyTypeFromDebugInfo(componentDef.debugInfo);\n  }\n\n  return stringifyForError(type);\n}\n\n// TODO(pmvald): Do some refactoring so that we can use the type ClassDebugInfo for the param\n// debugInfo here without creating circular deps.\nfunction stringifyTypeFromDebugInfo(debugInfo: any): string {\n  if (!debugInfo.filePath || !debugInfo.lineNumber) {\n    return debugInfo.className;\n  } else {\n    return `${debugInfo.className} (at ${debugInfo.filePath}:${debugInfo.lineNumber})`;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {ProviderToken} from '../di';\nimport {isEnvironmentProviders} from '../di/interface/provider';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type} from '../interface/type';\nimport {stringify} from '../util/stringify';\n\nimport {stringifyForError} from './util/stringify_utils';\n\n/** Called when directives inject each other (creating a circular dependency) */\nexport function throwCyclicDependencyError(token: string, path?: string[]): never {\n  throw new RuntimeError(\n    RuntimeErrorCode.CYCLIC_DI_DEPENDENCY,\n    ngDevMode\n      ? `Circular dependency in DI detected for ${token}${path ? `. Dependency path: ${path.join(' > ')} > ${token}` : ''}`\n      : token,\n  );\n}\n\nexport function throwMixedMultiProviderError() {\n  throw new Error(`Cannot mix multi providers and regular providers`);\n}\n\nexport function throwInvalidProviderError(\n  ngModuleType?: Type<unknown>,\n  providers?: any[],\n  provider?: any,\n): never {\n  if (ngModuleType && providers) {\n    const providerDetail = providers.map((v) => (v == provider ? '?' + provider + '?' : '...'));\n    throw new Error(\n      `Invalid provider for the NgModule '${stringify(\n        ngModuleType,\n      )}' - only instances of Provider and Type are allowed, got: [${providerDetail.join(', ')}]`,\n    );\n  } else if (isEnvironmentProviders(provider)) {\n    if (provider.ɵfromNgModule) {\n      throw new RuntimeError(\n        RuntimeErrorCode.PROVIDER_IN_WRONG_CONTEXT,\n        `Invalid providers from 'importProvidersFrom' present in a non-environment injector. 'importProvidersFrom' can't be used for component providers.`,\n      );\n    } else {\n      throw new RuntimeError(\n        RuntimeErrorCode.PROVIDER_IN_WRONG_CONTEXT,\n        `Invalid providers present in a non-environment injector. 'EnvironmentProviders' can't be used for component providers.`,\n      );\n    }\n  } else {\n    throw new Error('Invalid provider');\n  }\n}\n\n/** Throws an error when a token is not found in DI. */\nexport function throwProviderNotFoundError(\n  token: ProviderToken<unknown>,\n  injectorName?: string,\n): never {\n  const errorMessage =\n    ngDevMode &&\n    `No provider for ${stringifyForError(token)} found${injectorName ? ` in ${injectorName}` : ''}`;\n  throw new RuntimeError(RuntimeErrorCode.PROVIDER_NOT_FOUND, errorMessage);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Special flag indicating that a decorator is of type `Inject`. It's used to make `Inject`\n * decorator tree-shakable (so we don't have to rely on the `instanceof` checks).\n * Note: this flag is not included into the `InjectFlags` since it's an internal-only API.\n */\nexport const enum DecoratorFlags {\n  Inject = -1,\n}\n\n/**\n * Injection flags for DI.\n *\n * @publicApi\n * @deprecated use an options object for [`inject`](api/core/inject) instead.\n */\nexport enum InjectFlags {\n  // TODO(alxhub): make this 'const' (and remove `InternalInjectFlags` enum) when ngc no longer\n  // writes exports of it into ngfactory files.\n\n  /** Check self and check parent injector if needed */\n  Default = 0b0000,\n\n  /**\n   * Specifies that an injector should retrieve a dependency from any injector until reaching the\n   * host element of the current component. (Only used with Element Injector)\n   */\n  Host = 0b0001,\n\n  /** Don't ascend to ancestors of the node requesting injection. */\n  Self = 0b0010,\n\n  /** Skip the node that is requesting injection. */\n  SkipSelf = 0b0100,\n\n  /** Inject `defaultValue` instead if token not found. */\n  Optional = 0b1000,\n}\n\n/**\n * This enum is an exact copy of the `InjectFlags` enum above, but the difference is that this is a\n * const enum, so actual enum values would be inlined in generated code. The `InjectFlags` enum can\n * be turned into a const enum when ViewEngine is removed (see TODO at the `InjectFlags` enum\n * above). The benefit of inlining is that we can use these flags at the top level without affecting\n * tree-shaking (see \"no-toplevel-property-access\" tslint rule for more info).\n * Keep this enum in sync with `InjectFlags` enum above.\n */\nexport const enum InternalInjectFlags {\n  /** Check self and check parent injector if needed */\n  Default = 0b0000,\n\n  /**\n   * Specifies that an injector should retrieve a dependency from any injector until reaching the\n   * host element of the current component. (Only used with Element Injector)\n   */\n  Host = 0b0001,\n\n  /** Don't ascend to ancestors of the node requesting injection. */\n  Self = 0b0010,\n\n  /** Skip the node that is requesting injection. */\n  SkipSelf = 0b0100,\n\n  /** Inject `defaultValue` instead if token not found. */\n  Optional = 0b1000,\n\n  /**\n   * This token is being injected into a pipe.\n   *\n   * This flag is intentionally not in the public facing `InjectFlags` because it is only added by\n   * the compiler and is not a developer applicable flag.\n   */\n  ForPipe = 0b10000,\n}\n\n/**\n * Type of the options argument to [`inject`](api/core/inject).\n *\n * @publicApi\n */\nexport interface InjectOptions {\n  /**\n   * Use optional injection, and return `null` if the requested token is not found.\n   */\n  optional?: boolean;\n\n  /**\n   * Start injection at the parent of the current injector.\n   */\n  skipSelf?: boolean;\n\n  /**\n   * Only query the current injector for the token, and don't fall back to the parent injector if\n   * it's not found.\n   */\n  self?: boolean;\n\n  /**\n   * Stop injection at the host component's injector. Only relevant when injecting from an element\n   * injector, and a no-op for environment injectors.\n   */\n  host?: boolean;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {throwProviderNotFoundError} from '../render3/errors_di';\nimport {assertNotEqual} from '../util/assert';\nimport {stringify} from '../util/stringify';\n\nimport {getInjectableDef, ɵɵInjectableDeclaration} from './interface/defs';\nimport {InjectFlags} from './interface/injector';\nimport {ProviderToken} from './provider_token';\n\n/**\n * Current implementation of inject.\n *\n * By default, it is `injectInjectorOnly`, which makes it `Injector`-only aware. It can be changed\n * to `directiveInject`, which brings in the `NodeInjector` system of ivy. It is designed this\n * way for two reasons:\n *  1. `Injector` should not depend on ivy logic.\n *  2. To maintain tree shake-ability we don't want to bring in unnecessary code.\n */\nlet _injectImplementation:\n  | (<T>(token: ProviderToken<T>, flags?: InjectFlags) => T | null)\n  | undefined;\nexport function getInjectImplementation() {\n  return _injectImplementation;\n}\n\n/**\n * Sets the current inject implementation.\n */\nexport function setInjectImplementation(\n  impl: (<T>(token: ProviderToken<T>, flags?: InjectFlags) => T | null) | undefined,\n): (<T>(token: ProviderToken<T>, flags?: InjectFlags) => T | null) | undefined {\n  const previous = _injectImplementation;\n  _injectImplementation = impl;\n  return previous;\n}\n\n/**\n * Injects `root` tokens in limp mode.\n *\n * If no injector exists, we can still inject tree-shakable providers which have `providedIn` set to\n * `\"root\"`. This is known as the limp mode injection. In such case the value is stored in the\n * injectable definition.\n */\nexport function injectRootLimpMode<T>(\n  token: ProviderToken<T>,\n  notFoundValue: T | undefined,\n  flags: InjectFlags,\n): T | null {\n  const injectableDef: ɵɵInjectableDeclaration<T> | null = getInjectableDef(token);\n  if (injectableDef && injectableDef.providedIn == 'root') {\n    return injectableDef.value === undefined\n      ? (injectableDef.value = injectableDef.factory())\n      : injectableDef.value;\n  }\n  if (flags & InjectFlags.Optional) return null;\n  if (notFoundValue !== undefined) return notFoundValue;\n  throwProviderNotFoundError(token, 'Injector');\n}\n\n/**\n * Assert that `_injectImplementation` is not `fn`.\n *\n * This is useful, to prevent infinite recursion.\n *\n * @param fn Function which it should not equal to\n */\nexport function assertInjectImplementationNotEqual(\n  fn: <T>(token: ProviderToken<T>, flags?: InjectFlags) => T | null,\n) {\n  ngDevMode &&\n    assertNotEqual(_injectImplementation, fn, 'Calling ɵɵinject would cause infinite recursion');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport '../util/ng_dev_mode';\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type} from '../interface/type';\nimport {emitInjectEvent} from '../render3/debug/injector_profiler';\nimport {stringify} from '../util/stringify';\n\nimport {resolveForwardRef} from './forward_ref';\nimport {getInjectImplementation, injectRootLimpMode} from './inject_switch';\nimport type {Injector} from './injector';\nimport {\n  DecoratorFlags,\n  InjectFlags,\n  InjectOptions,\n  InternalInjectFlags,\n} from './interface/injector';\nimport {ProviderToken} from './provider_token';\nimport type {HostAttributeToken} from './host_attribute_token';\nimport {\n  Injector as PrimitivesInjector,\n  NotFound,\n  NOT_FOUND,\n  InjectionToken as PrimitivesInjectionToken,\n  getCurrentInjector,\n} from '../../primitives/di';\n\nconst _THROW_IF_NOT_FOUND = {};\nexport const THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;\n\nexport {getCurrentInjector, setCurrentInjector} from '../../primitives/di';\n\n/*\n * Name of a property (that we patch onto DI decorator), which is used as an annotation of which\n * InjectFlag this decorator represents. This allows to avoid direct references to the DI decorators\n * in the code, thus making them tree-shakable.\n */\nconst DI_DECORATOR_FLAG = '__NG_DI_FLAG__';\n\nexport class RetrievingInjector implements PrimitivesInjector {\n  constructor(readonly injector: Injector) {}\n  retrieve<T>(token: PrimitivesInjectionToken<T>, options: unknown): T | NotFound {\n    const ngOptions = options as InjectOptions;\n    return this.injector.get(token, ngOptions.optional ? NOT_FOUND : THROW_IF_NOT_FOUND, ngOptions);\n  }\n}\n\nexport const NG_TEMP_TOKEN_PATH = 'ngTempTokenPath';\nconst NG_TOKEN_PATH = 'ngTokenPath';\nconst NEW_LINE = /\\n/gm;\nconst NO_NEW_LINE = 'ɵ';\nexport const SOURCE = '__source';\n\nexport function injectInjectorOnly<T>(token: ProviderToken<T>): T;\nexport function injectInjectorOnly<T>(token: ProviderToken<T>, flags?: InjectFlags): T | null;\nexport function injectInjectorOnly<T>(\n  token: ProviderToken<T>,\n  flags = InjectFlags.Default,\n): T | null {\n  if (getCurrentInjector() === undefined) {\n    throw new RuntimeError(\n      RuntimeErrorCode.MISSING_INJECTION_CONTEXT,\n      ngDevMode &&\n        `The \\`${stringify(token)}\\` token injection failed. \\`inject()\\` function must be called from an injection context such as a constructor, a factory function, a field initializer, or a function used with \\`runInInjectionContext\\`.`,\n    );\n  } else if (getCurrentInjector() === null) {\n    return injectRootLimpMode(token, undefined, flags);\n  } else {\n    const currentInjector = getCurrentInjector();\n    let injector: Injector;\n    if (currentInjector instanceof RetrievingInjector) {\n      injector = currentInjector.injector;\n    } else {\n      injector = currentInjector as unknown as Injector;\n    }\n    const value = injector.get(token, flags & InjectFlags.Optional ? null : undefined, flags);\n    ngDevMode && emitInjectEvent(token as Type<unknown>, value, flags);\n    return value;\n  }\n}\n\n/**\n * Generated instruction: injects a token from the currently active injector.\n *\n * (Additional documentation moved to `inject`, as it is the public API, and an alias for this\n * instruction)\n *\n * @see inject\n * @codeGenApi\n * @publicApi This instruction has been emitted by ViewEngine for some time and is deployed to npm.\n */\nexport function ɵɵinject<T>(token: ProviderToken<T>): T;\nexport function ɵɵinject<T>(token: ProviderToken<T>, flags?: InjectFlags): T | null;\nexport function ɵɵinject(token: HostAttributeToken): string;\nexport function ɵɵinject(token: HostAttributeToken, flags?: InjectFlags): string | null;\nexport function ɵɵinject<T>(\n  token: ProviderToken<T> | HostAttributeToken,\n  flags?: InjectFlags,\n): string | null;\nexport function ɵɵinject<T>(\n  token: ProviderToken<T> | HostAttributeToken,\n  flags = InjectFlags.Default,\n): T | null {\n  return (getInjectImplementation() || injectInjectorOnly)(\n    resolveForwardRef(token as Type<T>),\n    flags,\n  );\n}\n\n/**\n * Throws an error indicating that a factory function could not be generated by the compiler for a\n * particular class.\n *\n * The name of the class is not mentioned here, but will be in the generated factory function name\n * and thus in the stack trace.\n *\n * @codeGenApi\n */\nexport function ɵɵinvalidFactoryDep(index: number): never {\n  throw new RuntimeError(\n    RuntimeErrorCode.INVALID_FACTORY_DEPENDENCY,\n    ngDevMode &&\n      `This constructor is not compatible with Angular Dependency Injection because its dependency at index ${index} of the parameter list is invalid.\nThis can happen if the dependency type is a primitive like a string or if an ancestor of this class is missing an Angular decorator.\n\nPlease check that 1) the type for the parameter at index ${index} is correct and 2) the correct Angular decorators are defined for this class and its ancestors.`,\n  );\n}\n\n/**\n * @param token A token that represents a dependency that should be injected.\n * @returns the injected value if operation is successful, `null` otherwise.\n * @throws if called outside of a supported context.\n *\n * @publicApi\n */\nexport function inject<T>(token: ProviderToken<T>): T;\n/**\n * @param token A token that represents a dependency that should be injected.\n * @param flags Control how injection is executed. The flags correspond to injection strategies that\n *     can be specified with parameter decorators `@Host`, `@Self`, `@SkipSelf`, and `@Optional`.\n * @returns the injected value if operation is successful, `null` otherwise.\n * @throws if called outside of a supported context.\n *\n * @publicApi\n * @deprecated prefer an options object instead of `InjectFlags`\n */\nexport function inject<T>(token: ProviderToken<T>, flags?: InjectFlags): T | null;\n/**\n * @param token A token that represents a dependency that should be injected.\n * @param options Control how injection is executed. Options correspond to injection strategies\n *     that can be specified with parameter decorators `@Host`, `@Self`, `@SkipSelf`, and\n *     `@Optional`.\n * @returns the injected value if operation is successful.\n * @throws if called outside of a supported context, or if the token is not found.\n *\n * @publicApi\n */\nexport function inject<T>(token: ProviderToken<T>, options: InjectOptions & {optional?: false}): T;\n/**\n * @param token A token that represents a dependency that should be injected.\n * @param options Control how injection is executed. Options correspond to injection strategies\n *     that can be specified with parameter decorators `@Host`, `@Self`, `@SkipSelf`, and\n *     `@Optional`.\n * @returns the injected value if operation is successful,  `null` if the token is not\n *     found and optional injection has been requested.\n * @throws if called outside of a supported context, or if the token is not found and optional\n *     injection was not requested.\n *\n * @publicApi\n */\nexport function inject<T>(token: ProviderToken<T>, options: InjectOptions): T | null;\n/**\n * @param token A token that represents a static attribute on the host node that should be injected.\n * @returns Value of the attribute if it exists.\n * @throws If called outside of a supported context or the attribute does not exist.\n *\n * @publicApi\n */\nexport function inject(token: HostAttributeToken): string;\n/**\n * @param token A token that represents a static attribute on the host node that should be injected.\n * @returns Value of the attribute if it exists, otherwise `null`.\n * @throws If called outside of a supported context.\n *\n * @publicApi\n */\nexport function inject(token: HostAttributeToken, options: {optional: true}): string | null;\n/**\n * @param token A token that represents a static attribute on the host node that should be injected.\n * @returns Value of the attribute if it exists.\n * @throws If called outside of a supported context or the attribute does not exist.\n *\n * @publicApi\n */\nexport function inject(token: HostAttributeToken, options: {optional: false}): string;\n/**\n * Injects a token from the currently active injector.\n * `inject` is only supported in an [injection context](guide/di/dependency-injection-context). It\n * can be used during:\n * - Construction (via the `constructor`) of a class being instantiated by the DI system, such\n * as an `@Injectable` or `@Component`.\n * - In the initializer for fields of such classes.\n * - In the factory function specified for `useFactory` of a `Provider` or an `@Injectable`.\n * - In the `factory` function specified for an `InjectionToken`.\n * - In a stackframe of a function call in a DI context\n *\n * @param token A token that represents a dependency that should be injected.\n * @param flags Optional flags that control how injection is executed.\n * The flags correspond to injection strategies that can be specified with\n * parameter decorators `@Host`, `@Self`, `@SkipSelf`, and `@Optional`.\n * @returns the injected value if operation is successful, `null` otherwise.\n * @throws if called outside of a supported context.\n *\n * @usageNotes\n * In practice the `inject()` calls are allowed in a constructor, a constructor parameter and a\n * field initializer:\n *\n * ```ts\n * @Injectable({providedIn: 'root'})\n * export class Car {\n *   radio: Radio|undefined;\n *   // OK: field initializer\n *   spareTyre = inject(Tyre);\n *\n *   constructor() {\n *     // OK: constructor body\n *     this.radio = inject(Radio);\n *   }\n * }\n * ```\n *\n * It is also legal to call `inject` from a provider's factory:\n *\n * ```ts\n * providers: [\n *   {provide: Car, useFactory: () => {\n *     // OK: a class factory\n *     const engine = inject(Engine);\n *     return new Car(engine);\n *   }}\n * ]\n * ```\n *\n * Calls to the `inject()` function outside of the class creation context will result in error. Most\n * notably, calls to `inject()` are disallowed after a class instance was created, in methods\n * (including lifecycle hooks):\n *\n * ```ts\n * @Component({ ... })\n * export class CarComponent {\n *   ngOnInit() {\n *     // ERROR: too late, the component instance was already created\n *     const engine = inject(Engine);\n *     engine.start();\n *   }\n * }\n * ```\n *\n * @publicApi\n */\nexport function inject<T>(\n  token: ProviderToken<T> | HostAttributeToken,\n  flags: InjectFlags | InjectOptions = InjectFlags.Default,\n) {\n  // The `as any` here _shouldn't_ be necessary, but without it JSCompiler\n  // throws a disambiguation  error due to the multiple signatures.\n  return ɵɵinject(token as any, convertToBitFlags(flags));\n}\n\n// Converts object-based DI flags (`InjectOptions`) to bit flags (`InjectFlags`).\nexport function convertToBitFlags(\n  flags: InjectOptions | InjectFlags | undefined,\n): InjectFlags | undefined {\n  if (typeof flags === 'undefined' || typeof flags === 'number') {\n    return flags;\n  }\n\n  // While TypeScript doesn't accept it without a cast, bitwise OR with false-y values in\n  // JavaScript is a no-op. We can use that for a very codesize-efficient conversion from\n  // `InjectOptions` to `InjectFlags`.\n  return (InternalInjectFlags.Default | // comment to force a line break in the formatter\n    ((   flags.optional && InternalInjectFlags.Optional) as number) |\n    ((flags.host && InternalInjectFlags.Host) as number) |\n    ((flags.self && InternalInjectFlags.Self) as number) |\n    ((flags.skipSelf && InternalInjectFlags.SkipSelf) as number)) as InjectFlags;\n}\n\nexport function injectArgs(types: (ProviderToken<any> | any[])[]): any[] {\n  const args: any[] = [];\n  for (let i = 0; i < types.length; i++) {\n    const arg = resolveForwardRef(types[i]);\n    if (Array.isArray(arg)) {\n      if (arg.length === 0) {\n        throw new RuntimeError(\n          RuntimeErrorCode.INVALID_DIFFER_INPUT,\n          ngDevMode && 'Arguments array must have arguments.',\n        );\n      }\n      let type: Type<any> | undefined = undefined;\n      let flags: InjectFlags = InjectFlags.Default;\n\n      for (let j = 0; j < arg.length; j++) {\n        const meta = arg[j];\n        const flag = getInjectFlag(meta);\n        if (typeof flag === 'number') {\n          // Special case when we handle @Inject decorator.\n          if (flag === DecoratorFlags.Inject) {\n            type = meta.token;\n          } else {\n            flags |= flag;\n          }\n        } else {\n          type = meta;\n        }\n      }\n\n      args.push(ɵɵinject(type!, flags));\n    } else {\n      args.push(ɵɵinject(arg));\n    }\n  }\n  return args;\n}\n\n/**\n * Attaches a given InjectFlag to a given decorator using monkey-patching.\n * Since DI decorators can be used in providers `deps` array (when provider is configured using\n * `useFactory`) without initialization (e.g. `Host`) and as an instance (e.g. `new Host()`), we\n * attach the flag to make it available both as a static property and as a field on decorator\n * instance.\n *\n * @param decorator Provided DI decorator.\n * @param flag InjectFlag that should be applied.\n */\nexport function attachInjectFlag(decorator: any, flag: InternalInjectFlags | DecoratorFlags): any {\n  decorator[DI_DECORATOR_FLAG] = flag;\n  decorator.prototype[DI_DECORATOR_FLAG] = flag;\n  return decorator;\n}\n\n/**\n * Reads monkey-patched property that contains InjectFlag attached to a decorator.\n *\n * @param token Token that may contain monkey-patched DI flags property.\n */\nexport function getInjectFlag(token: any): number | undefined {\n  return token[DI_DECORATOR_FLAG];\n}\n\nexport function catchInjectorError(\n  e: any,\n  token: any,\n  injectorErrorName: string,\n  source: string | null,\n): never {\n  const tokenPath: any[] = e[NG_TEMP_TOKEN_PATH];\n  if (token[SOURCE]) {\n    tokenPath.unshift(token[SOURCE]);\n  }\n  e.message = formatError('\\n' + e.message, tokenPath, injectorErrorName, source);\n  e[NG_TOKEN_PATH] = tokenPath;\n  e[NG_TEMP_TOKEN_PATH] = null;\n  throw e;\n}\n\nexport function formatError(\n  text: string,\n  obj: any,\n  injectorErrorName: string,\n  source: string | null = null,\n): string {\n  text = text && text.charAt(0) === '\\n' && text.charAt(1) == NO_NEW_LINE ? text.slice(2) : text;\n  let context = stringify(obj);\n  if (Array.isArray(obj)) {\n    context = obj.map(stringify).join(' -> ');\n  } else if (typeof obj === 'object') {\n    let parts = <string[]>[];\n    for (let key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        let value = obj[key];\n        parts.push(\n          key + ':' + (typeof value === 'string' ? JSON.stringify(value) : stringify(value)),\n        );\n      }\n    }\n    context = `{${parts.join(', ')}}`;\n  }\n  return `${injectorErrorName}${source ? '(' + source + ')' : ''}[${context}]: ${text.replace(\n    NEW_LINE,\n    '\\n  ',\n  )}`;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {makeParamDecorator} from '../util/decorators';\n\nimport {attachInjectFlag} from './injector_compatibility';\nimport {DecoratorFlags, InternalInjectFlags} from './interface/injector';\n\n/**\n * Type of the Inject decorator / constructor function.\n *\n * @publicApi\n */\nexport interface InjectDecorator {\n  /**\n   * Parameter decorator on a dependency parameter of a class constructor\n   * that specifies a custom provider of the dependency.\n   *\n   * @usageNotes\n   * The following example shows a class constructor that specifies a\n   * custom provider of a dependency using the parameter decorator.\n   *\n   * When `@Inject()` is not present, the injector uses the type annotation of the\n   * parameter as the provider.\n   *\n   * {@example core/di/ts/metadata_spec.ts region='InjectWithoutDecorator'}\n   *\n   * @see [Dependency Injection Guide](guide/di/dependency-injection\n   *\n   */\n  (token: any): any;\n  new (token: any): Inject;\n}\n\n/**\n * Type of the Inject metadata.\n *\n * @publicApi\n */\nexport interface Inject {\n  /**\n   * A DI token that maps to the dependency to be injected.\n   */\n  token: any;\n}\n\n/**\n * Inject decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const Inject: InjectDecorator = attachInjectFlag(\n  // Disable tslint because `DecoratorFlags` is a const enum which gets inlined.\n  makeParamDecorator('Inject', (token: any) => ({token})),\n  // tslint:disable-next-line: no-toplevel-property-access\n  DecoratorFlags.Inject,\n);\n\n/**\n * Type of the Optional decorator / constructor function.\n *\n * @publicApi\n */\nexport interface OptionalDecorator {\n  /**\n   * Parameter decorator to be used on constructor parameters,\n   * which marks the parameter as being an optional dependency.\n   * The DI framework provides `null` if the dependency is not found.\n   *\n   * Can be used together with other parameter decorators\n   * that modify how dependency injection operates.\n   *\n   * @usageNotes\n   *\n   * The following code allows the possibility of a `null` result:\n   *\n   * {@example core/di/ts/metadata_spec.ts region='Optional'}\n   *\n   * @see [Dependency Injection Guide](guide/di/dependency-injection.\n   */\n  (): any;\n  new (): Optional;\n}\n\n/**\n * Type of the Optional metadata.\n *\n * @publicApi\n */\nexport interface Optional {}\n\n/**\n * Optional decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const Optional: OptionalDecorator =\n  // Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.\n  // tslint:disable-next-line: no-toplevel-property-access\n  attachInjectFlag(makeParamDecorator('Optional'), InternalInjectFlags.Optional);\n\n/**\n * Type of the Self decorator / constructor function.\n *\n * @publicApi\n */\nexport interface SelfDecorator {\n  /**\n   * Parameter decorator to be used on constructor parameters,\n   * which tells the DI framework to start dependency resolution from the local injector.\n   *\n   * Resolution works upward through the injector hierarchy, so the children\n   * of this class must configure their own providers or be prepared for a `null` result.\n   *\n   * @usageNotes\n   *\n   * In the following example, the dependency can be resolved\n   * by the local injector when instantiating the class itself, but not\n   * when instantiating a child.\n   *\n   * {@example core/di/ts/metadata_spec.ts region='Self'}\n   *\n   * @see {@link SkipSelf}\n   * @see {@link Optional}\n   *\n   */\n  (): any;\n  new (): Self;\n}\n\n/**\n * Type of the Self metadata.\n *\n * @publicApi\n */\nexport interface Self {}\n\n/**\n * Self decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const Self: SelfDecorator =\n  // Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.\n  // tslint:disable-next-line: no-toplevel-property-access\n  attachInjectFlag(makeParamDecorator('Self'), InternalInjectFlags.Self);\n\n/**\n * Type of the `SkipSelf` decorator / constructor function.\n *\n * @publicApi\n */\nexport interface SkipSelfDecorator {\n  /**\n   * Parameter decorator to be used on constructor parameters,\n   * which tells the DI framework to start dependency resolution from the parent injector.\n   * Resolution works upward through the injector hierarchy, so the local injector\n   * is not checked for a provider.\n   *\n   * @usageNotes\n   *\n   * In the following example, the dependency can be resolved when\n   * instantiating a child, but not when instantiating the class itself.\n   *\n   * {@example core/di/ts/metadata_spec.ts region='SkipSelf'}\n   *\n   * @see [Dependency Injection guide](guide/di/di-in-action#skip).\n   * @see {@link Self}\n   * @see {@link Optional}\n   *\n   */\n  (): any;\n  new (): SkipSelf;\n}\n\n/**\n * Type of the `SkipSelf` metadata.\n *\n * @publicApi\n */\nexport interface SkipSelf {}\n\n/**\n * `SkipSelf` decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const SkipSelf: SkipSelfDecorator =\n  // Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.\n  // tslint:disable-next-line: no-toplevel-property-access\n  attachInjectFlag(makeParamDecorator('SkipSelf'), InternalInjectFlags.SkipSelf);\n\n/**\n * Type of the `Host` decorator / constructor function.\n *\n * @publicApi\n */\nexport interface HostDecorator {\n  /**\n   * Parameter decorator on a view-provider parameter of a class constructor\n   * that tells the DI framework to resolve the view by checking injectors of child\n   * elements, and stop when reaching the host element of the current component.\n   *\n   * @usageNotes\n   *\n   * The following shows use with the `@Optional` decorator, and allows for a `null` result.\n   *\n   * {@example core/di/ts/metadata_spec.ts region='Host'}\n   *\n   * For an extended example, see [\"Dependency Injection\n   * Guide\"](guide/di/di-in-action#optional).\n   */\n  (): any;\n  new (): Host;\n}\n\n/**\n * Type of the Host metadata.\n *\n * @publicApi\n */\nexport interface Host {}\n\n/**\n * Host decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const Host: HostDecorator =\n  // Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.\n  // tslint:disable-next-line: no-toplevel-property-access\n  attachInjectFlag(makeParamDecorator('Host'), InternalInjectFlags.Host);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {stringify} from '../util/stringify';\nimport {NG_FACTORY_DEF} from './fields';\n\n/**\n * Definition of what a factory function should look like.\n */\nexport type FactoryFn<T> = {\n  /**\n   * Subclasses without an explicit constructor call through to the factory of their base\n   * definition, providing it with their own constructor to instantiate.\n   */\n  <U extends T>(t?: Type<U>): U;\n\n  /**\n   * If no constructor to instantiate is provided, an instance of type T itself is created.\n   */\n  (t?: undefined): T;\n};\n\nexport function getFactoryDef<T>(type: any, throwNotFound: true): FactoryFn<T>;\nexport function getFactoryDef<T>(type: any): FactoryFn<T> | null;\nexport function getFactoryDef<T>(type: any, throwNotFound?: boolean): FactoryFn<T> | null {\n  const hasFactoryDef = type.hasOwnProperty(NG_FACTORY_DEF);\n  if (!hasFactoryDef && throwNotFound === true && ngDevMode) {\n    throw new Error(`Type ${stringify(type)} does not have 'ɵfac' property.`);\n  }\n  return hasFactoryDef ? type[NG_FACTORY_DEF] : null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertEqual, assertLessThanOrEqual} from './assert';\n\n/**\n * Determines if the contents of two arrays is identical\n *\n * @param a first array\n * @param b second array\n * @param identityAccessor Optional function for extracting stable object identity from a value in\n *     the array.\n */\nexport function arrayEquals<T>(a: T[], b: T[], identityAccessor?: (value: T) => unknown): boolean {\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i++) {\n    let valueA = a[i];\n    let valueB = b[i];\n    if (identityAccessor) {\n      valueA = identityAccessor(valueA) as any;\n      valueB = identityAccessor(valueB) as any;\n    }\n    if (valueB !== valueA) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * Flattens an array.\n */\nexport function flatten(list: any[]): any[] {\n  return list.flat(Number.POSITIVE_INFINITY);\n}\n\nexport function deepForEach<T>(input: (T | any[])[], fn: (value: T) => void): void {\n  input.forEach((value) => (Array.isArray(value) ? deepForEach(value, fn) : fn(value)));\n}\n\nexport function addToArray(arr: any[], index: number, value: any): void {\n  // perf: array.push is faster than array.splice!\n  if (index >= arr.length) {\n    arr.push(value);\n  } else {\n    arr.splice(index, 0, value);\n  }\n}\n\nexport function removeFromArray(arr: any[], index: number): any {\n  // perf: array.pop is faster than array.splice!\n  if (index >= arr.length - 1) {\n    return arr.pop();\n  } else {\n    return arr.splice(index, 1)[0];\n  }\n}\n\nexport function newArray<T = any>(size: number): T[];\nexport function newArray<T>(size: number, value: T): T[];\nexport function newArray<T>(size: number, value?: T): T[] {\n  const list: T[] = [];\n  for (let i = 0; i < size; i++) {\n    list.push(value!);\n  }\n  return list;\n}\n\n/**\n * Remove item from array (Same as `Array.splice()` but faster.)\n *\n * `Array.splice()` is not as fast because it has to allocate an array for the elements which were\n * removed. This causes memory pressure and slows down code when most of the time we don't\n * care about the deleted items array.\n *\n * https://jsperf.com/fast-array-splice (About 20x faster)\n *\n * @param array Array to splice\n * @param index Index of element in array to remove.\n * @param count Number of items to remove.\n */\nexport function arraySplice(array: any[], index: number, count: number): void {\n  const length = array.length - count;\n  while (index < length) {\n    array[index] = array[index + count];\n    index++;\n  }\n  while (count--) {\n    array.pop(); // shrink the array\n  }\n}\n\n/**\n * Same as `Array.splice(index, 0, value)` but faster.\n *\n * `Array.splice()` is not fast because it has to allocate an array for the elements which were\n * removed. This causes memory pressure and slows down code when most of the time we don't\n * care about the deleted items array.\n *\n * @param array Array to splice.\n * @param index Index in array where the `value` should be added.\n * @param value Value to add to array.\n */\nexport function arrayInsert(array: any[], index: number, value: any): void {\n  ngDevMode && assertLessThanOrEqual(index, array.length, \"Can't insert past array end.\");\n  let end = array.length;\n  while (end > index) {\n    const previousEnd = end - 1;\n    array[end] = array[previousEnd];\n    end = previousEnd;\n  }\n  array[index] = value;\n}\n\n/**\n * Same as `Array.splice2(index, 0, value1, value2)` but faster.\n *\n * `Array.splice()` is not fast because it has to allocate an array for the elements which were\n * removed. This causes memory pressure and slows down code when most of the time we don't\n * care about the deleted items array.\n *\n * @param array Array to splice.\n * @param index Index in array where the `value` should be added.\n * @param value1 Value to add to array.\n * @param value2 Value to add to array.\n */\nexport function arrayInsert2(array: any[], index: number, value1: any, value2: any): void {\n  ngDevMode && assertLessThanOrEqual(index, array.length, \"Can't insert past array end.\");\n  let end = array.length;\n  if (end == index) {\n    // inserting at the end.\n    array.push(value1, value2);\n  } else if (end === 1) {\n    // corner case when we have less items in array than we have items to insert.\n    array.push(value2, array[0]);\n    array[0] = value1;\n  } else {\n    end--;\n    array.push(array[end - 1], array[end]);\n    while (end > index) {\n      const previousEnd = end - 2;\n      array[end] = array[previousEnd];\n      end--;\n    }\n    array[index] = value1;\n    array[index + 1] = value2;\n  }\n}\n\n/**\n * Get an index of an `value` in a sorted `array`.\n *\n * NOTE:\n * - This uses binary search algorithm for fast removals.\n *\n * @param array A sorted array to binary search.\n * @param value The value to look for.\n * @returns index of the value.\n *   - positive index if value found.\n *   - negative index if value not found. (`~index` to get the value where it should have been\n *     located)\n */\nexport function arrayIndexOfSorted(array: string[], value: string): number {\n  return _arrayIndexOfSorted(array, value, 0);\n}\n\n/**\n * `KeyValueArray` is an array where even positions contain keys and odd positions contain values.\n *\n * `KeyValueArray` provides a very efficient way of iterating over its contents. For small\n * sets (~10) the cost of binary searching an `KeyValueArray` has about the same performance\n * characteristics that of a `Map` with significantly better memory footprint.\n *\n * If used as a `Map` the keys are stored in alphabetical order so that they can be binary searched\n * for retrieval.\n *\n * See: `keyValueArraySet`, `keyValueArrayGet`, `keyValueArrayIndexOf`, `keyValueArrayDelete`.\n */\nexport interface KeyValueArray<VALUE> extends Array<VALUE | string> {\n  __brand__: 'array-map';\n}\n\n/**\n * Set a `value` for a `key`.\n *\n * @param keyValueArray to modify.\n * @param key The key to locate or create.\n * @param value The value to set for a `key`.\n * @returns index (always even) of where the value vas set.\n */\nexport function keyValueArraySet<V>(\n  keyValueArray: KeyValueArray<V>,\n  key: string,\n  value: V,\n): number {\n  let index = keyValueArrayIndexOf(keyValueArray, key);\n  if (index >= 0) {\n    // if we found it set it.\n    keyValueArray[index | 1] = value;\n  } else {\n    index = ~index;\n    arrayInsert2(keyValueArray, index, key, value);\n  }\n  return index;\n}\n\n/**\n * Retrieve a `value` for a `key` (on `undefined` if not found.)\n *\n * @param keyValueArray to search.\n * @param key The key to locate.\n * @return The `value` stored at the `key` location or `undefined if not found.\n */\nexport function keyValueArrayGet<V>(keyValueArray: KeyValueArray<V>, key: string): V | undefined {\n  const index = keyValueArrayIndexOf(keyValueArray, key);\n  if (index >= 0) {\n    // if we found it retrieve it.\n    return keyValueArray[index | 1] as V;\n  }\n  return undefined;\n}\n\n/**\n * Retrieve a `key` index value in the array or `-1` if not found.\n *\n * @param keyValueArray to search.\n * @param key The key to locate.\n * @returns index of where the key is (or should have been.)\n *   - positive (even) index if key found.\n *   - negative index if key not found. (`~index` (even) to get the index where it should have\n *     been inserted.)\n */\nexport function keyValueArrayIndexOf<V>(keyValueArray: KeyValueArray<V>, key: string): number {\n  return _arrayIndexOfSorted(keyValueArray as string[], key, 1);\n}\n\n/**\n * Delete a `key` (and `value`) from the `KeyValueArray`.\n *\n * @param keyValueArray to modify.\n * @param key The key to locate or delete (if exist).\n * @returns index of where the key was (or should have been.)\n *   - positive (even) index if key found and deleted.\n *   - negative index if key not found. (`~index` (even) to get the index where it should have\n *     been.)\n */\nexport function keyValueArrayDelete<V>(keyValueArray: KeyValueArray<V>, key: string): number {\n  const index = keyValueArrayIndexOf(keyValueArray, key);\n  if (index >= 0) {\n    // if we found it remove it.\n    arraySplice(keyValueArray, index, 2);\n  }\n  return index;\n}\n\n/**\n * INTERNAL: Get an index of an `value` in a sorted `array` by grouping search by `shift`.\n *\n * NOTE:\n * - This uses binary search algorithm for fast removals.\n *\n * @param array A sorted array to binary search.\n * @param value The value to look for.\n * @param shift grouping shift.\n *   - `0` means look at every location\n *   - `1` means only look at every other (even) location (the odd locations are to be ignored as\n *         they are values.)\n * @returns index of the value.\n *   - positive index if value found.\n *   - negative index if value not found. (`~index` to get the value where it should have been\n * inserted)\n */\nfunction _arrayIndexOfSorted(array: string[], value: string, shift: number): number {\n  ngDevMode && assertEqual(Array.isArray(array), true, 'Expecting an array');\n  let start = 0;\n  let end = array.length >> shift;\n  while (end !== start) {\n    const middle = start + ((end - start) >> 1); // find the middle.\n    const current = array[middle << shift];\n    if (value === current) {\n      return middle << shift;\n    } else if (current > value) {\n      end = middle;\n    } else {\n      start = middle + 1; // We already searched middle so make it non-inclusive by adding 1\n    }\n  }\n  return ~(end << shift);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {initNgDevMode} from './ng_dev_mode';\n\n/**\n * This file contains reuseable \"empty\" symbols that can be used as default return values\n * in different parts of the rendering code. Because the same symbols are returned, this\n * allows for identity checks against these values to be consistently used by the framework\n * code.\n */\n\nexport const EMPTY_OBJ: never = {} as never;\nexport const EMPTY_ARRAY: any[] = [];\n\n// freezing the values prevents any code from accidentally inserting new values in\nif ((typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode()) {\n  // These property accesses can be ignored because ngDevMode will be set to false\n  // when optimizing code and the whole if statement will be dropped.\n  // tslint:disable-next-line:no-toplevel-property-access\n  Object.freeze(EMPTY_OBJ);\n  // tslint:disable-next-line:no-toplevel-property-access\n  Object.freeze(EMPTY_ARRAY);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from './injection_token';\n\n/**\n * A multi-provider token for initialization functions that will run upon construction of an\n * environment injector.\n *\n * @deprecated from v19.0.0, use provideEnvironmentInitializer instead\n *\n * @see {@link provideEnvironmentInitializer}\n *\n * Note: As opposed to the `APP_INITIALIZER` token, the `ENVIRONMENT_INITIALIZER` functions are not awaited,\n * hence they should not be `async`.\n *\n * @publicApi\n */\nexport const ENVIRONMENT_INITIALIZER = new InjectionToken<ReadonlyArray<() => void>>(\n  ngDevMode ? 'ENVIRONMENT_INITIALIZER' : '',\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from './injection_token';\nimport type {Injector} from './injector';\nimport {InjectorMarkers} from './injector_marker';\n\n/**\n * An InjectionToken that gets the current `Injector` for `createInjector()`-style injectors.\n *\n * Requesting this token instead of `Injector` allows `StaticInjector` to be tree-shaken from a\n * project.\n *\n * @publicApi\n */\nexport const INJECTOR = new InjectionToken<Injector>(\n  ngDevMode ? 'INJECTOR' : '',\n  // Disable tslint because this is const enum which gets inlined not top level prop access.\n  // tslint:disable-next-line: no-toplevel-property-access\n  InjectorMarkers.Injector as any, // Special value used by Ivy to identify `Injector`.\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\n\nimport {InjectionToken} from './injection_token';\n\nexport const INJECTOR_DEF_TYPES = new InjectionToken<ReadonlyArray<Type<unknown>>>(\n  ngDevMode ? 'INJECTOR_DEF_TYPES' : '',\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {stringify} from '../util/stringify';\nimport type {Injector} from './injector';\nimport {THROW_IF_NOT_FOUND} from './injector_compatibility';\n\nexport class NullInjector implements Injector {\n  get(token: any, notFoundValue: any = THROW_IF_NOT_FOUND): any {\n    if (notFoundValue === THROW_IF_NOT_FOUND) {\n      const error = new Error(`NullInjectorError: No provider for ${stringify(token)}!`);\n      error.name = 'NullInjectorError';\n      throw error;\n    }\n    return notFoundValue;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport type {NgModuleDef} from '../r3_symbols';\nimport {stringify} from '../util/stringify';\nimport {NG_COMP_DEF, NG_DIR_DEF, NG_MOD_DEF, NG_PIPE_DEF} from './fields';\nimport type {ComponentDef, DirectiveDef, PipeDef} from './interfaces/definition';\n\nexport function getNgModuleDef<T>(type: any, throwNotFound: true): NgModuleDef<T>;\nexport function getNgModuleDef<T>(type: any): NgModuleDef<T> | null;\nexport function getNgModuleDef<T>(type: any, throwNotFound?: boolean): NgModuleDef<T> | null {\n  const ngModuleDef = type[NG_MOD_DEF] || null;\n  if (!ngModuleDef && throwNotFound === true) {\n    throw new Error(`Type ${stringify(type)} does not have 'ɵmod' property.`);\n  }\n  return ngModuleDef;\n}\n\n/**\n * The following getter methods retrieve the definition from the type. Currently the retrieval\n * honors inheritance, but in the future we may change the rule to require that definitions are\n * explicit. This would require some sort of migration strategy.\n */\n\nexport function getComponentDef<T>(type: any): ComponentDef<T> | null {\n  return type[NG_COMP_DEF] || null;\n}\n\nexport function getDirectiveDef<T>(type: any): DirectiveDef<T> | null {\n  return type[NG_DIR_DEF] || null;\n}\n\nexport function getPipeDef<T>(type: any): PipeDef<T> | null {\n  return type[NG_PIPE_DEF] || null;\n}\n\n/**\n * Checks whether a given Component, Directive or Pipe is marked as standalone.\n * This will return false if passed anything other than a Component, Directive, or Pipe class\n * See [this guide](guide/components/importing) for additional information:\n *\n * @param type A reference to a Component, Directive or Pipe.\n * @publicApi\n */\nexport function isStandalone(type: Type<unknown>): boolean {\n  const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef(type);\n  return def !== null && def.standalone;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type} from '../interface/type';\nimport {getComponentDef} from '../render3/def_getters';\nimport {getFactoryDef} from '../render3/definition_factory';\nimport {throwCyclicDependencyError, throwInvalidProviderError} from '../render3/errors_di';\nimport {stringifyForError} from '../render3/util/stringify_utils';\nimport {deepForEach} from '../util/array_utils';\nimport {EMPTY_ARRAY} from '../util/empty';\nimport {getClosureSafeProperty} from '../util/property';\nimport {stringify} from '../util/stringify';\n\nimport {resolveForwardRef} from './forward_ref';\nimport {ENVIRONMENT_INITIALIZER} from './initializer_token';\nimport {ɵɵinject as inject} from './injector_compatibility';\nimport {getInjectorDef, InjectorType, InjectorTypeWithProviders} from './interface/defs';\nimport {\n  ClassProvider,\n  ConstructorProvider,\n  EnvironmentProviders,\n  ExistingProvider,\n  FactoryProvider,\n  InternalEnvironmentProviders,\n  isEnvironmentProviders,\n  ModuleWithProviders,\n  Provider,\n  StaticClassProvider,\n  TypeProvider,\n  ValueProvider,\n} from './interface/provider';\nimport {INJECTOR_DEF_TYPES} from './internal_tokens';\n\n/**\n * Wrap an array of `Provider`s into `EnvironmentProviders`, preventing them from being accidentally\n * referenced in `@Component` in a component injector.\n *\n * @publicApi\n */\nexport function makeEnvironmentProviders(\n  providers: (Provider | EnvironmentProviders)[],\n): EnvironmentProviders {\n  return {\n    ɵproviders: providers,\n  } as unknown as EnvironmentProviders;\n}\n\n/**\n * @description\n * This function is used to provide initialization functions that will be executed upon construction\n * of an environment injector.\n *\n * Note that the provided initializer is run in the injection context.\n *\n * Previously, this was achieved using the `ENVIRONMENT_INITIALIZER` token which is now deprecated.\n *\n * @see {@link ENVIRONMENT_INITIALIZER}\n *\n * @usageNotes\n * The following example illustrates how to configure an initialization function using\n * `provideEnvironmentInitializer()`\n * ```ts\n * createEnvironmentInjector(\n *   [\n *     provideEnvironmentInitializer(() => {\n *       console.log('environment initialized');\n *     }),\n *   ],\n *   parentInjector\n * );\n * ```\n *\n * @publicApi\n */\nexport function provideEnvironmentInitializer(initializerFn: () => void): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: ENVIRONMENT_INITIALIZER,\n      multi: true,\n      useValue: initializerFn,\n    },\n  ]);\n}\n\n/**\n * A source of providers for the `importProvidersFrom` function.\n *\n * @publicApi\n */\nexport type ImportProvidersSource =\n  | Type<unknown>\n  | ModuleWithProviders<unknown>\n  | Array<ImportProvidersSource>;\n\ntype WalkProviderTreeVisitor = (\n  provider: SingleProvider,\n  container: Type<unknown> | InjectorType<unknown>,\n) => void;\n\n/**\n * Collects providers from all NgModules and standalone components, including transitively imported\n * ones.\n *\n * Providers extracted via `importProvidersFrom` are only usable in an application injector or\n * another environment injector (such as a route injector). They should not be used in component\n * providers.\n *\n * More information about standalone components can be found in [this\n * guide](guide/components/importing).\n *\n * @usageNotes\n * The results of the `importProvidersFrom` call can be used in the `bootstrapApplication` call:\n *\n * ```ts\n * await bootstrapApplication(RootComponent, {\n *   providers: [\n *     importProvidersFrom(NgModuleOne, NgModuleTwo)\n *   ]\n * });\n * ```\n *\n * You can also use the `importProvidersFrom` results in the `providers` field of a route, when a\n * standalone component is used:\n *\n * ```ts\n * export const ROUTES: Route[] = [\n *   {\n *     path: 'foo',\n *     providers: [\n *       importProvidersFrom(NgModuleOne, NgModuleTwo)\n *     ],\n *     component: YourStandaloneComponent\n *   }\n * ];\n * ```\n *\n * @returns Collected providers from the specified list of types.\n * @publicApi\n */\nexport function importProvidersFrom(...sources: ImportProvidersSource[]): EnvironmentProviders {\n  return {\n    ɵproviders: internalImportProvidersFrom(true, sources),\n    ɵfromNgModule: true,\n  } as InternalEnvironmentProviders;\n}\n\nexport function internalImportProvidersFrom(\n  checkForStandaloneCmp: boolean,\n  ...sources: ImportProvidersSource[]\n): Provider[] {\n  const providersOut: SingleProvider[] = [];\n  const dedup = new Set<Type<unknown>>(); // already seen types\n  let injectorTypesWithProviders: InjectorTypeWithProviders<unknown>[] | undefined;\n\n  const collectProviders: WalkProviderTreeVisitor = (provider) => {\n    providersOut.push(provider);\n  };\n\n  deepForEach(sources, (source) => {\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && checkForStandaloneCmp) {\n      const cmpDef = getComponentDef(source);\n      if (cmpDef?.standalone) {\n        throw new RuntimeError(\n          RuntimeErrorCode.IMPORT_PROVIDERS_FROM_STANDALONE,\n          `Importing providers supports NgModule or ModuleWithProviders but got a standalone component \"${stringifyForError(\n            source,\n          )}\"`,\n        );\n      }\n    }\n\n    // Narrow `source` to access the internal type analogue for `ModuleWithProviders`.\n    const internalSource = source as Type<unknown> | InjectorTypeWithProviders<unknown>;\n    if (walkProviderTree(internalSource, collectProviders, [], dedup)) {\n      injectorTypesWithProviders ||= [];\n      injectorTypesWithProviders.push(internalSource);\n    }\n  });\n  // Collect all providers from `ModuleWithProviders` types.\n  if (injectorTypesWithProviders !== undefined) {\n    processInjectorTypesWithProviders(injectorTypesWithProviders, collectProviders);\n  }\n\n  return providersOut;\n}\n\n/**\n * Collects all providers from the list of `ModuleWithProviders` and appends them to the provided\n * array.\n */\nfunction processInjectorTypesWithProviders(\n  typesWithProviders: InjectorTypeWithProviders<unknown>[],\n  visitor: WalkProviderTreeVisitor,\n): void {\n  for (let i = 0; i < typesWithProviders.length; i++) {\n    const {ngModule, providers} = typesWithProviders[i];\n    deepForEachProvider(\n      providers! as Array<Provider | InternalEnvironmentProviders>,\n      (provider) => {\n        ngDevMode && validateProvider(provider, providers || EMPTY_ARRAY, ngModule);\n        visitor(provider, ngModule);\n      },\n    );\n  }\n}\n\n/**\n * Internal type for a single provider in a deep provider array.\n */\nexport type SingleProvider =\n  | TypeProvider\n  | ValueProvider\n  | ClassProvider\n  | ConstructorProvider\n  | ExistingProvider\n  | FactoryProvider\n  | StaticClassProvider;\n\n/**\n * The logic visits an `InjectorType`, an `InjectorTypeWithProviders`, or a standalone\n * `ComponentType`, and all of its transitive providers and collects providers.\n *\n * If an `InjectorTypeWithProviders` that declares providers besides the type is specified,\n * the function will return \"true\" to indicate that the providers of the type definition need\n * to be processed. This allows us to process providers of injector types after all imports of\n * an injector definition are processed. (following View Engine semantics: see FW-1349)\n */\nexport function walkProviderTree(\n  container: Type<unknown> | InjectorTypeWithProviders<unknown>,\n  visitor: WalkProviderTreeVisitor,\n  parents: Type<unknown>[],\n  dedup: Set<Type<unknown>>,\n): container is InjectorTypeWithProviders<unknown> {\n  container = resolveForwardRef(container);\n  if (!container) return false;\n\n  // The actual type which had the definition. Usually `container`, but may be an unwrapped type\n  // from `InjectorTypeWithProviders`.\n  let defType: Type<unknown> | null = null;\n\n  let injDef = getInjectorDef(container);\n  const cmpDef = !injDef && getComponentDef(container);\n  if (!injDef && !cmpDef) {\n    // `container` is not an injector type or a component type. It might be:\n    //  * An `InjectorTypeWithProviders` that wraps an injector type.\n    //  * A standalone directive or pipe that got pulled in from a standalone component's\n    //    dependencies.\n    // Try to unwrap it as an `InjectorTypeWithProviders` first.\n    const ngModule: Type<unknown> | undefined = (container as InjectorTypeWithProviders<any>)\n      .ngModule as Type<unknown> | undefined;\n    injDef = getInjectorDef(ngModule);\n    if (injDef) {\n      defType = ngModule!;\n    } else {\n      // Not a component or injector type, so ignore it.\n      return false;\n    }\n  } else if (cmpDef && !cmpDef.standalone) {\n    return false;\n  } else {\n    defType = container as Type<unknown>;\n  }\n\n  // Check for circular dependencies.\n  if (ngDevMode && parents.indexOf(defType) !== -1) {\n    const defName = stringify(defType);\n    const path = parents.map(stringify);\n    throwCyclicDependencyError(defName, path);\n  }\n\n  // Check for multiple imports of the same module\n  const isDuplicate = dedup.has(defType);\n\n  if (cmpDef) {\n    if (isDuplicate) {\n      // This component definition has already been processed.\n      return false;\n    }\n    dedup.add(defType);\n\n    if (cmpDef.dependencies) {\n      const deps =\n        typeof cmpDef.dependencies === 'function' ? cmpDef.dependencies() : cmpDef.dependencies;\n      for (const dep of deps) {\n        walkProviderTree(dep, visitor, parents, dedup);\n      }\n    }\n  } else if (injDef) {\n    // First, include providers from any imports.\n    if (injDef.imports != null && !isDuplicate) {\n      // Before processing defType's imports, add it to the set of parents. This way, if it ends\n      // up deeply importing itself, this can be detected.\n      ngDevMode && parents.push(defType);\n      // Add it to the set of dedups. This way we can detect multiple imports of the same module\n      dedup.add(defType);\n\n      let importTypesWithProviders: InjectorTypeWithProviders<any>[] | undefined;\n      try {\n        deepForEach(injDef.imports, (imported) => {\n          if (walkProviderTree(imported, visitor, parents, dedup)) {\n            importTypesWithProviders ||= [];\n            // If the processed import is an injector type with providers, we store it in the\n            // list of import types with providers, so that we can process those afterwards.\n            importTypesWithProviders.push(imported);\n          }\n        });\n      } finally {\n        // Remove it from the parents set when finished.\n        ngDevMode && parents.pop();\n      }\n\n      // Imports which are declared with providers (TypeWithProviders) need to be processed\n      // after all imported modules are processed. This is similar to how View Engine\n      // processes/merges module imports in the metadata resolver. See: FW-1349.\n      if (importTypesWithProviders !== undefined) {\n        processInjectorTypesWithProviders(importTypesWithProviders, visitor);\n      }\n    }\n\n    if (!isDuplicate) {\n      // Track the InjectorType and add a provider for it.\n      // It's important that this is done after the def's imports.\n      const factory = getFactoryDef(defType) || (() => new defType!());\n\n      // Append extra providers to make more info available for consumers (to retrieve an injector\n      // type), as well as internally (to calculate an injection scope correctly and eagerly\n      // instantiate a `defType` when an injector is created).\n\n      // Provider to create `defType` using its factory.\n      visitor({provide: defType, useFactory: factory, deps: EMPTY_ARRAY}, defType);\n\n      // Make this `defType` available to an internal logic that calculates injector scope.\n      visitor({provide: INJECTOR_DEF_TYPES, useValue: defType, multi: true}, defType);\n\n      // Provider to eagerly instantiate `defType` via `INJECTOR_INITIALIZER`.\n      visitor(\n        {provide: ENVIRONMENT_INITIALIZER, useValue: () => inject(defType!), multi: true},\n        defType,\n      );\n    }\n\n    // Next, include providers listed on the definition itself.\n    const defProviders = injDef.providers as Array<SingleProvider | InternalEnvironmentProviders>;\n    if (defProviders != null && !isDuplicate) {\n      const injectorType = container as InjectorType<any>;\n      deepForEachProvider(defProviders, (provider) => {\n        ngDevMode && validateProvider(provider as SingleProvider, defProviders, injectorType);\n        visitor(provider, injectorType);\n      });\n    }\n  } else {\n    // Should not happen, but just in case.\n    return false;\n  }\n\n  return (\n    defType !== container && (container as InjectorTypeWithProviders<any>).providers !== undefined\n  );\n}\n\nfunction validateProvider(\n  provider: SingleProvider,\n  providers: Array<SingleProvider | InternalEnvironmentProviders>,\n  containerType: Type<unknown>,\n): void {\n  if (\n    isTypeProvider(provider) ||\n    isValueProvider(provider) ||\n    isFactoryProvider(provider) ||\n    isExistingProvider(provider)\n  ) {\n    return;\n  }\n\n  // Here we expect the provider to be a `useClass` provider (by elimination).\n  const classRef = resolveForwardRef(\n    provider && ((provider as StaticClassProvider | ClassProvider).useClass || provider.provide),\n  );\n  if (!classRef) {\n    throwInvalidProviderError(containerType, providers, provider);\n  }\n}\n\nfunction deepForEachProvider(\n  providers: Array<Provider | InternalEnvironmentProviders>,\n  fn: (provider: SingleProvider) => void,\n): void {\n  for (let provider of providers) {\n    if (isEnvironmentProviders(provider)) {\n      provider = provider.ɵproviders;\n    }\n    if (Array.isArray(provider)) {\n      deepForEachProvider(provider, fn);\n    } else {\n      fn(provider);\n    }\n  }\n}\n\nexport const USE_VALUE: string = getClosureSafeProperty<ValueProvider>({\n  provide: String,\n  useValue: getClosureSafeProperty,\n});\n\nexport function isValueProvider(value: SingleProvider): value is ValueProvider {\n  return value !== null && typeof value == 'object' && USE_VALUE in value;\n}\n\nexport function isExistingProvider(value: SingleProvider): value is ExistingProvider {\n  return !!(value && (value as ExistingProvider).useExisting);\n}\n\nexport function isFactoryProvider(value: SingleProvider): value is FactoryProvider {\n  return !!(value && (value as FactoryProvider).useFactory);\n}\n\nexport function isTypeProvider(value: SingleProvider): value is TypeProvider {\n  return typeof value === 'function';\n}\n\nexport function isClassProvider(value: SingleProvider): value is ClassProvider {\n  return !!(value as StaticClassProvider | ClassProvider).useClass;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from './injection_token';\n\nexport type InjectorScope = 'root' | 'platform' | 'environment';\n\n/**\n * An internal token whose presence in an injector indicates that the injector should treat itself\n * as a root scoped injector when processing requests for unknown tokens which may indicate\n * they are provided in the root scope.\n */\nexport const INJECTOR_SCOPE = new InjectionToken<InjectorScope | null>(\n  ngDevMode ? 'Set Injector scope.' : '',\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport '../util/ng_dev_mode';\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {OnDestroy} from '../interface/lifecycle_hooks';\nimport {Type} from '../interface/type';\nimport {\n  emitInstanceCreatedByInjectorEvent,\n  emitProviderConfiguredEvent,\n  InjectorProfilerContext,\n  runInInjectorProfilerContext,\n  setInjectorProfilerContext,\n} from '../render3/debug/injector_profiler';\nimport {FactoryFn, getFactoryDef} from '../render3/definition_factory';\nimport {\n  throwCyclicDependencyError,\n  throwInvalidProviderError,\n  throwMixedMultiProviderError,\n} from '../render3/errors_di';\nimport {NG_ENV_ID} from '../render3/fields';\nimport {newArray} from '../util/array_utils';\nimport {EMPTY_ARRAY} from '../util/empty';\nimport {stringify} from '../util/stringify';\n\nimport {resolveForwardRef} from './forward_ref';\nimport {ENVIRONMENT_INITIALIZER} from './initializer_token';\nimport {setInjectImplementation} from './inject_switch';\nimport {InjectionToken} from './injection_token';\nimport type {Injector} from './injector';\nimport {\n  catchInjectorError,\n  convertToBitFlags,\n  injectArgs,\n  NG_TEMP_TOKEN_PATH,\n  setCurrentInjector,\n  THROW_IF_NOT_FOUND,\n  ɵɵinject,\n} from './injector_compatibility';\nimport {INJECTOR} from './injector_token';\nimport {\n  getInheritedInjectableDef,\n  getInjectableDef,\n  InjectorType,\n  ɵɵInjectableDeclaration,\n} from './interface/defs';\nimport {InjectFlags, InjectOptions} from './interface/injector';\nimport {\n  ClassProvider,\n  ConstructorProvider,\n  EnvironmentProviders,\n  InternalEnvironmentProviders,\n  isEnvironmentProviders,\n  Provider,\n  StaticClassProvider,\n  TypeProvider,\n} from './interface/provider';\nimport {INJECTOR_DEF_TYPES} from './internal_tokens';\nimport {NullInjector} from './null_injector';\nimport {\n  isExistingProvider,\n  isFactoryProvider,\n  isTypeProvider,\n  isValueProvider,\n  SingleProvider,\n} from './provider_collection';\nimport {ProviderToken} from './provider_token';\nimport {INJECTOR_SCOPE, InjectorScope} from './scope';\nimport {setActiveConsumer} from '@angular/core/primitives/signals';\nimport {\n  Injector as PrimitivesInjector,\n  InjectionToken as PrimitivesInjectionToken,\n  NOT_FOUND,\n  NotFound,\n} from '@angular/core/primitives/di';\n\n/**\n * Marker which indicates that a value has not yet been created from the factory function.\n */\nconst NOT_YET = {};\n\n/**\n * Marker which indicates that the factory function for a token is in the process of being called.\n *\n * If the injector is asked to inject a token with its value set to CIRCULAR, that indicates\n * injection of a dependency has recursively attempted to inject the original token, and there is\n * a circular dependency among the providers.\n */\nconst CIRCULAR = {};\n\n/**\n * A lazily initialized NullInjector.\n */\nlet NULL_INJECTOR: Injector | undefined = undefined;\n\nexport function getNullInjector(): Injector {\n  if (NULL_INJECTOR === undefined) {\n    NULL_INJECTOR = new NullInjector();\n  }\n  return NULL_INJECTOR;\n}\n\n/**\n * An entry in the injector which tracks information about the given token, including a possible\n * current value.\n */\ninterface Record<T> {\n  factory: ((_: undefined, flags?: InjectFlags) => T) | undefined;\n  value: T | {};\n  multi: any[] | undefined;\n}\n\n/**\n * An `Injector` that's part of the environment injector hierarchy, which exists outside of the\n * component tree.\n */\nexport abstract class EnvironmentInjector implements Injector {\n  /**\n   * Retrieves an instance from the injector based on the provided token.\n   * @returns The instance from the injector if defined, otherwise the `notFoundValue`.\n   * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.\n   */\n  abstract get<T>(\n    token: ProviderToken<T>,\n    notFoundValue: undefined,\n    options: InjectOptions & {\n      optional?: false;\n    },\n  ): T;\n  /**\n   * Retrieves an instance from the injector based on the provided token.\n   * @returns The instance from the injector if defined, otherwise the `notFoundValue`.\n   * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.\n   */\n  abstract get<T>(\n    token: ProviderToken<T>,\n    notFoundValue: null | undefined,\n    options: InjectOptions,\n  ): T | null;\n  /**\n   * Retrieves an instance from the injector based on the provided token.\n   * @returns The instance from the injector if defined, otherwise the `notFoundValue`.\n   * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.\n   */\n  abstract get<T>(token: ProviderToken<T>, notFoundValue?: T, options?: InjectOptions): T;\n  /**\n   * Retrieves an instance from the injector based on the provided token.\n   * @returns The instance from the injector if defined, otherwise the `notFoundValue`.\n   * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.\n   * @deprecated use object-based flags (`InjectOptions`) instead.\n   */\n  abstract get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): T;\n  /**\n   * @deprecated from v4.0.0 use ProviderToken<T>\n   * @suppress {duplicate}\n   */\n  abstract get(token: any, notFoundValue?: any): any;\n\n  /**\n   * Runs the given function in the context of this `EnvironmentInjector`.\n   *\n   * Within the function's stack frame, [`inject`](api/core/inject) can be used to inject\n   * dependencies from this injector. Note that `inject` is only usable synchronously, and cannot be\n   * used in any asynchronous callbacks or after any `await` points.\n   *\n   * @param fn the closure to be run in the context of this injector\n   * @returns the return value of the function, if any\n   * @deprecated use the standalone function `runInInjectionContext` instead\n   */\n  abstract runInContext<ReturnT>(fn: () => ReturnT): ReturnT;\n\n  abstract destroy(): void;\n\n  /**\n   * @internal\n   */\n  abstract onDestroy(callback: () => void): () => void;\n}\n\nexport class R3Injector extends EnvironmentInjector implements PrimitivesInjector {\n  /**\n   * Map of tokens to records which contain the instances of those tokens.\n   * - `null` value implies that we don't have the record. Used by tree-shakable injectors\n   * to prevent further searches.\n   */\n  private records = new Map<ProviderToken<any>, Record<any> | null>();\n\n  /**\n   * Set of values instantiated by this injector which contain `ngOnDestroy` lifecycle hooks.\n   */\n  private _ngOnDestroyHooks = new Set<OnDestroy>();\n\n  private _onDestroyHooks: Array<() => void> = [];\n\n  /**\n   * Flag indicating that this injector was previously destroyed.\n   */\n  get destroyed(): boolean {\n    return this._destroyed;\n  }\n  private _destroyed = false;\n\n  private injectorDefTypes: Set<Type<unknown>>;\n\n  constructor(\n    providers: Array<Provider | EnvironmentProviders>,\n    readonly parent: Injector,\n    readonly source: string | null,\n    readonly scopes: Set<InjectorScope>,\n  ) {\n    super();\n    // Start off by creating Records for every provider.\n    forEachSingleProvider(providers as Array<Provider | InternalEnvironmentProviders>, (provider) =>\n      this.processProvider(provider),\n    );\n\n    // Make sure the INJECTOR token provides this injector.\n    this.records.set(INJECTOR, makeRecord(undefined, this));\n\n    // And `EnvironmentInjector` if the current injector is supposed to be env-scoped.\n    if (scopes.has('environment')) {\n      this.records.set(EnvironmentInjector, makeRecord(undefined, this));\n    }\n\n    // Detect whether this injector has the APP_ROOT_SCOPE token and thus should provide\n    // any injectable scoped to APP_ROOT_SCOPE.\n    const record = this.records.get(INJECTOR_SCOPE) as Record<InjectorScope | null>;\n    if (record != null && typeof record.value === 'string') {\n      this.scopes.add(record.value as InjectorScope);\n    }\n\n    this.injectorDefTypes = new Set(this.get(INJECTOR_DEF_TYPES, EMPTY_ARRAY, InjectFlags.Self));\n  }\n\n  retrieve<T>(token: PrimitivesInjectionToken<T>, options?: unknown): T | NotFound {\n    const ngOptions = options as InjectOptions;\n    return this.get(token, ngOptions.optional ? NOT_FOUND : THROW_IF_NOT_FOUND, ngOptions);\n  }\n\n  /**\n   * Destroy the injector and release references to every instance or provider associated with it.\n   *\n   * Also calls the `OnDestroy` lifecycle hooks of every instance that was created for which a\n   * hook was found.\n   */\n  override destroy(): void {\n    assertNotDestroyed(this);\n\n    // Set destroyed = true first, in case lifecycle hooks re-enter destroy().\n    this._destroyed = true;\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      // Call all the lifecycle hooks.\n      for (const service of this._ngOnDestroyHooks) {\n        service.ngOnDestroy();\n      }\n      const onDestroyHooks = this._onDestroyHooks;\n      // Reset the _onDestroyHooks array before iterating over it to prevent hooks that unregister\n      // themselves from mutating the array during iteration.\n      this._onDestroyHooks = [];\n      for (const hook of onDestroyHooks) {\n        hook();\n      }\n    } finally {\n      // Release all references.\n      this.records.clear();\n      this._ngOnDestroyHooks.clear();\n      this.injectorDefTypes.clear();\n      setActiveConsumer(prevConsumer);\n    }\n  }\n\n  override onDestroy(callback: () => void): () => void {\n    assertNotDestroyed(this);\n    this._onDestroyHooks.push(callback);\n    return () => this.removeOnDestroy(callback);\n  }\n\n  override runInContext<ReturnT>(fn: () => ReturnT): ReturnT {\n    assertNotDestroyed(this);\n\n    const previousInjector = setCurrentInjector(this);\n    const previousInjectImplementation = setInjectImplementation(undefined);\n\n    let prevInjectContext: InjectorProfilerContext | undefined;\n    if (ngDevMode) {\n      prevInjectContext = setInjectorProfilerContext({injector: this, token: null});\n    }\n\n    try {\n      return fn();\n    } finally {\n      setCurrentInjector(previousInjector);\n      setInjectImplementation(previousInjectImplementation);\n      ngDevMode && setInjectorProfilerContext(prevInjectContext!);\n    }\n  }\n\n  override get<T>(\n    token: ProviderToken<T>,\n    notFoundValue: any = THROW_IF_NOT_FOUND,\n    flags: InjectFlags | InjectOptions = InjectFlags.Default,\n  ): T {\n    assertNotDestroyed(this);\n\n    if (token.hasOwnProperty(NG_ENV_ID)) {\n      return (token as any)[NG_ENV_ID](this);\n    }\n\n    flags = convertToBitFlags(flags) as InjectFlags;\n\n    // Set the injection context.\n    let prevInjectContext: InjectorProfilerContext;\n    if (ngDevMode) {\n      prevInjectContext = setInjectorProfilerContext({injector: this, token: token as Type<T>});\n    }\n    const previousInjector = setCurrentInjector(this);\n    const previousInjectImplementation = setInjectImplementation(undefined);\n    try {\n      // Check for the SkipSelf flag.\n      if (!(flags & InjectFlags.SkipSelf)) {\n        // SkipSelf isn't set, check if the record belongs to this injector.\n        let record: Record<T> | undefined | null = this.records.get(token);\n        if (record === undefined) {\n          // No record, but maybe the token is scoped to this injector. Look for an injectable\n          // def with a scope matching this injector.\n          const def = couldBeInjectableType(token) && getInjectableDef(token);\n          if (def && this.injectableDefInScope(def)) {\n            // Found an injectable def and it's scoped to this injector. Pretend as if it was here\n            // all along.\n\n            if (ngDevMode) {\n              runInInjectorProfilerContext(this, token as Type<T>, () => {\n                emitProviderConfiguredEvent(token as TypeProvider);\n              });\n            }\n\n            record = makeRecord(injectableDefOrInjectorDefFactory(token), NOT_YET);\n          } else {\n            record = null;\n          }\n          this.records.set(token, record);\n        }\n        // If a record was found, get the instance for it and return it.\n        if (record != null /* NOT null || undefined */) {\n          return this.hydrate(token, record, flags);\n        }\n      }\n\n      // Select the next injector based on the Self flag - if self is set, the next injector is\n      // the NullInjector, otherwise it's the parent.\n      const nextInjector = !(flags & InjectFlags.Self) ? this.parent : getNullInjector();\n      // Set the notFoundValue based on the Optional flag - if optional is set and notFoundValue\n      // is undefined, the value is null, otherwise it's the notFoundValue.\n      notFoundValue =\n        flags & InjectFlags.Optional && notFoundValue === THROW_IF_NOT_FOUND ? null : notFoundValue;\n      return nextInjector.get(token, notFoundValue);\n    } catch (e: any) {\n      if (e.name === 'NullInjectorError') {\n        const path: any[] = (e[NG_TEMP_TOKEN_PATH] = e[NG_TEMP_TOKEN_PATH] || []);\n        path.unshift(stringify(token));\n        if (previousInjector) {\n          // We still have a parent injector, keep throwing\n          throw e;\n        } else {\n          // Format & throw the final error message when we don't have any previous injector\n          return catchInjectorError(e, token, 'R3InjectorError', this.source);\n        }\n      } else {\n        throw e;\n      }\n    } finally {\n      // Lastly, restore the previous injection context.\n      setInjectImplementation(previousInjectImplementation);\n      setCurrentInjector(previousInjector);\n      ngDevMode && setInjectorProfilerContext(prevInjectContext!);\n    }\n  }\n\n  /** @internal */\n  resolveInjectorInitializers() {\n    const prevConsumer = setActiveConsumer(null);\n    const previousInjector = setCurrentInjector(this);\n    const previousInjectImplementation = setInjectImplementation(undefined);\n    let prevInjectContext: InjectorProfilerContext | undefined;\n    if (ngDevMode) {\n      prevInjectContext = setInjectorProfilerContext({injector: this, token: null});\n    }\n\n    try {\n      const initializers = this.get(ENVIRONMENT_INITIALIZER, EMPTY_ARRAY, InjectFlags.Self);\n      if (ngDevMode && !Array.isArray(initializers)) {\n        throw new RuntimeError(\n          RuntimeErrorCode.INVALID_MULTI_PROVIDER,\n          'Unexpected type of the `ENVIRONMENT_INITIALIZER` token value ' +\n            `(expected an array, but got ${typeof initializers}). ` +\n            'Please check that the `ENVIRONMENT_INITIALIZER` token is configured as a ' +\n            '`multi: true` provider.',\n        );\n      }\n      for (const initializer of initializers) {\n        initializer();\n      }\n    } finally {\n      setCurrentInjector(previousInjector);\n      setInjectImplementation(previousInjectImplementation);\n      ngDevMode && setInjectorProfilerContext(prevInjectContext!);\n      setActiveConsumer(prevConsumer);\n    }\n  }\n\n  override toString() {\n    const tokens: string[] = [];\n    const records = this.records;\n    for (const token of records.keys()) {\n      tokens.push(stringify(token));\n    }\n    return `R3Injector[${tokens.join(', ')}]`;\n  }\n\n  /**\n   * Process a `SingleProvider` and add it.\n   */\n  private processProvider(provider: SingleProvider): void {\n    // Determine the token from the provider. Either it's its own token, or has a {provide: ...}\n    // property.\n    provider = resolveForwardRef(provider);\n    let token: any = isTypeProvider(provider)\n      ? provider\n      : resolveForwardRef(provider && provider.provide);\n\n    // Construct a `Record` for the provider.\n    const record = providerToRecord(provider);\n    if (ngDevMode) {\n      runInInjectorProfilerContext(this, token, () => {\n        // Emit InjectorProfilerEventType.Create if provider is a value provider because\n        // these are the only providers that do not go through the value hydration logic\n        // where this event would normally be emitted from.\n        if (isValueProvider(provider)) {\n          emitInstanceCreatedByInjectorEvent(provider.useValue);\n        }\n\n        emitProviderConfiguredEvent(provider);\n      });\n    }\n\n    if (!isTypeProvider(provider) && provider.multi === true) {\n      // If the provider indicates that it's a multi-provider, process it specially.\n      // First check whether it's been defined already.\n      let multiRecord = this.records.get(token);\n      if (multiRecord) {\n        // It has. Throw a nice error if\n        if (ngDevMode && multiRecord.multi === undefined) {\n          throwMixedMultiProviderError();\n        }\n      } else {\n        multiRecord = makeRecord(undefined, NOT_YET, true);\n        multiRecord.factory = () => injectArgs(multiRecord!.multi!);\n        this.records.set(token, multiRecord);\n      }\n      token = provider;\n      multiRecord.multi!.push(provider);\n    } else {\n      if (ngDevMode) {\n        const existing = this.records.get(token);\n        if (existing && existing.multi !== undefined) {\n          throwMixedMultiProviderError();\n        }\n      }\n    }\n    this.records.set(token, record);\n  }\n\n  private hydrate<T>(token: ProviderToken<T>, record: Record<T>, flags: InjectFlags): T {\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      if (record.value === CIRCULAR) {\n        throwCyclicDependencyError(stringify(token));\n      } else if (record.value === NOT_YET) {\n        record.value = CIRCULAR;\n\n        if (ngDevMode) {\n          runInInjectorProfilerContext(this, token as Type<T>, () => {\n            record.value = record.factory!(undefined, flags);\n            emitInstanceCreatedByInjectorEvent(record.value);\n          });\n        } else {\n          record.value = record.factory!(undefined, flags);\n        }\n      }\n      if (typeof record.value === 'object' && record.value && hasOnDestroy(record.value)) {\n        this._ngOnDestroyHooks.add(record.value);\n      }\n      return record.value as T;\n    } finally {\n      setActiveConsumer(prevConsumer);\n    }\n  }\n\n  private injectableDefInScope(def: ɵɵInjectableDeclaration<any>): boolean {\n    if (!def.providedIn) {\n      return false;\n    }\n    const providedIn = resolveForwardRef(def.providedIn);\n    if (typeof providedIn === 'string') {\n      return providedIn === 'any' || this.scopes.has(providedIn);\n    } else {\n      return this.injectorDefTypes.has(providedIn);\n    }\n  }\n\n  private removeOnDestroy(callback: () => void): void {\n    const destroyCBIdx = this._onDestroyHooks.indexOf(callback);\n    if (destroyCBIdx !== -1) {\n      this._onDestroyHooks.splice(destroyCBIdx, 1);\n    }\n  }\n}\n\nfunction injectableDefOrInjectorDefFactory(token: ProviderToken<any>): FactoryFn<any> {\n  // Most tokens will have an injectable def directly on them, which specifies a factory directly.\n  const injectableDef = getInjectableDef(token);\n  const factory = injectableDef !== null ? injectableDef.factory : getFactoryDef(token);\n\n  if (factory !== null) {\n    return factory;\n  }\n\n  // InjectionTokens should have an injectable def (ɵprov) and thus should be handled above.\n  // If it's missing that, it's an error.\n  if (token instanceof InjectionToken) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INJECTION_TOKEN,\n      ngDevMode && `Token ${stringify(token)} is missing a ɵprov definition.`,\n    );\n  }\n\n  // Undecorated types can sometimes be created if they have no constructor arguments.\n  if (token instanceof Function) {\n    return getUndecoratedInjectableFactory(token);\n  }\n\n  // There was no way to resolve a factory for this token.\n  throw new RuntimeError(RuntimeErrorCode.INVALID_INJECTION_TOKEN, ngDevMode && 'unreachable');\n}\n\nfunction getUndecoratedInjectableFactory(token: Function) {\n  // If the token has parameters then it has dependencies that we cannot resolve implicitly.\n  const paramLength = token.length;\n  if (paramLength > 0) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INJECTION_TOKEN,\n      ngDevMode &&\n        `Can't resolve all parameters for ${stringify(token)}: (${newArray(paramLength, '?').join(\n          ', ',\n        )}).`,\n    );\n  }\n\n  // The constructor function appears to have no parameters.\n  // This might be because it inherits from a super-class. In which case, use an injectable\n  // def from an ancestor if there is one.\n  // Otherwise this really is a simple class with no dependencies, so return a factory that\n  // just instantiates the zero-arg constructor.\n  const inheritedInjectableDef = getInheritedInjectableDef(token);\n  if (inheritedInjectableDef !== null) {\n    return () => inheritedInjectableDef.factory(token as Type<any>);\n  } else {\n    return () => new (token as Type<any>)();\n  }\n}\n\nfunction providerToRecord(provider: SingleProvider): Record<any> {\n  if (isValueProvider(provider)) {\n    return makeRecord(undefined, provider.useValue);\n  } else {\n    const factory: ((type?: Type<unknown>, flags?: InjectFlags) => any) | undefined =\n      providerToFactory(provider);\n    return makeRecord(factory, NOT_YET);\n  }\n}\n\n/**\n * Converts a `SingleProvider` into a factory function.\n *\n * @param provider provider to convert to factory\n */\nexport function providerToFactory(\n  provider: SingleProvider,\n  ngModuleType?: InjectorType<any>,\n  providers?: any[],\n): (type?: Type<unknown>, flags?: number) => any {\n  let factory: ((type?: Type<unknown>, flags?: InjectFlags) => any) | undefined = undefined;\n  if (ngDevMode && isEnvironmentProviders(provider)) {\n    throwInvalidProviderError(undefined, providers, provider);\n  }\n\n  if (isTypeProvider(provider)) {\n    const unwrappedProvider = resolveForwardRef(provider);\n    return getFactoryDef(unwrappedProvider) || injectableDefOrInjectorDefFactory(unwrappedProvider);\n  } else {\n    if (isValueProvider(provider)) {\n      factory = () => resolveForwardRef(provider.useValue);\n    } else if (isFactoryProvider(provider)) {\n         factory = () => provider.useFactory(...injectArgs(provider.deps || []));\n    } else if (isExistingProvider(provider)) {\n      factory = (_, flags) =>\n        ɵɵinject(\n          resolveForwardRef(provider.useExisting),\n          flags !== undefined && flags & InjectFlags.Optional ? InjectFlags.Optional : undefined,\n        );\n    } else {\n      const classRef = resolveForwardRef(\n        provider &&\n          ((provider as StaticClassProvider | ClassProvider).useClass || provider.provide),\n      );\n      if (ngDevMode && !classRef) {\n        throwInvalidProviderError(ngModuleType, providers, provider);\n      }\n      if (hasDeps(provider)) {\n        factory = () => new classRef(...injectArgs(provider.deps));\n      } else {\n        return getFactoryDef(classRef) || injectableDefOrInjectorDefFactory(classRef);\n      }\n    }\n  }\n  return factory;\n}\n\nexport function assertNotDestroyed(injector: R3Injector): void {\n  if (injector.destroyed) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INJECTOR_ALREADY_DESTROYED,\n      ngDevMode && 'Injector has already been destroyed.',\n    );\n  }\n}\n\nfunction makeRecord<T>(\n  factory: (() => T) | undefined,\n  value: T | {},\n  multi: boolean = false,\n): Record<T> {\n  return {\n    factory: factory,\n    value: value,\n    multi: multi ? [] : undefined,\n  };\n}\n\nfunction hasDeps(\n  value: ClassProvider | ConstructorProvider | StaticClassProvider,\n): value is ClassProvider & {deps: any[]} {\n  return !!(value as any).deps;\n}\n\nfunction hasOnDestroy(value: any): value is OnDestroy {\n  return (\n    value !== null &&\n    typeof value === 'object' &&\n    typeof (value as OnDestroy).ngOnDestroy === 'function'\n  );\n}\n\nfunction couldBeInjectableType(value: any): value is ProviderToken<any> {\n  return (\n    typeof value === 'function' || (typeof value === 'object' && value instanceof InjectionToken)\n  );\n}\n\nfunction forEachSingleProvider(\n  providers: Array<Provider | EnvironmentProviders>,\n  fn: (provider: SingleProvider) => void,\n): void {\n  for (const provider of providers) {\n    if (Array.isArray(provider)) {\n      forEachSingleProvider(provider, fn);\n    } else if (provider && isEnvironmentProviders(provider)) {\n      forEachSingleProvider(provider.ɵproviders, fn);\n    } else {\n      fn(provider as SingleProvider);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {\n  InjectorProfilerContext,\n  setInjectorProfilerContext,\n} from '../render3/debug/injector_profiler';\n\nimport {getInjectImplementation, setInjectImplementation} from './inject_switch';\nimport type {Injector} from './injector';\nimport {getCurrentInjector, setCurrentInjector, RetrievingInjector} from './injector_compatibility';\nimport {assertNotDestroyed, R3Injector} from './r3_injector';\nimport {Injector as PrimitivesInjector} from '@angular/core/primitives/di';\n\n/**\n * Runs the given function in the [context](guide/di/dependency-injection-context) of the given\n * `Injector`.\n *\n * Within the function's stack frame, [`inject`](api/core/inject) can be used to inject dependencies\n * from the given `Injector`. Note that `inject` is only usable synchronously, and cannot be used in\n * any asynchronous callbacks or after any `await` points.\n *\n * @param injector the injector which will satisfy calls to [`inject`](api/core/inject) while `fn`\n *     is executing\n * @param fn the closure to be run in the context of `injector`\n * @returns the return value of the function, if any\n * @publicApi\n */\nexport function runInInjectionContext<ReturnT>(injector: Injector, fn: () => ReturnT): ReturnT {\n  let internalInjector: PrimitivesInjector;\n  if (injector instanceof R3Injector) {\n    assertNotDestroyed(injector);\n    internalInjector = injector;\n  } else {\n    internalInjector = new RetrievingInjector(injector);\n  }\n\n  let prevInjectorProfilerContext: InjectorProfilerContext;\n  if (ngDevMode) {\n    prevInjectorProfilerContext = setInjectorProfilerContext({injector, token: null});\n  }\n  const prevInjector = setCurrentInjector(internalInjector);\n  const previousInjectImplementation = setInjectImplementation(undefined);\n  try {\n    return fn();\n  } finally {\n    setCurrentInjector(prevInjector);\n    ngDevMode && setInjectorProfilerContext(prevInjectorProfilerContext!);\n    setInjectImplementation(previousInjectImplementation);\n  }\n}\n\n/**\n * Whether the current stack frame is inside an injection context.\n */\nexport function isInInjectionContext(): boolean {\n  return getInjectImplementation() !== undefined || getCurrentInjector() != null;\n}\n/**\n * Asserts that the current stack frame is within an [injection\n * context](guide/di/dependency-injection-context) and has access to `inject`.\n *\n * @param debugFn a reference to the function making the assertion (used for the error message).\n *\n * @publicApi\n */\nexport function assertInInjectionContext(debugFn: Function): void {\n  // Taking a `Function` instead of a string name here prevents the unminified name of the function\n  // from being retained in the bundle regardless of minification.\n  if (!isInInjectionContext()) {\n    throw new RuntimeError(\n      RuntimeErrorCode.MISSING_INJECTION_CONTEXT,\n      ngDevMode &&\n        debugFn.name +\n          '() can only be used within an injection context such as a constructor, a factory function, a field initializer, or a function used with `runInInjectionContext`',\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * A set of interfaces which are shared between `@angular/core` and `@angular/compiler` to allow\n * for late binding of `@angular/compiler` for JIT purposes.\n *\n * This file has two copies. Please ensure that they are in sync:\n *  - packages/compiler/src/compiler_facade_interface.ts          (main)\n *  - packages/core/src/compiler/compiler_facade_interface.ts     (replica)\n *\n * Please ensure that the two files are in sync using this command:\n * ```shell\n * cp packages/compiler/src/compiler_facade_interface.ts \\\n *    packages/core/src/compiler/compiler_facade_interface.ts\n * ```\n */\n\nexport interface ExportedCompilerFacade {\n  ɵcompilerFacade: CompilerFacade;\n}\n\nexport interface CompilerFacade {\n  compilePipe(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3PipeMetadataFacade,\n  ): any;\n  compilePipeDeclaration(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    declaration: R3DeclarePipeFacade,\n  ): any;\n  compileInjectable(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3InjectableMetadataFacade,\n  ): any;\n  compileInjectableDeclaration(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3DeclareInjectableFacade,\n  ): any;\n  compileInjector(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3InjectorMetadataFacade,\n  ): any;\n  compileInjectorDeclaration(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    declaration: R3DeclareInjectorFacade,\n  ): any;\n  compileNgModule(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3NgModuleMetadataFacade,\n  ): any;\n  compileNgModuleDeclaration(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    declaration: R3DeclareNgModuleFacade,\n  ): any;\n  compileDirective(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3DirectiveMetadataFacade,\n  ): any;\n  compileDirectiveDeclaration(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    declaration: R3DeclareDirectiveFacade,\n  ): any;\n  compileComponent(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3ComponentMetadataFacade,\n  ): any;\n  compileComponentDeclaration(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    declaration: R3DeclareComponentFacade,\n  ): any;\n  compileFactory(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3FactoryDefMetadataFacade,\n  ): any;\n  compileFactoryDeclaration(\n    angularCoreEnv: CoreEnvironment,\n    sourceMapUrl: string,\n    meta: R3DeclareFactoryFacade,\n  ): any;\n\n  createParseSourceSpan(kind: string, typeName: string, sourceUrl: string): ParseSourceSpan;\n\n  FactoryTarget: typeof FactoryTarget;\n  // Note that we do not use `{new(): ResourceLoader}` here because\n  // the resource loader class is abstract and not constructable.\n  ResourceLoader: Function & {prototype: ResourceLoader};\n}\n\nexport interface CoreEnvironment {\n  [name: string]: unknown;\n}\n\nexport type ResourceLoader = {\n  get(url: string): Promise<string> | string;\n};\n\nexport type Provider = unknown;\nexport type Type = Function;\nexport type OpaqueValue = unknown;\n\nexport enum FactoryTarget {\n  Directive = 0,\n  Component = 1,\n  Injectable = 2,\n  Pipe = 3,\n  NgModule = 4,\n}\n\nexport interface R3DependencyMetadataFacade {\n  token: OpaqueValue;\n  attribute: string | null;\n  host: boolean;\n  optional: boolean;\n  self: boolean;\n  skipSelf: boolean;\n}\n\nexport interface R3DeclareDependencyMetadataFacade {\n  token: OpaqueValue;\n  attribute?: boolean;\n  host?: boolean;\n  optional?: boolean;\n  self?: boolean;\n  skipSelf?: boolean;\n}\n\nexport interface R3PipeMetadataFacade {\n  name: string;\n  type: Type;\n  pipeName: string;\n  pure: boolean;\n  isStandalone: boolean;\n}\n\nexport interface R3InjectableMetadataFacade {\n  name: string;\n  type: Type;\n  typeArgumentCount: number;\n  providedIn?: Type | 'root' | 'platform' | 'any' | null;\n  useClass?: OpaqueValue;\n  useFactory?: OpaqueValue;\n  useExisting?: OpaqueValue;\n  useValue?: OpaqueValue;\n  deps?: R3DependencyMetadataFacade[];\n}\n\nexport interface R3NgModuleMetadataFacade {\n  type: Type;\n  bootstrap: Function[];\n  declarations: Function[];\n  imports: Function[];\n  exports: Function[];\n  schemas: {name: string}[] | null;\n  id: string | null;\n}\n\nexport interface R3InjectorMetadataFacade {\n  name: string;\n  type: Type;\n  providers: Provider[];\n  imports: OpaqueValue[];\n}\n\nexport interface R3HostDirectiveMetadataFacade {\n  directive: Type;\n  inputs?: string[];\n  outputs?: string[];\n}\n\nexport interface R3DirectiveMetadataFacade {\n  name: string;\n  type: Type;\n  typeSourceSpan: ParseSourceSpan;\n  selector: string | null;\n  queries: R3QueryMetadataFacade[];\n  host: {[key: string]: string};\n  propMetadata: {[key: string]: OpaqueValue[]};\n  lifecycle: {usesOnChanges: boolean};\n  inputs: (string | {name: string; alias?: string; required?: boolean})[];\n  outputs: string[];\n  usesInheritance: boolean;\n  exportAs: string[] | null;\n  providers: Provider[] | null;\n  viewQueries: R3QueryMetadataFacade[];\n  isStandalone: boolean;\n  isSignal: boolean;\n  hostDirectives: R3HostDirectiveMetadataFacade[] | null;\n}\n\nexport interface R3ComponentMetadataFacade extends R3DirectiveMetadataFacade {\n  template: string;\n  preserveWhitespaces: boolean;\n  animations: OpaqueValue[] | undefined;\n  declarations: R3TemplateDependencyFacade[];\n  styles: string[];\n  encapsulation: ViewEncapsulation;\n  viewProviders: Provider[] | null;\n  interpolation?: [string, string];\n  changeDetection?: ChangeDetectionStrategy;\n}\n\n// TODO(legacy-partial-output-inputs): Remove in v18.\n// https://github.com/angular/angular/blob/d4b423690210872b5c32a322a6090beda30b05a3/packages/core/src/compiler/compiler_facade_interface.ts#L197-L199\nexport type LegacyInputPartialMapping =\n  | string\n  | [bindingPropertyName: string, classPropertyName: string, transformFunction?: Function];\n\nexport interface R3DeclareDirectiveFacade {\n  selector?: string;\n  type: Type;\n  version: string;\n  inputs?: {\n    [fieldName: string]:\n      | {\n          classPropertyName: string;\n          publicName: string;\n          isSignal: boolean;\n          isRequired: boolean;\n          transformFunction: Function | null;\n        }\n      | LegacyInputPartialMapping;\n  };\n  outputs?: {[classPropertyName: string]: string};\n  host?: {\n    attributes?: {[key: string]: OpaqueValue};\n    listeners?: {[key: string]: string};\n    properties?: {[key: string]: string};\n    classAttribute?: string;\n    styleAttribute?: string;\n  };\n  queries?: R3DeclareQueryMetadataFacade[];\n  viewQueries?: R3DeclareQueryMetadataFacade[];\n  providers?: OpaqueValue;\n  exportAs?: string[];\n  usesInheritance?: boolean;\n  usesOnChanges?: boolean;\n  isStandalone?: boolean;\n  hostDirectives?: R3HostDirectiveMetadataFacade[] | null;\n  isSignal?: boolean;\n}\n\nexport interface R3DeclareComponentFacade extends R3DeclareDirectiveFacade {\n  template: string;\n  isInline?: boolean;\n  styles?: string[];\n\n  // Post-standalone libraries use a unified dependencies field.\n  dependencies?: R3DeclareTemplateDependencyFacade[];\n\n  // Pre-standalone libraries have separate component/directive/pipe fields:\n  components?: R3DeclareDirectiveDependencyFacade[];\n  directives?: R3DeclareDirectiveDependencyFacade[];\n  pipes?: {[pipeName: string]: OpaqueValue | (() => OpaqueValue)};\n\n  deferBlockDependencies?: (() => Promise<Type> | null)[];\n  viewProviders?: OpaqueValue;\n  animations?: OpaqueValue;\n  changeDetection?: ChangeDetectionStrategy;\n  encapsulation?: ViewEncapsulation;\n  interpolation?: [string, string];\n  preserveWhitespaces?: boolean;\n}\n\nexport type R3DeclareTemplateDependencyFacade = {\n  kind: string;\n} & (\n  | R3DeclareDirectiveDependencyFacade\n  | R3DeclarePipeDependencyFacade\n  | R3DeclareNgModuleDependencyFacade\n);\n\nexport interface R3DeclareDirectiveDependencyFacade {\n  kind?: 'directive' | 'component';\n  selector: string;\n  type: OpaqueValue | (() => OpaqueValue);\n  inputs?: string[];\n  outputs?: string[];\n  exportAs?: string[];\n}\n\nexport interface R3DeclarePipeDependencyFacade {\n  kind?: 'pipe';\n  name: string;\n  type: OpaqueValue | (() => OpaqueValue);\n}\n\nexport interface R3DeclareNgModuleDependencyFacade {\n  kind: 'ngmodule';\n  type: OpaqueValue | (() => OpaqueValue);\n}\n\nexport enum R3TemplateDependencyKind {\n  Directive = 0,\n  Pipe = 1,\n  NgModule = 2,\n}\n\nexport interface R3TemplateDependencyFacade {\n  kind: R3TemplateDependencyKind;\n  type: OpaqueValue | (() => OpaqueValue);\n}\nexport interface R3FactoryDefMetadataFacade {\n  name: string;\n  type: Type;\n  typeArgumentCount: number;\n  deps: R3DependencyMetadataFacade[] | null;\n  target: FactoryTarget;\n}\n\nexport interface R3DeclareFactoryFacade {\n  type: Type;\n  deps: R3DeclareDependencyMetadataFacade[] | 'invalid' | null;\n  target: FactoryTarget;\n}\n\nexport interface R3DeclareInjectableFacade {\n  type: Type;\n  providedIn?: Type | 'root' | 'platform' | 'any' | null;\n  useClass?: OpaqueValue;\n  useFactory?: OpaqueValue;\n  useExisting?: OpaqueValue;\n  useValue?: OpaqueValue;\n  deps?: R3DeclareDependencyMetadataFacade[];\n}\n\nexport enum ViewEncapsulation {\n  Emulated = 0,\n  // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.\n  None = 2,\n  ShadowDom = 3,\n}\n\nexport type ChangeDetectionStrategy = number;\n\nexport interface R3QueryMetadataFacade {\n  propertyName: string;\n  first: boolean;\n  predicate: OpaqueValue | string[];\n  descendants: boolean;\n  emitDistinctChangesOnly: boolean;\n  read: OpaqueValue | null;\n  static: boolean;\n  isSignal: boolean;\n}\n\nexport interface R3DeclareQueryMetadataFacade {\n  propertyName: string;\n  first?: boolean;\n  predicate: OpaqueValue | string[];\n  descendants?: boolean;\n  read?: OpaqueValue;\n  static?: boolean;\n  emitDistinctChangesOnly?: boolean;\n  isSignal?: boolean;\n}\n\nexport interface R3DeclareInjectorFacade {\n  type: Type;\n  imports?: OpaqueValue[];\n  providers?: OpaqueValue[];\n}\n\nexport interface R3DeclareNgModuleFacade {\n  type: Type;\n  bootstrap?: OpaqueValue[] | (() => OpaqueValue[]);\n  declarations?: OpaqueValue[] | (() => OpaqueValue[]);\n  imports?: OpaqueValue[] | (() => OpaqueValue[]);\n  exports?: OpaqueValue[] | (() => OpaqueValue[]);\n  schemas?: OpaqueValue[];\n  id?: OpaqueValue;\n}\n\nexport interface R3DeclarePipeFacade {\n  type: Type;\n  name: string;\n  version: string;\n  pure?: boolean;\n  isStandalone?: boolean;\n}\n\nexport interface ParseSourceSpan {\n  start: any;\n  end: any;\n  details: any;\n  fullStart: any;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {global} from '../util/global';\nimport {CompilerFacade, ExportedCompilerFacade, Type} from './compiler_facade_interface';\nexport * from './compiler_facade_interface';\n\nexport const enum JitCompilerUsage {\n  Decorator,\n  PartialDeclaration,\n}\n\ninterface JitCompilerUsageRequest {\n  usage: JitCompilerUsage;\n  kind: 'directive' | 'component' | 'pipe' | 'injectable' | 'NgModule';\n  type: Type;\n}\n\nexport function getCompilerFacade(request: JitCompilerUsageRequest): CompilerFacade {\n  const globalNg: ExportedCompilerFacade = global['ng'];\n  if (globalNg && globalNg.ɵcompilerFacade) {\n    return globalNg.ɵcompilerFacade;\n  }\n\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    // Log the type as an error so that a developer can easily navigate to the type from the\n    // console.\n    console.error(`JIT compilation failed for ${request.kind}`, request.type);\n\n    let message = `The ${request.kind} '${request.type.name}' needs to be compiled using the JIT compiler, but '@angular/compiler' is not available.\\n\\n`;\n    if (request.usage === JitCompilerUsage.PartialDeclaration) {\n      message += `The ${request.kind} is part of a library that has been partially compiled.\\n`;\n      message += `However, the Angular Linker has not processed the library such that JIT compilation is used as fallback.\\n`;\n      message += '\\n';\n      message += `Ideally, the library is processed using the Angular Linker to become fully AOT compiled.\\n`;\n    } else {\n      message += `JIT compilation is discouraged for production use-cases! Consider using AOT mode instead.\\n`;\n    }\n    message += `Alternatively, the JIT compiler should be loaded by bootstrapping using '@angular/platform-browser-dynamic' or '@angular/platform-server',\\n`;\n    message += `or manually provide the compiler with 'import \"@angular/compiler\";' before bootstrapping.`;\n    throw new Error(message);\n  } else {\n    throw new Error('JIT compiler unavailable');\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {resolveForwardRef} from '../forward_ref';\nimport {ɵɵinject, ɵɵinvalidFactoryDep} from '../injector_compatibility';\nimport {ɵɵdefineInjectable, ɵɵdefineInjector} from '../interface/defs';\n\n/**\n * A mapping of the @angular/core API surface used in generated expressions to the actual symbols.\n *\n * This should be kept up to date with the public exports of @angular/core.\n */\nexport const angularCoreDiEnv: {[name: string]: Function} = {\n  'ɵɵdefineInjectable': ɵɵdefineInjectable,\n  'ɵɵdefineInjector': ɵɵdefineInjector,\n  'ɵɵinject': ɵɵinject,\n  'ɵɵinvalidFactoryDep': ɵɵinvalidFactoryDep,\n  'resolveForwardRef': resolveForwardRef,\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @description\n *\n * Represents a type that a Component or other object is instances of.\n *\n * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is represented by\n * the `MyCustomComponent` constructor function.\n *\n * @publicApi\n */\nexport const Type = Function;\n\nexport function isType(v: any): v is Type<any> {\n  return typeof v === 'function';\n}\n\n/**\n * @description\n *\n * Represents an abstract class `T`, if applied to a concrete class it would stop being\n * instantiable.\n *\n * @publicApi\n */\nexport interface AbstractType<T> extends Function {\n  prototype: T;\n}\n\nexport interface Type<T> extends Function {\n  new (...args: any[]): T;\n}\n\n/**\n * Returns a writable type version of type.\n *\n * USAGE:\n * Given:\n * ```ts\n * interface Person {readonly name: string}\n * ```\n *\n * We would like to get a read/write version of `Person`.\n * ```ts\n * const WritablePerson = Writable<Person>;\n * ```\n *\n * The result is that you can do:\n *\n * ```ts\n * const readonlyPerson: Person = {name: 'Marry'};\n * readonlyPerson.name = 'John'; // TypeError\n * (readonlyPerson as WritablePerson).name = 'John'; // OK\n *\n * // Error: Correctly detects that `Person` did not have `age` property.\n * (readonlyPerson as WritablePerson).age = 30;\n * ```\n */\nexport type Writable<T> = {\n  -readonly [K in keyof T]: T[K];\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isType, Type} from '../interface/type';\nimport {newArray} from '../util/array_utils';\nimport {ANNOTATIONS, PARAMETERS, PROP_METADATA} from '../util/decorators';\nimport {global} from '../util/global';\n\nimport {PlatformReflectionCapabilities} from './platform_reflection_capabilities';\n\n/*\n * #########################\n * Attention: These Regular expressions have to hold even if the code is minified!\n * ##########################\n */\n\n/**\n * Regular expression that detects pass-through constructors for ES5 output. This Regex\n * intends to capture the common delegation pattern emitted by TypeScript and Babel. Also\n * it intends to capture the pattern where existing constructors have been downleveled from\n * ES2015 to ES5 using TypeScript w/ downlevel iteration. e.g.\n *\n * ```ts\n *   function MyClass() {\n *     var _this = _super.apply(this, arguments) || this;\n * ```\n *\n * downleveled to ES5 with `downlevelIteration` for TypeScript < 4.2:\n * ```ts\n *   function MyClass() {\n *     var _this = _super.apply(this, __spread(arguments)) || this;\n * ```\n *\n * or downleveled to ES5 with `downlevelIteration` for TypeScript >= 4.2:\n * ```ts\n *   function MyClass() {\n *     var _this = _super.apply(this, __spreadArray([], __read(arguments), false)) || this;\n * ```\n *\n * More details can be found in: https://github.com/angular/angular/issues/38453.\n */\nexport const ES5_DELEGATE_CTOR =\n  /^function\\s+\\S+\\(\\)\\s*{[\\s\\S]+\\.apply\\(this,\\s*(arguments|(?:[^()]+\\(\\[\\],)?[^()]+\\(arguments\\).*)\\)/;\n/** Regular expression that detects ES2015 classes which extend from other classes. */\nexport const ES2015_INHERITED_CLASS = /^class\\s+[A-Za-z\\d$_]*\\s*extends\\s+[^{]+{/;\n/**\n * Regular expression that detects ES2015 classes which extend from other classes and\n * have an explicit constructor defined.\n */\nexport const ES2015_INHERITED_CLASS_WITH_CTOR =\n  /^class\\s+[A-Za-z\\d$_]*\\s*extends\\s+[^{]+{[\\s\\S]*constructor\\s*\\(/;\n/**\n * Regular expression that detects ES2015 classes which extend from other classes\n * and inherit a constructor.\n */\nexport const ES2015_INHERITED_CLASS_WITH_DELEGATE_CTOR =\n  /^class\\s+[A-Za-z\\d$_]*\\s*extends\\s+[^{]+{[\\s\\S]*constructor\\s*\\(\\)\\s*{[^}]*super\\(\\.\\.\\.arguments\\)/;\n\n/**\n * Determine whether a stringified type is a class which delegates its constructor\n * to its parent.\n *\n * This is not trivial since compiled code can actually contain a constructor function\n * even if the original source code did not. For instance, when the child class contains\n * an initialized instance property.\n */\nexport function isDelegateCtor(typeStr: string): boolean {\n  return (\n    ES5_DELEGATE_CTOR.test(typeStr) ||\n    ES2015_INHERITED_CLASS_WITH_DELEGATE_CTOR.test(typeStr) ||\n    (ES2015_INHERITED_CLASS.test(typeStr) && !ES2015_INHERITED_CLASS_WITH_CTOR.test(typeStr))\n  );\n}\n\nexport class ReflectionCapabilities implements PlatformReflectionCapabilities {\n  private _reflect: any;\n\n  constructor(reflect?: any) {\n    this._reflect = reflect || global['Reflect'];\n  }\n\n  factory<T>(t: Type<T>): (args: any[]) => T {\n    return (...args: any[]) => new t(...args);\n  }\n\n  /** @internal */\n  _zipTypesAndAnnotations(paramTypes: any[], paramAnnotations: any[]): any[][] {\n    let result: any[][];\n\n    if (typeof paramTypes === 'undefined') {\n      result = newArray(paramAnnotations.length);\n    } else {\n      result = newArray(paramTypes.length);\n    }\n\n    for (let i = 0; i < result.length; i++) {\n      // TS outputs Object for parameters without types, while Traceur omits\n      // the annotations. For now we preserve the Traceur behavior to aid\n      // migration, but this can be revisited.\n      if (typeof paramTypes === 'undefined') {\n        result[i] = [];\n      } else if (paramTypes[i] && paramTypes[i] != Object) {\n        result[i] = [paramTypes[i]];\n      } else {\n        result[i] = [];\n      }\n      if (paramAnnotations && paramAnnotations[i] != null) {\n        result[i] = result[i].concat(paramAnnotations[i]);\n      }\n    }\n    return result;\n  }\n\n  private _ownParameters(type: Type<any>, parentCtor: any): any[][] | null {\n    const typeStr = type.toString();\n    // If we have no decorators, we only have function.length as metadata.\n    // In that case, to detect whether a child class declared an own constructor or not,\n    // we need to look inside of that constructor to check whether it is\n    // just calling the parent.\n    // This also helps to work around for https://github.com/Microsoft/TypeScript/issues/12439\n    // that sets 'design:paramtypes' to []\n    // if a class inherits from another class but has no ctor declared itself.\n    if (isDelegateCtor(typeStr)) {\n      return null;\n    }\n\n    // Prefer the direct API.\n    if ((<any>type).parameters && (<any>type).parameters !== parentCtor.parameters) {\n      return (<any>type).parameters;\n    }\n\n    // API of tsickle for lowering decorators to properties on the class.\n    const tsickleCtorParams = (<any>type).ctorParameters;\n    if (tsickleCtorParams && tsickleCtorParams !== parentCtor.ctorParameters) {\n      // Newer tsickle uses a function closure\n      // Retain the non-function case for compatibility with older tsickle\n      const ctorParameters =\n        typeof tsickleCtorParams === 'function' ? tsickleCtorParams() : tsickleCtorParams;\n      const paramTypes = ctorParameters.map((ctorParam: any) => ctorParam && ctorParam.type);\n      const paramAnnotations = ctorParameters.map(\n        (ctorParam: any) => ctorParam && convertTsickleDecoratorIntoMetadata(ctorParam.decorators),\n      );\n      return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);\n    }\n\n    // API for metadata created by invoking the decorators.\n    const paramAnnotations = type.hasOwnProperty(PARAMETERS) && (type as any)[PARAMETERS];\n    const paramTypes =\n      this._reflect &&\n      this._reflect.getOwnMetadata &&\n      this._reflect.getOwnMetadata('design:paramtypes', type);\n    if (paramTypes || paramAnnotations) {\n      return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);\n    }\n\n    // If a class has no decorators, at least create metadata\n    // based on function.length.\n    // Note: We know that this is a real constructor as we checked\n    // the content of the constructor above.\n    return newArray<any[]>(type.length);\n  }\n\n  parameters(type: Type<any>): any[][] {\n    // Note: only report metadata if we have at least one class decorator\n    // to stay in sync with the static reflector.\n    if (!isType(type)) {\n      return [];\n    }\n    const parentCtor = getParentCtor(type);\n    let parameters = this._ownParameters(type, parentCtor);\n    if (!parameters && parentCtor !== Object) {\n      parameters = this.parameters(parentCtor);\n    }\n    return parameters || [];\n  }\n\n  private _ownAnnotations(typeOrFunc: Type<any>, parentCtor: any): any[] | null {\n    // Prefer the direct API.\n    if ((<any>typeOrFunc).annotations && (<any>typeOrFunc).annotations !== parentCtor.annotations) {\n      let annotations = (<any>typeOrFunc).annotations;\n      if (typeof annotations === 'function' && annotations.annotations) {\n        annotations = annotations.annotations;\n      }\n      return annotations;\n    }\n\n    // API of tsickle for lowering decorators to properties on the class.\n    if ((<any>typeOrFunc).decorators && (<any>typeOrFunc).decorators !== parentCtor.decorators) {\n      return convertTsickleDecoratorIntoMetadata((<any>typeOrFunc).decorators);\n    }\n\n    // API for metadata created by invoking the decorators.\n    if (typeOrFunc.hasOwnProperty(ANNOTATIONS)) {\n      return (typeOrFunc as any)[ANNOTATIONS];\n    }\n    return null;\n  }\n\n  annotations(typeOrFunc: Type<any>): any[] {\n    if (!isType(typeOrFunc)) {\n      return [];\n    }\n    const parentCtor = getParentCtor(typeOrFunc);\n    const ownAnnotations = this._ownAnnotations(typeOrFunc, parentCtor) || [];\n    const parentAnnotations = parentCtor !== Object ? this.annotations(parentCtor) : [];\n    return parentAnnotations.concat(ownAnnotations);\n  }\n\n  private _ownPropMetadata(typeOrFunc: any, parentCtor: any): {[key: string]: any[]} | null {\n    // Prefer the direct API.\n    if (\n      (<any>typeOrFunc).propMetadata &&\n      (<any>typeOrFunc).propMetadata !== parentCtor.propMetadata\n    ) {\n      let propMetadata = (<any>typeOrFunc).propMetadata;\n      if (typeof propMetadata === 'function' && propMetadata.propMetadata) {\n        propMetadata = propMetadata.propMetadata;\n      }\n      return propMetadata;\n    }\n\n    // API of tsickle for lowering decorators to properties on the class.\n    if (\n      (<any>typeOrFunc).propDecorators &&\n      (<any>typeOrFunc).propDecorators !== parentCtor.propDecorators\n    ) {\n      const propDecorators = (<any>typeOrFunc).propDecorators;\n      const propMetadata = <{[key: string]: any[]}>{};\n      Object.keys(propDecorators).forEach((prop) => {\n        propMetadata[prop] = convertTsickleDecoratorIntoMetadata(propDecorators[prop]);\n      });\n      return propMetadata;\n    }\n\n    // API for metadata created by invoking the decorators.\n    if (typeOrFunc.hasOwnProperty(PROP_METADATA)) {\n      return (typeOrFunc as any)[PROP_METADATA];\n    }\n    return null;\n  }\n\n  propMetadata(typeOrFunc: any): {[key: string]: any[]} {\n    if (!isType(typeOrFunc)) {\n      return {};\n    }\n    const parentCtor = getParentCtor(typeOrFunc);\n    const propMetadata: {[key: string]: any[]} = {};\n    if (parentCtor !== Object) {\n      const parentPropMetadata = this.propMetadata(parentCtor);\n      Object.keys(parentPropMetadata).forEach((propName) => {\n        propMetadata[propName] = parentPropMetadata[propName];\n      });\n    }\n    const ownPropMetadata = this._ownPropMetadata(typeOrFunc, parentCtor);\n    if (ownPropMetadata) {\n      Object.keys(ownPropMetadata).forEach((propName) => {\n        const decorators: any[] = [];\n        if (propMetadata.hasOwnProperty(propName)) {\n          decorators.push(...propMetadata[propName]);\n        }\n        decorators.push(...ownPropMetadata[propName]);\n        propMetadata[propName] = decorators;\n      });\n    }\n    return propMetadata;\n  }\n\n  ownPropMetadata(typeOrFunc: any): {[key: string]: any[]} {\n    if (!isType(typeOrFunc)) {\n      return {};\n    }\n    return this._ownPropMetadata(typeOrFunc, getParentCtor(typeOrFunc)) || {};\n  }\n\n  hasLifecycleHook(type: any, lcProperty: string): boolean {\n    return type instanceof Type && lcProperty in type.prototype;\n  }\n}\n\nfunction convertTsickleDecoratorIntoMetadata(decoratorInvocations: any[]): any[] {\n  if (!decoratorInvocations) {\n    return [];\n  }\n  return decoratorInvocations.map((decoratorInvocation) => {\n    const decoratorType = decoratorInvocation.type;\n    const annotationCls = decoratorType.annotationCls;\n    const annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : [];\n    return new annotationCls(...annotationArgs);\n  });\n}\n\nfunction getParentCtor(ctor: Function): Type<any> {\n  const parentProto = ctor.prototype ? Object.getPrototypeOf(ctor.prototype) : null;\n  const parentCtor = parentProto ? parentProto.constructor : null;\n  // Note: We always use `Object` as the null value\n  // to simplify checking later on.\n  return parentCtor || Object;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {ChangeDetectionScheduler} from '../../change_detection/scheduling/zoneless_scheduling';\nimport {TDeferBlockDetails} from '../../defer/interfaces';\nimport type {Injector} from '../../di/injector';\nimport {ProviderToken} from '../../di/provider_token';\nimport {DehydratedView} from '../../hydration/interfaces';\nimport {SchemaMetadata} from '../../metadata/schema';\nimport {Sanitizer} from '../../sanitization/sanitizer';\nimport type {AfterRenderSequence} from '../after_render/manager';\nimport type {ReactiveLViewConsumer} from '../reactive_lview_consumer';\nimport type {ViewEffectNode} from '../reactivity/effect';\n\nimport type {LContainer} from './container';\nimport {\n  ComponentDef,\n  ComponentTemplate,\n  DirectiveDef,\n  DirectiveDefList,\n  HostBindingsFunction,\n  PipeDef,\n  PipeDefList,\n  ViewQueriesFunction,\n} from './definition';\nimport {I18nUpdateOpCodes, TI18n, TIcu} from './i18n';\nimport {TConstants, TNode} from './node';\nimport type {LQueries, TQueries} from './query';\nimport {Renderer, RendererFactory} from './renderer';\nimport {RElement} from './renderer_dom';\nimport {TStylingKey, TStylingRange} from './styling';\n\n// Below are constants for LView indices to help us look up LView members\n// without having to remember the specific indices.\n// Uglify will inline these when minifying so there shouldn't be a cost.\nexport const HOST = 0;\nexport const TVIEW = 1;\n\n// Shared with LContainer\nexport const FLAGS = 2;\nexport const PARENT = 3;\nexport const NEXT = 4;\nexport const T_HOST = 5;\n// End shared with LContainer\n\nexport const HYDRATION = 6;\nexport const CLEANUP = 7;\nexport const CONTEXT = 8;\nexport const INJECTOR = 9;\nexport const ENVIRONMENT = 10;\nexport const RENDERER = 11;\nexport const CHILD_HEAD = 12;\nexport const CHILD_TAIL = 13;\n// FIXME(misko): Investigate if the three declarations aren't all same thing.\nexport const DECLARATION_VIEW = 14;\nexport const DECLARATION_COMPONENT_VIEW = 15;\nexport const DECLARATION_LCONTAINER = 16;\nexport const PREORDER_HOOK_FLAGS = 17;\nexport const QUERIES = 18;\nexport const ID = 19;\nexport const EMBEDDED_VIEW_INJECTOR = 20;\nexport const ON_DESTROY_HOOKS = 21;\nexport const EFFECTS_TO_SCHEDULE = 22;\nexport const EFFECTS = 23;\nexport const REACTIVE_TEMPLATE_CONSUMER = 24;\nexport const AFTER_RENDER_SEQUENCES_TO_ADD = 25;\n\n/**\n * Size of LView's header. Necessary to adjust for it when setting slots.\n *\n * IMPORTANT: `HEADER_OFFSET` should only be referred to the in the `ɵɵ*` instructions to translate\n * instruction index into `LView` index. All other indexes should be in the `LView` index space and\n * there should be no need to refer to `HEADER_OFFSET` anywhere else.\n */\nexport const HEADER_OFFSET = 26;\n\n// This interface replaces the real LView interface if it is an arg or a\n// return value of a public instruction. This ensures we don't need to expose\n// the actual interface, which should be kept private.\nexport interface OpaqueViewState {\n  '__brand__': 'Brand for OpaqueViewState that nothing will match';\n}\n\n/**\n * `LView` stores all of the information needed to process the instructions as\n * they are invoked from the template. Each embedded view and component view has its\n * own `LView`. When processing a particular view, we set the `viewData` to that\n * `LView`. When that view is done processing, the `viewData` is set back to\n * whatever the original `viewData` was before (the parent `LView`).\n *\n * Keeping separate state for each view facilities view insertion / deletion, so we\n * don't have to edit the data array based on which views are present.\n */\nexport interface LView<T = unknown> extends Array<any> {\n  /**\n   * The node into which this `LView` is inserted.\n   */\n  [HOST]: RElement | null;\n\n  /**\n   * The static data for this view. We need a reference to this so we can easily walk up the\n   * node tree in DI and get the TView.data array associated with a node (where the\n   * directive defs are stored).\n   */\n  readonly [TVIEW]: TView;\n\n  /** Flags for this view. See LViewFlags for more info. */\n  [FLAGS]: LViewFlags;\n\n  /**\n   * This may store an {@link LView} or {@link LContainer}.\n   *\n   * `LView` - The parent view. This is needed when we exit the view and must restore the previous\n   * LView. Without this, the render method would have to keep a stack of\n   * views as it is recursively rendering templates.\n   *\n   * `LContainer` - The current view is part of a container, and is an embedded view.\n   */\n  [PARENT]: LView | LContainer | null;\n\n  /**\n   *\n   * The next sibling LView or LContainer.\n   *\n   * Allows us to propagate between sibling view states that aren't in the same\n   * container. Embedded views already have a node.next, but it is only set for\n   * views in the same container. We need a way to link component views and views\n   * across containers as well.\n   */\n  [NEXT]: LView | LContainer | null;\n\n  /** Queries active for this view - nodes from a view are reported to those queries. */\n  [QUERIES]: LQueries | null;\n\n  /**\n   * Store the `TNode` of the location where the current `LView` is inserted into.\n   *\n   * Given:\n   * ```html\n   * <div>\n   *   <ng-template><span></span></ng-template>\n   * </div>\n   * ```\n   *\n   * We end up with two `TView`s.\n   * - `parent` `TView` which contains `<div><!-- anchor --></div>`\n   * - `child` `TView` which contains `<span></span>`\n   *\n   * Typically the `child` is inserted into the declaration location of the `parent`, but it can be\n   * inserted anywhere. Because it can be inserted anywhere it is not possible to store the\n   * insertion information in the `TView` and instead we must store it in the `LView[T_HOST]`.\n   *\n   * So to determine where is our insertion parent we would execute:\n   * ```ts\n   * const parentLView = lView[PARENT];\n   * const parentTNode = lView[T_HOST];\n   * const insertionParent = parentLView[parentTNode.index];\n   * ```\n   *\n   *\n   * If `null`, this is the root view of an application (root component is in this view) and it has\n   * no parents.\n   */\n  [T_HOST]: TNode | null;\n\n  /**\n   * When a view is destroyed, listeners need to be released and outputs need to be\n   * unsubscribed. This context array stores both listener functions wrapped with\n   * their context and output subscription instances for a particular view.\n   *\n   * These change per LView instance, so they cannot be stored on TView. Instead,\n   * TView.cleanup saves an index to the necessary context in this array.\n   *\n   * After `LView` is created it is possible to attach additional instance specific functions at the\n   * end of the `lView[CLEANUP]` because we know that no more `T` level cleanup functions will be\n   * added here.\n   */\n  [CLEANUP]: any[] | null;\n\n  /**\n   * - For dynamic views, this is the context with which to render the template (e.g.\n   *   `NgForContext`), or `{}` if not defined explicitly.\n   * - For root view of the root component it's a reference to the component instance itself.\n   * - For components, the context is a reference to the component instance itself.\n   * - For inline views, the context is null.\n   */\n  [CONTEXT]: T;\n\n  /** A Module Injector to be used as fall back after Element Injectors are consulted. */\n  readonly [INJECTOR]: Injector;\n\n  /**\n   * Contextual data that is shared across multiple instances of `LView` in the same application.\n   */\n  [ENVIRONMENT]: LViewEnvironment;\n\n  /** Renderer to be used for this view. */\n  [RENDERER]: Renderer;\n\n  /**\n   * Reference to the first LView or LContainer beneath this LView in\n   * the hierarchy.\n   *\n   * Necessary to store this so views can traverse through their nested views\n   * to remove listeners and call onDestroy callbacks.\n   */\n  [CHILD_HEAD]: LView | LContainer | null;\n\n  /**\n   * The last LView or LContainer beneath this LView in the hierarchy.\n   *\n   * The tail allows us to quickly add a new state to the end of the view list\n   * without having to propagate starting from the first child.\n   */\n  [CHILD_TAIL]: LView | LContainer | null;\n\n  /**\n   * View where this view's template was declared.\n   *\n   * The template for a dynamically created view may be declared in a different view than\n   * it is inserted. We already track the \"insertion view\" (view where the template was\n   * inserted) in LView[PARENT], but we also need access to the \"declaration view\"\n   * (view where the template was declared). Otherwise, we wouldn't be able to call the\n   * view's template function with the proper contexts. Context should be inherited from\n   * the declaration view tree, not the insertion view tree.\n   *\n   * Example (AppComponent template):\n   *\n   * <ng-template #foo></ng-template>       <-- declared here -->\n   * <some-comp [tpl]=\"foo\"></some-comp>    <-- inserted inside this component -->\n   *\n   * The <ng-template> above is declared in the AppComponent template, but it will be passed into\n   * SomeComp and inserted there. In this case, the declaration view would be the AppComponent,\n   * but the insertion view would be SomeComp. When we are removing views, we would want to\n   * traverse through the insertion view to clean up listeners. When we are calling the\n   * template function during change detection, we need the declaration view to get inherited\n   * context.\n   */\n  [DECLARATION_VIEW]: LView | null;\n\n  /**\n   * Points to the declaration component view, used to track transplanted `LView`s.\n   *\n   * See: `DECLARATION_VIEW` which points to the actual `LView` where it was declared, whereas\n   * `DECLARATION_COMPONENT_VIEW` points to the component which may not be same as\n   * `DECLARATION_VIEW`.\n   *\n   * Example:\n   * ```html\n   * <#VIEW #myComp>\n   *  <div *ngIf=\"true\">\n   *   <ng-template #myTmpl>...</ng-template>\n   *  </div>\n   * </#VIEW>\n   * ```\n   * In the above case `DECLARATION_VIEW` for `myTmpl` points to the `LView` of `ngIf` whereas\n   * `DECLARATION_COMPONENT_VIEW` points to `LView` of the `myComp` which owns the template.\n   *\n   * The reason for this is that all embedded views are always check-always whereas the component\n   * view can be check-always or on-push. When we have a transplanted view it is important to\n   * determine if we have transplanted a view from check-always declaration to on-push insertion\n   * point. In such a case the transplanted view needs to be added to the `LContainer` in the\n   * declared `LView` and CD during the declared view CD (in addition to the CD at the insertion\n   * point.) (Any transplanted views which are intra Component are of no interest because the CD\n   * strategy of declaration and insertion will always be the same, because it is the same\n   * component.)\n   *\n   * Queries already track moved views in `LView[DECLARATION_LCONTAINER]` and\n   * `LContainer[MOVED_VIEWS]`. However the queries also track `LView`s which moved within the same\n   * component `LView`. Transplanted views are a subset of moved views, and we use\n   * `DECLARATION_COMPONENT_VIEW` to differentiate them. As in this example.\n   *\n   * Example showing intra component `LView` movement.\n   * ```html\n   * <#VIEW #myComp>\n   *   <div *ngIf=\"condition; then thenBlock else elseBlock\"></div>\n   *   <ng-template #thenBlock>Content to render when condition is true.</ng-template>\n   *   <ng-template #elseBlock>Content to render when condition is false.</ng-template>\n   * </#VIEW>\n   * ```\n   * The `thenBlock` and `elseBlock` is moved but not transplanted.\n   *\n   * Example showing inter component `LView` movement (transplanted view).\n   * ```html\n   * <#VIEW #myComp>\n   *   <ng-template #myTmpl>...</ng-template>\n   *   <insertion-component [template]=\"myTmpl\"></insertion-component>\n   * </#VIEW>\n   * ```\n   * In the above example `myTmpl` is passed into a different component. If `insertion-component`\n   * instantiates `myTmpl` and `insertion-component` is on-push then the `LContainer` needs to be\n   * marked as containing transplanted views and those views need to be CD as part of the\n   * declaration CD.\n   *\n   *\n   * When change detection runs, it iterates over `[MOVED_VIEWS]` and CDs any child `LView`s where\n   * the `DECLARATION_COMPONENT_VIEW` of the current component and the child `LView` does not match\n   * (it has been transplanted across components.)\n   *\n   * Note: `[DECLARATION_COMPONENT_VIEW]` points to itself if the LView is a component view (the\n   *       simplest / most common case).\n   *\n   * see also:\n   *   - https://hackmd.io/@mhevery/rJUJsvv9H write up of the problem\n   *   - `LContainer[HAS_TRANSPLANTED_VIEWS]` which marks which `LContainer` has transplanted views.\n   *   - `LContainer[TRANSPLANT_HEAD]` and `LContainer[TRANSPLANT_TAIL]` storage for transplanted\n   *   - `LView[DECLARATION_LCONTAINER]` similar problem for queries\n   *   - `LContainer[MOVED_VIEWS]` similar problem for queries\n   */\n  [DECLARATION_COMPONENT_VIEW]: LView;\n\n  /**\n   * A declaration point of embedded views (ones instantiated based on the content of a\n   * <ng-template>), null for other types of views.\n   *\n   * We need to track all embedded views created from a given declaration point so we can prepare\n   * query matches in a proper order (query matches are ordered based on their declaration point and\n   * _not_ the insertion point).\n   */\n  [DECLARATION_LCONTAINER]: LContainer | null;\n\n  /**\n   * More flags for this view. See PreOrderHookFlags for more info.\n   */\n  [PREORDER_HOOK_FLAGS]: PreOrderHookFlags;\n\n  /** Unique ID of the view. Used for `__ngContext__` lookups in the `LView` registry. */\n  [ID]: number;\n\n  /**\n   * A container related to hydration annotation information that's associated with this LView.\n   */\n  [HYDRATION]: DehydratedView | null;\n\n  /**\n   * Optional injector assigned to embedded views that takes\n   * precedence over the element and module injectors.\n   */\n  readonly [EMBEDDED_VIEW_INJECTOR]: Injector | null;\n\n  /**\n   * Effect scheduling operations that need to run during this views's update pass.\n   */\n  [EFFECTS_TO_SCHEDULE]: Array<() => void> | null;\n\n  [EFFECTS]: Set<ViewEffectNode> | null;\n\n  /**\n   * A collection of callbacks functions that are executed when a given LView is destroyed. Those\n   * are user defined, LView-specific destroy callbacks that don't have any corresponding TView\n   * entries.\n   */\n  [ON_DESTROY_HOOKS]: Array<() => void> | null;\n\n  /**\n   * The `Consumer` for this `LView`'s template so that signal reads can be tracked.\n   *\n   * This is initially `null` and gets assigned a consumer after template execution\n   * if any signals were read.\n   */\n  [REACTIVE_TEMPLATE_CONSUMER]: ReactiveLViewConsumer | null;\n\n  // AfterRenderSequences that need to be scheduled\n  [AFTER_RENDER_SEQUENCES_TO_ADD]: AfterRenderSequence[] | null;\n}\n\n/**\n * Contextual data that is shared across multiple instances of `LView` in the same application.\n */\nexport interface LViewEnvironment {\n  /** Factory to be used for creating Renderer. */\n  rendererFactory: RendererFactory;\n\n  /** An optional custom sanitizer. */\n  sanitizer: Sanitizer | null;\n\n  /** Scheduler for change detection to notify when application state changes. */\n  changeDetectionScheduler: ChangeDetectionScheduler | null;\n}\n\n/** Flags associated with an LView (saved in LView[FLAGS]) */\nexport const enum LViewFlags {\n  /** The state of the init phase on the first 2 bits */\n  InitPhaseStateIncrementer = 0b00000000001,\n  InitPhaseStateMask = 0b00000000011,\n\n  /**\n   * Whether or not the view is in creationMode.\n   *\n   * This must be stored in the view rather than using `data` as a marker so that\n   * we can properly support embedded views. Otherwise, when exiting a child view\n   * back into the parent view, `data` will be defined and `creationMode` will be\n   * improperly reported as false.\n   */\n  CreationMode = 1 << 2,\n\n  /**\n   * Whether or not this LView instance is on its first processing pass.\n   *\n   * An LView instance is considered to be on its \"first pass\" until it\n   * has completed one creation mode run and one update mode run. At this\n   * time, the flag is turned off.\n   */\n  FirstLViewPass = 1 << 3,\n\n  /** Whether this view has default change detection strategy (checks always) or onPush */\n  CheckAlways = 1 << 4,\n\n  /** Whether there are any i18n blocks inside this LView. */\n  HasI18n = 1 << 5,\n\n  /** Whether or not this view is currently dirty (needing check) */\n  Dirty = 1 << 6,\n\n  /** Whether or not this view is currently attached to change detection tree. */\n  Attached = 1 << 7,\n\n  /** Whether or not this view is destroyed. */\n  Destroyed = 1 << 8,\n\n  /** Whether or not this view is the root view */\n  IsRoot = 1 << 9,\n\n  /**\n   * Whether this moved LView needs to be refreshed. Similar to the Dirty flag, but used for\n   * transplanted and signal views where the parent/ancestor views are not marked dirty as well.\n   * i.e. \"Refresh just this view\". Used in conjunction with the HAS_CHILD_VIEWS_TO_REFRESH\n   * flag.\n   */\n  RefreshView = 1 << 10,\n\n  /** Indicates that the view **or any of its ancestors** have an embedded view injector. */\n  HasEmbeddedViewInjector = 1 << 11,\n\n  /** Indicates that the view was created with `signals: true`. */\n  SignalView = 1 << 12,\n\n  /**\n   * Indicates that this LView has a view underneath it that needs to be refreshed during change\n   * detection. This flag indicates that even if this view is not dirty itself, we still need to\n   * traverse its children during change detection.\n   */\n  HasChildViewsToRefresh = 1 << 13,\n\n  /**\n   * This is the count of the bits the 1 was shifted above (base 10)\n   */\n  IndexWithinInitPhaseShift = 14,\n\n  /**\n   * Index of the current init phase on last 21 bits\n   */\n  IndexWithinInitPhaseIncrementer = 1 << IndexWithinInitPhaseShift,\n\n  // Subtracting 1 gives all 1s to the right of the initial shift\n  // So `(1 << 3) - 1` would give 3 1s: 1 << 3 = 0b01000, subtract 1 = 0b00111\n  IndexWithinInitPhaseReset = (1 << IndexWithinInitPhaseShift) - 1,\n}\n\n/**\n * Possible states of the init phase:\n * - 00: OnInit hooks to be run.\n * - 01: AfterContentInit hooks to be run\n * - 10: AfterViewInit hooks to be run\n * - 11: All init hooks have been run\n */\nexport const enum InitPhaseState {\n  OnInitHooksToBeRun = 0b00,\n  AfterContentInitHooksToBeRun = 0b01,\n  AfterViewInitHooksToBeRun = 0b10,\n  InitPhaseCompleted = 0b11,\n}\n\n/** More flags associated with an LView (saved in LView[PREORDER_HOOK_FLAGS]) */\nexport const enum PreOrderHookFlags {\n  /**\n     The index of the next pre-order hook to be called in the hooks array, on the first 16\n     bits\n   */\n  IndexOfTheNextPreOrderHookMaskMask = 0b01111111111111111,\n\n  /**\n   * The number of init hooks that have already been called, on the last 16 bits\n   */\n  NumberOfInitHooksCalledIncrementer = 0b010000000000000000,\n  NumberOfInitHooksCalledShift = 16,\n  NumberOfInitHooksCalledMask = 0b11111111111111110000000000000000,\n}\n\n/**\n * Stores a set of OpCodes to process `HostBindingsFunction` associated with a current view.\n *\n * In order to invoke `HostBindingsFunction` we need:\n * 1. 'elementIdx`: Index to the element associated with the `HostBindingsFunction`.\n * 2. 'directiveIdx`: Index to the directive associated with the `HostBindingsFunction`. (This will\n *    become the context for the `HostBindingsFunction` invocation.)\n * 3. `bindingRootIdx`: Location where the bindings for the `HostBindingsFunction` start. Internally\n *    `HostBindingsFunction` binding indexes start from `0` so we need to add `bindingRootIdx` to\n *    it.\n * 4. `HostBindingsFunction`: A host binding function to execute.\n *\n * The above information needs to be encoded into the `HostBindingOpCodes` in an efficient manner.\n *\n * 1. `elementIdx` is encoded into the `HostBindingOpCodes` as `~elementIdx` (so a negative number);\n * 2. `directiveIdx`\n * 3. `bindingRootIdx`\n * 4. `HostBindingsFunction` is passed in as is.\n *\n * The `HostBindingOpCodes` array contains:\n * - negative number to select the element index.\n * - followed by 1 or more of:\n *    - a number to select the directive index\n *    - a number to select the bindingRoot index\n *    - and a function to invoke.\n *\n * ## Example\n *\n * ```ts\n * const hostBindingOpCodes = [\n *   ~30,                               // Select element 30\n *   40, 45, MyDir.ɵdir.hostBindings    // Invoke host bindings on MyDir on element 30;\n *                                      // directiveIdx = 40; bindingRootIdx = 45;\n *   50, 55, OtherDir.ɵdir.hostBindings // Invoke host bindings on OtherDire on element 30\n *                                      // directiveIdx = 50; bindingRootIdx = 55;\n * ]\n * ```\n *\n * ## Pseudocode\n * ```ts\n * const hostBindingOpCodes = tView.hostBindingOpCodes;\n * if (hostBindingOpCodes === null) return;\n * for (let i = 0; i < hostBindingOpCodes.length; i++) {\n *   const opCode = hostBindingOpCodes[i] as number;\n *   if (opCode < 0) {\n *     // Negative numbers are element indexes.\n *     setSelectedIndex(~opCode);\n *   } else {\n *     // Positive numbers are NumberTuple which store bindingRootIndex and directiveIndex.\n *     const directiveIdx = opCode;\n *     const bindingRootIndx = hostBindingOpCodes[++i] as number;\n *     const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction<any>;\n *     setBindingRootForHostBindings(bindingRootIndx, directiveIdx);\n *     const context = lView[directiveIdx];\n *     hostBindingFn(RenderFlags.Update, context);\n *   }\n * }\n * ```\n *\n */\nexport interface HostBindingOpCodes extends Array<number | HostBindingsFunction<any>> {\n  __brand__: 'HostBindingOpCodes';\n  debug?: string[];\n}\n\n/**\n * Explicitly marks `TView` as a specific type in `ngDevMode`\n *\n * It is useful to know conceptually what time of `TView` we are dealing with when\n * debugging an application (even if the runtime does not need it.) For this reason\n * we store this information in the `ngDevMode` `TView` and than use it for\n * better debugging experience.\n */\nexport const enum TViewType {\n  /**\n   * Root `TView` is the used to bootstrap components into. It is used in conjunction with\n   * `LView` which takes an existing DOM node not owned by Angular and wraps it in `TView`/`LView`\n   * so that other components can be loaded into it.\n   */\n  Root = 0,\n\n  /**\n   * `TView` associated with a Component. This would be the `TView` directly associated with the\n   * component view (as opposed an `Embedded` `TView` which would be a child of `Component` `TView`)\n   */\n  Component = 1,\n\n  /**\n   * `TView` associated with a template. Such as `*ngIf`, `<ng-template>` etc... A `Component`\n   * can have zero or more `Embedded` `TView`s.\n   */\n  Embedded = 2,\n}\n\n/**\n * The static data for an LView (shared between all templates of a\n * given type).\n *\n * Stored on the `ComponentDef.tView`.\n */\nexport interface TView {\n  /**\n   * Type of `TView` (`Root`|`Component`|`Embedded`).\n   */\n  type: TViewType;\n\n  /**\n   * This is a blueprint used to generate LView instances for this TView. Copying this\n   * blueprint is faster than creating a new LView from scratch.\n   */\n  blueprint: LView;\n\n  /**\n   * The template function used to refresh the view of dynamically created views\n   * and components. Will be null for inline views.\n   */\n  template: ComponentTemplate<{}> | null;\n\n  /**\n   * A function containing query-related instructions.\n   */\n  viewQuery: ViewQueriesFunction<{}> | null;\n\n  /**\n   * A `TNode` representing the declaration location of this `TView` (not part of this TView).\n   */\n  declTNode: TNode | null;\n\n  // FIXME(misko): Why does `TView` not have `declarationTView` property?\n\n  /** Whether or not this template has been processed in creation mode. */\n  firstCreatePass: boolean;\n\n  /**\n   *  Whether or not this template has been processed in update mode (e.g. change detected)\n   *\n   * `firstUpdatePass` is used by styling to set up `TData` to contain metadata about the styling\n   * instructions. (Mainly to build up a linked list of styling priority order.)\n   *\n   * Typically this function gets cleared after first execution. If exception is thrown then this\n   * flag can remain turned un until there is first successful (no exception) pass. This means that\n   * individual styling instructions keep track of if they have already been added to the linked\n   * list to prevent double adding.\n   */\n  firstUpdatePass: boolean;\n\n  /** Static data equivalent of LView.data[]. Contains TNodes, PipeDefInternal or TI18n. */\n  data: TData;\n\n  /**\n   * The binding start index is the index at which the data array\n   * starts to store bindings only. Saving this value ensures that we\n   * will begin reading bindings at the correct point in the array when\n   * we are in update mode.\n   *\n   * -1 means that it has not been initialized.\n   */\n  bindingStartIndex: number;\n\n  /**\n   * The index where the \"expando\" section of `LView` begins. The expando\n   * section contains injectors, directive instances, and host binding values.\n   * Unlike the \"decls\" and \"vars\" sections of `LView`, the length of this\n   * section cannot be calculated at compile-time because directives are matched\n   * at runtime to preserve locality.\n   *\n   * We store this start index so we know where to start checking host bindings\n   * in `setHostBindings`.\n   */\n  expandoStartIndex: number;\n\n  /**\n   * Whether or not there are any static view queries tracked on this view.\n   *\n   * We store this so we know whether or not we should do a view query\n   * refresh after creation mode to collect static query results.\n   */\n  staticViewQueries: boolean;\n\n  /**\n   * Whether or not there are any static content queries tracked on this view.\n   *\n   * We store this so we know whether or not we should do a content query\n   * refresh after creation mode to collect static query results.\n   */\n  staticContentQueries: boolean;\n\n  /**\n   * A reference to the first child node located in the view.\n   */\n  firstChild: TNode | null;\n\n  /**\n   * Stores the OpCodes to be replayed during change-detection to process the `HostBindings`\n   *\n   * See `HostBindingOpCodes` for encoding details.\n   */\n  hostBindingOpCodes: HostBindingOpCodes | null;\n\n  /**\n   * Full registry of directives and components that may be found in this view.\n   *\n   * It's necessary to keep a copy of the full def list on the TView so it's possible\n   * to render template functions without a host component.\n   */\n  directiveRegistry: DirectiveDefList | null;\n\n  /**\n   * Full registry of pipes that may be found in this view.\n   *\n   * The property is either an array of `PipeDefs`s or a function which returns the array of\n   * `PipeDefs`s. The function is necessary to be able to support forward declarations.\n   *\n   * It's necessary to keep a copy of the full def list on the TView so it's possible\n   * to render template functions without a host component.\n   */\n  pipeRegistry: PipeDefList | null;\n\n  /**\n   * Array of ngOnInit, ngOnChanges and ngDoCheck hooks that should be executed for this view in\n   * creation mode.\n   *\n   * This array has a flat structure and contains TNode indices, directive indices (where an\n   * instance can be found in `LView`) and hook functions. TNode index is followed by the directive\n   * index and a hook function. If there are multiple hooks for a given TNode, the TNode index is\n   * not repeated and the next lifecycle hook information is stored right after the previous hook\n   * function. This is done so that at runtime the system can efficiently iterate over all of the\n   * functions to invoke without having to make any decisions/lookups.\n   */\n  preOrderHooks: HookData | null;\n\n  /**\n   * Array of ngOnChanges and ngDoCheck hooks that should be executed for this view in update mode.\n   *\n   * This array has the same structure as the `preOrderHooks` one.\n   */\n  preOrderCheckHooks: HookData | null;\n\n  /**\n   * Array of ngAfterContentInit and ngAfterContentChecked hooks that should be executed\n   * for this view in creation mode.\n   *\n   * Even indices: Directive index\n   * Odd indices: Hook function\n   */\n  contentHooks: HookData | null;\n\n  /**\n   * Array of ngAfterContentChecked hooks that should be executed for this view in update\n   * mode.\n   *\n   * Even indices: Directive index\n   * Odd indices: Hook function\n   */\n  contentCheckHooks: HookData | null;\n\n  /**\n   * Array of ngAfterViewInit and ngAfterViewChecked hooks that should be executed for\n   * this view in creation mode.\n   *\n   * Even indices: Directive index\n   * Odd indices: Hook function\n   */\n  viewHooks: HookData | null;\n\n  /**\n   * Array of ngAfterViewChecked hooks that should be executed for this view in\n   * update mode.\n   *\n   * Even indices: Directive index\n   * Odd indices: Hook function\n   */\n  viewCheckHooks: HookData | null;\n\n  /**\n   * Array of ngOnDestroy hooks that should be executed when this view is destroyed.\n   *\n   * Even indices: Directive index\n   * Odd indices: Hook function\n   */\n  destroyHooks: DestroyHookData | null;\n\n  /**\n   * When a view is destroyed, listeners need to be released and outputs need to be\n   * unsubscribed. This cleanup array stores both listener data (in chunks of 4)\n   * and output data (in chunks of 2) for a particular view. Combining the arrays\n   * saves on memory (70 bytes per array) and on a few bytes of code size (for two\n   * separate for loops).\n   *\n   * If it's a native DOM listener or output subscription being stored:\n   * 1st index is: event name  `name = tView.cleanup[i+0]`\n   * 2nd index is: index of native element or a function that retrieves global target (window,\n   *               document or body) reference based on the native element:\n   *    `typeof idxOrTargetGetter === 'function'`: global target getter function\n   *    `typeof idxOrTargetGetter === 'number'`: index of native element\n   *\n   * 3rd index is: index of listener function `listener = lView[CLEANUP][tView.cleanup[i+2]]`\n   * 4th index is: `useCaptureOrIndx = tView.cleanup[i+3]`\n   *    `typeof useCaptureOrIndx == 'boolean' : useCapture boolean\n   *    `typeof useCaptureOrIndx == 'number':\n   *         `useCaptureOrIndx >= 0` `removeListener = LView[CLEANUP][useCaptureOrIndx]`\n   *         `useCaptureOrIndx <  0` `subscription = LView[CLEANUP][-useCaptureOrIndx]`\n   *\n   * If it's an output subscription or query list destroy hook:\n   * 1st index is: output unsubscribe function / query list destroy function\n   * 2nd index is: index of function context in LView.cleanupInstances[]\n   *               `tView.cleanup[i+0].call(lView[CLEANUP][tView.cleanup[i+1]])`\n   */\n  cleanup: any[] | null;\n\n  /**\n   * A list of element indices for child components that will need to be\n   * refreshed when the current view has finished its check. These indices have\n   * already been adjusted for the HEADER_OFFSET.\n   *\n   */\n  components: number[] | null;\n\n  /**\n   * A collection of queries tracked in a given view.\n   */\n  queries: TQueries | null;\n\n  /**\n   * An array of indices pointing to directives with content queries alongside with the\n   * corresponding query index. Each entry in this array is a tuple of:\n   * - index of the first content query index declared by a given directive;\n   * - index of a directive.\n   *\n   * We are storing those indexes so we can refresh content queries as part of a view refresh\n   * process.\n   */\n  contentQuerie   s: number[] | null;\n\n  /**\n   * Set of schemas that declare elements to be allowed inside the view.\n   */\n  schemas: SchemaMetadata[] | null;\n\n  /**\n   * Array of constants for the view. Includes attribute arrays, local definition arrays etc.\n   * Used for directive matching, attribute bindings, local definitions and more.\n   */\n  consts: TConstants | null;\n\n  /**\n   * Indicates that there was an error before we managed to complete the first create pass of the\n   * view. This means that the view is likely corrupted and we should try to recover it.\n   */\n  incompleteFirstPass: boolean;\n\n  /**\n   * Unique id of this TView for hydration purposes:\n   * - TViewType.Embedded: a unique id generated during serialization on the server\n   * - TViewType.Component: an id generated based on component properties\n   *                        (see `getComponentId` function for details)\n   */\n  ssrId: string | null;\n}\n\n/** Single hook callback function. */\nexport type HookFn = () => void;\n\n/**\n * Information necessary to call a hook. E.g. the callback that\n * needs to invoked and the index at which to find its context.\n */\nexport type HookEntry = number | HookFn;\n\n/**\n * Array of hooks that should be executed for a view and their directive indices.\n *\n * For each node of the view, the following data is stored:\n * 1) Node index (optional)\n * 2) A series of number/function pairs where:\n *  - even indices are directive indices\n *  - odd indices are hook functions\n *\n * Special cases:\n *  - a negative directive index flags an init hook (ngOnInit, ngAfterContentInit, ngAfterViewInit)\n */\nexport type HookData = HookEntry[];\n\n/**\n * Array of destroy hooks that should be executed for a view and their directive indices.\n *\n * The array is set up as a series of number/function or number/(number|function)[]:\n * - Even indices represent the context with which hooks should be called.\n * - Odd indices are the hook functions themselves. If a value at an odd index is an array,\n *   it represents the destroy hooks of a `multi` provider where:\n *     - Even indices represent the index of the provider for which we've registered a destroy hook,\n *       inside of the `multi` provider array.\n *     - Odd indices are the destroy hook functions.\n * For example:\n * LView: `[0, 1, 2, AService, 4, [BService, CService, DService]]`\n * destroyHooks: `[3, AService.ngOnDestroy, 5, [0, BService.ngOnDestroy, 2, DService.ngOnDestroy]]`\n *\n * In the example above `AService` is a type provider with an `ngOnDestroy`, whereas `BService`,\n * `CService` and `DService` are part of a `multi` provider where only `BService` and `DService`\n * have an `ngOnDestroy` hook.\n */\nexport type DestroyHookData = (HookEntry | HookData)[];\n\n/**\n * Static data that corresponds to the instance-specific data array on an LView.\n *\n * Each node's static data is stored in tData at the same index that it's stored\n * in the data array.  Any nodes that do not have static data store a null value in\n * tData to avoid a sparse array.\n *\n * Each pipe's definition is stored here at the same index as its pipe instance in\n * the data array.\n *\n * Each host property's name is stored here at the same index as its value in the\n * data array.\n *\n * Each property binding name is stored here at the same index as its value in\n * the data array. If the binding is an interpolation, the static string values\n * are stored parallel to the dynamic values. Example:\n *\n * id=\"prefix {{ v0 }} a {{ v1 }} b {{ v2 }} suffix\"\n *\n * LView       |   TView.data\n *------------------------\n *  v0 value   |   'a'\n *  v1 value   |   'b'\n *  v2 value   |   id � prefix � suffix\n *\n * Injector bloom filters are also stored here.\n */\nexport type TData = (\n  | TNode\n  | PipeDef<any>\n  | DirectiveDef<any>\n  | ComponentDef<any>\n  | number\n  | TStylingRange\n  | TStylingKey\n  | ProviderToken<any>\n  | TI18n\n  | I18nUpdateOpCodes\n  | TIcu\n  | null\n  | string\n  | TDeferBlockDetails\n)[];\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DehydratedContainerView} from '../../hydration/interfaces';\n\nimport {TNode} from './node';\nimport {RComment, RElement} from './renderer_dom';\nimport {FLAGS, HOST, LView, NEXT, PARENT, T_HOST} from './view';\n\n/**\n * Special location which allows easy identification of type. If we have an array which was\n * retrieved from the `LView` and that array has `true` at `TYPE` location, we know it is\n * `LContainer`.\n */\nexport const TYPE = 1;\n\n/**\n * Below are constants for LContainer indices to help us look up LContainer members\n * without having to remember the specific indices.\n * Uglify will inline these when minifying so there shouldn't be a cost.\n */\n\n// FLAGS, PARENT, NEXT, and T_HOST are indices 2, 3, 4, and 5\n// As we already have these constants in LView, we don't need to re-create them.\n\nexport const DEHYDRATED_VIEWS = 6;\nexport const NATIVE = 7;\nexport const VIEW_REFS = 8;\nexport const MOVED_VIEWS = 9;\n\n/**\n * Size of LContainer's header. Represents the index after which all views in the\n * container will be inserted. We need to keep a record of current views so we know\n * which views are already in the DOM (and don't need to be re-added) and so we can\n * remove views from the DOM when they are no longer required.\n */\nexport const CONTAINER_HEADER_OFFSET = 10;\n\n/**\n * The state associated with a container.\n *\n * This is an array so that its structure is closer to LView. This helps\n * when traversing the view tree (which is a mix of containers and component\n * views), so we can jump to viewOrContainer[NEXT] in the same way regardless\n * of type.\n */\nexport interface LContainer extends Array<any> {\n  /**\n   * The host element of this LContainer.\n   *\n   * The host could be an LView if this container is on a component node.\n   * In that case, the component LView is its HOST.\n   */\n  readonly [HOST]: RElement | RComment | LView;\n\n  /**\n   * This is a type field which allows us to differentiate `LContainer` from `StylingContext` in an\n   * efficient way. The value is always set to `true`\n   */\n  [TYPE]: true;\n\n  /** Flags for this container. See LContainerFlags for more info. */\n  [FLAGS]: LContainerFlags;\n\n  /**\n   * Access to the parent view is necessary so we can propagate back\n   * up from inside a container to parent[NEXT].\n   */\n  [PARENT]: LView;\n\n  /**\n   * This allows us to jump from a container to a sibling container or component\n   * view with the same parent, so we can remove listeners efficiently.\n   */\n  [NEXT]: LView | LContainer | null;\n\n  /**\n   * A collection of views created based on the underlying `<ng-template>` element but inserted into\n   * a different `LContainer`. We need to track views created from a given declaration point since\n   * queries collect matches from the embedded view declaration point and _not_ the insertion point.\n   */\n  [MOVED_VIEWS]: LView[] | null;\n\n  /**\n   * Pointer to the `TNode` which represents the host of the container.\n   */\n  [T_HOST]: TNode;\n\n  /** The comment element that serves as an anchor for this LContainer. */\n  [NATIVE]: RComment;\n\n  /**\n   * Array of `ViewRef`s used by any `ViewContainerRef`s that point to this container.\n   *\n   * This is lazily initialized by `ViewContainerRef` when the first view is inserted.\n   *\n   * NOTE: This is stored as `any[]` because render3 should really not be aware of `ViewRef` and\n   * doing so creates circular dependency.\n   */\n  [VIEW_REFS]: unknown[] | null;\n\n  /**\n   * Array of dehydrated views within this container.\n   *\n   * This information is used during the hydration process on the client.\n   * The hydration logic tries to find a matching dehydrated view, \"claim\" it\n   * and use this information to do further matching. After that, this \"claimed\"\n   * view is removed from the list. The remaining \"unclaimed\" views are\n   * \"garbage-collected\" later on, i.e. removed from the DOM once the hydration\n   * logic finishes.\n   */\n  [DEHYDRATED_VIEWS]: DehydratedContainerView[] | null;\n}\n\n/** Flags associated with an LContainer (saved in LContainer[FLAGS]) */\nexport const enum LContainerFlags {\n  None = 0,\n  /**\n   * Flag to signify that this `LContainer` may have transplanted views which need to be change\n   * detected. (see: `LView[DECLARATION_COMPONENT_VIEW])`.\n   *\n   * This flag, once set, is never unset for the `LContainer`.\n   */\n  HasTransplantedViews = 1 << 1,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {LContainer, TYPE} from './container';\nimport {ComponentDef, DirectiveDef} from './definition';\nimport {TNode, TNodeFlags, TNodeType} from './node';\nimport {RNode} from './renderer_dom';\nimport {FLAGS, LView, LViewFlags} from './view';\n\n/**\n * True if `value` is `LView`.\n * @param value wrapped value of `RNode`, `LView`, `LContainer`\n */\nexport function isLView(value: RNode | LView | LContainer | {} | null): value is LView {\n  return Array.isArray(value) && typeof value[TYPE] === 'object';\n}\n\n/**\n * True if `value` is `LContainer`.\n * @param value wrapped value of `RNode`, `LView`, `LContainer`\n */\nexport function isLContainer(value: RNode | LView | LContainer | {} | null): value is LContainer {\n  return Array.isArray(value) && value[TYPE] === true;\n}\n\nexport function isContentQueryHost(tNode: TNode): boolean {\n  return (tNode.flags & TNodeFlags.hasContentQuery) !== 0;\n}\n\nexport function isComponentHost(tNode: TNode): boolean {\n  return tNode.componentOffset > -1;\n}\n\nexport function isDirectiveHost(tNode: TNode): boolean {\n  return (tNode.flags & TNodeFlags.isDirectiveHost) === TNodeFlags.isDirectiveHost;\n}\n\nexport function isComponentDef<T>(def: DirectiveDef<T>): def is ComponentDef<T> {\n  return !!(def as ComponentDef<T>).template;\n}\n\nexport function isRootView(target: LView): boolean {\n  // Determines whether a given LView is marked as a root view.\n  return (target[FLAGS] & LViewFlags.IsRoot) !== 0;\n}\n\nexport function isProjectionTNode(tNode: TNode): boolean {\n  return (tNode.type & TNodeType.Projection) === TNodeType.Projection;\n}\n\nexport function hasI18n(lView: LView): boolean {\n  return (lView[FLAGS] & LViewFlags.HasI18n) === LViewFlags.HasI18n;\n}\n\nexport function isDestroyed(lView: LView): boolean {\n  // Determines whether a given LView is marked as destroyed.\n  return (lView[FLAGS] & LViewFlags.Destroyed) === LViewFlags.Destroyed;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {assertDefined, assertEqual, assertNumber, throwError} from '../util/assert';\n\nimport {getComponentDef, getNgModuleDef} from './def_getters';\nimport {LContainer} from './interfaces/container';\nimport {DirectiveDef} from './interfaces/definition';\nimport {TIcu} from './interfaces/i18n';\nimport {NodeInjectorOffset} from './interfaces/injector';\nimport {TNode} from './interfaces/node';\nimport {isLContainer, isLView} from './interfaces/type_checks';\nimport {\n  DECLARATION_COMPONENT_VIEW,\n  FLAGS,\n  HEADER_OFFSET,\n  LView,\n  LViewFlags,\n  T_HOST,\n  TVIEW,\n  TView,\n} from './interfaces/view';\n\n// [Assert functions do not constraint type when they are guarded by a truthy\n// expression.](https://github.com/microsoft/TypeScript/issues/37295)\n\nexport function assertTNodeForLView(tNode: TNode, lView: LView) {\n  assertTNodeForTView(tNode, lView[TVIEW]);\n}\n\nexport function assertTNodeForTView(tNode: TNode, tView: TView) {\n  assertTNode(tNode);\n  const tData = tView.data;\n  for (let i = HEADER_OFFSET; i < tData.length; i++) {\n    if (tData[i] === tNode) {\n      return;\n    }\n  }\n  throwError('This TNode does not belong to this TView.');\n}\n\nexport function assertTNode(tNode: TNode) {\n  assertDefined(tNode, 'TNode must be defined');\n  if (!(tNode && typeof tNode === 'object' && tNode.hasOwnProperty('directiveStylingLast'))) {\n    throwError('Not of type TNode, got: ' + tNode);\n  }\n}\n\nexport function assertTIcu(tIcu: TIcu) {\n  assertDefined(tIcu, 'Expected TIcu to be defined');\n  if (!(typeof tIcu.currentCaseLViewIndex === 'number')) {\n    throwError('Object is not of TIcu type.');\n  }\n}\n\nexport function assertComponentType(\n  actual: any,\n  msg: string = \"Type passed in is not ComponentType, it does not have 'ɵcmp' property.\",\n) {\n  if (!getComponentDef(actual)) {\n    throwError(msg);\n  }\n}\n\nexport function assertNgModuleType(\n  actual: any,\n  msg: string = \"Type passed in is not NgModuleType, it does not have 'ɵmod' property.\",\n) {\n  if (!getNgModuleDef(actual)) {\n    throwError(msg);\n  }\n}\n\nexport function assertCurrentTNodeIsParent(isParent: boolean) {\n  assertEqual(isParent, true, 'currentTNode should be a parent');\n}\n\nexport function assertHasParent(tNode: TNode | null) {\n  assertDefined(tNode, 'currentTNode should exist!');\n  assertDefined(tNode!.parent, 'currentTNode should have a parent');\n}\n\nexport function assertLContainer(value: any): asserts value is LContainer {\n  assertDefined(value, 'LContainer must be defined');\n  assertEqual(isLContainer(value), true, 'Expecting LContainer');\n}\n\nexport function assertLViewOrUndefined(value: any): asserts value is LView | null | undefined {\n  value && assertEqual(isLView(value), true, 'Expecting LView or undefined or null');\n}\n\nexport function assertLView(value: any): asserts value is LView {\n  assertDefined(value, 'LView must be defined');\n  assertEqual(isLView(value), true, 'Expecting LView');\n}\n\nexport function assertFirstCreatePass(tView: TView, errMessage?: string) {\n  assertEqual(\n    tView.firstCreatePass,\n    true,\n    errMessage || 'Should only be called in first create pass.',\n  );\n}\n\nexport function assertFirstUpdatePass(tView: TView, errMessage?: string) {\n  assertEqual(\n    tView.firstUpdatePass,\n    true,\n    errMessage || 'Should only be called in first update pass.',\n  );\n}\n\n/**\n * This is a basic sanity check that an object is probably a directive def. DirectiveDef is\n * an interface, so we can't do a direct instanceof check.\n */\nexport function assertDirectiveDef<T>(obj: any): asserts obj is DirectiveDef<T> {\n  if (obj.type === undefined || obj.selectors == undefined || obj.inputs === undefined) {\n    throwError(\n      `Expected a DirectiveDef/ComponentDef and this object does not seem to have the expected shape.`,\n    );\n  }\n}\n\nexport function assertIndexInDeclRange(tView: TView, index: number) {\n  assertBetween(HEADER_OFFSET, tView.bindingStartIndex, index);\n}\n\nexport function assertIndexInExpandoRange(lView: LView, index: number) {\n  const tView = lView[1];\n  assertBetween(tView.expandoStartIndex, lView.length, index);\n}\n\nexport function assertBetween(lower: number, upper: number, index: number) {\n  if (!(lower <= index && index < upper)) {\n    throwError(`Index out of range (expecting ${lower} <= ${index} < ${upper})`);\n  }\n}\n\nexport function assertProjectionSlots(lView: LView, errMessage?: string) {\n  assertDefined(lView[DECLARATION_COMPONENT_VIEW], 'Component views should exist.');\n  assertDefined(\n    lView[DECLARATION_COMPONENT_VIEW][T_HOST]!.projection,\n    errMessage ||\n      'Components with projection nodes (<ng-content>) must have projection slots defined.',\n  );\n}\n\nexport function assertParentView(lView: LView | null, errMessage?: string) {\n  assertDefined(\n    lView,\n    errMessage || \"Component views should always have a parent view (component's host view)\",\n  );\n}\n\nexport function assertNoDuplicateDirectives(directives: DirectiveDef<unknown>[]): void {\n  // The array needs at least two elements in order to have duplicates.\n  if (directives.length < 2) {\n    return;\n  }\n\n  const seenDirectives = new Set<DirectiveDef<unknown>>();\n\n  for (const current of directives) {\n    if (seenDirectives.has(current)) {\n      throw new RuntimeError(\n        RuntimeErrorCode.DUPLICATE_DIRECTIVE,\n        `Directive ${current.type.name} matches multiple times on the same element. ` +\n          `Directives can only match an element once.`,\n      );\n    }\n    seenDirectives.add(current);\n  }\n}\n\n/**\n * This is a basic sanity check that the `injectorIndex` seems to point to what looks like a\n * NodeInjector data structure.\n *\n * @param lView `LView` which should be checked.\n * @param injectorIndex index into the `LView` where the `NodeInjector` is expected.\n */\nexport function assertNodeInjector(lView: LView, injectorIndex: number) {\n  assertIndexInExpandoRange(lView, injectorIndex);\n  assertIndexInExpandoRange(lView, injectorIndex + NodeInjectorOffset.PARENT);\n  assertNumber(lView[injectorIndex + 0], 'injectorIndex should point to a bloom filter');\n  assertNumber(lView[injectorIndex + 1], 'injectorIndex should point to a bloom filter');\n  assertNumber(lView[injectorIndex + 2], 'injectorIndex should point to a bloom filter');\n  assertNumber(lView[injectorIndex + 3], 'injectorIndex should point to a bloom filter');\n  assertNumber(lView[injectorIndex + 4], 'injectorIndex should point to a bloom filter');\n  assertNumber(lView[injectorIndex + 5], 'injectorIndex should point to a bloom filter');\n  assertNumber(lView[injectorIndex + 6], 'injectorIndex should point to a bloom filter');\n  assertNumber(lView[injectorIndex + 7], 'injectorIndex should point to a bloom filter');\n  assertNumber(\n    lView[injectorIndex + NodeInjectorOffset.PARENT],\n    'injectorIndex should point to parent injector',\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Represents a basic change from a previous to a new value for a single\n * property on a directive instance. Passed as a value in a\n * {@link SimpleChanges} object to the `ngOnChanges` hook.\n *\n * @see {@link OnChanges}\n *\n * @publicApi\n */\nexport class SimpleChange {\n  constructor(\n    public previousValue: any,\n    public currentValue: any,\n    public firstChange: boolean,\n  ) {}\n  /**\n   * Check whether the new value is the first value assigned.\n   */\n  isFirstChange(): boolean {\n    return this.firstChange;\n  }\n}\n\n/**\n * A hashtable of changes represented by {@link SimpleChange} objects stored\n * at the declared property name they belong to on a Directive or Component. This is\n * the type passed to the `ngOnChanges` hook.\n *\n * @see {@link OnChanges}\n *\n * @publicApi\n */\nexport interface SimpleChanges {\n  [propName: string]: SimpleChange;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InputSignalNode} from '../authoring/input/input_signal_node';\n\nexport function applyValueToInputField<T>(\n  instance: T,\n  inputSignalNode: null | InputSignalNode<unknown, unknown>,\n  privateName: string,\n  value: unknown,\n) {\n  if (inputSignalNode !== null) {\n    inputSignalNode.applyValueToInputSignal(inputSignalNode, value);\n  } else {\n    (instance as any)[privateName] = value;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InputSignalNode} from '../../authoring/input/input_signal_node';\nimport {OnChanges} from '../../interface/lifecycle_hooks';\nimport {SimpleChange, SimpleChanges} from '../../interface/simple_change';\nimport {assertString} from '../../util/assert';\nimport {EMPTY_OBJ} from '../../util/empty';\nimport {applyValueToInputField} from '../apply_value_input_field';\nimport {DirectiveDef, DirectiveDefFeature} from '../interfaces/definition';\n\n/**\n * The NgOnChangesFeature decorates a component with support for the ngOnChanges\n * lifecycle hook, so it should be included in any component that implements\n * that hook.\n *\n * If the component or directive uses inheritance, the NgOnChangesFeature MUST\n * be included as a feature AFTER {@link InheritDefinitionFeature}, otherwise\n * inherited properties will not be propagated to the ngOnChanges lifecycle\n * hook.\n *\n * Example usage:\n *\n * ```ts\n * static ɵcmp = defineComponent({\n *   ...\n *   inputs: {name: 'publicName'},\n *   features: [NgOnChangesFeature]\n * });\n * ```\n *\n * @codeGenApi\n */\nexport const ɵɵNgOnChangesFeature: () => DirectiveDefFeature = /* @__PURE__ */ (() => {\n  const ɵɵNgOnChangesFeatureImpl = () => NgOnChangesFeatureImpl;\n\n  // This option ensures that the ngOnChanges lifecycle hook will be inherited\n  // from superclasses (in InheritDefinitionFeature).\n  /** @nocollapse */\n  ɵɵNgOnChangesFeatureImpl.ngInherit = true;\n\n  return ɵɵNgOnChangesFeatureImpl;\n})();\n\nexport function NgOnChangesFeatureImpl<T>(definition: DirectiveDef<T>) {\n  if (definition.type.prototype.ngOnChanges) {\n    definition.setInput = ngOnChangesSetInput;\n  }\n  return rememberChangeHistoryAndInvokeOnChangesHook;\n}\n\n/**\n * This is a synthetic lifecycle hook which gets inserted into `TView.preOrderHooks` to simulate\n * `ngOnChanges`.\n *\n * The hook reads the `NgSimpleChangesStore` data from the component instance and if changes are\n * found it invokes `ngOnChanges` on the component instance.\n *\n * @param this Component instance. Because this function gets inserted into `TView.preOrderHooks`,\n *     it is guaranteed to be called with component instance.\n */\nfunction rememberChangeHistoryAndInvokeOnChangesHook(this: OnChanges) {\n  const simpleChangesStore = getSimpleChangesStore(this);\n  const current = simpleChangesStore?.current;\n\n  if (current) {\n    const previous = simpleChangesStore!.previous;\n    if (previous === EMPTY_OBJ) {\n      simpleChangesStore!.previous = current;\n    } else {\n      // New changes are copied to the previous store, so that we don't lose history for inputs\n      // which were not changed this time\n      for (let key in current) {\n        previous[key] = current[key];\n      }\n    }\n    simpleChangesStore!.current = null;\n    this.ngOnChanges(current);\n  }\n}\n\nfunction ngOnChangesSetInput<T>(\n  this: DirectiveDef<T>,\n  instance: T,\n  inputSignalNode: null | InputSignalNode<unknown, unknown>,\n  value: unknown,\n  publicName: string,\n  privateName: string,\n): void {\n  const declaredName = (this.declaredInputs as {[key: string]: string})[publicName];\n  ngDevMode && assertString(declaredName, 'Name of input in ngOnChanges has to be a string');\n  const simpleChangesStore =\n    getSimpleChangesStore(instance) ||\n    setSimpleChangesStore(instance, {previous: EMPTY_OBJ, current: null});\n  const current = simpleChangesStore.current || (simpleChangesStore.current = {});\n  const previous = simpleChangesStore.previous;\n  const previousChange = previous[declaredName];\n  current[declaredName] = new SimpleChange(\n    previousChange && previousChange.currentValue,\n    value,\n    previous === EMPTY_OBJ,\n  );\n\n  applyValueToInputField(instance, inputSignalNode, privateName, value);\n}\n\nconst SIMPLE_CHANGES_STORE = '__ngSimpleChanges__';\n\nfunction getSimpleChangesStore(instance: any): null | NgSimpleChangesStore {\n  return instance[SIMPLE_CHANGES_STORE] || null;\n}\n\nfunction setSimpleChangesStore(instance: any, store: NgSimpleChangesStore): NgSimpleChangesStore {\n  return (instance[SIMPLE_CHANGES_STORE] = store);\n}\n\n/**\n * Data structure which is monkey-patched on the component instance and used by `ngOnChanges`\n * life-cycle hook to track previous input values.\n */\ninterface NgSimpleChangesStore {\n  previous: SimpleChanges;\n  current: SimpleChanges | null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {type Profiler} from './profiler_types';\n\nlet profilerCallback: Profiler | null = null;\n\n/**\n * Sets the callback function which will be invoked before and after performing certain actions at\n * runtime (for example, before and after running change detection).\n *\n * Warning: this function is *INTERNAL* and should not be relied upon in application's code.\n * The contract of the function might be changed in any release and/or the function can be removed\n * completely.\n *\n * @param profiler function provided by the caller or null value to disable profiling.\n */\nexport const setProfiler = (profiler: Profiler | null) => {\n  profilerCallback = profiler;\n};\n\n/**\n * Profiler function which wraps user code executed by the runtime.\n *\n * @param event ProfilerEvent corresponding to the execution context\n * @param instance component instance\n * @param hookOrListener lifecycle hook function or output listener. The value depends on the\n *  execution context\n * @returns\n */\nexport const profiler: Profiler = function (event, instance = null, hookOrListener) {\n  if (profilerCallback != null /* both `null` and `undefined` */) {\n    profilerCallback(event, instance, hookOrListener);\n  }\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport const SVG_NAMESPACE = 'svg';\nexport const MATH_ML_NAMESPACE = 'math';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NotificationSource} from '../../change_detection/scheduling/zoneless_scheduling';\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {\n  assertDefined,\n  assertGreaterThan,\n  assertGreaterThanOrEqual,\n  assertIndexInRange,\n  assertLessThan,\n} from '../../util/assert';\nimport {assertLView, assertTNode, assertTNodeForLView} from '../assert';\nimport {LContainer, TYPE} from '../interfaces/container';\nimport {TConstants, TNode} from '../interfaces/node';\nimport {RNode} from '../interfaces/renderer_dom';\nimport {isDestroyed, isLContainer, isLView} from '../interfaces/type_checks';\nimport {\n  CLEANUP,\n  DECLARATION_VIEW,\n  ENVIRONMENT,\n  FLAGS,\n  HEADER_OFFSET,\n  HOST,\n  LView,\n  LViewFlags,\n  ON_DESTROY_HOOKS,\n  PARENT,\n  PREORDER_HOOK_FLAGS,\n  PreOrderHookFlags,\n  REACTIVE_TEMPLATE_CONSUMER,\n  TData,\n  TView,\n} from '../interfaces/view';\n\n/**\n * For efficiency reasons we often put several different data types (`RNode`, `LView`, `LContainer`)\n * in same location in `LView`. This is because we don't want to pre-allocate space for it\n * because the storage is sparse. This file contains utilities for dealing with such data types.\n *\n * How do we know what is stored at a given location in `LView`.\n * - `Array.isArray(value) === false` => `RNode` (The normal storage value)\n * - `Array.isArray(value) === true` => then the `value[0]` represents the wrapped value.\n *   - `typeof value[TYPE] === 'object'` => `LView`\n *      - This happens when we have a component at a given location\n *   - `typeof value[TYPE] === true` => `LContainer`\n *      - This happens when we have `LContainer` binding at a given location.\n *\n *\n * NOTE: it is assumed that `Array.isArray` and `typeof` operations are very efficient.\n */\n\n/**\n * Returns `RNode`.\n * @param value wrapped value of `RNode`, `LView`, `LContainer`\n */\nexport function unwrapRNode(value: RNode | LView | LContainer): RNode {\n  while (Array.isArray(value)) {\n    value = value[HOST] as any;\n  }\n  return value as RNode;\n}\n\n/**\n * Returns `LView` or `null` if not found.\n * @param value wrapped value of `RNode`, `LView`, `LContainer`\n */\nexport function unwrapLView(value: RNode | LView | LContainer): LView | null {\n  while (Array.isArray(value)) {\n    // This check is same as `isLView()` but we don't call at as we don't want to call\n    // `Array.isArray()` twice and give JITer more work for inlining.\n    if (typeof value[TYPE] === 'object') return value as LView;\n    value = value[HOST] as any;\n  }\n  return null;\n}\n\n/**\n * Retrieves an element value from the provided `viewData`, by unwrapping\n * from any containers, component views, or style contexts.\n */\nexport function getNativeByIndex(index: number, lView: LView): RNode {\n  ngDevMode && assertIndexInRange(lView, index);\n  ngDevMode && assertGreaterThanOrEqual(index, HEADER_OFFSET, 'Expected to be past HEADER_OFFSET');\n  return unwrapRNode(lView[index]);\n}\n\n/**\n * Retrieve an `RNode` for a given `TNode` and `LView`.\n *\n * This function guarantees in dev mode to retrieve a non-null `RNode`.\n *\n * @param tNode\n * @param lView\n */\nexport function getNativeByTNode(tNode: TNode, lView: LView): RNode {\n  ngDevMode && assertTNodeForLView(tNode, lView);\n  ngDevMode && assertIndexInRange(lView, tNode.index);\n  const node: RNode = unwrapRNode(lView[tNode.index]);\n  return node;\n}\n\n/**\n * Retrieve an `RNode` or `null` for a given `TNode` and `LView`.\n *\n * Some `TNode`s don't have associated `RNode`s. For example `Projection`\n *\n * @param tNode\n * @param lView\n */\nexport function getNativeByTNodeOrNull(tNode: TNode | null, lView: LView): RNode | null {\n  const index = tNode === null ? -1 : tNode.index;\n  if (index !== -1) {\n    ngDevMode && assertTNodeForLView(tNode!, lView);\n    const node: RNode | null = unwrapRNode(lView[index]);\n    return node;\n  }\n  return null;\n}\n\n// fixme(misko): The return Type should be `TNode|null`\nexport function getTNode(tView: TView, index: number): TNode {\n  ngDevMode && assertGreaterThan(index, -1, 'wrong index for TNode');\n  ngDevMode && assertLessThan(index, tView.data.length, 'wrong index for TNode');\n  const tNode = tView.data[index] as TNode;\n  ngDevMode && tNode !== null && assertTNode(tNode);\n  return tNode;\n}\n\n/** Retrieves a value from any `LView` or `TData`. */\nexport function load<T>(view: LView | TData, index: number): T {\n  ngDevMode && assertIndexInRange(view, index);\n  return view[index];\n}\n\n/** Store a value in the `data` at a given `index`. */\nexport function store<T>(tView: TView, lView: LView, index: number, value: T): void {\n  // We don't store any static data for local variables, so the first time\n  // we see the template, we should store as null to avoid a sparse array\n  if (index >= tView.data.length) {\n    tView.data[index] = null;\n    tView.blueprint[index] = null;\n  }\n  lView[index] = value;\n}\n\nexport function getComponentLViewByIndex(nodeIndex: number, hostView: LView): LView {\n  // Could be an LView or an LContainer. If LContainer, unwrap to find LView.\n  ngDevMode && assertIndexInRange(hostView, nodeIndex);\n  const slotValue = hostView[nodeIndex];\n  const lView = isLView(slotValue) ? slotValue : slotValue[HOST];\n  return lView;\n}\n\n/** Checks whether a given view is in creation mode */\nexport function isCreationMode(view: LView): boolean {\n  return (view[FLAGS] & LViewFlags.CreationMode) === LViewFlags.CreationMode;\n}\n\n/**\n * Returns a boolean for whether the view is attached to the change detection tree.\n *\n * Note: This determines whether a view should be checked, not whether it's inserted\n * into a container. For that, you'll want `viewAttachedToContainer` below.\n */\nexport function viewAttachedToChangeDetector(view: LView): boolean {\n  return (view[FLAGS] & LViewFlags.Attached) === LViewFlags.Attached;\n}\n\n/** Returns a boolean for whether the view is attached to a container. */\nexport function viewAttachedToContainer(view: LView): boolean {\n  return isLContainer(view[PARENT]);\n}\n\n/** Returns a constant from `TConstants` instance. */\nexport function getConstant<T>(consts: TConstants | null, index: null | undefined): null;\nexport function getConstant<T>(consts: TConstants, index: number): T | null;\nexport function getConstant<T>(\n  consts: TConstants | null,\n  index: number | null | undefined,\n): T | null;\nexport function getConstant<T>(\n  consts: TConstants | null,\n  index: number | null | undefined,\n): T | null {\n  if (index === null || index === undefined) return null;\n  ngDevMode && assertIndexInRange(consts!, index);\n  return consts![index] as unknown as T;\n}\n\n/**\n * Resets the pre-order hook flags of the view.\n * @param lView the LView on which the flags are reset\n */\nexport function resetPreOrderHookFlags(lView: LView) {\n  lView[PREORDER_HOOK_FLAGS] = 0 as PreOrderHookFlags;\n}\n\n/**\n * Adds the `RefreshView` flag from the lView and updates HAS_CHILD_VIEWS_TO_REFRESH flag of\n * parents.\n */\nexport function markViewForRefresh(lView: LView) {\n  if (lView[FLAGS] & LViewFlags.RefreshView) {\n    return;\n  }\n  lView[FLAGS] |= LViewFlags.RefreshView;\n  if (viewAttachedToChangeDetector(lView)) {\n    markAncestorsForTraversal(lView);\n  }\n}\n\n/**\n * Walks up the LView hierarchy.\n * @param nestingLevel Number of times to walk up in hierarchy.\n * @param currentView View from which to start the lookup.\n */\nexport function walkUpViews(nestingLevel: number, currentView: LView): LView {\n  while (nestingLevel > 0) {\n    ngDevMode &&\n      assertDefined(\n        currentView[DECLARATION_VIEW],\n        'Declaration view should be defined if nesting level is greater than 0.',\n      );\n    currentView = currentView[DECLARATION_VIEW]!;\n    nestingLevel--;\n  }\n  return currentView;\n}\n\nexport function requiresRefreshOrTraversal(lView: LView) {\n  return !!(\n    lView[FLAGS] & (LViewFlags.RefreshView | LViewFlags.HasChildViewsToRefresh) ||\n    lView[REACTIVE_TEMPLATE_CONSUMER]?.dirty\n  );\n}\n\n/**\n * Updates the `HasChildViewsToRefresh` flag on the parents of the `LView` as well as the\n * parents above.\n */\nexport function updateAncestorTraversalFlagsOnAttach(lView: LView) {\n  lView[ENVIRONMENT].changeDetectionScheduler?.notify(NotificationSource.ViewAttached);\n  if (lView[FLAGS] & LViewFlags.Dirty) {\n    lView[FLAGS] |= LViewFlags.RefreshView;\n  }\n  if (requiresRefreshOrTraversal(lView)) {\n    markAncestorsForTraversal(lView);\n  }\n}\n\n/**\n * Ensures views above the given `lView` are traversed during change detection even when they are\n * not dirty.\n *\n * This is done by setting the `HAS_CHILD_VIEWS_TO_REFRESH` flag up to the root, stopping when the\n * flag is already `true` or the `lView` is detached.\n */\nexport function markAncestorsForTraversal(lView: LView) {\n  lView[ENVIRONMENT].changeDetectionScheduler?.notify(NotificationSource.MarkAncestorsForTraversal);\n  let parent = getLViewParent(lView);\n  while (parent !== null) {\n    // We stop adding markers to the ancestors once we reach one that already has the marker. This\n    // is to avoid needlessly traversing all the way to the root when the marker already exists.\n    if (parent[FLAGS] & LViewFlags.HasChildViewsToRefresh) {\n      break;\n    }\n\n    parent[FLAGS] |= LViewFlags.HasChildViewsToRefresh;\n    if (!viewAttachedToChangeDetector(parent)) {\n      break;\n    }\n    parent = getLViewParent(parent);\n  }\n}\n\n/**\n * Stores a LView-specific destroy callback.\n */\nexport function storeLViewOnDestroy(lView: LView, onDestroyCallback: () => void) {\n  if (isDestroyed(lView)) {\n    throw new RuntimeError(\n      RuntimeErrorCode.VIEW_ALREADY_DESTROYED,\n      ngDevMode && 'View has already been destroyed.',\n    );\n  }\n  if (lView[ON_DESTROY_HOOKS] === null) {\n    lView[ON_DESTROY_HOOKS] = [];\n  }\n  lView[ON_DESTROY_HOOKS].push(onDestroyCallback);\n}\n\n/**\n * Removes previously registered LView-specific destroy callback.\n */\nexport function removeLViewOnDestroy(lView: LView, onDestroyCallback: () => void) {\n  if (lView[ON_DESTROY_HOOKS] === null) return;\n\n  const destroyCBIdx = lView[ON_DESTROY_HOOKS].indexOf(onDestroyCallback);\n  if (destroyCBIdx !== -1) {\n    lView[ON_DESTROY_HOOKS].splice(destroyCBIdx, 1);\n  }\n}\n\n/**\n * Gets the parent LView of the passed LView, if the PARENT is an LContainer, will get the parent of\n * that LContainer, which is an LView\n * @param lView the lView whose parent to get\n */\nexport function getLViewParent(lView: LView): LView | null {\n  ngDevMode && assertLView(lView);\n  const parent = lView[PARENT];\n  return isLContainer(parent) ? parent[PARENT] : parent;\n}\n\nexport function getOrCreateLViewCleanup(view: LView): any[] {\n  // top level variables should not be exported for performance reasons (PERF_NOTES.md)\n  return (view[CLEANUP] ??= []);\n}\n\nexport function getOrCreateTViewCleanup(tView: TView): any[] {\n  return (tView.cleanup ??= []);\n}\n\n/**\n * Saves context for this cleanup function in LView.cleanupInstances.\n *\n * On the first template pass, saves in TView:\n * - Cleanup function\n * - Index of context we just saved in LView.cleanupInstances\n */\nexport function storeCleanupWithContext(\n  tView: TView,\n  lView: LView,\n  context: any,\n  cleanupFn: Function,\n): void {\n  const lCleanup = getOrCreateLViewCleanup(lView);\n\n  // Historically the `storeCleanupWithContext` was used to register both framework-level and\n  // user-defined cleanup callbacks, but over time those two types of cleanups were separated.\n  // This dev mode checks assures that user-level cleanup callbacks are _not_ stored in data\n  // structures reserved for framework-specific hooks.\n  ngDevMode &&\n    assertDefined(\n      context,\n      'Cleanup context is mandatory when registering framework-level destroy hooks',\n    );\n  lCleanup.push(context);\n\n  if (tView.firstCreatePass) {\n    getOrCreateTViewCleanup(tView).push(cleanupFn, lCleanup.length - 1);\n  } else {\n    // Make sure that no new framework-level cleanup functions are registered after the first\n    // template pass is done (and TView data structures are meant to fully constructed).\n    if (ngDevMode) {\n      Object.freeze(getOrCreateTViewCleanup(tView));\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectFlags} from '../di/interface/injector';\nimport {\n  assertDefined,\n  assertEqual,\n  assertGreaterThanOrEqual,\n  assertLessThan,\n  assertNotEqual,\n  throwError,\n} from '../util/assert';\n\nimport {assertLViewOrUndefined, assertTNodeForLView, assertTNodeForTView} from './assert';\nimport {DirectiveDef} from './interfaces/definition';\nimport {TNode, TNodeType} from './interfaces/node';\nimport {\n  CONTEXT,\n  DECLARATION_VIEW,\n  HEADER_OFFSET,\n  LView,\n  OpaqueViewState,\n  T_HOST,\n  TData,\n  TVIEW,\n  TView,\n  TViewType,\n} from './interfaces/view';\nimport {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces';\nimport {getTNode, walkUpViews} from './util/view_utils';\n\n/**\n *\n */\ninterface LFrame {\n  /**\n   * Parent LFrame.\n   *\n   * This is needed when `leaveView` is called to restore the previous state.\n   */\n  parent: LFrame;\n\n  /**\n   * Child LFrame.\n   *\n   * This is used to cache existing LFrames to relieve the memory pressure.\n   */\n  child: LFrame | null;\n\n  /**\n   * State of the current view being processed.\n   *\n   * An array of nodes (text, element, container, etc), pipes, their bindings, and\n   * any local variables that need to be stored between invocations.\n   */\n  lView: LView;\n\n  /**\n   * Current `TView` associated with the `LFrame.lView`.\n   *\n   * One can get `TView` from `lFrame[TVIEW]` however because it is so common it makes sense to\n   * store it in `LFrame` for perf reasons.\n   */\n  tView: TView;\n\n  /**\n   * Used to set the parent property when nodes are created and track query results.\n   *\n   * This is used in conjunction with `isParent`.\n   */\n  currentTNode: TNode | null;\n\n  /**\n   * If `isParent` is:\n   *  - `true`: then `currentTNode` points to a parent node.\n   *  - `false`: then `currentTNode` points to previous node (sibling).\n   */\n  isParent: boolean;\n\n  /**\n   * Index of currently selected element in LView.\n   *\n   * Used by binding instructions. Updated as part of advance instruction.\n   */\n  selectedIndex: number;\n\n  /**\n   * Current pointer to the binding index.\n   */\n  bindingIndex: number;\n\n  /**\n   * The last viewData retrieved by nextContext().\n   * Allows building nextContext() and reference() calls.\n   *\n   * e.g. const inner = x().$implicit; const outer = x().$implicit;\n   */\n  contextLView: LView | null;\n\n  /**\n   * Store the element depth count. This is used to identify the root elements of the template\n   * so that we can then attach patch data `LView` to only those elements. We know that those\n   * are the only places where the patch data could change, this way we will save on number\n   * of places where tha patching occurs.\n   */\n  elementDepthCount: number;\n\n  /**\n   * Current namespace to be used when creating elements\n   */\n  currentNamespace: string | null;\n\n  /**\n   * The root index from which pure function instructions should calculate their binding\n   * indices. In component views, this is TView.bindingStartIndex. In a host binding\n   * context, this is the TView.expandoStartIndex + any dirs/hostVars before the given dir.\n   */\n  bindingRootIndex: number;\n\n  /**\n   * Current index of a View or Content Query which needs to be processed next.\n   * We iterate over the list of Queries and increment current query index at every step.\n   */\n  currentQueryIndex: number;\n\n  /**\n   * When host binding is executing this points to the directive index.\n   * `TView.data[currentDirectiveIndex]` is `DirectiveDef`\n   * `LView[currentDirectiveIndex]` is directive instance.\n   */\n  currentDirectiveIndex: number;\n\n  /**\n   * Are we currently in i18n block as denoted by `ɵɵelementStart` and `ɵɵelementEnd`.\n   *\n   * This information is needed because while we are in i18n block all elements must be pre-declared\n   * in the translation. (i.e. `Hello �#2�World�/#2�!` pre-declares element at `�#2�` location.)\n   * This allocates `TNodeType.Placeholder` element at location `2`. If translator removes `�#2�`\n   * from translation than the runtime must also ensure tha element at `2` does not get inserted\n   * into the DOM. The translation does not carry information about deleted elements. Therefor the\n   * only way to know that an element is deleted is that it was not pre-declared in the translation.\n   *\n   * This flag works by ensuring that elements which are created without pre-declaration\n   * (`TNodeType.Placeholder`) are not inserted into the DOM render tree. (It does mean that the\n   * element still gets instantiated along with all of its behavior [directives])\n   */\n  inI18n: boolean;\n}\n\n/**\n * All implicit instruction state is stored here.\n *\n * It is useful to have a single object where all of the state is stored as a mental model\n * (rather it being spread across many different variables.)\n *\n * PERF NOTE: Turns out that writing to a true global variable is slower than\n * having an intermediate object with properties.\n */\ninterface InstructionState {\n  /**\n   * Current `LFrame`\n   *\n   * `null` if we have not called `enterView`\n   */\n  lFrame: LFrame;\n\n  /**\n   * Stores whether directives should be matched to elements.\n   *\n   * When template contains `ngNonBindable` then we need to prevent the runtime from matching\n   * directives on children of that element.\n   *\n   * Example:\n   * ```html\n   * <my-comp my-directive>\n   *   Should match component / directive.\n   * </my-comp>\n   * <div ngNonBindable>\n   *   <my-comp my-directive>\n   *     Should not match component / directive because we are in ngNonBindable.\n   *   </my-comp>\n   * </div>\n   * ```\n   */\n  bindingsEnabled: boolean;\n\n  /**\n   * Stores the root TNode that has the 'ngSkipHydration' attribute on it for later reference.\n   *\n   * Example:\n   * ```html\n   * <my-comp ngSkipHydration>\n   *   Should reference this root node\n   * </my-comp>\n   * ```\n   */\n  skipHydrationRootTNode: TNode | null;\n}\n\nconst instructionState: InstructionState = {\n  lFrame: createLFrame(null),\n  bindingsEnabled: true,\n  skipHydrationRootTNode: null,\n};\n\nexport enum CheckNoChangesMode {\n  Off,\n  Exhaustive,\n  OnlyDirtyViews,\n}\n\n/**\n * In this mode, any changes in bindings will throw an ExpressionChangedAfterChecked error.\n *\n * Necessary to support ChangeDetectorRef.checkNoChanges().\n *\n * The `checkNoChanges` function is invoked only in ngDevMode=true and verifies that no unintended\n * changes exist in the change detector or its children.\n */\nlet _checkNoChangesMode: CheckNoChangesMode = 0; /* CheckNoChangesMode.Off */\n\n/**\n * Flag used to indicate that we are in the middle running change detection on a view\n *\n * @see detectChangesInViewWhileDirty\n */\nlet _isRefreshingViews = false;\n\n/**\n * Returns true if the instruction state stack is empty.\n *\n * Intended to be called from tests only (tree shaken otherwise).\n */\nexport function specOnlyIsInstructionStateEmpty(): boolean {\n  return instructionState.lFrame.parent === null;\n}\n\nexport function getElementDepthCount() {\n  return instructionState.lFrame.elementDepthCount;\n}\n\nexport function increaseElementDepthCount() {\n  instructionState.lFrame.elementDepthCount++;\n}\n\nexport function decreaseElementDepthCount() {\n  instructionState.lFrame.elementDepthCount--;\n}\n\nexport function getBindingsEnabled(): boolean {\n  return instructionState.bindingsEnabled;\n}\n\n/**\n * Returns true if currently inside a skip hydration block.\n * @returns boolean\n */\nexport function isInSkipHydrationBlock(): boolean {\n  return instructionState.skipHydrationRootTNode !== null;\n}\n\n/**\n * Returns true if this is the root TNode of the skip hydration block.\n * @param tNode the current TNode\n * @returns boolean\n */\nexport function isSkipHydrationRootTNode(tNode: TNode): boolean {\n  return instructionState.skipHydrationRootTNode === tNode;\n}\n\n/**\n * Enables directive matching on elements.\n *\n *  * Example:\n * ```html\n * <my-comp my-directive>\n *   Should match component / directive.\n * </my-comp>\n * <div ngNonBindable>\n *   <!-- ɵɵdisableBindings() -->\n *   <my-comp my-directive>\n *     Should not match component / directive because we are in ngNonBindable.\n *   </my-comp>\n *   <!-- ɵɵenableBindings() -->\n * </div>\n * ```\n *\n * @codeGenApi\n */\nexport function ɵɵenableBindings(): void {\n  instructionState.bindingsEnabled = true;\n}\n\n/**\n * Sets a flag to specify that the TNode is in a skip hydration block.\n * @param tNode the current TNode\n */\nexport function enterSkipHydrationBlock(tNode: TNode): void {\n  instructionState.skipHydrationRootTNode = tNode;\n}\n\n/**\n * Disables directive matching on element.\n *\n *  * Example:\n * ```html\n * <my-comp my-directive>\n *   Should match component / directive.\n * </my-comp>\n * <div ngNonBindable>\n *   <!-- ɵɵdisableBindings() -->\n *   <my-comp my-directive>\n *     Should not match component / directive because we are in ngNonBindable.\n *   </my-comp>\n *   <!-- ɵɵenableBindings() -->\n * </div>\n * ```\n *\n * @codeGenApi\n */\nexport function ɵɵdisableBindings(): void {\n  instructionState.bindingsEnabled = false;\n}\n\n/**\n * Clears the root skip hydration node when leaving a skip hydration block.\n */\nexport function leaveSkipHydrationBlock(): void {\n  instructionState.skipHydrationRootTNode = null;\n}\n\n/**\n * Return the current `LView`.\n */\nexport function getLView<T>(): LView<T> {\n  return instructionState.lFrame.lView as LView<T>;\n}\n\n/**\n * Return the current `TView`.\n */\nexport function getTView(): TView {\n  return instructionState.lFrame.tView;\n}\n\n/**\n * Restores `contextViewData` to the given OpaqueViewState instance.\n *\n * Used in conjunction with the getCurrentView() instruction to save a snapshot\n * of the current view and restore it when listeners are invoked. This allows\n * walking the declaration view tree in listeners to get vars from parent views.\n *\n * @param viewToRestore The OpaqueViewState instance to restore.\n * @returns Context of the restored OpaqueViewState instance.\n *\n * @codeGenApi\n */\nexport function ɵɵrestoreView<T = any>(viewToRestore: OpaqueViewState): T {\n  instructionState.lFrame.contextLView = viewToRestore as any as LView;\n  return (viewToRestore as any as LView)[CONTEXT] as unknown as T;\n}\n\n/**\n * Clears the view set in `ɵɵrestoreView` from memory. Returns the passed in\n * value so that it can be used as a return value of an instruction.\n *\n * @codeGenApi\n */\nexport function ɵɵresetView<T>(value?: T): T | undefined {\n  instructionState.lFrame.contextLView = null;\n  return value;\n}\n\nexport function getCurrentTNode(): TNode | null {\n  let currentTNode = getCurrentTNodePlaceholderOk();\n  while (currentTNode !== null && currentTNode.type === TNodeType.Placeholder) {\n    currentTNode = currentTNode.parent;\n  }\n  return currentTNode;\n}\n\nexport function getCurrentTNodePlaceholderOk(): TNode | null {\n  return instructionState.lFrame.currentTNode;\n}\n\nexport function getCurrentParentTNode(): TNode | null {\n  const lFrame = instructionState.lFrame;\n  const currentTNode = lFrame.currentTNode;\n  return lFrame.isParent ? currentTNode : currentTNode!.parent;\n}\n\nexport function setCurrentTNode(tNode: TNode | null, isParent: boolean) {\n  ngDevMode && tNode && assertTNodeForTView(tNode, instructionState.lFrame.tView);\n  const lFrame = instructionState.lFrame;\n  lFrame.currentTNode = tNode;\n  lFrame.isParent = isParent;\n}\n\nexport function isCurrentTNodeParent(): boolean {\n  return instructionState.lFrame.isParent;\n}\n\nexport function setCurrentTNodeAsNotParent(): void {\n  instructionState.lFrame.isParent = false;\n}\n\nexport function getContextLView(): LView {\n  const contextLView = instructionState.lFrame.contextLView;\n  ngDevMode && assertDefined(contextLView, 'contextLView must be defined.');\n  return contextLView!;\n}\n\nexport function isInCheckNoChangesMode(): boolean {\n  !ngDevMode && throwError('Must never be called in production mode');\n  return _checkNoChangesMode !== CheckNoChangesMode.Off;\n}\n\nexport function isExhaustiveCheckNoChanges(): boolean {\n  !ngDevMode && throwError('Must never be called in production mode');\n  return _checkNoChangesMode === CheckNoChangesMode.Exhaustive;\n}\n\nexport function setIsInCheckNoChangesMode(mode: CheckNoChangesMode): void {\n  !ngDevMode && throwError('Must never be called in production mode');\n  _checkNoChangesMode = mode;\n}\n\nexport function isRefreshingViews(): boolean {\n  return _isRefreshingViews;\n}\n\nexport function setIsRefreshingViews(mode: boolean): boolean {\n  const prev = _isRefreshingViews;\n  _isRefreshingViews = mode;\n  return prev;\n}\n\n// top level variables should not be exported for performance reasons (PERF_NOTES.md)\nexport function getBindingRoot() {\n  const lFrame = instructionState.lFrame;\n  let index = lFrame.bindingRootIndex;\n  if (index === -1) {\n    index = lFrame.bindingRootIndex = lFrame.tView.bindingStartIndex;\n  }\n  return index;\n}\n\nexport function getBindingIndex(): number {\n  return instructionState.lFrame.bindingIndex;\n}\n\nexport function setBindingIndex(value: number): number {\n  return (instructionState.lFrame.bindingIndex = value);\n}\n\nexport function nextBindingIndex(): number {\n  return instructionState.lFrame.bindingIndex++;\n}\n\nexport function incrementBindingIndex(count: number): number {\n  const lFrame = instructionState.lFrame;\n  const index = lFrame.bindingIndex;\n  lFrame.bindingIndex = lFrame.bindingIndex + count;\n  return index;\n}\n\nexport function isInI18nBlock() {\n  return instructionState.lFrame.inI18n;\n}\n\nexport function setInI18nBlock(isInI18nBlock: boolean): void {\n  instructionState.lFrame.inI18n = isInI18nBlock;\n}\n\n/**\n * Set a new binding root index so that host template functions can execute.\n *\n * Bindings inside the host template are 0 index. But because we don't know ahead of time\n * how many host bindings we have we can't pre-compute them. For this reason they are all\n * 0 index and we just shift the root so that they match next available location in the LView.\n *\n * @param bindingRootIndex Root index for `hostBindings`\n * @param currentDirectiveIndex `TData[currentDirectiveIndex]` will point to the current directive\n *        whose `hostBindings` are being processed.\n */\nexport function setBindingRootForHostBindings(\n  bindingRootIndex: number,\n  currentDirectiveIndex: number,\n) {\n  const lFrame = instructionState.lFrame;\n  lFrame.bindingIndex = lFrame.bindingRootIndex = bindingRootIndex;\n  setCurrentDirectiveIndex(currentDirectiveIndex);\n}\n\n/**\n * When host binding is executing this points to the directive index.\n * `TView.data[getCurrentDirectiveIndex()]` is `DirectiveDef`\n * `LView[getCurrentDirectiveIndex()]` is directive instance.\n */\nexport function getCurrentDirectiveIndex(): number {\n  return instructionState.lFrame.currentDirectiveIndex;\n}\n\n/**\n * Sets an index of a directive whose `hostBindings` are being processed.\n *\n * @param currentDirectiveIndex `TData` index where current directive instance can be found.\n */\nexport function setCurrentDirectiveIndex(currentDirectiveIndex: number): void {\n  instructionState.lFrame.currentDirectiveIndex = currentDirectiveIndex;\n}\n\n/**\n * Retrieve the current `DirectiveDef` which is active when `hostBindings` instruction is being\n * executed.\n *\n * @param tData Current `TData` where the `DirectiveDef` will be looked up at.\n */\nexport function getCurrentDirectiveDef(tData: TData): DirectiveDef<any> | null {\n  const currentDirectiveIndex = instructionState.lFrame.currentDirectiveIndex;\n  return currentDirectiveIndex === -1 ? null : (tData[currentDirectiveIndex] as DirectiveDef<any>);\n}\n\nexport function getCurrentQueryIndex(): number {\n  return instructionState.lFrame.currentQueryIndex;\n}\n\nexport function setCurrentQueryIndex(value: number): void {\n  instructionState.lFrame.currentQueryIndex = value;\n}\n\n/**\n * Returns a `TNode` of the location where the current `LView` is declared at.\n *\n * @param lView an `LView` that we want to find parent `TNode` for.\n */\nfunction getDeclarationTNode(lView: LView): TNode | null {\n  const tView = lView[TVIEW];\n\n  // Return the declaration parent for embedded views\n  if (tView.type === TViewType.Embedded) {\n    ngDevMode && assertDefined(tView.declTNode, 'Embedded TNodes should have declaration parents.');\n    return tView.declTNode;\n  }\n\n  // Components don't have `TView.declTNode` because each instance of component could be\n  // inserted in different location, hence `TView.declTNode` is meaningless.\n  // Falling back to `T_HOST` in case we cross component boundary.\n  if (tView.type === TViewType.Component) {\n    return lView[T_HOST];\n  }\n\n  // Remaining TNode type is `TViewType.Root` which doesn't have a parent TNode.\n  return null;\n}\n\n/**\n * This is a light weight version of the `enterView` which is needed by the DI system.\n *\n * @param lView `LView` location of the DI context.\n * @param tNode `TNode` for DI context\n * @param flags DI context flags. if `SkipSelf` flag is set than we walk up the declaration\n *     tree from `tNode`  until we find parent declared `TElementNode`.\n * @returns `true` if we have successfully entered DI associated with `tNode` (or with declared\n *     `TNode` if `flags` has  `SkipSelf`). Failing to enter DI implies that no associated\n *     `NodeInjector` can be found and we should instead use `ModuleInjector`.\n *     - If `true` than this call must be fallowed by `leaveDI`\n *     - If `false` than this call failed and we should NOT call `leaveDI`\n */\nexport function enterDI(lView: LView, tNode: TNode, flags: InjectFlags) {\n  ngDevMode && assertLViewOrUndefined(lView);\n\n  if (flags & InjectFlags.SkipSelf) {\n    ngDevMode && assertTNodeForTView(tNode, lView[TVIEW]);\n\n    let parentTNode = tNode as TNode | null;\n    let parentLView = lView;\n\n    while (true) {\n      ngDevMode && assertDefined(parentTNode, 'Parent TNode should be defined');\n      parentTNode = parentTNode!.parent as TNode | null;\n      if (parentTNode === null && !(flags & InjectFlags.Host)) {\n        parentTNode = getDeclarationTNode(parentLView);\n        if (parentTNode === null) break;\n\n        // In this case, a parent exists and is definitely an element. So it will definitely\n        // have an existing lView as the declaration view, which is why we can assume it's defined.\n        ngDevMode && assertDefined(parentLView, 'Parent LView should be defined');\n        parentLView = parentLView[DECLARATION_VIEW]!;\n\n        // In Ivy there are Comment nodes that correspond to ngIf and NgFor embedded directives\n        // We want to skip those and look only at Elements and ElementContainers to ensure\n        // we're looking at true parent nodes, and not content or other types.\n        if (parentTNode.type & (TNodeType.Element | TNodeType.ElementContainer)) {\n          break;\n        }\n      } else {\n        break;\n      }\n    }\n    if (parentTNode === null) {\n      // If we failed to find a parent TNode this means that we should use module injector.\n      return false;\n    } else {\n      tNode = parentTNode;\n      lView = parentLView;\n    }\n  }\n\n  ngDevMode && assertTNodeForLView(tNode, lView);\n  const lFrame = (instructionState.lFrame = allocLFrame());\n  lFrame.currentTNode = tNode;\n  lFrame.lView = lView;\n\n  return true;\n}\n\n/**\n * Swap the current lView with a new lView.\n *\n * For performance reasons we store the lView in the top level of the module.\n * This way we minimize the number of properties to read. Whenever a new view\n * is entered we have to store the lView for later, and when the view is\n * exited the state has to be restored\n *\n * @param newView New lView to become active\n * @returns the previously active lView;\n */\nexport function enterView(newView: LView): void {\n  ngDevMode && assertNotEqual(newView[0], newView[1] as any, '????');\n  ngDevMode && assertLViewOrUndefined(newView);\n  const newLFrame = allocLFrame();\n  if (ngDevMode) {\n    assertEqual(newLFrame.isParent, true, 'Expected clean LFrame');\n    assertEqual(newLFrame.lView, null, 'Expected clean LFrame');\n    assertEqual(newLFrame.tView, null, 'Expected clean LFrame');\n    assertEqual(newLFrame.selectedIndex, -1, 'Expected clean LFrame');\n    assertEqual(newLFrame.elementDepthCount, 0, 'Expected clean LFrame');\n    assertEqual(newLFrame.currentDirectiveIndex, -1, 'Expected clean LFrame');\n    assertEqual(newLFrame.currentNamespace, null, 'Expected clean LFrame');\n    assertEqual(newLFrame.bindingRootIndex, -1, 'Expected clean LFrame');\n    assertEqual(newLFrame.currentQueryIndex, 0, 'Expected clean LFrame');\n  }\n  const tView = newView[TVIEW];\n  instructionState.lFrame = newLFrame;\n  ngDevMode && tView.firstChild && assertTNodeForTView(tView.firstChild, tView);\n  newLFrame.currentTNode = tView.firstChild!;\n  newLFrame.lView = newView;\n  newLFrame.tView = tView;\n  newLFrame.contextLView = newView;\n  newLFrame.bindingIndex = tView.bindingStartIndex;\n  newLFrame.inI18n = false;\n}\n\n/**\n * Allocates next free LFrame. This function tries to reuse the `LFrame`s to lower memory pressure.\n */\nfunction allocLFrame() {\n  const currentLFrame = instructionState.lFrame;\n  const childLFrame = currentLFrame === null ? null : currentLFrame.child;\n  const newLFrame = childLFrame === null ? createLFrame(currentLFrame) : childLFrame;\n  return newLFrame;\n}\n\nfunction createLFrame(parent: LFrame | null): LFrame {\n  const lFrame: LFrame = {\n    currentTNode: null,\n    isParent: true,\n    lView: null!,\n    tView: null!,\n    selectedIndex: -1,\n    contextLView: null,\n    elementDepthCount: 0,\n    currentNamespace: null,\n    currentDirectiveIndex: -1,\n    bindingRootIndex: -1,\n    bindingIndex: -1,\n    currentQueryIndex: 0,\n    parent: parent!,\n    child: null,\n    inI18n: false,\n  };\n  parent !== null && (parent.child = lFrame); // link the new LFrame for reuse.\n  return lFrame;\n}\n\n/**\n * A lightweight version of leave which is used with DI.\n *\n * This function only resets `currentTNode` and `LView` as those are the only properties\n * used with DI (`enterDI()`).\n *\n * NOTE: This function is reexported as `leaveDI`. However `leaveDI` has return type of `void` where\n * as `leaveViewLight` has `LFrame`. This is so that `leaveViewLight` can be used in `leaveView`.\n */\nfunction leaveViewLight(): LFrame {\n  const oldLFrame = instructionState.lFrame;\n  instructionState.lFrame = oldLFrame.parent;\n  oldLFrame.currentTNode = null!;\n  oldLFrame.lView = null!;\n  return oldLFrame;\n}\n\n/**\n * This is a lightweight version of the `leaveView` which is needed by the DI system.\n *\n * NOTE: this function is an alias so that we can change the type of the function to have `void`\n * return type.\n */\nexport const leaveDI: () => void = leaveViewLight;\n\n/**\n * Leave the current `LView`\n *\n * This pops the `LFrame` with the associated `LView` from the stack.\n *\n * IMPORTANT: We must zero out the `LFrame` values here otherwise they will be retained. This is\n * because for performance reasons we don't release `LFrame` but rather keep it for next use.\n */\nexport function leaveView() {\n  const oldLFrame = leaveViewLight();\n  oldLFrame.isParent = true;\n  oldLFrame.tView = null!;\n  oldLFrame.selectedIndex = -1;\n  oldLFrame.contextLView = null;\n  oldLFrame.elementDepthCount = 0;\n  oldLFrame.currentDirectiveIndex = -1;\n  oldLFrame.currentNamespace = null;\n  oldLFrame.bindingRootIndex = -1;\n  oldLFrame.bindingIndex = -1;\n  oldLFrame.currentQueryIndex = 0;\n}\n\nexport function nextContextImpl<T = any>(level: number): T {\n  const contextLView = (instructionState.lFrame.contextLView = walkUpViews(\n    level,\n    instructionState.lFrame.contextLView!,\n  ));\n  return contextLView[CONTEXT] as unknown as T;\n}\n\n/**\n * Gets the currently selected element index.\n *\n * Used with {@link property} instruction (and more in the future) to identify the index in the\n * current `LView` to act on.\n */\nexport function getSelectedIndex() {\n  return instructionState.lFrame.selectedIndex;\n}\n\n/**\n * Sets the most recent index passed to {@link select}\n *\n * Used with {@link property} instruction (and more in the future) to identify the index in the\n * current `LView` to act on.\n *\n * (Note that if an \"exit function\" was set earlier (via `setElementExitFn()`) then that will be\n * run if and when the provided `index` value is different from the current selected index value.)\n */\nexport function setSelectedIndex(index: number) {\n  ngDevMode &&\n    index !== -1 &&\n    assertGreaterThanOrEqual(index, HEADER_OFFSET, 'Index must be past HEADER_OFFSET (or -1).');\n  ngDevMode &&\n    assertLessThan(\n      index,\n      instructionState.lFrame.lView.length,\n      \"Can't set index passed end of LView\",\n    );\n  instructionState.lFrame.selectedIndex = index;\n}\n\n/**\n * Gets the `tNode` that represents currently selected element.\n */\nexport function getSelectedTNode() {\n  const lFrame = instructionState.lFrame;\n  return getTNode(lFrame.tView, lFrame.selectedIndex);\n}\n\n/**\n * Sets the namespace used to create elements to `'http://www.w3.org/2000/svg'` in global state.\n *\n * @codeGenApi\n */\nexport function ɵɵnamespaceSVG() {\n  instructionState.lFrame.currentNamespace = SVG_NAMESPACE;\n}\n\n/**\n * Sets the namespace used to create elements to `'http://www.w3.org/1998/MathML/'` in global state.\n *\n * @codeGenApi\n */\nexport function ɵɵnamespaceMathML() {\n  instructionState.lFrame.currentNamespace = MATH_ML_NAMESPACE;\n}\n\n/**\n * Sets the namespace used to create elements to `null`, which forces element creation to use\n * `createElement` rather than `createElementNS`.\n *\n * @codeGenApi\n */\nexport function ɵɵnamespaceHTML() {\n  namespaceHTMLInternal();\n}\n\n/**\n * Sets the namespace used to create elements to `null`, which forces element creation to use\n * `createElement` rather than `createElementNS`.\n */\nexport function namespaceHTMLInternal() {\n  instructionState.lFrame.currentNamespace = null;\n}\n\nexport function getNamespace(): string | null {\n  return instructionState.lFrame.curre   ntNamespace;\n}\n\nlet _wasLastNodeCreated = true;\n\n/**\n * Retrieves a global flag that indicates whether the most recent DOM node\n * was created or hydrated.\n */\nexport function wasLastNodeCreated(): boolean {\n  return _wasLastNodeCreated;\n}\n\n/**\n * Sets a global flag to indicate whether the most recent DOM node\n * was created or hydrated.\n */\nexport function lastNodeWasCreated(flag: boolean): void {\n  _wasLastNodeCreated = flag;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../primitives/signals';\n\nimport {\n  AfterContentChecked,\n  AfterContentInit,\n  AfterViewChecked,\n  AfterViewInit,\n  DoCheck,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n} from '../interface/lifecycle_hooks';\nimport {assertDefined, assertEqual, assertNotEqual} from '../util/assert';\n\nimport {assertFirstCreatePass} from './assert';\nimport {NgOnChangesFeatureImpl} from './features/ng_onchanges_feature';\nimport {DirectiveDef} from './interfaces/definition';\nimport {TNode} from './interfaces/node';\nimport {\n  FLAGS,\n  HookData,\n  InitPhaseState,\n  LView,\n  LViewFlags,\n  PREORDER_HOOK_FLAGS,\n  PreOrderHookFlags,\n  TView,\n} from './interfaces/view';\nimport {profiler} from './profiler';\nimport {ProfilerEvent} from './profiler_types';\nimport {isInCheckNoChangesMode} from './state';\n\n/**\n * Adds all directive lifecycle hooks from the given `DirectiveDef` to the given `TView`.\n *\n * Must be run *only* on the first template pass.\n *\n * Sets up the pre-order hooks on the provided `tView`,\n * see {@link HookData} for details about the data structure.\n *\n * @param directiveIndex The index of the directive in LView\n * @param directiveDef The definition containing the hooks to setup in tView\n * @param tView The current TView\n */\nexport function registerPreOrderHooks(\n  directiveIndex: number,\n  directiveDef: DirectiveDef<any>,\n  tView: TView,\n): void {\n  ngDevMode && assertFirstCreatePass(tView);\n  const {ngOnChanges, ngOnInit, ngDoCheck} = directiveDef.type.prototype as OnChanges &\n    OnInit &\n    DoCheck;\n\n  if (ngOnChanges as Function | undefined) {\n    const wrappedOnChanges = NgOnChangesFeatureImpl(directiveDef);\n    (tView.preOrderHooks ??= []).push(directiveIndex, wrappedOnChanges);\n    (tView.preOrderCheckHooks ??= []).push(directiveIndex, wrappedOnChanges);\n  }\n\n  if (ngOnInit) {\n    (tView.preOrderHooks ??= []).push(0 - directiveIndex, ngOnInit);\n  }\n\n  if (ngDoCheck) {\n    (tView.preOrderHooks ??= []).push(directiveIndex, ngDoCheck);\n    (tView.preOrderCheckHooks ??= []).push(directiveIndex, ngDoCheck);\n  }\n}\n\n/**\n *\n * Loops through the directives on the provided `tNode` and queues hooks to be\n * run that are not initialization hooks.\n *\n * Should be executed during `elementEnd()` and similar to\n * preserve hook execution order. Content, view, and destroy hooks for projected\n * components and directives must be called *before* their hosts.\n *\n * Sets up the content, view, and destroy hooks on the provided `tView`,\n * see {@link HookData} for details about the data structure.\n *\n * NOTE: This does not set up `onChanges`, `onInit` or `doCheck`, those are set up\n * separately at `elementStart`.\n *\n * @param tView The current TView\n * @param tNode The TNode whose directives are to be searched for hooks to queue\n */\nexport function registerPostOrderHooks(tView: TView, tNode: TNode): void {\n  ngDevMode && assertFirstCreatePass(tView);\n  // It's necessary to loop through the directives at elementEnd() (rather than processing in\n  // directiveCreate) so we can preserve the current hook order. Content, view, and destroy\n  // hooks for projected components and directives must be called *before* their hosts.\n  for (let i = tNode.directiveStart, end = tNode.directiveEnd; i < end; i++) {\n    const directiveDef = tView.data[i] as DirectiveDef<any>;\n    ngDevMode && assertDefined(directiveDef, 'Expecting DirectiveDef');\n    const lifecycleHooks: AfterContentInit &\n      AfterContentChecked &\n      AfterViewInit &\n      AfterViewChecked &\n      OnDestroy = directiveDef.type.prototype;\n    const {\n      ngAfterContentInit,\n      ngAfterContentChecked,\n      ngAfterViewInit,\n      ngAfterViewChecked,\n      ngOnDestroy,\n    } = lifecycleHooks;\n\n    if (ngAfterContentInit) {\n      (tView.contentHooks ??= []).push(-i, ngAfterContentInit);\n    }\n\n    if (ngAfterContentChecked) {\n      (tView.contentHooks ??= []).push(i, ngAfterContentChecked);\n      (tView.contentCheckHooks ??= []).push(i, ngAfterContentChecked);\n    }\n\n    if (ngAfterViewInit) {\n      (tView.viewHooks ??= []).push(-i, ngAfterViewInit);\n    }\n\n    if (ngAfterViewChecked) {\n      (tView.viewHooks ??= []).push(i, ngAfterViewChecked);\n      (tView.viewCheckHooks ??= []).push(i, ngAfterViewChecked);\n    }\n\n    if (ngOnDestroy != null) {\n      (tView.destroyHooks ??= []).push(i, ngOnDestroy);\n    }\n  }\n}\n\n/**\n * Executing hooks requires complex logic as we need to deal with 2 constraints.\n *\n * 1. Init hooks (ngOnInit, ngAfterContentInit, ngAfterViewInit) must all be executed once and only\n * once, across many change detection cycles. This must be true even if some hooks throw, or if\n * some recursively trigger a change detection cycle.\n * To solve that, it is required to track the state of the execution of these init hooks.\n * This is done by storing and maintaining flags in the view: the {@link InitPhaseState},\n * and the index within that phase. They can be seen as a cursor in the following structure:\n * [[onInit1, onInit2], [afterContentInit1], [afterViewInit1, afterViewInit2, afterViewInit3]]\n * They are stored as flags in LView[FLAGS].\n *\n * 2. Pre-order hooks can be executed in batches, because of the select instruction.\n * To be able to pause and resume their execution, we also need some state about the hook's array\n * that is being processed:\n * - the index of the next hook to be executed\n * - the number of init hooks already found in the processed part of the  array\n * They are stored as flags in LView[PREORDER_HOOK_FLAGS].\n */\n\n/**\n * Executes pre-order check hooks ( OnChanges, DoChanges) given a view where all the init hooks were\n * executed once. This is a light version of executeInitAndCheckPreOrderHooks where we can skip read\n * / write of the init-hooks related flags.\n * @param lView The LView where hooks are defined\n * @param hooks Hooks to be run\n * @param nodeIndex 3 cases depending on the value:\n * - undefined: all hooks from the array should be executed (post-order case)\n * - null: execute hooks only from the saved index until the end of the array (pre-order case, when\n * flushing the remaining hooks)\n * - number: execute hooks only from the saved index until that node index exclusive (pre-order\n * case, when executing select(number))\n */\nexport function executeCheckHooks(lView: LView, hooks: HookData, nodeIndex?: number | null) {\n  callHooks(lView, hooks, InitPhaseState.InitPhaseCompleted, nodeIndex);\n}\n\n/**\n * Executes post-order init and check hooks (one of AfterContentInit, AfterContentChecked,\n * AfterViewInit, AfterViewChecked) given a view where there are pending init hooks to be executed.\n * @param lView The LView where hooks are defined\n * @param hooks Hooks to be run\n * @param initPhase A phase for which hooks should be run\n * @param nodeIndex 3 cases depending on the value:\n * - undefined: all hooks from the array should be executed (post-order case)\n * - null: execute hooks only from the saved index until the end of the array (pre-order case, when\n * flushing the remaining hooks)\n * - number: execute hooks only from the saved index until that node index exclusive (pre-order\n * case, when executing select(number))\n */\nexport function executeInitAndCheckHooks(\n  lView: LView,\n  hooks: HookData,\n  initPhase: InitPhaseState,\n  nodeIndex?: number | null,\n) {\n  ngDevMode &&\n    assertNotEqual(\n      initPhase,\n      InitPhaseState.InitPhaseCompleted,\n      'Init pre-order hooks should not be called more than once',\n    );\n  if ((lView[FLAGS] & LViewFlags.InitPhaseStateMask) === initPhase) {\n    callHooks(lView, hooks, initPhase, nodeIndex);\n  }\n}\n\nexport function incrementInitPhaseFlags(lView: LView, initPhase: InitPhaseState): void {\n  ngDevMode &&\n    assertNotEqual(\n      initPhase,\n      InitPhaseState.InitPhaseCompleted,\n      'Init hooks phase should not be incremented after all init hooks have been run.',\n    );\n  let flags = lView[FLAGS];\n  if ((flags & LViewFlags.InitPhaseStateMask) === initPhase) {\n    flags &= LViewFlags.IndexWithinInitPhaseReset;\n    flags += LViewFlags.InitPhaseStateIncrementer;\n    lView[FLAGS] = flags;\n  }\n}\n\n/**\n * Calls lifecycle hooks with their contexts, skipping init hooks if it's not\n * the first LView pass\n *\n * @param currentView The current view\n * @param arr The array in which the hooks are found\n * @param initPhaseState the current state of the init phase\n * @param currentNodeIndex 3 cases depending on the value:\n * - undefined: all hooks from the array should be executed (post-order case)\n * - null: execute hooks only from the saved index until the end of the array (pre-order case, when\n * flushing the remaining hooks)\n * - number: execute hooks only from the saved index until that node index exclusive (pre-order\n * case, when executing select(number))\n */\nfunction callHooks(\n  currentView: LView,\n  arr: HookData,\n  initPhase: InitPhaseState,\n  currentNodeIndex: number | null | undefined,\n): void {\n  ngDevMode &&\n    assertEqual(\n      isInCheckNoChangesMode(),\n      false,\n      'Hooks should never be run when in check no changes mode.',\n    );\n  const startIndex =\n    currentNodeIndex !== undefined\n      ? currentView[PREORDER_HOOK_FLAGS] & PreOrderHookFlags.IndexOfTheNextPreOrderHookMaskMask\n      : 0;\n  const nodeIndexLimit = currentNodeIndex != null ? currentNodeIndex : -1;\n  const max = arr.length - 1; // Stop the loop at length - 1, because we look for the hook at i + 1\n  let lastNodeIndexFound = 0;\n  for (let i = startIndex; i < max; i++) {\n    const hook = arr[i + 1] as number | (() => void);\n    if (typeof hook === 'number') {\n      lastNodeIndexFound = arr[i] as number;\n      if (currentNodeIndex != null && lastNodeIndexFound >= currentNodeIndex) {\n        break;\n      }\n    } else {\n      const isInitHook = (arr[i] as number) < 0;\n      if (isInitHook) {\n        currentView[PREORDER_HOOK_FLAGS] += PreOrderHookFlags.NumberOfInitHooksCalledIncrementer;\n      }\n      if (lastNodeIndexFound < nodeIndexLimit || nodeIndexLimit == -1) {\n        callHook(currentView, initPhase, arr, i);\n        currentView[PREORDER_HOOK_FLAGS] =\n          (currentView[PREORDER_HOOK_FLAGS] & PreOrderHookFlags.NumberOfInitHooksCalledMask) +\n          i +\n          2;\n      }\n      i++;\n    }\n  }\n}\n\n/**\n * Executes a single lifecycle hook, making sure that:\n * - it is called in the non-reactive context;\n * - profiling data are registered.\n */\nfunction callHookInternal(directive: any, hook: () => void) {\n  profiler(ProfilerEvent.LifecycleHookStart, directive, hook);\n  const prevConsumer = setActiveConsumer(null);\n  try {\n    hook.call(directive);\n  } finally {\n    setActiveConsumer(prevConsumer);\n    profiler(ProfilerEvent.LifecycleHookEnd, directive, hook);\n  }\n}\n\n/**\n * Execute one hook against the current `LView`.\n *\n * @param currentView The current view\n * @param initPhaseState the current state of the init phase\n * @param arr The array in which the hooks are found\n * @param i The current index within the hook data array\n */\nfunction callHook(currentView: LView, initPhase: InitPhaseState, arr: HookData, i: number) {\n  const isInitHook = (arr[i] as number) < 0;\n  const hook = arr[i + 1] as () => void;\n  const directiveIndex = isInitHook ? -arr[i] : (arr[i] as number);\n  const directive = currentView[directiveIndex];\n  if (isInitHook) {\n    const indexWithintInitPhase = currentView[FLAGS] >> LViewFlags.IndexWithinInitPhaseShift;\n    // The init phase state must be always checked here as it may have been recursively updated.\n    if (\n      indexWithintInitPhase <\n        currentView[PREORDER_HOOK_FLAGS] >> PreOrderHookFlags.NumberOfInitHooksCalledShift &&\n      (currentView[FLAGS] & LViewFlags.InitPhaseStateMask) === initPhase\n    ) {\n      currentView[FLAGS] += LViewFlags.IndexWithinInitPhaseIncrementer;\n      callHookInternal(directive, hook);\n    }\n  } else {\n    callHookInternal(directive, hook);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectFlags} from '../../di/interface/injector';\nimport {ProviderToken} from '../../di/provider_token';\nimport {assertDefined, assertEqual} from '../../util/assert';\n\nimport {TDirectiveHostNode} from './node';\nimport {LView, TData} from './view';\n\n/**\n * Offsets of the `NodeInjector` data structure in the expando.\n *\n * `NodeInjector` is stored in both `LView` as well as `TView.data`. All storage requires 9 words.\n * First 8 are reserved for bloom filter and the 9th is reserved for the associated `TNode` as well\n * as parent `NodeInjector` pointer. All indexes are starting with `index` and have an offset as\n * shown.\n *\n * `LView` layout:\n * ```\n * index + 0: cumulative bloom filter\n * index + 1: cumulative bloom filter\n * index + 2: cumulative bloom filter\n * index + 3: cumulative bloom filter\n * index + 4: cumulative bloom filter\n * index + 5: cumulative bloom filter\n * index + 6: cumulative bloom filter\n * index + 7: cumulative bloom filter\n * index + 8: cumulative bloom filter\n * index + PARENT: Index to the parent injector. See `RelativeInjectorLocation`\n *                 `const parent = lView[index + NodeInjectorOffset.PARENT]`\n * ```\n *\n * `TViewData` layout:\n * ```\n * index + 0: cumulative bloom filter\n * index + 1: cumulative bloom filter\n * index + 2: cumulative bloom filter\n * index + 3: cumulative bloom filter\n * index + 4: cumulative bloom filter\n * index + 5: cumulative bloom filter\n * index + 6: cumulative bloom filter\n * index + 7: cumulative bloom filter\n * index + 8: cumulative bloom filter\n * index + TNODE: TNode associated with this `NodeInjector`\n *                `const tNode = tView.data[index + NodeInjectorOffset.TNODE]`\n * ```\n */\nexport const enum NodeInjectorOffset {\n  TNODE = 8,\n  PARENT = 8,\n  BLOOM_SIZE = 8,\n  SIZE = 9,\n}\n\n/**\n * Represents a relative location of parent injector.\n *\n * The interfaces encodes number of parents `LView`s to traverse and index in the `LView`\n * pointing to the parent injector.\n */\nexport type RelativeInjectorLocation = number & {\n  __brand__: 'RelativeInjectorLocationFlags';\n};\n\nexport const enum RelativeInjectorLocationFlags {\n  InjectorIndexMask = 0b111111111111111,\n  ViewOffsetShift = 16,\n  NO_PARENT = -1,\n}\n\nexport const NO_PARENT_INJECTOR = -1 as RelativeInjectorLocation;\n\n/**\n * Each injector is saved in 9 contiguous slots in `LView` and 9 contiguous slots in\n * `TView.data`. This allows us to store information about the current node's tokens (which\n * can be shared in `TView`) as well as the tokens of its ancestor nodes (which cannot be\n * shared, so they live in `LView`).\n *\n * Each of these slots (aside from the last slot) contains a bloom filter. This bloom filter\n * determines whether a directive is available on the associated node or not. This prevents us\n * from searching the directives array at this level unless it's probable the directive is in it.\n *\n * See: https://en.wikipedia.org/wiki/Bloom_filter for more about bloom filters.\n *\n * Because all injectors have been flattened into `LView` and `TViewData`, they cannot typed\n * using interfaces as they were previously. The start index of each `LInjector` and `TInjector`\n * will differ based on where it is flattened into the main array, so it's not possible to know\n * the indices ahead of time and save their types here. The interfaces are still included here\n * for documentation purposes.\n *\n * export interface LInjector extends Array<any> {\n *\n *    // Cumulative bloom for directive IDs 0-31  (IDs are % BLOOM_SIZE)\n *    [0]: number;\n *\n *    // Cumulative bloom for directive IDs 32-63\n *    [1]: number;\n *\n *    // Cumulative bloom for directive IDs 64-95\n *    [2]: number;\n *\n *    // Cumulative bloom for directive IDs 96-127\n *    [3]: number;\n *\n *    // Cumulative bloom for directive IDs 128-159\n *    [4]: number;\n *\n *    // Cumulative bloom for directive IDs 160 - 191\n *    [5]: number;\n *\n *    // Cumulative bloom for directive IDs 192 - 223\n *    [6]: number;\n *\n *    // Cumulative bloom for directive IDs 224 - 255\n *    [7]: number;\n *\n *    // We need to store a reference to the injector's parent so DI can keep looking up\n *    // the injector tree until it finds the dependency it's looking for.\n *    [PARENT_INJECTOR]: number;\n * }\n *\n * export interface TInjector extends Array<any> {\n *\n *    // Shared node bloom for directive IDs 0-31  (IDs are % BLOOM_SIZE)\n *    [0]: number;\n *\n *    // Shared node bloom for directive IDs 32-63\n *    [1]: number;\n *\n *    // Shared node bloom for directive IDs 64-95\n *    [2]: number;\n *\n *    // Shared node bloom for directive IDs 96-127\n *    [3]: number;\n *\n *    // Shared node bloom for directive IDs 128-159\n *    [4]: number;\n *\n *    // Shared node bloom for directive IDs 160 - 191\n *    [5]: number;\n *\n *    // Shared node bloom for directive IDs 192 - 223\n *    [6]: number;\n *\n *    // Shared node bloom for directive IDs 224 - 255\n *    [7]: number;\n *\n *    // Necessary to find directive indices for a particular node.\n *    [TNODE]: TElementNode|TElementContainerNode|TContainerNode;\n *  }\n */\n\n/**\n * Factory for creating instances of injectors in the NodeInjector.\n *\n * This factory is complicated by the fact that it can resolve `multi` factories as well.\n *\n * NOTE: Some of the fields are optional which means that this class has two hidden classes.\n * - One without `multi` support (most common)\n * - One with `multi` values, (rare).\n *\n * Since VMs can cache up to 4 inline hidden classes this is OK.\n *\n * - Single factory: Only `resolving` and `factory` is defined.\n * - `providers` factory: `componentProviders` is a number and `index = -1`.\n * - `viewProviders` factory: `componentProviders` is a number and `index` points to `providers`.\n */\nexport class NodeInjectorFactory {\n  /**\n   * The inject implementation to be activated when using the factory.\n   */\n  injectImpl: null | (<T>(token: ProviderToken<T>, flags?: InjectFlags) => T);\n\n  /**\n   * Marker set to true during factory invocation to see if we get into recursive loop.\n   * Recursive loop causes an error to be displayed.\n   */\n  resolving = false;\n\n  /**\n   * Marks that the token can see other Tokens declared in `viewProviders` on the same node.\n   */\n  canSeeViewProviders: boolean;\n\n  /**\n   * An array of factories to use in case of `multi` provider.\n   */\n  multi?: Array<() => any>;\n\n  /**\n   * Number of `multi`-providers which belong to the component.\n   *\n   * This is needed because when multiple components and directives declare the `multi` provider\n   * they have to be concatenated in the correct order.\n   *\n   * Example:\n   *\n   * If we have a component and directive active an a single element as declared here\n   * ```ts\n   * component:\n   *   providers: [ {provide: String, useValue: 'component', multi: true} ],\n   *   viewProviders: [ {provide: String, useValue: 'componentView', multi: true} ],\n   *\n   * directive:\n   *   providers: [ {provide: String, useValue: 'directive', multi: true} ],\n   * ```\n   *\n   * Then the expected results are:\n   *\n   * ```ts\n   * providers: ['component', 'directive']\n   * viewProviders: ['component', 'componentView', 'directive']\n   * ```\n   *\n   * The way to think about it is that the `viewProviders` have been inserted after the component\n   * but before the directives, which is why we need to know how many `multi`s have been declared by\n   * the component.\n   */\n  componentProviders?: number;\n\n  /**\n   * Current index of the Factory in the `data`. Needed for `viewProviders` and `providers` merging.\n   * See `providerFactory`.\n   */\n  index?: number;\n\n  /**\n   * Because the same `multi` provider can be declared in `providers` and `viewProviders` it is\n   * possible for `viewProviders` to shadow the `providers`. For this reason we store the\n   * `provideFactory` of the `providers` so that `providers` can be extended with `viewProviders`.\n   *\n   * Example:\n   *\n   * Given:\n   * ```ts\n   * providers: [ {provide: String, useValue: 'all', multi: true} ],\n   * viewProviders: [ {provide: String, useValue: 'viewOnly', multi: true} ],\n   * ```\n   *\n   * We have to return `['all']` in case of content injection, but `['all', 'viewOnly']` in case\n   * of view injection. We further have to make sure that the shared instances (in our case\n   * `all`) are the exact same instance in both the content as well as the view injection. (We\n   * have to make sure that we don't double instantiate.) For this reason the `viewProviders`\n   * `Factory` has a pointer to the shadowed `providers` factory so that it can instantiate the\n   * `providers` (`['all']`) and then extend it with `viewProviders` (`['all'] + ['viewOnly'] =\n   * ['all', 'viewOnly']`).\n   */\n  providerFactory?: NodeInjectorFactory | null;\n\n  constructor(\n    /**\n     * Factory to invoke in order to create a new instance.\n     */\n    public factory: (\n      this: NodeInjectorFactory,\n      _: undefined,\n      /**\n       * Flags that control the injection behavior.\n       */\n      flags: InjectFlags | undefined,\n      /**\n       * array where injectables tokens are stored. This is used in\n       * case of an error reporting to produce friendlier errors.\n       */\n      tData: TData,\n      /**\n       * array where existing instances of injectables are stored. This is used in case\n       * of multi shadow is needed. See `multi` field documentation.\n       */\n      lView: LView,\n      /**\n       * The TNode of the same element injector.\n       */\n      tNode: TDirectiveHostNode,\n    ) => any,\n    /**\n     * Set to `true` if the token is declared in `viewProviders` (or if it is component).\n     */\n    isViewProvider: boolean,\n    injectImplementation: null | (<T>(token: ProviderToken<T>, flags?: InjectFlags) => T),\n  ) {\n    ngDevMode && assertDefined(factory, 'Factory not specified');\n    ngDevMode && assertEqual(typeof factory, 'function', 'Expected factory function.');\n    this.canSeeViewProviders = isViewProvider;\n    this.injectImpl = injectImplementation;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {Type} from '../../interface/type';\nimport {KeyValueArray} from '../../util/array_utils';\nimport {TStylingRange} from '../interfaces/styling';\nimport {AttributeMarker} from './attribute_marker';\n\nimport {TIcu} from './i18n';\nimport {CssSelector} from './projection';\nimport {RNode} from './renderer_dom';\nimport type {LView, TView} from './view';\n\n/**\n * TNodeType corresponds to the {@link TNode} `type` property.\n *\n * NOTE: type IDs are such that we use each bit to denote a type. This is done so that we can easily\n * check if the `TNode` is of more than one type.\n *\n * `if (tNode.type === TNodeType.Text || tNode.type === TNode.Element)`\n * can be written as:\n * `if (tNode.type & (TNodeType.Text | TNodeType.Element))`\n *\n * However any given `TNode` can only be of one type.\n */\nexport const enum TNodeType {\n  /**\n   * The TNode contains information about a DOM element aka {@link RText}.\n   */\n  Text = 0b1,\n\n  /**\n   * The TNode contains information about a DOM element aka {@link RElement}.\n   */\n  Element = 0b10,\n\n  /**\n   * The TNode contains information about an {@link LContainer} for embedded views.\n   */\n  Container = 0b100,\n\n  /**\n   * The TNode contains information about an `<ng-container>` element {@link RNode}.\n   */\n  ElementContainer = 0b1000,\n\n  /**\n   * The TNode contains information about an `<ng-content>` projection\n   */\n  Projection = 0b10000,\n\n  /**\n   * The TNode contains information about an ICU comment used in `i18n`.\n   */\n  Icu = 0b100000,\n\n  /**\n   * Special node type representing a placeholder for future `TNode` at this location.\n   *\n   * I18n translation blocks are created before the element nodes which they contain. (I18n blocks\n   * can span over many elements.) Because i18n `TNode`s (representing text) are created first they\n   * often may need to point to element `TNode`s which are not yet created. In such a case we create\n   * a `Placeholder` `TNode`. This allows the i18n to structurally link the `TNode`s together\n   * without knowing any information about the future nodes which will be at that location.\n   *\n   * On `firstCreatePass` When element instruction executes it will try to create a `TNode` at that\n   * location. Seeing a `Placeholder` `TNode` already there tells the system that it should reuse\n   * existing `TNode` (rather than create a new one) and just update the missing information.\n   */\n  Placeholder = 0b1000000,\n\n  /**\n   * The TNode contains information about a `@let` declaration.\n   */\n  LetDeclaration = 0b10000000,\n\n  // Combined Types These should never be used for `TNode.type` only as a useful way to check\n  // if `TNode.type` is one of several choices.\n\n  // See: https://github.com/microsoft/TypeScript/issues/35875 why we can't refer to existing enum.\n  AnyRNode = 0b11, // Text | Element\n  AnyContainer = 0b1100, // Container | ElementContainer\n}\n\n/**\n * Converts `TNodeType` into human readable text.\n * Make sure this matches with `TNodeType`\n */\nexport function toTNodeTypeAsString(tNodeType: TNodeType): string {\n  let text = '';\n  tNodeType & TNodeType.Text && (text += '|Text');\n  tNodeType & TNodeType.Element && (text += '|Element');\n  tNodeType & TNodeType.Container && (text += '|Container');\n  tNodeType & TNodeType.ElementContainer && (text += '|ElementContainer');\n  tNodeType & TNodeType.Projection && (text += '|Projection');\n  tNodeType & TNodeType.Icu && (text += '|IcuContainer');\n  tNodeType & TNodeType.Placeholder && (text += '|Placeholder');\n  tNodeType & TNodeType.LetDeclaration && (text += '|LetDeclaration');\n  return text.length > 0 ? text.substring(1) : text;\n}\n\n/**\n * Helper function to detect if a given value matches a `TNode` shape.\n *\n * The logic uses the `insertBeforeIndex` and its possible values as\n * a way to differentiate a TNode shape from other types of objects\n * within the `TView.data`. This is not a perfect check, but it can\n * be a reasonable differentiator, since we control the shapes of objects\n * within `TView.data`.\n */\nexport function isTNodeShape(value: unknown): value is TNode {\n  return (\n    value != null &&\n    typeof value === 'object' &&\n    ((value as TNode).insertBeforeIndex === null ||\n      typeof (value as TNode).insertBeforeIndex === 'number' ||\n      Array.isArray((value as TNode).insertBeforeIndex))\n  );\n}\n\nexport function isLetDeclaration(tNode: TNode): boolean {\n  return !!(tNode.type & TNodeType.LetDeclaration);\n}\n\n/**\n * Corresponds to the TNode.flags property.\n */\nexport const enum TNodeFlags {\n  /** Bit #1 - This bit is set if the node is a host for any directive (including a component) */\n  isDirectiveHost = 0x1,\n\n  /** Bit #2 - This bit is set if the node has been projected */\n  isProjected = 0x2,\n\n  /** Bit #3 - This bit is set if any directive on this node has content queries */\n  hasContentQuery = 0x4,\n\n  /** Bit #4 - This bit is set if the node has any \"class\" inputs */\n  hasClassInput = 0x8,\n\n  /** Bit #5 - This bit is set if the node has any \"style\" inputs */\n  hasStyleInput = 0x10,\n\n  /** Bit #6 - This bit is set if the node has been detached by i18n */\n  isDetached = 0x20,\n\n  /**\n   * Bit #7 - This bit is set if the node has directives with host bindings.\n   *\n   * This flags allows us to guard host-binding logic and invoke it only on nodes\n   * that actually have directives with host bindings.\n   */\n  hasHostBindings = 0x40,\n\n  /**\n   * Bit #8 - This bit is set if the node is a located inside skip hydration block.\n   */\n  inSkipHydrationBlock = 0x80,\n}\n\n/**\n * Corresponds to the TNode.providerIndexes property.\n */\nexport const enum TNodeProviderIndexes {\n  /** The index of the first provider on this node is encoded on the least significant bits. */\n  ProvidersStartIndexMask = 0b00000000000011111111111111111111,\n\n  /**\n   * The count of view providers from the component on this node is\n   * encoded on the 20 most significant bits.\n   */\n  CptViewProvidersCountShift = 20,\n  CptViewProvidersCountShifter = 0b00000000000100000000000000000000,\n}\n\n/**\n * A combination of:\n * - Attribute names and values.\n * - Special markers acting as flags to alter attributes processing.\n * - Parsed ngProjectAs selectors.\n */\nexport type TAttributes = (string | AttributeMarker | CssSelector)[];\n\n/**\n * Constants that are associated with a view. Includes:\n * - Attribute arrays.\n * - Local definition arrays.\n * - Translated messages (i18n).\n */\nexport type TConstants = (TAttributes | string)[];\n\n/**\n * Factory function that returns an array of consts. Consts can be represented as a function in\n * case any additional statements are required to define consts in the list. An example is i18n\n * where additional i18n calls are generated, which should be executed when consts are requested\n * for the first time.\n */\nexport type TConstantsFactory = () => TConstants;\n\n/**\n * TConstants type that describes how the `consts` field is generated on ComponentDef: it can be\n * either an array or a factory function that returns that array.\n */\nexport type TConstantsOrFactory = TConstants | TConstantsFactory;\n\n/**\n * Binding data (flyweight) for a particular node that is shared between all templates\n * of a specific type.\n *\n * If a property is:\n *    - PropertyAliases: that property's data was generated and this is it\n *    - Null: that property's data was already generated and nothing was found.\n *    - Undefined: that property's data has not yet been generated\n *\n * see: https://en.wikipedia.org/wiki/Flyweight_pattern for more on the Flyweight pattern\n */\nexport interface TNode {\n  /** The type of the TNode. See TNodeType. */\n  type: TNodeType;\n\n  /**\n   * Index of the TNode in TView.data and corresponding native element in LView.\n   *\n   * This is necessary to get from any TNode to its corresponding native element when\n   * traversing the node tree.\n   *\n   * If index is -1, this is a dynamically created container node or embedded view node.\n   */\n  index: number;\n\n  /**\n   * Insert before existing DOM node index.\n   *\n   * When DOM nodes are being inserted, normally they are being appended as they are created.\n   * Under i18n case, the translated text nodes are created ahead of time as part of the\n   * `ɵɵi18nStart` instruction which means that this `TNode` can't just be appended and instead\n   * needs to be inserted using `insertBeforeIndex` semantics.\n   *\n   * Additionally sometimes it is necessary to insert new text nodes as a child of this `TNode`. In\n   * such a case the value stores an array of text nodes to insert.\n   *\n   * Example:\n   * ```html\n   * <div i18n>\n   *   Hello <span>World</span>!\n   * </div>\n   * ```\n   * In the above example the `ɵɵi18nStart` instruction can create `Hello `, `World` and `!` text\n   * nodes. It can also insert `Hello ` and `!` text node as a child of `<div>`, but it can't\n   * insert `World` because the `<span>` node has not yet been created. In such a case the\n   * `<span>` `TNode` will have an array which will direct the `<span>` to not only insert\n   * itself in front of `!` but also to insert the `World` (created by `ɵɵi18nStart`) into\n   * `<span>` itself.\n   *\n   * Pseudo code:\n   * ```ts\n   *   if (insertBeforeIndex === null) {\n   *     // append as normal\n   *   } else if (Array.isArray(insertBeforeIndex)) {\n   *     // First insert current `TNode` at correct location\n   *     const currentNode = lView[this.index];\n   *     parentNode.insertBefore(currentNode, lView[this.insertBeforeIndex[0]]);\n   *     // Now append all of the children\n   *     for(let i=1; i<this.insertBeforeIndex; i++) {\n   *       currentNode.appendChild(lView[this.insertBeforeIndex[i]]);\n   *     }\n   *   } else {\n   *     parentNode.insertBefore(lView[this.index], lView[this.insertBeforeIndex])\n   *   }\n   * ```\n   * - null: Append as normal using `parentNode.appendChild`\n   * - `number`: Append using\n   *      `parentNode.insertBefore(lView[this.index], lView[this.insertBeforeIndex])`\n   *\n   * *Initialization*\n   *\n   * Because `ɵɵi18nStart` executes before nodes are created, on `TView.firstCreatePass` it is not\n   * possible for `ɵɵi18nStart` to set the `insertBeforeIndex` value as the corresponding `TNode`\n   * has not yet been created. For this reason the `ɵɵi18nStart` creates a `TNodeType.Placeholder`\n   * `TNode` at that location. See `TNodeType.Placeholder` for more information.\n   */\n  insertBeforeIndex: InsertBeforeIndex;\n\n  /**\n   * The index of the closest injector in this node's LView.\n   *\n   * If the index === -1, there is no injector on this node or any ancestor node in this view.\n   *\n   * If the index !== -1, it is the index of this node's injector OR the index of a parent\n   * injector in the same view. We pass the parent injector index down the node tree of a view so\n   * it's possible to find the parent injector without walking a potentially deep node tree.\n   * Injector indices are not set across view boundaries because there could be multiple component\n   * hosts.\n   *\n   * If tNode.injectorIndex === tNode.parent.injectorIndex, then the index belongs to a parent\n   * injector.\n   */\n  injectorIndex: number;\n\n  /** Stores starting index of the directives. */\n  directiveStart: number;\n\n  /**\n   * Stores final exclusive index of the directives.\n   *\n   * The area right behind the `directiveStart-directiveEnd` range is used to allocate the\n   * `HostBindingFunction` `vars` (or null if no bindings.) Therefore `directiveEnd` is used to set\n   * `LFrame.bindingRootIndex` before `HostBindingFunction` is executed.\n   */\n  directiveEnd: number;\n\n  /**\n   * Offset from the `directiveStart` at which the component (one at most) of the node is stored.\n   * Set to -1 if no components have been applied to the node. Component index can be found using\n   * `directiveStart + componentOffset`.\n   */\n  componentOffset: number;\n\n  /**\n   * Stores the last directive which had a styling instruction.\n   *\n   * Initial value of this is `-1` which means that no `hostBindings` styling instruction has\n   * executed. As `hostBindings` instructions execute they set the value to the index of the\n   * `DirectiveDef` which contained the last `hostBindings` styling instruction.\n   *\n   * Valid values are:\n   * - `-1` No `hostBindings` instruction has executed.\n   * - `directiveStart <= directiveStylingLast < directiveEnd`: Points to the `DirectiveDef` of\n   * the last styling instruction which executed in the `hostBindings`.\n   *\n   * This data is needed so that styling instructions know which static styling data needs to be\n   * collected from the `DirectiveDef.hostAttrs`. A styling instruction needs to collect all data\n   * since last styling instruction.\n   */\n  directiveStylingLast: number;\n\n  /**\n   * Stores indexes of property bindings. This field is only set in the ngDevMode and holds\n   * indexes of property bindings so TestBed can get bound property metadata for a given node.\n   */\n  propertyBindings: number[] | null;\n\n  /**\n   * Stores if Node isComponent, isProjected, hasContentQuery, hasClassInput and hasStyleInput\n   * etc.\n   */\n  flags: TNodeFlags;\n\n  /**\n   * This number stores two values using its bits:\n   *\n   * - the index of the first provider on that node (first 16 bits)\n   * - the count of view providers from the component on this node (last 16 bits)\n   */\n  // TODO(misko): break this into actual vars.\n  providerIndexes: TNodeProviderIndexes;\n\n  /**\n   * The value name associated with this node.\n   * if type:\n   *   `TNodeType.Text`: text value\n   *   `TNodeType.Element`: tag name\n   *   `TNodeType.ICUContainer`: `TIcu`\n   */\n  value: any;\n\n  /**\n   * Attributes associated with an element. We need to store attributes to support various\n   * use-cases (attribute injection, content projection with selectors, directives matching).\n   * Attributes are stored statically because reading them from the DOM would be way too slow for\n   * content projection and queries.\n   *\n   * Since attrs will always be calculated first, they will never need to be marked undefined by\n   * other instructions.\n   *\n   * For regular attributes a name of an attribute and its value alternate in the array.\n   * e.g. ['role', 'checkbox']\n   * This array can contain flags that will indicate \"special attributes\" (attributes with\n   * namespaces, attributes extracted from bindings and outputs).\n   */\n  attrs: TAttributes | null;\n\n  /**\n   * Same as `TNode.attrs` but contains merged data across all directive host bindings.\n   *\n   * We need to keep `attrs` as unmerged so that it can be used for attribute selectors.\n   * We merge attrs here so that it can be used in a performant way for initial rendering.\n   *\n   * The `attrs` are merged in first pass in following order:\n   * - Component's `hostAttrs`\n   * - Directives' `hostAttrs`\n   * - Template `TNode.attrs` associated with the current `TNode`.\n   */\n  mergedAttrs: TAttributes | null;\n\n  /**\n   * A set of local names under which a given element is exported in a template and\n   * visible to queries. An entry in this array can be created for different reasons:\n   * - an element itself is referenced, ex.: `<div #foo>`\n   * - a component is referenced, ex.: `<my-cmpt #foo>`\n   * - a directive is referenced, ex.: `<my-cmpt #foo=\"directiveExportAs\">`.\n   *\n   * A given element might have different local names and those names can be associated\n   * with a directive. We store local names at even indexes while odd indexes are reserved\n   * for directive index in a view (or `-1` if there is no associated directive).\n   *\n   * Some examples:\n   * - `<div #foo>` => `[\"foo\", -1]`\n   * - `<my-cmpt #foo>` => `[\"foo\", myCmptIdx]`\n   * - `<my-cmpt #foo #bar=\"directiveExportAs\">` => `[\"foo\", myCmptIdx, \"bar\", directiveIdx]`\n   * - `<div #foo #bar=\"directiveExportAs\">` => `[\"foo\", -1, \"bar\", directiveIdx]`\n   */\n  localNames: (string | number)[] | null;\n\n  /** Information about input properties that need to be set once from attribute data. */\n  initialInputs: InitialInputData | null;\n\n  /**\n   * Input data for all directives on this node. `null` means that there are no directives with\n   * inputs on this node.\n   */\n  inputs: NodeInputBindings | null;\n\n  /**\n   * Input data for host directives applied to the node.\n   */\n  hostDirectiveInputs: HostDirectiveInputs | null;\n\n  /**\n   * Output data for all directives on this node. `null` means that there are no directives with\n   * outputs on this node.\n   */\n  outputs: NodeOutputBindings | null;\n\n  /**\n   * Input data for host directives applied to the node.\n   */\n  hostDirectiveOutputs: HostDirectiveOutputs | null;\n\n  /**\n   * Mapping between directive classes applied to the node and their indexes.\n   */\n  directiveToIndex: DirectiveIndexMap | null;\n\n  /**\n   * The TView attached to this node.\n   *\n   * If this TNode corresponds to an LContainer with a template (e.g. structural\n   * directive), the template's TView will be stored here.\n   *\n   * If this TNode corresponds to an element, tView will be `null`.\n   */\n  tView: TView | null;\n\n  /**\n   * The next sibling node. Necessary so we can propagate through the root nodes of a view\n   * to insert them or remove them from the DOM.\n   */\n  next: TNode | null;\n\n  /**\n   * The previous sibling node.\n   * This simplifies operations when we need a pointer to the previous node.\n   */\n  prev: TNode | null;\n\n  /**\n   * The next projected sibling. Since in Angular content projection works on the node-by-node\n   * basis the act of projecting nodes might change nodes relationship at the insertion point\n   * (target view). At the same time we need to keep initial relationship between nodes as\n   * expressed in content view.\n   */\n  projectionNext: TNode | null;\n\n  /**\n   * First child of the current node.\n   *\n   * For component nodes, the child will always be a ContentChild (in same view).\n   * For embedded view nodes, the child will be in their child view.\n   */\n  child: TNode | null;\n\n  /**\n   * Parent node (in the same view only).\n   *\n   * We need a reference to a node's parent so we can append the node to its parent's native\n   * element at the appropriate time.\n   *\n   * If the parent would be in a different view (e.g. component host), this property will be null.\n   * It's important that we don't try to cross component boundaries when retrieving the parent\n   * because the parent will change (e.g. index, attrs) depending on where the component was\n   * used (and thus shouldn't be stored on TNode). In these cases, we retrieve the parent through\n   * LView.node instead (which will be instance-specific).\n   *\n   * If this is an inline view node (V), the parent will be its container.\n   */\n  parent: TElementNode | TContainerNode | null;\n\n  /**\n   * List of projected TNodes for a given component host element OR index into the said nodes.\n   *\n   * For easier discussion assume this example:\n   * `<parent>`'s view definition:\n   * ```html\n   * <child id=\"c1\">content1</child>\n   * <child id=\"c2\"><span>content2</span></child>\n   * ```\n   * `<child>`'s view definition:\n   * ```html\n   * <ng-content id=\"cont1\"></ng-content>\n   * ```\n   *\n   * If `Array.isArray(projection)` then `TNode` is a host element:\n   * - `projection` stores the content nodes which are to be projected.\n   *    - The nodes represent categories defined by the selector: For example:\n   *      `<ng-content/><ng-content select=\"abc\"/>` would represent the heads for `<ng-content/>`\n   *      and `<ng-content select=\"abc\"/>` respectively.\n   *    - The nodes we store in `projection` are heads only, we used `.next` to get their\n   *      siblings.\n   *    - The nodes `.next` is sorted/rewritten as part of the projection setup.\n   *    - `projection` size is equal to the number of projections `<ng-content>`. The size of\n   *      `c1` will be `1` because `<child>` has only one `<ng-content>`.\n   * - we store `projection` with the host (`c1`, `c2`) rather than the `<ng-content>` (`cont1`)\n   *   because the same component (`<child>`) can be used in multiple locations (`c1`, `c2`) and\n   * as a result have different set of nodes to project.\n   * - without `projection` it would be difficult to efficiently traverse nodes to be projected.\n   *\n   * If `typeof projection == 'number'` then `TNode` is a `<ng-content>` element:\n   * - `projection` is an index of the host's `projection`Nodes.\n   *   - This would return the first head node to project:\n   *     `getHost(currentTNode).projection[currentTNode.projection]`.\n   * - When projecting nodes the parent node retrieved may be a `<ng-content>` node, in which case\n   *   the process is recursive in nature.\n   *\n   * If `projection` is of type `RNode[][]` than we have a collection of native nodes passed as\n   * projectable nodes during dynamic component creation.\n   */\n  projection: (TNode | RNode[])[] | number | null;\n\n  /**\n   * A collection of all `style` static values for an element (including from host).\n   *\n   * This field will be populated if and when:\n   *\n   * - There are one or more initial `style`s on an element (e.g. `<div style=\"width:200px;\">`)\n   * - There are one or more initial `style`s on a directive/component host\n   *   (e.g. `@Directive({host: {style: \"width:200px;\" } }`)\n   */\n  styles: string | null;\n\n  /**\n   * A collection of all `style` static values for an element excluding host sources.\n   *\n   * Populated when there are one or more initial `style`s on an element\n   * (e.g. `<div style=\"width:200px;\">`)\n   * Must be stored separately from `tNode.styles` to facilitate setting directive\n   * inputs that shadow the `style` property. If we used `tNode.styles` as is for shadowed inputs,\n   * we would feed host styles back into directives as \"inputs\". If we used `tNode.attrs`, we\n   * would have to concatenate the attributes on every template pass. Instead, we process once on\n   * first create pass and store here.\n   */\n  stylesWithoutHost: string | null;\n\n  /**\n   * A `KeyValueArray` version of residual `styles`.\n   *\n   * When there are styling instructions than each instruction stores the static styling\n   * which is of lower priority than itself. This means that there may be a higher priority\n   * styling than the instruction.\n   *\n   * Imagine:\n   * ```angular-ts\n   * <div style=\"color: highest;\" my-dir>\n   *\n   * @Directive({\n   *   host: {\n   *     style: 'color: lowest; ',\n   *     '[styles.color]': 'exp' // ɵɵstyleProp('color', ctx.exp);\n   *   }\n   * })\n   * ```\n   *\n   * In the above case:\n   * - `color: lowest` is stored with `ɵɵstyleProp('color', ctx.exp);` instruction\n   * -  `color: highest` is the residual and is stored here.\n   *\n   * - `undefined': not initialized.\n   * - `null`: initialized but `styles` is `null`\n   * - `KeyValueArray`: parsed version of `styles`.\n   */\n  residualStyles: KeyValueArray<any> | undefined | null;\n\n  /**\n   * A collection of all class static values for an element (including from host).\n   *\n   * This field will be populated if and when:\n   *\n   * - There are one or more initial classes on an element (e.g. `<div class=\"one two three\">`)\n   * - There are one or more initial classes on an directive/component host\n   *   (e.g. `@Directive({host: {class: \"SOME_CLASS\" } }`)\n   */\n  classes: string | null;\n\n  /**\n   * A collection of all class static values for an element excluding host sources.\n   *\n   * Populated when there are one or more initial classes on an element\n   * (e.g. `<div class=\"SOME_CLASS\">`)\n   * Must be stored separately from `tNode.classes` to facilitate setting directive\n   * inputs that shadow the `class` property. If we used `tNode.classes` as is for shadowed\n   * inputs, we would feed host classes back into directives as \"inputs\". If we used\n   * `tNode.attrs`, we would have to concatenate the attributes on every template pass. Instead,\n   * we process once on first create pass and store here.\n   */\n  classesWithoutHost: string | null;\n\n  /**\n   * A `KeyValueArray` version of residual `classes`.\n   *\n   * Same as `TNode.residualStyles` but for classes.\n   *\n   * - `undefined': not initialized.\n   * - `null`: initialized but `classes` is `null`\n   * - `KeyValueArray`: parsed version of `classes`.\n   */\n  residualClasses: KeyValueArray<any> | undefined | null;\n\n  /**\n   * Stores the head/tail index of the class bindings.\n   *\n   * - If no bindings, the head and tail will both be 0.\n   * - If there are template bindings, stores the head/tail of the class bindings in the template.\n   * - If no template bindings but there are host bindings, the head value will point to the last\n   *   host binding for \"class\" (not the head of the linked list), tail will be 0.\n   *\n   * See: `style_binding_list.ts` for details.\n   *\n   * This is used by `insertTStylingBinding` to know where the next styling binding should be\n   * inserted so that they can be sorted in priority order.\n   */\n  classBindings: TStylingRange;\n\n  /**\n   * Stores the head/tail index of the class bindings.\n   *\n   * - If no bindings, the head and tail will both be 0.\n   * - If there are template bindings, stores the head/tail of the style bindings in the template.\n   * - If no template bindings but there are host bindings, the head value will point to the last\n   *   host binding for \"style\" (not the head of the linked list), tail will be 0.\n   *\n   * See: `style_binding_list.ts` for details.\n   *\n   * This is used by `insertTStylingBinding` to know where the next styling binding should be\n   * inserted so that they can be sorted in priority order.\n   */\n  styleBindings: TStylingRange;\n}\n\n/**\n * See `TNode.insertBeforeIndex`\n */\nexport type InsertBeforeIndex = null | number | number[];\n\n/** Static data for an element  */\nexport interface TElementNode extends TNode {\n  /** Index in the data[] array */\n  index: number;\n  child: TElementNode | TTextNode | TElementContainerNode | TContainerNode | TProjectionNode | null;\n  /**\n   * Element nodes will have parents unless they are the first node of a component or\n   * embedded view (which means their parent is in a different view and must be\n   * retrieved using viewData[HOST_NODE]).\n   */\n  parent: TElementNode | TElementContainerNode | null;\n  tView: null;\n\n  /**\n   * If this is a component TNode with projection, this will be an array of projected\n   * TNodes or native nodes (see TNode.projection for more info). If it's a regular element node\n   * or a component without projection, it will be null.\n   */\n  projection: (TNode | RNode[])[] | null;\n\n  /**\n   * Stores TagName\n   */\n  value: string;\n}\n\n/** Static data for a text node */\nexport interface TTextNode extends TNode {\n  /** Index in the data[] array */\n  index: number;\n  child: null;\n  /**\n   * Text nodes will have parents unless they are the first node of a component or\n   * embedded view (which means their parent is in a different view and must be\n   * retrieved using LView.node).\n   */\n  parent: TElementNode | TElementContainerNode | null;\n  tView: null;\n  projection: null;\n}\n\n/** Static data for an LContainer */\nexport interface TContainerNode extends TNode {\n  /**\n   * Index in the data[] array.\n   *\n   * If it's -1, this is a dynamically created container node that isn't stored in\n   * data[] (e.g. when you inject ViewContainerRef) .\n   */\n  index: number;\n  child: null;\n\n  /**\n   * Container nodes will have parents unless:\n   *\n   * - They are the first node of a component or embedded view\n   * - They are dynamically created\n   */\n  parent: TElementNode | TElementContainerNode | null;\n  tView: TView | null;\n  projection: null;\n  value: null;\n}\n\n/** Static data for an <ng-container> */\nexport interface TElementContainerNode extends TNode {\n  /** Index in the LView[] array. */\n  index: number;\n  child: TElementNode | TTextNode | TContainerNode | TElementContainerNode | TProjectionNode | null;\n  parent: TElementNode | TElementContainerNode | null;\n  tView: null;\n  projection: null;\n}\n\n/** Static data for an ICU expression */\nexport interface TIcuContainerNode extends TNode {\n  /** Index in the LView[] array. */\n  index: number;\n  child: null;\n  parent: TElementNode | TElementContainerNode | null;\n  tView: null;\n  projection: null;\n  value: TIcu;\n}\n\n/** Static data for an LProjectionNode  */\nexport interface TProjectionNode extends TNode {\n  /** Index in the data[] array */\n  child: null;\n  /**\n   * Projection nodes will have parents unless they are the first node of a component\n   * or embedded view (which means their parent is in a different view and must be\n   * retrieved using LView.node).\n   */\n  parent: TElementNode | TElementContainerNode | null;\n  tView: null;\n\n  /** Index of the projection node. (See TNode.projection for more info.) */\n  projection: number;\n  value: null;\n}\n\n/**\n * Static data for a `@let` declaration. This node is necessary, because the expression of a\n * `@let` declaration can contain code that uses the node injector (e.g. pipes). In order for\n * the node injector to work, it needs this `TNode`.\n */\nexport interface TLetDeclarationNode extends TNode {\n  index: number;\n  child: null;\n  parent: TElementNode | TElementContainerNode | null;\n  tView: null;\n  projection: null;\n  value: null; // TODO(crisbeto): capture the name here? Might come in handy for the dev tools.\n}\n\n/**\n * A union type representing all TNode types that can host a directive.\n */\nexport type TDirectiveHostNode = TElementNode | TContainerNode | TElementContainerNode;\n\n/**\n * Maps the public names of outputs available on a specific node to the index\n * of the directive instance that defines the output, for example:\n *\n * ```\n * {\n *   \"publicName\": [0, 5]\n * }\n * ```\n */\nexport type NodeOutputBindings = Record<string, number[]>;\n\n/**\n * Maps the public names of inputs applied to a specific node to the index of the\n * directive instance to which the input value should be written, for example:\n *\n * ```\n * {\n *   \"publicName\": [0, 5]\n * }\n * ```\n */\nexport type NodeInputBindings = Record<string, number[]>;\n\n/**\n * This array contains information about input properties that\n * need to be set once from attribute data. It's ordered by\n * directive index (relative to element) so it's simple to\n * look up a specific directive's initial input data.\n *\n * Within each sub-array:\n *\n * i+0: public name\n * i+1: initial value\n *\n * If a directive on a node does not have any input properties\n * that should be set from attributes, its index is set to null\n * to avoid a sparse array.\n *\n * e.g. [null, ['role-min', 'minified-input', 'button']]\n */\nexport type InitialInputData = (InitialInputs | null)[];\n\n/**\n * Used by InitialInputData to store input properties\n * that should be set once from attributes.\n *\n * i+0: attribute name\n * i+1: minified/internal input name\n * i+2: input flags\n * i+3: initial value\n *\n * e.g. ['role-min', 'minified-input', 'button']\n */\nexport type InitialInputs = string[];\n\n/**\n * Represents inputs coming from a host directive and exposed on a TNode.\n *\n * - The key is the public name of an input as it is exposed on the specific node.\n * - The value is an array where:\n *   - i+0: Index of the host directive that should be written to.\n *   - i+1: Public name of the input as it was defined on the host directive before aliasing.\n */\nexport type HostDirectiveInputs = Record<string, (number | string)[]>;\n\n/**\n * Represents outputs coming from a host directive and exposed on a TNode.\n *\n * - The key is the public name of an output as it is exposed on the specific node.\n * - The value is an array where:\n *   - i+0: Index of the host directive on which the output is defined..\n *   - i+1: Public name of the output as it was defined on the host directive before aliasing.\n */\nexport type HostDirectiveOutputs = Record<string, (number | string)[]>;\n\n/**\n * Represents a map between a class reference and the index at which its directive is available on\n * a specific TNode. The value can be either:\n *   1. A number means that there's only one selector-matched directive on the node and it\n *      doesn't have any host directives.\n *   2. An array means that there's a selector-matched directive and it has host directives.\n *      The array is structured as follows:\n *        - 0: Index of the selector-matched directive.\n *        - 1: Start index of the range within which the host directives are defined.\n *        - 2: End of the host directive range.\n *\n * Example:\n * ```\n * Map {\n *   [NoHostDirectives]: 5,\n *   [HasHostDirectives]: [10, 6, 8],\n * }\n * ```\n */\nexport type DirectiveIndexMap = Map<\n  Type<unknown>,\n  number | [directiveIndex: number, hostDirectivesStart: number, hostDirectivesEnd: number]\n>;\n\n/**\n * Type representing a set of TNodes that can have local refs (`#foo`) placed on them.\n */\nexport type TNodeWithLocalRefs = TContainerNode | TElementNode | TElementContainerNode;\n\n/**\n * Type for a function that extracts a value for a local refs.\n * Example:\n * - `<div #nativeDivEl>` - `nativeDivEl` should point to the native `<div>` element;\n * - `<ng-template #tplRef>` - `tplRef` should point to the `TemplateRef` instance;\n */\nexport type LocalRefExtractor = (tNode: TNodeWithLocalRefs, currentView: LView) => any;\n\n/**\n * Returns `true` if the `TNode` has a directive which has `@Input()` for `class` binding.\n *\n * ```html\n * <div my-dir [class]=\"exp\"></div>\n * ```\n * and\n * ```ts\n * @Directive({\n * })\n * class MyDirective {\n *   @Input()\n *   class: string;\n * }\n * ```\n *\n * In the above case it is necessary to write the reconciled styling information into the\n * directive's input.\n *\n * @param tNode\n */\nexport function hasClassInput(tNode: TNode) {\n  return (tNode.flags & TNodeFlags.hasClassInput) !== 0;\n}\n\n/**\n * Returns `true` if the `TNode` has a directive which has `@Input()` for `style` binding.\n *\n * ```html\n * <div my-dir [style]=\"exp\"></div>\n * ```\n * and\n * ```ts\n * @Directive({\n * })\n * class MyDirective {\n *   @Input()\n *   class: string;\n * }\n * ```\n *\n * In the above case it is necessary to write the reconciled styling information into the\n * directive's input.\n *\n * @param tNode\n */\nexport function hasStyleInput(tNode: TNode) {\n  return (tNode.flags & TNodeFlags.hasStyleInput) !== 0;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertDefined, throwError} from '../util/assert';\nimport {TNode, TNodeType, toTNodeTypeAsString} from './interfaces/node';\n\nexport function assertTNodeType(\n  tNode: TNode | null,\n  expectedTypes: TNodeType,\n  message?: string,\n): void {\n  assertDefined(tNode, 'should be called with a TNode');\n  if ((tNode.type & expectedTypes) === 0) {\n    throwError(\n      message ||\n        `Expected [${toTNodeTypeAsString(expectedTypes)}] but got ${toTNodeTypeAsString(\n          tNode.type,\n        )}.`,\n    );\n  }\n}\n\nexport function assertPureTNodeType(type: TNodeType) {\n  if (\n    !(\n      type === TNodeType.Element ||\n      type === TNodeType.Text ||\n      type === TNodeType.Container ||\n      type === TNodeType.ElementContainer ||\n      type === TNodeType.Icu ||\n      type === TNodeType.Projection ||\n      type === TNodeType.Placeholder ||\n      type === TNodeType.LetDeclaration\n    )\n  ) {\n    throwError(\n      `Expected TNodeType to have only a single type selected, but got ${toTNodeTypeAsString(\n        type,\n      )}.`,\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {CharCode} from '../../util/char_code';\nimport {AttributeMarker} from '../interfaces/attribute_marker';\nimport {TAttributes} from '../interfaces/node';\nimport {CssSelector} from '../interfaces/projection';\nimport {Renderer} from '../interfaces/renderer';\nimport {RElement} from '../interfaces/renderer_dom';\n\n/**\n * Assigns all attribute values to the provided element via the inferred renderer.\n *\n * This function accepts two forms of attribute entries:\n *\n * default: (key, value):\n *  attrs = [key1, value1, key2, value2]\n *\n * namespaced: (NAMESPACE_MARKER, uri, name, value)\n *  attrs = [NAMESPACE_MARKER, uri, name, value, NAMESPACE_MARKER, uri, name, value]\n *\n * The `attrs` array can contain a mix of both the default and namespaced entries.\n * The \"default\" values are set without a marker, but if the function comes across\n * a marker value then it will attempt to set a namespaced value. If the marker is\n * not of a namespaced value then the function will quit and return the index value\n * where it stopped during the iteration of the attrs array.\n *\n * See [AttributeMarker] to understand what the namespace marker value is.\n *\n * Note that this instruction does not support assigning style and class values to\n * an element. See `elementStart` and `elementHostAttrs` to learn how styling values\n * are applied to an element.\n * @param renderer The renderer to be used\n * @param native The element that the attributes will be assigned to\n * @param attrs The attribute array of values that will be assigned to the element\n * @returns the index value that was last accessed in the attributes array\n */\nexport function setUpAttributes(renderer: Renderer, native: RElement, attrs: TAttributes): number {\n  let i = 0;\n  while (i < attrs.length) {\n    const value = attrs[i];\n    if (typeof value === 'number') {\n      // only namespaces are supported. Other value types (such as style/class\n      // entries) are not supported in this function.\n      if (value !== AttributeMarker.NamespaceURI) {\n        break;\n      }\n\n      // we just landed on the marker value ... therefore\n      // we should skip to the next entry\n      i++;\n\n      const namespaceURI = attrs[i++] as string;\n      const attrName = attrs[i++] as string;\n      const attrVal = attrs[i++] as string;\n      ngDevMode && ngDevMode.rendererSetAttribute++;\n      renderer.setAttribute(native, attrName, attrVal, namespaceURI);\n    } else {\n      // attrName is string;\n      const attrName = value as string;\n      const attrVal = attrs[++i];\n      // Standard attributes\n      ngDevMode && ngDevMode.rendererSetAttribute++;\n      if (isAnimationProp(attrName)) {\n        renderer.setProperty(native, attrName, attrVal);\n      } else {\n        renderer.setAttribute(native, attrName, attrVal as string);\n      }\n      i++;\n    }\n  }\n\n  // another piece of code may iterate over the same attributes array. Therefore\n  // it may be helpful to return the exact spot where the attributes array exited\n  // whether by running into an unsupported marker or if all the static values were\n  // iterated over.\n  return i;\n}\n\n/**\n * Test whether the given value is a marker that indicates that the following\n * attribute values in a `TAttributes` array are only the names of attributes,\n * and not name-value pairs.\n * @param marker The attribute marker to test.\n * @returns true if the marker is a \"name-only\" marker (e.g. `Bindings`, `Template` or `I18n`).\n */\nexport function isNameOnlyAttributeMarker(marker: string | AttributeMarker | CssSelector) {\n  return (\n    marker === AttributeMarker.Bindings ||\n    marker === AttributeMarker.Template ||\n    marker === AttributeMarker.I18n\n  );\n}\n\nexport function isAnimationProp(name: string): boolean {\n  // Perf note: accessing charCodeAt to check for the first character of a string is faster as\n  // compared to accessing a character at index 0 (ex. name[0]). The main reason for this is that\n  // charCodeAt doesn't allocate memory to return a substring.\n  return name.charCodeAt(0) === CharCode.AT_SIGN;\n}\n\n/**\n * Merges `src` `TAttributes` into `dst` `TAttributes` removing any duplicates in the process.\n *\n * This merge function keeps the order of attrs same.\n *\n * @param dst Location of where the merged `TAttributes` should end up.\n * @param src `TAttributes` which should be appended to `dst`\n */\nexport function mergeHostAttrs(\n  dst: TAttributes | null,\n  src: TAttributes | null,\n): TAttributes | null {\n  if (src === null || src.length === 0) {\n    // do nothing\n  } else if (dst === null || dst.length === 0) {\n    // We have source, but dst is empty, just make a copy.\n    dst = src.slice();\n  } else {\n    let srcMarker: AttributeMarker = AttributeMarker.ImplicitAttributes;\n    for (let i = 0; i < src.length; i++) {\n      const item = src[i];\n      if (typeof item === 'number') {\n        srcMarker = item;\n      } else {\n        if (srcMarker === AttributeMarker.NamespaceURI) {\n          // Case where we need to consume `key1`, `key2`, `value` items.\n        } else if (\n          srcMarker === AttributeMarker.ImplicitAttributes ||\n          srcMarker === AttributeMarker.Styles\n        ) {\n          // Case where we have to consume `key1` and `value` only.\n          mergeHostAttribute(dst, srcMarker, item as string, null, src[++i] as string);\n        } else {\n          // C   ase where we have to consume `key1` only.\n          mergeHostAttribute(dst, srcMarker, item as string, null, null);\n        }\n      }\n    }\n  }\n  return dst;\n}\n\n/**\n * Append `key`/`value` to existing `TAttributes` taking region marker and duplicates into account.\n *\n * @param dst `TAttributes` to append to.\n * @param marker Region where the `key`/`value` should be added.\n * @param key1 Key to add to `TAttributes`\n * @param key2 Key to add to `TAttributes` (in case of `AttributeMarker.NamespaceURI`)\n * @param value Value to add or to overwrite to `TAttributes` Only used if `marker` is not Class.\n */\nexport function mergeHostAttribute(\n  dst: TAttributes,\n  marker: AttributeMarker,\n  key1: string,\n  key2: string | null,\n  value: string | null,\n): void {\n  let i = 0;\n  // Assume that new markers will be inserted at the end.\n  let markerInsertPosition = dst.length;\n  // scan until correct type.\n  if (marker === AttributeMarker.ImplicitAttributes) {\n    markerInsertPosition = -1;\n  } else {\n    while (i < dst.length) {\n      const dstValue = dst[i++];\n      if (typeof dstValue === 'number') {\n        if (dstValue === marker) {\n          markerInsertPosition = -1;\n          break;\n        } else if (dstValue > marker) {\n          // We need to save this as we want the markers to be inserted in specific order.\n          markerInsertPosition = i - 1;\n          break;\n        }\n      }\n    }\n  }\n\n  // search until you find place of insertion\n  while (i < dst.length) {\n    const item = dst[i];\n    if (typeof item === 'number') {\n      // since `i` started as the index after the marker, we did not find it if we are at the next\n      // marker\n      break;\n    } else if (item === key1) {\n      // We already have same token\n      if (key2 === null) {\n        if (value !== null) {\n          dst[i + 1] = value;\n        }\n        return;\n      } else if (key2 === dst[i + 1]) {\n        dst[i + 2] = value!;\n        return;\n      }\n    }\n    // Increment counter.\n    i++;\n    if (key2 !== null) i++;\n    if (value !== null) i++;\n  }\n\n  // insert at location.\n  if (markerInsertPosition !== -1) {\n    dst.splice(markerInsertPosition, 0, marker);\n    i = markerInsertPosition + 1;\n  }\n  dst.splice(i++, 0, key1);\n  if (key2 !== null) {\n    dst.splice(i++, 0, key2);\n  }\n  if (value !== null) {\n    dst.splice(i++, 0, value);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {type Injector} from '../../di/injector';\nimport {assertGreaterThan, assertNotEqual, assertNumber} from '../../util/assert';\nimport {ChainedInjector} from '../chained_injector';\nimport {\n  NO_PARENT_INJECTOR,\n  RelativeInjectorLocation,\n  RelativeInjectorLocationFlags,\n} from '../interfaces/injector';\nimport {DECLARATION_VIEW, HEADER_OFFSET, LView} from '../interfaces/view';\n\n/// Parent Injector Utils ///////////////////////////////////////////////////////////////\nexport function hasParentInjector(parentLocation: RelativeInjectorLocation): boolean {\n  return parentLocation !== NO_PARENT_INJECTOR;\n}\n\nexport function getParentInjectorIndex(parentLocation: RelativeInjectorLocation): number {\n  if (ngDevMode) {\n    assertNumber(parentLocation, 'Number expected');\n    assertNotEqual(parentLocation as any, -1, 'Not a valid state.');\n    const parentInjectorIndex = parentLocation & RelativeInjectorLocationFlags.InjectorIndexMask;\n\n    assertGreaterThan(\n      parentInjectorIndex,\n      HEADER_OFFSET,\n      'Parent injector must be pointing past HEADER_OFFSET.',\n    );\n  }\n  return parentLocation & RelativeInjectorLocationFlags.InjectorIndexMask;\n}\n\nexport function getParentInjectorViewOffset(parentLocation: RelativeInjectorLocation): number {\n  return parentLocation >> RelativeInjectorLocationFlags.ViewOffsetShift;\n}\n\n/**\n * Unwraps a parent injector location number to find the view offset from the current injector,\n * then walks up the declaration view tree until the view is found that contains the parent\n * injector.\n *\n * @param location The location of the parent injector, which contains the view offset\n * @param startView The LView instance from which to start walking up the view tree\n * @returns The LView instance that contains the parent injector\n */\nexport function getParentInjectorView(location: RelativeInjectorLocation, startView: LView): LView {\n  let viewOffset = getParentInjectorViewOffset(location);\n  let parentView = startView;\n  // For most cases, the parent injector can be found on the host node (e.g. for component\n  // or container), but we must keep the loop here to support the rarer case of deeply nested\n  // <ng-template> tags or inline views, where the parent injector might live many views\n  // above the child injector.\n  while (viewOffset > 0) {\n    parentView = parentView[DECLARATION_VIEW]!;\n    viewOffset--;\n  }\n  return parentView;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isForwardRef, resolveForwardRef} from '../di/forward_ref';\nimport {injectRootLimpMode, setInjectImplementation} from '../di/inject_switch';\nimport {Injector} from '../di/injector';\nimport {convertToBitFlags} from '../di/injector_compatibility';\nimport {InjectorMarkers} from '../di/injector_marker';\nimport {InjectFlags, InjectOptions} from '../di/interface/injector';\nimport {ProviderToken} from '../di/provider_token';\nimport {Type} from '../interface/type';\nimport {assertDefined, assertEqual, assertIndexInRange} from '../util/assert';\nimport {noSideEffects} from '../util/closure';\n\nimport {assertDirectiveDef, assertNodeInjector, assertTNodeForLView} from './assert';\nimport {\n  emitInstanceCreatedByInjectorEvent,\n  InjectorProfilerContext,\n  runInInjectorProfilerContext,\n  setInjectorProfilerContext,\n} from './debug/injector_profiler';\nimport {getFactoryDef} from './definition_factory';\nimport {throwCyclicDependencyError, throwProviderNotFoundError} from './errors_di';\nimport {NG_ELEMENT_ID, NG_FACTORY_DEF} from './fields';\nimport {registerPreOrderHooks} from './hooks';\nimport {AttributeMarker} from './interfaces/attribute_marker';\nimport {ComponentDef, DirectiveDef} from './interfaces/definition';\nimport {\n  NO_PARENT_INJECTOR,\n  NodeInjectorFactory,\n  NodeInjectorOffset,\n  RelativeInjectorLocation,\n  RelativeInjectorLocationFlags,\n} from './interfaces/injector';\nimport {\n  TContainerNode,\n  TDirectiveHostNode,\n  TElementContainerNode,\n  TElementNode,\n  TNode,\n  TNodeProviderIndexes,\n  TNodeType,\n} from './interfaces/node';\nimport {isComponentDef, isComponentHost, isRootView} from './interfaces/type_checks';\nimport {\n  DECLARATION_COMPONENT_VIEW,\n  DECLARATION_VIEW,\n  EMBEDDED_VIEW_INJECTOR,\n  FLAGS,\n  INJECTOR,\n  LView,\n  LViewFlags,\n  T_HOST,\n  TData,\n  TVIEW,\n  TView,\n  TViewType,\n} from './interfaces/view';\nimport {assertTNodeType} from './node_assert';\nimport {enterDI, getCurrentTNode, getLView, leaveDI} from './state';\nimport {isNameOnlyAttributeMarker} from './util/attrs_utils';\nimport {\n  getParentInjectorIndex,\n  getParentInjectorView,\n  hasParentInjector,\n} from './util/injector_utils';\nimport {stringifyForError} from './util/stringify_utils';\n\n/**\n * Defines if the call to `inject` should include `viewProviders` in its resolution.\n *\n * This is set to true when we try to instantiate a component. This value is reset in\n * `getNodeInjectable` to a value which matches the declaration location of the token about to be\n * instantiated. This is done so that if we are injecting a token which was declared outside of\n * `viewProviders` we don't accidentally pull `viewProviders` in.\n *\n * Example:\n *\n * ```ts\n * @Injectable()\n * class MyService {\n *   constructor(public value: String) {}\n * }\n *\n * @Component({\n *   providers: [\n *     MyService,\n *     {provide: String, value: 'providers' }\n *   ]\n *   viewProviders: [\n *     {provide: String, value: 'viewProviders'}\n *   ]\n * })\n * class MyComponent {\n *   constructor(myService: MyService, value: String) {\n *     // We expect that Component can see into `viewProviders`.\n *     expect(value).toEqual('viewProviders');\n *     // `MyService` was not declared in `viewProviders` hence it can't see it.\n *     expect(myService.value).toEqual('providers');\n *   }\n * }\n *\n * ```\n */\nlet includeViewProviders = true;\n\nexport function setIncludeViewProviders(v: boolean): boolean {\n  const oldValue = includeViewProviders;\n  includeViewProviders = v;\n  return oldValue;\n}\n\n/**\n * The number of slots in each bloom filter (used by DI). The larger this number, the fewer\n * directives that will share slots, and thus, the fewer false positives when checking for\n * the existence of a directive.\n */\nconst BLOOM_SIZE = 256;\nconst BLOOM_MASK = BLOOM_SIZE - 1;\n\n/**\n * The number of bits that is represented by a single bloom bucket. JS bit operations are 32 bits,\n * so each bucket represents 32 distinct tokens which accounts for log2(32) = 5 bits of a bloom hash\n * number.\n */\nconst BLOOM_BUCKET_BITS = 5;\n\n/** Counter used to generate unique IDs for directives. */\nlet nextNgElementId = 0;\n\n/** Value used when something wasn't found by an injector. */\nconst NOT_FOUND = {};\n\n/**\n * Registers this directive as present in its node's injector by flipping the directive's\n * corresponding bit in the injector's bloom filter.\n *\n * @param injectorIndex The index of the node injector where this token should be registered\n * @param tView The TView for the injector's bloom filters\n * @param type The directive token to register\n */\nexport function bloomAdd(\n  injectorIndex: number,\n  tView: TView,\n  type: ProviderToken<any> | string,\n): void {\n  ngDevMode && assertEqual(tView.firstCreatePass, true, 'expected firstCreatePass to be true');\n  let id: number | undefined;\n  if (typeof type === 'string') {\n    id = type.charCodeAt(0) || 0;\n  } else if (type.hasOwnProperty(NG_ELEMENT_ID)) {\n    id = (type as any)[NG_ELEMENT_ID];\n  }\n\n  // Set a unique ID on the directive type, so if something tries to inject the directive,\n  // we can easily retrieve the ID and hash it into the bloom bit that should be checked.\n  if (id == null) {\n    id = (type as any)[NG_ELEMENT_ID] = nextNgElementId++;\n  }\n\n  // We only have BLOOM_SIZE (256) slots in our bloom filter (8 buckets * 32 bits each),\n  // so all unique IDs must be modulo-ed into a number from 0 - 255 to fit into the filter.\n  const bloomHash = id & BLOOM_MASK;\n\n  // Create a mask that targets the specific bit associated with the directive.\n  // JS bit operations are 32 bits, so this will be a number between 2^0 and 2^31, corresponding\n  // to bit positions 0 - 31 in a 32 bit integer.\n  const mask = 1 << bloomHash;\n\n  // Each bloom bucket in `tData` represents `BLOOM_BUCKET_BITS` number of bits of `bloomHash`.\n  // Any bits in `bloomHash` beyond `BLOOM_BUCKET_BITS` indicate the bucket offset that the mask\n  // should be written to.\n  (tView.data as number[])[injectorIndex + (bloomHash >> BLOOM_BUCKET_BITS)] |= mask;\n}\n\n/**\n * Creates (or gets an existing) injector for a given element or container.\n *\n * @param tNode for which an injector should be retrieved / created.\n * @param lView View where the node is stored\n * @returns Node injector\n */\nexport function getOrCreateNodeInjectorForNode(\n  tNode: TElementNode | TContainerNode | TElementContainerNode,\n  lView: LView,\n): number {\n  const existingInjectorIndex = getInjectorIndex(tNode, lView);\n  if (existingInjectorIndex !== -1) {\n    return existingInjectorIndex;\n  }\n\n  const tView = lView[TVIEW];\n  if (tView.firstCreatePass) {\n    tNode.injectorIndex = lView.length;\n    insertBloom(tView.data, tNode); // foundation for node bloom\n    insertBloom(lView, null); // foundation for cumulative bloom\n    insertBloom(tView.blueprint, null);\n  }\n\n  const parentLoc = getParentInjectorLocation(tNode, lView);\n  const injectorIndex = tNode.injectorIndex;\n\n  // If a parent injector can't be found, its location is set to -1.\n  // In that case, we don't need to set up a cumulative bloom\n  if (hasParentInjector(parentLoc)) {\n    const parentIndex = getParentInjectorIndex(parentLoc);\n    const parentLView = getParentInjectorView(parentLoc, lView);\n    const parentData = parentLView[TVIEW].data as any;\n    // Creates a cumulative bloom filter that merges the parent's bloom filter\n    // and its own cumulative bloom (which contains tokens for all ancestors)\n    for (let i = 0; i < NodeInjectorOffset.BLOOM_SIZE; i++) {\n      lView[injectorIndex + i] = parentLView[parentIndex + i] | parentData[parentIndex + i];\n    }\n  }\n\n  lView[injectorIndex + NodeInjectorOffset.PARENT] = parentLoc;\n  return injectorIndex;\n}\n\nfunction insertBloom(arr: any[], footer: TNode | null): void {\n  arr.push(0, 0, 0, 0, 0, 0, 0, 0, footer);\n}\n\nexport function getInjectorIndex(tNode: TNode, lView: LView): number {\n  if (\n    tNode.injectorIndex === -1 ||\n    // If the injector index is the same as its parent's injector index, then the index has been\n    // copied down from the parent node. No injector has been created yet on this node.\n    (tNode.parent && tNode.parent.injectorIndex === tNode.injectorIndex) ||\n    // After the first template pass, the injector index might exist but the parent values\n    // might not have been calculated yet for this instance\n    lView[tNode.injectorIndex + NodeInjectorOffset.PARENT] === null\n  ) {\n    return -1;\n  } else {\n    ngDevMode && assertIndexInRange(lView, tNode.injectorIndex);\n    return tNode.injectorIndex;\n  }\n}\n\n/**\n * Finds the index of the parent injector, with a view offset if applicable. Used to set the\n * parent injector initially.\n *\n * @returns Returns a number that is the combination of the number of LViews that we have to go up\n * to find the LView containing the parent inject AND the index of the injector within that LView.\n */\nexport function getParentInjectorLocation(tNode: TNode, lView: LView): RelativeInjectorLocation {\n  if (tNode.parent && tNode.parent.injectorIndex !== -1) {\n    // If we have a parent `TNode` and there is an injector associated with it we are done, because\n    // the parent injector is within the current `LView`.\n    return tNode.parent.injectorIndex as RelativeInjectorLocation; // ViewOffset is 0\n  }\n\n  // When parent injector location is computed it may be outside of the current view. (ie it could\n  // be pointing to a declared parent location). This variable stores number of declaration parents\n  // we need to walk up in order to find the parent injector location.\n  let declarationViewOffset = 0;\n  let parentTNode: TNode | null = null;\n  let lViewCursor: LView | null = lView;\n\n  // The parent injector is not in the current `LView`. We will have to walk the declared parent\n  // `LView` hierarchy and look for it. If we walk of the top, that means that there is no parent\n  // `NodeInjector`.\n  while (lViewCursor !== null) {\n    parentTNode = getTNodeFromLView(lViewCursor);\n\n    if (parentTNode === null) {\n      // If we have no parent, than we are done.\n      return NO_PARENT_INJECTOR;\n    }\n\n    ngDevMode && parentTNode && assertTNodeForLView(parentTNode!, lViewCursor[DECLARATION_VIEW]!);\n    // Every iteration of the loop requires that we go to the declared parent.\n    declarationViewOffset++;\n    lViewCursor = lViewCursor[DECLARATION_VIEW];\n\n    if (parentTNode.injectorIndex !== -1) {\n      // We found a NodeInjector which points to something.\n      return (parentTNode.injectorIndex |\n        (declarationViewOffset <<\n          RelativeInjectorLocationFlags.ViewOffsetShift)) as RelativeInjectorLocation;\n    }\n  }\n  return NO_PARENT_INJECTOR;\n}\n/**\n * Makes a type or an injection token public to the DI system by adding it to an\n * injector's bloom filter.\n *\n * @param di The node injector in which a directive will be added\n * @param token The type or the injection token to be made public\n */\nexport function diPublicInInjector(\n  injectorIndex: number,\n  tView: TView,\n  token: ProviderToken<any>,\n): void {\n  bloomAdd(injectorIndex, tView, token);\n}\n\n/**\n * Inject static attribute value into directive constructor.\n *\n * This method is used with `factory` functions which are generated as part of\n * `defineDirective` or `defineComponent`. The method retrieves the static value\n * of an attribute. (Dynamic attributes are not supported since they are not resolved\n *  at the time of injection and can change over time.)\n *\n * # Example\n * Given:\n * ```ts\n * @Component(...)\n * class MyComponent {\n *   constructor(@Attribute('title') title: string) { ... }\n * }\n * ```\n * When instantiated with\n * ```html\n * <my-component title=\"Hello\"></my-component>\n * ```\n *\n * Then factory method generated is:\n * ```ts\n * MyComponent.ɵcmp = defineComponent({\n *   factory: () => new MyComponent(injectAttribute('title'))\n *   ...\n * })\n * ```\n *\n * @publicApi\n */\nexport function injectAttributeImpl(tNode: TNode, attrNameToInject: string): string | null {\n  ngDevMode && assertTNodeType(tNode, TNodeType.AnyContainer | TNodeType.AnyRNode);\n  ngDevMode && assertDefined(tNode, 'expecting tNode');\n  if (attrNameToInject === 'class') {\n    return tNode.classes;\n  }\n  if (attrNameToInject === 'style') {\n    return tNode.styles;\n  }\n\n  const attrs = tNode.attrs;\n  if (attrs) {\n    const attrsLength = attrs.length;\n    let i = 0;\n    while (i < attrsLength) {\n      const value = attrs[i];\n\n      // If we hit a `Bindings` or `Template` marker then we are done.\n      if (isNameOnlyAttributeMarker(value)) break;\n\n      // Skip namespaced attributes\n      if (value === AttributeMarker.NamespaceURI) {\n        // we skip the next two values\n        // as namespaced attributes looks like\n        // [..., AttributeMarker.NamespaceURI, 'http://someuri.com/test', 'test:exist',\n        // 'existValue', ...]\n        i = i + 2;\n      } else if (typeof value === 'number') {\n        // Skip to the first value of the marked attribute.\n        i++;\n        while (i < attrsLength && typeof attrs[i] === 'string') {\n          i++;\n        }\n      } else if (value === attrNameToInject) {\n        return attrs[i + 1] as string;\n      } else {\n        i = i + 2;\n      }\n    }\n  }\n  return null;\n}\n\nfunction notFoundValueOrThrow<T>(\n  notFoundValue: T | null,\n  token: ProviderToken<T>,\n  flags: InjectFlags,\n): T | null {\n  if (flags & InjectFlags.Optional || notFoundValue !== undefined) {\n    return notFoundValue;\n  } else {\n    throwProviderNotFoundError(token, 'NodeInjector');\n  }\n}\n\n/**\n * Returns the value associated to the given token from the ModuleInjector or throws exception\n *\n * @param lView The `LView` that contains the `tNode`\n * @param token The token to look for\n * @param flags Injection flags\n * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`\n * @returns the value from the injector or throws an exception\n */\nfunction lookupTokenUsingModuleInjector<T>(\n  lView: LView,\n  token: ProviderToken<T>,\n  flags: InjectFlags,\n  notFoundValue?: any,\n): T | null {\n  if (flags & InjectFlags.Optional && notFoundValue === undefined) {\n    // This must be set or the NullInjector will throw for optional deps\n    notFoundValue = null;\n  }\n\n  if ((flags & (InjectFlags.Self | InjectFlags.Host)) === 0) {\n    const moduleInjector = lView[INJECTOR];\n    // switch to `injectInjectorOnly` implementation for module injector, since module injector\n    // should not have access to Component/Directive DI scope (that may happen through\n    // `directiveInject` implementation)\n    const previousInjectImplementation = setInjectImplementation(undefined);\n    try {\n      if (moduleInjector) {\n        return moduleInjector.get(token, notFoundValue, flags & InjectFlags.Optional);\n      } else {\n        return injectRootLimpMode(token, notFoundValue, flags & InjectFlags.Optional);\n      }\n    } finally {\n      setInjectImplementation(previousInjectImplementation);\n    }\n  }\n  return notFoundValueOrThrow<T>(notFoundValue, token, flags);\n}\n\n/**\n * Returns the value associated to the given token from the NodeInjectors => ModuleInjector.\n *\n * Look for the injector providing the token by walking up the node injector tree and then\n * the module injector tree.\n *\n * This function patches `token` with `__NG_ELEMENT_ID__` which contains the id for the bloom\n * filter. `-1` is reserved for injecting `Injector` (implemented by `NodeInjector`)\n *\n * @param tNode The Node where the search for the injector should start\n * @param lView The `LView` that contains the `tNode`\n * @param token The token to look for\n * @param flags Injection flags\n * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`\n * @returns the value from the injector, `null` when not found, or `notFoundValue` if provided\n */\nexport function getOrCreateInjectable<T>(\n  tNode: TDirectiveHostNode | null,\n  lView: LView,\n  token: ProviderToken<T>,\n  flags: InjectFlags = InjectFlags.Default,\n  notFoundValue?: any,\n): T | null {\n  if (tNode !== null) {\n    // If the view or any of its ancestors have an embedded\n    // view injector, we have to look it up there first.\n    if (\n      lView[FLAGS] & LViewFlags.HasEmbeddedViewInjector &&\n      // The token must be present on the current node injector when the `Self`\n      // flag is set, so the lookup on embedded view injector(s) can be skipped.\n      !(flags & InjectFlags.Self)\n    ) {\n      const embeddedInjectorValue = lookupTokenUsingEmbeddedInjector(\n        tNode,\n        lView,\n        token,\n        flags,\n        NOT_FOUND,\n      );\n      if (embeddedInjectorValue !== NOT_FOUND) {\n        return embeddedInjectorValue;\n      }\n    }\n\n    // Otherwise try the node injector.\n    const value = lookupTokenUsingNodeInjector(tNode, lView, token, flags, NOT_FOUND);\n    if (value !== NOT_FOUND) {\n      return value;\n    }\n  }\n\n  // Finally, fall back to the module injector.\n  return lookupTokenUsingModuleInjector<T>(lView, token, flags, notFoundValue);\n}\n\n/**\n * Returns the value associated to the given token from the node injector.\n *\n * @param tNode The Node where the search for the injector should start\n * @param lView The `LView` that contains the `tNode`\n * @param token The token to look for\n * @param flags Injection flags\n * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`\n * @returns the value from the injector, `null` when not found, or `notFoundValue` if provided\n */\nfunction lookupTokenUsingNodeInjector<T>(\n  tNode: TDirectiveHostNode,\n  lView: LView,\n  token: ProviderToken<T>,\n  flags: InjectFlags,\n  notFoundValue?: any,\n) {\n  const bloomHash = bloomHashBitOrFactory(token);\n  // If the ID stored here is a function, this is a special object like ElementRef or TemplateRef\n  // so just call the factory function to create it.\n  if (typeof bloomHash === 'function') {\n    if (!enterDI(lView, tNode, flags)) {\n      // Failed to enter DI, try module injector instead. If a token is injected with the @Host\n      // flag, the module injector is not searched for that token in Ivy.\n      return flags & InjectFlags.Host\n        ? notFoundValueOrThrow<T>(notFoundValue, token, flags)\n        : lookupTokenUsingModuleInjector<T>(lView, token, flags, notFoundValue);\n    }\n    try {\n      let value: unknown;\n\n      if (ngDevMode) {\n        runInInjectorProfilerContext(\n          new NodeInjector(getCurrentTNode() as TElementNode, getLView()),\n          token as Type<T>,\n          () => {\n            value = bloomHash(flags);\n\n            if (value != null) {\n              emitInstanceCreatedByInjectorEvent(value);\n            }\n          },\n        );\n      } else {\n        value = bloomHash(flags);\n      }\n\n      if (value == null && !(flags & InjectFlags.Optional)) {\n        throwProviderNotFoundError(token);\n      } else {\n        return value;\n      }\n    } finally {\n      leaveDI();\n    }\n  } else if (typeof bloomHash === 'number') {\n    // A reference to the previous injector TView that was found while climbing the element\n    // injector tree. This is used to know if viewProviders can be accessed on the current\n    // injector.\n    let previousTView: TView | null = null;\n    let injectorIndex = getInjectorIndex(tNode, lView);\n    let parentLocation = NO_PARENT_INJECTOR;\n    let hostTElementNode: TNode | null =\n      flags & InjectFlags.Host ? lView[DECLARATION_COMPONENT_VIEW][T_HOST] : null;\n\n    // If we should skip this injector, or if there is no injector on this node, start by\n    // searching the parent injector.\n    if (injectorIndex === -1 || flags & InjectFlags.SkipSelf) {\n      parentLocation =\n        injectorIndex === -1\n          ? getParentInjectorLocation(tNode, lView)\n          : lView[injectorIndex + NodeInjectorOffset.PARENT];\n\n      if (parentLocation === NO_PARENT_INJECTOR || !shouldSearchParent(flags, false)) {\n        injectorIndex = -1;\n      } else {\n        previousTView = lView[TVIEW];\n        injectorIndex = getParentInjectorIndex(parentLocation);\n        lView = getParentInjectorView(parentLocation, lView);\n      }\n    }\n\n    // Traverse up the injector tree until we find a potential match or until we know there\n    // *isn't* a match.\n    while (injectorIndex !== -1) {\n      ngDevMode && assertNodeInjector(lView, injectorIndex);\n\n      // Check the current injector. If it matches, see if it contains token.\n      const tView = lView[TVIEW];\n      ngDevMode &&\n        assertTNodeForLView(tView.data[injectorIndex + NodeInjectorOffset.TNODE] as TNode, lView);\n      if (bloomHasToken(bloomHash, injectorIndex, tView.data)) {\n        // At this point, we have an injector which *may* contain the token, so we step through\n        // the providers and directives associated with the injector's corresponding node to get\n        // the instance.\n        const instance: T | {} | null = searchTokensOnInjector<T>(\n          injectorIndex,\n          lView,\n          token,\n          previousTView,\n          flags,\n          hostTElementNode,\n        );\n        if (instance !== NOT_FOUND) {\n          return instance;\n        }\n      }\n      parentLocation = lView[injectorIndex + NodeInjectorOffset.PARENT];\n      if (\n        parentLocation !== NO_PARENT_INJECTOR &&\n        shouldSearchParent(\n          flags,\n          lView[TVIEW].data[injectorIndex + NodeInjectorOffset.TNODE] === hostTElementNode,\n        ) &&\n        bloomHasToken(bloomHash, injectorIndex, lView)\n      ) {\n        // The def wasn't found anywhere on this node, so it was a false positive.\n        // Traverse up the tree and continue searching.\n        previousTView = tView;\n        injectorIndex = getParentInjectorIndex(parentLocation);\n        lView = getParentInjectorView(parentLocation, lView);\n      } else {\n        // If we should not search parent OR If the ancestor bloom filter value does not have the\n        // bit corresponding to the directive we can give up on traversing up to find the specific\n        // injector.\n        injectorIndex = -1;\n      }\n    }\n  }\n\n  return notFoundValue;\n}\n\nfunction searchTokensOnInjector<T>(\n  injectorIndex: number,\n  lView: LView,\n  token: ProviderToken<T>,\n  previousTView: TView | null,\n  flags: InjectFlags,\n  hostTElementNode: TNode | null,\n) {\n  const currentTView = lView[TVIEW];\n  const tNode = currentTView.data[injectorIndex + NodeInjectorOffset.TNODE] as TNode;\n  // First, we need to determine if view providers can be accessed by the starting element.\n  // There are two possibilities\n  const canAccessViewProviders =\n    previousTView == null\n      ? // 1) This is the first invocation `previousTView == null` which means that we are at the\n        // `TNode` of where injector is starting to look. In such a case the only time we are allowed\n        // to look into the ViewProviders is if:\n        // - we are on a component\n        // - AND the injector set `includeViewProviders` to true (implying that the token can see\n        // ViewProviders because it is the Component or a Service which itself was declared in\n        // ViewProviders)\n        isComponentHost(tNode) && includeViewProviders\n      : // 2) `previousTView != null` which means that we are now walking across the parent nodes.\n        // In such a case we are only allowed to look into the ViewProviders if:\n        // - We just crossed from child View to Parent View `previousTView != currentTView`\n        // - AND the parent TNode is an Element.\n        // This means that we just came from the Component's View and therefore are allowed to see\n        // into the ViewProviders.\n        previousTView != currentTView && (tNode.type & TNodeType.AnyRNode) !== 0;\n\n  // This special case happens when there is a @host on the inject and when we are searching\n  // on the host element node.\n  const isHostSpecialCase = flags & InjectFlags.Host && hostTElementNode === tNode;\n\n  const injectableIdx = locateDirectiveOrProvider(\n    tNode,\n    currentTView,\n    token,\n    canAccessViewProviders,\n    isHostSpecialCase,\n  );\n  if (injectableIdx !== null) {\n    return getNodeInjectable(lView, currentTView, injectableIdx, tNode as TElementNode, flags);\n  } else {\n    return NOT_FOUND;\n  }\n}\n\n/**\n * Searches for the given token among the node's directives and providers.\n *\n * @param tNode TNode on which directives are present.\n * @param tView The tView we are currently processing\n * @param token Provider token or type of a directive to look for.\n * @param canAccessViewProviders Whether view providers should be considered.\n * @param isHostSpecialCase Whether the host special case applies.\n * @returns Index of a found directive or provider, or null when none found.\n */\nexport function locateDirectiveOrProvider<T>(\n  tNode: TNode,\n  tView: TView,\n  token: ProviderToken<T> | string,\n  canAccessViewProviders: boolean,\n  isHostSpecialCase: boolean | number,\n): number | null {\n  const nodeProviderIndexes = tNode.providerIndexes;\n  const tInjectables = tView.data;\n\n  const injectablesStart = nodeProviderIndexes & TNodeProviderIndexes.ProvidersStartIndexMask;\n  const directivesStart = tNode.directiveStart;\n  const directiveEnd = tNode.directiveEnd;\n  const cptViewProvidersCount =\n    nodeProviderIndexes >> TNodeProviderIndexes.CptViewProvidersCountShift;\n  const startingIndex = canAccessViewProviders\n    ? injectablesStart\n    : injectablesStart + cptViewProvidersCount;\n  // When the host special case applies, only the viewProviders and the component are visible\n  const endIndex = isHostSpecialCase ? injectablesStart + cptViewProvidersCount : directiveEnd;\n  for (let i = startingIndex; i < endIndex; i++) {\n    const providerTokenOrDef = tInjectables[i] as ProviderToken<any> | DirectiveDef<any> | string;\n    if (\n      (i < directivesStart && token === providerTokenOrDef) ||\n      (i >= directivesStart && (providerTokenOrDef as DirectiveDef<any>).type === token)\n    ) {\n      return i;\n    }\n  }\n  if (isHostSpecialCase) {\n    const dirDef = tInjectables[directivesStart] as DirectiveDef<any>;\n    if (dirDef && isComponentDef(dirDef) && dirDef.type === token) {\n      return directivesStart;\n    }\n  }\n  return null;\n}\n\n/**\n * Retrieve or instantiate the injectable from the `LView` at particular `index`.\n *\n * This function checks to see if the value has already been instantiated and if so returns the\n * cached `injectable`. Otherwise if it detects that the value is still a factory it\n * instantiates the `injectable` and caches the value.\n */\nexport function getNodeInjectable(\n  lView: LView,\n  tView: TView,\n  index: number,\n  tNode: TDirectiveHostNode,\n  flags?: InjectFlags,\n): any {\n  let value = lView[index];\n  const tData = tView.data;\n  if (value instanceof NodeInjectorFactory) {\n    const factory: NodeInjectorFactory = value;\n    if (factory.resolving) {\n      throwCyclicDependencyError(stringifyForError(tData[index]));\n    }\n    const previousIncludeViewProviders = setIncludeViewProviders(factory.canSeeViewProviders);\n    factory.resolving = true;\n\n    let prevInjectContext: InjectorProfilerContext | undefined;\n    if (ngDevMode) {\n      // tData indexes mirror the concrete instances in its corresponding LView.\n      // lView[index] here is either the injectable instace itself or a factory,\n      // therefore tData[index] is the constructor of that injectable or a\n      // definition object that contains the constructor in a `.type` field.\n      const token =\n        (tData[index] as DirectiveDef<unknown> | ComponentDef<unknown>).type || tData[index];\n      const injector = new NodeInjector(tNode, lView);\n      prevInjectContext = setInjectorProfilerContext({injector, token});\n    }\n\n    const previousInjectImplementation = factory.injectImpl\n      ? setInjectImplementation(factory.injectImpl)\n      : null;\n    const success = enterDI(lView, tNode, InjectFlags.Default);\n    ngDevMode &&\n      assertEqual(\n        success,\n        true,\n        \"Because flags do not contain `SkipSelf' we expect this to always succeed.\",\n      );\n    try {\n      value = lView[index] = factory.factory(undefined, flags, tData, lView, tNode);\n\n      ngDevMode && emitInstanceCreatedByInjectorEvent(value);\n\n      // This code path is hit for both directives and providers.\n      // For perf reasons, we want to avoid searching for hooks on providers.\n      // It does no harm to try (the hooks just won't exist), but the extra\n      // checks are unnecessary and this is a hot path. So we check to see\n      // if the index of the dependency is in the directive range for this\n      // tNode. If it's not, we know it's a provider and skip hook registration.\n      if (tView.firstCreatePass && index >= tNode.directiveStart) {\n        ngDevMode && assertDirectiveDef(tData[index]);\n        registerPreOrderHooks(index, tData[index] as DirectiveDef<any>, tView);\n      }\n    } finally {\n      ngDevMode && setInjectorProfilerContext(prevInjectContext!);\n\n      previousInjectImplementation !== null &&\n        setInjectImplementation(previousInjectImplementation);\n      setIncludeViewProviders(previousIncludeViewProviders);\n      factory.resolving = false;\n      leaveDI();\n    }\n  }\n  return value;\n}\n\n/**\n * Returns the bit in an injector's bloom filter that should be used to determine whether or not\n * the directive might be provided by the injector.\n *\n * When a directive is public, it is added to the bloom filter and given a unique ID that can be\n * retrieved on the Type. When the directive isn't public or the token is not a directive `null`\n * is returned as the node injector can not possibly provide that token.\n *\n * @param token the injection token\n * @returns the matching bit to check in the bloom filter or `null` if the token is not known.\n *   When the returned value is negative then it represents special values such as `Injector`.\n */\nexport function bloomHashBitOrFactory(\n  token: ProviderToken<any> | string,\n): number | Function | undefined {\n  ngDevMode && assertDefined(token, 'token must be defined');\n  if (typeof token === 'string') {\n    return token.charCodeAt(0) || 0;\n  }\n  const tokenId: number | undefined =\n    // First check with `hasOwnProperty` so we don't get an inherited ID.\n    token.hasOwnProperty(NG_ELEMENT_ID) ? (token as any)[NG_ELEMENT_ID] : undefined;\n  // Negative token IDs are used for special objects such as `Injector`\n  if (typeof tokenId === 'number') {\n    if (tokenId >= 0) {\n      return tokenId & BLOOM_MASK;\n    } else {\n      ngDevMode &&\n        assertEqual(tokenId, InjectorMarkers.Injector, 'Expecting to get Special Injector Id');\n      return createNodeInjector;\n    }\n  } else {\n    return tokenId;\n  }\n}\n\nexport function bloomHasToken(\n  bloomHash: number,\n  injectorIndex: number,\n  injectorView: LView | TData,\n) {\n  // Create a mask that targets the specific bit associated with the directive we're looking for.\n  // JS bit operations are 32 bits, so this will be a number between 2^0 and 2^31, corresponding\n  // to bit positions 0 - 31 in a 32 bit integer.\n  const mask = 1 << bloomHash;\n\n  // Each bloom bucket in `injectorView` represents `BLOOM_BUCKET_BITS` number of bits of\n  // `bloomHash`. Any bits in `bloomHash` beyond `BLOOM_BUCKET_BITS` indicate the bucket offset\n  // that should be used.\n  const value = injectorView[injectorIndex + (bloomHash >> BLOOM_BUCKET_BITS)];\n\n  // If the bloom filter value has the bit corresponding to the directive's bloomBit flipped on,\n  // this injector is a potential match.\n  return !!(value & mask);\n}\n\n/** Returns true if flags prevent parent injector from being searched for tokens */\nfunction shouldSearchParent(flags: InjectFlags, isFirstHostTNode: boolean): boolean | number {\n  return !(flags & InjectFlags.Self) && !(flags & InjectFlags.Host && isFirstHostTNode);\n}\n\nexport function getNodeInjectorLView(nodeInjector: NodeInjector): LView {\n  return (nodeInjector as any)._lView as LView;\n}\n\nexport function getNodeInjectorTNode(\n  nodeInjector: NodeInjector,\n): TElementNode | TContainerNode | TElementContainerNode | null {\n  return (nodeInjector as any)._tNode as\n    | TElementNode\n    | TContainerNode\n    | TElementContainerNode\n    | null;\n}\n\nexport class NodeInjector implements Injector {\n  constructor(\n    private _tNode: TElementNode | TContainerNode | TElementContainerNode | null,\n    private _lView: LView,\n  ) {}\n\n  get(token: any, notFoundValue?: any, flags?: InjectFlags | InjectOptions): any {\n    return getOrCreateInjectable(\n      this._tNode,\n      this._lView,\n      token,\n      convertToBitFlags(flags),\n      notFoundValue,\n    );\n  }\n}\n\n/** Creates a `NodeInjector` for the current node. */\nexport function createNodeInjector(): Injector {\n  return new NodeInjector(getCurrentTNode()! as TDirectiveHostNode, getLView()) as any;\n}\n\n/**\n * @codeGenApi\n */\nexport function ɵɵgetInheritedFactory<T>(type: Type<any>): (type: Type<T>) => T {\n  return noSideEffects(() => {\n    const ownConstructor = type.prototype.constructor;\n    const ownFactory = ownConstructor[NG_FACTORY_DEF] || getFactoryOf(ownConstructor);\n    const objectPrototype = Object.prototype;\n    let parent = Object.getPrototypeOf(type.prototype).constructor;\n\n    // Go up the prototype until we hit `Object`.\n    while (parent && parent !== objectPrototype) {\n      const factory = parent[NG_FACTORY_DEF] || getFactoryOf(parent);\n\n      // If we hit something that has a factory and the factory isn't the same as the type,\n      // we've found the inherited factory. Note the check that the factory isn't the type's\n      // own factory is redundant in most cases, but if the user has custom decorators on the\n      // class, this lookup will start one level down in the prototype chain, causing us to\n      // find the own factory first and potentially triggering an infinite loop downstream.\n      if (factory && factory !== ownFactory) {\n        return factory;\n      }\n\n      parent = Object.getPrototypeOf(parent);\n    }\n\n    // There is no factory defined. Either this was improper usage of inheritance\n    // (no Angular decorator on the superclass) or there is no constructor at all\n    // in the inheritance chain. Since the two cases cannot be distinguished, the\n    // latter has to be assumed.\n    return (t: Type<T>) => new t();\n  });\n}\n\nfunction getFactoryOf<T>(type: Type<any>): ((type?: Type<T>) => T | null) | null {\n  if (isForwardRef(type)) {\n    return () => {\n      const factory = getFactoryOf<T>(resolveForwardRef(type));\n      return factory && factory();\n    };\n  }\n  return getFactoryDef<T>(type);\n}\n\n/**\n * Returns a value from the closest embedded or node injector.\n *\n * @param tNode The Node where the search for the injector should start\n * @param lView The `LView` that contains the `tNode`\n * @param token The token to look for\n * @param flags Injection flags\n * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`\n * @returns the value from the injector, `null` when not found, or `notFoundValue` if provided\n */\nfunction lookupTokenUsingEmbeddedInjector<T>(\n  tNode: TDirectiveHostNode,\n  lView: LView,\n  token: ProviderToken<T>,\n  flags: InjectFlags,\n  notFoundValue?: any,\n) {\n  let currentTNode: TDirectiveHostNode | null = tNode;\n  let currentLView: LView | null = lView;\n\n  // When an LView with an embedded view injector is inserted, it'll likely be interlaced with\n  // nodes who may have injectors (e.g. node injector -> embedded view injector -> node injector).\n  // Since the bloom filters for the node injectors have already been constructed and we don't\n  // have a way of extracting the records from an injector, the only way to maintain the correct\n  // hierarchy when resolving the value is to walk it node-by-node while attempting to resolve\n  // the token at each level.\n  while (\n    currentTNode !== null &&\n    currentLView !== null &&\n    currentLView[FLAGS] & LViewFlags.HasEmbeddedViewInjector &&\n    !isRootView(currentLView)\n  ) {\n    ngDevMode && assertTNodeForLView(currentTNode, currentLView);\n\n    // Note that this lookup on the node injector is using the `Self` flag, because\n    // we don't want the node injector to look at any parent injectors since we\n    // may hit the embedded view injector first.\n    const nodeInjectorValue = lookupTokenUsingNodeInjector(\n      currentTNode,\n      currentLView,\n      token,\n      flags | InjectFlags.Self,\n      NOT_FOUND,\n    );\n    if (nodeInjectorValue !== NOT_FOUND) {\n      return nodeInjectorValue;\n    }\n\n    // Has an explicit type due to a TS bug: https://github.com/microsoft/TypeScript/issues/33191\n    let parentTNode: TElementNode | TContainerNode | null = currentTNode.parent;\n\n    // `TNode.parent` includes the parent within the current view only. If it doesn't exist,\n    // it means that we've hit the view boundary and we need to go up to the next view.\n    if (!parentTNode) {\n      // Before we go to the next LView, check if the token exists on the current embedded injector.\n      const embeddedViewInjector = currentLView[EMBEDDED_VIEW_INJECTOR];\n      if (embeddedViewInjector) {\n        const embeddedViewInjectorValue = embeddedViewInjector.get(\n          token,\n          NOT_FOUND as T | {},\n          flags,\n        );\n        if (embeddedViewInjectorValue !== NOT_FOUND) {\n          return embeddedViewInjectorValue;\n        }\n      }\n\n      // Otherwise keep going up the tree.\n      parentTNode = getTNodeFromLView(currentLView);\n      currentLView = currentLView[DECLARATION_VIEW];\n    }\n\n    currentTNode = parentTNode;\n  }\n\n  return notFoundValue;\n}\n\n/** Gets the TNode associated with an LView inside of the declaration view. */\nfunction getTNodeFromLView(lView: LView): TElementNode | TElementContainerNode | null {\n  const tView = lView[TVIEW];\n  const tViewType = tView.type;\n\n  // The parent pointer differs based on `TView.type`.\n  if (tViewType === TViewType.Embedded) {\n    ngDevMode && assertDefined(tView.declTNode, 'Embedded TNodes should have declaration parents.');\n    return tView.declTNode as TElementContainerNode;\n  } else if (tViewType === TViewType.Component) {\n    // Components don't have `TView.declTNode` because each instance of component could be\n    // inserted in different location, hence `TView.declTNode` is meaningless.\n    return lView[T_HOST] as TElementNode;\n  }\n\n  return null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {injectAttributeImpl} from '../di';\nimport {getCurrentTNode} from '../state';\n\n/**\n * Facade for the attribute injection from DI.\n *\n * @codeGenApi\n */\nexport function ɵɵinjectAttribute(attrNameToInject: string): string | null {\n  return injectAttributeImpl(getCurrentTNode()!, attrNameToInject);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵɵinjectAttribute} from '../render3/instructions/di_attr';\nimport {makeParamDecorator} from '../util/decorators';\n\n/**\n * Type of the Attribute decorator / constructor function.\n *\n * @publicApi\n */\nexport interface AttributeDecorator {\n  /**\n   * Parameter decorator for a directive constructor that designates\n   * a host-element attribute whose value is injected as a constant string literal.\n   *\n   * @usageNotes\n   *\n   * Suppose we have an `<input>` element and want to know its `type`.\n   *\n   * ```html\n   * <input type=\"text\">\n   * ```\n   *\n   * The following example uses the decorator to inject the string literal `text` in a directive.\n   *\n   * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}\n   *\n   * The following example uses the decorator in a component constructor.\n   *\n   * {@example core/ts/metadata/metadata.ts region='attributeFactory'}\n   *\n   */\n  (name: string): any;\n  new (name: string): Attribute;\n}\n\n/**\n * Type of the Attribute metadata.\n *\n * @publicApi\n */\nexport interface Attribute {\n  /**\n   * The name of the attribute whose value can be injected.\n   */\n  attributeName: string;\n}\n\n/**\n * Attribute decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const Attribute: AttributeDecorator = makeParamDecorator(\n  'Attribute',\n  (attributeName?: string) => ({\n    attributeName,\n    __NG_ELEMENT_ID__: () => ɵɵinjectAttribute(attributeName!),\n  }),\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {R3DependencyMetadataFacade} from '../../compiler/compiler_facade';\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {Type} from '../../interface/type';\nimport {ReflectionCapabilities} from '../../reflection/reflection_capabilities';\nimport {Host, Inject, Optional, Self, SkipSelf} from '../metadata';\nimport {Attribute} from '../metadata_attr';\n\nlet _reflect: ReflectionCapabilities | null = null;\n\nexport function getReflect(): ReflectionCapabilities {\n  return (_reflect = _reflect || new ReflectionCapabilities());\n}\n\nexport function reflectDependencies(type: Type<any>): R3DependencyMetadataFacade[] {\n  return convertDependencies(getReflect().parameters(type));\n}\n\nexport function convertDependencies(deps: any[]): R3DependencyMetadataFacade[] {\n  return deps.map((dep) => reflectDependency(dep));\n}\n\nfunction reflectDependency(dep: any | any[]): R3DependencyMetadataFacade {\n  const meta: R3DependencyMetadataFacade = {\n    token: null,\n    attribute: null,\n    host: false,\n    optional: false,\n    self: false,\n    skipSelf: false,\n  };\n\n  if (Array.isArray(dep) && dep.length > 0) {\n    for (let j = 0; j < dep.length; j++) {\n      const param = dep[j];\n      if (param === undefined) {\n        // param may be undefined if type of dep is not set by ngtsc\n        continue;\n      }\n\n      const proto = Object.getPrototypeOf(param);\n\n      if (param instanceof Optional || proto.ngMetadataName === 'Optional') {\n        meta.optional = true;\n      } else if (param instanceof SkipSelf || proto.ngMetadataName === 'SkipSelf') {\n        meta.skipSelf = true;\n      } else if (param instanceof Self || proto.ngMetadataName === 'Self') {\n        meta.self = true;\n      } else if (param instanceof Host || proto.ngMetadataName === 'Host') {\n        meta.host = true;\n      } else if (param instanceof Inject) {\n        meta.token = param.token;\n      } else if (param instanceof Attribute) {\n        if (param.attributeName === undefined) {\n          throw new RuntimeError(\n            RuntimeErrorCode.INVALID_INJECTION_TOKEN,\n            ngDevMode && `Attribute name must be defined.`,\n          );\n        }\n        meta.attribute = param.attributeName;\n      } else {\n        meta.token = param;\n      }\n    }\n  } else if (dep === undefined || (Array.isArray(dep) && dep.length === 0)) {\n    meta.token = null;\n  } else {\n    meta.token = dep;\n  }\n  return meta;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  getCompilerFacade,\n  JitCompilerUsage,\n  R3InjectableMetadataFacade,\n} from '../../compiler/compiler_facade';\nimport {Type} from '../../interface/type';\nimport {NG_FACTORY_DEF} from '../../render3/fields';\nimport {getClosureSafeProperty} from '../../util/property';\nimport {resolveForwardRef} from '../forward_ref';\nimport type {Injectable} from '../injectable';\nimport {NG_PROV_DEF} from '../interface/defs';\nimport {\n  ClassSansProvider,\n  ExistingSansProvider,\n  FactorySansProvider,\n  ValueProvider,\n  ValueSansProvider,\n} from '../interface/provider';\n\nimport {angularCoreDiEnv} from './environment';\nimport {convertDependencies, reflectDependencies} from './util';\n\n/**\n * Compile an Angular injectable according to its `Injectable` metadata, and patch the resulting\n * injectable def (`ɵprov`) onto the injectable type.\n */\nexport function compileInjectable(type: Type<any>, meta?: Injectable): void {\n  let ngInjectableDef: any = null;\n  let ngFactoryDef: any = null;\n\n  // if NG_PROV_DEF is already defined on this class then don't overwrite it\n  if (!type.hasOwnProperty(NG_PROV_DEF)) {\n    Object.defineProperty(type, NG_PROV_DEF, {\n      get: () => {\n        if (ngInjectableDef === null) {\n          const compiler = getCompilerFacade({\n            usage: JitCompilerUsage.Decorator,\n            kind: 'injectable',\n            type,\n          });\n          ngInjectableDef = compiler.compileInjectable(\n            angularCoreDiEnv,\n            `ng:///${type.name}/ɵprov.js`,\n            getInjectableMetadata(type, meta),\n          );\n        }\n        return ngInjectableDef;\n      },\n    });\n  }\n\n  // if NG_FACTORY_DEF is already defined on this class then don't overwrite it\n  if (!type.hasOwnProperty(NG_FACTORY_DEF)) {\n    Object.defineProperty(type, NG_FACTORY_DEF, {\n      get: () => {\n        if (ngFactoryDef === null) {\n          const compiler = getCompilerFacade({\n            usage: JitCompilerUsage.Decorator,\n            kind: 'injectable',\n            type,\n          });\n          ngFactoryDef = compiler.compileFactory(angularCoreDiEnv, `ng:///${type.name}/ɵfac.js`, {\n            name: type.name,\n            type,\n            typeArgumentCount: 0, // In JIT mode types are not available nor used.\n            deps: reflectDependencies(type),\n            target: compiler.FactoryTarget.Injectable,\n          });\n        }\n        return ngFactoryDef;\n      },\n      // Leave this configurable so that the factories from directives or pipes can take precedence.\n      configurable: true,\n    });\n  }\n}\n\ntype UseClassProvider = Injectable & ClassSansProvider & {deps?: any[]};\n\nconst USE_VALUE = getClosureSafeProperty<ValueProvider>({\n  provide: String,\n  useValue: getClosureSafeProperty,\n});\n\nfunction isUseClassProvider(meta: Injectable): meta is UseClassProvider {\n  return (meta as UseClassProvider).useClass !== undefined;\n}\n\nfunction isUseValueProvider(meta: Injectable): meta is Injectable & ValueSansProvider {\n  return USE_VALUE in meta;\n}\n\nfunction isUseFactoryProvider(meta: Injectable): meta is Injectable & FactorySansProvider {\n  return (meta as FactorySansProvider).useFactory !== undefined;\n}\n\nfunction isUseExistingProvider(meta: Injectable): meta is Injectable & ExistingSansProvider {\n  return (meta as ExistingSansProvider).useExisting !== undefined;\n}\n\nfunction getInjectableMetadata(type: Type<any>, srcMeta?: Injectable): R3InjectableMetadataFacade {\n  // Allow the compilation of a class with a `@Injectable()` decorator without parameters\n  const meta: Injectable = srcMeta || {providedIn: null};\n  const compilerMeta: R3InjectableMetadataFacade = {\n    name: type.name,\n    type: type,\n    typeArgumentCount: 0,\n    providedIn: meta.providedIn,\n  };\n  if ((isUseClassProvider(meta) || isUseFactoryProvider(meta)) && meta.deps !== undefined) {\n    compilerMeta.deps = convertDependencies(meta.deps);\n  }\n  // Check to see if the user explicitly provided a `useXxxx` property.\n  if (isUseClassProvider(meta)) {\n    compilerMeta.useClass = meta.useClass;\n  } else if (isUseValueProvider(meta)) {\n    compilerMeta.useValue = meta.useValue;\n  } else if (isUseFactoryProvider(meta)) {\n    compilerMeta.useFactory = meta.useFactory;\n  } else if (isUseExistingProvider(meta)) {\n    compilerMeta.useExisting = meta.useExisting;\n  }\n  return compilerMeta;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {makeDecorator, TypeDecorator} from '../util/decorators';\n\nimport {\n  ClassSansProvider,\n  ConstructorSansProvider,\n  ExistingSansProvider,\n  FactorySansProvider,\n  StaticClassSansProvider,\n  ValueSansProvider,\n} from './interface/provider';\nimport {compileInjectable} from './jit/injectable';\n\nexport {compileInjectable};\n\n/**\n * Injectable providers used in `@Injectable` decorator.\n *\n * @publicApi\n */\nexport type InjectableProvider =\n  | ValueSansProvider\n  | ExistingSansProvider\n  | StaticClassSansProvider\n  | ConstructorSansProvider\n  | FactorySansProvider\n  | ClassSansProvider;\n\n/**\n * Type of the Injectable decorator / constructor function.\n *\n * @publicApi\n */\nexport interface InjectableDecorator {\n  /**\n   * Decorator that marks a class as available to be\n   * provided and injected as a dependency.\n   *\n   * @see [Introduction to Services and DI](guide/di)\n   * @see [Dependency Injection Guide](guide/di/dependency-injection\n   *\n   * @usageNotes\n   *\n   * Marking a class with `@Injectable` ensures that the compiler\n   * will generate the necessary metadata to create the class's\n   * dependencies when the class is injected.\n   *\n   * The following example shows how a service class is properly\n   *  marked so that a supporting service can be injected upon creation.\n   *\n   * {@example core/di/ts/metadata_spec.ts region='Injectable'}\n   *\n   */\n  (): TypeDecorator;\n  (\n    options?: {providedIn: Type<any> | 'root' | 'platform' | 'any' | null} & InjectableProvider,\n  ): TypeDecorator;\n  new (): Injectable;\n  new (\n    options?: {providedIn: Type<any> | 'root' | 'platform' | 'any' | null} & InjectableProvider,\n  ): Injectable;\n}\n\n/**\n * Type of the Injectable metadata.\n *\n * @publicApi\n */\nexport interface Injectable {\n  /**\n   * Determines which injectors will provide the injectable.\n   *\n   * - `Type<any>` - associates the injectable with an `@NgModule` or other `InjectorType`. This\n   * option is DEPRECATED.\n   * - 'null' : Equivalent to `undefined`. The injectable is not provided in any scope automatically\n   * and must be added to a `providers` array of an [@NgModule](api/core/NgModule#providers),\n   * [@Component](api/core/Directive#providers) or [@Directive](api/core/Directive#providers).\n   *\n   * The following options specify that this injectable should be provided in one of the following\n   * injectors:\n   * - 'root' : The application-level injector in most apps.\n   * - 'platform' : A special singleton platform injector shared by all\n   * applications on the page.\n   * - 'any' : Provides a unique instance in each lazy loaded module while all eagerly loaded\n   * modules share one instance. This option is DEPRECATED.\n   *\n   */\n  providedIn?: Type<any> | 'root' | 'platform' | 'any' | null;\n}\n\n/**\n * Injectable decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const Injectable: InjectableDecorator = makeDecorator(\n  'Injectable',\n  undefined,\n  undefined,\n  undefined,\n  (type: Type<any>, meta: Injectable) => compileInjectable(type as any, meta),\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EMPTY_ARRAY} from '../util/empty';\nimport {stringify} from '../util/stringify';\n\nimport type {Injector} from './injector';\nimport type {Provider, StaticProvider} from './interface/provider';\nimport {importProvidersFrom} from './provider_collection';\nimport {getNullInjector, R3Injector} from './r3_injector';\nimport {InjectorScope} from './scope';\n\n/**\n * Create a new `Injector` which is configured using a `defType` of `InjectorType<any>`s.\n */\nexport function createInjector(\n  defType: /* InjectorType<any> */ any,\n  parent: Injector | null = null,\n  additionalProviders: Array<Provider | StaticProvider> | null = null,\n  name?: string,\n): Injector {\n  const injector = createInjectorWithoutInjectorInstances(\n    defType,\n    parent,\n    additionalProviders,\n    name,\n  );\n  injector.resolveInjectorInitializers();\n  return injector;\n}\n\n/**\n * Creates a new injector without eagerly resolving its injector types. Can be used in places\n * where resolving the injector types immediately can lead to an infinite loop. The injector types\n * should be resolved at a later point by calling `_resolveInjectorDefTypes`.\n */\nexport function createInjectorWithoutInjectorInstances(\n  defType: /* InjectorType<any> */ any,\n  parent: Injector | null = null,\n  additionalProviders: Array<Provider | StaticProvider> | null = null,\n  name?: string,\n  scopes = new Set<InjectorScope>(),\n): R3Injector {\n  const providers = [additionalProviders || EMPTY_ARRAY, importProvidersFrom(defType)];\n  name = name || (typeof defType === 'object' ? undefined : stringify(defType));\n\n  return new R3Injector(providers, parent || getNullInjector(), name || null, scopes);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {createInjector} from './create_injector';\nimport {THROW_IF_NOT_FOUND, ɵɵinject} from './injector_compatibility';\nimport {InjectorMarkers} from './injector_marker';\nimport {INJECTOR} from './injector_token';\nimport {ɵɵdefineInjectable} from './interface/defs';\nimport {InjectFlags, InjectOptions} from './interface/injector';\nimport {Provider, StaticProvider} from './interface/provider';\nimport {NullInjector} from './null_injector';\nimport {ProviderToken} from './provider_token';\n\n/**\n * Concrete injectors implement this interface. Injectors are configured\n * with [providers](guide/di/dependency-injection-providers) that associate\n * dependencies of various types with [injection tokens](guide/di/dependency-injection-providers).\n *\n * @see [DI Providers](guide/di/dependency-injection-providers).\n * @see {@link StaticProvider}\n *\n * @usageNotes\n *\n *  The following example creates a service injector instance.\n *\n * {@example core/di/ts/provider_spec.ts region='ConstructorProvider'}\n *\n * ### Usage example\n *\n * {@example core/di/ts/injector_spec.ts region='Injector'}\n *\n * `Injector` returns itself when given `Injector` as a token:\n *\n * {@example core/di/ts/injector_spec.ts region='injectInjector'}\n *\n * @publicApi\n */\nexport abstract class Injector {\n  static THROW_IF_NOT_FOUND = THROW_IF_NOT_FOUND;\n  static NULL: Injector = /* @__PURE__ */ new NullInjector();\n\n  /**\n   * Internal note on the `options?: InjectOptions|InjectFlags` override of the `get`\n   * method: consider dropping the `InjectFlags` part in one of the major versions.\n   * It can **not** be done in minor/patch, since it's breaking for custom injectors\n   * that only implement the old `InjectorFlags` interface.\n   */\n\n  /**\n   * Retrieves an instance from the injector based on the provided token.\n   * @returns The instance from the injector if defined, otherwise the `notFoundValue`.\n   * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.\n   */\n  abstract get<T>(\n    token: ProviderToken<T>,\n    notFoundValue: undefined,\n    options: InjectOptions & {\n      optional?: false;\n    },\n  ): T;\n  /**\n   * Retrieves an instance from the injector based on the provided token.\n   * @returns The instance from the injector if defined, otherwise the `notFoundValue`.\n   * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.\n   */\n  abstract get<T>(\n    token: ProviderToken<T>,\n    notFoundValue: null | undefined,\n    options: InjectOptions,\n  ): T | null;\n  /**\n   * Retrieves an instance from the injector based on the provided token.\n   * @returns The instance from the injector if defined, otherwise the `notFoundValue`.\n   * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.\n   */\n  abstract get<T>(\n    token: ProviderToken<T>,\n    notFoundValue?: T,\n    options?: InjectOptions | InjectFlags,\n  ): T;\n  /**\n   * Retrieves an instance from the injector based on the provided token.\n   * @returns The instance from the injector if defined, otherwise the `notFoundValue`.\n   * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.\n   * @deprecated use object-based flags (`InjectOptions`) instead.\n   */\n  abstract get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): T;\n  /**\n   * @deprecated from v4.0.0 use ProviderToken<T>\n   * @suppress {duplicate}\n   */\n  abstract get(token: any, notFoundValue?: any): any;\n\n  /**\n   * @deprecated from v5 use the new signature Injector.create(options)\n   */\n  static create(providers: StaticProvider[], parent?: Injector): Injector;\n\n  /**\n   * Creates a new injector instance that provides one or more dependencies,\n   * according to a given type or types of `StaticProvider`.\n   *\n   * @param options An object with the following properties:\n   * * `providers`: An array of providers of the [StaticProvider type](api/core/StaticProvider).\n   * * `parent`: (optional) A parent injector.\n   * * `name`: (optional) A developer-defined identifying name for the new injector.\n   *\n   * @returns The new injector instance.\n   *\n   */\n  static create(options: {\n    providers: Array<Provider | StaticProvider>;\n    parent?: Injector;\n    name?: string;\n  }): Injector;\n\n  static create(\n    options:\n      | StaticProvider[]\n      | {providers: Array<Provider | StaticProvider>; parent?: Injector; name?: string},\n    parent?: Injector,\n  ): Injector {\n    if (Array.isArray(options)) {\n      return createInjector({name: ''}, parent, options, '');\n    } else {\n      const name = options.name ?? '';\n      return createInjector({name}, options.parent, options.providers, name);\n    }\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: Injector,\n    providedIn: 'any',\n    factory: () => ɵɵinject(INJECTOR),\n  });\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ELEMENT_ID__ = InjectorMarkers.Injector;\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵɵinjectAttribute} from '../render3/instructions/di_attr';\n\n/**\n * Creates a token that can be used to inject static attributes of the host node.\n *\n * @usageNotes\n * ### Injecting an attribute that is known to exist\n * ```ts\n * @Directive()\n * class MyDir {\n *   attr: string = inject(new HostAttributeToken('some-attr'));\n * }\n * ```\n *\n * ### Optionally injecting an attribute\n * ```ts\n * @Directive()\n * class MyDir {\n *   attr: string | null = inject(new HostAttributeToken('some-attr'), {optional: true});\n * }\n * ```\n * @pub   licApi\n */\nexport class HostAttributeToken {\n  constructor(private attributeName: string) {}\n\n  /** @internal */\n  __NG_ELEMENT_ID__ = () => ɵɵinjectAttribute(this.attributeName);\n\n  toString(): string {\n    return `HostAttributeToken ${this.attributeName}`;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {TNode, TNodeType} from '../render3/interfaces/node';\nimport {getCurrentTNode} from '../render3/state';\n\nimport {InjectionToken} from './injection_token';\nimport {InjectFlags} from './interface/injector';\n\n/**\n * A token that can be used to inject the tag name of the host node.\n *\n * @usageNotes\n * ### Injecting a tag name that is known to exist\n * ```ts\n * @Directive()\n * class MyDir {\n *   tagName: string = inject(HOST_TAG_NAME);\n * }\n * ```\n *\n * ### Optionally injecting a tag name\n * ```ts\n * @Directive()\n * class MyDir {\n *   tagName: string | null = inject(HOST_TAG_NAME, {optional: true});\n * }\n * ```\n * @publicApi\n */\nexport const HOST_TAG_NAME = new InjectionToken<string>(ngDevMode ? 'HOST_TAG_NAME' : '');\n\n// HOST_TAG_NAME should be resolved at the current node, similar to e.g. ElementRef,\n// so we manually specify __NG_ELEMENT_ID__ here, instead of using a factory.\n// tslint:disable-next-line:no-toplevel-property-access\n(HOST_TAG_NAME as any).__NG_ELEMENT_ID__ = (flags: InjectFlags) => {\n  const tNode = getCurrentTNode();\n  if (tNode === null) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INVALID_INJECTION_TOKEN,\n      ngDevMode &&\n        'HOST_TAG_NAME can only be injected in directives and components ' +\n          'during construction time (in a class constructor or as a class field initializer)',\n    );\n  }\n  if (tNode.type & TNodeType.Element) {\n    return tNode.value;\n  }\n  if (flags & InjectFlags.Optional) {\n    return null;\n  }\n  throw new RuntimeError(\n    RuntimeErrorCode.INVALID_INJECTION_TOKEN,\n    ngDevMode &&\n      `HOST_TAG_NAME was used on ${getDevModeNodeName(\n        tNode,\n      )} which doesn't have an underlying element in the DOM. ` +\n        `This is invalid, and so the dependency should be marked as optional.`,\n  );\n};\n\nfunction getDevModeNodeName(tNode: TNode) {\n  if (tNode.type & TNodeType.ElementContainer) {\n    return 'an <ng-container>';\n  } else if (tNode.type & TNodeType.Container) {\n    return 'an <ng-template>';\n  } else if (tNode.type & TNodeType.LetDeclaration) {\n    return 'an @let declaration';\n  } else {\n    return 'a node';\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport const SCHEDULE_IN_ROOT_ZONE_DEFAULT = false;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentInjector} from '../di';\nimport {isDestroyed} from '../render3/interfaces/type_checks';\nimport {LView} from '../render3/interfaces/view';\nimport {getLView} from '../render3/state';\nimport {removeLViewOnDestroy, storeLViewOnDestroy} from '../render3/util/view_utils';\n\n/**\n * `DestroyRef` lets you set callbacks to run for any cleanup or destruction behavior.\n * The scope of this destruction depends on where `DestroyRef` is injected. If `DestroyRef`\n * is injected in a component or directive, the callbacks run when that component or\n * directive is destroyed. Otherwise the callbacks run when a corresponding injector is destroyed.\n *\n * @publicApi\n */\nexport abstract class DestroyRef {\n  // Here the `DestroyRef` acts primarily as a DI token. There are (currently) types of objects that\n  // can be returned from the injector when asking for this token:\n  // - `NodeInjectorDestroyRef` when retrieved from a node injector;\n  // - `EnvironmentInjector` when retrieved from an environment injector\n\n  /**\n   * Registers a destroy callback in a given lifecycle scope.  Returns a cleanup function that can\n   * be invoked to unregister the callback.\n   *\n   * @usageNotes\n   * ### Example\n   * ```ts\n   * const destroyRef = inject(DestroyRef);\n   *\n   * // register a destroy callback\n   * const unregisterFn = destroyRef.onDestroy(() => doSomethingOnDestroy());\n   *\n   * // stop the destroy callback from executing if needed\n   * unregisterFn();\n   * ```\n   */\n  abstract onDestroy(callback: () => void): () => void;\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ELEMENT_ID__: () => DestroyRef = injectDestroyRef;\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ENV_ID__: (injector: EnvironmentInjector) => DestroyRef = (injector) => injector;\n}\n\nexport class NodeInjectorDestroyRef extends DestroyRef {\n  constructor(readonly _lView: LView) {\n    super();\n  }\n\n  override onDestroy(callback: () => void): () => void {\n    const lView = this._lView;\n\n    // Checking if `lView` is already destroyed before storing the `callback` enhances\n    // safety and integrity for applications.\n    // If `lView` is destroyed, we call the `callback` immediately to ensure that\n    // any necessary cleanup is handled gracefully.\n    // With this approach, we're providing better reliability in managing resources.\n    // One of the use cases is `takeUntilDestroyed`, which aims to replace `takeUntil`\n    // in existing applications. While `takeUntil` can be safely called once the view\n    // is destroyed — resulting in no errors and finalizing the subscription depending\n    // on whether a subject or replay subject is used, replacing it with\n    // `takeUntilDestroyed` introduces a breaking change, as it throws an error if\n    // the `lView` is destroyed (https://github.com/angular/angular/issues/54527).\n    if (isDestroyed(lView)) {\n      callback();\n      // We return a \"noop\" callback, which, when executed, does nothing because\n      // we haven't stored anything on the `lView`, and thus there's nothing to remove.\n      return () => {};\n    }\n\n    storeLViewOnDestroy(lView, callback);\n    return () => removeLViewOnDestroy(lView, callback);\n  }\n}\n\nfunction injectDestroyRef(): DestroyRef {\n  return new NodeInjectorDestroyRef(getLView());\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '../../di/injection_token';\n\nexport const enum NotificationSource {\n  // Change detection needs to run in order to synchronize application state\n  // with the DOM when the following notifications are received:\n  // This operation indicates that a subtree needs to be traversed during change detection.\n  MarkAncestorsForTraversal,\n  // A component/directive gets a new input.\n  SetInput,\n  // Defer block state updates need change detection to fully render the state.\n  DeferBlockStateUpdate,\n  // Debugging tools updated state and have requested change detection.\n  DebugApplyChanges,\n  // ChangeDetectorRef.markForCheck indicates the component is dirty/needs to refresh.\n  MarkForCheck,\n\n  // Bound listener callbacks execute and can update state without causing other notifications from\n  // above.\n  Listener,\n\n  // Custom elements do sometimes require checking directly.\n  CustomElement,\n\n  // The following notifications do not require views to be refreshed\n  // but we should execute render hooks:\n  // Render hooks are guaranteed to execute with the schedulers timing.\n  RenderHook,\n  // Views might be created outside and manipulated in ways that\n  // we cannot be aware of. When a view is attached, Angular now \"knows\"\n  // about it and we now know that DOM might have changed (and we should\n  // run render hooks). If the attached view is dirty, the `MarkAncestorsForTraversal`\n  // notification should also be received.\n  ViewAttached,\n  // When DOM removal happens, render hooks may be interested in the new\n  // DOM state but we do not need to refresh any views unless. If change\n  // detection is required after DOM removal, another notification should\n  // be received (i.e. `markForCheck`).\n  ViewDetachedFromDOM,\n  // Applying animations might result in new DOM state and should rerun render hooks\n  AsyncAnimationsLoaded,\n  // The scheduler is notified when a pending task is removed via the public API.\n  // This allows us to make stability async, delayed until the next application tick.\n  PendingTaskRemoved,\n  // An `effect()` outside of the view tree became dirty and might need to run.\n  RootEffect,\n  // An `effect()` within the view tree became dirty.\n  ViewEffect,\n}\n\n/**\n * Injectable that is notified when an `LView` is made aware of changes to application state.\n */\nexport abstract class ChangeDetectionScheduler {\n  abstract notify(source: NotificationSource): void;\n  abstract runningTick: boolean;\n}\n\n/** Token used to indicate if zoneless was enabled via provideZonelessChangeDetection(). */\nexport const ZONELESS_ENABLED = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'Zoneless enabled' : '',\n  {providedIn: 'root', factory: () => false},\n);\n\n/** Token used to indicate `provideExperimentalZonelessChangeDetection` was used. */\nexport const PROVIDED_ZONELESS = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'Zoneless provided' : '',\n  {providedIn: 'root', factory: () => false},\n);\n\nexport const ZONELESS_SCHEDULER_DISABLED = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'scheduler disabled' : '',\n);\n\n// TODO(atscott): Remove in v19. Scheduler should be done with runOutsideAngular.\nexport const SCHEDULE_IN_ROOT_ZONE = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'run changes outside zone in root' : '',\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {BehaviorSubject} from 'rxjs';\n\nimport {inject} from './di/injector_compatibility';\nimport {ɵɵdefineInjectable} from './di/interface/defs';\nimport {OnDestroy} from './interface/lifecycle_hooks';\nimport {\n  ChangeDetectionScheduler,\n  NotificationSource,\n} from './change_detection/scheduling/zoneless_scheduling';\n\n/**\n * Internal implementation of the pending tasks service.\n */\nexport class PendingTasksInternal implements OnDestroy {\n  private taskId = 0;\n  private pendingTasks = new Set<number>();\n  private get _hasPendingTasks() {\n    return this.hasPendingTasks.value;\n  }\n  hasPendingTasks = new BehaviorSubject<boolean>(false);\n\n  add(): number {\n    if (!this._hasPendingTasks) {\n      this.hasPendingTasks.next(true);\n    }\n    const taskId = this.taskId++;\n    this.pendingTasks.add(taskId);\n    return taskId;\n  }\n\n  has(taskId: number): boolean {\n    return this.pendingTasks.has(taskId);\n  }\n\n  remove(taskId: number): void {\n    this.pendingTasks.delete(taskId);\n    if (this.pendingTasks.size === 0 && this._hasPendingTasks) {\n      this.hasPendingTasks.next(false);\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTasks.clear();\n    if (this._hasPendingTasks) {\n      this.hasPendingTasks.next(false);\n    }\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: PendingTasksInternal,\n    providedIn: 'root',\n    factory: () => new PendingTasksInternal(),\n  });\n}\n\n/**\n * Service that keeps track of pending tasks contributing to the stableness of Angular\n * application. While several existing Angular services (ex.: `HttpClient`) will internally manage\n * tasks influencing stability, this API gives control over stability to library and application\n * developers for specific cases not covered by Angular internals.\n *\n * The concept of stability comes into play in several important scenarios:\n * - SSR process needs to wait for the application stability before serializing and sending rendered\n * HTML;\n * - tests might want to delay assertions until the application becomes stable;\n *\n * @usageNotes\n * ```ts\n * const pendingTasks = inject(PendingTasks);\n * const taskCleanup = pendingTasks.add();\n * // do work that should block application's stability and then:\n * taskCleanup();\n * ```\n *\n * @publicApi\n * @developerPreview\n */\nexport class PendingTasks {\n  private internalPendingTasks = inject(PendingTasksInternal);\n  private scheduler = inject(ChangeDetectionScheduler);\n  /**\n   * Adds a new task that should block application's stability.\n   * @returns A cleanup function that removes a task when called.\n   */\n  add(): () => void {\n    const taskId = this.internalPendingTasks.add();\n    return () => {\n      if (!this.internalPendingTasks.has(taskId)) {\n        // This pending task has already been cleared.\n        return;\n      }\n      // Notifying the scheduler will hold application stability open until the next tick.\n      this.scheduler.notify(NotificationSource.PendingTaskRemoved);\n      this.internalPendingTasks.remove(taskId);\n    };\n  }\n\n  /**\n   * Runs an asynchronous function and blocks the application's stability until the function completes.\n   *\n   * ```ts\n   * pendingTasks.run(async () => {\n   *   const userData = await fetch('/api/user');\n   *   this.userData.set(userData);\n   * });\n   * ```\n   *\n   * Application stability is at least delayed until the next tick after the `run` method resolves\n   * so it is safe to make additional updates to application state that would require UI synchronization:\n   *\n   * ```ts\n   * const userData = await pendingTasks.run(() => fetch('/api/user'));\n   * this.userData.set(userData);\n   * ```\n   *\n   * @param fn The asynchronous function to execute\n   */\n  async run<T>(fn: () => Promise<T>): Promise<T> {\n    const removeTask = this.add();\n    try {\n      return await fn();\n    } finally {\n      removeTask();\n    }\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: PendingTasks,\n    providedIn: 'root',\n    factory: () => new PendingTasks(),\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../primitives/signals';\nimport {PartialObserver, Subject, Subscription} from 'rxjs';\n\nimport {OutputRef} from './authoring/output/output_ref';\nimport {isInInjectionContext} from './di/contextual';\nimport {inject} from './di/injector_compatibility';\nimport {DestroyRef} from './linker/destroy_ref';\nimport {PendingTasksInternal} from './pending_tasks';\n\n/**\n * Use in components with the `@Output` directive to emit custom events\n * synchronously or asynchronously, and register handlers for those events\n * by subscribing to an instance.\n *\n * @usageNotes\n *\n * Extends\n * [RxJS `Subject`](https://rxjs.dev/api/index/class/Subject)\n * for Angular by adding the `emit()` method.\n *\n * In the following example, a component defines two output properties\n * that create event emitters. When the title is clicked, the emitter\n * emits an open or close event to toggle the current visibility state.\n *\n * ```angular-ts\n * @Component({\n *   selector: 'zippy',\n *   template: `\n *   <div class=\"zippy\">\n *     <div (click)=\"toggle()\">Toggle</div>\n *     <div [hidden]=\"!visible\">\n *       <ng-content></ng-content>\n *     </div>\n *  </div>`})\n * export class Zippy {\n *   visible: boolean = true;\n *   @Output() open: EventEmitter<any> = new EventEmitter();\n *   @Output() close: EventEmitter<any> = new EventEmitter();\n *\n *   toggle() {\n *     this.visible = !this.visible;\n *     if (this.visible) {\n *       this.open.emit(null);\n *     } else {\n *       this.close.emit(null);\n *     }\n *   }\n * }\n * ```\n *\n * Access the event object with the `$event` argument passed to the output event\n * handler:\n *\n * ```html\n * <zippy (open)=\"onOpen($event)\" (close)=\"onClose($event)\"></zippy>\n * ```\n *\n * @publicApi\n */\nexport interface EventEmitter<T> extends Subject<T>, OutputRef<T> {\n  /**\n   * @internal\n   */\n  __isAsync: boolean;\n\n  /**\n   * Creates an instance of this class that can\n   * deliver events synchronously or asynchronously.\n   *\n   * @param [isAsync=false] When true, deliver events asynchronously.\n   *\n   */\n  new (isAsync?: boolean): EventEmitter<T>;\n\n  /**\n   * Emits an event containing a given value.\n   * @param value The value to emit.\n   */\n  emit(value?: T): void;\n\n  /**\n   * Registers handlers for events emitted by this instance.\n   * @param next When supplied, a custom handler for emitted events.\n   * @param error When supplied, a custom handler for an error notification from this emitter.\n   * @param complete When supplied, a custom handler for a completion notification from this\n   *     emitter.\n   */\n  subscribe(\n    next?: (value: T) => void,\n    error?: (error: any) => void,\n    complete?: () => void,\n  ): Subscription;\n  /**\n   * Registers handlers for events emitted by this instance.\n   * @param observerOrNext When supplied, a custom handler for emitted events, or an observer\n   *     object.\n   * @param error When supplied, a custom handler for an error notification from this emitter.\n   * @param complete When supplied, a custom handler for a completion notification from this\n   *     emitter.\n   */\n  subscribe(observerOrNext?: any, error?: any, complete?: any): Subscription;\n}\n\nclass EventEmitter_ extends Subject<any> implements OutputRef<any> {\n  // tslint:disable-next-line:require-internal-with-underscore\n  __isAsync: boolean;\n  destroyRef: DestroyRef | undefined = undefined;\n  private readonly pendingTasks: PendingTasksInternal | undefined = undefined;\n\n  constructor(isAsync: boolean = false) {\n    super();\n    this.__isAsync = isAsync;\n\n    // Attempt to retrieve a `DestroyRef` and `PendingTasks` optionally.\n    // For backwards compatibility reasons, this cannot be required.\n    if (isInInjectionContext()) {\n      // `DestroyRef` is optional because it is not available in all contexts.\n      // But it is useful to properly complete the `EventEmitter` if used with `outputToObservable`\n      // when the component/directive is destroyed. (See `outputToObservable` for more details.)\n      this.destroyRef = inject(DestroyRef, {optional: true}) ?? undefined;\n      this.pendingTasks = inject(PendingTasksInternal, {optional: true}) ?? undefined;\n    }\n  }\n\n  emit(value?: any) {\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      super.next(value);\n    } finally {\n      setActiveConsumer(prevConsumer);\n    }\n  }\n\n  override subscribe(observerOrNext?: any, error?: any, complete?: any): Subscription {\n    let nextFn = observerOrNext;\n    let errorFn = error || (() => null);\n    let completeFn = complete;\n\n    if (observerOrNext && typeof observerOrNext === 'object') {\n      const observer = observerOrNext as PartialObserver<unknown>;\n      nextFn = observer.next?.bind(observer);\n      errorFn = observer.error?.bind(observer);\n      completeFn = observer.complete?.bind(observer);\n    }\n\n    if (this.__isAsync) {\n      errorFn = this.wrapInTimeout(errorFn);\n\n      if (nextFn) {\n        nextFn = this.wrapInTimeout(nextFn);\n      }\n\n      if (completeFn) {\n        completeFn = this.wrapInTimeout(completeFn);\n      }\n    }\n\n    const sink = super.subscribe({next: nextFn, error: errorFn, complete: completeFn});\n\n    if (observerOrNext instanceof Subscription) {\n      observerOrNext.add(sink);\n    }\n\n    return sink;\n  }\n\n  private wrapInTimeout(fn: (value: unknown) => any) {\n    return (value: unknown) => {\n      const taskId = this.pendingTasks?.add();\n      setTimeout(() => {\n        try {\n          fn(value);\n        } finally {\n          if (taskId !== undefined) {\n            this.pendingTasks?.remove(taskId);\n          }\n        }\n      });\n    };\n  }\n}\n\n/**\n * @publicApi\n */\nexport const EventEmitter: {\n  new (isAsync?: boolean): EventEmitter<any>;\n  new <T>(isAsync?: boolean): EventEmitter<T>;\n  readonly prototype: EventEmitter<any>;\n} = EventEmitter_ as any;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport function noop(...args: any[]): any {\n  // Do nothing.\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {noop} from './noop';\n\n/**\n * Gets a scheduling function that runs the callback after the first of setTimeout and\n * requestAnimationFrame resolves.\n *\n * - `requestAnimationFrame` ensures that change detection runs ahead of a browser repaint.\n * This ensures that the create and update passes of a change detection always happen\n * in the same frame.\n * - When the browser is resource-starved, `rAF` can execute _before_ a `setTimeout` because\n * rendering is a very high priority process. This means that `setTimeout` cannot guarantee\n * same-frame create and update pass, when `setTimeout` is used to schedule the update phase.\n * - While `rAF` gives us the desirable same-frame updates, it has two limitations that\n * prevent it from being used alone. First, it does not run in background tabs, which would\n * prevent Angular from initializing an application when opened in a new tab (for example).\n * Second, repeated calls to requestAnimationFrame will execute at the refresh rate of the\n * hardware (~16ms for a 60Hz display). This would cause significant slowdown of tests that\n * are written with several updates and asserts in the form of \"update; await stable; assert;\".\n * - Both `setTimeout` and `rAF` are able to \"coalesce\" several events from a single user\n * interaction into a single change detection. Importantly, this reduces view tree traversals when\n * compared to an alternative timing mechanism like `queueMicrotask`, where change detection would\n * then be interleaves between each event.\n *\n * By running change detection after the first of `setTimeout` and `rAF` to execute, we get the\n * best of both worlds.\n *\n * @returns a function to cancel the scheduled callback\n */\nexport function scheduleCallbackWithRafRace(callback: Function): () => void {\n  let timeoutId: number;\n  let animationFrameId: number;\n  function cleanup() {\n    callback = noop;\n    try {\n      if (animationFrameId !== undefined && typeof cancelAnimationFrame === 'function') {\n        cancelAnimationFrame(animationFrameId);\n      }\n      if (timeoutId !== undefined) {\n        clearTimeout(timeoutId);\n      }\n    } catch {\n      // Clearing/canceling can fail in tests due to the timing of functions being patched and unpatched\n      // Just ignore the errors - we protect ourselves from this issue by also making the callback a no-op.\n    }\n  }\n  timeoutId = setTimeout(() => {\n    callback();\n    cleanup();\n  }) as unknown as number;\n  if (typeof requestAnimationFrame === 'function') {\n    animationFrameId = requestAnimationFrame(() => {\n      callback();\n      cleanup();\n    });\n  }\n\n  return () => cleanup();\n}\n\nexport function scheduleCallbackWithMicrotask(callback: Function): () => void {\n  queueMicrotask(() => callback());\n\n  return () => {\n    callback = noop;\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\ninterface ConsoleWithAsyncTagging {\n  createTask(name: string): ConsoleTask;\n}\n\ninterface ConsoleTask {\n  run<T>(f: () => T): T;\n}\n\ninterface ZoneConsoleTask extends Task {\n  consoleTask?: ConsoleTask;\n}\n\nexport class AsyncStackTaggingZoneSpec implements ZoneSpec {\n  createTask: ConsoleWithAsyncTagging['createTask'];\n\n  constructor(\n    namePrefix: string,\n    consoleAsyncStackTaggingImpl: ConsoleWithAsyncTagging = console as any,\n  ) {\n    this.name = 'asyncStackTagging for ' + namePrefix;\n    this.createTask = consoleAsyncStackTaggingImpl?.createTask ?? (() => null);\n  }\n\n  // ZoneSpec implementation below.\n  name: string;\n\n  onScheduleTask(\n    delegate: ZoneDelegate,\n    _current: Zone,\n    target: Zone,\n    task: ZoneConsoleTask,\n  ): Task {\n    task.consoleTask = this.createTask(`Zone - ${task.source || task.type}`);\n    return delegate.scheduleTask(target, task);\n  }\n\n  onInvokeTask(\n    delegate: ZoneDelegate,\n    _currentZone: Zone,\n    targetZone: Zone,\n    task: ZoneConsoleTask,\n    applyThis: any,\n    applyArgs?: any[],\n  ) {\n    let ret;\n    if (task.consoleTask) {\n      ret = task.consoleTask.run(() => delegate.invokeTask(targetZone, task, applyThis, applyArgs));\n    } else {\n      ret = delegate.invokeTask(targetZone, task, applyThis, applyArgs);\n    }\n    return ret;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// Needed for the global `Zone` ambient types to be available.\nimport type {} from 'zone.js';\n\nimport {SCHEDULE_IN_ROOT_ZONE_DEFAULT} from '../change_detection/scheduling/flags';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {EventEmitter} from '../event_emitter';\nimport {scheduleCallbackWithRafRace} from '../util/callback_scheduler';\nimport {noop} from '../util/noop';\n\nimport {AsyncStackTaggingZoneSpec} from './async-stack-tagging';\n\n// The below is needed as otherwise a number of targets fail in G3 due to:\n// ERROR - [JSC_UNDEFINED_VARIABLE] variable Zone is undeclared\ndeclare const Zone: any;\n\nconst isAngularZoneProperty = 'isAngularZone';\nexport const angularZoneInstanceIdProperty = isAngularZoneProperty + '_ID';\n\nlet ngZoneInstanceId = 0;\n\n/**\n * An injectable service for executing work inside or outside of the Angular zone.\n *\n * The most common use of this service is to optimize performance when starting a work consisting of\n * one or more asynchronous tasks that don't require UI updates or error handling to be handled by\n * Angular. Such tasks can be kicked off via {@link #runOutsideAngular} and if needed, these tasks\n * can reenter the Angular zone via {@link #run}.\n *\n * <!-- TODO: add/fix links to:\n *   - docs explaining zones and the use of zones in Angular and change-detection\n *   - link to runOutsideAngular/run (throughout this file!)\n *   -->\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * import {Component, NgZone} from '@angular/core';\n * import {NgIf} from '@angular/common';\n *\n * @Component({\n *   selector: 'ng-zone-demo',\n *   template: `\n *     <h2>Demo: NgZone</h2>\n *\n *     <p>Progress: {{progress}}%</p>\n *     <p *ngIf=\"progress >= 100\">Done processing {{label}} of Angular zone!</p>\n *\n *     <button (click)=\"processWithinAngularZone()\">Process within Angular zone</button>\n *     <button (click)=\"processOutsideOfAngularZone()\">Process outside of Angular zone</button>\n *   `,\n * })\n * export class NgZoneDemo {\n *   progress: number = 0;\n *   label: string;\n *\n *   constructor(private _ngZone: NgZone) {}\n *\n *   // Loop inside the Angular zone\n *   // so the UI DOES refresh after each setTimeout cycle\n *   processWithinAngularZone() {\n *     this.label = 'inside';\n *     this.progress = 0;\n *     this._increaseProgress(() => console.log('Inside Done!'));\n *   }\n *\n *   // Loop outside of the Angular zone\n *   // so the UI DOES NOT refresh after each setTimeout cycle\n *   processOutsideOfAngularZone() {\n *     this.label = 'outside';\n *     this.progress = 0;\n *     this._ngZone.runOutsideAngular(() => {\n *       this._increaseProgress(() => {\n *         // reenter the Angular zone and display done\n *         this._ngZone.run(() => { console.log('Outside Done!'); });\n *       });\n *     });\n *   }\n *\n *   _increaseProgress(doneCallback: () => void) {\n *     this.progress += 1;\n *     console.log(`Current progress: ${this.progress}%`);\n *\n *     if (this.progress < 100) {\n *       window.setTimeout(() => this._increaseProgress(doneCallback), 10);\n *     } else {\n *       doneCallback();\n *     }\n *   }\n * }\n * ```\n *\n * @publicApi\n */\nexport class NgZone {\n  readonly hasPendingMacrotasks: boolean = false;\n  readonly hasPendingMicrotasks: boolean = false;\n\n  /**\n   * Whether there are no outstanding microtasks or macrotasks.\n   */\n  readonly isStable: boolean = true;\n\n  /**\n   * Notifies when code enters Angular Zone. This gets fired first on VM Turn.\n   */\n  readonly onUnstable: EventEmitter<any> = new EventEmitter(false);\n\n  /**\n   * Notifies when there is no more microtasks enqueued in the current VM Turn.\n   * This is a hint for Angular to do change detection, which may enqueue more microtasks.\n   * For this reason this event can fire multiple times per VM Turn.\n   */\n  readonly onMicrotaskEmpty: EventEmitter<any> = new EventEmitter(false);\n\n  /**\n   * Notifies when the last `onMicrotaskEmpty` has run and there are no more microtasks, which\n   * implies we are about to relinquish VM turn.\n   * This event gets called just once.\n   */\n  readonly onStable: EventEmitter<any> = new EventEmitter(false);\n\n  /**\n   * Notifies that an error has been delivered.\n   */\n  readonly onError: EventEmitter<any> = new EventEmitter(false);\n\n  constructor(options: {\n    enableLongStackTrace?: boolean;\n    shouldCoalesceEventChangeDetection?: boolean;\n    shouldCoalesceRunChangeDetection?: boolean;\n  }) {\n    const {\n      enableLongStackTrace = false,\n      shouldCoalesceEventChangeDetection = false,\n      shouldCoalesceRunChangeDetection = false,\n      scheduleInRootZone = SCHEDULE_IN_ROOT_ZONE_DEFAULT,\n    } = options as InternalNgZoneOptions;\n\n    if (typeof Zone == 'undefined') {\n      throw new RuntimeError(\n        RuntimeErrorCode.MISSING_ZONEJS,\n        ngDevMode && `In this configuration Angular requires Zone.js`,\n      );\n    }\n\n    Zone.assertZonePatched();\n    const self = this as any as NgZonePrivate;\n    self._nesting = 0;\n\n    self._outer = self._inner = Zone.current;\n\n    // AsyncStackTaggingZoneSpec provides `linked stack traces` to show\n    // where the async operation is scheduled. For more details, refer\n    // to this article, https://developer.chrome.com/blog/devtools-better-angular-debugging/\n    // And we only import this AsyncStackTaggingZoneSpec in development mode,\n    // in the production mode, the AsyncStackTaggingZoneSpec will be tree shaken away.\n    if (ngDevMode) {\n      self._inner = self._inner.fork(new AsyncStackTaggingZoneSpec('Angular'));\n    }\n\n    if ((Zone as any)['TaskTrackingZoneSpec']) {\n      self._inner = self._inner.fork(new ((Zone as any)['TaskTrackingZoneSpec'] as any)());\n    }\n\n    if (enableLongStackTrace && (Zone as any)['longStackTraceZoneSpec']) {\n      self._inner = self._inner.fork((Zone as any)['longStackTraceZoneSpec']);\n    }\n    // if shouldCoalesceRunChangeDetection is true, all tasks including event tasks will be\n    // coalesced, so shouldCoalesceEventChangeDetection option is not necessary and can be skipped.\n    self.shouldCoalesceEventChangeDetection =\n      !shouldCoalesceRunChangeDetection && shouldCoalesceEventChangeDetection;\n    self.shouldCoalesceRunChangeDetection = shouldCoalesceRunChangeDetection;\n    self.callbackScheduled = false;\n    self.scheduleInRootZone = scheduleInRootZone;\n    forkInnerZoneWithAngularBehavior(self);\n  }\n\n  /**\n    This method checks whether the method call happens within an Angular Zone instance.\n  */\n  static isInAngularZone(): boolean {\n    // Zone needs to be checked, because this method might be called even when NoopNgZone is used.\n    return typeof Zone !== 'undefined' && Zone.current.get(isAngularZoneProperty) === true;\n  }\n\n  /**\n    Assures that the method is called within the Angular Zone, otherwise throws an error.\n  */\n  static assertInAngularZone(): void {\n    if (!NgZone.isInAngularZone()) {\n      throw new RuntimeError(\n        RuntimeErrorCode.UNEXPECTED_ZONE_STATE,\n        ngDevMode && 'Expected to be in Angular Zone, but it is not!',\n      );\n    }\n  }\n\n  /**\n    Assures that the method is called outside of the Angular Zone, otherwise throws an error.\n  */\n  static assertNotInAngularZone(): void {\n    if (NgZone.isInAngularZone()) {\n      throw new RuntimeError(\n        RuntimeErrorCode.UNEXPECTED_ZONE_STATE,\n        ngDevMode && 'Expected to not be in Angular Zone, but it is!',\n      );\n    }\n  }\n\n  /**\n   * Executes the `fn` function synchronously within the Angular zone and returns value returned by\n   * the function.\n   *\n   * Running functions via `run` allows you to reenter Angular zone from a task that was executed\n   * outside of the Angular zone (typically started via {@link #runOutsideAngular}).\n   *\n   * Any future tasks or microtasks scheduled from within this function will continue executing from\n   * within the Angular zone.\n   *\n   * If a synchronous error happens it will be rethrown and not reported via `onError`.\n   */\n  run<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any[]): T {\n    return (this as any as NgZonePrivate)._inner.run(fn, applyThis, applyArgs);\n  }\n\n  /**\n   * Executes the `fn` function synchronously within the Angular zone as a task and returns value\n   * returned by the function.\n   *\n   * Running functions via `runTask` allows you to reenter Angular zone from a task that was executed\n   * outside of the Angular zone (typically started via {@link #runOutsideAngular}).\n   *\n   * Any future tasks or microtasks scheduled from within this function will continue executing from\n   * within the Angular zone.\n   *\n   * If a synchronous error happens it will be rethrown and not reported via `onError`.\n   */\n  runTask<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any[], name?: string): T {\n    const zone = (this as any as NgZonePrivate)._inner;\n    const task = zone.scheduleEventTask('NgZoneEvent: ' + name, fn, EMPTY_PAYLOAD, noop, noop);\n    try {\n      return zone.runTask(task, applyThis, applyArgs);\n    } finally {\n      zone.cancelTask(task);\n    }\n  }\n\n  /**\n   * Same as `run`, except that synchronous errors are caught and forwarded via `onError` and not\n   * rethrown.\n   */\n  runGuarded<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any[]): T {\n    return (this as any as NgZonePrivate)._inner.runGuarded(fn, applyThis, applyArgs);\n  }\n\n  /**\n   * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by\n   * the function.\n   *\n   * Running functions via {@link #runOutsideAngular} allows you to escape Angular's zone and do\n   * work that\n   * doesn't trigger Angular change-detection or is subject to Angular's error handling.\n   *\n   * Any future tasks or microtasks scheduled from within this function will continue executing from\n   * outside of the Angular zone.\n   *\n   * Use {@link #run} to reenter the Angular zone and do work that updates the application model.\n   */\n  runOutsideAngular<T>(fn: (...args: any[]) => T): T {\n    return (this as any as NgZonePrivate)._outer.run(fn);\n  }\n}\n\nconst EMPTY_PAYLOAD = {};\n\nexport interface NgZonePrivate extends NgZone {\n  _outer: Zone;\n  _inner: Zone;\n  _nesting: number;\n  _hasPendingMicrotasks: boolean;\n\n  hasPendingMacrotasks: boolean;\n  hasPendingMicrotasks: boolean;\n  callbackScheduled: boolean;\n  /**\n   * A flag to indicate if NgZone is currently inside\n   * checkStable and to prevent re-entry. The flag is\n   * needed because it is possible to invoke the change\n   * detection from within change detection leading to\n   * incorrect behavior.\n   *\n   * For detail, please refer here,\n   * https://github.com/angular/angular/pull/40540\n   */\n  isCheckStableRunning: boolean;\n  isStable: boolean;\n  /**\n   * Optionally specify coalescing event change detections or not.\n   * Consider the following case.\n   *\n   * <div (click)=\"doSomething()\">\n   *   <button (click)=\"doSomethingElse()\"></button>\n   * </div>\n   *\n   * When button is clicked, because of the event bubbling, both\n   * event handlers will be called and 2 change detections will be\n   * triggered. We can coalesce such kind of events to trigger\n   * change detection only once.\n   *\n   * By default, this option will be false. So the events will not be\n   * coalesced and the change detection will be triggered multiple times.\n   * And if this option be set to true, the change detection will be\n   * triggered async by scheduling it in an animation frame. So in the case above,\n   * the change detection will only be trigged once.\n   */\n  shouldCoalesceEventChangeDetection: boolean;\n  /**\n   * Optionally specify if `NgZone#run()` method invocations should be coalesced\n   * into a single change detection.\n   *\n   * Consider the following case.\n   *\n   * for (let i = 0; i < 10; i ++) {\n   *   ngZone.run(() => {\n   *     // do something\n   *   });\n   * }\n   *\n   * This case triggers the change detection multiple times.\n   * With ngZoneRunCoalescing options, all change detections in an event loops trigger only once.\n   * In addition, the change detection executes in requestAnimation.\n   *\n   */\n  shouldCoalesceRunChangeDetection: boolean;\n\n  /**\n   * Whether to schedule the coalesced change detection in the root zone\n   */\n  scheduleInRootZone: boolean;\n}\n\nfunction checkStable(zone: NgZonePrivate) {\n  // TODO: @JiaLiPassion, should check zone.isCheckStableRunning to prevent\n  // re-entry. The case is:\n  //\n  // @Component({...})\n  // export class AppComponent {\n  // constructor(private ngZone: NgZone) {\n  //   this.ngZone.onStable.subscribe(() => {\n  //     this.ngZone.run(() => console.log('stable'););\n  //   });\n  // }\n  //\n  // The onStable subscriber run another function inside ngZone\n  // which causes `checkStable()` re-entry.\n  // But this fix causes some issues in g3, so this fix will be\n  // launched in another PR.\n  if (zone._nesting == 0 && !zone.hasPendingMicrotasks && !zone.isStable) {\n    try {\n      zone._nesting++;\n      zone.onMicrotaskEmpty.emit(null);\n    } finally {\n      zone._nesting--;\n      if (!zone.hasPendingMicrotasks) {\n        try {\n          zone.runOutsideAngular(() => zone.onStable.emit(null));\n        } finally {\n          zone.isStable = true;\n        }\n      }\n    }\n  }\n}\n\nfunction delayChangeDetectionForEvents(zone: NgZonePrivate) {\n  /**\n   * We also need to check _nesting here\n   * Consider the following case with shouldCoalesceRunChangeDetection = true\n   *\n   * ngZone.run(() => {});\n   * ngZone.run(() => {});\n   *\n   * We want the two `ngZone.run()` only trigger one change detection\n   * when shouldCoalesceRunChangeDetection is true.\n   * And because in this case, change detection run in async way(requestAnimationFrame),\n   * so we also need to check the _nesting here to prevent multiple\n   * change detections.\n   */\n  if (zone.isCheckStableRunning || zone.callbackScheduled) {\n    return;\n  }\n  zone.callbackScheduled = true;\n  function scheduleCheckStable() {\n    scheduleCallbackWithRafRace(() => {\n      zone.callbackScheduled = false;\n      updateMicroTaskStatus(zone);\n      zone.isCheckStableRunning = true;\n      checkStable(zone);\n      zone.isCheckStableRunning = false;\n    });\n  }\n  if (zone.scheduleInRootZone) {\n    Zone.root.run(() => {\n      scheduleCheckStable();\n    });\n  } else {\n    zone._outer.run(() => {\n      scheduleCheckStable();\n    });\n  }\n  updateMicroTaskStatus(zone);\n}\n\nfunction forkInnerZoneWithAngularBehavior(zone: NgZonePrivate) {\n  const delayChangeDetectionForEventsDelegate = () => {\n    delayChangeDetectionForEvents(zone);\n  };\n  const instanceId = ngZoneInstanceId++;\n  zone._inner = zone._inner.fork({\n    name: 'angular',\n    properties: <any>{\n      [isAngularZoneProperty]: true,\n      [angularZoneInstanceIdProperty]: instanceId,\n      [angularZoneInstanceIdProperty + instanceId]: true,\n    },\n    onInvokeTask: (\n      delegate: ZoneDelegate,\n      current: Zone,\n      target: Zone,\n      task: Task,\n      applyThis: any,\n      applyArgs: any,\n    ): any => {\n      // Prevent triggering change detection when the flag is detected.\n      if (shouldBeIgnoredByZone(applyArgs)) {\n        return delegate.invokeTask(target, task, applyThis, applyArgs);\n      }\n\n      try {\n        onEnter(zone);\n        return delegate.invokeTask(target, task, applyThis, applyArgs);\n      } finally {\n        if (\n          (zone.shouldCoalesceEventChangeDetection && task.type === 'eventTask') ||\n          zone.shouldCoalesceRunChangeDetection\n        ) {\n          delayChangeDetectionForEventsDelegate();\n        }\n        onLeave(zone);\n      }\n    },\n\n    onInvoke: (\n      delegate: ZoneDelegate,\n      current: Zone,\n      target: Zone,\n      callback: Function,\n      applyThis: any,\n      applyArgs?: any[],\n      source?: string,\n    ): any => {\n      try {\n        onEnter(zone);\n        return delegate.invoke(target, callback, applyThis, applyArgs, source);\n      } finally {\n        if (\n          zone.shouldCoalesceRunChangeDetection &&\n          // Do not delay change detection when the task is the scheduler's tick.\n          // We need to synchronously trigger the stability logic so that the\n          // zone-based scheduler can prevent a duplicate ApplicationRef.tick\n          // by first checking if the scheduler tick is running. This does seem a bit roundabout,\n          // but we _do_ still want to trigger all the correct events when we exit the zone.run\n          // (`onMicrotaskEmpty` and `onStable` _should_ emit; developers can have code which\n          // relies on these events happening after change detection runs).\n          // Note: `zone.callbackScheduled` is already in delayChangeDetectionForEventsDelegate\n          // but is added here as well to prevent reads of applyArgs when not necessary\n          !zone.callbackScheduled &&\n          !isSchedulerTick(applyArgs)\n        ) {\n          delayChangeDetectionForEventsDelegate();\n        }\n        onLeave(zone);\n      }\n    },\n\n    onHasTask: (\n      delegate: ZoneDelegate,\n      current: Zone,\n      target: Zone,\n      hasTaskState: HasTaskState,\n    ) => {\n      delegate.hasTask(target, hasTaskState);\n      if (current === target) {\n        // We are only interested in hasTask events which originate from our zone\n        // (A child hasTask event is not interesting to us)\n        if (hasTaskState.change == 'microTask') {\n          zone._hasPendingMicrotasks = hasTaskState.microTask;\n          updateMicroTaskStatus(zone);\n          checkStable(zone);\n        } else if (hasTaskState.change == 'macroTask') {\n          zone.hasPendingMacrotasks = hasTaskState.macroTask;\n        }\n      }\n    },\n\n    onHandleError: (delegate: ZoneDelegate, current: Zone, target: Zone, error: any): boolean => {\n      delegate.handleError(target, error);\n      zone.runOutsideAngular(() => zone.onError.emit(error));\n      return false;\n    },\n  });\n}\n\nfunction updateMicroTaskStatus(zone: NgZonePrivate) {\n  if (\n    zone._hasPendingMicrotasks ||\n    ((zone.shouldCoalesceEventChangeDetection || zone.shouldCoalesceRunChangeDetection) &&\n      zone.callbackScheduled === true)\n  ) {\n    zone.hasPendingMicrotasks = true;\n  } else {\n    zone.hasPendingMicrotasks = false;\n  }\n}\n\nfunction onEnter(zone: NgZonePrivate) {\n  zone._nesting++;\n  if (zone.isStable) {\n    zone.isStable = false;\n    zone.onUnstable.emit(null);\n  }\n}\n\nfunction onLeave(zone: NgZonePrivate) {\n  zone._nesting--;\n  checkStable(zone);\n}\n\n/**\n * Provides a noop implementation of `NgZone` which does nothing. This zone requires explicit calls\n * to framework to perform rendering.\n */\nexport class NoopNgZone implements NgZone {\n  readonly hasPendingMicrotasks = false;\n  readonly hasPendingMacrotasks = false;\n  readonly isStable = true;\n  readonly onUnstable = new EventEmitter<any>();\n  readonly onMicrotaskEmpty = new EventEmitter<any>();\n  readonly onStable = new EventEmitter<any>();\n  readonly onError = new EventEmitter<any>();\n\n  run<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any): T {\n    return fn.apply(applyThis, applyArgs);\n  }\n\n  runGuarded<T>(fn: (...args: any[]) => any, applyThis?: any, applyArgs?: any): T {\n    return fn.apply(applyThis, applyArgs);\n  }\n\n  runOutsideAngular<T>(fn: (...args: any[]) => T): T {\n    return fn();\n  }\n\n  runTask<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any, name?: string): T {\n    return fn.apply(applyThis, applyArgs);\n  }\n}\n\nfunction shouldBeIgnoredByZone(applyArgs: unknown): boolean {\n  return hasApplyArgsData(applyArgs, '__ignore_ng_zone__');\n}\n\nfunction isSchedulerTick(applyArgs: unknown): boolean {\n  return hasApplyArgsData(applyArgs, '__scheduler_tick__');\n}\n\nfunction hasApplyArgsData(applyArgs: unknown, key: string) {\n  if (!Array.isArray(applyArgs)) {\n    return false;\n  }\n\n  // We should only ever get 1 arg passed through to invokeTask.\n  // Short circuit here incase that behavior changes.\n  if (applyArgs.length !== 1) {\n    return false;\n  }\n\n  return applyArgs[0]?.data?.[key] === true;\n}\n\n// Set of options recognized by the NgZone.\nexport interface InternalNgZoneOptions {\n  enableLongStackTrace?: boolean;\n  shouldCoalesceEventChangeDetection?: boolean;\n  shouldCoalesceRunChangeDetection?: boolean;\n  scheduleInRootZone?: boolean;\n}\n\nexport function getNgZone(\n  ngZoneToUse: NgZone | 'zone.js' | 'noop' = 'zone.js',\n  options: InternalNgZoneOptions,\n): NgZone {\n  if (ngZoneToUse === 'noop') {\n    return new NoopNgZone();\n  }\n  if (ngZoneToUse === 'zone.js') {\n    return new NgZone(options);\n  }\n  return ngZoneToUse;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, InjectionToken} from './di';\nimport {NgZone} from './zone';\n\n/**\n * Provides a hook for centralized exception handling.\n *\n * The default implementation of `ErrorHandler` prints error messages to the `console`. To\n * intercept error handling, write a custom exception handler that replaces this default as\n * appropriate for your app.\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * class MyErrorHandler implements ErrorHandler {\n *   handleError(error) {\n *     // do something with the exception\n *   }\n * }\n *\n * // Provide in standalone apps\n * bootstrapApplication(AppComponent, {\n *   providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]\n * })\n *\n * // Provide in module-based apps\n * @NgModule({\n *   providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]\n * })\n * class MyModule {}\n * ```\n *\n * @publicApi\n */\nexport class ErrorHandler {\n  /**\n   * @internal\n   */\n  _console: Console = console;\n\n  handleError(error: any): void {\n    this._console.error('ERROR', error);\n  }\n}\n\n/**\n * `InjectionToken` used to configure how to call the `ErrorHandler`.\n *\n * `NgZone` is provided by default today so the default (and only) implementation for this\n * is calling `ErrorHandler.handleError` outside of the Angular zone.\n */\nexport const INTERNAL_APPLICATION_ERROR_HANDLER = new InjectionToken<(e: any) => void>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'internal error handler' : '',\n  {\n    providedIn: 'root',\n    factory: () => {\n      const zone = inject(NgZone);\n      const userErrorHandler = inject(ErrorHandler);\n      return (e: unknown) => zone.runOutsideAngular(() => userErrorHandler.handleError(e));\n    },\n  },\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../../primitives/signals';\n\nimport {inject} from '../../di/injector_compatibility';\nimport {ErrorHandler} from '../../error_handler';\nimport {formatRuntimeError, RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {DestroyRef} from '../../linker/destroy_ref';\n\nimport {OutputRef, OutputRefSubscription} from './output_ref';\n\n/**\n * An `OutputEmitterRef` is created by the `output()` function and can be\n * used to emit values to consumers of your directive or component.\n *\n * Consumers of your directive/component can bind to the output and\n * subscribe to changes via the bound event syntax. For example:\n *\n * ```html\n * <my-comp (valueChange)=\"processNewValue($event)\" />\n * ```\n *\n * @publicAPI\n */\nexport class OutputEmitterRef<T> implements OutputRef<T> {\n  private destroyed = false;\n  private listeners: Array<(value: T) => void> | null = null;\n  private errorHandler = inject(ErrorHandler, {optional: true});\n\n  /** @internal */\n  destroyRef: DestroyRef = inject(DestroyRef);\n\n  constructor() {\n    // Clean-up all listeners and mark as destroyed upon destroy.\n    this.destroyRef.onDestroy(() => {\n      this.destroyed = true;\n      this.listeners = null;\n    });\n  }\n\n  subscribe(callback: (value: T) => void): OutputRefSubscription {\n    if (this.destroyed) {\n      throw new RuntimeError(\n        RuntimeErrorCode.OUTPUT_REF_DESTROYED,\n        ngDevMode &&\n          'Unexpected subscription to destroyed `OutputRef`. ' +\n            'The owning directive/component is destroyed.',\n      );\n    }\n\n    (this.listeners ??= []).push(callback);\n\n    return {\n      unsubscribe: () => {\n        const idx = this.listeners?.indexOf(callback);\n        if (idx !== undefined && idx !== -1) {\n          this.listeners?.splice(idx, 1);\n        }\n      },\n    };\n  }\n\n  /** Emits a new value to the output. */\n  emit(value: T): void {\n    if (this.destroyed) {\n      console.warn(\n        formatRuntimeError(\n          RuntimeErrorCode.OUTPUT_REF_DESTROYED,\n          ngDevMode &&\n            'Unexpected emit for destroyed `OutputRef`. ' +\n              'The owning directive/component is destroyed.',\n        ),\n      );\n      return;\n    }\n\n    if (this.listeners === null) {\n      return;\n    }\n\n    const previousConsumer = setActiveConsumer(null);\n    try {\n      for (const listenerFn of this.listeners) {\n        try {\n          listenerFn(value);\n        } catch (err: unknown) {\n          this.errorHandler?.handleError(err);\n        }\n      }\n    } finally {\n      setActiveConsumer(previousConsumer);\n    }\n  }\n}\n\n/** Gets the owning `DestroyRef` for the given output. */\nexport function getOutputDestroyRef(ref: OutputRef<unknown>): DestroyRef | undefined {\n  return ref.destroyRef;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertInInjectionContext} from '../../di';\n\nimport {OutputEmitterRef} from './output_emitter_ref';\n\n/**\n * Options for declaring an output.\n *\n * @publicAPI\n */\nexport interface OutputOptions {\n  alias?: string;\n}\n\n/**\n * The `output` function allows declaration of Angular outputs in\n * directives and components.\n *\n * You can use outputs to emit values to parent directives and component.\n * Parents can subscribe to changes via:\n *\n * - template event bindings. For example, `(myOutput)=\"doSomething($event)\"`\n * - programmatic subscription by using `OutputRef#subscribe`.\n *\n * @usageNotes\n *\n * To use `output()`, import the function from `@angular/core`.\n *\n * ```ts\n * import {output} from '@angular/core';\n * ```\n *\n * Inside your component, introduce a new class member and initialize\n * it with a call to `output`.\n *\n * ```ts\n * @Directive({\n *   ...\n * })\n * export class MyDir {\n *   nameChange = output<string>();    // OutputEmitterRef<string>\n *   onClick    = output();            // OutputEmitterRef<void>\n * }\n * ```\n *\n * You can emit values to consumers of your directive, by using\n * the `emit` method from `OutputEmitterRef`.\n *\n * ```ts\n * updateName(newName: string): void {\n *   this.nameChange.emit(newName);\n * }\n * ```\n * @initializerApiFunction {\"showTypesInSignaturePreview\": true}\n * @publicAPI\n */\nexport function output<T = void>(opts?: OutputOptions): OutputEmitterRef<T> {\n  ngDevMode && assertInInjectionContext(output);\n  return new OutputEmitterRef<T>();\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertInInjectionContext} from '../../di';\n\nimport {\n  createInputSignal,\n  InputOptions,\n  InputOptionsWithoutTransform,\n  InputOptionsWithTransform,\n  InputSignal,\n  InputSignalWithTransform,\n} from './input_signal';\nimport {REQUIRED_UNSET_VALUE} from './input_signal_node';\n\nexport function inputFunction<ReadT, WriteT>(\n  initialValue?: ReadT,\n  opts?: InputOptions<ReadT, WriteT>,\n): InputSignalWithTransform<ReadT | undefined, WriteT> {\n  ngDevMode && assertInInjectionContext(input);\n  return createInputSignal(initialValue, opts);\n}\n\nexport function inputRequiredFunction<ReadT, WriteT = ReadT>(\n  opts?: InputOptions<ReadT, WriteT>,\n): InputSignalWithTransform<ReadT, WriteT> {\n  ngDevMode && assertInInjectionContext(input);\n  return createInputSignal(REQUIRED_UNSET_VALUE as never, opts);\n}\n\n/**\n * The `input` function allows declaration of inputs in directives and\n * components.\n *\n * The function exposes an API for also declaring required inputs via the\n * `input.required` function.\n *\n * @publicAPI\n * @docsPrivate Ignored because `input` is the canonical API entry.\n */\nexport interface InputFunction {\n  /**\n   * Initializes an input of type `T` with an initial value of `undefined`.\n   * Angular will implicitly use `undefined` as initial value.\n   */\n  <T>(): InputSignal<T | undefined>;\n  /** Declares an input of type `T` with an explicit initial value. */\n  <T>(initialValue: T, opts?: InputOptionsWithoutTransform<T>): InputSignal<T>;\n  /** Declares an input of type `T|undefined` without an initial value, but with input options */\n  <T>(initialValue: undefined, opts: InputOptionsWithoutTransform<T>): InputSignal<T | undefined>;\n  /**\n   * Declares an input of type `T` with an initial value and a transform\n   * function.\n   *\n   * The input accepts values of type `TransformT` and the given\n   * transform function will transform the value to type `T`.\n   */\n  <T, TransformT>(\n    initialValue: T,\n    opts: InputOptionsWithTransform<T, TransformT>,\n  ): InputSignalWithTransform<T, TransformT>;\n  /**\n   * Declares an input of type `T|undefined` without an initial value and with a transform\n   * function.\n   *\n   * The input accepts values of type `TransformT` and the given\n   * transform function will transform the value to type `T|undefined`.\n   */ <T, TransformT>(\n    initialValue: undefined,\n    opts: InputOptionsWithTransform<T | undefined, TransformT>,\n  ): InputSignalWithTransform<T | undefined, TransformT>;\n\n  /**\n   * Initializes a required input.\n   *\n   * Consumers of your directive/component need to bind to this\n   * input. If unset, a compile time error will be reported.\n   *\n   * @publicAPI\n   */\n  required: {\n    /** Declares a required input of type `T`. */\n    <T>(opts?: InputOptionsWithoutTransform<T>): InputSignal<T>;\n    /**\n     * Declares a required input of type `T` with a transform function.\n     *\n     * The input accepts values of type `TransformT` and the given\n     * transform function will transform the value to type `T`.\n     */\n    <T, TransformT>(\n      opts: InputOptionsWithTransform<T, TransformT>,\n    ): InputSignalWithTransform<T, TransformT>;\n  };\n}\n\n/**\n * The `input` function allows declaration of Angular inputs in directives\n * and components.\n *\n * There are two variants of inputs that can be declared:\n *\n *   1. **Optional inputs** with an initial value.\n *   2. **Required inputs** that consumers need to set.\n *\n * By default, the `input` function will declare optional inputs that\n * always have an initial value. Required inputs can be declared\n * using the `input.required()` function.\n *\n * Inputs are signals. The values of an input are exposed as a `Signal`.\n * The signal always holds the latest value of the input that is bound\n * from the parent.\n *\n * @usageNotes\n * To use signal-based inputs, import `input` from `@angular/core`.\n *\n * ```ts\n * import {input} from '@angular/core`;\n * ```\n *\n * Inside your component, introduce a new class member and initialize\n * it with a call to `input` or `input.required`.\n *\n * ```ts\n * @Component({\n *   ...\n * })\n * export class UserProfileComponent {\n *   firstName = input<string>();             // Signal<string|undefined>\n *   lastName  = input.required<string>();    // Signal<string>\n *   age       = input(0)                     // Signal<number>\n * }\n * ```\n *\n * Inside your component template, you can display values of the inputs\n * by calling the signal.\n *\n * ```html\n * <span>{{firstName()}}</span>\n * ```\n *\n * @publicAPI\n * @initializerApiFunction\n */\nexport const input: InputFunction = (() => {\n  // Note: This may be considered a side-effect, but nothing will depend on\n  // this assignment, unless this `input` constant export is accessed. It's a\n  // self-contained side effect that is local to the user facing`input` export.\n  (inputFunction as any).required = inputRequiredFunction;\n  return inputFunction as typeof inputFunction & {required: typeof inputRequiredFunction};\n})();\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {TNode} from '../render3/interfaces/node';\nimport {RElement} from '../render3/interfaces/renderer_dom';\nimport {LView} from '../render3/interfaces/view';\nimport {getCurrentTNode, getLView} from '../render3/state';\nimport {getNativeByTNode} from '../render3/util/view_utils';\n\n/**\n * Creates an ElementRef from the most recent node.\n *\n * @returns The ElementRef instance to use\n */\nexport function injectElementRef(): ElementRef {\n  return createElementRef(getCurrentTNode()!, getLView());\n}\n\n/**\n * Creates an ElementRef given a node.\n *\n * @param tNode The node for which you'd like an ElementRef\n * @param lView The view to which the node belongs\n * @returns The ElementRef instance to use\n */\nexport function createElementRef(tNode: TNode, lView: LView): ElementRef {\n  return new ElementRef(getNativeByTNode(tNode, lView) as RElement);\n}\n\n/**\n * A wrapper around a native element inside of a View.\n *\n * An `ElementRef` is backed by a render-specific element. In the browser, this is usually a DOM\n * element.\n *\n * @security Permitting direct access to the DOM can make your application more vulnerable to\n * XSS attacks. Carefully review any use of `ElementRef` in your code. For more detail, see the\n * [Security Guide](https://g.co/ng/security).\n *\n * @publicApi\n */\n// Note: We don't expose things like `Injector`, `ViewContainer`, ... here,\n// i.e. users have to ask for what they need. With that, we can build better analysis tools\n// and could do better codegen in the future.\nexport class ElementRef<T = any> {\n  /**\n   * <div class=\"docs-alert docs-alert-important\">\n   *   <header>Use with caution</header>\n   *   <p>\n   *    Use this API as the last resort when direct access to DOM is needed. Use templating and\n   *    data-binding provided by Angular instead. If used, it is recommended in combination with\n   *    {@link /best-practices/security#direct-use-of-the-dom-apis-and-explicit-sanitization-calls DomSanitizer}\n   *    for maxiumum security;\n   *   </p>\n   * </div>\n   */\n  public nativeElement: T;\n\n  constructor(nativeElement: T) {\n    this.nativeElement = nativeElement;\n  }\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ELEMENT_ID__: () => ElementRef = injectElementRef;\n}\n\n/**\n * Unwraps `ElementRef` and return the `nativeElement`.\n *\n * @param value value to unwrap\n * @returns `nativeElement` if `ElementRef` otherwise returns value as is.\n */\nexport function unwrapElementRef<T, R>(value: T | ElementRef<R>): T | R {\n  return value instanceof ElementRef ? value.nativeElement : value;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {SIGNAL} from '../../../primitives/signals';\n\n/**\n * A reactive value which notifies consumers of any changes.\n *\n * Signals are functions which returns their current value. To access the current value of a signal,\n * call it.\n *\n * Ordinary values can be turned into `Signal`s with the `signal` function.\n */\nexport type Signal<T> = (() => T) & {\n  [SIGNAL]: unknown;\n};\n\n/**\n * Checks if the given `value` is a reactive `Signal`.\n */\nexport function isSignal(value: unknown): value is Signal<unknown> {\n  return typeof value === 'function' && (value as Signal<unknown>)[SIGNAL] !== undefined;\n}\n\n/**\n * A comparison function which can determine if two values are equal.\n */\nexport type ValueEqualityFn<T> = (a: T, b: T) => boolean;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  createSignal,\n  SIGNAL,\n  SignalGetter,\n  SignalNode,\n  signalSetFn,\n  signalUpdateFn,\n} from '../../../primitives/signals';\n\nimport {isSignal, Signal, ValueEqualityFn} from './api';\n\n/** Symbol used distinguish `WritableSignal` from other non-writable signals and functions. */\nexport const ɵWRITABLE_SIGNAL: unique symbol = /* @__PURE__ */ Symbol('WRITABLE_SIGNAL');\n\n/**\n * A `Signal` with a value that can be mutated via a setter interface.\n */\nexport interface WritableSignal<T> extends Signal<T> {\n  [ɵWRITABLE_SIGNAL]: T;\n\n  /**\n   * Directly set the signal to a new value, and notify any dependents.\n   */\n  set(value: T): void;\n\n  /**\n   * Update the value of the signal based on its current value, and\n   * notify any dependents.\n   */\n  update(updateFn: (value: T) => T): void;\n\n  /**\n   * Returns a readonly version of this signal. Readonly signals can be accessed to read their value\n   * but can't be changed using set or update methods. The readonly signals do _not_ have\n   * any built-in mechanism that would prevent deep-mutation of their value.\n   */\n  asReadonly(): Signal<T>;\n}\n\n/**\n * Utility function used during template type checking to extract the value from a `WritableSignal`.\n * @codeGenApi\n */\nexport function ɵunwrapWritableSignal<T>(value: T | {[ɵWRITABLE_SIGNAL]: T}): T {\n  // Note: the function uses `WRITABLE_SIGNAL` as a brand instead of `WritableSignal<T>`,\n  // because the latter incorrectly unwraps non-signal getter functions.\n  return null!;\n}\n\n/**\n * Options passed to the `signal` creation function.\n */\nexport interface CreateSignalOptions<T> {\n  /**\n   * A comparison function which defines equality for signal values.\n   */\n  equal?: ValueEqualityFn<T>;\n\n  /**\n   * A debug name for the signal. Used in Angular DevTools to identify the signal.\n   */\n  debugName?: string;\n}\n\n/**\n * Create a `Signal` that can be set or updated directly.\n */\nexport function signal<T>(initialValue: T, options?: CreateSignalOptions<T>): WritableSignal<T> {\n  const signalFn = createSignal(initialValue, options?.equal) as SignalGetter<T>    &\n    WritableSignal<T>;\n\n  const node = signalFn[SIGNAL];\n\n  signalFn.set = (newValue: T) => signalSetFn(node, newValue);\n  signalFn.update = (updateFn: (value: T) => T) => signalUpdateFn(node, updateFn);\n  signalFn.asReadonly = signalAsReadonlyFn.bind(signalFn as any) as () => Signal<T>;\n\n  if (ngDevMode) {\n    signalFn.toString = () => `[Signal: ${signalFn()}]`;\n    node.debugName = options?.debugName;\n  }\n\n  return signalFn as WritableSignal<T>;\n}\n\nexport function signalAsReadonlyFn<T>(this: SignalGetter<T>): Signal<T> {\n  const node = this[SIGNAL] as SignalNode<T> & {readonlyFn?: Signal<T>};\n  if (node.readonlyFn === undefined) {\n    const readonlyFn = () => this();\n    (readonlyFn as any)[SIGNAL] = node;\n    node.readonlyFn = readonlyFn as Signal<T>;\n  }\n  return node.readonlyFn;\n}\n\n/**\n * Checks if the given `value` is a writeable signal.\n */\nexport function isWritableSignal(value: unknown): value is WritableSignal<unknown> {\n  return isSignal(value) && typeof (value as any).set === 'function';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Observable, Subject} from 'rxjs';\n\nimport {EventEmitter} from '../event_emitter';\nimport {Writable} from '../interface/type';\nimport {arrayEquals, flatten} from '../util/array_utils';\n\nfunction symbolIterator<T>(this: QueryList<T>): Iterator<T> {\n  // @ts-expect-error accessing a private member\n  return this._results[Symbol.iterator]();\n}\n\n/**\n * An unmodifiable list of items that Angular keeps up to date when the state\n * of the application changes.\n *\n * The type of object that {@link ViewChildren}, {@link ContentChildren}, and {@link QueryList}\n * provide.\n *\n * Implements an iterable interface, therefore it can be used in both ES6\n * javascript `for (var i of items)` loops as well as in Angular templates with\n * `*ngFor=\"let i of myList\"`.\n *\n * Changes can be observed by subscribing to the changes `Observable`.\n *\n * NOTE: In the future this class will implement an `Observable` interface.\n *\n * @usageNotes\n * ### Example\n * ```ts\n * @Component({...})\n * class Container {\n *   @ViewChildren(Item) items:QueryList<Item>;\n * }\n * ```\n *\n * @publicApi\n */\nexport class QueryList<T> implements Iterable<T> {\n  public readonly dirty = true;\n  private _onDirty?: () => void = undefined;\n  private _results: Array<T> = [];\n  private _changesDetected: boolean = false;\n  private _changes: Subject<QueryList<T>> | undefined = undefined;\n\n  readonly length: number = 0;\n  readonly first: T = undefined!;\n  readonly last: T = undefined!;\n\n  /**\n   * Returns `Observable` of `QueryList` notifying the subscriber of changes.\n   */\n  get changes(): Observable<any> {\n    return (this._changes ??= new Subject());\n  }\n\n  /**\n   * @param emitDistinctChangesOnly Whether `QueryList.changes` should fire only when actual change\n   *     has occurred. Or if it should fire when query is recomputed. (recomputing could resolve in\n   *     the same result)\n   */\n  constructor(private _emitDistinctChangesOnly: boolean = false) {}\n\n  /**\n   * Returns the QueryList entry at `index`.\n   */\n  get(index: number): T | undefined {\n    return this._results[index];\n  }\n\n  /**\n   * See\n   * [Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)\n   */\n  map<U>(fn: (item: T, index: number, array: T[]) => U): U[] {\n    return this._results.map(fn);\n  }\n\n  /**\n   * See\n   * [Array.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)\n   */\n  filter<S extends T>(predicate: (value: T, index: number, array: readonly T[]) => value is S): S[];\n  filter(predicate: (value: T, index: number, array: readonly T[]) => unknown): T[];\n  filter(fn: (item: T, index: number, array: T[]) => boolean): T[] {\n    return this._results.filter(fn);\n  }\n\n  /**\n   * See\n   * [Array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)\n   */\n  find(fn: (item: T, index: number, array: T[]) => boolean): T | undefined {\n    return this._results.find(fn);\n  }\n\n  /**\n   * See\n   * [Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)\n   */\n  reduce<U>(fn: (prevValue: U, curValue: T, curIndex: number, array: T[]) => U, init: U): U {\n    return this._results.reduce(fn, init);\n  }\n\n  /**\n   * See\n   * [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)\n   */\n  forEach(fn: (item: T, index: number, array: T[]) => void): void {\n    this._results.forEach(fn);\n  }\n\n  /**\n   * See\n   * [Array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)\n   */\n  some(fn: (value: T, index: number, array: T[]) => boolean): boolean {\n    return this._results.some(fn);\n  }\n\n  /**\n   * Returns a copy of the internal results list as an Array.\n   */\n  toArray(): T[] {\n    return this._results.slice();\n  }\n\n  toString(): string {\n    return this._results.toString();\n  }\n\n  /**\n   * Updates the stored data of the query list, and resets the `dirty` flag to `false`, so that\n   * on change detection, it will not notify of changes to the queries, unless a new change\n   * occurs.\n   *\n   * @param resultsTree The query results to store\n   * @param identityAccessor Optional function for extracting stable object identity from a value\n   *    in the array. This function is executed for each element of the query result list while\n   *    comparing current query list with the new one (provided as a first argument of the `reset`\n   *    function) to detect if the lists are different. If the function is not provided, elements\n   *    are compared as is (without any pre-processing).\n   */\n  reset(resultsTree: Array<T | any[]>, identityAccessor?: (value: T) => unknown): void {\n    (this as {dirty: boolean}).dirty = false;\n    const newResultFlat = flatten(resultsTree);\n    if ((this._changesDetected = !arrayEquals(this._results, newResultFlat, identityAccessor))) {\n      this._results = newResultFlat;\n      (this as Writable<this>).length = newResultFlat.length;\n      (this as Writable<this>).last = newResultFlat[this.length - 1];\n      (this as Writable<this>).first = newResultFlat[0];\n    }\n  }\n\n  /**\n   * Triggers a change event by emitting on the `changes` {@link EventEmitter}.\n   */\n  notifyOnChanges(): void {\n    if (this._changes !== undefined && (this._changesDetected || !this._emitDistinctChangesOnly))\n      this._changes.next(this);\n  }\n\n  /** @internal */\n  onDirty(cb: () => void) {\n    this._onDirty = cb;\n  }\n\n  /** internal */\n  setDirty() {\n    (this as {dirty: boolean}).dirty = true;\n    this._onDirty?.();\n  }\n\n  /** internal */\n  destroy(): void {\n    if (this._changes !== undefined) {\n      this._changes.complete();\n      this._changes.unsubscribe();\n    }\n  }\n\n  [Symbol.iterator]: () => Iterator<T> = /** @__PURE__*/ (() => symbolIterator)();\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {TNode, TNodeFlags} from '../render3/interfaces/node';\nimport {RElement} from '../render3/interfaces/renderer_dom';\n\n/**\n * The name of an attribute that can be added to the hydration boundary node\n * (component host node) to disable hydration for the content within that boundary.\n */\nexport const SKIP_HYDRATION_ATTR_NAME = 'ngSkipHydration';\n\n/** Lowercase name of the `ngSkipHydration` attribute used for case-insensitive comparisons. */\nconst SKIP_HYDRATION_ATTR_NAME_LOWER_CASE = 'ngskiphydration';\n\n/**\n * Helper function to check if a given TNode has the 'ngSkipHydration' attribute.\n */\nexport function hasSkipHydrationAttrOnTNode(tNode: TNode): boolean {\n  const attrs = tNode.mergedAttrs;\n  if (attrs === null) return false;\n  // only ever look at the attribute name and skip the values\n  for (let i = 0; i < attrs.length; i += 2) {\n    const value = attrs[i];\n    // This is a marker, which means that the static attributes section is over,\n    // so we can exit early.\n    if (typeof value === 'number') return false;\n    if (typeof value === 'string' && value.toLowerCase() === SKIP_HYDRATION_ATTR_NAME_LOWER_CASE) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Helper function to check if a given RElement has the 'ngSkipHydration' attribute.\n */\nexport function hasSkipHydrationAttrOnRElement(rNode: RElement): boolean {\n  return rNode.hasAttribute(SKIP_HYDRATION_ATTR_NAME);\n}\n\n/**\n * Checks whether a TNode has a flag to indicate that it's a part of\n * a skip hydration block.\n */\nexport function hasInSkipHydrationBlockFlag(tNode: TNode): boolean {\n  return (tNode.flags & TNodeFlags.inSkipHydrationBlock) === TNodeFlags.inSkipHydrationBlock;\n}\n\n/**\n * Helper function that determines if a given node is within a skip hydration block\n * by navigating up the TNode tree to see if any parent nodes have skip hydration\n * attribute.\n */\nexport function isInSkipHydrationBlock(tNode: TNode): boolean {\n  if (hasInSkipHydrationBlockFlag(tNode)) {\n    return true;\n  }\n  let currentTNode: TNode | null = tNode.parent;\n  while (currentTNode) {\n    if (hasInSkipHydrationBlockFlag(tNode) || hasSkipHydrationAttrOnTNode(currentTNode)) {\n      return true;\n    }\n    currentTNode = currentTNode.parent;\n  }\n  return false;\n}\n\n/**\n * Check if an i18n block is in a skip hydration section by looking at a parent TNode\n * to determine if this TNode is in a skip hydration section or the TNode has\n * the `ngSkipHydration` attribute.\n */\nexport function isI18nInSkipHydrationBlock(parentTNode: TNode): boolean {\n  return (\n    hasInSkipHydrationBlockFlag(parentTNode) ||\n    hasSkipHydrationAttrOnTNode(parentTNode) ||\n    isInSkipHydrationBlock(parentTNode)\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * The strategy that the default change detector uses to detect changes.\n * When set, takes effect the next time change detection is triggered.\n *\n * @see {@link /api/core/ChangeDetectorRef?tab=usage-notes Change detection usage}\n * @see {@link /best-practices/skipping-subtrees Skipping component subtrees}\n *\n * @publicApi\n */\nexport enum ChangeDetectionStrategy {\n  /**\n   * Use the `CheckOnce` strategy, meaning that automatic change detection is deactivated\n   * until reactivated by setting the strategy to `Default` (`CheckAlways`).\n   * Change detection can still be explicitly invoked.\n   * This strategy applies to all child directives and cannot be overridden.\n   */\n  OnPush = 0,\n\n  /**\n   * Use the default `CheckAlways` strategy, in which change detection is automatic until\n   * explicitly deactivated.\n   */\n  Default = 1,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertNumber} from '../../util/assert';\n\nimport {ID, LView} from './view';\n\n// Keeps track of the currently-active LViews.\nconst TRACKED_LVIEWS = new Map<number, LView>();\n\n// Used for generating unique IDs for LViews.\nlet uniqueIdCounter = 0;\n\n/** Gets a unique ID that can be assigned to an LView. */\nexport function getUniqueLViewId(): number {\n  return uniqueIdCounter++;\n}\n\n/** Starts tracking an LView. */\nexport function registerLView(lView: LView): void {\n  ngDevMode && assertNumber(lView[ID], 'LView must have an ID in order to be registered');\n  TRACKED_LVIEWS.set(lView[ID], lView);\n}\n\n/** Gets an LView by its unique ID. */\nexport function getLViewById(id: number): LView | null {\n  ngDevMode && assertNumber(id, 'ID used for LView lookup must be a number');\n  return TRACKED_LVIEWS.get(id) || null;\n}\n\n/** Stops tracking an LView. */\nexport function unregisterLView(lView: LView): void {\n  ngDevMode && assertNumber(lView[ID], 'Cannot stop tracking an LView that does not have an ID');\n  TRACKED_LVIEWS.delete(lView[ID]);\n}\n\n/** Gets the currently-tracked views. */\nexport function getTrackedLViews(): ReadonlyMap<number, LView> {\n  return TRACKED_LVIEWS;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {getLViewById} from './lview_tracking';\nimport {RNode} from './renderer_dom';\nimport {LView} from './view';\n\n/**\n * The internal view context which is specific to a given DOM element, directive or\n * component instance. Each value in here (besides the LView and element node details)\n * can be present, null or undefined. If undefined then it implies the value has not been\n * looked up yet, otherwise, if null, then a lookup was executed and nothing was found.\n *\n * Each value will get filled when the respective value is examined within the getContext\n * function. The component, element and each directive instance will share the same instance\n * of the context.\n */\nexport class LContext {\n  /**\n   * The instance of the Component node.\n   */\n  public component: {} | null | undefined;\n\n  /**\n   * The list of active directives that exist on this element.\n   */\n  public directives: any[] | null | undefined;\n\n  /**\n   * The map of local references (local reference name => element or directive instance) that\n   * exist on this element.\n   */\n  public localRefs: {[key: string]: any} | null | undefined;\n\n  /** Component's parent view data. */\n  get lView(): LView | null {\n    return getLViewById(this.lViewId);\n  }\n\n  constructor(\n    /**\n     * ID of the component's parent view data.\n     */\n    private lViewId: number,\n\n    /**\n     * The index instance of the node.\n     */\n    public nodeIndex: number,\n\n    /**\n     * The instance of the DOM node that is attached to the lNode.\n     */\n    public native: RNode,\n  ) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport '../util/ng_dev_mode';\n\nimport {assertDefined, assertDomNode} from '../util/assert';\nimport {EMPTY_ARRAY} from '../util/empty';\n\nimport {assertLView} from './assert';\nimport {LContext} from './interfaces/context';\nimport {getLViewById, registerLView} from './interfaces/lview_tracking';\nimport {TNode} from './interfaces/node';\nimport {RElement, RNode} from './interfaces/renderer_dom';\nimport {isComponentHost, isLView} from './interfaces/type_checks';\nimport {CONTEXT, HEADER_OFFSET, HOST, ID, LView, TVIEW} from './interfaces/view';\nimport {getComponentLViewByIndex, unwrapRNode} from './util/view_utils';\n\n/**\n * Returns the matching `LContext` data for a given DOM node, directive or component instance.\n *\n * This function will examine the provided DOM element, component, or directive instance\\'s\n * monkey-patched property to derive the `LContext` data. Once called then the monkey-patched\n * value will be that of the newly created `LContext`.\n *\n * If the monkey-patched value is the `LView` instance then the context value for that\n * target will be created and the monkey-patch reference will be updated. Therefore when this\n * function is called it may mutate the provided element\\'s, component\\'s or any of the associated\n * directive\\'s monkey-patch values.\n *\n * If the monkey-patch value is not detected then the code will walk up the DOM until an element\n * is found which contains a monkey-patch reference. When that occurs then the provided element\n * will be updated with a new context (which is then returned). If the monkey-patch value is not\n * detected for a component/directive instance then it will throw an error (all components and\n * directives should be automatically monkey-patched by ivy).\n *\n * @param target Component, Directive or DOM Node.\n */\nexport function getLContext(target: any): LContext | null {\n  let mpValue = readPatchedData(target);\n  if (mpValue) {\n    // only when it's an array is it considered an LView instance\n    // ... otherwise it's an already constructed LContext instance\n    if (isLView(mpValue)) {\n      const lView: LView = mpValue!;\n      let nodeIndex: number;\n      let component: any = undefined;\n      let directives: any[] | null | undefined = undefined;\n\n      if (isComponentInstance(target)) {\n        nodeIndex = findViaComponent(lView, target);\n        if (nodeIndex == -1) {\n          throw new Error('The provided component was not found in the application');\n        }\n        component = target;\n      } else if (isDirectiveInstance(target)) {\n        nodeIndex = findViaDirective(lView, target);\n        if (nodeIndex == -1) {\n          throw new Error('The provided directive was not found in the application');\n        }\n        directives = getDirectivesAtNodeIndex(nodeIndex, lView);\n      } else {\n        nodeIndex = findViaNativeElement(lView, target as RElement);\n        if (nodeIndex == -1) {\n          return null;\n        }\n      }\n\n      // the goal is not to fill the entire context full of data because the lookups\n      // are expensive. Instead, only the target data (the element, component, container, ICU\n      // expression or directive details) are filled into the context. If called multiple times\n      // with different target values then the missing target data will be filled in.\n      const native = unwrapRNode(lView[nodeIndex]);\n      const existingCtx = readPatchedData(native);\n      const context: LContext =\n        existingCtx && !Array.isArray(existingCtx)\n          ? existingCtx\n          : createLContext(lView, nodeIndex, native);\n\n      // only when the component has been discovered then update the monkey-patch\n      if (component && context.component === undefined) {\n        context.component = component;\n        attachPatchData(context.component, context);\n      }\n\n      // only when the directives have been discovered then update the monkey-patch\n      if (directives && context.directives === undefined) {\n        context.directives = directives;\n        for (let i = 0; i < directives.length; i++) {\n          attachPatchData(directives[i], context);\n        }\n      }\n\n      attachPatchData(context.native, context);\n      mpValue = context;\n    }\n  } else {\n    const rElement = target as RElement;\n    ngDevMode && assertDomNode(rElement);\n\n    // if the context is not found then we need to traverse upwards up the DOM\n    // to find the nearest element that has already been monkey patched with data\n    let parent = rElement as any;\n    while ((parent = parent.parentNode)) {\n      const parentContext = readPatchedData(parent);\n      if (parentContext) {\n        const lView = Array.isArray(parentContext) ? (parentContext as LView) : parentContext.lView;\n\n        // the edge of the app was also reached here through another means\n        // (maybe because the DOM was changed manually).\n        if (!lView) {\n          return null;\n        }\n\n        const index = findViaNativeElement(lView, rElement);\n        if (index >= 0) {\n          const native = unwrapRNode(lView[index]);\n          const context = createLContext(lView, index, native);\n          attachPatchData(native, context);\n          mpValue = context;\n          break;\n        }\n      }\n    }\n  }\n  return (mpValue as LContext) || null;\n}\n\n/**\n * Creates an empty instance of a `LContext` context\n */\nfunction createLContext(lView: LView, nodeIndex: number, native: RNode): LContext {\n  return new LContext(lView[ID], nodeIndex, native);\n}\n\n/**\n * Takes a component instance and returns the view for that component.\n *\n * @param componentInstance\n * @returns The component's view\n */\nexport function getComponentViewByInstance(componentInstance: {}): LView {\n  let patchedData = readPatchedData(componentInstance);\n  let lView: LView;\n\n  if (isLView(patchedData)) {\n    const contextLView: LView = patchedData;\n    const nodeIndex = findViaComponent(contextLView, componentInstance);\n    lView = getComponentLViewByIndex(nodeIndex, contextLView);\n    const context = createLContext(contextLView, nodeIndex, lView[HOST] as RElement);\n    context.component = componentInstance;\n    attachPatchData(componentInstance, context);\n    attachPatchData(context.native, context);\n  } else {\n    const context = patchedData as unknown as LContext;\n    const contextLView = context.lView!;\n    ngDevMode && assertLView(contextLView);\n    lView = getComponentLViewByIndex(context.nodeIndex, contextLView);\n  }\n  return lView;\n}\n\n/**\n * This property will be monkey-patched on elements, components and directives.\n */\nconst MONKEY_PATCH_KEY_NAME = '__ngContext__';\n\nexport function attachLViewId(target: any, data: LView) {\n  target[MONKEY_PATCH_KEY_NAME] = data[ID];\n}\n\n/**\n * Returns the monkey-patch value data present on the target (which could be\n * a component, directive or a DOM node).\n */\nexport function readLView(target: any): LView | null {\n  const data = readPatchedData(target);\n  if (isLView(data)) {\n    return data;\n  }\n  return data ? data.lView : null;\n}\n\n/**\n * Assigns the given data to the given target (which could be a component,\n * directive or DOM node instance) using monkey-patching.\n */\nexport function attachPatchData(target: any, data: LView | LContext) {\n  ngDevMode && assertDefined(target, 'Target expected');\n  // Only attach the ID of the view in order to avoid memory leaks (see #41047). We only do this\n  // for `LView`, because we have control over when an `LView` is created and destroyed, whereas\n  // we can't know when to remove an `LContext`.\n  if (isLView(data)) {\n    target[MONKEY_PATCH_KEY_NAME] = data[ID];\n    registerLView(data);\n  } else {\n    target[MONKEY_PATCH_KEY_NAME] = data;\n  }\n}\n\n/**\n * Returns the monkey-patch value data present on the target (which could be\n * a component, directive or a DOM node).\n */\nexport function readPatchedData(target: any): LView | LContext | null {\n  ngDevMode && assertDefined(target, 'Target expected');\n  const data = target[MONKEY_PATCH_KEY_NAME];\n  return typeof data === 'number' ? getLViewById(data) : data || null;\n}\n\nexport function readPatchedLView<T>(target: any): LView<T> | null {\n  const value = readPatchedData(target);\n  if (value) {\n    return (isLView(value) ? value : value.lView) as LView<T>;\n  }\n  return null;\n}\n\nexport function isComponentInstance(instance: any): boolean {\n  return instance && instance.constructor && instance.constructor.ɵcmp;\n}\n\nexport function isDirectiveInstance(instance: any): boolean {\n  return instance && instance.constructor && instance.constructor.ɵdir;\n}\n\n/**\n * Locates the element within the given LView and returns the matching index\n */\nfunction findViaNativeElement(lView: LView, target: RElement): number {\n  const tView = lView[TVIEW];\n  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {\n    if (unwrapRNode(lView[i]) === target) {\n      return i;\n    }\n  }\n\n  return -1;\n}\n\n/**\n * Locates the next tNode (child, sibling or parent).\n */\nfunction traverseNextElement(tNode: TNode): TNode | null {\n  if (tNode.child) {\n    return tNode.child;\n  } else if (tNode.next) {\n    return tNode.next;\n  } else {\n    // Let's take the following template: <div><span>text</span></div><component/>\n    // After checking the text node, we need to find the next parent that has a \"next\" TNode,\n    // in this case the parent `div`, so that we can find the component.\n    while (tNode.parent && !tNode.parent.next) {\n      tNode = tNode.parent;\n    }\n    return tNode.parent && tNode.parent.next;\n  }\n}\n\n/**\n * Locates the component within the given LView and returns the matching index\n */\nfunction findViaComponent(lView: LView, componentInstance: {}): number {\n  const componentIndices = lView[TVIEW].components;\n  if (componentIndices) {\n    for (let i = 0; i < componentIndices.length; i++) {\n      const elementComponentIndex = componentIndices[i];\n      const componentView = getComponentLViewByIndex(elementComponentIndex, lView);\n      if (componentView[CONTEXT] === componentInstance) {\n        return elementComponentIndex;\n      }\n    }\n  } else {\n    const rootComponentView = getComponentLViewByIndex(HEADER_OFFSET, lView);\n    const rootComponent = rootComponentView[CONTEXT];\n    if (rootComponent === componentInstance) {\n      // we are dealing with the root element here therefore we know that the\n      // element is the very first element after the HEADER data in the lView\n      return HEADER_OFFSET;\n    }\n  }\n  return -1;\n}\n\n/**\n * Locates the directive within the given LView and returns the matching index\n */\nfunction findViaDirective(lView: LView, directiveInstance: {}): number {\n  // if a directive is monkey patched then it will (by default)\n  // have a reference to the LView of the current view. The\n  // element bound to the directive being search lives somewhere\n  // in the view data. We loop through the nodes and check their\n  // list of directives for the instance.\n  let tNode = lView[TVIEW].firstChild;\n  while (tNode) {\n    const directiveIndexStart = tNode.directiveStart;\n    const directiveIndexEnd = tNode.directiveEnd;\n    for (let i = directiveIndexStart; i < directiveIndexEnd; i++) {\n      if (lView[i] === directiveInstance) {\n        return tNode.index;\n      }\n    }\n    tNode = traverseNextElement(tNode);\n  }\n  return -1;\n}\n\n/**\n * Returns a list of directives applied to a node at a specific index. The list includes\n * directives matched by selector and any host directives, but it excludes components.\n * Use `getComponentAtNodeIndex` to find the component applied to a node.\n *\n * @param nodeIndex The node index\n * @param lView The target view data\n */\nexport function getDirectivesAtNodeIndex(nodeIndex: number, lView: LView): any[] | null {\n  const tNode = lView[TVIEW].data[nodeIndex] as TNode;\n  if (tNode.directiveStart === 0) return EMPTY_ARRAY;\n  const results: any[] = [];\n  for (let i = tNode.directiveStart; i < tNode.directiveEnd; i++) {\n    const directiveInstance = lView[i];\n    if (!isComponentInstance(directiveInstance)) {\n      results.push(directiveInstance);\n    }\n  }\n  return results;\n}\n\nexport function getComponentAtNodeIndex(nodeIndex: number, lView: LView): {} | null {\n  const tNode = lView[TVIEW].data[nodeIndex] as TNode;\n  return isComponentHost(tNode) ? lView[tNode.directiveStart + tNode.componentOffset] : null;\n}\n\n/**\n * Returns a map of local references (local reference name => element or directive instance) that\n * exist on a given element.\n */\nexport function discoverLocalRefs(lView: LView, nodeIndex: number): {[key: string]: any} | null {\n  const tNode = lView[TVIEW].data[nodeIndex] as TNode;\n  if (tNode && tNode.localNames) {\n    const result: {[key: string]: any} = {};\n    let localIndex = tNode.index + 1;\n    for (let i = 0; i < tNode.localNames.length; i += 2) {\n      result[tNode.localNames[i]] = lView[localIndex];\n      localIndex++;\n    }\n    return result;\n  }\n\n  return null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertDefined} from '../../util/assert';\nimport {assertLView} from '../assert';\nimport {readPatchedLView} from '../context_discovery';\nimport {LContainer} from '../interfaces/container';\nimport {isLContainer, isLView, isRootView} from '../interfaces/type_checks';\nimport {CHILD_HEAD, CONTEXT, LView, NEXT} from '../interfaces/view';\n\nimport {getLViewParent} from './view_utils';\n\n/**\n * Retrieve the root view from any component or `LView` by walking the parent `LView` until\n * reaching the root `LView`.\n *\n * @param componentOrLView any component or `LView`\n */\nexport function getRootView<T>(componentOrLView: LView | {}): LView<T> {\n  ngDevMode && assertDefined(componentOrLView, 'component');\n  let lView = isLView(componentOrLView) ? componentOrLView : readPatchedLView(componentOrLView)!;\n  while (lView && !isRootView(lView)) {\n    lView = getLViewParent(lView)!;\n  }\n  ngDevMode && assertLView(lView);\n  return lView as LView<T>;\n}\n\n/**\n * Returns the context information associated with the application where the target is situated. It\n * does this by walking the parent views until it gets to the root view, then getting the context\n * off of that.\n *\n * @param viewOrComponent the `LView` or component to get the root context for.\n */\nexport function getRootContext<T>(viewOrComponent: LView<T> | {}): T {\n  const rootView = getRootView(viewOrComponent);\n  ngDevMode &&\n    assertDefined(rootView[CONTEXT], 'Root view has no context. Perhaps it is disconnected?');\n  return rootView[CONTEXT] as T;\n}\n\n/**\n * Gets the first `LContainer` in the LView or `null` if none exists.\n */\nexport function getFirstLContainer(lView: LView): LContainer | null {\n  return getNearestLContainer(lView[CHILD_HEAD]);\n}\n\n/**\n * Gets the next `LContainer` that is a sibling of the given container.\n */\nexport function getNextLContainer(container: LContainer): LContainer | null {\n  return getNearestLContainer(container[NEXT]);\n}\n\nfunction getNearestLContainer(viewOrContainer: LContainer | LView | null) {\n  while (viewOrContainer !== null && !isLContainer(viewOrContainer)) {\n    viewOrContainer = viewOrContainer[NEXT];\n  }\n  return viewOrContainer as LContainer | null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ChangeDetectionStrategy} from '../../change_detection/constants';\nimport {Injector} from '../../di/injector';\nimport {ViewEncapsulation} from '../../metadata/view';\nimport {assertLView} from '../assert';\nimport {\n  discoverLocalRefs,\n  getComponentAtNodeIndex,\n  getDirectivesAtNodeIndex,\n  getLContext,\n  readPatchedLView,\n} from '../context_discovery';\nimport {getComponentDef, getDirectiveDef} from '../def_getters';\nimport {NodeInjector} from '../di';\nimport {DirectiveDef} from '../interfaces/definition';\nimport {TElementNode, TNode, TNodeProviderIndexes} from '../interfaces/node';\nimport {isRootView} from '../interfaces/type_checks';\nimport {CLEANUP, CONTEXT, LView, TVIEW, TViewType} from '../interfaces/view';\n\nimport {getRootContext} from './view_traversal_utils';\nimport {getLViewParent, unwrapRNode} from './view_utils';\n\n/**\n * Retrieves the component instance associated with a given DOM element.\n *\n * @usageNotes\n * Given the following DOM structure:\n *\n * ```html\n * <app-root>\n *   <div>\n *     <child-comp></child-comp>\n *   </div>\n * </app-root>\n * ```\n *\n * Calling `getComponent` on `<child-comp>` will return the instance of `ChildComponent`\n * associated with this DOM element.\n *\n * Calling the function on `<app-root>` will return the `MyApp` instance.\n *\n *\n * @param element DOM element from which the component should be retrieved.\n * @returns Component instance associated with the element or `null` if there\n *    is no component associated with it.\n *\n * @publicApi\n */\nexport function getComponent<T>(element: Element): T | null {\n  ngDevMode && assertDomElement(element);\n  const context = getLContext(element);\n  if (context === null) return null;\n\n  if (context.component === undefined) {\n    const lView = context.lView;\n    if (lView === null) {\n      return null;\n    }\n    context.component = getComponentAtNodeIndex(context.nodeIndex, lView);\n  }\n\n  return context.component as unknown as T;\n}\n\n/**\n * If inside an embedded view (e.g. `*ngIf` or `*ngFor`), retrieves the context of the embedded\n * view that the element is part of. Otherwise retrieves the instance of the component whose view\n * owns the element (in this case, the result is the same as calling `getOwningComponent`).\n *\n * @param element Element for which to get the surrounding component instance.\n * @returns Instance of the component that is around the element or null if the element isn't\n *    inside any component.\n *\n * @publicApi\n */\nexport function getContext<T extends {}>(element: Element): T | null {\n  assertDomElement(element);\n  const context = getLContext(element)!;\n  const lView = context ? context.lView : null;\n  return lView === null ? null : (lView[CONTEXT] as T);\n}\n\n/**\n * Retrieves the component instance whose view contains the DOM element.\n *\n * For example, if `<child-comp>` is used in the template of `<app-comp>`\n * (i.e. a `ViewChild` of `<app-comp>`), calling `getOwningComponent` on `<child-comp>`\n * would return `<app-comp>`.\n *\n * @param elementOrDir DOM element, component or directive instance\n *    for which to retrieve the root components.\n * @returns Component instance whose view owns the DOM element or null if the element is not\n *    part of a component view.\n *\n * @publicApi\n */\nexport function getOwningComponent<T>(elementOrDir: Element | {}): T | null {\n  const context = getLContext(elementOrDir)!;\n  let lView = context ? context.lView : null;\n  if (lView === null) return null;\n\n  let parent: LView | null;\n  while (lView[TVIEW].type === TViewType.Embedded && (parent = getLViewParent(lView)!)) {\n    lView = parent;\n  }\n  return isRootView(lView) ? null : (lView[CONTEXT] as unknown as T);\n}\n\n/**\n * Retrieves all root components associated with a DOM element, directive or component instance.\n * Root components are those which have been bootstrapped by Angular.\n *\n * @param elementOrDir DOM element, component or directive instance\n *    for which to retrieve the root components.\n * @returns Root components associated with the target object.\n *\n * @publicApi\n */\nexport function getRootComponents(elementOrDir: Element | {}): {}[] {\n  const lView = readPatchedLView<{}>(elementOrDir);\n  return lView !== null ? [getRootContext(lView)] : [];\n}\n\n/**\n * Retrieves an `Injector` associated with an element, component or directive instance.\n *\n * @param elementOrDir DOM element, component or directive instance for which to\n *    retrieve the injector.\n * @returns Injector associated with the element, component or directive instance.\n *\n * @publicApi\n */\nexport function getInjector(elementOrDir: Element | {}): Injector {\n  const context = getLContext(elementOrDir)!;\n  const lView = context ? context.lView : null;\n  if (lView === null) return Injector.NULL;\n\n  const tNode = lView[TVIEW].data[context.nodeIndex] as TElementNode;\n  return new NodeInjector(tNode, lView);\n}\n\n/**\n * Retrieve a set of injection tokens at a given DOM node.\n *\n * @param element Element for which the injection tokens should be retrieved.\n */\nexport function getInjectionTokens(element: Element): any[] {\n  const context = getLContext(element)!;\n  const lView = context ? context.lView : null;\n  if (lView === null) return [];\n  const tView = lView[TVIEW];\n  const tNode = tView.data[context.nodeIndex] as TNode;\n  const providerTokens: any[] = [];\n  const startIndex = tNode.providerIndexes & TNodeProviderIndexes.ProvidersStartIndexMask;\n  const endIndex = tNode.directiveEnd;\n  for (let i = startIndex; i < endIndex; i++) {\n    let value = tView.data[i];\n    if (isDirectiveDefHack(value)) {\n      // The fact that we sometimes store Type and sometimes DirectiveDef in this location is a\n      // design flaw.  We should always store same type so that we can be monomorphic. The issue\n      // is that for Components/Directives we store the def instead the type. The correct behavior\n      // is that we should always be storing injectable type in this location.\n      value = value.type;\n    }\n    providerTokens.push(value);\n  }\n  return providerTokens;\n}\n\n/**\n * Retrieves directive instances associated with a given DOM node. Does not include\n * component instances.\n *\n * @usageNotes\n * Given the following DOM structure:\n *\n * ```html\n * <app-root>\n *   <button my-button></button>\n *   <my-comp></my-comp>\n * </app-root>\n * ```\n *\n * Calling `getDirectives` on `<button>` will return an array with an instance of the `MyButton`\n * directive that is associated with the DOM node.\n *\n * Calling `getDirectives` on `<my-comp>` will return an empty array.\n *\n * @param node DOM node for which to get the directives.\n * @returns Array of directives associated with the node.\n *\n * @publicApi\n */\nexport function getDirectives(node: Node): {}[] {\n  // Skip text nodes because we can't have directives associated with them.\n  if (node instanceof Text) {\n    return [];\n  }\n\n  const context = getLContext(node)!;\n  const lView = context ? context.lView : null;\n  if (lView === null) {\n    return [];\n  }\n\n  const tView = lView[TVIEW];\n  const nodeIndex = context.nodeIndex;\n  if (!tView?.data[nodeIndex]) {\n    return [];\n  }\n  if (context.directives === undefined) {\n    context.directives = getDirectivesAtNodeIndex(nodeIndex, lView);\n  }\n\n  // The `directives` in this case are a named array called `LComponentView`. Clone the\n  // result so we don't expose an internal data structure in the user's console.\n  return context.directives === null ? [] : [...context.directives];\n}\n\n/**\n * Partial metadata for a given directive instance.\n * This information might be useful for debugging purposes or tooling.\n * Currently only `inputs` and `outputs` metadata is available.\n *\n * @publicApi\n */\nexport interface DirectiveDebugMetadata {\n  inputs: Record<string, string>;\n  outputs: Record<string, string>;\n}\n\n/**\n * Partial metadata for a given component instance.\n * This information might be useful for debugging purposes or tooling.\n * Currently the following fields are available:\n *  - inputs\n *  - outputs\n *  - encapsulation\n *  - changeDetection\n *\n * @publicApi\n */\nexport interface ComponentDebugMetadata extends DirectiveDebugMetadata {\n  encapsulation: ViewEncapsulation;\n  changeDetection: ChangeDetectionStrategy;\n}\n\n/**\n * Returns the debug (partial) metadata for a particular directive or component instance.\n * The function accepts an instance of a directive or component and returns the corresponding\n * metadata.\n *\n * @param directiveOrComponentInstance Instance of a directive or component\n * @returns metadata of the passed directive or component\n *\n * @publicApi\n */\nexport function getDirectiveMetadata(\n  directiveOrComponentInstance: any,\n): ComponentDebugMetadata | DirectiveDebugMetadata | null {\n  const {constructor} = directiveOrComponentInstance;\n  if (!constructor) {\n    throw new Error('Unable to find the instance constructor');\n  }\n  // In case a component inherits from a directive, we may have component and directive metadata\n  // To ensure we don't get the metadata of the directive, we want to call `getComponentDef` first.\n  const componentDef = getComponentDef(constructor);\n  if (componentDef) {\n    const inputs = extractInputDebugMetadata(componentDef.inputs);\n    return {\n      inputs,\n      outputs: componentDef.outputs,\n      encapsulation: componentDef.encapsulation,\n      changeDetection: componentDef.onPush\n        ? ChangeDetectionStrategy.OnPush\n        : ChangeDetectionStrategy.Default,\n    };\n  }\n  const directiveDef = getDirectiveDef(constructor);\n  if (directiveDef) {\n    const inputs = extractInputDebugMetadata(directiveDef.inputs);\n    return {inputs, outputs: directiveDef.outputs};\n  }\n  return null;\n}\n\n/**\n * Retrieve map of local references.\n *\n * The references are retrieved as a map of local reference name to element or directive instance.\n *\n * @param target DOM element, component or directive instance for which to retrieve\n *    the local references.\n */\nexport function getLocalRefs(target: {}): {[key: string]: any} {\n  const context = getLContext(target);\n  if (context === null) return {};\n\n  if (context.localRefs === undefined) {\n    const lView = context.lView;\n    if (lView === null) {\n      return {};\n    }\n    context.localRefs = discoverLocalRefs(lView, context.nodeIndex);\n  }\n\n  return context.localRefs || {};\n}\n\n/**\n * Retrieves the host element of a component or directive instance.\n * The host element is the DOM element that matched the selector of the directive.\n *\n * @param componentOrDirective Component or directive instance for which the host\n *     element should be retrieved.\n * @returns Host element of the target.\n *\n * @publicApi\n */\nexport function getHostElement(componentOrDirective: {}): Element {\n  return getLContext(componentOrDirective)!.native as unknown as Element;\n}\n\n/**\n * Retrieves the rendered text for a given component.\n *\n * This function retrieves the host element of a component and\n * and then returns the `textContent` for that element. This implies\n * that the text returned will include re-projected content of\n * the component as well.\n *\n * @param component The component to return the content text for.\n */\nexport function getRenderedText(component: any): string {\n  const hostElement = getHostElement(component);\n  return hostElement.textContent || '';\n}\n\n/**\n * Event listener configuration returned from `getListeners`.\n * @publicApi\n */\nexport interface Listener {\n  /** Name of the event listener. */\n  name: string;\n  /** Element that the listener is bound to. */\n  element: Element;\n  /** Callback that is invoked when the event is triggered. */\n  callback: (value: any) => any;\n  /** Whether the listener is using event capturing. */\n  useCapture: boolean;\n  /**\n   * Type of the listener (e.g. a native DOM event or a custom @Output).\n   */\n  type: 'dom' | 'output';\n}\n\n/**\n * Retrieves a list of event listeners associated with a DOM element. The list does include host\n * listeners, but it does not include event listeners defined outside of the Angular context\n * (e.g. through `addEventListener`).\n *\n * @usageNotes\n * Given the following DOM structure:\n *\n * ```html\n * <app-root>\n *   <div (click)=\"doSomething()\"></div>\n * </app-root>\n * ```\n *\n * Calling `getListeners` on `<div>` will return an object that looks as follows:\n *\n * ```ts\n * {\n *   name: 'click',\n *   element: <div>,\n *   callback: () => doSomething(),\n *   useCapture: false\n * }\n * ```\n *\n * @param element Element for which the DOM listeners should be retrieved.\n * @returns Array of event listeners on the DOM element.\n *\n * @publicApi\n */\nexport function getListeners(element: Element): Listener[] {\n  ngDevMode && assertDomElement(element);\n  const lContext = getLContext(element);\n  const lView = lContext === null ? null : lContext.lView;\n  if (lView === null) return [];\n\n  const tView = lView[TVIEW];\n  const lCleanup = lView[CLEANUP];\n  const tCleanup = tView.cleanup;\n  const listeners: Listener[] = [];\n  if (tCleanup && lCleanup) {\n    for (let i = 0; i < tCleanup.length; ) {\n      const firstParam = tCleanup[i++];\n      const secondParam = tCleanup[i++];\n      if (typeof firstParam === 'string') {\n        const name: string = firstParam;\n        const listenerElement = unwrapRNode(lView[secondParam]) as any as Element;\n        const callback: (value: any) => any = lCleanup[tCleanup[i++]];\n        const useCaptureOrIndx = tCleanup[i++];\n        // if useCaptureOrIndx is boolean then report it as is.\n        // if useCaptureOrIndx is positive number then it in unsubscribe method\n        // if useCaptureOrIndx is negative number then it is a Subscription\n        const type =\n          typeof useCaptureOrIndx === 'boolean' || useCaptureOrIndx >= 0 ? 'dom' : 'output';\n        const useCapture = typeof useCaptureOrIndx === 'boolean' ? useCaptureOrIndx : false;\n        if (element == listenerElement) {\n          listeners.push({element, name, callback, useCapture, type});\n        }\n      }\n    }\n  }\n  listeners.sort(sortListeners);\n  return listeners;\n}\n\nfunction sortListeners(a: Listener, b: Listener) {\n  if (a.name == b.name) return 0;\n  return a.name < b.name ? -1 : 1;\n}\n\n/**\n * This function should not exist because it is megamorphic and only mostly correct.\n *\n * See call site for more info.\n */\nfunction isDirectiveDefHack(obj: any): obj is DirectiveDef<any> {\n  return (\n    obj.type !== undefined &&\n    obj.declaredInputs !== undefined &&\n    obj.findHostDirectiveDefs !== undefined\n  );\n}\n\n/**\n * Retrieve the component `LView` from component/element.\n *\n * NOTE: `LView` is a private and should not be leaked outside.\n *       Don't export this method to `ng.*` on window.\n *\n * @param target DOM element or component instance for which to retrieve the LView.\n */\nexport function getComponentLView(target: any): LView {\n  const lContext = getLContext(target)!;\n  const nodeIndx = lContext.nodeIndex;\n  const lView = lContext.lView!;\n  ngDevMode && assertLView(lView);\n  const componentLView = lView[nodeIndx];\n  ngDevMode && assertLView(componentLView);\n  return componentLView;\n}\n\n/** Asserts that a value is a DOM Element. */\nfunction assertDomElement(value: any) {\n  if (typeof Element !== 'undefined' && !(value instanceof Element)) {\n    throw new Error('Expecting instance of DOM Element');\n  }\n}\n\n/**\n * A directive definition holds additional metadata using bitwise flags to indicate\n * for example whether it is signal based.\n *\n * This information needs to be separate from the `publicName -> minifiedName`\n * mappings for backwards compatibility.\n */\nfunction extractInputDebugMetadata<T>(inputs: DirectiveDef<T>['inputs']) {\n  const res: DirectiveDebugMetadata['inputs'] = {};\n\n  for (const key in inputs) {\n    if (inputs.hasOwnProperty(key)) {\n      const value = inputs[key];\n\n      if (value !== undefined) {\n        res[key] = value[0];\n      }\n    }\n  }\n\n  return res;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\n\n/**\n * Most of the use of `document` in Angular is from within the DI system so it is possible to simply\n * inject the `DOCUMENT` token and are done.\n *\n * Ivy is special because it does not rely upon the DI and must get hold of the document some other\n * way.\n *\n * The solution is to define `getDocument()` and `setDocument()` top-level functions for ivy.\n * Wherever ivy needs the global document, it calls `getDocument()` instead.\n *\n * When running ivy outside of a browser environment, it is necessary to call `setDocument()` to\n * tell ivy what the global `document` is.\n *\n * Angular does this for us in each of the standard platforms (`Browser` and `Server`)\n * by calling `setDocument()` when providing the `DOCUMENT` token.\n */\nlet DOCUMENT: Document | undefined = undefined;\n\n/**\n * Tell ivy what the `document` is for this platform.\n *\n * It is only necessary to call this if the current platform is not a browser.\n *\n * @param document The object representing the global `document` in this environment.\n */\nexport function setDocument(document: Document | undefined): void {\n  DOCUMENT = document;\n}\n\n/**\n * Access the object that represents the `document` for this platform.\n *\n * Ivy calls this whenever it needs to access the `document` object.\n * For example to create the renderer or to do sanitization.\n */\nexport function getDocument(): Document {\n  if (DOCUMENT !== undefined) {\n    return DOCUMENT;\n  } else if (typeof document !== 'undefined') {\n    return document;\n  }\n\n  throw new RuntimeError(\n    RuntimeErrorCode.MISSING_DOCUMENT,\n    (typeof ngDevMode === 'undefined' || ngDevMode) &&\n      `The document object is not available in this context. Make sure the DOCUMENT injection token is provided.`,\n  );\n\n  // No \"document\" can be found. This should only happen if we are running ivy outside Angular and\n  // the current platform is not a browser. Since this is not a supported scenario at the moment\n  // this should not happen in Angular apps.\n  // Once we support running ivy outside of Angular we will need to publish `setDocument()` as a\n  // public API.\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '../di/injection_token';\nimport {getDocument} from '../render3/interfaces/document';\n\n/**\n * A DI token representing a string ID, used\n * primarily for prefixing application attributes and CSS styles when\n * {@link ViewEncapsulation#Emulated} is being used.\n *\n * The token is needed in cases when multiple applications are bootstrapped on a page\n * (for example, using `bootstrapApplication` calls). In this case, ensure that those applications\n * have different `APP_ID` value setup. For example:\n *\n * ```ts\n * bootstrapApplication(ComponentA, {\n *   providers: [\n *     { provide: APP_ID, useValue: 'app-a' },\n *     // ... other providers ...\n *   ]\n * });\n *\n * bootstrapApplication(ComponentB, {\n *   providers: [\n *     { provide: APP_ID, useValue: 'app-b' },\n *     // ... other providers ...\n *   ]\n * });\n * ```\n *\n * By default, when there is only one application bootstrapped, you don't need to provide the\n * `APP_ID` token (the `ng` will be used as an app ID).\n *\n * @publicApi\n */\nexport const APP_ID = new InjectionToken<string>(ngDevMode ? 'AppId' : '', {\n  providedIn: 'root',\n  factory: () => DEFAULT_APP_ID,\n});\n\n/** Default value of the `APP_ID` token. */\nconst DEFAULT_APP_ID = 'ng';\n\n/**\n * A function that is executed when a platform is initialized.\n *\n * @deprecated from v19.0.0, use providePlatformInitializer instead\n *\n * @see {@link providePlatformInitializer}\n *\n * @publicApi\n */\nexport const PLATFORM_INITIALIZER = new InjectionToken<ReadonlyArray<() => void>>(\n  ngDevMode ? 'Platform Initializer' : '',\n);\n\n/**\n * A token that indicates an opaque platform ID.\n * @publicApi\n */\nexport const PLATFORM_ID = new InjectionToken<Object>(ngDevMode ? 'Platform ID' : '', {\n  providedIn: 'platform',\n  factory: () => 'unknown', // set a default platform name, when none set explicitly\n});\n\n/**\n * A DI token that indicates the root directory of\n * the application\n * @publicApi\n * @deprecated\n */\nexport const PACKAGE_ROOT_URL = new InjectionToken<string>(\n  ngDevMode ? 'Application Packages Root URL' : '',\n);\n\n// We keep this token here, rather than the animations package, so that modules that only care\n// about which animations module is loaded (e.g. the CDK) can retrieve it without having to\n// include extra dependencies. See #44970 for more context.\n\n/**\n * A [DI token](api/core/InjectionToken) that indicates which animations\n * module has been loaded.\n * @publicApi\n */\nexport const ANIMATION_MODULE_TYPE = new InjectionToken<'NoopAnimations' | 'BrowserAnimations'>(\n  ngDevMode ? 'AnimationModuleType' : '',\n);\n\n// TODO(crisbeto): link to CSP guide here.\n/**\n * Token used to configure the [Content Security Policy](https://web.dev/strict-csp/) nonce that\n * Angular will apply when inserting inline styles. If not provided, Angular will look up its value\n * from the `ngCspNonce` attribute of the application root node.\n *\n * @publicApi\n */\nexport const CSP_NONCE = new InjectionToken<string | null>(ngDevMode ? 'CSP nonce' : '', {\n  providedIn: 'root',\n  factory: () => {\n    // Ideally we wouldn't have to use `querySelector` here since we know that the nonce will be on\n    // the root node, but because the token value is used in renderers, it has to be available\n    // *very* early in the bootstrapping process. This should be a fairly shallow search, because\n    // the app won't have been added to the DOM yet. Some approaches that were considered:\n    // 1. Find the root node through `ApplicationRef.components[i].location` - normally this would\n    // be enough for our purposes, but the token is injected very early so the `components` array\n    // isn't populated yet.\n    // 2. Find the root `LView` through the current `LView` - renderers are a prerequisite to\n    // creating the `LView`. This means that no `LView` will have been entered when this factory is\n    // invoked for the root component.\n    // 3. Have the token factory return `() => string` which is invoked when a nonce is requested -\n    // the slightly later execution does allow us to get an `LView` reference, but the fact that\n    // it is a function means that it could be executed at *any* time (including immediately) which\n    // may lead to weird bugs.\n    // 4. Have the `ComponentFactory` read the attribute and provide it to the injector under the\n    // hood - has the same problem as #1 and #2 in that the renderer is used to query for the root\n    // node and the nonce value needs to be available when the renderer is created.\n    return getDocument().body?.querySelector('[ngCspNonce]')?.getAttribute('ngCspNonce') || null;\n  },\n});\n\n/**\n * A configuration object for the image-related options. Contains:\n * - breakpoints: An array of integer breakpoints used to generate\n *      srcsets for responsive images.\n * - disableImageSizeWarning: A boolean value. Setting this to true will\n *      disable console warnings about oversized images.\n * - disableImageLazyLoadWarning: A boolean value. Setting this to true will\n *      disable console warnings about LCP images configured with `loading=\"lazy\"`.\n * Learn more about the responsive image configuration in [the NgOptimizedImage\n * guide](guide/image-optimization).\n * Learn more about image warning options in [the related error page](errors/NG0913).\n * @publicApi\n */\nexport type ImageConfig = {\n  breakpoints?: number[];\n  placeholderResolution?: number;\n  disableImageSizeWarning?: boolean;\n  disableImageLazyLoadWarning?: boolean;\n};\n\nexport const IMAGE_CONFIG_DEFAULTS: ImageConfig = {\n  breakpoints: [16, 32, 48, 64, 96, 128, 256, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840],\n  placeholderResolution: 30,\n  disableImageSizeWarning: false,\n  disableImageLazyLoadWarning: false,\n};\n\n/**\n * Injection token that configures the image optimized image functionality.\n * See {@link ImageConfig} for additional information about parameters that\n * can be used.\n *\n * @see {@link NgOptimizedImage}\n * @see {@link ImageConfig}\n * @publicApi\n */\nexport const IMAGE_CONFIG = new InjectionToken<ImageConfig>(ngDevMode ? 'ImageConfig' : '', {\n  providedIn: 'root',\n  factory: () => IMAGE_CONFIG_DEFAULTS,\n});\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {APP_ID} from './application/application_tokens';\nimport {inject} from './di/injector_compatibility';\nimport {ɵɵdefineInjectable} from './di/interface/defs';\nimport {getDocument} from './render3/interfaces/document';\n\n/**\n * A type-safe key to use with `TransferState`.\n *\n * Example:\n *\n * ```ts\n * const COUNTER_KEY = makeStateKey<number>('counter');\n * let value = 10;\n *\n * transferState.set(COUNTER_KEY, value);\n * ```\n *\n * @publicApi\n */\nexport type StateKey<T> = string & {\n  __not_a_string: never;\n  __value_type?: T;\n};\n\n/**\n * Create a `StateKey<T>` that can be used to store value of type T with `TransferState`.\n *\n * Example:\n *\n * ```ts\n * const COUNTER_KEY = makeStateKey<number>('counter');\n * let value = 10;\n *\n * transferState.set(COUNTER_KEY, value);\n * ```\n *\n * @publicApi\n */\nexport function makeStateKey<T = void>(key: string): StateKey<T> {\n  return key as StateKey<T>;\n}\n\nfunction initTransferState(): TransferState {\n  const transferState = new TransferState();\n  if (typeof ngServerMode === 'undefined' || !ngServerMode) {\n    transferState.store = retrieveTransferredState(getDocument(), inject(APP_ID));\n  }\n\n  return transferState;\n}\n\n/**\n * A key value store that is transferred from the application on the server side to the application\n * on the client side.\n *\n * The `TransferState` is available as an injectable token.\n * On the client, just inject this token using DI and use it, it will be lazily initialized.\n * On the server it's already included if `renderApplication` function is used. Otherwise, import\n * the `ServerTransferStateModule` module to make the `TransferState` available.\n *\n * The values in the store are serialized/deserialized using JSON.stringify/JSON.parse. So only\n * boolean, number, string, null and non-class objects will be serialized and deserialized in a\n * non-lossy manner.\n *\n * @publicApi\n */\nexport class TransferState {\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: TransferState,\n    providedIn: 'root',\n    factory: initTransferState,\n  });\n\n  /** @internal */\n  store: Record<string, unknown | undefined> = {};\n\n  private onSerializeCallbacks: {[k: string]: () => unknown | undefined} = {};\n\n  /**\n   * Get the value corresponding to a key. Return `defaultValue` if key is not found.\n   */\n  get<T>(key: StateKey<T>, defaultValue: T): T {\n    return this.store[key] !== undefined ? (this.store[key] as T) : defaultValue;\n  }\n\n  /**\n   * Set the value corresponding to a key.\n   */\n  set<T>(key: StateKey<T>, value: T): void {\n    this.store[key] = value;\n  }\n\n  /**\n   * Remove a key from the store.\n   */\n  remove<T>(key: StateKey<T>): void {\n    delete this.store[key];\n  }\n\n  /**\n   * Test whether a key exists in the store.\n   */\n  hasKey<T>(key: StateKey<T>): boolean {\n    return this.store.hasOwnProperty(key);\n  }\n\n  /**\n   * Indicates whether the state is empty.\n   */\n  get isEmpty(): boolean {\n    return Object.keys(this.store).length === 0;\n  }\n\n  /**\n   * Register a callback to provide the value for a key when `toJson` is called.\n   */\n  onSerialize<T>(key: StateKey<T>, callback: () => T): void {\n    this.onSerializeCallbacks[key] = callback;\n  }\n\n  /**\n   * Serialize the current state of the store to JSON.\n   */\n  toJson(): string {\n    // Call the onSerialize callbacks and put those values into the store.\n    for (const key in this.onSerializeCallbacks) {\n      if (this.onSerializeCallbacks.hasOwnProperty(key)) {\n        try {\n          this.store[key] = this.onSerializeCallbacks[key]();\n        } catch (e) {\n          console.warn('Exception in onSerialize callback: ', e);\n        }\n      }\n    }\n\n    // Escape script tag to avoid break out of <script> tag in serialized output.\n    // Encoding of `<` is the same behaviour as G3 script_builders.\n    return JSON.stringify(this.store).replace(/</g, '\\\\u003C');\n  }\n}\n\nfunction retrieveTransferredState(\n  doc: Document,\n  appId: string,\n): Record<string, unknown | undefined> {\n  // Locate the script tag with the JSON data transferred from the server.\n  // The id of the script tag is set to the Angular appId + 'state'.\n  const script = doc.getElementById(appId + '-state');\n  if (script?.textContent) {\n    try {\n      // Avoid using any here as it triggers lint errors in google3 (any is not allowed).\n      // Decoding of `<` is done of the box by browsers and node.js, same behaviour as G3\n      // script_builders.\n      return JSON.parse(script.textContent) as {};\n    } catch (e) {\n      console.warn('Exception while restoring TransferState for app ' + appId, e);\n    }\n  }\n\n  return {};\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {DeferBlockTrigger} from '../defer/interfaces';\nimport type {I18nICUNode} from '../render3/interfaces/i18n';\nimport {RNode} from '../render3/interfaces/renderer_dom';\n\n/** Encodes that the node lookup should start from the host node of this component. */\nexport const REFERENCE_NODE_HOST = 'h';\n\n/** Encodes that the node lookup should start from the document body node. */\nexport const REFERENCE_NODE_BODY = 'b';\n\n/**\n * Describes navigation steps that the runtime logic need to perform,\n * starting from a given (known) element.\n * We're not using enum `NodeNavigationStep` because it produces more code overhead;\n * thus, using plain `const` eliminates extra bytes. We can't use `const enum` due\n * to single-file compilation restrictions.\n */\n\nexport type NodeNavigationStep = 'f' | 'n';\n\nexport const NODE_NAVIGATION_STEP_FIRST_CHILD = 'f';\nexport const NODE_NAVIGATION_STEP_NEXT_SIBLING = 'n';\n\n/**\n * Keys within serialized view data structure to represent various\n * parts. See the `SerializedView` interface below for additional information.\n */\nexport const ELEMENT_CONTAINERS = 'e';\nexport const TEMPLATES = 't';\nexport const CONTAINERS = 'c';\nexport const MULTIPLIER = 'x';\nexport const NUM_ROOT_NODES = 'r';\nexport const TEMPLATE_ID = 'i'; // as it's also an \"id\"\nexport const NODES = 'n';\nexport const DISCONNECTED_NODES = 'd';\nexport const I18N_DATA = 'l';\nexport const DEFER_BLOCK_ID = 'di';\nexport const DEFER_BLOCK_STATE = 's';\nexport const DEFER_PARENT_BLOCK_ID = 'p';\nexport const DEFER_HYDRATE_TRIGGERS = 't';\nexport const DEFER_PREFETCH_TRIGGERS = 'pt';\n\n/**\n * Represents element containers within this view, stored as key-value pairs\n * where key is an index of a container in an LView (also used in the\n * `elementContainerStart` instruction), the value is the number of root nodes\n * in this container. This information is needed to locate an anchor comment\n * node that goes after all container nodes.\n */\nexport interface SerializedElementContainers {\n  [key: number]: number;\n}\n\n/**\n * Serialized data structure that contains relevant hydration\n * annotation information that describes a given hydration boundary\n * (e.g. a component).\n */\nexport interface SerializedView {\n  /**\n   * Serialized information about <ng-container>s.\n   */\n  [ELEMENT_CONTAINERS]?: SerializedElementContainers;\n\n  /**\n   * Serialized information about templates.\n   * Key-value pairs where a key is an index of the corresponding\n   * `template` instruction and the value is a unique id that can\n   * be used during hydration to identify that template.\n   */\n  [TEMPLATES]?: Record<number, string>;\n\n  /**\n   * Serialized information about view containers.\n   * Key-value pairs where a key is an index of the corresponding\n   * LContainer entry within an LView, and the value is a list\n   * of serialized information about views within this container.\n   */\n  [CONTAINERS]?: Record<number, SerializedContainerView[]>;\n\n  /**\n   * Serialized information about nodes in a template.\n   * Key-value pairs where a key is an index of the corresponding\n   * DOM node in an LView and the value is a path that describes\n   * the location of this node (as a set of navigation instructions).\n   */\n  [NODES]?: Record<number, string>;\n\n  /**\n   * A list of ids which represents a set of nodes disconnected\n   * from the DOM tree at the serialization time, but otherwise\n   * present in the internal data structures.\n   *\n   * This information is used to avoid triggering the hydration\n   * logic for such nodes and instead use a regular \"creation mode\".\n   */\n  [DISCONNECTED_NODES]?: number[];\n\n  /**\n   * Serialized information about i18n blocks in a template.\n   * Key-value pairs where a key is an index of the corresponding\n   * i18n entry within an LView, and the value is a list of\n   * active ICU cases.\n   */\n  [I18N_DATA]?: Record<number, number[]>;\n\n  /**\n   * If this view represents a `@defer` block, this field contains\n   * unique id of the block.\n   */\n  [DEFER_BLOCK_ID]?: string;\n\n  /**\n   * This field represents a status, based on the `DeferBlockState` enum.\n   */\n  [DEFER_BLOCK_STATE]?: number;\n}\n\n/**\n * Serialized data structure that contains relevant hydration\n * annotation information about a view that is a p   art of a\n * ViewContainer collection.\n */\nexport interface SerializedContainerView extends SerializedView {\n  /**\n   * Unique id that represents a TView that was used to create\n   * a given instance of a view:\n   *  - TViewType.Embedded: a unique id generated during serialization on the server\n   *  - TViewType.Component: an id generated based on component properties\n   *                        (see `getComponentId` function for details)\n   */\n  [TEMPLATE_ID]: string;\n\n  /**\n   * Number of root nodes that belong to this view.\n   * This information is needed to effectively traverse the DOM tree\n   * and identify segments that belong to different views.\n   */\n  [NUM_ROOT_NODES]: number;\n\n  /**\n   * Number of times this view is repeated.\n   * This is used to avoid serializing and sending the same hydration\n   * information about similar views (for example, produced by *ngFor).\n   */\n  [MULTIPLIER]?: number;\n}\n\n/**\n * Serialized data structure that contains relevant defer block\n * information that describes a given incremental hydration boundary\n */\nexport interface SerializedDeferBlock {\n  /**\n   * This contains the unique id of this defer block's parent, if it exists.\n   */\n  [DEFER_PARENT_BLOCK_ID]?: string;\n\n  /**\n   * This field represents a status, based on the `DeferBlockState` enum.\n   */\n  [DEFER_BLOCK_STATE]?: number;\n\n  /**\n   * Number of root nodes that belong to this defer block's template.\n   * This information is needed to effectively traverse the DOM tree\n   * and add jsaction attributes to root nodes appropriately for\n   * incremental hydration.\n   */\n  [NUM_ROOT_NODES]: number;\n\n  /**\n   * The list of triggers that exist for incremental hydration, based on the\n   * `Trigger` enum.\n   */\n  [DEFER_HYDRATE_TRIGGERS]?: (DeferBlockTrigger | SerializedTriggerDetails)[];\n}\n\nexport interface SerializedTriggerDetails {\n  trigger: DeferBlockTrigger;\n  delay?: number;\n}\n\n/**\n * An object that contains hydration-related information serialized\n * on the server, as well as the necessary references to segments of\n * the DOM, to facilitate the hydration process for a given hydration\n * boundary on the client.\n */\nexport interface DehydratedView {\n  /**\n   * The readonly hydration annotation data.\n   */\n  data: Readonly<SerializedView>;\n\n  /**\n   * A reference to the first child in a DOM segment associated\n   * with a given hydration boundary.\n   *\n   * Once a view becomes hydrated, the value is set to `null`, which\n   * indicates that further detaching/attaching view actions should result\n   * in invoking corresponding DOM actions (attaching DOM nodes action is\n   * skipped when we hydrate, since nodes are already in the DOM).\n   */\n  firstChild: RNode | null;\n\n  /**\n   * Stores references to first nodes in DOM segments that\n   * represent either an <ng-container> or a view container.\n   */\n  segmentHeads?: {[index: number]: RNode | null};\n\n  /**\n   * An instance of a Set that represents nodes disconnected from\n   * the DOM tree at the serialization time, but otherwise present\n   * in the internal data structures.\n   *\n   * The Set is based on the `SerializedView[DISCONNECTED_NODES]` data\n   * and is needed to have constant-time lookups.\n   *\n   * If the value is `null`, it means that there were no disconnected\n   * nodes detected in this view at serialization time.\n   */\n  disconnectedNodes?: Set<number> | null;\n\n  /**\n   * A mapping from a view to the first child to begin claiming nodes.\n   *\n   * This mapping is generated by an i18n block, and is the source of\n   * truth for the nodes inside of it.\n   */\n  i18nNodes?: Map<number, RNode | null>;\n\n  /**\n   * A mapping from the index of an ICU node to dehydrated data for it.\n   *\n   * This information is used during the hydration process on the client.\n   * ICU cases that were active during server-side rendering will be added\n   * to the map. The hydration logic will \"claim\" matching cases, removing\n   * them from the map. The remaining entries are \"unclaimed\", and will be\n   * removed from the DOM during hydration cleanup.\n   */\n  dehydratedIcuData?: Map<number, DehydratedIcuData>;\n}\n\n/**\n * An object that contains hydration-related information serialized\n * on the server, as well as the necessary references to segments of\n * the DOM, to facilitate the hydration process for a given view\n * inside a view container (either an embedded view or a view created\n * for a component).\n */\nexport interface DehydratedContainerView extends DehydratedView {\n  data: Readonly<SerializedContainerView>;\n}\n\n/**\n * An object that contains information about a dehydrated ICU case,\n * to facilitate cleaning up ICU cases that were active during\n * server-side rendering, but not during hydration.\n */\nexport interface DehydratedIcuData {\n  /**\n   * The case index that this data represents.\n   */\n  case: number;\n\n  /**\n   * A reference back to the AST for the ICU node. This allows the\n   * AST to be used to clean up dehydrated nodes.\n   */\n  node: I18nICUNode;\n}\n\n/**\n * Summarizes the presence of specific types of triggers anywhere in the DOM\n */\nexport interface BlockSummary {\n  data: SerializedDeferBlock;\n  hydrate: {idle: boolean; immediate: boolean; viewport: boolean; timer: number | null};\n}\n\n/**\n * The details of a specific element's trigger and how it is associated to a block\n */\nexport interface ElementTrigger {\n  el: HTMLElement;\n  blockName: string;\n  delay?: number;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '../di/injection_token';\n\n/**\n * Internal token that specifies whether DOM reuse logic\n * during hydration is enabled.\n */\nexport const IS_HYDRATION_DOM_REUSE_ENABLED = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || !!ngDevMode ? 'IS_HYDRATION_DOM_REUSE_ENABLED' : '',\n);\n\n// By default (in client rendering mode), we remove all the contents\n// of the host element and render an application after that.\nexport const PRESERVE_HOST_CONTENT_DEFAULT = false;\n\n/**\n * Internal token that indicates whether host element content should be\n * retained during the bootstrap.\n */\nexport const PRESERVE_HOST_CONTENT = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || !!ngDevMode ? 'PRESERVE_HOST_CONTENT' : '',\n  {\n    providedIn: 'root',\n    factory: () => PRESERVE_HOST_CONTENT_DEFAULT,\n  },\n);\n\n/**\n * Internal token that indicates whether hydration support for i18n\n * is enabled.\n */\nexport const IS_I18N_HYDRATION_ENABLED = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || !!ngDevMode ? 'IS_I18N_HYDRATION_ENABLED' : '',\n);\n\n/**\n * Internal token that indicates whether event replay support for SSR\n * is enabled.\n */\nexport const IS_EVENT_REPLAY_ENABLED = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || !!ngDevMode ? 'IS_EVENT_REPLAY_ENABLED' : '',\n);\n\nexport const EVENT_REPLAY_ENABLED_DEFAULT = false;\n\n/**\n * Internal token that indicates whether incremental hydration support\n * is enabled.\n */\nexport const IS_INCREMENTAL_HYDRATION_ENABLED = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || !!ngDevMode ? 'IS_INCREMENTAL_HYDRATION_ENABLED' : '',\n);\n\n/**\n * A map of DOM elements with `jsaction` attributes grouped by action names.\n */\nexport const JSACTION_BLOCK_ELEMENT_MAP = new InjectionToken<Map<string, Set<Element>>>(\n  ngDevMode ? 'JSACTION_BLOCK_ELEMENT_MAP' : '',\n  {\n    providedIn: 'root',\n    factory: () => new Map<string, Set<Element>>(),\n  },\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '../di/injection_token';\n\n/** Actions that are supported by the tracing framework. */\nexport enum TracingAction {\n  CHANGE_DETECTION,\n  AFTER_NEXT_RENDER,\n}\n\n/** A single tracing snapshot. */\nexport interface TracingSnapshot {\n  run<T>(action: TracingAction, fn: () => T): T;\n\n  /** Disposes of the tracing snapshot. Must be run exactly once per TracingSnapshot. */\n  dispose(): void;\n}\n\n/**\n * Injection token for a `TracingService`, optionally provided.\n */\nexport const TracingService = new InjectionToken<TracingService<TracingSnapshot>>(\n  ngDevMode ? 'TracingService' : '',\n);\n\n/**\n * Tracing mechanism which can associate causes (snapshots) with runs of\n * subsequent operations.\n *\n * Not defined by Angular directly, but defined in contexts where tracing is\n * desired.\n */\nexport interface TracingService<T extends TracingSnapshot> {\n  /**\n   * Take a snapshot of the current context which will be stored by Angular and\n   * used when additional work is performed that was scheduled in this context.\n   *\n   * @param linkedSnapshot Optional snapshot to use link to the current context.\n   * The caller is no longer responsible for calling dispose on the linkedSnapshot.\n   *\n   * @return The tracing snapshot. The caller is responsible for diposing of the\n   * snapshot.\n   */\n  snapshot(linkedSnapshot: T | null): T;\n\n  /**\n   * Wrap an event listener bound by the framework for tracing.\n   * @param element Element on which the event is bound.\n   * @param eventName Name of the event.\n   * @param handler Event handler.\n   * @return A new event handler to be bound instead of the original one.\n   */\n  wrapEventListener?<T extends Function>(element: HTMLElement, eventName: string, handler: T): T;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nconst markedFeatures = new Set<string>();\n\n// tslint:disable:ban\n/**\n * A guarded `performance.mark` for feature marking.\n *\n * This method exists because while all supported browser and node.js version supported by Angular\n * support performance.mark API. This is not the case for other environments such as JSDOM and\n * Cloudflare workers.\n */\nexport function performanceMarkFeature(feature: string): void {\n  if (markedFeatures.has(feature)) {\n    return;\n  }\n  markedFeatures.add(feature);\n  performance?.mark?.('mark_feature_usage', {detail: {feature}});\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {getActiveConsumer} from '../../../primitives/signals';\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\n\n/**\n * Asserts that the current stack frame is not within a reactive context. Useful\n * to disallow certain code from running inside a reactive context (see {@link /api/core/rxjs/toSignal toSignal})\n *\n * @param debugFn a reference to the function making the assertion (used for the error message).\n *\n * @publicApi\n */\nexport function assertNotInReactiveContext(debugFn: Function, extraContext?: string): void {\n  // Taking a `Function` instead of a string name here prevents the un-minified name of the function\n  // from being retained in the bundle regardless of minification.\n  if (getActiveConsumer() !== null) {\n    throw new RuntimeError(\n      RuntimeErrorCode.ASSERTION_NOT_INSIDE_REACTIVE_CONTEXT,\n      ngDevMode &&\n        `${debugFn.name}() cannot be called from within a reactive context.${\n          extraContext ? ` ${extraContext}` : ''\n        }`,\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {TNode} from './interfaces/node';\nimport type {LView} from './interfaces/view';\nimport {getCurrentTNode, getLView} from './state';\n\nexport class ViewContext {\n  constructor(\n    readonly view: LView,\n    readonly node: TNode,\n  ) {}\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ELEMENT_ID__ = injectViewContext;\n}\n\nexport function injectViewContext(): ViewContext {\n  return new ViewContext(getLView()!, getCurrentTNode()!);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * The phase to run an `afterRender` or `afterNextRender` callback in.\n *\n * Callbacks in the same phase run in the order they are registered. Phases run in the\n * following order after each render:\n *\n *   1. `AfterRenderPhase.EarlyRead`\n *   2. `AfterRenderPhase.Write`\n *   3. `AfterRenderPhase.MixedReadWrite`\n *   4. `AfterRenderPhase.Read`\n *\n * Angular is unable to verify or enforce that phases are used correctly, and instead\n * relies on each developer to follow the guidelines documented for each value and\n * carefully choose the appropriate one, refactoring their code if necessary. By doing\n * so, Angular is better able to minimize the performance degradation associated with\n * manual DOM access, ensuring the best experience for the end users of your application\n * or library.\n *\n * @deprecated Specify the phase for your callback to run in by passing a spec-object as the first\n *   parameter to `afterRender` or `afterNextRender` instead of a function.\n */\nexport enum AfterRenderPhase {\n  /**\n   * Use `AfterRenderPhase.EarlyRead` for callbacks that only need to **read** from the\n   * DOM before a subsequent `AfterRenderPhase.Write` callback, for example to perform\n   * custom layout that the browser doesn't natively support. Prefer the\n   * `AfterRenderPhase.Read` phase if reading can wait until after the write phase.\n   * **Never** write to the DOM in this phase.\n   *\n   * <div class=\"docs-alert docs-alert-important\">\n   *\n   * Using this value can degrade performance.\n   * Instead, prefer using built-in browser functionality when possible.\n   *\n   * </div>\n   */\n  EarlyRead,\n\n  /**\n   * Use `AfterRenderPhase.Write` for callbacks that only **write** to the DOM. **Never**\n   * read from the DOM in this phase.\n   */\n  Write,\n\n  /**\n   * Use `AfterRenderPhase.MixedReadWrite` for callbacks that read from or write to the\n   * DOM, that haven't been refactored to use a different phase. **Never** use this phase if\n   * it is possible to divide the work among the other phases instead.\n   *\n   * <div class=\"docs-alert docs-alert-critical\">\n   *\n   * Using this value can **significantly** degrade performance.\n   * Instead, prefer dividing work into the appropriate phase callbacks.\n   *\n   * </div>\n   */\n  MixedReadWrite,\n\n  /**\n   * Use `AfterRenderPhase.Read` for callbacks that only **read** from the DOM. **Never**\n   * write to the DOM in this phase.\n   */\n  Read,\n}\n\n/**\n * A callback that runs after render.\n *\n * @developerPreview\n */\nexport interface AfterRenderRef {\n  /**\n   * Shut down the callback, preventing it from being called again.\n   */\n  destroy(): void;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {TracingAction, TracingService, TracingSnapshot} from '../../application/tracing';\nimport {\n  ChangeDetectionScheduler,\n  NotificationSource,\n} from '../../change_detection/scheduling/zoneless_scheduling';\nimport {inject} from '../../di/injector_compatibility';\nimport {ɵɵdefineInjectable} from '../../di/interface/defs';\nimport {ErrorHandler} from '../../error_handler';\nimport {type DestroyRef} from '../../linker/destroy_ref';\nimport {NgZone} from '../../zone';\nimport {AFTER_RENDER_SEQUENCES_TO_ADD, FLAGS, LView, LViewFlags} from '../interfaces/view';\nimport {profiler} from '../profiler';\nimport {ProfilerEvent} from '../profiler_types';\nimport {markAncestorsForTraversal} from '../util/view_utils';\nimport {AfterRenderPhase, AfterRenderRef} from './api';\n\nexport class AfterRenderManager {\n  impl: AfterRenderImpl | null = null;\n\n  execute(): void {\n    this.impl?.execute();\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: AfterRenderManager,\n    providedIn: 'root',\n    factory: () => new AfterRenderManager(),\n  });\n}\n\nexport const AFTER_RENDER_PHASES: AfterRenderPhase[] = /* @__PURE__ **/ (() =>\n  [\n    AfterRenderPhase.EarlyRead,\n    AfterRenderPhase.Write,\n    AfterRenderPhase.MixedReadWrite,\n    AfterRenderPhase.Read,\n  ] as const)();\n\nexport class AfterRenderImpl {\n  private readonly ngZone = inject(NgZone);\n  private readonly scheduler = inject(ChangeDetectionScheduler);\n  private readonly errorHandler = inject(ErrorHandler, {optional: true});\n\n  /** Current set of active sequences. */\n  private readonly sequences = new Set<AfterRenderSequence>();\n\n  /** Tracks registrations made during the current set of executions. */\n  private readonly deferredRegistrations = new Set<AfterRenderSequence>();\n\n  /** Whether the `AfterRenderManager` is currently executing hooks. */\n  executing = false;\n\n  constructor() {\n    // Inject the tracing service to make sure it's initialized.\n    inject(TracingService, {optional: true});\n  }\n\n  /**\n   * Run the sequence of phases of hooks, once through. As a result of executing some hooks, more\n   * might be scheduled.\n   */\n  execute(): void {\n    const hasSequencesToExecute = this.sequences.size > 0;\n\n    if (hasSequencesToExecute) {\n      profiler(ProfilerEvent.AfterRenderHooksStart);\n    }\n\n    this.executing = true;\n    for (const phase of AFTER_RENDER_PHASES) {\n      for (const sequence of this.sequences) {\n        if (sequence.erroredOrDestroyed || !sequence.hooks[phase]) {\n          continue;\n        }\n\n        try {\n          sequence.pipelinedValue = this.ngZone.runOutsideAngular(() =>\n            this.maybeTrace(() => {\n              const hookFn = sequence.hooks[phase]!;\n              const value = hookFn(sequence.pipelinedValue);\n              return value;\n            }, sequence.snapshot),\n          );\n        } catch (err) {\n          sequence.erroredOrDestroyed = true;\n          this.errorHandler?.handleError(err);\n        }\n      }\n    }\n    this.executing = false;\n\n    // Cleanup step to reset sequence state and also collect one-shot sequences for removal.\n    for (const sequence of this.sequences) {\n      sequence.afterRun();\n      if (sequence.once) {\n        this.sequences.delete(sequence);\n        // Destroy the sequence so its on destroy callbacks can be cleaned up\n        // immediately, instead of waiting until the injector is destroyed.\n        sequence.destroy();\n      }\n    }\n\n    for (const sequence of this.deferredRegistrations) {\n      this.sequences.add(sequence);\n    }\n    if (this.deferredRegistrations.size > 0) {\n      this.scheduler.notify(NotificationSource.RenderHook);\n    }\n    this.deferredRegistrations.clear();\n\n    if (hasSequencesToExecute) {\n      profiler(ProfilerEvent.AfterRenderHooksEnd);\n    }\n  }\n\n  register(sequence: AfterRenderSequence): void {\n    const {view} = sequence;\n    if (view !== undefined) {\n      // Delay adding it to the manager, add it to the view instead.\n      (view[AFTER_RENDER_SEQUENCES_TO_ADD] ??= []).push(sequence);\n\n      // Mark the view for traversal to ensure we eventually schedule the afterNextRender.\n      markAncestorsForTraversal(view);\n      view[FLAGS] |= LViewFlags.HasChildViewsToRefresh;\n    } else if (!this.executing) {\n      this.addSequence(sequence);\n    } else {\n      this.deferredRegistrations.add(sequence);\n    }\n  }\n\n  addSequence(sequence: AfterRenderSequence): void {\n    this.sequences.add(sequence);\n    // Trigger an `ApplicationRef.tick()` if one is not already pending/running, because we have a\n    // new render hook that needs to run.\n    this.scheduler.notify(NotificationSource.RenderHook);\n  }\n\n  unregister(sequence: AfterRenderSequence): void {\n    if (this.executing && this.sequences.has(sequence)) {\n      // We can't remove an `AfterRenderSequence` in the middle of iteration.\n      // Instead, mark it as destroyed so it doesn't run any more, and mark it as one-shot so it'll\n      // be removed at the end of the current execution.\n      sequence.erroredOrDestroyed = true;\n      sequence.pipelinedValue = undefined;\n      sequence.once = true;\n    } else {\n      // It's safe to directly remove this sequence.\n      this.sequences.delete(sequence);\n      this.deferredRegistrations.delete(sequence);\n    }\n  }\n\n  protected maybeTrace<T>(fn: () => T, snapshot: TracingSnapshot | null): T {\n    // Only trace the execution if the snapshot is defined.\n    return snapshot ? snapshot.run(TracingAction.AFTER_NEXT_RENDER, fn) : fn();\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: AfterRenderImpl,\n    providedIn: 'root',\n    factory: () => new AfterRenderImpl(),\n  });\n}\n\nexport type AfterRenderHook = (value?: unknown) => unknown;\nexport type AfterRenderHooks = [\n  /*      EarlyRead */ AfterRenderHook | undefined,\n  /*          Write */ AfterRenderHook | undefined,\n  /* MixedReadWrite */ AfterRenderHook | undefined,\n  /*           Read */ AfterRenderHook | undefined,\n];\n\nexport class AfterRenderSequence implements AfterRenderRef {\n  /**\n   * Whether this sequence errored or was destroyed during this execution, and hooks should no\n   * longer run for it.\n   */\n  erroredOrDestroyed: boolean = false;\n\n  /**\n   * The value returned by the last hook execution (if any), ready to be pipelined into the next\n   * one.\n   */\n  pipelinedValue: unknown = undefined;\n\n  private unregisterOnDestroy: (() => void) | undefined;\n\n  constructor(\n    readonly impl: AfterRenderImpl,\n    readonly hooks: AfterRenderHooks,\n    readonly view: LView | undefined,\n    public once: boolean,\n    destroyRef: DestroyRef | null,\n    public snapshot: TracingSnapshot | null = null,\n  ) {\n    this.unregisterOnDestroy = destroyRef?.onDestroy(() => this.destroy());\n  }\n\n  afterRun(): void {\n    this.erroredOrDestroyed = false;\n    this.pipelinedValue = undefined;\n\n    // Clear the tracing snapshot after the initial run. This snapshot only\n    // associates the initial run of the hook with the context that created it.\n    // Follow-up runs are independent of that initial context and have different\n    // triggers.\n    this.snapshot?.dispose();\n    this.snapshot = null;\n  }\n\n  destroy(): void {\n    this.impl.unregister(this);\n    this.unregisterOnDestroy?.();\n    const scheduled = this.view?.[AFTER_RENDER_SEQUENCES_TO_ADD];\n    if (scheduled) {\n      this.view[AFTER_RENDER_SEQUENCES_TO_ADD] = scheduled.filter((s) => s !== this);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {TracingService} from '../../application/tracing';\nimport {assertInInjectionContext} from '../../di';\nimport {Injector} from '../../di/injector';\nimport {inject} from '../../di/injector_compatibility';\nimport {DestroyRef} from '../../linker/destroy_ref';\nimport {performanceMarkFeature} from '../../util/performance';\nimport {assertNotInReactiveContext} from '../reactivity/asserts';\nimport {ViewContext} from '../view_context';\nimport {AfterRenderPhase, AfterRenderRef} from './api';\nimport {\n  AfterRenderHooks,\n  AfterRenderImpl,\n  AfterRenderManager,\n  AfterRenderSequence,\n} from './manager';\n\n/**\n * An argument list containing the first non-never type in the given type array, or an empty\n * argument list if there are no non-never types in the type array.\n */\nexport type ɵFirstAvailable<T extends unknown[]> = T extends [infer H, ...infer R]\n  ? [H] extends [never]\n    ? ɵFirstAvailable<R>\n    : [H]\n  : [];\n\n/**\n * Options passed to `afterRender` and `afterNextRender`.\n *\n * @developerPreview\n */\nexport interface AfterRenderOptions {\n  /**\n   * The `Injector` to use during creation.\n   *\n   * If this is not provided, the current injection context will be used instead (via `inject`).\n   */\n  injector?: Injector;\n\n  /**\n   * Whether the hook should require manual cleanup.\n   *\n   * If this is `false` (the default) the hook will automatically register itself to be cleaned up\n   * with the current `DestroyRef`.\n   */\n  manualCleanup?: boolean;\n\n  /**\n   * The phase the callback should be invoked in.\n   *\n   * <div class=\"docs-alert docs-alert-critical\">\n   *\n   * Defaults to `AfterRenderPhase.MixedReadWrite`. You should choose a more specific\n   * phase instead. See `AfterRenderPhase` for more information.\n   *\n   * </div>\n   *\n   * @deprecated Specify the phase for your callback to run in by passing a spec-object as the first\n   *   parameter to `afterRender` or `afterNextRender` instead of a function.\n   */\n  phase?: AfterRenderPhase;\n}\n\n/**\n * Register callbacks to be invoked each time the application finishes rendering, during the\n * specified phases. The available phases are:\n * - `earlyRead`\n *   Use this phase to **read** from the DOM before a subsequent `write` callback, for example to\n *   perform custom layout that the browser doesn't natively support. Prefer the `read` phase if\n *   reading can wait until after the write phase. **Never** write to the DOM in this phase.\n * - `write`\n *    Use this phase to **write** to the DOM. **Never** read from the DOM in this phase.\n * - `mixedReadWrite`\n *    Use this phase to read from and write to the DOM simultaneously. **Never** use this phase if\n *    it is possible to divide the work among the other phases instead.\n * - `read`\n *    Use this phase to **read** from the DOM. **Never** write to the DOM in this phase.\n *\n * <div class=\"docs-alert docs-alert-critical\">\n *\n * You should prefer using the `read` and `write` phases over the `earlyRead` and `mixedReadWrite`\n * phases when possible, to avoid performance degradation.\n *\n * </div>\n *\n * Note that:\n * - Callbacks run in the following phase order *after each render*:\n *   1. `earlyRead`\n *   2. `write`\n *   3. `mixedReadWrite`\n *   4. `read`\n * - Callbacks in the same phase run in the order they are registered.\n * - Callbacks run on browser platforms only, they will not run on the server.\n *\n * The first phase callback to run as part of this spec will receive no parameters. Each\n * subsequent phase callback in this spec will receive the return value of the previously run\n * phase callback as a parameter. This can be used to coordinate work across multiple phases.\n *\n * Angular is unable to verify or enforce that phases are used correctly, and instead\n * relies on each developer to follow the guidelines documented for each value and\n * carefully choose the appropriate one, refactoring their code if necessary. By doing\n * so, Angular is better able to minimize the performance degradation associated with\n * manual DOM access, ensuring the best experience for the end users of your application\n * or library.\n *\n * <div class=\"docs-alert docs-alert-important\">\n *\n * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.\n * You must use caution when directly reading or writing the DOM and layout.\n *\n * </div>\n *\n * @param spec The callback functions to register\n * @param options Options to control the behavior of the callback\n *\n * @usageNotes\n *\n * Use `afterRender` to read or write the DOM after each render.\n *\n * ### Example\n * ```angular-ts\n * @Component({\n *   selector: 'my-cmp',\n *   template: `<span #content>{{ ... }}</span>`,\n * })\n * export class MyComponent {\n *   @ViewChild('content') contentRef: ElementRef;\n *\n *   constructor() {\n *     afterRender({\n *       read: () => {\n *         console.log('content height: ' + this.contentRef.nativeElement.scrollHeight);\n *       }\n *     });\n *   }\n * }\n * ```\n *\n * @developerPreview\n */\nexport function afterRender<E = never, W = never, M = never>(\n  spec: {\n    earlyRead?: () => E;\n    write?: (...args: ɵFirstAvailable<[E]>) => W;\n    mixedReadWrite?: (...args: ɵFirstAvailable<[W, E]>) => M;\n    read?: (...args: ɵFirstAvailable<[M, W, E]>) => void;\n  },\n  options?: Omit<AfterRenderOptions, 'phase'>,\n): AfterRenderRef;\n\n/**\n * Register a callback to be invoked each time the application finishes rendering, during the\n * `mixedReadWrite` phase.\n *\n * <div class=\"docs-alert docs-alert-critical\">\n *\n * You should prefer specifying an explicit phase for the callback instead, or you risk significant\n * performance degradation.\n *\n * </div>\n *\n * Note that the callback will run\n * - in the order it was registered\n * - once per render\n * - on browser platforms only\n * - during the `mixedReadWrite` phase\n *\n * <div class=\"docs-alert docs-alert-important\">\n *\n * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.\n * You must use caution when directly reading or writing the DOM and layout.\n *\n * </div>\n *\n * @param callback A callback function to register\n * @param options Options to control the behavior of the callback\n *\n * @usageNotes\n *\n * Use `afterRender` to read or write the DOM after each render.\n *\n * ### Example\n * ```angular-ts\n * @Component({\n *   selector: 'my-cmp',\n *   template: `<span #content>{{ ... }}</span>`,\n * })\n * export class MyComponent {\n *   @ViewChild('content') contentRef: ElementRef;\n *\n *   constructor() {\n *     afterRender({\n *       read: () => {\n *         console.log('content height: ' + this.contentRef.nativeElement.scrollHeight);\n *       }\n *     });\n *   }\n * }\n * ```\n *\n * @developerPreview\n */\nexport function afterRender(callback: VoidFunction, options?: AfterRenderOptions): AfterRenderRef;\n\nexport function afterRender(\n  callbackOrSpec:\n    | VoidFunction\n    | {\n        earlyRead?: () => unknown;\n        write?: (r?: unknown) => unknown;\n        mixedReadWrite?: (r?: unknown) => unknown;\n        read?: (r?: unknown) => void;\n      },\n  options?: AfterRenderOptions,\n): AfterRenderRef {\n  ngDevMode &&\n    assertNotInReactiveContext(\n      afterRender,\n      'Call `afterRender` outside of a reactive context. For example, schedule the render ' +\n        'callback inside the component constructor`.',\n    );\n\n  !options?.injector && assertInInjectionContext(afterRender);\n  const injector = options?.injector ?? inject(Injector);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    return NOOP_AFTER_RENDER_REF;\n  }\n\n  performanceMarkFeature('NgAfterRender');\n\n  return afterRenderImpl(callbackOrSpec, injector, options, /* once */ false);\n}\n\n/**\n * Register callbacks to be invoked the next time the application finishes rendering, during the\n * specified phases. The available phases are:\n * - `earlyRead`\n *   Use this phase to **read** from the DOM before a subsequent `write` callback, for example to\n *   perform custom layout that the browser doesn't natively support. Prefer the `read` phase if\n *   reading can wait until after the write phase. **Never** write to the DOM in this phase.\n * - `write`\n *    Use this phase to **write** to the DOM. **Never** read from the DOM in this phase.\n * - `mixedReadWrite`\n *    Use this phase to read from and write to the DOM simultaneously. **Never** use this phase if\n *    it is possible to divide the work among the other phases instead.\n * - `read`\n *    Use this phase to **read** from the DOM. **Never** write to the DOM in this phase.\n *\n * <div class=\"docs-alert docs-alert-critical\">\n *\n * You should prefer using the `read` and `write` phases over the `earlyRead` and `mixedReadWrite`\n * phases when possible, to avoid performance degradation.\n *\n * </div>\n *\n * Note that:\n * - Callbacks run in the following phase order *once, after the next render*:\n *   1. `earlyRead`\n *   2. `write`\n *   3. `mixedReadWrite`\n *   4. `read`\n * - Callbacks in the same phase run in the order they are registered.\n * - Callbacks run on browser platforms only, they will not run on the server.\n *\n * The first phase callback to run as part of this spec will receive no parameters. Each\n * subsequent phase callback in this spec will receive the return value of the previously run\n * phase callback as a parameter. This can be used to coordinate work across multiple phases.\n *\n * Angular is unable to verify or enforce that phases are used correctly, and instead\n * relies on each developer to follow the guidelines documented for each value and\n * carefully choose the appropriate one, refactoring their code if necessary. By doing\n * so, Angular is better able to minimize the performance degradation associated with\n * manual DOM access, ensuring the best experience for the end users of your application\n * or library.\n *\n * <div class=\"docs-alert docs-alert-important\">\n *\n * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.\n * You must use caution when directly reading or writing the DOM and layout.\n *\n * </div>\n *\n * @param spec The callback functions to register\n * @param options Options to control the behavior of the callback\n *\n * @usageNotes\n *\n * Use `afterNextRender` to read or write the DOM once,\n * for example to initialize a non-Angular library.\n *\n * ### Example\n * ```angular-ts\n * @Component({\n *   selector: 'my-chart-cmp',\n *   template: `<div #chart>{{ ... }}</div>`,\n * })\n * export class MyChartCmp {\n *   @ViewChild('chart') chartRef: ElementRef;\n *   chart: MyChart|null;\n *\n *   constructor() {\n *     afterNextRender({\n *       write: () => {\n *         this.chart = new MyChart(this.chartRef.nativeElement);\n *       }\n *     });\n *   }\n * }\n * ```\n *\n * @developerPreview\n */\nexport function afterNextRender<E = never, W = never, M = never>(\n  spec: {\n    earlyRead?: () => E;\n    write?: (...args: ɵFirstAvailable<[E]>) => W;\n    mixedReadWrite?: (...args: ɵFirstAvailable<[W, E]>) => M;\n    read?: (...args: ɵFirstAvailable<[M, W, E]>) => void;\n  },\n  options?: Omit<AfterRenderOptions, 'phase'>,\n): AfterRenderRef;\n\n/**\n * Register a callback to be invoked the next time the application finishes rendering, during the\n * `mixedReadWrite` phase.\n *\n * <div class=\"docs-alert docs-alert-critical\">\n *\n * You should prefer specifying an explicit phase for the callback instead, or you risk significant\n * performance degradation.\n *\n * </div>\n *\n * Note that the callback will run\n * - in the order it was registered\n * - on browser platforms only\n * - during the `mixedReadWrite` phase\n *\n * <div class=\"docs-alert docs-alert-important\">\n *\n * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.\n * You must use caution when directly reading or writing the DOM and layout.\n *\n * </div>\n *\n * @param callback A callback function to register\n * @param options Options to control the behavior of the callback\n *\n * @usageNotes\n *\n * Use `afterNextRender` to read or write the DOM once,\n * for example to initialize a non-Angular library.\n *\n * ### Example\n * ```angular-ts\n * @Component({\n *   selector: 'my-chart-cmp',\n *   template: `<div #chart>{{ ... }}</div>`,\n * })\n * export class MyChartCmp {\n *   @ViewChild('chart') chartRef: ElementRef;\n *   chart: MyChart|null;\n *\n *   constructor() {\n *     afterNextRender({\n *       write: () => {\n *         this.chart = new MyChart(this.chartRef.nativeElement);\n *       }\n *     });\n *   }\n * }\n * ```\n *\n * @developerPreview\n */\nexport function afterNextRender(\n  callback: VoidFunction,\n  options?: AfterRenderOptions,\n): AfterRenderRef;\n\nexport function afterNextRender(\n  callbackOrSpec:\n    | VoidFunction\n    | {\n        earlyRead?: () => unknown;\n        write?: (r?: unknown) => unknown;\n        mixedReadWrite?: (r?: unknown) => unknown;\n        read?: (r?: unknown) => void;\n      },\n  options?: AfterRenderOptions,\n): AfterRenderRef {\n  !options?.injector && assertInInjectionContext(afterNextRender);\n  const injector = options?.injector ?? inject(Injector);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    return NOOP_AFTER_RENDER_REF;\n  }\n\n  performanceMarkFeature('NgAfterNextRender');\n\n  return afterRenderImpl(callbackOrSpec, injector, options, /* once */ true);\n}\n\nfunction getHooks(\n  callbackOrSpec:\n    | VoidFunction\n    | {\n        earlyRead?: () => unknown;\n        write?: (r?: unknown) => unknown;\n        mixedReadWrite?: (r?: unknown) => unknown;\n        read?: (r?: unknown) => void;\n      },\n  phase: AfterRenderPhase,\n): AfterRenderHooks {\n  if (callbackOrSpec instanceof Function) {\n    const hooks: AfterRenderHooks = [undefined, undefined, undefined, undefined];\n    hooks[phase] = callbackOrSpec;\n    return hooks;\n  } else {\n    return [\n      callbackOrSpec.earlyRead,\n      callbackOrSpec.write,\n      callbackOrSpec.mixedReadWrite,\n      callbackOrSpec.read,\n    ];\n  }\n}\n\n/**\n * Shared implementation for `afterRender` and `afterNextRender`.\n */\nfunction afterRenderImpl(\n  callbackOrSpec:\n    | VoidFunction\n    | {\n        earlyRead?: () => unknown;\n        write?: (r?: unknown) => unknown;\n        mixedReadWrite?: (r?: unknown) => unknown;\n        read?: (r?: unknown) => void;\n      },\n  injector: Injector,\n  options: AfterRenderOptions | undefined,\n  once: boolean,\n): AfterRenderRef {\n  const manager = injector.get(AfterRenderManager);\n  // Lazily initialize the handler implementation, if necessary. This is so that it can be\n  // tree-shaken if `afterRender` and `afterNextRender` aren't used.\n  manager.impl ??= injector.get(AfterRenderImpl);\n\n  const tracing = injector.get(TracingService, null, {optional: true});\n\n  const hooks = options?.phase ?? AfterRenderPhase.MixedReadWrite;\n  const destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;\n  const viewContext = injector.get(ViewContext, null, {optional: true});\n  const sequence = new AfterRenderSequence(\n    manager.impl,\n    getHooks(callbackOrSpec, hooks),\n    viewContext?.view,\n    once,\n    destroyRef,\n    tracing?.snapshot(null),\n  );\n  manager.impl.register(sequence);\n  return sequence;\n}\n\n/** `AfterRenderRef` that does nothing. */\nexport const NOOP_AFTER_RENDER_REF: AfterRenderRef = {\n  destroy() {},\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {Provider} from '../di/interface/provider';\nimport type {LContainer} from '../render3/interfaces/container';\nimport type {DependencyType} from '../render3/interfaces/definition';\nimport type {TNode} from '../render3/interfaces/node';\nimport type {LView} from '../render3/interfaces/view';\n\n/**\n * Basic set of data structures used for identifying a defer block\n * and triggering defer blocks\n */\nexport interface DehydratedDeferBlock {\n  lView: LView;\n  tNode: TNode;\n  lContainer: LContainer;\n}\n\n/**\n * Describes the shape of a function generated by the compiler\n * to download dependencies that can be defer-loaded.\n */\nexport type DependencyResolverFn = () => Array<Promise<DependencyType>>;\n\n/**\n * Defines types of defer block triggers.\n */\nexport const enum TriggerType {\n  /**\n   * Represents regular triggers (e.g. `@defer (on idle) { ... }`).\n   */\n  Regular,\n\n  /**\n   * Represents prefetch triggers (e.g. `@defer (prefetch on idle) { ... }`).\n   */\n  Prefetch,\n\n  /**\n   * Represents hydrate triggers (e.g. `@defer (hydrate on idle) { ... }`).\n   */\n  Hydrate,\n}\n\n/**\n * Describes the state of defer block dependency loading.\n */\nexport enum DeferDependenciesLoadingState {\n  /** Initial state, dependency loading is not yet triggered */\n  NOT_STARTED,\n\n  /** Dependency loading is in progress */\n  IN_PROGRESS,\n\n  /** Dependency loading has completed successfully */\n  COMPLETE,\n\n  /** Dependency loading has failed */\n  FAILED,\n}\n\n/** Slot index where `minimum` parameter value is stored. */\nexport const MINIMUM_SLOT = 0;\n\n/** Slot index where `after` parameter value is stored. */\nexport const LOADING_AFTER_SLOT = 1;\n\n/** Configuration object for a loading block as it is stored in the component constants. */\nexport type DeferredLoadingBlockConfig = [minimumTime: number | null, afterTime: number | null];\n\n/** Configuration object for a placeholder block as it is stored in the component constants. */\nexport type DeferredPlaceholderBlockConfig = [minimumTime: number | null];\n\n/**\n * Describes the data shared across all instances of a defer block.\n */\nexport interface TDeferBlockDetails {\n  /**\n   * Index in an LView and TData arrays where a template for the primary content\n   * can be found.\n   */\n  primaryTmplIndex: number;\n\n  /**\n   * Index in an LView and TData arrays where a template for the loading block can be found.\n   */\n  loadingTmplIndex: number | null;\n\n  /**\n   * Extra configuration parameters (such as `after` and `minimum`) for the loading block.\n   */\n  loadingBlockConfig: DeferredLoadingBlockConfig | null;\n\n  /**\n   * Index in an LView and TData arrays where a template for the placeholder block can be found.\n   */\n  placeholderTmplIndex: number | null;\n\n  /**\n   * Extra configuration parameters (such as `after` and `minimum`) for the placeholder block.\n   */\n  placeholderBlockConfig: DeferredPlaceholderBlockConfig | null;\n\n  /**\n   * Index in an LView and TData arrays where a template for the error block can be found.\n   */\n  errorTmplIndex: number | null;\n\n  /**\n   * Compiler-generated function that loads all dependencies for a defer block.\n   */\n  dependencyResolverFn: DependencyResolverFn | null;\n\n  /**\n   * Keeps track of the current loading state of defer block dependencies.\n   */\n  loadingState: DeferDependenciesLoadingState;\n\n  /**\n   * Dependency loading Promise. This Promise is helpful for cases when there\n   * are multiple instances of a defer block (e.g. if it was used inside of an *ngFor),\n   * which all await the same set of dependencies.\n   */\n  loadingPromise: Promise<unknown> | null;\n\n  /**\n   * List of providers collected from all NgModules that were imported by\n   * standalone components used within this defer block.\n   */\n  providers: Provider[] | null;\n\n  /**\n   * List of hydrate triggers for a given block\n   */\n  hydrateTriggers: Map<DeferBlockTrigger, HydrateTriggerDetails | null> | null;\n\n  /**\n   * Defer block flags, which should be used for all\n   * instances of a given defer block (the flags that should be\n   * placed into the `TDeferDetails` at runtime).\n   */\n  flags: TDeferDetailsFlags;\n\n  /**\n   * Tracks debugging information about the deferred block.\n   */\n  debug: {\n    /** Text representations of the block's triggers. */\n    triggers?: Set<string>;\n  } | null;\n}\n\n/**\n * Specifies defer block flags, which should be used for all\n * instances of a given defer block (the flags that should be\n * placed into the `TDeferDetails` at runtime).\n */\nexport const enum TDeferDetailsFlags {\n  Default = 0,\n\n  /**\n   * Whether or not the defer block has hydrate triggers.\n   */\n  HasHydrateTriggers = 1 << 0,\n}\n\n/**\n * Describes the current state of this defer block instance.\n *\n * @publicApi\n */\nexport enum DeferBlockState {\n  /** The placeholder block content is rendered */\n  Placeholder = 0,\n\n  /** The loading block content is rendered */\n  Loading = 1,\n\n  /** The main content block content is rendered */\n  Complete = 2,\n\n  /** The error block content is rendered */\n  Error = 3,\n}\n\n/**\n * Represents defer trigger types.\n */\nexport const enum DeferBlockTrigger {\n  Idle,\n  Immediate,\n  Viewport,\n  Interaction,\n  Hover,\n  Timer,\n  When,\n  Never,\n}\n\n/** * Describes specified delay (in ms) in the `hydrate on timer()` trigger. */\nexport interface HydrateTimerTriggerDetails {\n  delay: number;\n}\n\n/** * Describes all possible hydration trigger details specified in a template. */\nexport type HydrateTriggerDetails = HydrateTimerTriggerDetails;\n\n/**\n * Describes the initial state of this defer block instance.\n *\n * Note: this state is internal only and *must* be represented\n * with a number lower than any value in the `DeferBlockState` enum.\n */\nexport enum DeferBlockInternalState {\n  /** Initial state. Nothing is rendered yet. */\n  Initial = -1,\n}\n\nexport const NEXT_DEFER_BLOCK_STATE = 0;\n// Note: it's *important* to keep the state in this slot, because this slot\n// is used by runtime logic to differentiate between LViews, LContainers and\n// other types (see `isLView` and `isLContainer` functions). In case of defer\n// blocks, this slot would always be a number.\nexport const DEFER_BLOCK_STATE = 1;\nexport const STATE_IS_FROZEN_UNTIL = 2;\nexport const LOADING_AFTER_CLEANUP_FN = 3;\nexport const TRIGGER_CLEANUP_FNS = 4;\nexport const PREFETCH_TRIGGER_CLEANUP_FNS = 5;\nexport const SSR_UNIQUE_ID = 6;\nexport const SSR_BLOCK_STATE = 7;\nexport const ON_COMPLETE_FNS = 8;\nexport const HYDRATE_TRIGGER_CLEANUP_FNS = 9;\n\n/**\n * Describes instance-specific defer block data.\n *\n * Note: currently there is only the `state` slot, but more slots\n * would be added later to keep track of `after` and `maximum` features\n * (which would require per-instance state).\n */\nexport interface LDeferBlockDetails extends Array<unknown> {\n  /**\n   * Currently rendered block state.\n   */\n  [DEFER_BLOCK_STATE]: DeferBlockState | DeferBlockInternalState;\n\n  /**\n   * Block state that was requested when another state was rendered.\n   */\n  [NEXT_DEFER_BLOCK_STATE]: DeferBlockState | null;\n\n  /**\n   * Timestamp indicating when the current state can be switched to\n   * the next one, in case teh current state has `minimum` parameter.\n   */\n  [STATE_IS_FROZEN_UNTIL]: number | null;\n\n  /**\n   * Contains a reference to a cleanup function which cancels a timeout\n   * when Angular waits before rendering loading state. This is used when\n   * the loading block has the `after` parameter configured.\n   */\n  [LOADING_AFTER_CLEANUP_FN]: VoidFunction | null;\n\n  /**\n   * List of cleanup functions for regular triggers.\n   */\n  [TRIGGER_CLEANUP_FNS]: VoidFunction[] | null;\n\n  /**\n   * List of cleanup functions for prefetch triggers.\n   */\n  [PREFETCH_TRIGGER_CLEANUP_FNS]: VoidFunction[] | null;\n\n  /**\n   * Unique id of this defer block assigned during SSR.\n   */\n  [SSR_UNIQUE_ID]: string | null;\n\n  /**\n   * Defer block state after SSR.\n   */\n  [SSR_BLOCK_STATE]: number | null;\n\n  /**\n   * A set of callbacks to be invoked once the main content is rendered.\n   */\n  [ON_COMPLETE_FNS]: VoidFunction[] | null;\n\n  /**\n   * List of cleanup functions for hydrate triggers.\n   */\n  [HYDRATE_TRIGGER_CLEANUP_FNS]: VoidFunction[] | null;\n}\n\n/**\n * Internal structure used for configuration of defer block behavior.\n * */\nexport interface DeferBlockConfig {\n  behavior: DeferBlockBehavior;\n}\n\n/**\n * Options for configuring defer blocks behavior.\n * @publicApi\n */\nexport enum DeferBlockBehavior {\n  /**\n   * Manual triggering mode for defer blocks. Provides control over when defer blocks render\n   * and which state they render.\n   */\n  Manual,\n\n  /**\n   * Playthrough mode for defer blocks. This mode behaves like defer blocks would in a browser.\n   * This is the default behavior in test environments.\n   */\n  Playthrough,\n}\n\n/**\n * **INTERNAL**, avoid referencing it in application code.\n *\n * Describes a helper class that allows to intercept a call to retrieve current\n * dependency loading function and replace it with a different implementation.\n * This interceptor class is needed to allow testing blocks in different states\n * by simulating loading response.\n */\nexport interface DeferBlockDependencyInterceptor {\n  /**\n   * Invoked for each defer block when dependency loading function is accessed.\n   */\n  intercept(dependencyFn: DependencyResolverFn | null): DependencyResolverFn | null;\n\n  /**\n   * Allows to configure an interceptor function.\n   */\n  setInterceptor(interceptorFn: (current: DependencyResolverFn) => DependencyResolverFn): void;\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  HYDRATE_TRIGGER_CLEANUP_FNS,\n  LDeferBlockDetails,\n  PREFETCH_TRIGGER_CLEANUP_FNS,\n  TRIGGER_CLEANUP_FNS,\n  TriggerType,\n} from './interfaces';\n\n/**\n * Registers a cleanup function associated with a prefetching trigger\n * or a regular trigger of a defer block.\n */\nexport function storeTriggerCleanupFn(\n  type: TriggerType,\n  lDetails: LDeferBlockDetails,\n  cleanupFn: VoidFunction,\n) {\n  const key = getCleanupFnKeyByType(type);\n  if (lDetails[key] === null) {\n    lDetails[key] = [];\n  }\n  (lDetails[key]! as VoidFunction[]).push(cleanupFn);\n}\n\n/**\n * Invokes registered cleanup functions either for prefetch or for regular triggers.\n */\nexport function invokeTriggerCleanupFns(type: TriggerType, lDetails: LDeferBlockDetails) {\n  const key = getCleanupFnKeyByType(type);\n  const cleanupFns = lDetails[key] as VoidFunction[];\n  if (cleanupFns !== null) {\n    for (const cleanupFn of cleanupFns) {\n      cleanupFn();\n    }\n    lDetails[key] = null;\n  }\n}\n\n/**\n * Invokes registered cleanup functions for prefetch, hydrate, and regular triggers.\n */\nexport function invokeAllTriggerCleanupFns(lDetails: LDeferBlockDetails) {\n  invokeTriggerCleanupFns(TriggerType.Prefetch, lDetails);\n  invokeTriggerCleanupFns(TriggerType.Regular, lDetails);\n  invokeTriggerCleanupFns(TriggerType.Hydrate, lDetails);\n}\n\nfunction getCleanupFnKeyByType(type: TriggerType): number {\n  let key = TRIGGER_CLEANUP_FNS;\n  if (type === TriggerType.Prefetch) {\n    key = PREFETCH_TRIGGER_CLEANUP_FNS;\n  } else if (type === TriggerType.Hydrate) {\n    key = HYDRATE_TRIGGER_CLEANUP_FNS;\n  }\n  return key;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertIndexInDeclRange} from '../render3/assert';\nimport {DependencyDef} from '../render3/interfaces/definition';\nimport {TContainerNode, TNode} from '../render3/interfaces/node';\nimport {HEADER_OFFSET, LView, TVIEW, TView} from '../render3/interfaces/view';\nimport {getTNode} from '../render3/util/view_utils';\nimport {assertEqual, throwError} from '../util/assert';\n\nimport {\n  DeferBlockState,\n  DeferDependenciesLoadingState,\n  LDeferBlockDetails,\n  LOADING_AFTER_SLOT,\n  MINIMUM_SLOT,\n  TDeferBlockDetails,\n} from './interfaces';\n\n/**\n * Calculates a data slot index for defer block info (either static or\n * instance-specific), given an index of a defer instruction.\n */\nexport function getDeferBlockDataIndex(deferBlockIndex: number) {\n  // Instance state is located at the *next* position\n  // after the defer block slot in an LView or TView.data.\n  return deferBlockIndex + 1;\n}\n\n/** Retrieves a defer block state from an LView, given a TNode that represents a block. */\nexport function getLDeferBlockDetails(lView: LView, tNode: TNode): LDeferBlockDetails {\n  const tView = lView[TVIEW];\n  const slotIndex = getDeferBlockDataIndex(tNode.index);\n  ngDevMode && assertIndexInDeclRange(tView, slotIndex);\n  return lView[slotIndex];\n}\n\n/** Stores a defer block instance state in LView. */\nexport function setLDeferBlockDetails(\n  lView: LView,\n  deferBlockIndex: number,\n  lDetails: LDeferBlockDetails,\n) {\n  const tView = lView[TVIEW];\n  const slotIndex = getDeferBlockDataIndex(deferBlockIndex);\n  ngDevMode && assertIndexInDeclRange(tView, slotIndex);\n  lView[slotIndex] = lDetails;\n}\n\n/** Retrieves static info about a defer block, given a TView and a TNode that represents a block. */\nexport function getTDeferBlockDetails(tView: TView, tNode: TNode): TDeferBlockDetails {\n  const slotIndex = getDeferBlockDataIndex(tNode.index);\n  ngDevMode && assertIndexInDeclRange(tView, slotIndex);\n  return tView.data[slotIndex] as TDeferBlockDetails;\n}\n\n/** Stores a defer block static info in `TView.data`. */\nexport function setTDeferBlockDetails(\n  tView: TView,\n  deferBlockIndex: number,\n  deferBlockConfig: TDeferBlockDetails,\n) {\n  const slotIndex = getDeferBlockDataIndex(deferBlockIndex);\n  ngDevMode && assertIndexInDeclRange(tView, slotIndex);\n  tView.data[slotIndex] = deferBlockConfig;\n}\n\nexport function getTemplateIndexForState(\n  newState: DeferBlockState,\n  hostLView: LView,\n  tNode: TNode,\n): number | null {\n  const tView = hostLView[TVIEW];\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n\n  switch (newState) {\n    case DeferBlockState.Complete:\n      return tDetails.primaryTmplIndex;\n    case DeferBlockState.Loading:\n      return tDetails.loadingTmplIndex;\n    case DeferBlockState.Error:\n      return tDetails.errorTmplIndex;\n    case DeferBlockState.Placeholder:\n      return tDetails.placeholderTmplIndex;\n    default:\n      ngDevMode && throwError(`Unexpected defer block state: ${newState}`);\n      return null;\n  }\n}\n\n/**\n * Returns a minimum amount of time that a given state should be rendered for,\n * taking into account `minimum` parameter value. If the `minimum` value is\n * not specified - returns `null`.\n */\nexport function getMinimumDurationForState(\n  tDetails: TDeferBlockDetails,\n  currentState: DeferBlockState,\n): number | null {\n  if (currentState === DeferBlockState.Placeholder) {\n    return tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null;\n  } else if (currentState === DeferBlockState.Loading) {\n    return tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null;\n  }\n  return null;\n}\n\n/** Retrieves the value of the `after` parameter on the @loading block. */\nexport function getLoadingBlockAfter(tDetails: TDeferBlockDetails): number | null {\n  return tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null;\n}\n\n/**\n * Adds downloaded dependencies into a directive or a pipe registry,\n * making sure that a dependency doesn't yet exist in the registry.\n */\nexport function addDepsToRegistry<T extends DependencyDef[]>(currentDeps: T | null, newDeps: T): T {\n  if (!currentDeps || currentDeps.length === 0) {\n    return newDeps;\n  }\n\n  const currentDepSet = new Set(currentDeps);\n  for (const dep of newDeps) {\n    currentDepSet.add(dep);\n  }\n\n  // If `currentDeps` is the same length, there were no new deps and can\n  // return the original array.\n  return currentDeps.length === currentDepSet.size ? currentDeps : (Array.from(currentDepSet) as T);\n}\n\n/** Retrieves a TNode that represents main content of a defer block. */\nexport function getPrimaryBlockTNode(tView: TView, tDetails: TDeferBlockDetails): TContainerNode {\n  const adjustedIndex = tDetails.primaryTmplIndex + HEADER_OFFSET;\n  return getTNode(tView, adjustedIndex) as TContainerNode;\n}\n\n/**\n * Asserts whether all dependencies for a defer block are loaded.\n * Always run this function (in dev mode) before rendering a defer\n * block in completed state.\n */\nexport function assertDeferredDependenciesLoaded(tDetails: TDeferBlockDetails) {\n  assertEqual(\n    tDetails.loadingState,\n    DeferDependenciesLoadingState.COMPLETE,\n    'Expecting all deferred dependencies to be loaded.',\n  );\n}\n\n/**\n * Determines if a given value matches the expected structure of a defer block\n *\n * We can safely rely on the primaryTmplIndex because every defer block requires\n * that a primary template exists. All the other template options are optional.\n */\nexport function isTDeferBlockDetails(value: unknown): value is TDeferBlockDetails {\n  return (\n    value !== null &&\n    typeof value === 'object' &&\n    typeof (value as TDeferBlockDetails).primaryTmplIndex === 'number'\n  );\n}\n\n/**\n * Whether a given TNode represents a defer block.\n */\nexport function isDeferBlock(tView: TView, tNode: TNode): boolean {\n  let tDetails: TDeferBlockDetails | null = null;\n  const slotIndex = getDeferBlockDataIndex(tNode.index);\n  // Check if a slot index is in the reasonable range.\n  // Note: we do `-1` on the right border, since defer block details are stored\n  // in the `n+1` slot, see `getDeferBlockDataIndex` for more info.\n  if (HEADER_OFFSET < slotIndex && slotIndex < tView.bindingStartIndex) {\n    tDetails = getTDeferBlockDetails(tView, tNode);\n  }\n  return !!tDetails && isTDeferBlockDetails(tDetails);\n}\n\n/**\n * Tracks debugging information about a trigger.\n * @param tView TView in which the trigger is declared.\n * @param tNode TNode on which the trigger is declared.\n * @param textRepresentation Text representation of the trigger to be used for debugging purposes.\n */\nexport function trackTriggerForDebugging(tView: TView, tNode: TNode, textRepresentation: string) {\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n  tDetails.debug ??= {};\n  tDetails.debug.triggers ??= new Set();\n  tDetails.debug.triggers.add(textRepresentation);\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {Injector} from '../di';\nimport {AfterRenderRef} from '../render3/after_render/api';\nimport {afterRender} from '../render3/after_render/hooks';\nimport {assertLContainer, assertLView} from '../render3/assert';\nimport {CONTAINER_HEADER_OFFSET} from '../render3/interfaces/container';\nimport {TNode} from '../render3/interfaces/node';\nimport {isDestroyed} from '../render3/interfaces/type_checks';\nimport {HEADER_OFFSET, INJECTOR, LView} from '../render3/interfaces/view';\nimport {\n  getNativeByIndex,\n  removeLViewOnDestroy,\n  storeLViewOnDestroy,\n  walkUpViews,\n} from '../render3/util/view_utils';\nimport {assertElement, assertEqual} from '../util/assert';\nimport {NgZone} from '../zone';\nimport {storeTriggerCleanupFn} from './cleanup';\n\nimport {\n  DEFER_BLOCK_STATE,\n  DeferBlockInternalState,\n  DeferBlockState,\n  TriggerType,\n} from './interfaces';\nimport {getLDeferBlockDetails} from './utils';\n\n/** Configuration object used to register passive and capturing events. */\nconst eventListenerOptions: AddEventListenerOptions = {\n  passive: true,\n  capture: true,\n};\n\n/** Keeps track of the currently-registered `on hover` triggers. */\nconst hoverTriggers = new WeakMap<Element, DeferEventEntry>();\n\n/** Keeps track of the currently-registered `on interaction` triggers. */\nconst interactionTriggers = new WeakMap<Element, DeferEventEntry>();\n\n/** Currently-registered `viewport` triggers. */\nconst viewportTriggers = new WeakMap<Element, DeferEventEntry>();\n\n/** Names of the events considered as interaction events. */\nexport const interactionEventNames = ['click', 'keydown'] as const;\n\n/** Names of the events considered as hover events. */\nexport const hoverEventNames = ['mouseenter', 'mouseover', 'focusin'] as const;\n\n/** `IntersectionObserver` used to observe `viewport` triggers. */\nlet intersectionObserver: IntersectionObserver | null = null;\n\n/** Number of elements currently observed with `viewport` triggers. */\nlet observedViewportElements = 0;\n\n/** Object keeping track of registered callbacks for a deferred block trigger. */\nclass DeferEventEntry {\n  callbacks = new Set<VoidFunction>();\n\n  listener = () => {\n    for (const callback of this.callbacks) {\n      callback();\n    }\n  };\n}\n\n/**\n * Registers an interaction trigger.\n * @param trigger Element that is the trigger.\n * @param callback Callback to be invoked when the trigger is interacted with.\n */\nexport function onInteraction(trigger: Element, callback: VoidFunction): VoidFunction {\n  let entry = interactionTriggers.get(trigger);\n\n  // If this is the first entry for this element, add the listeners.\n  if (!entry) {\n    // Note that managing events centrally like this lends itself well to using global\n    // event delegation. It currently does delegation at the element level, rather than the\n    // document level, because:\n    // 1. Global delegation is the most effective when there are a lot of events being registered\n    // at the same time. Deferred blocks are unlikely to be used in such a way.\n    // 2. Matching events to their target isn't free. For each `click` and `keydown` event we\n    // would have look through all the triggers and check if the target either is the element\n    // itself or it's contained within the element. Given that `click` and `keydown` are some\n    // of the most common events, this may end up introducing a lot of runtime overhead.\n    // 3. We're still registering only two events per element, no matter how many deferred blocks\n    // are referencing it.\n    entry = new DeferEventEntry();\n    interactionTriggers.set(trigger, entry);\n\n    for (const name of interactionEventNames) {\n      trigger.addEventListener(name, entry!.listener, eventListenerOptions);\n    }\n  }\n\n  entry.callbacks.add(callback);\n\n  return () => {\n    const {callbacks, listener} = entry!;\n    callbacks.delete(callback);\n\n    if (callbacks.size === 0) {\n      interactionTriggers.delete(trigger);\n\n      for (const name of interactionEventNames) {\n        trigger.removeEventListener(name, listener, eventListenerOptions);\n      }\n    }\n  };\n}\n\n/**\n * Registers a hover trigger.\n * @param trigger Element that is the trigger.\n * @param callback Callback to be invoked when the trigger is hovered over.\n */\nexport function onHover(trigger: Element, callback: VoidFunction): VoidFunction {\n  let entry = hoverTriggers.get(trigger);\n\n  // If this is the first entry for this element, add the listener.\n  if (!entry) {\n    entry = new DeferEventEntry();\n    hoverTriggers.set(trigger, entry);\n\n    for (const name of hoverEventNames) {\n      trigger.addEventListener(name, entry!.listener, eventListenerOptions);\n    }\n  }\n\n  entry.callbacks.add(callback);\n\n  return () => {\n    const {callbacks, listener} = entry!;\n    callbacks.delete(callback);\n\n    if (callbacks.size === 0) {\n      for (const name of hoverEventNames) {\n        trigger.removeEventListener(name, listener, eventListenerOptions);\n      }\n      hoverTriggers.delete(trigger);\n    }\n  };\n}\n\n/**\n * Registers a viewport trigger.\n * @param trigger Element that is the trigger.\n * @param callback Callback to be invoked when the trigger comes into the viewport.\n * @param injector Injector that can be used by the trigger to resolve DI tokens.\n */\nexport function onViewport(\n  trigger: Element,\n  callback: VoidFunction,\n  injector: Injector,\n): VoidFunction {\n  const ngZone = injector.get(NgZone);\n  let entry = viewportTriggers.get(trigger);\n\n  intersectionObserver =\n    intersectionObserver ||\n    ngZone.runOutsideAngular(() => {\n      return new IntersectionObserver((entries) => {\n        for (const current of entries) {\n          // Only invoke the callbacks if the specific element is intersecting.\n          if (current.isIntersecting && viewportTriggers.has(current.target)) {\n            ngZone.run(viewportTriggers.get(current.target)!.listener);\n          }\n        }\n      });\n    });\n\n  if (!entry) {\n    entry = new DeferEventEntry();\n    ngZone.runOutsideAngular(() => intersectionObserver!.observe(trigger));\n    viewportTriggers.set(trigger, entry);\n    observedViewportElements++;\n  }\n\n  entry.callbacks.add(callback);\n\n  return () => {\n    // It's possible that a different cleanup callback fully removed this element already.\n    if (!viewportTriggers.has(trigger)) {\n      return;\n    }\n\n    entry!.callbacks.delete(callback);\n\n    if (entry!.callbacks.size === 0) {\n      intersectionObserver?.unobserve(trigger);\n      viewportTriggers.delete(trigger);\n      observedViewportElements--;\n    }\n\n    if (observedViewportElements === 0) {\n      intersectionObserver?.disconnect();\n      intersectionObserver = null;\n    }\n  };\n}\n\n/**\n * Helper function to get the LView in which a deferred block's trigger is rendered.\n * @param d   eferredHostLView LView in which the deferred block is defined.\n * @param deferredTNode TNode defining the deferred block.\n * @param walkUpTimes Number of times to go up in the view hierarchy to find the trigger's view.\n *   A negative value means that the trigger is inside the block's placeholder, while an undefined\n *   value means that the trigger is in the same LView as the deferred block.\n */\nexport function getTriggerLView(\n  deferredHostLView: LView,\n  deferredTNode: TNode,\n  walkUpTimes: number | undefined,\n): LView | null {\n  // The trigger is in the same view, we don't need to traverse.\n  if (walkUpTimes == null) {\n    return deferredHostLView;\n  }\n\n  // A positive value or zero means that the trigger is in a parent view.\n  if (walkUpTimes >= 0) {\n    return walkUpViews(walkUpTimes, deferredHostLView);\n  }\n\n  // If the value is negative, it means that the trigger is inside the placeholder.\n  const deferredContainer = deferredHostLView[deferredTNode.index];\n  ngDevMode && assertLContainer(deferredContainer);\n  const triggerLView = deferredContainer[CONTAINER_HEADER_OFFSET] ?? null;\n\n  // We need to null check, because the placeholder might not have been rendered yet.\n  if (ngDevMode && triggerLView !== null) {\n    const lDetails = getLDeferBlockDetails(deferredHostLView, deferredTNode);\n    const renderedState = lDetails[DEFER_BLOCK_STATE];\n    assertEqual(\n      renderedState,\n      DeferBlockState.Placeholder,\n      'Expected a placeholder to be rendered in this defer block.',\n    );\n    assertLView(triggerLView);\n  }\n\n  return triggerLView;\n}\n\n/**\n * Gets the element that a deferred block's trigger is pointing to.\n * @param triggerLView LView in which the trigger is defined.\n * @param triggerIndex Index at which the trigger element should've been rendered.\n */\nexport function getTriggerElement(triggerLView: LView, triggerIndex: number): Element {\n  const element = getNativeByIndex(HEADER_OFFSET + triggerIndex, triggerLView);\n  ngDevMode && assertElement(element);\n  return element as Element;\n}\n\n/**\n * Registers a DOM-node based trigger.\n * @param initialLView LView in which the defer block is rendered.\n * @param tNode TNode representing the defer block.\n * @param triggerIndex Index at which to find the trigger element.\n * @param walkUpTimes Number of times to go up/down in the view hierarchy to find the trigger.\n * @param registerFn Function that will register the DOM events.\n * @param callback Callback to be invoked when the trigger receives the event that should render\n *     the deferred block.\n * @param type Trigger type to distinguish between regular and prefetch triggers.\n */\nexport function registerDomTrigger(\n  initialLView: LView,\n  tNode: TNode,\n  triggerIndex: number,\n  walkUpTimes: number | undefined,\n  registerFn: (element: Element, callback: VoidFunction, injector: Injector) => VoidFunction,\n  callback: VoidFunction,\n  type: TriggerType,\n) {\n  const injector = initialLView[INJECTOR];\n  const zone = injector.get(NgZone);\n  let poll: AfterRenderRef;\n  function pollDomTrigger() {\n    // If the initial view was destroyed, we don't need to do anything.\n    if (isDestroyed(initialLView)) {\n      poll.destroy();\n      return;\n    }\n\n    const lDetails = getLDeferBlockDetails(initialLView, tNode);\n    const renderedState = lDetails[DEFER_BLOCK_STATE];\n\n    // If the block was loaded before the trigger was resolved, we don't need to do anything.\n    if (\n      renderedState !== DeferBlockInternalState.Initial &&\n      renderedState !== DeferBlockState.Placeholder\n    ) {\n      poll.destroy();\n      return;\n    }\n\n    const triggerLView = getTriggerLView(initialLView, tNode, walkUpTimes);\n\n    // Keep polling until we resolve the trigger's LView.\n    if (!triggerLView) {\n      // Keep polling.\n      return;\n    }\n\n    poll.destroy();\n\n    // It's possible that the trigger's view was destroyed before we resolved the trigger element.\n    if (isDestroyed(triggerLView)) {\n      return;\n    }\n\n    const element = getTriggerElement(triggerLView, triggerIndex);\n    const cleanup = registerFn(\n      element,\n      () => {\n        // `pollDomTrigger` runs outside the zone (because of `afterNextRender`) and registers its\n        // listeners outside the zone, so we jump back into the zone prior to running the callback.\n        zone.run(() => {\n          if (initialLView !== triggerLView) {\n            removeLViewOnDestroy(triggerLView, cleanup);\n          }\n          callback();\n        });\n      },\n      injector,\n    );\n\n    // The trigger and deferred block might be in different LViews.\n    // For the main LView the cleanup would happen as a part of\n    // `storeTriggerCleanupFn` logic. For trigger LView we register\n    // a cleanup function there to remove event handlers in case an\n    // LView gets destroyed before a trigger is invoked.\n    if (initialLView !== triggerLView) {\n      storeLViewOnDestroy(triggerLView, cleanup);\n    }\n\n    storeTriggerCleanupFn(type, lDetails, cleanup);\n  }\n\n  // Begin polling for the trigger.\n  poll = afterRender({read: pollDomTrigger}, {injector});\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// tslint:disable:no-duplicate-imports\nimport type {EventContract} from '../primitives/event-dispatch';\nimport {Attribute} from '../primitives/event-dispatch';\nimport {APP_ID} from './application/application_tokens';\nimport {InjectionToken} from './di';\nimport type {RElement, RNode} from './render3/interfaces/renderer_dom';\nimport {INJECTOR, type LView} from './render3/interfaces/view';\n\nexport const DEFER_BLOCK_SSR_ID_ATTRIBUTE = 'ngb';\n\ndeclare global {\n  interface Element {\n    __jsaction_fns: Map<string, Function[]> | undefined;\n  }\n}\n\nexport function setJSActionAttributes(\n  nativeElement: Element,\n  eventTypes: string[],\n  parentDeferBlockId: string | null = null,\n) {\n  // jsaction attributes specifically should be applied to elements and not comment nodes.\n  // Comment nodes also have no setAttribute function. So this avoids errors.\n  if (eventTypes.length === 0 || nativeElement.nodeType !== Node.ELEMENT_NODE) {\n    return;\n  }\n  const existingAttr = nativeElement.getAttribute(Attribute.JSACTION);\n  // we dedupe cases where hydrate triggers are used as it's possible that\n  // someone may have added an event binding to the root node that matches what the\n  // hydrate trigger adds.\n  const parts = eventTypes.reduce((prev, curr) => {\n    // if there is no existing attribute OR it's not in the existing one, we need to add it\n    return (existingAttr?.indexOf(curr) ?? -1) === -1 ? prev + curr + ':;' : prev;\n  }, '');\n  //  This is required to be a module accessor to appease security tests on setAttribute.\n  nativeElement.setAttribute(Attribute.JSACTION, `${existingAttr ?? ''}${parts}`);\n\n  const blockName = parentDeferBlockId ?? '';\n  if (blockName !== '' && parts.length > 0) {\n    nativeElement.setAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE, blockName);\n  }\n}\n\nexport const sharedStashFunction = (rEl: RElement, eventType: string, listenerFn: Function) => {\n  const el = rEl as unknown as Element;\n  const eventListenerMap = el.__jsaction_fns ?? new Map();\n  const eventListeners = eventListenerMap.get(eventType) ?? [];\n  eventListeners.push(listenerFn);\n  eventListenerMap.set(eventType, eventListeners);\n  el.__jsaction_fns = eventListenerMap;\n};\n\nexport const sharedMapFunction = (rEl: RElement, jsActionMap: Map<string, Set<Element>>) => {\n  const el = rEl as unknown as Element;\n  let blockName = el.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE) ?? '';\n  const blockSet = jsActionMap.get(blockName) ?? new Set<Element>();\n  if (!blockSet.has(el)) {\n    blockSet.add(el);\n  }\n  jsActionMap.set(blockName, blockSet);\n};\n\nexport function removeListenersFromBlocks(\n  blockNames: string[],\n  jsActionMap: Map<string, Set<Element>>,\n) {\n  if (blockNames.length > 0) {\n    let blockList: Element[] = [];\n    for (let blockName of blockNames) {\n      if (jsActionMap.has(blockName)) {\n        blockList = [...blockList, ...jsActionMap.get(blockName)!];\n      }\n    }\n    const replayList = new Set(blockList);\n    replayList.forEach(removeListeners);\n  }\n}\n\nexport const removeListeners = (el: Element) => {\n  el.removeAttribute(Attribute.JSACTION);\n  el.removeAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE);\n  el.__jsaction_fns = undefined;\n};\n\nexport interface EventContractDetails {\n  instance?: EventContract;\n}\n\nexport const JSACTION_EVENT_CONTRACT = new InjectionToken<EventContractDetails>(\n  ngDevMode ? 'EVENT_CONTRACT_DETAILS' : '',\n  {\n    providedIn: 'root',\n    factory: () => ({}),\n  },\n);\n\nexport function invokeListeners(event: Event, currentTarget: Element | null) {\n  const handlerFns = currentTarget?.__jsaction_fns?.get(event.type);\n  if (!handlerFns || !currentTarget?.isConnected) {\n    return;\n  }\n  for (const handler of handlerFns) {\n    handler(event);\n  }\n}\n\n/** Shorthand for an event listener callback function to reduce duplication. */\ntype EventCallback = (event?: any) => any;\n\n/**\n * Represents a signature of a function that disables event replay feature\n * for server-side rendered applications. This function is overridden with\n * an actual implementation when the event replay feature is enabled via\n * `withEventReplay()` call.\n */\ntype StashEventListener = (el: RNode, eventName: string, listenerFn: EventCallback) => void;\n\nconst stashEventListeners = new Map<string, StashEventListener>();\n\n/**\n * Registers a stashing function for a specific application ID.\n *\n * @param appId The unique identifier for the application instance.\n * @param fn The stashing function to associate with this app ID.\n * @returns A cleanup function that removes the stashing function when called.\n */\nexport function setStashFn(appId: string, fn: StashEventListener) {\n  stashEventListeners.set(appId, fn);\n  return () => stashEventListeners.delete(appId);\n}\n\n/**\n * Indicates whether the stashing code was added, prevents adding it multiple times.\n */\nlet isStashEventListenerImplEnabled = false;\n\nlet _stashEventListenerImpl = (\n  lView: LView,\n  target: RElement | EventTarget,\n  eventName: string,\n  listenerFn: EventCallback,\n) => {};\n\n/**\n * Optionally stashes an event listener for later replay during hydration.\n *\n * This function delegates to an internal `_stashEventListenerImpl`, which may\n * be a no-op unless the event replay feature is enabled. When active, this\n * allows capturing event listener metadata before hydration completes, so that\n * user interactions during SSR can be replayed.\n *\n * @param lView The logical view (LView) where the listener is being registered.\n * @param target The DOM element or event target the listener is attached to.\n * @param eventName The name of the event being listened for (e.g., 'click').\n * @param listenerFn The event handler that was registered.\n */\nexport function stashEventListenerImpl(\n  lView: LView,\n  target: RElement | EventTarget,\n  eventName: string,\n  listenerFn: EventCallback,\n): void {\n  _stashEventListenerImpl(lView, target, eventName, listenerFn);\n}\n\n/**\n * Enables the event listener stashing logic in a tree-shakable way.\n *\n * This function lazily sets the implementation of `_stashEventListenerImpl`\n * so that it becomes active only when `withEventReplay` is invoked. This ensures\n * that the stashing logic is excluded from production builds unless needed.\n */\nexport function enableStashEventListenerImpl(): void {\n  if (!isStashEventListenerImplEnabled) {\n    _stashEventListenerImpl = (\n      lView: LView,\n      target: RElement | EventTarget,\n      eventName: string,\n      listenerFn: EventCallback,\n    ) => {\n      const appId = lView[INJECTOR].get(APP_ID);\n      const stashEventListener = stashEventListeners.get(appId);\n      stashEventListener?.(target as RElement, eventName, listenerFn);\n    };\n\n    isStashEventListenerImplEnabled = true;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {inject} from '../di';\nimport {InjectionToken} from '../di/injection_token';\nimport {ɵɵdefineInjectable} from '../di/interface/defs';\nimport {\n  EventContractDetails,\n  JSACTION_EVENT_CONTRACT,\n  removeListenersFromBlocks,\n} from '../event_delegation_utils';\nimport {JSACTION_BLOCK_ELEMENT_MAP} from '../hydration/tokens';\nimport {DehydratedDeferBlock} from './interfaces';\nimport type {PromiseWithResolvers} from '../util/promise_with_resolvers';\n\n/**\n * An internal injection token to reference `DehydratedBlockRegistry` implementation\n * in a tree-shakable way.\n */\nexport const DEHYDRATED_BLOCK_REGISTRY = new InjectionToken<DehydratedBlockRegistry>(\n  ngDevMode ? 'DEHYDRATED_BLOCK_REGISTRY' : '',\n);\n\n/**\n * The DehydratedBlockRegistry is used for incremental hydration purposes. It keeps\n * track of the Defer Blocks that need hydration so we can effectively\n * navigate up to the top dehydrated defer block and fire appropriate cleanup\n * functions post hydration.\n */\nexport class DehydratedBlockRegistry {\n  private registry = new Map<string, DehydratedDeferBlock>();\n  private cleanupFns = new Map<string, Function[]>();\n  private jsActionMap: Map<string, Set<Element>> = inject(JSACTION_BLOCK_ELEMENT_MAP);\n  private contract: EventContractDetails = inject(JSACTION_EVENT_CONTRACT);\n\n  add(blockId: string, info: DehydratedDeferBlock) {\n    this.registry.set(blockId, info);\n    // It's possible that hydration is queued that's waiting for the\n    // resolution of a lazy loaded route. In this case, we ensure\n    // the callback function is called to continue the hydration process\n    // for the queued block set.\n    if (this.awaitingCallbacks.has(blockId)) {\n      const awaitingCallbacks = this.awaitingCallbacks.get(blockId)!;\n      for (const cb of awaitingCallbacks) {\n        cb();\n      }\n    }\n  }\n\n  get(blockId: string): DehydratedDeferBlock | null {\n    return this.registry.get(blockId) ?? null;\n  }\n\n  has(blockId: string): boolean {\n    return this.registry.has(blockId);\n  }\n\n  cleanup(hydratedBlocks: string[]) {\n    removeListenersFromBlocks(hydratedBlocks, this.jsActionMap);\n    for (let blockId of hydratedBlocks) {\n      this.registry.delete(blockId);\n      this.jsActionMap.delete(blockId);\n      this.invokeTriggerCleanupFns(blockId);\n      this.hydrating.delete(blockId);\n      this.awaitingCallbacks.delete(blockId);\n    }\n    if (this.size === 0) {\n      this.contract.instance?.cleanUp();\n    }\n  }\n\n  get size(): number {\n    return this.registry.size;\n  }\n\n  // we have to leave the lowest block Id in the registry\n  // unless that block has no children\n  addCleanupFn(blockId: string, fn: Function) {\n    let cleanupFunctions: Function[] = [];\n    if (this.cleanupFns.has(blockId)) {\n      cleanupFunctions = this.cleanupFns.get(blockId)!;\n    }\n    cleanupFunctions.push(fn);\n    this.cleanupFns.set(blockId, cleanupFunctions);\n  }\n\n  invokeTriggerCleanupFns(blockId: string) {\n    const fns = this.cleanupFns.get(blockId) ?? [];\n    for (let fn of fns) {\n      fn();\n    }\n    this.cleanupFns.delete(blockId);\n  }\n\n  // Blocks that are being hydrated.\n  hydrating = new Map<string, PromiseWithResolvers<void>>();\n\n  // Blocks that are awaiting a defer instruction finish.\n  private awaitingCallbacks = new Map<string, Function[]>();\n\n  awaitParentBlock(topmostParentBlock: string, callback: Function) {\n    const parentBlockAwaitCallbacks = this.awaitingCallbacks.get(topmostParentBlock) ?? [];\n    parentBlockAwaitCallbacks.push(callback);\n    this.awaitingCallbacks.set(topmostParentBlock, parentBlockAwaitCallbacks);\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: DehydratedBlockRegistry,\n    providedIn: null,\n    factory: () => new DehydratedBlockRegistry(),\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport type {ViewRef} from '../linker/view_ref';\nimport {getComponent} from '../render3/util/discovery_utils';\nimport {LContainer} from '../render3/interfaces/container';\nimport {getDocument} from '../render3/interfaces/document';\nimport {RElement, RNode} from '../render3/interfaces/renderer_dom';\nimport {isRootView} from '../render3/interfaces/type_checks';\nimport {HEADER_OFFSET, LView, TVIEW, TViewType} from '../render3/interfaces/view';\nimport {makeStateKey, StateKey, TransferState} from '../transfer_state';\nimport {assertDefined, assertEqual} from '../util/assert';\nimport type {HydrationContext} from './annotate';\n\nimport {\n  BlockSummary,\n  CONTAINERS,\n  DEFER_HYDRATE_TRIGGERS,\n  DEFER_PARENT_BLOCK_ID,\n  DehydratedView,\n  DISCONNECTED_NODES,\n  ELEMENT_CONTAINERS,\n  MULTIPLIER,\n  NUM_ROOT_NODES,\n  SerializedContainerView,\n  SerializedDeferBlock,\n  SerializedTriggerDetails,\n  SerializedView,\n} from './interfaces';\nimport {IS_INCREMENTAL_HYDRATION_ENABLED, JSACTION_BLOCK_ELEMENT_MAP} from './tokens';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {DeferBlockTrigger, HydrateTriggerDetails} from '../defer/interfaces';\nimport {hoverEventNames, interactionEventNames} from '../defer/dom_triggers';\nimport {DEHYDRATED_BLOCK_REGISTRY} from '../defer/registry';\nimport {sharedMapFunction} from '../event_delegation_utils';\n\n/**\n * The name of the key used in the TransferState collection,\n * where hydration information is located.\n */\nconst TRANSFER_STATE_TOKEN_ID = '__nghData__';\n\n/**\n * Lookup key used to reference DOM hydration data (ngh) in `TransferState`.\n */\nexport const NGH_DATA_KEY: StateKey<SerializedView[]> =\n  makeStateKey<Array<SerializedView>>(TRANSFER_STATE_TOKEN_ID);\n\n/**\n * The name of the key used in the TransferState collection,\n * where serialized defer block information is located.\n */\nexport const TRANSFER_STATE_DEFER_BLOCKS_INFO = '__nghDeferData__';\n\n/**\n * Lookup key used to retrieve defer block datain `TransferState`.\n */\nexport const NGH_DEFER_BLOCKS_KEY: StateKey<{[key: string]: SerializedDeferBlock}> = makeStateKey<{\n  [key: string]: SerializedDeferBlock;\n}>(TRANSFER_STATE_DEFER_BLOCKS_INFO);\n\n/**\n * The name of the attribute that would be added to host component\n * nodes and contain a reference to a particular slot in transferred\n * state that contains the necessary hydration info for this component.\n */\nexport const NGH_ATTR_NAME = 'ngh';\n\n/**\n * Marker used in a comment node to ensure hydration content integrity\n */\nexport const SSR_CONTENT_INTEGRITY_MARKER = 'nghm';\n\nexport const enum TextNodeMarker {\n  /**\n   * The contents of the text comment added to nodes that would otherwise be\n   * empty when serialized by the server and passed to the client. The empty\n   * node is lost when the browser parses it otherwise. This comment node will\n   * be replaced during hydration in the client to restore the lost empty text\n   * node.\n   */\n  EmptyNode = 'ngetn',\n\n  /**\n   * The contents of the text comment added in the case of adjacent text nodes.\n   * When adjacent text nodes are serialized by the server and sent to the\n   * client, the browser loses reference to the amount of nodes and assumes\n   * just one text node. This separator is replaced during hydration to restore\n   * the proper separation and amount of text nodes that should be present.\n   */\n  Separator = 'ngtns',\n}\n\n/**\n * Reference to a function that reads `ngh` attribute value from a given RNode\n * and retrieves hydration information from the TransferState using that value\n * as an index. Returns `null` by default, when hydration is not enabled.\n *\n * @param rNode Component's host element.\n * @param injector Injector that this component has access to.\n * @param isRootView Specifies whether we trying to read hydration info for the root view.\n */\nlet _retrieveHydrationInfoImpl: typeof retrieveHydrationInfoImpl = () => null;\n\nexport function retrieveHydrationInfoImpl(\n  rNode: RElement,\n  injector: Injector,\n  isRootView = false,\n): DehydratedView | null {\n  let nghAttrValue = rNode.getAttribute(NGH_ATTR_NAME);\n  if (nghAttrValue == null) return null;\n\n  // For cases when a root component also acts as an anchor node for a ViewContainerRef\n  // (for example, when ViewContainerRef is injected in a root component), there is a need\n  // to serialize information about the component itself, as well as an LContainer that\n  // represents this ViewContainerRef. Effectively, we need to serialize 2 pieces of info:\n  // (1) hydration info for the root component itself and (2) hydration info for the\n  // ViewContainerRef instance (an LContainer). Each piece of information is included into\n  // the hydration data (in the TransferState object) separately, thus we end up with 2 ids.\n  // Since we only have 1 root element, we encode both bits of info into a single string:\n  // ids are separated by the `|` char (e.g. `10|25`, where `10` is the ngh for a component view\n  // and 25 is the `ngh` for a root view which holds LContainer).\n  const [componentViewNgh, rootViewNgh] = nghAttrValue.split('|');\n  nghAttrValue = isRootView ? rootViewNgh : componentViewNgh;\n  if (!nghAttrValue) return null;\n\n  // We've read one of the ngh ids, keep the remaining one, so that\n  // we can set it back on the DOM element.\n  const rootNgh = rootViewNgh ? `|${rootViewNgh}` : '';\n  const remainingNgh = isRootView ? componentViewNgh : rootNgh;\n\n  let data: SerializedView = {};\n  // An element might have an empty `ngh` attribute value (e.g. `<comp ngh=\"\" />`),\n  // which means that no special annotations are required. Do not attempt to read\n  // from the TransferState in this case.\n  if (nghAttrValue !== '') {\n    const transferState = injector.get(TransferState, null, {optional: true});\n    if (transferState !== null) {\n      const nghData = transferState.get(NGH_DATA_KEY, []);\n\n      // The nghAttrValue is always a number referencing an index\n      // in the hydration TransferState data.\n      data = nghData[Number(nghAttrValue)];\n\n      // If the `ngh` attribute exists and has a non-empty value,\n      // the hydration info *must* be present in the TransferState.\n      // If there is no data for some reasons, this is an error.\n      ngDevMode && assertDefined(data, 'Unable to retrieve hydration info from the TransferState.');\n    }\n  }\n  const dehydratedView: DehydratedView = {\n    data,\n    firstChild: rNode.firstChild ?? null,\n  };\n\n  if (isRootView) {\n    // If there is hydration info present for the root view, it means that there was\n    // a ViewContainerRef injected in the root component. The root component host element\n    // acted as an anchor node in this scenario. As a result, the DOM nodes that represent\n    // embedded views in this ViewContainerRef are located as siblings to the host node,\n    // i.e. `<app-root /><#VIEW1><#VIEW2>...<!--container-->`. In this case, the current\n    // node becomes the first child of this root view and the next sibling is the first\n    // element in the DOM segment.\n    dehydratedView.firstChild = rNode;\n\n    // We use `0` here, since this is the slot (right after the HEADER_OFFSET)\n    // where a component LView or an LContainer is located in a root LView.\n    setSegmentHead(dehydratedView, 0, rNode.nextSibling);\n  }\n\n  if (remainingNgh) {\n    // If we have only used one of the ngh ids, store the remaining one\n    // back on this RNode.\n    rNode.setAttribute(NGH_ATTR_NAME, remainingNgh);\n  } else {\n    // The `ngh` attribute is cleared from the DOM node now\n    // that the data has been retrieved for all indices.\n    rNode.removeAttribute(NGH_ATTR_NAME);\n  }\n\n  // Note: don't check whether this node was claimed for hydration,\n  // because this node might've been previously claimed while processing\n  // template instructions.\n  ngDevMode && markRNodeAsClaimedByHydration(rNode, /* checkIfAlreadyClaimed */ false);\n  ngDevMode && ngDevMode.hydratedComponents++;\n\n  return dehydratedView;\n}\n\n/**\n * Sets the implementation for the `retrieveHydrationInfo` function.\n */\nexport function enableRetrieveHydrationInfoImpl() {\n  _retrieveHydrationInfoImpl = retrieveHydrationInfoImpl;\n}\n\n/**\n * Retrieves hydration info by reading the value from the `ngh` attribute\n * and accessing a corresponding slot in TransferState storage.\n */\nexport function retrieveHydrationInfo(\n  rNode: RElement,\n  injector: Injector,\n  isRootView = false,\n): DehydratedView | null {\n  return _retrieveHydrationInfoImpl(rNode, injector, isRootView);\n}\n\n/**\n * Retrieves the necessary object from a given ViewRef to serialize:\n *  - an LView for component views\n *  - an LContainer for cases when component acts as a ViewContainerRef anchor\n *  - `null` in case of an embedded view\n */\nexport function getLNodeForHydration(viewRef: ViewRef): LView | LContainer | null {\n  // Reading an internal field from `ViewRef` instance.\n  let lView = (viewRef as any)._lView as LView;\n  const tView = lView[TVIEW];\n  // A registered ViewRef might represent an instance of an\n  // embedded view, in which case we do not need to annotate it.\n  if (tView.type === TViewType.Embedded) {\n    return null;\n  }\n  // Check if it's a root view and if so, retrieve component's\n  // LView from the first slot after the header.\n  if (isRootView(lView)) {\n    lView = lView[HEADER_OFFSET];\n  }\n\n  return lView;\n}\n\nfunction getTextNodeContent(node: Node): string | undefined {\n  return node.textContent?.replace(/\\s/gm, '');\n}\n\n/**\n * Restores text nodes and separators into the DOM that were lost during SSR\n * serialization. The hydration process replaces empty text nodes and text\n * nodes that are immediately adjacent to other text nodes with comment nodes\n * that this method filters on to restore those missing nodes that the\n * hydration process is expecting to be present.\n *\n * @param node The app's root HTML Element\n */\nexport function processTextNodeMarkersBeforeHydration(node: HTMLElement) {\n  const doc = getDocument();\n  const commentNodesIterator = doc.createNodeIterator(node, NodeFilter.SHOW_COMMENT, {\n    acceptNode(node) {\n      const content = getTextNodeContent(node);\n      const isTextNodeMarker =\n        content === TextNodeMarker.EmptyNode || content === TextNodeMarker.Separator;\n      return isTextNodeMarker ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n    },\n  });\n  let currentNode: Comment;\n  // We cannot modify the DOM while using the commentIterator,\n  // because it throws off the iterator state.\n  // So we collect all marker nodes first and then follow up with\n  // applying the changes to the DOM: either inserting an empty node\n  // or just removing the marker if it was used as a separator.\n  const nodes = [];\n  while ((currentNode = commentNodesIterator.nextNode() as Comment)) {\n    nodes.push(currentNode);\n  }\n  for (const node of nodes) {\n    if (node.textContent === TextNodeMarker.EmptyNode) {\n      node.replaceWith(doc.createTextNode(''));\n    } else {\n      node.remove();\n    }\n  }\n}\n\n/**\n * Internal type that represents a claimed node.\n * Only used in dev mode.\n */\nexport enum HydrationStatus {\n  Hydrated = 'hydrated',\n  Skipped = 'skipped',\n  Mismatched = 'mismatched',\n}\n\nexport type HydrationInfo =\n  | {\n      status: HydrationStatus.Hydrated | HydrationStatus.Skipped;\n    }\n  | {\n      status: HydrationStatus.Mismatched;\n      actualNodeDetails: string | null;\n      expectedNodeDetails: string | null;\n    };\n\nconst HYDRATION_INFO_KEY = '__ngDebugHydrationInfo__';\n\nexport type HydratedNode = {\n  [HYDRATION_INFO_KEY]?: HydrationInfo;\n};\n\nfunction patchHydrationInfo(node: RNode, info: HydrationInfo) {\n  (node as HydratedNode)[HYDRATION_INFO_KEY] = info;\n}\n\nexport function readHydrationInfo(node: RNode): HydrationInfo | null {\n  return (node as HydratedNode)[HYDRATION_INFO_KEY] ?? null;\n}\n\n/**\n * Marks a node as \"claimed\" by hydration process.\n * This is needed to make assessments in tests whether\n * the hydration process handled all nodes.\n */\nexport function markRNodeAsClaimedByHydration(node: RNode, checkIfAlreadyClaimed = true) {\n  if (!ngDevMode) {\n    throw new Error(\n      'Calling `markRNodeAsClaimedByHydration` in prod mode ' +\n        'is not supported and likely a mistake.',\n    );\n  }\n  if (checkIfAlreadyClaimed && isRNodeClaimedForHydration(node)) {\n    throw new Error('Trying to claim a node, which was claimed already.');\n  }\n  patchHydrationInfo(node, {status: HydrationStatus.Hydrated});\n  ngDevMode.hydratedNodes++;\n}\n\nexport function markRNodeAsSkippedByHydration(node: RNode) {\n  if (!ngDevMode) {\n    throw new Error(\n      'Calling `markRNodeAsSkippedByHydration` in prod mode ' +\n        'is not supported and likely a mistake.',\n    );\n  }\n  patchHydrationInfo(node, {status: HydrationStatus.Skipped});\n  ngDevMode.componentsSkippedHydration++;\n}\n\nexport function countBlocksSkippedByHydration(injector: Injector) {\n  const transferState = injector.get(TransferState);\n  const nghDeferData = transferState.get(NGH_DEFER_BLOCKS_KEY, {});\n  if (ngDevMode) {\n    ngDevMode.deferBlocksWithIncrementalHydration = Object.keys(nghDeferData).length;\n  }\n}\n\nexport function markRNodeAsHavingHydrationMismatch(\n  node: RNode,\n  expectedNodeDetails: string | null = null,\n  actualNodeDetails: string | null = null,\n) {\n  if (!ngDevMode) {\n    throw new Error(\n      'Calling `markRNodeAsMismatchedByHydration` in prod mode ' +\n        'is not supported and likely a mistake.',\n    );\n  }\n\n  // The RNode can be a standard HTMLElement (not an Angular component or directive)\n  // The devtools component tree only displays Angular components & directives\n  // Therefore we attach the debug info to the closest component/directive\n  while (node && !getComponent(node as Element)) {\n    node = node?.parentNode as RNode;\n  }\n\n  if (node) {\n    patchHydrationInfo(node, {\n      status: HydrationStatus.Mismatched,\n      expectedNodeDetails,\n      actualNodeDetails,\n    });\n  }\n}\n\nexport function isRNodeClaimedForHydration(node: RNode): boolean {\n  return readHydrationInfo(node)?.status === HydrationStatus.Hydrated;\n}\n\nexport function setSegmentHead(\n  hydrationInfo: DehydratedView,\n  index: number,\n  node: RNode | null,\n): void {\n  hydrationInfo.segmentHeads ??= {};\n  hydrationInfo.segmentHeads[index] = node;\n}\n\nexport function getSegmentHead(hydrationInfo: DehydratedView, index: number): RNode | null {\n  return hydrationInfo.segmentHeads?.[index] ?? null;\n}\n\nexport function isIncrementalHydrationEnabled(injector: Injector): boolean {\n  return injector.get(IS_INCREMENTAL_HYDRATION_ENABLED, false, {\n    optional: true,\n  });\n}\n\n/** Throws an error if the incremental hydration is not enabled */\nexport function assertIncrementalHydrationIsConfigured(injector: Injector) {\n  if (!isIncrementalHydrationEnabled(injector)) {\n    throw new RuntimeError(\n      RuntimeErrorCode.MISCONFIGURED_INCREMENTAL_HYDRATION,\n      'Angular has detected that some `@defer` blocks use `hydrate` triggers, ' +\n        'but incremental hydration was not enabled. Please ensure that the `withIncrementalHydration()` ' +\n        'call is added as an argument for the `provideClientHydration()` function call ' +\n        'in your application config.',\n    );\n  }\n}\n\n/** Throws an error if the ssrUniqueId on the LDeferBlockDetails is not present  */\nexport function assertSsrIdDefined(ssrUniqueId: unknown) {\n  assertDefined(\n    ssrUniqueId,\n    'Internal error: expecting an SSR id for a defer block that should be hydrated, but the id is not present',\n  );\n}\n\n/**\n * Returns the size of an <ng-container>, using either the information\n * serialized in `ELEMENT_CONTAINERS` (element container size) or by\n * computing the sum of root nodes in all dehydrated views in a given\n * container (in case this `<ng-container>` was also used as a view\n * container host node, e.g. <ng-container *ngIf>).\n */\nexport function getNgContainerSize(hydrationInfo: DehydratedView, index: number): number | null {\n  const data = hydrationInfo.data;\n  let size = data[ELEMENT_CONTAINERS]?.[index] ?? null;\n  // If there is no serialized information available in the `ELEMENT_CONTAINERS` slot,\n  // check if we have info about view containers at this location (e.g.\n  // `<ng-container *ngIf>`) and use container size as a number of root nodes in this\n  // element container.\n  if (size === null && data[CONTAINERS]?.[index]) {\n    size = calcSerializedContainerSize(hydrationInfo, index);\n  }\n  return size;\n}\n\nexport function isSerializedElementContainer(\n  hydrationInfo: DehydratedView,\n  index: number,\n): boolean {\n  return hydrationInfo.data[ELEMENT_CONTAINERS]?.[index] !== undefined;\n}\n\nexport function getSerializedContainerViews(\n  hydrationInfo: DehydratedView,\n  index: number,\n): SerializedContainerView[] | null {\n  return hydrationInfo.data[CONTAINERS]?.[index] ?? null;\n}\n\n/**\n * Computes the size of a serialized container (the number of root nodes)\n * by calculating the sum of root nodes in all dehydrated views in this container.\n */\nexport function calcSerializedContainerSize(hydrationInfo: DehydratedView, index: number): number {\n  const views = getSerializedContainerViews(hydrationInfo, index) ?? [];\n  let numNodes = 0;\n  for (let view of views) {\n    numNodes += view[NUM_ROOT_NODES] * (view[MULTIPLIER] ?? 1);\n  }\n  return numNodes;\n}\n\n/**\n * Attempt to initialize the `disconnectedNodes` field of the given\n * `DehydratedView`. Returns the initialized value.\n */\nexport function initDisconnectedNodes(hydrationInfo: DehydratedView): Set<number> | null {\n  // Check if we are processing disconnected info for the first time.\n  if (typeof hydrationInfo.disconnectedNodes === 'undefined') {\n    const nodeIds = hydrationInfo.data[DISCONNECTED_NODES];\n    hydrationInfo.disconnectedNodes = nodeIds ? new Set(nodeIds) : null;\n  }\n  return hydrationInfo.disconnectedNodes;\n}\n\n/**\n * Checks whether a node is annotated as \"disconnected\", i.e. not present\n * in the DOM at serialization time. We should not attempt hydration for\n * such nodes and instead, use a regular \"creation mode\".\n */\nexport function isDisconnectedNode(hydrationInfo: DehydratedView, index: number): boolean {\n  // Check if we are processing disconnected info for the first time.\n  if (typeof hydrationInfo.disconnectedNodes === 'undefined') {\n    const nodeIds = hydrationInfo.data[DISCONNECTED_NODES];\n    hydrationInfo.disconnectedNodes = nodeIds ? new Set(nodeIds) : null;\n  }\n  return !!initDisconnectedNodes(hydrationInfo)?.has(index);\n}\n\n/**\n * Helper function to prepare text nodes for serialization by ensuring\n * that seperate logical text blocks in the DOM remain separate after\n * serialization.\n */\nexport function processTextNodeBeforeSerialization(context: HydrationContext, node: RNode) {\n  // Handle cases where text nodes can be lost after DOM serialization:\n  //  1. When there is an *empty text node* in DOM: in this case, this\n  //     node would not make it into the serialized string and as a result,\n  //     this node wouldn't be created in a browser. This would result in\n  //     a mismatch during the hydration, where the runtime logic would expect\n  //     a text node to be present in live DOM, but no text node would exist.\n  //     Example: `<span>{{ name }}</span>` when the `name` is an empty string.\n  //     This would result in `<span></span>` string after serialization and\n  //     in a browser only the `span` element would be created. To resolve that,\n  //     an extra comment node is appended in place of an empty text node and\n  //     that special comment node is replaced with an empty text node *before*\n  //     hydration.\n  //  2. When there are 2 consecutive text nodes present in the DOM.\n  //     Example: `<div>Hello <ng-container *ngIf=\"true\">world</ng-container></div>`.\n  //     In this scenario, the live DOM would look like this:\n  //       <div>#text('Hello ') #text('world') #comment('container')</div>\n  //     Serialized string would look like this: `<div>Hello world<!--container--></div>`.\n  //     The live DOM in a browser after that would be:\n  //       <div>#text('Hello world') #comment('container')</div>\n  //     Notice how 2 text nodes are now \"merged\" into one. This would cause hydration\n  //     logic to fail, since it'd expect 2 text nodes being present, not one.\n  //     To fix this, we insert a special comment node in between those text nodes, so\n  //     serialized representation is: `<div>Hello <!--ngtns-->world<!--container--></div>`.\n  //     This forces browser to create 2 text nodes separated by a comment node.\n  //     Before running a hydration process, this special comment node is removed, so the\n  //     live DOM has exactly the same state as it was before serialization.\n\n  // Collect this node as required special annotation only when its\n  // contents is empty. Otherwise, such text node would be present on\n  // the client after server-side rendering and no special handling needed.\n  const el = node as HTMLElement;\n  const corruptedTextNodes = context.corruptedTextNodes;\n  if (el.textContent === '') {\n    corruptedTextNodes.set(el, TextNodeMarker.EmptyNode);\n  } else if (el.nextSibling?.nodeType === Node.TEXT_NODE) {\n    corruptedTextNodes.set(el, TextNodeMarker.Separator);\n  }\n}\n\nexport function convertHydrateTriggersToJsAction(\n  triggers: Map<DeferBlockTrigger, HydrateTriggerDetails | null> | null,\n): string[] {\n  let actionList: string[] = [];\n  if (triggers !== null) {\n    if (triggers.has(DeferBlockTrigger.Hover)) {\n      actionList.push(...hoverEventNames);\n    }\n    if (triggers.has(DeferBlockTrigger.Interaction)) {\n      actionList.push(...interactionEventNames);\n    }\n  }\n  return actionList;\n}\n\n/**\n * Builds a queue of blocks that need to be hydrated, looking up the\n * tree to the topmost defer block that exists in the tree that hasn't\n * been hydrated, but exists in the registry. This queue is in top down\n * hierarchical order as a list of defer block ids.\n * Note: This is utilizing serialized information to navigate up the tree\n */\nexport function getParentBlockHydrationQueue(\n  deferBlockId: string,\n  injector: Injector,\n): {parentBlockPromise: Promise<void> | null; hydrationQueue: string[]} {\n  const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);\n  const transferState = injector.get(TransferState);\n  const deferBlockParents = transferState.get(NGH_DEFER_BLOCKS_KEY, {});\n\n  let isTopMostDeferBlock = false;\n  let currentBlockId: string | undefined = deferBlockId;\n  let parentBlockPromise: Promise<void> | null = null;\n  const hydrationQueue: string[] = [];\n\n  while (!isTopMostDeferBlock && currentBlockId) {\n    ngDevMode &&\n      assertEqual(\n        hydrationQueue.indexOf(currentBlockId),\n        -1,\n        'Internal error: defer block hierarchy has a cycle.',\n      );\n\n    isTopMostDeferBlock = dehydratedBlockRegistry.has(currentBlockId);\n    const hydratingParentBlock = dehydratedBlockRegistry.hydrating.get(currentBlockId);\n    if (parentBlockPromise === null && hydratingParentBlock != null) {\n      parentBlockPromise = hydratingParentBlock.promise;\n      break;\n    }\n    hydrationQueue.unshift(currentBlockId);\n    currentBlockId = deferBlockParents[currentBlockId][DEFER_PARENT_BLOCK_ID];\n  }\n  return {parentBlockPromise, hydrationQueue};\n}\n\nfunction gatherDeferBlocksByJSActionAttribute(doc: Document): Set<HTMLElement> {\n  const jsactionNodes = doc.body.querySelectorAll('[jsaction]');\n  const blockMap = new Set<HTMLElement>();\n  const eventTypes = [hoverEventNames.join(':;'), interactionEventNames.join(':;')].join('|');\n  for (let node of jsactionNodes) {\n    const attr = node.getAttribute('jsaction');\n    const blockId = node.getAttribute('ngb');\n    if (attr?.match(eventTypes) && blockId !== null) {\n      blockMap.add(node as HTMLElement);\n    }\n  }\n  return blockMap;\n}\n\nexport function appendDeferBlocksToJSActionMap(doc: Document, injector: Injector) {\n  const blockMap = gatherDeferBlocksByJSActionAttribute(doc);\n  const jsActionMap = injector.get(JSACTION_BLOCK_ELEMENT_MAP);\n  for (let rNode of blockMap) {\n    sharedMapFunction(rNode, jsActionMap);\n  }\n}\n\n/**\n * Retrieves defer block hydration information from the TransferState.\n *\n * @param injector Injector that this component has access to.\n */\nlet _retrieveDeferBlockDataImpl: typeof retrieveDeferBlockDataImpl = () => {\n  return {};\n};\n\nexport function retrieveDeferBlockDataImpl(injector: Injector): {\n  [key: string]: SerializedDeferBlock;\n} {\n  const transferState = injector.get(TransferState, null, {optional: true});\n  if (transferState !== null) {\n    const nghDeferData = transferState.get(NGH_DEFER_BLOCKS_KEY, {});\n\n    ngDevMode &&\n      assertDefined(nghDeferData, 'Unable to retrieve defer block info from the TransferState.');\n    return nghDeferData;\n  }\n\n  return {};\n}\n\n/**\n * Sets the implementation for the `retrieveDeferBlockData` function.\n */\nexport function enableRetrieveDeferBlockDataImpl() {\n  _retrieveDeferBlockDataImpl = retrieveDeferBlockDataImpl;\n}\n\n/**\n * Retrieves defer block data from TransferState storage\n */\nexport function retrieveDeferBlockData(injector: Injector): {[key: string]: SerializedDeferBlock} {\n  return _retrieveDeferBlockDataImpl(injector);\n}\n\nfunction isTimerTrigger(triggerInfo: DeferBlockTrigger | SerializedTriggerDetails): boolean {\n  return typeof triggerInfo === 'object' && triggerInfo.trigger === DeferBlockTrigger.Timer;\n}\n\nfunction getHydrateTimerTrigger(blockData: SerializedDeferBlock): number | null {\n  const trigger = blockData[DEFER_HYDRATE_TRIGGERS]?.find((t) => isTimerTrigger(t));\n  return (trigger as SerializedTriggerDetails)?.delay ?? null;\n}\n\nfunction hasHydrateTrigger(blockData: SerializedDeferBlock, trigger: DeferBlockTrigger): boolean {\n  return blockData[DEFER_HYDRATE_TRIGGERS]?.includes(trigger) ?? false;\n}\n\n/**\n * Creates a summary of the given serialized defer block, which is used later to properly initialize\n * specific triggers.\n */\nfunction createBlockSummary(blockInfo: SerializedDeferBlock): BlockSummary {\n  return {\n    data: blockInfo,\n    hydrate: {\n      idle: hasHydrateTrigger(blockInfo, DeferBlockTrigger.Idle),\n      immediate: hasHydrateTrigger(blockInfo, DeferBlockTrigger.Immediate),\n      timer: getHydrateTimerTrigger(blockInfo),\n      viewport: hasHydrateTrigger(blockInfo, DeferBlockTrigger.Viewport),\n    },\n  };\n}\n\n/**\n * Processes all of the defer block data in the transfer state and creates a map of the summaries\n */\nexport function processBlockData(injector: Injector): Map<string, BlockSummary> {\n  const blockData = retrieveDeferBlockData(injector);\n  let blockDetails = new Map<string, BlockSummary>();\n  for (let blockId in blockData) {\n    blockDetails.set(blockId, createBlockSummary(blockData[blockId]));\n  }\n  return blockDetails;\n}\n\nfunction isSsrContentsIntegrity(node: ChildNode | null): boolean {\n  return (\n    !!node &&\n    node.nodeType === Node.COMMENT_NODE &&\n    node.textContent?.trim() === SSR_CONTENT_INTEGRITY_MARKER\n  );\n}\n\nfunction skipTextNodes(node: ChildNode | null): ChildNode | null {\n  // Ignore whitespace. Before the <body>, we shouldn't find text nodes that aren't whitespace.\n  while (node && node.nodeType === Node.TEXT_NODE) {\n    node = node.previousSibling;\n  }\n  return node;\n}\n\n/**\n * Verifies whether the DOM contains a special marker added during SSR time to make sure\n * there is no SSR'ed contents transformations happen after SSR is completed. Typically that\n * happens either by CDN or during the build process as an optimization to remove comment nodes.\n * Hydration process requires comment nodes produced by Angular to locate correct DOM segments.\n * When this special marker is *not* present - throw an error and do not proceed with hydration,\n * since it will not be able to function correctly.\n *\n * Note: this function is invoked only on the client, so it's safe to use DOM APIs.\n */\nexport function verifySsrContentsIntegrity(doc: Document): void {\n  for (const node of doc.body.childNodes) {\n    if (isSsrContentsIntegrity(node)) {\n      return;\n    }\n  }\n\n  // Check if the HTML parser may have moved the marker to just before the <body> tag,\n  // e.g. because the body tag was implicit and not present in the markup. An implicit body\n  // tag is unlikely to interfer with whitespace/comments inside of the app's root element.\n\n  // Case 1: Implicit body. Example:\n  //   <!doctype html><head><title>Hi</title></head><!--nghm--><app-root></app-root>\n  const beforeBody = skipTextNodes(doc.body.previousSibling);\n  if (isSsrContentsIntegrity(beforeBody)) {\n    return;\n  }\n\n  // Case 2: Implicit body & head. Example:\n  //   <!doctype html><head><title>Hi</title><!--nghm--><app-root></app-root>\n  let endOfHead = skipTextNodes(doc.head.lastChild);\n  if (isSsrContentsIntegrity(endOfHead)) {\n    return;\n  }\n\n  throw new RuntimeError(\n    RuntimeErrorCode.MISSING_SSR_CONTENT_INTEGRITY_MARKER,\n    typeof ngDevMode !== 'undefined' &&\n      ngDevMode &&\n      'Angular hydration logic detected that HTML content of this page was modified after it ' +\n        'was produced during server side rendering. Make sure that there are no optimizations ' +\n        'that remove comment nodes from HTML enabled on your CDN. Angular hydration ' +\n        'relies on HTML produced by the server, including whitespaces and comment nodes.',\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../../primitives/signals';\nimport {LView, TView} from '../interfaces/view';\nimport {DirectiveDef, RenderFlags, ViewQueriesFunction} from '../interfaces/definition';\nimport {assertDefined} from '../../util/assert';\nimport {setCurrentQueryIndex} from '../state';\nimport {TNode} from '../interfaces/node';\nimport {isContentQueryHost} from '../interfaces/type_checks';\n\n/** Refreshes all content queries declared by directives in a given view */\nexport function refreshContentQueries(tView: TView, lView: LView): void {\n  const contentQueries = tView.contentQueries;\n  if (contentQueries !== null) {\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      for (let i = 0; i < contentQueries.length; i += 2) {\n        const queryStartIdx = contentQueries[i];\n        const directiveDefIdx = contentQueries[i + 1];\n        if (directiveDefIdx !== -1) {\n          const directiveDef = tView.data[directiveDefIdx] as DirectiveDef<any>;\n          ngDevMode && assertDefined(directiveDef, 'DirectiveDef not found.');\n          ngDevMode &&\n            assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined');\n          setCurrentQueryIndex(queryStartIdx);\n          directiveDef.contentQueries!(RenderFlags.Update, lView[directiveDefIdx], directiveDefIdx);\n        }\n      }\n    } finally {\n      setActiveConsumer(prevConsumer);\n    }\n  }\n}\n\nexport function executeViewQueryFn<T>(\n  flags: RenderFlags,\n  viewQueryFn: ViewQueriesFunction<T>,\n  component: T,\n): void {\n  ngDevMode && assertDefined(viewQueryFn, 'View queries function to execute must be defined.');\n  setCurrentQueryIndex(0);\n  const prevConsumer = setActiveConsumer(null);\n  try {\n    viewQueryFn(flags, component);\n  } finally {\n    setActiveConsumer(prevConsumer);\n  }\n}\n\nexport function executeContentQueries(tView: TView, tNode: TNode, lView: LView) {\n  if (isContentQueryHost(tNode)) {\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      const start = tNode.directiveStart;\n      const end = tNode.directiveEnd;\n      for (let directiveIndex = start; directiveIndex < end; directiveIndex++) {\n        const def = tView.data[directiveIndex] as DirectiveDef<any>;\n        if (def.contentQueries) {\n          const directiveInstance = lView[directiveIndex];\n          ngDevMode &&\n            assertDefined(\n              directiveIndex,\n              'Incorrect reference to a directive defining a content query',\n            );\n          def.contentQueries(RenderFlags.Create, directiveInstance, directiveIndex);\n        }\n      }\n    } finally {\n      setActiveConsumer(prevConsumer);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Defines the CSS styles encapsulation policies for the {@link /api/core/Component Component} decorator's\n * `encapsulation` option.\n *\n * See {@link Component#encapsulation encapsulation}.\n *\n * @usageNotes\n * ### Example\n *\n * {@example core/ts/metadata/encapsulation.ts region='longform'}\n *\n * @publicApi\n */\nexport enum ViewEncapsulation {\n  // TODO: consider making `ViewEncapsulation` a `const enum` instead. See\n  // https://github.com/angular/angular/issues/44119 for additional information.\n\n  /**\n   * Emulates a native Shadow DOM encapsulation behavior by adding a specific attribute to the\n   * component's host element and applying the same attribute to all the CSS selectors provided\n   * via {@link Component#styles styles} or {@link Component#styleUrls styleUrls}.\n   *\n   * This is the default option.\n   */\n  Emulated = 0,\n\n  // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.\n\n  /**\n   * Doesn't provide any sort of CSS style encapsulation, meaning that all the styles provided\n   * via {@link Component#styles styles} or {@link Component#styleUrls styleUrls} are applicable\n   * to any HTML element of the application regardless of their host Component.\n   */\n  None = 2,\n\n  /**\n   * Uses the browser's native Shadow DOM API to encapsulate CSS styles, meaning that it creates\n   * a ShadowRoot for the component's host element which is then used to encapsulate\n   * all the Component's styling.\n   */\n  ShadowDom = 3,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @fileoverview\n * A module to facilitate use of a Trusted Types policy internally within\n * Angular. It lazily constructs the Trusted Types policy, providing helper\n * utilities for promoting strings to Trusted Types. When Trusted Types are not\n * available, strings are used as a fallback.\n * @security All use of this module is security-sensitive and should go through\n * security review.\n */\n\nimport {global} from '../global';\n\nimport {\n  TrustedHTML,\n  TrustedScript,\n  TrustedScriptURL,\n  TrustedTypePolicy,\n  TrustedTypePolicyFactory,\n} from './trusted_type_defs';\n\n/**\n * The Trusted Types policy, or null if Trusted Types are not\n * enabled/supported, or undefined if the policy has not been created yet.\n */\nlet policy: TrustedTypePolicy | null | undefined;\n\n/**\n * Returns the Trusted Types policy, or null if Trusted Types are not\n * enabled/supported. The first call to this function will create the policy.\n */\nfunction getPolicy(): TrustedTypePolicy | null {\n  if (policy === undefined) {\n    policy = null;\n    if (global.trustedTypes) {\n      try {\n        policy = (global.trustedTypes as TrustedTypePolicyFactory).createPolicy('angular', {\n          createHTML: (s: string) => s,\n          createScript: (s: string) => s,\n          createScriptURL: (s: string) => s,\n        });\n      } catch {\n        // trustedTypes.createPolicy throws if called with a name that is\n        // already registered, even in report-only mode. Until the API changes,\n        // catch the error not to break the applications functionally. In such\n        // cases, the code will fall back to using strings.\n      }\n    }\n  }\n  return policy;\n}\n\n/**\n * Unsafely promote a string to a TrustedHTML, falling back to strings when\n * Trusted Types are not available.\n * @security This is a security-sensitive function; any use of this function\n * must go through security review. In particular, it must be assured that the\n * provided string will never cause an XSS vulnerability if used in a context\n * that will be interpreted as HTML by a browser, e.g. when assigning to\n * element.innerHTML.\n */\nexport function trustedHTMLFromString(html: string): TrustedHTML | string {\n  return getPolicy()?.createHTML(html) || html;\n}\n\n/**\n * Unsafely promote a string to a TrustedScript, falling back to strings when\n * Trusted Types are not available.\n * @security In particular, it must be assured that the provided string will\n * never cause an XSS vulnerability if used in a context that will be\n * interpreted and executed as a script by a browser, e.g. when calling eval.\n */\nexport function trustedScriptFromString(script: string): TrustedScript | string {\n  return getPolicy()?.createScript(script) || script;\n}\n\n/**\n * Unsafely promote a string to a TrustedScriptURL, falling back to strings\n * when Trusted Types are not available.\n * @security This is a security-sensitive function; any use of this function\n * must go through security review. In particular, it must be assured that the\n * provided string will never cause an XSS vulnerability if used in a context\n * that will cause a browser to load and execute a resource, e.g. when\n * assigning to script.src.\n */\nexport function trustedScriptURLFromString(url: string): TrustedScriptURL | string {\n  return getPolicy()?.createScriptURL(url) || url;\n}\n\n/**\n * Unsafely call the Function constructor with the given string arguments. It\n * is only available in development mode, and should be stripped out of\n * production code.\n * @security This is a security-sensitive function; any use of this function\n * must go through security review. In particular, it must be assured that it\n * is only called from development code, as use in production code can lead to\n * XSS vulnerabilities.\n */\nexport function newTrustedFunctionForDev(...args: string[]): Function {\n  if (typeof ngDevMode === 'undefined') {\n    throw new Error('newTrustedFunctionForDev should never be called in production');\n  }\n  if (!global.trustedTypes) {\n    // In environments that don't support Trusted Types, fall back to the most\n    // straightforward implementation:\n    return new Function(...args);\n  }\n\n  // Chrome currently does not support passing TrustedScript to the Function\n  // constructor. The following implements the workaround proposed on the page\n  // below, where the Chromium bug is also referenced:\n  // https://github.com/w3c/webappsec-trusted-types/wiki/Trusted-Types-for-function-constructor\n  const fnArgs = args.slice(0, -1).join(',');\n  const fnBody = args[args.length - 1];\n  const body = `(function anonymous(${fnArgs}\n) { ${fnBody}\n})`;\n\n  // Using eval directly confuses the compiler and prevents this module from\n  // being stripped out of JS binaries even if not used. The global['eval']\n  // indirection fixes that.\n  const fn = global['eval'](trustedScriptFromString(body)) as Function;\n  if (fn.bind === undefined) {\n    // Workaround for a browser bug that only exists in Chrome 83, where passing\n    // a TrustedScript to eval just returns the TrustedScript back without\n    // evaluating it. In that case, fall back to the most straightforward\n    // implementation:\n    return new Function(...args);\n  }\n\n  // To completely mimic the behavior of calling \"new Function\", two more\n  // things need to happen:\n  // 1. Stringifying the resulting function should return its source code\n  fn.toString = () => body;\n  // 2. When calling the resulting function, `this` should refer to `global`\n  return fn.bind(global);\n\n  // When Trusted Types support in Function constructors is widely available,\n  // the implementation of this function can be simplified to:\n  // return new Function(...args.map(a => trustedScriptFromString(a)));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @fileoverview\n * A module to facilitate use of a Trusted Types policy internally within\n * Angular specifically for bypassSecurityTrust* and custom sanitizers. It\n * lazily constructs the Trusted Types policy, providing helper utilities for\n * promoting strings to Trusted Types. When Trusted Types are not available,\n * strings are used as a fallback.\n * @security All use of this module is security-sensitive and should go through\n * security review.\n */\n\nimport {global} from '../global';\nimport {\n  TrustedHTML,\n  TrustedScript,\n  TrustedScriptURL,\n  TrustedTypePolicy,\n  TrustedTypePolicyFactory,\n} from './trusted_type_defs';\n\n/**\n * The Trusted Types policy, or null if Trusted Types are not\n * enabled/supported, or undefined if the policy has not been created yet.\n */\nlet policy: TrustedTypePolicy | null | undefined;\n\n/**\n * Returns the Trusted Types policy, or null if Trusted Types are not\n * enabled/supported. The first call to this function will create the policy.\n */\nfunction getPolicy(): TrustedTypePolicy | null {\n  if (policy === undefined) {\n    policy = null;\n    if (global.trustedTypes) {\n      try {\n        policy = (global.trustedTypes as TrustedTypePolicyFactory).createPolicy(\n          'angular#unsafe-bypass',\n          {\n            createHTML: (s: string) => s,\n            createScript: (s: string) => s,\n            createScriptURL: (s: string) => s,\n          },\n        );\n      } catch {\n        // trustedTypes.createPolicy throws if called with a name that is\n        // already registered, even in report-only mode. Until the API changes,\n        // catch the error not to break the applications functionally. In such\n        // cases, the code will fall back to using strings.\n      }\n    }\n  }\n  return policy;\n}\n\n/**\n * Unsafely promote a string to a TrustedHTML, falling back to strings when\n * Trusted Types are not available.\n * @security This is a security-sensitive function; any use of this function\n * must go through security review. In particular, it must be assured that it\n * is only passed strings that come directly from custom sanitizers or the\n * bypassSecurityTrust* functions.\n */\nexport function trustedHTMLFromStringBypass(html: string): TrustedHTML | string {\n  return getPolicy()?.createHTML(html) || html;\n}\n\n/**\n * Unsafely promote a string to a TrustedScript, falling back to strings when\n * Trusted Types are not available.\n * @security This is a security-sensitive function; any use of this function\n * must go through security review. In particular, it must be assured that it\n * is only passed strings that come directly from custom sanitizers or the\n * bypassSecurityTrust* functions.\n */\nexport function trustedScriptFromStringBypass(script: string): TrustedScript | string {\n  return getPolicy()?.createScript(script) || script;\n}\n\n/**\n * Unsafely promote a string to a TrustedScriptURL, falling back to strings\n * when Trusted Types are not available.\n * @security This is a security-sensitive function; any use of this function\n * must go through security review. In particular, it must be assured that it\n * is only passed strings that come directly from custom sanitizers or the\n * bypassSecurityTrust* functions.\n */\nexport function trustedScriptURLFromStringBypass(url: string): TrustedScriptURL | string {\n  return getPolicy()?.createScriptURL(url) || url;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {XSS_SECURITY_URL} from '../error_details_base_url';\n\nexport const enum BypassType {\n  Url = 'URL',\n  Html = 'HTML',\n  ResourceUrl = 'ResourceURL',\n  Script = 'Script',\n  Style = 'Style',\n}\n\n/**\n * Marker interface for a value that's safe to use in a particular context.\n *\n * @publicApi\n */\nexport interface SafeValue {}\n\n/**\n * Marker interface for a value that's safe to use as HTML.\n *\n * @publicApi\n */\nexport interface SafeHtml extends SafeValue {}\n\n/**\n * Marker interface for a value that's safe to use as style (CSS).\n *\n * @publicApi\n */\nexport interface SafeStyle extends SafeValue {}\n\n/**\n * Marker interface for a value that's safe to use as JavaScript.\n *\n * @publicApi\n */\nexport interface SafeScript extends SafeValue {}\n\n/**\n * Marker interface for a value that's safe to use as a URL linking to a document.\n *\n * @publicApi\n */\nexport interface SafeUrl extends SafeValue {}\n\n/**\n * Marker interface for a value that's safe to use as a URL to load executable code from.\n *\n * @publicApi\n */\nexport interface SafeResourceUrl extends SafeValue {}\n\nabstract class SafeValueImpl implements SafeValue {\n  constructor(public changingThisBreaksApplicationSecurity: string) {}\n\n  abstract getTypeName(): string;\n\n  toString() {\n    return (\n      `SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity}` +\n      ` (see ${XSS_SECURITY_URL})`\n    );\n  }\n}\n\nclass SafeHtmlImpl extends SafeValueImpl implements SafeHtml {\n  override getTypeName() {\n    return BypassType.Html;\n  }\n}\nclass SafeStyleImpl extends SafeValueImpl implements SafeStyle {\n  override getTypeName() {\n    return BypassType.Style;\n  }\n}\nclass SafeScriptImpl extends SafeValueImpl implements SafeScript {\n  override getTypeName() {\n    return BypassType.Script;\n  }\n}\nclass SafeUrlImpl extends SafeValueImpl implements SafeUrl {\n  override getTypeName() {\n    return BypassType.Url;\n  }\n}\nclass SafeResourceUrlImpl extends SafeValueImpl implements SafeResourceUrl {\n  override getTypeName() {\n    return BypassType.ResourceUrl;\n  }\n}\n\nexport function unwrapSafeValue(value: SafeValue): string;\nexport function unwrapSafeValue<T>(value: T): T;\nexport function unwrapSafeValue<T>(value: T | SafeValue): T {\n  return value instanceof SafeValueImpl\n    ? (value.changingThisBreaksApplicationSecurity as any as T)\n    : (value as any as T);\n}\n\nexport function allowSanitizationBypassAndThrow(\n  value: any,\n  type: BypassType.Html,\n): value is SafeHtml;\nexport function allowSanitizationBypassAndThrow(\n  value: any,\n  type: BypassType.ResourceUrl,\n): value is SafeResourceUrl;\nexport function allowSanitizationBypassAndThrow(\n  value: any,\n  type: BypassType.Script,\n): value is SafeScript;\nexport function allowSanitizationBypassAndThrow(\n  value: any,\n  type: BypassType.Style,\n): value is SafeStyle;\nexport function allowSanitizationBypassAndThrow(value: any, type: BypassType.Url): value is SafeUrl;\nexport function allowSanitizationBypassAndThrow(value: any, type: BypassType): boolean;\nexport function allowSanitizationBypassAndThrow(value: any, type: BypassType): boolean {\n  const actualType = getSanitizationBypassType(value);\n  if (actualType != null && actualType !== type) {\n    // Allow ResourceURLs in URL contexts, they are strictly more trusted.\n    if (actualType === BypassType.ResourceUrl && type === BypassType.Url) return true;\n    throw new Error(`Required a safe ${type}, got a ${actualType} (see ${XSS_SECURITY_URL})`);\n  }\n  return actualType === type;\n}\n\nexport function getSanitizationBypassType(value: any): BypassType | null {\n  return (value instanceof SafeValueImpl && (value.getTypeName() as BypassType)) || null;\n}\n\n/**\n * Mark `html` string as trusted.\n *\n * This function wraps the trusted string in `String` and brands it in a way which makes it\n * recognizable to {@link htmlSanitizer} to be trusted implicitly.\n *\n * @param trustedHtml `html` string which needs to be implicitly trusted.\n * @returns a `html` which has been branded to be implicitly trusted.\n */\nexport function bypassSanitizationTrustHtml(trustedHtml: string): SafeHtml {\n  return new SafeHt   mlImpl(trustedHtml);\n}\n/**\n * Mark `style` string as trusted.\n *\n * This function wraps the trusted string in `String` and brands it in a way which makes it\n * recognizable to {@link styleSanitizer} to be trusted implicitly.\n *\n * @param trustedStyle `style` string which needs to be implicitly trusted.\n * @returns a `style` hich has been branded to be implicitly trusted.\n */\nexport function bypassSanitizationTrustStyle(trustedStyle: string): SafeStyle {\n  return new SafeStyleImpl(trustedStyle);\n}\n/**\n * Mark `script` string as trusted.\n *\n * This function wraps the trusted string in `String` and brands it in a way which makes it\n * recognizable to {@link scriptSanitizer} to be trusted implicitly.\n *\n * @param trustedScript `script` string which needs to be implicitly trusted.\n * @returns a `script` which has been branded to be implicitly trusted.\n */\nexport function bypassSanitizationTrustScript(trustedScript: string): SafeScript {\n  return new SafeScriptImpl(trustedScript);\n}\n/**\n * Mark `url` string as trusted.\n *\n * This function wraps the trusted string in `String` and brands it in a way which makes it\n * recognizable to {@link urlSanitizer} to be trusted implicitly.\n *\n * @param trustedUrl `url` string which needs to be implicitly trusted.\n * @returns a `url`  which has been branded to be implicitly trusted.\n */\nexport function bypassSanitizationTrustUrl(trustedUrl: string): SafeUrl {\n  return new SafeUrlImpl(trustedUrl);\n}\n/**\n * Mark `url` string as trusted.\n *\n * This function wraps the trusted string in `String` and brands it in a way which makes it\n * recognizable to {@link resourceUrlSanitizer} to be trusted implicitly.\n *\n * @param trustedResourceUrl `url` string which needs to be implicitly trusted.\n * @returns a `url` which has been branded to be implicitly trusted.\n */\nexport function bypassSanitizationTrustResourceUrl(trustedResourceUrl: string): SafeResourceUrl {\n  return new SafeResourceUrlImpl(trustedResourceUrl);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {trustedHTMLFromString} from '../util/security/trusted_types';\n\n/**\n * This helper is used to get hold of an inert tree of DOM elements containing dirty HTML\n * that needs sanitizing.\n * Depending upon browser support we use one of two strategies for doing this.\n * Default: DOMParser strategy\n * Fallback: InertDocument strategy\n */\nexport function getInertBodyHelper(defaultDoc: Document): InertBodyHelper {\n  const inertDocumentHelper = new InertDocumentHelper(defaultDoc);\n  return isDOMParserAvailable() ? new DOMParserHelper(inertDocumentHelper) : inertDocumentHelper;\n}\n\nexport interface InertBodyHelper {\n  /**\n   * Get an inert DOM element containing DOM created from the dirty HTML string provided.\n   */\n  getInertBodyElement: (html: string) => HTMLElement | null;\n}\n\n/**\n * Uses DOMParser to create and fill an inert body element.\n * This is the default strategy used in browsers that support it.\n */\nclass DOMParserHelper implements InertBodyHelper {\n  constructor(private inertDocumentHelper: InertBodyHelper) {}\n\n  getInertBodyElement(html: string): HTMLElement | null {\n    // We add these extra elements to ensure that the rest of the content is parsed as expected\n    // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the\n    // `<head>` tag. Note that the `<body>` tag is closed implicitly to prevent unclosed tags\n    // in `html` from consuming the otherwise explicit `</body>` tag.\n    html = '<body><remove></remove>' + html;\n    try {\n      const body = new window.DOMParser().parseFromString(\n        trustedHTMLFromString(html) as string,\n        'text/html',\n      ).body as HTMLBodyElement;\n      if (body === null) {\n        // In some browsers (e.g. Mozilla/5.0 iPad AppleWebKit Mobile) the `body` property only\n        // becomes available in the following tick of the JS engine. In that case we fall back to\n        // the `inertDocumentHelper` instead.\n        return this.inertDocumentHelper.getInertBodyElement(html);\n      }\n      body.firstChild?.remove();\n      return body;\n    } catch {\n      return null;\n    }\n  }\n}\n\n/**\n * Use an HTML5 `template` element to create and fill an inert DOM element.\n * This is the fallback strategy if the browser does not support DOMParser.\n */\nclass InertDocumentHelper implements InertBodyHelper {\n  private inertDocument: Document;\n\n  constructor(private defaultDoc: Document) {\n    this.inertDocument = this.defaultDoc.implementation.createHTMLDocument('sanitization-inert');\n  }\n\n  getInertBodyElement(html: string): HTMLElement | null {\n    const templateEl = this.inertDocument.createElement('template');\n    templateEl.innerHTML = trustedHTMLFromString(html) as string;\n    return templateEl;\n  }\n}\n\n/**\n * We need to determine whether the DOMParser exists in the global context and\n * supports parsing HTML; HTML parsing support is not as wide as other formats, see\n * https://developer.mozilla.org/en-US/docs/Web/API/DOMParser#Browser_compatibility.\n *\n * @suppress {uselessCode}\n */\nexport function isDOMParserAvailable() {\n  try {\n    return !!new window.DOMParser().parseFromString(\n      trustedHTMLFromString('') as string,\n      'text/html',\n    );\n  } catch {\n    return false;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {XSS_SECURITY_URL} from '../error_details_base_url';\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * This regular expression matches a subset of URLs that will not cause script\n * execution if used in URL context within a HTML document. Specifically, this\n * regular expression matches if:\n * (1) Either a protocol that is not javascript:, and that has valid characters\n *     (alphanumeric or [+-.]).\n * (2) or no protocol.  A protocol must be followed by a colon. The below\n *     allows that by allowing colons only after one of the characters [/?#].\n *     A colon after a hash (#) must be in the fragment.\n *     Otherwise, a colon after a (?) must be in a query.\n *     Otherwise, a colon after a single solidus (/) must be in a path.\n *     Otherwise, a colon after a double solidus (//) must be in the authority\n *     (before port).\n *\n * The pattern disallows &, used in HTML entity declarations before\n * one of the characters in [/?#]. This disallows HTML entities used in the\n * protocol name, which should never happen, e.g. \"h&#116;tp\" for \"http\".\n * It also disallows HTML entities in the first path part of a relative path,\n * e.g. \"foo&lt;bar/baz\".  Our existing escaping functions should not produce\n * that. More importantly, it disallows masking of a colon,\n * e.g. \"javascript&#58;...\".\n *\n * This regular expression was taken from the Closure sanitization library.\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\\/?#]*(?:[\\/?#]|$))/i;\nexport function _sanitizeUrl(url: string): string {\n  url = String(url);\n  if (url.match(SAFE_URL_PATTERN)) return url;\n\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    console.warn(`WARNING: sanitizing unsafe URL value ${url} (see ${XSS_SECURITY_URL})`);\n  }\n\n  return 'unsafe:' + url;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {XSS_SECURITY_URL} from '../error_details_base_url';\nimport {TrustedHTML} from '../util/security/trusted_type_defs';\nimport {trustedHTMLFromString} from '../util/security/trusted_types';\n\nimport {getInertBodyHelper, InertBodyHelper} from './inert_body';\nimport {_sanitizeUrl} from './url_sanitizer';\n\nfunction tagSet(tags: string): {[k: string]: boolean} {\n  const res: {[k: string]: boolean} = {};\n  for (const t of tags.split(',')) res[t] = true;\n  return res;\n}\n\nfunction merge(...sets: {[k: string]: boolean}[]): {[k: string]: boolean} {\n  const res: {[k: string]: boolean} = {};\n  for (const s of sets) {\n    for (const v in s) {\n      if (s.hasOwnProperty(v)) res[v] = true;\n    }\n  }\n  return res;\n}\n\n// Good source of info about elements and attributes\n// https://html.spec.whatwg.org/#semantics\n// https://simon.html5.org/html-elements\n\n// Safe Void Elements - HTML5\n// https://html.spec.whatwg.org/#void-elements\nconst VOID_ELEMENTS = tagSet('area,br,col,hr,img,wbr');\n\n// Elements that you can, intentionally, leave open (and which close themselves)\n// https://html.spec.whatwg.org/#optional-tags\nconst OPTIONAL_END_TAG_BLOCK_ELEMENTS = tagSet('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr');\nconst OPTIONAL_END_TAG_INLINE_ELEMENTS = tagSet('rp,rt');\nconst OPTIONAL_END_TAG_ELEMENTS = merge(\n  OPTIONAL_END_TAG_INLINE_ELEMENTS,\n  OPTIONAL_END_TAG_BLOCK_ELEMENTS,\n);\n\n// Safe Block Elements - HTML5\nconst BLOCK_ELEMENTS = merge(\n  OPTIONAL_END_TAG_BLOCK_ELEMENTS,\n  tagSet(\n    'address,article,' +\n      'aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +\n      'h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul',\n  ),\n);\n\n// Inline Elements - HTML5\nconst INLINE_ELEMENTS = merge(\n  OPTIONAL_END_TAG_INLINE_ELEMENTS,\n  tagSet(\n    'a,abbr,acronym,audio,b,' +\n      'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,' +\n      'samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video',\n  ),\n);\n\nexport const VALID_ELEMENTS: {[k: string]: boolean} = merge(\n  VOID_ELEMENTS,\n  BLOCK_ELEMENTS,\n  INLINE_ELEMENTS,\n  OPTIONAL_END_TAG_ELEMENTS,\n);\n\n// Attributes that have href and hence need to be sanitized\nexport const URI_ATTRS: {[k: string]: boolean} = tagSet(\n  'background,cite,href,itemtype,longdesc,poster,src,xlink:href',\n);\n\nconst HTML_ATTRS = tagSet(\n  'abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,' +\n    'compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,' +\n    'ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,' +\n    'scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,' +\n    'valign,value,vspace,width',\n);\n\n// Accessibility attributes as per WAI-ARIA 1.1 (W3C Working Draft 14 December 2018)\nconst ARIA_ATTRS = tagSet(\n  'aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,' +\n    'aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,' +\n    'aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,' +\n    'aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,' +\n    'aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,' +\n    'aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,' +\n    'aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext',\n);\n\n// NB: This currently consciously doesn't support SVG. SVG sanitization has had several security\n// issues in the past, so it seems safer to leave it out if possible. If support for binding SVG via\n// innerHTML is required, SVG attributes should be added here.\n\n// NB: Sanitization does not allow <form> elements or other active elements (<button> etc). Those\n// can be sanitized, but they increase security surface area without a legitimate use case, so they\n// are left out here.\n\nexport const VALID_ATTRS: {[k: string]: boolean} = merge(URI_ATTRS, HTML_ATTRS, ARIA_ATTRS);\n\n// Elements whose content should not be traversed/preserved, if the elements themselves are invalid.\n//\n// Typically, `<invalid>Some content</invalid>` would traverse (and in this case preserve)\n// `Some content`, but strip `invalid-element` opening/closing tags. For some elements, though, we\n// don't want to preserve the content, if the elements themselves are going to be removed.\nconst SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS = tagSet('script,style,template');\n\n/**\n * SanitizingHtmlSerializer serializes a DOM fragment, stripping out any unsafe elements and unsafe\n * attributes.\n */\nclass SanitizingHtmlSerializer {\n  // Explicitly track if something was stripped, to avoid accidentally warning of sanitization just\n  // because characters were re-encoded.\n  public sanitizedSomething = false;\n  private buf: string[] = [];\n\n  sanitizeChildren(el: Element): string {\n    // This cannot use a TreeWalker, as it has to run on Angular's various DOM adapters.\n    // However this code never accesses properties off of `document` before deleting its contents\n    // again, so it shouldn't be vulnerable to DOM clobbering.\n    let current: Node = el.firstChild!;\n    let traverseContent = true;\n    let parentNodes = [];\n    while (current) {\n      if (current.nodeType === Node.ELEMENT_NODE) {\n        traverseContent = this.startElement(current as Element);\n      } else if (current.nodeType === Node.TEXT_NODE) {\n        this.chars(current.nodeValue!);\n      } else {\n        // Strip non-element, non-text nodes.\n        this.sanitizedSomething = true;\n      }\n      if (traverseContent && current.firstChild) {\n        // Push current node to the parent stack before entering its content.\n        parentNodes.push(current);\n        current = getFirstChild(current)!;\n        continue;\n      }\n      while (current) {\n        // Leaving the element.\n        // Walk up and to the right, closing tags as we go.\n        if (current.nodeType === Node.ELEMENT_NODE) {\n          this.endElement(current as Element);\n        }\n\n        let next = getNextSibling(current)!;\n\n        if (next) {\n          current = next;\n          break;\n        }\n\n        // There was no next sibling, walk up to the parent node (extract it from the stack).\n        current = parentNodes.pop()!;\n      }\n    }\n    return this.buf.join('');\n  }\n\n  /**\n   * Sanitizes an opening element tag (if valid) and returns whether the element's contents should\n   * be traversed. Element content must always be traversed (even if the element itself is not\n   * valid/safe), unless the element is one of `SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS`.\n   *\n   * @param element The element to sanitize.\n   * @return True if the element's contents should be traversed.\n   */\n  private startElement(element: Element): boolean {\n    const tagName = getNodeName(element).toLowerCase();\n    if (!VALID_ELEMENTS.hasOwnProperty(tagName)) {\n      this.sanitizedSomething = true;\n      return !SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS.hasOwnProperty(tagName);\n    }\n    this.buf.push('<');\n    this.buf.push(tagName);\n    const elAttrs = element.attributes;\n    for (let i = 0; i < elAttrs.length; i++) {\n      const elAttr = elAttrs.item(i);\n      const attrName = elAttr!.name;\n      const lower = attrName.toLowerCase();\n      if (!VALID_ATTRS.hasOwnProperty(lower)) {\n        this.sanitizedSomething = true;\n        continue;\n      }\n      let value = elAttr!.value;\n      // TODO(martinprobst): Special case image URIs for data:image/...\n      if (URI_ATTRS[lower]) value = _sanitizeUrl(value);\n      this.buf.push(' ', attrName, '=\"', encodeEntities(value), '\"');\n    }\n    this.buf.push('>');\n    return true;\n  }\n\n  private endElement(current: Element) {\n    const tagName = getNodeName(current).toLowerCase();\n    if (VALID_ELEMENTS.hasOwnProperty(tagName) && !VOID_ELEMENTS.hasOwnProperty(tagName)) {\n      this.buf.push('</');\n      this.buf.push(tagName);\n      this.buf.push('>');\n    }\n  }\n\n  private chars(chars: string) {\n    this.buf.push(encodeEntities(chars));\n  }\n}\n\n/**\n * Verifies whether a given child node is a descendant of a given parent node.\n * It may not be the case when properties like `.firstChild` are clobbered and\n * accessing `.firstChild` results in an unexpected node returned.\n */\nfunction isClobberedElement(parentNode: Node, childNode: Node): boolean {\n  return (\n    (parentNode.compareDocumentPosition(childNode) & Node.DOCUMENT_POSITION_CONTAINED_BY) !==\n    Node.DOCUMENT_POSITION_CONTAINED_BY\n  );\n}\n\n/**\n * Retrieves next sibling node and makes sure that there is no\n * clobbering of the `nextSibling` property happening.\n */\nfunction getNextSibling(node: Node): Node | null {\n  const nextSibling = node.nextSibling;\n  // Make sure there is no `nextSibling` clobbering: navigating to\n  // the next sibling and going back to the previous one should result\n  // in the original node.\n  if (nextSibling && node !== nextSibling.previousSibling) {\n    throw clobberedElementError(nextSibling);\n  }\n  return nextSibling;\n}\n\n/**\n * Retrieves first child node and makes sure that there is no\n * clobbering of the `firstChild` property happening.\n */\nfunction getFirstChild(node: Node): Node | null {\n  const firstChild = node.firstChild;\n  if (firstChild && isClobberedElement(node, firstChild)) {\n    throw clobberedElementError(firstChild);\n  }\n  return firstChild;\n}\n\n/** Gets a reasonable nodeName, even for clobbered nodes. */\nexport function getNodeName(node: Node): string {\n  const nodeName = node.nodeName;\n  // If the property is clobbered, assume it is an `HTMLFormElement`.\n  return typeof nodeName === 'string' ? nodeName : 'FORM';\n}\n\nfunction clobberedElementError(node: Node) {\n  return new Error(\n    `Failed to sanitize html because the element is clobbered: ${(node as Element).outerHTML}`,\n  );\n}\n\n// Regular Expressions for parsing tags and attributes\nconst SURROGATE_PAIR_REGEXP = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n// ! to ~ is the ASCII range.\nconst NON_ALPHANUMERIC_REGEXP = /([^\\#-~ |!])/g;\n\n/**\n * Escapes all potentially dangerous characters, so that the\n * resulting string can be safely inserted into attribute or\n * element text.\n * @param value\n */\nfunction encodeEntities(value: string) {\n  return value\n    .replace(/&/g, '&amp;')\n    .replace(SURROGATE_PAIR_REGEXP, function (match: string) {\n      const hi = match.charCodeAt(0);\n      const low = match.charCodeAt(1);\n      return '&#' + ((hi - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000) + ';';\n    })\n    .replace(NON_ALPHANUMERIC_REGEXP, function (match: string) {\n      return '&#' + match.charCodeAt(0) + ';';\n    })\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\nlet inertBodyHelper: InertBodyHelper;\n\n/**\n * Sanitizes the given unsafe, untrusted HTML fragment, and returns HTML text that is safe to add to\n * the DOM in a browser environment.\n */\nexport function _sanitizeHtml(defaultDoc: any, unsafeHtmlInput: string): TrustedHTML | string {\n  let inertBodyElement: HTMLElement | null = null;\n  try {\n    inertBodyHelper = inertBodyHelper || getInertBodyHelper(defaultDoc);\n    // Make sure unsafeHtml is actually a string (TypeScript types are not enforced at runtime).\n    let unsafeHtml = unsafeHtmlInput ? String(unsafeHtmlInput) : '';\n    inertBodyElement = inertBodyHelper.getInertBodyElement(unsafeHtml);\n\n    // mXSS protection. Repeatedly parse the document to make sure it stabilizes, so that a browser\n    // trying to auto-correct incorrect HTML cannot cause formerly inert HTML to become dangerous.\n    let mXSSAttempts = 5;\n    let parsedHtml = unsafeHtml;\n\n    do {\n      if (mXSSAttempts === 0) {\n        throw new Error('Failed to sanitize html because the input is unstable');\n      }\n      mXSSAttempts--;\n\n      unsafeHtml = parsedHtml;\n      parsedHtml = inertBodyElement!.innerHTML;\n      inertBodyElement = inertBodyHelper.getInertBodyElement(unsafeHtml);\n    } while (unsafeHtml !== parsedHtml);\n\n    const sanitizer = new SanitizingHtmlSerializer();\n    const safeHtml = sanitizer.sanitizeChildren(\n      (getTemplateContent(inertBodyElement!) as Element) || inertBodyElement,\n    );\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && sanitizer.sanitizedSomething) {\n      console.warn(`WARNING: sanitizing HTML stripped some content, see ${XSS_SECURITY_URL}`);\n    }\n\n    return trustedHTMLFromString(safeHtml);\n  } finally {\n    // In case anything goes wrong, clear out inertElement to reset the entire DOM structure.\n    if (inertBodyElement) {\n      const parent = getTemplateContent(inertBodyElement) || inertBodyElement;\n      while (parent.firstChild) {\n        parent.firstChild.remove();\n      }\n    }\n  }\n}\n\nexport function getTemplateContent(el: Node): Node | null {\n  return 'content' in (el as any) /** Microsoft/TypeScript#21517 */ && isTemplateElement(el)\n    ? el.content\n    : null;\n}\nfunction isTemplateElement(el: Node): el is HTMLTemplateElement {\n  return el.nodeType === Node.ELEMENT_NODE && el.nodeName === 'TEMPLATE';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * A SecurityContext marks a location that has dangerous security implications, e.g. a DOM property\n * like `innerHTML` that could cause Cross Site Scripting (XSS) security bugs when improperly\n * handled.\n *\n * See DomSanitizer for more details on security in Angular applications.\n *\n * @publicApi\n */\nexport enum SecurityContext {\n  NONE = 0,\n  HTML = 1,\n  STYLE = 2,\n  SCRIPT = 3,\n  URL = 4,\n  RESOURCE_URL = 5,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {XSS_SECURITY_URL} from '../error_details_base_url';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {getDocument} from '../render3/interfaces/document';\nimport {ENVIRONMENT} from '../render3/interfaces/view';\nimport {getLView} from '../render3/state';\nimport {renderStringify} from '../render3/util/stringify_utils';\nimport {TrustedHTML, TrustedScript, TrustedScriptURL} from '../util/security/trusted_type_defs';\nimport {trustedHTMLFromString, trustedScriptURLFromString} from '../util/security/trusted_types';\nimport {\n  trustedHTMLFromStringBypass,\n  trustedScriptFromStringBypass,\n  trustedScriptURLFromStringBypass,\n} from '../util/security/trusted_types_bypass';\n\nimport {allowSanitizationBypassAndThrow, BypassType, unwrapSafeValue} from './bypass';\nimport {_sanitizeHtml as _sanitizeHtml} from './html_sanitizer';\nimport {Sanitizer} from './sanitizer';\nimport {SecurityContext} from './security';\nimport {_sanitizeUrl as _sanitizeUrl} from './url_sanitizer';\n\n/**\n * An `html` sanitizer which converts untrusted `html` **string** into trusted string by removing\n * dangerous content.\n *\n * This method parses the `html` and locates potentially dangerous content (such as urls and\n * javascript) and removes it.\n *\n * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustHtml}.\n *\n * @param unsafeHtml untrusted `html`, typically from the user.\n * @returns `html` string which is safe to display to user, because all of the dangerous javascript\n * and urls have been removed.\n *\n * @codeGenApi\n */\nexport function ɵɵsanitizeHtml(unsafeHtml: any): TrustedHTML | string {\n  const sanitizer = getSanitizer();\n  if (sanitizer) {\n    return trustedHTMLFromStringBypass(sanitizer.sanitize(SecurityContext.HTML, unsafeHtml) || '');\n  }\n  if (allowSanitizationBypassAndThrow(unsafeHtml, BypassType.Html)) {\n    return trustedHTMLFromStringBypass(unwrapSafeValue(unsafeHtml));\n  }\n  return _sanitizeHtml(getDocument(), renderStringify(unsafeHtml));\n}\n\n/**\n * A `style` sanitizer which converts untrusted `style` **string** into trusted string by removing\n * dangerous content.\n *\n * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustStyle}.\n *\n * @param unsafeStyle untrusted `style`, typically from the user.\n * @returns `style` string which is safe to bind to the `style` properties.\n *\n * @codeGenApi\n */\nexport function ɵɵsanitizeStyle(unsafeStyle: any): string {\n  const sanitizer = getSanitizer();\n  if (sanitizer) {\n    return sanitizer.sanitize(SecurityContext.STYLE, unsafeStyle) || '';\n  }\n  if (allowSanitizationBypassAndThrow(unsafeStyle, BypassType.Style)) {\n    return unwrapSafeValue(unsafeStyle);\n  }\n  return renderStringify(unsafeStyle);\n}\n\n/**\n * A `url` sanitizer which converts untrusted `url` **string** into trusted string by removing\n * dangerous\n * content.\n *\n * This method parses the `url` and locates potentially dangerous content (such as javascript) and\n * removes it.\n *\n * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustUrl}.\n *\n * @param unsafeUrl untrusted `url`, typically from the user.\n * @returns `url` string which is safe to bind to the `src` properties such as `<img src>`, because\n * all of the dangerous javascript has been removed.\n *\n * @codeGenApi\n */\nexport function ɵɵsanitizeUrl(unsafeUrl: any): string {\n  const sanitizer = getSanitizer();\n  if (sanitizer) {\n    return sanitizer.sanitize(SecurityContext.URL, unsafeUrl) || '';\n  }\n  if (allowSanitizationBypassAndThrow(unsafeUrl, BypassType.Url)) {\n    return unwrapSafeValue(unsafeUrl);\n  }\n  return _sanitizeUrl(renderStringify(unsafeUrl));\n}\n\n/**\n * A `url` sanitizer which only lets trusted `url`s through.\n *\n * This passes only `url`s marked trusted by calling {@link bypassSanitizationTrustResourceUrl}.\n *\n * @param unsafeResourceUrl untrusted `url`, typically from the user.\n * @returns `url` string which is safe to bind to the `src` properties such as `<img src>`, because\n * only trusted `url`s have been allowed to pass.\n *\n * @codeGenApi\n */\nexport function ɵɵsanitizeResourceUrl(unsafeResourceUrl: any): TrustedScriptURL | string {\n  const sanitizer = getSanitizer();\n  if (sanitizer) {\n    return trustedScriptURLFromStringBypass(\n      sanitizer.sanitize(SecurityContext.RESOURCE_URL, unsafeResourceUrl) || '',\n    );\n  }\n  if (allowSanitizationBypassAndThrow(unsafeResourceUrl, BypassType.ResourceUrl)) {\n    return trustedScriptURLFromStringBypass(unwrapSafeValue(unsafeResourceUrl));\n  }\n  throw new RuntimeError(\n    RuntimeErrorCode.UNSAFE_VALUE_IN_RESOURCE_URL,\n    ngDevMode && `unsafe value used in a resource URL context (see ${XSS_SECURITY_URL})`,\n  );\n}\n\n/**\n * A `script` sanitizer which only lets trusted javascript through.\n *\n * This passes only `script`s marked trusted by calling {@link\n * bypassSanitizationTrustScript}.\n *\n * @param unsafeScript untrusted `script`, typically from the user.\n * @returns `url` string which is safe to bind to the `<script>` element such as `<img src>`,\n * because only trusted `scripts` have been allowed to pass.\n *\n * @codeGenApi\n */\nexport function ɵɵsanitizeScript(unsafeScript: any): TrustedScript | string {\n  const sanitizer = getSanitizer();\n  if (sanitizer) {\n    return trustedScriptFromStringBypass(\n      sanitizer.sanitize(SecurityContext.SCRIPT, unsafeScript) || '',\n    );\n  }\n  if (allowSanitizationBypassAndThrow(unsafeScript, BypassType.Script)) {\n    return trustedScriptFromStringBypass(unwrapSafeValue(unsafeScript));\n  }\n  throw new RuntimeError(\n    RuntimeErrorCode.UNSAFE_VALUE_IN_SCRIPT,\n    ngDevMode && 'unsafe value used in a script context',\n  );\n}\n\n/**\n * A template tag function for promoting the associated constant literal to a\n * TrustedHTML. Interpolation is explicitly not allowed.\n *\n * @param html constant template literal containing trusted HTML.\n * @returns TrustedHTML wrapping `html`.\n *\n * @security This is a security-sensitive function and should only be used to\n * convert constant values of attributes and properties found in\n * application-provided Angular templates to TrustedHTML.\n *\n * @codeGenApi\n */\nexport function ɵɵtrustConstantHtml(html: TemplateStringsArray): TrustedHTML | string {\n  // The following runtime check ensures that the function was called as a\n  // template tag (e.g. ɵɵtrustConstantHtml`content`), without any interpolation\n  // (e.g. not ɵɵtrustConstantHtml`content ${variable}`). A TemplateStringsArray\n  // is an array with a `raw` property that is also an array. The associated\n  // template literal has no interpolation if and only if the length of the\n  // TemplateStringsArray is 1.\n  if (ngDevMode && (!Array.isArray(html) || !Array.isArray(html.raw) || html.length !== 1)) {\n    throw new Error(`Unexpected interpolation in trusted HTML constant: ${html.join('?')}`);\n  }\n  return trustedHTMLFromString(html[0]);\n}\n\n/**\n * A template tag function for promoting the associated constant literal to a\n * TrustedScriptURL. Interpolation is explicitly not allowed.\n *\n * @param url constant template literal containing a trusted script URL.\n * @returns TrustedScriptURL wrapping `url`.\n *\n * @security This is a security-sensitive function and should only be used to\n * convert constant values of attributes and properties found in\n * application-provided Angular templates to TrustedScriptURL.\n *\n * @codeGenApi\n */\nexport function ɵɵtrustConstantResourceUrl(url: TemplateStringsArray): TrustedScriptURL | string {\n  // The following runtime check ensures that the function was called as a\n  // template tag (e.g. ɵɵtrustConstantResourceUrl`content`), without any\n  // interpolation (e.g. not ɵɵtrustConstantResourceUrl`content ${variable}`). A\n  // TemplateStringsArray is an array with a `raw` property that is also an\n  // array. The associated template literal has no interpolation if and only if\n  // the length of the TemplateStringsArray is 1.\n  if (ngDevMode && (!Array.isArray(url) || !Array.isArray(url.raw) || url.length !== 1)) {\n    throw new Error(`Unexpected interpolation in trusted URL constant: ${url.join('?')}`);\n  }\n  return trustedScriptURLFromString(url[0]);\n}\n\n/**\n * Detects which sanitizer to use for URL property, based on tag name and prop name.\n *\n * The rules are based on the RESOURCE_URL context config from\n * `packages/compiler/src/schema/dom_security_schema.ts`.\n * If tag and prop names don't match Resource URL schema, use URL sanitizer.\n */\nexport function getUrlSanitizer(tag: string, prop: string) {\n  if (\n    (prop === 'src' &&\n      (tag === 'embed' ||\n        tag === 'frame' ||\n        tag === 'iframe' ||\n        tag === 'media' ||\n        tag === 'script')) ||\n    (prop === 'href' && (tag === 'base' || tag === 'link'))\n  ) {\n    return ɵɵsanitizeResourceUrl;\n  }\n  return ɵɵsanitizeUrl;\n}\n\n/**\n * Sanitizes URL, selecting sanitizer function based on tag and property names.\n *\n * This function is used in case we can't define security context at compile time, when only prop\n * name is available. This happens when we generate host bindings for Directives/Components. The\n * host element is unknown at compile time, so we defer calculation of specific sanitizer to\n * runtime.\n *\n * @param unsafeUrl untrusted `url`, typically from the user.\n * @param tag target element tag name.\n * @param prop name of the property that contains the value.\n * @returns `url` string which is safe to bind.\n *\n * @codeGenApi\n */\nexport function ɵɵsanitizeUrlOrResourceUrl(unsafeUrl: any, tag: string, prop: string): any {\n  return getUrlSanitizer(tag, prop)(unsafeUrl);\n}\n\nexport function validateAgainstEventProperties(name: string) {\n  if (name.toLowerCase().startsWith('on')) {\n    const errorMessage =\n      `Binding to event property '${name}' is disallowed for security reasons, ` +\n      `please use (${name.slice(2)})=...` +\n      `\\nIf '${name}' is a directive input, make sure the directive is imported by the` +\n      ` current module.`;\n    throw new RuntimeError(RuntimeErrorCode.INVALID_EVENT_BINDING, errorMessage);\n  }\n}\n\nexport function validateAgainstEventAttributes(name: string) {\n  if (name.toLowerCase().startsWith('on')) {\n    const errorMessage =\n      `Binding to event attribute '${name}' is disallowed for security reasons, ` +\n      `please use (${name.slice(2)})=...`;\n    throw new RuntimeError(RuntimeErrorCode.INVALID_EVENT_BINDING, errorMessage);\n  }\n}\n\nfunction getSanitizer(): Sanitizer | null {\n  const lView = getLView();\n  return lView && lView[ENVIRONMENT].sanitizer;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Disallowed strings in the comment.\n *\n * see: https://html.spec.whatwg.org/multipage/syntax.html#comments\n */\nconst COMMENT_DISALLOWED = /^>|^->|<!--|-->|--!>|<!-$/g;\n/**\n * Delimiter in the disallowed strings which needs to be wrapped with zero with character.\n */\nconst COMMENT_DELIMITER = /(<|>)/g;\nconst COMMENT_DELIMITER_ESCAPED = '\\u200B$1\\u200B';\n\n/**\n * Escape the content of comment strings so that it can be safely inserted into a comment node.\n *\n * The issue is that HTML does not specify any way to escape comment end text inside the comment.\n * Consider: `<!-- The way you close a comment is with \">\", and \"->\" at the beginning or by \"-->\" or\n * \"--!>\" at the end. -->`. Above the `\"-->\"` is meant to be text not an end to the comment. This\n * can be created programmatically through DOM APIs. (`<!--` are also disallowed.)\n *\n * see: https://html.spec.whatwg.org/multipage/syntax.html#comments\n *\n * ```ts\n * div.innerHTML = div.innerHTML\n * ```\n *\n * One would expect that the above code would be safe to do, but it turns out that because comment\n * text is not escaped, the comment may contain text which will prematurely close the comment\n * opening up the application for XSS attack. (In SSR we programmatically create comment nodes which\n * may contain such text and expect them to be safe.)\n *\n * This function escapes the comment text by looking for comment delimiters (`<` and `>`) and\n * surrounding them with `_>_` where the `_` is a zero width space `\\u200B`. The result is that if a\n * comment contains any of the comment start/end delimiters (such as `<!--`, `-->` or `--!>`) the\n * text it will render normally but it will not cause the HTML parser to close/open the comment.\n *\n * @param value text to make safe for comment node by escaping the comment open/close character\n *     sequence.\n */\nexport function escapeCommentText(value: string): string {\n  return value.replace(COMMENT_DISALLOWED, (text) =>\n    text.replace(COMMENT_DELIMITER, COMMENT_DELIMITER_ESCAPED),\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport function normalizeDebugBindingName(name: string) {\n  // Attribute names with `$` (eg `x-y$`) are valid per spec, but unsupported by some browsers\n  name = camelCaseToDashCase(name.replace(/[$@]/g, '_'));\n  return `ng-reflect-${name}`;\n}\n\nconst CAMEL_CASE_REGEXP = /([A-Z])/g;\n\nfunction camelCaseToDashCase(input: string): string {\n  return input.replace(CAMEL_CASE_REGEXP, (...m: any[]) => '-' + m[1].toLowerCase());\n}\n\nexport function normalizeDebugBindingValue(value: any): string {\n  try {\n    // Limit the size of the value as otherwise the DOM just gets polluted.\n    return value != null ? value.toString().slice(0, 30) : value;\n  } catch (e) {\n    return '[ERROR] Exception while trying to serialize the value';\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * A schema definition associated with a component or an NgModule.\n *\n * @see {@link NgModule}\n * @see {@link CUSTOM_ELEMENTS_SCHEMA}\n * @see {@link NO_ERRORS_SCHEMA}\n *\n * @param name The name of a defined schema.\n *\n * @publicApi\n */\nexport interface SchemaMetadata {\n  name: string;\n}\n\n/**\n * Defines a schema that allows an NgModule to contain the following:\n * - Non-Angular elements named with dash case (`-`).\n * - Element properties named with dash case (`-`).\n * Dash case is the naming convention for custom elements.\n *\n * @publicApi\n */\nexport const CUSTOM_ELEMENTS_SCHEMA: SchemaMetadata = {\n  name: 'custom-elements',\n};\n\n/**\n * Defines a schema that allows any property on any element.\n *\n * This schema allows you to ignore the errors related to any unknown elements or properties in a\n * template. The usage of this schema is generally discouraged because it prevents useful validation\n * and may hide real errors in your template. Consider using the `CUSTOM_ELEMENTS_SCHEMA` instead.\n *\n * @publicApi\n */\nexport const NO_ERRORS_SCHEMA: SchemaMetadata = {\n  name: 'no-errors-schema',\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {formatRuntimeError, RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {Type} from '../../interface/type';\nimport {CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, SchemaMetadata} from '../../metadata/schema';\nimport {throwError} from '../../util/assert';\nimport {getComponentDef} from '../def_getters';\nimport {ComponentDef} from '../interfaces/definition';\nimport {TNodeType} from '../interfaces/node';\nimport {RComment, RElement} from '../interfaces/renderer_dom';\nimport {CONTEXT, DECLARATION_COMPONENT_VIEW, LView} from '../interfaces/view';\nimport {isAnimationProp} from '../util/attrs_utils';\n\nlet shouldThrowErrorOnUnknownElement = false;\n\n/**\n * Sets a strict mode for JIT-compiled components to throw an error on unknown elements,\n * instead of just logging the error.\n * (for AOT-compiled ones this check happens at build time).\n */\nexport function ɵsetUnknownElementStrictMode(shouldThrow: boolean) {\n  shouldThrowErrorOnUnknownElement = shouldThrow;\n}\n\n/**\n * Gets the current value of the strict mode.\n */\nexport function ɵgetUnknownElementStrictMode() {\n  return shouldThrowErrorOnUnknownElement;\n}\n\nlet shouldThrowErrorOnUnknownProperty = false;\n\n/**\n * Sets a strict mode for JIT-compiled components to throw an error on unknown properties,\n * instead of just logging the error.\n * (for AOT-compiled ones this check happens at build time).\n */\nexport function ɵsetUnknownPropertyStrictMode(shouldThrow: boolean) {\n  shouldThrowErrorOnUnknownProperty = shouldThrow;\n}\n\n/**\n * Gets the current value of the strict mode.\n */\nexport function ɵgetUnknownPropertyStrictMode() {\n  return shouldThrowErrorOnUnknownProperty;\n}\n\n/**\n * Validates that the element is known at runtime and produces\n * an error if it's not the case.\n * This check is relevant for JIT-compiled components (for AOT-compiled\n * ones this check happens at build time).\n *\n * The element is considered known if either:\n * - it's a known HTML element\n * - it's a known custom element\n * - the element matches any directive\n * - the element is allowed by one of the schemas\n *\n * @param element Element to validate\n * @param lView An `LView` that represents a current component that is being rendered\n * @param tagName Name of the tag to check\n * @param schemas Array of schemas\n * @param hasDirectives Boolean indicating that the element matches any directive\n */\nexport function validateElementIsKnown(\n  element: RElement,\n  lView: LView,\n  tagName: string | null,\n  schemas: SchemaMetadata[] | null,\n  hasDirectives: boolean,\n): void {\n  // If `schemas` is set to `null`, that's an indication that this Component was compiled in AOT\n  // mode where this check happens at compile time. In JIT mode, `schemas` is always present and\n  // defined as an array (as an empty array in case `schemas` field is not defined) and we should\n  // execute the check below.\n  if (schemas === null) return;\n\n  // If the element matches any directive, it's considered as valid.\n  if (!hasDirectives && tagName !== null) {\n    // The element is unknown if it's an instance of HTMLUnknownElement, or it isn't registered\n    // as a custom element. Note that unknown elements with a dash in their name won't be instances\n    // of HTMLUnknownElement in browsers that support web components.\n    const isUnknown =\n      // Note that we can't check for `typeof HTMLUnknownElement === 'function'` because\n      // Domino doesn't expose HTMLUnknownElement globally.\n      (typeof HTMLUnknownElement !== 'undefined' &&\n        HTMLUnknownElement &&\n        element instanceof HTMLUnknownElement) ||\n      (typeof customElements !== 'undefined' &&\n        tagName.indexOf('-') > -1 &&\n        !customElements.get(tagName));\n\n    if (isUnknown && !matchingSchemas(schemas, tagName)) {\n      const isHostStandalone = isHostComponentStandalone(lView);\n      const templateLocation = getTemplateLocationDetails(lView);\n      const schemas = `'${isHostStandalone ? '@Component' : '@NgModule'}.schemas'`;\n\n      let message = `'${tagName}' is not a known element${templateLocation}:\\n`;\n      message += `1. If '${tagName}' is an Angular component, then verify that it is ${\n        isHostStandalone\n          ? \"included in the '@Component.imports' of this component\"\n          : 'a part of an @NgModule where this component is declared'\n      }.\\n`;\n      if (tagName && tagName.indexOf('-') > -1) {\n        message += `2. If '${tagName}' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the ${schemas} of this component to suppress this message.`;\n      } else {\n        message += `2. To allow any element add 'NO_ERRORS_SCHEMA' to the ${schemas} of this component.`;\n      }\n      if (shouldThrowErrorOnUnknownElement) {\n        throw new RuntimeError(RuntimeErrorCode.UNKNOWN_ELEMENT, message);\n      } else {\n        console.error(formatRuntimeError(RuntimeErrorCode.UNKNOWN_ELEMENT, message));\n      }\n    }\n  }\n}\n\n/**\n * Validates that the property of the element is known at runtime and returns\n * false if it's not the case.\n * This check is relevant for JIT-compiled components (for AOT-compiled\n * ones this check happens at build time).\n *\n * The property is considered known if either:\n * - it's a known property of the element\n * - the element is allowed by one of the schemas\n * - the property is used for animations\n *\n * @param element Element to validate\n * @param propName Name of the property to check\n * @param tagName Name of the tag hosting the property\n * @param schemas Array of schemas\n */\nexport function isPropertyValid(\n  element: RElement | RComment,\n  propName: string,\n  tagName: string | null,\n  schemas: SchemaMetadata[] | null,\n): boolean {\n  // If `schemas` is set to `null`, that's an indication that this Component was compiled in AOT\n  // mode where this check happens at compile time. In JIT mode, `schemas` is always present and\n  // defined as an array (as an empty array in case `schemas` field is not defined) and we should\n  // execute the check below.\n  if (schemas === null) return true;\n\n  // The property is considered valid if the element matches the schema, it exists on the element,\n  // or it is synthetic.\n  if (matchingSchemas(schemas, tagName) || propName in element || isAnimationProp(propName)) {\n    return true;\n  }\n\n  // Note: `typeof Node` returns 'function' in most browsers, but is undefined with domino.\n  return typeof Node === 'undefined' || Node === null || !(element instanceof Node);\n}\n\n/**\n * Logs or throws an error that a property is not supported on an element.\n *\n * @param propName Name of the invalid property\n * @param tagName Name of the tag hosting the property\n * @param nodeType Type of the node hosting the property\n * @param lView An `LView` that represents a current component\n */\nexport function handleUnknownPropertyError(\n  propName: string,\n  tagName: string | null,\n  nodeType: TNodeType,\n  lView: LView,\n): void {\n  // Special-case a situation when a structural directive is applied to\n  // an `<ng-template>` element, for example: `<ng-template *ngIf=\"true\">`.\n  // In this case the compiler generates the `ɵɵtemplate` instruction with\n  // the `null` as the tagName. The directive matching logic at runtime relies\n  // on this effect (see `isInlineTemplate`), thus using the 'ng-template' as\n  // a default value of the `tNode.value` is not feasible at this moment.\n  if (!tagName && nodeType === TNodeType.Container) {\n    tagName = 'ng-template';\n  }\n\n  const isHostStandalone = isHostComponentStandalone(lView);\n  const templateLocation = getTemplateLocationDetails(lView);\n\n  let message = `Can't bind to '${propName}' since it isn't a known property of '${tagName}'${templateLocation}.`;\n\n  const schemas = `'${isHostStandalone ? '@Component' : '@NgModule'}.schemas'`;\n  const importLocation = isHostStandalone\n    ? \"included in the '@Component.imports' of this component\"\n    : 'a part of an @NgModule where this component is declared';\n  if (KNOWN_CONTROL_FLOW_DIRECTIVES.has(propName)) {\n    // Most likely this is a control flow directive (such as `*ngIf`) used in\n    // a template, but the directive or the `CommonModule` is not imported.\n    const correspondingImport = KNOWN_CONTROL_FLOW_DIRECTIVES.get(propName);\n    message +=\n      `\\nIf the '${propName}' is an Angular control flow directive, ` +\n      `please make sure that either the '${correspondingImport}' directive or the 'CommonModule' is ${importLocation}.`;\n  } else {\n    // May be an Angular component, which is not imported/declared?\n    message +=\n      `\\n1. If '${tagName}' is an Angular component and it has the ` +\n      `'${propName}' input, then verify that it is ${importLocation}.`;\n    // May be a Web Component?\n    if (tagName && tagName.indexOf('-') > -1) {\n      message +=\n        `\\n2. If '${tagName}' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' ` +\n        `to the ${schemas} of this component to suppress this message.`;\n      message +=\n        `\\n3. To allow any property add 'NO_ERRORS_SCHEMA' to ` +\n        `the ${schemas} of this component.`;\n    } else {\n      // If it's expected, the error can be suppressed by the `NO_ERRORS_SCHEMA` schema.\n      message +=\n        `\\n2. To allow any property add 'NO_ERRORS_SCHEMA' to ` +\n        `the ${schemas} of this component.`;\n    }\n  }\n\n  reportUnknownPropertyError(message);\n}\n\nexport function reportUnknownPropertyError(message: string) {\n  if (shouldThrowErrorOnUnknownProperty) {\n    throw new RuntimeError(RuntimeErrorCode.UNKNOWN_BINDING, message);\n  } else {\n    console.error(formatRuntimeError(RuntimeErrorCode.UNKNOWN_BINDING, message));\n  }\n}\n\n/**\n * WARNING: this is a **dev-mode only** function (thus should always be guarded by the `ngDevMode`)\n * and must **not** be used in production bundles. The function makes megamorphic reads, which might\n * be too slow for production mode and also it relies on the constructor function being available.\n *\n * Gets a reference to the host component def (where a current component is declared).\n *\n * @param lView An `LView` that represents a current component that is being rendered.\n */\nexport function getDeclarationComponentDef(lView: LView): ComponentDef<unknown> | null {\n  !ngDevMode && throwError('Must never be called in production mode');\n\n  const declarationLView = lView[DECLARATION_COMPONENT_VIEW] as LView<Type<unknown>>;\n  const context = declarationLView[CONTEXT];\n\n  // Unable to obtain a context.\n  if (!context) return null;\n\n  return context.constructor ? getComponentDef(context.constructor) : null;\n}\n\n/**\n * WARNING: this is a **dev-mode only** function (thus should always be guarded by the `ngDevMode`)\n * and must **not** be used in production bundles. The function makes megamorphic reads, which might\n * be too slow for production mode.\n *\n * Checks if the current component is declared inside of a standalone component template.\n *\n * @param lView An `LView` that represents a current component that is being rendered.\n */\nexport function isHostComponentStandalone(lView: LView): boolean {\n  !ngDevMode && throwError('Must never be called in production mode');\n\n  const componentDef = getDeclarationComponentDef(lView);\n  // Treat host component as non-standalone if we can't obtain the def.\n  return !!componentDef?.standalone;\n}\n\n/**\n * WARNING: this is a **dev-mode only** function (thus should always be guarded by the `ngDevMode`)\n * and must **not** be used in production bundles. The function makes megamorphic reads, which might\n * be too slow for production mode.\n *\n * Constructs a string describing the location of the host component template. The function is used\n * in dev mode to produce error messages.\n *\n * @param lView An `LView` that represents a current component that is being rendered.\n */\nexport function getTemplateLocationDetails(lView: LView): string {\n  !ngDevMode && throwError('Must never be called in production mode');\n\n  const hostComponentDef = getDeclarationComponentDef(lView);\n  const componentClassName = hostComponentDef?.type?.name;\n  return componentClassName ? ` (used in the '${componentClassName}' component template)` : '';\n}\n\n/**\n * The set of known control flow directives and their corresponding imports.\n * We use this set to produce a more precises error message with a note\n * that the `CommonModule` should also be included.\n */\nexport const KNOWN_CONTROL_FLOW_DIRECTIVES = new Map([\n  ['ngIf', 'NgIf'],\n  ['ngFor', 'NgFor'],\n  ['ngSwitchCase', 'NgSwitchCase'],\n  ['ngSwitchDefault', 'NgSwitchDefault'],\n]);\n/**\n * Returns true if the tag name is allowed by specified schemas.\n * @param schemas Array of schemas\n * @param tagName Name of the tag\n */\nexport function matchingSchemas(schemas: SchemaMetadata[] | null, tagName: string | null): boolean {\n  if (schemas !== null) {\n    for (let i = 0; i < schemas.length; i++) {\n      const schema = schemas[i];\n      if (\n        schema === NO_ERRORS_SCHEMA ||\n        (schema === CUSTOM_ELEMENTS_SCHEMA && tagName && tagName.indexOf('-') > -1)\n      ) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RElement} from '../interfaces/renderer_dom';\n\n/**\n *\n * @codeGenApi\n */\nexport function ɵɵresolveWindow(element: RElement & {ownerDocument: Document}) {\n  return element.ownerDocument.defaultView;\n}\n\n/**\n *\n * @codeGenApi\n */\nexport function ɵɵresolveDocument(element: RElement & {ownerDocument: Document}) {\n  return element.ownerDocument;\n}\n\n/**\n *\n * @codeGenApi\n */\nexport function ɵɵresolveBody(element: RElement & {ownerDocument: Document}) {\n  return element.ownerDocument.body;\n}\n\n/**\n * The special delimiter we use to separate property names, prefixes, and suffixes\n * in property binding metadata. See storeBindingMetadata().\n *\n * We intentionally use the Unicode \"REPLACEMENT CHARACTER\" (U+FFFD) as a delimiter\n * because it is a very uncommon character that is unlikely to be part of a user's\n * property names or interpolation strings. If it is in fact used in a property\n * binding, DebugElement.properties will not return the correct value for that\n * binding. However, there should be no runtime effect for real applications.\n *\n * This character is typically rendered as a question mark inside of a diamond.\n * See https://en.wikipedia.org/wiki/Specials_(Unicode_block)\n *\n */\nexport const INTERPOLATION_DELIMITER = `�`;\n\n/**\n * Unwrap a value which might be behind a closure (for forward declaration reasons).\n */\nexport function maybeUnwrapFn<T>(value: T | (() => T)): T {\n  if (value instanceof Function) {\n    return value();\n  } else {\n    return value;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type} from '../interface/type';\n\nimport {getComponentDef} from './def_getters';\nimport {getDeclarationComponentDef} from './instructions/element_validation';\nimport {TNode} from './interfaces/node';\nimport {LView, TVIEW} from './interfaces/view';\nimport {INTERPOLATION_DELIMITER} from './util/misc_utils';\nimport {stringifyForError} from './util/stringify_utils';\n\n/**\n * The max length of the string representation of a value in an error message\n */\nconst VALUE_STRING_LENGTH_LIMIT = 200;\n\n/** Verifies that a given type is a Standalone Component. */\nexport function assertStandaloneComponentType(type: Type<unknown>) {\n  assertComponentDef(type);\n  const componentDef = getComponentDef(type)!;\n  if (!componentDef.standalone) {\n    throw new RuntimeError(\n      RuntimeErrorCode.TYPE_IS_NOT_STANDALONE,\n      `The ${stringifyForError(type)} component is not marked as standalone, ` +\n        `but Angular expects to have a standalone component here. ` +\n        `Please make sure the ${stringifyForError(type)} component has ` +\n        `the \\`standalone: true\\` flag in the decorator.`,\n    );\n  }\n}\n\n/** Verifies whether a given type is a component */\nexport function assertComponentDef(type: Type<unknown>) {\n  if (!getComponentDef(type)) {\n    throw new RuntimeError(\n      RuntimeErrorCode.MISSING_GENERATED_DEF,\n      `The ${stringifyForError(type)} is not an Angular component, ` +\n        `make sure it has the \\`@Component\\` decorator.`,\n    );\n  }\n}\n\n/** Called when there are multiple component selectors that match a given node */\nexport function throwMultipleComponentError(\n  tNode: TNode,\n  first: Type<unknown>,\n  second: Type<unknown>,\n): never {\n  throw new RuntimeError(\n    RuntimeErrorCode.MULTIPLE_COMPONENTS_MATCH,\n    `Multiple components match node with tagname ${tNode.value}: ` +\n      `${stringifyForError(first)} and ` +\n      `${stringifyForError(second)}`,\n  );\n}\n\n/** Throws an ExpressionChangedAfterChecked error if checkNoChanges mode is on. */\nexport function throwErrorIfNoChangesMode(\n  creationMode: boolean,\n  oldValue: any,\n  currValue: any,\n  propName: string | undefined,\n  lView: LView,\n): never {\n  const hostComponentDef = getDeclarationComponentDef(lView);\n  const componentClassName = hostComponentDef?.type?.name;\n  const field = propName ? ` for '${propName}'` : '';\n  let msg = `ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value${field}: '${formatValue(\n    oldValue,\n  )}'. Current value: '${formatValue(currValue)}'.${\n    componentClassName ? ` Expression location: ${componentClassName} component` : ''\n  }`;\n  if (creationMode) {\n    msg +=\n      ` It seems like the view has been created after its parent and its children have been dirty checked.` +\n      ` Has it been created in a change detection hook?`;\n  }\n  throw new RuntimeError(RuntimeErrorCode.EXPRESSION_CHANGED_AFTER_CHECKED, msg);\n}\n\nfunction formatValue(value: unknown): string {\n  let strValue: string = String(value);\n\n  // JSON.stringify will throw on circular references\n  try {\n    if (Array.isArray(value) || strValue === '[object Object]') {\n      strValue = JSON.stringify(value);\n    }\n  } catch (error) {}\n  return strValue.length > VALUE_STRING_LENGTH_LIMIT\n    ? strValue.substring(0, VALUE_STRING_LENGTH_LIMIT) + '…'\n    : strValue;\n}\n\nfunction constructDetailsForInterpolation(\n  lView: LView,\n  rootIndex: number,\n  expressionIndex: number,\n  meta: string,\n  changedValue: any,\n) {\n  const [propName, prefix, ...chunks] = meta.split(INTERPOLATION_DELIMITER);\n  let oldValue = prefix,\n    newValue = prefix;\n  for (let i = 0; i < chunks.length; i++) {\n    const slotIdx = rootIndex + i;\n    oldValue += `${lView[slotIdx]}${chunks[i]}`;\n    newValue += `${slotIdx === expressionIndex ? changedValue : lView[slotIdx]}${chunks[i]}`;\n  }\n  return {propName, oldValue, newValue};\n}\n\n/**\n * Constructs an object that contains details for the ExpressionChangedAfterItHasBeenCheckedError:\n * - property name (for property bindings or interpolations)\n * - old and new values, enriched using information from metadata\n *\n * More information on the metadata storage format can be found in `storePropertyBindingMetadata`\n * function description.\n */\nexport function getExpressionChangedErrorDetails(\n  lView: LView,\n  bindingIndex: number,\n  oldValue: any,\n  newValue: any,\n): {propName?: string; oldValue: any; newValue: any} {\n  const tData = lView[TVIEW].data;\n  const metadata = tData[bindingIndex];\n\n  if (typeof metadata === 'string') {\n    // metadata for property interpolation\n    if (metadata.indexOf(INTERPOLATION_DELIMITER) > -1) {\n      return constructDetailsForInterpolation(\n        lView,\n        bindingIndex,\n        bindingIndex,\n        metadata,\n        newValue,\n      );\n    }\n    // metadata for property binding\n    return {propName: metadata, oldValue, newValue};\n  }\n\n  // metadata is not available for this expression, check if this expression is a part of the\n  // property interpolation by going from the current binding index left and look for a string that\n  // contains INTERPOLATION_DELIMITER, the layout in tView.data for this case will look like this:\n  // [..., 'id�Prefix � and � suffix', null, null, null, ...]\n  if (metadata === null) {\n    let idx = bindingIndex - 1;\n    while (typeof tData[idx] !== 'string' && tData[idx + 1] === null) {\n      idx--;\n    }\n    const meta = tData[idx];\n    if (typeof meta === 'string') {\n      const matches = meta.match(new RegExp(INTERPOLATION_DELIMITER, 'g'));\n      // first interpolation delimiter separates property name from interpolation parts (in case of\n      // property interpolations), so we subtract one from total number of found delimiters\n      if (matches && matches.length - 1 > bindingIndex - idx) {\n        return constructDetailsForInterpolation(lView, idx, bindingIndex, meta, newValue);\n      }\n    }\n  }\n  return {propName: undefined, oldValue, newValue};\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertNotEqual} from '../../util/assert';\nimport {CharCode} from '../../util/char_code';\n\n/**\n * Returns an index of `classToSearch` in `className` taking token boundaries into account.\n *\n * `classIndexOf('AB A', 'A', 0)` will be 3 (not 0 since `AB!==A`)\n *\n * @param className A string containing classes (whitespace separated)\n * @param classToSearch A class name to locate\n * @param startingIndex Starting location of search\n * @returns an index of the located class (or -1 if not found)\n */\nexport function classIndexOf(\n  className: string,\n  classToSearch: string,\n  startingIndex: number,\n): number {\n  ngDevMode && assertNotEqual(classToSearch, '', 'can not look for \"\" string.');\n  let end = className.length;\n  while (true) {\n    const foundIndex = className.indexOf(classToSearch, startingIndex);\n    if (foundIndex === -1) return foundIndex;\n    if (foundIndex === 0 || className.charCodeAt(foundIndex - 1) <= CharCode.SPACE) {\n      // Ensure that it has leading whitespace\n      const length = classToSearch.length;\n      if (\n        foundIndex + length === end ||\n        className.charCodeAt(foundIndex + length) <= CharCode.SPACE\n      ) {\n        // Ensure that it has trailing whitespace\n        return foundIndex;\n      }\n    }\n    // False positive, keep searching from where we left off.\n    startingIndex = foundIndex + 1;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport '../util/ng_dev_mode';\n\nimport {assertDefined, assertEqual, assertNotEqual} from '../util/assert';\n\nimport {AttributeMarker} from './interfaces/attribute_marker';\nimport {TAttributes, TNode, TNodeType} from './interfaces/node';\nimport {CssSelector, CssSelectorList, SelectorFlags} from './interfaces/projection';\nimport {classIndexOf} from './styling/class_differ';\nimport {isNameOnlyAttributeMarker} from './util/attrs_utils';\n\nconst NG_TEMPLATE_SELECTOR = 'ng-template';\n\n/**\n * Search the `TAttributes` to see if it contains `cssClassToMatch` (case insensitive)\n *\n * @param tNode static data of the node to match\n * @param attrs `TAttributes` to search through.\n * @param cssClassToMatch class to match (lowercase)\n * @param isProjectionMode Whether or not class matching should look into the attribute `class` in\n *    addition to the `AttributeMarker.Classes`.\n */\nfunction isCssClassMatching(\n  tNode: TNode,\n  attrs: TAttributes,\n  cssClassToMatch: string,\n  isProjectionMode: boolean,\n): boolean {\n  ngDevMode &&\n    assertEqual(\n      cssClassToMatch,\n      cssClassToMatch.toLowerCase(),\n      'Class name expected to be lowercase.',\n    );\n  let i = 0;\n  if (isProjectionMode) {\n    for (; i < attrs.length && typeof attrs[i] === 'string'; i += 2) {\n      // Search for an implicit `class` attribute and check if its value matches `cssClassToMatch`.\n      if (\n        attrs[i] === 'class' &&\n        classIndexOf((attrs[i + 1] as string).toLowerCase(), cssClassToMatch, 0) !== -1\n      ) {\n        return true;\n      }\n    }\n  } else if (isInlineTemplate(tNode)) {\n    // Matching directives (i.e. when not matching for projection mode) should not consider the\n    // class bindings that are present on inline templates, as those class bindings only target\n    // the root node of the template, not the template itself.\n    return false;\n  }\n\n  // Resume the search for classes after the `Classes` marker.\n  i = attrs.indexOf(AttributeMarker.Classes, i);\n  if (i > -1) {\n    // We found the classes section. Start searching for the class.\n    let item: TAttributes[number];\n    while (++i < attrs.length && typeof (item = attrs[i]) === 'string') {\n      if (item.toLowerCase() === cssClassToMatch) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\n/**\n * Checks whether the `tNode` represents an inline template (e.g. `*ngFor`).\n *\n * @param tNode current TNode\n */\nexport function isInlineTemplate(tNode: TNode): boolean {\n  return tNode.type === TNodeType.Container && tNode.value !== NG_TEMPLATE_SELECTOR;\n}\n\n/**\n * Function that checks whether a given tNode matches tag-based selector and has a valid type.\n *\n * Matching can be performed in 2 modes: projection mode (when we project nodes) and regular\n * directive matching mode:\n * - in the \"directive matching\" mode we do _not_ take TContainer's tagName into account if it is\n * different from NG_TEMPLATE_SELECTOR (value different from NG_TEMPLATE_SELECTOR indicates that a\n * tag name was extracted from * syntax so we would match the same directive twice);\n * - in the \"projection\" mode, we use a tag name potentially extracted from the * syntax processing\n * (applicable to TNodeType.Container only).\n */\nfunction hasTagAndTypeMatch(\n  tNode: TNode,\n  currentSelector: string,\n  isProjectionMode: boolean,\n): boolean {\n  const tagNameToCompare =\n    tNode.type === TNodeType.Container && !isProjectionMode ? NG_TEMPLATE_SELECTOR : tNode.value;\n  return currentSelector === tagNameToCompare;\n}\n\n/**\n * A utility function to match an Ivy node static data against a simple CSS selector\n *\n * @param tNode static data of the node to match\n * @param selector The selector to try matching against the node.\n * @param isProjectionMode if `true` we are matching for content projection, otherwise we are doing\n * directive matching.\n * @returns true if node matches the selector.\n */\nexport function isNodeMatchingSelector(\n  tNode: TNode,\n  selector: CssSelector,\n  isProjectionMode: boolean,\n): boolean {\n  ngDevMode &&    assertDefined(selector[0], 'Selector should have a tag name');\n  let mode: SelectorFlags = SelectorFlags.ELEMENT;\n  const nodeAttrs = tNode.attrs;\n\n  // Find the index of first attribute that has no value, only a name.\n  const nameOnlyMarkerIdx = nodeAttrs !== null ? getNameOnlyMarkerIndex(nodeAttrs) : 0;\n\n  // When processing \":not\" selectors, we skip to the next \":not\" if the\n  // current one doesn't match\n  let skipToNextSelector = false;\n\n  for (let i = 0; i < selector.length; i++) {\n    const current = selector[i];\n    if (typeof current === 'number') {\n      // If we finish processing a :not selector and it hasn't failed, return false\n      if (!skipToNextSelector && !isPositive(mode) && !isPositive(current)) {\n        return false;\n      }\n      // If we are skipping to the next :not() and this mode flag is positive,\n      // it's a part of the current :not() selector, and we should keep skipping\n      if (skipToNextSelector && isPositive(current)) continue;\n      skipToNextSelector = false;\n      mode = (current as number) | (mode & SelectorFlags.NOT);\n      continue;\n    }\n\n    if (skipToNextSelector) continue;\n\n    if (mode & SelectorFlags.ELEMENT) {\n      mode = SelectorFlags.ATTRIBUTE | (mode & SelectorFlags.NOT);\n      if (\n        (current !== '' && !hasTagAndTypeMatch(tNode, current, isProjectionMode)) ||\n        (current === '' && selector.length === 1)\n      ) {\n        if (isPositive(mode)) return false;\n        skipToNextSelector = true;\n      }\n    } else if (mode & SelectorFlags.CLASS) {\n      if (nodeAttrs === null || !isCssClassMatching(tNode, nodeAttrs, current, isProjectionMode)) {\n        if (isPositive(mode)) return false;\n        skipToNextSelector = true;\n      }\n    } else {\n      const selectorAttrValue = selector[++i];\n      const attrIndexInNode = findAttrIndexInNode(\n        current,\n        nodeAttrs,\n        isInlineTemplate(tNode),\n        isProjectionMode,\n      );\n\n      if (attrIndexInNode === -1) {\n        if (isPositive(mode)) return false;\n        skipToNextSelector = true;\n        continue;\n      }\n\n      if (selectorAttrValue !== '') {\n        let nodeAttrValue: string;\n        if (attrIndexInNode > nameOnlyMarkerIdx) {\n          nodeAttrValue = '';\n        } else {\n          ngDevMode &&\n            assertNotEqual(\n              nodeAttrs![attrIndexInNode],\n              AttributeMarker.NamespaceURI,\n              'We do not match directives on namespaced attributes',\n            );\n          // we lowercase the attribute value to be able to match\n          // selectors without case-sensitivity\n          // (selectors are already in lowercase when generated)\n          nodeAttrValue = (nodeAttrs![attrIndexInNode + 1] as string).toLowerCase();\n        }\n\n        if (mode & SelectorFlags.ATTRIBUTE && selectorAttrValue !== nodeAttrValue) {\n          if (isPositive(mode)) return false;\n          skipToNextSelector = true;\n        }\n      }\n    }\n  }\n\n  return isPositive(mode) || skipToNextSelector;\n}\n\nfunction isPositive(mode: SelectorFlags): boolean {\n  return (mode & SelectorFlags.NOT) === 0;\n}\n\n/**\n * Examines the attribute's definition array for a node to find the index of the\n * attribute that matches the given `name`.\n *\n * NOTE: This will not match namespaced attributes.\n *\n * Attribute matching depends upon `isInlineTemplate` and `isProjectionMode`.\n * The following table summarizes which types of attributes we attempt to match:\n *\n * ===========================================================================================================\n * Modes                   | Normal Attributes | Bindings Attributes | Template Attributes | I18n\n * Attributes\n * ===========================================================================================================\n * Inline + Projection     | YES               | YES                 | NO                  | YES\n * -----------------------------------------------------------------------------------------------------------\n * Inline + Directive      | NO                | NO                  | YES                 | NO\n * -----------------------------------------------------------------------------------------------------------\n * Non-inline + Projection | YES               | YES                 | NO                  | YES\n * -----------------------------------------------------------------------------------------------------------\n * Non-inline + Directive  | YES               | YES                 | NO                  | YES\n * ===========================================================================================================\n *\n * @param name the name of the attribute to find\n * @param attrs the attribute array to examine\n * @param isInlineTemplate true if the node being matched is an inline template (e.g. `*ngFor`)\n * rather than a manually expanded template node (e.g `<ng-template>`).\n * @param isProjectionMode true if we are matching against content projection otherwise we are\n * matching against directives.\n */\nfunction findAttrIndexInNode(\n  name: string,\n  attrs: TAttributes | null,\n  isInlineTemplate: boolean,\n  isProjectionMode: boolean,\n): number {\n  if (attrs === null) return -1;\n\n  let i = 0;\n\n  if (isProjectionMode || !isInlineTemplate) {\n    let bindingsMode = false;\n    while (i < attrs.length) {\n      const maybeAttrName = attrs[i];\n      if (maybeAttrName === name) {\n        return i;\n      } else if (\n        maybeAttrName === AttributeMarker.Bindings ||\n        maybeAttrName === AttributeMarker.I18n\n      ) {\n        bindingsMode = true;\n      } else if (\n        maybeAttrName === AttributeMarker.Classes ||\n        maybeAttrName === AttributeMarker.Styles\n      ) {\n        let value = attrs[++i];\n        // We should skip classes here because we have a separate mechanism for\n        // matching classes in projection mode.\n        while (typeof value === 'string') {\n          value = attrs[++i];\n        }\n        continue;\n      } else if (maybeAttrName === AttributeMarker.Template) {\n        // We do not care about Template attributes in this scenario.\n        break;\n      } else if (maybeAttrName === AttributeMarker.NamespaceURI) {\n        // Skip the whole namespaced attribute and value. This is by design.\n        i += 4;\n        continue;\n      }\n      // In binding mode there are only names, rather than name-value pairs.\n      i += bindingsMode ? 1 : 2;\n    }\n    // We did not match the attribute\n    return -1;\n  } else {\n    return matchTemplateAttribute(attrs, name);\n  }\n}\n\nexport function isNodeMatchingSelectorList(\n  tNode: TNode,\n  selector: CssSelectorList,\n  isProjectionMode: boolean = false,\n): boolean {\n  for (let i = 0; i < selector.length; i++) {\n    if (isNodeMatchingSelector(tNode, selector[i], isProjectionMode)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport function getProjectAsAttrValue(tNode: TNode): CssSelector | null {\n  const nodeAttrs = tNode.attrs;\n  if (nodeAttrs != null) {\n    const ngProjectAsAttrIdx = nodeAttrs.indexOf(AttributeMarker.ProjectAs);\n    // only check for ngProjectAs in attribute names, don't accidentally match attribute's value\n    // (attribute names are stored at even indexes)\n    if ((ngProjectAsAttrIdx & 1) === 0) {\n      return nodeAttrs[ngProjectAsAttrIdx + 1] as CssSelector;\n    }\n  }\n  return null;\n}\n\nfunction getNameOnlyMarkerIndex(nodeAttrs: TAttributes) {\n  for (let i = 0; i < nodeAttrs.length; i++) {\n    const nodeAttr = nodeAttrs[i];\n    if (isNameOnlyAttributeMarker(nodeAttr)) {\n      return i;\n    }\n  }\n  return nodeAttrs.length;\n}\n\nfunction matchTemplateAttribute(attrs: TAttributes, name: string): number {\n  let i = attrs.indexOf(AttributeMarker.Template);\n  if (i > -1) {\n    i++;\n    while (i < attrs.length) {\n      const attr = attrs[i];\n      // Return in case we checked all template attrs and are switching to the next section in the\n      // attrs array (that starts with a number that represents an attribute marker).\n      if (typeof attr === 'number') return -1;\n      if (attr === name) return i;\n      i++;\n    }\n  }\n  return -1;\n}\n\n/**\n * Checks whether a selector is inside a CssSelectorList\n * @param selector Selector to be checked.\n * @param list List in which to look for the selector.\n */\nexport function isSelectorInSelectorList(selector: CssSelector, list: CssSelectorList): boolean {\n  selectorListLoop: for (let i = 0; i < list.length; i++) {\n    const currentSelectorInList = list[i];\n    if (selector.length !== currentSelectorInList.length) {\n      continue;\n    }\n    for (let j = 0; j < selector.length; j++) {\n      if (selector[j] !== currentSelectorInList[j]) {\n        continue selectorListLoop;\n      }\n    }\n    return true;\n  }\n  return false;\n}\n\nfunction maybeWrapInNotSelector(isNegativeMode: boolean, chunk: string): string {\n  return isNegativeMode ? ':not(' + chunk.trim() + ')' : chunk;\n}\n\nfunction stringifyCSSSelector(selector: CssSelector): string {\n  let result = selector[0] as string;\n  let i = 1;\n  let mode = SelectorFlags.ATTRIBUTE;\n  let currentChunk = '';\n  let isNegativeMode = false;\n  while (i < selector.length) {\n    let valueOrMarker = selector[i];\n    if (typeof valueOrMarker === 'string') {\n      if (mode & SelectorFlags.ATTRIBUTE) {\n        const attrValue = selector[++i] as string;\n        currentChunk +=\n          '[' + valueOrMarker + (attrValue.length > 0 ? '=\"' + attrValue + '\"' : '') + ']';\n      } else if (mode & SelectorFlags.CLASS) {\n        currentChunk += '.' + valueOrMarker;\n      } else if (mode & SelectorFlags.ELEMENT) {\n        currentChunk += ' ' + valueOrMarker;\n      }\n    } else {\n      //\n      // Append current chunk to the final result in case we come across SelectorFlag, which\n      // indicates that the previous section of a selector is over. We need to accumulate content\n      // between flags to make sure we wrap the chunk later in :not() selector if needed, e.g.\n      // ```\n      //  ['', Flags.CLASS, '.classA', Flags.CLASS | Flags.NOT, '.classB', '.classC']\n      // ```\n      // should be transformed to `.classA :not(.classB .classC)`.\n      //\n      // Note: for negative selector part, we accumulate content between flags until we find the\n      // next negative flag. This is needed to support a case where `:not()` rule contains more than\n      // one chunk, e.g. the following selector:\n      // ```\n      //  ['', Flags.ELEMENT | Flags.NOT, 'p', Flags.CLASS, 'foo', Flags.CLASS | Flags.NOT, 'bar']\n      // ```\n      // should be stringified to `:not(p.foo) :not(.bar)`\n      //\n      if (currentChunk !== '' && !isPositive(valueOrMarker)) {\n        result += maybeWrapInNotSelector(isNegativeMode, currentChunk);\n        currentChunk = '';\n      }\n      mode = valueOrMarker;\n      // According to CssSelector spec, once we come across `SelectorFlags.NOT` flag, the negative\n      // mode is maintained for remaining chunks of a selector.\n      isNegativeMode = isNegativeMode || !isPositive(mode);\n    }\n    i++;\n  }\n  if (currentChunk !== '') {\n    result += maybeWrapInNotSelector(isNegativeMode, currentChunk);\n  }\n  return result;\n}\n\n/**\n * Generates string representation of CSS selector in parsed form.\n *\n * ComponentDef and DirectiveDef are generated with the selector in parsed form to avoid doing\n * additional parsing at runtime (for example, for directive matching). However in some cases (for\n * example, while bootstrapping a component), a string version of the selector is required to query\n * for the host element on the page. This function takes the parsed form of a selector and returns\n * its string representation.\n *\n * @param selectorList selector in parsed form\n * @returns string representation of a given selector\n */\nexport function stringifyCSSSelectorList(selectorList: CssSelectorList): string {\n  return selectorList.map(stringifyCSSSelector).join(',');\n}\n\n/**\n * Extracts attributes and classes information from a given CSS selector.\n *\n * This function is used while creating a component dynamically. In this case, the host element\n * (that is created dynamically) should contain attributes and classes specified in component's CSS\n * selector.\n *\n * @param selector CSS selector in parsed form (in a form of array)\n * @returns object with `attrs` and `classes` fields that contain extracted information\n */\nexport function extractAttrsAndClassesFromSelector(selector: CssSelector): TAttributes {\n  const attrs: TAttributes = [];\n  const classes: string[] = [];\n  let i = 1;\n  let mode = SelectorFlags.ATTRIBUTE;\n  while (i < selector.length) {\n    let valueOrMarker = selector[i];\n    if (typeof valueOrMarker === 'string') {\n      if (mode === SelectorFlags.ATTRIBUTE) {\n        if (valueOrMarker !== '') {\n          attrs.push(valueOrMarker, selector[++i] as string);\n        }\n      } else if (mode === SelectorFlags.CLASS) {\n        classes.push(valueOrMarker);\n      }\n    } else {\n      // According to CssSelector spec, once we come across `SelectorFlags.NOT` flag, the negative\n      // mode is maintained for remaining chunks of a selector. Since attributes and classes are\n      // extracted only for \"positive\" part of the selector, we can stop here.\n      if (!isPositive(mode)) break;\n      mode = valueOrMarker;\n    }\n    i++;\n  }\n  if (classes.length) {\n    attrs.push(AttributeMarker.Classes, ...classes);\n  }\n\n  return attrs;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport interface NO_CHANGE {\n  // This is a brand that ensures that this type can never match anything else\n  __brand__: 'NO_CHANGE';\n}\n\n/** A special value which designates that a value has not changed. */\nexport const NO_CHANGE: NO_CHANGE =\n  typeof ngDevMode === 'undefined' || ngDevMode ? {__brand__: 'NO_CHANGE'} : ({} as NO_CHANGE);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Renderer} from './interfaces/renderer';\nimport {RComment, RElement, RNode, RText} from './interfaces/renderer_dom';\nimport {escapeCommentText} from '../util/dom';\nimport {assertDefined, assertString} from '../util/assert';\nimport {setUpAttributes} from './util/attrs_utils';\nimport {TNode} from './interfaces/node';\n\nexport function createTextNode(renderer: Renderer, value: string): RText {\n  ngDevMode && ngDevMode.rendererCreateTextNode++;\n  ngDevMode && ngDevMode.rendererSetText++;\n  return renderer.createText(value);\n}\n\nexport function updateTextNode(renderer: Renderer, rNode: RText, value: string): void {\n  ngDevMode && ngDevMode.rendererSetText++;\n  renderer.setValue(rNode, value);\n}\n\nexport function createCommentNode(renderer: Renderer, value: string): RComment {\n  ngDevMode && ngDevMode.rendererCreateComment++;\n  return renderer.createComment(escapeCommentText(value));\n}\n\n/**\n * Creates a native element from a tag name, using a renderer.\n * @param renderer A renderer to use\n * @param name the tag name\n * @param namespace Optional namespace for element.\n * @returns the element created\n */\nexport function createElementNode(\n  renderer: Renderer,\n  name: string,\n  namespace: string | null,\n): RElement {\n  ngDevMode && ngDevMode.rendererCreateElement++;\n  return renderer.createElement(name, namespace);\n}\n\n/**\n * Inserts a native node before another native node for a given parent.\n * This is a utility function that can be used when native nodes were determined.\n */\nexport function nativeInsertBefore(\n  renderer: Renderer,\n  parent: RElement,\n  child: RNode,\n  beforeNode: RNode | null,\n  isMove: boolean,\n): void {\n  ngDevMode && ngDevMode.rendererInsertBefore++;\n  renderer.insertBefore(parent, child, beforeNode, isMove);\n}\n\nexport function nativeAppendChild(renderer: Renderer, parent: RElement, child: RNode): void {\n  ngDevMode && ngDevMode.rendererAppendChild++;\n  ngDevMode && assertDefined(parent, 'parent node must be defined');\n  renderer.appendChild(parent, child);\n}\n\nexport function nativeAppendOrInsertBefore(\n  renderer: Renderer,\n  parent: RElement,\n  child: RNode,\n  beforeNode: RNode | null,\n  isMove: boolean,\n) {\n  if (beforeNode !== null) {\n    nativeInsertBefore(renderer, parent, child, beforeNode, isMove);\n  } else {\n    nativeAppendChild(renderer, parent, child);\n  }\n}\n\n/**\n * Removes a native node itself using a given renderer. To remove the node we are looking up its\n * parent from the native tree as not all platforms / browsers support the equivalent of\n * node.remove().\n *\n * @param renderer A renderer to be used\n * @param rNode The native node that should be removed\n * @param isHostElement A flag indicating if a node to be removed is a host of a component.\n */\nexport function nativeRemoveNode(renderer: Renderer, rNode: RNode, isHostElement?: boolean): void {\n  ngDevMode && ngDevMode.rendererRemoveNode++;\n  renderer.removeChild(null, rNode, isHostElement);\n}\n\n/**\n * Clears the contents of a given RElement.\n *\n * @param rElement the native RElement to be cleared\n */\nexport function clearElementContents(rElement: RElement): void {\n  rElement.textContent = '';\n}\n\n/**\n * Write `cssText` to `RElement`.\n *\n * This function does direct write without any reconciliation. Used for writing initial values, so\n * that static styling values do not pull in the style parser.\n *\n * @param renderer Renderer to use\n * @param element The element which needs to be updated.\n * @param newValue The new class list to write.\n */\nfunction writeDirectStyle(renderer: Renderer, element: RElement, newValue: string) {\n  ngDevMode && assertString(newValue, \"'newValue' should be a string\");\n  renderer.setAttribute(element, 'style', newValue);\n  ngDevMode && ngDevMode.rendererSetStyle++;\n}\n\n/**\n * Write `className` to `RElement`.\n *\n * This function does direct write without any reconciliation. Used for writing initial values, so\n * that static styling values do not pull in the style parser.\n *\n * @param renderer Renderer to use\n * @param element The element which needs to be updated.\n * @param newValue The new class list to write.\n */\nfunction writeDirectClass(renderer: Renderer, element: RElement, newValue: string) {\n  ngDevMode && assertString(newValue, \"'newValue' should be a string\");\n  if (newValue === '') {\n    // There are tests in `google3` which expect `element.getAttribute('class')` to be `null`.\n    renderer.removeAttribute(element, 'class');\n  } else {\n    renderer.setAttribute(element, 'class', newValue);\n  }\n  ngDevMode && ngDevMode.rendererSetClassName++;\n}\n\n/** Sets up the static DOM attributes on an `RNode`. */\nexport function setupStaticAttributes(renderer: Renderer, element: RElement, tNode: TNode) {\n  const {mergedAttrs, classes, styles} = tNode;\n\n  if (mergedAttrs !== null) {\n    setUpAttributes(renderer, element, mergedAttrs);\n  }\n\n  if (classes !== null) {\n    writeDirectClass(renderer, element, classes);\n  }\n\n  if (styles !== null) {\n    writeDirectStyle(renderer, element, styles);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  TView,\n  TVIEW,\n  LViewFlags,\n  LViewEnvironment,\n  HOST,\n  FLAGS,\n  DECLARATION_VIEW,\n  PARENT,\n  CONTEXT,\n  ENVIRONMENT,\n  RENDERER,\n  INJECTOR,\n  T_HOST,\n  ID,\n  HYDRATION,\n  EMBEDDED_VIEW_INJECTOR,\n  TViewType,\n  DECLARATION_COMPONENT_VIEW,\n  HEADER_OFFSET,\n  CHILD_HEAD,\n  CHILD_TAIL,\n  NEXT,\n  LView,\n} from '../interfaces/view';\nimport {assertFirstCreatePass, assertFirstUpdatePass, assertTNodeForLView} from '../assert';\nimport {assertSame, assertEqual, assertDefined} from '../../util/assert';\nimport {RElement} from '../interfaces/renderer_dom';\nimport {TConstantsOrFactory, TElementNode, TNode} from '../interfaces/node';\nimport {Renderer} from '../interfaces/renderer';\nimport {Injector} from '../../di';\nimport {DehydratedView} from '../../hydration/interfaces';\nimport {getNativeByTNode, resetPreOrderHookFlags} from '../util/view_utils';\nimport {getUniqueLViewId} from '../interfaces/lview_tracking';\nimport {NO_CHANGE} from '../tokens';\nimport {\n  ComponentDef,\n  ComponentTemplate,\n  DirectiveDefListOrFactory,\n  PipeDefListOrFactory,\n  ViewQueriesFunction,\n} from '../interfaces/definition';\nimport {SchemaMetadata} from '../../metadata/schema';\nimport {LContainer} from '../interfaces/container';\n\n/**\n * Creates a TView instance\n *\n * @param type Type of `TView`.\n * @param declTNode Declaration location of this `TView`.\n * @param templateFn Template function\n * @param decls The number of nodes, local refs, and pipes in this template\n * @param directives Registry of directives for this view\n * @param pipes Registry of pipes for this view\n * @param viewQuery View queries for this view\n * @param schemas Schemas for this view\n * @param consts Constants for this view\n */\nexport function createTView(\n  type: TViewType,\n  declTNode: TNode | null,\n  templateFn: ComponentTemplate<any> | null,\n  decls: number,\n  vars: number,\n  directives: DirectiveDefListOrFactory | null,\n  pipes: PipeDefListOrFactory | null,\n  viewQuery: ViewQueriesFunction<any> | null,\n  schemas: SchemaMetadata[] | null,\n  constsOrFactory: TConstantsOrFactory | null,\n  ssrId: string | null,\n): TView {\n  ngDevMode && ngDevMode.tView++;\n  const bindingStartIndex = HEADER_OFFSET + decls;\n  // This length does not yet contain host bindings from child directives because at this point,\n  // we don't know which directives are active on this template. As soon as a directive is matched\n  // that has a host binding, we will update the blueprint with that def's hostVars count.\n  const initialViewLength = bindingStartIndex + vars;\n  const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength);\n  const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory;\n  const tView = (blueprint[TVIEW as any] = {\n    type: type,\n    blueprint: blueprint,\n    template: templateFn,\n    queries: null,\n    viewQuery: viewQuery,\n    declTNode: declTNode,\n    data: blueprint.slice().fill(null, bindingStartIndex),\n    bindingStartIndex: bindingStartIndex,\n    expandoStartIndex: initialViewLength,\n    hostBindingOpCodes: null,\n    firstCreatePass: true,\n    firstUpdatePass: true,\n    staticViewQueries: false,\n    staticContentQueries: false,\n    preOrderHooks: null,\n    preOrderCheckHooks: null,\n    contentHooks: null,\n    contentCheckHooks: null,\n    viewHooks: null,\n    viewCheckHooks: null,\n    destroyHooks: null,\n    cleanup: null,\n    contentQueries: null,\n    components: null,\n    directiveRegistry: typeof directives === 'function' ? directives() : directives,\n    pipeRegistry: typeof pipes === 'function' ? pipes() : pipes,\n    firstChild: null,\n    schemas: schemas,\n    consts: consts,\n    incompleteFirstPass: false,\n    ssrId,\n  });\n  if (ngDevMode) {\n    // For performance reasons it is important that the tView retains the same shape during runtime.\n    // (To make sure that all of the code is monomorphic.) For this reason we seal the object to\n    // prevent class transitions.\n    Object.seal(tView);\n  }\n  return tView;\n}\n\nfunction createViewBlueprint(bindingStartIndex: number, initialViewLength: number): LView {\n  const blueprint = [];\n\n  for (let i = 0; i < initialViewLength; i++) {\n    blueprint.push(i < bindingStartIndex ? null : NO_CHANGE);\n  }\n\n  return blueprint as LView;\n}\n\n/**\n * Gets TView from a template function or creates a new TView\n * if it doesn't already exist.\n *\n * @param def ComponentDef\n * @returns TView\n */\nexport function getOrCreateComponentTView(def: ComponentDef<any>): TView {\n  const tView = def.tView;\n\n  // Create a TView if there isn't one, or recreate it if the first create pass didn't\n  // complete successfully since we can't know for sure whether it's in a usable shape.\n  if (tView === null || tView.incompleteFirstPass) {\n    // Declaration node here is null since this function is called when we dynamically create a\n    // component and hence there is no declaration.\n    const declTNode = null;\n    return (def.tView = createTView(\n      TViewType.Component,\n      declTNode,\n      def.template,\n      def.decls,\n      def.vars,\n      def.directiveDefs,\n      def.pipeDefs,\n      def.viewQuery,\n      def.schemas,\n      def.consts,\n      def.id,\n    ));\n  }\n\n  return tView;\n}\n\nexport function createLView<T>(\n  parentLView: LView | null,\n  tView: TView,\n  context: T | null,\n  flags: LViewFlags,\n  host: RElement | null,\n  tHostNode: TNode | null,\n  environment: LViewEnvironment | null,\n  renderer: Renderer | null,\n  injector: Injector | null,\n  embeddedViewInjector: Injector | null,\n  hydrationInfo: DehydratedView | null,\n): LView<T> {\n  const lView = tView.blueprint.slice() as LView;\n  lView[HOST] = host;\n  lView[FLAGS] =\n    flags |\n    LViewFlags.CreationMode |\n    LViewFlags.Attached |\n    LViewFlags.FirstLViewPass |\n    LViewFlags.Dirty |\n    LViewFlags.RefreshView;\n  if (\n    embeddedViewInjector !== null ||\n    (parentLView && parentLView[FLAGS] & LViewFlags.HasEmbeddedViewInjector)\n  ) {\n    lView[FLAGS] |= LViewFlags.HasEmbeddedViewInjector;\n  }\n  resetPreOrderHookFlags(lView);\n  ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView);\n  lView[PARENT] = lView[DECLARATION_VIEW] = parentLView;\n  lView[CONTEXT] = context;\n  lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]))!;\n  ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required');\n  lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]))!;\n  ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required');\n  lView[INJECTOR as any] = injector || (parentLView && parentLView[INJECTOR]) || null;\n  lView[T_HOST] = tHostNode;\n  lView[ID] = getUniqueLViewId();\n  lView[HYDRATION] = hydrationInfo;\n  lView[EMBEDDED_VIEW_INJECTOR as any] = embeddedViewInjector;\n\n  ngDevMode &&\n    assertEqual(\n      tView.type == TViewType.Embedded ? parentLView !== null : true,\n      true,\n      'Embedded views must have parentLView',\n    );\n  lView[DECLARATION_COMPONENT_VIEW] =\n    tView.type == TViewType.Embedded ? parentLView![DECLARATION_COMPONENT_VIEW] : lView;\n  return lView as LView<T>;\n}\n\nexport function createComponentLView<T>(\n  lView: LView,\n  hostTNode: TElementNode,\n  def: ComponentDef<T>,\n): LView {\n  const native = getNativeByTNode(hostTNode, lView) as RElement;\n  const tView = getOrCreateComponentTView(def);\n\n  // Only component views should be added to the view tree directly. Embedded views are\n  // accessed through their containers because they may be removed / re-added later.\n  const rendererFactory = lView[ENVIRONMENT].rendererFactory;\n  const componentView = addToEndOfViewTree(\n    lView,\n    createLView(\n      lView,\n      tView,\n      null,\n      getInitialLViewFlagsFromDef(def),\n      native,\n      hostTNode as TElementNode,\n      null,\n      rendererFactory.createRenderer(native, def),\n      null,\n      null,\n      null,\n    ),\n  );\n\n  // Component view will always be created before any injected LContainers,\n  // so this is a regular element, wrap it with the component view\n  return (lView[hostTNode.index] = componentView);\n}\n\n/**\n * Gets the initial set of LView flags based on the component definition that the LView represents.\n * @param def Component definition from which to determine the flags.\n */\nexport function getInitialLViewFlagsFromDef(def: ComponentDef<unknown>): LViewFlags {\n  let flags = LViewFlags.CheckAlways;\n  if (def.signals) {\n    flags = LViewFlags.SignalView;\n  } else if (def.onPush) {\n    flags = LViewFlags.Dirty;\n  }\n  return flags;\n}\n\n/**\n * When elements are created dynamically after a view blueprint is created (e.g. through\n * i18nApply()), we need to adjust the blueprint for future template passes.\n *\n * @param tView `TView` associated with `LView`\n * @param lView The `LView` containing the blueprint to adjust\n * @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0\n * @param initialValue Initial value to store in blueprint\n */\nexport function allocExpando(\n  tView: TView,\n  lView: LView,\n  numSlotsToAlloc: number,\n  initialValue: unknown,\n): number {\n  if (numSlotsToAlloc === 0) return -1;\n  if (ngDevMode) {\n    assertFirstCreatePass(tView);\n    assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!');\n    assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView');\n    assertEqual(\n      tView.data.length,\n      tView.blueprint.length,\n      'Expecting Blueprint to be same size as TView',\n    );\n    assertFirstUpdatePass(tView);\n  }\n  const allocIdx = lView.length;\n  for (let i = 0; i < numSlotsToAlloc; i++) {\n    lView.push(initialValue);\n    tView.blueprint.push(initialValue);\n    tView.data.push(null);\n  }\n  return allocIdx;\n}\n\n/**\n * Adds LView or LContainer to the end of the current view tree.\n *\n * This structure will be used to traverse through nested views to remove listeners\n * and call onDestroy callbacks.\n *\n * @param lView The view where LView or LContainer should be added\n * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header\n * @param lViewOrLContainer The LView or LContainer to add to the view tree\n * @returns The state passed in\n */\nexport function addToEndOfViewTree<T extends LView | LContainer>(\n  lView: LView,\n  lViewOrLContainer: T,\n): T {\n  // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer\n  // to the end of the queue, which means if the developer retrieves the LContainers from RNodes out\n  // of order, the change detection will run out of order, as the act of retrieving the the\n  // LContainer from the RNode is what adds it to the queue.\n  if (lView[CHILD_HEAD]) {\n    lView[CHILD_TAIL]![NEXT] = lViewOrLContainer;\n  } else {\n    lView[CHILD_HEAD] = lViewOrLContainer;\n  }\n  lView[CHILD_TAIL] = lViewOrLContainer;\n  return lViewOrLContainer;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {assertGreaterThan} from '../../util/assert';\nimport {assertIndexInDeclRange} from '../assert';\nimport {executeCheckHooks, executeInitAndCheckHooks} from '../hooks';\nimport {FLAGS, InitPhaseState, LView, LViewFlags, TVIEW, TView} from '../interfaces/view';\nimport {\n  getLView,\n  getSelectedIndex,\n  getTView,\n  isInCheckNoChangesMode,\n  setSelectedIndex,\n} from '../state';\n\n/**\n * Advances to an element for later binding instructions.\n *\n * Used in conjunction with instructions like {@link property} to act on elements with specified\n * indices, for example those created with {@link element} or {@link elementStart}.\n *\n * ```ts\n * (rf: RenderFlags, ctx: any) => {\n *   if (rf & 1) {\n *     text(0, 'Hello');\n *     text(1, 'Goodbye')\n *     element(2, 'div');\n *   }\n *   if (rf & 2) {\n *     advance(2); // Advance twice to the <div>.\n *     property('title', 'test');\n *   }\n *  }\n * ```\n * @param delta Number of elements to advance forwards by.\n *\n * @codeGenApi\n */\nexport function ɵɵadvance(delta: number = 1): void {\n  ngDevMode && assertGreaterThan(delta, 0, 'Can only advance forward');\n  selectIndexInternal(\n    getTView(),\n    getLView(),\n    getSelectedIndex() + delta,\n    !!ngDevMode && isInCheckNoChangesMode(),\n  );\n}\n\nexport function selectIndexInternal(\n  tView: TView,\n  lView: LView,\n  index: number,\n  checkNoChangesMode: boolean,\n) {\n  ngDevMode && assertIndexInDeclRange(lView[TVIEW], index);\n\n  // Flush the initial hooks for elements in the view that have been added up to this point.\n  // PERF WARNING: do NOT extract this to a separate function without running benchmarks\n  if (!checkNoChangesMode) {\n    const hooksInitPhaseCompleted =\n      (lView[FLAGS] & LViewFlags.InitPhaseStateMask) === InitPhaseState.InitPhaseCompleted;\n    if (hooksInitPhaseCompleted) {\n      const preOrderCheckHooks = tView.preOrderCheckHooks;\n      if (preOrderCheckHooks !== null) {\n        executeCheckHooks(lView, preOrderCheckHooks, index);\n      }\n    } else {\n      const preOrderHooks = tView.preOrderHooks;\n      if (preOrderHooks !== null) {\n        executeInitAndCheckHooks(lView, preOrderHooks, InitPhaseState.OnInitHooksToBeRun, index);\n      }\n    }\n  }\n\n  // We must set the selected index *after* running the hooks, because hooks may have side-effects\n  // that cause other template functions to run, thus updating the selected index, which is global\n  // state. If we run `setSelectedIndex` *before* we run the hooks, in some cases the selected index\n  // will be altered by the time we leave the `ɵɵadvance` instruction.\n  setSelectedIndex(index);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Flags describing an input for a directive. */\nexport enum InputFlags {\n  None = 0,\n  SignalBased = 1 << 0,\n  HasDecoratorInputTransform = 1 << 1,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer, SIGNAL} from '../../../primitives/signals';\n\nimport {InputSignalWithTransform} from '../../authoring/input/input_signal';\nimport {InputSignalNode} from '../../authoring/input/input_signal_node';\nimport {applyValueToInputField} from '../apply_value_input_field';\nimport {DirectiveDef} from '../interfaces/definition';\nimport {InputFlags} from '../interfaces/input_flags';\nimport {NodeInjectorFactory} from '../interfaces/injector';\n\nexport function writeToDirectiveInput<T>(\n  def: DirectiveDef<T>,\n  instance: T,\n  publicName: string,\n  value: unknown,\n) {\n  const prevConsumer = setActiveConsumer(null);\n  try {\n    if (ngDevMode) {\n      if (!def.inputs.hasOwnProperty(publicName)) {\n        throw new Error(\n          `ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of \"${publicName}\"`,\n        );\n      }\n\n      // Usually we resolve the directive instance using `LView[someIndex]` before writing to an\n      // input, however if the read happens to early, the `LView[someIndex]` might actually be a\n      // `NodeInjectorFactory`. Check for this specific case here since it can break in subtle ways.\n      if (instance instanceof NodeInjectorFactory) {\n        throw new Error(\n          `ASSERTION ERROR: Cannot write input to factory for type ${def.type.name}. Directive has not been created yet.`,\n        );\n      }\n    }\n\n    const [privateName, flags, transform] = def.inputs[publicName];\n\n    // If we know we are dealing with a signal input, we cache its reference\n    // in a tree-shakable way. The input signal node can then be used for\n    // value transform execution or actual value updates without introducing\n    // additional megamorphic accesses for accessing the instance field.\n    let inputSignalNode: InputSignalNode<unknown, unknown> | null = null;\n    if ((flags & InputFlags.SignalBased) !== 0) {\n      const field = (instance as any)[privateName] as InputSignalWithTransform<unknown, unknown>;\n      inputSignalNode = field[SIGNAL];\n    }\n\n    // If there is a signal node and a transform, run it before potentially\n    // delegating to features like `NgOnChanges`.\n    if (inputSignalNode !== null && inputSignalNode.transformFn !== undefined) {\n      value = inputSignalNode.transformFn(value);\n    } else if (transform !== null) {\n      // If there is a decorator input transform, run it.\n      value = transform.call(instance, value);\n    }\n\n    if (def.setInput !== null) {\n      def.setInput(instance, inputSignalNode, value, publicName, privateName);\n    } else {\n      applyValueToInputField(instance, inputSignalNode, privateName, value);\n    }\n  } finally {\n    setActiveConsumer(prevConsumer);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../../di/injector';\nimport {hasSkipHydrationAttrOnRElement} from '../../hydration/skip_hydration';\nimport {PRESERVE_HOST_CONTENT, PRESERVE_HOST_CONTENT_DEFAULT} from '../../hydration/tokens';\nimport {processTextNodeMarkersBeforeHydration} from '../../hydration/utils';\nimport {ViewEncapsulation} from '../../metadata/view';\nimport {\n  validateAgainstEventAttributes,\n  validateAgainstEventProperties,\n} from '../../sanitization/sanitization';\nimport {assertIndexInRange, assertNotSame} from '../../util/assert';\nimport {escapeCommentText} from '../../util/dom';\nimport {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect';\nimport {stringify} from '../../util/stringify';\nimport {assertFirstCreatePass, assertLView} from '../assert';\nimport {attachPatchData} from '../context_discovery';\nimport {getNodeInjectable, getOrCreateNodeInjectorForNode} from '../di';\nimport {throwMultipleComponentError} from '../errors';\nimport {ComponentDef, ComponentTemplate, DirectiveDef, RenderFlags} from '../interfaces/definition';\nimport {\n  InitialInputData,\n  InitialInputs,\n  LocalRefExtractor,\n  TContainerNode,\n  TDirectiveHostNode,\n  TElementContainerNode,\n  TElementNode,\n  TNode,\n  TNodeFlags,\n  TNodeType,\n} from '../interfaces/node';\nimport {Renderer} from '../interfaces/renderer';\nimport {RComment, RElement} from '../interfaces/renderer_dom';\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {isComponentDef, isComponentHost} from '../interfaces/type_checks';\nimport {\n  CONTEXT,\n  FLAGS,\n  HEADER_OFFSET,\n  INJECTOR,\n  LView,\n  LViewFlags,\n  RENDERER,\n  TData,\n  TView,\n} from '../interfaces/view';\nimport {assertTNodeType} from '../node_assert';\nimport {isNodeMatchingSelectorList} from '../node_selector_matcher';\nimport {profiler} from '../profiler';\nimport {ProfilerEvent} from '../profiler_types';\nimport {\n  getCurrentDirectiveIndex,\n  getSelectedIndex,\n  isInCheckNoChangesMode,\n  setCurrentDirectiveIndex,\n  setSelectedIndex,\n} from '../state';\nimport {NO_CHANGE} from '../tokens';\nimport {INTERPOLATION_DELIMITER} from '../util/misc_utils';\nimport {renderStringify} from '../util/stringify_utils';\nimport {getComponentLViewByIndex, getNativeByTNode, unwrapLView} from '../util/view_utils';\n\nimport {clearElementContents} from '../dom_node_manipulation';\nimport {createComponentLView} from '../view/construction';\nimport {selectIndexInternal} from './advance';\nimport {handleUnknownPropertyError, isPropertyValid, matchingSchemas} from './element_validation';\nimport {writeToDirectiveInput} from './write_to_directive_input';\nimport {ErrorHandler} from '../../error_handler';\n\nexport function executeTemplate<T>(\n  tView: TView,\n  lView: LView<T>,\n  templateFn: ComponentTemplate<T>,\n  rf: RenderFlags,\n  context: T,\n) {\n  const prevSelectedIndex = getSelectedIndex();\n  const isUpdatePhase = rf & RenderFlags.Update;\n  try {\n    setSelectedIndex(-1);\n    if (isUpdatePhase && lView.length > HEADER_OFFSET) {\n      // When we're updating, inherently select 0 so we don't\n      // have to generate that instruction for most update blocks.\n      selectIndexInternal(tView, lView, HEADER_OFFSET, !!ngDevMode && isInCheckNoChangesMode());\n    }\n\n    const preHookType = isUpdatePhase\n      ? ProfilerEvent.TemplateUpdateStart\n      : ProfilerEvent.TemplateCreateStart;\n    profiler(preHookType, context as unknown as {});\n    templateFn(rf, context);\n  } finally {\n    setSelectedIndex(prevSelectedIndex);\n\n    const postHookType = isUpdatePhase\n      ? ProfilerEvent.TemplateUpdateEnd\n      : ProfilerEvent.TemplateCreateEnd;\n    profiler(postHookType, context as unknown as {});\n  }\n}\n\n/**\n * Creates directive instances.\n */\nexport function createDirectivesInstances(tView: TView, lView: LView, tNode: TDirectiveHostNode) {\n  instantiateAllDirectives(tView, lView, tNode);\n  if ((tNode.flags & TNodeFlags.hasHostBindings) === TNodeFlags.hasHostBindings) {\n    invokeDirectivesHostBindings(tView, lView, tNode);\n  }\n}\n\n/**\n * Takes a list of local names and indices and pushes the resolved local variable values\n * to LView in the same order as they are loaded in the template with load().\n */\nexport function saveResolvedLocalsInData(\n  viewData: LView,\n  tNode: TDirectiveHostNode,\n  localRefExtractor: LocalRefExtractor = getNativeByTNode,\n): void {\n  const localNames = tNode.localNames;\n  if (localNames !== null) {\n    let localIndex = tNode.index + 1;\n    for (let i = 0; i < localNames.length; i += 2) {\n      const index = localNames[i + 1] as number;\n      const value =\n        index === -1\n          ? localRefExtractor(\n              tNode as TElementNode | TContainerNode | TElementContainerNode,\n              viewData,\n            )\n          : viewData[index];\n      viewData[localIndex++] = value;\n    }\n  }\n}\n\n/**\n * Locates the host native element, used for bootstrapping existing nodes into rendering pipeline.\n *\n * @param renderer the renderer used to locate the element.\n * @param elementOrSelector Render element or CSS selector to locate the element.\n * @param encapsulation View Encapsulation defined for component that requests host element.\n * @param injector Root view injector instance.\n */\nexport function locateHostElement(\n  renderer: Renderer,\n  elementOrSelector: RElement | string,\n  encapsulation: ViewEncapsulation,\n  injector: Injector,\n): RElement {\n  // Note: we use default value for the `PRESERVE_HOST_CONTENT` here even though it's a\n  // tree-shakable one (providedIn:'root'). This code path can be triggered during dynamic\n  // component creation (after calling ViewContainerRef.createComponent) when an injector\n  // instance can be provided. The injector instance might be disconnected from the main DI\n  // tree, thus the `PRESERVE_HOST_CONTENT` would not be able to instantiate. In this case, the\n  // default value will be used.\n  const preserveHostContent = injector.get(PRESERVE_HOST_CONTENT, PRESERVE_HOST_CONTENT_DEFAULT);\n\n  // When using native Shadow DOM, do not clear host element to allow native slot\n  // projection.\n  const preserveContent = preserveHostContent || encapsulation === ViewEncapsulation.ShadowDom;\n  const rootElement = renderer.selectRootElement(elementOrSelector, preserveContent);\n  applyRootElementTransform(rootElement as HTMLElement);\n  return rootElement;\n}\n\n/**\n * Applies any root element transformations that are needed. If hydration is enabled,\n * this will process corrupted text nodes.\n *\n * @param rootElement the app root HTML Element\n */\nexport function applyRootElementTransform(rootElement: HTMLElement) {\n  _applyRootElementTransformImpl(rootElement as HTMLElement);\n}\n\n/**\n * Reference to a function that applies transformations to the root HTML element\n * of an app. When hydration is enabled, this processes any corrupt text nodes\n * so they are properly hydratable on the client.\n *\n * @param rootElement the app root HTML Element\n */\nlet _applyRootElementTransformImpl: typeof applyRootElementTransformImpl = () => null;\n\n/**\n * Processes text node markers before hydration begins. This replaces any special comment\n * nodes that were added prior to serialization are swapped out to restore proper text\n * nodes before hydration.\n *\n * @param rootElement the app root HTML Element\n */\nexport function applyRootElementTransformImpl(rootElement: HTMLElement) {\n  if (hasSkipHydrationAttrOnRElement(rootElement)) {\n    // Handle a situation when the `ngSkipHydration` attribute is applied\n    // to the root node of an application. In this case, we should clear\n    // the contents and render everything from scratch.\n    clearElementContents(rootElement as RElement);\n  } else {\n    processTextNodeMarkersBeforeHydration(rootElement);\n  }\n}\n\n/**\n * Sets the implementation for the `applyRootElementTransform` function.\n */\nexport function enableApplyRootElementTransformImpl() {\n  _applyRootElementTransformImpl = applyRootElementTransformImpl;\n}\n\n/**\n * Mapping between attributes names that don't correspond to their element property names.\n *\n * Performance note: this function is written as a series of if checks (instead of, say, a property\n * object lookup) for performance reasons - the series of `if` checks seems to be the fastest way of\n * mapping property names. Do NOT change without benchmarking.\n *\n * Note: this mapping has to be kept in sync with the equally named mapping in the template\n * type-checking machinery of ngtsc.\n */\nfunction mapPropName(name: string): string {\n  if (name === 'class') return 'className';\n  if (name === 'for') return 'htmlFor';\n  if (name === 'formaction') return 'formAction';\n  if (name === 'innerHtml') return 'innerHTML';\n  if (name === 'readonly') return 'readOnly';\n  if (name === 'tabindex') return 'tabIndex';\n  return name;\n}\n\nexport function elementPropertyInternal<T>(\n  tView: TView,\n  tNode: TNode,\n  lView: LView,\n  propName: string,\n  value: T,\n  renderer: Renderer,\n  sanitizer: SanitizerFn | null | undefined,\n  nativeOnly: boolean,\n): void {\n  ngDevMode && assertNotSame(value, NO_CHANGE as any, 'Incoming value should never be NO_CHANGE.');\n\n  if (!nativeOnly) {\n    const hasSetInput = setAllInputsForProperty(tNode, tView, lView, propName, value);\n\n    if (hasSetInput) {\n      isComponentHost(tNode) && markDirtyIfOnPush(lView, tNode.index);\n      ngDevMode && setNgReflectProperties(lView, tView, tNode, propName, value);\n      return; // Stop propcessing if we've matched at least one input.\n    }\n  }\n\n  if (tNode.type & TNodeType.AnyRNode) {\n    const element = getNativeByTNode(tNode, lView) as RElement | RComment;\n    propName = mapPropName(propName);\n\n    if (ngDevMode) {\n      validateAgainstEventProperties(propName);\n      if (!isPropertyValid(element, propName, tNode.value, tView.schemas)) {\n        handleUnknownPropertyError(propName, tNode.value, tNode.type, lView);\n      }\n      ngDevMode.rendererSetProperty++;\n    }\n\n    // It is assumed that the sanitizer is only added when the compiler determines that the\n    // property is risky, so sanitization can be done without further checks.\n    value = sanitizer != null ? (sanitizer(value, tNode.value || '', propName) as any) : value;\n    renderer.setProperty(element as RElement, propName, value);\n  } else if (tNode.type & TNodeType.AnyContainer) {\n    // If the node is a container and the property didn't\n    // match any of the inputs or schemas we should throw.\n    if (ngDevMode && !matchingSchemas(tView.schemas, tNode.value)) {\n      handleUnknownPropertyError(propName, tNode.value, tNode.type, lView);\n    }\n  }\n}\n\n/** If node is an OnPush component, marks its LView dirty. */\nexport function markDirtyIfOnPush(lView: LView, viewIndex: number): void {\n  ngDevMode && assertLView(lView);\n  const childComponentLView = getComponentLViewByIndex(viewIndex, lView);\n  if (!(childComponentLView[FLAGS] & LViewFlags.CheckAlways)) {\n    childComponentLView[FLAGS] |= LViewFlags.Dirty;\n  }\n}\n\nfunction setNgReflectProperty(lView: LView, tNode: TNode, attrName: string, value: any) {\n  const element = getNativeByTNode(tNode, lView) as RElement | RComment;\n  const renderer = lView[RENDERER];\n  attrName = normalizeDebugBindingName(attrName);\n  const debugValue = normalizeDebugBindingValue(value);\n  if (tNode.type & TNodeType.AnyRNode) {\n    if (value == null) {\n      renderer.removeAttribute(element as RElement, attrName);\n    } else {\n      renderer.setAttribute(element as RElement, attrName, debugValue);\n    }\n  } else {\n    const textContent = escapeCommentText(\n      `bindings=${JSON.stringify({[attrName]: debugValue}, null, 2)}`,\n    );\n    renderer.setValue(element as RComment, textContent);\n  }\n}\n\nfunction setNgReflectProperties(\n  lView: LView,\n  tView: TView,\n  tNode: TNode,\n  publicName: string,\n  value: any,\n) {\n  if (!(tNode.type & (TNodeType.AnyRNode | TNodeType.Container))) {\n    return;\n  }\n\n  const inputConfig = tNode.inputs?.[publicName];\n  const hostInputConfig = tNode.hostDirectiveInputs?.[publicName];\n\n  if (hostInputConfig) {\n    for (let i = 0; i < hostInputConfig.length; i += 2) {\n      const index = hostInputConfig[i] as number;\n      const publicName = hostInputConfig[i + 1] as string;\n      const def = tView.data[index] as DirectiveDef<unknown>;\n      setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);\n    }\n  }\n\n  // Note: we set the private name of the input as the reflected property, not the public one.\n  if (inputConfig) {\n    for (const index of inputConfig) {\n      const def = tView.data[index] as DirectiveDef<unknown>;\n      setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);\n    }\n  }\n}\n\n/**\n * Instantiate all the directives that were previously resolved on the current node.\n */\nfunction instantiateAllDirectives(tView: TView, lView: LView, tNode: TDirectiveHostNode) {\n  const start = tNode.directiveStart;\n  const end = tNode.directiveEnd;\n\n  // The component view needs to be created before creating the node injector\n  // since it is used to inject some special symbols like `ChangeDetectorRef`.\n  if (isComponentHost(tNode)) {\n    ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode);\n    createComponentLView(\n      lView,\n      tNode as TElementNode,\n      tView.data[start + tNode.componentOffset] as ComponentDef<unknown>,\n    );\n  }\n\n  if (!tView.firstCreatePass) {\n    getOrCreateNodeInjectorForNode(tNode, lView);\n  }\n\n  const initialInputs = tNode.initialInputs;\n  for (let i = start; i < end; i++) {\n    const def = tView.data[i] as DirectiveDef<any>;\n    const directive = getNodeInjectable(lView, tView, i, tNode);\n    attachPatchData(directive, lView);\n\n    if (initialInputs !== null) {\n      setInputsFromAttrs(lView, i - start, directive, def, tNode, initialInputs!);\n    }\n\n    if (isComponentDef(def)) {\n      const componentView = getComponentLViewByIndex(tNode.index, lView);\n      componentView[CONTEXT] = getNodeInjectable(lView, tView, i, tNode);\n    }\n  }\n}\n\nexport function invokeDirectivesHostBindings(tView: TView, lView: LView, tNode: TNode) {\n  const start = tNode.directiveStart;\n  const end = tNode.directiveEnd;\n  const elementIndex = tNode.index;\n  const currentDirectiveIndex = getCurrentDirectiveIndex();\n  try {\n    setSelectedIndex(elementIndex);\n    for (let dirIndex = start; dirIndex < end; dirIndex++) {\n      const def = tView.data[dirIndex] as DirectiveDef<unknown>;\n      const directive = lView[dirIndex];\n      setCurrentDirectiveIndex(dirIndex);\n      if (def.hostBindings !== null || def.hostVars !== 0 || def.hostAttrs !== null) {\n        invokeHostBindingsInCreationMode(def, directive);\n      }\n    }\n  } finally {\n    setSelectedIndex(-1);\n    setCurrentDirectiveIndex(currentDirectiveIndex);\n  }\n}\n\n/**\n * Invoke the host bindings in creation mode.\n *\n * @param def `DirectiveDef` which may contain the `hostBindings` function.\n * @param directive Instance of directive.\n */\nexport function invokeHostBindingsInCreationMode(def: DirectiveDef<any>, directive: any) {\n  if (def.hostBindings !== null) {\n    def.hostBindings!(RenderFlags.Create, directive);\n  }\n}\n\n/**\n * Matches the current node against all available selectors.\n * If a component is matched (at most one), it is returned in first position in the array.\n */\nexport function findDirectiveDefMatches(\n  tView: TView,\n  tNode: TElementNode | TContainerNode | TElementContainerNode,\n): DirectiveDef<unknown>[] | null {\n  ngDevMode && assertFirstCreatePass(tView);\n  ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode | TNodeType.AnyContainer);\n\n  const registry = tView.directiveRegistry;\n  let matches: DirectiveDef<unknown>[] | null = null;\n  if (registry) {\n    for (let i = 0; i < registry.length; i++) {\n      const def = registry[i] as ComponentDef<any> | DirectiveDef<any>;\n      if (isNodeMatchingSelectorList(tNode, def.selectors!, /* isProjectionMode */ false)) {\n        matches ??= [];\n\n        if (isComponentDef(def)) {\n          if (ngDevMode) {\n            assertTNodeType(\n              tNode,\n              TNodeType.Element,\n              `\"${tNode.value}\" tags cannot be used as component hosts. ` +\n                `Please use a different tag to activate the ${stringify(def.type)} component.`,\n            );\n\n            if (matches.length && isComponentDef(matches[0])) {\n              throwMultipleComponentError(tNode, matches.find(isComponentDef)!.type, def.type);\n            }\n          }\n\n          matches.unshift(def);\n        } else {\n          matches.push(def);\n        }\n      }\n    }\n  }\n\n  return matches;\n}\n\nexport function elementAttributeInternal(\n  tNode: TNode,\n  lView: LView,\n  name: string,\n  value: any,\n  sanitizer: SanitizerFn | null | undefined,\n  namespace: string | null | undefined,\n) {\n  if (ngDevMode) {\n    assertNotSame(value, NO_CHANGE as any, 'Incoming value should never be NO_CHANGE.');\n    validateAgainstEventAttributes(name);\n    assertTNodeType(\n      tNode,\n      TNodeType.Element,\n      `Attempted to set attribute \\`${name}\\` on a container node. ` +\n        `Host bindings are not valid on ng-container or ng-template.`,\n    );\n  }\n  const element = getNativeByTNode(tNode, lView) as RElement;\n  setElementAttribute(lView[RENDERER], element, namespace, tNode.value, name, value, sanitizer);\n}\n\nexport function setElementAttribute(\n  renderer: Renderer,\n  element: RElement,\n  namespace: string | null | undefined,\n  tagName: string | null,\n  name: string,\n  value: any,\n  sanitizer: SanitizerFn | null | undefined,\n) {\n  if (value == null) {\n    ngDevMode && ngDevMode.rendererRemoveAttribute++;\n    renderer.removeAttribute(element, name, namespace);\n  } else {\n    ngDevMode && ngDevMode.rendererSetAttribute++;\n    const strValue =\n      sanitizer == null ? renderStringify(value) : sanitizer(value, tagName || '', name);\n\n    renderer.setAttribute(element, name, strValue as string, namespace);\n  }\n}\n\n/**\n * Sets initial input properties on directive instances from attribute data\n *\n * @param lView Current LView that is being processed.\n * @param directiveIndex Index of the directive in directives array\n * @param instance Instance of the directive on which to set the initial inputs\n * @param def The directive def that contains the list of inputs\n * @param tNode The static data for this node\n */\nfunction setInputsFromAttrs<T>(\n  lView: LView,\n  directiveIndex: number,\n  instance: T,\n  def: DirectiveDef<T>,\n  tNode: TNode,\n  initialInputData: InitialInputData,\n): void {\n  const initialInputs: InitialInputs | null = initialInputData![directiveIndex];\n  if (initialInputs !== null) {\n    for (let i = 0; i < initialInputs.length; i += 2) {\n      const lookupName = initialInputs[i];\n      const value = initialInputs[i + 1];\n\n      writeToDirectiveInput<T>(def, instance, lookupName, value);\n\n      if (ngDevMode) {\n        setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value);\n      }\n    }\n  }\n}\n\n///////////////////////////////\n//// Bindings & interpolations\n///////////////////////////////\n\n/**\n * Stores meta-data for a property binding to be used by TestBed's `DebugElement.properties`.\n *\n * In order to support TestBed's `DebugElement.properties` we need to save, for each binding:\n * - a bound property name;\n * - a static parts of interpolated strings;\n *\n * A given property metadata is saved at the binding's index in the `TView.data` (in other words, a\n * property binding metadata will be stored in `TView.data` at the same index as a bound value in\n * `LView`). Metadata are represented as `INTERPOLATION_DELIMITER`-delimited string with the\n * following format:\n * - `propertyName` for bound properties;\n * - `propertyName�prefix�interpolation_static_part1�..interpolation_static_partN�suffix` for\n * interpolated properties.\n *\n * @param tData `TData` where meta-data will be saved;\n * @param tNode `TNode` that is a target of the binding;\n * @param propertyName bound property name;\n * @param bindingIndex binding index in `LView`\n * @param interpolationParts static interpolation parts (for property interpolations)\n */\nexport function storePropertyBindingMetadata(\n  tData: TData,\n  tNode: TNode,\n  propertyName: string,\n  bindingIndex: number,\n  ...interpolationParts: string[]\n) {\n  // Binding meta-data are stored only the first time a given property instruction is processed.\n  // Since we don't have a concept of the \"first update pass\" we need to check for presence of the\n  // binding meta-data to decide if one should be stored (or if was stored already).\n  if (tData[bindingIndex] === null) {\n    if (!tNode.inputs?.[propertyName] && !tNode.hostDirectiveInputs?.[propertyName]) {\n      const propBindingIdxs = tNode.propertyBindings || (tNode.propertyBindings = []);\n      propBindingIdxs.push(bindingIndex);\n      let bindingMetadata = propertyName;\n      if (interpolationParts.length > 0) {\n        bindingMetadata +=\n          INTERPOLATION_DELIMITER + interpolationParts.join(INTERPOLATION_DELIMITER);\n      }\n      tData[bindingIndex] = bindingMetadata;\n    }\n  }\n}\n\n/**\n * There are cases where the sub component's renderer needs to be included\n * instead of the current renderer (see the componentSyntheticHost* instructions).\n */\nexport function loadComponentRenderer(\n  currentDef: DirectiveDef<any> | null,\n  tNode: TNode,\n  lView: LView,\n): Renderer {\n  // TODO(FW-2043): the `currentDef` is null when host bindings are invoked while creating root\n  // component (see packages/core/src/render3/component.ts). This is not consistent with the process\n  // of creating inner components, when current directive index is available in the state. In order\n  // to avoid relying on current def being `null` (thus special-casing root component creation), the\n  // process of creating root component should be unified with the process of creating inner\n  // components.\n  if (currentDef === null || isComponentDef(currentDef)) {\n    lView = unwrapLView(lView[tNode.index])!;\n  }\n  return lView[RENDERER];\n}\n\n/** Handles an error thrown in an LView. */\nexport function handleError(lView: LView, error: any): void {\n  const injector = lView[INJECTOR];\n  const errorHandler = injector ? injector.get(ErrorHandler, null) : null;\n  errorHandler && errorHandler.handleError(error);\n}\n\n/**\n * Set all directive inputs with the specific public name on the node.\n *\n * @param tNode TNode on which the input is being set.\n * @param tView Current TView\n * @param lView `LView` which contains the directives.\n * @param publicName Public name of the input being set.\n * @param value Value to set.\n */\nexport function setAllInputsForProperty(\n  tNode: TNode,\n  tView: TView,\n  lView: LView,\n  publicName: string,\n  value: unknown,\n): boolean {\n  const inputs = tNode.inputs?.[publicName];\n  const hostDirectiveInputs = tNode.hostDirectiveInputs?.[publicName];\n  let hasMatch = false;\n\n  if (hostDirectiveInputs) {\n    for (let i = 0; i < hostDirectiveInputs.length; i += 2) {\n      const index = hostDirectiveInputs[i] as number;\n      ngDevMode && assertIndexInRange(lView, index);\n      const publicName = hostDirectiveInputs[i + 1] as string;\n      const def = tView.data[index] as DirectiveDef<unknown>;\n      writeToDirectiveInput(def, lView[index], publicName, value);\n      hasMatch = true;\n    }\n  }\n\n  if (inputs) {\n    for (const index of inputs) {\n      ngDevMode && assertIndexInRange(lView, index);\n      const instance = lView[index];\n      const def = tView.data[index] as DirectiveDef<any>;\n      writeToDirectiveInput(def, instance, publicName, value);\n      hasMatch = true;\n    }\n  }\n\n  return hasMatch;\n}\n\n/**\n * Sets an input value only on a specific directive and its host directives.\n * @param tNode TNode on which the input is being set.\n * @param tView Current TView\n * @param lView `LView` which contains the directives.\n * @param target Directive on which to set the input.\n * @param publicName Public name of the input being set.\n * @param value Value to set.\n */\nexport function setDirectiveInput(\n  tNode: TNode,\n  tView: TView,\n  lView: LView,\n  target: DirectiveDef<unknown>,\n  publicName: string,\n  value: string,\n): boolean {\n  let hostIndex: number | null = null;\n  let hostDirectivesStart: number | null = null;\n  let hostDirectivesEnd: number | null = null;\n  let hasSet = false;\n\n  if (ngDevMode && !tNode.directiveToIndex?.has(target.type)) {\n    throw new Error(`Node does not have a directive with type ${target.type.name}`);\n  }\n\n  const data = tNode.directiveToIndex!.get(target.type)!;\n\n  if (typeof data === 'number') {\n    hostIndex = data;\n  } else {\n    [hostIndex, hostDirectivesStart, hostDirectivesEnd] = data;\n  }\n\n  if (\n    hostDirectivesStart !== null &&\n    hostDirectivesEnd !== null &&\n    tNode.hostDirectiveInputs?.hasOwnProperty(publicName)\n  ) {\n    const hostDirectiveInputs = tNode.hostDirectiveInputs[publicName];\n\n    for (let i = 0; i < hostDirectiveInputs.length; i += 2) {\n      const index = hostDirectiveInputs[i] as number;\n\n      if (index >= hostDirectivesStart && index <= hostDirectivesEnd) {\n        ngDevMode && assertIndexInRange(lView, index);\n        const def = tView.data[index] as DirectiveDef<unknown>;\n        const hostDirectivePublicName = hostDirectiveInputs[i + 1] as string;\n        writeToDirectiveInput(def, lView[index], hostDirectivePublicName, value);\n        hasSet = true;\n      } else if (index > hostDirectivesEnd) {\n        // Directives here are in ascending order so we can stop looking once we're past the range.\n        break;\n      }\n    }\n  }\n\n  if (hostIndex !== null) {\n    ngDevMode && assertIndexInRange(lView, hostIndex);\n    writeToDirectiveInput(target, lView[hostIndex], publicName, value);\n    hasSet = true;\n  }\n\n  return hasSet;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {retrieveHydrationInfo} from '../../hydration/utils';\nimport {assertEqual, assertNotReactive} from '../../util/assert';\nimport {RenderFlags} from '../interfaces/definition';\nimport {\n  CONTEXT,\n  FLAGS,\n  HOST,\n  HYDRATION,\n  INJECTOR,\n  LView,\n  LViewFlags,\n  QUERIES,\n  TVIEW,\n  TView,\n} from '../interfaces/view';\nimport {profiler} from '../profiler';\nimport {ProfilerEvent} from '../profiler_types';\nimport {executeViewQueryFn, refreshContentQueries} from '../queries/query_execution';\nimport {enterView, leaveView} from '../state';\nimport {getComponentLViewByIndex, isCreationMode} from '../util/view_utils';\n\nimport {executeTemplate} from './shared';\n\nexport function renderComponent(hostLView: LView, componentHostIdx: number) {\n  ngDevMode && assertEqual(isCreationMode(hostLView), true, 'Should be run in creation mode');\n  const componentView = getComponentLViewByIndex(componentHostIdx, hostLView);\n  const componentTView = componentView[TVIEW];\n  syncViewWithBlueprint(componentTView, componentView);\n\n  const hostRNode = componentView[HOST];\n  // Populate an LView with hydration info retrieved from the DOM via TransferState.\n  if (hostRNode !== null && componentView[HYDRATION] === null) {\n    componentView[HYDRATION] = retrieveHydrationInfo(hostRNode, componentView[INJECTOR]);\n  }\n\n  profiler(ProfilerEvent.ComponentStart);\n\n  renderView(componentTView, componentView, componentView[CONTEXT]);\n\n  profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {});\n}\n\n/**   \n * Syncs an LView instance with its blueprint if they have gotten out of sync.\n *\n * Typically, blueprints and their view instances should always be in sync, so the loop here\n * will be skipped. However, consider this case of two components side-by-side:\n *\n * App template:\n * ```html\n * <comp></comp>\n * <comp></comp>\n * ```\n *\n * The following will happen:\n * 1. App template begins processing.\n * 2. First <comp> is matched as a component and its LView is created.\n * 3. Second <comp> is matched as a component and its LView is created.\n * 4. App template completes processing, so it's time to check child templates.\n * 5. First <comp> template is checked. It has a directive, so its def is pushed to blueprint.\n * 6. Second <comp> template is checked. Its blueprint has been updated by the first\n * <comp> template, but its LView was created before this update, so it is out of sync.\n *\n * Note that embedded views inside ngFor loops will never be out of sync because these views\n * are processed as soon as they are created.\n *\n * @param tView The `TView` that contains the blueprint for syncing\n * @param lView The view to sync\n */\nexport function syncViewWithBlueprint(tView: TView, lView: LView) {\n  for (let i = lView.length; i < tView.blueprint.length; i++) {\n    lView.push(tView.blueprint[i]);\n  }\n}\n\n/**\n * Processes a view in the creation mode. This includes a number of steps in a specific order:\n * - creating view query functions (if any);\n * - executing a template function in the creation mode;\n * - updating static queries (if any);\n * - creating child components defined in a given view.\n */\nexport function renderView<T>(tView: TView, lView: LView<T>, context: T): void {\n  ngDevMode && assertEqual(isCreationMode(lView), true, 'Should be run in creation mode');\n  ngDevMode && assertNotReactive(renderView.name);\n  enterView(lView);\n  try {\n    const viewQuery = tView.viewQuery;\n    if (viewQuery !== null) {\n      executeViewQueryFn<T>(RenderFlags.Create, viewQuery, context);\n    }\n\n    // Execute a template associated with this view, if it exists. A template function might not be\n    // defined for the root component views.\n    const templateFn = tView.template;\n    if (templateFn !== null) {\n      executeTemplate<T>(tView, lView, templateFn, RenderFlags.Create, context);\n    }\n\n    // This needs to be set before children are processed to support recursive components.\n    // This must be set to false immediately after the first creation run because in an\n    // ngFor loop, all the views will be created together before update mode runs and turns\n    // off firstCreatePass. If we don't set it here, instances will perform directive\n    // matching, etc again and again.\n    if (tView.firstCreatePass) {\n      tView.firstCreatePass = false;\n    }\n\n    // Mark all queries active in this view as dirty. This is necessary for signal-based queries to\n    // have a clear marking point where we can read query results atomically (for a given view).\n    lView[QUERIES]?.finishViewCreation(tView);\n\n    // We resolve content queries specifically marked as `static` in creation mode. Dynamic\n    // content queries are resolved during change detection (i.e. update mode), after embedded\n    // views are refreshed (see block above).\n    if (tView.staticContentQueries) {\n      refreshContentQueries(tView, lView);\n    }\n\n    // We must materialize query results before child components are processed\n    // in case a child component has projected a container. The LContainer needs\n    // to exist so the embedded views are properly attached by the container.\n    if (tView.staticViewQueries) {\n      executeViewQueryFn<T>(RenderFlags.Update, tView.viewQuery!, context);\n    }\n\n    // Render child component views.\n    const components = tView.components;\n    if (components !== null) {\n      renderChildComponents(lView, components);\n    }\n  } catch (error) {\n    // If we didn't manage to get past the first template pass due to\n    // an error, mark the view as corrupted so we can try to recover.\n    if (tView.firstCreatePass) {\n      tView.incompleteFirstPass = true;\n      tView.firstCreatePass = false;\n    }\n\n    throw error;\n  } finally {\n    lView[FLAGS] &= ~LViewFlags.CreationMode;\n    leaveView();\n  }\n}\n\n/** Renders child components in the current view (creation mode). */\nfunction renderChildComponents(hostLView: LView, components: number[]): void {\n  for (let i = 0; i < components.length; i++) {\n    renderComponent(hostLView, components[i]);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../primitives/signals';\n\nimport {Injector} from '../di/injector';\nimport {DehydratedContainerView} from '../hydration/interfaces';\nimport {hasInSkipHydrationBlockFlag} from '../hydration/skip_hydration';\nimport {assertDefined} from '../util/assert';\n\nimport {assertLContainer, assertTNodeForLView} from './assert';\nimport {renderView} from './instructions/render';\nimport {TNode} from './interfaces/node';\nimport {DECLARATION_LCONTAINER, FLAGS, LView, LViewFlags, QUERIES} from './interfaces/view';\nimport {createLView} from './view/construction';\n\nexport function createAndRenderEmbeddedLView<T>(\n  declarationLView: LView<unknown>,\n  templateTNode: TNode,\n  context: T,\n  options?: {\n    injector?: Injector;\n    embeddedViewInjector?: Injector;\n    dehydratedView?: DehydratedContainerView | null;\n  },\n): LView<T> {\n  const prevConsumer = setActiveConsumer(null);\n  try {\n    const embeddedTView = templateTNode.tView!;\n    ngDevMode && assertDefined(embeddedTView, 'TView must be defined for a template node.');\n    ngDevMode && assertTNodeForLView(templateTNode, declarationLView);\n\n    // Embedded views follow the change detection strategy of the view they're declared in.\n    const isSignalView = declarationLView[FLAGS] & LViewFlags.SignalView;\n    const viewFlags = isSignalView ? LViewFlags.SignalView : LViewFlags.CheckAlways;\n    const embeddedLView = createLView<T>(\n      declarationLView,\n      embeddedTView,\n      context,\n      viewFlags,\n      null,\n      templateTNode,\n      null,\n      null,\n      options?.injector ?? null,\n      options?.embeddedViewInjector ?? null,\n      options?.dehydratedView ?? null,\n    );\n\n    const declarationLContainer = declarationLView[templateTNode.index];\n    ngDevMode && assertLContainer(declarationLContainer);\n    embeddedLView[DECLARATION_LCONTAINER] = declarationLContainer;\n\n    const declarationViewLQueries = declarationLView[QUERIES];\n    if (declarationViewLQueries !== null) {\n      embeddedLView[QUERIES] = declarationViewLQueries.createEmbeddedView(embeddedTView);\n    }\n\n    // execute creation mode of a view\n    renderView(embeddedTView, embeddedLView, context);\n\n    return embeddedLView;\n  } finally {\n    setActiveConsumer(prevConsumer);\n  }\n}\n\n/**\n * Returns whether an elements that belong to a view should be\n * inserted into the DOM. For client-only cases, DOM elements are\n * always inserted. For hydration cases, we check whether serialized\n * info is available for a view and the view is not in a \"skip hydration\"\n * block (in which case view contents was re-created, thus needing insertion).\n */\nexport function shouldAddViewToDom(\n  tNode: TNode,\n  dehydratedView?: DehydratedContainerView | null,\n): boolean {\n  return (\n    !dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode)\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @fileoverview\n *\n * This file provides mechanism by which code relevant to the `TIcuContainerNode` is only loaded if\n * ICU is present in the template.\n */\n\nimport {TIcuContainerNode} from '../interfaces/node';\nimport {RNode} from '../interfaces/renderer_dom';\nimport {LView} from '../interfaces/view';\n\nlet _icuContainerIterate: (\n  tIcuContainerNode: TIcuContainerNode,\n  lView: LView,\n) => () => RNode | null;\n\n/**\n * Iterator which provides ability to visit all of the `TIcuContainerNode` root `RNode`s.\n */\nexport function icuContainerIterate(\n  tIcuContainerNode: TIcuContainerNode,\n  lView: LView,\n): () => RNode | null {\n  return _icuContainerIterate(tIcuContainerNode, lView);\n}\n\n/**\n * Ensures that `IcuContainerVisitor`'s implementation is present.\n *\n * This function is invoked when i18n instruction comes across an ICU. The purpose is to allow the\n * bundler to tree shake ICU logic and only load it if ICU instruction is executed.\n */\nexport function ensureIcuContainerVisitorLoaded(\n  loader: () => (tIcuContainerNode: TIcuContainerNode, lView: LView) => () => RNode | null,\n) {\n  if (_icuContainerIterate === undefined) {\n    // Do not inline this function. We want to keep `ensureIcuContainerVisitorLoaded` light, so it\n    // can be inlined into call-site.\n    _icuContainerIterate = loader();\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ViewEncapsulation} from '../metadata/view';\n\n/**\n * Used by `RendererFactory2` to associate custom rendering data and styles\n * with a rendering implementation.\n *  @publicApi\n */\nexport interface RendererType2 {\n  /**\n   * A unique identifying string for the new renderer, used when creating\n   * unique styles for encapsulation.\n   */\n  id: string;\n  /**\n   * The view encapsulation type, which determines how styles are applied to\n   * DOM elements. One of\n   * - `Emulated` (default): Emulate native scoping of styles.\n   * - `Native`: Use the native encapsulation mechanism of the renderer.\n   * - `ShadowDom`: Use modern [Shadow\n   * DOM](https://w3c.github.io/webcomponents/spec/shadow/) and\n   * create a ShadowRoot for component's host element.\n   * - `None`: Do not provide any template or style encapsulation.\n   */\n  encapsulation: ViewEncapsulation;\n  /**\n   * Defines CSS styles to be stored on a renderer instance.\n   */\n  styles: string[];\n  /**\n   * Defines arbitrary developer-defined data to be stored on a renderer instance.\n   * This is useful for renderers that delegate to other renderers.\n   */\n  data: {[kind: string]: any};\n\n  /**\n   * A function used by the framework to create the list of external runtime style URLs.\n   */\n  getExternalStyles?: ((encapsulationId?: string) => string[]) | null;\n}\n\n/**\n * Flags for renderer-specific style modifiers.\n * @publicApi\n */\nexport enum RendererStyleFlags2 {\n  // TODO(misko): This needs to be refactored into a separate file so that it can be imported from\n  // `node_manipulation.ts` Currently doing the import cause resolution order to change and fails\n  // the tests. The work around is to have hard coded value in `node_manipulation.ts` for now.\n  /**\n   * Marks a style as important.\n   */\n  Important = 1 << 0,\n  /**\n   * Marks a style as using dash case naming (this-is-dash-case).\n   */\n  DashCase = 1 << 1,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {TNode, TNodeFlags} from '../render3/interfaces/node';\n\n/**\n * Checks whether a TNode is considered detached, i.e. not present in the\n * translated i18n template. We should not attempt hydration for such nodes\n * and instead, use a regular \"creation mode\".\n */\nexport function isDetachedByI18n(tNode: TNode) {\n  return (tNode.flags & TNodeFlags.isDetached) === TNodeFlags.isDetached;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {consumerDestroy, setActiveConsumer} from '../../primitives/signals';\n\nimport {NotificationSource} from '../change_detection/scheduling/zoneless_scheduling';\nimport {hasInSkipHydrationBlockFlag} from '../hydration/skip_hydration';\nimport {ViewEncapsulation} from '../metadata/view';\nimport {RendererStyleFlags2} from '../render/api_flags';\nimport {\n  assertDefined,\n  assertEqual,\n  assertFunction,\n  assertNotReactive,\n  assertNumber,\n} from '../util/assert';\n\nimport {isDetachedByI18n} from '../i18n/utils';\nimport {\n  assertLContainer,\n  assertParentView,\n  assertProjectionSlots,\n  assertTNodeForLView,\n} from './assert';\nimport {attachPatchData} from './context_discovery';\nimport {\n  nativeAppendChild,\n  nativeAppendOrInsertBefore,\n  nativeInsertBefore,\n  nativeRemoveNode,\n} from './dom_node_manipulation';\nimport {icuContainerIterate} from './i18n/i18n_tree_shaking';\nimport {CONTAINER_HEADER_OFFSET, LContainer, MOVED_VIEWS, NATIVE} from './interfaces/container';\nimport {ComponentDef} from './interfaces/definition';\nimport {NodeInjectorFactory} from './interfaces/injector';\nimport {unregisterLView} from './interfaces/lview_tracking';\nimport {\n  TElementNode,\n  TIcuContainerNode,\n  TNode,\n  TNodeFlags,\n  TNodeType,\n  TProjectionNode,\n} from './interfaces/node';\nimport {Renderer} from './interfaces/renderer';\nimport {RElement, RNode} from './interfaces/renderer_dom';\nimport {isComponentHost, isDestroyed, isLContainer, isLView} from './interfaces/type_checks';\nimport {\n  CHILD_HEAD,\n  CLEANUP,\n  DECLARATION_COMPONENT_VIEW,\n  DECLARATION_LCONTAINER,\n  DestroyHookData,\n  EFFECTS,\n  ENVIRONMENT,\n  FLAGS,\n  HookData,\n  HookFn,\n  HOST,\n  LView,\n  LViewFlags,\n  NEXT,\n  ON_DESTROY_HOOKS,\n  PARENT,\n  QUERIES,\n  REACTIVE_TEMPLATE_CONSUMER,\n  RENDERER,\n  T_HOST,\n  TVIEW,\n  TView,\n  TViewType,\n} from './interfaces/view';\nimport {assertTNodeType} from './node_assert';\nimport {profiler} from './profiler';\nimport {ProfilerEvent} from './profiler_types';\nimport {getLViewParent, getNativeByTNode, unwrapRNode} from './util/view_utils';\n\nconst enum WalkTNodeTreeAction {\n  /** node create in the native environment. Run on initial creation. */\n  Create = 0,\n\n  /**\n   * node insert in the native environment.\n   * Run when existing node has been detached and needs to be re-attached.\n   */\n  Insert = 1,\n\n  /** node detach from the native environment */\n  Detach = 2,\n\n  /** node destruction using the renderer's API */\n  Destroy = 3,\n}\n\n/**\n * NOTE: for performance reasons, the possible actions are inlined within the function instead of\n * being passed as an argument.\n */\nfunction applyToElementOrContainer(\n  action: WalkTNodeTreeAction,\n  renderer: Renderer,\n  parent: RElement | null,\n  lNodeToHandle: RNode | LContainer | LView,\n  beforeNode?: RNode | null,\n) {\n  // If this slot was allocated for a text node dynamically created by i18n, the text node itself\n  // won't be created until i18nApply() in the update block, so this node should be skipped.\n  // For more info, see \"ICU expressions should work inside an ngTemplateOutlet inside an ngFor\"\n  // in `i18n_spec.ts`.\n  if (lNodeToHandle != null) {\n    let lContainer: LContainer | undefined;\n    let isComponent = false;\n    // We are expecting an RNode, but in the case of a component or LContainer the `RNode` is\n    // wrapped in an array which needs to be unwrapped. We need to know if it is a component and if\n    // it has LContainer so that we can process all of those cases appropriately.\n    if (isLContainer(lNodeToHandle)) {\n      lContainer = lNodeToHandle;\n    } else if (isLView(lNodeToHandle)) {\n      isComponent = true;\n      ngDevMode && assertDefined(lNodeToHandle[HOST], 'HOST must be defined for a component LView');\n      lNodeToHandle = lNodeToHandle[HOST]!;\n    }\n    const rNode: RNode = unwrapRNode(lNodeToHandle);\n\n    if (action === WalkTNodeTreeAction.Create && parent !== null) {\n      if (beforeNode == null) {\n        nativeAppendChild(renderer, parent, rNode);\n      } else {\n        nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);\n      }\n    } else if (action === WalkTNodeTreeAction.Insert && parent !== null) {\n      nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);\n    } else if (action === WalkTNodeTreeAction.Detach) {\n      nativeRemoveNode(renderer, rNode, isComponent);\n    } else if (action === WalkTNodeTreeAction.Destroy) {\n      ngDevMode && ngDevMode.rendererDestroyNode++;\n      renderer.destroyNode!(rNode);\n    }\n    if (lContainer != null) {\n      applyContainer(renderer, action, lContainer, parent, beforeNode);\n    }\n  }\n}\n\n/**\n * Removes all DOM elements associated with a view.\n *\n * Because some root nodes of the view may be containers, we sometimes need\n * to propagate deeply into the nested containers to remove all elements in the\n * views beneath it.\n *\n * @param tView The `TView' of the `LView` from which elements should be added or removed\n * @param lView The view from which elements should be added or removed\n */\nexport function removeViewFromDOM(tView: TView, lView: LView): void {\n  detachViewFromDOM(tView, lView);\n  lView[HOST] = null;\n  lView[T_HOST] = null;\n}\n\n/**\n * Adds all DOM elements associated with a view.\n *\n * Because some root nodes of the view may be containers, we sometimes need\n * to propagate deeply into the nested containers to add all elements in the\n * views beneath it.\n *\n * @param tView The `TView' of the `LView` from which elements should be added or removed\n * @param parentTNode The `TNode` where the `LView` should be attached to.\n * @param renderer Current renderer to use for DOM manipulations.\n * @param lView The view from which elements should be added or removed\n * @param parentNativeNode The parent `RElement` where it should be inserted into.\n * @param beforeNode The node before which elements should be added, if insert mode\n */\nexport function addViewToDOM(\n  tView: TView,\n  parentTNode: TNode,\n  renderer: Renderer,\n  lView: LView,\n  parentNativeNode: RElement,\n  beforeNode: RNode | null,\n): void {\n  lView[HOST] = parentNativeNode;\n  lView[T_HOST] = parentTNode;\n  applyView(tView, lView, renderer, WalkTNodeTreeAction.Insert, parentNativeNode, beforeNode);\n}\n\n/**\n * Detach a `LView` from the DOM by detaching its nodes.\n *\n * @param tView The `TView' of the `LView` to be detached\n * @param lView the `LView` to be detached.\n */\nexport function detachViewFromDOM(tView: TView, lView: LView) {\n  // When we remove a view from the DOM, we need to rerun afterRender hooks\n  // We don't necessarily needs to run change detection. DOM removal only requires\n  // change detection if animations are enabled (this notification is handled by animations).\n  lView[ENVIRONMENT].changeDetectionScheduler?.notify(NotificationSource.ViewDetachedFromDOM);\n  applyView(tView, lView, lView[RENDERER], WalkTNodeTreeAction.Detach, null, null);\n}\n\n/**\n * Traverses down and up the tree of views and containers to remove listeners and\n * call onDestroy callbacks.\n *\n * Notes:\n *  - Because it's used for onDestroy calls, it needs to be bottom-up.\n *  - Must process containers instead of their views to avoid splicing\n *  when views are destroyed and re-added.\n *  - Using a while loop because it's faster than recursion\n *  - Destroy only called on movement to sibling or movement to parent (laterally or up)\n *\n *  @param rootView The view to destroy\n */\nexport function destroyViewTree(rootView: LView): void {\n  // If the view has no children, we can clean it up and return early.\n  let lViewOrLContainer = rootView[CHILD_HEAD];\n  if (!lViewOrLContainer) {\n    return cleanUpView(rootView[TVIEW], rootView);\n  }\n\n  while (lViewOrLContainer) {\n    let next: LView | LContainer | null = null;\n\n    if (isLView(lViewOrLContainer)) {\n      // If LView, traverse down to child.\n      next = lViewOrLContainer[CHILD_HEAD];\n    } else {\n      ngDevMode && assertLContainer(lViewOrLContainer);\n      // If container, traverse down to its first LView.\n      const firstView: LView | undefined = lViewOrLContainer[CONTAINER_HEADER_OFFSET];\n      if (firstView) next = firstView;\n    }\n\n    if (!next) {\n      // Only clean up view when moving to the side or up, as destroy hooks\n      // should be called in order from the bottom up.\n      while (lViewOrLContainer && !lViewOrLContainer![NEXT] && lViewOrLContainer !== rootView) {\n        if (isLView(lViewOrLContainer)) {\n          cleanUpView(lViewOrLContainer[TVIEW], lViewOrLContainer);\n        }\n        lViewOrLContainer = lViewOrLContainer[PARENT];\n      }\n      if (lViewOrLContainer === null) lViewOrLContainer = rootView;\n      if (isLView(lViewOrLContainer)) {\n        cleanUpView(lViewOrLContainer[TVIEW], lViewOrLContainer);\n      }\n      next = lViewOrLContainer && lViewOrLContainer![NEXT];\n    }\n    lViewOrLContainer = next;\n  }\n}\n\nexport function detachMovedView(declarationContainer: LContainer, lView: LView) {\n  ngDevMode && assertLContainer(declarationContainer);\n  ngDevMode &&\n    assertDefined(\n      declarationContainer[MOVED_VIEWS],\n      'A projected view should belong to a non-empty projected views collection',\n    );\n  const movedViews = declarationContainer[MOVED_VIEWS]!;\n  const declarationViewIndex = movedViews.indexOf(lView);\n  movedViews.splice(declarationViewIndex, 1);\n}\n\n/**\n * A standalone function which destroys an LView,\n * conducting clean up (e.g. removing listeners, calling onDestroys).\n *\n * @param tView The `TView' of the `LView` to be destroyed\n * @param lView The view to be destroyed.\n */\nexport function destroyLView(tView: TView, lView: LView) {\n  if (isDestroyed(lView)) {\n    return;\n  }\n\n  const renderer = lView[RENDERER];\n\n  if (renderer.destroyNode) {\n    applyView(tView, lView, renderer, WalkTNodeTreeAction.Destroy, null, null);\n  }\n\n  destroyViewTree(lView);\n}\n\n/**\n * Calls onDestroys hooks for all directives and pipes in a given view and then removes all\n * listeners. Listeners are removed as the last step so events delivered in the onDestroys hooks\n * can be propagated to @Output listeners.\n *\n * @param tView `TView` for the `LView` to clean up.\n * @param lView The LView to clean up\n */\nfunction cleanUpView(tView: TView, lView: LView): void {\n  if (isDestroyed(lView)) {\n    return;\n  }\n\n  const prevConsumer = setActiveConsumer(null);\n  try {\n    // Usually the Attached flag is removed when the view is detached from its parent, however\n    // if it's a root view, the flag won't be unset hence why we're also removing on destroy.\n    lView[FLAGS] &= ~LViewFlags.Attached;\n\n    // Mark the LView as destroyed *before* executing the onDestroy hooks. An onDestroy hook\n    // runs arbitrary user code, which could include its own `viewRef.destroy()` (or similar). If\n    // We don't flag the view as destroyed before the hooks, this could lead to an infinite loop.\n    // This also aligns with the ViewEngine behavior. It also means that the onDestroy hook is\n    // really more of an \"afterDestroy\" hook if you think about it.\n    lView[FLAGS] |= LViewFlags.Destroyed;\n\n    lView[REACTIVE_TEMPLATE_CONSUMER] && consumerDestroy(lView[REACTIVE_TEMPLATE_CONSUMER]);\n\n    executeOnDestroys(tView, lView);\n    processCleanups(tView, lView);\n    // For component views only, the local renderer is destroyed at clean up time.\n    if (lView[TVIEW].type === TViewType.Component) {\n      ngDevMode && ngDevMode.rendererDestroy++;\n      lView[RENDERER].destroy();\n    }\n\n    const declarationContainer = lView[DECLARATION_LCONTAINER];\n    // we are dealing with an embedded view that is still inserted into a container\n    if (declarationContainer !== null && isLContainer(lView[PARENT])) {\n      // and this is a projected view\n      if (declarationContainer !== lView[PARENT]) {\n        detachMovedView(declarationContainer, lView);\n      }\n\n      // For embedded views still attached to a container: remove query result from this view.\n      const lQueries = lView[QUERIES];\n      if (lQueries !== null) {\n        lQueries.detachView(tView);\n      }\n    }\n\n    // Unregister the view once everything else has been cleaned up.\n    unregisterLView(lView);\n  } finally {\n    setActiveConsumer(prevConsumer);\n  }\n}\n\n/** Removes listeners and unsubscribes from output subscriptions */\nfunction processCleanups(tView: TView, lView: LView): void {\n  ngDevMode && assertNotReactive(processCleanups.name);\n  const tCleanup = tView.cleanup;\n  const lCleanup = lView[CLEANUP]!;\n  if (tCleanup !== null) {\n    for (let i = 0; i < tCleanup.length - 1; i += 2) {\n      if (typeof tCleanup[i] === 'string') {\n        // This is a native DOM listener. It will occupy 4 entries in the TCleanup array (hence i +=\n        // 2 at the end of this block).\n        const targetIdx = tCleanup[i + 3];\n        ngDevMode && assertNumber(targetIdx, 'cleanup target must be a number');\n        if (targetIdx >= 0) {\n          // Destroy anything whose teardown is a function call (e.g. QueryList, ModelSignal).\n          lCleanup[targetIdx]();\n        } else {\n          // Subscription\n          lCleanup[-targetIdx].unsubscribe();\n        }\n        i += 2;\n      } else {\n        // This is a cleanup function that is grouped with the index of its context\n        const context = lCleanup[tCleanup[i + 1]];\n        tCleanup[i].call(context);\n      }\n    }\n  }\n  if (lCleanup !== null) {\n    lView[CLEANUP] = null;\n  }\n  const destroyHooks = lView[ON_DESTROY_HOOKS];\n  if (destroyHooks !== null) {\n    // Reset the ON_DESTROY_HOOKS array before iterating over it to prevent hooks that unregister\n    // themselves from mutating the array during iteration.\n    lView[ON_DESTROY_HOOKS] = null;\n    for (let i = 0; i < destroyHooks.length; i++) {\n      const destroyHooksFn = destroyHooks[i];\n      ngDevMode && assertFunction(destroyHooksFn, 'Expecting destroy hook to be a function.');\n      destroyHooksFn();\n    }\n  }\n\n  // Destroy effects registered to the view. Many of these will have been processed above.\n  const effects = lView[EFFECTS];\n  if (effects !== null) {\n    lView[EFFECTS] = null;\n    for (const effect of effects) {\n      effect.destroy();\n    }\n  }\n}\n\n/** Calls onDestroy hooks for this view */\nfunction executeOnDestroys(tView: TView, lView: LView): void {\n  ngDevMode && assertNotReactive(executeOnDestroys.name);\n  let destroyHooks: DestroyHookData | null;\n\n  if (tView != null && (destroyHooks = tView.destroyHooks) != null) {\n    for (let i = 0; i < destroyHooks.length; i += 2) {\n      const context = lView[destroyHooks[i] as number];\n\n      // Only call the destroy hook if the context has been requested.\n      if (!(context instanceof NodeInjectorFactory)) {\n        const toCall = destroyHooks[i + 1] as HookFn | HookData;\n\n        if (Array.isArray(toCall)) {\n          for (let j = 0; j < toCall.length; j += 2) {\n            const callContext = context[toCall[j] as number];\n            const hook = toCall[j + 1] as HookFn;\n            profiler(ProfilerEvent.LifecycleHookStart, callContext, hook);\n            try {\n              hook.call(callContext);\n            } finally {\n              profiler(ProfilerEvent.LifecycleHookEnd, callContext, hook);\n            }\n          }\n        } else {\n          profiler(ProfilerEvent.LifecycleHookStart, context, toCall);\n          try {\n            toCall.call(context);\n          } finally {\n            profiler(ProfilerEvent.LifecycleHookEnd, context, toCall);\n          }\n        }\n      }\n    }\n  }\n}\n\n/**\n * Returns a native element if a node can be inserted into the given parent.\n *\n * There are two reasons why we may not be able to insert a element immediately.\n * - Projection: When creating a child content element of a component, we have to skip the\n *   insertion because the content of a component will be projected.\n *   `<component><content>delayed due to projection</content></component>`\n * - Parent container is disconnected: This can happen when we are inserting a view into\n *   parent container, which itself is disconnected. For example the parent container is part\n *   of a View which has not be inserted or is made for projection but has not been inserted\n *   into destination.\n *\n * @param tView: Current `TView`.\n * @param tNode: `TNode` for which we wish to retrieve render parent.\n * @param lView: Current `LView`.\n */\nexport function getParentRElement(tView: TView, tNode: TNode, lView: LView): RElement | null {\n  return getClosestRElement(tView, tNode.parent, lView);\n}\n\n/**\n * Get closest `RElement` or `null` if it can't be found.\n *\n * If `TNode` is `TNodeType.Element` => return `RElement` at `LView[tNode.index]` location.\n * If `TNode` is `TNodeType.ElementContainer|IcuContain` => return the parent (recursively).\n * If `TNode` is `null` then return host `RElement`:\n *   - return `null` if projection\n *   - return `null` if parent container is disconnected (we have no parent.)\n *\n * @param tView: Current `TView`.\n * @param tNode: `TNode` for which we wish to retrieve `RElement` (or `null` if host element is\n *     needed).\n * @param lView: Current `LView`.\n * @returns `null` if the `RElement` can't be determined at this time (no parent / projection)\n */\nexport function getClosestRElement(\n  tView: TView,\n  tNode: TNode | null,\n  lView: LView,\n): RElement | null {\n  let parentTNode: TNode | null = tNode;\n  // Skip over element and ICU containers as those are represented by a comment node and\n  // can't be used as a render parent. Also skip let declarations since they don't have a\n  // corresponding DOM node at all.\n  while (\n    parentTNode !== null &&\n    parentTNode.type & (TNodeType.ElementContainer | TNodeType.Icu | TNodeType.LetDeclaration)\n  ) {\n    tNode = parentTNode;\n    parentTNode = tNode.parent;\n  }\n\n  // If the parent tNode is null, then we are inserting across views: either into an embedded view\n  // or a component view.\n  if (parentTNode === null) {\n    // We are inserting a root element of the component view into the component host element and\n    // it should always be eager.\n    return lView[HOST];\n  } else {\n    ngDevMode && assertTNodeType(parentTNode, TNodeType.AnyRNode | TNodeType.Container);\n    if (isComponentHost(parentTNode)) {\n      ngDevMode && assertTNodeForLView(parentTNode, lView);\n      const {encapsulation} = tView.data[\n        parentTNode.directiveStart + parentTNode.componentOffset\n      ] as ComponentDef<unknown>;\n      // We've got a parent which is an element in the current view. We just need to verify if the\n      // parent element is not a component. Component's content nodes are not inserted immediately\n      // because they will be projected, and so doing insert at this point would be wasteful.\n      // Since the projection would then move it to its final destination. Note that we can't\n      // make this assumption when using the Shadow DOM, because the native projection placeholders\n      // (<content> or <slot>) have to be in place as elements are being inserted.\n      if (\n        encapsulation === ViewEncapsulation.None ||\n        encapsulation === ViewEncapsulation.Emulated\n      ) {\n        return null;\n      }\n    }\n\n    return getNativeByTNode(parentTNode, lView) as RElement;\n  }\n}\n\n/**\n * Find a node in front of which `currentTNode` should be inserted.\n *\n * This method determines the `RNode` in front of which we should insert the `currentRNode`. This\n * takes `TNode.insertBeforeIndex` into account if i18n code has been invoked.\n *\n * @param parentTNode parent `TNode`\n * @param currentTNode current `TNode` (The node which we would like to insert into the DOM)\n * @param lView current `LView`\n */\nfunction getInsertInFrontOfRNode(\n  parentTNode: TNode,\n  currentTNode: TNode,\n  lView: LView,\n): RNode | null {\n  return _getInsertInFrontOfRNodeWithI18n(parentTNode, currentTNode, lView);\n}\n\n/**\n * Find a node in front of which `currentTNode` should be inserted. (Does not take i18n into\n * account)\n *\n * This method determines the `RNode` in front of which we should insert the `currentRNode`. This\n * does not take `TNode.insertBeforeIndex` into account.\n *\n * @param parentTNode parent `TNode`\n * @param currentTNode current `TNode` (The node which we would like to insert into the DOM)\n * @param lView current `LView`\n */\nexport function getInsertInFrontOfRNodeWithNoI18n(\n  parentTNode: TNode,\n  currentTNode: TNode,\n  lView: LView,\n): RNode | null {\n  if (parentTNode.type & (TNodeType.ElementContainer | TNodeType.Icu)) {\n    return getNativeByTNode(parentTNode, lView);\n  }\n  return null;\n}\n\n/**\n * Tree shakable boundary for `getInsertInFrontOfRNodeWithI18n` function.\n *\n * This function will only be set if i18n code runs.\n */\nlet _getInsertInFrontOfRNodeWithI18n: (\n  parentTNode: TNode,\n  currentTNode: TNode,\n  lView: LView,\n) => RNode | null = getInsertInFrontOfRNodeWithNoI18n;\n\n/**\n * Tree shakable boundary for `processI18nInsertBefore` function.\n *\n * This function will only be set if i18n code runs.\n */\nlet _processI18nInsertBefore: (\n  renderer: Renderer,\n  childTNode: TNode,\n  lView: LView,\n  childRNode: RNode | RNode[],\n  parentRElement: RElement | null,\n) => void;\n\nexport function setI18nHandling(\n  getInsertInFrontOfRNodeWithI18n: (\n    parentTNode: TNode,\n    currentTNode: TNode,\n    lView: LView,\n  ) => RNode | null,\n  processI18nInsertBefore: (\n    renderer: Renderer,\n    childTNode: TNode,\n    lView: LView,\n    childRNode: RNode | RNode[],\n    parentRElement: RElement | null,\n  ) => void,\n) {\n  _getInsertInFrontOfRNodeWithI18n = getInsertInFrontOfRNodeWithI18n;\n  _processI18nInsertBefore = processI18nInsertBefore;\n}\n\n/**\n * Appends the `child` native node (or a collection of nodes) to the `parent`.\n *\n * @param tView The `TView' to be appended\n * @param lView The current LView\n * @param childRNode The native child (or children) that should be appended\n * @param childTNode The TNode of the child element\n */\nexport function appendChild(\n  tView: TView,\n  lView: LView,\n  childRNode: RNode | RNode[],\n  childTNode: TNode,\n): void {\n  const parentRNode = getParentRElement(tView, childTNode, lView);\n  const renderer = lView[RENDERER];\n  const parentTNode: TNode = childTNode.parent || lView[T_HOST]!;\n  const anchorNode = getInsertInFrontOfRNode(parentTNode, childTNode, lView);\n  if (parentRNode != null) {\n    if (Array.isArray(childRNode)) {\n      for (let i = 0; i < childRNode.length; i++) {\n        nativeAppendOrInsertBefore(renderer, parentRNode, childRNode[i], anchorNode, false);\n      }\n    } else {\n      nativeAppendOrInsertBefore(renderer, parentRNode, childRNode, anchorNode, false);\n    }\n  }\n\n  _processI18nInsertBefore !== undefined &&\n    _processI18nInsertBefore(renderer, childTNode, lView, childRNode, parentRNode);\n}\n\n/**\n * Returns the first native node for a given LView, starting from the provided TNode.\n *\n * Native nodes are returned in the order in which those appear in the native tree (DOM).\n */\nexport function getFirstNativeNode(lView: LView, tNode: TNode | null): RNode | null {\n  if (tNode !== null) {\n    ngDevMode &&\n      assertTNodeType(\n        tNode,\n        TNodeType.AnyRNode |\n          TNodeType.AnyContainer |\n          TNodeType.Icu |\n          TNodeType.Projection |\n          TNodeType.LetDeclaration,\n      );\n\n    const tNodeType = tNode.type;\n    if (tNodeType & TNodeType.AnyRNode) {\n      return getNativeByTNode(tNode, lView);\n    } else if (tNodeType & TNodeType.Container) {\n      return getBeforeNodeForView(-1, lView[tNode.index]);\n    } else if (tNodeType & TNodeType.ElementContainer) {\n      const elIcuContainerChild = tNode.child;\n      if (elIcuContainerChild !== null) {\n        return getFirstNativeNode(lView, elIcuContainerChild);\n      } else {\n        const rNodeOrLContainer = lView[tNode.index];\n        if (isLContainer(rNodeOrLContainer)) {\n          return getBeforeNodeForView(-1, rNodeOrLContainer);\n        } else {\n          return unwrapRNode(rNodeOrLContainer);\n        }\n      }\n    } else if (tNodeType & TNodeType.LetDeclaration) {\n      return getFirstNativeNode(lView, tNode.next);\n    } else if (tNodeType & TNodeType.Icu) {\n      let nextRNode = icuContainerIterate(tNode as TIcuContainerNode, lView);\n      let rNode: RNode | null = nextRNode();\n      // If the ICU container has no nodes, than we use the ICU anchor as the node.\n      return rNode || unwrapRNode(lView[tNode.index]);\n    } else {\n      const projectionNodes = getProjectionNodes(lView, tNode);\n      if (projectionNodes !== null) {\n        if (Array.isArray(projectionNodes)) {\n          return projectionNodes[0];\n        }\n        const parentView = getLViewParent(lView[DECLARATION_COMPONENT_VIEW]);\n        ngDevMode && assertParentView(parentView);\n        return getFirstNativeNode(parentView!, projectionNodes);\n      } else {\n        return getFirstNativeNode(lView, tNode.next);\n      }\n    }\n  }\n\n  return null;\n}\n\nexport function getProjectionNodes(lView: LView, tNode: TNode | null): TNode | RNode[] | null {\n  if (tNode !== null) {\n    const componentView = lView[DECLARATION_COMPONENT_VIEW];\n    const componentHost = componentView[T_HOST] as TElementNode;\n    const slotIdx = tNode.projection as number;\n    ngDevMode && assertProjectionSlots(lView);\n    return componentHost.projection![slotIdx];\n  }\n  return null;\n}\n\nexport function getBeforeNodeForView(\n  viewIndexInContainer: number,\n  lContainer: LContainer,\n): RNode | null {\n  const nextViewIndex = CONTAINER_HEADER_OFFSET + viewIndexInContainer + 1;\n  if (nextViewIndex < lContainer.length) {\n    const lView = lContainer[nextViewIndex] as LView;\n    const firstTNodeOfView = lView[TVIEW].firstChild;\n    if (firstTNodeOfView !== null) {\n      return getFirstNativeNode(lView, firstTNodeOfView);\n    }\n  }\n\n  return lContainer[NATIVE];\n}\n\n/**\n * Performs the operation of `action` on the node. Typically this involves inserting or removing\n * nodes on the LView or projection boundary.\n */\nfunction applyNodes(\n  renderer: Renderer,\n  action: WalkTNodeTreeAction,\n  tNode: TNode | null,\n  lView: LView,\n  parentRElement: RElement | null,\n  beforeNode: RNode | null,\n  isProjection: boolean,\n) {\n  while (tNode != null) {\n    ngDevMode && assertTNodeForLView(tNode, lView);\n\n    // Let declarations don't have corresponding DOM nodes so we skip over them.\n    if (tNode.type === TNodeType.LetDeclaration) {\n      tNode = tNode.next;\n      continue;\n    }\n\n    ngDevMode &&\n      assertTNodeType(\n        tNode,\n        TNodeType.AnyRNode | TNodeType.AnyContainer | TNodeType.Projection | TNodeType.Icu,\n      );\n    const rawSlotValue = lView[tNode.index];\n    const tNodeType = tNode.type;\n    if (isProjection) {\n      if (action === WalkTNodeTreeAction.Create) {\n        rawSlotValue && attachPatchData(unwrapRNode(rawSlotValue), lView);\n        tNode.flags |= TNodeFlags.isProjected;\n      }\n    }\n    if (!isDetachedByI18n(tNode)) {\n      if (tNodeType & TNodeType.ElementContainer) {\n        applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false);\n        applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);\n      } else if (tNodeType & TNodeType.Icu) {\n        const nextRNode = icuContainerIterate(tNode as TIcuContainerNode, lView);\n        let rNode: RNode | null;\n        while ((rNode = nextRNode())) {\n          applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);\n        }\n        applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);\n      } else if (tNodeType & TNodeType.Projection) {\n        applyProjectionRecursive(\n          renderer,\n          action,\n          lView,\n          tNode as TProjectionNode,\n          parentRElement,\n          beforeNode,\n        );\n      } else {\n        ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode | TNodeType.Container);\n        applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);\n      }\n    }\n    tNode = isProjection ? tNode.projectionNext : tNode.next;\n  }\n}\n\n/**\n * `applyView` performs operation on the view as specified in `action` (insert, detach, destroy)\n *\n * Inserting a view without projection or containers at top level is simple. Just iterate over the\n * root nodes of the View, and for each node perform the `action`.\n *\n * Things get more complicated with containers and projections. That is because coming across:\n * - Container: implies that we have to insert/remove/destroy the views of that container as well\n *              which in turn can have their own Containers at the View roots.\n * - Projection: implies that we have to insert/remove/destroy the nodes of the projection. The\n *               complication is that the nodes we are projecting can themselves have Containers\n *               or other Projections.\n *\n * As you can see this is a very recursive problem. Yes recursion is not most efficient but the\n * code is complicated enough that trying to implemented with recursion becomes unmaintainable.\n *\n * @param tView The `TView' which needs to be inserted, detached, destroyed\n * @param lView The LView which needs to be inserted, detached, destroyed.\n * @param renderer Renderer to use\n * @param action action to perform (insert, detach, destroy)\n * @param parentRElement parent DOM element for insertion (Removal does not need it).\n * @param beforeNode Before which node the insertions should happen.\n */\nfunction applyView(\n  tView: TView,\n  lView: LView,\n  renderer: Renderer,\n  action: WalkTNodeTreeAction.Destroy,\n  parentRElement: null,\n  beforeNode: null,\n): void;\nfunction applyView(\n  tView: TView,\n  lView: LView,\n  renderer: Renderer,\n  action: WalkTNodeTreeAction,\n  parentRElement: RElement | null,\n  beforeNode: RNode | null,\n): void;\nfunction applyView(\n  tView: TView,\n  lView: LView,\n  renderer: Renderer,\n  action: WalkTNodeTreeAction,\n  parentRElement: RElement | null,\n  beforeNode: RNode | null,\n): void {\n  applyNodes(renderer, action, tView.firstChild, lView, parentRElement, beforeNode, false);\n}\n\n/**\n * `applyProjection` performs operation on the projection.\n *\n * Inserting a projection requires us to locate the projected nodes from the parent component. The\n * complication is that those nodes themselves could be re-projected from their parent component.\n *\n * @param tView The `TView` of `LView` which needs to be inserted, detached, destroyed\n * @param lView The `LView` which needs to be inserted, detached, destroyed.\n * @param tProjectionNode node to project\n */\nexport function applyProjection(tView: TView, lView: LView, tProjectionNode: TProjectionNode) {\n  const renderer = lView[RENDERER];\n  const parentRNode = getParentRElement(tView, tProjectionNode, lView);\n  const parentTNode = tProjectionNode.parent || lView[T_HOST]!;\n  let beforeNode = getInsertInFrontOfRNode(parentTNode, tProjectionNode, lView);\n  applyProjectionRecursive(\n    renderer,\n    WalkTNodeTreeAction.Create,\n    lView,\n    tProjectionNode,\n    parentRNode,\n    beforeNode,\n  );\n}\n\n/**\n * `applyProjectionRecursive` performs operation on the projection specified by `action` (insert,\n * detach, destroy)\n *\n * Inserting a projection requires us to locate the projected nodes from the parent component. The\n * complication is that those nodes themselves could be re-projected from their parent component.\n *\n * @param renderer Render to use\n * @param action action to perform (insert, detach, destroy)\n * @param lView The LView which needs to be inserted, detached, destroyed.\n * @param tProjectionNode node to project\n * @param parentRElement parent DOM element for insertion/removal.\n * @param beforeNode Before which node the insertions should happen.\n */\nfunction applyProjectionRecursive(\n  renderer: Renderer,\n  action: WalkTNodeTreeAction,\n  lView: LView,\n  tProjectionNode: TProjectionNode,\n  parentRElement: RElement | null,\n  beforeNode: RNode | null,\n) {\n  const componentLView = lView[DECLARATION_COMPONENT_VIEW];\n  const componentNode = componentLView[T_HOST] as TElementNode;\n  ngDevMode &&\n    assertEqual(typeof tProjectionNode.projection, 'number', 'expecting projection index');\n  const nodeToProjectOrRNodes = componentNode.projection![tProjectionNode.projection]!;\n  if (Array.isArray(nodeToProjectOrRNodes)) {\n    // This should not exist, it is a bit of a hack. When we bootstrap a top level node and we\n    // need to support passing projectable nodes, so we cheat and put them in the TNode\n    // of the Host TView. (Yes we put instance info at the T Level). We can get away with it\n    // because we know that TView is not shared and therefore it will not be a problem.\n    // This should be refactored and cleaned up.\n    for (let i = 0; i < nodeToProjectOrRNodes.length; i++) {\n      const rNode = nodeToProjectOrRNodes[i];\n      applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);\n    }\n  } else {\n    let nodeToProject: TNode | null = nodeToProjectOrRNodes;\n    const projectedComponentLView = componentLView[PARENT] as LView;\n    // If a parent <ng-content> is located within a skip hydration block,\n    // annotate an actual node that is being projected with the same flag too.\n    if (hasInSkipHydrationBlockFlag(tProjectionNode)) {\n      nodeToProject.flags |= TNodeFlags.inSkipHydrationBlock;\n    }\n    applyNodes(\n      renderer,\n      action,\n      nodeToProject,\n      projectedComponentLView,\n      parentRElement,\n      beforeNode,\n      true,\n    );\n  }\n}\n\n/**\n * `applyContainer` performs an operation on the container and its views as specified by\n * `action` (insert, detach, destroy)\n *\n * Inserting a Container is complicated by the fact that the container may have Views which\n * themselves have containers or projections.\n *\n * @param renderer Renderer to use\n * @param action action to perform (insert, detach, destroy)\n * @param lContainer The LContainer which needs to be inserted, detached, destroyed.\n * @param parentRElement parent DOM element for insertion/removal.\n * @param beforeNode Before which node the insertions should happen.\n */\nfunction applyContainer(\n  renderer: Renderer,\n  action: WalkTNodeTreeAction,\n  lContainer: LContainer,\n  parentRElement: RElement | null,\n  beforeNode: RNode | null | undefined,\n) {\n  ngDevMode && assertLContainer(lContainer);\n  const anchor = lContainer[NATIVE]; // LContainer has its own before node.\n  const native = unwrapRNode(lContainer);\n  // An LContainer can be created dynamically on any node by injecting ViewContainerRef.\n  // Asking for a ViewContainerRef on an element will result in a creation of a separate anchor\n  // node (comment in the DOM) that will be different from the LContainer's host node. In this\n  // particular case we need to execute action on 2 nodes:\n  // - container's host node (this is done in the executeActionOnElementOrContainer)\n  // - container's host node (this is done here)\n  if (anchor !== native) {\n    // This is very strange to me (Misko). I would expect that the native is same as anchor. I\n    // don't see a reason why they should be different, but they are.\n    //\n    // If they are we need to process the second anchor as well.\n    applyToElementOrContainer(action, renderer, parentRElement, anchor, beforeNode);\n  }\n  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {\n    const lView = lContainer[i] as LView;\n    applyView(lView[TVIEW], lView, renderer, action, parentRElement, anchor);\n  }\n}\n\n/**\n * Writes class/style to element.\n *\n * @param renderer Renderer to use.\n * @param isClassBased `true` if it should be written to `class` (`false` to write to `style`)\n * @param rNode The Node to write to.\n * @param prop Property to write to. This would be the class/style name.\n * @param value Value to write. If `null`/`undefined`/`false` this is considered a remove (set/add\n *        otherwise).\n */\nexport function applyStyling(\n  renderer: Renderer,\n  isClassBased: boolean,\n  rNode: RElement,\n  prop: string,\n  value: any,\n) {\n  if (isClassBased) {\n    // We actually want JS true/false here because any truthy value should add the class\n    if (!value) {\n      ngDevMode && ngDevMode.rendererRemoveClass++;\n      renderer.removeClass(rNode, prop);\n    } else {\n      ngDevMode && ngDevMode.rendererAddClass++;\n      renderer.addClass(rNode, prop);\n    }\n  } else {\n    let flags = prop.indexOf('-') === -1 ? undefined : (RendererStyleFlags2.DashCase as number);\n    if (value == null /** || value === undefined */) {\n      ngDevMode && ngDevMode.rendererRemoveStyle++;\n      renderer.removeStyle(rNode, prop, flags);\n    } else {\n      // A value is important if it ends with `!important`. The style\n      // parser strips any semicolons at the end of the value.\n      const isImportant = typeof value === 'string' ? value.endsWith('!important') : false;\n\n      if (isImportant) {\n        // !important has to be stripped from the value for it to be valid.\n        value = value.slice(0, -10);\n        flags! |= RendererStyleFlags2.Important;\n      }\n\n      ngDevMode && ngDevMode.rendererSetStyle++;\n      renderer.setStyle(rNode, prop, value, flags);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertParentView} from './assert';\nimport {icuContainerIterate} from './i18n/i18n_tree_shaking';\nimport {CONTAINER_HEADER_OFFSET, LContainer, NATIVE} from './interfaces/container';\nimport {TIcuContainerNode, TNode, TNodeType} from './interfaces/node';\nimport {RNode} from './interfaces/renderer_dom';\nimport {isLContainer} from './interfaces/type_checks';\nimport {DECLARATION_COMPONENT_VIEW, HOST, LView, TVIEW, TView} from './interfaces/view';\nimport {assertTNodeType} from './node_assert';\nimport {getProjectionNodes} from './node_manipulation';\nimport {getLViewParent, unwrapRNode} from './util/view_utils';\n\nexport function collectNativeNodes(\n  tView: TView,\n  lView: LView,\n  tNode: TNode | null,\n  result: any[],\n  isProjection: boolean = false,\n): any[] {\n  while (tNode !== null) {\n    // Let declarations don't have corresponding DOM nodes so we skip over them.\n    if (tNode.type === TNodeType.LetDeclaration) {\n      tNode = isProjection ? tNode.projectionNext : tNode.next;\n      continue;\n    }\n\n    ngDevMode &&\n      assertTNodeType(\n        tNode,\n        TNodeType.AnyRNode | TNodeType.AnyContainer | TNodeType.Projection | TNodeType.Icu,\n      );\n\n    const lNode = lView[tNode.index];\n    if (lNode !== null) {\n      result.push(unwrapRNode(lNode));\n    }\n\n    // A given lNode can represent either a native node or a LContainer (when it is a host of a\n    // ViewContainerRef). When we find a LContainer we need to descend into it to collect root nodes\n    // from the views in this container.\n    if (isLContainer(lNode)) {\n      collectNativeNodesInLContainer(lNode, result);\n    }\n\n    const tNodeType = tNode.type;\n    if (tNodeType & TNodeType.ElementContainer) {\n      collectNativeNodes(tView, lView, tNode.child, result);\n    } else if (tNodeType & TNodeType.Icu) {\n      const nextRNode = icuContainerIterate(tNode as TIcuContainerNode, lView);\n      let rNode: RNode | null;\n      while ((rNode = nextRNode())) {\n        result.push(rNode);\n      }\n    } else if (tNodeType & TNodeType.Projection) {\n      const nodesInSlot = getProjectionNodes(lView, tNode);\n      if (Array.isArray(nodesInSlot)) {\n        result.push(...nodesInSlot);\n      } else {\n        const parentView = getLViewParent(lView[DECLARATION_COMPONENT_VIEW])!;\n        ngDevMode && assertParentView(parentView);\n        collectNativeNodes(parentView[TVIEW], parentView, nodesInSlot, result, true);\n      }\n    }\n    tNode = isProjection ? tNode.projectionNext : tNode.next;\n  }\n\n  return result;\n}\n\n/**\n * Collects all root nodes in all views in a given LContainer.\n */\nexport function collectNativeNodesInLContainer(lContainer: LContainer, result: any[]) {\n  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {\n    const lViewInAContainer = lContainer[i];\n    const lViewFirstChildTNode = lViewInAContainer[TVIEW].firstChild;\n    if (lViewFirstChildTNode !== null) {\n      collectNativeNodes(lViewInAContainer[TVIEW], lViewInAContainer, lViewFirstChildTNode, result);\n    }\n  }\n\n  // When an LContainer is created, the anchor (comment) node is:\n  // - (1) either reused in case of an ElementContainer (<ng-container>)\n  // - (2) or a new comment node is created\n  // In the first case, the anchor comment node would be added to the final\n  // list by the code in the `collectNativeNodes` function\n  // (see the `result.push(unwrapRNode(lNode))` line), but the second\n  // case requires extra handling: the anchor node needs to be added to the\n  // final list manually. See additional information in the `createAnchorNode`\n  // function in the `view_container_ref.ts`.\n  //\n  // In the first case, the same reference would be stored in the `NATIVE`\n  // and `HOST` slots in an LContainer. Otherwise, this is the second case and\n  // we should add an element to the final list.\n  if (lContainer[NATIVE] !== lContainer[HOST]) {\n    result.push(lContainer[NATIVE]);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {AFTER_RENDER_SEQUENCES_TO_ADD, LView} from '../interfaces/view';\n\nexport function addAfterRenderSequencesForView(lView: LView) {\n  if (lView[AFTER_RENDER_SEQUENCES_TO_ADD] !== null) {\n    for (const sequence of lView[AFTER_RENDER_SEQUENCES_TO_ADD]) {\n      sequence.impl.addSequence(sequence);\n    }\n    lView[AFTER_RENDER_SEQUENCES_TO_ADD].length = 0;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {REACTIVE_NODE, ReactiveNode} from '../../primitives/signals';\n\nimport {\n  LView,\n  PARENT,\n  REACTIVE_TEMPLATE_CONSUMER,\n  TVIEW,\n  TView,\n  TViewType,\n} from './interfaces/view';\nimport {getLViewParent, markAncestorsForTraversal, markViewForRefresh} from './util/view_utils';\nimport {assertDefined} from '../util/assert';\n\nlet freeConsumers: ReactiveNode[] = [];\nexport interface ReactiveLViewConsumer extends ReactiveNode {\n  lView: LView | null;\n}\n\n/**\n * Create a new template consumer pointing at the specified LView.\n * Sometimes, a previously created consumer may be reused, in order to save on allocations. In that\n * case, the LView will be updated.\n */\nexport function getOrBorrowReactiveLViewConsumer(lView: LView): ReactiveLViewConsumer {\n  return lView[REACTIVE_TEMPLATE_CONSUMER] ?? borrowReactiveLViewConsumer(lView);\n}\n\nfunction borrowReactiveLViewConsumer(lView: LView): ReactiveLViewConsumer {\n  const consumer = freeConsumers.pop() ?? Object.create(REACTIVE_LVIEW_CONSUMER_NODE);\n  consumer.lView = lView;\n  return consumer;\n}\n\nexport function maybeReturnReactiveLViewConsumer(consumer: ReactiveLViewConsumer): void {\n  if (consumer.lView![REACTIVE_TEMPLATE_CONSUMER] === consumer) {\n    // The consumer got committed.\n    return;\n  }\n  consumer.lView = null;\n  freeConsumers.push(consumer);\n}\n\nexport const REACTIVE_LVIEW_CONSUMER_NODE: Omit<ReactiveLViewConsumer, 'lView'> = {\n  ...REACTIVE_NODE,\n  consumerIsAlwaysLive: true,\n  kind: 'template',\n  consumerMarkedDirty: (node: ReactiveLViewConsumer) => {\n    markAncestorsForTraversal(node.lView!);\n  },\n  consumerOnSignalRead(this: ReactiveLViewConsumer): void {\n    this.lView![REACTIVE_TEMPLATE_CONSUMER] = this;\n  },\n};\n\n/**\n * Creates a temporary consumer for use with `LView`s that should not have consumers.\n * If the LView already has a consumer, returns the existing one instead.\n *\n * This is necessary because some APIs may cause change detection directly on an LView\n * that we do not want to have a consumer (Embedded views today). As a result, there\n * would be no active consumer from running change detection on its host component\n * and any signals in the LView template would be untracked. Instead, we create\n * this temporary consumer that marks the first parent that _should_ have a consumer\n * for refresh. Once change detection runs as part of that refresh, we throw away\n * this consumer because its signals will then be tracked by the parent's consumer.\n */\nexport function getOrCreateTemporaryConsumer(lView: LView): ReactiveLViewConsumer {\n  const consumer = lView[REACTIVE_TEMPLATE_CONSUMER] ?? Object.create(TEMPORARY_CONSUMER_NODE);\n  consumer.lView = lView;\n  return consumer;\n}\n\nexport const TEMPORARY_CONSUMER_NODE = {\n  ...REACTIVE_NODE,\n  consumerIsAlwaysLive: true,\n  kind: 'template',\n  consumerMarkedDirty: (node: ReactiveLViewConsumer) => {\n    let parent = getLViewParent(node.lView!);\n    while (parent && !viewShouldHaveReactiveConsumer(parent[TVIEW])) {\n      parent = getLViewParent(parent);\n    }\n    if (!parent) {\n      // If we can't find an appropriate parent that should have a consumer, we\n      // don't have a way of appropriately refreshing this LView as part of application synchronization.\n      return;\n    }\n\n    markViewForRefresh(parent);\n  },\n  consumerOnSignalRead(this: ReactiveLViewConsumer): void {\n    this.lView![REACTIVE_TEMPLATE_CONSUMER] = this;\n  },\n};\n\n/**\n * Indicates if the view should get its own reactive consumer node.\n *\n * In the current design, all embedded views share a consumer with the component view. This allows\n * us to refresh at the component level rather than at a per-view level. In addition, root views get\n * their own reactive node because root component will have a host view that executes the\n * component's host bindings. This needs to be tracked in a consumer as well.\n *\n * To get a more granular change detection than per-component, all we would just need to update the\n * condition here so that a given view gets a reactive consumer which can become dirty independently\n * from its parent component. For example embedded views for signal components could be created with\n * a new type \"SignalEmbeddedView\" and the condition here wouldn't even need updating in order to\n * get granular per-view change detection for signal components.\n */\nexport function viewShouldHaveReactiveConsumer(tView: TView) {\n  return tView.type !== TViewType.Embedded;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EFFECTS, FLAGS, type LView, LViewFlags} from '../interfaces/view';\n\nexport function runEffectsInView(view: LView): void {\n  if (view[EFFECTS] === null) {\n    return;\n  }\n\n  // Since effects can make other effects dirty, we flush them in a loop until there are no more to\n  // flush.\n  let tryFlushEffects = true;\n\n  while (tryFlushEffects) {\n    let foundDirtyEffect = false;\n    for (const effect of view[EFFECTS]) {\n      if (!effect.dirty) {\n        continue;\n      }\n      foundDirtyEffect = true;\n\n      // `runEffectsInView` is called during change detection, and therefore runs\n      // in the Angular zone if it's available.\n      if (effect.zone === null || Zone.current === effect.zone) {\n        effect.run();\n      } else {\n        effect.zone.run(() => effect.run());\n      }\n    }\n\n    // Check if we need to continue flushing. If we didn't find any dirty effects, then there's\n    // no need to loop back. Otherwise, check the view to see if it was marked for traversal\n    // again. If so, there's a chance that one of the effects we ran caused another effect to\n    // become dirty.\n    tryFlushEffects = foundDirtyEffect && !!(view[FLAGS] & LViewFlags.HasChildViewsToRefresh);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  consumerAfterComputation,\n  consumerBeforeComputation,\n  consumerDestroy,\n  consumerPollProducersForChange,\n  getActiveConsumer,\n  ReactiveNode,\n} from '../../../primitives/signals';\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {assertDefined, assertEqual} from '../../util/assert';\nimport {addAfterRenderSequencesForView} from '../after_render/view';\nimport {executeCheckHooks, executeInitAndCheckHooks, incrementInitPhaseFlags} from '../hooks';\nimport {CONTAINER_HEADER_OFFSET, LContainerFlags, MOVED_VIEWS} from '../interfaces/container';\nimport {ComponentTemplate, HostBindingsFunction, RenderFlags} from '../interfaces/definition';\nimport {\n  CONTEXT,\n  EFFECTS_TO_SCHEDULE,\n  ENVIRONMENT,\n  FLAGS,\n  InitPhaseState,\n  LView,\n  LViewFlags,\n  REACTIVE_TEMPLATE_CONSUMER,\n  TVIEW,\n  TView,\n} from '../interfaces/view';\nimport {\n  getOrBorrowReactiveLViewConsumer,\n  getOrCreateTemporaryConsumer,\n  maybeReturnReactiveLViewConsumer,\n  ReactiveLViewConsumer,\n  viewShouldHaveReactiveConsumer,\n} from '../reactive_lview_consumer';\nimport {\n  CheckNoChangesMode,\n  enterView,\n  isExhaustiveCheckNoChanges,\n  isInCheckNoChangesMode,\n  isRefreshingViews,\n  leaveView,\n  setBindingIndex,\n  setBindingRootForHostBindings,\n  setIsInCheckNoChangesMode,\n  setIsRefreshingViews,\n  setSelectedIndex,\n} from '../state';\nimport {getFirstLContainer, getNextLContainer} from '../util/view_traversal_utils';\nimport {\n  getComponentLViewByIndex,\n  isCreationMode,\n  markAncestorsForTraversal,\n  markViewForRefresh,\n  requiresRefreshOrTraversal,\n  resetPreOrderHookFlags,\n  viewAttachedToChangeDetector,\n} from '../util/view_utils';\n\nimport {isDestroyed} from '../interfaces/type_checks';\nimport {profiler} from '../profiler';\nimport {ProfilerEvent} from '../profiler_types';\nimport {executeViewQueryFn, refreshContentQueries} from '../queries/query_execution';\nimport {runEffectsInView} from '../reactivity/view_effect_runner';\nimport {executeTemplate, handleError} from './shared';\n\n/**\n * The maximum number of times the change detection traversal will rerun before throwing an error.\n */\nexport const MAXIMUM_REFRESH_RERUNS = 100;\n\nexport function detectChangesInternal(\n  lView: LView,\n  notifyErrorHandler = true,\n  mode = ChangeDetectionMode.Global,\n) {\n  const environment = lView[ENVIRONMENT];\n  const rendererFactory = environment.rendererFactory;\n\n  // Check no changes mode is a dev only mode used to verify that bindings have not changed\n  // since they were assigned. We do not want to invoke renderer factory functions in that mode\n  // to avoid any possible side-effects.\n  const checkNoChangesMode = !!ngDevMode && isInCheckNoChangesMode();\n\n  if (!checkNoChangesMode) {\n    rendererFactory.begin?.();\n  }\n\n  try {\n    detectChangesInViewWhileDirty(lView, mode);\n  } catch (error) {\n    if (notifyErrorHandler) {\n      handleError(lView, error);\n    }\n    throw error;\n  } finally {\n    if (!checkNoChangesMode) {\n      rendererFactory.end?.();\n    }\n  }\n}\n\nfunction detectChangesInViewWhileDirty(lView: LView, mode: ChangeDetectionMode) {\n  const lastIsRefreshingViewsValue = isRefreshingViews();\n  try {\n    setIsRefreshingViews(true);\n    detectChangesInView(lView, mode);\n\n    // We don't need or want to do any looping when in exhaustive checkNoChanges because we\n    // already traverse all the views and nothing should change so we shouldn't have to do\n    // another pass to pick up new changes.\n    if (ngDevMode && isExhaustiveCheckNoChanges()) {\n      return;\n    }\n\n    let retries = 0;\n    // If after running change detection, this view still needs to be refreshed or there are\n    // descendants views that need to be refreshed due to re-dirtying during the change detection\n    // run, detect changes on the view again. We run change detection in `Targeted` mode to only\n    // refresh views with the `RefreshView` flag.\n       while (requiresRefreshOrTraversal(lView)) {\n      if (retries === MAXIMUM_REFRESH_RERUNS) {\n        throw new RuntimeError(\n          RuntimeErrorCode.INFINITE_CHANGE_DETECTION,\n          ngDevMode &&\n            'Infinite change detection while trying to refresh views. ' +\n              'There may be components which each cause the other to require a refresh, ' +\n              'causing an infinite loop.',\n        );\n      }\n      retries++;\n      // Even if this view is detached, we still detect changes in targeted mode because this was\n      // the root of the change detection run.\n      detectChangesInView(lView, ChangeDetectionMode.Targeted);\n    }\n  } finally {\n    // restore state to what it was before entering this change detection loop\n    setIsRefreshingViews(lastIsRefreshingViewsValue);\n  }\n}\n\nexport function checkNoChangesInternal(\n  lView: LView,\n  mode: CheckNoChangesMode,\n  notifyErrorHandler = true,\n) {\n  setIsInCheckNoChangesMode(mode);\n  try {\n    detectChangesInternal(lView, notifyErrorHandler);\n  } finally {\n    setIsInCheckNoChangesMode(CheckNoChangesMode.Off);\n  }\n}\n\n/**\n * Different modes of traversing the logical view tree during change detection.\n *\n *\n * The change detection traversal algorithm switches between these modes based on various\n * conditions.\n */\nexport const enum ChangeDetectionMode {\n  /**\n   * In `Global` mode, `Dirty` and `CheckAlways` views are refreshed as well as views with the\n   * `RefreshView` flag.\n   */\n  Global,\n  /**\n   * In `Targeted` mode, only views with the `RefreshView` flag or updated signals are refreshed.\n   */\n  Targeted,\n}\n\n/**\n * Processes a view in update mode. This includes a number of steps in a specific order:\n * - executing a template function in update mode;\n * - executing hooks;\n * - refreshing queries;\n * - setting host bindings;\n * - refreshing child (embedded and component) views.\n */\n\nexport function refreshView<T>(\n  tView: TView,\n  lView: LView,\n  templateFn: ComponentTemplate<{}> | null,\n  context: T,\n) {\n  ngDevMode && assertEqual(isCreationMode(lView), false, 'Should be run in update mode');\n\n  if (isDestroyed(lView)) return;\n\n  const flags = lView[FLAGS];\n\n  // Check no changes mode is a dev only mode used to verify that bindings have not changed\n  // since they were assigned. We do not want to execute lifecycle hooks in that mode.\n  const isInCheckNoChangesPass = ngDevMode && isInCheckNoChangesMode();\n  const isInExhaustiveCheckNoChangesPass = ngDevMode && isExhaustiveCheckNoChanges();\n\n  // Start component reactive context\n  // - We might already be in a reactive context if this is an embedded view of the host.\n  // - We might be descending into a view that needs a consumer.\n  enterView(lView);\n  let returnConsumerToPool = true;\n  let prevConsumer: ReactiveNode | null = null;\n  let currentConsumer: ReactiveLViewConsumer | null = null;\n  if (!isInCheckNoChangesPass) {\n    if (viewShouldHaveReactiveConsumer(tView)) {\n      currentConsumer = getOrBorrowReactiveLViewConsumer(lView);\n      prevConsumer = consumerBeforeComputation(currentConsumer);\n    } else if (getActiveConsumer() === null) {\n      // If the current view should not have a reactive consumer but we don't have an active consumer,\n      // we still need to create a temporary consumer to track any signal reads in this template.\n      // This is a rare case that can happen with `viewContainerRef.createEmbeddedView(...).detectChanges()`.\n      // This temporary consumer marks the first parent that _should_ have a consumer for refresh.\n      // Once that refresh happens, the signals will be tracked in the parent consumer and we can destroy\n      // the temporary one.\n      returnConsumerToPool = false;\n      currentConsumer = getOrCreateTemporaryConsumer(lView);\n      prevConsumer = consumerBeforeComputation(currentConsumer);\n    } else if (lView[REACTIVE_TEMPLATE_CONSUMER]) {\n      consumerDestroy(lView[REACTIVE_TEMPLATE_CONSUMER]);\n      lView[REACTIVE_TEMPLATE_CONSUMER] = null;\n    }\n  }\n\n  try {\n    resetPreOrderHookFlags(lView);\n\n    setBindingIndex(tView.bindingStartIndex);\n    if (templateFn !== null) {\n      executeTemplate(tView, lView, templateFn, RenderFlags.Update, context);\n    }\n\n    const hooksInitPhaseCompleted =\n      (flags & LViewFlags.InitPhaseStateMask) === InitPhaseState.InitPhaseCompleted;\n\n    // execute pre-order hooks (OnInit, OnChanges, DoCheck)\n    // PERF WARNING: do NOT extract this to a separate function without running benchmarks\n    if (!isInCheckNoChangesPass) {\n      if (hooksInitPhaseCompleted) {\n        const preOrderCheckHooks = tView.preOrderCheckHooks;\n        if (preOrderCheckHooks !== null) {\n          executeCheckHooks(lView, preOrderCheckHooks, null);\n        }\n      } else {\n        const preOrderHooks = tView.preOrderHooks;\n        if (preOrderHooks !== null) {\n          executeInitAndCheckHooks(lView, preOrderHooks, InitPhaseState.OnInitHooksToBeRun, null);\n        }\n        incrementInitPhaseFlags(lView, InitPhaseState.OnInitHooksToBeRun);\n      }\n    }\n\n    // We do not need to mark transplanted views for refresh when doing exhaustive checks\n    // because all views will be reached anyways during the traversal.\n    if (!isInExhaustiveCheckNoChangesPass) {\n      // First mark transplanted views that are declared in this lView as needing a refresh at their\n      // insertion points. This is needed to avoid the situation where the template is defined in this\n      // `LView` but its declaration appears after the insertion component.\n      markTransplantedViewsForRefresh(lView);\n    }\n    runEffectsInView(lView);\n    detectChangesInEmbeddedViews(lView, ChangeDetectionMode.Global);\n\n    // Content query results must be refreshed before content hooks are called.\n    if (tView.contentQueries !== null) {\n      refreshContentQueries(tView, lView);\n    }\n\n    // execute content hooks (AfterContentInit, AfterContentChecked)\n    // PERF WARNING: do NOT extract this to a separate function without running benchmarks\n    if (!isInCheckNoChangesPass) {\n      if (hooksInitPhaseCompleted) {\n        const contentCheckHooks = tView.contentCheckHooks;\n        if (contentCheckHooks !== null) {\n          executeCheckHooks(lView, contentCheckHooks);\n        }\n      } else {\n        const contentHooks = tView.contentHooks;\n        if (contentHooks !== null) {\n          executeInitAndCheckHooks(\n            lView,\n            contentHooks,\n            InitPhaseState.AfterContentInitHooksToBeRun,\n          );\n        }\n        incrementInitPhaseFlags(lView, InitPhaseState.AfterContentInitHooksToBeRun);\n      }\n    }\n\n    processHostBindingOpCodes(tView, lView);\n\n    // Refresh child component views.\n    const components = tView.components;\n    if (components !== null) {\n      detectChangesInChildComponents(lView, components, ChangeDetectionMode.Global);\n    }\n\n    // View queries must execute after refreshing child components because a template in this view\n    // could be inserted in a child component. If the view query executes before child component\n    // refresh, the template might not yet be inserted.\n    const viewQuery = tView.viewQuery;\n    if (viewQuery !== null) {\n      executeViewQueryFn<T>(RenderFlags.Update, viewQuery, context);\n    }\n\n    // execute view hooks (AfterViewInit, AfterViewChecked)\n    // PERF WARNING: do NOT extract this to a separate function without running benchmarks\n    if (!isInCheckNoChangesPass) {\n      if (hooksInitPhaseCompleted) {\n        const viewCheckHooks = tView.viewCheckHooks;\n        if (viewCheckHooks !== null) {\n          executeCheckHooks(lView, viewCheckHooks);\n        }\n      } else {\n        const viewHooks = tView.viewHooks;\n        if (viewHooks !== null) {\n          executeInitAndCheckHooks(lView, viewHooks, InitPhaseState.AfterViewInitHooksToBeRun);\n        }\n        incrementInitPhaseFlags(lView, InitPhaseState.AfterViewInitHooksToBeRun);\n      }\n    }\n    if (tView.firstUpdatePass === true) {\n      // We need to make sure that we only flip the flag on successful `refreshView` only\n      // Don't do this in `finally` block.\n      // If we did this in `finally` block then an exception could block the execution of styling\n      // instructions which in turn would be unable to insert themselves into the styling linked\n      // list. The result of this would be that if the exception would not be throw on subsequent CD\n      // the styling would be unable to process it data and reflect to the DOM.\n      tView.firstUpdatePass = false;\n    }\n\n    // Schedule any effects that are waiting on the update pass of this view.\n    if (lView[EFFECTS_TO_SCHEDULE]) {\n      for (const notifyEffect of lView[EFFECTS_TO_SCHEDULE]) {\n        notifyEffect();\n      }\n\n      // Once they've been run, we can drop the array.\n      lView[EFFECTS_TO_SCHEDULE] = null;\n    }\n\n    // Do not reset the dirty state when running in check no changes mode. We don't want components\n    // to behave differently depending on whether check no changes is enabled or not. For example:\n    // Marking an OnPush component as dirty from within the `ngAfterViewInit` hook in order to\n    // refresh a `NgClass` binding should work. If we would reset the dirty state in the check\n    // no changes cycle, the component would be not be dirty for the next update pass. This would\n    // be different in production mode where the component dirty state is not reset.\n    if (!isInCheckNoChangesPass) {\n      addAfterRenderSequencesForView(lView);\n\n      lView[FLAGS] &= ~(LViewFlags.Dirty | LViewFlags.FirstLViewPass);\n    }\n  } catch (e) {\n    if (!isInCheckNoChangesPass) {\n      // If refreshing a view causes an error, we need to remark the ancestors as needing traversal\n      // because the error might have caused a situation where views below the current location are\n      // dirty but will be unreachable because the \"has dirty children\" flag in the ancestors has been\n      // cleared during change detection and we failed to run to completion.\n      markAncestorsForTraversal(lView);\n    }\n    throw e;\n  } finally {\n    if (currentConsumer !== null) {\n      consumerAfterComputation(currentConsumer, prevConsumer);\n      if (returnConsumerToPool) {\n        maybeReturnReactiveLViewConsumer(currentConsumer);\n      }\n    }\n    leaveView();\n  }\n}\n\n/**\n * Goes over embedded views (ones created through ViewContainerRef APIs) and refreshes\n * them by executing an associated template function.\n */\nfunction detectChangesInEmbeddedViews(lView: LView, mode: ChangeDetectionMode) {\n  for (\n    let lContainer = getFirstLContainer(lView);\n    lContainer !== null;\n    lContainer = getNextLContainer(lContainer)\n  ) {\n    for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {\n      const embeddedLView = lContainer[i];\n      detectChangesInViewIfAttached(embeddedLView, mode);\n    }\n  }\n}\n\n/**\n * Mark transplanted views as needing to be refreshed at their attachment points.\n *\n * @param lView The `LView` that may have transplanted views.\n */\nfunction markTransplantedViewsForRefresh(lView: LView) {\n  for (\n    let lContainer = getFirstLContainer(lView);\n    lContainer !== null;\n    lContainer = getNextLContainer(lContainer)\n  ) {\n    if (!(lContainer[FLAGS] & LContainerFlags.HasTransplantedViews)) continue;\n\n    const movedViews = lContainer[MOVED_VIEWS]!;\n    ngDevMode && assertDefined(movedViews, 'Transplanted View flags set but missing MOVED_VIEWS');\n    for (let i = 0; i < movedViews.length; i++) {\n      const movedLView = movedViews[i]!;\n      markViewForRefresh(movedLView);\n    }\n  }\n}\n\n/**\n * Detects changes in a component by entering the component view and processing its bindings,\n * queries, etc. if it is CheckAlways, OnPush and Dirty, etc.\n *\n * @param componentHostIdx  Element index in LView[] (adjusted for HEADER_OFFSET)\n */\nfunction detectChangesInComponent(\n  hostLView: LView,\n  componentHostIdx: number,\n  mode: ChangeDetectionMode,\n): void {\n  ngDevMode && assertEqual(isCreationMode(hostLView), false, 'Should be run in update mode');\n  profiler(ProfilerEvent.ComponentStart);\n\n  const componentView = getComponentLViewByIndex(componentHostIdx, hostLView);\n  detectChangesInViewIfAttached(componentView, mode);\n\n  profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {});\n}\n\n/**\n * Visits a view as part of change detection traversal.\n *\n * If the view is detached, no additional traversal happens.\n */\nfunction detectChangesInViewIfAttached(lView: LView, mode: ChangeDetectionMode) {\n  if (!viewAttachedToChangeDetector(lView)) {\n    return;\n  }\n  detectChangesInView(lView, mode);\n}\n\n/**\n * Visits a view as part of change detection traversal.\n *\n * The view is refreshed if:\n * - If the view is CheckAlways or Dirty and ChangeDetectionMode is `Global`\n * - If the view has the `RefreshView` flag\n *\n * The view is not refreshed, but descendants are traversed in `ChangeDetectionMode.Targeted` if the\n * view HasChildViewsToRefresh flag is set.\n */\nfunction detectChangesInView(lView: LView, mode: ChangeDetectionMode) {\n  const isInCheckNoChangesPass = ngDevMode && isInCheckNoChangesMode();\n  const tView = lView[TVIEW];\n  const flags = lView[FLAGS];\n  const consumer = lView[REACTIVE_TEMPLATE_CONSUMER];\n\n  // Refresh CheckAlways views in Global mode.\n  let shouldRefreshView: boolean = !!(\n    mode === ChangeDetectionMode.Global && flags & LViewFlags.CheckAlways\n  );\n\n  // Refresh Dirty views in Global mode, as long as we're not in checkNoChanges.\n  // CheckNoChanges never worked with `OnPush` components because the `Dirty` flag was\n  // cleared before checkNoChanges ran. Because there is now a loop for to check for\n  // backwards views, it gives an opportunity for `OnPush` components to be marked `Dirty`\n  // before the CheckNoChanges pass. We don't want existing errors that are hidden by the\n  // current CheckNoChanges bug to surface when making unrelated changes.\n  shouldRefreshView ||= !!(\n    flags & LViewFlags.Dirty &&\n    mode === ChangeDetectionMode.Global &&\n    !isInCheckNoChangesPass\n  );\n\n  // Always refresh views marked for refresh, regardless of mode.\n  shouldRefreshView ||= !!(flags & LViewFlags.RefreshView);\n\n  // Refresh views when they have a dirty reactive consumer, regardless of mode.\n  shouldRefreshView ||= !!(consumer?.dirty && consumerPollProducersForChange(consumer));\n\n  shouldRefreshView ||= !!(ngDevMode && isExhaustiveCheckNoChanges());\n\n  // Mark the Flags and `ReactiveNode` as not dirty before refreshing the component, so that they\n  // can be re-dirtied during the refresh process.\n  if (consumer) {\n    consumer.dirty = false;\n  }\n  lView[FLAGS] &= ~(LViewFlags.HasChildViewsToRefresh | LViewFlags.RefreshView);\n\n  if (shouldRefreshView) {\n    refreshView(tView, lView, tView.template, lView[CONTEXT]);\n  } else if (flags & LViewFlags.HasChildViewsToRefresh) {\n    if (!isInCheckNoChangesPass) {\n      runEffectsInView(lView);\n    }\n    detectChangesInEmbeddedViews(lView, ChangeDetectionMode.Targeted);\n    const components = tView.components;\n    if (components !== null) {\n      detectChangesInChildComponents(lView, components, ChangeDetectionMode.Targeted);\n    }\n    if (!isInCheckNoChangesPass) {\n      addAfterRenderSequencesForView(lView);\n    }\n  }\n}\n\n/** Refreshes child components in the current view (update mode). */\nfunction detectChangesInChildComponents(\n  hostLView: LView,\n  components: number[],\n  mode: ChangeDetectionMode,\n): void {\n  for (let i = 0; i < components.length; i++) {\n    detectChangesInComponent(hostLView, components[i], mode);\n  }\n}\n\n/**\n * Invoke `HostBindingsFunction`s for view.\n *\n * This methods executes `TView.hostBindingOpCodes`. It is used to execute the\n * `HostBindingsFunction`s associated with the current `LView`.\n *\n * @param tView Current `TView`.\n * @param lView Current `LView`.\n */\nfunction processHostBindingOpCodes(tView: TView, lView: LView): void {\n  const hostBindingOpCodes = tView.hostBindingOpCodes;\n  if (hostBindingOpCodes === null) return;\n  try {\n    for (let i = 0; i < hostBindingOpCodes.length; i++) {\n      const opCode = hostBindingOpCodes[i] as number;\n      if (opCode < 0) {\n        // Negative numbers are element indexes.\n        setSelectedIndex(~opCode);\n      } else {\n        // Positive numbers are NumberTuple which store bindingRootIndex and directiveIndex.\n        const directiveIdx = opCode;\n        const bindingRootIndx = hostBindingOpCodes[++i] as number;\n        const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction<any>;\n        setBindingRootForHostBindings(bindingRootIndx, directiveIdx);\n        const context = lView[directiveIdx];\n        profiler(ProfilerEvent.HostBindingsUpdateStart, context);\n        hostBindingFn(RenderFlags.Update, context);\n        profiler(ProfilerEvent.HostBindingsUpdateEnd, context);\n      }\n    }\n  } finally {\n    setSelectedIndex(-1);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NotificationSource} from '../../change_detection/scheduling/zoneless_scheduling';\nimport {isRootView} from '../interfaces/type_checks';\nimport {ENVIRONMENT, FLAGS, LView, LViewFlags} from '../interfaces/view';\nimport {isRefreshingViews} from '../state';\nimport {getLViewParent} from '../util/view_utils';\n\n/**\n * Marks current view and all ancestors dirty.\n *\n * Returns the root view because it is found as a byproduct of marking the view tree\n * dirty, and can be used by methods that consume markViewDirty() to easily schedule\n * change detection. Otherwise, such methods would need to traverse up the view tree\n * an additional time to get the root view and schedule a tick on it.\n *\n * @param lView The starting LView to mark dirty\n * @returns the root LView\n */\nexport function markViewDirty(lView: LView, source: NotificationSource): LView | null {\n  const dirtyBitsToUse = isRefreshingViews()\n    ? // When we are actively refreshing views, we only use the `Dirty` bit to mark a view\n      // for check. This bit is ignored in ChangeDetectionMode.Targeted, which is used to\n      // synchronously rerun change detection on a specific set of views (those which have\n      // the `RefreshView` flag and those with dirty signal consumers). `LViewFlags.Dirty`\n      // does not support re-entrant change detection on its own.\n      LViewFlags.Dirty\n    : // When we are not actively refreshing a view tree, it is absolutely\n      // valid to update state and mark views dirty. We use the `RefreshView` flag in this\n      // case to allow synchronously rerunning change detection. This applies today to\n      // afterRender hooks as well as animation listeners which execute after detecting\n      // changes in a view when the render factory flushes.\n      LViewFlags.RefreshView | LViewFlags.Dirty;\n  lView[ENVIRONMENT].changeDetectionScheduler?.notify(source);\n  while (lView) {\n    lView[FLAGS] |= dirtyBitsToUse;\n    const parent = getLViewParent(lView);\n    // Stop traversing up as soon as you find a root view that wasn't attached to any container\n    if (isRootView(lView) && !parent) {\n      return lView;\n    }\n    // continue otherwise\n    lView = parent!;\n  }\n  return null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {addToArray, removeFromArray} from '../../util/array_utils';\nimport {assertDefined, assertEqual} from '../../util/assert';\nimport {assertLContainer, assertLView} from '../assert';\nimport {\n  CONTAINER_HEADER_OFFSET,\n  LContainer,\n  LContainerFlags,\n  MOVED_VIEWS,\n  NATIVE,\n} from '../interfaces/container';\nimport {TNode} from '../interfaces/node';\nimport {RComment, RElement} from '../interfaces/renderer_dom';\nimport {isLView} from '../interfaces/type_checks';\nimport {\n  DECLARATION_COMPONENT_VIEW,\n  DECLARATION_LCONTAINER,\n  FLAGS,\n  HYDRATION,\n  LView,\n  LViewFlags,\n  NEXT,\n  PARENT,\n  QUERIES,\n  RENDERER,\n  T_HOST,\n  TView,\n  TVIEW,\n} from '../interfaces/view';\nimport {\n  addViewToDOM,\n  destroyLView,\n  detachMovedView,\n  getBeforeNodeForView,\n  removeViewFromDOM,\n} from '../node_manipulation';\nimport {updateAncestorTraversalFlagsOnAttach} from '../util/view_utils';\n\n/**\n * Creates a LContainer, either from a container instruction, or for a ViewContainerRef.\n *\n * @param hostNative The host element for the LContainer\n * @param hostTNode The host TNode for the LContainer\n * @param currentView The parent view of the LContainer\n * @param native The native comment element\n * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case\n * @returns LContainer\n */\nexport function createLContainer(\n  hostNative: RElement | RComment | LView,\n  currentView: LView,\n  native: RComment,\n  tNode: TNode,\n): LContainer {\n  ngDevMode && assertLView(currentView);\n  const lContainer: LContainer = [\n    hostNative, // host native\n    true, // Boolean `true` in this position signifies that this is an `LContainer`\n    0, // flags\n    currentView, // parent\n    null, // next\n    tNode, // t_host\n    null, // dehydrated views\n    native, // native,\n    null, // view refs\n    null, // moved views\n  ];\n  ngDevMode &&\n    assertEqual(\n      lContainer.length,\n      CONTAINER_HEADER_OFFSET,\n      'Should allocate correct number of slots for LContainer header.',\n    );\n  return lContainer;\n}\n\nexport function getLViewFromLContainer<T>(\n  lContainer: LContainer,\n  index: number,\n): LView<T> | undefined {\n  const adjustedIndex = CONTAINER_HEADER_OFFSET + index;\n  // avoid reading past the array boundaries\n  if (adjustedIndex < lContainer.length) {\n    const lView = lContainer[adjustedIndex];\n    ngDevMode && assertLView(lView);\n    return lView as LView<T>;\n  }\n  return undefined;\n}\n\nexport function addLViewToLContainer(\n  lContainer: LContainer,\n  lView: LView<unknown>,\n  index: number,\n  addToDOM = true,\n): void {\n  const tView = lView[TVIEW];\n\n  // Insert into the view tree so the new view can be change-detected\n  insertView(tView, lView, lContainer, index);\n\n  // Insert elements that belong to this view into the DOM tree\n  if (addToDOM) {\n    const beforeNode = getBeforeNodeForView(index, lContainer);\n    const renderer = lView[RENDERER];\n    const parentRNode = renderer.parentNode(lContainer[NATIVE] as RElement | RComment);\n    if (parentRNode !== null) {\n      addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode);\n    }\n  }\n\n  // When in hydration mode, reset the pointer to the first child in\n  // the dehydrated view. This indicates that the view was hydrated and\n  // further attaching/detaching should work with this view as normal.\n  const hydrationInfo = lView[HYDRATION];\n  if (hydrationInfo !== null && hydrationInfo.firstChild !== null) {\n    hydrationInfo.firstChild = null;\n  }\n}\n\nexport function removeLViewFromLContainer(\n  lContainer: LContainer,\n  index: number,\n): LView<unknown> | undefined {\n  const lView = detachView(lContainer, index);\n  if (lView !== undefined) {\n    destroyLView(lView[TVIEW], lView);\n  }\n  return lView;\n}\n\n/**\n * Detaches a view from a container.\n *\n * This method removes the view from the container's array of active views. It also\n * removes the view's elements from the DOM.\n *\n * @param lContainer The container from which to detach a view\n * @param removeIndex The index of the view to detach\n * @returns Detached LView instance.\n */\nexport function detachView(lContainer: LContainer, removeIndex: number): LView | undefined {\n  if (lContainer.length <= CONTAINER_HEADER_OFFSET) return;\n\n  const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex;\n  const viewToDetach = lContainer[indexInContainer];\n\n  if (viewToDetach) {\n    const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER];\n    if (declarationLContainer !== null && declarationLContainer !== lContainer) {\n      detachMovedView(declarationLContainer, viewToDetach);\n    }\n\n    if (removeIndex > 0) {\n      lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT] as LView;\n    }\n    const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex);\n    removeViewFromDOM(viewToDetach[TVIEW], viewToDetach);\n\n    // notify query that a view has been removed\n    const lQueries = removedLView[QUERIES];\n    if (lQueries !== null) {\n      lQueries.detachView(removedLView[TVIEW]);\n    }\n\n    viewToDetach[PARENT] = null;\n    viewToDetach[NEXT] = null;\n    // Unsets the attached flag\n    viewToDetach[FLAGS] &= ~LViewFlags.Attached;\n  }\n  return viewToDetach;\n}\n\n/**\n * Inserts a view into a container.\n *\n * This adds the view to the container's array of active views in the correct\n * position. It also adds the view's elements to the DOM if the container isn't a\n * root node of another view (in that case, the view's elements will be added when\n * the container's parent view is added later).\n *\n * @param tView The `TView' of the `LView` to insert\n * @param lView The view to insert\n * @param lContainer The container into which the view should be inserted\n * @param index Which index in the container to insert the child view into\n */\nfunction insertView(tView: TView, lView: LView, lContainer: LContainer, index: number) {\n  ngDevMode && assertLView(lView);\n  ngDevMode && assertLContainer(lContainer);\n  const indexInContainer = CONTAINER_HEADER_OFFSET + index;\n  const containerLength = lContainer.length;\n\n  if (index > 0) {\n    // This is a new view, we need to add it to the children.\n    lContainer[indexInContainer - 1][NEXT] = lView;\n  }\n  if (index < containerLength - CONTAINER_HEADER_OFFSET) {\n    lView[NEXT] = lContainer[indexInContainer];\n    addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView);\n  } else {\n    lContainer.push(lView);\n    lView[NEXT] = null;\n  }\n\n  lView[PARENT] = lContainer;\n\n  // track views where declaration and insertion points are different\n  const declarationLContainer = lView[DECLARATION_LCONTAINER];\n  if (declarationLContainer !== null && lContainer !== declarationLContainer) {\n    trackMovedView(declarationLContainer, lView);\n  }\n\n  // notify query that a new view has been added\n  const lQueries = lView[QUERIES];\n  if (lQueries !== null) {\n    lQueries.insertView(tView);\n  }\n\n  updateAncestorTraversalFlagsOnAttach(lView);\n  // Sets the attached flag\n  lView[FLAGS] |= LViewFlags.Attached;\n}\n\n/**\n * Track views created from the declaration container (TemplateRef) and inserted into a\n * different LContainer or attached directly to ApplicationRef.\n */\nexport function trackMovedView(declarationContainer: LContainer, lView: LView) {\n  ngDevMode && assertDefined(lView, 'LView required');\n  ngDevMode && assertLContainer(declarationContainer);\n  const movedViews = declarationContainer[MOVED_VIEWS];\n  const parent = lView[PARENT]!;\n  ngDevMode && assertDefined(parent, 'missing parent');\n  if (isLView(parent)) {\n    declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews;\n  } else {\n    const insertedComponentLView = parent[PARENT]![DECLARATION_COMPONENT_VIEW];\n    ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView');\n    const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW];\n    ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView');\n    if (declaredComponentLView !== insertedComponentLView) {\n      // At this point the declaration-component is not same as insertion-component; this means that\n      // this is a transplanted view. Mark the declared lView as having transplanted views so that\n      // those views can participate in CD.\n      declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews;\n    }\n  }\n  if (movedViews === null) {\n    declarationContainer[MOVED_VIEWS] = [lView];\n  } else {\n    movedViews.push(lView);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {ChangeDetectorRef} from '../change_detection/change_detector_ref';\nimport {NotificationSource} from '../change_detection/scheduling/zoneless_scheduling';\nimport type {ApplicationRef} from '../core';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport type {EmbeddedViewRef} from '../linker/view_ref';\nimport {removeFromArray} from '../util/array_utils';\nimport {assertEqual} from '../util/assert';\n\nimport {collectNativeNodes} from './collect_native_nodes';\nimport {checkNoChangesInternal, detectChangesInternal} from './instructions/change_detection';\nimport {markViewDirty} from './instructions/mark_view_dirty';\nimport {CONTAINER_HEADER_OFFSET, VIEW_REFS} from './interfaces/container';\nimport {isDestroyed, isLContainer, isRootView} from './interfaces/type_checks';\nimport {\n  CONTEXT,\n  DECLARATION_LCONTAINER,\n  FLAGS,\n  LView,\n  LViewFlags,\n  PARENT,\n  TVIEW,\n} from './interfaces/view';\nimport {destroyLView, detachMovedView, detachViewFromDOM} from './node_manipulation';\nimport {CheckNoChangesMode} from './state';\nimport {\n  markViewForRefresh,\n  storeLViewOnDestroy,\n  updateAncestorTraversalFlagsOnAttach,\n  requiresRefreshOrTraversal,\n} from './util/view_utils';\nimport {detachView, trackMovedView} from './view/container';\n\n// Needed due to tsickle downleveling where multiple `implements` with classes creates\n// multiple @extends in Closure annotations, which is illegal. This workaround fixes\n// the multiple @extends by making the annotation @implements instead\ninterface ChangeDetectorRefInterface extends ChangeDetectorRef {}\n\nexport class ViewRef<T> implements EmbeddedViewRef<T>, ChangeDetectorRefInterface {\n  private _appRef: ApplicationRef | null = null;\n  private _attachedToViewContainer = false;\n\n  get rootNodes(): any[] {\n    const lView = this._lView;\n    const tView = lView[TVIEW];\n    return collectNativeNodes(tView, lView, tView.firstChild, []);\n  }\n\n  constructor(\n    /**\n     * This represents `LView` associated with the component when ViewRef is a ChangeDetectorRef.\n     *\n     * When ViewRef is created for a dynamic component, this also represents the `LView` for the\n     * component.\n     *\n     * For a \"regular\" ViewRef created for an embedded view, this is the `LView` for the embedded\n     * view.\n     *\n     * @internal\n     */\n    public _lView: LView,\n\n    /**\n     * This represents the `LView` associated with the point where `ChangeDetectorRef` was\n     * requested.\n     *\n     * This may be different from `_lView` if the `_cdRefInjectingView` is an embedded view.\n     */\n    private _cdRefInjectingView?: LView,\n    readonly notifyErrorHandler = true,\n  ) {}\n\n  get context(): T {\n    return this._lView[CONTEXT] as unknown as T;\n  }\n\n  /**\n   * @deprecated Replacing the full context object is not supported. Modify the context\n   *   directly, or consider using a `Proxy` if you need to replace the full object.\n   * // TODO(devversion): Remove this.\n   */\n  set context(value: T) {\n    if (ngDevMode) {\n      // Note: We have a warning message here because the `@deprecated` JSDoc will not be picked\n      // up for assignments on the setter. We want to let users know about the deprecated usage.\n      console.warn(\n        'Angular: Replacing the `context` object of an `EmbeddedViewRef` is deprecated.',\n      );\n    }\n\n    this._lView[CONTEXT] = value as unknown as {};\n  }\n\n  get destroyed(): boolean {\n    return isDestroyed(this._lView);\n  }\n\n  destroy(): void {\n    if (this._appRef) {\n      this._appRef.detachView(this);\n    } else if (this._attachedToViewContainer) {\n      const parent = this._lView[PARENT];\n      if (isLContainer(parent)) {\n        const viewRefs = parent[VIEW_REFS] as ViewRef<unknown>[] | null;\n        const index = viewRefs ? viewRefs.indexOf(this) : -1;\n        if (index > -1) {\n          ngDevMode &&\n            assertEqual(\n              index,\n              parent.indexOf(this._lView) - CONTAINER_HEADER_OFFSET,\n              'An attached view should be in the same position within its container as its ViewRef in the VIEW_REFS array.',\n            );\n          detachView(parent, index);\n          removeFromArray(viewRefs!, index);\n        }\n      }\n      this._attachedToViewContainer = false;\n    }\n    destroyLView(this._lView[TVIEW], this._lView);\n  }\n\n  onDestroy(callback: Function) {\n    storeLViewOnDestroy(this._lView, callback as () => void);\n  }\n\n  /**\n   * Marks a view and all of its ancestors dirty.\n   *\n   * This can be used to ensure an {@link ChangeDetectionStrategy#OnPush} component is\n   * checked when it needs to be re-rendered but the two normal triggers haven't marked it\n   * dirty (i.e. inputs haven't changed and events haven't fired in the view).\n   *\n   * <!-- TODO: Add a link to a chapter on OnPush components -->\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * ```ts\n   * @Component({\n   *   selector: 'app-root',\n   *   template: `Number of ticks: {{numberOfTicks}}`\n   *   changeDetection: ChangeDetectionStrategy.OnPush,\n   * })\n   * class AppComponent {\n   *   numberOfTicks = 0;\n   *\n   *   constructor(private ref: ChangeDetectorRef) {\n   *     setInterval(() => {\n   *       this.numberOfTicks++;\n   *       // the following is required, otherwise the view will not be updated\n   *       this.ref.markForCheck();\n   *     }, 1000);\n   *   }\n   * }\n   * ```\n   */\n  markForCheck(): void {\n    markViewDirty(this._cdRefInjectingView || this._lView, NotificationSource.MarkForCheck);\n  }\n\n  /**\n   * Detaches the view from the change detection tree.\n   *\n   * Detached views will not be checked during change detection runs until they are\n   * re-attached, even if they are dirty. `detach` can be used in combination with\n   * {@link ChangeDetectorRef#detectChanges} to implement local change\n   * detection checks.\n   *\n   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n   * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * The following example defines a component with a large list of readonly data.\n   * Imagine the data changes constantly, many times per second. For performance reasons,\n   * we want to check and update the list every five seconds. We can do that by detaching\n   * the component's change detector and doing a local check every five seconds.\n   *\n   * ```ts\n   * class DataProvider {\n   *   // in a real application the returned data will be different every time\n   *   get data() {\n   *     return [1,2,3,4,5];\n   *   }\n   * }\n   *\n   * @Component({\n   *   selector: 'giant-list',\n   *   template: `\n   *     <li *ngFor=\"let d of dataProvider.data\">Data {{d}}</li>\n   *   `,\n   * })\n   * class GiantList {\n   *   constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {\n   *     ref.detach();\n   *     setInterval(() => {\n   *       this.ref.detectChanges();\n   *     }, 5000);\n   *   }\n   * }\n   *\n   * @Component({\n   *   selector: 'app',\n   *   providers: [DataProvider],\n   *   template: `\n   *     <giant-list><giant-list>\n   *   `,\n   * })\n   * class App {\n   * }\n   * ```\n   */\n  detach(): void {\n    this._lView[FLAGS] &= ~LViewFlags.Attached;\n  }\n\n  /**\n   * Re-attaches a view to the change detection tree.\n   *\n   * This can be used to re-attach views that were previously detached from the tree\n   * using {@link ChangeDetectorRef#detach}. Views are attached to the tree by default.\n   *\n   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * The following example creates a component displaying `live` data. The component will detach\n   * its change detector from the main change detector tree when the component's live property\n   * is set to false.\n   *\n   * ```ts\n   * class DataProvider {\n   *   data = 1;\n   *\n   *   constructor() {\n   *     setInterval(() => {\n   *       this.data = this.data * 2;\n   *     }, 500);\n   *   }\n   * }\n   *\n   * @Component({\n   *   selector: 'live-data',\n   *   inputs: ['live'],\n   *   template: 'Data: {{dataProvider.data}}'\n   * })\n   * class LiveData {\n   *   constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {}\n   *\n   *   set live(value) {\n   *     if (value) {\n   *       this.ref.reattach();\n   *     } else {\n   *       this.ref.detach();\n   *     }\n   *   }\n   * }\n   *\n   * @Component({\n   *   selector: 'app-root',\n   *   providers: [DataProvider],\n   *   template: `\n   *     Live Update: <input type=\"checkbox\" [(ngModel)]=\"live\">\n   *     <live-data [live]=\"live\"><live-data>\n   *   `,\n   * })\n   * class AppComponent {\n   *   live = true;\n   * }\n   * ```\n   */\n  reattach(): void {\n    updateAncestorTraversalFlagsOnAttach(this._lView);\n    this._lView[FLAGS] |= LViewFlags.Attached;\n  }\n\n  /**\n   * Checks the view and its children.\n   *\n   * This can also be used in combination with {@link ChangeDetectorRef#detach} to implement\n   * local change detection checks.\n   *\n   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n   * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * The following example defines a component with a large list of readonly data.\n   * Imagine, the data changes constantly, many times per second. For performance reasons,\n   * we want to check and update the list every five seconds.\n   *\n   * We can do that by detaching the component's change detector and doing a local change detection\n   * check every five seconds.\n   *\n   * See {@link ChangeDetectorRef#detach} for more information.\n   */\n  detectChanges(): void {\n    // Add `RefreshView` flag to ensure this view is refreshed if not already dirty.\n    // `RefreshView` flag is used intentionally over `Dirty` because it gets cleared before\n    // executing any of the actual refresh code while the `Dirty` flag doesn't get cleared\n    // until the end of the refresh. Using `RefreshView` prevents creating a potential difference\n    // in the state of the LViewFlags during template execution.\n    this._lView[FLAGS] |= LViewFlags.RefreshView;\n    detectChangesInternal(this._lView, this.notifyErrorHandler);\n  }\n\n  /**\n   * Checks the change detector and its children, and throws if any changes are detected.\n   *\n   * This is used in development mode to verify that running change detection doesn't\n   * introduce other changes.\n   */\n  checkNoChanges(): void {\n    if (ngDevMode) {\n      checkNoChangesInternal(\n        this._lView,\n        CheckNoChangesMode.OnlyDirtyViews,\n        this.notifyErrorHandler,\n      );\n    }\n  }\n\n  attachToViewContainerRef() {\n    if (this._appRef) {\n      throw new RuntimeError(\n        RuntimeErrorCode.VIEW_ALREADY_ATTACHED,\n        ngDevMode && 'This view is already attached directly to the ApplicationRef!',\n      );\n    }\n    this._attachedToViewContainer = true;\n  }\n\n  detachFromAppRef() {\n    this._appRef = null;\n    const isRoot = isRootView(this._lView);\n    const declarationContainer = this._lView[DECLARATION_LCONTAINER];\n    if (declarationContainer !== null && !isRoot) {\n      detachMovedView(declarationContainer, this._lView);\n    }\n    detachViewFromDOM(this._lView[TVIEW], this._lView);\n  }\n\n  attachToAppRef(appRef: ApplicationRef) {\n    if (this._attachedToViewContainer) {\n      throw new RuntimeError(\n        RuntimeErrorCode.VIEW_ALREADY_ATTACHED,\n        ngDevMode && 'This view is already attached to a ViewContainer!',\n      );\n    }\n    this._appRef = appRef;\n    const isRoot = isRootView(this._lView);\n    const declarationContainer = this._lView[DECLARATION_LCONTAINER];\n    if (declarationContainer !== null && !isRoot) {\n      trackMovedView(declarationContainer, this._lView);\n    }\n    updateAncestorTraversalFlagsOnAttach(this._lView);\n  }\n}\n\n/**\n * Reports whether the given view is considered dirty according to the different marking mechanisms.\n */\nexport function isViewDirty(view: ViewRef<unknown>): boolean {\n  return requiresRefreshOrTraversal(view._lView) || !!(view._lView[FLAGS] & LViewFlags.Dirty);\n}\n\nexport function markForRefresh(view: ViewRef<unknown>): void {\n  markViewForRefresh(view['_cdRefInjectingView'] || view._lView);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {DehydratedContainerView} from '../hydration/interfaces';\nimport {TContainerNode, TNode, TNodeType} from '../render3/interfaces/node';\nimport {LView} from '../render3/interfaces/view';\nimport {getCurrentTNode, getLView} from '../render3/state';\nimport {createAndRenderEmbeddedLView} from '../render3/view_manipulation';\nimport {ViewRef as R3_ViewRef} from '../render3/view_ref';\nimport {assertDefined} from '../util/assert';\n\nimport {createElementRef, ElementRef} from './element_ref';\nimport {EmbeddedViewRef} from './view_ref';\n\n/**\n * Represents an embedded template that can be used to instantiate embedded views.\n * To instantiate embedded views based on a template, use the `ViewContainerRef`\n * method `createEmbeddedView()`.\n *\n * Access a `TemplateRef` instance by placing a directive on an `<ng-template>`\n * element (or directive prefixed with `*`). The `TemplateRef` for the embedded view\n * is injected into the constructor of the directive,\n * using the `TemplateRef` token.\n *\n * You can also use a `Query` to find a `TemplateRef` associated with\n * a component or a directive.\n *\n * @see {@link ViewContainerRef}\n *\n * @publicApi\n */\nexport abstract class TemplateRef<C> {\n  /**\n   * The anchor element in the parent view for this embedded view.\n   *\n   * The data-binding and [injection contexts](guide/di/dependency-injection-context) of embedded\n   * views created from this `TemplateRef` inherit from the contexts of this location.\n   *\n   * Typically new embedded views are attached to the view container of this location, but in\n   * advanced use-cases, the view can be attached to a different container while keeping the\n   * data-binding and injection context from the original location.\n   *\n   */\n  // TODO(i): rename to anchor or location\n  abstract readonly elementRef: ElementRef;\n\n  /**\n   * Instantiates an unattached embedded view based on this template.\n   * @param context The data-binding context of the embedded view, as declared\n   * in the `<ng-template>` usage.\n   * @param injector Injector to be used within the embedded view.\n   * @returns The new embedded view object.\n   */\n  abstract createEmbeddedView(context: C, injector?: Injector): EmbeddedViewRef<C>;\n\n  /**\n   * Implementation of the `createEmbeddedView` function.\n   *\n   * This implementation is internal and allows framework code\n   * to invoke it with extra parameters (e.g. for hydration) without\n   * affecting public API.\n   *\n   * @internal\n   */\n  abstract createEmbeddedViewImpl(\n    context: C,\n    injector?: Injector,\n    dehydratedView?: DehydratedContainerView | null,\n  ): EmbeddedViewRef<C>;\n\n  /**\n   * Returns an `ssrId` associated with a TView, which was used to\n   * create this instance of the `TemplateRef`.\n   *\n   * @internal\n   */\n  abstract get ssrId(): string | null;\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ELEMENT_ID__: () => TemplateRef<any> | null = injectTemplateRef;\n}\n\nconst ViewEngineTemplateRef = TemplateRef;\n\n// TODO(alxhub): combine interface and implementation. Currently this is challenging since something\n// in g3 depends on them being separate.\nconst R3TemplateRef = class TemplateRef<T> extends ViewEngineTemplateRef<T> {\n  constructor(\n    private _declarationLView: LView,\n    private _declarationTContainer: TContainerNode,\n    public override elementRef: ElementRef,\n  ) {\n    super();\n  }\n\n  /**\n   * Returns an `ssrId` associated with a TView, which was used to\n   * create this instance of the `TemplateRef`.\n   *\n   * @internal\n   */\n  override get ssrId(): string | null {\n    return this._declarationTContainer.tView?.ssrId || null;\n  }\n\n  override createEmbeddedView(context: T, injector?: Injector): EmbeddedViewRef<T> {\n    return this.createEmbeddedViewImpl(context, injector);\n  }\n\n  /**\n   * @internal\n   */\n  override createEmbeddedViewImpl(\n    context: T,\n    injector?: Injector,\n    dehydratedView?: DehydratedContainerView,\n  ): EmbeddedViewRef<T> {\n    const embeddedLView = createAndRenderEmbeddedLView(\n      this._declarationLView,\n      this._declarationTContainer,\n      context,\n      {embeddedViewInjector: injector, dehydratedView},\n    );\n    return new R3_ViewRef<T>(embeddedLView);\n  }\n};\n\n/**\n * Creates a TemplateRef given a node.\n *\n * @returns The TemplateRef instance to use\n */\nexport function injectTemplateRef<T>(): TemplateRef<T> | null {\n  return createTemplateRef<T>(getCurrentTNode()!, getLView());\n}\n\n/**\n * Creates a TemplateRef and stores it on the injector.\n *\n * @param hostTNode The node on which a TemplateRef is requested\n * @param hostLView The `LView` to which the node belongs\n * @returns The TemplateRef instance or null if we can't create a TemplateRef on a given node type\n */\nexport function createTemplateRef<T>(hostTNode: TNode, hostLView: LView): TemplateRef<T> | null {\n  if (hostTNode.type & TNodeType.Container) {\n    ngDevMode && assertDefined(hostTNode.tView, 'TView must be allocated');\n    return new R3TemplateRef(\n      hostLView,\n      hostTNode as TContainerNode,\n      createElementRef(hostTNode, hostLView),\n    );\n  }\n  return null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {getDeclarationComponentDef} from '../render3/instructions/element_validation';\nimport {TNode, TNodeType} from '../render3/interfaces/node';\nimport {RNode} from '../render3/interfaces/renderer_dom';\nimport {HOST, LView, TVIEW} from '../render3/interfaces/view';\nimport {getParentRElement} from '../render3/node_manipulation';\nimport {unwrapRNode} from '../render3/util/view_utils';\n\nimport {markRNodeAsHavingHydrationMismatch} from './utils';\n\nconst AT_THIS_LOCATION = '<-- AT THIS LOCATION';\n\n/**\n * Retrieves a user friendly string for a given TNodeType for use in\n * friendly error messages\n *\n * @param tNodeType\n * @returns\n */\nfunction getFriendlyStringFromTNodeType(tNodeType: TNodeType): string {\n  switch (tNodeType) {\n    case TNodeType.Container:\n      return 'view container';\n    case TNodeType.Element:\n      return 'element';\n    case TNodeType.ElementContainer:\n      return 'ng-container';\n    case TNodeType.Icu:\n      return 'icu';\n    case TNodeType.Placeholder:\n      return 'i18n';\n    case TNodeType.Projection:\n      return 'projection';\n    case TNodeType.Text:\n      return 'text';\n    case TNodeType.LetDeclaration:\n      return '@let';\n    default:\n      // This should not happen as we cover all possible TNode types above.\n      return '<unknown>';\n  }\n}\n\n/**\n * Validates that provided nodes match during the hydration process.\n */\nexport function validateMatchingNode(\n  node: RNode | null,\n  nodeType: number,\n  tagName: string | null,\n  lView: LView,\n  tNode: TNode,\n  isViewContainerAnchor = false,\n): void {\n  if (\n    !node ||\n    (node as Node).nodeType !== nodeType ||\n    ((node as Node).nodeType === Node.ELEMENT_NODE &&\n      (node as HTMLElement).tagName.toLowerCase() !== tagName?.toLowerCase())\n  ) {\n    const expectedNode = shortRNodeDescription(nodeType, tagName, null);\n    let header = `During hydration Angular expected ${expectedNode} but `;\n\n    const hostComponentDef = getDeclarationComponentDef(lView);\n    const componentClassName = hostComponentDef?.type?.name;\n\n    const expectedDom = describeExpectedDom(lView, tNode, isViewContainerAnchor);\n    const expected = `Angular expected this DOM:\\n\\n${expectedDom}\\n\\n`;\n\n    let actual = '';\n    const componentHostElement = unwrapRNode(lView[HOST]!);\n    if (!node) {\n      // No node found during hydration.\n      header += `the node was not found.\\n\\n`;\n\n      // Since the node is missing, we use the closest node to attach the error to\n      markRNodeAsHavingHydrationMismatch(componentHostElement, expectedDom);\n    } else {\n      const actualNode = shortRNodeDescription(\n        (node as Node).nodeType,\n        (node as HTMLElement).tagName ?? null,\n        (node as HTMLElement).textContent ?? null,\n      );\n\n      header += `found ${actualNode}.\\n\\n`;\n      const actualDom = describeDomFromNode(node);\n      actual = `Actual DOM is:\\n\\n${actualDom}\\n\\n`;\n\n      // DevTools only report hydration issues on the component level, so we attach extra debug\n      // info to a component host element to make it available to DevTools.\n      markRNodeAsHavingHydrationMismatch(componentHostElement, expectedDom, actualDom);\n    }\n\n    const footer = getHydrationErrorFooter(componentClassName);\n    const message = header + expected + actual + getHydrationAttributeNote() + footer;\n    throw new RuntimeError(RuntimeErrorCode.HYDRATION_NODE_MISMATCH, message);\n  }\n}\n\n/**\n * Validates that a given node has sibling nodes\n */\nexport function validateSiblingNodeExists(node: RNode | null): void {\n  validateNodeExists(node);\n  if (!node!.nextSibling) {\n    const header = 'During hydration Angular expected more sibling nodes to be present.\\n\\n';\n    const actual = `Actual DOM is:\\n\\n${describeDomFromNode(node!)}\\n\\n`;\n    const footer = getHydrationErrorFooter();\n\n    const message = header + actual + footer;\n\n    markRNodeAsHavingHydrationMismatch(node!, '', actual);\n    throw new RuntimeError(RuntimeErrorCode.HYDRATION_MISSING_SIBLINGS, message);\n  }\n}\n\n/**\n * Validates that a node exists or throws\n */\nexport function validateNodeExists(\n  node: RNode | null,\n  lView: LView | null = null,\n  tNode: TNode | null = null,\n): void {\n  if (!node) {\n    const header =\n      'During hydration, Angular expected an element to be present at this location.\\n\\n';\n    let expected = '';\n    let footer = '';\n    if (lView !== null && tNode !== null) {\n      expected = describeExpectedDom(lView, tNode, false);\n      footer = getHydrationErrorFooter();\n\n      // Since the node is missing, we use the closest node to attach the error to\n      markRNodeAsHavingHydrationMismatch(unwrapRNode(lView[HOST]!), expected, '');\n    }\n\n    throw new RuntimeError(\n      RuntimeErrorCode.HYDRATION_MISSING_NODE,\n      `${header}${expected}\\n\\n${footer}`,\n    );\n  }\n}\n\n/**\n * Builds the hydration error message when a node is not found\n *\n * @param lView the LView where the node exists\n * @param tNode the TNode\n */\nexport function nodeNotFoundError(lView: LView, tNode: TNode): Error {\n  const header = 'During serialization, Angular was unable to find an element in the DOM:\\n\\n';\n  const expected = `${describeExpectedDom(lView, tNode, false)}\\n\\n`;\n  const footer = getHydrationErrorFooter();\n\n  throw new RuntimeError(RuntimeErrorCode.HYDRATION_MISSING_NODE, header + expected + footer);\n}\n\n/**\n * Builds a hydration error message when a node is not found at a path location\n *\n * @param host the Host Node\n * @param path the path to the node\n */\nexport function nodeNotFoundAtPathError(host: Node, path: string): Error {\n  const header =\n    `During hydration Angular was unable to locate a node ` +\n    `using the \"${path}\" path, starting from the ${describeRNode(host)} node.\\n\\n`;\n  const footer = getHydrationErrorFooter();\n\n  markRNodeAsHavingHydrationMismatch(host);\n  throw new RuntimeError(RuntimeErrorCode.HYDRATION_MISSING_NODE, header + footer);\n}\n\n/**\n * Builds the hydration error message in the case that dom nodes are created outside of\n * the Angular context and are being used as projected nodes\n *\n * @param lView the LView\n * @param tNode the TNode\n * @returns an error\n */\nexport function unsupportedProjectionOfDomNodes(rNode: RNode): Error {\n  const header =\n    'During serialization, Angular detected DOM nodes ' +\n    'that were created outside of Angular context and provided as projectable nodes ' +\n    '(likely via `ViewContainerRef.createComponent` or `createComponent` APIs). ' +\n    'Hydration is not supported for such cases, consider refactoring the code to avoid ' +\n    'this pattern or using `ngSkipHydration` on the host element of the component.\\n\\n';\n  const actual = `${describeDomFromNode(rNode)}\\n\\n`;\n  const message = header + actual + getHydrationAttributeNote();\n  return new RuntimeError(RuntimeErrorCode.UNSUPPORTED_PROJECTION_DOM_NODES, message);\n}\n\n/**\n * Builds the hydration error message in the case that ngSkipHydration was used on a\n * node that is not a component host element or host binding\n *\n * @param rNode the HTML Element\n * @returns an error\n */\nexport function invalidSkipHydrationHost(rNode: RNode): Error {\n  const header =\n    'The `ngSkipHydration` flag is applied on a node ' +\n    \"that doesn't act as a component host. Hydration can be \" +\n    'skipped only on per-component basis.\\n\\n';\n  const actual = `${describeDomFromNode(rNode)}\\n\\n`;\n  const footer = 'Please move the `ngSkipHydration` attribute to the component host element.\\n\\n';\n  const message = header + actual + footer;\n  return new RuntimeError(RuntimeErrorCode.INVALID_SKIP_HYDRATION_HOST, message);\n}\n\n// Stringification methods\n\n/**\n * Stringifies a given TNode's attributes\n *\n * @param tNode a provided TNode\n * @returns string\n */\nfunction stringifyTNodeAttrs(tNode: TNode): string {\n  const results = [];\n  if (tNode.attrs) {\n    for (let i = 0; i < tNode.attrs.length; ) {\n      const attrName = tNode.attrs[i++];\n      // Once we reach the first flag, we know that the list of\n      // attributes is over.\n      if (typeof attrName == 'number') {\n        break;\n      }\n      const attrValue = tNode.attrs[i++];\n      results.push(`${attrName}=\"${shorten(attrValue as string)}\"`);\n    }\n  }\n  return results.join(' ');\n}\n\n/**\n * The list of internal attributes that should be filtered out while\n * producing an error message.\n */\nconst internalAttrs = new Set(['ngh', 'ng-version', 'ng-server-context']);\n\n/**\n * Stringifies an HTML Element's attributes\n *\n * @param rNode an HTML Element\n * @returns string\n */\nfunction stringifyRNodeAttrs(rNode: HTMLElement): string {\n  const results = [];\n  for (let i = 0; i < rNode.attributes.length; i++) {\n    const attr = rNode.attributes[i];\n    if (internalAttrs.has(attr.name)) continue;\n    results.push(`${attr.name}=\"${shorten(attr.value)}\"`);\n  }\n  return results.join(' ');\n}\n\n// Methods for Describing the DOM\n\n/**\n * Converts a tNode to a helpful readable string value for use in error messages\n *\n * @param tNode a given TNode\n * @param innerContent the content of the node\n * @returns string\n */\nfunction describeTNode(tNode: TNode, innerContent: string = '…'): string {\n  switch (tNode.type) {\n    case TNodeType.Text:\n      const content = tNode.value ? `(${tNode.value})` : '';\n      return `#text${content}`;\n    case TNodeType.Element:\n      const attrs = stringifyTNodeAttrs(tNode);\n      const tag = tNode.value.toLowerCase();\n      return `<${tag}${attrs ? ' ' + attrs : ''}>${innerContent}</${tag}>`;\n    case TNodeType.ElementContainer:\n      return '<!-- ng-container -->';\n    case TNodeType.Container:\n      return '<!-- container -->';\n    default:\n      const typeAsString = getFriendlyStringFromTNodeType(tNode.type);\n      return `#node(${typeAsString})`;\n  }\n}\n\n/**\n * Converts an RNode to a helpful readable string value for use in error messages\n *\n * @param rNode a given RNode\n * @param innerContent the content of the node\n * @returns string\n */\nfunction describeRNode(rNode: RNode, innerContent: string = '…'): string {\n  const node = rNode as HTMLElement;\n  switch (node.nodeType) {\n    case Node.ELEMENT_NODE:\n      const tag = node.tagName!.toLowerCase();\n      const attrs = stringifyRNodeAttrs(node);\n      return `<${tag}${attrs ? ' ' + attrs : ''}>${innerContent}</${tag}>`;\n    case Node.TEXT_NODE:\n      const content = node.textContent ? shorten(node.textContent) : '';\n      return `#text${content ? `(${content})` : ''}`;\n    case Node.COMMENT_NODE:\n      return `<!-- ${shorten(node.textContent ?? '')} -->`;\n    default:\n      return `#node(${node.nodeType})`;\n  }\n}\n\n/**\n * Builds the string containing the expected DOM present given the LView and TNode\n * values for a readable error message\n *\n * @param lView the lView containing the DOM\n * @param tNode the tNode\n * @param isViewContainerAnchor boolean\n * @returns string\n */\nfunction describeExpectedDom(lView: LView, tNode: TNode, isViewContainerAnchor: boolean): string {\n  const spacer = '  ';\n  let content = '';\n  if (tNode.prev) {\n    content += spacer + '…\\n';\n    content += spacer + describeTNode(tNode.prev) + '\\n';\n  } else if (tNode.type && tNode.type & TNodeType.AnyContainer) {\n    content += spacer + '…\\n';\n  }\n  if (isViewContainerAnchor) {\n    content += spacer + describeTNode(tNode) + '\\n';\n    content += spacer + `<!-- container -->  ${AT_THIS_LOCATION}\\n`;\n  } else {\n    content += spacer + describeTNode(tNode) + `  ${AT_THIS_LOCATION}\\n`;\n  }\n  content += spacer + '…\\n';\n\n  const parentRNode = tNode.type ? getParentRElement(lView[TVIEW], tNode, lView) : null;\n  if (parentRNode) {\n    content = describeRNode(parentRNode as unknown as Node, '\\n' + content);\n  }\n  return content;\n}\n\n/**\n * Builds the string containing the DOM present around a given RNode for a\n * readable error message\n *\n * @param node the RNode\n * @returns string\n */\nfunction describeDomFromNode(node: RNode): string {\n  const spacer = '  ';\n  let content = '';\n  const currentNode = node as HTMLElement;\n  if (currentNode.previousSibling) {\n    content += spacer + '…\\n';\n    content += spacer + describeRNode(currentNode.previousSibling) + '\\n';\n  }\n  content += spacer + describeRNode(currentNode) + `  ${AT_THIS_LOCATION}\\n`;\n  if (node.nextSibling) {\n    content += spacer + '…\\n';\n  }\n  if (node.parentNode) {\n    content = describeRNode(currentNode.parentNode as Node, '\\n' + content);\n  }\n  return content;\n}\n\n/**\n * Shortens the description of a given RNode by its type for readability\n *\n * @param nodeType the type of node\n * @param tagName the node tag name\n * @param textContent the text content in the node\n * @returns string\n */\nfunction shortRNodeDescription(\n  nodeType: number,\n  tagName: string | null,\n  textContent: string | null,\n): string {\n  switch (nodeType) {\n    case Node.ELEMENT_NODE:\n      return `<${tagName!.toLowerCase()}>`;\n    case Node.TEXT_NODE:\n      const content = textContent ? ` (with the \"${shorten(textContent)}\" content)` : '';\n      return `a text node${content}`;\n    case Node.COMMENT_NODE:\n      return 'a comment node';\n    default:\n      return `#node(nodeType=${nodeType})`;\n  }\n}\n\n/**\n * Builds the footer hydration error message\n *\n * @param componentClassName the name of the component class\n * @returns string\n */\nfunction getHydrationErrorFooter(componentClassName?: string): string {\n  const componentInfo = componentClassName ? `the \"${componentClassName}\"` : 'corresponding';\n  return (\n    `To fix this problem:\\n` +\n    `  * check ${componentInfo} component for hydration-related issues\\n` +\n    `  * check to see if your template has valid HTML structure\\n` +\n    `  * or skip hydration by adding the \\`ngSkipHydration\\` attribute ` +\n    `to its host node in a template\\n\\n`\n  );\n}\n\n/**\n * An attribute related note for hydration errors\n */\nfunction getHydrationAttributeNote(): string {\n  return (\n    'Note: attributes are only displayed to better represent the DOM' +\n    ' but have no effect on hydration mismatches.\\n\\n'\n  );\n}\n\n// Node string utility functions\n\n/**\n * Strips all newlines out of a given string\n *\n * @param input a string to be cleared of new line characters\n * @returns\n */\nfunction stripNewlines(input: string): string {\n  return input.replace(/\\s+/gm, '');\n}\n\n/**\n * Reduces a string down to a maximum length of characters with ellipsis for readability\n *\n * @param input a string input\n * @param maxLength a maximum length in characters\n * @returns string\n */\nfunction shorten(input: string | null, maxLength = 50): string {\n  if (!input) {\n    return '';\n  }\n  input = stripNewlines(input);\n  return input.length > maxLength ? `${input.substring(0, maxLength - 1)}…` : input;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertDomNode, assertIndexInRange} from '../util/assert';\n\nimport {TNode, TNodeType} from './interfaces/node';\nimport {Renderer} from './interfaces/renderer';\nimport {RElement, RNode} from './interfaces/renderer_dom';\nimport {LView} from './interfaces/view';\nimport {getInsertInFrontOfRNodeWithNoI18n} from './node_manipulation';\nimport {nativeInsertBefore} from './dom_node_manipulation';\nimport {unwrapRNode} from './util/view_utils';\n\n/**\n * Find a node in front of which `currentTNode` should be inserted (takes i18n into account).\n *\n * This method determines the `RNode` in front of which we should insert the `currentRNode`. This\n * takes `TNode.insertBeforeIndex` into account.\n *\n * @param parentTNode parent `TNode`\n * @param currentTNode current `TNode` (The node which we would like to insert into the DOM)\n * @param lView current `LView`\n */\nexport function getInsertInFrontOfRNodeWithI18n(\n  parentTNode: TNode,\n  currentTNode: TNode,\n  lView: LView,\n): RNode | null {\n  const tNodeInsertBeforeIndex = currentTNode.insertBeforeIndex;\n  const insertBeforeIndex = Array.isArray(tNodeInsertBeforeIndex)\n    ? tNodeInsertBeforeIndex[0]\n    : tNodeInsertBeforeIndex;\n  if (insertBeforeIndex === null) {\n    return getInsertInFrontOfRNodeWithNoI18n(parentTNode, currentTNode, lView);\n  } else {\n    ngDevMode && assertIndexInRange(lView, insertBeforeIndex);\n    return unwrapRNode(lView[insertBeforeIndex]);\n  }\n}\n\n/**\n * Process `TNode.insertBeforeIndex` by adding i18n text nodes.\n *\n * See `TNode.insertBeforeIndex`\n */\nexport function processI18nInsertBefore(\n  renderer: Renderer,\n  childTNode: TNode,\n  lView: LView,\n  childRNode: RNode | RNode[],\n  parentRElement: RElement | null,\n): void {\n  const tNodeInsertBeforeIndex = childTNode.insertBeforeIndex;\n  if (Array.isArray(tNodeInsertBeforeIndex)) {\n    // An array indicates that there are i18n nodes that need to be added as children of this\n    // `childRNode`. These i18n nodes were created before this `childRNode` was available and so\n    // only now can be added. The first element of the array is the normal index where we should\n    // insert the `childRNode`. Additional elements are the extra nodes to be added as children of\n    // `childRNode`.\n    ngDevMode && assertDomNode(childRNode);\n    let i18nParent: RElement | null = childRNode as RElement;\n    let anchorRNode: RNode | null = null;\n    if (!(childTNode.type & TNodeType.AnyRNode)) {\n      anchorRNode = i18nParent;\n      i18nParent = parentRElement;\n    }\n    if (i18nParent !== null && childTNode.componentOffset === -1) {\n      for (let i = 1; i < tNodeInsertBeforeIndex.length; i++) {\n        // No need to `unwrapRNode` because all of the indexes point to i18n text nodes.\n        // see `assertDomNode` below.\n        const i18nChild = lView[tNodeInsertBeforeIndex[i]];\n        nativeInsertBefore(renderer, i18nParent, i18nChild, anchorRNode, false);\n      }\   n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertEqual, assertGreaterThanOrEqual, assertNotSame} from '../util/assert';\nimport {assertTNodeForTView} from './assert';\nimport {\n  TAttributes,\n  TContainerNode,\n  TElementContainerNode,\n  TElementNode,\n  TIcuContainerNode,\n  TLetDeclarationNode,\n  TNode,\n  TNodeFlags,\n  TNodeType,\n  TProjectionNode,\n} from './interfaces/node';\nimport {TStylingRange} from './interfaces/styling';\nimport {HEADER_OFFSET, TView} from './interfaces/view';\nimport {assertPureTNodeType} from './node_assert';\nimport {\n  getCurrentParentTNode,\n  getCurrentTNodePlaceholderOk,\n  isCurrentTNodeParent,\n  isInI18nBlock,\n  isInSkipHydrationBlock,\n  setCurrentTNode,\n} from './state';\n\n/**\n * Create and stores the TNode, and hooks it up to the tree.\n *\n * @param tView The current `TView`.\n * @param index The index at which the TNode should be saved (null if view, since they are not\n * saved).\n * @param type The type of TNode to create\n * @param native The native element for this node, if applicable\n * @param name The tag name of the associated native element, if applicable\n * @param attrs Any attrs for the native element, if applicable\n */\nexport function getOrCreateTNode(\n  tView: TView,\n  index: number,\n  type: TNodeType.Element | TNodeType.Text,\n  name: string | null,\n  attrs: TAttributes | null,\n): TElementNode;\nexport function getOrCreateTNode(\n  tView: TView,\n  index: number,\n  type: TNodeType.Container,\n  name: string | null,\n  attrs: TAttributes | null,\n): TContainerNode;\nexport function getOrCreateTNode(\n  tView: TView,\n  index: number,\n  type: TNodeType.Projection,\n  name: null,\n  attrs: TAttributes | null,\n): TProjectionNode;\nexport function getOrCreateTNode(\n  tView: TView,\n  index: number,\n  type: TNodeType.ElementContainer,\n  name: string | null,\n  attrs: TAttributes | null,\n): TElementContainerNode;\nexport function getOrCreateTNode(\n  tView: TView,\n  index: number,\n  type: TNodeType.Icu,\n  name: null,\n  attrs: TAttributes | null,\n): TElementContainerNode;\nexport function getOrCreateTNode(\n  tView: TView,\n  index: number,\n  type: TNodeType.LetDeclaration,\n  name: null,\n  attrs: null,\n): TLetDeclarationNode;\nexport function getOrCreateTNode(\n  tView: TView,\n  index: number,\n  type: TNodeType,\n  name: string | null,\n  attrs: TAttributes | null,\n): TElementNode &\n  TContainerNode &\n  TElementContainerNode &\n  TProjectionNode &\n  TIcuContainerNode &\n  TLetDeclarationNode {\n  ngDevMode &&\n    index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in\n    // `view_engine_compatibility` for additional context.\n    assertGreaterThanOrEqual(index, HEADER_OFFSET, \"TNodes can't be in the LView header.\");\n  // Keep this function short, so that the VM will inline it.\n  ngDevMode && assertPureTNodeType(type);\n  let tNode = tView.data[index] as TNode;\n  if (tNode === null) {\n    tNode = createTNodeAtIndex(tView, index, type, name, attrs);\n    if (isInI18nBlock()) {\n      // If we are in i18n block then all elements should be pre declared through `Placeholder`\n      // See `TNodeType.Placeholder` and `LFrame.inI18n` for more context.\n      // If the `TNode` was not pre-declared than it means it was not mentioned which means it was\n      // removed, so we mark it as detached.\n      tNode.flags |= TNodeFlags.isDetached;\n    }\n  } else if (tNode.type & TNodeType.Placeholder) {\n    tNode.type = type;\n    tNode.value = name;\n    tNode.attrs = attrs;\n    const parent = getCurrentParentTNode();\n    tNode.injectorIndex = parent === null ? -1 : parent.injectorIndex;\n    ngDevMode && assertTNodeForTView(tNode, tView);\n    ngDevMode && assertEqual(index, tNode.index, 'Expecting same index');\n  }\n  setCurrentTNode(tNode, true);\n  return tNode as TElementNode &\n    TContainerNode &\n    TElementContainerNode &\n    TProjectionNode &\n    TIcuContainerNode;\n}\n\nexport function createTNodeAtIndex(\n  tView: TView,\n  index: number,\n  type: TNodeType,\n  name: string | null,\n  attrs: TAttributes | null,\n) {\n  const currentTNode = getCurrentTNodePlaceholderOk();\n  const isParent = isCurrentTNodeParent();\n  const parent = isParent ? currentTNode : currentTNode && currentTNode.parent;\n\n  // Parents cannot cross component boundaries because components will be used in multiple places.\n  const tNode = (tView.data[index] = createTNode(\n    tView,\n    parent as TElementNode | TContainerNode,\n    type,\n    index,\n    name,\n    attrs,\n  ));\n\n  // Assign a pointer to the first child node of a given view. The first node is not always the one\n  // at index 0, in case of i18n, index 0 can be the instruction `i18nStart` and the first node has\n  // the index 1 or more, so we can't just check node index.\n  linkTNodeInTView(tView, tNode, currentTNode, isParent);\n\n  return tNode;\n}\n\nfunction linkTNodeInTView(\n  tView: TView,\n  tNode: TNode,\n  currentTNode: TNode | null,\n  isParent: boolean,\n) {\n  if (tView.firstChild === null) {\n    tView.firstChild = tNode;\n  }\n  if (currentTNode !== null) {\n    if (isParent) {\n      // FIXME(misko): This logic looks unnecessarily complicated. Could we simplify?\n      if (currentTNode.child == null && tNode.parent !== null) {\n        // We are in the same view, which means we are adding content node to the parent view.\n        currentTNode.child = tNode;\n      }\n    } else {\n      if (currentTNode.next === null) {\n        // In the case of i18n the `currentTNode` may already be linked, in which case we don't want\n        // to break the links which i18n created.\n        currentTNode.next = tNode;\n        tNode.prev = currentTNode;\n      }\n    }\n  }\n}\n\n/**\n * Constructs a TNode object from the arguments.\n *\n * @param tView `TView` to which this `TNode` belongs\n * @param tParent Parent `TNode`\n * @param type The type of the node\n * @param index The index of the TNode in TView.data, adjusted for HEADER_OFFSET\n * @param tagName The tag name of the node\n * @param attrs The attributes defined on this node\n * @returns the TNode object\n */\nexport function createTNode(\n  tView: TView,\n  tParent: TElementNode | TContainerNode | null,\n  type: TNodeType.Container,\n  index: number,\n  tagName: string | null,\n  attrs: TAttributes | null,\n): TContainerNode;\nexport function createTNode(\n  tView: TView,\n  tParent: TElementNode | TContainerNode | null,\n  type: TNodeType.Element | TNodeType.Text,\n  index: number,\n  tagName: string | null,\n  attrs: TAttributes | null,\n): TElementNode;\nexport function createTNode(\n  tView: TView,\n  tParent: TElementNode | TContainerNode | null,\n  type: TNodeType.ElementContainer,\n  index: number,\n  tagName: string | null,\n  attrs: TAttributes | null,\n): TElementContainerNode;\nexport function createTNode(\n  tView: TView,\n  tParent: TElementNode | TContainerNode | null,\n  type: TNodeType.Icu,\n  index: number,\n  tagName: string | null,\n  attrs: TAttributes | null,\n): TIcuContainerNode;\nexport function createTNode(\n  tView: TView,\n  tParent: TElementNode | TContainerNode | null,\n  type: TNodeType.Projection,\n  index: number,\n  tagName: string | null,\n  attrs: TAttributes | null,\n): TProjectionNode;\nexport function createTNode(\n  tView: TView,\n  tParent: TElementNode | TContainerNode | null,\n  type: TNodeType.LetDeclaration,\n  index: number,\n  tagName: null,\n  attrs: null,\n): TLetDeclarationNode;\nexport function createTNode(\n  tView: TView,\n  tParent: TElementNode | TContainerNode | null,\n  type: TNodeType,\n  index: number,\n  tagName: string | null,\n  attrs: TAttributes | null,\n): TNode;\nexport function createTNode(\n  tView: TView,\n  tParent: TElementNode | TContainerNode | null,\n  type: TNodeType,\n  index: number,\n  value: string | null,\n  attrs: TAttributes | null,\n): TNode {\n  ngDevMode &&\n    index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in\n    // `view_engine_compatibility` for additional context.\n    assertGreaterThanOrEqual(index, HEADER_OFFSET, \"TNodes can't be in the LView header.\");\n  ngDevMode && assertNotSame(attrs, undefined, \"'undefined' is not valid value for 'attrs'\");\n  ngDevMode && ngDevMode.tNode++;\n  ngDevMode && tParent && assertTNodeForTView(tParent, tView);\n  let injectorIndex = tParent ? tParent.injectorIndex : -1;\n  let flags = 0;\n  if (isInSkipHydrationBlock()) {\n    flags |= TNodeFlags.inSkipHydrationBlock;\n  }\n\n  // TODO: would it be helpful to use a prototypal inheritance here, similar to the way we do so with signals?\n  const tNode = {\n    type,\n    index,\n    insertBeforeIndex: null,\n    injectorIndex,\n    directiveStart: -1,\n    directiveEnd: -1,\n    directiveStylingLast: -1,\n    componentOffset: -1,\n    propertyBindings: null,\n    flags,\n    providerIndexes: 0,\n    value: value,\n    attrs: attrs,\n    mergedAttrs: null,\n    localNames: null,\n    initialInputs: null,\n    inputs: null,\n    hostDirectiveInputs: null,\n    outputs: null,\n    hostDirectiveOutputs: null,\n    directiveToIndex: null,\n    tView: null,\n    next: null,\n    prev: null,\n    projectionNext: null,\n    child: null,\n    parent: tParent,\n    projection: null,\n    styles: null,\n    stylesWithoutHost: null,\n    residualStyles: undefined,\n    classes: null,\n    classesWithoutHost: null,\n    residualClasses: undefined,\n    classBindings: 0 as TStylingRange,\n    styleBindings: 0 as TStylingRange,\n  };\n\n  if (ngDevMode) {\n    // For performance reasons it is important that the tNode retains the same shape during runtime.\n    // (To make sure that all of the code is monomorphic.) For this reason we seal the object to\n    // prevent class transitions.\n    Object.seal(tNode);\n  }\n\n  return tNode;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertEqual} from '../../util/assert';\nimport {TNode, TNodeType} from '../interfaces/node';\nimport {setI18nHandling} from '../node_manipulation';\nimport {getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore} from '../node_manipulation_i18n';\n\n/**\n * Add `tNode` to `previousTNodes` list and update relevant `TNode`s in `previousTNodes` list\n * `tNode.insertBeforeIndex`.\n *\n * Things to keep in mind:\n * 1. All i18n text nodes are encoded as `TNodeType.Element` and are created eagerly by the\n *    `ɵɵi18nStart` instruction.\n * 2. All `TNodeType.Placeholder` `TNodes` are elements which will be created later by\n *    `ɵɵelementStart` instruction.\n * 3. `ɵɵelementStart` instruction will create `TNode`s in the ascending `TNode.index` order. (So a\n *    smaller index `TNode` is guaranteed to be created before a larger one)\n *\n * We use the above three invariants to determine `TNode.insertBeforeIndex`.\n *\n * In an ideal world `TNode.insertBeforeIndex` would always be `TNode.next.index`. However,\n * this will not work because `TNode.next.index` may be larger than `TNode.index` which means that\n * the next node is not yet created and therefore we can't insert in front of it.\n *\n * Rule1: `TNode.insertBeforeIndex = null` if `TNode.next === null` (Initial condition, as we don't\n *        know if there will be further `TNode`s inserted after.)\n * Rule2: If `previousTNode` is created after the `tNode` being inserted, then\n *        `previousTNode.insertBeforeNode = tNode.index` (So when a new `tNode` is added we check\n *        previous to see if we can update its `insertBeforeTNode`)\n *\n * See `TNode.insertBeforeIndex` for more context.\n *\n * @param previousTNodes A list of previous TNodes so that we can easily traverse `TNode`s in\n *     reverse order. (If `TNode` would have `previous` this would not be necessary.)\n * @param newTNode A TNode to add to the `previousTNodes` list.\n */\nexport function addTNodeAndUpdateInsertBeforeIndex(previousTNodes: TNode[], newTNode: TNode) {\n  // Start with Rule1\n  ngDevMode &&\n    assertEqual(newTNode.insertBeforeIndex, null, 'We expect that insertBeforeIndex is not set');\n\n  previousTNodes.push(newTNode);\n  if (previousTNodes.length > 1) {\n    for (let i = previousTNodes.length - 2; i >= 0; i--) {\n      const existingTNode = previousTNodes[i];\n      // Text nodes are created eagerly and so they don't need their `indexBeforeIndex` updated.\n      // It is safe to ignore them.\n      if (!isI18nText(existingTNode)) {\n        if (\n          isNewTNodeCreatedBefore(existingTNode, newTNode) &&\n          getInsertBeforeIndex(existingTNode) === null\n        ) {\n          // If it was created before us in time, (and it does not yet have `insertBeforeIndex`)\n          // then add the `insertBeforeIndex`.\n          setInsertBeforeIndex(existingTNode, newTNode.index);\n        }\n      }\n    }\n  }\n}\n\nfunction isI18nText(tNode: TNode): boolean {\n  return !(tNode.type & TNodeType.Placeholder);\n}\n\nfunction isNewTNodeCreatedBefore(existingTNode: TNode, newTNode: TNode): boolean {\n  return isI18nText(newTNode) || existingTNode.index > newTNode.index;\n}\n\nfunction getInsertBeforeIndex(tNode: TNode): number | null {\n  const index = tNode.insertBeforeIndex;\n  return Array.isArray(index) ? index[0] : index;\n}\n\nfunction setInsertBeforeIndex(tNode: TNode, value: number): void {\n  const index = tNode.insertBeforeIndex;\n  if (Array.isArray(index)) {\n    // Array is stored if we have to insert child nodes. See `TNode.insertBeforeIndex`\n    index[0] = value;\n  } else {\n    setI18nHandling(getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore);\n    tNode.insertBeforeIndex = value;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  assertEqual,\n  assertGreaterThan,\n  assertGreaterThanOrEqual,\n  throwError,\n} from '../../util/assert';\nimport {assertTIcu, assertTNode} from '../assert';\nimport {IcuCreateOpCode, TIcu} from '../interfaces/i18n';\nimport {TIcuContainerNode, TNode, TNodeType} from '../interfaces/node';\nimport {LView, TView} from '../interfaces/view';\nimport {assertTNodeType} from '../node_assert';\nimport {setI18nHandling} from '../node_manipulation';\nimport {getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore} from '../node_manipulation_i18n';\nimport {createTNodeAtIndex} from '../tnode_manipulation';\n\nimport {addTNodeAndUpdateInsertBeforeIndex} from './i18n_insert_before_index';\n\n/**\n * Retrieve `TIcu` at a given `index`.\n *\n * The `TIcu` can be stored either directly (if it is nested ICU) OR\n * it is stored inside tho `TIcuContainer` if it is top level ICU.\n *\n * The reason for this is that the top level ICU need a `TNode` so that they are part of the render\n * tree, but nested ICU's have no TNode, because we don't know ahead of time if the nested ICU is\n * expressed (parent ICU may have selected a case which does not contain it.)\n *\n * @param tView Current `TView`.\n * @param index Index where the value should be read from.\n */\nexport function getTIcu(tView: TView, index: number): TIcu | null {\n  const value = tView.data[index] as null | TIcu | TIcuContainerNode | string;\n  if (value === null || typeof value === 'string') return null;\n  if (\n    ngDevMode &&\n    !(value.hasOwnProperty('tView') || value.hasOwnProperty('currentCaseLViewIndex'))\n  ) {\n    throwError(\"We expect to get 'null'|'TIcu'|'TIcuContainer', but got: \" + value);\n  }\n  // Here the `value.hasOwnProperty('currentCaseLViewIndex')` is a polymorphic read as it can be\n  // either TIcu or TIcuContainerNode. This is not ideal, but we still think it is OK because it\n  // will be just two cases which fits into the browser inline cache (inline cache can take up to\n  // 4)\n  const tIcu = value.hasOwnProperty('currentCaseLViewIndex')\n    ? (value as TIcu)\n    : (value as TIcuContainerNode).value;\n  ngDevMode && assertTIcu(tIcu);\n  return tIcu;\n}\n\n/**\n * Store `TIcu` at a give `index`.\n *\n * The `TIcu` can be stored either directly (if it is nested ICU) OR\n * it is stored inside tho `TIcuContainer` if it is top level ICU.\n *\n * The reason for this is that the top level ICU need a `TNode` so that they are part of the render\n * tree, but nested ICU's have no TNode, because we don't know ahead of time if the nested ICU is\n * expressed (parent ICU may have selected a case which does not contain it.)\n *\n * @param tView Current `TView`.\n * @param index Index where the value should be stored at in `Tview.data`\n * @param tIcu The TIcu to store.\n */\nexport function setTIcu(tView: TView, index: number, tIcu: TIcu): void {\n  const tNode = tView.data[index] as null | TIcuContainerNode;\n  ngDevMode &&\n    assertEqual(\n      tNode === null || tNode.hasOwnProperty('tView'),\n      true,\n      \"We expect to get 'null'|'TIcuContainer'\",\n    );\n  if (tNode === null) {\n    tView.data[index] = tIcu;\n  } else {\n    ngDevMode && assertTNodeType(tNode, TNodeType.Icu);\n    tNode.value = tIcu;\n  }\n}\n\n/**\n * Set `TNode.insertBeforeIndex` taking the `Array` into account.\n *\n * See `TNode.insertBeforeIndex`\n */\nexport function setTNodeInsertBeforeIndex(tNode: TNode, index: number) {\n  ngDevMode && assertTNode(tNode);\n  let insertBeforeIndex = tNode.insertBeforeIndex;\n  if (insertBeforeIndex === null) {\n    setI18nHandling(getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore);\n    insertBeforeIndex = tNode.insertBeforeIndex = [\n      null! /* may be updated to number later */,\n      index,\n    ];\n  } else {\n    assertEqual(Array.isArray(insertBeforeIndex), true, 'Expecting array here');\n    (insertBeforeIndex as number[]).push(index);\n  }\n}\n\n/**\n * Create `TNode.type=TNodeType.Placeholder` node.\n *\n * See `TNodeType.Placeholder` for more information.\n */\nexport function createTNodePlaceholder(\n  tView: TView,\n  previousTNodes: TNode[],\n  index: number,\n): TNode {\n  const tNode = createTNodeAtIndex(tView, index, TNodeType.Placeholder, null, null);\n  addTNodeAndUpdateInsertBeforeIndex(previousTNodes, tNode);\n  return tNode;\n}\n\n/**\n * Returns current ICU case.\n *\n * ICU cases are stored as index into the `TIcu.cases`.\n * At times it is necessary to communicate that the ICU case just switched and that next ICU update\n * should update all bindings regardless of the mask. In such a case the we store negative numbers\n * for cases which have just been switched. This function removes the negative flag.\n */\nexport function getCurrentICUCaseIndex(tIcu: TIcu, lView: LView) {\n  const currentCase: number | null = lView[tIcu.currentCaseLViewIndex];\n  return currentCase === null ? currentCase : currentCase < 0 ? ~currentCase : currentCase;\n}\n\nexport function getParentFromIcuCreateOpCode(mergedCode: number): number {\n  return mergedCode >>> IcuCreateOpCode.SHIFT_PARENT;\n}\n\nexport function getRefFromIcuCreateOpCode(mergedCode: number): number {\n  return (mergedCode & IcuCreateOpCode.MASK_REF) >>> IcuCreateOpCode.SHIFT_REF;\n}\n\nexport function getInstructionFromIcuCreateOpCode(mergedCode: number): number {\n  return mergedCode & IcuCreateOpCode.MASK_INSTRUCTION;\n}\n\nexport function icuCreateOpCode(opCode: IcuCreateOpCode, parentIdx: number, refIdx: number) {\n  ngDevMode && assertGreaterThanOrEqual(parentIdx, 0, 'Missing parent index');\n  ngDevMode && assertGreaterThan(refIdx, 0, 'Missing ref index');\n  return (\n    opCode | (parentIdx << IcuCreateOpCode.SHIFT_PARENT) | (refIdx << IcuCreateOpCode.SHIFT_REF)\n  );\n}\n\n// Returns whether the given value corresponds to a root template message,\n// or a sub-template.\nexport function isRootTemplateMessage(subTemplateIndex: number): subTemplateIndex is -1 {\n  return subTemplateIndex === -1;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertDomNode, assertNumber, assertNumberInRange} from '../../util/assert';\nimport {EMPTY_ARRAY} from '../../util/empty';\nimport {assertTIcu, assertTNodeForLView} from '../assert';\nimport {getCurrentICUCaseIndex} from './i18n_util';\nimport {I18nRemoveOpCodes, TIcu} from '../interfaces/i18n';\nimport {TIcuContainerNode} from '../interfaces/node';\nimport {RNode} from '../interfaces/renderer_dom';\nimport {LView, TVIEW} from '../interfaces/view';\n\ninterface IcuIteratorState {\n  stack: any[];\n  index: number;\n  lView?: LView;\n  removes?: I18nRemoveOpCodes;\n}\n\ntype IcuIterator = () => RNode | null;\n\nfunction enterIcu(state: IcuIteratorState, tIcu: TIcu, lView: LView) {\n  state.index = 0;\n  const currentCase = getCurrentICUCaseIndex(tIcu, lView);\n  if (currentCase !== null) {\n    ngDevMode && assertNumberInRange(currentCase, 0, tIcu.cases.length - 1);\n    state.removes = tIcu.remove[currentCase];\n  } else {\n    state.removes = EMPTY_ARRAY as any;\n  }\n}\n\nfunction icuContainerIteratorNext(state: IcuIteratorState): RNode | null {\n  if (state.index < state.removes!.length) {\n    const removeOpCode = state.removes![state.index++] as number;\n    ngDevMode && assertNumber(removeOpCode, 'Expecting OpCode number');\n    if (removeOpCode > 0) {\n      const rNode = state.lView![removeOpCode];\n      ngDevMode && assertDomNode(rNode);\n      return rNode;\n    } else {\n      state.stack.push(state.index, state.removes);\n      // ICUs are represented by negative indices\n      const tIcuIndex = ~removeOpCode;\n      const tIcu = state.lView![TVIEW].data[tIcuIndex] as TIcu;\n      ngDevMode && assertTIcu(tIcu);\n      enterIcu(state, tIcu, state.lView!);\n      return icuContainerIteratorNext(state);\n    }\n  } else {\n    if (state.stack.length === 0) {\n      return null;\n    } else {\n      state.removes = state.stack.pop();\n      state.index = state.stack.pop();\n      return icuContainerIteratorNext(state);\n    }\n  }\n}\n\nexport function loadIcuContainerVisitor() {\n  const _state: IcuIteratorState = {\n    stack: [],\n    index: -1,\n  };\n\n  /**\n   * Retrieves a set of root nodes from `TIcu.remove`. Used by `TNodeType.ICUContainer`\n   * to determine which root belong to the ICU.\n   *\n   * Example of usage.\n   * ```ts\n   * const nextRNode = icuContainerIteratorStart(tIcuContainerNode, lView);\n   * let rNode: RNode|null;\n   * while(rNode = nextRNode()) {\n   *   console.log(rNode);\n   * }\n   * ```\n   *\n   * @param tIcuContainerNode Current `TIcuContainerNode`\n   * @param lView `LView` where the `RNode`s should be looked up.\n   */\n  function icuContainerIteratorStart(\n    tIcuContainerNode: TIcuContainerNode,\n    lView: LView,\n  ): IcuIterator {\n    _state.lView = lView;\n    while (_state.stack.length) _state.stack.pop();\n    ngDevMode && assertTNodeForLView(tIcuContainerNode, lView);\n    enterIcu(_state, tIcuContainerNode.value, lView);\n    return icuContainerIteratorNext.bind(null, _state);\n  }\n\n  return icuContainerIteratorStart;\n}\n\nexport function createIcuIterator(tIcu: TIcu, lView: LView): IcuIterator {\n  const state: IcuIteratorState = {\n    stack: [],\n    index: -1,\n    lView,\n  };\n  ngDevMode && assertTIcu(tIcu);\n  enterIcu(state, tIcu, lView);\n  return icuContainerIteratorNext.bind(null, state);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NodeNavigationStep, REFERENCE_NODE_BODY, REFERENCE_NODE_HOST} from './interfaces';\n\n/**\n * Regexp that extracts a reference node information from the compressed node location.\n * The reference node is represented as either:\n *  - a number which points to an LView slot\n *  - the `b` char which indicates that the lookup should start from the `document.body`\n *  - the `h` char to start lookup from the component host node (`lView[HOST]`)\n */\nconst REF_EXTRACTOR_REGEXP = /* @__PURE__ */ new RegExp(\n  `^(\\\\d+)*(${REFERENCE_NODE_BODY}|${REFERENCE_NODE_HOST})*(.*)`,\n);\n\n/**\n * Helper function that takes a reference node location and a set of navigation steps\n * (from the reference node) to a target node and outputs a string that represents\n * a location.\n *\n * For example, given: referenceNode = 'b' (body) and path = ['firstChild', 'firstChild',\n * 'nextSibling'], the function returns: `bf2n`.\n */\nexport function compressNodeLocation(referenceNode: string, path: NodeNavigationStep[]): string {\n  const result: Array<string | number> = [referenceNode];\n  for (const segment of path) {\n    const lastIdx = result.length - 1;\n    if (lastIdx > 0 && result[lastIdx - 1] === segment) {\n      // An empty string in a count slot represents 1 occurrence of an instruction.\n      const value = (result[lastIdx] || 1) as number;\n      result[lastIdx] = value + 1;\n    } else {\n      // Adding a new segment to the path.\n      // Using an empty string in a counter field to avoid encoding `1`s\n      // into the path, since they are implicit (e.g. `f1n1` vs `fn`), so\n      // it's enough to have a single char in this case.\n      result.push(segment, '');\n    }\n  }\n  return result.join('');\n}\n\n/**\n * Helper function that reverts the `compressNodeLocation` and transforms a given\n * string into an array where at 0th position there is a reference node info and\n * after that it contains information (in pairs) about a navigation step and the\n * number of repetitions.\n *\n * For example, the path like 'bf2n' will be transformed to:\n * ['b', 'firstChild', 2, 'nextSibling', 1].\n *\n * This information is later consumed by the code that navigates the DOM to find\n * a given node by its location.\n */\nexport function decompressNodeLocation(\n  path: string,\n): [string | number, ...(number | NodeNavigationStep)[]] {\n  const matches = path.match(REF_EXTRACTOR_REGEXP)!;\n  const [_, refNodeId, refNodeName, rest] = matches;\n  // If a reference node is represented by an index, transform it to a number.\n  const ref = refNodeId ? parseInt(refNodeId, 10) : refNodeName;\n  const steps: (number | NodeNavigationStep)[] = [];\n  // Match all segments in a path.\n  for (const [_, step, count] of rest.matchAll(/(f|n)(\\d*)/g)) {\n    const repeat = parseInt(count, 10) || 1;\n    steps.push(step as NodeNavigationStep, repeat);\n  }\n  return [ref, ...steps];\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {TNode, TNodeType} from '../render3/interfaces/node';\nimport {RElement, RNode} from '../render3/interfaces/renderer_dom';\nimport {\n  DECLARATION_COMPONENT_VIEW,\n  HEADER_OFFSET,\n  HOST,\n  LView,\n  TView,\n} from '../render3/interfaces/view';\nimport {getFirstNativeNode} from '../render3/node_manipulation';\nimport {ɵɵresolveBody} from '../render3/util/misc_utils';\nimport {renderStringify} from '../render3/util/stringify_utils';\nimport {getNativeByTNode, unwrapRNode} from '../render3/util/view_utils';\nimport {assertDefined, assertEqual} from '../util/assert';\n\nimport {compressNodeLocation, decompressNodeLocation} from './compression';\nimport {\n  nodeNotFoundAtPathError,\n  nodeNotFoundError,\n  validateSiblingNodeExists,\n} from './error_handling';\nimport {\n  DehydratedView,\n  NODE_NAVIGATION_STEP_FIRST_CHILD,\n  NODE_NAVIGATION_STEP_NEXT_SIBLING,\n  NodeNavigationStep,\n  NODES,\n  REFERENCE_NODE_BODY,\n  REFERENCE_NODE_HOST,\n} from './interfaces';\nimport {calcSerializedContainerSize, getSegmentHead} from './utils';\n\n/** Whether current TNode is a first node in an <ng-container>. */\nfunction isFirstElementInNgContainer(tNode: TNode): boolean {\n  return !tNode.prev && tNode.parent?.type === TNodeType.ElementContainer;\n}\n\n/** Returns an instruction index (subtracting HEADER_OFFSET). */\nfunction getNoOffsetIndex(tNode: TNode): number {\n  return tNode.index - HEADER_OFFSET;\n}\n\n/**\n * Check whether a given node exists, but is disconnected from the DOM.\n */\nexport function isDisconnectedNode(tNode: TNode, lView: LView) {\n  return (\n    !(tNode.type & (TNodeType.Projection | TNodeType.LetDeclaration)) &&\n    !!lView[tNode.index] &&\n    isDisconnectedRNode(unwrapRNode(lView[tNode.index]))\n  );\n}\n\n/**\n * Check whether the given node exists, but is disconnected from the DOM.\n *\n * Note: we leverage the fact that we have this information available in the DOM emulation\n * layer (in Domino) for now. Longer-term solution should not rely on the DOM emulation and\n * only use internal data structures and state to compute this information.\n */\nexport function isDisconnectedRNode(rNode: RNode | null) {\n  return !!rNode && !(rNode as Node).isConnected;\n}\n\n/**\n * Locate a node in an i18n tree that corresponds to a given instruction index.\n *\n * @param hydrationInfo The hydration annotation data\n * @param noOffsetIndex the instruction index\n * @returns an RNode that corresponds to the instruction index\n */\nexport function locateI18nRNodeByIndex<T extends RNode>(\n  hydrationInfo: DehydratedView,\n  noOffsetIndex: number,\n): T | null | undefined {\n  const i18nNodes = hydrationInfo.i18nNodes;\n  if (i18nNodes) {\n    return i18nNodes.get(noOffsetIndex) as T | null | undefined;\n  }\n  return undefined;\n}\n\n/**\n * Attempt to locate an RNode by a path, if it exists.\n *\n * @param hydrationInfo The hydration annotation data\n * @param lView the current lView\n * @param noOffsetIndex the instruction index\n * @returns an RNode that corresponds to the instruction index or null if no path exists\n */\nexport function tryLocateRNodeByPath(\n  hydrationInfo: DehydratedView,\n  lView: LView<unknown>,\n  noOffsetIndex: number,\n): RNode | null {\n  const nodes = hydrationInfo.data[NODES];\n  const path = nodes?.[noOffsetIndex];\n  return path ? locateRNodeByPath(path, lView) : null;\n}\n\n/**\n * Locate a node in DOM tree that corresponds to a given TNode.\n *\n * @param hydrationInfo The hydration annotation data\n * @param tView the current tView\n * @param lView the current lView\n * @param tNode the current tNode\n * @returns an RNode that represents a given tNode\n */\nexport function locateNextRNode<T extends RNode>(\n  hydrationInfo: DehydratedView,\n  tView: TView,\n  lView: LView<unknown>,\n  tNode: TNode,\n): T | null {\n  const noOffsetIndex = getNoOffsetIndex(tNode);\n  let native = locateI18nRNodeByIndex(hydrationInfo, noOffsetIndex);\n\n  if (native === undefined) {\n    const nodes = hydrationInfo.data[NODES];\n    if (nodes?.[noOffsetIndex]) {\n      // We know the exact location of the node.\n      native = locateRNodeByPath(nodes[noOffsetIndex], lView);\n    } else if (tView.firstChild === tNode) {\n      // We create a first node in this view, so we use a reference\n      // to the first child in this DOM segment.\n      native = hydrationInfo.firstChild;\n    } else {\n      // Locate a node based on a previous sibling or a parent node.\n      const previousTNodeParent = tNode.prev === null;\n      const previousTNode = (tNode.prev ?? tNode.parent)!;\n      ngDevMode &&\n        assertDefined(\n          previousTNode,\n          'Unexpected state: current TNode does not have a connection ' +\n            'to the previous node or a parent node.',\n        );\n      if (isFirstElementInNgContainer(tNode)) {\n        const noOffsetParentIndex = getNoOffsetIndex(tNode.parent!);\n        native = getSegmentHead(hydrationInfo, noOffsetParentIndex);\n      } else {\n        let previousRElement = getNativeByTNode(previousTNode, lView);\n        if (previousTNodeParent) {\n          native = (previousRElement as RElement).firstChild;\n        } else {\n          // If the previous node is an element, but it also has container info,\n          // this means that we are processing a node like `<div #vcrTarget>`, which is\n          // represented in the DOM as `<div></div>...<!--container-->`.\n          // In this case, there are nodes *after* this element and we need to skip\n          // all of them to reach an element that we are looking for.\n          const noOffsetPrevSiblingIndex = getNoOffsetIndex(previousTNode);\n          const segmentHead = getSegmentHead(hydrationInfo, noOffsetPrevSiblingIndex);\n          if (previousTNode.type === TNodeType.Element && segmentHead) {\n            const numRootNodesToSkip = calcSerializedContainerSize(\n              hydrationInfo,\n              noOffsetPrevSiblingIndex,\n            );\n            // `+1` stands for an anchor comment node after all the views in this container.\n            const nodesToSkip = numRootNodesToSkip + 1;\n            // First node after this segment.\n            native = siblingAfter(nodesToSkip, segmentHead);\n          } else {\n            native = previousRElement.nextSibling;\n          }\n        }\n      }\n    }\n  }\n  return native as T;\n}\n\n/**\n * Skips over a specified number of nodes and returns the next sibling node after that.\n */\nexport function siblingAfter<T extends RNode>(skip: number, from: RNode): T | null {\n  let currentNode = from;\n  for (let i = 0; i < skip; i++) {\n    ngDevMode && validateSiblingNodeExists(currentNode);\n    currentNode = currentNode.nextSibling!;\n  }\n  return currentNode as T;\n}\n\n/**\n * Helper function to produce a string representation of the navigation steps\n * (in terms of `nextSibling` and `firstChild` navigations). Used in error\n * messages in dev mode.\n */\nfunction stringifyNavigationInstructions(instructions: (number | NodeNavigationStep)[]): string {\n  const container = [];\n  for (let i = 0; i < instructions.length; i += 2) {\n    const step = instructions[i];\n    const repeat = instructions[i + 1] as number;\n    for (let r = 0; r < repeat; r++) {\n      container.push(step === NODE_NAVIGATION_STEP_FIRST_CHILD ? 'firstChild' : 'nextSibling');\n    }\n  }\n  return container.join('.');\n}\n\n/**\n * Helper function that navigates from a starting point node (the `from` node)\n * using provided set of navigation instructions (within `path` argument).\n */\nfunction navigateToNode(from: Node, instructions: (number | NodeNavigationStep)[]): RNode {\n  let node = from;\n  for (let i = 0; i < instructions.length; i += 2) {\n    const step = instructions[i];\n    const repeat = instructions[i + 1] as number;\n    for (let r = 0; r < repeat; r++) {\n      if (ngDevMode && !node) {\n        throw nodeNotFoundAtPathError(from, stringifyNavigationInstructions(instructions));\n      }\n      switch (step) {\n        case NODE_NAVIGATION_STEP_FIRST_CHILD:\n          node = node.firstChild!;\n          break;\n        case NODE_NAVIGATION_STEP_NEXT_SIBLING:\n          node = node.nextSibling!;\n          break;\n      }\n    }\n  }\n  if (ngDevMode && !node) {\n    throw nodeNotFoundAtPathError(from, stringifyNavigationInstructions(instructions));\n  }\n  return node as RNode;\n}\n\n/**\n * Locates an RNode given a set of navigation instructions (which also contains\n * a starting point node info).\n */\nfunction locateRNodeByPath(path: string, lView: LView): RNode {\n  const [referenceNode, ...navigationInstructions] = decompressNodeLocation(path);\n  let ref: Element;\n  if (referenceNode === REFERENCE_NODE_HOST) {\n    ref = lView[DECLARATION_COMPONENT_VIEW][HOST] as unknown as Element;\n  } else if (referenceNode === REFERENCE_NODE_BODY) {\n    ref = ɵɵresolveBody(\n      lView[DECLARATION_COMPONENT_VIEW][HOST] as RElement & {ownerDocument: Document},\n    );\n  } else {\n    const parentElementId = Number(referenceNode);\n    ref = unwrapRNode((lView as any)[parentElementId + HEADER_OFFSET]) as Element;\n  }\n  return navigateToNode(ref, navigationInstructions);\n}\n\n/**\n * Generate a list of DOM navigation operations to get from node `start` to node `finish`.\n *\n * Note: assumes that node `start` occurs before node `finish` in an in-order traversal of the DOM\n * tree. That is, we should be able to get from `start` to `finish` purely by using `.firstChild`\n * and `.nextSibling` operations.\n */\nexport function navigateBetween(start: Node, finish: Node): NodeNavigationStep[] | null {\n  if (start === finish) {\n    return [];\n  } else if (start.parentElement == null || finish.parentElement == null) {\n    return null;\n  } else if (start.parentElement === finish.parentElement) {\n    return navigateBetweenSiblings(start, finish);\n  } else {\n    // `finish` is a child of its parent, so the parent will always have a child.\n    const parent = finish.parentElement!;\n\n    const parentPath = navigateBetween(start, parent);\n    const childPath = navigateBetween(parent.firstChild!, finish);\n    if (!parentPath || !childPath) return null;\n\n    return [\n      // First navigate to `finish`'s parent\n      ...parentPath,\n      // Then to its first child.\n      NODE_NAVIGATION_STEP_FIRST_CHILD,\n      // And finally from that node to `finish` (maybe a no-op if we're already there).\n      ...childPath,\n    ];\n  }\n}\n\n/**\n * Calculates a path between 2 sibling nodes (generates a number of `NextSibling` navigations).\n * Returns `null` if no such path exists between the given nodes.\n */\nfunction navigateBetweenSiblings(start: Node, finish: Node): NodeNavigationStep[] | null {\n  const nav: NodeNavigationStep[] = [];\n  let node: Node | null = null;\n  for (node = start; node != null && node !== finish; node = node.nextSibling) {\n    nav.push(NODE_NAVIGATION_STEP_NEXT_SIBLING);\n  }\n  // If the `node` becomes `null` or `undefined` at the end, that means that we\n  // didn't find the `end` node, thus return `null` (which would trigger serialization\n  // error to be produced).\n  return node == null ? null : nav;\n}\n\n/**\n * Calculates a path between 2 nodes in terms of `nextSibling` and `firstChild`\n * navigations:\n * - the `from` node is a known node, used as an starting point for the lookup\n *   (the `fromNodeName` argument is a string representation of the node).\n * - the `to` node is a node that the runtime logic would be looking up,\n *   using the path generated by this function.\n */\nexport function calcPathBetween(from: Node, to: Node, fromNodeName: string): string | null {\n  const path = navigateBetween(from, to);\n  return path === null ? null : compressNodeLocation(fromNodeName, path);\n}\n\n/**\n * Invoked at serialization time (on the server) when a set of navigation\n * instructions needs to be generated for a TNode.\n */\nexport function calcPathForNode(\n  tNode: TNode,\n  lView: LView,\n  excludedParentNodes: Set<number> | null,\n): string {\n  let parentTNode = tNode.parent;\n  let parentIndex: number | string;\n  let parentRNode: RNode;\n  let referenceNodeName: string;\n\n  // Skip over all parent nodes that are disconnected from the DOM, such nodes\n  // can not be used as anchors.\n  //\n  // This might happen in certain content projection-based use-cases, where\n  // a content of an element is projected and used, when a parent element\n  // itself remains detached from DOM. In this scenario we try to find a parent\n  // element that is attached to DOM and can act as an anchor instead.\n  //\n  // It can also happen that the parent node should be excluded, for example,\n  // because it belongs to an i18n block, which requires paths which aren't\n  // relative to other views in an i18n block.\n  while (\n    parentTNode !== null &&\n    (isDisconnectedNode(parentTNode, lView) || excludedParentNodes?.has(parentTNode.index))\n  ) {\n    parentTNode = parentTNode.parent;\n  }\n\n  if (parentTNode === null || !(parentTNode.type & TNodeType.AnyRNode)) {\n    // If there is no parent TNode or a parent TNode does not represent an RNode\n    // (i.e. not a DOM node), use component host element as a reference node.\n    parentIndex = referenceNodeName = REFERENCE_NODE_HOST;\n    parentRNode = lView[DECLARATION_COMPONENT_VIEW][HOST]!;\n  } else {\n    // Use parent TNode as a reference node.\n    parentIndex = parentTNode.index;\n    parentRNode = unwrapRNode(lView[parentIndex]);\n    referenceNodeName = renderStringify(parentIndex - HEADER_OFFSET);\n  }\n  let rNode = unwrapRNode(lView[tNode.index]);\n  if (tNode.type & (TNodeType.AnyContainer | TNodeType.Icu)) {\n    // For <ng-container> nodes, instead of serializing a reference\n    // to the anchor comment node, serialize a location of the first\n    // DOM element. Paired with the container size (serialized as a part\n    // of `ngh.containers`), it should give enough information for runtime\n    // to hydrate nodes in this container.\n    const firstRNode = getFirstNativeNode(lView, tNode);\n\n    // If container is not empty, use a reference to the first element,\n    // otherwise, rNode would point to an anchor comment node.\n    if (firstRNode) {\n      rNode = firstRNode;\n    }\n  }\n  let path: string | null = calcPathBetween(parentRNode as Node, rNode as Node, referenceNodeName);\n  if (path === null && parentRNode !== rNode) {\n    // Searching for a path between elements within a host node failed.\n    // Trying to find a path to an element starting from the `document.body` instead.\n    //\n    // Important note: this type of reference is relatively unstable, since Angular\n    // may not be able to control parts of the page that the runtime logic navigates\n    // through. This is mostly needed to cover \"portals\" use-case (like menus, dialog boxes,\n    // etc), where nodes are content-projected (including direct DOM manipulations) outside\n    // of the host node. The better solution is to provide APIs to work with \"portals\",\n    // at which point this code path would not be needed.\n    const body = (parentRNode as Node).ownerDocument!.body as Node;\n    path = calcPathBetween(body, rNode as Node, REFERENCE_NODE_BODY);\n\n    if (path === null) {\n      // If the path is still empty, it's likely that this node is detached and\n      // won't be found during hydration.\n      throw nodeNotFoundError(lView, tNode);\n    }\n  }\n  return path!;\n}\n\n/**\n * Retrieves all comments nodes that contain ngh comments referring to a defer block\n */\nexport function gatherDeferBlocksCommentNodes(\n  doc: Document,\n  node: HTMLElement,\n): Map<string, Comment> {\n  const commentNodesIterator = doc.createNodeIterator(node, NodeFilter.SHOW_COMMENT, {acceptNode});\n  let currentNode: Comment;\n\n  const nodesByBlockId = new Map<string, Comment>();\n  while ((currentNode = commentNodesIterator.nextNode() as Comment)) {\n    const nghPattern = 'ngh=';\n    const content = currentNode?.textContent;\n    const nghIdx = content?.indexOf(nghPattern) ?? -1;\n    if (nghIdx > -1) {\n      const nghValue = content!.substring(nghIdx + nghPattern.length).trim();\n      // Make sure the value has an expected format.\n      ngDevMode &&\n        assertEqual(\n          nghValue.startsWith('d'),\n          true,\n          'Invalid defer block id found in a comment node.',\n        );\n      nodesByBlockId.set(nghValue, currentNode);\n    }\n  }\n  return nodesByBlockId;\n}\n\nfunction acceptNode(node: HTMLElement) {\n  return node.textContent?.trimStart().startsWith('ngh=')\n    ? NodeFilter.FILTER_ACCEPT\n    : NodeFilter.FILTER_REJECT;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, Injector} from '../di';\nimport {isRootTemplateMessage} from '../render3/i18n/i18n_util';\nimport {createIcuIterator} from '../render3/i18n/i18n_icu_container_visitor';\nimport {I18nNode, I18nNodeKind, I18nPlaceholderType, TI18n, TIcu} from '../render3/interfaces/i18n';\nimport {isTNodeShape, TNode, TNodeType} from '../render3/interfaces/node';\nimport type {Renderer} from '../render3/interfaces/renderer';\nimport type {RNode} from '../render3/interfaces/renderer_dom';\nimport {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView, TVIEW} from '../render3/interfaces/view';\nimport {getFirstNativeNode} from '../render3/node_manipulation';\nimport {nativeRemoveNode} from '../render3/dom_node_manipulation';\nimport {unwrapRNode} from '../render3/util/view_utils';\nimport {assertDefined, assertNotEqual} from '../util/assert';\n\nimport type {HydrationContext} from './annotate';\nimport {DehydratedIcuData, DehydratedView, I18N_DATA} from './interfaces';\nimport {isDisconnectedRNode, locateNextRNode, tryLocateRNodeByPath} from './node_lookup_utils';\nimport {isI18nInSkipHydrationBlock} from './skip_hydration';\nimport {IS_I18N_HYDRATION_ENABLED} from './tokens';\nimport {\n  getNgContainerSize,\n  initDisconnectedNodes,\n  isDisconnectedNode,\n  isSerializedElementContainer,\n  processTextNodeBeforeSerialization,\n} from './utils';\n\nlet _isI18nHydrationSupportEnabled = false;\n\nlet _prepareI18nBlockForHydrationImpl: typeof prepareI18nBlockForHydrationImpl = () => {\n  // noop unless `enablePrepareI18nBlockForHydrationImpl` is invoked.\n};\n\nexport function setIsI18nHydrationSupportEnabled(enabled: boolean) {\n  _isI18nHydrationSupportEnabled = enabled;\n}\n\nexport function isI18nHydrationSupportEnabled() {\n  return _isI18nHydrationSupportEnabled;\n}\n\n/**\n * Prepares an i18n block and its children, located at the given\n * view and instruction index, for hydration.\n *\n * @param lView lView with the i18n block\n * @param index index of the i18n block in the lView\n * @param parentTNode TNode of the parent of the i18n block\n * @param subTemplateIndex sub-template index, or -1 for the main template\n */\nexport function prepareI18nBlockForHydration(\n  lView: LView,\n  index: number,\n  parentTNode: TNode | null,\n  subTemplateIndex: number,\n): void {\n  _prepareI18nBlockForHydrationImpl(lView, index, parentTNode, subTemplateIndex);\n}\n\nexport function enablePrepareI18nBlockForHydrationImpl() {\n  _prepareI18nBlockForHydrationImpl = prepareI18nBlockForHydrationImpl;\n}\n\nexport function isI18nHydrationEnabled(injector?: Injector) {\n  injector = injector ?? inject(Injector);\n  return injector.get(IS_I18N_HYDRATION_ENABLED, false);\n}\n\n/**\n * Collects, if not already cached, all of the indices in the\n * given TView which are children of an i18n block.\n *\n * Since i18n blocks don't introduce a parent TNode, this is necessary\n * in order to determine which indices in a LView are translated.\n */\nexport function getOrComputeI18nChildren(\n  tView: TView,\n  context: HydrationContext,\n): Set<number> | null {\n  let i18nChildren = context.i18nChildren.get(tView);\n  if (i18nChildren === undefined) {\n    i18nChildren = collectI18nChildren(tView);\n    context.i18nChildren.set(tView, i18nChildren);\n  }\n  return i18nChildren;\n}\n\nfunction collectI18nChildren(tView: TView): Set<number> | null {\n  const children = new Set<number>();\n\n  function collectI18nViews(node: I18nNode) {\n    children.add(node.index);\n\n    switch (node.kind) {\n      case I18nNodeKind.ELEMENT:\n      case I18nNodeKind.PLACEHOLDER: {\n        for (const childNode of node.children) {\n          collectI18nViews(childNode);\n        }\n        break;\n      }\n\n      case I18nNodeKind.ICU: {\n        for (const caseNodes of node.cases) {\n          for (const caseNode of caseNodes) {\n            collectI18nViews(caseNode);\n          }\n        }\n        break;\n      }\n    }\n  }\n\n  // Traverse through the AST of each i18n block in the LView,\n  // and collect every instruction index.\n  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {\n    const tI18n = tView.data[i] as TI18n | undefined;\n    if (!tI18n || !tI18n.ast) {\n      continue;\n    }\n\n    for (const node of tI18n.ast) {\n      collectI18nViews(node);\n    }\n  }\n\n  return children.size === 0 ? null : children;\n}\n\n/**\n * Resulting data from serializing an i18n block.\n */\nexport interface SerializedI18nBlock {\n  /**\n   * A queue of active ICU cases from a depth-first traversal\n   * of the i18n AST. This is serialized to the client in order\n   * to correctly associate DOM nodes with i18n nodes during\n   * hydration.\n   */\n  caseQueue: Array<number>;\n\n  /**\n   * A set of indices in the lView of the block for nodes\n   * that are disconnected from the DOM. In i18n, this can\n   * happen when using content projection but some nodes are\n   * not selected by an <ng-content />.\n   */\n  disconnectedNodes: Set<number>;\n\n  /**\n   * A set of indices in the lView of the block for nodes\n   * considered \"disjoint\", indicating that we need to serialize\n   * a path to the node in order to hydrate it.\n   *\n   * A node is considered disjoint when its RNode does not\n   * directly follow the RNode of the previous i18n node, for\n   * example, because of content projection.\n   */\n  disjointNodes: Set<number>;\n}\n\n/**\n * Attempts to serialize i18n data for an i18n block, located at\n * the given view and instruction index.\n *\n * @param lView lView with the i18n block\n * @param index index of the i18n block in the lView\n * @param context the hydration context\n * @returns the i18n data, or null if there is no relevant data\n */\nexport function trySerializeI18nBlock(\n  lView: LView,\n  index: number,\n  context: HydrationContext,\n): SerializedI18nBlock | null {\n  if (!context.isI18nHydrationEnabled) {\n    return null;\n  }\n\n  const tView = lView[TVIEW];\n  const tI18n = tView.data[index] as TI18n | undefined;\n  if (!tI18n || !tI18n.ast) {\n    return null;\n  }\n\n  const parentTNode = tView.data[tI18n.parentTNodeIndex] as TNode;\n  if (parentTNode && isI18nInSkipHydrationBlock(parentTNode)) {\n    return null;\n  }\n\n  const serializedI18nBlock: SerializedI18nBlock = {\n    caseQueue: [],\n    disconnectedNodes: new Set(),\n    disjointNodes: new Set(),\n  };\n  serializeI18nBlock(lView, serializedI18nBlock, context, tI18n.ast);\n\n  return serializedI18nBlock.caseQueue.length === 0 &&\n    serializedI18nBlock.disconnectedNodes.size === 0 &&\n    serializedI18nBlock.disjointNodes.size === 0\n    ? null\n    : serializedI18nBlock;\n}\n\nfunction serializeI18nBlock(\n  lView: LView,\n  serializedI18nBlock: SerializedI18nBlock,\n  context: HydrationContext,\n  nodes: I18nNode[],\n): Node | null {\n  let prevRNode = null;\n  for (const node of nodes) {\n    const nextRNode = serializeI18nNode(lView, serializedI18nBlock, context, node);\n    if (nextRNode) {\n      if (isDisjointNode(prevRNode, nextRNode)) {\n        serializedI18nBlock.disjointNodes.add(node.index - HEADER_OFFSET);\n      }\n      prevRNode = nextRNode;\n    }\n  }\n  return prevRNode;\n}\n\n/**\n * Helper to determine whether the given nodes are \"disjoint\".\n *\n * The i18n hydration process walks through the DOM and i18n nodes\n * at the same time. It expects the sibling DOM node of the previous\n * i18n node to be the first node of the next i18n node.\n *\n * In cases of content projection, this won't always be the case. So\n * when we detect that, we mark the node as \"disjoint\", ensuring that\n * we will serialize the path to the node. This way, when we hydrate the\n * i18n node, we will be able to find the correct place to start.\n */\nfunction isDisjointNode(prevNode: Node | null, nextNode: Node) {\n  return prevNode && prevNode.nextSibling !== nextNode;\n}\n\n/**\n * Process the given i18n node for serialization.\n * Returns the first RNode for the i18n node to begin hydration.\n */\nfunction serializeI18nNode(\n  lView: LView,\n  serializedI18nBlock: SerializedI18nBlock,\n  context: HydrationContext,\n  node: I18nNode,\n): Node | null {\n  const maybeRNode = unwrapRNode(lView[node.index]!);\n  if (!maybeRNode || isDisconnectedRNode(maybeRNode)) {\n    serializedI18nBlock.disconnectedNodes.add(node.index - HEADER_OFFSET);\n    return null;\n  }\n\n  const rNode = maybeRNode as Node;\n  switch (node.kind) {\n    case I18nNodeKind.TEXT: {\n      processTextNodeBeforeSerialization(context, rNode);\n      break;\n    }\n\n    case I18nNodeKind.ELEMENT:\n    case I18nNodeKind.PLACEHOLDER: {\n      serializeI18nBlock(lView, serializedI18nBlock, context, node.children);\n      break;\n    }\n\n    case I18nNodeKind.ICU: {\n      const currentCase = lView[node.currentCaseLViewIndex] as number | null;\n      if (currentCase != null) {\n        // i18n uses a negative value to signal a change to a new case, so we\n        // need to invert it to get the proper value.\n        const caseIdx = currentCase < 0 ? ~currentCase : currentCase;\n        serializedI18nBlock.caseQueue.push(caseIdx);\n        serializeI18nBlock(lView, serializedI18nBlock, context, node.cases[caseIdx]);\n      }\n      break;\n    }\n  }\n\n  return getFirstNativeNodeForI18nNode(lView, node) as Node | null;\n}\n\n/**\n * Helper function to get the first native node to begin hydrating\n * the given i18n node.\n */\nfunction getFirstNativeNodeForI18nNode(lView: LView, node: I18nNode) {\n  const tView = lView[TVIEW];\n  const maybeTNode = tView.data[node.index];\n\n  if (isTNodeShape(maybeTNode)) {\n    // If the node is backed by an actual TNode, we can simply delegate.\n    return getFirstNativeNode(lView, maybeTNode);\n  } else if (node.kind === I18nNodeKind.ICU) {\n    // A nested ICU container won't have an actual TNode. In that case, we can use\n    // an iterator to find the first child.\n    const icuIterator = createIcuIterator(maybeTNode as TIcu, lView);\n    let rNode: RNode | null = icuIterator();\n\n    // If the ICU container has no nodes, then we use the ICU anchor as the node.\n    return rNode ?? unwrapRNode(lView[node.index]);\n  } else {\n    // Otherwise, the node is a text or trivial element in an ICU container,\n    // and we can just use the RNode directly.\n    return unwrapRNode(lView[node.index]) ?? null;\n  }\n}\n\n/**\n * Describes shared data available during the hydration process.\n */\ninterface I18nHydrationContext {\n  hydrationInfo: DehydratedView;\n  lView: LView;\n  i18nNodes: Map<number, RNode | null>;\n  disconnectedNodes: Set<number>;\n  caseQueue: number[];\n  dehydratedIcuData: Map<number, DehydratedIcuData>;\n}\n\n/**\n * Describes current hydration state.\n */\ninterface I18nHydrationState {\n  // The current node\n  currentNode: Node | null;\n\n  /**\n   * Whether the tree should be connected.\n   *\n   * During hydration, it can happen that we expect to have a\n   * current RNode, but we don't. In such cases, we still need\n   * to propagate the expectation to the corresponding LViews,\n   * so that the proper downstream error handling can provide\n   * the correct context for the error.\n   */\n  isConnected: boolean;\n}\n\nfunction setCurrentNode(state: I18nHydrationState, node: Node | null) {\n  state.currentNode = node;\n}\n\n/**\n * Marks the current RNode as the hydration root for the given\n * AST node.\n */\nfunction appendI18nNodeToCollection(\n  context: I18nHydrationContext,\n  state: I18nHydrationState,\n  astNode: I18nNode,\n) {\n  const noOffsetIndex = astNode.index - HEADER_OFFSET;\n  const {disconnectedNodes} = context;\n  const currentNode = state.currentNode;\n\n  if (state.isConnected) {\n    context.i18nNodes.set(noOffsetIndex, currentNode);\n\n    // We expect the node to be connected, so ensure that it\n    // is not in the set, regardless of whether we found it,\n    // so that the downstream error handling can provide the\n    // proper context.\n    disconnectedNodes.delete(noOffsetIndex);\n  } else {\n    disconnectedNodes.add(noOffsetIndex);\n  }\n\n  return currentNode;\n}\n\n/**\n * Skip over some sibling nodes during hydration.\n *\n * Note: we use this instead of `siblingAfter` as it's expected that\n * sometimes we might encounter null nodes. In those cases, we want to\n * defer to downstream error handling to provide proper context.\n */\nfunction skipSiblingNodes(state: I18nHydrationState, skip: number) {\n  let currentNode = state.currentNode;\n  for (let i = 0; i < skip; i++) {\n    if (!currentNode) {\n      break;\n    }\n    currentNode = currentNode?.nextSibling ?? null;\n  }\n  return currentNode;\n}\n\n/**\n * Fork the given state into a new state for hydrating children.\n */\nfunction forkHydrationState(state: I18nHydrationState, nextNode: Node | null) {\n  return {currentNode: nextNode, isConnected: state.isConnected};\n}\n\nfunction prepareI18nBlockForHydrationImpl(\n  lView: LView,\n  index: number,\n  parentTNode: TNode | null,\n  subTemplateIndex: number,\n) {\n  const hydrationInfo = lView[HYDRATION];\n  if (!hydrationInfo) {\n    return;\n  }\n\n  if (\n    !isI18nHydrationSupportEnabled() ||\n    (parentTNode &&\n      (isI18nInSkipHydrationBlock(parentTNode) ||\n        isDisconnectedNode(hydrationInfo, parentTNode.index - HEADER_OFFSET)))\n  ) {\n    return;\n  }\n\n  const tView = lView[TVIEW];\n  const tI18n = tView.data[index] as TI18n;\n  ngDevMode &&\n    assertDefined(tI18n, 'Expected i18n data to be present in a given TView slot during hydration');\n\n  function findHydrationRoot() {\n    if (isRootTemplateMessage(subTemplateIndex)) {\n      // This is the root of an i18n block. In this case, our hydration root will\n      // depend on where our parent TNode (i.e. the block with i18n applied) is\n      // in the DOM.\n      ngDevMode && assertDefined(parentTNode, 'Expected parent TNode while hydrating i18n root');\n      const rootNode = locateNextRNode(hydrationInfo!, tView, lView, parentTNode!) as Node;\n\n      // If this i18n block is attached to an <ng-container>, then we want to begin\n      // hydrating directly with the RNode. Otherwise, for a TNode with a physical DOM\n      // element, we want to recurse into the first child and begin there.\n      return parentTNode!.type & TNodeType.ElementContainer ? rootNode : rootNode.firstChild;\n    }\n\n    // This is a nested template in an i18n block. In this case, the entire view\n    // is translated, and part of a dehydrated view in a container. This means that\n    // we can simply begin hydration with the first dehydrated child.\n    return hydrationInfo?.firstChild as Node;\n  }\n\n  const currentNode = findHydrationRoot();\n  ngDevMode && assertDefined(currentNode, 'Expected root i18n node during hydration');\n\n  const disconnectedNodes = initDisconnectedNodes(hydrationInfo) ?? new Set();\n  const i18nNodes = (hydrationInfo.i18nNodes ??= new Map<number, RNode | null>());\n  const caseQueue = hydrationInfo.data[I18N_DATA]?.[index - HEADER_OFFSET] ?? [];\n  const dehydratedIcuData = (hydrationInfo.dehydratedIcuData ??= new Map<\n    number,\n    DehydratedIcuData\n  >());\n\n  collectI18nNodesFromDom(\n    {hydrationInfo, lView, i18nNodes, disconnectedNodes, caseQueue, dehydratedIcuData},\n    {currentNode, isConnected: true},\n    tI18n.ast,\n  );\n\n  // Nodes from inactive ICU cases should be considered disconnected. We track them above\n  // because they aren't (and shouldn't be) serialized. Since we may mutate or create a\n  // new set, we need to be sure to write the expected value back to the DehydratedView.\n  hydrationInfo.disconnectedNodes = disconnectedNodes.size === 0 ? null : disconnectedNodes;\n}\n\nfunction collectI18nNodesFromDom(\n  context: I18nHydrationContext,\n  state: I18nHydrationState,\n  nodeOrNodes: I18nNode | I18nNode[],\n) {\n  if (Array.isArray(nodeOrNodes)) {\n    let nextState = state;\n    for (const node of nodeOrNodes) {\n      // Whenever a node doesn't directly follow the previous RNode, it\n      // is given a path. We need to resume collecting nodes from that location\n      // until and unless we find another disjoint node.\n      const targetNode = tryLocateRNodeByPath(\n        context.hydrationInfo,\n        context.lView,\n        node.index - HEADER_OFFSET,\n      );\n      if (targetNode) {\n        nextState = forkHydrationState(state, targetNode as Node);\n      }\n      collectI18nNodesFromDom(context, nextState, node);\n    }\n  } else {\n    if (context.disconnectedNodes.has(nodeOrNodes.index - HEADER_OFFSET)) {\n      // i18n nodes can be considered disconnected if e.g. they were projected.\n      // In that case, we have to make sure to skip over them.\n      return;\n    }\n\n    switch (nodeOrNodes.kind) {\n      case I18nNodeKind.TEXT: {\n        // Claim a text node for hydration\n        const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);\n        setCurrentNode(state, currentNode?.nextSibling ?? null);\n        break;\n      }\n\n      case I18nNodeKind.ELEMENT: {\n        // Recurse into the current element's children...\n        collectI18nNodesFromDom(\n          context,\n          forkHydrationState(state, state.currentNode?.firstChild ?? null),\n          nodeOrNodes.children,\n        );\n\n        // And claim the parent element itself.\n        const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);\n        setCurrentNode(state, currentNode?.nextSibling ?? null);\n        break;\n      }\n\n      case I18nNodeKind.PLACEHOLDER: {\n        const noOffsetIndex = nodeOrNodes.index - HEADER_OFFSET;\n        const {hydrationInfo} = context;\n        const containerSize = getNgContainerSize(hydrationInfo, noOffsetIndex);\n\n        switch (nodeOrNodes.type) {\n          case I18nPlaceholderType.ELEMENT: {\n            // Hydration expects to find the head of the element.\n            const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);\n\n            // A TNode for the node may not yet if we're hydrating during the first pass,\n            // so use the serialized data to determine if this is an <ng-container>.\n            if (isSerializedElementContainer(hydrationInfo, noOffsetIndex)) {\n              // An <ng-container> doesn't have a physical DOM node, so we need to\n              // continue hydrating from siblings.\n              collectI18nNodesFromDom(context, state, nodeOrNodes.children);\n\n              // Skip over the anchor element. It will be claimed by the\n              // downstream container hydration.\n              const nextNode = skipSiblingNodes(state, 1);\n              setCurrentNode(state, nextNode);\n            } else {\n              // Non-container elements represent an actual node in the DOM, so we\n              // need to continue hydration with the children, and claim the node.\n              collectI18nNodesFromDom(\n                context,\n                forkHydrationState(state, state.currentNode?.firstChild ?? null),\n                nodeOrNodes.children,\n              );\n              setCurrentNode(state, currentNode?.nextSibling ?? null);\n\n              // Elements can also be the anchor of a view container, so there may\n              // be elements after this node that we need to skip.\n              if (containerSize !== null) {\n                // `+1` stands for an anchor node after all of the views in the container.\n                const nextNode = skipSiblingNodes(state, containerSize + 1);\n                setCurrentNode(state, nextNode);\n              }\n            }\n            break;\n          }\n\n          case I18nPlaceholderType.SUBTEMPLATE: {\n            ngDevMode &&\n              assertNotEqual(\n                containerSize,\n                null,\n                'Expected a container size while hydrating i18n subtemplate',\n              );\n\n            // Hydration expects to find the head of the template.\n            appendI18nNodeToCollection(context, state, nodeOrNodes);\n\n            // Skip over all of the template children, as well as the anchor\n            // node, since the template itself will handle them instead.\n            const nextNode = skipSiblingNodes(state, containerSize! + 1);\n            setCurrentNode(state, nextNode);\n            break;\n          }\n        }\n        break;\n      }\n\n      case I18nNodeKind.ICU: {\n        // If the current node is connected, we need to pop the next case from the\n        // queue, so that the active case is also considered connected.\n        const selectedCase = state.isConnected ? context.caseQueue.shift()! : null;\n        const childState = {currentNode: null, isConnected: false};\n\n        // We traverse through each case, even if it's not active,\n        // so that we correctly populate disconnected nodes.\n        for (let i = 0; i < nodeOrNodes.cases.length; i++) {\n          collectI18nNodesFromDom(\n            context,\n            i === selectedCase ? state : childState,\n            nodeOrNodes.cases[i],\n          );\n        }\n\n        if (selectedCase !== null) {\n          // ICUs represent a branching state, and the selected case could be different\n          // than what it was on the server. In that case, we need to be able to clean\n          // up the nodes from the original case. To do that, we store the selected case.\n             context.dehydratedIcuData.set(nodeOrNodes.index, {case: selectedCase, node: nodeOrNodes});\n        }\n\n        // Hydration expects to find the ICU anchor element.\n        const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);\n        setCurrentNode(state, currentNode?.nextSibling ?? null);\n        break;\n      }\n    }\n  }\n}\n\nlet _claimDehydratedIcuCaseImpl: typeof claimDehydratedIcuCaseImpl = () => {\n  // noop unless `enableClaimDehydratedIcuCaseImpl` is invoked\n};\n\n/**\n * Mark the case for the ICU node at the given index in the view as claimed,\n * allowing its nodes to be hydrated and not cleaned up.\n */\nexport function claimDehydratedIcuCase(lView: LView, icuIndex: number, caseIndex: number) {\n  _claimDehydratedIcuCaseImpl(lView, icuIndex, caseIndex);\n}\n\nexport function enableClaimDehydratedIcuCaseImpl() {\n  _claimDehydratedIcuCaseImpl = claimDehydratedIcuCaseImpl;\n}\n\nfunction claimDehydratedIcuCaseImpl(lView: LView, icuIndex: number, caseIndex: number) {\n  const dehydratedIcuDataMap = lView[HYDRATION]?.dehydratedIcuData;\n  if (dehydratedIcuDataMap) {\n    const dehydratedIcuData = dehydratedIcuDataMap.get(icuIndex);\n    if (dehydratedIcuData?.case === caseIndex) {\n      // If the case we're attempting to claim matches the dehydrated one,\n      // we remove it from the map to mark it as \"claimed.\"\n      dehydratedIcuDataMap.delete(icuIndex);\n    }\n  }\n}\n\n/**\n * Clean up all i18n hydration data associated with the given view.\n */\nexport function cleanupI18nHydrationData(lView: LView) {\n  const hydrationInfo = lView[HYDRATION];\n  if (hydrationInfo) {\n    const {i18nNodes, dehydratedIcuData: dehydratedIcuDataMap} = hydrationInfo;\n    if (i18nNodes && dehydratedIcuDataMap) {\n      const renderer = lView[RENDERER];\n      for (const dehydratedIcuData of dehydratedIcuDataMap.values()) {\n        cleanupDehydratedIcuData(renderer, i18nNodes, dehydratedIcuData);\n      }\n    }\n\n    hydrationInfo.i18nNodes = undefined;\n    hydrationInfo.dehydratedIcuData = undefined;\n  }\n}\n\nfunction cleanupDehydratedIcuData(\n  renderer: Renderer,\n  i18nNodes: Map<number, RNode | null>,\n  dehydratedIcuData: DehydratedIcuData,\n) {\n  for (const node of dehydratedIcuData.node.cases[dehydratedIcuData.case]) {\n    const rNode = i18nNodes.get(node.index - HEADER_OFFSET);\n    if (rNode) {\n      nativeRemoveNode(renderer, rNode, false);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ApplicationRef} from '../application/application_ref';\nimport {DehydratedDeferBlock} from '../defer/interfaces';\nimport {DehydratedBlockRegistry} from '../defer/registry';\nimport {\n  CONTAINER_HEADER_OFFSET,\n  DEHYDRATED_VIEWS,\n  LContainer,\n} from '../render3/interfaces/container';\nimport {Renderer} from '../render3/interfaces/renderer';\nimport {RNode} from '../render3/interfaces/renderer_dom';\nimport {isLContainer, isLView} from '../render3/interfaces/type_checks';\nimport {HEADER_OFFSET, HOST, LView, PARENT, RENDERER, TVIEW} from '../render3/interfaces/view';\nimport {nativeRemoveNode} from '../render3/dom_node_manipulation';\n\nimport {validateSiblingNodeExists} from './error_handling';\nimport {cleanupI18nHydrationData} from './i18n';\nimport {DEFER_BLOCK_ID, DehydratedContainerView, NUM_ROOT_NODES} from './interfaces';\nimport {getLNodeForHydration} from './utils';\n\n/**\n * Removes all dehydrated views from a given LContainer:\n * both in internal data structure, as well as removing\n * corresponding DOM nodes that belong to that dehydrated view.\n */\nexport function removeDehydratedViews(lContainer: LContainer) {\n  const views = lContainer[DEHYDRATED_VIEWS] ?? [];\n  const parentLView = lContainer[PARENT];\n  const renderer = parentLView[RENDERER];\n  const retainedViews = [];\n  for (const view of views) {\n    // Do not clean up contents of `@defer` blocks.\n    // The cleanup for this content would happen once a given block\n    // is triggered and hydrated.\n    if (view.data[DEFER_BLOCK_ID] !== undefined) {\n      retainedViews.push(view);\n    } else {\n      removeDehydratedView(view, renderer);\n      ngDevMode && ngDevMode.dehydratedViewsRemoved++;\n    }\n  }\n  // Reset the value to an array to indicate that no\n  // further processing of dehydrated views is needed for\n  // this view container (i.e. do not trigger the lookup process\n  // once again in case a `ViewContainerRef` is created later).\n  lContainer[DEHYDRATED_VIEWS] = retainedViews;\n}\n\nexport function removeDehydratedViewList(deferBlock: DehydratedDeferBlock) {\n  const {lContainer} = deferBlock;\n  const dehydratedViews = lContainer[DEHYDRATED_VIEWS];\n  if (dehydratedViews === null) return;\n  const parentLView = lContainer[PARENT];\n  const renderer = parentLView[RENDERER];\n  for (const view of dehydratedViews) {\n    removeDehydratedView(view, renderer);\n    ngDevMode && ngDevMode.dehydratedViewsRemoved++;\n  }\n}\n\n/**\n * Helper function to remove all nodes from a dehydrated view.\n */\nfunction removeDehydratedView(dehydratedView: DehydratedContainerView, renderer: Renderer) {\n  let nodesRemoved = 0;\n  let currentRNode = dehydratedView.firstChild;\n  if (currentRNode) {\n    const numNodes = dehydratedView.data[NUM_ROOT_NODES];\n    while (nodesRemoved < numNodes) {\n      ngDevMode && validateSiblingNodeExists(currentRNode);\n      const nextSibling: RNode = currentRNode.nextSibling!;\n      nativeRemoveNode(renderer, currentRNode, false);\n      currentRNode = nextSibling;\n      nodesRemoved++;\n    }\n  }\n}\n\n/**\n * Walks over all views within this LContainer invokes dehydrated views\n * cleanup function for each one.\n */\nexport function cleanupLContainer(lContainer: LContainer) {\n  removeDehydratedViews(lContainer);\n\n  // The host could be an LView if this container is on a component node.\n  // In this case, descend into host LView for further cleanup. See also\n  // LContainer[HOST] docs for additional information.\n  const hostLView = lContainer[HOST];\n  if (isLView(hostLView)) {\n    cleanupLView(hostLView);\n  }\n\n  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {\n    cleanupLView(lContainer[i] as LView);\n  }\n}\n\n/**\n * Walks over `LContainer`s and components registered within\n * this LView and invokes dehydrated views cleanup function for each one.\n */\nfunction cleanupLView(lView: LView) {\n  cleanupI18nHydrationData(lView);\n\n  const tView = lView[TVIEW];\n  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {\n    if (isLContainer(lView[i])) {\n      const lContainer = lView[i];\n      cleanupLContainer(lContainer);\n    } else if (isLView(lView[i])) {\n      // This is a component, enter the `cleanupLView` recursively.\n      cleanupLView(lView[i]);\n    }\n  }\n}\n\n/**\n * Walks over all views registered within the ApplicationRef and removes\n * all dehydrated views from all `LContainer`s along the way.\n */\nexport function cleanupDehydratedViews(appRef: ApplicationRef) {\n  const viewRefs = appRef._views;\n  for (const viewRef of viewRefs) {\n    const lNode = getLNodeForHydration(viewRef);\n    // An `lView` might be `null` if a `ViewRef` represents\n    // an embedded view (not a component view).\n    if (lNode !== null && lNode[HOST] !== null) {\n      if (isLView(lNode)) {\n        cleanupLView(lNode);\n      } else {\n        // Cleanup in all views within this view container\n        cleanupLContainer(lNode);\n      }\n      ngDevMode && ngDevMode.dehydratedViewsCleanupRuns++;\n    }\n  }\n}\n\n/**\n * post hydration cleanup handling for defer blocks that were incrementally\n * hydrated. This removes all the jsaction attributes, timers, observers,\n * dehydrated views and containers\n */\nexport function cleanupHydratedDeferBlocks(\n  deferBlock: DehydratedDeferBlock | null,\n  hydratedBlocks: string[],\n  registry: DehydratedBlockRegistry,\n  appRef: ApplicationRef,\n): void {\n  if (deferBlock !== null) {\n    registry.cleanup(hydratedBlocks);\n    cleanupLContainer(deferBlock.lContainer);\n    cleanupDehydratedViews(appRef);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DEHYDRATED_VIEWS, LContainer} from '../render3/interfaces/container';\nimport {RNode} from '../render3/interfaces/renderer_dom';\n\nimport {removeDehydratedViews} from './cleanup';\nimport {\n  DehydratedContainerView,\n  MULTIPLIER,\n  NUM_ROOT_NODES,\n  SerializedContainerView,\n  TEMPLATE_ID,\n} from './interfaces';\nimport {siblingAfter} from './node_lookup_utils';\n\n/**\n * Given a current DOM node and a serialized information about the views\n * in a container, walks over the DOM structure, collecting the list of\n * dehydrated views.\n */\nexport function locateDehydratedViewsInContainer(\n  currentRNode: RNode,\n  serializedViews: SerializedContainerView[],\n): [RNode, DehydratedContainerView[]] {\n  const dehydratedViews: DehydratedContainerView[] = [];\n  for (const serializedView of serializedViews) {\n    // Repeats a view multiple times as needed, based on the serialized information\n    // (for example, for *ngFor-produced views).\n    for (let i = 0; i < (serializedView[MULTIPLIER] ?? 1); i++) {\n      const view: DehydratedContainerView = {\n        data: serializedView,\n        firstChild: null,\n      };\n      if (serializedView[NUM_ROOT_NODES] > 0) {\n        // Keep reference to the first node in this view,\n        // so it can be accessed while invoking template instructions.\n        view.firstChild = currentRNode as HTMLElement;\n\n        // Move over to the next node after this view, which can\n        // either be a first node of the next view or an anchor comment\n        // node after the last view in a container.\n        currentRNode = siblingAfter(serializedView[NUM_ROOT_NODES], currentRNode)!;\n      }\n      dehydratedViews.push(view);\n    }\n  }\n\n  return [currentRNode, dehydratedViews];\n}\n\n/**\n * Reference to a function that searches for a matching dehydrated views\n * stored on a given lContainer.\n * Returns `null` by default, when hydration is not enabled.\n */\nlet _findMatchingDehydratedViewImpl: typeof findMatchingDehydratedViewImpl = () => null;\n\n/**\n * Retrieves the next dehydrated view from the LContainer and verifies that\n * it matches a given template id (from the TView that was used to create this\n * instance of a view). If the id doesn't match, that means that we are in an\n * unexpected state and can not complete the reconciliation process. Thus,\n * all dehydrated views from this LContainer are removed (including corresponding\n * DOM nodes) and the rendering is performed as if there were no dehydrated views\n * in this container.\n */\nfunction findMatchingDehydratedViewImpl(\n  lContainer: LContainer,\n  template: string | null,\n): DehydratedContainerView | null {\n  const views = lContainer[DEHYDRATED_VIEWS];\n  if (!template || views === null || views.length === 0) {\n    return null;\n  }\n  const view = views[0];\n  // Verify whether the first dehydrated view in the container matches\n  // the template id passed to this function (that originated from a TView\n  // that was used to create an instance of an embedded or component views.\n  if (view.data[TEMPLATE_ID] === template) {\n    // If the template id matches - extract the first view and return it.\n    return views.shift()!;\n  } else {\n    // Otherwise, we are at the state when reconciliation can not be completed,\n    // thus we remove all dehydrated views within this container (remove them\n    // from internal data structures as well as delete associated elements from\n    // the DOM tree).\n    removeDehydratedViews(lContainer);\n    return null;\n  }\n}\n\nexport function enableFindMatchingDehydratedViewImpl() {\n  _findMatchingDehydratedViewImpl = findMatchingDehydratedViewImpl;\n}\n\nexport function findMatchingDehydratedView(\n  lContainer: LContainer,\n  template: string | null,\n): DehydratedContainerView | null {\n  return _findMatchingDehydratedViewImpl(lContainer, template);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {ChangeDetectorRef} from '../change_detection/change_detection';\nimport type {Injector} from '../di/injector';\nimport type {EnvironmentInjector} from '../di/r3_injector';\nimport {Type} from '../interface/type';\n\nimport type {ElementRef} from './element_ref';\nimport type {NgModuleRef} from './ng_module_factory';\nimport type {ViewRef} from './view_ref';\n\n/**\n * Represents a component created by a `ComponentFactory`.\n * Provides access to the component instance and related objects,\n * and provides the means of destroying the instance.\n *\n * @publicApi\n */\nexport abstract class ComponentRef<C> {\n  /**\n   * Updates a specified input name to a new value. Using this method will properly mark for check\n   * component using the `OnPush` change detection strategy. It will also assure that the\n   * `OnChanges` lifecycle hook runs when a dynamically created component is change-detected.\n   *\n   * @param name The name of an input.\n   * @param value The new value of an input.\n   */\n  abstract setInput(name: string, value: unknown): void;\n\n  /**\n   * The host or anchor element for this component instance.\n   */\n  abstract get location(): ElementRef;\n\n  /**\n   * The dependency injector for this component instance.\n   */\n  abstract get injector(): Injector;\n\n  /**\n   * This component instance.\n   */\n  abstract get instance(): C;\n\n  /**\n   * The host view defined by the template\n   * for this component instance.\n   */\n  abstract get hostView(): ViewRef;\n\n  /**\n   * The change detector for this component instance.\n   */\n  abstract get changeDetectorRef(): ChangeDetectorRef;\n\n  /**\n   * The type of this component (as created by a `ComponentFactory` class).\n   */\n  abstract get componentType(): Type<any>;\n\n  /**\n   * Destroys the component instance and all of the data structures associated with it.\n   */\n  abstract destroy(): void;\n\n  /**\n   * A lifecycle hook that provides additional developer-defined cleanup\n   * functionality for the component.\n   * @param callback A handler function that cleans up developer-defined data\n   * associated with this component. Called when the `destroy()` method is invoked.\n   */\n  abstract onDestroy(callback: Function): void;\n}\n\n/**\n * Base class for a factory that can create a component dynamically.\n * Instantiate a factory for a given type of component with `resolveComponentFactory()`.\n * Use the resulting `ComponentFactory.create()` method to create a component of that type.\n *\n * @publicApi\n *\n * @deprecated Angular no longer requires Component factories. Please use other APIs where\n *     Component class can be used directly.\n */\nexport abstract class ComponentFactory<C> {\n  /**\n   * The component's HTML selector.\n   */\n  abstract get selector(): string;\n  /**\n   * The type of component the factory will create.\n   */\n  abstract get componentType(): Type<any>;\n  /**\n   * Selector for all <ng-content> elements in the component.\n   */\n  abstract get ngContentSelectors(): string[];\n  /**\n   * The inputs of the component.\n   */\n  abstract get inputs(): {\n    propName: string;\n    templateName: string;\n    transform?: (value: any) => any;\n    isSignal: boolean;\n  }[];\n  /**\n   * The outputs of the component.\n   */\n  abstract get outputs(): {propName: string; templateName: string}[];\n  /**\n   * Creates a new component.\n   */\n  abstract create(\n    injector: Injector,\n    projectableNodes?: any[][],\n    rootSelectorOrNode?: string | any,\n    environmentInjector?: EnvironmentInjector | NgModuleRef<any>,\n  ): ComponentRef<C>;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {stringify} from '../util/stringify';\n\nimport type {ComponentFactory} from './component_factory';\n\nclass _NullComponentFactoryResolver implements ComponentFactoryResolver {\n  resolveComponentFactory<T>(component: {new (...args: any[]): T}): ComponentFactory<T> {\n    throw Error(`No component factory found for ${stringify(component)}.`);\n  }\n}\n\n/**\n * A simple registry that maps `Components` to generated `ComponentFactory` classes\n * that can be used to create instances of components.\n * Use to obtain the factory for a given component type,\n * then use the factory's `create()` method to create a component of that type.\n *\n * Note: since v13, dynamic component creation via\n * [`ViewContainerRef.createComponent`](api/core/ViewContainerRef#createComponent)\n * does **not** require resolving component factory: component class can be used directly.\n *\n * @publicApi\n *\n * @deprecated Angular no longer requires Component factories. Please use other APIs where\n *     Component class can be used directly.\n */\nexport abstract class ComponentFactoryResolver {\n  static NULL: ComponentFactoryResolver = /* @__PURE__ */ new _NullComponentFactoryResolver();\n  /**\n   * Retrieves the factory object that creates a component of the given type.\n   * @param component The component type.\n   */\n  abstract resolveComponentFactory<T>(component: Type<T>): ComponentFactory<T>;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isLView} from '../render3/interfaces/type_checks';\nimport {RENDERER} from '../render3/interfaces/view';\nimport {getCurrentTNode, getLView} from '../render3/state';\nimport {getComponentLViewByIndex} from '../render3/util/view_utils';\n\nimport {RendererStyleFlags2, RendererType2} from './api_flags';\n\n/**\n * Creates and initializes a custom renderer that implements the `Renderer2` base class.\n *\n * @publicApi\n */\nexport abstract class RendererFactory2 {\n  /**\n   * Creates and initializes a custom renderer for a host DOM element.\n   * @param hostElement The element to render.\n   * @param type The base class to implement.\n   * @returns The new custom renderer instance.\n   */\n  abstract createRenderer(hostElement: any, type: RendererType2 | null): Renderer2;\n  /**\n   * A callback invoked when rendering has begun.\n   */\n  abstract begin?(): void;\n  /**\n   * A callback invoked when rendering has completed.\n   */\n  abstract end?(): void;\n  /**\n   * Use with animations test-only mode. Notifies the test when rendering has completed.\n   * @returns The asynchronous result of the developer-defined function.\n   */\n  abstract whenRenderingDone?(): Promise<any>;\n}\n\n/**\n * Extend this base class to implement custom rendering. By default, Angular\n * renders a template into DOM. You can use custom rendering to intercept\n * rendering calls, or to render to something other than DOM.\n *\n * <div class=\"docs-alert docs-alert-important\">\n * <p>\n * Please be aware that usage of `Renderer2`, in context of accessing DOM elements, provides no\n * extra security which makes it equivalent to\n * {@link /best-practices/security#direct-use-of-the-dom-apis-and-explicit-sanitization-calls Security vulnerabilities}.\n * </p>\n * </div>\n *\n * Create your custom renderer using `RendererFactory2`.\n *\n * Use a custom renderer to bypass Angular's templating and\n * make custom UI changes that can't be expressed declaratively.\n * For example if you need to set a property or an attribute whose name is\n * not statically known, use the `setProperty()` or\n * `setAttribute()` method.\n *\n * @publicApi\n */\nexport abstract class Renderer2 {\n  /**\n   * Use to store arbitrary developer-defined data on a renderer instance,\n   * as an object containing key-value pairs.\n   * This is useful for renderers that delegate to other renderers.\n   */\n  abstract get data(): {[key: string]: any};\n\n  /**\n   * Implement this callback to destroy the renderer or the host element.\n   */\n  abstract destroy(): void;\n  /**\n   * Implement this callback to create an instance of the host element.\n   * @param name An identifying name for the new element, unique within the namespace.\n   * @param namespace The namespace for the new element.\n   * @returns The new element.\n   */\n  abstract createElement(name: string, namespace?: string | null): any;\n  /**\n   * Implement this callback to add a comment to the DOM of the host element.\n   * @param value The comment text.\n   * @returns The modified element.\n   */\n  abstract createComment(value: string): any;\n\n  /**\n   * Implement this callback to add text to the DOM of the host element.\n   * @param value The text string.\n   * @returns The modified element.\n   */\n  abstract createText(value: string): any;\n  /**\n   * If null or undefined, the view engine won't call it.\n   * This is used as a performance optimization for production mode.\n   */\n  destroyNode: ((node: any) => void) | null = null;\n  /**\n   * Appends a child to a given parent node in the host element DOM.\n   * @param parent The parent node.\n   * @param newChild The new child node.\n   */\n  abstract appendChild(parent: any, newChild: any): void;\n  /**\n   * Implement this callback to insert a child node at a given position in a parent node\n   * in the host element DOM.\n   * @param parent The parent node.\n   * @param newChild The new child nodes.\n   * @param refChild The existing child node before which `newChild` is inserted.\n   * @param isMove Optional argument which signifies if the current `insertBefore` is a result of a\n   *     move. Animation uses this information to trigger move animations. In the past the Animation\n   *     would always assume that any `insertBefore` is a move. This is not strictly true because\n   *     with runtime i18n it is possible to invoke `insertBefore` as a result of i18n and it should\n   *     not trigger an animation move.\n   */\n  abstract insertBefore(parent: any, newChild: any, refChild: any, isMove?: boolean): void;\n  /**\n   * Implement this callback to remove a child node from the host element's DOM.\n   * @param parent The parent node.\n   * @param oldChild The child node to remove.\n   * @param isHostElement Optionally signal to the renderer whether this element is a host element\n   * or not\n   */\n  abstract removeChild(parent: any, oldChild: any, isHostElement?: boolean): void;\n  /**\n   * Implement this callback to prepare an element to be bootstrapped\n   * as a root element, and return the element instance.\n   * @param selectorOrNode The DOM element.\n   * @param preserveContent Whether the contents of the root element\n   * should be preserved, or cleared upon bootstrap (default behavior).\n   * Use with `ViewEncapsulation.ShadowDom` to allow simple native\n   * content projection via `<slot>` elements.\n   * @returns The root element.\n   */\n  abstract selectRootElement(selectorOrNode: string | any, preserveContent?: boolean): any;\n  /**\n   * Implement this callback to get the parent of a given node\n   * in the host element's DOM.\n   * @param node The child node to query.\n   * @returns The parent node, or null if there is no parent.\n   * This is because the check is synchronous,\n   * and the caller can't rely on checking for null.\n   */\n  abstract parentNode(node: any): any;\n  /**\n   * Implement this callback to get the next sibling node of a given node\n   * in the host element's DOM.\n   * @returns The sibling node, or null if there is no sibling.\n   * This is because the check is synchronous,\n   * and the caller can't rely on checking for null.\n   */\n  abstract nextSibling(node: any): any;\n  /**\n   * Implement this callback to set an attribute value for an element in the DOM.\n   * @param el The element.\n   * @param name The attribute name.\n   * @param value The new value.\n   * @param namespace The namespace.\n   */\n  abstract setAttribute(el: any, name: string, value: string, namespace?: string | null): void;\n\n  /**\n   * Implement this callback to remove an attribute from an element in the DOM.\n   * @param el The element.\n   * @param name The attribute name.\n   * @param namespace The namespace.\n   */\n  abstract removeAttribute(el: any, name: string, namespace?: string | null): void;\n  /**\n   * Implement this callback to add a class to an element in the DOM.\n   * @param el The element.\n   * @param name The class name.\n   */\n  abstract addClass(el: any, name: string): void;\n\n  /**\n   * Implement this callback to remove a class from an element in the DOM.\n   * @param el The element.\n   * @param name The class name.\n   */\n  abstract removeClass(el: any, name: string): void;\n\n  /**\n   * Implement this callback to set a CSS style for an element in the DOM.\n   * @param el The element.\n   * @param style The name of the style.\n   * @param value The new value.\n   * @param flags Flags for style variations. No flags are set by default.\n   */\n  abstract setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2): void;\n\n  /**\n   * Implement this callback to remove the value from a CSS style for an element in the DOM.\n   * @param el The element.\n   * @param style The name of the style.\n   * @param flags Flags for style variations to remove, if set. ???\n   */\n  abstract removeStyle(el: any, style: string, flags?: RendererStyleFlags2): void;\n\n  /**\n   * Implement this callback to set the value of a property of an element in the DOM.\n   * @param el The element.\n   * @param name The property name.\n   * @param value The new value.\n   */\n  abstract setProperty(el: any, name: string, value: any): void;\n\n  /**\n   * Implement this callback to set the value of a node in the host element.\n   * @param node The node.\n   * @param value The new value.\n   */\n  abstract setValue(node: any, value: string): void;\n\n  /**\n   * Implement this callback to start an event listener.\n   * @param target The context in which to listen for events. Can be\n   * the entire window or document, the body of the document, or a specific\n   * DOM element.\n   * @param eventName The event to listen for.\n   * @param callback A handler function to invoke when the event occurs.\n   * @param options Options that configure how the event listener is bound.\n   * @returns An \"unlisten\" function for disposing of this handler.\n   */\n  abstract listen(\n    target: 'window' | 'document' | 'body' | any,\n    eventName: string,\n    callback: (event: any) => boolean | void,\n    options?: ListenerOptions,\n  ): () => void;\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ELEMENT_ID__: () => Renderer2 = () => injectRenderer2();\n}\n\n/** Injects a Renderer2 for the current component. */\nexport function injectRenderer2(): Renderer2 {\n  // We need the Renderer to be based on the component that it's being injected into, however since\n  // DI happens before we've entered its view, `getLView` will return the parent view instead.\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n  const nodeAtIndex = getComponentLViewByIndex(tNode.index, lView);\n  return (isLView(nodeAtIndex) ? nodeAtIndex : lView)[RENDERER] as Renderer2;\n}\n\n/**\n * This enum is meant to be used by `ɵtype` properties of the different renderers implemented\n * by the framework\n *\n * We choose to not add `ɵtype` to `Renderer2` to no expose it to the public API.\n */\nexport const enum AnimationRendererType {\n  Regular = 0,\n  Delegated = 1,\n}\n\n/**\n * Options that can be used to configure an event listener.\n * @publicApi\n */\nexport interface ListenerOptions {\n  capture?: boolean;\n  once?: boolean;\n  passive?: boolean;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵɵdefineInjectable} from '../di/interface/defs';\nimport {SecurityContext} from './security';\n\n/**\n * Sanitizer is used by the views to sanitize potentially dangerous values.\n *\n * @publicApi\n */\nexport abstract class Sanitizer {\n  abstract sanitize(context: SecurityContext, value: {} | string | null): string | null;\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: Sanitizer,\n    providedIn: 'root',\n    factory: () => null,\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isForwardRef, resolveForwardRef} from '../../di/forward_ref';\nimport {ModuleWithProviders} from '../../di/interface/provider';\nimport {Type} from '../../interface/type';\nimport {NgModuleDef} from '../../metadata/ng_module_def';\nimport {getComponentDef, getDirectiveDef, getPipeDef, getNgModuleDef} from '../def_getters';\nimport type {ComponentType, DirectiveType, PipeType} from '../interfaces/definition';\nimport {stringifyForError} from '../util/stringify_utils';\n\nexport function isModuleWithProviders(value: any): value is ModuleWithProviders<{}> {\n  return (value as {ngModule?: any}).ngModule !== undefined;\n}\n\nexport function isNgModule<T>(value: Type<T>): value is Type<T> & {ɵmod: NgModuleDef<T>} {\n  return !!getNgModuleDef(value);\n}\n\nexport function isPipe<T>(value: Type<T>): value is PipeType<T> {\n  return !!getPipeDef(value);\n}\n\nexport function isDirective<T>(value: Type<T>): value is DirectiveType<T> {\n  return !!getDirectiveDef(value);\n}\n\nexport function isComponent<T>(value: Type<T>): value is ComponentType<T> {\n  return !!getComponentDef(value);\n}\n\nfunction getDependencyTypeForError(type: Type<any>) {\n  if (getComponentDef(type)) return 'component';\n  if (getDirectiveDef(type)) return 'directive';\n  if (getPipeDef(type)) return 'pipe';\n  return 'type';\n}\n\nexport function verifyStandaloneImport(depType: Type<unknown>, importingType: Type<unknown>) {\n  if (isForwardRef(depType)) {\n    depType = resolveForwardRef(depType);\n    if (!depType) {\n      throw new Error(\n        `Expected forwardRef function, imported from \"${stringifyForError(\n          importingType,\n        )}\", to return a standalone entity or NgModule but got \"${\n          stringifyForError(depType) || depType\n        }\".`,\n      );\n    }\n  }\n\n  if (getNgModuleDef(depType) == null) {\n    const def = getComponentDef(depType) || getDirectiveDef(depType) || getPipeDef(depType);\n    if (def != null) {\n      // if a component, directive or pipe is imported make sure that it is standalone\n      if (!def.standalone) {\n        throw new Error(\n          `The \"${stringifyForError(depType)}\" ${getDependencyTypeForError(\n            depType,\n          )}, imported from \"${stringifyForError(\n            importingType,\n          )}\", is not standalone. Did you forget to add the standalone: true flag?`,\n        );\n      }\n    } else {\n      // it can be either a module with provider or an unknown (not annotated) type\n      if (isModuleWithProviders(depType)) {\n        throw new Error(\n          `A module with providers was imported from \"${stringifyForError(\n            importingType,\n          )}\". Modules with providers are not supported in standalone components imports.`,\n        );\n      } else {\n        throw new Error(\n          `The \"${stringifyForError(depType)}\" type, imported from \"${stringifyForError(\n            importingType,\n          )}\", must be a standalone component / directive / pipe or an NgModule. Did you forget to add the required @Component / @Directive / @Pipe or @NgModule annotation?`,\n        );\n      }\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {resolveForwardRef} from '../../di';\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {Type} from '../../interface/type';\nimport {NgModuleType} from '../../metadata/ng_module_def';\nimport {flatten} from '../../util/array_utils';\nimport type {\n  ComponentType,\n  NgModuleScopeInfoFromDecorator,\n  RawScopeInfoFromDecorator,\n} from '../interfaces/definition';\nimport {isComponent, isDirective, isNgModule, isPipe, verifyStandaloneImport} from '../jit/util';\nimport {getComponentDef, getNgModuleDef, isStandalone} from '../def_getters';\nimport {maybeUnwrapFn} from '../util/misc_utils';\n\nimport {\n  ComponentDependencies,\n  DepsTrackerApi,\n  NgModuleScope,\n  StandaloneComponentScope,\n} from './api';\n\n/**\n * Indicates whether to use the runtime dependency tracker for scope calculation in JIT compilation.\n * The value \"false\" means the old code path based on patching scope info into the types will be\n * used.\n *\n * @deprecated For migration purposes only, to be removed soon.\n */\nexport const USE_RUNTIME_DEPS_TRACKER_FOR_JIT = true;\n\n/**\n * An implementation of DepsTrackerApi which will be used for JIT and local compilation.\n */\nclass DepsTracker implements DepsTrackerApi {\n  private ownerNgModule = new Map<ComponentType<any>, NgModuleType<any>>();\n  private ngModulesWithSomeUnresolvedDecls = new Set<NgModuleType<any>>();\n  private ngModulesScopeCache = new Map<NgModuleType<any>, NgModuleScope>();\n  private standaloneComponentsScopeCache = new Map<ComponentType<any>, StandaloneComponentScope>();\n\n  /**\n   * Attempts to resolve ng module's forward ref declarations as much as possible and add them to\n   * the `ownerNgModule` map. This method normally should be called after the initial parsing when\n   * all the forward refs are resolved (e.g., when trying to render a component)\n   */\n  private resolveNgModulesDecls(): void {\n    if (this.ngModulesWithSomeUnresolvedDecls.size === 0) {\n      return;\n    }\n\n    for (const moduleType of this.ngModulesWithSomeUnresolvedDecls) {\n      const def = getNgModuleDef(moduleType);\n      if (def?.declarations) {\n        for (const decl of maybeUnwrapFn(def.declarations)) {\n          if (isComponent(decl)) {\n            this.ownerNgModule.set(decl, moduleType);\n          }\n        }\n      }\n    }\n\n    this.ngModulesWithSomeUnresolvedDecls.clear();\n  }\n\n  /** @override */\n  getComponentDependencies(\n    type: ComponentType<any>,\n    rawImports?: RawScopeInfoFromDecorator[],\n  ): ComponentDependencies {\n    this.resolveNgModulesDecls();\n\n    const def = getComponentDef(type);\n    if (def === null) {\n      throw new Error(\n        `Attempting to get component dependencies for a type that is not a component: ${type}`,\n      );\n    }\n\n    if (def.standalone) {\n      const scope = this.getStandaloneComponentScope(type, rawImports);\n\n      if (scope.compilation.isPoisoned) {\n        return {dependencies: []};\n      }\n\n      return {\n        dependencies: [\n          ...scope.compilation.directives,\n          ...scope.compilation.pipes,\n          ...scope.compilation.ngModules,\n        ],\n      };\n    } else {\n      if (!this.ownerNgModule.has(type)) {\n        // This component is orphan! No need to handle the error since the component rendering\n        // pipeline (e.g., view_container_ref) will check for this error based on configs.\n        return {dependencies: []};\n      }\n\n      const scope = this.getNgModuleScope(this.ownerNgModule.get(type)!);\n\n      if (scope.compilation.isPoisoned) {\n        return {dependencies: []};\n      }\n\n      return {\n        dependencies: [...scope.compilation.directives, ...scope.compilation.pipes],\n      };\n    }\n  }\n\n  /**\n   * @override\n   * This implementation does not make use of param scopeInfo since it assumes the scope info is\n   * already added to the type itself through methods like {@link ɵɵsetNgModuleScope}\n   */\n  registerNgModule(type: Type<any>, scopeInfo: NgModuleScopeInfoFromDecorator): void {\n    if (!isNgModule(type)) {\n      throw new Error(`Attempting to register a Type which is not NgModule as NgModule: ${type}`);\n    }\n\n    // Lazily process the NgModules later when needed.\n    this.ngModulesWithSomeUnresolvedDecls.add(type);\n  }\n\n  /** @override */\n  clearScopeCacheFor(type: Type<any>): void {\n    this.ngModulesScopeCache.delete(type as NgModuleType);\n    this.standaloneComponentsScopeCache.delete(type as ComponentType<any>);\n  }\n\n  /** @override */\n  getNgModuleScope(type: NgModuleType<any>): NgModuleScope {\n    if (this.ngModulesScopeCache.has(type)) {\n      return this.ngModulesScopeCache.get(type)!;\n    }\n\n    const scope = this.computeNgModuleScope(type);\n    this.ngModulesScopeCache.set(type, scope);\n\n    return scope;\n  }\n\n  /** Compute NgModule scope afresh. */\n  private computeNgModuleScope(type: NgModuleType<any>): NgModuleScope {\n    const def = getNgModuleDef(type, true);\n    const scope: NgModuleScope = {\n      exported: {directives: new Set(), pipes: new Set()},\n      compilation: {directives: new Set(), pipes: new Set()},\n    };\n\n    // Analyzing imports\n    for (const imported of maybeUnwrapFn(def.imports)) {\n      if (isNgModule(imported)) {\n        const importedScope = this.getNgModuleScope(imported);\n\n        // When this module imports another, the imported module's exported directives and pipes\n        // are added to the compilation scope of this module.\n        addSet(importedScope.exported.directives, scope.compilation.directives);\n        addSet(importedScope.exported.pipes, scope.compilation.pipes);\n      } else if (isStandalone(imported)) {\n        if (isDirective(imported) || isComponent(imported)) {\n          scope.compilation.directives.add(imported);\n        } else if (isPipe(imported)) {\n          scope.compilation.pipes.add(imported);\n        } else {\n          // The standalone thing is neither a component nor a directive nor a pipe ... (what?)\n          throw new RuntimeError(\n            RuntimeErrorCode.RUNTIME_DEPS_INVALID_IMPORTED_TYPE,\n            'The standalone imported type is neither a component nor a directive nor a pipe',\n          );\n        }\n      } else {\n        // The import is neither a module nor a module-with-providers nor a standalone thing. This\n        // is going to be an error. So we short circuit.\n        scope.compilation.isPoisoned = true;\n        break;\n      }\n    }\n\n    // Analyzing declarations\n    if (!scope.compilation.isPoisoned) {\n      for (const decl of maybeUnwrapFn(def.declarations)) {\n        // Cannot declare another NgModule or a standalone thing\n        if (isNgModule(decl) || isStandalone(decl)) {\n          scope.compilation.isPoisoned = true;\n          break;\n        }\n\n        if (isPipe(decl)) {\n          scope.compilation.pipes.add(decl);\n        } else {\n          // decl is either a directive or a component. The component may not yet have the ɵcmp due\n          // to async compilation.\n          scope.compilation.directives.add(decl);\n        }\n      }\n    }\n\n    // Analyzing exports\n    for (const exported of maybeUnwrapFn(def.exports)) {\n      if (isNgModule(exported)) {\n        // When this module exports another, the exported module's exported directives and pipes\n        // are added to both the compilation and exported scopes of this module.\n        const exportedScope = this.getNgModuleScope(exported);\n\n        // Based on the current logic there is no way to have poisoned exported scope. So no need to\n        // check for it.\n        addSet(exportedScope.exported.directives, scope.exported.directives);\n        addSet(exportedScope.exported.pipes, scope.exported.pipes);\n\n        // Some test toolings which run in JIT mode depend on this behavior that the exported scope\n        // should also be present in the compilation scope, even though AoT does not support this\n        // and it is also in odds with NgModule metadata definitions. Without this some tests in\n        // Google will fail.\n        addSet(exportedScope.exported.directives, scope.compilation.directives);\n        addSet(exportedScope.exported.pipes, scope.compilation.pipes);\n      } else if (isPipe(exported)) {\n        scope.exported.pipes.add(exported);\n      } else {\n        scope.exported.directives.add(exported);\n      }\n    }\n\n    return scope;\n  }\n\n  /** @override */\n  getStandaloneComponentScope(\n    type: ComponentType<any>,\n    rawImports?: RawScopeInfoFromDecorator[],\n  ): StandaloneComponentScope {\n    if (this.standaloneComponentsScopeCache.has(type)) {\n      return this.standaloneComponentsScopeCache.get(type)!;\n    }\n\n    const ans = this.computeStandaloneComponentScope(type, rawImports);\n    this.standaloneComponentsScopeCache.set(type, ans);\n\n    return ans;\n  }\n\n  private computeStandaloneComponentScope(\n    type: ComponentType<any>,\n    rawImports?: RawScopeInfoFromDecorator[],\n  ): StandaloneComponentScope {\n    const ans: StandaloneComponentScope = {\n      compilation: {\n        // Standalone components are always able to self-reference.\n        directives: new Set([type]),\n        pipes: new Set(),\n        ngModules: new Set(),\n      },\n    };\n\n    for (const rawImport of flatten(rawImports ?? [])) {\n      const imported = resolveForwardRef(rawImport) as Type<any>;\n\n      try {\n        verifyStandaloneImport(imported, type);\n      } catch (e) {\n        // Short-circuit if an import is not valid\n        ans.compilation.isPoisoned = true;\n        return ans;\n      }\n\n      if (isNgModule(imported)) {\n        ans.compilation.ngModules.add(imported);\n        const importedScope = this.getNgModuleScope(imported);\n\n        // Short-circuit if an imported NgModule has corrupted exported scope.\n        if (importedScope.exported.isPoisoned) {\n          ans.compilation.isPoisoned = true;\n          return ans;\n        }\n\n        addSet(importedScope.exported.directives, ans.compilation.directives);\n        addSet(importedScope.exported.pipes, ans.compilation.pipes);\n      } else if (isPipe(imported)) {\n        ans.compilation.pipes.add(imported);\n      } else if (isDirective(imported) || isComponent(imported)) {\n        ans.compilation.directives.add(imported);\n      } else {\n        // The imported thing is not module/pipe/directive/component, so we error and short-circuit\n        // here\n        ans.compilation.isPoisoned = true;\n        return ans;\n      }\n    }\n\n    return ans;\n  }\n\n  /** @override */\n  isOrphanComponent(cmp: Type<any>): boolean {\n    const def = getComponentDef(cmp);\n\n    if (!def || def.standalone) {\n      return false;\n    }\n\n    this.resolveNgModulesDecls();\n\n    return !this.ownerNgModule.has(cmp as ComponentType<any>);\n  }\n}\n\nfunction addSet<T>(sourceSet: Set<T>, targetSet: Set<T>): void {\n  for (const m of sourceSet) {\n    targetSet.add(m);\n  }\n}\n\n/** The deps tracker to be used in the current Angular app in dev mode. */\nexport const depsTracker = new DepsTracker();\n\nexport const TEST_ONLY = {DepsTracker};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// This default value is when checking the hierarchy for a token.\n//\n// It means both:\n// - the token is not provided by the current injector,\n// - only the element injectors should be checked (ie do not check module injectors\n//\n//          mod1\n//         /\n//       el1   mod2\n//         \\  /\n//         el2\n//\n// When requesting el2.injector.get(token), we should check in the following order and return the\n// first found value:\n// - el2.injector.get(token, default)\n// - el1.injector.get(token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR) -> do not check the module\n// - mod2.injector.get(token, default)\nexport const NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR = {};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {convertToBitFlags} from '../di/injector_compatibility';\nimport {InjectFlags, InjectOptions} from '../di/interface/injector';\nimport {ProviderToken} from '../di/provider_token';\nimport {NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR} from '../view/provider_flags';\n\n/**\n * Injector that looks up a value using a specific injector, before falling back to the module\n * injector. Used primarily when creating components or embedded views dynamically.\n */\nexport class ChainedInjector implements Injector {\n  constructor(\n    public injector: Injector,\n    public parentInjector: Injector,\n  ) {}\n\n  get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags | InjectOptions): T {\n    flags = convertToBitFlags(flags);\n    const value = this.injector.get<T | typeof NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR>(\n      token,\n      NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR,\n      flags,\n    );\n\n    if (\n      value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR ||\n      notFoundValue === (NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as unknown as T)\n    ) {\n      // Return the value from the root element injector when\n      // - it provides it\n      //   (value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR)\n      // - the module injector should not be checked\n      //   (notFoundValue === NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR)\n      return value as T;\n    }\n\n    return this.parentInjector.get(token, notFoundValue, flags);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {concatStringsWithSpace} from '../../util/stringify';\nimport {assertFirstCreatePass} from '../assert';\nimport {AttributeMarker} from '../interfaces/attribute_marker';\nimport {TAttributes, TNode} from '../interfaces/node';\nimport {getTView} from '../state';\n\n/**\n * Compute the static styling (class/style) from `TAttributes`.\n *\n * This function should be called during `firstCreatePass` only.\n *\n * @param tNode The `TNode` into which the styling information should be loaded.\n * @param attrs `TAttributes` containing the styling information.\n * @param writeToHost Where should the resulting static styles be written?\n *   - `false` Write to `TNode.stylesWithoutHost` / `TNode.classesWithoutHost`\n *   - `true` Write to `TNode.styles` / `TNode.classes`\n */\nexport function computeStaticStyling(\n  tNode: TNode,\n  attrs: TAttributes | null,\n  writeToHost: boolean,\n): void {\n  ngDevMode &&\n    assertFirstCreatePass(getTView(), 'Expecting to be called in first template pass only');\n  let styles: string | null = writeToHost ? tNode.styles : null;\n  let classes: string | null = writeToHost ? tNode.classes : null;\n  let mode: AttributeMarker | 0 = 0;\n  if (attrs !== null) {\n    for (let i = 0; i < attrs.length; i++) {\n      const value = attrs[i];\n      if (typeof value === 'number') {\n        mode = value;\n      } else if (mode == AttributeMarker.Classes) {\n        classes = concatStringsWithSpace(classes, value as string);\n      } else if (mode == AttributeMarker.Styles) {\n        const style = value as string;\n        const styleValue = attrs[++i] as string;\n        styles = concatStringsWithSpace(styles, style + ': ' + styleValue + ';');\n      }\n    }\n  }\n  writeToHost ? (tNode.styles = styles) : (tNode.stylesWithoutHost = styles);\n  writeToHost ? (tNode.classes = classes) : (tNode.classesWithoutHost = classes);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {InjectFlags, resolveForwardRef} from '../../di';\nimport {assertInjectImplementationNotEqual} from '../../di/inject_switch';\nimport {ɵɵinject} from '../../di/injector_compatibility';\nimport {ProviderToken} from '../../di/provider_token';\nimport {Type} from '../../interface/type';\nimport {emitInjectEvent} from '../debug/injector_profiler';\nimport {getOrCreateInjectable} from '../di';\nimport {TDirectiveHostNode} from '../interfaces/node';\nimport {getCurrentTNode, getLView} from '../state';\n\n/**\n * Returns the value associated to the given token from the injectors.\n *\n * `directiveInject` is intended to be used for directive, component and pipe factories.\n *  All other injection use `inject` which does not walk the node injector tree.\n *\n * Usage example (in factory function):\n *\n * ```ts\n * class SomeDirective {\n *   constructor(directive: DirectiveA) {}\n *\n *   static ɵdir = ɵɵdefineDirective({\n *     type: SomeDirective,\n *     factory: () => new SomeDirective(ɵɵdirectiveInject(DirectiveA))\n *   });\n * }\n * ```\n * @param token the type or token to inject\n * @param flags Injection flags\n * @returns the value from the injector or `null` when not found\n *\n * @codeGenApi\n */\nexport function ɵɵdirectiveInject<T>(token: ProviderToken<T>): T;\nexport function ɵɵdirectiveInject<T>(token: ProviderToken<T>, flags: InjectFlags): T;\nexport function ɵɵdirectiveInject<T>(\n  token: ProviderToken<T>,\n  flags = InjectFlags.Default,\n): T | null {\n  const lView = getLView();\n  // Fall back to inject() if view hasn't been created. This situation can happen in tests\n  // if inject utilities are used before bootstrapping.\n  if (lView === null) {\n    // Verify that we will not get into infinite loop.\n    ngDevMode && assertInjectImplementationNotEqual(ɵɵdirectiveInject);\n    return ɵɵinject(token, flags);\n  }\n  const tNode = getCurrentTNode();\n  const value = getOrCreateInjectable<T>(\n    tNode as TDirectiveHostNode,\n    lView,\n    resolveForwardRef(token),\n    flags,\n  );\n  ngDevMode && emitInjectEvent(token as Type<unknown>, value, flags);\n  return value;\n}\n\n/**\n * Throws an error indicating that a factory function could not be generated by the compiler for a\n * particular class.\n *\n * This instruction allows the actual error message to be optimized away when ngDevMode is turned\n * off, saving bytes of generated code while still providing a good experience in dev mode.\n *\n * The name of the class is not mentioned here, but will be in the generated factory function name\n * and thus in the stack trace.\n *\n * @codeGenApi\n */\nexport function ɵɵinvalidFactory(): never {\n  const msg = ngDevMode\n    ? `This constructor was not compatible with Dependency Injection.`\n    : 'invalid';\n  throw new Error(msg);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {Writable} from '../../interface/type';\nimport {DoCheck, OnChanges, OnInit} from '../../interface/lifecycle_hooks';\nimport {\n  assertDefined,\n  assertGreaterThan,\n  assertGreaterThanOrEqual,\n  assertNotEqual,\n  assertSame,\n} from '../../util/assert';\nimport {assertFirstCreatePass} from '../assert';\nimport {getFactoryDef} from '../definition_factory';\nimport {diPublicInInjector, getOrCreateNodeInjectorForNode} from '../di';\nimport {ɵɵdirectiveInject} from '../instructions/di';\nimport {AttributeMarker} from '../interfaces/attribute_marker';\nimport type {\n  ComponentDef,\n  DirectiveDef,\n  HostDirectiveDef,\n  HostDirectiveDefs,\n} from '../interfaces/definition';\nimport {NodeInjectorFactory} from '../interfaces/injector';\nimport {\n  HostDirectiveInputs,\n  HostDirectiveOutputs,\n  InitialInputs,\n  NodeInputBindings,\n  NodeOutputBindings,\n  TNodeFlags,\n  type TContainerNode,\n  type TElementContainerNode,\n  type TElementNode,\n  type TNode,\n} from '../interfaces/node';\nimport {isComponentDef} from '../interfaces/type_checks';\nimport {HEADER_OFFSET, HostBindingOpCodes, type LView, type TView} from '../interfaces/view';\nimport {isInlineTemplate} from '../node_selector_matcher';\nimport {NO_CHANGE} from '../tokens';\nimport {mergeHostAttrs} from '../util/attrs_utils';\nimport {allocExpando} from './construction';\n\nexport type DirectiveMatcherStrategy = (\n  tView: TView,\n  tNode: TElementNode | TContainerNode | TElementContainerNode,\n) => DirectiveDef<unknown>[] | null;\n\n/** Data produced after host directives are resolved for a node. */\ntype HostDirectiveResolution = [\n  matches: DirectiveDef<unknown>[],\n  hostDirectiveDefs: HostDirectiveDefs | null,\n  hostDirectiveRanges: HostDirectiveRanges | null,\n];\n\n/**\n * Map that tracks a selector-matched directive to the range within which its host directives\n * are declared. Host directives for a specific directive are always contiguous within the runtime.\n * Note that both the start and end are inclusive and they're both **after** `tNode.directiveStart`.\n */\ntype HostDirectiveRanges = Map<DirectiveDef<unknown>, [start: number, end: number]>;\n\n/**\n * Resolve the matched directives on a node.\n */\nexport function resolveDirectives(\n  tView: TView,\n  lView: LView,\n  tNode: TElementNode | TContainerNode | TElementContainerNode,\n  localRefs: string[] | null,\n  directiveMatcher: DirectiveMatcherStrategy,\n): void {\n  // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in tsickle.\n  ngDevMode && assertFirstCreatePass(tView);\n\n  const exportsMap: Record<string, number> | null = localRefs === null ? null : {'': -1};\n  const matchedDirectiveDefs = directiveMatcher(tView, tNode);\n\n  if (matchedDirectiveDefs !== null) {\n    let directiveDefs: DirectiveDef<unknown>[];\n    let hostDirectiveDefs: HostDirectiveDefs | null = null;\n    let hostDirectiveRanges: HostDirectiveRanges | null = null;\n    const hostDirectiveResolution = resolveHostDirectives(matchedDirectiveDefs);\n\n    if (hostDirectiveResolution === null) {\n      directiveDefs = matchedDirectiveDefs;\n    } else {\n      [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] = hostDirectiveResolution;\n    }\n\n    initializeDirectives(\n      tView,\n      lView,\n      tNode,\n      directiveDefs,\n      exportsMap,\n      hostDirectiveDefs,\n      hostDirectiveRanges,\n    );\n  }\n  if (exportsMap !== null && localRefs !== null) {\n    cacheMatchingLocalNames(tNode, localRefs, exportsMap);\n  }\n}\n\n/** Caches local names and their matching directive indices for query and template lookups. */\nfunction cacheMatchingLocalNames(\n  tNode: TNode,\n  localRefs: string[],\n  exportsMap: {[key: string]: number},\n): void {\n  const localNames: (string | number)[] = (tNode.localNames = []);\n\n  // Local names must be stored in tNode in the same order that localRefs are defined\n  // in the template to ensure the data is loaded in the same slots as their refs\n  // in the template (for template queries).\n  for (let i = 0; i < localRefs.length; i += 2) {\n    const index = exportsMap[localRefs[i + 1]];\n    if (index == null)\n      throw new RuntimeError(\n        RuntimeErrorCode.EXPORT_NOT_FOUND,\n        ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`,\n      );\n    localNames.push(localRefs[i], index);\n  }\n}\n\nfunction resolveHostDirectives(matches: DirectiveDef<unknown>[]): HostDirectiveResolution | null {\n  let componentDef: ComponentDef<unknown> | null = null;\n  let hasHostDirectives = false;\n\n  for (let i = 0; i < matches.length; i++) {\n    const def = matches[i];\n\n    if (i === 0 && isComponentDef(def)) {\n      componentDef = def;\n    }\n\n    if (def.findHostDirectiveDefs !== null) {\n      hasHostDirectives = true;\n      break;\n    }\n  }\n\n  if (!hasHostDirectives) {\n    return null;\n  }\n\n  let allDirectiveDefs: DirectiveDef<unknown>[] | null = null;\n  let hostDirectiveDefs: HostDirectiveDefs | null = null;\n  let hostDirectiveRanges: HostDirectiveRanges | null = null;\n\n  // Components are inserted at the front of the matches array so that their lifecycle\n  // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine\n  // compatibility. This logic doesn't make sense with host directives, because it\n  // would allow the host directives to undo any overrides the host may have made.\n  // To handle this case, the host directives of components are inserted at the beginning\n  // of the array, followed by the component. As such, the insertion order is as follows:\n  // 1. Host directives belonging to the selector-matched component.\n  // 2. Selector-matched component.\n  // 3. Host directives belonging to selector-matched directives.\n  // 4. Selector-matched dir\n  for (const def of matches) {\n    if (def.findHostDirectiveDefs !== null) {\n      allDirectiveDefs ??= [];\n      hostDirectiveDefs ??= new Map();\n      hostDirectiveRanges ??= new Map();\n      resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs);\n    }\n\n    // Component definition needs to be pushed early to maintain the correct ordering.\n    if (def === componentDef) {\n      allDirectiveDefs ??= [];\n      allDirectiveDefs.push(def);\n    }\n  }\n\n  if (allDirectiveDefs !== null) {\n    allDirectiveDefs.push(...(componentDef === null ? matches : matches.slice(1)));\n    ngDevMode && assertNoDuplicateDirectives(allDirectiveDefs);\n    return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges];\n  }\n\n  return null;\n}\n\nfunction resolveHostDirectivesForDef(\n  def: DirectiveDef<unknown>,\n  allDirectiveDefs: DirectiveDef<unknown>[],\n  hostDirectiveRanges: HostDirectiveRanges,\n  hostDirectiveDefs: HostDirectiveDefs,\n) {\n  ngDevMode && assertDefined(def.findHostDirectiveDefs, 'Expected host directive resolve function');\n  const start = allDirectiveDefs.length;\n  // TODO(pk): probably could return matches instead of taking in an array to fill in?\n  def.findHostDirectiveDefs!(def, allDirectiveDefs, hostDirectiveDefs);\n\n  // Note that these indexes are within the offset by `directiveStart`. We can't do the\n  // offsetting here, because `directiveStart` hasn't been initialized on the TNode yet.\n  hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]);\n}\n\n/**\n * Marks a given TNode as a component's host. This consists of:\n * - setting the component offset on the TNode.\n * - storing index of component's host element so it will be queued for view refresh during CD.\n */\nfunction markAsComponentHost(tView: TView, hostTNode: TNode, componentOffset: number): void {\n  ngDevMode && assertFirstCreatePass(tView);\n  ngDevMode && assertGreaterThan(componentOffset, -1, 'componentOffset must be great than -1');\n  hostTNode.componentOffset = componentOffset;\n  (tView.components ??= []).push(hostTNode.index);\n}\n\n/** Initializes the data structures necessary for a list of directives to be instantiated. */\nfunction initializeDirectives(\n  tView: TView,\n  lView: LView<unknown>,\n  tNode: TElementNode | TContainerNode | TElementContainerNode,\n  directives: DirectiveDef<unknown>[],\n  exportsMap: {[key: string]: number} | null,\n  hostDirectiveDefs: HostDirectiveDefs | null,\n  hostDirectiveRanges: HostDirectiveRanges | null,\n) {\n  ngDevMode && assertFirstCreatePass(tView);\n\n  const directivesLength = directives.length;\n  let hasSeenComponent = false;\n\n  // Publishes the directive types to DI so they can be injected. Needs to\n  // happen in a separate pass before the TNode flags have been initialized.\n  for (let i = 0; i < directivesLength; i++) {\n    const def = directives[i];\n    if (!hasSeenComponent && isComponentDef(def)) {\n      hasSeenComponent = true;\n      markAsComponentHost(tView, tNode, i);\n    }\n    diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, def.type);\n  }\n\n  initTNodeFlags(tNode, tView.data.length, directivesLength);\n\n  // When the same token is provided by several directives on the same node, some rules apply in\n  // the viewEngine:\n  // - viewProviders have priority over providers\n  // - the last directive in NgModule.declarations has priority over the previous one\n  // So to match these rules, the order in which providers are added in the arrays is very\n  // important.\n  for (let i = 0; i < directivesLength; i++) {\n    const def = directives[i];\n    if (def.providersResolver) def.providersResolver(def);\n  }\n  let preOrderHooksFound = false;\n  let preOrderCheckHooksFound = false;\n  let directiveIdx = allocExpando(tView, lView, directivesLength, null);\n  ngDevMode &&\n    assertSame(\n      directiveIdx,\n      tNode.directiveStart,\n      'TNode.directiveStart should point to just allocated space',\n    );\n\n  // If there's at least one directive, we'll have to track it so initialize the map.\n  if (directivesLength > 0) {\n    tNode.directiveToIndex = new Map();\n  }\n\n  for (let i = 0; i < directivesLength; i++) {\n    const def = directives[i];\n    // Merge the attrs in the order of matches. This assumes that the first directive is the\n    // component itself, so that the component has the least priority.\n    tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs);\n\n    configureViewWithDirective(tView, tNode, lView, directiveIdx, def);\n    saveNameToExportMap(directiveIdx, def, exportsMap);\n\n    // If a directive has host directives, we need to track both its index and the range within\n    // the host directives are declared. Host directives are not tracked, but should be resolved\n    // by looking up the host and getting its indexes from there.\n    if (hostDirectiveRanges !== null && hostDirectiveRanges.has(def)) {\n      const [start, end] = hostDirectiveRanges.get(def)!;\n      tNode.directiveToIndex!.set(def.type, [\n        directiveIdx,\n        start + tNode.directiveStart,\n        end + tNode.directiveStart,\n      ]);\n    } else if (hostDirectiveDefs === null || !hostDirectiveDefs.has(def)) {\n      tNode.directiveToIndex!.set(def.type, directiveIdx);\n    }\n\n    if (def.contentQueries !== null) tNode.flags |= TNodeFlags.hasContentQuery;\n    if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0)\n      tNode.flags |= TNodeFlags.hasHostBindings;\n\n    const lifeCycleHooks: Partial<OnChanges & OnInit & DoCheck> = def.type.prototype;\n    // Only push a node index into the preOrderHooks array if this is the first\n    // pre-order hook found on this node.\n    if (\n      !preOrderHooksFound &&\n      (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngOnInit || lifeCycleHooks.ngDoCheck)\n    ) {\n      // We will push the actual hook function into this array later during dir instantiation.\n      // We cannot do it now because we must ensure hooks are registered in the same\n      // order that directives are created (i.e. injection order).\n      (tView.preOrderHooks ??= []).push(tNode.index);\n      preOrderHooksFound = true;\n    }\n\n    if (!preOrderCheckHooksFound && (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngDoCheck)) {\n      (tView.preOrderCheckHooks ??= []).push(tNode.index);\n      preOrderCheckHooksFound = true;\n    }\n\n    directiveIdx++;\n  }\n\n  initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs);\n}\n\n/**\n * Initializes data structures required to work with directive inputs and outputs.\n * Initialization is done for all directives matched on a given TNode.\n */\nfunction initializeInputAndOutputAliases(\n  tView: TView,\n  tNode: TNode,\n  hostDirectiveDefs: HostDirectiveDefs | null,\n): void {\n  ngDevMode && assertFirstCreatePass(tView);\n\n  for (let index = tNode.directiveStart; index < tNode.directiveEnd; index++) {\n    const directiveDef = tView.data[index] as DirectiveDef<any>;\n\n    if (hostDirectiveDefs === null || !hostDirectiveDefs.has(directiveDef)) {\n      setupSelectorMatchedInputsOrOutputs(BindingType.Inputs, tNode, directiveDef, index);\n      setupSelectorMatchedInputsOrOutputs(BindingType.Outputs, tNode, directiveDef, index);\n      setupInitialInputs(tNode, index, false);\n    } else {\n      const hostDirectiveDef = hostDirectiveDefs.get(directiveDef)!;\n      setupHostDirectiveInputsOrOutputs(BindingType.Inputs, tNode, hostDirectiveDef, index);\n      setupHostDirectiveInputsOrOutputs(BindingType.Outputs, tNode, hostDirectiveDef, index);\n      setupInitialInputs(tNode, index, true);\n    }\n  }\n}   \n\n/** Types of bindings that can be exposed by a directive. */\nconst enum BindingType {\n  Inputs,\n  Outputs,\n}\n\n/**\n * Sets up the input/output bindings for a directive that was matched in the template through its\n * selector. This method is called repeatedly to build up all of the available inputs on a node.\n *\n * @param mode Whether inputs or outputs are being contructed.\n * @param tNode Node on which the bindings are being set up.\n * @param def Directive definition for which the bindings are being set up.\n * @param directiveIndex Index at which the directive instance will be stored in the LView.\n */\nfunction setupSelectorMatchedInputsOrOutputs<T>(\n  mode: BindingType,\n  tNode: TNode,\n  def: DirectiveDef<T>,\n  directiveIndex: number,\n): void {\n  const aliasMap = mode === BindingType.Inputs ? def.inputs : def.outputs;\n\n  for (const publicName in aliasMap) {\n    if (aliasMap.hasOwnProperty(publicName)) {\n      let bindings: NodeInputBindings | NodeOutputBindings;\n      if (mode === BindingType.Inputs) {\n        bindings = tNode.inputs ??= {};\n      } else {\n        bindings = tNode.outputs ??= {};\n      }\n      bindings[publicName] ??= [];\n      bindings[publicName].push(directiveIndex);\n      setShadowStylingInputFlags(tNode, publicName);\n    }\n  }\n}\n\n/**\n * Sets up input/output bindings that were defined through host directives on a specific node.\n * @param mode Whether inputs or outputs are being contructed.\n * @param tNode Node on which the bindings are being set up.\n * @param config Host directive definition that is being set up.\n * @param directiveIndex Index at which the directive instance will be stored in the LView.\n */\nfunction setupHostDirectiveInputsOrOutputs(\n  mode: BindingType,\n  tNode: TNode,\n  config: HostDirectiveDef,\n  directiveIndex: number,\n): void {\n  const aliasMap = mode === BindingType.Inputs ? config.inputs : config.outputs;\n\n  for (const initialName in aliasMap) {\n    if (aliasMap.hasOwnProperty(initialName)) {\n      const publicName = aliasMap[initialName];\n      let bindings: HostDirectiveInputs | HostDirectiveOutputs;\n      if (mode === BindingType.Inputs) {\n        bindings = tNode.hostDirectiveInputs ??= {};\n      } else {\n        bindings = tNode.hostDirectiveOutputs ??= {};\n      }\n      bindings[publicName] ??= [];\n      bindings[publicName].push(directiveIndex, initialName);\n      setShadowStylingInputFlags(tNode, publicName);\n    }\n  }\n}\n\nfunction setShadowStylingInputFlags(tNode: TNode, publicName: string): void {\n  if (publicName === 'class') {\n    tNode.flags |= TNodeFlags.hasClassInput;\n  } else if (publicName === 'style') {\n    tNode.flags |= TNodeFlags.hasStyleInput;\n  }\n}\n\n/**\n * Sets up the initialInputData for a node and stores it in the template's static storage\n * so subsequent template invocations don't have to recalculate it.\n *\n * initialInputData is an array containing values that need to be set as input properties\n * for directives on this node, but only once on creation. We need this array to support\n * the case where you set an @Input property of a directive using attribute-like syntax.\n * e.g. if you have a `name` @Input, you can set it once like this:\n *\n * <my-component name=\"Bess\"></my-component>\n *\n * @param tNode TNode on which to set up the initial inputs.\n * @param directiveIndex Index of the directive that is currently being processed.\n */\nfunction setupInitialInputs(tNode: TNode, directiveIndex: number, isHostDirective: boolean): void {\n  const {attrs, inputs, hostDirectiveInputs} = tNode;\n\n  if (\n    attrs === null ||\n    (!isHostDirective && inputs === null) ||\n    (isHostDirective && hostDirectiveInputs === null) ||\n    // Do not use unbound attributes as inputs to structural directives, since structural\n    // directive inputs can only be set using microsyntax (e.g. `<div *dir=\"exp\">`).\n    isInlineTemplate(tNode)\n  ) {\n    tNode.initialInputs ??= [];\n    tNode.initialInputs.push(null);\n    return;\n  }\n\n  let inputsToStore: InitialInputs | null = null;\n  let i = 0;\n  while (i < attrs.length) {\n    const attrName = attrs[i];\n    if (attrName === AttributeMarker.NamespaceURI) {\n      // We do not allow inputs on namespaced attributes.\n      i += 4;\n      continue;\n    } else if (attrName === AttributeMarker.ProjectAs) {\n      // Skip over the `ngProjectAs` value.\n      i += 2;\n      continue;\n    } else if (typeof attrName === 'number') {\n      // If we hit any other attribute markers, we're done anyway. None of those are valid inputs.\n      break;\n    }\n\n    if (!isHostDirective && inputs!.hasOwnProperty(attrName as string)) {\n      // Find the input's public name from the input store. Note that we can be found easier\n      // through the directive def, but we want to do it using the inputs store so that it can\n      // account for host directive aliases.\n      const inputConfig = inputs![attrName as string];\n\n      for (const index of inputConfig) {\n        if (index === directiveIndex) {\n          inputsToStore ??= [];\n          inputsToStore.push(attrName as string, attrs[i + 1] as string);\n          // A directive can't have multiple inputs with the same name so we can break here.\n          break;\n        }\n      }\n    } else if (isHostDirective && hostDirectiveInputs!.hasOwnProperty(attrName as string)) {\n      const config = hostDirectiveInputs![attrName as string];\n      for (let j = 0; j < config.length; j += 2) {\n        if (config[j] === directiveIndex) {\n          inputsToStore ??= [];\n          inputsToStore.push(config[j + 1] as string, attrs[i + 1] as string);\n          break;\n        }\n      }\n    }\n\n    i += 2;\n  }\n\n  tNode.initialInputs ??= [];\n  tNode.initialInputs.push(inputsToStore);\n}\n\n/**\n * Setup directive for instantiation.\n *\n * We need to create a `NodeInjectorFactory` which is then inserted in both the `Blueprint` as well\n * as `LView`. `TView` gets the `DirectiveDef`.\n *\n * @param tView `TView`\n * @param tNode `TNode`\n * @param lView `LView`\n * @param directiveIndex Index where the directive will be stored in the Expando.\n * @param def `DirectiveDef`\n */\nfunction configureViewWithDirective<T>(\n  tView: TView,\n  tNode: TNode,\n  lView: LView,\n  directiveIndex: number,\n  def: DirectiveDef<T>,\n): void {\n  ngDevMode &&\n    assertGreaterThanOrEqual(directiveIndex, HEADER_OFFSET, 'Must be in Expando section');\n  tView.data[directiveIndex] = def;\n  const directiveFactory =\n    def.factory || ((def as Writable<DirectiveDef<T>>).factory = getFactoryDef(def.type, true));\n  // Even though `directiveFactory` will already be using `ɵɵdirectiveInject` in its generated code,\n  // we also want to support `inject()` directly from the directive constructor context so we set\n  // `ɵɵdirectiveInject` as the inject implementation here too.\n  const nodeInjectorFactory = new NodeInjectorFactory(\n    directiveFactory,\n    isComponentDef(def),\n    ɵɵdirectiveInject,\n  );\n  tView.blueprint[directiveIndex] = nodeInjectorFactory;\n  lView[directiveIndex] = nodeInjectorFactory;\n\n  registerHostBindingOpCodes(\n    tView,\n    tNode,\n    directiveIndex,\n    allocExpando(tView, lView, def.hostVars, NO_CHANGE),\n    def,\n  );\n}\n\n/**\n * Add `hostBindings` to the `TView.hostBindingOpCodes`.\n *\n * @param tView `TView` to which the `hostBindings` should be added.\n * @param tNode `TNode` the element which contains the directive\n * @param directiveIdx Directive index in view.\n * @param directiveVarsIdx Where will the directive's vars be stored\n * @param def `ComponentDef`/`DirectiveDef`, which contains the `hostVars`/`hostBindings` to add.\n */\nexport function registerHostBindingOpCodes(\n  tView: TView,\n  tNode: TNode,\n  directiveIdx: number,\n  directiveVarsIdx: number,\n  def: ComponentDef<any> | DirectiveDef<any>,\n): void {\n  ngDevMode && assertFirstCreatePass(tView);\n\n  const hostBindings = def.hostBindings;\n  if (hostBindings) {\n    let hostBindingOpCodes = tView.hostBindingOpCodes;\n    if (hostBindingOpCodes === null) {\n      hostBindingOpCodes = tView.hostBindingOpCodes = [] as any as HostBindingOpCodes;\n    }\n    const elementIndx = ~tNode.index;\n    if (lastSelectedElementIdx(hostBindingOpCodes) != elementIndx) {\n      // Conditionally add select element so that we are more efficient in execution.\n      // NOTE: this is strictly not necessary and it trades code size for runtime perf.\n      // (We could just always add it.)\n      hostBindingOpCodes.push(elementIndx);\n    }\n    hostBindingOpCodes.push(directiveIdx, directiveVarsIdx, hostBindings);\n  }\n}\n\n/**\n * Returns the last selected element index in the `HostBindingOpCodes`\n *\n * For perf reasons we don't need to update the selected element index in `HostBindingOpCodes` only\n * if it changes. This method returns the last index (or '0' if not found.)\n *\n * Selected element index are only the ones which are negative.\n */\nfunction lastSelectedElementIdx(hostBindingOpCodes: HostBindingOpCodes): number {\n  let i = hostBindingOpCodes.length;\n  while (i > 0) {\n    const value = hostBindingOpCodes[--i];\n    if (typeof value === 'number' && value < 0) {\n      return value;\n    }\n  }\n  return 0;\n}\n\n/**\n * Builds up an export map as directives are created, so local refs can be quickly mapped\n * to their directive instances.\n */\nfunction saveNameToExportMap(\n  directiveIdx: number,\n  def: DirectiveDef<any> | ComponentDef<any>,\n  exportsMap: {[key: string]: number} | null,\n) {\n  if (exportsMap) {\n    if (def.exportAs) {\n      for (let i = 0; i < def.exportAs.length; i++) {\n        exportsMap[def.exportAs[i]] = directiveIdx;\n      }\n    }\n    if (isComponentDef(def)) exportsMap[''] = directiveIdx;\n  }\n}\n\n/**\n * Initializes the flags on the current node, setting all indices to the initial index,\n * the directive count to 0, and adding the isComponent flag.\n * @param index the initial index\n */\nfunction initTNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) {\n  ngDevMode &&\n    assertNotEqual(\n      numberOfDirectives,\n      tNode.directiveEnd - tNode.directiveStart,\n      'Reached the max number of directives',\n    );\n  tNode.flags |= TNodeFlags.isDirectiveHost;\n  // When the first directive is created on a node, save the index\n  tNode.directiveStart = index;\n  tNode.directiveEnd = index + numberOfDirectives;\n  tNode.providerIndexes = index;\n}\n\nexport function assertNoDuplicateDirectives(directives: DirectiveDef<unknown>[]): void {\n  // The array needs at least two elements in order to have duplicates.\n  if (directives.length < 2) {\n    return;\n  }\n\n  const seenDirectives = new Set<DirectiveDef<unknown>>();\n\n  for (const current of directives) {\n    if (seenDirectives.has(current)) {\n      throw new RuntimeError(\n        RuntimeErrorCode.DUPLICATE_DIRECTIVE,\n        `Directive ${current.type.name} matches multiple times on the same element. ` +\n          `Directives can only match an element once.`,\n      );\n    }\n    seenDirectives.add(current);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertFirstCreatePass} from '../assert';\nimport {registerPostOrderHooks} from '../hooks';\nimport {TAttributes, TNode, TNodeType, type TElementNode} from '../interfaces/node';\nimport {isContentQueryHost} from '../interfaces/type_checks';\nimport type {LView, TView} from '../interfaces/view';\nimport {computeStaticStyling} from '../styling/static_styling';\nimport {getOrCreateTNode} from '../tnode_manipulation';\nimport {mergeHostAttrs} from '../util/attrs_utils';\nimport {getConstant} from '../util/view_utils';\nimport {resolveDirectives, type DirectiveMatcherStrategy} from './directives';\n\nexport function elementStartFirstCreatePass(\n  index: number,\n  tView: TView,\n  lView: LView,\n  name: string,\n  directiveMatcher: DirectiveMatcherStrategy,\n  bindingsEnabled: boolean,\n  attrsIndex?: number | null,\n  localRefsIndex?: number,\n): TElementNode {\n  ngDevMode && assertFirstCreatePass(tView);\n  ngDevMode && ngDevMode.firstCreatePass++;\n\n  const tViewConsts = tView.consts;\n  const attrs = getConstant<TAttributes>(tViewConsts, attrsIndex);\n  const tNode = getOrCreateTNode(tView, index, TNodeType.Element, name, attrs);\n\n  if (bindingsEnabled) {\n    resolveDirectives(\n      tView,\n      lView,\n      tNode,\n      getConstant<string[]>(tViewConsts, localRefsIndex),\n      directiveMatcher,\n    );\n  }\n\n  // Merge the template attrs last so that they have the highest priority.\n  tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);\n\n  if (tNode.attrs !== null) {\n    computeStaticStyling(tNode, tNode.attrs, false);\n  }\n\n  if (tNode.mergedAttrs !== null) {\n    computeStaticStyling(tNode, tNode.mergedAttrs, true);\n  }\n\n  if (tView.queries !== null) {\n    tView.queries.elementStart(tView, tNode);\n  }\n\n  return tNode;\n}\n\nexport function elementEndFirstCreatePass(tView: TView, tNode: TNode) {\n  ngDevMode && assertFirstCreatePass(tView);\n  registerPostOrderHooks(tView, tNode);\n  if (isContentQueryHost(tNode)) {\n    tView.queries!.elementEnd(tNode);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../primitives/signals';\n\nimport {ChangeDetectorRef} from '../change_detection/change_detector_ref';\nimport {\n  ChangeDetectionScheduler,\n  NotificationSource,\n} from '../change_detection/scheduling/zoneless_scheduling';\nimport {Injector} from '../di/injector';\nimport {EnvironmentInjector} from '../di/r3_injector';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type} from '../interface/type';\nimport {\n  ComponentFactory as AbstractComponentFactory,\n  ComponentRef as AbstractComponentRef,\n} from '../linker/component_factory';\nimport {ComponentFactoryResolver as AbstractComponentFactoryResolver} from '../linker/component_factory_resolver';\nimport {createElementRef, ElementRef} from '../linker/element_ref';\nimport {NgModuleRef} from '../linker/ng_module_factory';\nimport {RendererFactory2} from '../render/api';\nimport {Sanitizer} from '../sanitization/sanitizer';\n\nimport {assertComponentType} from './assert';\nimport {attachPatchData} from './context_discovery';\nimport {getComponentDef} from './def_getters';\nimport {depsTracker} from './deps_tracker/deps_tracker';\nimport {NodeInjector} from './di';\nimport {reportUnknownPropertyError} from './instructions/element_validation';\nimport {markViewDirty} from './instructions/mark_view_dirty';\nimport {renderView} from './instructions/render';\nimport {\n  createDirectivesInstances,\n  locateHostElement,\n  setAllInputsForProperty,\n} from './instructions/shared';\nimport {ComponentDef, DirectiveDef} from './interfaces/definition';\nimport {InputFlags} from './interfaces/input_flags';\nimport {TContainerNode, TElementContainerNode, TElementNode, TNode} from './interfaces/node';\nimport {RElement, RNode} from './interfaces/renderer_dom';\nimport {\n  CONTEXT,\n  HEADER_OFFSET,\n  LView,\n  LViewEnvironment,\n  LViewFlags,\n  TVIEW,\n  TViewType,\n} from './interfaces/view';\nimport {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces';\n\nimport {retrieveHydrationInfo} from '../hydration/utils';\nimport {ChainedInjector} from './chained_injector';\nimport {createElementNode, setupStaticAttributes} from './dom_node_manipulation';\nimport {unregisterLView} from './interfaces/lview_tracking';\nimport {Renderer} from './interfaces/renderer';\nimport {\n  extractAttrsAndClassesFromSelector,\n  stringifyCSSSelectorList,\n} from './node_selector_matcher';\nimport {profiler} from './profiler';\nimport {ProfilerEvent} from './profiler_types';\nimport {executeContentQueries} from './queries/query_execution';\nimport {enterView, leaveView} from './state';\nimport {debugStringifyTypeForError, stringifyForError} from './util/stringify_utils';\nimport {getComponentLViewByIndex, getTNode} from './util/view_utils';\nimport {elementEndFirstCreatePass, elementStartFirstCreatePass} from './view/elements';\nimport {ViewRef} from './view_ref';\nimport {createLView, createTView, getInitialLViewFlagsFromDef} from './view/construction';\n\nexport class ComponentFactoryResolver extends AbstractComponentFactoryResolver {\n  /**\n   * @param ngModule The NgModuleRef to which all resolved factories are bound.\n   */\n  constructor(private ngModule?: NgModuleRef<any>) {\n    super();\n  }\n\n  override resolveComponentFactory<T>(component: Type<T>): AbstractComponentFactory<T> {\n    ngDevMode && assertComponentType(component);\n    const componentDef = getComponentDef(component)!;\n    return new ComponentFactory(componentDef, this.ngModule);\n  }\n}\n\nfunction toInputRefArray<T>(map: DirectiveDef<T>['inputs']): ComponentFactory<T>['inputs'] {\n  return Object.keys(map).map((name) => {\n    const [propName, flags, transform] = map[name];\n    const inputData: ComponentFactory<T>['inputs'][0] = {\n      propName: propName,\n      templateName: name,\n      isSignal: (flags & InputFlags.SignalBased) !== 0,\n    };\n    if (transform) {\n      inputData.transform = transform;\n    }\n    return inputData;\n  });\n}\n\nfunction toOutputRefArray<T>(map: DirectiveDef<T>['outputs']): ComponentFactory<T>['outputs'] {\n  return Object.keys(map).map((name) => ({propName: map[name], templateName: name}));\n}\n\nfunction verifyNotAnOrphanComponent(componentDef: ComponentDef<unknown>) {\n  // TODO(pk): create assert that verifies ngDevMode\n  if (\n    (typeof ngJitMode === 'undefined' || ngJitMode) &&\n    componentDef.debugInfo?.forbidOrphanRendering\n  ) {\n    if (depsTracker.isOrphanComponent(componentDef.type)) {\n      throw new RuntimeError(\n        RuntimeErrorCode.RUNTIME_DEPS_ORPHAN_COMPONENT,\n        `Orphan component found! Trying to render the component ${debugStringifyTypeForError(\n          componentDef.type,\n        )} without first loading the NgModule that declares it. It is recommended to make this component standalone in order to avoid this error. If this is not possible now, import the component's NgModule in the appropriate NgModule, or the standalone component in which you are trying to render this component. If this is a lazy import, load the NgModule lazily as well and use its module injector.`,\n      );\n    }\n  }\n}\n\nfunction createRootViewInjector(\n  componentDef: ComponentDef<unknown>,\n  environmentInjector: EnvironmentInjector | NgModuleRef<any> | undefined,\n  injector: Injector,\n): Injector {\n  let realEnvironmentInjector =\n    environmentInjector instanceof EnvironmentInjector\n      ? environmentInjector\n      : environmentInjector?.injector;\n\n  if (realEnvironmentInjector && componentDef.getStandaloneInjector !== null) {\n    realEnvironmentInjector =\n      componentDef.getStandaloneInjector(realEnvironmentInjector) || realEnvironmentInjector;\n  }\n\n  const rootViewInjector = realEnvironmentInjector\n    ? new ChainedInjector(injector, realEnvironmentInjector)\n    : injector;\n  return rootViewInjector;\n}\n\nfunction createRootLViewEnvironment(rootLViewInjector: Injector): LViewEnvironment {\n  const rendererFactory = rootLViewInjector.get(RendererFactory2, null);\n  if (rendererFactory === null) {\n    throw new RuntimeError(\n      RuntimeErrorCode.RENDERER_NOT_FOUND,\n      ngDevMode &&\n        'Angular was not able to inject a renderer (RendererFactory2). ' +\n          'Likely this is due to a broken DI hierarchy. ' +\n          'Make sure that any injector used to create this component has a correct parent.',\n    );\n  }\n\n  const sanitizer = rootLViewInjector.get(Sanitizer, null);\n  const changeDetectionScheduler = rootLViewInjector.get(ChangeDetectionScheduler, null);\n\n  return {\n    rendererFactory,\n    sanitizer,\n    changeDetectionScheduler,\n  };\n}\n\nfunction createHostElement(componentDef: ComponentDef<unknown>, render: Renderer): RElement {\n  // Determine a tag name used for creating host elements when this component is created\n  // dynamically. Default to 'div' if this component did not specify any tag name in its\n  // selector.\n  const tagName = ((componentDef.selectors[0][0] as string) || 'div').toLowerCase();\n  const namespace =\n    tagName === 'svg' ? SVG_NAMESPACE : tagName === 'math' ? MATH_ML_NAMESPACE : null;\n  return createElementNode(render, tagName, namespace);\n}\n\n/**\n * ComponentFactory interface implementation.\n */\nexport class ComponentFactory<T> extends AbstractComponentFactory<T> {\n  override selector: string;\n  override componentType: Type<any>;\n  override ngContentSelectors: string[];\n  isBoundToModule: boolean;\n  private cachedInputs:\n    | {\n        propName: string;\n        templateName: string;\n        isSignal: boolean;\n        transform?: (value: any) => any;\n      }[]\n    | null = null;\n  private cachedOutputs: {propName: string; templateName: string}[] | null = null;\n\n  override get inputs(): {\n    propName: string;\n    templateName: string;\n    isSignal: boolean;\n    transform?: (value: any) => any;\n  }[] {\n    this.cachedInputs ??= toInputRefArray(this.componentDef.inputs);\n    return this.cachedInputs;\n  }\n\n  override get outputs(): {propName: string; templateName: string}[] {\n    this.cachedOutputs ??= toOutputRefArray(this.componentDef.outputs);\n    return this.cachedOutputs;\n  }\n\n  /**\n   * @param componentDef The component definition.\n   * @param ngModule The NgModuleRef to which the factory is bound.\n   */\n  constructor(\n    private componentDef: ComponentDef<any>,\n    private ngModule?: NgModuleRef<any>,\n  ) {\n    super();\n    this.componentType = componentDef.type;\n    this.selector = stringifyCSSSelectorList(componentDef.selectors);\n    this.ngContentSelectors = componentDef.ngContentSelectors ?? [];\n    this.isBoundToModule = !!ngModule;\n  }\n\n  override create(\n    injector: Injector,\n    projectableNodes?: any[][] | undefined,\n    rootSelectorOrNode?: any,\n    environmentInjector?: NgModuleRef<any> | EnvironmentInjector | undefined,\n  ): AbstractComponentRef<T> {\n    profiler(ProfilerEvent.DynamicComponentStart);\n\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      const cmpDef = this.componentDef;\n      ngDevMode && verifyNotAnOrphanComponent(cmpDef);\n\n      const tAttributes = rootSelectorOrNode\n        ? ['ng-version', '19.2.14']\n        : // Extract attributes and classes from the first selector only to match VE behavior.\n          extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]);\n      // Create the root view. Uses empty TView and ContentTemplate.\n      const rootTView = createTView(\n        TViewType.Root,\n        null,\n        null,\n        1,\n        0,\n        null,\n        null,\n        null,\n        null,\n        [tAttributes],\n        null,\n      );\n\n      const rootViewInjector = createRootViewInjector(\n        cmpDef,\n        environmentInjector || this.ngModule,\n        injector,\n      );\n\n      const environment = createRootLViewEnvironment(rootViewInjector);\n      const hostRenderer = environment.rendererFactory.createRenderer(null, cmpDef);\n      const hostElement = rootSelectorOrNode\n        ? locateHostElement(\n            hostRenderer,\n            rootSelectorOrNode,\n            cmpDef.encapsulation,\n            rootViewInjector,\n          )\n        : createHostElement(cmpDef, hostRenderer);\n\n      const rootLView = createLView<T>(\n        null,\n        rootTView,\n        null,\n        LViewFlags.IsRoot | getInitialLViewFlagsFromDef(cmpDef),\n        null,\n        null,\n        environment,\n        hostRenderer,\n        rootViewInjector,\n        null,\n        retrieveHydrationInfo(hostElement, rootViewInjector, true /* isRootView */),\n      );\n\n      rootLView[HEADER_OFFSET] = hostElement;\n\n      // rootView is the parent when bootstrapping\n      // TODO(misko): it looks like we are entering view here but we don't really need to as\n      // `renderView` does that. However as the code is written it is needed because\n      // `createRootComponentView` and `createRootComponent` both read global state. Fixing those\n      // issues would allow us to drop this.\n      enterView(rootLView);\n\n      let componentView: LView | null = null;\n\n      try {\n        const hostTNode = elementStartFirstCreatePass(\n          HEADER_OFFSET,\n          rootTView,\n          rootLView,\n          '#host',\n          () => [this.componentDef],\n          true,\n          0,\n        );\n\n        // ---- element instruction\n\n        // TODO(crisbeto): in practice `hostRNode` should always be defined, but there are some\n        // tests where the renderer is mocked out and `undefined` is returned. We should update the\n        // tests so that this check can be removed.\n        if (hostElement) {\n          setupStaticAttributes(hostRenderer, hostElement, hostTNode);\n          attachPatchData(hostElement, rootLView);\n        }\n\n        // TODO(pk): this logic is similar to the instruction code where a node can have directives\n        createDirectivesInstances(rootTView, rootLView, hostTNode);\n        executeContentQueries(rootTView, hostTNode, rootLView);\n\n        elementEndFirstCreatePass(rootTView, hostTNode);\n\n        if (projectableNodes !== undefined) {\n          projectNodes(hostTNode, this.ngContentSelectors, projectableNodes);\n        }\n\n        componentView = getComponentLViewByIndex(hostTNode.index, rootLView);\n\n        // TODO(pk): why do we need this logic?\n        rootLView[CONTEXT] = componentView[CONTEXT] as T;\n\n        renderView(rootTView, rootLView, null);\n      } catch (e) {\n        // Stop tracking the views if creation failed since\n        // the consumer won't have a way to dereference them.\n        if (componentView !== null) {\n          unregisterLView(componentView);\n        }\n        unregisterLView(rootLView);\n        throw e;\n      } finally {\n        profiler(ProfilerEvent.DynamicComponentEnd);\n        leaveView();\n      }\n\n      return new ComponentRef(this.componentType, rootLView);\n    } finally {\n      setActiveConsumer(prevConsumer);\n    }\n  }\n}\n\n/**\n * Represents an instance of a Component created via a {@link ComponentFactory}.\n *\n * `ComponentRef` provides access to the Component Instance as well other objects related to this\n * Component Instance and allows you to destroy the Component Instance via the {@link #destroy}\n * method.\n *\n */\nexport class ComponentRef<T> extends AbstractComponentRef<T> {\n  override instance: T;\n  override hostView: ViewRef<T>;\n  override changeDetectorRef: ChangeDetectorRef;\n  override componentType: Type<T>;\n  override location: ElementRef;\n  private previousInputValues: Map<string, unknown> | null = null;\n  private _tNode: TElementNode | TContainerNode | TElementContainerNode;\n\n  constructor(\n    componentType: Type<T>,\n    private _rootLView: LView,\n  ) {\n    super();\n    this._tNode = getTNode(_rootLView[TVIEW], HEADER_OFFSET) as TElementNode;\n    this.location = createElementRef(this._tNode, _rootLView);\n    this.instance = getComponentLViewByIndex(this._tNode.index, _rootLView)[CONTEXT] as T;\n    this.hostView = this.changeDetectorRef = new ViewRef<T>(\n      _rootLView,\n      undefined /* _cdRefInjectingView */,\n      false /* notifyErrorHandler */,\n    );\n    this.componentType = componentType;\n  }\n\n  override setInput(name: string, value: unknown): void {\n    const tNode = this._tNode;\n    this.previousInputValues ??= new Map();\n    // Do not set the input if it is the same as the last value\n    // This behavior matches `bindingUpdated` when binding inputs in templates.\n    if (\n      this.previousInputValues.has(name) &&\n      Object.is(this.previousInputValues.get(name), value)\n    ) {\n      return;\n    }\n\n    const lView = this._rootLView;\n    const hasSetInput = setAllInputsForProperty(tNode, lView[TVIEW], lView, name, value);\n    this.previousInputValues.set(name, value);\n    const childComponentLView = getComponentLViewByIndex(tNode.index, lView);\n    markViewDirty(childComponentLView, NotificationSource.SetInput);\n\n    if (ngDevMode && !hasSetInput) {\n      const cmpNameForError = stringifyForError(this.componentType);\n      let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `;\n      message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`;\n      reportUnknownPropertyError(message);\n    }\n  }\n\n  override get injector(): Injector {\n    return new NodeInjector(this._tNode, this._rootLView);\n  }\n\n  override destroy(): void {\n    this.hostView.destroy();\n  }\n\n  override onDestroy(callback: () => void): void {\n    this.hostView.onDestroy(callback);\n  }\n}\n\n/** Projects the `projectableNodes` that were specified when creating a root component. */\nfunction projectNodes(\n  tNode: TElementNode,\n  ngContentSelectors: string[],\n  projectableNodes: any[][],\n) {\n  const projection: (TNode | RNode[] | null)[] = (tNode.projection = []);\n  for (let i = 0; i < ngContentSelectors.length; i++) {\n    const nodesforSlot = projectableNodes[i];\n    // Projectable nodes can be passed as array of arrays or an array of iterables (ngUpgrade\n    // case). Here we do normalize passed data structure to be an array of arrays to avoid\n    // complex checks down the line.\n    // We also normalize the length of the passed in projectable nodes (to match the number of\n    // <ng-container> slots defined by a component).\n    projection.push(nodesforSlot != null && nodesforSlot.length ? Array.from(nodesforSlot) : null);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {EnvironmentInjector} from '../di/r3_injector';\nimport {validateMatchingNode} from '../hydration/error_handling';\nimport {CONTAINERS} from '../hydration/interfaces';\nimport {isInSkipHydrationBlock} from '../hydration/skip_hydration';\nimport {\n  getSegmentHead,\n  isDisconnectedNode,\n  markRNodeAsClaimedByHydration,\n} from '../hydration/utils';\nimport {findMatchingDehydratedView, locateDehydratedViewsInContainer} from '../hydration/views';\nimport {isType, Type} from '../interface/type';\nimport {assertNodeInjector} from '../render3/assert';\nimport {ComponentFactory as R3ComponentFactory} from '../render3/component_ref';\nimport {getComponentDef} from '../render3/def_getters';\nimport {getParentInjectorLocation, NodeInjector} from '../render3/di';\nimport {\n  CONTAINER_HEADER_OFFSET,\n  DEHYDRATED_VIEWS,\n  LContainer,\n  NATIVE,\n  VIEW_REFS,\n} from '../render3/interfaces/container';\nimport {NodeInjectorOffset} from '../render3/interfaces/injector';\nimport {\n  TContainerNode,\n  TDirectiveHostNode,\n  TElementContainerNode,\n  TElementNode,\n  TNode,\n  TNodeType,\n} from '../render3/interfaces/node';\nimport {RComment, RNode} from '../render3/interfaces/renderer_dom';\nimport {isLContainer} from '../render3/interfaces/type_checks';\nimport {\n  HEADER_OFFSET,\n  HYDRATION,\n  LView,\n  PARENT,\n  RENDERER,\n  T_HOST,\n  TVIEW,\n} from '../render3/interfaces/view';\nimport {assertTNodeType} from '../render3/node_assert';\nimport {destroyLView} from '../render3/node_manipulation';\nimport {nativeInsertBefore} from '../render3/dom_node_manipulation';\nimport {getCurrentTNode, getLView} from '../render3/state';\nimport {\n  getParentInjectorIndex,\n  getParentInjectorView,\n  hasParentInjector,\n} from '../render3/util/injector_utils';\nimport {getNativeByTNode, unwrapRNode, viewAttachedToContainer} from '../render3/util/view_utils';\nimport {shouldAddViewToDom} from '../render3/view_manipulation';\nimport {ViewRef as R3ViewRef} from '../render3/view_ref';\nimport {addToArray, removeFromArray} from '../util/array_utils';\nimport {\n  assertDefined,\n  assertEqual,\n  assertGreaterThan,\n  assertLessThan,\n  throwError,\n} from '../util/assert';\n\nimport {ComponentFactory, ComponentRef} from './component_factory';\nimport {createElementRef, ElementRef} from './element_ref';\nimport {NgModuleRef} from './ng_module_factory';\nimport {TemplateRef} from './template_ref';\nimport {EmbeddedViewRef, ViewRef} from './view_ref';\nimport {addLViewToLContainer, createLContainer, detachView} from '../render3/view/container';\nimport {addToEndOfViewTree} from '../render3/view/construction';\n\n/**\n * Represents a container where one or more views can be attached to a component.\n *\n * Can contain *host views* (created by instantiating a\n * component with the `createComponent()` method), and *embedded views*\n * (created by instantiating a `TemplateRef` with the `createEmbeddedView()` method).\n *\n * A view container instance can contain other view containers,\n * creating a view hierarchy.\n *\n * @usageNotes\n *\n * The example below demonstrates how the `createComponent` function can be used\n * to create an instance of a ComponentRef dynamically and attach it to an ApplicationRef,\n * so that it gets included into change detection cycles.\n *\n * Note: the example uses standalone components, but the function can also be used for\n * non-standalone components (declared in an NgModule) as well.\n *\n * ```angular-ts\n * @Component({\n *   standalone: true,\n *   selector: 'dynamic',\n *   template: `<span>This is a content of a dynamic component.</span>`,\n * })\n * class DynamicComponent {\n *   vcr = inject(ViewContainerRef);\n * }\n *\n * @Component({\n *   standalone: true,\n *   selector: 'app',\n *   template: `<main>Hi! This is the main content.</main>`,\n * })\n * class AppComponent {\n *   vcr = inject(ViewContainerRef);\n *\n *   ngAfterViewInit() {\n *     const compRef = this.vcr.createComponent(DynamicComponent);\n *     compRef.changeDetectorRef.detectChanges();\n *   }\n * }\n * ```\n *\n * @see {@link ComponentRef}\n * @see {@link EmbeddedViewRef}\n *\n * @publicApi\n */\nexport abstract class ViewContainerRef {\n  /**\n   * Anchor element that specifies the location of this container in the containing view.\n   * Each view container can have only one anchor element, and each anchor element\n   * can have only a single view container.\n   *\n   * Root elements of views attached to this container become siblings of the anchor element in\n   * the rendered view.\n   *\n   * Access the `ViewContainerRef` of an element by placing a `Directive` injected\n   * with `ViewContainerRef` on the element, or use a `ViewChild` query.\n   *\n   * <!-- TODO: rename to anchorElement -->\n   */\n  abstract get element(): ElementRef;\n\n  /**\n   * The dependency injector for this view container.\n   */\n  abstract get injector(): Injector;\n\n  /** @deprecated No replacement */\n  abstract get parentInjector(): Injector;\n\n  /**\n   * Destroys all views in this container.\n   */\n  abstract clear(): void;\n\n  /**\n   * Retrieves a view from this container.\n   * @param index The 0-based index of the view to retrieve.\n   * @returns The `ViewRef` instance, or null if the index is out of range.\n   */\n  abstract get(index: number): ViewRef | null;\n\n  /**\n   * Reports how many views are currently attached to this container.\n   * @returns The number of views.\n   */\n  abstract get length(): number;\n\n  /**\n   * Instantiates an embedded view and inserts it\n   * into this container.\n   * @param templateRef The HTML template that defines the view.\n   * @param context The data-binding context of the embedded view, as declared\n   * in the `<ng-template>` usage.\n   * @param options Extra configuration for the created view. Includes:\n   *  * index: The 0-based index at which to insert the new view into this container.\n   *           If not specified, appends the new view as the last entry.\n   *  * injector: Injector to be used within the embedded view.\n   *\n   * @returns The `ViewRef` instance for the newly created view.\n   */\n  abstract createEmbeddedView<C>(\n    templateRef: TemplateRef<C>,\n    context?: C,\n    options?: {\n      index?: number;\n      injector?: Injector;\n    },\n  ): EmbeddedViewRef<C>;\n\n  /**\n   * Instantiates an embedded view and inserts it\n   * into this container.\n   * @param templateRef The HTML template that defines the view.\n   * @param context The data-binding context of the embedded view, as declared\n   * in the `<ng-template>` usage.\n   * @param index The 0-based index at which to insert the new view into this container.\n   * If not specified, appends the new view as the last entry.\n   *\n   * @returns The `ViewRef` instance for the newly created view.\n   */\n  abstract createEmbeddedView<C>(\n    templateRef: TemplateRef<C>,\n    context?: C,\n    index?: number,\n  ): EmbeddedViewRef<C>;\n\n  /**\n   * Instantiates a component and inserts its host view into this view container.\n   *\n   * @param componentType Component Type to use.\n   * @param options An object that contains extra parameters:\n   *  * index: the index at which to insert the new component's host view into this container.\n   *           If not specified, appends the new view as the last entry.\n   *  * injector: the injector to use as the parent for the new component.\n   *  * ngModuleRef: an NgModuleRef of the component's NgModule, you should almost always provide\n   *                 this to ensure that all expected providers are available for the component\n   *                 instantiation.\n   *  * environmentInjector: an EnvironmentInjector which will provide the component's environment.\n   *                 you should almost always provide this to ensure that all expected providers\n   *                 are available for the component instantiation. This option is intended to\n   *                 replace the `ngModuleRef` parameter.\n   *  * projectableNodes: list of DOM nodes that should be projected through\n   *                      [`<ng-content>`](api/core/ng-content) of the new component instance.\n   *\n   * @returns The new `ComponentRef` which contains the component instance and the host view.\n   */\n  abstract createComponent<C>(\n    componentType: Type<C>,\n    options?: {\n      index?: number;\n      injector?: Injector;\n      ngModuleRef?: NgModuleRef<unknown>;\n      environmentInjector?: EnvironmentInjector | NgModuleRef<unknown>;\n      projectableNodes?: Node[][];\n    },\n  ): ComponentRef<C>;\n\n  /**\n   * Instantiates a single component and inserts its host view into this container.\n   *\n   * @param componentFactory Component factory to use.\n   * @param index The index at which to insert the new component's host view into this container.\n   * If not specified, appends the new view as the last entry.\n   * @param injector The injector to use as the parent for the new component.\n   * @param projectableNodes List of DOM nodes that should be projected through\n   *     [`<ng-content>`](api/core/ng-content) of the new component instance.\n   * @param ngModuleRef An instance of the NgModuleRef that represent an NgModule.\n   * This information is used to retrieve corresponding NgModule injector.\n   *\n   * @returns The new `ComponentRef` which contains the component instance and the host view.\n   *\n   * @deprecated Angular no longer requires component factories to dynamically create components.\n   *     Use different signature of the `createComponent` method, which allows passing\n   *     Component class directly.\n   */\n  abstract createComponent<C>(\n    componentFactory: ComponentFactory<C>,\n    index?: number,\n    injector?: Injector,\n    projectableNodes?: any[][],\n    environmentInjector?: EnvironmentInjector | NgModuleRef<any>,\n  ): ComponentRef<C>;\n\n  /**\n   * Inserts a view into this container.\n   * @param viewRef The view to insert.\n   * @param index The 0-based index at which to insert the view.\n   * If not specified, appends the new view as the last entry.\n   * @returns The inserted `ViewRef` instance.\n   *\n   */\n  abstract insert(viewRef: ViewRef, index?: number): ViewRef;\n\n  /**\n   * Moves a view to a new location in this container.\n   * @param viewRef The view to move.\n   * @param index The 0-based index of the new location.\n   * @returns The moved `ViewRef` instance.\n   */\n  abstract move(viewRef: ViewRef, currentIndex: number): ViewRef;\n\n  /**\n   * Returns the index of a view within the current container.\n   * @param viewRef The view to query.\n   * @returns The 0-based index of the view's position in this container,\n   * or `-1` if this container doesn't contain the view.\n   */\n  abstract indexOf(viewRef: ViewRef): number;\n\n  /**\n   * Destroys a view attached to this container\n   * @param index The 0-based index of the view to destroy.\n   * If not specified, the last view in the container is removed.\n   */\n  abstract remove(index?: number): void;\n\n  /**\n   * Detaches a view from this container without destroying it.\n   * Use along with `insert()` to move a view within the current container.\n   * @param index The 0-based index of the view to detach.\n   * If not specified, the last view in the container is detached.\n   */\n  abstract detach(index?: number): ViewRef | null;\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ELEMENT_ID__: () => ViewContainerRef = injectViewContainerRef;\n}\n\n/**\n * Creates a ViewContainerRef and stores it on the injector. Or, if the ViewContainerRef\n * already exists, retrieves the existing ViewContainerRef.\n *\n * @returns The ViewContainerRef instance to use\n */\nexport function injectViewContainerRef(): ViewContainerRef {\n  const previousTNode = getCurrentTNode() as TElementNode | TElementContainerNode | TContainerNode;\n  return createContainerRef(previousTNode, getLView());\n}\n\nconst VE_ViewContainerRef = ViewContainerRef;\n\n// TODO(alxhub): cleaning up this indirection triggers a subtle bug in Closure in g3. Once the fix\n// for that lands, this can be cleaned up.\nconst R3ViewContainerRef = class ViewContainerRef extends VE_ViewContainerRef {\n  constructor(\n    private _lContainer: LContainer,\n    private _hostTNode: TElementNode | TContainerNode | TElementContainerNode,\n    private _hostLView: LView,\n  ) {\n    super();\n  }\n\n  override get element(): ElementRef {\n    return createElementRef(this._hostTNode, this._hostLView);\n  }\n\n  override get injector(): Injector {\n    return new NodeInjector(this._hostTNode, this._hostLView);\n  }\n\n  /** @deprecated No replacement */\n  override get parentInjector(): Injector {\n    const parentLocation = getParentInjectorLocation(this._hostTNode, this._hostLView);\n    if (hasParentInjector(parentLocation)) {\n      const parentView = getParentInjectorView(parentLocation, this._hostLView);\n      const injectorIndex = getParentInjectorIndex(parentLocation);\n      ngDevMode && assertNodeInjector(parentView, injectorIndex);\n      const parentTNode = parentView[TVIEW].data[\n        injectorIndex + NodeInjectorOffset.TNODE\n      ] as TElementNode;\n      return new NodeInjector(parentTNode, parentView);\n    } else {\n      return new NodeInjector(null, this._hostLView);\n    }\n  }\n\n  override clear(): void {\n    while (this.length > 0) {\n      this.remove(this.length - 1);\n    }\n  }\n\n  override get(index: number): ViewRef | null {\n    const viewRefs = getViewRefs(this._lContainer);\n    return (viewRefs !== null && viewRefs[index]) || null;\n  }\n\n  override get length(): number {\n    return this._lContainer.length - CONTAINER_HEADER_OFFSET;\n  }\n\n  override createEmbeddedView<C>(\n    templateRef: TemplateRef<C>,\n    context?: C,\n    options?: {\n      index?: number;\n      injector?: Injector;\n    },\n  ): EmbeddedViewRef<C>;\n  override createEmbeddedView<C>(\n    templateRef: TemplateRef<C>,\n    context?: C,\n    index?: number,\n  ): EmbeddedViewRef<C>;\n  override createEmbeddedView<C>(\n    templateRef: TemplateRef<C>,\n    context?: C,\n    indexOrOptions?:\n      | number\n      | {\n          index?: number;\n          injector?: Injector;\n        },\n  ): EmbeddedViewRef<C> {\n    let index: number | undefined;\n    let injector: Injector | undefined;\n\n    if (typeof indexOrOptions === 'number') {\n      index = indexOrOptions;\n    } else if (indexOrOptions != null) {\n      index = indexOrOptions.index;\n      injector = indexOrOptions.injector;\n    }\n\n    const dehydratedView = findMatchingDehydratedView(this._lContainer, templateRef.ssrId);\n    const viewRef = templateRef.createEmbeddedViewImpl(\n      context || <any>{},\n      injector,\n      dehydratedView,\n    );\n    this.insertImpl(viewRef, index, shouldAddViewToDom(this._hostTNode, dehydratedView));\n    return viewRef;\n  }\n\n  override createComponent<C>(\n    componentType: Type<C>,\n    options?: {\n      index?: number;\n      injector?: Injector;\n      projectableNodes?: Node[][];\n      ngModuleRef?: NgModuleRef<unknown>;\n    },\n  ): ComponentRef<C>;\n  /**\n   * @deprecated Angular no longer requires component factories to dynamically create components.\n   *     Use different signature of the `createComponent` method, which allows passing\n   *     Component class directly.\n   */\n  override createComponent<C>(\n    componentFactory: ComponentFactory<C>,\n    index?: number | undefined,\n    injector?: Injector | undefined,\n    projectableNodes?: any[][] | undefined,\n    environmentInjector?: EnvironmentInjector | NgModuleRef<any> | undefined,\n  ): ComponentRef<C>;\n  override createComponent<C>(\n    componentFactoryOrType: ComponentFactory<C> | Type<C>,\n    indexOrOptions?:\n      | number\n      | undefined\n      | {\n          index?: number;\n          injector?: Injector;\n          ngModuleRef?: NgModuleRef<unknown>;\n          environmentInjector?: EnvironmentInjector | NgModuleRef<unknown>;\n          projectableNodes?: Node[][];\n        },\n    injector?: Injector | undefined,\n    projectableNodes?: any[][] | undefined,\n    environmentInjector?: EnvironmentInjector | NgModuleRef<any> | undefined,\n  ): ComponentRef<C> {\n    const isComponentFactory = componentFactoryOrType && !isType(componentFactoryOrType);\n    let index: number | undefined;\n\n    // This function supports 2 signatures and we need to handle options correctly for both:\n    //   1. When first argument is a Component type. This signature also requires extra\n    //      options to be provided as object (more ergonomic option).\n    //   2. First argument is a Component factory. In this case extra options are represented as\n    //      positional arguments. This signature is less ergonomic and will be deprecated.\n    if (isComponentFactory) {\n      if (ngDevMode) {\n        assertEqual(\n          typeof indexOrOptions !== 'object',\n          true,\n          'It looks like Component factory was provided as the first argument ' +\n            'and an options object as the second argument. This combination of arguments ' +\n            'is incompatible. You can either change the first argument to provide Component ' +\n            'type or change the second argument to be a number (representing an index at ' +\n            \"which to insert the new component's host view into this container)\",\n        );\n      }\n      index = indexOrOptions as number | undefined;\n    } else {\n      if (ngDevMode) {\n        assertDefined(\n          getComponentDef(componentFactoryOrType),\n          `Provided Component class doesn't contain Component definition. ` +\n            `Please check whether provided class has @Component decorator.`,\n        );\n        assertEqual(\n          typeof indexOrOptions !== 'number',\n          true,\n          'It looks like Component type was provided as the first argument ' +\n            \"and a number (representing an index at which to insert the new component's \" +\n            'host view into this container as the second argument. This combination of arguments ' +\n            'is incompatible. Please use an object as the second argument instead.',\n        );\n      }\n      const options = (indexOrOptions || {}) as {\n        index?: number;\n        injector?: Injector;\n        ngModuleRef?: NgModuleRef<unknown>;\n        environmentInjector?: EnvironmentInjector | NgModuleRef<unknown>;\n        projectableNodes?: Node[][];\n      };\n      if (ngDevMode && options.environmentInjector && options.ngModuleRef) {\n        throwError(\n          `Cannot pass both environmentInjector and ngModuleRef options to createComponent().`,\n        );\n      }\n      index = options.index;\n      injector = options.injector;\n      projectableNodes = options.projectableNodes;\n      environmentInjector = options.environmentInjector || options.ngModuleRef;\n    }\n\n    const componentFactory: ComponentFactory<C> = isComponentFactory\n      ? (componentFactoryOrType as ComponentFactory<C>)\n      : new R3ComponentFactory(getComponentDef(componentFactoryOrType)!);\n    const contextInjector = injector || this.parentInjector;\n\n    // If an `NgModuleRef` is not provided explicitly, try retrieving it from the DI tree.\n    if (!environmentInjector && (componentFactory as any).ngModule == null) {\n      // For the `ComponentFactory` case, entering this logic is very unlikely, since we expect that\n      // an instance of a `ComponentFactory`, resolved via `ComponentFactoryResolver` would have an\n      // `ngModule` field. This is possible in some test scenarios and potentially in some JIT-based\n      // use-cases. For the `ComponentFactory` case we preserve backwards-compatibility and try\n      // using a provided injector first, then fall back to the parent injector of this\n      // `ViewContainerRef` instance.\n      //\n      // For the factory-less case, it's critical to establish a connection with the module\n      // injector tree (by retrieving an instance of an `NgModuleRef` and accessing its injector),\n      // so that a component can use DI tokens provided in MgModules. For this reason, we can not\n      // rely on the provided injector, since it might be detached from the DI tree (for example, if\n      // it was created via `Injector.create` without specifying a parent injector, or if an\n      // injector is retrieved from an `NgModuleRef` created via `createNgModule` using an\n      // NgModule outside of a module tree). Instead, we always use `ViewContainerRef`'s parent\n      // injector, which is normally connected to the DI tree, which includes module injector\n      // subtree.\n      const _injector = isComponentFactory ? contextInjector : this.parentInjector;\n\n      // DO NOT REFACTOR. The code here used to have a `injector.get(NgModuleRef, null) ||\n      // undefined` expression which seems to cause internal google apps to fail. This is documented\n      // in the following internal bug issue: go/b/142967802\n      const result = _injector.get(EnvironmentInjector, null);\n      if (result) {\n        environmentInjector = result;\n      }\n    }\n\n    const componentDef = getComponentDef(componentFactory.componentType ?? {});\n    const dehydratedView = findMatchingDehydratedView(this._lContainer, componentDef?.id ?? null);\n    const rNode = dehydratedView?.firstChild ?? null;\n    const componentRef = componentFactory.create(\n      contextInjector,\n      projectableNodes,\n      rNode,\n      environmentInjector,\n    );\n    this.insertImpl(\n      componentRef.hostView,\n      index,\n      shouldAddViewToDom(this._hostTNode, dehydratedView),\n    );\n    return componentRef;\n  }\n\n  override insert(viewRef: ViewRef, index?: number): ViewRef {\n    return this.insertImpl(viewRef, index, true);\n  }\n\n  private insertImpl(viewRef: ViewRef, index?: number, addToDOM?: boolean): ViewRef {\n    const lView = (viewRef as R3ViewRef<any>)._lView!;\n\n    if (ngDevMode && viewRef.destroyed) {\n      throw new Error('Cannot insert a destroyed View in a ViewContainer!');\n    }\n\n    if (viewAttachedToContainer(lView)) {\n      // If view is already attached, detach it first so we clean up references appropriately.\n\n      const prevIdx = this.indexOf(viewRef);\n\n      // A view might be attached either to this or a different container. The `prevIdx` for\n      // those cases will be:\n      // equal to -1 for views attached to this ViewContainerRef\n      // >= 0 for views attached to a different ViewContainerRef\n      if (prevIdx !== -1) {\n        this.detach(prevIdx);\n      } else {\n        const prevLContainer = lView[PARENT] as LContainer;\n        ngDevMode &&\n          assertEqual(\n            isLContainer(prevLContainer),\n            true,\n            'An attached view should have its PARENT point to a container.',\n          );\n\n        // We need to re-create a R3ViewContainerRef instance since those are not stored on\n        // LView (nor anywhere else).\n        const prevVCRef = new R3ViewContainerRef(\n          prevLContainer,\n          prevLContainer[T_HOST] as TDirectiveHostNode,\n          prevLContainer[PARENT],\n        );\n\n        prevVCRef.detach(prevVCRef.indexOf(viewRef));\n      }\n    }\n\n    // Logical operation of adding `LView` to `LContainer`\n    const adjustedIdx = this._adjustIndex(index);\n    const lContainer = this._lContainer;\n\n    addLViewToLContainer(lContainer, lView, adjustedIdx, addToDOM);\n\n    (viewRef as R3ViewRef<any>).attachToViewContainerRef();\n    addToArray(getOrCreateViewRefs(lContainer), adjustedIdx, viewRef);\n\n    return viewRef;\n  }\n\n  override move(viewRef: ViewRef, newIndex: number): ViewRef {\n    if (ngDevMode && viewRef.destroyed) {\n      throw new Error('Cannot move a destroyed View in a ViewContainer!');\n    }\n    return this.insert(viewRef, newIndex);\n  }\n\n  override indexOf(viewRef: ViewRef): number {\n    const viewRefsArr = getViewRefs(this._lContainer);\n    return viewRefsArr !== null ? viewRefsArr.indexOf(viewRef) : -1;\n  }\n\n  override remove(index?: number): void {\n    const adjustedIdx = this._adjustIndex(index, -1);\n    const detachedView = detachView(this._lContainer, adjustedIdx);\n\n    if (detachedView) {\n      // Before destroying the view, remove it from the container's array of `ViewRef`s.\n      // This ensures the view container length is updated before calling\n      // `destroyLView`, which could recursively call view container methods that\n      // rely on an accurate container length.\n      // (e.g. a method on this view container being called by a child directive's OnDestroy\n      // lifecycle hook)\n      removeFromArray(getOrCreateViewRefs(this._lContainer), adjustedIdx);\n      destroyLView(detachedView[TVIEW], detachedView);\n    }\n  }\n\n  override detach(index?: number): ViewRef | null {\n    const adjustedIdx = this._adjustIndex(index, -1);\n    const view = detachView(this._lContainer, adjustedIdx);\n\n    const wasDetached =\n      view && removeFromArray(getOrCreateViewRefs(this._lContainer), adjustedIdx) != null;\n    return wasDetached ? new R3ViewRef(view!) : null;\n  }\n\n  private _adjustIndex(index?: number, shift: number = 0) {\n    if (index == null) {\n      return this.length + shift;\n    }\n    if (ngDevMode) {\n      assertGreaterThan(index, -1, `ViewRef index must be positive, got ${index}`);\n      // +1 because it's legal to insert at the end.\n      assertLessThan(index, this.length + 1 + shift, 'index');\n    }\n    return index;\n  }\n};\n\nfunction getViewRefs(lContainer: LContainer): ViewRef[] | null {\n  return lContainer[VIEW_REFS] as ViewRef[];\n}\n\nfunction getOrCreateViewRefs(lContainer: LContainer): ViewRef[] {\n  return (lContainer[VIEW_REFS] || (lContainer[VIEW_REFS] = [])) as ViewRef[];\n}\n\n/**\n * Creates a ViewContainerRef and stores it on the injector.\n *\n * @param hostTNode The node that is requesting a ViewContainerRef\n * @param hostLView The view to which the node belongs\n * @returns The ViewContainerRef instance to use\n */\nexport function createContainerRef(\n  hostTNode: TElementNode | TContainerNode | TElementContainerNode,\n  hostLView: LView,\n): ViewContainerRef {\n  ngDevMode && assertTNodeType(hostTNode, TNodeType.AnyContainer | TNodeType.AnyRNode);\n\n  let lContainer: LContainer;\n  const slotValue = hostLView[hostTNode.index];\n  if (isLContainer(slotValue)) {\n    // If the host is a container, we don't need to create a new LContainer\n    lContainer = slotValue;\n  } else {\n    // An LContainer anchor can not be `null`, but we set it here temporarily\n    // and update to the actual value later in this function (see\n    // `_locateOrCreateAnchorNode`).\n    lContainer = createLContainer(slotValue, hostLView, null!, hostTNode);\n    hostLView[hostTNode.index] = lContainer;\n    addToEndOfViewTree(hostLView, lContainer);\n  }\n  _locateOrCreateAnchorNode(lContainer, hostLView, hostTNode, slotValue);\n\n  return new R3ViewContainerRef(lContainer, hostTNode, hostLView);\n}\n\n/**\n * Creates and inserts a comment node that acts as an anchor for a view container.\n *\n * If the host is a regular element, we have to insert a comment node manually which will\n * be used as an anchor when inserting elements. In this specific case we use low-level DOM\n * manipulation to insert it.\n */\nfunction insertAnchorNode(hostLView: LView, hostTNode: TNode): RComment {\n  const renderer = hostLView[RENDERER];\n  ngDevMode && ngDevMode.rendererCreateComment++;\n  const commentNode = renderer.createComment(ngDevMode ? 'container' : '');\n\n  const hostNative = getNativeByTNode(hostTNode, hostLView)!;\n  const parentOfHostNative = renderer.parentNode(hostNative);\n  nativeInsertBefore(\n    renderer,\n    parentOfHostNative!,\n    commentNode,\n    renderer.nextSibling(hostNative),\n    false,\n  );\n  return commentNode;\n}\n\nlet _locateOrCreateAnchorNode = createAnchorNode;\nlet _populateDehydratedViewsInLContainer: typeof populateDehydratedViewsInLContainerImpl = () =>\n  false; // noop by default\n\n/**\n * Looks up dehydrated views that belong to a given LContainer and populates\n * this information into the `LContainer[DEHYDRATED_VIEWS]` slot. When running\n * in client-only mode, this function is a noop.\n *\n * @param lContainer LContainer that should be populated.\n * @param tNode Corresponding TNode.\n * @param hostLView LView that hosts LContainer.\n * @returns a boolean flag that indicates whether a populating operation\n *   was successful. The operation might be unsuccessful in case is has completed\n *   previously, we are rendering in client-only mode or this content is located\n *   in a skip hydration section.\n */\nexport function populateDehydratedViewsInLContainer(\n  lContainer: LContainer,\n  tNode: TNode,\n  hostLView: LView,\n): boolean {\n  return _populateDehydratedViewsInLContainer(lContainer, tNode, hostLView);\n}\n\n/**\n * Regular creation mode: an anchor is created and\n * assigned to the `lContainer[NATIVE]` slot.\n */\nfunction createAnchorNode(\n  lContainer: LContainer,\n  hostLView: LView,\n  hostTNode: TNode,\n  slotValue: any,\n) {\n  // We already have a native element (anchor) set, return.\n  if (lContainer[NATIVE]) return;\n\n  let commentNode: RComment;\n  // If the host is an element container, the native host element is guaranteed to be a\n  // comment and we can reuse that comment as anchor element for the new LContainer.\n  // The comment node in question is already part of the DOM structure so we don't need to append\n  // it again.\n  if (hostTNode.type & TNodeType.ElementContainer) {\n    commentNode = unwrapRNode(slotValue) as RComment;\n  } else {\n    commentNode = insertAnchorNode(hostLView, hostTNode);\n  }\n  lContainer[NATIVE] = commentNode;\n}\n\n/**\n * Hydration logic that looks up all dehydrated views in this container\n * and puts them into `lContainer[DEHYDRATED_VIEWS]` slot.\n *\n * @returns a boolean flag that indicates whether a populating operation\n *   was successful. The operation might be unsuccessful in case is has completed\n *   previously, we are rendering in client-only mode or this content is located\n *   in a skip hydration section.\n */\nfunction populateDehydratedViewsInLContainerImpl(\n  lContainer: LContainer,\n  tNode: TNode,\n  hostLView: LView,\n): boolean {\n  // We already have a native element (anchor) set and the process\n  // of finding dehydrated views happened (so the `lContainer[DEHYDRATED_VIEWS]`\n  // is not null), exit early.\n  if (lContainer[NATIVE] && lContainer[DEHYDRATED_VIEWS]) {\n    return true;\n  }\n\n  const hydrationInfo = hostLView[HYDRATION];\n  const noOffsetIndex = tNode.index - HEADER_OFFSET;\n  const isNodeCreationMode =\n    !hydrationInfo ||\n    isInSkipHydrationBlock(tNode) ||\n    isDisconnectedNode(hydrationInfo, noOffsetIndex);\n\n  // Regular creation mode.\n  if (isNodeCreationMode) {\n    return false;\n  }\n\n  // Hydration mode, looking up an anchor node and dehydrated views in DOM.\n  const currentRNode: RNode | null = getSegmentHead(hydrationInfo, noOffsetIndex);\n\n  const serializedViews = hydrationInfo.data[CONTAINERS]?.[noOffsetIndex];\n  ngDevMode &&\n    assertDefined(\n      serializedViews,\n      'Unexpected state: no hydration info available for a given TNode, ' +\n        'which represents a view container.',\n    );\n\n  const [commentNode, dehydratedViews] = locateDehydratedViewsInContainer(\n    currentRNode!,\n    serializedViews!,\n  );\n\n  if (ngDevMode) {\n    validateMatchingNode(commentNode, Node.COMMENT_NODE, null, hostLView, tNode, true);\n    // Do not throw in case this node is already claimed (thus `false` as a second\n    // argument). If this container is created based on an `<ng-template>`, the comment\n    // node would be already claimed from the `template` instruction. If an element acts\n    // as an anchor (e.g. <div #vcRef>), a separate comment node would be created/located,\n    // so we need to claim it here.\n    markRNodeAsClaimedByHydration(commentNode, false);\n  }\n\n  lContainer[NATIVE] = commentNode as RComment;\n  lContainer[DEHYDRATED_VIEWS] = dehydratedViews;\n\n  return true;\n}\n\nfunction locateOrCreateAnchorNode(\n  lContainer: LContainer,\n  hostLView: LView,\n  hostTNode: TNode,\n  slotValue: any,\n): void {\n  if (!_populateDehydratedViewsInLContainer(lContainer, hostTNode, hostLView)) {\n    // Populating dehydrated views operation returned `false`, which indicates\n    // that the logic was running in client-only mode, this an anchor comment\n    // node should be created for this container.\n    createAnchorNode(lContainer, hostLView, hostTNode, slotValue);\n  }\n}\n\nexport function enableLocateOrCreateContainerRefImpl() {\n  _locateOrCreateAnchorNode = locateOrCreateAnchorNode;\n  _populateDehydratedViewsInLContainer = populateDehydratedViewsInLContainerImpl;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// We are temporarily importing the existing viewEngine_from core so we can be sure we are\n// correctly implementing its interfaces for backwards compatibility.\n\nimport {ProviderToken} from '../../di/provider_token';\nimport {createElementRef, ElementRef as ViewEngine_ElementRef} from '../../linker/element_ref';\nimport {QueryList} from '../../linker/query_list';\nimport {createTemplateRef, TemplateRef as ViewEngine_TemplateRef} from '../../linker/template_ref';\nimport {createContainerRef, ViewContainerRef} from '../../linker/view_container_ref';\nimport {assertDefined, assertIndexInRange, assertNumber, throwError} from '../../util/assert';\nimport {stringify} from '../../util/stringify';\n\nimport {assertFirstCreatePass, assertLContainer} from '../assert';\nimport {getNodeInjectable, locateDirectiveOrProvider} from '../di';\nimport {CONTAINER_HEADER_OFFSET, LContainer, MOVED_VIEWS} from '../interfaces/container';\nimport {\n  TContainerNode,\n  TElementContainerNode,\n  TElementNode,\n  TNode,\n  TNodeType,\n} from '../interfaces/node';\nimport {LQueries, LQuery, QueryFlags, TQueries, TQuery, TQueryMetadata} from '../interfaces/query';\nimport {DECLARATION_LCONTAINER, LView, PARENT, QUERIES, TVIEW, TView} from '../interfaces/view';\nimport {assertTNodeType} from '../node_assert';\nimport {getCurrentTNode, getLView, getTView} from '../state';\nimport {storeCleanupWithContext} from '../util/view_utils';\n\nclass LQuery_<T> implements LQuery<T> {\n  matches: (T | null)[] | null = null;\n  constructor(public queryList: QueryList<T>) {}\n  clone(): LQuery<T> {\n    return new LQuery_(this.queryList);\n  }\n  setDirty(): void {\n    this.queryList.setDirty();\n  }\n}\n\nclass LQueries_ implements LQueries {\n  constructor(pu   blic queries: LQuery<any>[] = []) {}\n\n  createEmbeddedView(tView: TView): LQueries | null {\n    const tQueries = tView.queries;\n    if (tQueries !== null) {\n      const noOfInheritedQueries =\n        tView.contentQueries !== null ? tView.contentQueries[0] : tQueries.length;\n      const viewLQueries: LQuery<any>[] = [];\n\n      // An embedded view has queries propagated from a declaration view at the beginning of the\n      // TQueries collection and up until a first content query declared in the embedded view. Only\n      // propagated LQueries are created at this point (LQuery corresponding to declared content\n      // queries will be instantiated from the content query instructions for each directive).\n      for (let i = 0; i < noOfInheritedQueries; i++) {\n        const tQuery = tQueries.getByIndex(i);\n        const parentLQuery = this.queries[tQuery.indexInDeclarationView];\n        viewLQueries.push(parentLQuery.clone());\n      }\n\n      return new LQueries_(viewLQueries);\n    }\n\n    return null;\n  }\n\n  insertView(tView: TView): void {\n    this.dirtyQueriesWithMatches(tView);\n  }\n\n  detachView(tView: TView): void {\n    this.dirtyQueriesWithMatches(tView);\n  }\n\n  finishViewCreation(tView: TView): void {\n    this.dirtyQueriesWithMatches(tView);\n  }\n\n  private dirtyQueriesWithMatches(tView: TView) {\n    for (let i = 0; i < this.queries.length; i++) {\n      if (getTQuery(tView, i).matches !== null) {\n        this.queries[i].setDirty();\n      }\n    }\n  }\n}\n\nexport class TQueryMetadata_ implements TQueryMetadata {\n  public predicate: ProviderToken<unknown> | string[];\n  constructor(\n    predicate: ProviderToken<unknown> | string[] | string,\n    public flags: QueryFlags,\n    public read: any = null,\n  ) {\n    // Compiler might not be able to pre-optimize and split multiple selectors.\n    if (typeof predicate === 'string') {\n      this.predicate = splitQueryMultiSelectors(predicate);\n    } else {\n      this.predicate = predicate;\n    }\n  }\n}\n\nclass TQueries_ implements TQueries {\n  constructor(private queries: TQuery[] = []) {}\n\n  elementStart(tView: TView, tNode: TNode): void {\n    ngDevMode &&\n      assertFirstCreatePass(\n        tView,\n        'Queries should collect results on the first template pass only',\n      );\n    for (let i = 0; i < this.queries.length; i++) {\n      this.queries[i].elementStart(tView, tNode);\n    }\n  }\n  elementEnd(tNode: TNode): void {\n    for (let i = 0; i < this.queries.length; i++) {\n      this.queries[i].elementEnd(tNode);\n    }\n  }\n  embeddedTView(tNode: TNode): TQueries | null {\n    let queriesForTemplateRef: TQuery[] | null = null;\n\n    for (let i = 0; i < this.length; i++) {\n      const childQueryIndex = queriesForTemplateRef !== null ? queriesForTemplateRef.length : 0;\n      const tqueryClone = this.getByIndex(i).embeddedTView(tNode, childQueryIndex);\n\n      if (tqueryClone) {\n        tqueryClone.indexInDeclarationView = i;\n        if (queriesForTemplateRef !== null) {\n          queriesForTemplateRef.push(tqueryClone);\n        } else {\n          queriesForTemplateRef = [tqueryClone];\n        }\n      }\n    }\n\n    return queriesForTemplateRef !== null ? new TQueries_(queriesForTemplateRef) : null;\n  }\n\n  template(tView: TView, tNode: TNode): void {\n    ngDevMode &&\n      assertFirstCreatePass(\n        tView,\n        'Queries should collect results on the first template pass only',\n      );\n    for (let i = 0; i < this.queries.length; i++) {\n      this.queries[i].template(tView, tNode);\n    }\n  }\n\n  getByIndex(index: number): TQuery {\n    ngDevMode && assertIndexInRange(this.queries, index);\n    return this.queries[index];\n  }\n\n  get length(): number {\n    return this.queries.length;\n  }\n\n  track(tquery: TQuery): void {\n    this.queries.push(tquery);\n  }\n}\n\nclass TQuery_ implements TQuery {\n  matches: number[] | null = null;\n  indexInDeclarationView = -1;\n  crossesNgTemplate = false;\n\n  /**\n   * A node index on which a query was declared (-1 for view queries and ones inherited from the\n   * declaration template). We use this index (alongside with _appliesToNextNode flag) to know\n   * when to apply content queries to elements in a template.\n   */\n  private _declarationNodeIndex: number;\n\n  /**\n   * A flag indicating if a given query still applies to nodes it is crossing. We use this flag\n   * (alongside with _declarationNodeIndex) to know when to stop applying content queries to\n   * elements in a template.\n   */\n  private _appliesToNextNode = true;\n\n  constructor(\n    public metadata: TQueryMetadata,\n    nodeIndex: number = -1,\n  ) {\n    this._declarationNodeIndex = nodeIndex;\n  }\n\n  elementStart(tView: TView, tNode: TNode): void {\n    if (this.isApplyingToNode(tNode)) {\n      this.matchTNode(tView, tNode);\n    }\n  }\n\n  elementEnd(tNode: TNode): void {\n    if (this._declarationNodeIndex === tNode.index) {\n      this._appliesToNextNode = false;\n    }\n  }\n\n  template(tView: TView, tNode: TNode): void {\n    this.elementStart(tView, tNode);\n  }\n\n  embeddedTView(tNode: TNode, childQueryIndex: number): TQuery | null {\n    if (this.isApplyingToNode(tNode)) {\n      this.crossesNgTemplate = true;\n      // A marker indicating a `<ng-template>` element (a placeholder for query results from\n      // embedded views created based on this `<ng-template>`).\n      this.addMatch(-tNode.index, childQueryIndex);\n      return new TQuery_(this.metadata);\n    }\n    return null;\n  }\n\n  private isApplyingToNode(tNode: TNode): boolean {\n    if (\n      this._appliesToNextNode &&\n      (this.metadata.flags & QueryFlags.descendants) !== QueryFlags.descendants\n    ) {\n      const declarationNodeIdx = this._declarationNodeIndex;\n      let parent = tNode.parent;\n      // Determine if a given TNode is a \"direct\" child of a node on which a content query was\n      // declared (only direct children of query's host node can match with the descendants: false\n      // option). There are 3 main use-case / conditions to consider here:\n      // - <needs-target><i #target></i></needs-target>: here <i #target> parent node is a query\n      // host node;\n      // - <needs-target><ng-template [ngIf]=\"true\"><i #target></i></ng-template></needs-target>:\n      // here <i #target> parent node is null;\n      // - <needs-target><ng-container><i #target></i></ng-container></needs-target>: here we need\n      // to go past `<ng-container>` to determine <i #target> parent node (but we shouldn't traverse\n      // up past the query's host node!).\n      while (\n        parent !== null &&\n        parent.type & TNodeType.ElementContainer &&\n        parent.index !== declarationNodeIdx\n      ) {\n        parent = parent.parent;\n      }\n      return declarationNodeIdx === (parent !== null ? parent.index : -1);\n    }\n    return this._appliesToNextNode;\n  }\n\n  private matchTNode(tView: TView, tNode: TNode): void {\n    const predicate = this.metadata.predicate;\n    if (Array.isArray(predicate)) {\n      for (let i = 0; i < predicate.length; i++) {\n        const name = predicate[i];\n        this.matchTNodeWithReadOption(tView, tNode, getIdxOfMatchingSelector(tNode, name));\n        // Also try matching the name to a provider since strings can be used as DI tokens too.\n        this.matchTNodeWithReadOption(\n          tView,\n          tNode,\n          locateDirectiveOrProvider(tNode, tView, name, false, false),\n        );\n      }\n    } else {\n      if ((predicate as any) === ViewEngine_TemplateRef) {\n        if (tNode.type & TNodeType.Container) {\n          this.matchTNodeWithReadOption(tView, tNode, -1);\n        }\n      } else {\n        this.matchTNodeWithReadOption(\n          tView,\n          tNode,\n          locateDirectiveOrProvider(tNode, tView, predicate, false, false),\n        );\n      }\n    }\n  }\n\n  private matchTNodeWithReadOption(tView: TView, tNode: TNode, nodeMatchIdx: number | null): void {\n    if (nodeMatchIdx !== null) {\n      const read = this.metadata.read;\n      if (read !== null) {\n        if (\n          read === ViewEngine_ElementRef ||\n          read === ViewContainerRef ||\n          (read === ViewEngine_TemplateRef && tNode.type & TNodeType.Container)\n        ) {\n          this.addMatch(tNode.index, -2);\n        } else {\n          const directiveOrProviderIdx = locateDirectiveOrProvider(\n            tNode,\n            tView,\n            read,\n            false,\n            false,\n          );\n          if (directiveOrProviderIdx !== null) {\n            this.addMatch(tNode.index, directiveOrProviderIdx);\n          }\n        }\n      } else {\n        this.addMatch(tNode.index, nodeMatchIdx);\n      }\n    }\n  }\n\n  private addMatch(tNodeIdx: number, matchIdx: number) {\n    if (this.matches === null) {\n      this.matches = [tNodeIdx, matchIdx];\n    } else {\n      this.matches.push(tNodeIdx, matchIdx);\n    }\n  }\n}\n\n/**\n * Iterates over local names for a given node and returns directive index\n * (or -1 if a local name points to an element).\n *\n * @param tNode static data of a node to check\n * @param selector selector to match\n * @returns directive index, -1 or null if a selector didn't match any of the local names\n */\nfunction getIdxOfMatchingSelector(tNode: TNode, selector: string): number | null {\n  const localNames = tNode.localNames;\n  if (localNames !== null) {\n    for (let i = 0; i < localNames.length; i += 2) {\n      if (localNames[i] === selector) {\n        return localNames[i + 1] as number;\n      }\n    }\n  }\n  return null;\n}\n\nfunction createResultByTNodeType(tNode: TNode, currentView: LView): any {\n  if (tNode.type & (TNodeType.AnyRNode | TNodeType.ElementContainer)) {\n    return createElementRef(tNode, currentView);\n  } else if (tNode.type & TNodeType.Container) {\n    return createTemplateRef(tNode, currentView);\n  }\n  return null;\n}\n\nfunction createResultForNode(lView: LView, tNode: TNode, matchingIdx: number, read: any): any {\n  if (matchingIdx === -1) {\n    // if read token and / or strategy is not specified, detect it using appropriate tNode type\n    return createResultByTNodeType(tNode, lView);\n  } else if (matchingIdx === -2) {\n    // read a special token from a node injector\n    return createSpecialToken(lView, tNode, read);\n  } else {\n    // read a token\n    return getNodeInjectable(lView, lView[TVIEW], matchingIdx, tNode as TElementNode);\n  }\n}\n\nfunction createSpecialToken(lView: LView, tNode: TNode, read: any): any {\n  if (read === ViewEngine_ElementRef) {\n    return createElementRef(tNode, lView);\n  } else if (read === ViewEngine_TemplateRef) {\n    return createTemplateRef(tNode, lView);\n  } else if (read === ViewContainerRef) {\n    ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode | TNodeType.AnyContainer);\n    return createContainerRef(\n      tNode as TElementNode | TContainerNode | TElementContainerNode,\n      lView,\n    );\n  } else {\n    ngDevMode &&\n      throwError(\n        `Special token to read should be one of ElementRef, TemplateRef or ViewContainerRef but got ${stringify(\n          read,\n        )}.`,\n      );\n  }\n}\n\n/**\n * A helper function that creates query results for a given view. This function is meant to do the\n * processing once and only once for a given view instance (a set of results for a given view\n * doesn't change).\n */\nfunction materializeViewResults<T>(\n  tView: TView,\n  lView: LView,\n  tQuery: TQuery,\n  queryIndex: number,\n): T[] {\n  const lQuery = lView[QUERIES]!.queries![queryIndex];\n  if (lQuery.matches === null) {\n    const tViewData = tView.data;\n    const tQueryMatches = tQuery.matches;\n    const result: Array<T | null> = [];\n    for (let i = 0; tQueryMatches !== null && i < tQueryMatches.length; i += 2) {\n      const matchedNodeIdx = tQueryMatches[i];\n      if (matchedNodeIdx < 0) {\n        // we at the <ng-template> marker which might have results in views created based on this\n        // <ng-template> - those results will be in separate views though, so here we just leave\n        // null as a placeholder\n        result.push(null);\n      } else {\n        ngDevMode && assertIndexInRange(tViewData, matchedNodeIdx);\n        const tNode = tViewData[matchedNodeIdx] as TNode;\n        result.push(createResultForNode(lView, tNode, tQueryMatches[i + 1], tQuery.metadata.read));\n      }\n    }\n    lQuery.matches = result;\n  }\n\n  return lQuery.matches;\n}\n\n/**\n * A helper function that collects (already materialized) query results from a tree of views,\n * starting with a provided LView.\n */\nfunction collectQueryResults<T>(tView: TView, lView: LView, queryIndex: number, result: T[]): T[] {\n  const tQuery = tView.queries!.getByIndex(queryIndex);\n  const tQueryMatches = tQuery.matches;\n  if (tQueryMatches !== null) {\n    const lViewResults = materializeViewResults<T>(tView, lView, tQuery, queryIndex);\n\n    for (let i = 0; i < tQueryMatches.length; i += 2) {\n      const tNodeIdx = tQueryMatches[i];\n      if (tNodeIdx > 0) {\n        result.push(lViewResults[i / 2] as T);\n      } else {\n        const childQueryIndex = tQueryMatches[i + 1];\n\n        const declarationLContainer = lView[-tNodeIdx] as LContainer;\n        ngDevMode && assertLContainer(declarationLContainer);\n\n        // collect matches for views inserted in this container\n        for (let i = CONTAINER_HEADER_OFFSET; i < declarationLContainer.length; i++) {\n          const embeddedLView = declarationLContainer[i];\n          if (embeddedLView[DECLARATION_LCONTAINER] === embeddedLView[PARENT]) {\n            collectQueryResults(embeddedLView[TVIEW], embeddedLView, childQueryIndex, result);\n          }\n        }\n\n        // collect matches for views created from this declaration container and inserted into\n        // different containers\n        if (declarationLContainer[MOVED_VIEWS] !== null) {\n          const embeddedLViews = declarationLContainer[MOVED_VIEWS]!;\n          for (let i = 0; i < embeddedLViews.length; i++) {\n            const embeddedLView = embeddedLViews[i];\n            collectQueryResults(embeddedLView[TVIEW], embeddedLView, childQueryIndex, result);\n          }\n        }\n      }\n    }\n  }\n  return result;\n}\n\nexport function loadQueryInternal<T>(lView: LView, queryIndex: number): QueryList<T> {\n  ngDevMode &&\n    assertDefined(lView[QUERIES], 'LQueries should be defined when trying to load a query');\n  ngDevMode && assertIndexInRange(lView[QUERIES]!.queries, queryIndex);\n  return lView[QUERIES]!.queries[queryIndex].queryList;\n}\n\n/**\n * Creates a new instance of LQuery and returns its index in the collection of LQuery objects.\n *\n * @returns index in the collection of LQuery objects\n */\nfunction createLQuery<T>(tView: TView, lView: LView, flags: QueryFlags): number {\n  const queryList = new QueryList<T>(\n    (flags & QueryFlags.emitDistinctChangesOnly) === QueryFlags.emitDistinctChangesOnly,\n  );\n\n  storeCleanupWithContext(tView, lView, queryList, queryList.destroy);\n\n  const lQueries = (lView[QUERIES] ??= new LQueries_()).queries;\n  return lQueries.push(new LQuery_(queryList)) - 1;\n}\n\nexport function createViewQuery<T>(\n  predicate: ProviderToken<unknown> | string[] | string,\n  flags: QueryFlags,\n  read?: any,\n): number {\n  ngDevMode && assertNumber(flags, 'Expecting flags');\n  const tView = getTView();\n  if (tView.firstCreatePass) {\n    createTQuery(tView, new TQueryMetadata_(predicate, flags, read), -1);\n    if ((flags & QueryFlags.isStatic) === QueryFlags.isStatic) {\n      tView.staticViewQueries = true;\n    }\n  }\n\n  return createLQuery<T>(tView, getLView(), flags);\n}\n\nexport function createContentQuery<T>(\n  directiveIndex: number,\n  predicate: ProviderToken<unknown> | string[] | string,\n  flags: QueryFlags,\n  read?: ProviderToken<T>,\n): number {\n  ngDevMode && assertNumber(flags, 'Expecting flags');\n  const tView = getTView();\n  if (tView.firstCreatePass) {\n    const tNode = getCurrentTNode()!;\n    createTQuery(tView, new TQueryMetadata_(predicate, flags, read), tNode.index);\n    saveContentQueryAndDirectiveIndex(tView, directiveIndex);\n    if ((flags & QueryFlags.isStatic) === QueryFlags.isStatic) {\n      tView.staticContentQueries = true;\n    }\n  }\n\n  return createLQuery<T>(tView, getLView(), flags);\n}\n\n/** Splits multiple selectors in the locator. */\nfunction splitQueryMultiSelectors(locator: string): string[] {\n  return locator.split(',').map((s) => s.trim());\n}\n\nexport function createTQuery(tView: TView, metadata: TQueryMetadata, nodeIndex: number): void {\n  if (tView.queries === null) tView.queries = new TQueries_();\n  tView.queries.track(new TQuery_(metadata, nodeIndex));\n}\n\nexport function saveContentQueryAndDirectiveIndex(tView: TView, directiveIndex: number) {\n  const tViewContentQueries = tView.contentQueries || (tView.contentQueries = []);\n  const lastSavedDirectiveIndex = tViewContentQueries.length\n    ? tViewContentQueries[tViewContentQueries.length - 1]\n    : -1;\n  if (directiveIndex !== lastSavedDirectiveIndex) {\n    tViewContentQueries.push(tView.queries!.length - 1, directiveIndex);\n  }\n}\n\nexport function getTQuery(tView: TView, index: number): TQuery {\n  ngDevMode && assertDefined(tView.queries, 'TQueries must be defined to retrieve a TQuery');\n  return tView.queries!.getByIndex(index);\n}\n\n/**\n * A helper function collecting results from all the views where a given query was active.\n * @param lView\n * @param queryIndex\n */\nexport function getQueryResults<V>(lView: LView, queryIndex: number): V[] {\n  const tView = lView[TVIEW];\n  const tQuery = getTQuery(tView, queryIndex);\n  return tQuery.crossesNgTemplate\n    ? collectQueryResults<V>(tView, lView, queryIndex, [])\n    : materializeViewResults<V>(tView, lView, tQuery, queryIndex);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ComputedNode, createComputed, SIGNAL} from '../../../primitives/signals';\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {unwrapElementRef} from '../../linker/element_ref';\nimport {QueryList} from '../../linker/query_list';\nimport {EMPTY_ARRAY} from '../../util/empty';\n\nimport {FLAGS, LView, LViewFlags} from '../interfaces/view';\nimport {Signal} from '../reactivity/api';\nimport {signal, WritableSignal} from '../reactivity/signal';\nimport {getLView} from '../state';\nimport {getQueryResults, loadQueryInternal} from './query';\n\ninterface QuerySignalNode<T> extends ComputedNode<T | ReadonlyArray<T>> {\n  _lView?: LView;\n  _queryIndex?: number;\n  _queryList?: QueryList<T>;\n  _dirtyCounter: WritableSignal<number>;\n  /**\n   * Stores the last seen, flattened results for a query. This is to avoid marking the signal result\n   * computed as dirty when there was view manipulation that didn't impact final results.\n   */\n  _flatValue?: T | ReadonlyArray<T>;\n}\n\n/**\n * A signal factory function in charge of creating a new computed signal capturing query\n * results. This centralized creation function is used by all types of queries (child / children,\n * required / optional).\n *\n * @param firstOnly indicates if all or only the first result should be returned\n * @param required indicates if at least one result is required\n * @returns a read-only signal with query results\n */\nfunction createQuerySignalFn<V>(\n  firstOnly: boolean,\n  required: boolean,\n  opts?: {debugName?: string},\n) {\n  let node: QuerySignalNode<V>;\n  const signalFn = createComputed(() => {\n    // A dedicated signal that increments its value every time a query changes its dirty status. By\n    // using this signal we can implement a query as computed and avoid creation of a specialized\n    // reactive node type. Please note that a query gets marked dirty under the following\n    // circumstances:\n    // - a view (where a query is active) finished its first creation pass;\n    // - a new view is inserted / deleted and it impacts query results.\n    node._dirtyCounter();\n\n    const value = refreshSignalQuery<V>(node, firstOnly);\n\n    if (required && value === undefined) {\n      throw new RuntimeError(\n        RuntimeErrorCode.REQUIRED_QUERY_NO_VALUE,\n        ngDevMode && 'Child query result is required but no value is available.',\n      );\n    }\n\n    return value;\n  });\n  node = signalFn[SIGNAL] as QuerySignalNode<V>;\n  node._dirtyCounter = signal(0);\n  node._flatValue = undefined;\n\n  if (ngDevMode) {\n    signalFn.toString = () => `[Query Signal]`;\n    node.debugName = opts?.debugName;\n  }\n\n  return signalFn;\n}\n\nexport function createSingleResultOptionalQuerySignalFn<ReadT>(opts?: {\n  debugName?: string;\n}): Signal<ReadT | undefined> {\n  return createQuerySignalFn(/* firstOnly */ true, /* required */ false, opts) as Signal<\n    ReadT | undefined\n  >;\n}\n\nexport function createSingleResultRequiredQuerySignalFn<ReadT>(opts?: {\n  debugName?: string;\n}): Signal<ReadT> {\n  return createQuerySignalFn(/* firstOnly */ true, /* required */ true, opts) as Signal<ReadT>;\n}\n\nexport function createMultiResultQuerySignalFn<ReadT>(opts?: {\n  debugName?: string;\n}): Signal<ReadonlyArray<ReadT>> {\n  return createQuerySignalFn(/* firstOnly */ false, /* required */ false, opts) as Signal<\n    ReadonlyArray<ReadT>\n  >;\n}\n\nexport function bindQueryToSignal(target: Signal<unknown>, queryIndex: number): void {\n  const node = target[SIGNAL] as QuerySignalNode<unknown>;\n  node._lView = getLView();\n  node._queryIndex = queryIndex;\n  node._queryList = loadQueryInternal(node._lView, queryIndex);\n  node._queryList.onDirty(() => node._dirtyCounter.update((v) => v + 1));\n}\n\nfunction refreshSignalQuery<V>(node: QuerySignalNode<V>, firstOnly: boolean): V | ReadonlyArray<V> {\n  const lView = node._lView;\n  const queryIndex = node._queryIndex;\n\n  // There are 2 conditions under which we want to return \"empty\" results instead of the ones\n  // collected by a query:\n  //\n  // 1) a given query wasn't created yet (this is a period of time between the directive creation\n  // and execution of the query creation function) - in this case a query doesn't exist yet and we\n  // don't have any results to return.\n  //\n  // 2) we are in the process of constructing a view (the first\n  // creation pass didn't finish) and a query might have partial results, but we don't want to\n  // return those - instead we do delay results collection until all nodes had a chance of matching\n  // and we can present consistent, \"atomic\" (on a view level) results.\n  if (lView === undefined || queryIndex === undefined || lView[FLAGS] & LViewFlags.CreationMode) {\n    return (firstOnly ? undefined : EMPTY_ARRAY) as V;\n  }\n\n  const queryList = loadQueryInternal<V>(lView, queryIndex);\n  const results = getQueryResults<V>(lView, queryIndex);\n\n  queryList.reset(results, unwrapElementRef);\n\n  if (firstOnly) {\n    return queryList.first;\n  } else {\n    // TODO: remove access to the private _changesDetected field by abstracting / removing usage of\n    // QueryList in the signal-based queries (perf follow-up)\n    const resultChanged = (queryList as any as {_changesDetected: boolean})._changesDetected;\n    if (resultChanged || node._flatValue === undefined) {\n      return (node._flatValue = queryList.toArray());\n    }\n    return node._flatValue;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertInInjectionContext} from '../di';\nimport {ProviderToken} from '../di/provider_token';\nimport {\n  createMultiResultQuerySignalFn,\n  createSingleResultOptionalQuerySignalFn,\n  createSingleResultRequiredQuerySignalFn,\n} from '../render3/queries/query_reactive';\nimport {Signal} from '../render3/reactivity/api';\n\nfunction viewChildFn<LocatorT, ReadT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts?: {read?: ProviderToken<ReadT>; debugName?: string},\n): Signal<ReadT | undefined> {\n  ngDevMode && assertInInjectionContext(viewChild);\n  return createSingleResultOptionalQuerySignalFn<ReadT>(opts);\n}\n\nfunction viewChildRequiredFn<LocatorT, ReadT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts?: {read?: ProviderToken<ReadT>; debugName?: string},\n): Signal<ReadT> {\n  ngDevMode && assertInInjectionContext(viewChild);\n  return createSingleResultRequiredQuerySignalFn<ReadT>(opts);\n}\n\n/**\n * Type of the `viewChild` function. The viewChild function creates a singular view query.\n *\n * It is a special function that also provides access to required query results via the `.required`\n * property.\n *\n * @publicAPI\n * @docsPrivate Ignored because `viewChild` is the canonical API entry.\n */\nexport interface ViewChildFunction {\n  /**\n   * Initializes a view child query. Consider using `viewChild.required` for queries that should\n   * always match.\n   *\n   * @publicAPI\n   */\n\n  <LocatorT, ReadT>(\n    locator: ProviderToken<LocatorT> | string,\n    opts: {\n      read: ProviderToken<ReadT>;\n      debugName?: string;\n    },\n  ): Signal<ReadT | undefined>;\n\n  <LocatorT>(\n    locator: ProviderToken<LocatorT> | string,\n    opts?: {\n      debugName?: string;\n    },\n  ): Signal<LocatorT | undefined>;\n\n  /**\n   * Initializes a view child query that is expected to always match an element.\n   *\n   * @publicAPI\n   */\n  required: {\n    <LocatorT>(\n      locator: ProviderToken<LocatorT> | string,\n      opts?: {\n        debugName?: string;\n      },\n    ): Signal<LocatorT>;\n\n    <LocatorT, ReadT>(\n      locator: ProviderToken<LocatorT> | string,\n      opts: {\n        read: ProviderToken<ReadT>;\n        debugName?: string;\n      },\n    ): Signal<ReadT>;\n  };\n}\n\n/**\n * Initializes a view child query.\n *\n * Consider using `viewChild.required` for queries that should always match.\n *\n * @usageNotes\n * Create a child query in your component by declaring a\n * class field and initializing it with the `viewChild()` function.\n *\n * ```angular-ts\n * @Component({template: '<div #el></div><my-component #cmp />'})\n * export class TestComponent {\n *   divEl = viewChild<ElementRef>('el');                   // Signal<ElementRef|undefined>\n *   divElRequired = viewChild.required<ElementRef>('el');  // Signal<ElementRef>\n *   cmp = viewChild(MyComponent);                          // Signal<MyComponent|undefined>\n *   cmpRequired = viewChild.required(MyComponent);         // Signal<MyComponent>\n * }\n * ```\n *\n * @publicAPI\n * @initializerApiFunction\n */\nexport const viewChild: ViewChildFunction = (() => {\n  // Note: This may be considered a side-effect, but nothing will depend on\n  // this assignment, unless this `viewChild` constant export is accessed. It's a\n  // self-contained side effect that is local to the user facing `viewChild` export.\n  (viewChildFn as any).required = viewChildRequiredFn;\n  return viewChildFn as typeof viewChildFn & {required: typeof viewChildRequiredFn};\n})();\n\nexport function viewChildren<LocatorT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts?: {debugName?: string},\n): Signal<ReadonlyArray<LocatorT>>;\nexport function viewChildren<LocatorT, ReadT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts: {\n    read: ProviderToken<ReadT>;\n    debugName?: string;\n  },\n): Signal<ReadonlyArray<ReadT>>;\n\n/**\n * Initializes a view children query.\n *\n * Query results are represented as a signal of a read-only collection containing all matched\n * elements.\n *\n * @usageNotes\n * Create a children query in your component by declaring a\n * class field and initializing it with the `viewChildren()` function.\n *\n * ```ts\n * @Component({...})\n * export class TestComponent {\n *   divEls = viewChildren<ElementRef>('el');   // Signal<ReadonlyArray<ElementRef>>\n * }\n * ```\n *\n * @initializerApiFunction\n * @publicAPI\n */\nexport function viewChildren<LocatorT, ReadT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts?: {\n    read?: ProviderToken<ReadT>;\n    debugName?: string;\n  },\n): Signal<ReadonlyArray<ReadT>> {\n  ngDevMode && assertInInjectionContext(viewChildren);\n  return createMultiResultQuerySignalFn<ReadT>(opts);\n}\n\nexport function contentChildFn<LocatorT, ReadT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts?: {\n    descendants?: boolean;\n    read?: ProviderToken<ReadT>;\n    debugName?: string;\n  },\n): Signal<ReadT | undefined> {\n  ngDevMode && assertInInjectionContext(contentChild);\n  return createSingleResultOptionalQuerySignalFn<ReadT>(opts);\n}\n\nfunction contentChildRequiredFn<LocatorT, ReadT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts?: {\n    descendants?: boolean;\n    read?: ProviderToken<ReadT>;\n    debugName?: string;\n  },\n): Signal<ReadT> {\n  ngDevMode && assertInInjectionContext(contentChildren);\n  return createSingleResultRequiredQuerySignalFn<ReadT>(opts);\n}\n\n/**\n * Type of the `contentChild` function.\n *\n * The contentChild function creates a singular content query. It is a special function that also\n * provides access to required query results via the `.required` property.\n *\n * @publicAPI\n * @docsPrivate Ignored because `contentChild` is the canonical API entry.\n */\nexport interface ContentChildFunction {\n  /**\n   * Initializes a content child query.\n   *\n   * Consider using `contentChild.required` for queries that should always match.\n   * @publicAPI\n   */\n  <LocatorT>(\n    locator: ProviderToken<LocatorT> | string,\n    opts?: {\n      descendants?: boolean;\n      read?: undefined;\n      debugName?: string;\n    },\n  ): Signal<LocatorT | undefined>;\n\n  <LocatorT, ReadT>(\n    locator: ProviderToken<LocatorT> | string,\n    opts: {\n      descendants?: boolean;\n      read: ProviderToken<ReadT>;\n      debugName?: string;\n    },\n  ): Signal<ReadT | undefined>;\n\n  /**\n   * Initializes a content child query that is always expected to match.\n   */\n  required: {\n    <LocatorT>(\n      locator: ProviderToken<LocatorT> | string,\n      opts?: {\n        descendants?: boolean;\n        read?: undefined;\n        debugName?: string;\n      },\n    ): Signal<LocatorT>;\n\n    <LocatorT, ReadT>(\n      locator: ProviderToken<LocatorT> | string,\n      opts: {\n        descendants?: boolean;\n        read: ProviderToken<ReadT>;\n        debugName?: string;\n      },\n    ): Signal<ReadT>;\n  };\n}\n\n/**\n * Initializes a content child query. Consider using `contentChild.required` for queries that should\n * always match.\n *\n * @usageNotes\n * Create a child query in your component by declaring a\n * class field and initializing it with the `contentChild()` function.\n *\n * ```ts\n * @Component({...})\n * export class TestComponent {\n *   headerEl = contentChild<ElementRef>('h');                    // Signal<ElementRef|undefined>\n *   headerElElRequired = contentChild.required<ElementRef>('h'); // Signal<ElementRef>\n *   header = contentChild(MyHeader);                             // Signal<MyHeader|undefined>\n *   headerRequired = contentChild.required(MyHeader);            // Signal<MyHeader>\n * }\n * ```\n *\n * @initializerApiFunction\n * @publicAPI\n */\nexport const contentChild: ContentChildFunction = (() => {\n  // Note: This may be considered a side-effect, but nothing will depend on\n  // this assignment, unless this `viewChild` constant export is accessed. It's a\n  // self-contained side effect that is local to the user facing `viewChild` export.\n  (contentChildFn as any).required = contentChildRequiredFn;\n  return contentChildFn as typeof contentChildFn & {required: typeof contentChildRequiredFn};\n})();\n\nexport function contentChildren<LocatorT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts?: {\n    descendants?: boolean;\n    read?: undefined;\n    debugName?: string;\n  },\n): Signal<ReadonlyArray<LocatorT>>;\nexport function contentChildren<LocatorT, ReadT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts: {\n    descendants?: boolean;\n    read: ProviderToken<ReadT>;\n    debugName?: string;\n  },\n): Signal<ReadonlyArray<ReadT>>;\n\n/**\n * Initializes a content children query.\n *\n * Query results are represented as a signal of a read-only collection containing all matched\n * elements.\n *\n * @usageNotes\n * Create a children query in your component by declaring a\n * class field and initializing it with the `contentChildren()` function.\n *\n * ```ts\n * @Component({...})\n * export class TestComponent {\n *   headerEl = contentChildren<ElementRef>('h');   // Signal<ReadonlyArray<ElementRef>>\n * }\n * ```\n *\n * @initializerApiFunction\n * @publicAPI\n */\nexport function contentChildren<LocatorT, ReadT>(\n  locator: ProviderToken<LocatorT> | string,\n  opts?: {\n    descendants?: boolean;\n    read?: ProviderToken<ReadT>;\n    debugName?: string;\n  },\n): Signal<ReadonlyArray<ReadT>> {\n  return createMultiResultQuerySignalFn<ReadT>(opts);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {producerAccessed, SIGNAL, signalSetFn} from '../../../primitives/signals';\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {Signal} from '../../render3/reactivity/api';\nimport {\n  signalAsReadonlyFn,\n  WritableSignal,\n  ɵWRITABLE_SIGNAL,\n} from '../../render3/reactivity/signal';\nimport {\n  InputSignal,\n  ɵINPUT_SIGNAL_BRAND_READ_TYPE,\n  ɵINPUT_SIGNAL_BRAND_WRITE_TYPE,\n} from '../input/input_signal';\nimport {INPUT_SIGNAL_NODE, InputSignalNode, REQUIRED_UNSET_VALUE} from '../input/input_signal_node';\nimport {OutputEmitterRef} from '../output/output_emitter_ref';\nimport {OutputRef} from '../output/output_ref';\n\n/**\n * @publicAPI\n *\n * Options for model signals.\n */\nexport interface ModelOptions {\n  /**\n   * Optional public name of the input side of the model. The output side will have the same\n   * name as the input, but suffixed with `Change`. By default, the class field name is used.\n   */\n  alias?: string;\n\n  /**\n   * A debug name for the model signal. Used in Angular DevTools to identify the signal.\n   */\n  debugName?: string;\n}\n\n/**\n * `ModelSignal` represents a special `Signal` for a directive/component model field.\n *\n * A model signal is a writeable signal that can be exposed as an output.\n * Whenever its value is updated, it emits to the output.\n *\n * @publicAPI\n */\nexport interface ModelSignal<T> extends WritableSignal<T>, InputSignal<T>, OutputRef<T> {\n  [SIGNAL]: InputSignalNode<T, T>;\n}\n\n/**\n * Creates a model signal.\n *\n * @param initialValue The initial value.\n *   Can be set to {@link REQUIRED_UNSET_VALUE} for required model signals.\n * @param options Additional options for the model.\n */\nexport function createModelSignal<T>(initialValue: T, opts?: ModelOptions): ModelSignal<T> {\n  const node: InputSignalNode<T, T> = Object.create(INPUT_SIGNAL_NODE);\n  const emitterRef = new OutputEmitterRef<T>();\n\n  node.value = initialValue;\n\n  function getter(): T {\n    producerAccessed(node);\n    assertModelSet(node.value);\n    return node.value;\n  }\n\n  getter[SIGNAL] = node;\n  getter.asReadonly = signalAsReadonlyFn.bind(getter as any) as () => Signal<T>;\n\n  // TODO: Should we throw an error when updating a destroyed model?\n  getter.set = (newValue: T) => {\n    if (!node.equal(node.value, newValue)) {\n      signalSetFn(node, newValue);\n      emitterRef.emit(newValue);\n    }\n  };\n\n  getter.update = (updateFn: (value: T) => T) => {\n    assertModelSet(node.value);\n    getter.set(updateFn(node.value));\n  };\n\n  getter.subscribe = emitterRef.subscribe.bind(emitterRef);\n  getter.destroyRef = emitterRef.destroyRef;\n\n  if (ngDevMode) {\n    getter.toString = () => `[Model Signal: ${getter()}]`;\n    node.debugName = opts?.debugName;\n  }\n\n  return getter as typeof getter &\n    Pick<\n      ModelSignal<T>,\n      | typeof ɵINPUT_SIGNAL_BRAND_READ_TYPE\n      | typeof ɵINPUT_SIGNAL_BRAND_WRITE_TYPE\n      | typeof ɵWRITABLE_SIGNAL\n    >;\n}\n\n/** Asserts that a model's value is set. */\nfunction assertModelSet(value: unknown): void {\n  if (value === REQUIRED_UNSET_VALUE) {\n    throw new RuntimeError(\n      RuntimeErrorCode.REQUIRED_MODEL_NO_VALUE,\n      ngDevMode && 'Model is required but no value is available yet.',\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertInInjectionContext} from '../../di';\nimport {REQUIRED_UNSET_VALUE} from '../input/input_signal_node';\n\nimport {createModelSignal, ModelOptions, ModelSignal} from './model_signal';\n\nexport function modelFunction<T>(\n  initialValue?: T,\n  opts?: ModelOptions,\n): ModelSignal<T | undefined> {\n  ngDevMode && assertInInjectionContext(model);\n\n  return createModelSignal(initialValue, opts);\n}\n\nexport function modelRequiredFunction<T>(opts?: ModelOptions): ModelSignal<T> {\n  ngDevMode && assertInInjectionContext(model);\n\n  return createModelSignal(REQUIRED_UNSET_VALUE as T, opts);\n}\n\n/**\n * `model` declares a writeable signal that is exposed as an input/output pair on the containing\n * directive. The input name is taken either from the class member or from the `alias` option.\n * The output name is generated by taking the input name and appending `Change`.\n *\n * The function exposes an API for also declaring required models via the\n * `model.required` function.\n *\n * @publicAPI\n * @docsPrivate Ignored because `model` is the canonical API entry.\n */\nexport interface ModelFunction {\n  /**\n   * Initializes a model of type `T` with an initial value of `undefined`.\n   * Angular will implicitly use `undefined` as initial value.\n   */\n  <T>(): ModelSignal<T | undefined>;\n  /** Initializes a model of type `T` with the given initial value. */\n  <T>(initialValue: T, opts?: ModelOptions): ModelSignal<T>;\n\n  required: {\n    /**\n     * Initializes a required model.\n     *\n     * Users of your directive/component need to bind to the input side of the model.\n     * If unset, a compile time error will be reported.\n     */\n    <T>(opts?: ModelOptions): ModelSignal<T>;\n  };\n}\n\n/**\n * `model` declares a writeable signal that is exposed as an input/output\n * pair on the containing directive.\n *\n * The input name is taken either from the class member or from the `alias` option.\n * The output name is generated by taking the input name and appending `Change`.\n *\n * @usageNotes\n *\n * To use `model()`, import the function from `@angular/core`.\n *\n * ```ts\n * import {model} from '@angular/core`;\n * ```\n *\n * Inside your component, introduce a new class member and initialize\n * it with a call to `model` or `model.required`.\n *\n * ```ts\n * @Directive({\n *   ...\n * })\n * export class MyDir {\n *   firstName = model<string>();            // ModelSignal<string|undefined>\n *   lastName  = model.required<string>();   // ModelSignal<string>\n *   age       = model(0);                   // ModelSignal<number>\n * }\n * ```\n *\n * Inside your component template, you can display the value of a `model`\n * by calling the signal.\n *\n * ```html\n * <span>{{firstName()}}</span>\n * ```\n *\n * Updating the `model` is equivalent to updating a writable signal.\n *\n * ```ts\n * updateName(newFirstName: string): void {\n *   this.firstName.set(newFirstName);\n * }\n * ```\n *\n * @publicAPI\n * @initializerApiFunction\n */\nexport const model: ModelFunction = (() => {\n  // Note: This may be considered a side-effect, but nothing will depend on\n  // this assignment, unless this `model` constant export is accessed. It's a\n  // self-contained side effect that is local to the user facing `model` export.\n  (modelFunction as any).required = modelRequiredFunction;\n  return modelFunction as typeof modelFunction & {required: typeof modelRequiredFunction};\n})();\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ProviderToken} from '../di/provider_token';\nimport {makePropDecorator} from '../util/decorators';\n\n/**\n * Type of the `Attribute` decorator / constructor function.\n *\n * @publicApi\n */\nexport interface AttributeDecorator {\n  /**\n   * Specifies that a constant attribute value should be injected.\n   *\n   * The directive can inject constant string literals of host element attributes.\n   *\n   * @usageNotes\n   *\n   * Suppose we have an `<input>` element and want to know its `type`.\n   *\n   * ```html\n   * <input type=\"text\">\n   * ```\n   *\n   * A decorator can inject string literal `text` as in the following example.\n   *\n   * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}\n   *\n   * @publicApi\n   */\n  (name: string): any;\n  new (name: string): Attribute;\n}\n\n/**\n * Type of the Attribute metadata.\n *\n * @publicApi\n */\nexport interface Attribute {\n  /**\n   * The name of the attribute to be injected into the constructor.\n   */\n  attributeName?: string;\n}\n\n/**\n * Type of the Query metadata.\n *\n * @publicApi\n */\nexport interface Query {\n  descendants: boolean;\n  emitDistinctChangesOnly: boolean;\n  first: boolean;\n  read: any;\n  isViewQuery: boolean;\n  selector: any;\n  static?: boolean;\n\n  /**\n   * @internal\n   *\n   * Whether the query is a signal query.\n   *\n   * This option exists for JIT compatibility. Users are not expected to use this.\n   * Angular needs a way to capture queries from classes so that the internal query\n   * functions can be generated. This needs to happen before the component is instantiated.\n   * Due to this, for JIT compilation, signal queries need an additional decorator\n   * declaring the query. Angular provides a TS transformer to automatically handle this\n   * for JIT usage (e.g. in tests).\n   */\n  isSignal?: boolean;\n}\n\n// Stores the default value of `emitDistinctChangesOnly` when the `emitDistinctChangesOnly` is not\n// explicitly set.\nexport const emitDistinctChangesOnlyDefaultValue = true;\n\n/**\n * Base class for query metadata.\n *\n * @see {@link ContentChildren}\n * @see {@link ContentChild}\n * @see {@link ViewChildren}\n * @see {@link ViewChild}\n *\n * @publicApi\n */\nexport abstract class Query {}\n\n/**\n * Type of the ContentChildren decorator / constructor function.\n *\n * @see {@link ContentChildren}\n * @publicApi\n */\nexport interface ContentChildrenDecorator {\n  /**\n   * @description\n   * Property decorator that configures a content query.\n   *\n   * Use to get the `QueryList` of elements or directives from the content DOM.\n   * Any time a child element is added, removed, or moved, the query list will be\n   * updated, and the changes observable of the query list will emit a new value.\n   *\n   * Content queries are set before the `ngAfterContentInit` callback is called.\n   *\n   * Does not retrieve elements or directives that are in other components' templates,\n   * since a component's template is always a black box to its ancestors.\n   *\n   * **Metadata Properties**:\n   *\n   * * **selector** - The directive type or the name used for querying.\n   * * **descendants** - If `true` include all descendants of the element. If `false` then only\n   * query direct children of the element.\n   * * **emitDistinctChangesOnly** - The ` QueryList#changes` observable will emit new values only\n   *   if the QueryList result has changed. When `false` the `changes` observable might emit even\n   *   if the QueryList has not changed.\n   *   ** Note: *** This config option is **deprecated**, it will be permanently set to `true` and\n   *   removed in future versions of Angular.\n   * * **read** - Used to read a different token from the queried elements.\n   *\n   * The following selectors are supported.\n   *   * Any class with the `@Component` or `@Directive` decorator\n   *   * A template reference variable as a string (e.g. query `<my-component #cmp></my-component>`\n   * with `@ContentChildren('cmp')`)\n   *   * Any provider defined in the child component tree of the current component (e.g.\n   * `@ContentChildren(SomeService) someService: SomeService`)\n   *   * Any provider defined through a string token (e.g. `@ContentChildren('someToken')\n   * someTokenVal: any`)\n   *   * A `TemplateRef` (e.g. query `<ng-template></ng-template>` with\n   * `@ContentChildren(TemplateRef) template;`)\n   *\n   * In addition, multiple string selectors can be separated with a comma (e.g.\n   * `@ContentChildren('cmp1,cmp2')`)\n   *\n   * The following values are supported by `read`:\n   *   * Any class with the `@Component` or `@Directive` decorator\n   *   * Any provider defined on the injector of the component that is matched by the `selector` of\n   * this query\n   *   * Any provider defined through a string token (e.g. `{provide: 'token', useValue: 'val'}`)\n   *   * `TemplateRef`, `ElementRef`, and `ViewContainerRef`\n   *\n   * @usageNotes\n   *\n   * Here is a simple demonstration of how the `ContentChildren` decorator can be used.\n   *\n   * {@example core/di/ts/contentChildren/content_children_howto.ts region='HowTo'}\n   *\n   * ### Tab-pane example\n   *\n   * Here is a slightly more realistic example that shows how `ContentChildren` decorators\n   * can be used to implement a tab pane component.\n   *\n   * {@example core/di/ts/contentChildren/content_children_example.ts region='Component'}\n   *\n   * @Annotation\n   */\n  (\n    selector: ProviderToken<unknown> | Function | string,\n    opts?: {\n      descendants?: boolean;\n      emitDistinctChangesOnly?: boolean;\n      read?: any;\n    },\n  ): any;\n  new (\n    selector: ProviderToken<unknown> | Function | string,\n    opts?: {descendants?: boolean; emitDistinctChangesOnly?: boolean; read?: any},\n  ): Query;\n}\n\n/**\n * Type of the ContentChildren metadata.\n *\n *\n * @Annotation\n * @publicApi\n */\nexport type ContentChildren = Query;\n\n/**\n * ContentChildren decorator and metadata.\n *\n *\n * @Annotation\n * @publicApi\n */\nexport const ContentChildren: ContentChildrenDecorator = makePropDecorator(\n  'ContentChildren',\n  (selector?: any, opts: any = {}) => ({\n    selector,\n    first: false,\n    isViewQuery: false,\n    descendants: false,\n    emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue,\n    ...opts,\n  }),\n  Query,\n);\n\n/**\n * Type of the ContentChild decorator / constructor function.\n *\n * @publicApi\n */\nexport interface ContentChildDecorator {\n  /**\n   * @description\n   * Property decorator that configures a content query.\n   *\n   * Use to get the first element or the directive matching the selector from the content DOM.\n   * If the content DOM changes, and a new child matches the selector,\n   * the property will be updated.\n   *\n   * Does not retrieve elements or directives that are in other components' templates,\n   * since a component's template is always a black box to its ancestors.\n   *\n   * **Metadata Properties**:\n   *\n   * * **selector** - The directive type or the name used for querying.\n   * * **descendants** - If `true` (default) include all descendants of the element. If `false` then\n   * only query direct children of the element.\n   * * **read** - Used to read a different token from the queried element.\n   * * **static** - True to resolve query results before change detection runs,\n   * false to resolve after change detection. Defaults to false.\n   *\n   * The following selectors are supported.\n   *   * Any class with the `@Component` or `@Directive` decorator\n   *   * A template reference variable as a string (e.g. query `<my-component #cmp></my-component>`\n   * with `@ContentChild('cmp')`)\n   *   * Any provider defined in the child component tree of the current component (e.g.\n   * `@ContentChild(SomeService) someService: SomeService`)\n   *   * Any provider defined through a string token (e.g. `@ContentChild('someToken') someTokenVal:\n   * any`)\n   *   * A `TemplateRef` (e.g. query `<ng-template></ng-template>` with `@ContentChild(TemplateRef)\n   * template;`)\n   *\n   * The following values are supported by `read`:\n   *   * Any class with the `@Component` or `@Directive` decorator\n   *   * Any provider defined on the injector of the component that is matched by the `selector` of\n   * this query\n   *   * Any provider defined through a string token (e.g. `{provide: 'token', useValue: 'val'}`)\n   *   * `TemplateRef`, `ElementRef`, and `ViewContainerRef`\n   *\n   * Difference between dynamic and static queries:\n   *\n   * | Queries                             | Details |\n   * |:---                                 |:---     |\n   * | Dynamic queries \\(`static: false`\\) | The query resolves before the `ngAfterContentInit()`\n   * callback is called. The result will be updated for changes to your view, such as changes to\n   * `ngIf` and `ngFor` blocks. | | Static queries \\(`static: true`\\)   | The query resolves once\n   * the view has been created, but before change detection runs (before the `ngOnInit()` callback\n   * is called). The result, though, will never be updated to reflect changes to your view, such as\n   * changes to `ngIf` and `ngFor` blocks.  |\n   *\n   * @usageNotes\n   *\n   * {@example core/di/ts/contentChild/content_child_howto.ts region='HowTo'}\n   *\n   * ### Example\n   *\n   * {@example core/di/ts/contentChild/content_child_example.ts region='Component'}\n   *\n   * @Annotation\n   */\n  (\n    selector: ProviderToken<unknown> | Function | string,\n    opts?: {descendants?: boolean; read?: any; static?: boolean},\n  ): any;\n  new (\n    selector: ProviderToken<unknown> | Function | string,\n    opts?: {descendants?: boolean; read?: any; static?: boolean},\n  ): ContentChild;\n}\n\n/**\n * Type of the ContentChild metadata.\n *\n * @publicApi\n */\nexport type ContentChild = Query;\n\n/**\n * ContentChild decorator and metadata.\n *\n *\n * @Annotation\n *\n * @publicApi\n */\nexport const ContentChild: ContentChildDecorator = makePropDecorator(\n  'ContentChild',\n  (selector?: any, opts: any = {}) => ({\n    selector,\n    first: true,\n    isViewQuery: false,\n    descendants: true,\n    ...opts,\n  }),\n  Query,\n);\n\n/**\n * Type of the ViewChildren decorator / constructor function.\n *\n * @see {@link ViewChildren}\n *\n * @publicApi\n */\nexport interface ViewChildrenDecorator {\n  /**\n   * @description\n   * Property decorator that configures a view query.\n   *\n   * Use to get the `QueryList` of elements or directives from the view DOM.\n   * Any time a child element is added, removed, or moved, the query list will be updated,\n   * and the changes observable of the query list will emit a new value.\n   *\n   * View queries are set before the `ngAfterViewInit` callback is called.\n   *\n   * **Metadata Properties**:\n   *\n   * * **selector** - The directive type or the name used for querying.\n   * * **read** - Used to read a different token from the queried elements.\n   * * **emitDistinctChangesOnly** - The ` QueryList#changes` observable will emit new values only\n   *   if the QueryList result has changed. When `false` the `changes` observable might emit even\n   *   if the QueryList has not changed.\n   *   ** Note: *** This config option is **deprecated**, it will be permanently set to `true` and\n   * removed in future versions of Angular.\n   *\n   * The following selectors are supported.\n   *   * Any class with the `@Component` or `@Directive` decorator\n   *   * A template reference variable as a string (e.g. query `<my-component #cmp></my-component>`\n   * with `@ViewChildren('cmp')`)\n   *   * Any provider defined in the child component tree of the current component (e.g.\n   * `@ViewChildren(SomeService) someService!: SomeService`)\n   *   * Any provider defined through a string token (e.g. `@ViewChildren('someToken')\n   * someTokenVal!: any`)\n   *   * A `TemplateRef` (e.g. query `<ng-template></ng-template>` with `@ViewChildren(TemplateRef)\n   * template;`)\n   *\n   * In addition, multiple string selectors can be separated with a comma (e.g.\n   * `@ViewChildren('cmp1,cmp2')`)\n   *\n   * The following values are supported by `read`:\n   *   * Any class with the `@Component` or `@Directive` decorator\n   *   * Any provider defined on the injector of the component that is matched by the `selector` of\n   * this query\n   *   * Any provider defined through a string token (e.g. `{provide: 'token', useValue: 'val'}`)\n   *   * `TemplateRef`, `ElementRef`, and `ViewContainerRef`\n   *\n   * @usageNotes\n   *\n   * {@example core/di/ts/viewChildren/view_children_howto.ts region='HowTo'}\n   *\n   * ### Another example\n   *\n   * {@example core/di/ts/viewChildren/view_children_example.ts region='Component'}\n   *\n   * @Annotation\n   */\n  (\n    selector: ProviderToken<unknown> | Function | string,\n    opts?: {read?: any; emitDistinctChangesOnly?: boolean},\n  ): any;\n  new (\n    selector: ProviderToken<unknown> | Function | string,\n    opts?: {read?: any; emitDistinctChangesOnly?: boolean},\n  ): ViewChildren;\n}\n\n/**\n * Type of the ViewChildren metadata.\n *\n * @publicApi\n */\nexport type ViewChildren = Query;\n\n/**\n * ViewChildren decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const ViewChildren: ViewChildrenDecorator = makePropDecorator(\n  'ViewChildren',\n  (selector?: any, opts: any = {}) => ({\n    selector,\n    first: false,\n    isViewQuery: true,\n    descendants: true,\n    emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue,\n    ...opts,\n  }),\n  Query,\n);\n\n/**\n * Type of the ViewChild decorator / constructor function.\n *\n * @see {@link ViewChild}\n * @publicApi\n */\nexport interface ViewChildDecorator {\n  /**\n   * @description\n   * Property decorator that configures a view query.\n   * The change detector looks for the first element or the directive matching the selector\n   * in the view DOM. If the view DOM changes, and a new child matches the selector,\n   * the property is updated.\n   *\n   * **Metadata Properties**:\n   *\n   * * **selector** - The directive type or the name used for querying.\n   * * **read** - Used to read a different token from the queried elements.\n   * * **static** - `true` to resolve query results before change detection runs,\n   * `false` to resolve after change detection. Defaults to `false`.\n   *\n   *\n   * The following selectors are supported.\n   *   * Any class with the `@Component` or `@Directive` decorator\n   *   * A template reference variable as a string (e.g. query `<my-component #cmp></my-component>`\n   * with `@ViewChild('cmp')`)\n   *   * Any provider defined in the child component tree of the current component (e.g.\n   * `@ViewChild(SomeService) someService: SomeService`)\n   *   * Any provider defined through a string token (e.g. `@ViewChild('someToken') someTokenVal:\n   * any`)\n   *   * A `TemplateRef` (e.g. query `<ng-template></ng-template>` with `@ViewChild(TemplateRef)\n   * template;`)\n   *\n   * The following values are supported by `read`:\n   *   * Any class with the `@Component` or `@Directive` decorator\n   *   * Any provider defined on the injector of the component that is matched by the `selector` of\n   * this query\n   *   * Any provider defined through a string token (e.g. `{provide: 'token', useValue: 'val'}`)\n   *   * `TemplateRef`, `ElementRef`, and `ViewContainerRef`\n   *\n   * Difference between dynamic and static queries:\n   *   * Dynamic queries \\(`static: false`\\) - The query resolves before the `ngAfterViewInit()`\n   * callback is called. The result will be updated for changes to your view, such as changes to\n   * `ngIf` and `ngFor` blocks.\n   *   * Static queries \\(`static: true`\\) - The query resolves once\n   * the view has been created, but before change detection runs (before the `ngOnInit()` callback\n   * is called). The result, though, will never be updated to reflect changes to your view, such as\n   * changes to `ngIf` and `ngFor` blocks.\n   *\n   * @usageNotes\n   *\n   * ### Example 1\n   *\n   * {@example core/di/ts/viewChild/view_child_example.ts region='Component'}\n   *\n   * ### Example 2\n   *\n   * {@example core/di/ts/viewChild/view_child_howto.ts region='HowTo'}\n   *\n   * @Annotation\n   */\n  (\n    selector: ProviderToken<unknown> | Function | string,\n    opts?: {read?: any; static?: boolean},\n  ): any;\n  new (\n    selector: ProviderToken<unknown> | Function | string,\n    opts?: {read?: any; static?: boolean},\n  ): ViewChild;\n}\n\n/**\n * Type of the ViewChild metadata.\n *\n * @publicApi\n */\nexport type ViewChild = Query;\n\n/**\n * ViewChild decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const ViewChild: ViewChildDecorator = makePropDecorator(\n  'ViewChild',\n  (selector: any, opts: any) => ({\n    selector,\n    first: true,\n    isViewQuery: true,\n    descendants: true,\n    ...opts,\n  }),\n  Query,\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\n\nimport type {Component} from './directives';\n\n/**\n * Used to resolve resource URLs on `@Component` when used with JIT compilation.\n *\n * Example:\n * ```ts\n * @Component({\n *   selector: 'my-comp',\n *   templateUrl: 'my-comp.html', // This requires asynchronous resolution\n * })\n * class MyComponent{\n * }\n *\n * // Calling `renderComponent` will fail because `renderComponent` is a synchronous process\n * // and `MyComponent`'s `@Component.templateUrl` needs to be resolved asynchronously.\n *\n * // Calling `resolveComponentResources()` will resolve `@Component.templateUrl` into\n * // `@Component.template`, which allows `renderComponent` to proceed in a synchronous manner.\n *\n * // Use browser's `fetch()` function as the default resource resolution strategy.\n * resolveComponentResources(fetch).then(() => {\n *   // After resolution all URLs have been converted into `template` strings.\n *   renderComponent(MyComponent);\n * });\n *\n * ```\n *\n * NOTE: In AOT the resolution happens during compilation, and so there should be no need\n * to call this method outside JIT mode.\n *\n * @param resourceResolver a function which is responsible for returning a `Promise` to the\n * contents of the resolved URL. Browser's `fetch()` method is a good default implementation.\n */\nexport function resolveComponentResources(\n  resourceResolver: (url: string) => Promise<string | {text(): Promise<string>}>,\n): Promise<void> {\n  // Store all promises which are fetching the resources.\n  const componentResolved: Promise<void>[] = [];\n\n  // Cache so that we don't fetch the same resource more than once.\n  const urlMap = new Map<string, Promise<string>>();\n  function cachedResourceResolve(url: string): Promise<string> {\n    let promise = urlMap.get(url);\n    if (!promise) {\n      const resp = resourceResolver(url);\n      urlMap.set(url, (promise = resp.then(unwrapResponse)));\n    }\n    return promise;\n  }\n\n  componentResourceResolutionQueue.forEach((component: Component, type: Type<any>) => {\n    const promises: Promise<void>[] = [];\n    if (component.templateUrl) {\n      promises.push(\n        cachedResourceResolve(component.templateUrl).then((template) => {\n          component.template = template;\n        }),\n      );\n    }\n    const styles =\n      typeof component.styles === 'string' ? [component.styles] : component.styles || [];\n    component.styles = styles;\n\n    if (component.styleUrl && component.styleUrls?.length) {\n      throw new Error(\n        '@Component cannot define both `styleUrl` and `styleUrls`. ' +\n          'Use `styleUrl` if the component has one stylesheet, or `styleUrls` if it has multiple',\n      );\n    } else if (component.styleUrls?.length) {\n      const styleOffset = component.styles.length;\n      const styleUrls = component.styleUrls;\n      component.styleUrls.forEach((styleUrl, index) => {\n        styles.push(''); // pre-allocate array.\n        promises.push(\n          cachedResourceResolve(styleUrl).then((style) => {\n            styles[styleOffset + index] = style;\n            styleUrls.splice(styleUrls.indexOf(styleUrl), 1);\n            if (styleUrls.length == 0) {\n              component.styleUrls = undefined;\n            }\n          }),\n        );\n      });\n    } else if (component.styleUrl) {\n      promises.push(\n        cachedResourceResolve(component.styleUrl).then((style) => {\n          styles.push(style);\n          component.styleUrl = undefined;\n        }),\n      );\n    }\n\n    const fullyResolved = Promise.all(promises).then(() => componentDefResolved(type));\n    componentResolved.push(fullyResolved);\n  });\n  clearResolutionOfComponentResourcesQueue();\n  return Promise.all(componentResolved).then(() => undefined);\n}\n\nlet componentResourceResolutionQueue = new Map<Type<any>, Component>();\n\n// Track when existing ɵcmp for a Type is waiting on resources.\nconst componentDefPendingResolution = new Set<Type<any>>();\n\nexport function maybeQueueResolutionOfComponentResources(type: Type<any>, metadata: Component) {\n  if (componentNeedsResolution(metadata)) {\n    componentResourceResolutionQueue.set(type, metadata);\n    componentDefPendingResolution.add(type);\n  }\n}\n\nexport function isComponentDefPendingResolution(type: Type<any>): boolean {\n  return componentDefPendingResolution.has(type);\n}\n\nexport function componentNeedsResolution(component: Component): boolean {\n  return !!(\n    (component.templateUrl && !component.hasOwnProperty('template')) ||\n    (component.styleUrls && component.styleUrls.length) ||\n    component.styleUrl\n  );\n}\nexport function clearResolutionOfComponentResourcesQueue(): Map<Type<any>, Component> {\n  const old = componentResourceResolutionQueue;\n  componentResourceResolutionQueue = new Map();\n  return old;\n}\n\nexport function restoreComponentResolutionQueue(queue: Map<Type<any>, Component>): void {\n  componentDefPendingResolution.clear();\n  queue.forEach((_, type) => componentDefPendingResolution.add(type));\n  componentResourceResolutionQueue = queue;\n}\n\nexport function isComponentResourceResolutionQueueEmpty() {\n  return componentResourceResolutionQueue.size === 0;\n}\n\nfunction unwrapResponse(response: string | {text(): Promise<string>}): string | Promise<string> {\n  return typeof response == 'string' ? response : response.text();\n}\n\nfunction componentDefResolved(type: Type<any>): void {\n  componentDefPendingResolution.delete(type);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {NgModuleType} from '../metadata/ng_module_def';\nimport {stringify} from '../util/stringify';\n\n/**\n * Map of module-id to the corresponding NgModule.\n */\nconst modules = new Map<string, NgModuleType>();\n\n/**\n * Whether to check for duplicate NgModule registrations.\n *\n * This can be disabled for testing.\n */\nlet checkForDuplicateNgModules = true;\n\nfunction assertSameOrNotExisting(id: string, type: Type<any> | null, incoming: Type<any>): void {\n  if (type && type !== incoming && checkForDuplicateNgModules) {\n    throw new Error(\n      `Duplicate module registered for ${id} - ${stringify(type)} vs ${stringify(type.name)}`,\n    );\n  }\n}\n\n/**\n * Adds the given NgModule type to Angular's NgModule registry.\n *\n * This is generated as a side-effect of NgModule compilation. Note that the `id` is passed in\n * explicitly and not read from the NgModule definition. This is for two reasons: it avoids a\n * megamorphic read, and in JIT there's a chicken-and-egg problem where the NgModule may not be\n * fully resolved when it's registered.\n *\n * @codeGenApi\n */\nexport function registerNgModuleType(ngModuleType: NgModuleType, id: string): void {\n  const existing = modules.get(id) || null;\n  assertSameOrNotExisting(id, existing, ngModuleType);\n  modules.set(id, ngModuleType);\n}\n\nexport function clearModulesForTest(): void {\n  modules.clear();\n}\n\nexport function getRegisteredNgModuleType(id: string): NgModuleType | undefined {\n  return modules.get(id);\n}\n\n/**\n * Control whether the NgModule registration system enforces that each NgModule type registered has\n * a unique id.\n *\n * This is useful for testing as the NgModule registry cannot be properly reset betw   een tests with\n * Angular's current API.\n */\nexport function setAllowDuplicateNgModuleIdsForTest(allowDuplicates: boolean): void {\n  checkForDuplicateNgModules = !allowDuplicates;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {getTemplateLocationDetails} from '../render3/instructions/element_validation';\nimport {TNodeType} from '../render3/interfaces/node';\nimport {RComment, RElement} from '../render3/interfaces/renderer_dom';\nimport {RENDERER} from '../render3/interfaces/view';\nimport {nativeRemoveNode} from '../render3/dom_node_manipulation';\nimport {getLView, getSelectedTNode} from '../render3/state';\nimport {getNativeByTNode} from '../render3/util/view_utils';\nimport {trustedHTMLFromString} from '../util/security/trusted_types';\n\n/**\n * Validation function invoked at runtime for each binding that might potentially\n * represent a security-sensitive attribute of an <iframe>.\n * See `IFRAME_SECURITY_SENSITIVE_ATTRS` in the\n * `packages/compiler/src/schema/dom_security_schema.ts` script for the full list\n * of such attributes.\n *\n * @codeGenApi\n */\nexport function ɵɵvalidateIframeAttribute(attrValue: any, tagName: string, attrName: string) {\n  const lView = getLView();\n  const tNode = getSelectedTNode()!;\n  const element = getNativeByTNode(tNode, lView) as RElement | RComment;\n\n  // Restrict any dynamic bindings of security-sensitive attributes/properties\n  // on an <iframe> for security reasons.\n  if (tNode.type === TNodeType.Element && tagName.toLowerCase() === 'iframe') {\n    const iframe = element as HTMLIFrameElement;\n\n    // Unset previously applied `src` and `srcdoc` if we come across a situation when\n    // a security-sensitive attribute is set later via an attribute/property binding.\n    iframe.src = '';\n    iframe.srcdoc = trustedHTMLFromString('') as unknown as string;\n\n    // Also remove the <iframe> from the document.\n    nativeRemoveNode(lView[RENDERER], iframe);\n\n    const errorMessage =\n      ngDevMode &&\n      `Angular has detected that the \\`${attrName}\\` was applied ` +\n        `as a binding to an <iframe>${getTemplateLocationDetails(lView)}. ` +\n        `For security reasons, the \\`${attrName}\\` can be set on an <iframe> ` +\n        `as a static attribute only. \\n` +\n        `To fix this, switch the \\`${attrName}\\` binding to a static attribute ` +\n        `in a template or in host bindings section.`;\n    throw new RuntimeError(RuntimeErrorCode.UNSAFE_IFRAME_ATTRS, errorMessage);\n  }\n  return attrValue;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {EnvironmentInjector, R3Injector} from '../di/r3_injector';\nimport {Type} from '../interface/type';\n\nimport {ComponentFactoryResolver} from './component_factory_resolver';\n\n/**\n * Represents an instance of an `NgModule` created by an `NgModuleFactory`.\n * Provides access to the `NgModule` instance and related objects.\n *\n * @publicApi\n */\nexport abstract class NgModuleRef<T> {\n  /**\n   * The injector that contains all of the providers of the `NgModule`.\n   */\n  abstract get injector(): EnvironmentInjector;\n\n  /**\n   * The resolver that can retrieve component factories in a context of this module.\n   *\n   * Note: since v13, dynamic component creation via\n   * [`ViewContainerRef.createComponent`](api/core/ViewContainerRef#createComponent)\n   * does **not** require resolving component factory: component class can be used directly.\n   *\n   * @deprecated Angular no longer requires Component factories. Please use other APIs where\n   *     Component class can be used directly.\n   */\n  abstract get componentFactoryResolver(): ComponentFactoryResolver;\n\n  /**\n   * The `NgModule` instance.\n   */\n  abstract get instance(): T;\n\n  /**\n   * Destroys the module instance and all of the data structures associated with it.\n   */\n  abstract destroy(): void;\n\n  /**\n   * Registers a callback to be executed when the module is destroyed.\n   */\n  abstract onDestroy(callback: () => void): void;\n}\n\nexport interface InternalNgModuleRef<T> extends NgModuleRef<T> {\n  // Note: we are using the prefix _ as NgModuleData is an NgModuleRef and therefore directly\n  // exposed to the user.\n  _bootstrapComponents: Type<any>[];\n  resolveInjectorInitializers(): void;\n}\n\n/**\n * @publicApi\n *\n * @deprecated\n * This class was mostly used as a part of ViewEngine-based JIT API and is no longer needed in Ivy\n * JIT mode. Angular provides APIs that accept NgModule classes directly (such as\n * [PlatformRef.bootstrapModule](api/core/PlatformRef#bootstrapModule) and\n * [createNgModule](api/core/createNgModule)), consider switching to those APIs instead of\n * using factory-based ones.\n */\nexport abstract class NgModuleFactory<T> {\n  abstract get moduleType(): Type<T>;\n  abstract create(parentInjector: Injector | null): NgModuleRef<T>;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {createInjectorWithoutInjectorInstances} from '../di/create_injector';\nimport {Injector} from '../di/injector';\nimport {EnvironmentProviders, Provider, StaticProvider} from '../di/interface/provider';\nimport {EnvironmentInjector, getNullInjector, R3Injector} from '../di/r3_injector';\nimport {Type} from '../interface/type';\nimport {ComponentFactoryResolver as viewEngine_ComponentFactoryResolver} from '../linker/component_factory_resolver';\nimport {\n  InternalNgModuleRef,\n  NgModuleFactory as viewEngine_NgModuleFactory,\n  NgModuleRef as viewEngine_NgModuleRef,\n} from '../linker/ng_module_factory';\nimport {assertDefined} from '../util/assert';\nimport {stringify} from '../util/stringify';\n\nimport {ComponentFactoryResolver} from './component_ref';\nimport {getNgModuleDef} from './def_getters';\nimport {maybeUnwrapFn} from './util/misc_utils';\n\n/**\n * Returns a new NgModuleRef instance based on the NgModule class and parent injector provided.\n *\n * @param ngModule NgModule class.\n * @param parentInjector Optional injector instance to use as a parent for the module injector. If\n *     not provided, `NullInjector` will be used instead.\n * @returns NgModuleRef that represents an NgModule instance.\n *\n * @publicApi\n */\nexport function createNgModule<T>(\n  ngModule: Type<T>,\n  parentInjector?: Injector,\n): viewEngine_NgModuleRef<T> {\n  return new NgModuleRef<T>(ngModule, parentInjector ?? null, []);\n}\n\n/**\n * The `createNgModule` function alias for backwards-compatibility.\n * Please avoid using it directly and use `createNgModule` instead.\n *\n * @deprecated Use `createNgModule` instead.\n */\nexport const createNgModuleRef = createNgModule;\nexport class NgModuleRef<T> extends viewEngine_NgModuleRef<T> implements InternalNgModuleRef<T> {\n  // tslint:disable-next-line:require-internal-with-underscore\n  _bootstrapComponents: Type<any>[] = [];\n  private readonly _r3Injector: R3Injector;\n  override instance!: T;\n  destroyCbs: (() => void)[] | null = [];\n\n  // When bootstrapping a module we have a dependency graph that looks like this:\n  // ApplicationRef -> ComponentFactoryResolver -> NgModuleRef. The problem is that if the\n  // module being resolved tries to inject the ComponentFactoryResolver, it'll create a\n  // circular dependency which will result in a runtime error, because the injector doesn't\n  // exist yet. We work around the issue by creating the ComponentFactoryResolver ourselves\n  // and providing it, rather than letting the injector resolve it.\n  override readonly componentFactoryResolver: ComponentFactoryResolver =\n    new ComponentFactoryResolver(this);\n\n  constructor(\n    private readonly ngModuleType: Type<T>,\n    public _parent: Injector | null,\n    additionalProviders: StaticProvider[],\n    runInjectorInitializers = true,\n  ) {\n    super();\n    const ngModuleDef = getNgModuleDef(ngModuleType);\n    ngDevMode &&\n      assertDefined(\n        ngModuleDef,\n        `NgModule '${stringify(ngModuleType)}' is not a subtype of 'NgModuleType'.`,\n      );\n\n    this._bootstrapComponents = maybeUnwrapFn(ngModuleDef!.bootstrap);\n    this._r3Injector = createInjectorWithoutInjectorInstances(\n      ngModuleType,\n      _parent,\n      [\n        {provide: viewEngine_NgModuleRef, useValue: this},\n        {\n          provide: viewEngine_ComponentFactoryResolver,\n          useValue: this.componentFactoryResolver,\n        },\n        ...additionalProviders,\n      ],\n      stringify(ngModuleType),\n      new Set(['environment']),\n    ) as R3Injector;\n\n    // We need to resolve the injector types separately from the injector creation, because\n    // the module might be trying to use this ref in its constructor for DI which will cause a\n    // circular error that will eventually error out, because the injector isn't created yet.\n    if (runInjectorInitializers) {\n      this.resolveInjectorInitializers();\n    }\n  }\n\n  resolveInjectorInitializers() {\n    this._r3Injector.resolveInjectorInitializers();\n    this.instance = this._r3Injector.get(this.ngModuleType);\n  }\n\n  override get injector(): EnvironmentInjector {\n    return this._r3Injector;\n  }\n\n  override destroy(): void {\n    ngDevMode && assertDefined(this.destroyCbs, 'NgModule already destroyed');\n    const injector = this._r3Injector;\n    !injector.destroyed && injector.destroy();\n    this.destroyCbs!.forEach((fn) => fn());\n    this.destroyCbs = null;\n  }\n  override onDestroy(callback: () => void): void {\n    ngDevMode && assertDefined(this.destroyCbs, 'NgModule already destroyed');\n    this.destroyCbs!.push(callback);\n  }\n}\n\nexport class NgModuleFactory<T> extends viewEngine_NgModuleFactory<T> {\n  constructor(public moduleType: Type<T>) {\n    super();\n  }\n\n  override create(parentInjector: Injector | null): viewEngine_NgModuleRef<T> {\n    return new NgModuleRef(this.moduleType, parentInjector, []);\n  }\n}\n\nexport function createNgModuleRefWithProviders<T>(\n  moduleType: Type<T>,\n  parentInjector: Injector | null,\n  additionalProviders: StaticProvider[],\n): InternalNgModuleRef<T> {\n  return new NgModuleRef(moduleType, parentInjector, additionalProviders, false);\n}\n\nexport class EnvironmentNgModuleRefAdapter extends viewEngine_NgModuleRef<null> {\n  override readonly injector: R3Injector;\n  override readonly componentFactoryResolver: ComponentFactoryResolver =\n    new ComponentFactoryResolver(this);\n  override readonly instance = null;\n\n  constructor(config: {\n    providers: Array<Provider | EnvironmentProviders>;\n    parent: EnvironmentInjector | null;\n    debugName: string | null;\n    runEnvironmentInitializers: boolean;\n  }) {\n    super();\n    const injector = new R3Injector(\n      [\n        ...config.providers,\n        {provide: viewEngine_NgModuleRef, useValue: this},\n        {provide: viewEngine_ComponentFactoryResolver, useValue: this.componentFactoryResolver},\n      ],\n      config.parent || getNullInjector(),\n      config.debugName,\n      new Set(['environment']),\n    );\n    this.injector = injector;\n    if (config.runEnvironmentInitializers) {\n      injector.resolveInjectorInitializers();\n    }\n  }\n\n  override destroy(): void {\n    this.injector.destroy();\n  }\n\n  override onDestroy(callback: () => void): void {\n    this.injector.onDestroy(callback);\n  }\n}\n\n/**\n * Create a new environment injector.\n *\n * @param providers An array of providers.\n * @param parent A parent environment injector.\n * @param debugName An optional name for this injector instance, which will be used in error\n *     messages.\n *\n * @publicApi\n */\nexport function createEnvironmentInjector(\n  providers: Array<Provider | EnvironmentProviders>,\n  parent: EnvironmentInjector,\n  debugName: string | null = null,\n): EnvironmentInjector {\n  const adapter = new EnvironmentNgModuleRefAdapter({\n    providers,\n    parent,\n    debugName,\n    runEnvironmentInitializers: true,\n  });\n  return adapter.injector;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {ɵɵinject as inject} from '../di/injector_compatibility';\nimport {ɵɵdefineInjectable as defineInjectable} from '../di/interface/defs';\nimport {internalImportProvidersFrom} from '../di/provider_collection';\nimport {EnvironmentInjector} from '../di/r3_injector';\nimport {OnDestroy} from '../interface/lifecycle_hooks';\nimport {ComponentDef} from './interfaces/definition';\nimport {createEnvironmentInjector} from './ng_module_ref';\n\n/**\n * A service used by the framework to create instances of standalone injectors. Those injectors are\n * created on demand in case of dynamic component instantiation and contain ambient providers\n * collected from the imports graph rooted at a given standalone component.\n */\nexport class StandaloneService implements OnDestroy {\n  cachedInjectors = new Map<ComponentDef<unknown>, EnvironmentInjector | null>();\n\n  constructor(private _injector: EnvironmentInjector) {}\n\n  getOrCreateStandaloneInjector(componentDef: ComponentDef<unknown>): EnvironmentInjector | null {\n    if (!componentDef.standalone) {\n      return null;\n    }\n\n    if (!this.cachedInjectors.has(componentDef)) {\n      const providers = internalImportProvidersFrom(false, componentDef.type);\n      const standaloneInjector =\n        providers.length > 0\n          ? createEnvironmentInjector(\n              [providers],\n              this._injector,\n              `Standalone[${componentDef.type.name}]`,\n            )\n          : null;\n      this.cachedInjectors.set(componentDef, standaloneInjector);\n    }\n\n    return this.cachedInjectors.get(componentDef)!;\n  }\n\n  ngOnDestroy() {\n    try {\n      for (const injector of this.cachedInjectors.values()) {\n        if (injector !== null) {\n          injector.destroy();\n        }\n      }\n    } finally {\n      this.cachedInjectors.clear();\n    }\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ defineInjectable({\n    token: StandaloneService,\n    providedIn: 'environment',\n    factory: () => new StandaloneService(inject(EnvironmentInjector)),\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ChangeDetectionStrategy} from '../change_detection/constants';\nimport {EnvironmentInjector} from '../di/r3_injector';\nimport {formatRuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type, Writable} from '../interface/type';\nimport {NgModuleDef} from '../metadata/ng_module_def';\nimport {SchemaMetadata} from '../metadata/schema';\nimport {ViewEncapsulation} from '../metadata/view';\nimport {assertNotEqual} from '../util/assert';\nimport {noSideEffects} from '../util/closure';\nimport {EMPTY_ARRAY, EMPTY_OBJ} from '../util/empty';\nimport {initNgDevMode} from '../util/ng_dev_mode';\nimport {performanceMarkFeature} from '../util/performance';\nimport {getComponentDef, getDirectiveDef, getPipeDef} from './def_getters';\n\nimport type {\n  ComponentDef,\n  ComponentDefFeature,\n  ComponentTemplate,\n  ContentQueriesFunction,\n  DependencyTypeList,\n  DirectiveDef,\n  DirectiveDefFeature,\n  DirectiveDefListOrFactory,\n  HostBindingsFunction,\n  InputTransformFunction,\n  PipeDef,\n  PipeDefListOrFactory,\n  TypeOrFactory,\n  ViewQueriesFunction,\n} from './interfaces/definition';\nimport {InputFlags} from './interfaces/input_flags';\nimport type {TAttributes, TConstantsOrFactory} from './interfaces/node';\nimport {CssSelectorList} from './interfaces/projection';\nimport {stringifyCSSSelectorList} from './node_selector_matcher';\nimport {StandaloneService} from './standalone_service';\n\n/**\n * Map of inputs for a given directive/component.\n *\n * Given:\n * ```ts\n * class MyComponent {\n *   @Input()\n *   publicInput1: string;\n *\n *   @Input('publicInput2')\n *   declaredInput2: string;\n *\n *   @Input({transform: (value: boolean) => value ? 1 : 0})\n *   transformedInput3: number;\n *\n *   signalInput = input(3);\n * }\n * ```\n *\n * is described as:\n * ```ts\n * {\n *   publicInput1: 'publicInput1',\n *   declaredInput2: [InputFlags.None, 'declaredInput2', 'publicInput2'],\n *   transformedInput3: [\n *     InputFlags.None,\n *     'transformedInput3',\n *     'transformedInput3',\n *     (value: boolean) => value ? 1 : 0\n *   ],\n *   signalInput: [InputFlags.SignalBased, \"signalInput\"],\n * }\n * ```\n *\n * Which the minifier may translate to:\n * ```ts\n * {\n *   minifiedPublicInput1: 'publicInput1',\n *   minifiedDeclaredInput2: [InputFlags.None, 'publicInput2', 'declaredInput2'],\n *   minifiedTransformedInput3: [\n *     InputFlags.None,\n *     'transformedInput3',\n *     'transformedInput3',\n *     (value: boolean) => value ? 1 : 0\n *   ],\n *   minifiedSignalInput: [InputFlags.SignalBased, \"signalInput\"],\n * }\n * ```\n *\n * This allows the render to re-construct the minified, public, and declared names\n * of properties.\n *\n * NOTE:\n *  - Because declared and public name are usually same we only generate the array\n *    `['declared', 'public']` format when they differ, or there is a transform.\n *  - The reason why this API and `outputs` API is not the same is that `NgOnChanges` has\n *    inconsistent behavior in that it uses declared names rather than minified or public.\n */\ntype DirectiveInputs<T> = {\n  [P in keyof T]?:  // Basic case. Mapping minified name to public name.\n    | string\n    // Complex input when there are flags, or differing public name and declared name, or there\n    // is a transform. Such inputs are not as common, so the array form is only generated then.\n    | [\n        flags: InputFlags,\n        publicName: string,\n        declaredName?: string,\n        transform?: InputTransformFunction,\n      ];\n};\n\ninterface DirectiveDefinition<T> {\n  /**\n   * Directive type, needed to configure the injector.\n   */\n  type: Type<T>;\n\n  /** The selectors that will be used to match nodes to this directive. */\n  selectors?: CssSelectorList;\n\n  /**\n   * A map of input names.\n   */\n  inputs?: DirectiveInputs<T>;\n\n  /**\n   * A map of output names.\n   *\n   * The format is in: `{[actualPropertyName: string]:string}`.\n   *\n   * Which the minifier may translate to: `{[minifiedPropertyName: string]:string}`.\n   *\n   * This allows the render to re-construct the minified and non-minified names\n   * of properties.\n   */\n  outputs?: {[P in keyof T]?: string};\n\n  /**\n   * A list of optional features to apply.\n   *\n   * See: {@link NgOnChangesFeature}, {@link ProvidersFeature}, {@link InheritDefinitionFeature}\n   */\n  features?: DirectiveDefFeature[];\n\n  /**\n   * Function executed by the parent template to allow child directive to apply host bindings.\n   */\n  hostBindings?: HostBindingsFunction<T>;\n\n  /**\n   * The number of bindings in this directive `hostBindings` (including pure fn bindings).\n   *\n   * Used to calculate the length of the component's LView array, so we\n   * can pre-fill the array and set the host binding start index.\n   */\n  hostVars?: number;\n\n  /**\n   * Assign static attribute values to a host element.\n   *\n   * This property will assign static attribute values as well as class and style\n   * values to a host element. Since attribute values can consist of different types of values,\n   * the `hostAttrs` array must include the values in the following format:\n   *\n   * attrs = [\n   *   // static attributes (like `title`, `name`, `id`...)\n   *   attr1, value1, attr2, value,\n   *\n   *   // a single namespace value (like `x:id`)\n   *   NAMESPACE_MARKER, namespaceUri1, name1, value1,\n   *\n   *   // another single namespace value (like `x:name`)\n   *   NAMESPACE_MARKER, namespaceUri2, name2, value2,\n   *\n   *   // a series of CSS classes that will be applied to the element (no spaces)\n   *   CLASSES_MARKER, class1, class2, class3,\n   *\n   *   // a series of CSS styles (property + value) that will be applied to the element\n   *   STYLES_MARKER, prop1, value1, prop2, value2\n   * ]\n   *\n   * All non-class and non-style attributes must be defined at the start of the list\n   * first before all class and style values are set. When there is a change in value\n   * type (like when classes and styles are introduced) a marker must be used to separate\n   * the entries. The marker values themselves are set via entries found in the\n   * [AttributeMarker] enum.\n   */\n  hostAttrs?: TAttributes;\n\n  /**\n   * Function to create instances of content queries associated with a given directive.\n   */\n  contentQueries?: ContentQueriesFunction<T>;\n\n  /**\n   * Additional set of instructions specific to view query processing. This could be seen as a\n   * set of instructions to be inserted into the template function.\n   */\n  viewQuery?: ViewQueriesFunction<T> | null;\n\n  /**\n   * Defines the name that can be used in the template to assign this directive to a variable.\n   *\n   * See: {@link Directive.exportAs}\n   */\n  exportAs?: string[];\n\n  /**\n   * Whether this directive/component is standalone.\n   */\n  standalone?: boolean;\n\n  /**\n   * Whether this directive/component is signal-based.\n   */\n  signals?: boolean;\n}\n\ninterface ComponentDefinition<T> extends Omit<DirectiveDefinition<T>, 'features'> {\n  /**\n   * The number of nodes, local refs, and pipes in this component template.\n   *\n   * Used to calculate the length of this component's LView array, so we\n   * can pre-fill the array and set the binding start index.\n   */\n  decls: number;\n\n  /**\n   * The number of bindings in this component template (including pure fn bindings).\n   *\n   * Used to calculate the length of this component's LView array, so we\n   * can pre-fill the array and set the host binding start index.\n   */\n  vars: number;\n\n  /**\n   * Template function use for rendering DOM.\n   *\n   * This function has following structure.\n   *\n   * ```ts\n   * function Template<T>(ctx:T, creationMode: boolean) {\n   *   if (creationMode) {\n   *     // Contains creation mode instructions.\n   *   }\n   *   // Contains binding update instructions\n   * }\n   * ```\n   *\n   * Common instructions are:\n   * Creation mode instructions:\n   *  - `elementStart`, `elementEnd`\n   *  - `text`\n   *  - `container`\n   *  - `listener`\n   *\n   * Binding update instructions:\n   * - `bind`\n   * - `elementAttribute`\n   * - `elementProperty`\n   * - `elementClass`\n   * - `elementStyle`\n   *\n   */\n  template: ComponentTemplate<T>;\n\n  /**\n   * Constants for the nodes in the component's view.\n   * Includes attribute arrays, local definition arrays etc.\n   */\n  consts?: TConstantsOrFactory;\n\n  /**\n   * An array of `ngContent[selector]` values that were found in the template.\n   */\n  ngContentSelectors?: string[];\n  /**\n   * A list of optional features to apply.\n   *\n   * See: {@link NgOnChangesFeature}, {@link ProvidersFeature}\n   */\n  features?: ComponentDefFeature[];\n\n  /**\n   * Defines template and style encapsulation options available for Component's {@link /api/core/Component Component}.\n   */\n  encapsulation?: ViewEncapsulation;\n\n  /**\n   * Defines arbitrary developer-defined data to be stored on a renderer instance.\n   * This is useful for renderers that delegate to other renderers.\n   *\n   * see: animation\n   */\n  data?: {[kind: string]: any};\n\n  /**\n   * A set of styles that the component needs to be present for component to render correctly.\n   */\n  styles?: string[];\n\n  /**\n   * The strategy that the default change detector uses to detect changes.\n   * When set, takes effect the next time change detection is triggered.\n   */\n  changeDetection?: ChangeDetectionStrategy;\n\n  /**\n   * Registry of directives, components, and pipes that may be found in this component's view.\n   *\n   * This property is either an array of types or a function that returns the array of types. This\n   * function may be necessary to support forward declarations.\n   */\n  dependencies?: TypeOrFactory<DependencyTypeList>;\n\n  /**\n   * The set of schemas that declare elements to be allowed in the component's template.\n   */\n  schemas?: SchemaMetadata[] | null;\n}\n\n/**\n * Create a component definition object.\n *\n *\n * # Example\n * ```ts\n * class MyComponent {\n *   // Generated by Angular Template Compiler\n *   // [Symbol] syntax will not be supported by TypeScript until v2.7\n *   static ɵcmp = defineComponent({\n *     ...\n *   });\n * }\n * ```\n * @codeGenApi\n */\nexport function ɵɵdefineComponent<T>(\n  componentDefinition: ComponentDefinition<T>,\n): ComponentDef<any> {\n  return noSideEffects(() => {\n    // Initialize ngDevMode. This must be the first statement in ɵɵdefineComponent.\n    // See the `initNgDevMode` docstring for more information.\n    (typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode();\n\n    const baseDef = getNgDirectiveDef(componentDefinition as DirectiveDefinition<T>);\n    const def: Writable<ComponentDef<T>> = {\n      ...baseDef,\n      decls: componentDefinition.decls,\n      vars: componentDefinition.vars,\n      template: componentDefinition.template,\n      consts: componentDefinition.consts || null,\n      ngContentSelectors: componentDefinition.ngContentSelectors,\n      onPush: componentDefinition.changeDetection === ChangeDetectionStrategy.OnPush,\n      directiveDefs: null!, // assigned in noSideEffects\n      pipeDefs: null!, // assigned in noSideEffects\n      dependencies: (baseDef.standalone && componentDefinition.dependencies) || null,\n      getStandaloneInjector: baseDef.standalone\n        ? (parentInjector: EnvironmentInjector) => {\n            return parentInjector.get(StandaloneService).getOrCreateStandaloneInjector(def);\n          }\n        : null,\n      getExternalStyles: null,\n      signals: componentDefinition.signals ?? false,\n      data: componentDefinition.data || {},\n      encapsulation: componentDefinition.encapsulation || ViewEncapsulation.Emulated,\n      styles: componentDefinition.styles || EMPTY_ARRAY,\n      _: null,\n      schemas: componentDefinition.schemas || null,\n      tView: null,\n      id: '',\n    };\n\n    // TODO: Do we still need/want this ?\n    if (baseDef.standalone) {\n      performanceMarkFeature('NgStandalone');\n    }\n\n    initFeatures(def);\n    const dependencies = componentDefinition.dependencies;\n    def.directiveDefs = extractDefListOrFactory(dependencies, /* pipeDef */ false);\n    def.pipeDefs = extractDefListOrFactory(dependencies, /* pipeDef */ true);\n    def.id = getComponentId(def);\n\n    return def;\n  });\n}\n\nexport function extractDirectiveDef(type: Type<any>): DirectiveDef<any> | ComponentDef<any> | null {\n  return getComponentDef(type) || getDirectiveDef(type);\n}\n\nfunction nonNull<T>(value: T | null): value is T {\n  return value !== null;\n}\n\n/**\n * @codeGenApi\n */\nexport function ɵɵdefineNgModule<T>(def: {\n  /** Token representing the module. Used by DI. */\n  type: T;\n\n  /** List of components to bootstrap. */\n  bootstrap?: Type<any>[] | (() => Type<any>[]);\n\n  /** List of components, directives, and pipes declared by this module. */\n  declarations?: Type<any>[] | (() => Type<any>[]);\n\n  /** List of modules or `ModuleWithProviders` imported by this module. */\n  imports?: Type<any>[] | (() => Type<any>[]);\n\n  /**\n   * List of modules, `ModuleWithProviders`, components, directives, or pipes exported by this\n   * module.\n   */\n  exports?: Type<any>[] | (() => Type<any>[]);\n\n  /** The set of schemas that declare elements to be allowed in the NgModule. */\n  schemas?: SchemaMetadata[] | null;\n\n  /** Unique ID for the module that is used with `getModuleFactory`. */\n  id?: string | null;\n}): unknown {\n  return noSideEffects(() => {\n    const res: NgModuleDef<T> = {\n      type: def.type,\n      bootstrap: def.bootstrap || EMPTY_ARRAY,\n      declarations: def.declarations || EMPTY_ARRAY,\n      imports: def.imports || EMPTY_ARRAY,\n      exports: def.exports || EMPTY_ARRAY,\n      transitiveCompileScopes: null,\n      schemas: def.schemas || null,\n      id: def.id || null,\n    };\n    return res;\n  });\n}\n\n/**\n * Converts binding objects from the `DirectiveDefinition` into more efficient\n * lookup dictionaries that are optimized for the framework runtime.\n *\n * This function converts inputs or output directive information into new objects\n * where the public name conveniently maps to the minified internal field name.\n *\n * For inputs, the input flags are additionally persisted into the new data structure,\n * so that those can be quickly retrieved when needed.\n *\n * e.g. for\n *\n * ```ts\n * class Comp {\n *   @Input()\n *   propName1: string;\n *\n *   @Input('publicName2')\n *   declaredPropName2: number;\n *\n *   inputSignal = input(3);\n * }\n * ```\n *\n * will be serialized as\n *\n * ```ts\n * {\n *   propName1: 'propName1',\n *   declaredPropName2: ['publicName2', 'declaredPropName2'],\n *   inputSignal: [InputFlags.SignalBased, 'inputSignal'],\n * }\n * ```\n *\n * which is than translated by the minifier as:\n *\n * ```ts\n * {\n *   minifiedPropName1: 'propName1',\n *   minifiedPropName2: ['publicName2', 'declaredPropName2'],\n *   minifiedInputSignal: [InputFlags.SignalBased, 'inputSignal'],\n * }\n * ```\n *\n * becomes: (public name => minifiedName + isSignal if needed)\n *\n * ```ts\n * {\n *  'propName1': 'minifiedPropName1',\n *  'publicName2': 'minifiedPropName2',\n *  'inputSignal': ['minifiedInputSignal', InputFlags.SignalBased],\n * }\n * ```\n *\n * Optionally the function can take `declaredInputs` which will result\n * in: (public name => declared name)\n *\n * ```ts\n * {\n *  'propName1': 'propName1',\n *  'publicName2': 'declaredPropName2',\n *  'inputSignal': 'inputSignal',\n * }\n * ```\n *\n\n */\nfunction parseAndConvertInputsForDefinition<T>(\n  obj: DirectiveDefinition<T>['inputs'],\n  declaredInputs: Record<string, string>,\n) {\n  if (obj == null) return EMPTY_OBJ as any;\n  const newLookup: Record<\n    string,\n    [minifiedName: string, flags: InputFlags, transform: InputTransformFunction | null]\n  > = {};\n  for (const minifiedKey in obj) {\n    if (obj.hasOwnProperty(minifiedKey)) {\n      const value = obj[minifiedKey]!;\n      let publicName: string;\n      let declaredName: string;\n      let inputFlags: InputFlags;\n      let transform: InputTransformFunction | null;\n\n      if (Array.isArray(value)) {\n        inputFlags = value[0];\n        publicName = value[1];\n        declaredName = value[2] ?? publicName; // declared name might not be set to save bytes.\n        transform = value[3] || null;\n      } else {\n        publicName = value;\n        declaredName = value;\n        inputFlags = InputFlags.None;\n        transform = null;\n      }\n\n      newLookup[publicName] = [minifiedKey, inputFlags, transform];\n      declaredInputs[publicName] = declaredName as string;\n    }\n  }\n  return newLookup;\n}\n\nfunction parseAndConvertOutputsForDefinition<T>(\n  obj: DirectiveDefinition<T>['outputs'],\n): Record<keyof T, string> {\n  if (obj == null) return EMPTY_OBJ as any;\n  const newLookup: any = {};\n  for (const minifiedKey in obj) {\n    if (obj.hasOwnProperty(minifiedKey)) {\n      newLookup[obj[minifiedKey]!] = minifiedKey;\n    }\n  }\n  return newLookup;\n}\n\n/**\n * Create a directive definition object.\n *\n * # Example\n * ```ts\n * class MyDirective {\n *   // Generated by Angular Template Compiler\n *   // [Symbol] syntax will not be supported by TypeScript until v2.7\n *   static ɵdir = ɵɵdefineDirective({\n *     ...\n *   });\n * }\n * ```\n *\n * @codeGenApi\n */\nexport function ɵɵdefineDirective<T>(\n  directiveDefinition: DirectiveDefinition<T>,\n): DirectiveDef<any> {\n  return noSideEffects(() => {\n    const def = getNgDirectiveDef(directiveDefinition);\n    initFeatures(def);\n\n    return def;\n  });\n}\n\n/**\n * Create a pipe definition object.\n *\n * # Example\n * ```ts\n * class MyPipe implements PipeTransform {\n *   // Generated by Angular Template Compiler\n *   static ɵpipe = definePipe({\n *     ...\n *   });\n * }\n * ```\n * @param pipeDef Pipe definition generated by the compiler\n *\n * @codeGenApi\n */\nexport function ɵɵdefinePipe<T>(pipeDef: {\n  /** Name of the pipe. Used for matching pipes in template to pipe defs. */\n  name: string;\n\n  /** Pipe class reference. Needed to extract pipe lifecycle hooks. */\n  type: Type<T>;\n\n  /** Whether the pipe is pure. */\n  pure?: boolean;\n\n  /**\n   * Whether the pipe is standalone.\n   */\n  standalone?: boolean;\n}): unknown {\n  return <PipeDef<T>>{\n    type: pipeDef.type,\n    name: pipeDef.name,\n    factory: null,\n    pure: pipeDef.pure !== false,\n    standalone: pipeDef.standalone ?? true,\n    onDestroy: pipeDef.type.prototype.ngOnDestroy || null,\n  };\n}\n\nfunction getNgDirectiveDef<T>(directiveDefinition: DirectiveDefinition<T>): DirectiveDef<T> {\n  const declaredInputs: Record<string, string> = {};\n\n  return {\n    type: directiveDefinition.type,\n    providersResolver: null,\n    factory: null,\n    hostBindings: directiveDefinition.hostBindings || null,\n    hostVars: directiveDefinition.hostVars || 0,\n    hostAttrs: directiveDefinition.hostAttrs || null,\n    contentQueries: directiveDefinition.contentQueries || null,\n    declaredInputs: declaredInputs,\n    inputConfig: directiveDefinition.inputs || EMPTY_OBJ,\n    exportAs: directiveDefinition.exportAs || null,\n    standalone: directiveDefinition.standalone ?? true,\n    signals: directiveDefinition.signals === true,\n    selectors: directiveDefinition.selectors || EMPTY_ARRAY,\n    viewQuery: directiveDefinition.viewQuery || null,\n    features: directiveDefinition.features || null,\n    setInput: null,\n    findHostDirectiveDefs: null,\n    hostDirectives: null,\n    inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs),\n    outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs),\n    debugInfo: null,\n  };\n}\n\nfunction initFeatures<T>(definition: DirectiveDef<T> | ComponentDef<T>): void {\n  definition.features?.forEach((fn) => fn(definition));\n}\n\nexport function extractDefListOrFactory(\n  dependencies: TypeOrFactory<DependencyTypeList> | undefined,\n  pipeDef: false,\n): DirectiveDefListOrFactory | null;\nexport function extractDefListOrFactory(\n  dependencies: TypeOrFactory<DependencyTypeList> | undefined,\n  pipeDef: true,\n): PipeDefListOrFactory | null;\nexport function extractDefListOrFactory(\n  dependencies: TypeOrFactory<DependencyTypeList> | undefined,\n  pipeDef: boolean,\n): unknown {\n  if (!dependencies) {\n    return null;\n  }\n\n  const defExtractor = pipeDef ? getPipeDef : extractDirectiveDef;\n\n  return () =>\n    (typeof dependencies === 'function' ? dependencies() : dependencies)\n      .map((dep) => defExtractor(dep))\n      .filter(nonNull);\n}\n\n/**\n * A map that contains the generated component IDs and type.\n */\nexport const GENERATED_COMP_IDS = new Map<string, Type<unknown>>();\n\n/**\n * A method can returns a component ID from the component definition using a variant of DJB2 hash\n * algorithm.\n */\nfunction getComponentId<T>(componentDef: ComponentDef<T>): string {\n  let hash = 0;\n\n  // For components with i18n in templates, the `consts` array is generated by the compiler\n  // as a function. If client and server bundles were produced with different minification\n  // configurations, the serializable contents of the function body would be different on\n  // the client and on the server. This might result in different ids generated. To avoid this\n  // issue, we do not take the `consts` contents into account if it's a function.\n  // See https://github.com/angular/angular/issues/58713.\n  const componentDefConsts = typeof componentDef.consts === 'function' ? '' : componentDef.consts;\n\n  // We cannot rely solely on the component selector as the same selector can be used in different\n  // modules.\n  //\n  // `componentDef.style` is not used, due to it causing inconsistencies. Ex: when server\n  // component styles has no sourcemaps and browsers do.\n  //\n  // Example:\n  // https://github.com/angular/components/blob/d9f82c8f95309e77a6d82fd574c65871e91354c2/src/material/core/option/option.ts#L248\n  // https://github.com/angular/components/blob/285f46dc2b4c5b127d356cb7c4714b221f03ce50/src/material/legacy-core/option/option.ts#L32\n  const hashSelectors = [\n    componentDef.selectors,\n    componentDef.ngContentSelectors,\n    componentDef.hostVars,\n    componentDef.hostAttrs,\n    componentDefConsts,\n    componentDef.vars,\n    componentDef.decls,\n    componentDef.encapsulation,\n    componentDef.standalone,\n    componentDef.signals,\n    componentDef.exportAs,\n    JSON.stringify(componentDef.inputs),\n    JSON.stringify(componentDef.outputs),\n    // We cannot use 'componentDef.type.name' as the name of the symbol will change and will not\n    // match in the server and browser bundles.\n    Object.getOwnPropertyNames(componentDef.type.prototype),\n    !!componentDef.contentQueries,\n    !!componentDef.viewQuery,\n  ];\n\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    // If client and server bundles were produced with different minification configurations,\n    // the serializable contents of the function body would be different on the client and on\n    // the server. Ensure that we do not accidentally use functions in component id computation.\n    for (const item of hashSelectors) {\n      assertNotEqual(\n        typeof item,\n        'function',\n        'Internal error: attempting to use a function in component id computation logic.',\n      );\n    }\n  }\n\n  for (const char of hashSelectors.join('|')) {\n    hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;\n  }\n\n  // Force positive number hash.\n  // 2147483647 = equivalent of Integer.MAX_VALUE.\n  hash += 2147483647 + 1;\n\n  const compId = 'c' + hash;\n\n  if (\n    (typeof ngDevMode === 'undefined' || ngDevMode) &&\n    // Skip the check on the server since we can't guarantee the same component instance between\n    // requests. Note that we can't use DI to check if we're on the server, because the component\n    // hasn't been instantiated yet.\n    (typeof ngServerMode === 'undefined' || !ngServerMode)\n  ) {\n    if (GENERATED_COMP_IDS.has(compId)) {\n      const previousCompDefType = GENERATED_COMP_IDS.get(compId)!;\n      if (previousCompDefType !== componentDef.type) {\n        console.warn(\n          formatRuntimeError(\n            RuntimeErrorCode.COMPONENT_ID_COLLISION,\n            `Component ID generation collision detected. Components '${\n              previousCompDefType.name\n            }' and '${componentDef.type.name}' with selector '${stringifyCSSSelectorList(\n              componentDef.selectors,\n            )}' generated the same component ID. To fix this, you can change the selector of one of those components or add an extra host attribute to force a different ID.`,\n          ),\n        );\n      }\n    } else {\n      GENERATED_COMP_IDS.set(compId, componentDef.type);\n    }\n  }\n\n  return compId;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {Type, Writable} from '../../interface/type';\nimport {EMPTY_ARRAY, EMPTY_OBJ} from '../../util/empty';\nimport {fillProperties} from '../../util/property';\nimport {\n  ComponentDef,\n  ContentQueriesFunction,\n  DirectiveDef,\n  DirectiveDefFeature,\n  HostBindingsFunction,\n  RenderFlags,\n  ViewQueriesFunction,\n} from '../interfaces/definition';\nimport {TAttributes} from '../interfaces/node';\nimport {isComponentDef} from '../interfaces/type_checks';\nimport {mergeHostAttrs} from '../util/attrs_utils';\nimport {stringifyForError} from '../util/stringify_utils';\n\nexport function getSuperType(\n  type: Type<any>,\n): Type<any> & {ɵcmp?: ComponentDef<any>; ɵdir?: DirectiveDef<any>} {\n  return Object.getPrototypeOf(type.prototype).constructor;\n}\n\ntype WritableDef = Writable<DirectiveDef<any> | ComponentDef<any>>;\n\n/**\n * Merges the definition from a super class to a sub class.\n * @param definition The definition that is a SubClass of another directive of component\n *\n * @codeGenApi\n */\nexport function ɵɵInheritDefinitionFeature(\n  definition: DirectiveDef<any> | ComponentDef<any>,\n): void {\n  let superType = getSuperType(definition.type);\n  let shouldInheritFields = true;\n  const inheritanceChain: WritableDef[] = [definition];\n\n  while (superType) {\n    let superDef: DirectiveDef<any> | ComponentDef<any> | undefined = undefined;\n    if (isComponentDef(definition)) {\n      // Don't use getComponentDef/getDirectiveDef. This logic relies on inheritance.\n      superDef = superType.ɵcmp || superType.ɵdir;\n    } else {\n      if (superType.ɵcmp) {\n        throw new RuntimeError(\n          RuntimeErrorCode.INVALID_INHERITANCE,\n          ngDevMode &&\n            `Directives cannot inherit Components. Directive ${stringifyForError(\n              definition.type,\n            )} is attempting to extend component ${stringifyForError(superType)}`,\n        );\n      }\n      // Don't use getComponentDef/getDirectiveDef. This logic relies on inheritance.\n      superDef = superType.ɵdir;\n    }\n\n    if (superDef) {\n      if (shouldInheritFields) {\n        inheritanceChain.push(superDef);\n        // Some fields in the definition may be empty, if there were no values to put in them that\n        // would've justified object creation. Unwrap them if necessary.\n        const writeableDef = definition as WritableDef;\n        writeableDef.inputs = maybeUnwrapEmpty(definition.inputs);\n        writeableDef.declaredInputs = maybeUnwrapEmpty(definition.declaredInputs);\n        writeableDef.outputs = maybeUnwrapEmpty(definition.outputs);\n\n        // Merge hostBindings\n        const superHostBindings = superDef.hostBindings;\n        superHostBindings && inheritHostBindings(definition, superHostBindings);\n\n        // Merge queries\n        const superViewQuery = superDef.viewQuery;\n        const superContentQueries = superDef.contentQueries;\n        superViewQuery && inheritViewQuery(definition, superViewQuery);\n        superContentQueries && inheritContentQueries(definition, superContentQueries);\n\n        // Merge inputs and outputs\n        mergeInputsWithTransforms(definition, superDef);\n        fillProperties(definition.outputs, superDef.outputs);\n\n        // Merge animations metadata.\n        // If `superDef` is a Component, the `data` field is present (defaults to an empty object).\n        if (isComponentDef(superDef) && superDef.data.animation) {\n          // If super def is a Component, the `definition` is also a Component, since Directives can\n          // not inherit Components (we throw an error above and cannot reach this code).\n          const defData = (definition as ComponentDef<any>).data;\n          defData.animation = (defData.animation || []).concat(superDef.data.animation);\n        }\n      }\n\n      // Run parent features\n      const features = superDef.features;\n      if (features) {\n        for (let i = 0; i < features.length; i++) {\n          const feature = features[i];\n          if (feature && feature.ngInherit) {\n            (feature as DirectiveDefFeature)(definition);\n          }\n          // If `InheritDefinitionFeature` is a part of the current `superDef`, it means that this\n          // def already has all the necessary information inherited from its super class(es), so we\n          // can stop merging fields from super classes. However we need to iterate through the\n          // prototype chain to look for classes that might contain other \"features\" (like\n          // NgOnChanges), which we should invoke for the original `definition`. We set the\n          // `shouldInheritFields` flag to indicate that, essentially skipping fields inheritance\n          // logic and only invoking functions from the \"features\" list.\n          if (feature === ɵɵInheritDefinitionFeature) {\n            shouldInheritFields = false;\n          }\n        }\n      }\n    }\n\n    superType = Object.getPrototypeOf(superType);\n  }\n  mergeHostAttrsAcrossInheritance(inheritanceChain);\n}\n\nfunction mergeInputsWithTransforms<T>(target: WritableDef, source: DirectiveDef<any>) {\n  for (const key in source.inputs) {\n    if (!source.inputs.hasOwnProperty(key)) {\n      continue;\n    }\n    if (target.inputs.hasOwnProperty(key)) {\n      continue;\n    }\n\n    const value = source.inputs[key];\n\n    if (value !== undefined) {\n      target.inputs[key] = value;\n      target.declaredInputs[key] = source.declaredInputs[key];\n    }\n  }\n}\n\n/**\n * Merge the `hostAttrs` and `hostVars` from the inherited parent to the base class.\n *\n * @param inheritanceChain A list of `WritableDefs` starting at the top most type and listing\n * sub-types in order. For each type take the `hostAttrs` and `hostVars` and merge it with the child\n * type.\n */\nfunction mergeHostAttrsAcrossInheritance(inheritanceChain: WritableDef[]) {\n  let hostVars: number = 0;\n  let hostAttrs: TAttributes | null = null;\n  // We process the inheritance order from the base to the leaves here.\n  for (let i = inheritanceChain.length - 1; i >= 0; i--) {\n    const def = inheritanceChain[i];\n    // For each `hostVars`, we need to add the superclass amount.\n    def.hostVars = hostVars += def.hostVars;\n    // for each `hostAttrs` we need to merge it with superclass.\n    def.hostAttrs = mergeHostAttrs(\n      def.hostAttrs,\n      (hostAttrs = mergeHostAttrs(hostAttrs, def.hostAttrs)),\n    );\n  }\n}\n\nfunction maybeUnwrapEmpty<T>(value: T[]): T[];\nfunction maybeUnwrapEmpty<T>(value: T): T;\nfunction maybeUnwrapEmpty(value: any): any {\n  if (value === EMPTY_OBJ) {\n    return {};\n  } else if (value === EMPTY_ARRAY) {\n    return [];\n  } else {\n    return value;\n  }\n}\n\nfunction inheritViewQuery(definition: WritableDef, superViewQuery: ViewQueriesFunction<any>) {\n  const prevViewQuery = definition.viewQuery;\n  if (prevViewQuery) {\n    definition.viewQuery = (rf, ctx) => {\n      superViewQuery(rf, ctx);\n      prevViewQuery(rf, ctx);\n    };\n  } else {\n    definition.viewQuery = superViewQuery;\n  }\n}\n\nfunction inheritContentQueries(\n  definition: WritableDef,\n  superContentQueries: ContentQueriesFunction<any>,\n) {\n  const prevContentQueries = definition.contentQueries;\n  if (prevContentQueries) {\n    definition.contentQueries = (rf, ctx, directiveIndex) => {\n      superContentQueries(rf, ctx, directiveIndex);\n      prevContentQueries(rf, ctx, directiveIndex);\n    };\n  } else {\n    definition.contentQueries = superContentQueries;\n  }\n}\n\nfunction inheritHostBindings(\n  definition: WritableDef,\n  superHostBindings: HostBindingsFunction<any>,\n) {\n  const prevHostBindings = definition.hostBindings;\n  if (prevHostBindings) {\n    definition.hostBindings = (rf: RenderFlags, ctx: any) => {\n      superHostBindings(rf, ctx);\n      prevHostBindings(rf, ctx);\n    };\n  } else {\n    definition.hostBindings = superHostBindings;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ComponentDef, DirectiveDef} from '../interfaces/definition';\nimport {isComponentDef} from '../interfaces/type_checks';\n\nimport {getSuperType} from './inherit_definition_feature';\n\n/**\n * Fields which exist on either directive or component definitions, and need to be copied from\n * parent to child classes by the `ɵɵCopyDefinitionFeature`.\n */\nconst COPY_DIRECTIVE_FIELDS: (keyof DirectiveDef<unknown>)[] = [\n  // The child class should use the providers of its parent.\n  'providersResolver',\n\n  // Not listed here are any fields which are handled by the `ɵɵInheritDefinitionFeature`, such\n  // as inputs, outputs, and host binding functions.\n];\n\n/**\n * Fields which exist only on component definitions, and need to be copied from parent to child\n * classes by the `ɵɵCopyDefinitionFeature`.\n *\n * The type here allows any field of `ComponentDef` which is not also a property of `DirectiveDef`,\n * since those should go in `COPY_DIRECTIVE_FIELDS` above.\n */\nconst COPY_COMPONENT_FIELDS: Exclude<keyof ComponentDef<unknown>, keyof DirectiveDef<unknown>>[] = [\n  // The child class should use the template function of its parent, including all template\n  // semantics.\n  'template',\n  'decls',\n  'consts',\n  'vars',\n  'onPush',\n  'ngContentSelectors',\n\n  // The child class should use the CSS styles of its parent, including all styling semantics.\n  'styles',\n  'encapsulation',\n\n  // The child class should be checked by the runtime in the same way as its parent.\n  'schemas',\n];\n\n/**\n * Copies the fields not handled by the `ɵɵInheritDefinitionFeature` from the supertype of a\n * definition.\n *\n * This exists primarily to support ngcc migration of an existing View Engine pattern, where an\n * entire decorator is inherited from a parent to a child class. When ngcc detects this case, it\n * generates a skeleton definition on the child class, and applies this feature.\n *\n * The `ɵɵCopyDefinitionFeature` then copies any needed fields from the parent class' definition,\n * including things like the component template function.\n *\n * @param definition The definition of a child class which inherits from a parent class with its\n * own definition.\n *\n * @codeGenApi\n */\nexport function ɵɵCopyDefinitionFeature(definition: DirectiveDef<any> | ComponentDef<any>): void {\n  let superType = getSuperType(definition.type)!;\n\n  let superDef: DirectiveDef<any> | ComponentDef<any> | undefined = undefined;\n  if (isComponentDef(definition)) {\n    // Don't use getComponentDef/getDirectiveDef. This logic relies on inheritance.\n    superDef = superType.ɵcmp!;\n  } else {\n    // Don't use getComponentDef/getDirectiveDef. This logic relies on inheritance.\n    superDef = superType.ɵdir!;\n  }\n\n  // Needed because `definition` fields are readonly.\n  const defAny = definition as any;\n\n  // Copy over any fields that apply to either directives or components.\n  for (const field of COPY_DIRECTIVE_FIELDS) {\n    defAny[field] = superDef[field];\n  }\n\n  if (isComponentDef(superDef)) {\n    // Copy over any component-specific fields.\n    for (const field of COPY_COMPONENT_FIELDS) {\n      defAny[field] = superDef[field];\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {resolveForwardRef} from '../../di';\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {assertEqual} from '../../util/assert';\nimport {EMPTY_OBJ} from '../../util/empty';\nimport {getComponentDef, getDirectiveDef} from '../def_getters';\nimport type {\n  DirectiveDef,\n  DirectiveDefFeature,\n  HostDirectiveBindingMap,\n  HostDirectiveConfig,\n  HostDirectiveDef,\n  HostDirectiveDefs,\n} from '../interfaces/definition';\n\n/**\n * This feature adds the host directives behavior to a directive definition by patching a\n * function onto it. The expectation is that the runtime will invoke the function during\n * directive matching.\n *\n * For example:\n * ```ts\n * class ComponentWithHostDirective {\n *   static ɵcmp = defineComponent({\n *    type: ComponentWithHostDirective,\n *    features: [ɵɵHostDirectivesFeature([\n *      SimpleHostDirective,\n *      {directive: AdvancedHostDirective, inputs: ['foo: alias'], outputs: ['bar']},\n *    ])]\n *  });\n * }\n * ```\n *\n * @codeGenApi\n */\nexport function ɵɵHostDirectivesFeature(\n  rawHostDirectives: HostDirectiveConfig[] | (() => HostDirectiveConfig[]),\n) {\n  const feature: DirectiveDefFeature = (definition: DirectiveDef<unknown>) => {\n    const isEager = Array.isArray(rawHostDirectives);\n\n    if (definition.hostDirectives === null) {\n      definition.findHostDirectiveDefs = findHostDirectiveDefs;\n      definition.hostDirectives = isEager\n        ? rawHostDirectives.map(createHostDirectiveDef)\n        : [rawHostDirectives];\n    } else if (isEager) {\n      definition.hostDirectives.unshift(...rawHostDirectives.map(createHostDirectiveDef));\n    } else {\n      definition.hostDirectives.unshift(rawHostDirectives);\n    }\n  };\n  feature.ngInherit = true;\n  return feature;\n}\n\nfunction findHostDirectiveDefs(\n  currentDef: DirectiveDef<unknown>,\n  matchedDefs: DirectiveDef<unknown>[],\n  hostDirectiveDefs: HostDirectiveDefs,\n): void {\n  if (currentDef.hostDirectives !== null) {\n    for (const configOrFn of currentDef.hostDirectives) {\n      if (typeof configOrFn === 'function') {\n        const resolved = configOrFn();\n        for (const config of resolved) {\n          trackHostDirectiveDef(createHostDirectiveDef(config), matchedDefs, hostDirectiveDefs);\n        }\n      } else {\n        trackHostDirectiveDef(configOrFn, matchedDefs, hostDirectiveDefs);\n      }\n    }\n  }\n}\n\n/** Tracks a single host directive during directive matching. */\nfunction trackHostDirectiveDef(\n  def: HostDirectiveDef,\n  matchedDefs: DirectiveDef<unknown>[],\n  hostDirectiveDefs: HostDirectiveDefs,\n) {\n  const hostDirectiveDef = getDirectiveDef(def.directive)!;\n\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    validateHostDirective(def, hostDirectiveDef);\n  }\n\n  // We need to patch the `declaredInputs` so that\n  // `ngOnChanges` can map the properties correctly.\n  patchDeclaredInputs(hostDirectiveDef.declaredInputs, def.inputs);\n\n  // Host directives execute before the host so that its host bindings can be overwritten.\n  findHostDirectiveDefs(hostDirectiveDef, matchedDefs, hostDirectiveDefs);\n  hostDirectiveDefs.set(hostDirectiveDef, def);\n  matchedDefs.push(hostDirectiveDef);\n}\n\n/** Creates a `HostDirectiveDef` from a used-defined host directive configuration. */\nfunction createHostDirectiveDef(config: HostDirectiveConfig): HostDirectiveDef {\n  return typeof config === 'function'\n    ? {directive: resolveForwardRef(config), inputs: EMPTY_OBJ, outputs: EMPTY_OBJ}\n    : {\n        directive: resolveForwardRef(config.directive),\n        inputs: bindingArrayToMap(config.inputs),\n        outputs: bindingArrayToMap(config.outputs),\n      };\n}\n\n/**\n * Converts an array in the form of `['publicName', 'alias', 'otherPublicName', 'otherAlias']` into\n * a map in the form of `{publicName: 'alias', otherPublicName: 'otherAlias'}`.\n */\nfunction bindingArrayToMap(bindings: string[] | undefined): HostDirectiveBindingMap {\n  if (bindings === undefined || bindings.length === 0) {\n    return EMPTY_OBJ;\n  }\n\n  const result: HostDirectiveBindingMap = {};\n\n  for (let i = 0; i < bindings.length; i += 2) {\n    result[bindings[i]] = bindings[i + 1];\n  }\n\n  return result;\n}\n\n/**\n * `ngOnChanges` has some leftover legacy ViewEngine behavior where the keys inside the\n * `SimpleChanges` event refer to the *declared* name of the input, not its public name or its\n * minified name. E.g. in `@Input('alias') foo: string`, the name in the `SimpleChanges` object\n * will always be `foo`, and not `alias` or the minified name of `foo` in apps using property\n * minification.\n *\n * This is achieved through the `DirectiveDef.declaredInputs` map that is constructed when the\n * definition is declared. When a property is written to the directive instance, the\n * `NgOnChangesFeature` will try to remap the property name being written to using the\n * `declaredInputs`.\n *\n * Since the host directive input remapping happens during directive matching, `declaredInputs`\n * won't contain the new alias that the input is available under. This function addresses the\n * issue by patching the host directive aliases to the `declaredInputs`. There is *not* a risk of\n * this patching accidentally introducing new inputs to the host directive, because `declaredInputs`\n * is used *only* by the `NgOnChangesFeature` when determining what name is used in the\n * `SimpleChanges` object which won't be reached if an input doesn't exist.\n */\nfunction patchDeclaredInputs(\n  declaredInputs: Record<string, string>,\n  exposedInputs: HostDirectiveBindingMap,\n): void {\n  for (const publicName in exposedInputs) {\n    if (exposedInputs.hasOwnProperty(publicName)) {\n      const remappedPublicName = exposedInputs[publicName];\n      const privateName = declaredInputs[publicName];\n\n      // We *technically* shouldn't be able to hit this case because we can't have multiple\n      // inputs on the same property and we have validations against conflicting aliases in\n      // `validateMappings`. If we somehow did, it would lead to `ngOnChanges` being invoked\n      // with the wrong name so we have a non-user-friendly assertion here just in case.\n      if (\n        (typeof ngDevMode === 'undefined' || ngDevMode) &&\n        declaredInputs.hasOwnProperty(remappedPublicName)\n      ) {\n        assertEqual(\n          declaredInputs[remappedPublicName],\n          declaredInputs[publicName],\n          `Conflicting host directive input alias ${publicName}.`,\n        );\n      }\n\n      declaredInputs[remappedPublicName] = privateName;\n    }\n  }\n}\n\n/**\n * Verifies that the host directive has been configured correctly.\n * @param hostDirectiveConfig Host directive configuration object.\n * @param directiveDef Directive definition of the host directive.\n */\nfunction validateHostDirective(\n  hostDirectiveConfig: HostDirectiveDef<unknown>,\n  directiveDef: DirectiveDef<any> | null,\n): asserts directiveDef is DirectiveDef<unknown> {\n  const type = hostDirectiveConfig.directive;\n\n  if (directiveDef === null) {\n    if (getComponentDef(type) !== null) {\n      throw new RuntimeError(\n        RuntimeErrorCode.HOST_DIRECTIVE_COMPONENT,\n        `Host directive ${type.name} cannot be a component.`,\n      );\n    }\n\n    throw new RuntimeError(\n      RuntimeErrorCode.HOST_DIRECTIVE_UNRESOLVABLE,\n      `Could not resolve metadata for host directive ${type.name}. ` +\n        `Make sure that the ${type.name} class is annotated with an @Directive decorator.`,\n    );\n  }\n\n  if (!directiveDef.standalone) {\n    throw new RuntimeError(\n      RuntimeErrorCode.HOST_DIRECTIVE_NOT_STANDALONE,\n      `Host directive ${directiveDef.type.name} must be standalone.`,\n    );\n  }\n\n  validateMappings('input', directiveDef, hostDirectiveConfig.inputs);\n  validateMappings('output', directiveDef, hostDirectiveConfig.outputs);\n}\n\n/**\n * Checks that the host directive inputs/outputs configuration is valid.\n * @param bindingType Kind of binding that is being validated. Used in the error message.\n * @param def Definition of the host directive that is being validated against.\n * @param hostDirectiveBindings Host directive mapping object that shold be validated.\n */\nfunction validateMappings<T>(\n  bindingType: 'input' | 'output',\n  def: DirectiveDef<T>,\n  hostDirectiveBindings: HostDirectiveBindingMap,\n) {\n  const className = def.type.name;\n  const bindings = bindingType === 'input' ? def.inputs : def.outputs;\n\n  for (const publicName in hostDirectiveBindings) {\n    if (hostDirectiveBindings.hasOwnProperty(publicName)) {\n      if (!bindings.hasOwnProperty(publicName)) {\n        throw new RuntimeError(\n          RuntimeErrorCode.HOST_DIRECTIVE_UNDEFINED_BINDING,\n          `Directive ${className} does not have an ${bindingType} with a public name of ${publicName}.`,\n        );\n      }\n\n      const remappedPublicName = hostDirectiveBindings[publicName];\n\n      if (bindings.hasOwnProperty(remappedPublicName) && remappedPublicName !== publicName) {\n        throw new RuntimeError(\n          RuntimeErrorCode.HOST_DIRECTIVE_CONFLICTING_ALIAS,\n          `Cannot alias ${bindingType} ${publicName} of host directive ${className} to ${remappedPublicName}, because it already has a different ${bindingType} with the same public name.`,\n        );\n      }\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport function isIterable(obj: any): obj is Iterable<any> {\n  return obj !== null && typeof obj === 'object' && obj[Symbol.iterator] !== undefined;\n}\n\nexport function isListLikeIterable(obj: any): boolean {\n  if (!isJsObject(obj)) return false;\n  return (\n    Array.isArray(obj) ||\n    (!(obj instanceof Map) && // JS Map are iterables but return entries as [k, v]\n      Symbol.iterator in obj)\n  ); // JS Iterable have a Symbol.iterator prop\n}\n\nexport function areIterablesEqual<T>(\n  a: Iterable<T>,\n  b: Iterable<T>,\n  comparator: (a: T, b: T) => boolean,\n): boolean {\n  const iterator1 = a[Symbol.iterator]();\n  const iterator2 = b[Symbol.iterator]();\n\n  while (true) {\n    const item1 = iterator1.next();\n    const item2 = iterator2.next();\n    if (item1.done && item2.done) return true;\n    if (item1.done || item2.done) return false;\n    if (!comparator(item1.value, item2.value)) return false;\n  }\n}\n\nexport function iterateListLike<T>(obj: Iterable<T>, fn: (p: T) => void) {\n  if (Array.isArray(obj)) {\n    for (let i = 0; i < obj.length; i++) {\n      fn(obj[i]);\n    }\n  } else {\n    const iterator = obj[Symbol.iterator]();\n    let item: IteratorResult<T, any>;\n    while (!(item = iterator.next()).done) {\n      fn(item.value);\n    }\n  }\n}\n\nexport function isJsObject(o: any): boolean {\n  return o !== null && (typeof o === 'function' || typeof o === 'object');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {areIterablesEqual, isListLikeIterable} from './iterable';\n\nexport function devModeEqual(a: any, b: any): boolean {\n  const isListLikeIterableA = isListLikeIterable(a);\n  const isListLikeIterableB = isListLikeIterable(b);\n  if (isListLikeIterableA && isListLikeIterableB) {\n    return areIterablesEqual(a, b, devModeEqual);\n  } else {\n    const isAObject = a && (typeof a === 'object' || typeof a === 'function');\n    const isBObject = b && (typeof b === 'object' || typeof b === 'function');\n    if (!isListLikeIterableA && isAObject && !isListLikeIterableB && isBObject) {\n      return true;\n    } else {\n      return Object.is(a, b);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertIndexInRange, assertLessThan, assertNotSame} from '../util/assert';\nimport {devModeEqual} from '../util/comparison';\n\nimport {getExpressionChangedErrorDetails, throwErrorIfNoChangesMode} from './errors';\nimport {LView} from './interfaces/view';\nimport {isInCheckNoChangesMode} from './state';\nimport {NO_CHANGE} from './tokens';\n\n// TODO(misko): consider inlining\n/** Updates binding and returns the value. */\nexport function updateBinding(lView: LView, bindingIndex: number, value: any): any {\n  return (lView[bindingIndex] = value);\n}\n\n/** Gets the current binding value. */\nexport function getBinding(lView: LView, bindingIndex: number): any {\n  ngDevMode && assertIndexInRange(lView, bindingIndex);\n  ngDevMode &&\n    assertNotSame(lView[bindingIndex], NO_CHANGE, 'Stored value should never be NO_CHANGE.');\n  return lView[bindingIndex];\n}\n\n/**\n * Updates binding if changed, then returns whether it was updated.\n *\n * This function also checks the `CheckNoChangesMode` and throws if changes are made.\n * Some changes (Objects/iterables) during `CheckNoChangesMode` are exempt to comply with VE\n * behavior.\n *\n * @param lView current `LView`\n * @param bindingIndex The binding in the `LView` to check\n * @param value New value to c   heck against `lView[bindingIndex]`\n * @returns `true` if the bindings has changed. (Throws if binding has changed during\n *          `CheckNoChangesMode`)\n */\nexport function bindingUpdated(lView: LView, bindingIndex: number, value: any): boolean {\n  ngDevMode && assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');\n  ngDevMode &&\n    assertLessThan(bindingIndex, lView.length, `Slot should have been initialized to NO_CHANGE`);\n  const oldValue = lView[bindingIndex];\n\n  if (Object.is(oldValue, value)) {\n    return false;\n  } else {\n    if (ngDevMode && isInCheckNoChangesMode()) {\n      // View engine didn't report undefined values as changed on the first checkNoChanges pass\n      // (before the change detection was run).\n      const oldValueToCompare = oldValue !== NO_CHANGE ? oldValue : undefined;\n      if (!devModeEqual(oldValueToCompare, value)) {\n        const details = getExpressionChangedErrorDetails(\n          lView,\n          bindingIndex,\n          oldValueToCompare,\n          value,\n        );\n        throwErrorIfNoChangesMode(\n          oldValue === NO_CHANGE,\n          details.oldValue,\n          details.newValue,\n          details.propName,\n          lView,\n        );\n      }\n      // There was a change, but the `devModeEqual` decided that the change is exempt from an error.\n      // For this reason we exit as if no change. The early exit is needed to prevent the changed\n      // value to be written into `LView` (If we would write the new value that we would not see it\n      // as change on next CD.)\n      return false;\n    }\n    lView[bindingIndex] = value;\n    return true;\n  }\n}\n\n/** Updates 2 bindings if changed, then returns whether either was updated. */\nexport function bindingUpdated2(lView: LView, bindingIndex: number, exp1: any, exp2: any): boolean {\n  const different = bindingUpdated(lView, bindingIndex, exp1);\n  return bindingUpdated(lView, bindingIndex + 1, exp2) || different;\n}\n\n/** Updates 3 bindings if changed, then returns whether any was updated. */\nexport function bindingUpdated3(\n  lView: LView,\n  bindingIndex: number,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n): boolean {\n  const different = bindingUpdated2(lView, bindingIndex, exp1, exp2);\n  return bindingUpdated(lView, bindingIndex + 2, exp3) || different;\n}\n\n/** Updates 4 bindings if changed, then returns whether any was updated. */\nexport function bindingUpdated4(\n  lView: LView,\n  bindingIndex: number,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  exp4: any,\n): boolean {\n  const different = bindingUpdated2(lView, bindingIndex, exp1, exp2);\n  return bindingUpdated2(lView, bindingIndex + 2, exp3, exp4) || different;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {validateMatchingNode, validateNodeExists} from '../../hydration/error_handling';\nimport {TEMPLATES} from '../../hydration/interfaces';\nimport {locateNextRNode, siblingAfter} from '../../hydration/node_lookup_utils';\nimport {\n  calcSerializedContainerSize,\n  isDisconnectedNode,\n  markRNodeAsClaimedByHydration,\n  setSegmentHead,\n} from '../../hydration/utils';\nimport {isDetachedByI18n} from '../../i18n/utils';\nimport {populateDehydratedViewsInLContainer} from '../../linker/view_container_ref';\nimport {assertEqual} from '../../util/assert';\nimport {assertFirstCreatePass} from '../assert';\nimport {attachPatchData} from '../context_discovery';\nimport {registerPostOrderHooks} from '../hooks';\nimport {ComponentTemplate} from '../interfaces/definition';\nimport {LocalRefExtractor, TAttributes, TContainerNode, TNode, TNodeType} from '../interfaces/node';\nimport {RComment} from '../interfaces/renderer_dom';\nimport {isDirectiveHost} from '../interfaces/type_checks';\nimport {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView, TViewType} from '../interfaces/view';\nimport {appendChild} from '../node_manipulation';\nimport {\n  getBindingsEnabled,\n  getLView,\n  getTView,\n  isInSkipHydrationBlock,\n  lastNodeWasCreated,\n  setCurrentTNode,\n  wasLastNodeCreated,\n} from '../state';\nimport {getOrCreateTNode} from '../tnode_manipulation';\nimport {mergeHostAttrs} from '../util/attrs_utils';\nimport {getConstant} from '../util/view_utils';\nimport {addToEndOfViewTree, createTView} from '../view/construction';\nimport {createLContainer} from '../view/container';\nimport {resolveDirectives} from '../view/directives';\n\nimport {\n  createDirectivesInstances,\n  findDirectiveDefMatches,\n  saveResolvedLocalsInData,\n} from './shared';\n\nfunction templateFirstCreatePass(\n  index: number,\n  tView: TView,\n  lView: LView,\n  templateFn: ComponentTemplate<any> | null,\n  decls: number,\n  vars: number,\n  tagName?: string | null,\n  attrs?: TAttributes | null,\n  localRefsIndex?: number | null,\n): TContainerNode {\n  ngDevMode && assertFirstCreatePass(tView);\n  ngDevMode && ngDevMode.firstCreatePass++;\n  const tViewConsts = tView.consts;\n\n  // TODO(pk): refactor getOrCreateTNode to have the \"create\" only version\n  const tNode = getOrCreateTNode(tView, index, TNodeType.Container, tagName || null, attrs || null);\n\n  if (getBindingsEnabled()) {\n    resolveDirectives(\n      tView,\n      lView,\n      tNode,\n      getConstant<string[]>(tViewConsts, localRefsIndex),\n      findDirectiveDefMatches,\n    );\n  }\n\n  // Merge the template attrs last so that they have the highest priority.\n  tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);\n\n  registerPostOrderHooks(tView, tNode);\n\n  const embeddedTView = (tNode.tView = createTView(\n    TViewType.Embedded,\n    tNode,\n    templateFn,\n    decls,\n    vars,\n    tView.directiveRegistry,\n    tView.pipeRegistry,\n    null,\n    tView.schemas,\n    tViewConsts,\n    null /* ssrId */,\n  ));\n\n  if (tView.queries !== null) {\n    tView.queries.template(tView, tNode);\n    embeddedTView.queries = tView.queries.embeddedTView(tNode);\n  }\n\n  return tNode;\n}\n\n/**\n * Creates an LContainer for an embedded view.\n *\n * @param declarationLView LView in which the template was declared.\n * @param declarationTView TView in which the template wa declared.\n * @param index The index of the container in the data array\n * @param templateFn Inline template\n * @param decls The number of nodes, local refs, and pipes for this template\n * @param vars The number of bindings for this template\n * @param tagName The name of the container element, if applicable\n * @param attrsIndex Index of template attributes in the `consts` array.\n * @param localRefs Index of the local references in the `consts` array.\n * @param localRefExtractor A function which extracts local-refs values from the template.\n *        Defaults to the current element associated with the local-ref.\n */\nexport function declareTemplate(\n  declarationLView: LView,\n  declarationTView: TView,\n  index: number,\n  templateFn: ComponentTemplate<any> | null,\n  decls: number,\n  vars: number,\n  tagName?: string | null,\n  attrs?: TAttributes | null,\n  localRefsIndex?: number | null,\n  localRefExtractor?: LocalRefExtractor,\n): TNode {\n  const adjustedIndex = index + HEADER_OFFSET;\n  const tNode = declarationTView.firstCreatePass\n    ? templateFirstCreatePass(\n        adjustedIndex,\n        declarationTView,\n        declarationLView,\n        templateFn,\n        decls,\n        vars,\n        tagName,\n        attrs,\n        localRefsIndex,\n      )\n    : (declarationTView.data[adjustedIndex] as TContainerNode);\n  setCurrentTNode(tNode, false);\n\n  const comment = _locateOrCreateContainerAnchor(\n    declarationTView,\n    declarationLView,\n    tNode,\n    index,\n  ) as RComment;\n\n  if (wasLastNodeCreated()) {\n    appendChild(declarationTView, declarationLView, comment, tNode);\n  }\n  attachPatchData(comment, declarationLView);\n\n  const lContainer = createLContainer(comment, declarationLView, comment, tNode);\n  declarationLView[adjustedIndex] = lContainer;\n  addToEndOfViewTree(declarationLView, lContainer);\n\n  // If hydration is enabled, looks up dehydrated views in the DOM\n  // using hydration annotation info and stores those views on LContainer.\n  // In client-only mode, this function is a noop.\n  populateDehydratedViewsInLContainer(lContainer, tNode, declarationLView);\n\n  if (isDirectiveHost(tNode)) {\n    createDirectivesInstances(declarationTView, declarationLView, tNode);\n  }\n\n  if (localRefsIndex != null) {\n    saveResolvedLocalsInData(declarationLView, tNode, localRefExtractor);\n  }\n\n  return tNode;\n}\n\n/**\n * Creates an LContainer for an ng-template (dynamically-inserted view), e.g.\n *\n * <ng-template #foo>\n *    <div></div>\n * </ng-template>\n *\n * @param index The index of the container in the data array\n * @param templateFn Inline template\n * @param decls The number of nodes, local refs, and pipes for this template\n * @param vars The number of bindings for this template\n * @param tagName The name of the container element, if applicable\n * @param attrsIndex Index of template attributes in the `consts` array.\n * @param localRefs Index of the local references in the `consts` array.\n * @param localRefExtractor A function which extracts local-refs values from the template.\n *        Defaults to the current element associated with the local-ref.\n *\n * @codeGenApi\n */\nexport function ɵɵtemplate(\n  index: number,\n  templateFn: ComponentTemplate<any> | null,\n  decls: number,\n  vars: number,\n  tagName?: string | null,\n  attrsIndex?: number | null,\n  localRefsIndex?: number | null,\n  localRefExtractor?: LocalRefExtractor,\n): typeof ɵɵtemplate {\n  const lView = getLView();\n  const tView = getTView();\n  const attrs = getConstant<TAttributes>(tView.consts, attrsIndex);\n  declareTemplate(\n    lView,\n    tView,\n    index,\n    templateFn,\n    decls,\n    vars,\n    tagName,\n    attrs,\n    localRefsIndex,\n    localRefExtractor,\n  );\n  return ɵɵtemplate;\n}\n\nlet _locateOrCreateContainerAnchor = createContainerAnchorImpl;\n\n/**\n * Regular creation mode for LContainers and their anchor (comment) nodes.\n */\nfunction createContainerAnchorImpl(\n  tView: TView,\n  lView: LView,\n  tNode: TNode,\n  index: number,\n): RComment {\n  lastNodeWasCreated(true);\n  return lView[RENDERER].createComment(ngDevMode ? 'container' : '');\n}\n\n/**\n * Enables hydration code path (to lookup existing elements in DOM)\n * in addition to the regular creation mode for LContainers and their\n * anchor (comment) nodes.\n */\nfunction locateOrCreateContainerAnchorImpl(\n  tView: TView,\n  lView: LView,\n  tNode: TNode,\n  index: number,\n): RComment {\n  const hydrationInfo = lView[HYDRATION];\n  const isNodeCreationMode =\n    !hydrationInfo ||\n    isInSkipHydrationBlock() ||\n    isDetachedByI18n(tNode) ||\n    isDisconnectedNode(hydrationInfo, index);\n  lastNodeWasCreated(isNodeCreationMode);\n\n  // Regular creation mode.\n  if (isNodeCreationMode) {\n    return createContainerAnchorImpl(tView, lView, tNode, index);\n  }\n\n  const ssrId = hydrationInfo.data[TEMPLATES]?.[index] ?? null;\n\n  // Apply `ssrId` value to the underlying TView if it was not previously set.\n  //\n  // There might be situations when the same component is present in a template\n  // multiple times and some instances are opted-out of using hydration via\n  // `ngSkipHydration` attribute. In this scenario, at the time a TView is created,\n  // the `ssrId` might be `null` (if the first component is opted-out of hydration).\n  // The code below makes sure that the `ssrId` is applied to the TView if it's still\n  // `null` and verifies we never try to override it with a different value.\n  if (ssrId !== null && tNode.tView !== null) {\n    if (tNode.tView.ssrId === null) {\n      tNode.tView.ssrId = ssrId;\n    } else {\n      ngDevMode &&\n        assertEqual(tNode.tView.ssrId, ssrId, 'Unexpected value of the `ssrId` for this TView');\n    }\n  }\n\n  // Hydration mode, looking up existing elements in DOM.\n  const currentRNode = locateNextRNode(hydrationInfo, tView, lView, tNode)!;\n  ngDevMode && validateNodeExists(currentRNode, lView, tNode);\n\n  setSegmentHead(hydrationInfo, index, currentRNode);\n  const viewContainerSize = calcSerializedContainerSize(hydrationInfo, index);\n  const comment = siblingAfter<RComment>(viewContainerSize, currentRNode)!;\n\n  if (ngDevMode) {\n    validateMatchingNode(comment, Node.COMMENT_NODE, null, lView, tNode);\n    markRNodeAsClaimedByHydration(comment);\n  }\n\n  return comment;\n}\n\nexport function enableLocateOrCreateContainerAnchorImpl() {\n  _locateOrCreateContainerAnchor = locateOrCreateContainerAnchorImpl;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector, inject, ɵɵdefineInjectable} from '../di';\nimport {NgZone} from '../zone';\n\n/**\n * Helper function to schedule a callback to be invoked when a browser becomes idle.\n *\n * @param callback A function to be invoked when a browser becomes idle.\n * @param injector injector for the app\n */\nexport function onIdle(callback: VoidFunction, injector: Injector) {\n  const scheduler = injector.get(IdleScheduler);\n  const cleanupFn = () => scheduler.remove(callback);\n  scheduler.add(callback);\n  return cleanupFn;\n}\n\n/**\n * Use shims for the `requestIdleCallback` and `cancelIdleCallback` functions for\n * environments where those functions are not available (e.g. Node.js and Safari).\n *\n * Note: we wrap the `requestIdleCallback` call into a function, so that it can be\n * overridden/mocked in test environment and picked up by the runtime code.\n */\nconst _requestIdleCallback = () =>\n  typeof requestIdleCallback !== 'undefined' ? requestIdleCallback : setTimeout;\nconst _cancelIdleCallback = () =>\n  typeof requestIdleCallback !== 'undefined' ? cancelIdleCallback : clearTimeout;\n\n/**\n * Helper service to schedule `requestIdleCallback`s for batches of defer blocks,\n * to avoid calling `requestIdleCallback` for each defer block (e.g. if\n * defer blocks are defined inside a for loop).\n */\nexport class IdleScheduler {\n  // Indicates whether current callbacks are being invoked.\n  executingCallbacks = false;\n\n  // Currently scheduled idle callback id.\n  idleId: number | null = null;\n\n  // Set of callbacks to be invoked next.\n  current = new Set<VoidFunction>();\n\n  // Set of callbacks collected while invoking current set of callbacks.\n  // Those callbacks are scheduled for the next idle period.\n  deferred = new Set<VoidFunction>();\n\n  ngZone = inject(NgZone);\n\n  requestIdleCallbackFn = _requestIdleCallback().bind(globalThis);\n  cancelIdleCallbackFn = _cancelIdleCallback().bind(globalThis);\n\n  add(callback: VoidFunction) {\n    const target = this.executingCallbacks ? this.deferred : this.current;\n    target.add(callback);\n    if (this.idleId === null) {\n      this.scheduleIdleCallback();\n    }\n  }\n\n  remove(callback: VoidFunction) {\n    const {current, deferred} = this;\n\n    current.delete(callback);\n    deferred.delete(callback);\n\n    // If the last callback was removed and there is a pending\n    // idle callback - cancel it.\n    if (current.size === 0 && deferred.size === 0) {\n      this.cancelIdleCallback();\n    }\n  }\n\n  private scheduleIdleCallback() {\n    const callback = () => {\n      this.cancelIdleCallback();\n\n      this.executingCallbacks = true;\n\n      for (const callback of this.current) {\n        callback();\n      }\n      this.current.clear();\n\n      this.executingCallbacks = false;\n\n      // If there are any callbacks added during an invocation\n      // of the current ones - make them \"current\" and schedule\n      // a new idle callback.\n      if (this.deferred.size > 0) {\n        for (const callback of this.deferred) {\n          this.current.add(callback);\n        }\n        this.deferred.clear();\n        this.scheduleIdleCallback();\n      }\n    };\n    // Ensure that the callback runs in the NgZone since\n    // the `requestIdleCallback` is not currently patched by Zone.js.\n    this.idleId = this.requestIdleCallbackFn(() => this.ngZone.run(callback)) as number;\n  }\n\n  private cancelIdleCallback() {\n    if (this.idleId !== null) {\n      this.cancelIdleCallbackFn(this.idleId);\n      this.idleId = null;\n    }\n  }\n\n  ngOnDestroy() {\n    this.cancelIdleCallback();\n    this.current.clear();\n    this.deferred.clear();\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: IdleScheduler,\n    providedIn: 'root',\n    factory: () => new IdleScheduler(),\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector, ɵɵdefineInjectable} from '../di';\nimport {arrayInsert2, arraySplice} from '../util/array_utils';\nimport {NgZone} from '../zone';\n\n/**\n * Returns a function that captures a provided delay.\n * Invoking the returned function schedules a trigger.\n */\nexport function onTimer(delay: number) {\n  return (callback: VoidFunction, injector: Injector) =>\n    scheduleTimerTrigger(delay, callback, injector);\n}\n\n/**\n * Schedules a callback to be invoked after a given timeout.\n *\n * @param delay A number of ms to wait until firing a callback.\n * @param callback A function to be invoked after a timeout.\n * @param injector injector for the app.\n */\nexport function scheduleTimerTrigger(delay: number, callback: VoidFunction, injector: Injector) {\n  const scheduler = injector.get(TimerScheduler);\n  const ngZone = injector.get(NgZone);\n  const cleanupFn = () => scheduler.remove(callback);\n  scheduler.add(delay, callback, ngZone);\n  return cleanupFn;\n}\n\n/**\n * Helper service to schedule `setTimeout`s for batches of defer blocks,\n * to avoid calling `setTimeout` for each defer block (e.g. if defer blocks\n * are created inside a for loop).\n */\nexport class TimerScheduler {\n  // Indicates whether current callbacks are being invoked.\n  executingCallbacks = false;\n\n  // Currently scheduled `setTimeout` id.\n  timeoutId: number | null = null;\n\n  // When currently scheduled timer would fire.\n  invokeTimerAt: number | null = null;\n\n  // List of callbacks to be invoked.\n  // For each callback we also store a timestamp on when the callback\n  // should be invoked. We store timestamps and callback functions\n  // in a flat array to avoid creating new objects for each entry.\n  // [timestamp1, callback1, timestamp2, callback2, ...]\n  current: Array<number | VoidFunction> = [];\n\n  // List of callbacks collected while invoking current set of callbacks.\n  // Those callbacks are added to the \"current\" queue at the end of\n  // the current callback invocation. The shape of this list is the same\n  // as the shape of the `current` list.\n  deferred: Array<number | VoidFunction> = [];\n\n  add(delay: number, callback: VoidFunction, ngZone: NgZone) {\n    const target = this.executingCallbacks ? this.deferred : this.current;\n    this.addToQueue(target, Date.now() + delay, callback);\n    this.scheduleTimer(ngZone);\n  }\n\n  remove(callback: VoidFunction) {\n    const {current, deferred} = this;\n    const callbackIndex = this.removeFromQueue(current, callback);\n    if (callbackIndex === -1) {\n      // Try cleaning up deferred queue only in case\n      // we didn't find a callback in the \"current\" queue.\n      this.removeFromQueue(deferred, callback);\n    }\n    // If the last callback was removed and there is a pending timeout - cancel it.\n    if (current.length === 0 && deferred.length === 0) {\n      this.clearTimeout();\n    }\n  }\n\n  private addToQueue(\n    target: Array<number | VoidFunction>,\n    invokeAt: number,\n    callback: VoidFunction,\n  ) {\n    let insertAtIndex = target.length;\n    for (let i = 0; i < target.length; i += 2) {\n      const invokeQueuedCallbackAt = target[i] as number;\n      if (invokeQueuedCallbackAt > invokeAt) {\n        // We've reached a first timer that is scheduled\n        // for a later time than what we are trying to insert.\n        // This is the location at which we need to insert,\n        // no need to iterate further.\n        insertAtIndex = i;\n        break;\n      }\n    }\n    arrayInsert2(target, insertAtIndex, invokeAt, callback);\n  }\n\n  private removeFromQueue(target: Array<number | VoidFunction>, callback: VoidFunction) {\n    let index = -1;\n    for (let i = 0; i < target.length; i += 2) {\n      const queuedCallback = target[i + 1];\n      if (queuedCallback === callback) {\n        index = i;\n        break;\n      }\n    }\n    if (index > -1) {\n      // Remove 2 elements: a timestamp slot and\n      // the following slot with a callback function.\n      arraySplice(target, index, 2);\n    }\n    return index;\n  }\n\n  private scheduleTimer(ngZone: NgZone) {\n    const callback = () => {\n      this.clearTimeout();\n\n      this.executingCallbacks = true;\n\n      // Clone the current state of the queue, since it might be altered\n      // as we invoke callbacks.\n      const current = [...this.current];\n\n      // Invoke callbacks that were scheduled to run before the current time.\n      const now = Date.now();\n      for (let i = 0; i < current.length; i += 2) {\n        const invokeAt = current[i] as number;\n        const callback = current[i + 1] as VoidFunction;\n        if (invokeAt <= now) {\n          callback();\n        } else {\n          // We've reached a timer that should not be invoked yet.\n          break;\n        }\n      }\n      // The state of the queue might've changed after callbacks invocation,\n      // run the cleanup logic based on the *current* state of the queue.\n      let lastCallbackIndex = -1;\n      for (let i = 0; i < this.current.length; i += 2) {\n        const invokeAt = this.current[i] as number;\n        if (invokeAt <= now) {\n          // Add +1 to account for a callback function that\n          // goes after the timestamp in events array.\n          lastCallbackIndex = i + 1;\n        } else {\n          // We've reached a timer that should not be invoked yet.\n          break;\n        }\n      }\n      if (lastCallbackIndex >= 0) {\n        arraySplice(this.current, 0, lastCallbackIndex + 1);\n      }\n\n      this.executingCallbacks = false;\n\n      // If there are any callbacks added during an invocation\n      // of the current ones - move them over to the \"current\"\n      // queue.\n      if (this.deferred.length > 0) {\n        for (let i = 0; i < this.deferred.length; i += 2) {\n          const invokeAt = this.deferred[i] as number;\n          const callback = this.deferred[i + 1] as VoidFunction;\n          this.addToQueue(this.current, invokeAt, callback);\n        }\n        this.deferred.length = 0;\n      }\n      this.scheduleTimer(ngZone);\n    };\n\n    // Avoid running timer callbacks more than once per\n    // average frame duration. This is needed for better\n    // batching and to avoid kicking off excessive change\n    // detection cycles.\n    const FRAME_DURATION_MS = 16; // 1000ms / 60fps\n\n    if (this.current.length > 0) {\n      const now = Date.now();\n      // First element in the queue points at the timestamp\n      // of the first (earliest) event.\n      const invokeAt = this.current[0] as number;\n      if (\n        this.timeoutId === null ||\n        // Reschedule a timer in case a queue contains an item with\n        // an earlier timestamp and the delta is more than an average\n        // frame duration.\n        (this.invokeTimerAt && this.invokeTimerAt - invokeAt > FRAME_DURATION_MS)\n      ) {\n        // There was a timeout already, but an earlier event was added\n        // into the queue. In this case we drop an old timer and setup\n        // a new one with an updated (smaller) timeout.\n        this.clearTimeout();\n\n        const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS);\n        this.invokeTimerAt = invokeAt;\n        this.timeoutId = ngZone.runOutsideAngular(() => {\n          return setTimeout(() => ngZone.run(callback), timeout) as unknown as number;\n        });\n      }\n    }\n  }\n\n  private clearTimeout() {\n    if (this.timeoutId !== null) {\n      clearTimeout(this.timeoutId);\n      this.timeoutId = null;\n    }\n  }\n\n  ngOnDestroy() {\n    this.clearTimeout();\n    this.current.length = 0;\n    this.deferred.length = 0;\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: TimerScheduler,\n    providedIn: 'root',\n    factory: () => new TimerScheduler(),\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵɵdefineInjectable as defineInjectable} from './di/interface/defs';\nimport {Provider} from './di/interface/provider';\nimport {EnvironmentInjector} from './di/r3_injector';\nimport {OnDestroy} from './interface/lifecycle_hooks';\nimport {createEnvironmentInjector} from './render3/ng_module_ref';\n\n/**\n * A service used by the framework to create and cache injector instances.\n *\n * This service is used to create a single injector instance for each defer\n * block definition, to avoid creating an injector for each defer block instance\n * of a certain type.\n */\nexport class CachedInjectorService implements OnDestroy {\n  private cachedInjectors = new Map<unknown, EnvironmentInjector | null>();\n\n  getOrCreateInjector(\n    key: unknown,\n    parentInjector: EnvironmentInjector,\n    providers: Provider[],\n    debugName?: string,\n  ) {\n    if (!this.cachedInjectors.has(key)) {\n      const injector =\n        providers.length > 0\n          ? createEnvironmentInjector(providers, parentInjector, debugName)\n          : null;\n      this.cachedInjectors.set(key, injector);\n    }\n    return this.cachedInjectors.get(key)!;\n  }\n\n  ngOnDestroy() {\n    try {\n      for (const injector of this.cachedInjectors.values()) {\n        if (injector !== null) {\n          injector.destroy();\n        }\n      }\n    } finally {\n      this.cachedInjectors.clear();\n    }\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ defineInjectable({\n    token: CachedInjectorService,\n    providedIn: 'environment',\n    factory: () => new CachedInjectorService(),\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {CachedInjectorService} from '../cached_injector_service';\nimport {NotificationSource} from '../change_detection/scheduling/zoneless_scheduling';\nimport {EnvironmentInjector, InjectionToken, Injector, Provider} from '../di';\nimport {\n  DehydratedContainerView,\n  DEFER_BLOCK_STATE as SERIALIZED_DEFER_BLOCK_STATE,\n} from '../hydration/interfaces';\nimport {assertLContainer, assertTNodeForLView} from '../render3/assert';\nimport {ChainedInjector} from '../render3/chained_injector';\nimport {markViewDirty} from '../render3/instructions/mark_view_dirty';\nimport {handleError} from '../render3/instructions/shared';\nimport {DEHYDRATED_VIEWS, LContainer} from '../render3/interfaces/container';\nimport {TContainerNode, TNode} from '../render3/interfaces/node';\nimport {isDestroyed} from '../render3/interfaces/type_checks';\nimport {HEADER_OFFSET, INJECTOR, LView, PARENT, TVIEW, TView} from '../render3/interfaces/view';\nimport {getConstant, getTNode} from '../render3/util/view_utils';\nimport {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../render3/view_manipulation';\nimport {assertDefined} from '../util/assert';\n\nimport {\n  DEFER_BLOCK_STATE,\n  DeferBlockConfig,\n  DeferBlockDependencyInterceptor,\n  DeferBlockInternalState,\n  DeferBlockState,\n  DeferDependenciesLoadingState,\n  DeferredLoadingBlockConfig,\n  DeferredPlaceholderBlockConfig,\n  LDeferBlockDetails,\n  LOADING_AFTER_CLEANUP_FN,\n  NEXT_DEFER_BLOCK_STATE,\n  ON_COMPLETE_FNS,\n  SSR_BLOCK_STATE,\n  STATE_IS_FROZEN_UNTIL,\n  TDeferBlockDetails,\n} from './interfaces';\nimport {scheduleTimerTrigger} from './timer_scheduler';\nimport {\n  assertDeferredDependenciesLoaded,\n  getLDeferBlockDetails,\n  getLoadingBlockAfter,\n  getMinimumDurationForState,\n  getTDeferBlockDetails,\n  getTemplateIndexForState,\n} from './utils';\nimport {profiler} from '../render3/profiler';\nimport {ProfilerEvent} from '../render3/profiler_types';\nimport {addLViewToLContainer, removeLViewFromLContainer} from '../render3/view/container';\n\n/**\n * **INTERNAL**, avoid referencing it in application code.\n * *\n * Injector token that allows to provide `DeferBlockDependencyInterceptor` class\n * implementation.\n *\n * This token is only injected in devMode\n */\nexport const DEFER_BLOCK_DEPENDENCY_INTERCEPTOR =\n  /* @__PURE__ */ new InjectionToken<DeferBlockDependencyInterceptor>(\n    'DEFER_BLOCK_DEPENDENCY_INTERCEPTOR',\n  );\n\n/**\n * **INTERNAL**, token used for configuring defer block behavior.\n */\nexport const DEFER_BLOCK_CONFIG = new InjectionToken<DeferBlockConfig>(\n  ngDevMode ? 'DEFER_BLOCK_CONFIG' : '',\n);\n\n/**\n * Checks whether there is a cached injector associated with a given defer block\n * declaration and returns if it exists. If there is no cached injector present -\n * creates a new injector and stores in the cache.\n */\nfunction getOrCreateEnvironmentInjector(\n  parentInjector: Injector,\n  tDetails: TDeferBlockDetails,\n  providers: Provider[],\n) {\n  return parentInjector\n    .get(CachedInjectorService)\n    .getOrCreateInjector(\n      tDetails,\n      parentInjector as EnvironmentInjector,\n      providers,\n      ngDevMode ? 'DeferBlock Injector' : '',\n    );\n}\n\n/** Injector Helpers */\n\n/**\n * Creates a new injector, which contains providers collected from dependencies (NgModules) of\n * defer-loaded components. This function detects different types of parent injectors and creates\n * a new injector based on that.\n */\nfunction createDeferBlockInjector(\n  parentInjector: Injector,\n  tDetails: TDeferBlockDetails,\n  providers: Provider[],\n) {\n  // Check if the parent injector is an instance of a `ChainedInjector`.\n  //\n  // In this case, we retain the shape of the injector and use a newly created\n  // `EnvironmentInjector` as a parent in the `ChainedInjector`. That is needed to\n  // make sure that the primary injector gets consulted first (since it's typically\n  // a NodeInjector) and `EnvironmentInjector` tree is consulted after that.\n  if (parentInjector instanceof ChainedInjector) {\n    const origInjector = parentInjector.injector;\n    // Guaranteed to be an environment injector\n    const parentEnvInjector = parentInjector.parentInjector;\n\n    const envInjector = getOrCreateEnvironmentInjector(parentEnvInjector, tDetails, providers);\n    return new ChainedInjector(origInjector, envInjector);\n  }\n\n  const parentEnvInjector = parentInjector.get(EnvironmentInjector);\n\n  // If the `parentInjector` is *not* an `EnvironmentInjector` - we need to create\n  // a new `ChainedInjector` with the following setup:\n  //\n  //  - the provided `parentInjector` becomes a primary injector\n  //  - an existing (real) `EnvironmentInjector` becomes a parent injector for\n  //    a newly-created one, which contains extra providers\n  //\n  // So the final order in which injectors would be consulted in this case would look like this:\n  //\n  //  1. Provided `parentInjector`\n  //  2. Newly-created `EnvironmentInjector` with extra providers\n  //  3. `EnvironmentInjector` from the `parentInjector`\n  if (parentEnvInjector !== parentInjector) {\n    const envInjector = getOrCreateEnvironmentInjector(parentEnvInjector, tDetails, providers);\n    return new ChainedInjector(parentInjector, envInjector);\n  }\n\n  // The `parentInjector` is an instance of an `EnvironmentInjector`.\n  // No need for special handling, we can use `parentInjector` as a\n  // parent injector directly.\n  return getOrCreateEnvironmentInjector(parentInjector, tDetails, providers);\n}\n\n/** Rendering Helpers */\n\n/**\n * Transitions a defer block to the new state. Updates the  necessary\n * data structures and renders corresponding block.\n *\n * @param newState New state that should be applied to the defer block.\n * @param tNode TNode that represents a defer block.\n * @param lContainer Represents an instance of a defer block.\n * @param skipTimerScheduling Indicates that `@loading` and `@placeholder` block\n *   should be rendered immediately, even if they have `after` or `minimum` config\n *   options setup. This flag to needed for testing APIs to transition defer block\n *   between states via `DeferFixture.render` method.\n */\nexport function renderDeferBlockState(\n  newState: DeferBlockState,\n  tNode: TNode,\n  lContainer: LContainer,\n  skipTimerScheduling = false,\n): void {\n  const hostLView = lContainer[PARENT];\n  const hostTView = hostLView[TVIEW];\n\n  // Check if this view is not destroyed. Since the loading process was async,\n  // the view might end up being destroyed by the time rendering happens.\n  if (isDestroyed(hostLView)) return;\n\n  // Make sure this TNode belongs to TView that represents host LView.\n  ngDevMode && assertTNodeForLView(tNode, hostLView);\n\n  const lDetails = getLDeferBlockDetails(hostLView, tNode);\n\n  ngDevMode && assertDefined(lDetails, 'Expected a defer block state defined');\n\n  const currentState = lDetails[DEFER_BLOCK_STATE];\n\n  const ssrState = lDetails[SSR_BLOCK_STATE];\n  if (ssrState !== null && newState < ssrState) {\n    return; // trying to render a previous state, exit\n  }\n\n  if (\n    isValidStateChange(currentState, newState) &&\n    isValidStateChange(lDetails[NEXT_DEFER_BLOCK_STATE] ?? -1, newState)\n  ) {\n    const tDetails = getTDeferBlockDetails(hostTView, tNode);\n    // Skips scheduling on the server since it can delay the server response.\n    const needsScheduling =\n      !skipTimerScheduling &&\n      (typeof ngServerMode === 'undefined' || !ngServerMode) &&\n      (getLoadingBlockAfter(tDetails) !== null ||\n        getMinimumDurationForState(tDetails, DeferBlockState.Loading) !== null ||\n        getMinimumDurationForState(tDetails, DeferBlockState.Placeholder));\n\n    if (ngDevMode && needsScheduling) {\n      assertDefined(\n        applyDeferBlockStateWithSchedulingImpl,\n        'Expected scheduling function to be defined',\n      );\n    }\n\n    const applyStateFn = needsScheduling\n      ? applyDeferBlockStateWithSchedulingImpl!\n      : applyDeferBlockState;\n    try {\n      applyStateFn(newState, lDetails, lContainer, tNode, hostLView);\n    } catch (error: unknown) {\n      handleError(hostLView, error);\n    }\n  }\n}\n\nfunction findMatchingDehydratedViewForDeferBlock(\n  lContainer: LContainer,\n  lDetails: LDeferBlockDetails,\n): {dehydratedView: DehydratedContainerView | null; dehydratedViewIx: number} {\n  const dehydratedViewIx =\n    lContainer[DEHYDRATED_VIEWS]?.findIndex(\n      (view: any) => view.data[SERIALIZED_DEFER_BLOCK_STATE] === lDetails[DEFER_BLOCK_STATE],\n    ) ?? -1;\n  const dehydratedView =\n    dehydratedViewIx > -1 ? lContainer[DEHYDRATED_VIEWS]![dehydratedViewIx] : null;\n  return {dehydratedView, dehydratedViewIx};\n}\n\n/**\n * Applies changes to the DOM to reflect a given state.\n */\nfunction applyDeferBlockState(\n  newState: DeferBlockState,\n  lDetails: LDeferBlockDetails,\n  lContainer: LContainer,\n  tNode: TNode,\n  hostLView: LView<unknown>,\n) {\n  profiler(ProfilerEvent.DeferBlockStateStart);\n\n  const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode);\n\n  if (stateTmplIndex !== null) {\n    lDetails[DEFER_BLOCK_STATE] = newState;\n    const hostTView = hostLView[TVIEW];\n    const adjustedIndex = stateTmplIndex + HEADER_OFFSET;\n\n    // The TNode that represents a template that will activated in the defer block\n    const activeBlockTNode = getTNode(hostTView, adjustedIndex) as TContainerNode;\n\n    // There is only 1 view that can be present in an LContainer that\n    // represents a defer block, so always refer to the first one.\n    const viewIndex = 0;\n\n    removeLViewFromLContainer(lContainer, viewIndex);\n\n    let injector: Injector | undefined;\n    if (newState === DeferBlockState.Complete) {\n      // When we render a defer block in completed state, there might be\n      // newly loaded standalone components used within the block, which may\n      // import NgModules with providers. In order to make those providers\n      // available for components declared in that NgModule, we create an instance\n      // of an environment injector to host those providers and pass this injector\n      // to the logic that creates a view.\n      const tDetails = getTDeferBlockDetails(hostTView, tNode);\n      const providers = tDetails.providers;\n      if (providers && providers.length > 0) {\n        injector = createDeferBlockInjector(hostLView[INJECTOR], tDetails, providers);\n      }\n    }\n    const {dehydratedView, dehydratedViewIx} = findMatchingDehydratedViewForDeferBlock(\n      lContainer,\n      lDetails,\n    );\n\n    const embeddedLView = createAndRenderEmbeddedLView(hostLView, activeBlockTNode, null, {\n      injector,\n      dehydratedView,\n    });\n    addLViewToLContainer(\n      lContainer,\n      embeddedLView,\n      viewIndex,\n      shouldAddViewToDom(activeBlockTNode, dehydratedView),\n    );\n    markViewDirty(embeddedLView, NotificationSource.DeferBlockStateUpdate);\n\n    if (dehydratedViewIx > -1) {\n      // Erase dehydrated view info in a given LContainer, so that the view is not\n      // removed later by post-hydration cleanup process (which iterates over all\n      // dehydrated views in component tree). This clears only the dehydrated view\n      // that was found for this render, which in most cases will be the only view.\n      // In the case that there was control flow that changed, there may be either\n      // more than one or the views would not match up due to the server rendered\n      // content being a different branch of the control flow.\n      lContainer[DEHYDRATED_VIEWS]?.splice(dehydratedViewIx, 1);\n    }\n\n    if (\n      (newState === DeferBlockState.Complete || newState === DeferBlockState.Error) &&\n      Array.isArray(lDetails[ON_COMPLETE_FNS])\n    ) {\n      for (const callback of lDetails[ON_COMPLETE_FNS]) {\n        callback();\n      }\n      lDetails[ON_COMPLETE_FNS] = null;\n    }\n  }\n\n  profiler(ProfilerEvent.DeferBlockStateEnd);\n}\n\n/**\n * Extends the `applyDeferBlockState` with timer-based scheduling.\n * This function becomes available on a page if there are defer blocks\n * that use `after` or `minimum` parameters in the `@loading` or\n * `@placeholder` blocks.\n */\nfunction applyDeferBlockStateWithScheduling(\n  newState: DeferBlockState,\n  lDetails: LDeferBlockDetails,\n  lContainer: LContainer,\n  tNode: TNode,\n  hostLView: LView<unknown>,\n) {\n  const now = Date.now();\n  const hostTView = hostLView[TVIEW];\n  const tDetails = getTDeferBlockDetails(hostTView, tNode);\n\n  if (lDetails[STATE_IS_FROZEN_UNTIL] === null || lDetails[STATE_IS_FROZEN_UNTIL] <= now) {\n    lDetails[STATE_IS_FROZEN_UNTIL] = null;\n\n    const loadingAfter = getLoadingBlockAfter(tDetails);\n    const inLoadingAfterPhase = lDetails[LOADING_AFTER_CLEANUP_FN] !== null;\n    if (newState === DeferBlockState.Loading && loadingAfter !== null && !inLoadingAfterPhase) {\n      // Trying to render loading, but it has an `after` config,\n      // so schedule an update action after a timeout.\n      lDetails[NEXT_DEFER_BLOCK_STATE] = newState;\n      const cleanupFn = scheduleDeferBlockUpdate(\n        loadingAfter,\n        lDetails,\n        tNode,\n        lContainer,\n        hostLView,\n      );\n      lDetails[LOADING_AFTER_CLEANUP_FN] = cleanupFn;\n    } else {\n      // If we transition to a complete or an error state and there is a pending\n      // operation to render loading after a timeout - invoke a cleanup operation,\n      // which stops the timer.\n      if (newState > DeferBlockState.Loading && inLoadingAfterPhase) {\n        lDetails[LOADING_AFTER_CLEANUP_FN]!();\n        lDetails[LOADING_AFTER_CLEANUP_FN] = null;\n        lDetails[NEXT_DEFER_BLOCK_STATE] = null;\n      }\n\n      applyDeferBlockState(newState, lDetails, lContainer, tNode, hostLView);\n\n      const duration = getMinimumDurationForState(tDetails, newState);\n      if (duration !== null) {\n        lDetails[STATE_IS_FROZEN_UNTIL] = now + duration;\n        scheduleDeferBlockUpdate(duration, lDetails, tNode, lContainer, hostLView);\n      }\n    }\n  } else {\n    // We are still rendering the previous state.\n    // Update the `NEXT_DEFER_BLOCK_STATE`, which would be\n    // picked up once it's time to transition to the next state.\n    lDetails[NEXT_DEFER_BLOCK_STATE] = newState;\n  }\n}\n\n/**\n * Schedules an update operation after a specified timeout.\n */\nfunction scheduleDeferBlockUpdate(\n  timeout: number,\n  lDetails: LDeferBlockDetails,\n  tNode: TNode,\n  lContainer: LContainer,\n  hostLView: LView<unknown>,\n): VoidFunction {\n  const callback = () => {\n    const nextState = lDetails[NEXT_DEFER_BLOCK_STATE];\n    lDetails[STATE_IS_FROZEN_UNTIL] = null;\n    lDetails[NEXT_DEFER_BLOCK_STATE] = null;\n    if (nextState !== null) {\n      renderDeferBlockState(nextState, tNode, lContainer);\n    }\n  };\n  return scheduleTimerTrigger(timeout, callback, hostLView[INJECTOR]);\n}\n\n/**\n * Checks whether we can transition to the next state.\n *\n * We transition to the next state if the previous state was represented\n * with a number that is less than the next state. For example, if the current\n * state is \"loading\" (represented as `1`), we should not show a placeholder\n * (represented as `0`), but we can show a completed state (represented as `2`)\n * or an error state (represented as `3`).\n */\nfunction isValidStateChange(\n  currentState: DeferBlockState | DeferBlockInternalState,\n  newState: DeferBlockState,\n): boolean {\n  return currentState < newState;\n}\n\n/** Utility function to render placeholder content (if present) */\nexport function renderPlaceholder(lView: LView, tNode: TNode) {\n  const lContainer = lView[tNode.index];\n  ngDevMode && assertLContainer(lContainer);\n\n  renderDeferBlockState(DeferBlockState.Placeholder, tNode, lContainer);\n}\n\n/**\n * Subscribes to the \"loading\" Promise and renders corresponding defer sub-block,\n * based on the loading results.\n *\n * @param lContainer Represents an instance of a defer block.\n * @param tNode Represents defer block info shared across all instances.\n */\nexport function renderDeferStateAfterResourceLoading(\n  tDetails: TDeferBlockDetails,\n  tNode: TNode,\n  lContainer: LContainer,\n) {\n  ngDevMode &&\n    assertDefined(tDetails.loadingPromise, 'Expected loading Promise to exist on this defer block');\n\n  tDetails.loadingPromise!.then(() => {\n    if (tDetails.loadingState === DeferDependenciesLoadingState.COMPLETE) {\n      ngDevMode && assertDeferredDependenciesLoaded(tDetails);\n\n      // Everything is loaded, show the primary block content\n      renderDeferBlockState(DeferBlockState.Complete, tNode, lContainer);\n    } else if (tDetails.loadingState === DeferDependenciesLoadingState.FAILED) {\n      renderDeferBlockState(DeferBlockState.Error, tNode, lContainer);\n    }\n  });\n}\n\n/**\n * Reference to the timer-based scheduler implementation of defer block state\n * rendering method. It's used to make timer-based scheduling tree-shakable.\n * If `minimum` or `after` parameters are used, compiler generates an extra\n * argument for the `ɵɵdefer` instruction, which references a timer-based\n * implementation.\n */\nlet applyDeferBlockStateWithSchedulingImpl: typeof applyDeferBlockState | null = null;\n\n/**\n * Enables timer-related scheduling if `after` or `minimum` parameters are setup\n * on the `@loading` or `@placeholder` blocks.\n */\nexport function ɵɵdeferEnableTimerScheduling(\n  tView: TView,\n  tDetails: TDeferBlockDetails,\n  placeholderConfigIndex?: number | null,\n  loadingConfigIndex?: number | null,\n) {\n  const tViewConsts = tView.consts;\n  if (placeholderConfigIndex != null) {\n    tDetails.placeholderBlockConfig = getConstant<DeferredPlaceholderBlockConfig>(\n      tViewConsts,\n      placeholderConfigIndex,\n    );\n  }\n  if (loadingConfigIndex != null) {\n    tDetails.loadingBlockConfig = getConstant<DeferredLoadingBlockConfig>(\n      tViewConsts,\n      loadingConfigIndex,\n    );\n  }\n\n  // Enable implementation that supports timer-based scheduling.\n  if (applyDeferBlockStateWithSchedulingImpl === null) {\n    applyDeferBlockStateWithSchedulingImpl = applyDeferBlockStateWithScheduling;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {noSideEffects} from '../util/closure';\n\ninterface TypeWithMetadata extends Type<any> {\n  decorators?: any[];\n  ctorParameters?: () => any[];\n  propDecorators?: {[field: string]: any};\n}\n\n/**\n * The name of a field that Angular monkey-patches onto a component\n * class to store a function that loads defer-loadable dependencies\n * and applies metadata to a class.\n */\nconst ASYNC_COMPONENT_METADATA_FN = '__ngAsyncComponentMetadataFn__';\n\n/**\n * If a given component has unresolved async metadata - returns a reference\n * to a function that applies component metadata after resolving defer-loadable\n * dependencies. Otherwise - this function returns `null`.\n */\nexport function getAsyncClassMetadataFn(\n  type: Type<unknown>,\n): (() => Promise<Array<Type<unknown>>>) | null {\n  const componentClass = type as any; // cast to `any`, so that we can read a monkey-patched field\n  return componentClass[ASYNC_COMPONENT_METADATA_FN] ?? null;\n}\n\n/**\n * Handles the process of applying metadata info to a component class in case\n * component template has defer blocks (thus some dependencies became deferrable).\n *\n * @param type Component class where metadata should be added\n * @param dependencyLoaderFn Function that loads dependencies\n * @param metadataSetterFn Function that forms a scope in which the `setClassMetadata` is invoked\n */\nexport function setClassMetadataAsync(\n  type: Type<any>,\n  dependencyLoaderFn: () => Array<Promise<Type<unknown>>>,\n  metadataSetterFn: (...types: Type<unknown>[]) => void,\n): () => Promise<Array<Type<unknown>>> {\n  const componentClass = type as any; // cast to `any`, so that we can monkey-patch it\n  componentClass[ASYNC_COMPONENT_METADATA_FN] = () =>\n    Promise.all(dependencyLoaderFn()).then((dependencies) => {\n      metadataSetterFn(...dependencies);\n      // Metadata is now set, reset field value to indicate that this component\n      // can by used/compiled synchronously.\n      componentClass[ASYNC_COMPONENT_METADATA_FN] = null;\n\n      return dependencies;\n    });\n  return componentClass[ASYNC_COMPONENT_METADATA_FN];\n}\n\n/**\n * Adds decorator, constructor, and property metadata to a given type via static metadata fields\n * on the type.\n *\n * These metadata fields can later be read with Angular's `ReflectionCapabilities` API.\n *\n * Calls to `setClassMetadata` can be guarded by ngDevMode, resulting in the metadata assignments\n * being tree-shaken away during production builds.\n */\nexport function setClassMetadata(\n  type: Type<any>,\n  decorators: any[] | null,\n  ctorParameters: (() => any[]) | null,\n  propDecorators: {[field: string]: any} | null,\n): void {\n  return noSideEffects(() => {\n    const clazz = type as TypeWithMetadata;\n\n    if (decorators !== null) {\n      if (clazz.hasOwnProperty('decorators') && clazz.decorators !== undefined) {\n        clazz.decorators.push(...decorators);\n      } else {\n        clazz.decorators = decorators;\n      }\n    }\n    if (ctorParameters !== null) {\n      // Rather than merging, clobber the existing parameters. If other projects exist which\n      // use tsickle-style annotations and reflect over them in the same way, this could\n      // cause issues, but that is vanishingly unlikely.\n      clazz.ctorParameters = ctorParameters;\n    }\n    if (propDecorators !== null) {\n      // The property decorator objects are merged as it is possible different fields have\n      // different decorator types. Decorators on individual fields are not merged, as it's\n      // also incredibly unlikely that a field will be decorated both with an Angular\n      // decorator and a non-Angular decorator that's also been downleveled.\n      if (clazz.hasOwnProperty('propDecorators') && clazz.propDecorators !== undefined) {\n        clazz.propDecorators = {...clazz.propDecorators, ...propDecorators};\n      } else {\n        clazz.propDecorators = propDecorators;\n      }\n    }\n  }) as never;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable} from './di';\n\n@Injectable({providedIn: 'platform'})\nexport class Console {\n  log(message: string): void {\n    // tslint:disable-next-line:no-console\n    console.log(message);\n  }\n  // Note: for reporting errors use `DOM.logError()` as it is platform specific\n  warn(message: string): void {\n    console.warn(message);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../../di/injector';\nimport {EnvironmentInjector} from '../../di/r3_injector';\nimport {Type} from '../../interface/type';\nimport {assertDefined, throwError} from '../../util/assert';\nimport {assertTNode, assertTNodeForLView} from '../assert';\nimport {getComponentDef} from '../def_getters';\nimport {getNodeInjectorLView, getNodeInjectorTNode, NodeInjector} from '../di';\nimport {TNode} from '../interfaces/node';\nimport {LView} from '../interfaces/view';\nimport {EffectRef} from '../reactivity/effect';\n\nimport {\n  InjectedService,\n  InjectorCreatedInstance,\n  InjectorProfilerContext,\n  InjectorProfilerEvent,\n  InjectorProfilerEventType,\n  ProviderRecord,\n  setInjectorProfiler,\n} from './injector_profiler';\n\n/**\n * These are the data structures that our framework injector profiler will fill with data in order\n * to support DI debugging APIs.\n *\n * resolverToTokenToDependencies: Maps an injector to a Map of tokens to an Array of\n * dependencies. Injector -> Token -> Dependencies This is used to support the\n * getDependenciesFromInjectable API, which takes in an injector and a token and returns it's\n * dependencies.\n *\n * resolverToProviders: Maps a DI resolver (an Injector or a TNode) to the providers configured\n * within it This is used to support the getInjectorProviders API, which takes in an injector and\n * returns the providers that it was configured with. Note that for the element injector case we\n * use the TNode instead of the LView as the DI resolver. This is because the registration of\n * providers happens only once per type of TNode. If an injector is created with an identical TNode,\n * the providers for that injector will not be reconfigured.\n *\n * standaloneInjectorToComponent: Maps the injector of a standalone component to the standalone\n * component that it is associated with. Used in the getInjectorProviders API, specificially in the\n * discovery of import paths for each provider. This is necessary because the imports array of a\n * standalone component is processed and configured in its standalone injector, but exists within\n * the component's definition. Because getInjectorProviders takes in an injector, if that injector\n * is the injector of a standalone component, we need to be able to discover the place where the\n * imports array is located (the component) in order to flatten the imports array within it to\n * discover all of it's providers.\n *\n *\n * All of these data structures are instantiated with WeakMaps. This will ensure that the presence\n * of any object in the keys of these maps does not prevent the garbage collector from collecting\n * those objects. Because of this property of WeakMaps, these data structures will never be the\n * source of a memory leak.\n *\n * An example of this advantage: When components are destroyed, we don't need to do\n * any additional work to remove that component from our mappings.\n *\n */\nclass DIDebugData {\n  resolverToTokenToDependencies = new WeakMap<\n    Injector | LView,\n    WeakMap<Type<unknown>, InjectedService[]>\n  >();\n  resolverToProviders = new WeakMap<Injector | TNode, ProviderRecord[]>();\n  resolverToEffects = new WeakMap<Injector | LView, EffectRef[]>();\n  standaloneInjectorToComponent = new WeakMap<Injector, Type<unknown>>();\n\n  reset() {\n    this.resolverToTokenToDependencies = new WeakMap<\n      Injector | LView,\n      WeakMap<Type<unknown>, InjectedService[]>\n    >();\n    this.resolverToProviders = new WeakMap<Injector | TNode, ProviderRecord[]>();\n    this.standaloneInjectorToComponent = new WeakMap<Injector, Type<unknown>>();\n  }\n}\n\nlet frameworkDIDebugData = new DIDebugData();\n\nexport function getFrameworkDIDebugData(): DIDebugData {\n  return frameworkDIDebugData;\n}\n\n/**\n * Initalize default handling of injector events. This handling parses events\n * as they are emitted and constructs the data structures necessary to support\n * some of debug APIs.\n *\n * See handleInjectEvent, handleCreateEvent and handleProviderConfiguredEvent\n * for descriptions of each handler\n *\n * Supported APIs:\n *               - getDependenciesFromInjectable\n *               - getInjectorProviders\n */\nexport function setupFrameworkInjectorProfiler(): void {\n  frameworkDIDebugData.reset();\n  setInjectorProfiler((injectorProfilerEvent) =>\n    handleInjectorProfilerEvent(injectorProfilerEvent),\n  );\n}\n\nfunction handleInjectorProfilerEvent(injectorProfilerEvent: InjectorProfilerEvent): void {\n  const {context, type} = injectorProfilerEvent;\n\n  if (type === InjectorProfilerEventType.Inject) {\n    handleInjectEvent(context, injectorProfilerEvent.service);\n  } else if (type === InjectorProfilerEventType.InstanceCreatedByInjector) {\n    handleInstanceCreatedByInjectorEvent(context, injectorProfilerEvent.instance);\n  } else if (type === InjectorProfilerEventType.ProviderConfigured) {\n    handleProviderConfiguredEvent(context, injectorProfilerEvent.providerRecord);\n  } else if (type === InjectorProfilerEventType.EffectCreated) {\n    handleEffectCreatedEvent(context, injectorProfilerEvent.effect);\n  }\n}\n\nfunction handleEffectCreatedEvent(context: InjectorProfilerContext, effect: EffectRef): void {\n  const diResolver = getDIResolver(context.injector);\n  if (diResolver === null) {\n    throwError('An EffectCreated event must be run within an injection context.');\n  }\n\n  const {resolverToEffects} = frameworkDIDebugData;\n\n  if (!resolverToEffects.has(diResolver)) {\n    resolverToEffects.set(diResolver, []);\n  }\n\n  resolverToEffects.get(diResolver)!.push(effect);\n}\n\n/**\n *\n * Stores the injected service in frameworkDIDebugData.resolverToTokenToDependencies\n * based on it's injector and token.\n *\n * @param context InjectorProfilerContext the injection context that this event occurred in.\n * @param data InjectedService the service associated with this inject event.\n *\n */\nfunction handleInjectEvent(context: InjectorProfilerContext, data: InjectedService) {\n  const diResolver = getDIResolver(context.injector);\n  if (diResolver === null) {\n    throwError('An Inject event must be run within an injection context.');\n  }\n\n  const diResolverToInstantiatedToken = frameworkDIDebugData.resolverToTokenToDependencies;\n\n  if (!diResolverToInstantiatedToken.has(diResolver)) {\n    diResolverToInstantiatedToken.set(diResolver, new WeakMap<Type<unknown>, InjectedService[]>());\n  }\n\n  // if token is a primitive type, ignore this event. We do this because we cannot keep track of\n  // non-primitive tokens in WeakMaps since they are not garbage collectable.\n  if (!canBeHeldWeakly(context.token)) {\n    return;\n  }\n\n  const instantiatedTokenToDependencies = diResolverToInstantiatedToken.get(diResolver)!;\n  if (!instantiatedTokenToDependencies.has(context.token!)) {\n    instantiatedTokenToDependencies.set(context.token!, []);\n  }\n\n  const {token, value, flags} = data;\n\n  assertDefined(context.token, 'Injector profiler context token is undefined.');\n\n  const dependencies = instantiatedTokenToDependencies.get(context.token);\n  assertDefined(dependencies, 'Could not resolve dependencies for token.');\n\n  if (context.injector instanceof NodeInjector) {\n    dependencies.push({token, value, flags, injectedIn: getNodeInjectorContext(context.injector)});\n  } else {\n    dependencies.push({token, value, flags});\n  }\n}\n\n/**\n *\n * Returns the LView and TNode associated with a NodeInjector. Returns undefined if the injector\n * is not a NodeInjector.\n *\n * @param injector\n * @returns {lView: LView, tNode: TNode}|undefined\n */\nfunction getNodeInjectorContext(injector: Injector): {lView: LView; tNode: TNode} | undefined {\n  if (!(injector instanceof NodeInjector)) {\n    throwError('getNodeInjectorContext must be called with a NodeInjector');\n  }\n\n  const lView = getNodeInjectorLView(injector);\n  const tNode = getNodeInjectorTNode(injector);\n  if (tNode === null) {\n    return;\n  }\n\n  assertTNodeForLView(tNode, lView);\n\n  return {lView, tNode};\n}\n\n/**\n *\n * If the created instance is an instance of a standalone component, maps the injector to that\n * standalone component in frameworkDIDebugData.standaloneInjectorToComponent\n *\n * @param context InjectorProfilerContext the injection context that this event occurred in.\n * @param data InjectorCreatedInstance an object containing the instance that was just created\n *\n */\nfunction handleInstanceCreatedByInjectorEvent(\n  context: InjectorProfilerContext,\n  data: InjectorCreatedInstance,\n): void {\n  const {value} = data;\n\n  if (getDIResolver(context.injector) === null) {\n    throwError('An InjectorCreatedInstance event must be run within an injection context.');\n  }\n\n  // if our value is an instance of a standalone component, map the injector of that standalone\n  // component to the component class. Otherwise, this event is a noop.\n  let standaloneComponent: Type<unknown> | undefined | null = undefined;\n  if (typeof value === 'object') {\n    standaloneComponent = value?.constructor as Type<unknown> | undefined | null;\n  }\n\n  // We want to also cover if `standaloneComponent === null` in addition to `undefined`\n  if (standaloneComponent == undefined || !isStandaloneComponent(standaloneComponent)) {\n    return;\n  }\n\n  const environmentInjector: EnvironmentInjector | null = context.injector.get(\n    EnvironmentInjector,\n    null,\n    {optional: true},\n  );\n  // Standalone components should have an environment injector. If one cannot be\n  // found we may be in a test case for low level functionality that did not explicitly\n  // setup this injector. In those cases, we simply ignore this event.\n  if (environmentInjector === null) {\n    return;\n  }\n\n  const {standaloneInjectorToComponent} = frameworkDIDebugData;\n\n  // If our injector has already been mapped, as is the case\n  // when a standalone component imports another standalone component,\n  // we consider the original component (the component doing the importing)\n  // as the component connected to our injector.\n  if (standaloneInjectorToComponent.has(environmentInjector)) {\n    return;\n  }\n  // If our injector hasn't been mapped, then we map it to the standalone component\n  standaloneInjectorToComponent.set(environmentInjector, standaloneComponent);\n}\n\nfunction isStandaloneComponent(value: Type<unknown>): boolean {\n  const def = getComponentDef(value);\n  return !!def?.standalone;\n}\n\n/**\n *\n * Stores the emitted ProviderRecords from the InjectorProfilerEventType.ProviderConfigured\n * event in frameworkDIDebugData.resolverToProviders\n *\n * @param context InjectorProfilerContext the injection context that this event occurred in.\n * @param data ProviderRecord an object containing the instance that was just created\n *\n */\nfunction handleProviderConfiguredEvent(\n  context: InjectorProfilerContext,\n  data: ProviderRecord,\n): void {\n  const {resolverToProviders} = frameworkDIDebugData;\n\n  let diResolver: Injector | TNode;\n  if (context?.injector instanceof NodeInjector) {\n    diResolver = getNodeInjectorTNode(context.injector) as TNode;\n  } else {\n    diResolver = context.injector;\n  }\n\n  if (diResolver === null) {\n    throwError('A ProviderConfigured event must be run within an injection context.');\n  }\n\n  if (!resolverToProviders.has(diResolver)) {\n    resolverToProviders.set(diResolver, []);\n  }\n\n  resolverToProviders.get(diResolver)!.push(data);\n}\n\nfunction getDIResolver(injector: Injector | undefined): Injector | LView | null {\n  let diResolver: Injector | LView | null = null;\n\n  if (injector === undefined) {\n    return diResolver;\n  }\n\n  // We use the LView as the diResolver for NodeInjectors because they\n  // do not persist anywhere in the framework. They are simply wrappers around an LView and a TNode\n  // that do persist. Because of this, we rely on the LView of the NodeInjector in order to use\n  // as a concrete key to represent this injector. If we get the same LView back later, we know\n  // we're looking at the same injector.\n  if (injector instanceof NodeInjector) {\n    diResolver = getNodeInjectorLView(injector);\n  }\n  // Other injectors can be used a keys for a map because their instances\n  // persist\n  else {\n    diResolver = injector;\n  }\n\n  return diResolver;\n}\n\n// inspired by\n// https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-canbeheldweakly\nfunction canBeHeldWeakly(value: any): boolean {\n  // we check for value !== null here because typeof null === 'object\n  return (\n    value !== null &&\n    (typeof value === 'object' || typeof value === 'function' || typeof value === 'symbol')\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NotificationSource} from '../../change_detection/scheduling/zoneless_scheduling';\nimport {assertDefined} from '../../util/assert';\nimport {getComponentViewByInstance} from '../context_discovery';\nimport {detectChangesInternal} from '../instructions/change_detection';\nimport {markViewDirty} from '../instructions/mark_view_dirty';\nimport {FLAGS, LViewFlags} from '../interfaces/view';\n\nimport {getRootComponents} from './discovery_utils';\n\n/**\n * Marks a component for check (in case of OnPush components) and synchronously\n * performs change detection on the application this component belongs to.\n *\n * @param component Component to {@link /api/core/ChangeDetectorRef#markForCheck mark for check}\n *\n * @publicApi\n */\nexport function applyChanges(component: {}): void {\n  ngDevMode && assertDefined(component, 'component');\n  markViewDirty(getComponentViewByInstance(component), NotificationSource.DebugApplyChanges);\n  getRootComponents(component).forEach((rootComponent) => detectChanges(rootComponent));\n}\n\n/**\n * Synchronously perform change detection on a component (and possibly its sub-components).\n *\n * This function triggers change detection in a synchronous way on a component.\n *\n * @param component The component which the change detection should be performed on.\n */\nfunction detectChanges(component: {}): void {\n  const view = getComponentViewByInstance(component);\n  view[FLAGS] |= LViewFlags.RefreshView;\n  detectChangesInternal(view);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {CONTAINER_HEADER_OFFSET} from '../render3/interfaces/container';\nimport {TNode} from '../render3/interfaces/node';\nimport {isLContainer, isLView} from '../render3/interfaces/type_checks';\nimport {HEADER_OFFSET, LView, TVIEW} from '../rend   er3/interfaces/view';\n\nimport {DehydratedDeferBlock, TDeferBlockDetails} from './interfaces';\nimport {getTDeferBlockDetails, isTDeferBlockDetails} from './utils';\n\n/**\n * Defer block instance for testing.\n */\nexport interface DeferBlockDetails extends DehydratedDeferBlock {\n  tDetails: TDeferBlockDetails;\n}\n\n/**\n * Retrieves all defer blocks in a given LView.\n *\n * @param lView lView with defer blocks\n * @param deferBlocks defer block aggregator array\n */\nexport function getDeferBlocks(lView: LView, deferBlocks: DeferBlockDetails[]) {\n  const tView = lView[TVIEW];\n  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {\n    if (isLContainer(lView[i])) {\n      const lContainer = lView[i];\n      // An LContainer may represent an instance of a defer block, in which case\n      // we store it as a result. Otherwise, keep iterating over LContainer views and\n      // look for defer blocks.\n      const isLast = i === tView.bindingStartIndex - 1;\n      if (!isLast) {\n        const tNode = tView.data[i] as TNode;\n        const tDetails = getTDeferBlockDetails(tView, tNode);\n        if (isTDeferBlockDetails(tDetails)) {\n          deferBlocks.push({lContainer, lView, tNode, tDetails});\n          // This LContainer represents a defer block, so we exit\n          // this iteration and don't inspect views in this LContainer.\n          continue;\n        }\n      }\n      for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {\n        getDeferBlocks(lContainer[i] as LView, deferBlocks);\n      }\n    } else if (isLView(lView[i])) {\n      // This is a component, enter the `getDeferBlocks` recursively.\n      getDeferBlocks(lView[i], deferBlocks);\n    }\n  }\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DeferBlockDetails, getDeferBlocks as getDeferBlocksInternal} from '../../defer/discovery';\nimport {\n  DEFER_BLOCK_STATE,\n  DeferBlockInternalState,\n  DeferBlockState,\n  DeferBlockTrigger,\n  LDeferBlockDetails,\n  LOADING_AFTER_SLOT,\n  MINIMUM_SLOT,\n  SSR_UNIQUE_ID,\n  TDeferBlockDetails,\n} from '../../defer/interfaces';\nimport {DEHYDRATED_BLOCK_REGISTRY, DehydratedBlockRegistry} from '../../defer/registry';\nimport {getLDeferBlockDetails} from '../../defer/utils';\nimport {assertLView} from '../assert';\nimport {collectNativeNodes} from '../collect_native_nodes';\nimport {getLContext} from '../context_discovery';\nimport {CONTAINER_HEADER_OFFSET} from '../interfaces/container';\nimport {INJECTOR, LView, TVIEW} from '../interfaces/view';\nimport {getNativeByTNode} from './view_utils';\n\n/** Retrieved information about a `@defer` block. */\ninterface DeferBlockData {\n  /** Current state of the block. */\n  state: 'placeholder' | 'loading' | 'complete' | 'error' | 'initial';\n\n  /** Hydration state of the block. */\n  incrementalHydrationState: 'not-configured' | 'hydrated' | 'dehydrated';\n\n  /** Wherther the block has a connected `@error` block. */\n  hasErrorBlock: boolean;\n\n  /** Information about the connected `@loading` block. */\n  loadingBlock: {\n    /** Whether the block is defined. */\n    exists: boolean;\n\n    /** Minimum amount of milliseconds that the block should be shown. */\n    minimumTime: number | null;\n\n    /** Amount of time after which the block should be shown. */\n    afterTime: number | null;\n  };\n\n  /** Information about the connected `@placeholder` block. */\n  placeholderBlock: {\n    /** Whether the block is defined. */\n    exists: boolean;\n\n    /** Minimum amount of time that block should be shown. */\n    minimumTime: number | null;\n  };\n\n  /** Stringified version of the block's triggers. */\n  triggers: string[];\n\n  /** Element root nodes that are currently being shown in the block. */\n  rootNodes: Node[];\n}\n\n/**\n * Gets all of the `@defer` blocks that are present inside the specified DOM node.\n * @param node Node in which to look for `@defer` blocks.\n *\n * @publicApi\n */\nexport function getDeferBlocks(node: Node): DeferBlockData[] {\n  const results: DeferBlockData[] = [];\n  const lView = getLContext(node)?.lView;\n\n  if (lView) {\n    findDeferBlocks(node, lView, results);\n  }\n\n  return results;\n}\n\n/**\n * Finds all the `@defer` blocks inside a specific node and view.\n * @param node Node in which to search for blocks.\n * @param lView View within the node in which to search for blocks.\n * @param results Array to which to add blocks once they're found.\n */\nfunction findDeferBlocks(node: Node, lView: LView, results: DeferBlockData[]) {\n  const registry = lView[INJECTOR].get(DEHYDRATED_BLOCK_REGISTRY, null, {optional: true});\n  const blocks: DeferBlockDetails[] = [];\n  getDeferBlocksInternal(lView, blocks);\n\n  for (const details of blocks) {\n    const native = getNativeByTNode(details.tNode, details.lView);\n    const lDetails = getLDeferBlockDetails(details.lView, details.tNode);\n\n    // The LView from `getLContext` might be the view the element is placed in.\n    // Filter out defer blocks that aren't inside the specified root node.\n    if (!node.contains(native as Node)) {\n      continue;\n    }\n\n    const tDetails = details.tDetails;\n    const renderedLView = getRendererLView(details);\n    const rootNodes: Node[] = [];\n\n    if (renderedLView !== null) {\n      collectNativeNodes(\n        renderedLView[TVIEW],\n        renderedLView,\n        renderedLView[TVIEW].firstChild,\n        rootNodes,\n      );\n    }\n\n    const data: DeferBlockData = {\n      state: stringifyState(lDetails[DEFER_BLOCK_STATE]),\n      incrementalHydrationState: inferHydrationState(tDetails, lDetails, registry),\n      hasErrorBlock: tDetails.errorTmplIndex !== null,\n      loadingBlock: {\n        exists: tDetails.loadingTmplIndex !== null,\n        minimumTime: tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null,\n        afterTime: tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null,\n      },\n      placeholderBlock: {\n        exists: tDetails.placeholderTmplIndex !== null,\n        minimumTime: tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null,\n      },\n      triggers: tDetails.debug?.triggers ? Array.from(tDetails.debug.triggers).sort() : [],\n      rootNodes,\n    };\n\n    results.push(data);\n\n    // `getDeferBlocks` does not resolve nested defer blocks so we have to recurse manually.\n    if (renderedLView !== null) {\n      findDeferBlocks(node, renderedLView, results);\n    }\n  }\n}\n\n/**\n * Turns the `DeferBlockState` into a string which is more readable than the enum form.\n *\n * @param lDetails Information about the\n * @returns\n */\nfunction stringifyState(state: DeferBlockState | DeferBlockInternalState): DeferBlockData['state'] {\n  switch (state) {\n    case DeferBlockState.Complete:\n      return 'complete';\n    case DeferBlockState.Loading:\n      return 'loading';\n    case DeferBlockState.Placeholder:\n      return 'placeholder';\n    case DeferBlockState.Error:\n      return 'error';\n    case DeferBlockInternalState.Initial:\n      return 'initial';\n    default:\n      throw new Error(`Unrecognized state ${state}`);\n  }\n}\n\n/**\n * Infers the hydration state of a specific defer block.\n * @param tDetails Static defer block information.\n * @param lDetails Instance defer block information.\n * @param registry Registry coordinating the hydration of defer blocks.\n */\nfunction inferHydrationState(\n  tDetails: TDeferBlockDetails,\n  lDetails: LDeferBlockDetails,\n  registry: DehydratedBlockRegistry | null,\n): DeferBlockData['incrementalHydrationState'] {\n  if (\n    registry === null ||\n    lDetails[SSR_UNIQUE_ID] === null ||\n    tDetails.hydrateTriggers === null ||\n    tDetails.hydrateTriggers.has(DeferBlockTrigger.Never)\n  ) {\n    return 'not-configured';\n  }\n  return registry.has(lDetails[SSR_UNIQUE_ID]) ? 'dehydrated' : 'hydrated';\n}\n\n/**\n * Gets the current LView that is rendered out in a defer block.\n * @param details Instance information about the block.\n */\nfunction getRendererLView(details: DeferBlockDetails): LView | null {\n  // Defer block containers can only ever contain one view.\n  // If they're empty, it means that nothing is rendered.\n  if (details.lContainer.length <= CONTAINER_HEADER_OFFSET) {\n    return null;\n  }\n\n  const lView = details.lContainer[CONTAINER_HEADER_OFFSET];\n  ngDevMode && assertLView(lView);\n  return lView;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ENVIRONMENT_INITIALIZER} from '../../di/initializer_token';\nimport {InjectionToken} from '../../di/injection_token';\nimport {Injector} from '../../di/injector';\nimport {getInjectorDef, InjectorType} from '../../di/interface/defs';\nimport {InternalInjectFlags} from '../../di/interface/injector';\nimport {ValueProvider} from '../../di/interface/provider';\nimport {INJECTOR_DEF_TYPES} from '../../di/internal_tokens';\nimport {NullInjector} from '../../di/null_injector';\nimport {SingleProvider, walkProviderTree} from '../../di/provider_collection';\nimport {EnvironmentInjector, R3Injector} from '../../di/r3_injector';\nimport {Type} from '../../interface/type';\nimport {NgModuleRef as viewEngine_NgModuleRef} from '../../linker/ng_module_factory';\nimport {deepForEach} from '../../util/array_utils';\nimport {throwError} from '../../util/assert';\nimport {assertTNode, assertTNodeForLView} from '../assert';\nimport {ChainedInjector} from '../chained_injector';\nimport {getFrameworkDIDebugData} from '../debug/framework_injector_profiler';\nimport {InjectedService, ProviderRecord} from '../debug/injector_profiler';\nimport {getComponentDef} from '../def_getters';\nimport {\n  getNodeInjectorLView,\n  getNodeInjectorTNode,\n  getParentInjectorLocation,\n  NodeInjector,\n} from '../di';\nimport {NodeInjectorOffset} from '../interfaces/injector';\nimport {TContainerNode, TElementContainerNode, TElementNode, TNode} from '../interfaces/node';\nimport {RElement} from '../interfaces/renderer_dom';\nimport {INJECTOR, LView, TVIEW} from '../interfaces/view';\n\nimport {getParentInjectorIndex, getParentInjectorView, hasParentInjector} from './injector_utils';\nimport {getNativeByTNode} from './view_utils';\n\n/**\n * Discovers the dependencies of an injectable instance. Provides DI information about each\n * dependency that the injectable was instantiated with, including where they were provided from.\n *\n * @param injector An injector instance\n * @param token a DI token that was constructed by the given injector instance\n * @returns an object that contains the created instance of token as well as all of the dependencies\n * that it was instantiated with OR undefined if the token was not created within the given\n * injector.\n */\nexport function getDependenciesFromInjectable<T>(\n  injector: Injector,\n  token: Type<T> | InjectionToken<T>,\n): {instance: T; dependencies: Omit<InjectedService, 'injectedIn'>[]} | undefined {\n  // First we check to see if the token given maps to an actual instance in the injector given.\n  // We use `self: true` because we only want to look at the injector we were given.\n  // We use `optional: true` because it's possible that the token we were given was never\n  // constructed by the injector we were given.\n  const instance = injector.get(token, null, {self: true, optional: true});\n  if (instance === null) {\n    throw new Error(`Unable to determine instance of ${token} in given injector`);\n  }\n\n  const unformattedDependencies = getDependenciesForTokenInInjector(token, injector);\n  const resolutionPath = getInjectorResolutionPath(injector);\n\n  const dependencies = unformattedDependencies.map((dep) => {\n    // injectedIn contains private fields, so we omit it from the response\n    const formattedDependency: Omit<InjectedService, 'injectedIn'> = {\n      value: dep.value,\n    };\n\n    // convert injection flags to booleans\n    const flags = dep.flags as InternalInjectFlags;\n    formattedDependency.flags = {\n      optional: (InternalInjectFlags.Optional & flags) === InternalInjectFlags.Optional,\n      host: (InternalInjectFlags.Host & flags) === InternalInjectFlags.Host,\n      self: (InternalInjectFlags.Self & flags) === InternalInjectFlags.Self,\n      skipSelf: (InternalInjectFlags.SkipSelf & flags) === InternalInjectFlags.SkipSelf,\n    };\n\n    // find the injector that provided the dependency\n    for (let i = 0; i < resolutionPath.length; i++) {\n      const injectorToCheck = resolutionPath[i];\n\n      // if skipSelf is true we skip the first injector\n      if (i === 0 && formattedDependency.flags.skipSelf) {\n        continue;\n      }\n\n      // host only applies to NodeInjectors\n      if (formattedDependency.flags.host && injectorToCheck instanceof EnvironmentInjector) {\n        break;\n      }\n\n      const instance = injectorToCheck.get(dep.token as Type<unknown>, null, {\n        self: true,\n        optional: true,\n      });\n\n      if (instance !== null) {\n        // if host flag is true we double check that we can get the service from the first element\n        // in the resolution path by using the host flag. This is done to make sure that we've found\n        // the correct providing injector, and not a node injector that is connected to our path via\n        // a router outlet.\n        if (formattedDependency.flags.host) {\n          const firstInjector = resolutionPath[0];\n          const lookupFromFirstInjector = firstInjector.get(dep.token as Type<unknown>, null, {\n            ...formattedDependency.flags,\n            optional: true,\n          });\n\n          if (lookupFromFirstInjector !== null) {\n            formattedDependency.providedIn = injectorToCheck;\n          }\n\n          break;\n        }\n\n        formattedDependency.providedIn = injectorToCheck;\n        break;\n      }\n\n      // if self is true we stop after the first injector\n      if (i === 0 && formattedDependency.flags.self) {\n        break;\n      }\n    }\n\n    if (dep.token) formattedDependency.token = dep.token;\n\n    return formattedDependency;\n  });\n\n  return {instance, dependencies};\n}\n\nfunction getDependenciesForTokenInInjector<T>(\n  token: Type<T> | InjectionToken<T>,\n  injector: Injector,\n): InjectedService[] {\n  const {resolverToTokenToDependencies} = getFrameworkDIDebugData();\n\n  if (!(injector instanceof NodeInjector)) {\n    return resolverToTokenToDependencies.get(injector)?.get?.(token as Type<T>) ?? [];\n  }\n\n  const lView = getNodeInjectorLView(injector);\n  const tokenDependencyMap = resolverToTokenToDependencies.get(lView);\n  const dependencies = tokenDependencyMap?.get(token as Type<T>) ?? [];\n\n  // In the NodeInjector case, all injections for every node are stored in the same lView.\n  // We use the injectedIn field of the dependency to filter out the dependencies that\n  // do not come from the same node as the instance we're looking at.\n  return dependencies.filter((dependency) => {\n    const dependencyNode = dependency.injectedIn?.tNode;\n    if (dependencyNode === undefined) {\n      return false;\n    }\n\n    const instanceNode = getNodeInjectorTNode(injector);\n    assertTNode(dependencyNode);\n    assertTNode(instanceNode!);\n\n    return dependencyNode === instanceNode;\n  });\n}\n\n/**\n * Gets the class associated with an injector that contains a provider `imports` array in it's\n * definition\n *\n * For Module Injectors this returns the NgModule constructor.\n *\n * For Standalone injectors this returns the standalone component constructor.\n *\n * @param injector Injector an injector instance\n * @returns the constructor where the `imports` array that configures this injector is located\n */\nfunction getProviderImportsContainer(injector: Injector): Type<unknown> | null {\n  const {standaloneInjectorToComponent} = getFrameworkDIDebugData();\n\n  // standalone components configure providers through a component def, so we have to\n  // use the standalone component associated with this injector if Injector represents\n  // a standalone components EnvironmentInjector\n  if (standaloneInjectorToComponent.has(injector)) {\n    return standaloneInjectorToComponent.get(injector)!;\n  }\n\n  // Module injectors configure providers through their NgModule def, so we use the\n  // injector to lookup its NgModuleRef and through that grab its instance\n  const defTypeRef = injector.get(viewEngine_NgModuleRef, null, {self: true, optional: true})!;\n\n  // If we can't find an associated imports container, return null.\n  // This could be the case if this function is called with an R3Injector that does not represent\n  // a standalone component or NgModule.\n  if (defTypeRef === null) {\n    return null;\n  }\n\n  // In standalone applications, the root environment injector created by bootstrapApplication\n  // may have no associated \"instance\".\n  if (defTypeRef.instance === null) {\n    return null;\n  }\n\n  return defTypeRef.instance.constructor;\n}\n\n/**\n * Gets the providers configured on a NodeInjector\n *\n * @param injector A NodeInjector instance\n * @returns ProviderRecord[] an array of objects representing the providers configured on this\n *     injector\n */\nfunction getNodeInjectorProviders(injector: NodeInjector): ProviderRecord[] {\n  const diResolver = getNodeInjectorTNode(injector);\n  const {resolverToProviders} = getFrameworkDIDebugData();\n  return resolverToProviders.get(diResolver as TNode) ?? [];\n}\n\n/**\n * Gets a mapping of providers configured on an injector to their import paths\n *\n * ModuleA -> imports ModuleB\n * ModuleB -> imports ModuleC\n * ModuleB -> provides MyServiceA\n * ModuleC -> provides MyServiceB\n *\n * getProviderImportPaths(ModuleA)\n * > Map(2) {\n *   MyServiceA => [ModuleA, ModuleB]\n *   MyServiceB => [ModuleA, ModuleB, ModuleC]\n *  }\n *\n * @param providerImportsContainer constructor of class that contains an `imports` array in it's\n *     definition\n * @returns A Map object that maps providers to an array of constructors representing it's import\n *     path\n *\n */\nfunction getProviderImportPaths(\n  providerImportsContainer: Type<unknown>,\n): Map<SingleProvider, (Type<unknown> | InjectorType<unknown>)[]> {\n  const providerToPath = new Map<SingleProvider, (Type<unknown> | InjectorType<unknown>)[]>();\n  const visitedContainers = new Set<Type<unknown>>();\n  const visitor = walkProviderTreeToDiscoverImportPaths(providerToPath, visitedContainers);\n\n  walkProviderTree(providerImportsContainer, visitor, [], new Set());\n\n  return providerToPath;\n}\n\n/**\n *\n * Higher order function that returns a visitor for WalkProviderTree\n *\n * Takes in a Map and Set to keep track of the providers and containers\n * visited, so that we can discover the import paths of these providers\n * during the traversal.\n *\n * This visitor takes advantage of the fact that walkProviderTree performs a\n * postorder traversal of the provider tree for the passed in container. Because postorder\n * traversal recursively processes subtrees from leaf nodes until the traversal reaches the root,\n * we write a visitor that constructs provider import paths in reverse.\n *\n *\n * We use the visitedContainers set defined outside this visitor\n * because we want to run some logic only once for\n * each container in the tree. That logic can be described as:\n *\n *\n * 1. for each discovered_provider and discovered_path in the incomplete provider paths we've\n * already discovered\n * 2. get the first container in discovered_path\n * 3. if that first container is in the imports array of the container we're visiting\n *    Then the container we're visiting is also in the import path of discovered_provider, so we\n *    unshift discovered_path with the container we're currently visiting\n *\n *\n * Example Run:\n * ```\n *                 ┌──────────┐\n *                 │containerA│\n *      ┌─imports-─┤          ├──imports─┐\n *      │          │  provA   │          │\n *      │          │  provB   │          │\n *      │          └──────────┘          │\n *      │                                │\n *     ┌▼─────────┐             ┌────────▼─┐\n *     │containerB│             │containerC│\n *     │          │             │          │\n *     │  provD   │             │  provF   │\n *     │  provE   │             │  provG   │\n *     └──────────┘             └──────────┘\n * ```\n *\n * Each step of the traversal,\n *\n * ```\n * visitor(provD, containerB)\n * providerToPath === Map { provD => [containerB] }\n * visitedContainers === Set { containerB }\n *\n * visitor(provE, containerB)\n * providerToPath === Map { provD => [containerB], provE => [containerB] }\n * visitedContainers === Set { containerB }\n *\n * visitor(provF, containerC)\n * providerToPath === Map { provD => [containerB], provE => [containerB], provF => [containerC] }\n * visitedContainers === Set { containerB, containerC }\n *\n * visitor(provG, containerC)\n * providerToPath === Map {\n *   provD => [containerB], provE => [containerB], provF => [containerC], provG => [containerC]\n * }\n * visitedContainers === Set { containerB, containerC }\n *\n * visitor(provA, containerA)\n * providerToPath === Map {\n *   provD => [containerA, containerB],\n *   provE => [containerA, containerB],\n *   provF => [containerA, containerC],\n *   provG => [containerA, containerC],\n *   provA => [containerA]\n * }\n * visitedContainers === Set { containerB, containerC, containerA }\n *\n * visitor(provB, containerA)\n * providerToPath === Map {\n *   provD => [containerA, containerB],\n *   provE => [containerA, containerB],\n *   provF => [containerA, containerC],\n *   provG => [containerA, containerC],\n *   provA => [containerA]\n *   provB => [containerA]\n * }\n * visitedContainers === Set { containerB, containerC, containerA }\n * ```\n *\n * @param providerToPath Map map of providers to paths that this function fills\n * @param visitedContainers Set a set to keep track of the containers we've already visited\n * @return function(provider SingleProvider, container: Type<unknown> | InjectorType<unknown>) =>\n *     void\n */\nfunction walkProviderTreeToDiscoverImportPaths(\n  providerToPath: Map<SingleProvider, (Type<unknown> | InjectorType<unknown>)[]>,\n  visitedContainers: Set<Type<unknown>>,\n): (provider: SingleProvider, container: Type<unknown> | InjectorType<unknown>) => void {\n  return (provider: SingleProvider, container: Type<unknown> | InjectorType<unknown>) => {\n    // If the provider is not already in the providerToPath map,\n    // add an entry with the provider as the key and an array containing the current container as\n    // the value\n    if (!providerToPath.has(provider)) {\n      providerToPath.set(provider, [container]);\n    }\n\n    // This block will run exactly once for each container in the import tree.\n    // This is where we run the logic to check the imports array of the current\n    // container to see if it's the next container in the path for our currently\n    // discovered providers.\n    if (!visitedContainers.has(container)) {\n      // Iterate through the providers we've already seen\n      for (const prov of providerToPath.keys()) {\n        const existingImportPath = providerToPath.get(prov)!;\n\n        let containerDef = getInjectorDef(container);\n        if (!containerDef) {\n          const ngModule: Type<unknown> | undefined = (container as any).ngModule as\n            | Type<unknown>\n            | undefined;\n          containerDef = getInjectorDef(ngModule);\n        }\n\n        if (!containerDef) {\n          return;\n        }\n\n        const lastContainerAddedToPath = existingImportPath[0];\n\n        let isNextStepInPath = false;\n        deepForEach(containerDef.imports, (moduleImport) => {\n          if (isNextStepInPath) {\n            return;\n          }\n\n          isNextStepInPath =\n            (moduleImport as any).ngModule === lastContainerAddedToPath ||\n            moduleImport === lastContainerAddedToPath;\n\n          if (isNextStepInPath) {\n            providerToPath.get(prov)?.unshift(container);\n          }\n        });\n      }\n    }\n\n    visitedContainers.add(container);\n  };\n}\n\n/**\n * Gets the providers configured on an EnvironmentInjector\n *\n * @param injector EnvironmentInjector\n * @returns an array of objects representing the providers of the given injector\n */\nfunction getEnvironmentInjectorProviders(injector: EnvironmentInjector): ProviderRecord[] {\n  const providerRecordsWithoutImportPaths =\n    getFrameworkDIDebugData().resolverToProviders.get(injector) ?? [];\n\n  // platform injector has no provider imports container so can we skip trying to\n  // find import paths\n  if (isPlatformInjector(injector)) {\n    return providerRecordsWithoutImportPaths;\n  }\n\n  const providerImportsContainer = getProviderImportsContainer(injector);\n  if (providerImportsContainer === null) {\n    // We assume that if an environment injector exists without an associated provider imports\n    // container, it was created without such a container. Some examples cases where this could\n    // happen:\n    // - The root injector of a standalone application\n    // - A router injector created by using the providers array in a lazy loaded route\n    // - A manually created injector that is attached to the injector tree\n    // Since each of these cases has no provider container, there is no concept of import paths,\n    // so we can simply return the provider records.\n    return providerRecordsWithoutImportPaths;\n  }\n\n  const providerToPath = getProviderImportPaths(providerImportsContainer);\n  const providerRecords = [];\n\n  for (const providerRecord of providerRecordsWithoutImportPaths) {\n    const provider = providerRecord.provider;\n    // Ignore these special providers for now until we have a cleaner way of\n    // determing when they are provided by the framework vs provided by the user.\n    const token = (provider as ValueProvider).provide;\n    if (token === ENVIRONMENT_INITIALIZER || token === INJECTOR_DEF_TYPES) {\n      continue;\n    }\n\n    let importPath = providerToPath.get(provider) ?? [];\n\n    const def = getComponentDef(providerImportsContainer);\n    const isStandaloneComponent = !!def?.standalone;\n    // We prepend the component constructor in the standalone case\n    // because walkProviderTree does not visit this constructor during it's traversal\n    if (isStandaloneComponent) {\n      importPath = [providerImportsContainer, ...importPath];\n    }\n\n    providerRecords.push({...providerRecord, importPath});\n  }\n  return providerRecords;\n}\n\nfunction isPlatformInjector(injector: Injector) {\n  return injector instanceof R3Injector && injector.scopes.has('platform');\n}\n\n/**\n * Gets the providers configured on an injector.\n *\n * @param injector the injector to lookup the providers of\n * @returns ProviderRecord[] an array of objects representing the providers of the given injector\n */\nexport function getInjectorProviders(injector: Injector): ProviderRecord[] {\n  if (injector instanceof NodeInjector) {\n    return getNodeInjectorProviders(injector);\n  } else if (injector instanceof EnvironmentInjector) {\n    return getEnvironmentInjectorProviders(injector as EnvironmentInjector);\n  }\n\n  throwError('getInjectorProviders only supports NodeInjector and EnvironmentInjector');\n}\n\n/**\n *\n * Given an injector, this function will return\n * an object containing the type and source of the injector.\n *\n * |              | type        | source                                                      |\n * |--------------|-------------|-------------------------------------------------------------|\n * | NodeInjector | element     | DOM element that created this injector                      |\n * | R3Injector   | environment | `injector.source`                                           |\n * | NullInjector | null        | null                                                        |\n *\n * @param injector the Injector to get metadata for\n * @returns an object containing the type and source of the given injector. If the injector metadata\n *     cannot be determined, returns null.\n */\nexport function getInjectorMetadata(\n  injector: Injector,\n):\n  | {type: 'element'; source: RElement}\n  | {type: 'environment'; source: string | null}\n  | {type: 'null'; source: null}\n  | null {\n  if (injector instanceof NodeInjector) {\n    const lView = getNodeInjectorLView(injector);\n    const tNode = getNodeInjectorTNode(injector)!;\n    assertTNodeForLView(tNode, lView);\n\n    return {type: 'element', source: getNativeByTNode(tNode, lView) as RElement};\n  }\n\n  if (injector instanceof R3Injector) {\n    return {type: 'environment', source: injector.source ?? null};\n  }\n\n  if (injector instanceof NullInjector) {\n    return {type: 'null', source: null};\n  }\n\n  return null;\n}\n\nexport function getInjectorResolutionPath(injector: Injector): Injector[] {\n  const resolutionPath: Injector[] = [injector];\n  getInjectorResolutionPathHelper(injector, resolutionPath);\n  return resolutionPath;\n}\n\nfunction getInjectorResolutionPathHelper(\n  injector: Injector,\n  resolutionPath: Injector[],\n): Injector[] {\n  const parent = getInjectorParent(injector);\n\n  // if getInjectorParent can't find a parent, then we've either reached the end\n  // of the path, or we need to move from the Element Injector tree to the\n  // module injector tree using the first injector in our path as the connection point.\n  if (parent === null) {\n    if (injector instanceof NodeInjector) {\n      const firstInjector = resolutionPath[0];\n      if (firstInjector instanceof NodeInjector) {\n        const moduleInjector = getModuleInjectorOfNodeInjector(firstInjector);\n        if (moduleInjector === null) {\n          throwError('NodeInjector must have some connection to the module injector tree');\n        }\n\n        resolutionPath.push(moduleInjector);\n        getInjectorResolutionPathHelper(moduleInjector, resolutionPath);\n      }\n\n      return resolutionPath;\n    }\n  } else {\n    resolutionPath.push(parent);\n    getInjectorResolutionPathHelper(parent, resolutionPath);\n  }\n\n  return resolutionPath;\n}\n\n/**\n * Gets the parent of an injector.\n *\n * This function is not able to make the jump from the Element Injector Tree to the Module\n * injector tree. This is because the \"parent\" (the next step in the reoslution path)\n * of a root NodeInjector is dependent on which NodeInjector ancestor initiated\n * the DI lookup. See getInjectorResolutionPath for a function that can make this jump.\n *\n * In the below diagram:\n * ```ts\n * getInjectorParent(NodeInjectorB)\n *  > NodeInjectorA\n * getInjectorParent(NodeInjectorA) // or getInjectorParent(getInjectorParent(NodeInjectorB))\n *  > null // cannot jump to ModuleInjector tree\n * ```\n *\n * ```\n *                ┌───────┐                ┌───────────────────┐\n *    ┌───────────┤ModuleA├───Injector────►│EnvironmentInjector│\n *    │           └───┬───┘                └───────────────────┘\n *    │               │\n *    │           bootstraps\n *    │               │\n *    │               │\n *    │          ┌────▼─────┐                 ┌─────────────┐\n * declares      │ComponentA├────Injector────►│NodeInjectorA│\n *    │          └────┬─────┘                 └─────▲───────┘\n *    │               │                             │\n *    │            renders                        parent\n *    │               │                             │\n *    │          ┌────▼─────┐                 ┌─────┴───────┐\n *    └─────────►│ComponentB├────Injector────►│NodeInjectorB│\n *               └──────────┘                 └─────────────┘\n *```\n *\n * @param injector an Injector to get the parent of\n * @returns Injector the parent of the given injector\n */\nfunction getInjectorParent(injector: Injector): Injector | null {\n  if (injector instanceof R3Injector) {\n    return injector.parent;\n  }\n\n  let tNode: TElementNode | TContainerNode | TElementContainerNode | null;\n  let lView: LView<unknown>;\n  if (injector instanceof NodeInjector) {\n    tNode = getNodeInjectorTNode(injector);\n    lView = getNodeInjectorLView(injector);\n  } else if (injector instanceof NullInjector) {\n    return null;\n  } else if (injector instanceof ChainedInjector) {\n    return injector.parentInjector;\n  } else {\n    throwError(\n      'getInjectorParent only support injectors of type R3Injector, NodeInjector, NullInjector',\n    );\n  }\n\n  const parentLocation = getParentInjectorLocation(\n    tNode as TElementNode | TContainerNode | TElementContainerNode,\n    lView,\n  );\n\n  if (hasParentInjector(parentLocation)) {\n    const parentInjectorIndex = getParentInjectorIndex(parentLocation);\n    const parentLView = getParentInjectorView(parentLocation, lView);\n    const parentTView = parentLView[TVIEW];\n    const parentTNode = parentTView.data[parentInjectorIndex + NodeInjectorOffset.TNODE] as TNode;\n    return new NodeInjector(\n      parentTNode as TElementNode | TContainerNode | TElementContainerNode,\n      parentLView,\n    );\n  } else {\n    const chainedInjector = lView[INJECTOR] as ChainedInjector;\n\n    // Case where chainedInjector.injector is an OutletInjector and chainedInjector.injector.parent\n    // is a NodeInjector.\n    // todo(aleksanderbodurri): ideally nothing in packages/core should deal\n    // directly with router concerns. Refactor this so that we can make the jump from\n    // NodeInjector -> OutletInjector -> NodeInjector\n    // without explicitly relying on types contracts from packages/router\n    const injectorParent = (chainedInjector.injector as any)?.parent as Injector;\n\n    if (injectorParent instanceof NodeInjector) {\n      return injectorParent;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Gets the module injector of a NodeInjector.\n *\n * @param injector NodeInjector to get module injector of\n * @returns Injector representing module injector of the given NodeInjector\n */\nfunction getModuleInjectorOfNodeInjector(injector: NodeInjector): Injector {\n  let lView: LView<unknown>;\n  if (injector instanceof NodeInjector) {\n    lView = getNodeInjectorLView(injector);\n  } else {\n    throwError('getModuleInjectorOfNodeInjector must be called with a NodeInjector');\n  }\n\n  const inj = lView[INJECTOR] as R3Injector | ChainedInjector;\n  const moduleInjector = inj instanceof ChainedInjector ? inj.parentInjector : inj.parent;\n  if (!moduleInjector) {\n    throwError('NodeInjector must have some connection to the module injector tree');\n  }\n\n  return moduleInjector;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {\n  REACTIVE_LVIEW_CONSUMER_NODE,\n  ReactiveLViewConsumer,\n  TEMPORARY_CONSUMER_NODE,\n} from '../reactive_lview_consumer';\nimport {assertTNode, assertLView} from '../assert';\nimport {getFrameworkDIDebugData} from '../debug/framework_injector_profiler';\nimport {NodeInjector, getNodeInjectorTNode, getNodeInjectorLView} from '../di';\nimport {REACTIVE_TEMPLATE_CONSUMER, HOST, LView} from '../interfaces/view';\nimport {EffectNode, EffectRefImpl, ROOT_EFFECT_NODE, VIEW_EFFECT_NODE} from '../reactivity/effect';\nimport {Injector} from '../../di/injector';\nimport {R3Injector} from '../../di/r3_injector';\nimport {throwError} from '../../util/assert';\nimport {\n  ComputedNode,\n  ReactiveNode,\n  SIGNAL,\n  SIGNAL_NODE,\n  SignalNode,\n} from '../../../primitives/signals';\n\nexport interface DebugSignalGraphNode {\n  kind: string;\n  label?: string;\n  value?: unknown;\n}\n\nexport interface DebugSignalGraphEdge {\n  /**\n   * Index of a signal node in the `nodes` array that is a consumer of the signal produced by the producer node.\n   */\n  consumer: number;\n\n  /**\n   * Index of a signal node in the `nodes` array that is a producer of the signal consumed by the consumer node.\n   */\n  producer: number;\n}\n\n/**\n * A debug representation of the signal graph.\n */\nexport interface DebugSignalGraph {\n  nodes: DebugSignalGraphNode[];\n  edges: DebugSignalGraphEdge[];\n}\n\nfunction isComputedNode(node: ReactiveNode): node is ComputedNode<unknown> {\n  return node.kind === 'computed';\n}\n\nfunction isTemplateEffectNode(node: ReactiveNode): node is ReactiveLViewConsumer {\n  return node.kind === 'template';\n}\n\nfunction isEffectNode(node: ReactiveNode): node is EffectNode {\n  return node.kind === 'effect';\n}\n\nfunction isSignalNode(node: ReactiveNode): node is SignalNode<unknown> {\n  return node.kind === 'signal';\n}\n\n/**\n *\n * @param injector\n * @returns Template consumer of given NodeInjector\n */\nfunction getTemplateConsumer(injector: NodeInjector): ReactiveLViewConsumer | null {\n  const tNode = getNodeInjectorTNode(injector)!;\n  assertTNode(tNode);\n  const lView = getNodeInjectorLView(injector)!;\n  assertLView(lView);\n  const templateLView = lView[tNode.index]!;\n  assertLView(templateLView);\n\n  return templateLView[REACTIVE_TEMPLATE_CONSUMER];\n}\n\nfunction getNodesAndEdgesFromSignalMap(signalMap: ReadonlyMap<ReactiveNode, ReactiveNode[]>): {\n  nodes: DebugSignalGraphNode[];\n  edges: DebugSignalGraphEdge[];\n} {\n  const nodes = Array.from(signalMap.keys());\n  const debugSignalGraphNodes: DebugSignalGraphNode[] = [];\n  const edges: DebugSignalGraphEdge[] = [];\n\n  for (const [consumer, producers] of signalMap.entries()) {\n    const consumerIndex = nodes.indexOf(consumer);\n\n    // collect node\n    if (isComputedNode(consumer) || isSignalNode(consumer)) {\n      debugSignalGraphNodes.push({\n        label: consumer.debugName,\n        value: consumer.value,\n        kind: consumer.kind,\n      });\n    } else if (isTemplateEffectNode(consumer)) {\n      debugSignalGraphNodes.push({\n        label: consumer.debugName ?? consumer.lView?.[HOST]?.tagName?.toLowerCase?.(),\n        kind: consumer.kind,\n      });\n    } else if (isEffectNode(consumer)) {\n      debugSignalGraphNodes.push({\n        label: consumer.debugName,\n        kind: consumer.kind,\n      });\n    } else {\n      debugSignalGraphNodes.push({\n        label: consumer.debugName,\n        kind: consumer.kind,\n      });\n    }\n\n    // collect edges for node\n    for (const producer of producers) {\n      edges.push({consumer: consumerIndex, producer: nodes.indexOf(producer)});\n    }\n  }\n\n  return {nodes: debugSignalGraphNodes, edges};\n}\n\nfunction extractEffectsFromInjector(injector: Injector): ReactiveNode[] {\n  let diResolver: Injector | LView<unknown> = injector;\n  if (injector instanceof NodeInjector) {\n    const lView = getNodeInjectorLView(injector)!;\n    diResolver = lView;\n  }\n\n  const resolverToEffects = getFrameworkDIDebugData().resolverToEffects as Map<\n    Injector | LView<unknown>,\n    EffectRefImpl[]\n  >;\n  const effects = resolverToEffects.get(diResolver) ?? [];\n\n  return effects.map((effect: EffectRefImpl) => effect[SIGNAL]);\n}\n\nfunction extractSignalNodesAndEdgesFromRoots(\n  nodes: ReactiveNode[],\n  signalDependenciesMap: Map<ReactiveNode, ReactiveNode[]> = new Map(),\n): Map<ReactiveNode, ReactiveNode[]> {\n  for (const node of nodes) {\n    if (signalDependenciesMap.has(node)) {\n      continue;\n    }\n\n    const producerNodes = (node.producerNode ?? []) as ReactiveNode[];\n    signalDependenciesMap.set(node, producerNodes);\n    extractSignalNodesAndEdgesFromRoots(producerNodes, signalDependenciesMap);\n  }\n\n  return signalDependenciesMap;\n}\n\n/**\n * Returns a debug representation of the signal graph for the given injector.\n *\n * Currently only supports element injectors. Starts by discovering the consumer nodes\n * and then traverses their producer nodes to build the signal graph.\n *\n * @param injector The injector to get the signal graph for.\n * @returns A debug representation of the signal graph.\n * @throws If the injector is an environment injector.\n */\nexport function getSignalGraph(injector: Injector): DebugSignalGraph {\n  let templateConsumer: ReactiveLViewConsumer | null = null;\n\n  if (!(injector instanceof NodeInjector) && !(injector instanceof R3Injector)) {\n    return throwError('getSignalGraph must be called with a NodeInjector or R3Injector');\n  }\n\n  if (injector instanceof NodeInjector) {\n    templateConsumer = getTemplateConsumer(injector as NodeInjector);\n  }\n\n  const nonTemplateEffectNodes = extractEffectsFromInjector(injector);\n\n  const signalNodes = templateConsumer\n    ? [templateConsumer, ...nonTemplateEffectNodes]\n    : nonTemplateEffectNodes;\n\n  const signalDependenciesMap = extractSignalNodesAndEdgesFromRoots(signalNodes);\n\n  return getNodesAndEdgesFromSignalMap(signalDependenciesMap);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/// <reference path=\"../../../../goog.d.ts\" />\n\nimport {assertDefined} from '../../util/assert';\nimport {global} from '../../util/global';\nimport {setupFrameworkInjectorProfiler} from '../debug/framework_injector_profiler';\nimport {setProfiler} from '../profiler';\nimport {isSignal} from '../reactivity/api';\n\nimport {applyChanges} from './change_detection_utils';\nimport {getDeferBlocks} from './defer';\nimport {\n  getComponent,\n  getContext,\n  getDirectiveMetadata,\n  getDirectives,\n  getHostElement,\n  getInjector,\n  getListeners,\n  getOwningComponent,\n  getRootComponents,\n} from './discovery_utils';\nimport {\n  getDependenciesFromInjectable,\n  getInjectorMetadata,\n  getInjectorProviders,\n  getInjectorResolutionPath,\n} from './injector_discovery_utils';\nimport {getSignalGraph} from './signal_debug';\n\n/**\n * This file introduces series of globally accessible debug tools\n * to allow for the Angular debugging story to function.\n *\n * To see this in action run the following command:\n *\n *   bazel run //packages/core/test/bundling/todo:devserver\n *\n *  Then load `localhost:5432` and start using the console tools.\n */\n\n/**\n * This value reflects the property on the window where the dev\n * tools are patched (window.ng).\n * */\nexport const GLOBAL_PUBLISH_EXPANDO_KEY = 'ng';\n\n// Typing for externally published global util functions\n// Ideally we should be able to use `NgGlobalPublishUtils` using declaration merging but that doesn't work with API extractor yet.\n// Have included the typings to have type safety when working with editors that support it (VSCode).\ninterface NgGlobalPublishUtils {\n  ɵgetLoadedRoutes(route: any): any;\n}\n\nconst globalUtilsFunctions = {\n  /**\n   * Warning: functions that start with `ɵ` are considered *INTERNAL* and should not be relied upon\n   * in application's code. The contract of those functions might be changed in any release and/or a\n   * function can be removed completely.\n   */\n  'ɵgetDependenciesFromInjectable': getDependenciesFromInjectable,\n  'ɵgetInjectorProviders': getInjectorProviders,\n  'ɵgetInjectorResolutionPath': getInjectorResolutionPath,\n  'ɵgetInjectorMetadata': getInjectorMetadata,\n  'ɵsetProfiler': setProfiler,\n  'ɵgetSignalGraph': getSignalGraph,\n  'ɵgetDeferBlocks': getDeferBlocks,\n\n  'getDirectiveMetadata': getDirectiveMetadata,\n  'getComponent': getComponent,\n  'getContext': getContext,\n  'getListeners': getListeners,\n  'getOwningComponent': getOwningComponent,\n  'getHostElement': getHostElement,\n  'getInjector': getInjector,\n  'getRootComponents': getRootComponents,\n  'getDirectives': getDirectives,\n  'applyChanges': applyChanges,\n  'isSignal': isSignal,\n};\ntype CoreGlobalUtilsFunctions = keyof typeof globalUtilsFunctions;\ntype ExternalGlobalUtilsFunctions = keyof NgGlobalPublishUtils;\n\nlet _published = false;\n/**\n * Publishes a collection of default debug tools onto`window.ng`.\n *\n * These functions are available globally when Angular is in development\n * mode and are automatically stripped away from prod mode is on.\n */\nexport function publishDefaultGlobalUtils() {\n  if (!_published) {\n    _published = true;\n\n    if (typeof window !== 'undefined') {\n      // Only configure the injector profiler when running in the browser.\n      setupFrameworkInjectorProfiler();\n    }\n\n    for (const [methodName, method] of Object.entries(globalUtilsFunctions)) {\n      publishGlobalUtil(methodName as CoreGlobalUtilsFunctions, method);\n    }\n  }\n}\n\n/**\n * Default debug tools available under `window.ng`.\n */\nexport type GlobalDevModeUtils = {\n  [GLOBAL_PUBLISH_EXPANDO_KEY]: typeof globalUtilsFunctions;\n};\n\n/**\n * Publishes the given function to `window.ng` so that it can be\n * used from the browser console when an application is not in production.\n */\nexport function publishGlobalUtil<K extends CoreGlobalUtilsFunctions>(\n  name: K,\n  fn: (typeof globalUtilsFunctions)[K],\n): void {\n  publishUtil(name, fn);\n}\n\n/**\n * Publishes the given function to `window.ng` from package other than @angular/core\n * So that it can be used from the browser console when an application is not in production.\n */\nexport function publishExternalGlobalUtil<K extends ExternalGlobalUtilsFunctions>(\n  name: K,\n  fn: NgGlobalPublishUtils[K],\n): void {\n  publishUtil(name, fn);\n}\n\nfunction publishUtil(name: string, fn: Function) {\n  if (typeof COMPILED === 'undefined' || !COMPILED) {\n    // Note: we can't export `ng` when using closure enhanced optimization as:\n    // - closure declares globals itself for minified names, which sometimes clobber our `ng` global\n    // - we can't declare a closure extern as the namespace `ng` is already used within Google\n    //   for typings for AngularJS (via `goog.provide('ng....')`).\n    const w = global;\n    ngDevMode && assertDefined(fn, 'function not defined');\n\n    w[GLOBAL_PUBLISH_EXPANDO_KEY] ??= {} as any;\n    w[GLOBAL_PUBLISH_EXPANDO_KEY][name] = fn;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, Inject, Injectable, InjectionToken} from '../di';\nimport {isInInjectionContext} from '../di/contextual';\nimport {DestroyRef} from '../linker/destroy_ref';\nimport {NgZone} from '../zone/ng_zone';\n\n/**\n * Testability API.\n * `declare` keyword causes tsickle to generate externs, so these methods are\n * not renamed by Closure Compiler.\n * @publicApi\n */\nexport declare interface PublicTestability {\n  isStable(): boolean;\n  whenStable(callback: Function, timeout?: number, updateCallback?: Function): void;\n  findProviders(using: any, provider: string, exactMatch: boolean): any[];\n}\n\n// Angular internal, not intended for public API.\nexport interface PendingMacrotask {\n  source: string;\n  creationLocation: Error;\n  runCount?: number;\n  data?: TaskData;\n}\n\nexport interface TaskData {\n  target?: XMLHttpRequest;\n  delay?: number;\n  isPeriodic?: boolean;\n}\n\ninterface WaitCallback {\n  // Needs to be 'any' - setTimeout returns a number according to ES6, but\n  // on NodeJS it returns a Timer.\n  timeoutId: any;\n  doneCb: Function;\n  updateCb?: Function;\n}\n\n/**\n * Internal injection token that can used to access an instance of a Testability class.\n *\n * This token acts as a bridge between the core bootstrap code and the `Testability` class. This is\n * needed to ensure that there are no direct references to the `Testability` class, so it can be\n * tree-shaken away (if not referenced). For the environments/setups when the `Testability` class\n * should be available, this token is used to add a provider that references the `Testability`\n * class. Otherwise, only this token is retained in a bundle, but the `Testability` class is not.\n */\nexport const TESTABILITY = new InjectionToken<Testability>('');\n\n/**\n * Internal injection token to retrieve Testability getter class instance.\n */\nexport const TESTABILITY_GETTER = new InjectionToken<GetTestability>('');\n\n/**\n * The Testability service provides testing hooks that can be accessed from\n * the browser.\n *\n * Angular applications bootstrapped using an NgModule (via `@NgModule.bootstrap` field) will also\n * instantiate Testability by default (in both development and production modes).\n *\n * For applications bootstrapped using the `bootstrapApplication` function, Testability is not\n * included by default. You can include it into your applications by getting the list of necessary\n * providers using the `provideProtractorTestingSupport()` function and adding them into the\n * `options.providers` array. Example:\n *\n * ```ts\n * import {provideProtractorTestingSupport} from '@angular/platform-browser';\n *\n * await bootstrapApplication(RootComponent, providers: [provideProtractorTestingSupport()]);\n * ```\n *\n * @publicApi\n */\n@Injectable()\nexport class Testability implements PublicTestability {\n  private _isZoneStable: boolean = true;\n  private _callbacks: WaitCallback[] = [];\n\n  private _taskTrackingZone: {macroTasks: Task[]} | null = null;\n\n  private _destroyRef?: DestroyRef;\n\n  constructor(\n    private _ngZone: NgZone,\n    private registry: TestabilityRegistry,\n    @Inject(TESTABILITY_GETTER) testabilityGetter: GetTestability,\n  ) {\n    // Attempt to retrieve a `DestroyRef` optionally.\n    // For backwards compatibility reasons, this cannot be required.\n    if (isInInjectionContext()) {\n      this._destroyRef = inject(DestroyRef, {optional: true}) ?? undefined;\n    }\n\n    // If there was no Testability logic registered in the global scope\n    // before, register the current testability getter as a global one.\n    if (!_testabilityGetter) {\n      setTestabilityGetter(testabilityGetter);\n      testabilityGetter.addToWindow(registry);\n    }\n    this._watchAngularEvents();\n    _ngZone.run(() => {\n      this._taskTrackingZone =\n        typeof Zone == 'undefined' ? null : Zone.current.get('TaskTrackingZone');\n    });\n  }\n\n  private _watchAngularEvents(): void {\n    const onUnstableSubscription = this._ngZone.onUnstable.subscribe({\n      next: () => {\n        this._isZoneStable = false;\n      },\n    });\n\n    const onStableSubscription = this._ngZone.runOutsideAngular(() =>\n      this._ngZone.onStable.subscribe({\n        next: () => {\n          NgZone.assertNotInAngularZone();\n          queueMicrotask(() => {\n            this._isZoneStable = true;\n            this._runCallbacksIfReady();\n          });\n        },\n      }),\n    );\n\n    this._destroyRef?.onDestroy(() => {\n      onUnstableSubscription.unsubscribe();\n      onStableSubscription.unsubscribe();\n    });\n  }\n\n  /**\n   * Whether an associated application is stable\n   */\n  isStable(): boolean {\n    return this._isZoneStable && !this._ngZone.hasPendingMacrotasks;\n  }\n\n  private _runCallbacksIfReady(): void {\n    if (this.isStable()) {\n      // Schedules the call backs in a new frame so that it is always async.\n      queueMicrotask(() => {\n        while (this._callbacks.length !== 0) {\n          let cb = this._callbacks.pop()!;\n          clearTimeout(cb.timeoutId);\n          cb.doneCb();\n        }\n      });\n    } else {\n      // Still not stable, send updates.\n      let pending = this.getPendingTasks();\n      this._callbacks = this._callbacks.filter((cb) => {\n        if (cb.updateCb && cb.updateCb(pending)) {\n          clearTimeout(cb.timeoutId);\n          return false;\n        }\n\n        return true;\n      });\n    }\n  }\n\n  private getPendingTasks(): PendingMacrotask[] {\n    if (!this._taskTrackingZone) {\n      return [];\n    }\n\n    // Copy the tasks data so that we don't leak tasks.\n    return this._taskTrackingZone.macroTasks.map((t: Task) => {\n      return {\n        source: t.source,\n        // From TaskTrackingZone:\n        // https://github.com/angular/zone.js/blob/master/lib/zone-spec/task-tracking.ts#L40\n        creationLocation: (t as any).creationLocation as Error,\n        data: t.data,\n      };\n    });\n  }\n\n  private addCallback(cb: Function, timeout?: number, updateCb?: Function) {\n    let timeoutId: any = -1;\n    if (timeout && timeout > 0) {\n      timeoutId = setTimeout(() => {\n        this._callbacks = this._callbacks.filter((cb) => cb.timeoutId !== timeoutId);\n        cb();\n      }, timeout);\n    }\n    this._callbacks.push(<WaitCallback>{doneCb: cb, timeoutId: timeoutId, updateCb: updateCb});\n  }\n\n  /**\n   * Wait for the application to be stable with a timeout. If the timeout is reached before that\n   * happens, the callback receives a list of the macro tasks that were pending, otherwise null.\n   *\n   * @param doneCb The callback to invoke when Angular is stable or the timeout expires\n   *    whichever comes first.\n   * @param timeout Optional. The maximum time to wait for Angular to become stable. If not\n   *    specified, whenStable() will wait forever.\n   * @param updateCb Optional. If specified, this callback will be invoked whenever the set of\n   *    pending macrotasks changes. If this callback returns true doneCb will not be invoked\n   *    and no further updates will be issued.\n   */\n  whenStable(doneCb: Function, timeout?: number, updateCb?: Function): void {\n    if (updateCb && !this._taskTrackingZone) {\n      throw new Error(\n        'Task tracking zone is required when passing an update callback to ' +\n          'whenStable(). Is \"zone.js/plugins/task-tracking\" loaded?',\n      );\n    }\n    this.addCallback(doneCb, timeout, updateCb);\n    this._runCallbacksIfReady();\n  }\n\n  /**\n   * Registers an application with a testability hook so that it can be tracked.\n   * @param token token of application, root element\n   *\n   * @internal\n   */\n  registerApplication(token: any) {\n    this.registry.registerApplication(token, this);\n  }\n\n  /**\n   * Unregisters an application.\n   * @param token token of application, root element\n   *\n   * @internal\n   */\n  unregisterApplication(token: any) {\n    this.registry.unregisterApplication(token);\n  }\n\n  /**\n   * Find providers by name\n   * @param using The root element to search from\n   * @param provider The name of binding variable\n   * @param exactMatch Whether using exactMatch\n   */\n  findProviders(using: any, provider: string, exactMatch: boolean): any[] {\n    // TODO(juliemr): implement.\n    return [];\n  }\n}\n\n/**\n * A global registry of {@link Testability} instances for specific elements.\n * @publicApi\n */\n@Injectable({providedIn: 'platform'})\nexport class TestabilityRegistry {\n  /** @internal */\n  _applications = new Map<any, Testability>();\n\n  /**\n   * Registers an application with a testability hook so that it can be tracked\n   * @param token token of application, root element\n   * @param testability Testability hook\n   */\n  registerApplication(token: any, testability: Testability) {\n    this._applications.set(token, testability);\n  }\n\n  /**\n   * Unregisters an application.\n   * @param token token of application, root element\n   */\n  unregisterApplication(token: any) {\n    this._applications.delete(token);\n  }\n\n  /**\n   * Unregisters all applications\n   */\n  unregisterAllApplications() {\n    this._applications.clear();\n  }\n\n  /**\n   * Get a testability hook associated with the application\n   * @param elem root element\n   */\n  getTestability(elem: any): Testability | null {\n    return this._applications.get(elem) || null;\n  }\n\n  /**\n   * Get all registered testabilities\n   */\n  getAllTestabilities(): Testability[] {\n    return Array.from(this._applications.values());\n  }\n\n  /**\n   * Get all registered applications(root elements)\n   */\n  getAllRootElements(): any[] {\n    return Array.from(this._applications.keys());\n  }\n\n  /**\n   * Find testability of a node in the Tree\n   * @param elem node\n   * @param findInAncestors whether finding testability in ancestors if testability was not found in\n   * current node\n   */\n  findTestabilityInTree(elem: Node, findInAncestors: boolean = true): Testability | null {\n    return _testabilityGetter?.findTestabilityInTree(this, elem, findInAncestors) ?? null;\n  }\n}\n\n/**\n * Adapter interface for retrieving the `Testability` service associated for a\n * particular context.\n *\n * @publicApi\n */\nexport interface GetTestability {\n  addToWindow(registry: TestabilityRegistry): void;\n  findTestabilityInTree(\n    registry: TestabilityRegistry,\n    elem: any,\n    findInAncestors: boolean,\n  ): Testability | null;\n}\n\n/**\n * Set the {@link GetTestability} implementation used by the Angular testing framework.\n * @publicApi\n */\nexport function setTestabilityGetter(getter: GetTestability): void {\n  _testabilityGetter = getter;\n}\n\nlet _testabilityGetter: GetTestability | undefined;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵɵdefineInjectable} from '../../di/interface/defs';\n\n/**\n * Abstraction that encompasses any kind of effect that can be scheduled.\n */\nexport interface SchedulableEffect {\n  run(): void;\n  zone: {\n    run<T>(fn: () => T): T;\n  } | null;\n}\n\n/**\n * A scheduler which manages the execution of effects.\n */\nexport abstract class EffectScheduler {\n  /**\n   * Schedule the given effect to be executed at a later time.\n   *\n   * It is an error to attempt to execute any effects synchronously during a scheduling operation.\n   */\n  abstract schedule(e: SchedulableEffect): void;\n\n  /**\n   * Run any scheduled effects.\n   */\n  abstract flush(): void;\n\n  /** Remove a scheduled effect */\n  abstract remove(e: SchedulableEffect): void;\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: EffectScheduler,\n    providedIn: 'root',\n    factory: () => new ZoneAwareEffectScheduler(),\n  });\n}\n\n/**\n * A wrapper around `ZoneAwareQueueingScheduler` that schedules flushing via the microtask queue\n * when.\n */\nexport class ZoneAwareEffectScheduler implements EffectScheduler {\n  private queuedEffectCount = 0;\n  private queues = new Map<Zone | null, Set<SchedulableEffect>>();\n\n  schedule(handle: SchedulableEffect): void {\n    this.enqueue(handle);\n  }\n\n  remove(handle: SchedulableEffect): void {\n    const zone = handle.zone as Zone | null;\n    const queue = this.queues.get(zone)!;\n    if (!queue.has(handle)) {\n      return;\n    }\n\n    queue.delete(handle);\n    this.queuedEffectCount--;\n  }\n\n  private enqueue(handle: SchedulableEffect): void {\n    const zone = handle.zone as Zone | null;\n    if (!this.queues.has(zone)) {\n      this.queues.set(zone, new Set());\n    }\n\n    const queue = this.queues.get(zone)!;\n    if (queue.has(handle)) {\n      return;\n    }\n    this.queuedEffectCount++;\n    queue.add(handle);\n  }\n\n  /**\n   * Run all scheduled effects.\n   *\n   * Execution order of effects within the same zone is guaranteed to be FIFO, but there is no\n   * ordering guarantee between effects scheduled in different zones.\n   */\n  flush(): void {\n    while (this.queuedEffectCount > 0) {\n      for (const [zone, queue] of this.queues) {\n        // `zone` here must be defined.\n        if (zone === null) {\n          this.flushQueue(queue);\n        } else {\n          zone.run(() => this.flushQueue(queue));\n        }\n      }\n    }\n  }\n\n  private flushQueue(queue: Set<SchedulableEffect>): void {\n    for (const handle of queue) {\n      queue.delete(handle);\n      this.queuedEffectCount--;\n\n      // TODO: what happens if this throws an error?\n      handle.run();\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Subscribable} from 'rxjs';\n\n/**\n * Determine if the argument is shaped like a Promise\n */\nexport function isPromise<T = any>(obj: any): obj is Promise<T> {\n  // allow any Promise/A+ compliant thenable.\n  // It's up to the caller to ensure that obj.then conforms to the spec\n  return !!obj && typeof obj.then === 'function';\n}\n\n/**\n * Determine if the argument is a Subscribable\n */\nexport function isSubscribable<T>(obj: any | Subscribable<T>): obj is Subscribable<T> {\n  return !!obj && typeof obj.subscribe === 'function';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Observable} from 'rxjs';\n\nimport {\n  EnvironmentProviders,\n  inject,\n  Injectable,\n  InjectionToken,\n  Injector,\n  makeEnvironmentProviders,\n  runInInjectionContext,\n} from '../di';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {isPromise, isSubscribable} from '../util/lang';\n\n/**\n * A DI token that you can use to provide\n * one or more initialization functions.\n *\n * The provided functions are injected at application startup and executed during\n * app initialization. If any of these functions returns a Promise or an Observable, initialization\n * does not complete until the Promise is resolved or the Observable is completed.\n *\n * You can, for example, create a factory function that loads language data\n * or an external configuration, and provide that function to the `APP_INITIALIZER` token.\n * The function is executed during the application bootstrap process,\n * and the needed data is available on startup.\n *\n * Note that the provided initializer is run in the injection context.\n *\n * @deprecated from v19.0.0, use provideAppInitializer instead\n *\n * @see {@link ApplicationInitStatus}\n * @see {@link provideAppInitializer}\n *\n * @usageNotes\n *\n * The following example illustrates how to configure a multi-provider using `APP_INITIALIZER` token\n * and a function returning a promise.\n * ### Example with NgModule-based application\n * ```ts\n *  function initializeApp(): Promise<any> {\n *    const http = inject(HttpClient);\n *    return firstValueFrom(\n *      http\n *        .get(\"https://someUrl.com/api/user\")\n *        .pipe(tap(user => { ... }))\n *    );\n *  }\n *\n *  @NgModule({\n *   imports: [BrowserModule],\n *   declarations: [AppComponent],\n *   bootstrap: [AppComponent],\n *   providers: [{\n *     provide: APP_INITIALIZER,\n *     useValue: initializeApp,\n *     multi: true,\n *    }]\n *   })\n *  export class AppModule {}\n * ```\n *\n * ### Example with standalone application\n * ```ts\n * function initializeApp() {\n *   const http = inject(HttpClient);\n *   return firstValueFrom(\n *     http\n *       .get(\"https://someUrl.com/api/user\")\n *       .pipe(tap(user => { ... }))\n *   );\n * }\n *\n * bootstrapApplication(App, {\n *   providers: [\n *     provideHttpClient(),\n *     {\n *       provide: APP_INITIALIZER,\n *       useValue: initializeApp,\n *       multi: true,\n *     },\n *   ],\n * });\n\n * ```\n *\n *\n * It's also possible to configure a multi-provider using `APP_INITIALIZER` token and a function\n * returning an observable, see an example below. Note: the `HttpClient` in this example is used for\n * demo purposes to illustrate how the factory function can work with other providers available\n * through DI.\n *\n * ### Example with NgModule-based application\n * ```ts\n * function initializeApp() {\n *   const http = inject(HttpClient);\n *   return firstValueFrom(\n *     http\n *       .get(\"https://someUrl.com/api/user\")\n *       .pipe(tap(user => { ... }))\n *   );\n * }\n *\n * @NgModule({\n *   imports: [BrowserModule, HttpClientModule],\n *   declarations: [AppComponent],\n *   bootstrap: [AppComponent],\n *   providers: [{\n *     provide: APP_INITIALIZER,\n *     useValue: initializeApp,\n *     multi: true,\n *   }]\n * })\n * export class AppModule {}\n * ```\n *   \n * ### Example with standalone application\n * ```ts\n * function initializeApp() {\n *   const http = inject(HttpClient);\n *   return firstValueFrom(\n *     http\n *       .get(\"https://someUrl.com/api/user\")\n *       .pipe(tap(user => { ... }))\n *   );\n * }\n *\n * bootstrapApplication(App, {\n *   providers: [\n *     provideHttpClient(),\n *     {\n *       provide: APP_INITIALIZER,\n *       useValue: initializeApp,\n *       multi: true,\n *     },\n *   ],\n * });\n * ```\n *\n * @publicApi\n */\nexport const APP_INITIALIZER = new InjectionToken<\n  ReadonlyArray<() => Observable<unknown> | Promise<unknown> | void>\n>(ngDevMode ? 'Application Initializer' : '');\n\n/**\n * @description\n * The provided function is injected at application startup and executed during\n * app initialization. If the function returns a Promise or an Observable, initialization\n * does not complete until the Promise is resolved or the Observable is completed.\n *\n * You can, for example, create a function that loads language data\n * or an external configuration, and provide that function using `provideAppInitializer()`.\n * The function is executed during the application bootstrap process,\n * and the needed data is available on startup.\n *\n * Note that the provided initializer is run in the injection context.\n *\n * Previously, this was achieved using the `APP_INITIALIZER` token which is now deprecated.\n *\n * @see {@link APP_INITIALIZER}\n *\n * @usageNotes\n * The following example illustrates how to configure an initialization function using\n * `provideAppInitializer()`\n * ```ts\n * bootstrapApplication(App, {\n *   providers: [\n *     provideAppInitializer(() => {\n *       const http = inject(HttpClient);\n *       return firstValueFrom(\n *         http\n *           .get(\"https://someUrl.com/api/user\")\n *           .pipe(tap(user => { ... }))\n *       );\n *     }),\n *     provideHttpClient(),\n *   ],\n * });\n * ```\n *\n * @publicApi\n */\nexport function provideAppInitializer(\n  initializerFn: () => Observable<unknown> | Promise<unknown> | void,\n): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: APP_INITIALIZER,\n      multi: true,\n      useValue: initializerFn,\n    },\n  ]);\n}\n\n/**\n * A class that reflects the state of running {@link APP_INITIALIZER} functions.\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root'})\nexport class ApplicationInitStatus {\n  // Using non null assertion, these fields are defined below\n  // within the `new Promise` callback (synchronously).\n  private resolve!: (...args: any[]) => void;\n  private reject!: (...args: any[]) => void;\n\n  private initialized = false;\n  public readonly done = false;\n  public readonly donePromise: Promise<any> = new Promise((res, rej) => {\n    this.resolve = res;\n    this.reject = rej;\n  });\n\n  private readonly appInits = inject(APP_INITIALIZER, {optional: true}) ?? [];\n  private readonly injector = inject(Injector);\n\n  constructor() {\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && !Array.isArray(this.appInits)) {\n      throw new RuntimeError(\n        RuntimeErrorCode.INVALID_MULTI_PROVIDER,\n        'Unexpected type of the `APP_INITIALIZER` token value ' +\n          `(expected an array, but got ${typeof this.appInits}). ` +\n          'Please check that the `APP_INITIALIZER` token is configured as a ' +\n          '`multi: true` provider.',\n      );\n    }\n  }\n\n  /** @internal */\n  runInitializers() {\n    if (this.initialized) {\n      return;\n    }\n\n    const asyncInitPromises = [];\n    for (const appInits of this.appInits) {\n      const initResult = runInInjectionContext(this.injector, appInits);\n      if (isPromise(initResult)) {\n        asyncInitPromises.push(initResult);\n      } else if (isSubscribable(initResult)) {\n        const observableAsPromise = new Promise<void>((resolve, reject) => {\n          initResult.subscribe({complete: resolve, error: reject});\n        });\n        asyncInitPromises.push(observableAsPromise);\n      }\n    }\n\n    const complete = () => {\n      // @ts-expect-error overwriting a readonly\n      this.done = true;\n      this.resolve();\n    };\n\n    Promise.all(asyncInitPromises)\n      .then(() => {\n        complete();\n      })\n      .catch((e) => {\n        this.reject(e);\n      });\n\n    if (asyncInitPromises.length === 0) {\n      complete();\n    }\n    this.initialized = true;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport '../util/ng_hmr_mode';\nimport '../util/ng_jit_mode';\nimport '../util/ng_server_mode';\n\nimport {setActiveConsumer, setThrowInvalidWriteToSignalError} from '../../primitives/signals';\nimport {Observable, Subject, Subscription} from 'rxjs';\nimport {map} from 'rxjs/operators';\n\nimport {ZONELESS_ENABLED} from '../change_detection/scheduling/zoneless_scheduling';\nimport {Console} from '../console';\nimport {inject} from '../di';\nimport {Injectable} from '../di/injectable';\nimport {InjectionToken} from '../di/injection_token';\nimport {Injector} from '../di/injector';\nimport {EnvironmentInjector, type R3Injector} from '../di/r3_injector';\nimport {ErrorHandler, INTERNAL_APPLICATION_ERROR_HANDLER} from '../error_handler';\nimport {formatRuntimeError, RuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type} from '../interface/type';\nimport {ComponentFactory, ComponentRef} from '../linker/component_factory';\nimport {ComponentFactoryResolver} from '../linker/component_factory_resolver';\nimport {NgModuleRef} from '../linker/ng_module_factory';\nimport {ViewRef} from '../linker/view_ref';\nimport {PendingTasksInternal} from '../pending_tasks';\nimport {RendererFactory2} from '../render/api';\nimport {AfterRenderManager} from '../render3/after_render/manager';\nimport {ComponentFactory as R3ComponentFactory} from '../render3/component_ref';\nimport {isStandalone} from '../render3/def_getters';\nimport {ChangeDetectionMode, detectChangesInternal} from '../render3/instructions/change_detection';\nimport {LView} from '../render3/interfaces/view';\nimport {publishDefaultGlobalUtils as _publishDefaultGlobalUtils} from '../render3/util/global_utils';\nimport {requiresRefreshOrTraversal} from '../render3/util/view_utils';\nimport {ViewRef as InternalViewRef} from '../render3/view_ref';\nimport {TESTABILITY} from '../testability/testability';\nimport {NgZone} from '../zone/ng_zone';\n\nimport {profiler} from '../render3/profiler';\nimport {ProfilerEvent} from '../render3/profiler_types';\nimport {EffectScheduler} from '../render3/reactivity/root_effect_scheduler';\nimport {ApplicationInitStatus} from './application_init';\nimport {TracingAction, TracingService, TracingSnapshot} from './tracing';\n\n/**\n * A DI token that provides a set of callbacks to\n * be called for every component that is bootstrapped.\n *\n * Each callback must take a `ComponentRef` instance and return nothing.\n *\n * `(componentRef: ComponentRef) => void`\n *\n * @publicApi\n */\nexport const APP_BOOTSTRAP_LISTENER = new InjectionToken<\n  ReadonlyArray<(compRef: ComponentRef<any>) => void>\n>(ngDevMode ? 'appBootstrapListener' : '');\n\nexport function publishDefaultGlobalUtils() {\n  ngDevMode && _publishDefaultGlobalUtils();\n}\n\n/**\n * Sets the error for an invalid write to a signal to be an Angular `RuntimeError`.\n */\nexport function publishSignalConfiguration(): void {\n  setThrowInvalidWriteToSignalError(() => {\n    throw new RuntimeError(\n      RuntimeErrorCode.SIGNAL_WRITE_FROM_ILLEGAL_CONTEXT,\n      ngDevMode && 'Writing to signals is not allowed in a `computed`.',\n    );\n  });\n}\n\nexport function isBoundToModule<C>(cf: ComponentFactory<C>): boolean {\n  return (cf as R3ComponentFactory<C>).isBoundToModule;\n}\n\n/**\n * A token for third-party components that can register themselves with NgProbe.\n *\n * @deprecated\n * @publicApi\n */\nexport class NgProbeToken {\n  constructor(\n    public name: string,\n    public token: any,\n  ) {}\n}\n\n/**\n * Provides additional options to the bootstrapping process.\n *\n * @publicApi\n */\nexport interface BootstrapOptions {\n  /**\n   * Optionally specify which `NgZone` should be used when not configured in the providers.\n   *\n   * - Provide your own `NgZone` instance.\n   * - `zone.js` - Use default `NgZone` which requires `Zone.js`.\n   * - `noop` - Use `NoopNgZone` which does nothing.\n   */\n  ngZone?: NgZone | 'zone.js' | 'noop';\n\n  /**\n   * Optionally specify coalescing event change detections or not.\n   * Consider the following case.\n   *\n   * ```html\n   * <div (click)=\"doSomething()\">\n   *   <button (click)=\"doSomethingElse()\"></button>\n   * </div>\n   * ```\n   *\n   * When button is clicked, because of the event bubbling, both\n   * event handlers will be called and 2 change detections will be\n   * triggered. We can coalesce such kind of events to only trigger\n   * change detection only once.\n   *\n   * By default, this option will be false. So the events will not be\n   * coalesced and the change detection will be triggered multiple times.\n   * And if this option be set to true, the change detection will be\n   * triggered async by scheduling a animation frame. So in the case above,\n   * the change detection will only be triggered once.\n   */\n  ngZoneEventCoalescing?: boolean;\n\n  /**\n   * Optionally specify if `NgZone#run()` method invocations should be coalesced\n   * into a single change detection.\n   *\n   * Consider the following case.\n   * ```ts\n   * for (let i = 0; i < 10; i ++) {\n   *   ngZone.run(() => {\n   *     // do something\n   *   });\n   * }\n   * ```\n   *\n   * This case triggers the change detection multiple times.\n   * With ngZoneRunCoalescing options, all change detections in an event loop trigger only once.\n   * In addition, the change detection executes in requestAnimation.\n   *\n   */\n  ngZoneRunCoalescing?: boolean;\n\n  /**\n   * When false, change detection is scheduled when Angular receives\n   * a clear indication that templates need to be refreshed. This includes:\n   *\n   * - calling `ChangeDetectorRef.markForCheck`\n   * - calling `ComponentRef.setInput`\n   * - updating a signal that is read in a template\n   * - attaching a view that is marked dirty\n   * - removing a view\n   * - registering a render hook (templates are only refreshed if render hooks do one of the above)\n   *\n   * @deprecated This option was introduced out of caution as a way for developers to opt out of the\n   *    new behavior in v18 which schedule change detection for the above events when they occur\n   *    outside the Zone. After monitoring the results post-release, we have determined that this\n   *    feature is working as desired and do not believe it should ever be disabled by setting\n   *    this option to `true`.\n   */\n  ignoreChangesOutsideZone?: boolean;\n}\n\n/** Maximum number of times ApplicationRef will refresh all attached views in a single tick. */\nconst MAXIMUM_REFRESH_RERUNS = 10;\n\nexport function optionsReducer<T extends Object>(dst: T, objs: T | T[]): T {\n  if (Array.isArray(objs)) {\n    return objs.reduce(optionsReducer, dst);\n  }\n  return {...dst, ...objs};\n}\n\n/**\n * A reference to an Angular application running on a page.\n *\n * @usageNotes\n * ### isStable examples and caveats\n *\n * Note two important points about `isStable`, demonstrated in the examples below:\n * - the application will never be stable if you start any kind\n * of recurrent asynchronous task when the application starts\n * (for example for a polling process, started with a `setInterval`, a `setTimeout`\n * or using RxJS operators like `interval`);\n * - the `isStable` Observable runs outside of the Angular zone.\n *\n * Let's imagine that you start a recurrent task\n * (here incrementing a counter, using RxJS `interval`),\n * and at the same time subscribe to `isStable`.\n *\n * ```ts\n * constructor(appRef: ApplicationRef) {\n *   appRef.isStable.pipe(\n *      filter(stable => stable)\n *   ).subscribe(() => console.log('App is stable now');\n *   interval(1000).subscribe(counter => console.log(counter));\n * }\n * ```\n * In this example, `isStable` will never emit `true`,\n * and the trace \"App is stable now\" will never get logged.\n *\n * If you want to execute something when the app is stable,\n * you have to wait for the application to be stable\n * before starting your polling process.\n *\n * ```ts\n * constructor(appRef: ApplicationRef) {\n *   appRef.isStable.pipe(\n *     first(stable => stable),\n *     tap(stable => console.log('App is stable now')),\n *     switchMap(() => interval(1000))\n *   ).subscribe(counter => console.log(counter));\n * }\n * ```\n * In this example, the trace \"App is stable now\" will be logged\n * and then the counter starts incrementing every second.\n *\n * Note also that this Observable runs outside of the Angular zone,\n * which means that the code in the subscription\n * to this Observable will not trigger the change detection.\n *\n * Let's imagine that instead of logging the counter value,\n * you update a field of your component\n * and display it in its template.\n *\n * ```ts\n * constructor(appRef: ApplicationRef) {\n *   appRef.isStable.pipe(\n *     first(stable => stable),\n *     switchMap(() => interval(1000))\n *   ).subscribe(counter => this.value = counter);\n * }\n * ```\n * As the `isStable` Observable runs outside the zone,\n * the `value` field will be updated properly,\n * but the template will not be refreshed!\n *\n * You'll have to manually trigger the change detection to update the template.\n *\n * ```ts\n * constructor(appRef: ApplicationRef, cd: ChangeDetectorRef) {\n *   appRef.isStable.pipe(\n *     first(stable => stable),\n *     switchMap(() => interval(1000))\n *   ).subscribe(counter => {\n *     this.value = counter;\n *     cd.detectChanges();\n *   });\n * }\n * ```\n *\n * Or make the subscription callback run inside the zone.\n *\n * ```ts\n * constructor(appRef: ApplicationRef, zone: NgZone) {\n *   appRef.isStable.pipe(\n *     first(stable => stable),\n *     switchMap(() => interval(1000))\n *   ).subscribe(counter => zone.run(() => this.value = counter));\n * }\n * ```\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root'})\nexport class ApplicationRef {\n  /** @internal */\n  _runningTick: boolean = false;\n  private _destroyed = false;\n  private _destroyListeners: Array<() => void> = [];\n  /** @internal */\n  _views: InternalViewRef<unknown>[] = [];\n  private readonly internalErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);\n  private readonly afterRenderManager = inject(AfterRenderManager);\n  private readonly zonelessEnabled = inject(ZONELESS_ENABLED);\n  private readonly rootEffectScheduler = inject(EffectScheduler);\n\n  /**\n   * Current dirty state of the application across a number of dimensions (views, afterRender hooks,\n   * etc).\n   *\n   * A flag set here means that `tick()` will attempt to resolve the dirtiness when executed.\n   *\n   * @internal\n   */\n  dirtyFlags = ApplicationRefDirtyFlags.None;\n\n  /**\n   * Most recent snapshot from the `TracingService`, if any.\n   *\n   * This snapshot attempts to capture the context when `tick()` was first\n   * scheduled. It then runs wrapped in this context.\n   *\n   * @internal\n   */\n  tracingSnapshot: TracingSnapshot | null = null;\n\n  // Needed for ComponentFixture temporarily during migration of autoDetect behavior\n  // Eventually the hostView of the fixture should just attach to ApplicationRef.\n  private externalTestViews: Set<InternalViewRef<unknown>> = new Set();\n  /** @internal */\n  afterTick = new Subject<void>();\n  /** @internal */\n  get allViews(): Array<InternalViewRef<unknown>> {\n    return [...this.externalTestViews.keys(), ...this._views];\n  }\n\n  /**\n   * Indicates whether this instance was destroyed.\n   */\n  get destroyed() {\n    return this._destroyed;\n  }\n\n  /**\n   * Get a list of component types registered to this application.\n   * This list is populated even before the component is created.\n   */\n  public readonly componentTypes: Type<any>[] = [];\n\n  /**\n   * Get a list of components registered to this application.\n   */\n  public readonly components: ComponentRef<any>[] = [];\n\n  /**\n   * Returns an Observable that indicates when the application is stable or unstable.\n   */\n  public readonly isStable: Observable<boolean> = inject(PendingTasksInternal).hasPendingTasks.pipe(\n    map((pending) => !pending),\n  );\n\n  constructor() {\n    // Inject the tracing service to initialize it.\n    inject(TracingService, {optional: true});\n  }\n\n  /**\n   * @returns A promise that resolves when the application becomes stable\n   */\n  whenStable(): Promise<void> {\n    let subscription: Subscription;\n    return new Promise<void>((resolve) => {\n      subscription = this.isStable.subscribe({\n        next: (stable) => {\n          if (stable) {\n            resolve();\n          }\n        },\n      });\n    }).finally(() => {\n      subscription.unsubscribe();\n    });\n  }\n\n  private readonly _injector = inject(EnvironmentInjector);\n  private _rendererFactory: RendererFactory2 | null = null;\n\n  /**\n   * The `EnvironmentInjector` used to create this application.\n   */\n  get injector(): EnvironmentInjector {\n    return this._injector;\n  }\n\n  /**\n   * Bootstrap a component onto the element identified by its selector or, optionally, to a\n   * specified element.\n   *\n   * @usageNotes\n   * ### Bootstrap process\n   *\n   * When bootstrapping a component, Angular mounts it onto a target DOM element\n   * and kicks off automatic change detection. The target DOM element can be\n   * provided using the `rootSelectorOrNode` argument.\n   *\n   * If the target DOM element is not provided, Angular tries to find one on a page\n   * using the `selector` of the component that is being bootstrapped\n   * (first matched element is used).\n   *\n   * ### Example\n   *\n   * Generally, we define the component to bootstrap in the `bootstrap` array of `NgModule`,\n   * but it requires us to know the component while writing the application code.\n   *\n   * Imagine a situation where we have to wait for an API call to decide about the component to\n   * bootstrap. We can use the `ngDoBootstrap` hook of the `NgModule` and call this method to\n   * dynamically bootstrap a component.\n   *\n   * {@example core/ts/platform/platform.ts region='componentSelector'}\n   *\n   * Optionally, a component can be mounted onto a DOM element that does not match the\n   * selector of the bootstrapped component.\n   *\n   * In the following example, we are providing a CSS selector to match the target element.\n   *\n   * {@example core/ts/platform/platform.ts region='cssSelector'}\n   *\n   * While in this example, we are providing reference to a DOM node.\n   *\n   * {@example core/ts/platform/platform.ts region='domNode'}\n   */\n  bootstrap<C>(component: Type<C>, rootSelectorOrNode?: string | any): ComponentRef<C>;\n\n  /**\n   * Bootstrap a component onto the element identified by its selector or, optionally, to a\n   * specified element.\n   *\n   * @usageNotes\n   * ### Bootstrap process\n   *\n   * When bootstrapping a component, Angular mounts it onto a target DOM element\n   * and kicks off automatic change detection. The target DOM element can be\n   * provided using the `rootSelectorOrNode` argument.\n   *\n   * If the target DOM element is not provided, Angular tries to find one on a page\n   * using the `selector` of the component that is being bootstrapped\n   * (first matched element is used).\n   *\n   * ### Example\n   *\n   * Generally, we define the component to bootstrap in the `bootstrap` array of `NgModule`,\n   * but it requires us to know the component while writing the application code.\n   *\n   * Imagine a situation where we have to wait for an API call to decide about the component to\n   * bootstrap. We can use the `ngDoBootstrap` hook of the `NgModule` and call this method to\n   * dynamically bootstrap a component.\n   *\n   * {@example core/ts/platform/platform.ts region='componentSelector'}\n   *\n   * Optionally, a component can be mounted onto a DOM element that does not match the\n   * selector of the bootstrapped component.\n   *\n   * In the following example, we are providing a CSS selector to match the target element.\n   *\n   * {@example core/ts/platform/platform.ts region='cssSelector'}\n   *\n   * While in this example, we are providing reference to a DOM node.\n   *\n   * {@example core/ts/platform/platform.ts region='domNode'}\n   *\n   * @deprecated Passing Component factories as the `Application.bootstrap` function argument is\n   *     deprecated. Pass Component Types instead.\n   */\n  bootstrap<C>(\n    componentFactory: ComponentFactory<C>,\n    rootSelectorOrNode?: string | any,\n  ): ComponentRef<C>;\n\n  /**\n   * Bootstrap a component onto the element identified by its selector or, optionally, to a\n   * specified element.\n   *\n   * @usageNotes\n   * ### Bootstrap process\n   *\n   * When bootstrapping a component, Angular mounts it onto a target DOM element\n   * and kicks off automatic change detection. The target DOM element can be\n   * provided using the `rootSelectorOrNode` argument.\n   *\n   * If the target DOM element is not provided, Angular tries to find one on a page\n   * using the `selector` of the component that is being bootstrapped\n   * (first matched element is used).\n   *\n   * ### Example\n   *\n   * Generally, we define the component to bootstrap in the `bootstrap` array of `NgModule`,\n   * but it requires us to know the component while writing the application code.\n   *\n   * Imagine a situation where we have to wait for an API call to decide about the component to\n   * bootstrap. We can use the `ngDoBootstrap` hook of the `NgModule` and call this method to\n   * dynamically bootstrap a component.\n   *\n   * {@example core/ts/platform/platform.ts region='componentSelector'}\n   *\n   * Optionally, a component can be mounted onto a DOM element that does not match the\n   * selector of the bootstrapped component.\n   *\n   * In the following example, we are providing a CSS selector to match the target element.\n   *\n   * {@example core/ts/platform/platform.ts region='cssSelector'}\n   *\n   * While in this example, we are providing reference to a DOM node.\n   *\n   * {@example core/ts/platform/platform.ts region='domNode'}\n   */\n  bootstrap<C>(\n    componentOrFactory: ComponentFactory<C> | Type<C>,\n    rootSelectorOrNode?: string | any,\n  ): ComponentRef<C> {\n    return this.bootstrapImpl(componentOrFactory, rootSelectorOrNode);\n  }\n\n  private bootstrapImpl<C>(\n    componentOrFactory: ComponentFactory<C> | Type<C>,\n    rootSelectorOrNode?: string | any,\n    injector: Injector = Injector.NULL,\n  ): ComponentRef<C> {\n    profiler(ProfilerEvent.BootstrapComponentStart);\n\n    (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);\n    const isComponentFactory = componentOrFactory instanceof ComponentFactory;\n    const initStatus = this._injector.get(ApplicationInitStatus);\n\n    if (!initStatus.done) {\n      let errorMessage = '';\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        const standalone = !isComponentFactory && isStandalone(componentOrFactory);\n        errorMessage =\n          'Cannot bootstrap as there are still asynchronous initializers running.' +\n          (standalone\n            ? ''\n            : ' Bootstrap components in the `ngDoBootstrap` method of the root module.');\n      }\n      throw new RuntimeError(RuntimeErrorCode.ASYNC_INITIALIZERS_STILL_RUNNING, errorMessage);\n    }\n\n    let componentFactory: ComponentFactory<C>;\n    if (isComponentFactory) {\n      componentFactory = componentOrFactory;\n    } else {\n      const resolver = this._injector.get(ComponentFactoryResolver);\n      componentFactory = resolver.resolveComponentFactory(componentOrFactory)!;\n    }\n    this.componentTypes.push(componentFactory.componentType);\n\n    // Create a factory associated with the current module if it's not bound to some other\n    const ngModule = isBoundToModule(componentFactory)\n      ? undefined\n      : this._injector.get(NgModuleRef);\n    const selectorOrNode = rootSelectorOrNode || componentFactory.selector;\n    const compRef = componentFactory.create(injector, [], selectorOrNode, ngModule);\n    const nativeElement = compRef.location.nativeElement;\n    const testability = compRef.injector.get(TESTABILITY, null);\n    testability?.registerApplication(nativeElement);\n\n    compRef.onDestroy(() => {\n      this.detachView(compRef.hostView);\n      remove(this.components, compRef);\n      testability?.unregisterApplication(nativeElement);\n    });\n\n    this._loadComponent(compRef);\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      const _console = this._injector.get(Console);\n      _console.log(`Angular is running in development mode.`);\n    }\n\n    profiler(ProfilerEvent.BootstrapComponentEnd, compRef);\n\n    return compRef;\n  }\n\n  /**\n   * Invoke this method to explicitly process change detection and its side-effects.\n   *\n   * In development mode, `tick()` also performs a second change detection cycle to ensure that no\n   * further changes are detected. If additional changes are picked up during this second cycle,\n   * bindings in the app have side-effects that cannot be resolved in a single change detection\n   * pass.\n   * In this case, Angular throws an error, since an Angular application can only have one change\n   * detection pass during which all change detection must complete.\n   */\n  tick(): void {\n    if (!this.zonelessEnabled) {\n      this.dirtyFlags |= ApplicationRefDirtyFlags.ViewTreeGlobal;\n    }\n    this._tick();\n  }\n\n  /** @internal */\n  _tick(): void {\n    profiler(ProfilerEvent.ChangeDetectionStart);\n\n    if (this.tracingSnapshot !== null) {\n      // Ensure we always run `tickImpl()` in the context of the most recent snapshot,\n      // if one exists. Snapshots may be reference counted by the implementation so\n      // we want to ensure that if we request a snapshot that we use it.\n      this.tracingSnapshot.run(TracingAction.CHANGE_DETECTION, this.tickImpl);\n    } else {\n      this.tickImpl();\n    }\n  }\n\n  private tickImpl = (): void => {\n    (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);\n    if (this._runningTick) {\n      throw new RuntimeError(\n        RuntimeErrorCode.RECURSIVE_APPLICATION_REF_TICK,\n        ngDevMode && 'ApplicationRef.tick is called recursively',\n      );\n    }\n\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      this._runningTick = true;\n      this.synchronize();\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        for (let view of this.allViews) {\n          view.checkNoChanges();\n        }\n      }\n    } catch (e) {\n      // Attention: Don't rethrow as it could cancel subscriptions to Observables!\n      this.internalErrorHandler(e);\n    } finally {\n      this._runningTick = false;\n      this.tracingSnapshot?.dispose();\n      this.tracingSnapshot = null;\n      setActiveConsumer(prevConsumer);\n      this.afterTick.next();\n\n      profiler(ProfilerEvent.ChangeDetectionEnd);\n    }\n  };\n\n  /**\n   * Performs the core work of synchronizing the application state with the UI, resolving any\n   * pending dirtiness (potentially in a loop).\n   */\n  private synchronize(): void {\n    if (this._rendererFactory === null && !(this._injector as R3Injector).destroyed) {\n      this._rendererFactory = this._injector.get(RendererFactory2, null, {optional: true});\n    }\n\n    let runs = 0;\n    while (this.dirtyFlags !== ApplicationRefDirtyFlags.None && runs++ < MAXIMUM_REFRESH_RERUNS) {\n      profiler(ProfilerEvent.ChangeDetectionSyncStart);\n      this.synchronizeOnce();\n      profiler(ProfilerEvent.ChangeDetectionSyncEnd);\n    }\n\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && runs >= MAXIMUM_REFRESH_RERUNS) {\n      throw new RuntimeError(\n        RuntimeErrorCode.INFINITE_CHANGE_DETECTION,\n        ngDevMode &&\n          'Infinite change detection while refreshing application views. ' +\n            'Ensure views are not calling `markForCheck` on every template execution or ' +\n            'that afterRender hooks always mark views for check.',\n      );\n    }\n  }\n\n  /**\n   * Perform a single synchronization pass.\n   */\n  private synchronizeOnce(): void {\n    // First, process any dirty root effects.\n    if (this.dirtyFlags & ApplicationRefDirtyFlags.RootEffects) {\n      this.dirtyFlags &= ~ApplicationRefDirtyFlags.RootEffects;\n      this.rootEffectScheduler.flush();\n    }\n\n    // First check dirty views, if there are any.\n    if (this.dirtyFlags & ApplicationRefDirtyFlags.ViewTreeAny) {\n      // Change detection on views starts in targeted mode (only check components if they're\n      // marked as dirty) unless global checking is specifically requested via APIs like\n      // `ApplicationRef.tick()` and the `NgZone` integration.\n      const useGlobalCheck = Boolean(this.dirtyFlags & ApplicationRefDirtyFlags.ViewTreeGlobal);\n\n      // Clear the view-related dirty flags.\n      this.dirtyFlags &= ~ApplicationRefDirtyFlags.ViewTreeAny;\n\n      // Set the AfterRender bit, as we're checking views and will need to run afterRender hooks.\n      this.dirtyFlags |= ApplicationRefDirtyFlags.AfterRender;\n\n      // Check all potentially dirty views.\n      for (let {_lView, notifyErrorHandler} of this.allViews) {\n        detectChangesInViewIfRequired(\n          _lView,\n          notifyErrorHandler,\n          useGlobalCheck,\n          this.zonelessEnabled,\n        );\n      }\n\n      // If `markForCheck()` was called during view checking, it will have set the `ViewTreeCheck`\n      // flag. We clear the flag here because, for backwards compatibility, `markForCheck()`\n      // during view checking doesn't cause the view to be re-checked.\n      this.dirtyFlags &= ~ApplicationRefDirtyFlags.ViewTreeCheck;\n\n      // Check if any views are still dirty after checking and we need to loop back.\n      this.syncDirtyFlagsWithViews();\n      if (\n        this.dirtyFlags &\n        (ApplicationRefDirtyFlags.ViewTreeAny | ApplicationRefDirtyFlags.RootEffects)\n      ) {\n        // If any views or effects are still dirty after checking, loop back before running render\n        // hooks.\n        return;\n      }\n    } else {\n      // If we skipped refreshing views above, there might still be unflushed animations\n      // because we never called `detectChangesInternal` on the views.\n      this._rendererFactory?.begin?.();\n      this._rendererFactory?.end?.();\n    }\n\n    // Even if there were no dirty views, afterRender hooks might still be dirty.\n    if (this.dirtyFlags & ApplicationRefDirtyFlags.AfterRender) {\n      this.dirtyFlags &= ~ApplicationRefDirtyFlags.AfterRender;\n      this.afterRenderManager.execute();\n\n      // afterRender hooks might influence dirty flags.\n    }\n    this.syncDirtyFlagsWithViews();\n  }\n\n  /**\n   * Checks `allViews` for views which require refresh/traversal, and updates `dirtyFlags`\n   * accordingly, with two potential behaviors:\n   *\n   * 1. If any of our views require updating, then this adds the `ViewTreeTraversal` dirty flag.\n   *    This _should_ be a no-op, since the scheduler should've added the flag at the same time the\n   *    view was marked as needing updating.\n   *\n   *    TODO(alxhub): figure out if this behavior is still needed for edge cases.\n   *\n   * 2. If none of our views require updating, then clear the view-related `dirtyFlag`s. This\n   *    happens when the scheduler is notified of a view becoming dirty, but the view itself isn't\n   *    reachable through traversal from our roots (e.g. it's detached from the CD tree).\n   */\n  private syncDirtyFlagsWithViews(): void {\n    if (this.allViews.some(({_lView}) => requiresRefreshOrTraversal(_lView))) {\n      // If after running all afterRender callbacks new views are dirty, ensure we loop back.\n      this.dirtyFlags |= ApplicationRefDirtyFlags.ViewTreeTraversal;\n      return;\n    } else {\n      // Even though this flag may be set, none of _our_ views require traversal, and so the\n      // `ApplicationRef` doesn't require any repeated checking.\n      this.dirtyFlags &= ~ApplicationRefDirtyFlags.ViewTreeAny;\n    }\n  }\n\n  /**\n   * Attaches a view so that it will be dirty checked.\n   * The view will be automatically detached when it is destroyed.\n   * This will throw if the view is already attached to a ViewContainer.\n   */\n  attachView(viewRef: ViewRef): void {\n    (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);\n    const view = viewRef as InternalViewRef<unknown>;\n    this._views.push(view);\n    view.attachToAppRef(this);\n  }\n\n  /**\n   * Detaches a view from dirty checking again.\n   */\n  detachView(viewRef: ViewRef): void {\n    (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);\n    const view = viewRef as InternalViewRef<unknown>;\n    remove(this._views, view);\n    view.detachFromAppRef();\n  }\n\n  private _loadComponent(componentRef: ComponentRef<any>): void {\n    this.attachView(componentRef.hostView);\n    this.tick();\n    this.components.push(componentRef);\n    // Get the listeners lazily to prevent DI cycles.\n    const listeners = this._injector.get(APP_BOOTSTRAP_LISTENER, []);\n    if (ngDevMode && !Array.isArray(listeners)) {\n      throw new RuntimeError(\n        RuntimeErrorCode.INVALID_MULTI_PROVIDER,\n        'Unexpected type of the `APP_BOOTSTRAP_LISTENER` token value ' +\n          `(expected an array, but got ${typeof listeners}). ` +\n          'Please check that the `APP_BOOTSTRAP_LISTENER` token is configured as a ' +\n          '`multi: true` provider.',\n      );\n    }\n    listeners.forEach((listener) => listener(componentRef));\n  }\n\n  /** @internal */\n  ngOnDestroy() {\n    if (this._destroyed) return;\n\n    try {\n      // Call all the lifecycle hooks.\n      this._destroyListeners.forEach((listener) => listener());\n\n      // Destroy all registered views.\n      this._views.slice().forEach((view) => view.destroy());\n    } finally {\n      // Indicate that this instance is destroyed.\n      this._destroyed = true;\n\n      // Release all references.\n      this._views = [];\n      this._destroyListeners = [];\n    }\n  }\n\n  /**\n   * Registers a listener to be called when an instance is destroyed.\n   *\n   * @param callback A callback function to add as a listener.\n   * @returns A function which unregisters a listener.\n   */\n  onDestroy(callback: () => void): VoidFunction {\n    (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed);\n    this._destroyListeners.push(callback);\n    return () => remove(this._destroyListeners, callback);\n  }\n\n  /**\n   * Destroys an Angular application represented by this `ApplicationRef`. Calling this function\n   * will destroy the associated environment injectors as well as all the bootstrapped components\n   * with their views.\n   */\n  destroy(): void {\n    if (this._destroyed) {\n      throw new RuntimeError(\n        RuntimeErrorCode.APPLICATION_REF_ALREADY_DESTROYED,\n        ngDevMode && 'This instance of the `ApplicationRef` has already been destroyed.',\n      );\n    }\n\n    const injector = this._injector as R3Injector;\n\n    // Check that this injector instance supports destroy operation.\n    if (injector.destroy && !injector.destroyed) {\n      // Destroying an underlying injector will trigger the `ngOnDestroy` lifecycle\n      // hook, which invokes the remaining cleanup actions.\n      injector.destroy();\n    }\n  }\n\n  /**\n   * Returns the number of attached views.\n   */\n  get viewCount() {\n    return this._views.length;\n  }\n}\n\nfunction warnIfDestroyed(destroyed: boolean): void {\n  if (destroyed) {\n    console.warn(\n      formatRuntimeError(\n        RuntimeErrorCode.APPLICATION_REF_ALREADY_DESTROYED,\n        'This instance of the `ApplicationRef` has already been destroyed.',\n      ),\n    );\n  }\n}\n\nexport function remove<T>(list: T[], el: T): void {\n  const index = list.indexOf(el);\n  if (index > -1) {\n    list.splice(index, 1);\n  }\n}\n\nexport const enum ApplicationRefDirtyFlags {\n  None = 0,\n\n  /**\n   * A global change detection round has been requested.\n   */\n  ViewTreeGlobal = 0b00000001,\n\n  /**\n   * Part of the view tree is marked for traversal.\n   */\n  ViewTreeTraversal = 0b00000010,\n\n  /**\n   * Part of the view tree is marked to be checked (dirty).\n   */\n  ViewTreeCheck = 0b00000100,\n\n  /**\n   * Helper for any view tree bit being set.\n   */\n  ViewTreeAny = ViewTreeGlobal | ViewTreeTraversal | ViewTreeCheck,\n\n  /**\n   * After render hooks need to run.\n   */\n  AfterRender = 0b00001000,\n\n  /**\n   * Effects at the `ApplicationRef` level.\n   */\n  RootEffects = 0b00010000,\n}\n\nexport function detectChangesInViewIfRequired(\n  lView: LView,\n  notifyErrorHandler: boolean,\n  isFirstPass: boolean,\n  zonelessEnabled: boolean,\n) {\n  // When re-checking, only check views which actually need it.\n  if (!isFirstPass && !requiresRefreshOrTraversal(lView)) {\n    return;\n  }\n\n  const mode =\n    isFirstPass && !zonelessEnabled\n      ? // The first pass is always in Global mode, which includes `CheckAlways` views.\n        // When using zoneless, all root views must be explicitly marked for refresh, even if they are\n        // `CheckAlways`.\n        ChangeDetectionMode.Global\n      : // Only refresh views with the `RefreshView` flag or views is a changed signal\n        ChangeDetectionMode.Targeted;\n  detectChangesInternal(lView, notifyErrorHandler, mode);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {afterNextRender} from '../render3/after_render/hooks';\nimport {Injector} from '../di';\nimport {internalImportProvidersFrom} from '../di/provider_collection';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {\n  cleanupHydratedDeferBlocks,\n  cleanupLContainer,\n  removeDehydratedViewList,\n} from '../hydration/cleanup';\nimport {BlockSummary, ElementTrigger, NUM_ROOT_NODES} from '../hydration/interfaces';\nimport {\n  assertSsrIdDefined,\n  getParentBlockHydrationQueue,\n  isIncrementalHydrationEnabled,\n} from '../hydration/utils';\nimport {PendingTasks, PendingTasksInternal} from '../pending_tasks';\nimport {assertLContainer} from '../render3/assert';\nimport {getComponentDef, getDirectiveDef, getPipeDef} from '../render3/def_getters';\nimport {getTemplateLocationDetails} from '../render3/instructions/element_validation';\nimport {handleError} from '../render3/instructions/shared';\nimport {DirectiveDefList, PipeDefList} from '../render3/interfaces/definition';\nimport {TNode} from '../render3/interfaces/node';\nimport {INJECTOR, LView, TView, TVIEW} from '../render3/interfaces/view';\nimport {getCurrentTNode, getLView} from '../render3/state';\nimport {throwError} from '../util/assert';\nimport {\n  invokeAllTriggerCleanupFns,\n  invokeTriggerCleanupFns,\n  storeTriggerCleanupFn,\n} from './cleanup';\nimport {onViewport} from './dom_triggers';\nimport {onIdle} from './idle_scheduler';\nimport {\n  DEFER_BLOCK_STATE,\n  DeferBlockBehavior,\n  DeferBlockState,\n  DeferBlockTrigger,\n  DeferDependenciesLoadingState,\n  DehydratedDeferBlock,\n  HydrateTriggerDetails,\n  LDeferBlockDetails,\n  ON_COMPLETE_FNS,\n  SSR_UNIQUE_ID,\n  TDeferBlockDetails,\n  TDeferDetailsFlags,\n  TriggerType,\n} from './interfaces';\nimport {DEHYDRATED_BLOCK_REGISTRY, DehydratedBlockRegistry} from './registry';\nimport {\n  DEFER_BLOCK_CONFIG,\n  DEFER_BLOCK_DEPENDENCY_INTERCEPTOR,\n  renderDeferBlockState,\n  renderDeferStateAfterResourceLoading,\n  renderPlaceholder,\n} from './rendering';\nimport {onTimer} from './timer_scheduler';\nimport {\n  addDepsToRegistry,\n  assertDeferredDependenciesLoaded,\n  getLDeferBlockDetails,\n  getPrimaryBlockTNode,\n  getTDeferBlockDetails,\n} from './utils';\nimport {ApplicationRef} from '../application/application_ref';\nimport type {PromiseConstructor} from '../util/promise_with_resolvers';\n\n/**\n * Schedules triggering of a defer block for `on idle` and `on timer` conditions.\n */\nexport function scheduleDelayedTrigger(\n  scheduleFn: (callback: VoidFunction, injector: Injector) => VoidFunction,\n) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  renderPlaceholder(lView, tNode);\n\n  // Exit early to avoid invoking `scheduleFn`, which would\n  // add `setTimeout` call and potentially delay serialization\n  // on the server unnecessarily.\n  if (!shouldTriggerDeferBlock(TriggerType.Regular, lView)) return;\n\n  const injector = lView[INJECTOR];\n  const lDetails = getLDeferBlockDetails(lView, tNode);\n\n  const cleanupFn = scheduleFn(\n    () => triggerDeferBlock(TriggerType.Regular, lView, tNode),\n    injector,\n  );\n  storeTriggerCleanupFn(TriggerType.Regular, lDetails, cleanupFn);\n}\n\n/**\n * Schedules prefetching for `on idle` and `on timer` triggers.\n *\n * @param scheduleFn A function that does the scheduling.\n */\nexport function scheduleDelayedPrefetching(\n  scheduleFn: (callback: VoidFunction, injector: Injector) => VoidFunction,\n  trigger: DeferBlockTrigger,\n) {\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) return;\n\n  const lView = getLView();\n  const injector = lView[INJECTOR];\n\n  // Only trigger the scheduled trigger on the browser\n  // since we don't want to delay the server response.\n  const tNode = getCurrentTNode()!;\n  const tView = lView[TVIEW];\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n\n  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {\n    const lDetails = getLDeferBlockDetails(lView, tNode);\n    const prefetch = () => triggerPrefetching(tDetails, lView, tNode);\n    const cleanupFn = scheduleFn(prefetch, injector);\n    storeTriggerCleanupFn(TriggerType.Prefetch, lDetails, cleanupFn);\n  }\n}\n\n/**\n * Schedules hydration triggering of a defer block for `on idle` and `on timer` conditions.\n */\nexport function scheduleDelayedHydrating(\n  scheduleFn: (callback: VoidFunction, injector: Injector) => VoidFunction,\n  lView: LView,\n  tNode: TNode,\n) {\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) return;\n\n  // Only trigger the scheduled trigger on the browser\n  // since we don't want to delay the server response.\n  const injector = lView[INJECTOR];\n  const lDetails = getLDeferBlockDetails(lView, tNode);\n  const ssrUniqueId = lDetails[SSR_UNIQUE_ID]!;\n  ngDevMode && assertSsrIdDefined(ssrUniqueId);\n\n  const cleanupFn = scheduleFn(\n    () => triggerHydrationFromBlockName(injector, ssrUniqueId),\n    injector,\n  );\n  storeTriggerCleanupFn(TriggerType.Hydrate, lDetails, cleanupFn);\n}\n\n/**\n * Trigger prefetching of dependencies for a defer block.\n *\n * @param tDetails Static information about this defer block.\n * @param lView LView of a host view.\n * @param tNode TNode that represents a defer block.\n */\nexport function triggerPrefetching(tDetails: TDeferBlockDetails, lView: LView, tNode: TNode) {\n  triggerResourceLoading(tDetails, lView, tNode);\n}\n\n/**\n * Trigger loading of defer block dependencies if the process hasn't started yet.\n *\n * @param tDetails Static information about this defer block.\n * @param lView LView of a host view.\n */\nexport function triggerResourceLoading(\n  tDetails: TDeferBlockDetails,\n  lView: LView,\n  tNode: TNode,\n): Promise<unknown> {\n  const injector = lView[INJECTOR];\n  const tView = lView[TVIEW];\n\n  if (tDetails.loadingState !== DeferDependenciesLoadingState.NOT_STARTED) {\n    // If the loading status is different from initial one, it means that\n    // the loading of dependencies is in progress and there is nothing to do\n    // in this function. All details can be obtained from the `tDetails` object.\n    return tDetails.loadingPromise ?? Promise.resolve();\n  }\n\n  const lDetails = getLDeferBlockDetails(lView, tNode);\n  const primaryBlockTNode = getPrimaryBlockTNode(tView, tDetails);\n\n  // Switch from NOT_STARTED -> IN_PROGRESS state.\n  tDetails.loadingState = DeferDependenciesLoadingState.IN_PROGRESS;\n\n  // Prefetching is triggered, cleanup all registered prefetch triggers.\n  invokeTriggerCleanupFns(TriggerType.Prefetch, lDetails);\n\n  let dependenciesFn = tDetails.dependencyResolverFn;\n\n  if (ngDevMode) {\n    // Check if dependency function interceptor is configured.\n    const deferDependencyInterceptor = injector.get(DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, null, {\n      optional: true,\n    });\n\n    if (deferDependencyInterceptor) {\n      dependenciesFn = deferDependencyInterceptor.intercept(dependenciesFn);\n    }\n  }\n\n  // Indicate that an application is not stable and has a pending task.\n  const removeTask = injector.get(PendingTasks).add();\n\n  // The `dependenciesFn` might be `null` when all dependencies within\n  // a given defer block were eagerly referenced elsewhere in a file,\n  // thus no dynamic `import()`s were produced.\n  if (!dependenciesFn) {\n    tDetails.loadingPromise = Promise.resolve().then(() => {\n      tDetails.loadingPromise = null;\n      tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;\n      removeTask();\n    });\n    return tDetails.loadingPromise;\n  }\n\n  // Start downloading of defer block dependencies.\n  tDetails.loadingPromise = Promise.allSettled(dependenciesFn()).then((results) => {\n    let failed = false;\n    const directiveDefs: DirectiveDefList = [];\n    const pipeDefs: PipeDefList = [];\n\n    for (const result of results) {\n      if (result.status === 'fulfilled') {\n        const dependency = result.value;\n        const directiveDef = getComponentDef(dependency) || getDirectiveDef(dependency);\n        if (directiveDef) {\n          directiveDefs.push(directiveDef);\n        } else {\n          const pipeDef = getPipeDef(dependency);\n          if (pipeDef) {\n            pipeDefs.push(pipeDef);\n          }\n        }\n      } else {\n        failed = true;\n        break;\n      }\n    }\n\n    if (failed) {\n      tDetails.loadingState = DeferDependenciesLoadingState.FAILED;\n\n      if (tDetails.errorTmplIndex === null) {\n        const templateLocation = ngDevMode ? getTemplateLocationDetails(lView) : '';\n        const error = new RuntimeError(\n          RuntimeErrorCode.DEFER_LOADING_FAILED,\n          ngDevMode &&\n            'Loading dependencies for `@defer` block failed, ' +\n              `but no \\`@error\\` block was configured${templateLocation}. ` +\n              'Consider using the `@error` block to render an error state.',\n        );\n        handleError(lView, error);\n      }\n    } else {\n      tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;\n\n      // Update directive and pipe registries to add newly downloaded dependencies.\n      const primaryBlockTView = primaryBlockTNode.tView!;\n      if (directiveDefs.length > 0) {\n        primaryBlockTView.directiveRegistry = addDepsToRegistry<DirectiveDefList>(\n          primaryBlockTView.directiveRegistry,\n          directiveDefs,\n        );\n\n        // Extract providers from all NgModules imported by standalone components\n        // used within this defer block.\n        const directiveTypes = directiveDefs.map((def) => def.type);\n        const providers = internalImportProvidersFrom(false, ...directiveTypes);\n        tDetails.providers = providers;\n      }\n      if (pipeDefs.length > 0) {\n        primaryBlockTView.pipeRegistry = addDepsToRegistry<PipeDefList>(\n          primaryBlockTView.pipeRegistry,\n          pipeDefs,\n        );\n      }\n    }\n  });\n\n  return tDetails.loadingPromise.finally(() => {\n    // Loading is completed, we no longer need the loading Promise\n    // and a pending task should also be removed.\n    tDetails.loadingPromise = null;\n    removeTask();\n  });\n}\n\n/**\n * Defines whether we should proceed with triggering a given defer block.\n */\nfunction shouldTriggerDeferBlock(triggerType: TriggerType, lView: LView): boolean {\n  // prevents triggering regular triggers when on the server.\n  if (triggerType === TriggerType.Regular && typeof ngServerMode !== 'undefined' && ngServerMode) {\n    return false;\n  }\n\n  // prevents triggering in the case of a test run with manual defer block configuration.\n  const injector = lView[INJECTOR];\n  const config = injector.get(DEFER_BLOCK_CONFIG, null, {optional: true});\n  if (config?.behavior === DeferBlockBehavior.Manual) {\n    return false;\n  }\n  return true;\n}\n\n/**\n * Attempts to trigger loading of defer block dependencies.\n * If the block is already in a loading, completed or an error state -\n * no additional actions are taken.\n */\nexport function triggerDeferBlock(triggerType: TriggerType, lView: LView, tNode: TNode) {\n  const tView = lView[TVIEW];\n  const lContainer = lView[tNode.index];\n  ngDevMode && assertLContainer(lContainer);\n\n  if (!shouldTriggerDeferBlock(triggerType, lView)) return;\n\n  const lDetails = getLDeferBlockDetails(lView, tNode);\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n\n  // Defer block is triggered, cleanup all registered trigger functions.\n  invokeAllTriggerCleanupFns(lDetails);\n\n  switch (tDetails.loadingState) {\n    case DeferDependenciesLoadingState.NOT_STARTED:\n      renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer);\n      triggerResourceLoading(tDetails, lView, tNode);\n\n      // The `loadingState` might have changed to \"loading\".\n      if (\n        (tDetails.loadingState as DeferDependenciesLoadingState) ===\n        DeferDependenciesLoadingState.IN_PROGRESS\n      ) {\n        renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer);\n      }\n      break;\n    case DeferDependenciesLoadingState.IN_PROGRESS:\n      renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer);\n      renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer);\n      break;\n    case DeferDependenciesLoadingState.COMPLETE:\n      ngDevMode && assertDeferredDependenciesLoaded(tDetails);\n      renderDeferBlockState(DeferBlockState.Complete, tNode, lContainer);\n      break;\n    case DeferDependenciesLoadingState.FAILED:\n      renderDeferBlockState(DeferBlockState.Error, tNode, lContainer);\n      break;\n    default:\n      if (ngDevMode) {\n        throwError('Unknown defer block state');\n      }\n  }\n}\n\n/**\n * The core mechanism for incremental hydration. This triggers or\n * queues hydration for all the blocks in the tree that need to be hydrated\n * and keeps track of all those blocks that were hydrated along the way.\n *\n * Note: the `replayQueuedEventsFn` is only provided when hydration is invoked\n * as a result of an event replay (via JsAction). When hydration is invoked from\n * an instruction set (e.g. `deferOnImmediate`) - there is no need to replay any\n * events.\n */\nexport async function triggerHydrationFromBlockName(\n  injector: Injector,\n  blockName: string,\n  replayQueuedEventsFn?: Function,\n) {\n  const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);\n  const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;\n\n  // Make sure we don't hydrate/trigger the same thing multiple times\n  if (blocksBeingHydrated.has(blockName)) {\n    return;\n  }\n\n  // Trigger resource loading and hydration for the blocks in the queue in the order of highest block\n  // to lowest block. Once a block has finished resource loading, after next render fires after hydration\n  // finishes. The new block will have its defer instruction called and will be in the registry.\n  // Due to timing related to potential nested control flow, this has to be scheduled after the next render.\n  const {parentBlockPromise, hydrationQueue} = getParentBlockHydrationQueue(blockName, injector);\n  if (hydrationQueue.length === 0) return;\n\n  // It's possible that the hydrationQueue topmost item is actually in the process of hydrating and has\n  // a promise already. In that case, we don't want to destroy that promise and queue it again.\n  if (parentBlockPromise !== null) {\n    hydrationQueue.shift();\n  }\n\n  // The hydrating map in the registry prevents re-triggering hydration for a block that's already in\n  // the hydration queue. Here we generate promises for each of the blocks about to be hydrated\n  populateHydratingStateForQueue(dehydratedBlockRegistry, hydrationQueue);\n\n  // We await this after populating the hydration state so we can prevent re-triggering hydration for\n  // the same blocks while this promise is being awaited.\n  if (parentBlockPromise !== null) {\n    await parentBlockPromise;\n  }\n\n  const topmostParentBlock = hydrationQueue[0];\n  if (dehydratedBlockRegistry.has(topmostParentBlock)) {\n    // the topmost parent block is already in the registry and we can proceed\n    // with hydration.\n    await triggerHydrationForBlockQueue(injector, hydrationQueue, replayQueuedEventsFn);\n  } else {\n    // the topmost parent block is not yet in the registry, which may mean\n    // a lazy loaded route, a control flow branch was taken, a route has\n    // been navigated, etc. So we need to queue up the hydration process\n    // so that it can be finished after the top block has had its defer\n    // instruction executed.\n    dehydratedBlockRegistry.awaitParentBlock(\n      topmostParentBlock,\n      async () =>\n        await triggerHydrationForBlockQueue(injector, hydrationQueue, replayQueuedEventsFn),\n    );\n  }\n}\n\n/**\n * The core mechanism for incremental hydration. This triggers\n * hydration for all the blocks in the tree that need to be hydrated\n * and keeps track of all those blocks that were hydrated along the way.\n *\n * Note: the `replayQueuedEventsFn` is only provided when hydration is invoked\n * as a result of an event replay (via JsAction). When hydration is invoked from\n * an instruction set (e.g. `deferOnImmediate`) - there is no need to replay any\n * events.\n */\nexport async function triggerHydrationForBlockQueue(\n  injector: Injector,\n  hydrationQueue: string[],\n  replayQueuedEventsFn?: Function,\n): Promise<void> {\n  const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);\n  const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;\n\n  // Indicate that we have some pending async work.\n  const pendingTasks = injector.get(PendingTasksInternal);\n  const taskId = pendingTasks.add();\n\n  // Actually do the triggering and hydration of the queue of blocks\n  for (let blockQueueIdx = 0; blockQueueIdx < hydrationQueue.length; blockQueueIdx++) {\n    const dehydratedBlockId = hydrationQueue[blockQueueIdx];\n    const dehydratedDeferBlock = dehydratedBlockRegistry.get(dehydratedBlockId);\n\n    if (dehydratedDeferBlock != null) {\n      // trigger the block resources and await next render for hydration. This should result\n      // in the next block ɵɵdefer instruction being called and that block being added to the dehydrated registry.\n      await triggerResourceLoadingForHydration(dehydratedDeferBlock);\n      await nextRender(injector);\n\n      // if the content has changed since server rendering, we need to check for the expected block\n      // being in the registry or if errors occurred. In that case, we need to clean up the remaining expected\n      // content that won't be rendered or fetched.\n      if (deferBlockHasErrored(dehydratedDeferBlock)) {\n        // Either the expected block has not yet had its ɵɵdefer instruction called or the block errored out when fetching\n        // resources. In the former case, either we're hydrating too soon or the client and server differ. In both cases,\n        // we need to clean up child content and promises.\n        removeDehydratedViewList(dehydratedDeferBlock);\n        cleanupRemainingHydrationQueue(\n          hydrationQueue.slice(blockQueueIdx),\n          dehydratedBlockRegistry,\n        );\n        break;\n      }\n      // The defer block has not errored and we've finished fetching resources and rendering.\n      // At this point it is safe to resolve the hydration promise.\n      blocksBeingHydrated.get(dehydratedBlockId)!.resolve();\n    } else {\n      // The expected block has not yet had its ɵɵdefer instruction called. This is likely due to content changing between\n      // client and server. We need to clean up the dehydrated DOM in the container since it no longer is valid.\n      cleanupParentContainer(blockQueueIdx, hydrationQueue, dehydratedBlockRegistry);\n      cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);\n      break;\n    }\n  }\n\n  const lastBlockName = hydrationQueue[hydrationQueue.length - 1];\n\n  // Await hydration completion for the last block.\n  await blocksBeingHydrated.get(lastBlockName)?.promise;\n\n  // All async work is done, remove the taskId from the registry.\n  pendingTasks.remove(taskId);\n\n  // Replay any queued events, if any exist and the replay operation was requested.\n  if (replayQueuedEventsFn) {\n    replayQueuedEventsFn(hydrationQueue);\n  }\n\n  // Cleanup after hydration of all affected defer blocks.\n  cleanupHydratedDeferBlocks(\n    dehydratedBlockRegistry.get(lastBlockName),\n    hydrationQueue,\n    dehydratedBlockRegistry,\n    injector.get(ApplicationRef),\n  );\n}\n\nexport function deferBlockHasErrored(deferBlock: DehydratedDeferBlock): boolean {\n  return (\n    getLDeferBlockDetails(deferBlock.lView, deferBlock.tNode)[DEFER_BLOCK_STATE] ===\n    DeferBlockState.Error\n  );\n}\n\n/**\n * Clean up the parent container of a block where content changed between server and client.\n * The parent of a block going through `triggerHydrationFromBlockName` will contain the\n * dehydrated content that needs to be cleaned up. So we have to do the clean up from that location\n * in the tree.\n */\nfunction cleanupParentContainer(\n  currentBlockIdx: number,\n  hydrationQueue: string[],\n  dehydratedBlockRegistry: DehydratedBlockRegistry,\n) {\n  // If a parent block exists, it's in the hydration queue in front of the current block.\n  const parentDeferBlockIdx = currentBlockIdx - 1;\n  const parentDeferBlock =\n    parentDeferBlockIdx > -1\n      ? dehydratedBlockRegistry.get(hydrationQueue[parentDeferBlockIdx])\n      : null;\n  if (parentDeferBlock) {\n    cleanupLContainer(parentDeferBlock.lContainer);\n  }\n}\n\nfunction cleanupRemainingHydrationQueue(\n  hydrationQueue: string[],\n  dehydratedBlockRegistry: DehydratedBlockRegistry,\n) {\n  const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;\n  for (const dehydratedBlockId in hydrationQueue) {\n    blocksBeingHydrated.get(dehydratedBlockId)?.reject();\n  }\n  dehydratedBlockRegistry.cleanup(hydrationQueue);\n}\n\n/**\n * Generates a new promise for every defer block in the hydrating queue\n */\nfunction populateHydratingStateForQueue(registry: DehydratedBlockRegistry, queue: string[]) {\n  for (let blockId of queue) {\n    registry.hydrating.set(blockId, (Promise as unknown as PromiseConstructor).withResolvers());\n  }\n}\n\n// Waits for the next render cycle to complete\nfunction nextRender(injector: Injector): Promise<void> {\n  return new Promise<void>((resolveFn) => afterNextRender(resolveFn, {injector}));\n}\n\nasync function triggerResourceLoadingForHydration(\n  dehydratedBlock: DehydratedDeferBlock,\n): Promise<void> {\n  const {tNode, lView} = dehydratedBlock;\n  const lDetails = getLDeferBlockDetails(lView, tNode);\n\n  return new Promise<void>((resolve) => {\n    onDeferBlockCompletion(lDetails, resolve);\n    triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n  });\n}\n\n/**\n * Registers cleanup functions for a defer block when the block has finished\n * fetching and rendering\n */\nfunction onDeferBlockCompletion(lDetails: LDeferBlockDetails, callback: VoidFunction) {\n  if (!Array.isArray(lDetails[ON_COMPLETE_FNS])) {\n    lDetails[ON_COMPLETE_FNS] = [];\n  }\n  lDetails[ON_COMPLETE_FNS].push(callback);\n}\n\n/**\n * Determines whether specific trigger types should be attached during an instruction firing\n * to ensure the proper triggers for a given type are used.\n */\nexport function shouldAttachTrigger(triggerType: TriggerType, lView: LView, tNode: TNode): boolean {\n  if (triggerType === TriggerType.Regular) {\n    return shouldAttachRegularTrigger(lView, tNode);\n  } else if (triggerType === TriggerType.Hydrate) {\n    return !shouldAttachRegularTrigger(lView, tNode);\n  }\n  // TriggerType.Prefetch is active only on the client\n  return !(typeof ngServerMode !== 'undefined' && ngServerMode);\n}\n\n/**\n * Defines whether a regular trigger logic (e.g. \"on viewport\") should be attached\n * to a defer block. This function defines a condition, which mutually excludes\n * `deferOn*` and `deferHydrateOn*` triggers, to make sure only one of the trigger\n * types is active for a block with the current state.\n */\nfunction shouldAttachRegularTrigger(lView: LView, tNode: TNode): boolean {\n  const injector = lView[INJECTOR];\n\n  const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);\n  const incrementalHydrationEnabled = isIncrementalHydrationEnabled(injector);\n  const hasHydrateTriggers =\n    tDetails.flags !== null &&\n    (tDetails.flags & TDeferDetailsFlags.HasHydrateTriggers) ===\n      TDeferDetailsFlags.HasHydrateTriggers;\n\n  // On the server:\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    // Regular triggers are activated on the server when:\n    //  - Either Incremental Hydration is *not* enabled\n    //  - Or Incremental Hydration is enabled, but a given block doesn't have \"hydrate\" triggers\n    return !incrementalHydrationEnabled || !hasHydrateTriggers;\n  }\n\n  // On the client:\n  const lDetails = getLDeferBlockDetails(lView, tNode);\n  const wasServerSideRendered = lDetails[SSR_UNIQUE_ID] !== null;\n\n  if (hasHydrateTriggers && wasServerSideRendered && incrementalHydrationEnabled) {\n    return false;\n  }\n  return true;\n}\n\n/**\n * Retrives a Defer Block's list of hydration triggers\n */\nexport function getHydrateTriggers(\n  tView: TView,\n  tNode: TNode,\n): Map<DeferBlockTrigger, HydrateTriggerDetails | null> {\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n  return (tDetails.hydrateTriggers ??= new Map());\n}\n\n/**\n * Loops through all defer block summaries and ensures all the blocks triggers are\n * properly initialized\n */\nexport function processAndInitTriggers(\n  injector: Injector,\n  blockData: Map<string, BlockSummary>,\n  nodes: Map<string, Comment>,\n) {\n  const idleElements: ElementTrigger[] = [];\n  const timerElements: ElementTrigger[] = [];\n  const viewportElements: ElementTrigger[] = [];\n  const immediateElements: ElementTrigger[] = [];\n  for (let [blockId, blockSummary] of blockData) {\n    const commentNode = nodes.get(blockId);\n    if (commentNode !== undefined) {\n      const numRootNodes = blockSummary.data[NUM_ROOT_NODES];\n      let currentNode: Comment | HTMLElement = commentNode;\n      for (let i = 0; i < numRootNodes; i++) {\n        currentNode = currentNode.previousSibling as HTMLElement;\n        if (currentNode.nodeType !== Node.ELEMENT_NODE) {\n          continue;\n        }\n        const elementTrigger: ElementTrigger = {el: currentNode, blockName: blockId};\n        // hydrate\n        if (blockSummary.hydrate.idle) {\n          idleElements.push(elementTrigger);\n        }\n        if (blockSummary.hydrate.immediate) {\n          immediateElements.push(elementTrigger);\n        }\n        if (blockSummary.hydrate.timer !== null) {\n          elementTrigger.delay = blockSummary.hydrate.timer;\n          timerElements.push(elementTrigger);\n        }\n        if (blockSummary.hydrate.viewport) {\n          viewportElements.push(elementTrigger);\n        }\n      }\n    }\n  }\n\n  setIdleTriggers(injector, idleElements);\n  setImmediateTriggers(injector, immediateElements);\n  setViewportTriggers(injector, viewportElements);\n  setTimerTriggers(injector, timerElements);\n}\n\nfunction setIdleTriggers(injector: Injector, elementTriggers: ElementTrigger[]) {\n  for (const elementTrigger of elementTriggers) {\n    const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);\n    const onInvoke = () => triggerHydrationFromBlockName(injector, elementTrigger.blockName);\n    const cleanupFn = onIdle(onInvoke, injector);\n    registry.addCleanupFn(elementTrigger.blockName, cleanupFn);\n  }\n}\n\nfunction setViewportTriggers(injector: Injector, elementTriggers: ElementTrigger[]) {\n  if (elementTriggers.length > 0) {\n    const registry = injector.get(DEHYDRATED_BLO   CK_REGISTRY);\n    for (let elementTrigger of elementTriggers) {\n      const cleanupFn = onViewport(\n        elementTrigger.el,\n        () => triggerHydrationFromBlockName(injector, elementTrigger.blockName),\n        injector,\n      );\n      registry.addCleanupFn(elementTrigger.blockName, cleanupFn);\n    }\n  }\n}\n\nfunction setTimerTriggers(injector: Injector, elementTriggers: ElementTrigger[]) {\n  for (const elementTrigger of elementTriggers) {\n    const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);\n    const onInvoke = () => triggerHydrationFromBlockName(injector, elementTrigger.blockName);\n    const timerFn = onTimer(elementTrigger.delay!);\n    const cleanupFn = timerFn(onInvoke, injector);\n    registry.addCleanupFn(elementTrigger.blockName, cleanupFn);\n  }\n}\n\nfunction setImmediateTriggers(injector: Injector, elementTriggers: ElementTrigger[]) {\n  for (const elementTrigger of elementTriggers) {\n    // Note: we intentionally avoid awaiting each call and instead kick off\n    // the hydration process simultaneously for all defer blocks with this trigger;\n    triggerHydrationFromBlockName(injector, elementTrigger.blockName);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../primitives/signals';\n\nimport {\n  DEFER_BLOCK_ID,\n  DEFER_BLOCK_STATE as SERIALIZED_DEFER_BLOCK_STATE,\n} from '../hydration/interfaces';\nimport {populateDehydratedViewsInLContainer} from '../linker/view_container_ref';\nimport {bindingUpdated} from '../render3/bindings';\nimport {declareTemplate} from '../render3/instructions/template';\nimport {DEHYDRATED_VIEWS} from '../render3/interfaces/container';\nimport {HEADER_OFFSET, INJECTOR, TVIEW} from '../render3/interfaces/view';\nimport {\n  getCurrentTNode,\n  getLView,\n  getSelectedTNode,\n  getTView,\n  nextBindingIndex,\n} from '../render3/state';\nimport {removeLViewOnDestroy, storeLViewOnDestroy} from '../render3/util/view_utils';\nimport {performanceMarkFeature} from '../util/performance';\nimport {invokeAllTriggerCleanupFns, storeTriggerCleanupFn} from './cleanup';\nimport {onHover, onInteraction, onViewport, registerDomTrigger} from './dom_triggers';\nimport {onIdle} from './idle_scheduler';\nimport {\n  DEFER_BLOCK_STATE,\n  DeferBlockInternalState,\n  DeferBlockState,\n  DeferDependenciesLoadingState,\n  DependencyResolverFn,\n  DeferBlockTrigger,\n  LDeferBlockDetails,\n  TDeferBlockDetails,\n  TriggerType,\n  SSR_UNIQUE_ID,\n  TDeferDetailsFlags,\n} from './interfaces';\nimport {onTimer} from './timer_scheduler';\nimport {\n  getLDeferBlockDetails,\n  getTDeferBlockDetails,\n  setLDeferBlockDetails,\n  setTDeferBlockDetails,\n  trackTriggerForDebugging,\n} from './utils';\nimport {DEHYDRATED_BLOCK_REGISTRY, DehydratedBlockRegistry} from './registry';\nimport {assertIncrementalHydrationIsConfigured, assertSsrIdDefined} from '../hydration/utils';\nimport {ɵɵdeferEnableTimerScheduling, renderPlaceholder} from './rendering';\n\nimport {\n  getHydrateTriggers,\n  triggerHydrationFromBlockName,\n  scheduleDelayedHydrating,\n  scheduleDelayedPrefetching,\n  scheduleDelayedTrigger,\n  triggerDeferBlock,\n  triggerPrefetching,\n  triggerResourceLoading,\n  shouldAttachTrigger,\n} from './triggering';\nimport {formatRuntimeError, RuntimeErrorCode} from '../errors';\nimport {Console} from '../console';\nimport {Injector} from '../di';\n\n/**\n * Indicates whether we've already produced a warning,\n * prevents the logic from producing it multiple times.\n */\nlet _hmrWarningProduced = false;\n\n/**\n * Logs a message into the console to indicate that `@defer` block\n * dependencies are loaded eagerly when the HMR mode is enabled.\n */\nfunction logHmrWarning(injector: Injector) {\n  if (!_hmrWarningProduced) {\n    _hmrWarningProduced = true;\n    const console = injector.get(Console);\n    // tslint:disable-next-line:no-console\n    console.log(\n      formatRuntimeError(\n        RuntimeErrorCode.DEFER_IN_HMR_MODE,\n        'Angular has detected that this application contains `@defer` blocks ' +\n          'and the hot module replacement (HMR) mode is enabled. All `@defer` ' +\n          'block dependencies will be loaded eagerly.',\n      ),\n    );\n  }\n}\n\n/**\n * Creates runtime data structures for defer blocks.\n *\n * @param index Index of the `defer` instruction.\n * @param primaryTmplIndex Index of the template with the primary block content.\n * @param dependencyResolverFn Function that contains dependencies for this defer block.\n * @param loadingTmplIndex Index of the template with the loading block content.\n * @param placeholderTmplIndex Index of the template with the placeholder block content.\n * @param errorTmplIndex Index of the template with the error block content.\n * @param loadingConfigIndex Index in the constants array of the configuration of the loading.\n *     block.\n * @param placeholderConfigIndex Index in the constants array of the configuration of the\n *     placeholder block.\n * @param enableTimerScheduling Function that enables timer-related scheduling if `after`\n *     or `minimum` parameters are setup on the `@loading` or `@placeholder` blocks.\n * @param flags A set of flags to define a particular behavior (e.g. to indicate that\n *              hydrate triggers are present and regular triggers should be deactivated\n *              in certain scenarios).\n *\n * @codeGenApi\n */\nexport function ɵɵdefer(\n  index: number,\n  primaryTmplIndex: number,\n  dependencyResolverFn?: DependencyResolverFn | null,\n  loadingTmplIndex?: number | null,\n  placeholderTmplIndex?: number | null,\n  errorTmplIndex?: number | null,\n  loadingConfigIndex?: number | null,\n  placeholderConfigIndex?: number | null,\n  enableTimerScheduling?: typeof ɵɵdeferEnableTimerScheduling,\n  flags?: TDeferDetailsFlags | null,\n) {\n  const lView = getLView();\n  const tView = getTView();\n  const adjustedIndex = index + HEADER_OFFSET;\n  const tNode = declareTemplate(lView, tView, index, null, 0, 0);\n  const injector = lView[INJECTOR];\n\n  if (tView.firstCreatePass) {\n    performanceMarkFeature('NgDefer');\n\n    if (ngDevMode && typeof ngHmrMode !== 'undefined' && ngHmrMode) {\n      logHmrWarning(injector);\n    }\n\n    const tDetails: TDeferBlockDetails = {\n      primaryTmplIndex,\n      loadingTmplIndex: loadingTmplIndex ?? null,\n      placeholderTmplIndex: placeholderTmplIndex ?? null,\n      errorTmplIndex: errorTmplIndex ?? null,\n      placeholderBlockConfig: null,\n      loadingBlockConfig: null,\n      dependencyResolverFn: dependencyResolverFn ?? null,\n      loadingState: DeferDependenciesLoadingState.NOT_STARTED,\n      loadingPromise: null,\n      providers: null,\n      hydrateTriggers: null,\n      debug: null,\n      flags: flags ?? TDeferDetailsFlags.Default,\n    };\n    enableTimerScheduling?.(tView, tDetails, placeholderConfigIndex, loadingConfigIndex);\n    setTDeferBlockDetails(tView, adjustedIndex, tDetails);\n  }\n\n  const lContainer = lView[adjustedIndex];\n\n  // If hydration is enabled, looks up dehydrated views in the DOM\n  // using hydration annotation info and stores those views on LContainer.\n  // In client-only mode, this function is a noop.\n  populateDehydratedViewsInLContainer(lContainer, tNode, lView);\n\n  let ssrBlockState = null;\n  let ssrUniqueId: string | null = null;\n  if (lContainer[DEHYDRATED_VIEWS]?.length > 0) {\n    const info = lContainer[DEHYDRATED_VIEWS][0].data;\n    ssrUniqueId = info[DEFER_BLOCK_ID] ?? null;\n    ssrBlockState = info[SERIALIZED_DEFER_BLOCK_STATE];\n  }\n\n  // Init instance-specific defer details and store it.\n  const lDetails: LDeferBlockDetails = [\n    null, // NEXT_DEFER_BLOCK_STATE\n    DeferBlockInternalState.Initial, // DEFER_BLOCK_STATE\n    null, // STATE_IS_FROZEN_UNTIL\n    null, // LOADING_AFTER_CLEANUP_FN\n    null, // TRIGGER_CLEANUP_FNS\n    null, // PREFETCH_TRIGGER_CLEANUP_FNS\n    ssrUniqueId, // SSR_UNIQUE_ID\n    ssrBlockState, // SSR_BLOCK_STATE\n    null, // ON_COMPLETE_FNS\n    null, // HYDRATE_TRIGGER_CLEANUP_FNS\n  ];\n  setLDeferBlockDetails(lView, adjustedIndex, lDetails);\n\n  let registry: DehydratedBlockRegistry | null = null;\n  if (ssrUniqueId !== null) {\n    ngDevMode && assertIncrementalHydrationIsConfigured(injector);\n\n    // Store this defer block in the registry, to have an access to\n    // internal data structures from hydration runtime code.\n    registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);\n    registry.add(ssrUniqueId, {lView, tNode, lContainer});\n  }\n\n  const onLViewDestroy = () => {\n    invokeAllTriggerCleanupFns(lDetails);\n    if (ssrUniqueId !== null) {\n      registry?.cleanup([ssrUniqueId]);\n    }\n  };\n\n  // When defer block is triggered - unsubscribe from LView destroy cleanup.\n  storeTriggerCleanupFn(TriggerType.Regular, lDetails, () =>\n    removeLViewOnDestroy(lView, onLViewDestroy),\n  );\n  storeLViewOnDestroy(lView, onLViewDestroy);\n}\n\n/**\n * Loads defer block dependencies when a trigger value becomes truthy.\n * @codeGenApi\n */\nexport function ɵɵdeferWhen(rawValue: unknown) {\n  const lView = getLView();\n  const tNode = getSelectedTNode();\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'when <expression>');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Regular, lView, tNode)) return;\n\n  const bindingIndex = nextBindingIndex();\n  if (bindingUpdated(lView, bindingIndex, rawValue)) {\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      const value = Boolean(rawValue); // handle truthy or falsy values\n      const lDetails = getLDeferBlockDetails(lView, tNode);\n      const renderedState = lDetails[DEFER_BLOCK_STATE];\n      if (value === false && renderedState === DeferBlockInternalState.Initial) {\n        // If nothing is rendered yet, render a placeholder (if defined).\n        renderPlaceholder(lView, tNode);\n      } else if (\n        value === true &&\n        (renderedState === DeferBlockInternalState.Initial ||\n          renderedState === DeferBlockState.Placeholder)\n      ) {\n        triggerDeferBlock(TriggerType.Regular, lView, tNode);\n      }\n    } finally {\n      setActiveConsumer(prevConsumer);\n    }\n  }\n}\n\n/**\n * Prefetches the deferred content when a value becomes truthy.\n * @codeGenApi\n */\nexport function ɵɵdeferPrefetchWhen(rawValue: unknown) {\n  const lView = getLView();\n  const tNode = getSelectedTNode();\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'prefetch when <expression>');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Prefetch, lView, tNode)) return;\n\n  const bindingIndex = nextBindingIndex();\n\n  if (bindingUpdated(lView, bindingIndex, rawValue)) {\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      const value = Boolean(rawValue); // handle truthy or falsy values\n      const tView = lView[TVIEW];\n      const tNode = getSelectedTNode();\n      const tDetails = getTDeferBlockDetails(tView, tNode);\n      if (value === true && tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {\n        // If loading has not been started yet, trigger it now.\n        triggerPrefetching(tDetails, lView, tNode);\n      }\n    } finally {\n      setActiveConsumer(prevConsumer);\n    }\n  }\n}\n\n/**\n * Hydrates the deferred content when a value becomes truthy.\n * @codeGenApi\n */\nexport function ɵɵdeferHydrateWhen(rawValue: unknown) {\n  const lView = getLView();\n  const tNode = getSelectedTNode();\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate when <expression>');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Hydrate, lView, tNode)) return;\n\n  // TODO(incremental-hydration): audit all defer instructions to reduce unnecessary work by\n  // moving function calls inside their relevant control flow blocks\n  const bindingIndex = nextBindingIndex();\n  const tView = getTView();\n  const hydrateTriggers = getHydrateTriggers(tView, tNode);\n  hydrateTriggers.set(DeferBlockTrigger.When, null);\n\n  if (bindingUpdated(lView, bindingIndex, rawValue)) {\n    if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n      // We are on the server and SSR for defer blocks is enabled.\n      triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n    } else {\n      const injector = lView[INJECTOR];\n      const prevConsumer = setActiveConsumer(null);\n      try {\n        const value = Boolean(rawValue); // handle truthy or falsy values\n        if (value === true) {\n          // The `when` condition has changed to `true`, trigger defer block loading\n          // if the block is either in initial (nothing is rendered) or a placeholder\n          // state.\n          const lDetails = getLDeferBlockDetails(lView, tNode);\n          const ssrUniqueId = lDetails[SSR_UNIQUE_ID]!;\n          ngDevMode && assertSsrIdDefined(ssrUniqueId);\n          triggerHydrationFromBlockName(injector, ssrUniqueId);\n        }\n      } finally {\n        setActiveConsumer(prevConsumer);\n      }\n    }\n  }\n}\n\n/**\n * Specifies that hydration never occurs.\n * @codeGenApi\n */\nexport function ɵɵdeferHydrateNever() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate never');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Hydrate, lView, tNode)) return;\n\n  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);\n  hydrateTriggers.set(DeferBlockTrigger.Never, null);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    // We are on the server and SSR for defer blocks is enabled.\n    triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n  }\n}\n\n/**\n * Sets up logic to handle the `on idle` deferred trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferOnIdle() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'on idle');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Regular, lView, tNode)) return;\n\n  scheduleDelayedTrigger(onIdle);\n}\n\n/**\n * Sets up logic to handle the `prefetch on idle` deferred trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferPrefetchOnIdle() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'prefetch on idle');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Prefetch, lView, tNode)) return;\n\n  scheduleDelayedPrefetching(onIdle, DeferBlockTrigger.Idle);\n}\n\n/**\n * Sets up logic to handle the `on idle` deferred trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferHydrateOnIdle() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on idle');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Hydrate, lView, tNode)) return;\n\n  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);\n  hydrateTriggers.set(DeferBlockTrigger.Idle, null);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    // We are on the server and SSR for defer blocks is enabled.\n    triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n  } else {\n    scheduleDelayedHydrating(onIdle, lView, tNode);\n  }\n}\n\n/**\n * Sets up logic to handle the `on immediate` deferred trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferOnImmediate() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'on immediate');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Regular, lView, tNode)) return;\n\n  // Render placeholder block only if loading template is not present and we're on\n  // the client to avoid content flickering, since it would be immediately replaced\n  // by the loading block.\n  const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);\n  if (tDetails.loadingTmplIndex === null) {\n    renderPlaceholder(lView, tNode);\n  }\n  triggerDeferBlock(TriggerType.Regular, lView, tNode);\n}\n\n/**\n * Sets up logic to handle the `prefetch on immediate` deferred trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferPrefetchOnImmediate() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'prefetch on immediate');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Prefetch, lView, tNode)) return;\n\n  const tView = lView[TVIEW];\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n\n  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {\n    triggerResourceLoading(tDetails, lView, tNode);\n  }\n}\n\n/**\n * Sets up logic to handle the `on immediate` hydrate trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferHydrateOnImmediate() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on immediate');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Hydrate, lView, tNode)) return;\n\n  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);\n  hydrateTriggers.set(DeferBlockTrigger.Immediate, null);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n  } else {\n    const injector = lView[INJECTOR];\n    const lDetails = getLDeferBlockDetails(lView, tNode);\n    const ssrUniqueId = lDetails[SSR_UNIQUE_ID]!;\n    ngDevMode && assertSsrIdDefined(ssrUniqueId);\n    triggerHydrationFromBlockName(injector, ssrUniqueId);\n  }\n}\n/**\n * Creates runtime data structures for the `on timer` deferred trigger.\n * @param delay Amount of time to wait before loading the content.\n * @codeGenApi\n */\nexport function ɵɵdeferOnTimer(delay: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, `on timer(${delay}ms)`);\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Regular, lView, tNode)) return;\n\n  scheduleDelayedTrigger(onTimer(delay));\n}\n\n/**\n * Creates runtime data structures for the `prefetch on timer` deferred trigger.\n * @param delay Amount of time to wait before prefetching the content.\n * @codeGenApi\n */\nexport function ɵɵdeferPrefetchOnTimer(delay: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on timer(${delay}ms)`);\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Prefetch, lView, tNode)) return;\n\n  scheduleDelayedPrefetching(onTimer(delay), DeferBlockTrigger.Timer);\n}\n\n/**\n * Creates runtime data structures for the `on timer` hydrate trigger.\n * @param delay Amount of time to wait before loading the content.\n * @codeGenApi\n */\nexport function ɵɵdeferHydrateOnTimer(delay: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, `hydrate on timer(${delay}ms)`);\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Hydrate, lView, tNode)) return;\n\n  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);\n  hydrateTriggers.set(DeferBlockTrigger.Timer, {delay});\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    // We are on the server and SSR for defer blocks is enabled.\n    triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n  } else {\n    scheduleDelayedHydrating(onTimer(delay), lView, tNode);\n  }\n}\n\n/**\n * Creates runtime data structures for the `on hover` deferred trigger.\n * @param triggerIndex Index at which to find the trigger element.\n * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferOnHover(triggerIndex: number, walkUpTimes?: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(\n      lView[TVIEW],\n      tNode,\n      `on hover${walkUpTimes === -1 ? '' : '(<target>)'}`,\n    );\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Regular, lView, tNode)) return;\n\n  renderPlaceholder(lView, tNode);\n\n  // Avoid adding event listeners when this instruction is invoked on the server.\n  if (!(typeof ngServerMode !== 'undefined' && ngServerMode)) {\n    registerDomTrigger(\n      lView,\n      tNode,\n      triggerIndex,\n      walkUpTimes,\n      onHover,\n      () => triggerDeferBlock(TriggerType.Regular, lView, tNode),\n      TriggerType.Regular,\n    );\n  }\n}\n\n/**\n * Creates runtime data structures for the `prefetch on hover` deferred trigger.\n * @param triggerIndex Index at which to find the trigger element.\n * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferPrefetchOnHover(triggerIndex: number, walkUpTimes?: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(\n      lView[TVIEW],\n      tNode,\n      `prefetch on hover${walkUpTimes === -1 ? '' : '(<target>)'}`,\n    );\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Prefetch, lView, tNode)) return;\n\n  const tView = lView[TVIEW];\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n\n  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {\n    registerDomTrigger(\n      lView,\n      tNode,\n      triggerIndex,\n      walkUpTimes,\n      onHover,\n      () => triggerPrefetching(tDetails, lView, tNode),\n      TriggerType.Prefetch,\n    );\n  }\n}\n\n/**\n * Creates runtime data structures for the `on hover` hydrate trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferHydrateOnHover() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on hover');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Hydrate, lView, tNode)) return;\n\n  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);\n  hydrateTriggers.set(DeferBlockTrigger.Hover, null);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    // We are on the server and SSR for defer blocks is enabled.\n    triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n  }\n  // The actual triggering of hydration on hover is handled by JSAction in\n  // event_replay.ts.\n}\n\n/**\n * Creates runtime data structures for the `on interaction` deferred trigger.\n * @param triggerIndex Index at which to find the trigger element.\n * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferOnInteraction(triggerIndex: number, walkUpTimes?: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(\n      lView[TVIEW],\n      tNode,\n      `on interaction${walkUpTimes === -1 ? '' : '(<target>)'}`,\n    );\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Regular, lView, tNode)) return;\n\n  renderPlaceholder(lView, tNode);\n\n  // Avoid adding event listeners when this instruction is invoked on the server.\n  if (!(typeof ngServerMode !== 'undefined' && ngServerMode)) {\n    registerDomTrigger(\n      lView,\n      tNode,\n      triggerIndex,\n      walkUpTimes,\n      onInteraction,\n      () => triggerDeferBlock(TriggerType.Regular, lView, tNode),\n      TriggerType.Regular,\n    );\n  }\n}\n\n/**\n * Creates runtime data structures for the `prefetch on interaction` deferred trigger.\n * @param triggerIndex Index at which to find the trigger element.\n * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferPrefetchOnInteraction(triggerIndex: number, walkUpTimes?: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(\n      lView[TVIEW],\n      tNode,\n      `prefetch on interaction${walkUpTimes === -1 ? '' : '(<target>)'}`,\n    );\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Prefetch, lView, tNode)) return;\n\n  const tView = lView[TVIEW];\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n\n  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {\n    registerDomTrigger(\n      lView,\n      tNode,\n      triggerIndex,\n      walkUpTimes,\n      onInteraction,\n      () => triggerPrefetching(tDetails, lView, tNode),\n      TriggerType.Prefetch,\n    );\n  }\n}\n\n/**\n * Creates runtime data structures for the `on interaction` hydrate trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferHydrateOnInteraction() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on interaction');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Hydrate, lView, tNode)) return;\n\n  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);\n  hydrateTriggers.set(DeferBlockTrigger.Interaction, null);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    // We are on the server and SSR for defer blocks is enabled.\n    triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n  }\n  // The actual triggering of hydration on interaction is handled by JSAction in\n  // event_replay.ts.\n}\n\n/**\n * Creates runtime data structures for the `on viewport` deferred trigger.\n * @param triggerIndex Index at which to find the trigger element.\n * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferOnViewport(triggerIndex: number, walkUpTimes?: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(\n      lView[TVIEW],\n      tNode,\n      `on viewport${walkUpTimes === -1 ? '' : '(<target>)'}`,\n    );\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Regular, lView, tNode)) return;\n\n  renderPlaceholder(lView, tNode);\n\n  // Avoid adding event listeners when this instruction is invoked on the server.\n  if (!(typeof ngServerMode !== 'undefined' && ngServerMode)) {\n    registerDomTrigger(\n      lView,\n      tNode,\n      triggerIndex,\n      walkUpTimes,\n      onViewport,\n      () => triggerDeferBlock(TriggerType.Regular, lView, tNode),\n      TriggerType.Regular,\n    );\n  }\n}\n\n/**\n * Creates runtime data structures for the `prefetch on viewport` deferred trigger.\n * @param triggerIndex Index at which to find the trigger element.\n * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferPrefetchOnViewport(triggerIndex: number, walkUpTimes?: number) {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(\n      lView[TVIEW],\n      tNode,\n      `prefetch on viewport${walkUpTimes === -1 ? '' : '(<target>)'}`,\n    );\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Prefetch, lView, tNode)) return;\n\n  const tView = lView[TVIEW];\n  const tDetails = getTDeferBlockDetails(tView, tNode);\n\n  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {\n    registerDomTrigger(\n      lView,\n      tNode,\n      triggerIndex,\n      walkUpTimes,\n      onViewport,\n      () => triggerPrefetching(tDetails, lView, tNode),\n      TriggerType.Prefetch,\n    );\n  }\n}\n\n/**\n * Creates runtime data structures for the `on viewport` hydrate trigger.\n * @codeGenApi\n */\nexport function ɵɵdeferHydrateOnViewport() {\n  const lView = getLView();\n  const tNode = getCurrentTNode()!;\n\n  if (ngDevMode) {\n    trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on viewport');\n  }\n\n  if (!shouldAttachTrigger(TriggerType.Hydrate, lView, tNode)) return;\n\n  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);\n  hydrateTriggers.set(DeferBlockTrigger.Viewport, null);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    // We are on the server and SSR for defer blocks is enabled.\n    triggerDeferBlock(TriggerType.Hydrate, lView, tNode);\n  }\n  // The actual triggering of hydration on viewport happens in triggering.ts,\n  // since these instructions won't exist for dehydrated content.\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {bindingUpdated} from '../bindings';\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {getLView, getSelectedTNode, getTView, nextBindingIndex} from '../state';\nimport {elementAttributeInternal, storePropertyBindingMetadata} from './shared';\n\n/**\n * Updates the value of or removes a bound attribute on an Element.\n *\n * Used in the case of `[attr.title]=\"value\"`\n *\n * @param name name The name of the attribute.\n * @param value value The attribute is removed when value is `null` or `undefined`.\n *                  Otherwise the attribute value is set to the stringified value.\n * @param sanitizer An optional function used to sanitize the value.\n * @param namespace Optional namespace to use when setting the attribute.\n *\n * @codeGenApi\n */\nexport function ɵɵattribute(\n  name: string,\n  value: any,\n  sanitizer?: SanitizerFn | null,\n  namespace?: string,\n): typeof ɵɵattribute {\n  const lView = getLView();\n  const bindingIndex = nextBindingIndex();\n  if (bindingUpdated(lView, bindingIndex, value)) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, name, value, sanitizer, namespace);\n    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, 'attr.' + name, bindingIndex);\n  }\n  return ɵɵattribute;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertEqual, assertLessThan} from '../../util/assert';\nimport {bindingUpdated, bindingUpdated2, bindingUpdated3, bindingUpdated4} from '../bindings';\nimport {LView} from '../interfaces/view';\nimport {getBindingIndex, incrementBindingIndex, nextBindingIndex, setBindingIndex} from '../state';\nimport {NO_CHANGE} from '../tokens';\nimport {renderStringify} from '../util/stringify_utils';\n\n/**\n * Create interpolation bindings with a variable number of expressions.\n *\n * If there are 1 to 8 expressions `interpolation1()` to `interpolation8()` should be used instead.\n * Those are faster because there is no need to create an array of expressions and iterate over it.\n *\n * `values`:\n * - has static text at even indexes,\n * - has evaluated expressions at odd indexes.\n *\n * Returns the concatenated string when any of the arguments changes, `NO_CHANGE` otherwise.\n */\nexport function interpolationV(lView: LView, values: any[]): string | NO_CHANGE {\n  ngDevMode && assertLessThan(2, values.length, 'should have at least 3 values');\n  ngDevMode && assertEqual(values.length % 2, 1, 'should have an odd number of values');\n  let isBindingUpdated = false;\n  let bindingIndex = getBindingIndex();\n\n  for (let i = 1; i < values.length; i += 2) {\n    // Check if bindings (odd indexes) have changed\n    isBindingUpdated = bindingUpdated(lView, bindingIndex++, values[i]) || isBindingUpdated;\n  }\n  setBindingIndex(bindingIndex);\n\n  if (!isBindingUpdated) {\n    return NO_CHANGE;\n  }\n\n  // Build the updated content\n  let content = values[0];\n  for (let i = 1; i < values.length; i += 2) {\n    content += renderStringify(values[i]) + values[i + 1];\n  }\n\n  return content;\n}\n\n/**\n * Creates an interpolation binding with 1 expression.\n *\n * @param prefix static value used for concatenation only.\n * @param v0 value checked for change.\n * @param suffix static value used for concatenation only.\n */\nexport function interpolation1(\n  lView: LView,\n  prefix: string,\n  v0: any,\n  suffix: string,\n): string | NO_CHANGE {\n  const different = bindingUpdated(lView, nextBindingIndex(), v0);\n  return different ? prefix + renderStringify(v0) + suffix : NO_CHANGE;\n}\n\n/**\n * Creates an interpolation binding with 2 expressions.\n */\nexport function interpolation2(\n  lView: LView,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  suffix: string,\n): string | NO_CHANGE {\n  const bindingIndex = getBindingIndex();\n  const different = bindingUpdated2(lView, bindingIndex, v0, v1);\n  incrementBindingIndex(2);\n\n  return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + suffix : NO_CHANGE;\n}\n\n/**\n * Creates an interpolation binding with 3 expressions.\n */\nexport function interpolation3(\n  lView: LView,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  suffix: string,\n): string | NO_CHANGE {\n  const bindingIndex = getBindingIndex();\n  const different = bindingUpdated3(lView, bindingIndex, v0, v1, v2);\n  incrementBindingIndex(3);\n\n  return different\n    ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + suffix\n    : NO_CHANGE;\n}\n\n/**\n * Create an interpolation binding with 4 expressions.\n */\nexport function interpolation4(\n  lView: LView,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  suffix: string,\n): string | NO_CHANGE {\n  const bindingIndex = getBindingIndex();\n  const different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);\n  incrementBindingIndex(4);\n\n  return different\n    ? prefix +\n        renderStringify(v0) +\n        i0 +\n        renderStringify(v1) +\n        i1 +\n        renderStringify(v2) +\n        i2 +\n        renderStringify(v3) +\n        suffix\n    : NO_CHANGE;\n}\n\n/**\n * Creates an interpolation binding with 5 expressions.\n */\nexport function interpolation5(\n  lView: LView,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  suffix: string,\n): string | NO_CHANGE {\n  const bindingIndex = getBindingIndex();\n  let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);\n  different = bindingUpdated(lView, bindingIndex + 4, v4) || different;\n  incrementBindingIndex(5);\n\n  return different\n    ? prefix +\n        renderStringify(v0) +\n        i0 +\n        renderStringify(v1) +\n        i1 +\n        renderStringify(v2) +\n        i2 +\n        renderStringify(v3) +\n        i3 +\n        renderStringify(v4) +\n        suffix\n    : NO_CHANGE;\n}\n\n/**\n * Creates an interpolation binding with 6 expressions.\n */\nexport function interpolation6(\n  lView: LView,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  suffix: string,\n): string | NO_CHANGE {\n  const bindingIndex = getBindingIndex();\n  let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);\n  different = bindingUpdated2(lView, bindingIndex + 4, v4, v5) || different;\n  incrementBindingIndex(6);\n\n  return different\n    ? prefix +\n        renderStringify(v0) +\n        i0 +\n        renderStringify(v1) +\n        i1 +\n        renderStringify(v2) +\n        i2 +\n        renderStringify(v3) +\n        i3 +\n        renderStringify(v4) +\n        i4 +\n        renderStringify(v5) +\n        suffix\n    : NO_CHANGE;\n}\n\n/**\n * Creates an interpolation binding with 7 expressions.\n */\nexport function interpolation7(\n  lView: LView,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  suffix: string,\n): string | NO_CHANGE {\n  const bindingIndex = getBindingIndex();\n  let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);\n  different = bindingUpdated3(lView, bindingIndex + 4, v4, v5, v6) || different;\n  incrementBindingIndex(7);\n\n  return different\n    ? prefix +\n        renderStringify(v0) +\n        i0 +\n        renderStringify(v1) +\n        i1 +\n        renderStringify(v2) +\n        i2 +\n        renderStringify(v3) +\n        i3 +\n        renderStringify(v4) +\n        i4 +\n        renderStringify(v5) +\n        i5 +\n        renderStringify(v6) +\n        suffix\n    : NO_CHANGE;\n}\n\n/**\n * Creates an interpolation binding with 8 expressions.\n */\nexport function interpolation8(\n  lView: LView,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  i6: string,\n  v7: any,\n  suffix: string,\n): string | NO_CHANGE {\n  const bindingIndex = getBindingIndex();\n  let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);\n  different = bindingUpdated4(lView, bindingIndex + 4, v4, v5, v6, v7) || different;\n  incrementBindingIndex(8);\n\n  return different\n    ? prefix +\n        renderStringify(v0) +\n        i0 +\n        renderStringify(v1) +\n        i1 +\n        renderStringify(v2) +\n        i2 +\n        renderStringify(v3) +\n        i3 +\n        renderStringify(v4) +\n        i4 +\n        renderStringify(v5) +\n        i5 +\n        renderStringify(v6) +\n        i6 +\n        renderStringify(v7) +\n        suffix\n    : NO_CHANGE;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {getBindingIndex, getLView, getSelectedTNode, getTView} from '../state';\nimport {NO_CHANGE} from '../tokens';\nimport {\n  interpolation1,\n  interpolation2,\n  interpolation3,\n  interpolation4,\n  interpolation5,\n  interpolation6,\n  interpolation7,\n  interpolation8,\n  interpolationV,\n} from './interpolation';\nimport {elementAttributeInternal, storePropertyBindingMetadata} from './shared';\n\n/**\n *\n * Update an interpolated attribute on an element with single bound value surrounded by text.\n *\n * Used when the value passed to a property has 1 interpolated value in it:\n *\n * ```html\n * <div attr.title=\"prefix{{v0}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolate1('title', 'prefix', v0, 'suffix');\n * ```\n *\n * @param attrName The name of the attribute to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolate1(\n  attrName: string,\n  prefix: string,\n  v0: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolate1 {\n  const lView = getLView();\n  const interpolatedValue = interpolation1(lView, prefix, v0, suffix);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - 1,\n        prefix,\n        suffix,\n      );\n  }\n  return ɵɵattributeInterpolate1;\n}\n\n/**\n *\n * Update an interpolated attribute on an element with 2 bound values surrounded by text.\n *\n * Used when the value passed to a property has 2 interpolated values in it:\n *\n * ```html\n * <div attr.title=\"prefix{{v0}}-{{v1}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolate2('title', 'prefix', v0, '-', v1, 'suffix');\n * ```\n *\n * @param attrName The name of the attribute to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolate2(\n  attrName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolate2 {\n  const lView = getLView();\n  const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - 2,\n        prefix,\n        i0,\n        suffix,\n      );\n  }\n  return ɵɵattributeInterpolate2;\n}\n\n/**\n *\n * Update an interpolated attribute on an element with 3 bound values surrounded by text.\n *\n * Used when the value passed to a property has 3 interpolated values in it:\n *\n * ```html\n * <div attr.title=\"prefix{{v0}}-{{v1}}-{{v2}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolate3(\n * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix');\n * ```\n *\n * @param attrName The name of the attribute to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolate3(\n  attrName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolate3 {\n  const lView = getLView();\n  const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - 3,\n        prefix,\n        i0,\n        i1,\n        suffix,\n      );\n  }\n  return ɵɵattributeInterpolate3;\n}\n\n/**\n *\n * Update an interpolated attribute on an element with 4 bound values surrounded by text.\n *\n * Used when the value passed to a property has 4 interpolated values in it:\n *\n * ```html\n * <div attr.title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolate4(\n * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');\n * ```\n *\n * @param attrName The name of the attribute to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolate4(\n  attrName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolate4 {\n  const lView = getLView();\n  const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - 4,\n        prefix,\n        i0,\n        i1,\n        i2,\n        suffix,\n      );\n  }\n  return ɵɵattributeInterpolate4;\n}\n\n/**\n *\n * Update an interpolated attribute on an element with 5 bound values surrounded by text.\n *\n * Used when the value passed to a property has 5 interpolated values in it:\n *\n * ```html\n * <div attr.title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolate5(\n * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');\n * ```\n *\n * @param attrName The name of the attribute to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolate5(\n  attrName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolate5 {\n  const lView = getLView();\n  const interpolatedValue = interpolation5(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    suffix,\n  );\n  if (interpolatedValue !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - 5,\n        prefix,\n        i0,\n        i1,\n        i2,\n        i3,\n        suffix,\n      );\n  }\n  return ɵɵattributeInterpolate5;\n}\n\n/**\n *\n * Update an interpolated attribute on an element with 6 bound values surrounded by text.\n *\n * Used when the value passed to a property has 6 interpolated values in it:\n *\n * ```html\n * <div attr.title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolate6(\n *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');\n * ```\n *\n * @param attrName The name of the attribute to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolate6(\n  attrName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolate6 {\n  const lView = getLView();\n  const interpolatedValue = interpolation6(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    suffix,\n  );\n  if (interpolatedValue !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - 6,\n        prefix,\n        i0,\n        i1,\n        i2,\n        i3,\n        i4,\n        suffix,\n      );\n  }\n  return ɵɵattributeInterpolate6;\n}\n\n/**\n *\n * Update an interpolated attribute on an element with 7 bound values surrounded by text.\n *\n * Used when the value passed to a property has 7 interpolated values in it:\n *\n * ```html\n * <div attr.title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolate7(\n *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');\n * ```\n *\n * @param attrName The name of the attribute to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolate7(\n  attrName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolate7 {\n  const lView = getLView();\n  const interpolatedValue = interpolation7(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    suffix,\n  );\n  if (interpolatedValue !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - 7,\n        prefix,\n        i0,\n        i1,\n        i2,\n        i3,\n        i4,\n        i5,\n        suffix,\n      );\n  }\n  return ɵɵattributeInterpolate7;\n}\n\n/**\n *\n * Update an interpolated attribute on an element with 8 bound values surrounded by text.\n *\n * Used when the value passed to a property has 8 interpolated values in it:\n *\n * ```html\n * <div attr.title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolate8(\n *  'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');\n * ```\n *\n * @param attrName The name of the attribute to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param i6 Static value used for concatenation only.\n * @param v7 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolate8(\n  attrName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  i6: string,\n  v7: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolate8 {\n  const lView = getLView();\n  const interpolatedValue = interpolation8(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    i6,\n    v7,\n    suffix,\n  );\n  if (interpolatedValue !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolatedValue, sanitizer, namespace);\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - 8,\n        prefix,\n        i0,\n        i1,\n        i2,\n        i3,\n        i4,\n        i5,\n        i6,\n        suffix,\n      );\n  }\n  return ɵɵattributeInterpolate8;\n}\n\n/**\n * Update an interpolated attribute on an element with 9 or more bound values surrounded by text.\n *\n * Used when the number of interpolated values exceeds 8.\n *\n * ```html\n * <div\n *  title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵattributeInterpolateV(\n *  'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,\n *  'suffix']);\n * ```\n *\n * @param attrName The name of the attribute to update.\n * @param values The collection of values and the strings in-between those values, beginning with\n * a string prefix and ending with a string suffix.\n * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵattributeInterpolateV(\n  attrName: string,\n  values: any[],\n  sanitizer?: SanitizerFn,\n  namespace?: string,\n): typeof ɵɵattributeInterpolateV {\n  const lView = getLView();\n  const interpolated = interpolationV(lView, values);\n  if (interpolated !== NO_CHANGE) {\n    const tNode = getSelectedTNode();\n    elementAttributeInternal(tNode, lView, attrName, interpolated, sanitizer, namespace);\n    if (ngDevMode) {\n      const interpolationInBetween = [values[0]]; // prefix\n      for (let i = 2; i < values.length; i += 2) {\n        interpolationInBetween.push(values[i]);\n      }\n      storePropertyBindingMetadata(\n        getTView().data,\n        tNode,\n        'attr.' + attrName,\n        getBindingIndex() - interpolationInBetween.length + 1,\n        ...interpolationInBetween,\n      );\n    }\n  }\n  return ɵɵattributeInterpolateV;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {KeyValueArray} from '../../util/array_utils';\nimport {assertNumber, assertNumberInRange} from '../../util/assert';\n\n/**\n * Value stored in the `TData` which is needed to re-concatenate the styling.\n *\n * See: `TStylingKeyPrimitive` and `TStylingStatic`\n */\nexport type TStylingKey = TStylingKeyPrimitive | TStylingStatic;\n\n/**\n * The primitive portion (`TStylingStatic` removed) of the value stored in the `TData` which is\n * needed to re-concatenate the styling.\n *\n * - `string`: Stores the property name. Used with `ɵɵstyleProp`/`ɵɵclassProp` instruction.\n * - `null`: Represents map, so there is no name. Used with `ɵɵstyleMap`/`ɵɵclassMap`.\n * - `false`: Represents an ignore case. This happens when `ɵɵstyleProp`/`ɵɵclassProp` instruction\n *   is combined with directive which shadows its input `@Input('class')`. That way the binding\n *   should not participate in the styling resolution.\n */\nexport type TStylingKeyPrimitive = string | null | false;\n\n/**\n * Store the static values for the styling binding.\n *\n * The `TStylingStatic` is just `KeyValueArray` where key `\"\"` (stored at location 0) contains the\n * `TStylingKey` (stored at location 1). In other words this wraps the `TStylingKey` such that the\n * `\"\"` contains the wrapped value.\n *\n * When instructions are resolving styling they may need to look forward or backwards in the linked\n * list to resolve the value. For this reason we have to make sure that he linked list also contains\n * the static values. However the list only has space for one item per styling instruction. For this\n * reason we store the static values here as part of the `TStylingKey`. This means that the\n * resolution function when looking for a value needs to first look at the binding value, and than\n * at `TStylingKey` (if it exists).\n *\n * Imagine we have:\n *\n * ```angular-ts\n * <div class=\"TEMPLATE\" my-dir>\n *\n * @Directive({\n *   host: {\n *     class: 'DIR',\n *     '[class.dynamic]': 'exp' // ɵɵclassProp('dynamic', ctx.exp);\n *   }\n * })\n * ```\n *\n * In the above case the linked list will contain one item:\n *\n * ```ts\n *   // assume binding location: 10 for `ɵɵclassProp('dynamic', ctx.exp);`\n *   tData[10] = <TStylingStatic>[\n *     '': 'dynamic', // This is the wrapped value of `TStylingKey`\n *     'DIR': true,   // This is the default static value of directive binding.\n *   ];\n *   tData[10 + 1] = 0; // We don't have prev/next.\n *\n *   lView[10] = undefined;     // assume `ctx.exp` is `undefined`\n *   lView[10 + 1] = undefined; // Just normalized `lView[10]`\n * ```\n *\n * So when the function is resolving styling value, it first needs to look into the linked list\n * (there is none) and than into the static `TStylingStatic` too see if there is a default value for\n * `dynamic` (there is not). Therefore it is safe to remove it.\n *\n * If setting `true` case:\n * ```ts\n *   lView[10] = true;     // assume `ctx.exp` is `true`\n *   lView[10 + 1] = true; // Just normalized `lView[10]`\n * ```\n * So when the function is resolving styling value, it first needs to look into the linked list\n * (there is none) and than into `TNode.residualClass` (TNode.residualStyle) which contains\n * ```ts\n *   tNode.residualClass = [\n *     'TEMPLATE': true,\n *   ];\n * ```\n *\n * This means that it is safe to add class.\n */\nexport interface TStylingStatic extends KeyValueArray<any> {}\n\n/**\n * This is a branded number which contains previous and next index.\n *\n * When we come across styling instructions we need to store the `TStylingKey` in the correct\n * order so that we can re-concatenate the styling value in the desired priority.\n *\n * The insertion can happen either at the:\n * - end of template as in the case of coming across additional styling instruction in the template\n * - in front of the template in the case of coming across additional instruction in the\n *   `hostBindings`.\n *\n * We use `TStylingRange` to store the previous and next index into the `TData` where the template\n * bindings can be found.\n *\n * - bit 0 is used to mark that the previous index has a duplicate for current value.\n * - bit 1 is used to mark that the next index has a duplicate for the current value.\n * - bits 2-16 are used to encode the next/tail of the template.\n * - bits 17-32 are used to encode the previous/head of template.\n *\n * NODE: *duplicate* false implies that it is statically known that this binding will not collide\n * with other bindings and therefore there is no need to check other bindings. For example the\n * bindings in `<div [style.color]=\"exp\" [style.width]=\"exp\">` will never collide and will have\n * their bits set accordingly. Previous duplicate means that we may need to check previous if the\n * current binding is `null`. Next duplicate means that we may need to check next bindings if the\n * current binding is not `null`.\n *\n * NOTE: `0` has special significance and represents `null` as in no additional pointer.\n */\nexport type TStylingRange = number & {\n  __brand__: 'TStylingRange';\n};\n\n/**\n * Shift and masks constants for encoding two numbers into and duplicate info into a single number.\n */\nexport const enum StylingRange {\n  /// Number of bits to shift for the previous pointer\n  PREV_SHIFT = 17,\n  /// Previous pointer mask.\n  PREV_MASK = 0xfffe0000,\n\n  /// Number of bits to shift for the next pointer\n  NEXT_SHIFT = 2,\n  /// Next pointer mask.\n  NEXT_MASK = 0x001fffc,\n\n  // Mask to remove negative bit. (interpret number as positive)\n  UNSIGNED_MASK = 0x7fff,\n\n  /**\n   * This bit is set if the previous bindings contains a binding which could possibly cause a\n   * duplicate. For example: `<div [style]=\"map\" [style.width]=\"width\">`, the `width` binding will\n   * have previous duplicate set. The implication is that if `width` binding becomes `null`, it is\n   * necessary to defer the value to `map.width`. (Because `width` overwrites `map.width`.)\n   */\n  PREV_DUPLICATE = 0x02,\n\n  /**\n   * This bit is set to if the next binding contains a binding which could possibly cause a\n   * duplicate. For example: `<div [style]=\"map\" [style.width]=\"width\">`, the `map` binding will\n   * have next duplicate set. The implication is that if `map.width` binding becomes not `null`, it\n   * is necessary to defer the value to `width`. (Because `width` overwrites `map.width`.)\n   */\n  NEXT_DUPLICATE = 0x01,\n}\n\nexport function toTStylingRange(prev: number, next: number): TStylingRange {\n  ngDevMode && assertNumberInRange(prev, 0, StylingRange.UNSIGNED_MASK);\n  ngDevMode && assertNumberInRange(next, 0, StylingRange.UNSIGNED_MASK);\n  return ((prev << StylingRange.PREV_SHIFT) | (next << StylingRange.NEXT_SHIFT)) as TStylingRange;\n}\n\nexport function getTStylingRangePrev(tStylingRange: TStylingRange): number {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  return (tStylingRange >> StylingRange.PREV_SHIFT) & StylingRange.UNSIGNED_MASK;\n}\n\nexport function getTStylingRangePrevDuplicate(tStylingRange: TStylingRange): boolean {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  return (tStylingRange & StylingRange.PREV_DUPLICATE) == StylingRange.PREV_DUPLICATE;\n}\n\nexport function setTStylingRangePrev(\n  tStylingRange: TStylingRange,\n  previous: number,\n): TStylingRange {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  ngDevMode && assertNumberInRange(previous, 0, StylingRange.UNSIGNED_MASK);\n  return ((tStylingRange & ~StylingRange.PREV_MASK) |\n    (previous << StylingRange.PREV_SHIFT)) as TStylingRange;\n}\n\nexport function setTStylingRangePrevDuplicate(tStylingRange: TStylingRange): TStylingRange {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  return (tStylingRange | StylingRange.PREV_DUPLICATE) as TStylingRange;\n}\n\nexport function getTStylingRangeNext(tStylingRange: TStylingRange): number {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  return (tStylingRange & StylingRange.NEXT_MASK) >> StylingRange.NEXT_SHIFT;\n}\n\nexport function setTStylingRangeNext(tStylingRange: TStylingRange, next: number): TStylingRange {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  ngD   evMode && assertNumberInRange(next, 0, StylingRange.UNSIGNED_MASK);\n  return ((tStylingRange & ~StylingRange.NEXT_MASK) | //\n    (next << StylingRange.NEXT_SHIFT)) as TStylingRange;\n}\n\nexport function getTStylingRangeNextDuplicate(tStylingRange: TStylingRange): boolean {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  return (tStylingRange & StylingRange.NEXT_DUPLICATE) === StylingRange.NEXT_DUPLICATE;\n}\n\nexport function setTStylingRangeNextDuplicate(tStylingRange: TStylingRange): TStylingRange {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  return (tStylingRange | StylingRange.NEXT_DUPLICATE) as TStylingRange;\n}\n\nexport function getTStylingRangeTail(tStylingRange: TStylingRange): number {\n  ngDevMode && assertNumber(tStylingRange, 'expected number');\n  const next = getTStylingRangeNext(tStylingRange);\n  return next === 0 ? getTStylingRangePrev(tStylingRange) : next;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {KeyValueArray, keyValueArrayIndexOf} from '../../util/array_utils';\nimport {assertEqual, assertIndexInRange, assertNotEqual} from '../../util/assert';\nimport {assertFirstUpdatePass} from '../assert';\nimport {TNode} from '../interfaces/node';\nimport {\n  getTStylingRangeNext,\n  getTStylingRangePrev,\n  setTStylingRangeNext,\n  setTStylingRangeNextDuplicate,\n  setTStylingRangePrev,\n  setTStylingRangePrevDuplicate,\n  toTStylingRange,\n  TStylingKey,\n  TStylingKeyPrimitive,\n  TStylingRange,\n} from '../interfaces/styling';\nimport {TData} from '../interfaces/view';\nimport {getTView} from '../state';\n\n/**\n * NOTE: The word `styling` is used interchangeably as style or class styling.\n *\n * This file contains code to link styling instructions together so that they can be replayed in\n * priority order. The file exists because Ivy styling instruction execution order does not match\n * that of the priority order. The purpose of this code is to create a linked list so that the\n * instructions can be traversed in priority order when computing the styles.\n *\n * Assume we are dealing with the following code:\n * ```angular-ts\n * @Component({\n *   template: `\n *     <my-cmp [style]=\" {color: '#001'} \"\n *             [style.color]=\" #002 \"\n *             dir-style-color-1\n *             dir-style-color-2> `\n * })\n * class ExampleComponent {\n *   static ngComp = ... {\n *     ...\n *     // Compiler ensures that `ɵɵstyleProp` is after `ɵɵstyleMap`\n *     ɵɵstyleMap({color: '#001'});\n *     ɵɵstyleProp('color', '#002');\n *     ...\n *   }\n * }\n *\n * @Directive({\n *   selector: `[dir-style-color-1]',\n * })\n * class Style1Directive {\n *   @HostBinding('style') style = {color: '#005'};\n *   @HostBinding('style.color') color = '#006';\n *\n *   static ngDir = ... {\n *     ...\n *     // Compiler ensures that `ɵɵstyleProp` is after `ɵɵstyleMap`\n *     ɵɵstyleMap({color: '#005'});\n *     ɵɵstyleProp('color', '#006');\n *     ...\n *   }\n * }\n *\n * @Directive({\n *   selector: `[dir-style-color-2]',\n * })\n * class Style2Directive {\n *   @HostBinding('style') style = {color: '#007'};\n *   @HostBinding('style.color') color = '#008';\n *\n *   static ngDir = ... {\n *     ...\n *     // Compiler ensures that `ɵɵstyleProp` is after `ɵɵstyleMap`\n *     ɵɵstyleMap({color: '#007'});\n *     ɵɵstyleProp('color', '#008');\n *     ...\n *   }\n * }\n *\n * @Directive({\n *   selector: `my-cmp',\n * })\n * class MyComponent {\n *   @HostBinding('style') style = {color: '#003'};\n *   @HostBinding('style.color') color = '#004';\n *\n *   static ngComp = ... {\n *     ...\n *     // Compiler ensures that `ɵɵstyleProp` is after `ɵɵstyleMap`\n *     ɵɵstyleMap({color: '#003'});\n *     ɵɵstyleProp('color', '#004');\n *     ...\n *   }\n * }\n * ```\n *\n * The Order of instruction execution is:\n *\n * NOTE: the comment binding location is for illustrative purposes only.\n *\n * ```ts\n * // Template: (ExampleComponent)\n *     ɵɵstyleMap({color: '#001'});   // Binding index: 10\n *     ɵɵstyleProp('color', '#002');  // Binding index: 12\n * // MyComponent\n *     ɵɵstyleMap({color: '#003'});   // Binding index: 20\n *     ɵɵstyleProp('color', '#004');  // Binding index: 22\n * // Style1Directive\n *     ɵɵstyleMap({color: '#005'});   // Binding index: 24\n *     ɵɵstyleProp('color', '#006');  // Binding index: 26\n * // Style2Directive\n *     ɵɵstyleMap({color: '#007'});   // Binding index: 28\n *     ɵɵstyleProp('color', '#008');  // Binding index: 30\n * ```\n *\n * The correct priority order of concatenation is:\n *\n * ```ts\n * // MyComponent\n *     ɵɵstyleMap({color: '#003'});   // Binding index: 20\n *     ɵɵstyleProp('color', '#004');  // Binding index: 22\n * // Style1Directive\n *     ɵɵstyleMap({color: '#005'});   // Binding index: 24\n *     ɵɵstyleProp('color', '#006');  // Binding index: 26\n * // Style2Directive\n *     ɵɵstyleMap({color: '#007'});   // Binding index: 28\n *     ɵɵstyleProp('color', '#008');  // Binding index: 30\n * // Template: (ExampleComponent)\n *     ɵɵstyleMap({color: '#001'});   // Binding index: 10\n *     ɵɵstyleProp('color', '#002');  // Binding index: 12\n * ```\n *\n * What color should be rendered?\n *\n * Once the items are correctly sorted in the list, the answer is simply the last item in the\n * concatenation list which is `#002`.\n *\n * To do so we keep a linked list of all of the bindings which pertain to this element.\n * Notice that the bindings are inserted in the order of execution, but the `TView.data` allows\n * us to traverse them in the order of priority.\n *\n * |Idx|`TView.data`|`LView`          | Notes\n * |---|------------|-----------------|--------------\n * |...|            |                 |\n * |10 |`null`      |`{color: '#001'}`| `ɵɵstyleMap('color', {color: '#001'})`\n * |11 |`30 | 12`   | ...             |\n * |12 |`color`     |`'#002'`         | `ɵɵstyleProp('color', '#002')`\n * |13 |`10 | 0`    | ...             |\n * |...|            |                 |\n * |20 |`null`      |`{color: '#003'}`| `ɵɵstyleMap('color', {color: '#003'})`\n * |21 |`0 | 22`    | ...             |\n * |22 |`color`     |`'#004'`         | `ɵɵstyleProp('color', '#004')`\n * |23 |`20 | 24`   | ...             |\n * |24 |`null`      |`{color: '#005'}`| `ɵɵstyleMap('color', {color: '#005'})`\n * |25 |`22 | 26`   | ...             |\n * |26 |`color`     |`'#006'`         | `ɵɵstyleProp('color', '#006')`\n * |27 |`24 | 28`   | ...             |\n * |28 |`null`      |`{color: '#007'}`| `ɵɵstyleMap('color', {color: '#007'})`\n * |29 |`26 | 30`   | ...             |\n * |30 |`color`     |`'#008'`         | `ɵɵstyleProp('color', '#008')`\n * |31 |`28 | 10`   | ...             |\n *\n * The above data structure allows us to re-concatenate the styling no matter which data binding\n * changes.\n *\n * NOTE: in addition to keeping track of next/previous index the `TView.data` also stores prev/next\n * duplicate bit. The duplicate bit if true says there either is a binding with the same name or\n * there is a map (which may contain the name). This information is useful in knowing if other\n * styles with higher priority need to be searched for overwrites.\n *\n * NOTE: See `should support example in 'tnode_linked_list.ts' documentation` in\n * `tnode_linked_list_spec.ts` for working example.\n */\nlet __unused_const_as_closure_does_not_like_standalone_comment_blocks__: undefined;\n\n/**\n * Insert new `tStyleValue` at `TData` and link existing style bindings such that we maintain linked\n * list of styles and compute the duplicate flag.\n *\n * Note: this function is executed during `firstUpdatePass` only to populate the `TView.data`.\n *\n * The function works by keeping track of `tStylingRange` which contains two pointers pointing to\n * the head/tail of the template portion of the styles.\n *  - if `isHost === false` (we are template) then insertion is at tail of `TStylingRange`\n *  - if `isHost === true` (we are host binding) then insertion is at head of `TStylingRange`\n *\n * @param tData The `TData` to insert into.\n * @param tNode `TNode` associated with the styling element.\n * @param tStylingKey See `TStylingKey`.\n * @param index location of where `tStyleValue` should be stored (and linked into list.)\n * @param isHostBinding `true` if the insertion is for a `hostBinding`. (insertion is in front of\n *               template.)\n * @param isClassBinding True if the associated `tStylingKey` as a `class` styling.\n *                       `tNode.classBindings` should be used (or `tNode.styleBindings` otherwise.)\n */\nexport function insertTStylingBinding(\n  tData: TData,\n  tNode: TNode,\n  tStylingKeyWithStatic: TStylingKey,\n  index: number,\n  isHostBinding: boolean,\n  isClassBinding: boolean,\n): void {\n  ngDevMode && assertFirstUpdatePass(getTView());\n  let tBindings = isClassBinding ? tNode.classBindings : tNode.styleBindings;\n  let tmplHead = getTStylingRangePrev(tBindings);\n  let tmplTail = getTStylingRangeNext(tBindings);\n\n  tData[index] = tStylingKeyWithStatic;\n  let isKeyDuplicateOfStatic = false;\n  let tStylingKey: TStylingKeyPrimitive;\n  if (Array.isArray(tStylingKeyWithStatic)) {\n    // We are case when the `TStylingKey` contains static fields as well.\n    const staticKeyValueArray = tStylingKeyWithStatic as KeyValueArray<any>;\n    tStylingKey = staticKeyValueArray[1]; // unwrap.\n    // We need to check if our key is present in the static so that we can mark it as duplicate.\n    if (\n      tStylingKey === null ||\n      keyValueArrayIndexOf(staticKeyValueArray, tStylingKey as string) > 0\n    ) {\n      // tStylingKey is present in the statics, need to mark it as duplicate.\n      isKeyDuplicateOfStatic = true;\n    }\n  } else {\n    tStylingKey = tStylingKeyWithStatic;\n  }\n  if (isHostBinding) {\n    // We are inserting host bindings\n\n    // If we don't have template bindings then `tail` is 0.\n    const hasTemplateBindings = tmplTail !== 0;\n    // This is important to know because that means that the `head` can't point to the first\n    // template bindings (there are none.) Instead the head points to the tail of the template.\n    if (hasTemplateBindings) {\n      // template head's \"prev\" will point to last host binding or to 0 if no host bindings yet\n      const previousNode = getTStylingRangePrev(tData[tmplHead + 1] as TStylingRange);\n      tData[index + 1] = toTStylingRange(previousNode, tmplHead);\n      // if a host binding has already been registered, we need to update the next of that host\n      // binding to point to this one\n      if (previousNode !== 0) {\n        // We need to update the template-tail value to point to us.\n        tData[previousNode + 1] = setTStylingRangeNext(\n          tData[previousNode + 1] as TStylingRange,\n          index,\n        );\n      }\n      // The \"previous\" of the template binding head should point to this host binding\n      tData[tmplHead + 1] = setTStylingRangePrev(tData[tmplHead + 1] as TStylingRange, index);\n    } else {\n      tData[index + 1] = toTStylingRange(tmplHead, 0);\n      // if a host binding has already been registered, we need to update the next of that host\n      // binding to point to this one\n      if (tmplHead !== 0) {\n        // We need to update the template-tail value to point to us.\n        tData[tmplHead + 1] = setTStylingRangeNext(tData[tmplHead + 1] as TStylingRange, index);\n      }\n      // if we don't have template, the head points to template-tail, and needs to be advanced.\n      tmplHead = index;\n    }\n  } else {\n    // We are inserting in template section.\n    // We need to set this binding's \"previous\" to the current template tail\n    tData[index + 1] = toTStylingRange(tmplTail, 0);\n    ngDevMode &&\n      assertEqual(\n        tmplHead !== 0 && tmplTail === 0,\n        false,\n        'Adding template bindings after hostBindings is not allowed.',\n      );\n    if (tmplHead === 0) {\n      tmplHead = index;\n    } else {\n      // We need to update the previous value \"next\" to point to this binding\n      tData[tmplTail + 1] = setTStylingRangeNext(tData[tmplTail + 1] as TStylingRange, index);\n    }\n    tmplTail = index;\n  }\n\n  // Now we need to update / compute the duplicates.\n  // Starting with our location search towards head (least priority)\n  if (isKeyDuplicateOfStatic) {\n    tData[index + 1] = setTStylingRangePrevDuplicate(tData[index + 1] as TStylingRange);\n  }\n  markDuplicates(tData, tStylingKey, index, true);\n  markDuplicates(tData, tStylingKey, index, false);\n  markDuplicateOfResidualStyling(tNode, tStylingKey, tData, index, isClassBinding);\n\n  tBindings = toTStylingRange(tmplHead, tmplTail);\n  if (isClassBinding) {\n    tNode.classBindings = tBindings;\n  } else {\n    tNode.styleBindings = tBindings;\n  }\n}\n\n/**\n * Look into the residual styling to see if the current `tStylingKey` is duplicate of residual.\n *\n * @param tNode `TNode` where the residual is stored.\n * @param tStylingKey `TStylingKey` to store.\n * @param tData `TData` associated with the current `LView`.\n * @param index location of where `tStyleValue` should be stored (and linked into list.)\n * @param isClassBinding True if the associated `tStylingKey` as a `class` styling.\n *                       `tNode.classBindings` should be used (or `tNode.styleBindings` otherwise.)\n */\nfunction markDuplicateOfResidualStyling(\n  tNode: TNode,\n  tStylingKey: TStylingKey,\n  tData: TData,\n  index: number,\n  isClassBinding: boolean,\n) {\n  const residual = isClassBinding ? tNode.residualClasses : tNode.residualStyles;\n  if (\n    residual != null /* or undefined */ &&\n    typeof tStylingKey == 'string' &&\n    keyValueArrayIndexOf(residual, tStylingKey) >= 0\n  ) {\n    // We have duplicate in the residual so mark ourselves as duplicate.\n    tData[index + 1] = setTStylingRangeNextDuplicate(tData[index + 1] as TStylingRange);\n  }\n}\n\n/**\n * Marks `TStyleValue`s as duplicates if another style binding in the list has the same\n * `TStyleValue`.\n *\n * NOTE: this function is intended to be called twice once with `isPrevDir` set to `true` and once\n * with it set to `false` to search both the previous as well as next items in the list.\n *\n * No duplicate case\n * ```\n *   [style.color]\n *   [style.width.px] <<- index\n *   [style.height.px]\n * ```\n *\n * In the above case adding `[style.width.px]` to the existing `[style.color]` produces no\n * duplicates because `width` is not found in any other part of the linked list.\n *\n * Duplicate case\n * ```\n *   [style.color]\n *   [style.width.em]\n *   [style.width.px] <<- index\n * ```\n * In the above case adding `[style.width.px]` will produce a duplicate with `[style.width.em]`\n * because `width` is found in the chain.\n *\n * Map case 1\n * ```\n *   [style.width.px]\n *   [style.color]\n *   [style]  <<- index\n * ```\n * In the above case adding `[style]` will produce a duplicate with any other bindings because\n * `[style]` is a Map and as such is fully dynamic and could produce `color` or `width`.\n *\n * Map case 2\n * ```\n *   [style]\n *   [style.width.px]\n *   [style.color]  <<- index\n * ```\n * In the above case adding `[style.color]` will produce a duplicate because there is already a\n * `[style]` binding which is a Map and as such is fully dynamic and could produce `color` or\n * `width`.\n *\n * NOTE: Once `[style]` (Map) is added into the system all things are mapped as duplicates.\n * NOTE: We use `style` as example, but same logic is applied to `class`es as well.\n *\n * @param tData `TData` where the linked list is stored.\n * @param tStylingKey `TStylingKeyPrimitive` which contains the value to compare to other keys in\n *        the linked list.\n * @param index Starting location in the linked list to search from\n * @param isPrevDir Direction.\n *        - `true` for previous (lower priority);\n *        - `false` for next (higher priority).\n */\nfunction markDuplicates(\n  tData: TData,\n  tStylingKey: TStylingKeyPrimitive,\n  index: number,\n  isPrevDir: boolean,\n) {\n  const tStylingAtIndex = tData[index + 1] as TStylingRange;\n  const isMap = tStylingKey === null;\n  let cursor = isPrevDir\n    ? getTStylingRangePrev(tStylingAtIndex)\n    : getTStylingRangeNext(tStylingAtIndex);\n  let foundDuplicate = false;\n  // We keep iterating as long as we have a cursor\n  // AND either:\n  // - we found what we are looking for, OR\n  // - we are a map in which case we have to continue searching even after we find what we were\n  //   looking for since we are a wild card and everything needs to be flipped to duplicate.\n  while (cursor !== 0 && (foundDuplicate === false || isMap)) {\n    ngDevMode && assertIndexInRange(tData, cursor);\n    const tStylingValueAtCursor = tData[cursor] as TStylingKey;\n    const tStyleRangeAtCursor = tData[cursor + 1] as TStylingRange;\n    if (isStylingMatch(tStylingValueAtCursor, tStylingKey)) {\n      foundDuplicate = true;\n      tData[cursor + 1] = isPrevDir\n        ? setTStylingRangeNextDuplicate(tStyleRangeAtCursor)\n        : setTStylingRangePrevDuplicate(tStyleRangeAtCursor);\n    }\n    cursor = isPrevDir\n      ? getTStylingRangePrev(tStyleRangeAtCursor)\n      : getTStylingRangeNext(tStyleRangeAtCursor);\n  }\n  if (foundDuplicate) {\n    // if we found a duplicate, than mark ourselves.\n    tData[index + 1] = isPrevDir\n      ? setTStylingRangePrevDuplicate(tStylingAtIndex)\n      : setTStylingRangeNextDuplicate(tStylingAtIndex);\n  }\n}\n\n/**\n * Determines if two `TStylingKey`s are a match.\n *\n * When computing whether a binding contains a duplicate, we need to compare if the instruction\n * `TStylingKey` has a match.\n *\n * Here are examples of `TStylingKey`s which match given `tStylingKeyCursor` is:\n * - `color`\n *    - `color`    // Match another color\n *    - `null`     // That means that `tStylingKey` is a `classMap`/`styleMap` instruction\n *    - `['', 'color', 'other', true]` // wrapped `color` so match\n *    - `['', null, 'other', true]`       // wrapped `null` so match\n *    - `['', 'width', 'color', 'value']` // wrapped static value contains a match on `'color'`\n * - `null`       // `tStylingKeyCursor` always match as it is `classMap`/`styleMap` instruction\n *\n * @param tStylingKeyCursor\n * @param tStylingKey\n */\nfunction isStylingMatch(tStylingKeyCursor: TStylingKey, tStylingKey: TStylingKeyPrimitive) {\n  ngDevMode &&\n    assertNotEqual(\n      Array.isArray(tStylingKey),\n      true,\n      \"Expected that 'tStylingKey' has been unwrapped\",\n    );\n  if (\n    tStylingKeyCursor === null || // If the cursor is `null` it means that we have map at that\n    // location so we must assume that we have a match.\n    tStylingKey == null || // If `tStylingKey` is `null` then it is a map therefor assume that it\n    // contains a match.\n    (Array.isArray(tStylingKeyCursor) ? tStylingKeyCursor[1] : tStylingKeyCursor) === tStylingKey // If the keys match explicitly than we are a match.\n  ) {\n    return true;\n  } else if (Array.isArray(tStylingKeyCursor) && typeof tStylingKey === 'string') {\n    // if we did not find a match, but `tStylingKeyCursor` is `KeyValueArray` that means cursor has\n    // statics and we need to check those as well.\n    return keyValueArrayIndexOf(tStylingKeyCursor, tStylingKey) >= 0; // see if we are matching the key\n  }\n  return false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertEqual, throwError} from '../../util/assert';\nimport {CharCode} from '../../util/char_code';\n\n/**\n * Stores the locations of key/value indexes while parsing styling.\n *\n * In case of `cssText` parsing the indexes are like so:\n * ```\n *   \"key1: value1; key2: value2; key3: value3\"\n *                  ^   ^ ^     ^             ^\n *                  |   | |     |             +-- textEnd\n *                  |   | |     +---------------- valueEnd\n *                  |   | +---------------------- value\n *                  |   +------------------------ keyEnd\n *                  +---------------------------- key\n * ```\n *\n * In case of `className` parsing the indexes are like so:\n * ```\n *   \"key1 key2 key3\"\n *         ^   ^    ^\n *         |   |    +-- textEnd\n *         |   +------------------------ keyEnd\n *         +---------------------------- key\n * ```\n * NOTE: `value` and `valueEnd` are used only for styles, not classes.\n */\ninterface ParserState {\n  textEnd: number;\n  key: number;\n  keyEnd: number;\n  value: number;\n  valueEnd: number;\n}\n// Global state of the parser. (This makes parser non-reentrant, but that is not an issue)\nconst parserState: ParserState = {\n  textEnd: 0,\n  key: 0,\n  keyEnd: 0,\n  value: 0,\n  valueEnd: 0,\n};\n\n/**\n * Retrieves the last parsed `key` of style.\n * @param text the text to substring the key from.\n */\nexport function getLastParsedKey(text: string): string {\n  return text.substring(parserState.key, parserState.keyEnd);\n}\n\n/**\n * Retrieves the last parsed `value` of style.\n * @param text the text to substring the key from.\n */\nexport function getLastParsedValue(text: string): string {\n  return text.substring(parserState.value, parserState.valueEnd);\n}\n\n/**\n * Initializes `className` string for parsing and parses the first token.\n *\n * This function is intended to be used in this format:\n * ```ts\n * for (let i = parseClassName(text); i >= 0; i = parseClassNameNext(text, i)) {\n *   const key = getLastParsedKey();\n *   ...\n * }\n * ```\n * @param text `className` to parse\n * @returns index where the next invocation of `parseClassNameNext` should resume.\n */\nexport function parseClassName(text: string): number {\n  resetParserState(text);\n  return parseClassNameNext(text, consumeWhitespace(text, 0, parserState.textEnd));\n}\n\n/**\n * Parses next `className` token.\n *\n * This function is intended to be used in this format:\n * ```ts\n * for (let i = parseClassName(text); i >= 0; i = parseClassNameNext(text, i)) {\n *   const key = getLastParsedKey();\n *   ...\n * }\n * ```\n *\n * @param text `className` to parse\n * @param index where the parsing should resume.\n * @returns index where the next invocation of `parseClassNameNext` should resume.\n */\nexport function parseClassNameNext(text: string, index: number): number {\n  const end = parserState.textEnd;\n  if (end === index) {\n    return -1;\n  }\n  index = parserState.keyEnd = consumeClassToken(text, (parserState.key = index), end);\n  return consumeWhitespace(text, index, end);\n}\n\n/**\n * Initializes `cssText` string for parsing and parses the first key/values.\n *\n * This function is intended to be used in this format:\n * ```ts\n * for (let i = parseStyle(text); i >= 0; i = parseStyleNext(text, i))) {\n *   const key = getLastParsedKey();\n *   const value = getLastParsedValue();\n *   ...\n * }\n * ```\n * @param text `cssText` to parse\n * @returns index where the next invocation of `parseStyleNext` should resume.\n */\nexport function parseStyle(text: string): number {\n  resetParserState(text);\n  return parseStyleNext(text, consumeWhitespace(text, 0, parserState.textEnd));\n}\n\n/**\n * Parses the next `cssText` key/values.\n *\n * This function is intended to be used in this format:\n * ```ts\n * for (let i = parseStyle(text); i >= 0; i = parseStyleNext(text, i))) {\n *   const key = getLastParsedKey();\n *   const value = getLastParsedValue();\n *   ...\n * }\n *\n * @param text `cssText` to parse\n * @param index where the parsing should resume.\n * @returns index where the next invocation of `parseStyleNext` should resume.\n */\nexport function parseStyleNext(text: string, startIndex: number): number {\n  const end = parserState.textEnd;\n  let index = (parserState.key = consumeWhitespace(text, startIndex, end));\n  if (end === index) {\n    // we reached an end so just quit\n    return -1;\n  }\n  index = parserState.keyEnd = consumeStyleKey(text, index, end);\n  index = consumeSeparator(text, index, end, CharCode.COLON);\n  index = parserState.value = consumeWhitespace(text, index, end);\n  index = parserState.valueEnd = consumeStyleValue(text, index, end);\n  return consumeSeparator(text, index, end, CharCode.SEMI_COLON);\n}\n\n/**\n * Reset the global state of the styling parser.\n * @param text The styling text to parse.\n */\nexport function resetParserState(text: string): void {\n  parserState.key = 0;\n  parserState.keyEnd = 0;\n  parserState.value = 0;\n  parserState.valueEnd = 0;\n  parserState.textEnd = text.length;\n}\n\n/**\n * Returns index of next non-whitespace character.\n *\n * @param text Text to scan\n * @param startIndex Starting index of character where the scan should start.\n * @param endIndex Ending index of character where the scan should end.\n * @returns Index of next non-whitespace character (May be the same as `start` if no whitespace at\n *          that location.)\n */\nexport function consumeWhitespace(text: string, startIndex: number, endIndex: number): number {\n  while (startIndex < endIndex && text.charCodeAt(startIndex) <= CharCode.SPACE) {\n    startIndex++;\n  }\n  return startIndex;\n}\n\n/**\n * Returns index of last char in class token.\n *\n * @param text Text to scan\n * @param startIndex Starting index of character where the scan should start.\n * @param endIndex Ending index of character where the scan should end.\n * @returns Index after last char in class token.\n */\nexport function consumeClassToken(text: string, startIndex: number, endIndex: number): number {\n  while (startIndex < endIndex && text.charCodeAt(startIndex) > CharCode.SPACE) {\n    startIndex++;\n  }\n  return startIndex;\n}\n\n/**\n * Consumes all of the characters belonging to style key and token.\n *\n * @param text Text to scan\n * @param startIndex Starting index of character where the scan should start.\n * @param endIndex Ending index of character where the scan should end.\n * @returns Index after last style key character.\n */\nexport function consumeStyleKey(text: string, startIndex: number, endIndex: number): number {\n  let ch: number;\n  while (\n    startIndex < endIndex &&\n    ((ch = text.charCodeAt(startIndex)) === CharCode.DASH ||\n      ch === CharCode.UNDERSCORE ||\n      ((ch & CharCode.UPPER_CASE) >= CharCode.A && (ch & CharCode.UPPER_CASE) <= CharCode.Z) ||\n      (ch >= CharCode.ZERO && ch <= CharCode.NINE))\n  ) {\n    startIndex++;\n  }\n  return startIndex;\n}\n\n/**\n * Consumes all whitespace and the separator `:` after the style key.\n *\n * @param text Text to scan\n * @param startIndex Starting index of character where the scan should start.\n * @param endIndex Ending index of character where the scan should end.\n * @returns Index after separator and surrounding whitespace.\n */\nexport function consumeSeparator(\n  text: string,\n  startIndex: number,\n  endIndex: number,\n  separator: number,\n): number {\n  startIndex = consumeWhitespace(text, startIndex, endIndex);\n  if (startIndex < endIndex) {\n    if (ngDevMode && text.charCodeAt(startIndex) !== separator) {\n      malformedStyleError(text, String.fromCharCode(separator), startIndex);\n    }\n    startIndex++;\n  }\n  return startIndex;\n}\n\n/**\n * Consumes style value honoring `url()` and `\"\"` text.\n *\n * @param text Text to scan\n * @param startIndex Starting index of character where the scan should start.\n * @param endIndex Ending index of character where the scan should end.\n * @returns Index after last style value character.\n */\nexport function consumeStyleValue(text: string, startIndex: number, endIndex: number): number {\n  let ch1 = -1; // 1st previous character\n  let ch2 = -1; // 2nd previous character\n  let ch3 = -1; // 3rd previous character\n  let i = startIndex;\n  let lastChIndex = i;\n  while (i < endIndex) {\n    const ch: number = text.charCodeAt(i++);\n    if (ch === CharCode.SEMI_COLON) {\n      return lastChIndex;\n    } else if (ch === CharCode.DOUBLE_QUOTE || ch === CharCode.SINGLE_QUOTE) {\n      lastChIndex = i = consumeQuotedText(text, ch, i, endIndex);\n    } else if (\n      startIndex === i - 4 && // We have seen only 4 characters so far \"URL(\" (Ignore \"foo_URL()\")\n      ch3 === CharCode.U &&\n      ch2 === CharCode.R &&\n      ch1 === CharCode.L &&\n      ch === CharCode.OPEN_PAREN\n    ) {\n      lastChIndex = i = consumeQuotedText(text, CharCode.CLOSE_PAREN, i, endIndex);\n    } else if (ch > CharCode.SPACE) {\n      // if we have a non-whitespace character then capture its location\n      lastChIndex = i;\n    }\n    ch3 = ch2;\n    ch2 = ch1;\n    ch1 = ch & CharCode.UPPER_CASE;\n  }\n  return lastChIndex;\n}\n\n/**\n * Consumes all of the quoted characters.\n *\n * @param text Text to scan\n * @param quoteCharCode CharCode of either `\"` or `'` quote or `)` for `url(...)`.\n * @param startIndex Starting index of character where the scan should start.\n * @param endIndex Ending index of character where the scan should end.\n * @returns Index after quoted characters.\n */\nexport function consumeQuotedText(\n  text: string,\n  quoteCharCode: number,\n  startIndex: number,\n  endIndex: number,\n): number {\n  let ch1 = -1; // 1st previous character\n  let index = startIndex;\n  while (index < endIndex) {\n    const ch = text.charCodeAt(index++);\n    if (ch == quoteCharCode && ch1 !== CharCode.BACK_SLASH) {\n      return index;\n    }\n    if (ch == CharCode.BACK_SLASH && ch1 === CharCode.BACK_SLASH) {\n      // two back slashes cancel each other out. For example `\"\\\\\"` should properly end the\n      // quotation. (It should not assume that the last `\"` is escaped.)\n      ch1 = 0;\n    } else {\n      ch1 = ch;\n    }\n  }\n  throw ngDevMode\n    ? malformedStyleError(text, String.fromCharCode(quoteCharCode), endIndex)\n    : new Error();\n}\n\nfunction malformedStyleError(text: string, expecting: string, index: number): never {\n  ngDevMode && assertEqual(typeof text === 'string', true, 'String expected here');\n  throw throwError(\n    `Malformed style at location ${index} in string '` +\n      text.substring(0, index) +\n      '[>>' +\n      text.substring(index, index + 1) +\n      '<<]' +\n      text.slice(index + 1) +\n      `'. Expecting '${expecting}'.`,\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {bindingUpdated} from '../bindings';\nimport {TNode} from '../interfaces/node';\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {LView, RENDERER, TView} from '../interfaces/view';\nimport {getLView, getSelectedTNode, getTView, nextBindingIndex} from '../state';\n\nimport {\n  elementPropertyInternal,\n  setAllInputsForProperty,\n  storePropertyBindingMetadata,\n} from './shared';\n\n/**\n * Update a property on a selected element.\n *\n * Operates on the element selected by index via the {@link select} instruction.\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled\n *\n * @param propName Name of property. Because it is going to DOM, this is not subject to\n *        renaming as part of minification.\n * @param value New value to write.\n * @param sanitizer An optional function used to sanitize the value.\n * @returns This function returns itself so that it may be chained\n * (e.g. `property('name', ctx.name)('title', ctx.title)`)\n *\n * @codeGenApi\n */\nexport function ɵɵproperty<T>(\n  propName: string,\n  value: T,\n  sanitizer?: SanitizerFn | null,\n): typeof ɵɵproperty {\n  const lView = getLView();\n  const bindingIndex = nextBindingIndex();\n  if (bindingUpdated(lView, bindingIndex, value)) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      value,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);\n  }\n  return ɵɵproperty;\n}\n\n/**\n * Given `<div style=\"...\" my-dir>` and `MyDir` with `@Input('style')` we need to write to\n * directive input.\n */\nexport function setDirectiveInputsWhichShadowsStyling(\n  tView: TView,\n  tNode: TNode,\n  lView: LView,\n  value: any,\n  isClassBased: boolean,\n) {\n  // We support both 'class' and `className` hence the fallback.\n  setAllInputsForProperty(tNode, tView, lView, isClassBased ? 'class' : 'style', value);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {SafeValue, unwrapSafeValue} from '../../sanitization/bypass';\nimport {KeyValueArray, keyValueArrayGet, keyValueArraySet} from '../../util/array_utils';\nimport {\n  assertDefined,\n  assertEqual,\n  assertLessThan,\n  assertNotEqual,\n  throwError,\n} from '../../util/assert';\nimport {EMPTY_ARRAY} from '../../util/empty';\nimport {concatStringsWithSpace, stringify} from '../../util/stringify';\nimport {assertFirstUpdatePass} from '../assert';\nimport {bindingUpdated} from '../bindings';\nimport {AttributeMarker} from '../interfaces/attribute_marker';\nimport {DirectiveDef} from '../interfaces/definition';\nimport {TAttributes, TNode, TNodeFlags, TNodeType} from '../interfaces/node';\nimport {Renderer} from '../interfaces/renderer';\nimport {RElement} from '../interfaces/renderer_dom';\nimport {\n  getTStylingRangeNext,\n  getTStylingRangeNextDuplicate,\n  getTStylingRangePrev,\n  getTStylingRangePrevDuplicate,\n  TStylingKey,\n  TStylingRange,\n} from '../interfaces/styling';\nimport {LView, RENDERER, TData, TView} from '../interfaces/view';\nimport {applyStyling} from '../node_manipulation';\nimport {\n  getCurrentDirectiveDef,\n  getLView,\n  getSelectedIndex,\n  getTView,\n  incrementBindingIndex,\n} from '../state';\nimport {insertTStylingBinding} from '../styling/style_binding_list';\nimport {\n  getLastParsedKey,\n  getLastParsedValue,\n  parseClassName,\n  parseClassNameNext,\n  parseStyle,\n  parseStyleNext,\n} from '../styling/styling_parser';\nimport {NO_CHANGE} from '../tokens';\nimport {getNativeByIndex} from '../util/view_utils';\n\nimport {setDirectiveInputsWhichShadowsStyling} from './property';\n\n/**\n * Update a style binding on an element with the provided value.\n *\n * If the style value is falsy then it will be removed from the element\n * (or assigned a different value depending if there are any styles placed\n * on the element with `styleMap` or any static styles that are\n * present from when the element was created with `styling`).\n *\n * Note that the styling element is updated as part of `stylingApply`.\n *\n * @param prop A valid CSS property.\n * @param value New value to write (`null` or an empty string to remove).\n * @param suffix Optional suffix. Used with scalar values to add unit such as `px`.\n *\n * Note that this will apply the provided style value to the host element if this function is called\n * within a host binding function.\n *\n * @codeGenApi\n */\nexport function ɵɵstyleProp(\n  prop: string,\n  value: string | number | SafeValue | undefined | null,\n  suffix?: string | null,\n): typeof ɵɵstyleProp {\n  checkStylingProperty(prop, value, suffix, false);\n  return ɵɵstyleProp;\n}\n\n/**\n * Update a class binding on an element with the provided value.\n *\n * This instruction is meant to handle the `[class.foo]=\"exp\"` case and,\n * therefore, the class binding itself must already be allocated using\n * `styling` within the creation block.\n *\n * @param prop A valid CSS class (only one).\n * @param value A true/false value which will turn the class on or off.\n *\n * Note that this will apply the provided class value to the host element if this function\n * is called within a host binding function.\n *\n * @codeGenApi\n */\nexport function ɵɵclassProp(\n  className: string,\n  value: boolean | undefined | null,\n): typeof ɵɵclassProp {\n  checkStylingProperty(className, value, null, true);\n  return ɵɵclassProp;\n}\n\n/**\n * Update style bindings using an object literal on an element.\n *\n * This instruction is meant to apply styling via the `[style]=\"exp\"` template bindings.\n * When styles are applied to the element they will then be updated with respect to\n * any styles/classes set via `styleProp`. If any styles are set to falsy\n * then they will be removed from the element.\n *\n * Note that the styling instruction will not be applied until `stylingApply` is called.\n *\n * @param styles A key/value style map of the styles that will be applied to the given element.\n *        Any missing styles (that have already been applied to the element beforehand) will be\n *        removed (unset) from the element's styling.\n *\n * Note that this will apply the provided styleMap value to the host element if this function\n * is called within a host binding.\n *\n * @codeGenApi\n */\nexport function ɵɵstyleMap(styles: {[styleName: string]: any} | string | undefined | null): void {\n  checkStylingMap(styleKeyValueArraySet, styleStringParser, styles, false);\n}\n\n/**\n * Parse text as style and add values to KeyValueArray.\n *\n * This code is pulled out to a separate function so that it can be tree shaken away if it is not\n * needed. It is only referenced from `ɵɵstyleMap`.\n *\n * @param keyValueArray KeyValueArray to add parsed values to.\n * @param text text to parse.\n */\nexport function styleStringParser(keyValueArray: KeyValueArray<any>, text: string): void {\n  for (let i = parseStyle(text); i >= 0; i = parseStyleNext(text, i)) {\n    styleKeyValueArraySet(keyValueArray, getLastParsedKey(text), getLastParsedValue(text));\n  }\n}\n\n/**\n * Update class bindings using an object literal or class-string on an element.\n *\n * This instruction is meant to apply styling via the `[class]=\"exp\"` template bindings.\n * When classes are applied to the element they will then be updated with\n * respect to any styles/classes set via `classProp`. If any\n * classes are set to falsy then they will be removed from the element.\n *\n * Note that the styling instruction will not be applied until `stylingApply` is called.\n * Note that this will the provided classMap value to the host element if this function is called\n * within a host binding.\n *\n * @param classes A key/value map or string of CSS classes that will be added to the\n *        given element. Any missing classes (that have already been applied to the element\n *        beforehand) will be removed (unset) from the element's list of CSS classes.\n *\n * @codeGenApi\n */\nexport function ɵɵclassMap(\n  classes: {[className: string]: boolean | undefined | null} | string | undefined | null,\n): void {\n  checkStylingMap(classKeyValueArraySet, classStringParser, classes, true);\n}\n\n/**\n * Parse text as class and add values to KeyValueArray.\n *\n * This code is pulled out to a separate function so that it can be tree shaken away if it is not\n * needed. It is only referenced from `ɵɵclassMap`.\n *\n * @param keyValueArray KeyValueArray to add parsed values to.\n * @param text text to parse.\n */\nexport function classStringParser(keyValueArray: KeyValueArray<any>, text: string): void {\n  for (let i = parseClassName(text); i >= 0; i = parseClassNameNext(text, i)) {\n    keyValueArraySet(keyValueArray, getLastParsedKey(text), true);\n  }\n}\n\n/**\n * Common code between `ɵɵclassProp` and `ɵɵstyleProp`.\n *\n * @param prop property name.\n * @param value binding value.\n * @param suffix suffix for the property (e.g. `em` or `px`)\n * @param isClassBased `true` if `class` change (`false` if `style`)\n */\nexport function checkStylingProperty(\n  prop: string,\n  value: any | NO_CHANGE,\n  suffix: string | undefined | null,\n  isClassBased: boolean,\n): void {\n  const lView = getLView();\n  const tView = getTView();\n  // Styling instructions use 2 slots per binding.\n  // 1. one for the value / TStylingKey\n  // 2. one for the intermittent-value / TStylingRange\n  const bindingIndex = incrementBindingIndex(2);\n  if (tView.firstUpdatePass) {\n    stylingFirstUpdatePass(tView, prop, bindingIndex, isClassBased);\n  }\n  if (value !== NO_CHANGE && bindingUpdated(lView, bindingIndex, value)) {\n    const tNode = tView.data[getSelectedIndex()] as TNode;\n    updateStyling(\n      tView,\n      tNode,\n      lView,\n      lView[RENDERER],\n      prop,\n      (lView[bindingIndex + 1] = normalizeSuffix(value, suffix)),\n      isClassBased,\n      bindingIndex,\n    );\n  }\n}\n\n/**\n * Common code between `ɵɵclassMap` and `ɵɵstyleMap`.\n *\n * @param keyValueArraySet (See `keyValueArraySet` in \"util/array_utils\") Gets passed in as a\n *        function so that `style` can be processed. This is done for tree shaking purposes.\n * @param stringParser Parser used to parse `value` if `string`. (Passed in as `style` and `class`\n *        have different parsers.)\n * @param value bound value from application\n * @param isClassBased `true` if `class` change (`false` if `style`)\n */\nexport function checkStylingMap(\n  keyValueArraySet: (keyValueArray: KeyValueArray<any>, key: string, value: any) => void,\n  stringParser: (styleKeyValueArray: KeyValueArray<any>, text: string) => void,\n  value: any | NO_CHANGE,\n  isClassBased: boolean,\n): void {\n  const tView = getTView();\n  const bindingIndex = incrementBindingIndex(2);\n  if (tView.firstUpdatePass) {\n    stylingFirstUpdatePass(tView, null, bindingIndex, isClassBased);\n  }\n  const lView = getLView();\n  if (value !== NO_CHANGE && bindingUpdated(lView, bindingIndex, value)) {\n    // `getSelectedIndex()` should be here (rather than in instruction) so that it is guarded by the\n    // if so as not to read unnecessarily.\n    const tNode = tView.data[getSelectedIndex()] as TNode;\n    if (hasStylingInputShadow(tNode, isClassBased) && !isInHostBindings(tView, bindingIndex)) {\n      if (ngDevMode) {\n        // verify that if we are shadowing then `TData` is appropriately marked so that we skip\n        // processing this binding in styling resolution.\n        const tStylingKey = tView.data[bindingIndex];\n        assertEqual(\n          Array.isArray(tStylingKey) ? tStylingKey[1] : tStylingKey,\n          false,\n          \"Styling linked list shadow input should be marked as 'false'\",\n        );\n      }\n      // VE does not concatenate the static portion like we are doing here.\n      // Instead VE just ignores the static completely if dynamic binding is present.\n      // Because of locality we have already set the static portion because we don't know if there\n      // is a dynamic portion until later. If we would ignore the static portion it would look like\n      // the binding has removed it. This would confuse `[ngStyle]`/`[ngClass]` to do the wrong\n      // thing as it would think that the static portion was removed. For this reason we\n      // concatenate it so that `[ngStyle]`/`[ngClass]`  can continue to work on changed.\n      let staticPrefix = isClassBased ? tNode.classesWithoutHost : tNode.stylesWithoutHost;\n      ngDevMode &&\n        isClassBased === false &&\n        staticPrefix !== null &&\n        assertEqual(staticPrefix.endsWith(';'), true, \"Expecting static portion to end with ';'\");\n      if (staticPrefix !== null) {\n        // We want to make sure that falsy values of `value` become empty strings.\n        value = concatStringsWithSpace(staticPrefix, value ? value : '');\n      }\n      // Given `<div [style] my-dir>` such that `my-dir` has `@Input('style')`.\n      // This takes over the `[style]` binding. (Same for `[class]`)\n      setDirectiveInputsWhichShadowsStyling(tView, tNode, lView, value, isClassBased);\n    } else {\n      updateStylingMap(\n        tView,\n        tNode,\n        lView,\n        lView[RENDERER],\n        lView[bindingIndex + 1],\n        (lView[bindingIndex + 1] = toStylingKeyValueArray(keyValueArraySet, stringParser, value)),\n        isClassBased,\n        bindingIndex,\n      );\n    }\n  }\n}\n\n/**\n * Determines when the binding is in `hostBindings` section\n *\n * @param tView Current `TView`\n * @param bindingIndex index of binding which we would like if it is in `hostBindings`\n */\nfunction isInHostBindings(tView: TView, bindingIndex: number): boolean {\n  // All host bindings are placed after the expando section.\n  return bindingIndex >= tView.expandoStartIndex;\n}\n\n/**\n * Collects the necessary information to insert the binding into a linked list of style bindings\n * using `insertTStylingBinding`.\n *\n * @param tView `TView` where the binding linked list will be stored.\n * @param tStylingKey Property/key of the binding.\n * @param bindingIndex Index of binding associated with the `prop`\n * @param isClassBased `true` if `class` change (`false` if `style`)\n */\nfunction stylingFirstUpdatePass(\n  tView: TView,\n  tStylingKey: TStylingKey,\n  bindingIndex: number,\n  isClassBased: boolean,\n): void {\n  ngDevMode && assertFirstUpdatePass(tView);\n  const tData = tView.data;\n  if (tData[bindingIndex + 1] === null) {\n    // The above check is necessary because we don't clear first update pass until first successful\n    // (no exception) template execution. This prevents the styling instruction from double adding\n    // itself to the list.\n    // `getSelectedIndex()` should be here (rather than in instruction) so that it is guarded by the\n    // if so as not to read unnecessarily.\n    const tNode = tData[getSelectedIndex()] as TNode;\n    ngDevMode && assertDefined(tNode, 'TNode expected');\n    const isHostBindings = isInHostBindings(tView, bindingIndex);\n    if (hasStylingInputShadow(tNode, isClassBased) && tStylingKey === null && !isHostBindings) {\n      // `tStylingKey === null` implies that we are either `[style]` or `[class]` binding.\n      // If there is a directive which uses `@Input('style')` or `@Input('class')` than\n      // we need to neutralize this binding since that directive is shadowing it.\n      // We turn this into a noop by setting the key to `false`\n      tStylingKey = false;\n    }\n    tStylingKey = wrapInStaticStylingKey(tData, tNode, tStylingKey, isClassBased);\n    insertTStylingBinding(tData, tNode, tStylingKey, bindingIndex, isHostBindings, isClassBased);\n  }\n}\n\n/**\n * Adds static styling information to the binding if applicable.\n *\n * The linked list of styles not only stores the list and keys, but also stores static styling\n * information on some of the keys. This function determines if the key should contain the styling\n * information and computes it.\n *\n * See `TStylingStatic` for more details.\n *\n * @param tData `TData` where the linked list is stored.\n * @param tNode `TNode` for which the styling is being computed.\n * @param stylingKey `TStylingKeyPrimitive` which may need to be wrapped into `TStylingKey`\n * @param isClassBased `true` if `class` (`false` if `style`)\n */\nexport function wrapInStaticStylingKey(\n  tData: TData,\n  tNode: TNode,\n  stylingKey: TStylingKey,\n  isClassBased: boolean,\n): TStylingKey {\n  const hostDirectiveDef = getCurrentDirectiveDef(tData);\n  let residual = isClassBased ? tNode.residualClasses : tNode.residualStyles;\n  if (hostDirectiveDef === null) {\n    // We are in template node.\n    // If template node already had styling instruction then it has already collected the static\n    // styling and there is no need to collect them again. We know that we are the first styling\n    // instruction because the `TNode.*Bindings` points to 0 (nothing has been inserted yet).\n    const isFirstStylingInstructionInTemplate =\n      ((isClassBased ? tNode.classBindings : tNode.styleBindings) as any as number) === 0;\n    if (isFirstStylingInstructionInTemplate) {\n      // It would be nice to be able to get the statics from `mergeAttrs`, however, at this point\n      // they are already merged and it would not be possible to figure which property belongs where\n      // in the priority.\n      stylingKey = collectStylingFromDirectives(null, tData, tNode, stylingKey, isClassBased);\n      stylingKey = collectStylingFromTAttrs(stylingKey, tNode.attrs, isClassBased);\n      // We know that if we have styling binding in template we can't have residual.\n      residual = null;\n    }\n  } else {\n    // We are in host binding node and there was no binding instruction in template node.\n    // This means that we need to compute the residual.\n    const directiveStylingLast = tNode.directiveStylingLast;\n    const isFirstStylingInstructionInHostBinding =\n      directiveStylingLast === -1 || tData[directiveStylingLast] !== hostDirectiveDef;\n    if (isFirstStylingInstructionInHostBinding) {\n      stylingKey = collectStylingFromDirectives(\n        hostDirectiveDef,\n        tData,\n        tNode,\n        stylingKey,\n        isClassBased,\n      );\n      if (residual === null) {\n        // - If `null` than either:\n        //    - Template styling instruction already ran and it has consumed the static\n        //      styling into its `TStylingKey` and so there is no need to update residual. Instead\n        //      we need to update the `TStylingKey` associated with the first template node\n        //      instruction. OR\n        //    - Some other styling instruction ran and determined that there are no residuals\n        let templateStylingKey = getTemplateHeadTStylingKey(tData, tNode, isClassBased);\n        if (templateStylingKey !== undefined && Array.isArray(templateStylingKey)) {\n          // Only recompute if `templateStylingKey` had static values. (If no static value found\n          // then there is nothing to do since this operation can only produce less static keys, not\n          // more.)\n          templateStylingKey = collectStylingFromDirectives(\n            null,\n            tData,\n            tNode,\n            templateStylingKey[1] /* unwrap previous statics */,\n            isClassBased,\n          );\n          templateStylingKey = collectStylingFromTAttrs(\n            templateStylingKey,\n            tNode.attrs,\n            isClassBased,\n          );\n          setTemplateHeadTStylingKey(tData, tNode, isClassBased, templateStylingKey);\n        }\n      } else {\n        // We only need to recompute residual if it is not `null`.\n        // - If existing residual (implies there was no template styling). This means that some of\n        //   the statics may have moved from the residual to the `stylingKey` and so we have to\n        //   recompute.\n        // - If `undefined` this is the first time we are running.\n        residual = collectResidual(tData, tNode, isClassBased);\n      }\n    }\n  }\n  if (residual !== undefined) {\n    isClassBased ? (tNode.residualClasses = residual) : (tNode.residualStyles = residual);\n  }\n  return stylingKey;\n}\n\n/**\n * Retrieve the `TStylingKey` for the template styling instruction.\n *\n * This is needed since `hostBinding` styling instructions are inserted after the template\n * instruction. While the template instruction needs to update the residual in `TNode` the\n * `hostBinding` instructions need to update the `TStylingKey` of the template instruction because\n * the template instruction is downstream from the `hostBindings` instructions.\n *\n * @param tData `TData` where the linked list is stored.\n * @param tNode `TNode` for which the styling is being computed.\n * @param isClassBased `true` if `class` (`false` if `style`)\n * @return `TStylingKey` if found or `undefined` if not found.\n */\nfunction getTemplateHeadTStylingKey(\n  tData: TData,\n  tNode: TNode,\n  isClassBased: boolean,\n): TStylingKey | undefined {\n  const bindings = isClassBased ? tNode.classBindings : tNode.styleBindings;\n  if (getTStylingRangeNext(bindings) === 0) {\n    // There does not seem to be a styling instruction in the `template`.\n    return undefined;\n  }\n  return tData[getTStylingRangePrev(bindings)] as TStylingKey;\n}\n\n/**\n * Update the `TStylingKey` of the first template instruction in `TNode`.\n *\n * Logically `hostBindings` styling instructions are of lower priority than that of the template.\n * However, they execute after the template styling instructions. This means that they get inserted\n * in front of the template styling instructions.\n *\n * If we have a template styling instruction and a new `hostBindings` styling instruction is\n * executed it means that it may need to steal static fields from the template instruction. This\n * method allows us to update the first template instruction `TStylingKey` with a new value.\n *\n * Assume:\n * ```angular-ts\n * <div my-dir style=\"color: red\" [style.color]=\"tmplExp\"></div>\n *\n * @Directive({\n *   host: {\n *     'style': 'width: 100px',\n *     '[style.color]': 'dirExp',\n *   }\n * })\n * class MyDir {}\n * ```\n *\n * when `[style.color]=\"tmplExp\"` executes it creates this data structure.\n * ```ts\n *  ['', 'color', 'color', 'red', 'width', '100px'],\n * ```\n *\n * The reason for this is that the template instruction does not know if there are styling\n * instructions and must assume that there are none and must collect all of the static styling.\n * (both\n * `color' and 'width`)\n *\n * When `'[style.color]': 'dirExp',` executes we need to insert a new data into the linked list.\n * ```ts\n *  ['', 'color', 'width', '100px'],  // newly inserted\n *  ['', 'color', 'color', 'red', 'width', '100px'], // this is wrong\n * ```\n *\n * Notice that the template statics is now wrong as it incorrectly contains `width` so we need to\n * update it like so:\n * ```ts\n *  ['', 'color', 'width', '100px'],\n *  ['', 'color', 'color', 'red'],    // UPDATE\n * ```\n *\n * @param tData `TData` where the linked list is stored.\n * @param tNode `TNode` for which the styling is being computed.\n * @param isClassBased `true` if `class` (`false` if `style`)\n * @param tStylingKey New `TStylingKey` which is replacing the old one.\n */\nfunction setTemplateHeadTStylingKey(\n  tData: TData,\n  tNode: TNode,\n  isClassBased: boolean,\n  tStylingKey: TStylingKey,\n): void {\n  const bindings = isClassBased ? tNode.classBindings : tNode.styleBindings;\n  ngDevMode &&\n    assertNotEqual(\n      getTStylingRangeNext(bindings),\n      0,\n      'Expecting to have at least one template styling binding.',\n    );\n  tData[getTStylingRangePrev(bindings)] = tStylingKey;\n}\n\n/**\n * Collect all static values after the current `TNode.directiveStylingLast` index.\n *\n * Collect the remaining styling information which has not yet been collected by an existing\n * styling instruction.\n *\n * @param tData `TData` where the `DirectiveDefs` are stored.\n * @param tNode `TNode` which contains the directive range.\n * @param isClassBased `true` if `class` (`false` if `style`)\n */\nfunction collectResidual(\n  tData: TData,\n  tNode: TNode,\n  isClassBased: boolean,\n): KeyValueArray<any> | null {\n  let residual: KeyValueArray<any> | null | undefined = undefined;\n  const directiveEnd = tNode.directiveEnd;\n  ngDevMode &&\n    assertNotEqual(\n      tNode.directiveStylingLast,\n      -1,\n      'By the time this function gets called at least one hostBindings-node styling instruction must have executed.',\n    );\n  // We add `1 + tNode.directiveStart` because we need to skip the current directive (as we are\n  // collecting things after the last `hostBindings` directive which had a styling instruction.)\n  for (let i = 1 + tNode.directiveStylingLast; i < directiveEnd; i++) {\n    const attrs = (tData[i] as DirectiveDef<any>).hostAttrs;\n    residual = collectStylingFromTAttrs(residual, attrs, isClassBased) as KeyValueArray<any> | null;\n  }\n  return collectStylingFromTAttrs(residual, tNode.attrs, isClassBased) as KeyValueArray<any> | null;\n}\n\n/**\n * Collect the static styling information with lower priority than `hostDirectiveDef`.\n *\n * (This is opposite of residual styling.)\n *\n * @param hostDirectiveDef `DirectiveDef` for which we want to collect lower priority static\n *        styling. (Or `null` if template styling)\n * @param tData `TData` where the linked list is stored.\n * @param tNode `TNode` for which the styling is being computed.\n * @param stylingKey Existing `TStylingKey` to update or wrap.\n * @param isClassBased `true` if `class` (`false` if `style`)\n */\nfunction collectStylingFromDirectives(\n  hostDirectiveDef: DirectiveDef<any> | null,\n  tData: TData,\n  tNode: TNode,\n  stylingKey: TStylingKey,\n  isClassBased: boolean,\n): TStylingKey {\n  // We need to loop because there can be directives which have `hostAttrs` but don't have\n  // `hostBindings` so this loop catches up to the current directive..\n  let currentDirective: DirectiveDef<any> | null = null;\n  const directiveEnd = tNode.directiveEnd;\n  let directiveStylingLast = tNode.directiveStylingLast;\n  if (directiveStylingLast === -1) {\n    directiveStylingLast = tNode.directiveStart;\n  } else {\n    directiveStylingLast++;\n  }\n  while (directiveStylingLast < directiveEnd) {\n    currentDirective = tData[directiveStylingLast] as DirectiveDef<any>;\n    ngDevMode && assertDefined(currentDirective, 'expected to be defined');\n    stylingKey = collectStylingFromTAttrs(stylingKey, currentDirective.hostAttrs, isClassBased);\n    if (currentDirective === hostDirectiveDef) break;\n    directiveStylingLast++;\n  }\n  if (hostDirectiveDef !== null) {\n    // we only advance the styling cursor if we are collecting data from host bindings.\n    // Template executes before host bindings and so if we would update the index,\n    // host bindings would not get their statics.\n    tNode.directiveStylingLast = directiveStylingLast;\n  }\n  return stylingKey;\n}\n\n/**\n * Convert `TAttrs` into `TStylingStatic`.\n *\n * @param stylingKey existing `TStylingKey` to update or wrap.\n * @param attrs `TAttributes` to process.\n * @param isClassBased `true` if `class` (`false` if `style`)\n */\nfunction collectStylingFromTAttrs(\n  stylingKey: TStylingKey | undefined,\n  attrs: TAttributes | null,\n  isClassBased: boolean,\n): TStylingKey {\n  const desiredMarker = isClassBased ? AttributeMarker.Classes : AttributeMarker.Styles;\n  let currentMarker = AttributeMarker.ImplicitAttributes;\n  if (attrs !== null) {\n    for (let i = 0; i < attrs.length; i++) {\n      const item = attrs[i] as number | string;\n      if (typeof item === 'number') {\n        currentMarker = item;\n      } else {\n        if (currentMarker === desiredMarker) {\n          if (!Array.isArray(stylingKey)) {\n            stylingKey = stylingKey === undefined ? [] : (['', stylingKey] as any);\n          }\n          keyValueArraySet(\n            stylingKey as KeyValueArray<any>,\n            item,\n            isClassBased ? true : attrs[++i],\n          );\n        }\n      }\n    }\n  }\n  return stylingKey === undefined ? null : stylingKey;\n}\n\n/**\n * Convert user input to `KeyValueArray`.\n *\n * This function takes user input which could be `string`, Object literal, or iterable and converts\n * it into a consistent representation. The output of this is `KeyValueArray` (which is an array\n * where\n * even indexes contain keys and odd indexes contain values for those keys).\n *\n * The advantage of converting to `KeyValueArray` is that we can perform diff in an input\n * independent\n * way.\n * (ie we can compare `foo bar` to `['bar', 'baz'] and determine a set of changes which need to be\n * applied)\n *\n * The fact that `KeyValueArray` is sorted is very important because it allows us to compute the\n * difference in linear fashion without the need to allocate any additional data.\n *\n * For example if we kept this as a `Map` we would have to iterate over previous `Map` to determine\n * which values need to be deleted, over the new `Map` to determine additions, and we would have to\n * keep additional `Map` to keep track of duplicates or items which have not yet been visited.\n *\n * @param keyValueArraySet (See `keyValueArraySet` in \"util/array_utils\") Gets passed in as a\n *        function so that `style` can be processed. This is done\n *        for tree shaking purposes.\n * @param stringParser The parser is passed in so that it will be tree shakable. See\n *        `styleStringParser` and `classStringParser`\n * @param value The value to parse/convert to `KeyValueArray`\n */\nexport function toStylingKeyValueArray(\n  keyValueArraySet: (keyValueArray: KeyValueArray<any>, key: string, value: any) => void,\n  stringParser: (styleKeyValueArray: KeyValueArray<any>, text: string) => void,\n  value: string | string[] | {[key: string]: any} | SafeValue | null | undefined,\n): KeyValueArray<any> {\n  if (value == null /*|| value === undefined */ || value === '') return EMPTY_ARRAY as any;\n  const styleKeyValueArray: KeyValueArray<any> = [] as any;\n  const unwrappedValue = unwrapSafeValue(value) as string | string[] | {[key: string]: any};\n  if (Array.isArray(unwrappedValue)) {\n    for (let i = 0; i < unwrappedValue.length; i++) {\n      keyValueArraySet(styleKeyValueArray, unwrappedValue[i], true);\n    }\n  } else if (typeof unwrappedValue === 'object') {\n    for (const key in unwrappedValue) {\n      if (unwrappedValue.hasOwnProperty(key)) {\n        keyValueArraySet(styleKeyValueArray, key, unwrappedValue[key]);\n      }\n    }\n  } else if (typeof unwrappedValue === 'string') {\n    stringParser(styleKeyValueArray, unwrappedValue);\n  } else {\n    ngDevMode &&\n      throwError(\n        'Unsupported styling type: ' + typeof unwrappedValue + ' (' + unwrappedValue + ')',\n      );\n  }\n  return styleKeyValueArray;\n}\n\n/**\n * Set a `value` for a `key`.\n *\n * See: `keyValueArraySet` for details\n *\n * @param keyValueArray KeyValueArray to add to.\n * @param key Style key to add.\n * @param value The value to set.\n */\nexport function styleKeyValueArraySet(keyValueArray: KeyValueArray<any>, key: string, value: any) {\n  keyValueArraySet(keyValueArray, key, unwrapSafeValue(value));\n}\n\n/**\n * Class-binding-specific function for setting the `value` for a `key`.\n *\n * See: `keyValueArraySet` for details\n *\n * @param keyValueArray KeyValueArray to add to.\n * @param key Style key to add.\n * @param value The value to set.\n */\nexport function classKeyValueArraySet(keyValueArray: KeyValueArray<any>, key: unknown, value: any) {\n  // We use `classList.add` to eventually add the CSS classes to the DOM node. Any value passed into\n  // `add` is stringified and added to the `class` attribute, e.g. even null, undefined or numbers\n  // will be added. Stringify the key here so that our internal data structure matches the value in\n  // the DOM. The only exceptions are empty strings and strings that contain spaces for which\n  // the browser throws an error. We ignore such values, because the error is somewhat cryptic.\n  const stringKey = String(key);\n  if (stringKey !== '' && !stringKey.includes(' ')) {\n    keyValueArraySet(keyValueArray, stringKey, value);\n  }\n}\n\n/**\n * Update map based styling.\n *\n * Map based styling could be anything which contains more than one binding. For example `string`,\n * or object literal. Dealing with all of these types would complicate the logic so\n * instead this function expects that the complex input is first converted into normalized\n * `KeyValueArray`. The advantage of normalization is that we get the values sorted, which makes it\n * very cheap to compute deltas between the previous and current value.\n *\n * @param tView Associated `TView.data` contains the linked list of binding priorities.\n * @param tNode `TNode` where the binding is located.\n * @param lView `LView` contains the values associated with other styling binding at this `TNode`.\n * @param renderer Renderer to use if any updates.\n * @param oldKeyValueArray Previous value represented as `KeyValueArray`\n * @param newKeyValueArray Current value represented as `KeyValueArray`\n * @param isClassBased `true` if `class` (`false` if `style`)\n * @param bindingIndex Binding index of the binding.\n */\nfunction updateStylingMap(\n  tView: TView,\n  tNode: TNode,\n  lView: LView,\n  renderer: Renderer,\n  oldKeyValueArray: KeyValueArray<any>,\n  newKeyValueArray: KeyValueArray<any>,\n  isClassBased: boolean,\n  bindingIndex: number,\n) {\n  if ((oldKeyValueArray as KeyValueArray<any> | NO_CHANGE) === NO_CHANGE) {\n    // On first execution the oldKeyValueArray is NO_CHANGE => treat it as empty KeyValueArray.\n    oldKeyValueArray = EMPTY_ARRAY as any;\n  }\n  let oldIndex = 0;\n  let newIndex = 0;\n  let oldKey: s   tring | null = 0 < oldKeyValueArray.length ? oldKeyValueArray[0] : null;\n  let newKey: string | null = 0 < newKeyValueArray.length ? newKeyValueArray[0] : null;\n  while (oldKey !== null || newKey !== null) {\n    ngDevMode && assertLessThan(oldIndex, 999, 'Are we stuck in infinite loop?');\n    ngDevMode && assertLessThan(newIndex, 999, 'Are we stuck in infinite loop?');\n    const oldValue =\n      oldIndex < oldKeyValueArray.length ? oldKeyValueArray[oldIndex + 1] : undefined;\n    const newValue =\n      newIndex < newKeyValueArray.length ? newKeyValueArray[newIndex + 1] : undefined;\n    let setKey: string | null = null;\n    let setValue: any = undefined;\n    if (oldKey === newKey) {\n      // UPDATE: Keys are equal => new value is overwriting old value.\n      oldIndex += 2;\n      newIndex += 2;\n      if (oldValue !== newValue) {\n        setKey = newKey;\n        setValue = newValue;\n      }\n    } else if (newKey === null || (oldKey !== null && oldKey < newKey!)) {\n      // DELETE: oldKey key is missing or we did not find the oldKey in the newValue\n      // (because the keyValueArray is sorted and `newKey` is found later alphabetically).\n      // `\"background\" < \"color\"` so we need to delete `\"background\"` because it is not found in the\n      // new array.\n      oldIndex += 2;\n      setKey = oldKey;\n    } else {\n      // CREATE: newKey's is earlier alphabetically than oldKey's (or no oldKey) => we have new key.\n      // `\"color\" > \"background\"` so we need to add `color` because it is in new array but not in\n      // old array.\n      ngDevMode && assertDefined(newKey, 'Expecting to have a valid key');\n      newIndex += 2;\n      setKey = newKey;\n      setValue = newValue;\n    }\n    if (setKey !== null) {\n      updateStyling(tView, tNode, lView, renderer, setKey, setValue, isClassBased, bindingIndex);\n    }\n    oldKey = oldIndex < oldKeyValueArray.length ? oldKeyValueArray[oldIndex] : null;\n    newKey = newIndex < newKeyValueArray.length ? newKeyValueArray[newIndex] : null;\n  }\n}\n\n/**\n * Update a simple (property name) styling.\n *\n * This function takes `prop` and updates the DOM to that value. The function takes the binding\n * value as well as binding priority into consideration to determine which value should be written\n * to DOM. (For example it may be determined that there is a higher priority overwrite which blocks\n * the DOM write, or if the value goes to `undefined` a lower priority overwrite may be consulted.)\n *\n * @param tView Associated `TView.data` contains the linked list of binding priorities.\n * @param tNode `TNode` where the binding is located.\n * @param lView `LView` contains the values associated with other styling binding at this `TNode`.\n * @param renderer Renderer to use if any updates.\n * @param prop Either style property name or a class name.\n * @param value Either style value for `prop` or `true`/`false` if `prop` is class.\n * @param isClassBased `true` if `class` (`false` if `style`)\n * @param bindingIndex Binding index of the binding.\n */\nfunction updateStyling(\n  tView: TView,\n  tNode: TNode,\n  lView: LView,\n  renderer: Renderer,\n  prop: string,\n  value: string | undefined | null | boolean,\n  isClassBased: boolean,\n  bindingIndex: number,\n) {\n  if (!(tNode.type & TNodeType.AnyRNode)) {\n    // It is possible to have styling on non-elements (such as ng-container).\n    // This is rare, but it does happen. In such a case, just ignore the binding.\n    return;\n  }\n  const tData = tView.data;\n  const tRange = tData[bindingIndex + 1] as TStylingRange;\n  const higherPriorityValue = getTStylingRangeNextDuplicate(tRange)\n    ? findStylingValue(tData, tNode, lView, prop, getTStylingRangeNext(tRange), isClassBased)\n    : undefined;\n  if (!isStylingValuePresent(higherPriorityValue)) {\n    // We don't have a next duplicate, or we did not find a duplicate value.\n    if (!isStylingValuePresent(value)) {\n      // We should delete current value or restore to lower priority value.\n      if (getTStylingRangePrevDuplicate(tRange)) {\n        // We have a possible prev duplicate, let's retrieve it.\n        value = findStylingValue(tData, null, lView, prop, bindingIndex, isClassBased);\n      }\n    }\n    const rNode = getNativeByIndex(getSelectedIndex(), lView) as RElement;\n    applyStyling(renderer, isClassBased, rNode, prop, value);\n  }\n}\n\n/**\n * Search for styling value with higher priority which is overwriting current value, or a\n * value of lower priority to which we should fall back if the value is `undefined`.\n *\n * When value is being applied at a location, related values need to be consulted.\n * - If there is a higher priority binding, we should be using that one instead.\n *   For example `<div  [style]=\"{color:exp1}\" [style.color]=\"exp2\">` change to `exp1`\n *   requires that we check `exp2` to see if it is set to value other than `undefined`.\n * - If there is a lower priority binding and we are changing to `undefined`\n *   For example `<div  [style]=\"{color:exp1}\" [style.color]=\"exp2\">` change to `exp2` to\n *   `undefined` requires that we check `exp1` (and static values) and use that as new value.\n *\n * NOTE: The styling stores two values.\n * 1. The raw value which came from the application is stored at `index + 0` location. (This value\n *    is used for dirty checking).\n * 2. The normalized value is stored at `index + 1`.\n *\n * @param tData `TData` used for traversing the priority.\n * @param tNode `TNode` to use for resolving static styling. Also controls search direction.\n *   - `TNode` search next and quit as soon as `isStylingValuePresent(value)` is true.\n *      If no value found consult `tNode.residualStyle`/`tNode.residualClass` for default value.\n *   - `null` search prev and go all the way to end. Return last value where\n *     `isStylingValuePresent(value)` is true.\n * @param lView `LView` used for retrieving the actual values.\n * @param prop Property which we are interested in.\n * @param index Starting index in the linked list of styling bindings where the search should start.\n * @param isClassBased `true` if `class` (`false` if `style`)\n */\nfunction findStylingValue(\n  tData: TData,\n  tNode: TNode | null,\n  lView: LView,\n  prop: string,\n  index: number,\n  isClassBased: boolean,\n): any {\n  // `TNode` to use for resolving static styling. Also controls search direction.\n  //   - `TNode` search next and quit as soon as `isStylingValuePresent(value)` is true.\n  //      If no value found consult `tNode.residualStyle`/`tNode.residualClass` for default value.\n  //   - `null` search prev and go all the way to end. Return last value where\n  //     `isStylingValuePresent(value)` is true.\n  const isPrevDirection = tNode === null;\n  let value: any = undefined;\n  while (index > 0) {\n    const rawKey = tData[index] as TStylingKey;\n    const containsStatics = Array.isArray(rawKey);\n    // Unwrap the key if we contain static values.\n    const key = containsStatics ? (rawKey as string[])[1] : rawKey;\n    const isStylingMap = key === null;\n    let valueAtLViewIndex = lView[index + 1];\n    if (valueAtLViewIndex === NO_CHANGE) {\n      // In firstUpdatePass the styling instructions create a linked list of styling.\n      // On subsequent passes it is possible for a styling instruction to try to read a binding\n      // which\n      // has not yet executed. In that case we will find `NO_CHANGE` and we should assume that\n      // we have `undefined` (or empty array in case of styling-map instruction) instead. This\n      // allows the resolution to apply the value (which may later be overwritten when the\n      // binding actually executes.)\n      valueAtLViewIndex = isStylingMap ? EMPTY_ARRAY : undefined;\n    }\n    let currentValue = isStylingMap\n      ? keyValueArrayGet(valueAtLViewIndex, prop)\n      : key === prop\n        ? valueAtLViewIndex\n        : undefined;\n    if (containsStatics && !isStylingValuePresent(currentValue)) {\n      currentValue = keyValueArrayGet(rawKey as KeyValueArray<any>, prop);\n    }\n    if (isStylingValuePresent(currentValue)) {\n      value = currentValue;\n      if (isPrevDirection) {\n        return value;\n      }\n    }\n    const tRange = tData[index + 1] as TStylingRange;\n    index = isPrevDirection ? getTStylingRangePrev(tRange) : getTStylingRangeNext(tRange);\n  }\n  if (tNode !== null) {\n    // in case where we are going in next direction AND we did not find anything, we need to\n    // consult residual styling\n    let residual = isClassBased ? tNode.residualClasses : tNode.residualStyles;\n    if (residual != null /** OR residual !=== undefined */) {\n      value = keyValueArrayGet(residual!, prop);\n    }\n  }\n  return value;\n}\n\n/**\n * Determines if the binding value should be used (or if the value is 'undefined' and hence priority\n * resolution should be used.)\n *\n * @param value Binding style value.\n */\nfunction isStylingValuePresent(value: any): boolean {\n  // Currently only `undefined` value is considered non-binding. That is `undefined` says I don't\n  // have an opinion as to what this binding should be and you should consult other bindings by\n  // priority to determine the valid value.\n  // This is extracted into a single function so that we have a single place to control this.\n  return value !== undefined;\n}\n\n/**\n * Normalizes and/or adds a suffix to the value.\n *\n * If value is `null`/`undefined` no suffix is added\n * @param value\n * @param suffix\n */\nfunction normalizeSuffix(\n  value: any,\n  suffix: string | undefined | null,\n): string | null | undefined | boolean {\n  if (value == null || value === '') {\n    // do nothing\n    // Do not add the suffix if the value is going to be empty.\n    // As it produce invalid CSS, which the browsers will automatically omit but Domino will not.\n    // Example: `\"left\": \"px;\"` instead of `\"left\": \"\"`.\n  } else if (typeof suffix === 'string') {\n    value = value + suffix;\n  } else if (typeof value === 'object') {\n    value = stringify(unwrapSafeValue(value));\n  }\n  return value;\n}\n\n/**\n * Tests if the `TNode` has input shadow.\n *\n * An input shadow is when a directive steals (shadows) the input by using `@Input('style')` or\n * `@Input('class')` as input.\n *\n * @param tNode `TNode` which we would like to see if it has shadow.\n * @param isClassBased `true` if `class` (`false` if `style`)\n */\nexport function hasStylingInputShadow(tNode: TNode, isClassBased: boolean) {\n  return (tNode.flags & (isClassBased ? TNodeFlags.hasClassInput : TNodeFlags.hasStyleInput)) !== 0;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {keyValueArraySet} from '../../util/array_utils';\nimport {getLView} from '../state';\nimport {\n  interpolation1,\n  interpolation2,\n  interpolation3,\n  interpolation4,\n  interpolation5,\n  interpolation6,\n  interpolation7,\n  interpolation8,\n  interpolationV,\n} from './interpolation';\nimport {checkStylingMap, classStringParser} from './styling';\n\n/**\n *\n * Update an interpolated class on an element with single bound value surrounded by text.\n *\n * Used when the value passed to a property has 1 interpolated value in it:\n *\n * ```html\n * <div class=\"prefix{{v0}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolate1('prefix', v0, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolate1(prefix: string, v0: any, suffix: string): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation1(lView, prefix, v0, suffix);\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n\n/**\n *\n * Update an interpolated class on an element with 2 bound values surrounded by text.\n *\n * Used when the value passed to a property has 2 interpolated values in it:\n *\n * ```html\n * <div class=\"prefix{{v0}}-{{v1}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolate2('prefix', v0, '-', v1, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolate2(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n\n/**\n *\n * Update an interpolated class on an element with 3 bound values surrounded by text.\n *\n * Used when the value passed to a property has 3 interpolated values in it:\n *\n * ```html\n * <div class=\"prefix{{v0}}-{{v1}}-{{v2}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolate3(\n * 'prefix', v0, '-', v1, '-', v2, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolate3(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n\n/**\n *\n * Update an interpolated class on an element with 4 bound values surrounded by text.\n *\n * Used when the value passed to a property has 4 interpolated values in it:\n *\n * ```html\n * <div class=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolate4(\n * 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolate4(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n\n/**\n *\n * Update an interpolated class on an element with 5 bound values surrounded by text.\n *\n * Used when the value passed to a property has 5 interpolated values in it:\n *\n * ```html\n * <div class=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolate5(\n * 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolate5(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation5(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    suffix,\n  );\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n\n/**\n *\n * Update an interpolated class on an element with 6 bound values surrounded by text.\n *\n * Used when the value passed to a property has 6 interpolated values in it:\n *\n * ```html\n * <div class=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolate6(\n *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolate6(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation6(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    suffix,\n  );\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n\n/**\n *\n * Update an interpolated class on an element with 7 bound values surrounded by text.\n *\n * Used when the value passed to a property has 7 interpolated values in it:\n *\n * ```html\n * <div class=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolate7(\n *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolate7(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation7(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    suffix,\n  );\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n\n/**\n *\n * Update an interpolated class on an element with 8 bound values surrounded by text.\n *\n * Used when the value passed to a property has 8 interpolated values in it:\n *\n * ```html\n * <div class=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolate8(\n *  'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param i6 Static value used for concatenation only.\n * @param v7 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolate8(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  i6: string,\n  v7: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation8(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    i6,\n    v7,\n    suffix,\n  );\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n\n/**\n * Update an interpolated class on an element with 9 or more bound values surrounded by text.\n *\n * Used when the number of interpolated values exceeds 8.\n *\n * ```html\n * <div\n *  class=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵclassMapInterpolateV(\n *  ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,\n *  'suffix']);\n * ```\n *.\n * @param values The collection of values and the strings in-between those values, beginning with\n * a string prefix and ending with a string suffix.\n * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)\n * @codeGenApi\n */\nexport function ɵɵclassMapInterpolateV(values: any[]): void {\n  const lView = getLView();\n  const interpolatedValue = interpolationV(lView, values);\n  checkStylingMap(keyValueArraySet, classStringParser, interpolatedValue, true);\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertDefined} from '../../util/assert';\nimport {CONTEXT, DECLARATION_COMPONENT_VIEW} from '../interfaces/view';\nimport {getLView} from '../state';\n\n/**\n * Instruction that returns the component instance in which the current instruction is executing.\n * This is a constant-time version of `nextContent` for the case where we know that we need the\n * component instance specifically, rather than the context of a particular template.\n *\n * @codeGenApi\n */\nexport function ɵɵcomponentInstance(): unknown {\n  const instance = getLView()[DECLARATION_COMPONENT_VIEW][CONTEXT];\n  ngDevMode && assertDefined(instance, 'Expected component instance to be defined');\n  return instance;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {TrackByFunction} from '../change_detection';\nimport {formatRuntimeError, RuntimeErrorCode} from '../errors';\n\nimport {stringifyForError} from './util/stringify_utils';\n\n/**\n * A type representing the live collection to be reconciled with any new (incoming) collection. This\n * is an adapter class that makes it possible to work with different internal data structures,\n * regardless of the actual values of the incoming collection.\n */\nexport abstract class LiveCollection<T, V> {\n  abstract get length(): number;\n  abstract at(index: number): V;\n  abstract attach(index: number, item: T): void;\n  abstract detach(index: number): T;\n  abstract create(index: number, value: V): T;\n  destroy(item: T): void {\n    // noop by default\n  }\n  updateValue(index: number, value: V): void {\n    // noop by default\n  }\n\n  // operations below could be implemented on top of the operations defined so far, but having\n  // them explicitly allow clear expression of intent and potentially more performant\n  // implementations\n  swap(index1: number, index2: number): void {\n    const startIdx = Math.min(index1, index2);\n    const endIdx = Math.max(index1, index2);\n    const endItem = this.detach(endIdx);\n    if (endIdx - startIdx > 1) {\n      const startItem = this.detach(startIdx);\n      this.attach(startIdx, endItem);\n      this.attach(endIdx, startItem);\n    } else {\n      this.attach(startIdx, endItem);\n    }\n  }\n  move(prevIndex: number, newIdx: number): void {\n    this.attach(newIdx, this.detach(prevIndex));\n  }\n}\n\nfunction valuesMatching<V>(\n  liveIdx: number,\n  liveValue: V,\n  newIdx: number,\n  newValue: V,\n  trackBy: TrackByFunction<V>,\n): number {\n  if (liveIdx === newIdx && Object.is(liveValue, newValue)) {\n    // matching and no value identity to update\n    return 1;\n  } else if (Object.is(trackBy(liveIdx, liveValue), trackBy(newIdx, newValue))) {\n    // matching but requires value identity update\n    return -1;\n  }\n\n  return 0;\n}\n\nfunction recordDuplicateKeys(keyToIdx: Map<unknown, Set<number>>, key: unknown, idx: number): void {\n  const idxSoFar = keyToIdx.get(key);\n\n  if (idxSoFar !== undefined) {\n    idxSoFar.add(idx);\n  } else {\n    keyToIdx.set(key, new Set([idx]));\n  }\n}\n\n/**\n * The live collection reconciliation algorithm that perform various in-place operations, so it\n * reflects the content of the new (incoming) collection.\n *\n * The reconciliation algorithm has 2 code paths:\n * - \"fast\" path that don't require any memory allocation;\n * - \"slow\" path that requires additional memory allocation for intermediate data structures used to\n * collect additional information about the live collection.\n * It might happen that the algorithm switches between the two modes in question in a single\n * reconciliation path - generally it tries to stay on the \"fast\" path as much as possible.\n *\n * The overall complexity of the algorithm is O(n + m) for speed and O(n) for memory (where n is the\n * length of the live collection and m is the length of the incoming collection). Given the problem\n * at hand the complexity / performance constraints makes it impossible to perform the absolute\n * minimum of operation to reconcile the 2 collections. The algorithm makes different tradeoffs to\n * stay within reasonable performance bounds and may apply sub-optimal number of operations in\n * certain situations.\n *\n * @param liveCollection the current, live collection;\n * @param newCollection the new, incoming collection;\n * @param trackByFn key generation function that determines equality between items in the life and\n *     incoming collection;\n */\nexport function reconcile<T, V>(\n  liveCollection: LiveCollection<T, V>,\n  newCollection: Iterable<V> | undefined | null,\n  trackByFn: TrackByFunction<V>,\n): void {\n  let detachedItems: UniqueValueMultiKeyMap<unknown, T> | undefined = undefined;\n  let liveKeysInTheFuture: Set<unknown> | undefined = undefined;\n\n  let liveStartIdx = 0;\n  let liveEndIdx = liveCollection.length - 1;\n\n  const duplicateKeys = ngDevMode ? new Map<unknown, Set<number>>() : undefined;\n\n  if (Array.isArray(newCollection)) {\n    let newEndIdx = newCollection.length - 1;\n\n    while (liveStartIdx <= liveEndIdx && liveStartIdx <= newEndIdx) {\n      // compare from the beginning\n      const liveStartValue = liveCollection.at(liveStartIdx);\n      const newStartValue = newCollection[liveStartIdx];\n\n      if (ngDevMode) {\n        recordDuplicateKeys(duplicateKeys!, trackByFn(liveStartIdx, newStartValue), liveStartIdx);\n      }\n\n      const isStartMatching = valuesMatching(\n        liveStartIdx,\n        liveStartValue,\n        liveStartIdx,\n        newStartValue,\n        trackByFn,\n      );\n      if (isStartMatching !== 0) {\n        if (isStartMatching < 0) {\n          liveCollection.updateValue(liveStartIdx, newStartValue);\n        }\n        liveStartIdx++;\n        continue;\n      }\n\n      // compare from the end\n      // TODO(perf): do _all_ the matching from the end\n      const liveEndValue = liveCollection.at(liveEndIdx);\n      const newEndValue = newCollection[newEndIdx];\n\n      if (ngDevMode) {\n        recordDuplicateKeys(duplicateKeys!, trackByFn(newEndIdx, newEndValue), newEndIdx);\n      }\n\n      const isEndMatching = valuesMatching(\n        liveEndIdx,\n        liveEndValue,\n        newEndIdx,\n        newEndValue,\n        trackByFn,\n      );\n      if (isEndMatching !== 0) {\n        if (isEndMatching < 0) {\n          liveCollection.updateValue(liveEndIdx, newEndValue);\n        }\n        liveEndIdx--;\n        newEndIdx--;\n        continue;\n      }\n\n      // Detect swap and moves:\n      const liveStartKey = trackByFn(liveStartIdx, liveStartValue);\n      const liveEndKey = trackByFn(liveEndIdx, liveEndValue);\n      const newStartKey = trackByFn(liveStartIdx, newStartValue);\n      if (Object.is(newStartKey, liveEndKey)) {\n        const newEndKey = trackByFn(newEndIdx, newEndValue);\n        // detect swap on both ends;\n        if (Object.is(newEndKey, liveStartKey)) {\n          liveCollection.swap(liveStartIdx, liveEndIdx);\n          liveCollection.updateValue(liveEndIdx, newEndValue);\n          newEndIdx--;\n          liveEndIdx--;\n        } else {\n          // the new item is the same as the live item with the end pointer - this is a move forward\n          // to an earlier index;\n          liveCollection.move(liveEndIdx, liveStartIdx);\n        }\n        liveCollection.updateValue(liveStartIdx, newStartValue);\n        liveStartIdx++;\n        continue;\n      }\n\n      // Fallback to the slow path: we need to learn more about the content of the live and new\n      // collections.\n      detachedItems ??= new UniqueValueMultiKeyMap();\n      liveKeysInTheFuture ??= initLiveItemsInTheFuture(\n        liveCollection,\n        liveStartIdx,\n        liveEndIdx,\n        trackByFn,\n      );\n\n      // Check if I'm inserting a previously detached item: if so, attach it here\n      if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newStartKey)) {\n        liveCollection.updateValue(liveStartIdx, newStartValue);\n        liveStartIdx++;\n        liveEndIdx++;\n      } else if (!liveKeysInTheFuture.has(newStartKey)) {\n        // Check if we seen a new item that doesn't exist in the old collection and must be INSERTED\n        const newItem = liveCollection.create(liveStartIdx, newCollection[liveStartIdx]);\n        liveCollection.attach(liveStartIdx, newItem);\n        liveStartIdx++;\n        liveEndIdx++;\n      } else {\n        // We know that the new item exists later on in old collection but we don't know its index\n        // and as the consequence can't move it (don't know where to find it). Detach the old item,\n        // hoping that it unlocks the fast path again.\n        detachedItems.set(liveStartKey, liveCollection.detach(liveStartIdx));\n        liveEndIdx--;\n      }\n    }\n\n    // Final cleanup steps:\n    // - more items in the new collection => insert\n    while (liveStartIdx <= newEndIdx) {\n      createOrAttach(\n        liveCollection,\n        detachedItems,\n        trackByFn,\n        liveStartIdx,\n        newCollection[liveStartIdx],\n      );\n      liveStartIdx++;\n    }\n  } else if (newCollection != null) {\n    // iterable - immediately fallback to the slow path\n    const newCollectionIterator = newCollection[Symbol.iterator]();\n    let newIterationResult = newCollectionIterator.next();\n    while (!newIterationResult.done && liveStartIdx <= liveEndIdx) {\n      const liveValue = liveCollection.at(liveStartIdx);\n      const newValue = newIterationResult.value;\n\n      if (ngDevMode) {\n        recordDuplicateKeys(duplicateKeys!, trackByFn(liveStartIdx, newValue), liveStartIdx);\n      }\n\n      const isStartMatching = valuesMatching(\n        liveStartIdx,\n        liveValue,\n        liveStartIdx,\n        newValue,\n        trackByFn,\n      );\n      if (isStartMatching !== 0) {\n        // found a match - move on, but update value\n        if (isStartMatching < 0) {\n          liveCollection.updateValue(liveStartIdx, newValue);\n        }\n        liveStartIdx++;\n        newIterationResult = newCollectionIterator.next();\n      } else {\n        detachedItems ??= new UniqueValueMultiKeyMap();\n        liveKeysInTheFuture ??= initLiveItemsInTheFuture(\n          liveCollection,\n          liveStartIdx,\n          liveEndIdx,\n          trackByFn,\n        );\n\n        // Check if I'm inserting a previously detached item: if so, attach it here\n        const newKey = trackByFn(liveStartIdx, newValue);\n        if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newKey)) {\n          liveCollection.updateValue(liveStartIdx, newValue);\n          liveStartIdx++;\n          liveEndIdx++;\n          newIterationResult = newCollectionIterator.next();\n        } else if (!liveKeysInTheFuture.has(newKey)) {\n          liveCollection.attach(liveStartIdx, liveCollection.create(liveStartIdx, newValue));\n          liveStartIdx++;\n          liveEndIdx++;\n          newIterationResult = newCollectionIterator.next();\n        } else {\n          // it is a move forward - detach the current item without advancing in collections\n          const liveKey = trackByFn(liveStartIdx, liveValue);\n          detachedItems.set(liveKey, liveCollection.detach(liveStartIdx));\n          liveEndIdx--;\n        }\n      }\n    }\n\n    // this is a new item as we run out of the items in the old collection - create or attach a\n    // previously detached one\n    while (!newIterationResult.done) {\n      createOrAttach(\n        liveCollection,\n        detachedItems,\n        trackByFn,\n        liveCollection.length,\n        newIterationResult.value,\n      );\n      newIterationResult = newCollectionIterator.next();\n    }\n  }\n\n  // Cleanups common to the array and iterable:\n  // - more items in the live collection => delete starting from the end;\n  while (liveStartIdx <= liveEndIdx) {\n    liveCollection.destroy(liveCollection.detach(liveEndIdx--));\n  }\n\n  // - destroy items that were detached but never attached again.\n  detachedItems?.forEach((item) => {\n    liveCollection.destroy(item);\n  });\n\n  // report duplicate keys (dev mode only)\n  if (ngDevMode) {\n    let duplicatedKeysMsg = [];\n    for (const [key, idxSet] of duplicateKeys!) {\n      if (idxSet.size > 1) {\n        const idx = [...idxSet].sort((a, b) => a - b);\n        for (let i = 1; i < idx.length; i++) {\n          duplicatedKeysMsg.push(\n            `key \"${stringifyForError(key)}\" at index \"${idx[i - 1]}\" and \"${idx[i]}\"`,\n          );\n        }\n      }\n    }\n\n    if (duplicatedKeysMsg.length > 0) {\n      const message = formatRuntimeError(\n        RuntimeErrorCode.LOOP_TRACK_DUPLICATE_KEYS,\n        'The provided track expression resulted in duplicated keys for a given collection. ' +\n          'Adjust the tracking expression such that it uniquely identifies all the items in the collection. ' +\n          'Duplicated keys were: \\n' +\n          duplicatedKeysMsg.join(', \\n') +\n          '.',\n      );\n\n      console.warn(message);\n    }\n  }\n}\n\nfunction attachPreviouslyDetached<T, V>(\n  prevCollection: LiveCollection<T, V>,\n  detachedItems: UniqueValueMultiKeyMap<unknown, T> | undefined,\n  index: number,\n  key: unknown,\n): boolean {\n  if (detachedItems !== undefined && detachedItems.has(key)) {\n    prevCollection.attach(index, detachedItems.get(key)!);\n    detachedItems.delete(key);\n    return true;\n  }\n  return false;\n}\n\nfunction createOrAttach<T, V>(\n  liveCollection: LiveCollection<T, V>,\n  detachedItems: UniqueValueMultiKeyMap<unknown, T> | undefined,\n  trackByFn: TrackByFunction<unknown>,\n  index: number,\n  value: V,\n) {\n  if (!attachPreviouslyDetached(liveCollection, detachedItems, index, trackByFn(index, value))) {\n    const newItem = liveCollection.create(index, value);\n    liveCollection.attach(index, newItem);\n  } else {\n    liveCollection.updateValue(index, value);\n  }\n}\n\nfunction initLiveItemsInTheFuture<T>(\n  liveCollection: LiveCollection<unknown, unknown>,\n  start: number,\n  end: number,\n  trackByFn: TrackByFunction<unknown>,\n): Set<unknown> {\n  const keys = new Set();\n  for (let i = start; i <= end; i++) {\n    keys.add(trackByFn(i, liveCollection.at(i)));\n  }\n  return keys;\n}\n\n/**\n * A specific, partial implementation of the Map interface with the following characteristics:\n * - allows multiple values for a given key;\n * - maintain FIFO order for multiple values corresponding to a given key;\n * - assumes that all values are unique.\n *\n * The implementation aims at having the minimal overhead for cases where keys are _not_ duplicated\n * (the most common case in the list reconciliation algorithm). To achieve this, the first value for\n * a given key is stored in a regular map. Then, when more values are set for a given key, we\n * maintain a form of linked list in a separate map. To maintain this linked list we assume that all\n * values (in the entire collection) are unique.\n */\nexport class UniqueValueMultiKeyMap<K, V> {\n  // A map from a key to the first value corresponding to this key.\n  private kvMap = new Map<K, V>();\n  // A map that acts as a linked list of values - each value maps to the next value in this \"linked\n  // list\" (this only works if values are unique). Allocated lazily to avoid memory consumption when\n  // there are no duplicated values.\n  private _vMap: Map<V, V> | undefined = undefined;\n\n  has(key: K): boolean {\n    return this.kvMap.has(key);\n  }\n\n  delete(key: K): boolean {\n    if (!this.has(key)) return false;\n\n    const value = this.kvMap.get(key)!;\n    if (this._vMap !== undefined && this._vMap.has(value)) {\n      this.kvMap.set(key, this._vMap.get(value)!);\n      this._vMap.delete(value);\n    } else {\n      this.kvMap.delete(key);\n    }\n\n    return true;\n  }\n\n  get(key: K): V | undefined {\n    return this.kvMap.get(key);\n  }\n\n  set(key: K, value: V): void {\n    if (this.kvMap.has(key)) {\n      let prevValue = this.kvMap.get(key)!;\n\n      // Note: we don't use `assertNotSame`, because the value needs to be stringified even if\n      // there is no error which can freeze the browser for large values (see #58509).\n      if (ngDevMode && prevValue === value) {\n        throw new Error(`Detected a duplicated value ${value} for the key ${key}`);\n      }\n\n      if (this._vMap === undefined) {\n        this._vMap = new Map();\n      }\n\n      const vMap = this._vMap;\n      while (vMap.has(prevValue)) {\n        prevValue = vMap.get(prevValue)!;\n      }\n      vMap.set(prevValue, value);\n    } else {\n      this.kvMap.set(key, value);\n    }\n  }\n\n  forEach(cb: (v: V, k: K) => void) {\n    for (let [key, value] of this.kvMap) {\n      cb(value, key);\n      if (this._vMap !== undefined) {\n        const vMap = this._vMap;\n        while (vMap.has(value)) {\n          value = vMap.get(value)!;\n          cb(value, key);\n        }\n      }\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../../primitives/signals';\n\nimport {TrackByFunction} from '../../change_detection';\nimport {formatRuntimeError, RuntimeErrorCode} from '../../errors';\nimport {DehydratedContainerView} from '../../hydration/interfaces';\nimport {findMatchingDehydratedView} from '../../hydration/views';\nimport {assertDefined, assertFunction} from '../../util/assert';\nimport {performanceMarkFeature} from '../../util/performance';\nimport {assertLContainer, assertLView, assertTNode} from '../assert';\nimport {bindingUpdated} from '../bindings';\nimport {CONTAINER_HEADER_OFFSET, LContainer} from '../interfaces/container';\nimport {ComponentTemplate} from '../interfaces/definition';\nimport {TNode} from '../interfaces/node';\nimport {\n  CONTEXT,\n  DECLARATION_COMPONENT_VIEW,\n  HEADER_OFFSET,\n  HYDRATION,\n  LView,\n  TVIEW,\n  TView,\n} from '../interfaces/view';\nimport {LiveCollection, reconcile} from '../list_reconciliation';\nimport {destroyLView} from '../node_manipulation';\nimport {getLView, getSelectedIndex, getTView, nextBindingIndex} from '../state';\nimport {NO_CHANGE} from '../tokens';\nimport {getConstant, getTNode} from '../util/view_utils';\nimport {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../view_manipulation';\n\nimport {declareTemplate} from './template';\nimport {\n  addLViewToLContainer,\n  detachView,\n  getLViewFromLContainer,\n  removeLViewFromLContainer,\n} from '../view/container';\n\n/**\n * The conditional instruction represents the basic building block on the runtime side to support\n * built-in \"if\" and \"switch\". On the high level this instruction is responsible for adding and\n * removing views selected by a conditional expression.\n *\n * @param matchingTemplateIndex Index of a template TNode representing a conditional view to be\n *     inserted; -1 represents a special case when there is no view to insert.\n * @param contextValue Value that should be exposed as the context of the conditional.\n * @codeGenApi\n */\nexport function ɵɵconditional<T>(matchingTemplateIndex: number, contextValue?: T) {\n  performanceMarkFeature('NgControlFlow');\n\n  const hostLView = getLView();\n  const bindingIndex = nextBindingIndex();\n  const prevMatchingTemplateIndex: number =\n    hostLView[bindingIndex] !== NO_CHANGE ? hostLView[bindingIndex] : -1;\n  const prevContainer =\n    prevMatchingTemplateIndex !== -1\n      ? getLContainer(hostLView, HEADER_OFFSET + prevMatchingTemplateIndex)\n      : undefined;\n  const viewInContainerIdx = 0;\n\n  if (bindingUpdated(hostLView, bindingIndex, matchingTemplateIndex)) {\n    const prevConsumer = setActiveConsumer(null);\n    try {\n      // The index of the view to show changed - remove the previously displayed one\n      // (it is a noop if there are no active views in a container).\n      if (prevContainer !== undefined) {\n        removeLViewFromLContainer(prevContainer, viewInContainerIdx);\n      }\n\n      // Index -1 is a special case where none of the conditions evaluates to\n      // a truthy value and as the consequence we've got no view to show.\n      if (matchingTemplateIndex !== -1) {\n        const nextLContainerIndex = HEADER_OFFSET + matchingTemplateIndex;\n        const nextContainer = getLContainer(hostLView, nextLContainerIndex);\n        const templateTNode = getExistingTNode(hostLView[TVIEW], nextLContainerIndex);\n\n        const dehydratedView = findMatchingDehydratedView(\n          nextContainer,\n          templateTNode.tView!.ssrId,\n        );\n        const embeddedLView = createAndRenderEmbeddedLView(hostLView, templateTNode, contextValue, {\n          dehydratedView,\n        });\n\n        addLViewToLContainer(\n          nextContainer,\n          embeddedLView,\n          viewInContainerIdx,\n          shouldAddViewToDom(templateTNode, dehydratedView),\n        );\n      }\n    } finally {\n      setActiveConsumer(prevConsumer);\n    }\n  } else if (prevContainer !== undefined) {\n    // We might keep displaying the same template but the actual value of the expression could have\n    // changed - re-bind in context.\n    const lView = getLViewFromLContainer<T | undefined>(prevContainer, viewInContainerIdx);\n    if (lView !== undefined) {\n      lView[CONTEXT] = contextValue;\n    }\n  }\n}\n\nexport class RepeaterContext<T> {\n  constructor(\n    private lContainer: LContainer,\n    public $implicit: T,\n    public $index: number,\n  ) {}\n\n  get $count(): number {\n    return this.lContainer.length - CONTAINER_HEADER_OFFSET;\n  }\n}\n\n/**\n * A built-in trackBy function used for situations where users specified collection index as a\n * tracking expression. Having this function body in the runtime avoids unnecessary code generation.\n *\n * @param index\n * @returns\n */\nexport function ɵɵrepeaterTrackByIndex(index: number) {\n  return index;\n}\n\n/**\n * A built-in trackBy function used for situations where users specified collection item reference\n * as a tracking expression. Having this function body in the runtime avoids unnecessary code\n * generation.\n *\n * @param index\n * @returns\n */\nexport function ɵɵrepeaterTrackByIdentity<T>(_: number, value: T) {\n  return value;\n}\n\nclass RepeaterMetadata {\n  constructor(\n    public hasEmptyBlock: boolean,\n    public trackByFn: TrackByFunction<unknown>,\n    public liveCollection?: LiveCollectionLContainerImpl,\n  ) {}\n}\n\n/**\n * The repeaterCreate instruction runs in the creation part of the template pass and initializes\n * internal data structures required by the update pass of the built-in repeater logic. Repeater\n * metadata are allocated in the data part of LView with the following layout:\n * - LView[HEADER_OFFSET + index] - metadata\n * - LView[HEADER_OFFSET + index + 1] - reference to a template function rendering an item\n * - LView[HEADER_OFFSET + index + 2] - optional reference to a template function rendering an empty\n * block\n *\n * @param index Index at which to store the metadata of the repeater.\n * @param templateFn Reference to the template of the main repeater block.\n * @param decls The number of nodes, local refs, and pipes for the main block.\n * @param vars The number of bindings for the main block.\n * @param tagName The name of the container element, if applicable\n * @param attrsIndex Index of template attributes in the `consts` array.\n * @param trackByFn Reference to the tracking function.\n * @param trackByUsesComponentInstance Whether the tracking function has any references to the\n *  component instance. If it doesn't, we can avoid rebinding it.\n * @param emptyTemplateFn Reference to the template function of the empty block.\n * @param emptyDecls The number of nodes, local refs, and pipes for the empty block.\n * @param emptyVars The number of bindings for the empty block.\n * @param emptyTagName The name of the empty block container element, if applicable\n * @param emptyAttrsIndex Index of the empty block template attributes in the `consts` array.\n *\n * @codeGenApi\n */\nexport function ɵɵrepeaterCreate(\n  index: number,\n  templateFn: ComponentTemplate<unknown>,\n  decls: number,\n  vars: number,\n  tagName: string | null,\n  attrsIndex: number | null,\n  trackByFn: TrackByFunction<unknown>,\n  trackByUsesComponentInstance?: boolean,\n  emptyTemplateFn?: ComponentTemplate<unknown>,\n  emptyDecls?: number,\n  emptyVars?: number,\n  emptyTagName?: string | null,\n  emptyAttrsIndex?: number | null,\n): void {\n  performanceMarkFeature('NgControlFlow');\n\n  ngDevMode &&\n    assertFunction(\n      trackByFn,\n      `A track expression must be a function, was ${typeof trackByFn} instead.`,\n    );\n\n  const lView = getLView();\n  const tView = getTView();\n  const hasEmptyBlock = emptyTemplateFn !== undefined;\n  const hostLView = getLView();\n  const boundTrackBy = trackByUsesComponentInstance\n    ? // We only want to bind when necessary, because it produces a\n      // new function. For pure functions it's not necessary.\n      trackByFn.bind(hostLView[DECLARATION_COMPONENT_VIEW][CONTEXT])\n    : trackByFn;\n  const metadata = new RepeaterMetadata(hasEmptyBlock, boundTrackBy);\n  hostLView[HEADER_OFFSET + index] = metadata;\n\n  declareTemplate(\n    lView,\n    tView,\n    index + 1,\n    templateFn,\n    decls,\n    vars,\n    tagName,\n    getConstant(tView.consts, attrsIndex),\n  );\n\n  if (hasEmptyBlock) {\n    ngDevMode &&\n      assertDefined(emptyDecls, 'Missing number of declarations for the empty repeater block.');\n    ngDevMode &&\n      assertDefined(emptyVars, 'Missing number of bindings for the empty repeater block.');\n\n    declareTemplate(\n      lView,\n      tView,\n      index + 2,\n      emptyTemplateFn,\n      emptyDecls!,\n      emptyVars!,\n      emptyTagName,\n      getConstant(tView.consts, emptyAttrsIndex),\n    );\n  }\n}\n\nfunction isViewExpensiveToRecreate(lView: LView): boolean {\n  // assumption: anything more than a text node with a binding is considered \"expensive\"\n  return lView.length - HEADER_OFFSET > 2;\n}\n\nclass OperationsCounter {\n  created = 0;\n  destroyed = 0;\n\n  reset() {\n    this.created = 0;\n    this.destroyed = 0;\n  }\n\n  recordCreate() {\n    this.created++;\n  }\n\n  recordDestroy() {\n    this.destroyed++;\n  }\n\n  /**\n   * A method indicating if the entire collection was re-created as part of the reconciliation pass.\n   * Used to warn developers about the usage of a tracking function that might result in excessive\n   * amount of view creation / destroy operations.\n   *\n   * @returns boolean value indicating if a live collection was re-created\n   */\n  wasReCreated(collectionLen: number): boolean {\n    return collectionLen > 0 && this.created === this.destroyed && this.created === collectionLen;\n  }\n}\n\nclass LiveCollectionLContainerImpl extends LiveCollection<\n  LView<RepeaterContext<unknown>>,\n  unknown\n> {\n  operationsCounter = ngDevMode ? new OperationsCounter() : undefined;\n\n  /**\n   Property indicating if indexes in the repeater context need to be updated following the live\n   collection changes. Index updates are necessary if and only if views are inserted / removed in\n   the middle of LContainer. Adds and removals at the end don't require index updates.\n */\n  private needsIndexUpdate = false;\n  constructor(\n    private lContainer: LContainer,\n    private hostLView: LView,\n    private templateTNode: TNode,\n  ) {\n    super();\n  }\n\n  override get length(): number {\n    return this.lContainer.length - CONTAINER_HEADER_OFFSET;\n  }\n  override at(index: number): unknown {\n    return this.getLView(index)[CONTEXT].$implicit;\n  }\n  override attach(index: number, lView: LView<RepeaterContext<unknown>>): void {\n    const dehydratedView = lView[HYDRATION] as DehydratedContainerView;\n    this.needsIndexUpdate ||= index !== this.length;\n    addLViewToLContainer(\n      this.lContainer,\n      lView,\n      index,\n      shouldAddViewToDom(this.templateTNode, dehydratedView),\n    );\n  }\n  override detach(index: number): LView<RepeaterContext<unknown>> {\n    this.needsIndexUpdate ||= index !== this.length - 1;\n    return detachExistingView<RepeaterContext<unknown>>(this.lContainer, index);\n  }\n  override create(index: number, value: unknown): LView<RepeaterContext<unknown>> {\n    const dehydratedView = findMatchingDehydratedView(\n      this.lContainer,\n      this.templateTNode.tView!.ssrId,\n    );\n    const embeddedLView = createAndRenderEmbeddedLView(\n      this.hostLView,\n      this.templateTNode,\n      new RepeaterContext(this.lContainer, value, index),\n      {dehydratedView},\n    );\n    this.operationsCounter?.recordCreate();\n\n    return embeddedLView;\n  }\n  override destroy(lView: LView<RepeaterContext<unknown>>): void {\n    destroyLView(lView[TVIEW], lView);\n    this.operationsCounter?.recordDestroy();\n  }\n  override updateValue(index: number, value: unknown): void {\n    this.getLView(index)[CONTEXT].$implicit = value;\n  }\n\n  reset(): void {\n    this.needsIndexUpdate = false;\n    this.operationsCounter?.reset();\n  }\n\n  updateIndexes(): void {\n    if (this.needsIndexUpdate) {\n      for (let i = 0; i < this.length; i++) {\n        this.getLView(i)[CONTEXT].$index = i;\n      }\n    }\n  }\n\n  private getLView(index: number): LView<RepeaterContext<unknown>> {\n    return getExistingLViewFromLContainer(this.lContainer, index);\n  }\n}\n\n/**\n * The repeater instruction does update-time diffing of a provided collection (against the\n * collection seen previously) and maps changes in the collection to views structure (by adding,\n * removing or moving views as needed).\n * @param collection - the collection instance to be checked for changes\n * @codeGenApi\n */\nexport function ɵɵrepeater(collection: Iterable<unknown> | undefined | null): void {\n  const prevConsumer = setActiveConsumer(null);\n  const metadataSlotIdx = getSelectedIndex();\n  try {\n    const hostLView = getLView();\n    const hostTView = hostLView[TVIEW];\n    const metadata = hostLView[metadataSlotIdx] as RepeaterMetadata;\n    const containerIndex = metadataSlotIdx + 1;\n    const lContainer = getLContainer(hostLView, containerIndex);\n\n    if (metadata.liveCollection === undefined) {\n      const itemTemplateTNode = getExistingTNode(hostTView, containerIndex);\n      metadata.liveCollection = new LiveCollectionLContainerImpl(\n        lContainer,\n        hostLView,\n        itemTemplateTNode,\n      );\n    } else {\n      metadata.liveCollection.reset();\n    }\n\n    const liveCollection = metadata.liveCollection;\n    reconcile(liveCollection, collection, metadata.trackByFn);\n\n    // Warn developers about situations where the entire collection was re-created as part of the\n    // reconciliation pass. Note that this warning might be \"overreacting\" and report cases where\n    // the collection re-creation is the intended behavior. Still, the assumption is that most of\n    // the time it is undesired.\n    if (\n      ngDevMode &&\n      metadata.trackByFn === ɵɵrepeaterTrackByIdentity &&\n      liveCollection.operationsCounter?.wasReCreated(liveCollection.length) &&\n      isViewExpensiveToRecreate(getExistingLViewFromLContainer(lContainer, 0))\n    ) {\n      const message = formatRuntimeError(\n        RuntimeErrorCode.LOOP_TRACK_RECREATE,\n        `The configured tracking expression (track by identity) caused re-creation of the entire collection of size ${liveCollection.length}. ` +\n          'This is an expensive operation requiring destruction and subsequent creation of DOM nodes, directives, components etc. ' +\n          'Please review the \"track expression\" and make sure that it uniquely identifies items in a collection.',\n      );\n      console.warn(message);\n    }\n\n    // moves in the container might caused context's index to get out of order, re-adjust if needed\n    liveCollection.updateIndexes();\n\n    // handle empty blocks\n    if (metadata.hasEmptyBlock) {\n      const bindingIndex = nextBindingIndex();\n      const isCollectionEmpty = liveCollection.length === 0;\n      if (bindingUpdated(hostLView, bindingIndex, isCollectionEmpty)) {\n        const emptyTemplateIndex = metadataSlotIdx + 2;\n        const lContainerForEmpty = getLContainer(hostLView, emptyTemplateIndex);\n        if (isCollectionEmpty) {\n          const emptyTemplateTNode = getExistingTNode(hostTView, emptyTemplateIndex);\n          const dehydratedView = findMatchingDehydratedView(\n            lContainerForEmpty,\n            emptyTemplateTNode.tView!.ssrId,\n          );\n          const embeddedLView = createAndRenderEmbeddedLView(\n            hostLView,\n            emptyTemplateTNode,\n            undefined,\n            {dehydratedView},\n          );\n          addLViewToLContainer(\n            lContainerForEmpty,\n            embeddedLView,\n            0,\n            shouldAddViewToDom(emptyTemplateTNode, dehydratedView),\n          );\n        } else {\n          removeLViewFromLContainer(lContainerForEmpty, 0);\n        }\n      }\n    }\n  } finally {\n    setActiveConsumer(prevConsumer);\n  }\n}\n\nfunction getLContainer(lView: LView, index: number): LContainer {\n  const lContainer = lView[index];\n  ngDevMode && assertLContainer(lContainer);\n\n  return lContainer;\n}\n\nfunction detachExistingView<T>(lContainer: LContainer, index: number): LView<T> {\n  const existingLView = detachView(lContainer, index);\n  ngDevMode && assertLView(existingLView);\n\n  return existingLView as LView<T>;\n}\n\nfunction getExistingLViewFromLContainer<T>(lContainer: LContainer, index: number): LView<T> {\n  const existingLView = getLViewFromLContainer<T>(lContainer, index);\n  ngDevMode && assertLView(existingLView);\n\n  return existingLView!;\n}\n\nfunction getExistingTNode(tView: TView, index: number): TNode {\n  const tNode = getTNode(tView, index);\n  ngDevMode && assertTNode(tNode);\n\n  return tNode;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  invalidSkipHydrationHost,\n  validateMatchingNode,\n  validateNodeExists,\n} from '../../hydration/error_handling';\nimport {locateNextRNode} from '../../hydration/node_lookup_utils';\nimport {\n  hasSkipHydrationAttrOnRElement,\n  hasSkipHydrationAttrOnTNode,\n} from '../../hydration/skip_hydration';\nimport {\n  getSerializedContainerViews,\n  isDisconnectedNode,\n  markRNodeAsClaimedByHydration,\n  markRNodeAsSkippedByHydration,\n  setSegmentHead,\n} from '../../hydration/utils';\nimport {isDetachedByI18n} from '../../i18n/utils';\nimport {assertDefined, assertEqual, assertIndexInRange} from '../../util/assert';\nimport {assertHasParent} from '../assert';\nimport {attachPatchData} from '../context_discovery';\nimport {\n  clearElementContents,\n  createElementNode,\n  setupStaticAttributes,\n} from '../dom_node_manipulation';\nimport {hasClassInput, hasStyleInput, TElementNode, TNode, TNodeType} from '../interfaces/node';\nimport {Renderer} from '../interfaces/renderer';\nimport {RElement} from '../interfaces/renderer_dom';\nimport {isComponentHost, isDirectiveHost} from '../interfaces/type_checks';\nimport {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view';\nimport {assertTNodeType} from '../node_assert';\nimport {appendChild} from '../node_manipulation';\nimport {executeContentQueries} from '../queries/query_execution';\nimport {\n  decreaseElementDepthCount,\n  enterSkipHydrationBlock,\n  getBindingIndex,\n  getBindingsEnabled,\n  getCurrentTNode,\n  getElementDepthCount,\n  getLView,\n  getNamespace,\n  getTView,\n  increaseElementDepthCount,\n  isCurrentTNodeParent,\n  isInSkipHydrationBlock,\n  isSkipHydrationRootTNode,\n  lastNodeWasCreated,\n  leaveSkipHydrationBlock,\n  setCurrentTNode,\n  setCurrentTNodeAsNotParent,\n  wasLastNodeCreated,\n} from '../state';\nimport {elementEndFirstCreatePass, elementStartFirstCreatePass} from '../view/elements';\n\nimport {validateElementIsKnown} from './element_validation';\nimport {setDirectiveInputsWhichShadowsStyling} from './property';\nimport {\n  createDirectivesInstances,\n  findDirectiveDefMatches,\n  saveResolvedLocalsInData,\n} from './shared';\n\n/**\n * Create DOM element. The instruction must later be followed by `elementEnd()` call.\n *\n * @param index Index of the element in the LView array\n * @param name Name of the DOM Node\n * @param attrsIndex Index of the element's attributes in the `consts` array.\n * @param localRefsIndex Index of the element's local references in the `consts` array.\n * @returns This function returns itself so that it may be chained.\n *\n * Attributes and localRefs are passed as an array of strings where elements with an even index\n * hold an attribute name and elements with an odd index hold an attribute value, ex.:\n * ['id', 'warning5', 'class', 'alert']\n *\n * @codeGenApi\n */\nexport function ɵɵelementStart(\n  index: number,\n  name: string,\n  attrsIndex?: number | null,\n  localRefsIndex?: number,\n): typeof ɵɵelementStart {\n  const lView = getLView();\n  const tView = getTView();\n  const adjustedIndex = HEADER_OFFSET + index;\n\n  ngDevMode &&\n    assertEqual(\n      getBindingIndex(),\n      tView.bindingStartIndex,\n      'elements should be created before any bindings',\n    );\n  ngDevMode && assertIndexInRange(lView, adjustedIndex);\n\n  const renderer = lView[RENDERER];\n  const tNode = tView.firstCreatePass\n    ? elementStartFirstCreatePass(\n        adjustedIndex,\n        tView,\n        lView,\n        name,\n        findDirectiveDefMatches,\n        getBindingsEnabled(),\n        attrsIndex,\n        localRefsIndex,\n      )\n    : (tView.data[adjustedIndex] as TElementNode);\n\n  const native = _locateOrCreateElementNode(tView, lView, tNode, renderer, name, index);\n  lView[adjustedIndex] = native;\n\n  const hasDirectives = isDirectiveHost(tNode);\n\n  if (ngDevMode && tView.firstCreatePass) {\n    validateElementIsKnown(native, lView, tNode.value, tView.schemas, hasDirectives);\n  }\n\n  setCurrentTNode(tNode, true);\n  setupStaticAttributes(renderer, native, tNode);\n\n  if (!isDetachedByI18n(tNode) && wasLastNodeCreated()) {\n    // In the i18n case, the translation may have removed this element, so only add it if it is not\n    // detached. See `TNodeType.Placeholder` and `LFrame.inI18n` for more context.\n    appendChild(tView, lView, native, tNode);\n  }\n\n  // any immediate children of a component or template container must be pre-emptively\n  // monkey-patched with the component view data so that the element can be inspected\n  // later on using any element discovery utility methods (see `element_discovery.ts`)\n  if (getElementDepthCount() === 0 || hasDirectives) {\n    attachPatchData(native, lView);\n  }\n  increaseElementDepthCount();\n\n  if (hasDirectives) {\n    createDirectivesInstances(tView, lView, tNode);\n    executeContentQueries(tView, tNode, lView);\n  }\n  if (localRefsIndex !== null) {\n    saveResolvedLocalsInData(lView, tNode);\n  }\n  return ɵɵelementStart;\n}\n\n/**\n * Mark the end of the element.\n * @returns This function returns itself so that it may be chained.\n *\n * @codeGenApi\n */\nexport function ɵɵelementEnd(): typeof ɵɵelementEnd {\n  let currentTNode = getCurrentTNode()!;\n  ngDevMode && assertDefined(currentTNode, 'No parent node to close.');\n  if (isCurrentTNodeParent()) {\n    setCurrentTNodeAsNotParent();\n  } else {\n    ngDevMode && assertHasParent(getCurrentTNode());\n    currentTNode = currentTNode.parent!;\n    setCurrentTNode(currentTNode, false);\n  }\n\n  const tNode = currentTNode;\n  ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode);\n\n  if (isSkipHydrationRootTNode(tNode)) {\n    leaveSkipHydrationBlock();\n  }\n\n  decreaseElementDepthCount();\n\n  const tView = getTView();\n  if (tView.firstCreatePass) {\n    elementEndFirstCreatePass(tView, tNode);\n  }\n\n  if (tNode.classesWithoutHost != null && hasClassInput(tNode)) {\n    setDirectiveInputsWhichShadowsStyling(tView, tNode, getLView(), tNode.classesWithoutHost, true);\n  }\n\n  if (tNode.stylesWithoutHost != null && hasStyleInput(tNode)) {\n    setDirectiveInputsWhichShadowsStyling(tView, tNode, getLView(), tNode.stylesWithoutHost, false);\n  }\n  return ɵɵelementEnd;\n}\n\n/**\n * Creates an empty element using {@link elementStart} and {@link elementEnd}\n *\n * @param index Index of the element in the data array\n * @param name Name of the DOM Node\n * @param attrsIndex Index of the element's attributes in the `consts` array.\n * @param localRefsIndex Index of the element's local references in the `consts` array.\n * @returns This function returns itself so that it may be chained.\n *\n * @codeGenApi\n */\nexport function ɵɵelement(\n  index: number,\n  name: string,\n  attrsIndex?: number | null,\n  localRefsIndex?: number,\n): typeof ɵɵelement {\n  ɵɵelementStart(index, name, attrsIndex, localRefsIndex);\n  ɵɵelementEnd();\n  return ɵɵelement;\n}\n\nlet _locateOrCreateElementNode: typeof locateOrCreateElementNodeImpl = (\n  tView: TView,\n  lView: LView,\n  tNode: TNode,\n  renderer: Renderer,\n  name: string,\n  index: number,\n) => {\n  lastNodeWasCreated(true);\n  return createElementNode(renderer, name, getNamespace());\n};\n\n/**\n * Enables hydration cod   e path (to lookup existing elements in DOM)\n * in addition to the regular creation mode of element nodes.\n */\nfunction locateOrCreateElementNodeImpl(\n  tView: TView,\n  lView: LView,\n  tNode: TNode,\n  renderer: Renderer,\n  name: string,\n  index: number,\n): RElement {\n  const hydrationInfo = lView[HYDRATION];\n  const isNodeCreationMode =\n    !hydrationInfo ||\n    isInSkipHydrationBlock() ||\n    isDetachedByI18n(tNode) ||\n    isDisconnectedNode(hydrationInfo, index);\n  lastNodeWasCreated(isNodeCreationMode);\n\n  // Regular creation mode.\n  if (isNodeCreationMode) {\n    return createElementNode(renderer, name, getNamespace());\n  }\n\n  // Hydration mode, looking up an existing element in DOM.\n  const native = locateNextRNode<RElement>(hydrationInfo, tView, lView, tNode)!;\n  ngDevMode && validateMatchingNode(native, Node.ELEMENT_NODE, name, lView, tNode);\n  ngDevMode && markRNodeAsClaimedByHydration(native);\n\n  // This element might also be an anchor of a view container.\n  if (getSerializedContainerViews(hydrationInfo, index)) {\n    // Important note: this element acts as an anchor, but it's **not** a part\n    // of the embedded view, so we start the segment **after** this element, taking\n    // a reference to the next sibling. For example, the following template:\n    // `<div #vcrTarget>` is represented in the DOM as `<div></div>...<!--container-->`,\n    // so while processing a `<div>` instruction, point to the next sibling as a\n    // start of a segment.\n    ngDevMode && validateNodeExists(native.nextSibling, lView, tNode);\n    setSegmentHead(hydrationInfo, index, native.nextSibling);\n  }\n\n  // Checks if the skip hydration attribute is present during hydration so we know to\n  // skip attempting to hydrate this block. We check both TNode and RElement for an\n  // attribute: the RElement case is needed for i18n cases, when we add it to host\n  // elements during the annotation phase (after all internal data structures are setup).\n  if (\n    hydrationInfo &&\n    (hasSkipHydrationAttrOnTNode(tNode) || hasSkipHydrationAttrOnRElement(native))\n  ) {\n    if (isComponentHost(tNode)) {\n      enterSkipHydrationBlock(tNode);\n\n      // Since this isn't hydratable, we need to empty the node\n      // so there's no duplicate content after render\n      clearElementContents(native);\n\n      ngDevMode && markRNodeAsSkippedByHydration(native);\n    } else if (ngDevMode) {\n      // If this is not a component host, throw an error.\n      // Hydration can be skipped on per-component basis only.\n      throw invalidSkipHydrationHost(native);\n    }\n  }\n  return native;\n}\n\nexport function enableLocateOrCreateElementNodeImpl() {\n  _locateOrCreateElementNode = locateOrCreateElementNodeImpl;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {validateMatchingNode, validateNodeExists} from '../../hydration/error_handling';\nimport {locateNextRNode, siblingAfter} from '../../hydration/node_lookup_utils';\nimport {\n  getNgContainerSize,\n  isDisconnectedNode,\n  markRNodeAsClaimedByHydration,\n  setSegmentHead,\n} from '../../hydration/utils';\nimport {isDetachedByI18n} from '../../i18n/utils';\nimport {assertEqual, assertIndexInRange, assertNumber} from '../../util/assert';\nimport {assertHasParent} from '../assert';\nimport {attachPatchData} from '../context_discovery';\nimport {createCommentNode} from '../dom_node_manipulation';\nimport {registerPostOrderHooks} from '../hooks';\nimport {TAttributes, TElementContainerNode, TNode, TNodeType} from '../interfaces/node';\nimport {RComment} from '../interfaces/renderer_dom';\nimport {isContentQueryHost, isDirectiveHost} from '../interfaces/type_checks';\nimport {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view';\nimport {assertTNodeType} from '../node_assert';\nimport {appendChild} from '../node_manipulation';\nimport {executeContentQueries} from '../queries/query_execution';\nimport {\n  getBindingIndex,\n  getBindingsEnabled,\n  getCurrentTNode,\n  getLView,\n  getTView,\n  isCurrentTNodeParent,\n  isInSkipHydrationBlock,\n  lastNodeWasCreated,\n  setCurrentTNode,\n  setCurrentTNodeAsNotParent,\n  wasLastNodeCreated,\n} from '../state';\nimport {computeStaticStyling} from '../styling/static_styling';\nimport {mergeHostAttrs} from '../util/attrs_utils';\nimport {getConstant} from '../util/view_utils';\n\nimport {getOrCreateTNode} from '../tnode_manipulation';\nimport {resolveDirectives} from '../view/directives';\nimport {\n  createDirectivesInstances,\n  findDirectiveDefMatches,\n  saveResolvedLocalsInData,\n} from './shared';\n\nfunction elementContainerStartFirstCreatePass(\n  index: number,\n  tView: TView,\n  lView: LView,\n  attrsIndex?: number | null,\n  localRefsIndex?: number,\n): TElementContainerNode {\n  ngDevMode && ngDevMode.firstCreatePass++;\n\n  const tViewConsts = tView.consts;\n  const attrs = getConstant<TAttributes>(tViewConsts, attrsIndex);\n  const tNode = getOrCreateTNode(tView, index, TNodeType.ElementContainer, 'ng-container', attrs);\n\n  // While ng-container doesn't necessarily support styling, we use the style context to identify\n  // and execute directives on the ng-container.\n  if (attrs !== null) {\n    computeStaticStyling(tNode, attrs, true);\n  }\n\n  const localRefs = getConstant<string[]>(tViewConsts, localRefsIndex);\n  if (getBindingsEnabled()) {\n    resolveDirectives(tView, lView, tNode, localRefs, findDirectiveDefMatches);\n  }\n\n  // Merge the template attrs last so that they have the highest priority.\n  tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);\n\n  if (tView.queries !== null) {\n    tView.queries.elementStart(tView, tNode);\n  }\n\n  return tNode;\n}\n\n/**\n * Creates a logical container for other nodes (<ng-container>) backed by a comment node in the DOM.\n * The instruction must later be followed by `elementContainerEnd()` call.\n *\n * @param index Index of the element in the LView array\n * @param attrsIndex Index of the container attributes in the `consts` array.\n * @param localRefsIndex Index of the container's local references in the `consts` array.\n * @returns This function returns itself so that it may be chained.\n *\n * Even if this instruction accepts a set of attributes no actual attribute values are propagated to\n * the DOM (as a comment node can't have attributes). Attributes are here only for directive\n * matching purposes and setting initial inputs of directives.\n *\n * @codeGenApi\n */\nexport function ɵɵelementContainerStart(\n  index: number,\n  attrsIndex?: number | null,\n  localRefsIndex?: number,\n): typeof ɵɵelementContainerStart {\n  const lView = getLView();\n  const tView = getTView();\n  const adjustedIndex = index + HEADER_OFFSET;\n\n  ngDevMode && assertIndexInRange(lView, adjustedIndex);\n  ngDevMode &&\n    assertEqual(\n      getBindingIndex(),\n      tView.bindingStartIndex,\n      'element containers should be created before any bindings',\n    );\n\n  const tNode = tView.firstCreatePass\n    ? elementContainerStartFirstCreatePass(adjustedIndex, tView, lView, attrsIndex, localRefsIndex)\n    : (tView.data[adjustedIndex] as TElementContainerNode);\n  setCurrentTNode(tNode, true);\n\n  const comment = _locateOrCreateElementContainerNode(tView, lView, tNode, index);\n  lView[adjustedIndex] = comment;\n\n  if (wasLastNodeCreated()) {\n    appendChild(tView, lView, comment, tNode);\n  }\n  attachPatchData(comment, lView);\n\n  if (isDirectiveHost(tNode)) {\n    createDirectivesInstances(tView, lView, tNode);\n    executeContentQueries(tView, tNode, lView);\n  }\n\n  if (localRefsIndex != null) {\n    saveResolvedLocalsInData(lView, tNode);\n  }\n\n  return ɵɵelementContainerStart;\n}\n\n/**\n * Mark the end of the <ng-container>.\n * @returns This function returns itself so that it may be chained.\n *\n * @codeGenApi\n */\nexport function ɵɵelementContainerEnd(): typeof ɵɵelementContainerEnd {\n  let currentTNode = getCurrentTNode()!;\n  const tView = getTView();\n  if (isCurrentTNodeParent()) {\n    setCurrentTNodeAsNotParent();\n  } else {\n    ngDevMode && assertHasParent(currentTNode);\n    currentTNode = currentTNode.parent!;\n    setCurrentTNode(currentTNode, false);\n  }\n\n  ngDevMode && assertTNodeType(currentTNode, TNodeType.ElementContainer);\n\n  if (tView.firstCreatePass) {\n    registerPostOrderHooks(tView, currentTNode);\n    if (isContentQueryHost(currentTNode)) {\n      tView.queries!.elementEnd(currentTNode);\n    }\n  }\n  return ɵɵelementContainerEnd;\n}\n\n/**\n * Creates an empty logical container using {@link elementContainerStart}\n * and {@link elementContainerEnd}\n *\n * @param index Index of the element in the LView array\n * @param attrsIndex Index of the container attributes in the `consts` array.\n * @param localRefsIndex Index of the container's local references in the `consts` array.\n * @returns This function returns itself so that it may be chained.\n *\n * @codeGenApi\n */\nexport function ɵɵelementContainer(\n  index: number,\n  attrsIndex?: number | null,\n  localRefsIndex?: number,\n): typeof ɵɵelementContainer {\n  ɵɵelementContainerStart(index, attrsIndex, localRefsIndex);\n  ɵɵelementContainerEnd();\n  return ɵɵelementContainer;\n}\n\nlet _locateOrCreateElementContainerNode: typeof locateOrCreateElementContainerNode = (\n  tView: TView,\n  lView: LView,\n  tNode: TNode,\n  index: number,\n) => {\n  lastNodeWasCreated(true);\n  return createCommentNode(lView[RENDERER], ngDevMode ? 'ng-container' : '');\n};\n\n/**\n * Enables hydration code path (to lookup existing elements in DOM)\n * in addition to the regular creation mode of comment nodes that\n * represent <ng-container>'s anchor.\n */\nfunction locateOrCreateElementContainerNode(\n  tView: TView,\n  lView: LView,\n  tNode: TNode,\n  index: number,\n): RComment {\n  let comment: RComment;\n  const hydrationInfo = lView[HYDRATION];\n  const isNodeCreationMode =\n    !hydrationInfo ||\n    isInSkipHydrationBlock() ||\n    isDisconnectedNode(hydrationInfo, index) ||\n    isDetachedByI18n(tNode);\n\n  lastNodeWasCreated(isNodeCreationMode);\n\n  // Regular creation mode.\n  if (isNodeCreationMode) {\n    return createCommentNode(lView[RENDERER], ngDevMode ? 'ng-container' : '');\n  }\n\n  // Hydration mode, looking up existing elements in DOM.\n  const currentRNode = locateNextRNode(hydrationInfo, tView, lView, tNode)!;\n  ngDevMode && validateNodeExists(currentRNode, lView, tNode);\n\n  const ngContainerSize = getNgContainerSize(hydrationInfo, index) as number;\n  ngDevMode &&\n    assertNumber(\n      ngContainerSize,\n      'Unexpected state: hydrating an <ng-container>, ' + 'but no hydration info is available.',\n    );\n\n  setSegmentHead(hydrationInfo, index, currentRNode);\n  comment = siblingAfter<RComment>(ngContainerSize, currentRNode)!;\n\n  if (ngDevMode) {\n    validateMatchingNode(comment, Node.COMMENT_NODE, null, lView, tNode);\n    markRNodeAsClaimedByHydration(comment);\n  }\n\n  return comment;\n}\n\nexport function enableLocateOrCreateElementContainerNodeImpl() {\n  _locateOrCreateElementContainerNode = locateOrCreateElementContainerNode;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {OpaqueViewState} from '../interfaces/view';\nimport {getLView} from '../state';\n\n/**\n * Returns the current OpaqueViewState instance.\n *\n * Used in conjunction with the restoreView() instruction to save a snapshot\n * of the current view and restore it when listeners are invoked. This allows\n * walking the declaration view tree in listeners to get vars from parent views.\n *\n * @codeGenApi\n */\nexport function ɵɵgetCurrentView(): OpaqueViewState {\n  return getLView() as any as OpaqueViewState;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {bindingUpdated} from '../bindings';\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {RENDERER} from '../interfaces/view';\nimport {\n  getCurrentDirectiveDef,\n  getLView,\n  getSelectedTNode,\n  getTView,\n  nextBindingIndex,\n} from '../state';\nimport {NO_CHANGE} from '../tokens';\n\nimport {\n  elementPropertyInternal,\n  loadComponentRenderer,\n  storePropertyBindingMetadata,\n} from './shared';\n\n/**\n * Update a property on a host element. Only applies to native node properties, not inputs.\n *\n * Operates on the element selected by index via the {@link select} instruction.\n *\n * @param propName Name of property. Because it is going to DOM, this is not subject to\n *        renaming as part of minification.\n * @param value New value to write.\n * @param sanitizer An optional function used to sanitize the value.\n * @returns This function returns itself so that it may be chained\n * (e.g. `property('name', ctx.name)('title', ctx.title)`)\n *\n * @codeGenApi\n */\nexport function ɵɵhostProperty<T>(\n  propName: string,\n  value: T,\n  sanitizer?: SanitizerFn | null,\n): typeof ɵɵhostProperty {\n  const lView = getLView();\n  const bindingIndex = nextBindingIndex();\n  if (bindingUpdated(lView, bindingIndex, value)) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(tView, tNode, lView, propName, value, lView[RENDERER], sanitizer, true);\n    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);\n  }\n  return ɵɵhostProperty;\n}\n\n/**\n * Updates a synthetic host binding (e.g. `[@foo]`) on a component or directive.\n *\n * This instruction is for compatibility purposes and is designed to ensure that a\n * synthetic host binding (e.g. `@HostBinding('@foo')`) properly gets rendered in\n * the component's renderer. Normally all host bindings are evaluated with the parent\n * component's renderer, but, in the case of animation @triggers, they need to be\n * evaluated with the sub component's renderer (because that's where the animation\n * triggers are defined).\n *\n * Do not use this instruction as a replacement for `elementProperty`. This instruction\n * only exists to ensure compatibility with the ViewEngine's host binding behavior.\n *\n * @param index The index of the element to update in the data array\n * @param propName Name of property. Because it is going to DOM, this is not subject to\n *        renaming as part of minification.\n * @param value New value to write.\n * @param sanitizer An optional function used to sanitize the value.\n *\n * @codeGenApi\n */\nexport function ɵɵsyntheticHostProperty<T>(\n  propName: string,\n  value: T | NO_CHANGE,\n  sanitizer?: SanitizerFn | null,\n): typeof ɵɵsyntheticHostProperty {\n  const lView = getLView();\n  const bindingIndex = nextBindingIndex();\n  if (bindingUpdated(lView, bindingIndex, value)) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    const currentDef = getCurrentDirectiveDef(tView.data);\n    const renderer = loadComponentRenderer(currentDef, tNode, lView);\n    elementPropertyInternal(tView, tNode, lView, propName, value, renderer, sanitizer, true);\n    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);\n  }\n  return ɵɵsyntheticHostProperty;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// THIS CODE IS GENERATED - DO NOT MODIFY.\nconst u = undefined;\n\nfunction plural(val: number): number {\nconst n = val, i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\\.?/, '').length;\n\nif (i === 1 && v === 0)\n    return 1;\nreturn 5;\n}\n\nexport default [\"en\",[[\"a\",\"p\"],[\"AM\",\"PM\"],u],[[\"AM\",\"PM\"],u,u],[[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"]],u,[[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]],u,[[\"B\",\"A\"],[\"BC\",\"AD\"],[\"Before Christ\",\"Anno Domini\"]],0,[6,0],[\"M/d/yy\",\"MMM d, y\",\"MMMM d, y\",\"EEEE, MMMM d, y\"],[\"h:mm a\",\"h:mm:ss a\",\"h:mm:ss a z\",\"h:mm:ss a zzzz\"],[\"{1}, {0}\",u,\"{1} 'at' {0}\",u],[\".\",\",\",\";\",\"%\",\"+\",\"-\",\"E\",\"×\",\"‰\",\"∞\",\"NaN\",\":\"],[\"#,##0.###\",\"#,##0%\",\"¤#,##0.00\",\"#E0\"],\"USD\",\"$\",\"US Dollar\",{},\"ltr\", plural];\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {global} from '../util/global';\n\nimport localeEn from './locale_en';\n\n/**\n * This const is used to store the locale data registered with `registerLocaleData`\n */\nlet LOCALE_DATA: {[localeId: string]: any} = {};\n\n/**\n * Register locale data to be used internally by Angular. See the\n * [\"I18n guide\"](guide/i18n/format-data-locale) to know how to import additional locale\n * data.\n *\n * The signature `registerLocaleData(data: any, extraData?: any)` is deprecated since v5.1\n */\nexport function registerLocaleData(data: any, localeId?: string | any, extraData?: any): void {\n  if (typeof localeId !== 'string') {\n    extraData = localeId;\n    localeId = data[LocaleDataIndex.LocaleId];\n  }\n\n  localeId = localeId.toLowerCase().replace(/_/g, '-');\n\n  LOCALE_DATA[localeId] = data;\n\n  if (extraData) {\n    LOCALE_DATA[localeId][LocaleDataIndex.ExtraData] = extraData;\n  }\n}\n\n/**\n * Finds the locale data for a given locale.\n *\n * @param locale The locale code.\n * @returns The locale data.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n */\nexport function findLocaleData(locale: string): any {\n  const normalizedLocale = normalizeLocale(locale);\n\n  let match = getLocaleData(normalizedLocale);\n  if (match) {\n    return match;\n  }\n\n  // let's try to find a parent locale\n  const parentLocale = normalizedLocale.split('-')[0];\n  match = getLocaleData(parentLocale);\n  if (match) {\n    return match;\n  }\n\n  if (parentLocale === 'en') {\n    return localeEn;\n  }\n\n  throw new RuntimeError(\n    RuntimeErrorCode.MISSING_LOCALE_DATA,\n    ngDevMode && `Missing locale data for the locale \"${locale}\".`,\n  );\n}\n\n/**\n * Retrieves the default currency code for the given locale.\n *\n * The default is defined as the first currency which is still in use.\n *\n * @param locale The code of the locale whose currency code we want.\n * @returns The code of the default currency for the given locale.\n *\n */\nexport function getLocaleCurrencyCode(locale: string): string | null {\n  const data = findLocaleData(locale);\n  return data[LocaleDataIndex.CurrencyCode] || null;\n}\n\n/**\n * Retrieves the plural function used by ICU expressions to determine the plural case to use\n * for a given locale.\n * @param locale A locale code for the locale format rules to use.\n * @returns The plural function for the locale.\n * @see {@link NgPlural}\n * @see [Internationalization (i18n) Guide](guide/i18n)\n */\nexport function getLocalePluralCase(locale: string): (value: number) => number {\n  const data = findLocaleData(locale);\n  return data[LocaleDataIndex.PluralCase];\n}\n\n/**\n * Helper function to get the given `normalizedLocale` from `LOCALE_DATA`\n * or from the global `ng.common.locale`.\n */\nexport function getLocaleData(normalizedLocale: string): any {\n  if (!(normalizedLocale in LOCALE_DATA)) {\n    LOCALE_DATA[normalizedLocale] =\n      global.ng &&\n      global.ng.common &&\n      global.ng.common.locales &&\n      global.ng.common.locales[normalizedLocale];\n  }\n  return LOCALE_DATA[normalizedLocale];\n}\n\n/**\n * Helper function to remove all the locale data from `LOCALE_DATA`.\n */\nexport function unregisterAllLocaleData() {\n  LOCALE_DATA = {};\n}\n\n/**\n * Index of each type of locale data from the locale data array\n */\nexport enum LocaleDataIndex {\n  LocaleId = 0,\n  DayPeriodsFormat,\n  DayPeriodsStandalone,\n  DaysFormat,\n  DaysStandalone,\n  MonthsFormat,\n  MonthsStandalone,\n  Eras,\n  FirstDayOfWeek,\n  WeekendRange,\n  DateFormat,\n  TimeFormat,\n  DateTimeFormat,\n  NumberSymbols,\n  NumberFormats,\n  CurrencyCode,\n  CurrencySymbol,\n  CurrencyName,\n  Currencies,\n  Directionality,\n  PluralCase,\n  ExtraData,\n}\n\n/**\n * Index of each type of locale data from the extra locale data array\n */\nexport const enum ExtraLocaleDataIndex {\n  ExtraDayPeriodFormats = 0,\n  ExtraDayPeriodStandalone,\n  ExtraDayPeriodsRules,\n}\n\n/**\n * Index of each value in currency data (used to describe CURRENCIES_EN in currencies.ts)\n */\nexport const enum CurrencyIndex {\n  Symbol = 0,\n  SymbolNarrow,\n  NbOfDigits,\n}\n\n/**\n * Returns the canonical form of a locale name - lowercase with `_` replaced with `-`.\n */\nfunction normalizeLocale(locale: string): string {\n  return locale.toLowerCase().replace(/_/g, '-');\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {getLocalePluralCase} from './locale_data_api';\n\nconst pluralMapping = ['zero', 'one', 'two', 'few', 'many'];\n\n/**\n * Returns the plural case based on the locale\n */\nexport function getPluralCase(value: string, locale: string): string {\n  const plural = getLocalePluralCase(locale)(parseInt(value, 10));\n  const result = pluralMapping[plural];\n  return result !== undefined ? result : 'other';\n}\n\n/**\n * The locale id that the application is using by default (for translations and ICU expressions).\n */\nexport const DEFAULT_LOCALE_ID = 'en-US';\n\n/**\n * USD currency code that the application uses by default for CurrencyPipe when no\n * DEFAULT_CURRENCY_CODE is provided.\n */\nexport const USD_CURRENCY_CODE = 'USD';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {SanitizerFn} from './sanitization';\n\n/**\n * Stores a list of nodes which need to be removed.\n *\n * Numbers are indexes into the `LView`\n * - index > 0: `removeRNode(lView[0])`\n * - index < 0: `removeICU(~lView[0])`\n */\nexport interface I18nRemoveOpCodes extends Array<number> {\n  __brand__: 'I18nRemoveOpCodes';\n}\n\n/**\n * `I18nMutateOpCode` defines OpCodes for `I18nMutateOpCodes` array.\n *\n * OpCodes are efficient operations which can be applied to the DOM to update it. (For example to\n * update to a new ICU case requires that we clean up previous elements and create new ones.)\n *\n * OpCodes contain three parts:\n *  1) Parent node index offset. (p)\n *  2) Reference node index offset. (r)\n *  3) The instruction to execute. (i)\n *\n * pppp pppp pppp pppp rrrr rrrr rrrr riii\n * 3322 2222 2222 1111 1111 1110 0000 0000\n * 1098 7654 3210 9876 5432 1098 7654 3210\n *\n * ```ts\n * var parent = lView[opCode >>> SHIFT_PARENT];\n * var refNode = lView[((opCode & MASK_REF) >>> SHIFT_REF)];\n * var instruction = opCode & MASK_OPCODE;\n * ```\n *\n * See: `I18nCreateOpCodes` for example of usage.\n */\nexport const enum IcuCreateOpCode {\n  /**\n   * Stores shift amount for bits 17-3 that contain reference index.\n   */\n  SHIFT_REF = 1,\n  /**\n   * Stores shift amount for bits 31-17 that contain parent index.\n   */\n  SHIFT_PARENT = 17,\n  /**\n   * Mask for OpCode\n   */\n  MASK_INSTRUCTION = 0b1,\n\n  /**\n   * Mask for the Reference node (bits 16-3)\n   */\n  MASK_REF = 0b11111111111111110,\n  //           11111110000000000\n  //           65432109876543210\n\n  /**\n   * Instruction to append the current node to `PARENT`.\n   */\n  AppendChild = 0b0,\n\n  /**\n   * Instruction to set the attribute of a node.\n   */\n  Attr = 0b1,\n}\n\n/**\n * Array storing OpCode for dynamically creating `i18n` blocks.\n *\n * Example:\n * ```ts\n * <I18nCreateOpCode>[\n *   // For adding text nodes\n *   // ---------------------\n *   // Equivalent to:\n *   //   lView[1].appendChild(lView[0] = document.createTextNode('xyz'));\n *   'xyz', 0, 1 << SHIFT_PARENT | 0 << SHIFT_REF | AppendChild,\n *\n *   // For adding element nodes\n *   // ---------------------\n *   // Equivalent to:\n *   //   lView[1].appendChild(lView[0] = document.createElement('div'));\n *   ELEMENT_MARKER, 'div', 0, 1 << SHIFT_PARENT | 0 << SHIFT_REF | AppendChild,\n *\n *   // For adding comment nodes\n *   // ---------------------\n *   // Equivalent to:\n *   //   lView[1].appendChild(lView[0] = document.createComment(''));\n *   ICU_MARKER, '', 0, 1 << SHIFT_PARENT | 0 << SHIFT_REF | AppendChild,\n *\n *   // For moving existing nodes to a different location\n *   // --------------------------------------------------\n *   // Equivalent to:\n *   //   const node = lView[1];\n *   //   lView[2].appendChild(node);\n *   1 << SHIFT_REF | Select, 2 << SHIFT_PARENT | 0 << SHIFT_REF | AppendChild,\n *\n *   // For removing existing nodes\n *   // --------------------------------------------------\n *   //   const node = lView[1];\n *   //   removeChild(tView.data(1), node, lView);\n *   1 << SHIFT_REF | Remove,\n *\n *   // For writing attributes\n *   // --------------------------------------------------\n *   //   const node = lView[1];\n *   //   node.setAttribute('attr', 'value');\n *   1 << SHIFT_REF | Attr, 'attr', 'value'\n * ];\n * ```\n */\nexport interface IcuCreateOpCodes\n  extends Array<number | string | ELEMENT_MARKER | ICU_MARKER | null>,\n    I18nDebug {\n  __brand__: 'I18nCreateOpCodes';\n}\n\nexport const enum I18nUpdateOpCode {\n  /**\n   * Stores shift amount for bits 17-2 that contain reference index.\n   */\n  SHIFT_REF = 2,\n  /**\n   * Mask for OpCode\n   */\n  MASK_OPCODE = 0b11,\n\n  /**\n   * Instruction to update a text node.\n   */\n  Text = 0b00,\n  /**\n   * Instruction to update a attribute of a node.\n   */\n  Attr = 0b01,\n  /**\n   * Instruction to switch the current ICU case.\n   */\n  IcuSwitch = 0b10,\n  /**\n   * Instruction to update the current ICU case.\n   */\n  IcuUpdate = 0b11,\n}\n\n/**\n * Marks that the next string is an element name.\n *\n * See `I18nMutateOpCodes` documentation.\n */\nexport const ELEMENT_MARKER: ELEMENT_MARKER = {\n  marker: 'element',\n};\nexport interface ELEMENT_MARKER {\n  marker: 'element';\n}\n\n/**\n * Marks that the next string is comment text need for ICU.\n *\n * See `I18nMutateOpCodes` documentation.\n */\nexport const ICU_MARKER: ICU_MARKER = {\n  marker: 'ICU',\n};\n\nexport interface ICU_MARKER {\n  marker: 'ICU';\n}\n\nexport interface I18nDebug {\n  /**\n   * Human readable representation of the OpCode arrays.\n   *\n   * NOTE: This property only exists if `ngDevMode` is set to `true` and it is not present in\n   * production. Its presence is purely to help debug issue in development, and should not be relied\n   * on in production application.\n   */\n  debug?: string[];\n}\n\n/**\n * Array storing OpCode for dynamically creating `i18n` translation DOM elements.\n *\n * This array creates a sequence of `Text` and `Comment` (as ICU anchor) DOM elements. It consists\n * of a pair of `number` and `string` pairs which encode the operations for the creation of the\n * translated block.\n *\n * The number is shifted and encoded according to `I18nCreateOpCode`\n *\n * Pseudocode:\n * ```ts\n * const i18nCreateOpCodes = [\n *   10 << I18nCreateOpCode.SHIFT, \"Text Node add to DOM\",\n *   11 << I18nCreateOpCode.SHIFT | I18nCreateOpCode.COMMENT, \"Comment Node add to DOM\",\n *   12 << I18nCreateOpCode.SHIFT | I18nCreateOpCode.APPEND_LATER, \"Text Node added later\"\n * ];\n *\n * for(var i=0; i<i18nCreateOpCodes.length; i++) {\n *   const opcode = i18NCreateOpCodes[i++];\n *   const index = opcode >> I18nCreateOpCode.SHIFT;\n *   const text = i18NCreateOpCodes[i];\n *   let node: Text|Comment;\n *   if (opcode & I18nCreateOpCode.COMMENT === I18nCreateOpCode.COMMENT) {\n *     node = lView[~index] = document.createComment(text);\n *   } else {\n *     node = lView[index] = document.createText(text);\n *   }\n *   if (opcode & I18nCreateOpCode.APPEND_EAGERLY !== I18nCreateOpCode.APPEND_EAGERLY) {\n *     parentNode.appendChild(node);\n *   }\n * }\n * ```\n */\nexport interface I18nCreateOpCodes extends Array<number | string>, I18nDebug {\n  __brand__: 'I18nCreateOpCodes';\n}\n\n/**\n * See `I18nCreateOpCodes`\n */\nexport enum I18nCreateOpCode {\n  /**\n   * Number of bits to shift index so that it can be combined with the `APPEND_EAGERLY` and\n   * `COMMENT`.\n   */\n  SHIFT = 2,\n\n  /**\n   * Should the node be appended to parent immediately after creation.\n   */\n  APPEND_EAGERLY = 0b01,\n\n  /**\n   * If set the node should be comment (rather than a text) node.\n   */\n  COMMENT = 0b10,\n}\n\n/**\n * Stores DOM operations which need to be applied to update DOM render tree due to changes in\n * expressions.\n *\n * The basic idea is that `i18nExp` OpCodes capture expression changes and update a change\n * mask bit. (Bit 1 for expression 1, bit 2 for expression 2 etc..., bit 32 for expression 32 and\n * higher.) The OpCodes then compare its own change mask against the expression change mask to\n * determine if the OpCodes should execute.\n *\n * NOTE: 32nd bit is special as it says 32nd or higher. This way if we have more than 32 bindings\n * the code still works, but with lower efficiency. (it is unlikely that a translation would have\n * more than 32 bindings.)\n *\n * These OpCodes can be used by both the i18n block as well as ICU sub-block.\n *\n * ## Example\n *\n * Assume\n * ```ts\n *   if (rf & RenderFlags.Update) {\n *    i18nExp(ctx.exp1); // If changed set mask bit 1\n *    i18nExp(ctx.exp2); // If changed set mask bit 2\n *    i18nExp(ctx.exp3); // If changed set mask bit 3\n *    i18nExp(ctx.exp4); // If changed set mask bit 4\n *    i18nApply(0);            // Apply all changes by executing the OpCodes.\n *  }\n * ```\n * We can assume that each call to `i18nExp` sets an internal `changeMask` bit depending on the\n * index of `i18nExp`.\n *\n * ### OpCodes\n * ```ts\n * <I18nUpdateOpCodes>[\n *   // The following OpCodes represent: `<div i18n-title=\"pre{{exp1}}in{{exp2}}post\">`\n *   // If `changeMask & 0b11`\n *   //        has changed then execute update OpCodes.\n *   //        has NOT changed then skip `8` values and start processing next OpCodes.\n *   0b11, 8,\n *   // Concatenate `newValue = 'pre'+lView[bindIndex-4]+'in'+lView[bindIndex-3]+'post';`.\n *   'pre', -4, 'in', -3, 'post',\n *   // Update attribute: `elementAttribute(1, 'title', sanitizerFn(newValue));`\n *   1 << SHIFT_REF | Attr, 'title', sanitizerFn,\n *\n *   // The following OpCodes represent: `<div i18n>Hello {{exp3}}!\">`\n *   // If `changeMask & 0b100`\n *   //        has changed then execute update OpCodes.\n *   //        has NOT changed then skip `4` values and start processing next OpCodes.\n *   0b100, 4,\n *   // Concatenate `newValue = 'Hello ' + lView[bindIndex -2] + '!';`.\n *   'Hello ', -2, '!',\n *   // Update text: `lView[1].textContent = newValue;`\n *   1 << SHIFT_REF | Text,\n *\n *   // The following OpCodes represent: `<div i18n>{exp4, plural, ... }\">`\n *   // If `changeMask & 0b1000`\n *   //        has changed then execute update OpCodes.\n *   //        has NOT changed then skip `2` values and start processing next OpCodes.\n *   0b1000, 2,\n *   // Concatenate `newValue = lView[bindIndex -1];`.\n *   -1,\n *   // Switch ICU: `icuSwitchCase(lView[1], 0, newValue);`\n *   0 << SHIFT_ICU | 1 << SHIFT_REF | IcuSwitch,\n *\n *   // Note `changeMask & -1` is always true, so the IcuUpdate will always execute.\n *   -1, 1,\n *   // Update ICU: `icuUpdateCase(lView[1], 0);`\n *   0 << SHIFT_ICU | 1 << SHIFT_REF | IcuUpdate,\n *\n * ];\n * ```\n *\n */\nexport interface I18nUpdateOpCodes extends Array<string | number | SanitizerFn | null>, I18nDebug {\n  __brand__: 'I18nUpdateOpCodes';\n}\n\n/**\n * Store information for the i18n translation block.\n */\nexport interface TI18n {\n  /**\n   * A set of OpCodes which will create the Text Nodes and ICU anchors for the translation blocks.\n   *\n   * NOTE: The ICU anchors are filled in with ICU Update OpCode.\n   */\n  create: I18nCreateOpCodes;\n\n  /**\n   * A set of OpCodes which will be executed on each change detection to determine if any changes to\n   * DOM are required.\n   */\n  update: I18nUpdateOpCodes;\n\n  /**\n   * An AST representing the translated message. This is used for hydration (and serialization),\n   * while the Update and Create OpCodes are used at runtime.\n   */\n  ast: Array<I18nNode>;\n\n  /**\n   * Index of a parent TNode, which represents a host node for this i18n block.\n   */\n  parentTNodeIndex: number;\n}\n\n/**\n * Defines the ICU type of `select` or `plural`\n */\nexport const enum IcuType {\n  select = 0,\n  plural = 1,\n}\n\nexport interface TIcu {\n  /**\n   * Defines the ICU type of `select` or `plural`\n   */\n  type: IcuType;\n\n  /**\n   * Index in `LView` where the anchor node is stored. `<!-- ICU 0:0 -->`\n   */\n  anchorIdx: number;\n\n  /**\n   * Currently selected ICU case pointer.\n   *\n   * `lView[currentCaseLViewIndex]` stores the currently selected case. This is needed to know how\n   * to clean up the current case when transitioning no the new case.\n   *\n   * If the value stored is:\n   * `null`: No current case selected.\n   *   `<0`: A flag which means that the ICU just switched and that `icuUpdate` must be executed\n   *         regardless of the `mask`. (After the execution the flag is cleared)\n   *   `>=0` A currently selected case index.\n   */\n  currentCaseLViewIndex: number;\n\n  /**\n   * A list of case values which the current ICU will try to match.\n   *\n   * The last value is `other`\n   */\n  cases: any[];\n\n  /**\n   * A set of OpCodes to apply in order to build up the DOM render tree for the ICU\n   */\n  create: IcuCreateOpCodes[];\n\n  /**\n   * A set of OpCodes to apply in order to destroy the DOM render tree for the ICU.\n   */\n  remove: I18nRemoveOpCodes[];\n\n  /**\n   * A set of OpCodes to apply in order to update the DOM render tree for the ICU bindings.\n   */\n  update: I18nUpdateOpCodes[];\n}\n\n/**\n * Parsed ICU expression\n */\nexport interface IcuExpression {\n  type: IcuType;\n  mainBinding: number;\n  cases: string[];\n  values: (string | IcuExpression)[][];\n}\n\n// A parsed I18n AST Node\nexport type I18nNode = I18nTextNode | I18nElementNode | I18nICUNode | I18nPlaceholderNode;\n\n/**\n * Represents a block of text in a translation, such as `Hello, {{ name }}!`.\n */\nexport interface I18nTextNode {\n  /** The AST node kind */\n  kind: I18nNodeKind.TEXT;\n\n  /** The LView index */\n  index: number;\n}\n\n/**\n * Represents a simple DOM element in a translation, such as `<div>...</div>`\n */\nexport interface I18nElementNode {\n  /** The AST node kind */\n  kind: I18nNodeKind.ELEMENT;\n\n  /** The LView index */\n  index: number;\n\n  /** The child nodes */\n  children: Array<I18nNode>;\n}\n\n/**\n * Represents an ICU in a translation.\n */\nexport interface I18nICUNode {\n  /** The AST node kind */\n  kind: I18nNodeKind.ICU;\n\n  /** The LView index */\n  index: number;\n\n  /** The branching cases */\n  cases: Array<Array<I18nNode>>;\n\n  /** The LView index that stores the active case */\n  currentCaseLViewIndex: number;\n}\n\n/**\n * Represents special content that is embedded into the translation. This can\n * either be a special built-in element, such as <ng-container> and <ng-content>,\n * or it can be a sub-template, for example, from a structural directive.\n */\nexport interface I18nPlaceholderNode {\n  /** The AST node kind */\n  kind: I18nNodeKind.PLACEHOLDER;\n\n  /** The LView index */\n  index: number;\n\n  /** The child nodes */\n  children: Array<I18nNode>;\n\n  /** The placeholder type */\n  type: I18nPlaceholderType;\n}\n\nexport const enum I18nPlaceholderType {\n  ELEMENT,\n  SUBTEMPLATE,\n}\n\nexport const enum I18nNodeKind {\n  TEXT,\n  ELEMENT,\n  PLACEHOLDER,\n  ICU,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DEFAULT_LOCALE_ID} from '../../i18n/localization';\nimport {assertDefined} from '../../util/assert';\n\n/**\n * The locale id that the application is currently using (for translations and ICU expressions).\n * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine\n * but is now defined as a global value.\n */\nlet LOCALE_ID = DEFAULT_LOCALE_ID;\n\n/**\n * Sets the locale id that will be used for translations and ICU expressions.\n * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine\n * but is now defined as a global value.\n *\n * @param localeId\n */\nexport function setLocaleId(localeId: string) {\n  ngDevMode && assertDefined(localeId, `Expected localeId to be defined`);\n  if (typeof localeId === 'string') {\n    LOCALE_ID = localeId.toLowerCase().replace(/_/g, '-');\n  }\n}\n\n/**\n * Gets the locale id that will be used for translations and ICU expressions.\n * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine\n * but is now defined as a global value.\n */\nexport function getLocaleId(): string {\n  return LOCALE_ID;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {claimDehydratedIcuCase, isI18nHydrationSupportEnabled} from '../../hydration/i18n';\nimport {locateI18nRNodeByIndex} from '../../hydration/node_lookup_utils';\nimport {isDisconnectedNode, markRNodeAsClaimedByHydration} from '../../hydration/utils';\nimport {getPluralCase} from '../../i18n/localization';\nimport {\n  assertDefined,\n  assertDomNode,\n  assertEqual,\n  assertGreaterThan,\n  assertIndexInRange,\n  throwError,\n} from '../../util/assert';\nimport {assertIndexInExpandoRange, assertTIcu} from '../assert';\nimport {attachPatchData} from '../context_discovery';\nimport {elementPropertyInternal, setElementAttribute} from '../instructions/shared';\nimport {\n  ELEMENT_MARKER,\n  I18nCreateOpCode,\n  I18nCreateOpCodes,\n  I18nUpdateOpCode,\n  I18nUpdateOpCodes,\n  ICU_MARKER,\n  IcuCreateOpCode,\n  IcuCreateOpCodes,\n  IcuType,\n  TI18n,\n  TIcu,\n} from '../interfaces/i18n';\nimport {TNode} from '../interfaces/node';\nimport {RElement, RNode, RText} from '../interfaces/renderer_dom';\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view';\nimport {\n  createCommentNode,\n  createElementNode,\n  createTextNode,\n  nativeInsertBefore,\n  nativeRemoveNode,\n  updateTextNode,\n} from '../dom_node_manipulation';\nimport {\n  getBindingIndex,\n  isInSkipHydrationBlock,\n  lastNodeWasCreated,\n  wasLastNodeCreated,\n} from '../state';\nimport {renderStringify} from '../util/stringify_utils';\nimport {getNativeByIndex, unwrapRNode} from '../util/view_utils';\n\nimport {getLocaleId} from './i18n_locale_id';\nimport {\n  getCurrentICUCaseIndex,\n  getParentFromIcuCreateOpCode,\n  getRefFromIcuCreateOpCode,\n  getTIcu,\n} from './i18n_util';\n\n/**\n * Keep track of which input bindings in `ɵɵi18nExp` have changed.\n *\n * This is used to efficiently update expressions in i18n only when the corresponding input has\n * changed.\n *\n * 1) Each bit represents which of the `ɵɵi18nExp` has changed.\n * 2) There are 32 bits allowed in JS.\n * 3) Bit 32 is special as it is shared for all changes past 32. (In other words if you have more\n * than 32 `ɵɵi18nExp` then all changes past 32nd `ɵɵi18nExp` will be mapped to same bit. This means\n * that we may end up changing more than we need to. But i18n expressions with 32 bindings is rare\n * so in practice it should not be an issue.)\n */\nlet changeMask = 0b0;\n\n/**\n * Keeps track of which bit needs to be updated in `changeMask`\n *\n * This value gets incremented on every call to `ɵɵi18nExp`\n */\nlet changeMaskCounter = 0;\n\n/**\n * Keep track of which input bindings in `ɵɵi18nExp` have changed.\n *\n * `setMaskBit` gets invoked by each call to `ɵɵi18nExp`.\n *\n * @param hasChange did `ɵɵi18nExp` detect a change.\n */\nexport function setMaskBit(hasChange: boolean) {\n  if (hasChange) {\n    changeMask = changeMask | (1 << Math.min(changeMaskCounter, 31));\n  }\n  changeMaskCounter++;\n}\n\nexport function applyI18n(tView: TView, lView: LView, index: number) {\n  if (changeMaskCounter > 0) {\n    ngDevMode && assertDefined(tView, `tView should be defined`);\n    const tI18n = tView.data[index] as TI18n | I18nUpdateOpCodes;\n    // When `index` points to an `ɵɵi18nAttributes` then we have an array otherwise `TI18n`\n    const updateOpCodes: I18nUpdateOpCodes = Array.isArray(tI18n)\n      ? (tI18n as I18nUpdateOpCodes)\n      : (tI18n as TI18n).update;\n    const bindingsStartIndex = getBindingIndex() - changeMaskCounter - 1;\n    applyUpdateOpCodes(tView, lView, updateOpCodes, bindingsStartIndex, changeMask);\n  }\n  // Reset changeMask & maskBit to default for the next update cycle\n  changeMask = 0b0;\n  changeMaskCounter = 0;\n}\n\nfunction createNodeWithoutHydration(\n  lView: LView,\n  textOrName: string,\n  nodeType: typeof Node.COMMENT_NODE | typeof Node.TEXT_NODE | typeof Node.ELEMENT_NODE,\n) {\n  const renderer = lView[RENDERER];\n\n  switch (nodeType) {\n    case Node.COMMENT_NODE:\n      return createCommentNode(renderer, textOrName);\n\n    case Node.TEXT_NODE:\n      return createTextNode(renderer, textOrName);\n\n    case Node.ELEMENT_NODE:\n      return createElementNode(renderer, textOrName, null);\n  }\n}\n\nlet _locateOrCreateNode: typeof locateOrCreateNodeImpl = (lView, index, textOrName, nodeType) => {\n  lastNodeWasCreated(true);\n  return createNodeWithoutHydration(lView, textOrName, nodeType);\n};\n\nfunction locateOrCreateNodeImpl(\n  lView: LView,\n  index: number,\n  textOrName: string,\n  nodeType: typeof Node.COMMENT_NODE | typeof Node.TEXT_NODE | typeof Node.ELEMENT_NODE,\n) {\n  const hydrationInfo = lView[HYDRATION];\n  const noOffsetIndex = index - HEADER_OFFSET;\n  const isNodeCreationMode =\n    !isI18nHydrationSupportEnabled() ||\n    !hydrationInfo ||\n    isInSkipHydrationBlock() ||\n    isDisconnectedNode(hydrationInfo, noOffsetIndex);\n\n  lastNodeWasCreated(isNodeCreationMode);\n  if (isNodeCreationMode) {\n    return createNodeWithoutHydration(lView, textOrName, nodeType);\n  }\n\n  const native = locateI18nRNodeByIndex(hydrationInfo!, noOffsetIndex) as RNode;\n\n  // TODO: Improve error handling\n  //\n  // Other hydration paths use validateMatchingNode() in order to provide\n  // detailed information in development mode about the expected DOM.\n  // However, not every node in an i18n block has a TNode. Instead, we\n  // need to be able to use the AST to generate a similar message.\n  ngDevMode && assertDefined(native, 'expected native element');\n  ngDevMode && assertEqual((native as Node).nodeType, nodeType, 'expected matching nodeType');\n  ngDevMode &&\n    nodeType === Node.ELEMENT_NODE &&\n    assertEqual(\n      (native as HTMLElement).tagName.toLowerCase(),\n      textOrName.toLowerCase(),\n      'expecting matching tagName',\n    );\n  ngDevMode && markRNodeAsClaimedByHydration(native);\n\n  return native;\n}\n\nexport function enableLocateOrCreateI18nNodeImpl() {\n  _locateOrCreateNode = locateOrCreateNodeImpl;\n}\n\n/**\n * Apply `I18nCreateOpCodes` op-codes as stored in `TI18n.create`.\n *\n * Creates text (and comment) nodes which are internationalized.\n *\n * @param lView Current lView\n * @param createOpCodes Set of op-codes to apply\n * @param parentRNode Parent node (so that direct children can be added eagerly) or `null` if it is\n *     a root node.\n * @param insertInFrontOf DOM node that should be used as an anchor.\n */\nexport function applyCreateOpCodes(\n  lView: LView,\n  createOpCodes: I18nCreateOpCodes,\n  parentRNode: RElement | null,\n  insertInFrontOf: RElement | null,\n): void {\n  const renderer = lView[RENDERER];\n  for (let i = 0; i < createOpCodes.length; i++) {\n    const opCode = createOpCodes[i++] as any;\n    const text = createOpCodes[i] as string;\n    const isComment = (opCode & I18nCreateOpCode.COMMENT) === I18nCreateOpCode.COMMENT;\n    const appendNow =\n      (opCode & I18nCreateOpCode.APPEND_EAGERLY) === I18nCreateOpCode.APPEND_EAGERLY;\n    const index = opCode >>> I18nCreateOpCode.SHIFT;\n    let rNode = lView[index];\n    let lastNodeWasCreated = false;\n    if (rNode === null) {\n      // We only create new DOM nodes if they don't already exist: If ICU switches case back to a\n      // case which was already instantiated, no need to create new DOM nodes.\n      rNode = lView[index] = _locateOrCreateNode(\n        lView,\n        index,\n        text,\n        isComment ? Node.COMMENT_NODE : Node.TEXT_NODE,\n      );\n      lastNodeWasCreated = wasLastNodeCreated();\n    }\n    if (appendNow && parentRNode !== null && lastNodeWasCreated) {\n      nativeInsertBefore(renderer, parentRNode, rNode, insertInFrontOf, false);\n    }\n  }\n}\n\n/**\n * Apply `I18nMutateOpCodes` OpCodes.\n *\n * @param tView Current `TView`\n * @param mutableOpCodes Mutable OpCodes to process\n * @param lView Current `LView`\n * @param anchorRNode place where the i18n node should be inserted.\n */\nexport function applyMutableOpCodes(\n  tView: TView,\n  mutableOpCodes: IcuCreateOpCodes,\n  lView: LView,\n  anchorRNode: RNode,\n): void {\n  ngDevMode && assertDomNode(anchorRNode);\n  const renderer = lView[RENDERER];\n  // `rootIdx` represents the node into which all inserts happen.\n  let rootIdx: number | null = null;\n  // `rootRNode` represents the real node into which we insert. This can be different from\n  // `lView[rootIdx]` if we have projection.\n  //  - null we don't have a parent (as can be the case in when we are inserting into a root of\n  //    LView which has no parent.)\n  //  - `RElement` The element representing the root after taking projection into account.\n  let rootRNode!: RElement | null;\n  for (let i = 0; i < mutableOpCodes.length; i++) {\n    const opCode = mutableOpCodes[i];\n    if (typeof opCode == 'string') {\n      const textNodeIndex = mutableOpCodes[++i] as number;\n      if (lView[textNodeIndex] === null) {\n        ngDevMode && ngDevMode.rendererCreateTextNode++;\n        ngDevMode && assertIndexInRange(lView, textNodeIndex);\n        lView[textNodeIndex] = _locateOrCreateNode(lView, textNodeIndex, opCode, Node.TEXT_NODE);\n      }\n    } else if (typeof opCode == 'number') {\n      switch (opCode & IcuCreateOpCode.MASK_INSTRUCTION) {\n        case IcuCreateOpCode.AppendChild:\n          const parentIdx = getParentFromIcuCreateOpCode(opCode);\n          if (rootIdx === null) {\n            // The first operation should save the `rootIdx` because the first operation\n            // must insert into the root. (Only subsequent operations can insert into a dynamic\n            // parent)\n            rootIdx = parentIdx;\n            rootRNode = renderer.parentNode(anchorRNode);\n          }\n          let insertInFrontOf: RNode | null;\n          let parentRNode: RElement | null;\n          if (parentIdx === rootIdx) {\n            insertInFrontOf = anchorRNode;\n            parentRNode = rootRNode;\n          } else {\n            insertInFrontOf = null;\n            parentRNode = unwrapRNode(lView[parentIdx]) as RElement;\n          }\n          // FIXME(misko): Refactor with `processI18nText`\n          if (parentRNode !== null) {\n            // This can happen if the `LView` we are adding to is not attached to a parent `LView`.\n            // In such a case there is no \"root\" we can attach to. This is fine, as we still need to\n            // create the elements. When the `LView` gets later added to a parent these \"root\" nodes\n            // get picked up and added.\n            ngDevMode && assertDomNode(parentRNode);\n            const refIdx = getRefFromIcuCreateOpCode(opCode);\n            ngDevMode && assertGreaterThan(refIdx, HEADER_OFFSET, 'Missing ref');\n            // `unwrapRNode` is not needed here as all of these point to RNodes as part of the i18n\n            // which can't have components.\n            const child = lView[refIdx] as RElement;\n            ngDevMode && assertDomNode(child);\n            nativeInsertBefore(renderer, parentRNode, child, insertInFrontOf, false);\n            const tIcu = getTIcu(tView, refIdx);\n            if (tIcu !== null && typeof tIcu === 'object') {\n              // If we just added a comment node which has ICU then that ICU may have already been\n              // rendered and therefore we need to re-add it here.\n              ngDevMode && assertTIcu(tIcu);\n              const caseIndex = getCurrentICUCaseIndex(tIcu, lView);\n              if (caseIndex !== null) {\n                applyMutableOpCodes(tView, tIcu.create[caseIndex], lView, lView[tIcu.anchorIdx]);\n              }\n            }\n          }\n          break;\n        case IcuCreateOpCode.Attr:\n          const elementNodeIndex = opCode >>> IcuCreateOpCode.SHIFT_REF;\n          const attrName = mutableOpCodes[++i] as string;\n          const attrValue = mutableOpCodes[++i] as string;\n          // This code is used for ICU expressions only, since we don't support\n          // directives/components in ICUs, we don't need to worry about inputs here\n          setElementAttribute(\n            renderer,\n            getNativeByIndex(elementNodeIndex, lView) as RElement,\n            null,\n            null,\n            attrName,\n            attrValue,\n            null,\n          );\n          break;\n        default:\n          if (ngDevMode) {\n            throw new RuntimeError(\n              RuntimeErrorCode.INVALID_I18N_STRUCTURE,\n              `Unable to determine the type of mutate operation for \"${opCode}\"`,\n            );\n          }\n      }\n    } else {\n      switch (opCode) {\n        case ICU_MARKER:\n          const commentValue = mutableOpCodes[++i] as string;\n          const commentNodeIndex = mutableOpCodes[++i] as number;\n          if (lView[commentNodeIndex] === null) {\n            ngDevMode &&\n              assertEqual(\n                typeof commentValue,\n                'string',\n                `Expected \"${commentValue}\" to be a comment node value`,\n              );\n            ngDevMode && ngDevMode.rendererCreateComment++;\n            ngDevMode && assertIndexInExpandoRange(lView, commentNodeIndex);\n            const commentRNode = (lView[commentNodeIndex] = _locateOrCreateNode(\n              lView,\n              commentNodeIndex,\n              commentValue,\n              Node.COMMENT_NODE,\n            ));\n            // FIXME(misko): Attaching patch data is only needed for the root (Also add tests)\n            attachPatchData(commentRNode, lView);\n          }\n          break;\n        case ELEMENT_MARKER:\n          const tagName = mutableOpCodes[++i] as string;\n          const elementNodeIndex = mutableOpCodes[++i] as number;\n          if (lView[elementNodeIndex] === null) {\n            ngDevMode &&\n              assertEqual(\n                typeof tagName,\n                'string',\n                `Expected \"${tagName}\" to be an element node tag name`,\n              );\n\n            ngDevMode && ngDevMode.rendererCreateElement++;\n            ngDevMode && assertIndexInExpandoRange(lView, elementNodeIndex);\n            const elementRNode = (lView[elementNodeIndex] = _locateOrCreateNode(\n              lView,\n              elementNodeIndex,\n              tagName,\n              Node.ELEMENT_NODE,\n            ));\n            // FIXME(misko): Attaching patch data is only needed for the root (Also add tests)\n            attachPatchData(elementRNode, lView);\n          }\n          break;\n        default:\n          ngDevMode &&\n            throwError(`Unable to determine the type of mutate operation for \"${opCode}\"`);\n      }\n    }\n  }\n}\n\n/**\n * Apply `I18nUpdateOpCodes` OpCodes\n *\n * @param tView Current `TView`\n * @param lView Current `LView`\n * @param updateOpCodes OpCodes to process\n * @param bindingsStartIndex Location of the first `ɵɵi18nApply`\n * @param changeMask Each bit corresponds to a `ɵɵi18nExp` (Counting backwards from\n *     `bindingsStartIndex`)\n */\nexport function applyUpdateOpCodes(\n  tView: TView,\n  lView: LView,\n  updateOpCodes: I18nUpdateOpCodes,\n  bindingsStartIndex: number,\n  changeMask: number,\n) {\n  for (let i = 0; i < updateOpCodes.length; i++) {\n    // bit code to check if we should apply the next update\n    const checkBit = updateOpCodes[i] as number;\n    // Number of opCodes to skip until next set of update codes\n    const skipCodes = updateOpCodes[++i] as number;\n    if (checkBit & changeMask) {\n      // The value has been updated since last checked\n      let value = '';\n      for (let j = i + 1; j <= i + skipCodes; j++) {\n        const opCode = updateOpCodes[j];\n        if (typeof opCode == 'string') {\n          value += opCode;\n        } else if (typeof opCode == 'number') {\n          if (opCode < 0) {\n            // Negative opCode represent `i18nExp` values offset.\n            value += renderStringify(lView[bindingsStartIndex - opCode]);\n          } else {\n            const nodeIndex = opCode >>> I18nUpdateOpCode.SHIFT_REF;\n            switch (opCode & I18nUpdateOpCode.MASK_OPCODE) {\n              case I18nUpdateOpCode.Attr:\n                const propName = updateOpCodes[++j] as string;\n                const sanitizeFn = updateOpCodes[++j] as SanitizerFn | null;\n                const tNodeOrTagName = tView.data[nodeIndex] as TNode | string;\n                ngDevMode && assertDefined(tNodeOrTagName, 'Experting TNode or string');\n                if (typeof tNodeOrTagName === 'string') {\n                  // IF we don't have a `TNode`, then we are an element in ICU (as ICU content does\n                  // not have TNode), in which case we know that there are no directives, and hence\n                  // we use attribute setting.\n                  setElementAttribute(\n                    lView[RENDERER],\n                    lView[nodeIndex],\n                    null,\n                    tNodeOrTagName,\n                    propName,\n                    value,\n                    sanitizeFn,\n                  );\n                } else {\n                  elementPropertyInternal(\n                    tView,\n                    tNodeOrTagName,\n                    lView,\n                    propName,\n                    value,\n                    lView[RENDERER],\n                    sanitizeFn,\n                    false,\n                  );\n                }\n                break;\n              case I18nUpdateOpCode.Text:\n                const rText = lView[nodeIndex] as RText | null;\n                rText !== null && updateTextNode(lView[RENDERER], rText, value);\n                break;\n              case I18nUpdateOpCode.IcuSwitch:\n                applyIcuSwitchCase(tView, getTIcu(tView, nodeIndex)!, lView, value);\n                break;\n              case I18nUpdateOpCode.IcuUpdate:\n                applyIcuUpdateCase(tView, getTIcu(tView, nodeIndex)!, bindingsStartIndex, lView);\n                break;\n            }\n          }\n        }\n      }\n    } else {\n      const opCode = updateOpCodes[i + 1] as number;\n      if (opCode > 0 && (opCode & I18nUpdateOpCode.MASK_OPCODE) === I18nUpdateOpCode.IcuUpdate) {\n        // Special case for the `icuUpdateCase`. It could be that the mask did not match, but\n        // we still need to execute `icuUpdateCase` because the case has changed recently due to\n        // previous `icuSwitchCase` instruction. (`icuSwitchCase` and `icuUpdateCase` always come in\n        // pairs.)\n        const nodeIndex = opCode >>> I18nUpdateOpCode.SHIFT_REF;\n        const tIcu = getTIcu(tView, nodeIndex)!;\n        const currentIndex = lView[tIcu.currentCaseLViewIndex];\n        if (currentIndex < 0) {\n          applyIcuUpdateCase(tView, tIcu, bindingsStartIndex, lView);\n        }\n      }\n    }\n    i += skipCodes;\n  }\n}\n\n/**\n * Apply OpCodes associated with updating an existing ICU.\n *\n * @param tView Current `TView`\n * @param tIcu Current `TIcu`\n * @param bindingsStartIndex Location of the first `ɵɵi18nApply`\n * @param lView Current `LView`\n */\nfunction applyIcuUpdateCase(tView: TView, tIcu: TIcu, bindingsStartIndex: number, lView: LView) {\n  ngDevMode && assertIndexInRange(lView, tIcu.currentCaseLViewIndex);\n  let activeCaseIndex = lView[tIcu.currentCaseLViewIndex];\n  if (activeCaseIndex !== null) {\n    let mask = changeMask;\n    if (activeCaseIndex < 0) {\n      // Clear the flag.\n      // Negative number means that the ICU was freshly created and we need to force the update.\n      activeCaseIndex = lView[tIcu.currentCaseLViewIndex] = ~activeCaseIndex;\n      // -1 is same as all bits on, which simulates creation since it marks all bits dirty\n      mask = -1;\n    }\n    applyUpdateOpCodes(tView, lView, tIcu.update[activeCaseIndex], bindingsStartIndex, mask);\n  }\n}\n\n/**\n * Apply OpCodes associated with switching a case on ICU.\n *\n * This involves tearing down existing case and than building up a new case.\n *\n * @param tView Current `TView`\n * @param tIcu Current `TIcu`\n * @param lView Current `LView`\n * @param value Value of the case to update to.\n */\nfunction applyIcuSwitchCase(tView: TView, tIcu: TIcu, lView: LView, value: string) {\n  // Rebuild a new case for this ICU\n  const caseIndex = getCaseIndex(tIcu, value);\n  let activeCaseIndex = getCurrentICUCaseIndex(tIcu, lView);\n  if (activeCaseIndex !== caseIndex) {\n    applyIcuSwitchCaseRemove(tView, tIcu, lView);\n    lView[tIcu.currentCaseLViewIndex] = caseIndex === null ? null : ~caseIndex;\n    if (caseIndex !== null) {\n      // Add the nodes for the new case\n      const anchorRNode = lView[tIcu.anchorIdx];\n      if (anchorRNode) {\n        ngDevMode && assertDomNode(anchorRNode);\n        applyMutableOpCodes(tView, tIcu.create[caseIndex], lView, anchorRNode);\n      }\n      claimDehydratedIcuCase(lView, tIcu.anchorIdx, caseIndex);\n    }\n  }\n}\n\n/**\n * Apply OpCodes associated with tearing ICU case.\n *\n * This involves tearing down existing case and than building up a new case.\n *\n * @param tView Current `TView`\n * @param tIcu Current `TIcu`\n * @param lView Current `LView`\n */\nfunction applyIcuSwitchCaseRemove(tView: TView, tIcu: TIcu, lView: LView) {\n  let activeCaseIndex = getCurrentICUCaseIndex(tIcu, lView);\n  if (activeCaseIndex !== null) {\n    const removeCodes = tIcu.remove[activeCaseIndex];\n    for (let i = 0; i < removeCodes.length; i++) {\n      const nodeOrIcuIndex = removeCodes[i] as number;\n      if (nodeOrIcuIndex > 0) {\n        // Positive numbers are `RNode`s.\n        const rNode = getNativeByIndex(nodeOrIcuIndex, lView);\n        rNode !== null && nativeRemoveNode(lView[RENDERER], rNode);\n      } else {\n        // Negative numbers are ICUs\n        applyIcuSwitchCaseRemove(tView, getTIcu(tView, ~nodeOrIcuIndex)!, lView);\n      }\n    }\n  }\n}\n\n/**\n * Returns the index of the current case of an ICU expression depending on the main binding value\n *\n * @param icuExpression\n * @param bindingValue The value of the main binding used by this ICU expression\n */\nfunction getCaseIndex(icuExpression: TIcu, bindingValue: string): number | null {\n  let index = icuExpression.cases.indexOf(bindingValue);\n  if (index === -1) {\n    switch (icuExpression.type) {\n      case IcuType.plural: {\n        const resolvedCase = getPluralCase(bindingValue, getLocaleId());\n        index = icuExpression.cases.indexOf(resolvedCase);\n        if (index === -1 && resolvedCase !== 'other') {\n          index = icuExpression.cases.indexOf('other');\n        }\n        break;\n      }\n      case IcuType.select: {\n        index = icuExpression.cases.indexOf('other');\n        break;\n      }\n    }\n  }\n  return index === -1 ? null : index;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertNumber, assertString} from '../../util/assert';\nimport {\n  ELEMENT_MARKER,\n  I18nCreateOpCode,\n  I18nCreateOpCodes,\n  I18nRemoveOpCodes,\n  I18nUpdateOpCode,\n  I18nUpdateOpCodes,\n  ICU_MARKER,\n  IcuCreateOpCode,\n  IcuCreateOpCodes,\n} from '../interfaces/i18n';\n\nimport {\n  getInstructionFromIcuCreateOpCode,\n  getParentFromIcuCreateOpCode,\n  getRefFromIcuCreateOpCode,\n} from './i18n_util';\n\n/**\n * Converts `I18nCreateOpCodes` array into a human readable format.\n *\n * This function is attached to the `I18nCreateOpCodes.debug` property if `ngDevMode` is enabled.\n * This function provides a human readable view of the opcodes. This is useful when debugging the\n * application as well as writing more readable tests.\n *\n * @param this `I18nCreateOpCodes` if attached as a method.\n * @param opcodes `I18nCreateOpCodes` if invoked as a function.\n */\nexport function i18nCreateOpCodesToString(\n  this: I18nCreateOpCodes | void,\n  opcodes?: I18nCreateOpCodes,\n): string[] {\n  const createOpCodes: I18nCreateOpCodes = opcodes || (Array.isArray(this) ? this : ([] as any));\n  let lines: string[] = [];\n  for (let i = 0; i < createOpCodes.length; i++) {\n    const opCode = createOpCodes[i++] as any;\n    const text = createOpCodes[i] as string;\n    const isComment = (opCode & I18nCreateOpCode.COMMENT) === I18nCreateOpCode.COMMENT;\n    const appendNow =\n      (opCode & I18nCreateOpCode.APPEND_EAGERLY) === I18nCreateOpCode.APPEND_EAGERLY;\n    const index = opCode >>> I18nCreateOpCode.SHIFT;\n    lines.push(\n      `lView[${index}] = document.${isComment ? 'createComment' : 'createText'}(${JSON.stringify(\n        text,\n      )});`,\n    );\n    if (appendNow) {\n      lines.push(`parent.appendChild(lView[${index}]);`);\n    }\n  }\n  return lines;\n}\n\n/**\n * Converts `I18nUpdateOpCodes` array into a human readable format.\n *\n * This function is attached to the `I18nUpdateOpCodes.debug` property if `ngDevMode` is enabled.\n * This function provides a human readable view of the opcodes. This is useful when debugging the\n * application as well as writing more readable tests.\n *\n * @param this `I18nUpdateOpCodes` if attached as a method.\n * @param opcodes `I18nUpdateOpCodes` if invoked as a function.\n */\nexport function i18nUpdateOpCodesToString(\n  this: I18nUpdateOpCodes | void,\n  opcodes?: I18nUpdateOpCodes,\n): string[] {\n  const parser = new OpCodeParser(opcodes || (Array.isArray(this) ? this : []));\n  let lines: string[] = [];\n\n  function consumeOpCode(value: number): string {\n    const ref = value >>> I18nUpdateOpCode.SHIFT_REF;\n    const opCode = value & I18nUpdateOpCode.MASK_OPCODE;\n    switch (opCode) {\n      case I18nUpdateOpCode.Text:\n        return `(lView[${ref}] as Text).textContent = $$$`;\n      case I18nUpdateOpCode.Attr:\n        const attrName = parser.consumeString();\n        const sanitizationFn = parser.consumeFunction();\n        const value = sanitizationFn ? `(${sanitizationFn})($$$)` : '$$$';\n        return `(lView[${ref}] as Element).setAttribute('${attrName}', ${value})`;\n      case I18nUpdateOpCode.IcuSwitch:\n        return `icuSwitchCase(${ref}, $$$)`;\n      case I18nUpdateOpCode.IcuUpdate:\n        return `icuUpdateCase(${ref})`;\n    }\n    throw new Error('unexpected OpCode');\n  }\n\n  while (parser.hasMore()) {\n    let mask = parser.consumeNumber();\n    let size = parser.consumeNumber();\n    const end = parser.i + size;\n    const statements: string[] = [];\n    let statement = '';\n    while (parser.i < end) {\n      let value = parser.consumeNumberOrString();\n      if (typeof value === 'string') {\n        statement += value;\n      } else if (value < 0) {\n        // Nega   tive numbers are ref indexes\n        // Here `i` refers to current binding index. It is to signify that the value is relative,\n        // rather than absolute.\n        statement += '${lView[i' + value + ']}';\n      } else {\n        // Positive numbers are operations.\n        const opCodeText = consumeOpCode(value);\n        statements.push(opCodeText.replace('$$$', '`' + statement + '`') + ';');\n        statement = '';\n      }\n    }\n    lines.push(`if (mask & 0b${mask.toString(2)}) { ${statements.join(' ')} }`);\n  }\n  return lines;\n}\n\n/**\n * Converts `I18nCreateOpCodes` array into a human readable format.\n *\n * This function is attached to the `I18nCreateOpCodes.debug` if `ngDevMode` is enabled. This\n * function provides a human readable view of the opcodes. This is useful when debugging the\n * application as well as writing more readable tests.\n *\n * @param this `I18nCreateOpCodes` if attached as a method.\n * @param opcodes `I18nCreateOpCodes` if invoked as a function.\n */\nexport function icuCreateOpCodesToString(\n  this: IcuCreateOpCodes | void,\n  opcodes?: IcuCreateOpCodes,\n): string[] {\n  const parser = new OpCodeParser(opcodes || (Array.isArray(this) ? this : []));\n  let lines: string[] = [];\n\n  function consumeOpCode(opCode: number): string {\n    const parent = getParentFromIcuCreateOpCode(opCode);\n    const ref = getRefFromIcuCreateOpCode(opCode);\n    switch (getInstructionFromIcuCreateOpCode(opCode)) {\n      case IcuCreateOpCode.AppendChild:\n        return `(lView[${parent}] as Element).appendChild(lView[${lastRef}])`;\n      case IcuCreateOpCode.Attr:\n        return `(lView[${ref}] as Element).setAttribute(\"${parser.consumeString()}\", \"${parser.consumeString()}\")`;\n    }\n    throw new Error('Unexpected OpCode: ' + getInstructionFromIcuCreateOpCode(opCode));\n  }\n\n  let lastRef = -1;\n  while (parser.hasMore()) {\n    let value = parser.consumeNumberStringOrMarker();\n    if (value === ICU_MARKER) {\n      const text = parser.consumeString();\n      lastRef = parser.consumeNumber();\n      lines.push(`lView[${lastRef}] = document.createComment(\"${text}\")`);\n    } else if (value === ELEMENT_MARKER) {\n      const text = parser.consumeString();\n      lastRef = parser.consumeNumber();\n      lines.push(`lView[${lastRef}] = document.createElement(\"${text}\")`);\n    } else if (typeof value === 'string') {\n      lastRef = parser.consumeNumber();\n      lines.push(`lView[${lastRef}] = document.createTextNode(\"${value}\")`);\n    } else if (typeof value === 'number') {\n      const line = consumeOpCode(value);\n      line && lines.push(line);\n    } else {\n      throw new Error('Unexpected value');\n    }\n  }\n\n  return lines;\n}\n\n/**\n * Converts `I18nRemoveOpCodes` array into a human readable format.\n *\n * This function is attached to the `I18nRemoveOpCodes.debug` if `ngDevMode` is enabled. This\n * function provides a human readable view of the opcodes. This is useful when debugging the\n * application as well as writing more readable tests.\n *\n * @param this `I18nRemoveOpCodes` if attached as a method.\n * @param opcodes `I18nRemoveOpCodes` if invoked as a function.\n */\nexport function i18nRemoveOpCodesToString(\n  this: I18nRemoveOpCodes | void,\n  opcodes?: I18nRemoveOpCodes,\n): string[] {\n  const removeCodes = opcodes || (Array.isArray(this) ? this : []);\n  let lines: string[] = [];\n\n  for (let i = 0; i < removeCodes.length; i++) {\n    const nodeOrIcuIndex = removeCodes[i] as number;\n    if (nodeOrIcuIndex > 0) {\n      // Positive numbers are `RNode`s.\n      lines.push(`remove(lView[${nodeOrIcuIndex}])`);\n    } else {\n      // Negative numbers are ICUs\n      lines.push(`removeNestedICU(${~nodeOrIcuIndex})`);\n    }\n  }\n\n  return lines;\n}\n\nclass OpCodeParser {\n  i: number = 0;\n  codes: any[];\n\n  constructor(codes: any[]) {\n    this.codes = codes;\n  }\n\n  hasMore() {\n    return this.i < this.codes.length;\n  }\n\n  consumeNumber(): number {\n    let value = this.codes[this.i++];\n    assertNumber(value, 'expecting number in OpCode');\n    return value;\n  }\n\n  consumeString(): string {\n    let value = this.codes[this.i++];\n    assertString(value, 'expecting string in OpCode');\n    return value;\n  }\n\n  consumeFunction(): Function | null {\n    let value = this.codes[this.i++];\n    if (value === null || typeof value === 'function') {\n      return value;\n    }\n    throw new Error('expecting function in OpCode');\n  }\n\n  consumeNumberOrString(): number | string {\n    let value = this.codes[this.i++];\n    if (typeof value === 'string') {\n      return value;\n    }\n    assertNumber(value, 'expecting number or string in OpCode');\n    return value;\n  }\n\n  consumeNumberStringOrMarker(): number | string | ICU_MARKER | ELEMENT_MARKER {\n    let value = this.codes[this.i++];\n    if (\n      typeof value === 'string' ||\n      typeof value === 'number' ||\n      value == ICU_MARKER ||\n      value == ELEMENT_MARKER\n    ) {\n      return value;\n    }\n    assertNumber(value, 'expecting number, string, ICU_MARKER or ELEMENT_MARKER in OpCode');\n    return value;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport '../../util/ng_dev_mode';\nimport '../../util/ng_i18n_closure_mode';\n\nimport {XSS_SECURITY_URL} from '../../error_details_base_url';\nimport {\n  getTemplateContent,\n  URI_ATTRS,\n  VALID_ATTRS,\n  VALID_ELEMENTS,\n} from '../../sanitization/html_sanitizer';\nimport {getInertBodyHelper} from '../../sanitization/inert_body';\nimport {_sanitizeUrl} from '../../sanitization/url_sanitizer';\nimport {\n  assertDefined,\n  assertEqual,\n  assertGreaterThanOrEqual,\n  assertOneOf,\n  assertString,\n} from '../../util/assert';\nimport {CharCode} from '../../util/char_code';\nimport {loadIcuContainerVisitor} from './i18n_icu_container_visitor';\n\nimport {getDocument} from '../interfaces/document';\nimport {\n  ELEMENT_MARKER,\n  I18nCreateOpCode,\n  I18nCreateOpCodes,\n  I18nElementNode,\n  I18nNode,\n  I18nNodeKind,\n  I18nPlaceholderNode,\n  I18nPlaceholderType,\n  I18nRemoveOpCodes,\n  I18nUpdateOpCode,\n  I18nUpdateOpCodes,\n  ICU_MARKER,\n  IcuCreateOpCode,\n  IcuCreateOpCodes,\n  IcuExpression,\n  IcuType,\n  TI18n,\n  TIcu,\n} from '../interfaces/i18n';\nimport {TNode, TNodeType} from '../interfaces/node';\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {HEADER_OFFSET, LView, TView} from '../interfaces/view';\nimport {getCurrentParentTNode, getCurrentTNode, setCurrentTNode} from '../state';\n\nimport {\n  i18nCreateOpCodesToString,\n  i18nRemoveOpCodesToString,\n  i18nUpdateOpCodesToString,\n  icuCreateOpCodesToString,\n} from './i18n_debug';\nimport {addTNodeAndUpdateInsertBeforeIndex} from './i18n_insert_before_index';\nimport {ensureIcuContainerVisitorLoaded} from './i18n_tree_shaking';\nimport {\n  createTNodePlaceholder,\n  icuCreateOpCode,\n  isRootTemplateMessage,\n  setTIcu,\n  setTNodeInsertBeforeIndex,\n} from './i18n_util';\nimport {createTNodeAtIndex} from '../tnode_manipulation';\nimport {allocExpando} from '../view/construction';\n\nconst BINDING_REGEXP = /�(\\d+):?\\d*�/gi;\nconst ICU_REGEXP = /({\\s*�\\d+:?\\d*�\\s*,\\s*\\S{6}\\s*,[\\s\\S]*})/gi;\nconst NESTED_ICU = /�(\\d+)�/;\nconst ICU_BLOCK_REGEXP = /^\\s*(�\\d+:?\\d*�)\\s*,\\s*(select|plural)\\s*,/;\n\nconst MARKER = `�`;\nconst SUBTEMPLATE_REGEXP = /�\\/?\\*(\\d+:\\d+)�/gi;\nconst PH_REGEXP = /�(\\/?[#*]\\d+):?\\d*�/gi;\n\n/**\n * Angular uses the special entity &ngsp; as a placeholder for non-removable space.\n * It's replaced by the 0xE500 PUA (Private Use Areas) unicode character and later on replaced by a\n * space.\n * We are re-implementing the same idea since translations might contain this special character.\n */\nconst NGSP_UNICODE_REGEXP = /\\uE500/g;\nfunction replaceNgsp(value: string): string {\n  return value.replace(NGSP_UNICODE_REGEXP, ' ');\n}\n\n/**\n * Patch a `debug` property getter on top of the existing object.\n *\n * NOTE: always call this method with `ngDevMode && attachDebugObject(...)`\n *\n * @param obj Object to patch\n * @param debugGetter Getter returning a value to patch\n */\nfunction attachDebugGetter<T>(obj: T, debugGetter: (this: T) => any): void {\n  if (ngDevMode) {\n    Object.defineProperty(obj, 'debug', {get: debugGetter, enumerable: false});\n  } else {\n    throw new Error(\n      'This method should be guarded with `ngDevMode` so that it can be tree shaken in production!',\n    );\n  }\n}\n\n/**\n * Create dynamic nodes from i18n translation block.\n *\n * - Text nodes are created synchronously\n * - TNodes are linked into tree lazily\n *\n * @param tView Current `TView`\n * @parentTNodeIndex index to the parent TNode of this i18n block\n * @param lView Current `LView`\n * @param index Index of `ɵɵi18nStart` instruction.\n * @param message Message to translate.\n * @param subTemplateIndex Index into the sub template of message translation. (ie in case of\n *     `ngIf`) (-1 otherwise)\n */\nexport function i18nStartFirstCreatePass(\n  tView: TView,\n  parentTNodeIndex: number,\n  lView: LView,\n  index: number,\n  message: string,\n  subTemplateIndex: number,\n) {\n  const rootTNode = getCurrentParentTNode();\n  const createOpCodes: I18nCreateOpCodes = [] as any;\n  const updateOpCodes: I18nUpdateOpCodes = [] as any;\n  const existingTNodeStack: TNode[][] = [[]];\n  const astStack: Array<Array<I18nNode>> = [[]];\n  if (ngDevMode) {\n    attachDebugGetter(createOpCodes, i18nCreateOpCodesToString);\n    attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);\n  }\n\n  message = getTranslationForTemplate(message, subTemplateIndex);\n  const msgParts = replaceNgsp(message).split(PH_REGEXP);\n  for (let i = 0; i < msgParts.length; i++) {\n    let value = msgParts[i];\n    if ((i & 1) === 0) {\n      // Even indexes are text (including bindings & ICU expressions)\n      const parts = i18nParseTextIntoPartsAndICU(value);\n      for (let j = 0; j < parts.length; j++) {\n        let part = parts[j];\n        if ((j & 1) === 0) {\n          // `j` is odd therefore `part` is string\n          const text = part as string;\n          ngDevMode && assertString(text, 'Parsed ICU part should be string');\n          if (text !== '') {\n            i18nStartFirstCreatePassProcessTextNode(\n              astStack[0],\n              tView,\n              rootTNode,\n              existingTNodeStack[0],\n              createOpCodes,\n              updateOpCodes,\n              lView,\n              text,\n            );\n          }\n        } else {\n          // `j` is Even therefor `part` is an `ICUExpression`\n          const icuExpression: IcuExpression = part as IcuExpression;\n          // Verify that ICU expression has the right shape. Translations might contain invalid\n          // constructions (while original messages were correct), so ICU parsing at runtime may\n          // not succeed (thus `icuExpression` remains a string).\n          // Note: we intentionally retain the error here by not using `ngDevMode`, because\n          // the value can change based on the locale and users aren't guaranteed to hit\n          // an invalid string while they're developing.\n          if (typeof icuExpression !== 'object') {\n            throw new Error(`Unable to parse ICU expression in \"${message}\" message.`);\n          }\n          const icuContainerTNode = createTNodeAndAddOpCode(\n            tView,\n            rootTNode,\n            existingTNodeStack[0],\n            lView,\n            createOpCodes,\n            ngDevMode ? `ICU ${index}:${icuExpression.mainBinding}` : '',\n            true,\n          );\n          const icuNodeIndex = icuContainerTNode.index;\n          ngDevMode &&\n            assertGreaterThanOrEqual(\n              icuNodeIndex,\n              HEADER_OFFSET,\n              'Index must be in absolute LView offset',\n            );\n          icuStart(\n            astStack[0],\n            tView,\n            lView,\n            updateOpCodes,\n            parentTNodeIndex,\n            icuExpression,\n            icuNodeIndex,\n          );\n        }\n      }\n    } else {\n      // Odd indexes are placeholders (elements and sub-templates)\n      // At this point value is something like: '/#1:2' (originally coming from '�/#1:2�')\n      const isClosing = value.charCodeAt(0) === CharCode.SLASH;\n      const type = value.charCodeAt(isClosing ? 1 : 0);\n      ngDevMode && assertOneOf(type, CharCode.STAR, CharCode.HASH);\n      const index = HEADER_OFFSET + Number.parseInt(value.substring(isClosing ? 2 : 1));\n      if (isClosing) {\n        existingTNodeStack.shift();\n        astStack.shift();\n        setCurrentTNode(getCurrentParentTNode()!, false);\n      } else {\n        const tNode = createTNodePlaceholder(tView, existingTNodeStack[0], index);\n        existingTNodeStack.unshift([]);\n        setCurrentTNode(tNode, true);\n\n        const placeholderNode: I18nPlaceholderNode = {\n          kind: I18nNodeKind.PLACEHOLDER,\n          index,\n          children: [],\n          type:\n            type === CharCode.HASH ? I18nPlaceholderType.ELEMENT : I18nPlaceholderType.SUBTEMPLATE,\n        };\n        astStack[0].push(placeholderNode);\n        astStack.unshift(placeholderNode.children);\n      }\n    }\n  }\n\n  tView.data[index] = <TI18n>{\n    create: createOpCodes,\n    update: updateOpCodes,\n    ast: astStack[0],\n    parentTNodeIndex,\n  };\n}\n\n/**\n * Allocate space in i18n Range add create OpCode instruction to create a text or comment node.\n *\n * @param tView Current `TView` needed to allocate space in i18n range.\n * @param rootTNode Root `TNode` of the i18n block. This node determines if the new TNode will be\n *     added as part of the `i18nStart` instruction or as part of the `TNode.insertBeforeIndex`.\n * @param existingTNodes internal state for `addTNodeAndUpdateInsertBeforeIndex`.\n * @param lView Current `LView` needed to allocate space in i18n range.\n * @param createOpCodes Array storing `I18nCreateOpCodes` where new opCodes will be added.\n * @param text Text to be added when the `Text` or `Comment` node will be created.\n * @param isICU true if a `Comment` node for ICU (instead of `Text`) node should be created.\n */\nfunction createTNodeAndAddOpCode(\n  tView: TView,\n  rootTNode: TNode | null,\n  existingTNodes: TNode[],\n  lView: LView,\n  createOpCodes: I18nCreateOpCodes,\n  text: string | null,\n  isICU: boolean,\n): TNode {\n  const i18nNodeIdx = allocExpando(tView, lView, 1, null);\n  let opCode = i18nNodeIdx << I18nCreateOpCode.SHIFT;\n  let parentTNode = getCurrentParentTNode();\n\n  if (rootTNode === parentTNode) {\n    // FIXME(misko): A null `parentTNode` should represent when we fall of the `LView` boundary.\n    // (there is no parent), but in some circumstances (because we are inconsistent about how we set\n    // `previousOrParentTNode`) it could point to `rootTNode` So this is a work around.\n    parentTNode = null;\n  }\n  if (parentTNode === null) {\n    // If we don't have a parent that means that we can eagerly add nodes.\n    // If we have a parent than these nodes can't be added now (as the parent has not been created\n    // yet) and instead the `parentTNode` is responsible for adding it. See\n    // `TNode.insertBeforeIndex`\n    opCode |= I18nCreateOpCode.APPEND_EAGERLY;\n  }\n  if (isICU) {\n    opCode |= I18nCreateOpCode.COMMENT;\n    ensureIcuContainerVisitorLoaded(loadIcuContainerVisitor);\n  }\n  createOpCodes.push(opCode, text === null ? '' : text);\n  // We store `{{?}}` so that when looking at debug `TNodeType.template` we can see where the\n  // bindings are.\n  const tNode = createTNodeAtIndex(\n    tView,\n    i18nNodeIdx,\n    isICU ? TNodeType.Icu : TNodeType.Text,\n    text === null ? (ngDevMode ? '{{?}}' : '') : text,\n    null,\n  );\n  addTNodeAndUpdateInsertBeforeIndex(existingTNodes, tNode);\n  const tNodeIdx = tNode.index;\n  setCurrentTNode(tNode, false /* Text nodes are self closing */);\n  if (parentTNode !== null && rootTNode !== parentTNode) {\n    // We are a child of deeper node (rather than a direct child of `i18nStart` instruction.)\n    // We have to make sure to add ourselves to the parent.\n    setTNodeInsertBeforeIndex(parentTNode, tNodeIdx);\n  }\n  return tNode;\n}\n\n/**\n * Processes text node in i18n block.\n *\n * Text nodes can have:\n * - Create instruction in `createOpCodes` for creating the text node.\n * - Allocate spec for text node in i18n range of `LView`\n * - If contains binding:\n *    - bindings => allocate space in i18n range of `LView` to store the binding value.\n *    - populate `updateOpCodes` with update instructions.\n *\n * @param tView Current `TView`\n * @param rootTNode Root `TNode` of the i18n block. This node determines if the new TNode will\n *     be added as part of the `i18nStart` instruction or as part of the\n *     `TNode.insertBeforeIndex`.\n * @param existingTNodes internal state for `addTNodeAndUpdateInsertBeforeIndex`.\n * @param createOpCodes Location where the creation OpCodes will be stored.\n * @param lView Current `LView`\n * @param text The translated text (which may contain binding)\n */\nfunction i18nStartFirstCreatePassProcessTextNode(\n  ast: I18nNode[],\n  tView: TView,\n  rootTNode: TNode | null,\n  existingTNodes: TNode[],\n  createOpCodes: I18nCreateOpCodes,\n  updateOpCodes: I18nUpdateOpCodes,\n  lView: LView,\n  text: string,\n): void {\n  const hasBinding = text.match(BINDING_REGEXP);\n  const tNode = createTNodeAndAddOpCode(\n    tView,\n    rootTNode,\n    existingTNodes,\n    lView,\n    createOpCodes,\n    hasBinding ? null : text,\n    false,\n  );\n  const index = tNode.index;\n  if (hasBinding) {\n    generateBindingUpdateOpCodes(updateOpCodes, text, index, null, 0, null);\n  }\n  ast.push({kind: I18nNodeKind.TEXT, index});\n}\n\n/**\n * See `i18nAttributes` above.\n */\nexport function i18nAttributesFirstPass(tView: TView, index: number, values: string[]) {\n  const previousElement = getCurrentTNode()!;\n  const previousElementIndex = previousElement.index;\n  const updateOpCodes: I18nUpdateOpCodes = [] as any;\n  if (ngDevMode) {\n    attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);\n  }\n  if (tView.firstCreatePass && tView.data[index] === null) {\n    for (let i = 0; i < values.length; i += 2) {\n      const attrName = values[i];\n      const message = values[i + 1];\n\n      if (message !== '') {\n        // Check if attribute value contains an ICU and throw an error if that's the case.\n        // ICUs in element attributes are not supported.\n        // Note: we intentionally retain the error here by not using `ngDevMode`, because\n        // the `value` can change based on the locale and users aren't guaranteed to hit\n        // an invalid string while they're developing.\n        if (ICU_REGEXP.test(message)) {\n          throw new Error(\n            `ICU expressions are not supported in attributes. Message: \"${message}\".`,\n          );\n        }\n\n        // i18n attributes that hit this code path are guaranteed to have bindings, because\n        // the compiler treats static i18n attributes as regular attribute bindings.\n        // Since this may not be the first i18n attribute on this element we need to pass in how\n        // many previous bindings there have already been.\n        generateBindingUpdateOpCodes(\n          updateOpCodes,\n          message,\n          previousElementIndex,\n          attrName,\n          countBindings(updateOpCodes),\n          null,\n        );\n      }\n    }\n    tView.data[index] = updateOpCodes;\n  }\n}\n\n/**\n * Generate the OpCodes to update the bindings of a string.\n *\n * @param updateOpCodes Place where the update opcodes will be stored.\n * @param str The string containing the bindings.\n * @param destinationNode Index of the destination node which will receive the binding.\n * @param attrName Name of the attribute, if the string belongs to an attribute.\n * @param sanitizeFn Sanitization function used to sanitize the string after update, if necessary.\n * @param bindingStart The lView index of the next expression that can be bound via an opCode.\n * @returns The mask value for these bindings\n */\nfunction generateBindingUpdateOpCodes(\n  updateOpCodes: I18nUpdateOpCodes,\n  str: string,\n  destinationNode: number,\n  attrName: string | null,\n  bindingStart: number,\n  sanitizeFn: SanitizerFn | null,\n): number {\n  ngDevMode &&\n    assertGreaterThanOrEqual(\n      destinationNode,\n      HEADER_OFFSET,\n      'Index must be in absolute LView offset',\n    );\n  const maskIndex = updateOpCodes.length; // Location of mask\n  const sizeIndex = maskIndex + 1; // location of size for skipping\n  updateOpCodes.push(null, null); // Alloc space for mask and size\n  const startIndex = maskIndex + 2; // location of first allocation.\n  if (ngDevMode) {\n    attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);\n  }\n  const textParts = str.split(BINDING_REGEXP);\n  let mask = 0;\n\n  for (let j = 0; j < textParts.length; j++) {\n    const textValue = textParts[j];\n\n    if (j & 1) {\n      // Odd indexes are bindings\n      const bindingIndex = bindingStart + parseInt(textValue, 10);\n      updateOpCodes.push(-1 - bindingIndex);\n      mask = mask | toMaskBit(bindingIndex);\n    } else if (textValue !== '') {\n      // Even indexes are text\n      updateOpCodes.push(textValue);\n    }\n  }\n\n  updateOpCodes.push(\n    (destinationNode << I18nUpdateOpCode.SHIFT_REF) |\n      (attrName ? I18nUpdateOpCode.Attr : I18nUpdateOpCode.Text),\n  );\n  if (attrName) {\n    updateOpCodes.push(attrName, sanitizeFn);\n  }\n  updateOpCodes[maskIndex] = mask;\n  updateOpCodes[sizeIndex] = updateOpCodes.length - startIndex;\n  return mask;\n}\n\n/**\n * Count the number of bindings in the given `opCodes`.\n *\n * It could be possible to speed this up, by passing the number of bindings found back from\n * `generateBindingUpdateOpCodes()` to `i18nAttributesFirstPass()` but this would then require more\n * complexity in the code and/or transient objects to be created.\n *\n * Since this function is only called once when the template is instantiated, is trivial in the\n * first instance (since `opCodes` will be an empty array), and it is not common for elements to\n * contain multiple i18n bound attributes, it seems like this is a reasonable compromise.\n */\nfunction countBindings(opCodes: I18nUpdateOpCodes): number {\n  let count = 0;\n  for (let i = 0; i < opCodes.length; i++) {\n    const opCode = opCodes[i];\n    // Bindings are negative numbers.\n    if (typeof opCode === 'number' && opCode < 0) {\n      count++;\n    }\n  }\n  return count;\n}\n\n/**\n * Convert binding index to mask bit.\n *\n * Each index represents a single bit on the bit-mask. Because bit-mask only has 32 bits, we make\n * the 32nd bit share all masks for all bindings higher than 32. Since it is extremely rare to\n * have more than 32 bindings this will be hit very rarely. The downside of hitting this corner\n * case is that we will execute binding code more often than necessary. (penalty of performance)\n */\nfunction toMaskBit(bindingIndex: number): number {\n  return 1 << Math.min(bindingIndex, 31);\n}\n\n/**\n * Removes everything inside the sub-templates of a message.\n */\nfunction removeInnerTemplateTranslation(message: string): string {\n  let match;\n  let res = '';\n  let index = 0;\n  let inTemplate = false;\n  let tagMatched;\n\n  while ((match = SUBTEMPLATE_REGEXP.exec(message)) !== null) {\n    if (!inTemplate) {\n      res += message.substring(index, match.index + match[0].length);\n      tagMatched = match[1];\n      inTemplate = true;\n    } else {\n      if (match[0] === `${MARKER}/*${tagMatched}${MARKER}`) {\n        index = match.index;\n        inTemplate = false;\n      }\n    }\n  }\n\n  ngDevMode &&\n    assertEqual(\n      inTemplate,\n      false,\n      `Tag mismatch: unable to find the end of the sub-template in the translation \"${message}\"`,\n    );\n\n  res += message.slice(index);\n  return res;\n}\n\n/**\n * Extracts a part of a message and removes the rest.\n *\n * This method is used for extracting a part of the message associated with a template. A\n * translated message can span multiple templates.\n *\n * Example:\n * ```html\n * <div i18n>Translate <span *ngIf>me</span>!</div>\n * ```\n *\n * @param message The message to crop\n * @param subTemplateIndex Index of the sub-template to extract. If undefined it returns the\n * external template and removes all sub-templates.\n */\nexport function getTranslationForTemplate(message: string, subTemplateIndex: number) {\n  if (isRootTemplateMessage(subTemplateIndex)) {\n    // We want the root template message, ignore all sub-templates\n    return removeInnerTemplateTranslation(message);\n  } else {\n    // We want a specific sub-template\n    const start =\n      message.indexOf(`:${subTemplateIndex}${MARKER}`) + 2 + subTemplateIndex.toString().length;\n    const end = message.search(new RegExp(`${MARKER}\\\\/\\\\*\\\\d+:${subTemplateIndex}${MARKER}`));\n    return removeInnerTemplateTranslation(message.substring(start, end));\n  }\n}\n\n/**\n * Generate the OpCodes for ICU expressions.\n *\n * @param icuExpression\n * @param index Index where the anchor is stored and an optional `TIcuContainerNode`\n *   - `lView[anchorIdx]` points to a `Comment` node representing the anchor for the ICU.\n *   - `tView.data[anchorIdx]` points to the `TIcuContainerNode` if ICU is root (`null` otherwise)\n */\nfunction icuStart(\n  ast: I18nNode[],\n  tView: TView,\n  lView: LView,\n  updateOpCodes: I18nUpdateOpCodes,\n  parentIdx: number,\n  icuExpression: IcuExpression,\n  anchorIdx: number,\n) {\n  ngDevMode && assertDefined(icuExpression, 'ICU expression must be defined');\n  let bindingMask = 0;\n  const tIcu: TIcu = {\n    type: icuExpression.type,\n    currentCaseLViewIndex: allocExpando(tView, lView, 1, null),\n    anchorIdx,\n    cases: [],\n    create: [],\n    remove: [],\n    update: [],\n  };\n  addUpdateIcuSwitch(updateOpCodes, icuExpression, anchorIdx);\n  setTIcu(tView, anchorIdx, tIcu);\n  const values = icuExpression.values;\n  const cases: I18nNode[][] = [];\n  for (let i = 0; i < values.length; i++) {\n    // Each value is an array of strings & other ICU expressions\n    const valueArr = values[i];\n    const nestedIcus: IcuExpression[] = [];\n    for (let j = 0; j < valueArr.length; j++) {\n      const value = valueArr[j];\n      if (typeof value !== 'string') {\n        // It is an nested ICU expression\n        const icuIndex = nestedIcus.push(value as IcuExpression) - 1;\n        // Replace nested ICU expression by a comment node\n        valueArr[j] = `<!--�${icuIndex}�-->`;\n      }\n    }\n    const caseAst: I18nNode[] = [];\n    cases.push(caseAst);\n    bindingMask =\n      parseIcuCase(\n        caseAst,\n        tView,\n        tIcu,\n        lView,\n        updateOpCodes,\n        parentIdx,\n        icuExpression.cases[i],\n        valueArr.join(''),\n        nestedIcus,\n      ) | bindingMask;\n  }\n  if (bindingMask) {\n    addUpdateIcuUpdate(updateOpCodes, bindingMask, anchorIdx);\n  }\n  ast.push({\n    kind: I18nNodeKind.ICU,\n    index: anchorIdx,\n    cases,\n    currentCaseLViewIndex: tIcu.currentCaseLViewIndex,\n  });\n}\n\n/**\n * Parses text containing an ICU expression and produces a JSON object for it.\n * Original code from closure library, modified for Angular.\n *\n * @param pattern Text containing an ICU expression that needs to be parsed.\n *\n */\nfunction parseICUBlock(pattern: string): IcuExpression {\n  const cases = [];\n  const values: (string | IcuExpression)[][] = [];\n  let icuType = IcuType.plural;\n  let mainBinding = 0;\n  pattern = pattern.replace(\n    ICU_BLOCK_REGEXP,\n    function (str: string, binding: string, type: string) {\n      if (type === 'select') {\n        icuType = IcuType.select;\n      } else {\n        icuType = IcuType.plural;\n      }\n      mainBinding = parseInt(binding.slice(1), 10);\n      return '';\n    },\n  );\n\n  const parts = i18nParseTextIntoPartsAndICU(pattern) as string[];\n  // Looking for (key block)+ sequence. One of the keys has to be \"other\".\n  for (let pos = 0; pos < parts.length; ) {\n    let key = parts[pos++].trim();\n    if (icuType === IcuType.plural) {\n      // Key can be \"=x\", we just want \"x\"\n      key = key.replace(/\\s*(?:=)?(\\w+)\\s*/, '$1');\n    }\n    if (key.length) {\n      cases.push(key);\n    }\n\n    const blocks = i18nParseTextIntoPartsAndICU(parts[pos++]) as string[];\n    if (cases.length > values.length) {\n      values.push(blocks);\n    }\n  }\n\n  // TODO(ocombe): support ICU expressions in attributes, see #21615\n  return {type: icuType, mainBinding: mainBinding, cases, values};\n}\n\n/**\n * Breaks pattern into strings and top level {...} blocks.\n * Can be used to break a message into text and ICU expressions, or to break an ICU expression\n * into keys and cases. Original code from closure library, modified for Angular.\n *\n * @param pattern (sub)Pattern to be broken.\n * @returns An `Array<string|IcuExpression>` where:\n *   - odd positions: `string` => text between ICU expressions\n *   - even positions: `ICUExpression` => ICU expression parsed into `ICUExpression` record.\n */\nfunction i18nParseTextIntoPartsAndICU(pattern: string): (string | IcuExpression)[] {\n  if (!pattern) {\n    return [];\n  }\n\n  let prevPos = 0;\n  const braceStack = [];\n  const results: (string | IcuExpression)[] = [];\n  const braces = /[{}]/g;\n  // lastIndex doesn't get set to 0 so we have to.\n  braces.lastIndex = 0;\n\n  let match;\n  while ((match = braces.exec(pattern))) {\n    const pos = match.index;\n    if (match[0] == '}') {\n      braceStack.pop();\n\n      if (braceStack.length == 0) {\n        // End of the block.\n        const block = pattern.substring(prevPos, pos);\n        if (ICU_BLOCK_REGEXP.test(block)) {\n          results.push(parseICUBlock(block));\n        } else {\n          results.push(block);\n        }\n\n        prevPos = pos + 1;\n      }\n    } else {\n      if (braceStack.length == 0) {\n        const substring = pattern.substring(prevPos, pos);\n        results.push(substring);\n        prevPos = pos + 1;\n      }\n      braceStack.push('{');\n    }\n  }\n\n  const substring = pattern.substring(prevPos);\n  results.push(substring);\n  return results;\n}\n\n/**\n * Parses a node, its children and its siblings, and generates the mutate & update OpCodes.\n *\n */\nfunction parseIcuCase(\n  ast: I18nNode[],\n  tView: TView,\n  tIcu: TIcu,\n  lView: LView,\n  updateOpCodes: I18nUpdateOpCodes,\n  parentIdx: number,\n  caseName: string,\n  unsafeCaseHtml: string,\n  nestedIcus: IcuExpression[],\n): number {\n  const create: IcuCreateOpCodes = [] as any;\n  const remove: I18nRemoveOpCodes = [] as any;\n  const update: I18nUpdateOpCodes = [] as any;\n  if (ngDevMode) {\n    attachDebugGetter(create, icuCreateOpCodesToString);\n    attachDebugGetter(remove, i18nRemoveOpCodesToString);\n    attachDebugGetter(update, i18nUpdateOpCodesToString);\n  }\n  tIcu.cases.push(caseName);\n  tIcu.create.push(create);\n  tIcu.remove.push(remove);\n  tIcu.update.push(update);\n\n  const inertBodyHelper = getInertBodyHelper(getDocument());\n  const inertBodyElement = inertBodyHelper.getInertBodyElement(unsafeCaseHtml);\n  ngDevMode && assertDefined(inertBodyElement, 'Unable to generate inert body element');\n  const inertRootNode = (getTemplateContent(inertBodyElement!) as Element) || inertBodyElement;\n  if (inertRootNode) {\n    return walkIcuTree(\n      ast,\n      tView,\n      tIcu,\n      lView,\n      updateOpCodes,\n      create,\n      remove,\n      update,\n      inertRootNode,\n      parentIdx,\n      nestedIcus,\n      0,\n    );\n  } else {\n    return 0;\n  }\n}\n\nfunction walkIcuTree(\n  ast: I18nNode[],\n  tView: TView,\n  tIcu: TIcu,\n  lView: LView,\n  sharedUpdateOpCodes: I18nUpdateOpCodes,\n  create: IcuCreateOpCodes,\n  remove: I18nRemoveOpCodes,\n  update: I18nUpdateOpCodes,\n  parentNode: Element,\n  parentIdx: number,\n  nestedIcus: IcuExpression[],\n  depth: number,\n): number {\n  let bindingMask = 0;\n  let currentNode = parentNode.firstChild;\n  while (currentNode) {\n    const newIndex = allocExpando(tView, lView, 1, null);\n    switch (currentNode.nodeType) {\n      case Node.ELEMENT_NODE:\n        const element = currentNode as Element;\n        const tagName = element.tagName.toLowerCase();\n        if (VALID_ELEMENTS.hasOwnProperty(tagName)) {\n          addCreateNodeAndAppend(create, ELEMENT_MARKER, tagName, parentIdx, newIndex);\n          tView.data[newIndex] = tagName;\n          const elAttrs = element.attributes;\n          for (let i = 0; i < elAttrs.length; i++) {\n            const attr = elAttrs.item(i)!;\n            const lowerAttrName = attr.name.toLowerCase();\n            const hasBinding = !!attr.value.match(BINDING_REGEXP);\n            // we assume the input string is safe, unless it's using a binding\n            if (hasBinding) {\n              if (VALID_ATTRS.hasOwnProperty(lowerAttrName)) {\n                if (URI_ATTRS[lowerAttrName]) {\n                  generateBindingUpdateOpCodes(\n                    update,\n                    attr.value,\n                    newIndex,\n                    attr.name,\n                    0,\n                    _sanitizeUrl,\n                  );\n                } else {\n                  generateBindingUpdateOpCodes(update, attr.value, newIndex, attr.name, 0, null);\n                }\n              } else {\n                ngDevMode &&\n                  console.warn(\n                    `WARNING: ignoring unsafe attribute value ` +\n                      `${lowerAttrName} on element ${tagName} ` +\n                      `(see ${XSS_SECURITY_URL})`,\n                  );\n              }\n            } else {\n              addCreateAttribute(create, newIndex, attr);\n            }\n          }\n          const elementNode: I18nElementNode = {\n            kind: I18nNodeKind.ELEMENT,\n            index: newIndex,\n            children: [],\n          };\n          ast.push(elementNode);\n          // Parse the children of this node (if any)\n          bindingMask =\n            walkIcuTree(\n              elementNode.children,\n              tView,\n              tIcu,\n              lView,\n              sharedUpdateOpCodes,\n              create,\n              remove,\n              update,\n              currentNode as Element,\n              newIndex,\n              nestedIcus,\n              depth + 1,\n            ) | bindingMask;\n          addRemoveNode(remove, newIndex, depth);\n        }\n        break;\n      case Node.TEXT_NODE:\n        const value = currentNode.textContent || '';\n        const hasBinding = value.match(BINDING_REGEXP);\n        addCreateNodeAndAppend(create, null, hasBinding ? '' : value, parentIdx, newIndex);\n        addRemoveNode(remove, newIndex, depth);\n        if (hasBinding) {\n          bindingMask =\n            generateBindingUpdateOpCodes(update, value, newIndex, null, 0, null) | bindingMask;\n        }\n        ast.push({\n          kind: I18nNodeKind.TEXT,\n          index: newIndex,\n        });\n        break;\n      case Node.COMMENT_NODE:\n        // Check if the comment node is a placeholder for a nested ICU\n        const isNestedIcu = NESTED_ICU.exec(currentNode.textContent || '');\n        if (isNestedIcu) {\n          const nestedIcuIndex = parseInt(isNestedIcu[1], 10);\n          const icuExpression: IcuExpression = nestedIcus[nestedIcuIndex];\n          // Create the comment node that will anchor the ICU expression\n          addCreateNodeAndAppend(\n            create,\n            ICU_MARKER,\n            ngDevMode ? `nested ICU ${nestedIcuIndex}` : '',\n            parentIdx,\n            newIndex,\n          );\n          icuStart(ast, tView, lView, sharedUpdateOpCodes, parentIdx, icuExpression, newIndex);\n          addRemoveNestedIcu(remove, newIndex, depth);\n        }\n        break;\n    }\n    currentNode = currentNode.nextSibling;\n  }\n  return bindingMask;\n}\n\nfunction addRemoveNode(remove: I18nRemoveOpCodes, index: number, depth: number) {\n  if (depth === 0) {\n    remove.push(index);\n  }\n}\n\nfunction addRemoveNestedIcu(remove: I18nRemoveOpCodes, index: number, depth: number) {\n  if (depth === 0) {\n    remove.push(~index); // remove ICU at `index`\n    remove.push(index); // remove ICU comment at `index`\n  }\n}\n\nfunction addUpdateIcuSwitch(\n  update: I18nUpdateOpCodes,\n  icuExpression: IcuExpression,\n  index: number,\n) {\n  update.push(\n    toMaskBit(icuExpression.mainBinding),\n    2,\n    -1 - icuExpression.mainBinding,\n    (index << I18nUpdateOpCode.SHIFT_REF) | I18nUpdateOpCode.IcuSwitch,\n  );\n}\n\nfunction addUpdateIcuUpdate(update: I18nUpdateOpCodes, bindingMask: number, index: number) {\n  update.push(bindingMask, 1, (index << I18nUpdateOpCode.SHIFT_REF) | I18nUpdateOpCode.IcuUpdate);\n}\n\nfunction addCreateNodeAndAppend(\n  create: IcuCreateOpCodes,\n  marker: null | ICU_MARKER | ELEMENT_MARKER,\n  text: string,\n  appendToParentIdx: number,\n  createAtIdx: number,\n) {\n  if (marker !== null) {\n    create.push(marker);\n  }\n  create.push(\n    text,\n    createAtIdx,\n    icuCreateOpCode(IcuCreateOpCode.AppendChild, appendToParentIdx, createAtIdx),\n  );\n}\n\nfunction addCreateAttribute(create: IcuCreateOpCodes, newIndex: number, attr: Attr) {\n  create.push(\n    (newIndex << IcuCreateOpCode.SHIFT_REF) | IcuCreateOpCode.Attr,\n    attr.name,\n    attr.value,\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// i18nPostprocess consts\nconst ROOT_TEMPLATE_ID = 0;\nconst PP_MULTI_VALUE_PLACEHOLDERS_REGEXP = /\\[(�.+?�?)\\]/;\nconst PP_PLACEHOLDERS_REGEXP = /\\[(�.+?�?)\\]|(�\\/?\\*\\d+:\\d+�)/g;\nconst PP_ICU_VARS_REGEXP = /({\\s*)(VAR_(PLURAL|SELECT)(_\\d+)?)(\\s*,)/g;\nconst PP_ICU_PLACEHOLDERS_REGEXP = /{([A-Z0-9_]+)}/g;\nconst PP_ICUS_REGEXP = /�I18N_EXP_(ICU(_\\d+)?)�/g;\nconst PP_CLOSE_TEMPLATE_REGEXP = /\\/\\*/;\nconst PP_TEMPLATE_ID_REGEXP = /\\d+\\:(\\d+)/;\n\n// Parsed placeholder structure used in postprocessing (within `i18nPostprocess` function)\n// Contains the following fields: [templateId, isCloseTemplateTag, placeholder]\ntype PostprocessPlaceholder = [number, boolean, string];\n\n/**\n * Handles message string post-processing for internationalization.\n *\n * Handles message string post-processing by transforming it from intermediate\n * format (that might contain some markers that we need to replace) to the final\n * form, consumable by i18nStart instruction. Post processing steps include:\n *\n * 1. Resolve all multi-value cases (like [�*1:1��#2:1�|�#4:1�|�5�])\n * 2. Replace all ICU vars (like \"VAR_PLURAL\")\n * 3. Replace all placeholders used inside ICUs in a form of {PLACEHOLDER}\n * 4. Replace all ICU references with corresponding values (like �ICU_EXP_ICU_1�)\n *    in case multiple ICUs have the same placeholder name\n *\n * @param message Raw translation string for post processing\n * @param replacements Set of replacements that should be applied\n *\n * @returns Transformed string that can be consumed by i18nStart instruction\n *\n * @codeGenApi\n */\nexport function i18nPostprocess(\n  message: string,\n  replacements: {[key: string]: string | string[]} = {},\n): string {\n  /**\n   * Step 1: resolve all multi-value placeholders like [�#5�|�*1:1��#2:1�|�#4:1�]\n   *\n   * Note: due to the way we process nested templates (BFS), multi-value placeholders are typically\n   * grouped by templates, for example: [�#5�|�#6�|�#1:1�|�#3:2�] where �#5� and �#6� belong to root\n   * template, �#1:1� belong to nested template with index 1 and �#1:2� - nested template with index\n   * 3. However in real templates the order might be different: i.e. �#1:1� and/or �#3:2� may go in\n   * front of �#6�. The post processing step restores the right order by keeping track of the\n   * template id stack and looks for placeholders that belong to the currently active template.\n   */\n  let result: string = message;\n  if (PP_MULTI_VALUE_PLACEHOLDERS_REGEXP.test(message)) {\n    const matches: {[key: string]: PostprocessPlaceholder[]} = {};\n    const templateIdsStack: number[] = [ROOT_TEMPLATE_ID];\n    result = result.replace(PP_PLACEHOLDERS_REGEXP, (m: any, phs: string, tmpl: string): string => {\n      const content = phs || tmpl;\n      const placeholders: PostprocessPlaceholder[] = matches[content] || [];\n      if (!placeholders.length) {\n        content.split('|').forEach((placeholder: string) => {\n          const match = placeholder.match(PP_TEMPLATE_ID_REGEXP);\n          const templateId = match ? parseInt(match[1], 10) : ROOT_TEMPLATE_ID;\n          const isCloseTemplateTag = PP_CLOSE_TEMPLATE_REGEXP.test(placeholder);\n          placeholders.push([templateId, isCloseTemplateTag, placeholder]);\n        });\n        matches[content] = placeholders;\n      }\n\n      if (!placeholders.length) {\n        throw new Error(`i18n postprocess: unmatched placeholder - ${content}`);\n      }\n\n      const currentTemplateId = templateIdsStack[templateIdsStack.length - 1];\n      let idx = 0;\n      // find placeholder index that matches current template id\n      for (let i = 0; i < placeholders.length; i++) {\n        if (placeholders[i][0] === currentTemplateId) {\n          idx = i;\n          break;\n        }\n      }\n      // update template id stack based on the current tag extracted\n      const [templateId, isCloseTemplateTag, placeholder] = placeholders[idx];\n      if (isCloseTemplateTag) {\n        templateIdsStack.pop();\n      } else if (currentTemplateId !== templateId) {\n        templateIdsStack.push(templateId);\n      }\n      // remove processed tag from the list\n      placeholders.splice(idx, 1);\n      return placeholder;\n    });\n  }\n\n  // return current result if no replacements specified\n  if (!Object.keys(replacements).length) {\n    return result;\n  }\n\n  /**\n   * Step 2: replace all ICU vars (like \"VAR_PLURAL\")\n   */\n  result = result.replace(PP_ICU_VARS_REGEXP, (match, start, key, _type, _idx, end): string => {\n    return replacements.hasOwnProperty(key) ? `${start}${replacements[key]}${end}` : match;\n  });\n\n  /**\n   * Step 3: replace all placeholders used inside ICUs in a form of {PLACEHOLDER}\n   */\n  result = result.replace(PP_ICU_PLACEHOLDERS_REGEXP, (match, key): string => {\n    return replacements.hasOwnProperty(key) ? (replacements[key] as string) : match;\n  });\n\n  /**\n   * Step 4: replace all ICU references with corresponding values (like �ICU_EXP_ICU_1�) in case\n   * multiple ICUs have the same placeholder name\n   */\n  result = result.replace(PP_ICUS_REGEXP, (match, key): string => {\n    if (replacements.hasOwnProperty(key)) {\n      const list = replacements[key] as string[];\n      if (!list.length) {\n        throw new Error(`i18n postprocess: unmatched ICU - ${match} with key: ${key}`);\n      }\n      return list.shift()!;\n    }\n    return match;\n  });\n\n  return result;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport '../../util/ng_dev_mode';\nimport '../../util/ng_i18n_closure_mode';\n\nimport {prepareI18nBlockForHydration} from '../../hydration/i18n';\nimport {assertDefined} from '../../util/assert';\nimport {bindingUpdated} from '../bindings';\nimport {applyCreateOpCodes, applyI18n, setMaskBit} from '../i18n/i18n_apply';\nimport {i18nAttributesFirstPass, i18nStartFirstCreatePass} from '../i18n/i18n_parse';\nimport {i18nPostprocess} from '../i18n/i18n_postprocess';\nimport {TI18n} from '../interfaces/i18n';\nimport {TElementNode, TNodeType} from '../interfaces/node';\nimport {\n  DECLARATION_COMPONENT_VIEW,\n  FLAGS,\n  HEADER_OFFSET,\n  LViewFlags,\n  T_HOST,\n  TViewType,\n} from '../interfaces/view';\nimport {getClosestRElement} from '../node_manipulation';\nimport {\n  getCurrentParentTNode,\n  getLView,\n  getTView,\n  nextBindingIndex,\n  setInI18nBlock,\n} from '../state';\nimport {getConstant} from '../util/view_utils';\n\n/**\n * Marks a block of text as translatable.\n *\n * The instructions `i18nStart` and `i18nEnd` mark the translation block in the template.\n * The translation `message` is the value which is locale specific. The translation string may\n * contain placeholders which associate inner elements and sub-templates within the translation.\n *\n * The translation `message` placeholders are:\n * - `�{index}(:{block})�`: *Binding Placeholder*: Marks a location where an expression will be\n *   interpolated into. The placeholder `index` points to the expression binding index. An optional\n *   `block` that matches the sub-template in which it was declared.\n * - `�#{index}(:{block})�`/`�/#{index}(:{block})�`: *Element Placeholder*:  Marks the beginning\n *   and end of DOM element that were embedded in the original translation block. The placeholder\n *   `index` points to the element index in the template instructions set. An optional `block` that\n *   matches the sub-template in which it was declared.\n * - `�*{index}:{block}�`/`�/*{index}:{block}�`: *Sub-template Placeholder*: Sub-templates must be\n *   split up and translated separately in each angular template function. The `index` points to the\n *   `template` instruction index. A `block` that matches the sub-template in which it was declared.\n *\n * @param index A unique index of the translation in the static block.\n * @param messageIndex An index of the translation message from the `def.consts` array.\n * @param subTemplateIndex Optional sub-template index in the `message`.\n *\n * @codeGenApi\n */\nexport function ɵɵi18nStart(\n  index: number,\n  messageIndex: number,\n  subTemplateIndex: number = -1,\n): void {\n  const tView = getTView();\n  const lView = getLView();\n  const adjustedIndex = HEADER_OFFSET + index;\n  ngDevMode && assertDefined(tView, `tView should be defined`);\n  const message = getConstant<string>(tView.consts, messageIndex)!;\n  const parentTNode = getCurrentParentTNode() as TElementNode | null;\n  if (tView.firstCreatePass) {\n    i18nStartFirstCreatePass(\n      tView,\n      parentTNode === null ? 0 : parentTNode.index,\n      lView,\n      adjustedIndex,\n      message,\n      subTemplateIndex,\n    );\n  }\n\n  // Set a flag that this LView has i18n blocks.\n  // The flag is later used to determine whether this component should\n  // be hydrated (currently hydration is not supported for i18n blocks).\n  if (tView.type === TViewType.Embedded) {\n    // Annotate host component's LView (not embedded view's LView),\n    // since hydration can be skipped on per-component basis only.\n    const componentLView = lView[DECLARATION_COMPONENT_VIEW];\n    componentLView[FLAGS] |= LViewFlags.HasI18n;\n  } else {\n    lView[FLAGS] |= LViewFlags.HasI18n;\n  }\n\n  const tI18n = tView.data[adjustedIndex] as TI18n;\n  const sameViewParentTNode = parentTNode === lView[T_HOST] ? null : parentTNode;\n  const parentRNode = getClosestRElement(tView, sameViewParentTNode, lView);\n  // If `parentTNode` is an `ElementContainer` than it has `<!--ng-container--->`.\n  // When we do inserts we have to make sure to insert in front of `<!--ng-container--->`.\n  const insertInFrontOf =\n    parentTNode && parentTNode.type & TNodeType.ElementContainer ? lView[parentTNode.index] : null;\n  prepareI18nBlockForHydration(lView, adjustedIndex, parentTNode, subTemplateIndex);\n  applyCreateOpCodes(lView, tI18n.create, parentRNode, insertInFrontOf);\n  setInI18nBlock(true);\n}\n\n/**\n * Translates a translation block marked by `i18nStart` and `i18nEnd`. It inserts the text/ICU nodes\n * into the render tree, moves the placeholder nodes and removes the deleted nodes.\n *\n * @codeGenApi\n */\nexport function ɵɵi18nEnd(): void {\n  setInI18nBlock(false);\n}\n\n/**\n *\n * Use this instruction to create a translation block that doesn't contain any placeholder.\n * It calls both {@link i18nStart} and {@link i18nEnd} in one instruction.\n *\n * The translation `message` is the value which is locale specific. The translation string may\n * contain placeholders which associate inner elements and sub-templates within the translation.\n *\n * The translation `message` placeholders are:\n * - `�{index}(:{block})�`: *Binding Placeholder*: Marks a location where an expression will be\n *   interpolated into. The placeholder `index` points to the expression binding index. An optional\n *   `block` that matches the sub-template in which it was declared.\n * - `�#{index}(:{block})�`/`�/#{index}(:{block})�`: *Element Placeholder*:  Marks the beginning\n *   and end of DOM element that were embedded in the original translation block. The placeholder\n *   `index` points to the element index in the template instructions set. An optional `block` that\n *   matches the sub-template in which it was declared.\n * - `�*{index}:{block}�`/`�/*{index}:{block}�`: *Sub-template Placeholder*: Sub-templates must be\n *   split up and translated separately in each angular template function. The `index` points to the\n *   `template` instruction index. A `block` that matches the sub-template in which it was declared.\n *\n * @param index A unique index of the translation in the static block.\n * @param messageIndex An index of the translation message from the `def.consts` array.\n * @param subTemplateIndex Optional sub-template index in the `message`.\n *\n * @codeGenApi\n */\nexport function ɵɵi18n(index: number, messageIndex: number, subTemplateIndex?: number): void {\n  ɵɵi18nStart(index, messageIndex, subTemplateIndex);\n  ɵɵi18nEnd();\n}\n\n/**\n * Marks a list of attributes as translatable.\n *\n * @param index A unique index in the static block\n * @param values\n *\n * @codeGenApi\n */\nexport function ɵɵi18nAttributes(index: number, attrsIndex: number): void {\n  const tView = getTView();\n  ngDevMode && assertDefined(tView, `tView should be defined`);\n  const attrs = getConstant<string[]>(tView.consts, attrsIndex)!;\n  i18nAttributesFirstPass(tView, index + HEADER_OFFSET, attrs);\n}\n\n/**\n * Stores the values of the bindings during each update cycle in order to determine if we need to\n * update the translated nodes.\n *\n * @param value The binding's value\n * @returns This function returns itself so that it may be chained\n * (e.g. `i18nExp(ctx.name)(ctx.title)`)\n *\n * @codeGenApi\n */\nexport function ɵɵi18nExp<T>(value: T): typeof ɵɵi18nExp {\n  const lView = getLView();\n  setMaskBit(bindingUpdated(lView, nextBindingIndex(), value));\n  return ɵɵi18nExp;\n}\n\n/**\n * Updates a translation block or an i18n attribute when the bindings have changed.\n *\n * @param index Index of either {@link i18nStart} (translation block) or {@link i18nAttributes}\n * (i18n attribute) on which it should update the content.\n *\n * @codeGenApi\n */\nexport function ɵɵi18nApply(index: number) {\n  applyI18n(getTView(), getLView(), index + HEADER_OFFSET);\n}\n\n/**\n * Handles message string post-processing for internationalization.\n *\n * Handles message string post-processing by transforming it from intermediate\n * format (that might contain some markers that we need to replace) to the final\n * form, consumable by i18nStart instruction. Post processing steps include:\n *\n * 1. Resolve all multi-value cases (like [�*1:1��#2:1�|�#4:1�|�5�])\n * 2. Replace all ICU vars (like \"VAR_PLURAL\")\n * 3. Replace all placeholders used inside ICUs in a form of {PLACEHOLDER}\n * 4. Replace all ICU references with corresponding values (like �ICU_EXP_ICU_1�)\n *    in case multiple ICUs have the same placeholder name\n *\n * @param message Raw translation string for post processing\n * @param replacements Set of replacements that should be applied\n *\n * @returns Transformed string that can be consumed by i18nStart instruction\n *\n * @codeGenApi\n */\nexport function ɵɵi18nPostprocess(\n  message: string,\n  replacements: {[key: string]: string | string[]} = {},\n): string {\n  return i18nPostprocess(message, replacements);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '@angular/core/primitives/signals';\n\nimport {NotificationSource} from '../../change_detection/scheduling/zoneless_scheduling';\nimport {TNode} from '../interfaces/node';\nimport {isComponentHost} from '../interfaces/type_checks';\nimport {CONTEXT, INJECTOR, LView} from '../interfaces/view';\nimport {getComponentLViewByIndex} from '../util/view_utils';\nimport {profiler} from '../profiler';\nimport {ProfilerEvent} from '../profiler_types';\nimport {ErrorHandler} from '../../error_handler';\nimport {markViewDirty} from '../instructions/mark_view_dirty';\n\n/**\n * Wraps an event listener with a function that marks ancestors dirty and prevents default behavior,\n * if applicable.\n *\n * @param tNode The TNode associated with this listener\n * @param lView The LView that contains this listener\n * @param listenerFn The listener function to call\n * @param wrapWithPreventDefault Whether or not to prevent default behavior\n * (the procedural renderer does this already, so in those cases, we should skip)\n */\nexport function wrapListener(\n  tNode: TNode,\n  lView: LView<{} | null>,\n  listenerFn: (e?: any) => any,\n): EventListener {\n  // Note: we are performing most of the work in the listener function itself\n  // to optimize listener registration.\n  return function wrapListenerIn_markDirtyAndPreventDefault(e: any) {\n    // Ivy uses `Function` as a special token that allows us to unwrap the function\n    // so that it can be invoked programmatically by `DebugNode.triggerEventHandler`.\n    if (e === Function) {\n      return listenerFn;\n    }\n\n    // In order to be backwards compatible with View Engine, events on component host nodes\n    // must also mark the component view itself dirty (i.e. the view that it owns).\n    const startView = isComponentHost(tNode) ? getComponentLViewByIndex(tNode.index, lView) : lView;\n    markViewDirty(startView, NotificationSource.Listener);\n\n    const context = lView[CONTEXT];\n    let result = executeListenerWithErrorHandling(lView, context, listenerFn, e);\n    // A just-invoked listener function might have coalesced listeners so we need to check for\n    // their presence and invoke as needed.\n    let nextListenerFn = (<any>wrapListenerIn_markDirtyAndPreventDefault).__ngNextListenerFn__;\n    while (nextListenerFn) {\n      // We should prevent default if any of the listeners explicitly return false\n      result = executeListenerWithErrorHandling(lView, context, nextListenerFn, e) && result;\n      nextListenerFn = (<any>nextListenerFn).__ngNextListenerFn__;\n    }\n\n    return result;\n  };\n}\n\nfunction executeListenerWithErrorHandling(\n  lView: LView,\n  context: {} | null,\n  listenerFn: (e?: any) => any,\n  e: any,\n): boolean {\n  const prevConsumer = setActiveConsumer(null);\n  try {\n    profiler(ProfilerEvent.OutputStart, context, listenerFn);\n    // Only explicitly returning false from a listener should preventDefault\n    return listenerFn(e) !== false;\n  } catch (error) {\n    // TODO(atscott): This should report to the application error handler, not the ErrorHandler on LView injector\n    handleError(lView, error);\n    return false;\n  } finally {\n    profiler(ProfilerEvent.OutputEnd, context, listenerFn);\n    setActiveConsumer(prevConsumer);\n  }\n}\n\n/** Handles an error thrown in an LView. */\nfunction handleError(lView: LView, error: any): void {\n  const injector = lView[INJECTOR];\n  const errorHandler = injector ? injector.get(ErrorHandler, null) : null;\n  errorHandler && errorHandler.handleError(error);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertIndexInRange} from '../../util/assert';\nimport {DirectiveDef} from '../interfaces/definition';\nimport {TNode} from '../interfaces/node';\nimport {LView, TVIEW} from '../interfaces/view';\nimport {getOrCreateLViewCleanup, getOrCreateTViewCleanup} from '../util/view_utils';\nimport {wrapListener} from './listeners';\n\n/** Describes a subscribable output field value. */\ninterface SubscribableOutput<T> {\n  subscribe(listener: (v: T) => void): {unsubscribe: () => void};\n}\n\nexport function createOutputListener<T = unknown>(\n  tNode: TNode,\n  lView: LView<{} | null>,\n  listenerFn: (e?: any) => any,\n  targetDef: DirectiveDef<unknown>,\n  eventName: string,\n) {\n  // TODO(pk): decouple checks from the actual binding\n  const wrappedListener = wrapListener(tNode, lView, listenerFn);\n\n  listenToDirectiveOutput(tNode, lView, targetDef, eventName, wrappedListener);\n}\n\n/** Listens to an output on a specific directive. */\nfunction listenToDirectiveOutput(\n  tNode: TNode,\n  lView: LView,\n  target: DirectiveDef<unknown>,\n  eventName: string,\n  listenerFn: (e?: any) => any,\n): boolean {\n  let hostIndex: number | null = null;\n  let hostDirectivesStart: number | null = null;\n  let hostDirectivesEnd: number | null = null;\n  let hasOutput = false;\n\n  if (ngDevMode && !tNode.directiveToIndex?.has(target.type)) {\n    throw new Error(`Node does not have a directive with type ${target.type.name}`);\n  }\n\n  const data = tNode.directiveToIndex!.get(target.type)!;\n\n  if (typeof data === 'number') {\n    hostIndex = data;\n  } else {\n    [hostIndex, hostDirectivesStart, hostDirectivesEnd] = data;\n  }\n\n  if (\n    hostDirectivesStart !== null &&\n    hostDirectivesEnd !== null &&\n    tNode.hostDirectiveOutputs?.hasOwnProperty(eventName)\n  ) {\n    const hostDirectiveOutputs = tNode.hostDirectiveOutputs[eventName];\n\n    for (let i = 0; i < hostDirectiveOutputs.length; i += 2) {\n      const index = hostDirectiveOutputs[i] as number;\n\n      if (index >= hostDirectivesStart && index <= hostDirectivesEnd) {\n        ngDevMode && assertIndexInRange(lView, index);\n        hasOutput = true;\n        listenToOutput(\n          tNode,\n          lView,\n          index,\n          hostDirectiveOutputs[i + 1] as string,\n          eventName,\n          listenerFn,\n        );\n      } else if (index > hostDirectivesEnd) {\n        break;\n      }\n    }\n  }\n\n  if (target.outputs.hasOwnProperty(eventName)) {\n    ngDevMode && assertIndexInRange(lView, hostIndex);\n    hasOutput = true;\n    listenToOutput(tNode, lView, hostIndex, eventName, eventName, listenerFn);\n  }\n\n  return hasOutput;\n}\n\nexport function listenToOutput(\n  tNode: TNode,\n  lView: LView,\n  directiveIndex: number,\n  lookupName: string,\n  eventName: string,\n  listenerFn: (e?: any) => any,\n) {\n  ngDevMode && assertIndexInRange(lView, directiveIndex);\n  const instance = lView[directiveIndex];\n  const tView = lView[TVIEW];\n  const def = tView.data[directiveIndex] as DirectiveDef<unknown>;\n  const propertyName = def.outputs[lookupName];\n  const output = instance[propertyName];\n\n  if (ngDevMode && !isOutputSubscribable(output)) {\n    throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`);\n  }\n\n  // TODO(pk): introduce utility to store cleanup or find a different way of sharing code with listener\n  const tCleanup = tView.firstCreatePass ? getOrCreateTViewCleanup(tView) : null;\n  const lCleanup = getOrCreateLViewCleanup(lView);\n  const subscription = (output as SubscribableOutput<unknown>).subscribe(listenerFn);\n  const idx = lCleanup.length;\n  lCleanup.push(listenerFn, subscription);\n  tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));\n}\n\n/**\n * Whether the given value represents a subscribable output.\n *\n * For example, an `EventEmitter, a `Subject`, an `Observable` or an\n * `OutputEmitter`.\n */\nfunction isOutputSubscribable(value: unknown): value is SubscribableOutput<unknown> {\n  return (\n    value != null && typeof (value as Partial<SubscribableOutput<unknown>>).subscribe === 'function'\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {stashEventListenerImpl} from '../../event_delegation_utils';\nimport {TNode, TNodeType} from '../interfaces/node';\nimport {GlobalTargetResolver, Renderer} from '../interfaces/renderer';\nimport {RElement} from '../interfaces/renderer_dom';\nimport {isDirectiveHost} from '../interfaces/type_checks';\nimport {CLEANUP, LView, RENDERER, TView} from '../interfaces/view';\nimport {assertTNodeType} from '../node_assert';\nimport {getCurrentDirectiveDef, getCurrentTNode, getLView, getTView} from '../state';\nimport {\n  getNativeByTNode,\n  getOrCreateLViewCleanup,\n  getOrCreateTViewCleanup,\n  unwrapRNode,\n} from '../util/view_utils';\n\nimport {listenToOutput} from '../view/directive_outputs';\nimport {wrapListener} from '../view/listeners';\nimport {loadComponentRenderer} from './shared';\n\n/**\n * Adds an event listener to the current node.\n *\n * If an output exists on one of the node's directives, it also subscribes to the output\n * and saves the subscription for later cleanup.\n *\n * @param eventName Name of the event\n * @param listenerFn The function to be called when event emits\n * @param useCapture Whether or not to use capture in event listener - this argument is a reminder\n *     from the Renderer3 infrastructure and should be removed from the instruction arguments\n * @param eventTargetResolver Function that returns global target information in case this listener\n * should be attached to a global object like window, document or body\n *\n * @codeGenApi\n */\nexport function ɵɵlistener(\n  eventName: string,\n  listenerFn: (e?: any) => any,\n  useCapture?: boolean,\n  eventTargetResolver?: GlobalTargetResolver,\n): typeof ɵɵlistener {\n  const lView = getLView<{} | null>();\n  const tView = getTView();\n  const tNode = getCurrentTNode()!;\n  listenerInternal(\n    tView,\n    lView,\n    lView[RENDERER],\n    tNode,\n    eventName,\n    listenerFn,\n    eventTargetResolver,\n  );\n  return ɵɵlistener;\n}\n\n/**\n * Registers a synthetic host listener (e.g. `(@foo.start)`) on a component or directive.\n *\n * This instruction is for compatibility purposes and is designed to ensure that a\n * synthetic host listener (e.g. `@HostListener('@foo.start')`) properly gets rendered\n * in the component's renderer. Normally all host listeners are evaluated with the\n * parent component's renderer, but, in the case of animation @triggers, they need\n * to be evaluated with the sub component's renderer (because that's where the\n * animation triggers are defined).\n *\n * Do not use this instruction as a replacement for `listener`. This instruction\n * only exists to ensure compatibility with the ViewEngine's host binding behavior.\n *\n * @param eventName Name of the event\n * @param listenerFn The function to be called when event emits\n * @param useCapture Whether or not to use capture in event listener\n * @param eventTargetResolver Function that returns global target information in case this listener\n * should be attached to a global object like window, document or body\n *\n * @codeGenApi\n */\nexport function ɵɵsyntheticHostListener(\n  eventName: string,\n  listenerFn: (e?: any) => any,\n): typeof ɵɵsyntheticHostListener {\n  const tNode = getCurrentTNode()!;\n  const lView = getLView<{} | null>();\n  const tView = getTView();\n  const currentDef = getCurrentDirectiveDef(tView.data);\n  const renderer = loadComponentRenderer(currentDef, tNode, lView);\n  listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn);\n  return ɵɵsyntheticHostListener;\n}\n\n/**\n * A utility function that checks if a given element has already an event handler registered for an\n * event with a specified name. The TView.cleanup data structure is used to find out which events\n * are registered for a given element.\n */\nfunction findExistingListener(\n  tView: TView,\n  lView: LView,\n  eventName: string,\n  tNodeIdx: number,\n): ((e?: any) => any) | null {\n  const tCleanup = tView.cleanup;\n  if (tCleanup != null) {\n    for (let i = 0; i < tCleanup.length - 1; i += 2) {\n      const cleanupEventName = tCleanup[i];\n      if (cleanupEventName === eventName && tCleanup[i + 1]    === tNodeIdx) {\n        // We have found a matching event name on the same node but it might not have been\n        // registered yet, so we must explicitly verify entries in the LView cleanup data\n        // structures.\n        const lCleanup = lView[CLEANUP]!;\n        const listenerIdxInLCleanup = tCleanup[i + 2];\n        return lCleanup.length > listenerIdxInLCleanup ? lCleanup[listenerIdxInLCleanup] : null;\n      }\n      // TView.cleanup can have a mix of 4-elements entries (for event handler cleanups) or\n      // 2-element entries (for directive and queries destroy hooks). As such we can encounter\n      // blocks of 4 or 2 items in the tView.cleanup and this is why we iterate over 2 elements\n      // first and jump another 2 elements if we detect listeners cleanup (4 elements). Also check\n      // documentation of TView.cleanup for more details of this data structure layout.\n      if (typeof cleanupEventName === 'string') {\n        i += 2;\n      }\n    }\n  }\n  return null;\n}\n\nexport function listenerInternal(\n  tView: TView,\n  lView: LView<{} | null>,\n  renderer: Renderer,\n  tNode: TNode,\n  eventName: string,\n  listenerFn: (e?: any) => any,\n  eventTargetResolver?: GlobalTargetResolver,\n): void {\n  const isTNodeDirectiveHost = isDirectiveHost(tNode);\n  const firstCreatePass = tView.firstCreatePass;\n  const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null;\n\n  // When the ɵɵlistener instruction was generated and is executed we know that there is either a\n  // native listener or a directive output on this element. As such we we know that we will have to\n  // register a listener and store its cleanup function on LView.\n  const lCleanup = getOrCreateLViewCleanup(lView);\n\n  ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode | TNodeType.AnyContainer);\n\n  let processOutputs = true;\n\n  // Adding a native event listener is applicable when:\n  // - The corresponding TNode represents a DOM element.\n  // - The event target has a resolver (usually resulting in a global object,\n  //   such as `window` or `document`).\n  if (tNode.type & TNodeType.AnyRNode || eventTargetResolver) {\n    const native = getNativeByTNode(tNode, lView) as RElement;\n    const target = eventTargetResolver ? eventTargetResolver(native) : native;\n    const lCleanupIndex = lCleanup.length;\n    const idxOrTargetGetter = eventTargetResolver\n      ? (_lView: LView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))\n      : tNode.index;\n\n    // In order to match current behavior, native DOM event listeners must be added for all\n    // events (including outputs).\n\n    // There might be cases where multiple directives on the same element try to register an event\n    // handler function for the same event. In this situation we want to avoid registration of\n    // several native listeners as each registration would be intercepted by NgZone and\n    // trigger change detection. This would mean that a single user action would result in several\n    // change detections being invoked. To avoid this situation we want to have only one call to\n    // native handler registration (for the same element and same type of event).\n    //\n    // In order to have just one native event handler in presence of multiple handler functions,\n    // we just register a first handler function as a native event listener and then chain\n    // (coalesce) other handler functions on top of the first native handler function.\n    let existingListener = null;\n    // Please note that the coalescing described here doesn't happen for events specifying an\n    // alternative target (ex. (document:click)) - this is to keep backward compatibility with the\n    // view engine.\n    // Also, we don't have to search for existing listeners is there are no directives\n    // matching on a given node as we can't register multiple event handlers for the same event in\n    // a template (this would mean having duplicate attributes).\n    if (!eventTargetResolver && isTNodeDirectiveHost) {\n      existingListener = findExistingListener(tView, lView, eventName, tNode.index);\n    }\n    if (existingListener !== null) {\n      // Attach a new listener to coalesced listeners list, maintaining the order in which\n      // listeners are registered. For performance reasons, we keep a reference to the last\n      // listener in that list (in `__ngLastListenerFn__` field), so we can avoid going through\n      // the entire set each time we need to add a new listener.\n      const lastListenerFn = (<any>existingListener).__ngLastListenerFn__ || existingListener;\n      lastListenerFn.__ngNextListenerFn__ = listenerFn;\n      (<any>existingListener).__ngLastListenerFn__ = listenerFn;\n      processOutputs = false;\n    } else {\n      listenerFn = wrapListener(tNode, lView, listenerFn);\n      stashEventListenerImpl(lView, target, eventName, listenerFn);\n      const cleanupFn = renderer.listen(target as RElement, eventName, listenerFn);\n      ngDevMode && ngDevMode.rendererAddEventListener++;\n\n      lCleanup.push(listenerFn, cleanupFn);\n      tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, lCleanupIndex + 1);\n    }\n  } else {\n    // Even if there is no native listener to add, we still need to wrap the listener so that OnPush\n    // ancestors are marked dirty when an event occurs.\n    listenerFn = wrapListener(tNode, lView, listenerFn);\n  }\n\n  if (processOutputs) {\n    const outputConfig = tNode.outputs?.[eventName];\n    const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName];\n\n    if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) {\n      for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) {\n        const index = hostDirectiveOutputConfig[i] as number;\n        const lookupName = hostDirectiveOutputConfig[i + 1] as string;\n        listenToOutput(tNode, lView, index, lookupName, eventName, listenerFn);\n      }\n    }\n\n    if (outputConfig && outputConfig.length) {\n      for (const index of outputConfig) {\n        listenToOutput(tNode, lView, index, eventName, eventName, listenerFn);\n      }\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {nextContextImpl} from '../state';\n\n/**\n * Retrieves a context at the level specified and saves it as the global, contextViewData.\n * Will get the next level up if level is not specified.\n *\n * This is used to save contexts of parent views so they can be bound in embedded views, or\n * in conjunction with reference() to bind a ref from a parent view.\n *\n * @param level The relative level of the view from which to grab context compared to contextVewData\n * @returns context\n *\n * @codeGenApi\n */\nexport function ɵɵnextContext<T = any>(level: number = 1): T {\n  return nextContextImpl(level);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {findMatchingDehydratedView} from '../../hydration/views';\nimport {isDetachedByI18n} from '../../i18n/utils';\nimport {newArray} from '../../util/array_utils';\nimport {assertLContainer, assertTNode} from '../assert';\nimport {ComponentTemplate} from '../interfaces/definition';\nimport {TAttributes, TElementNode, TNode, TNodeType} from '../interfaces/node';\nimport {ProjectionSlots} from '../interfaces/projection';\nimport {\n  DECLARATION_COMPONENT_VIEW,\n  HEADER_OFFSET,\n  HYDRATION,\n  LView,\n  T_HOST,\n  TView,\n} from '../interfaces/view';\nimport {applyProjection} from '../node_manipulation';\nimport {\n  getProjectAsAttrValue,\n  isNodeMatchingSelectorList,\n  isSelectorInSelectorList,\n} from '../node_selector_matcher';\nimport {getLView, getTView, isInSkipHydrationBlock, setCurrentTNodeAsNotParent} from '../state';\nimport {getOrCreateTNode} from '../tnode_manipulation';\nimport {addLViewToLContainer} from '../view/container';\nimport {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../view_manipulation';\n\nimport {declareTemplate} from './template';\n\n/**\n * Checks a given node against matching projection slots and returns the\n * determined slot index. Returns \"null\" if no slot matched the given node.\n *\n * This function takes into account the parsed ngProjectAs selector from the\n * node's attributes. If present, it will check whether the ngProjectAs selector\n * matches any of the projection slot selectors.\n */\nexport function matchingProjectionSlotIndex(\n  tNode: TNode,\n  projectionSlots: ProjectionSlots,\n): number | null {\n  let wildcardNgContentIndex = null;\n  const ngProjectAsAttrVal = getProjectAsAttrValue(tNode);\n  for (let i = 0; i < projectionSlots.length; i++) {\n    const slotValue = projectionSlots[i];\n    // The last wildcard projection slot should match all nodes which aren't matching\n    // any selector. This is necessary to be backwards compatible with view engine.\n    if (slotValue === '*') {\n      wildcardNgContentIndex = i;\n      continue;\n    }\n    // If we ran into an `ngProjectAs` attribute, we should match its parsed selector\n    // to the list of selectors, otherwise we fall back to matching against the node.\n    if (\n      ngProjectAsAttrVal === null\n        ? isNodeMatchingSelectorList(tNode, slotValue, /* isProjectionMode */ true)\n        : isSelectorInSelectorList(ngProjectAsAttrVal, slotValue)\n    ) {\n      return i; // first matching selector \"captures\" a given node\n    }\n  }\n  return wildcardNgContentIndex;\n}\n\n/**\n * Instruction to distribute projectable nodes among <ng-content> occurrences in a given template.\n * It takes all the selectors from the entire component's template and decides where\n * each projected node belongs (it re-distributes nodes among \"buckets\" where each \"bucket\" is\n * backed by a selector).\n *\n * This function requires CSS selectors to be provided in 2 forms: parsed (by a compiler) and text,\n * un-parsed form.\n *\n * The parsed form is needed for efficient matching of a node against a given CSS selector.\n * The un-parsed, textual form is needed for support of the ngProjectAs attribute.\n *\n * Having a CSS selector in 2 different formats is not ideal, but alternatives have even more\n * drawbacks:\n * - having only a textual form would require runtime parsing of CSS selectors;\n * - we can't have only a parsed as we can't re-construct textual form from it (as entered by a\n * template author).\n *\n * @param projectionSlots? A collection of projection slots. A projection slot can be based\n *        on a parsed CSS selectors or set to the wildcard selector (\"*\") in order to match\n *        all nodes which do not match any selector. If not specified, a single wildcard\n *        selector projection slot will be defined.\n *\n * @codeGenApi\n */\nexport function ɵɵprojectionDef(projectionSlots?: ProjectionSlots): void {\n  const componentNode = getLView()[DECLARATION_COMPONENT_VIEW][T_HOST] as TElementNode;\n\n  if (!componentNode.projection) {\n    // If no explicit projection slots are defined, fall back to a single\n    // projection slot with the wildcard selector.\n    const numProjectionSlots = projectionSlots ? projectionSlots.length : 1;\n    const projectionHeads: (TNode | null)[] = (componentNode.projection = newArray(\n      numProjectionSlots,\n      null! as TNode,\n    ));\n    const tails: (TNode | null)[] = projectionHeads.slice();\n\n    let componentChild: TNode | null = componentNode.child;\n\n    while (componentChild !== null) {\n      // Do not project let declarations so they don't occupy a slot.\n      if (componentChild.type !== TNodeType.LetDeclaration) {\n        const slotIndex = projectionSlots\n          ? matchingProjectionSlotIndex(componentChild, projectionSlots)\n          : 0;\n\n        if (slotIndex !== null) {\n          if (tails[slotIndex]) {\n            tails[slotIndex]!.projectionNext = componentChild;\n          } else {\n            projectionHeads[slotIndex] = componentChild;\n          }\n          tails[slotIndex] = componentChild;\n        }\n      }\n\n      componentChild = componentChild.next;\n    }\n  }\n}\n\n/**\n * Inserts previously re-distributed projected nodes. This instruction must be preceded by a call\n * to the projectionDef instruction.\n *\n * @param nodeIndex Index of the projection node.\n * @param selectorIndex Index of the slot selector.\n *  - 0 when the selector is `*` (or unspecified as this is the default value),\n *  - 1 based index of the selector from the {@link projectionDef}\n * @param attrs Static attributes set on the `ng-content` node.\n * @param fallbackTemplateFn Template function with fallback content.\n *   Will be rendered if the slot is empty at runtime.\n * @param fallbackDecls Number of declarations in the fallback template.\n * @param fallbackVars Number of variables in the fallback template.\n *\n * @codeGenApi\n */\nexport function ɵɵprojection(\n  nodeIndex: number,\n  selectorIndex: number = 0,\n  attrs?: TAttributes,\n  fallbackTemplateFn?: ComponentTemplate<unknown>,\n  fallbackDecls?: number,\n  fallbackVars?: number,\n): void {\n  const lView = getLView();\n  const tView = getTView();\n  const fallbackIndex = fallbackTemplateFn ? nodeIndex + 1 : null;\n\n  // Fallback content needs to be declared no matter whether the slot is empty since different\n  // instances of the component may or may not insert it. Also it needs to be declare *before*\n  // the projection node in order to work correctly with hydration.\n  if (fallbackIndex !== null) {\n    declareTemplate(\n      lView,\n      tView,\n      fallbackIndex,\n      fallbackTemplateFn!,\n      fallbackDecls!,\n      fallbackVars!,\n      null,\n      attrs,\n    );\n  }\n\n  const tProjectionNode = getOrCreateTNode(\n    tView,\n    HEADER_OFFSET + nodeIndex,\n    TNodeType.Projection,\n    null,\n    attrs || null,\n  );\n\n  // We can't use viewData[HOST_NODE] because projection nodes can be nested in embedded views.\n  if (tProjectionNode.projection === null) {\n    tProjectionNode.projection = selectorIndex;\n  }\n\n  // `<ng-content>` has no content. Even if there's fallback\n  // content, the fallback is shown next to it.\n  setCurrentTNodeAsNotParent();\n\n  const hydrationInfo = lView[HYDRATION];\n  const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock();\n  const componentHostNode = lView[DECLARATION_COMPONENT_VIEW][T_HOST] as TElementNode;\n  const isEmpty = componentHostNode.projection![tProjectionNode.projection] === null;\n\n  if (isEmpty && fallbackIndex !== null) {\n    insertFallbackContent(lView, tView, fallbackIndex);\n  } else if (isNodeCreationMode && !isDetachedByI18n(tProjectionNode)) {\n    // re-distribution of projectable nodes is stored on a component's view level\n    applyProjection(tView, lView, tProjectionNode);\n  }\n}\n\n/** Inserts the fallback content of a projection slot. Assumes there's no projected content. */\nfunction insertFallbackContent(lView: LView, tView: TView, fallbackIndex: number) {\n  const adjustedIndex = HEADER_OFFSET + fallbackIndex;\n  const fallbackTNode = tView.data[adjustedIndex] as TNode;\n  const fallbackLContainer = lView[adjustedIndex];\n  ngDevMode && assertTNode(fallbackTNode);\n  ngDevMode && assertLContainer(fallbackLContainer);\n\n  const dehydratedView = findMatchingDehydratedView(fallbackLContainer, fallbackTNode.tView!.ssrId);\n  const fallbackLView = createAndRenderEmbeddedLView(lView, fallbackTNode, undefined, {\n    dehydratedView,\n  });\n  addLViewToLContainer(\n    fallbackLContainer,\n    fallbackLView,\n    0,\n    shouldAddViewToDom(fallbackTNode, dehydratedView),\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {RENDERER} from '../interfaces/view';\nimport {getBindingIndex, getLView, getSelectedTNode, getTView} from '../state';\nimport {NO_CHANGE} from '../tokens';\n\nimport {\n  interpolation1,\n  interpolation2,\n  interpolation3,\n  interpolation4,\n  interpolation5,\n  interpolation6,\n  interpolation7,\n  interpolation8,\n  interpolationV,\n} from './interpolation';\nimport {elementPropertyInternal, storePropertyBindingMetadata} from './shared';\n\n/**\n *\n * Update an interpolated property on an element with a lone bound value\n *\n * Used when the value passed to a property has 1 interpolated value in it, an no additional text\n * surrounds that interpolated value:\n *\n * ```html\n * <div title=\"{{v0}}\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate('title', v0);\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate(\n  propName: string,\n  v0: any,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate {\n  ɵɵpropertyInterpolate1(propName, '', v0, '', sanitizer);\n  return ɵɵpropertyInterpolate;\n}\n\n/**\n *\n * Update an interpolated property on an element with single bound value surrounded by text.\n *\n * Used when the value passed to a property has 1 interpolated value in it:\n *\n * ```html\n * <div title=\"prefix{{v0}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate1('title', 'prefix', v0, 'suffix');\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate1(\n  propName: string,\n  prefix: string,\n  v0: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate1 {\n  const lView = getLView();\n  const interpolatedValue = interpolation1(lView, prefix, v0, suffix);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - 1,\n        prefix,\n        suffix,\n      );\n  }\n  return ɵɵpropertyInterpolate1;\n}\n\n/**\n *\n * Update an interpolated property on an element with 2 bound values surrounded by text.\n *\n * Used when the value passed to a property has 2 interpolated values in it:\n *\n * ```html\n * <div title=\"prefix{{v0}}-{{v1}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate2('title', 'prefix', v0, '-', v1, 'suffix');\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate2(\n  propName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate2 {\n  const lView = getLView();\n  const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - 2,\n        prefix,\n        i0,\n        suffix,\n      );\n  }\n  return ɵɵpropertyInterpolate2;\n}\n\n/**\n *\n * Update an interpolated property on an element with 3 bound values surrounded by text.\n *\n * Used when the value passed to a property has 3 interpolated values in it:\n *\n * ```html\n * <div title=\"prefix{{v0}}-{{v1}}-{{v2}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate3(\n * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix');\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate3(\n  propName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate3 {\n  const lView = getLView();\n  const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - 3,\n        prefix,\n        i0,\n        i1,\n        suffix,\n      );\n  }\n  return ɵɵpropertyInterpolate3;\n}\n\n/**\n *\n * Update an interpolated property on an element with 4 bound values surrounded by text.\n *\n * Used when the value passed to a property has 4 interpolated values in it:\n *\n * ```html\n * <div title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate4(\n * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate4(\n  propName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate4 {\n  const lView = getLView();\n  const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - 4,\n        prefix,\n        i0,\n        i1,\n        i2,\n        suffix,\n      );\n  }\n  return ɵɵpropertyInterpolate4;\n}\n\n/**\n *\n * Update an interpolated property on an element with 5 bound values surrounded by text.\n *\n * Used when the value passed to a property has 5 interpolated values in it:\n *\n * ```html\n * <div title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate5(\n * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate5(\n  propName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate5 {\n  const lView = getLView();\n  const interpolatedValue = interpolation5(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    suffix,\n  );\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - 5,\n        prefix,\n        i0,\n        i1,\n        i2,\n        i3,\n        suffix,\n      );\n  }\n  return ɵɵpropertyInterpolate5;\n}\n\n/**\n *\n * Update an interpolated property on an element with 6 bound values surrounded by text.\n *\n * Used when the value passed to a property has 6 interpolated values in it:\n *\n * ```html\n * <div title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate6(\n *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate6(\n  propName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate6 {\n  const lView = getLView();\n  const interpolatedValue = interpolation6(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    suffix,\n  );\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - 6,\n        prefix,\n        i0,\n        i1,\n        i2,\n        i3,\n        i4,\n        suffix,\n      );\n  }\n  return ɵɵpropertyInterpolate6;\n}\n\n/**\n *\n * Update an interpolated property on an element with 7 bound values surrounded by text.\n *\n * Used when the value passed to a property has 7 interpolated values in it:\n *\n * ```html\n * <div title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate7(\n *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate7(\n  propName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate7 {\n  const lView = getLView();\n  const interpolatedValue = interpolation7(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    suffix,\n  );\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - 7,\n        prefix,\n        i0,\n        i1,\n        i2,\n        i3,\n        i4,\n        i5,\n        suffix,\n      );\n  }\n  return ɵɵpropertyInterpolate7;\n}\n\n/**\n *\n * Update an interpolated property on an element with 8 bound values surrounded by text.\n *\n * Used when the value passed to a property has 8 interpolated values in it:\n *\n * ```html\n * <div title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolate8(\n *  'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param i6 Static value used for concatenation only.\n * @param v7 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolate8(\n  propName: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  i6: string,\n  v7: any,\n  suffix: string,\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolate8 {\n  const lView = getLView();\n  const interpolatedValue = interpolation8(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    i6,\n    v7,\n    suffix,\n  );\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode &&\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - 8,\n        prefix,\n        i0,\n        i1,\n        i2,\n        i3,\n        i4,\n        i5,\n        i6,\n        suffix,\n      );\n  }\n  return ɵɵpropertyInterpolate8;\n}\n\n/**\n * Update an interpolated property on an element with 9 or more bound values surrounded by text.\n *\n * Used when the number of interpolated values exceeds 8.\n *\n * ```html\n * <div\n *  title=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix\"></div>\n * ```\n *\n * Its compiled representation is::\n *\n * ```ts\n * ɵɵpropertyInterpolateV(\n *  'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,\n *  'suffix']);\n * ```\n *\n * If the property name also exists as an input property on one of the element's directives,\n * the component property will be set instead of the element property. This check must\n * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.\n *\n * @param propName The name of the property to update.\n * @param values The collection of values and the strings in between those values, beginning with a\n * string prefix and ending with a string suffix.\n * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)\n * @param sanitizer An optional sanitizer function\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵpropertyInterpolateV(\n  propName: string,\n  values: any[],\n  sanitizer?: SanitizerFn,\n): typeof ɵɵpropertyInterpolateV {\n  const lView = getLView();\n  const interpolatedValue = interpolationV(lView, values);\n  if (interpolatedValue !== NO_CHANGE) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      interpolatedValue,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    if (ngDevMode) {\n      const interpolationInBetween = [values[0]]; // prefix\n      for (let i = 2; i < values.length; i += 2) {\n        interpolationInBetween.push(values[i]);\n      }\n      storePropertyBindingMetadata(\n        tView.data,\n        tNode,\n        propName,\n        getBindingIndex() - interpolationInBetween.length + 1,\n        ...interpolationInBetween,\n      );\n    }\n  }\n  return ɵɵpropertyInterpolateV;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ProviderToken} from '../../di';\nimport {unwrapElementRef} from '../../linker/element_ref';\nimport {QueryList} from '../../linker/query_list';\nimport {QueryFlags} from '../interfaces/query';\nimport {\n  createContentQuery,\n  createViewQuery,\n  getQueryResults,\n  getTQuery,\n  loadQueryInternal,\n} from '../queries/query';\nimport {getCurrentQueryIndex, getLView, getTView, setCurrentQueryIndex} from '../state';\nimport {isCreationMode} from '../util/view_utils';\n\n/**\n * Registers a QueryList, associated with a content query, for later refresh (part of a view\n * refresh).\n *\n * @param directiveIndex Current directive index\n * @param predicate The type for which the query will search\n * @param flags Flags associated with the query\n * @param read What to save in the query\n * @returns QueryList<T>\n *\n * @codeGenApi\n */\nexport function ɵɵcontentQuery<T>(\n  directiveIndex: number,\n  predicate: ProviderToken<unknown> | string | string[],\n  flags: QueryFlags,\n  read?: any,\n): void {\n  createContentQuery<T>(directiveIndex, predicate, flags, read);\n}\n\n/**\n * Creates a new view query by initializing internal data structures.\n *\n * @param predicate The type for which the query will search\n * @param flags Flags associated with the query\n * @param read What to save in the query\n *\n * @codeGenApi\n */\nexport function ɵɵviewQuery<T>(\n  predicate: ProviderToken<unknown> | string | string[],\n  flags: QueryFlags,\n  read?: any,\n): void {\n  createViewQuery(predicate, flags, read);\n}\n\n/**\n * Refreshes a query by combining matches from all active views and removing matches from deleted\n * views.\n *\n * @returns `true` if a query got dirty during change detection or if this is a static query\n * resolving in creation mode, `false` otherwise.\n *\n * @codeGenApi\n */\nexport function ɵɵqueryRefresh(queryList: QueryList<any>): boolean {\n  const lView = getLView();\n  const tView = getTView();\n  const queryIndex = getCurrentQueryIndex();\n\n  setCurrentQueryIndex(queryIndex + 1);\n\n  const tQuery = getTQuery(tView, queryIndex);\n  if (\n    queryList.dirty &&\n    isCreationMode(lView) ===\n      ((tQuery.metadata.flags & QueryFlags.isStatic) === QueryFlags.isStatic)\n  ) {\n    if (tQuery.matches === null) {\n      queryList.reset([]);\n    } else {\n      const result = getQueryResults(lView, queryIndex);\n      queryList.reset(result, unwrapElementRef);\n      queryList.notifyOnChanges();\n    }\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Loads a QueryList corresponding to the current view or content query.\n *\n * @codeGenApi\n */\nexport function ɵɵloadQuery<T>(): QueryList<T> {\n  return loadQueryInternal<T>(getLView(), getCurrentQueryIndex());\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ProviderToken} from '../../di/provider_token';\nimport {QueryFlags} from '../interfaces/query';\nimport {createContentQuery, createViewQuery} from '../queries/query';\nimport {bindQueryToSignal} from '../queries/query_reactive';\nimport {Signal} from '../reactivity/api';\nimport {getCurrentQueryIndex, setCurrentQueryIndex} from '../state';\n\n/**\n * Creates a new content query and binds it to a signal created by an authoring function.\n *\n * @param directiveIndex Current directive index\n * @param target The target signal to which the query should be bound\n * @param predicate The type for which the query will search\n * @param flags Flags associated with the query\n * @param read What to save in the query\n *\n * @codeGenApi\n */\nexport function ɵɵcontentQuerySignal<T>(\n  directiveIndex: number,\n  target: Signal<T>,\n  predicate: ProviderToken<unknown> | string[],\n  flags: QueryFlags,\n  read?: any,\n): void {\n  bindQueryToSignal(target, createContentQuery(directiveIndex, predicate, flags, read));\n}\n\n/**\n * Creates a new view query by initializing internal data structures and binding a new query to the\n * target signal.\n *\n * @param target The target signal to assign the query results to.\n * @param predicate The type or label that should match a given query\n * @param flags Flags associated with the query\n * @param read What to save in the query\n *\n * @codeGenApi\n */\nexport function ɵɵviewQuerySignal(\n  target: Signal<unknown>,\n  predicate: ProviderToken<unknown> | string[],\n  flags: QueryFlags,\n  read?: ProviderToken<unknown>,\n): void {\n  bindQueryToSignal(target, createViewQuery(predicate, flags, read));\n}\n\n/**\n * Advances the current query index by a specified offset.\n *\n * Adjusting the current query index is necessary in cases where a given directive has a mix of\n * zone-based and signal-based queries. The signal-based queries don't require tracking of the\n * current index (those are refreshed on demand and not during change detection) so this instruction\n * is only necessary for backward-compatibility.\n *\n * @param index offset to apply to the current query index (defaults to 1)\n *\n * @codeGenApi\n */\nexport function ɵɵqueryAdvance(indexOffset: number = 1): void {\n  setCurrentQueryIndex(getCurrentQueryIndex() + indexOffset);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {HEADER_OFFSET, LView, TView} from '../interfaces/view';\nimport {getContextLView} from '../state';\nimport {load} from '../util/view_utils';\n\n/**\n * Retrieves a local reference from the current contextViewData.\n *\n * If the reference to retrieve is in a parent view, this instruction is used in conjunction\n * with a nextContext() call, which walks up the tree and updates the contextViewData instance.\n *\n * @param index The index of the local ref in contextViewData.\n *\n * @codeGenApi\n */\nexport function ɵɵreference<T>(index: number) {\n  const contextLView = getContextLView();\n  return load<T>(contextLView, HEADER_OFFSET + index);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {getLView} from '../state';\nimport {\n  interpolation1,\n  interpolation2,\n  interpolation3,\n  interpolation4,\n  interpolation5,\n  interpolation6,\n  interpolation7,\n  interpolation8,\n  interpolationV,\n} from './interpolation';\nimport {ɵɵstyleMap} from './styling';\n\n/**\n *\n * Update an interpolated style on an element with single bound value surrounded by text.\n *\n * Used when the value passed to a property has 1 interpolated value in it:\n *\n * ```html\n * <div style=\"key: {{v0}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolate1('key: ', v0, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolate1(prefix: string, v0: any, suffix: string): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation1(lView, prefix, v0, suffix);\n  ɵɵstyleMap(interpolatedValue);\n}\n\n/**\n *\n * Update an interpolated style on an element with 2 bound values surrounded by text.\n *\n * Used when the value passed to a property has 2 interpolated values in it:\n *\n * ```html\n * <div style=\"key: {{v0}}; key1: {{v1}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolate2('key: ', v0, '; key1: ', v1, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolate2(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);\n  ɵɵstyleMap(interpolatedValue);\n}\n\n/**\n *\n * Update an interpolated style on an element with 3 bound values surrounded by text.\n *\n * Used when the value passed to a property has 3 interpolated values in it:\n *\n * ```html\n * <div style=\"key: {{v0}}; key2: {{v1}}; key2: {{v2}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolate3(\n *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolate3(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);\n  ɵɵstyleMap(interpolatedValue);\n}\n\n/**\n *\n * Update an interpolated style on an element with 4 bound values surrounded by text.\n *\n * Used when the value passed to a property has 4 interpolated values in it:\n *\n * ```html\n * <div style=\"key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolate4(\n *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolate4(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);\n  ɵɵstyleMap(interpolatedValue);\n}\n\n/**\n *\n * Update an interpolated style on an element with 5 bound values surrounded by text.\n *\n * Used when the value passed to a property has 5 interpolated values in it:\n *\n * ```html\n * <div style=\"key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolate5(\n *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolate5(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation5(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    suffix,\n  );\n  ɵɵstyleMap(interpolatedValue);\n}\n\n/**\n *\n * Update an interpolated style on an element with 6 bound values surrounded by text.\n *\n * Used when the value passed to a property has 6 interpolated values in it:\n *\n * ```html\n * <div style=\"key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}};\n *             key5: {{v5}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolate6(\n *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,\n *    'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolate6(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation6(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    suffix,\n  );\n  ɵɵstyleMap(interpolatedValue);\n}\n\n/**\n *\n * Update an interpolated style on an element with 7 bound values surrounded by text.\n *\n * Used when the value passed to a property has 7 interpolated values in it:\n *\n * ```html\n * <div style=\"key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};\n *             key6: {{v6}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolate7(\n *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,\n *    '; key6: ', v6, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolate7(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation7(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    suffix,\n  );\n  ɵɵstyleMap(interpolatedValue);\n}\n\n/**\n *\n * Update an interpolated style on an element with 8 bound values surrounded by text.\n *\n * Used when the value passed to a property has 8 interpolated values in it:\n *\n * ```html\n * <div style=\"key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};\n *             key6: {{v6}}; key7: {{v7}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolate8(\n *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,\n *    '; key6: ', v6, '; key7: ', v7, 'suffix');\n * ```\n *\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param i6 Static value used for concatenation only.\n * @param v7 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolate8(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  i6: string,\n  v7: any,\n  suffix: string,\n): void {\n  const lView = getLView();\n  const interpolatedValue = interpolation8(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    i6,\n    v7,\n    suffix,\n  );\n  ɵɵstyleMap(interpolatedValue);\n}\n\n/**\n * Update an interpolated style on an element with 9 or more bound values surrounded by text.\n *\n * Used when the number of interpolated values exceeds 8.\n *\n * ```html\n * <div\n *  class=\"key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};\n *         key6: {{v6}}; key7: {{v7}}; key8: {{v8}}; key9: {{v9}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstyleMapInterpolateV(\n *    ['key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,\n *     '; key6: ', v6, '; key7: ', v7, '; key8: ', v8, '; key9: ', v9, 'suffix']);\n * ```\n *.\n * @param values The collection of values and the strings in-between those values, beginning with\n * a string prefix and ending with a string suffix.\n * (e.g. `['prefix', value0, '; key2: ', value1, '; key2: ', value2, ..., value99, 'suffix']`)\n * @codeGenApi\n */\nexport function ɵɵstyleMapInterpolateV(values: any[]): void {\n  const lView = getLView();\n  const interpolatedValue = interpolationV(lView, values);\n  ɵɵstyleMap(interpolatedValue);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {getLView} from '../state';\nimport {\n  interpolation1,\n  interpolation2,\n  interpolation3,\n  interpolation4,\n  interpolation5,\n  interpolation6,\n  interpolation7,\n  interpolation8,\n  interpolationV,\n} from './interpolation';\nimport {checkStylingProperty} from './styling';\n\n/**\n *\n * Update an interpolated style property on an element with single bound value surrounded by text.\n *\n * Used when the value passed to a property has 1 interpolated value in it:\n *\n * ```html\n * <div style.color=\"prefix{{v0}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolate1(0, 'prefix', v0, 'suffix');\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`.\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolate1(\n  prop: string,\n  prefix: string,\n  v0: any,\n  suffix: string,\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolate1 {\n  const lView = getLView();\n  const interpolatedValue = interpolation1(lView, prefix, v0, suffix);\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolate1;\n}\n\n/**\n *\n * Update an interpolated style property on an element with 2 bound values surrounded by text.\n *\n * Used when the value passed to a property has 2 interpolated values in it:\n *\n * ```html\n * <div style.color=\"prefix{{v0}}-{{v1}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolate2(0, 'prefix', v0, '-', v1, 'suffix');\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`.\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolate2(\n  prop: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  suffix: string,\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolate2 {\n  const lView = getLView();\n  const interpolatedValue = interpolation2(lView, prefix, v0, i0, v1, suffix);\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolate2;\n}\n\n/**\n *\n * Update an interpolated style property on an element with 3 bound values surrounded by text.\n *\n * Used when the value passed to a property has 3 interpolated values in it:\n *\n * ```html\n * <div style.color=\"prefix{{v0}}-{{v1}}-{{v2}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolate3(0, 'prefix', v0, '-', v1, '-', v2, 'suffix');\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`.\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolate3(\n  prop: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  suffix: string,\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolate3 {\n  const lView = getLView();\n  const interpolatedValue = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolate3;\n}\n\n/**\n *\n * Update an interpolated style property on an element with 4 bound values surrounded by text.\n *\n * Used when the value passed to a property has 4 interpolated values in it:\n *\n * ```html\n * <div style.color=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolate4(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`.\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolate4(\n  prop: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  suffix: string,\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolate4 {\n  const lView = getLView();\n  const interpolatedValue = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolate4;\n}\n\n/**\n *\n * Update an interpolated style property on an element with 5 bound values surrounded by text.\n *\n * Used when the value passed to a property has 5 interpolated values in it:\n *\n * ```html\n * <div style.color=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix\"></div>   \n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolate5(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`.\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolate5(\n  prop: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  suffix: string,\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolate5 {\n  const lView = getLView();\n  const interpolatedValue = interpolation5(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    suffix,\n  );\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolate5;\n}\n\n/**\n *\n * Update an interpolated style property on an element with 6 bound values surrounded by text.\n *\n * Used when the value passed to a property has 6 interpolated values in it:\n *\n * ```html\n * <div style.color=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolate6(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`.\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolate6(\n  prop: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  suffix: string,\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolate6 {\n  const lView = getLView();\n  const interpolatedValue = interpolation6(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    suffix,\n  );\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolate6;\n}\n\n/**\n *\n * Update an interpolated style property on an element with 7 bound values surrounded by text.\n *\n * Used when the value passed to a property has 7 interpolated values in it:\n *\n * ```html\n * <div style.color=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolate7(\n *    0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`.\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolate7(\n  prop: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  suffix: string,\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolate7 {\n  const lView = getLView();\n  const interpolatedValue = interpolation7(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    suffix,\n  );\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolate7;\n}\n\n/**\n *\n * Update an interpolated style property on an element with 8 bound values surrounded by text.\n *\n * Used when the value passed to a property has 8 interpolated values in it:\n *\n * ```html\n * <div style.color=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix\"></div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolate8(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6,\n * '-', v7, 'suffix');\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`.\n * @param prefix Static value used for concatenation only.\n * @param v0 Value checked for change.\n * @param i0 Static value used for concatenation only.\n * @param v1 Value checked for change.\n * @param i1 Static value used for concatenation only.\n * @param v2 Value checked for change.\n * @param i2 Static value used for concatenation only.\n * @param v3 Value checked for change.\n * @param i3 Static value used for concatenation only.\n * @param v4 Value checked for change.\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change.\n * @param i5 Static value used for concatenation only.\n * @param v6 Value checked for change.\n * @param i6 Static value used for concatenation only.\n * @param v7 Value checked for change.\n * @param suffix Static value used for concatenation only.\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolate8(\n  prop: string,\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  i6: string,\n  v7: any,\n  suffix: string,\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolate8 {\n  const lView = getLView();\n  const interpolatedValue = interpolation8(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    i6,\n    v7,\n    suffix,\n  );\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolate8;\n}\n\n/**\n * Update an interpolated style property on an element with 9 or more bound values surrounded by\n * text.\n *\n * Used when the number of interpolated values exceeds 8.\n *\n * ```html\n * <div\n *  style.color=\"prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix\">\n * </div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵstylePropInterpolateV(\n *  0, ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,\n *  'suffix']);\n * ```\n *\n * @param styleIndex Index of style to update. This index value refers to the\n *        index of the style in the style bindings array that was passed into\n *        `styling`..\n * @param values The collection of values and the strings in-between those values, beginning with\n * a string prefix and ending with a string suffix.\n * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)\n * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵstylePropInterpolateV(\n  prop: string,\n  values: any[],\n  valueSuffix?: string | null,\n): typeof ɵɵstylePropInterpolateV {\n  const lView = getLView();\n  const interpolatedValue = interpolationV(lView, values);\n  checkStylingProperty(prop, interpolatedValue, valueSuffix, false);\n  return ɵɵstylePropInterpolateV;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {validateMatchingNode} from '../../hydration/error_handling';\nimport {locateNextRNode} from '../../hydration/node_lookup_utils';\nimport {isDisconnectedNode, markRNodeAsClaimedByHydration} from '../../hydration/utils';\nimport {isDetachedByI18n} from '../../i18n/utils';\nimport {assertEqual, assertIndexInRange} from '../../util/assert';\nimport {TElementNode, TNode, TNodeType} from '../interfaces/node';\nimport {RText} from '../interfaces/renderer_dom';\nimport {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view';\nimport {appendChild} from '../node_manipulation';\nimport {createTextNode} from '../dom_node_manipulation';\nimport {\n  getBindingIndex,\n  getLView,\n  getTView,\n  isInSkipHydrationBlock,\n  lastNodeWasCreated,\n  setCurrentTNode,\n  wasLastNodeCreated,\n} from '../state';\nimport {getOrCreateTNode} from '../tnode_manipulation';\n\n/**\n * Create static text node\n *\n * @param index Index of the node in the data array\n * @param value Static string value to write.\n *\n * @codeGenApi\n */\nexport function ɵɵtext(index: number, value: string = ''): void {\n  const lView = getLView();\n  const tView = getTView();\n  const adjustedIndex = index + HEADER_OFFSET;\n\n  ngDevMode &&\n    assertEqual(\n      getBindingIndex(),\n      tView.bindingStartIndex,\n      'text nodes should be created before any bindings',\n    );\n  ngDevMode && assertIndexInRange(lView, adjustedIndex);\n\n  const tNode = tView.firstCreatePass\n    ? getOrCreateTNode(tView, adjustedIndex, TNodeType.Text, value, null)\n    : (tView.data[adjustedIndex] as TElementNode);\n\n  const textNative = _locateOrCreateTextNode(tView, lView, tNode, value, index);\n  lView[adjustedIndex] = textNative;\n\n  if (wasLastNodeCreated()) {\n    appendChild(tView, lView, textNative, tNode);\n  }\n\n  // Text nodes are self closing.\n  setCurrentTNode(tNode, false);\n}\n\nlet _locateOrCreateTextNode: typeof locateOrCreateTextNodeImpl = (\n  tView: TView,\n  lView: LView,\n  tNode: TNode,\n  value: string,\n  index: number,\n) => {\n  lastNodeWasCreated(true);\n  return createTextNode(lView[RENDERER], value);\n};\n\n/**\n * Enables hydration code path (to lookup existing elements in DOM)\n * in addition to the regular creation mode of text nodes.\n */\nfunction locateOrCreateTextNodeImpl(\n  tView: TView,\n  lView: LView,\n  tNode: TNode,\n  value: string,\n  index: number,\n): RText {\n  const hydrationInfo = lView[HYDRATION];\n  const isNodeCreationMode =\n    !hydrationInfo ||\n    isInSkipHydrationBlock() ||\n    isDetachedByI18n(tNode) ||\n    isDisconnectedNode(hydrationInfo, index);\n  lastNodeWasCreated(isNodeCreationMode);\n\n  // Regular creation mode.\n  if (isNodeCreationMode) {\n    return createTextNode(lView[RENDERER], value);\n  }\n\n  // Hydration mode, looking up an existing element in DOM.\n  const textNative = locateNextRNode(hydrationInfo, tView, lView, tNode) as RText;\n\n  ngDevMode && validateMatchingNode(textNative, Node.TEXT_NODE, null, lView, tNode);\n  ngDevMode && markRNodeAsClaimedByHydration(textNative);\n\n  return textNative;\n}\n\nexport function enableLocateOrCreateTextNodeImpl() {\n  _locateOrCreateTextNode = locateOrCreateTextNodeImpl;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {assertDefined, assertIndexInRange, assertNotSame, assertString} from '../../util/assert';\nimport {RText} from '../interfaces/renderer_dom';\nimport {LView, RENDERER} from '../interfaces/view';\nimport {updateTextNode} from '../dom_node_manipulation';\nimport {getLView, getSelectedIndex} from '../state';\nimport {NO_CHANGE} from '../tokens';\nimport {getNativeByIndex} from '../util/view_utils';\n\nimport {\n  interpolation1,\n  interpolation2,\n  interpolation3,\n  interpolation4,\n  interpolation5,\n  interpolation6,\n  interpolation7,\n  interpolation8,\n  interpolationV,\n} from './interpolation';\n\n/**\n *\n * Update text content with a lone bound value\n *\n * Used when a text node has 1 interpolated value in it, an no additional text\n * surrounds that interpolated value:\n *\n * ```html\n * <div>{{v0}}</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate(v0);\n * ```\n * @returns itself, so that it may be chained.\n * @see textInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate(v0: any): typeof ɵɵtextInterpolate {\n  ɵɵtextInterpolate1('', v0, '');\n  return ɵɵtextInterpolate;\n}\n\n/**\n *\n * Update text content with single bound value surrounded by other text.\n *\n * Used when a text node has 1 interpolated value in it:\n *\n * ```html\n * <div>prefix{{v0}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate1('prefix', v0, 'suffix');\n * ```\n * @returns itself, so that it may be chained.\n * @see textInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate1(\n  prefix: string,\n  v0: any,\n  suffix: string,\n): typeof ɵɵtextInterpolate1 {\n  const lView = getLView();\n  const interpolated = interpolation1(lView, prefix, v0, suffix);\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolate1;\n}\n\n/**\n *\n * Update text content with 2 bound values surrounded by other text.\n *\n * Used when a text node has 2 interpolated values in it:\n *\n * ```html\n * <div>prefix{{v0}}-{{v1}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate2('prefix', v0, '-', v1, 'suffix');\n * ```\n * @returns itself, so that it may be chained.\n * @see textInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate2(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  suffix: string,\n): typeof ɵɵtextInterpolate2 {\n  const lView = getLView();\n  const interpolated = interpolation2(lView, prefix, v0, i0, v1, suffix);\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolate2;\n}\n\n/**\n *\n * Update text content with 3 bound values surrounded by other text.\n *\n * Used when a text node has 3 interpolated values in it:\n *\n * ```html\n * <div>prefix{{v0}}-{{v1}}-{{v2}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate3(\n * 'prefix', v0, '-', v1, '-', v2, 'suffix');\n * ```\n * @returns itself, so that it may be chained.\n * @see textInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate3(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  suffix: string,\n): typeof ɵɵtextInterpolate3 {\n  const lView = getLView();\n  const interpolated = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolate3;\n}\n\n/**\n *\n * Update text content with 4 bound values surrounded by other text.\n *\n * Used when a text node has 4 interpolated values in it:\n *\n * ```html\n * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate4(\n * 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');\n * ```\n * @returns itself, so that it may be chained.\n * @see ɵɵtextInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate4(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  suffix: string,\n): typeof ɵɵtextInterpolate4 {\n  const lView = getLView();\n  const interpolated = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolate4;\n}\n\n/**\n *\n * Update text content with 5 bound values surrounded by other text.\n *\n * Used when a text node has 5 interpolated values in it:\n *\n * ```html\n * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate5(\n * 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');\n * ```\n * @returns itself, so that it may be chained.\n * @see textInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate5(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  suffix: string,\n): typeof ɵɵtextInterpolate5 {\n  const lView = getLView();\n  const interpolated = interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolate5;\n}\n\n/**\n *\n * Update text content with 6 bound values surrounded by other text.\n *\n * Used when a text node has 6 interpolated values in it:\n *\n * ```html\n * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate6(\n *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');\n * ```\n *\n * @param i4 Static value used for concatenation only.\n * @param v5 Value checked for change. @returns itself, so that it may be chained.\n * @see textInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate6(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  suffix: string,\n): typeof ɵɵtextInterpolate6 {\n  const lView = getLView();\n  const interpolated = interpolation6(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    suffix,\n  );\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolate6;\n}\n\n/**\n *\n * Update text content with 7 bound values surrounded by other text.\n *\n * Used when a text node has 7 interpolated values in it:\n *\n * ```html\n * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate7(\n *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');\n * ```\n * @returns itself, so that it may be chained.\n * @see textInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate7(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  suffix: string,\n): typeof ɵɵtextInterpolate7 {\n  const lView = getLView();\n  const interpolated = interpolation7(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    suffix,\n  );\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolate7;\n}\n\n/**\n *\n * Update text content with 8 bound values surrounded by other text.\n *\n * Used when a text node has 8 interpolated values in it:\n *\n * ```html\n * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolate8(\n *  'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');\n * ```\n * @returns itself, so that it may be chained.\n * @see textInterpolateV\n * @codeGenApi\n */\nexport function ɵɵtextInterpolate8(\n  prefix: string,\n  v0: any,\n  i0: string,\n  v1: any,\n  i1: string,\n  v2: any,\n  i2: string,\n  v3: any,\n  i3: string,\n  v4: any,\n  i4: string,\n  v5: any,\n  i5: string,\n  v6: any,\n  i6: string,\n  v7: any,\n  suffix: string,\n): typeof ɵɵtextInterpolate8 {\n  const lView = getLView();\n  const interpolated = interpolation8(\n    lView,\n    prefix,\n    v0,\n    i0,\n    v1,\n    i1,\n    v2,\n    i2,\n    v3,\n    i3,\n    v4,\n    i4,\n    v5,\n    i5,\n    v6,\n    i6,\n    v7,\n    suffix,\n  );\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolate8;\n}\n\n/**\n * Update text content with 9 or more bound values other surrounded by text.\n *\n * Used when the number of interpolated values exceeds 8.\n *\n * ```html\n * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix</div>\n * ```\n *\n * Its compiled representation is:\n *\n * ```ts\n * ɵɵtextInterpolateV(\n *  ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,\n *  'suffix']);\n * ```\n *.\n * @param values The collection of values and the strings in between those values, beginning with\n * a string prefix and ending with a string suffix.\n * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)\n *\n * @returns itself, so that it may be chained.\n * @codeGenApi\n */\nexport function ɵɵtextInterpolateV(values: any[]): typeof ɵɵtextInterpolateV {\n  const lView = getLView();\n  const interpolated = interpolationV(lView, values);\n  if (interpolated !== NO_CHANGE) {\n    textBindingInternal(lView, getSelectedIndex(), interpolated as string);\n  }\n  return ɵɵtextInterpolateV;\n}\n\n/**\n * Updates a text binding at a given index in a given LView.\n */\nfunction textBindingInternal(lView: LView, index: number, value: string): void {\n  ngDevMode && assertString(value, 'Value should be a string');\n  ngDevMode && assertNotSame(value, NO_CHANGE as any, 'value should not be NO_CHANGE');\n  ngDevMode && assertIndexInRange(lView, index);\n  const element = getNativeByIndex(index, lView) as any as RText;\n  ngDevMode && assertDefined(element, 'native element should exist');\n  updateTextNode(lView[RENDERER], element, value);\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {bindingUpdated} from '../bindings';\nimport {SanitizerFn} from '../interfaces/sanitization';\nimport {RENDERER} from '../interfaces/view';\nimport {isWritableSignal, WritableSignal} from '../reactivity/signal';\nimport {getCurrentTNode, getLView, getSelectedTNode, getTView, nextBindingIndex} from '../state';\n\nimport {listenerInternal} from './listener';\nimport {elementPropertyInternal, storePropertyBindingMetadata} from './shared';\n\n/**\n * Update a two-way bound property on a selected element.\n *\n * Operates on the element selected by index via the {@link select} instruction.\n *\n * @param propName Name of property.\n * @param value New value to write.\n * @param sanitizer An optional function used to sanitize the value.\n * @returns This function returns itself so that it may be chained\n * (e.g. `twoWayProperty('name', ctx.name)('title', ctx.title)`)\n *\n * @codeGenApi\n */\nexport function ɵɵtwoWayProperty<T>(\n  propName: string,\n  value: T | WritableSignal<T>,\n  sanitizer?: SanitizerFn | null,\n): typeof ɵɵtwoWayProperty {\n  // TODO(crisbeto): perf impact of re-evaluating this on each change detection?\n  if (isWritableSignal(value)) {\n    value = value();\n  }\n\n  const lView = getLView();\n  const bindingIndex = nextBindingIndex();\n  if (bindingUpdated(lView, bindingIndex, value)) {\n    const tView = getTView();\n    const tNode = getSelectedTNode();\n    elementPropertyInternal(\n      tView,\n      tNode,\n      lView,\n      propName,\n      value,\n      lView[RENDERER],\n      sanitizer,\n      false,\n    );\n    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);\n  }\n\n  return ɵɵtwoWayProperty;\n}\n\n/**\n * Function used inside two-way listeners to conditionally set the value of the bound expression.\n *\n * @param target Field on which to set the value.\n * @param value Value to be set to the field.\n *\n * @codeGenApi\n */\nexport function ɵɵtwoWayBindingSet<T>(target: unknown, value: T): boolean {\n  const canWrite = isWritableSignal(target);\n  canWrite && target.set(value);\n  return canWrite;\n}\n\n/**\n * Adds an event listener that updates a two-way binding to the current node.\n *\n * @param eventName Name of the event.\n * @param listenerFn The function to be called when event emits.\n *\n * @codeGenApi\n */\nexport function ɵɵtwoWayListener(\n  eventName: string,\n  listenerFn: (e?: any) => any,\n): typeof ɵɵtwoWayListener {\n  const lView = getLView<{} | null>();\n  const tView = getTView();\n  const tNode = getCurrentTNode()!;\n  listenerInternal(tView, lView, lView[RENDERER], tNode, eventName, listenerFn);\n  return ɵɵtwoWayListener;\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {performanceMarkFeature} from '../../util/performance';\nimport {TNodeType} from '../interfaces/node';\nimport {HEADER_OFFSET} from '../interfaces/view';\nimport {getContextLView, getLView, getSelectedIndex, getTView, setCurrentTNode} from '../state';\nimport {getOrCreateTNode} from '../tnode_manipulation';\nimport {load, store} from '../util/view_utils';\n\n/** Object that indicates the value of a `@let` declaration that hasn't been initialized yet. */\nconst UNINITIALIZED_LET = {};\n\n/**\n * Declares an `@let` at a specific data slot. Returns itself to allow chaining.\n *\n * @param index Index at which to declare the `@let`.\n *\n * @codeGenApi\n */\nexport function ɵɵdeclareLet(index: number): typeof ɵɵdeclareLet {\n  const tView = getTView();\n  const lView = getLView();\n  const adjustedIndex = index + HEADER_OFFSET;\n  const tNode = getOrCreateTNode(tView, adjustedIndex, TNodeType.LetDeclaration, null, null);\n  setCurrentTNode(tNode, false);\n  store(tView, lView, adjustedIndex, UNINITIALIZED_LET);\n  return ɵɵdeclareLet;\n}\n\n/**\n * Instruction that stores the value of a `@let` declaration on the current view.\n * Returns the value to allow usage inside variable initializers.\n *\n * @codeGenApi\n */\nexport function ɵɵstoreLet<T>(value: T): T {\n  performanceMarkFeature('NgLet');\n  const tView = getTView();\n  const lView = getLView();\n  const index = getSelectedIndex();\n  store(tView, lView, index, value);\n  return value;\n}\n\n/**\n * Retrieves the value of a `@let` declaration defined in a parent view.\n *\n * @param index Index of the declaration within the view.\n *\n * @codeGenApi\n */\nexport function ɵɵreadContextLet<T>(index: number): T {\n  const contextLView = getContextLView();\n  const value = load<T>(contextLView, HEADER_OFFSET + index);\n\n  if (value === UNINITIALIZED_LET) {\n    throw new RuntimeError(\n      RuntimeErrorCode.UNINITIALIZED_LET_ACCESS,\n      ngDevMode && 'Attempting to access a @let declaration whose value is not available yet',\n    );\n  }\n\n  return value;\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {TNodeType} from '../interfaces/node';\nimport {RElement} from '../interfaces/renderer_dom';\nimport {HEADER_OFFSET, RENDERER} from '../interfaces/view';\nimport {assertTNodeType} from '../node_assert';\nimport {getLView, getTView} from '../state';\nimport {getNativeByIndex, getTNode} from '../util/view_utils';\n\n/**\n * Sets the location within the source template at which\n * each element in the current view was defined.\n *\n * @param index Index at which the DOM node was created.\n * @param templatePath Path to the template at which the node was defined.\n * @param locations Element locations to which to attach the source location.\n *\n * @codeGenApi\n */\nexport function ɵɵattachSourceLocations(\n  templatePath: string,\n  locations: [index: number, offset: number, line: number, column: number][],\n) {\n  const tView = getTView();\n  const lView = getLView();\n  const renderer = lView[RENDERER];\n  const attributeName = 'data-ng-source-location';\n\n  for (const [index, offset, line, column] of locations) {\n    const tNode = getTNode(tView, index + HEADER_OFFSET);\n    // The compiler shouldn't generate the instruction for non-element nodes, but assert just in case.\n    ngDevMode && assertTNodeType(tNode, TNodeType.Element);\n    const node = getNativeByIndex(index + HEADER_OFFSET, lView) as RElement;\n\n    // Set the attribute directly in the DOM so it doesn't participate in directive matching.\n    if (!node.hasAttribute(attributeName)) {\n      const attributeValue = `${templatePath}@o:${offset},l:${line},c:${column}`;\n      renderer.setAttribute(node, attributeName, attributeValue);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {resolveForwardRef} from '../di/forward_ref';\nimport {InjectFlags, InternalInjectFlags} from '../di/interface/injector';\nimport {ClassProvider, Provider} from '../di/interface/provider';\nimport {isClassProvider, isTypeProvider, SingleProvider} from '../di/provider_collection';\nimport {providerToFactory} from '../di/r3_injector';\nimport {assertDefined} from '../util/assert';\n\nimport {emitProviderConfiguredEvent, runInInjectorProfilerContext} from './debug/injector_profiler';\nimport {\n  diPublicInInjector,\n  getNodeInjectable,\n  getOrCreateNodeInjectorForNode,\n  NodeInjector,\n} from './di';\nimport {ɵɵdirectiveInject} from './instructions/all';\nimport {DirectiveDef} from './interfaces/definition';\nimport {NodeInjectorFactory} from './interfaces/injector';\nimport {\n  TContainerNode,\n  TDirectiveHostNode,\n  TElementContainerNode,\n  TElementNode,\n  TNodeProviderIndexes,\n} from './interfaces/node';\nimport {isComponentDef} from './interfaces/type_checks';\nimport {DestroyHookData, LView, TData, TVIEW, TView} from './interfaces/view';\nimport {getCurrentTNode, getLView, getTView} from './state';\n\n/**\n * Resolves the providers which are defined in the DirectiveDef.\n *\n * When inserting the tokens and the factories in their respective arrays, we can assume that\n * this method is called first for the component (if any), and then for other directives on the same\n * node.\n * As a consequence,the providers are always processed in that order:\n * 1) The view providers of the component\n * 2) The providers of the component\n * 3) The providers of the other directives\n * This matches the structure of the injectables arrays of a view (for each node).\n * So the tokens and the factories can be pushed at the end of the arrays, except\n * in one case for multi providers.\n *\n * @param def the directive definition\n * @param providers: Array of `providers`.\n * @param viewProviders: Array of `viewProviders`.\n */\nexport function providersResolver<T>(\n  def: DirectiveDef<T>,\n  providers: Provider[],\n  viewProviders: Provider[],\n): void {\n  const tView = getTView();\n  if (tView.firstCreatePass) {\n    const isComponent = isComponentDef(def);\n\n    // The list of view providers is processed first, and the flags are updated\n    resolveProvider(viewProviders, tView.data, tView.blueprint, isComponent, true);\n\n    // Then, the list of providers is processed, and the flags are updated\n    resolveProvider(providers, tView.data, tView.blueprint, isComponent, false);\n  }\n}\n\n/**\n * Resolves a provider and publishes it to the DI system.\n */\nfunction resolveProvider(\n  provider: Provider,\n  tInjectables: TData,\n  lInjectablesBlueprint: NodeInjectorFactory[],\n  isComponent: boolean,\n  isViewProvider: boolean,\n): void {\n  provider = resolveForwardRef(provider);\n  if (Array.isArray(provider)) {\n    // Recursively call `resolveProvider`\n    // Recursion is OK in this case because this code will not be in hot-path once we implement\n    // cloning of the initial state.\n    for (let i = 0; i < provider.length; i++) {\n      resolveProvider(\n        provider[i],\n        tInjectables,\n        lInjectablesBlueprint,\n        isComponent,\n        isViewProvider,\n      );\n    }\n  } else {\n    const tView = getTView();\n    const lView = getLView();\n    const tNode = getCurrentTNode()!;\n    let token: any = isTypeProvider(provider) ? provider : resolveForwardRef(provider.provide);\n\n    const providerFactory = providerToFactory(provider);\n    if (ngDevMode) {\n      const injector = new NodeInjector(\n        tNode as TElementNode | TContainerNode | TElementContainerNode,\n        lView,\n      );\n      runInInjectorProfilerContext(injector, token, () => {\n        emitProviderConfiguredEvent(provider as SingleProvider, isViewProvider);\n      });\n    }\n\n    const beginIndex = tNode.providerIndexes & TNodeProviderIndexes.ProvidersStartIndexMask;\n    const endIndex = tNode.directiveStart;\n    const cptViewProvidersCount =\n      tNode.providerIndexes >> TNodeProviderIndexes.CptViewProvidersCountShift;\n\n    if (isTypeProvider(provider) || !provider.multi) {\n      // Single provider case: the factory is created and pushed immediately\n      const factory = new NodeInjectorFactory(providerFactory, isViewProvider, ɵɵdirectiveInject);\n      const existingFactoryIndex = indexOf(\n        token,\n        tInjectables,\n        isViewProvider ? beginIndex : beginIndex + cptViewProvidersCount,\n        endIndex,\n      );\n      if (existingFactoryIndex === -1) {\n        diPublicInInjector(\n          getOrCreateNodeInjectorForNode(\n            tNode as TElementNode | TContainerNode | TElementContainerNode,\n            lView,\n          ),\n          tView,\n          token,\n        );\n        registerDestroyHooksIfSupported(tView, provider, tInjectables.length);\n        tInjectables.push(token);\n        tNode.directiveStart++;\n        tNode.directiveEnd++;\n        if (isViewProvider) {\n          tNode.providerIndexes += TNodeProviderIndexes.CptViewProvidersCountShifter;\n        }\n        lInjectablesBlueprint.push(factory);\n        lView.push(factory);\n      } else {\n        lInjectablesBlueprint[existingFactoryIndex] = factory;\n        lView[existingFactoryIndex] = factory;\n      }\n    } else {\n      // Multi provider case:\n      // We create a multi factory which is going to aggregate all the values.\n      // Since the output of such a factory depends on content or view injection,\n      // we create two of them, which are linked together.\n      //\n      // The first one (for view providers) is always in the first block of the injectables array,\n      // and the second one (for providers) is always in the second block.\n      // This is important because view providers have higher priority. When a multi token\n      // is being looked up, the view providers should be found first.\n      // Note that it is not possible to have a multi factory in the third block (directive block).\n      //\n      // The algorithm to process multi providers is as follows:\n      // 1) If the multi provider comes from the `viewProviders` of the component:\n      //   a) If the special view providers factory doesn't exist, it is created and pushed.\n      //   b) Else, the multi provider is added to the existing multi factory.\n      // 2) If the multi provider comes from the `providers` of the component or of another\n      // directive:\n      //   a) If the multi factory doesn't exist, it is created and provider pushed into it.\n      //      It is also linked to the multi factory for view providers, if it exists.\n      //   b) Else, the multi provider is added to the existing multi factory.\n\n      const existingProvidersFactoryIndex = indexOf(\n        token,\n        tInjectables,\n        beginIndex + cptViewProvidersCount,\n        endIndex,\n      );\n      const existingViewProvidersFactoryIndex = indexOf(\n        token,\n        tInjectables,\n        beginIndex,\n        beginIndex + cptViewProvidersCount,\n      );\n      const doesProvidersFactoryExist =\n        existingProvidersFactoryIndex >= 0 && lInjectablesBlueprint[existingProvidersFactoryIndex];\n      const doesViewProvidersFactoryExist =\n        existingViewProvidersFactoryIndex >= 0 &&\n        lInjectablesBlueprint[existingViewProvidersFactoryIndex];\n\n      if (\n        (isViewProvider && !doesViewProvidersFactoryExist) ||\n        (!isViewProvider && !doesProvidersFactoryExist)\n      ) {\n        // Cases 1.a and 2.a\n        diPublicInInjector(\n          getOrCreateNodeInjectorForNode(\n            tNode as TElementNode | TContainerNode | TElementContainerNode,\n            lView,\n          ),\n          tView,\n          token,\n        );\n        const factory = multiFactory(\n          isViewProvider ? multiViewProvidersFactoryResolver : multiProvidersFactoryResolver,\n          lInjectablesBlueprint.length,\n          isViewProvider,\n          isComponent,\n          providerFactory,\n        );\n        if (!isViewProvider && doesViewProvidersFactoryExist) {\n          lInjectablesBlueprint[existingViewProvidersFactoryIndex].providerFactory = factory;\n        }\n        registerDestroyHooksIfSupported(tView, provider, tInjectables.length, 0);\n        tInjectables.push(token);\n        tNode.directiveStart++;\n        tNode.directiveEnd++;\n        if (isViewProvider) {\n          tNode.providerIndexes += TNodeProviderIndexes.CptViewProvidersCountShifter;\n        }\n        lInjectablesBlueprint.push(factory);\n        lView.push(factory);\n      } else {\n        // Cases 1.b and 2.b\n        const indexInFactory = multiFactoryAdd(\n          lInjectablesBlueprint![\n            isViewProvider ? existingViewProvidersFactoryIndex : existingProvidersFactoryIndex\n          ],\n          providerFactory,\n          !isViewProvider && isComponent,\n        );\n        registerDestroyHooksIfSupported(\n          tView,\n          provider,\n          existingProvidersFactoryIndex > -1\n            ? existingProvidersFactoryIndex\n            : existingViewProvidersFactoryIndex,\n          indexInFactory,\n        );\n      }\n      if (!isViewProvider && isComponent && doesViewProvidersFactoryExist) {\n        lInjectablesBlueprint[existingViewProvidersFactoryIndex].componentProviders!++;\n      }\n    }\n  }\n}\n\n/**\n * Registers the `ngOnDestroy` hook of a provider, if the provider supports destroy hooks.\n * @param tView `TView` in which to register the hook.\n * @param provider Provider whose hook should be registered.\n * @param contextIndex Index under which to find the context for the hook when it's being invoked.\n * @param indexInFactory Only required for `multi` providers. Index of the provider in the multi\n * provider factory.\n */\nfunction registerDestroyHooksIfSupported(\n  tView: TView,\n  provider: Exclude<Provider, any[]>,\n  contextIndex: number,\n  indexInFactory?: number,\n) {\n  const providerIsTypeProvider = isTypeProvider(provider);\n  const providerIsClassProvider = isClassProvider(provider);\n\n  if (providerIsTypeProvider || providerIsClassProvider) {\n    // Resolve forward references as `useClass` can hold a forward reference.\n    const classToken = providerIsClassProvider ? resolveForwardRef(provider.useClass) : provider;\n    const prototype = classToken.prototype;\n    const ngOnDestroy = prototype.ngOnDestroy;\n\n    if (ngOnDestroy) {\n      const hooks = tView.destroyHooks || (tView.destroyHooks = []);\n\n      if (!providerIsTypeProvider && (provider as ClassProvider).multi) {\n        ngDevMode &&\n          assertDefined(\n            indexInFactory,\n            'indexInFactory when registering multi factory destroy hook',\n          );\n        const existingCallbacksIndex = hooks.indexOf(contextIndex);\n\n        if (existingCallbacksIndex === -1) {\n          hooks.push(contextIndex, [indexInFactory, ngOnDestroy]);\n        } else {\n          (hooks[existingCallbacksIndex + 1] as DestroyHookData).push(indexInFactory!, ngOnDestroy);\n        }\n      } else {\n        hooks.push(contextIndex, ngOnDestroy);\n      }\n    }\n  }\n}\n\n/**\n * Add a factory in a multi factory.\n * @returns Index at which the factory was inserted.\n */\nfunction multiFactoryAdd(\n  multiFactory: NodeInjectorFactory,\n  factory: () => any,\n  isComponentProvider: boolean,\n): number {\n  if (isComponentProvider) {\n    multiFactory.componentProviders!++;\n  }\n  return multiFactory.multi!.push(factory) - 1;\n}\n\n/**\n * Returns the index of item in the array, but only in the begin to end range.\n */\nfunction indexOf(item: any, arr: any[], begin: number, end: number) {\n  for (let i = begin; i < end; i++) {\n    if (arr[i] === item) return i;\n  }\n  return -1;\n}\n\n/**\n * Use this with `multi` `providers`.\n */\nfunction multiProvidersFactoryResolver(\n  this: NodeInjectorFactory,\n  _: undefined,\n  flags: InjectFlags | undefined,\n  tData: TData,\n  lData: LView,\n  tNode: TDirectiveHostNode,\n): any[] {\n  return multiResolve(this.multi!, []);\n}\n\n/**\n * Use this with `multi` `viewProviders`.\n *\n * This factory knows how to concatenate itself with the existing `multi` `providers`.\n */\nfunction multiViewProvidersFactoryResolver(\n  this: NodeInjectorFactory,\n  _: undefined,\n  _flags: InjectFlags | undefined,\n  _tData: TData,\n  lView: LView,\n  tNode: TDirectiveHostNode,\n): any[] {\n  const factories = this.multi!;\n  let result: any[];\n  if (this.providerFactory) {\n    const componentCount = this.providerFactory.componentProviders!;\n    const multiProviders = getNodeInjectable(\n      lView,\n      lView[TVIEW],\n      this.providerFactory!.index!,\n      tNode,\n    );\n    // Copy the section of the array which contains `multi` `providers` from the component\n    result = multiProviders.slice(0, componentCount);\n    // Insert the `viewProvider` instances.\n    multiResolve(factories, result);\n    // Copy the section of the array which contains `multi` `providers` from other directives\n    for (let i = componentCount; i < multiProviders.length; i++) {\n      result.push(multiProviders[i]);\n    }\n  } else {\n    result = [];\n    // Insert the `viewProvider` instances.\n    multiResolve(factories, result);\n  }\n  return result;\n}\n\n/**\n * Maps an array of factories into an array of values.\n */\nfunction multiResolve(factories: Array<() => any>, result: any[]): any[] {\n  for (let i = 0; i < factories.length; i++) {\n    const factory = factories[i]! as () => null;\n    result.push(factory());\n  }\n  return result;\n}\n\n/**\n * Creates a multi factory.\n */\nfunction multiFactory(\n  factoryFn: (\n    this: NodeInjectorFactory,\n    _: undefined,\n    flags: InjectFlags | undefined,\n    tData: TData,\n    lData: LView,\n    tNode: TDirectiveHostNode,\n  ) => any,\n  index: number,\n  isViewProvider: boolean,\n  isComponent: boolean,\n  f: () => any,\n): NodeInjectorFactory {\n  const factory = new NodeInjectorFactory(factoryFn, isViewProvider, ɵɵdirectiveInject);\n  factory.multi = [];\n  factory.index = index;\n  factory.componentProviders = 0;\n  multiFactoryAdd(factory, f, isComponent && !isViewProvider);\n  return factory;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {ProcessProvidersFunction, Provider} from '../../di/interface/provider';\nimport {providersResolver} from '../di_setup';\nimport {DirectiveDef} from '../interfaces/definition';\n\n/**\n * This feature resolves the providers of a directive (or component),\n * and publish them into the DI system, making it visible to others for injection.\n *\n * For example:\n * ```ts\n * class ComponentWithProviders {\n *   constructor(private greeter: GreeterDE) {}\n *\n *   static ɵcmp = defineComponent({\n *     type: ComponentWithProviders,\n *     selectors: [['component-with-providers']],\n *    factory: () => new ComponentWithProviders(directiveInject(GreeterDE as any)),\n *    decls: 1,\n *    vars: 1,\n *    template: function(fs: RenderFlags, ctx: ComponentWithProviders) {\n *      if (fs & RenderFlags.Create) {\n *        ɵɵtext(0);\n *      }\n *      if (fs & RenderFlags.Update) {\n *        ɵɵtextInterpolate(ctx.greeter.greet());\n *      }\n *    },\n *    features: [ɵɵProvidersFeature([GreeterDE])]\n *  });\n * }\n * ```\n *\n * @param definition\n *\n * @codeGenApi\n */\nexport function ɵɵProvidersFeature<T>(providers: Provider[], viewProviders: Provider[] = []) {\n  return (definition: DirectiveDef<T>) => {\n    definition.providersResolver = (\n      def: DirectiveDef<T>,\n      processProvidersFn?: ProcessProvidersFunction,\n    ) => {\n      return providersResolver(\n        def, //\n        processProvidersFn ? processProvidersFn(providers) : providers, //\n        viewProviders,\n      );\n    };\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ComponentDef, ComponentDefFeature} from '../interfaces/definition';\n\n/**\n * A feature that adds support for external runtime styles for a component.\n * An external runtime style is a URL to a CSS stylesheet that contains the styles\n * for a given component. For browsers, this URL will be used in an appended `link` element\n * when the component is rendered. This feature is typically used for Hot Module Replacement\n * (HMR) of component stylesheets by leveraging preexisting global stylesheet HMR available\n * in most development servers.\n *\n * @codeGenApi\n */\nexport function ɵɵExternalStylesFeature(styleUrls: string[]): ComponentDefFeature {\n  return (definition: ComponentDef<unknown>) => {\n    if (styleUrls.length < 1) {\n      return;\n    }\n\n    definition.getExternalStyles = (encapsulationId) => {\n      // Add encapsulation ID search parameter `ngcomp` to support external style encapsulation as well as the encapsulation mode\n      // for usage tracking.\n      const urls = styleUrls.map(\n        (value) =>\n          value +\n          '?ngcomp' +\n          (encapsulationId ? '=' + encodeURIComponent(encapsulationId) : '') +\n          '&e=' +\n          definition.encapsulation,\n      );\n\n      return urls;\n    };\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isForwardRef, resolveForwardRef} from '../di/forward_ref';\nimport {Type} from '../interface/type';\nimport {flatten} from '../util/array_utils';\nimport {noSideEffects} from '../util/closure';\nimport {EMPTY_ARRAY} from '../util/empty';\nimport {getNgModuleDef} from './def_getters';\n\nimport {extractDefListOrFactory} from './definition';\nimport {depsTracker} from './deps_tracker/deps_tracker';\nimport {\n  ComponentDef,\n  ComponentType,\n  NgModuleScopeInfoFromDecorator,\n  RawScopeInfoFromDecorator,\n} from './interfaces/definition';\nimport {isModuleWithProviders} from './jit/util';\n\n/**\n * Generated next to NgModules to monkey-patch directive and pipe references onto a component's\n * definition, when generating a direct reference in the component file would otherwise create an\n * import cycle.\n *\n * See [this explanation](https://hackmd.io/Odw80D0pR6yfsOjg_7XCJg?view) for more details.\n *\n * @codeGenApi\n */\nexport function ɵɵsetComponentScope(\n  type: ComponentType<any>,\n  directives: Type<any>[] | (() => Type<any>[]),\n  pipes: Type<any>[] | (() => Type<any>[]),\n): void {\n  const def = type.ɵcmp as ComponentDef<any>;\n  def.directiveDefs = extractDefListOrFactory(directives, /* pipeDef */ false);\n  def.pipeDefs = extractDefListOrFactory(pipes, /* pipeDef */ true);\n}\n\n/**\n * Adds the module metadata that is necessary to compute the module's transitive scope to an\n * existing module definition.\n *\n * Scope metadata of modules is not used in production builds, so calls to this function can be\n * marked pure to tree-shake it from the bundle, allowing for all referenced declarations\n * to become eligible for tree-shaking as well.\n *\n * @codeGenApi\n */\nexport function ɵɵsetNgModuleScope(type: any, scope: NgModuleScopeInfoFromDecorator): unknown {\n  return noSideEffects(() => {\n    const ngModuleDef = getNgModuleDef(type, true);\n    ngModuleDef.declarations = convertToTypeArray(scope.declarations || EMPTY_ARRAY);\n    ngModuleDef.imports = convertToTypeArray(scope.imports || EMPTY_ARRAY);\n    ngModuleDef.exports = convertToTypeArray(scope.exports || EMPTY_ARRAY);\n\n    if (scope.bootstrap) {\n      // This only happens in local compilation mode.\n      ngModuleDef.bootstrap = convertToTypeArray(scope.bootstrap);\n    }\n\n    depsTracker.registerNgModule(type, scope);\n  });\n}\n\nfunction convertToTypeArray(\n  values: Type<any>[] | (() => Type<any>[]) | RawScopeInfoFromDecorator[],\n): Type<any>[] | (() => Type<any>[]) {\n  if (typeof values === 'function') {\n    return values;\n  }\n\n  const flattenValues = flatten(values);\n\n  if (flattenValues.some(isForwardRef)) {\n    return () => flattenValues.map(resolveForwardRef).map(maybeUnwrapModuleWithProviders);\n  } else {\n    return flattenValues.map(maybeUnwrapModuleWithProviders);\n  }\n}\n\nfunction maybeUnwrapModuleWithProviders(value: any): Type<any> {\n  return isModuleWithProviders(value) ? value.ngModule : (value as Type<any>);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertIndexInRange} from '../util/assert';\nimport {\n  bindingUpdated,\n  bindingUpdated2,\n  bindingUpdated3,\n  bindingUpdated4,\n  getBinding,\n  updateBinding,\n} from './bindings';\nimport {LView} from './interfaces/view';\nimport {getBindingRoot, getLView} from './state';\nimport {NO_CHANGE} from './tokens';\n\n/**\n * Bindings for pure functions are stored after regular bindings.\n *\n * |-------decls------|---------vars---------|                 |----- hostVars (dir1) ------|\n * ------------------------------------------------------------------------------------------\n * | nodes/refs/pipes | bindings | fn slots  | injector | dir1 | host bindings | host slots |\n * ------------------------------------------------------------------------------------------\n *                    ^                      ^\n *      TView.bindingStartIndex      TView.expandoStartIndex\n *\n * Pure function instructions are given an offset from the binding root. Adding the offset to the\n * binding root gives the first index where the bindings are stored. In component views, the binding\n * root is the bindingStartIndex. In host bindings, the binding root is the expandoStartIndex +\n * any directive instances + any hostVars in directives evaluated before it.\n *\n * See VIEW_DATA.md for more information about host binding resolution.\n */\n\n/**\n * If the value hasn't been saved, calls the pure function to store and return the\n * value. If it has been saved, returns the saved value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn Function that returns a value\n * @param thisArg Optional calling context of pureFn\n * @returns value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction0<T>(slotOffset: number, pureFn: () => T, thisArg?: any): T {\n  const bindingIndex = getBindingRoot() + slotOffset;\n  const lView = getLView();\n  return lView[bindingIndex] === NO_CHANGE\n    ? updateBinding(lView, bindingIndex, thisArg ? pureFn.call(thisArg) : pureFn())\n    : getBinding(lView, bindingIndex);\n}\n\n/**\n * If the value of the provided exp has changed, calls the pure function to return\n * an updated value. Or if the value has not changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn Function that returns an updated value\n * @param exp Updated expression value\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction1(\n  slotOffset: number,\n  pureFn: (v: any) => any,\n  exp: any,\n  thisArg?: any,\n): any {\n  return pureFunction1Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp, thisArg);\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction2(\n  slotOffset: number,\n  pureFn: (v1: any, v2: any) => any,\n  exp1: any,\n  exp2: any,\n  thisArg?: any,\n): any {\n  return pureFunction2Internal(\n    getLView(),\n    getBindingRoot(),\n    slotOffset,\n    pureFn,\n    exp1,\n    exp2,\n    thisArg,\n  );\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param exp3\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction3(\n  slotOffset: number,\n  pureFn: (v1: any, v2: any, v3: any) => any,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  thisArg?: any,\n): any {\n  return pureFunction3Internal(\n    getLView(),\n    getBindingRoot(),\n    slotOffset,\n    pureFn,\n    exp1,\n    exp2,\n    exp3,\n    thisArg,\n  );\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param exp3\n * @param exp4\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction4(\n  slotOffset: number,\n  pureFn: (v1: any, v2: any, v3: any, v4: any) => any,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  exp4: any,\n  thisArg?: any,\n): any {\n  return pureFunction4Internal(\n    getLView(),\n    getBindingRoot(),\n    slotOffset,\n    pureFn,\n    exp1,\n    exp2,\n    exp3,\n    exp4,\n    thisArg,\n  );\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param exp3\n * @param exp4\n * @param exp5\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction5(\n  slotOffset: number,\n  pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any) => any,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  exp4: any,\n  exp5: any,\n  thisArg?: any,\n): any {\n  const bindingIndex = getBindingRoot() + slotOffset;\n  const lView = getLView();\n  const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);\n  return bindingUpdated(lView, bindingIndex + 4, exp5) || different\n    ? updateBinding(\n        lView,\n        bindingIndex + 5,\n        thisArg\n          ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5)\n          : pureFn(exp1, exp2, exp3, exp4, exp5),\n      )\n    : getBinding(lView, bindingIndex + 5);\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param exp3\n * @param exp4\n * @param exp5\n * @param exp6\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction6(\n  slotOffset: number,\n  pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any) => any,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  exp4: any,\n  exp5: any,\n  exp6: any,\n  thisArg?: any,\n): any {\n  const bindingIndex = getBindingRoot() + slotOffset;\n  const lView = getLView();\n  const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);\n  return bindingUpdated2(lView, bindingIndex + 4, exp5, exp6) || different\n    ? updateBinding(\n        lView,\n        bindingIndex + 6,\n        thisArg\n          ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6)\n          : pureFn(exp1, exp2, exp3, exp4, exp5, exp6),\n      )\n    : getBinding(lView, bindingIndex + 6);\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param exp3\n * @param exp4\n * @param exp5\n * @param exp6\n * @param exp7\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction7(\n  slotOffset: number,\n  pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any) => any,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  exp4: any,\n  exp5: any,\n  exp6: any,\n  exp7: any,\n  thisArg?: any,\n): any {\n  const bindingIndex = getBindingRoot() + slotOffset;\n  const lView = getLView();\n  let different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);\n  return bindingUpdated3(lView, bindingIndex + 4, exp5, exp6, exp7) || different\n    ? updateBinding(\n        lView,\n        bindingIndex + 7,\n        thisArg\n          ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6, exp7)\n          : pureFn(exp1, exp2, exp3, exp4, exp5, exp6, exp7),\n      )\n    : getBinding(lView, bindingIndex + 7);\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param exp3\n * @param exp4\n * @param exp5\n * @param exp6\n * @param exp7\n * @param exp8\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunction8(\n  slotOffset: number,\n  pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any, v8: any) => any,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  exp4: any,\n  exp5: any,\n  exp6: any,\n  exp7: any,\n  exp8: any,\n  thisArg?: any,\n): any {\n  const bindingIndex = getBindingRoot() + slotOffset;\n  const lView = getLView();\n  const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);\n  return bindingUpdated4(lView, bindingIndex + 4, exp5, exp6, exp7, exp8) || different\n    ? updateBinding(\n        lView,\n        bindingIndex + 8,\n        thisArg\n          ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8)\n          : pureFn(exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8),\n      )\n    : getBinding(lView, bindingIndex + 8);\n}\n\n/**\n * pureFunction instruction that can support any number of bindings.\n *\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn A pure function that takes binding values and builds an object or array\n * containing those values.\n * @param exps An array of binding values\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n * @codeGenApi\n */\nexport function ɵɵpureFunctionV(\n  slotOffset: number,\n  pureFn: (...v: any[]) => any,\n  exps: any[],\n  thisArg?: any,\n): any {\n  return pureFunctionVInternal(getLView(), getBindingRoot(), slotOffset, pureFn, exps, thisArg);\n}\n\n/**\n * Results of a pure function invocation are stored in LView in a dedicated slot that is initialized\n * to NO_CHANGE. In rare situations a pure pipe might throw an exception on the very first\n * invocation and not produce any valid results. In this case LView would keep holding the NO_CHANGE\n * value. The NO_CHANGE is not something that we can use in expressions / bindings thus we convert\n * it to `undefined`.\n */\nfunction getPureFunctionReturnValue(lView: LView, returnValueIndex: number) {\n  ngDevMode && assertIndexInRange(lView, returnValueIndex);\n  const lastReturnValue = lView[returnValueIndex];\n  return lastReturnValue === NO_CHANGE ? undefined : lastReturnValue;\n}\n\n/**\n * If the value of the provided exp has changed, calls the pure function to return\n * an updated value. Or if the value has not changed, returns cached value.\n *\n * @param lView LView in which the function is being executed.\n * @param bindingRoot Binding root index.\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn Function that returns an updated value\n * @param exp Updated expression value\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n */\nexport function pureFunction1Internal(\n  lView: LView,\n  bindingRoot: number,\n  slotOffset: number,\n  pureFn: (v: any) => any,\n  exp: any,\n  thisArg?: any,\n): any {\n  const bindingIndex = bindingRoot + slotOffset;\n  return bindingUpdated(lView, bindingIndex, exp)\n    ? updateBinding(lView, bindingIndex + 1, thisArg ? pureFn.call(thisArg, exp) : pureFn(exp))\n    : getPureFunctionReturnValue(lView, bindingIndex + 1);\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param lView LView in which the function is being executed.\n *    @param bindingRoot Binding root index.\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n */\nexport function pureFunction2Internal(\n  lView: LView,\n  bindingRoot: number,\n  slotOffset: number,\n  pureFn: (v1: any, v2: any) => any,\n  exp1: any,\n  exp2: any,\n  thisArg?: any,\n): any {\n  const bindingIndex = bindingRoot + slotOffset;\n  return bindingUpdated2(lView, bindingIndex, exp1, exp2)\n    ? updateBinding(\n        lView,\n        bindingIndex + 2,\n        thisArg ? pureFn.call(thisArg, exp1, exp2) : pureFn(exp1, exp2),\n      )\n    : getPureFunctionReturnValue(lView, bindingIndex + 2);\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param lView LView in which the function is being executed.\n * @param bindingRoot Binding root index.\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param exp3\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n */\nexport function pureFunction3Internal(\n  lView: LView,\n  bindingRoot: number,\n  slotOffset: number,\n  pureFn: (v1: any, v2: any, v3: any) => any,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  thisArg?: any,\n): any {\n  const bindingIndex = bindingRoot + slotOffset;\n  return bindingUpdated3(lView, bindingIndex, exp1, exp2, exp3)\n    ? updateBinding(\n        lView,\n        bindingIndex + 3,\n        thisArg ? pureFn.call(thisArg, exp1, exp2, exp3) : pureFn(exp1, exp2, exp3),\n      )\n    : getPureFunctionReturnValue(lView, bindingIndex + 3);\n}\n\n/**\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param lView LView in which the function is being executed.\n * @param bindingRoot Binding root index.\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn\n * @param exp1\n * @param exp2\n * @param exp3\n * @param exp4\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n *\n */\nexport function pureFunction4Internal(\n  lView: LView,\n  bindingRoot: number,\n  slotOffset: number,\n  pureFn: (v1: any, v2: any, v3: any, v4: any) => any,\n  exp1: any,\n  exp2: any,\n  exp3: any,\n  exp4: any,\n  thisArg?: any,\n): any {\n  const bindingIndex = bindingRoot + slotOffset;\n  return bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4)\n    ? updateBinding(\n        lView,\n        bindingIndex + 4,\n        thisArg ? pureFn.call(thisArg, exp1, exp2, exp3, exp4) : pureFn(exp1, exp2, exp3, exp4),\n      )\n    : getPureFunctionReturnValue(lView, bindingIndex + 4);\n}\n\n/**\n * pureFunction instruction that can support any number of bindings.\n *\n * If the value of any provided exp has changed, calls the pure function to return\n * an updated value. Or if no values have changed, returns cached value.\n *\n * @param lView LView in which the function is being executed.\n * @param bindingRoot Binding root index.\n * @param slotOffset the offset from binding root to the reserved slot\n * @param pureFn A pure function that takes binding values and builds an object or array\n * containing those values.\n * @param exps An array of binding values\n * @param thisArg Optional calling context of pureFn\n * @returns Updated or cached value\n */\nexport function pureFunctionVInternal(\n  lView: LView,\n  bindingRoot: number,\n  slotOffset: number,\n  pureFn: (...v: any[]) => any,\n  exps: any[],\n  thisArg?: any,\n): any {\n  let bindingIndex = bindingRoot + slotOffset;\n  let different = false;\n  for (let i = 0; i < exps.length; i++) {\n    bindingUpdated(lView, bindingIndex++, exps[i]) && (different = true);\n  }\n  return different\n    ? updateBinding(lView, bindingIndex, pureFn.apply(thisArg, exps))\n    : getPureFunctionReturnValue(lView, bindingIndex);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {PipeTransform} from '../change_detection/pipe_transform';\nimport {setInjectImplementation} from '../di/inject_switch';\nimport {formatRuntimeError, RuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type} from '../interface/type';\n\nimport {InjectorProfilerContext, setInjectorProfilerContext} from './debug/injector_profiler';\nimport {getFactoryDef} from './definition_factory';\nimport {NodeInjector, setIncludeViewProviders} from './di';\nimport {ɵɵdirectiveInject} from './instructions/all';\nimport {isHostComponentStandalone} from './instructions/element_validation';\nimport {PipeDef, PipeDefList} from './interfaces/definition';\nimport {TTextNode} from './interfaces/node';\nimport {CONTEXT, DECLARATION_COMPONENT_VIEW, HEADER_OFFSET, LView, TVIEW} from './interfaces/view';\nimport {\n  pureFunction1Internal,\n  pureFunction2Internal,\n  pureFunction3Internal,\n  pureFunction4Internal,\n  pureFunctionVInternal,\n} from './pure_function';\nimport {getBindingRoot, getCurrentTNode, getLView, getTView} from './state';\nimport {load, store} from './util/view_utils';\n\n/**\n * Create a pipe.\n *\n * @param index Pipe index where the pipe will be stored.\n * @param pipeName The name of the pipe\n * @returns T the instance of the pipe.\n *\n * @codeGenApi\n */\nexport function ɵɵpipe(index: number, pipeName: string): any {\n  const tView = getTView();\n  let pipeDef: PipeDef<any>;\n  const adjustedIndex = index + HEADER_OFFSET;\n\n  if (tView.firstCreatePass) {\n    // The `getPipeDef` throws if a pipe with a given name is not found\n    // (so we use non-null assertion below).\n    pipeDef = getPipeDef(pipeName, tView.pipeRegistry)!;\n    tView.data[adjustedIndex] = pipeDef;\n    if (pipeDef.onDestroy) {\n      (tView.destroyHooks ??= []).push(adjustedIndex, pipeDef.onDestroy);\n    }\n  } else {\n    pipeDef = tView.data[adjustedIndex] as PipeDef<any>;\n  }\n\n  const pipeFactory = pipeDef.factory || (pipeDef.factory = getFactoryDef(pipeDef.type, true));\n\n  let previousInjectorProfilerContext: InjectorProfilerContext;\n  if (ngDevMode) {\n    previousInjectorProfilerContext = setInjectorProfilerContext({\n      injector: new NodeInjector(getCurrentTNode() as TTextNode, getLView()),\n      token: pipeDef.type,\n    });\n  }\n  const previousInjectImplementation = setInjectImplementation(ɵɵdirectiveInject);\n  try {\n    // DI for pipes is supposed to behave like directives when placed on a component\n    // host node, which means that we have to disable access to `viewProviders`.\n    const previousIncludeViewProviders = setIncludeViewProviders(false);\n    const pipeInstance = pipeFactory();\n    setIncludeViewProviders(previousIncludeViewProviders);\n    store(tView, getLView(), adjustedIndex, pipeInstance);\n    return pipeInstance;\n  } finally {\n    // we have to restore the injector implementation in finally, just in case the creation of the\n    // pipe throws an error.\n    setInjectImplementation(previousInjectImplementation);\n    ngDevMode && setInjectorProfilerContext(previousInjectorProfilerContext!);\n  }\n}\n\n/**\n * Searches the pipe registry for a pipe with the given name. If one is found,\n * returns the pipe. Otherwise, an error is thrown because the pipe cannot be resolved.\n *\n * @param name Name of pipe to resolve\n * @param registry Full list of available pipes\n * @returns Matching PipeDef\n */\nfunction getPipeDef(name: string, registry: PipeDefList | null): PipeDef<any> | undefined {\n  if (registry) {\n    if (ngDevMode) {\n      const pipes = registry.filter((pipe) => pipe.name === name);\n      // TODO: Throw an error in the next major\n      if (pipes.length > 1) {\n        console.warn(\n          formatRuntimeError(\n            RuntimeErrorCode.MULTIPLE_MATCHING_PIPES,\n            getMultipleMatchingPipesMessage(name),\n          ),\n        );\n      }\n    }\n    for (let i = registry.length - 1; i >= 0; i--) {\n      const pipeDef = registry[i];\n      if (name === pipeDef.name) {\n        return pipeDef;\n      }\n    }\n  }\n  if (ngDevMode) {\n    throw new RuntimeError(RuntimeErrorCode.PIPE_NOT_FOUND, getPipeNotFoundErrorMessage(name));\n  }\n  return;\n}\n\n/**\n * Generates a helpful error message for the user when multiple pipes match the name.\n *\n * @param name Name of the pipe\n * @returns The error message\n */\nfunction getMultipleMatchingPipesMessage(name: string) {\n  const lView = getLView();\n  const declarationLView = lView[DECLARATION_COMPONENT_VIEW] as LView<Type<unknown>>;\n  const context = declarationLView[CONTEXT];\n  const hostIsStandalone = isHostComponentStandalone(lView);\n  const componentInfoMessage = context ? ` in the '${context.constructor.name}' component` : '';\n  const verifyMessage = `check ${\n    hostIsStandalone ? \"'@Component.imports' of this component\" : 'the imports of this module'\n  }`;\n  const errorMessage = `Multiple pipes match the name \\`${name}\\`${componentInfoMessage}. ${verifyMessage}`;\n  return errorMessage;\n}\n\n/**\n * Generates a helpful error message for the user when a pipe is not found.\n *\n * @param name Name of the missing pipe\n * @returns The error message\n */\nfunction getPipeNotFoundErrorMessage(name: string) {\n  const lView = getLView();\n  const declarationLView = lView[DECLARATION_COMPONENT_VIEW] as LView<Type<unknown>>;\n  const context = declarationLView[CONTEXT];\n  const hostIsStandalone = isHostComponentStandalone(lView);\n  const componentInfoMessage = context ? ` in the '${context.constructor.name}' component` : '';\n  const verifyMessage = `Verify that it is ${\n    hostIsStandalone\n      ? \"included in the '@Component.imports' of this component\"\n      : 'declared or imported in this module'\n  }`;\n  const errorMessage = `The pipe '${name}' could not be found${componentInfoMessage}. ${verifyMessage}`;\n  return errorMessage;\n}\n\n/**\n * Invokes a pipe with 1 arguments.\n *\n * This instruction acts as a guard to {@link PipeTransform#transform} invoking\n * the pipe only when an input to the pipe changes.\n *\n * @param index Pipe index where the pipe was stored on creation.\n * @param offset the binding offset\n * @param v1 1st argument to {@link PipeTransform#transform}.\n *\n * @codeGenApi\n */\nexport function ɵɵpipeBind1(index: number, offset: number, v1: any): any {\n  const adjustedIndex = index + HEADER_OFFSET;\n  const lView = getLView();\n  const pipeInstance = load<PipeTransform>(lView, adjustedIndex);\n  return isPure(lView, adjustedIndex)\n    ? pureFunction1Internal(\n        lView,\n        getBindingRoot(),\n        offset,\n        pipeInstance.transform,\n        v1,\n        pipeInstance,\n      )\n    : pipeInstance.transform(v1);\n}\n\n/**\n * Invokes a pipe with 2 arguments.\n *\n * This instruction acts as a guard to {@link PipeTransform#transform} invoking\n * the pipe only when an input to the pipe changes.\n *\n * @param index Pipe index where the pipe was stored on creation.\n * @param slotOffset the offset in the reserved slot space\n * @param v1 1st argument to {@link PipeTransform#transform}.\n * @param v2 2nd argument to {@link PipeTransform#transform}.\n *\n * @codeGenApi\n */\nexport function ɵɵpipeBind2(index: number, slotOffset: number, v1: any, v2: any): any {\n  const adjustedIndex = index + HEADER_OFFSET;\n  const lView = getLView();\n  const pipeInstance = load<PipeTransform>(lView, adjustedIndex);\n  return isPure(lView, adjustedIndex)\n    ? pureFunction2Internal(\n        lView,\n        getBindingRoot(),\n        slotOffset,\n        pipeInstance.transform,\n        v1,\n        v2,\n        pipeInstance,\n      )\n    : pipeInstance.transform(v1, v2);\n}\n\n/**\n * Invokes a pipe with 3 arguments.\n *\n * This instruction acts as a guard to {@link PipeTransform#transform} invoking\n * the pipe only when an input to the pipe changes.\n *\n * @param index Pipe index where the pipe was stored on creation.\n * @param slotOffset the offset in the reserved slot space\n * @param v1 1st argument to {@link PipeTransform#transform}.\n * @param v2 2nd argument to {@link PipeTransform#transform}.\n * @param v3 4rd argument to {@link PipeTransform#transform}.\n *\n * @codeGenApi\n */\nexport function ɵɵpipeBind3(index: number, slotOffset: number, v1: any, v2: any, v3: any): any {\n  const adjustedIndex = index + HEADER_OFFSET;\n  const lView = getLView();\n  const pipeInstance = load<PipeTransform>(lView, adjustedIndex);\n  return isPure(lView, adjustedIndex)\n    ? pureFunction3Internal(\n        lView,\n        getBindingRoot(),\n        slotOffset,\n        pipeInstance.transform,\n        v1,\n        v2,\n        v3,\n        pipeInstance,\n      )\n    : pipeInstance.transform(v1, v2, v3);\n}\n\n/**\n * Invokes a pipe with 4 arguments.\n *\n * This instruction acts as a guard to {@link PipeTransform#transform} invoking\n * the pipe only when an input to the pipe changes.\n *\n * @param index Pipe index where the pipe was stored on creation.\n * @param slotOffset the offset in the reserved slot space\n * @param v1 1st argument to {@link PipeTransform#transform}.\n * @param v2 2nd argument to {@link PipeTransform#transform}.\n * @param v3 3rd argument to {@link PipeTransform#transform}.\n * @param v4 4th argument to {@link PipeTransform#transform}.\n *\n * @codeGenApi\n */\nexport function ɵɵpipeBind4(\n  index: number,\n  slotOffset: number,\n  v1: any,\n  v2: any,\n  v3: any,\n  v4: any,\n): any {\n  const adjustedIndex = index + HEADER_OFFSET;\n  const lView = getLView();\n  const pipeInstance = load<PipeTransform>(lView, adjustedIndex);\n  return isPure(lView, adjustedIndex)\n    ? pureFunction4Internal(\n        lView,\n        getBindingRoot(),\n        slotOffset,\n        pipeInstance.transform,\n        v1,\n        v2,\n        v3,\n        v4,\n        pipeInstance,\n      )\n    : pipeInstance.transform(v1, v2, v3, v4);\n}\n\n/**\n * Invokes a pipe with variable number of arguments.\n *\n * This instruction acts as a guard to {@link PipeTransform#transform} invoking\n * the pipe only when an input to the pipe changes.\n *\n * @param index Pipe index where the pipe was stored on creation.\n * @param slotOffset the offset in the reserved slot space\n * @param values Array of arguments to pass to {@link PipeTransform#transform} method.\n *\n * @codeGenApi\n */\nexport function ɵɵpipeBindV(index: number, slotOffset: number, values: [any, ...any[]]): any {\n  const adjustedIndex = index + HEADER_OFFSET;\n  const lView = getLView();\n  const pipeInstance = load<PipeTransform>(lView, adjustedIndex);\n  return isPure(lView, adjustedIndex)\n    ? pureFunctionVInternal(\n        lView,\n        getBindingRoot(),\n        slotOffset,\n        pipeInstance.transform,\n        values,\n        pipeInstance,\n      )\n    : pipeInstance.transform.apply(pipeInstance, values);\n}\n\nfunction isPure(lView: LView, index: number): boolean {\n  return (<PipeDef<any>>lView[TVIEW].data[index]).pure;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {createTemplateRef, TemplateRef} from '../linker/template_ref';\nimport {TNode} from './interfaces/node';\nimport {LView} from './interfaces/view';\n\n/**\n * Retrieves `TemplateRef` instance from `Injector` when a local reference is placed on the\n * `<ng-template>` element.\n *\n * @codeGenApi\n */\nexport function ɵɵtemplateRefExtractor(tNode: TNode, lView: LView): TemplateRef<any> | null {\n  return createTemplateRef(tNode, lView);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {depsTracker} from './deps_tracker/deps_tracker';\nimport {\n  ComponentType,\n  DependencyTypeList,\n  RawScopeInfoFromDecorator,\n} from './interfaces/definition';\n\nexport function ɵɵgetComponentDepsFactory(\n  type: ComponentType<any>,\n  rawImports?: RawScopeInfoFromDecorator[],\n): () => DependencyTypeList {\n  return () => {\n    try {\n      return depsTracker.getComponentDependencies(type, rawImports).dependencies;\n    } catch (e) {\n      console.error(\n        `Computing dependencies in local compilation mode for the component \"${type.name}\" failed with the exception:`,\n        e,\n      );\n      throw e;\n    }\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../../interface/type';\nimport {getComponentDef} from '../def_getters';\nimport {ClassDebugInfo} from '../interfaces/definition';\n\n/**\n * Sets the debug info for an Angular class.\n *\n * This runtime is guarded by ngDevMode flag.\n */\nexport function ɵsetClassDebugInfo(type: Type<any>, debugInfo: ClassDebugInfo): void {\n  const def = getComponentDef(type);\n  if (def !== null) {\n    def.debugInfo = debugInfo;\n  }\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {assertDefined, assertEqual, assertNotEqual} from '../util/assert';\nimport {assertLView} from './assert';\nimport {getComponentDef} from './def_getters';\nimport {assertComponentDef} from './errors';\nimport {refreshView} from './instructions/change_detection';\nimport {renderView} from './instructions/render';\nimport {CONTAINER_HEADER_OFFSET} from './interfaces/container';\nimport {ComponentDef} from './interfaces/definition';\nimport {getTrackedLViews} from './interfaces/lview_tracking';\nimport {isTNodeShape, TElementNode, TNodeFlags, TNodeType} from './interfaces/node';\nimport {isLContainer, isLView, isRootView} from './interfaces/type_checks';\nimport {\n  CHILD_HEAD,\n  CHILD_TAIL,\n  CONTEXT,\n  ENVIRONMENT,\n  HEADER_OFFSET,\n  HOST,\n  INJECTOR,\n  LView,\n  NEXT,\n  PARENT,\n  RENDERER,\n  T_HOST,\n  TVIEW,\n} from './interfaces/view';\nimport {assertTNodeType} from './node_assert';\nimport {destroyLView, removeViewFromDOM} from './node_manipulation';\nimport {RendererFactory} from './interfaces/renderer';\nimport {NgZone} from '../zone';\nimport {ViewEncapsulation} from '../metadata/view';\nimport {NG_COMP_DEF} from './fields';\nimport {\n  createLView,\n  getInitialLViewFlagsFromDef,\n  getOrCreateComponentTView,\n} from './view/construction';\n\n/** Represents `import.meta` plus some information that's not in the built-in types. */\ntype ImportMetaExtended = ImportMeta & {\n  hot?: {\n    send?: (name: string, payload: unknown) => void;\n  };\n};\n\n/**\n * Gets the URL from which the client will fetch a new version of a component's metadata so it\n * can be replaced during hot module reloading.\n * @param id Unique ID for the component, generated during compile time.\n * @param timestamp Time at which the request happened.\n * @param base Base URL against which to resolve relative paths.\n * @codeGenApi\n */\nexport function ɵɵgetReplaceMetadataURL(id: string, timestamp: string, base: string): string {\n  const url = `./@ng/component?c=${id}&t=${encodeURIComponent(timestamp)}`;\n  return new URL(url, base).href;\n}\n\n/**\n * Replaces the metadata of a component type and re-renders all live instances of the component.\n * @param type Class whose metadata will be replaced.\n * @param applyMetadata Callback that will apply a new set of metadata on the `type` when invoked.\n * @param environment Syntehtic namespace imports that need to be passed along to the callback.\n * @param locals Local symbols from the source location that have to be exposed to the callback.\n * @param importMeta `import.meta` from the call site of the replacement function. Optional since\n *   it isn't used internally.\n * @param id ID to the class being replaced. **Not** the same as the component definition ID.\n *   Optional since the ID might not be available internally.\n * @codeGenApi\n */\nexport function ɵɵreplaceMetadata(\n  type: Type<unknown>,\n  applyMetadata: (...args: [Type<unknown>, unknown[], ...unknown[]]) => void,\n  namespaces: unknown[],\n  locals: unknown[],\n  importMeta: ImportMetaExtended | null = null,\n  id: string | null = null,\n) {\n  ngDevMode && assertComponentDef(type);\n  const currentDef = getComponentDef(type)!;\n\n  // The reason `applyMetadata` is a callback that is invoked (almost) immediately is because\n  // the compiler usually produces more code than just the component definition, e.g. there\n  // can be functions for embedded views, the variables for the constant pool and `setClassMetadata`\n  // calls. The callback allows us to keep them isolate from the rest of the app and to invoke\n  // them at the right time.\n  applyMetadata.apply(null, [type, namespaces, ...locals]);\n\n  const {newDef, oldDef} = mergeWithExistingDefinition(currentDef, getComponentDef(type)!);\n\n  // TODO(crisbeto): the `applyMetadata` call above will replace the definition on the type.\n  // Ideally we should adjust the compiler output so the metadata is returned, however that'll\n  // require some internal changes. We re-add the metadata here manually.\n  (type as any)[NG_COMP_DEF] = newDef;\n\n  // If a `tView` hasn't been created yet, it means that this component hasn't been instantianted\n  // before. In this case there's nothing left for us to do aside from patching it in.\n  if (oldDef.tView) {\n    const trackedViews = getTrackedLViews().values();\n    for (const root of trackedViews) {\n      // Note: we have the additional check, because `IsRoot` can also indicate\n      // a component created through something like `createComponent`.\n      if (isRootView(root) && root[PARENT] === null) {\n        recreateMatchingLViews(importMeta, id, newDef, oldDef, root);\n      }\n    }\n  }\n}\n\n/**\n * Merges two component definitions while preseving the original one in place.\n * @param currentDef Definition that should receive the new metadata.\n * @param newDef Source of the new metadata.\n */\nfunction mergeWithExistingDefinition(\n  currentDef: ComponentDef<unknown>,\n  newDef: ComponentDef<unknown>,\n) {\n  // Clone the current definition since we reference its original data further\n  // down in the replacement process (e.g. when destroying the renderer).\n  const clone = {...currentDef};\n\n  // Assign the new metadata in place while preserving the object literal. It's important to\n  // Keep the object in place, because there can be references to it, for example in the\n  // `directiveDefs` of another definition.\n  const replacement = Object.assign(currentDef, newDef, {\n    // We need to keep the existing directive and pipe defs, because they can get patched on\n    // by a call to `setComponentScope` from a module file. That call won't make it into the\n    // HMR replacement function, because it lives in an entirely different file.\n    directiveDefs: clone.directiveDefs,\n    pipeDefs: clone.pipeDefs,\n\n    // Preserve the old `setInput` function, because it has some state.\n    // This is fine, because the component instance is preserved as well.\n    setInput: clone.setInput,\n\n    // Externally this is redundant since we redeclare the definition using the original type.\n    // Internally we may receive a definition with an alternate, but identical, type so we have\n    // to ensure that the original one is preserved.\n    type: clone.type,\n  });\n\n  ngDevMode && assertEqual(replacement, currentDef, 'Expected definition to be merged in place');\n  return {newDef: replacement, oldDef: clone};\n}\n\n/**\n * Finds all LViews matching a specific component definition and recreates them.\n * @param importMeta `import.meta` information.\n * @param id HMR ID of the component.\n * @param oldDef Component definition to search for.\n * @param rootLView View from which to start the search.\n */\nfunction recreateMatchingLViews(\n  importMeta: ImportMetaExtended | null,\n  id: string | null,\n  newDef: ComponentDef<unknown>,\n  oldDef: ComponentDef<unknown>,\n  rootLView: LView,\n): void {\n  ngDevMode &&\n    assertDefined(\n      oldDef.tView,\n      'Expected a component definition that has been instantiated at least once',\n    );\n\n  const tView = rootLView[TVIEW];\n\n  // Use `tView` to match the LView since `instanceof` can\n  // produce false positives when using inheritance.\n  if (tView === oldDef.tView) {\n    ngDevMode && assertComponentDef(oldDef.type);\n    recreateLView(importMeta, id, newDef, oldDef, rootLView);\n    return;\n  }\n\n  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {\n    const current = rootLView[i];\n\n    if (isLContainer(current)) {\n      // The host can be an LView if a component is injecting `ViewContainerRef`.\n      if (isLView(current[HOST])) {\n        recreateMatchingLViews(importMeta, id, newDef, oldDef, current[HOST]);\n      }\n\n      for (let j = CONTAINER_HEADER_OFFSET; j < current.length; j++) {\n        recreateMatchingLViews(importMeta, id, newDef, oldDef, current[j]);\n      }\n    } else if (isLView(current)) {\n      recreateMatchingLViews(importMeta, id, newDef, oldDef, current);\n    }\n  }\n}\n\n/**\n * Removes any cached renderers from the factory for the provided type.\n * This is currently used by the HMR logic to ensure Renderers are kept\n * synchronized with any definition metadata updates.\n * @param factory A RendererFactory2 instance.\n * @param def A ComponentDef instance.\n */\nfunction clearRendererCache(factory: RendererFactory, def: ComponentDef<unknown>) {\n  // Cast to read a private field.\n  // NOTE: This must be kept synchronized with the renderer factory implementation in\n  // platform-browser and platform-browser/animations.\n  (factory as {componentReplaced?: (id: string) => void}).componentReplaced?.(def.id);\n}\n\n/**\n * Recreates an LView in-place from a new component definition.\n * @param importMeta `import.meta` information.\n * @param id HMR ID for the component.\n * @param newDef Definition from which to recreate the view.\n * @param oldDef Previous component definition being swapped out.\n * @param lView View to be recreated.\n */\nfunction recreateLView(\n  importMeta: ImportMetaExtended | null,\n  id: string | null,\n  newDef: ComponentDef<unknown>,\n  oldDef: ComponentDef<unknown>,\n  lView: LView<unknown>,\n): void {\n  const instance = lView[CONTEXT];\n  let host = lView[HOST]! as HTMLElement;\n  // In theory the parent can also be an LContainer, but it appears like that's\n  // only the case for embedded views which we won't be replacing here.\n  const parentLView = lView[PARENT] as LView;\n  ngDevMode && assertLView(parentLView);\n  const tNode = lView[T_HOST] as TElementNode;\n  ngDevMode && assertTNodeType(tNode, TNodeType.Element);\n  ngDevMode && assertNotEqual(newDef, oldDef, 'Expected different component definition');\n  const zone = lView[INJECTOR].get(NgZone, null);\n  const recreate = () => {\n    // If we're recreating a component with shadow DOM encapsulation, it will have attached a\n    // shadow root. The browser will throw if we attempt to attach another one and there's no way\n    // to detach it. Our only option is to make a clone only of the root node, replace the node\n    // with the clone and use it for the newly-created LView.\n    if (oldDef.encapsulation === ViewEncapsulation.ShadowDom) {\n      const newHost = host.cloneNode(false) as HTMLElement;\n      host.replaceWith(newHost);\n      host = newHost;\n    }\n\n    // Recreate the TView since the template might've changed.\n    const newTView = getOrCreateComponentTView(newDef);\n\n    // Create a new LView from the new TView, but reusing the existing TNode and DOM node.\n    const newLView = createLView(\n      parentLView,\n      newTView,\n      instance,\n      getInitialLViewFlagsFromDef(newDef),\n      host,\n      tNode,\n      null,\n      null, // The renderer will be created a bit further down once the old one is destroyed.\n      null,\n      null,\n      null,\n    );\n\n    // Detach the LView from its current place in the tree so we don't\n    // start traversing any siblings and modifying their structure.\n    replaceLViewInTree(parentLView, lView, newLView, tNode.index);\n\n    // Destroy the detached LView.\n    destroyLView(lView[TVIEW], lView);\n\n    // Always force the creation of a new renderer to ensure state captured during construction\n    // stays consistent with the new component definition by clearing any old ached factories.\n    const rendererFactory = lView[ENVIRONMENT].rendererFactory;\n    clearRendererCache(rendererFactory, oldDef);\n\n    // Patch a brand-new renderer onto the new view only after the old\n    // view is destroyed so that the runtime doesn't try to reuse it.\n    newLView[RENDERER] = rendererFactory.createRenderer(host, newDef);\n\n    // Remove the nodes associated with the destroyed LView. This removes the\n    // descendants, but not the host which we want to stay in place.\n    removeViewFromDOM(lView[TVIEW], lView);\n\n    // Reset the content projection state of the TNode before the first render.\n    // Note that this has to happen after the LView has been destroyed or we\n    // risk some projected nodes not being removed correctly.\n    resetProjectionState(tNode);\n\n    // Creation pass for the new view.\n    renderView(newTView, newLView, instance);\n\n    // Update pass for the new view.\n    refreshView(newTView, newLView, newTView.template, instance);\n  };\n\n  // The callback isn't guaranteed to be inside the Zone so we need to bring it in ourselves.\n  if (zone === null) {\n    executeWithInvalidateFallback(importMeta, id, recreate);\n  } else {\n    zone.run(() => executeWithInvalidateFallback(importMeta, id, recreate));\n  }\n}\n\n/**\n * Runs an HMR-related function and falls back to\n * invalidating the HMR data if it throws an error.\n */\nfunction executeWithInvalidateFallback(\n  importMeta: ImportMetaExtended | null,\n  id: string | null,\n  callback: () => void,\n) {\n  try {\n    callback();\n  } catch (e) {\n    const error = e as {message?: string; stack?: string};\n\n    // If we have all the necessary information and APIs to send off the invalidation\n    // request, send it before rethrowing so the dev server can decide what to do.\n    if (id !== null && error.message) {\n      const toLog = error.message + (error.stack ? '\\n' + error.stack : '');\n      importMeta?.hot?.send?.('angular:invalidate', {id, message: toLog, error: true});\n    }\n\n    // Throw the error in case the page doesn't get refreshed.\n    throw e;\n  }\n}\n\n/**\n * Replaces one LView in the tree with another one.\n * @param parentLView Parent of the LView being replaced.\n * @param oldLView LView being replaced.\n * @param newLView Replacement LView to be inserted.\n * @param index Index at which the LView should be inserted.\n */\nfunction replaceLViewInTree(\n  parentLView: LView,\n  oldLView: LView,\n  newLView: LView,\n  index: number,\n): void {\n  // Update the sibling whose `NEXT` pointer refers to the old view.\n  for (let i = HEADER_OFFSET; i < parentLView[TVIEW].bindingStartIndex; i++) {\n    const current = parentLView[i];\n\n    if ((isLView(current) || isLContainer(current)) && current[NEXT] === oldLView) {\n      current[NEXT] = newLView;\n      break;\n    }\n  }\n\n  // Set the new view as the head, if the old view was first.\n  if (parentLView[CHILD_HEAD] === oldLView) {\n    parentLView[CHILD_HEAD] = newLView;\n  }\n\n  // Set the new view as the tail, if the old view was last.\n  if (parentLView[CHILD_TAIL] === oldLView) {\n    parentLView[CHILD_TAIL] = newLView;\n  }\n\n  // Update the `NEXT` pointer to the same as the old view.\n  newLView[NEXT] = oldLView[NEXT];\n\n  // Clear out the `NEXT` of the old view.\n  oldLView[NEXT] = null;\n\n  // Insert the new LView at the correct index.\n  parentLView[index] = newLView;\n}\n\n/**\n * Child nodes mutate the `projection` state of their parent node as they're being projected.\n * This function resets the `project` back to its initial state.\n * @param tNode\n */\nfunction resetProjectionState(tNode: TElementNode): void {\n  // The `projection` is mutated by child nodes as they're being projected. We need to\n  // reset it to the initial state so projection works after the template is swapped out.\n  if (tNode.projection !== null) {\n    for (const current of tNode.projection) {\n      if (isTNodeShape(current)) {\n        // Reset `projectionNext` since it can affect the traversal order during projection.\n        current.projectionNext = null;\n        current.flags &= ~TNodeFlags.isProjected;\n      }\n    }\n    tNode.projection = null;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {forwardRef, resolveForwardRef} from '../../di/forward_ref';\nimport {ɵɵinject, ɵɵinvalidFactoryDep} from '../../di/injector_compatibility';\nimport {ɵɵdefineInjectable, ɵɵdefineInjector} from '../../di/interface/defs';\nimport {registerNgModuleType} from '../../linker/ng_module_registration';\nimport * as iframe_attrs_validation from '../../sanitization/iframe_attrs_validation';\nimport * as sanitization from '../../sanitization/sanitization';\nimport * as r3 from '../index';\n\n/**\n * A mapping of the @angular/core API surface used in generated expressions to the actual symbols.\n *\n * This should be kept up to date with the public exports of @angular/core.\n */\nexport const angularCoreEnv: {[name: string]: unknown} = (() => ({\n  'ɵɵattribute': r3.ɵɵattribute,\n  'ɵɵattributeInterpolate1': r3.ɵɵattributeInterpolate1,\n  'ɵɵattributeInterpolate2': r3.ɵɵattributeInterpolate2,\n  'ɵɵattributeInterpolate3': r3.ɵɵattributeInterpolate3,\n  'ɵɵattributeInterpolate4': r3.ɵɵattributeInterpolate4,\n  'ɵɵattributeInterpolate5': r3.ɵɵattributeInterpolate5,\n  'ɵɵattributeInterpolate6': r3.ɵɵattributeInterpolate6,\n  'ɵɵattributeInterpolate7': r3.ɵɵattributeInterpolate7,\n  'ɵɵattributeInterpolate8': r3.ɵɵattributeInterpolate8,\n  'ɵɵattributeInterpolateV': r3.ɵɵattributeInterpolateV,\n  'ɵɵdefineComponent': r3.ɵɵdefineComponent,\n  'ɵɵdefineDirective': r3.ɵɵdefineDirective,\n  'ɵɵdefineInjectable': ɵɵdefineInjectable,\n  'ɵɵdefineInjector': ɵɵdefineInjector,\n  'ɵɵdefineNgModule': r3.ɵɵdefineNgModule,\n  'ɵɵdefinePipe': r3.ɵɵdefinePipe,\n  'ɵɵdirectiveInject': r3.ɵɵdirectiveInject,\n  'ɵɵgetInheritedFactory': r3.ɵɵgetInheritedFactory,\n  'ɵɵinject': ɵɵinject,\n  'ɵɵinjectAttribute': r3.ɵɵinjectAttribute,\n  'ɵɵinvalidFactory': r3.ɵɵinvalidFactory,\n  'ɵɵinvalidFactoryDep': ɵɵinvalidFactoryDep,\n  'ɵɵtemplateRefExtractor': r3.ɵɵtemplateRefExtractor,\n  'ɵɵresetView': r3.ɵɵresetView,\n  'ɵɵHostDirectivesFeature': r3.ɵɵHostDirectivesFeature,\n  'ɵɵNgOnChangesFeature': r3.ɵɵNgOnChangesFeature,\n  'ɵɵProvidersFeature': r3.ɵɵProvidersFeature,\n  'ɵɵCopyDefinitionFeature': r3.ɵɵCopyDefinitionFeature,\n  'ɵɵInheritDefinitionFeature': r3.ɵɵInheritDefinitionFeature,\n  'ɵɵExternalStylesFeature': r3.ɵɵExternalStylesFeature,\n  'ɵɵnextContext': r3.ɵɵnextContext,\n  'ɵɵnamespaceHTML': r3.ɵɵnamespaceHTML,\n  'ɵɵnamespaceMathML': r3.ɵɵnamespaceMathML,\n  'ɵɵnamespaceSVG': r3.ɵɵnamespaceSVG,\n  'ɵɵenableBindings': r3.ɵɵenableBindings,\n  'ɵɵdisableBindings': r3.ɵɵdisableBindings,\n  'ɵɵelementStart': r3.ɵɵelementStart,\n  'ɵɵelementEnd': r3.ɵɵelementEnd,\n  'ɵɵelement': r3.ɵɵelement,\n  'ɵɵelementContainerStart': r3.ɵɵelementContainerStart,\n  'ɵɵelementContainerEnd': r3.ɵɵelementContainerEnd,\n  'ɵɵelementContainer': r3.ɵɵelementContainer,\n  'ɵɵpureFunction0': r3.ɵɵpureFunction0,\n  'ɵɵpureFunction1': r3.ɵɵpureFunction1,\n  'ɵɵpureFunction2': r3.ɵɵpureFunction2,\n  'ɵɵpureFunction3': r3.ɵɵpureFunction3,\n  'ɵɵpureFunction4': r3.ɵɵpureFunction4,\n  'ɵɵpureFunction5': r3.ɵɵpureFunction5,\n  'ɵɵpureFunction6': r3.ɵɵpureFunction6,\n  'ɵɵpureFunction7': r3.ɵɵpureFunction7,\n  'ɵɵpureFunction8': r3.ɵɵpureFunction8,\n  'ɵɵpureFunctionV': r3.ɵɵpureFunctionV,\n  'ɵɵgetCurrentView': r3.ɵɵgetCurrentView,\n  'ɵɵrestoreView': r3.ɵɵrestoreView,\n  'ɵɵlistener': r3.ɵɵlistener,\n  'ɵɵprojection': r3.ɵɵprojection,\n  'ɵɵsyntheticHostProperty': r3.ɵɵsyntheticHostProperty,\n  'ɵɵsyntheticHostListener': r3.ɵɵsyntheticHostListener,\n  'ɵɵpipeBind1': r3.ɵɵpipeBind1,\n  'ɵɵpipeBind2': r3.ɵɵpipeBind2,\n  'ɵɵpipeBind3': r3.ɵɵpipeBind3,\n  'ɵɵpipeBind4': r3.ɵɵpipeBind4,\n  'ɵɵpipeBindV': r3.ɵɵpipeBindV,\n  'ɵɵprojectionDef': r3.ɵɵprojectionDef,\n  'ɵɵhostProperty': r3.ɵɵhostProperty,\n  'ɵɵproperty': r3.ɵɵproperty,\n  'ɵɵpropertyInterpolate': r3.ɵɵpropertyInterpolate,\n  'ɵɵpropertyInterpolate1': r3.ɵɵpropertyInterpolate1,\n  'ɵɵpropertyInterpolate2': r3.ɵɵpropertyInterpolate2,\n  'ɵɵpropertyInterpolate3': r3.ɵɵpropertyInterpolate3,\n  'ɵɵpropertyInterpolate4': r3.ɵɵpropertyInterpolate4,\n  'ɵɵpropertyInterpolate5': r3.ɵɵpropertyInterpolate5,\n  'ɵɵpropertyInterpolate6': r3.ɵɵpropertyInterpolate6,\n  'ɵɵpropertyInterpolate7': r3.ɵɵpropertyInterpolate7,\n  'ɵɵpropertyInterpolate8': r3.ɵɵpropertyInterpolate8,\n  'ɵɵpropertyInterpolateV': r3.ɵɵpropertyInterpolateV,\n  'ɵɵpipe': r3.ɵɵpipe,\n  'ɵɵqueryRefresh': r3.ɵɵqueryRefresh,\n  'ɵɵqueryAdvance': r3.ɵɵqueryAdvance,\n  'ɵɵviewQuery': r3.ɵɵviewQuery,\n  'ɵɵviewQuerySignal': r3.ɵɵviewQuerySignal,\n  'ɵɵloadQuery': r3.ɵɵloadQuery,\n  'ɵɵcontentQuery': r3.ɵɵcontentQuery,\n  'ɵɵcontentQuerySignal': r3.ɵɵcontentQuerySignal,\n  'ɵɵreference': r3.ɵɵreference,\n  'ɵɵclassMap': r3.ɵɵclassMap,\n  'ɵɵclassMapInterpolate1': r3.ɵɵclassMapInterpolate1,\n  'ɵɵclassMapInterpolate2': r3.ɵɵclassMapInterpolate2,\n  'ɵɵclassMapInterpolate3': r3.ɵɵclassMapInterpolate3,\n  'ɵɵclassMapInterpolate4': r3.ɵɵclassMapInterpolate4,\n  'ɵɵclassMapInterpolate5': r3.ɵɵclassMapInterpolate5,\n  'ɵɵclassMapInterpolate6': r3.ɵɵclassMapInterpolate6,\n  'ɵɵclassMapInterpolate7': r3.ɵɵclassMapInterpolate7,\n  'ɵɵclassMapInterpolate8': r3.ɵɵclassMapInterpolate8,\n  'ɵɵclassMapInterpolateV': r3.ɵɵclassMapInterpolateV,\n  'ɵɵstyleMap': r3.ɵɵstyleMap,\n  'ɵɵstyleMapInterpolate1': r3.ɵɵstyleMapInterpolate1,\n  'ɵɵstyleMapInterpolate2': r3.ɵɵstyleMapInterpolate2,\n  'ɵɵstyleMapInterpolate3': r3.ɵɵstyleMapInterpolate3,\n  'ɵɵstyleMapInterpolate4': r3.ɵɵstyleMapInterpolate4,\n  'ɵɵstyleMapInterpolate5': r3.ɵɵstyleMapInterpolate5,\n  'ɵɵstyleMapInterpolate6': r3.ɵɵstyleMapInterpolate6,\n  'ɵɵstyleMapInterpolate7': r3.ɵɵstyleMapInterpolate7,\n  'ɵɵstyleMapInterpolate8': r3.ɵɵstyleMapInterpolate8,\n  'ɵɵstyleMapInterpolateV': r3.ɵɵstyleMapInterpolateV,\n  'ɵɵstyleProp': r3.ɵɵstyleProp,\n  'ɵɵstylePropInterpolate1': r3.ɵɵstylePropInterpolate1,\n  'ɵɵstylePropInterpolate2': r3.ɵɵstylePropInterpolate2,\n  'ɵɵstylePropInterpolate3': r3.ɵɵstylePropInterpolate3,\n  'ɵɵstylePropInterpolate4': r3.ɵɵstylePropInterpolate4,\n  'ɵɵstylePropInterpolate5': r3.ɵɵstylePropInterpolate5,\n  'ɵɵstylePropInterpolate6': r3.ɵɵstylePropInterpolate6,\n  'ɵɵstylePropInterpolate7': r3.ɵɵstylePropInterpolate7,\n  'ɵɵstylePropInterpolate8': r3.ɵɵstylePropInterpolate8,\n  'ɵɵstylePropInterpolateV': r3.ɵɵstylePropInterpolateV,\n  'ɵɵclassProp': r3.ɵɵclassProp,\n  'ɵɵadvance': r3.ɵɵadvance,\n  'ɵɵtemplate': r3.ɵɵtemplate,\n  'ɵɵconditional': r3.ɵɵconditional,\n  'ɵɵdefer': r3.ɵɵdefer,\n  'ɵɵdeferWhen': r3.ɵɵdeferWhen,\n  'ɵɵdeferOnIdle': r3.ɵɵdeferOnIdle,\n  'ɵɵdeferOnImmediate': r3.ɵɵdeferOnImmediate,\n  'ɵɵdeferOnTimer': r3.ɵɵdeferOnTimer,\n  'ɵɵdeferOnHover': r3.ɵɵdeferOnHover,\n  'ɵɵdeferOnInteraction': r3.ɵɵdeferOnInteraction,\n  'ɵɵdeferOnViewport': r3.ɵɵdeferOnViewport,\n  'ɵɵdeferPrefetchWhen': r3.ɵɵdeferPrefetchWhen,\n  'ɵɵdeferPrefetchOnIdle': r3.ɵɵdeferPrefetchOnIdle,\n  'ɵɵdeferPrefetchOnImmediate': r3.ɵɵdeferPrefetchOnImmediate,\n  'ɵɵdeferPrefetchOnTimer': r3.ɵɵdeferPrefetchOnTimer,\n  'ɵɵdeferPrefetchOnHover': r3.ɵɵdeferPrefetchOnHover,\n  'ɵɵdeferPrefetchOnInteraction': r3.ɵɵdeferPrefetchOnInteraction,\n  'ɵɵdeferPrefetchOnViewport': r3.ɵɵdeferPrefetchOnViewport,\n  'ɵɵdeferHydrateWhen': r3.ɵɵdeferHydrateWhen,\n  'ɵɵdeferHydrateNever': r3.ɵɵdeferHydrateNever,\n  'ɵɵdeferHydrateOnIdle': r3.ɵɵdeferHydrateOnIdle,\n  'ɵɵdeferHydrateOnImmediate': r3.ɵɵdeferHydrateOnImmediate,\n  'ɵɵdeferHydrateOnTimer': r3.ɵɵdeferHydrateOnTimer,\n  'ɵɵdeferHydrateOnHover': r3.ɵɵdeferHydrateOnHover,\n  'ɵɵdeferHydrateOnInteraction': r3.ɵɵdeferHydrateOnInteraction,\n  'ɵɵdeferHydrateOnViewport': r3.ɵɵdeferHydrateOnViewport,\n  'ɵɵdeferEnableTimerScheduling': r3.ɵɵdeferEnableTimerScheduling,\n  'ɵɵrepeater': r3.ɵɵrepeater,\n  'ɵɵrepeaterCreate': r3.ɵɵrepeaterCreate,\n  'ɵɵrepeaterTrackByIndex': r3.ɵɵrepeaterTrackByIndex,\n  'ɵɵrepeaterTrackByIdentity': r3.ɵɵrepeaterTrackByIdentity,\n  'ɵɵcomponentInstance': r3.ɵɵcomponentInstance,\n  'ɵɵtext': r3.ɵɵtext,\n  'ɵɵtextInterpolate': r3.ɵɵtextInterpolate,\n  'ɵɵtextInterpolate1': r3.ɵɵtextInterpolate1,\n  'ɵɵtextInterpolate2': r3.ɵɵtextInterpolate2,\n  'ɵɵtextInterpolate3': r3.ɵɵtextInterpolate3,\n  'ɵɵtextInterpolate4': r3.ɵɵtextInterpolate4,\n  'ɵɵtextInterpolate5': r3.ɵɵtextInterpolate5,\n  'ɵɵtextInterpolate6': r3.ɵɵtextInterpolate6,\n  'ɵɵtextInterpolate7': r3.ɵɵtextInterpolate7,\n  'ɵɵtextInterpolate8': r3.ɵɵtextInterpolate8,\n  'ɵɵtextInterpolateV': r3.ɵɵtextInterpolateV,\n  'ɵɵi18n': r3.ɵɵi18n,\n  'ɵɵi18nAttributes': r3.ɵɵi18nAttributes,\n  'ɵɵi18nExp': r3.ɵɵi18nExp,\n  'ɵɵi18nStart': r3.ɵɵi18nStart,\n  'ɵɵi18nEnd': r3.ɵɵi18nEnd,\n  'ɵɵi18nApply': r3.ɵɵi18nApply,\n  'ɵɵi18nPostprocess': r3.ɵɵi18nPostprocess,\n  'ɵɵresolveWindow': r3.ɵɵresolveWindow,\n  'ɵɵresolveDocument': r3.ɵɵresolveDocument,\n  'ɵɵresolveBody': r3.ɵɵresolveBody,\n  'ɵɵsetComponentScope': r3.ɵɵsetComponentScope,\n  'ɵɵsetNgModuleScope': r3.ɵɵsetNgModuleScope,\n  'ɵɵregisterNgModuleType': registerNgModuleType,\n  'ɵɵgetComponentDepsFactory': r3.ɵɵgetComponentDepsFactory,\n  'ɵsetClassDebugInfo': r3.ɵsetClassDebugInfo,\n  'ɵɵdeclareLet': r3.ɵɵdeclareLet,\n  'ɵɵstoreLet': r3.ɵɵstoreLet,\n  'ɵɵreadContextLet': r3.ɵɵreadContextLet,\n  'ɵɵattachSourceLocations': r3.ɵɵattachSourceLocations,\n\n  'ɵɵsanitizeHtml': sanitization.ɵɵsanitizeHtml,\n  'ɵɵsanitizeStyle': sanitization.ɵɵsanitizeStyle,\n  'ɵɵsanitizeResourceUrl': sanitization.ɵɵsanitizeResourceUrl,\n  'ɵɵsanitizeScript': sanitization.ɵɵsanitizeScript,\n  'ɵɵsanitizeUrl': sanitization.ɵɵsanitizeUrl,\n  'ɵɵsanitizeUrlOrResourceUrl': sanitization.ɵɵsanitizeUrlOrResourceUrl,\n  'ɵɵtrustConstantHtml': sanitization.ɵɵtrustConstantHtml,\n  'ɵɵtrustConstantResourceUrl': sanitization.ɵɵtrustConstantResourceUrl,\n  'ɵɵvalidateIframeAttribute': iframe_attrs_validation.ɵɵvalidateIframeAttribute,\n\n  'forwardRef': forwardRef,\n  'resolveForwardRef': resolveForwardRef,\n\n  'ɵɵtwoWayProperty': r3.ɵɵtwoWayProperty,\n  'ɵɵtwoWayBindingSet': r3.ɵɵtwoWayBindingSet,\n  'ɵɵtwoWayListener': r3.ɵɵtwoWayListener,\n\n  'ɵɵreplaceMetadata': r3.ɵɵreplaceMetadata,\n  'ɵɵgetReplaceMetadataURL': r3.ɵɵgetReplaceMetadataURL,\n}))();\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {ViewEncapsulation} from '../../metadata/view';\n\nexport interface JitCompilerOptions {\n  defaultEncapsulation?: ViewEncapsulation;\n  preserveWhitespaces?: boolean;\n}\n\nlet jitOptions: JitCompilerOptions | null = null;\n\nexport function setJitOptions(options: JitCompilerOptions): void {\n  if (jitOptions !== null) {\n    if (options.defaultEncapsulation !== jitOptions.defaultEncapsulation) {\n      ngDevMode &&\n        console.error(\n          'Provided value for `defaultEncapsulation` can not be changed once it has been set.',\n        );\n      return;\n    }\n    if (options.preserveWhitespaces !== jitOptions.preserveWhitespaces) {\n      ngDevMode &&\n        console.error(\n          'Provided value for `preserveWhitespaces` can not be changed once it has been set.',\n        );\n      return;\n    }\n  }\n  jitOptions = options;\n}\n\nexport function getJitOptions(): JitCompilerOptions | null {\n  return jitOptions;\n}\n\nexport function resetJitOptions(): void {\n  jitOptions = null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  getCompilerFacade,\n  JitCompilerUsage,\n  R3InjectorMetadataFacade,\n} from '../../compiler/compiler_facade';\nimport {resolveForwardRef} from '../../di/forward_ref';\nimport {NG_INJ_DEF} from '../../di/interface/defs';\nimport type {ModuleWithProviders} from '../../di/interface/provider';\nimport {reflectDependencies} from '../../di/jit/util';\nimport {Type} from '../../interface/type';\nimport {registerNgModuleType} from '../../linker/ng_module_registration';\nimport type {NgModule} from '../../metadata/ng_module';\nimport type {\n  NgModuleDef,\n  NgModuleTransitiveScopes,\n  NgModuleType,\n} from '../../metadata/ng_module_def';\nimport {deepForEach, flatten} from '../../util/array_utils';\nimport {assertDefined} from '../../util/assert';\nimport {EMPTY_ARRAY} from '../../util/empty';\nimport {GENERATED_COMP_IDS} from '../definition';\nimport {\n  getComponentDef,\n  getDirectiveDef,\n  getNgModuleDef,\n  getPipeDef,\n  isStandalone,\n} from '../def_getters';\nimport {depsTracker, USE_RUNTIME_DEPS_TRACKER_FOR_JIT} from '../deps_tracker/deps_tracker';\nimport {NG_COMP_DEF, NG_DIR_DEF, NG_FACTORY_DEF, NG_MOD_DEF, NG_PIPE_DEF} from '../fields';\nimport type {ComponentDef} from '../interfaces/definition';\nimport {maybeUnwrapFn} from '../util/misc_utils';\nimport {stringifyForError} from '../util/stringify_utils';\n\nimport {angularCoreEnv} from './environment';\nimport {patchModuleCompilation} from './module_patch';\nimport {isModuleWithProviders, isNgModule} from './util';\n\ninterface ModuleQueueItem {\n  moduleType: Type<any>;\n  ngModule: NgModule;\n}\n\nconst moduleQueue: ModuleQueueItem[] = [];\n\n/**\n * Enqueues moduleDef to be checked later to see if scope can be set on its\n * component declarations.\n */\nfunction enqueueModuleForDelayedScoping(moduleType: Type<any>, ngModule: NgModule) {\n  moduleQueue.push({moduleType, ngModule});\n}\n\nlet flushingModuleQueue = false;\n/**\n * Loops over queued module definitions, if a given module definition has all of its\n * declarations resolved, it dequeues that module definition and sets the scope on\n * its declarations.\n */\nexport function flushModuleScopingQueueAsMuchAsPossible() {\n  if (!flushingModuleQueue) {\n    flushingModuleQueue = true;\n    try {\n      for (let i = moduleQueue.length - 1; i >= 0; i--) {\n        const {moduleType, ngModule} = moduleQueue[i];\n\n        if (ngModule.declarations && ngModule.declarations.every(isResolvedDeclaration)) {\n          // dequeue\n          moduleQueue.splice(i, 1);\n          setScopeOnDeclaredComponents(moduleType, ngModule);\n        }\n      }\n    } finally {\n      flushingModuleQueue = false;\n    }\n  }\n}\n\n/**\n * Returns truthy if a declaration has resolved. If the declaration happens to be\n * an array of declarations, it will recurse to check each declaration in that array\n * (which may also be arrays).\n */\nfunction isResolvedDeclaration(declaration: any[] | Type<any>): boolean {\n  if (Array.isArray(declaration)) {\n    return declaration.every(isResolvedDeclaration);\n  }\n  return !!resolveForwardRef(declaration);\n}\n\n/**\n * Compiles a module in JIT mode.\n *\n * This function automatically gets called when a class has a `@NgModule` decorator.\n */\nexport function compileNgModule(moduleType: Type<any>, ngModule: NgModule = {}): void {\n  patchModuleCompilation();\n  compileNgModuleDefs(moduleType as NgModuleType, ngModule);\n  if (ngModule.id !== undefined) {\n    registerNgModuleType(moduleType as NgModuleType, ngModule.id);\n  }\n\n  // Because we don't know if all declarations have resolved yet at the moment the\n  // NgModule decorator is executing, we're enqueueing the setting of module scope\n  // on its declarations to be run at a later time when all declarations for the module,\n  // including forward refs, have resolved.\n  enqueueModuleForDelayedScoping(moduleType, ngModule);\n}\n\n/**\n * Compiles and adds the `ɵmod`, `ɵfac` and `ɵinj` properties to the module class.\n *\n * It's possible to compile a module via this API which will allow duplicate declarations in its\n * root.\n */\nexport function compileNgModuleDefs(\n  moduleType: NgModuleType,\n  ngModule: NgModule,\n  allowDuplicateDeclarationsInRoot: boolean = false,\n): void {\n  ngDevMode && assertDefined(moduleType, 'Required value moduleType');\n  ngDevMode && assertDefined(ngModule, 'Required value ngModule');\n  const declarations: Type<any>[] = flatten(ngModule.declarations || EMPTY_ARRAY);\n  let ngModuleDef: any = null;\n  Object.defineProperty(moduleType, NG_MOD_DEF, {\n    configurable: true,\n    get: () => {\n      if (ngModuleDef === null) {\n        if (ngDevMode && ngModule.imports && ngModule.imports.indexOf(moduleType) > -1) {\n          // We need to assert this immediately, because allowing it to continue will cause it to\n          // go into an infinite loop before we've reached the point where we throw all the errors.\n          throw new Error(`'${stringifyForError(moduleType)}' module can't import itself`);\n        }\n        const compiler = getCompilerFacade({\n          usage: JitCompilerUsage.Decorator,\n          kind: 'NgModule',\n          type: moduleType,\n        });\n        ngModuleDef = compiler.compileNgModule(angularCoreEnv, `ng:///${moduleType.name}/ɵmod.js`, {\n          type: moduleType,\n          bootstrap: flatten(ngModule.bootstrap || EMPTY_ARRAY).map(resolveForwardRef),\n          declarations: declarations.map(resolveForwardRef),\n          imports: flatten(ngModule.imports || EMPTY_ARRAY)\n            .map(resolveForwardRef)\n            .map(expandModuleWithProviders),\n          exports: flatten(ngModule.exports || EMPTY_ARRAY)\n            .map(resolveForwardRef)\n            .map(expandModuleWithProviders),\n          schemas: ngModule.schemas ? flatten(ngModule.schemas) : null,\n          id: ngModule.id || null,\n        });\n        // Set `schemas` on ngModuleDef to an empty array in JIT mode to indicate that runtime\n        // should verify that there are no unknown elements in a template. In AOT mode, that check\n        // happens at compile time and `schemas` information is not present on Component and Module\n        // defs after compilation (so the check doesn't happen the second time at runtime).\n        if (!ngModuleDef.schemas) {\n          ngModuleDef.schemas = [];\n        }\n      }\n      return ngModuleDef;\n    },\n  });\n\n  let ngFactoryDef: any = null;\n  Object.defineProperty(moduleType, NG_FACTORY_DEF, {\n    get: () => {\n      if (ngFactoryDef === null) {\n        const compiler = getCompilerFacade({\n          usage: JitCompilerUsage.Decorator,\n          kind: 'NgModule',\n          type: moduleType,\n        });\n        ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${moduleType.name}/ɵfac.js`, {\n          name: moduleType.name,\n          type: moduleType,\n          deps: reflectDependencies(moduleType),\n          target: compiler.FactoryTarget.NgModule,\n          typeArgumentCount: 0,\n        });\n      }\n      return ngFactoryDef;\n    },\n    // Make the property configurable in dev mode to allow overriding in tests\n    configurable: !!ngDevMode,\n  });\n\n  let ngInjectorDef: any = null;\n  Object.defineProperty(moduleType, NG_INJ_DEF, {\n    get: () => {\n      if (ngInjectorDef === null) {\n        ngDevMode && verifySemanticsOfNgModuleDef(moduleType, allowDuplicateDeclarationsInRoot);\n        const meta: R3InjectorMetadataFacade = {\n          name: moduleType.name,\n          type: moduleType,\n          providers: ngModule.providers || EMPTY_ARRAY,\n          imports: [\n            (ngModule.imports || EMPTY_ARRAY).map(resolveForwardRef),\n            (ngModule.exports || EMPTY_ARRAY).map(resolveForwardRef),\n          ],\n        };\n        const compiler = getCompilerFacade({\n          usage: JitCompilerUsage.Decorator,\n          kind: 'NgModule',\n          type: moduleType,\n        });\n        ngInjectorDef = compiler.compileInjector(\n          angularCoreEnv,\n          `ng:///${moduleType.name}/ɵinj.js`,\n          meta,\n        );\n      }\n      return ngInjectorDef;\n    },\n    // Make the property configurable in dev mode to allow overriding in tests\n    configurable: !!ngDevMode,\n  });\n}\n\nexport function generateStandaloneInDeclarationsError(type: Type<any>, location: string) {\n  const prefix = `Unexpected \"${stringifyForError(type)}\" found in the \"declarations\" array of the`;\n  const suffix =\n    `\"${stringifyForError(type)}\" is marked as standalone and can't be declared ` +\n    'in any NgModule - did you intend to import it instead (by adding it to the \"imports\" array)?';\n  return `${prefix} ${location}, ${suffix}`;\n}\n\nfunction verifySemanticsOfNgModuleDef(\n  moduleType: NgModuleType,\n  allowDuplicateDeclarationsInRoot: boolean,\n  importingModule?: NgModuleType,\n): void {\n  if (verifiedNgModule.get(moduleType)) return;\n\n  // skip verifications of standalone components, directives, and pipes\n  if (isStandalone(moduleType)) return;\n\n  verifiedNgModule.set(moduleType, true);\n  moduleType = resolveForwardRef(moduleType);\n  let ngModuleDef: NgModuleDef<any>;\n  if (importingModule) {\n    ngModuleDef = getNgModuleDef(moduleType)!;\n    if (!ngModuleDef) {\n      throw new Error(\n        `Unexpected value '${moduleType.name}' imported by the module '${importingModule.name}'. Please add an @NgModule annotation.`,\n      );\n    }\n  } else {\n    ngModuleDef = getNgModuleDef(moduleType, true);\n  }\n  const errors: string[] = [];\n  const declarations = maybeUnwrapFn(ngModuleDef.declarations);\n  const imports = maybeUnwrapFn(ngModuleDef.imports);\n  flatten(imports)\n    .map(unwrapModuleWithProvidersImports)\n    .forEach((modOrStandaloneCmpt) => {\n      verifySemanticsOfNgModuleImport(modOrStandaloneCmpt, moduleType);\n      verifySemanticsOfNgModuleDef(modOrStandaloneCmpt, false, moduleType);\n    });\n  const exports = maybeUnwrapFn(ngModuleDef.exports);\n  declarations.forEach(verifyDeclarationsHaveDefinitions);\n  declarations.forEach(verifyDirectivesHaveSelector);\n  declarations.forEach((declarationType) => verifyNotStandalone(declarationType, moduleType));\n  const combinedDeclarations: Type<any>[] = [\n    ...declarations.map(resolveForwardRef),\n    ...flatten(imports.map(computeCombinedExports)).map(resolveForwardRef),\n  ];\n  exports.forEach(verifyExportsAreDeclaredOrReExported);\n  declarations.forEach((decl) => verifyDeclarationIsUnique(decl, allowDuplicateDeclarationsInRoot));\n\n  const ngModule = getAnnotation<NgModule>(moduleType, 'NgModule');\n  if (ngModule) {\n    ngModule.imports &&\n      flatten(ngModule.imports)\n        .map(unwrapModuleWithProvidersImports)\n        .forEach((mod) => {\n          verifySemanticsOfNgModuleImport(mod, moduleType);\n          verifySemanticsOfNgModuleDef(mod, false, moduleType);\n        });\n    ngModule.bootstrap && deepForEach(ngModule.bootstrap, verifyCorrectBootstrapType);\n    ngModule.bootstrap && deepForEach(ngModule.bootstrap, verifyComponentIsPartOfNgModule);\n  }\n\n  // Throw Error if any errors were detected.\n  if (errors.length) {\n    throw new Error(errors.join('\\n'));\n  }\n  ////////////////////////////////////////////////////////////////////////////////////////////////\n  function verifyDeclarationsHaveDefinitions(type: Type<any>): void {\n    type = resolveForwardRef(type);\n    const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef(type);\n    if (!def) {\n      errors.push(\n        `Unexpected value '${stringifyForError(type)}' declared by the module '${stringifyForError(\n          moduleType,\n        )}'. Please add a @Pipe/@Directive/@Component annotation.`,\n      );\n    }\n  }\n\n  function verifyDirectivesHaveSelector(type: Type<any>): void {\n    type = resolveForwardRef(type);\n    const def = getDirectiveDef(type);\n    if (!getComponentDef(type) && def && def.selectors.length == 0) {\n      errors.push(`Directive ${stringifyForError(type)} has no selector, please add it!`);\n    }\n  }\n\n  function verifyNotStandalone(type: Type<any>, moduleType: NgModuleType): void {\n    type = resolveForwardRef(type);\n    const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef(type);\n    if (def?.standalone) {\n      const location = `\"${stringifyForError(moduleType)}\" NgModule`;\n      errors.push(generateStandaloneInDeclarationsError(type, location));\n    }\n  }\n\n  function verifyExportsAreDeclaredOrReExported(type: Type<any>) {\n    type = resolveForwardRef(type);\n    const kind =\n      (getComponentDef(type) && 'component') ||\n      (getDirectiveDef(type) && 'directive') ||\n      (getPipeDef(type) && 'pipe');\n    if (kind) {\n      // only checked if we are declared as Component, Directive, or Pipe\n      // Modules don't need to be declared or imported.\n      if (combinedDeclarations.lastIndexOf(type) === -1) {\n        // We are exporting something which we don't explicitly declare or import.\n        errors.push(\n          `Can't export ${kind} ${stringifyForError(type)} from ${stringifyForError(\n            moduleType,\n          )} as it was neither declared nor imported!`,\n        );\n      }\n    }\n  }\n\n  function verifyDeclarationIsUnique(type: Type<any>, suppressErrors: boolean) {\n    type = resolveForwardRef(type);\n    const existingModule = ownerNgModule.get(type);\n    if (existingModule && existingModule !== moduleType) {\n      if (!suppressErrors) {\n        const modules = [existingModule, moduleType].map(stringifyForError).sort();\n        errors.push(\n          `Type ${stringifyForError(type)} is part of the declarations of 2 modules: ${\n            modules[0]\n          } and ${modules[1]}! ` +\n            `Please consider moving ${stringifyForError(type)} to a higher module that imports ${\n              modules[0]\n            } and ${modules[1]}. ` +\n            `You can also create a new NgModule that exports and includes ${stringifyForError(\n              type,\n            )} then import that NgModule in ${modules[0]} and ${modules[1]}.`,\n        );\n      }\n    } else {\n      // Mark type as having owner.\n      ownerNgModule.set(type, moduleType);\n    }\n  }\n\n  function verifyComponentIsPartOfNgModule(type: Type<any>) {\n    type = resolveForwardRef(type);\n    const existingModule = ownerNgModule.get(type);\n    if (!existingModule && !isStandalone(type)) {\n      errors.push(\n        `Component ${stringifyForError(\n          type,\n        )} is not part of any NgModule or the module has not been imported into your module.`,\n      );\n    }\n  }\n\n  function verifyCorrectBootstrapType(type: Type<any>) {\n    type = resolveForwardRef(type);\n    if (!getComponentDef(type)) {\n      errors.push(`${stringifyForError(type)} cannot be used as an entry component.`);\n    }\n    if (isStandalone(type)) {\n      // Note: this error should be the same as the\n      // `NGMODULE_BOOTSTRAP_IS_STANDALONE` one in AOT compiler.\n      errors.push(\n        `The \\`${stringifyForError(type)}\\` class is a standalone component, which can ` +\n          `not be used in the \\`@NgModule.bootstrap\\` array. Use the \\`bootstrapApplication\\` ` +\n          `function for bootstrap instead.`,\n      );\n    }\n  }\n\n  function verifySemanticsOfNgModuleImport(type: Type<any>, importingModule: Type<any>) {\n    type = resolveForwardRef(type);\n\n    const directiveDef = getComponentDef(type) || getDirectiveDef(type);\n    if (directiveDef !== null && !directiveDef.standalone) {\n      throw new Error(\n        `Unexpected directive '${type.name}' imported by the module '${importingModule.name}'. Please add an @NgModule annotation.`,\n      );\n    }\n\n    const pipeDef = getPipeDef(type);\n    if (pipeDef !== null && !pipeDef.standalone) {\n      throw new Error(\n        `Unexpected pipe '${type.name}' imported by the module '${importingModule.name}'. Please add an @NgModule annotation.`,\n      );\n    }\n  }\n}\n\nfunction unwrapModuleWithProvidersImports(\n  typeOrWithProviders: NgModuleType<any> | {ngModule: NgModuleType<any>},\n): NgModuleType<any> {\n  typeOrWithProviders = resolveForwardRef(typeOrWithProviders);\n  return (typeOrWithProviders as any).ngModule || typeOrWithProviders;\n}\n\nfunction getAnnotation<T>(type: any, name: string): T | null {\n  let annotation: T | null = null;\n  collect(type.__annotations__);\n  collect(type.decorators);\n  return annotation;\n\n  function collect(annotations: any[] | null) {\n    if (annotations) {\n      annotations.forEach(readAnnotation);\n    }\n  }\n\n  function readAnnotation(decorator: {\n    type: {prototype: {ngMetadataName: string}; args: any[]};\n    args: any;\n  }): void {\n    if (!annotation) {\n      const proto = Object.getPrototypeOf(decorator);\n      if (proto.ngMetadataName == name) {\n        annotation = decorator as any;\n      } else if (decorator.type) {\n        const proto = Object.getPrototypeOf(decorator.type);\n        if (proto.ngMetadataName == name) {\n          annotation = decorator.args[0];\n        }\n      }\n    }\n  }\n}\n\n/**\n * Keep track of compiled components. This is needed because in tests we often want to compile the\n * same component with more than one NgModule. This would cause an error unless we reset which\n * NgModule the component belongs to. We keep the list of compiled components here so that the\n * TestBed can reset it later.\n */\nlet ownerNgModule = new WeakMap<Type<any>, NgModuleType<any>>();\nlet verifiedNgModule = new WeakMap<NgModuleType<any>, boolean>();\n\nexport function resetCompiledComponents(): void {\n  ownerNgModule = new WeakMap<Type<any>, NgModuleType<any>>();\n  verifiedNgModule = new WeakMap<NgModuleType<any>, boolean>();\n  moduleQueue.length = 0;\n  GENERATED_COMP_IDS.clear();\n}\n\n/**\n * Computes the combined declarations of explicit declarations, as well as declarations inherited by\n * traversing the exports of imported modules.\n * @param type\n */\nfunction computeCombinedExports(type: Type<any>): Type<any>[] {\n  type = resolveForwardRef(type);\n  const ngModuleDef = getNgModuleDef(type);\n\n  // a standalone component, directive or pipe\n  if (ngModuleDef === null) {\n    return [type];\n  }\n\n  return flatten(\n    maybeUnwrapFn(ngModuleDef.exports).map((type) => {\n      const ngModuleDef = getNgModuleDef(type);\n      if (ngModuleDef) {\n        verifySemanticsOfNgModuleDef(type as any as NgModuleType, false);\n        return computeCombinedExports(type);\n      } else {\n        return type;\n      }\n    }),\n  );\n}\n\n/**\n * Some declared components may be compiled asynchronously, and thus may not have their\n * ɵcmp set yet. If this is the case, then a reference to the module is written into\n * the `ngSelectorScope` property of the declared type.\n */\nfunction setScopeOnDeclaredComponents(moduleType: Type<any>, ngModule: NgModule) {\n  const declarations: Type<any>[] = flatten(ngModule.declarations || EMPTY_ARRAY);\n\n  const transitiveScopes = transitiveScopesFor(moduleType);\n\n  declarations.forEach((declaration) => {\n    declaration = resolveForwardRef(declaration);\n    if (declaration.hasOwnProperty(NG_COMP_DEF)) {\n      // A `ɵcmp` field exists - go ahead and patch the component directly.\n      const component = declaration as Type<any> & {ɵcmp: ComponentDef<any>};\n      const componentDef = getComponentDef(component)!;\n      patchComponentDefWithScope(componentDef, t   ransitiveScopes);\n    } else if (\n      !declaration.hasOwnProperty(NG_DIR_DEF) &&\n      !declaration.hasOwnProperty(NG_PIPE_DEF)\n    ) {\n      // Set `ngSelectorScope` for future reference when the component compilation finishes.\n      (declaration as Type<any> & {ngSelectorScope?: any}).ngSelectorScope = moduleType;\n    }\n  });\n}\n\n/**\n * Patch the definition of a component with directives and pipes from the compilation scope of\n * a given module.\n */\nexport function patchComponentDefWithScope<C>(\n  componentDef: ComponentDef<C>,\n  transitiveScopes: NgModuleTransitiveScopes,\n) {\n  componentDef.directiveDefs = () =>\n    Array.from(transitiveScopes.compilation.directives)\n      .map((dir) =>\n        dir.hasOwnProperty(NG_COMP_DEF) ? getComponentDef(dir)! : getDirectiveDef(dir)!,\n      )\n      .filter((def) => !!def);\n  componentDef.pipeDefs = () =>\n    Array.from(transitiveScopes.compilation.pipes).map((pipe) => getPipeDef(pipe)!);\n  componentDef.schemas = transitiveScopes.schemas;\n\n  // Since we avoid Components/Directives/Pipes recompiling in case there are no overrides, we\n  // may face a problem where previously compiled defs available to a given Component/Directive\n  // are cached in TView and may become stale (in case any of these defs gets recompiled). In\n  // order to avoid this problem, we force fresh TView to be created.\n  componentDef.tView = null;\n}\n\n/**\n * Compute the pair of transitive scopes (compilation scope and exported scope) for a given type\n * (either a NgModule or a standalone component / directive / pipe).\n */\nexport function transitiveScopesFor<T>(type: Type<T>): NgModuleTransitiveScopes {\n  if (isNgModule(type)) {\n    if (USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {\n      const scope = depsTracker.getNgModuleScope(type);\n      const def = getNgModuleDef(type, true);\n      return {\n        schemas: def.schemas || null,\n        ...scope,\n      };\n    } else {\n      return transitiveScopesForNgModule(type);\n    }\n  } else if (isStandalone(type)) {\n    const directiveDef = getComponentDef(type) || getDirectiveDef(type);\n    if (directiveDef !== null) {\n      return {\n        schemas: null,\n        compilation: {\n          directives: new Set<any>(),\n          pipes: new Set<any>(),\n        },\n        exported: {\n          directives: new Set<any>([type]),\n          pipes: new Set<any>(),\n        },\n      };\n    }\n\n    const pipeDef = getPipeDef(type);\n    if (pipeDef !== null) {\n      return {\n        schemas: null,\n        compilation: {\n          directives: new Set<any>(),\n          pipes: new Set<any>(),\n        },\n        exported: {\n          directives: new Set<any>(),\n          pipes: new Set<any>([type]),\n        },\n      };\n    }\n  }\n\n  // TODO: change the error message to be more user-facing and take standalone into account\n  throw new Error(`${type.name} does not have a module def (ɵmod property)`);\n}\n\n/**\n * Compute the pair of transitive scopes (compilation scope and exported scope) for a given module.\n *\n * This operation is memoized and the result is cached on the module's definition. This function can\n * be called on modules with components that have not fully compiled yet, but the result should not\n * be used until they have.\n *\n * @param moduleType module that transitive scope should be calculated for.\n */\nexport function transitiveScopesForNgModule<T>(moduleType: Type<T>): NgModuleTransitiveScopes {\n  const def = getNgModuleDef(moduleType, true);\n\n  if (def.transitiveCompileScopes !== null) {\n    return def.transitiveCompileScopes;\n  }\n\n  const scopes: NgModuleTransitiveScopes = {\n    schemas: def.schemas || null,\n    compilation: {\n      directives: new Set<any>(),\n      pipes: new Set<any>(),\n    },\n    exported: {\n      directives: new Set<any>(),\n      pipes: new Set<any>(),\n    },\n  };\n\n  maybeUnwrapFn(def.imports).forEach(<I>(imported: Type<I>) => {\n    // When this module imports another, the imported module's exported directives and pipes are\n    // added to the compilation scope of this module.\n    const importedScope = transitiveScopesFor(imported);\n    importedScope.exported.directives.forEach((entry) => scopes.compilation.directives.add(entry));\n    importedScope.exported.pipes.forEach((entry) => scopes.compilation.pipes.add(entry));\n  });\n\n  maybeUnwrapFn(def.declarations).forEach((declared) => {\n    const declaredWithDefs = declared as Type<any> & {\n      ɵpipe?: any;\n    };\n\n    if (getPipeDef(declaredWithDefs)) {\n      scopes.compilation.pipes.add(declared);\n    } else {\n      // Either declared has a ɵcmp or ɵdir, or it's a component which hasn't\n      // had its template compiled yet. In either case, it gets added to the compilation's\n      // directives.\n      scopes.compilation.directives.add(declared);\n    }\n  });\n\n  maybeUnwrapFn(def.exports).forEach(<E>(exported: Type<E>) => {\n    const exportedType = exported as Type<E> & {\n      // Components, Directives, NgModules, and Pipes can all be exported.\n      ɵcmp?: any;\n      ɵdir?: any;\n      ɵmod?: NgModuleDef<E>;\n      ɵpipe?: any;\n    };\n\n    // Either the type is a module, a pipe, or a component/directive (which may not have a\n    // ɵcmp as it might be compiled asynchronously).\n    if (isNgModule(exportedType)) {\n      // When this module exports another, the exported module's exported directives and pipes are\n      // added to both the compilation and exported scopes of this module.\n      const exportedScope = transitiveScopesFor(exportedType);\n      exportedScope.exported.directives.forEach((entry) => {\n        scopes.compilation.directives.add(entry);\n        scopes.exported.directives.add(entry);\n      });\n      exportedScope.exported.pipes.forEach((entry) => {\n        scopes.compilation.pipes.add(entry);\n        scopes.exported.pipes.add(entry);\n      });\n    } else if (getPipeDef(exportedType)) {\n      scopes.exported.pipes.add(exportedType);\n    } else {\n      scopes.exported.directives.add(exportedType);\n    }\n  });\n\n  def.transitiveCompileScopes = scopes;\n  return scopes;\n}\n\nfunction expandModuleWithProviders(value: Type<any> | ModuleWithProviders<{}>): Type<any> {\n  if (isModuleWithProviders(value)) {\n    return value.ngModule;\n  }\n  return value;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  getCompilerFacade,\n  JitCompilerUsage,\n  R3DirectiveMetadataFacade,\n} from '../../compiler/compiler_facade';\nimport {\n  R3ComponentMetadataFacade,\n  R3QueryMetadataFacade,\n} from '../../compiler/compiler_facade_interface';\nimport {resolveForwardRef} from '../../di/forward_ref';\nimport {getReflect, reflectDependencies} from '../../di/jit/util';\nimport {Type} from '../../interface/type';\nimport type {Query} from '../../metadata/di';\nimport type {Component, Directive, Input} from '../../metadata/directives';\nimport {\n  componentNeedsResolution,\n  maybeQueueResolutionOfComponentResources,\n} from '../../metadata/resource_loading';\nimport {ViewEncapsulation} from '../../metadata/view';\nimport {flatten} from '../../util/array_utils';\nimport {EMPTY_ARRAY, EMPTY_OBJ} from '../../util/empty';\nimport {initNgDevMode} from '../../util/ng_dev_mode';\nimport {getComponentDef, getDirectiveDef, getNgModuleDef, getPipeDef} from '../def_getters';\nimport {depsTracker, USE_RUNTIME_DEPS_TRACKER_FOR_JIT} from '../deps_tracker/deps_tracker';\nimport {NG_COMP_DEF, NG_DIR_DEF, NG_FACTORY_DEF} from '../fields';\nimport {ComponentDef, ComponentType, DirectiveDefList, PipeDefList} from '../interfaces/definition';\nimport {stringifyForError} from '../util/stringify_utils';\n\nimport {angularCoreEnv} from './environment';\nimport {getJitOptions} from './jit_options';\nimport {\n  flushModuleScopingQueueAsMuchAsPossible,\n  patchComponentDefWithScope,\n  transitiveScopesFor,\n} from './module';\nimport {isComponent, verifyStandaloneImport} from './util';\n\n/**\n * Keep track of the compilation depth to avoid reentrancy issues during JIT compilation. This\n * matters in the following scenario:\n *\n * Consider a component 'A' that extends component 'B', both declared in module 'M'. During\n * the compilation of 'A' the definition of 'B' is requested to capture the inheritance chain,\n * potentially triggering compilation of 'B'. If this nested compilation were to trigger\n * `flushModuleScopingQueueAsMuchAsPossible` it may happen that module 'M' is still pending in the\n * queue, resulting in 'A' and 'B' to be patched with the NgModule scope. As the compilation of\n * 'A' is still in progress, this would introduce a circular dependency on its compilation. To avoid\n * this issue, the module scope queue is only flushed for compilations at the depth 0, to ensure\n * all compilations have finished.\n */\nlet compilationDepth = 0;\n\n/**\n * Compile an Angular component according to its decorator metadata, and patch the resulting\n * component def (ɵcmp) onto the component type.\n *\n * Compilation may be asynchronous (due to the need to resolve URLs for the component template or\n * other resources, for example). In the event that compilation is not immediate, `compileComponent`\n * will enqueue resource resolution into a global queue and will fail to return the `ɵcmp`\n * until the global queue has been resolved with a call to `resolveComponentResources`.\n */\nexport function compileComponent(type: Type<any>, metadata: Component): void {\n  // Initialize ngDevMode. This must be the first statement in compileComponent.\n  // See the `initNgDevMode` docstring for more information.\n  (typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode();\n\n  let ngComponentDef: ComponentDef<unknown> | null = null;\n\n  // Metadata may have resources which need to be resolved.\n  maybeQueueResolutionOfComponentResources(type, metadata);\n\n  // Note that we're using the same function as `Directive`, because that's only subset of metadata\n  // that we need to create the ngFactoryDef. We're avoiding using the component metadata\n  // because we'd have to resolve the asynchronous templates.\n  addDirectiveFactoryDef(type, metadata);\n\n  Object.defineProperty(type, NG_COMP_DEF, {\n    get: () => {\n      if (ngComponentDef === null) {\n        const compiler = getCompilerFacade({\n          usage: JitCompilerUsage.Decorator,\n          kind: 'component',\n          type: type,\n        });\n\n        if (componentNeedsResolution(metadata)) {\n          const error = [`Component '${type.name}' is not resolved:`];\n          if (metadata.templateUrl) {\n            error.push(` - templateUrl: ${metadata.templateUrl}`);\n          }\n          if (metadata.styleUrls && metadata.styleUrls.length) {\n            error.push(` - styleUrls: ${JSON.stringify(metadata.styleUrls)}`);\n          }\n          if (metadata.styleUrl) {\n            error.push(` - styleUrl: ${metadata.styleUrl}`);\n          }\n          error.push(`Did you run and wait for 'resolveComponentResources()'?`);\n          throw new Error(error.join('\\n'));\n        }\n\n        // This const was called `jitOptions` previously but had to be renamed to `options` because\n        // of a bug with Terser that caused optimized JIT builds to throw a `ReferenceError`.\n        // This bug was investigated in https://github.com/angular/angular-cli/issues/17264.\n        // We should not rename it back until https://github.com/terser/terser/issues/615 is fixed.\n        const options = getJitOptions();\n        let preserveWhitespaces = metadata.preserveWhitespaces;\n        if (preserveWhitespaces === undefined) {\n          if (options !== null && options.preserveWhitespaces !== undefined) {\n            preserveWhitespaces = options.preserveWhitespaces;\n          } else {\n            preserveWhitespaces = false;\n          }\n        }\n        let encapsulation = metadata.encapsulation;\n        if (encapsulation === undefined) {\n          if (options !== null && options.defaultEncapsulation !== undefined) {\n            encapsulation = options.defaultEncapsulation;\n          } else {\n            encapsulation = ViewEncapsulation.Emulated;\n          }\n        }\n\n        const templateUrl = metadata.templateUrl || `ng:///${type.name}/template.html`;\n        const meta: R3ComponentMetadataFacade = {\n          ...directiveMetadata(type, metadata),\n          typeSourceSpan: compiler.createParseSourceSpan('Component', type.name, templateUrl),\n          template: metadata.template || '',\n          preserveWhitespaces,\n          styles:\n            typeof metadata.styles === 'string'\n              ? [metadata.styles]\n              : metadata.styles || EMPTY_ARRAY,\n          animations: metadata.animations,\n          // JIT components are always compiled against an empty set of `declarations`. Instead, the\n          // `directiveDefs` and `pipeDefs` are updated at a later point:\n          //  * for NgModule-based components, they're set when the NgModule which declares the\n          //    component resolves in the module scoping queue\n          //  * for standalone components, they're set just below, after `compileComponent`.\n          declarations: [],\n          changeDetection: metadata.changeDetection,\n          encapsulation,\n          interpolation: metadata.interpolation,\n          viewProviders: metadata.viewProviders || null,\n        };\n\n        compilationDepth++;\n        try {\n          if (meta.usesInheritance) {\n            addDirectiveDefToUndecoratedParents(type);\n          }\n          ngComponentDef = compiler.compileComponent(\n            angularCoreEnv,\n            templateUrl,\n            meta,\n          ) as ComponentDef<unknown>;\n\n          if (meta.isStandalone) {\n            // Patch the component definition for standalone components with `directiveDefs` and\n            // `pipeDefs` functions which lazily compute the directives/pipes available in the\n            // standalone component. Also set `dependencies` to the lazily resolved list of imports.\n            const imports: Type<any>[] = flatten(metadata.imports || EMPTY_ARRAY);\n            const {directiveDefs, pipeDefs} = getStandaloneDefFunctions(type, imports);\n            ngComponentDef.directiveDefs = directiveDefs;\n            ngComponentDef.pipeDefs = pipeDefs;\n            ngComponentDef.dependencies = () => imports.map(resolveForwardRef);\n          }\n        } finally {\n          // Ensure that the compilation depth is decremented even when the compilation failed.\n          compilationDepth--;\n        }\n\n        if (compilationDepth === 0) {\n          // When NgModule decorator executed, we enqueued the module definition such that\n          // it would only dequeue and add itself as module scope to all of its declarations,\n          // but only if  if all of its declarations had resolved. This call runs the check\n          // to see if any modules that are in the queue can be dequeued and add scope to\n          // their declarations.\n          flushModuleScopingQueueAsMuchAsPossible();\n        }\n\n        // If component compilation is async, then the @NgModule annotation which declares the\n        // component may execute and set an ngSelectorScope property on the component type. This\n        // allows the component to patch itself with directiveDefs from the module after it\n        // finishes compiling.\n        if (hasSelectorScope(type)) {\n          const scopes = transitiveScopesFor(type.ngSelectorScope);\n          patchComponentDefWithScope(ngComponentDef, scopes);\n        }\n\n        if (metadata.schemas) {\n          if (meta.isStandalone) {\n            ngComponentDef.schemas = metadata.schemas;\n          } else {\n            throw new Error(\n              `The 'schemas' was specified for the ${stringifyForError(\n                type,\n              )} but is only valid on a component that is standalone.`,\n            );\n          }\n        } else if (meta.isStandalone) {\n          ngComponentDef.schemas = [];\n        }\n      }\n      return ngComponentDef;\n    },\n    set: (def: ComponentDef<unknown> | null) => {\n      ngComponentDef = def;\n    },\n    // Make the property configurable in dev mode to allow overriding in tests\n    configurable: !!ngDevMode,\n  });\n}\n\n/**\n * Build memoized `directiveDefs` and `pipeDefs` functions for the component definition of a\n * standalone component, which process `imports` and filter out directives and pipes. The use of\n * memoized functions here allows for the delayed resolution of any `forwardRef`s present in the\n * component's `imports`.\n */\nfunction getStandaloneDefFunctions(\n  type: Type<any>,\n  imports: Type<any>[],\n): {\n  directiveDefs: () => DirectiveDefList;\n  pipeDefs: () => PipeDefList;\n} {\n  let cachedDirectiveDefs: DirectiveDefList | null = null;\n  let cachedPipeDefs: PipeDefList | null = null;\n  const directiveDefs = () => {\n    if (!USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {\n      if (cachedDirectiveDefs === null) {\n        // Standalone components are always able to self-reference, so include the component's own\n        // definition in its `directiveDefs`.\n        cachedDirectiveDefs = [getComponentDef(type)!];\n        const seen = new Set<Type<unknown>>([type]);\n\n        for (const rawDep of imports) {\n          ngDevMode && verifyStandaloneImport(rawDep, type);\n\n          const dep = resolveForwardRef(rawDep);\n          if (seen.has(dep)) {\n            continue;\n          }\n          seen.add(dep);\n\n          if (!!getNgModuleDef(dep)) {\n            const scope = transitiveScopesFor(dep);\n            for (const dir of scope.exported.directives) {\n              const def = getComponentDef(dir) || getDirectiveDef(dir);\n              if (def && !seen.has(dir)) {\n                seen.add(dir);\n                cachedDirectiveDefs.push(def);\n              }\n            }\n          } else {\n            const def = getComponentDef(dep) || getDirectiveDef(dep);\n            if (def) {\n              cachedDirectiveDefs.push(def);\n            }\n          }\n        }\n      }\n      return cachedDirectiveDefs;\n    } else {\n      if (ngDevMode) {\n        for (const rawDep of imports) {\n          verifyStandaloneImport(rawDep, type);\n        }\n      }\n\n      if (!isComponent(type)) {\n        return [];\n      }\n\n      const scope = depsTracker.getStandaloneComponentScope(type, imports);\n\n      return [...scope.compilation.directives]\n        .map((p) => (getComponentDef(p) || getDirectiveDef(p))!)\n        .filter((d) => d !== null);\n    }\n  };\n\n  const pipeDefs = () => {\n    if (!USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {\n      if (cachedPipeDefs === null) {\n        cachedPipeDefs = [];\n        const seen = new Set<Type<unknown>>();\n\n        for (const rawDep of imports) {\n          const dep = resolveForwardRef(rawDep);\n          if (seen.has(dep)) {\n            continue;\n          }\n          seen.add(dep);\n\n          if (!!getNgModuleDef(dep)) {\n            const scope = transitiveScopesFor(dep);\n            for (const pipe of scope.exported.pipes) {\n              const def = getPipeDef(pipe);\n              if (def && !seen.has(pipe)) {\n                seen.add(pipe);\n                cachedPipeDefs.push(def);\n              }\n            }\n          } else {\n            const def = getPipeDef(dep);\n            if (def) {\n              cachedPipeDefs.push(def);\n            }\n          }\n        }\n      }\n      return cachedPipeDefs;\n    } else {\n      if (ngDevMode) {\n        for (const rawDep of imports) {\n          verifyStandaloneImport(rawDep, type);\n        }\n      }\n\n      if (!isComponent(type)) {\n        return [];\n      }\n\n      const scope = depsTracker.getStandaloneComponentScope(type, imports);\n\n      return [...scope.compilation.pipes].map((p) => getPipeDef(p)!).filter((d) => d !== null);\n    }\n  };\n\n  return {\n    directiveDefs,\n    pipeDefs,\n  };\n}\n\nfunction hasSelectorScope<T>(\n  component: Type<T>,\n): component is Type<T> & {ngSelectorScope: Type<any>} {\n  return (component as {ngSelectorScope?: any}).ngSelectorScope !== undefined;\n}\n\n/**\n * Compile an Angular directive according to its decorator metadata, and patch the resulting\n * directive def onto the component type.\n *\n * In the event that compilation is not immediate, `compileDirective` will return a `Promise` which\n * will resolve when compilation completes and the directive becomes usable.\n */\nexport function compileDirective(type: Type<any>, directive: Directive | null): void {\n  let ngDirectiveDef: any = null;\n\n  addDirectiveFactoryDef(type, directive || {});\n\n  Object.defineProperty(type, NG_DIR_DEF, {\n    get: () => {\n      if (ngDirectiveDef === null) {\n        // `directive` can be null in the case of abstract directives as a base class\n        // that use `@Directive()` with no selector. In that case, pass empty object to the\n        // `directiveMetadata` function instead of null.\n        const meta = getDirectiveMetadata(type, directive || {});\n        const compiler = getCompilerFacade({\n          usage: JitCompilerUsage.Decorator,\n          kind: 'directive',\n          type,\n        });\n        ngDirectiveDef = compiler.compileDirective(\n          angularCoreEnv,\n          meta.sourceMapUrl,\n          meta.metadata,\n        );\n      }\n      return ngDirectiveDef;\n    },\n    // Make the property configurable in dev mode to allow overriding in tests\n    configurable: !!ngDevMode,\n  });\n}\n\nfunction getDirectiveMetadata(type: Type<any>, metadata: Directive) {\n  const name = type && type.name;\n  const sourceMapUrl = `ng:///${name}/ɵdir.js`;\n  const compiler = getCompilerFacade({usage: JitCompilerUsage.Decorator, kind: 'directive', type});\n  const facade = directiveMetadata(type as ComponentType<any>, metadata);\n  facade.typeSourceSpan = compiler.createParseSourceSpan('Directive', name, sourceMapUrl);\n  if (facade.usesInheritance) {\n    addDirectiveDefToUndecoratedParents(type);\n  }\n  return {metadata: facade, sourceMapUrl};\n}\n\nfunction addDirectiveFactoryDef(type: Type<any>, metadata: Directive | Component) {\n  let ngFactoryDef: any = null;\n\n  Object.defineProperty(type, NG_FACTORY_DEF, {\n    get: () => {\n      if (ngFactoryDef === null) {\n        const meta = getDirectiveMetadata(type, metadata);\n        const compiler = getCompilerFacade({\n          usage: JitCompilerUsage.Decorator,\n          kind: 'directive',\n          type,\n        });\n        ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${type.name}/ɵfac.js`, {\n          name: meta.metadata.name,\n          type: meta.metadata.type,\n          typeArgumentCount: 0,\n          deps: reflectDependencies(type),\n          target: compiler.FactoryTarget.Directive,\n        });\n      }\n      return ngFactoryDef;\n    },\n    // Make the property configurable in dev mode to allow overriding in tests\n    configurable: !!ngDevMode,\n  });\n}\n\nexport function extendsDirectlyFromObject(type: Type<any>): boolean {\n  return Object.getPrototypeOf(type.prototype) === Object.prototype;\n}\n\n/**\n * Extract the `R3DirectiveMetadata` for a particular directive (either a `Directive` or a\n * `Component`).\n */\nexport function directiveMetadata(type: Type<any>, metadata: Directive): R3DirectiveMetadataFacade {\n  // Reflect inputs and outputs.\n  const reflect = getReflect();\n  const propMetadata = reflect.ownPropMetadata(type);\n\n  return {\n    name: type.name,\n    type: type,\n    selector: metadata.selector !== undefined ? metadata.selector : null,\n    host: metadata.host || EMPTY_OBJ,\n    propMetadata: propMetadata,\n    inputs: metadata.inputs || EMPTY_ARRAY,\n    outputs: metadata.outputs || EMPTY_ARRAY,\n    queries: extractQueriesMetadata(type, propMetadata, isContentQuery),\n    lifecycle: {usesOnChanges: reflect.hasLifecycleHook(type, 'ngOnChanges')},\n    typeSourceSpan: null!,\n    usesInheritance: !extendsDirectlyFromObject(type),\n    exportAs: extractExportAs(metadata.exportAs),\n    providers: metadata.providers || null,\n    viewQueries: extractQueriesMetadata(type, propMetadata, isViewQuery),\n    isStandalone: metadata.standalone === undefined ? true : !!metadata.standalone,\n    isSignal: !!metadata.signals,\n    hostDirectives:\n      metadata.hostDirectives?.map((directive) =>\n        typeof directive === 'function' ? {directive} : directive,\n      ) || null,\n  };\n}\n\n/**\n * Adds a directive definition to all parent classes of a type that don't have an Angular decorator.\n */\nfunction addDirectiveDefToUndecoratedParents(type: Type<any>) {\n  const objPrototype = Object.prototype;\n  let parent = Object.getPrototypeOf(type.prototype).constructor;\n\n  // Go up the prototype until we hit `Object`.\n  while (parent && parent !== objPrototype) {\n    // Since inheritance works if the class was annotated already, we only need to add\n    // the def if there are no annotations and the def hasn't been created already.\n    if (\n      !getDirectiveDef(parent) &&\n      !getComponentDef(parent) &&\n      shouldAddAbstractDirective(parent)\n    ) {\n      compileDirective(parent, null);\n    }\n    parent = Object.getPrototypeOf(parent);\n  }\n}\n\nfunction convertToR3QueryPredicate(selector: any): any | string[] {\n  return typeof selector === 'string' ? splitByComma(selector) : resolveForwardRef(selector);\n}\n\nexport function convertToR3QueryMetadata(propertyName: string, ann: Query): R3QueryMetadataFacade {\n  return {\n    propertyName: propertyName,\n    predicate: convertToR3QueryPredicate(ann.selector),\n    descendants: ann.descendants,\n    first: ann.first,\n    read: ann.read ? ann.read : null,\n    static: !!ann.static,\n    emitDistinctChangesOnly: !!ann.emitDistinctChangesOnly,\n    isSignal: !!ann.isSignal,\n  };\n}\nfunction extractQueriesMetadata(\n  type: Type<any>,\n  propMetadata: {[key: string]: any[]},\n  isQueryAnn: (ann: any) => ann is Query,\n): R3QueryMetadataFacade[] {\n  const queriesMeta: R3QueryMetadataFacade[] = [];\n  for (const field in propMetadata) {\n    if (propMetadata.hasOwnProperty(field)) {\n      const annotations = propMetadata[field];\n      annotations.forEach((ann) => {\n        if (isQueryAnn(ann)) {\n          if (!ann.selector) {\n            throw new Error(\n              `Can't construct a query for the property \"${field}\" of ` +\n                `\"${stringifyForError(type)}\" since the query selector wasn't defined.`,\n            );\n          }\n          if (annotations.some(isInputAnnotation)) {\n            throw new Error(`Cannot combine @Input decorators with query decorators`);\n          }\n          queriesMeta.push(convertToR3QueryMetadata(field, ann));\n        }\n      });\n    }\n  }\n  return queriesMeta;\n}\n\nfunction extractExportAs(exportAs: string | undefined): string[] | null {\n  return exportAs === undefined ? null : splitByComma(exportAs);\n}\n\nfunction isContentQuery(value: any): value is Query {\n  const name = value.ngMetadataName;\n  return name === 'ContentChild' || name === 'ContentChildren';\n}\n\nfunction isViewQuery(value: any): value is Query {\n  const name = value.ngMetadataName;\n  return name === 'ViewChild' || name === 'ViewChildren';\n}\n\nfunction isInputAnnotation(value: any): value is Input {\n  return value.ngMetadataName === 'Input';\n}\n\nfunction splitByComma(value: string): string[] {\n  return value.split(',').map((piece) => piece.trim());\n}\n\nconst LIFECYCLE_HOOKS = [\n  'ngOnChanges',\n  'ngOnInit',\n  'ngOnDestroy',\n  'ngDoCheck',\n  'ngAfterViewInit',\n  'ngAfterViewChecked',\n  'ngAfterContentInit',\n  'ngAfterContentChecked',\n];\n\nfunction shouldAddAbstractDirective(type: Type<any>): boolean {\n  const reflect = getReflect();\n\n  if (LIFECYCLE_HOOKS.some((hookName) => reflect.hasLifecycleHook(type, hookName))) {\n    return true;\n  }\n\n  const propMetadata = reflect.propMetadata(type);\n\n  for (const field in propMetadata) {\n    const annotations = propMetadata[field];\n\n    for (let i = 0; i < annotations.length; i++) {\n      const current = annotations[i];\n      const metadataName = current.ngMetadataName;\n\n      if (\n        isInputAnnotation(current) ||\n        isContentQuery(current) ||\n        isViewQuery(current) ||\n        metadataName === 'Output' ||\n        metadataName === 'HostBinding' ||\n        metadataName === 'HostListener'\n      ) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  getCompilerFacade,\n  JitCompilerUsage,\n  R3PipeMetadataFacade,\n} from '../../compiler/compiler_facade';\nimport {reflectDependencies} from '../../di/jit/util';\nimport {Type} from '../../interface/type';\nimport type {Pipe} from '../../metadata/directives';\nimport {NG_FACTORY_DEF, NG_PIPE_DEF} from '../fields';\n\nimport {angularCoreEnv} from './environment';\n\nexport function compilePipe(type: Type<any>, meta: Pipe): void {\n  let ngPipeDef: any = null;\n  let ngFactoryDef: any = null;\n\n  Object.defineProperty(type, NG_FACTORY_DEF, {\n    get: () => {\n      if (ngFactoryDef === null) {\n        const metadata = getPipeMetadata(type, meta);\n        const compiler = getCompilerFacade({\n          usage: JitCompilerUsage.Decorator,\n          kind: 'pipe',\n          type: metadata.type,\n        });\n        ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${metadata.name}/ɵfac.js`, {\n          name: metadata.name,\n          type: metadata.type,\n          typeArgumentCount: 0,\n          deps: reflectDependencies(type),\n          target: compiler.FactoryTarget.Pipe,\n        });\n      }\n      return ngFactoryDef;\n    },\n    // Make the property configurable in dev mode to allow overriding in tests\n    configurable: !!ngDevMode,\n  });\n\n  Object.defineProperty(type, NG_PIPE_DEF, {\n    get: () => {\n      if (ngPipeDef === null) {\n        const metadata = getPipeMetadata(type, meta);\n        const compiler = getCompilerFacade({\n          usage: JitCompilerUsage.Decorator,\n          kind: 'pipe',\n          type: metadata.type,\n        });\n        ngPipeDef = compiler.compilePipe(\n          angularCoreEnv,\n          `ng:///${metadata.name}/ɵpipe.js`,\n          metadata,\n        );\n      }\n      return ngPipeDef;\n    },\n    // Make the property configurable in dev mode to allow overriding in tests\n    configurable: !!ngDevMode,\n  });\n}\n\nfunction getPipeMetadata(type: Type<any>, meta: Pipe): R3PipeMetadataFacade {\n  return {\n    type: type,\n    name: type.name,\n    pipeName: meta.name,\n    pure: meta.pure !== undefined ? meta.pure : true,\n    isStandalone: meta.standalone === undefined ? true : !!meta.standalone,\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ChangeDetectionStrategy} from '../change_detection/constants';\nimport {Provider} from '../di/interface/provider';\nimport {Type} from '../interface/type';\nimport {compileComponent, compileDirective} from '../render3/jit/directive';\nimport {compilePipe} from '../render3/jit/pipe';\nimport {makeDecorator, makePropDecorator, TypeDecorator} from '../util/decorators';\n\nimport {SchemaMetadata} from './schema';\nimport {ViewEncapsulation} from './view';\n\n/**\n * Type of the Directive decorator / constructor function.\n * @publicApi\n */\nexport interface DirectiveDecorator {\n  /**\n   * Decorator that marks a class as an Angular directive.\n   * You can define your own directives to attach custom behavior to elements in the DOM.\n   *\n   * The options provide configuration metadata that determines\n   * how the directive should be processed, instantiated and used at\n   * runtime.\n   *\n   * Directive classes, like component classes, can implement\n   * [life-cycle hooks](guide/components/lifecycle) to influence their configuration and behavior.\n   *\n   *\n   * @usageNotes\n   * To define a directive, mark the class with the decorator and provide metadata.\n   *\n   * ```ts\n   * import {Directive} from '@angular/core';\n   *\n   * @Directive({\n   *   selector: 'my-directive',\n   * })\n   * export class MyDirective {\n   * ...\n   * }\n   * ```\n   *\n   * ### Declaring directives\n   *\n   * In order to make a directive available to other components in your application, you should do\n   * one of the following:\n   *  - either mark the directive as [standalone](guide/components/importing),\n   *  - or declare it in an NgModule by adding it to the `declarations` and `exports` fields.\n   *\n   * ** Marking a directive as standalone **\n   *\n   * You can add the `standalone: true` flag to the Directive decorator metadata to declare it as\n   * [standalone](guide/components/importing):\n   *\n   * ```ts\n   * @Directive({\n   *   standalone: true,\n   *   selector: 'my-directive',\n   * })\n   * class MyDirective {}\n   * ```\n   *\n   * When marking a directive as standalone, please make sure that the directive is not already\n   * declared in an NgModule.\n   *\n   *\n   * ** Declaring a directive in an NgModule **\n   *\n   * Another approach is to declare a directive in an NgModule:\n   *\n   * ```ts\n   * @Directive({\n   *   selector: 'my-directive',\n   * })\n   * class MyDirective {}\n   *\n   * @NgModule({\n   *   declarations: [MyDirective, SomeComponent],\n   *   exports: [MyDirective], // making it available outside of this module\n   * })\n   * class SomeNgModule {}\n   * ```\n   *\n   * When declaring a directive in an NgModule, please make sure that:\n   *  - the directive is declared in exactly one NgModule.\n   *  - the directive is not standalone.\n   *  - you do not re-declare a directive imported from another module.\n   *  - the directive is included into the `exports` field as well if you want this directive to be\n   *    accessible for components outside of the NgModule.\n   *\n   *\n   * @Annotation\n   */\n  (obj?: Directive): TypeDecorator;\n\n  /**\n   * See the `Directive` decorator.\n   */\n  new (obj?: Directive): Directive;\n}\n\n/**\n * Directive decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport interface Directive {\n  /**\n   * The CSS selector that identifies this directive in a template\n   * and triggers instantiation of the directive.\n   *\n   * Declare as one of the following:\n   *\n   * - `element-name`: Select by element name.\n   * - `.class`: Select by class name.\n   * - `[attribute]`: Select by attribute name.\n   * - `[attribute=value]`: Select by attribute name and value.\n   * - `:not(sub_selector)`: Select only if the element does not match the `sub_selector`.\n   * - `selector1, selector2`: Select if either `selector1` or `selector2` matches.\n   *\n   * Angular only allows directives to apply on CSS selectors that do not cross\n   * element boundaries.\n   *\n   * For the following template HTML, a directive with an `input[type=text]` selector,\n   * would be instantiated only on the `<input type=\"text\">` element.\n   *\n   * ```html\n   * <form>\n   *   <input type=\"text\">\n   *   <input type=\"radio\">\n   * <form>\n   * ```\n   *\n   */\n  selector?: string;\n\n  /**\n   * Enumerates the set of data-bound input properties for a directive\n   *\n   * Angular automatically updates input properties during change detection.\n   * The `inputs` property accepts either strings or object literals that configure the directive\n   * properties that should be exposed as inputs.\n   *\n   * When an object literal is passed in, the `name` property indicates which property on the\n   * class the input should write to, while the `alias` determines the name under\n   * which the input will be available in template bindings. The `required` property indicates that\n   * the input is required which will trigger a compile-time error if it isn't passed in when the\n   * directive is used.\n   *\n   * When a string is passed into the `inputs` array, it can have a format of `'name'` or\n   * `'name: alias'` where `name` is the property on the class that the directive should write\n   * to, while the `alias` determines the name under which the input will be available in\n   * template bindings. String-based input definitions are assumed to be optional.\n   *\n   * @usageNotes\n   *\n   * The following example creates a component with two data-bound properties.\n   *\n   * ```ts\n   * @Component({\n   *   selector: 'bank-account',\n   *   inputs: ['bankName', {name: 'id', alias: 'account-id'}],\n   *   template: `\n   *     Bank Name: {{bankName}}\n   *     Account Id: {{id}}\n   *   `\n   * })\n   * class BankAccount {\n   *   bankName: string;\n   *   id: string;\n   * }\n   * ```\n   *\n   */\n  inputs?: (\n    | {\n        name: string;\n        alias?: string;\n        required?: boolean;\n        transform?: (value: any) => any;\n      }\n    | string\n  )[];\n\n  /**\n   * Enumerates the set of event-bound output properties.\n   *\n   * When an output property emits an event, an event handler attached to that event\n   * in the template is invoked.\n   *\n   * The `outputs` property defines a set of `directiveProperty` to `alias`\n   * configuration:\n   *\n   * - `directiveProperty` specifies the component property that emits events.\n   * - `alias` specifies the DOM property the event handler is attached to.\n   *\n   * @usageNotes\n   *\n   * ```ts\n   * @Component({\n   *   selector: 'child-dir',\n   *   outputs: [ 'bankNameChange' ],\n   *   template: `<input (input)=\"bankNameChange.emit($event.target.value)\" />`\n   * })\n   * class ChildDir {\n   *  bankNameChange: EventEmitter<string> = new EventEmitter<string>();\n   * }\n   *\n   * @Component({\n   *   selector: 'main',\n   *   template: `\n   *     {{ bankName }} <child-dir (bankNameChange)=\"onBankNameChange($event)\"></child-dir>\n   *   `\n   * })\n   * class MainComponent {\n   *  bankName: string;\n   *\n   *   onBankNameChange(bankName: string) {\n   *     this.bankName = bankName;\n   *   }\n   * }\n   * ```\n   *\n   */\n  outputs?: string[];\n\n  /**\n   * Configures the injector of this\n   * directive or component with a token\n   * that maps to a provider of a dependency.\n   */\n  providers?: Provider[];\n\n  /**\n   * Defines the name that can be used in the template to assign this directive to a variable.\n   *\n   * @usageNotes\n   *\n   * ```ts\n   * @Directive({\n   *   selector: 'child-dir',\n   *   exportAs: 'child'\n   * })\n   * class ChildDir {\n   * }\n   *\n   * @Component({\n   *   selector: 'main',\n   *   template: `<child-dir #c=\"child\"></child-dir>`\n   * })\n   * class MainComponent {\n   * }\n   * ```\n   *\n   */\n  exportAs?: string;\n\n  /**\n   * Configures the queries that will be injected into the directive.\n   *\n   * Content queries are set before the `ngAfterContentInit` callback is called.\n   * View queries are set before the `ngAfterViewInit` callback is called.\n   *\n   * @usageNotes\n   *\n   * The following example shows how queries are defined\n   * and when their results are available in lifecycle hooks:\n   *\n   * ```ts\n   * @Component({\n   *   selector: 'someDir',\n   *   queries: {\n   *     contentChildren: new ContentChildren(ChildDirective),\n   *     viewChildren: new ViewChildren(ChildDirective)\n   *   },\n   *   template: '<child-directive></child-directive>'\n   * })\n   * class SomeDir {\n   *   contentChildren: QueryList<ChildDirective>,\n   *   viewChildren: QueryList<ChildDirective>\n   *\n   *   ngAfterContentInit() {\n   *     // contentChildren is set\n   *   }\n   *\n   *   ngAfterViewInit() {\n   *     // viewChildren is set\n   *   }\n   * }\n   * ```\n   *\n   * @Annotation\n   */\n  queries?: {[key: string]: any};\n\n  /**\n   * Maps class properties to host element bindings for properties,\n   * attributes, and events, using a set of key-value pairs.\n   *\n   * Angular automatically checks host property bindings during change detection.\n   * If a binding changes, Angular updates the directive's host element.\n   *\n   * When the key is a property of the host element, the property value is\n   * propagated to the specified DOM property.\n   *\n   * When the key is a static attribute in the DOM, the attribute value\n   * is propagated to the specified property in the host element.\n   *\n   * For event handling:\n   * - The key is the DOM event that the directive listens to.\n   * To listen to global events, add the target to the event name.\n   * The target can be `window`, `document` or `body`.\n   * - The value is the statement to execute when the event occurs. If the\n   * statement evaluates to `false`, then `preventDefault` is applied on the DOM\n   * event. A handler method can refer to the `$event` local variable.\n   *\n   */\n  host?: {[key: string]: string};\n\n  /**\n   * When present, this directive/component is ignored by the AOT compiler.\n   * It remains in distributed code, and the JIT compiler attempts to compile it\n   * at run time, in the browser.\n   * To ensure the correct behavior, the app must import `@angular/compiler`.\n   */\n  jit?: true;\n\n  /**\n   * Angular directives marked as `standalone` do not need to be declared in an NgModule. Such\n   * directives don't depend on any \"intermediate context\" of an NgModule (ex. configured\n   * providers).\n   *\n   * More information about standalone components, directives, and pipes can be found in [this\n   * guide](guide/components/importing).\n   */\n  standalone?: boolean;\n\n  /**\n   * // TODO(signals): Remove internal and add public documentation\n   *\n   * @internal\n   */\n  signals?: boolean;\n\n  /**\n   * Standalone directives that should be applied to the host whenever the directive is matched.\n   * By default, none of the inputs or outputs of the host directives will be available on the host,\n   * unless they are specified in the `inputs` or `outputs` properties.\n   *\n   * You can additionally alias inputs and outputs by putting a colon and the alias after the\n   * original input or output name. For example, if a directive applied via `hostDirectives`\n   * defines an input named `menuDisabled`, you can alias this to `disabled` by adding\n   * `'menuDisabled: disabled'` as an entry to `inputs`.\n   */\n  hostDirectives?: (\n    | Type<unknown>\n    | {\n        directive: Type<unknown>;\n        inputs?: string[];\n        outputs?: string[];\n      }\n  )[];\n}\n\n/**\n * Type of the Directive metadata.\n *\n * @publicApi\n */\nexport const Directive: DirectiveDecorator = makeDecorator(\n  'Directive',\n  (dir: Directive = {}) => dir,\n  undefined,\n  undefined,\n  (type: Type<any>, meta: Directive) => compileDirective(type, meta),\n);\n\n/**\n * Component decorator interface\n *\n * @publicApi\n */\nexport interface ComponentDecorator {\n  /**\n   * Decorator that marks a class as an Angular component and provides configuration\n   * metadata that determines how the component should be processed,\n   * instantiated, and used at runtime.\n   *\n   * Components are the most basic UI building block of an Angular app.\n   * An Angular app contains a tree of Angular components.\n   *\n   * Angular components are a subset of directives, always associated with a template.\n   * Unlike other directives, only one component can be instantiated for a given element in a\n   * template.\n   *\n   * Standalone components can be directly imported in any other standalone component or NgModule.\n   * NgModule based apps on the other hand require components to belong to an NgModule in\n   * order for them to be available to another component or application. To make a component a\n   * member of an NgModule, list it in the `declarations` field of the `NgModule` metadata.\n   *\n   * Note that, in addition to these options for configuring a directive,\n   * you can control a component's runtime behavior by implementing\n   * life-cycle hooks. For more information, see the\n   * [Lifecycle Hooks](guide/components/lifecycle) guide.\n   *\n   * @usageNotes\n   *\n   * ### Setting component inputs\n   *\n   * The following example creates a component with two data-bound properties,\n   * specified by the `inputs` value.\n   *\n   * {@example core/ts/metadata/directives.ts region='component-input'}\n   *\n   *\n   * ### Setting component outputs\n   *\n   * The following example shows two output function that emit on an interval. One\n   * emits an output every second, while the other emits every five seconds.\n   *\n   * {@example core/ts/metadata/directives.ts region='component-output-interval'}\n   *\n   * ### Injecting a class with a view provider\n   *\n   * The following simple example injects a class into a component\n   * using the view provider specified in component metadata:\n   *\n   * ```ts\n   * class Greeter {\n   *    greet(name:string) {\n   *      return 'Hello ' + name + '!';\n   *    }\n   * }\n   *\n   * @Directive({\n   *   selector: 'needs-greeter'\n   * })\n   * class NeedsGreeter {\n   *   greeter:Greeter;\n   *\n   *   constructor(greeter:Greeter) {\n   *     this.greeter = greeter;\n   *   }\n   * }\n   *\n   * @Component({\n   *   selector: 'greet',\n   *   viewProviders: [\n   *     Greeter\n   *   ],\n   *   template: `<needs-greeter></needs-greeter>`\n   * })\n   * class HelloWorld {\n   * }\n   *\n   * ```\n   *\n   * ### Preserving whitespace\n   *\n   * Removing whitespace can greatly reduce AOT-generated code size and speed up view creation.\n   * As of Angular 6, the default for `preserveWhitespaces` is false (whitespace is removed).\n   * To change the default setting for all components in your application, set\n   * the `preserveWhitespaces` option of the AOT compiler.\n   *\n   * By default, the AOT compiler removes whitespace characters as follows:\n   * * Trims all whitespaces at the beginning and the end of a template.\n   * * Removes whitespace-only text nodes. For example,\n   *\n   * ```html\n   * <button>Action 1</button>  <button>Action 2</button>\n   * ```\n   *\n   * becomes:\n   *\n   * ```html\n   * <button>Action 1</button><button>Action 2</button>\n   * ```\n   *\n   * * Replaces a series of whitespace characters in text nodes with a single space.\n   * For example, `<span>\\n some text\\n</span>` becomes `<span> some text </span>`.\n   * * Does NOT alter text nodes inside HTML tags such as `<pre>` or `<textarea>`,\n   * where whitespace characters are significant.\n   *\n   * Note that these transformations can influence DOM nodes layout, although impact\n   * should be minimal.\n   *\n   * You can override the default behavior to preserve whitespace characters\n   * in certain fragments of a template. For example, you can exclude an entire\n   * DOM sub-tree by using the `ngPreserveWhitespaces` attribute:\n   *\n   * ```html\n   * <div ngPreserveWhitespaces>\n   *     whitespaces are preserved here\n   *     <span>    and here </span>\n   * </div>\n   * ```\n   *\n   * You can force a single space to be preserved in a text node by using `&ngsp;`,\n   * which is replaced with a space character by Angular's template\n   * compiler:\n   *\n   * ```html\n   * <a>Spaces</a>&ngsp;<a>between</a>&ngsp;<a>links.</a>\n   * <!-- compiled to be equivalent to:\n   *  <a>Spaces</a> <a>between</a> <a>links.</a>  -->\n   * ```\n   *\n   * Note that sequences of `&ngsp;` are still collapsed to just one space character when\n   * the `preserveWhitespaces` option is set to `false`.\n   *\n   * ```html\n   * <a>before</a>&ngsp;&ngsp;&ngsp;<a>after</a>\n   * <!-- compiled to be equivalent to:\n   *  <a>before</a> <a>after</a> -->\n   * ```\n   *\n   * To preserve sequences of whitespace characters, use the\n   * `ngPreserveWhitespaces` attribute.\n   *\n   * @Annotation\n   */\n  (obj: Component): TypeDecorator;\n  /**\n   * See the `Component` decorator.\n   */\n  new (obj: Component): Component;\n}\n\n/**\n * Supplies configuration metadata for an Angular component.\n *\n * @publicApi\n */\nexport interface Component extends Directive {\n  /**\n   * The change-detection strategy to use for this component.\n   *\n   * When a component is instantiated, Angular creates a change detector,\n   * which is responsible for propagating the component's bindings.\n   * The strategy is one of:\n   * - `ChangeDetectionStrategy#OnPush` sets the strategy to `CheckOnce` (on demand).\n   * - `ChangeDetectionStrategy#Default` sets the strategy to `CheckAlways`.\n   */\n  changeDetection?: ChangeDetectionStrategy;\n\n  /**\n   * Defines the set of injectable objects that are visible to its view DOM children.\n   * See [example](#injecting-a-class-with-a-view-provider).\n   *\n   */\n  viewProviders?: Provider[];\n\n  /**\n   * The module ID of the module that contains the component.\n   * The component must be able to resolve relative URLs for templates and styles.\n   * SystemJS exposes the `__moduleName` variable within each module.\n   * In CommonJS, this can  be set to `module.id`.\n   *\n   * @deprecated This option does not have any effect. Will be removed in Angular v17.\n   */\n  moduleId?: string;\n\n  /**\n   * The relative path or absolute URL of a template file for an Angular component.\n   * If provided, do not supply an inline template using `template`.\n   *\n   */\n  templateUrl?: string;\n\n  /**\n   * An inline template for an Angular component. If provided,\n   * do not supply a template file using `templateUrl`.\n   *\n   */\n  template?: string;\n\n  /**\n   * One relative path or an absolute URL for file containing a CSS stylesheet to use\n   * in this component.\n   */\n  styleUrl?: string;\n\n  /**\n   * Relative paths or absolute URLs for files containing CSS stylesheets to use in this component.\n   */\n  styleUrls?: string[];\n\n  /**\n   * One or more inline CSS stylesheets to use\n   * in this component.\n   */\n  styles?: string | string[];\n\n  /**\n   * One or more animation `trigger()` calls, containing\n   * [`state()`](api/animations/state) and `transition()` definitions.\n   * See the [Animations guide](guide/animations) and animations API documentation.\n   *\n   */\n  animations?: any[];\n\n  /**\n   * An encapsulation policy for the component's styling.\n   * Possible values:\n   * - `ViewEncapsulation.Emulated`: Apply modified component styles in order to emulate\n   *                                 a native Shadow DOM CSS encapsulation behavior.\n   * - `ViewEncapsulation.None`: Apply component styles globally without any sort of encapsulation.\n   * - `ViewEncapsulation.ShadowDom`: Use the browser's native Shadow DOM API to encapsulate styles.\n   *\n   * If not supplied, the value is taken from the `CompilerOptions`\n   * which defaults to `ViewEncapsulation.Emulated`.\n   *\n   * If the policy is `ViewEncapsulation.Emulated` and the component has no\n   * {@link Component#styles styles} nor {@link Component#styleUrls styleUrls},\n   * the policy is automatically switched to `ViewEncapsulation.None`.\n   */\n  encapsulation?: ViewEncapsulation;\n\n  /**\n   * Overrides the default interpolation start and end delimiters (`{{` and `}}`).\n   *\n   * @deprecated use Angular's default interpolation delimiters instead.\n   */\n  interpolation?: [string, string];\n\n  /**\n   * True to preserve or false to remove potentially superfluous whitespace characters\n   * from the compiled template. Whitespace characters are those matching the `\\s`\n   * character class in JavaScript regular expressions. Default is false, unless\n   * overridden in compiler options.\n   */\n  preserveWhitespaces?: boolean;\n\n  /**\n   * Angular components marked as `standalone` do not need to be declared in an NgModule. Such\n   * components directly manage their own template dependencies (components, directives, and pipes\n   * used in a template) via the imports property.\n   *\n   * More information about standalone components, directives, and pipes can be found in [this\n   * guide](guide/components/importing).\n   */\n  standalone?: boolean;\n\n  /**\n   * The imports property specifies the standalone component's template dependencies — those\n   * directives, components, and pipes that can be used within its template. Standalone components\n   * can import other standalone components, directives, and pipes as well as existing NgModules.\n   *\n   * This property is only available for standalone components - specifying it for components\n   * declared in an NgModule generates a compilation error.\n   *\n   * More information about standalone components, directives, and pipes can be found in [this\n   * guide](guide/components/importing).\n   */\n  imports?: (Type<any> | ReadonlyArray<any>)[];\n\n  /**\n   * The `deferredImports` property specifies a standalone component's template dependencies,\n   * which should be defer-loaded as a part of the `@defer` block. Angular *always* generates\n   * dynamic imports for such symbols and removes the regular/eager import. Make sure that imports\n   * which bring symbols used in the `deferredImports` don't contain other symbols.\n   *\n   * Note: this is an internal-only field, use regular `@Component.imports` field instead.\n   * @internal\n   */\n  deferredImports?: (Type<any> | ReadonlyArray<any>)[];\n\n  /**\n   * The set of schemas that declare elements to be allowed in a standalone component. Elements and\n   * properties that are neither Angular components nor directives must be declared in a schema.\n   *\n   * This property is only available for standalone components - specifying it for components\n   * declared in an NgModule generates a compilation error.\n   *\n   * More information about standalone components, directives, and pipes can be found in [this\n   * guide](guide/components/importing).\n   */\n  schemas?: SchemaMetadata[];\n}\n\n/**\n * Component decorator and metadata.\n *\n * @Annotation\n * @publicApi\n */\nexport const Component: ComponentDecorator = makeDecorator(\n  'Component',\n  (c: Component = {}) => ({changeDetection: ChangeDetectionStrategy.Default, ...c}),\n  Directive,\n  undefined,\n  (type: Type<any>, meta: Component) => compileComponent(type, meta),\n);\n\n/**\n * Type of the Pipe decorator / constructor function.\n *\n * @publicApi\n */\nexport interface PipeDecorator {\n  /**\n   *\n   * Decorator that marks a class as pipe and supplies configuration metadata.\n   *\n   * A pipe class must implement the `PipeTransform` interface.\n   * For example, if the name is \"myPipe\", use a template binding expression\n   * such as the following:\n   *\n   * ```html\n   * {{ exp | myPipe }}\n   * ```\n   *\n   * The result of the expression is passed to the pipe's `transform()` method.\n   *\n   * A pipe must belong to an NgModule in order for it to be available\n   * to a template. To make it a member of an NgModule,\n   * list it in the `declarations` field of the `NgModule` metadata.\n   *\n   * @see [Style Guide: Pipe Names](style-guide#02-09)\n   *\n   */\n  (obj: Pipe): TypeDecorator;\n\n  /**\n   * See the `Pipe` decorator.\n   */\n  new (obj: Pipe): Pipe;\n}\n\n/**\n * Type of the Pipe metadata.\n *\n * @publicApi\n */\nexport interface Pipe {\n  /**\n   * The pipe name to use in template bindings.\n   * Typically uses lowerCamelCase\n   * because the name cannot contain hyphens.\n   */\n  name: string;\n\n  /**\n   * When true, the pipe is pure, meaning that the\n   * `transform()` method is invoked only when its input arguments\n   * change. Pipes are pure by default.\n   *\n   * If the pipe has internal state (that is, the result\n   * depends on state other than its arguments), set `pure` to false.\n   * In this case, the pipe is invoked on each change-detection cycle,\n   * even if the arguments have not changed.\n   */\n  pure?: boolean;\n\n  /**\n   * Angular pipes marked as `standalone` do not need to be declared in an NgModule. Such\n   * pipes don't depend on any \"intermediate context\" of an NgModule (ex. configured providers).\n   *\n   * More information about standalone components, directives, and pipes can be found in [this\n   * guide](guide/components/importing).\n   */\n  standalone?: boolean;\n}\n\n/**\n * @Annotation\n * @publicApi\n */\nexport const Pipe: PipeDecorator = makeDecorator(\n  'Pipe',\n  (p: Pipe) => ({pure: true, ...p}),\n  undefined,\n  undefined,\n  (type: Type<any>, meta: Pipe) => compilePipe(type, meta),\n);\n\n/**\n * @publicApi\n */\nexport interface InputDecorator {\n  /**\n   * Decorator that marks a class field as an input property and supplies configuration metadata.\n   * The input property is bound to a DOM property in the template. During change detection,\n   * Angular automatically updates the data property with the DOM property's value.\n   *\n   * @usageNotes\n   *\n   * You can supply an optional name to use in templates when the\n   * component is instantiated, that maps to the\n   * name of the bound property. By default, the original\n   * name of the bound property is used for input binding.\n   *\n   * The following example creates a component with two input properties,\n   * one of which is given a special binding name.\n   *\n   * ```ts\n   * import { Component, Input, numberAttribute, booleanAttribute } from '@angular/core';\n   * @Component({\n   *   selector: 'bank-account',\n   *   template: `\n   *     Bank Name: {{bankName}}\n   *     Account Id: {{id}}\n   *     Account Status: {{status ? 'Active' : 'InActive'}}\n   *   `\n   * })\n   * class BankAccount {\n   *   // This property is bound using its original name.\n   *   // Defining argument required as true inside the Input Decorator\n   *   // makes this property deceleration as mandatory\n   *   @Input({ required: true }) bankName!: string;\n   *   // Argument alias makes this property value is bound to a different property name\n   *   // when this component is instantiated in a template.\n   *   // Argument transform convert the input value from string to number\n   *   @Input({ alias:'account-id', transform: numberAttribute }) id: number;\n   *   // Argument transform the input value from string to boolean\n   *   @Input({ transform: booleanAttribute }) status: boolean;\n   *   // this property is not bound, and is not automatically updated by Angular\n   *   normalizedBankName: string;\n   * }\n   *\n   * @Component({\n   *   selector: 'app',\n   *   template: `\n   *     <bank-account bankName=\"RBC\" account-id=\"4747\" status=\"true\"></bank-account>\n   *   `\n   * })\n   * class App {}\n   * ```\n   *\n   * @see [Input properties](guide/components/inputs)\n   * @see [Output properties](guide/components/outputs)\n   */\n  (arg?: string | Input): any;\n  new (arg?: string | Input): any;\n}\n\n/**\n * Type of metadata for an `Input` property.\n *\n * @publicApi\n */\nexport interface Input {\n  /**\n   * The name of the DOM property to which the input property is bound.\n   */\n  alias?: string;\n\n  /**\n   * Whether the input is required for the directive to function.\n   */\n  required?: boolean;\n\n  /**\n   * Function with which to transform the input value before assigning it to the directive instance.\n   */\n  transform?: (value: any) => any;\n\n  /**\n   * @internal\n   *\n   * Whether the input is a signal input.\n   *\n   * This option exists for JIT compatibility. Users are not expected to use this.\n   * Angular needs a way to capture inputs from classes so that the internal data\n   * structures can be set up. This needs to happen before the component is instantiated.\n   * Due to this, for JIT compilation, signal inputs need an additional decorator\n   * declaring the input. Angular provides a TS transformer to automatically handle this\n   * for JIT usage (e.g. in tests).\n   */\n  isSignal?: boolean;\n}\n\n/**\n * @Annotation\n * @publicApi\n */\nexport const Input: InputDecorator = makePropDecorator(\n  'Input',\n  (arg?: string | {alias?: string; required?: boolean}) => {\n    if (!arg) {\n      return {};\n    }\n    return typeof arg === 'string' ? {alias: arg} : arg;\n  },\n);\n\n/**\n * Type of the Output decorator / constructor function.\n *\n * @publicApi\n */\nexport interface OutputDecorator {\n  /**\n   * Decorator that marks a class field as an output property and supplies configuration metadata.\n   * The DOM property bound to the output property is automatically updated during change detection.\n   *\n   * @usageNotes\n   *\n   * You can supply an optional name to use in templates when the\n   * component is instantiated, that maps to the\n   * name of the bound property. By default, the original\n   * name of the bound property is used for output binding.\n   *\n   * See `Input` decorator for an example of providing a binding name.\n   *\n   * @see [Input properties](guide/components/inputs)\n   * @see [Output properties](guide/components/outputs)\n   *\n   */\n  (alias?: string): any;\n  new (alias?: string): any;\n}\n\n/**\n * Type of the Output metadata.\n *\n * @publicApi\n */\nexport interface Output {\n  /**\n   * The name of the DOM property to which the output property is bound.\n   */\n  alias?: string;\n}\n\n/**\n * @Annotation\n * @publicApi\n */\nexport const Output: OutputDecorator = makePropDecorator('Output', (alias?: string) => ({alias}));\n\n/**\n * Type of the HostBinding decorator / constructor function.\n *\n * @publicApi\n */\nexport interface HostBindingDecorator {\n  /**\n   * Decorator that marks a DOM property or an element class, style or attribute as a host-binding\n   * property and supplies configuration metadata. Angular automatically checks host bindings during\n   * change detection, and if a binding changes it updates the host element of the directive.\n   *\n   * @usageNotes\n   *\n   * The following example creates a directive that sets the `valid` and `invalid`\n   * class, a style color, and an id on the DOM element that has an `ngModel` directive on it.\n   *\n   * ```ts\n   * @Directive({selector: '[ngModel]'})\n   * class NgModelStatus {\n   *   constructor(public control: NgModel) {}\n   *   // class bindings\n   *   @HostBinding('class.valid') get valid() { return this.control.valid; }\n   *   @HostBinding('class.invalid') get invalid() { return this.control.invalid; }\n   *\n   *   // style binding\n   *   @HostBinding('style.color') get color() { return this.control.valid ? 'green': 'red'; }\n   *\n   *   // style binding also supports a style unit extension\n   *   @HostBinding('style.width.px') @Input() width: number = 500;\n   *\n   *   // attribute binding\n   *   @HostBinding('attr.aria-required')\n   *   @Input() required: boolean = false;\n   *\n   *   // property binding\n   *   @HostBinding('id') get id() { return this.control.value?.length ? 'odd':  'even'; }\n   *\n   * @Component({\n   *   selector: 'app',\n   *   template: `<input [(ngModel)]=\"prop\">`,\n   * })\n   * class App {\n   *   prop;\n   * }\n   * ```\n   *\n   */\n  (hostPropertyName?: string): any;\n  new (hostPropertyName?: string): any;\n}\n\n/**\n * Type of the HostBinding metadata.\n *\n * @publicApi\n */\nexport interface HostBinding {\n  /**\n   * The DOM property that is bound to a data property.\n   * This field also accepts:\n   *   * classes, prefixed by `class.`\n   *   * styles, prefixed by `style.`\n   *   * attributes, prefixed by `attr.`\n   */\n  hostPropertyName?: string;\n}\n\n/**\n * @Annotation\n * @publicApi\n */\nexport const HostBinding: HostBindingDecorator = makePropDecorator(\n  'HostBinding',\n  (hostPropertyName?: string) => ({hostPropertyName}),\n);\n\n/**\n * Type of the HostListener decorator / constructor function.\n *\n * @publicApi\n */\nexport interface HostListenerDecorator {\n  /**\n   * Decorator that declares a DOM event to listen for,\n   * and provides a handler method to run when that event occurs.\n   *\n   * Angular invokes the supplied handler method when the host element emits the specified event,\n   * and updates the bound element with the result.\n   *\n   * If the handler method returns false, applies `preventDefault` on the bound element.\n   *\n   * @usageNotes\n   *\n   * The following example declares a directive\n   * that attaches a click listener to a button and counts clicks.\n   *\n   * ```ts\n   * @Directive({selector: 'button[counting]'})\n   * class CountClicks {\n   *   numberOfClicks = 0;\n   *\n   *   @HostListener('click', ['$event.target'])\n   *   onClick(btn) {\n   *     console.log('button', btn, 'number of clicks:', this.numberOfClicks++);\n   *   }\n   * }\n   *\n   * @Component({\n   *   selector: 'app',\n   *   template: '<button counting>Increment</button>',\n   * })\n   * class App {}\n   * ```\n   *\n   * The following example registers another DOM event handler that listens for `Enter` key-press\n   * events on the global `window`.\n   * ```ts\n   * import { HostListener, Component    } from \"@angular/core\";\n   *\n   * @Component({\n   *   selector: 'app',\n   *   template: `<h1>Hello, you have pressed enter {{counter}} number of times!</h1> Press enter\n   * key to increment the counter. <button (click)=\"resetCounter()\">Reset Counter</button>`\n   * })\n   * class AppComponent {\n   *   counter = 0;\n   *   @HostListener('window:keydown.enter', ['$event'])\n   *   handleKeyDown(event: KeyboardEvent) {\n   *     this.counter++;\n   *   }\n   *   resetCounter() {\n   *     this.counter = 0;\n   *   }\n   * }\n   * ```\n   * The list of valid key names for `keydown` and `keyup` events\n   * can be found here:\n   * https://www.w3.org/TR/DOM-Level-3-Events-key/#named-key-attribute-values\n   *\n   * Note that keys can also be combined, e.g. `@HostListener('keydown.shift.a')`.\n   *\n   * The global target names that can be used to prefix an event name are\n   * `document:`, `window:` and `body:`.\n   *\n   */\n  (eventName: string, args?: string[]): any;\n  new (eventName: string, args?: string[]): any;\n}\n\n/**\n * Type of the HostListener metadata.\n *\n * @publicApi\n */\nexport interface HostListener {\n  /**\n   * The DOM event to listen for.\n   */\n  eventName?: string;\n  /**\n   * A set of arguments to pass to the handler method when the event occurs.\n   */\n  args?: string[];\n}\n\n/**\n * @Annotation\n * @publicApi\n */\nexport const HostListener: HostListenerDecorator = makePropDecorator(\n  'HostListener',\n  (eventName?: string, args?: string[]) => ({eventName, args}),\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentProviders, ModuleWithProviders, Provider} from '../di/interface/provider';\nimport {Type} from '../interface/type';\nimport {SchemaMetadata} from '../metadata/schema';\nimport {compileNgModule} from '../render3/jit/module';\nimport {makeDecorator, TypeDecorator} from '../util/decorators';\n\n/**\n * Type of the NgModule decorator / constructor function.\n *\n * @publicApi\n */\nexport interface NgModuleDecorator {\n  /**\n   * Decorator that marks a class as an NgModule and supplies configuration metadata.\n   */\n  (obj?: NgModule): TypeDecorator;\n  new (obj?: NgModule): NgModule;\n}\n\n/**\n * Type of the NgModule metadata.\n *\n * @publicApi\n */\nexport interface NgModule {\n  /**\n   * The set of injectable objects that are available in the injector\n   * of this module.\n   *\n   * @see [Dependency Injection guide](guide/di/dependency-injection\n   * @see [NgModule guide](guide/ngmodules/providers)\n   *\n   * @usageNotes\n   *\n   * Dependencies whose providers are listed here become available for injection\n   * into any component, directive, pipe or service that is a child of this injector.\n   * The NgModule used for bootstrapping uses the root injector, and can provide dependencies\n   * to any part of the app.\n   *\n   * A lazy-loaded module has its own injector, typically a child of the app root injector.\n   * Lazy-loaded services are scoped to the lazy-loaded module's injector.\n   * If a lazy-loaded module also provides the `UserService`, any component created\n   * within that module's context (such as by router navigation) gets the local instance\n   * of the service, not the instance in the root injector.\n   * Components in external modules continue to receive the instance provided by their injectors.\n   *\n   * ### Example\n   *\n   * The following example defines a class that is injected in\n   * the HelloWorld NgModule:\n   *\n   * ```ts\n   * class Greeter {\n   *    greet(name:string) {\n   *      return 'Hello ' + name + '!';\n   *    }\n   * }\n   *\n   * @NgModule({\n   *   providers: [\n   *     Greeter\n   *   ]\n   * })\n   * class HelloWorld {\n   *   greeter:Greeter;\n   *\n   *   constructor(greeter:Greeter) {\n   *     this.greeter = greeter;\n   *   }\n   * }\n   * ```\n   */\n  providers?: Array<Provider | EnvironmentProviders>;\n\n  /**\n   * The set of components, directives, and pipes (declarables\n   * that belong to this module.\n   *\n   * @usageNotes\n   *\n   * The set of selectors that are available to a template include those declared here, and\n   * those that are exported from imported NgModules.\n   *\n   * Declarables must belong to exactly one module.\n   * The compiler emits an error if you try to declare the same class in more than one module.\n   * Be careful not to declare a class that is imported from another module.\n   *\n   * ### Example\n   *\n   * The following example allows the CommonModule to use the `NgFor`\n   * directive.\n   *\n   * ```javascript\n   * @NgModule({\n   *   declarations: [NgFor]\n   * })\n   * class CommonModule {\n   * }\n   * ```\n   */\n  declarations?: Array<Type<any> | any[]>;\n\n  /**\n   * The set of NgModules whose exported declarables\n   * are available to templates in this module.\n   *\n   * @usageNotes\n   *\n   * A template can use exported declarables from any\n   * imported module, including those from modules that are imported indirectly\n   * and re-exported.\n   * For example, `ModuleA` imports `ModuleB`, and also exports\n   * it, which makes the declarables from `ModuleB` available\n   * wherever `ModuleA` is imported.\n   *\n   * ### Example\n   *\n   * The following example allows MainModule to use anything exported by\n   * `CommonModule`:\n   *\n   * ```javascript\n   * @NgModule({\n   *   imports: [CommonModule]\n   * })\n   * class MainModule {\n   * }\n   * ```\n   *\n   */\n  imports?: Array<Type<any> | ModuleWithProviders<{}> | any[]>;\n\n  /**\n   * The set of components, directives, and pipes declared in this\n   * NgModule that can be used in the template of any component that is part of an\n   * NgModule that imports this NgModule. Exported declarations are the module's public API.\n   *\n   * A declarable belongs to one and only one NgModule.\n   * A module can list another module among its exports, in which case all of that module's\n   * public declaration are exported.\n   *\n   * @usageNotes\n   *\n   * Declarations are private by default.\n   * If this ModuleA does not export UserComponent, then only the components within this\n   * ModuleA can use UserComponent.\n   *\n   * ModuleA can import ModuleB and also export it, making exports from ModuleB\n   * available to an NgModule that imports ModuleA.\n   *\n   * ### Example\n   *\n   * The following example exports the `NgFor` directive from CommonModule.\n   *\n   * ```javascript\n   * @NgModule({\n   *   exports: [NgFor]\n   * })\n   * class CommonModule {\n   * }\n   * ```\n   */\n  exports?: Array<Type<any> | any[]>;\n\n  /**\n   * The set of components that are bootstrapped when this module is bootstrapped.\n   */\n  bootstrap?: Array<Type<any> | any[]>;\n\n  /**\n   * The set of schemas that declare elements to be allowed in the NgModule.\n   * Elements and properties that are neither Angular components nor directives\n   * must be declared in a schema.\n   *\n   * Allowed value are `NO_ERRORS_SCHEMA` and `CUSTOM_ELEMENTS_SCHEMA`.\n   *\n   * @security When using one of `NO_ERRORS_SCHEMA` or `CUSTOM_ELEMENTS_SCHEMA`\n   * you must ensure that allowed elements and properties securely escape inputs.\n   */\n  schemas?: Array<SchemaMetadata | any[]>;\n\n  /**\n   * A name or path that uniquely identifies this NgModule in `getNgModuleById`.\n   * If left `undefined`, the NgModule is not registered with `getNgModuleById`.\n   */\n  id?: string;\n\n  /**\n   * When present, this module is ignored by the AOT compiler.\n   * It remains in distributed code, and the JIT compiler attempts to compile it\n   * at run time, in the browser.\n   * To ensure the correct behavior, the app must import `@angular/compiler`.\n   */\n  jit?: true;\n}\n\n/**\n * @Annotation\n */\nexport const NgModule: NgModuleDecorator = makeDecorator(\n  'NgModule',\n  (ngModule: NgModule) => ngModule,\n  undefined,\n  undefined,\n  /**\n   * Decorator that marks the following class as an NgModule, and supplies\n   * configuration metadata for it.\n   *\n   * * The `declarations` option configures the compiler\n   * with information about what belongs to the NgModule.\n   * * The `providers` options configures the NgModule's injector to provide\n   * dependencies the NgModule members.\n   * * The `imports` and `exports` options bring in members from other modules, and make\n   * this module's members available to others.\n   */\n  (type: Type<any>, meta: NgModule) => compileNgModule(type, meta),\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @description Represents the version of Angular\n *\n * @publicApi\n */\nexport class Version {\n  public readonly major: string;\n  public readonly minor: string;\n  public readonly patch: string;\n\n  constructor(public full: string) {\n    const parts = full.split('.');\n    this.major = parts[0];\n    this.minor = parts[1];\n    this.patch = parts.slice(2).join('.');\n  }\n}\n\n/**\n * @publicApi\n */\nexport const VERSION = new Version('19.2.14');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable} from '../di/injectable';\nimport {InjectionToken} from '../di/injection_token';\nimport {StaticProvider} from '../di/interface/provider';\nimport {Type} from '../interface/type';\nimport {ViewEncapsulation} from '../metadata/view';\nimport {ComponentFactory as ComponentFactoryR3} from '../render3/component_ref';\nimport {getComponentDef, getNgModuleDef} from '../render3/def_getters';\nimport {NgModuleFactory as NgModuleFactoryR3} from '../render3/ng_module_ref';\nimport {maybeUnwrapFn} from '../render3/util/misc_utils';\n\nimport {ComponentFactory} from './component_factory';\nimport {NgModuleFactory} from './ng_module_factory';\n\n/**\n * Combination of NgModuleFactory and ComponentFactories.\n *\n * @publicApi\n *\n * @deprecated\n * Ivy JIT mode doesn't require accessing this symbol.\n */\nexport class ModuleWithComponentFactories<T> {\n  constructor(\n    public ngModuleFactory: NgModuleFactory<T>,\n    public componentFactories: ComponentFactory<any>[],\n  ) {}\n}\n\n/**\n * Low-level service for running the angular compiler during runtime\n * to create {@link ComponentFactory}s, which\n * can later be used to create and render a Component instance.\n *\n * Each `@NgModule` provides an own `Compiler` to its injector,\n * that will use the directives/pipes of the ng module for compilation\n * of components.\n *\n * @publicApi\n *\n * @deprecated\n * Ivy JIT mode doesn't require accessing this symbol.\n */\n@Injectable({providedIn: 'root'})\nexport class Compiler {\n  /**\n   * Compiles the given NgModule and all of its components. All templates of the components\n   * have to be inlined.\n   */\n  compileModuleSync<T>(moduleType: Type<T>): NgModuleFactory<T> {\n    return new NgModuleFactoryR3(moduleType);\n  }\n\n  /**\n   * Compiles the given NgModule and all of its components\n   */\n  compileModuleAsync<T>(moduleType: Type<T>): Promise<NgModuleFactory<T>> {\n    return Promise.resolve(this.compileModuleSync(moduleType));\n  }\n\n  /**\n   * Same as {@link Compiler#compileModuleSync compileModuleSync} but also creates ComponentFactories for all components.\n   */\n  compileModuleAndAllComponentsSync<T>(moduleType: Type<T>): ModuleWithComponentFactories<T> {\n    const ngModuleFactory = this.compileModuleSync(moduleType);\n    const moduleDef = getNgModuleDef(moduleType)!;\n    const componentFactories = maybeUnwrapFn(moduleDef.declarations).reduce(\n      (factories: ComponentFactory<any>[], declaration: Type<any>) => {\n        const componentDef = getComponentDef(declaration);\n        componentDef && factories.push(new ComponentFactoryR3(componentDef));\n        return factories;\n      },\n      [] as ComponentFactory<any>[],\n    );\n    return new ModuleWithComponentFactories(ngModuleFactory, componentFactories);\n  }\n\n  /**\n   * Same as {@link Compiler#compileModuleAsync compileModuleAsync} but also creates ComponentFactories for all components.\n   */\n  compileModuleAndAllComponentsAsync<T>(\n    moduleType: Type<T>,\n  ): Promise<ModuleWithComponentFactories<T>> {\n    return Promise.resolve(this.compileModuleAndAllComponentsSync(moduleType));\n  }\n\n  /**\n   * Clears all caches.\n   */\n  clearCache(): void {}\n\n  /**\n   * Clears the cache for the given component/ngModule.\n   */\n  clearCacheFor(type: Type<any>) {}\n\n  /**\n   * Returns the id for a given NgModule, if one is defined and known to the compiler.\n   */\n  getModuleId(moduleType: Type<any>): string | undefined {\n    return undefined;\n  }\n}\n\n/**\n * Options for creating a compiler.\n *\n * @publicApi\n */\nexport type CompilerOptions = {\n  defaultEncapsulation?: ViewEncapsulation;\n  providers?: StaticProvider[];\n  preserveWhitespaces?: boolean;\n};\n\n/**\n * Token to provide CompilerOptions in the platform injector.\n *\n * @publicApi\n */\nexport const COMPILER_OPTIONS = new InjectionToken<CompilerOptions[]>(\n  ngDevMode ? 'compilerOptions' : '',\n);\n\n/**\n * A factory for creating a Compiler\n *\n * @publicApi\n *\n * @deprecated\n * Ivy JIT mode doesn't require accessing this symbol.\n */\nexport abstract class CompilerFactory {\n  abstract createCompiler(options?: CompilerOptions[]): Compiler;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {getCompilerFacade, JitCompilerUsage} from '../compiler/compiler_facade';\nimport {Injector} from '../di/injector';\nimport {Type} from '../interface/type';\nimport {COMPILER_OPTIONS, CompilerOptions} from '../linker/compiler';\nimport {NgModuleFactory} from '../linker/ng_module_factory';\nimport {\n  isComponentResourceResolutionQueueEmpty,\n  resolveComponentResources,\n} from '../metadata/resource_loading';\nimport {assertNgModuleType} from '../render3/assert';\nimport {setJitOptions} from '../render3/jit/jit_options';\nimport {NgModuleFactory as R3NgModuleFactory} from '../render3/ng_module_ref';\n\nexport function compileNgModuleFactory<M>(\n  injector: Injector,\n  options: CompilerOptions,\n  moduleType: Type<M>,\n): Promise<NgModuleFactory<M>> {\n  ngDevMode && assertNgModuleType(moduleType);\n\n  const moduleFactory = new R3NgModuleFactory(moduleType);\n\n  // All of the logic below is irrelevant for AOT-compiled code.\n  if (typeof ngJitMode !== 'undefined' && !ngJitMode) {\n    return Promise.resolve(moduleFactory);\n  }\n\n  const compilerOptions = injector.get(COMPILER_OPTIONS, []).concat(options);\n\n  // Configure the compiler to use the provided options. This call may fail when multiple modules\n  // are bootstrapped with incompatible options, as a component can only be compiled according to\n  // a single set of options.\n  setJitOptions({\n    defaultEncapsulation: _lastDefined(compilerOptions.map((opts) => opts.defaultEncapsulation)),\n    preserveWhitespaces: _lastDefined(compilerOptions.map((opts) => opts.preserveWhitespaces)),\n  });\n\n  if (isComponentResourceResolutionQueueEmpty()) {\n    return Promise.resolve(moduleFactory);\n  }\n\n  const compilerProviders = compilerOptions.flatMap((option) => option.providers ?? []);\n\n  // In case there are no compiler providers, we just return the module factory as\n  // there won't be any resource loader. This can happen with Ivy, because AOT compiled\n  // modules can be still passed through \"bootstrapModule\". In that case we shouldn't\n  // unnecessarily require the JIT compiler.\n  if (compilerProviders.length === 0) {\n    return Promise.resolve(moduleFactory);\n  }\n\n  const compiler = getCompilerFacade({\n    usage: JitCompilerUsage.Decorator,\n    kind: 'NgModule',\n    type: moduleType,\n  });\n  const compilerInjector = Injector.create({providers: compilerProviders});\n  const resourceLoader = compilerInjector.get(compiler.ResourceLoader);\n  // The resource loader can also return a string while the \"resolveComponentResources\"\n  // always expects a promise. Therefore we need to wrap the returned value in a promise.\n  return resolveComponentResources((url) => Promise.resolve(resourceLoader.get(url))).then(\n    () => moduleFactory,\n  );\n}\n\nfunction _lastDefined<T>(args: T[]): T | undefined {\n  for (let i = args.length - 1; i >= 0; i--) {\n    if (args[i] !== undefined) {\n      return args[i];\n    }\n  }\n  return undefined;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Subscription} from 'rxjs';\n\nimport {ApplicationRef} from '../../application/application_ref';\nimport {\n  ENVIRONMENT_INITIALIZER,\n  EnvironmentProviders,\n  inject,\n  Injectable,\n  InjectionToken,\n  makeEnvironmentProviders,\n  StaticProvider,\n} from '../../di';\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {PendingTasksInternal} from '../../pending_tasks';\nimport {performanceMarkFeature} from '../../util/performance';\nimport {NgZone} from '../../zone';\nimport {InternalNgZoneOptions} from '../../zone/ng_zone';\n\nimport {\n  ChangeDetectionScheduler,\n  ZONELESS_SCHEDULER_DISABLED,\n  ZONELESS_ENABLED,\n  SCHEDULE_IN_ROOT_ZONE,\n} from './zoneless_scheduling';\nimport {SCHEDULE_IN_ROOT_ZONE_DEFAULT} from './flags';\n\n@Injectable({providedIn: 'root'})\nexport class NgZoneChangeDetectionScheduler {\n  private readonly zone = inject(NgZone);\n  private readonly changeDetectionScheduler = inject(ChangeDetectionScheduler);\n  private readonly applicationRef = inject(ApplicationRef);\n\n  private _onMicrotaskEmptySubscription?: Subscription;\n\n  initialize(): void {\n    if (this._onMicrotaskEmptySubscription) {\n      return;\n    }\n\n    this._onMicrotaskEmptySubscription = this.zone.onMicrotaskEmpty.subscribe({\n      next: () => {\n        // `onMicroTaskEmpty` can happen _during_ the zoneless scheduler change detection because\n        // zone.run(() => {}) will result in `checkStable` at the end of the `zone.run` closure\n        // and emit `onMicrotaskEmpty` synchronously if run coalsecing is false.\n        if (this.changeDetectionScheduler.runningTick) {\n          return;\n        }\n        this.zone.run(() => {\n          this.applicationRef.tick();\n        });\n      },\n    });\n  }\n\n  ngOnDestroy() {\n    this._onMicrotaskEmptySubscription?.unsubscribe();\n  }\n}\n\n/**\n * Internal token used to verify that `provideZoneChangeDetection` is not used\n * with the bootstrapModule API.\n */\nexport const PROVIDED_NG_ZONE = new InjectionToken<boolean>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'provideZoneChangeDetection token' : '',\n  {factory: () => false},\n);\n\nexport function internalProvideZoneChangeDetection({\n  ngZoneFactory,\n  ignoreChangesOutsideZone,\n  scheduleInRootZone,\n}: {\n  ngZoneFactory?: () => NgZone;\n  ignoreChangesOutsideZone?: boolean;\n  scheduleInRootZone?: boolean;\n}): StaticProvider[] {\n  ngZoneFactory ??= () =>\n    new NgZone({...getNgZoneOptions(), scheduleInRootZone} as InternalNgZoneOptions);\n  return [\n    {provide: NgZone, useFactory: ngZoneFactory},\n    {\n      provide: ENVIRONMENT_INITIALIZER,\n      multi: true,\n      useFactory: () => {\n        const ngZoneChangeDetectionScheduler = inject(NgZoneChangeDetectionScheduler, {\n          optional: true,\n        });\n        if (\n          (typeof ngDevMode === 'undefined' || ngDevMode) &&\n          ngZoneChangeDetectionScheduler === null\n        ) {\n          throw new RuntimeError(\n            RuntimeErrorCode.MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP,\n            `A required Injectable was not found in the dependency injection tree. ` +\n              'If you are bootstrapping an NgModule, make sure that the `BrowserModule` is imported.',\n          );\n        }\n        return () => ngZoneChangeDetectionScheduler!.initialize();\n      },\n    },\n    {\n      provide: ENVIRONMENT_INITIALIZER,\n      multi: true,\n      useFactory: () => {\n        const service = inject(ZoneStablePendingTask);\n        return () => {\n          service.initialize();\n        };\n      },\n    },\n    // Always disable scheduler whenever explicitly disabled, even if another place called\n    // `provideZoneChangeDetection` without the 'ignore' option.\n    ignoreChangesOutsideZone === true ? {provide: ZONELESS_SCHEDULER_DISABLED, useValue: true} : [],\n    {\n      provide: SCHEDULE_IN_ROOT_ZONE,\n      useValue: scheduleInRootZone ?? SCHEDULE_IN_ROOT_ZONE_DEFAULT,\n    },\n  ];\n}\n\n/**\n * Provides `NgZone`-based change detection for the application bootstrapped using\n * `bootstrapApplication`.\n *\n * `NgZone` is already provided in applications by default. This provider allows you to configure\n * options like `eventCoalescing` in the `NgZone`.\n * This provider is not available for `platformBrowser().bootstrapModule`, which uses\n * `BootstrapOptions` instead.\n *\n * @usageNotes\n * ```ts\n * bootstrapApplication(MyApp, {providers: [\n *   provideZoneChangeDetection({eventCoalescing: true}),\n * ]});\n * ```\n *\n * @publicApi\n * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}\n * @see {@link NgZoneOptions}\n */\nexport function provideZoneChangeDetection(options?: NgZoneOptions): EnvironmentProviders {\n  const ignoreChangesOutsideZone = options?.ignoreChangesOutsideZone;\n  const scheduleInRootZone = (options as any)?.scheduleInRootZone;\n  const zoneProviders = internalProvideZoneChangeDetection({\n    ngZoneFactory: () => {\n      const ngZoneOptions = getNgZoneOptions(options);\n      ngZoneOptions.scheduleInRootZone = scheduleInRootZone;\n      if (ngZoneOptions.shouldCoalesceEventChangeDetection) {\n        performanceMarkFeature('NgZone_CoalesceEvent');\n      }\n      return new NgZone(ngZoneOptions);\n    },\n    ignoreChangesOutsideZone,\n    scheduleInRootZone,\n  });\n  return makeEnvironmentProviders([\n    {provide: PROVIDED_NG_ZONE, useValue: true},\n    {provide: ZONELESS_ENABLED, useValue: false},\n    zoneProviders,\n  ]);\n}\n\n/**\n * Used to configure event and run coalescing with `provideZoneChangeDetection`.\n *\n * @publicApi\n *\n * @see {@link provideZoneChangeDetection}\n */\nexport interface NgZoneOptions {\n  /**\n   * Optionally specify coalescing event change detections or not.\n   * Consider the following case.\n   *\n   * ```html\n   * <div (click)=\"doSomething()\">\n   *   <button (click)=\"doSomethingElse()\"></button>\n   * </div>\n   * ```\n   *\n   * When button is clicked, because of the event bubbling, both\n   * event handlers will be called and 2 change detections will be\n   * triggered. We can coalesce such kind of events to trigger\n   * change detection only once.\n   *\n   * By default, this option is set to false, meaning events will\n   * not be coalesced, and change detection will be triggered multiple times.\n   * If this option is set to true, change detection will be triggered\n   * once in the scenario described above.\n   */\n  eventCoalescing?: boolean;\n\n  /**\n   * Optionally specify if `NgZone#run()` method invocations should be coalesced\n   * into a single change detection.\n   *\n   * Consider the following case.\n   * ```ts\n   * for (let i = 0; i < 10; i ++) {\n   *   ngZone.run(() => {\n   *     // do something\n   *   });\n   * }\n   * ```\n   *\n   * This case triggers the change detection multiple times.\n   * With ngZoneRunCoalescing options, all change detections in an event loop trigger only once.\n   * In addition, the change detection executes in requestAnimation.\n   *\n   */\n  runCoalescing?: boolean;\n\n  /**\n   * When false, change detection is scheduled when Angular receives\n   * a clear indication that templates need to be refreshed. This includes:\n   *\n   * - calling `ChangeDetectorRef.markForCheck`\n   * - calling `ComponentRef.setInput`\n   * - updating a signal that is read in a template\n   * - attaching a view that is marked dirty\n   * - removing a view\n   * - registering a render hook (templates are only refreshed if render hooks do one of the above)\n   *\n   * @deprecated This option was introduced out of caution as a way for developers to opt out of the\n   *    new behavior in v18 which schedule change detection for the above events when they occur\n   *    outside the Zone. After monitoring the results post-release, we have determined that this\n   *    feature is working as desired and do not believe it should ever be disabled by setting\n   *    this option to `true`.\n   */\n  ignoreChangesOutsideZone?: boolean;\n}\n\n// Transforms a set of `BootstrapOptions` (supported by the NgModule-based bootstrap APIs) ->\n// `NgZoneOptions` that are recognized by the NgZone constructor. Passing no options will result in\n// a set of default options returned.\nexport function getNgZoneOptions(options?: NgZoneOptions): InternalNgZoneOptions {\n  return {\n    enableLongStackTrace: typeof ngDevMode === 'undefined' ? false : !!ngDevMode,\n    shouldCoalesceEventChangeDetection: options?.eventCoalescing ?? false,\n    shouldCoalesceRunChangeDetection: options?.runCoalescing ?? false,\n  };\n}\n\n@Injectable({providedIn: 'root'})\nexport class ZoneStablePendingTask {\n  private readonly subscription = new Subscription();\n  private initialized = false;\n  private readonly zone = inject(NgZone);\n  private readonly pendingTasks = inject(PendingTasksInternal);\n\n  initialize() {\n    if (this.initialized) {\n      return;\n    }\n    this.initialized = true;\n\n    let task: number | null = null;\n    if (!this.zone.isStable && !this.zone.hasPendingMacrotasks && !this.zone.hasPendingMicrotasks) {\n      task = this.pendingTasks.add();\n    }\n\n    this.zone.runOutsideAngular(() => {\n      this.subscription.add(\n        this.zone.onStable.subscribe(() => {\n          NgZone.assertNotInAngularZone();\n\n          // Check whether there are no pending macro/micro tasks in the next tick\n          // to allow for NgZone to update the state.\n          queueMicrotask(() => {\n            if (\n              task !== null &&\n              !this.zone.hasPendingMacrotasks &&\n              !this.zone.hasPendingMicrotasks\n            ) {\n              this.pendingTasks.remove(task);\n              task = null;\n            }\n          });\n        }),\n      );\n    });\n\n    this.subscription.add(\n      this.zone.onUnstable.subscribe(() => {\n        NgZone.assertInAngularZone();\n        task ??= this.pendingTasks.add();\n      }),\n    );\n  }\n\n  ngOnDestroy() {\n    this.subscription.unsubscribe();\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Subscription} from 'rxjs';\n\nimport {ApplicationRef, ApplicationRefDirtyFlags} from '../../application/application_ref';\nimport {Injectable} from '../../di/injectable';\nimport {inject} from '../../di/injector_compatibility';\nimport {EnvironmentProviders} from '../../di/interface/provider';\nimport {makeEnvironmentProviders} from '../../di/provider_collection';\nimport {RuntimeError, RuntimeErrorCode, formatRuntimeError} from '../../errors';\nimport {PendingTasksInternal} from '../../pending_tasks';\nimport {\n  scheduleCallbackWithMicrotask,\n  scheduleCallbackWithRafRace,\n} from '../../util/callback_scheduler';\nimport {performanceMarkFeature} from '../../util/performance';\nimport {NgZone, NgZonePrivate, NoopNgZone, angularZoneInstanceIdProperty} from '../../zone/ng_zone';\n\nimport {\n  ChangeDetectionScheduler,\n  NotificationSource,\n  PROVIDED_ZONELESS,\n  SCHEDULE_IN_ROOT_ZONE,\n  ZONELESS_ENABLED,\n  ZONELESS_SCHEDULER_DISABLED,\n} from './zoneless_scheduling';\nimport {TracingService} from '../../application/tracing';\n\nconst CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT = 100;\nlet consecutiveMicrotaskNotifications = 0;\nlet stackFromLastFewNotifications: string[] = [];\n\nfunction trackMicrotaskNotificationForDebugging() {\n  consecutiveMicrotaskNotifications++;\n  if (CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT - consecutiveMicrotaskNotifications < 5) {\n    const stack = new Error().stack;\n    if (stack) {\n      stackFromLastFewNotifications.push(stack);\n    }\n  }\n\n  if (consecutiveMicrotaskNotifications === CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT) {\n    throw new RuntimeError(\n      RuntimeErrorCode.INFINITE_CHANGE_DETECTION,\n      'Angular could not stabilize because there were endless change notifications within the browser event loop. ' +\n        'The stack from the last several notifications: \\n' +\n        stackFromLastFewNotifications.join('\\n'),\n    );\n  }\n}\n\n@Injectable({providedIn: 'root'})\nexport class ChangeDetectionSchedulerImpl implements ChangeDetectionScheduler {\n  private readonly appRef = inject(ApplicationRef);\n  private readonly taskService = inject(PendingTasksInternal);\n  private readonly ngZone = inject(NgZone);\n  private readonly zonelessEnabled = inject(ZONELESS_ENABLED);\n  private readonly tracing = inject(TracingService, {optional: true});\n  private readonly disableScheduling =\n    inject(ZONELESS_SCHEDULER_DISABLED, {optional: true}) ?? false;\n  private readonly zoneIsDefined = typeof Zone !== 'undefined' && !!Zone.root.run;\n  private readonly schedulerTickApplyArgs = [{data: {'__scheduler_tick__': true}}];\n  private readonly subscriptions = new Subscription();\n  private readonly angularZoneId = this.zoneIsDefined\n    ? (this.ngZone as NgZonePrivate)._inner?.get(angularZoneInstanceIdProperty)\n    : null;\n  private readonly scheduleInRootZone =\n    !this.zonelessEnabled &&\n    this.zoneIsDefined &&\n    (inject(SCHEDULE_IN_ROOT_ZONE, {optional: true}) ?? false);\n\n  private cancelScheduledCallback: null | (() => void) = null;\n  private useMicrotaskScheduler = false;\n  runningTick = false;\n  pendingRenderTaskId: number | null = null;\n\n  constructor() {\n    this.subscriptions.add(\n      this.appRef.afterTick.subscribe(() => {\n        // If the scheduler isn't running a tick but the application ticked, that means\n        // someone called ApplicationRef.tick manually. In this case, we should cancel\n        // any change detections that had been scheduled so we don't run an extra one.\n        if (!this.runningTick) {\n          this.cleanup();\n        }\n      }),\n    );\n    this.subscriptions.add(\n      this.ngZone.onUnstable.subscribe(() => {\n        // If the zone becomes unstable when we're not running tick (this happens from the zone.run),\n        // we should cancel any scheduled change detection here because at this point we\n        // know that the zone will stabilize at some point and run change detection itself.\n        if (!this.runningTick) {\n          this.cleanup();\n        }\n      }),\n    );\n\n    // TODO(atscott): These conditions will need to change when zoneless is the default\n    // Instead, they should flip to checking if ZoneJS scheduling is provided\n    this.disableScheduling ||=\n      !this.zonelessEnabled &&\n      // NoopNgZone without enabling zoneless means no scheduling whatsoever\n      (this.ngZone instanceof NoopNgZone ||\n        // The same goes for the lack of Zone without enabling zoneless scheduling\n        !this.zoneIsDefined);\n  }\n\n  notify(source: NotificationSource): void {\n    if (!this.zonelessEnabled && source === NotificationSource.Listener) {\n      // When the notification comes from a listener, we skip the notification unless the\n      // application has enabled zoneless. Ideally, listeners wouldn't notify the scheduler at all\n      // automatically. We do not know that a developer made a change in the listener callback that\n      // requires an `ApplicationRef.tick` (synchronize templates / run render hooks). We do this\n      // only for an easier migration from OnPush components to zoneless. Because listeners are\n      // usually executed inside the Angular zone and listeners automatically call `markViewDirty`,\n      // developers never needed to manually use `ChangeDetectorRef.markForCheck` or some other API\n      // to make listener callbacks work correctly with `OnPush` components.\n      return;\n    }\n\n    let force = false;\n\n    switch (source) {\n      case NotificationSource.MarkAncestorsForTraversal: {\n        this.appRef.dirtyFlags |= ApplicationRefDirtyFlags.ViewTreeTraversal;\n        break;\n      }\n      case NotificationSource.DebugApplyChanges:\n      case NotificationSource.DeferBlockStateUpdate:\n      case NotificationSource.MarkForCheck:\n      case NotificationSource.Listener:\n      case NotificationSource.SetInput: {\n        this.appRef.dirtyFlags |= ApplicationRefDirtyFlags.ViewTreeCheck;\n        break;\n      }\n      case NotificationSource.CustomElement: {\n        // We use `ViewTreeTraversal` to ensure we refresh the element even if this is triggered\n        // during CD. In practice this is a no-op since the elements code also calls via a\n        // `markForRefresh()` API which sends `NotificationSource.MarkAncestorsForTraversal` anyway.\n        this.appRef.dirtyFlags |= ApplicationRefDirtyFlags.ViewTreeTraversal;\n        force = true;\n        break;\n      }\n      case NotificationSource.RootEffect: {\n        this.appRef.dirtyFlags |= ApplicationRefDirtyFlags.RootEffects;\n        // Root effects still force a CD, even if the scheduler is disabled. This ensures that\n        // effects always run, even when triggered from outside the zone when the scheduler is\n        // otherwise disabled.\n        force = true;\n        break;\n      }\n      case NotificationSource.ViewEffect: {\n        // This is technically a no-op, since view effects will also send a\n        // `MarkAncestorsForTraversal` notification. Still, we set this for logical consistency.\n        this.appRef.dirtyFlags |= ApplicationRefDirtyFlags.ViewTreeTraversal;\n        // View effects still force a CD, even if the scheduler is disabled. This ensures that\n        // effects always run, even when triggered from outside the zone when the scheduler is\n        // otherwise disabled.\n        force = true;\n        break;\n      }\n      case NotificationSource.PendingTaskRemoved: {\n        // Removing a pending task via the public API forces a scheduled tick, ensuring that\n        // stability is async and delayed until there was at least an opportunity to run\n        // application synchronization. This prevents some footguns when working with the\n        // public API for pending tasks where developers attempt to update application state\n        // immediately after removing the last task.\n        force = true;\n        break;\n      }\n      case NotificationSource.ViewDetachedFromDOM:\n      case NotificationSource.ViewAttached:\n      case NotificationSource.RenderHook:\n      case NotificationSource.AsyncAnimationsLoaded:\n      default: {\n        // These notifications only schedule a tick but do not change whether we should refresh\n        // views. Instead, we only need to run render hooks unless another notification from the\n        // other set is also received before `tick` happens.\n        this.appRef.dirtyFlags |= ApplicationRefDirtyFlags.AfterRender;\n      }\n    }\n\n    // If not already defined, attempt to capture a tracing snapshot of this\n    // notification so that the resulting CD run can be attributed to the\n    // context which produced the notification.\n    this.appRef.tracingSnapshot = this.tracing?.snapshot(this.appRef.tracingSnapshot) ?? null;\n\n    if (!this.shouldScheduleTick(force)) {\n      return;\n    }\n\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      if (this.useMicrotaskScheduler) {\n        trackMicrotaskNotificationForDebugging();\n      } else {\n        consecutiveMicrotaskNotifications = 0;\n        stackFromLastFewNotifications.length = 0;\n      }\n    }\n\n    const scheduleCallback = this.useMicrotaskScheduler\n      ? scheduleCallbackWithMicrotask\n      : scheduleCallbackWithRafRace;\n    this.pendingRenderTaskId = this.taskService.add();\n    if (this.scheduleInRootZone) {\n      this.cancelScheduledCallback = Zone.root.run(() => scheduleCallback(() => this.tick()));\n    } else {\n      this.cancelScheduledCallback = this.ngZone.runOutsideAngular(() =>\n        scheduleCallback(() => this.tick()),\n      );\n    }\n  }\n\n  private shouldScheduleTick(force: boolean): boolean {\n    if ((this.disableScheduling && !force) || this.appRef.destroyed) {\n      return false;\n    }\n    // already scheduled or running\n    if (this.pendingRenderTaskId !== null || this.runningTick || this.appRef._runningTick) {\n      return false;\n    }\n    // If we're inside the zone don't bother with scheduler. Zone will stabilize\n    // eventually and run change detection.\n    if (\n      !this.zonelessEnabled &&\n      this.zoneIsDefined &&\n      Zone.current.get(angularZoneInstanceIdProperty + this.angularZoneId)\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Calls ApplicationRef._tick inside the `NgZone`.\n   *\n   * Calling `tick` directly runs change detection and cancels any change detection that had been\n   * scheduled previously.\n   *\n   * @param shouldRefreshViews Passed directly to `ApplicationRef._tick` and skips straight to\n   *     render hooks when `false`.\n   */\n  private tick(): void {\n    // When ngZone.run below exits, onMicrotaskEmpty may emit if the zone is\n    // stable. We want to prevent double ticking so we track whether the tick is\n    // already running and skip it if so.\n    if (this.runningTick || this.appRef.destroyed) {\n      return;\n    }\n\n    // If we reach the tick and there is no work to be done in ApplicationRef.tick,\n    // skip it altogether and clean up. There may be no work if, for example, the only\n    // event that notified the scheduler was the removal of a pending task.\n    if (this.appRef.dirtyFlags === ApplicationRefDirtyFlags.None) {\n      this.cleanup();\n      return;\n    }\n\n    // The scheduler used to pass \"whether to check views\" as a boolean flag instead of setting\n    // fine-grained dirtiness flags, and global checking was always used on the first pass. This\n    // created an interesting edge case: if a notification made a view dirty and then ticked via the\n    // scheduler (and not the zone) a global check was still performed.\n    //\n    // Ideally, this would not be the case, and only zone-based ticks would do global passes.\n    // However this is a breaking change and requires fixes in g3. Until this cleanup can be done,\n    // we add the `ViewTreeGlobal` flag to request a global check if any views are dirty in a\n    // scheduled tick (unless zoneless is enabled, in which case global checks aren't really a\n    // thing).\n    //\n    // TODO(alxhub): clean up and remove this workaround as a breaking change.\n    if (!this.zonelessEnabled && this.appRef.dirtyFlags & ApplicationRefDirtyFlags.ViewTreeAny) {\n      this.appRef.dirtyFlags |= ApplicationRefDirtyFlags.ViewTreeGlobal;\n    }\n\n    const task = this.taskService.add();\n    try {\n      this.ngZone.run(\n        () => {\n          this.runningTick = true;\n          this.appRef._tick();\n        },\n        undefined,\n        this.schedulerTickApplyArgs,\n      );\n    } catch (e: unknown) {\n      this.taskService.remove(task);\n      throw e;\n    } finally {\n      this.cleanup();\n    }\n    // If we're notified of a change within 1 microtask of running change\n    // detection, run another round in the same event loop. This allows code\n    // which uses Promise.resolve (see NgModel) to avoid\n    // ExpressionChanged...Error to still be reflected in a single browser\n    // paint, even if that spans multiple rounds of change detection.\n    this.useMicrotaskScheduler = true;\n    scheduleCallbackWithMicrotask(() => {\n      this.useMicrotaskScheduler = false;\n      this.taskService.remove(task);\n    });\n  }\n\n  ngOnDestroy() {\n    this.subscriptions.unsubscribe();\n    this.cleanup();\n  }\n\n  private cleanup() {\n    this.runningTick = false;\n    this.cancelScheduledCallback?.();\n    this.cancelScheduledCallback = null;\n    // If this is the last task, the service will synchronously emit a stable\n    // notification. If there is a subscriber that then acts in a way that\n    // tries to notify the scheduler again, we need to be able to respond to\n    // schedule a new change detection. Therefore, we should clear the task ID\n    // before removing it from the pending tasks (or the tasks service should\n    // not synchronously emit stable, similar to how Zone stableness only\n    // happens if it's still stable after a microtask).\n    if (this.pendingRenderTaskId !== null) {\n      const taskId = this.pendingRenderTaskId;\n      this.pendingRenderTaskId = null;\n      this.taskService.remove(taskId);\n    }\n  }\n}\n\n/**\n * Provides change detection without ZoneJS for the application bootstrapped using\n * `bootstrapApplication`.\n *\n * This function allows you to configure the application to not use the state/state changes of\n * ZoneJS to schedule change detection in the application. This will work when ZoneJS is not present\n * on the page at all or if it exists because something else is using it (either another Angular\n * application which uses ZoneJS for scheduling or some other library that relies on ZoneJS).\n *\n * This can also be added to the `TestBed` providers to configure the test environment to more\n * closely match production behavior. This will help give higher confidence that components are\n * compatible with zoneless change detection.\n *\n * ZoneJS uses browser events to trigger change detection. When using this provider, Angular will\n * instead use Angular APIs to schedule change detection. These APIs include:\n *\n * - `ChangeDetectorRef.markForCheck`\n * - `ComponentRef.setInput`\n * - updating a signal that is read in a template\n * - when bound host or template listeners are triggered\n * - attaching a view that was marked dirty by one of the above\n * - removing a view\n * - registering a render hook (templates are only refreshed if render hooks do one of the above)\n *\n * @usageNotes\n * ```ts\n * bootstrapApplication(MyApp, {providers: [\n *   provideExperimentalZonelessChangeDetection(),\n * ]});\n * ```\n *\n * This API is experimental. Neither the shape, nor the underlying behavior is stable and can change\n * in patch versions. There are known feature gaps and API ergonomic considerations. We will iterate\n * on the exact API based on the feedback and our understanding of the problem and solution space.\n *\n * @publicApi\n * @experimental\n * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}\n */\nexport function provideExperimentalZonelessChangeDetection(): EnvironmentProviders {\n  performanceMarkFeature('NgZoneless');\n\n  if ((typeof ngDevMode === 'undefined' || ngDevMode) && typeof Zone !== 'undefined' && Zone) {\n    const message = formatRuntimeError(\n      RuntimeErrorCode.UNEXPECTED_ZONEJS_PRESENT_IN_ZONELESS_MODE,\n      `The application is using zoneless change detection, but is still loading Zone.js. ` +\n        `Consider removing Zone.js to get the full benefits of zoneless. ` +\n        `In applications using the Angular CLI, Zone.js is typically included in the \"polyfills\" section of the angular.json file.`,\n    );\n    console.warn(message);\n  }\n\n  return makeEnvironmentProviders([\n    {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl},\n    {provide: NgZone, useClass: NoopNgZone},\n    {provide: ZONELESS_ENABLED, useValue: true},\n    {provide: SCHEDULE_IN_ROOT_ZONE, useValue: false},\n    typeof ngDevMode === 'undefined' || ngDevMode\n      ? [{provide: PROVIDED_ZONELESS, useValue: true}]\n      : [],\n  ]);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/// <reference path=\"../../../goog.d.ts\" />\n\nimport {InjectionToken} from '../di/injection_token';\nimport {inject} from '../di/injector_compatibility';\nimport {InjectFlags} from '../di/interface/injector';\n\nimport {DEFAULT_LOCALE_ID, USD_CURRENCY_CODE} from './localization';\n\ndeclare const $localize: {locale?: string};\n\n/**\n * Work out the locale from the potential global properties.\n *\n * * Closure Compiler: use `goog.LOCALE`.\n * * Ivy enabled: use `$localize.locale`\n */\nexport function getGlobalLocale(): string {\n  if (\n    typeof ngI18nClosureMode !== 'undefined' &&\n    ngI18nClosureMode &&\n    typeof goog !== 'undefined' &&\n    goog.LOCALE !== 'en'\n  ) {\n    // * The default `goog.LOCALE` value is `en`, while Angular used `en-US`.\n    // * In order to preserve backwards compatibility, we use Angular default value over\n    //   Closure Compiler's one.\n    return goog.LOCALE;\n  } else {\n    // KEEP `typeof $localize !== 'undefined' && $localize.locale` IN SYNC WITH THE LOCALIZE\n    // COMPILE-TIME INLINER.\n    //\n    // * During compile time inlining of translations the expression will be replaced\n    //   with a string literal that is the current locale. Other forms of this expression are not\n    //   guaranteed to be replaced.\n    //\n    // * During runtime translation evaluation, the developer is required to set `$localize.locale`\n    //   if required, or just to provide their own `LOCALE_ID` provider.\n    return (typeof $localize !== 'undefined' && $localize.locale) || DEFAULT_LOCALE_ID;\n  }\n}\n\n/**\n * Provide this token to set the locale of your application.\n * It is used for i18n extraction, by i18n pipes (DatePipe, I18nPluralPipe, CurrencyPipe,\n * DecimalPipe and PercentPipe) and by ICU expressions.\n *\n * See the [i18n guide](guide/i18n/locale-id) for more information.\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * import { LOCALE_ID } from '@angular/core';\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n * import { AppModule } from './app/app.module';\n *\n * platformBrowserDynamic().bootstrapModule(AppModule, {\n *   providers: [{provide: LOCALE_ID, useValue: 'en-US' }]\n * });\n * ```\n *\n * @publicApi\n */\nexport const LOCALE_ID: InjectionToken<string> = new InjectionToken(ngDevMode ? 'LocaleId' : '', {\n  providedIn: 'root',\n  factory: () =>\n    inject(LOCALE_ID, InjectFlags.Optional | InjectFlags.SkipSelf) || getGlobalLocale(),\n});\n\n/**\n * Provide this token to set the default currency code your application uses for\n * CurrencyPipe when there is no currency code passed into it. This is only used by\n * CurrencyPipe and has no relation to locale currency. Defaults to USD if not configured.\n *\n * See the [i18n guide](guide/i18n/locale-id) for more information.\n *\n * <div class=\"docs-alert docs-alert-helpful\">\n *\n * The default currency code is currently always `USD`.\n *\n * If you need the previous behavior then set it by creating a `DEFAULT_CURRENCY_CODE` provider in\n * your application `NgModule`:\n *\n * ```ts\n * {provide: DEFAULT_CURRENCY_CODE, useValue: 'USD'}\n * ```\n *\n * </div>\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n * import { AppModule } from './app/app.module';\n *\n * platformBrowserDynamic().bootstrapModule(AppModule, {\n *   providers: [{provide: DEFAULT_CURRENCY_CODE, useValue: 'EUR' }]\n * });\n * ```\n *\n * @publicApi\n */\nexport const DEFAULT_CURRENCY_CODE = new InjectionToken<string>(\n  ngDevMode ? 'DefaultCurrencyCode' : '',\n  {\n    providedIn: 'root',\n    factory: () => USD_CURRENCY_CODE,\n  },\n);\n\n/**\n * Use this token at bootstrap to provide the content of your translation file (`xtb`,\n * `xlf` or `xlf2`) when you want to translate your application in another language.\n *\n * See the [i18n guide](guide/i18n/merge) for more information.\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * import { TRANSLATIONS } from '@angular/core';\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n * import { AppModule } from './app/app.module';\n *\n * // content of your translation file\n * const translations = '....';\n *\n * platformBrowserDynamic().bootstrapModule(AppModule, {\n *   providers: [{provide: TRANSLATIONS, useValue: translations }]\n * });\n * ```\n *\n * @publicApi\n */\nexport const TRANSLATIONS = new InjectionToken<string>(ngDevMode ? 'Translations' : '');\n\n/**\n * Provide this token at bootstrap to set the format of your {@link TRANSLATIONS}: `xtb`,\n * `xlf` or `xlf2`.\n *\n * See the [i18n guide](guide/i18n/merge) for more information.\n *\n * @usageNotes\n * ### Example\n *\n * ```ts\n * import { TRANSLATIONS_FORMAT } from '@angular/core';\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n * import { AppModule } from './app/app.module';\n *\n * platformBrowserDynamic().bootstrapModule(AppModule, {\n *   providers: [{provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }]\n * });\n * ```\n *\n * @publicApi\n */\nexport const TRANSLATIONS_FORMAT = new InjectionToken<string>(\n  ngDevMode ? 'TranslationsFormat' : '',\n);\n\n/**\n * Use this enum at bootstrap as an option of `bootstrapModule` to define the strategy\n * that the compiler should use in case of missing translations:\n * - Error: throw if you have missing translations.\n * - Warning (default): show a warning in the console and/or shell.\n * - Ignore: do nothing.\n *\n * See the [i18n guide](guide/i18n/merge#report-missing-translations) for more information.\n *\n * @usageNotes\n * ### Example\n * ```ts\n * import { MissingTranslationStrategy } from '@angular/core';\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n * import { AppModule } from './app/app.module';\n *\n * platformBrowserDynamic().bootstrapModule(AppModule, {\n *   missingTranslation: MissingTranslationStrategy.Error\n * });\n * ```\n *\n * @publicApi\n */\nexport enum MissingTranslationStrategy {\n  Error = 0,\n  Warning = 1,\n  Ignore = 2,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {IMAGE_CONFIG, ImageConfig} from './application/application_tokens';\nimport {Injectable} from './di';\nimport {inject} from './di/injector_compatibility';\nimport {formatRuntimeError, RuntimeErrorCode} from './errors';\nimport {OnDestroy} from './interface/lifecycle_hooks';\nimport {getDocument} from './render3/interfaces/document';\n\n// A delay in milliseconds before the scan is run after onLoad, to avoid any\n// potential race conditions with other LCP-related functions. This delay\n// happens outside of the main JavaScript execution and will only effect the timing\n// on when the warning becomes visible in the console.\nconst SCAN_DELAY = 200;\n\nconst OVERSIZED_IMAGE_TOLERANCE = 1200;\n\n@Injectable({providedIn: 'root'})\nexport class ImagePerformanceWarning implements OnDestroy {\n  // Map of full image URLs -> original `ngSrc` values.\n  private window: Window | null = null;\n  private observer: PerformanceObserver | null = null;\n  private options: ImageConfig = inject(IMAGE_CONFIG);\n  private lcpImageUrl?: string;\n\n  public start() {\n    if (\n      (typeof ngServerMode !== 'undefined' && ngServerMode) ||\n      typeof PerformanceObserver === 'undefined' ||\n      (this.options?.disableImageSizeWarning && this.options?.disableImageLazyLoadWarning)\n    ) {\n      return;\n    }\n    this.observer = this.initPerformanceObserver();\n    const doc = getDocument();\n    const win = doc.defaultView;\n    if (win) {\n      this.window = win;\n      // Wait to avoid race conditions where LCP image triggers\n      // load event before it's recorded by the performance observer\n      const waitToScan = () => {\n        setTimeout(this.scanImages.bind(this), SCAN_DELAY);\n      };\n      const setup = () => {\n        // Consider the case when the application is created and destroyed multiple times.\n        // Typically, applications are created instantly once the page is loaded, and the\n        // `window.load` listener is always triggered. However, the `window.load` event will never\n        // be fired if the page is loaded, and the application is created later. Checking for\n        // `readyState` is the easiest way to determine whether the page has been loaded or not.\n        if (doc.readyState === 'complete') {\n          waitToScan();\n        } else {\n          this.window?.addEventListener('load', waitToScan, {once: true});\n        }\n      };\n      // Angular doesn't have to run change detection whenever any asynchronous tasks are invoked in\n      // the scope of this functionality.\n      if (typeof Zone !== 'undefined') {\n        Zone.root.run(() => setup());\n      } else {\n        setup();\n      }\n    }\n  }\n\n  ngOnDestroy() {\n    this.observer?.disconnect();\n  }\n\n  private initPerformanceObserver(): PerformanceObserver | null {\n    if (typeof PerformanceObserver === 'undefined') {\n      return null;\n    }\n    const observer = new PerformanceObserver((entryList) => {\n      const entries = entryList.getEntries();\n      if (entries.length === 0) return;\n      // We use the latest entry produced by the `PerformanceObserver` as the best\n      // signal on which element is actually an LCP one. As an example, the first image to load on\n      // a page, by virtue of being the only thing on the page so far, is often a LCP candidate\n      // and gets reported by PerformanceObserver, but isn't necessarily the LCP element.\n      const lcpElement = entries[entries.length - 1];\n\n      // Cast to `any` due to missing `element` on the `LargestContentfulPaint` type of entry.\n      // See https://developer.mozilla.org/en-US/docs/Web/API/LargestContentfulPaint\n      const imgSrc = (lcpElement as any).element?.src ?? '';\n\n      // Exclude `data:` and `blob:` URLs, since they are fetched resources.\n      if (imgSrc.startsWith('data:') || imgSrc.startsWith('blob:')) return;\n      this.lcpImageUrl = imgSrc;\n    });\n    observer.observe({type: 'largest-contentful-paint', buffered: true});\n    return observer;\n  }\n\n  private scanImages(): void {\n    const images = getDocument().querySelectorAll('img');\n    let lcpElementFound,\n      lcpElementLoadedCorrectly = false;\n    images.forEach((image) => {\n      if (!this.options?.disableImageSizeWarning) {\n        // Image elements using the NgOptimizedImage directive are excluded,\n        // as that directive has its own version of this check.\n        if (!image.getAttribute('ng-img') && this.isOversized(image)) {\n          logOversizedImageWarning(image.src);\n        }\n      }\n      if (!this.options?.disableImageLazyLoadWarning && this.lcpImageUrl) {\n        if (image.src === this.lcpImageUrl) {\n          lcpElementFound = true;\n          if (image.loading !== 'lazy' || image.getAttribute('ng-img')) {\n            // This variable is set to true and never goes back to false to account\n            // for the case where multiple images have the same src url, and some\n            // have lazy loading while others don't.\n            // Also ignore NgOptimizedImage because there's a different warning for that.\n            lcpElementLoadedCorrectly = true;\n          }\n        }\n      }\n    });\n    if (\n      lcpElementFound &&\n      !lcpElementLoadedCorrectly &&\n      this.lcpImageUrl &&\n      !this.options?.disableImageLazyLoadWarning\n    ) {\n      logLazyLCPWarning(this.lcpImageUrl);\n    }\n  }\n\n  private isOversized(image: HTMLImageElement): boolean {\n    if (!this.window) {\n      return false;\n    }\n\n    // The `isOversized` check may not be applicable or may require adjustments\n    // for several types of image formats or scenarios. Currently, we specify only\n    // `svg`, but this may also include `gif` since their quality isn’t tied to\n    // dimensions in the same way as raster images.\n    const nonOversizedImageExtentions = [\n      // SVG images are vector-based, which means they can scale\n      // to any size without losing quality.\n      '.svg',\n    ];\n\n    // Convert it to lowercase because this may have uppercase\n    // extensions, such as `IMAGE.SVG`.\n    // We fallback to an empty string because `src` may be `undefined`\n    // if it is explicitly set to `null` by some third-party code\n    // (e.g., `image.src = null`).\n    const imageSource = (image.src || '').toLowerCase();\n\n    if (nonOversizedImageExtentions.some((extension) => imageSource.endsWith(extension))) {\n      return false;\n    }\n\n    const computedStyle = this.window.getComputedStyle(image);\n    let renderedWidth = parseFloat(computedStyle.getPropertyValue('width'));\n    let renderedHeight = parseFloat(computedStyle.getPropertyValue('height'));\n    const boxSizing = computedStyle.getPropertyValue('box-sizing');\n    const objectFit = computedStyle.getPropertyValue('object-fit');\n\n    if (objectFit === `cover`) {\n      // Object fit cover may indicate a use case such as a sprite sheet where\n      // this warning does not apply.\n      return false;\n    }\n\n    if (boxSizing === 'border-box') {\n      // If the image `box-sizing` is set to `border-box`, we adjust the rendered\n      // dimensions by subtracting padding values.\n      const paddingTop = computedStyle.getPropertyValue('padding-top');\n      const paddingRight = computedStyle.getPropertyValue('padding-right');\n      const paddingBottom = computedStyle.getPropertyValue('padding-bottom');\n      const paddingLeft = computedStyle.getPropertyValue('padding-left');\n      renderedWidth -= parseFloat(paddingRight) + parseFloat(paddingLeft);\n      renderedHeight -= parseFloat(paddingTop) + parseFloat(paddingBottom);\n    }\n\n    const intrinsicWidth = image.naturalWidth;\n    const intrinsicHeight = image.naturalHeight;\n\n    const recommendedWidth = this.window.devicePixelRatio * renderedWidth;\n    const recommendedHeight = this.window.devicePixelRatio * renderedHeight;\n    const oversizedWidth = intrinsicWidth - recommendedWidth >= OVERSIZED_IMAGE_TOLERANCE;\n    const oversizedHeight = intrinsicHeight - recommendedHeight >= OVERSIZED_IMAGE_TOLERANCE;\n    return oversizedWidth || oversizedHeight;\n  }\n}\n\nfunction logLazyLCPWarning(src: string) {\n  console.warn(\n    formatRuntimeError(\n      RuntimeErrorCode.IMAGE_PERFORMANCE_WARNING,\n      `An image with src ${src} is the Largest Contentful Paint (LCP) element ` +\n        `but was given a \"loading\" value of \"lazy\", which can negatively impact ` +\n        `application loading performance. This warning can be addressed by ` +\n        `changing the loading value of the LCP image to \"eager\", or by using the ` +\n        `NgOptimizedImage directive's prioritization utilities. For more ` +\n        `information about addressing or disabling this warning, see ` +\n        `https://angular.dev/errors/NG0913`,\n    ),\n  );\n}\n\nfunction logOversizedImageWarning(src: string) {\n  console.warn(\n    formatRuntimeError(\n      RuntimeErrorCode.IMAGE_PERFORMANCE_WARNING,\n      `An image with src ${src} has intrinsic file dimensions much larger than its ` +\n        `rendered size. This can negatively impact application loading performance. ` +\n        `For more information about addressing or disabling this warning, see ` +\n        `https://angular.dev/errors/NG0913`,\n    ),\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '../di';\n\n/**\n * Internal token that allows to register extra callbacks that should be invoked during the\n * `PlatformRef.destroy` operation. This token is needed to avoid a direct reference to the\n * `PlatformRef` class (i.e. register the callback via `PlatformRef.onDestroy`), thus making the\n * entire class tree-shakeable.\n */\nexport const PLATFORM_DESTROY_LISTENERS = new InjectionToken<Set<VoidFunction>>(\n  ngDevMode ? 'PlatformDestroyListeners' : '',\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {Subscription} from 'rxjs';\n\nimport {PROVIDED_NG_ZONE} from '../change_detection/scheduling/ng_zone_scheduling';\nimport {R3Injector} from '../di/r3_injector';\nimport {ErrorHandler} from '../error_handler';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {DEFAULT_LOCALE_ID} from '../i18n/localization';\nimport {LOCALE_ID} from '../i18n/tokens';\nimport {ImagePerformanceWarning} from '../image_performance_warning';\nimport {Type} from '../interface/type';\nimport {PLATFORM_DESTROY_LISTENERS} from './platform_destroy_listeners';\nimport {setLocaleId} from '../render3/i18n/i18n_locale_id';\nimport {NgZone} from '../zone/ng_zone';\n\nimport {ApplicationInitStatus} from '../application/application_init';\nimport {ApplicationRef, remove} from '../application/application_ref';\nimport {PROVIDED_ZONELESS} from '../change_detection/scheduling/zoneless_scheduling';\nimport {InjectionToken, Injector} from '../di';\nimport {InternalNgModuleRef, NgModuleRef} from '../linker/ng_module_factory';\nimport {stringify} from '../util/stringify';\nimport {isPromise} from '../util/lang';\n\n/**\n * InjectionToken to control root component bootstrap behavior.\n *\n * This token is primarily used in Angular's server-side rendering (SSR) scenarios,\n * particularly by the `@angular/ssr` package, to manage whether the root component\n * should be bootstrapped during the application initialization process.\n *\n * ## Purpose:\n * During SSR route extraction, setting this token to `false` prevents Angular from\n * bootstrapping the root component. This avoids unnecessary component rendering,\n * enabling route extraction without requiring additional APIs or triggering\n * component logic.\n *\n * ## Behavior:\n * - **`false`**: Prevents the root component from being bootstrapped.\n * - **`true`** (default): Proceeds with the normal root component bootstrap process.\n *\n * This mechanism ensures SSR can efficiently separate route extraction logic\n * from component rendering.\n */\nexport const ENABLE_ROOT_COMPONENT_BOOTSTRAP = new InjectionToken<boolean>(\n  ngDevMode ? 'ENABLE_ROOT_COMPONENT_BOOTSTRAP' : '',\n);\n\nexport interface BootstrapConfig {\n  platformInjector: Injector;\n}\n\nexport interface ModuleBootstrapConfig<M> extends BootstrapConfig {\n  moduleRef: InternalNgModuleRef<M>;\n  allPlatformModules: NgModuleRef<unknown>[];\n}\n\nexport interface ApplicationBootstrapConfig extends BootstrapConfig {\n  r3Injector: R3Injector;\n  rootComponent: Type<unknown> | undefined;\n}\n\nfunction isApplicationBootstrapConfig(\n  config: ApplicationBootstrapConfig | ModuleBootstrapConfig<unknown>,\n): config is ApplicationBootstrapConfig {\n  return !(config as ModuleBootstrapConfig<unknown>).moduleRef;\n}\n\nexport function bootstrap<M>(\n  moduleBootstrapConfig: ModuleBootstrapConfig<M>,\n): Promise<NgModuleRef<M>>;\nexport function bootstrap(\n  applicationBootstrapConfig: ApplicationBootstrapConfig,\n): Promise<ApplicationRef>;\nexport function bootstrap<M>(\n  config: ModuleBootstrapConfig<M> | ApplicationBootstrapConfig,\n): Promise<ApplicationRef> | Promise<NgModuleRef<M>> {\n  const envInjector = isApplicationBootstrapConfig(config)\n    ? config.r3Injector\n    : config.moduleRef.injector;\n  const ngZone = envInjector.get(NgZone);\n  return ngZone.run(() => {\n    if (isApplicationBootstrapConfig(config)) {\n      config.r3Injector.resolveInjectorInitializers();\n    } else {\n      config.moduleRef.resolveInjectorInitializers();\n    }\n    const exceptionHandler = envInjector.get(ErrorHandler, null);\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      if (exceptionHandler === null) {\n        const errorMessage = isApplicationBootstrapConfig(config)\n          ? 'No `ErrorHandler` found in the Dependency Injection tree.'\n          : 'No ErrorHandler. Is platform module (BrowserModule) included';\n        throw new RuntimeError(\n          RuntimeErrorCode.MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP,\n          errorMessage,\n        );\n      }\n      if (envInjector.get(PROVIDED_ZONELESS) && envI   njector.get(PROVIDED_NG_ZONE)) {\n        throw new RuntimeError(\n          RuntimeErrorCode.PROVIDED_BOTH_ZONE_AND_ZONELESS,\n          'Invalid change detection configuration: ' +\n            'provideZoneChangeDetection and provideExperimentalZonelessChangeDetection cannot be used together.',\n        );\n      }\n    }\n\n    let onErrorSubscription: Subscription;\n    ngZone.runOutsideAngular(() => {\n      onErrorSubscription = ngZone.onError.subscribe({\n        next: (error: any) => {\n          exceptionHandler!.handleError(error);\n        },\n      });\n    });\n\n    // If the whole platform is destroyed, invoke the `destroy` method\n    // for all bootstrapped applications as well.\n    if (isApplicationBootstrapConfig(config)) {\n      const destroyListener = () => envInjector.destroy();\n      const onPlatformDestroyListeners = config.platformInjector.get(PLATFORM_DESTROY_LISTENERS);\n      onPlatformDestroyListeners.add(destroyListener);\n\n      envInjector.onDestroy(() => {\n        onErrorSubscription.unsubscribe();\n        onPlatformDestroyListeners.delete(destroyListener);\n      });\n    } else {\n      const destroyListener = () => config.moduleRef.destroy();\n      const onPlatformDestroyListeners = config.platformInjector.get(PLATFORM_DESTROY_LISTENERS);\n      onPlatformDestroyListeners.add(destroyListener);\n\n      config.moduleRef.onDestroy(() => {\n        remove(config.allPlatformModules, config.moduleRef);\n        onErrorSubscription.unsubscribe();\n        onPlatformDestroyListeners.delete(destroyListener);\n      });\n    }\n\n    return _callAndReportToErrorHandler(exceptionHandler!, ngZone, () => {\n      const initStatus = envInjector.get(ApplicationInitStatus);\n      initStatus.runInitializers();\n\n      return initStatus.donePromise.then(() => {\n        // If the `LOCALE_ID` provider is defined at bootstrap then we set the value for ivy\n        const localeId = envInjector.get(LOCALE_ID, DEFAULT_LOCALE_ID);\n        setLocaleId(localeId || DEFAULT_LOCALE_ID);\n\n        const enableRootComponentBoostrap = envInjector.get(ENABLE_ROOT_COMPONENT_BOOTSTRAP, true);\n        if (!enableRootComponentBoostrap) {\n          if (isApplicationBootstrapConfig(config)) {\n            return envInjector.get(ApplicationRef);\n          }\n\n          config.allPlatformModules.push(config.moduleRef);\n          return config.moduleRef;\n        }\n\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n          const imagePerformanceService = envInjector.get(ImagePerformanceWarning);\n          imagePerformanceService.start();\n        }\n\n        if (isApplicationBootstrapConfig(config)) {\n          const appRef = envInjector.get(ApplicationRef);\n          if (config.rootComponent !== undefined) {\n            appRef.bootstrap(config.rootComponent);\n          }\n          return appRef;\n        } else {\n          moduleDoBootstrap(config.moduleRef, config.allPlatformModules);\n          return config.moduleRef;\n        }\n      });\n    });\n  });\n}\n\nfunction moduleDoBootstrap(\n  moduleRef: InternalNgModuleRef<any>,\n  allPlatformModules: NgModuleRef<unknown>[],\n): void {\n  const appRef = moduleRef.injector.get(ApplicationRef);\n  if (moduleRef._bootstrapComponents.length > 0) {\n    moduleRef._bootstrapComponents.forEach((f) => appRef.bootstrap(f));\n  } else if (moduleRef.instance.ngDoBootstrap) {\n    moduleRef.instance.ngDoBootstrap(appRef);\n  } else {\n    throw new RuntimeError(\n      RuntimeErrorCode.BOOTSTRAP_COMPONENTS_NOT_FOUND,\n      ngDevMode &&\n        `The module ${stringify(moduleRef.instance.constructor)} was bootstrapped, ` +\n          `but it does not declare \"@NgModule.bootstrap\" components nor a \"ngDoBootstrap\" method. ` +\n          `Please define one of these.`,\n    );\n  }\n  allPlatformModules.push(moduleRef);\n}\n\nfunction _callAndReportToErrorHandler(\n  errorHandler: ErrorHandler,\n  ngZone: NgZone,\n  callback: () => any,\n): any {\n  try {\n    const result = callback();\n    if (isPromise(result)) {\n      return result.catch((e: any) => {\n        ngZone.runOutsideAngular(() => errorHandler.handleError(e));\n        // rethrow as the exception handler might not do it\n        throw e;\n      });\n    }\n\n    return result;\n  } catch (e) {\n    ngZone.runOutsideAngular(() => errorHandler.handleError(e));\n    // rethrow as the exception handler might not do it\n    throw e;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {compileNgModuleFactory} from '../application/application_ngmodule_factory_compiler';\nimport {BootstrapOptions, optionsReducer} from '../application/application_ref';\nimport {\n  getNgZoneOptions,\n  internalProvideZoneChangeDetection,\n} from '../change_detection/scheduling/ng_zone_scheduling';\nimport {ChangeDetectionScheduler} from '../change_detection/scheduling/zoneless_scheduling';\nimport {ChangeDetectionSchedulerImpl} from '../change_detection/scheduling/zoneless_scheduling_impl';\nimport {Injectable, Injector} from '../di';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {Type} from '../interface/type';\nimport {CompilerOptions} from '../linker';\nimport {NgModuleFactory, NgModuleRef} from '../linker/ng_module_factory';\nimport {createNgModuleRefWithProviders} from '../render3/ng_module_ref';\nimport {getNgZone, NgZone} from '../zone/ng_zone';\nimport {bootstrap} from './bootstrap';\nimport {PLATFORM_DESTROY_LISTENERS} from './platform_destroy_listeners';\n\n/**\n * The Angular platform is the entry point for Angular on a web page.\n * Each page has exactly one platform. Services (such as reflection) which are common\n * to every Angular application running on the page are bound in its scope.\n * A page's platform is initialized implicitly when a platform is created using a platform\n * factory such as `PlatformBrowser`, or explicitly by calling the `createPlatform()` function.\n *\n * @publicApi\n */\n@Injectable({providedIn: 'platform'})\nexport class PlatformRef {\n  private _modules: NgModuleRef<any>[] = [];\n  private _destroyListeners: Array<() => void> = [];\n  private _destroyed: boolean = false;\n\n  /** @internal */\n  constructor(private _injector: Injector) {}\n\n  /**\n   * Creates an instance of an `@NgModule` for the given platform.\n   *\n   * @deprecated Passing NgModule factories as the `PlatformRef.bootstrapModuleFactory` function\n   *     argument is deprecated. Use the `PlatformRef.bootstrapModule` API instead.\n   */\n  bootstrapModuleFactory<M>(\n    moduleFactory: NgModuleFactory<M>,\n    options?: BootstrapOptions,\n  ): Promise<NgModuleRef<M>> {\n    const scheduleInRootZone = (options as any)?.scheduleInRootZone;\n    const ngZoneFactory = () =>\n      getNgZone(options?.ngZone, {\n        ...getNgZoneOptions({\n          eventCoalescing: options?.ngZoneEventCoalescing,\n          runCoalescing: options?.ngZoneRunCoalescing,\n        }),\n        scheduleInRootZone,\n      });\n    const ignoreChangesOutsideZone = options?.ignoreChangesOutsideZone;\n    const allAppProviders = [\n      internalProvideZoneChangeDetection({\n        ngZoneFactory,\n        ignoreChangesOutsideZone,\n      }),\n      {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl},\n    ];\n    const moduleRef = createNgModuleRefWithProviders(\n      moduleFactory.moduleType,\n      this.injector,\n      allAppProviders,\n    );\n\n    return bootstrap({\n      moduleRef,\n      allPlatformModules: this._modules,\n      platformInjector: this.injector,\n    });\n  }\n\n  /**\n   * Creates an instance of an `@NgModule` for a given platform.\n   *\n   * @usageNotes\n   * ### Simple Example\n   *\n   * ```ts\n   * @NgModule({\n   *   imports: [BrowserModule]\n   * })\n   * class MyModule {}\n   *\n   * let moduleRef = platformBrowser().bootstrapModule(MyModule);\n   * ```\n   *\n   */\n  bootstrapModule<M>(\n    moduleType: Type<M>,\n    compilerOptions:\n      | (CompilerOptions & BootstrapOptions)\n      | Array<CompilerOptions & BootstrapOptions> = [],\n  ): Promise<NgModuleRef<M>> {\n    const options = optionsReducer({}, compilerOptions);\n    return compileNgModuleFactory(this.injector, options, moduleType).then((moduleFactory) =>\n      this.bootstrapModuleFactory(moduleFactory, options),\n    );\n  }\n\n  /**\n   * Registers a listener to be called when the platform is destroyed.\n   */\n  onDestroy(callback: () => void): void {\n    this._destroyListeners.push(callback);\n  }\n\n  /**\n   * Retrieves the platform {@link Injector}, which is the parent injector for\n   * every Angular application on the page and provides singleton providers.\n   */\n  get injector(): Injector {\n    return this._injector;\n  }\n\n  /**\n   * Destroys the current Angular platform and all Angular applications on the page.\n   * Destroys all modules and listeners registered with the platform.\n   */\n  destroy() {\n    if (this._destroyed) {\n      throw new RuntimeError(\n        RuntimeErrorCode.PLATFORM_ALREADY_DESTROYED,\n        ngDevMode && 'The platform has already been destroyed!',\n      );\n    }\n    this._modules.slice().forEach((module) => module.destroy());\n    this._destroyListeners.forEach((listener) => listener());\n\n    const destroyListeners = this._injector.get(PLATFORM_DESTROY_LISTENERS, null);\n    if (destroyListeners) {\n      destroyListeners.forEach((listener) => listener());\n      destroyListeners.clear();\n    }\n\n    this._destroyed = true;\n  }\n\n  /**\n   * Indicates whether this instance was destroyed.\n   */\n  get destroyed() {\n    return this._destroyed;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  publishDefaultGlobalUtils,\n  publishSignalConfiguration,\n} from '../application/application_ref';\nimport {PLATFORM_INITIALIZER} from '../application/application_tokens';\nimport {\n  EnvironmentProviders,\n  InjectionToken,\n  Injector,\n  makeEnvironmentProviders,\n  runInInjectionContext,\n  StaticProvider,\n} from '../di';\nimport {INJECTOR_SCOPE} from '../di/scope';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\n\nimport {PlatformRef} from './platform_ref';\nimport {PLATFORM_DESTROY_LISTENERS} from './platform_destroy_listeners';\n\nlet _platformInjector: Injector | null = null;\n\n/**\n * Internal token to indicate whether having multiple bootstrapped platform should be allowed (only\n * one bootstrapped platform is allowed by default). This token helps to support SSR scenarios.\n */\nexport const ALLOW_MULTIPLE_PLATFORMS = new InjectionToken<boolean>(\n  ngDevMode ? 'AllowMultipleToken' : '',\n);\n\n/**\n * Creates a platform.\n * Platforms must be created on launch using this function.\n *\n * @publicApi\n */\nexport function createPlatform(injector: Injector): PlatformRef {\n  if (_platformInjector && !_platformInjector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {\n    throw new RuntimeError(\n      RuntimeErrorCode.MULTIPLE_PLATFORMS,\n      ngDevMode && 'There can be only one platform. Destroy the previous one to create a new one.',\n    );\n  }\n  publishDefaultGlobalUtils();\n  publishSignalConfiguration();\n  _platformInjector = injector;\n  const platform = injector.get(PlatformRef);\n  runPlatformInitializers(injector);\n  return platform;\n}\n\n/**\n * Creates a factory for a platform. Can be used to provide or override `Providers` specific to\n * your application's runtime needs, such as `PLATFORM_INITIALIZER` and `PLATFORM_ID`.\n * @param parentPlatformFactory Another platform factory to modify. Allows you to compose factories\n * to build up configurations that might be required by different libraries or parts of the\n * application.\n * @param name Identifies the new platform factory.\n * @param providers A set of dependency providers for platforms created with the new factory.\n *\n * @publicApi\n */\nexport function createPlatformFactory(\n  parentPlatformFactory: ((extraProviders?: StaticProvider[]) => PlatformRef) | null,\n  name: string,\n  providers: StaticProvider[] = [],\n): (extraProviders?: StaticProvider[]) => PlatformRef {\n  const desc = `Platform: ${name}`;\n  const marker = new InjectionToken(desc);\n  return (extraProviders: StaticProvider[] = []) => {\n    let platform = getPlatform();\n    if (!platform || platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {\n      const platformProviders: StaticProvider[] = [\n        ...providers,\n        ...extraProviders,\n        {provide: marker, useValue: true},\n      ];\n      if (parentPlatformFactory) {\n        parentPlatformFactory(platformProviders);\n      } else {\n        createPlatform(createPlatformInjector(platformProviders, desc));\n      }\n    }\n    return assertPlatform(marker);\n  };\n}\n\n/**\n * Helper function to create an instance of a platform injector (that maintains the 'platform'\n * scope).\n */\nfunction createPlatformInjector(providers: StaticProvider[] = [], name?: string): Injector {\n  return Injector.create({\n    name,\n    providers: [\n      {provide: INJECTOR_SCOPE, useValue: 'platform'},\n      {provide: PLATFORM_DESTROY_LISTENERS, useValue: new Set([() => (_platformInjector = null)])},\n      ...providers,\n    ],\n  });\n}\n\n/**\n * Checks that there is currently a platform that contains the given token as a provider.\n *\n * @publicApi\n */\nexport function assertPlatform(requiredToken: any): PlatformRef {\n  const platform = getPlatform();\n\n  if (!platform) {\n    throw new RuntimeError(RuntimeErrorCode.PLATFORM_NOT_FOUND, ngDevMode && 'No platform exists!');\n  }\n\n  if (\n    (typeof ngDevMode === 'undefined' || ngDevMode) &&\n    !platform.injector.get(requiredToken, null)\n  ) {\n    throw new RuntimeError(\n      RuntimeErrorCode.MULTIPLE_PLATFORMS,\n      'A platform with a different configuration has been created. Please destroy it first.',\n    );\n  }\n\n  return platform;\n}\n\n/**\n * Returns the current platform.\n *\n * @publicApi\n */\nexport function getPlatform(): PlatformRef | null {\n  return _platformInjector?.get(PlatformRef) ?? null;\n}\n\n/**\n * Destroys the current Angular platform and all Angular applications on the page.\n * Destroys all modules and listeners registered with the platform.\n *\n * @publicApi\n */\nexport function destroyPlatform(): void {\n  getPlatform()?.destroy();\n}\n\n/**\n * The goal of this function is to bootstrap a platform injector,\n * but avoid referencing `PlatformRef` class.\n * This function is needed for bootstrapping a Standalone Component.\n */\nexport function createOrReusePlatformInjector(providers: StaticProvider[] = []): Injector {\n  // If a platform injector already exists, it means that the platform\n  // is already bootstrapped and no additional actions are required.\n  if (_platformInjector) return _platformInjector;\n\n  publishDefaultGlobalUtils();\n  // Otherwise, setup a new platform injector and run platform initializers.\n  const injector = createPlatformInjector(providers);\n  _platformInjector = injector;\n  publishSignalConfiguration();\n  runPlatformInitializers(injector);\n  return injector;\n}\n\n/**\n * @description\n * This function is used to provide initialization functions that will be executed upon\n * initialization of the platform injector.\n *\n * Note that the provided initializer is run in the injection context.\n *\n * Previously, this was achieved using the `PLATFORM_INITIALIZER` token which is now deprecated.\n *\n * @see {@link PLATFORM_INITIALIZER}\n *\n * @publicApi\n */\nexport function providePlatformInitializer(initializerFn: () => void): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: PLATFORM_INITIALIZER,\n      useValue: initializerFn,\n      multi: true,\n    },\n  ]);\n}\n\nfunction runPlatformInitializers(injector: Injector): void {\n  const inits = injector.get(PLATFORM_INITIALIZER, null);\n  runInInjectionContext(injector, () => {\n    inits?.forEach((init) => init());\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ApplicationRef} from '../../application/application_ref';\nimport {ChangeDetectionSchedulerImpl} from './zoneless_scheduling_impl';\nimport {inject} from '../../di/injector_compatibility';\nimport {makeEnvironmentProviders} from '../../di/provider_collection';\nimport {NgZone} from '../../zone/ng_zone';\n\nimport {EnvironmentInjector} from '../../di/r3_injector';\nimport {ENVIRONMENT_INITIALIZER} from '../../di/initializer_token';\nimport {CheckNoChangesMode} from '../../render3/state';\nimport {ErrorHandler} from '../../error_handler';\nimport {checkNoChangesInternal} from '../../render3/instructions/change_detection';\nimport {ZONELESS_ENABLED} from './zoneless_scheduling';\n\n/**\n * Used to periodically verify no expressions have changed after they were checked.\n *\n * @param options Used to configure when the check will execute.\n *   - `interval` will periodically run exhaustive `checkNoChanges` on application views\n *   - `useNgZoneOnStable` will use ZoneJS to determine when change detection might have run\n *      in an application using ZoneJS to drive change detection. When the `NgZone.onStable` would\n *      have emitted, all views attached to the `ApplicationRef` are checked for changes.\n *   - 'exhaustive' means that all views attached to `ApplicationRef` and all the descendants of those views will be\n *     checked for changes (excluding those subtrees which are detached via `ChangeDetectorRef.detach()`).\n *     This is useful because the check that runs after regular change detection does not work for components using `ChangeDetectionStrategy.OnPush`.\n *     This check is will surface any existing errors hidden by `OnPush` components. By default, this check is exhaustive\n *     and will always check all views, regardless of their \"dirty\" state and `ChangeDetectionStrategy`.\n *\n * When the `useNgZoneOnStable` option is `true`, this function will provide its own `NgZone` implementation and needs\n * to come after any other `NgZone` provider, including `provideZoneChangeDetection()` and `provideExperimentalZonelessChangeDetection()`.\n *\n * @experimental\n * @publicApi\n */\nexport function provideExperimentalCheckNoChangesForDebug(options: {\n  interval?: number;\n  useNgZoneOnStable?: boolean;\n  exhaustive?: boolean;\n}) {\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    if (options.interval === undefined && !options.useNgZoneOnStable) {\n      throw new Error('Must provide one of `useNgZoneOnStable` or `interval`');\n    }\n    const checkNoChangesMode =\n      options?.exhaustive === false\n        ? CheckNoChangesMode.OnlyDirtyViews\n        : CheckNoChangesMode.Exhaustive;\n    return makeEnvironmentProviders([\n      options?.useNgZoneOnStable\n        ? {provide: NgZone, useFactory: () => new DebugNgZoneForCheckNoChanges(checkNoChangesMode)}\n        : [],\n      options?.interval !== undefined\n        ? exhaustiveCheckNoChangesInterval(options.interval, checkNoChangesMode)\n        : [],\n      {\n        provide: ENVIRONMENT_INITIALIZER,\n        multi: true,\n        useValue: () => {\n          if (\n            options?.useNgZoneOnStable &&\n            !(inject(NgZone) instanceof DebugNgZoneForCheckNoChanges)\n          ) {\n            throw new Error(\n              '`provideExperimentalCheckNoChangesForDebug` with `useNgZoneOnStable` must be after any other provider for `NgZone`.',\n            );\n          }\n        },\n      },\n    ]);\n  } else {\n    return makeEnvironmentProviders([]);\n  }\n}\n\nexport class DebugNgZoneForCheckNoChanges extends NgZone {\n  private applicationRef?: ApplicationRef;\n  private scheduler?: ChangeDetectionSchedulerImpl;\n  private errorHandler?: ErrorHandler;\n  private readonly injector = inject(EnvironmentInjector);\n\n  constructor(private readonly checkNoChangesMode: CheckNoChangesMode) {\n    const zonelessEnabled = inject(ZONELESS_ENABLED);\n    // Use coalescing to ensure we aren't ever running this check synchronously\n    super({\n      shouldCoalesceEventChangeDetection: true,\n      shouldCoalesceRunChangeDetection: zonelessEnabled,\n    });\n\n    if (zonelessEnabled) {\n      // prevent emits to ensure code doesn't rely on these\n      this.onMicrotaskEmpty.emit = () => {};\n      this.onStable.emit = () => {\n        this.scheduler ||= this.injector.get(ChangeDetectionSchedulerImpl);\n        if (this.scheduler.pendingRenderTaskId || this.scheduler.runningTick) {\n          return;\n        }\n        this.checkApplicationViews();\n      };\n      this.onUnstable.emit = () => {};\n    } else {\n      this.runOutsideAngular(() => {\n        this.onStable.subscribe(() => {\n          this.checkApplicationViews();\n        });\n      });\n    }\n  }\n\n  private checkApplicationViews() {\n    this.applicationRef ||= this.injector.get(ApplicationRef);\n    for (const view of this.applicationRef.allViews) {\n      try {\n        checkNoChangesInternal(view._lView, this.checkNoChangesMode, view.notifyErrorHandler);\n      } catch (e) {\n        this.errorHandler ||= this.injector.get(ErrorHandler);\n        this.errorHandler.handleError(e);\n      }\n    }\n  }\n}\n\nfunction exhaustiveCheckNoChangesInterval(\n  interval: number,\n  checkNoChangesMode: CheckNoChangesMode,\n) {\n  return {\n    provide: ENVIRONMENT_INITIALIZER,\n    multi: true,\n    useFactory: () => {\n      const applicationRef = inject(ApplicationRef);\n      const errorHandler = inject(ErrorHandler);\n      const scheduler = inject(ChangeDetectionSchedulerImpl);\n      const ngZone = inject(NgZone);\n\n      return () => {\n        function scheduleCheckNoChanges() {\n          ngZone.runOutsideAngular(() => {\n            setTimeout(() => {\n              if (applicationRef.destroyed) {\n                return;\n              }\n              if (scheduler.pendingRenderTaskId || scheduler.runningTick) {\n                scheduleCheckNoChanges();\n                return;\n              }\n\n              for (const view of applicationRef.allViews) {\n                try {\n                  checkNoChangesInternal(view._lView, checkNoChangesMode, view.notifyErrorHandler);\n                } catch (e) {\n                  errorHandler.handleError(e);\n                }\n              }\n\n              scheduleCheckNoChanges();\n            }, interval);\n          });\n        }\n        scheduleCheckNoChanges();\n      };\n    },\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {global} from './global';\n\n/**\n * Returns whether Angular is in development mode.\n *\n * By default, this is true, unless `enableProdMode` is invoked prior to calling this method or the\n * application is built using the Angular CLI with the `optimization` option.\n * @see {@link /cli/build ng build}\n *\n * @publicApi\n */\nexport function isDevMode(): boolean {\n  return typeof ngDevMode === 'undefined' || !!ngDevMode;\n}\n\n/**\n * Disable Angular's development mode, which turns off assertions and other\n * checks within the framework.\n *\n * One important assertion this disables verifies that a change detection pass\n * does not result in additional changes to any bindings (also known as\n * unidirectional data flow).\n *\n * Using this method is discouraged as the Angular CLI will set production mode when using the\n * `optimization` option.\n * @see {@link /cli/build ng build}\n *\n * @publicApi\n */\nexport function enableProdMode(): void {\n  // The below check is there so when ngDevMode is set via terser\n  // `global['ngDevMode'] = false;` is also dropped.\n  if (typeof ngDevMode === 'undefined' || ngDevMode) {\n    global['ngDevMode'] = false;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Type} from '../interface/type';\nimport {NgModuleFactory as R3NgModuleFactory} from '../render3/ng_module_ref';\n\nimport {NgModuleFactory} from './ng_module_factory';\nimport {getRegisteredNgModuleType} from './ng_module_registration';\n\n/**\n * Returns the NgModuleFactory with the given id (specified using [@NgModule.id\n * field](api/core/NgModule#id)), if it exists and has been loaded. Factories for NgModules that do\n * not specify an `id` cannot be retrieved. Throws if an NgModule cannot be found.\n * @publicApi\n * @deprecated Use `getNgModuleById` instead.\n */\nexport function getModuleFactory(id: string): NgModuleFactory<any> {\n  const type = getRegisteredNgModuleType(id);\n  if (!type) throw noModuleError(id);\n  return new R3NgModuleFactory(type);\n}\n\n/**\n * Returns the NgModule class with the given id (specified using [@NgModule.id\n * field](api/core/NgModule#id)), if it exists and has been loaded. Classes for NgModules that do\n * not specify an `id` cannot be retrieved. Throws if an NgModule cannot be found.\n * @publicApi\n */\nexport function getNgModuleById<T>(id: string): Type<T> {\n  const type = getRegisteredNgModuleType(id);\n  if (!type) throw noModuleError(id);\n  return type;\n}\n\nfunction noModuleError(id: string): Error {\n  return new Error(`No module with ID ${id} loaded`);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectFlags} from '../di';\nimport {InternalInjectFlags} from '../di/interface/injector';\nimport {TNode, TNodeType} from '../render3/interfaces/node';\nimport {isComponentHost} from '../render3/interfaces/type_checks';\nimport {DECLARATION_COMPONENT_VIEW, LView} from '../render3/interfaces/view';\nimport {getCurrentTNode, getLView} from '../render3/state';\nimport {getComponentLViewByIndex} from '../render3/util/view_utils';\nimport {ViewRef} from '../render3/view_ref';\n\n/**\n * Base class that provides change detection functionality.\n * A change-detection tree collects all views that are to be checked for changes.\n * Use the methods to add and remove views from the tree, initiate change-detection,\n * and explicitly mark views as _dirty_, meaning that they have changed and need to be re-rendered.\n *\n * @see [Using change detection hooks](guide/components/lifecycle#using-change-detection-hooks)\n * @see [Defining custom change detection](guide/components/lifecycle#defining-custom-change-detection)\n *\n * @usageNotes\n *\n * The following examples demonstrate how to modify default change-detection behavior\n * to perform explicit detection when needed.\n *\n * ### Use `markForCheck()` with `CheckOnce` strategy\n *\n * The following example sets the `OnPush` change-detection strategy for a component\n * (`CheckOnce`, rather than the default `CheckAlways`), then forces a second check\n * after an interval.\n *\n * {@example core/ts/change_detect/change-detection.ts region='mark-for-check'}\n *\n * ### Detach change detector to limit how often check occurs\n *\n * The following example defines a component with a large list of read-only data\n * that is expected to change constantly, many times per second.\n * To improve performance, we want to check and update the list\n * less often than the changes actually occur. To do that, we detach\n * the component's change detector and perform an explicit local check every five seconds.\n *\n * {@example core/ts/change_detect/change-detection.ts region='detach'}\n *\n *\n * ### Reattaching a detached component\n *\n * The following example creates a component displaying live data.\n * The component detaches its change detector from the main change detector tree\n * when the `live` property is set to false, and reattaches it when the property\n * becomes true.\n *\n * {@example core/ts/change_detect/change-detection.ts region='reattach'}\n *\n * @publicApi\n */\nexport abstract class ChangeDetectorRef {\n  /**\n   * When a view uses the {@link ChangeDetectionStrategy#OnPush} (checkOnce)\n   * change detection strategy, explicitly marks the view as changed so that\n   * it can be checked again.\n   *\n   * Components are normally marked as dirty (in need of rerendering) when inputs\n   * have changed or events have fired in the view. Call this method to ensure that\n   * a component is checked even if these triggers have not occurred.\n   *\n   * <!-- TODO: Add a link to a chapter on OnPush components -->\n   *\n   */\n  abstract markForCheck(): void;\n\n  /**\n   * Detaches this view from the change-detection tree.\n   * A detached view is  not checked until it is reattached.\n   * Use in combination with `detectChanges()` to implement local change detection checks.\n   *\n   * Detached views are not checked during change detection runs until they are\n   * re-attached, even if they are marked as dirty.\n   *\n   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n   * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->\n   *\n   */\n  abstract detach(): void;\n\n  /**\n   * Checks this view and its children. Use in combination with {@link ChangeDetectorRef#detach}\n   * to implement local change detection checks.\n   *\n   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n   * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->\n   *\n   */\n  abstract detectChanges(): void;\n\n  /**\n   * Checks the change detector and its children, and throws if any changes are detected.\n   *\n   * Use in development mode to verify that running change detection doesn't introduce\n   * other changes. Calling it in production mode is a noop.\n   *\n   * @deprecated This is a test-only API that does not have a place in production interface.\n   * `checkNoChanges` is already part of an `ApplicationRef` tick when the app is running in dev\n   * mode. For more granular `checkNoChanges` validation, use `ComponentFixture`.\n   */\n  abstract checkNoChanges(): void;\n\n  /**\n   * Re-attaches the previously detached view to the change detection tree.\n   * Views are attached to the tree by default.\n   *\n   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n   *\n   */\n  abstract reattach(): void;\n\n  /**\n   * @internal\n   * @nocollapse\n   */\n  static __NG_ELEMENT_ID__: (flags: InjectFlags) => ChangeDetectorRef = injectChangeDetectorRef;\n}\n\n/** Returns a ChangeDetectorRef (a.k.a. a ViewRef) */\nexport function injectChangeDetectorRef(flags: InjectFlags): ChangeDetectorRef {\n  return createViewRef(\n    getCurrentTNode()!,\n    getLView(),\n    (flags & InternalInjectFlags.ForPipe) === InternalInjectFlags.ForPipe,\n  );\n}\n\n/**\n * Creates a ViewRef and stores it on the injector as ChangeDetectorRef (public alias).\n *\n * @param tNode The node that is requesting a ChangeDetectorRef\n * @param lView The view to which the node belongs\n * @param isPipe Whether the view is being injected into a pipe.\n * @returns The ChangeDetectorRef to use\n */\nfunction createViewRef(tNode: TNode, lView: LView, isPipe: boolean): ChangeDetectorRef {\n  if (isComponentHost(tNode) && !isPipe) {\n    // The LView represents the location where the component is declared.\n    // Instead we want the LView for the component View and so we need to look it up.\n    const componentView = getComponentLViewByIndex(tNode.index, lView); // look down\n    return new ViewRef(componentView, componentView);\n  } else if (\n    tNode.type &\n    (TNodeType.AnyRNode | TNodeType.AnyContainer | TNodeType.Icu | TNodeType.LetDeclaration)\n  ) {\n    // The LView represents the location where the injection is requested from.\n    // We need to locate the containing LView (in case where the `lView` is an embedded view)\n    const hostComponentView = lView[DECLARATION_COMPONENT_VIEW]; // look up\n    return new ViewRef(hostComponentView, lView);\n  }\n  return null!;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ChangeDetectorRef} from '../change_detection/change_detector_ref';\n\n/**\n * Represents an Angular view.\n *\n * @see {@link /api/core/ChangeDetectorRef?tab=usage-notes Change detection usage}\n *\n * @publicApi\n */\nexport abstract class ViewRef extends ChangeDetectorRef {\n  /**\n   * Destroys this view and all of the data structures associated with it.\n   */\n  abstract destroy(): void;\n\n  /**\n   * Reports whether this view has been destroyed.\n   * @returns True after the `destroy()` method has been called, false otherwise.\n   */\n  abstract get destroyed(): boolean;\n\n  /**\n   * A lifecycle hook that provides additional developer-defined cleanup\n   * functionality for views.\n   * @param callback A handler function that cleans up developer-defined data\n   * associated with a view. Called when the `destroy()` method is invoked.\n   */\n  abstract onDestroy(callback: Function): void;\n}\n\n/**\n * Represents an Angular view in a view container.\n * An embedded view can be referenced from a component\n * other than the hosting component whose template defines it, or it can be defined\n * independently by a `TemplateRef`.\n *\n * Properties of elements in a view can change, but the structure (number and order) of elements in\n * a view cannot. Change the structure of elements by inserting, moving, or\n * removing nested views in a view container.\n *\n * @see {@link ViewContainerRef}\n *\n * @usageNotes\n *\n * The following template breaks down into two separate `TemplateRef` instances,\n * an outer one and an inner one.\n *\n * ```html\n * Count: {{items.length}}\n * <ul>\n *   <li *ngFor=\"let  item of items\">{{item}}</li>\n * </ul>\n * ```\n *\n * This is the outer `TemplateRef`:\n *\n * ```html\n * Count: {{items.length}}\n * <ul>\n *   <ng-template ngFor let-item [ngForOf]=\"items\"></ng-template>\n * </ul>\n * ```\n *\n * This is the inner `TemplateRef`:\n *\n * ```html\n *   <li>{{item}}</li>\n * ```\n *\n * The outer and inner `TemplateRef` instances are assembled into views as follows:\n *\n * ```html\n * <!-- ViewRef: outer-0 -->\n * Count: 2\n * <ul>\n *   <ng-template view-container-ref></ng-template>\n *   <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->\n *   <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->\n * </ul>\n * <!-- /ViewRef: outer-0 -->\n * ```\n * @publicApi\n */\nexport abstract class EmbeddedViewRef<C> extends ViewRef {\n  /**\n   * The context for this view, inherited from the anchor element.\n   */\n  abstract context: C;\n\n  /**\n   * The root nodes for this embedded view.\n   */\n  abstract get rootNodes(): any[];\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {assertTNodeForLView} from '../render3/assert';\nimport {getLContext} from '../render3/context_discovery';\nimport {CONTAINER_HEADER_OFFSET, LContainer, NATIVE} from '../render3/interfaces/container';\nimport {TElementNode, TNode, TNodeFlags, TNodeType} from '../render3/interfaces/node';\nimport {isComponentHost, isLContainer} from '../render3/interfaces/type_checks';\nimport {\n  DECLARATION_COMPONENT_VIEW,\n  LView,\n  PARENT,\n  T_HOST,\n  TData,\n  TVIEW,\n} from '../render3/interfaces/view';\nimport {\n  getComponent,\n  getContext,\n  getInjectionTokens,\n  getInjector,\n  getListeners,\n  getLocalRefs,\n  getOwningComponent,\n} from '../render3/util/discovery_utils';\nimport {INTERPOLATION_DELIMITER} from '../render3/util/misc_utils';\nimport {renderStringify} from '../render3/util/stringify_utils';\nimport {getComponentLViewByIndex, getNativeByTNodeOrNull} from '../render3/util/view_utils';\nimport {assertDomNode} from '../util/assert';\n\n/**\n * @publicApi\n */\nexport class DebugEventListener {\n  constructor(\n    public name: string,\n    public callback: Function,\n  ) {}\n}\n\n/**\n * @publicApi\n */\nexport function asNativeElements(debugEls: DebugElement[]): any {\n  return debugEls.map((el) => el.nativeElement);\n}\n\n/**\n * @publicApi\n */\nexport class DebugNode {\n  /**\n   * The underlying DOM node.\n   */\n  readonly nativeNode: any;\n\n  constructor(nativeNode: Node) {\n    this.nativeNode = nativeNode;\n  }\n\n  /**\n   * The `DebugElement` parent. Will be `null` if this is the root element.\n   */\n  get parent(): DebugElement | null {\n    const parent = this.nativeNode.parentNode as Element;\n    return parent ? new DebugElement(parent) : null;\n  }\n\n  /**\n   * The host dependency injector. For example, the root element's component instance injector.\n   */\n  get injector(): Injector {\n    return getInjector(this.nativeNode);\n  }\n\n  /**\n   * The element's own component instance, if it has one.\n   */\n  get componentInstance(): any {\n    const nativeElement = this.nativeNode;\n    return (\n      nativeElement && (getComponent(nativeElement as Element) || getOwningComponent(nativeElement))\n    );\n  }\n\n  /**\n   * An object that provides parent context for this element. Often an ancestor component instance\n   * that governs this element.\n   *\n   * When an element is repeated within *ngFor, the context is an `NgForOf` whose `$implicit`\n   * property is the value of the row instance value. For example, the `hero` in `*ngFor=\"let hero\n   * of heroes\"`.\n   */\n  get context(): any {\n    return getComponent(this.nativeNode as Element) || getContext(this.nativeNode as Element);\n  }\n\n  /**\n   * The callbacks attached to the component's @Output properties and/or the element's event\n   * properties.\n   */\n  get listeners(): DebugEventListener[] {\n    return getListeners(this.nativeNode as Element).filter((listener) => listener.type === 'dom');\n  }\n\n  /**\n   * Dictionary of objects associated with template local variables (e.g. #foo), keyed by the local\n   * variable name.\n   */\n  get references(): {[key: string]: any} {\n    return getLocalRefs(this.nativeNode);\n  }\n\n  /**\n   * This component's injector lookup tokens. Includes the component itself plus the tokens that the\n   * component lists in its providers metadata.\n   */\n  get providerTokens(): any[] {\n    return getInjectionTokens(this.nativeNode as Element);\n  }\n}\n\n/**\n * @publicApi\n *\n * @see [Component testing scenarios](guide/testing/components-scenarios)\n * @see [Basics of testing components](guide/testing/components-basics)\n * @see [Testing utility APIs](guide/testing/utility-apis)\n */\nexport class DebugElement extends DebugNode {\n  constructor(nativeNode: Element) {\n    ngDevMode && assertDomNode(nativeNode);\n    super(nativeNode);\n  }\n\n  /**\n   * The underlying DOM element at the root of the component.\n   */\n  get nativeElement(): any {\n    return this.nativeNode.nodeType == Node.ELEMENT_NODE ? (this.nativeNode as Element) : null;\n  }\n\n  /**\n   * The element tag name, if it is an element.\n   */\n  get name(): string {\n    const context = getLContext(this.nativeNode)!;\n    const lView = context ? context.lView : null;\n\n    if (lView !== null) {\n      const tData = lView[TVIEW].data;\n      const tNode = tData[context.nodeIndex] as TNode;\n      return tNode.value!;\n    } else {\n      return this.nativeNode.nodeName;\n    }\n  }\n\n  /**\n   *  Gets a map of property names to property values for an element.\n   *\n   *  This map includes:\n   *  - Regular property bindings (e.g. `[id]=\"id\"`)\n   *  - Host property bindings (e.g. `host: { '[id]': \"id\" }`)\n   *  - Interpolated property bindings (e.g. `id=\"{{ value }}\")\n   *\n   *  It does not include:\n   *  - input property bindings (e.g. `[myCustomInput]=\"value\"`)\n   *  - attribute bindings (e.g. `[attr.role]=\"menu\"`)\n   */\n  get properties(): {[key: string]: any} {\n    const context = getLContext(this.nativeNode)!;\n    const lView = context ? context.lView : null;\n\n    if (lView === null) {\n      return {};\n    }\n\n    const tData = lView[TVIEW].data;\n    const tNode = tData[context.nodeIndex] as TNode;\n\n    const properties: {[key: string]: string} = {};\n    // Collect properties from the DOM.\n    copyDomProperties(this.nativeElement, properties);\n    // Collect properties from the bindings. This is needed for animation renderer which has\n    // synthetic properties which don't get reflected into the DOM.\n    collectPropertyBindings(properties, tNode, lView, tData);\n    return properties;\n  }\n\n  /**\n   *  A map of attribute names to attribute values for an element.\n   */\n  // TODO: replace null by undefined in the return type\n  get attributes(): {[key: string]: string | null} {\n    const attributes: {[key: string]: string | null} = {};\n    const element = this.nativeElement as Element | undefined;\n\n    if (!element) {\n      return attributes;\n    }\n\n    const context = getLContext(element)!;\n    const lView = context ? context.lView : null;\n\n    if (lView === null) {\n      return {};\n    }\n\n    const tNodeAttrs = (lView[TVIEW].data[context.nodeIndex] as TNode).attrs;\n    const lowercaseTNodeAttrs: string[] = [];\n\n    // For debug nodes we take the element's attribute directly from the DOM since it allows us\n    // to account for ones that weren't set via bindings (e.g. ViewEngine keeps track of the ones\n    // that are set through `Renderer2`). The problem is that the browser will lowercase all names,\n    // however since we have the attributes already on the TNode, we can preserve the case by going\n    // through them once, adding them to the `attributes` map and putting their lower-cased name\n    // into an array. Afterwards when we're going through the native DOM attributes, we can check\n    // whether we haven't run into an attribute already through the TNode.\n    if (tNodeAttrs) {\n      let i = 0;\n      while (i < tNodeAttrs.length) {\n        const attrName = tNodeAttrs[i];\n\n        // Stop as soon as we hit a marker. We only care about the regular attributes. Everything\n        // else will be handled below when we read the final attributes off the DOM.\n        if (typeof attrName !== 'string') break;\n\n        const attrValue = tNodeAttrs[i + 1];\n        attributes[attrName] = attrValue as string;\n        lowercaseTNodeAttrs.push(attrName.toLowerCase());\n\n        i += 2;\n      }\n    }\n\n    for (const attr of element.attributes) {\n      // Make sure that we don't assign the same attribute both in its\n      // case-sensitive form and the lower-cased one from the browser.\n      if (!lowercaseTNodeAttrs.includes(attr.name)) {\n        attributes[attr.name] = attr.value;\n      }\n    }\n\n    return attributes;\n  }\n\n  /**\n   * The inline styles of the DOM element.\n   */\n  // TODO: replace null by undefined in the return type\n  get styles(): {[key: string]: string | null} {\n    const element = this.nativeElement as HTMLElement | null;\n    return (element?.style ?? {}) as {[key: string]: string | null};\n  }\n\n  /**\n   * A map containing the class names on the element as keys.\n   *\n   * This map is derived from the `className` property of the DOM element.\n   *\n   * Note: The values of this object will always be `true`. The class key will not appear in the KV\n   * object if it does not exist on the element.\n   *\n   * @see [Element.className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className)\n   */\n  get classes(): {[key: string]: boolean} {\n    const result: {[key: string]: boolean} = {};\n    const element = this.nativeElement as HTMLElement | SVGElement;\n\n    // SVG elements return an `SVGAnimatedString` instead of a plain string for the `className`.\n    const className = element.className as string | SVGAnimatedString;\n    const classes =\n      typeof className !== 'string' ? className.baseVal.split(' ') : className.split(' ');\n\n    classes.forEach((value: string) => (result[value] = true));\n\n    return result;\n  }\n\n  /**\n   * The `childNodes` of the DOM element as a `DebugNode` array.\n   *\n   * @see [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes)\n   */\n  get childNodes(): DebugNode[] {\n    const childNodes = this.nativeNode.childNodes;\n    const children: DebugNode[] = [];\n    for (let i = 0; i < childNodes.length; i++) {\n      const element = childNodes[i];\n      children.push(getDebugNode(element)!);\n    }\n    return children;\n  }\n\n  /**\n   * The immediate `DebugElement` children. Walk the tree by descending through `children`.\n   */\n  get children(): DebugElement[] {\n    const nativeElement = this.nativeElement;\n    if (!nativeElement) return [];\n    const childNodes = nativeElement.children;\n    const children: DebugElement[] = [];\n    for (let i = 0; i < childNodes.length; i++) {\n      const element = childNodes[i];\n      children.push(getDebugNode(element) as DebugElement);\n    }\n    return children;\n  }\n\n  /**\n   * @returns the first `DebugElement` that matches the predicate at any depth in the subtree.\n   */\n  query(predicate: Predicate<DebugElement>): DebugElement {\n    const results = this.queryAll(predicate);\n    return results[0] || null;\n  }\n\n  /**\n   * @returns All `DebugElement` matches for the predicate at any depth in the subtree.\n   */\n  queryAll(predicate: Predicate<DebugElement>): DebugElement[] {\n    const matches: DebugElement[] = [];\n    _queryAll(this, predicate, matches, true);\n    return matches;\n  }\n\n  /**\n   * @returns All `DebugNode` matches for the predicate at any depth in the subtree.\n   */\n  queryAllNodes(predicate: Predicate<DebugNode>): DebugNode[] {\n    const matches: DebugNode[] = [];\n    _queryAll(this, predicate, matches, false);\n    return matches;\n  }\n\n  /**\n   * Triggers the event by its name if there is a corresponding listener in the element's\n   * `listeners` collection.\n   *\n   * If the event lacks a listener or there's some other problem, consider\n   * calling `nativeElement.dispatchEvent(eventObject)`.\n   *\n   * @param eventName The name of the event to trigger\n   * @param eventObj The _event object_ expected by the handler\n   *\n   * @see [Testing components scenarios](guide/testing/components-scenarios#trigger-event-handler)\n   */\n  triggerEventHandler(eventName: string, eventObj?: any): void {\n    const node = this.nativeNode as any;\n    const invokedListeners: Function[] = [];\n\n    this.listeners.forEach((listener) => {\n      if (listener.name === eventName) {\n        const callback = listener.callback;\n        callback.call(node, eventObj);\n        invokedListeners.push(callback);\n      }\n    });\n\n    // We need to check whether `eventListeners` exists, because it's something\n    // that Zone.js only adds to `EventTarget` in browser environments.\n    if (typeof node.eventListeners === 'function') {\n      // Note that in Ivy we wrap event listeners with a call to `event.preventDefault` in some\n      // cases. We use '__ngUnwrap__' as a special token that gives us access to the actual event\n      // listener.\n      node.eventListeners(eventName).forEach((listener: Function) => {\n        // In order to ensure that we can detect the special __ngUnwrap__ token described above, we\n        // use `toString` on the listener and see if it contains the token. We use this approach to\n        // ensure that it still worked with compiled code since it cannot remove or rename string\n        // literals. We also considered using a special function name (i.e. if(listener.name ===\n        // special)) but that was more cumbersome and we were also concerned the compiled code could\n        // strip the name, turning the condition in to (\"\" === \"\") and always returning true.\n        if (listener.toString().indexOf('__ngUnwrap__') !== -1) {\n          const unwrappedListener = listener('__ngUnwrap__');\n          return (\n            invokedListeners.indexOf(unwrappedListener) === -1 &&\n            unwrappedListener.call(node, eventObj)\n          );\n        }\n      });\n    }\n  }\n}\n\nfunction copyDomProperties(element: Element | null, properties: {[name: string]: string}): void {\n  if (element) {\n    // Skip own properties (as those are patched)\n    let obj = Object.getPrototypeOf(element);\n    const NodePrototype: any = Node.prototype;\n    while (obj !== null && obj !== NodePrototype) {\n      const descriptors = Object.getOwnPropertyDescriptors(obj);\n      for (let key in descriptors) {\n        if (!key.startsWith('__') && !key.startsWith('on')) {\n          // don't include properties starting with `__` and `on`.\n          // `__` are patched values which should not be included.\n          // `on` are listeners which also should not be included.\n          const value = (element as any)[key];\n          if (isPrimitiveValue(value)) {\n            properties[key] = value;\n          }\n        }\n      }\n      obj = Object.getPrototypeOf(obj);\n    }\n  }\n}\n\nfunction isPrimitiveValue(value: any): boolean {\n  return (\n    typeof value === 'string' ||\n    typeof value === 'boolean' ||\n    typeof value === 'number' ||\n    value === null\n  );\n}\n\n/**\n * Walk the TNode tree to find matches for the predicate.\n *\n * @param parentElement the element from which the walk is started\n * @param predicate the predicate to match\n * @param matches the list of positive matches\n * @param elementsOnly whether only elements should be searched\n */\nfunction _queryAll(\n  parentElement: DebugElement,\n  predicate: Predicate<DebugElement>,\n  matches: DebugElement[],\n  elementsOnly: true,\n): void;\nfunction _queryAll(\n  parentElement: DebugElement,\n  predicate: Predicate<DebugNode>,\n  matches: DebugNode[],\n  elementsOnly: false,\n): void;\nfunction _queryAll(\n  parentElement: DebugElement,\n  predicate: Predicate<DebugElement> | Predicate<DebugNode>,\n  matches: DebugElement[] | DebugNode[],\n  elementsOnly: boolean,\n) {\n  const context = getLContext(parentElement.nativeNode)!;\n  const lView = context ? context.lView : null;\n  if (lView !== null) {\n    const parentTNode = lView[TVIEW].data[context.nodeIndex] as TNode;\n    _queryNodeChildren(\n      parentTNode,\n      lView,\n      predicate,\n      matches,\n      elementsOnly,\n      parentElement.nativeNode,\n    );\n  } else {\n    // If the context is null, then `parentElement` was either created with Renderer2 or native DOM\n    // APIs.\n    _queryNativeNodeDescendants(parentElement.nativeNode, predicate, matches, elementsOnly);\n  }\n}\n\n/**\n * Recursively match the current TNode against the predicate, and goes on with the next ones.\n *\n * @param tNode the current TNode\n * @param lView the LView of this TNode\n * @param predicate the predicate to match\n * @param matches the list of positive matches\n * @param elementsOnly whether only elements should be searched\n * @param rootNativeNode the root native node on which predicate should not be matched\n */\nfunction _queryNodeChildren(\n  tNode: TNode,\n  lView: LView,\n  predicate: Predicate<DebugElement> | Predicate<DebugNode>,\n  matches: DebugElement[] | DebugNode[],\n  elementsOnly: boolean,\n  rootNativeNode: any,\n) {\n  ngDevMode && assertTNodeForLView(tNode, lView);\n  const nativeNode = getNativeByTNodeOrNull(tNode, lView);\n  // For each type of TNode, specific logic is executed.\n  if (tNode.type & (TNodeType.AnyRNode | TNodeType.ElementContainer)) {\n    // Case 1: the TNode is an element\n    // The native node has to be checked.\n    _addQueryMatch(nativeNode, predicate, matches, elementsOnly, rootNativeNode);\n    if (isComponentHost(tNode)) {\n      // If the element is the host of a component, then all nodes in its view have to be processed.\n      // Note: the component's content (tNode.child) will be processed from the insertion points.\n      const componentView = getComponentLViewByIndex(tNode.index, lView);\n      if (componentView && componentView[TVIEW].firstChild) {\n        _queryNodeChildren(\n          componentView[TVIEW].firstChild!,\n          componentView,\n          predicate,\n          matches,\n          elementsOnly,\n          rootNativeNode,\n        );\n      }\n    } else {\n      if (tNode.child) {\n        // Otherwise, its children have to be processed.\n        _queryNodeChildren(tNode.child, lView, predicate, matches, elementsOnly, rootNativeNode);\n      }\n\n      // We also have to query the DOM directly in order to catch elements inserted through\n      // Renderer2. Note that this is __not__ optimal, because we're walking similar trees multiple\n      // times. ViewEngine could do it more efficiently, because all the insertions go through\n      // Renderer2, however that's not the case in Ivy. This approach is being used because:\n      // 1. Matching the ViewEngine behavior would mean potentially introducing a dependency\n      //    from `Renderer2` to Ivy which could bring Ivy code into ViewEngine.\n      // 2. It allows us to capture nodes that were inserted directly via the DOM.\n      nativeNode && _queryNativeNodeDescendants(nativeNode, predicate, matches, elementsOnly);\n    }\n    // In all cases, if a dynamic container exists for this node, each view inside it has to be\n    // processed.\n    const nodeOrContainer = lView[tNode.index];\n    if (isLContainer(nodeOrContainer)) {\n      _queryNodeChildrenInContainer(\n        nodeOrContainer,\n        predicate,\n        matches,\n        elementsOnly,\n        rootNativeNode,\n      );\n    }\n  } else if (tNode.type & TNodeType.Container) {\n    // Case 2: the TNode is a container\n    // The native node has to be checked.\n    const lContainer = lView[tNode.index];\n    _addQueryMatch(lContainer[NATIVE], predicate, matches, elementsOnly, rootNativeNode);\n    // Each view inside the container has to be processed.\n    _queryNodeChildrenInContainer(lContainer, predicate, matches, elementsOnly, rootNativeNode);\n  } else if (tNode.type & TNodeType.Projection) {\n    // Case 3: the TNode is a projection insertion point (i.e. a <ng-content>).\n    // The nodes projected at this location all need to be processed.\n    const componentView = lView![DECLARATION_COMPONENT_VIEW];\n    const componentHost = componentView[T_HOST] as TElementNode;\n    const head: TNode | null = (componentHost.projection as (TNode | null)[])[\n      tNode.projection as number\n    ];\n\n    if (Array.isArray(head)) {\n      for (let nativeNode of head) {\n        _addQueryMatch(nativeNode, predicate, matches, elementsOnly, rootNativeNode);\n      }\n    } else if (head) {\n      const nextLView = componentView[PARENT]! as LView;\n      const nextTNode = nextLView[TVIEW].data[head.index] as TNode;\n      _queryNodeChildren(nextTNode, nextLView, predicate, matches, elementsOnly, rootNativeNode);\n    }\n  } else if (tNode.child) {\n    // Case 4: the TNode is a view.\n    _queryNodeChildren(tNode.child, lView, predicate, matches, elementsOnly, rootNativeNode);\n  }\n\n  // We don't want to go to the next sibling of the root node.\n  if (rootNativeNode !== nativeNode) {\n    // To determine the next node to be processed, we need to use the next or the projectionNext\n    // link, depending on whether the current node has been projected.\n    const nextTNode = tNode.flags & TNodeFlags.isProjected ? tNode.projectionNext : tNode.next;\n    if (nextTNode) {\n      _queryNodeChildren(nextTNode, lView, predicate, matches, elementsOnly, rootNativeNode);\n    }\n  }\n}\n\n/**\n * Process all TNodes in a given container.\n *\n * @param lContainer the container to be processed\n * @param predicate the predicate to match\n * @param matches the list of positive matches\n * @param elementsOnly whether only elements should be searched\n * @param rootNativeNode the root native node on which predicate should not be matched\n */\nfunction _queryNodeChildrenInContainer(\n  lContainer: LContainer,\n  predicate: Predicate<DebugElement> | Predicate<DebugNode>,\n  matches: DebugElement[] | DebugNode[],\n  elementsOnly: boolean,\n  rootNativeNode: any,\n) {\n  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {\n    const childView = lContainer[i] as LView;\n    const firstChild = childView[TVIEW].firstChild;\n    if (firstChild) {\n      _queryNodeChildren(firstChild, childView, predicate, matches, elementsOnly, rootNativeNode);\n    }\n  }\n}\n\n/**\n * Match the current native node against the predicate.\n *\n * @param nativeNode the current native node\n * @param predicate the predicate to match\n * @param matches the list of positive matches\n * @param elementsOnly whether only elements should be searched\n * @param rootNativeNode the root native node on which predicate should not be matched\n */\nfunction _addQueryMatch(\n  nativeNode: any,\n  predicate: Predicate<DebugElement> | Predicate<DebugNode>,\n  matches: DebugElement[] | DebugNode[],\n  elementsOnly: boolean,\n  rootNativeNode: any,\n) {\n  if (rootNativeNode !== nativeNode) {\n    const debugNode = getDebugNode(nativeNode);\n    if (!debugNode) {\n      return;\n    }\n    // Type of the \"predicate and \"matches\" array are set based on the value of\n    // the \"elementsOnly\" parameter. TypeScript is not able to properly infer these\n    // types with generics, so we manually cast the parameters accordingly.\n    if (\n      elementsOnly &&\n      debugNode instanceof DebugElement &&\n      predicate(debugNode) &&\n      matches.indexOf(debugNode) === -1\n    ) {\n      matches.push(debugNode);\n    } else if (\n      !elementsOnly &&\n      (predicate as Predicate<DebugNode>)(debugNode) &&\n      (matches as DebugNode[]).indexOf(debugNode) === -1\n    ) {\n      (matches as DebugNode[]).push(debugNode);\n    }\n  }\n}\n\n/**\n * Match all the descendants of a DOM node against a predicate.\n *\n * @param nativeNode the current native node\n * @param predicate the predicate to match\n * @param matches the list where matches are stored\n * @param elementsOnly whether only elements should be searched\n */\nfunction _queryNativeNodeDescendants(\n  parentNode: any,\n  predicate: Predicate<DebugElement> | Predicate<DebugNode>,\n  matches: DebugElement[] | DebugNode[],\n  elementsOnly: boolean,\n) {\n  const nodes = parentNode.childNodes;\n  const length = nodes.length;\n\n  for (let i = 0; i < length; i++) {\n    const node = nodes[i];\n    const debugNode = getDebugNode(node);\n\n    if (debugNode) {\n      if (\n        elementsOnly &&\n        debugNode instanceof DebugElement &&\n        predicate(debugNode) &&\n        matches.indexOf(debugNode) === -1\n      ) {\n        matches.push(debugNode);\n      } else if (\n        !elementsOnly &&\n        (predicate as Predicate<DebugNode>)(debugNode) &&\n        (matches as DebugNode[]).indexOf(debugNode) === -1\n      ) {\n        (matches as DebugNode[]).push(debugNode);\n      }\n\n      _queryNativeNodeDescendants(node, predicate, matches, elementsOnly);\n    }\n  }\n}\n\n/**\n * Iterates through the property bindings for a given node and generates\n * a map of property names to values. This map only contains property bindings\n * defined in templates, not in host bindings.\n */\nfunction collectPropertyBindings(\n  properties: {[key: string]: string},\n  tNode: TNode,\n  lView: LView,\n  tData: TData,\n): void {\n  let bindingIndexes = tNode.propertyBindings;\n\n  if (bindingIndexes !== null) {\n    for (let i = 0; i < bindingIndexes.length; i++) {\n      const bindingIndex = bindingIndexes[i];\n      const propMetadata = tData[bindingIndex] as string;\n      const metadataParts = propMetadata.split(INTERPOLATION_DELIMITER);\n      const propertyName = metadataParts[0];\n      if (metadataParts.length > 1) {\n        let value = metadataParts[1];\n        for (let j = 1; j < metadataParts.length - 1; j++) {\n          value += renderStringify(lView[bindingIndex + j - 1]) + metadataParts[j + 1];\n        }\n        properties[propertyName] = value;\n      } else {\n        properties[propertyName] = lView[bindingIndex];\n      }\n    }\n  }\n}\n\n// Need to keep the nodes in a global Map so that multiple angular apps are supported.\nconst _nativeNodeToDebugNode = new Map<any, DebugNode>();\n\nconst NG_DEBUG_PROPERTY = '__ng_debug__';\n\n/**\n * @publicApi\n */\nexport function getDebugNode(nativeNode: any): DebugNode | null {\n  if (nativeNode instanceof Node) {\n    if (!nativeNode.hasOwnProperty(NG_DEBUG_PROPERTY)) {\n      (nativeNode as any)[NG_DEBUG_PROPERTY] =\n        nativeNode.nodeType == Node.ELEMENT_NODE\n          ? new DebugElement(nativeNode as Element)\n          : new DebugNode(nativeNode);\n    }\n    return (nativeNode as any)[NG_DEBUG_PROPERTY];\n  }\n  return null;\n}\n\nexport function getAllDebugNodes(): DebugNode[] {\n  return Array.from(_nativeNodeToDebugNode.values());\n}\n\nexport function indexDebugNode(node: DebugNode) {\n  _nativeNodeToDebugNode.set(node.nativeNode, node);\n}\n\nexport function removeDebugNodeFromIndex(node: DebugNode) {\n  _nativeNodeToDebugNode.delete(node.nativeNode);\n}\n\n/**\n * A boolean-valued function over a value, possibly including context information\n * regarding that value's position in an array.\n *\n * @publicApi\n */\nexport type Predicate<T> = (value: T) => boolean;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {Writable} from '../../interface/type';\nimport {isListLikeIterable, iterateListLike} from '../../util/iterable';\nimport {stringify} from '../../util/stringify';\n\nimport type {\n  IterableChangeRecord,\n  IterableChanges,\n  IterableDiffer,\n  IterableDifferFactory,\n  NgIterable,\n  TrackByFunction,\n} from './iterable_differs';\n\nexport class DefaultIterableDifferFactory implements IterableDifferFactory {\n  constructor() {}\n  supports(obj: Object | null | undefined): boolean {\n    return isListLikeIterable(obj);\n  }\n\n  create<V>(trackByFn?: TrackByFunction<V>): DefaultIterableDiffer<V> {\n    return new DefaultIterableDiffer<V>(trackByFn);\n  }\n}\n\nconst trackByIdentity = (index: number, item: any) => item;\n\n/**\n * @deprecated v4.0.0 - Should not be part of public API.\n * @publicApi\n */\nexport class DefaultIterableDiffer<V> implements IterableDiffer<V>, IterableChanges<V> {\n  public readonly length: number = 0;\n  // TODO: confirm the usage of `collection` as it's unused, readonly and on a non public API.\n  public readonly collection!: V[] | Iterable<V> | null;\n  // Keeps track of the used records at any point in time (during & across `_check()` calls)\n  private _linkedRecords: _DuplicateMap<V> | null = null;\n  // Keeps track of the removed records at any point in time during `_check()` calls.\n  private _unlinkedRecords: _DuplicateMap<V> | null = null;\n  private _previousItHead: IterableChangeRecord_<V> | null = null;\n  private _itHead: IterableChangeRecord_<V> | null = null;\n  private _itTail: IterableChangeRecord_<V> | null = null;\n  private _additionsHead: IterableChangeRecord_<V> | null = null;\n  private _additionsTail: IterableChangeRecord_<V> | null = null;\n  private _movesHead: IterableChangeRecord_<V> | null = null;\n  private _movesTail: IterableChangeRecord_<V> | null = null;\n  private _removalsHead: IterableChangeRecord_<V> | null = null;\n  private _removalsTail: IterableChangeRecord_<V> | null = null;\n  // Keeps track of records where custom track by is the same, but item identity has changed\n  private _identityChangesHead: IterableChangeRecord_<V> | null = null;\n  private _identityChangesTail: IterableChangeRecord_<V> | null = null;\n  private _trackByFn: TrackByFunction<V>;\n\n  constructor(trackByFn?: TrackByFunction<V>) {\n    this._trackByFn = trackByFn || trackByIdentity;\n  }\n\n  forEachItem(fn: (record: IterableChangeRecord_<V>) => void) {\n    let record: IterableChangeRecord_<V> | null;\n    for (record = this._itHead; record !== null; record = record._next) {\n      fn(record);\n    }\n  }\n\n  forEachOperation(\n    fn: (\n      item: IterableChangeRecord<V>,\n      previousIndex: number | null,\n      currentIndex: number | null,\n    ) => void,\n  ) {\n    let nextIt = this._itHead;\n    let nextRemove = this._removalsHead;\n    let addRemoveOffset = 0;\n    let moveOffsets: number[] | null = null;\n    while (nextIt || nextRemove) {\n      // Figure out wh   ich is the next record to process\n      // Order: remove, add, move\n      const record: IterableChangeRecord<V> =\n        !nextRemove ||\n        (nextIt &&\n          nextIt.currentIndex! < getPreviousIndex(nextRemove, addRemoveOffset, moveOffsets))\n          ? nextIt!\n          : nextRemove;\n      const adjPreviousIndex = getPreviousIndex(record, addRemoveOffset, moveOffsets);\n      const currentIndex = record.currentIndex;\n\n      // consume the item, and adjust the addRemoveOffset and update moveDistance if necessary\n      if (record === nextRemove) {\n        addRemoveOffset--;\n        nextRemove = nextRemove._nextRemoved;\n      } else {\n        nextIt = nextIt!._next;\n        if (record.previousIndex == null) {\n          addRemoveOffset++;\n        } else {\n          // INVARIANT:  currentIndex < previousIndex\n          if (!moveOffsets) moveOffsets = [];\n          const localMovePreviousIndex = adjPreviousIndex - addRemoveOffset;\n          const localCurrentIndex = currentIndex! - addRemoveOffset;\n          if (localMovePreviousIndex != localCurrentIndex) {\n            for (let i = 0; i < localMovePreviousIndex; i++) {\n              const offset = i < moveOffsets.length ? moveOffsets[i] : (moveOffsets[i] = 0);\n              const index = offset + i;\n              if (localCurrentIndex <= index && index < localMovePreviousIndex) {\n                moveOffsets[i] = offset + 1;\n              }\n            }\n            const previousIndex = record.previousIndex;\n            moveOffsets[previousIndex] = localCurrentIndex - localMovePreviousIndex;\n          }\n        }\n      }\n\n      if (adjPreviousIndex !== currentIndex) {\n        fn(record, adjPreviousIndex, currentIndex);\n      }\n    }\n  }\n\n  forEachPreviousItem(fn: (record: IterableChangeRecord_<V>) => void) {\n    let record: IterableChangeRecord_<V> | null;\n    for (record = this._previousItHead; record !== null; record = record._nextPrevious) {\n      fn(record);\n    }\n  }\n\n  forEachAddedItem(fn: (record: IterableChangeRecord_<V>) => void) {\n    let record: IterableChangeRecord_<V> | null;\n    for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n      fn(record);\n    }\n  }\n\n  forEachMovedItem(fn: (record: IterableChangeRecord_<V>) => void) {\n    let record: IterableChangeRecord_<V> | null;\n    for (record = this._movesHead; record !== null; record = record._nextMoved) {\n      fn(record);\n    }\n  }\n\n  forEachRemovedItem(fn: (record: IterableChangeRecord_<V>) => void) {\n    let record: IterableChangeRecord_<V> | null;\n    for (record = this._removalsHead; record !== null; record = record._nextRemoved) {\n      fn(record);\n    }\n  }\n\n  forEachIdentityChange(fn: (record: IterableChangeRecord_<V>) => void) {\n    let record: IterableChangeRecord_<V> | null;\n    for (record = this._identityChangesHead; record !== null; record = record._nextIdentityChange) {\n      fn(record);\n    }\n  }\n\n  diff(collection: NgIterable<V> | null | undefined): DefaultIterableDiffer<V> | null {\n    if (collection == null) collection = [];\n    if (!isListLikeIterable(collection)) {\n      throw new RuntimeError(\n        RuntimeErrorCode.INVALID_DIFFER_INPUT,\n        ngDevMode &&\n          `Error trying to diff '${stringify(collection)}'. Only arrays and iterables are allowed`,\n      );\n    }\n\n    if (this.check(collection)) {\n      return this;\n    } else {\n      return null;\n    }\n  }\n\n  onDestroy() {}\n\n  check(collection: NgIterable<V>): boolean {\n    this._reset();\n\n    let record: IterableChangeRecord_<V> | null = this._itHead;\n    let mayBeDirty: boolean = false;\n    let index: number;\n    let item: V;\n    let itemTrackBy: any;\n    if (Array.isArray(collection)) {\n      (this as Writable<this>).length = collection.length;\n\n      for (let index = 0; index < this.length; index++) {\n        item = collection[index];\n        itemTrackBy = this._trackByFn(index, item);\n        if (record === null || !Object.is(record.trackById, itemTrackBy)) {\n          record = this._mismatch(record, item, itemTrackBy, index);\n          mayBeDirty = true;\n        } else {\n          if (mayBeDirty) {\n            // TODO(misko): can we limit this to duplicates only?\n            record = this._verifyReinsertion(record, item, itemTrackBy, index);\n          }\n          if (!Object.is(record.item, item)) this._addIdentityChange(record, item);\n        }\n\n        record = record._next;\n      }\n    } else {\n      index = 0;\n      iterateListLike(collection, (item: V) => {\n        itemTrackBy = this._trackByFn(index, item);\n        if (record === null || !Object.is(record.trackById, itemTrackBy)) {\n          record = this._mismatch(record, item, itemTrackBy, index);\n          mayBeDirty = true;\n        } else {\n          if (mayBeDirty) {\n            // TODO(misko): can we limit this to duplicates only?\n            record = this._verifyReinsertion(record, item, itemTrackBy, index);\n          }\n          if (!Object.is(record.item, item)) this._addIdentityChange(record, item);\n        }\n        record = record._next;\n        index++;\n      });\n      (this as Writable<this>).length = index;\n    }\n\n    this._truncate(record);\n    (this as Writable<this>).collection = collection;\n    return this.isDirty;\n  }\n\n  /* CollectionChanges is considered dirty if it has any additions, moves, removals, or identity\n   * changes.\n   */\n  get isDirty(): boolean {\n    return (\n      this._additionsHead !== null ||\n      this._movesHead !== null ||\n      this._removalsHead !== null ||\n      this._identityChangesHead !== null\n    );\n  }\n\n  /**\n   * Reset the state of the change objects to show no changes. This means set previousKey to\n   * currentKey, and clear all of the queues (additions, moves, removals).\n   * Set the previousIndexes of moved and added items to their currentIndexes\n   * Reset the list of additions, moves and removals\n   *\n   * @internal\n   */\n  _reset() {\n    if (this.isDirty) {\n      let record: IterableChangeRecord_<V> | null;\n\n      for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {\n        record._nextPrevious = record._next;\n      }\n\n      for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n        record.previousIndex = record.currentIndex;\n      }\n      this._additionsHead = this._additionsTail = null;\n\n      for (record = this._movesHead; record !== null; record = record._nextMoved) {\n        record.previousIndex = record.currentIndex;\n      }\n      this._movesHead = this._movesTail = null;\n      this._removalsHead = this._removalsTail = null;\n      this._identityChangesHead = this._identityChangesTail = null;\n\n      // TODO(vicb): when assert gets supported\n      // assert(!this.isDirty);\n    }\n  }\n\n  /**\n   * This is the core function which handles differences between collections.\n   *\n   * - `record` is the record which we saw at this position last time. If null then it is a new\n   *   item.\n   * - `item` is the current item in the collection\n   * - `index` is the position of the item in the collection\n   *\n   * @internal\n   */\n  _mismatch(\n    record: IterableChangeRecord_<V> | null,\n    item: V,\n    itemTrackBy: any,\n    index: number,\n  ): IterableChangeRecord_<V> {\n    // The previous record after which we will append the current one.\n    let previousRecord: IterableChangeRecord_<V> | null;\n\n    if (record === null) {\n      previousRecord = this._itTail;\n    } else {\n      previousRecord = record._prev;\n      // Remove the record from the collection since we know it does not match the item.\n      this._remove(record);\n    }\n\n    // See if we have evicted the item, which used to be at some anterior position of _itHead list.\n    record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy, null);\n    if (record !== null) {\n      // It is an item which we have evicted earlier: reinsert it back into the list.\n      // But first we need to check if identity changed, so we can update in view if necessary.\n      if (!Object.is(record.item, item)) this._addIdentityChange(record, item);\n\n      this._reinsertAfter(record, previousRecord, index);\n    } else {\n      // Attempt to see if the item is at some posterior position of _itHead list.\n      record = this._linkedRecords === null ? null : this._linkedRecords.get(itemTrackBy, index);\n      if (record !== null) {\n        // We have the item in _itHead at/after `index` position. We need to move it forward in the\n        // collection.\n        // But first we need to check if identity changed, so we can update in view if necessary.\n        if (!Object.is(record.item, item)) this._addIdentityChange(record, item);\n\n        this._moveAfter(record, previousRecord, index);\n      } else {\n        // It is a new item: add it.\n        record = this._addAfter(\n          new IterableChangeRecord_<V>(item, itemTrackBy),\n          previousRecord,\n          index,\n        );\n      }\n    }\n    return record;\n  }\n\n  /**\n   * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)\n   *\n   * Use case: `[a, a]` => `[b, a, a]`\n   *\n   * If we did not have this check then the insertion of `b` would:\n   *   1) evict first `a`\n   *   2) insert `b` at `0` index.\n   *   3) leave `a` at index `1` as is. <-- this is wrong!\n   *   3) reinsert `a` at index 2. <-- this is wrong!\n   *\n   * The correct behavior is:\n   *   1) evict first `a`\n   *   2) insert `b` at `0` index.\n   *   3) reinsert `a` at index 1.\n   *   3) move `a` at from `1` to `2`.\n   *\n   *\n   * Double check that we have not evicted a duplicate item. We need to check if the item type may\n   * have already been removed:\n   * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted\n   * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a\n   * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'\n   * at the end.\n   *\n   * @internal\n   */\n  _verifyReinsertion(\n    record: IterableChangeRecord_<V>,\n    item: V,\n    itemTrackBy: any,\n    index: number,\n  ): IterableChangeRecord_<V> {\n    let reinsertRecord: IterableChangeRecord_<V> | null =\n      this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy, null);\n    if (reinsertRecord !== null) {\n      record = this._reinsertAfter(reinsertRecord, record._prev!, index);\n    } else if (record.currentIndex != index) {\n      record.currentIndex = index;\n      this._addToMoves(record, index);\n    }\n    return record;\n  }\n\n  /**\n   * Get rid of any excess {@link IterableChangeRecord_}s from the previous collection\n   *\n   * - `record` The first excess {@link IterableChangeRecord_}.\n   *\n   * @internal\n   */\n  _truncate(record: IterableChangeRecord_<V> | null) {\n    // Anything after that needs to be removed;\n    while (record !== null) {\n      const nextRecord: IterableChangeRecord_<V> | null = record._next;\n      this._addToRemovals(this._unlink(record));\n      record = nextRecord;\n    }\n    if (this._unlinkedRecords !== null) {\n      this._unlinkedRecords.clear();\n    }\n\n    if (this._additionsTail !== null) {\n      this._additionsTail._nextAdded = null;\n    }\n    if (this._movesTail !== null) {\n      this._movesTail._nextMoved = null;\n    }\n    if (this._itTail !== null) {\n      this._itTail._next = null;\n    }\n    if (this._removalsTail !== null) {\n      this._removalsTail._nextRemoved = null;\n    }\n    if (this._identityChangesTail !== null) {\n      this._identityChangesTail._nextIdentityChange = null;\n    }\n  }\n\n  /** @internal */\n  _reinsertAfter(\n    record: IterableChangeRecord_<V>,\n    prevRecord: IterableChangeRecord_<V> | null,\n    index: number,\n  ): IterableChangeRecord_<V> {\n    if (this._unlinkedRecords !== null) {\n      this._unlinkedRecords.remove(record);\n    }\n    const prev = record._prevRemoved;\n    const next = record._nextRemoved;\n\n    if (prev === null) {\n      this._removalsHead = next;\n    } else {\n      prev._nextRemoved = next;\n    }\n    if (next === null) {\n      this._removalsTail = prev;\n    } else {\n      next._prevRemoved = prev;\n    }\n\n    this._insertAfter(record, prevRecord, index);\n    this._addToMoves(record, index);\n    return record;\n  }\n\n  /** @internal */\n  _moveAfter(\n    record: IterableChangeRecord_<V>,\n    prevRecord: IterableChangeRecord_<V> | null,\n    index: number,\n  ): IterableChangeRecord_<V> {\n    this._unlink(record);\n    this._insertAfter(record, prevRecord, index);\n    this._addToMoves(record, index);\n    return record;\n  }\n\n  /** @internal */\n  _addAfter(\n    record: IterableChangeRecord_<V>,\n    prevRecord: IterableChangeRecord_<V> | null,\n    index: number,\n  ): IterableChangeRecord_<V> {\n    this._insertAfter(record, prevRecord, index);\n\n    if (this._additionsTail === null) {\n      // TODO(vicb):\n      // assert(this._additionsHead === null);\n      this._additionsTail = this._additionsHead = record;\n    } else {\n      // TODO(vicb):\n      // assert(_additionsTail._nextAdded === null);\n      // assert(record._nextAdded === null);\n      this._additionsTail = this._additionsTail._nextAdded = record;\n    }\n    return record;\n  }\n\n  /** @internal */\n  _insertAfter(\n    record: IterableChangeRecord_<V>,\n    prevRecord: IterableChangeRecord_<V> | null,\n    index: number,\n  ): IterableChangeRecord_<V> {\n    // TODO(vicb):\n    // assert(record != prevRecord);\n    // assert(record._next === null);\n    // assert(record._prev === null);\n\n    const next: IterableChangeRecord_<V> | null =\n      prevRecord === null ? this._itHead : prevRecord._next;\n    // TODO(vicb):\n    // assert(next != record);\n    // assert(prevRecord != record);\n    record._next = next;\n    record._prev = prevRecord;\n    if (next === null) {\n      this._itTail = record;\n    } else {\n      next._prev = record;\n    }\n    if (prevRecord === null) {\n      this._itHead = record;\n    } else {\n      prevRecord._next = record;\n    }\n\n    if (this._linkedRecords === null) {\n      this._linkedRecords = new _DuplicateMap<V>();\n    }\n    this._linkedRecords.put(record);\n\n    record.currentIndex = index;\n    return record;\n  }\n\n  /** @internal */\n  _remove(record: IterableChangeRecord_<V>): IterableChangeRecord_<V> {\n    return this._addToRemovals(this._unlink(record));\n  }\n\n  /** @internal */\n  _unlink(record: IterableChangeRecord_<V>): IterableChangeRecord_<V> {\n    if (this._linkedRecords !== null) {\n      this._linkedRecords.remove(record);\n    }\n\n    const prev = record._prev;\n    const next = record._next;\n\n    // TODO(vicb):\n    // assert((record._prev = null) === null);\n    // assert((record._next = null) === null);\n\n    if (prev === null) {\n      this._itHead = next;\n    } else {\n      prev._next = next;\n    }\n    if (next === null) {\n      this._itTail = prev;\n    } else {\n      next._prev = prev;\n    }\n\n    return record;\n  }\n\n  /** @internal */\n  _addToMoves(record: IterableChangeRecord_<V>, toIndex: number): IterableChangeRecord_<V> {\n    // TODO(vicb):\n    // assert(record._nextMoved === null);\n\n    if (record.previousIndex === toIndex) {\n      return record;\n    }\n\n    if (this._movesTail === null) {\n      // TODO(vicb):\n      // assert(_movesHead === null);\n      this._movesTail = this._movesHead = record;\n    } else {\n      // TODO(vicb):\n      // assert(_movesTail._nextMoved === null);\n      this._movesTail = this._movesTail._nextMoved = record;\n    }\n\n    return record;\n  }\n\n  private _addToRemovals(record: IterableChangeRecord_<V>): IterableChangeRecord_<V> {\n    if (this._unlinkedRecords === null) {\n      this._unlinkedRecords = new _DuplicateMap<V>();\n    }\n    this._unlinkedRecords.put(record);\n    record.currentIndex = null;\n    record._nextRemoved = null;\n\n    if (this._removalsTail === null) {\n      // TODO(vicb):\n      // assert(_removalsHead === null);\n      this._removalsTail = this._removalsHead = record;\n      record._prevRemoved = null;\n    } else {\n      // TODO(vicb):\n      // assert(_removalsTail._nextRemoved === null);\n      // assert(record._nextRemoved === null);\n      record._prevRemoved = this._removalsTail;\n      this._removalsTail = this._removalsTail._nextRemoved = record;\n    }\n    return record;\n  }\n\n  /** @internal */\n  _addIdentityChange(record: IterableChangeRecord_<V>, item: V) {\n    record.item = item;\n    if (this._identityChangesTail === null) {\n      this._identityChangesTail = this._identityChangesHead = record;\n    } else {\n      this._identityChangesTail = this._identityChangesTail._nextIdentityChange = record;\n    }\n    return record;\n  }\n}\n\nexport class IterableChangeRecord_<V> implements IterableChangeRecord<V> {\n  currentIndex: number | null = null;\n  previousIndex: number | null = null;\n\n  /** @internal */\n  _nextPrevious: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _prev: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _next: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _prevDup: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _nextDup: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _prevRemoved: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _nextRemoved: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _nextAdded: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _nextMoved: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _nextIdentityChange: IterableChangeRecord_<V> | null = null;\n\n  constructor(\n    public item: V,\n    public trackById: any,\n  ) {}\n}\n\n// A linked list of IterableChangeRecords with the same IterableChangeRecord_.item\nclass _DuplicateItemRecordList<V> {\n  /** @internal */\n  _head: IterableChangeRecord_<V> | null = null;\n  /** @internal */\n  _tail: IterableChangeRecord_<V> | null = null;\n\n  /**\n   * Append the record to the list of duplicates.\n   *\n   * Note: by design all records in the list of duplicates hold the same value in record.item.\n   */\n  add(record: IterableChangeRecord_<V>): void {\n    if (this._head === null) {\n      this._head = this._tail = record;\n      record._nextDup = null;\n      record._prevDup = null;\n    } else {\n      // TODO(vicb):\n      // assert(record.item ==  _head.item ||\n      //       record.item is num && record.item.isNaN && _head.item is num && _head.item.isNaN);\n      this._tail!._nextDup = record;\n      record._prevDup = this._tail;\n      record._nextDup = null;\n      this._tail = record;\n    }\n  }\n\n  // Returns a IterableChangeRecord_ having IterableChangeRecord_.trackById == trackById and\n  // IterableChangeRecord_.currentIndex >= atOrAfterIndex\n  get(trackById: any, atOrAfterIndex: number | null): IterableChangeRecord_<V> | null {\n    let record: IterableChangeRecord_<V> | null;\n    for (record = this._head; record !== null; record = record._nextDup) {\n      if (\n        (atOrAfterIndex === null || atOrAfterIndex <= record.currentIndex!) &&\n        Object.is(record.trackById, trackById)\n      ) {\n        return record;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Remove one {@link IterableChangeRecord_} from the list of duplicates.\n   *\n   * Returns whether the list of duplicates is empty.\n   */\n  remove(record: IterableChangeRecord_<V>): boolean {\n    // TODO(vicb):\n    // assert(() {\n    //  // verify that the record being removed is in the list.\n    //  for (IterableChangeRecord_ cursor = _head; cursor != null; cursor = cursor._nextDup) {\n    //    if (identical(cursor, record)) return true;\n    //  }\n    //  return false;\n    //});\n\n    const prev: IterableChangeRecord_<V> | null = record._prevDup;\n    const next: IterableChangeRecord_<V> | null = record._nextDup;\n    if (prev === null) {\n      this._head = next;\n    } else {\n      prev._nextDup = next;\n    }\n    if (next === null) {\n      this._tail = prev;\n    } else {\n      next._prevDup = prev;\n    }\n    return this._head === null;\n  }\n}\n\nclass _DuplicateMap<V> {\n  map = new Map<any, _DuplicateItemRecordList<V>>();\n\n  put(record: IterableChangeRecord_<V>) {\n    const key = record.trackById;\n\n    let duplicates = this.map.get(key);\n    if (!duplicates) {\n      duplicates = new _DuplicateItemRecordList<V>();\n      this.map.set(key, duplicates);\n    }\n    duplicates.add(record);\n  }\n\n  /**\n   * Retrieve the `value` using key. Because the IterableChangeRecord_ value may be one which we\n   * have already iterated over, we use the `atOrAfterIndex` to pretend it is not there.\n   *\n   * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we\n   * have any more `a`s needs to return the second `a`.\n   */\n  get(trackById: any, atOrAfterIndex: number | null): IterableChangeRecord_<V> | null {\n    const key = trackById;\n    const recordList = this.map.get(key);\n    return recordList ? recordList.get(trackById, atOrAfterIndex) : null;\n  }\n\n  /**\n   * Removes a {@link IterableChangeRecord_} from the list of duplicates.\n   *\n   * The list of duplicates also is removed from the map if it gets empty.\n   */\n  remove(record: IterableChangeRecord_<V>): IterableChangeRecord_<V> {\n    const key = record.trackById;\n    const recordList: _DuplicateItemRecordList<V> = this.map.get(key)!;\n    // Remove the list of duplicates when it gets empty\n    if (recordList.remove(record)) {\n      this.map.delete(key);\n    }\n    return record;\n  }\n\n  get isEmpty(): boolean {\n    return this.map.size === 0;\n  }\n\n  clear() {\n    this.map.clear();\n  }\n}\n\nfunction getPreviousIndex(\n  item: any,\n  addRemoveOffset: number,\n  moveOffsets: number[] | null,\n): number {\n  const previousIndex = item.previousIndex;\n  if (previousIndex === null) return previousIndex;\n  let moveOffset = 0;\n  if (moveOffsets && previousIndex < moveOffsets.length) {\n    moveOffset = moveOffsets[previousIndex];\n  }\n  return previousIndex + addRemoveOffset + moveOffset;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {isJsObject} from '../../util/iterable';\nimport {stringify} from '../../util/stringify';\n\nimport type {\n  KeyValueChangeRecord,\n  KeyValueChanges,\n  KeyValueDiffer,\n  KeyValueDifferFactory,\n} from './keyvalue_differs';\n\nexport class DefaultKeyValueDifferFactory<K, V> implements KeyValueDifferFactory {\n  constructor() {}\n  supports(obj: any): boolean {\n    return obj instanceof Map || isJsObject(obj);\n  }\n\n  create<K, V>(): KeyValueDiffer<K, V> {\n    return new DefaultKeyValueDiffer<K, V>();\n  }\n}\n\nexport class DefaultKeyValueDiffer<K, V> implements KeyValueDiffer<K, V>, KeyValueChanges<K, V> {\n  private _records = new Map<K, KeyValueChangeRecord_<K, V>>();\n  private _mapHead: KeyValueChangeRecord_<K, V> | null = null;\n  // _appendAfter is used in the check loop\n  private _appendAfter: KeyValueChangeRecord_<K, V> | null = null;\n  private _previousMapHead: KeyValueChangeRecord_<K, V> | null = null;\n  private _changesHead: KeyValueChangeRecord_<K, V> | null = null;\n  private _changesTail: KeyValueChangeRecord_<K, V> | null = null;\n  private _additionsHead: KeyValueChangeRecord_<K, V> | null = null;\n  private _additionsTail: KeyValueChangeRecord_<K, V> | null = null;\n  private _removalsHead: KeyValueChangeRecord_<K, V> | null = null;\n  private _removalsTail: KeyValueChangeRecord_<K, V> | null = null;\n\n  get isDirty(): boolean {\n    return (\n      this._additionsHead !== null || this._changesHead !== null || this._removalsHead !== null\n    );\n  }\n\n  forEachItem(fn: (r: KeyValueChangeRecord<K, V>) => void) {\n    let record: KeyValueChangeRecord_<K, V> | null;\n    for (record = this._mapHead; record !== null; record = record._next) {\n      fn(record);\n    }\n  }\n\n  forEachPreviousItem(fn: (r: KeyValueChangeRecord<K, V>) => void) {\n    let record: KeyValueChangeRecord_<K, V> | null;\n    for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {\n      fn(record);\n    }\n  }\n\n  forEachChangedItem(fn: (r: KeyValueChangeRecord<K, V>) => void) {\n    let record: KeyValueChangeRecord_<K, V> | null;\n    for (record = this._changesHead; record !== null; record = record._nextChanged) {\n      fn(record);\n    }\n  }\n\n  forEachAddedItem(fn: (r: KeyValueChangeRecord<K, V>) => void) {\n    let record: KeyValueChangeRecord_<K, V> | null;\n    for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n      fn(record);\n    }\n  }\n\n  forEachRemovedItem(fn: (r: KeyValueChangeRecord<K, V>) => void) {\n    let record: KeyValueChangeRecord_<K, V> | null;\n    for (record = this._removalsHead; record !== null; record = record._nextRemoved) {\n      fn(record);\n    }\n  }\n\n  diff(map?: Map<any, any> | {[k: string]: any} | null): any {\n    if (!map) {\n      map = new Map();\n    } else if (!(map instanceof Map || isJsObject(map))) {\n      throw new RuntimeError(\n        RuntimeErrorCode.INVALID_DIFFER_INPUT,\n        ngDevMode && `Error trying to diff '${stringify(map)}'. Only maps and objects are allowed`,\n      );\n    }\n\n    return this.check(map) ? this : null;\n  }\n\n  onDestroy() {}\n\n  /**\n   * Check the current state of the map vs the previous.\n   * The algorithm is optimised for when the keys do no change.\n   */\n  check(map: Map<any, any> | {[k: string]: any}): boolean {\n    this._reset();\n\n    let insertBefore = this._mapHead;\n    this._appendAfter = null;\n\n    this._forEach(map, (value: any, key: any) => {\n      if (insertBefore && insertBefore.key === key) {\n        this._maybeAddToChanges(insertBefore, value);\n        this._appendAfter = insertBefore;\n        insertBefore = insertBefore._next;\n      } else {\n        const record = this._getOrCreateRecordForKey(key, value);\n        insertBefore = this._insertBeforeOrAppend(insertBefore, record);\n      }\n    });\n\n    // Items remaining at the end of the list have been deleted\n    if (insertBefore) {\n      if (insertBefore._prev) {\n        insertBefore._prev._next = null;\n      }\n\n      this._removalsHead = insertBefore;\n\n      for (\n        let record: KeyValueChangeRecord_<K, V> | null = insertBefore;\n        record !== null;\n        record = record._nextRemoved\n      ) {\n        if (record === this._mapHead) {\n          this._mapHead = null;\n        }\n        this._records.delete(record.key);\n        record._nextRemoved = record._next;\n        record.previousValue = record.currentValue;\n        record.currentValue = null;\n        record._prev = null;\n        record._next = null;\n      }\n    }\n\n    // Make sure tails have no next records from previous runs\n    if (this._changesTail) this._changesTail._nextChanged = null;\n    if (this._additionsTail) this._additionsTail._nextAdded = null;\n\n    return this.isDirty;\n  }\n\n  /**\n   * Inserts a record before `before` or append at the end of the list when `before` is null.\n   *\n   * Notes:\n   * - This method appends at `this._appendAfter`,\n   * - This method updates `this._appendAfter`,\n   * - The return value is the new value for the insertion pointer.\n   */\n  private _insertBeforeOrAppend(\n    before: KeyValueChangeRecord_<K, V> | null,\n    record: KeyValueChangeRecord_<K, V>,\n  ): KeyValueChangeRecord_<K, V> | null {\n    if (before) {\n      const prev = before._prev;\n      record._next = before;\n      record._prev = prev;\n      before._prev = record;\n      if (prev) {\n        prev._next = record;\n      }\n      if (before === this._mapHead) {\n        this._mapHead = record;\n      }\n\n      this._appendAfter = before;\n      return before;\n    }\n\n    if (this._appendAfter) {\n      this._appendAfter._next = record;\n      record._prev = this._appendAfter;\n    } else {\n      this._mapHead = record;\n    }\n\n    this._appendAfter = record;\n    return null;\n  }\n\n  private _getOrCreateRecordForKey(key: K, value: V): KeyValueChangeRecord_<K, V> {\n    if (this._records.has(key)) {\n      const record = this._records.get(key)!;\n      this._maybeAddToChanges(record, value);\n      const prev = record._prev;\n      const next = record._next;\n      if (prev) {\n        prev._next = next;\n      }\n      if (next) {\n        next._prev = prev;\n      }\n      record._next = null;\n      record._prev = null;\n\n      return record;\n    }\n\n    const record = new KeyValueChangeRecord_<K, V>(key);\n    this._records.set(key, record);\n    record.currentValue = value;\n    this._addToAdditions(record);\n    return record;\n  }\n\n  /** @internal */\n  _reset() {\n    if (this.isDirty) {\n      let record: KeyValueChangeRecord_<K, V> | null;\n      // let `_previousMapHead` contain the state of the map before the changes\n      this._previousMapHead = this._mapHead;\n      for (record = this._previousMapHead; record !== null; record = record._next) {\n        record._nextPrevious = record._next;\n      }\n\n      // Update `record.previousValue` with the value of the item before the changes\n      // We need to update all changed items (that's those which have been added and changed)\n      for (record = this._changesHead; record !== null; record = record._nextChanged) {\n        record.previousValue = record.currentValue;\n      }\n      for (record = this._additionsHead; record != null; record = record._nextAdded) {\n        record.previousValue = record.currentValue;\n      }\n\n      this._changesHead = this._changesTail = null;\n      this._additionsHead = this._additionsTail = null;\n      this._removalsHead = null;\n    }\n  }\n\n  // Add the record or a given key to the list of changes only when the value has actually changed\n  private _maybeAddToChanges(record: KeyValueChangeRecord_<K, V>, newValue: any): void {\n    if (!Object.is(newValue, record.currentValue)) {\n      record.previousValue = record.currentValue;\n      record.currentValue = newValue;\n      this._addToChanges(record);\n    }\n  }\n\n  private _addToAdditions(record: KeyValueChangeRecord_<K, V>) {\n    if (this._additionsHead === null) {\n      this._additionsHead = this._additionsTail = record;\n    } else {\n      this._additionsTail!._nextAdded = record;\n      this._additionsTail = record;\n    }\n  }\n\n  private _addToChanges(record: KeyValueChangeRecord_<K, V>) {\n    if (this._changesHead === null) {\n      this._changesHead = this._changesTail = record;\n    } else {\n      this._changesTail!._nextChanged = record;\n      this._changesTail = record;\n    }\n  }\n\n  /** @internal */\n  private _forEach<K, V>(obj: Map<K, V> | {[k: string]: V}, fn: (v: V, k: any) => void) {\n    if (obj instanceof Map) {\n      obj.forEach(fn);\n    } else {\n      Object.keys(obj).forEach((k) => fn(obj[k], k));\n    }\n  }\n}\n\nclass KeyValueChangeRecord_<K, V> implements KeyValueChangeRecord<K, V> {\n  previousValue: V | null = null;\n  currentValue: V | null = null;\n\n  /** @internal */\n  _nextPrevious: KeyValueChangeRecord_<K, V> | null = null;\n  /** @internal */\n  _next: KeyValueChangeRecord_<K, V> | null = null;\n  /** @internal */\n  _prev: KeyValueChangeRecord_<K, V> | null = null;\n  /** @internal */\n  _nextAdded: KeyValueChangeRecord_<K, V> | null = null;\n  /** @internal */\n  _nextRemoved: KeyValueChangeRecord_<K, V> | null = null;\n  /** @internal */\n  _nextChanged: KeyValueChangeRecord_<K, V> | null = null;\n\n  constructor(public key: K) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵɵdefineInjectable} from '../../di/interface/defs';\nimport {StaticProvider} from '../../di/interface/provider';\nimport {Optional, SkipSelf} from '../../di/metadata';\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {DefaultIterableDifferFactory} from '../differs/default_iterable_differ';\n\n/**\n * A type describing supported iterable types.\n *\n * @publicApi\n */\nexport type NgIterable<T> = Array<T> | Iterable<T>;\n\n/**\n * A strategy for tracking changes over time to an iterable. Used by {@link /api/common/NgForOf NgForOf} to\n * respond to changes in an iterable by effecting equivalent changes in the DOM.\n *\n * @publicApi\n */\nexport interface IterableDiffer<V> {\n  /**\n   * Compute a difference between the previous state and the new `object` state.\n   *\n   * @param object containing the new value.\n   * @returns an object describing the difference. The return value is only valid until the next\n   * `diff()` invocation.\n   */\n  diff(object: NgIterable<V> | undefined | null): IterableChanges<V> | null;\n}\n\n/**\n * An object describing the changes in the `Iterable` collection since last time\n * `IterableDiffer#diff()` was invoked.\n *\n * @publicApi\n */\nexport interface IterableChanges<V> {\n  /**\n   * Iterate over all changes. `IterableChangeRecord` will contain information about changes\n   * to each item.\n   */\n  forEachItem(fn: (record: IterableChangeRecord<V>) => void): void;\n\n  /**\n   * Iterate over a set of operations which when applied to the original `Iterable` will produce the\n   * new `Iterable`.\n   *\n   * NOTE: These are not necessarily the actual operations which were applied to the original\n   * `Iterable`, rather these are a set of computed operations which may not be the same as the\n   * ones applied.\n   *\n   * @param record A change which needs to be applied\n   * @param previousIndex The `IterableChangeRecord#previousIndex` of the `record` refers to the\n   *        original `Iterable` location, where as `previousIndex` refers to the transient location\n   *        of the item, after applying the operations up to this point.\n   * @param currentIndex The `IterableChangeRecord#currentIndex` of the `record` refers to the\n   *        original `Iterable` location, where as `currentIndex` refers to the transient location\n   *        of the item, after applying the operations up to this point.\n   */\n  forEachOperation(\n    fn: (\n      record: IterableChangeRecord<V>,\n      previousIndex: number | null,\n      currentIndex: number | null,\n    ) => void,\n  ): void;\n\n  /**\n   * Iterate over changes in the order of original `Iterable` showing where the original items\n   * have moved.\n   */\n  forEachPreviousItem(fn: (record: IterableChangeRecord<V>) => void): void;\n\n  /** Iterate over all added items. */\n  forEachAddedItem(fn: (record: IterableChangeRecord<V>) => void): void;\n\n  /** Iterate over all moved items. */\n  forEachMovedItem(fn: (record: IterableChangeRecord<V>) => void): void;\n\n  /** Iterate over all removed items. */\n  forEachRemovedItem(fn: (record: IterableChangeRecord<V>) => void): void;\n\n  /**\n   * Iterate over all items which had their identity (as computed by the `TrackByFunction`)\n   * changed.\n   */\n  forEachIdentityChange(fn: (record: IterableChangeRecord<V>) => void): void;\n}\n\n/**\n * Record representing the item change information.\n *\n * @publicApi\n */\nexport interface IterableChangeRecord<V> {\n  /** Current index of the item in `Iterable` or null if removed. */\n  readonly currentIndex: number | null;\n\n  /** Previous index of the item in `Iterable` or null if added. */\n  readonly previousIndex: number | null;\n\n  /** The item. */\n  readonly item: V;\n\n  /** Track by identity as computed by the `TrackByFunction`. */\n  readonly trackById: any;\n}\n\n/**\n * A function optionally passed into the `NgForOf` directive to customize how `NgForOf` uniquely\n * identifies items in an iterable.\n *\n * `NgForOf` needs to uniquely identify items in the iterable to correctly perform DOM updates\n * when items in the iterable are reordered, new items are added, or existing items are removed.\n *\n *\n * In all of these scenarios it is usually desirable to only update the DOM elements associated\n * with the items affected by the change. This behavior is important to:\n *\n * - preserve any DOM-specific UI state (like cursor position, focus, text selection) when the\n *   iterable is modified\n * - enable animation of item addition, removal, and iterable reordering\n * - preserve the value of the `<select>` element when nested `<option>` elements are dynamically\n *   populated using `NgForOf` and the bound iterable is updated\n *\n * A common use for custom `trackBy` functions is when the model that `NgForOf` iterates over\n * contains a property with a unique identifier. For example, given a model:\n *\n * ```ts\n * class User {\n *   id: number;\n *   name: string;\n *   ...\n * }\n * ```\n * a custom `trackBy` function could look like the following:\n * ```ts\n * function userTrackBy(index, user) {\n *   return user.id;\n * }\n * ```\n *\n * A custom `trackBy` function must have several properties:\n *\n * - be [idempotent](https://en.wikipedia.org/wiki/Idempotence) (be without side effects, and always\n * return the same value for a given input)\n * - return unique value for all unique inputs\n * - be fast\n *\n * @see [`NgForOf#ngForTrackBy`](api/common/NgForOf#ngForTrackBy)\n * @publicApi\n */\nexport interface TrackByFunction<T> {\n  // Note: the type parameter `U` enables more accurate template type checking in case a trackBy\n  // function is declared using a base type of the iterated type. The `U` type gives TypeScript\n  // additional freedom to infer a narrower type for the `item` parameter type, instead of imposing\n  // the trackBy's declared item type as the inferred type for `T`.\n  // See https://github.com/angular/angular/issues/40125\n\n  /**\n   * @param index The index of the item within the iterable.\n   * @param item The item in the iterable.\n   */\n  <U extends T>(index: number, item: T & U): any;\n}\n\n/**\n * Provides a factory for {@link IterableDiffer}.\n *\n * @publicApi\n */\nexport interface IterableDifferFactory {\n  supports(objects: any): boolean;\n  create<V>(trackByFn?: TrackByFunction<V>): IterableDiffer<V>;\n}\n\nexport function defaultIterableDiffersFactory() {\n  return new IterableDiffers([new DefaultIterableDifferFactory()]);\n}\n\n/**\n * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.\n *\n * @publicApi\n */\nexport class IterableDiffers {\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: IterableDiffers,\n    providedIn: 'root',\n    factory: defaultIterableDiffersFactory,\n  });\n\n  constructor(private factories: IterableDifferFactory[]) {}\n\n  static create(factories: IterableDifferFactory[], parent?: IterableDiffers): IterableDiffers {\n    if (parent != null) {\n      const copied = parent.factories.slice();\n      factories = factories.concat(copied);\n    }\n\n    return new IterableDiffers(factories);\n  }\n\n  /**\n   * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the\n   * inherited {@link IterableDiffers} instance with the provided factories and return a new\n   * {@link IterableDiffers} instance.\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * The following example shows how to extend an existing list of factories,\n   * which will only be applied to the injector for this component and its children.\n   * This step is all that's required to make a new {@link IterableDiffer} available.\n   *\n   * ```ts\n   * @Component({\n   *   viewProviders: [\n   *     IterableDiffers.extend([new ImmutableListDiffer()])\n   *   ]\n   * })\n   * ```\n   */\n  static extend(factories: IterableDifferFactory[]): StaticProvider {\n    return {\n      provide: IterableDiffers,\n      useFactory: (parent: IterableDiffers | null) => {\n        // if parent is null, it means that we are in the root injector and we have just overridden\n        // the default injection mechanism for IterableDiffers, in such a case just assume\n        // `defaultIterableDiffersFactory`.\n        return IterableDiffers.create(factories, parent || defaultIterableDiffersFactory());\n      },\n      // Dependency technically isn't optional, but we can provide a better error message this way.\n      deps: [[IterableDiffers, new SkipSelf(), new Optional()]],\n    };\n  }\n\n  find(iterable: any): IterableDifferFactory {\n    const factory = this.factories.find((f) => f.supports(iterable));\n    if (factory != null) {\n      return factory;\n    } else {\n      throw new RuntimeError(\n        RuntimeErrorCode.NO_SUPPORTING_DIFFER_FACTORY,\n        ngDevMode &&\n          `Cannot find a differ supporting object '${iterable}' of type '${getTypeNameForDebugging(\n            iterable,\n          )}'`,\n      );\n    }\n  }\n}\n\nexport function getTypeNameForDebugging(type: any): string {\n  return type['name'] || typeof type;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Optional, SkipSelf, StaticProvider, ɵɵdefineInjectable} from '../../di';\nimport {RuntimeError, RuntimeErrorCode} from '../../errors';\n\nimport {DefaultKeyValueDifferFactory} from './default_keyvalue_differ';\n\n/**\n * A differ that tracks changes made to an object over time.\n *\n * @publicApi\n */\nexport interface KeyValueDiffer<K, V> {\n  /**\n   * Compute a difference between the previous state and the new `object` state.\n   *\n   * @param object containing the new value.\n   * @returns an object describing the difference. The return value is only valid until the next\n   * `diff()` invocation.\n   */\n  diff(object: Map<K, V>): KeyValueChanges<K, V> | null;\n\n  /**\n   * Compute a difference between the previous state and the new `object` state.\n   *\n   * @param object containing the new value.\n   * @returns an object describing the difference. The return value is only valid until the next\n   * `diff()` invocation.\n   */\n  diff(object: {[key: string]: V}): KeyValueChanges<string, V> | null;\n  // TODO(TS2.1): diff<KP extends string>(this: KeyValueDiffer<KP, V>, object: Record<KP, V>):\n  // KeyValueDiffer<KP, V>;\n}\n\n/**\n * An object describing the changes in the `Map` or `{[k:string]: string}` since last time\n * `KeyValueDiffer#diff()` was invoked.\n *\n * @publicApi\n */\nexport interface KeyValueChanges<K, V> {\n  /**\n   * Iterate over all changes. `KeyValueChangeRecord` will contain information about changes\n   * to each item.\n   */\n  forEachItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;\n\n  /**\n   * Iterate over changes in the order of original Map showing where the original items\n   * have moved.\n   */\n  forEachPreviousItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;\n\n  /**\n   * Iterate over all keys for which values have changed.\n   */\n  forEachChangedItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;\n\n  /**\n   * Iterate over all added items.\n   */\n  forEachAddedItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;\n\n  /**\n   * Iterate over all removed items.\n   */\n  forEachRemovedItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;\n}\n\n/**\n * Record representing the item change information.\n *\n * @publicApi\n */\nexport interface KeyValueChangeRecord<K, V> {\n  /**\n   * Current key in the Map.\n   */\n  readonly key: K;\n\n  /**\n   * Current value for the key or `null` if removed.\n   */\n  readonly currentValue: V | null;\n\n  /**\n   * Previous value for the key or `null` if added.\n   */\n  readonly previousValue: V | null;\n}\n\n/**\n * Provides a factory for {@link KeyValueDiffer}.\n *\n * @publicApi\n */\nexport interface KeyValueDifferFactory {\n  /**\n   * Test to see if the differ knows how to diff this kind of object.\n   */\n  supports(objects: any): boolean;\n\n  /**\n   * Create a `KeyValueDiffer`.\n   */\n  create<K, V>(): KeyValueDiffer<K, V>;\n}\n\nexport function defaultKeyValueDiffersFactory() {\n  return new KeyValueDiffers([new DefaultKeyValueDifferFactory()]);\n}\n\n/**\n * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.\n *\n * @publicApi\n */\nexport class KeyValueDiffers {\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: KeyValueDiffers,\n    providedIn: 'root',\n    factory: defaultKeyValueDiffersFactory,\n  });\n\n  private readonly factories: KeyValueDifferFactory[];\n\n  constructor(factories: KeyValueDifferFactory[]) {\n    this.factories = factories;\n  }\n\n  static create<S>(factories: KeyValueDifferFactory[], parent?: KeyValueDiffers): KeyValueDiffers {\n    if (parent) {\n      const copied = parent.factories.slice();\n      factories = factories.concat(copied);\n    }\n    return new KeyValueDiffers(factories);\n  }\n\n  /**\n   * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the\n   * inherited {@link KeyValueDiffers} instance with the provided factories and return a new\n   * {@link KeyValueDiffers} instance.\n   *\n   * @usageNotes\n   * ### Example\n   *\n   * The following example shows how to extend an existing list of factories,\n   * which will only be applied to the injector for this component and its children.\n   * This step is all that's required to make a new {@link KeyValueDiffer} available.\n   *\n   * ```ts\n   * @Component({\n   *   viewProviders: [\n   *     KeyValueDiffers.extend([new ImmutableMapDiffer()])\n   *   ]\n   * })\n   * ```\n   */\n  static extend<S>(factories: KeyValueDifferFactory[]): StaticProvider {\n    return {\n      provide: KeyValueDiffers,\n      useFactory: (parent: KeyValueDiffers) => {\n        // if parent is null, it means that we are in the root injector and we have just overridden\n        // the default injection mechanism for KeyValueDiffers, in such a case just assume\n        // `defaultKeyValueDiffersFactory`.\n        return KeyValueDiffers.create(factories, parent || defaultKeyValueDiffersFactory());\n      },\n      // Dependency technically isn't optional, but we can provide a better error message this way.\n      deps: [[KeyValueDiffers, new SkipSelf(), new Optional()]],\n    };\n  }\n\n  find(kv: any): KeyValueDifferFactory {\n    const factory = this.factories.find((f) => f.supports(kv));\n    if (factory) {\n      return factory;\n    }\n    throw new RuntimeError(\n      RuntimeErrorCode.NO_SUPPORTING_DIFFER_FACTORY,\n      ngDevMode && `Cannot find a differ supporting object '${kv}'`,\n    );\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DefaultIterableDifferFactory} from './differs/default_iterable_differ';\nimport {DefaultKeyValueDifferFactory} from './differs/default_keyvalue_differ';\nimport {IterableDifferFactory, IterableDiffers} from './differs/iterable_differs';\nimport {KeyValueDifferFactory, KeyValueDiffers} from './differs/keyvalue_differs';\n\nexport {SimpleChange, SimpleChanges} from '../interface/simple_change';\nexport {devModeEqual} from '../util/comparison';\nexport {ChangeDetectorRef} from './change_detector_ref';\nexport {ChangeDetectionStrategy} from './constants';\nexport {\n  DefaultIterableDiffer,\n  DefaultIterableDifferFactory,\n} from './differs/default_iterable_differ';\nexport {DefaultKeyValueDifferFactory} from './differs/default_keyvalue_differ';\nexport {\n  IterableChangeRecord,\n  IterableChanges,\n  IterableDiffer,\n  IterableDifferFactory,\n  IterableDiffers,\n  NgIterable,\n  TrackByFunction,\n} from './differs/iterable_differs';\nexport {\n  KeyValueChangeRecord,\n  KeyValueChanges,\n  KeyValueDiffer,\n  KeyValueDifferFactory,\n  KeyValueDiffers,\n} from './differs/keyvalue_differs';\nexport {PipeTransform} from './pipe_transform';\n\n/**\n * Structural diffing for `Object`s and `Map`s.\n */\nconst keyValDiff: KeyValueDifferFactory[] = [new DefaultKeyValueDifferFactory()];\n\n/**\n * Structural diffing for `Iterable` types such as `Array`s.\n */\nconst iterableDiff: IterableDifferFactory[] = [new DefaultIterableDifferFactory()];\n\nexport const defaultIterableDiffers = new IterableDiffers(iterableDiff);\n\nexport const defaultKeyValueDiffers = new KeyValueDiffers(keyValDiff);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {StaticProvider} from '../di';\n\nimport {createPlatformFactory} from './platform';\nimport {PlatformRef} from './platform_ref';\n\n/**\n * This platform has to be included in any other platform\n *\n * @publicApi\n */\nexport const platformCore: (extraProviders?: StaticProvider[] | undefined) => PlatformRef =\n  createPlatformFactory(null, 'core', []);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NgModule} from '../metadata';\n\nimport {ApplicationRef} from './application_ref';\n\n/**\n * Re-exported by `BrowserModule`, which is included automatically in the root\n * `AppModule` when you create a new app with the CLI `new` command. Eagerly injects\n * `ApplicationRef` to instantiate it.\n *\n * @publicApi\n */\n@NgModule()\nexport class ApplicationModule {\n  // Inject ApplicationRef to make it eager...\n  constructor(appRef: ApplicationRef) {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {internalProvideZoneChangeDetection} from '../change_detection/scheduling/ng_zone_scheduling';\nimport {EnvironmentProviders, Provider, StaticProvider} from '../di/interface/provider';\nimport {EnvironmentInjector} from '../di/r3_injector';\nimport {Type} from '../interface/type';\nimport {createOrReusePlatformInjector} from '../platform/platform';\nimport {assertStandaloneComponentType} from '../render3/errors';\nimport {EnvironmentNgModuleRefAdapter} from '../render3/ng_module_ref';\n\nimport {ApplicationRef} from './application_ref';\nimport {ChangeDetectionScheduler} from '../change_detection/scheduling/zoneless_scheduling';\nimport {ChangeDetectionSchedulerImpl} from '../change_detection/scheduling/zoneless_scheduling_impl';\nimport {bootstrap} from '../platform/bootstrap';\nimport {profiler} from '../render3/profiler';\nimport {ProfilerEvent} from '../render3/profiler_types';\n\n/**\n * Internal create application API that implements the core application creation logic and optional\n * bootstrap logic.\n *\n * Platforms (such as `platform-browser`) may require different set of application and platform\n * providers for an application to function correctly. As a result, platforms may use this function\n * internally and supply the necessary providers during the bootstrap, while exposing\n * platform-specific APIs as a part of their public API.\n *\n * @returns A promise that returns an `ApplicationRef` instance once resolved.\n */\n\nexport function internalCreateApplication(config: {\n  rootComponent?: Type<unknown>;\n  appProviders?: Array<Provider | EnvironmentProviders>;\n  platformProviders?: Provider[];\n}): Promise<ApplicationRef> {\n  profiler(ProfilerEvent.BootstrapApplicationStart);\n  try {\n    const {rootComponent, appProviders, platformProviders} = config;\n\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && rootComponent !== undefined) {\n      assertStandaloneComponentType(rootComponent);\n    }\n\n    const platformInjector = createOrReusePlatformInjector(platformProviders as StaticProvider[]);\n\n    // Create root application injector based on a set of providers configured at the platform\n    // bootstrap level as well as providers passed to the bootstrap call by a user.\n    const allAppProviders = [\n      internalProvideZoneChangeDetection({}),\n      {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl},\n      ...(appProviders || []),\n    ];\n    const adapter = new EnvironmentNgModuleRefAdapter({\n      providers: allAppProviders,\n      parent: platformInjector as EnvironmentInjector,\n      debugName: typeof ngDevMode === 'undefined' || ngDevMode ? 'Environment Injector' : '',\n      // We skip environment initializers because we need to run them inside the NgZone, which\n      // happens after we get the NgZone instance from the Injector.\n      runEnvironmentInitializers: false,\n    });\n\n    return bootstrap({\n      r3Injector: adapter.injector,\n      platformInjector,\n      rootComponent,\n    });\n  } catch (e) {\n    return Promise.reject(e);\n  } finally {\n    profiler(ProfilerEvent.BootstrapApplicationEnd);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  isEarlyEventType,\n  isCaptureEventType,\n  EventContractContainer,\n  EventContract,\n  EventDispatcher,\n  registerDispatcher,\n  getAppScopedQueuedEventInfos,\n  clearAppScopedEarlyEventContract,\n  EventPhase,\n} from '../../primitives/event-dispatch';\n\nimport {APP_BOOTSTRAP_LISTENER, ApplicationRef} from '../application/application_ref';\nimport {ENVIRONMENT_INITIALIZER, Injector} from '../di';\nimport {inject} from '../di/injector_compatibility';\nimport {Provider} from '../di/interface/provider';\nimport {RElement, RNode} from '../render3/interfaces/renderer_dom';\nimport {CLEANUP, LView, TView} from '../render3/interfaces/view';\nimport {unwrapRNode} from '../render3/util/view_utils';\n\nimport {\n  JSACTION_BLOCK_ELEMENT_MAP,\n  EVENT_REPLAY_ENABLED_DEFAULT,\n  IS_EVENT_REPLAY_ENABLED,\n} from './tokens';\nimport {\n  sharedStashFunction,\n  sharedMapFunction,\n  DEFER_BLOCK_SSR_ID_ATTRIBUTE,\n  EventContractDetails,\n  JSACTION_EVENT_CONTRACT,\n  invokeListeners,\n  removeListeners,\n  setStashFn,\n  enableStashEventListenerImpl,\n} from '../event_delegation_utils';\nimport {APP_ID} from '../application/application_tokens';\nimport {performanceMarkFeature} from '../util/performance';\nimport {triggerHydrationFromBlockName} from '../defer/triggering';\nimport {isIncrementalHydrationEnabled} from './utils';\n\n/** Apps in which we've enabled event replay.\n *  This is to prevent initializing event replay more than once per app.\n */\nconst appsWithEventReplay = new WeakSet<ApplicationRef>();\n\n/**\n * The key that represents all replayable elements that are not in defer blocks.\n */\nconst EAGER_CONTENT_LISTENERS_KEY = '';\n\n/**\n * A list of block events that need to be replayed\n */\nlet blockEventQueue: {event: Event; currentTarget: Element}[] = [];\n\n/**\n * Determines whether Event Replay feature should be activated on the client.\n */\nfunction shouldEnableEventReplay(injector: Injector) {\n  return injector.get(IS_EVENT_REPLAY_ENABLED, EVENT_REPLAY_ENABLED_DEFAULT);\n}\n\n/**\n * Returns a set of providers required to setup support for event replay.\n * Requires hydration to be enabled separately.\n */\nexport function withEventReplay(): Provider[] {\n  const providers: Provider[] = [\n    {\n      provide: IS_EVENT_REPLAY_ENABLED,\n      useFactory: () => {\n        let isEnabled = true;\n        if (typeof ngServerMode === 'undefined' || !ngServerMode) {\n          // Note: globalThis[CONTRACT_PROPERTY] may be undefined in case Event Replay feature\n          // is enabled, but there are no events configured in this application, in which case\n          // we don't activate this feature, since there are no events to replay.\n          const appId = inject(APP_ID);\n          isEnabled = !!window._ejsas?.[appId];\n        }\n        if (isEnabled) {\n          performanceMarkFeature('NgEventReplay');\n        }\n        return isEnabled;\n      },\n    },\n  ];\n\n  if (typeof ngServerMode === 'undefined' || !ngServerMode) {\n    providers.push(\n      {\n        provide: ENVIRONMENT_INITIALIZER,\n        useValue: () => {\n          const appRef = inject(ApplicationRef);\n          const {injector} = appRef;\n          // We have to check for the appRef here due to the possibility of multiple apps\n          // being present on the same page. We only want to enable event replay for the\n          // apps that actually want it.\n          if (!appsWithEventReplay.has(appRef)) {\n            const jsActionMap = inject(JSACTION_BLOCK_ELEMENT_MAP);\n            if (shouldEnableEventReplay(injector)) {\n              enableStashEventListenerImpl();\n              const appId = injector.get(APP_ID);\n              const clearStashFn = setStashFn(\n                appId,\n                (rEl: RNode, eventName: string, listenerFn: VoidFunction) => {\n                  // If a user binds to a ng-container and uses a directive that binds using a host listener,\n                  // this element could be a comment node. So we need to ensure we have an actual element\n                  // node before stashing anything.\n                  if ((rEl as Node).nodeType !== Node.ELEMENT_NODE) return;\n                  sharedStashFunction(rEl as RElement, eventName, listenerFn);\n                  sharedMapFunction(rEl as RElement, jsActionMap);\n                },\n              );\n              // Clean up the reference to the function set by the environment initializer,\n              // as the function closure may capture injected elements and prevent them\n              // from being properly garbage collected.\n              appRef.onDestroy(clearStashFn);\n            }\n          }\n        },\n        multi: true,\n      },\n      {\n        provide: APP_BOOTSTRAP_LISTENER,\n        useFactory: () => {\n          const appRef = inject(ApplicationRef);\n          const {injector} = appRef;\n\n          return () => {\n            // We have to check for the appRef here due to the possibility of multiple apps\n            // being present on the same page. We only want to enable event replay for the\n            // apps that actually want it.\n            if (!shouldEnableEventReplay(injector) || appsWithEventReplay.has(appRef)) {\n              return;\n            }\n\n            appsWithEventReplay.add(appRef);\n\n            appRef.onDestroy(() => {\n              appsWithEventReplay.delete(appRef);\n              // Ensure that we're always safe calling this in the browser.\n              if (typeof ngServerMode !== 'undefined' && !ngServerMode) {\n                const appId = injector.get(APP_ID);\n                // `_ejsa` should be deleted when the app is destroyed, ensuring that\n                // no elements are still captured in the global list and are not prevented\n                // from being garbage collected.\n                clearAppScopedEarlyEventContract(appId);\n              }\n            });\n\n            // Kick off event replay logic once hydration for the initial part\n            // of the application is completed. This timing is similar to the unclaimed\n            // dehydrated views cleanup timing.\n            appRef.whenStable().then(() => {\n              // Note: we have to check whether the application is destroyed before\n              // performing other operations with the `injector`.\n              // The application may be destroyed **before** it becomes stable, so when\n              // the `whenStable` resolves, the injector might already be in\n              // a destroyed state. Thus, calling `injector.get` would throw an error\n              // indicating that the injector has already been destroyed.\n              if (appRef.destroyed) {\n                return;\n              }\n\n              const eventContractDetails = injector.get(JSACTION_EVENT_CONTRACT);\n              initEventReplay(eventContractDetails, injector);\n              const jsActionMap = injector.get(JSACTION_BLOCK_ELEMENT_MAP);\n              jsActionMap.get(EAGER_CONTENT_LISTENERS_KEY)?.forEach(removeListeners);\n              jsActionMap.delete(EAGER_CONTENT_LISTENERS_KEY);\n\n              const eventContract = eventContractDetails.instance!;\n              // This removes event listeners registered through the container manager,\n              // as listeners registered on `document.body` might never be removed if we\n              // don't clean up the contract.\n              if (isIncrementalHydrationEnabled(injector)) {\n                // When incremental hydration is enabled, we cannot clean up the event\n                // contract immediately because we're unaware if there are any deferred\n                // blocks to hydrate. We can only schedule a contract cleanup when the\n                // app is destroyed.\n                appRef.onDestroy(() => eventContract.cleanUp());\n              } else {\n                eventContract.cleanUp();\n              }\n            });\n          };\n        },\n        multi: true,\n      },\n    );\n  }\n\n  return providers;\n}\n\nconst initEventReplay = (eventDelegation: EventContractDetails, injector: Injector) => {\n  const appId = injector.get(APP_ID);\n  // This is set in packages/platform-server/src/utils.ts\n  const earlyJsactionData = window._ejsas![appId]!;\n  const eventContract = (eventDelegation.instance = new EventContract(\n    new EventContractContainer(earlyJsactionData.c),\n  ));\n  for (const et of earlyJsactionData.et) {\n    eventContract.addEvent(et);\n  }\n  for (const et of earlyJsactionData.etc) {\n    eventContract.addEvent(et);\n  }\n  const eventInfos = getAppScopedQueuedEventInfos(appId);\n  eventContract.replayEarlyEventInfos(eventInfos);\n  clearAppScopedEarlyEventContract(appId);\n  const dispatcher = new EventDispatcher((event) => {\n    invokeRegisteredReplayListeners(injector, event, event.currentTarget as Element);\n  });\n  registerDispatcher(eventContract, dispatcher);\n};\n\n/**\n * Extracts information about all DOM events (added in a template) registered on elements in a give\n * LView. Maps collected events to a corresponding DOM element (an element is used as a key).\n */\nexport function collectDomEventsInfo(\n  tView: TView,\n  lView: LView,\n  eventTypesToReplay: {regular: Set<string>; capture: Set<string>},\n): Map<Element, string[]> {\n  const domEventsInfo = new Map<Element, string[]>();\n  const lCleanup = lView[CLEANUP];\n  const tCleanup = tView.cleanup;\n  if (!tCleanup || !lCleanup) {\n    return domEventsInfo;\n  }\n  for (let i = 0; i < tCleanup.length; ) {\n    const firstParam = tCleanup[i++];\n    const secondParam = tCleanup[i++];\n    if (typeof firstParam !== 'string') {\n      continue;\n    }\n    const eventType = firstParam;\n    if (!isEarlyEventType(eventType)) {\n      continue;\n    }\n    if (isCaptureEventType(eventType)) {\n      eventTypesToReplay.capture.add(eventType);\n    } else {\n      eventTypesToReplay.regular.add(eventType);\n    }\n    const listenerElement = unwrapRNode(lView[secondParam]) as any as Element;\n    i++; // move the cursor to the next position (location of the listener idx)\n    const useCaptureOrIndx = tCleanup[i++];\n    // if useCaptureOrIndx is boolean then report it as is.\n    // if useCaptureOrIndx is positive number then it in unsubscribe method\n    // if useCaptureOrIndx is negative number then it is a Subscription\n    const isDomEvent = typeof useCaptureOrIndx === 'boolean' || useCaptureOrIndx >= 0;\n    if (!isDomEvent) {\n      continue;\n    }\n    if (!domEventsInfo.has(listenerElement)) {\n      domEventsInfo.set(listenerElement, [eventType]);\n    } else {\n      domEventsInfo.get(listenerElement)!.push(eventType);\n    }\n  }\n  return domEventsInfo;\n}\n\nexport function invokeRegisteredReplayListeners(\n  injector: Injector,\n  event: Event,\n  currentTarget: Element | null,\n) {\n  const blockName =\n    (currentTarget && currentTarget.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE)) ?? '';\n  if (/d\\d+/.test(blockName)) {\n    hydrateAndInvokeBlockListeners(blockName, injector, event, currentTarget!);\n  } else if (event.eventPhase === EventPhase.REPLAY) {\n    invokeListeners(event, currentTarget);\n  }\n}\n\nfunction hydrateAndInvokeBlockListeners(\n  blockName: string,\n  injector: Injector,\n  event: Event,\n  currentTarget: Element,\n) {\n  blockEventQueue.push({event, currentTarget});\n  triggerHydrationFromBlockName(injector, blockName, replayQueuedBlockEvents);\n}\n\nfunction replayQueuedBlockEvent   s(hydratedBlocks: string[]) {\n  // clone the queue\n  const queue = [...blockEventQueue];\n  const hydrated = new Set<string>(hydratedBlocks);\n  // empty it\n  blockEventQueue = [];\n  for (let {event, currentTarget} of queue) {\n    const blockName = currentTarget.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE)!;\n    if (hydrated.has(blockName)) {\n      invokeListeners(event, currentTarget);\n    } else {\n      // requeue events that weren't yet hydrated\n      blockEventQueue.push({event, currentTarget});\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ApplicationRef} from '../application/application_ref';\nimport {APP_ID} from '../application/application_tokens';\nimport {\n  DEFER_BLOCK_STATE as CURRENT_DEFER_BLOCK_STATE,\n  DeferBlockTrigger,\n  HydrateTriggerDetails,\n  TDeferBlockDetails,\n} from '../defer/interfaces';\nimport {getLDeferBlockDetails, getTDeferBlockDetails, isDeferBlock} from '../defer/utils';\nimport {isDetachedByI18n} from '../i18n/utils';\nimport {ViewEncapsulation} from '../metadata';\nimport {Renderer2} from '../render';\nimport {assertTNode} from '../render3/assert';\nimport {collectNativeNodes, collectNativeNodesInLContainer} from '../render3/collect_native_nodes';\nimport {getComponentDef} from '../render3/def_getters';\nimport {CONTAINER_HEADER_OFFSET, LContainer} from '../render3/interfaces/container';\nimport {isLetDeclaration, isTNodeShape, TNode, TNodeType} from '../render3/interfaces/node';\nimport {RComment, RElement} from '../render3/interfaces/renderer_dom';\nimport {\n  hasI18n,\n  isComponentHost,\n  isLContainer,\n  isProjectionTNode,\n  isRootView,\n} from '../render3/interfaces/type_checks';\nimport {\n  CONTEXT,\n  HEADER_OFFSET,\n  HOST,\n  INJECTOR,\n  LView,\n  PARENT,\n  RENDERER,\n  TView,\n  TVIEW,\n  TViewType,\n} from '../render3/interfaces/view';\nimport {unwrapLView, unwrapRNode} from '../render3/util/view_utils';\nimport {TransferState} from '../transfer_state';\n\nimport {\n  unsupportedProjectionOfDomNodes,\n  validateMatchingNode,\n  validateNodeExists,\n} from './error_handling';\nimport {collectDomEventsInfo} from './event_replay';\nimport {setJSActionAttributes} from '../event_delegation_utils';\nimport {\n  getOrComputeI18nChildren,\n  isI18nHydrationEnabled,\n  isI18nHydrationSupportEnabled,\n  trySerializeI18nBlock,\n} from './i18n';\nimport {\n  CONTAINERS,\n  DEFER_BLOCK_ID,\n  DEFER_BLOCK_STATE,\n  DEFER_HYDRATE_TRIGGERS,\n  DEFER_PARENT_BLOCK_ID,\n  DISCONNECTED_NODES,\n  ELEMENT_CONTAINERS,\n  I18N_DATA,\n  MULTIPLIER,\n  NODES,\n  NUM_ROOT_NODES,\n  SerializedContainerView,\n  SerializedDeferBlock,\n  SerializedTriggerDetails,\n  SerializedView,\n  TEMPLATE_ID,\n  TEMPLATES,\n} from './interfaces';\nimport {calcPathForNode, isDisconnectedNode} from './node_lookup_utils';\nimport {isInSkipHydrationBlock, SKIP_HYDRATION_ATTR_NAME} from './skip_hydration';\nimport {EVENT_REPLAY_ENABLED_DEFAULT, IS_EVENT_REPLAY_ENABLED} from './tokens';\nimport {\n  convertHydrateTriggersToJsAction,\n  getLNodeForHydration,\n  isIncrementalHydrationEnabled,\n  NGH_ATTR_NAME,\n  NGH_DATA_KEY,\n  NGH_DEFER_BLOCKS_KEY,\n  processTextNodeBeforeSerialization,\n  TextNodeMarker,\n} from './utils';\nimport {Injector} from '../di';\n\n/**\n * A collection that tracks all serialized views (`ngh` DOM annotations)\n * to avoid duplication. An attempt to add a duplicate view results in the\n * collection returning the index of the previously collected serialized view.\n * This reduces the number of annotations needed for a given page.\n */\nclass SerializedViewCollection {\n  private views: SerializedView[] = [];\n  private indexByContent = new Map<string, number>();\n\n  add(serializedView: SerializedView): number {\n    const viewAsString = JSON.stringify(serializedView);\n    if (!this.indexByContent.has(viewAsString)) {\n      const index = this.views.length;\n      this.views.push(serializedView);\n      this.indexByContent.set(viewAsString, index);\n      return index;\n    }\n    return this.indexByContent.get(viewAsString)!;\n  }\n\n  getAll(): SerializedView[] {\n    return this.views;\n  }\n}\n\n/**\n * Global counter that is used to generate a unique id for TViews\n * during the serialization process.\n */\nlet tViewSsrId = 0;\n\n/**\n * Generates a unique id for a given TView and returns this id.\n * The id is also stored on this instance of a TView and reused in\n * subsequent calls.\n *\n * This id is needed to uniquely identify and pick up dehydrated views\n * at runtime.\n */\nfunction getSsrId(tView: TView): string {\n  if (!tView.ssrId) {\n    tView.ssrId = `t${tViewSsrId++}`;\n  }\n  return tView.ssrId;\n}\n\n/**\n * Describes a context available during the serialization\n * process. The context is used to share and collect information\n * during the serialization.\n */\nexport interface HydrationContext {\n  serializedViewCollection: SerializedViewCollection;\n  corruptedTextNodes: Map<HTMLElement, TextNodeMarker>;\n  isI18nHydrationEnabled: boolean;\n  isIncrementalHydrationEnabled: boolean;\n  i18nChildren: Map<TView, Set<number> | null>;\n  eventTypesToReplay: {regular: Set<string>; capture: Set<string>};\n  shouldReplayEvents: boolean;\n  appId: string; // the value of `APP_ID`\n  deferBlocks: Map<string /* defer block id, e.g. `d0` */, SerializedDeferBlock>;\n}\n\n/**\n * Computes the number of root nodes in a given view\n * (or child nodes in a given container if a tNode is provided).\n */\nfunction calcNumRootNodes(tView: TView, lView: LView, tNode: TNode | null): number {\n  const rootNodes: unknown[] = [];\n  collectNativeNodes(tView, lView, tNode, rootNodes);\n  return rootNodes.length;\n}\n\n/**\n * Computes the number of root nodes in all views in a given LContainer.\n */\nfunction calcNumRootNodesInLContainer(lContainer: LContainer): number {\n  const rootNodes: unknown[] = [];\n  collectNativeNodesInLContainer(lContainer, rootNodes);\n  return rootNodes.length;\n}\n\n/**\n * Annotates root level component's LView for hydration,\n * see `annotateHostElementForHydration` for additional information.\n */\nfunction annotateComponentLViewForHydration(\n  lView: LView,\n  context: HydrationContext,\n  injector: Injector,\n): number | null {\n  const hostElement = lView[HOST];\n  // Root elements might also be annotated with the `ngSkipHydration` attribute,\n  // check if it's present before starting the serialization process.\n  if (hostElement && !(hostElement as HTMLElement).hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {\n    return annotateHostElementForHydration(hostElement as HTMLElement, lView, null, context);\n  }\n  return null;\n}\n\n/**\n * Annotates root level LContainer for hydration. This happens when a root component\n * injects ViewContainerRef, thus making the component an anchor for a view container.\n * This function serializes the component itself as well as all views from the view\n * container.\n */\nfunction annotateLContainerForHydration(\n  lContainer: LContainer,\n  context: HydrationContext,\n  injector: Injector,\n) {\n  const componentLView = unwrapLView(lContainer[HOST]) as LView<unknown>;\n\n  // Serialize the root component itself.\n  const componentLViewNghIndex = annotateComponentLViewForHydration(\n    componentLView,\n    context,\n    injector,\n  );\n\n  if (componentLViewNghIndex === null) {\n    // Component was not serialized (for example, if hydration was skipped by adding\n    // the `ngSkipHydration` attribute or this component uses i18n blocks in the template,\n    // but `withI18nSupport()` was not added), avoid annotating host element with the `ngh`\n    // attribute.\n    return;\n  }\n\n  const hostElement = unwrapRNode(componentLView[HOST]!) as HTMLElement;\n\n  // Serialize all views within this view container.\n  const rootLView = lContainer[PARENT];\n  const rootLViewNghIndex = annotateHostElementForHydration(hostElement, rootLView, null, context);\n\n  const renderer = componentLView[RENDERER] as Renderer2;\n\n  // For cases when a root component also acts as an anchor node for a ViewContainerRef\n  // (for example, when ViewContainerRef is injected in a root component), there is a need\n  // to serialize information about the component itself, as well as an LContainer that\n  // represents this ViewContainerRef. Effectively, we need to serialize 2 pieces of info:\n  // (1) hydration info for the root component itself and (2) hydration info for the\n  // ViewContainerRef instance (an LContainer). Each piece of information is included into\n  // the hydration data (in the TransferState object) separately, thus we end up with 2 ids.\n  // Since we only have 1 root element, we encode both bits of info into a single string:\n  // ids are separated by the `|` char (e.g. `10|25`, where `10` is the ngh for a component view\n  // and 25 is the `ngh` for a root view which holds LContainer).\n  const finalIndex = `${componentLViewNghIndex}|${rootLViewNghIndex}`;\n  renderer.setAttribute(hostElement, NGH_ATTR_NAME, finalIndex);\n}\n\n/**\n * Annotates all components bootstrapped in a given ApplicationRef\n * with info needed for hydration.\n *\n * @param appRef An instance of an ApplicationRef.\n * @param doc A reference to the current Document instance.\n * @return event types that need to be replayed\n */\nexport function annotateForHydration(appRef: ApplicationRef, doc: Document) {\n  const injector = appRef.injector;\n  const isI18nHydrationEnabledVal = isI18nHydrationEnabled(injector);\n  const isIncrementalHydrationEnabledVal = isIncrementalHydrationEnabled(injector);\n  const serializedViewCollection = new SerializedViewCollection();\n  const corruptedTextNodes = new Map<HTMLElement, TextNodeMarker>();\n  const viewRefs = appRef._views;\n  const shouldReplayEvents = injector.get(IS_EVENT_REPLAY_ENABLED, EVENT_REPLAY_ENABLED_DEFAULT);\n  const eventTypesToReplay = {\n    regular: new Set<string>(),\n    capture: new Set<string>(),\n  };\n  const deferBlocks = new Map<string, SerializedDeferBlock>();\n  const appId = appRef.injector.get(APP_ID);\n  for (const viewRef of viewRefs) {\n    const lNode = getLNodeForHydration(viewRef);\n\n    // An `lView` might be `null` if a `ViewRef` represents\n    // an embedded view (not a component view).\n    if (lNode !== null) {\n      const context: HydrationContext = {\n        serializedViewCollection,\n        corruptedTextNodes,\n        isI18nHydrationEnabled: isI18nHydrationEnabledVal,\n        isIncrementalHydrationEnabled: isIncrementalHydrationEnabledVal,\n        i18nChildren: new Map(),\n        eventTypesToReplay,\n        shouldReplayEvents,\n        appId,\n        deferBlocks,\n      };\n      if (isLContainer(lNode)) {\n        annotateLContainerForHydration(lNode, context, injector);\n      } else {\n        annotateComponentLViewForHydration(lNode, context, injector);\n      }\n      insertCorruptedTextNodeMarkers(corruptedTextNodes, doc);\n    }\n  }\n\n  // Note: we *always* include hydration info key and a corresponding value\n  // into the TransferState, even if the list of serialized views is empty.\n  // This is needed as a signal to the client that the server part of the\n  // hydration logic was setup and enabled correctly. Otherwise, if a client\n  // hydration doesn't find a key in the transfer state - an error is produced.\n  const serializedViews = serializedViewCollection.getAll();\n  const transferState = injector.get(TransferState);\n  transferState.set(NGH_DATA_KEY, serializedViews);\n\n  if (deferBlocks.size > 0) {\n    const blocks: {[key: string]: SerializedDeferBlock} = {};\n    for (const [id, info] of deferBlocks.entries()) {\n      blocks[id] = info;\n    }\n    transferState.set(NGH_DEFER_BLOCKS_KEY, blocks);\n  }\n\n  return eventTypesToReplay;\n}\n\n/**\n * Serializes the lContainer data into a list of SerializedView objects,\n * that represent views within this lContainer.\n *\n * @param lContainer the lContainer we are serializing\n * @param tNode the TNode that contains info about this LContainer\n * @param lView that hosts this LContainer\n * @param parentDeferBlockId the defer block id of the parent if it exists\n * @param context the hydration context\n * @returns an array of the `SerializedView` objects\n */\nfunction serializeLContainer(\n  lContainer: LContainer,\n  tNode: TNode,\n  lView: LView,\n  parentDeferBlockId: string | null,\n  context: HydrationContext,\n): SerializedContainerView[] {\n  const views: SerializedContainerView[] = [];\n  let lastViewAsString = '';\n\n  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {\n    let childLView = lContainer[i] as LView;\n\n    let template: string;\n    let numRootNodes: number;\n    let serializedView: SerializedContainerView | undefined;\n\n    if (isRootView(childLView)) {\n      // If this is a root view, get an LView for the underlying component,\n      // because it contains information about the view to serialize.\n      childLView = childLView[HEADER_OFFSET];\n\n      // If we have an LContainer at this position, this indicates that the\n      // host element was used as a ViewContainerRef anchor (e.g. a `ViewContainerRef`\n      // was injected within the component class). This case requires special handling.\n      if (isLContainer(childLView)) {\n        // Calculate the number of root nodes in all views in a given container\n        // and increment by one to account for an anchor node itself, i.e. in this\n        // scenario we'll have a layout that would look like this:\n        // `<app-root /><#VIEW1><#VIEW2>...<!--container-->`\n        // The `+1` is to capture the `<app-root />` element.\n        numRootNodes = calcNumRootNodesInLContainer(childLView) + 1;\n\n        annotateLContainerForHydration(childLView, context, lView[INJECTOR]);\n\n        const componentLView = unwrapLView(childLView[HOST]) as LView<unknown>;\n\n        serializedView = {\n          [TEMPLATE_ID]: componentLView[TVIEW].ssrId!,\n          [NUM_ROOT_NODES]: numRootNodes,\n        };\n      }\n    }\n\n    if (!serializedView) {\n      const childTView = childLView[TVIEW];\n\n      if (childTView.type === TViewType.Component) {\n        template = childTView.ssrId!;\n\n        // This is a component view, thus it has only 1 root node: the component\n        // host node itself (other nodes would be inside that host node).\n        numRootNodes = 1;\n      } else {\n        template = getSsrId(childTView);\n        numRootNodes = calcNumRootNodes(childTView, childLView, childTView.firstChild);\n      }\n\n      serializedView = {\n        [TEMPLATE_ID]: template,\n        [NUM_ROOT_NODES]: numRootNodes,\n      };\n\n      let isHydrateNeverBlock = false;\n\n      // If this is a defer block, serialize extra info.\n      if (isDeferBlock(lView[TVIEW], tNode)) {\n        const lDetails = getLDeferBlockDetails(lView, tNode);\n        const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);\n\n        if (context.isIncrementalHydrationEnabled && tDetails.hydrateTriggers !== null) {\n          const deferBlockId = `d${context.deferBlocks.size}`;\n\n          if (tDetails.hydrateTriggers.has(DeferBlockTrigger.Never)) {\n            isHydrateNeverBlock = true;\n          }\n\n          let rootNodes: any[] = [];\n          collectNativeNodesInLContainer(lContainer, rootNodes);\n\n          // Add defer block into info context.deferBlocks\n          const deferBlockInfo: SerializedDeferBlock = {\n            [NUM_ROOT_NODES]: rootNodes.length,\n            [DEFER_BLOCK_STATE]: lDetails[CURRENT_DEFER_BLOCK_STATE],\n          };\n\n          const serializedTriggers = serializeHydrateTriggers(tDetails.hydrateTriggers);\n          if (serializedTriggers.length > 0) {\n            deferBlockInfo[DEFER_HYDRATE_TRIGGERS] = serializedTriggers;\n          }\n\n          if (parentDeferBlockId !== null) {\n            // Serialize parent id only when it's present.\n            deferBlockInfo[DEFER_PARENT_BLOCK_ID] = parentDeferBlockId;\n          }\n\n          context.deferBlocks.set(deferBlockId, deferBlockInfo);\n\n          const node = unwrapRNode(lContainer);\n          if (node !== undefined) {\n            if ((node as Node).nodeType === Node.COMMENT_NODE) {\n              annotateDeferBlockAnchorForHydration(node as RComment, deferBlockId);\n            }\n          } else {\n            ngDevMode && validateNodeExists(node, childLView, tNode);\n            ngDevMode &&\n              validateMatchingNode(node, Node.COMMENT_NODE, null, childLView, tNode, true);\n\n            annotateDeferBlockAnchorForHydration(node as RComment, deferBlockId);\n          }\n\n          if (!isHydrateNeverBlock) {\n            // Add JSAction attributes for root nodes that use some hydration triggers\n            annotateDeferBlockRootNodesWithJsAction(tDetails, rootNodes, deferBlockId, context);\n          }\n\n          // Use current block id as parent for nested routes.\n          parentDeferBlockId = deferBlockId;\n\n          // Serialize extra info into the view object.\n          // TODO(incremental-hydration): this should be serialized and included at a different level\n          // (not at the view level).\n          serializedView[DEFER_BLOCK_ID] = deferBlockId;\n        }\n        // DEFER_BLOCK_STATE is used for reconciliation in hydration, both regular and incremental.\n        // We need to know which template is rendered when hydrating. So we serialize this state\n        // regardless of hydration type.\n        serializedView[DEFER_BLOCK_STATE] = lDetails[CURRENT_DEFER_BLOCK_STATE];\n      }\n\n      if (!isHydrateNeverBlock) {\n        Object.assign(\n          serializedView,\n          serializeLView(lContainer[i] as LView, parentDeferBlockId, context),\n        );\n      }\n    }\n\n    // Check if the previous view has the same shape (for example, it was\n    // produced by the *ngFor), in which case bump the counter on the previous\n    // view instead of including the same information again.\n    const currentViewAsString = JSON.stringify(serializedView);\n    if (views.length > 0 && currentViewAsString === lastViewAsString) {\n      const previousView = views[views.length - 1];\n      previousView[MULTIPLIER] ??= 1;\n      previousView[MULTIPLIER]++;\n    } else {\n      // Record this view as most recently added.\n      lastViewAsString = currentViewAsString;\n      views.push(serializedView);\n    }\n  }\n  return views;\n}\n\nfunction serializeHydrateTriggers(\n  triggerMap: Map<DeferBlockTrigger, HydrateTriggerDetails | null>,\n): (DeferBlockTrigger | SerializedTriggerDetails)[] {\n  const serializableDeferBlockTrigger = new Set<DeferBlockTrigger>([\n    DeferBlockTrigger.Idle,\n    DeferBlockTrigger.Immediate,\n    DeferBlockTrigger.Viewport,\n    DeferBlockTrigger.Timer,\n  ]);\n  let triggers: (DeferBlockTrigger | SerializedTriggerDetails)[] = [];\n  for (let [trigger, details] of triggerMap) {\n    if (serializableDeferBlockTrigger.has(trigger)) {\n      if (details === null) {\n        triggers.push(trigger);\n      } else {\n        triggers.push({trigger, delay: details.delay});\n      }\n    }\n  }\n  return triggers;\n}\n\n/**\n * Helper function to produce a node path (which navigation steps runtime logic\n * needs to take to locate a node) and stores it in the `NODES` section of the\n * current serialized view.\n */\nfunction appendSerializedNodePath(\n  ngh: SerializedView,\n  tNode: TNode,\n  lView: LView,\n  excludedParentNodes: Set<number> | null,\n) {\n  const noOffsetIndex = tNode.index - HEADER_OFFSET;\n  ngh[NODES] ??= {};\n  // Ensure we don't calculate the path multiple times.\n  ngh[NODES][noOffsetIndex] ??= calcPathForNode(tNode, lView, excludedParentNodes);\n}\n\n/**\n * Helper function to append information about a disconnected node.\n * This info is needed at runtime to avoid DOM lookups for this element\n * and instead, the element would be created from scratch.\n */\nfunction appendDisconnectedNodeIndex(ngh: SerializedView, tNodeOrNoOffsetIndex: TNode | number) {\n  const noOffsetIndex =\n    typeof tNodeOrNoOffsetIndex === 'number'\n      ? tNodeOrNoOffsetIndex\n      : tNodeOrNoOffsetIndex.index - HEADER_OFFSET;\n  ngh[DISCONNECTED_NODES] ??= [];\n  if (!ngh[DISCONNECTED_NODES].includes(noOffsetIndex)) {\n    ngh[DISCONNECTED_NODES].push(noOffsetIndex);\n  }\n}\n\n/**\n * Serializes the lView data into a SerializedView object that will later be added\n * to the TransferState storage and referenced using the `ngh` attribute on a host\n * element.\n *\n * @param lView the lView we are serializing\n * @param context the hydration context\n * @returns the `SerializedView` object containing the data to be added to the host node\n */\nfunction serializeLView(\n  lView: LView,\n  parentDeferBlockId: string | null = null,\n  context: HydrationContext,\n): SerializedView {\n  const ngh: SerializedView = {};\n  const tView = lView[TVIEW];\n  const i18nChildren = getOrComputeI18nChildren(tView, context);\n  const nativeElementsToEventTypes = context.shouldReplayEvents\n    ? collectDomEventsInfo(tView, lView, context.eventTypesToReplay)\n    : null;\n  // Iterate over DOM element references in an LView.\n  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {\n    const tNode = tView.data[i];\n    const noOffsetIndex = i - HEADER_OFFSET;\n\n    // Attempt to serialize any i18n data for the given slot. We do this first, as i18n\n    // has its own process for serialization.\n    const i18nData = trySerializeI18nBlock(lView, i, context);\n    if (i18nData) {\n      ngh[I18N_DATA] ??= {};\n      ngh[I18N_DATA][noOffsetIndex] = i18nData.caseQueue;\n\n      for (const nodeNoOffsetIndex of i18nData.disconnectedNodes) {\n        appendDisconnectedNodeIndex(ngh, nodeNoOffsetIndex);\n      }\n\n      for (const nodeNoOffsetIndex of i18nData.disjointNodes) {\n        const tNode = tView.data[nodeNoOffsetIndex + HEADER_OFFSET] as TNode;\n        ngDevMode && assertTNode(tNode);\n        appendSerializedNodePath(ngh, tNode, lView, i18nChildren);\n      }\n\n      continue;\n    }\n\n    // Skip processing of a given slot in the following cases:\n    // - Local refs (e.g. <div #localRef>) take up an extra slot in LViews\n    //   to store the same element. In this case, there is no information in\n    //   a corresponding slot in TNode data structure.\n    // - When a slot contains something other than a TNode. For example, there\n    //   might be some metadata information about a defer block or a control flow block.\n    if (!isTNodeShape(tNode)) {\n      continue;\n    }\n\n    // Skip any nodes that are in an i18n block but are considered detached (i.e. not\n    // present in the template). These nodes are disconnected from the DOM tree, and\n    // so we don't want to serialize any information about them.\n    if (isDetachedByI18n(tNode)) {\n      continue;\n    }\n\n    // Check if a native node that represents a given TNode is disconnected from the DOM tree.\n    // Such nodes must be excluded from the hydration (since the hydration won't be able to\n    // find them), so the TNode ids are collected and used at runtime to skip the hydration.\n    //\n    // This situation may happen during the content projection, when some nodes don't make it\n    // into one of the content projection slots (for example, when there is no default\n    // <ng-content /> slot in projector component's template).\n    if (isDisconnectedNode(tNode, lView) && isContentProjectedNode(tNode)) {\n      appendDisconnectedNodeIndex(ngh, tNode);\n      continue;\n    }\n\n    if (Array.isArray(tNode.projection)) {\n      for (const projectionHeadTNode of tNode.projection) {\n        // We may have `null`s in slots with no projected content.\n        if (!projectionHeadTNode) continue;\n\n        if (!Array.isArray(projectionHeadTNode)) {\n          // If we process re-projected content (i.e. `<ng-content>`\n          // appears at projection location), skip annotations for this content\n          // since all DOM nodes in this projection were handled while processing\n          // a parent lView, which contains those nodes.\n          if (\n            !isProjectionTNode(projectionHeadTNode) &&\n            !isInSkipHydrationBlock(projectionHeadTNode)\n          ) {\n            if (isDisconnectedNode(projectionHeadTNode, lView)) {\n              // Check whether this node is connected, since we may have a TNode\n              // in the data structure as a projection segment head, but the\n              // content projection slot might be disabled (e.g.\n              // <ng-content *ngIf=\"false\" />).\n              appendDisconnectedNodeIndex(ngh, projectionHeadTNode);\n            } else {\n              appendSerializedNodePath(ngh, projectionHeadTNode, lView, i18nChildren);\n            }\n          }\n        } else {\n          // If a value is an array, it means that we are processing a projection\n          // where projectable nodes were passed in as DOM nodes (for example, when\n          // calling `ViewContainerRef.createComponent(CmpA, {projectableNodes: [...]})`).\n          //\n          // In this scenario, nodes can come from anywhere (either created manually,\n          // accessed via `document.querySelector`, etc) and may be in any state\n          // (attached or detached from the DOM tree). As a result, we can not reliably\n          // restore the state for such cases during hydration.\n\n          throw unsupportedProjectionOfDomNodes(unwrapRNode(lView[i]));\n        }\n      }\n    }\n\n    conditionallyAnnotateNodePath(ngh, tNode, lView, i18nChildren);\n    if (isLContainer(lView[i])) {\n      // Serialize information about a template.\n      const embeddedTView = tNode.tView;\n      if (embeddedTView !== null) {\n        ngh[TEMPLATES] ??= {};\n        ngh[TEMPLATES][noOffsetIndex] = getSsrId(embeddedTView);\n      }\n\n      // Serialize views within this LContainer.\n      const hostNode = lView[i][HOST]!; // host node of this container\n\n      // LView[i][HOST] can be of 2 different types:\n      // - either a DOM node\n      // - or an array that represents an LView of a component\n      if (Array.isArray(hostNode)) {\n        // This is a component, serialize info about it.\n        const targetNode = unwrapRNode(hostNode as LView) as RElement;\n        if (!(targetNode as HTMLElement).hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {\n          annotateHostElementForHydration(\n            targetNode,\n            hostNode as LView,\n            parentDeferBlockId,\n            context,\n          );\n        }\n      }\n\n      ngh[CONTAINERS] ??= {};\n      ngh[CONTAINERS][noOffsetIndex] = serializeLContainer(\n        lView[i],\n        tNode,\n        lView,\n        parentDeferBlockId,\n        context,\n      );\n    } else if (Array.isArray(lView[i]) && !isLetDeclaration(tNode)) {\n      // This is a component, annotate the host node with an `ngh` attribute.\n      // Note: Let declarations that return an array are also storing an array in the LView,\n      // we need to exclude them.\n      const targetNode = unwrapRNode(lView[i][HOST]!);\n      if (!(targetNode as HTMLElement).hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {\n        annotateHostElementForHydration(\n          targetNode as RElement,\n          lView[i],\n          parentDeferBlockId,\n          context,\n        );\n      }\n    } else {\n      // <ng-container> case\n      if (tNode.type & TNodeType.ElementContainer) {\n        // An <ng-container> is represented by the number of\n        // top-level nodes. This information is needed to skip over\n        // those nodes to reach a corresponding anchor node (comment node).\n        ngh[ELEMENT_CONTAINERS] ??= {};\n        ngh[ELEMENT_CONTAINERS][noOffsetIndex] = calcNumRootNodes(tView, lView, tNode.child);\n      } else if (tNode.type & (TNodeType.Projection | TNodeType.LetDeclaration)) {\n        // Current TNode represents an `<ng-content>` slot or `@let` declaration,\n        // thus it has no DOM elements associated with it, so the **next sibling**\n        // node would not be able to find an anchor. In this case, use full path instead.\n        let nextTNode = tNode.next;\n        // Skip over all `<ng-content>` slots and `@let` declarations in a row.\n        while (\n          nextTNode !== null &&\n          nextTNode.type & (TNodeType.Projection | TNodeType.LetDeclaration)\n        ) {\n          nextTNode = nextTNode.next;\n        }\n        if (nextTNode && !isInSkipHydrationBlock(nextTNode)) {\n          // Handle a tNode after the `<ng-content>` slot.\n          appendSerializedNodePath(ngh, nextTNode, lView, i18nChildren);\n        }\n      } else if (tNode.type & TNodeType.Text) {\n        const rNode = unwrapRNode(lView[i]);\n        processTextNodeBeforeSerialization(context, rNode);\n      }\n    }\n\n    // Attach `jsaction` attribute to elements that have registered listeners,\n    // thus potentially having a need to do an event replay.\n    if (nativeElementsToEventTypes && tNode.type & TNodeType.Element) {\n      const nativeElement = unwrapRNode(lView[i]) as Element;\n      if (nativeElementsToEventTypes.has(nativeElement)) {\n        setJSActionAttributes(\n          nativeElement,\n          nativeElementsToEventTypes.get(nativeElement)!,\n          parentDeferBlockId,\n        );\n      }\n    }\n  }\n  return ngh;\n}\n\n/**\n * Serializes node location in cases when it's needed, specifically:\n *\n *  1. If `tNode.projectionNext` is different from `tNode.next` - it means that\n *     the next `tNode` after projection is different from the one in the original\n *     template. Since hydration relies on `tNode.next`, this serialized info\n *     is required to help runtime code find the node at the correct location.\n *  2. In certain content projection-based use-cases, it's possible that only\n *     a content of a projected element is rendered. In this case, content nodes\n *     require an extra annotation, since runtime logic can't rely on parent-child\n *     connection to identify the location of a node.\n */\nfunction conditionallyAnnotateNodePath(\n  ngh: SerializedView,\n  tNode: TNode,\n  lView: LView<unknown>,\n  excludedParentNodes: Set<number> | null,\n) {\n  if (isProjectionTNode(tNode)) {\n    // Do not annotate projection nodes (<ng-content />), since\n    // they don't have a corresponding DOM node representing them.\n    return;\n  }\n\n  // Handle case #1 described above.\n  if (\n    tNode.projectionNext &&\n    tNode.projectionNext !== tNode.next &&\n    !isInSkipHydrationBlock(tNode.projectionNext)\n  ) {\n    appendSerializedNodePath(ngh, tNode.projectionNext, lView, excludedParentNodes);\n  }\n\n  // Handle case #2 described above.\n  // Note: we only do that for the first node (i.e. when `tNode.prev === null`),\n  // the rest of the nodes would rely on the current node location, so no extra\n  // annotation is needed.\n  if (\n    tNode.prev === null &&\n    tNode.parent !== null &&\n    isDisconnectedNode(tNode.parent, lView) &&\n    !isDisconnectedNode(tNode, lView)\n  ) {\n    appendSerializedNodePath(ngh, tNode, lView, excludedParentNodes);\n  }\n}\n\n/**\n * Determines whether a component instance that is represented\n * by a given LView uses `ViewEncapsulation.ShadowDom`.\n */\nfunction componentUsesShadowDomEncapsulation(lView: LView): boolean {\n  const instance = lView[CONTEXT];\n  return instance?.constructor\n    ? getComponentDef(instance.constructor)?.encapsulation === ViewEncapsulation.ShadowDom\n    : false;\n}\n\n/**\n * Annotates component host element for hydration:\n * - by either adding the `ngh` attribute and collecting hydration-related info\n *   for the serialization and transferring to the client\n * - or by adding the `ngSkipHydration` attribute in case Angular detects that\n *   component contents is not compatible with hydration.\n *\n * @param element The Host element to be annotated\n * @param lView The associated LView\n * @param context The hydration context\n * @returns An index of serialized view from the transfer state object\n *          or `null` when a given component can not be serialized.\n */\nfunction annotateHostElementForHydration(\n  element: RElement,\n  lView: LView,\n  parentDeferBlockId: string | null,\n  context: HydrationContext,\n): number | null {\n  const renderer = lView[RENDERER];\n  if (\n    (hasI18n(lView) && !isI18nHydrationSupportEnabled()) ||\n    componentUsesShadowDomEncapsulation(lView)\n  ) {\n    // Attach the skip hydration attribute if this component:\n    // - either has i18n blocks, since hydrating such blocks is not yet supported\n    // - or uses ShadowDom view encapsulation, since Domino doesn't support\n    //   shadow DOM, so we can not guarantee that client and server representations\n    //   would exactly match\n    renderer.setAttribute(element, SKIP_HYDRATION_ATTR_NAME, '');\n    return null;\n  } else {\n    const ngh = serializeLView(lView, parentDeferBlockId, context);\n    const index = context.serializedViewCollection.add(ngh);\n    renderer.setAttribute(element, NGH_ATTR_NAME, index.toString());\n    return index;\n  }\n}\n\n/**\n * Annotates defer block comment node for hydration:\n *\n * @param comment The Host element to be annotated\n * @param deferBlockId the id of the target defer block\n */\nfunction annotateDeferBlockAnchorForHydration(comment: RComment, deferBlockId: string): void {\n  comment.textContent = `ngh=${deferBlockId}`;\n}\n\n/**\n * Physically inserts the comment nodes to ensure empty text nodes and adjacent\n * text node separators are preserved after server serialization of the DOM.\n * These get swapped back for empty text nodes or separators once hydration happens\n * on the client.\n *\n * @param corruptedTextNodes The Map of text nodes to be replaced with comments\n * @param doc The document\n */\nfunction insertCorruptedTextNodeMarkers(\n  corruptedTextNodes: Map<HTMLElement, string>,\n  doc: Document,\n) {\n  for (const [textNode, marker] of corruptedTextNodes) {\n    textNode.after(doc.createComment(marker));\n  }\n}\n\n/**\n * Detects whether a given TNode represents a node that\n * is being content projected.\n */\nfunction isContentProjectedNode(tNode: TNode): boolean {\n  let currentTNode = tNode;\n  while (currentTNode != null) {\n    // If we come across a component host node in parent nodes -\n    // this TNode is in the content projection section.\n    if (isComponentHost(currentTNode)) {\n      return true;\n    }\n    currentTNode = currentTNode.parent as TNode;\n  }\n  return false;\n}\n\n/**\n * Incremental hydration requires that any defer block root node\n * with interaction or hover triggers have all of their root nodes\n * trigger hydration with those events. So we need to make sure all\n * the root nodes of that block have the proper jsaction attribute\n * to ensure hydration is triggered, since the content is dehydrated\n */\nfunction annotateDeferBlockRootNodesWithJsAction(\n  tDetails: TDeferBlockDetails,\n  rootNodes: any[],\n  parentDeferBlockId: string,\n  context: HydrationContext,\n) {\n  const actionList = convertHydrateTriggersToJsAction(tDetails.hydrateTriggers);\n  for (let et of actionList) {\n    context.eventTypesToReplay.regular.add(et);\n  }\n\n  if (actionList.length > 0) {\n    const elementNodes = (rootNodes as HTMLElement[]).filter(\n      (rn) => rn.nodeType === Node.ELEMENT_NODE,\n    );\n    for (let rNode of elementNodes) {\n      setJSActionAttributes(rNode, actionList, parentDeferBlockId);\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {APP_BOOTSTRAP_LISTENER, ApplicationRef} from '../application/application_ref';\nimport {Console} from '../console';\nimport {\n  ENVIRONMENT_INITIALIZER,\n  EnvironmentProviders,\n  Injector,\n  makeEnvironmentProviders,\n  Provider,\n} from '../di';\nimport {inject} from '../di/injector_compatibility';\nimport {formatRuntimeError, RuntimeError, RuntimeErrorCode} from '../errors';\nimport {enableLocateOrCreateContainerRefImpl} from '../linker/view_container_ref';\nimport {enableLocateOrCreateI18nNodeImpl} from '../render3/i18n/i18n_apply';\nimport {enableLocateOrCreateElementNodeImpl} from '../render3/instructions/element';\nimport {enableLocateOrCreateElementContainerNodeImpl} from '../render3/instructions/element_container';\nimport {enableApplyRootElementTransformImpl} from '../render3/instructions/shared';\nimport {enableLocateOrCreateContainerAnchorImpl} from '../render3/instructions/template';\nimport {enableLocateOrCreateTextNodeImpl} from '../render3/instructions/text';\nimport {getDocument} from '../render3/interfaces/document';\nimport {TransferState} from '../transfer_state';\nimport {performanceMarkFeature} from '../util/performance';\nimport {NgZone} from '../zone';\nimport {withEventReplay} from './event_replay';\n\nimport {cleanupDehydratedViews} from './cleanup';\nimport {\n  enableClaimDehydratedIcuCaseImpl,\n  enablePrepareI18nBlockForHydrationImpl,\n  setIsI18nHydrationSupportEnabled,\n} from './i18n';\nimport {\n  IS_HYDRATION_DOM_REUSE_ENABLED,\n  IS_I18N_HYDRATION_ENABLED,\n  IS_INCREMENTAL_HYDRATION_ENABLED,\n  PRESERVE_HOST_CONTENT,\n} from './tokens';\nimport {\n  appendDeferBlocksToJSActionMap,\n  countBlocksSkippedByHydration,\n  enableRetrieveDeferBlockDataImpl,\n  enableRetrieveHydrationInfoImpl,\n  isIncrementalHydrationEnabled,\n  NGH_DATA_KEY,\n  processBlockData,\n  verifySsrContentsIntegrity,\n} from './utils';\nimport {enableFindMatchingDehydratedViewImpl} from './views';\nimport {DEHYDRATED_BLOCK_REGISTRY, DehydratedBlockRegistry} from '../defer/registry';\nimport {gatherDeferBlocksCommentNodes} from './node_lookup_utils';\nimport {processAndInitTriggers} from '../defer/triggering';\n\n/**\n * Indicates whether the hydration-related code was added,\n * prevents adding it multiple times.\n */\nlet isHydrationSupportEnabled = false;\n\n/**\n * Indicates whether the i18n-related code was added,\n * prevents adding it multiple times.\n *\n * Note: This merely controls whether the code is loaded,\n * while `setIsI18nHydrationSupportEnabled` determines\n * whether i18n blocks are serialized or hydrated.\n */\nlet isI18nHydrationRuntimeSupportEnabled = false;\n\n/**\n * Indicates whether the incremental hydration code was added,\n * prevents adding it multiple times.\n */\nlet isIncrementalHydrationRuntimeSupportEnabled = false;\n\n/**\n * Defines a period of time that Angular waits for the `ApplicationRef.isStable` to emit `true`.\n * If there was no event with the `true` value during this time, Angular reports a warning.\n */\nconst APPLICATION_IS_STABLE_TIMEOUT = 10_000;\n\n/**\n * Brings the necessary hydration code in tree-shakable manner.\n * The code is only present when the `provideClientHydration` is\n * invoked. Otherwise, this code is tree-shaken away during the\n * build optimization step.\n *\n * This technique allows us to swap implementations of methods so\n * tree shaking works appropriately when hydration is disabled or\n * enabled. It brings in the appropriate version of the method that\n * supports hydration only when enabled.\n */\nfunction enableHydrationRuntimeSupport() {\n  if (!isHydrationSupportEnabled) {\n    isHydrationSupportEnabled = true;\n    enableRetrieveHydrationInfoImpl();\n    enableLocateOrCreateElementNodeImpl();\n    enableLocateOrCreateTextNodeImpl();\n    enableLocateOrCreateElementContainerNodeImpl();\n    enableLocateOrCreateContainerAnchorImpl();\n    enableLocateOrCreateContainerRefImpl();\n    enableFindMatchingDehydratedViewImpl();\n    enableApplyRootElementTransformImpl();\n  }\n}\n\n/**\n * Brings the necessary i18n hydration code in tree-shakable manner.\n * Similar to `enableHydrationRuntimeSupport`, the code is only\n * present when `withI18nSupport` is invoked.\n */\nfunction enableI18nHydrationRuntimeSupport() {\n  if (!isI18nHydrationRuntimeSupportEnabled) {\n    isI18nHydrationRuntimeSupportEnabled = true;\n    enableLocateOrCreateI18nNodeImpl();\n    enablePrepareI18nBlockForHydrationImpl();\n    enableClaimDehydratedIcuCaseImpl();\n  }\n}\n\n/**\n * Brings the necessary incremental hydration code in tree-shakable manner.\n * Similar to `enableHydrationRuntimeSupport`, the code is only\n * present when `enableIncrementalHydrationRuntimeSupport` is invoked.\n */\nfunction enableIncrementalHydrationRuntimeSupport() {\n  if (!isIncrementalHydrationRuntimeSupportEnabled) {\n    isIncrementalHydrationRuntimeSupportEnabled = true;\n    enableRetrieveDeferBlockDataImpl();\n  }\n}\n\n/**\n * Outputs a message with hydration stats into a console.\n */\nfunction printHydrationStats(injector: Injector) {\n  const console = injector.get(Console);\n  const message =\n    `Angular hydrated ${ngDevMode!.hydratedComponents} component(s) ` +\n    `and ${ngDevMode!.hydratedNodes} node(s), ` +\n    `${ngDevMode!.componentsSkippedHydration} component(s) were skipped. ` +\n    (isIncrementalHydrationEnabled(injector)\n      ? `${ngDevMode!.deferBlocksWithIncrementalHydration} defer block(s) were configured to use incremental hydration. `\n      : '') +\n    `Learn more at https://angular.dev/guide/hydration.`;\n  // tslint:disable-next-line:no-console\n  console.log(message);\n}\n\n/**\n * Returns a Promise that is resolved when an application becomes stable.\n */\nfunction whenStableWithTimeout(appRef: ApplicationRef): Promise<void> {\n  const whenStablePromise = appRef.whenStable();\n  if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n    const timeoutTime = APPLICATION_IS_STABLE_TIMEOUT;\n    const console = appRef.injector.get(Console);\n    const ngZone = appRef.injector.get(NgZone);\n\n    // The following call should not and does not prevent the app to become stable\n    // We cannot use RxJS timer here because the app would remain unstable.\n    // This also avoids an extra change detection cycle.\n    const timeoutId = ngZone.runOutsideAngular(() => {\n      return setTimeout(() => logWarningOnStableTimedout(timeoutTime, console), timeoutTime);\n    });\n\n    whenStablePromise.finally(() => clearTimeout(timeoutId));\n  }\n\n  return whenStablePromise;\n}\n\n/**\n * Defines a name of an attribute that is added to the <body> tag\n * in the `index.html` file in case a given route was configured\n * with `RenderMode.Client`. 'cm' is an abbreviation for \"Client Mode\".\n */\nexport const CLIENT_RENDER_MODE_FLAG = 'ngcm';\n\n/**\n * Checks whether the `RenderMode.Client` was defined for the current route.\n */\nfunction isClientRenderModeEnabled(): boolean {\n  const doc = getDocument();\n  return (\n    (typeof ngServerMode === 'undefined' || !ngServerMode) &&\n    doc.body.hasAttribute(CLIENT_RENDER_MODE_FLAG)\n  );\n}\n\n/**\n * Returns a set of providers required to setup hydration support\n * for an application that is server side rendered. This function is\n * included into the `provideClientHydration` public API function from\n * the `platform-browser` package.\n *\n * The function sets up an internal flag that would be recognized during\n * the server side rendering time as well, so there is no need to\n * configure or change anything in NgUniversal to enable the feature.\n */\nexport function withDomHydration(): EnvironmentProviders {\n  const providers: Provider[] = [\n    {\n      provide: IS_HYDRATION_DOM_REUSE_ENABLED,\n      useFactory: () => {\n        let isEnabled = true;\n        if (typeof ngServerMode === 'undefined' || !ngServerMode) {\n          // On the client, verify that the server response contains\n          // hydration annotations. Otherwise, keep hydration disabled.\n          const transferState = inject(TransferState, {optional: true});\n          isEnabled = !!transferState?.get(NGH_DATA_KEY, null);\n        }\n        if (isEnabled) {\n          performanceMarkFeature('NgHydration');\n        }\n        return isEnabled;\n      },\n    },\n    {\n      provide: ENVIRONMENT_INITIALIZER,\n      useValue: () => {\n        // i18n support is enabled by calling withI18nSupport(), but there's\n        // no way to turn it off (e.g. for tests), so we turn it off by default.\n        setIsI18nHydrationSupportEnabled(false);\n\n        if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n          // Since this function is used across both server and client,\n          // make sure that the runtime code is only added when invoked\n          // on the client (see the `enableHydrationRuntimeSupport` function\n          // call below).\n          return;\n        }\n\n        if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {\n          verifySsrContentsIntegrity(getDocument());\n          enableHydrationRuntimeSupport();\n        } else if (typeof ngDevMode !== 'undefined' && ngDevMode && !isClientRenderModeEnabled()) {\n          const console = inject(Console);\n          const message = formatRuntimeError(\n            RuntimeErrorCode.MISSING_HYDRATION_ANNOTATIONS,\n            'Angular hydration was requested on the client, but there was no ' +\n              'serialized information present in the server response, ' +\n              'thus hydration was not enabled. ' +\n              'Make sure the `provideClientHydration()` is included into the list ' +\n              'of providers in the server part of the application configuration.',\n          );\n          console.warn(message);\n        }\n      },\n      multi: true,\n    },\n  ];\n\n  if (typeof ngServerMode === 'undefined' || !ngServerMode) {\n    providers.push(\n      {\n        provide: PRESERVE_HOST_CONTENT,\n        useFactory: () => {\n          // Preserve host element content only in a browser\n          // environment and when hydration is configured properly.\n          // On a server, an application is rendered from scratch,\n          // so the host content needs to be empty.\n          return inject(IS_HYDRATION_DOM_REUSE_ENABLED);\n        },\n      },\n      {\n        provide: APP_BOOTSTRAP_LISTENER,\n        useFactory: () => {\n          if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {\n            const appRef = inject(ApplicationRef);\n\n            return () => {\n              // Wait until an app becomes stable and cleanup all views that\n              // were not claimed during the application bootstrap process.\n              // The timing is similar to when we start the serialization process\n              // on the server.\n              //\n              // Note: the cleanup task *MUST* be scheduled within the Angular zone in Zone apps\n              // to ensure that change detection is properly run afterward.\n              whenStableWithTimeout(appRef).then(() => {\n                // Note: we have to check whether the application is destroyed before\n                // performing other operations with the `injector`.\n                // The application may be destroyed **before** it becomes stable, so when\n                // the `whenStableWithTimeout` resolves, the injector might already be in\n                // a destroyed state. Thus, calling `injector.get` would throw an error\n                // indicating that the injector has already been destroyed.\n                if (appRef.destroyed) {\n                  return;\n                }\n\n                cleanupDehydratedViews(appRef);\n                if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n                  countBlocksSkippedByHydration(appRef.injector);\n                  printHydrationStats(appRef.injector);\n                }\n              });\n            };\n          }\n          return () => {}; // noop\n        },\n        multi: true,\n      },\n    );\n  }\n\n  return makeEnvironmentProviders(providers);\n}\n\n/**\n * Returns a set of providers required to setup support for i18n hydration.\n * Requires hydration to be enabled separately.\n */\nexport function withI18nSupport(): Provider[] {\n  return [\n    {\n      provide: IS_I18N_HYDRATION_ENABLED,\n      useFactory: () => inject(IS_HYDRATION_DOM_REUSE_ENABLED),\n    },\n    {\n      provide: ENVIRONMENT_INITIALIZER,\n      useValue: () => {\n        if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {\n          enableI18nHydrationRuntimeSupport();\n          setIsI18nHydrationSupportEnabled(true);\n          performanceMarkFeature('NgI18nHydration');\n        }\n      },\n      multi: true,\n    },\n  ];\n}\n\n/**\n * Returns a set of providers required to setup support for incremental hydration.\n * Requires hydration to be enabled separately.\n * Enabling incremental hydration also enables event replay for the entire app.\n *\n * @developerPreview\n */\nexport function withIncrementalHydration(): Provider[] {\n  const providers: Provider[] = [\n    withEventReplay(),\n    {\n      provide: IS_INCREMENTAL_HYDRATION_ENABLED,\n      useValue: true,\n    },\n    {\n      provide: DEHYDRATED_BLOCK_REGISTRY,\n      useClass: DehydratedBlockRegistry,\n    },\n    {\n      provide: ENVIRONMENT_INITIALIZER,\n      useValue: () => {\n        enableIncrementalHydrationRuntimeSupport();\n        performanceMarkFeature('NgIncrementalHydration');\n      },\n      multi: true,\n    },\n  ];\n\n  if (typeof ngServerMode === 'undefined' || !ngServerMode) {\n    providers.push({\n      provide: APP_BOOTSTRAP_LISTENER,\n      useFactory: () => {\n        const injector = inject(Injector);\n        const doc = getDocument();\n\n        return () => {\n          const deferBlockData = processBlockData(injector);\n          const commentsByBlockId = gatherDeferBlocksCommentNodes(doc, doc.body);\n          processAndInitTriggers(injector, deferBlockData, commentsByBlockId);\n          appendDeferBlocksToJSActionMap(doc, injector);\n        };\n      },\n      multi: true,\n    });\n  }\n\n  return providers;\n}\n\n/**\n *\n * @param time The time in ms until the stable timedout warning message is logged\n */\nfunction logWarningOnStableTimedout(time: number, console: Console): void {\n  const message =\n    `Angular hydration expected the ApplicationRef.isStable() to emit \\`true\\`, but it ` +\n    `didn't happen within ${time}ms. Angular hydration logic depends on the application becoming stable ` +\n    `as a signal to complete hydration process.`;\n\n  console.warn(formatRuntimeError(RuntimeErrorCode.HYDRATION_STABLE_TIMEDOUT, message));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Transforms a value (typically a string) to a boolean.\n * Intended to be used as a transform function of an input.\n *\n *  @usageNotes\n *  ```ts\n *  @Input({ transform: booleanAttribute }) status!: boolean;\n *  ```\n * @param value Value to be transformed.\n *\n * @publicApi\n */\nexport function booleanAttribute(value: unknown): boolean {\n  return typeof value === 'boolean' ? value : value != null && value !== 'false';\n}\n\n/**\n * Transforms a value (typically a string) to a number.\n * Intended to be used as a transform function of an input.\n * @param value Value to be transformed.\n * @param fallbackValue Value to use if the provided value can't be parsed as a number.\n *\n *  @usageNotes\n *  ```ts\n *  @Input({ transform: numberAttribute }) id!: number;\n *  ```\n *\n * @publicApi\n */\nexport function numberAttribute(value: unknown, fallbackValue = NaN): number {\n  // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,\n  // and other non-number values as NaN, where Number just uses 0) but it considers the string\n  // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.\n  const isNumberValue = !isNaN(parseFloat(value as any)) && !isNaN(Number(value));\n  return isNumberValue ? Number(value) : fallbackValue;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport const PERFORMANCE_MARK_PREFIX = '🅰️';\n\nlet enablePerfLogging = false;\n\n/**\n * Function that will start measuring against the performance API\n * Should be used in pair with stopMeasuring\n */\nexport function startMeasuring<T>(label: string): void {\n  if (!enablePerfLogging) {\n    return;\n  }\n\n  const {startLabel} = labels(label);\n  /* tslint:disable:ban */\n  performance.mark(startLabel);\n  /* tslint:enable:ban */\n}\n\n/**\n * Function that will stop measuring against the performance API\n * Should be used in pair with stopMeasuring\n */\nexport function stopMeasuring(label: string): void {\n  if (!enablePerfLogging) {\n    return;\n  }\n\n  const {startLabel, labelName, endLabel} = labels(label);\n  /* tslint:disable:ban */\n  performance.mark(endLabel);\n  performance.measure(labelName, startLabel, endLabel);\n  performance.clearMarks(startLabel);\n  performance.clearMarks(endLabel);\n  /* tslint:enable:ban */\n}\n\nexport function labels(label: string) {\n  const labelName = `${PERFORMANCE_MARK_PREFIX}:${label}`;\n  return {\n    labelName,\n    startLabel: `start:${labelName}`,\n    endLabel: `end:${labelName}`,\n  };\n}\n\nlet warningLogged = false;\n/**\n * This enables an internal performance profiler\n *\n * It should not be imported in application code\n */\nexport function enableProfiling() {\n  if (\n    !warningLogged &&\n    (typeof performance === 'undefined' || !performance.mark || !performance.measure)\n  ) {\n    warningLogged = true;\n    console.warn('Performance API is not supported on this platform');\n    return;\n  }\n\n  enablePerfLogging = true;\n}\nexport function disableProfiling() {\n  enablePerfLogging = false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {untracked as untrackedPrimitive} from '../../../primitives/signals';\n\n/**\n * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function\n * can, optionally, return a value.\n */\nexport function untracked<T>(nonReactiveReadsFn: () => T): T {\n  return untrackedPrimitive(nonReactiveReadsFn);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {createComputed, SIGNAL} from '../../../primitives/signals';\n\nimport {Signal, ValueEqualityFn} from './api';\n\n/**\n * Options passed to the `computed` creation function.\n */\nexport interface CreateComputedOptions<T> {\n  /**\n   * A comparison function which defines equality for computed values.\n   */\n  equal?: ValueEqualityFn<T>;\n\n  /**\n   * A debug name for the computed signal. Used in Angular DevTools to identify the signal.\n   */\n  debugName?: string;\n}\n\n/**\n * Create a computed `Signal` which derives a reactive value from an expression.\n */\nexport function computed<T>(computation: () => T, options?: CreateComputedOptions<T>): Signal<T> {\n  const getter = createComputed(computation, options?.equal);\n\n  if (ngDevMode) {\n    getter.toString = () => `[Computed: ${getter()}]`;\n    getter[SIGNAL].debugName = options?.debugName;\n  }\n\n  return getter;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {createWatch, Watch, WatchCleanupRegisterFn} from '@angular/core/primitives/signals';\n\nimport {ChangeDetectorRef} from '../../change_detection/change_detector_ref';\nimport {Injector} from '../../di/injector';\nimport {inject} from '../../di/injector_compatibility';\nimport {ɵɵdefineInjectable} from '../../di/interface/defs';\nimport {ErrorHandler} from '../../error_handler';\nimport type {ViewRef} from '../view_ref';\nimport {DestroyRef} from '../../linker/destroy_ref';\nimport {FLAGS, LViewFlags, EFFECTS_TO_SCHEDULE} from '../interfaces/view';\n\nimport type {CreateEffectOptions, EffectCleanupRegisterFn, EffectRef} from './effect';\nimport {type SchedulableEffect, ZoneAwareEffectScheduler} from './root_effect_scheduler';\nimport {performanceMarkFeature} from '../../util/performance';\nimport {assertNotInReactiveContext} from './asserts';\nimport {assertInInjectionContext} from '../../di';\nimport {PendingTasksInternal} from '../../pending_tasks';\n\nexport class MicrotaskEffectScheduler extends ZoneAwareEffectScheduler {\n  private readonly pendingTasks = inject(PendingTasksInternal);\n  private taskId: number | null = null;\n\n  override schedule(effect: SchedulableEffect): void {\n    // Check whether there are any pending effects _before_ queueing in the base class.\n    super.schedule(effect);\n    if (this.taskId === null) {\n      this.taskId = this.pendingTasks.add();\n      queueMicrotask(() => this.flush());\n    }\n  }\n\n  override flush(): void {\n    try {\n      super.flush();\n    } finally {\n      if (this.taskId !== null) {\n        this.pendingTasks.remove(this.taskId);\n        this.taskId = null;\n      }\n    }\n  }\n\n  /** @nocollapse */\n  static ɵprov = /** @pureOrBreakMyCode */ /* @__PURE__ */ ɵɵdefineInjectable({\n    token: MicrotaskEffectScheduler,\n    providedIn: 'root',\n    factory: () => new MicrotaskEffectScheduler(),\n  });\n}\n\n/**\n * Core reactive node for an Angular effect.\n *\n * `EffectHandle` combines the reactive graph's `Watch` base node for effects with the framework's\n * scheduling abstraction (`MicrotaskEffectScheduler`) as well as automatic cleanup via `DestroyRef`\n * if available/requested.\n */\nclass EffectHandle implements EffectRef, SchedulableEffect {\n  unregisterOnDestroy: (() => void) | undefined;\n  readonly watcher: Watch;\n\n  constructor(\n    private scheduler: MicrotaskEffectScheduler,\n    private effectFn: (onCleanup: EffectCleanupRegisterFn) => void,\n    public zone: Zone | null,\n    destroyRef: DestroyRef | null,\n    private injector: Injector,\n    allowSignalWrites: boolean,\n  ) {\n    this.watcher = createWatch(\n      (onCleanup) => this.runEffect(onCleanup),\n      () => this.schedule(),\n      allowSignalWrites,\n    );\n    this.unregisterOnDestroy = destroyRef?.onDestroy(() => this.destroy());\n  }\n\n  private runEffect(onCleanup: WatchCleanupRegisterFn): void {\n    try {\n      this.effectFn(onCleanup);\n    } catch (err) {\n      // Inject the `ErrorHandler` here in order to avoid circular DI error\n      // if the effect is used inside of a custom `ErrorHandler`.\n      const errorHandler = this.injector.get(ErrorHandler, null, {optional: true});\n      errorHandler?.handleError(err);\n    }\n  }\n\n  run(): void {\n    this.watcher.run();\n  }\n\n  private schedule(): void {\n    this.scheduler.schedule(this);\n  }\n\n  destroy(): void {\n    this.watcher.destroy();\n    this.unregisterOnDestroy?.();\n\n    // Note: if the effect is currently scheduled, it's not un-scheduled, and so the scheduler will\n    // retain a reference to it. Attempting to execute it will be a no-op.\n  }\n}\n\n// Just used for the name for the debug error below.\nfunction effect() {}\n\n/**\n * Create a global `Effect` for the given reactive function.\n */\nexport function microtaskEffect(\n  effectFn: (onCleanup: EffectCleanupRegisterFn) => void,\n  options?: CreateEffectOptions,\n): EffectRef {\n  ngDevMode &&\n    assertNotInReactiveContext(\n      effect,\n      'Call `effect` outside of a reactive context. For example, schedule the ' +\n        'effect inside the component constructor.',\n    );\n\n  !options?.injector && assertInInjectionContext(effect);\n\n  const injector = options?.injector ?? inject(Injector);\n  const destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;\n\n  const handle = new EffectHandle(\n    injector.get(MicrotaskEffectScheduler),\n    effectFn,\n    typeof Zone === 'undefined' ? null : Zone.current,\n    destroyRef,\n    injector,\n    options?.allowSignalWrites ?? false,\n  );\n\n  // Effects need to be marked dirty manually to trigger their initial run. The timing of this\n  // marking matters, because the effects may read signals that track component inputs, which are\n  // only available after those components have had their first update pass.\n  //\n  // We inject `ChangeDetectorRef` optionally, to determine whether this effect is being created in\n  // the context of a component or not. If it is, then we check whether the component has already\n  // run its update pass, and defer the effect's initial scheduling until the update pass if it\n  // hasn't already run.\n  const cdr = injector.get(ChangeDetectorRef, null, {optional: true}) as ViewRef<unknown> | null;\n  if (!cdr || !(cdr._lView[FLAGS] & LViewFlags.FirstLViewPass)) {\n    // This effect is either not running in a view injector, or the view has already\n    // undergone its first change detection pass, which is necessary for any required inputs to be\n    // set.\n    handle.watcher.notify();\n  } else {\n    // Delay the initialization of the effect until the view is fully initialized.\n    (cdr._lView[EFFECTS_TO_SCHEDULE] ??= []).push(handle.watcher.notify);\n  }\n\n  return handle;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  REACTIVE_NODE,\n  ReactiveNode,\n  SIGNAL,\n  consumerAfterComputation,\n  consumerBeforeComputation,\n  consumerDestroy,\n  consumerPollProducersForChange,\n  isInNotificationPhase,\n} from '../../../primitives/signals';\nimport {FLAGS, LViewFlags, LView, EFFECTS} from '../interfaces/view';\nimport {markAncestorsForTraversal} from '../util/view_utils';\nimport {inject} from '../../di/injector_compatibility';\nimport {performanceMarkFeature} from '../../util/performance';\nimport {Injector} from '../../di/injector';\nimport {assertNotInReactiveContext} from './asserts';\nimport {assertInInjectionContext} from '../../di/contextual';\nimport {DestroyRef, NodeInjectorDestroyRef} from '../../linker/destroy_ref';\nimport {ViewContext} from '../view_context';\nimport {noop} from '../../util/noop';\nimport {\n  ChangeDetectionScheduler,\n  NotificationSource,\n} from '../../change_detection/scheduling/zoneless_scheduling';\nimport {setIsRefreshingViews} from '../state';\nimport {EffectScheduler, SchedulableEffect} from './root_effect_scheduler';\nimport {USE_MICROTASK_EFFECT_BY_DEFAULT} from './patch';\nimport {microtaskEffect} from './microtask_effect';\n\nlet useMicrotaskEffectsByDefault = USE_MICROTASK_EFFECT_BY_DEFAULT;\nimport {emitEffectCreatedEvent, setInjectorProfilerContext} from '../debug/injector_profiler';\n\n/**\n * Toggle the flag on whether to use microtask effects (for testing).\n */\nexport function setUseMicrotaskEffectsByDefault(value: boolean): boolean {\n  const prev = useMicrotaskEffectsByDefault;\n  useMicrotaskEffectsByDefault = value;\n  return prev;\n}\n\n/**\n * A global reactive effect, which can be manually destroyed.\n *\n * @developerPreview\n */\nexport interface EffectRef {\n  /**\n   * Shut down the effect, removing it from any upcoming scheduled executions.\n   */\n  destroy(): void;\n}\n\nexport class EffectRefImpl implements EffectRef {\n  [SIGNAL]: EffectNode;\n\n  constructor(node: EffectNode) {\n    this[SIGNAL] = node;\n  }\n\n  destroy(): void {\n    this[SIGNAL].destroy();\n  }\n}\n\n/**\n * Options passed to the `effect` function.\n *\n * @developerPreview\n */\nexport interface CreateEffectOptions {\n  /**\n   * The `Injector` in which to create the effect.\n   *\n   * If this is not provided, the current [injection context](guide/di/dependency-injection-context)\n   * will be used instead (via `inject`).\n   */\n  injector?: Injector;\n\n  /**\n   * Whether the `effect` should require manual cleanup.\n   *\n   * If this is `false` (the default) the effect will automatically register itself to be cleaned up\n   * with the current `DestroyRef`.\n   */\n  manualCleanup?: boolean;\n\n  /**\n   * Always create a root effect (which is scheduled as a microtask) regardless of whether `effect`\n   * is called within a component.\n   */\n  forceRoot?: true;\n\n  /**\n   * @deprecated no longer required, signal writes are allowed by default.\n   */\n  allowSignalWrites?: boolean;\n\n  /**\n   * A debug name for the effect. Used in Angular DevTools to identify the effect.\n   */\n  debugName?: string;\n}\n\n/**\n * An effect can, optionally, register a cleanup function. If registered, the cleanup is executed\n * before the next effect run. The cleanup function makes it possible to \"cancel\" any work that the\n * previous effect run might have started.\n *\n * @developerPreview\n */\nexport type EffectCleanupFn = (   ) => void;\n\n/**\n * A callback passed to the effect function that makes it possible to register cleanup logic.\n *\n * @developerPreview\n */\nexport type EffectCleanupRegisterFn = (cleanupFn: EffectCleanupFn) => void;\n\n/**\n * Registers an \"effect\" that will be scheduled & executed whenever the signals that it reads\n * changes.\n *\n * Angular has two different kinds of effect: component effects and root effects. Component effects\n * are created when `effect()` is called from a component, directive, or within a service of a\n * component/directive. Root effects are created when `effect()` is called from outside the\n * component tree, such as in a root service, or when the `forceRoot` option is provided.\n *\n * The two effect types differ in their timing. Component effects run as a component lifecycle\n * event during Angular's synchronization (change detection) process, and can safely read input\n * signals or create/destroy views that depend on component state. Root effects run as microtasks\n * and have no connection to the component tree or change detection.\n *\n * `effect()` must be run in injection context, unless the `injector` option is manually specified.\n *\n * @developerPreview\n */\nexport function effect(\n  effectFn: (onCleanup: EffectCleanupRegisterFn) => void,\n  options?: CreateEffectOptions,\n): EffectRef {\n  if (useMicrotaskEffectsByDefault) {\n    if (ngDevMode && options?.forceRoot) {\n      throw new Error(`Cannot use 'forceRoot' option with microtask effects on`);\n    }\n\n    return microtaskEffect(effectFn, options);\n  }\n\n  ngDevMode &&\n    assertNotInReactiveContext(\n      effect,\n      'Call `effect` outside of a reactive context. For example, schedule the ' +\n        'effect inside the component constructor.',\n    );\n\n  !options?.injector && assertInInjectionContext(effect);\n\n  if (ngDevMode && options?.allowSignalWrites !== undefined) {\n    console.warn(\n      `The 'allowSignalWrites' flag is deprecated and no longer impacts effect() (writes are always allowed)`,\n    );\n  }\n\n  const injector = options?.injector ?? inject(Injector);\n  let destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;\n\n  let node: EffectNode;\n\n  const viewContext = injector.get(ViewContext, null, {optional: true});\n  const notifier = injector.get(ChangeDetectionScheduler);\n  if (viewContext !== null && !options?.forceRoot) {\n    // This effect was created in the context of a view, and will be associated with the view.\n    node = createViewEffect(viewContext.view, notifier, effectFn);\n    if (destroyRef instanceof NodeInjectorDestroyRef && destroyRef._lView === viewContext.view) {\n      // The effect is being created in the same view as the `DestroyRef` references, so it will be\n      // automatically destroyed without the need for an explicit `DestroyRef` registration.\n      destroyRef = null;\n    }\n  } else {\n    // This effect was created outside the context of a view, and will be scheduled independently.\n    node = createRootEffect(effectFn, injector.get(EffectScheduler), notifier);\n  }\n  node.injector = injector;\n\n  if (destroyRef !== null) {\n    // If we need to register for cleanup, do that here.\n    node.onDestroyFn = destroyRef.onDestroy(() => node.destroy());\n  }\n\n  const effectRef = new EffectRefImpl(node);\n\n  if (ngDevMode) {\n    node.debugName = options?.debugName ?? '';\n    const prevInjectorProfilerContext = setInjectorProfilerContext({injector, token: null});\n    try {\n      emitEffectCreatedEvent(effectRef);\n    } finally {\n      setInjectorProfilerContext(prevInjectorProfilerContext);\n    }\n  }\n\n  return effectRef;\n}\n\nexport interface EffectNode extends ReactiveNode, SchedulableEffect {\n  hasRun: boolean;\n  cleanupFns: EffectCleanupFn[] | undefined;\n  injector: Injector;\n  notifier: ChangeDetectionScheduler;\n\n  onDestroyFn: () => void;\n  fn: (cleanupFn: EffectCleanupRegisterFn) => void;\n  run(): void;\n  destroy(): void;\n  maybeCleanup(): void;\n}\n\nexport interface ViewEffectNode extends EffectNode {\n  view: LView;\n}\n\nexport interface RootEffectNode extends EffectNode {\n  scheduler: EffectScheduler;\n}\n\nexport const BASE_EFFECT_NODE: Omit<EffectNode, 'fn' | 'destroy' | 'injector' | 'notifier'> =\n  /* @__PURE__ */ (() => ({\n    ...REACTIVE_NODE,\n    consumerIsAlwaysLive: true,\n    consumerAllowSignalWrites: true,\n    dirty: true,\n    hasRun: false,\n    cleanupFns: undefined,\n    zone: null,\n    kind: 'effect',\n    onDestroyFn: noop,\n    run(this: EffectNode): void {\n      this.dirty = false;\n\n      if (ngDevMode && isInNotificationPhase()) {\n        throw new Error(`Schedulers cannot synchronously execute watches while scheduling.`);\n      }\n\n      if (this.hasRun && !consumerPollProducersForChange(this)) {\n        return;\n      }\n      this.hasRun = true;\n\n      const registerCleanupFn: EffectCleanupRegisterFn = (cleanupFn) =>\n        (this.cleanupFns ??= []).push(cleanupFn);\n\n      const prevNode = consumerBeforeComputation(this);\n\n      // We clear `setIsRefreshingViews` so that `markForCheck()` within the body of an effect will\n      // cause CD to reach the component in question.\n      const prevRefreshingViews = setIsRefreshingViews(false);\n      try {\n        this.maybeCleanup();\n        this.fn(registerCleanupFn);\n      } finally {\n        setIsRefreshingViews(prevRefreshingViews);\n        consumerAfterComputation(this, prevNode);\n      }\n    },\n\n    maybeCleanup(this: EffectNode): void {\n      if (!this.cleanupFns?.length) {\n        return;\n      }\n      try {\n        // Attempt to run the cleanup functions. Regardless of failure or success, we consider\n        // cleanup \"completed\" and clear the list for the next run of the effect. Note that an error\n        // from the cleanup function will still crash the current run of the effect.\n        while (this.cleanupFns.length) {\n          this.cleanupFns.pop()!();\n        }\n      } finally {\n        this.cleanupFns = [];\n      }\n    },\n  }))();\n\nexport const ROOT_EFFECT_NODE: Omit<RootEffectNode, 'fn' | 'scheduler' | 'notifier' | 'injector'> =\n  /* @__PURE__ */ (() => ({\n    ...BASE_EFFECT_NODE,\n    consumerMarkedDirty(this: RootEffectNode) {\n      this.scheduler.schedule(this);\n      this.notifier.notify(NotificationSource.RootEffect);\n    },\n    destroy(this: RootEffectNode) {\n      consumerDestroy(this);\n      this.onDestroyFn();\n      this.maybeCleanup();\n      this.scheduler.remove(this);\n    },\n  }))();\n\nexport const VIEW_EFFECT_NODE: Omit<ViewEffectNode, 'fn' | 'view' | 'injector' | 'notifier'> =\n  /* @__PURE__ */ (() => ({\n    ...BASE_EFFECT_NODE,\n    consumerMarkedDirty(this: ViewEffectNode): void {\n      this.view[FLAGS] |= LViewFlags.HasChildViewsToRefresh;\n      markAncestorsForTraversal(this.view);\n      this.notifier.notify(NotificationSource.ViewEffect);\n    },\n    destroy(this: ViewEffectNode): void {\n      consumerDestroy(this);\n      this.onDestroyFn();\n      this.maybeCleanup();\n      this.view[EFFECTS]?.delete(this);\n    },\n  }))();\n\nexport function createViewEffect(\n  view: LView,\n  notifier: ChangeDetectionScheduler,\n  fn: (onCleanup: EffectCleanupRegisterFn) => void,\n): ViewEffectNode {\n  const node = Object.create(VIEW_EFFECT_NODE) as ViewEffectNode;\n  node.view = view;\n  node.zone = typeof Zone !== 'undefined' ? Zone.current : null;\n  node.notifier = notifier;\n  node.fn = fn;\n\n  view[EFFECTS] ??= new Set();\n  view[EFFECTS].add(node);\n\n  node.consumerMarkedDirty(node);\n  return node;\n}\n\nexport function createRootEffect(\n  fn: (onCleanup: EffectCleanupRegisterFn) => void,\n  scheduler: EffectScheduler,\n  notifier: ChangeDetectionScheduler,\n): RootEffectNode {\n  const node = Object.create(ROOT_EFFECT_NODE) as RootEffectNode;\n  node.fn = fn;\n  node.scheduler = scheduler;\n  node.notifier = notifier;\n  node.zone = typeof Zone !== 'undefined' ? Zone.current : null;\n  node.scheduler.schedule(node);\n  node.notifier.notify(NotificationSource.RootEffect);\n  return node;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {Signal, ValueEqualityFn} from '../render3/reactivity/api';\nimport {WritableSignal} from '../render3/reactivity/signal';\n\n/**\n * Status of a `Resource`.\n *\n * @experimental\n */\nexport enum ResourceStatus {\n  /**\n   * The resource has no valid request and will not perform any loading.\n   *\n   * `value()` will be `undefined`.\n   */\n  Idle,\n\n  /**\n   * Loading failed with an error.\n   *\n   * `value()` will be `undefined`.\n   */\n  Error,\n\n  /**\n   * The resource is currently loading a new value as a result of a change in its `request`.\n   *\n   * `value()` will be `undefined`.\n   */\n  Loading,\n\n  /**\n   * The resource is currently reloading a fresh value for the same request.\n   *\n   * `value()` will continue to return the previously fetched value during the reloading operation.\n   */\n  Reloading,\n\n  /**\n   * Loading has completed and the resource has the value returned from the loader.\n   */\n  Resolved,\n\n  /**\n   * The resource's value was set locally via `.set()` or `.update()`.\n   */\n  Local,\n}\n\n/**\n * A Resource is an asynchronous dependency (for example, the results of an API call) that is\n * managed and delivered through signals.\n *\n * The usual way of creating a `Resource` is through the `resource` function, but various other APIs\n * may present `Resource` instances to describe their own concepts.\n *\n * @experimental\n */\nexport interface Resource<T> {\n  /**\n   * The current value of the `Resource`, or `undefined` if there is no current value.\n   */\n  readonly value: Signal<T>;\n\n  /**\n   * The current status of the `Resource`, which describes what the resource is currently doing and\n   * what can be expected of its `value`.\n   */\n  readonly status: Signal<ResourceStatus>;\n\n  /**\n   * When in the `error` state, this returns the last known error from the `Resource`.\n   */\n  readonly error: Signal<unknown>;\n\n  /**\n   * Whether this resource is loading a new value (or reloading the existing one).\n   */\n  readonly isLoading: Signal<boolean>;\n\n  /**\n   * Whether this resource has a valid current value.\n   *\n   * This function is reactive.\n   */\n  hasValue(): this is Resource<Exclude<T, undefined>>;\n\n  /**\n   * Instructs the resource to re-load any asynchronous dependency it may have.\n   *\n   * Note that the resource will not enter its reloading state until the actual backend request is\n   * made.\n   *\n   * @returns true if a reload was initiated, false if a reload was unnecessary or unsupported\n   */\n  reload(): boolean;\n}\n\n/**\n * A `Resource` with a mutable value.\n *\n * Overwriting the value of a resource sets it to the 'local' state.\n *\n * @experimental\n */\nexport interface WritableResource<T> extends Resource<T> {\n  readonly value: WritableSignal<T>;\n  hasValue(): this is WritableResource<Exclude<T, undefined>>;\n\n  /**\n   * Convenience wrapper for `value.set`.\n   */\n  set(value: T): void;\n\n  /**\n   * Convenience wrapper for `value.update`.\n   */\n  update(updater: (value: T) => T): void;\n  asReadonly(): Resource<T>;\n}\n\n/**\n * A `WritableResource` created through the `resource` function.\n *\n * @experimental\n */\nexport interface ResourceRef<T> extends WritableResource<T> {\n  hasValue(): this is ResourceRef<Exclude<T, undefined>>;\n\n  /**\n   * Manually destroy the resource, which cancels pending requests and returns it to `idle` state.\n   */\n  destroy(): void;\n}\n\n/**\n * Parameter to a `ResourceLoader` which gives the request and other options for the current loading\n * operation.\n *\n * @experimental\n */\nexport interface ResourceLoaderParams<R> {\n  request: Exclude<NoInfer<R>, undefined>;\n  abortSignal: AbortSignal;\n  previous: {\n    status: ResourceStatus;\n  };\n}\n\n/**\n * Loading function for a `Resource`.\n *\n * @experimental\n */\nexport type ResourceLoader<T, R> = (param: ResourceLoaderParams<R>) => PromiseLike<T>;\n\n/**\n * Streaming loader for a `Resource`.\n *\n * @experimental\n */\nexport type ResourceStreamingLoader<T, R> = (\n  param: ResourceLoaderParams<R>,\n) => PromiseLike<Signal<ResourceStreamItem<T>>>;\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @experimental\n */\nexport interface BaseResourceOptions<T, R> {\n  /**\n   * A reactive function which determines the request to be made. Whenever the request changes, the\n   * loader will be triggered to fetch a new value for the resource.\n   *\n   * If a request function isn't provided, the loader won't rerun unless the resource is reloaded.\n   */\n  request?: () => R;\n\n  /**\n   * The value which will be returned from the resource when a server value is unavailable, such as\n   * when the resource is still loading, or in an error state.\n   */\n  defaultValue?: NoInfer<T>;\n\n  /**\n   * Equality function used to compare the return value of the loader.\n   */\n  equal?: ValueEqualityFn<T>;\n\n  /**\n   * Overrides the `Injector` used by `resource`.\n   */\n  injector?: Injector;\n}\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @experimental\n */\nexport interface PromiseResourceOptions<T, R> extends BaseResourceOptions<T, R> {\n  /**\n   * Loading function which returns a `Promise` of the resource's value for a given request.\n   */\n  loader: ResourceLoader<T, R>;\n\n  /**\n   * Cannot specify `stream` and `loader` at the same time.\n   */\n  stream?: never;\n}\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @experimental\n */\nexport interface StreamingResourceOptions<T, R> extends BaseResourceOptions<T, R> {\n  /**\n   * Loading function which returns a `Promise` of a signal of the resource's value for a given\n   * request, which can change over time as new values are received from a stream.\n   */\n  stream: ResourceStreamingLoader<T, R>;\n\n  /**\n   * Cannot specify `stream` and `loader` at the same time.\n   */\n  loader?: never;\n}\n\n/**\n * @experimental\n */\nexport type ResourceOptions<T, R> = PromiseResourceOptions<T, R> | StreamingResourceOptions<T, R>;\n\n/**\n * @experimental\n */\nexport type ResourceStreamItem<T> = {value: T} | {error: unknown};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ComputationFn,\n  createLinkedSignal,\n  LinkedSignalGetter,\n  LinkedSignalNode,\n  linkedSignalSetFn,\n  linkedSignalUpdateFn,\n  SIGNAL,\n} from '../../../primitives/signals';\nimport {Signal, ValueEqualityFn} from './api';\nimport {signalAsReadonlyFn, WritableSignal} from './signal';\n\nconst identityFn = <T>(v: T) => v;\n\n/**\n * Creates a writable signal whose value is initialized and reset by the linked, reactive computation.\n *\n * @developerPreview\n */\nexport function linkedSignal<D>(\n  computation: () => D,\n  options?: {equal?: ValueEqualityFn<NoInfer<D>>},\n): WritableSignal<D>;\n\n/**\n * Creates a writable signal whose value is initialized and reset by the linked, reactive computation.\n * This is an advanced API form where the computation has access to the previous value of the signal and the computation result.\n *\n * Note: The computation is reactive, meaning the linked signal will automatically update whenever any of the signals used within the computation change.\n *\n * @developerPreview\n */\nexport function linkedSignal<S, D>(options: {\n  source: () => S;\n  computation: (source: NoInfer<S>, previous?: {source: NoInfer<S>; value: NoInfer<D>}) => D;\n  equal?: ValueEqualityFn<NoInfer<D>>;\n}): WritableSignal<D>;\n\nexport function linkedSignal<S, D>(\n  optionsOrComputation:\n    | {\n        source: () => S;\n        computation: ComputationFn<S, D>;\n        equal?: ValueEqualityFn<D>;\n      }\n    | (() => D),\n  options?: {equal?: ValueEqualityFn<D>},\n): WritableSignal<D> {\n  if (typeof optionsOrComputation === 'function') {\n    const getter = createLinkedSignal<D, D>(\n      optionsOrComputation,\n      identityFn<D>,\n      options?.equal,\n    ) as LinkedSignalGetter<D, D> & WritableSignal<D>;\n    return upgradeLinkedSignalGetter(getter);\n  } else {\n    const getter = createLinkedSignal<S, D>(\n      optionsOrComputation.source,\n      optionsOrComputation.computation,\n      optionsOrComputation.equal,\n    );\n    return upgradeLinkedSignalGetter(getter);\n  }\n}\n\nfunction upgradeLinkedSignalGetter<S, D>(getter: LinkedSignalGetter<S, D>): WritableSignal<D> {\n  if (ngDevMode) {\n    getter.toString = () => `[LinkedSignal: ${getter()}]`;\n  }\n\n  const node = getter[SIGNAL] as LinkedSignalNode<S, D>;\n  const upgradedGetter = getter as LinkedSignalGetter<S, D> & WritableSignal<D>;\n\n  upgradedGetter.set = (newValue: D) => linkedSignalSetFn(node, newValue);\n  upgradedGetter.update = (updateFn: (value: D) => D) => linkedSignalUpdateFn(node, updateFn);\n  upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter as any) as () => Signal<D>;\n\n  return upgradedGetter;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {untracked} from '../render3/reactivity/untracked';\nimport {computed} from '../render3/reactivity/computed';\nimport {signal, signalAsReadonlyFn, WritableSignal} from '../render3/reactivity/signal';\nimport {Signal} from '../render3/reactivity/api';\nimport {effect, EffectRef} from '../render3/reactivity/effect';\nimport {\n  ResourceOptions,\n  ResourceStatus,\n  WritableResource,\n  Resource,\n  ResourceRef,\n  ResourceStreamingLoader,\n  StreamingResourceOptions,\n  ResourceStreamItem,\n} from './api';\n\nimport {ValueEqualityFn} from '../../primitives/signals';\n\nimport {Injector} from '../di/injector';\nimport {assertInInjectionContext} from '../di/contextual';\nimport {inject} from '../di/injector_compatibility';\nimport {PendingTasks} from '../pending_tasks';\nimport {linkedSignal} from '../render3/reactivity/linked_signal';\nimport {DestroyRef} from '../linker/destroy_ref';\n\n/**\n * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by\n * a loader function, which exposes the result of the loading operation via signals.\n *\n * Note that `resource` is intended for _read_ operations, not operations which perform mutations.\n * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new\n * request object becomes available, which could prematurely abort mutations.\n *\n * @experimental\n */\nexport function resource<T, R>(\n  options: ResourceOptions<T, R> & {defaultValue: NoInfer<T>},\n): ResourceRef<T>;\n\n/**\n * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by\n * a loader function, which exposes the result of the loading operation via signals.\n *\n * Note that `resource` is intended for _read_ operations, not operations which perform mutations.\n * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new\n * request object becomes available, which could prematurely abort mutations.\n *\n * @experimental\n */\nexport function resource<T, R>(options: ResourceOptions<T, R>): ResourceRef<T | undefined>;\nexport function resource<T, R>(options: ResourceOptions<T, R>): ResourceRef<T | undefined> {\n  options?.injector || assertInInjectionContext(resource);\n  const request = (options.request ?? (() => null)) as () => R;\n  return new ResourceImpl<T | undefined, R>(\n    request,\n    getLoader(options),\n    options.defaultValue,\n    options.equal ? wrapEqualityFn(options.equal) : undefined,\n    options.injector ?? inject(Injector),\n  );\n}\n\ntype ResourceInternalStatus =\n  | ResourceStatus.Idle\n  | ResourceStatus.Loading\n  | ResourceStatus.Resolved\n  | ResourceStatus.Local;\n\n/**\n * Internal state of a resource.\n */\ninterface ResourceProtoState<T> {\n  extRequest: WrappedRequest;\n\n  // For simplicity, status is internally tracked as a subset of the public status enum.\n  // Reloading and Error statuses are projected from Loading and Resolved based on other state.\n  status: ResourceInternalStatus;\n}\n\ninterface ResourceState<T> extends ResourceProtoState<T> {\n  previousStatus: ResourceStatus;\n  stream: Signal<ResourceStreamItem<T>> | undefined;\n}\n\ntype WrappedRequest = {request: unknown; reload: number};\n\n/**\n * Base class which implements `.value` as a `WritableSignal` by delegating `.set` and `.update`.\n */\nabstract class BaseWritableResource<T> implements WritableResource<T> {\n  readonly value: WritableSignal<T>;\n  abstract readonly status: Signal<ResourceStatus>;\n  abstract readonly error: Signal<unknown>;\n  abstract reload(): boolean;\n\n  constructor(value: Signal<T>) {\n    this.value = value as WritableSignal<T>;\n    this.value.set = this.set.bind(this);\n    this.value.update = this.update.bind(this);\n    this.value.asReadonly = signalAsReadonlyFn;\n  }\n\n  abstract set(value: T): void;\n\n  update(updateFn: (value: T) => T): void {\n    this.set(updateFn(untracked(this.value)));\n  }\n\n  readonly isLoading = computed(\n    () => this.status() === ResourceStatus.Loading || this.status() === ResourceStatus.Reloading,\n  );\n\n  hasValue(): this is ResourceRef<Exclude<T, undefined>> {\n    return this.value() !== undefined;\n  }\n\n  asReadonly(): Resource<T> {\n    return this;\n  }\n}\n\n/**\n * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state.\n */\nexport class ResourceImpl<T, R> extends BaseWritableResource<T> implements ResourceRef<T> {\n  private readonly pendingTasks: PendingTasks;\n\n  /**\n   * The current state of the resource. Status, value, and error are derived from this.\n   */\n  private readonly state: WritableSignal<ResourceState<T>>;\n\n  /**\n   * Combines the current request with a reload counter which allows the resource to be reloaded on\n   * imperative command.\n   */\n  protected readonly extRequest: WritableSignal<WrappedRequest>;\n  private readonly effectRef: EffectRef;\n\n  private pendingController: AbortController | undefined;\n  private resolvePendingTask: (() => void) | undefined = undefined;\n  private destroyed = false;\n\n  constructor(\n    request: () => R,\n    private readonly loaderFn: ResourceStreamingLoader<T, R>,\n    private readonly defaultValue: T,\n    private readonly equal: ValueEqualityFn<T> | undefined,\n    injector: Injector,\n  ) {\n    super(\n      // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a\n      // `WritableSignal` that delegates to `ResourceImpl.set`.\n      computed(\n        () => {\n          const streamValue = this.state().stream?.();\n          return streamValue && isResolved(streamValue) ? streamValue.value : this.defaultValue;\n        },\n        {equal},\n      ),\n    );\n\n    // Extend `request()` to include a writable reload signal.\n    this.extRequest = linkedSignal({\n      source: request,\n      computation: (request) => ({request, reload: 0}),\n    });\n\n    // The main resource state is managed in a `linkedSignal`, which allows the resource to change\n    // state instantaneously when the request signal changes.\n    this.state = linkedSignal<WrappedRequest, ResourceState<T>>({\n      // Whenever the request changes,\n      source: this.extRequest,\n      // Compute the state of the resource given a change in status.\n      computation: (extRequest, previous) => {\n        const status =\n          extRequest.request === undefined ? ResourceStatus.Idle : ResourceStatus.Loading;\n        if (!previous) {\n          return {\n            extRequest,\n            status,\n            previousStatus: ResourceStatus.Idle,\n            stream: undefined,\n          };\n        } else {\n          return {\n            extRequest,\n            status,\n            previousStatus: projectStatusOfState(previous.value),\n            // If the request hasn't changed, keep the previous stream.\n            stream:\n              previous.value.extRequest.request === extRequest.request\n                ? previous.value.stream\n                : undefined,\n          };\n        }\n      },\n    });\n\n    this.effectRef = effect(this.loadEffect.bind(this), {\n      injector,\n      manualCleanup: true,\n    });\n\n    this.pendingTasks = injector.get(PendingTasks);\n\n    // Cancel any pending request when the resource itself is destroyed.\n    injector.get(DestroyRef).onDestroy(() => this.destroy());\n  }\n\n  override readonly status = computed(() => projectStatusOfState(this.state()));\n\n  override readonly error = computed(() => {\n    const stream = this.state().stream?.();\n    return stream && !isResolved(stream) ? stream.error : undefined;\n  });\n\n  /**\n   * Called either directly via `WritableResource.set` or via `.value.set()`.\n   */\n  override set(value: T): void {\n    if (this.destroyed) {\n      return;\n    }\n\n    const current = untracked(this.value);\n    const state = untracked(this.state);\n\n    if (\n      state.status === ResourceStatus.Local &&\n      (this.equal ? this.equal(current, value) : current === value)\n    ) {\n      return;\n    }\n\n    // Enter Local state with the user-defined value.\n    this.state.set({\n      extRequest: state.extRequest,\n      status: ResourceStatus.Local,\n      previousStatus: ResourceStatus.Local,\n      stream: signal({value}),\n    });\n\n    // We're departing from whatever state the resource was in previously, so cancel any in-progress\n    // loading operations.\n    this.abortInProgressLoad();\n  }\n\n  override reload(): boolean {\n    // We don't want to restart in-progress loads.\n    const {status} = untracked(this.state);\n    if (status === ResourceStatus.Idle || status === ResourceStatus.Loading) {\n      return false;\n    }\n\n    // Increment the request reload to trigger the `state` linked signal to switch us to `Reload`\n    this.extRequest.update(({request, reload}) => ({request, reload: reload + 1}));\n    return true;\n  }\n\n  destroy(): void {\n    this.destroyed = true;\n    this.effectRef.destroy();\n    this.abortInProgressLoad();\n\n    // Destroyed resources enter Idle state.\n    this.state.set({\n      extRequest: {request: undefined, reload: 0},\n      status: ResourceStatus.Idle,\n      previousStatus: ResourceStatus.Idle,\n      stream: undefined,\n    });\n  }\n\n  private async loadEffect(): Promise<void> {\n    const extRequest = this.extRequest();\n\n    // Capture the previous status before any state transitions. Note that this is `untracked` since\n    // we do not want the effect to depend on the state of the resource, only on the request.\n    const {status: currentStatus, previousStatus} = untracked(this.state);\n\n    if (extRequest.request === undefined) {\n      // Nothing to load (and we should already be in a non-loading state).\n      return;\n    } else if (currentStatus !== ResourceStatus.Loading) {\n      // We're not in a loading or reloading state, so this loading request is stale.\n      return;\n    }\n\n    // Cancel any previous loading attempts.\n    this.abortInProgressLoad();\n\n    // Capturing _this_ load's pending task in a local variable is important here. We may attempt to\n    // resolve it twice:\n    //\n    //  1. when the loading function promise resolves/rejects\n    //  2. when cancelling the loading operation\n    //\n    // After the loading operation is cancelled, `this.resolvePendingTask` no longer represents this\n    // particular task, but this `await` may eventually resolve/reject. Thus, when we cancel in\n    // response to (1) below, we need to cancel the locally saved task.\n    let resolvePendingTask: (() => void) | undefined = (this.resolvePendingTask =\n      this.pendingTasks.add());\n\n    const {signal: abortSignal} = (this.pendingController = new AbortController());\n\n    try {\n      // The actual loading is run through `untracked` - only the request side of `resource` is\n      // reactive. This avoids any confusion with signals tracking or not tracking depending on\n      // which side of the `await` they are.\n      const stream = await untracked(() => {\n        return this.loaderFn({\n          request: extRequest.request as Exclude<R, undefined>,\n          abortSignal,\n          previous: {\n            status: previousStatus,\n          },\n        });\n      });\n\n      // If this request has been aborted, or the current request no longer\n      // matches this load, then we should ignore this resolution.\n      if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) {\n        return;\n      }\n\n      this.state.set({\n        extRequest,\n        status: ResourceStatus.Resolved,\n        previousStatus: ResourceStatus.Resolved,\n        stream,\n      });\n    } catch (err) {\n      if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) {\n        return;\n      }\n\n      this.state.set({\n        extRequest,\n        status: ResourceStatus.Resolved,\n        previousStatus: ResourceStatus.Error,\n        stream: signal({error: err}),\n      });\n    } finally {\n      // Resolve the pending task now that the resource has a value.\n      resolvePendingTask?.();\n      resolvePendingTask = undefined;\n    }\n  }\n\n  private abortInProgressLoad(): void {\n    untracked(() => this.pendingController?.abort());\n    this.pendingController = undefined;\n\n    // Once the load is aborted, we no longer want to block stability on its resolution.\n    this.resolvePendingTask?.();\n    this.resolvePendingTask = undefined;\n  }\n}\n\n/**\n * Wraps an equality function to handle either value being `undefined`.\n */\nfunction wrapEqualityFn<T>(equal: ValueEqualityFn<T>): ValueEqualityFn<T | undefined> {\n  return (a, b) => (a === undefined || b === undefined ? a === b : equal(a, b));\n}\n\nfunction getLoader<T, R>(options: ResourceOptions<T, R>): ResourceStreamingLoader<T, R> {\n  if (isStreamingResourceOptions(options)) {\n    return options.stream;\n  }\n\n  return async (params) => {\n    try {\n      return signal({value: await options.loader(params)});\n    } catch (err) {\n      return signal({error: err});\n    }\n  };\n}\n\nfunction isStreamingResourceOptions<T, R>(\n  options: ResourceOptions<T, R>,\n): options is StreamingResourceOptions<T, R> {\n  return !!(options as StreamingResourceOptions<T, R>).stream;\n}\n\n/**\n * Project from a state with `ResourceInternalStatus` to the user-facing `ResourceStatus`\n */\nfunction projectStatusOfState(state: ResourceState<unknown>): ResourceStatus {\n  switch (state.status) {\n    case ResourceStatus.Loading:\n      return state.extRequest.reload === 0 ? ResourceStatus.Loading : ResourceStatus.Reloading;\n    case ResourceStatus.Resolved:\n      return isResolved(untracked(state.stream!)) ? ResourceStatus.Resolved : ResourceStatus.Error;\n    default:\n      return state.status;\n  }\n}\n\nfunction isResolved<T>(state: ResourceStreamItem<T>): state is {value: T} {\n  return (state as {error: unknown}).error === undefined;\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ComponentDef} from '../render3';\nimport {readPatchedLView} from '../render3/context_discovery';\nimport {isComponentHost, isLContainer, isLView} from '../render3/interfaces/type_checks';\nimport {HEADER_OFFSET, HOST, TVIEW} from '../render3/interfaces/view';\nimport {getTNode} from '../render3/util/view_utils';\n\n/**\n * Gets the class name of the closest component to a node.\n * Warning! this function will return minified names if the name of the component is minified. The\n * consumer of the function is responsible for resolving the minified name to its original name.\n * @param node Node from which to start the search.\n */\nexport function getClosestComponentName(node: Node): string | null {\n  let currentNode = node as Node | null;\n\n  while (currentNode) {\n    const lView = readPatchedLView(currentNode);\n\n    if (lView !== null) {\n      for (let i = HEADER_OFFSET; i < lView.length; i++) {\n        const current = lView[i];\n\n        if ((!isLView(current) && !isLContainer(current)) || current[HOST] !== currentNode) {\n          continue;\n        }\n\n        const tView = lView[TVIEW];\n        const tNode = getTNode(tView, i);\n        if (isComponentHost(tNode)) {\n          const def = tView.data[tNode.directiveStart + tNode.componentOffset] as ComponentDef<{}>;\n          const name = def.debugInfo?.className || def.type.name;\n\n          // Note: the name may be an empty string if the class name is\n          // dropped due to minification. In such cases keep going up the tree.\n          if (name) {\n            return name;\n          } else {\n            break;\n          }\n        }\n      }\n    }\n\n    currentNode = currentNode.parentNode;\n  }\n\n  return null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  FactoryTarget,\n  getCompilerFacade,\n  JitCompilerUsage,\n  R3DeclareComponentFacade,\n  R3DeclareDirectiveFacade,\n  R3DeclareFactoryFacade,\n  R3DeclareInjectableFacade,\n  R3DeclareInjectorFacade,\n  R3DeclareNgModuleFacade,\n  R3DeclarePipeFacade,\n} from '../../compiler/compiler_facade';\nimport {Type} from '../../interface/type';\nimport {setClassMetadata, setClassMetadataAsync} from '../metadata';\n\nimport {angularCoreEnv} from './environment';\n\n/**\n * Compiles a partial directive declaration object into a full directive definition object.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclareDirective(decl: R3DeclareDirectiveFacade): unknown {\n  const compiler = getCompilerFacade({\n    usage: JitCompilerUsage.PartialDeclaration,\n    kind: 'directive',\n    type: decl.type,\n  });\n  return compiler.compileDirectiveDeclaration(\n    angularCoreEnv,\n    `ng:///${decl.type.name}/ɵfac.js`,\n    decl,\n  );\n}\n\n/**\n * Evaluates the class metadata declaration.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclareClassMetadata(decl: {\n  type: Type<any>;\n  decorators: any[];\n  ctorParameters?: () => any[];\n  propDecorators?: {[field: string]: any};\n}): void {\n  setClassMetadata(\n    decl.type,\n    decl.decorators,\n    decl.ctorParameters ?? null,\n    decl.propDecorators ?? null,\n  );\n}\n\n/**\n * Evaluates the class metadata of a component that contains deferred blocks.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclareClassMetadataAsync(decl: {\n  type: Type<any>;\n  resolveDeferredDeps: () => Promise<Type<unknown>>[];\n  resolveMetadata: (...types: Type<unknown>[]) => {\n    decorators: any[];\n    ctorParameters: (() => any[]) | null;\n    propDecorators: {[field: string]: any} | null;\n  };\n}): void {\n  setClassMetadataAsync(decl.type, decl.resolveDeferredDeps, (...types: Type<unknown>[]) => {\n    const meta = decl.resolveMetadata(...types);\n    setClassMetadata(decl.type, meta.decorators, meta.ctorParameters, meta.propDecorators);\n  });\n}\n\n/**\n * Compiles a partial component declaration object into a full component definition object.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclareComponent(decl: R3DeclareComponentFacade): unknown {\n  const compiler = getCompilerFacade({\n    usage: JitCompilerUsage.PartialDeclaration,\n    kind: 'component',\n    type: decl.type,\n  });\n  return compiler.compileComponentDeclaration(\n    angularCoreEnv,\n    `ng:///${decl.type.name}/ɵcmp.js`,\n    decl,\n  );\n}\n\n/**\n * Compiles a partial pipe declaration object into a full pipe definition object.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclareFactory(decl: R3DeclareFactoryFacade): unknown {\n  const compiler = getCompilerFacade({\n    usage: JitCompilerUsage.PartialDeclaration,\n    kind: getFactoryKind(decl.target),\n    type: decl.type,\n  });\n  return compiler.compileFactoryDeclaration(\n    angularCoreEnv,\n    `ng:///${decl.type.name}/ɵfac.js`,\n    decl,\n  );\n}\n\nfunction getFactoryKind(target: FactoryTarget) {\n  switch (target) {\n    case FactoryTarget.Directive:\n      return 'directive';\n    case FactoryTarget.Component:\n      return 'component';\n    case FactoryTarget.Injectable:\n      return 'injectable';\n    case FactoryTarget.Pipe:\n      return 'pipe';\n    case FactoryTarget.NgModule:\n      return 'NgModule';\n  }\n}\n\n/**\n * Compiles a partial injectable declaration object into a full injectable definition object.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclareInjectable(decl: R3DeclareInjectableFacade): unknown {\n  const compiler = getCompilerFacade({\n    usage: JitCompilerUsage.PartialDeclaration,\n    kind: 'injectable',\n    type: decl.type,\n  });\n  return compiler.compileInjectableDeclaration(\n    angularCoreEnv,\n    `ng:///${decl.type.name}/ɵprov.js`,\n    decl,\n  );\n}\n\n/**\n * These enums are used in the partial factory declaration calls.\n */\nexport {FactoryTarget} from '../../compiler/compiler_facade';\n\n/**\n * Compiles a partial injector declaration object into a full injector definition object.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclareInjector(decl: R3DeclareInjectorFacade): unknown {\n  const compiler = getCompilerFacade({\n    usage: JitCompilerUsage.PartialDeclaration,\n    kind: 'NgModule',\n    type: decl.type,\n  });\n  return compiler.compileInjectorDeclaration(\n    angularCoreEnv,\n    `ng:///${decl.type.name}/ɵinj.js`,\n    decl,\n  );\n}\n\n/**\n * Compiles a partial NgModule declaration object into a full NgModule definition object.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclareNgModule(decl: R3DeclareNgModuleFacade): unknown {\n  const compiler = getCompilerFacade({\n    usage: JitCompilerUsage.PartialDeclaration,\n    kind: 'NgModule',\n    type: decl.type,\n  });\n  return compiler.compileNgModuleDeclaration(\n    angularCoreEnv,\n    `ng:///${decl.type.name}/ɵmod.js`,\n    decl,\n  );\n}\n\n/**\n * Compiles a partial pipe declaration object into a full pipe definition object.\n *\n * @codeGenApi\n */\nexport function ɵɵngDeclarePipe(decl: R3DeclarePipeFacade): unknown {\n  const compiler = getCompilerFacade({\n    usage: JitCompilerUsage.PartialDeclaration,\n    kind: 'pipe',\n    type: decl.type,\n  });\n  return compiler.compilePipeDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵpipe.js`, decl);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  consumerAfterComputation,\n  consumerBeforeComputation,\n  consumerPollProducersForChange,\n  producerAccessed,\n  SIGNAL,\n  SIGNAL_NODE,\n  type SignalNode,\n} from '../../../primitives/signals';\n\nimport {type Signal} from '../reactivity/api';\nimport {type EffectCleanupFn, type EffectCleanupRegisterFn} from './effect';\n\nimport {TracingService, TracingSnapshot} from '../../application/tracing';\nimport {\n  ChangeDetectionScheduler,\n  NotificationSource,\n} from '../../change_detection/scheduling/zoneless_scheduling';\nimport {assertInInjectionContext} from '../../di/contextual';\nimport {Injector} from '../../di/injector';\nimport {inject} from '../../di/injector_compatibility';\nimport {DestroyRef} from '../../linker/destroy_ref';\nimport {AfterRenderPhase, type AfterRenderRef} from '../after_render/api';\nimport {NOOP_AFTER_RENDER_REF, type AfterRenderOptions} from '../after_render/hooks';\nimport {\n  AFTER_RENDER_PHASES,\n  AfterRenderImpl,\n  AfterRenderManager,\n  AfterRenderSequence,\n} from '../after_render/manager';\nimport {LView} from '../interfaces/view';\nimport {ViewContext} from '../view_context';\nimport {assertNotInReactiveContext} from './asserts';\n\nconst NOT_SET = /* @__PURE__ */ Symbol('NOT_SET');\nconst EMPTY_CLEANUP_SET = /* @__PURE__ */ new Set<() => void>();\n\n/** Callback type for an `afterRenderEffect` phase effect */\ntype AfterRenderPhaseEffectHook = (\n  // Either a cleanup function or a pipelined value and a cleanup function\n  ...args:\n    | [onCleanup: EffectCleanupRegisterFn]\n    | [previousPhaseValue: unknown, onCleanup: EffectCleanupRegisterFn]\n) => unknown;\n\n/**\n * Reactive node in the graph for this `afterRenderEffect` phase effect.\n *\n * This node type extends `SignalNode` because `afterRenderEffect` phases effects produce a value\n * which is consumed as a `Signal` by subsequent phases.\n */\ninterface AfterRenderPhaseEffectNode extends SignalNode<unknown> {\n  /** The phase of the effect implemented by this node */\n  phase: AfterRenderPhase;\n  /** The sequence of phases to which this node belongs, used for state of the whole sequence */\n  sequence: AfterRenderEffectSequence;\n  /** The user's callback function */\n  userFn: AfterRenderPhaseEffectHook;\n  /** Signal function that retrieves the value of this node, used as the value for the next phase */\n  signal: Signal<unknown>;\n  /** Registered cleanup functions, or `null` if none have ever been registered */\n  cleanup: Set<() => void> | null;\n  /** Pre-bound helper function passed to the user's callback which writes to `this.cleanup` */\n  registerCleanupFn: EffectCleanupRegisterFn;\n  /** Entrypoint to running this effect that's given to the `afterRender` machinery */\n  phaseFn(previousValue?: unknown): unknown;\n}\n\nconst AFTER_RENDER_PHASE_EFFECT_NODE = /* @__PURE__ */ (() => ({\n  ...SIGNAL_NODE,\n  consumerIsAlwaysLive: true,\n  consumerAllowSignalWrites: true,\n  value: NOT_SET,\n  cleanup: null,\n  /** Called when the effect becomes dirty */\n  consumerMarkedDirty(this: AfterRenderPhaseEffectNode): void {\n    if (this.sequence.impl.executing) {\n      // If hooks are in the middle of executing, then it matters whether this node has yet been\n      // executed within its sequence. If not, then we don't want to notify the scheduler since\n      // this node will be reached naturally.\n      if (this.sequence.lastPhase === null || this.sequence.lastPhase < this.phase) {\n        return;\n      }\n\n      // If during the execution of a later phase an earlier phase became dirty, then we should not\n      // run any further phases until the earlier one reruns.\n      this.sequence.erroredOrDestroyed = true;\n    }\n\n    // Either hooks are not running, or we're marking a node dirty that has already run within its\n    // sequence.\n    this.sequence.scheduler.notify(NotificationSource.RenderHook);\n  },\n  phaseFn(this: AfterRenderPhaseEffectNode, previousValue?: unknown): unknown {\n    this.sequence.lastPhase = this.phase;\n\n    if (!this.dirty) {\n      return this.signal;\n    }\n\n    this.dirty = false;\n    if (this.value !== NOT_SET && !consumerPollProducersForChange(this)) {\n      // None of our producers report a change since the last time they were read, so no\n      // recomputation of our value is necessary.\n      return this.signal;\n    }\n\n    // Run any needed cleanup functions.\n    try {\n      for (const cleanupFn of this.cleanup ?? EMPTY_CLEANUP_SET) {\n        cleanupFn();\n      }\n    } finally {\n      // Even if a cleanup function errors, ensure it's cleared.\n      this.cleanup?.clear();\n    }\n\n    // Prepare to call the user's effect callback. If there was a previous phase, then it gave us\n    // its value as a `Signal`, otherwise `previousValue` will be `undefined`.\n    const args: unknown[] = [];\n    if (previousValue !== undefined) {\n      args.push(previousValue);\n    }\n    args.push(this.registerCleanupFn);\n\n    // Call the user's callback in our reactive context.\n    const prevConsumer = consumerBeforeComputation(this);\n    let newValue;\n    try {\n      newValue = this.userFn.apply(null, args as any);\n    } finally {\n      consumerAfterComputation(this, prevConsumer);\n    }\n\n    if (this.value === NOT_SET || !this.equal(this.value, newValue)) {\n      this.value = newValue;\n      this.version++;\n    }\n\n    return this.signal;\n  },\n}))();\n\n/**\n * An `AfterRenderSequence` that manages an `afterRenderEffect`'s phase effects.\n */\nclass AfterRenderEffectSequence extends AfterRenderSequence {\n  /**\n   * While this sequence is executing, this tracks the last phase which was called by the\n   * `afterRender` machinery.\n   *\n   * When a phase effect is marked dirty, this is used to determine whether it's already run or not.\n   */\n  lastPhase: AfterRenderPhase | null = null;\n\n  /**\n   * The reactive nodes for each phase, if a phase effect is defined for that phase.\n   *\n   * These are initialized to `undefined` but set in the constructor.\n   */\n  private readonly nodes: [\n    AfterRenderPhaseEffectNode | undefined,\n    AfterRenderPhaseEffectNode | undefined,\n    AfterRenderPhaseEffectNode | undefined,\n    AfterRenderPhaseEffectNode | undefined,\n  ] = [undefined, undefined, undefined, undefined];\n\n  constructor(\n    impl: AfterRenderImpl,\n    effectHooks: Array<AfterRenderPhaseEffectHook | undefined>,\n    view: LView | undefined,\n    readonly scheduler: ChangeDetectionScheduler,\n    destroyRef: DestroyRef,\n    snapshot: TracingSnapshot | null = null,\n  ) {\n    // Note that we also initialize the underlying `AfterRenderSequence` hooks to `undefined` and\n    // populate them as we create reactive nodes below.\n    super(impl, [undefined, undefined, undefined, undefined], view, false, destroyRef, snapshot);\n\n    // Setup a reactive node for each phase.\n    for (const phase of AFTER_RENDER_PHASES) {\n      const effectHook = effectHooks[phase];\n      if (effectHook === undefined) {\n        continue;\n      }\n\n      const node = Object.create(AFTER_RENDER_PHASE_EFFECT_NODE) as AfterRenderPhaseEffectNode;\n      node.sequence = this;\n      node.phase = phase;\n      node.userFn = effectHook;\n      node.dirty = true;\n      node.signal = (() => {\n        producerAccessed(node);\n        return node.value;\n      }) as Signal<unknown>;\n      node.signal[SIGNAL] = node;\n      node.registerCleanupFn = (fn: EffectCleanupFn) =>\n        (node.cleanup ??= new Set<() => void>()).add(fn);\n\n      this.nodes[phase] = node;\n\n      // Install the upstream hook which runs the `phaseFn` for this phase.\n      this.hooks[phase] = (value) => node.phaseFn(value);\n    }\n  }\n\n  override afterRun(): void {\n    super.afterRun();\n    // We're done running this sequence, so reset `lastPhase`.\n    this.lastPhase = null;\n  }\n\n  override destroy(): void {\n    super.destroy();\n\n    // Run the cleanup functions for each node.\n    for (const node of this.nodes) {\n      for (const fn of node?.cleanup ?? EMPTY_CLEANUP_SET) {\n        fn();\n      }\n    }\n  }\n}\n\n/**\n * An argument list containing the first non-never type in the given type array, or an empty\n * argument list if there are no non-never types in the type array.\n */\nexport type ɵFirstAvailableSignal<T extends unknown[]> = T extends [infer H, ...infer R]\n  ? [H] extends [never]\n    ? ɵFirstAvailableSignal<R>\n    : [Signal<H>]\n  : [];\n\n/**\n * Register an effect that, when triggered, is invoked when the application finishes rendering, during the\n * `mixedReadWrite` phase.\n *\n * <div class=\"docs-alert docs-alert-critical\">\n *\n * You should prefer specifying an explicit phase for the effect instead, or you risk significant\n * performance degradation.\n *\n * </div>\n *\n * Note that callback-based `afterRenderEffect`s will run\n * - in the order it they are registered\n * - only when dirty\n * - on browser platforms only\n * - during the `mixedReadWrite` phase\n *\n * <div class=\"docs-alert docs-alert-important\">\n *\n * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.\n * You must use caution when directly reading or writing the DOM and layout.\n *\n * </div>\n *\n * @param callback An effect callback function to register\n * @param options Options to control the behavior of the callback\n *\n * @experimental\n */\nexport function afterRenderEffect(\n  callback: (onCleanup: EffectCleanupRegisterFn) => void,\n  options?: Omit<AfterRenderOptions, 'phase'>,\n): AfterRenderRef;\n/**\n * Register effects that, when triggered, are invoked when the application finishes rendering,\n * during the specified phases. The available phases are:\n * - `earlyRead`\n *   Use this phase to **read** from the DOM before a subsequent `write` callback, for example to\n *   perform custom layout that the browser doesn't natively support. Prefer the `read` phase if\n *   reading can wait until after the write phase. **Never** write to the DOM in this phase.\n * - `write`\n *    Use this phase to **write** to the DOM. **Never** read from the DOM in this phase.\n * - `mixedReadWrite`\n *    Use this phase to read from and write to the DOM simultaneously. **Never** use this phase if\n *    it is possible to divide the work among the other phases instead.\n * - `read`\n *    Use this phase to **read** from the DOM. **Never** write to the DOM in this phase.\n *\n * <div class=\"docs-alert docs-alert-critical\">\n *\n * You should prefer using the `read` and `write` phases over the `earlyRead` and `mixedReadWrite`\n * phases when possible, to avoid performance degradation.\n *\n * </div>\n *\n * Note that:\n * - Effects run in the following phase order, only when dirty through signal dependencies:\n *   1. `earlyRead`\n *   2. `write`\n *   3. `mixedReadWrite`\n *   4. `read`\n * - `afterRenderEffect`s in the same phase run in the order they are registered.\n * - `afterRenderEffect`s run on browser platforms only, they will not run on the server.\n * - `afterRenderEffect`s will run at least once.\n *\n * The first phase callback to run as part of this spec will receive no parameters. Each\n * subsequent phase callback in this spec will receive the return value of the previously run\n * phase callback as a `Signal`. This can be used to coordinate work across multiple phases.\n *\n * Angular is unable to verify or enforce that phases are used correctly, and instead\n * relies on each developer to follow the guidelines documented for each value and\n * carefully choose the appropriate one, refactoring their code if necessary. By doing\n * so, Angular is better able to minimize the performance degradation associated with\n * manual DOM access, ensuring the best experience for the end users of your application\n * or library.\n *\n * <div class=\"docs-alert docs-alert-important\">\n *\n * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.\n * You must use caution when directly reading or writing the DOM and layout.\n *\n * </div>\n *\n * @param spec The effect functions to register\n * @param options Options to control the behavior of the effects\n *\n * @usageNotes\n *\n * Use `afterRenderEffect` to create effects that will read or write from the DOM and thus should\n * run after rendering.\n *\n * @experimental\n */\nexport function afterRenderEffect<E = never, W = never, M = never>(\n  spec: {\n    earlyRead?: (onCleanup: EffectCleanupRegisterFn) => E;\n    write?: (...args: [...ɵFirstAvailableSignal<[E]>, EffectCleanupRegisterFn]) => W;\n    mixedReadWrite?: (...args: [...ɵFirstAvailableSignal<[W, E]>, EffectCleanupRegisterFn]) => M;\n    read?: (...args: [...ɵFirstAvailableSignal<[M, W, E]>, EffectCleanupRegisterFn]) => void;\n  },\n  options?: Omit<AfterRenderOptions, 'phase'>,\n): AfterRenderRef;\n\n/**\n * @experimental\n */\nexport function afterRenderEffect<E = never, W = never, M = never>(\n  callbackOrSpec:\n    | ((onCleanup: EffectCleanupRegisterFn) => void)\n    | {\n        earlyRead?: (onCleanup: EffectCleanupRegisterFn) => E;\n        write?: (...args: [...ɵFirstAvailableSignal<[E]>, EffectCleanupRegisterFn]) => W;\n        mixedReadWrite?: (\n          ...args: [...ɵFirstAvailableSignal<[W, E]>, EffectCleanupRegisterFn]\n        ) => M;\n        read?: (...args: [...ɵFirstAvailableSignal<[M, W, E]>, EffectCleanupRegisterFn]) => void;\n      },\n  options?: Omit<AfterRenderOptions, 'phase'>,\n): AfterRenderRef {\n  ngDevMode &&\n    assertNotInReactiveContext(\n      afterRenderEffect,\n      'Call `afterRenderEffect` outside of a reactive context. For example, create the render ' +\n        'effect inside the component constructor`.',\n    );\n\n  !options?.injector && assertInInjectionContext(afterRenderEffect);\n\n  if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n    return NOOP_AFTER_RENDER_REF;\n  }\n\n  const injector = options?.injector ?? inject(Injector);\n  const scheduler = injector.get(ChangeDetectionScheduler);\n  const manager = injector.get(AfterRenderManager);\n  const tracing = injector.get(TracingService, null, {optional: true});\n  manager.impl ??= injector.get(AfterRenderImpl);\n\n  let spec = callbackOrSpec;\n  if (typeof spec === 'function') {\n    spec = {mixedReadWrite: callbackOrSpec as any};\n  }\n\n  const viewContext = injector.get(ViewContext, null, {optional: true});\n\n  const sequence = new AfterRenderEffectSequence(\n    manager.impl,\n    [spec.earlyRead, spec.write, spec.mixedReadWrite, spec.read] as AfterRenderPhaseEffectHook[],\n    viewContext?.view,\n    scheduler,\n    injector.get(DestroyRef),\n    tracing?.snapshot(null),\n  );\n  manager.impl.register(sequence);\n  return sequence;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {EnvironmentInjector, getNullInjector} from '../di/r3_injector';\nimport {Type} from '../interface/type';\nimport {ComponentRef} from '../linker/component_factory';\n\nimport {ComponentFactory} from './component_ref';\nimport {getComponentDef} from './def_getters';\nimport {assertComponentDef} from './errors';\n\n/**\n * Creates a `ComponentRef` instance based on provided component type and a set of options.\n *\n * @usageNotes\n *\n * The example below demonstrates how the `createComponent` function can be used\n * to create an instance of a ComponentRef dynamically and attach it to an ApplicationRef,\n * so that it gets included into change detection cycles.\n *\n * Note: the example uses standalone components, but the function can also be used for\n * non-standalone components (declared in an NgModule) as well.\n *\n * ```angular-ts\n * @Component({\n *   standalone: true,\n *   template: `Hello {{ name }}!`\n * })\n * class HelloComponent {\n *   name = 'Angular';\n * }\n *\n * @Component({\n *   standalone: true,\n *   template: `<div id=\"hello-component-host\"></div>`\n * })\n * class RootComponent {}\n *\n * // Bootstrap an application.\n * const applicationRef = await bootstrapApplication(RootComponent);\n *\n * // Locate a DOM node that would be used as a host.\n * const hostElement = document.getElementById('hello-component-host');\n *\n * // Get an `EnvironmentInjector` instance from the `ApplicationRef`.\n * const environmentInjector = applicationRef.injector;\n *\n * // We can now create a `ComponentRef` instance.\n * const componentRef = createComponent(HelloComponent, {hostElement, environmentInjector});\n *\n * // Last step is to register the newly created ref using the `ApplicationRef` instance\n * // to include the component view into change detection cycles.\n * applicationRef.attachView(componentRef.hostView);\n * componentRef.changeDetectorRef.detectChanges();\n * ```\n *\n * @param component Component class reference.\n * @param options Set of options to use:\n *  * `environmentInjector`: An `EnvironmentInjector` instance to be used for the component.\n *  * `hostElement` (optional): A DOM node that should act as a host node for the component. If not\n * provided, Angular creates one based on the tag name used in the component selector (and falls\n * back to using `div` if selector doesn't have tag name info).\n *  * `elementInjector` (optional): An `ElementInjector` instance, see additional info about it\n * [here](guide/di/hierarchical-dependency-injection#elementinjector).\n *  * `projectableNodes` (optional): A list of DOM nodes that should be projected through\n * [`<ng-content>`](api/core/ng-content) of the new component instance, e.g.,\n * `[[element1, element2]]`: projects `element1` and `element2` into the same `<ng-content>`.\n * `[[element1, element2], [element3]]`: projects `element1` and `element2` into one `<ng-content>`,\n * and `element3` into a separate `<ng-content>`.\n * @returns ComponentRef instance that represents a given Component.\n *\n * @publicApi\n */\nexport function createComponent<C>(\n  component: Type<C>,\n  options: {\n    environmentInjector: EnvironmentInjector;\n    hostElement?: Element;\n    elementInjector?: Injector;\n    projectableNodes?: Node[][];\n  },\n): ComponentRef<C> {\n  ngDevMode && assertComponentDef(component);\n  const componentDef = getComponentDef(component)!;\n  const elementInjector = options.elementInjector || getNullInjector();\n  const factory = new ComponentFactory<C>(componentDef);\n  return factory.create(\n    elementInjector,\n    options.projectableNodes,\n    options.hostElement,\n    options.environmentInjector,\n  );\n}\n\n/**\n * An interface that describes the subset of component metadata\n * that can be retrieved using the `reflectComponentType` function.\n *\n * @publicApi\n */\nexport interface ComponentMirror<C> {\n  /**\n   * The component's HTML selector.\n   */\n  get selector(): string;\n  /**\n   * The type of component the factory will create.\n   */\n  get type(): Type<C>;\n  /**\n   * The inputs of the component.\n   */\n  get inputs(): ReadonlyArray<{\n    readonly propName: string;\n    readonly templateName: string;\n    readonly transform?: (value: any) => any;\n    readonly isSignal: boolean;\n  }>;\n  /**\n   * The outputs of the component.\n   */\n  get outputs(): ReadonlyArray<{readonly propName: string; readonly templateName: string}>;\n  /**\n   * Selector for all <ng-content> elements in the component.\n   */\n  get ngContentSelectors(): ReadonlyArray<string>;\n  /**\n   * Whether this component is marked as standalone.\n   * Note: an extra flag, not present in `ComponentFactory`.\n   */\n  get isStandalone(): boolean;\n  /**\n   * // TODO(signals): Remove internal and add public documentation\n   * @internal\n   */\n  get isSignal(): boolean;\n}\n\n/**\n * Creates an object that allows to retrieve component metadata.\n *\n * @usageNotes\n *\n * The example below demonstrates how to use the function and how the fields\n * of the returned object map to the component metadata.\n *\n * ```angular-ts\n * @Component({\n *   standalone: true,\n *   selector: 'foo-component',\n *   template: `\n *     <ng-content></ng-content>\n *     <ng-content select=\"content-selector-a\"></ng-content>\n *   `,\n * })\n * class FooComponent {\n *   @Input('inputName') inputPropName: string;\n *   @Output('outputName') outputPropName = new EventEmitter<void>();\n * }\n *\n * const mirror = reflectComponentType(FooComponent);\n * expect(mirror.type).toBe(FooComponent);\n * expect(mirror.selector).toBe('foo-component');\n * expect(mirror.isStandalone).toBe(true);\n * expect(mirror.inputs).toEqual([{propName: 'inputName', templateName: 'inputPropName'}]);\n * expect(mirror.outputs).toEqual([{propName: 'outputName', templateName: 'outputPropName'}]);\n * expect(mirror.ngContentSelectors).toEqual([\n *   '*',                 // first `<ng-content>` in a template, the selector defaults to `*`\n *   'content-selector-a' // second `<ng-content>` in a template\n * ]);\n * ```\n *\n * @param component Component class reference.\n * @returns An object that allows to retrieve component metadata.\n *\n * @publicApi\n */\nexport function reflectComponentType<C>(component: Type<C>): ComponentMirror<C> | null {\n  const componentDef = getComponentDef(component);\n  if (!componentDef) return null;\n\n  const factory = new ComponentFactory<C>(componentDef);\n  return {\n    get selector(): string {\n      return factory.selector;\n    },\n    get type(): Type<C> {\n      return factory.componentType;\n    },\n    get inputs(): ReadonlyArray<{\n      propName: string;\n      templateName: string;\n      transform?: (value: any) => any;\n      isSignal: boolean;\n    }> {\n      return factory.inputs;\n    },\n    get outputs(): ReadonlyArray<{propName: string; templateName: string}> {\n      return factory.outputs;\n    },\n    get ngContentSelectors(): ReadonlyArray<string> {\n      return factory.ngContentSelectors;\n    },\n    get isStandalone(): boolean {\n      return componentDef.standalone;\n    },\n    get isSignal(): boolean {\n      return componentDef.signals;\n    },\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentProviders, Provider} from '../di';\n\n/**\n * Set of config options available during the application bootstrap operation.\n *\n * @publicApi\n */\nexport interface ApplicationConfig {\n  /**\n   * List of providers that should be available to the root component and all its children.\n   */\n  providers: Array<Provider | EnvironmentProviders>;\n}\n\n/**\n * Merge multiple application configurations from left to right.\n *\n * @param configs Two or more configurations to be merged.\n * @returns A merged [ApplicationConfig](api/core/ApplicationConfig).\n *\n * @publicApi\n */\nexport function mergeApplicationConfig(...configs: ApplicationConfig[]): ApplicationConfig {\n  return configs.reduce(\n    (prev, curr) => {\n      return Object.assign(prev, curr, {providers: [...prev.providers, ...curr.providers]});\n    },\n    {providers: []},\n  );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '../di/injection_token';\n\n/**\n * Injection token representing the current HTTP request object.\n *\n * Use this token to access the current request when handling server-side\n * rendering (SSR).\n *\n * @remarks\n * This token may be `null` in the following scenarios:\n *\n * * During the build processes.\n * * When the application is rendered in the browser (client-side rendering).\n * * When performing static site generation (SSG).\n * * During route extraction in development (at the time of the request).\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Request | `Request` on MDN}\n *\n * @developerPreview\n */\nexport const REQUEST = new InjectionToken<Request | null>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'REQUEST' : '',\n  {\n    providedIn: 'platform',\n    factory: () => null,\n  },\n);\n\n/**\n * Injection token for response initialization options.\n *\n * Use this token to provide response options for configuring or initializing\n * HTTP responses in server-side rendering or API endpoints.\n *\n * @remarks\n * This token may be `null` in the following scenarios:\n *\n * * During the build processes.\n * * When the application is rendered in the browser (client-side rendering).\n * * When performing static site generation (SSG).\n * * During route extraction in development (at the time of the request).\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response | `ResponseInit` on MDN}\n *\n * @developerPreview\n */\nexport const RESPONSE_INIT = new InjectionToken<ResponseInit | null>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'RESPONSE_INIT' : '',\n  {\n    providedIn: 'platform',\n    factory: () => null,\n  },\n);\n\n/**\n * Injection token for additional request context.\n *\n * Use this token to pass custom metadata or context related to the current request in server-side rendering.\n *\n * @remarks\n * This token is only available during server-side rendering and will be `null` in other contexts.\n *\n * @developerPreview\n */\nexport const REQUEST_CONTEXT = new InjectionToken<unknown>(\n  typeof ngDevMode === 'undefined' || ngDevMode ? 'REQUEST_CONTEXT' : '',\n  {\n    providedIn: 'platform',\n    factory: () => null,\n  },\n);\n"],"names":["global","NOT_FOUND","INJECTOR","getPipeDef","inject","USE_VALUE","ViewEncapsulation","isInSkipHydrationBlock","setActiveConsumer","getDirectiveMetadata","DEFER_BLOCK_STATE","Attribute","isDisconnectedNode"   ,"policy","getPolicy","handleError","MAXIMUM_REFRESH_RERUNS","R3_ViewRef","AbstractComponentFactoryResolver","AbstractComponentFactory","AbstractComponentRef","ViewRef","R3ComponentFactory","R3ViewRef","ViewEngine_TemplateRef","ViewEngine_ElementRef","viewEngine_NgModuleRef","viewEngine_ComponentFactoryResolver","viewEngine_NgModuleFactory","defineInjectable","SERIALIZED_DEFER_BLOCK_STATE","getDeferBlocks","getDeferBlocksInternal","publishDefaultGlobalUtils","i0.ɵɵdefineInjectable","_publishDefaultGlobalUtils","ComponentFactory","ComponentFactoryResolver","NgModuleRef","LOCALE_ID","r3.ɵɵattribute","r3.ɵɵattributeInterpolate1","r3.ɵɵattributeInterpolate2","r3.ɵɵattributeInterpolate3","r3.ɵɵattributeInterpolate4","r3.ɵɵattributeInterpolate5","r3.ɵɵattributeInterpolate6","r3.ɵɵattributeInterpolate7","r3.ɵɵattributeInterpolate8","r3.ɵɵattributeInterpolateV","r3.ɵɵdefineComponent","r3.ɵɵdefineDirective","r3.ɵɵdefineNgModule","r3.ɵɵdefinePipe","r3.ɵɵdirectiveInject","r3.ɵɵgetInheritedFactory","r3.ɵɵinjectAttribute","r3.ɵɵinvalidFactory","r3.ɵɵtemplateRefExtractor","r3.ɵɵresetView","r3.ɵɵHostDirectivesFeature","r3.ɵɵNgOnChangesFeature","r3.ɵɵProvidersFeature","r3.ɵɵCopyDefinitionFeature","r3.ɵɵInheritDefinitionFeature","r3.ɵɵExternalStylesFeature","r3.ɵɵnextContext","r3.ɵɵnamespaceHTML","r3.ɵɵnamespaceMathML","r3.ɵɵnamespaceSVG","r3.ɵɵenableBindings","r3.ɵɵdisableBindings","r3.ɵɵelementStart","r3.ɵɵelementEnd","r3.ɵɵelement","r3.ɵɵelementContainerStart","r3.ɵɵelementContainerEnd","r3.ɵɵelementContainer","r3.ɵɵpureFunction0","r3.ɵɵpureFunction1","r3.ɵɵpureFunction2","r3.ɵɵpureFunction3","r3.ɵɵpureFunction4","r3.ɵɵpureFunction5","r3.ɵɵpureFunction6","r3.ɵɵpureFunction7","r3.ɵɵpureFunction8","r3.ɵɵpureFunctionV","r3.ɵɵgetCurrentView","r3.ɵɵrestoreView","r3.ɵɵlistener","r3.ɵɵprojection","r3.ɵɵsyntheticHostProperty","r3.ɵɵsyntheticHostListener","r3.ɵɵpipeBind1","r3.ɵɵpipeBind2","r3.ɵɵpipeBind3","r3.ɵɵpipeBind4","r3.ɵɵpipeBindV","r3.ɵɵprojectionDef","r3.ɵɵhostProperty","r3.ɵɵproperty","r3.ɵɵpropertyInterpolate","r3.ɵɵpropertyInterpolate1","r3.ɵɵpropertyInterpolate2","r3.ɵɵpropertyInterpolate3","r3.ɵɵpropertyInterpolate4","r3.ɵɵpropertyInterpolate5","r3.ɵɵpropertyInterpolate6","r3.ɵɵpropertyInterpolate7","r3.ɵɵpropertyInterpolate8","r3.ɵɵpropertyInterpolateV","r3.ɵɵpipe","r3.ɵɵqueryRefresh","r3.ɵɵqueryAdvance","r3.ɵɵviewQuery","r3.ɵɵviewQuerySignal","r3.ɵɵloadQuery","r3.ɵɵcontentQuery","r3.ɵɵcontentQuerySignal","r3.ɵɵreference","r3.ɵɵclassMap","r3.ɵɵclassMapInterpolate1","r3.ɵɵclassMapInterpolate2","r3.ɵɵclassMapInterpolate3","r3.ɵɵclassMapInterpolate4","r3.ɵɵclassMapInterpolate5","r3.ɵɵclassMapInterpolate6","r3.ɵɵclassMapInterpolate7","r3.ɵɵclassMapInterpolate8","r3.ɵɵclassMapInterpolateV","r3.ɵɵstyleMap","r3.ɵɵstyleMapInterpolate1","r3.ɵɵstyleMapInterpolate2","r3.ɵɵstyleMapInterpolate3","r3.ɵɵstyleMapInterpolate4","r3.ɵɵstyleMapInterpolate5","r3.ɵɵstyleMapInterpolate6","r3.ɵɵstyleMapInterpolate7","r3.ɵɵstyleMapInterpolate8","r3.ɵɵstyleMapInterpolateV","r3.ɵɵstyleProp","r3.ɵɵstylePropInterpolate1","r3.ɵɵstylePropInterpolate2","r3.ɵɵstylePropInterpolate3","r3.ɵɵstylePropInterpolate4","r3.ɵɵstylePropInterpolate5","r3.ɵɵstylePropInterpolate6","r3.ɵɵstylePropInterpolate7","r3.ɵɵstylePropInterpolate8","r3.ɵɵstylePropInterpolateV","r3.ɵɵclassProp","r3.ɵɵadvance","r3.ɵɵtemplate","r3.ɵɵconditional","r3.ɵɵdefer","r3.ɵɵdeferWhen","r3.ɵɵdeferOnIdle","r3.ɵɵdeferOnImmediate","r3.ɵɵdeferOnTimer","r3.ɵɵdeferOnHover","r3.ɵɵdeferOnInteraction","r3.ɵɵdeferOnViewport","r3.ɵɵdeferPrefetchWhen","r3.ɵɵdeferPrefetchOnIdle","r3.ɵɵdeferPrefetchOnImmediate","r3.ɵɵdeferPrefetchOnTimer","r3.ɵɵdeferPrefetchOnHover","r3.ɵɵdeferPrefetchOnInteraction","r3.ɵɵdeferPrefetchOnViewport","r3.ɵɵdeferHydrateWhen","r3.ɵɵdeferHydrateNever","r3.ɵɵdeferHydrateOnIdle","r3.ɵɵdeferHydrateOnImmediate","r3.ɵɵdeferHydrateOnTimer","r3.ɵɵdeferHydrateOnHover","r3.ɵɵdeferHydrateOnInteraction","r3.ɵɵdeferHydrateOnViewport","r3.ɵɵdeferEnableTimerScheduling","r3.ɵɵrepeater","r3.ɵɵrepeaterCreate","r3.ɵɵrepeaterTrackByIndex","r3.ɵɵrepeaterTrackByIdentity","r3.ɵɵcomponentInstance","r3.ɵɵtext","r3.ɵɵtextInterpolate","r3.ɵɵtextInterpolate1","r3.ɵɵtextInterpolate2","r3.ɵɵtextInterpolate3","r3.ɵɵtextInterpolate4","r3.ɵɵtextInterpolate5","r3.ɵɵtextInterpolate6","r3.ɵɵtextInterpolate7","r3.ɵɵtextInterpolate8","r3.ɵɵtextInterpolateV","r3.ɵɵi18n","r3.ɵɵi18nAttributes","r3.ɵɵi18nExp","r3.ɵɵi18nStart","r3.ɵɵi18nEnd","r3.ɵɵi18nApply","r3.ɵɵi18nPostprocess","r3.ɵɵresolveWindow","r3.ɵɵresolveDocument","r3.ɵɵresolveBody","r3.ɵɵsetComponentScope","r3.ɵɵsetNgModuleScope","r3.ɵɵgetComponentDepsFactory","r3.ɵsetClassDebugInfo","r3.ɵɵdeclareLet","r3.ɵɵstoreLet","r3.ɵɵreadContextLet","r3.ɵɵattachSourceLocations","sanitization.ɵɵsanitizeHtml","sanitization.ɵɵsanitizeStyle","sanitization.ɵɵsanitizeResourceUrl","sanitization.ɵɵsanitizeScript","sanitization.ɵɵsanitizeUrl","sanitization.ɵɵsanitizeUrlOrResourceUrl","sanitization.ɵɵtrustConstantHtml","sanitization.ɵɵtrustConstantResourceUrl","iframe_attrs_validation.ɵɵvalidateIframeAttribute","r3.ɵɵtwoWayProperty","r3.ɵɵtwoWayBindingSet","r3.ɵɵtwoWayListener","r3.ɵɵreplaceMetadata","r3.ɵɵgetReplaceMetadataURL","NgModuleFactoryR3","ComponentFactoryR3","R3NgModuleFactory","i0.ɵɵinject","i1.Injector","i1.ApplicationRef","CURRENT_DEFER_BLOCK_STATE","untrackedPrimitive","effect"],"mappings":"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   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   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   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   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   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   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   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   AAClD,IAAA,IAAI,YAAY,KAAK,SAAS,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,gBAAgB,EAAE;AAChC,QAAA,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC;QACpF,IAAI,SAAS,EAAE;YACb,MAAM,sBAAsB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;gBACzC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;YAExC,4BAA4B,CAC1B,QAAQ,EAAE,CAAC,IAAI,EACf,KAAK,EACL,OAAO,GAAG,QAAQ,EAClB,eAAe,EAAE,GAAG,sBAAsB,CAAC,MAAM,GAAG,CAAC,EACrD,GAAG,sBAAsB,CAC1B;;;AAGL,IAAA,OAAO,uBAAuB;AAChC;;AC/gBgB,SAAA,eAAe,CAAC,IAAY,EAAE,IAAY,EAAA;AACxD,IAAA,SAAS,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,yCAA6B;AACrE,IAAA,SAAS,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,yCAA6B;IACrE,QAAQ,CAAC,IAAI,IAA2B,EAAA,mCAAK,IAAI,IAAA,CAAA,+BAA4B;AAC/E;AAEM,SAAU,oBAAoB,CAAC,aAA4B,EAAA;AAC/D,IAAA,SAAS,IAAI,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC;AAC3D,IAAA,OAAO,CAAC,aAAa,IAA2B,EAAA;AAClD;AAEM,SAAU,6BAA6B,CAAC,aAA4B,EAAA;AACxE,IAAA,SAAS,IAAI,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC;AAC3D,IAAA,OAAO,CAAC,aAAa,GAA8B,CAAA;AACrD;AAEgB,SAAA,oBAAoB,CAClC,aAA4B,EAC5B,QAAgB,EAAA;AAEhB,IAAA,SAAS,IAAI,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC;AAC3D,IAAA,SAAS,IAAI,mBAAmB,CAAC,QAAQ,EAAE,CAAC,yCAA6B;AACzE,IAAA,QAAQ,CAAC,aAAa,GAAG;AACvB,SAAC,QAAQ,IAAA,EAAA,+BAA4B;AACzC;AAEM,SAAU,6BAA6B,CAAC,aAA4B,EAAA;AACxE,IAAA,SAAS,IAAI,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC;AAC3D,IAAA,QAAQ,aAAa,GAA8B,CAAA;AACrD;AAEM,SAAU,oBAAoB,CAAC,aAA4B,EAAA;AAC/D,IAAA,SAAS,IAAI,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC;AAC3D,IAAA,OAAO,CAAC,aAAa,GAAyB,MAAA;AAChD;AAEgB,SAAA,oBAAoB,CAAC,aAA4B,EAAE,IAAY,EAAA;AAC7E,IAAA,SAAS,IAAI,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC;AAC3D,IAAA,SAAS,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,yCAA6B;AACrE,IAAA,QAAQ,CAAC,aAAa,GAAG,OAAuB;AAC9C,SAAC,IAAI,IAAA,CAAA,+BAA4B;AACrC;AAEM,SAAU,6BAA6B,CAAC,aAA4B,EAAA;AACxE,IAAA,SAAS,IAAI,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC;AAC3D,IAAA,OAAO,CAAC,aAAa,GAA8B,CAAA;AACrD;AAEM,SAAU,6BAA6B,CAAC,aAA4B,EAAA;AACxE,IAAA,SAAS,IAAI,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC;AAC3D,IAAA,QAAQ,aAAa,GAA8B,CAAA;AACrD;;AC3BA;;;;;;;;;;;;;;;;;;;AAmBG;AACa,SAAA,qBAAqB,CACnC,KAAY,EACZ,KAAY,EACZ,qBAAkC,EAClC,KAAa,EACb,aAAsB,EACtB,cAAuB,EAAA;AAEvB,IAAA,SAAS,IAAI,qBAAqB,CAAC,QAAQ,EAAE,CAAC;AAC9C,IAAA,IAAI,SAAS,GAAG,cAAc,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa;AAC1E,IAAA,IAAI,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC;AAC9C,IAAA,IAAI,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC;AAE9C,IAAA,KAAK,CAAC,KAAK,CAAC,GAAG,qBAAqB;IACpC,IAAI,sBAAsB,GAAG,KAAK;AAClC,IAAA,IAAI,WAAiC;AACrC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE;;QAExC,MAAM,mBAAmB,GAAG,qBAA2C;AACvE,QAAA,WAAW,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;;QAErC,IACE,WAAW,KAAK,IAAI;YACpB,oBAAoB,CAAC,mBAAmB,EAAE,WAAqB,CAAC,GAAG,CAAC,EACpE;;YAEA,sBAAsB,GAAG,IAAI;;;SAE1B;QACL,WAAW,GAAG,qBAAqB;;IAErC,IAAI,aAAa,EAAE;;;AAIjB,QAAA,MAAM,mBAAmB,GAAG,QAAQ,KAAK,CAAC;;;QAG1C,IAAI,mBAAmB,EAAE;;YAEvB,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAkB,CAAC;AAC/E,YAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC;;;AAG1D,YAAA,IAAI,YAAY,KAAK,CAAC,EAAE;;AAEtB,gBAAA,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAC5C,KAAK,CAAC,YAAY,GAAG,CAAC,CAAkB,EACxC,KAAK,CACN;;;AAGH,YAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAkB,EAAE,KAAK,CAAC;;aAClF;AACL,YAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;;;AAG/C,YAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;;AAElB,gBAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAkB,EAAE,KAAK,CAAC;;;YAGzF,QAAQ,GAAG,KAAK;;;SAEb;;;AAGL,QAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,SAAS;AACP,YAAA,WAAW,CACT,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,EAChC,KAAK,EACL,6DAA6D,CAC9D;AACH,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;YAClB,QAAQ,GAAG,KAAK;;aACX;;AAEL,YAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAkB,EAAE,KAAK,CAAC;;QAEzF,QAAQ,GAAG,KAAK;;;;IAKlB,IAAI,sBAAsB,EAAE;AAC1B,QAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,6BAA6B,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAkB,CAAC;;IAErF,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC;IAC/C,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC;IAChD,8BAA8B,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC;AAEhF,IAAA,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC/C,IAAI,cAAc,EAAE;AAClB,QAAA,KAAK,CAAC,aAAa,GAAG,SAAS;;SAC1B;AACL,QAAA,KAAK,CAAC,aAAa,GAAG,SAAS;;AAEnC;AAEA;;;;;;;;;AASG;AACH,SAAS,8BAA8B,CACrC,KAAY,EACZ,WAAwB,EACxB,KAAY,EACZ,KAAa,EACb,cAAuB,EAAA;AAEvB,IAAA,MAAM,QAAQ,GAAG,cAAc,GAAG,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,cAAc;AAC9E,IAAA,IACE,QAAQ,IAAI,IAAI;QAChB,OAAO,WAAW,IAAI,QAAQ;QAC9B,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,EAChD;;AAEA,QAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,6BAA6B,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAkB,CAAC;;AAEvF;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDG;AACH,SAAS,cAAc,CACrB,KAAY,EACZ,WAAiC,EACjC,KAAa,EACb,SAAkB,EAAA;IAElB,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAkB;AACzD,IAAA,MAAM,KAAK,GAAG,WAAW,KAAK,IAAI;IAClC,IAAI,MAAM,GAAG;AACX,UAAE,oBAAoB,CAAC,eAAe;AACtC,UAAE,oBAAoB,CAAC,eAAe,CAAC;IACzC,IAAI,cAAc,GAAG,KAAK;;;;;;AAM1B,IAAA,OAAO,MAAM,KAAK,CAAC,KAAK,cAAc,KAAK,KAAK,IAAI,KAAK,CAAC,EAAE;AAC1D,QAAA,SAAS,IAAI,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC;AAC9C,QAAA,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAgB;QAC1D,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAkB;AAC9D,QAAA,IAAI,cAAc,CAAC,qBAAqB,EAAE,WAAW,CAAC,EAAE;YACtD,cAAc,GAAG,IAAI;AACrB,YAAA,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;AAClB,kBAAE,6BAA6B,CAAC,mBAAmB;AACnD,kBAAE,6BAA6B,CAAC,mBAAmB,CAAC;;AAExD,QAAA,MAAM,GAAG;AACP,cAAE,oBAAoB,CAAC,mBAAmB;AAC1C,cAAE,oBAAoB,CAAC,mBAAmB,CAAC;;IAE/C,IAAI,cAAc,EAAE;;AAElB,QAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG;AACjB,cAAE,6BAA6B,CAAC,eAAe;AAC/C,cAAE,6BAA6B,CAAC,eAAe,CAAC;;AAEtD;AAEA;;;;;;;;;;;;;;;;;AAiBG;AACH,SAAS,cAAc,CAAC,iBAA8B,EAAE,WAAiC,EAAA;IACvF,SAAS;AACP,QAAA,cAAc,CACZ,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC1B,IAAI,EACJ,gDAAgD,CACjD;AACH,IAAA,IACE,iBAAiB,KAAK,IAAI;;QAE1B,WAAW,IAAI,IAAI;;QAEnB,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,MAAM,WAAW;MAC7F;AACA,QAAA,OAAO,IAAI;;AACN,SAAA,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;;;QAG9E,OAAO,oBAAoB,CAAC,iBAAiB,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;;AAEnE,IAAA,OAAO,KAAK;AACd;;ACtaA;AACA,MAAM,WAAW,GAAgB;AAC/B,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,GAAG,EAAE,CAAC;AACN,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,QAAQ,EAAE,CAAC;CACZ;AAED;;;AAGG;AACG,SAAU,gBAAgB,CAAC,IAAY,EAAA;AAC3C,IAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC;AAC5D;AAEA;;;AAGG;AACG,SAAU,kBAAkB,CAAC,IAAY,EAAA;AAC7C,IAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC;AAChE;AAEA;;;;;;;;;;;;AAYG;AACG,SAAU,cAAc,CAAC,IAAY,EAAA;IACzC,gBAAgB,CAAC,IAAI,CAAC;AACtB,IAAA,OAAO,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;AAClF;AAEA;;;;;;;;;;;;;;AAcG;AACa,SAAA,kBAAkB,CAAC,IAAY,EAAE,KAAa,EAAA;AAC5D,IAAA,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO;AAC/B,IAAA,IAAI,GAAG,KAAK,KAAK,EAAE;QACjB,OAAO,EAAE;;AAEX,IAAA,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;IACpF,OAAO,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;AAC5C;AAEA;;;;;;;;;;;;;AAaG;AACG,SAAU,UAAU,CAAC,IAAY,EAAA;IACrC,gBAAgB,CAAC,IAAI,CAAC;AACtB,IAAA,OAAO,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9E;AAEA;;;;;;;;;;;;;;AAcG;AACa,SAAA,cAAc,CAAC,IAAY,EAAE,UAAkB,EAAA;AAC7D,IAAA,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO;AAC/B,IAAA,IAAI,KAAK,IAAI,WAAW,CAAC,GAAG,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;AACxE,IAAA,IAAI,GAAG,KAAK,KAAK,EAAE;;QAEjB,OAAO,EAAE;;AAEX,IAAA,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;IAC9D,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAA,EAAA,sBAAiB;AAC1D,IAAA,KAAK,GAAG,WAAW,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;AAC/D,IAAA,KAAK,GAAG,WAAW,CAAC,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;IAClE,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,+BAAsB;AAChE;AAEA;;;AAGG;AACG,SAAU,gBAAgB,CAAC,IAAY,EAAA;AAC3C,IAAA,WAAW,CAAC,GAAG,GAAG,CAAC;AACnB,IAAA,WAAW,CAAC,MAAM,GAAG,CAAC;AACtB,IAAA,WAAW,CAAC,KAAK,GAAG,CAAC;AACrB,IAAA,WAAW,CAAC,QAAQ,GAAG,CAAC;AACxB,IAAA,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AACnC;AAEA;;;;;;;;AAQG;SACa,iBAAiB,CAAC,IAAY,EAAE,UAAkB,EAAE,QAAgB,EAAA;AAClF,IAAA,OAAO,UAAU,GAAG,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAkB,EAAA,uBAAE;AAC7E,QAAA,UAAU,EAAE;;AAEd,IAAA,OAAO,UAAU;AACnB;AAEA;;;;;;;AAOG;SACa,iBAAiB,CAAC,IAAY,EAAE,UAAkB,EAAE,QAAgB,EAAA;AAClF,IAAA,OAAO,UAAU,GAAG,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAiB,EAAA,uBAAE;AAC5E,QAAA,UAAU,EAAE;;AAEd,IAAA,OAAO,UAAU;AACnB;AAEA;;;;;;;AAOG;SACa,eAAe,CAAC,IAAY,EAAE,UAAkB,EAAE,QAAgB,EAAA;AAChF,IAAA,IAAI,EAAU;IACd,OACE,UAAU,GAAG,QAAQ;SACpB,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAmB,EAAA;AACnD,YAAA,EAAE,KAAwB,EAAA;aACzB,CAAC,EAAE,GAAA,GAAA,+BAAuB,EAAA,qBAAkB,CAAC,EAAE,GAAA,GAAA,+BAAuB,EAAA,kBAAe;aACrF,EAAE,8BAAqB,EAAE,2BAAkB,CAAC,EAC/C;AACA,QAAA,UAAU,EAAE;;AAEd,IAAA,OAAO,UAAU;AACnB;AAEA;;;;;;;AAOG;AACG,SAAU,gBAAgB,CAC9B,IAAY,EACZ,UAAkB,EAClB,QAAgB,EAChB,SAAiB,EAAA;IAEjB,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;AAC1D,IAAA,IAAI,UAAU,GAAG,QAAQ,EAAE;QACzB,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;AAC1D,YAAA,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;;AAEvE,QAAA,UAAU,EAAE;;AAEd,IAAA,OAAO,UAAU;AACnB;AAEA;;;;;;;AAOG;SACa,iBAAiB,CAAC,IAAY,EAAE,UAAkB,EAAE,QAAgB,EAAA;AAClF,IAAA,IAAI,GAAG,GAAG,EAAE,CAAC;AACb,IAAA,IAAI,GAAG,GAAG,EAAE,CAAC;AACb,IAAA,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,GAAG,UAAU;IAClB,IAAI,WAAW,GAAG,CAAC;AACnB,IAAA,OAAO,CAAC,GAAG,QAAQ,EAAE;QACnB,MAAM,EAAE,GAAW,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,EAAE,KAAwB,EAAA,4BAAE;AAC9B,YAAA,OAAO,WAAW;;AACb,aAAA,IAAI,EAAE,KAA0B,EAAA,gCAAI,EAAE,KAAA,EAAA,8BAA4B;AACvE,YAAA,WAAW,GAAG,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC;;AACrD,aAAA,IACL,UAAU,KAAK,CAAC,GAAG,CAAC;AACpB,YAAA,GAAG,KAAe,EAAA;AAClB,YAAA,GAAG,KAAe,EAAA;AAClB,YAAA,GAAG,KAAe,EAAA;YAClB,EAAE,KAAA,EAAA,4BACF;YACA,WAAW,GAAG,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAA,EAAA,6BAAwB,CAAC,EAAE,QAAQ,CAAC;;aACvE,IAAI,EAAE,GAAiB,EAAA,uBAAE;;YAE9B,WAAW,GAAG,CAAC;;QAEjB,GAAG,GAAG,GAAG;QACT,GAAG,GAAG,GAAG;QACT,GAAG,GAAG,EAAE,GAAA,GAAA;;AAEV,IAAA,OAAO,WAAW;AACpB;AAEA;;;;;;;;AAQG;AACG,SAAU,iBAAiB,CAC/B,IAAY,EACZ,aAAqB,EACrB,UAAkB,EAClB,QAAgB,EAAA;AAEhB,IAAA,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,GAAG,UAAU;AACtB,IAAA,OAAO,KAAK,GAAG,QAAQ,EAAE;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;AACnC,QAAA,IAAI,EAAE,IAAI,aAAa,IAAI,GAAG,KAAA,EAAA,4BAA0B;AACtD,YAAA,OAAO,KAAK;;AAEd,QAAA,IAAI,EAAE,IAAuB,EAAA,8BAAI,GAAG,KAAA,EAAA,4BAA0B;;;YAG5D,GAAG,GAAG,CAAC;;aACF;YACL,GAAG,GAAG,EAAE;;;AAGZ,IAAA,MAAM;AACJ,UAAE,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,QAAQ;AACxE,UAAE,IAAI,KAAK,EAAE;AACjB;AAEA,SAAS,mBAAmB,CAAC,IAAY,EAAE,SAAiB,EAAE,KAAa,EAAA;AACzE,IAAA,SAAS,IAAI,WAAW,CAAC,OAAO,IAAI,KAAK,QAAQ,EAAE,IAAI,EAAE,sBAAsB,CAAC;AAChF,IAAA,MAAM,UAAU,CACd,CAA+B,4BAAA,EAAA,KAAK,CAAc,YAAA,CAAA;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;QACxB,KAAK;QACL,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC;QAChC,KAAK;AACL,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QACrB,CAAiB,cAAA,EAAA,SAAS,CAAI,EAAA,CAAA,CACjC;AACH;;ACxTA;;;;;;;;;;;;;;;;;AAiBG;SACa,UAAU,CACxB,QAAgB,EAChB,KAAQ,EACR,SAA8B,EAAA;AAE9B,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,YAAY,GAAG,gBAAgB,EAAE;IACvC,IAAI,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE;AAC9C,QAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,QAAA,MAAM,KAAK,GAAG,gBAAgB,EAAE;QAChC,uBAAuB,CACrB,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAK,EACL,KAAK,CAAC,QAAQ,CAAC,EACf,SAAS,EACT,KAAK,CACN;AACD,QAAA,SAAS,IAAI,4BAA4B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC;;AAEtF,IAAA,OAAO,UAAU;AACnB;AAEA;;;AAGG;AACG,SAAU,qCAAqC,CACnD,KAAY,EACZ,KAAY,EACZ,KAAY,EACZ,KAAU,EACV,YAAqB,EAAA;;AAGrB,IAAA,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,GAAG,OAAO,EAAE,KAAK,CAAC;AACvF;;AClBA;;;;;;;;;;;;;;;;;;AAkBG;SACa,WAAW,CACzB,IAAY,EACZ,KAAqD,EACrD,MAAsB,EAAA;IAEtB,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;AAChD,IAAA,OAAO,WAAW;AACpB;AAEA;;;;;;;;;;;;;;AAcG;AACa,SAAA,WAAW,CACzB,SAAiB,EACjB,KAAiC,EAAA;IAEjC,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;AAClD,IAAA,OAAO,WAAW;AACpB;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACG,SAAU,UAAU,CAAC,MAA8D,EAAA;IACvF,eAAe,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC;AAC1E;AAEA;;;;;;;;AAQG;AACa,SAAA,iBAAiB,CAAC,aAAiC,EAAE,IAAY,EAAA;IAC/E,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;AAClE,QAAA,qBAAqB,CAAC,aAAa,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;;AAE1F;AAEA;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,UAAU,CACxB,OAAsF,EAAA;IAEtF,eAAe,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC;AAC1E;AAEA;;;;;;;;AAQG;AACa,SAAA,iBAAiB,CAAC,aAAiC,EAAE,IAAY,EAAA;IAC/E,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;QAC1E,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;;AAEjE;AAEA;;;;;;;AAOG;AACG,SAAU,oBAAoB,CAClC,IAAY,EACZ,KAAsB,EACtB,MAAiC,EACjC,YAAqB,EAAA;AAErB,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;;;;AAIxB,IAAA,MAAM,YAAY,GAAG,qBAAqB,CAAC,CAAC,CAAC;AAC7C,IAAA,IAAI,KAAK,CAAC,eAAe,EAAE;QACzB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC;;AAEjE,IAAA,IAAI,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE;QACrE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAU;AACrD,QAAA,aAAa,CACX,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,CAAC,QAAQ,CAAC,EACf,IAAI,GACH,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,GACzD,YAAY,EACZ,YAAY,CACb;;AAEL;AAEA;;;;;;;;;AASG;AACG,SAAU,eAAe,CAC7B,gBAAsF,EACtF,YAA4E,EAC5E,KAAsB,EACtB,YAAqB,EAAA;AAErB,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,YAAY,GAAG,qBAAqB,CAAC,CAAC,CAAC;AAC7C,IAAA,IAAI,KAAK,CAAC,eAAe,EAAE;QACzB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC;;AAEjE,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,IAAI,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE;;;QAGrE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAU;AACrD,QAAA,IAAI,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE;YACxF,IAAI,SAAS,EAAE;;;gBAGb,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC5C,WAAW,CACT,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,EACzD,KAAK,EACL,8DAA8D,CAC/D;;;;;;;;;AASH,YAAA,IAAI,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC,iBAAiB;YACpF,SAAS;AACP,gBAAA,YAAY,KAAK,KAAK;AACtB,gBAAA,YAAY,KAAK,IAAI;AACrB,gBAAA,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,0CAA0C,CAAC;AAC3F,YAAA,IAAI,YAAY,KAAK,IAAI,EAAE;;AAEzB,gBAAA,KAAK,GAAG,sBAAsB,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;;;;YAIlE,qCAAqC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC;;aAC1E;AACL,YAAA,gBAAgB,CACd,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,CAAC,QAAQ,CAAC,EACf,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,GACtB,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,sBAAsB,CAAC,gBAAgB,EAAE,YAAY,EAAE,KAAK,CAAC,GACxF,YAAY,EACZ,YAAY,CACb;;;AAGP;AAEA;;;;;AAKG;AACH,SAAS,gBAAgB,CAAC,KAAY,EAAE,YAAoB,EAAA;;AAE1D,IAAA,OAAO,YAAY,IAAI,KAAK,CAAC,iBAAiB;AAChD;AAEA;;;;;;;;AAQG;AACH,SAAS,sBAAsB,CAC7B,KAAY,EACZ,WAAwB,EACxB,YAAoB,EACpB,YAAqB,EAAA;AAErB,IAAA,SAAS,IAAI,qBAAqB,CAAC,KAAK,CAAC;AACzC,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI;IACxB,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;;;;;;AAMpC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAU;AAChD,QAAA,SAAS,IAAI,aAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC;QACnD,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC;AAC5D,QAAA,IAAI,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,WAAW,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;;;;;YAKzF,WAAW,GAAG,KAAK;;QAErB,WAAW,GAAG,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC;AAC7E,QAAA,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC;;AAEhG;AAEA;;;;;;;;;;;;;AAaG;AACG,SAAU,sBAAsB,CACpC,KAAY,EACZ,KAAY,EACZ,UAAuB,EACvB,YAAqB,EAAA;AAErB,IAAA,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,KAAK,CAAC;AACtD,IAAA,IAAI,QAAQ,GAAG,YAAY,GAAG,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,cAAc;AAC1E,IAAA,IAAI,gBAAgB,KAAK,IAAI,EAAE;;;;;AAK7B,QAAA,MAAM,mCAAmC,GACtC,CAAC,YAAY,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,MAAwB,CAAC;QACrF,IAAI,mCAAmC,EAAE;;;;AAIvC,YAAA,UAAU,GAAG,4BAA4B,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC;YACvF,UAAU,GAAG,wBAAwB,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC;;YAE5E,QAAQ,GAAG,IAAI;;;SAEZ;;;AAGL,QAAA,MAAM,oBAAoB,GAAG,KAAK,CAAC,oBAAoB;AACvD,QAAA,MAAM,sCAAsC,GAC1C,oBAAoB,KAAK,EAAE,IAAI,KAAK,CAAC,oBAAoB,CAAC,KAAK,gBAAgB;QACjF,IAAI,sCAAsC,EAAE;AAC1C,YAAA,UAAU,GAAG,4BAA4B,CACvC,gBAAgB,EAChB,KAAK,EACL,KAAK,EACL,UAAU,EACV,YAAY,CACb;AACD,YAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;;;;;;;gBAOrB,IAAI,kBAAkB,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC;gBAC/E,IAAI,kBAAkB,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;;;;AAIzE,oBAAA,kBAAkB,GAAG,4BAA4B,CAC/C,IAAI,EACJ,KAAK,EACL,KAAK,EACL,kBAAkB,CAAC,CAAC,CAAC,gCACrB,YAAY,CACb;oBACD,kBAAkB,GAAG,wBAAwB,CAC3C,kBAAkB,EAClB,KAAK,CAAC,KAAK,EACX,YAAY,CACb;oBACD,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,CAAC;;;iBAEvE;;;;;;gBAML,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC;;;;AAI5D,IAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;QAC1B,YAAY,IAAI,KAAK,CAAC,eAAe,GAAG,QAAQ,KAAK,KAAK,CAAC,cAAc,GAAG,QAAQ,CAAC;;AAEvF,IAAA,OAAO,UAAU;AACnB;AAEA;;;;;;;;;;;;AAYG;AACH,SAAS,0BAA0B,CACjC,KAAY,EACZ,KAAY,EACZ,YAAqB,EAAA;AAErB,IAAA,MAAM,QAAQ,GAAG,YAAY,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa;AACzE,IAAA,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;;AAExC,QAAA,OAAO,SAAS;;AAElB,IAAA,OAAO,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAgB;AAC7D;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDG;AACH,SAAS,0BAA0B,CACjC,KAAY,EACZ,KAAY,EACZ,YAAqB,EACrB,WAAwB,EAAA;AAExB,IAAA,MAAM,QAAQ,GAAG,YAAY,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa;IACzE,SAAS;QACP,cAAc,CACZ,oBAAoB,CAAC,QAAQ,CAAC,EAC9B,CAAC,EACD,0DAA0D,CAC3D;IACH,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,GAAG,WAAW;AACrD;AAEA;;;;;;;;;AASG;AACH,SAAS,eAAe,CACtB,KAAY,EACZ,KAAY,EACZ,YAAqB,EAAA;IAErB,IAAI,QAAQ,GAA0C,SAAS;AAC/D,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;IACvC,SAAS;QACP,cAAc,CACZ,KAAK,CAAC,oBAAoB,EAC1B,EAAE,EACF,8GAA8G,CAC/G;;;AAGH,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,oBAAoB,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;QAClE,MAAM,KAAK,GAAI,KAAK,CAAC,CAAC,CAAuB,CAAC,SAAS;QACvD,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAA8B;;IAEjG,OAAO,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,YAAY,CAA8B;AACnG;AAEA;;;;;;;;;;;AAWG;AACH,SAAS,4BAA4B,CACnC,gBAA0C,EAC1C,KAAY,EACZ,KAAY,EACZ,UAAuB,EACvB,YAAqB,EAAA;;;IAIrB,IAAI,gBAAgB,GAA6B,IAAI;AACrD,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;AACvC,IAAA,IAAI,oBAAoB,GAAG,KAAK,CAAC,oBAAoB;AACrD,IAAA,IAAI,oBAAoB,KAAK,EAAE,EAAE;AAC/B,QAAA,oBAAoB,GAAG,KAAK,CAAC,cAAc;;SACtC;AACL,QAAA,oBAAoB,EAAE;;AAExB,IAAA,OAAO,oBAAoB,GAAG,YAAY,EAAE;AAC1C,QAAA,gBAAgB,GAAG,KAAK,CAAC,oBAAoB,CAAsB;AACnE,QAAA,SAAS,IAAI,aAAa,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;QACtE,UAAU,GAAG,wBAAwB,CAAC,UAAU,EAAE,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC;QAC3F,IAAI,gBAAgB,KAAK,gBAAgB;YAAE;AAC3C,QAAA,oBAAoB,EAAE;;AAExB,IAAA,IAAI,gBAAgB,KAAK,IAAI,EAAE;;;;AAI7B,QAAA,KAAK,CAAC,oBAAoB,GAAG,oBAAoB;;AAEnD,IAAA,OAAO,UAAU;AACnB;AAEA;;;;;;AAMG;AACH,SAAS,wBAAwB,CAC/B,UAAmC,EACnC,KAAyB,EACzB,YAAqB,EAAA;IAErB,MAAM,aAAa,GAAG,YAAY,GAA2B,CAAA;IAC7D,IAAI,aAAa;AACjB,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAoB;AACxC,YAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAC5B,aAAa,GAAG,IAAI;;iBACf;AACL,gBAAA,IAAI,aAAa,KAAK,aAAa,EAAE;oBACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AAC9B,wBAAA,UAAU,GAAG,UAAU,KAAK,SAAS,GAAG,EAAE,GAAI,CAAC,EAAE,EAAE,UAAU,CAAS;;AAExE,oBAAA,gBAAgB,CACd,UAAgC,EAChC,IAAI,EACJ,YAAY,GAAG,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CACjC;;;;;IAKT,OAAO,UAAU,KAAK,SAAS,GAAG,IAAI,GAAG,UAAU;AACrD;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;SACa,sBAAsB,CACpC,gBAAsF,EACtF,YAA4E,EAC5E,KAA8E,EAAA;IAE9E,IAAI,KAAK,IAAI,IAAI,gCAAgC,KAAK,KAAK,EAAE;AAAE,QAAA,OAAO,WAAkB;IACxF,MAAM,kBAAkB,GAAuB,EAAS;AACxD,IAAA,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAA6C;AACzF,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;AACjC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC9C,gBAAgB,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;;;AAE1D,SAAA,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;AAC7C,QAAA,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE;AAChC,YAAA,IAAI,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;gBACtC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;;;;AAG7D,SAAA,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;AAC7C,QAAA,YAAY,CAAC,kBAAkB,EAAE,cAAc,CAAC;;SAC3C;QACL,SAAS;AACP,YAAA,UAAU,CACR,4BAA4B,GAAG,OAAO,cAAc,GAAG,IAAI,GAAG,cAAc,GAAG,GAAG,CACnF;;AAEL,IAAA,OAAO,kBAAkB;AAC3B;AAEA;;;;;;;;AAQG;SACa,qBAAqB,CAAC,aAAiC,EAAE,GAAW,EAAE,KAAU,EAAA;IAC9F,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;AAC9D;AAEA;;;;;;;;AAQG;SACa,qBAAqB,CAAC,aAAiC,EAAE,GAAY,EAAE,KAAU,EAAA;;;;;;AAM/F,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;AAC7B,IAAA,IAAI,SAAS,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAChD,QAAA,gBAAgB,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC;;AAErD;AAEA;;;;;;;;;;;;;;;;;AAiBG;AACH,SAAS,gBAAgB,CACvB,KAAY,EACZ,KAAY,EACZ,KAAY,EACZ,QAAkB,EAClB,gBAAoC,EACpC,gBAAoC,EACpC,YAAqB,EACrB,YAAoB,EAAA;AAEpB,IAAA,IAAK,gBAAmD,KAAK,SAAS,EAAE;;QAEtE,gBAAgB,GAAG,WAAkB;;IAEvC,IAAI,QAAQ,GAAG,CAAC;IAChB,IAAI,QAAQ,GAAG,CAAC;AAChB,IAAA,IAAI,MAAM,GAAkB,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;AACpF,IAAA,IAAI,MAAM,GAAkB,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IACpF,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE;QACzC,SAAS,IAAI,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,gCAAgC,CAAC;QAC5E,SAAS,IAAI,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,gCAAgC,CAAC;QAC5E,MAAM,QAAQ,GACZ,QAAQ,GAAG,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,SAAS;QACjF,MAAM,QAAQ,GACZ,QAAQ,GAAG,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,SAAS;QACjF,IAAI,MAAM,GAAkB,IAAI;QAChC,IAAI,QAAQ,GAAQ,SAAS;AAC7B,QAAA,IAAI,MAAM,KAAK,MAAM,EAAE;;YAErB,QAAQ,IAAI,CAAC;YACb,QAAQ,IAAI,CAAC;AACb,YAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;gBACzB,MAAM,GAAG,MAAM;gBACf,QAAQ,GAAG,QAAQ;;;AAEhB,aAAA,IAAI,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,MAAO,CAAC,EAAE;;;;;YAKnE,QAAQ,IAAI,CAAC;YACb,MAAM,GAAG,MAAM;;aACV;;;;AAIL,YAAA,SAAS,IAAI,aAAa,CAAC,MAAM,EAAE,+BAA+B,CAAC;YACnE,QAAQ,IAAI,CAAC;YACb,MAAM,GAAG,MAAM;YACf,QAAQ,GAAG,QAAQ;;AAErB,QAAA,IAAI,MAAM,KAAK,IAAI,EAAE;AACnB,YAAA,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC;;AAE5F,QAAA,MAAM,GAAG,QAAQ,GAAG,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,IAAI;AAC/E,QAAA,MAAM,GAAG,QAAQ,GAAG,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,IAAI;;AAEnF;AAEA;;;;;;;;;;;;;;;;AAgBG;AACH,SAAS,aAAa,CACpB,KAAY,EACZ,KAAY,EACZ,KAAY,EACZ,QAAkB,EAClB,IAAY,EACZ,KAA0C,EAC1C,YAAqB,EACrB,YAAoB,EAAA;IAEpB,IAAI,EAAE,KAAK,CAAC,IAAI,GAAqB,CAAA,0BAAC,EAAE;;;QAGtC;;AAEF,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI;IACxB,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAkB;AACvD,IAAA,MAAM,mBAAmB,GAAG,6BAA6B,CAAC,MAAM;AAC9D,UAAE,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAAE,YAAY;UACtF,SAAS;AACb,IAAA,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,EAAE;;AAE/C,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE;;AAEjC,YAAA,IAAI,6BAA6B,CAAC,MAAM,CAAC,EAAE;;AAEzC,gBAAA,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC;;;QAGlF,MAAM,KAAK,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,EAAE,KAAK,CAAa;QACrE,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;;AAE5D;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;AACH,SAAS,gBAAgB,CACvB,KAAY,EACZ,KAAmB,EACnB,KAAY,EACZ,IAAY,EACZ,KAAa,EACb,YAAqB,EAAA;;;;;;AAOrB,IAAA,MAAM,eAAe,GAAG,KAAK,KAAK,IAAI;IACtC,IAAI,KAAK,GAAQ,SAAS;AAC1B,IAAA,OAAO,KAAK,GAAG,CAAC,EAAE;AAChB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAgB;QAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;;AAE7C,QAAA,MAAM,GAAG,GAAG,eAAe,GAAI,MAAmB,CAAC,CAAC,CAAC,GAAG,MAAM;AAC9D,QAAA,MAAM,YAAY,GAAG,GAAG,KAAK,IAAI;QACjC,IAAI,iBAAiB,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AACxC,QAAA,IAAI,iBAAiB,KAAK,SAAS,EAAE;;;;;;;;YAQnC,iBAAiB,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS;;QAE5D,IAAI,YAAY,GAAG;AACjB,cAAE,gBAAgB,CAAC,iBAAiB,EAAE,IAAI;cACxC,GAAG,KAAK;AACR,kBAAE;kBACA,SAAS;QACf,IAAI,eAAe,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE;AAC3D,YAAA,YAAY,GAAG,gBAAgB,CAAC,MAA4B,EAAE,IAAI,CAAC;;AAErE,QAAA,IAAI,qBAAqB,CAAC,YAAY,CAAC,EAAE;YACvC,KAAK,GAAG,YAAY;YACpB,IAAI,eAAe,EAAE;AACnB,gBAAA,OAAO,KAAK;;;QAGhB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAkB;AAChD,QAAA,KAAK,GAAG,eAAe,GAAG,oBAAoB,CAAC,MAAM,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC;;AAEvF,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;;;AAGlB,QAAA,IAAI,QAAQ,GAAG,YAAY,GAAG,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,cAAc;AAC1E,QAAA,IAAI,QAAQ,IAAI,IAAI,oCAAoC;AACtD,YAAA,KAAK,GAAG,gBAAgB,CAAC,QAAS,EAAE,IAAI,CAAC;;;AAG7C,IAAA,OAAO,KAAK;AACd;AAEA;;;;;AAKG;AACH,SAAS,qBAAqB,CAAC,KAAU,EAAA;;;;;IAKvC,OAAO,KAAK,KAAK,SAAS;AAC5B;AAEA;;;;;;AAMG;AACH,SAAS,eAAe,CACtB,KAAU,EACV,MAAiC,EAAA;IAEjC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AAK5B,SAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACrC,QAAA,KAAK,GAAG,KAAK,GAAG,MAAM;;AACjB,SAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACpC,KAAK,GAAG,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;;AAE3C,IAAA,OAAO,KAAK;AACd;AAEA;;;;;;;;AAQG;AACa,SAAA,qBAAqB,CAAC,KAAY,EAAE,YAAqB,EAAA;AACvE,IAAA,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,YAAY,GAAE,CAAA,kCAAoD,EAAA,gCAAC,MAAM,CAAC;AACnG;;ACj9BA;;;;;;;;;;;;;;;;;;;;AAoBG;SACa,sBAAsB,CAAC,MAAc,EAAE,EAAO,EAAE,MAAc,EAAA;AAC5E,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC;IACnE,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;AAEA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACG,SAAU,sBAAsB,CACpC,MAAc,EACd,EAAO,EACP,EAAU,EACV,EAAO,EACP,MAAc,EAAA;AAEd,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC;IAC3E,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;AACa,SAAA,sBAAsB,CACpC,MAAc,EACd,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,MAAc,EAAA;AAEd,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;IACxB,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC;IACnF,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;SACa,sBAAsB,CACpC,MAAc,EACd,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,MAAc,EAAA;AAEd,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;IACxB,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC;IAC3F,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;AACG,SAAU,sBAAsB,CACpC,MAAc,EACd,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,MAAc,EAAA;AAEd,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,iBAAiB,GAAG,cAAc,CACtC,KAAK,EACL,MAAM,EACN,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,MAAM,CACP;IACD,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BG;AACG,SAAU,sBAAsB,CACpC,MAAc,EACd,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,MAAc,EAAA;AAEd,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,iBAAiB,GAAG,cAAc,CACtC,KAAK,EACL,MAAM,EACN,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,MAAM,CACP;IACD,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCG;AACa,SAAA,sBAAsB,CACpC,MAAc,EACd,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,MAAc,EAAA;AAEd,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,iBAAiB,GAAG,cAAc,CACtC,KAAK,EACL,MAAM,EACN,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,MAAM,CACP;IACD,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;AACa,SAAA,sBAAsB,CACpC,MAAc,EACd,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,EAAU,EACV,EAAO,EACP,MAAc,EAAA;AAEd,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,iBAAiB,GAAG,cAAc,CACtC,KAAK,EACL,MAAM,EACN,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,MAAM,CACP;IACD,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;AAEA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACG,SAAU,sBAAsB,CAAC,MAAa,EAAA;AAClD,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;IACxB,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC;IACvD,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;AAC/E;;AC5dA;;;;;;AAMG;AAMH;;;;;;AAMG;SACa,mBAAmB,GAAA;IACjC,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC;AAChE,IAAA,SAAS,IAAI,aAAa,CAAC,QAAQ,EAAE,2CAA2C,CAAC;AACjF,IAAA,OAAO,QAAQ;AACjB;;ACVA;;;;AAIG;MACmB,cAAc,CAAA;AAMlC,IAAA,OAAO,CAAC,IAAO,EAAA;;;IAGf,WAAW,CAAC,KAAa,EAAE,KAAQ,EAAA;;;;;;IAOnC,IAAI,CAAC,MAAc,EAAE,MAAc,EAAA;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AACnC,QAAA,IAAI,MAAM,GAAG,QAAQ,GAAG,CAAC,EAAE;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACvC,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC9B,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;;aACzB;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;;;IAGlC,IAAI,CAAC,SAAiB,EAAE,MAAc,EAAA;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;;AAE9C;AAED,SAAS,cAAc,CACrB,OAAe,EACf,SAAY,EACZ,MAAc,EACd,QAAW,EACX,OAA2B,EAAA;AAE3B,IAAA,IAAI,OAAO,KAAK,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;;AAExD,QAAA,OAAO,CAAC;;AACH,SAAA,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE;;QAE5E,OAAO,EAAE;;AAGX,IAAA,OAAO,CAAC;AACV;AAEA,SAAS,mBAAmB,CAAC,QAAmC,EAAE,GAAY,EAAE,GAAW,EAAA;IACzF,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;AAElC,IAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1B,QAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;;SACZ;AACL,QAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAErC;AAEA;;;;;;;;;;;;;;;;;;;;;;AAsBG;SACa,SAAS,CACvB,cAAoC,EACpC,aAA6C,EAC7C,SAA6B,EAAA;IAE7B,IAAI,aAAa,GAAmD,SAAS;IAC7E,IAAI,mBAAmB,GAA6B,SAAS;IAE7D,IAAI,YAAY,GAAG,CAAC;AACpB,IAAA,IAAI,UAAU,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC;AAE1C,IAAA,MAAM,aAAa,GAAG,SAAS,GAAG,IAAI,GAAG,EAAwB,GAAG,SAAS;AAE7E,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;AAChC,QAAA,IAAI,SAAS,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;QAExC,OAAO,YAAY,IAAI,UAAU,IAAI,YAAY,IAAI,SAAS,EAAE;;YAE9D,MAAM,cAAc,GAAG,cAAc,CAAC,EAAE,CAAC,YAAY,CAAC;AACtD,YAAA,MAAM,aAAa,GAAG,aAAa,CAAC,YAAY,CAAC;YAEjD,IAAI,SAAS,EAAE;AACb,gBAAA,mBAAmB,CAAC,aAAc,EAAE,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC;;AAG3F,YAAA,MAAM,eAAe,GAAG,cAAc,CACpC,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,CACV;AACD,YAAA,IAAI,eAAe,KAAK,CAAC,EAAE;AACzB,gBAAA,IAAI,eAAe,GAAG,CAAC,EAAE;AACvB,oBAAA,cAAc,CAAC,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC;;AAEzD,gBAAA,YAAY,EAAE;gBACd;;;;YAKF,MAAM,YAAY,GAAG,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC;AAClD,YAAA,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC;YAE5C,IAAI,SAAS,EAAE;AACb,gBAAA,mBAAmB,CAAC,aAAc,EAAE,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC;;AAGnF,YAAA,MAAM,aAAa,GAAG,cAAc,CAClC,UAAU,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,CACV;AACD,YAAA,IAAI,aAAa,KAAK,CAAC,EAAE;AACvB,gBAAA,IAAI,aAAa,GAAG,CAAC,EAAE;AACrB,oBAAA,cAAc,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC;;AAErD,gBAAA,UAAU,EAAE;AACZ,gBAAA,SAAS,EAAE;gBACX;;;YAIF,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,EAAE,cAAc,CAAC;YAC5D,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC;YACtD,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC;YAC1D,IAAI,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE;gBACtC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC;;gBAEnD,IAAI,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE;AACtC,oBAAA,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC;AAC7C,oBAAA,cAAc,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC;AACnD,oBAAA,SAAS,EAAE;AACX,oBAAA,UAAU,EAAE;;qBACP;;;AAGL,oBAAA,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;;AAE/C,gBAAA,cAAc,CAAC,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC;AACvD,gBAAA,YAAY,EAAE;gBACd;;;;AAKF,YAAA,aAAa,KAAK,IAAI,sBAAsB,EAAE;YAC9C,mBAAmB,KAAK,wBAAwB,CAC9C,cAAc,EACd,YAAY,EACZ,UAAU,EACV,SAAS,CACV;;YAGD,IAAI,wBAAwB,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE;AACtF,gBAAA,cAAc,CAAC,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC;AACvD,gBAAA,YAAY,EAAE;AACd,gBAAA,UAAU,EAAE;;iBACP,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;;AAEhD,gBAAA,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;AAChF,gBAAA,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC;AAC5C,gBAAA,YAAY,EAAE;AACd,gBAAA,UAAU,EAAE;;iBACP;;;;AAIL,gBAAA,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACpE,gBAAA,UAAU,EAAE;;;;;AAMhB,QAAA,OAAO,YAAY,IAAI,SAAS,EAAE;AAChC,YAAA,cAAc,CACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,YAAY,EACZ,aAAa,CAAC,YAAY,CAAC,CAC5B;AACD,YAAA,YAAY,EAAE;;;AAEX,SAAA,IAAI,aAAa,IAAI,IAAI,EAAE;;QAEhC,MAAM,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAC9D,QAAA,IAAI,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,EAAE;QACrD,OAAO,CAAC,kBAAkB,CAAC,IAAI,IAAI,YAAY,IAAI,UAAU,EAAE;YAC7D,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,CAAC,YAAY,CAAC;AACjD,YAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK;YAEzC,IAAI,SAAS,EAAE;AACb,gBAAA,mBAAmB,CAAC,aAAc,EAAE,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;;AAGtF,YAAA,MAAM,eAAe,GAAG,cAAc,CACpC,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,SAAS,CACV;AACD,YAAA,IAAI,eAAe,KAAK,CAAC,EAAE;;AAEzB,gBAAA,IAAI,eAAe,GAAG,CAAC,EAAE;AACvB,oBAAA,cAAc,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC;;AAEpD,gBAAA,YAAY,EAAE;AACd,gBAAA,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,EAAE;;iBAC5C;AACL,gBAAA,aAAa,KAAK,IAAI,sBAAsB,EAAE;gBAC9C,mBAAmB,KAAK,wBAAwB,CAC9C,cAAc,EACd,YAAY,EACZ,UAAU,EACV,SAAS,CACV;;gBAGD,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC;gBAChD,IAAI,wBAAwB,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE;AACjF,oBAAA,cAAc,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC;AAClD,oBAAA,YAAY,EAAE;AACd,oBAAA,UAAU,EAAE;AACZ,oBAAA,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,EAAE;;qBAC5C,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC3C,oBAAA,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAClF,oBAAA,YAAY,EAAE;AACd,oBAAA,UAAU,EAAE;AACZ,oBAAA,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,EAAE;;qBAC5C;;oBAEL,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC;AAClD,oBAAA,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAC/D,oBAAA,UAAU,EAAE;;;;;;AAOlB,QAAA,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE;AAC/B,YAAA,cAAc,CACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,cAAc,CAAC,MAAM,EACrB,kBAAkB,CAAC,KAAK,CACzB;AACD,YAAA,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,EAAE;;;;;AAMrD,IAAA,OAAO,YAAY,IAAI,UAAU,EAAE;QACjC,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;;;AAI7D,IAAA,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,KAAI;AAC9B,QAAA,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9B,KAAC,CAAC;;IAGF,IAAI,SAAS,EAAE;QACb,IAAI,iBAAiB,GAAG,EAAE;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,aAAc,EAAE;AAC1C,YAAA,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE;gBACnB,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC7C,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnC,iBAAiB,CAAC,IAAI,CACpB,CAAA,KAAA,EAAQ,iBAAiB,CAAC,GAAG,CAAC,CAAA,YAAA,EAAe,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAU,OAAA,EAAA,GAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAC3E;;;;AAKP,QAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;AAChC,YAAA,MAAM,OAAO,GAAG,kBAAkB,CAAA,IAAA,mDAEhC,oFAAoF;gBAClF,mGAAmG;gBACnG,0BAA0B;AAC1B,gBAAA,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,gBAAA,GAAG,CACN;AAED,YAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;;;AAG3B;AAEA,SAAS,wBAAwB,CAC/B,cAAoC,EACpC,aAA6D,EAC7D,KAAa,EACb,GAAY,EAAA;IAEZ,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACzD,QAAA,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AACrD,QAAA,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;AACzB,QAAA,OAAO,IAAI;;AAEb,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,cAAc,CACrB,cAAoC,EACpC,aAA6D,EAC7D,SAAmC,EACnC,KAAa,EACb,KAAQ,EAAA;AAER,IAAA,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE;QAC5F,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;AACnD,QAAA,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;;SAChC;AACL,QAAA,cAAc,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;;AAE5C;AAEA,SAAS,wBAAwB,CAC/B,cAAgD,EAChD,KAAa,EACb,GAAW,EACX,SAAmC,EAAA;AAEnC,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE;AACtB,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;AAE9C,IAAA,OAAO,IAAI;AACb;AAEA;;;;;;;;;;;AAWG;MACU,sBAAsB,CAAA;;AAEzB,IAAA,KAAK,GAAG,IAAI,GAAG,EAAQ;;;;IAIvB,KAAK,GAA0B,SAAS;AAEhD,IAAA,GAAG,CAAC,GAAM,EAAA;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;;AAG5B,IAAA,MAAM,CAAC,GAAM,EAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;QAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE;AAClC,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACrD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;AAC3C,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;;aACnB;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;;AAGxB,QAAA,OAAO,IAAI;;AAGb,IAAA,GAAG,CAAC,GAAM,EAAA;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;;IAG5B,GAAG,CAAC,GAAM,EAAE,KAAQ,EAAA;QAClB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACvB,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE;;;AAIpC,YAAA,IAAI,SAAS,IAAI,SAAS,KAAK,KAAK,EAAE;gBACpC,MAAM,IAAI,KAAK,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAgB,aAAA,EAAA,GAAG,CAAE,CAAA,CAAC;;AAG5E,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAC5B,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE;;AAGxB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;AACvB,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AAC1B,gBAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAE;;AAElC,YAAA,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC;;aACrB;YACL,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;;;AAI9B,IAAA,OAAO,CAAC,EAAwB,EAAA;QAC9B,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACnC,YAAA,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC;AACd,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAC5B,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;AACvB,gBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACtB,oBAAA,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE;AACxB,oBAAA,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC;;;;;AAKvB;;AChaD;;;;;;;;;AASG;AACa,SAAA,aAAa,CAAI,qBAA6B,EAAE,YAAgB,EAAA;IAC9E,sBAAsB,CAAC,eAAe,CAAC;AAEvC,IAAA,MAAM,SAAS,GAAG,QAAQ,EAAE;AAC5B,IAAA,MAAM,YAAY,GAAG,gBAAgB,EAAE;IACvC,MAAM,yBAAyB,GAC7B,SAAS,CAAC,YAAY,CAAC,KAAK,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE;AACtE,IAAA,MAAM,aAAa,GACjB,yBAAyB,KAAK;UAC1B,aAAa,CAAC,SAAS,EAAE,aAAa,GAAG,yBAAyB;UAClE,SAAS;IACf,MAAM,kBAAkB,GAAG,CAAC;IAE5B,IAAI,cAAc,CAAC,SAAS,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE;AAClE,QAAA,MAAM,YAAY,GAAGA,mBAAiB,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI;;;AAGF,YAAA,IAAI,aAAa,KAAK,SAAS,EAAE;AAC/B,gBAAA,yBAAyB,CAAC,aAAa,EAAE,kBAAkB,CAAC;;;;AAK9D,YAAA,IAAI,qBAAqB,KAAK,CAAC,CAAC,EAAE;AAChC,gBAAA,MAAM,mBAAmB,GAAG,aAAa,GAAG,qBAAqB;gBACjE,MAAM,aAAa,GAAG,aAAa,CAAC,SAAS,EAAE,mBAAmB,CAAC;gBACnE,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;AAE7E,gBAAA,MAAM,cAAc,GAAG,0BAA0B,CAC/C,aAAa,EACb,aAAa,CAAC,KAAM,CAAC,KAAK,CAC3B;gBACD,MAAM,aAAa,GAAG,4BAA4B,CAAC,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE;oBACzF,cAAc;AACf,iBAAA,CAAC;AAEF,gBAAA,oBAAoB,CAClB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,kBAAkB,CAAC,aAAa,EAAE,cAAc,CAAC,CAClD;;;gBAEK;YACRA,mBAAiB,CAAC,YAAY,CAAC;;;AAE5B,SAAA,IAAI,aAAa,KAAK,SAAS,EAAE;;;QAGtC,MAAM,KAAK,GAAG,sBAAsB,CAAgB,aAAa,EAAE,kBAAkB,CAAC;AACtF,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,KAAK,CAAC,OAAO,CAAC,GAAG,YAAY;;;AAGnC;MAEa,eAAe,CAAA;AAEhB,IAAA,UAAA;AACD,IAAA,SAAA;AACA,IAAA,MAAA;AAHT,IAAA,WAAA,CACU,UAAsB,EACvB,SAAY,EACZ,MAAc,EAAA;QAFb,IAAU,CAAA,UAAA,GAAV,UAAU;QACX,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAM,CAAA,MAAA,GAAN,MAAM;;AAGf,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,uBAAuB;;AAE1D;AAED;;;;;;AAMG;AACG,SAAU,sBAAsB,CAAC,KAAa,EAAA;AAClD,IAAA,OAAO,KAAK;AACd;AAEA;;;;;;;AAOG;AACa,SAAA,yBAAyB,CAAI,CAAS,EAAE,KAAQ,EAAA;AAC9D,IAAA,OAAO,KAAK;AACd;AAEA,MAAM,gBAAgB,CAAA;AAEX,IAAA,aAAA;AACA,IAAA,SAAA;AACA,IAAA,cAAA;AAHT,IAAA,WAAA,CACS,aAAsB,EACtB,SAAmC,EACnC,cAA6C,EAAA;QAF7C,IAAa,CAAA,aAAA,GAAb,aAAa;QACb,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAc,CAAA,cAAA,GAAd,cAAc;;AAExB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;AACG,SAAU,gBAAgB,CAC9B,KAAa,EACb,UAAsC,EACtC,KAAa,EACb,IAAY,EACZ,OAAsB,EACtB,UAAyB,EACzB,SAAmC,EACnC,4BAAsC,EACtC,eAA4C,EAC5C,UAAmB,EACnB,SAAkB,EAClB,YAA4B,EAC5B,eAA+B,EAAA;IAE/B,sBAAsB,CAAC,eAAe,CAAC;IAEvC,SAAS;QACP,cAAc,CACZ,SAAS,EACT,CAAA,2CAAA,EAA8C,OAAO,SAAS,CAAA,SAAA,CAAW,CAC1E;AAEH,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,aAAa,GAAG,eAAe,KAAK,SAAS;AACnD,IAAA,MAAM,SAAS,GAAG,QAAQ,EAAE;IAC5B,MAAM,YAAY,GAAG;AACnB;;YAEE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC;UAC7D,SAAS;IACb,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC;AAClE,IAAA,SAAS,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,QAAQ;IAE3C,eAAe,CACb,KAAK,EACL,KAAK,EACL,KAAK,GAAG,CAAC,EACT,UAAU,EACV,KAAK,EACL,IAAI,EACJ,OAAO,EACP,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CACtC;IAED,IAAI,aAAa,EAAE;QACjB,SAAS;AACP,YAAA,aAAa,CAAC,UAAU,EAAE,8DAA8D,CAAC;QAC3F,SAAS;AACP,YAAA,aAAa,CAAC,SAAS,EAAE,0DAA0D,CAAC;QAEtF,eAAe,CACb,KAAK,EACL,KAAK,EACL,KAAK,GAAG,CAAC,EACT,eAAe,EACf,UAAW,EACX,SAAU,EACV,YAAY,EACZ,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAC3C;;AAEL;AAEA,SAAS,yBAAyB,CAAC,KAAY,EAAA;;AAE7C,IAAA,OAAO,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,CAAC;AACzC;AAEA,MAAM,iBAAiB,CAAA;IACrB,OAAO,GAAG,CAAC;IACX,SAAS,GAAG,CAAC;IAEb,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC;AAChB,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC;;IAGpB,YAAY,GAAA;QACV,IAAI,CAAC,OAAO,EAAE;;IAGhB,aAAa,GAAA;QACX,IAAI,CAAC,SAAS,EAAE;;AAGlB;;;;;;AAMG;AACH,IAAA,YAAY,CAAC,aAAqB,EAAA;AAChC,QAAA,OAAO,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa;;AAEhG;AAED,MAAM,4BAA6B,SAAQ,cAG1C,CAAA;AAUW,IAAA,UAAA;AACA,IAAA,SAAA;AACA,IAAA,aAAA;AAXV,IAAA,iBAAiB,GAAG,SAAS,GAAG,IAAI,iBAAiB,EAAE,GAAG,SAAS;AAEnE;;;;AAIC;IACO,gBAAgB,GAAG,KAAK;AAChC,IAAA,WAAA,CACU,UAAsB,EACtB,SAAgB,EAChB,aAAoB,EAAA;AAE5B,QAAA,KAAK,EAAE;QAJC,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAa,CAAA,aAAA,GAAb,aAAa;;AAKvB,IAAA,IAAa,MAAM,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,uBAAuB;;AAEhD,IAAA,EAAE,CAAC,KAAa,EAAA;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS;;IAEvC,MAAM,CAAC,KAAa,EAAE,KAAsC,EAAA;AACnE,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAA4B;QAClE,IAAI,CAAC,gBAAgB,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM;AAC/C,QAAA,oBAAoB,CAClB,IAAI,CAAC,UAAU,EACf,KAAK,EACL,KAAK,EACL,kBAAkB,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CACvD;;AAEM,IAAA,MAAM,CAAC,KAAa,EAAA;QAC3B,IAAI,CAAC,gBAAgB,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;QACnD,OAAO,kBAAkB,CAA2B,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;;IAEpE,MAAM,CAAC,KAAa,EAAE,KAAc,EAAA;AAC3C,QAAA,MAAM,cAAc,GAAG,0BAA0B,CAC/C,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,CAAC,KAAM,CAAC,KAAK,CAChC;AACD,QAAA,MAAM,aAAa,GAAG,4BAA4B,CAChD,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,aAAa,EAClB,IAAI,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,EAClD,EAAC,cAAc,EAAC,CACjB;AACD,QAAA,IAAI,CAAC,iBAAiB,EAAE,YAAY,EAAE;AAEtC,QAAA,OAAO,aAAa;;AAEb,IAAA,OAAO,CAAC,KAAsC,EAAA;QACrD,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE;;IAEhC,WAAW,CAAC,KAAa,EAAE,KAAc,EAAA;AAChD,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,KAAK;;IAGjD,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAC7B,QAAA,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE;;IAGjC,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,gBAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;;;;AAKlC,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC5B,OAAO,8BAA8B,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;;AAEhE;AAED;;;;;;AAMG;AACG,SAAU,UAAU,CAAC,UAAgD,EAAA;AACzE,IAAA,MAAM,YAAY,GAAGA,mBAAiB,CAAC,IAAI,CAAC;AAC5C,IAAA,MAAM,eAAe,GAAG,gBAAgB,EAAE;AAC1C,IAAA,IAAI;AACF,QAAA,MAAM,SAAS,GAAG,QAAQ,EAAE;AAC5B,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;AAClC,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,eAAe,CAAqB;AAC/D,QAAA,MAAM,cAAc,GAAG,eAAe,GAAG,CAAC;QAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC;AAE3D,QAAA,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,EAAE;YACzC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;AACrE,YAAA,QAAQ,CAAC,cAAc,GAAG,IAAI,4BAA4B,CACxD,UAAU,EACV,SAAS,EACT,iBAAiB,CAClB;;aACI;AACL,YAAA,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE;;AAGjC,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc;QAC9C,SAAS,CAAC,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC;;;;;AAMzD,QAAA,IACE,SAAS;YACT,QAAQ,CAAC,SAAS,KAAK,yBAAyB;YAChD,cAAc,CAAC,iBAAiB,EAAE,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC;YACrE,yBAAyB,CAAC,8BAA8B,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EACxE;YACA,MAAM,OAAO,GAAG,kBAAkB,CAAA,CAAA,GAAA,6CAEhC,8GAA8G,cAAc,CAAC,MAAM,CAAI,EAAA,CAAA;gBACrI,yHAAyH;AACzH,gBAAA,uGAAuG,CAC1G;AACD,YAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;;;QAIvB,cAAc,CAAC,aAAa,EAAE;;AAG9B,QAAA,IAAI,QAAQ,CAAC,aAAa,EAAE;AAC1B,YAAA,MAAM,YAAY,GAAG,gBAAgB,EAAE;AACvC,YAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,KAAK,CAAC;YACrD,IAAI,cAAc,CAAC,SAAS,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAAE;AAC9D,gBAAA,MAAM,kBAAkB,GAAG,eAAe,GAAG,CAAC;gBAC9C,MAAM,kBAAkB,GAAG,aAAa,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBACvE,IAAI,iBAAiB,EAAE;oBACrB,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,EAAE,kBAAkB,CAAC;AAC1E,oBAAA,MAAM,cAAc,GAAG,0BAA0B,CAC/C,kBAAkB,EAClB,kBAAkB,CAAC,KAAM,CAAC,KAAK,CAChC;AACD,oBAAA,MAAM,aAAa,GAAG,4BAA4B,CAChD,SAAS,EACT,kBAAkB,EAClB,SAAS,EACT,EAAC,cAAc,EAAC,CACjB;AACD,oBAAA,oBAAoB,CAClB,kBAAkB,EAClB,aAAa,EACb,CAAC,EACD,kBAAkB,CAAC,kBAAkB,EAAE,cAAc,CAAC,CACvD;;qBACI;AACL,oBAAA,yBAAyB,CAAC,kBAAkB,EAAE,CAAC,CAAC;;;;;YAI9C;QACRA,mBAAiB,CAAC,YAAY,CAAC;;AAEnC;AAEA,SAAS,aAAa,CAAC,KAAY,EAAE,KAAa,EAAA;AAChD,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;AAC/B,IAAA,SAAS,IAAI,gBAAgB,CAAC,UAAU,CAAC;AAEzC,IAAA,OAAO,UAAU;AACnB;AAEA,SAAS,kBAAkB,CAAI,UAAsB,EAAE,KAAa,EAAA;IAClE,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC;AACnD,IAAA,SAAS,IAAI,WAAW,CAAC,aAAa,CAAC;AAEvC,IAAA,OAAO,aAAyB;AAClC;AAEA,SAAS,8BAA8B,CAAI,UAAsB,EAAE,KAAa,EAAA;IAC9E,MAAM,aAAa,GAAG,sBAAsB,CAAI,UAAU,EAAE,KAAK,CAAC;AAClE,IAAA,SAAS,IAAI,WAAW,CAAC,aAAa,CAAC;AAEvC,IAAA,OAAO,aAAc;AACvB;AAEA,SAAS,gBAAgB,CAAC,KAAY,EAAE,KAAa,EAAA;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;AACpC,IAAA,SAAS,IAAI,WAAW,CAAC,KAAK,CAAC;AAE/B,IAAA,OAAO,KAAK;AACd;;ACnZA;;;;;;;;;;;;;;AAcG;AACG,SAAU,cAAc,CAC5B,KAAa,EACb,IAAY,EACZ,UAA0B,EAC1B,cAAuB,EAAA;AAEvB,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,aAAa,GAAG,aAAa,GAAG,KAAK;IAE3C,SAAS;QACP,WAAW,CACT,eAAe,EAAE,EACjB,KAAK,CAAC,iBAAiB,EACvB,gDAAgD,CACjD;AACH,IAAA,SAAS,IAAI,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC;AAErD,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;AAChC,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC;AAClB,UAAE,2BAA2B,CACzB,aAAa,EACb,KAAK,EACL,KAAK,EACL,IAAI,EACJ,uBAAuB,EACvB,kBAAkB,EAAE,EACpB,UAAU,EACV,cAAc;AAElB,UAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAkB;AAE/C,IAAA,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC;AACrF,IAAA,KAAK,CAAC,aAAa,CAAC,GAAG,MAAM;AAE7B,IAAA,MAAM,aAAa,GAAG,eAAe,CAAC,KAAK,CAAC;AAE5C,IAAA,IAAI,SAAS,IAAI,KAAK,CAAC,eAAe,EAAE;AACtC,QAAA,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC;;AAGlF,IAAA,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;AAC5B,IAAA,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC;IAE9C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,kBAAkB,EAAE,EAAE;;;QAGpD,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;;;;;AAM1C,IAAA,IAAI,oBAAoB,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE;AACjD,QAAA,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;;AAEhC,IAAA,yBAAyB,EAAE;IAE3B,IAAI,aAAa,EAAE;AACjB,QAAA,yBAAyB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAC9C,QAAA,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;;AAE5C,IAAA,IAAI,cAAc,KAAK,IAAI,EAAE;AAC3B,QAAA,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC;;AAExC,IAAA,OAAO,cAAc;AACvB;AAEA;;;;;AAKG;SACa,YAAY,GAAA;AAC1B,IAAA,IAAI,YAAY,GAAG,eAAe,EAAG;AACrC,IAAA,SAAS,IAAI,aAAa,CAAC,YAAY,EAAE,0BAA0B,CAAC;IACpE,IAAI,oBAAoB,EAAE,EAAE;AAC1B,QAAA,0BAA0B,EAAE;;SACvB;AACL,QAAA,SAAS,IAAI,eAAe,CAAC,eAAe,EAAE,CAAC;AAC/C,QAAA,YAAY,GAAG,YAAY,CAAC,MAAO;AACnC,QAAA,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC;;IAGtC,MAAM,KAAK,GAAG,YAAY;AAC1B,IAAA,SAAS,IAAI,eAAe,CAAC,KAAK,6BAAqB;AAEvD,IAAA,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE;AACnC,QAAA,uBAAuB,EAAE;;AAG3B,IAAA,yBAAyB,EAAE;AAE3B,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,IAAI,KAAK,CAAC,eAAe,EAAE;AACzB,QAAA,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC;;IAGzC,IAAI,KAAK,CAAC,kBAAkB,IAAI,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;AAC5D,QAAA,qCAAqC,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC;;IAGjG,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;AAC3D,QAAA,qCAAqC,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC;;AAEjG,IAAA,OAAO,YAAY;AACrB;AAEA;;;;;;;;;;AAUG;AACG,SAAU,SAAS,CACvB,KAAa,EACb,IAAY,EACZ,UAA0B,EAC1B,cAAuB,EAAA;IAEvB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC;AACvD,IAAA,YAAY,EAAE;AACd,IAAA,OAAO,SAAS;AAClB;AAEA,IAAI,0BAA0B,GAAyC,CACrE,KAAY,EACZ,KAAY,EACZ,KAAY,EACZ,QAAkB,EAClB,IAAY,EACZ,KAAa,KACX;IACF,kBAAkB,CAAC,IAAI,CAAC;IACxB,OAAO,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAC1D,CAAC;AAED;;;AAGG;AACH,SAAS,6BAA6B,CACpC,KAAY,EACZ,KAAY,EACZ,KAAY,EACZ,QAAkB,EAClB,IAAY,EACZ,KAAa,EAAA;AAEb,IAAA,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC;IACtC,MAAM,kBAAkB,GACtB,CAAC,aAAa;AACd,QAAAD,wBAAsB,EAAE;QACxB,gBAAgB,CAAC,KAAK,CAAC;AACvB,QAAAK,oBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC;IAC1C,kBAAkB,CAAC,kBAAkB,CAAC;;IAGtC,IAAI,kBAAkB,EAAE;QACtB,OAAO,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;;AAI1D,IAAA,MAAM,MAAM,GAAG,eAAe,CAAW,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAE;AAC7E,IAAA,SAAS,IAAI,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;AAChF,IAAA,SAAS,IAAI,6BAA6B,CAAC,MAAM,CAAC;;AAGlD,IAAA,IAAI,2BAA2B,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE;;;;;;;QAOrD,SAAS,IAAI,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC;QACjE,cAAc,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC;;;;;;AAO1D,IAAA,IACE,aAAa;SACZ,2BAA2B,CAAC,KAAK,CAAC,IAAI,8BAA8B,CAAC,MAAM,CAAC,CAAC,EAC9E;AACA,QAAA,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;YAC1B,uBAAuB,CAAC,KAAK,CAAC;;;YAI9B,oBAAoB,CAAC,MAAM,CAAC;AAE5B,YAAA,SAAS,IAAI,6BAA6B,CAAC,MAAM,CAAC;;aAC7C,IAAI,SAAS,EAAE;;;AAGpB,YAAA,MAAM,wBAAwB,CAAC,MAAM,CAAC;;;AAG1C,IAAA,OAAO,MAAM;AACf;SAEgB,mCAAmC,GAAA;IACjD,0BAA0B,GAAG,6BAA6B;AAC5D;;ACtPA,SAAS,oCAAoC,CAC3C,KAAa,EACb,KAAY,EACZ,KAAY,EACZ,UAA0B,EAC1B,cAAuB,EAAA;AAEvB,IAAA,SAAS,IAAI,SAAS,CAAC,eAAe,EAAE;AAExC,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM;IAChC,MAAM,KAAK,GAAG,WAAW,CAAc,WAAW,EAAE,UAAU,CAAC;AAC/D,IAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAA,CAAA,mCAA8B,cAAc,EAAE,KAAK,CAAC;;;AAI/F,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,QAAA,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;;IAG1C,MAAM,SAAS,GAAG,WAAW,CAAW,WAAW,EAAE,cAAc,CAAC;IACpE,IAAI,kBAAkB,EAAE,EAAE;QACxB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,uBAAuB,CAAC;;;AAI5E,IAAA,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;AAElE,IAAA,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE;QAC1B,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;;AAG1C,IAAA,OAAO,KAAK;AACd;AAEA;;;;;;;;;;;;;;AAcG;SACa,uBAAuB,CACrC,KAAa,EACb,UAA0B,EAC1B,cAAuB,EAAA;AAEvB,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,aAAa,GAAG,KAAK,GAAG,aAAa;AAE3C,IAAA,SAAS,IAAI,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC;IACrD,SAAS;QACP,WAAW,CACT,eAAe,EAAE,EACjB,KAAK,CAAC,iBAAiB,EACvB,0DAA0D,CAC3D;AAEH,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC;AAClB,UAAE,oCAAoC,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc;AAC9F,UAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAA2B;AACxD,IAAA,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;AAE5B,IAAA,MAAM,OAAO,GAAG,mCAAmC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAC/E,IAAA,KAAK,CAAC,aAAa,CAAC,GAAG,OAAO;IAE9B,IAAI,kBAAkB,EAAE,EAAE;QACxB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;;AAE3C,IAAA,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC;AAE/B,IAAA,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;AAC1B,QAAA,yBAAyB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAC9C,QAAA,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;;AAG5C,IAAA,IAAI,cAAc,IAAI,IAAI,EAAE;AAC1B,QAAA,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC;;AAGxC,IAAA,OAAO,uBAAuB;AAChC;AAEA;;;;;AAKG;SACa,qBAAqB,GAAA;AACnC,IAAA,IAAI,YAAY,GAAG,eAAe,EAAG;AACrC,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;IACxB,IAAI,oBAAoB,EAAE,EAAE;AAC1B,QAAA,0BAA0B,EAAE;;SACvB;AACL,QAAA,SAAS,IAAI,eAAe,CAAC,YAAY,CAAC;AAC1C,QAAA,YAAY,GAAG,YAAY,CAAC,MAAO;AACnC,QAAA,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC;;AAGtC,IAAA,SAAS,IAAI,eAAe,CAAC,YAAY,qCAA6B;AAEtE,IAAA,IAAI,KAAK,CAAC,eAAe,EAAE;AACzB,QAAA,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC;AAC3C,QAAA,IAAI,kBAAkB,CAAC,YAAY,CAAC,EAAE;AACpC,YAAA,KAAK,CAAC,OAAQ,CAAC,UAAU,CAAC,YAAY,CAAC;;;AAG3C,IAAA,OAAO,qBAAqB;AAC9B;AAEA;;;;;;;;;;AAUG;SACa,kBAAkB,CAChC,KAAa,EACb,UAA0B,EAC1B,cAAuB,EAAA;AAEvB,IAAA,uBAAuB,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC;AAC1D,IAAA,qBAAqB,EAAE;AACvB,IAAA,OAAO,kBAAkB;AAC3B;AAEA,IAAI,mCAAmC,GAA8C,CACnF,KAAY,EACZ,KAAY,EACZ,KAAY,EACZ,KAAa,KACX;IACF,kBAAkB,CAAC,IAAI,CAAC;AACxB,IAAA,OAAO,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,cAAc,GAAG,EAAE,CAAC;AAC5E,CAAC;AAED;;;;AAIG;AACH,SAAS,kCAAkC,CACzC,KAAY,EACZ,KAAY,EACZ,KAAY,EACZ,KAAa,EAAA;AAEb,IAAA,IAAI,OAAiB;AACrB,IAAA,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC;IACtC,MAAM,kBAAkB,GACtB,CAAC,aAAa;AACd,QAAAL,wBAAsB,EAAE;AACxB,QAAAK,oBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC;QACxC,gBAAgB,CAAC,KAAK,CAAC;IAEzB,kBAAkB,CAAC,kBAAkB,CAAC;;IAGtC,IAAI,kBAAkB,EAAE;AACtB,QAAA,OAAO,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,cAAc,GAAG,EAAE,CAAC;;;AAI5E,IAAA,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAE;IACzE,SAAS,IAAI,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC;IAE3D,MAAM,eAAe,GAAG,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAW;IAC1E,SAAS;AACP,QAAA,YAAY,CACV,eAAe,EACf,iDAAiD,GAAG,qCAAqC,CAC1F;AAEH,IAAA,cAAc,CAAC,aAAa,EAAE,KAAK,EAAE,YAAY,CAAC;AAClD,IAAA,OAAO,GAAG,YAAY,CAAW,eAAe,EAAE,YAAY,CAAE;IAEhE,IAAI,SAAS,EAAE;AACb,QAAA,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;QACpE,6BAA6B,CAAC,OAAO,CAAC;;AAGxC,IAAA,OAAO,OAAO;AAChB;SAEgB,4CAA4C,GAAA;IAC1D,mCAAmC,GAAG,kCAAkC;AAC1E;;ACnPA;;;;;;;;AAQG;SACa,gBAAgB,GAAA;IAC9B,OAAO,QAAQ,EAA4B;AAC7C;;ACIA;;;;;;;;;;;;;AAaG;SACa,cAAc,CAC5B,QAAgB,EAChB,KAAQ,EACR,SAA8B,EAAA;AAE9B,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,YAAY,GAAG,gBAAgB,EAAE;IACvC,IAAI,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE;AAC9C,QAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,QAAA,MAAM,KAAK,GAAG,gBAAgB,EAAE;QAChC,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC;AAC/F,QAAA,SAAS,IAAI,4BAA4B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC;;AAEtF,IAAA,OAAO,cAAc;AACvB;AAEA;;;;;;;;;;;;;;;;;;;;AAoBG;SACa,uBAAuB,CACrC,QAAgB,EAChB,KAAoB,EACpB,SAA8B,EAAA;AAE9B,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,MAAM,YAAY,GAAG,gBAAgB,EAAE;IACvC,IAAI,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE;AAC9C,QAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,QAAA,MAAM,KAAK,GAAG,gBAAgB,EAAE;QAChC,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC;QACrD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC;AAChE,QAAA,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC;AACxF,QAAA,SAAS,IAAI,4BAA4B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC;;AAEtF,IAAA,OAAO,uBAAuB;AAChC;;ACpFA;AACA,MAAM,CAAC,GAAG,SAAS;AAEnB,SAAS,MAAM,CAAC,GAAW,EAAA;AAC3B,IAAA,MAAe,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,CAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAE1F,IAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,QAAA,OAAO,CAAC;AACZ,IAAA,OAAO,CAAC;AACR;AAEA,eAAe,CAAC,IAAI,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,EAAC,UAAU,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS,EAAC,UAAU,EAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,CAAC,eAAe,EAAC,aAAa,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,QAAQ,EAAC,UAAU,EAAC,WAAW,EAAC,iBAAiB,CAAC,EAAC,CAAC,QAAQ,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,CAAC,EAAC,CAAC,UAAU,EAAC,CAAC,EAAC,cAAc,EAAC,CAAC,CAAC,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,KAAK,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,WAAW,EAAC,EAAE,EAAC,KAAK,EAAE,MAAM,CAAC;;ACP3zB;;AAEG;AACH,IAAI,WAAW,GAA8B,EAAE;AAE/C;;;;;;AAMG;SACa,kBAAkB,CAAC,IAAS,EAAE,QAAuB,EAAE,SAAe,EAAA;AACpF,IAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;QAChC,SAAS,GAAG,QAAQ;AACpB,QAAA,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;;AAG3C,IAAA,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAEpD,IAAA,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI;IAE5B,IAAI,SAAS,EAAE;QACb,WAAW,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS;;AAEhE;AAEA;;;;;;AAMG;AACG,SAAU,cAAc,CAAC,MAAc,EAAA;AAC3C,IAAA,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC;AAEhD,IAAA,IAAI,KAAK,GAAG,aAAa,CAAC,gBAAgB,CAAC;IAC3C,IAAI,KAAK,EAAE;AACT,QAAA,OAAO,KAAK;;;IAId,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnD,IAAA,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC;IACnC,IAAI,KAAK,EAAE;AACT,QAAA,OAAO,KAAK;;AAGd,IAAA,IAAI,YAAY,KAAK,IAAI,EAAE;AACzB,QAAA,OAAO,QAAQ;;IAGjB,MAAM,IAAI,YAAY,CAEpB,GAAA,6CAAA,SAAS,IAAI,CAAuC,oCAAA,EAAA,MAAM,CAAI,EAAA,CAAA,CAC/D;AACH;AAEA;;;;;;;;AAQG;AACG,SAAU,qBAAqB,CAAC,MAAc,EAAA;AAClD,IAAA,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC;IACnC,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,IAAI;AACnD;AAEA;;;;;;;AAOG;AACG,SAAU,mBAAmB,CAAC,MAAc,EAAA;AAChD,IAAA,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC;AACnC,IAAA,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AACzC;AAEA;;;AAGG;AACG,SAAU,aAAa,CAAC,gBAAwB,EAAA;AACpD,IAAA,IAAI,EAAE,gBAAgB,IAAI,WAAW,CAAC,EAAE;QACtC,WAAW,CAAC,gBAAgB,CAAC;AAC3B,YAAAZ,OAAM,CAAC,EAAE;gBACTA,OAAM,CAAC,EAAE,CAAC,MAAM;AAChB,gBAAAA,OAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO;gBACxBA,OAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;;AAE9C,IAAA,OAAO,WAAW,CAAC,gBAAgB,CAAC;AACtC;AAEA;;AAEG;SACa,uBAAuB,GAAA;IACrC,WAAW,GAAG,EAAE;AAClB;AAEA;;AAEG;IACS;AAAZ,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,eAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAY;AACZ,IAAA,eAAA,CAAA,eAAA,CAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAgB;AAChB,IAAA,eAAA,CAAA,eAAA,CAAA,sBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,sBAAoB;AACpB,IAAA,eAAA,CAAA,eAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAU;AACV,IAAA,eAAA,CAAA,eAAA,CAAA,gBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,gBAAc;AACd,IAAA,eAAA,CAAA,eAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAY;AACZ,IAAA,eAAA,CAAA,eAAA,CAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAgB;AAChB,IAAA,eAAA,CAAA,eAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI;AACJ,IAAA,eAAA,CAAA,eAAA,CAAA,gBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,gBAAc;AACd,IAAA,eAAA,CAAA,eAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAY;AACZ,IAAA,eAAA,CAAA,eAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAU;AACV,IAAA,eAAA,CAAA,eAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAU;AACV,IAAA,eAAA,CAAA,eAAA,CAAA,gBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,gBAAc;AACd,IAAA,eAAA,CAAA,eAAA,CAAA,eAAA,CAAA,GAAA,EAAA,CAAA,GAAA,eAAa;AACb,IAAA,eAAA,CAAA,eAAA,CAAA,eAAA,CAAA,GAAA,EAAA,CAAA,GAAA,eAAa;AACb,IAAA,eAAA,CAAA,eAAA,CAAA,cAAA,CAAA,GAAA,EAAA,CAAA,GAAA,cAAY;AACZ,IAAA,eAAA,CAAA,eAAA,CAAA,gBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,gBAAc;AACd,IAAA,eAAA,CAAA,eAAA,CAAA,cAAA,CAAA,GAAA,EAAA,CAAA,GAAA,cAAY;AACZ,IAAA,eAAA,CAAA,eAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAU;AACV,IAAA,eAAA,CAAA,eAAA,CAAA,gBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,gBAAc;AACd,IAAA,eAAA,CAAA,eAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAU;AACV,IAAA,eAAA,CAAA,eAAA,CAAA,WAAA,CAAA,GAAA,EAAA,CAAA,GAAA,WAAS;AACX,CAAC,EAvBW,eAAe,KAAf,eAAe,GAuB1B,EAAA,CAAA,CAAA;AAoBD;;AAEG;AACH,SAAS,eAAe,CAAC,MAAc,EAAA;IACrC,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAChD;;ACjKA,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;AAE3D;;AAEG;AACa,SAAA,aAAa,CAAC,KAAa,EAAE,MAAc,EAAA;AACzD,IAAA,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC/D,IAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IACpC,OAAO,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,OAAO;AAChD;AAEA;;AAEG;AACI,MAAM,iBAAiB,GAAG;AAEjC;;;AAGG;AACI,MAAM,iBAAiB,GAAG,KAAK;;AC6HtC;;;;AAIG;AACI,MAAM,cAAc,GAAmB;AAC5C,IAAA,MAAM,EAAE,SAAS;CAClB;AAKD;;;;AAIG;AACI,MAAM,UAAU,GAAe;AACpC,IAAA,MAAM,EAAE,KAAK;CACd;AAsDD;;AAEG;AACH,IAAY,gBAgBX;AAhBD,CAAA,UAAY,gBAAgB,EAAA;AAC1B;;;AAGG;AACH,IAAA,gBAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AAET;;AAEG;AACH,IAAA,gBAAA,CAAA,gBAAA,CAAA,gBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,gBAAqB;AAErB;;AAEG;AACH,IAAA,gBAAA,CAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAc;AAChB,CAAC,EAhBW,gBAAgB,KAAhB,gBAAgB,GAgB3B,EAAA,CAAA,CAAA;;AC5OD;;;;AAIG;AACH,IAAIuC,WAAS,GAAG,iBAAiB;AAEjC;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,QAAgB,EAAA;AAC1C,IAAA,SAAS,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAA,+BAAA,CAAiC,CAAC;AACvE,IAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAChC,QAAAA,WAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;;AAEzD;AAEA;;;;AAIG;SACa,WAAW,GAAA;AACzB,IAAA,OAAOA,WAAS;AAClB;;AC2BA;;;;;;;;;;;;AAYG;AACH,IAAI,UAAU,GAAG,GAAG;AAEpB;;;;AAIG;AACH,IAAI,iBAAiB,GAAG,CAAC;AAEzB;;;;;;AAMG;AACG,SAAU,UAAU,CAAC,SAAkB,EAAA;IAC3C,IAAI,SAAS,EAAE;AACb,QAAA,UAAU,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;;AAElE,IAAA,iBAAiB,EAAE;AACrB;SAEgB,SAAS,CAAC,KAAY,EAAE,KAAY,EAAE,KAAa,EAAA;AACjE,IAAA,IAAI,iBAAiB,GAAG,CAAC,EAAE;AACzB,QAAA,SAAS,IAAI,aAAa,CAAC,KAAK,EAAE,CAAA,uBAAA,CAAyB,CAAC;QAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAA8B;;AAE5D,QAAA,MAAM,aAAa,GAAsB,KAAK,CAAC,OAAO,CAAC,KAAK;AAC1D,cAAG;AACH,cAAG,KAAe,CAAC,MAAM;QAC3B,MAAM,kBAAkB,GAAG,eAAe,EAAE,GAAG,iBAAiB,GAAG,CAAC;QACpE,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,UAAU,CAAC;;;IAGjF,UAAU,GAAG,GAAG;IAChB,iBAAiB,GAAG,CAAC;AACvB;AAEA,SAAS,0BAA0B,CACjC,KAAY,EACZ,UAAkB,EAClB,QAAqF,EAAA;AAErF,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAEhC,QAAQ,QAAQ;QACd,KAAK,IAAI,CAAC,YAAY;AACpB,YAAA,OAAO,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC;QAEhD,KAAK,IAAI,CAAC,SAAS;AACjB,YAAA,OAAO,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC;QAE7C,KAAK,IAAI,CAAC,YAAY;YACpB,OAAO,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;;AAE1D;AAEA,IAAI,mBAAmB,GAAkC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,KAAI;IAC9F,kBAAkB,CAAC,IAAI,CAAC;IACxB,OAAO,0BAA0B,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC;AAChE,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAY,EACZ,KAAa,EACb,UAAkB,EAClB,QAAqF,EAAA;AAErF,IAAA,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC;AACtC,IAAA,MAAM,aAAa,GAAG,KAAK,GAAG,aAAa;AAC3C,IAAA,MAAM,kBAAkB,GACtB,CAAC,6BAA6B,EAAE;AAChC,QAAA,CAAC,aAAa;AACd,QAAAhC,wBAAsB,EAAE;AACxB,QAAAK,oBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC;IAElD,kBAAkB,CAAC,kBAAkB,CAAC;IACtC,IAAI,kBAAkB,EAAE;QACtB,OAAO,0BAA0B,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC;;IAGhE,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAc,EAAE,aAAa,CAAU;;;;;;;AAQ7E,IAAA,SAAS,IAAI,aAAa,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC7D,SAAS,IAAI,WAAW,CAAE,MAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,4BAA4B,CAAC;IAC3F,SAAS;QACP,QAAQ,KAAK,IAAI,CAAC,YAAY;AAC9B,QAAA,WAAW,CACR,MAAsB,CAAC,OAAO,CAAC,WAAW,EAAE,EAC7C,UAAU,CAAC,WAAW,EAAE,EACxB,4BAA4B,CAC7B;AACH,IAAA,SAAS,IAAI,6BAA6B,CAAC,MAAM,CAAC;AAElD,IAAA,OAAO,MAAM;AACf;SAEgB,gCAAgC,GAAA;IAC9C,mBAAmB,GAAG,sBAAsB;AAC9C;AAEA;;;;;;;;;;AAUG;AACG,SAAU,kBAAkB,CAChC,KAAY,EACZ,aAAgC,EAChC,WAA4B,EAC5B,eAAgC,EAAA;AAEhC,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;AAChC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC7C,QAAA,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,CAAQ;AACxC,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAW;AACvC,QAAA,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,OAAO,MAAM,gBAAgB,CAAC,OAAO;AAClF,QAAA,MAAM,SAAS,GACb,CAAC,MAAM,GAAG,gBAAgB,CAAC,cAAc,MAAM,gBAAgB,CAAC,cAAc;AAChF,QAAA,MAAM,KAAK,GAAG,MAAM,KAAK,gBAAgB,CAAC,KAAK;AAC/C,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,kBAAkB,GAAG,KAAK;AAC9B,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;;;AAGlB,YAAA,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,mBAAmB,CACxC,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAC/C;YACD,kBAAkB,GAAG,kBAAkB,EAAE;;QAE3C,IAAI,SAAS,IAAI,WAAW,KAAK,IAAI,IAAI,kBAAkB,EAAE;YAC3D,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC;;;AAG9E;AAEA;;;;;;;AAOG;AACG,SAAU,mBAAmB,CACjC,KAAY,EACZ,cAAgC,EAChC,KAAY,EACZ,WAAkB,EAAA;AAElB,IAAA,SAAS,IAAI,aAAa,CAAC,WAAW,CAAC;AACvC,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;;IAEhC,IAAI,OAAO,GAAkB,IAAI;;;;;;AAMjC,IAAA,IAAI,SAA2B;AAC/B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,OAAO,MAAM,IAAI,QAAQ,EAAE;AAC7B,YAAA,MAAM,aAAa,GAAG,cAAc,CAAC,EAAE,CAAC,CAAW;AACnD,YAAA,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;AACjC,gBAAA,SAAS,IAAI,SAAS,CAAC,sBAAsB,EAAE;AAC/C,gBAAA,SAAS,IAAI,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC;AACrD,gBAAA,KAAK,CAAC,aAAa,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;;;AAErF,aAAA,IAAI,OAAO,MAAM,IAAI,QAAQ,EAAE;YACpC,QAAQ,MAAM,GAAmC,CAAA;AAC/C,gBAAA,KAAA,CAAA;AACE,oBAAA,MAAM,SAAS,GAAG,4BAA4B,CAAC,MAAM,CAAC;AACtD,oBAAA,IAAI,OAAO,KAAK,IAAI,EAAE;;;;wBAIpB,OAAO,GAAG,SAAS;AACnB,wBAAA,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;;AAE9C,oBAAA,IAAI,eAA6B;AACjC,oBAAA,IAAI,WAA4B;AAChC,oBAAA,IAAI,SAAS,KAAK,OAAO,EAAE;wBACzB,eAAe,GAAG,WAAW;wBAC7B,WAAW,GAAG,SAAS;;yBAClB;wBACL,eAAe,GAAG,IAAI;wBACtB,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAa;;;AAGzD,oBAAA,IAAI,WAAW,KAAK,IAAI,EAAE;;;;;AAKxB,wBAAA,SAAS,IAAI,aAAa,CAAC,WAAW,CAAC;AACvC,wBAAA,MAAM,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC;wBAChD,SAAS,IAAI,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC;;;AAGpE,wBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAa;AACvC,wBAAA,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC;wBACjC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC;wBACxE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;wBACnC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;;;AAG7C,4BAAA,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC;4BAC7B,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC;AACrD,4BAAA,IAAI,SAAS,KAAK,IAAI,EAAE;AACtB,gCAAA,mBAAm   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   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   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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"}`<lJxS/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

/**
 * Current injector value used by `inject`.
 * - `undefined`: it is an error to call `inject`
 * - `null`: `inject` can be called but there is no injector (limp-mode).
 * - Injector instance: Use the injector for resolution.
 */
let _currentInjector = undefined;
function getCurrentInjector() {
    return _currentInjector;
}
function setCurrentInjector(injector) {
    const former = _currentInjector;
    _currentInjector = injector;
    return former;
}

/**
 * Value returned if the key-value pair couldn't be found in the context
 * hierarchy.
 */
const NOT_FOUND = Symbol('NotFound');
/**
 * Error thrown when the key-value pair couldn't be found in the context
 * hierarchy. Context can be attached below.
 */
class NotFoundError extends Error {
    constructor(message) {
        super(message);
    }
}
/**
 * Type guard for checking if an unknown value is a NotFound.
 */
function isNotFound(e) {
    return e === NOT_FOUND || e instanceof NotFoundError;
}

export { NOT_FOUND, NotFoundError, getCurrentInjector, isNotFound, setCurrentInjector };
//# sourceMappingURL=di.mjs.map
ix
m{"version":3,"file":"di.mjs","sources":["../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/di/src/injector.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/di/src/not_found.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from './injection_token';\nimport {NotFound} from './not_found';\n\nexport interface Injector {\n  retrieve<T>(token: InjectionToken<T>, options?: unknown): T | NotFound;\n}\n\n/**\n * Current injector value used by `inject`.\n * - `undefined`: it is an error to call `inject`\n * - `null`: `inject` can be called but there is no injector (limp-mode).\n * - Injector instance: Use the injector for resolution.\n */\nlet _currentInjector: Injector | undefined | null = undefined;\n\nexport function getCurrentInjector(): Injector | undefined | null {\n  return _currentInjector;\n}\n\nexport function setCurrentInjector(\n  injector: Injector | null | undefined,\n): Injector | undefined | null {\n  const former = _currentInjector;\n  _currentInjector = injector;\n  return former;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Value returned if the key-value pair couldn't be found in the context\n * hierarchy.\n */\nexport const NOT_FOUND: unique symbol = Symbol('NotFound');\n\n/**\n * Error thrown when the key-value pair couldn't be found in the context\n * hierarchy. Context can be attached below.\n */\nexport class NotFoundError extends Error {\n  constructor(message: string) {\n    super(message);\n  }\n}\n\n/**\n * Type guard for checking if an unknown value is a NotFound.\n */\nexport function isNotFound(e: unknown): e is NotFound {\n  return e === NOT_FOUND || e instanceof NotFoundError;\n}\n\n/**\n * Type union of NotFound and NotFoundError.\n */\nexport type NotFound = typeof NOT_FOUND | NotFoundError;\n"],"names":[],"mappings":";;;;;;AAeA;;;;;AAKG;AACH,IAAI,gBAAgB,GAAgC,SAAS;SAE7C,kBAAkB,GAAA;AAChC,IAAA,OAAO,gBAAgB;AACzB;AAEM,SAAU,kBAAkB,CAChC,QAAqC,EAAA;IAErC,MAAM,MAAM,GAAG,gBAAgB;IAC/B,gBAAgB,GAAG,QAAQ;AAC3B,IAAA,OAAO,MAAM;AACf;;ACzBA;;;AAGG;MACU,SAAS,GAAkB,MAAM,CAAC,UAAU;AAEzD;;;AAGG;AACG,MAAO,aAAc,SAAQ,KAAK,CAAA;AACtC,IAAA,WAAA,CAAY,OAAe,EAAA;QACzB,KAAK,CAAC,OAAO,CAAC;;AAEjB;AAED;;AAEG;AACG,SAAU,UAAU,CAAC,CAAU,EAAA;AACnC,IAAA,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,YAAY,aAAa;AACtD;;;;"}#׈xc/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

const Attribute = {
    /**
     * The jsaction attribute defines a mapping of a DOM event to a
     * generic event (aka jsaction), to which the actual event handlers
     * that implement the behavior of the application are bound. The
     * value is a semicolon separated list of colon separated pairs of
     * an optional DOM event name and a jsaction name. If the optional
     * DOM event name is omitted, 'click' is assumed. The jsaction names
     * are dot separated pairs of a namespace and a simple jsaction
     * name.
     *
     * See grammar in README.md for expected syntax in the attribute value.
     */
    JSACTION: 'jsaction',
};

/** All properties that are used by jsaction. */
const Property = {
    /**
     * The parsed value of the jsaction attribute is stored in this
     * property on the DOM node. The parsed value is an Object. The
     * property names of the object are the events; the values are the
     * names of the actions. This property is attached even on nodes
     * that don't have a jsaction attribute as an optimization, because
     * property lookup is faster than attribute access.
     */
    JSACTION: '__jsaction',
    /**
     * The owner property references an a logical owner for a DOM node. JSAction
     * will follow this reference instead of parentNode when traversing the DOM
     * to find jsaction attributes. This allows overlaying a logical structure
     * over a document where the DOM structure can't reflect that structure.
     */
    OWNER: '__owner',
};

/**
 * Map from jsaction annotation to a parsed map from event name to action name.
 */
const parseCache = {};
/**
 * Reads the jsaction parser cache from the given DOM Element.
 */
function get(element) {
    return element[Property.JSACTION];
}
/**
 * Reads the jsaction parser cache for the given DOM element. If no cache is yet present,
 * creates an empty one.
 */
function getDefaulted(element) {
    const cache = get(element) ?? {};
    set(element, cache);
    return cache;
}
/**
 * Writes the jsaction parser cache to the given DOM Element.
 */
function set(element, actionMap) {
    element[Property.JSACTION] = actionMap;
}
/**
 * Looks up the parsed action map from the source jsaction attribute value.
 *
 * @param text Unparsed jsaction attribute value.
 * @return Parsed jsaction attribute value, if already present in the cache.
 */
function getParsed(text) {
    return parseCache[text];
}
/**
 * Inserts the parse result for the given source jsaction value into the cache.
 *
 * @param text Unparsed jsaction attribute value.
 * @param parsed Attribute value parsed into the action map.
 */
function setParsed(text, parsed) {
    parseCache[text] = parsed;
}

/*
 * Names of events that are special to jsaction. These are not all
 * event types that are legal to use in either HTML or the addEvent()
 * API, but these are the ones that are treated specially. All other
 * DOM events can be used in either addEvent() or in the value of the
 * jsaction attribute. Beware of browser specific events or events
 * that don't bubble though: If they are not mentioned here, then
 * event contract doesn't work around their peculiarities.
 */
const EventType = {
    /**
     * The click event. In addEvent() refers to all click events, in the
     * jsaction attribute it refers to the unmodified click and Enter/Space
     * keypress events.  In the latter case, a jsaction click will be triggered,
     * for accessibility reasons.  See clickmod and clickonly, below.
     */
    CLICK: 'click',
    /**
     * Specifies the jsaction for a modified click event (i.e. a mouse
     * click with the modifier key Cmd/Ctrl pressed). This event isn't
     * separately enabled in addEvent(), because in the DOM, it's just a
     * click event.
     */
    CLICKMOD: 'clickmod',
    /**
     * The dblclick event.
     */
    DBLCLICK: 'dblclick',
    /**
     * Focus doesn't bubble, but you can use it in addEvent() and
     * jsaction anyway. EventContract does the right thing under the
     * hood.
     */
    FOCUS: 'focus',
    /**
     * This event only exists in IE. For addEvent() and jsaction, use
     * focus instead; EventContract does the right thing even though
     * focus doesn't bubble.
     */
    FOCUSIN: 'focusin',
    /**
     * Analog to focus.
     */
    BLUR: 'blur',
    /**
     * Analog to focusin.
     */
    FOCUSOUT: 'focusout',
    /**
     * Submit doesn't bubble, so it cannot be used with event
     * contract. However, the browser helpfully fires a click event on
     * the submit button of a form (even if the form is not submitted by
     * a click on the submit button). So you should handle click on the
     * submit button instead.
     */
    SUBMIT: 'submit',
    /**
     * The keydown event. In addEvent() and non-click jsaction it represents the
     * regular DOM keydown event. It represents click actions in non-Gecko
     * browsers.
     */
    KEYDOWN: 'keydown',
    /**
     * The keypress event. In addEvent() and non-click jsaction it represents the
     * regular DOM keypress event. It represents click actions in Gecko browsers.
     */
    KEYPRESS: 'keypress',
    /**
     * The keyup event. In addEvent() and non-click jsaction it represents the
     * regular DOM keyup event. It represents click actions in non-Gecko
     * browsers.
     */
    KEYUP: 'keyup',
    /**
     * The mouseover event. Can either be used directly or used implicitly to
     * capture mouseenter events. In addEvent(), it represents a regular DOM
     * mouseover event.
     */
    MOUSEOVER: 'mouseover',
    /**
     * The mouseout event. Can either be used directly or used implicitly to
     * capture mouseover events. In addEvent(), it represents a regular DOM
     * mouseout event.
     */
    MOUSEOUT: 'mouseout',
    /**
     * The mouseenter event. Does not bubble and fires individually on each
     * element being entered within a DOM tree.
     */
    MOUSEENTER: 'mouseenter',
    /**
     * The mouseleave event. Does not bubble and fires individually on each
     * element being entered within a DOM tree.
     */
    MOUSELEAVE: 'mouseleave',
    /**
     * The pointerover event. Can either be used directly or used implicitly to
     * capture pointerenter events. In addEvent(), it represents a regular DOM
     * pointerover event.
     */
    POINTEROVER: 'pointerover',
    /**
     * The pointerout event. Can either be used directly or used implicitly to
     * capture pointerover events. In addEvent(), it represents a regular DOM
     * pointerout event.
     */
    POINTEROUT: 'pointerout',
    /**
     * The pointerenter event. Does not bubble and fires individually on each
     * element being entered within a DOM tree.
     */
    POINTERENTER: 'pointerenter',
    /**
     * The pointerleave event. Does not bubble and fires individually on each
     * element being entered within a DOM tree.
     */
    POINTERLEAVE: 'pointerleave',
    /**
     * The error event. The error event doesn't bubble, but you can use it in
     * addEvent() and jsaction anyway. EventContract does the right thing under
     * the hood (except in IE8 which does not use error events).
     */
    ERROR: 'error',
    /**
     * The load event. The load event doesn't bubble, but you can use it in
     * addEvent() and jsaction anyway. EventContract does the right thing
     * under the hood.
     */
    LOAD: 'load',
    /**
     * The touchstart event. Bubbles, will only ever fire in browsers with
     * touch support.
     */
    TOUCHSTART: 'touchstart',
    /**
     * The touchend event. Bubbles, will only ever fire in browsers with
     * touch support.
     */
    TOUCHEND: 'touchend',
    /**
     * The touchmove event. Bubbles, will only ever fire in browsers with
     * touch support.
     */
    TOUCHMOVE: 'touchmove',
    /**
     * The toggle event. The toggle event doesn't bubble, but you can use it in
     * addEvent() and jsaction anyway. EventContract does the right thing
     * under the hood.
     */
    TOGGLE: 'toggle'};
/** All event types that do not bubble or capture and need a polyfill. */
const MOUSE_SPECIAL_EVENT_TYPES = [
    EventType.MOUSEENTER,
    EventType.MOUSELEAVE,
    'pointerenter',
    'pointerleave',
];
/** All event types that are registered in the bubble phase. */
const BUBBLE_EVENT_TYPES = [
    EventType.CLICK,
    EventType.DBLCLICK,
    EventType.FOCUSIN,
    EventType.FOCUSOUT,
    EventType.KEYDOWN,
    EventType.KEYUP,
    EventType.KEYPRESS,
    EventType.MOUSEOVER,
    EventType.MOUSEOUT,
    EventType.SUBMIT,
    EventType.TOUCHSTART,
    EventType.TOUCHEND,
    EventType.TOUCHMOVE,
    'touchcancel',
    'auxclick',
    'change',
    'compositionstart',
    'compositionupdate',
    'compositionend',
    'beforeinput',
    'input',
    'select',
    'copy',
    'cut',
    'paste',
    'mousedown',
    'mouseup',
    'wheel',
    'contextmenu',
    'dragover',
    'dragenter',
    'dragleave',
    'drop',
    'dragstart',
    'dragend',
    'pointerdown',
    'pointermove',
    'pointerup',
    'pointercancel',
    'pointerover',
    'pointerout',
    'gotpointercapture',
    'lostpointercapture',
    // Video events.
    'ended',
    'loadedmetadata',
    // Page visibility events.
    'pagehide',
    'pageshow',
    'visibilitychange',
    // Content visibility events.
    'beforematch',
];
/** All event types that are registered in the capture phase. */
const CAPTURE_EVENT_TYPES = [
    EventType.FOCUS,
    EventType.BLUR,
    EventType.ERROR,
    EventType.LOAD,
    EventType.TOGGLE,
];
/**
 * Whether or not an event type should be registered in the capture phase.
 * @param eventType
 * @returns bool
 */
const isCaptureEventType = (eventType) => CAPTURE_EVENT_TYPES.indexOf(eventType) >= 0;
/** All event types that are registered early.  */
const EARLY_EVENT_TYPES = BUBBLE_EVENT_TYPES.concat(CAPTURE_EVENT_TYPES);
/**
 * Whether or not an event type is registered in the early contract.
 */
const isEarlyEventType = (eventType) => EARLY_EVENT_TYPES.indexOf(eventType) >= 0;

/**
 * Gets a browser event type, if it would differ from the JSAction event type.
 */
function getBrowserEventType(eventType) {
    // Mouseenter and mouseleave events are not handled directly because they
    // are not available everywhere. In browsers where they are available, they
    // don't bubble and aren't visible at the container boundary. Instead, we
    // synthesize the mouseenter and mouseleave events from mouseover and
    // mouseout events, respectively. Cf. eventcontract.js.
    if (eventType === EventType.MOUSEENTER) {
        return EventType.MOUSEOVER;
    }
    else if (eventType === EventType.MOUSELEAVE) {
        return EventType.MOUSEOUT;
    }
    else if (eventType === EventType.POINTERENTER) {
        return EventType.POINTEROVER;
    }
    else if (eventType === EventType.POINTERLEAVE) {
        return EventType.POINTEROUT;
    }
    return eventType;
}
/**
 * Registers the event handler function with the given DOM element for
 * the given event type.
 *
 * @param element The element.
 * @param eventType The event type.
 * @param handler The handler function to install.
 * @param passive A boolean value that, if `true`, indicates that the function
 *     specified by `handler` will never call `preventDefault()`.
 * @return Information needed to uninstall the event handler eventually.
 */
function addEventListener(element, eventType, handler, passive) {
    // All event handlers are registered in the bubbling
    // phase.
    //
    // All browsers support focus and blur, but these events only are propagated
    // in the capture phase. Very legacy browsers do not support focusin or
    // focusout.
    //
    // It would be a bad idea to register all event handlers in the
    // capture phase because then regular onclick handlers would not be
    // executed at all on events that trigger a jsaction. That's not
    // entirely what we want, at least for now.
    //
    // Error and load events (i.e. on images) do not bubble so they are also
    // handled in the capture phase.
    let capture = false;
    if (isCaptureEventType(eventType)) {
        capture = true;
    }
    const options = typeof passive === 'boolean' ? { capture, passive } : capture;
    element.addEventListener(eventType, handler, options);
    return { eventType, handler, capture, passive };
}
/**
 * Removes the event handler for the given event from the element.
 * the given event type.
 *
 * @param element The element.
 * @param info The information needed to deregister the handler, as returned by
 *     addEventListener(), above.
 */
function removeEventListener(element, info) {
    if (element.removeEventListener) {
        // It's worth noting that some browser releases have been inconsistent on this, and unless
        // you have specific reasons otherwise, it's probably wise to use the same values used for
        // the call to addEventListener() when calling removeEventListener().
        const options = typeof info.passive === 'boolean' ? { capture: info.capture } : info.capture;
        element.removeEventListener(info.eventType, info.handler, options);
        // `detachEvent` is an old DOM API.
    }
    else if (element.detachEvent) {
        // `detachEvent` is an old DOM API.
        element.detachEvent(`on${info.eventType}`, info.handler);
    }
}
/**
 * Prevents the default action of an event.
 * @param e The event to prevent the default action for.
 */
function preventDefault(e) {
    e.preventDefault ? e.preventDefault() : (e.returnValue = false);
}
/**
 * Whether we are on a Mac. Not pulling in useragent just for this.
 */
let isMac = typeof navigator !== 'undefined' && /Macintosh/.test(navigator.userAgent);
/**
 * Determines and returns whether the given event (which is assumed to be a
 * click event) is a middle click.
 * NOTE: There is not a consistent way to identify middle click
 * http://www.unixpapa.com/js/mouse.html
 */
function isMiddleClick(e) {
    return (
    // `which` is an old DOM API.
    e.which === 2 ||
        // `which` is an old DOM API.
        (e.which == null &&
            // `button` is an old DOM API.
            e.button === 4) // middle click for IE
    );
}
/**
 * Determines and returns whether the given event (which is assumed
 * to be a click event) is modified. A middle click is considered a modified
 * click to retain the default browser action, which opens a link in a new tab.
 * @param e The event.
 * @return Whether the given event is modified.
 */
function isModifiedClickEvent(e) {
    return (
    // `metaKey` is an old DOM API.
    (isMac && e.metaKey) ||
        // `ctrlKey` is an old DOM API.
        (!isMac && e.ctrlKey) ||
        isMiddleClick(e) ||
        // `shiftKey` is an old DOM API.
        e.shiftKey);
}
/**
 * Determines whether the event corresponds to a non-bubbling mouse
 * event type (mouseenter, mouseleave, pointerenter, and pointerleave).
 *
 * During mouseover (mouseenter) and pointerover (pointerenter), the
 * relatedTarget is the element being entered from. During mouseout (mouseleave)
 * and pointerout (pointerleave), the relatedTarget is the element being exited
 * to.
 *
 * In both cases, if relatedTarget is outside target, then the corresponding
 * special event has occurred, otherwise it hasn't.
 *
 * @param e The mouseover/mouseout event.
 * @param type The type of the mouse special event.
 * @param element The element on which the jsaction for the
 *     mouseenter/mouseleave event is defined.
 * @return True if the event is a mouseenter/mouseleave event.
 */
function isMouseSpecialEvent(e, type, element) {
    // `relatedTarget` is an old DOM API.
    const related = e.relatedTarget;
    return (((e.type === EventType.MOUSEOVER && type === EventType.MOUSEENTER) ||
        (e.type === EventType.MOUSEOUT && type === EventType.MOUSELEAVE) ||
        (e.type === EventType.POINTEROVER && type === EventType.POINTERENTER) ||
        (e.type === EventType.POINTEROUT && type === EventType.POINTERLEAVE)) &&
        (!related || (related !== element && !element.contains(related))));
}
/**
 * Creates a new EventLike object for a mouseenter/mouseleave event that's
 * derived from the original corresponding mouseover/mouseout event.
 * @param e The event.
 * @param target The element on which the jsaction for the mouseenter/mouseleave
 *     event is defined.
 * @return A modified event-like object copied from the event object passed into
 *     this function.
 */
function createMouseSpecialEvent(e, target) {
    // We have to create a copy of the event object because we need to mutate
    // its fields. We do this for the special mouse events because the event
    // target needs to be retargeted to the action element rather than the real
    // element (since we are simulating the special mouse events with mouseover/
    // mouseout).
    //
    // Since we're making a copy anyways, we might as well attempt to convert
    // this event into a pseudo-real mouseenter/mouseleave event by adjusting
    // its type.
    //
    const copy = {};
    for (const property in e) {
        if (property === 'srcElement' || property === 'target') {
            continue;
        }
        const key = property;
        // Making a copy requires iterating through all properties of `Event`.
        const value = e[key];
        if (typeof value === 'function') {
            continue;
        }
        // Value should be the expected type, but the value of `key` is not known
        // statically.
        copy[key] = value;
    }
    if (e.type === EventType.MOUSEOVER) {
        copy['type'] = EventType.MOUSEENTER;
    }
    else if (e.type === EventType.MOUSEOUT) {
        copy['type'] = EventType.MOUSELEAVE;
    }
    else if (e.type === EventType.POINTEROVER) {
        copy['type'] = EventType.POINTERENTER;
    }
    else {
        copy['type'] = EventType.POINTERLEAVE;
    }
    copy['target'] = copy['srcElement'] = target;
    copy['bubbles'] = false;
    copy['_originalEvent'] = e;
    return copy;
}

/**
 * Whether the user agent is running on iOS.
 */
const isIos = typeof navigator !== 'undefined' && /iPhone|iPad|iPod/.test(navigator.userAgent);
/**
 * A class representing a container node and all the event handlers
 * installed on it. Used so that handlers can be cleaned up if the
 * container is removed from the contract.
 */
class EventContractContainer {
    element;
    /**
     * Array of event handlers and their corresponding event types that are
     * installed on this container.
     *
     */
    handlerInfos = [];
    /**
     * @param element The container Element.
     */
    constructor(element) {
        this.element = element;
    }
    /**
     * Installs the provided installer on the element owned by this container,
     * and maintains a reference to resulting handler in order to remove it
     * later if desired.
     */
    addEventListener(eventType, getHandler, passive) {
        // In iOS, event bubbling doesn't happen automatically in any DOM element,
        // unless it has an onclick attribute or DOM event handler attached to it.
        // This breaks JsAction in some cases. See "Making Elements Clickable"
        // section at http://goo.gl/2VoGnB.
        //
        // A workaround for this issue is to change the CSS cursor style to 'pointer'
        // for the container element, which magically turns on event bubbling. This
        // solution is described in the comments section at http://goo.gl/6pEO1z.
        //
        // We use a navigator.userAgent check here as this problem is present both
        // on Mobile Safari and thin WebKit wrappers, such as Chrome for iOS.
        if (isIos) {
            this.element.style.cursor = 'pointer';
        }
        this.handlerInfos.push(addEventListener(this.element, eventType, getHandler(this.element), passive));
    }
    /**
     * Removes all the handlers installed on this container.
     */
    cleanUp() {
        for (let i = 0; i < this.handlerInfos.length; i++) {
            removeEventListener(this.element, this.handlerInfos[i]);
        }
        this.handlerInfos = [];
    }
}

const Char = {
    /**
     * The separator between the event name and action in the jsaction
     * attribute value.
     */
    EVENT_ACTION_SEPARATOR: ':',
};

/** Added for readability when accessing stable property names. */
function getEventType(eventInfo) {
    return eventInfo.eventType;
}
/** Added for readability when accessing stable property names. */
function setEventType(eventInfo, eventType) {
    eventInfo.eventType = eventType;
}
/** Added for readability when accessing stable property names. */
function getEvent(eventInfo) {
    return eventInfo.event;
}
/** Added for readability when accessing stable property names. */
function setEvent(eventInfo, event) {
    eventInfo.event = event;
}
/** Added for readability when accessing stable property names. */
function getTargetElement(eventInfo) {
    return eventInfo.targetElement;
}
/** Added for readability when accessing stable property names. */
function setTargetElement(eventInfo, targetElement) {
    eventInfo.targetElement = targetElement;
}
/** Added for readability when accessing stable property names. */
function getContainer(eventInfo) {
    return eventInfo.eic;
}
/** Added for readability when accessing stable property names. */
function setContainer(eventInfo, container) {
    eventInfo.eic = container;
}
/** Added for readability when accessing stable property names. */
function getTimestamp(eventInfo) {
    return eventInfo.timeStamp;
}
/** Added for readability when accessing stable property names. */
function setTimestamp(eventInfo, timestamp) {
    eventInfo.timeStamp = timestamp;
}
/** Added for readability when accessing stable property names. */
function getAction(eventInfo) {
    return eventInfo.eia;
}
/** Added for readability when accessing stable property names. */
function setAction(eventInfo, actionName, actionElement) {
    eventInfo.eia = [actionName, actionElement];
}
/** Added for readability when accessing stable property names. */
function unsetAction(eventInfo) {
    eventInfo.eia = undefined;
}
/** Added for readability when accessing stable property names. */
function getActionElement(actionInfo) {
    return actionInfo[1];
}
/** Added for readability when accessing stable property names. */
function getIsReplay(eventInfo) {
    return eventInfo.eirp;
}
/** Added for readability when accessing stable property names. */
function setIsReplay(eventInfo, replay) {
    eventInfo.eirp = replay;
}
/** Added for readability when accessing stable property names. */
function getResolved(eventInfo) {
    return eventInfo.eir;
}
/** Added for readability when accessing stable property names. */
function setResolved(eventInfo, resolved) {
    eventInfo.eir = resolved;
}
/** Clones an `EventInfo` */
function cloneEventInfo(eventInfo) {
    return {
        eventType: eventInfo.eventType,
        event: eventInfo.event,
        targetElement: eventInfo.targetElement,
        eic: eventInfo.eic,
        eia: eventInfo.eia,
        timeStamp: eventInfo.timeStamp,
        eirp: eventInfo.eirp,
        eiack: eventInfo.eiack,
        eir: eventInfo.eir,
    };
}
/**
 * Utility function for creating an `EventInfo`.
 *
 * This can be used from code-size sensitive compilation units, as taking
 * parameters vs. an `Object` literal reduces code size.
 */
function createEventInfoFromParameters(eventType, event, targetElement, container, timestamp, action, isReplay, a11yClickKey) {
    return {
        eventType,
        event,
        targetElement,
        eic: container,
        timeStamp: timestamp,
        eia: action,
        eirp: isReplay,
        eiack: a11yClickKey,
    };
}
/**
 * Utility class around an `EventInfo`.
 *
 * This should be used in compilation units that are less sensitive to code
 * size.
 */
class EventInfoWrapper {
    eventInfo;
    constructor(eventInfo) {
        this.eventInfo = eventInfo;
    }
    getEventType() {
        return getEventType(this.eventInfo);
    }
    setEventType(eventType) {
        setEventType(this.eventInfo, eventType);
    }
    getEvent() {
        return getEvent(this.eventInfo);
    }
    setEvent(event) {
        setEvent(this.eventInfo, event);
    }
    getTargetElement() {
        return getTargetElement(this.eventInfo);
    }
    setTargetElement(targetElement) {
        setTargetElement(this.eventInfo, targetElement);
    }
    getContainer() {
        return getContainer(this.eventInfo);
    }
    setContainer(container) {
        setContainer(this.eventInfo, container);
    }
    getTimestamp() {
        return getTimestamp(this.eventInfo);
    }
    setTimestamp(timestamp) {
        setTimestamp(this.eventInfo, timestamp);
    }
    getAction() {
        const action = getAction(this.eventInfo);
        if (!action)
            return undefined;
        return {
            name: action[0],
            element: action[1],
        };
    }
    setAction(action) {
        if (!action) {
            unsetAction(this.eventInfo);
            return;
        }
        setAction(this.eventInfo, action.name, action.element);
    }
    getIsReplay() {
        return getIsReplay(this.eventInfo);
    }
    setIsReplay(replay) {
        setIsReplay(this.eventInfo, replay);
    }
    getResolved() {
        return getResolved(this.eventInfo);
    }
    setResolved(resolved) {
        setResolved(this.eventInfo, resolved);
    }
    clone() {
        return new EventInfoWrapper(cloneEventInfo(this.eventInfo));
    }
}

/**
 * Since maps from event to action are immutable we can use a single map
 * to represent the empty map.
 */
const EMPTY_ACTION_MAP = {};
/**
 * This regular expression matches a semicolon.
 */
const REGEXP_SEMICOLON = /\s*;\s*/;
/** If no event type is defined, defaults to `click`. */
const DEFAULT_EVENT_TYPE = EventType.CLICK;
/** Resolves actions for Events. */
class ActionResolver {
    a11yClickSupport = false;
    clickModSupport = true;
    syntheticMouseEventSupport;
    updateEventInfoForA11yClick = undefined;
    preventDefaultForA11yClick = undefined;
    populateClickOnlyAction = undefined;
    constructor({ syntheticMouseEventSupport = false, clickModSupport = true, } = {}) {
        this.syntheticMouseEventSupport = syntheticMouseEventSupport;
        this.clickModSupport = clickModSupport;
    }
    resolveEventType(eventInfo) {
        // We distinguish modified and plain clicks in order to support the
        // default browser behavior of modified clicks on links; usually to
        // open the URL of the link in new tab or new window on ctrl/cmd
        // click. A DOM 'click' event is mapped to the jsaction 'click'
        // event iff there is no modifier present on the event. If there is
        // a modifier, it's mapped to 'clickmod' instead.
        //
        // It's allowed to omit the event in the jsaction attribute. In that
        // case, 'click' is assumed. Thus the following two are equivalent:
        //
        //   <a href="someurl" jsaction="gna.fu">
        //   <a href="someurl" jsaction="click:gna.fu">
        //
        // For unmodified clicks, EventContract invokes the jsaction
        // 'gna.fu'. For modified clicks, EventContract won't find a
        // suitable action and leave the event to be handled by the
        // browser.
        //
        // In order to also invoke a jsaction handler for a modifier click,
        // 'clickmod' needs to be used:
        //
        //   <a href="someurl" jsaction="clickmod:gna.fu">
        //
        // EventContract invokes the jsaction 'gna.fu' for modified
        // clicks. Unmodified clicks are left to the browser.
        //
        // In order to set up the event contract to handle both clickonly and
        // clickmod, only addEvent(EventType.CLICK) is necessary.
        //
        // In order to set up the event contract to handle click,
        // addEvent() is necessary for CLICK, KEYDOWN, and KEYPRESS event types.  If
        // a11y click support is enabled, addEvent() will set up the appropriate key
        // event handler automatically.
        if (this.clickModSupport &&
            getEventType(eventInfo) === EventType.CLICK &&
            isModifiedClickEvent(getEvent(eventInfo))) {
            setEventType(eventInfo, EventType.CLICKMOD);
        }
        else if (this.a11yClickSupport) {
            this.updateEventInfoForA11yClick(eventInfo);
        }
    }
    resolveAction(eventInfo) {
        if (getResolved(eventInfo)) {
            return;
        }
        this.populateAction(eventInfo, getTargetElement(eventInfo));
        setResolved(eventInfo, true);
    }
    resolveParentAction(eventInfo) {
        const action = getAction(eventInfo);
        const actionElement = action && getActionElement(action);
        unsetAction(eventInfo);
        const parentNode = actionElement && this.getParentNode(actionElement);
        if (!parentNode) {
            return;
        }
        this.populateAction(eventInfo, parentNode);
    }
    /**
     * Searches for a jsaction that the DOM event maps to and creates an
     * object containing event information used for dispatching by
     * jsaction.Dispatcher. This method populates the `action` and `actionElement`
     * fields of the EventInfo object passed in by finding the first
     * jsaction attribute above the target Node of the event, and below
     * the container Node, that specifies a jsaction for the event
     * type. If no such jsaction is found, then action is undefined.
     *
     * @param eventInfo `EventInfo` to set `action` and `actionElement` if an
     *    action is found on any `Element` in the path of the `Event`.
     */
    populateAction(eventInfo, currentTarget) {
        let actionElement = currentTarget;
        while (actionElement && actionElement !== getContainer(eventInfo)) {
            if (actionElement.nodeType === Node.ELEMENT_NODE) {
                this.populateActionOnElement(actionElement, eventInfo);
            }
            if (getAction(eventInfo)) {
                // An event is handled by at most one jsaction. Thus we stop at the
                // first matching jsaction specified in a jsaction attribute up the
                // ancestor chain of the event target node.
                break;
            }
            actionElement = this.getParentNode(actionElement);
        }
        const action = getAction(eventInfo);
        if (!action) {
            // No action found.
            return;
        }
        if (this.a11yClickSupport) {
            this.preventDefaultForA11yClick(eventInfo);
        }
        // We attempt to handle the mouseenter/mouseleave events here by
        // detecting whether the mouseover/mouseout events correspond to
        // entering/leaving an element.
        if (this.syntheticMouseEventSupport) {
            if (getEventType(eventInfo) === EventType.MOUSEENTER ||
                getEventType(eventInfo) === EventType.MOUSELEAVE ||
                getEventType(eventInfo) === EventType.POINTERENTER ||
                getEventType(eventInfo) === EventType.POINTERLEAVE) {
                // We attempt to handle the mouseenter/mouseleave events here by
                // detecting whether the mouseover/mouseout events correspond to
                // entering/leaving an element.
                if (isMouseSpecialEvent(getEvent(eventInfo), getEventType(eventInfo), getActionElement(action))) {
                    // If both mouseover/mouseout and mouseenter/mouseleave events are
                    // enabled, two separate handlers for mouseover/mouseout are
                    // registered. Both handlers will see the same event instance
                    // so we create a copy to avoid interfering with the dispatching of
                    // the mouseover/mouseout event.
                    const copiedEvent = createMouseSpecialEvent(getEvent(eventInfo), getActionElement(action));
                    setEvent(eventInfo, copiedEvent);
                    // Since the mouseenter/mouseleave events do not bubble, the target
                    // of the event is technically the `actionElement` (the node with the
                    // `jsaction` attribute)
                    setTargetElement(eventInfo, getActionElement(action));
                }
                else {
                    unsetAction(eventInfo);
                }
            }
        }
    }
    /**
     * Walk to the parent node, unless the node has a different owner in
     * which case we walk to the owner. Attempt to walk to host of a
     * shadow root if needed.
     */
    getParentNode(element) {
        const owner = element[Property.OWNER];
        if (owner) {
            return owner;
        }
        const parentNode = element.parentNode;
        if (parentNode?.nodeName === '#document-fragment') {
            return parentNode?.host ?? null;
        }
        return parentNode;
    }
    /**
     * Accesses the jsaction map on a node and retrieves the name of the
     * action the given event is mapped to, if any. It parses the
     * attribute value and stores it in a property on the node for
     * subsequent retrieval without re-parsing and re-accessing the
     * attribute.
     *
     * @param actionElement The DOM node to retrieve the jsaction map from.
     * @param eventInfo `EventInfo` to set `action` and `actionElement` if an
     *    action is found on the `actionElement`.
     */
    populateActionOnElement(actionElement, eventInfo) {
        const actionMap = this.parseActions(actionElement);
        const actionName = actionMap[getEventType(eventInfo)];
        if (actionName !== undefined) {
            setAction(eventInfo, actionName, actionElement);
        }
        if (this.a11yClickSupport) {
            this.populateClickOnlyAction(actionElement, eventInfo, actionMap);
        }
    }
    /**
     * Parses and caches an element's jsaction element into a map.
     *
     * This is primarily for internal use.
     *
     * @param actionElement The DOM node to retrieve the jsaction map from.
     * @return Map from event to qualified name of the jsaction bound to it.
     */
    parseActions(actionElement) {
        let actionMap = get(actionElement);
        if (!actionMap) {
            const jsactionAttribute = actionElement.getAttribute(Attribute.JSACTION);
            if (!jsactionAttribute) {
                actionMap = EMPTY_ACTION_MAP;
                set(actionElement, actionMap);
            }
            else {
                actionMap = getParsed(jsactionAttribute);
                if (!actionMap) {
                    actionMap = {};
                    const values = jsactionAttribute.split(REGEXP_SEMICOLON);
                    for (let idx = 0; idx < values.length; idx++) {
                        const value = values[idx];
                        if (!value) {
                            continue;
                        }
                        const colon = value.indexOf(Char.EVENT_ACTION_SEPARATOR);
                        const hasColon = colon !== -1;
                        const type = hasColon ? value.substr(0, colon).trim() : DEFAULT_EVENT_TYPE;
                        const action = hasColon ? value.substr(colon + 1).trim() : value;
                        actionMap[type] = action;
                    }
                    setParsed(jsactionAttribute, actionMap);
                }
                set(actionElement, actionMap);
            }
        }
        return actionMap;
    }
    addA11yClickSupport(updateEventInfoForA11yClick, preventDefaultForA11yClick, populateClickOnlyAction) {
        this.a11yClickSupport = true;
        this.updateEventInfoForA11yClick = updateEventInfoForA11yClick;
        this.preventDefaultForA11yClick = preventDefaultForA11yClick;
        this.populateClickOnlyAction = populateClickOnlyAction;
    }
}

/**
 * @fileoverview An enum to control who can call certain jsaction APIs.
 */
var Restriction;
(function (Restriction) {
    Restriction[Restriction["I_AM_THE_JSACTION_FRAMEWORK"] = 0] = "I_AM_THE_JSACTION_FRAMEWORK";
})(Restriction || (Restriction = {}));

/**
 * Receives a DOM event, determines the jsaction associated with the source
 * element of the DOM event, and invokes the handler associated with the
 * jsaction.
 */
class Dispatcher {
    dispatchDelegate;
    // The ActionResolver to use to resolve actions.
    actionResolver;
    /** The replayer function to be called when there are queued events. */
    eventReplayer;
    /** Whether the event replay is scheduled. */
    eventReplayScheduled = false;
    /** The queue of events. */
    replayEventInfoWrappers = [];
    /**
     * Options are:
     *   - `eventReplayer`: When the event contract dispatches replay events
     *      to the Dispatcher, the Dispatcher collects them and in the next tick
     *      dispatches them to the `eventReplayer`. Defaults to dispatching to `dispatchDelegate`.
     * @param dispatchDelegate A function that should handle dispatching an `EventInfoWrapper` to handlers.
     */
    constructor(dispatchDelegate, { actionResolver, eventReplayer, } = {}) {
        this.dispatchDelegate = dispatchDelegate;
        this.actionResolver = actionResolver;
        this.eventReplayer = eventReplayer;
    }
    /**
     * Receives an event or the event queue from the EventContract. The event
     * queue is copied and it attempts to replay.
     * If event info is passed in it looks for an action handler that can handle
     * the given event.  If there is no handler registered queues the event and
     * checks if a loader is registered for the given namespace. If so, calls it.
     *
     * Alternatively, if in global dispatch mode, calls all registered global
     * handlers for the appropriate event type.
     *
     * The three functionalities of this call are deliberately not split into
     * three methods (and then declared as an abstract interface), because the
     * interface is used by EventContract, which lives in a different jsbinary.
     * Therefore the interface between the three is defined entirely in terms that
     * are invariant under jscompiler processing (Function and Array, as opposed
     * to a custom type with method names).
     *
     * @param eventInfo The info for the event that triggered this call or the
     *     queue of events from EventContract.
     */
    dispatch(eventInfo) {
        const eventInfoWrapper = new EventInfoWrapper(eventInfo);
        this.actionResolver?.resolveEventType(eventInfo);
        this.actionResolver?.resolveAction(eventInfo);
        const action = eventInfoWrapper.getAction();
        if (action && shouldPreventDefaultBeforeDispatching(action.element, eventInfoWrapper)) {
            preventDefault(eventInfoWrapper.getEvent());
        }
        if (this.eventReplayer && eventInfoWrapper.getIsReplay()) {
            this.scheduleEventInfoWrapperReplay(eventInfoWrapper);
            return;
        }
        this.dispatchDelegate(eventInfoWrapper);
    }
    /**
     * Schedules an `EventInfoWrapper` for replay. The replaying will happen in its own
     * stack once the current flow cedes control. This is done to mimic
     * browser event handling.
     */
    scheduleEventInfoWrapperReplay(eventInfoWrapper) {
        this.replayEventInfoWrappers.push(eventInfoWrapper);
        if (this.eventReplayScheduled) {
            return;
        }
        this.eventReplayScheduled = true;
        Promise.resolve().then(() => {
            this.eventReplayScheduled = false;
            this.eventReplayer(this.replayEventInfoWrappers);
        });
    }
}
/**
 * Returns true if the default action of this event should be prevented before
 * this event is dispatched.
 */
function shouldPreventDefaultBeforeDispatching(actionElement, eventInfoWrapper) {
    // Prevent browser from following <a> node links if a jsaction is present
    // and we are dispatching the action now. Note that the targetElement may be
    // a child of an anchor that has a jsaction attached. For that reason, we
    // need to check the actionElement rather than the targetElement.
    return (actionElement.tagName === 'A' &&
        (eventInfoWrapper.getEventType() === EventType.CLICK ||
            eventInfoWrapper.getEventType() === EventType.CLICKMOD));
}

/** An internal symbol used to indicate whether propagation should be stopped or not. */
const PROPAGATION_STOPPED_SYMBOL = 
/* @__PURE__ */ Symbol.for('propagationStopped');
/** Extra event phases beyond what the browser provides. */
const EventPhase = {
    REPLAY: 101,
};
const PREVENT_DEFAULT_ERROR_MESSAGE_DETAILS = ' Because event replay occurs after browser dispatch, `preventDefault` would have no ' +
    'effect. You can check whether an event is being replayed by accessing the event phase: ' +
    '`event.eventPhase === EventPhase.REPLAY`.';
const PREVENT_DEFAULT_ERROR_MESSAGE = `\`preventDefault\` called during event replay.`;
const COMPOSED_PATH_ERROR_MESSAGE_DETAILS = ' Because event replay occurs after browser ' +
    'dispatch, `composedPath()` will be empty. Iterate parent nodes from `event.target` or ' +
    '`event.currentTarget` if you need to check elements in the event path.';
const COMPOSED_PATH_ERROR_MESSAGE = `\`composedPath\` called during event replay.`;
/**
 * A dispatcher that uses browser-based `Event` semantics, for example bubbling, `stopPropagation`,
 * `currentTarget`, etc.
 */
class EventDispatcher {
    dispatchDelegate;
    clickModSupport;
    actionResolver;
    dispatcher;
    constructor(dispatchDelegate, clickModSupport = true) {
        this.dispatchDelegate = dispatchDelegate;
        this.clickModSupport = clickModSupport;
        this.actionResolver = new ActionResolver({ clickModSupport });
        this.dispatcher = new Dispatcher((eventInfoWrapper) => {
            this.dispatchToDelegate(eventInfoWrapper);
        }, {
            actionResolver: this.actionResolver,
        });
    }
    /**
     * The entrypoint for the `EventContract` dispatch.
     */
    dispatch(eventInfo) {
        this.dispatcher.dispatch(eventInfo);
    }
    /** Internal method that does basic disaptching. */
    dispatchToDelegate(eventInfoWrapper) {
        if (eventInfoWrapper.getIsReplay()) {
            prepareEventForReplay(eventInfoWrapper);
        }
        prepareEventForBubbling(eventInfoWrapper);
        while (eventInfoWrapper.getAction()) {
            prepareEventForDispatch(eventInfoWrapper);
            // If this is a capture event, ONLY dispatch if the action element is the target.
            if (isCaptureEventType(eventInfoWrapper.getEventType()) &&
                eventInfoWrapper.getAction().element !== eventInfoWrapper.getTargetElement()) {
                return;
            }
            this.dispatchDelegate(eventInfoWrapper.getEvent(), eventInfoWrapper.getAction().name);
            if (propagationStopped(eventInfoWrapper)) {
                return;
            }
            this.actionResolver.resolveParentAction(eventInfoWrapper.eventInfo);
        }
    }
}
function prepareEventForBubbling(eventInfoWrapper) {
    const event = eventInfoWrapper.getEvent();
    const originalStopPropagation = eventInfoWrapper.getEvent().stopPropagation.bind(event);
    const stopPropagation = () => {
        event[PROPAGATION_STOPPED_SYMBOL] = true;
        originalStopPropagation();
    };
    patchEventInstance(event, 'stopPropagation', stopPropagation);
    patchEventInstance(event, 'stopImmediatePropagation', stopPropagation);
}
function propagationStopped(eventInfoWrapper) {
    const event = eventInfoWrapper.getEvent();
    return !!event[PROPAGATION_STOPPED_SYMBOL];
}
function prepareEventForReplay(eventInfoWrapper) {
    const event = eventInfoWrapper.getEvent();
    const target = eventInfoWrapper.getTargetElement();
    const originalPreventDefault = event.preventDefault.bind(event);
    patchEventInstance(event, 'target', target);
    patchEventInstance(event, 'eventPhase', EventPhase.REPLAY);
    patchEventInstance(event, 'preventDefault', () => {
        originalPreventDefault();
        throw new Error(PREVENT_DEFAULT_ERROR_MESSAGE + (ngDevMode ? PREVENT_DEFAULT_ERROR_MESSAGE_DETAILS : ''));
    });
    patchEventInstance(event, 'composedPath', () => {
        throw new Error(COMPOSED_PATH_ERROR_MESSAGE + (ngDevMode ? COMPOSED_PATH_ERROR_MESSAGE_DETAILS : ''));
    });
}
function prepareEventForDispatch(eventInfoWrapper) {
    const event = eventInfoWrapper.getEvent();
    const currentTarget = eventInfoWrapper.getAction()?.element;
    if (currentTarget) {
        patchEventInstance(event, 'currentTarget', currentTarget, {
            // `currentTarget` is going to get reassigned every dispatch.
            configurable: true,
        });
    }
}
/**
 * Patch `Event` instance during non-standard `Event` dispatch. This patches just the `Event`
 * instance that the browser created, it does not patch global properties or methods.
 *
 * This is necessary because dispatching an `Event` outside of browser dispatch results in
 * incorrect properties and methods that need to be polyfilled or do not work.
 *
 * JSAction dispatch adds two extra "phases" to event dispatch:
 * 1. Event delegation - the event is being dispatched by a delegating event handler on a container
 *    (typically `window.document.documentElement`), to a delegated event handler on some child
 *    element. Certain `Event` properties will be unintuitive, such as `currentTarget`, which would
 *    be the container rather than the child element. Bubbling would also not work. In order to
 *    emulate the browser, these properties and methods on the `Event` are patched.
 * 2. Event replay - the event is being dispatched by the framework once the handlers have been
 *    loaded (during hydration, or late-loaded). Certain `Event` properties can be unset by the
 *    browser because the `Event` is no longer actively being dispatched, such as `target`. Other
 *    methods have no effect because the `Event` has already been dispatched, such as
 *    `preventDefault`. Bubbling would also not work. These properties and methods are patched,
 *    either to fill in information that the browser may have removed, or to throw errors in methods
 *    that no longer behave as expected.
 */
function patchEventInstance(event, property, value, { configurable = false } = {}) {
    Object.defineProperty(event, property, { value, configurable });
}
/**
 * Registers deferred functionality for an EventContract and a Jsaction
 * Dispatcher.
 */
function registerDispatcher$1(eventContract, dispatcher) {
    eventContract.ecrd((eventInfo) => {
        dispatcher.dispatch(eventInfo);
    }, Restriction.I_AM_THE_JSACTION_FRAMEWORK);
}

/** Creates an `EarlyJsactionData` object. */
function createEarlyJsactionData(container) {
    const q = [];
    const d = (eventInfo) => {
        q.push(eventInfo);
    };
    const h = (event) => {
        d(createEventInfoFromParameters(event.type, event, event.target, container, Date.now()));
    };
    return {
        c: container,
        q,
        et: [],
        etc: [],
        d,
        h,
    };
}
/** Add all the events to the container stored in the `EarlyJsactionData`. */
function addEvents(earlyJsactionData, types, capture) {
    for (let i = 0; i < types.length; i++) {
        const eventType = types[i];
        const eventTypes = capture ? earlyJsactionData.etc : earlyJsactionData.et;
        eventTypes.push(eventType);
        earlyJsactionData.c.addEventListener(eventType, earlyJsactionData.h, capture);
    }
}
/** Get the queued `EventInfo` objects that were dispatched before a dispatcher was registered. */
function getQueuedEventInfos(earlyJsactionData) {
    return earlyJsactionData?.q ?? [];
}
/** Register a different dispatcher function on the `EarlyJsactionData`. */
function registerDispatcher(earlyJsactionData, dispatcher) {
    if (!earlyJsactionData) {
        return;
    }
    earlyJsactionData.d = dispatcher;
}
/** Removes all event listener handlers. */
function removeAllEventListeners(earlyJsactionData) {
    if (!earlyJsactionData) {
        return;
    }
    removeEventListeners(earlyJsactionData.c, earlyJsactionData.et, earlyJsactionData.h);
    removeEventListeners(earlyJsactionData.c, earlyJsactionData.etc, earlyJsactionData.h, true);
}
function removeEventListeners(container, eventTypes, earlyEventHandler, capture) {
    for (let i = 0; i < eventTypes.length; i++) {
        container.removeEventListener(eventTypes[i], earlyEventHandler, /* useCapture */ capture);
    }
}

/**
 * @define Support for the non-bubbling mouseenter and mouseleave events.  This
 * flag can be overridden in a build rule.
 */
const MOUSE_SPECIAL_SUPPORT = false;

/**
 * @fileoverview Implements the local event handling contract. This
 * allows DOM objects in a container that enters into this contract to
 * define event handlers which are executed in a local context.
 *
 * One EventContract instance can manage the contract for multiple
 * containers, which are added using the addContainer() method.
 *
 * Events can be registered using the addEvent() method.
 *
 * A Dispatcher is added using the registerDispatcher() method. Until there is
 * a dispatcher, events are queued. The idea is that the EventContract
 * class is inlined in the HTML of the top level page and instantiated
 * right after the start of <body>. The Dispatcher class is contained
 * in the external deferred js, and instantiated and registered with
 * EventContract when the external javascript in the page loads. The
 * external javascript will also register the jsaction handlers, which
 * then pick up the queued events at the time of registration.
 *
 * Since this class is meant to be inlined in the main page HTML, the
 * size of the binary compiled from this file MUST be kept as small as
 * possible and thus its dependencies to a minimum.
 */
/**
 * EventContract intercepts events in the bubbling phase at the
 * boundary of a container element, and maps them to generic actions
 * which are specified using the custom jsaction attribute in
 * HTML. Behavior of the application is then specified in terms of
 * handler for such actions, cf. jsaction.Dispatcher in dispatcher.js.
 *
 * This has several benefits: (1) No DOM event handlers need to be
 * registered on the specific elements in the UI. (2) The set of
 * events that the application has to handle can be specified in terms
 * of the semantics of the application, rather than in terms of DOM
 * events. (3) Invocation of handlers can be delayed and handlers can
 * be delay loaded in a generic way.
 */
class EventContract {
    static MOUSE_SPECIAL_SUPPORT = MOUSE_SPECIAL_SUPPORT;
    containerManager;
    /**
     * The DOM events which this contract covers. Used to prevent double
     * registration of event types. The value of the map is the
     * internally created DOM event handler function that handles the
     * DOM events. See addEvent().
     *
     */
    eventHandlers = {};
    browserEventTypeToExtraEventTypes = {};
    /**
     * The dispatcher function. Events are passed to this function for
     * handling once it was set using the registerDispatcher() method. This is
     * done because the function is passed from another jsbinary, so passing the
     * instance and invoking the method here would require to leave the method
     * unobfuscated.
     */
    dispatcher = null;
    /**
     * The list of suspended `EventInfo` that will be dispatched
     * as soon as the `Dispatcher` is registered.
     */
    queuedEventInfos = [];
    constructor(containerManager) {
        this.containerManager = containerManager;
    }
    handleEvent(eventType, event, container) {
        const eventInfo = createEventInfoFromParameters(
        /* eventType= */ eventType, 
        /* event= */ event, 
        /* targetElement= */ event.target, 
        /* container= */ container, 
        /* timestamp= */ Date.now());
        this.handleEventInfo(eventInfo);
    }
    /**
     * Handle an `EventInfo`.
     */
    handleEventInfo(eventInfo) {
        if (!this.dispatcher) {
            // All events are queued when the dispatcher isn't yet loaded.
            setIsReplay(eventInfo, true);
            this.queuedEventInfos?.push(eventInfo);
            return;
        }
        this.dispatcher(eventInfo);
    }
    /**
     * Enables jsaction handlers to be called for the event type given by
     * name.
     *
     * If the event is already registered, this does nothing.
     *
     * @param prefixedEventType If supplied, this event is used in
     *     the actual browser event registration instead of the name that is
     *     exposed to jsaction. Use this if you e.g. want users to be able
     *     to subscribe to jsaction="transitionEnd:foo" while the underlying
     *     event is webkitTransitionEnd in one browser and mozTransitionEnd
     *     in another.
     *
     * @param passive A boolean value that, if `true`, indicates that the event
     *     handler will never call `preventDefault()`.
     */
    addEvent(eventType, prefixedEventType, passive) {
        if (eventType in this.eventHandlers || !this.containerManager) {
            return;
        }
        if (!EventContract.MOUSE_SPECIAL_SUPPORT && MOUSE_SPECIAL_EVENT_TYPES.indexOf(eventType) >= 0) {
            return;
        }
        const eventHandler = (eventType, event, container) => {
            this.handleEvent(eventType, event, container);
        };
        // Store the callback to allow us to replay events.
        this.eventHandlers[eventType] = eventHandler;
        const browserEventType = getBrowserEventType(prefixedEventType || eventType);
        if (browserEventType !== eventType) {
            const eventTypes = this.browserEventTypeToExtraEventTypes[browserEventType] || [];
            eventTypes.push(eventType);
            this.browserEventTypeToExtraEventTypes[browserEventType] = eventTypes;
        }
        this.containerManager.addEventListener(browserEventType, (element) => {
            return (event) => {
                eventHandler(eventType, event, element);
            };
        }, passive);
    }
    /**
     * Gets the queued early events and replay them using the appropriate handler
     * in the provided event contract. Once all the events are replayed, it cleans
     * up the early contract.
     */
    replayEarlyEvents(earlyJsactionData = window._ejsa) {
        // Check if the early contract is present and prevent calling this function
        // more than once.
        if (!earlyJsactionData) {
            return;
        }
        // Replay the early contract events.
        this.replayEarlyEventInfos(earlyJsactionData.q);
        // Clean up the early contract.
        removeAllEventListeners(earlyJsactionData);
        delete window._ejsa;
    }
    /**
     * Replays all the early `EventInfo` objects, dispatching them through the normal
     * `EventContract` flow.
     */
    replayEarlyEventInfos(earlyEventInfos) {
        for (let i = 0; i < earlyEventInfos.length; i++) {
            const earlyEventInfo = earlyEventInfos[i];
            const eventTypes = this.getEventTypesForBrowserEventType(earlyEventInfo.eventType);
            for (let j = 0; j < eventTypes.length; j++) {
                const eventInfo = cloneEventInfo(earlyEventInfo);
                // EventInfo eventType maps to JSAction's internal event type,
                // rather than the browser event type.
                setEventType(eventInfo, eventTypes[j]);
                this.handleEventInfo(eventInfo);
            }
        }
    }
    /**
     * Returns all JSAction event types that have been registered for a given
     * browser event type.
     */
    getEventTypesForBrowserEventType(browserEventType) {
        const eventTypes = [];
        if (this.eventHandlers[browserEventType]) {
            eventTypes.push(browserEventType);
        }
        if (this.browserEventTypeToExtraEventTypes[browserEventType]) {
            eventTypes.push(...this.browserEventTypeToExtraEventTypes[browserEventType]);
        }
        return eventTypes;
    }
    /**
     * Returns the event handler function for a given event type.
     */
    handler(eventType) {
        return this.eventHandlers[eventType];
    }
    /**
     * Cleans up the event contract. This resets all of the `EventContract`'s
     * internal state. Users are responsible for not using this `EventContract`
     * after it has been cleaned up.
     */
    cleanUp() {
        this.containerManager?.cleanUp();
        this.containerManager = null;
        this.eventHandlers = {};
        this.browserEventTypeToExtraEventTypes = {};
        this.dispatcher = null;
        this.queuedEventInfos = [];
    }
    /**
     * Register a dispatcher function. Event info of each event mapped to
     * a jsaction is passed for handling to this callback. The queued
     * events are passed as well to the dispatcher for later replaying
     * once the dispatcher is registered. Clears the event queue to null.
     *
     * @param dispatcher The dispatcher function.
     * @param restriction
     */
    registerDispatcher(dispatcher, restriction) {
        this.ecrd(dispatcher, restriction);
    }
    /**
     * Unrenamed alias for registerDispatcher. Necessary for any codebases that
     * split the `EventContract` and `Dispatcher` code into different compilation
     * units.
     */
    ecrd(dispatcher, restriction) {
        this.dispatcher = dispatcher;
        if (this.queuedEventInfos?.length) {
            for (let i = 0; i < this.queuedEventInfos.length; i++) {
                this.handleEventInfo(this.queuedEventInfos[i]);
            }
            this.queuedEventInfos = null;
        }
    }
}

/**
 * Creates an `EarlyJsactionData`, adds events to it, and populates it on a nested object on
 * the window.
 */
function bootstrapAppScopedEarlyEventContract(container, appId, bubbleEventTypes, captureEventTypes, dataContainer = window) {
    const earlyJsactionData = createEarlyJsactionData(container);
    if (!dataContainer._ejsas) {
        dataContainer._ejsas = {};
    }
    dataContainer._ejsas[appId] = earlyJsactionData;
    addEvents(earlyJsactionData, bubbleEventTypes);
    addEvents(earlyJsactionData, captureEventTypes, /* capture= */ true);
}
/** Get the queued `EventInfo` objects that were dispatched before a dispatcher was registered. */
function getAppScopedQueuedEventInfos(appId, dataContainer = window) {
    return getQueuedEventInfos(dataContainer._ejsas?.[appId]);
}
/**
 * Registers a dispatcher function on the `EarlyJsactionData` present on the nested object on the
 * window.
 */
function registerAppScopedDispatcher(restriction, appId, dispatcher, dataContainer = window) {
    registerDispatcher(dataContainer._ejsas?.[appId], dispatcher);
}
/** Removes all event listener handlers. */
function removeAllAppScopedEventListeners(appId, dataContainer = window) {
    removeAllEventListeners(dataContainer._ejsas?.[appId]);
}
/** Clear the early event contract. */
function clearAppScopedEarlyEventContract(appId, dataContainer = window) {
    if (!dataContainer._ejsas) {
        return;
    }
    dataContainer._ejsas[appId] = undefined;
}

export { Attribute, EventContract, EventContractContainer, EventDispatcher, EventInfoWrapper, EventPhase, bootstrapAppScopedEarlyEventContract, clearAppScopedEarlyEventContract, getDefaulted as getActionCache, getAppScopedQueuedEventInfos, isCaptureEventType, isEarlyEventType, registerAppScopedDispatcher, registerDispatcher$1 as registerDispatcher, removeAllAppScopedEventListeners };
//# sourceMappingURL=event-dispatch.mjs.map
#T,տ;x   {"version":3,"file":"event-dispatch.mjs","sources":["../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/attribute.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/property.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/cache.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/event_type.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/event.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/event_contract_container.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/char.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/event_info.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/action_resolver.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/restriction.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/dispatcher.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/event_dispatcher.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/earlyeventcontract.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/event_contract_defines.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/eventcontract.ts","../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/event-dispatch/src/bootstrap_app_scoped.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport const Attribute = {\n  /**\n   * The jsaction attribute defines a mapping of a DOM event to a\n   * generic event (aka jsaction), to which the actual event handlers\n   * that implement the behavior of the application are bound. The\n   * value is a semicolon separated list of colon separated pairs of\n   * an optional DOM event name and a jsaction name. If the optional\n   * DOM event name is omitted, 'click' is assumed. The jsaction names\n   * are dot separated pairs of a namespace and a simple jsaction\n   * name.\n   *\n   * See grammar in README.md for expected syntax in the attribute value.\n   */\n  JSACTION: 'jsaction' as const,\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** All properties that are used by jsaction. */\nexport const Property = {\n  /**\n   * The parsed value of the jsaction attribute is stored in this\n   * property on the DOM node. The parsed value is an Object. The\n   * property names of the object are the events; the values are the\n   * names of the actions. This property is attached even on nodes\n   * that don't have a jsaction attribute as an optimization, because\n   * property lookup is faster than attribute access.\n   */\n  JSACTION: '__jsaction' as const,\n  /**\n   * The owner property references an a logical owner for a DOM node. JSAction\n   * will follow this reference instead of parentNode when traversing the DOM\n   * to find jsaction attributes. This allows overlaying a logical structure\n   * over a document where the DOM structure can't reflect that structure.\n   */\n  OWNER: '__owner' as const,\n};\n\ndeclare global {\n  interface Node {\n    [Property.JSACTION]?: {[key: string]: string | undefined};\n    [Property.OWNER]?: ParentNode;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Property} from './property';\n\n/**\n * Map from jsaction annotation to a parsed map from event name to action name.\n */\nconst parseCache: {[key: string]: {[key: string]: string | undefined}} = {};\n\n/**\n * Reads the jsaction parser cache from the given DOM Element.\n */\nexport function get(element: Element): {[key: string]: string | undefined} | undefined {\n  return element[Property.JSACTION];\n}\n\n/**\n * Reads the jsaction parser cache for the given DOM element. If no cache is yet present,\n * creates an empty one.\n */\nexport function getDefaulted(element: Element): {[key: string]: string | undefined} {\n  const cache = get(element) ?? {};\n  set(element, cache);\n  return cache;\n}\n\n/**\n * Writes the jsaction parser cache to the given DOM Element.\n */\nexport function set(element: Element, actionMap: {[key: string]: string | undefined}) {\n  element[Property.JSACTION] = actionMap;\n}\n\n/**\n * Looks up the parsed action map from the source jsaction attribute value.\n *\n * @param text Unparsed jsaction attribute value.\n * @return Parsed jsaction attribute value, if already present in the cache.\n */\nexport function getParsed(text: string): {[key: string]: string | undefined} | undefined {\n  return parseCache[text];\n}\n\n/**\n * Inserts the parse result for the given source jsaction value into the cache.\n *\n * @param text Unparsed jsaction attribute value.\n * @param parsed Attribute value parsed into the action map.\n */\nexport function setParsed(text: string, parsed: {[key: string]: string | undefined}) {\n  parseCache[text] = parsed;\n}\n\n/**\n * Clears the jsaction parser cache from the given DOM Element.\n *\n * @param element .\n */\nexport function clear(element: Element) {\n  if (Property.JSACTION in element) {\n    delete element[Property.JSACTION];\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/*\n * Names of events that are special to jsaction. These are not all\n * event types that are legal to use in either HTML or the addEvent()\n * API, but these are the ones that are treated specially. All other\n * DOM events can be used in either addEvent() or in the value of the\n * jsaction attribute. Beware of browser specific events or events\n * that don't bubble though: If they are not mentioned here, then\n * event contract doesn't work around their peculiarities.\n */\nexport const EventType = {\n  /**\n   * Mouse middle click, introduced in Chrome 55 and not yet supported on\n   * other browsers.\n   */\n  AUXCLICK: 'auxclick',\n\n  /**\n   * The change event fired by browsers when the `value` attribute of input,\n   * select, and textarea elements are changed.\n   */\n  CHANGE: 'change',\n\n  /**\n   * The click event. In addEvent() refers to all click events, in the\n   * jsaction attribute it refers to the unmodified click and Enter/Space\n   * keypress events.  In the latter case, a jsaction click will be triggered,\n   * for accessibility reasons.  See clickmod and clickonly, below.\n   */\n  CLICK: 'click',\n\n  /**\n   * Specifies the jsaction for a modified click event (i.e. a mouse\n   * click with the modifier key Cmd/Ctrl pressed). This event isn't\n   * separately enabled in addEvent(), because in the DOM, it's just a\n   * click event.\n   */\n  CLICKMOD: 'clickmod',\n\n  /**\n   * Specifies the jsaction for a click-only event.  Click-only doesn't take\n   * into account the case where an element with focus receives an Enter/Space\n   * keypress.  This event isn't separately enabled in addEvent().\n   */\n  CLICKONLY: 'clickonly',\n\n  /**\n   * The dblclick event.\n   */\n  DBLCLICK: 'dblclick',\n\n  /**\n   * Focus doesn't bubble, but you can use it in addEvent() and\n   * jsaction anyway. EventContract does the right thing under the\n   * hood.\n   */\n  FOCUS: 'focus',\n\n  /**\n   * This event only exists in IE. For addEvent() and jsaction, use\n   * focus instead; EventContract does the right thing even though\n   * focus doesn't bubble.\n   */\n  FOCUSIN: 'focusin',\n\n  /**\n   * Analog to focus.\n   */\n  BLUR: 'blur',\n\n  /**\n   * Analog to focusin.\n   */\n  FOCUSOUT: 'focusout',\n\n  /**\n   * Submit doesn't bubble, so it cannot be used with event\n   * contract. However, the browser helpfully fires a click event on\n   * the submit button of a form (even if the form is not submitted by\n   * a click on the submit button). So you should handle click on the\n   * submit button instead.\n   */\n  SUBMIT: 'submit',\n\n  /**\n   * The keydown event. In addEvent() and non-click jsaction it represents the\n   * regular DOM keydown event. It represents click actions in non-Gecko\n   * browsers.\n   */\n  KEYDOWN: 'keydown',\n\n  /**\n   * The keypress event. In addEvent() and non-click jsaction it represents the\n   * regular DOM keypress event. It represents click actions in Gecko browsers.\n   */\n  KEYPRESS: 'keypress',\n\n  /**\n   * The keyup event. In addEvent() and non-click jsaction it represents the\n   * regular DOM keyup event. It represents click actions in non-Gecko\n   * browsers.\n   */\n  KEYUP: 'keyup',\n\n  /**\n   * The mouseup event. Can either be used directly or used implicitly to\n   * capture mouseup events. In addEvent(), it represents a regular DOM\n   * mouseup event.\n   */\n  MOUSEUP: 'mouseup',\n\n  /**\n   * The mousedown event. Can either be used directly or used implicitly to\n   * capture mouseenter events. In addEvent(), it represents a regular DOM\n   * mouseover event.\n   */\n  MOUSEDOWN: 'mousedown',\n\n  /**\n   * The mouseover event. Can either be used directly or used implicitly to\n   * capture mouseenter events. In addEvent(), it represents a regular DOM\n   * mouseover event.\n   */\n  MOUSEOVER: 'mouseover',\n\n  /**\n   * The mouseout event. Can either be used directly or used implicitly to\n   * capture mouseover events. In addEvent(), it represents a regular DOM\n   * mouseout event.\n   */\n  MOUSEOUT: 'mouseout',\n\n  /**\n   * The mouseenter event. Does not bubble and fires individually on each\n   * element being entered within a DOM tree.\n   */\n  MOUSEENTER: 'mouseenter',\n\n  /**\n   * The mouseleave event. Does not bubble and fires individually on each\n   * element being entered within a DOM tree.\n   */\n  MOUSELEAVE: 'mouseleave',\n\n  /**\n   * The mousemove event.\n   */\n  MOUSEMOVE: 'mousemove',\n\n  /**\n   * The pointerup event. Can either be used directly or used implicitly to\n   * capture pointerup events. In addEvent(), it represents a regular DOM\n   * pointerup event.\n   */\n  POINTERUP: 'pointerup',\n\n  /**\n   * The pointerdown event. Can either be used directly or used implicitly to\n   * capture pointerenter events. In addEvent(), it represents a regular DOM\n   * mouseover event.\n   */\n  POINTERDOWN: 'pointerdown',\n\n  /**\n   * The pointerover event. Can either be used directly or used implicitly to\n   * capture pointerenter events. In addEvent(), it represents a regular DOM\n   * pointerover event.\n   */\n  POINTEROVER: 'pointerover',\n\n  /**\n   * The pointerout event. Can either be used directly or used implicitly to\n   * capture pointerover events. In addEvent(), it represents a regular DOM\n   * pointerout event.\n   */\n  POINTEROUT: 'pointerout',\n\n  /**\n   * The pointerenter event. Does not bubble and fires individually on each\n   * element being entered within a DOM tree.\n   */\n  POINTERENTER: 'pointerenter',\n\n  /**\n   * The pointerleave event. Does not bubble and fires individually on each\n   * element being entered within a DOM tree.\n   */\n  POINTERLEAVE: 'pointerleave',\n\n  /**\n   * The pointermove event.\n   */\n  POINTERMOVE: 'pointermove',\n\n  /**\n   * The pointercancel event.\n   */\n  POINTERCANCEL: 'pointercancel',\n\n  /**\n   * The gotpointercapture event is fired when\n   * Element.setPointerCapture(pointerId) is called on a mouse input, or\n   * implicitly when a touch input begins.\n   */\n  GOTPOINTERCAPTURE: 'gotpointercapture',\n\n  /**\n   * The lostpointercapture event is fired when\n   * Element.releasePointerCapture(pointerId) is called, or implicitly after a\n   * touch input ends.\n   */\n  LOSTPOINTERCAPTURE: 'lostpointercapture',\n\n  /**\n   * The error event. The error event doesn't bubble, but you can use it in\n   * addEvent() and jsaction anyway. EventContract does the right thing under\n   * the hood (except in IE8 which does not use error events).\n   */\n  ERROR: 'error',\n\n  /**\n   * The load event. The load event doesn't bubble, but you can use it in\n   * addEvent() and jsaction anyway. EventContract does the right thing\n   * under the hood.\n   */\n  LOAD: 'load',\n\n  /**\n   * The unload event.\n   */\n  UNLOAD: 'unload',\n\n  /**\n   * The touchstart event. Bubbles, will only ever fire in browsers with\n   * touch support.\n   */\n  TOUCHSTART: 'touchstart',\n\n  /**\n   * The touchend event. Bubbles, will only ever fire in browsers with\n   * touch support.\n   */\n  TOUCHEND: 'touchend',\n\n  /**\n   * The touchmove event. Bubbles, will only ever fire in browsers with\n   * touch support.\n   */\n  TOUCHMOVE: 'touchmove',\n\n  /**\n   * The input event.\n   */\n  INPUT: 'input',\n\n  /**\n   * The scroll event.\n   */\n  SCROLL: 'scroll',\n\n  /**\n   * The toggle event. The toggle event doesn't bubble, but you can use it in\n   * addEvent() and jsaction anyway. EventContract does the right thing\n   * under the hood.\n   */\n  TOGGLE: 'toggle',\n\n  /**\n   * A custom event. The actual custom event type is declared as the 'type'\n   * field in the event details. Supported in Firefox 6+, IE 9+, and all Chrome\n   * versions.\n   *\n   * This is an internal name. Users should use jsaction's fireCustomEvent to\n   * fire custom events instead of relying on this type to create them.\n   */\n  CUSTOM: '_custom',\n};\n\n/** All event types that do not bubble or capture and need a polyfill. */\nexport const MOUSE_SPECIAL_EVENT_TYPES = [\n  EventType.MOUSEENTER,\n  EventType.MOUSELEAVE,\n  'pointerenter',\n  'pointerleave',\n];\n\n/** All event types that are registered in the bubble phase. */\nexport const BUBBLE_EVENT_TYPES = [\n  EventType.CLICK,\n  EventType.DBLCLICK,\n  EventType.FOCUSIN,\n  EventType.FOCUSOUT,\n  EventType.KEYDOWN,\n  EventType.KEYUP,\n  EventType.KEYPRESS,\n  EventType.MOUSEOVER,\n  EventType.MOUSEOUT,\n  EventType.SUBMIT,\n  EventType.TOUCHSTART,\n  EventType.TOUCHEND,\n  EventType.TOUCHMOVE,\n  'touchcancel',\n\n  'auxclick',\n  'change',\n  'compositionstart',\n  'compositionupdate',\n  'compositionend',\n  'beforeinput',\n  'input',\n  'select',\n\n  'copy',\n  'cut',\n  'paste',\n  'mousedown',\n  'mouseup',\n  'wheel',\n  'contextmenu',\n\n  'dragover',\n  'dragenter',\n  'dragleave',\n  'drop',\n  'dragstart',\n  'dragend',\n\n  'pointerdown',\n  'pointermove',\n  'pointerup',\n  'pointercancel',\n  'pointerover',\n  'pointerout',\n  'gotpointercapture',\n  'lostpointercapture',\n\n  // Video events.\n  'ended',\n  'loadedmetadata',\n\n  // Page visibility events.\n  'pagehide',\n  'pageshow',\n  'visibilitychange',\n\n  // Content visibility events.\n  'beforematch',\n];\n\n/** All event types that are registered in the capture phase. */\nexport const CAPTURE_EVENT_TYPES = [\n  EventType.FOCUS,\n  EventType.BLUR,\n  EventType.ERROR,\n  EventType.LOAD,\n  EventType.TOGGLE,\n];\n\n/**\n * Whether or not an event type should be registered in the capture phase.\n * @param eventType\n * @returns bool\n */\nexport const isCaptureEventType = (eventType: string) =>\n  CAPTURE_EVENT_TYPES.indexOf(eventType) >= 0;\n\n/** All event types that are registered early.  */\nconst EARLY_EVENT_TYPES = BUBBLE_EVENT_TYPES.concat(CAPTURE_EVENT_TYPES);\n\n/**\n * Whether or not an event type is registered in the early contract.\n */\nexport const isEarlyEventType = (eventType: string) => EARLY_EVENT_TYPES.indexOf(eventType) >= 0;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EventHandlerInfo} from './event_handler';\nimport {isCaptureEventType, EventType} from './event_type';\nimport {KeyCode} from './key_code';\n\n/**\n * Gets a browser event type, if it would differ from the JSAction event type.\n */\nexport function getBrowserEventType(eventType: string) {\n  // Mouseenter and mouseleave events are not handled directly because they\n  // are not available everywhere. In browsers where they are available, they\n  // don't bubble and aren't visible at the container boundary. Instead, we\n  // synthesize the mouseenter and mouseleave events from mouseover and\n  // mouseout events, respectively. Cf. eventcontract.js.\n  if (eventType === EventType.MOUSEENTER) {\n    return EventType.MOUSEOVER;\n  } else if (eventType === EventType.MOUSELEAVE) {\n    return EventType.MOUSEOUT;\n  } else if (eventType === EventType.POINTERENTER) {\n    return EventType.POINTEROVER;\n  } else if (eventType === EventType.POINTERLEAVE) {\n    return EventType.POINTEROUT;\n  }\n  return eventType;\n}\n\n/**\n * Registers the event handler function with the given DOM element for\n * the given event type.\n *\n * @param element The element.\n * @param eventType The event type.\n * @param handler The handler function to install.\n * @param passive A boolean value that, if `true`, indicates that the function\n *     specified by `handler` will never call `preventDefault()`.\n * @return Information needed to uninstall the event handler eventually.\n */\nexport function addEventListener(\n  element: Element,\n  eventType: string,\n  handler: (event: Event) => void,\n  passive?: boolean,\n): EventHandlerInfo {\n  // All event handlers are registered in the bubbling\n  // phase.\n  //\n  // All browsers support focus and blur, but these events only are propagated\n  // in the capture phase. Very legacy browsers do not support focusin or\n  // focusout.\n  //\n  // It would be a bad idea to register all event handlers in the\n  // capture phase because then regular onclick handlers would not be\n  // executed at all on events that trigger a jsaction. That's not\n  // entirely what we want, at least for now.\n  //\n  // Error and load events (i.e. on images) do not bubble so they are also\n  // handled in the capture phase.\n  let capture = false;\n\n  if (isCaptureEventType(eventType)) {\n    capture = true;\n  }\n\n  const options = typeof passive === 'boolean' ? {capture, passive} : capture;\n  element.addEventListener(eventType, handler, options);\n\n  return {eventType, handler, capture, passive};\n}\n\n/**\n * Removes the event handler for the given event from the element.\n * the given event type.\n *\n * @param element The element.\n * @param info The information needed to deregister the handler, as returned by\n *     addEventListener(), above.\n */\nexport function removeEventListener(element: Element, info: EventHandlerInfo) {\n  if (element.removeEventListener) {\n    // It's worth noting that some browser releases have been inconsistent on this, and unless\n    // you have specific reasons otherwise, it's probably wise to use the same values used for\n    // the call to addEventListener() when calling removeEventListener().\n    const options = typeof info.passive === 'boolean' ? {capture: info.capture} : info.capture;\n    element.removeEventListener(info.eventType, info.handler as EventListener, options);\n    // `detachEvent` is an old DOM API.\n  } else if ((element as any).detachEvent) {\n    // `detachEvent` is an old DOM API.\n    (element as any).detachEvent(`on${info.eventType}`, info.handler);\n  }\n}\n\n/**\n * Cancels propagation of an event.\n * @param e The event to cancel propagation for.\n */\nexport function stopPropagation(e: Event) {\n  e.stopPropagation ? e.stopPropagation() : (e.cancelBubble = true);\n}\n\n/**\n * Prevents the default action of an event.\n * @param e The event to prevent the default action for.\n */\nexport function preventDefault(e: Event) {\n  e.preventDefault ? e.preventDefault() : (e.returnValue = false);\n}\n\n/**\n * Gets the target Element of the event. In Firefox, a text node may appear as\n * the target of the event, in which case we return the parent element of the\n * text node.\n * @param e The event to get the target of.\n * @return The target element.\n */\nexport function getTarget(e: Event): Element {\n  let el = e.target as Element;\n\n  // In Firefox, the event may have a text node as its target. We always\n  // want the parent Element the text node belongs to, however.\n  if (!el.getAttribute && el.parentNode) {\n    el = el.parentNode as Element;\n  }\n\n  return el;\n}\n\n/**\n * Whether we are on a Mac. Not pulling in useragent just for this.\n */\nlet isMac: boolean = typeof navigator !== 'undefined' && /Macintosh/.test(navigator.userAgent);\n\n/**\n * Determines and returns whether the given event (which is assumed to be a\n * click event) is a middle click.\n * NOTE: There is not a consistent way to identify middle click\n * http://www.unixpapa.com/js/mouse.html\n */\nfunction isMiddleClick(e: Event): boolean {\n  return (\n    // `which` is an old DOM API.\n    (e as any).which === 2 ||\n    // `which` is an old DOM API.\n    ((e as any).which == null &&\n      // `button` is an old DOM API.\n      (e as any).button === 4) // middle click for IE\n  );\n}\n\n/**\n * Determines and returns whether the given event (which is assumed\n * to be a click event) is modified. A middle click is considered a modified\n * click to retain the default browser action, which opens a link in a new tab.\n * @param e The event.\n * @return Whether the given event is modified.\n */\nexport function isModifiedClickEvent(e: Event): boolean {\n  return (\n    // `metaKey` is an old DOM API.\n    (isMac && (e as any).metaKey) ||\n    // `ctrlKey` is an old DOM API.\n    (!isMac && (e as any).ctrlKey) ||\n    isMiddleClick(e) ||\n    // `shiftKey` is an old DOM API.\n    (e as any).shiftKey\n  );\n}\n\n/** Whether we are on WebKit (e.g., Chrome). */\nexport const isWebKit: boolean =\n  typeof navigator !== 'undefined' &&\n  !/Opera/.test(navigator.userAgent) &&\n  /WebKit/.test(navigator.userAgent);\n\n/** Whether we are on IE. */\nexport const isIe: boolean =\n  typeof navigator !== 'undefined' &&\n  (/MSIE/.test(navigator.userAgent) || /Trident/.test(navigator.userAgent));\n\n/** Whether we are on Gecko (e.g., Firefox). */\nexport const isGecko: boolean =\n  typeof navigator !== 'undefined' &&\n  !/Opera|WebKit/.test(navigator.userAgent) &&\n  /Gecko/.test(navigator.product);\n\n/**\n * Determines and returns whether the given element is a valid target for\n * keypress/keydown DOM events that act like regular DOM clicks.\n * @param el The element.\n * @return Whether the given element is a valid action key target.\n */\nexport function isValidActionKeyTarget(el: Element): boolean {\n  if (!('getAttribute' in el)) {\n    return false;\n  }\n  if (isTextControl(el)) {\n    return false;\n  }\n  if (isNativelyActivatable(el)) {\n    return false;\n  }\n  // `isContentEditable` is an old DOM API.\n  if ((el as any).isContentEditable) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Whether an event has a modifier key activated.\n * @param e The event.\n * @return True, if a modifier key is activated.\n */\nfunction hasModifierKey(e: Event): boolean {\n  return (\n    // `ctrlKey` is an old DOM API.\n    (e as any).ctrlKey ||\n    // `shiftKey` is an old DOM API.\n    (e as any).shiftKey ||\n    // `altKey` is an old DOM API.\n    (e as any).altKey ||\n    // `metaKey` is an old DOM API.\n    (e as any).metaKey\n  );\n}\n\n/**\n * Determines and returns whether the given event has a target that already\n * has event handlers attached because it is a native HTML control. Used to\n * determine if preventDefault should be called when isActionKeyEvent is true.\n * @param e The event.\n * @return If preventDefault should be called.\n */\nexport function shouldCallPreventDefaultOnNativeHtmlControl(e: Event): boolean {\n  const el = getTarget(e);\n  const tagName = el.tagName.toUpperCase();\n  const role = (el.getAttribute('role') || '').toUpperCase();\n\n  if (tagName === 'BUTTON' || role === 'BUTTON') {\n    return true;\n  }\n  if (!isNativeHTMLControl(el)) {\n    return false;\n  }\n  if (tagName === 'A') {\n    return false;\n  }\n  /**\n   * Fix for physical d-pads on feature phone platforms; the native event\n   * (ie. isTrusted: true) needs to fire to show the OPTION list. See\n   * b/135288469 for more info.\n   */\n  if (tagName === 'SELECT') {\n    return false;\n  }\n  if (processSpace(el)) {\n    return false;\n  }\n  if (isTextControl(el)) {\n    return false;\n  }\n  return true;\n}\n\n/**\n * Determines and returns whether the given event acts like a regular DOM click,\n * and should be handled instead of the click.  If this returns true, the caller\n * will call preventDefault() to prevent a possible duplicate event.\n * This is represented by a keypress (keydown on Gecko browsers) on Enter or\n * Space key.\n * @param e The event.\n * @return True, if the event emulates a DOM click.\n */\nexport function isActionKeyEvent(e: Event): boolean {\n  let key =\n    // `which` is an old DOM API.\n    (e as any).which ||\n    // `keyCode` is an old DOM API.\n    (e as any).keyCode;\n  if (!key && (e as KeyboardEvent).key) {\n    key = ACTION_KEY_TO_KEYCODE[(e as KeyboardEvent).key];\n  }\n  if (isWebKit && key === KeyCode.MAC_ENTER) {\n    key = KeyCode.ENTER;\n  }\n  if (key !== KeyCode.ENTER && key !== KeyCode.SPACE) {\n    return false;\n  }\n  const el = getTarget(e);\n  if (e.type !== EventType.KEYDOWN || !isValidActionKeyTarget(el) || hasModifierKey(e)) {\n    return false;\n  }\n\n  // For <input type=\"checkbox\">, we must only handle the browser's native click\n  // event, so that the browser can toggle the checkbox.\n  if (processSpace(el) && key === KeyCode.SPACE) {\n    return false;\n  }\n\n  // If this element is non-focusable, ignore stray keystrokes (b/18337209)\n  // Sscreen readers can move without tab focus, so any tabIndex is focusable.\n  // See B/21809604\n  if (!isFocusable(el)) {\n    return false;\n  }\n\n  const type = (\n    el.getAttribute('role') ||\n    (el as HTMLInputElement).type ||\n    el.tagName\n  ).toUpperCase();\n  const isSpecificTriggerKey = IDENTIFIER_TO_KEY_TRIGGER_MAPPING[type] % key === 0;\n  const isDefaultTriggerKey = !(type in IDENTIFIER_TO_KEY_TRIGGER_MAPPING) && key === KeyCode.ENTER;\n  const hasType = el.tagName.toUpperCase() !== 'INPUT' || !!(el as HTMLInputElement).type;\n  return (isSpecificTriggerKey || isDefaultTriggerKey) && hasType;\n}\n\n/**\n * Checks whether a DOM element can receive keyboard focus.\n * This code is based on goog.dom.isFocusable, but simplified since we shouldn't\n * care about visibility if we're already handling a keyboard event.\n */\nfunction isFocusable(el: Element): boolean {\n  return (\n    (el.tagName in NATIVELY_FOCUSABLE_ELEMENTS || hasSpecifiedTabIndex(el)) &&\n    !(el as HTMLInputElement).disabled\n  );\n}\n\n/**\n * @param element Element to check.\n * @return Whether the element has a specified tab index.\n */\nfunction hasSpecifiedTabIndex(element: Element): boolean {\n  // IE returns 0 for an unset tabIndex, so we must use getAttributeNode(),\n  // which returns an object with a 'specified' property if tabIndex is\n  // specified.  This works on other browsers, too.\n  const attrNode = element.getAttributeNode('tabindex'); // Must be lowercase!\n  return attrNode != null && attrNode.specified;\n}\n\n/** Element tagnames that are focusable by default. */\nconst NATIVELY_FOCUSABLE_ELEMENTS: {[key: string]: number} = {\n  'A': 1,\n  'INPUT': 1,\n  'TEXTAREA': 1,\n  'SELECT': 1,\n  'BUTTON': 1,\n};\n\n/** @return True, if the Space key was pressed. */\nexport function isSpaceKeyEvent(e: Event): boolean {\n  const key =\n    // `which` is an old DOM API.\n    (e as any).which ||\n    // `keyCode` is an old DOM API.\n    (e as any).keyCode;\n  const el = getTarget(e);\n  const elementName = ((el as HTMLInputElement).type || el.tagName).toUpperCase();\n  return key === KeyCode.SPACE && elementName !== 'CHECKBOX';\n}\n\n/**\n * Determines whether the event corresponds to a non-bubbling mouse\n * event type (mouseenter, mouseleave, pointerenter, and pointerleave).\n *\n * During mouseover (mouseenter) and pointerover (pointerenter), the\n * relatedTarget is the element being entered from. During mouseout (mouseleave)\n * and pointerout (pointerleave), the relatedTarget is the element being exited\n * to.\n *\n * In both cases, if relatedTarget is outside target, then the corresponding\n * special event has occurred, otherwise it hasn't.\n *\n * @param e The mouseover/mouseout event.\n * @param type The type of the mouse special event.\n * @param element The element on which the jsaction for the\n *     mouseenter/mouseleave event is defined.\n * @return True if the event is a mouseenter/mouseleave event.\n */\nexport function isMouseSpecialEvent(e: Event, type: string, element: Element): boolean {\n  // `relatedTarget` is an old DOM API.\n  const related = (e as any).relatedTarget as Node;\n\n  return (\n    ((e.type === EventType.MOUSEOVER && type === EventType.MOUSEENTER) ||\n      (e.type === EventType.MOUSEOUT && type === EventType.MOUSELEAVE) ||\n      (e.type === EventType.POINTEROVER && type === EventType.POINTERENTER) ||\n      (e.type === EventType.POINTEROUT && type === EventType.POINTERLEAVE)) &&\n    (!related || (related !== element && !element.contains(related)))\n  );\n}\n\n/**\n * Creates a new EventLike object for a mouseenter/mouseleave event that's\n * derived from the original corresponding mouseover/mouseout event.\n * @param e The event.\n * @param target The element on which the jsaction for the mouseenter/mouseleave\n *     event is defined.\n * @return A modified event-like object copied from the event object passed into\n *     this function.\n */\nexport function createMouseSpecialEvent(e: Event, target: Element): Event {\n  // We have to create a copy of the event object because we need to mutate\n  // its fields. We do this for the special mouse events because the event\n  // target needs to be retargeted to the action element rather than the real\n  // element (since we are simulating the special mouse events with mouseover/\n  // mouseout).\n  //\n  // Since we're making a copy anyways, we might as well attempt to convert\n  // this event into a pseudo-real mouseenter/mouseleave event by adjusting\n  // its type.\n  //\n  const copy: {-readonly [P in keyof Event]?: Event[P]} & {'_originalEvent'?: Event} = {};\n  for (const property in e) {\n    if (property === 'srcElement' || property === 'target') {\n      continue;\n    }\n    const key = property as keyof Event;\n    // Making a copy requires iterating through all properties of `Event`.\n    const value = e[key];\n    if (typeof value === 'function') {\n      continue;\n    }\n    // Value should be the expected type, but the value of `key` is not known\n    // statically.\n    copy[key] = value as any;\n  }\n  if (e.type === EventType.MOUSEOVER) {\n    copy['type'] = EventType.MOUSEENTER;\n  } else if (e.type === EventType.MOUSEOUT) {\n    copy['type'] = EventType.MOUSELEAVE;\n  } else if (e.type === EventType.POINTEROVER) {\n    copy['type'] = EventType.POINTERENTER;\n  } else {\n    copy['type'] = EventType.POINTERLEAVE;\n  }\n  copy['target'] = copy['srcElement'] = target;\n  copy['bubbles'] = false;\n  copy['_originalEvent'] = e;\n  return copy as Event;\n}\n\n/**\n * Returns touch data extracted from the touch event: clientX, clientY, screenX\n * and screenY. If the event has no touch information at all, the returned\n * value is null.\n *\n * The fields of this Object are unquoted.\n *\n * @param event A touch event.\n */\nexport function getTouchData(\n  event: TouchEvent,\n): {clientX: number; clientY: number; screenX: number; screenY: number} | null {\n  const touch =\n    (event.changedTouches && event.changedTouches[0]) || (event.touches && event.touches[0]);\n  if (!touch) {\n    return null;\n  }\n  return {\n    clientX: touch.clientX,\n    clientY: touch.clientY,\n    screenX: touch.screenX,\n    screenY: touch.screenY,\n  };\n}\n\ndeclare interface SyntheticMouseEvent extends Event {\n  // Redeclared from Event to indicate that it is not readonly.\n  defaultPrevented: boolean;\n  originalEventType: string;\n  _propagationStopped?: boolean;\n}\n\n/**\n * Creates a new EventLike object for a \"click\" event that's derived from the\n * original corresponding \"touchend\" event for a fast-click implementation.\n *\n * It takes a touch event, adds common fields found in a click event and\n * changes the type to 'click', so that the resulting event looks more like\n * a real click event.\n *\n * @param event A touch event.\n * @return A modified event-like object copied from the event object passed into\n *     this function.\n */\nexport function recreateTouchEventAsClick(event: TouchEvent): MouseEvent {\n  const click: {-readonly [P in keyof MouseEvent]?: MouseEvent[P]} & Partial<SyntheticMouseEvent> =\n    {};\n  click['originalEventType'] = event.type;\n  click['type'] = EventType.CLICK;\n  for (const property in event) {\n    if (property === 'type' || property === 'srcElement') {\n      continue;\n    }\n    const key = property as keyof TouchEvent;\n    // Making a copy requires iterating through all properties of `TouchEvent`.\n    const value = event[key];\n    if (typeof value === 'function') {\n      continue;\n    }\n    // Value should be the expected type, but the value of `key` is not known\n    // statically.\n    click[key as keyof MouseEvent] = value as any;\n  }\n\n  // Ensure that the event has the most recent timestamp. This timestamp\n  // may be used in the future to validate or cancel subsequent click events.\n  click['timeStamp'] = Date.now();\n\n  // Emulate preventDefault and stopPropagation behavior\n  click['defaultPrevented'] = false;\n  click['preventDefault'] = syntheticPreventDefault;\n  click['_propagationStopped'] = false;\n  click['stopPropagation'] = syntheticStopPropagation;\n\n  // Emulate click coordinates using touch info\n  const touch = getTouchData(event);\n  if (touch) {\n    click['clientX'] = touch.clientX;\n    click['clientY'] = touch.clientY;\n    click['screenX'] = touch.screenX;\n    click['screenY'] = touch.screenY;\n  }\n  return click as MouseEvent;\n}\n\n/**\n * An implementation of \"preventDefault\" for a synthesized event. Simply\n * sets \"defaultPrevented\" property to true.\n */\nfunction syntheticPreventDefault(this: Event) {\n  (this as SyntheticMouseEvent).defaultPrevented = true;\n}\n\n/**\n * An implementation of \"stopPropagation\" for a synthesized event. It simply\n * sets a synthetic non-standard \"_propagationStopped\" property to true.\n */\nfunction syntheticStopPropagation(this: Event) {\n  (this as SyntheticMouseEvent)._propagationStopped = true;\n}\n\n/**\n * Mapping of KeyboardEvent.key values to\n * KeyCode values.\n */\nconst ACTION_KEY_TO_KEYCODE: {[key: string]: number} = {\n  'Enter': KeyCode.ENTER,\n  ' ': KeyCode.SPACE,\n};\n\n/**\n * Mapping of HTML element identifiers (ARIA role, type, or tagName) to the\n * keys (enter and/or space) that should activate them. A value of zero means\n * that both should activate them.\n */\nexport const IDENTIFIER_TO_KEY_TRIGGER_MAPPING: {[key: string]: number} = {\n  'A': KeyCode.ENTER,\n  'BUTTON': 0,\n  'CHECKBOX': KeyCode.SPACE,\n  'COMBOBOX': KeyCode.ENTER,\n  'FILE': 0,\n  'GRIDCELL': KeyCode.ENTER,\n  'LINK': KeyCode.ENTER,\n  'LISTBOX': KeyCode.ENTER,\n  'MENU': 0,\n  'MENUBAR': 0,\n  'MENUITEM': 0,\n  'MENUITEMCHECKBOX': 0,\n  'MENUITEMRADIO': 0,\n  'OPTION': 0,\n  'RADIO': KeyCode.SPACE,\n  'RADIOGROUP': KeyCode.SPACE,\n  'RESET': 0,\n  'SUBMIT': 0,\n  'SWITCH': KeyCode.SPACE,\n  'TAB': 0,\n  'TREE': KeyCode.ENTER,\n  'TREEITEM': KeyCode.ENTER,\n};\n\n/**\n * Returns whether or not to process space based on the type of the element;\n * checks to make sure that type is not null.\n * @param element The element.\n * @return Whether or not to process space based on type.\n */\nfunction processSpace(element: Element): boolean {\n  const type = (element.getAttribute('type') || element.tagName).toUpperCase();\n  return type in PROCESS_SPACE;\n}\n\n/**\n * Returns whether or not the given element is a text control.\n * @param el The element.\n * @return Whether or not the given element is a text control.\n */\nfunction isTextControl(el: Element): boolean {\n  const type = (el.getAttribute('type') || el.tagName).toUpperCase();\n  return type in TEXT_CONTROLS;\n}\n\n/**\n * Returns if the given element is a native HTML control.\n * @param el The element.\n * @return If the given element is a native HTML control.\n */\nexport function isNativeHTMLControl(el: Element): boolean {\n  return el.tagName.toUpperCase() in NATIVE_HTML_CONTROLS;\n}\n\n/**\n * Returns if the given element is natively activatable. Browsers emit click\n * events for natively activatable elements, even when activated via keyboard.\n * For these elements, we don't need to raise a11y click events.\n * @param el The element.\n * @return If the given element is a native HTML control.\n */\nfunction isNativelyActivatable(el: Element): boolean {\n  return (\n    el.tagName.toUpperCase() === 'BUTTON' ||\n    (!!(el as HTMLInputElement).type && (el as HTMLInputElement).type.toUpperCase() === 'FILE')\n  );\n}\n\n/**\n * HTML <input> types (not ARIA roles) which will auto-trigger a click event for\n * the Space key, with side-effects. We will not call preventDefault if space is\n * pressed, nor will we raise a11y click events.  For all other elements, we can\n * suppress the default event (which has no desired side-effects) and handle the\n * keydown ourselves.\n */\nconst PROCESS_SPACE: {[key: string]: boolean} = {\n  'CHECKBOX': true,\n  'FILE': true,\n  'OPTION': true,\n  'RADIO': true,\n};\n\n/** TagNames and Input types for which to not process enter/space as click. */\nconst TEXT_CONTROLS: {[key: string]: boolean} = {\n  'COLOR': true,\n  'DATE': true,\n  'DATETIME': true,\n  'DATETIME-LOCAL': true,\n  'EMAIL': true,\n  'MONTH': true,\n  'NUMBER': true,\n  'PASSWORD': true,\n  'RANGE': true,\n  'SEARCH': true,\n  'TEL': true,\n  'TEXT': true,\n  'TEXTAREA': true,\n  'TIME': true,\n  'URL': true,\n  'WEEK': true,\n};\n\n/** TagNames that are native HTML controls. */\nconst NATIVE_HTML_CONTROLS: {[key: string]: boolean} = {\n  'A': true,\n  'AREA': true,\n  'BUTTON': true,\n  'DIALOG': true,\n  'IMG': true,\n  'INPUT': true,\n  'LINK': true,\n  'MENU': true,\n  'OPTGROUP': true,\n  'OPTION': true,\n  'PROGRESS': true,\n  'SELECT': true,\n  'TEXTAREA': true,\n};\n\n/** Exported for testing. */\nexport const testing = {\n  setIsMac(value: boolean) {\n    isMac = value;\n  },\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport * as eventLib from './event';\nimport {EventHandlerInfo} from './event_handler';\n\n/**\n * An `EventContractContainerManager` provides the common interface for managing\n * containers.\n */\nexport interface EventContractContainerManager {\n  addEventListener(\n    eventType: string,\n    getHandler: (element: Element) => (event: Event) => void,\n    passive?: boolean,\n  ): void;\n\n  cleanUp(): void;\n}\n\n/**\n * Whether the user agent is running on iOS.\n */\nconst isIos = typeof navigator !== 'undefined' && /iPhone|iPad|iPod/.test(navigator.userAgent);\n\n/**\n * A class representing a container node and all the event handlers\n * installed on it. Used so that handlers can be cleaned up if the\n * container is removed from the contract.\n */\nexport class EventContractContainer implements EventContractContainerManager {\n  /**\n   * Array of event handlers and their corresponding event types that are\n   * installed on this container.\n   *\n   */\n  private handlerInfos: EventHandlerInfo[] = [];\n\n  /**\n   * @param element The container Element.\n   */\n  constructor(readonly element: Element) {}\n\n  /**\n   * Installs the provided installer on the element owned by this container,\n   * and maintains a reference to resulting handler in order to remove it\n   * later if desired.\n   */\n  addEventListener(\n    eventType: string,\n    getHandler: (element: Element) => (event: Event) => void,\n    passive?: boolean,\n  ) {\n    // In iOS, event bubbling doesn't happen automatically in any DOM element,\n    // unless it has an onclick attribute or DOM event handler attached to it.\n    // This breaks JsAction in some cases. See \"Making Elements Clickable\"\n    // section at http://goo.gl/2VoGnB.\n    //\n    // A workaround for this issue is to change the CSS cursor style to 'pointer'\n    // for the container element, which magically turns on event bubbling. This\n    // solution is described in the comments section at http://goo.gl/6pEO1z.\n    //\n    // We use a navigator.userAgent check here as this problem is present both\n    // on Mobile Safari and thin WebKit wrappers, such as Chrome for iOS.\n    if (isIos) {\n      (this.element as HTMLElement).style.cursor = 'pointer';\n    }\n    this.handlerInfos.push(\n      eventLib.addEventListener(this.element, eventType, getHandler(this.element), passive),\n    );\n  }\n\n  /**\n   * Removes all the handlers installed on this container.\n   */\n  cleanUp() {\n    for (let i = 0; i < this.handlerInfos.length; i++) {\n      eventLib.removeEventListener(this.element, this.handlerInfos[i]);\n    }\n\n    this.handlerInfos = [];\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport const Char = {\n  /**\n   * The separator between the namespace and the action name in the\n   * jsaction attribute value.\n   */\n  NAMESPACE_ACTION_SEPARATOR: '.' as const,\n\n  /**\n   * The separator between the event name and action in the jsaction\n   * attribute value.\n   */\n  EVENT_ACTION_SEPARATOR: ':' as const,\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Records information about the action that should handle a given `Event`.\n */\nexport interface ActionInfo {\n  name: string;\n  element: Element;\n}\n\ntype ActionInfoInternal = [name: string, element: Element];\n\n/**\n * Records information for later handling of events. This type is\n * shared, and instances of it are passed, between the eventcontract\n * and the dispatcher jsbinary. Therefore, the fields of this type are\n * referenced by string literals rather than property literals\n * throughout the code.\n *\n * 'targetElement' is the element the action occurred on, 'actionElement'\n * is the element that has the jsaction handler.\n *\n * A null 'actionElement' identifies an EventInfo instance that didn't match a\n * jsaction attribute.  This allows us to execute global event handlers with the\n * appropriate event type (including a11y clicks and custom events).\n * The declare portion of this interface creates a set of externs that make sure\n * renaming doesn't happen for EventInfo. This is important since EventInfo\n * is shared across multiple binaries.\n */\nexport declare interface EventInfo {\n  eventType: string;\n  event: Event;\n  targetElement: Element;\n  /** The element that is the container for this Event. */\n  eic: Element;\n  timeStamp: number;\n  /**\n   * The action parsed from the JSAction element.\n   */\n  eia?: ActionInfoInternal;\n  /**\n   * Whether this `Event` is a replay event, meaning no dispatcher was\n   * installed when this `Event` was originally dispatched.\n   */\n  eirp?: boolean;\n  /**\n   * Whether this `Event` represents a `keydown` event that should be processed\n   * as a `click`. Only used when a11y click events is on.\n   */\n  eiack?: boolean;\n  /** Whether action resolution has already run on this `EventInfo`. */\n  eir?: boolean;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getEventType(eventInfo: EventInfo) {\n  return eventInfo.eventType;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setEventType(eventInfo: EventInfo, eventType: string) {\n  eventInfo.eventType = eventType;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getEvent(eventInfo: EventInfo) {\n  return eventInfo.event;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setEvent(eventInfo: EventInfo, event: Event) {\n  eventInfo.event = event;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getTargetElement(eventInfo: EventInfo) {\n  return eventInfo.targetElement;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setTargetElement(eventInfo: EventInfo, targetElement: Element) {\n  eventInfo.targetElement = targetElement;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getContainer(eventInfo: EventInfo) {\n  return eventInfo.eic;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setContainer(eventInfo: EventInfo, container: Element) {\n  eventInfo.eic = container;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getTimestamp(eventInfo: EventInfo) {\n  return eventInfo.timeStamp;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setTimestamp(eventInfo: EventInfo, timestamp: number) {\n  eventInfo.timeStamp = timestamp;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getAction(eventInfo: EventInfo) {\n  return eventInfo.eia;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setAction(eventInfo: EventInfo, actionName: string, actionElement: Element) {\n  eventInfo.eia = [actionName, actionElement];\n}\n\n/** Added for readability when accessing stable property names. */\nexport function unsetAction(eventInfo: EventInfo) {\n  eventInfo.eia = undefined;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getActionName(actionInfo: ActionInfoInternal) {\n  return actionInfo[0];\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getActionElement(actionInfo: ActionInfoInternal) {\n  return actionInfo[1];\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getIsReplay(eventInfo: EventInfo) {\n  return eventInfo.eirp;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setIsReplay(eventInfo: EventInfo, replay: boolean) {\n  eventInfo.eirp = replay;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getA11yClickKey(eventInfo: EventInfo) {\n  return eventInfo.eiack;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setA11yClickKey(eventInfo: EventInfo, a11yClickKey: boolean) {\n  eventInfo.eiack = a11yClickKey;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function getResolved(eventInfo: EventInfo) {\n  return eventInfo.eir;\n}\n\n/** Added for readability when accessing stable property names. */\nexport function setResolved(eventInfo: EventInfo, resolved: boolean) {\n  eventInfo.eir = resolved;\n}\n\n/** Clones an `EventInfo` */\nexport function cloneEventInfo(eventInfo: EventInfo): EventInfo {\n  return {\n    eventType: eventInfo.eventType,\n    event: eventInfo.event,\n    targetElement: eventInfo.targetElement,\n    eic: eventInfo.eic,\n    eia: eventInfo.eia,\n    timeStamp: eventInfo.timeStamp,\n    eirp: eventInfo.eirp,\n    eiack: eventInfo.eiack,\n    eir: eventInfo.eir,\n  };\n}\n\n/**\n * Utility function for creating an `EventInfo`.\n *\n * This can be used from code-size sensitive compilation units, as taking\n * parameters vs. an `Object` literal reduces code size.\n */\nexport function createEventInfoFromParameters(\n  eventType: string,\n  event: Event,\n  targetElement: Element,\n  container: Element,\n  timestamp: number,\n  action?: ActionInfoInternal,\n  isReplay?: boolean,\n  a11yClickKey?: boolean,\n): EventInfo {\n  return {\n    eventType,\n    event,\n    targetElement,\n    eic: container,\n    timeStamp: timestamp,\n    eia: action,\n    eirp: isReplay,\n    eiack: a11yClickKey,\n  };\n}\n\n/**\n * Utility function for creating an `EventInfo`.\n *\n * This should be used in compilation units that are less sensitive to code\n * size.\n */\nexport function createEventInfo({\n  eventType,\n  event,\n  targetElement,\n  container,\n  timestamp,\n  action,\n  isReplay,\n  a11yClickKey,\n}: {\n  eventType: string;\n  event: Event;\n  targetElement: Element;\n  container: Element;\n  timestamp: number;\n  action?: ActionInfo;\n  isReplay?: boolean;\n  a11yClickKey?: boolean;\n}): EventInfo {\n  return {\n    eventType,\n    event,\n    targetElement,\n    eic: container,\n    timeStamp: timestamp,\n    eia: action ? [action.name, action.element] : undefined,\n    eirp: isReplay,\n    eiack: a11yClickKey,\n  };\n}\n\n/**\n * Utility class around an `EventInfo`.\n *\n * This should be used in compilation units that are less sensitive to code\n * size.\n */\nexport class EventInfoWrapper {\n  constructor(readonly eventInfo: EventInfo) {}\n\n  getEventType() {\n    return getEventType(this.eventInfo);\n  }\n\n  setEventType(eventType: string) {\n    setEventType(this.eventInfo, eventType);\n  }\n\n  getEvent() {\n    return getEvent(this.eventInfo);\n  }\n\n  setEvent(event: Event) {\n    setEvent(this.eventInfo, event);\n  }\n\n  getTargetElement() {\n    return getTargetElement(this.eventInfo);\n  }\n\n  setTargetElement(targetElement: Element) {\n    setTargetElement(this.eventInfo, targetElement);\n  }\n\n  getContainer() {\n    return getContainer(this.eventInfo);\n  }\n\n  setContainer(container: Element) {\n    setContainer(this.eventInfo, container);\n  }\n  getTimestamp() {\n    return getTimestamp(this.eventInfo);\n  }\n\n  setTimestamp(timestamp: number) {\n    setTimestamp(this.eventInfo, timestamp);\n  }\n\n  getAction() {\n    const action = getAction(this.eventInfo);\n    if (!action) return undefined;\n    return {\n      name: action[0],\n      element: action[1],\n    };\n  }\n\n  setAction(action: ActionInfo | undefined) {\n    if (!action) {\n      unsetAction(this.eventInfo);\n      return;\n    }\n    setAction(this.eventInfo, action.name, action.element);\n  }\n\n  getIsReplay() {\n    return getIsReplay(this.eventInfo);\n  }\n\n  setIsReplay(replay: boolean) {\n    setIsReplay(this.eventInfo, replay);\n  }\n\n  getResolved() {\n    return getResolved(this.eventInfo);\n  }\n\n  setResolved(resolved: boolean) {\n    setResolved(this.eventInfo, resolved);\n  }\n\n  clone() {\n    return new EventInfoWrapper(cloneEventInfo(this.eventInfo));\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Attribute} from './attribute';\nimport {Char} from './char';\nimport {EventType} from './event_type';\nimport {Property} from './property';\nimport * as a11yClick from './a11y_click';\nimport * as cache from './cache';\nimport * as eventInfoLib from './event_info';\nimport * as eventLib from './event';\n\n/**\n * Since maps from event to action are immutable we can use a single map\n * to represent the empty map.\n */\nconst EMPTY_ACTION_MAP: {[key: string]: string} = {};\n\n/**\n * This regular expression matches a semicolon.\n */\nconst REGEXP_SEMICOLON = /\\s*;\\s*/;\n\n/** If no event type is defined, defaults to `click`. */\nconst DEFAULT_EVENT_TYPE: string = EventType.CLICK;\n\n/** Resolves actions for Events. */\nexport class ActionResolver {\n  private a11yClickSupport: boolean = false;\n  private clickModSupport: boolean = true;\n  private readonly syntheticMouseEventSupport: boolean;\n\n  private updateEventInfoForA11yClick?: (eventInfo: eventInfoLib.EventInfo) => void = undefined;\n\n  private preventDefaultForA11yClick?: (eventInfo: eventInfoLib.EventInfo) => void = undefined;\n\n  private populateClickOnlyAction?: (\n    actionElement: Element,\n    eventInfo: eventInfoLib.EventInfo,\n    actionMap: {[key: string]: string | undefined},\n  ) => void = undefined;\n\n  constructor({\n    syntheticMouseEventSupport = false,\n    clickModSupport = true,\n  }: {\n    syntheticMouseEventSupport?: boolean;\n    clickModSupport?: boolean;\n  } = {}) {\n    this.syntheticMouseEventSupport = syntheticMouseEventSupport;\n    this.clickModSupport = clickModSupport;\n  }\n\n  resolveEventType(eventInfo: eventInfoLib.EventInfo) {\n    // We distinguish modified and plain clicks in order to support the\n    // default browser behavior of modified clicks on links; usually to\n    // open the URL of the link in new tab or new window on ctrl/cmd\n    // click. A DOM 'click' event is mapped to the jsaction 'click'\n    // event iff there is no modifier present on the event. If there is\n    // a modifier, it's mapped to 'clickmod' instead.\n    //\n    // It's allowed to omit the event in the jsaction attribute. In that\n    // case, 'click' is assumed. Thus the following two are equivalent:\n    //\n    //   <a href=\"someurl\" jsaction=\"gna.fu\">\n    //   <a href=\"someurl\" jsaction=\"click:gna.fu\">\n    //\n    // For unmodified clicks, EventContract invokes the jsaction\n    // 'gna.fu'. For modified clicks, EventContract won't find a\n    // suitable action and leave the event to be handled by the\n    // browser.\n    //\n    // In order to also invoke a jsaction handler for a modifier click,\n    // 'clickmod' needs to be used:\n    //\n    //   <a href=\"someurl\" jsaction=\"clickmod:gna.fu\">\n    //\n    // EventContract invokes the jsaction 'gna.fu' for modified\n    // clicks. Unmodified clicks are left to the browser.\n    //\n    // In order to set up the event contract to handle both clickonly and\n    // clickmod, only addEvent(EventType.CLICK) is necessary.\n    //\n    // In order to set up the event contract to handle click,\n    // addEvent() is necessary for CLICK, KEYDOWN, and KEYPRESS event types.  If\n    // a11y click support is enabled, addEvent() will set up the appropriate key\n    // event handler automatically.\n    if (\n      this.clickModSupport &&\n      eventInfoLib.getEventType(eventInfo) === EventType.CLICK &&\n      eventLib.isModifiedClickEvent(eventInfoLib.getEvent(eventInfo))\n    ) {\n      eventInfoLib.setEventType(eventInfo, EventType.CLICKMOD);\n    } else if (this.a11yClickSupport) {\n      this.updateEventInfoForA11yClick!(eventInfo);\n    }\n  }\n\n  resolveAction(eventInfo: eventInfoLib.EventInfo) {\n    if (eventInfoLib.getResolved(eventInfo)) {\n      return;\n    }\n    this.populateAction(eventInfo, eventInfoLib.getTargetElement(eventInfo));\n    eventInfoLib.setResolved(eventInfo, true);\n  }\n\n  resolveParentAction(eventInfo: eventInfoLib.EventInfo) {\n    const action = eventInfoLib.getAction(eventInfo);\n    const actionElement = action && eventInfoLib.getActionElement(action);\n    eventInfoLib.unsetAction(eventInfo);\n    const parentNode = actionElement && this.getParentNode(actionElement);\n    if (!parentNode) {\n      return;\n    }\n    this.populateAction(eventInfo, parentNode);\n  }\n\n  /**\n   * Searches for a jsaction that the DOM event maps to and creates an\n   * object containing event information used for dispatching by\n   * jsaction.Dispatcher. This method populates the `action` and `actionElement`\n   * fields of the EventInfo object passed in by finding the first\n   * jsaction attribute above the target Node of the event, and below\n   * the container Node, that specifies a jsaction for the event\n   * type. If no such jsaction is found, then action is undefined.\n   *\n   * @param eventInfo `EventInfo` to set `action` and `actionElement` if an\n   *    action is found on any `Element` in the path of the `Event`.\n   */\n  private populateAction(eventInfo: eventInfoLib.EventInfo, currentTarget: Element) {\n    let actionElement: Element | null = currentTarget;\n    while (actionElement && actionElement !== eventInfoLib.getContainer(eventInfo)) {\n      if (actionElement.nodeType === Node.ELEMENT_NODE) {\n        this.populateActionOnElement(actionElement, eventInfo);\n      }\n\n      if (eventInfoLib.getAction(eventInfo)) {\n        // An event is handled by at most one jsaction. Thus we stop at the\n        // first matching jsaction specified in a jsaction attribute up the\n        // ancestor chain of the event target node.\n        break;\n      }\n      actionElement = this.getParentNode(actionElement);\n    }\n\n    const action = eventInfoLib.getAction(eventInfo);\n    if (!action) {\n      // No action found.\n      return;\n    }\n\n    if (this.a11yClickSupport) {\n      this.preventDefaultForA11yClick!(eventInfo);\n    }\n\n    // We attempt to handle the mouseenter/mouseleave events here by\n    // detecting whether the mouseover/mouseout events correspond to\n    // entering/leaving an element.\n    if (this.syntheticMouseEventSupport) {\n      if (\n        eventInfoLib.getEventType(eventInfo) === EventType.MOUSEENTER ||\n        eventInfoLib.getEventType(eventInfo) === EventType.MOUSELEAVE ||\n        eventInfoLib.getEventType(eventInfo) === EventType.POINTERENTER ||\n        eventInfoLib.getEventType(eventInfo) === EventType.POINTERLEAVE\n      ) {\n        // We attempt to handle the mouseenter/mouseleave events here by\n        // detecting whether the mouseover/mouseout events correspond to\n        // entering/leaving an element.\n        if (\n          eventLib.isMouseSpecialEvent(\n            eventInfoLib.getEvent(eventInfo),\n            eventInfoLib.getEventType(eventInfo),\n            eventInfoLib.getActionElement(action),\n          )\n        ) {\n          // If both mouseover/mouseout and mouseenter/mouseleave events are\n          // enabled, two separate handlers for mouseover/mouseout are\n          // registered. Both handlers will see the same event instance\n          // so we create a copy to avoid interfering with the dispatching of\n          // the mouseover/mouseout event.\n          const copiedEvent = eventLib.createMouseSpecialEvent(\n            eventInfoLib.getEvent(eventInfo),\n            eventInfoLib.getActionElement(action),\n          );\n          eventInfoLib.setEvent(eventInfo, copiedEvent);\n          // Since the mouseenter/mouseleave events do not bubble, the target\n          // of the event is technically the `actionElement` (the node with the\n          // `jsaction` attribute)\n          eventInfoLib.setTargetElement(eventInfo, eventInfoLib.getActionElement(action));\n        } else {\n          eventInfoLib.unsetAction(eventInfo);\n        }\n      }\n    }\n  }\n\n  /**\n   * Walk to the parent node, unless the node has a different owner in\n   * which case we walk to the owner. Attempt to walk to host of a\n   * shadow root if needed.\n   */\n  private getParentNode(element: Element): Element | null {\n    const owner = element[Property.OWNER];\n    if (owner) {\n      return owner as Element;\n    }\n    const parentNode = element.parentNode;\n    if (parentNode?.nodeName === '#document-fragment') {\n      return (parentNode as ShadowRoot | null)?.host ?? null;\n    }\n    return parentNode as Element | null;\n  }\n\n  /**\n   * Accesses the jsaction map on a node and retrieves the name of the\n   * action the given event is mapped to, if any. It parses the\n   * attribute value and stores it in a property on the node for\n   * subsequent retrieval without re-parsing and re-accessing the\n   * attribute.\n   *\n   * @param actionElement The DOM node to retrieve the jsaction map from.\n   * @param eventInfo `EventInfo` to set `action` and `actionElement` if an\n   *    action is found on the `actionElement`.\n   */\n  private populateActionOnElement(actionElement: Element, eventInfo: eventInfoLib.EventInfo) {\n    const actionMap = this.parseActions(actionElement);\n\n    const actionName = actionMap[eventInfoLib.getEventType(eventInfo)];\n    if (actionName !== undefined) {\n      eventInfoLib.setAction(eventInfo, actionName, actionElement);\n    }\n\n    if (this.a11yClickSupport) {\n      this.populateClickOnlyAction!(actionElement, eventInfo, actionMap);\n    }\n  }\n\n  /**\n   * Parses and caches an element's jsaction element into a map.\n   *\n   * This is primarily for internal use.\n   *\n   * @param actionElement The DOM node to retrieve the jsaction map from.\n   * @return Map from event to qualified name of the jsaction bound to it.\n   */\n  private parseActions(actionElement: Element): {[key: string]: string | undefined} {\n    let actionMap: {[key: string]: string | undefined} | undefined = cache.get(actionElement);\n    if (!actionMap) {\n      const jsactionAttribute = actionElement.getAttribute(Attribute.JSACTION);\n      if (!jsactionAttribute) {\n        actionMap = EMPTY_ACTION_MAP;\n        cache.set(actionElement, actionMap);\n      } else {\n        actionMap = cache.getParsed(jsactionAttribute);\n        if (!actionMap) {\n          actionMap = {};\n          const values = jsactionAttribute.split(REGEXP_SEMICOLON);\n          for (let idx = 0; idx < values.length; idx++) {\n            const value = values[idx];\n            if (!value) {\n              continue;\n            }\n            const colon = value.indexOf(Char.EVENT_ACTION_SEPARATOR);\n            const hasColon = colon !== -1;\n            const type = hasColon ? value.substr(0, colon).trim() : DEFAULT_EVENT_TYPE;\n            const action = hasColon ? value.substr(colon + 1).trim() : value;\n            actionMap[type] = action;\n          }\n          cache.setParsed(jsactionAttribute, actionMap);\n        }\n        cache.set(actionElement, actionMap);\n      }\n    }\n    return actionMap;\n  }\n\n  addA11yClickSupport(\n    updateEventInfoForA11yClick: typeof a11yClick.updateEventInfoForA11yClick,\n    preventDefaultForA11yClick: typeof a11yClick.preventDefaultForA11yClick,\n    populateClickOnlyAction: typeof a11yClick.populateClickOnlyAction,\n  ) {\n    this.a11yClickSupport = true;\n    this.updateEventInfoForA11yClick = updateEventInfoForA11yClick;\n    this.preventDefaultForA11yClick = preventDefaultForA11yClick;\n    this.populateClickOnlyAction = populateClickOnlyAction;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @fileoverview An enum to control who can call certain jsaction APIs.\n */\n\nexport enum Restriction {\n  I_AM_THE_JSACTION_FRAMEWORK,\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EventInfo, EventInfoWrapper} from './event_info';\nimport {EventType} from './event_type';\nimport {Restriction} from './restriction';\nimport {UnrenamedEventContract} from './eventcontract';\nimport * as eventLib from './event';\nimport {ActionResolver} from './action_resolver';\n\n/**\n * A replayer is a function that is called when there are queued events,\n * either from the `EventContract` or when there are no detected handlers.\n */\nexport type Replayer = (eventInfoWrappers: EventInfoWrapper[]) => void;\n\n/**\n * Receives a DOM event, determines the jsaction associated with the source\n * element of the DOM event, and invokes the handler associated with the\n * jsaction.\n */\nexport class Dispatcher {\n  // The ActionResolver to use to resolve actions.\n  private actionResolver?: ActionResolver;\n\n  /** The replayer function to be called when there are queued events. */\n  private eventReplayer?: Replayer;\n\n  /** Whether the event replay is scheduled. */\n  private eventReplayScheduled = false;\n\n  /** The queue of events. */\n  private readonly replayEventInfoWrappers: EventInfoWrapper[] = [];\n\n  /**\n "  * Options are:\n   *   - `eventReplayer`: When the event contract dispatches replay events\n   *      to the Dispatcher, the Dispatcher collects them and in the next tick\n   *      dispatches them to the `eventReplayer`. Defaults to dispatching to `dispatchDelegate`.\n   * @param dispatchDelegate A function that should handle dispatching an `EventInfoWrapper` to handlers.\n   */\n  constructor(\n    private readonly dispatchDelegate: (eventInfoWrapper: EventInfoWrapper) => void,\n    {\n      actionResolver,\n      eventReplayer,\n    }: {actionResolver?: ActionResolver; eventReplayer?: Replayer} = {},\n  ) {\n    this.actionResolver = actionResolver;\n    this.eventReplayer = eventReplayer;\n  }\n\n  /**\n   * Receives an event or the event queue from the EventContract. The event\n   * queue is copied and it attempts to replay.\n   * If event info is passed in it looks for an action handler that can handle\n   * the given event.  If there is no handler registered queues the event and\n   * checks if a loader is registered for the given namespace. If so, calls it.\n   *\n   * Alternatively, if in global dispatch mode, calls all registered global\n   * handlers for the appropriate event type.\n   *\n   * The three functionalities of this call are deliberately not split into\n   * three methods (and then declared as an abstract interface), because the\n   * interface is used by EventContract, which lives in a different jsbinary.\n   * Therefore the interface between the three is defined entirely in terms that\n   * are invariant under jscompiler processing (Function and Array, as opposed\n   * to a custom type with method names).\n   *\n   * @param eventInfo The info for the event that triggered this call or the\n   *     queue of events from EventContract.\n   */\n  dispatch(eventInfo: EventInfo): void {\n    const eventInfoWrapper = new EventInfoWrapper(eventInfo);\n    this.actionResolver?.resolveEventType(eventInfo);\n    this.actionResolver?.resolveAction(eventInfo);\n    const action = eventInfoWrapper.getAction();\n    if (action && shouldPreventDefaultBeforeDispatching(action.element, eventInfoWrapper)) {\n      eventLib.preventDefault(eventInfoWrapper.getEvent());\n    }\n    if (this.eventReplayer && eventInfoWrapper.getIsReplay()) {\n      this.scheduleEventInfoWrapperReplay(eventInfoWrapper);\n      return;\n    }\n    this.dispatchDelegate(eventInfoWrapper);\n  }\n\n  /**\n   * Schedules an `EventInfoWrapper` for replay. The replaying will happen in its own\n   * stack once the current flow cedes control. This is done to mimic\n   * browser event handling.\n   */\n  private scheduleEventInfoWrapperReplay(eventInfoWrapper: EventInfoWrapper) {\n    this.replayEventInfoWrappers.push(eventInfoWrapper);\n    if (this.eventReplayScheduled) {\n      return;\n    }\n    this.eventReplayScheduled = true;\n    Promise.resolve().then(() => {\n      this.eventReplayScheduled = false;\n      this.eventReplayer!(this.replayEventInfoWrappers);\n    });\n  }\n}\n\n/**\n * Creates an `EventReplayer` that calls the `replay` function for every `eventInfoWrapper` in\n * the queue.\n */\nexport function createEventReplayer(replay: (eventInfoWrapper: EventInfoWrapper) => void) {\n  return (eventInfoWrappers: EventInfoWrapper[]) => {\n    for (const eventInfoWrapper of eventInfoWrappers) {\n      replay(eventInfoWrapper);\n    }\n  };\n}\n\n/**\n * Returns true if the default action of this event should be prevented before\n * this event is dispatched.\n */\nfunction shouldPreventDefaultBeforeDispatching(\n  actionElement: Element,\n  eventInfoWrapper: EventInfoWrapper,\n): boolean {\n  // Prevent browser from following <a> node links if a jsaction is present\n  // and we are dispatching the action now. Note that the targetElement may be\n  // a child of an anchor that has a jsaction attached. For that reason, we\n  // need to check the actionElement rather than the targetElement.\n  return (\n    actionElement.tagName === 'A' &&\n    (eventInfoWrapper.getEventType() === EventType.CLICK ||\n      eventInfoWrapper.getEventType() === EventType.CLICKMOD)\n  );\n}\n\n/**\n * Registers deferred functionality for an EventContract and a Jsaction\n * Dispatcher.\n */\nexport function registerDispatcher(eventContract: UnrenamedEventContract, dispatcher: Dispatcher) {\n  eventContract.ecrd((eventInfo: EventInfo) => {\n    dispatcher.dispatch(eventInfo);\n  }, Restriction.I_AM_THE_JSACTION_FRAMEWORK);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ActionResolver} from './action_resolver';\nimport {Dispatcher} from './dispatcher';\nimport {EventInfo, EventInfoWrapper} from './event_info';\nimport {isCaptureEventType} from './event_type';\nimport {UnrenamedEventContract} from './eventcontract';\nimport {Restriction} from './restriction';\n\n// Necessary to make the `ngDevMode` global types available.\nimport '../../../src/util/ng_dev_mode';\n\n/**\n * A replayer is a function that is called when there are queued events, from the `EventContract`.\n */\nexport type Replayer = (eventInfoWrappers: Event[]) => void;\n\n/** An internal symbol used to indicate whether propagation should be stopped or not. */\nexport const PROPAGATION_STOPPED_SYMBOL: unique symbol =\n  /* @__PURE__ */ Symbol.for('propagationStopped');\n\n/** Extra event phases beyond what the browser provides. */\nexport const EventPhase = {\n  REPLAY: 101,\n};\n\nconst PREVENT_DEFAULT_ERROR_MESSAGE_DETAILS =\n  ' Because event replay occurs after browser dispatch, `preventDefault` would have no ' +\n  'effect. You can check whether an event is being replayed by accessing the event phase: ' +\n  '`event.eventPhase === EventPhase.REPLAY`.';\nconst PREVENT_DEFAULT_ERROR_MESSAGE = `\\`preventDefault\\` called during event replay.`;\nconst COMPOSED_PATH_ERROR_MESSAGE_DETAILS =\n  ' Because event replay occurs after browser ' +\n  'dispatch, `composedPath()` will be empty. Iterate parent nodes from `event.target` or ' +\n  '`event.currentTarget` if you need to check elements in the event path.';\nconst COMPOSED_PATH_ERROR_MESSAGE = `\\`composedPath\\` called during event replay.`;\n\ndeclare global {\n  interface Event {\n    [PROPAGATION_STOPPED_SYMBOL]?: boolean;\n  }\n}\n\n/**\n * A dispatcher that uses browser-based `Event` semantics, for example bubbling, `stopPropagation`,\n * `currentTarget`, etc.\n */\nexport class EventDispatcher {\n  private readonly actionResolver: ActionResolver;\n\n  private readonly dispatcher: Dispatcher;\n\n  constructor(\n    private readonly dispatchDelegate: (event: Event, actionName: string) => void,\n    private readonly clickModSupport = true,\n  ) {\n    this.actionResolver = new ActionResolver({clickModSupport});\n    this.dispatcher = new Dispatcher(\n      (eventInfoWrapper: EventInfoWrapper) => {\n        this.dispatchToDelegate(eventInfoWrapper);\n      },\n      {\n        actionResolver: this.actionResolver,\n      },\n    );\n  }\n\n  /**\n   * The entrypoint for the `EventContract` dispatch.\n   */\n  dispatch(eventInfo: EventInfo): void {\n    this.dispatcher.dispatch(eventInfo);\n  }\n\n  /** Internal method that does basic disaptching. */\n  private dispatchToDelegate(eventInfoWrapper: EventInfoWrapper) {\n    if (eventInfoWrapper.getIsReplay()) {\n      prepareEventForReplay(eventInfoWrapper);\n    }\n    prepareEventForBubbling(eventInfoWrapper);\n    while (eventInfoWrapper.getAction()) {\n      prepareEventForDispatch(eventInfoWrapper);\n      // If this is a capture event, ONLY dispatch if the action element is the target.\n      if (\n        isCaptureEventType(eventInfoWrapper.getEventType()) &&\n        eventInfoWrapper.getAction()!.element !== eventInfoWrapper.getTargetElement()\n      ) {\n        return;\n      }\n      this.dispatchDelegate(eventInfoWrapper.getEvent(), eventInfoWrapper.getAction()!.name);\n      if (propagationStopped(eventInfoWrapper)) {\n        return;\n      }\n      this.actionResolver.resolveParentAction(eventInfoWrapper.eventInfo);\n    }\n  }\n}\n\nfunction prepareEventForBubbling(eventInfoWrapper: EventInfoWrapper) {\n  const event = eventInfoWrapper.getEvent();\n  const originalStopPropagation = eventInfoWrapper.getEvent().stopPropagation.bind(event);\n  const stopPropagation = () => {\n    event[PROPAGATION_STOPPED_SYMBOL] = true;\n    originalStopPropagation();\n  };\n  patchEventInstance(event, 'stopPropagation', stopPropagation);\n  patchEventInstance(event, 'stopImmediatePropagation', stopPropagation);\n}\n\nfunction propagationStopped(eventInfoWrapper: EventInfoWrapper) {\n  const event = eventInfoWrapper.getEvent();\n  return !!event[PROPAGATION_STOPPED_SYMBOL];\n}\n\nfunction prepareEventForReplay(eventInfoWrapper: EventInfoWrapper) {\n  const event = eventInfoWrapper.getEvent();\n  const target = eventInfoWrapper.getTargetElement();\n  const originalPreventDefault = event.preventDefault.bind(event);\n  patchEventInstance(event, 'target', target);\n  patchEventInstance(event, 'eventPhase', EventPhase.REPLAY);\n  patchEventInstance(event, 'preventDefault', () => {\n    originalPreventDefault();\n    throw new Error(\n      PREVENT_DEFAULT_ERROR_MESSAGE + (ngDevMode ? PREVENT_DEFAULT_ERROR_MESSAGE_DETAILS : ''),\n    );\n  });\n  patchEventInstance(event, 'composedPath', () => {\n    throw new Error(\n      COMPOSED_PATH_ERROR_MESSAGE + (ngDevMode ? COMPOSED_PATH_ERROR_MESSAGE_DETAILS : ''),\n    );\n  });\n}\n\nfunction prepareEventForDispatch(eventInfoWrapper: EventInfoWrapper) {\n  const event = eventInfoWrapper.getEvent();\n  const currentTarget = eventInfoWrapper.getAction()?.element;\n  if (currentTarget) {\n    patchEventInstance(event, 'currentTarget', currentTarget, {\n      // `currentTarget` is going to get reassigned every dispatch.\n      configurable: true,\n    });\n  }\n}\n\n/**\n * Patch `Event` instance during non-standard `Event` dispatch. This patches just the `Event`\n * instance that the browser created, it does not patch global properties or methods.\n *\n * This is necessary because dispatching an `Event` outside of browser dispatch results in\n * incorrect properties and methods that need to be polyfilled or do not work.\n *\n * JSAction dispatch adds two extra \"phases\" to event dispatch:\n * 1. Event delegation - the event is being dispatched by a delegating event handler on a container\n *    (typically `window.document.documentElement`), to a delegated event handler on some child\n *    element. Certain `Event` properties will be unintuitive, such as `currentTarget`, which would\n *    be the container rather than the child element. Bubbling would also not work. In order to\n *    emulate the browser, these properties and methods on the `Event` are patched.\n * 2. Event replay - the event is being dispatched by the framework once the handlers have been\n *    loaded (during hydration, or late-loaded). Certain `Event` properties can be unset by the\n *    browser because the `Event` is no longer actively being dispatched, such as `target`. Other\n *    methods have no effect because the `Event` has already been dispatched, such as\n *    `preventDefault`. Bubbling would also not work. These properties and methods are patched,\n *    either to fill in information that the browser may have removed, or to throw errors in methods\n *    that no longer behave as expected.\n */\nfunction patchEventInstance<T>(\n  event: Event,\n  property: string,\n  value: T,\n  {configurable = false}: {configurable?: boolean} = {},\n) {\n  Object.defineProperty(event, property, {value, configurable});\n}\n\n/**\n * Registers deferred functionality for an EventContract and a Jsaction\n * Dispatcher.\n */\nexport function registerDispatcher(\n  eventContract: UnrenamedEventContract,\n  dispatcher: EventDispatcher,\n) {\n  eventContract.ecrd((eventInfo: EventInfo) => {\n    dispatcher.dispatch(eventInfo);\n  }, Restriction.I_AM_THE_JSACTION_FRAMEWORK);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {createEventInfoFromParameters, EventInfo} from './event_info';\n\nexport declare interface EarlyJsactionDataContainer {\n  _ejsa?: EarlyJsactionData;\n  _ejsas?: {[appId: string]: EarlyJsactionData | undefined};\n}\n\ndeclare global {\n  interface Window {\n    _ejsa?: EarlyJsactionData;\n    _ejsas?: {[appId: string]: EarlyJsactionData | undefined};\n  }\n}\n\n/**\n * Defines the early jsaction data types.\n */\nexport declare interface EarlyJsactionData {\n  /** List used to keep track of the early JSAction event types. */\n  et: string[];\n\n  /** List used to keep track of the early JSAction capture event types. */\n  etc: string[];\n\n  /** Early JSAction handler for all events. */\n  h: (event: Event) => void;\n\n  /** Dispatcher handler. Initializes to populating `q`. */\n  d: (eventInfo: EventInfo) => void;\n\n  /** List used to push `EventInfo` objects if the dispatcher is not registered. */\n  q: EventInfo[];\n\n  /** Container for listening to events. */\n  c: HTMLElement;\n}\n\n/**\n * EarlyEventContract intercepts events in the bubbling phase at the\n * boundary of the document body. This mapping will be passed to the\n * late-loaded EventContract.\n */\nexport class EarlyEventContract {\n  constructor(\n    private readonly dataContainer: EarlyJsactionDataContainer = window,\n    container = window.document.documentElement,\n  ) {\n    dataContainer._ejsa = createEarlyJsactionData(container);\n  }\n\n  /**\n   * Installs a list of event types for container .\n   */\n  addEvents(types: string[], capture?: boolean) {\n    addEvents(this.dataContainer._ejsa!, types, capture);\n  }\n}\n\n/** Creates an `EarlyJsactionData` object. */\nexport function createEarlyJsactionData(container: HTMLElement) {\n  const q: EventInfo[] = [];\n  const d = (eventInfo: EventInfo) => {\n    q.push(eventInfo);\n  };\n  const h = (event: Event) => {\n    d(\n      createEventInfoFromParameters(\n        event.type,\n        event,\n        event.target as Element,\n        container,\n        Date.now(),\n      ),\n    );\n  };\n  return {\n    c: container,\n    q,\n    et: [],\n    etc: [],\n    d,\n    h,\n  };\n}\n\n/** Add all the events to the container stored in the `EarlyJsactionData`. */\nexport function addEvents(\n  earlyJsactionData: EarlyJsactionData,\n  types: string[],\n  capture?: boolean,\n) {\n  for (let i = 0; i < types.length; i++) {\n    const eventType = types[i];\n    const eventTypes = capture ? earlyJsactionData.etc : earlyJsactionData.et;\n    eventTypes.push(eventType);\n    earlyJsactionData.c.addEventListener(eventType, earlyJsactionData.h, capture);\n  }\n}\n\n/** Get the queued `EventInfo` objects that were dispatched before a dispatcher was registered. */\nexport function getQueuedEventInfos(earlyJsactionData: EarlyJsactionData | undefined) {\n  return earlyJsactionData?.q ?? [];\n}\n\n/** Register a different dispatcher function on the `EarlyJsactionData`. */\nexport function registerDispatcher(\n  earlyJsactionData: EarlyJsactionData | undefined,\n  dispatcher: (eventInfo: EventInfo) => void,\n) {\n  if (!earlyJsactionData) {\n    return;\n  }\n  earlyJsactionData.d = dispatcher;\n}\n\n/** Removes all event listener handlers. */\nexport function removeAllEventListeners(earlyJsactionData: EarlyJsactionData | undefined) {\n  if (!earlyJsactionData) {\n    return;\n  }\n  removeEventListeners(earlyJsactionData.c, earlyJsactionData.et, earlyJsactionData.h);\n  removeEventListeners(earlyJsactionData.c, earlyJsactionData.etc, earlyJsactionData.h, true);\n}\n\nfunction removeEventListeners(\n  container: HTMLElement,\n  eventTypes: string[],\n  earlyEventHandler: (e: Event) => void,\n  capture?: boolean,\n) {\n  for (let i = 0; i < eventTypes.length; i++) {\n    container.removeEventListener(eventTypes[i], earlyEventHandler, /* useCapture */ capture);\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @define Support for the non-bubbling mouseenter and mouseleave events.  This\n * flag can be overridden in a build rule.\n */\nexport const MOUSE_SPECIAL_SUPPORT = false;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @fileoverview Implements the local event handling contract. This\n * allows DOM objects in a container that enters into this contract to\n * define event handlers which are executed in a local context.\n *\n * One EventContract instance can manage the contract for multiple\n * containers, which are added using the addContainer() method.\n *\n * Events can be registered using the addEvent() method.\n *\n * A Dispatcher is added using the registerDispatcher() method. Until there is\n * a dispatcher, events are queued. The idea is that the EventContract\n * class is inlined in the HTML of the top level page and instantiated\n * right after the start of <body>. The Dispatcher class is contained\n * in the external deferred js, and instantiated and registered with\n * EventContract when the external javascript in the page loads. The\n * external javascript will also register the jsaction handlers, which\n * then pick up the queued events at the time of registration.\n *\n * Since this class is meant to be inlined in the main page HTML, the\n * size of the binary compiled from this file MUST be kept as small as\n * possible and thus its dependencies to a minimum.\n */\n\nimport {\n  EarlyJsactionData,\n  EarlyJsactionDataContainer,\n  removeAllEventListeners,\n} from './earlyeventcontract';\nimport * as eventLib from './event';\nimport {EventContractContainerManager} from './event_contract_container';\nimport {MOUSE_SPECIAL_SUPPORT} from './event_contract_defines';\nimport * as eventInfoLib from './event_info';\nimport {MOUSE_SPECIAL_EVENT_TYPES} from './event_type';\nimport {Restriction} from './restriction';\n\n/**\n * The API of an EventContract that is safe to call from any compilation unit.\n */\nexport declare interface UnrenamedEventContract {\n  // Alias for Jsction EventContract registerDispatcher.\n  ecrd(dispatcher: Dispatcher, restriction: Restriction): void;\n}\n\n/** A function that is called to handle events captured by the EventContract. */\nexport type Dispatcher = (eventInfo: eventInfoLib.EventInfo, globalDispatch?: boolean) => void;\n\n/**\n * A function that handles an event dispatched from the browser.\n *\n * eventType: May differ from `event.type` if JSAction uses a\n * short-hand name or is patching over an non-bubbling event with a bubbling\n * variant.\n * event: The native browser event.\n * container: The container for this dispatch.\n */\ntype EventHandler = (eventType: string, event: Event, container: Element) => void;\n\n/**\n * EventContract intercepts events in the bubbling phase at the\n * boundary of a container element, and maps them to generic actions\n * which are specified using the custom jsaction attribute in\n * HTML. Behavior of the application is then specified in terms of\n * handler for such actions, cf. jsaction.Dispatcher in dispatcher.js.\n *\n * This has several benefits: (1) No DOM event handlers need to be\n * registered on the specific elements in the UI. (2) The set of\n * events that the application has to handle can be specified in terms\n * of the semantics of the application, rather than in terms of DOM\n * events. (3) Invocation of handlers can be delayed and handlers can\n * be delay loaded in a generic way.\n */\nexport class EventContract implements UnrenamedEventContract {\n  static MOUSE_SPECIAL_SUPPORT = MOUSE_SPECIAL_SUPPORT;\n\n  private containerManager: EventContractContainerManager | null;\n\n  /**\n   * The DOM events which this contract covers. Used to prevent double\n   * registration of event types. The value of the map is the\n   * internally created DOM event handler function that handles the\n   * DOM events. See addEvent().\n   *\n   */\n  private eventHandlers: {[key: string]: EventHandler} = {};\n\n  private browserEventTypeToExtraEventTypes: {[key: string]: string[]} = {};\n\n  /**\n   * The dispatcher function. Events are passed to this function for\n   * handling once it was set using the registerDispatcher() method. This is\n   * done because the function is passed from another jsbinary, so passing the\n   * instance and invoking the method here would require to leave the method\n   * unobfuscated.\n   */\n  private dispatcher: Dispatcher | null = null;\n\n  /**\n   * The list of suspended `EventInfo` that will be dispatched\n   * as soon as the `Dispatcher` is registered.\n   */\n  private queuedEventInfos: eventInfoLib.EventInfo[] | null = [];\n\n  constructor(containerManager: EventContractContainerManager) {\n    this.containerManager = containerManager;\n  }\n\n  private handleEvent(eventType: string, event: Event, container: Element) {\n    const eventInfo = eventInfoLib.createEventInfoFromParameters(\n      /* eventType= */ eventType,\n      /* event= */ event,\n      /* targetElement= */ event.target as Element,\n      /* container= */ container,\n      /* timestamp= */ Date.now(),\n    );\n    this.handleEventInfo(eventInfo);\n  }\n\n  /**\n   * Handle an `EventInfo`.\n   */\n  private handleEventInfo(eventInfo: eventInfoLib.EventInfo) {\n    if (!this.dispatcher) {\n      // All events are queued when the dispatcher isn't yet loaded.\n      eventInfoLib.setIsReplay(eventInfo, true);\n      this.queuedEventInfos?.push(eventInfo);\n      return;\n    }\n    this.dispatcher(eventInfo);\n  }\n\n  /**\n   * Enables jsaction handlers to be called for the event type given by\n   * name.\n   *\n   * If the event is already registered, this does nothing.\n   *\n   * @param prefixedEventType If supplied, this event is used in\n   *     the actual browser event registration instead of the name that is\n   *     exposed to jsaction. Use this if you e.g. want users to be able\n   *     to subscribe to jsaction=\"transitionEnd:foo\" while the underlying\n   *     event is webkitTransitionEnd in one browser and mozTransitionEnd\n   *     in another.\n   *\n   * @param passive A boolean value that, if `true`, indicates that the event\n   *     handler will never call `preventDefault()`.\n   */\n  addEvent(eventType: string, prefixedEventType?: string, passive?: boolean) {\n    if (eventType in this.eventHandlers || !this.containerManager) {\n      return;\n    }\n\n    if (!EventContract.MOUSE_SPECIAL_SUPPORT && MOUSE_SPECIAL_EVENT_TYPES.indexOf(eventType) >= 0) {\n      return;\n    }\n\n    const eventHandler = (eventType: string, event: Event, container: Element) => {\n      this.handleEvent(eventType, event, container);\n    };\n\n    // Store the callback to allow us to replay events.\n    this.eventHandlers[eventType] = eventHandler;\n\n    const browserEventType = eventLib.getBrowserEventType(prefixedEventType || eventType);\n\n    if (browserEventType !== eventType) {\n      const eventTypes = this.browserEventTypeToExtraEventTypes[browserEventType] || [];\n      eventTypes.push(eventType);\n      this.browserEventTypeToExtraEventTypes[browserEventType] = eventTypes;\n    }\n\n    this.containerManager.addEventListener(\n      browserEventType,\n      (element: Element) => {\n        return (event: Event) => {\n          eventHandler(eventType, event, element);\n        };\n      },\n      passive,\n    );\n  }\n\n  /**\n   * Gets the queued early events and replay them using the appropriate handler\n   * in the provided event contract. Once all the events are replayed, it cleans\n   * up the early contract.\n   */\n  replayEarlyEvents(earlyJsactionData: EarlyJsactionData | undefined = window._ejsa) {\n    // Check if the early contract is present and prevent calling this function\n    // more than once.\n    if (!earlyJsactionData) {\n      return;\n    }\n\n    // Replay the early contract events.\n    this.replayEarlyEventInfos(earlyJsactionData.q);\n\n    // Clean up the early contract.\n    removeAllEventListeners(earlyJsactionData);\n    delete window._ejsa;\n  }\n\n  /**\n   * Replays all the early `EventInfo` objects, dispatching them through the normal\n   * `EventContract` flow.\n   */\n  replayEarlyEventInfos(earlyEventInfos: eventInfoLib.EventInfo[]) {\n    for (let i = 0; i < earlyEventInfos.length; i++) {\n      const earlyEventInfo: eventInfoLib.EventInfo = earlyEventInfos[i];\n      const eventTypes = this.getEventTypesForBrowserEventType(earlyEventInfo.eventType);\n      for (let j = 0; j < eventTypes.length; j++) {\n        const eventInfo = eventInfoLib.cloneEventInfo(earlyEventInfo);\n        // EventInfo eventType maps to JSAction's internal event type,\n        // rather than the browser event type.\n        eventInfoLib.setEventType(eventInfo, eventTypes[j]);\n        this.handleEventInfo(eventInfo);\n      }\n    }\n  }\n\n  /**\n   * Returns all JSAction event types that have been registered for a given\n   * browser event type.\n   */\n  private getEventTypesForBrowserEventType(browserEventType: string) {\n    const eventTypes = [];\n    if (this.eventHandlers[browserEventType]) {\n      eventTypes.push(browserEventType);\n    }\n    if (this.browserEventTypeToExtraEventTypes[browserEventType]) {\n      eventTypes.push(...this.browserEventTypeToExtraEventTypes[browserEventType]);\n    }\n    return eventTypes;\n  }\n\n  /**\n   * Returns the event handler function for a given event type.\n   */\n  handler(eventType: string): EventHandler | undefined {\n    return this.eventHandlers[eventType];\n  }\n\n  /**\n   * Cleans up the event contract. This resets all of the `EventContract`'s\n   * internal state. Users are responsible for not using this `EventContract`\n   * after it has been cleaned up.\n   */\n  cleanUp() {\n    this.containerManager?.cleanUp();\n    this.containerManager = null;\n    this.eventHandlers = {};\n    this.browserEventTypeToExtraEventTypes = {};\n    this.dispatcher = null;\n    this.queuedEventInfos = [];\n  }\n\n  /**\n   * Register a dispatcher function. Event info of each event mapped to\n   * a jsaction is passed for handling to this callback. The queued\n   * events are passed as well to the dispatcher for later replaying\n   * once the dispatcher is registered. Clears the event queue to null.\n   *\n   * @param dispatcher The dispatcher function.\n   * @param restriction\n   */\n  registerDispatcher(dispatcher: Dispatcher, restriction: Restriction) {\n    this.ecrd(dispatcher, restriction);\n  }\n\n  /**\n   * Unrenamed alias for registerDispatcher. Necessary for any codebases that\n   * split the `EventContract` and `Dispatcher` code into different compilation\n   * units.\n   */\n  ecrd(dispatcher: Dispatcher, restriction: Restriction) {\n    this.dispatcher = dispatcher;\n\n    if (this.queuedEventInfos?.length) {\n      for (let i = 0; i < this.queuedEventInfos.length; i++) {\n        this.handleEventInfo(this.queuedEventInfos[i]);\n      }\n      this.queuedEventInfos = null;\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Restriction} from './restriction';\nimport {\n  EarlyJsactionDataContainer,\n  addEvents,\n  createEarlyJsactionData,\n  getQueuedEventInfos,\n  registerDispatcher,\n  removeAllEventListeners,\n} from './earlyeventcontract';\nimport {EventInfo} from './event_info';\n\n/**\n * Creates an `EarlyJsactionData`, adds events to it, and populates it on a nested object on\n * the window.\n */\nexport function bootstrapAppScopedEarlyEventContract(\n  container: HTMLElement,\n  appId: string,\n  bubbleEventTypes: string[],\n  captureEventTypes: string[],\n  dataContainer: EarlyJsactionDataContainer = window,\n) {\n  const earlyJsactionData = createEarlyJsactionData(container);\n  if (!dataContainer._ejsas) {\n    dataContainer._ejsas = {};\n  }\n  dataContainer._ejsas[appId] = earlyJsactionData;\n  addEvents(earlyJsactionData, bubbleEventTypes);\n  addEvents(earlyJsactionData, captureEventTypes, /* capture= */ true);\n}\n\n/** Get the queued `EventInfo` objects that were dispatched before a dispatcher was registered. */\nexport function getAppScopedQueuedEventInfos(\n  appId: string,\n  dataContainer: EarlyJsactionDataContainer = window,\n) {\n  return getQueuedEventInfos(dataContainer._ejsas?.[appId]);\n}\n\n/**\n * Registers a dispatcher function on the `EarlyJsactionData` present on the nested object on the\n * window.\n */\nexport function registerAppScopedDispatcher(\n  restriction: Restriction,\n  appId: string,\n  dispatcher: (eventInfo: EventInfo) => void,\n  dataContainer: EarlyJsactionDataContainer = window,\n) {\n  registerDispatcher(dataContainer._ejsas?.[appId], dispatcher);\n}\n\n/** Removes all event listener handlers. */\nexport function removeAllAppScopedEventListeners(\n  appId: string,\n  dataContainer: EarlyJsactionDataContainer = window,\n) {\n  removeAllEventListeners(dataContainer._ejsas?.[appId]);\n}\n\n/** Clear the early event contract. */\nexport function clearAppScopedEarlyEventContract(\n  appId: string,\n  dataContainer: EarlyJsactionDataContainer = window,\n) {\n  if (!dataContainer._ejsas) {\n    return;\n  }\n  dataContainer._ejsas[appId] = undefined;\n}\n"],"names":["eventLib.addEventListener","eventLib.removeEventListener","eventInfoLib.getEventType","eventLib.isModifiedClickEvent","eventInfoLib.getEvent","eventInfoLib.setEventType","eventInfoLib.getResolved","eventInfoLib.getTargetElement","eventInfoLib.setResolved","eventInfoLib.getAction","eventInfoLib.getActionElement","eventInfoLib.unsetAction","eventInfoLib.getContainer","eventLib.isMouseSpecialEvent","eventLib.createMouseSpecialEvent","eventInfoLib.setEvent","eventInfoLib.setTargetElement","eventInfoLib.setAction","cache.get","cache.set","cache.getParsed","cache.setParsed","eventLib.preventDefault","registerDispatcher","eventInfoLib.createEventInfoFromParameters","eventInfoLib.setIsReplay","eventLib.getBrowserEventType","eventInfoLib.cloneEventInfo"],"mappings":"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"}ӰSxi/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { consumerMarkDirty, SIGNAL, consumerDestroy, isInNotificationPhase, consumerPollProducersForChange, consumerBeforeComputation, consumerAfterComputation, REACTIVE_NODE } from '../untracked-BKcld_ew.mjs';
export { SIGNAL_NODE, createComputed, createLinkedSignal, createSignal, defaultEquals, getActiveConsumer, isReactive, linkedSignalSetFn, linkedSignalUpdateFn, producerAccessed, producerIncrementEpoch, producerMarkClean, producerNotifyConsumers, producerUpdateValueVersion, producerUpdatesAllowed, runPostSignalSetFn, setActiveConsumer, setAlternateWeakRefImpl, setPostSignalSetFn, setThrowInvalidWriteToSignalError, signalSetFn, signalUpdateFn, untracked } from '../untracked-BKcld_ew.mjs';

function createWatch(fn, schedule, allowSignalWrites) {
    const node = Object.create(WATCH_NODE);
    if (allowSignalWrites) {
        node.consumerAllowSignalWrites = true;
    }
    node.fn = fn;
    node.schedule = schedule;
    const registerOnCleanup = (cleanupFn) => {
        node.cleanupFn = cleanupFn;
    };
    function isWatchNodeDestroyed(node) {
        return node.fn === null && node.schedule === null;
    }
    function destroyWatchNode(node) {
        if (!isWatchNodeDestroyed(node)) {
            consumerDestroy(node); // disconnect watcher from the reactive graph
            node.cleanupFn();
            // nullify references to the integration functions to mark node as destroyed
            node.fn = null;
            node.schedule = null;
            node.cleanupFn = NOOP_CLEANUP_FN;
        }
    }
    const run = () => {
        if (node.fn === null) {
            // trying to run a destroyed watch is noop
            return;
        }
        if (isInNotificationPhase()) {
            throw new Error(`Schedulers cannot synchronously execute watches while scheduling.`);
        }
        node.dirty = false;
        if (node.hasRun && !consumerPollProducersForChange(node)) {
            return;
        }
        node.hasRun = true;
        const prevConsumer = consumerBeforeComputation(node);
        try {
            node.cleanupFn();
            node.cleanupFn = NOOP_CLEANUP_FN;
            node.fn(registerOnCleanup);
        }
        finally {
            consumerAfterComputation(node, prevConsumer);
        }
    };
    node.ref = {
        notify: () => consumerMarkDirty(node),
        run,
        cleanup: () => node.cleanupFn(),
        destroy: () => destroyWatchNode(node),
        [SIGNAL]: node,
    };
    return node.ref;
}
const NOOP_CLEANUP_FN = () => { };
// Note: Using an IIFE here to ensure that the spread assignment is not considered
// a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
const WATCH_NODE = /* @__PURE__ */ (() => {
    return {
        ...REACTIVE_NODE,
        consumerIsAlwaysLive: true,
        consumerAllowSignalWrites: false,
        consumerMarkedDirty: (node) => {
            if (node.schedule !== null) {
                node.schedule(node.ref);
            }
        },
        hasRun: false,
        cleanupFn: NOOP_CLEANUP_FN,
    };
})();

export { REACTIVE_NODE, SIGNAL, consumerAfterComputation, consumerBeforeComputation, consumerDestroy, consumerMarkDirty, consumerPollProducersForChange, createWatch, isInNotificationPhase };
//# sourceMappingURL=signals.mjs.map
EVx"{"version":3,"file":"signals.mjs","sources":["../../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/watch.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  consumerAfterComputation,\n  consumerBeforeComputation,\n  consumerDestroy,\n  consumerMarkDirty,\n  consumerPollProducersForChange,\n  isInNotificationPhase,\n  REACTIVE_NODE,\n  ReactiveNode,\n  SIGNAL,\n} from './graph';\n\n/**\n * A cleanup function that can be optionally registered from the watch logic. If registered, the\n * cleanup logic runs before the next watch execution.\n */\nexport type WatchCleanupFn = () => void;\n\n/**\n * A callback passed to the watch function that makes it possible to register cleanup logic.\n */\nexport type WatchCleanupRegisterFn = (cleanupFn: WatchCleanupFn) => void;\n\nexport interface Watch {\n  notify(): void;\n\n  /**\n   * Execute the reactive expression in the context of this `Watch` consumer.\n   *\n   * Should be called by the user scheduling algorithm when the provided\n   * `schedule` hook is called by `Watch`.\n   */\n  run(): void;\n\n  cleanup(): void;\n\n  /**\n   * Destroy the watcher:\n   * - disconnect it from the reactive graph;\n   * - mark it as destroyed so subsequent run and notify operations are noop.\n   */\n  destroy(): void;\n\n  [SIGNAL]: WatchNode;\n}\nexport interface WatchNode extends ReactiveNode {\n  hasRun: boolean;\n  fn: ((onCleanup: WatchCleanupRegisterFn) => void) | null;\n  schedule: ((watch: Watch) => void) | null;\n  cleanupFn: WatchCleanupFn;\n  ref: Watch;\n}\n\nexport function createWatch(\n  fn: (onCleanup: WatchCleanupRegisterFn) => void,\n  schedule: (watch: Watch) => void,\n  allowSignalWrites: boolean,\n): Watch {\n  const node: WatchNode = Object.create(WATCH_NODE);\n  if (allowSignalWrites) {\n    node.consumerAllowSignalWrites = true;\n  }\n\n  node.fn = fn;\n  node.schedule = schedule;\n\n  const registerOnCleanup = (cleanupFn: WatchCleanupFn) => {\n    node.cleanupFn = cleanupFn;\n  };\n\n  function isWatchNodeDestroyed(node: WatchNode) {\n    return node.fn === null && node.schedule === null;\n  }\n\n  function destroyWatchNode(node: WatchNode) {\n    if (!isWatchNodeDestroyed(node)) {\n      consumerDestroy(node); // disconnect watcher from the reactive graph\n      node.cleanupFn();\n\n      // nullify references to the integration functions to mark node as destroyed\n      node.fn = null;\n      node.schedule = null;\n      node.cleanupFn = NOOP_CLEANUP_FN;\n    }\n  }\n\n  const run = () => {\n    if (node.fn === null) {\n      // trying to run a destroyed watch is noop\n      return;\n    }\n\n    if (isInNotificationPhase()) {\n      throw new Error(`Schedulers cannot synchronously execute watches while scheduling.`);\n    }\n\n    node.dirty = false;\n    if (node.hasRun && !consumerPollProducersForChange(node)) {\n      return;\n    }\n    node.hasRun = true;\n\n    const prevConsumer = consumerBeforeComputation(node);\n    try {\n      node.cleanupFn();\n      node.cleanupFn = NOOP_CLEANUP_FN;\n      node.fn(registerOnCleanup);\n    } finally {\n      consumerAfterComputation(node, prevConsumer);\n    }\n  };\n\n  node.ref = {\n    notify: () => consumerMarkDirty(node),\n    run,\n    cleanup: () => node.cleanupFn(),\n    destroy: () => destroyWatchNode(node),\n    [SIGNAL]: node,\n  };\n\n  return node.ref;\n}\n\nconst NOOP_CLEANUP_FN: WatchCleanupFn = () => {};\n\n// Note: Using an IIFE here to ensure that the spread assignment is not considered\n// a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.\n// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.\nconst WATCH_NODE: Partial<WatchNode> = /* @__PURE__ */ (() => {\n  return {\n    ...REACTIVE_NODE,\n    consumerIsAlwaysLive: true,\n    consumerAllowSignalWrites: false,\n    consumerMarkedDirty: (node: WatchNode) => {\n      if (node.schedule !== null) {\n        node.schedule(node.ref);\n      }\n    },\n    hasRun: false,\n    cleanupFn: NOOP_CLEANUP_FN,\n  };\n})();\n"],"names":[],"mappings":";;;;;;;;;SA6DgB,WAAW,CACzB,EAA+C,EAC/C,QAAgC,EAChC,iBAA0B,EAAA;IAE1B,MAAM,IAAI,GAAc,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;IACjD,IAAI,iBAAiB,EAAE;AACrB,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;;AAGvC,IAAA,IAAI,CAAC,EAAE,GAAG,EAAE;AACZ,IAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AAExB,IAAA,MAAM,iBAAiB,GAAG,CAAC,SAAyB,KAAI;AACtD,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC5B,KAAC;IAED,SAAS,oBAAoB,CAAC,IAAe,EAAA;QAC3C,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;;IAGnD,SAAS,gBAAgB,CAAC,IAAe,EAAA;AACvC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE;AAC/B,YAAA,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,SAAS,EAAE;;AAGhB,YAAA,IAAI,CAAC,EAAE,GAAG,IAAI;AACd,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,SAAS,GAAG,eAAe;;;IAIpC,MAAM,GAAG,GAAG,MAAK;AACf,QAAA,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE;;YAEpB;;QAGF,IAAI,qBAAqB,EAAE,EAAE;AAC3B,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,iEAAA,CAAmE,CAAC;;AAGtF,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,EAAE;YACxD;;AAEF,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAElB,QAAA,MAAM,YAAY,GAAG,yBAAyB,CAAC,IAAI,CAAC;AACpD,QAAA,IAAI;YACF,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,GAAG,eAAe;AAChC,YAAA,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC;;gBAClB;AACR,YAAA,wBAAwB,CAAC,IAAI,EAAE,YAAY,CAAC;;AAEhD,KAAC;IAED,IAAI,CAAC,GAAG,GAAG;AACT,QAAA,MAAM,EAAE,MAAM,iBAAiB,CAAC,IAAI,CAAC;QACrC,GAAG;AACH,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE;AAC/B,QAAA,OAAO,EAAE,MAAM,gBAAgB,CAAC,IAAI,CAAC;QACrC,CAAC,MAAM,GAAG,IAAI;KACf;IAED,OAAO,IAAI,CAAC,GAAG;AACjB;AAEA,MAAM,eAAe,GAAmB,MAAK,GAAG;AAEhD;AACA;AACA;AACA,MAAM,UAAU,mBAAuC,CAAC,MAAK;IAC3D,OAAO;AACL,QAAA,GAAG,aAAa;AAChB,QAAA,oBAAoB,EAAE,IAAI;AAC1B,QAAA,yBAAyB,EAAE,KAAK;AAChC,QAAA,mBAAmB,EAAE,CAAC,IAAe,KAAI;AACvC,YAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;AAC1B,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;;SAE1B;AACD,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,SAAS,EAAE,eAAe;KAC3B;AACH,CAAC,GAAG;;;;"}(zx7/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { assertInInjectionContext, inject, DestroyRef, ɵRuntimeError as _RuntimeError, ɵgetOutputDestroyRef as _getOutputDestroyRef, Injector, effect, untracked, ɵmicrotaskEffect as _microtaskEffect, assertNotInReactiveContext, signal, computed, PendingTasks, resource } from '@angular/core';
import { Observable, ReplaySubject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

/**
 * Operator which completes the Observable when the calling context (component, directive, service,
 * etc) is destroyed.
 *
 * @param destroyRef optionally, the `DestroyRef` representing the current context. This can be
 *     passed explicitly to use `takeUntilDestroyed` outside of an [injection
 * context](guide/di/dependency-injection-context). Otherwise, the current `DestroyRef` is injected.
 *
 * @publicApi
 */
function takeUntilDestroyed(destroyRef) {
    if (!destroyRef) {
        assertInInjectionContext(takeUntilDestroyed);
        destroyRef = inject(DestroyRef);
    }
    const destroyed$ = new Observable((observer) => {
        const unregisterFn = destroyRef.onDestroy(observer.next.bind(observer));
        return unregisterFn;
    });
    return (source) => {
        return source.pipe(takeUntil(destroyed$));
    };
}

/**
 * Implementation of `OutputRef` that emits values from
 * an RxJS observable source.
 *
 * @internal
 */
class OutputFromObservableRef {
    source;
    destroyed = false;
    destroyRef = inject(DestroyRef);
    constructor(source) {
        this.source = source;
        this.destroyRef.onDestroy(() => {
            this.destroyed = true;
        });
    }
    subscribe(callbackFn) {
        if (this.destroyed) {
            throw new _RuntimeError(953 /* ɵRuntimeErrorCode.OUTPUT_REF_DESTROYED */, ngDevMode &&
                'Unexpected subscription to destroyed `OutputRef`. ' +
                    'The owning directive/component is destroyed.');
        }
        // Stop yielding more values when the directive/component is already destroyed.
        const subscription = this.source.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
            next: (value) => callbackFn(value),
        });
        return {
            unsubscribe: () => subscription.unsubscribe(),
        };
    }
}
/**
 * Declares an Angular output that is using an RxJS observable as a source
 * for events dispatched to parent subscribers.
 *
 * The behavior for an observable as source is defined as followed:
 *    1. New values are forwarded to the Angular output (next notifications).
 *    2. Errors notifications are not handled by Angular. You need to handle these manually.
 *       For example by using `catchError`.
 *    3. Completion notifications stop the output from emitting new values.
 *
 * @usageNotes
 * Initialize an output in your directive by declaring a
 * class field and initializing it with the `outputFromObservable()` function.
 *
 * ```ts
 * @Directive({..})
 * export class MyDir {
 *   nameChange$ = <some-observable>;
 *   nameChange = outputFromObservable(this.nameChange$);
 * }
 * ```
 *
 * @publicApi
 */
function outputFromObservable(observable, opts) {
    ngDevMode && assertInInjectionContext(outputFromObservable);
    return new OutputFromObservableRef(observable);
}

/**
 * Converts an Angular output declared via `output()` or `outputFromObservable()`
 * to an observable.
 *
 * You can subscribe to the output via `Observable.subscribe` then.
 *
 * @publicApi
 */
function outputToObservable(ref) {
    const destroyRef = _getOutputDestroyRef(ref);
    return new Observable((observer) => {
        // Complete the observable upon directive/component destroy.
        // Note: May be `undefined` if an `EventEmitter` is declared outside
        // of an injection context.
        destroyRef?.onDestroy(() => observer.complete());
        const subscription = ref.subscribe((v) => observer.next(v));
        return () => subscription.unsubscribe();
    });
}

/**
 * Exposes the value of an Angular `Signal` as an RxJS `Observable`.
 *
 * The signal's value will be propagated into the `Observable`'s subscribers using an `effect`.
 *
 * `toObservable` must be called in an injection context unless an injector is provided via options.
 *
 * @developerPreview
 */
function toObservable(source, options) {
    !options?.injector && assertInInjectionContext(toObservable);
    const injector = options?.injector ?? inject(Injector);
    const subject = new ReplaySubject(1);
    const watcher = effect(() => {
        let value;
        try {
            value = source();
        }
        catch (err) {
            untracked(() => subject.error(err));
            return;
        }
        untracked(() => subject.next(value));
    }, { injector, manualCleanup: true });
    injector.get(DestroyRef).onDestroy(() => {
        watcher.destroy();
        subject.complete();
    });
    return subject.asObservable();
}
function toObservableMicrotask(source, options) {
    !options?.injector && assertInInjectionContext(toObservable);
    const injector = options?.injector ?? inject(Injector);
    const subject = new ReplaySubject(1);
    const watcher = _microtaskEffect(() => {
        let value;
        try {
            value = source();
        }
        catch (err) {
            untracked(() => subject.error(err));
            return;
        }
        untracked(() => subject.next(value));
    }, { injector, manualCleanup: true });
    injector.get(DestroyRef).onDestroy(() => {
        watcher.destroy();
        subject.complete();
    });
    return subject.asObservable();
}

/**
 * Get the current value of an `Observable` as a reactive `Signal`.
 *
 * `toSignal` returns a `Signal` which provides synchronous reactive access to values produced
 * by the given `Observable`, by subscribing to that `Observable`. The returned `Signal` will always
 * have the most recent value emitted by the subscription, and will throw an error if the
 * `Observable` errors.
 *
 * With `requireSync` set to `true`, `toSignal` will assert that the `Observable` produces a value
 * immediately upon subscription. No `initialValue` is needed in this case, and the returned signal
 * does not include an `undefined` type.
 *
 * By default, the subscription will be automatically cleaned up when the current [injection
 * context](guide/di/dependency-injection-context) is destroyed. For example, when `toSignal` is
 * called during the construction of a component, the subscription will be cleaned up when the
 * component is destroyed. If an injection context is not available, an explicit `Injector` can be
 * passed instead.
 *
 * If the subscription should persist until the `Observable` itself completes, the `manualCleanup`
 * option can be specified instead, which disables the automatic subscription teardown. No injection
 * context is needed in this configuration as well.
 *
 * @developerPreview
 */
function toSignal(source, options) {
    typeof ngDevMode !== 'undefined' &&
        ngDevMode &&
        assertNotInReactiveContext(toSignal, 'Invoking `toSignal` causes new subscriptions every time. ' +
            'Consider moving `toSignal` outside of the reactive context and read the signal value where needed.');
    const requiresCleanup = !options?.manualCleanup;
    requiresCleanup && !options?.injector && assertInInjectionContext(toSignal);
    const cleanupRef = requiresCleanup
        ? (options?.injector?.get(DestroyRef) ?? inject(DestroyRef))
        : null;
    const equal = makeToSignalEqual(options?.equal);
    // Note: T is the Observable value type, and U is the initial value type. They don't have to be
    // the same - the returned signal gives values of type `T`.
    let state;
    if (options?.requireSync) {
        // Initially the signal is in a `NoValue` state.
        state = signal({ kind: 0 /* StateKind.NoValue */ }, { equal });
    }
    else {
        // If an initial value was passed, use it. Otherwise, use `undefined` as the initial value.
        state = signal({ kind: 1 /* StateKind.Value */, value: options?.initialValue }, { equal });
    }
    let destroyUnregisterFn;
    // Note: This code cannot run inside a reactive context (see assertion above). If we'd support
    // this, we would subscribe to the observable outside of the current reactive context, avoiding
    // that side-effect signal reads/writes are attribute to the current consumer. The current
    // consumer only needs to be notified when the `state` signal changes through the observable
    // subscription. Additional context (related to async pipe):
    // https://github.com/angular/angular/pull/50522.
    const sub = source.subscribe({
        next: (value) => state.set({ kind: 1 /* StateKind.Value */, value }),
        error: (error) => {
            if (options?.rejectErrors) {
                // Kick the error back to RxJS. It will be caught and rethrown in a macrotask, which causes
                // the error to end up as an uncaught exception.
                throw error;
            }
            state.set({ kind: 2 /* StateKind.Error */, error });
        },
        complete: () => {
            destroyUnregisterFn?.();
        },
        // Completion of the Observable is meaningless to the signal. Signals don't have a concept of
        // "complete".
    });
    if (options?.requireSync && state().kind === 0 /* StateKind.NoValue */) {
        throw new _RuntimeError(601 /* ɵRuntimeErrorCode.REQUIRE_SYNC_WITHOUT_SYNC_EMIT */, (typeof ngDevMode === 'undefined' || ngDevMode) &&
            '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.');
    }
    // Unsubscribe when the current context is destroyed, if requested.
    destroyUnregisterFn = cleanupRef?.onDestroy(sub.unsubscribe.bind(sub));
    // The actual returned signal is a `computed` of the `State` signal, which maps the various states
    // to either values or errors.
    return computed(() => {
        const current = state();
        switch (current.kind) {
            case 1 /* StateKind.Value */:
                return current.value;
            case 2 /* StateKind.Error */:
                throw current.error;
            case 0 /* StateKind.NoValue */:
                // This shouldn't really happen because the error is thrown on creation.
                throw new _RuntimeError(601 /* ɵRuntimeErrorCode.REQUIRE_SYNC_WITHOUT_SYNC_EMIT */, (typeof ngDevMode === 'undefined' || ngDevMode) &&
                    '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.');
        }
    }, { equal: options?.equal });
}
function makeToSignalEqual(userEquality = Object.is) {
    return (a, b) => a.kind === 1 /* StateKind.Value */ && b.kind === 1 /* StateKind.Value */ && userEquality(a.value, b.value);
}

/**
 * Operator which makes the application unstable until the observable emits, completes, errors, or is unsubscribed.
 *
 * Use this operator in observables whose subscriptions are important for rendering and should be included in SSR serialization.
 *
 * @param injector The `Injector` to use during creation. If this is not provided, the current injection context will be used instead (via `inject`).
 *
 * @experimental
 */
function pendingUntilEvent(injector) {
    if (injector === undefined) {
        assertInInjectionContext(pendingUntilEvent);
        injector = inject(Injector);
    }
    const taskService = injector.get(PendingTasks);
    return (sourceObservable) => {
        return new Observable((originalSubscriber) => {
            // create a new task on subscription
            const removeTask = taskService.add();
            let cleanedUp = false;
            function cleanupTask() {
                if (cleanedUp) {
                    return;
                }
                removeTask();
                cleanedUp = true;
            }
            const innerSubscription = sourceObservable.subscribe({
                next: (v) => {
                    originalSubscriber.next(v);
                    cleanupTask();
                },
                complete: () => {
                    originalSubscriber.complete();
                    cleanupTask();
                },
                error: (e) => {
                    originalSubscriber.error(e);
                    cleanupTask();
                },
            });
            innerSubscription.add(() => {
                originalSubscriber.unsubscribe();
                cleanupTask();
            });
            return innerSubscription;
        });
    };
}

function rxResource(opts) {
    opts?.injector || assertInInjectionContext(rxResource);
    return resource({
        ...opts,
        loader: undefined,
        stream: (params) => {
            let sub;
            // Track the abort listener so it can be removed if the Observable completes (as a memory
            // optimization).
            const onAbort = () => sub.unsubscribe();
            params.abortSignal.addEventListener('abort', onAbort);
            // Start off stream as undefined.
            const stream = signal({ value: undefined });
            let resolve;
            const promise = new Promise((r) => (resolve = r));
            function send(value) {
                stream.set(value);
                resolve?.(stream);
                resolve = undefined;
            }
            sub = opts.loader(params).subscribe({
                next: (value) => send({ value }),
                error: (error) => {
                    send({ error });
                    params.abortSignal.removeEventListener('abort', onAbort);
                },
                complete: () => {
                    if (resolve) {
                        send({ error: new Error('Resource completed before producing a value') });
                    }
                    params.abortSignal.removeEventListener('abort', onAbort);
                },
            });
            return promise;
        },
    });
}

export { outputFromObservable, outputToObservable, pendingUntilEvent, rxResource, takeUntilDestroyed, toObservable, toSignal, toObservableMicrotask as ɵtoObservableMicrotask };
//# sourceMappingURL=rxjs-interop.mjs.map
-1x>t{"version":3,"file":"rxjs-interop.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/rxjs-interop/src/take_until_destroyed.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/rxjs-interop/src/output_from_observable.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/rxjs-interop/src/output_to_observable.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/rxjs-interop/src/to_observable.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/rxjs-interop/src/to_signal.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/rxjs-interop/src/pending_until_event.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/rxjs-interop/src/rx_resource.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertInInjectionContext, DestroyRef, inject} from '@angular/core';\nimport {MonoTypeOperatorFunction, Observable} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\n\n/**\n * Operator which completes the Observable when the calling context (component, directive, service,\n * etc) is destroyed.\n *\n * @param destroyRef optionally, the `DestroyRef` representing the current context. This can be\n *     passed explicitly to use `takeUntilDestroyed` outside of an [injection\n * context](guide/di/dependency-injection-context). Otherwise, the current `DestroyRef` is injected.\n *\n * @publicApi\n */\nexport function takeUntilDestroyed<T>(destroyRef?: DestroyRef): MonoTypeOperatorFunction<T> {\n  if (!destroyRef) {\n    assertInInjectionContext(takeUntilDestroyed);\n    destroyRef = inject(DestroyRef);\n  }\n\n  const destroyed$ = new Observable<void>((observer) => {\n    const unregisterFn = destroyRef!.onDestroy(observer.next.bind(observer));\n    return unregisterFn;\n  });\n\n  return <T>(source: Observable<T>) => {\n    return source.pipe(takeUntil(destroyed$));\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  assertInInjectionContext,\n  DestroyRef,\n  inject,\n  OutputOptions,\n  OutputRef,\n  OutputRefSubscription,\n  ɵRuntimeError,\n  ɵRuntimeErrorCode,\n} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nimport {takeUntilDestroyed} from './take_until_destroyed';\n\n/**\n * Implementation of `OutputRef` that emits values from\n * an RxJS observable source.\n *\n * @internal\n */\nclass OutputFromObservableRef<T> implements OutputRef<T> {\n  private destroyed = false;\n\n  destroyRef = inject(DestroyRef);\n\n  constructor(private source: Observable<T>) {\n    this.destroyRef.onDestroy(() => {\n      this.destroyed = true;\n    });\n  }\n\n  subscribe(callbackFn: (value: T) => void): OutputRefSubscription {\n    if (this.destroyed) {\n      throw new ɵRuntimeError(\n        ɵRuntimeErrorCode.OUTPUT_REF_DESTROYED,\n        ngDevMode &&\n          'Unexpected subscription to destroyed `OutputRef`. ' +\n            'The owning directive/component is destroyed.',\n      );\n    }\n\n    // Stop yielding more values when the directive/component is already destroyed.\n    const subscription = this.source.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n      next: (value) => callbackFn(value),\n    });\n\n    return {\n      unsubscribe: () => subscription.unsubscribe(),\n    };\n  }\n}\n\n/**\n * Declares an Angular output that is using an RxJS observable as a source\n * for events dispatched to parent subscribers.\n *\n * The behavior for an observable as source is defined as followed:\n *    1. New values are forwarded to the Angular output (next notifications).\n *    2. Errors notifications are not handled by Angular. You need to handle these manually.\n *       For example by using `catchError`.\n *    3. Completion notifications stop the output from emitting new values.\n *\n * @usageNotes\n * Initialize an output in your directive by declaring a\n * class field and initializing it with the `outputFromObservable()` function.\n *\n * ```ts\n * @Directive({..})\n * export class MyDir {\n *   nameChange$ = <some-observable>;\n *   nameChange = outputFromObservable(this.nameChange$);\n * }\n * ```\n *\n * @publicApi\n */\nexport function outputFromObservable<T>(\n  observable: Observable<T>,\n  opts?: OutputOptions,\n): OutputRef<T> {\n  ngDevMode && assertInInjectionContext(outputFromObservable);\n  return new OutputFromObservableRef<T>(observable);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {OutputRef, ɵgetOutputDestroyRef} from '@angular/core';\nimport {Observable} from 'rxjs';\n\n/**\n * Converts an Angular output declared via `output()` or `outputFromObservable()`\n * to an observable.\n *\n * You can subscribe to the output via `Observable.subscribe` then.\n *\n * @publicApi\n */\nexport function outputToObservable<T>(ref: OutputRef<T>): Observable<T> {\n  const destroyRef = ɵgetOutputDestroyRef(ref);\n\n  return new Observable<T>((observer) => {\n    // Complete the observable upon directive/component destroy.\n    // Note: May be `undefined` if an `EventEmitter` is declared outside\n    // of an injection context.\n    destroyRef?.onDestroy(() => observer.complete());\n\n    const subscription = ref.subscribe((v) => observer.next(v));\n    return () => subscription.unsubscribe();\n  });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  assertInInjectionContext,\n  DestroyRef,\n  effect,\n  inject,\n  Injector,\n  Signal,\n  untracked,\n  ɵmicrotaskEffect as microtaskEffect,\n} from '@angular/core';\nimport {Observable, ReplaySubject} from 'rxjs';\n\n/**\n * Options for `toObservable`.\n *\n * @developerPreview\n */\nexport interface ToObservableOptions {\n  /**\n   * The `Injector` to use when creating the underlying `effect` which watches the signal.\n   *\n   * If this isn't specified, the current [injection context](guide/di/dependency-injection-context)\n   * will be used.\n   */\n  injector?: Injector;\n}\n\n/**\n * Exposes the value of an Angular `Signal` as an RxJS `Observable`.\n *\n * The signal's value will be propagated into the `Observable`'s subscribers using an `effect`.\n *\n * `toObservable` must be called in an injection context unless an injector is provided via options.\n *\n * @developerPreview\n */\nexport function toObservable<T>(source: Signal<T>, options?: ToObservableOptions): Observable<T> {\n  !options?.injector && assertInInjectionContext(toObservable);\n  const injector = options?.injector ?? inject(Injector);\n  const subject = new ReplaySubject<T>(1);\n\n  const watcher = effect(\n    () => {\n      let value: T;\n      try {\n        value = source();\n      } catch (err) {\n        untracked(() => subject.error(err));\n        return;\n      }\n      untracked(() => subject.next(value));\n    },\n    {injector, manualCleanup: true},\n  );\n\n  injector.get(DestroyRef).onDestroy(() => {\n    watcher.destroy();\n    subject.complete();\n  });\n\n  return subject.asObservable();\n}\n\nexport function toObservableMicrotask<T>(\n  source: Signal<T>,\n  options?: ToObservableOptions,\n): Observable<T> {\n  !options?.injector && assertInInjectionContext(toObservable);\n  const injector = options?.injector ?? inject(Injector);\n  const subject = new ReplaySubject<T>(1);\n\n  const watcher = microtaskEffect(\n    () => {\n      let value: T;\n      try {\n        value = source();\n      } catch (err) {\n        untracked(() => subject.error(err));\n        return;\n      }\n      untracked(() => subject.next(value));\n    },\n    {injector, manualCleanup: true},\n  );\n\n  injector.get(DestroyRef).onDestroy(() => {\n    watcher.destroy();\n    subject.complete();\n  });\n\n  return subject.asObservable();\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  assertInInjectionContext,\n  assertNotInReactiveContext,\n  computed,\n  DestroyRef,\n  inject,\n  Injector,\n  signal,\n  Signal,\n  WritableSignal,\n  ɵRuntimeError,\n  ɵRuntimeErrorCode,\n} from '@angular/core';\nimport {ValueEqualityFn} from '@angular/core/primitives/signals';\nimport {Observable, Subscribable} from 'rxjs';\n\n/**\n * Options for `toSignal`.\n *\n * @publicApi\n */\nexport interface ToSignalOptions<T> {\n  /**\n   * Initial value for the signal produced by `toSignal`.\n   *\n   * This will be the value of the signal until the observable emits its first value.\n   */\n  initialValue?: unknown;\n\n  /**\n   * Whether to require that the observable emits synchronously when `toSignal` subscribes.\n   *\n   * If this is `true`, `toSignal` will assert that the observable produces a value immediately upon\n   * subscription. Setting this option removes the need to either deal with `undefined` in the\n   * signal type or provide an `initialValue`, at the cost of a runtime error if this requirement is\n   * not met.\n   */\n  requireSync?: boolean;\n\n  /**\n   * `Injector` which will provide the `DestroyRef` used to clean up the Observable subscription.\n   *\n   * If this is not provided, a `DestroyRef` will be retrieved from the current [injection\n   * context](guide/di/dependency-injection-context), unless manual cleanup is requested.\n   */\n  injector?: Injector;\n\n  /**\n   * Whether the subscription should be automatically cleaned up (via `DestroyRef`) when\n   * `toSignal`'s creation context is destroyed.\n   *\n   * If manual cleanup is enabled, then `DestroyRef` is not used, and the subscription will persist\n   * until the `Observable` itself completes.\n   */\n  manualCleanup?: boolean;\n\n  /**\n   * Whether `toSignal` should throw errors from the Observable error channel back to RxJS, where\n   * they'll be processed as uncaught exceptions.\n   *\n   * In practice, this means that the signal returned by `toSignal` will keep returning the last\n   * good value forever, as Observables which error produce no further values. This option emulates\n   * the behavior of the `async` pipe.\n   */\n  rejectErrors?: boolean;\n\n  /**\n   * A comparison function which defines equality for values emitted by the observable.\n   *\n   * Equality comparisons are executed against the initial value if one is provided.\n   */\n  equal?: ValueEqualityFn<T>;\n}\n\n// Base case: no options -> `undefined` in the result type.\nexport function toSignal<T>(source: Observable<T> | Subscribable<T>): Signal<T | undefined>;\n// Options with `undefined` initial value and no `requiredSync` -> `undefined`.\nexport function toSignal<T>(\n  source: Observable<T> | Subscribable<T>,\n  options: NoInfer<ToSignalOptions<T | undefined>> & {\n    initialValue?: undefined;\n    requireSync?: false;\n  },\n): Signal<T | undefined>;\n// Options with `null` initial value -> `null`.\nexport function toSignal<T>(\n  source: Observable<T> | Subscribable<T>,\n  options: NoInfer<ToSignalOptions<T | null>> & {initialValue?: null; requireSync?: false},\n): Signal<T | null>;\n// Options with `undefined` initial value and `requiredSync` -> strict result type.\nexport function toSignal<T>(\n  source: Observable<T> | Subscribable<T>,\n  options: NoInfer<ToSignalOptions<T>> & {initialValue?: undefined; requireSync: true},\n): Signal<T>;\n// Options with a more specific initial value type.\nexport function toSignal<T, const U extends T>(\n  source: Observable<T> | Subscribable<T>,\n  options: NoInfer<ToSignalOptions<T | U>> & {initialValue: U; requireSync?: false},\n): Signal<T | U>;\n\n/**\n * Get the current value of an `Observable` as a reactive `Signal`.\n *\n * `toSignal` returns a `Signal` which provides synchronous reactive access to values produced\n * by the given `Observable`, by subscribing to that `Observable`. The returned `Signal` will always\n * have the most recent value emitted by the subscription, and will throw an error if the\n * `Observable` errors.\n *\n * With `requireSync` set to `true`, `toSignal` will assert that the `Observable` produces a value\n * immediately upon subscription. No `initialValue` is needed in this case, and the returned signal\n * does not include an `undefined` type.\n *\n * By default, the subscription will be automatically cleaned up when the current [injection\n * context](guide/di/dependency-injection-context) is destroyed. For example, when `toSignal` is\n * called during the construction of a component, the subscription will be cleaned up when the\n * component is destroyed. If an injection context is not available, an explicit `Injector` can be\n * passed instead.\n *\n * If the subscription should persist until the `Observable` itself completes, the `manualCleanup`\n * option can be specified instead, which disables the automatic subscription teardown. No injection\n * context is needed in this configuration as well.\n *\n * @developerPreview\n */\nexport function toSignal<T, U = undefined>(\n  source: Observable<T> | Subscribable<T>,\n  options?: ToSignalOptions<T | U> & {initialValue?: U},\n): Signal<T | U> {\n  typeof ngDevMode !== 'undefined' &&\n    ngDevMode &&\n    assertNotInReactiveContext(\n      toSignal,\n      'Invoking `toSignal` causes new subscriptions every time. ' +\n        'Consider moving `toSignal` outside of the reactive context and read the signal value where needed.',\n    );\n\n  const requiresCleanup = !options?.manualCleanup;\n  requiresCleanup && !options?.injector && assertInInjectionContext(toSignal);\n  const cleanupRef = requiresCleanup\n    ? (options?.injector?.get(DestroyRef) ?? inject(DestroyRef))\n    : null;\n\n  const equal = makeToSignalEqual(options?.equal);\n\n  // Note: T is the Observable value type, and U is the initial value type. They don't have to be\n  // the same - the returned signal gives values of type `T`.\n  let state: WritableSignal<State<T | U>>;\n  if (options?.requireSync) {\n    // Initially the signal is in a `NoValue` state.\n    state = signal({kind: StateKind.NoValue}, {equal});\n  } else {\n    // If an initial value was passed, use it. Otherwise, use `undefined` as the initial value.\n    state = signal<State<T | U>>(\n      {kind: StateKind.Value, value: options?.initialValue as U},\n      {equal},\n    );\n  }\n\n  let destroyUnregisterFn: (() => void) | undefined;\n\n  // Note: This code cannot run inside a reactive context (see assertion above). If we'd support\n  // this, we would subscribe to the observable outside of the current reactive context, avoiding\n  // that side-effect signal reads/writes are attribute to the current consumer. The current\n  // consumer only needs to be notified when the `state` signal changes through the observable\n  // subscription. Additional context (related to async pipe):\n  // https://github.com/angular/angular/pull/50522.\n  const sub = source.subscribe({\n    next: (value) => state.set({kind: StateKind.Value, value}),\n    error: (error) => {\n      if (options?.rejectErrors) {\n        // Kick the error back to RxJS. It will be caught and rethrown in a macrotask, which causes\n        // the error to end up as an uncaught exception.\n        throw error;\n      }\n      state.set({kind: StateKind.Error, error});\n    },\n    complete: () => {\n      destroyUnregisterFn?.();\n    },\n    // Completion of the Observable is meaningless to the signal. Signals don't have a concept of\n    // \"complete\".\n  });\n\n  if (options?.requireSync && state().kind === StateKind.NoValue) {\n    throw new ɵRuntimeError(\n      ɵRuntimeErrorCode.REQUIRE_SYNC_WITHOUT_SYNC_EMIT,\n      (typeof ngDevMode === 'undefined' || ngDevMode) &&\n        '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.',\n    );\n  }\n\n  // Unsubscribe when the current context is destroyed, if requested.\n  destroyUnregisterFn = cleanupRef?.onDestroy(sub.unsubscribe.bind(sub));\n\n  // The actual returned signal is a `computed` of the `State` signal, which maps the various states\n  // to either values or errors.\n  return computed(\n    () => {\n      const current = state();\n      switch (current.kind) {\n        case StateKind.Value:\n          return current.value;\n        case StateKind.Error:\n          throw current.error;\n        case StateKind.NoValue:\n          // This shouldn't really happen because the error is thrown on creation.\n          throw new ɵRuntimeError(\n            ɵRuntimeErrorCode.REQUIRE_SYNC_WITHOUT_SYNC_EMIT,\n            (typeof ngDevMode === 'undefined' || ngDevMode) &&\n              '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.',\n          );\n      }\n    },\n    {equal: options?.equal},\n  );\n}\n\nfunction makeToSignalEqual<T>(\n  userEquality: ValueEqualityFn<T> = Object.is,\n): ValueEqualityFn<State<T>> {\n  return (a, b) =>\n    a.kind === StateKind.Value && b.kind === StateKind.Value && userEquality(a.value, b.value);\n}\n\nconst enum StateKind {\n  NoValue,\n  Value,\n  Error,\n}\n\ninterface NoValueState {\n  kind: StateKind.NoValue;\n}\n\ninterface ValueState<T> {\n  kind: StateKind.Value;\n  value: T;\n}\n\ninterface ErrorState {\n  kind: StateKind.Error;\n  error: unknown;\n}\n\ntype State<T> = NoValueState | ValueState<T> | ErrorState;\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {assertInInjectionContext, PendingTasks, inject, Injector} from '@angular/core';\nimport {MonoTypeOperatorFunction, Observable} from 'rxjs';\n\n/**\n * Operator which makes the application unstable until the observable emits, completes, errors, or is unsubscribed.\n *\n * Use this operator in observables whose subscriptions are important for rendering and should be included in SSR serialization.\n *\n * @param injector The `Injector` to use during creation. If this is not provided, the current injection context will be used instead (via `inject`).\n *\n * @experimental\n */\nexport function pendingUntilEvent<T>(injector?: Injector): MonoTypeOperatorFunction<T> {\n  if (injector === undefined) {\n    assertInInjectionContext(pendingUntilEvent);\n    injector = inject(Injector);\n  }\n  const taskService = injector.get(PendingTasks);\n\n  return (sourceObservable) => {\n    return new Observable<T>((originalSubscriber) => {\n      // create a new task on subscription\n      const removeTask = taskService.add();\n\n      let cleanedUp = false;\n      function cleanupTask() {\n        if (cleanedUp) {\n          return;\n        }\n\n        removeTask();\n        cleanedUp = true;\n      }\n\n      const innerSubscription = sourceObservable.subscribe({\n        next: (v) => {\n          originalSubscriber.next(v);\n          cleanupTask();\n        },\n        complete: () => {\n          originalSubscriber.complete();\n          cleanupTask();\n        },\n        error: (e) => {\n          originalSubscriber.error(e);\n          cleanupTask();\n        },\n      });\n      innerSubscription.add(() => {\n        originalSubscriber.unsubscribe();\n        cleanupTask();\n      });\n      return innerSubscription;\n    });\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  assertInInjectionContext,\n  resource,\n  ResourceLoaderParams,\n  ResourceRef,\n  Signal,\n  signal,\n  BaseResourceOptions,\n} from '@angular/core';\nimport {Observable, Subscription} from 'rxjs';\n\n/**\n * Like `ResourceOptions` but uses an RxJS-based `loader`.\n *\n * @experimental\n */\nexport interface RxResourceOptions<T, R> extends BaseResourceOptions<T, R> {\n  loader: (params: ResourceLoaderParams<R>) => Observable<T>;\n}\n\n/**\n * Like `resource` but uses an RxJS based `loader` which maps the request to an `Observable` of the\n * resource's value.\n *\n * @experimental\n */\nexport function rxResource<T, R>(\n  opts: RxResourceOptions<T, R> & {defaultValue: NoInfer<T>},\n): ResourceRef<T>;\n\n/**\n * Like `resource` but uses an RxJS based `loader` which maps the request to an `Observable` of the\n * resource's value.\n *\n * @experimental\n */\nexport function rxResource<T, R>(opts: RxResourceOptions<T, R>): ResourceRef<T | undefined>;\nexport function rxResource<T, R>(opts: RxResourceOptions<T, R>): ResourceRef<T | undefined> {\n  opts?.injector || assertInInjectionContext(rxResource);\n  return resource<T, R>({\n    ...opts,\n    loader: undefined,\n    stream: (params) => {\n      let sub: Subscription;\n\n      // Track the abort listener so it can be removed if the Observable completes (as a memory\n      // optimization).\n      const onAbort = () => sub.unsubscribe();\n      params.abortSignal.addEventListener('abort', onAbort);\n\n      // Start off stream as undefined.\n      const stream = signal<{value: T} | {error: unknown}>({value: undefined as T});\n      let resolve: ((value: Signal<{value: T} | {error: unknown}>) => void) | undefined;\n      const promise = new Promise<Signal<{value: T} | {error: unknown}>>((r) => (resolve = r));\n\n      function send(value: {value: T} | {error: unknown}): void {\n        stream.set(value);\n        resolve?.(stream);\n        resolve = undefined;\n      }\n\n      sub = opts.loader(params).subscribe({\n        next: (value) => send({value}),\n        error: (error) => {\n          send({error});\n          params.abortSignal.removeEventListener('abort', onAbort);\n        },\n        complete: () => {\n          if (resolve) {\n            send({error: new Error('Resource completed before producing a value')});\n          }\n          params.abortSignal.removeEventListener('abort', onAbort);\n        },\n      });\n\n      return promise;\n    },\n  });\n}\n"],"names":["ɵRuntimeError","ɵgetOutputDestroyRef","microtaskEffect"],"mappings":"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"}ZBx   /**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as i0 from '@angular/core';
import { inject as inject$1, NgZone, ErrorHandler, Injectable, ɵDeferBlockState as _DeferBlockState, ɵtriggerResourceLoading as _triggerResourceLoading, ɵrenderDeferBlockState as _renderDeferBlockState, ɵCONTAINER_HEADER_OFFSET as _CONTAINER_HEADER_OFFSET, ɵgetDeferBlocks as _getDeferBlocks, InjectionToken, ɵDeferBlockBehavior as _DeferBlockBehavior, ɵNoopNgZone as _NoopNgZone, ApplicationRef, ɵPendingTasksInternal as _PendingTasksInternal, ɵZONELESS_ENABLED as _ZONELESS_ENABLED, ɵChangeDetectionScheduler as _ChangeDetectionScheduler, ɵEffectScheduler as _EffectScheduler, ɵMicrotaskEffectScheduler as _MicrotaskEffectScheduler, getDebugNode, RendererFactory2, ɵstringify as _stringify, Pipe, Directive, Component, NgModule, ɵReflectionCapabilities as _ReflectionCapabilities, ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT as _USE_RUNTIME_DEPS_TRACKER_FOR_JIT, ɵdepsTracker as _depsTracker, ɵgetInjectableDef as _getInjectableDef, resolveForwardRef, ɵisComponentDefPendingResolution as _isComponentDefPendingResolution, ɵgetAsyncClassMetadataFn as _getAsyncClassMetadataFn, ɵresolveComponentResources as _resolveComponentResources, ɵRender3NgModuleRef as _Render3NgModuleRef, ApplicationInitStatus, LOCALE_ID, ɵDEFAULT_LOCALE_ID as _DEFAULT_LOCALE_ID, ɵsetLocaleId as _setLocaleId, ɵRender3ComponentFactory as _Render3ComponentFactory, ɵNG_COMP_DEF as _NG_COMP_DEF, ɵcompileComponent as _compileComponent, ɵNG_DIR_DEF as _NG_DIR_DEF, ɵcompileDirective as _compileDirective, ɵNG_PIPE_DEF as _NG_PIPE_DEF, ɵcompilePipe as _compilePipe, ɵNG_MOD_DEF as _NG_MOD_DEF, ɵpatchComponentDefWithScope as _patchComponentDefWithScope, ɵNG_INJ_DEF as _NG_INJ_DEF, ɵcompileNgModuleDefs as _compileNgModuleDefs, ɵclearResolutionOfComponentResourcesQueue as _clearResolutionOfComponentResourcesQueue, ɵrestoreComponentResolutionQueue as _restoreComponentResolutionQueue, ɵinternalProvideZoneChangeDetection as _internalProvideZoneChangeDetection, ɵChangeDetectionSchedulerImpl as _ChangeDetectionSchedulerImpl, Compiler, ɵDEFER_BLOCK_CONFIG as _DEFER_BLOCK_CONFIG, ɵINTERNAL_APPLICATION_ERROR_HANDLER as _INTERNAL_APPLICATION_ERROR_HANDLER, COMPILER_OPTIONS, Injector, ɵtransitiveScopesFor as _transitiveScopesFor, ɵgenerateStandaloneInDeclarationsError as _generateStandaloneInDeclarationsError, ɵNgModuleFactory as _NgModuleFactory, ModuleWithComponentFactories, ɵisEnvironmentProviders as _isEnvironmentProviders, ɵconvertToBitFlags as _convertToBitFlags, InjectFlags, ɵsetAllowDuplicateNgModuleIdsForTest as _setAllowDuplicateNgModuleIdsForTest, ɵresetCompiledComponents as _resetCompiledComponents, ɵsetUnknownElementStrictMode as _setUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode as _setUnknownPropertyStrictMode, ɵgetUnknownElementStrictMode as _getUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode as _getUnknownPropertyStrictMode, runInInjectionContext, EnvironmentInjector, ɵflushModuleScopingQueueAsMuchAsPossible as _flushModuleScopingQueueAsMuchAsPossible } from '@angular/core';
export { ɵDeferBlockBehavior as DeferBlockBehavior, ɵDeferBlockState as DeferBlockState } from '@angular/core';
import { Subscription } from 'rxjs';
import { ResourceLoader } from '@angular/compiler';

/**
 * Wraps a test function in an asynchronous test zone. The test will automatically
 * complete when all asynchronous calls within this zone are done. Can be used
 * to wrap an {@link inject} call.
 *
 * Example:
 *
 * ```ts
 * it('...', waitForAsync(inject([AClass], (object) => {
 *   object.doSomething.then(() => {
 *     expect(...);
 *   })
 * })));
 * ```
 *
 * @publicApi
 */
function waitForAsync(fn) {
    const _Zone = typeof Zone !== 'undefined' ? Zone : null;
    if (!_Zone) {
        return function () {
            return Promise.reject('Zone is needed for the waitForAsync() test helper but could not be found. ' +
                'Please make sure that your environment includes zone.js');
        };
    }
    const asyncTest = _Zone && _Zone[_Zone.__symbol__('asyncTest')];
    if (typeof asyncTest === 'function') {
        return asyncTest(fn);
    }
    return function () {
        return Promise.reject('zone-testing.js is needed for the async() test helper but could not be found. ' +
            'Please make sure that your environment includes zone.js/testing');
    };
}

const RETHROW_APPLICATION_ERRORS_DEFAULT = true;
class TestBedApplicationErrorHandler {
    zone = inject$1(NgZone);
    userErrorHandler = inject$1(ErrorHandler);
    whenStableRejectFunctions = new Set();
    handleError(e) {
        try {
            this.zone.runOutsideAngular(() => this.userErrorHandler.handleError(e));
        }
        catch (userError) {
            e = userError;
        }
        // Instead of throwing the error when there are outstanding `fixture.whenStable` promises,
        // reject those promises with the error. This allows developers to write
        // expectAsync(fix.whenStable()).toBeRejected();
        if (this.whenStableRejectFunctions.size > 0) {
            for (const fn of this.whenStableRejectFunctions.values()) {
                fn(e);
            }
            this.whenStableRejectFunctions.clear();
        }
        else {
            throw e;
        }
    }
    static ɵfac = function TestBedApplicationErrorHandler_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TestBedApplicationErrorHandler)(); };
    static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: TestBedApplicationErrorHandler, factory: TestBedApplicationErrorHandler.ɵfac });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestBedApplicationErrorHandler, [{
        type: Injectable
    }], null, null); })();

/**
 * Represents an individual defer block for testing purposes.
 *
 * @publicApi
 */
class DeferBlockFixture {
    block;
    componentFixture;
    /** @docs-private */
    constructor(block, componentFixture) {
        this.block = block;
        this.componentFixture = componentFixture;
    }
    /**
     * Renders the specified state of the defer fixture.
     * @param state the defer state to render
     */
    async render(state) {
        if (!hasStateTemplate(state, this.block)) {
            const stateAsString = getDeferBlockStateNameFromEnum(state);
            throw new Error(`Tried to render this defer block in the \`${stateAsString}\` state, ` +
                `but there was no @${stateAsString.toLowerCase()} block defined in a template.`);
        }
        if (state === _DeferBlockState.Complete) {
            await _triggerResourceLoading(this.block.tDetails, this.block.lView, this.block.tNode);
        }
        // If the `render` method is used explicitly - skip timer-based scheduling for
        // `@placeholder` and `@loading` blocks and render them immediately.
        const skipTimerScheduling = true;
        _renderDeferBlockState(state, this.block.tNode, this.block.lContainer, skipTimerScheduling);
        this.componentFixture.detectChanges();
    }
    /**
     * Retrieves all nested child defer block fixtures
     * in a given defer block.
     */
    getDeferBlocks() {
        const deferBlocks = [];
        // An LContainer that represents a defer block has at most 1 view, which is
        // located right after an LContainer header. Get a hold of that view and inspect
        // it for nested defer blocks.
        const deferBlockFixtures = [];
        if (this.block.lContainer.length >= _CONTAINER_HEADER_OFFSET) {
            const lView = this.block.lContainer[_CONTAINER_HEADER_OFFSET];
            _getDeferBlocks(lView, deferBlocks);
            for (const block of deferBlocks) {
                deferBlockFixtures.push(new DeferBlockFixture(block, this.componentFixture));
            }
        }
        return Promise.resolve(deferBlockFixtures);
    }
}
function hasStateTemplate(state, block) {
    switch (state) {
        case _DeferBlockState.Placeholder:
            return block.tDetails.placeholderTmplIndex !== null;
        case _DeferBlockState.Loading:
            return block.tDetails.loadingTmplIndex !== null;
        case _DeferBlockState.Error:
            return block.tDetails.errorTmplIndex !== null;
        case _DeferBlockState.Complete:
            return true;
        default:
            return false;
    }
}
function getDeferBlockStateNameFromEnum(state) {
    switch (state) {
        case _DeferBlockState.Placeholder:
            return 'Placeholder';
        case _DeferBlockState.Loading:
            return 'Loading';
        case _DeferBlockState.Error:
            return 'Error';
        default:
            return 'Main';
    }
}

/** Whether test modules should be torn down by default. */
const TEARDOWN_TESTING_MODULE_ON_DESTROY_DEFAULT = true;
/** Whether unknown elements in templates should throw by default. */
const THROW_ON_UNKNOWN_ELEMENTS_DEFAULT = false;
/** Whether unknown properties in templates should throw by default. */
const THROW_ON_UNKNOWN_PROPERTIES_DEFAULT = false;
/** Whether defer blocks should use manual triggering or play through normally. */
const DEFER_BLOCK_DEFAULT_BEHAVIOR = _DeferBlockBehavior.Playthrough;
/**
 * An abstract class for inserting the root test component element in a platform independent way.
 *
 * @publicApi
 */
class TestComponentRenderer {
    insertRootElement(rootElementId) { }
    removeAllRootElements() { }
}
/**
 * @publicApi
 */
const ComponentFixtureAutoDetect = new InjectionToken('ComponentFixtureAutoDetect');
/**
 * @publicApi
 */
const ComponentFixtureNoNgZone = new InjectionToken('ComponentFixtureNoNgZone');

/**
 * Fixture for debugging and testing a component.
 *
 * @publicApi
 */
class ComponentFixture {
    componentRef;
    /**
     * The DebugElement associated with the root element of this component.
     */
    debugElement;
    /**
     * The instance of the root component class.
     */
    componentInstance;
    /**
     * The native element at the root of the component.
     */
    nativeElement;
    /**
     * The ElementRef for the element at the root of the component.
     */
    elementRef;
    /**
     * The ChangeDetectorRef for the component
     */
    changeDetectorRef;
    _renderer;
    _isDestroyed = false;
    /** @internal */
    _noZoneOptionIsSet = inject$1(ComponentFixtureNoNgZone, { optional: true });
    /** @internal */
    _ngZone = this._noZoneOptionIsSet ? new _NoopNgZone() : inject$1(NgZone);
    // Inject ApplicationRef to ensure NgZone stableness causes after render hooks to run
    // This will likely happen as a result of fixture.detectChanges because it calls ngZone.run
    // This is a crazy way of doing things but hey, it's the world we live in.
    // The zoneless scheduler should instead do this more imperatively by attaching
    // the `ComponentRef` to `ApplicationRef` and calling `appRef.tick` as the `detectChanges`
    // behavior.
    /** @internal */
    _appRef = inject$1(ApplicationRef);
    _testAppRef = this._appRef;
    pendingTasks = inject$1(_PendingTasksInternal);
    appErrorHandler = inject$1(TestBedApplicationErrorHandler);
    zonelessEnabled = inject$1(_ZONELESS_ENABLED);
    scheduler = inject$1(_ChangeDetectionScheduler);
    rootEffectScheduler = inject$1(_EffectScheduler);
    microtaskEffectScheduler = inject$1(_MicrotaskEffectScheduler);
    autoDetectDefault = this.zonelessEnabled ? true : false;
    autoDetect = inject$1(ComponentFixtureAutoDetect, { optional: true }) ?? this.autoDetectDefault;
    subscriptions = new Subscription();
    // TODO(atscott): Remove this from public API
    ngZone = this._noZoneOptionIsSet ? null : this._ngZone;
    /** @docs-private */
    constructor(componentRef) {
        this.componentRef = componentRef;
        this.changeDetectorRef = componentRef.changeDetectorRef;
        this.elementRef = componentRef.location;
        this.debugElement = getDebugNode(this.elementRef.nativeElement);
        this.componentInstance = componentRef.instance;
        this.nativeElement = this.elementRef.nativeElement;
        this.componentRef = componentRef;
        if (this.autoDetect) {
            this._testAppRef.externalTestViews.add(this.componentRef.hostView);
            this.scheduler?.notify(8 /* ɵNotificationSource.ViewAttached */);
            this.scheduler?.notify(0 /* ɵNotificationSource.MarkAncestorsForTraversal */);
        }
        this.componentRef.hostView.onDestroy(() => {
            this._testAppRef.externalTestViews.delete(this.componentRef.hostView);
        });
        // Create subscriptions outside the NgZone so that the callbacks run outside
        // of NgZone.
        this._ngZone.runOutsideAngular(() => {
            this.subscriptions.add(this._ngZone.onError.subscribe({
                next: (error) => {
                    throw error;
                },
            }));
        });
    }
    /**
     * Trigger a change detection cycle for the component.
     */
    detectChanges(checkNoChanges = true) {
        this.microtaskEffectScheduler.flush();
        const originalCheckNoChanges = this.componentRef.changeDetectorRef.checkNoChanges;
        try {
            if (!checkNoChanges) {
                this.componentRef.changeDetectorRef.checkNoChanges = () => { };
            }
            if (this.zonelessEnabled) {
                try {
                    this._testAppRef.externalTestViews.add(this.componentRef.hostView);
                    this._appRef.tick();
                }
                finally {
                    if (!this.autoDetect) {
                        this._testAppRef.externalTestViews.delete(this.componentRef.hostView);
                    }
                }
            }
            else {
                // Run the change detection inside the NgZone so that any async tasks as part of the change
                // detection are captured by the zone and can be waited for in isStable.
                this._ngZone.run(() => {
                    // Flush root effects before `detectChanges()`, to emulate the sequencing of `tick()`.
                    this.rootEffectScheduler.flush();
                    this.changeDetectorRef.detectChanges();
                    this.checkNoChanges();
                });
            }
        }
        finally {
            this.componentRef.changeDetectorRef.checkNoChanges = originalCheckNoChanges;
        }
        this.microtaskEffectScheduler.flush();
    }
    /**
     * Do a change detection run to make sure there were no changes.
     */
    checkNoChanges() {
        this.changeDetectorRef.checkNoChanges();
    }
    /**
     * Set whether the fixture should autodetect changes.
     *
     * Also runs detectChanges once so that any existing change is detected.
     *
     * @param autoDetect Whether to autodetect changes. By default, `true`.
     */
    autoDetectChanges(autoDetect = true) {
        if (this._noZoneOptionIsSet && !this.zonelessEnabled) {
            throw new Error('Cannot call autoDetectChanges when ComponentFixtureNoNgZone is set.');
        }
        if (autoDetect !== this.autoDetect) {
            if (autoDetect) {
                this._testAppRef.externalTestViews.add(this.componentRef.hostView);
            }
            else {
                this._testAppRef.externalTestViews.delete(this.componentRef.hostView);
            }
        }
        this.autoDetect = autoDetect;
        this.detectChanges();
    }
    /**
     * Return whether the fixture is currently stable or has async tasks that have not been completed
     * yet.
     */
    isStable() {
        return !this.pendingTasks.hasPendingTasks.value;
    }
    /**
     * Get a promise that resolves when the fixture is stable.
     *
     * This can be used to resume testing after events have triggered asynchronous activity or
     * asynchronous change detection.
     */
    whenStable() {
        if (this.isStable()) {
            return Promise.resolve(false);
        }
        return new Promise((resolve, reject) => {
            this.appErrorHandler.whenStableRejectFunctions.add(reject);
            this._appRef.whenStable().then(() => {
                this.appErrorHandler.whenStableRejectFunctions.delete(reject);
                resolve(true);
            });
        });
    }
    /**
     * Retrieves all defer block fixtures in the component fixture.
     */
    getDeferBlocks() {
        const deferBlocks = [];
        const lView = this.componentRef.hostView['_lView'];
        _getDeferBlocks(lView, deferBlocks);
        const deferBlockFixtures = [];
        for (const block of deferBlocks) {
            deferBlockFixtures.push(new DeferBlockFixture(block, this));
        }
        return Promise.resolve(deferBlockFixtures);
    }
    _getRenderer() {
        if (this._renderer === undefined) {
            this._renderer = this.componentRef.injector.get(RendererFactory2, null);
        }
        return this._renderer;
    }
    /**
     * Get a promise that resolves when the ui state is stable following animations.
     */
    whenRenderingDone() {
        const renderer = this._getRenderer();
        if (renderer && renderer.whenRenderingDone) {
            return renderer.whenRenderingDone();
        }
        return this.whenStable();
    }
    /**
     * Trigger component destruction.
     */
    destroy() {
        this.subscriptions.unsubscribe();
        this._testAppRef.externalTestViews.delete(this.componentRef.hostView);
        if (!this._isDestroyed) {
            this.componentRef.destroy();
            this._isDestroyed = true;
        }
    }
}

const _Zone = typeof Zone !== 'undefined' ? Zone : null;
const fakeAsyncTestModule = _Zone && _Zone[_Zone.__symbol__('fakeAsyncTest')];
const fakeAsyncTestModuleNotLoadedErrorMessage = `zone-testing.js is needed for the fakeAsync() test helper but could not be found.
        Please make sure that your environment includes zone.js/testing`;
/**
 * Clears out the shared fake async zone for a test.
 * To be called in a global `beforeEach`.
 *
 * @publicApi
 */
function resetFakeAsyncZone() {
    if (fakeAsyncTestModule) {
        return fakeAsyncTestModule.resetFakeAsyncZone();
    }
    throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);
}
function resetFakeAsyncZoneIfExists() {
    if (fakeAsyncTestModule && Zone['ProxyZoneSpec']?.isLoaded()) {
        fakeAsyncTestModule.resetFakeAsyncZone();
    }
}
/**
 * Wraps a function to be executed in the `fakeAsync` zone:
 * - Microtasks are manually executed by calling `flushMicrotasks()`.
 * - Timers are synchronous; `tick()` simulates the asynchronous passage of time.
 *
 * Can be used to wrap `inject()` calls.
 *
 * @param fn The function that you want to wrap in the `fakeAsync` zone.
 * @param options
 *   - flush: When true, will drain the macrotask queue after the test function completes.
 *     When false, will throw an exception at the end of the function if there are pending timers.
 *
 * @usageNotes
 * ### Example
 *
 * {@example core/testing/ts/fake_async.ts region='basic'}
 *
 *
 * @returns The function wrapped to be executed in the `fakeAsync` zone.
 * Any arguments passed when calling this returned function will be passed through to the `fn`
 * function in the parameters when it is called.
 *
 * @publicApi
 */
function fakeAsync(fn, options) {
    if (fakeAsyncTestModule) {
        return fakeAsyncTestModule.fakeAsync(fn, options);
    }
    throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);
}
/**
 * Simulates the asynchronous passage of time for the timers in the `fakeAsync` zone.
 *
 * The microtasks queue is drained at the very start of this function and after any timer callback
 * has been executed.
 *
 * @param millis The number of milliseconds to advance the virtual timer.
 * @param tickOptions The options to pass to the `tick()` function.
 *
 * @usageNotes
 *
 * The `tick()` option is a flag called `processNewMacroTasksSynchronously`,
 * which determines whether or not to invoke new macroTasks.
 *
 * If you provide a `tickOptions` object, but do not specify a
 * `processNewMacroTasksSynchronously` property (`tick(100, {})`),
 * then `processNewMacroTasksSynchronously` defaults to true.
 *
 * If you omit the `tickOptions` parameter (`tick(100))`), then
 * `tickOptions` defaults to `{processNewMacroTasksSynchronously: true}`.
 *
 * ### Example
 *
 * {@example core/testing/ts/fake_async.ts region='basic'}
 *
 * The following example includes a nested timeout (new macroTask), and
 * the `tickOptions` parameter is allowed to default. In this case,
 * `processNewMacroTasksSynchronously` defaults to true, and the nested
 * function is executed on each tick.
 *
 * ```ts
 * it ('test with nested setTimeout', fakeAsync(() => {
 *   let nestedTimeoutInvoked = false;
 *   function funcWithNestedTimeout() {
 *     setTimeout(() => {
 *       nestedTimeoutInvoked = true;
 *     });
 *   };
 *   setTimeout(funcWithNestedTimeout);
 *   tick();
 *   expect(nestedTimeoutInvoked).toBe(true);
 * }));
 * ```
 *
 * In the following case, `processNewMacroTasksSynchronously` is explicitly
 * set to false, so the nested timeout function is not invoked.
 *
 * ```ts
 * it ('test with nested setTimeout', fakeAsync(() => {
 *   let nestedTimeoutInvoked = false;
 *   function funcWithNestedTimeout() {
 *     setTimeout(() => {
 *       nestedTimeoutInvoked = true;
 *     });
 *   };
 *   setTimeout(funcWithNestedTimeout);
 *   tick(0, {processNewMacroTasksSynchronously: false});
 *   expect(nestedTimeoutInvoked).toBe(false);
 * }));
 * ```
 *
 *
 * @publicApi
 */
function tick(millis = 0, tickOptions = {
    processNewMacroTasksSynchronously: true,
}) {
    if (fakeAsyncTestModule) {
        return fakeAsyncTestModule.tick(millis, tickOptions);
    }
    throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);
}
/**
 * Flushes any pending microtasks and simulates the asynchronous passage of time for the timers in
 * the `fakeAsync` zone by
 * draining the macrotask queue until it is empty.
 *
 * @param maxTurns The maximum number of times the scheduler attempts to clear its queue before
 *     throwing an error.
 * @returns The simulated time elapsed, in milliseconds.
 *
 * @publicApi
 */
function flush(maxTurns) {
    if (fakeAsyncTestModule) {
        return fakeAsyncTestModule.flush(maxTurns);
    }
    throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);
}
/**
 * Discard all remaining periodic tasks.
 *
 * @publicApi
 */
function discardPeriodicTasks() {
    if (fakeAsyncTestModule) {
        return fakeAsyncTestModule.discardPeriodicTasks();
    }
    throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);
}
/**
 * Flush any pending microtasks.
 *
 * @publicApi
 */
function flushMicrotasks() {
    if (fakeAsyncTestModule) {
        return fakeAsyncTestModule.flushMicrotasks();
    }
    throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);
}

let _nextReferenceId = 0;
class MetadataOverrider {
    _references = new Map();
    /**
     * Creates a new instance for the given metadata class
     * based on an old instance and overrides.
     */
    overrideMetadata(metadataClass, oldMetadata, override) {
        const props = {};
        if (oldMetadata) {
            _valueProps(oldMetadata).forEach((prop) => (props[prop] = oldMetadata[prop]));
        }
        if (override.set) {
            if (override.remove || override.add) {
                throw new Error(`Cannot set and add/remove ${_stringify(metadataClass)} at the same time!`);
            }
            setMetadata(props, override.set);
        }
        if (override.remove) {
            removeMetadata(props, override.remove, this._references);
        }
        if (override.add) {
            addMetadata(props, override.add);
        }
        return new metadataClass(props);
    }
}
function removeMetadata(metadata, remove, references) {
    const removeObjects = new Set();
    for (const prop in remove) {
        const removeValue = remove[prop];
        if (Array.isArray(removeValue)) {
            removeValue.forEach((value) => {
                removeObjects.add(_propHashKey(prop, value, references));
            });
        }
        else {
            removeObjects.add(_propHashKey(prop, removeValue, references));
        }
    }
    for (const prop in metadata) {
        const propValue = metadata[prop];
        if (Array.isArray(propValue)) {
            metadata[prop] = propValue.filter((value) => !removeObjects.has(_propHashKey(prop, value, references)));
        }
        else {
            if (removeObjects.has(_propHashKey(prop, propValue, references))) {
                metadata[prop] = undefined;
            }
        }
    }
}
function addMetadata(metadata, add) {
    for (const prop in add) {
        const addValue = add[prop];
        const propValue = metadata[prop];
        if (propValue != null && Array.isArray(propValue)) {
            metadata[prop] = propValue.concat(addValue);
        }
        else {
            metadata[prop] = addValue;
        }
    }
}
function setMetadata(metadata, set) {
    for (const prop in set) {
        metadata[prop] = set[prop];
    }
}
function _propHashKey(propName, propValue, references) {
    let nextObjectId = 0;
    const objectIds = new Map();
    const replacer = (key, value) => {
        if (value !== null && typeof value === 'object') {
            if (objectIds.has(value)) {
                return objectIds.get(value);
            }
            // Record an id for this object such that any later references use the object's id instead
            // of the object itself, in order to break cyclic pointers in objects.
            objectIds.set(value, `ɵobj#${nextObjectId++}`);
            // The first time an object is seen the object itself is serialized.
            return value;
        }
        else if (typeof value === 'function') {
            value = _serializeReference(value, references);
        }
        return value;
    };
    return `${propName}:${JSON.stringify(propValue, replacer)}`;
}
function _serializeReference(ref, references) {
    let id = references.get(ref);
    if (!id) {
        id = `${_stringify(ref)}${_nextReferenceId++}`;
        references.set(ref, id);
    }
    return id;
}
function _valueProps(obj) {
    const props = [];
    // regular public props
    Object.keys(obj).forEach((prop) => {
        if (!prop.startsWith('_')) {
            props.push(prop);
        }
    });
    // getters
    let proto = obj;
    while ((proto = Object.getPrototypeOf(proto))) {
        Object.keys(proto).forEach((protoProp) => {
            const desc = Object.getOwnPropertyDescriptor(proto, protoProp);
            if (!protoProp.startsWith('_') && desc && 'get' in desc) {
                props.push(protoProp);
            }
        });
    }
    return props;
}

const reflection = new _ReflectionCapabilities();
/**
 * Allows to override ivy metadata for tests (via the `TestBed`).
 */
class OverrideResolver {
    overrides = new Map();
    resolved = new Map();
    addOverride(type, override) {
        const overrides = this.overrides.get(type) || [];
        overrides.push(override);
        this.overrides.set(type, overrides);
        this.resolved.delete(type);
    }
    setOverrides(overrides) {
        this.overrides.clear();
        overrides.forEach(([type, override]) => {
            this.addOverride(type, override);
        });
    }
    getAnnotation(type) {
        const annotations = reflection.annotations(type);
        // Try to find the nearest known Type annotation and make sure that this annotation is an
        // instance of the type we are looking for, so we can use it for resolution. Note: there might
        // be multiple known annotations found due to the fact that Components can extend Directives (so
        // both Directive and Component annotations would be present), so we always check if the known
        // annotation has the right type.
        for (let i = annotations.length - 1; i >= 0; i--) {
            const annotation = annotations[i];
            const isKnownType = annotation instanceof Directive ||
                annotation instanceof Component ||
                annotation instanceof Pipe ||
                annotation instanceof NgModule;
            if (isKnownType) {
                return annotation instanceof this.type ? annotation : null;
            }
        }
        return null;
    }
    resolve(type) {
        let resolved = this.resolved.get(type) || null;
        if (!resolved) {
            resolved = this.getAnnotation(type);
            if (resolved) {
                const overrides = this.overrides.get(type);
                if (overrides) {
                    const overrider = new MetadataOverrider();
                    overrides.forEach((override) => {
                        resolved = overrider.overrideMetadata(this.type, resolved, override);
                    });
                }
            }
            this.resolved.set(type, resolved);
        }
        return resolved;
    }
}
class DirectiveResolver extends OverrideResolver {
    get type() {
        return Directive;
    }
}
class ComponentResolver extends OverrideResolver {
    get type() {
        return Component;
    }
}
class PipeResolver extends OverrideResolver {
    get type() {
        return Pipe;
    }
}
class NgModuleResolver extends OverrideResolver {
    get type() {
        return NgModule;
    }
}

var TestingModuleOverride;
(function (TestingModuleOverride) {
    TestingModuleOverride[TestingModuleOverride["DECLARATION"] = 0] = "DECLARATION";
    TestingModuleOverride[TestingModuleOverride["OVERRIDE_TEMPLATE"] = 1] = "OVERRIDE_TEMPLATE";
})(TestingModuleOverride || (TestingModuleOverride = {}));
function isTestingModuleOverride(value) {
    return (value === TestingModuleOverride.DECLARATION || value === TestingModuleOverride.OVERRIDE_TEMPLATE);
}
function assertNoStandaloneComponents(types, resolver, location) {
    types.forEach((type) => {
        if (!_getAsyncClassMetadataFn(type)) {
            const component = resolver.resolve(type);
            if (component && (component.standalone == null || component.standalone)) {
                throw new Error(_generateStandaloneInDeclarationsError(type, location));
            }
        }
    });
}
class TestBedCompiler {
    platform;
    additionalModuleTypes;
    originalComponentResolutionQueue = null;
    // Testing module configuration
    declarations = [];
    imports = [];
    providers = [];
    schemas = [];
    // Queues of components/directives/pipes that should be recompiled.
    pendingComponents = new Set();
    pendingDirectives = new Set();
    pendingPipes = new Set();
    // Set of components with async metadata, i.e. components with `@defer` blocks
    // in their templates.
    componentsWithAsyncMetadata = new Set();
    // Keep track of all components and directives, so we can patch Providers onto defs later.
    seenComponents = new Set();
    seenDirectives = new Set();
    // Keep track of overridden modules, so that we can collect all affected ones in the module tree.
    overriddenModules = new Set();
    // Store resolved styles for Components that have template overrides present and `styleUrls`
    // defined at the same time.
    existingComponentStyles = new Map();
    resolvers = initResolvers();
    // Map of component type to an NgModule that declares it.
    //
    // There are a couple special cases:
    // - for standalone components, the module scope value is `null`
    // - when a component is declared in `TestBed.configureTestingModule()` call or
    //   a component's template is overridden via `TestBed.overrideTemplateUsingTestingModule()`.
    //   we use a special value from the `TestingModuleOverride` enum.
    componentToModuleScope = new Map();
    // Map that keeps initial version of component/directive/pipe defs in case
    // we compile a Type again, thus overriding respective static fields. This is
    // required to make sure we restore defs to their initial states between test runs.
    // Note: one class may have multiple defs (for example: ɵmod and ɵinj in case of an
    // NgModule), store all of them in a map.
    initialNgDefs = new Map();
    // Array that keeps cleanup operations for initial versions of component/directive/pipe/module
    // defs in case TestBed makes changes to the originals.
    defCleanupOps = [];
    _injector = null;
    compilerProviders = null;
    providerOverrides = [];
    rootProviderOverrides = [];
    // Overrides for injectables with `{providedIn: SomeModule}` need to be tracked and added to that
    // module's provider list.
    providerOverridesByModule = new Map();
    providerOverridesByToken = new Map();
    scopesWithOverriddenProviders = new Set();
    testModuleType;
    testModuleRef = null;
    deferBlockBehavior = DEFER_BLOCK_DEFAULT_BEHAVIOR;
    rethrowApplicationTickErrors = RETHROW_APPLICATION_ERRORS_DEFAULT;
    constructor(platform, additionalModuleTypes) {
        this.platform = platform;
        this.additionalModuleTypes = additionalModuleTypes;
        class DynamicTestModule {
        }
        this.testModuleType = DynamicTestModule;
    }
    setCompilerProviders(providers) {
        this.compilerProviders = providers;
        this._injector = null;
    }
    configureTestingModule(moduleDef) {
        // Enqueue any compilation tasks for the directly declared component.
        if (moduleDef.declarations !== undefined) {
            // Verify that there are no standalone components
            assertNoStandaloneComponents(moduleDef.declarations, this.resolvers.component, '"TestBed.configureTestingModule" call');
            this.queueTypeArray(moduleDef.declarations, TestingModuleOverride.DECLARATION);
            this.declarations.push(...moduleDef.declarations);
        }
        // Enqueue any compilation tasks for imported modules.
        if (moduleDef.imports !== undefined) {
            this.queueTypesFromModulesArray(moduleDef.imports);
            this.imports.push(...moduleDef.imports);
        }
        if (moduleDef.providers !== undefined) {
            this.providers.push(...moduleDef.providers);
        }
        if (moduleDef.schemas !== undefined) {
            this.schemas.push(...moduleDef.schemas);
        }
        this.deferBlockBehavior = moduleDef.deferBlockBehavior ?? DEFER_BLOCK_DEFAULT_BEHAVIOR;
        this.rethrowApplicationTickErrors =
            moduleDef.rethrowApplicationErrors ?? RETHROW_APPLICATION_ERRORS_DEFAULT;
    }
    overrideModule(ngModule, override) {
        if (_USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {
            _depsTracker.clearScopeCacheFor(ngModule);
        }
        this.overriddenModules.add(ngModule);
        // Compile the module right away.
        this.resolvers.module.addOverride(ngModule, override);
        const metadata = this.resolvers.module.resolve(ngModule);
        if (metadata === null) {
            throw invalidTypeError(ngModule.name, 'NgModule');
        }
        this.recompileNgModule(ngModule, metadata);
        // At this point, the module has a valid module def (ɵmod), but the override may have introduced
        // new declarations or imported modules. Ingest any possible new types and add them to the
        // current queue.
        this.queueTypesFromModulesArray([ngModule]);
    }
    overrideComponent(component, override) {
        this.verifyNoStandaloneFlagOverrides(component, override);
        this.resolvers.component.addOverride(component, override);
        this.pendingComponents.add(component);
        // If this is a component with async metadata (i.e. a component with a `@defer` block
        // in a template) - store it for future processing.
        this.maybeRegisterComponentWithAsyncMetadata(component);
    }
    overrideDirective(directive, override) {
        this.verifyNoStandaloneFlagOverrides(directive, override);
        this.resolvers.directive.addOverride(directive, override);
        this.pendingDirectives.add(directive);
    }
    overridePipe(pipe, override) {
        this.verifyNoStandaloneFlagOverrides(pipe, override);
        this.resolvers.pipe.addOverride(pipe, override);
        this.pendingPipes.add(pipe);
    }
    verifyNoStandaloneFlagOverrides(type, override) {
        if (override.add?.hasOwnProperty('standalone') ||
            override.set?.hasOwnProperty('standalone') ||
            override.remove?.hasOwnProperty('standalone')) {
            throw new Error(`An override for the ${type.name} class has the \`standalone\` flag. ` +
                `Changing the \`standalone\` flag via TestBed overrides is not supported.`);
        }
    }
    overrideProvider(token, provider) {
        let providerDef;
        if (provider.useFactory !== undefined) {
            providerDef = {
                provide: token,
                useFactory: provider.useFactory,
                deps: provider.deps || [],
                multi: provider.multi,
            };
        }
        else if (provider.useValue !== undefined) {
            providerDef = { provide: token, useValue: provider.useValue, multi: provider.multi };
        }
        else {
            providerDef = { provide: token };
        }
        const injectableDef = typeof token !== 'string' ? _getInjectableDef(token) : null;
        const providedIn = injectableDef === null ? null : resolveForwardRef(injectableDef.providedIn);
        const overridesBucket = providedIn === 'root' ? this.rootProviderOverrides : this.providerOverrides;
        overridesBucket.push(providerDef);
        // Keep overrides grouped by token as well for fast lookups using token
        this.providerOverridesByToken.set(token, providerDef);
        if (injectableDef !== null && providedIn !== null && typeof providedIn !== 'string') {
            const existingOverrides = this.providerOverridesByModule.get(providedIn);
            if (existingOverrides !== undefined) {
                existingOverrides.push(providerDef);
            }
            else {
                this.providerOverridesByModule.set(providedIn, [providerDef]);
            }
        }
    }
    overrideTemplateUsingTestingModule(type, template) {
        const def = type[_NG_COMP_DEF];
        const hasStyleUrls = () => {
            const metadata = this.resolvers.component.resolve(type);
            return !!metadata.styleUrl || !!metadata.styleUrls?.length;
        };
        const overrideStyleUrls = !!def && !_isComponentDefPendingResolution(type) && hasStyleUrls();
        // In Ivy, compiling a component does not require knowing the module providing the
        // component's scope, so overrideTemplateUsingTestingModule can be implemented purely via
        // overrideComponent. Important: overriding template requires full Component re-compilation,
        // which may fail in case styleUrls are also present (thus Component is considered as required
        // resolution). In order to avoid this, we preemptively set styleUrls to an empty array,
        // preserve current styles available on Component def and restore styles back once compilation
        // is complete.
        const override = overrideStyleUrls
            ? { template, styles: [], styleUrls: [], styleUrl: undefined }
            : { template };
        this.overrideComponent(type, { set: override });
        if (overrideStyleUrls && def.styles && def.styles.length > 0) {
            this.existingComponentStyles.set(type, def.styles);
        }
        // Set the component's scope to be the testing module.
        this.componentToModuleScope.set(type, TestingModuleOverride.OVERRIDE_TEMPLATE);
    }
    async resolvePendingComponentsWithAsyncMetadata() {
        if (this.componentsWithAsyncMetadata.size === 0)
            return;
        const promises = [];
        for (const component of this.componentsWithAsyncMetadata) {
            const asyncMetadataFn = _getAsyncClassMetadataFn(component);
            if (asyncMetadataFn) {
                promises.push(asyncMetadataFn());
            }
        }
        this.componentsWithAsyncMetadata.clear();
        const resolvedDeps = await Promise.all(promises);
        const flatResolvedDeps = resolvedDeps.flat(2);
        this.queueTypesFromModulesArray(flatResolvedDeps);
        // Loaded standalone components might contain imports of NgModules
        // with providers, make sure we override providers there too.
        for (const component of flatResolvedDeps) {
            this.applyProviderOverridesInScope(component);
        }
    }
    async compileComponents() {
        this.clearComponentResolutionQueue();
        // Wait for all async metadata for components that were
        // overridden, we need resolved metadata to perform an override
        // and re-compile a component.
        await this.resolvePendingComponentsWithAsyncMetadata();
        // Verify that there were no standalone components present in the `declarations` field
        // during the `TestBed.configureTestingModule` call. We perform this check here in addition
        // to the logic in the `configureTestingModule` function, since at this point we have
        // all async metadata resolved.
        assertNoStandaloneComponents(this.declarations, this.resolvers.component, '"TestBed.configureTestingModule" call');
        // Run compilers for all queued types.
        let needsAsyncResources = this.compileTypesSync();
        // compileComponents() should not be async unless it needs to be.
        if (needsAsyncResources) {
            let resourceLoader;
            let resolver = (url) => {
                if (!resourceLoader) {
                    resourceLoader = this.injector.get(ResourceLoader);
                }
                return Promise.resolve(resourceLoader.get(url));
            };
            await _resolveComponentResources(resolver);
        }
    }
    finalize() {
        // One last compile
        this.compileTypesSync();
        // Create the testing module itself.
        this.compileTestModule();
        this.applyTransitiveScopes();
        this.applyProviderOverrides();
        // Patch previously stored `styles` Component values (taken from ɵcmp), in case these
        // Components have `styleUrls` fields defined and template override was requested.
        this.patchComponentsWithExistingStyles();
        // Clear the componentToModuleScope map, so that future compilations don't reset the scope of
        // every component.
        this.componentToModuleScope.clear();
        const parentInjector = this.platform.injector;
        this.testModuleRef = new _Render3NgModuleRef(this.testModuleType, parentInjector, []);
        // ApplicationInitStatus.runInitializers() is marked @internal to core.
        // Cast it to any before accessing it.
        this.testModuleRef.injector.get(ApplicationInitStatus).runInitializers();
        // Set locale ID after running app initializers, since locale information might be updated while
        // running initializers. This is also consistent with the execution order while bootstrapping an
        // app (see `packages/core/src/application_ref.ts` file).
        const localeId = this.testModuleRef.injector.get(LOCALE_ID, _DEFAULT_LOCALE_ID);
        _setLocaleId(localeId);
        return this.testModuleRef;
    }
    /**
     * @internal
     */
    _compileNgModuleSync(moduleType) {
        this.queueTypesFromModulesArray([moduleType]);
        this.compileTypesSync();
        this.applyProviderOverrides();
        this.applyProviderOverridesInScope(moduleType);
        this.applyTransitiveScopes();
    }
    /**
     * @internal
     */
    async _compileNgModuleAsync(moduleType) {
        this.queueTypesFromModulesArray([moduleType]);
        await this.compileComponents();
        this.applyProviderOverrides();
        this.applyProviderOverridesInScope(moduleType);
        this.applyTransitiveScopes();
    }
    /**
     * @internal
     */
    _getModuleResolver() {
        return this.resolvers.module;
    }
    /**
     * @internal
     */
    _getComponentFactories(moduleType) {
        return maybeUnwrapFn(moduleType.ɵmod.declarations).reduce((factories, declaration) => {
            const componentDef = declaration.ɵcmp;
            componentDef && factories.push(new _Render3ComponentFactory(componentDef, this.testModuleRef));
            return factories;
        }, []);
    }
    compileTypesSync() {
        // Compile all queued components, directives, pipes.
        let needsAsyncResources = false;
        this.pendingComponents.forEach((declaration) => {
            if (_getAsyncClassMetadataFn(declaration)) {
                throw new Error(`Component '${declaration.name}' has unresolved metadata. ` +
                    `Please call \`await TestBed.compileComponents()\` before running this test.`);
            }
            needsAsyncResources = needsAsyncResources || _isComponentDefPendingResolution(declaration);
            const metadata = this.resolvers.component.resolve(declaration);
            if (metadata === null) {
                throw invalidTypeError(declaration.name, 'Component');
            }
            this.maybeStoreNgDef(_NG_COMP_DEF, declaration);
            if (_USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {
                _depsTracker.clearScopeCacheFor(declaration);
            }
            _compileComponent(declaration, metadata);
        });
        this.pendingComponents.clear();
        this.pendingDirectives.forEach((declaration) => {
            const metadata = this.resolvers.directive.resolve(declaration);
            if (metadata === null) {
                throw invalidTypeError(declaration.name, 'Directive');
            }
            this.maybeStoreNgDef(_NG_DIR_DEF, declaration);
            _compileDirective(declaration, metadata);
        });
        this.pendingDirectives.clear();
        this.pendingPipes.forEach((declaration) => {
            const metadata = this.resolvers.pipe.resolve(declaration);
            if (metadata === null) {
                throw invalidTypeError(declaration.name, 'Pipe');
            }
            this.maybeStoreNgDef(_NG_PIPE_DEF, declaration);
            _compilePipe(declaration, metadata);
        });
        this.pendingPipes.clear();
        return needsAsyncResources;
    }
    applyTransitiveScopes() {
        if (this.overriddenModules.size > 0) {
            // Module overrides (via `TestBed.overrideModule`) might affect scopes that were previously
            // calculated and stored in `transitiveCompileScopes`. If module overrides are present,
            // collect all affected modules and reset scopes to force their re-calculation.
            const testingModuleDef = this.testModuleType[_NG_MOD_DEF];
            const affectedModules = this.collectModulesAffectedByOverrides(testingModuleDef.imports);
            if (affectedModules.size > 0) {
                affectedModules.forEach((moduleType) => {
                    if (!_USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {
                        this.storeFieldOfDefOnType(moduleType, _NG_MOD_DEF, 'transitiveCompileScopes');
                        moduleType[_NG_MOD_DEF].transitiveCompileScopes = null;
                    }
                    else {
                        _depsTracker.clearScopeCacheFor(moduleType);
                    }
                });
            }
        }
        const moduleToScope = new Map();
        const getScopeOfModule = (moduleType) => {
            if (!moduleToScope.has(moduleType)) {
                const isTestingModule = isTestingModuleOverride(moduleType);
                const realType = isTestingModule ? this.testModuleType : moduleType;
                moduleToScope.set(moduleType, _transitiveScopesFor(realType));
            }
            return moduleToScope.get(moduleType);
        };
        this.componentToModuleScope.forEach((moduleType, componentType) => {
            if (moduleType !== null) {
                const moduleScope = getScopeOfModule(moduleType);
                this.storeFieldOfDefOnType(componentType, _NG_COMP_DEF, 'directiveDefs');
                this.storeFieldOfDefOnType(componentType, _NG_COMP_DEF, 'pipeDefs');
                _patchComponentDefWithScope(getComponentDef(componentType), moduleScope);
            }
            // `tView` that is stored on component def contains information about directives and pipes
            // that are in the scope of this component. Patching component scope will cause `tView` to be
            // changed. Store original `tView` before patching scope, so the `tView` (including scope
            // information) is restored back to its previous/original state before running next test.
            // Resetting `tView` is also needed for cases when we apply provider overrides and those
            // providers are defined on component's level, in which case they may end up included into
            // `tView.blueprint`.
            this.storeFieldOfDefOnType(componentType, _NG_COMP_DEF, 'tView');
        });
        this.componentToModuleScope.clear();
    }
    applyProviderOverrides() {
        const maybeApplyOverrides = (field) => (type) => {
            const resolver = field === _NG_COMP_DEF ? this.resolvers.component : this.resolvers.directive;
            const metadata = resolver.resolve(type);
            if (this.hasProviderOverrides(metadata.providers)) {
                this.patchDefWithProviderOverrides(type, field);
            }
        };
        this.seenComponents.forEach(maybeApplyOverrides(_NG_COMP_DEF));
        this.seenDirectives.forEach(maybeApplyOverrides(_NG_DIR_DEF));
        this.seenComponents.clear();
        this.seenDirectives.clear();
    }
    /**
     * Applies provider overrides to a given type (either an NgModule or a standalone component)
     * and all imported NgModules and standalone components recursively.
     */
    applyProviderOverridesInScope(type) {
        const hasScope = isStandaloneComponent(type) || isNgModule(type);
        // The function can be re-entered recursively while inspecting dependencies
        // of an NgModule or a standalone component. Exit early if we come across a
        // type that can not have a scope (directive or pipe) or the type is already
        // processed earlier.
        if (!hasScope || this.scopesWithOverriddenProviders.has(type)) {
            return;
        }
        this.scopesWithOverriddenProviders.add(type);
        // NOTE: the line below triggers JIT compilation of the module injector,
        // which also invokes verification of the NgModule semantics, which produces
        // detailed error messages. The fact that the code relies on this line being
        // present here is suspicious and should be refactored in a way that the line
        // below can be moved (for ex. after an early exit check below).
        const injectorDef = type[_NG_INJ_DEF];
        // No provider overrides, exit early.
        if (this.providerOverridesByToken.size === 0)
            return;
        if (isStandaloneComponent(type)) {
            // Visit all component dependencies and override providers there.
            const def = getComponentDef(type);
            const dependencies = maybeUnwrapFn(def.dependencies ?? []);
            for (const dependency of dependencies) {
                this.applyProviderOverridesInScope(dependency);
            }
        }
        else {
            const providers = [
                ...injectorDef.providers,
                ...(this.providerOverridesByModule.get(type) || []),
            ];
            if (this.hasProviderOverrides(providers)) {
                this.maybeStoreNgDef(_NG_INJ_DEF, type);
                this.storeFieldOfDefOnType(type, _NG_INJ_DEF, 'providers');
                injectorDef.providers = this.getOverriddenProviders(providers);
            }
            // Apply provider overrides to imported modules recursively
            const moduleDef = type[_NG_MOD_DEF];
            const imports = maybeUnwrapFn(moduleDef.imports);
            for (const importedModule of imports) {
                this.applyProviderOverridesInScope(importedModule);
            }
            // Also override the providers on any ModuleWithProviders imports since those don't appear in
            // the moduleDef.
            for (const importedModule of flatten(injectorDef.imports)) {
                if (isModuleWithProviders(importedModule)) {
                    this.defCleanupOps.push({
                        object: importedModule,
                        fieldName: 'providers',
                        originalValue: importedModule.providers,
                    });
                    importedModule.providers = this.getOverriddenProviders(importedModule.providers);
                }
            }
        }
    }
    patchComponentsWithExistingStyles() {
        this.existingComponentStyles.forEach((styles, type) => (type[_NG_COMP_DEF].styles = styles));
        this.existingComponentStyles.clear();
    }
    queueTypeArray(arr, moduleType) {
        for (const value of arr) {
            if (Array.isArray(value)) {
                this.queueTypeArray(value, moduleType);
            }
            else {
                this.queueType(value, moduleType);
            }
        }
    }
    recompileNgModule(ngModule, metadata) {
        // Cache the initial ngModuleDef as it will be overwritten.
        this.maybeStoreNgDef(_NG_MOD_DEF, ngModule);
        this.maybeStoreNgDef(_NG_INJ_DEF, ngModule);
        _compileNgModuleDefs(ngModule, metadata);
    }
    maybeRegisterComponentWithAsyncMetadata(type) {
        const asyncMetadataFn = _getAsyncClassMetadataFn(type);
        if (asyncMetadataFn) {
            this.componentsWithAsyncMetadata.add(type);
        }
    }
    queueType(type, moduleType) {
        // If this is a component with async metadata (i.e. a component with a `@defer` block
        // in a template) - store it for future processing.
        this.maybeRegisterComponentWithAsyncMetadata(type);
        const component = this.resolvers.component.resolve(type);
        if (component) {
            // Check whether a give Type has respective NG def (ɵcmp) and compile if def is
            // missing. That might happen in case a class without any Angular decorators extends another
            // class where Component/Directive/Pipe decorator is defined.
            if (_isComponentDefPendingResolution(type) || !type.hasOwnProperty(_NG_COMP_DEF)) {
                this.pendingComponents.add(type);
            }
            this.seenComponents.add(type);
            // Keep track of the module which declares this component, so later the component's scope
            // can be set correctly. If the component has already been recorded here, then one of several
            // cases is true:
            // * the module containing the component was imported multiple times (common).
            // * the component is declared in multiple modules (which is an error).
            // * the component was in 'declarations' of the testing module, and also in an imported module
            //   in which case the module scope will be TestingModuleOverride.DECLARATION.
            // * overrideTemplateUsingTestingModule was called for the component in which case the module
            //   scope will be TestingModuleOverride.OVERRIDE_TEMPLATE.
            //
            // If the component was previously in the testing module's 'declarations' (meaning the
            // current value is TestingModuleOverride.DECLARATION), then `moduleType` is the component's
            // real module, which was imported. This pattern is understood to mean that the component
            // should use its original scope, but that the testing module should also contain the
            // component in its scope.
            if (!this.componentToModuleScope.has(type) ||
                this.componentToModuleScope.get(type) === TestingModuleOverride.DECLARATION) {
                this.componentToModuleScope.set(type, moduleType);
            }
            return;
        }
        const directive = this.resolvers.directive.resolve(type);
        if (directive) {
            if (!type.hasOwnProperty(_NG_DIR_DEF)) {
                this.pendingDirectives.add(type);
            }
            this.seenDirectives.add(type);
            return;
        }
        const pipe = this.resolvers.pipe.resolve(type);
        if (pipe && !type.hasOwnProperty(_NG_PIPE_DEF)) {
            this.pendingPipes.add(type);
            return;
        }
    }
    queueTypesFromModulesArray(arr) {
        // Because we may encounter the same NgModule or a standalone Component while processing
        // the dependencies of an NgModule or a standalone Component, we cache them in this set so we
        // can skip ones that have already been seen encountered. In some test setups, this caching
        // resulted in 10X runtime improvement.
        const processedDefs = new Set();
        const queueTypesFromModulesArrayRecur = (arr) => {
            for (const value of arr) {
                if (Array.isArray(value)) {
                    queueTypesFromModulesArrayRecur(value);
                }
                else if (hasNgModuleDef(value)) {
                    const def = value.ɵmod;
                    if (processedDefs.has(def)) {
                        continue;
                    }
                    processedDefs.add(def);
                    // Look through declarations, imports, and exports, and queue
                    // everything found there.
                    this.queueTypeArray(maybeUnwrapFn(def.declarations), value);
                    queueTypesFromModulesArrayRecur(maybeUnwrapFn(def.imports));
                    queueTypesFromModulesArrayRecur(maybeUnwrapFn(def.exports));
                }
                else if (isModuleWithProviders(value)) {
                    queueTypesFromModulesArrayRecur([value.ngModule]);
                }
                else if (isStandaloneComponent(value)) {
                    this.queueType(value, null);
                    const def = getComponentDef(value);
                    if (processedDefs.has(def)) {
                        continue;
                    }
                    processedDefs.add(def);
                    const dependencies = maybeUnwrapFn(def.dependencies ?? []);
                    dependencies.forEach((dependency) => {
                        // Note: in AOT, the `dependencies` might also contain regular
                        // (NgModule-based) Component, Directive and Pipes, so we handle
                        // them separately and proceed with recursive process for standalone
                        // Components and NgModules only.
                        if (isStandaloneComponent(dependency) || hasNgModuleDef(dependency)) {
                            queueTypesFromModulesArrayRecur([dependency]);
                        }
                        else {
                            this.queueType(dependency, null);
                        }
                    });
                }
            }
        };
        queueTypesFromModulesArrayRecur(arr);
    }
    // When module overrides (via `TestBed.overrideModule`) are present, it might affect all modules
    // that import (even transitively) an overridden one. For all affected modules we need to
    // recalculate their scopes for a given test run and restore original scopes at the end. The goal
    // of this function is to collect all affected modules in a set for further processing. Example:
    // if we have the following module hierarchy: A -> B -> C (where `->` means `imports`) and module
    // `C` is overridden, we consider `A` and `B` as affected, since their scopes might become
    // invalidated with the override.
    collectModulesAffectedByOverrides(arr) {
        const seenModules = new Set();
        const affectedModules = new Set();
        const calcAffectedModulesRecur = (arr, path) => {
            for (const value of arr) {
                if (Array.isArray(value)) {
                    // If the value is an array, just flatten it (by invoking this function recursively),
                    // keeping "path" the same.
                    calcAffectedModulesRecur(value, path);
                }
                else if (hasNgModuleDef(value)) {
                    if (seenModules.has(value)) {
                        // If we've seen this module before and it's included into "affected modules" list, mark
                        // the whole path that leads to that module as affected, but do not descend into its
                        // imports, since we already examined them before.
                        if (affectedModules.has(value)) {
                            path.forEach((item) => affectedModules.add(item));
                        }
                        continue;
                    }
                    seenModules.add(value);
                    if (this.overriddenModules.has(value)) {
                        path.forEach((item) => affectedModules.add(item));
                    }
                    // Examine module imports recursively to look for overridden modules.
                    const moduleDef = value[_NG_MOD_DEF];
                    calcAffectedModulesRecur(maybeUnwrapFn(moduleDef.imports), path.concat(value));
                }
            }
        };
        calcAffectedModulesRecur(arr, []);
        return affectedModules;
    }
    /**
     * Preserve an original def (such as ɵmod, ɵinj, etc) before applying an override.
     * Note: one class may have multiple defs (for example: ɵmod and ɵinj in case of
     * an NgModule). If there is a def in a set already, don't override it, since
     * an original one should be restored at the end of a test.
     */
    maybeStoreNgDef(prop, type) {
        if (!this.initialNgDefs.has(type)) {
            this.initialNgDefs.set(type, new Map());
        }
        const currentDefs = this.initialNgDefs.get(type);
        if (!currentDefs.has(prop)) {
            const currentDef = Object.getOwnPropertyDescriptor(type, prop);
            currentDefs.set(prop, currentDef);
        }
    }
    storeFieldOfDefOnType(type, defField, fieldName) {
        const def = type[defField];
        const originalValue = def[fieldName];
        this.defCleanupOps.push({ object: def, fieldName, originalValue });
    }
    /**
     * Clears current components resolution queue, but stores the state of the queue, so we can
     * restore it later. Clearing the queue is required before we try to compile components (via
     * `TestBed.compileComponents`), so that component defs are in sync with the resolution queue.
     */
    clearComponentResolutionQueue() {
        if (this.originalComponentResolutionQueue === null) {
            this.originalComponentResolutionQueue = new Map();
        }
        _clearResolutionOfComponentResourcesQueue().forEach((value, key) => this.originalComponentResolutionQueue.set(key, value));
    }
    /*
     * Restores component resolution queue to the previously saved state. This operation is performed
     * as a part of restoring the state after completion of the current set of tests (that might
     * potentially mutate the state).
     */
    restoreComponentResolutionQueue() {
        if (this.originalComponentResolutionQueue !== null) {
            _restoreComponentResolutionQueue(this.originalComponentResolutionQueue);
            this.originalComponentResolutionQueue = null;
        }
    }
    restoreOriginalState() {
        // Process cleanup ops in reverse order so the field's original value is restored correctly (in
        // case there were multiple overrides for the same field).
        forEachRight(this.defCleanupOps, (op) => {
            op.object[op.fieldName] = op.originalValue;
        });
        // Restore initial component/directive/pipe defs
        this.initialNgDefs.forEach((defs, type) => {
            if (_USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {
                _depsTracker.clearScopeCacheFor(type);
            }
            defs.forEach((descriptor, prop) => {
                if (!descriptor) {
                    // Delete operations are generally undesirable since they have performance
                    // implications on objects they were applied to. In this particular case, situations
                    // where this code is invoked should be quite rare to cause any noticeable impact,
                    // since it's applied only to some test cases (for example when class with no
                    // annotations extends some @Component) when we need to clear 'ɵcmp' field on a given
                    // class to restore its original state (before applying overrides and running tests).
                    delete type[prop];
                }
                else {
                    Object.defineProperty(type, prop, descriptor);
                }
            });
        });
        this.initialNgDefs.clear();
        this.scopesWithOverriddenProviders.clear();
        this.restoreComponentResolutionQueue();
        // Restore    the locale ID to the default value, this shouldn't be necessary but we never know
        _setLocaleId(_DEFAULT_LOCALE_ID);
    }
    compileTestModule() {
        class RootScopeModule {
        }
        _compileNgModuleDefs(RootScopeModule, {
            providers: [
                ...this.rootProviderOverrides,
                _internalProvideZoneChangeDetection({}),
                TestBedApplicationErrorHandler,
                { provide: _ChangeDetectionScheduler, useExisting: _ChangeDetectionSchedulerImpl },
            ],
        });
        const providers = [
            { provide: Compiler, useFactory: () => new R3TestCompiler(this) },
            { provide: _DEFER_BLOCK_CONFIG, useValue: { behavior: this.deferBlockBehavior } },
            {
                provide: _INTERNAL_APPLICATION_ERROR_HANDLER,
                useFactory: () => {
                    if (this.rethrowApplicationTickErrors) {
                        const handler = inject$1(TestBedApplicationErrorHandler);
                        return (e) => {
                            handler.handleError(e);
                        };
                    }
                    else {
                        const userErrorHandler = inject$1(ErrorHandler);
                        const ngZone = inject$1(NgZone);
                        return (e) => ngZone.runOutsideAngular(() => userErrorHandler.handleError(e));
                    }
                },
            },
            ...this.providers,
            ...this.providerOverrides,
        ];
        const imports = [RootScopeModule, this.additionalModuleTypes, this.imports || []];
        _compileNgModuleDefs(this.testModuleType, {
            declarations: this.declarations,
            imports,
            schemas: this.schemas,
            providers,
        }, 
        /* allowDuplicateDeclarationsInRoot */ true);
        this.applyProviderOverridesInScope(this.testModuleType);
    }
    get injector() {
        if (this._injector !== null) {
            return this._injector;
        }
        const providers = [];
        const compilerOptions = this.platform.injector.get(COMPILER_OPTIONS, []);
        compilerOptions.forEach((opts) => {
            if (opts.providers) {
                providers.push(opts.providers);
            }
        });
        if (this.compilerProviders !== null) {
            providers.push(...this.compilerProviders);
        }
        this._injector = Injector.create({ providers, parent: this.platform.injector });
        return this._injector;
    }
    // get overrides for a specific provider (if any)
    getSingleProviderOverrides(provider) {
        const token = getProviderToken(provider);
        return this.providerOverridesByToken.get(token) || null;
    }
    getProviderOverrides(providers) {
        if (!providers || !providers.length || this.providerOverridesByToken.size === 0)
            return [];
        // There are two flattening operations here. The inner flattenProviders() operates on the
        // metadata's providers and applies a mapping function which retrieves overrides for each
        // incoming provider. The outer flatten() then flattens the produced overrides array. If this is
        // not done, the array can contain other empty arrays (e.g. `[[], []]`) which leak into the
        // providers array and contaminate any error messages that might be generated.
        return flatten(flattenProviders(providers, (provider) => this.getSingleProviderOverrides(provider) || []));
    }
    getOverriddenProviders(providers) {
        if (!providers || !providers.length || this.providerOverridesByToken.size === 0)
            return [];
        const flattenedProviders = flattenProviders(providers);
        const overrides = this.getProviderOverrides(flattenedProviders);
        const overriddenProviders = [...flattenedProviders, ...overrides];
        const final = [];
        const seenOverriddenProviders = new Set();
        // We iterate through the list of providers in reverse order to make sure provider overrides
        // take precedence over the values defined in provider list. We also filter out all providers
        // that have overrides, keeping overridden values only. This is needed, since presence of a
        // provider with `ngOnDestroy` hook will cause this hook to be registered and invoked later.
        forEachRight(overriddenProviders, (provider) => {
            const token = getProviderToken(provider);
            if (this.providerOverridesByToken.has(token)) {
                if (!seenOverriddenProviders.has(token)) {
                    seenOverriddenProviders.add(token);
                    // Treat all overridden providers as `{multi: false}` (even if it's a multi-provider) to
                    // make sure that provided override takes highest precedence and is not combined with
                    // other instances of the same multi provider.
                    final.unshift({ ...provider, multi: false });
                }
            }
            else {
                final.unshift(provider);
            }
        });
        return final;
    }
    hasProviderOverrides(providers) {
        return this.getProviderOverrides(providers).length > 0;
    }
    patchDefWithProviderOverrides(declaration, field) {
        const def = declaration[field];
        if (def && def.providersResolver) {
            this.maybeStoreNgDef(field, declaration);
            const resolver = def.providersResolver;
            const processProvidersFn = (providers) => this.getOverriddenProviders(providers);
            this.storeFieldOfDefOnType(declaration, field, 'providersResolver');
            def.providersResolver = (ngDef) => resolver(ngDef, processProvidersFn);
        }
    }
}
function initResolvers() {
    return {
        module: new NgModuleResolver(),
        component: new ComponentResolver(),
        directive: new DirectiveResolver(),
        pipe: new PipeResolver(),
    };
}
function isStandaloneComponent(value) {
    const def = getComponentDef(value);
    return !!def?.standalone;
}
function getComponentDef(value) {
    return value.ɵcmp ?? null;
}
function hasNgModuleDef(value) {
    return value.hasOwnProperty('ɵmod');
}
function isNgModule(value) {
    return hasNgModuleDef(value);
}
function maybeUnwrapFn(maybeFn) {
    return maybeFn instanceof Function ? maybeFn() : maybeFn;
}
function flatten(values) {
    const out = [];
    values.forEach((value) => {
        if (Array.isArray(value)) {
            out.push(...flatten(value));
        }
        else {
            out.push(value);
        }
    });
    return out;
}
function identityFn(value) {
    return value;
}
function flattenProviders(providers, mapFn = identityFn) {
    const out = [];
    for (let provider of providers) {
        if (_isEnvironmentProviders(provider)) {
            provider = provider.ɵproviders;
        }
        if (Array.isArray(provider)) {
            out.push(...flattenProviders(provider, mapFn));
        }
        else {
            out.push(mapFn(provider));
        }
    }
    return out;
}
function getProviderField(provider, field) {
    return provider && typeof provider === 'object' && provider[field];
}
function getProviderToken(provider) {
    return getProviderField(provider, 'provide') || provider;
}
function isModuleWithProviders(value) {
    return value.hasOwnProperty('ngModule');
}
function forEachRight(values, fn) {
    for (let idx = values.length - 1; idx >= 0; idx--) {
        fn(values[idx], idx);
    }
}
function invalidTypeError(name, expectedType) {
    return new Error(`${name} class doesn't have @${expectedType} decorator or is missing metadata.`);
}
class R3TestCompiler {
    testBed;
    constructor(testBed) {
        this.testBed = testBed;
    }
    compileModuleSync(moduleType) {
        this.testBed._compileNgModuleSync(moduleType);
        return new _NgModuleFactory(moduleType);
    }
    async compileModuleAsync(moduleType) {
        await this.testBed._compileNgModuleAsync(moduleType);
        return new _NgModuleFactory(moduleType);
    }
    compileModuleAndAllComponentsSync(moduleType) {
        const ngModuleFactory = this.compileModuleSync(moduleType);
        const componentFactories = this.testBed._getComponentFactories(moduleType);
        return new ModuleWithComponentFactories(ngModuleFactory, componentFactories);
    }
    async compileModuleAndAllComponentsAsync(moduleType) {
        const ngModuleFactory = await this.compileModuleAsync(moduleType);
        const componentFactories = this.testBed._getComponentFactories(moduleType);
        return new ModuleWithComponentFactories(ngModuleFactory, componentFactories);
    }
    clearCache() { }
    clearCacheFor(type) { }
    getModuleId(moduleType) {
        const meta = this.testBed._getModuleResolver().resolve(moduleType);
        return (meta && meta.id) || undefined;
    }
}

// The formatter and CI disagree on how this import statement should be formatted. Both try to keep
// it on one line, too, which has gotten very hard to read & manage. So disable the formatter for
// this statement only.
let _nextRootElementId = 0;
/**
 * Returns a singleton of the `TestBed` class.
 *
 * @publicApi
 */
function getTestBed() {
    return TestBedImpl.INSTANCE;
}
/**
 * @description
 * Configures and initializes environment for unit testing and provides methods for
 * creating components and services in unit tests.
 *
 * TestBed is the primary api for writing unit tests for Angular applications and libraries.
 */
class TestBedImpl {
    static _INSTANCE = null;
    static get INSTANCE() {
        return (TestBedImpl._INSTANCE = TestBedImpl._INSTANCE || new TestBedImpl());
    }
    /**
     * Teardown options that have been configured at the environment level.
     * Used as a fallback if no instance-level options have been provided.
     */
    static _environmentTeardownOptions;
    /**
     * "Error on unknown elements" option that has been configured at the environment level.
     * Used as a fallback if no instance-level option has been provided.
     */
    static _environmentErrorOnUnknownElementsOption;
    /**
     * "Error on unknown properties" option that has been configured at the environment level.
     * Used as a fallback if no instance-level option has been provided.
     */
    static _environmentErrorOnUnknownPropertiesOption;
    /**
     * Teardown options that have been configured at the `TestBed` instance level.
     * These options take precedence over the environment-level ones.
     */
    _instanceTeardownOptions;
    /**
     * Defer block behavior option that specifies whether defer blocks will be triggered manually
     * or set to play through.
     */
    _instanceDeferBlockBehavior = DEFER_BLOCK_DEFAULT_BEHAVIOR;
    /**
     * "Error on unknown elements" option that has been configured at the `TestBed` instance level.
     * This option takes precedence over the environment-level one.
     */
    _instanceErrorOnUnknownElementsOption;
    /**
     * "Error on unknown properties" option that has been configured at the `TestBed` instance level.
     * This option takes precedence over the environment-level one.
     */
    _instanceErrorOnUnknownPropertiesOption;
    /**
     * Stores the previous "Error on unknown elements" option value,
     * allowing to restore it in the reset testing module logic.
     */
    _previousErrorOnUnknownElementsOption;
    /**
     * Stores the previous "Error on unknown properties" option value,
     * allowing to restore it in the reset testing module logic.
     */
    _previousErrorOnUnknownPropertiesOption;
    /**
     * Initialize the environment for testing with a compiler factory, a PlatformRef, and an
     * angular module. These are common to every test in the suite.
     *
     * This may only be called once, to set up the common providers for the current test
     * suite on the current platform. If you absolutely need to change the providers,
     * first use `resetTestEnvironment`.
     *
     * Test modules and platforms for individual platforms are available from
     * '@angular/<platform_name>/testing'.
     *
     * @publicApi
     */
    static initTestEnvironment(ngModule, platform, options) {
        const testBed = TestBedImpl.INSTANCE;
        testBed.initTestEnvironment(ngModule, platform, options);
        return testBed;
    }
    /**
     * Reset the providers for the test injector.
     *
     * @publicApi
     */
    static resetTestEnvironment() {
        TestBedImpl.INSTANCE.resetTestEnvironment();
    }
    static configureCompiler(config) {
        return TestBedImpl.INSTANCE.configureCompiler(config);
    }
    /**
     * Allows overriding default providers, directives, pipes, modules of the test injector,
     * which are defined in test_injector.js
     */
    static configureTestingModule(moduleDef) {
        return TestBedImpl.INSTANCE.configureTestingModule(moduleDef);
    }
    /**
     * Compile components with a `templateUrl` for the test's NgModule.
     * It is necessary to call this function
     * as fetching urls is asynchronous.
     */
    static compileComponents() {
        return TestBedImpl.INSTANCE.compileComponents();
    }
    static overrideModule(ngModule, override) {
        return TestBedImpl.INSTANCE.overrideModule(ngModule, override);
    }
    static overrideComponent(component, override) {
        return TestBedImpl.INSTANCE.overrideComponent(component, override);
    }
    static overrideDirective(directive, override) {
        return TestBedImpl.INSTANCE.overrideDirective(directive, override);
    }
    static overridePipe(pipe, override) {
        return TestBedImpl.INSTANCE.overridePipe(pipe, override);
    }
    static overrideTemplate(component, template) {
        return TestBedImpl.INSTANCE.overrideTemplate(component, template);
    }
    /**
     * Overrides the template of the given component, compiling the template
     * in the context of the TestingModule.
     *
     * Note: This works for JIT and AOTed components as well.
     */
    static overrideTemplateUsingTestingModule(component, template) {
        return TestBedImpl.INSTANCE.overrideTemplateUsingTestingModule(component, template);
    }
    static overrideProvider(token, provider) {
        return TestBedImpl.INSTANCE.overrideProvider(token, provider);
    }
    static inject(token, notFoundValue, flags) {
        return TestBedImpl.INSTANCE.inject(token, notFoundValue, _convertToBitFlags(flags));
    }
    /** @deprecated from v9.0.0 use TestBed.inject */
    static get(token, notFoundValue = Injector.THROW_IF_NOT_FOUND, flags = InjectFlags.Default) {
        return TestBedImpl.INSTANCE.inject(token, notFoundValue, flags);
    }
    /**
     * Runs the given function in the `EnvironmentInjector` context of `TestBed`.
     *
     * @see {@link EnvironmentInjector#runInContext}
     */
    static runInInjectionContext(fn) {
        return TestBedImpl.INSTANCE.runInInjectionContext(fn);
    }
    static createComponent(component) {
        return TestBedImpl.INSTANCE.createComponent(component);
    }
    static resetTestingModule() {
        return TestBedImpl.INSTANCE.resetTestingModule();
    }
    static execute(tokens, fn, context) {
        return TestBedImpl.INSTANCE.execute(tokens, fn, context);
    }
    static get platform() {
        return TestBedImpl.INSTANCE.platform;
    }
    static get ngModule() {
        return TestBedImpl.INSTANCE.ngModule;
    }
    static flushEffects() {
        return TestBedImpl.INSTANCE.flushEffects();
    }
    // Properties
    platform = null;
    ngModule = null;
    _compiler = null;
    _testModuleRef = null;
    _activeFixtures = [];
    /**
     * Internal-only flag to indicate whether a module
     * scoping queue has been checked and flushed already.
     * @docs-private
     */
    globalCompilationChecked = false;
    /**
     * Initialize the environment for testing with a compiler factory, a PlatformRef, and an
     * angular module. These are common to every test in the suite.
     *
     * This may only be called once, to set up the common providers for the current test
     * suite on the current platform. If you absolutely need to change the providers,
     * first use `resetTestEnvironment`.
     *
     * Test modules and platforms for individual platforms are available from
     * '@angular/<platform_name>/testing'.
     *
     * @publicApi
     */
    initTestEnvironment(ngModule, platform, options) {
        if (this.platform || this.ngModule) {
            throw new Error('Cannot set base providers because it has already been called');
        }
        TestBedImpl._environmentTeardownOptions = options?.teardown;
        TestBedImpl._environmentErrorOnUnknownElementsOption = options?.errorOnUnknownElements;
        TestBedImpl._environmentErrorOnUnknownPropertiesOption = options?.errorOnUnknownProperties;
        this.platform = platform;
        this.ngModule = ngModule;
        this._compiler = new TestBedCompiler(this.platform, this.ngModule);
        // TestBed does not have an API which can reliably detect the start of a test, and thus could be
        // used to track the state of the NgModule registry and reset it correctly. Instead, when we
        // know we're in a testing scenario, we disable the check for duplicate NgModule registration
        // completely.
        _setAllowDuplicateNgModuleIdsForTest(true);
    }
    /**
     * Reset the providers for the test injector.
     *
     * @publicApi
     */
    resetTestEnvironment() {
        this.resetTestingModule();
        this._compiler = null;
        this.platform = null;
        this.ngModule = null;
        TestBedImpl._environmentTeardownOptions = undefined;
        _setAllowDuplicateNgModuleIdsForTest(false);
    }
    resetTestingModule() {
        this.checkGlobalCompilationFinished();
        _resetCompiledComponents();
        if (this._compiler !== null) {
            this.compiler.restoreOriginalState();
        }
        this._compiler = new TestBedCompiler(this.platform, this.ngModule);
        // Restore the previous value of the "error on unknown elements" option
        _setUnknownElementStrictMode(this._previousErrorOnUnknownElementsOption ?? THROW_ON_UNKNOWN_ELEMENTS_DEFAULT);
        // Restore the previous value of the "error on unknown properties" option
        _setUnknownPropertyStrictMode(this._previousErrorOnUnknownPropertiesOption ?? THROW_ON_UNKNOWN_PROPERTIES_DEFAULT);
        // We have to chain a couple of try/finally blocks, because each step can
        // throw errors and we don't want it to interrupt the next step and we also
        // want an error to be thrown at the end.
        try {
            this.destroyActiveFixtures();
        }
        finally {
            try {
                if (this.shouldTearDownTestingModule()) {
                    this.tearDownTestingModule();
                }
            }
            finally {
                this._testModuleRef = null;
                this._instanceTeardownOptions = undefined;
                this._instanceErrorOnUnknownElementsOption = undefined;
                this._instanceErrorOnUnknownPropertiesOption = undefined;
                this._instanceDeferBlockBehavior = DEFER_BLOCK_DEFAULT_BEHAVIOR;
            }
        }
        return this;
    }
    configureCompiler(config) {
        if (config.useJit != null) {
            throw new Error('JIT compiler is not configurable via TestBed APIs.');
        }
        if (config.providers !== undefined) {
            this.compiler.setCompilerProviders(config.providers);
        }
        return this;
    }
    configureTestingModule(moduleDef) {
        this.assertNotInstantiated('TestBed.configureTestingModule', 'configure the test module');
        // Trigger module scoping queue flush before executing other TestBed operations in a test.
        // This is needed for the first test invocation to ensure that globally declared modules have
        // their components scoped properly. See the `checkGlobalCompilationFinished` function
        // description for additional info.
        this.checkGlobalCompilationFinished();
        // Always re-assign the options, even if they're undefined.
        // This ensures that we don't carry them between tests.
        this._instanceTeardownOptions = moduleDef.teardown;
        this._instanceErrorOnUnknownElementsOption = moduleDef.errorOnUnknownElements;
        this._instanceErrorOnUnknownPropertiesOption = moduleDef.errorOnUnknownProperties;
        this._instanceDeferBlockBehavior = moduleDef.deferBlockBehavior ?? DEFER_BLOCK_DEFAULT_BEHAVIOR;
        // Store the current value of the strict mode option,
        // so we can restore it later
        this._previousErrorOnUnknownElementsOption = _getUnknownElementStrictMode();
        _setUnknownElementStrictMode(this.shouldThrowErrorOnUnknownElements());
        this._previousErrorOnUnknownPropertiesOption = _getUnknownPropertyStrictMode();
        _setUnknownPropertyStrictMode(this.shouldThrowErrorOnUnknownProperties());
        this.compiler.configureTestingModule(moduleDef);
        return this;
    }
    compileComponents() {
        return this.compiler.compileComponents();
    }
    inject(token, notFoundValue, flags) {
        if (token === TestBed) {
            return this;
        }
        const UNDEFINED = {};
        const result = this.testModuleRef.injector.get(token, UNDEFINED, _convertToBitFlags(flags));
        return result === UNDEFINED
            ? this.compiler.injector.get(token, notFoundValue, flags)
            : result;
    }
    /** @deprecated from v9.0.0 use TestBed.inject */
    get(token, notFoundValue = Injector.THROW_IF_NOT_FOUND, flags = InjectFlags.Default) {
        return this.inject(token, notFoundValue, flags);
    }
    runInInjectionContext(fn) {
        return runInInjectionContext(this.inject(EnvironmentInjector), fn);
    }
    execute(tokens, fn, context) {
        const params = tokens.map((t) => this.inject(t));
        return fn.apply(context, params);
    }
    overrideModule(ngModule, override) {
        this.assertNotInstantiated('overrideModule', 'override module metadata');
        this.compiler.overrideModule(ngModule, override);
        return this;
    }
    overrideComponent(component, override) {
        this.assertNotInstantiated('overrideComponent', 'override component metadata');
        this.compiler.overrideComponent(component, override);
        return this;
    }
    overrideTemplateUsingTestingModule(component, template) {
        this.assertNotInstantiated('TestBed.overrideTemplateUsingTestingModule', 'Cannot override template when the test module has already been instantiated');
        this.compiler.overrideTemplateUsingTestingModule(component, template);
        return this;
    }
    overrideDirective(directive, override) {
        this.assertNotInstantiated('overrideDirective', 'override directive metadata');
        this.compiler.overrideDirective(directive, override);
        return this;
    }
    overridePipe(pipe, override) {
        this.assertNotInstantiated('overridePipe', 'override pipe metadata');
        this.compiler.overridePipe(pipe, override);
        return this;
    }
    /**
     * Overwrites all providers for the given token with the given provider definition.
     */
    overrideProvider(token, provider) {
        this.assertNotInstantiated('overrideProvider', 'override provider');
        this.compiler.overrideProvider(token, provider);
        return this;
    }
    overrideTemplate(component, template) {
        return this.overrideComponent(component, { set: { template, templateUrl: null } });
    }
    createComponent(type) {
        const testComponentRenderer = this.inject(TestComponentRenderer);
        const rootElId = `root${_nextRootElementId++}`;
        testComponentRenderer.insertRootElement(rootElId);
        if (_getAsyncClassMetadataFn(type)) {
            throw new Error(`Component '${type.name}' has unresolved metadata. ` +
                `Please call \`await TestBed.compileComponents()\` before running this test.`);
        }
        const componentDef = type.ɵcmp;
        if (!componentDef) {
            throw new Error(`It looks like '${_stringify(type)}' has not been compiled.`);
        }
        const componentFactory = new _Render3ComponentFactory(componentDef);
        const initComponent = () => {
            const componentRef = componentFactory.create(Injector.NULL, [], `#${rootElId}`, this.testModuleRef);
            return this.runInInjectionContext(() => new ComponentFixture(componentRef));
        };
        const noNgZone = this.inject(ComponentFixtureNoNgZone, false);
        const ngZone = noNgZone ? null : this.inject(NgZone, null);
        const fixture = ngZone ? ngZone.run(initComponent) : initComponent();
        this._activeFixtures.push(fixture);
        return fixture;
    }
    /**
     * @internal strip this from published d.ts files due to
     * https://github.com/microsoft/TypeScript/issues/36216
     */
    get compiler() {
        if (this._compiler === null) {
            throw new Error(`Need to call TestBed.initTestEnvironment() first`);
        }
        return this._compiler;
    }
    /**
     * @internal strip this from published d.ts files due to
     * https://github.com/microsoft/TypeScript/issues/36216
     */
    get testModuleRef() {
        if (this._testModuleRef === null) {
            this._testModuleRef = this.compiler.finalize();
        }
        return this._testModuleRef;
    }
    assertNotInstantiated(methodName, methodDescription) {
        if (this._testModuleRef !== null) {
            throw new Error(`Cannot ${methodDescription} when the test module has already been instantiated. ` +
                `Make sure you are not using \`inject\` before \`${methodName}\`.`);
        }
    }
    /**
     * Check whether the module scoping queue should be flushed, and flush it if needed.
     *
     * When the TestBed is reset, it clears the JIT module compilation queue, cancelling any
     * in-progress module compilation. This creates a potential hazard - the very first time the
     * TestBed is initialized (or if it's reset without being initialized), there may be pending
     * compilations of modules declared in global scope. These compilations should be finished.
     *
     * To ensure that globally declared modules have their components scoped properly, this function
     * is called whenever TestBed is initialized or reset. The _first_ time that this happens, prior
     * to any other operations, the scoping queue is flushed.
     */
    checkGlobalCompilationFinished() {
        // Checking _testNgModuleRef is null should not be necessary, but is left in as an additional
        // guard that compilations queued in tests (after instantiation) are never flushed accidentally.
        if (!this.globalCompilationChecked && this._testModuleRef === null) {
            _flushModuleScopingQueueAsMuchAsPossible();
        }
        this.globalCompilationChecked = true;
    }
    destroyActiveFixtures() {
        let errorCount = 0;
        this._activeFixtures.forEach((fixture) => {
            try {
                fixture.destroy();
            }
            catch (e) {
                errorCount++;
                console.error('Error during cleanup of component', {
                    component: fixture.componentInstance,
                    stacktrace: e,
                });
            }
        });
        this._activeFixtures = [];
        if (errorCount > 0 && this.shouldRethrowTeardownErrors()) {
            throw Error(`${errorCount} ${errorCount === 1 ? 'component' : 'components'} ` +
                `threw errors during cleanup`);
        }
    }
    shouldRethrowTeardownErrors() {
        const instanceOptions = this._instanceTeardownOptions;
        const environmentOptions = TestBedImpl._environmentTeardownOptions;
        // If the new teardown behavior hasn't been configured, preserve the old behavior.
        if (!instanceOptions && !environmentOptions) {
            return TEARDOWN_TESTING_MODULE_ON_DESTROY_DEFAULT;
        }
        // Otherwise use the configured behavior or default to rethrowing.
        return (instanceOptions?.rethrowErrors ??
            environmentOptions?.rethrowErrors ??
            this.shouldTearDownTestingModule());
    }
    shouldThrowErrorOnUnknownElements() {
        // Check if a configuration has been provided to throw when an unknown element is found
        return (this._instanceErrorOnUnknownElementsOption ??
            TestBedImpl._environmentErrorOnUnknownElementsOption ??
            THROW_ON_UNKNOWN_ELEMENTS_DEFAULT);
    }
    shouldThrowErrorOnUnknownProperties() {
        // Check if a configuration has been provided to throw when an unknown property is found
        return (this._instanceErrorOnUnknownPropertiesOption ??
            TestBedImpl._environmentErrorOnUnknownPropertiesOption ??
            THROW_ON_UNKNOWN_PROPERTIES_DEFAULT);
    }
    shouldTearDownTestingModule() {
        return (this._instanceTeardownOptions?.destroyAfterEach ??
            TestBedImpl._environmentTeardownOptions?.destroyAfterEach ??
            TEARDOWN_TESTING_MODULE_ON_DESTROY_DEFAULT);
    }
    getDeferBlockBehavior() {
        return this._instanceDeferBlockBehavior;
    }
    tearDownTestingModule() {
        // If the module ref has already been destroyed, we won't be able to get a test renderer.
        if (this._testModuleRef === null) {
            return;
        }
        // Resolve the renderer ahead of time, because we want to remove the root elements as the very
        // last step, but the injector will be destroyed as a part of the module ref destruction.
        const testRenderer = this.inject(TestComponentRenderer);
        try {
            this._testModuleRef.destroy();
        }
        catch (e) {
            if (this.shouldRethrowTeardownErrors()) {
                throw e;
            }
            else {
                console.error('Error during cleanup of a testing module', {
                    component: this._testModuleRef.instance,
                    stacktrace: e,
                });
            }
        }
        finally {
            testRenderer.removeAllRootElements?.();
        }
    }
    /**
     * Execute any pending effects.
     *
     * @developerPreview
     */
    flushEffects() {
        this.inject(_MicrotaskEffectScheduler).flush();
        this.inject(_EffectScheduler).flush();
    }
}
/**
 * @description
 * Configures and initializes environment for unit testing and provides methods for
 * creating components and services in unit tests.
 *
 * `TestBed` is the primary api for writing unit tests for Angular applications and libraries.
 *
 * @publicApi
 */
const TestBed = TestBedImpl;
/**
 * Allows injecting dependencies in `beforeEach()` and `it()`. Note: this function
 * (imported from the `@angular/core/testing` package) can **only** be used to inject dependencies
 * in tests. To inject dependencies in your application code, use the [`inject`](api/core/inject)
 * function from the `@angular/core` package instead.
 *
 * Example:
 *
 * ```ts
 * beforeEach(inject([Dependency, AClass], (dep, object) => {
 *   // some code that uses `dep` and `object`
 *   // ...
 * }));
 *
 * it('...', inject([AClass], (object) => {
 *   object.doSomething();
 *   expect(...);
 * })
 * ```
 *
 * @publicApi
 */
function inject(tokens, fn) {
    const testBed = TestBedImpl.INSTANCE;
    // Not using an arrow function to preserve context passed from call site
    return function () {
        return testBed.execute(tokens, fn, this);
    };
}
/**
 * @publicApi
 */
class InjectSetupWrapper {
    _moduleDef;
    constructor(_moduleDef) {
        this._moduleDef = _moduleDef;
    }
    _addModule() {
        const moduleDef = this._moduleDef();
        if (moduleDef) {
            TestBedImpl.configureTestingModule(moduleDef);
        }
    }
    inject(tokens, fn) {
        const self = this;
        // Not using an arrow function to preserve context passed from call site
        return function () {
            self._addModule();
            return inject(tokens, fn).call(this);
        };
    }
}
function withModule(moduleDef, fn) {
    if (fn) {
        // Not using an arrow function to preserve context passed from call site
        return function () {
            const testBed = TestBedImpl.INSTANCE;
            if (moduleDef) {
                testBed.configureTestingModule(moduleDef);
            }
            return fn.apply(this);
        };
    }
    return new InjectSetupWrapper(() => moduleDef);
}

/**
 * Public Test Library for unit testing Angular applications. Assumes that you are running
 * with Jasmine, Mocha, or a similar framework which exports a beforeEach function and
 * allows tests to be asynchronous by either returning a promise or using a 'done' parameter.
 */
// Reset the test providers and the fake async zone before each test.
// We keep a guard because somehow this file can make it into a bundle and be executed
// beforeEach is only defined when executing the tests
globalThis.beforeEach?.(getCleanupHook(false));
// We provide both a `beforeEach` and `afterEach`, because the updated behavior for
// tearing down the module is supposed to run after the test so that we can associate
// teardown errors with the correct test.
// We keep a guard because somehow this file can make it into a bundle and be executed
// afterEach is only defined when executing the tests
globalThis.afterEach?.(getCleanupHook(true));
function getCleanupHook(expectedTeardownValue) {
    return () => {
        const testBed = TestBedImpl.INSTANCE;
        if (testBed.shouldTearDownTestingModule() === expectedTeardownValue) {
            testBed.resetTestingModule();
            resetFakeAsyncZoneIfExists();
        }
    };
}
/**
 * This API should be removed. But doing so seems to break `google3` and so it requires a bit of
 * investigation.
 *
 * A work around is to mark it as `@codeGenApi` for now and investigate later.
 *
 * @codeGenApi
 */
// TODO(iminar): Remove this code in a safe way.
const __core_private_testing_placeholder__ = '';

/**
 * Fake implementation of user agent history and navigation behavior. This is a
 * high-fidelity implementation of browser behavior that attempts to emulate
 * things like traversal delay.
 */
class FakeNavigation {
    /**
     * The fake implementation of an entries array. Only same-document entries
     * allowed.
     */
    entriesArr = [];
    /**
     * The current active entry index into `entriesArr`.
     */
    currentEntryIndex = 0;
    /**
     * The current navigate event.
     * @internal
     */
    navigateEvent = null;
    /**
     * A Map of pending traversals, so that traversals to the same entry can be
     * re-used.
     */
    traversalQueue = new Map();
    /**
     * A Promise that resolves when the previous traversals have finished. Used to
     * simulate the cross-process communication necessary for traversals.
     */
    nextTraversal = Promise.resolve();
    /**
     * A prospective current active entry index, which includes unresolved
     * traversals. Used by `go` to determine where navigations are intended to go.
     */
    prospectiveEntryIndex = 0;
    /**
     * A test-only option to make traversals synchronous, rather than emulate
     * cross-process communication.
     */
    synchronousTraversals = false;
    /** Whether to allow a call to setInitialEntryForTesting. */
    canSetInitialEntry = true;
    /**
     * `EventTarget` to dispatch events.
     * @internal
     */
    eventTarget;
    /** The next unique id for created entries. Replace recreates this id. */
    nextId = 0;
    /** The next unique key for created entries. Replace inherits this id. */
    nextKey = 0;
    /** Whether this fake is disposed. */
    disposed = false;
    /** Equivalent to `navigation.currentEntry`. */
    get currentEntry() {
        return this.entriesArr[this.currentEntryIndex];
    }
    get canGoBack() {
        return this.currentEntryIndex > 0;
    }
    get canGoForward() {
        return this.currentEntryIndex < this.entriesArr.length - 1;
    }
    createEventTarget;
    _window;
    get window() {
        return this._window;
    }
    constructor(doc, startURL) {
        this.createEventTarget = () => {
            try {
                // `document.createElement` because NodeJS `EventTarget` is
                // incompatible with Domino's `Event`. That is, attempting to
                // dispatch an event created by Domino's patched `Event` will
                // throw an error since it is not an instance of a real Node
                // `Event`.
                return doc.createElement('div');
            }
            catch {
                // Fallback to a basic EventTarget if `document.createElement`
                // fails. This can happen with tests that pass in a value for document
                // that is stubbed.
                return new EventTarget();
            }
        };
        this._window = document.defaultView ?? this.createEventTarget();
        this.eventTarget = this.createEventTarget();
        // First entry.
        this.setInitialEntryForTesting(startURL);
    }
    /**
     * Sets the initial entry.
     */
    setInitialEntryForTesting(url, options = { historyState: null }) {
        if (!this.canSetInitialEntry) {
            throw new Error('setInitialEntryForTesting can only be called before any ' + 'navigation has occurred');
        }
        const currentInitialEntry = this.entriesArr[0];
        this.entriesArr[0] = new FakeNavigationHistoryEntry(this.eventTarget, new URL(url).toString(), {
            index: 0,
            key: currentInitialEntry?.key ?? String(this.nextKey++),
            id: currentInitialEntry?.id ?? String(this.nextId++),
            sameDocument: true,
            historyState: options?.historyState,
            state: options.state,
        });
    }
    /** Returns whether the initial entry is still eligible to be set. */
    canSetInitialEntryForTesting() {
        return this.canSetInitialEntry;
    }
    /**
     * Sets whether to emulate traversals as synchronous rather than
     * asynchronous.
     */
    setSynchronousTraversalsForTesting(synchronousTraversals) {
        this.synchronousTraversals = synchronousTraversals;
    }
    /** Equivalent to `navigation.entries()`. */
    entries() {
        return this.entriesArr.slice();
    }
    /** Equivalent to `navigation.navigate()`. */
    navigate(url, options) {
        const fromUrl = new URL(this.currentEntry.url);
        const toUrl = new URL(url, this.currentEntry.url);
        let navigationType;
        if (!options?.history || options.history === 'auto') {
            // Auto defaults to push, but if the URLs are the same, is a replace.
            if (fromUrl.toString() === toUrl.toString()) {
                navigationType = 'replace';
            }
            else {
                navigationType = 'push';
            }
        }
        else {
            navigationType = options.history;
        }
        const hashChange = isHashChange(fromUrl, toUrl);
        const destination = new FakeNavigationDestination({
            url: toUrl.toString(),
            state: options?.state,
            sameDocument: hashChange,
            historyState: null,
        });
        const result = new InternalNavigationResult(this);
        const intercepted = this.userAgentNavigate(destination, result, {
            navigationType,
            cancelable: true,
            canIntercept: true,
            // Always false for navigate().
            userInitiated: false,
            hashChange,
            info: options?.info,
        });
        if (!intercepted) {
            this.updateNavigationEntriesForSameDocumentNavigation(this.navigateEvent);
        }
        return {
            committed: result.committed,
            finished: result.finished,
        };
    }
    /** Equivalent to `history.pushState()`. */
    pushState(data, title, url) {
        this.pushOrReplaceState('push', data, title, url);
    }
    /** Equivalent to `history.replaceState()`. */
    replaceState(data, title, url) {
        this.pushOrReplaceState('replace', data, title, url);
    }
    pushOrReplaceState(navigationType, data, _title, url) {
        const fromUrl = new URL(this.currentEntry.url);
        const toUrl = url ? new URL(url, this.currentEntry.url) : fromUrl;
        const hashChange = isHashChange(fromUrl, toUrl);
        const destination = new FakeNavigationDestination({
            url: toUrl.toString(),
            sameDocument: true,
            historyState: data,
        });
        const result = new InternalNavigationResult(this);
        const intercepted = this.userAgentNavigate(destination, result, {
            navigationType,
            cancelable: true,
            canIntercept: true,
            // Always false for pushState() or replaceState().
            userInitiated: false,
            hashChange,
        });
        if (intercepted) {
            return;
        }
        this.updateNavigationEntriesForSameDocumentNavigation(this.navigateEvent);
    }
    /** Equivalent to `navigation.traverseTo()`. */
    traverseTo(key, options) {
        const fromUrl = new URL(this.currentEntry.url);
        const entry = this.findEntry(key);
        if (!entry) {
            const domException = new DOMException('Invalid key', 'InvalidStateError');
            const committed = Promise.reject(domException);
            const finished = Promise.reject(domException);
            committed.catch(() => { });
            finished.catch(() => { });
            return {
                committed,
                finished,
            };
        }
        if (entry === this.currentEntry) {
            return {
                committed: Promise.resolve(this.currentEntry),
                finished: Promise.resolve(this.currentEntry),
            };
        }
        if (this.traversalQueue.has(entry.key)) {
            const existingResult = this.traversalQueue.get(entry.key);
            return {
                committed: existingResult.committed,
                finished: existingResult.finished,
            };
        }
        const hashChange = isHashChange(fromUrl, new URL(entry.url, this.currentEntry.url));
        const destination = new FakeNavigationDestination({
            url: entry.url,
            state: entry.getState(),
            historyState: entry.getHistoryState(),
            key: entry.key,
            id: entry.id,
            index: entry.index,
            sameDocument: entry.sameDocument,
        });
        this.prospectiveEntryIndex = entry.index;
        const result = new InternalNavigationResult(this);
        this.traversalQueue.set(entry.key, result);
        this.runTraversal(() => {
            this.traversalQueue.delete(entry.key);
            const intercepted = this.userAgentNavigate(destination, result, {
                navigationType: 'traverse',
                cancelable: true,
                canIntercept: true,
                // Always false for traverseTo().
                userInitiated: false,
                hashChange,
                info: options?.info,
            });
            if (!intercepted) {
                this.userAgentTraverse(this.navigateEvent);
            }
        });
        return {
            committed: result.committed,
            finished: result.finished,
        };
    }
    /** Equivalent to `navigation.back()`. */
    back(options) {
        if (this.currentEntryIndex === 0) {
            const domException = new DOMException('Cannot go back', 'InvalidStateError');
            const committed = Promise.reject(domException);
            const finished = Promise.reject(domException);
            committed.catch(() => { });
            finished.catch(() => { });
            return {
                committed,
                finished,
            };
        }
        const entry = this.entriesArr[this.currentEntryIndex - 1];
        return this.traverseTo(entry.key, options);
    }
    /** Equivalent to `navigation.forward()`. */
    forward(options) {
        if (this.currentEntryIndex === this.entriesArr.length - 1) {
            const domException = new DOMException('Cannot go forward', 'InvalidStateError');
            const committed = Promise.reject(domException);
            const finished = Promise.reject(domException);
            committed.catch(() => { });
            finished.catch(() => { });
            return {
                committed,
                finished,
            };
        }
        const entry = this.entriesArr[this.currentEntryIndex + 1];
        return this.traverseTo(entry.key, options);
    }
    /**
     * Equivalent to `history.go()`.
     * Note that this method does not actually work precisely to how Chrome
     * does, instead choosing a simpler model with less unexpected behavior.
     * Chrome has a few edge case optimizations, for instance with repeated
     * `back(); forward()` chains it collapses certain traversals.
     */
    go(direction) {
        const targetIndex = this.prospectiveEntryIndex + direction;
        if (targetIndex >= this.entriesArr.length || targetIndex < 0) {
            return;
        }
        this.prospectiveEntryIndex = targetIndex;
        this.runTraversal(() => {
            // Check again that destination is in the entries array.
            if (targetIndex >= this.entriesArr.length || targetIndex < 0) {
                return;
            }
            const fromUrl = new URL(this.currentEntry.url);
            const entry = this.entriesArr[targetIndex];
            const hashChange = isHashChange(fromUrl, new URL(entry.url, this.currentEntry.url));
            const destination = new FakeNavigationDestination({
                url: entry.url,
                state: entry.getState(),
                historyState: entry.getHistoryState(),
                key: entry.key,
                id: entry.id,
                index: entry.index,
                sameDocument: entry.sameDocument,
            });
            const result = new InternalNavigationResult(this);
            const intercepted = this.userAgentNavigate(destination, result, {
                navigationType: 'traverse',
                cancelable: true,
                canIntercept: true,
                // Always false for go().
                userInitiated: false,
                hashChange,
            });
            if (!intercepted) {
                this.userAgentTraverse(this.navigateEvent);
            }
        });
    }
    /** Runs a traversal synchronously or asynchronously */
    runTraversal(traversal) {
        if (this.synchronousTraversals) {
            traversal();
            return;
        }
        // Each traversal occupies a single timeout resolution.
        // This means that Promises added to commit and finish should resolve
        // before the next traversal.
        this.nextTraversal = this.nextTraversal.then(() => {
            return new Promise((resolve) => {
                setTimeout(() => {
                    resolve();
                    traversal();
                });
            });
        });
    }
    /** Equivalent to `navigation.addEventListener()`. */
    addEventListener(type, callback, options) {
        this.eventTarget.addEventListener(type, callback, options);
    }
    /** Equivalent to `navigation.removeEventListener()`. */
    removeEventListener(type, callback, options) {
        this.eventTarget.removeEventListener(type, callback, options);
    }
    /** Equivalent to `navigation.dispatchEvent()` */
    dispatchEvent(event) {
        return this.eventTarget.dispatchEvent(event);
    }
    /** Cleans up resources. */
    dispose() {
        // Recreate eventTarget to release current listeners.
        this.eventTarget = this.createEventTarget();
        this.disposed = true;
    }
    /** Returns whether this fake is disposed. */
    isDisposed() {
        return this.disposed;
    }
    /**
     * Implementation for all navigations and traversals.
     * @returns true if the event was intercepted, otherwise false
     */
    userAgentNavigate(destination, result, options) {
        // The first navigation should disallow any future calls to set the initial
        // entry.
        this.canSetInitialEntry = false;
        if (this.navigateEvent) {
            this.navigateEvent.cancel(new DOMException('Navigation was aborted', 'AbortError'));
            this.navigateEvent = null;
        }
        return dispatchNavigateEvent({
            navigationType: options.navigationType,
            cancelable: options.cancelable,
            canIntercept: options.canIntercept,
            userInitiated: options.userInitiated,
            hashChange: options.hashChange,
            signal: result.signal,
            destination,
            info: options.info,
            sameDocument: destination.sameDocument,
            result,
        });
    }
    /**
     * Implementation for a push or replace navigation.
     * https://whatpr.org/html/10919/browsing-the-web.html#url-and-history-update-steps
     * https://whatpr.org/html/10919/nav-history-apis.html#update-the-navigation-api-entries-for-a-same-document-navigation
     * @internal
     */
    urlAndHistoryUpdateSteps(navigateEvent) {
        this.updateNavigationEntriesForSameDocumentNavigation(navigateEvent);
    }
    /**
     * Implementation for a traverse navigation.
     *
     * https://whatpr.org/html/10919/browsing-the-web.html#apply-the-traverse-history-step
     * ...
     * > Let updateDocument be an algorithm step which performs update document for history step application given targetEntry's document, targetEntry, changingNavigableContinuation's update-only, scriptHistoryLength, scriptHistoryIndex, navigationType, entriesForNavigationAPI, and previousEntry.
     * > If targetEntry's document is equal to displayedDocument, then perform updateDocument.
     * https://whatpr.org/html/10919/browsing-the-web.html#update-document-for-history-step-application
     * which then goes to https://whatpr.org/html/10919/nav-history-apis.html#update-the-navigation-api-entries-for-a-same-document-navigation
     * @internal
     */
    userAgentTraverse(navigateEvent) {
        const oldUrl = this.currentEntry.url;
        this.updateNavigationEntriesForSameDocumentNavigation(navigateEvent);
        // Happens as part of "updating the document" steps https://whatpr.org/html/10919/browsing-the-web.html#updating-the-document
        const popStateEvent = createPopStateEvent({
            state: navigateEvent.destination.getHistoryState(),
        });
        this._window.dispatchEvent(popStateEvent);
        if (navigateEvent.hashChange) {
            const hashchangeEvent = createHashChangeEvent(oldUrl, this.currentEntry.url);
            this._window.dispatchEvent(hashchangeEvent);
        }
    }
    /**
     * https://whatpr.org/html/10919/nav-history-apis.html#update-the-navigation-api-entries-for-a-same-document-navigation
     * @internal
     */
    updateNavigationEntriesForSameDocumentNavigation({ destination, navigationType, result, }) {
        const oldCurrentNHE = this.currentEntry;
        const disposedNHEs = [];
        if (navigationType === 'traverse') {
            this.currentEntryIndex = destination.index;
            if (this.currentEntryIndex === -1) {
                throw new Error('unexpected current entry index');
            }
        }
        else if (navigationType === 'push') {
            this.currentEntryIndex++;
            this.prospectiveEntryIndex = this.currentEntryIndex; // prospectiveEntryIndex isn't in the spec but is an implementation detail
            disposedNHEs.push(...this.entriesArr.splice(this.currentEntryIndex));
        }
        else if (navigationType === 'replace') {
            disposedNHEs.push(oldCurrentNHE);
        }
        if (navigationType === 'push' || navigationType === 'replace') {
            const index = this.currentEntryIndex;
            const key = navigationType === 'push' ? String(this.nextKey++) : this.currentEntry.key;
            const newNHE = new FakeNavigationHistoryEntry(this.eventTarget, destination.url, {
                id: String(this.nextId++),
                key,
                index,
                sameDocument: true,
                state: destination.getState(),
                historyState: destination.getHistoryState(),
            });
            this.entriesArr[this.currentEntryIndex] = newNHE;
        }
        result.committedResolve(this.currentEntry);
        const currentEntryChangeEvent = createFakeNavigationCurrentEntryChangeEvent({
            from: oldCurrentNHE,
            navigationType: navigationType,
        });
        this.eventTarget.dispatchEvent(currentEntryChangeEvent);
        for (const disposedNHE of disposedNHEs) {
            disposedNHE.dispose();
        }
    }
    /** Utility method for finding entries with the given `key`. */
    findEntry(key) {
        for (const entry of this.entriesArr) {
            if (entry.key === key)
                return entry;
        }
        return undefined;
    }
    set onnavigate(
    // tslint:disable-next-line:no-any
    _handler) {
        throw new Error('unimplemented');
    }
    // tslint:disable-next-line:no-any
    get onnavigate() {
        throw new Error('unimplemented');
    }
    set oncurrententrychange(_handler) {
        throw new Error('unimplemented');
    }
    get oncurrententrychange() {
        throw new Error('unimplemented');
    }
    set onnavigatesuccess(
    // tslint:disable-next-line:no-any
    _handler) {
        throw new Error('unimplemented');
    }
    // tslint:disable-next-line:no-any
    get onnavigatesuccess() {
        throw new Error('unimplemented');
    }
    set onnavigateerror(
    // tslint:disable-next-line:no-any
    _handler) {
        throw new Error('unimplemented');
    }
    // tslint:disable-next-line:no-any
    get onnavigateerror() {
        throw new Error('unimplemented');
    }
    _transition = null;
    /** @internal */
    set transition(t) {
        this._transition = t;
    }
    get transition() {
        return this._transition;
    }
    updateCurrentEntry(_options) {
        throw new Error('unimplemented');
    }
    reload(_options) {
        throw new Error('unimplemented');
    }
}
/**
 * Fake equivalent of `NavigationHistoryEntry`.
 */
class FakeNavigationHistoryEntry {
    eventTarget;
    url;
    sameDocument;
    id;
    key;
    index;
    state;
    historyState;
    // tslint:disable-next-line:no-any
    ondispose = null;
    constructor(eventTarget, url, { id, key, index, sameDocument, state, historyState, }) {
        this.eventTarget = eventTarget;
        this.url = url;
        this.id = id;
        this.key = key;
        this.index = index;
        this.sameDocument = sameDocument;
        this.state = state;
        this.historyState = historyState;
    }
    getState() {
        // Budget copy.
        return this.state ? JSON.parse(JSON.stringify(this.state)) : this.state;
    }
    getHistoryState() {
        // Budget copy.
        return this.historyState
            ? JSON.parse(JSON.stringify(this.historyState))
            : this.historyState;
    }
    addEventListener(type, callback, options) {
        this.eventTarget.addEventListener(type, callback, options);
    }
    removeEventListener(type, callback, options) {
        this.eventTarget.removeEventListener(type, callback, options);
    }
    dispatchEvent(event) {
        return this.eventTarget.dispatchEvent(event);
    }
    /** internal */
    dispose() {
        const disposeEvent = new Event('disposed');
        this.dispatchEvent(disposeEvent);
        // release current listeners
        this.eventTarget = null;
    }
}
/**
 * Create a fake equivalent of `NavigateEvent`. This is not a class because ES5
 * transpiled JavaScript cannot extend native Event.
 *
 * https://html.spec.whatwg.org/multipage/nav-history-apis.html#navigate-event-firing
 */
function dispatchNavigateEvent({ cancelable, canIntercept, userInitiated, hashChange, navigationType, signal, destination, info, sameDocument, result, }) {
    const { navigation } = result;
    const event = new Event('navigate', { bubbles: false, cancelable });
    event.focusResetBehavior = null;
    event.scrollBehavior = null;
    event.interceptionState = 'none';
    event.canIntercept = canIntercept;
    event.userInitiated = userInitiated;
    event.hashChange = hashChange;
    event.navigationType = navigationType;
    event.signal = signal;
    event.destination = destination;
    event.info = info;
    event.downloadRequest = null;
    event.formData = null;
    event.result = result;
    event.sameDocument = sameDocument;
    let precommitHandlers = [];
    let handlers = [];
    // https://whatpr.org/html/10919/nav-history-apis.html#dom-navigateevent-intercept
    event.intercept = function (options) {
        if (!this.canIntercept) {
            throw new DOMException(`Cannot intercept when canIntercept is 'false'`, 'SecurityError');
        }
        this.interceptionState = 'intercepted';
        event.sameDocument = true;
        const precommitHandler = options?.precommitHandler;
        if (precommitHandler) {
            if (!this.cancelable) {
                throw new DOMException(`Cannot use precommitHandler when cancelable is 'false'`, 'InvalidStateError');
            }
            precommitHandlers.push(precommitHandler);
        }
        if (event.interceptionState !== 'none' && event.interceptionState !== 'intercepted') {
            throw new Error('Event interceptionState should be "none" or "intercepted"');
        }
        event.interceptionState = 'intercepted';
        const handler = options?.handler;
        if (handler) {
            handlers.push(handler);
        }
        // override old options with new ones. UA _may_ report a console warning if new options differ from previous
        event.focusResetBehavior = options?.focusReset ?? event.focusResetBehavior;
        event.scrollBehavior = options?.scroll ?? event.scrollBehavior;
    };
    // https://whatpr.org/html/10919/nav-history-apis.html#dom-navigateevent-scroll
    event.scroll = function () {
        if (event.interceptionState !== 'committed') {
            throw new DOMException(`Failed to execute 'scroll' on 'NavigateEvent': scroll() must be ` +
                `called after commit() and interception options must specify manual scroll.`, 'InvalidStateError');
        }
        processScrollBehavior(event);
    };
    // https://whatpr.org/html/10919/nav-history-apis.html#dom-navigationprecommitcontroller-redirect
    function redirect(url) {
        if (event.interceptionState === 'none') {
            throw new Error('cannot redirect when event is not intercepted');
        }
        if (event.interceptionState !== 'intercepted') {
            throw new DOMException(`cannot redirect when event is not in 'intercepted' state`, 'InvalidStateError');
        }
        if (event.navigationType !== 'push' && event.navigationType !== 'replace') {
            throw new DOMException(`cannot redirect when navigationType is not 'push' or 'replace`, 'InvalidStateError');
        }
        const toUrl = new URL(url, navigation.currentEntry.url);
        event.destination.url = toUrl.href;
    }
    // https://whatpr.org/html/10919/nav-history-apis.html#inner-navigate-event-firing-algorithm
    // "Let commit be the following steps:"
    function commit() {
        if (result.signal.aborted) {
            return;
        }
        if (event.interceptionState !== 'none') {
            event.interceptionState = 'committed';
            if (!navigation.currentEntry) {
                throw new Error('from history entry should not be null');
            }
            navigation.transition = new InternalNavigationTransition(navigation.currentEntry, navigationType);
            switch (event.navigationType) {
                case 'push':
                case 'replace': {
                    navigation.urlAndHistoryUpdateSteps(event);
                    break;
                }
                case 'reload': {
                    navigation.updateNavigationEntriesForSameDocumentNavigation(event);
                    break;
                }
                case 'traverse': {
                    navigation.userAgentTraverse(event);
                    break;
                }
            }
        }
        const promisesList = handlers.map((handler) => handler());
        if (promisesList.length === 0) {
            promisesList.push(Promise.resolve());
        }
        Promise.all(promisesList)
            .then(() => {
            // Follows steps outlined under "Wait for all of promisesList, with the following success steps:"
            // in the spec https://html.spec.whatwg.org/multipage/nav-history-apis.html#navigate-event-firing.
            if (result.signal.aborted) {
                return;
            }
            if (event !== navigation.navigateEvent) {
                throw new Error("Navigation's ongoing event not equal to resolved event");
            }
            navigation.navigateEvent = null;
            finishNavigationEvent(event, true);
            const navigatesuccessEvent = new Event('navigatesuccess', { bubbles: false, cancelable });
            navigation.eventTarget.dispatchEvent(navigatesuccessEvent);
            result.finishedResolve();
            if (navigation.transition !== null) {
                navigation.transition.finishedResolve();
            }
            navigation.transition = null;
        })
            .catch((reason) => event.cancel(reason));
    }
    // Internal only.
    // https://whatpr.org/html/10919/nav-history-apis.html#inner-navigate-event-firing-algorithm
    // "Let cancel be the following steps given reason"
    event.cancel = function (reason) {
        if (result.signal.aborted) {
            return;
        }
        if (event !== navigation.navigateEvent) {
            throw new Error("Navigation's ongoing event not equal to resolved event");
        }
        navigation.navigateEvent = null;
        if (event.interceptionState !== 'intercepted') {
            finishNavigationEvent(event, false);
        }
        const navigateerrorEvent = new Event('navigateerror', { bubbles: false, cancelable });
        navigation.eventTarget.dispatchEvent(navigateerrorEvent);
        result.finishedReject(reason);
        if (navigation.transition !== null) {
            navigation.transition.finishedReject(reason);
        }
        navigation.transition = null;
    };
    function dispatch() {
        navigation.navigateEvent = event;
        navigation.eventTarget.dispatchEvent(event);
        if (precommitHandlers.length === 0) {
            commit();
        }
        else {
            const precommitController = { redirect };
            const precommitPromisesList = precommitHandlers.map((handler) => handler(precommitController));
            Promise.all(precommitPromisesList)
                .then(() => commit())
                .catch((reason) => event.cancel(reason));
        }
    }
    dispatch();
    return event.interceptionState !== 'none';
}
/** https://whatpr.org/html/10919/nav-history-apis.html#navigateevent-finish */
function finishNavigationEvent(event, didFulfill) {
    if (event.interceptionState === 'finished') {
        throw new Error('Attempting to finish navigation event that was already finished');
    }
    if (event.interceptionState === 'intercepted') {
        if (didFulfill === true) {
            throw new Error('didFulfill should be false');
        }
        // assert precommit handlers is not empty
        event.interceptionState = 'finished';
        return;
    }
    if (event.interceptionState === 'none') {
        return;
    }
    potentiallyResetFocus(event);
    if (didFulfill) {
        potentiallyResetScroll(event);
    }
    event.interceptionState = 'finished';
}
/** https://whatpr.org/html/10919/nav-history-apis.html#potentially-reset-the-focus */
function potentiallyResetFocus(event) {
    if (event.interceptionState !== 'committed' && event.interceptionState !== 'scrolled') {
        throw new Error('cannot reset focus if navigation event is not committed or scrolled');
    }
    // TODO(atscott): The rest of the steps
}
function potentiallyResetScroll(event) {
    if (event.interceptionState !== 'committed' && event.interceptionState !== 'scrolled') {
        throw new Error('cannot reset scroll if navigation event is not committed or scrolled');
    }
    if (event.interceptionState === 'scrolled' || event.scrollBehavior === 'manual') {
        return;
    }
    processScrollBehavior(event);
}
/* https://whatpr.org/html/10919/nav-history-apis.html#process-scroll-behavior */
function processScrollBehavior(event) {
    if (event.interceptionState !== 'committed') {
        throw new Error('invalid event interception state when processing scroll behavior');
    }
    event.intherceptionState = 'scrolled';
    // TODO(atscott): the rest of the steps
}
/**
 * Create a fake equivalent of `NavigationCurrentEntryChange`. This does not use
 * a class because ES5 transpiled JavaScript cannot extend native Event.
 */
function createFakeNavigationCurrentEntryChangeEvent({ from, navigationType, }) {
    const event = new Event('currententrychange', {
        bubbles: false,
        cancelable: false,
    });
    event.from = from;
    event.navigationType = navigationType;
    return event;
}
/**
 * Create a fake equivalent of `PopStateEvent`. This does not use a class
 * because ES5 transpiled JavaScript cannot extend native Event.
 */
function createPopStateEvent({ state }) {
    const event = new Event('popstate', {
        bubbles: false,
        cancelable: false,
    });
    event.state = state;
    return event;
}
function createHashChangeEvent(newURL, oldURL) {
    const event = new Event('hashchange', {
        bubbles: false,
        cancelable: false,
    });
    event.newURL = newURL;
    event.oldURL = oldURL;
    return event;
}
/**
 * Fake equivalent of `NavigationDestination`.
 */
class FakeNavigationDestination {
    url;
    sameDocument;
    key;
    id;
    index;
    state;
    historyState;
    constructor({ url, sameDocument, historyState, state, key = null, id = null, index = -1, }) {
        this.url = url;
        this.sameDocument = sameDocument;
        this.state = state;
        this.historyState = historyState;
        this.key = key;
        this.id = id;
        this.index = index;
    }
    getState() {
        return this.state;
    }
    getHistoryState() {
        return this.historyState;
    }
}
/** Utility function to determine whether two UrlLike have the same hash. */
function isHashChange(from, to) {
    return (to.hash !== from.hash &&
        to.hostname === from.hostname &&
        to.pathname === from.pathname &&
        to.search === from.search);
}
class InternalNavigationTransition {
    from;
    navigationType;
    finished;
    finishedResolve;
    finishedReject;
    constructor(from, navigationType) {
        this.from = from;
        this.navigationType = navigationType;
        this.finished = new Promise((resolve, reject) => {
            this.finishedReject = reject;
            this.finishedResolve = resolve;
        });
        // All rejections are handled.
        this.finished.catch(() => { });
    }
}
/**
 * Internal utility class for representing the result of a navigation.
 * Generally equivalent to the "apiMethodTracker" in the spec.
 */
class InternalNavigationResult {
    navigation;
    committedTo = null;
    committedResolve;
    committedReject;
    finishedResolve;
    finishedReject;
    committed;
    finished;
    get signal() {
        return this.abortController.signal;
    }
    abortController = new AbortController();
    constructor(navigation) {
        this.navigation = navigation;
        this.committed = new Promise((resolve, reject) => {
            this.committedResolve = (entry) => {
                this.committedTo = entry;
                resolve(entry);
            };
            this.committedReject = reject;
        });
        this.finished = new Promise(async (resolve, reject) => {
            this.finishedResolve = () => {
                if (this.committedTo === null) {
                    throw new Error('NavigateEvent should have been committed before resolving finished promise.');
                }
                resolve(this.committedTo);
            };
            this.finishedReject = (reason) => {
                reject(reason);
                this.abortController.abort(reason);
            };
        });
        // All rejections are handled.
        this.committed.catch(() => { });
        this.finished.catch(() => { });
    }
}

class Log {
    logItems;
    constructor() {
        this.logItems = [];
    }
    add(value) {
        this.logItems.push(value);
    }
    fn(value) {
        return () => {
            this.logItems.push(value);
        };
    }
    clear() {
        this.logItems = [];
    }
    result() {
        return this.logItems.join('; ');
    }
    static ɵfac = function Log_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || Log)(); };
    static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: Log, factory: Log.ɵfac });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(Log, [{
        type: Injectable
    }], () => [], null); })();

export { ComponentFixture, ComponentFixtureAutoDetect, ComponentFixtureNoNgZone, DeferBlockFixture, InjectSetupWrapper, TestBed, TestComponentRenderer, __core_private_testing_placeholder__, discardPeriodicTasks, fakeAsync, flush, flushMicrotasks, getTestBed, inject, resetFakeAsyncZone, tick, waitForAsync, withModule, FakeNavigation as ɵFakeNavigation, Log as ɵLog, MetadataOverrider as ɵMetadataOverrider };
//# sourceMappingURL=testing.mjs.map
#인tx   {"version":3,"file":"testing.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/async.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/application_error_handler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/defer.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/test_bed_common.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/component_fixture.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/fake_async.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/metadata_overrider.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/resolvers.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/test_bed_compiler.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/test_bed.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/test_hooks.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/dom-navigation/testing/fake_navigation.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/testing/src/logger.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n/**\n * Wraps a test function in an asynchronous test zone. The test will automatically\n * complete when all asynchronous calls within this zone are done. Can be used\n * to wrap an {@link inject} call.\n *\n * Example:\n *\n * ```ts\n * it('...', waitForAsync(inject([AClass], (object) => {\n *   object.doSomething.then(() => {\n *     expect(...);\n *   })\n * })));\n * ```\n *\n * @publicApi\n */\nexport function waitForAsync(fn: Function): (done: any) => any {\n  const _Zone: any = typeof Zone !== 'undefined' ? Zone : null;\n  if (!_Zone) {\n    return function () {\n      return Promise.reject(\n        'Zone is needed for the waitForAsync() test helper but could not be found. ' +\n          'Please make sure that your environment includes zone.js',\n      );\n    };\n  }\n  const asyncTest = _Zone && _Zone[_Zone.__symbol__('asyncTest')];\n  if (typeof asyncTest === 'function') {\n    return asyncTest(fn);\n  }\n  return function () {\n    return Promise.reject(\n      'zone-testing.js is needed for the async() test helper but could not be found. ' +\n        'Please make sure that your environment includes zone.js/testing',\n    );\n  };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ErrorHandler, inject, NgZone, Injectable} from '@angular/core';\n\nexport const RETHROW_APPLICATION_ERRORS_DEFAULT = true;\n\n@Injectable()\nexport class TestBedApplicationErrorHandler {\n  private readonly zone = inject(NgZone);\n  private readonly userErrorHandler = inject(ErrorHandler);\n  readonly whenStableRejectFunctions: Set<(e: unknown) => void> = new Set();\n\n  handleError(e: unknown) {\n    try {\n      this.zone.runOutsideAngular(() => this.userErrorHandler.handleError(e));\n    } catch (userError: unknown) {\n      e = userError;\n    }\n\n    // Instead of throwing the error when there are outstanding `fixture.whenStable` promises,\n    // reject those promises with the error. This allows developers to write\n    // expectAsync(fix.whenStable()).toBeRejected();\n    if (this.whenStableRejectFunctions.size > 0) {\n      for (const fn of this.whenStableRejectFunctions.values()) {\n        fn(e);\n      }\n      this.whenStableRejectFunctions.clear();\n    } else {\n      throw e;\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ɵCONTAINER_HEADER_OFFSET as CONTAINER_HEADER_OFFSET,\n  ɵDeferBlockDetails as DeferBlockDetails,\n  ɵDeferBlockState as DeferBlockState,\n  ɵgetDeferBlocks as getDeferBlocks,\n  ɵrenderDeferBlockState as renderDeferBlockState,\n  ɵtriggerResourceLoading as triggerResourceLoading,\n} from '@angular/core';\n\nimport type {ComponentFixture} from './component_fixture';\n\n/**\n * Represents an individual defer block for testing purposes.\n *\n * @publicApi\n */\nexport class DeferBlockFixture {\n  /** @docs-private */\n  constructor(\n    private block: DeferBlockDetails,\n    private componentFixture: ComponentFixture<unknown>,\n  ) {}\n\n  /**\n   * Renders the specified state of the defer fixture.\n   * @param state the defer state to render\n   */\n  async render(state: DeferBlockState): Promise<void> {\n    if (!hasStateTemplate(state, this.block)) {\n      const stateAsString = getDeferBlockStateNameFromEnum(state);\n      throw new Error(\n        `Tried to render this defer block in the \\`${stateAsString}\\` state, ` +\n          `but there was no @${stateAsString.toLowerCase()} block defined in a template.`,\n      );\n    }\n    if (state === DeferBlockState.Complete) {\n      await triggerResourceLoading(this.block.tDetails, this.block.lView, this.block.tNode);\n    }\n    // If the `render` method is used explicitly - skip timer-based scheduling for\n    // `@placeholder` and `@loading` blocks and render them immediately.\n    const skipTimerScheduling = true;\n    renderDeferBlockState(state, this.block.tNode, this.block.lContainer, skipTimerScheduling);\n    this.componentFixture.detectChanges();\n  }\n\n  /**\n   * Retrieves all nested child defer block fixtures\n   * in a given defer block.\n   */\n  getDeferBlocks(): Promise<DeferBlockFixture[]> {\n    const deferBlocks: DeferBlockDetails[] = [];\n    // An LContainer that represents a defer block has at most 1 view, which is\n    // located right after an LContainer header. Get a hold of that view and inspect\n    // it for nested defer blocks.\n    const deferBlockFixtures = [];\n    if (this.block.lContainer.length >= CONTAINER_HEADER_OFFSET) {\n      const lView = this.block.lContainer[CONTAINER_HEADER_OFFSET];\n      getDeferBlocks(lView, deferBlocks);\n      for (const block of deferBlocks) {\n        deferBlockFixtures.push(new DeferBlockFixture(block, this.componentFixture));\n      }\n    }\n    return Promise.resolve(deferBlockFixtures);\n  }\n}\n\nfunction hasStateTemplate(state: DeferBlockState, block: DeferBlockDetails) {\n  switch (state) {\n    case DeferBlockState.Placeholder:\n      return block.tDetails.placeholderTmplIndex !== null;\n    case DeferBlockState.Loading:\n      return block.tDetails.loadingTmplIndex !== null;\n    case DeferBlockState.Error:\n      return block.tDetails.errorTmplIndex !== null;\n    case DeferBlockState.Complete:\n      return true;\n    default:\n      return false;\n  }\n}\n\nfunction getDeferBlockStateNameFromEnum(state: DeferBlockState) {\n  switch (state) {\n    case DeferBlockState.Placeholder:\n      return 'Placeholder';\n    case DeferBlockState.Loading:\n      return 'Loading';\n    case DeferBlockState.Error:\n      return 'Error';\n    default:\n      return 'Main';\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  InjectionToken,\n  SchemaMetadata,\n  ɵDeferBlockBehavior as DeferBlockBehavior,\n} from '@angular/core';\n\n/** Whether test modules should be torn down by default. */\nexport const TEARDOWN_TESTING_MODULE_ON_DESTROY_DEFAULT = true;\n\n/** Whether unknown elements in templates should throw by default. */\nexport const THROW_ON_UNKNOWN_ELEMENTS_DEFAULT = false;\n\n/** Whether unknown properties in templates should throw by default. */\nexport const THROW_ON_UNKNOWN_PROPERTIES_DEFAULT = false;\n\n/** Whether defer blocks should use manual triggering or play through normally. */\nexport const DEFER_BLOCK_DEFAULT_BEHAVIOR = DeferBlockBehavior.Playthrough;\n\n/**\n * An abstract class for inserting the root test component element in a platform independent way.\n *\n * @publicApi\n */\nexport class TestComponentRenderer {\n  insertRootElement(rootElementId: string) {}\n  removeAllRootElements?() {}\n}\n\n/**\n * @publicApi\n */\nexport const ComponentFixtureAutoDetect = new InjectionToken<boolean>('ComponentFixtureAutoDetect');\n\n/**\n * @publicApi\n */\nexport const ComponentFixtureNoNgZone = new InjectionToken<boolean>('ComponentFixtureNoNgZone');\n\n/**\n * @publicApi\n */\nexport interface TestModuleMetadata {\n  providers?: any[];\n  declarations?: any[];\n  imports?: any[];\n  schemas?: Array<SchemaMetadata | any[]>;\n  teardown?: ModuleTeardownOptions;\n  /**\n   * Whether NG0304 runtime errors should be thrown when unknown elements are present in component's\n   * template. Defaults to `false`, where the error is simply logged. If set to `true`, the error is\n   * thrown.\n   * @see [NG8001](/errors/NG8001) for the description of the problem and how to fix it\n   */\n  errorOnUnknownElements?: boolean;\n  /**\n   * Whether errors should be thrown when unknown properties are present in component's template.\n   * Defaults to `false`, where the error is simply logged.\n   * If set to `true`, the error is thrown.\n   * @see [NG8002](/errors/NG8002) for the description of the error and how to fix it\n   */\n  errorOnUnknownProperties?: boolean;\n\n  /**\n   * Whether errors that happen during application change detection should be rethrown.\n   *\n   * When `true`, errors that are caught during application change detection will\n   * be reported to the `ErrorHandler` and rethrown to prevent them from going\n   * unnoticed in tests.\n   *\n   * When `false`, errors are only forwarded to the `ErrorHandler`, which by default\n   * simply logs them to the console.\n   *\n   * Defaults to `true`.\n   */\n  rethrowApplicationErrors?: boolean;\n\n  /**\n   * Whether defer blocks should behave with manual triggering or play through normally.\n   * Defaults to `manual`.\n   */\n  deferBlockBehavior?: DeferBlockBehavior;\n}\n\n/**\n * @publicApi\n */\nexport interface TestEnvironmentOptions {\n  /**\n   * Configures the test module teardown behavior in `TestBed`.\n   */\n  teardown?: ModuleTeardownOptions;\n  /**\n   * Whether errors should be thrown when unknown elements are present in component's template.\n   * Defaults to `false`, where the error is simply logged.\n   * If set to `true`, the error is thrown.\n   * @see [NG8001](/errors/NG8001) for the description of the error and how to fix it\n   */\n  errorOnUnknownElements?: boolean;\n  /**\n   * Whether errors should be thrown when unknown properties are present in component's template.\n   * Defaults to `false`, where the error is simply logged.\n   * If set to `true`, the error is thrown.\n   * @see [NG8002](/errors/NG8002) for the description of the error and how to fix it\n   */\n  errorOnUnknownProperties?: boolean;\n}\n\n/**\n * Configures the test module teardown behavior in `TestBed`.\n * @publicApi\n */\nexport interface ModuleTeardownOptions {\n  /** Whether the test module should be destroyed after every test. Defaults to `true`. */\n  destroyAfterEach: boolean;\n\n  /** Whether errors during test module destruction should be re-thrown. Defaults to `true`. */\n  rethrowErrors?: boolean;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  ApplicationRef,\n  ChangeDetectorRef,\n  ComponentRef,\n  DebugElement,\n  ɵDeferBlockDetails as DeferBlockDetails,\n  ɵEffectScheduler as EffectScheduler,\n  ElementRef,\n  getDebugNode,\n  ɵgetDeferBlocks as getDeferBlocks,\n  inject,\n  ɵMicrotaskEffectScheduler as MicrotaskEffectScheduler,\n  NgZone,\n  ɵNoopNgZone as NoopNgZone,\n  ɵPendingTasksInternal as PendingTasks,\n  RendererFactory2,\n  ViewRef,\n  ɵZONELESS_ENABLED as ZONELESS_ENABLED,\n  ɵChangeDetectionScheduler,\n  ɵNotificationSource,\n} from '@angular/core';\nimport {Subscription} from 'rxjs';\n\nimport {TestBedApplicationErrorHandler} from './application_error_handler';\nimport {DeferBlockFixture} from './defer';\nimport {ComponentFixtureAutoDetect, ComponentFixtureNoNgZone} from './test_bed_common';\n\ninterface TestAppRef {\n  externalTestViews: Set<ViewRef>;\n  skipCheckNoChangesForExternalTestViews: Set<ViewRef>;\n}\n\n/**\n * Fixture for debugging and testing a component.\n *\n * @publicApi\n */\nexport class ComponentFixture<T> {\n  /**\n   * The DebugElement associated with the root element of this component.\n   */\n  debugElement: DebugElement;\n\n  /**\n   * The instance of the root component class.\n   */\n  componentInstance: T;\n\n  /**\n   * The native element at the root of the component.\n   */\n  nativeElement: any;\n\n  /**\n   * The ElementRef for the element at the root of the component.\n   */\n  elementRef: ElementRef;\n\n  /**\n   * The ChangeDetectorRef for the component\n   */\n  changeDetectorRef: ChangeDetectorRef;\n\n  private _renderer: RendererFactory2 | null | undefined;\n  private _isDestroyed: boolean = false;\n  /** @internal */\n  protected readonly _noZoneOptionIsSet = inject(ComponentFixtureNoNgZone, {optional: true});\n  /** @internal */\n  protected _ngZone: NgZone = this._noZoneOptionIsSet ? new NoopNgZone() : inject(NgZone);\n  // Inject ApplicationRef to ensure NgZone stableness causes after render hooks to run\n  // This will likely happen as a result of fixture.detectChanges because it calls ngZone.run\n  // This is a crazy way of doing things but hey, it's the world we live in.\n  // The zoneless scheduler should instead do this more imperatively by attaching\n  // the `ComponentRef` to `ApplicationRef` and calling `appRef.tick` as the `detectChanges`\n  // behavior.\n  /** @internal */\n  protected readonly _appRef = inject(ApplicationRef);\n  private readonly _testAppRef = this._appRef as unknown as TestAppRef;\n  private readonly pendingTasks = inject(PendingTasks);\n  private readonly appErrorHandler = inject(TestBedApplicationErrorHandler);\n  private readonly zonelessEnabled = inject(ZONELESS_ENABLED);\n  private readonly scheduler = inject(ɵChangeDetectionScheduler);\n  private readonly rootEffectScheduler = inject(EffectScheduler);\n  private readonly microtaskEffectScheduler = inject(MicrotaskEffectScheduler);\n  private readonly autoDetectDefault = this.zonelessEnabled ? true : false;\n  private autoDetect =\n    inject(ComponentFixtureAutoDetect, {optional: true}) ?? this.autoDetectDefault;\n\n  private subscriptions = new Subscription();\n\n  // TODO(atscott): Remove this from public API\n  ngZone = this._noZoneOptionIsSet ? null : this._ngZone;\n\n  /** @docs-private */\n  constructor(public componentRef: ComponentRef<T>) {\n    this.changeDetectorRef = componentRef.changeDetectorRef;\n    this.elementRef = componentRef.location;\n    this.debugElement = <DebugElement>getDebugNode(this.elementRef.nativeElement);\n    this.componentInstance = componentRef.instance;\n    this.nativeElement = this.elementRef.nativeElement;\n    this.componentRef = componentRef;\n\n    if (this.autoDetect) {\n      this._testAppRef.externalTestViews.add(this.componentRef.hostView);\n      this.scheduler?.notify(ɵNotificationSource.ViewAttached);\n      this.scheduler?.notify(ɵNotificationSource.MarkAncestorsForTraversal);\n    }\n    this.componentRef.hostView.onDestroy(() => {\n      this._testAppRef.externalTestViews.delete(this.componentRef.hostView);\n    });\n    // Create subscriptions outside the NgZone so that the callbacks run outside\n    // of NgZone.\n    this._ngZone.runOutsideAngular(() => {\n      this.subscriptions.add(\n        this._ngZone.onError.subscribe({\n          next: (error: any) => {\n            throw error;\n          },\n        }),\n      );\n    });\n  }\n\n  /**\n   * Trigger a change detection cycle for the component.\n   */\n  detectChanges(checkNoChanges = true): void {\n    this.microtaskEffectScheduler.flush();\n    const originalCheckNoChanges = this.componentRef.changeDetectorRef.checkNoChanges;\n    try {\n      if (!checkNoChanges) {\n        this.componentRef.changeDetectorRef.checkNoChanges = () => {};\n      }\n\n      if (this.zonelessEnabled) {\n        try {\n          this._testAppRef.externalTestViews.add(this.componentRef.hostView);\n          this._appRef.tick();\n        } finally {\n          if (!this.autoDetect) {\n            this._testAppRef.externalTestViews.delete(this.componentRef.hostView);\n          }\n        }\n      } else {\n        // Run the change detection inside the NgZone so that any async tasks as part of the change\n        // detection are captured by the zone and can be waited for in isStable.\n        this._ngZone.run(() => {\n          // Flush root effects before `detectChanges()`, to emulate the sequencing of `tick()`.\n          this.rootEffectScheduler.flush();\n          this.changeDetectorRef.detectChanges();\n          this.checkNoChanges();\n        });\n      }\n    } finally {\n      this.componentRef.changeDetectorRef.checkNoChanges = originalCheckNoChanges;\n    }\n    this.microtaskEffectScheduler.flush();\n  }\n\n  /**\n   * Do a change detection run to make sure there were no changes.\n   */\n  checkNoChanges(): void {\n    this.changeDetectorRef.checkNoChanges();\n  }\n\n  /**\n   * Set whether the fixture should autodetect changes.\n   *\n   * Also runs detectChanges once so that any existing change is detected.\n   *\n   * @param autoDetect Whether to autodetect changes. By default, `true`.\n   */\n  autoDetectChanges(autoDetect = true): void {\n    if (this._noZoneOptionIsSet && !this.zonelessEnabled) {\n      throw new Error('Cannot call autoDetectChanges when ComponentFixtureNoNgZone is set.');\n    }\n\n    if (autoDetect !== this.autoDetect) {\n      if (autoDetect) {\n        this._testAppRef.externalTestViews.add(this.componentRef.hostView);\n      } else {\n        this._testAppRef.externalTestViews.delete(this.componentRef.hostView);\n      }\n    }\n\n    this.autoDetect = autoDetect;\n    this.detectChanges();\n  }\n\n  /**\n   * Return whether the fixture is currently stable or has async tasks that have not been completed\n   * yet.\n   */\n  isStable(): boolean {\n    return !this.pendingTasks.hasPendingTasks.value;\n  }\n\n  /**\n   * Get a promise that resolves when the fixture is stable.\n   *\n   * This can be used to resume testing after events have triggered asynchronous activity or\n   * asynchronous change detection.\n   */\n  whenStable(): Promise<any> {\n    if (this.isStable()) {\n      return Promise.resolve(false);\n    }\n\n    return new Promise((resolve, reject) => {\n      this.appErrorHandler.whenStableRejectFunctions.add(reject);\n      this._appRef.whenStable().then(() => {\n        this.appErrorHandler.whenStableRejectFunctions.delete(reject);\n        resolve(true);\n      });\n    });\n  }\n\n  /**\n   * Retrieves all defer block fixtures in the component fixture.\n   */\n  getDeferBlocks(): Promise<DeferBlockFixture[]> {\n    const deferBlocks: DeferBlockDetails[] = [];\n    const lView = (this.componentRef.hostView as any)['_lView'];\n    getDeferBlocks(lView, deferBlocks);\n\n    const deferBlockFixtures = [];\n    for (const block of deferBlocks) {\n      deferBlockFixtures.push(new DeferBlockFixture(block, this));\n    }\n\n    return Promise.resolve(deferBlockFixtures);\n  }\n\n  private _getRenderer() {\n    if (this._renderer === undefined) {\n      this._renderer = this.componentRef.injector.get(RendererFactory2, null);\n    }\n    return this._renderer as RendererFactory2 | null;\n  }\n\n  /**\n   * Get a promise that resolves when the ui state is stable following animations.\n   */\n  whenRenderingDone(): Promise<any> {\n    const renderer = this._getRenderer();\n    if (renderer && renderer.whenRenderingDone) {\n      return renderer.whenRenderingDone();\n    }\n    return this.whenStable();\n  }\n\n  /**\n   * Trigger component destruction.\n   */\n  destroy(): void {\n    this.subscriptions.unsubscribe();\n    this._testAppRef.externalTestViews.delete(this.componentRef.hostView);\n    if (!this._isDestroyed) {\n      this.componentRef.destroy();\n      this._isDestroyed = true;\n    }\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// Needed for the global `Zone` ambient types to be available.\nimport type {} from 'zone.js';\n\nconst _Zone: any = typeof Zone !== 'undefined' ? Zone : null;\nconst fakeAsyncTestModule = _Zone && _Zone[_Zone.__symbol__('fakeAsyncTest')];\n\nconst fakeAsyncTestModuleNotLoadedErrorMessage = `zone-testing.js is needed for the fakeAsync() test helper but could not be found.\n        Please make sure that your environment includes zone.js/testing`;\n\n/**\n * Clears out the shared fake async zone for a test.\n * To be called in a global `beforeEach`.\n *\n * @publicApi\n */\nexport function resetFakeAsyncZone(): void {\n  if (fakeAsyncTestModule) {\n    return fakeAsyncTestModule.resetFakeAsyncZone();\n  }\n  throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);\n}\n\nexport function resetFakeAsyncZoneIfExists(): void {\n  if (fakeAsyncTestModule && (Zone as any)['ProxyZoneSpec']?.isLoaded()) {\n    fakeAsyncTestModule.resetFakeAsyncZone();\n  }\n}\n\n/**\n * Wraps a function to be executed in the `fakeAsync` zone:\n * - Microtasks are manually executed by calling `flushMicrotasks()`.\n * - Timers are synchronous; `tick()` simulates the asynchronous passage of time.\n *\n * Can be used to wrap `inject()` calls.\n *\n * @param fn The function that you want to wrap in the `fakeAsync` zone.\n * @param options\n *   - flush: When true, will drain the macrotask queue after the test function completes.\n *     When false, will throw an exception at the end of the function if there are pending timers.\n *\n * @usageNotes\n * ### Example\n *\n * {@example core/testing/ts/fake_async.ts region='basic'}\n *\n *\n * @returns The function wrapped to be executed in the `fakeAsync` zone.\n * Any arguments passed when calling this returned function will be passed through to the `fn`\n * function in the parameters when it is called.\n *\n * @publicApi\n */\nexport function fakeAsync(fn: Function, options?: {flush?: boolean}): (...args: any[]) => any {\n  if (fakeAsyncTestModule) {\n    return fakeAsyncTestModule.fakeAsync(fn, options);\n  }\n  throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);\n}\n\n/**\n * Simulates the asynchronous passage of time for the timers in the `fakeAsync` zone.\n *\n * The microtasks queue is drained at the very start of this function and after any timer callback\n * has been executed.\n *\n * @param millis The number of milliseconds to advance the virtual timer.\n * @param tickOptions The options to pass to the `tick()` function.\n *\n * @usageNotes\n *\n * The `tick()` option is a flag called `processNewMacroTasksSynchronously`,\n * which determines whether or not to invoke new macroTasks.\n *\n * If you provide a `tickOptions` object, but do not specify a\n * `processNewMacroTasksSynchronously` property (`tick(100, {})`),\n * then `processNewMacroTasksSynchronously` defaults to true.\n *\n * If you omit the `tickOptions` parameter (`tick(100))`), then\n * `tickOptions` defaults to `{processNewMacroTasksSynchronously: true}`.\n *\n * ### Example\n *\n * {@example core/testing/ts/fake_async.ts region='basic'}\n *\n * The following example includes a nested timeout (new macroTask), and\n * the `tickOptions` parameter is allowed to default. In this case,\n * `processNewMacroTasksSynchronously` defaults to true, and the nested\n * function is executed on each tick.\n *\n * ```ts\n * it ('test with nested setTimeout', fakeAsync(() => {\n *   let nestedTimeoutInvoked = false;\n *   function funcWithNestedTimeout() {\n *     setTimeout(() => {\n *       nestedTimeoutInvoked = true;\n *     });\n *   };\n *   setTimeout(funcWithNestedTimeout);\n *   tick();\n *   expect(nestedTimeoutInvoked).toBe(true);\n * }));\n * ```\n *\n * In the following case, `processNewMacroTasksSynchronously` is explicitly\n * set to false, so the nested timeout function is not invoked.\n *\n * ```ts\n * it ('test with nested setTimeout', fakeAsync(() => {\n *   let nestedTimeoutInvoked = false;\n *   function funcWithNestedTimeout() {\n *     setTimeout(() => {\n *       nestedTimeoutInvoked = true;\n *     });\n *   };\n *   setTimeout(funcWithNestedTimeout);\n *   tick(0, {processNewMacroTasksSynchronously: false});\n *   expect(nestedTimeoutInvoked).toBe(false);\n * }));\n * ```\n *\n *\n * @publicApi\n */\nexport function tick(\n  millis: number = 0,\n  tickOptions: {processNewMacroTasksSynchronously: boolean} = {\n    processNewMacroTasksSynchronously: true,\n  },\n): void {\n  if (fakeAsyncTestModule) {\n    return fakeAsyncTestModule.tick(millis, tickOptions);\n  }\n  throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);\n}\n\n/**\n * Flushes any pending microtasks and simulates the asynchronous passage of time for the timers in\n * the `fakeAsync` zone by\n * draining the macrotask queue until it is empty.\n *\n * @param maxTurns The maximum number of times the scheduler attempts to clear its queue before\n *     throwing an error.\n * @returns The simulated time elapsed, in milliseconds.\n *\n * @publicApi\n */\nexport function flush(maxTurns?: number): number {\n  if (fakeAsyncTestModule) {\n    return fakeAsyncTestModule.flush(maxTurns);\n  }\n  throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);\n}\n\n/**\n * Discard all remaining periodic tasks.\n *\n * @publicApi\n */\nexport function discardPeriodicTasks(): void {\n  if (fakeAsyncTestModule) {\n    return fakeAsyncTestModule.discardPeriodicTasks();\n  }\n  throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);\n}\n\n/**\n * Flush any pending microtasks.\n *\n * @publicApi\n */\nexport function flushMicrotasks(): void {\n  if (fakeAsyncTestModule) {\n    return fakeAsyncTestModule.flushMicrotasks();\n  }\n  throw new Error(fakeAsyncTestModuleNotLoadedErrorMessage);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ɵstringify as stringify} from '@angular/core';\n\nimport {MetadataOverride} from './metadata_override';\n\ntype StringMap = {\n  [key: string]: any;\n};\n\nlet _nextReferenceId = 0;\n\nexport class MetadataOverrider {\n  private _references = new Map<any, string>();\n  /**\n   * Creates a new instance for the given metadata class\n   * based on an old instance and overrides.\n   */\n  overrideMetadata<C extends T, T>(\n    metadataClass: {new (options: T): C},\n    oldMetadata: C,\n    override: MetadataOverride<T>,\n  ): C {\n    const props: StringMap = {};\n    if (oldMetadata) {\n      _valueProps(oldMetadata).forEach((prop) => (props[prop] = (<any>oldMetadata)[prop]));\n    }\n\n    if (override.set) {\n      if (override.remove || override.add) {\n        throw new Error(`Cannot set and add/remove ${stringify(metadataClass)} at the same time!`);\n      }\n      setMetadata(props, override.set);\n    }\n    if (override.remove) {\n      removeMetadata(props, override.remove, this._references);\n    }\n    if (override.add) {\n      addMetadata(props, override.add);\n    }\n    return new metadataClass(<any>props);\n  }\n}\n\nfunction removeMetadata(metadata: StringMap, remove: any, references: Map<any, string>) {\n  const removeObjects = new Set<string>();\n  for (const prop in remove) {\n    const removeValue = remove[prop];\n    if (Array.isArray(removeValue)) {\n      removeValue.forEach((value: any) => {\n        removeObjects.add(_propHashKey(prop, value, references));\n      });\n    } else {\n      removeObjects.add(_propHashKey(prop, removeValue, references));\n    }\n  }\n\n  for (const prop in metadata) {\n    const propValue = metadata[prop];\n    if (Array.isArray(propValue)) {\n      metadata[prop] = propValue.filter(\n        (value: any) => !removeObjects.has(_propHashKey(prop, value, references)),\n      );\n    } else {\n      if (removeObjects.has(_propHashKey(prop, propValue, references))) {\n        metadata[prop] = undefined;\n      }\n    }\n  }\n}\n\nfunction addMetadata(metadata: StringMap, add: any) {\n  for (const prop in add) {\n    const addValue = add[prop];\n    const propValue = metadata[prop];\n    if (propValue != null && Array.isArray(propValue)) {\n      metadata[prop] = propValue.concat(addValue);\n    } else {\n      metadata[prop] = addValue;\n    }\n  }\n}\n\nfunction setMetadata(metadata: StringMap, set: any) {\n  for (const prop in set) {\n    metadata[prop] = set[prop];\n  }\n}\n\nfunction _propHashKey(propName: any, propValue: any, references: Map<any, string>): string {\n  let nextObjectId = 0;\n  const objectIds = new Map<object, string>();\n  const replacer = (key: any, value: any) => {\n    if (value !== null && typeof value === 'object') {\n      if (objectIds.has(value)) {\n        return objectIds.get(value);\n      }\n      // Record an id for this object such that any later references use the object's id instead\n      // of the object itself, in order to break cyclic pointers in objects.\n      objectIds.set(value, `ɵobj#${nextObjectId++}`);\n\n      // The first time an object is seen the object itself is serialized.\n      return value;\n    } else if (typeof value === 'function') {\n      value = _serializeReference(value, references);\n    }\n    return value;\n  };\n\n  return `${propName}:${JSON.stringify(propValue, replacer)}`;\n}\n\nfunction _serializeReference(ref: any, references: Map<any, string>): string {\n  let id = references.get(ref);\n  if (!id) {\n    id = `${stringify(ref)}${_nextReferenceId++}`;\n    references.set(ref, id);\n  }\n  return id;\n}\n\nfunction _valueProps(obj: any): string[] {\n  const props: string[] = [];\n  // regular public props\n  Object.keys(obj).forEach((prop) => {\n    if (!prop.startsWith('_')) {\n      props.push(prop);\n    }\n  });\n\n  // getters\n  let proto = obj;\n  while ((proto = Object.getPrototypeOf(proto))) {\n    Object.keys(proto).forEach((protoProp) => {\n      const desc = Object.getOwnPropertyDescriptor(proto, protoProp);\n      if (!protoProp.startsWith('_') && desc && 'get' in desc) {\n        props.push(protoProp);\n      }\n    });\n  }\n  return props;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Component,\n  Directive,\n  NgModule,\n  Pipe,\n  Type,\n  ɵReflectionCapabilities as ReflectionCapabilities,\n} from '@angular/core';\n\nimport {MetadataOverride} from './metadata_override';\nimport {MetadataOverrider} from './metadata_overrider';\n\nconst reflection = new ReflectionCapabilities();\n\n/**\n * Base interface to resolve `@Component`, `@Directive`, `@Pipe` and `@NgModule`.\n */\nexport interface Resolver<T> {\n  addOverride(type: Type<any>, override: MetadataOverride<T>): void;\n  setOverrides(overrides: Array<[Type<any>, MetadataOverride<T>]>): void;\n  resolve(type: Type<any>): T | null;\n}\n\n/**\n * Allows to override ivy metadata for tests (via the `TestBed`).\n */\nabstract class OverrideResolver<T> implements Resolver<T> {\n  private overrides = new Map<Type<any>, MetadataOverride<T>[]>();\n  private resolved = new Map<Type<any>, T | null>();\n\n  abstract get type(): any;\n\n  addOverride(type: Type<any>, override: MetadataOverride<T>) {\n    const overrides = this.overrides.get(type) || [];\n    overrides.push(override);\n    this.overrides.set(type, overrides);\n    this.resolved.delete(type);\n  }\n\n  setOverrides(overrides: Array<[Type<any>, MetadataOverride<T>]>) {\n    this.overrides.clear();\n    overrides.forEach(([type, override]) => {\n      this.addOverride(type, override);\n    });\n  }\n\n  getAnnotation(type: Type<any>): T | null {\n    const annotations = reflection.annotations(type);\n    // Try to find the nearest known Type annotation and make sure that this annotation is an\n    // instance of the type we are looking for, so we can use it for resolution. Note: there might\n    // be multiple known annotations found due to the fact that Components can extend Directives (so\n    // both Directive and Component annotations would be present), so we always check if the known\n    // annotation has the right type.\n    for (let i = annotations.length - 1; i >= 0; i--) {\n      const annotation = annotations[i];\n      const isKnownType =\n        annotation instanceof Directive ||\n        annotation instanceof Component ||\n        annotation instanceof Pipe ||\n        annotation instanceof NgModule;\n      if (isKnownType) {\n        return annotation instanceof this.type ? (annotation as unknown as T) : null;\n      }\n    }\n    return null;\n  }\n\n  resolve(type: Type<any>): T | null {\n    let resolved: T | null = this.resolved.get(type) || null;\n\n    if (!resolved) {\n      resolved = this.getAnnotation(type);\n      if (resolved) {\n        const overrides = this.overrides.get(type);\n        if (overrides) {\n          const overrider = new MetadataOverrider();\n          overrides.forEach((override) => {\n            resolved = overrider.overrideMetadata(this.type, resolved!, override);\n          });\n        }\n      }\n      this.resolved.set(type, resolved);\n    }\n\n    return resolved;\n  }\n}\n\nexport class DirectiveResolver extends OverrideResolver<Directive> {\n  override get type() {\n    return Directive;\n  }\n}\n\nexport class ComponentResolver extends OverrideResolver<Component> {\n  override get type() {\n    return Component;\n  }\n}\n\nexport class PipeResolver extends OverrideResolver<Pipe> {\n  override get type() {\n    return Pipe;\n  }\n}\n\nexport class NgModuleResolver extends OverrideResolver<NgModule> {\n  override get type() {\n    return NgModule;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ResourceLoader} from '@angular/compiler';\nimport {\n  ApplicationInitStatus,\n  ɵINTERNAL_APPLICATION_ERROR_HANDLER as INTERNAL_APPLICATION_ERROR_HANDLER,\n  ɵChangeDetectionScheduler as ChangeDetectionScheduler,\n  ɵChangeDetectionSchedulerImpl as ChangeDetectionSchedulerImpl,\n  Compiler,\n  COMPILER_OPTIONS,\n  Component,\n  Directive,\n  Injector,\n  inject,\n  InjectorType,\n  LOCALE_ID,\n  ModuleWithComponentFactories,\n  ModuleWithProviders,\n  NgModule,\n  NgModuleFactory,\n  Pipe,\n  PlatformRef,\n  Provider,\n  resolveForwardRef,\n  StaticProvider,\n  Type,\n  ɵclearResolutionOfComponentResourcesQueue,\n  ɵcompileComponent as compileComponent,\n  ɵcompileDirective as compileDirective,\n  ɵcompileNgModuleDefs as compileNgModuleDefs,\n  ɵcompilePipe as compilePipe,\n  ɵDEFAULT_LOCALE_ID as DEFAULT_LOCALE_ID,\n  ɵDEFER_BLOCK_CONFIG as DEFER_BLOCK_CONFIG,\n  ɵdepsTracker as depsTracker,\n  ɵDirectiveDef as DirectiveDef,\n  ɵgenerateStandaloneInDeclarationsError,\n  ɵgetAsyncClassMetadataFn as getAsyncClassMetadataFn,\n  ɵgetInjectableDef as getInjectableDef,\n  ɵInternalEnvironmentProviders as InternalEnvironmentProviders,\n  ɵinternalProvideZoneChangeDetection as internalProvideZoneChangeDetection,\n  ɵisComponentDefPendingResolution,\n  ɵisEnvironmentProviders as isEnvironmentProviders,\n  ɵNG_COMP_DEF as NG_COMP_DEF,\n  ɵNG_DIR_DEF as NG_DIR_DEF,\n  ɵNG_INJ_DEF as NG_INJ_DEF,\n  ɵNG_MOD_DEF as NG_MOD_DEF,\n  ɵNG_PIPE_DEF as NG_PIPE_DEF,\n  ɵNgModuleFactory as R3NgModuleFactory,\n  ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes,\n  ɵNgModuleType as NgModuleType,\n  ɵpatchComponentDefWithScope as patchComponentDefWithScope,\n  ɵRender3ComponentFactory as ComponentFactory,\n  ɵRender3NgModuleRef as NgModuleRef,\n  ɵresolveComponentResources,\n  ɵrestoreComponentResolutionQueue,\n  ɵsetLocaleId as setLocaleId,\n  ɵtransitiveScopesFor as transitiveScopesFor,\n  ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT as USE_RUNTIME_DEPS_TRACKER_FOR_JIT,\n  ɵɵInjectableDeclaration as InjectableDeclaration,\n  NgZone,\n  ErrorHandler,\n} from '@angular/core';\n\nimport {ComponentDef, ComponentType} from '../../src/render3';\n\nimport {MetadataOverride} from './metadata_override';\nimport {\n  ComponentResolver,\n  DirectiveResolver,\n  NgModuleResolver,\n  PipeResolver,\n  Resolver,\n} from './resolvers';\nimport {DEFER_BLOCK_DEFAULT_BEHAVIOR, TestModuleMetadata} from './test_bed_common';\nimport {\n  RETHROW_APPLICATION_ERRORS_DEFAULT,\n  TestBedApplicationErrorHandler,\n} from './application_error_handler';\n\nenum TestingModuleOverride {\n  DECLARATION,\n  OVERRIDE_TEMPLATE,\n}\n\nfunction isTestingModuleOverride(value: unknown): value is TestingModuleOverride {\n  return (\n    value === TestingModuleOverride.DECLARATION || value === TestingModuleOverride.OVERRIDE_TEMPLATE\n  );\n}\n\nfunction assertNoStandaloneComponents(\n  types: Type<any>[],\n  resolver: Resolver<any>,\n  location: string,\n) {\n  types.forEach((type) => {\n    if (!getAsyncClassMetadataFn(type)) {\n      const component = resolver.resolve(type);\n      if (component && (component.standalone == null || component.standalone)) {\n        throw new Error(ɵgenerateStandaloneInDeclarationsError(type, location));\n      }\n    }\n  });\n}\n\n// Resolvers for Angular decorators\ntype Resolvers = {\n  module: Resolver<NgModule>;\n  component: Resolver<Directive>;\n  directive: Resolver<Component>;\n  pipe: Resolver<Pipe>;\n};\n\ninterface CleanupOperation {\n  fieldName: string;\n  object: any;\n  originalValue: unknown;\n}\n\nexport class TestBedCompiler {\n  private originalComponentResolutionQueue: Map<Type<any>, Component> | null = null;\n\n  // Testing module configuration\n  private declarations: Type<any>[] = [];\n  private imports: Type<any>[] = [];\n  private providers: Provider[] = [];\n  private schemas: any[] = [];\n\n  // Queues of components/directives/pipes that should be recompiled.\n  private pendingComponents = new Set<Type<any>>();\n  private pendingDirectives = new Set<Type<any>>();\n  private pendingPipes = new Set<Type<any>>();\n\n  // Set of components with async metadata, i.e. components with `@defer` blocks\n  // in their templates.\n  private componentsWithAsyncMetadata = new Set<Type<unknown>>();\n\n  // Keep track of all components and directives, so we can patch Providers onto defs later.\n  private seenComponents = new Set<Type<any>>();\n  private seenDirectives = new Set<Type<any>>();\n\n  // Keep track of overridden modules, so that we can collect all affected ones in the module tree.\n  private overriddenModules = new Set<NgModuleType<any>>();\n\n  // Store resolved styles for Components that have template overrides present and `styleUrls`\n  // defined at the same time.\n  private existingComponentStyles = new Map<Type<any>, string[]>();\n\n  private resolvers: Resolvers = initResolvers();\n\n  // Map of component type to an NgModule that declares it.\n  //\n  // There are a couple special cases:\n  // - for standalone components, the module scope value is `null`\n  // - when a component is declared in `TestBed.configureTestingModule()` call or\n  //   a component's template is overridden via `TestBed.overrideTemplateUsingTestingModule()`.\n  //   we use a special value from the `TestingModuleOverride` enum.\n  private componentToModuleScope = new Map<Type<any>, Type<any> | TestingModuleOverride | null>();\n\n  // Map that keeps initial version of component/directive/pipe defs in case\n  // we compile a Type again, thus overriding respective static fields. This is\n  // required to make sure we restore defs to their initial states between test runs.\n  // Note: one class may have multiple defs (for example: ɵmod and ɵinj in case of an\n  // NgModule), store all of them in a map.\n  private initialNgDefs = new Map<Type<any>, Map<string, PropertyDescriptor | undefined>>();\n\n  // Array that keeps cleanup operations for initial versions of component/directive/pipe/module\n  // defs in case TestBed makes changes to the originals.\n  private defCleanupOps: CleanupOperation[] = [];\n\n  private _injector: Injector | null = null;\n  private compilerProviders: Provider[] | null = null;\n\n  private providerOverrides: Provider[] = [];\n  private rootProviderOverrides: Provider[] = [];\n  // Overrides for injectables with `{providedIn: SomeModule}` need to be tracked and added to that\n  // module's provider list.\n  private providerOverridesByModule = new Map<InjectorType<any>, Provider[]>();\n  private providerOverridesByToken = new Map<any, Provider>();\n  private scopesWithOverriddenProviders = new Set<Type<any>>();\n\n  private testModuleType: NgModuleType<any>;\n  private testModuleRef: NgModuleRef<any> | null = null;\n\n  private deferBlockBehavior = DEFER_BLOCK_DEFAULT_BEHAVIOR;\n  private rethrowApplicationTickErrors = RETHROW_APPLICATION_ERRORS_DEFAULT;\n\n  constructor(\n    private platform: PlatformRef,\n    private additionalModuleTypes: Type<any> | Type<any>[],\n  ) {\n    class DynamicTestModule {}\n    this.testModuleType = DynamicTestModule as any;\n  }\n\n  setCompilerProviders(providers: Provider[] | null): void {\n    this.compilerProviders = providers;\n    this._injector = null;\n  }\n\n  configureTestingModule(moduleDef: TestModuleMetadata): void {\n    // Enqueue any compilation tasks for the directly declared component.\n    if (moduleDef.declarations !== undefined) {\n      // Verify that there are no standalone components\n      assertNoStandaloneComponents(\n        moduleDef.declarations,\n        this.resolvers.component,\n        '\"TestBed.configureTestingModule\" call',\n      );\n      this.queueTypeArray(moduleDef.declarations, TestingModuleOverride.DECLARATION);\n      this.declarations.push(...moduleDef.declarations);\n    }\n\n    // Enqueue any compilation tasks for imported modules.\n    if (moduleDef.imports !== undefined) {\n      this.queueTypesFromModulesArray(moduleDef.imports);\n      this.imports.push(...moduleDef.imports);\n    }\n\n    if (moduleDef.providers !== undefined) {\n      this.providers.push(...moduleDef.providers);\n    }\n\n    if (moduleDef.schemas !== undefined) {\n      this.schemas.push(...moduleDef.schemas);\n    }\n\n    this.deferBlockBehavior = moduleDef.deferBlockBehavior ?? DEFER_BLOCK_DEFAULT_BEHAVIOR;\n    this.rethrowApplicationTickErrors =\n      moduleDef.rethrowApplicationErrors ?? RETHROW_APPLICATION_ERRORS_DEFAULT;\n  }\n\n  overrideModule(ngModule: Type<any>, override: MetadataOverride<NgModule>): void {\n    if (USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {\n      depsTracker.clearScopeCacheFor(ngModule);\n    }\n    this.overriddenModules.add(ngModule as NgModuleType<any>);\n\n    // Compile the module right away.\n    this.resolvers.module.addOverride(ngModule, override);\n    const metadata = this.resolvers.module.resolve(ngModule);\n    if (metadata === null) {\n      throw invalidTypeError(ngModule.name, 'NgModule');\n    }\n\n    this.recompileNgModule(ngModule, metadata);\n\n    // At this point, the module has a valid module def (ɵmod), but the override may have introduced\n    // new declarations or imported modules. Ingest any possible new types and add them to the\n    // current queue.\n    this.queueTypesFromModulesArray([ngModule]);\n  }\n\n  overrideComponent(component: Type<any>, override: MetadataOverride<Component>): void {\n    this.verifyNoStandaloneFlagOverrides(component, override);\n    this.resolvers.component.addOverride(component, override);\n    this.pendingComponents.add(component);\n\n    // If this is a component with async metadata (i.e. a component with a `@defer` block\n    // in a template) - store it for future processing.\n    this.maybeRegisterComponentWithAsyncMetadata(component);\n  }\n\n  overrideDirective(directive: Type<any>, override: MetadataOverride<Directive>): void {\n    this.verifyNoStandaloneFlagOverrides(directive, override);\n    this.resolvers.directive.addOverride(directive, override);\n    this.pendingDirectives.add(directive);\n  }\n\n  overridePipe(pipe: Type<any>, override: MetadataOverride<Pipe>): void {\n    this.verifyNoStandaloneFlagOverrides(pipe, override);\n    this.resolvers.pipe.addOverride(pipe, override);\n    this.pendingPipes.add(pipe);\n  }\n\n  private verifyNoStandaloneFlagOverrides(\n    type: Type<any>,\n    override: MetadataOverride<Component | Directive | Pipe>,\n  ) {\n    if (\n      override.add?.hasOwnProperty('standalone') ||\n      override.set?.hasOwnProperty('standalone') ||\n      override.remove?.hasOwnProperty('standalone')\n    ) {\n      throw new Error(\n        `An override for the ${type.name} class has the \\`standalone\\` flag. ` +\n          `Changing the \\`standalone\\` flag via TestBed overrides is not supported.`,\n      );\n    }\n  }\n\n  overrideProvider(\n    token: any,\n    provider: {useFactory?: Function; useValue?: any; deps?: any[]; multi?: boolean},\n  ): void {\n    let providerDef: Provider;\n    if (provider.useFactory !== undefined) {\n      providerDef = {\n        provide: token,\n        useFactory: provider.useFactory,\n        deps: provider.deps || [],\n        multi: provider.multi,\n      };\n    } else if (provider.useValue !== undefined) {\n      providerDef = {provide: token, useValue: provider.useValue, multi: provider.multi};\n    } else {\n      providerDef = {provide: token};\n    }\n\n    const injectableDef: InjectableDeclaration<any> | null =\n      typeof token !== 'string' ? getInjectableDef(token) : null;\n    const providedIn = injectableDef === null ? null : resolveForwardRef(injectableDef.providedIn);\n    const overridesBucket =\n      providedIn === 'root' ? this.rootProviderOverrides : this.providerOverrides;\n    overridesBucket.push(providerDef);\n\n    // Keep overrides grouped by token as well for fast lookups using token\n    this.providerOverridesByToken.set(token, providerDef);\n    if (injectableDef !== null && providedIn !== null && typeof providedIn !== 'string') {\n      const existingOverrides = this.providerOverridesByModule.get(providedIn);\n      if (existingOverrides !== undefined) {\n        existingOverrides.push(providerDef);\n      } else {\n        this.providerOverridesByModule.set(providedIn, [providerDef]);\n      }\n    }\n  }\n\n  overrideTemplateUsingTestingModule(type: Type<any>, template: string): void {\n    const def = (type as any)[NG_COMP_DEF];\n    const hasStyleUrls = (): boolean => {\n      const metadata = this.resolvers.component.resolve(type)! as Component;\n      return !!metadata.styleUrl || !!metadata.styleUrls?.length;\n    };\n    const overrideStyleUrls = !!def && !ɵisComponentDefPendingResolution(type) && hasStyleUrls();\n\n    // In Ivy, compiling a component does not require knowing the module providing the\n    // component's scope, so overrideTemplateUsingTestingModule can be implemented purely via\n    // overrideComponent. Important: overriding template requires full Component re-compilation,\n    // which may fail in case styleUrls are also present (thus Component is considered as required\n    // resolution). In order to avoid this, we preemptively set styleUrls to an empty array,\n    // preserve current styles available on Component def and restore styles back once compilation\n    // is complete.\n    const override = overrideStyleUrls\n      ? {template, styles: [], styleUrls: [], styleUrl: undefined}\n      : {template};\n    this.overrideComponent(type, {set: override});\n\n    if (overrideStyleUrls && def.styles && def.styles.length > 0) {\n      this.existingComponentStyles.set(type, def.styles);\n    }\n\n    // Set the component's scope to be the testing module.\n    this.componentToModuleScope.set(type, TestingModuleOverride.OVERRIDE_TEMPLATE);\n  }\n\n  private async resolvePendingComponentsWithAsyncMetadata() {\n    if (this.componentsWithAsyncMetadata.size === 0) return;\n\n    const promises = [];\n    for (const component of this.componentsWithAsyncMetadata) {\n      const asyncMetadataFn = getAsyncClassMetadataFn(component);\n      if (asyncMetadataFn) {\n        promises.push(asyncMetadataFn());\n      }\n    }\n    this.componentsWithAsyncMetadata.clear();\n\n    const resolvedDeps = await Promise.all(promises);\n    const flatResolvedDeps = resolvedDeps.flat(2);\n    this.queueTypesFromModulesArray(flatResolvedDeps);\n\n    // Loaded standalone components might contain imports of NgModules\n    // with providers, make sure we override providers there too.\n    for (const component of flatResolvedDeps) {\n      this.applyProviderOverridesInScope(component);\n    }\n  }\n\n  async compileComponents(): Promise<void> {\n    this.clearComponentResolutionQueue();\n\n    // Wait for all async metadata for components that were\n    // overridden, we need resolved metadata to perform an override\n    // and re-compile a component.\n    await this.resolvePendingComponentsWithAsyncMetadata();\n\n    // Verify that there were no standalone components present in the `declarations` field\n    // during the `TestBed.configureTestingModule` call. We perform this check here in addition\n    // to the logic in the `configureTestingModule` function, since at this point we have\n    // all async metadata resolved.\n    assertNoStandaloneComponents(\n      this.declarations,\n      this.resolvers.component,\n      '\"TestBed.configureTestingModule\" call',\n    );\n\n    // Run compilers for all queued types.\n    let needsAsyncResources = this.compileTypesSync();\n\n    // compileComponents() should not be async unless it needs to be.\n    if (needsAsyncResources) {\n      let resourceLoader: ResourceLoader;\n      let resolver = (url: string): Promise<string> => {\n        if (!resourceLoader) {\n          resourceLoader = this.injector.get(ResourceLoader);\n        }\n        return Promise.resolve(resourceLoader.get(url));\n      };\n      await ɵresolveComponentResources(resolver);\n    }\n  }\n\n  finalize(): NgModuleRef<any> {\n    // One last compile\n    this.compileTypesSync();\n\n    // Create the testing module itself.\n    this.compileTestModule();\n\n    this.applyTransitiveScopes();\n\n    this.applyProviderOverrides();\n\n    // Patch previously stored `styles` Component values (taken from ɵcmp), in case these\n    // Components have `styleUrls` fields defined and template override was requested.\n    this.patchComponentsWithExistingStyles();\n\n    // Clear the componentToModuleScope map, so that future compilations don't reset the scope of\n    // every component.\n    this.componentToModuleScope.clear();\n\n    const parentInjector = this.platform.injector;\n    this.testModuleRef = new NgModuleRef(this.testModuleType, parentInjector, []);\n\n    // ApplicationInitStatus.runInitializers() is marked @internal to core.\n    // Cast it to any before accessing it.\n    (this.testModuleRef.injector.get(ApplicationInitStatus) as any).runInitializers();\n\n    // Set locale ID after running app initializers, since locale information might be updated while\n    // running initializers. This is also consistent with the execution order while bootstrapping an\n    // app (see `packages/core/src/application_ref.ts` file).\n    const localeId = this.testModuleRef.injector.get(LOCALE_ID, DEFAULT_LOCALE_ID);\n    setLocaleId(localeId);\n\n    return this.testModuleRef;\n  }\n\n  /**\n   * @internal\n   */\n  _compileNgModuleSync(moduleType: Type<any>): void {\n    this.queueTypesFromModulesArray([moduleType]);\n    this.compileTypesSync();\n    this.applyProviderOverrides();\n    this.applyProviderOverridesInScope(moduleType);\n    this.applyTransitiveScopes();\n  }\n\n  /**\n   * @internal\n   */\n  async _compileNgModuleAsync(moduleType: Type<any>): Promise<void> {\n    this.queueTypesFromModulesArray([moduleType]);\n    await this.compileComponents();\n    this.applyProviderOverrides();\n    this.applyProviderOverridesInScope(moduleType);\n    this.applyTransitiveScopes();\n  }\n\n  /**\n   * @internal\n   */\n  _getModuleResolver(): Resolver<NgModule> {\n    return this.resolvers.module;\n  }\n\n  /**\n   * @internal\n   */\n  _getComponentFactories(moduleType: NgModuleType): ComponentFactory<any>[] {\n    return maybeUnwrapFn(moduleType.ɵmod.declarations).reduce((factories, declaration) => {\n      const componentDef = (declaration as any).ɵcmp;\n      componentDef && factories.push(new ComponentFactory(componentDef, this.testModuleRef!));\n      return factories;\n    }, [] as ComponentFactory<any>[]);\n  }\n\n  private compileTypesSync(): boolean {\n    // Compile all queued components, directives, pipes.\n    let needsAsyncResources = false;\n    this.pendingComponents.forEach((declaration) => {\n      if (getAsyncClassMetadataFn(declaration)) {\n        throw new Error(\n          `Component '${declaration.name}' has unresolved metadata. ` +\n            `Please call \\`await TestBed.compileComponents()\\` before running this test.`,\n        );\n      }\n\n      needsAsyncResources = needsAsyncResources || ɵisComponentDefPendingResolution(declaration);\n\n      const metadata = this.resolvers.component.resolve(declaration);\n      if (metadata === null) {\n        throw invalidTypeError(declaration.name, 'Component');\n      }\n\n      this.maybeStoreNgDef(NG_COMP_DEF, declaration);\n      if (USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {\n        depsTracker.clearScopeCacheFor(declaration);\n      }\n      compileComponent(declaration, metadata);\n    });\n    this.pendingComponents.clear();\n\n    this.pendingDirectives.forEach((declaration) => {\n      const metadata = this.resolvers.directive.resolve(declaration);\n      if (metadata === null) {\n        throw invalidTypeError(declaration.name, 'Directive');\n      }\n      this.maybeStoreNgDef(NG_DIR_DEF, declaration);\n      compileDirective(declaration, metadata);\n    });\n    this.pendingDirectives.clear();\n\n    this.pendingPipes.forEach((declaration) => {\n      const metadata = this.resolvers.pipe.resolve(declaration);\n      if (metadata === null) {\n        throw invalidTypeError(declaration.name, 'Pipe');\n      }\n      this.maybeStoreNgDef(NG_PIPE_DEF, declaration);\n      compilePipe(declaration, metadata);\n    });\n    this.pendingPipes.clear();\n\n    return needsAsyncResources;\n  }\n\n  private applyTransitiveScopes(): void {\n    if (this.overriddenModules.size > 0) {\n      // Module overrides (via `TestBed.overrideModule`) might affect scopes that were previously\n      // calculated and stored in `transitiveCompileScopes`. If module overrides are present,\n      // collect all affected modules and reset scopes to force their re-calculation.\n      const testingModuleDef = (this.testModuleType as any)[NG_MOD_DEF];\n      const affectedModules = this.collectModulesAffectedByOverrides(testingModuleDef.imports);\n      if (affectedModules.size > 0) {\n        affectedModules.forEach((moduleType) => {\n          if (!USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {\n            this.storeFieldOfDefOnType(moduleType as any, NG_MOD_DEF, 'transitiveCompileScopes');\n            (moduleType as any)[NG_MOD_DEF].transitiveCompileScopes = null;\n          } else {\n            depsTracker.clearScopeCacheFor(moduleType);\n          }\n        });\n      }\n    }\n\n    const moduleToScope = new Map<Type<any> | TestingModuleOverride, NgModuleTransitiveScopes>();\n    const getScopeOfModule = (\n      moduleType: Type<any> | TestingModuleOverride,\n    ): NgModuleTransitiveScopes => {\n      if (!moduleToScope.has(moduleType)) {\n        const isTestingModule = isTestingModuleOverride(moduleType);\n        const realType = isTestingModule ? this.testModuleType : (moduleType as Type<any>);\n        moduleToScope.set(moduleType, transitiveScopesFor(realType));\n      }\n      return moduleToScope.get(moduleType)!;\n    };\n\n    this.componentToModuleScope.forEach((moduleType, componentType) => {\n      if (moduleType !== null) {\n        const moduleScope = getScopeOfModule(moduleType);\n        this.storeFieldOfDefOnType(componentType, NG_COMP_DEF, 'directiveDefs');\n        this.storeFieldOfDefOnType(componentType, NG_COMP_DEF, 'pipeDefs');\n        patchComponentDefWithScope(getComponentDef(componentType)!, moduleScope);\n      }\n      // `tView` that is stored on component def contains information about directives and pipes\n      // that are in the scope of this component. Patching component scope will cause `tView` to be\n      // changed. Store original `tView` before patching scope, so the `tView` (including scope\n      // information) is restored back to its previous/original state before running next test.\n      // Resetting `tView` is also needed for cases when we apply provider overrides and those\n      // providers are defined on component's level, in which case they may end up included into\n      // `tView.blueprint`.\n      this.storeFieldOfDefOnType(componentType, NG_COMP_DEF, 'tView');\n    });\n\n    this.componentToModuleScope.clear();\n  }\n\n  private applyProviderOverrides(): void {\n    const maybeApplyOverrides = (field: string) => (type: Type<any>) => {\n      const resolver = field === NG_COMP_DEF ? this.resolvers.component : this.resolvers.directive;\n      const metadata = resolver.resolve(type)!;\n      if (this.hasProviderOverrides(metadata.providers)) {\n        this.patchDefWithProviderOverrides(type, field);\n      }\n    };\n    this.seenComponents.forEach(maybeApplyOverrides(NG_COMP_DEF));\n    this.seenDirectives.forEach(maybeApplyOverrides(NG_DIR_DEF));\n\n    this.seenComponents.clear();\n    this.seenDirectives.clear();\n  }\n\n  /**\n   * Applies provider overrides to a given type (either an NgModule or a standalone component)\n   * and all imported NgModules and standalone components recursively.\n   */\n  private applyProviderOverridesInScope(type: Type<any>): void {\n    const hasScope = isStandaloneComponent(type) || isNgModule(type);\n\n    // The function can be re-entered recursively while inspecting dependencies\n    // of an NgModule or a standalone component. Exit early if we come across a\n    // type that can not have a scope (directive or pipe) or the type is already\n    // processed earlier.\n    if (!hasScope || this.scopesWithOverriddenProviders.has(type)) {\n      return;\n    }\n    this.scopesWithOverriddenProviders.add(type);\n\n    // NOTE: the line below triggers JIT compilation of the module injector,\n    // which also invokes verification of the NgModule semantics, which produces\n    // detailed error messages. The fact that the code relies on this line being\n    // present here is suspicious and should be refactored in a way that the line\n    // below can be moved (for ex. after an early exit check below).\n    const injectorDef: any = (type as any)[NG_INJ_DEF];\n\n    // No provider overrides, exit early.\n    if (this.providerOverridesByToken.size === 0) return;\n\n    if (isStandaloneComponent(type)) {\n      // Visit all component dependencies and override providers there.\n      const def = getComponentDef(type);\n      const dependencies = maybeUnwrapFn(def.dependencies ?? []);\n      for (const dependency of dependencies) {\n        this.applyProviderOverridesInScope(dependency);\n      }\n    } else {\n      const providers: Array<Provider | InternalEnvironmentProviders> = [\n        ...injectorDef.providers,\n        ...(this.providerOverridesByModule.get(type as InjectorType<any>) || []),\n      ];\n      if (this.hasProviderOverrides(providers)) {\n        this.maybeStoreNgDef(NG_INJ_DEF, type);\n\n        this.storeFieldOfDefOnType(type, NG_INJ_DEF, 'providers');\n        injectorDef.providers = this.getOverriddenProviders(providers);\n      }\n\n      // Apply provider overrides to imported modules recursively\n      const moduleDef = (type as any)[NG_MOD_DEF];\n      const imports = maybeUnwrapFn(moduleDef.imports);\n      for (const importedModule of imports) {\n        this.applyProviderOverridesInScope(importedModule);\n      }\n      // Also override the providers on any ModuleWithProviders imports since those don't appear in\n      // the moduleDef.\n      for (const importedModule of flatten(injectorDef.imports)) {\n        if (isModuleWithProviders(importedModule)) {\n          this.defCleanupOps.push({\n            object: importedModule,\n            fieldName: 'providers',\n            originalValue: importedModule.providers,\n          });\n          importedModule.providers = this.getOverriddenProviders(\n            importedModule.providers as Array<Provider | InternalEnvironmentProviders>,\n          );\n        }\n      }\n    }\n  }\n\n  private patchComponentsWithExistingStyles(): void {\n    this.existingComponentStyles.forEach(\n      (styles, type) => ((type as any)[NG_COMP_DEF].styles = styles),\n    );\n    this.existingComponentStyles.clear();\n  }\n\n  private queueTypeArray(arr: any[], moduleType: Type<any> | TestingModuleOverride): void {\n    for (const value of arr) {\n      if (Array.isArray(value)) {\n        this.queueTypeArray(value, moduleType);\n      } else {\n        this.queueType(value, moduleType);\n      }\n    }\n  }\n\n  private recompileNgModule(ngModule: Type<any>, metadata: NgModule): void {\n    // Cache the initial ngModuleDef as it will be overwritten.\n    this.maybeStoreNgDef(NG_MOD_DEF, ngModule);\n    this.maybeStoreNgDef(NG_INJ_DEF, ngModule);\n\n    compileNgModuleDefs(ngModule as NgModuleType<any>, metadata);\n  }\n\n  private maybeRegisterComponentWithAsyncMetadata(type: Type<unknown>) {\n    const asyncMetadataFn = getAsyncClassMetadataFn(type);\n    if (asyncMetadataFn) {\n      this.componentsWithAsyncMetadata.add(type);\n    }\n  }\n\n  private queueType(type: Type<any>, moduleType: Type<any> | TestingModuleOverride | null): void {\n    // If this is a component with async metadata (i.e. a component with a `@defer` block\n    // in a template) - store it for future processing.\n    this.maybeRegisterComponentWithAsyncMetadata(type);\n\n    const component = this.resolvers.component.resolve(type);\n    if (component) {\n      // Check whether a give Type has respective NG def (ɵcmp) and compile if def is\n      // missing. That might happen in case a class without any Angular decorators extends another\n      // class where Component/Directive/Pipe decorator is defined.\n      if (ɵisComponentDefPendingResolution(type) || !type.hasOwnProperty(NG_COMP_DEF)) {\n        this.pendingComponents.add(type);\n      }\n      this.seenComponents.add(type);\n\n      // Keep track of the module which declares this component, so later the component's scope\n      // can be set correctly. If the component has already been recorded here, then one of several\n      // cases is true:\n      // * the module containing the component was imported multiple times (common).\n      // * the component is declared in multiple modules (which is an error).\n      // * the component was in 'declarations' of the testing module, and also in an imported module\n      //   in which case the module scope will be TestingModuleOverride.DECLARATION.\n      // * overrideTemplateUsingTestingModule was called for the component in which case the module\n      //   scope will be TestingModuleOverride.OVERRIDE_TEMPLATE.\n      //\n      // If the component was previously in the testing module's 'declarations' (meaning the\n      // current value is TestingModuleOverride.DECLARATION), then `moduleType` is the component's\n      // real module, which was imported. This pattern is understood to mean that the component\n      // should use its original scope, but that the testing module should also contain the\n      // component in its scope.\n      if (\n        !this.componentToModuleScope.has(type) ||\n        this.componentToModuleScope.get(type) === TestingModuleOverride.DECLARATION\n      ) {\n        this.componentToModuleScope.set(type, moduleType);\n      }\n      return;\n    }\n\n    const directive = this.resolvers.directive.resolve(type);\n    if (directive) {\n      if (!type.hasOwnProperty(NG_DIR_DEF)) {\n        this.pendingDirectives.add(type);\n      }\n      this.seenDirectives.add(type);\n      return;\n    }\n\n    const pipe = this.resolvers.pipe.resolve(type);\n    if (pipe && !type.hasOwnProperty(NG_PIPE_DEF)) {\n      this.pendingPipes.add(type);\n      return;\n    }\n  }\n\n  private queueTypesFromModulesArray(arr: any[]): void {\n    // Becau   se we may encounter the same NgModule or a standalone Component while processing\n    // the dependencies of an NgModule or a standalone Component, we cache them in this set so we\n    // can skip ones that have already been seen encountered. In some test setups, this caching\n    // resulted in 10X runtime improvement.\n    const processedDefs = new Set();\n    const queueTypesFromModulesArrayRecur = (arr: any[]): void => {\n      for (const value of arr) {\n        if (Array.isArray(value)) {\n          queueTypesFromModulesArrayRecur(value);\n        } else if (hasNgModuleDef(value)) {\n          const def = value.ɵmod;\n          if (processedDefs.has(def)) {\n            continue;\n          }\n          processedDefs.add(def);\n          // Look through declarations, imports, and exports, and queue\n          // everything found there.\n          this.queueTypeArray(maybeUnwrapFn(def.declarations), value);\n          queueTypesFromModulesArrayRecur(maybeUnwrapFn(def.imports));\n          queueTypesFromModulesArrayRecur(maybeUnwrapFn(def.exports));\n        } else if (isModuleWithProviders(value)) {\n          queueTypesFromModulesArrayRecur([value.ngModule]);\n        } else if (isStandaloneComponent(value)) {\n          this.queueType(value, null);\n          const def = getComponentDef(value);\n\n          if (processedDefs.has(def)) {\n            continue;\n          }\n          processedDefs.add(def);\n\n          const dependencies = maybeUnwrapFn(def.dependencies ?? []);\n          dependencies.forEach((dependency) => {\n            // Note: in AOT, the `dependencies` might also contain regular\n            // (NgModule-based) Component, Directive and Pipes, so we handle\n            // them separately and proceed with recursive process for standalone\n            // Components and NgModules only.\n            if (isStandaloneComponent(dependency) || hasNgModuleDef(dependency)) {\n              queueTypesFromModulesArrayRecur([dependency]);\n            } else {\n              this.queueType(dependency, null);\n            }\n          });\n        }\n      }\n    };\n    queueTypesFromModulesArrayRecur(arr);\n  }\n\n  // When module overrides (via `TestBed.overrideModule`) are present, it might affect all modules\n  // that import (even transitively) an overridden one. For all affected modules we need to\n  // recalculate their scopes for a given test run and restore original scopes at the end. The goal\n  // of this function is to collect all affected modules in a set for further processing. Example:\n  // if we have the following module hierarchy: A -> B -> C (where `->` means `imports`) and module\n  // `C` is overridden, we consider `A` and `B` as affected, since their scopes might become\n  // invalidated with the override.\n  private collectModulesAffectedByOverrides(arr: any[]): Set<NgModuleType<any>> {\n    const seenModules = new Set<NgModuleType<any>>();\n    const affectedModules = new Set<NgModuleType<any>>();\n    const calcAffectedModulesRecur = (arr: any[], path: NgModuleType<any>[]): void => {\n      for (const value of arr) {\n        if (Array.isArray(value)) {\n          // If the value is an array, just flatten it (by invoking this function recursively),\n          // keeping \"path\" the same.\n          calcAffectedModulesRecur(value, path);\n        } else if (hasNgModuleDef(value)) {\n          if (seenModules.has(value)) {\n            // If we've seen this module before and it's included into \"affected modules\" list, mark\n            // the whole path that leads to that module as affected, but do not descend into its\n            // imports, since we already examined them before.\n            if (affectedModules.has(value)) {\n              path.forEach((item) => affectedModules.add(item));\n            }\n            continue;\n          }\n          seenModules.add(value);\n          if (this.overriddenModules.has(value)) {\n            path.forEach((item) => affectedModules.add(item));\n          }\n          // Examine module imports recursively to look for overridden modules.\n          const moduleDef = (value as any)[NG_MOD_DEF];\n          calcAffectedModulesRecur(maybeUnwrapFn(moduleDef.imports), path.concat(value));\n        }\n      }\n    };\n    calcAffectedModulesRecur(arr, []);\n    return affectedModules;\n  }\n\n  /**\n   * Preserve an original def (such as ɵmod, ɵinj, etc) before applying an override.\n   * Note: one class may have multiple defs (for example: ɵmod and ɵinj in case of\n   * an NgModule). If there is a def in a set already, don't override it, since\n   * an original one should be restored at the end of a test.\n   */\n  private maybeStoreNgDef(prop: string, type: Type<any>) {\n    if (!this.initialNgDefs.has(type)) {\n      this.initialNgDefs.set(type, new Map());\n    }\n    const currentDefs = this.initialNgDefs.get(type)!;\n    if (!currentDefs.has(prop)) {\n      const currentDef = Object.getOwnPropertyDescriptor(type, prop);\n      currentDefs.set(prop, currentDef);\n    }\n  }\n\n  private storeFieldOfDefOnType(type: Type<any>, defField: string, fieldName: string): void {\n    const def: any = (type as any)[defField];\n    const originalValue: any = def[fieldName];\n    this.defCleanupOps.push({object: def, fieldName, originalValue});\n  }\n\n  /**\n   * Clears current components resolution queue, but stores the state of the queue, so we can\n   * restore it later. Clearing the queue is required before we try to compile components (via\n   * `TestBed.compileComponents`), so that component defs are in sync with the resolution queue.\n   */\n  private clearComponentResolutionQueue() {\n    if (this.originalComponentResolutionQueue === null) {\n      this.originalComponentResolutionQueue = new Map();\n    }\n    ɵclearResolutionOfComponentResourcesQueue().forEach((value, key) =>\n      this.originalComponentResolutionQueue!.set(key, value),\n    );\n  }\n\n  /*\n   * Restores component resolution queue to the previously saved state. This operation is performed\n   * as a part of restoring the state after completion of the current set of tests (that might\n   * potentially mutate the state).\n   */\n  private restoreComponentResolutionQueue() {\n    if (this.originalComponentResolutionQueue !== null) {\n      ɵrestoreComponentResolutionQueue(this.originalComponentResolutionQueue);\n      this.originalComponentResolutionQueue = null;\n    }\n  }\n\n  restoreOriginalState(): void {\n    // Process cleanup ops in reverse order so the field's original value is restored correctly (in\n    // case there were multiple overrides for the same field).\n    forEachRight(this.defCleanupOps, (op: CleanupOperation) => {\n      op.object[op.fieldName] = op.originalValue;\n    });\n    // Restore initial component/directive/pipe defs\n    this.initialNgDefs.forEach(\n      (defs: Map<string, PropertyDescriptor | undefined>, type: Type<any>) => {\n        if (USE_RUNTIME_DEPS_TRACKER_FOR_JIT) {\n          depsTracker.clearScopeCacheFor(type);\n        }\n        defs.forEach((descriptor, prop) => {\n          if (!descriptor) {\n            // Delete operations are generally undesirable since they have performance\n            // implications on objects they were applied to. In this particular case, situations\n            // where this code is invoked should be quite rare to cause any noticeable impact,\n            // since it's applied only to some test cases (for example when class with no\n            // annotations extends some @Component) when we need to clear 'ɵcmp' field on a given\n            // class to restore its original state (before applying overrides and running tests).\n            delete (type as any)[prop];\n          } else {\n            Object.defineProperty(type, prop, descriptor);\n          }\n        });\n      },\n    );\n    this.initialNgDefs.clear();\n    this.scopesWithOverriddenProviders.clear();\n    this.restoreComponentResolutionQueue();\n    // Restore the locale ID to the default value, this shouldn't be necessary but we never know\n    setLocaleId(DEFAULT_LOCALE_ID);\n  }\n\n  private compileTestModule(): void {\n    class RootScopeModule {}\n    compileNgModuleDefs(RootScopeModule as NgModuleType<any>, {\n      providers: [\n        ...this.rootProviderOverrides,\n        internalProvideZoneChangeDetection({}),\n        TestBedApplicationErrorHandler,\n        {provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl},\n      ],\n    });\n\n    const providers = [\n      {provide: Compiler, useFactory: () => new R3TestCompiler(this)},\n      {provide: DEFER_BLOCK_CONFIG, useValue: {behavior: this.deferBlockBehavior}},\n      {\n        provide: INTERNAL_APPLICATION_ERROR_HANDLER,\n        useFactory: () => {\n          if (this.rethrowApplicationTickErrors) {\n            const handler = inject(TestBedApplicationErrorHandler);\n            return (e: unknown) => {\n              handler.handleError(e);\n            };\n          } else {\n            const userErrorHandler = inject(ErrorHandler);\n            const ngZone = inject(NgZone);\n            return (e: unknown) => ngZone.runOutsideAngular(() => userErrorHandler.handleError(e));\n          }\n        },\n      },\n      ...this.providers,\n      ...this.providerOverrides,\n    ];\n    const imports = [RootScopeModule, this.additionalModuleTypes, this.imports || []];\n\n    compileNgModuleDefs(\n      this.testModuleType,\n      {\n        declarations: this.declarations,\n        imports,\n        schemas: this.schemas,\n        providers,\n      },\n      /* allowDuplicateDeclarationsInRoot */ true,\n    );\n\n    this.applyProviderOverridesInScope(this.testModuleType);\n  }\n\n  get injector(): Injector {\n    if (this._injector !== null) {\n      return this._injector;\n    }\n\n    const providers: StaticProvider[] = [];\n    const compilerOptions = this.platform.injector.get(COMPILER_OPTIONS, []);\n    compilerOptions.forEach((opts) => {\n      if (opts.providers) {\n        providers.push(opts.providers);\n      }\n    });\n    if (this.compilerProviders !== null) {\n      providers.push(...(this.compilerProviders as StaticProvider[]));\n    }\n\n    this._injector = Injector.create({providers, parent: this.platform.injector});\n    return this._injector;\n  }\n\n  // get overrides for a specific provider (if any)\n  private getSingleProviderOverrides(provider: Provider): Provider | null {\n    const token = getProviderToken(provider);\n    return this.providerOverridesByToken.get(token) || null;\n  }\n\n  private getProviderOverrides(\n    providers?: Array<Provider | InternalEnvironmentProviders>,\n  ): Provider[] {\n    if (!providers || !providers.length || this.providerOverridesByToken.size === 0) return [];\n    // There are two flattening operations here. The inner flattenProviders() operates on the\n    // metadata's providers and applies a mapping function which retrieves overrides for each\n    // incoming provider. The outer flatten() then flattens the produced overrides array. If this is\n    // not done, the array can contain other empty arrays (e.g. `[[], []]`) which leak into the\n    // providers array and contaminate any error messages that might be generated.\n    return flatten(\n      flattenProviders(\n        providers,\n        (provider: Provider) => this.getSingleProviderOverrides(provider) || [],\n      ),\n    );\n  }\n\n  private getOverriddenProviders(\n    providers?: Array<Provider | InternalEnvironmentProviders>,\n  ): Provider[] {\n    if (!providers || !providers.length || this.providerOverridesByToken.size === 0) return [];\n\n    const flattenedProviders = flattenProviders(providers);\n    const overrides = this.getProviderOverrides(flattenedProviders);\n    const overriddenProviders = [...flattenedProviders, ...overrides];\n    const final: Provider[] = [];\n    const seenOverriddenProviders = new Set<Provider>();\n\n    // We iterate through the list of providers in reverse order to make sure provider overrides\n    // take precedence over the values defined in provider list. We also filter out all providers\n    // that have overrides, keeping overridden values only. This is needed, since presence of a\n    // provider with `ngOnDestroy` hook will cause this hook to be registered and invoked later.\n    forEachRight(overriddenProviders, (provider: any) => {\n      const token: any = getProviderToken(provider);\n      if (this.providerOverridesByToken.has(token)) {\n        if (!seenOverriddenProviders.has(token)) {\n          seenOverriddenProviders.add(token);\n          // Treat all overridden providers as `{multi: false}` (even if it's a multi-provider) to\n          // make sure that provided override takes highest precedence and is not combined with\n          // other instances of the same multi provider.\n          final.unshift({...provider, multi: false});\n        }\n      } else {\n        final.unshift(provider);\n      }\n    });\n    return final;\n  }\n\n  private hasProviderOverrides(\n    providers?: Array<Provider | InternalEnvironmentProviders>,\n  ): boolean {\n    return this.getProviderOverrides(providers).length > 0;\n  }\n\n  private patchDefWithProviderOverrides(declaration: Type<any>, field: string): void {\n    const def = (declaration as any)[field];\n    if (def && def.providersResolver) {\n      this.maybeStoreNgDef(field, declaration);\n\n      const resolver = def.providersResolver;\n      const processProvidersFn = (providers: Provider[]) => this.getOverriddenProviders(providers);\n      this.storeFieldOfDefOnType(declaration, field, 'providersResolver');\n      def.providersResolver = (ngDef: DirectiveDef<any>) => resolver(ngDef, processProvidersFn);\n    }\n  }\n}\n\nfunction initResolvers(): Resolvers {\n  return {\n    module: new NgModuleResolver(),\n    component: new ComponentResolver(),\n    directive: new DirectiveResolver(),\n    pipe: new PipeResolver(),\n  };\n}\n\nfunction isStandaloneComponent<T>(value: Type<T>): value is ComponentType<T> {\n  const def = getComponentDef(value);\n  return !!def?.standalone;\n}\n\nfunction getComponentDef(value: ComponentType<unknown>): ComponentDef<unknown>;\nfunction getComponentDef(value: Type<unknown>): ComponentDef<unknown> | null;\nfunction getComponentDef(value: Type<unknown>): ComponentDef<unknown> | null {\n  return (value as any).ɵcmp ?? null;\n}\n\nfunction hasNgModuleDef<T>(value: Type<T>): value is NgModuleType<T> {\n  return value.hasOwnProperty('ɵmod');\n}\n\nfunction isNgModule<T>(value: Type<T>): boolean {\n  return hasNgModuleDef(value);\n}\n\nfunction maybeUnwrapFn<T>(maybeFn: (() => T) | T): T {\n  return maybeFn instanceof Function ? maybeFn() : maybeFn;\n}\n\nfunction flatten<T>(values: any[]): T[] {\n  const out: T[] = [];\n  values.forEach((value) => {\n    if (Array.isArray(value)) {\n      out.push(...flatten<T>(value));\n    } else {\n      out.push(value);\n    }\n  });\n  return out;\n}\n\nfunction identityFn<T>(value: T): T {\n  return value;\n}\n\nfunction flattenProviders<T>(\n  providers: Array<Provider | InternalEnvironmentProviders>,\n  mapFn: (provider: Provider) => T,\n): T[];\nfunction flattenProviders(providers: Array<Provider | InternalEnvironmentProviders>): Provider[];\nfunction flattenProviders(\n  providers: Array<Provider | InternalEnvironmentProviders>,\n  mapFn: (provider: Provider) => any = identityFn,\n): any[] {\n  const out: any[] = [];\n  for (let provider of providers) {\n    if (isEnvironmentProviders(provider)) {\n      provider = provider.ɵproviders;\n    }\n    if (Array.isArray(provider)) {\n      out.push(...flattenProviders(provider, mapFn));\n    } else {\n      out.push(mapFn(provider));\n    }\n  }\n  return out;\n}\n\nfunction getProviderField(provider: Provider, field: string) {\n  return provider && typeof provider === 'object' && (provider as any)[field];\n}\n\nfunction getProviderToken(provider: Provider) {\n  return getProviderField(provider, 'provide') || provider;\n}\n\nfunction isModuleWithProviders(value: any): value is ModuleWithProviders<any> {\n  return value.hasOwnProperty('ngModule');\n}\n\nfunction forEachRight<T>(values: T[], fn: (value: T, idx: number) => void): void {\n  for (let idx = values.length - 1; idx >= 0; idx--) {\n    fn(values[idx], idx);\n  }\n}\n\nfunction invalidTypeError(name: string, expectedType: string): Error {\n  return new Error(`${name} class doesn't have @${expectedType} decorator or is missing metadata.`);\n}\n\nclass R3TestCompiler implements Compiler {\n  constructor(private testBed: TestBedCompiler) {}\n\n  compileModuleSync<T>(moduleType: Type<T>): NgModuleFactory<T> {\n    this.testBed._compileNgModuleSync(moduleType);\n    return new R3NgModuleFactory(moduleType);\n  }\n\n  async compileModuleAsync<T>(moduleType: Type<T>): Promise<NgModuleFactory<T>> {\n    await this.testBed._compileNgModuleAsync(moduleType);\n    return new R3NgModuleFactory(moduleType);\n  }\n\n  compileModuleAndAllComponentsSync<T>(moduleType: Type<T>): ModuleWithComponentFactories<T> {\n    const ngModuleFactory = this.compileModuleSync(moduleType);\n    const componentFactories = this.testBed._getComponentFactories(moduleType as NgModuleType<T>);\n    return new ModuleWithComponentFactories(ngModuleFactory, componentFactories);\n  }\n\n  async compileModuleAndAllComponentsAsync<T>(\n    moduleType: Type<T>,\n  ): Promise<ModuleWithComponentFactories<T>> {\n    const ngModuleFactory = await this.compileModuleAsync(moduleType);\n    const componentFactories = this.testBed._getComponentFactories(moduleType as NgModuleType<T>);\n    return new ModuleWithComponentFactories(ngModuleFactory, componentFactories);\n  }\n\n  clearCache(): void {}\n\n  clearCacheFor(type: Type<any>): void {}\n\n  getModuleId(moduleType: Type<any>): string | undefined {\n    const meta = this.testBed._getModuleResolver().resolve(moduleType);\n    return (meta && meta.id) || undefined;\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// The formatter and CI disagree on how this import statement should be formatted. Both try to keep\n// it on one line, too, which has gotten very hard to read & manage. So disable the formatter for\n// this statement only.\n\nimport {\n  Component,\n  ɵRender3ComponentFactory as ComponentFactory,\n  ComponentRef,\n  ɵconvertToBitFlags as convertToBitFlags,\n  ɵDeferBlockBehavior as DeferBlockBehavior,\n  Directive,\n  ɵEffectScheduler as EffectScheduler,\n  EnvironmentInjector,\n  ɵflushModuleScopingQueueAsMuchAsPossible as flushModuleScopingQueueAsMuchAsPossible,\n  ɵgetAsyncClassMetadataFn as getAsyncClassMetadataFn,\n  ɵgetUnknownElementStrictMode as getUnknownElementStrictMode,\n  ɵgetUnknownPropertyStrictMode as getUnknownPropertyStrictMode,\n  InjectFlags,\n  InjectOptions,\n  Injector,\n  ɵMicrotaskEffectScheduler as MicrotaskEffectScheduler,\n  NgModule,\n  ɵRender3NgModuleRef as NgModuleRef,\n  NgZone,\n  Pipe,\n  PlatformRef,\n  ProviderToken,\n  ɵresetCompiledComponents as resetCompiledComponents,\n  runInInjectionContext,\n  ɵsetAllowDuplicateNgModuleIdsForTest as setAllowDuplicateNgModuleIdsForTest,\n  ɵsetUnknownElementStrictMode as setUnknownElementStrictMode,\n  ɵsetUnknownPropertyStrictMode as setUnknownPropertyStrictMode,\n  ɵstringify as stringify,\n  Type,\n} from '@angular/core';\n\nimport {ComponentFixture} from './component_fixture';\nimport {MetadataOverride} from './metadata_override';\nimport {\n  ComponentFixtureNoNgZone,\n  DEFER_BLOCK_DEFAULT_BEHAVIOR,\n  ModuleTeardownOptions,\n  TEARDOWN_TESTING_MODULE_ON_DESTROY_DEFAULT,\n  TestComponentRenderer,\n  TestEnvironmentOptions,\n  TestModuleMetadata,\n  THROW_ON_UNKNOWN_ELEMENTS_DEFAULT,\n  THROW_ON_UNKNOWN_PROPERTIES_DEFAULT,\n} from './test_bed_common';\nimport {TestBedCompiler} from './test_bed_compiler';\n\n/**\n * Static methods implemented by the `TestBed`.\n *\n * @publicApi\n */\nexport interface TestBedStatic extends TestBed {\n  new (...args: any[]): TestBed;\n}\n\n/**\n * @publicApi\n */\nexport interface TestBed {\n  get platform(): PlatformRef;\n\n  get ngModule(): Type<any> | Type<any>[];\n\n  /**\n   * Initialize the environment for testing with a compiler factory, a PlatformRef, and an\n   * angular module. These are common to every test in the suite.\n   *\n   * This may only be called once, to set up the common providers for the current test\n   * suite on the current platform. If you absolutely need to change the providers,\n   * first use `resetTestEnvironment`.\n   *\n   * Test modules and platforms for individual platforms are available from\n   * '@angular/<platform_name>/testing'.\n   */\n  initTestEnvironment(\n    ngModule: Type<any> | Type<any>[],\n    platform: PlatformRef,\n    options?: TestEnvironmentOptions,\n  ): void;\n\n  /**\n   * Reset the providers for the test injector.\n   */\n  resetTestEnvironment(): void;\n\n  resetTestingModule(): TestBed;\n\n  configureCompiler(config: {providers?: any[]; useJit?: boolean}): void;\n\n  configureTestingModule(moduleDef: TestModuleMetadata): TestBed;\n\n  compileComponents(): Promise<any>;\n\n  inject<T>(\n    token: ProviderToken<T>,\n    notFoundValue: undefined,\n    options: InjectOptions & {\n      optional?: false;\n    },\n  ): T;\n  inject<T>(\n    token: ProviderToken<T>,\n    notFoundValue: null | undefined,\n    options: InjectOptions,\n  ): T | null;\n  inject<T>(token: ProviderToken<T>, notFoundValue?: T, options?: InjectOptions): T;\n  /** @deprecated use object-based flags (`InjectOptions`) instead. */\n  inject<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): T;\n  /** @deprecated use object-based flags (`InjectOptions`) instead. */\n  inject<T>(token: ProviderToken<T>, notFoundValue: null, flags?: InjectFlags): T | null;\n\n  /** @deprecated from v9.0.0 use TestBed.inject */\n  get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): any;\n  /** @deprecated from v9.0.0 use TestBed.inject */\n  get(token: any, notFoundValue?: any): any;\n\n  /**\n   * Runs the given function in the `EnvironmentInjector` context of `TestBed`.\n   *\n   * @see {@link EnvironmentInjector#runInContext}\n   */\n  runInInjectionContext<T>(fn: () => T): T;\n\n  execute(tokens: any[], fn: Function, context?: any): any;\n\n  overrideModule(ngModule: Type<any>, override: MetadataOverride<NgModule>): TestBed;\n\n  overrideComponent(component: Type<any>, override: MetadataOverride<Component>): TestBed;\n\n  overrideDirective(directive: Type<any>, override: MetadataOverride<Directive>): TestBed;\n\n  overridePipe(pipe: Type<any>, override: MetadataOverride<Pipe>): TestBed;\n\n  overrideTemplate(component: Type<any>, template: string): TestBed;\n\n  /**\n   * Overwrites all providers for the given token with the given provider definition.\n   */\n  overrideProvider(\n    token: any,\n    provider: {useFactory: Function; deps: any[]; multi?: boolean},\n  ): TestBed;\n  overrideProvider(token: any, provider: {useValue: any; multi?: boolean}): TestBed;\n  overrideProvider(\n    token: any,\n    provider: {useFactory?: Function; useValue?: any; deps?: any[]; multi?: boolean},\n  ): TestBed;\n\n  overrideTemplateUsingTestingModule(component: Type<any>, template: string): TestBed;\n\n  createComponent<T>(component: Type<T>): ComponentFixture<T>;\n\n  /**\n   * Execute any pending effects.\n   *\n   * @developerPreview\n   */\n  flushEffects(): void;\n}\n\nlet _nextRootElementId = 0;\n\n/**\n * Returns a singleton of the `TestBed` class.\n *\n * @publicApi\n */\nexport function getTestBed(): TestBed {\n  return TestBedImpl.INSTANCE;\n}\n\n/**\n * @description\n * Configures and initializes environment for unit testing and provides methods for\n * creating components and services in unit tests.\n *\n * TestBed is the primary api for writing unit tests for Angular applications and libraries.\n */\nexport class TestBedImpl implements TestBed {\n  private static _INSTANCE: TestBedImpl | null = null;\n\n  static get INSTANCE(): TestBedImpl {\n    return (TestBedImpl._INSTANCE = TestBedImpl._INSTANCE || new TestBedImpl());\n  }\n\n  /**\n   * Teardown options that have been configured at the environment level.\n   * Used as a fallback if no instance-level options have been provided.\n   */\n  private static _environmentTeardownOptions: ModuleTeardownOptions | undefined;\n\n  /**\n   * \"Error on unknown elements\" option that has been configured at the environment level.\n   * Used as a fallback if no instance-level option has been provided.\n   */\n  private static _environmentErrorOnUnknownElementsOption: boolean | undefined;\n\n  /**\n   * \"Error on unknown properties\" option that has been configured at the environment level.\n   * Used as a fallback if no instance-level option has been provided.\n   */\n  private static _environmentErrorOnUnknownPropertiesOption: boolean | undefined;\n\n  /**\n   * Teardown options that have been configured at the `TestBed` instance level.\n   * These options take precedence over the environment-level ones.\n   */\n  private _instanceTeardownOptions: ModuleTeardownOptions | undefined;\n\n  /**\n   * Defer block behavior option that specifies whether defer blocks will be triggered manually\n   * or set to play through.\n   */\n  private _instanceDeferBlockBehavior = DEFER_BLOCK_DEFAULT_BEHAVIOR;\n\n  /**\n   * \"Error on unknown elements\" option that has been configured at the `TestBed` instance level.\n   * This option takes precedence over the environment-level one.\n   */\n  private _instanceErrorOnUnknownElementsOption: boolean | undefined;\n\n  /**\n   * \"Error on unknown properties\" option that has been configured at the `TestBed` instance level.\n   * This option takes precedence over the environment-level one.\n   */\n  private _instanceErrorOnUnknownPropertiesOption: boolean | undefined;\n\n  /**\n   * Stores the previous \"Error on unknown elements\" option value,\n   * allowing to restore it in the reset testing module logic.\n   */\n  private _previousErrorOnUnknownElementsOption: boolean | undefined;\n\n  /**\n   * Stores the previous \"Error on unknown properties\" option value,\n   * allowing to restore it in the reset testing module logic.\n   */\n  private _previousErrorOnUnknownPropertiesOption: boolean | undefined;\n\n  /**\n   * Initialize the environment for testing with a compiler factory, a PlatformRef, and an\n   * angular module. These are common to every test in the suite.\n   *\n   * This may only be called once, to set up the common providers for the current test\n   * suite on the current platform. If you absolutely need to change the providers,\n   * first use `resetTestEnvironment`.\n   *\n   * Test modules and platforms for individual platforms are available from\n   * '@angular/<platform_name>/testing'.\n   *\n   * @publicApi\n   */\n  static initTestEnvironment(\n    ngModule: Type<any> | Type<any>[],\n    platform: PlatformRef,\n    options?: TestEnvironmentOptions,\n  ): TestBed {\n    const testBed = TestBedImpl.INSTANCE;\n    testBed.initTestEnvironment(ngModule, platform, options);\n    return testBed;\n  }\n\n  /**\n   * Reset the providers for the test injector.\n   *\n   * @publicApi\n   */\n  static resetTestEnvironment(): void {\n    TestBedImpl.INSTANCE.resetTestEnvironment();\n  }\n\n  static configureCompiler(config: {providers?: any[]; useJit?: boolean}): TestBed {\n    return TestBedImpl.INSTANCE.configureCompiler(config);\n  }\n\n  /**\n   * Allows overriding default providers, directives, pipes, modules of the test injector,\n   * which are defined in test_injector.js\n   */\n  static configureTestingModule(moduleDef: TestModuleMetadata): TestBed {\n    return TestBedImpl.INSTANCE.configureTestingModule(moduleDef);\n  }\n\n  /**\n   * Compile components with a `templateUrl` for the test's NgModule.\n   * It is necessary to call this function\n   * as fetching urls is asynchronous.\n   */\n  static compileComponents(): Promise<any> {\n    return TestBedImpl.INSTANCE.compileComponents();\n  }\n\n  static overrideModule(ngModule: Type<any>, override: MetadataOverride<NgModule>): TestBed {\n    return TestBedImpl.INSTANCE.overrideModule(ngModule, override);\n  }\n\n  static overrideComponent(component: Type<any>, override: MetadataOverride<Component>): TestBed {\n    return TestBedImpl.INSTANCE.overrideComponent(component, override);\n  }\n\n  static overrideDirective(directive: Type<any>, override: MetadataOverride<Directive>): TestBed {\n    return TestBedImpl.INSTANCE.overrideDirective(directive, override);\n  }\n\n  static overridePipe(pipe: Type<any>, override: MetadataOverride<Pipe>): TestBed {\n    return TestBedImpl.INSTANCE.overridePipe(pipe, override);\n  }\n\n  static overrideTemplate(component: Type<any>, template: string): TestBed {\n    return TestBedImpl.INSTANCE.overrideTemplate(component, template);\n  }\n\n  /**\n   * Overrides the template of the given component, compiling the template\n   * in the context of the TestingModule.\n   *\n   * Note: This works for JIT and AOTed components as well.\n   */\n  static overrideTemplateUsingTestingModule(component: Type<any>, template: string): TestBed {\n    return TestBedImpl.INSTANCE.overrideTemplateUsingTestingModule(component, template);\n  }\n\n  static overrideProvider(\n    token: any,\n    provider: {\n      useFactory: Function;\n      deps: any[];\n    },\n  ): TestBed;\n  static overrideProvider(token: any, provider: {useValue: any}): TestBed;\n  static overrideProvider(\n    token: any,\n    provider: {\n      useFactory?: Function;\n      useValue?: any;\n      deps?: any[];\n    },\n  ): TestBed {\n    return TestBedImpl.INSTANCE.overrideProvider(token, provider);\n  }\n\n  static inject<T>(\n    token: ProviderToken<T>,\n    notFoundValue: undefined,\n    options: InjectOptions & {\n      optional?: false;\n    },\n  ): T;\n  static inject<T>(\n    token: ProviderToken<T>,\n    notFoundValue: null | undefined,\n    options: InjectOptions,\n  ): T | null;\n  static inject<T>(token: ProviderToken<T>, notFoundValue?: T, options?: InjectOptions): T;\n  /** @deprecated use object-based flags (`InjectOptions`) instead. */\n  static inject<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): T;\n  /** @deprecated use object-based flags (`InjectOptions`) instead. */\n  static inject<T>(token: ProviderToken<T>, notFoundValue: null, flags?: InjectFlags): T | null;\n  static inject<T>(\n    token: ProviderToken<T>,\n    notFoundValue?: T | null,\n    flags?: InjectFlags | InjectOptions,\n  ): T | null {\n    return TestBedImpl.INSTANCE.inject(token, notFoundValue, convertToBitFlags(flags));\n  }\n\n  /** @deprecated from v9.0.0 use TestBed.inject */\n  static get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): any;\n  /** @deprecated from v9.0.0 use TestBed.inject */\n  static get(token: any, notFoundValue?: any): any;\n  /** @deprecated from v9.0.0 use TestBed.inject */\n  static get(\n    token: any,\n    notFoundValue: any = Injector.THROW_IF_NOT_FOUND,\n    flags: InjectFlags = InjectFlags.Default,\n  ): any {\n    return TestBedImpl.INSTANCE.inject(token, notFoundValue, flags);\n  }\n\n  /**\n   * Runs the given function in the `EnvironmentInjector` context of `TestBed`.\n   *\n   * @see {@link EnvironmentInjector#runInContext}\n   */\n  static runInInjectionContext<T>(fn: () => T): T {\n    return TestBedImpl.INSTANCE.runInInjectionContext(fn);\n  }\n\n  static createComponent<T>(component: Type<T>): ComponentFixture<T> {\n    return TestBedImpl.INSTANCE.createComponent(component);\n  }\n\n  static resetTestingModule(): TestBed {\n    return TestBedImpl.INSTANCE.resetTestingModule();\n  }\n\n  static execute(tokens: any[], fn: Function, context?: any): any {\n    return TestBedImpl.INSTANCE.execute(tokens, fn, context);\n  }\n\n  static get platform(): PlatformRef {\n    return TestBedImpl.INSTANCE.platform;\n  }\n\n  static get ngModule(): Type<any> | Type<any>[] {\n    return TestBedImpl.INSTANCE.ngModule;\n  }\n\n  static flushEffects(): void {\n    return TestBedImpl.INSTANCE.flushEffects();\n  }\n\n  // Properties\n\n  platform: PlatformRef = null!;\n  ngModule: Type<any> | Type<any>[] = null!;\n\n  private _compiler: TestBedCompiler | null = null;\n  private _testModuleRef: NgModuleRef<any> | null = null;\n\n  private _activeFixtures: ComponentFixture<any>[] = [];\n\n  /**\n   * Internal-only flag to indicate whether a module\n   * scoping queue has been checked and flushed already.\n   * @docs-private\n   */\n  globalCompilationChecked = false;\n\n  /**\n   * Initialize the environment for testing with a compiler factory, a PlatformRef, and an\n   * angular module. These are common to every test in the suite.\n   *\n   * This may only be called once, to set up the common providers for the current test\n   * suite on the current platform. If you absolutely need to change the providers,\n   * first use `resetTestEnvironment`.\n   *\n   * Test modules and platforms for individual platforms are available from\n   * '@angular/<platform_name>/testing'.\n   *\n   * @publicApi\n   */\n  initTestEnvironment(\n    ngModule: Type<any> | Type<any>[],\n    platform: PlatformRef,\n    options?: TestEnvironmentOptions,\n  ): void {\n    if (this.platform || this.ngModule) {\n      throw new Error('Cannot set base providers because it has already been called');\n    }\n\n    TestBedImpl._environmentTeardownOptions = options?.teardown;\n\n    TestBedImpl._environmentErrorOnUnknownElementsOption = options?.errorOnUnknownElements;\n\n    TestBedImpl._environmentErrorOnUnknownPropertiesOption = options?.errorOnUnknownProperties;\n\n    this.platform = platform;\n    this.ngModule = ngModule;\n    this._compiler = new TestBedCompiler(this.platform, this.ngModule);\n\n    // TestBed does not have an API which can reliably detect the start of a test, and thus could be\n    // used to track the state of the NgModule registry and reset it correctly. Instead, when we\n    // know we're in a testing scenario, we disable the check for duplicate NgModule registration\n    // completely.\n    setAllowDuplicateNgModuleIdsForTest(true);\n  }\n\n  /**\n   * Reset the providers for the test injector.\n   *\n   * @publicApi\n   */\n  resetTestEnvironment(): void {\n    this.resetTestingModule();\n    this._compiler = null;\n    this.platform = null!;\n    this.ngModule = null!;\n    TestBedImpl._environmentTeardownOptions = undefined;\n    setAllowDuplicateNgModuleIdsForTest(false);\n  }\n\n  resetTestingModule(): this {\n    this.checkGlobalCompilationFinished();\n    resetCompiledComponents();\n    if (this._compiler !== null) {\n      this.compiler.restoreOriginalState();\n    }\n    this._compiler = new TestBedCompiler(this.platform, this.ngModule);\n    // Restore the previous value of the \"error on unknown elements\" option\n    setUnknownElementStrictMode(\n      this._previousErrorOnUnknownElementsOption ?? THROW_ON_UNKNOWN_ELEMENTS_DEFAULT,\n    );\n    // Restore the previous value of the \"error on unknown properties\" option\n    setUnknownPropertyStrictMode(\n      this._previousErrorOnUnknownPropertiesOption ?? THROW_ON_UNKNOWN_PROPERTIES_DEFAULT,\n    );\n\n    // We have to chain a couple of try/finally blocks, because each step can\n    // throw errors and we don't want it to interrupt the next step and we also\n    // want an error to be thrown at the end.\n    try {\n      this.destroyActiveFixtures();\n    } finally {\n      try {\n        if (this.shouldTearDownTestingModule()) {\n          this.tearDownTestingModule();\n        }\n      } finally {\n        this._testModuleRef = null;\n        this._instanceTeardownOptions = undefined;\n        this._instanceErrorOnUnknownElementsOption = undefined;\n        this._instanceErrorOnUnknownPropertiesOption = undefined;\n        this._instanceDeferBlockBehavior = DEFER_BLOCK_DEFAULT_BEHAVIOR;\n      }\n    }\n    return this;\n  }\n\n  configureCompiler(config: {providers?: any[]; useJit?: boolean}): this {\n    if (config.useJit != null) {\n      throw new Error('JIT compiler is not configurable via TestBed APIs.');\n    }\n\n    if (config.providers !== undefined) {\n      this.compiler.setCompilerProviders(config.providers);\n    }\n    return this;\n  }\n\n  configureTestingModule(moduleDef: TestModuleMetadata): this {\n    this.assertNotInstantiated('TestBed.configureTestingModule', 'configure the test module');\n\n    // Trigger module scoping queue flush before executing other TestBed operations in a test.\n    // This is needed for the first test invocation to ensure that globally declared modules have\n    // their components scoped properly. See the `checkGlobalCompilationFinished` function\n    // description for additional info.\n    this.checkGlobalCompilationFinished();\n\n    // Always re-assign the options, even if they're undefined.\n    // This ensures that we don't carry them between tests.\n    this._instanceTeardownOptions = moduleDef.teardown;\n    this._instanceErrorOnUnknownElementsOption = moduleDef.errorOnUnknownElements;\n    this._instanceErrorOnUnknownPropertiesOption = moduleDef.errorOnUnknownProperties;\n    this._instanceDeferBlockBehavior = moduleDef.deferBlockBehavior ?? DEFER_BLOCK_DEFAULT_BEHAVIOR;\n    // Store the current value of the strict mode option,\n    // so we can restore it later\n    this._previousErrorOnUnknownElementsOption = getUnknownElementStrictMode();\n    setUnknownElementStrictMode(this.shouldThrowErrorOnUnknownElements());\n    this._previousErrorOnUnknownPropertiesOption = getUnknownPropertyStrictMode();\n    setUnknownPropertyStrictMode(this.shouldThrowErrorOnUnknownProperties());\n    this.compiler.configureTestingModule(moduleDef);\n    return this;\n  }\n\n  compileComponents(): Promise<any> {\n    return this.compiler.compileComponents();\n  }\n\n  inject<T>(\n    token: ProviderToken<T>,\n    notFoundValue: undefined,\n    options: InjectOptions & {\n      optional: true;\n    },\n  ): T | null;\n  inject<T>(token: ProviderToken<T>, notFoundValue?: T, options?: InjectOptions): T;\n  inject<T>(token: ProviderToken<T>, notFoundValue: null, options?: InjectOptions): T | null;\n  /** @deprecated use object-based flags (`InjectOptions`) instead. */\n  inject<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): T;\n  /** @deprecated use object-based flags (`InjectOptions`) instead. */\n  inject<T>(token: ProviderToken<T>, notFoundValue: null, flags?: InjectFlags): T | null;\n  inject<T>(\n    token: ProviderToken<T>,\n    notFoundValue?: T | null,\n    flags?: InjectFlags | InjectOptions,\n  ): T | null {\n    if ((token as unknown) === TestBed) {\n      return this as any;\n    }\n    const UNDEFINED = {} as unknown as T;\n    const result = this.testModuleRef.injector.get(token, UNDEFINED, convertToBitFlags(flags));\n    return result === UNDEFINED\n      ? (this.compiler.injector.get(token, notFoundValue, flags) as any)\n      : result;\n  }\n\n  /** @deprecated from v9.0.0 use TestBed.inject */\n  get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): any;\n  /** @deprecated from v9.0.0 use TestBed.inject */\n  get(token: any, notFoundValue?: any): any;\n  /** @deprecated from v9.0.0 use TestBed.inject */\n  get(\n    token: any,\n    notFoundValue: any = Injector.THROW_IF_NOT_FOUND,\n    flags: InjectFlags = InjectFlags.Default,\n  ): any {\n    return this.inject(token, notFoundValue, flags);\n  }\n\n  runInInjectionContext<T>(fn: () => T): T {\n    return runInInjectionContext(this.inject(EnvironmentInjector), fn);\n  }\n\n  execute(tokens: any[], fn: Function, context?: any): any {\n    const params = tokens.map((t) => this.inject(t));\n    return fn.apply(context, params);\n  }\n\n  overrideModule(ngModule: Type<any>, override: MetadataOverride<NgModule>): this {\n    this.assertNotInstantiated('overrideModule', 'override module metadata');\n    this.compiler.overrideModule(ngModule, override);\n    return this;\n  }\n\n  overrideComponent(component: Type<any>, override: MetadataOverride<Component>): this {\n    this.assertNotInstantiated('overrideComponent', 'override component metadata');\n    this.compiler.overrideComponent(component, override);\n    return this;\n  }\n\n  overrideTemplateUsingTestingModule(component: Type<any>, template: string): this {\n    this.assertNotInstantiated(\n      'TestBed.overrideTemplateUsingTestingModule',\n      'Cannot override template when the test module has already been instantiated',\n    );\n    this.compiler.overrideTemplateUsingTestingModule(component, template);\n    return this;\n  }\n\n  overrideDirective(directive: Type<any>, override: MetadataOverride<Directive>): this {\n    this.assertNotInstantiated('overrideDirective', 'override directive metadata');\n    this.compiler.overrideDirective(directive, override);\n    return this;\n  }\n\n  overridePipe(pipe: Type<any>, override: MetadataOverride<Pipe>): this {\n    this.assertNotInstantiated('overridePipe', 'override pipe metadata');\n    this.compiler.overridePipe(pipe, override);\n    return this;\n  }\n\n  /**\n   * Overwrites all providers for the given token with the given provider definition.\n   */\n  overrideProvider(\n    token: any,\n    provider: {useFactory?: Function; useValue?: any; deps?: any[]},\n  ): this {\n    this.assertNotInstantiated('overrideProvider', 'override provider');\n    this.compiler.overrideProvider(token, provider);\n    return this;\n  }\n\n  overrideTemplate(component: Type<any>, template: string): TestBed {\n    return this.overrideComponent(component, {set: {template, templateUrl: null!}});\n  }\n\n  createComponent<T>(type: Type<T>): ComponentFixture<T> {\n    const testComponentRenderer = this.inject(TestComponentRenderer);\n    const rootElId = `root${_nextRootElementId++}`;\n    testComponentRenderer.insertRootElement(rootElId);\n\n    if (getAsyncClassMetadataFn(type)) {\n      throw new Error(\n        `Component '${type.name}' has unresolved metadata. ` +\n          `Please call \\`await TestBed.compileComponents()\\` before running this test.`,\n      );\n    }\n\n    const componentDef = (type as any).ɵcmp;\n\n    if (!componentDef) {\n      throw new Error(`It looks like '${stringify(type)}' has not been compiled.`);\n    }\n\n    const componentFactory = new ComponentFactory(componentDef);\n    const initComponent = () => {\n      const componentRef = componentFactory.create(\n        Injector.NULL,\n        [],\n        `#${rootElId}`,\n        this.testModuleRef,\n      ) as ComponentRef<T>;\n      return this.runInInjectionContext(() => new ComponentFixture(componentRef));\n    };\n    const noNgZone = this.inject(ComponentFixtureNoNgZone, false);\n    const ngZone = noNgZone ? null : this.inject(NgZone, null);\n    const fixture = ngZone ? ngZone.run(initComponent) : initComponent();\n    this._activeFixtures.push(fixture);\n    return fixture;\n  }\n\n  /**\n   * @internal strip this from published d.ts files due to\n   * https://github.com/microsoft/TypeScript/issues/36216\n   */\n  private get compiler(): TestBedCompiler {\n    if (this._compiler === null) {\n      throw new Error(`Need to call TestBed.initTestEnvironment() first`);\n    }\n    return this._compiler;\n  }\n\n  /**\n   * @internal strip this from published d.ts files due to\n   * https://github.com/microsoft/TypeScript/issues/36216\n   */\n  private get testModuleRef(): NgModuleRef<any> {\n    if (this._testModuleRef === null) {\n      this._testModuleRef = this.compiler.finalize();\n    }\n    return this._testModuleRef;\n  }\n\n  private assertNotInstantiated(methodName: string, methodDescription: string) {\n    if (this._testModuleRef !== null) {\n      throw new Error(\n        `Cannot ${methodDescription} when the test module has already been instantiated. ` +\n          `Make sure you are not using \\`inject\\` before \\`${methodName}\\`.`,\n      );\n    }\n  }\n\n  /**\n   * Check whether the module scoping queue should be flushed, and flush it if needed.\n   *\n   * When the TestBed is reset, it clears the JIT module compilation queue, cancelling any\n   * in-progress module compilation. This creates a potential hazard - the very first time the\n   * TestBed is initialized (or if it's reset without being initialized), there may be pending\n   * compilations of modules declared in global scope. These compilations should be finished.\n   *\n   * To ensure that globally declared modules have their components scoped properly, this function\n   * is called whenever TestBed is initialized or reset. The _first_ time that this happens, prior\n   * to any other operations, the scoping queue is flushed.\n   */\n  private checkGlobalCompilationFinished(): void {\n    // Checking _testNgModuleRef is null should not be necessary, but is left in as an additional\n    // guard that compilations queued in tests (after instantiation) are never flushed accidentally.\n    if (!this.globalCompilationChecked && this._testModuleRef === null) {\n      flushModuleScopingQueueAsMuchAsPossible();\n    }\n    this.globalCompilationChecked = true;\n  }\n\n  private destroyActiveFixtures(): void {\n    let errorCount = 0;\n    this._activeFixtures.forEach((fixture) => {\n      try {\n        fixture.destroy();\n      } catch (e) {\n        errorCount++;\n        console.error('Error during cleanup of component', {\n          component: fixture.componentInstance,\n          stacktrace: e,\n        });\n      }\n    });\n    this._activeFixtures = [];\n\n    if (errorCount > 0 && this.shouldRethrowTeardownErrors()) {\n      throw Error(\n        `${errorCount} ${errorCount === 1 ? 'component' : 'components'} ` +\n          `threw errors during cleanup`,\n      );\n    }\n  }\n\n  shouldRethrowTeardownErrors(): boolean {\n    const instanceOptions = this._instanceTeardownOptions;\n    const environmentOptions = TestBedImpl._environmentTeardownOptions;\n\n    // If the new teardown behavior hasn't been configured, preserve the old behavior.\n    if (!instanceOptions && !environmentOptions) {\n      return TEARDOWN_TESTING_MODULE_ON_DESTROY_DEFAULT;\n    }\n\n    // Otherwise use the configured behavior or default to rethrowing.\n    return (\n      instanceOptions?.rethrowErrors ??\n      environmentOptions?.rethrowErrors ??\n      this.shouldTearDownTestingModule()\n    );\n  }\n\n  shouldThrowErrorOnUnknownElements(): boolean {\n    // Check if a configuration has been provided to throw when an unknown element is found\n    return (\n      this._instanceErrorOnUnknownElementsOption ??\n      TestBedImpl._environmentErrorOnUnknownElementsOption ??\n      THROW_ON_UNKNOWN_ELEMENTS_DEFAULT\n    );\n  }\n\n  shouldThrowErrorOnUnknownProperties(): boolean {\n    // Check if a configuration has been provided to throw when an unknown property is found\n    return (\n      this._instanceErrorOnUnknownPropertiesOption ??\n      TestBedImpl._environmentErrorOnUnknownPropertiesOption ??\n      THROW_ON_UNKNOWN_PROPERTIES_DEFAULT\n    );\n  }\n\n  shouldTearDownTestingModule(): boolean {\n    return (\n      this._instanceTeardownOptions?.destroyAfterEach ??\n      TestBedImpl._environmentTeardownOptions?.destroyAfterEach ??\n      TEARDOWN_TESTING_MODULE_ON_DESTROY_DEFAULT\n    );\n  }\n\n  getDeferBlockBehavior(): DeferBlockBehavior {\n    return this._instanceDeferBlockBehavior;\n  }\n\n  tearDownTestingModule() {\n    // If the module ref has already been destroyed, we won't be able to get a test renderer.\n    if (this._testModuleRef === null) {\n      return;\n    }\n    // Resolve the renderer ahead of time, because we want to remove the root elements as the very\n    // last step, but the injector will be destroyed as a part of the module ref destruction.\n    const testRenderer = this.inject(TestComponentRenderer);\n    try {\n      this._testModuleRef.destroy();\n    } catch (e) {\n      if (this.shouldRethrowTeardownErrors()) {\n        throw e;\n      } else {\n        console.error('Error during cleanup of a testing module', {\n          component: this._testModuleRef.instance,\n          stacktrace: e,\n        });\n      }\n    } finally {\n      testRenderer.removeAllRootElements?.();\n    }\n  }\n\n  /**\n   * Execute any pending effects.\n   *\n   * @developerPreview\n   */\n  flushEffects(): void {\n    this.inject(MicrotaskEffectScheduler).flush();\n    this.inject(EffectScheduler).flush();\n  }\n}\n\n/**\n * @description\n * Configures and initializes environment for unit testing and provides methods for\n * creating components and services in unit tests.\n *\n * `TestBed` is the primary api for writing unit tests for Angular applications and libraries.\n *\n * @publicApi\n */\nexport const TestBed: TestBedStatic = TestBedImpl;\n\n/**\n * Allows injecting dependencies in `beforeEach()` and `it()`. Note: this function\n * (imported from the `@angular/core/testing` package) can **only** be used to inject dependencies\n * in tests. To inject dependencies in your application code, use the [`inject`](api/core/inject)\n * function from the `@angular/core` package instead.\n *\n * Example:\n *\n * ```ts\n * beforeEach(inject([Dependency, AClass], (dep, object) => {\n *   // some code that uses `dep` and `object`\n *   // ...\n * }));\n *\n * it('...', inject([AClass], (object) => {\n *   object.doSomething();\n *   expect(...);\n * })\n * ```\n *\n * @publicApi\n */\nexport function inject(tokens: any[], fn: Function): () => any {\n  const testBed = TestBedImpl.INSTANCE;\n  // Not using an arrow function to preserve context passed from call site\n  return function (this: unknown) {\n    return testBed.execute(tokens, fn, this);\n  };\n}\n\n/**\n * @publicApi\n */\nexport class InjectSetupWrapper {\n  constructor(private _moduleDef: () => TestModuleMetadata) {}\n\n  private _addModule() {\n    const moduleDef = this._moduleDef();\n    if (moduleDef) {\n      TestBedImpl.configureTestingModule(moduleDef);\n    }\n  }\n\n  inject(tokens: any[], fn: Function): () => any {\n    const self = this;\n    // Not using an arrow function to preserve context passed from call site\n    return function (this: unknown) {\n      self._addModule();\n      return inject(tokens, fn).call(this);\n    };\n  }\n}\n\n/**\n * @publicApi\n */\nexport function withModule(moduleDef: TestModuleMetadata): InjectSetupWrapper;\nexport function withModule(moduleDef: TestModuleMetadata, fn: Function): () => any;\nexport function withModule(\n  moduleDef: TestModuleMetadata,\n  fn?: Function | null,\n): (() => any) | InjectSetupWrapper {\n  if (fn) {\n    // Not using an arrow function to preserve context passed from call site\n    return function (this: unknown) {\n      const testBed = TestBedImpl.INSTANCE;\n      if (moduleDef) {\n        testBed.configureTestingModule(moduleDef);\n      }\n      return fn.apply(this);\n    };\n  }\n  return new InjectSetupWrapper(() => moduleDef);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Public Test Library for unit testing Angular applications. Assumes that you are running\n * with Jasmine, Mocha, or a similar framework which exports a beforeEach function and\n * allows tests to be asynchronous by either returning a promise or using a 'done' parameter.\n */\n\nimport {resetFakeAsyncZoneIfExists} from './fake_async';\nimport {TestBedImpl} from './test_bed';\n\n// Reset the test providers and the fake async zone before each test.\n// We keep a guard because somehow this file can make it into a bundle and be executed\n// beforeEach is only defined when executing the tests\nglobalThis.beforeEach?.(getCleanupHook(false));\n\n// We provide both a `beforeEach` and `afterEach`, because the updated behavior for\n// tearing down the module is supposed to run after the test so that we can associate\n// teardown errors with the correct test.\n// We keep a guard because somehow this file can make it into a bundle and be executed\n// afterEach is only defined when executing the tests\nglobalThis.afterEach?.(getCleanupHook(true));\n\nfunction getCleanupHook(expectedTeardownValue: boolean) {\n  return () => {\n    const testBed = TestBedImpl.INSTANCE;\n    if (testBed.shouldTearDownTestingModule() === expectedTeardownValue) {\n      testBed.resetTestingModule();\n      resetFakeAsyncZoneIfExists();\n    }\n  };\n}\n\n/**\n * This API should be removed. But doing so seems to break `google3` and so it requires a bit of\n * investigation.\n *\n * A work around is to mark it as `@codeGenApi` for now and investigate later.\n *\n * @codeGenApi\n */\n// TODO(iminar): Remove this code in a safe way.\nexport const __core_private_testing_placeholder__ = '';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  NavigationNavigateOptions,\n  NavigationTypeString,\n  NavigationOptions,\n  NavigateEvent,\n  NavigationCurrentEntryChangeEvent,\n  NavigationTransition,\n  NavigationUpdateCurrentEntryOptions,\n  NavigationReloadOptions,\n  NavigationResult,\n  NavigationHistoryEntry,\n  NavigationInterceptOptions,\n  NavigationDestination,\n  Navigation,\n} from '../src/navigation_types';\n\n/**\n * Fake implementation of user agent history and navigation behavior. This is a\n * high-fidelity implementation of browser behavior that attempts to emulate\n * things like traversal delay.\n */\nexport class FakeNavigation implements Navigation {\n  /**\n   * The fake implementation of an entries array. Only same-document entries\n   * allowed.\n   */\n  private readonly entriesArr: FakeNavigationHistoryEntry[] = [];\n\n  /**\n   * The current active entry index into `entriesArr`.\n   */\n  private currentEntryIndex = 0;\n\n  /**\n   * The current navigate event.\n   * @internal\n   */\n  navigateEvent: InternalFakeNavigateEvent | null = null;\n\n  /**\n   * A Map of pending traversals, so that traversals to the same entry can be\n   * re-used.\n   */\n  private readonly traversalQueue = new Map<string, InternalNavigationResult>();\n\n  /**\n   * A Promise that resolves when the previous traversals have finished. Used to\n   * simulate the cross-process communication necessary for traversals.\n   */\n  private nextTraversal = Promise.resolve();\n\n  /**\n   * A prospective current active entry index, which includes unresolved\n   * traversals. Used by `go` to determine where navigations are intended to go.\n   */\n  private prospectiveEntryIndex = 0;\n\n  /**\n   * A test-only option to make traversals synchronous, rather than emulate\n   * cross-process communication.\n   */\n  private synchronousTraversals = false;\n\n  /** Whether to allow a call to setInitialEntryForTesting. */\n  private canSetInitialEntry = true;\n\n  /**\n   * `EventTarget` to dispatch events.\n   * @internal\n   */\n  eventTarget: EventTarget;\n\n  /** The next unique id for created entries. Replace recreates this id. */\n  private nextId = 0;\n\n  /** The next unique key for created entries. Replace inherits this id. */\n  private nextKey = 0;\n\n  /** Whether this fake is disposed. */\n  private disposed = false;\n\n  /** Equivalent to `navigation.currentEntry`. */\n  get currentEntry(): FakeNavigationHistoryEntry {\n    return this.entriesArr[this.currentEntryIndex];\n  }\n\n  get canGoBack(): boolean {\n    return this.currentEntryIndex > 0;\n  }\n\n  get canGoForward(): boolean {\n    return this.currentEntryIndex < this.entriesArr.length - 1;\n  }\n\n  private readonly createEventTarget: () => EventTarget;\n  private readonly _window: Pick<\n    Window,\n    'addEventListener' | 'removeEventListener' | 'dispatchEvent'\n  >;\n  get window(): Pick<Window, 'addEventListener' | 'removeEventListener'> {\n    return this._window;\n  }\n\n  constructor(doc: Document, startURL: `http${string}`) {\n    this.createEventTarget = () => {\n      try {\n        // `document.createElement` because NodeJS `EventTarget` is\n        // incompatible with Domino's `Event`. That is, attempting to\n        // dispatch an event created by Domino's patched `Event` will\n        // throw an error since it is not an instance of a real Node\n        // `Event`.\n        return doc.createElement('div');\n      } catch {\n        // Fallback to a basic EventTarget if `document.createElement`\n        // fails. This can happen with tests that pass in a value for document\n        // that is stubbed.\n        return new EventTarget();\n      }\n    };\n    this._window = document.defaultView ?? this.createEventTarget();\n    this.eventTarget = this.createEventTarget();\n    // First entry.\n    this.setInitialEntryForTesting(startURL);\n  }\n\n  /**\n   * Sets the initial entry.\n   */\n  setInitialEntryForTesting(\n    url: `http${string}`,\n    options: {historyState: unknown; state?: unknown} = {historyState: null},\n  ): void {\n    if (!this.canSetInitialEntry) {\n      throw new Error(\n        'setInitialEntryForTesting can only be called before any ' + 'navigation has occurred',\n      );\n    }\n    const currentInitialEntry = this.entriesArr[0];\n    this.entriesArr[0] = new FakeNavigationHistoryEntry(this.eventTarget, new URL(url).toString(), {\n      index: 0,\n      key: currentInitialEntry?.key ?? String(this.nextKey++),\n      id: currentInitialEntry?.id ?? String(this.nextId++),\n      sameDocument: true,\n      historyState: options?.historyState,\n      state: options.state,\n    });\n  }\n\n  /** Returns whether the initial entry is still eligible to be set. */\n  canSetInitialEntryForTesting(): boolean {\n    return this.canSetInitialEntry;\n  }\n\n  /**\n   * Sets whether to emulate traversals as synchronous rather than\n   * asynchronous.\n   */\n  setSynchronousTraversalsForTesting(synchronousTraversals: boolean): void {\n    this.synchronousTraversals = synchronousTraversals;\n  }\n\n  /** Equivalent to `navigation.entries()`. */\n  entries(): FakeNavigationHistoryEntry[] {\n    return this.entriesArr.slice();\n  }\n\n  /** Equivalent to `navigation.navigate()`. */\n  navigate(url: string, options?: NavigationNavigateOptions): FakeNavigationResult {\n    const fromUrl = new URL(this.currentEntry.url!);\n    const toUrl = new URL(url, this.currentEntry.url!);\n\n    let navigationType: NavigationTypeString;\n    if (!options?.history || options.history === 'auto') {\n      // Auto defaults to push, but if the URLs are the same, is a replace.\n      if (fromUrl.toString() === toUrl.toString()) {\n        navigationType = 'replace';\n      } else {\n        navigationType = 'push';\n      }\n    } else {\n      navigationType = options.history;\n    }\n\n    const hashChange = isHashChange(fromUrl, toUrl);\n\n    const destination = new FakeNavigationDestination({\n      url: toUrl.toString(),\n      state: options?.state,\n      sameDocument: hashChange,\n      historyState: null,\n    });\n    const result = new InternalNavigationResult(this);\n\n    const intercepted = this.userAgentNavigate(destination, result, {\n      navigationType,\n      cancelable: true,\n      canIntercept: true,\n      // Always false for navigate().\n      userInitiated: false,\n      hashChange,\n      info: options?.info,\n    });\n    if (!intercepted) {\n      this.updateNavigationEntriesForSameDocumentNavigation(this.navigateEvent!);\n    }\n\n    return {\n      committed: result.committed,\n      finished: result.finished,\n    };\n  }\n\n  /** Equivalent to `history.pushState()`. */\n  pushState(data: unknown, title: string, url?: string): void {\n    this.pushOrReplaceState('push', data, title, url);\n  }\n\n  /** Equivalent to `history.replaceState()`. */\n  replaceState(data: unknown, title: string, url?: string): void {\n    this.pushOrReplaceState('replace', data, title, url);\n  }\n\n  private pushOrReplaceState(\n    navigationType: NavigationTypeString,\n    data: unknown,\n    _title: string,\n    url?: string,\n  ): void {\n    const fromUrl = new URL(this.currentEntry.url!);\n    const toUrl = url ? new URL(url, this.currentEntry.url!) : fromUrl;\n\n    const hashChange = isHashChange(fromUrl, toUrl);\n\n    const destination = new FakeNavigationDestination({\n      url: toUrl.toString(),\n      sameDocument: true,\n      historyState: data,\n    });\n    const result = new InternalNavigationResult(this);\n\n    const intercepted = this.userAgentNavigate(destination, result, {\n      navigationType,\n      cancelable: true,\n      canIntercept: true,\n      // Always false for pushState() or replaceState().\n      userInitiated: false,\n      hashChange,\n    });\n    if (intercepted) {\n      return;\n    }\n    this.updateNavigationEntriesForSameDocumentNavigation(this.navigateEvent!);\n  }\n\n  /** Equivalent to `navigation.traverseTo()`. */\n  traverseTo(key: string, options?: NavigationOptions): FakeNavigationResult {\n    const fromUrl = new URL(this.currentEntry.url!);\n    const entry = this.findEntry(key);\n    if (!entry) {\n      const domException = new DOMException('Invalid key', 'InvalidStateError');\n      const committed = Promise.reject(domException);\n      const finished = Promise.reject(domException);\n      committed.catch(() => {});\n      finished.catch(() => {});\n      return {\n        committed,\n        finished,\n      };\n    }\n    if (entry === this.currentEntry) {\n      return {\n        committed: Promise.resolve(this.currentEntry),\n        finished: Promise.resolve(this.currentEntry),\n      };\n    }\n    if (this.traversalQueue.has(entry.key)) {\n      const existingResult = this.traversalQueue.get(entry.key)!;\n      return {\n        committed: existingResult.committed,\n        finished: existingResult.finished,\n      };\n    }\n\n    const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!));\n    const destination = new FakeNavigationDestination({\n      url: entry.url!,\n      state: entry.getState(),\n      historyState: entry.getHistoryState(),\n      key: entry.key,\n      id: entry.id,\n      index: entry.index,\n      sameDocument: entry.sameDocument,\n    });\n    this.prospectiveEntryIndex = entry.index;\n    const result = new InternalNavigationResult(this);\n    this.traversalQueue.set(entry.key, result);\n    this.runTraversal(() => {\n      this.traversalQueue.delete(entry.key);\n      const intercepted = this.userAgentNavigate(destination, result, {\n        navigationType: 'traverse',\n        cancelable: true,\n        canIntercept: true,\n        // Always false for traverseTo().\n        userInitiated: false,\n        hashChange,\n        info: options?.info,\n      });\n      if (!intercepted) {\n        this.userAgentTraverse(this.navigateEvent!);\n      }\n    });\n    return {\n      committed: result.committed,\n      finished: result.finished,\n    };\n  }\n\n  /** Equivalent to `navigation.back()`. */\n  back(options?: NavigationOptions): FakeNavigationResult {\n    if (this.currentEntryIndex === 0) {\n      const domException = new DOMException('Cannot go back', 'InvalidStateError');\n      const committed = Promise.reject(domException);\n      const finished = Promise.reject(domException);\n      committed.catch(() => {});\n      finished.catch(() => {});\n      return {\n        committed,\n        finished,\n      };\n    }\n    const entry = this.entriesArr[this.currentEntryIndex - 1];\n    return this.traverseTo(entry.key, options);\n  }\n\n  /** Equivalent to `navigation.forward()`. */\n  forward(options?: NavigationOptions): FakeNavigationResult {\n    if (this.currentEntryIndex === this.entriesArr.length - 1) {\n      const domException = new DOMException('Cannot go forward', 'InvalidStateError');\n      const committed = Promise.reject(domException);\n      const finished = Promise.reject(domException);\n      committed.catch(() => {});\n      finished.catch(() => {});\n      return {\n        committed,\n        finished,\n      };\n    }\n    const entry = this.entriesArr[this.currentEntryIndex + 1];\n    return this.traverseTo(entry.key, options);\n  }\n\n  /**\n   * Equivalent to `history.go()`.\n   * Note that this method does not actually work precisely to how Chrome\n   * does, instead choosing a simpler model with less unexpected behavior.\n   * Chrome has a few edge case optimizations, for instance with repeated\n   * `back(); forward()` chains it collapses certain traversals.\n   */\n  go(direction: number): void {\n    const targetIndex = this.prospectiveEntryIndex + direction;\n    if (targetIndex >= this.entriesArr.length || targetIndex < 0) {\n      return;\n    }\n    this.prospectiveEntryIndex = targetIndex;\n    this.runTraversal(() => {\n      // Check again that destination is in the entries array.\n      if (targetIndex >= this.entriesArr.length || targetIndex < 0) {\n        return;\n      }\n      const fromUrl = new URL(this.currentEntry.url!);\n      const entry = this.entriesArr[targetIndex];\n      const hashChange = isHashChange(fromUrl, new URL(entry.url!, t   his.currentEntry.url!));\n      const destination = new FakeNavigationDestination({\n        url: entry.url!,\n        state: entry.getState(),\n        historyState: entry.getHistoryState(),\n        key: entry.key,\n        id: entry.id,\n        index: entry.index,\n        sameDocument: entry.sameDocument,\n      });\n      const result = new InternalNavigationResult(this);\n      const intercepted = this.userAgentNavigate(destination, result, {\n        navigationType: 'traverse',\n        cancelable: true,\n        canIntercept: true,\n        // Always false for go().\n        userInitiated: false,\n        hashChange,\n      });\n      if (!intercepted) {\n        this.userAgentTraverse(this.navigateEvent!);\n      }\n    });\n  }\n\n  /** Runs a traversal synchronously or asynchronously */\n  private runTraversal(traversal: () => void) {\n    if (this.synchronousTraversals) {\n      traversal();\n      return;\n    }\n\n    // Each traversal occupies a single timeout resolution.\n    // This means that Promises added to commit and finish should resolve\n    // before the next traversal.\n    this.nextTraversal = this.nextTraversal.then(() => {\n      return new Promise<void>((resolve) => {\n        setTimeout(() => {\n          resolve();\n          traversal();\n        });\n      });\n    });\n  }\n\n  /** Equivalent to `navigation.addEventListener()`. */\n  addEventListener(\n    type: string,\n    callback: EventListenerOrEventListenerObject,\n    options?: AddEventListenerOptions | boolean,\n  ): void {\n    this.eventTarget.addEventListener(type, callback, options);\n  }\n\n  /** Equivalent to `navigation.removeEventListener()`. */\n  removeEventListener(\n    type: string,\n    callback: EventListenerOrEventListenerObject,\n    options?: EventListenerOptions | boolean,\n  ): void {\n    this.eventTarget.removeEventListener(type, callback, options);\n  }\n\n  /** Equivalent to `navigation.dispatchEvent()` */\n  dispatchEvent(event: Event): boolean {\n    return this.eventTarget.dispatchEvent(event);\n  }\n\n  /** Cleans up resources. */\n  dispose(): void {\n    // Recreate eventTarget to release current listeners.\n    this.eventTarget = this.createEventTarget();\n    this.disposed = true;\n  }\n\n  /** Returns whether this fake is disposed. */\n  isDisposed(): boolean {\n    return this.disposed;\n  }\n\n  /**\n   * Implementation for all navigations and traversals.\n   * @returns true if the event was intercepted, otherwise false\n   */\n  private userAgentNavigate(\n    destination: FakeNavigationDestination,\n    result: InternalNavigationResult,\n    options: InternalNavigateOptions,\n  ): boolean {\n    // The first navigation should disallow any future calls to set the initial\n    // entry.\n    this.canSetInitialEntry = false;\n    if (this.navigateEvent) {\n      this.navigateEvent.cancel(new DOMException('Navigation was aborted', 'AbortError'));\n      this.navigateEvent = null;\n    }\n\n    return dispatchNavigateEvent({\n      navigationType: options.navigationType,\n      cancelable: options.cancelable,\n      canIntercept: options.canIntercept,\n      userInitiated: options.userInitiated,\n      hashChange: options.hashChange,\n      signal: result.signal,\n      destination,\n      info: options.info,\n      sameDocument: destination.sameDocument,\n      result,\n    });\n  }\n\n  /**\n   * Implementation for a push or replace navigation.\n   * https://whatpr.org/html/10919/browsing-the-web.html#url-and-history-update-steps\n   * https://whatpr.org/html/10919/nav-history-apis.html#update-the-navigation-api-entries-for-a-same-document-navigation\n   * @internal\n   */\n  urlAndHistoryUpdateSteps(navigateEvent: InternalFakeNavigateEvent) {\n    this.updateNavigationEntriesForSameDocumentNavigation(navigateEvent);\n  }\n\n  /**\n   * Implementation for a traverse navigation.\n   *\n   * https://whatpr.org/html/10919/browsing-the-web.html#apply-the-traverse-history-step\n   * ...\n   * > Let updateDocument be an algorithm step which performs update document for history step application given targetEntry's document, targetEntry, changingNavigableContinuation's update-only, scriptHistoryLength, scriptHistoryIndex, navigationType, entriesForNavigationAPI, and previousEntry.\n   * > If targetEntry's document is equal to displayedDocument, then perform updateDocument.\n   * https://whatpr.org/html/10919/browsing-the-web.html#update-document-for-history-step-application\n   * which then goes to https://whatpr.org/html/10919/nav-history-apis.html#update-the-navigation-api-entries-for-a-same-document-navigation\n   * @internal\n   */\n  userAgentTraverse(navigateEvent: InternalFakeNavigateEvent) {\n    const oldUrl = this.currentEntry.url!;\n    this.updateNavigationEntriesForSameDocumentNavigation(navigateEvent);\n    // Happens as part of \"updating the document\" steps https://whatpr.org/html/10919/browsing-the-web.html#updating-the-document\n    const popStateEvent = createPopStateEvent({\n      state: navigateEvent.destination.getHistoryState(),\n    });\n    this._window.dispatchEvent(popStateEvent);\n    if (navigateEvent.hashChange) {\n      const hashchangeEvent = createHashChangeEvent(oldUrl, this.currentEntry.url!);\n      this._window.dispatchEvent(hashchangeEvent);\n    }\n  }\n\n  /**\n   * https://whatpr.org/html/10919/nav-history-apis.html#update-the-navigation-api-entries-for-a-same-document-navigation\n   * @internal\n   */\n  updateNavigationEntriesForSameDocumentNavigation({\n    destination,\n    navigationType,\n    result,\n  }: InternalFakeNavigateEvent) {\n    const oldCurrentNHE = this.currentEntry;\n    const disposedNHEs = [];\n    if (navigationType === 'traverse') {\n      this.currentEntryIndex = destination.index;\n      if (this.currentEntryIndex === -1) {\n        throw new Error('unexpected current entry index');\n      }\n    } else if (navigationType === 'push') {\n      this.currentEntryIndex++;\n      this.prospectiveEntryIndex = this.currentEntryIndex; // prospectiveEntryIndex isn't in the spec but is an implementation detail\n      disposedNHEs.push(...this.entriesArr.splice(this.currentEntryIndex));\n    } else if (navigationType === 'replace') {\n      disposedNHEs.push(oldCurrentNHE);\n    }\n    if (navigationType === 'push' || navigationType === 'replace') {\n      const index = this.currentEntryIndex;\n      const key = navigationType === 'push' ? String(this.nextKey++) : this.currentEntry.key;\n      const newNHE = new FakeNavigationHistoryEntry(this.eventTarget, destination.url, {\n        id: String(this.nextId++),\n        key,\n        index,\n        sameDocument: true,\n        state: destination.getState(),\n        historyState: destination.getHistoryState(),\n      });\n      this.entriesArr[this.currentEntryIndex] = newNHE;\n    }\n    result.committedResolve(this.currentEntry);\n    const currentEntryChangeEvent = createFakeNavigationCurrentEntryChangeEvent({\n      from: oldCurrentNHE,\n      navigationType: navigationType,\n    });\n    this.eventTarget.dispatchEvent(currentEntryChangeEvent);\n    for (const disposedNHE of disposedNHEs) {\n      disposedNHE.dispose();\n    }\n  }\n\n  /** Utility method for finding entries with the given `key`. */\n  private findEntry(key: string) {\n    for (const entry of this.entriesArr) {\n      if (entry.key === key) return entry;\n    }\n    return undefined;\n  }\n\n  set onnavigate(\n    // tslint:disable-next-line:no-any\n    _handler: ((this: Navigation, ev: NavigateEvent) => any) | null,\n  ) {\n    throw new Error('unimplemented');\n  }\n\n  // tslint:disable-next-line:no-any\n  get onnavigate(): ((this: Navigation, ev: NavigateEvent) => any) | null {\n    throw new Error('unimplemented');\n  }\n\n  set oncurrententrychange(\n    _handler: // tslint:disable-next-line:no-any\n    ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null,\n  ) {\n    throw new Error('unimplemented');\n  }\n\n  get oncurrententrychange(): // tslint:disable-next-line:no-any\n  ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null {\n    throw new Error('unimplemented');\n  }\n\n  set onnavigatesuccess(\n    // tslint:disable-next-line:no-any\n    _handler: ((this: Navigation, ev: Event) => any) | null,\n  ) {\n    throw new Error('unimplemented');\n  }\n\n  // tslint:disable-next-line:no-any\n  get onnavigatesuccess(): ((this: Navigation, ev: Event) => any) | null {\n    throw new Error('unimplemented');\n  }\n\n  set onnavigateerror(\n    // tslint:disable-next-line:no-any\n    _handler: ((this: Navigation, ev: ErrorEvent) => any) | null,\n  ) {\n    throw new Error('unimplemented');\n  }\n\n  // tslint:disable-next-line:no-any\n  get onnavigateerror(): ((this: Navigation, ev: ErrorEvent) => any) | null {\n    throw new Error('unimplemented');\n  }\n\n  private _transition: NavigationTransition | null = null;\n  /** @internal */\n  set transition(t: NavigationTransition | null) {\n    this._transition = t;\n  }\n  get transition(): NavigationTransition | null {\n    return this._transition;\n  }\n\n  updateCurrentEntry(_options: NavigationUpdateCurrentEntryOptions): void {\n    throw new Error('unimplemented');\n  }\n\n  reload(_options?: NavigationReloadOptions): NavigationResult {\n    throw new Error('unimplemented');\n  }\n}\n\n/**\n * Fake equivalent of the `NavigationResult` interface with\n * `FakeNavigationHistoryEntry`.\n */\ninterface FakeNavigationResult extends NavigationResult {\n  readonly committed: Promise<FakeNavigationHistoryEntry>;\n  readonly finished: Promise<FakeNavigationHistoryEntry>;\n}\n\n/**\n * Fake equivalent of `NavigationHistoryEntry`.\n */\nexport class FakeNavigationHistoryEntry implements NavigationHistoryEntry {\n  readonly sameDocument: boolean;\n\n  readonly id: string;\n  readonly key: string;\n  readonly index: number;\n  private readonly state: unknown;\n  private readonly historyState: unknown;\n\n  // tslint:disable-next-line:no-any\n  ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null = null;\n\n  constructor(\n    private eventTarget: EventTarget,\n    readonly url: string | null,\n    {\n      id,\n      key,\n      index,\n      sameDocument,\n      state,\n      historyState,\n    }: {\n      id: string;\n      key: string;\n      index: number;\n      sameDocument: boolean;\n      historyState: unknown;\n      state?: unknown;\n    },\n  ) {\n    this.id = id;\n    this.key = key;\n    this.index = index;\n    this.sameDocument = sameDocument;\n    this.state = state;\n    this.historyState = historyState;\n  }\n\n  getState(): unknown {\n    // Budget copy.\n    return this.state ? (JSON.parse(JSON.stringify(this.state)) as unknown) : this.state;\n  }\n\n  getHistoryState(): unknown {\n    // Budget copy.\n    return this.historyState\n      ? (JSON.parse(JSON.stringify(this.historyState)) as unknown)\n      : this.historyState;\n  }\n\n  addEventListener(\n    type: string,\n    callback: EventListenerOrEventListenerObject,\n    options?: AddEventListenerOptions | boolean,\n  ): void {\n    this.eventTarget.addEventListener(type, callback, options);\n  }\n\n  removeEventListener(\n    type: string,\n    callback: EventListenerOrEventListenerObject,\n    options?: EventListenerOptions | boolean,\n  ): void {\n    this.eventTarget.removeEventListener(type, callback, options);\n  }\n\n  dispatchEvent(event: Event): boolean {\n    return this.eventTarget.dispatchEvent(event);\n  }\n\n  /** internal */\n  dispose() {\n    const disposeEvent = new Event('disposed');\n    this.dispatchEvent(disposeEvent);\n    // release current listeners\n    this.eventTarget = null!;\n  }\n}\n\n/** `NavigationInterceptOptions` with experimental commit option. */\nexport interface ExperimentalNavigationInterceptOptions extends NavigationInterceptOptions {\n  precommitHandler?: (controller: NavigationPrecommitController) => Promise<void>;\n}\n\nexport interface NavigationPrecommitController {\n  redirect: (url: string) => void;\n}\n\nexport interface ExperimentalNavigateEvent extends NavigateEvent {\n  intercept(options?: ExperimentalNavigationInterceptOptions): void;\n\n  precommitHandler?: () => Promise<void>;\n}\n\n/**\n * Fake equivalent of `NavigateEvent`.\n */\nexport interface FakeNavigateEvent extends ExperimentalNavigateEvent {\n  readonly destination: FakeNavigationDestination;\n}\n\ninterface InternalFakeNavigateEvent extends FakeNavigateEvent {\n  readonly sameDocument: boolean;\n  readonly result: InternalNavigationResult;\n  interceptionState: 'none' | 'intercepted' | 'committed' | 'scrolled' | 'finished';\n  scrollBehavior: 'after-transition' | 'manual' | null;\n  focusResetBehavior: 'after-transition' | 'manual' | null;\n\n  cancel(reason: Error): void;\n}\n\n/**\n * Create a fake equivalent of `NavigateEvent`. This is not a class because ES5\n * transpiled JavaScript cannot extend native Event.\n *\n * https://html.spec.whatwg.org/multipage/nav-history-apis.html#navigate-event-firing\n */\nfunction dispatchNavigateEvent({\n  cancelable,\n  canIntercept,\n  userInitiated,\n  hashChange,\n  navigationType,\n  signal,\n  destination,\n  info,\n  sameDocument,\n  result,\n}: {\n  cancelable: boolean;\n  canIntercept: boolean;\n  userInitiated: boolean;\n  hashChange: boolean;\n  navigationType: NavigationTypeString;\n  signal: AbortSignal;\n  destination: FakeNavigationDestination;\n  info: unknown;\n  sameDocument: boolean;\n  result: InternalNavigationResult;\n}) {\n  const {navigation} = result;\n  const event = new Event('navigate', {bubbles: false, cancelable}) as {\n    -readonly [P in keyof InternalFakeNavigateEvent]: InternalFakeNavigateEvent[P];\n  };\n  event.focusResetBehavior = null;\n  event.scrollBehavior = null;\n  event.interceptionState = 'none';\n  event.canIntercept = canIntercept;\n  event.userInitiated = userInitiated;\n  event.hashChange = hashChange;\n  event.navigationType = navigationType;\n  event.signal = signal;\n  event.destination = destination;\n  event.info = info;\n  event.downloadRequest = null;\n  event.formData = null;\n  event.result = result;\n\n  event.sameDocument = sameDocument;\n\n  let precommitHandlers: Array<(controller: NavigationPrecommitController) => Promise<void>> = [];\n  let handlers: Array<() => Promise<void>> = [];\n\n  // https://whatpr.org/html/10919/nav-history-apis.html#dom-navigateevent-intercept\n  event.intercept = function (\n    this: InternalFakeNavigateEvent,\n    options?: ExperimentalNavigationInterceptOptions,\n  ): void {\n    if (!this.canIntercept) {\n      throw new DOMException(`Cannot intercept when canIntercept is 'false'`, 'SecurityError');\n    }\n    this.interceptionState = 'intercepted';\n    event.sameDocument = true;\n    const precommitHandler = options?.precommitHandler;\n    if (precommitHandler) {\n      if (!this.cancelable) {\n        throw new DOMException(\n          `Cannot use precommitHandler when cancelable is 'false'`,\n          'InvalidStateError',\n        );\n      }\n      precommitHandlers.push(precommitHandler);\n    }\n    if (event.interceptionState !== 'none' && event.interceptionState !== 'intercepted') {\n      throw new Error('Event interceptionState should be \"none\" or \"intercepted\"');\n    }\n    event.interceptionState = 'intercepted';\n    const handler = options?.handler;\n    if (handler) {\n      handlers.push(handler);\n    }\n    // override old options with new ones. UA _may_ report a console warning if new options differ from previous\n    event.focusResetBehavior = options?.focusReset ?? event.focusResetBehavior;\n    event.scrollBehavior = options?.scroll ?? event.scrollBehavior;\n  };\n\n  // https://whatpr.org/html/10919/nav-history-apis.html#dom-navigateevent-scroll\n  event.scroll = function (this: InternalFakeNavigateEvent): void {\n    if (event.interceptionState !== 'committed') {\n      throw new DOMException(\n        `Failed to execute 'scroll' on 'NavigateEvent': scroll() must be ` +\n          `called after commit() and interception options must specify manual scroll.`,\n        'InvalidStateError',\n      );\n    }\n    processScrollBehavior(event);\n  };\n\n  // https://whatpr.org/html/10919/nav-history-apis.html#dom-navigationprecommitcontroller-redirect\n  function redirect(url: string) {\n    if (event.interceptionState === 'none') {\n      throw new Error('cannot redirect when event is not intercepted');\n    }\n    if (event.interceptionState !== 'intercepted') {\n      throw new DOMException(\n        `cannot redirect when event is not in 'intercepted' state`,\n        'InvalidStateError',\n      );\n    }\n    if (event.navigationType !== 'push' && event.navigationType !== 'replace') {\n      throw new DOMException(\n        `cannot redirect when navigationType is not 'push' or 'replace`,\n        'InvalidStateError',\n      );\n    }\n    const toUrl = new URL(url, navigation.currentEntry.url!);\n    event.destination.url = toUrl.href;\n  }\n\n  // https://whatpr.org/html/10919/nav-history-apis.html#inner-navigate-event-firing-algorithm\n  // \"Let commit be the following steps:\"\n  function commit() {\n    if (result.signal.aborted) {\n      return;\n    }\n    if (event.interceptionState !== 'none') {\n      event.interceptionState = 'committed';\n      if (!navigation.currentEntry) {\n        throw new Error('from history entry should not be null');\n      }\n      navigation.transition = new InternalNavigationTransition(\n        navigation.currentEntry,\n        navigationType,\n      );\n      switch (event.navigationType) {\n        case 'push':\n        case 'replace': {\n          navigation.urlAndHistoryUpdateSteps(event);\n          break;\n        }\n        case 'reload': {\n          navigation.updateNavigationEntriesForSameDocumentNavigation(event);\n          break;\n        }\n        case 'traverse': {\n          navigation.userAgentTraverse(event);\n          break;\n        }\n      }\n    }\n    const promisesList = handlers.map((handler) => handler());\n    if (promisesList.length === 0) {\n      promisesList.push(Promise.resolve());\n    }\n    Promise.all(promisesList)\n      .then(() => {\n        // Follows steps outlined under \"Wait for all of promisesList, with the following success steps:\"\n        // in the spec https://html.spec.whatwg.org/multipage/nav-history-apis.html#navigate-event-firing.\n        if (result.signal.aborted) {\n          return;\n        }\n        if (event !== navigation.navigateEvent) {\n          throw new Error(\"Navigation's ongoing event not equal to resolved event\");\n        }\n        navigation.navigateEvent = null;\n        finishNavigationEvent(event, true);\n        const navigatesuccessEvent = new Event('navigatesuccess', {bubbles: false, cancelable});\n        navigation.eventTarget.dispatchEvent(navigatesuccessEvent);\n        result.finishedResolve();\n        if (navigation.transition !== null) {\n          (navigation.transition as InternalNavigationTransition).finishedResolve();\n        }\n        navigation.transition = null;\n      })\n      .catch((reason) => event.cancel(reason));\n  }\n\n  // Internal only.\n  // https://whatpr.org/html/10919/nav-history-apis.html#inner-navigate-event-firing-algorithm\n  // \"Let cancel be the following steps given reason\"\n  event.cancel = function (this: InternalFakeNavigateEvent, reason: Error) {\n    if (result.signal.aborted) {\n      return;\n    }\n    if (event !== navigation.navigateEvent) {\n      throw new Error(\"Navigation's ongoing event not equal to resolved event\");\n    }\n    navigation.navigateEvent = null;\n    if (event.interceptionState !== 'intercepted') {\n      finishNavigationEvent(event, false);\n    }\n    const navigateerrorEvent = new Event('navigateerror', {bubbles: false, cancelable});\n    navigation.eventTarget.dispatchEvent(navigateerrorEvent);\n    result.finishedReject(reason);\n    if (navigation.transition !== null) {\n      (navigation.transition as InternalNavigationTransition).finishedReject(reason);\n    }\n    navigation.transition = null;\n  };\n\n  function dispatch() {\n    navigation.navigateEvent = event;\n    navigation.eventTarget.dispatchEvent(event);\n\n    if (precommitHandlers.length === 0) {\n      commit();\n    } else {\n      const precommitController: NavigationPrecommitController = {redirect};\n      const precommitPromisesList = precommitHandlers.map((handler) =>\n        handler(precommitController),\n      );\n      Promise.all(precommitPromisesList)\n        .then(() => commit())\n        .catch((reason: Error) => event.cancel(reason));\n    }\n  }\n\n  dispatch();\n  return event.interceptionState !== 'none';\n}\n\n/** https://whatpr.org/html/10919/nav-history-apis.html#navigateevent-finish */\nfunction finishNavigationEvent(event: InternalFakeNavigateEvent, didFulfill: boolean) {\n  if (event.interceptionState === 'finished') {\n    throw new Error('Attempting to finish navigation event that was already finished');\n  }\n  if (event.interceptionState === 'intercepted') {\n    if (didFulfill === true) {\n      throw new Error('didFulfill should be false');\n    }\n    // assert precommit handlers is not empty\n    event.interceptionState = 'finished';\n    return;\n  }\n  if (event.interceptionState === 'none') {\n    return;\n  }\n  potentiallyResetFocus(event);\n  if (didFulfill) {\n    potentiallyResetScroll(event);\n  }\n  event.interceptionState = 'finished';\n}\n\n/** https://whatpr.org/html/10919/nav-history-apis.html#potentially-reset-the-focus */\nfunction potentiallyResetFocus(event: InternalFakeNavigateEvent) {\n  if (event.interceptionState !== 'committed' && event.interceptionState !== 'scrolled') {\n    throw new Error('cannot reset focus if navigation event is not committed or scrolled');\n  }\n  // TODO(atscott): The rest of the steps\n}\n\nfunction potentiallyResetScroll(event: InternalFakeNavigateEvent) {\n  if (event.interceptionState !== 'committed' && event.interceptionState !== 'scrolled') {\n    throw new Error('cannot reset scroll if navigation event is not committed or scrolled');\n  }\n  if (event.interceptionState === 'scrolled' || event.scrollBehavior === 'manual') {\n    return;\n  }\n  processScrollBehavior(event);\n}\n\n/* https://whatpr.org/html/10919/nav-history-apis.html#process-scroll-behavior */\nfunction processScrollBehavior(event: InternalFakeNavigateEvent) {\n  if (event.interceptionState !== 'committed') {\n    throw new Error('invalid event interception state when processing scroll behavior');\n  }\n  event.interceptionState = 'scrolled';\n  // TODO(atscott): the rest of the steps\n}\n\n/** Fake equivalent of `NavigationCurrentEntryChangeEvent`. */\nexport interface FakeNavigationCurrentEntryChangeEvent extends NavigationCurrentEntryChangeEvent {\n  readonly from: FakeNavigationHistoryEntry;\n}\n\n/**\n * Create a fake equivalent of `NavigationCurrentEntryChange`. This does not use\n * a class because ES5 transpiled JavaScript cannot extend native Event.\n */\nfunction createFakeNavigationCurrentEntryChangeEvent({\n  from,\n  navigationType,\n}: {\n  from: FakeNavigationHistoryEntry;\n  navigationType: NavigationTypeString;\n}) {\n  const event = new Event('currententrychange', {\n    bubbles: false,\n    cancelable: false,\n  }) as {\n    -readonly [P in keyof NavigationCurrentEntryChangeEvent]: NavigationCurrentEntryChangeEvent[P];\n  };\n  event.from = from;\n  event.navigationType = navigationType;\n  return event as FakeNavigationCurrentEntryChangeEvent;\n}\n\n/**\n * Create a fake equivalent of `PopStateEvent`. This does not use a class\n * because ES5 transpiled JavaScript cannot extend native Event.\n */\nfunction createPopStateEvent({state}: {state: unknown}) {\n  const event = new Event('popstate', {\n    bubbles: false,\n    cancelable: false,\n  }) as {-readonly [P in keyof PopStateEvent]: PopStateEvent[P]};\n  event.state = state;\n  return event as PopStateEvent;\n}\n\nfunction createHashChangeEvent(newURL: string, oldURL: string) {\n  const event = new Event('hashchange', {\n    bubbles: false,\n    cancelable: false,\n  }) as {-readonly [P in keyof HashChangeEvent]: HashChangeEvent[P]};\n  event.newURL = newURL;\n  event.oldURL = oldURL;\n  return event as HashChangeEvent;\n}\n\n/**\n * Fake equivalent of `NavigationDestination`.\n */\nexport class FakeNavigationDestination implements NavigationDestination {\n  url: string;\n  readonly sameDocument: boolean;\n  readonly key: string | null;\n  readonly id: string | null;\n  readonly index: number;\n\n  private readonly state?: unknown;\n  private readonly historyState: unknown;\n\n  constructor({\n    url,\n    sameDocument,\n    historyState,\n    state,\n    key = null,\n    id = null,\n    index = -1,\n  }: {\n    url: string;\n    sameDocument: boolean;\n    historyState: unknown;\n    state?: unknown;\n    key?: string | null;\n    id?: string | null;\n    index?: number;\n  }) {\n    this.url = url;\n    this.sameDocument = sameDocument;\n    this.state = state;\n    this.historyState = historyState;\n    this.key = key;\n    this.id = id;\n    this.index = index;\n  }\n\n  getState(): unknown {\n    return this.state;\n  }\n\n  getHistoryState(): unknown {\n    return this.historyState;\n  }\n}\n\n/** Utility function to determine whether two UrlLike have the same hash. */\nfunction isHashChange(from: URL, to: URL): boolean {\n  return (\n    to.hash !== from.hash &&\n    to.hostname === from.hostname &&\n    to.pathname === from.pathname &&\n    to.search === from.search\n  );\n}\n\nclass InternalNavigationTransition implements NavigationTransition {\n  readonly finished: Promise<void>;\n  finishedResolve!: () => void;\n  finishedReject!: (reason: Error) => void;\n  constructor(\n    readonly from: NavigationHistoryEntry,\n    readonly navigationType: NavigationTypeString,\n  ) {\n    this.finished = new Promise<void>((resolve, reject) => {\n      this.finishedReject = reject;\n      this.finishedResolve = resolve;\n    });\n    // All rejections are handled.\n    this.finished.catch(() => {});\n  }\n}\n\n/**\n * Internal utility class for representing the result of a navigation.\n * Generally equivalent to the \"apiMethodTracker\" in the spec.\n */\nclass InternalNavigationResult {\n  committedTo: FakeNavigationHistoryEntry | null = null;\n  committedResolve!: (entry: FakeNavigationHistoryEntry) => void;\n  committedReject!: (reason: Error) => void;\n  finishedResolve!: () => void;\n  finishedReject!: (reason: Error) => void;\n  readonly committed: Promise<FakeNavigationHistoryEntry>;\n  readonly finished: Promise<FakeNavigationHistoryEntry>;\n  get signal(): AbortSignal {\n    return this.abortController.signal;\n  }\n  private readonly abortController = new AbortController();\n\n  constructor(readonly navigation: FakeNavigation) {\n    this.committed = new Promise<FakeNavigationHistoryEntry>((resolve, reject) => {\n      this.committedResolve = (entry) => {\n        this.committedTo = entry;\n        resolve(entry);\n      };\n      this.committedReject = reject;\n    });\n\n    this.finished = new Promise<FakeNavigationHistoryEntry>(async (resolve, reject) => {\n      this.finishedResolve = () => {\n        if (this.committedTo === null) {\n          throw new Error(\n            'NavigateEvent should have been committed before resolving finished promise.',\n          );\n        }\n        resolve(this.committedTo);\n      };\n      this.finishedReject = (reason: Error) => {\n        reject(reason);\n        this.abortController.abort(reason);\n      };\n    });\n    // All rejections are handled.\n    this.committed.catch(() => {});\n    this.finished.catch(() => {});\n  }\n}\n\n/** Internal options for performing a navigate. */\ninterface InternalNavigateOptions {\n  navigationType: NavigationTypeString;\n  cancelable: boolean;\n  canIntercept: boolean;\n  userInitiated: boolean;\n  hashChange: boolean;\n  info?: unknown;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable} from '@angular/core';\n\n@Injectable()\nexport class Log<T = string> {\n  logItems: T[];\n\n  constructor() {\n    this.logItems = [];\n  }\n\n  add(value: T): void {\n    this.logItems.push(value);\n  }\n\n  fn(value: T) {\n    return () => {\n      this.logItems.push(value);\n    };\n  }\n\n  clear(): void {\n    this.logItems = [];\n  }\n\n  result(): string {\n    return this.logItems.join('; ');\n  }\n}\n"],"names":["inject","DeferBlockState","triggerResourceLoading","renderDeferBlockState","CONTAINER_HEADER_OFFSET","getDeferBlocks","DeferBlockBehavior","NoopNgZone","PendingTasks","ZONELESS_ENABLED","ɵChangeDetectionScheduler","EffectScheduler","MicrotaskEffectScheduler","stringify","ReflectionCapabilities","getAsyncClassMetadataFn","ɵgenerateStandaloneInDeclarationsError","USE_RUNTIME_DEPS_TRACKER_FOR_JIT","depsTracker","getInjectableDef","NG_COMP_DEF","ɵisComponentDefPendingResolution","ɵresolveComponentResources","NgModuleRef","DEFAULT_LOCALE_ID","setLocaleId","ComponentFactory","compileComponent","NG_DIR_DEF","compileDirective","NG_PIPE_DEF","compilePipe","NG_MOD_DEF","transitiveScopesFor","patchComponentDefWithScope","NG_INJ_DEF","compileNgModuleDefs","ɵclearResolutionOfComponentResourcesQueue","ɵrestoreComponentResolutionQueue","internalProvideZoneChangeDetection","ChangeDetectionScheduler","ChangeDetectionSchedulerImpl","DEFER_BLOCK_CONFIG","INTERNAL_APPLICATION_ERROR_HANDLER","isEnvironmentProviders","R3NgModuleFactory","convertToBitFlags","setAllowDuplicateNgModuleIdsForTest","resetCompiledComponents","setUnknownElementStrictMode","setUnknownPropertyStrictMode","getUnknownElementStrictMode","getUnknownPropertyStrictMode","flushModuleScopingQueueAsMuchAsPossible"],"mappings":";;;;;;;;;;;;AAOA;;;;;;;;;;;;;;;;AAgBG;AACG,SAAU,YAAY,CAAC,EAAY,EAAA;AACvC,IAAA,MAAM,KAAK,GAAQ,OAAO,IAAI,KAAK,WAAW,GAAG,IAAI,GAAG,IAAI;IAC5D,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,YAAA;AACL,YAAA,OAAO,OAAO,CAAC,MAAM,CACnB,4EAA4E;AAC1E,gBAAA,yDAAyD,CAC5D;AACH,SAAC;;AAEH,IAAA,MAAM,SAAS,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAC/D,IAAA,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;AACnC,QAAA,OAAO,SAAS,CAAC,EAAE,CAAC;;IAEtB,OAAO,YAAA;AACL,QAAA,OAAO,OAAO,CAAC,MAAM,CACnB,gFAAgF;AAC9E,YAAA,iEAAiE,CACpE;AACH,KAAC;AACH;;AClCO,MAAM,kCAAkC,GAAG,IAAI;MAGzC,8BAA8B,CAAA;AACxB,IAAA,IAAI,GAAGA,QAAM,CAAC,MAAM,CAAC;AACrB,IAAA,gBAAgB,GAAGA,QAAM,CAAC,YAAY,CAAC;AAC/C,IAAA,yBAAyB,GAA8B,IAAI,GAAG,EAAE;AAEzE,IAAA,WAAW,CAAC,CAAU,EAAA;AACpB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;;QACvE,OAAO,SAAkB,EAAE;YAC3B,CAAC,GAAG,SAAS;;;;;QAMf,IAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,GAAG,CAAC,EAAE;YAC3C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE;gBACxD,EAAE,CAAC,CAAC,CAAC;;AAEP,YAAA,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE;;aACjC;AACL,YAAA,MAAM,CAAC;;;wHArBA,8BAA8B,GAAA,CAAA,EAAA;AAA9B,IAAA,OAAA,KAAA,iBAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,KAAA,EAAA,8BAA8B,WAA9B,8BAA8B,CAAA,IAAA,EAAA,CAAA;;iFAA9B,8BAA8B,EAAA,CAAA;cAD1C;;;ACOD;;;;AAIG;MACU,iBAAiB,CAAA;AAGlB,IAAA,KAAA;AACA,IAAA,gBAAA;;IAFV,WACU,CAAA,KAAwB,EACxB,gBAA2C,EAAA;QAD3C,IAAK,CAAA,KAAA,GAAL,KAAK;QACL,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;;AAG1B;;;AAGG;IACH,MAAM,MAAM,CAAC,KAAsB,EAAA;QACjC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;AACxC,YAAA,MAAM,aAAa,GAAG,8BAA8B,CAAC,KAAK,CAAC;AAC3D,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,0CAAA,EAA6C,aAAa,CAAY,UAAA,CAAA;AACpE,gBAAA,CAAA,kBAAA,EAAqB,aAAa,CAAC,WAAW,EAAE,CAAA,6BAAA,CAA+B,CAClF;;AAEH,QAAA,IAAI,KAAK,KAAKC,gBAAe,CAAC,QAAQ,EAAE;YACtC,MAAMC,uBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;;;QAIvF,MAAM,mBAAmB,GAAG,IAAI;AAChC,QAAAC,sBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,mBAAmB,CAAC;AAC1F,QAAA,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE;;AAGvC;;;AAGG;IACH,cAAc,GAAA;QACZ,MAAM,WAAW,GAAwB,EAAE;;;;QAI3C,MAAM,kBAAkB,GAAG,EAAE;QAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,IAAIC,wBAAuB,EAAE;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAACA,wBAAuB,CAAC;AAC5D,YAAAC,eAAc,CAAC,KAAK,EAAE,WAAW,CAAC;AAClC,YAAA,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;AAC/B,gBAAA,kBAAkB,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;;;AAGhF,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;;AAE7C;AAED,SAAS,gBAAgB,CAAC,KAAsB,EAAE,KAAwB,EAAA;IACxE,QAAQ,KAAK;QACX,KAAKJ,gBAAe,CAAC,WAAW;AAC9B,YAAA,OAAO,KAAK,CAAC,QAAQ,CAAC,oBAAoB,KAAK,IAAI;QACrD,KAAKA,gBAAe,CAAC,OAAO;AAC1B,YAAA,OAAO,KAAK,CAAC,QAAQ,CAAC,gBAAgB,KAAK,IAAI;QACjD,KAAKA,gBAAe,CAAC,KAAK;AACxB,YAAA,OAAO,KAAK,CAAC,QAAQ,CAAC,cAAc,KAAK,IAAI;QAC/C,KAAKA,gBAAe,CAAC,QAAQ;AAC3B,YAAA,OAAO,IAAI;AACb,QAAA;AACE,YAAA,OAAO,KAAK;;AAElB;AAEA,SAAS,8BAA8B,CAAC,KAAsB,EAAA;IAC5D,QAAQ,KAAK;QACX,KAAKA,gBAAe,CAAC,WAAW;AAC9B,YAAA,OAAO,aAAa;QACtB,KAAKA,gBAAe,CAAC,OAAO;AAC1B,YAAA,OAAO,SAAS;QAClB,KAAKA,gBAAe,CAAC,KAAK;AACxB,YAAA,OAAO,OAAO;AAChB,QAAA;AACE,YAAA,OAAO,MAAM;;AAEnB;;ACtFA;AACO,MAAM,0CAA0C,GAAG,IAAI;AAE9D;AACO,MAAM,iCAAiC,GAAG,KAAK;AAEtD;AACO,MAAM,mCAAmC,GAAG,KAAK;AAExD;AACO,MAAM,4BAA4B,GAAGK,mBAAkB,CAAC,WAAW;AAE1E;;;;AAIG;MACU,qBAAqB,CAAA;IAChC,iBAAiB,CAAC,aAAqB,EAAA;AACvC,IAAA,qBAAqB;AACtB;AAED;;AAEG;MACU,0BAA0B,GAAG,IAAI,cAAc,CAAU,4BAA4B;AAElG;;AAEG;MACU,wBAAwB,GAAG,IAAI,cAAc,CAAU,0BAA0B;;ACJ9F;;;;AAIG;MACU,gBAAgB,CAAA;AAyDR,IAAA,YAAA;AAxDnB;;AAEG;AACH,IAAA,YAAY;AAEZ;;AAEG;AACH,IAAA,iBAAiB;AAEjB;;AAEG;AACH,IAAA,aAAa;AAEb;;AAEG;AACH,IAAA,UAAU;AAEV;;AAEG;AACH,IAAA,iBAAiB;AAET,IAAA,SAAS;IACT,YAAY,GAAY,KAAK;;IAElB,kBAAkB,GAAGN,QAAM,CAAC,wBAAwB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;;AAEhF,IAAA,OAAO,GAAW,IAAI,CAAC,kBAAkB,GAAG,IAAIO,WAAU,EAAE,GAAGP,QAAM,CAAC,MAAM,CAAC;;;;;;;;AAQpE,IAAA,OAAO,GAAGA,QAAM,CAAC,cAAc,CAAC;AAClC,IAAA,WAAW,GAAG,IAAI,CAAC,OAAgC;AACnD,IAAA,YAAY,GAAGA,QAAM,CAACQ,qBAAY,CAAC;AACnC,IAAA,eAAe,GAAGR,QAAM,CAAC,8BAA8B,CAAC;AACxD,IAAA,eAAe,GAAGA,QAAM,CAACS,iBAAgB,CAAC;AAC1C,IAAA,SAAS,GAAGT,QAAM,CAACU,yBAAyB,CAAC;AAC7C,IAAA,mBAAmB,GAAGV,QAAM,CAACW,gBAAe,CAAC;AAC7C,IAAA,wBAAwB,GAAGX,QAAM,CAACY,yBAAwB,CAAC;AAC3D,IAAA,iBAAiB,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,KAAK;AAChE,IAAA,UAAU,GAChBZ,QAAM,CAAC,0BAA0B,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,IAAI,IAAI,CAAC,iBAAiB;AAExE,IAAA,aAAa,GAAG,IAAI,YAAY,EAAE;;AAG1C,IAAA,MAAM,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO;;AAGtD,IAAA,WAAA,CAAmB,YAA6B,EAAA;QAA7B,IAAY,CAAA,YAAA,GAAZ,YAAY;AAC7B,QAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,iBAAiB;AACvD,QAAA,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,QAAQ;QACvC,IAAI,CAAC,YAAY,GAAiB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC7E,QAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,QAAQ;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAClD,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAEhC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AAClE,YAAA,IAAI,CAAC,SAAS,EAAE,MAAM,0CAAkC;AACxD,YAAA,IAAI,CAAC,SAAS,EAAE,MAAM,uDAA+C;;QAEvE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AACvE,SAAC,CAAC;;;AAGF,QAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAK;AAClC,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;AAC7B,gBAAA,IAAI,EAAE,CAAC,KAAU,KAAI;AACnB,oBAAA,MAAM,KAAK;iBACZ;AACF,aAAA,CAAC,CACH;AACH,SAAC,CAAC;;AAGJ;;AAEG;IACH,aAAa,CAAC,cAAc,GAAG,IAAI,EAAA;AACjC,QAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;QACrC,MAAM,sBAAsB,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,cAAc;AACjF,QAAA,IAAI;YACF,IAAI,CAAC,cAAc,EAAE;gBACnB,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,cAAc,GAAG,MAAO,GAAC;;AAG/D,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,gBAAA,IAAI;AACF,oBAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AAClE,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;;wBACX;AACR,oBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,wBAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;;;;iBAGpE;;;AAGL,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAK;;AAEpB,oBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE;AAChC,oBAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;oBACtC,IAAI,CAAC,cAAc,EAAE;AACvB,iBAAC,CAAC;;;gBAEI;YACR,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,cAAc,GAAG,sBAAsB;;AAE7E,QAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;;AAGvC;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE;;AAGzC;;;;;;AAMG;IACH,iBAAiB,CAAC,UAAU,GAAG,IAAI,EAAA;QACjC,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACpD,YAAA,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC;;AAGxF,QAAA,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE;YAClC,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;;iBAC7D;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;;;AAIzE,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;QAC5B,IAAI,CAAC,aAAa,EAAE;;AAGtB;;;AAGG;IACH,QAAQ,GAAA;QACN,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK;;AAGjD;;;;;AAKG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;;QAG/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1D,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,MAAK;gBAClC,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC;AACf,aAAC,CAAC;AACJ,SAAC,CAAC;;AAGJ;;AAEG;IACH,cAAc,GAAA;QACZ,MAAM,WAAW,GAAwB,EAAE;QAC3C,MAAM,KAAK,GAAI,IAAI,CAAC,YAAY,CAAC,QAAgB,CAAC,QAAQ,CAAC;AAC3D,QAAAK,eAAc,CAAC,KAAK,EAAE,WAAW,CAAC;QAElC,MAAM,kBAAkB,GAAG,EAAE;AAC7B,QAAA,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;YAC/B,kBAAkB,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;;AAG7D,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;;IAGpC,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC;;QAEzE,OAAO,IAAI,CAAC,SAAoC;;AAGlD;;AAEG;IACH,iBAAiB,GAAA;AACf,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,EAAE;AAC1C,YAAA,OAAO,QAAQ,CAAC,iBAAiB,EAAE;;AAErC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;;AAG1B;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AACrE,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC3B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;;AAG7B;;ACpQD,MAAM,KAAK,GAAQ,OAAO,IAAI,KAAK,WAAW,GAAG,IAAI,GAAG,IAAI;AAC5D,MAAM,mBAAmB,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAE7E,MAAM,wCAAwC,GAAG,CAAA;wEACuB;AAExE;;;;;AAKG;SACa,kBAAkB,GAAA;IAChC,IAAI,mBAAmB,EAAE;AACvB,QAAA,OAAO,mBAAmB,CAAC,kBAAkB,EAAE;;AAEjD,IAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;AAC3D;SAEgB,0BAA0B,GAAA;IACxC,IAAI,mBAAmB,IAAK,IAAY,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE;QACrE,mBAAmB,CAAC,kBAAkB,EAAE;;AAE5C;AAEA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACa,SAAA,SAAS,CAAC,EAAY,EAAE,OAA2B,EAAA;IACjE,IAAI,mBAAmB,EAAE;QACvB,OAAO,mBAAmB,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC;;AAEnD,IAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;AAC3D;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DG;SACa,IAAI,CAClB,MAAiB,GAAA,CAAC,EAClB,WAA4D,GAAA;AAC1D,IAAA,iCAAiC,EAAE,IAAI;AACxC,CAAA,EAAA;IAED,IAAI,mBAAmB,EAAE;QACvB,OAAO,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;;AAEtD,IAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;AAC3D;AAEA;;;;;;;;;;AAUG;AACG,SAAU,KAAK,CAAC,QAAiB,EAAA;IACrC,IAAI,mBAAmB,EAAE;AACvB,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC;;AAE5C,IAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;AAC3D;AAEA;;;;AAIG;SACa,oBAAoB,GAAA;IAClC,IAAI,mBAAmB,EAAE;AACvB,QAAA,OAAO,mBAAmB,CAAC,oBAAoB,EAAE;;AAEnD,IAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;AAC3D;AAEA;;;;AAIG;SACa,eAAe,GAAA;IAC7B,IAAI,mBAAmB,EAAE;AACvB,QAAA,OAAO,mBAAmB,CAAC,eAAe,EAAE;;AAE9C,IAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;AAC3D;;ACvKA,IAAI,gBAAgB,GAAG,CAAC;MAEX,iBAAiB,CAAA;AACpB,IAAA,WAAW,GAAG,IAAI,GAAG,EAAe;AAC5C;;;AAGG;AACH,IAAA,gBAAgB,CACd,aAAoC,EACpC,WAAc,EACd,QAA6B,EAAA;QAE7B,MAAM,KAAK,GAAc,EAAE;QAC3B,IAAI,WAAW,EAAE;YACf,WAAW,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,GAAS,WAAY,CAAC,IAAI,CAAC,CAAC,CAAC;;AAGtF,QAAA,IAAI,QAAQ,CAAC,GAAG,EAAE;YAChB,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE;gBACnC,MAAM,IAAI,KAAK,CAAC,CAA6B,0BAAA,EAAAQ,UAAS,CAAC,aAAa,CAAC,CAAoB,kBAAA,CAAA,CAAC;;AAE5F,YAAA,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;;AAElC,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;YACnB,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;;AAE1D,QAAA,IAAI,QAAQ,CAAC,GAAG,EAAE;AAChB,YAAA,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;;AAElC,QAAA,OAAO,IAAI,aAAa,CAAM,KAAK,CAAC;;AAEvC;AAED,SAAS,cAAc,CAAC,QAAmB,EAAE,MAAW,EAAE,UAA4B,EAAA;AACpF,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU;AACvC,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;AACzB,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC9B,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;AACjC,gBAAA,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAC1D,aAAC,CAAC;;aACG;AACL,YAAA,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;;;AAIlE,IAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC3B,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AAC5B,YAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAC/B,CAAC,KAAU,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAC1E;;aACI;AACL,YAAA,IAAI,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE;AAChE,gBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS;;;;AAIlC;AAEA,SAAS,WAAW,CAAC,QAAmB,EAAE,GAAQ,EAAA;AAChD,IAAA,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;AACtB,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;QAChC,IAAI,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;;aACtC;AACL,YAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ;;;AAG/B;AAEA,SAAS,WAAW,CAAC,QAAmB,EAAE,GAAQ,EAAA;AAChD,IAAA,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;QACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;;AAE9B;AAEA,SAAS,YAAY,CAAC,QAAa,EAAE,SAAc,EAAE,UAA4B,EAAA;IAC/E,IAAI,YAAY,GAAG,CAAC;AACpB,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB;AAC3C,IAAA,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAE,KAAU,KAAI;QACxC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC/C,YAAA,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;;;YAI7B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,YAAY,EAAE,CAAE,CAAA,CAAC;;AAG9C,YAAA,OAAO,KAAK;;AACP,aAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AACtC,YAAA,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC;;AAEhD,QAAA,OAAO,KAAK;AACd,KAAC;AAED,IAAA,OAAO,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA,CAAE;AAC7D;AAEA,SAAS,mBAAmB,CAAC,GAAQ,EAAE,UAA4B,EAAA;IACjE,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B,IAAI,CAAC,EAAE,EAAE;QACP,EAAE,GAAG,CAAG,EAAAA,UAAS,CAAC,GAAG,CAAC,CAAG,EAAA,gBAAgB,EAAE,CAAA,CAAE;AAC7C,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;;AAEzB,IAAA,OAAO,EAAE;AACX;AAEA,SAAS,WAAW,CAAC,GAAQ,EAAA;IAC3B,MAAM,KAAK,GAAa,EAAE;;IAE1B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;QAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACzB,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;AAEpB,KAAC,CAAC;;IAGF,IAAI,KAAK,GAAG,GAAG;IACf,QAAQ,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;QAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,KAAI;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC;AAC9D,YAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AACvD,gBAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;;AAEzB,SAAC,CAAC;;AAEJ,IAAA,OAAO,KAAK;AACd;;AC/HA,MAAM,UAAU,GAAG,IAAIC,uBAAsB,EAAE;AAW/C;;AAEG;AACH,MAAe,gBAAgB,CAAA;AACrB,IAAA,SAAS,GAAG,IAAI,GAAG,EAAoC;AACvD,IAAA,QAAQ,GAAG,IAAI,GAAG,EAAuB;IAIjD,WAAW,CAAC,IAAe,EAAE,QAA6B,EAAA;AACxD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;AAChD,QAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;;AAG5B,IAAA,YAAY,CAAC,SAAkD,EAAA;AAC7D,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;QACtB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAI;AACrC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;AAClC,SAAC,CAAC;;AAGJ,IAAA,aAAa,CAAC,IAAe,EAAA;QAC3B,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;;;;;;AAMhD,QAAA,KAAK,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAChD,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC;AACjC,YAAA,MAAM,WAAW,GACf,UAAU,YAAY,SAAS;AAC/B,gBAAA,UAAU,YAAY,SAAS;AAC/B,gBAAA,UAAU,YAAY,IAAI;gBAC1B,UAAU,YAAY,QAAQ;YAChC,IAAI,WAAW,EAAE;AACf,gBAAA,OAAO,UAAU,YAAY,IAAI,CAAC,IAAI,GAAI,UAA2B,GAAG,IAAI;;;AAGhF,QAAA,OAAO,IAAI;;AAGb,IAAA,OAAO,CAAC,IAAe,EAAA;AACrB,QAAA,IAAI,QAAQ,GAAa,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QAExD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACnC,IAAI,QAAQ,EAAE;gBACZ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1C,IAAI,SAAS,EAAE;AACb,oBAAA,MAAM,SAAS,GAAG,IAAI,iBAAiB,EAAE;AACzC,oBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC7B,wBAAA,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAS,EAAE,QAAQ,CAAC;AACvE,qBAAC,CAAC;;;YAGN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;;AAGnC,QAAA,OAAO,QAAQ;;AAElB;AAEK,MAAO,iBAAkB,SAAQ,gBAA2B,CAAA;AAChE,IAAA,IAAa,IAAI,GAAA;AACf,QAAA,OAAO,SAAS;;AAEnB;AAEK,MAAO,iBAAkB,SAAQ,gBAA2B,CAAA;AAChE,IAAA,IAAa,IAAI,GAAA;AACf,QAAA,OAAO,SAAS;;AAEnB;AAEK,MAAO,YAAa,SAAQ,gBAAsB,CAAA;AACtD,IAAA,IAAa,IAAI,GAAA;AACf,QAAA,OAAO,IAAI;;AAEd;AAEK,MAAO,gBAAiB,SAAQ,gBAA0B,CAAA;AAC9D,IAAA,IAAa,IAAI,GAAA;AACf,QAAA,OAAO,QAAQ;;AAElB;;ACjCD,IAAK,qBAGJ;AAHD,CAAA,UAAK,qBAAqB,EAAA;AACxB,IAAA,qBAAA,CAAA,qBAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAW;AACX,IAAA,qBAAA,CAAA,qBAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAiB;AACnB,CAAC,EAHI,qBAAqB,KAArB,qBAAqB,GAGzB,EAAA,CAAA,CAAA;AAED,SAAS,uBAAuB,CAAC,KAAc,EAAA;AAC7C,IAAA,QACE,KAAK,KAAK,qBAAqB,CAAC,WAAW,IAAI,KAAK,KAAK,qBAAqB,CAAC,iBAAiB;AAEpG;AAEA,SAAS,4BAA4B,CACnC,KAAkB,EAClB,QAAuB,EACvB,QAAgB,EAAA;AAEhB,IAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,QAAA,IAAI,CAACC,wBAAuB,CAAC,IAAI,CAAC,EAAE;YAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;AACxC,YAAA,IAAI,SAAS,KAAK,SAAS,CAAC,UAAU,IAAI,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE;gBACvE,MAAM,IAAI,KAAK,CAACC,sCAAsC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;;;AAG7E,KAAC,CAAC;AACJ;MAgBa,eAAe,CAAA;AAqEhB,IAAA,QAAA;AACA,IAAA,qBAAA;IArEF,gCAAgC,GAAqC,IAAI;;IAGzE,YAAY,GAAgB,EAAE;IAC9B,OAAO,GAAgB,EAAE;IACzB,SAAS,GAAe,EAAE;IAC1B,OAAO,GAAU,EAAE;;AAGnB,IAAA,iBAAiB,GAAG,IAAI,GAAG,EAAa;AACxC,IAAA,iBAAiB,GAAG,IAAI,GAAG,EAAa;AACxC,IAAA,YAAY,GAAG,IAAI,GAAG,EAAa;;;AAInC,IAAA,2BAA2B,GAAG,IAAI,GAAG,EAAiB;;AAGtD,IAAA,cAAc,GAAG,IAAI,GAAG,EAAa;AACrC,IAAA,cAAc,GAAG,IAAI,GAAG,EAAa;;AAGrC,IAAA,iBAAiB,GAAG,IAAI,GAAG,EAAqB;;;AAIhD,IAAA,uBAAuB,GAAG,IAAI,GAAG,EAAuB;IAExD,SAAS,GAAc,aAAa,EAAE;;;;;;;;AAStC,IAAA,sBAAsB,GAAG,IAAI,GAAG,EAAuD;;;;;;AAOvF,IAAA,aAAa,GAAG,IAAI,GAAG,EAA0D;;;IAIjF,aAAa,GAAuB,EAAE;IAEtC,SAAS,GAAoB,IAAI;IACjC,iBAAiB,GAAsB,IAAI;IAE3C,iBAAiB,GAAe,EAAE;IAClC,qBAAqB,GAAe,EAAE;;;AAGtC,IAAA,yBAAyB,GAAG,IAAI,GAAG,EAAiC;AACpE,IAAA,wBAAwB,GAAG,IAAI,GAAG,EAAiB;AACnD,IAAA,6BAA6B,GAAG,IAAI,GAAG,EAAa;AAEpD,IAAA,cAAc;IACd,aAAa,GAA4B,IAAI;IAE7C,kBAAkB,GAAG,4BAA4B;IACjD,4BAA4B,GAAG,kCAAkC;IAEzE,WACU,CAAA,QAAqB,EACrB,qBAA8C,EAAA;QAD9C,IAAQ,CAAA,QAAA,GAAR,QAAQ;QACR,IAAqB,CAAA,qBAAA,GAArB,qBAAqB;AAE7B,QAAA,MAAM,iBAAiB,CAAA;AAAG;AAC1B,QAAA,IAAI,CAAC,cAAc,GAAG,iBAAwB;;AAGhD,IAAA,oBAAoB,CAAC,SAA4B,EAAA;AAC/C,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;AAGvB,IAAA,sBAAsB,CAAC,SAA6B,EAAA;;AAElD,QAAA,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS,EAAE;;AAExC,YAAA,4BAA4B,CAC1B,SAAS,CAAC,YAAY,EACtB,IAAI,CAAC,SAAS,CAAC,SAAS,EACxB,uCAAuC,CACxC;YACD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,YAAY,EAAE,qBAAqB,CAAC,WAAW,CAAC;YAC9E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC;;;AAInD,QAAA,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE;AACnC,YAAA,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,OAAO,CAAC;YAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;;AAGzC,QAAA,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC;;AAG7C,QAAA,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE;YACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;;QAGzC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,kBAAkB,IAAI,4BAA4B;AACtF,QAAA,IAAI,CAAC,4BAA4B;AAC/B,YAAA,SAAS,CAAC,wBAAwB,IAAI,kCAAkC;;IAG5E,cAAc,CAAC,QAAmB,EAAE,QAAoC,EAAA;QACtE,IAAIC,iCAAgC,EAAE;AACpC,YAAAC,YAAW,CAAC,kBAAkB,CAAC,QAAQ,CAAC;;AAE1C,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAA6B,CAAC;;QAGzD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACrD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;AACxD,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;YACrB,MAAM,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;;AAGnD,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;;;;AAK1C,QAAA,IAAI,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,CAAC;;IAG7C,iBAAiB,CAAC,SAAoB,EAAE,QAAqC,EAAA;AAC3E,QAAA,IAAI,CAAC,+BAA+B,CAAC,SAAS,EAAE,QAAQ,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC;AACzD,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;;;AAIrC,QAAA,IAAI,CAAC,uCAAuC,CAAC,SAAS,CAAC;;IAGzD,iBAAiB,CAAC,SAAoB,EAAE,QAAqC,EAAA;AAC3E,QAAA,IAAI,CAAC,+BAA+B,CAAC,SAAS,EAAE,QAAQ,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC;AACzD,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;;IAGvC,YAAY,CAAC,IAAe,EAAE,QAAgC,EAAA;AAC5D,QAAA,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE,QAAQ,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC/C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;;IAGrB,+BAA+B,CACrC,IAAe,EACf,QAAwD,EAAA;AAExD,QAAA,IACE,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,YAAY,CAAC;AAC1C,YAAA,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,YAAY,CAAC;YAC1C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC,EAC7C;AACA,YAAA,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,CAAC,IAAI,CAAsC,oCAAA,CAAA;AACpE,gBAAA,CAAA,wEAAA,CAA0E,CAC7E;;;IAIL,gBAAgB,CACd,KAAU,EACV,QAAgF,EAAA;AAEhF,QAAA,IAAI,WAAqB;AACzB,QAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;AACrC,YAAA,WAAW,GAAG;AACZ,gBAAA,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,QAAQ,CAAC,UAAU;AAC/B,gBAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;gBACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;aACtB;;AACI,aAAA,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;AAC1C,YAAA,WAAW,GAAG,EAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAC;;aAC7E;AACL,YAAA,WAAW,GAAG,EAAC,OAAO,EAAE,KAAK,EAAC;;AAGhC,QAAA,MAAM,aAAa,GACjB,OAAO,KAAK,KAAK,QAAQ,GAAGC,iBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI;AAC5D,QAAA,MAAM,UAAU,GAAG,aAAa,KAAK,IAAI,GAAG,IAAI,GAAG,iBAAiB,CAAC,aAAa,CAAC,UAAU,CAAC;AAC9F,QAAA,MAAM,eAAe,GACnB,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,iBAAiB;AAC7E,QAAA,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;;QAGjC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;AACrD,QAAA,IAAI,aAAa,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,UAAU,CAAC;AACxE,YAAA,IAAI,iBAAiB,KAAK,SAAS,EAAE;AACnC,gBAAA,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;;iBAC9B;gBACL,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC;;;;IAKnE,kCAAkC,CAAC,IAAe,EAAE,QAAgB,EAAA;AAClE,QAAA,MAAM,GAAG,GAAI,IAAY,CAACC,YAAW,CAAC;QACtC,MAAM,YAAY,GAAG,MAAc;AACjC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAe;AACrE,YAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;AAC5D,SAAC;AACD,QAAA,MAAM,iBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,CAACC,gCAAgC,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE;;;;;;;;QAS5F,MAAM,QAAQ,GAAG;AACf,cAAE,EAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS;AAC3D,cAAE,EAAC,QAAQ,EAAC;QACd,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAC,GAAG,EAAE,QAAQ,EAAC,CAAC;AAE7C,QAAA,IAAI,iBAAiB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5D,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC;;;QAIpD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,iBAAiB,CAAC;;AAGxE,IAAA,MAAM,yCAAyC,GAAA;AACrD,QAAA,IAAI,IAAI,CAAC,2BAA2B,CAAC,IAAI,KAAK,CAAC;YAAE;QAEjD,MAAM,QAAQ,GAAG,EAAE;AACnB,QAAA,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,2BAA2B,EAAE;AACxD,YAAA,MAAM,eAAe,GAAGN,wBAAuB,CAAC,SAAS,CAAC;YAC1D,IAAI,eAAe,EAAE;AACnB,gBAAA,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;;;AAGpC,QAAA,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE;QAExC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChD,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,CAAC;;;AAIjD,QAAA,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE;AACxC,YAAA,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC;;;AAIjD,IAAA,MAAM,iBAAiB,GAAA;QACrB,IAAI,CAAC,6BAA6B,EAAE;;;;AAKpC,QAAA,MAAM,IAAI,CAAC,yCAAyC,EAAE;;;;;AAMtD,QAAA,4BAA4B,CAC1B,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,CAAC,SAAS,EACxB,uCAAuC,CACxC;;AAGD,QAAA,IAAI,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE;;QAGjD,IAAI,mBAAmB,EAAE;AACvB,YAAA,IAAI,cAA8B;AAClC,YAAA,IAAI,QAAQ,GAAG,CAAC,GAAW,KAAqB;gBAC9C,IAAI,CAAC,cAAc,EAAE;oBACnB,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;;gBAEpD,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACjD,aAAC;AACD,YAAA,MAAMO,0BAA0B,CAAC,QAAQ,CAAC;;;IAI9C,QAAQ,GAAA;;QAEN,IAAI,CAAC,gBAAgB,EAAE;;QAGvB,IAAI,CAAC,iBAAiB,EAAE;QAExB,IAAI,CAAC,qBAAqB,EAAE;QAE5B,IAAI,CAAC,sBAAsB,EAAE;;;QAI7B,IAAI,CAAC,iCAAiC,EAAE;;;AAIxC,QAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE;AAEnC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ;AAC7C,QAAA,IAAI,CAAC,aAAa,GAAG,IAAIC,mBAAW,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,CAAC;;;AAI5E,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,qBAAqB,CAAS,CAAC,eAAe,EAAE;;;;AAKjF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAEC,kBAAiB,CAAC;QAC9EC,YAAW,CAAC,QAAQ,CAAC;QAErB,OAAO,IAAI,CAAC,aAAa;;AAG3B;;AAEG;AACH,IAAA,oBAAoB,CAAC,UAAqB,EAAA;AACxC,QAAA,IAAI,CAAC,0BAA0B,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,sBAAsB,EAAE;AAC7B,QAAA,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAC9C,IAAI,CAAC,qBAAqB,EAAE;;AAG9B;;AAEG;IACH,MAAM,qBAAqB,CAAC,UAAqB,EAAA;AAC/C,QAAA,IAAI,CAAC,0BAA0B,CAAC,CAAC,UAAU,CAAC,CAAC;AAC7C,QAAA,MAAM,IAAI,CAAC,iBAAiB,EAAE;QAC9B,IAAI,CAAC,sBAAsB,EAAE;AAC7B,QAAA,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;QAC9C,IAAI,CAAC,qBAAqB,EAAE;;AAG9B;;AAEG;IACH,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM;;AAG9B;;AAEG;AACH,IAAA,sBAAsB,CAAC,UAAwB,EAAA;AAC7C,QAAA,OAAO,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,WAAW,KAAI;AACnF,YAAA,MAAM,YAAY,GAAI,WAAmB,CAAC,IAAI;AAC9C,YAAA,YAAY,IAAI,SAAS,CAAC,IAAI,CAAC,IAAIC,wBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,aAAc,CAAC,CAAC;AACvF,YAAA,OAAO,SAAS;SACjB,EAAE,EAA6B,CAAC;;IAG3B,gBAAgB,GAAA;;QAEtB,IAAI,mBAAmB,GAAG,KAAK;QAC/B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AAC7C,YAAA,IAAIX,wBAAuB,CAAC,WAAW,CAAC,EAAE;AACxC,gBAAA,MAAM,IAAI,KAAK,CACb,cAAc,WAAW,CAAC,IAAI,CAA6B,2BAAA,CAAA;AACzD,oBAAA,CAAA,2EAAA,CAA6E,CAChF;;AAGH,YAAA,mBAAmB,GAAG,mBAAmB,IAAIM,gCAAgC,CAAC,WAAW,CAAC;AAE1F,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC;AAC9D,YAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;gBACrB,MAAM,gBAAgB,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC;;AAGvD,YAAA,IAAI,CAAC,eAAe,CAACD,YAAW,EAAE,WAAW,CAAC;YAC9C,IAAIH,iCAAgC,EAAE;AACpC,gBAAAC,YAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC;;AAE7C,YAAAS,iBAAgB,CAAC,WAAW,EAAE,QAAQ,CAAC;AACzC,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;QAE9B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AAC7C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC;AAC9D,YAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;gBACrB,MAAM,gBAAgB,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC;;AAEvD,YAAA,IAAI,CAAC,eAAe,CAACC,WAAU,EAAE,WAAW,CAAC;AAC7C,YAAAC,iBAAgB,CAAC,WAAW,EAAE,QAAQ,CAAC;AACzC,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;QAE9B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AACxC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;AACzD,YAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;gBACrB,MAAM,gBAAgB,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;;AAElD,YAAA,IAAI,CAAC,eAAe,CAACC,YAAW,EAAE,WAAW,CAAC;AAC9C,YAAAC,YAAW,CAAC,WAAW,EAAE,QAAQ,CAAC;AACpC,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAEzB,QAAA,OAAO,mBAAmB;;IAGpB,qBAAqB,GAAA;QAC3B,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE;;;;YAInC,MAAM,gBAAgB,GAAI,IAAI,CAAC,cAAsB,CAACC,WAAU,CAAC;YACjE,MAAM,eAAe,GAAG,IAAI,CAAC,iCAAiC,CAAC,gBAAgB,CAAC,OAAO,CAAC;AACxF,YAAA,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE;AAC5B,gBAAA,eAAe,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;oBACrC,IAAI,CAACf,iCAAgC,EAAE;wBACrC,IAAI,CAAC,qBAAqB,CAAC,UAAiB,EAAEe,WAAU,EAAE,yBAAyB,CAAC;AACnF,wBAAA,UAAkB,CAACA,WAAU,CAAC,CAAC,uBAAuB,GAAG,IAAI;;yBACzD;AACL,wBAAAd,YAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC;;AAE9C,iBAAC,CAAC;;;AAIN,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAA+D;AAC5F,QAAA,MAAM,gBAAgB,GAAG,CACvB,UAA6C,KACjB;YAC5B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AAClC,gBAAA,MAAM,eAAe,GAAG,uBAAuB,CAAC,UAAU,CAAC;AAC3D,gBAAA,MAAM,QAAQ,GAAG,eAAe,GAAG,IAAI,CAAC,cAAc,GAAI,UAAwB;gBAClF,aAAa,CAAC,GAAG,CAAC,UAAU,EAAEe,oBAAmB,CAAC,QAAQ,CAAC,CAAC;;AAE9D,YAAA,OAAO,aAAa,CAAC,GAAG,CAAC,UAAU,CAAE;AACvC,SAAC;QAED,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,aAAa,KAAI;AAChE,YAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,gBAAA,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC;gBAChD,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAEb,YAAW,EAAE,eAAe,CAAC;gBACvE,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAEA,YAAW,EAAE,UAAU,CAAC;gBAClEc,2BAA0B,CAAC,eAAe,CAAC,aAAa,CAAE,EAAE,WAAW,CAAC;;;;;;;;;YAS1E,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAEd,YAAW,EAAE,OAAO,CAAC;AACjE,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE;;IAG7B,sBAAsB,GAAA;QAC5B,MAAM,mBAAmB,GAAG,CAAC,KAAa,KAAK,CAAC,IAAe,KAAI;YACjE,MAAM,QAAQ,GAAG,KAAK,KAAKA,YAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS;YAC5F,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAE;YACxC,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AACjD,gBAAA,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC;;AAEnD,SAAC;QACD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAACA,YAAW,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAACQ,WAAU,CAAC,CAAC;AAE5D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;;AAG7B;;;AAGG;AACK,IAAA,6BAA6B,CAAC,IAAe,EAAA;QACnD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;;;;;AAMhE,QAAA,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC7D;;AAEF,QAAA,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,IAAI,CAAC;;;;;;AAO5C,QAAA,MAAM,WAAW,GAAS,IAAY,CAACO,WAAU,CAAC;;AAGlD,QAAA,IAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,KAAK,CAAC;YAAE;AAE9C,QAAA,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE;;AAE/B,YAAA,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC;YACjC,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;AAC1D,YAAA,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE;AACrC,gBAAA,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC;;;aAE3C;AACL,YAAA,MAAM,SAAS,GAAmD;gBAChE,GAAG,WAAW,CAAC,SAAS;gBACxB,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAyB,CAAC,IAAI,EAAE,CAAC;aACzE;AACD,YAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE;AACxC,gBAAA,IAAI,CAAC,eAAe,CAACA,WAAU,EAAE,IAAI,CAAC;gBAEtC,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAEA,WAAU,EAAE,WAAW,CAAC;gBACzD,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC;;;AAIhE,YAAA,MAAM,SAAS,GAAI,IAAY,CAACH,WAAU,CAAC;YAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC;AAChD,YAAA,KAAK,MAAM,cAAc,IAAI,OAAO,EAAE;AACpC,gBAAA,IAAI,CAAC,6BAA6B,CAAC,cAAc,CAAC;;;;YAIpD,KAAK,MAAM,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;AACzD,gBAAA,IAAI,qBAAqB,CAAC,cAAc,CAAC,EAAE;AACzC,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACtB,wBAAA,MAAM,EAAE,cAAc;AACtB,wBAAA,SAAS,EAAE,WAAW;wBACtB,aAAa,EAAE,cAAc,CAAC,SAAS;AACxC,qBAAA,CAAC;oBACF,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,sBAAsB,CACpD,cAAc,CAAC,SAA2D,CAC3E;;;;;IAMD,iCAAiC,GAAA;QACvC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAClC,CAAC,MAAM,EAAE,IAAI,MAAO,IAAY,CAACZ,YAAW,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,CAC/D;AACD,QAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE;;IAG9B,cAAc,CAAC,GAAU,EAAE,UAA6C,EAAA;AAC9E,QAAA,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE;AACvB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC;;iBACjC;AACL,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC;;;;IAK/B,iBAAiB,CAAC,QAAmB,EAAE,QAAkB,EAAA;;AAE/D,QAAA,IAAI,CAAC,eAAe,CAACY,WAAU,EAAE,QAAQ,CAAC;AAC1C,QAAA,IAAI,CAAC,eAAe,CAACG,WAAU,EAAE,QAAQ,CAAC;AAE1C,QAAAC,oBAAmB,CAAC,QAA6B,EAAE,QAAQ,CAAC;;AAGtD,IAAA,uCAAuC,CAAC,IAAmB,EAAA;AACjE,QAAA,MAAM,eAAe,GAAGrB,wBAAuB,CAAC,IAAI,CAAC;QACrD,IAAI,eAAe,EAAE;AACnB,YAAA,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAC;;;IAItC,SAAS,CAAC,IAAe,EAAE,UAAoD,EAAA;;;AAGrF,QAAA,IAAI,CAAC,uCAAuC,CAAC,IAAI,CAAC;AAElD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QACxD,IAAI,SAAS,EAAE;;;;AAIb,YAAA,IAAIM,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAACD,YAAW,CAAC,EAAE;AAC/E,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAElC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;YAiB7B,IACE,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;AACtC,gBAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,qBAAqB,CAAC,WAAW,EAC3E;gBACA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC;;YAEnD;;AAGF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QACxD,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,cAAc,CAACQ,WAAU,CAAC,EAAE;AACpC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAElC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B;;AAGF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9C,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAACE,YAAW,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B;;;AAII,IAAA,0BAA0B,CAAC,GAAU,EAAA;;;;;AAK3C,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAE;AAC/B,QAAA,MAAM,+BAA+B,GAAG,CAAC,GAAU,KAAU;AAC3D,YAAA,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE;AACvB,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACxB,+BAA+B,CAAC,KAAK,CAAC;;AACjC,qBAAA,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;AAChC,oBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI;AACtB,oBAAA,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBAC1B;;AAEF,oBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;;;AAGtB,oBAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;oBAC3D,+BAA+B,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC3D,+BAA+B,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;;AACtD,qBAAA,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE;AACvC,oBAAA,+BAA+B,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;;AAC5C,qBAAA,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE;AACvC,oBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC;AAC3B,oBAAA,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC;AAElC,oBAAA,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBAC1B;;AAEF,oBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;oBAEtB,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;AAC1D,oBAAA,YAAY,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;;;;;wBAKlC,IAAI,qBAAqB,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE;AACnE,4BAAA,+BAA+B,CAAC,CAAC,UAAU,CAAC,CAAC;;6BACxC;AACL,4BAAA,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC;;AAEpC,qBAAC,CAAC;;;AAGR,SAAC;QACD,+BAA+B,CAAC,GAAG,CAAC;;;;;;;;;AAU9B,IAAA,iCAAiC,CAAC,GAAU,EAAA;AAClD,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqB;AAChD,QAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAqB;AACpD,QAAA,MAAM,wBAAwB,GAAG,CAAC,GAAU,EAAE,IAAyB,KAAU;AAC/E,YAAA,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE;AACvB,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;;;AAGxB,oBAAA,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC;;AAChC,qBAAA,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;AAChC,oBAAA,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;;;;AAI1B,wBAAA,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC9B,4BAAA,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;wBAEnD;;AAEF,oBAAA,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;oBACtB,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACrC,wBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;;AAGnD,oBAAA,MAAM,SAAS,GAAI,KAAa,CAACE,WAAU,CAAC;AAC5C,oBAAA,wBAAwB,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;;AAGpF,SAAC;AACD,QAAA,wBAAwB,CAAC,GAAG,EAAE,EAAE,CAAC;AACjC,QAAA,OAAO,eAAe;;AAGxB;;;;;AAKG;IACK,eAAe,CAAC,IAAY,EAAE,IAAe,EAAA;QACnD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACjC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;;QAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE;QACjD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,CAAC;AAC9D,YAAA,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC;;;AAI7B,IAAA,qBAAqB,CAAC,IAAe,EAAE,QAAgB,EAAE,SAAiB,EAAA;AAChF,QAAA,MAAM,GAAG,GAAS,IAAY,CAAC,QAAQ,CAAC;AACxC,QAAA,MAAM,aAAa,GAAQ,GAAG,CAAC,SAAS,CAAC;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAC,CAAC;;AAGlE;;;;AAIG;IACK,6BAA6B,GAAA;AACnC,QAAA,IAAI,IAAI,CAAC,gCAAgC,KAAK,IAAI,EAAE;AAClD,YAAA,IAAI,CAAC,gCAAgC,GAAG,IAAI,GAAG,EAAE;;QAEnDK,yCAAyC,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAC7D,IAAI,CAAC,gCAAiC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CACvD;;AAGH;;;;AAIG;IACK,+BAA+B,GAAA;AACrC,QAAA,IAAI,IAAI,CAAC,gCAAgC,KAAK,IAAI,EAAE;AAClD,YAAAC,gCAAgC,CAAC,IAAI,CAAC,gCAAgC,CAAC;AACvE,YAAA,IAAI,CAAC,gCAAgC,GAAG,IAAI;;;IAIhD,oBAAoB,GAAA;;;QAGlB,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAoB,KAAI;YACxD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa;AAC5C,SAAC,CAAC;;QAEF,IAAI,CAAC,aAAa,CAAC,OAAO,CACxB,CAAC,IAAiD,EAAE,IAAe,KAAI;YACrE,IAAIrB,iCAAgC,EAAE;AACpC,gBAAAC,YAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC;;YAEtC,IAAI,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,IAAI,KAAI;gBAChC,IAAI,CAAC,UAAU,EAAE;;;;;;;AAOf,oBAAA,OAAQ,IAAY,CAAC,IAAI,CAAC;;qBACrB;oBACL,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;;AAEjD,aAAC,CAAC;AACJ,SAAC,CACF;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE;QAC1C,IAAI,CAAC,+BAA+B,EAAE;;QAEtCO,YAAW,CAACD,kBAAiB,CAAC;;IAGxB,iBAAiB,GAAA;AACvB,QAAA,MAAM,eAAe,CAAA;AAAG;QACxBY,oBAAmB,CAAC,eAAoC,EAAE;AACxD,YAAA,SAAS,EAAE;gBACT,GAAG,IAAI,CAAC,qBAAqB;gBAC7BG,mCAAkC,CAAC,EAAE,CAAC;gBACtC,8BAA8B;AAC9B,gBAAA,EAAC,OAAO,EAAEC,yBAAwB,EAAE,WAAW,EAAEC,6BAA4B,EAAC;AAC/E,aAAA;AACF,SAAA,CAAC;AAEF,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,EAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,EAAC;AAC/D,YAAA,EAAC,OAAO,EAAEC,mBAAkB,EAAE,QAAQ,EAAE,EAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAC,EAAC;AAC5E,YAAA;AACE,gBAAA,OAAO,EAAEC,mCAAkC;gBAC3C,UAAU,EAAE,MAAK;AACf,oBAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE;AACrC,wBAAA,MAAM,OAAO,GAAG3C,QAAM,CAAC,8BAA8B,CAAC;wBACtD,OAAO,CAAC,CAAU,KAAI;AACpB,4BAAA,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AACxB,yBAAC;;yBACI;AACL,wBAAA,MAAM,gBAAgB,GAAGA,QAAM,CAAC,YAAY,CAAC;AAC7C,wBAAA,MAAM,MAAM,GAAGA,QAAM,CAAC,MAAM,CAAC;AAC7B,wBAAA,OAAO,CAAC,CAAU,KAAK,MAAM,CAAC,iBAAiB,CAAC,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;;iBAEzF;AACF,aAAA;YACD,GAAG,IAAI,CAAC,SAAS;YACjB,GAAG,IAAI,CAAC,iBAAiB;SAC1B;AACD,QAAA,MAAM,OA\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"}_xXS/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

/**
 * The default equality function used for `signal` and `computed`, which uses referential equality.
 */
function defaultEquals(a, b) {
    return Object.is(a, b);
}

/**
 * The currently active consumer `ReactiveNode`, if running code in a reactive context.
 *
 * Change this via `setActiveConsumer`.
 */
let activeConsumer = null;
let inNotificationPhase = false;
/**
 * Global epoch counter. Incremented whenever a source signal is set.
 */
let epoch = 1;
/**
 * Symbol used to tell `Signal`s apart from other functions.
 *
 * This can be used to auto-unwrap signals in various cases, or to auto-wrap non-signal values.
 */
const SIGNAL = /* @__PURE__ */ Symbol('SIGNAL');
function setActiveConsumer(consumer) {
    const prev = activeConsumer;
    activeConsumer = consumer;
    return prev;
}
function getActiveConsumer() {
    return activeConsumer;
}
function isInNotificationPhase() {
    return inNotificationPhase;
}
function isReactive(value) {
    return value[SIGNAL] !== undefined;
}
const REACTIVE_NODE = {
    version: 0,
    lastCleanEpoch: 0,
    dirty: false,
    producerNode: undefined,
    producerLastReadVersion: undefined,
    producerIndexOfThis: undefined,
    nextProducerIndex: 0,
    liveConsumerNode: undefined,
    liveConsumerIndexOfThis: undefined,
    consumerAllowSignalWrites: false,
    consumerIsAlwaysLive: false,
    kind: 'unknown',
    producerMustRecompute: () => false,
    producerRecomputeValue: () => { },
    consumerMarkedDirty: () => { },
    consumerOnSignalRead: () => { },
};
/**
 * Called by implementations when a producer's signal is read.
 */
function producerAccessed(node) {
    if (inNotificationPhase) {
        throw new Error(typeof ngDevMode !== 'undefined' && ngDevMode
            ? `Assertion error: signal read during notification phase`
            : '');
    }
    if (activeConsumer === null) {
        // Accessed outside of a reactive context, so nothing to record.
        return;
    }
    activeConsumer.consumerOnSignalRead(node);
    // This producer is the `idx`th dependency of `activeConsumer`.
    const idx = activeConsumer.nextProducerIndex++;
    assertConsumerNode(activeConsumer);
    if (idx < activeConsumer.producerNode.length && activeConsumer.producerNode[idx] !== node) {
        // There's been a change in producers since the last execution of `activeConsumer`.
        // `activeConsumer.producerNode[idx]` holds a stale dependency which will be be removed and
        // replaced with `this`.
        //
        // If `activeConsumer` isn't live, then this is a no-op, since we can replace the producer in
        // `activeConsumer.producerNode` directly. However, if `activeConsumer` is live, then we need
        // to remove it from the stale producer's `liveConsumer`s.
        if (consumerIsLive(activeConsumer)) {
            const staleProducer = activeConsumer.producerNode[idx];
            producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx]);
            // At this point, the only record of `staleProducer` is the reference at
            // `activeConsumer.producerNode[idx]` which will be overwritten below.
        }
    }
    if (activeConsumer.producerNode[idx] !== node) {
        // We're a new dependency of the consumer (at `idx`).
        activeConsumer.producerNode[idx] = node;
        // If the active consumer is live, then add it as a live consumer. If not, then use 0 as a
        // placeholder value.
        activeConsumer.producerIndexOfThis[idx] = consumerIsLive(activeConsumer)
            ? producerAddLiveConsumer(node, activeConsumer, idx)
            : 0;
    }
    activeConsumer.producerLastReadVersion[idx] = node.version;
}
/**
 * Increment the global epoch counter.
 *
 * Called by source producers (that is, not computeds) whenever their values change.
 */
function producerIncrementEpoch() {
    epoch++;
}
/**
 * Ensure this producer's `version` is up-to-date.
 */
function producerUpdateValueVersion(node) {
    if (consumerIsLive(node) && !node.dirty) {
        // A live consumer will be marked dirty by producers, so a clean state means that its version
        // is guaranteed to be up-to-date.
        return;
    }
    if (!node.dirty && node.lastCleanEpoch === epoch) {
        // Even non-live consumers can skip polling if they previously found themselves to be clean at
        // the current epoch, since their dependencies could not possibly have changed (such a change
        // would've increased the epoch).
        return;
    }
    if (!node.producerMustRecompute(node) && !consumerPollProducersForChange(node)) {
        // None of our producers report a change since the last time they were read, so no
        // recomputation of our value is necessary, and we can consider ourselves clean.
        producerMarkClean(node);
        return;
    }
    node.producerRecomputeValue(node);
    // After recomputing the value, we're no longer dirty.
    producerMarkClean(node);
}
/**
 * Propagate a dirty notification to live consumers of this producer.
 */
function producerNotifyConsumers(node) {
    if (node.liveConsumerNode === undefined) {
        return;
    }
    // Prevent signal reads when we're updating the graph
    const prev = inNotificationPhase;
    inNotificationPhase = true;
    try {
        for (const consumer of node.liveConsumerNode) {
            if (!consumer.dirty) {
                consumerMarkDirty(consumer);
            }
        }
    }
    finally {
        inNotificationPhase = prev;
    }
}
/**
 * Whether this `ReactiveNode` in its producer capacity is currently allowed to initiate updates,
 * based on the current consumer context.
 */
function producerUpdatesAllowed() {
    return activeConsumer?.consumerAllowSignalWrites !== false;
}
function consumerMarkDirty(node) {
    node.dirty = true;
    producerNotifyConsumers(node);
    node.consumerMarkedDirty?.(node);
}
function producerMarkClean(node) {
    node.dirty = false;
    node.lastCleanEpoch = epoch;
}
/**
 * Prepare this consumer to run a computation in its reactive context.
 *
 * Must be called by subclasses which represent reactive computations, before those computations
 * begin.
 */
function consumerBeforeComputation(node) {
    node && (node.nextProducerIndex = 0);
    return setActiveConsumer(node);
}
/**
 * Finalize this consumer's state after a reactive computation has run.
 *
 * Must be called by subclasses which represent reactive computations, after those computations
 * have finished.
 */
function consumerAfterComputation(node, prevConsumer) {
    setActiveConsumer(prevConsumer);
    if (!node ||
        node.producerNode === undefined ||
        node.producerIndexOfThis === undefined ||
        node.producerLastReadVersion === undefined) {
        return;
    }
    if (consumerIsLive(node)) {
        // For live consumers, we need to remove the producer -> consumer edge for any stale producers
        // which weren't dependencies after the recomputation.
        for (let i = node.nextProducerIndex; i < node.producerNode.length; i++) {
            producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
        }
    }
    // Truncate the producer tracking arrays.
    // Perf note: this is essentially truncating the length to `node.nextProducerIndex`, but
    // benchmarking has shown that individual pop operations are faster.
    while (node.producerNode.length > node.nextProducerIndex) {
        node.producerNode.pop();
        node.producerLastReadVersion.pop();
        node.producerIndexOfThis.pop();
    }
}
/**
 * Determine whether this consumer has any dependencies which have changed since the last time
 * they were read.
 */
function consumerPollProducersForChange(node) {
    assertConsumerNode(node);
    // Poll producers for change.
    for (let i = 0; i < node.producerNode.length; i++) {
        const producer = node.producerNode[i];
        const seenVersion = node.producerLastReadVersion[i];
        // First check the versions. A mismatch means that the producer's value is known to have
        // changed since the last time we read it.
        if (seenVersion !== producer.version) {
            return true;
        }
        // The producer's version is the same as the last time we read it, but it might itself be
        // stale. Force the producer to recompute its version (calculating a new value if necessary).
        producerUpdateValueVersion(producer);
        // Now when we do this check, `producer.version` is guaranteed to be up to date, so if the
        // versions still match then it has not changed since the last time we read it.
        if (seenVersion !== producer.version) {
            return true;
        }
    }
    return false;
}
/**
 * Disconnect this consumer from the graph.
 */
function consumerDestroy(node) {
    assertConsumerNode(node);
    if (consumerIsLive(node)) {
        // Drop all connections from the graph to this node.
        for (let i = 0; i < node.producerNode.length; i++) {
            producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
        }
    }
    // Truncate all the arrays to drop all connection from this node to the graph.
    node.producerNode.length =
        node.producerLastReadVersion.length =
            node.producerIndexOfThis.length =
                0;
    if (node.liveConsumerNode) {
        node.liveConsumerNode.length = node.liveConsumerIndexOfThis.length = 0;
    }
}
/**
 * Add `consumer` as a live consumer of this node.
 *
 * Note that this operation is potentially transitive. If this node becomes live, then it becomes
 * a live consumer of all of its current producers.
 */
function producerAddLiveConsumer(node, consumer, indexOfThis) {
    assertProducerNode(node);
    if (node.liveConsumerNode.length === 0 && isConsumerNode(node)) {
        // When going from 0 to 1 live consumers, we become a live consumer to our producers.
        for (let i = 0; i < node.producerNode.length; i++) {
            node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i);
        }
    }
    node.liveConsumerIndexOfThis.push(indexOfThis);
    return node.liveConsumerNode.push(consumer) - 1;
}
/**
 * Remove the live consumer at `idx`.
 */
function producerRemoveLiveConsumerAtIndex(node, idx) {
    assertProducerNode(node);
    if (typeof ngDevMode !== 'undefined' && ngDevMode && idx >= node.liveConsumerNode.length) {
        throw new Error(`Assertion error: active consumer index ${idx} is out of bounds of ${node.liveConsumerNode.length} consumers)`);
    }
    if (node.liveConsumerNode.length === 1 && isConsumerNode(node)) {
        // When removing the last live consumer, we will no longer be live. We need to remove
        // ourselves from our producers' tracking (which may cause consumer-producers to lose
        // liveness as well).
        for (let i = 0; i < node.producerNode.length; i++) {
            producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
        }
    }
    // Move the last value of `liveConsumers` into `idx`. Note that if there's only a single
    // live consumer, this is a no-op.
    const lastIdx = node.liveConsumerNode.length - 1;
    node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx];
    node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx];
    // Truncate the array.
    node.liveConsumerNode.length--;
    node.liveConsumerIndexOfThis.length--;
    // If the index is still valid, then we need to fix the index pointer from the producer to this
    // consumer, and update it from `lastIdx` to `idx` (accounting for the move above).
    if (idx < node.liveConsumerNode.length) {
        const idxProducer = node.liveConsumerIndexOfThis[idx];
        const consumer = node.liveConsumerNode[idx];
        assertConsumerNode(consumer);
        consumer.producerIndexOfThis[idxProducer] = idx;
    }
}
function consumerIsLive(node) {
    return node.consumerIsAlwaysLive || (node?.liveConsumerNode?.length ?? 0) > 0;
}
function assertConsumerNode(node) {
    node.producerNode ??= [];
    node.producerIndexOfThis ??= [];
    node.producerLastReadVersion ??= [];
}
function assertProducerNode(node) {
    node.liveConsumerNode ??= [];
    node.liveConsumerIndexOfThis ??= [];
}
function isConsumerNode(node) {
    return node.producerNode !== undefined;
}

/**
 * Create a computed signal which derives a reactive value from an expression.
 */
function createComputed(computation, equal) {
    const node = Object.create(COMPUTED_NODE);
    node.computation = computation;
    if (equal !== undefined) {
        node.equal = equal;
    }
    const computed = () => {
        // Check if the value needs updating before returning it.
        producerUpdateValueVersion(node);
        // Record that someone looked at this signal.
        producerAccessed(node);
        if (node.value === ERRORED) {
            throw node.error;
        }
        return node.value;
    };
    computed[SIGNAL] = node;
    return computed;
}
/**
 * A dedicated symbol used before a computed value has been calculated for the first time.
 * Explicitly typed as `any` so we can use it as signal's value.
 */
const UNSET = /* @__PURE__ */ Symbol('UNSET');
/**
 * A dedicated symbol used in place of a computed signal value to indicate that a given computation
 * is in progress. Used to detect cycles in computation chains.
 * Explicitly typed as `any` so we can use it as signal's value.
 */
const COMPUTING = /* @__PURE__ */ Symbol('COMPUTING');
/**
 * A dedicated symbol used in place of a computed signal value to indicate that a given computation
 * failed. The thrown error is cached until the computation gets dirty again.
 * Explicitly typed as `any` so we can use it as signal's value.
 */
const ERRORED = /* @__PURE__ */ Symbol('ERRORED');
// Note: Using an IIFE here to ensure that the spread assignment is not considered
// a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
const COMPUTED_NODE = /* @__PURE__ */ (() => {
    return {
        ...REACTIVE_NODE,
        value: UNSET,
        dirty: true,
        error: null,
        equal: defaultEquals,
        kind: 'computed',
        producerMustRecompute(node) {
            // Force a recomputation if there's no current value, or if the current value is in the
            // process of being calculated (which should throw an error).
            return node.value === UNSET || node.value === COMPUTING;
        },
        producerRecomputeValue(node) {
            if (node.value === COMPUTING) {
                // Our computation somehow led to a cyclic read of itself.
                throw new Error('Detected cycle in computations.');
            }
            const oldValue = node.value;
            node.value = COMPUTING;
            const prevConsumer = consumerBeforeComputation(node);
            let newValue;
            let wasEqual = false;
            try {
                newValue = node.computation();
                // We want to mark this node as errored if calling `equal` throws; however, we don't want
                // to track any reactive reads inside `equal`.
                setActiveConsumer(null);
                wasEqual =
                    oldValue !== UNSET &&
                        oldValue !== ERRORED &&
                        newValue !== ERRORED &&
                        node.equal(oldValue, newValue);
            }
            catch (err) {
                newValue = ERRORED;
                node.error = err;
            }
            finally {
                consumerAfterComputation(node, prevConsumer);
            }
            if (wasEqual) {
                // No change to `valueVersion` - old and new values are
                // semantically equivalent.
                node.value = oldValue;
                return;
            }
            node.value = newValue;
            node.version++;
        },
    };
})();

function defaultThrowError() {
    throw new Error();
}
let throwInvalidWriteToSignalErrorFn = defaultThrowError;
function throwInvalidWriteToSignalError(node) {
    throwInvalidWriteToSignalErrorFn(node);
}
function setThrowInvalidWriteToSignalError(fn) {
    throwInvalidWriteToSignalErrorFn = fn;
}

/**
 * If set, called after `WritableSignal`s are updated.
 *
 * This hook can be used to achieve various effects, such as running effects synchronously as part
 * of setting a signal.
 */
let postSignalSetFn = null;
/**
 * Create a `Signal` that can be set or updated directly.
 */
function createSignal(initialValue, equal) {
    const node = Object.create(SIGNAL_NODE);
    node.value = initialValue;
    if (equal !== undefined) {
        node.equal = equal;
    }
    const getter = (() => {
        producerAccessed(node);
        return node.value;
    });
    getter[SIGNAL] = node;
    return getter;
}
function setPostSignalSetFn(fn) {
    const prev = postSignalSetFn;
    postSignalSetFn = fn;
    return prev;
}
function signalSetFn(node, newValue) {
    if (!producerUpdatesAllowed()) {
        throwInvalidWriteToSignalError(node);
    }
    if (!node.equal(node.value, newValue)) {
        node.value = newValue;
        signalValueChanged(node);
    }
}
function signalUpdateFn(node, updater) {
    if (!producerUpdatesAllowed()) {
        throwInvalidWriteToSignalError(node);
    }
    signalSetFn(node, updater(node.value));
}
function runPostSignalSetFn() {
    postSignalSetFn?.();
}
// Note: Using an IIFE here to ensure that the spread assignment is not considered
// a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
const SIGNAL_NODE = /* @__PURE__ */ (() => {
    return {
        ...REACTIVE_NODE,
        equal: defaultEquals,
        value: undefined,
        kind: 'signal',
    };
})();
function signalValueChanged(node) {
    node.version++;
    producerIncrementEpoch();
    producerNotifyConsumers(node);
    postSignalSetFn?.();
}

function createLinkedSignal(sourceFn, computationFn, equalityFn) {
    const node = Object.create(LINKED_SIGNAL_NODE);
    node.source = sourceFn;
    node.computation = computationFn;
    if (equalityFn != undefined) {
        node.equal = equalityFn;
    }
    const linkedSignalGetter = () => {
        // Check if the value needs updating before returning it.
        producerUpdateValueVersion(node);
        // Record that someone looked at this signal.
        producerAccessed(node);
        if (node.value === ERRORED) {
            throw node.error;
        }
        return node.value;
    };
    const getter = linkedSignalGetter;
    getter[SIGNAL] = node;
    return getter;
}
function linkedSignalSetFn(node, newValue) {
    producerUpdateValueVersion(node);
    signalSetFn(node, newValue);
    producerMarkClean(node);
}
function linkedSignalUpdateFn(node, updater) {
    producerUpdateValueVersion(node);
    signalUpdateFn(node, updater);
    producerMarkClean(node);
}
// Note: Using an IIFE here to ensure that the spread assignment is not considered
// a side-effect, ending up preserving `LINKED_SIGNAL_NODE` and `REACTIVE_NODE`.
// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
const LINKED_SIGNAL_NODE = /* @__PURE__ */ (() => {
    return {
        ...REACTIVE_NODE,
        value: UNSET,
        dirty: true,
        error: null,
        equal: defaultEquals,
        kind: 'linkedSignal',
        producerMustRecompute(node) {
            // Force a recomputation if there's no current value, or if the current value is in the
            // process of being calculated (which should throw an error).
            return node.value === UNSET || node.value === COMPUTING;
        },
        producerRecomputeValue(node) {
            if (node.value === COMPUTING) {
                // Our computation somehow led to a cyclic read of itself.
                throw new Error('Detected cycle in computations.');
            }
            const oldValue = node.value;
            node.value = COMPUTING;
            const prevConsumer = consumerBeforeComputation(node);
            let newValue;
            try {
                const newSourceValue = node.source();
                const prev = oldValue === UNSET || oldValue === ERRORED
                    ? undefined
                    : {
                        source: node.sourceValue,
                        value: oldValue,
                    };
                newValue = node.computation(newSourceValue, prev);
                node.sourceValue = newSourceValue;
            }
            catch (err) {
                newValue = ERRORED;
                node.error = err;
            }
            finally {
                consumerAfterComputation(node, prevConsumer);
            }
            if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) {
                // No change to `valueVersion` - old and new values are
                // semantically equivalent.
                node.value = oldValue;
                return;
            }
            node.value = newValue;
            node.version++;
        },
    };
})();

function setAlternateWeakRefImpl(impl) {
    // TODO: remove this function
}

/**
 * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
 * can, optionally, return a value.
 */
function untracked(nonReactiveReadsFn) {
    const prevConsumer = setActiveConsumer(null);
    // We are not trying to catch any particular errors here, just making sure that the consumers
    // stack is restored in case of errors.
    try {
        return nonReactiveReadsFn();
    }
    finally {
        setActiveConsumer(prevConsumer);
    }
}

export { REACTIVE_NODE, SIGNAL, SIGNAL_NODE, consumerAfterComputation, consumerBeforeComputation, consumerDestroy, consumerMarkDirty, consumerPollProducersForChange, createComputed, createLinkedSignal, createSignal, defaultEquals, getActiveConsumer, isInNotificationPhase, isReactive, linkedSignalSetFn, linkedSignalUpdateFn, producerAccessed, producerIncrementEpoch, producerMarkClean, producerNotifyConsumers, producerUpdateValueVersion, producerUpdatesAllowed, runPostSignalSetFn, setActiveConsumer, setAlternateWeakRefImpl, setPostSignalSetFn, setThrowInvalidWriteToSignalError, signalSetFn, signalUpdateFn, untracked };
//# sourceMappingURL=untracked-BKcld_ew.mjs.map
!UOzxG{"version":3,"file":"untracked-BKcld_ew.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/equality.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/graph.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/computed.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/errors.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/signal.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/linked_signal.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/weak_ref.ts","../../../../../darwin_arm64-fastbuild-ST-2d99d9656325/bin/packages/core/primitives/signals/src/untracked.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * A comparison function which can determine if two values are equal.\n */\nexport type ValueEqualityFn<T> = (a: T, b: T) => boolean;\n\n/**\n * The default equality function used for `signal` and `computed`, which uses referential equality.\n */\nexport function defaultEquals<T>(a: T, b: T) {\n  return Object.is(a, b);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n// Required as the signals library is in a separate package, so we need to explicitly ensure the\n// global `ngDevMode` type is defined.\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * The currently active consumer `ReactiveNode`, if running code in a reactive context.\n *\n * Change this via `setActiveConsumer`.\n */\nlet activeConsumer: ReactiveNode | null = null;\nlet inNotificationPhase = false;\n\ntype Version = number & {__brand: 'Version'};\n\n/**\n * Global epoch counter. Incremented whenever a source signal is set.\n */\nlet epoch: Version = 1 as Version;\n\n/**\n * Symbol used to tell `Signal`s apart from other functions.\n *\n * This can be used to auto-unwrap signals in various cases, or to auto-wrap non-signal values.\n */\nexport const SIGNAL: unique symbol = /* @__PURE__ */ Symbol('SIGNAL');\n\nexport function setActiveConsumer(consumer: ReactiveNode | null): ReactiveNode | null {\n  const prev = activeConsumer;\n  activeConsumer = consumer;\n  return prev;\n}\n\nexport function getActiveConsumer(): ReactiveNode | null {\n  return activeConsumer;\n}\n\nexport function isInNotificationPhase(): boolean {\n  return inNotificationPhase;\n}\n\nexport interface Reactive {\n  [SIGNAL]: ReactiveNode;\n}\n\nexport function isReactive(value: unknown): value is Reactive {\n  return (value as Partial<Reactive>)[SIGNAL] !== undefined;\n}\n\nexport const REACTIVE_NODE: ReactiveNode = {\n  version: 0 as Version,\n  lastCleanEpoch: 0 as Version,\n  dirty: false,\n  producerNode: undefined,\n  producerLastReadVersion: undefined,\n  producerIndexOfThis: undefined,\n  nextProducerIndex: 0,\n  liveConsumerNode: undefined,\n  liveConsumerIndexOfThis: undefined,\n  consumerAllowSignalWrites: false,\n  consumerIsAlwaysLive: false,\n  kind: 'unknown',\n  producerMustRecompute: () => false,\n  producerRecomputeValue: () => {},\n  consumerMarkedDirty: () => {},\n  consumerOnSignalRead: () => {},\n};\n\n/**\n * A producer and/or consumer which participates in the reactive graph.\n *\n * Producer `ReactiveNode`s which are accessed when a consumer `ReactiveNode` is the\n * `activeConsumer` are tracked as dependencies of that consumer.\n *\n * Certain consumers are also tracked as \"live\" consumers and create edges in the other direction,\n * from producer to consumer. These edges are used to propagate change notifications when a\n * producer's value is updated.\n *\n * A `ReactiveNode` may be both a producer and consumer.\n */\nexport interface ReactiveNode {\n  /**\n   * Version of the value that this node produces.\n   *\n   * This is incremented whenever a new value is produced by this node which is not equal to the\n   * previous value (by whatever definition of equality is in use).\n   */\n  version: Version;\n\n  /**\n   * Epoch at which this node is verified to be clean.\n   *\n   * This allows skipping of some polling operations in the case where no signals have been set\n   * since this node was last read.\n   */\n  lastCleanEpoch: Version;\n\n  /**\n   * Whether this node (in its consumer capacity) is dirty.\n   *\n   * Only live consumers become dirty, when receiving a change notification from a dependency\n   * producer.\n   */\n  dirty: boolean;\n\n  /**\n   * Producers which are dependencies of this consumer.\n   *\n   * Uses the same indices as the `producerLastReadVersion` and `producerIndexOfThis` arrays.\n   */\n  producerNode: ReactiveNode[] | undefined;\n\n  /**\n   * `Version` of the value last read by a given producer.\n   *\n   * Uses the same indices as the `producerNode` and `producerIndexOfThis` arrays.\n   */\n  producerLastReadVersion: Version[] | undefined;\n\n  /**\n   * Index of `this` (consumer) in each producer's `liveConsumers` array.\n   *\n   * This value is only meaningful if this node is live (`liveConsumers.length > 0`). Otherwise\n   * these indices are stale.\n   *\n   * Uses the same indices as the `producerNode` and `producerLastReadVersion` arrays.\n   */\n  producerIndexOfThis: number[] | undefined;\n\n  /**\n   * Index into the producer arrays that the next dependency of this node as a consumer will use.\n   *\n   * This index is zeroed before this node as a consumer begins executing. When a producer is read,\n   * it gets inserted into the producers arrays at this index. There may be an existing dependency\n   * in this location which may or may not match the incoming producer, depending on whether the\n   * same producers were read in the same order as the last computation.\n   */\n  nextProducerIndex: number;\n\n  /**\n   * Array of consumers of this producer that are \"live\" (they require push notifications).\n   *\n   * `liveConsumerNode.length` is effectively our reference count for this node.\n   */\n  liveConsumerNode: ReactiveNode[] | undefined;\n\n  /**\n   * Index of `this` (producer) in each consumer's `producerNode` array.\n   *\n   * Uses the same indices as the `liveConsumerNode` array.\n   */\n  liveConsumerIndexOfThis: number[] | undefined;\n\n  /**\n   * Whether writes to signals are allowed when this consumer is the `activeConsumer`.\n   *\n   * This is used to enforce guardrails such as preventing writes to writable signals in the\n   * computation function of computed signals, which is supposed to be pure.\n   */\n  consumerAllowSignalWrites: boolean;\n\n  readonly consumerIsAlwaysLive: boolean;\n\n  /**\n   * Tracks whether producers need to recompute their value independently of the reactive graph (for\n   * example, if no initial value has been computed).\n   */\n  producerMustRecompute(node: unknown): boolean;\n  producerRecomputeValue(node: unknown): void;\n  consumerMarkedDirty(node: unknown): void;\n\n  /**\n   * Called when a signal is read within this consumer.\n   */\n  consumerOnSignalRead(node: unknown): void;\n\n  /**\n   * A debug name for the reactive node. Used in Angular DevTools to identify the node.\n   */\n  debugName?: string;\n\n  /**\n   * Kind of node. Example: 'signal', 'computed', 'input', 'effect'.\n   *\n   * ReactiveNode has this as 'unknown' by default, but derived node types should override this to\n   * make available the kind of signal that particular instance of a ReactiveNode represents.\n   *\n   * Used in Angular DevTools to identify the kind of signal.\n   */\n  kind: string;\n}\n\ninterface ConsumerNode extends ReactiveNode {\n  producerNode: NonNullable<ReactiveNode['producerNode']>;\n  producerIndexOfThis: NonNullable<ReactiveNode['producerIndexOfThis']>;\n  producerLastReadVersion: NonNullable<ReactiveNode['producerLastReadVersion']>;\n}\n\ninterface ProducerNode extends ReactiveNode {\n  liveConsumerNode: NonNullable<ReactiveNode['liveConsumerNode']>;\n  liveConsumerIndexOfThis: NonNullable<ReactiveNode['liveConsumerIndexOfThis']>;\n}\n\n/**\n * Called by implementations when a producer's signal is read.\n */\nexport function producerAccessed(node: ReactiveNode): void {\n  if (inNotificationPhase) {\n    throw new Error(\n      typeof ngDevMode !== 'undefined' && ngDevMode\n        ? `Assertion error: signal read during notification phase`\n        : '',\n    );\n  }\n\n  if (activeConsumer === null) {\n    // Accessed outside of a reactive context, so nothing to record.\n    return;\n  }\n\n  activeConsumer.consumerOnSignalRead(node);\n\n  // This producer is the `idx`th dependency of `activeConsumer`.\n  const idx = activeConsumer.nextProducerIndex++;\n\n  assertConsumerNode(activeConsumer);\n\n  if (idx < activeConsumer.producerNode.length && activeConsumer.producerNode[idx] !== node) {\n    // There's been a change in producers since the last execution of `activeConsumer`.\n    // `activeConsumer.producerNode[idx]` holds a stale dependency which will be be removed and\n    // replaced with `this`.\n    //\n    // If `activeConsumer` isn't live, then this is a no-op, since we can replace the producer in\n    // `activeConsumer.producerNode` directly. However, if `activeConsumer` is live, then we need\n    // to remove it from the stale producer's `liveConsumer`s.\n    if (consumerIsLive(activeConsumer)) {\n      const staleProducer = activeConsumer.producerNode[idx];\n      producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx]);\n\n      // At this point, the only record of `staleProducer` is the reference at\n      // `activeConsumer.producerNode[idx]` which will be overwritten below.\n    }\n  }\n\n  if (activeConsumer.producerNode[idx] !== node) {\n    // We're a new dependency of the consumer (at `idx`).\n    activeConsumer.producerNode[idx] = node;\n\n    // If the active consumer is live, then add it as a live consumer. If not, then use 0 as a\n    // placeholder value.\n    activeConsumer.producerIndexOfThis[idx] = consumerIsLive(activeConsumer)\n      ? producerAddLiveConsumer(node, activeConsumer, idx)\n      : 0;\n  }\n  activeConsumer.producerLastReadVersion[idx] = node.version;\n}\n\n/**\n * Increment the global epoch counter.\n *\n * Called by source producers (that is, not computeds) whenever their values change.\n */\nexport function producerIncrementEpoch(): void {\n  epoch++;\n}\n\n/**\n * Ensure this producer's `version` is up-to-date.\n */\nexport function producerUpdateValueVersion(node: ReactiveNode): void {\n  if (consumerIsLive(node) && !node.dirty) {\n    // A live consumer will be marked dirty by producers, so a clean state means that its version\n    // is guaranteed to be up-to-date.\n    return;\n  }\n\n  if (!node.dirty && node.lastCleanEpoch === epoch) {\n    // Even non-live consumers can skip polling if they previously found themselves to be clean at\n    // the current epoch, since their dependencies could not possibly have changed (such a change\n    // would've increased the epoch).\n    return;\n  }\n\n  if (!node.producerMustRecompute(node) && !consumerPollProducersForChange(node)) {\n    // None of our producers report a change since the last time they were read, so no\n    // recomputation of our value is necessary, and we can consider ourselves clean.\n    producerMarkClean(node);\n    return;\n  }\n\n  node.producerRecomputeValue(node);\n\n  // After recomputing the value, we're no longer dirty.\n  producerMarkClean(node);\n}\n\n/**\n * Propagate a dirty notification to live consumers of this producer.\n */\nexport function producerNotifyConsumers(node: ReactiveNode): void {\n  if (node.liveConsumerNode === undefined) {\n    return;\n  }\n\n  // Prevent signal reads when we're updating the graph\n  const prev = inNotificationPhase;\n  inNotificationPhase = true;\n  try {\n    for (const consumer of node.liveConsumerNode) {\n      if (!consumer.dirty) {\n        consumerMarkDirty(consumer);\n      }\n    }\n  } finally {\n    inNotificationPhase = prev;\n  }\n}\n\n/**\n * Whether this `ReactiveNode` in its producer capacity is currently allowed to initiate updates,\n * based on the current consumer context.\n */\nexport function producerUpdatesAllowed(): boolean {\n  return activeConsumer?.consumerAllowSignalWrites !== false;\n}\n\nexport function consumerMarkDirty(node: ReactiveNode): void {\n  node.dirty = true;\n  producerNotifyConsumers(node);\n  node.consumerMarkedDirty?.(node);\n}\n\nexport function producerMarkClean(node: ReactiveNode): void {\n  node.dirty = false;\n  node.lastCleanEpoch = epoch;\n}\n\n/**\n * Prepare this consumer to run a computation in its reactive context.\n *\n * Must be called by subclasses which represent reactive computations, before those computations\n * begin.\n */\nexport function consumerBeforeComputation(node: ReactiveNode | null): ReactiveNode | null {\n  node && (node.nextProducerIndex = 0);\n  return setActiveConsumer(node);\n}\n\n/**\n * Finalize this consumer's state after a reactive computation has run.\n *\n * Must be called by subclasses which represent reactive computations, after those computations\n * have finished.\n */\nexport function consumerAfterComputation(\n  node: ReactiveNode | null,\n  prevConsumer: ReactiveNode | null,\n): void {\n  setActiveConsumer(prevConsumer);\n\n  if (\n    !node ||\n    node.producerNode === undefined ||\n    node.producerIndexOfThis === undefined ||\n    node.producerLastReadVersion === undefined\n  ) {\n    return;\n  }\n\n  if (consumerIsLive(node)) {\n    // For live consumers, we need to remove the producer -> consumer edge for any stale producers\n    // which weren't dependencies after the recomputation.\n    for (let i = node.nextProducerIndex; i < node.producerNode.length; i++) {\n      producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n    }\n  }\n\n  // Truncate the producer tracking arrays.\n  // Perf note: this is essentially truncating the length to `node.nextProducerIndex`, but\n  // benchmarking has shown that individual pop operations are faster.\n  while (node.producerNode.length > node.nextProducerIndex) {\n    node.producerNode.pop();\n    node.producerLastReadVersion.pop();\n    node.producerIndexOfThis.pop();\n  }\n}\n\n/**\n * Determine whether this consumer has any dependencies which have changed since the last time\n * they were read.\n */\nexport function consumerPollProducersForChange(node: ReactiveNode): boolean {\n  assertConsumerNode(node);\n\n  // Poll producers for change.\n  for (let i = 0; i < node.producerNode.length; i++) {\n    const producer = node.producerNode[i];\n    const seenVersion = node.producerLastReadVersion[i];\n\n    // First check the versions. A mismatch means that the producer's value is known to have\n    // changed since the last time we read it.\n    if (seenVersion !== producer.version) {\n      return true;\n    }\n\n    // The producer's version is the same as the last time we read it, but it might itself be\n    // stale. Force the producer to recompute its version (calculating a new value if necessary).\n    producerUpdateValueVersion(producer);\n\n    // Now when we do this check, `producer.version` is guaranteed to be up to date, so if the\n    // versions still match then it has not changed since the last time we read it.\n    if (seenVersion !== producer.version) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Disconnect this consumer from the graph.\n */\nexport function consumerDestroy(node: ReactiveNode): void {\n  assertConsumerNode(node);\n  if (consumerIsLive(node)) {\n    // Drop all connections from the graph to this node.\n    for (let i = 0; i < node.producerNode.length; i++) {\n      producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n    }\n  }\n\n  // Truncate all the arrays to drop all connection from this node to the graph.\n  node.producerNode.length =\n    node.producerLastReadVersion.length =\n    node.producerIndexOfThis.length =\n      0;\n  if (node.liveConsumerNode) {\n    node.liveConsumerNode.length = node.liveConsumerIndexOfThis!.length = 0;\n  }\n}\n\n/**\n * Add `consumer` as a live consumer of this node.\n *\n * Note that this operation is potentially transitive. If this node becomes live, then it becomes\n * a live consumer of all of its current producers.\n */\nfunction producerAddLiveConsumer(\n  node: ReactiveNode,\n  consumer: ReactiveNode,\n  indexOfThis: number,\n): number {\n  assertProducerNode(node);\n  if (node.liveConsumerNode.length === 0 && isConsumerNode(node)) {\n    // When going from 0 to 1 live consumers, we become a live consumer to our producers.\n    for (let i = 0; i < node.producerNode.length; i++) {\n      node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i);\n    }\n  }\n  node.liveConsumerIndexOfThis.push(indexOfThis);\n  return node.liveConsumerNode.push(consumer) - 1;\n}\n\n/**\n * Remove the live consumer at `idx`.\n */\nfunction producerRemoveLiveConsumerAtIndex(node: ReactiveNode, idx: number): void {\n  assertProducerNode(node);\n\n  if (typeof ngDevMode !== 'undefined' && ngDevMode && idx >= node.liveConsumerNode.length) {\n    throw new Error(\n      `Assertion error: active consumer index ${idx} is out of bounds of ${node.liveConsumerNode.length} consumers)`,\n    );\n  }\n\n  if (node.liveConsumerNode.length === 1 && isConsumerNode(node)) {\n    // When removing the last live consumer, we will no longer be live. We need to remove\n    // ourselves from our producers' tracking (which may cause consumer-producers to lose\n    // liveness as well).\n    for (let i = 0; i < node.producerNode.length; i++) {\n      producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n    }\n  }\n\n  // Move the last value of `liveConsumers` into `idx`. Note that if there's only a single\n  // live consumer, this is a no-op.\n  const lastIdx = node.liveConsumerNode.length - 1;\n  node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx];\n  node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx];\n\n  // Truncate the array.\n  node.liveConsumerNode.length--;\n  node.liveConsumerIndexOfThis.length--;\n\n  // If the index is still valid, then we need to fix the index pointer from the producer to this\n  // consumer, and update it from `lastIdx` to `idx` (accounting for the move above).\n  if (idx < node.liveConsumerNode.length) {\n    const idxProducer = node.liveConsumerIndexOfThis[idx];\n    const consumer = node.liveConsumerNode[idx];\n    assertConsumerNode(consumer);\n    consumer.producerIndexOfThis[idxProducer] = idx;\n  }\n}\n\nfunction consumerIsLive(node: ReactiveNode): boolean {\n  return node.consumerIsAlwaysLive || (node?.liveConsumerNode?.length ?? 0) > 0;\n}\n\nfunction assertConsumerNode(node: ReactiveNode): asserts node is ConsumerNode {\n  node.producerNode ??= [];\n  node.producerIndexOfThis ??= [];\n  node.producerLastReadVersion ??= [];\n}\n\nfunction assertProducerNode(node: ReactiveNode): asserts node is ProducerNode {\n  node.liveConsumerNode ??= [];\n  node.liveConsumerIndexOfThis ??= [];\n}\n\nfunction isConsumerNode(node: ReactiveNode): node is ConsumerNode {\n  return node.producerNode !== undefined;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {defaultEquals, ValueEqualityFn} from './equality';\nimport {\n  consumerAfterComputation,\n  consumerBeforeComputation,\n  producerAccessed,\n  producerUpdateValueVersion,\n  REACTIVE_NODE,\n  ReactiveNode,\n  setActiveConsumer,\n  SIGNAL,\n} from './graph';\n\n/**\n * A computation, which derives a value from a declarative reactive expression.\n *\n * `Computed`s are both producers and consumers of reactivity.\n */\nexport interface ComputedNode<T> extends ReactiveNode {\n  /**\n   * Current value of the computation, or one of the sentinel values above (`UNSET`, `COMPUTING`,\n   * `ERROR`).\n   */\n  value: T;\n\n  /**\n   * If `value` is `ERRORED`, the error caught from the last computation attempt which will\n   * be re-thrown.\n   */\n  error: unknown;\n\n  /**\n   * The computation function which will produce a new value.\n   */\n  computation: () => T;\n\n  equal: ValueEqualityFn<T>;\n}\n\nexport type ComputedGetter<T> = (() => T) & {\n  [SIGNAL]: ComputedNode<T>;\n};\n\n/**\n * Create a computed signal which derives a reactive value from an expression.\n */\nexport function createComputed<T>(\n  computation: () => T,\n  equal?: ValueEqualityFn<T>,\n): ComputedGetter<T> {\n  const node: ComputedNode<T> = Object.create(COMPUTED_NODE);\n  node.computation = computation;\n\n  if (equal !== undefined) {\n    node.equal = equal;\n  }\n\n  const computed = () => {\n    // Check if the value needs updating before returning it.\n    producerUpdateValueVersion(node);\n\n    // Record that someone looked at this signal.\n    producerAccessed(node);\n\n    if (node.value === ERRORED) {\n      throw node.error;\n    }\n\n    return node.value;\n  };\n  (computed as ComputedGetter<T>)[SIGNAL] = node;\n  return computed as unknown as ComputedGetter<T>;\n}\n\n/**\n * A dedicated symbol used before a computed value has been calculated for the first time.\n * Explicitly typed as `any` so we can use it as signal's value.\n */\nexport const UNSET: any = /* @__PURE__ */ Symbol('UNSET');\n\n/**\n * A dedicated symbol used in place of a computed signal value to indicate that a given computation\n * is in progress. Used to detect cycles in computation chains.\n * Explicitly typed as `any` so we can use it as signal's value.\n */\nexport const COMPUTING: any = /* @__PURE__ */ Symbol('COMPUTING');\n\n/**\n * A dedicated symbol used in place of a computed signal value to indicate that a given computation\n * failed. The thrown error is cached until the computation gets dirty again.\n * Explicitly typed as `any` so we can use it as signal's value.\n */\nexport const ERRORED: any = /* @__PURE__ */ Symbol('ERRORED');\n\n// Note: Using an IIFE here to ensure that the spread assignment is not considered\n// a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.\n// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.\nconst COMPUTED_NODE = /* @__PURE__ */ (() => {\n  return {\n    ...REACTIVE_NODE,\n    value: UNSET,\n    dirty: true,\n    error: null,\n    equal: defaultEquals,\n    kind: 'computed',\n\n    producerMustRecompute(node: ComputedNode<unknown>): boolean {\n      // Force a recomputation if there's no current value, or if the current value is in the\n      // process of being calculated (which should throw an error).\n      return node.value === UNSET || node.value === COMPUTING;\n    },\n\n    producerRecomputeValue(node: ComputedNode<unknown>): void {\n      if (node.value === COMPUTING) {\n        // Our computation somehow led to a cyclic read of itself.\n        throw new Error('Detected cycle in computations.');\n      }\n\n      const oldValue = node.value;\n      node.value = COMPUTING;\n\n      const prevConsumer = consumerBeforeComputation(node);\n      let newValue: unknown;\n      let wasEqual = false;\n      try {\n        newValue = node.computation();\n        // We want to mark this node as errored if calling `equal` throws; however, we don't want\n        // to track any reactive reads inside `equal`.\n        setActiveConsumer(null);\n        wasEqual =\n          oldValue !== UNSET &&\n          oldValue !== ERRORED &&\n          newValue !== ERRORED &&\n          node.equal(oldValue, newValue);\n      } catch (err) {\n        newValue = ERRORED;\n        node.error = err;\n      } finally {\n        consumerAfterComputation(node, prevConsumer);\n      }\n\n      if (wasEqual) {\n        // No change to `valueVersion` - old and new values are\n        // semantically equivalent.\n        node.value = oldValue;\n        return;\n      }\n\n      node.value = newValue;\n      node.version++;\n    },\n  };\n})();\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {SignalNode} from './signal';\n\nfunction defaultThrowError(): never {\n  throw new Error();\n}\n\nlet throwInvalidWriteToSignalErrorFn: <T>(node: SignalNode<T>) => never = defaultThrowError;\n\nexport function throwInvalidWriteToSignalError<T>(node: SignalNode<T>) {\n  throwInvalidWriteToSignalErrorFn(node);\n}\n\nexport function setThrowInvalidWriteToSignalError(fn: <T>(node: SignalNode<T>) => never): void {\n  throwInvalidWriteToSignalErrorFn = fn;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {defaultEquals, ValueEqualityFn} from './equality';\nimport {throwInvalidWriteToSignalError} from './errors';\nimport {\n  producerAccessed,\n  producerIncrementEpoch,\n  producerNotifyConsumers,\n  producerUpdatesAllowed,\n  REACTIVE_NODE,\n  ReactiveNode,\n  SIGNAL,\n} from './graph';\n\n// Required as the signals library is in a separate package, so we need to explicitly ensure the\n// global `ngDevMode` type is defined.\ndeclare const ngDevMode: boolean | undefined;\n\n/**\n * If set, called after `WritableSignal`s are updated.\n *\n * This hook can be used to achieve various effects, such as running effects synchronously as part\n * of setting a signal.\n */\nlet postSignalSetFn: (() => void) | null = null;\n\nexport interface SignalNode<T> extends ReactiveNode {\n  value: T;\n  equal: ValueEqualityFn<T>;\n}\n\nexport type SignalBaseGetter<T> = (() => T) & {readonly [SIGNAL]: unknown};\n\n// Note: Closure *requires* this to be an `interface` and not a type, which is why the\n// `SignalBaseGetter` type exists to provide the correct shape.\nexport interface SignalGetter<T> extends SignalBaseGetter<T> {\n  readonly [SIGNAL]: SignalNode<T>;\n}\n\n/**\n * Create a `Signal` that can be set or updated directly.\n */\nexport function createSignal<T>(initialValue: T, equal?: ValueEqualityFn<T>): SignalGetter<T> {\n  const node: SignalNode<T> = Object.create(SIGNAL_NODE);\n  node.value = initialValue;\n  if (equal !== undefined) {\n    node.equal = equal;\n  }\n  const getter = (() => {\n    producerAccessed(node);\n    return node.value;\n  }) as SignalGetter<T>;\n  (getter as any)[SIGNAL] = node;\n  return getter;\n}\n\nexport function setPostSignalSetFn(fn: (() => void) | null): (() => void) | null {\n  const prev = postSignalSetFn;\n  postSignalSetFn = fn;\n  return prev;\n}\n\nexport function signalGetFn<T>(this: SignalNode<T>): T {\n  producerAccessed(this);\n  return this.value;\n}\n\nexport function signalSetFn<T>(node: SignalNode<T>, newValue: T) {\n  if (!producerUpdatesAllowed()) {\n    throwInvalidWriteToSignalError(node);\n  }\n\n  if (!node.equal(node.value, newValue)) {\n    node.value = newValue;\n    signalValueChanged(node);\n  }\n}\n\nexport function signalUpdateFn<T>(node: SignalNode<T>, updater: (value: T) => T): void {\n  if (!producerUpdatesAllowed()) {\n    throwInvalidWriteToSignalError(node);\n  }\n\n  signalSetFn(node, updater(node.value));\n}\n\nexport function runPostSignalSetFn(): void {\n  postSignalSetFn?.();\n}\n\n// Note: Using an IIFE here to ensure that the spread assignment is not considered\n// a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.\n// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.\nexport const SIGNAL_NODE: SignalNode<unknown> = /* @__PURE__ */ (() => {\n  return {\n    ...REACTIVE_NODE,\n    equal: defaultEquals,\n    value: undefined,\n    kind: 'signal',\n  };\n})();\n\nfunction signalValueChanged<T>(node: SignalNode<T>): void {\n  node.version++;\n  producerIncrementEpoch();\n  producerNotifyConsumers(node);\n  postSignalSetFn?.();\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {COMPUTING, ERRORED, UNSET} from './computed';\nimport {defaultEquals, ValueEqualityFn} from './equality';\nimport {\n  consumerAfterComputation,\n  consumerBeforeComputation,\n  producerAccessed,\n  producerMarkClean,\n  producerUpdateValueVersion,\n  REACTIVE_NODE,\n  ReactiveNode,\n  SIGNAL,\n} from './graph';\nimport {signalSetFn, signalUpdateFn} from './signal';\n\nexport type ComputationFn<S, D> = (source: S, previous?: {source: S; value: D}) => D;\n\nexport interface LinkedSignalNode<S, D> extends ReactiveNode {\n  /**\n   * Value of the source signal that was used to derive the computed value.\n   */\n  sourceValue: S;\n\n  /**\n   * Current state value, or one of the sentinel values (`UNSET`, `COMPUTING`,\n   * `ERROR`).\n   */\n  value: D;\n\n  /**\n   * If `value` is `ERRORED`, the error caught from the last computation attempt which will\n   * be re-thrown.\n   */\n  error: unknown;\n\n  /**\n   * The source function represents reactive dependency based on which the linked state is reset.\n   */\n  source: () => S;\n\n  /**\n   * The computation function which will produce a new value based on the source and, optionally - previous values.\n   */\n  computation: ComputationFn<S, D>;\n\n  equal: ValueEqualityFn<D>;\n}\n\nexport type LinkedSignalGetter<S, D> = (() => D) & {\n  [SIGNAL]: LinkedSignalNode<S, D>;\n};\n\nexport function createLinkedSignal<S, D>(\n  sourceFn: () => S,\n  computationFn: ComputationFn<S, D>,\n  equalityFn?: ValueEqualityFn<D>,\n): LinkedSignalGetter<S, D> {\n  const node: LinkedSignalNode<S, D> = Object.create(LINKED_SIGNAL_NODE);\n\n  node.source = sourceFn;\n  node.computation = computationFn;\n  if (equalityFn != undefined) {\n    node.equal = equalityFn;\n  }\n\n  const linkedSignalGetter = () => {\n    // Check if the value needs updating before returning it.\n    producerUpdateValueVersion(node);\n\n    // Record that someone looked at this signal.\n    producerAccessed(node);\n\n    if (node.value === ERRORED) {\n      throw node.error;\n    }\n\n    return node.value;\n  };\n\n  const getter = linkedSignalGetter as LinkedSignalGetter<S, D>;\n  getter[SIGNAL] = node;\n\n  return getter;\n}\n\nexport function linkedSignalSetFn<S, D>(node: LinkedSignalNode<S, D>, newValue: D) {\n  producerUpdateValueVersion(node);\n  signalSetFn(node, newValue);\n  producerMarkClean(node);\n}\n\nexport function linkedSignalUpdateFn<S, D>(\n  node: LinkedSignalNode<S, D>,\n  updater: (value: D) => D,\n): void {\n  producerUpdateValueVersion(node);\n  signalUpdateFn(node, updater);\n  producerMarkClean(node);\n}\n\n// Note: Using an IIFE here to ensure that the spread assignment is not considered\n// a side-effect, ending up preserving `LINKED_SIGNAL_NODE` and `REACTIVE_NODE`.\n// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.\nexport const LINKED_SIGNAL_NODE: object = /* @__PURE__ */ (() => {\n  return {\n    ...REACTIVE_NODE,\n    value: UNSET,\n    dirty: true,\n    error: null,\n    equal: defaultEquals,\n    kind: 'linkedSignal',\n\n    producerMustRecompute(node: LinkedSignalNode<unknown, unknown>): boolean {\n      // Force a recomputation if there's no current value, or if the current value is in the\n      // process of being calculated (which should throw an error).\n      return node.value === UNSET || node.value === COMPUTING;\n    },\n\n    producerRecomputeValue(node: LinkedSignalNode<unknown, unknown>): void {\n      if (node.value === COMPUTING) {\n        // Our computation somehow led to a cyclic read of itself.\n        throw new Error('Detected cycle in computations.');\n      }\n\n      const oldValue = node.value;\n      node.value = COMPUTING;\n\n      const prevConsumer = consumerBeforeComputation(node);\n      let newValue: unknown;\n      try {\n        const newSourceValue = node.source();\n        const prev =\n          oldValue === UNSET || oldValue === ERRORED\n            ? undefined\n            : {\n                source: node.sourceValue,\n                value: oldValue,\n              };\n        newValue = node.computation(newSourceValue, prev);\n        node.sourceValue = newSourceValue;\n      } catch (err) {\n        newValue = ERRORED;\n        node.error = err;\n      } finally {\n        consumerAfterComputation(node, prevConsumer);\n      }\n\n      if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) {\n        // No change to `valueVersion` - old and new values are\n        // semantically equivalent.\n        node.value = oldValue;\n        return;\n      }\n\n      node.value = newValue;\n      node.version++;\n    },\n  };\n})();\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nexport function setAlternateWeakRefImpl(impl: unknown) {\n  // TODO: remove this function\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from './graph';\n\n/**\n * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function\n * can, optionally, return a value.\n */\nexport function untracked<T>(nonReactiveReadsFn: () => T): T {\n  const prevConsumer = setActiveConsumer(null);\n  // We are not trying to catch any particular errors here, just making sure that the consumers\n  // stack is restored in case of errors.\n  try {\n    return nonReactiveReadsFn();\n  } finally {\n    setActiveConsumer(prevConsumer);\n  }\n}\n"],"names":[],"mappings":"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"}Dx   /**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { SIGNAL, SignalNode, ReactiveNode, ValueEqualityFn as ValueEqualityFn$1 } from './weak_ref.d-DWHPG08n.js';
export { setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl } from './weak_ref.d-DWHPG08n.js';
import { EventContract } from './event_dispatcher.d-K56StcHr.js';
import { Observable, Subject, Subscription, BehaviorSubject, Subscribable } from 'rxjs';
import { Injector as Injector$1, InjectionToken as InjectionToken$1, NotFound } from '@angular/core/primitives/di';
import * as _angular_core from '@angular/core';
export { NavigateEvent as ɵNavigateEvent, Navigation as ɵNavigation, NavigationCurrentEntryChangeEvent as ɵNavigationCurrentEntryChangeEvent, NavigationDestination as ɵNavigationDestination, NavigationHistoryEntry as ɵNavigationHistoryEntry, NavigationInterceptOptions as ɵNavigationInterceptOptions, NavigationNavigateOptions as ɵNavigationNavigateOptions, NavigationOptions as ɵNavigationOptions, NavigationReloadOptions as ɵNavigationReloadOptions, NavigationResult as ɵNavigationResult, NavigationTransition as ɵNavigationTransition, NavigationTypeString as ɵNavigationTypeString, NavigationUpdateCurrentEntryOptions as ɵNavigationUpdateCurrentEntryOptions } from './navigation_types.d-fAxd92YV.js';
export { setCurrentInjector as ɵsetCurrentInjector } from './primitives/di/index.js';

/**
 * A reactive value which notifies consumers of any changes.
 *
 * Signals are functions which returns their current value. To access the current value of a signal,
 * call it.
 *
 * Ordinary values can be turned into `Signal`s with the `signal` function.
 */
type Signal<T> = (() => T) & {
    [SIGNAL]: unknown;
};
/**
 * Checks if the given `value` is a reactive `Signal`.
 */
declare function isSignal(value: unknown): value is Signal<unknown>;
/**
 * A comparison function which can determine if two values are equal.
 */
type ValueEqualityFn<T> = (a: T, b: T) => boolean;

/**
 * Reactive node type for an input signal. An input signal extends a signal.
 * There are special properties to enable transforms and required inputs.
 */
interface InputSignalNode<T, TransformT> extends SignalNode<T> {
    /**
     * User-configured transform that will run whenever a new value is applied
     * to the input signal node.
     */
    transformFn: ((value: TransformT) => T) | undefined;
    /**
     * Applies a new value to the input signal. Expects transforms to be run
     * manually before.
     *
     * This function is called by the framework runtime code whenever a binding
     * changes. The value can in practice be anything at runtime, but for typing
     * purposes we assume it's a valid `T` value. Type-checking will enforce that.
     */
    applyValueToInputSignal<T, TransformT>(node: InputSignalNode<T, TransformT>, value: T): void;
    /**
     * A debug name for the input signal. Used in Angular DevTools to identify the signal.
     */
    debugName?: string;
}

/**
 * @publicAPI
 *
 * Options for signal inputs.
 */
interface InputOptions<T, TransformT> {
    /** Optional public name for the input. By default, the class field name is used. */
    alias?: string;
    /**
     * Optional transform that runs whenever a new value is bound. Can be used to
     * transform the input value before the input is updated.
     *
     * The transform function can widen the type of the input. For example, consider
     * an input for `disabled`. In practice, as the component author, you want to only
     * deal with a boolean, but users may want to bind a string if they just use the
     * attribute form to bind to the input via `<my-dir input>`. A transform can then
     * handle such string values and convert them to `boolean`. See: {@link booleanAttribute}.
     */
    transform?: (v: TransformT) => T;
    /**
     * A debug name for the input signal. Used in Angular DevTools to identify the signal.
     */
    debugName?: string;
}
/**
 * Signal input options without the transform option.
 *
 * @publicAPI
 */
type InputOptionsWithoutTransform<T> = Omit<InputOptions<T, T>, 'transform'> & {
    transform?: undefined;
};
/**
 * Signal input options with the transform option required.
 *
 * @publicAPI
 */
type InputOptionsWithTransform<T, TransformT> = Required<Pick<InputOptions<T, TransformT>, 'transform'>> & InputOptions<T, TransformT>;
declare const ɵINPUT_SIGNAL_BRAND_READ_TYPE: unique symbol;
declare const ɵINPUT_SIGNAL_BRAND_WRITE_TYPE: unique symbol;
/**
 * `InputSignalWithTransform` represents a special `Signal` for a
 * directive/component input with a `transform` function.
 *
 * Signal inputs with transforms capture an extra generic for their transform write
 * type. Transforms can expand the accepted bound values for an input while ensuring
 * value retrievals of the signal input are still matching the generic input type.
 *
 * ```ts
 * class MyDir {
 *   disabled = input(false, {
 *     transform: (v: string|boolean) => convertToBoolean(v),
 *   }); // InputSignalWithTransform<boolean, string|boolean>
 *
 *   click() {
 *     this.disabled() // always returns a `boolean`.
 *   }
 * }
 * ```
 *
 * @see {@link InputSignal} for additional information.
 *
 * @publicAPI
 */
interface InputSignalWithTransform<T, TransformT> extends Signal<T> {
    [SIGNAL]: InputSignalNode<T, TransformT>;
    [ɵINPUT_SIGNAL_BRAND_READ_TYPE]: T;
    [ɵINPUT_SIGNAL_BRAND_WRITE_TYPE]: TransformT;
}
/**
 * `InputSignal` represents a special `Signal` for a directive/component input.
 *
 * An input signal is similar to a non-writable signal except that it also
 * carries additional type-information for transforms, and that Angular internally
 * updates the signal whenever a new value is bound.
 *
 * @see {@link InputOptionsWithTransform} for inputs with transforms.
 *
 * @publicAPI
 */
interface InputSignal<T> extends InputSignalWithTransform<T, T> {
}

/**
 * The `input` function allows declaration of inputs in directives and
 * components.
 *
 * The function exposes an API for also declaring required inputs via the
 * `input.required` function.
 *
 * @publicAPI
 * @docsPrivate Ignored because `input` is the canonical API entry.
 */
interface InputFunction {
    /**
     * Initializes an input of type `T` with an initial value of `undefined`.
     * Angular will implicitly use `undefined` as initial value.
     */
    <T>(): InputSignal<T | undefined>;
    /** Declares an input of type `T` with an explicit initial value. */
    <T>(initialValue: T, opts?: InputOptionsWithoutTransform<T>): InputSignal<T>;
    /** Declares an input of type `T|undefined` without an initial value, but with input options */
    <T>(initialValue: undefined, opts: InputOptionsWithoutTransform<T>): InputSignal<T | undefined>;
    /**
     * Declares an input of type `T` with an initial value and a transform
     * function.
     *
     * The input accepts values of type `TransformT` and the given
     * transform function will transform the value to type `T`.
     */
    <T, TransformT>(initialValue: T, opts: InputOptionsWithTransform<T, TransformT>): InputSignalWithTransform<T, TransformT>;
    /**
     * Declares an input of type `T|undefined` without an initial value and with a transform
     * function.
     *
     * The input accepts values of type `TransformT` and the given
     * transform function will transform the value to type `T|undefined`.
     */ <T, TransformT>(initialValue: undefined, opts: InputOptionsWithTransform<T | undefined, TransformT>): InputSignalWithTransform<T | undefined, TransformT>;
    /**
     * Initializes a required input.
     *
     * Consumers of your directive/component need to bind to this
     * input. If unset, a compile time error will be reported.
     *
     * @publicAPI
     */
    required: {
        /** Declares a required input of type `T`. */
        <T>(opts?: InputOptionsWithoutTransform<T>): InputSignal<T>;
        /**
         * Declares a required input of type `T` with a transform function.
         *
         * The input accepts values of type `TransformT` and the given
         * transform function will transform the value to type `T`.
         */
        <T, TransformT>(opts: InputOptionsWithTransform<T, TransformT>): InputSignalWithTransform<T, TransformT>;
    };
}
/**
 * The `input` function allows declaration of Angular inputs in directives
 * and components.
 *
 * There are two variants of inputs that can be declared:
 *
 *   1. **Optional inputs** with an initial value.
 *   2. **Required inputs** that consumers need to set.
 *
 * By default, the `input` function will declare optional inputs that
 * always have an initial value. Required inputs can be declared
 * using the `input.required()` function.
 *
 * Inputs are signals. The values of an input are exposed as a `Signal`.
 * The signal always holds the latest value of the input that is bound
 * from the parent.
 *
 * @usageNotes
 * To use signal-based inputs, import `input` from `@angular/core`.
 *
 * ```ts
 * import {input} from '@angular/core`;
 * ```
 *
 * Inside your component, introduce a new class member and initialize
 * it with a call to `input` or `input.required`.
 *
 * ```ts
 * @Component({
 *   ...
 * })
 * export class UserProfileComponent {
 *   firstName = input<string>();             // Signal<string|undefined>
 *   lastName  = input.required<string>();    // Signal<string>
 *   age       = input(0)                     // Signal<number>
 * }
 * ```
 *
 * Inside your component template, you can display values of the inputs
 * by calling the signal.
 *
 * ```html
 * <span>{{firstName()}}</span>
 * ```
 *
 * @publicAPI
 * @initializerApiFunction
 */
declare const input: InputFunction;

/** Retrieves the write type of an `InputSignal` and `InputSignalWithTransform`. */
type ɵUnwrapInputSignalWriteType<Field> = Field extends InputSignalWithTransform<any, infer WriteT> ? WriteT : never;
/**
 * Unwraps all `InputSignal`/`InputSignalWithTransform` class fields of
 * the given directive.
 */
type ɵUnwrapDirectiveSignalInputs<Dir, Fields extends keyof Dir> = {
    [P in Fields]: ɵUnwrapInputSignalWriteType<Dir[P]>;
};

/** Symbol used distinguish `WritableSignal` from other non-writable signals and functions. */
declare const ɵWRITABLE_SIGNAL: unique symbol;
/**
 * A `Signal` with a value that can be mutated via a setter interface.
 */
interface WritableSignal<T> extends Signal<T> {
    [ɵWRITABLE_SIGNAL]: T;
    /**
     * Directly set the signal to a new value, and notify any dependents.
     */
    set(value: T): void;
    /**
     * Update the value of the signal based on its current value, and
     * notify any dependents.
     */
    update(updateFn: (value: T) => T): void;
    /**
     * Returns a readonly version of this signal. Readonly signals can be accessed to read their value
     * but can't be changed using set or update methods. The readonly signals do _not_ have
     * any built-in mechanism that would prevent deep-mutation of their value.
     */
    asReadonly(): Signal<T>;
}
/**
 * Utility function used during template type checking to extract the value from a `WritableSignal`.
 * @codeGenApi
 */
declare function ɵunwrapWritableSignal<T>(value: T | {
    [ɵWRITABLE_SIGNAL]: T;
}): T;
/**
 * Options passed to the `signal` creation function.
 */
interface CreateSignalOptions<T> {
    /**
     * A comparison function which defines equality for signal values.
     */
    equal?: ValueEqualityFn<T>;
    /**
     * A debug name for the signal. Used in Angular DevTools to identify the signal.
     */
    debugName?: string;
}
/**
 * Create a `Signal` that can be set or updated directly.
 */
declare function signal<T>(initialValue: T, options?: CreateSignalOptions<T>): WritableSignal<T>;

/**
 * Function that can be used to manually clean up a
 * programmatic {@link OutputRef#subscribe} subscription.
 *
 * Note: Angular will automatically clean up subscriptions
 * when the directive/component of the output is destroyed.
 *
 * @publicAPI
 */
interface OutputRefSubscription {
    unsubscribe(): void;
}
/**
 * A reference to an Angular output.
 *
 * @publicAPI
 */
interface OutputRef<T> {
    /**
     * Registers a callback that is invoked whenever the output
     * emits a new value of type `T`.
     *
     * Angular will automatically clean up the subscription when
     * the directive/component of the output is destroyed.
     */
    subscribe(callback: (value: T) => void): OutputRefSubscription;
}

/**
 * @publicAPI
 *
 * Options for model signals.
 */
interface ModelOptions {
    /**
     * Optional public name of the input side of the model. The output side will have the same
     * name as the input, but suffixed with `Change`. By default, the class field name is used.
     */
    alias?: string;
    /**
     * A debug name for the model signal. Used in Angular DevTools to identify the signal.
     */
    debugName?: string;
}
/**
 * `ModelSignal` represents a special `Signal` for a directive/component model field.
 *
 * A model signal is a writeable signal that can be exposed as an output.
 * Whenever its value is updated, it emits to the output.
 *
 * @publicAPI
 */
interface ModelSignal<T> extends WritableSignal<T>, InputSignal<T>, OutputRef<T> {
    [SIGNAL]: InputSignalNode<T, T>;
}

/**
 * `model` declares a writeable signal that is exposed as an input/output pair on the containing
 * directive. The input name is taken either from the class member or from the `alias` option.
 * The output name is generated by taking the input name and appending `Change`.
 *
 * The function exposes an API for also declaring required models via the
 * `model.required` function.
 *
 * @publicAPI
 * @docsPrivate Ignored because `model` is the canonical API entry.
 */
interface ModelFunction {
    /**
     * Initializes a model of type `T` with an initial value of `undefined`.
     * Angular will implicitly use `undefined` as initial value.
     */
    <T>(): ModelSignal<T | undefined>;
    /** Initializes a model of type `T` with the given initial value. */
    <T>(initialValue: T, opts?: ModelOptions): ModelSignal<T>;
    required: {
        /**
         * Initializes a required model.
         *
         * Users of your directive/component need to bind to the input side of the model.
         * If unset, a compile time error will be reported.
         */
        <T>(opts?: ModelOptions): ModelSignal<T>;
    };
}
/**
 * `model` declares a writeable signal that is exposed as an input/output
 * pair on the containing directive.
 *
 * The input name is taken either from the class member or from the `alias` option.
 * The output name is generated by taking the input name and appending `Change`.
 *
 * @usageNotes
 *
 * To use `model()`, import the function from `@angular/core`.
 *
 * ```ts
 * import {model} from '@angular/core`;
 * ```
 *
 * Inside your component, introduce a new class member and initialize
 * it with a call to `model` or `model.required`.
 *
 * ```ts
 * @Directive({
 *   ...
 * })
 * export class MyDir {
 *   firstName = model<string>();            // ModelSignal<string|undefined>
 *   lastName  = model.required<string>();   // ModelSignal<string>
 *   age       = model(0);                   // ModelSignal<number>
 * }
 * ```
 *
 * Inside your component template, you can display the value of a `model`
 * by calling the signal.
 *
 * ```html
 * <span>{{firstName()}}</span>
 * ```
 *
 * Updating the `model` is equivalent to updating a writable signal.
 *
 * ```ts
 * updateName(newFirstName: string): void {
 *   this.firstName.set(newFirstName);
 * }
 * ```
 *
 * @publicAPI
 * @initializerApiFunction
 */
declare const model: ModelFunction;

/**
 * @description
 *
 * Represents an abstract class `T`, if applied to a concrete class it would stop being
 * instantiable.
 *
 * @publicApi
 */
interface AbstractType<T> extends Function {
    prototype: T;
}
/**
 * @description
 *
 * Represents a type that a Component or other object is instances of.
 *
 * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is represented by
 * the `MyCustomComponent` constructor function.
 *
 * @publicApi
 */
declare const Type$1: FunctionConstructor;
interface Type$1<T> extends Function {
    new (...args: any[]): T;
}
/**
 * Returns a writable type version of type.
 *
 * USAGE:
 * Given:
 * ```ts
 * interface Person {readonly name: string}
 * ```
 *
 * We would like to get a read/write version of `Person`.
 * ```ts
 * const WritablePerson = Writable<Person>;
 * ```
 *
 * The result is that you can do:
 *
 * ```ts
 * const readonlyPerson: Person = {name: 'Marry'};
 * readonlyPerson.name = 'John'; // TypeError
 * (readonlyPerson as WritablePerson).name = 'John'; // OK
 *
 * // Error: Correctly detects that `Person` did not have `age` property.
 * (readonlyPerson as WritablePerson).age = 30;
 * ```
 */
type Writable<T> = {
    -readonly [K in keyof T]: T[K];
};

/**
 * Creates a token that can be used in a DI Provider.
 *
 * Use an `InjectionToken` whenever the type you are injecting is not reified (does not have a
 * runtime representation) such as when injecting an interface, callable type, array or
 * parameterized type.
 *
 * `InjectionToken` is parameterized on `T` which is the type of object which will be returned by
 * the `Injector`. This provides an additional level of type safety.
 *
 * <div class="docs-alert docs-alert-helpful">
 *
 * **Important Note**: Ensure that you use the same instance of the `InjectionToken` in both the
 * provider and the injection call. Creating a new instance of `InjectionToken` in different places,
 * even with the same description, will be treated as different tokens by Angular's DI system,
 * leading to a `NullInjectorError`.
 *
 * </div>
 *
 * {@example injection-token/src/main.ts region='InjectionToken'}
 *
 * When creating an `InjectionToken`, you can optionally specify a factory function which returns
 * (possibly by creating) a default value of the parameterized type `T`. This sets up the
 * `InjectionToken` using this factory as a provider as if it was defined explicitly in the
 * application's root injector. If the factory function, which takes zero arguments, needs to inject
 * dependencies, it can do so using the [`inject`](api/core/inject) function.
 * As you can see in the Tree-shakable InjectionToken example below.
 *
 * Additionally, if a `factory` is specified you can also specify the `providedIn` option, which
 * overrides the above behavior and marks the token as belonging to a particular `@NgModule` (note:
 * this option is now deprecated). As mentioned above, `'root'` is the default value for
 * `providedIn`.
 *
 * The `providedIn: NgModule` and `providedIn: 'any'` options are deprecated.
 *
 * @usageNotes
 * ### Basic Examples
 *
 * ### Plain InjectionToken
 *
 * {@example core/di/ts/injector_spec.ts region='InjectionToken'}
 *
 * ### Tree-shakable InjectionToken
 *
 * {@example core/di/ts/injector_spec.ts region='ShakableInjectionToken'}
 *
 * @publicApi
 */
declare class InjectionToken<T> {
    protected _desc: string;
    readonly ɵprov: unknown;
    /**
     * @param _desc   Description for the token,
     *                used only for debugging purposes,
     *                it should but does not need to be unique
     * @param options Options for the token's usage, as described above
     */
    constructor(_desc: string, options?: {
        providedIn?: Type$1<any> | 'root' | 'platform' | 'any' | null;
        factory: () => T;
    });
    toString(): string;
}

declare const enum NotificationSource {
    MarkAncestorsForTraversal = 0,
    SetInput = 1,
    DeferBlockStateUpdate = 2,
    DebugApplyChanges = 3,
    MarkForCheck = 4,
    Listener = 5,
    CustomElement = 6,
    RenderHook = 7,
    ViewAttached = 8,
    ViewDetachedFromDOM = 9,
    AsyncAnimationsLoaded = 10,
    PendingTaskRemoved = 11,
    RootEffect = 12,
    ViewEffect = 13
}
/**
 * Injectable that is notified when an `LView` is made aware of changes to application state.
 */
declare abstract class ChangeDetectionScheduler {
    abstract notify(source: NotificationSource): void;
    abstract runningTick: boolean;
}
/** Token used to indicate if zoneless was enabled via provideZonelessChangeDetection(). */
declare const ZONELESS_ENABLED: InjectionToken<boolean>;

/**
 * Configures the `Injector` to return a value for a token.
 * Base for `ValueProvider` decorator.
 *
 * @publicApi
 */
interface ValueSansProvider {
    /**
     * The value to inject.
     */
    useValue: any;
}
/**
 * Configures the `Injector` to return a value for a token.
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @usageNotes
 *
 * ### Example
 *
 * {@example core/di/ts/provider_spec.ts region='ValueProvider'}
 *
 * ### Multi-value example
 *
 * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}
 *
 * @publicApi
 */
interface ValueProvider extends ValueSansProvider {
    /**
     * An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.
     */
    provide: any;
    /**
     * When true, injector returns an array of instances. This is useful to allow multiple
     * providers spread across many files to provide configuration information to a common token.
     */
    multi?: boolean;
}
/**
 * Configures the `Injector` to return an instance of `useClass` for a token.
 * Base for `StaticClassProvider` decorator.
 *
 * @publicApi
 */
interface StaticClassSansProvider {
    /**
     * An optional class to instantiate for the `token`. By default, the `provide`
     * class is instantiated.
     */
    useClass: Type$1<any>;
    /**
     * A list of `token`s to be resolved by the injector. The list of values is then
     * used as arguments to the `useClass` constructor.
     */
    deps: any[];
}
/**
 * Configures the `Injector` to return an instance of `useClass` for a token.
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @usageNotes
 *
 * {@example core/di/ts/provider_spec.ts region='StaticClassProvider'}
 *
 * Note that following two providers are not equal:
 *
 * {@example core/di/ts/provider_spec.ts region='StaticClassProviderDifference'}
 *
 * ### Multi-value example
 *
 * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}
 *
 * @publicApi
 */
interface StaticClassProvider extends StaticClassSansProvider {
    /**
     * An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.
     */
    provide: any;
    /**
     * When true, injector returns an array of instances. This is useful to allow multiple
     * providers spread across many files to provide configuration information to a common token.
     */
    multi?: boolean;
}
/**
 * Configures the `Injector` to return an instance of a token.
 *
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @usageNotes
 *
 * ```ts
 * @Injectable(SomeModule, {deps: []})
 * class MyService {}
 * ```
 *
 * @publicApi
 */
interface ConstructorSansProvider {
    /**
     * A list of `token`s to be resolved by the injector.
     */
    deps?: any[];
}
/**
 * Configures the `Injector` to return an instance of a token.
 *
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @usageNotes
 *
 * {@example core/di/ts/provider_spec.ts region='ConstructorProvider'}
 *
 * ### Multi-value example
 *
 * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}
 *
 * @publicApi
 */
interface ConstructorProvider extends ConstructorSansProvider {
    /**
     * An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.
     */
    provide: Type$1<any>;
    /**
     * When true, injector returns an array of instances. This is useful to allow multiple
     * providers spread across many files to provide configuration information to a common token.
     */
    multi?: boolean;
}
/**
 * Configures the `Injector` to return a value of another `useExisting` token.
 *
 * @see {@link ExistingProvider}
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @publicApi
 */
interface ExistingSansProvider {
    /**
     * Existing `token` to return. (Equivalent to `injector.get(useExisting)`)
     */
    useExisting: any;
}
/**
 * Configures the `Injector` to return a value of another `useExisting` token.
 *
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @usageNotes
 *
 * {@example core/di/ts/provider_spec.ts region='ExistingProvider'}
 *
 * ### Multi-value example
 *
 * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}
 *
 * @publicApi
 */
interface ExistingProvider extends ExistingSansProvider {
    /**
     * An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.
     */
    provide: any;
    /**
     * When true, injector returns an array of instances. This is useful to allow multiple
     * providers spread across many files to provide configuration information to a common token.
     */
    multi?: boolean;
}
/**
 * Configures the `Injector` to return a value by invoking a `useFactory` function.
 *
 * @see {@link FactoryProvider}
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @publicApi
 */
interface FactorySansProvider {
    /**
     * A function to invoke to create a value for this `token`. The function is invoked with
     * resolved values of `token`s in the `deps` field.
     */
    useFactory: Function;
    /**
     * A list of `token`s to be resolved by the injector. The list of values is then
     * used as arguments to the `useFactory` function.
     */
    deps?: any[];
}
/**
 * Configures the `Injector` to return a value by invoking a `useFactory` function.
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @usageNotes
 *
 * {@example core/di/ts/provider_spec.ts region='FactoryProvider'}
 *
 * Dependencies can also be marked as optional:
 *
 * {@example core/di/ts/provider_spec.ts region='FactoryProviderOptionalDeps'}
 *
 * ### Multi-value example
 *
 * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}
 *
 * @publicApi
 */
interface FactoryProvider extends FactorySansProvider {
    /**
     * An injection token. (Typically an instance of `Type` or `InjectionToken`, but can be `any`).
     */
    provide: any;
    /**
     * When true, injector returns an array of instances. This is useful to allow multiple
     * providers spread across many files to provide configuration information to a common token.
     */
    multi?: boolean;
}
/**
 * Describes how an `Injector` should be configured as static (that is, without reflection).
 * A static provider provides tokens to an injector for various types of dependencies.
 *
 * @see {@link Injector.create()}
 * @see [Dependency Injection Guide](guide/di/dependency-injection-providers).
 *
 * @publicApi
 */
type StaticProvider = ValueProvider | ExistingProvider | StaticClassProvider | ConstructorProvider | FactoryProvider | any[];
/**
 * Configures the `Injector` to return an instance of `Type` when `Type' is used as the token.
 *
 * Create an instance by invoking the `new` operator and supplying additional arguments.
 * This form is a short form of `TypeProvider`;
 *
 * For more details, see the ["Dependency Injection Guide"](guide/di/dependency-injection.
 *
 * @usageNotes
 *
 * {@example core/di/ts/provider_spec.ts region='TypeProvider'}
 *
 * @publicApi
 */
interface TypeProvider extends Type$1<any> {
}
/**
 * Configures the `Injector` to return a value by invoking a `useClass` function.
 * Base for `ClassProvider` decorator.
 *
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @publicApi
 */
interface ClassSansProvider {
    /**
     * Class to instantiate for the `token`.
     */
    useClass: Type$1<any>;
}
/**
 * Configures the `Injector` to return an instance of `useClass` for a token.
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @usageNotes
 *
 * {@example core/di/ts/provider_spec.ts region='ClassProvider'}
 *
 * Note that following two providers are not equal:
 *
 * {@example core/di/ts/provider_spec.ts region='ClassProviderDifference'}
 *
 * ### Multi-value example
 *
 * {@example core/di/ts/provider_spec.ts region='MultiProviderAspect'}
 *
 * @publicApi
 */
interface ClassProvider extends ClassSansProvider {
    /**
     * An injection token. (Typically an instance of `Type` or `InjectionToken`, but can be `any`).
     */
    provide: any;
    /**
     * When true, injector returns an array of instances. This is useful to allow multiple
     * providers spread across many files to provide configuration information to a common token.
     */
    multi?: boolean;
}
/**
 * Describes how the `Injector` should be configured.
 * @see [Dependency Injection Guide](guide/di/dependency-injection.
 *
 * @see {@link StaticProvider}
 *
 * @publicApi
 */
type Provider = TypeProvider | ValueProvider | ClassProvider | ConstructorProvider | ExistingProvider | FactoryProvider | any[];
/**
 * Encapsulated `Provider`s that are only accepted during creation of an `EnvironmentInjector` (e.g.
 * in an `NgModule`).
 *
 * Using this wrapper type prevents providers which are only designed to work in
 * application/environment injectors from being accidentally included in
 * `@Component.providers` and ending up in a component injector.
 *
 * This wrapper type prevents access to the `Provider`s inside.
 *
 * @see {@link makeEnvironmentProviders}
 * @see {@link importProvidersFrom}
 *
 * @publicApi
 */
type EnvironmentProviders = {
    ɵbrand: 'EnvironmentProviders';
};
interface InternalEnvironmentProviders extends EnvironmentProviders {
    ɵproviders: (Provider | EnvironmentProviders)[];
    /**
     * If present, indicates that the `EnvironmentProviders` were derived from NgModule providers.
     *
     * This is used to produce clearer error messages.
     */
    ɵfromNgModule?: true;
}
declare function isEnvironmentProviders(value: Provider | EnvironmentProviders | InternalEnvironmentProviders): value is InternalEnvironmentProviders;
/**
 * Describes a function that is used to process provider lists (such as provider
 * overrides).
 */
type ProcessProvidersFunction = (providers: Provider[]) => Provider[];
/**
 * A wrapper around an NgModule that associates it with providers
 * Usage without a generic type is deprecated.
 *
 * @publicApi
 */
interface ModuleWithProviders<T> {
    ngModule: Type$1<T>;
    providers?: Array<Provider | EnvironmentProviders>;
}
/**
 * Providers that were imported from NgModules via the `importProvidersFrom` function.
 *
 * These providers are meant for use in an application injector (or other environment injectors) and
 * should not be used in component injectors.
 *
 * This type cannot be directly implemented. It's returned from the `importProvidersFrom` function
 * and serves to prevent the extracted NgModule providers from being used in the wrong contexts.
 *
 * @see {@link importProvidersFrom}
 *
 * @publicApi
 * @deprecated replaced by `EnvironmentProviders`
 */
type ImportedNgModuleProviders = EnvironmentProviders;

/**
 * @fileoverview
 * While Angular only uses Trusted Types internally for the time being,
 * references to Trusted Types could leak into our core.d.ts, which would force
 * anyone compiling against @angular/core to provide the @types/trusted-types
 * package in their compilation unit.
 *
 * Until https://github.com/microsoft/TypeScript/issues/30024 is resolved, we
 * will keep Angular's public API surface free of references to Trusted Types.
 * For internal and semi-private APIs that need to reference Trusted Types, the
 * minimal type definitions for the Trusted Types API provided by this module
 * should be used instead. They are marked as "declare" to prevent them from
 * being renamed by compiler optimization.
 *
 * Adapted from
 * https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/trusted-types/index.d.ts
 * but restricted to the API surface used within Angular.
 */
type TrustedHTML = string & {
    __brand__: 'TrustedHTML';
};
type TrustedScript = string & {
    __brand__: 'TrustedScript';
};
type TrustedScriptURL = string & {
    __brand__: 'TrustedScriptURL';
};

/**
 * Function used to sanitize the value before writing it into the renderer.
 */
type SanitizerFn = (value: any, tagName?: string, propName?: string) => string | TrustedHTML | TrustedScript | TrustedScriptURL;

/**
 * Stores a list of nodes which need to be removed.
 *
 * Numbers are indexes into the `LView`
 * - index > 0: `removeRNode(lView[0])`
 * - index < 0: `removeICU(~lView[0])`
 */
interface I18nRemoveOpCodes extends Array<number> {
    __brand__: 'I18nRemoveOpCodes';
}
/**
 * Array storing OpCode for dynamically creating `i18n` blocks.
 *
 * Example:
 * ```ts
 * <I18nCreateOpCode>[
 *   // For adding text nodes
 *   // ---------------------
 *   // Equivalent to:
 *   //   lView[1].appendChild(lView[0] = document.createTextNode('xyz'));
 *   'xyz', 0, 1 << SHIFT_PARENT | 0 << SHIFT_REF | AppendChild,
 *
 *   // For adding element nodes
 *   // ---------------------
 *   // Equivalent to:
 *   //   lView[1].appendChild(lView[0] = document.createElement('div'));
 *   ELEMENT_MARKER, 'div', 0, 1 << SHIFT_PARENT | 0 << SHIFT_REF | AppendChild,
 *
 *   // For adding comment nodes
 *   // ---------------------
 *   // Equivalent to:
 *   //   lView[1].appendChild(lView[0] = document.createComment(''));
 *   ICU_MARKER, '', 0, 1 << SHIFT_PARENT | 0 << SHIFT_REF | AppendChild,
 *
 *   // For moving existing nodes to a different location
 *   // --------------------------------------------------
 *   // Equivalent to:
 *   //   const node = lView[1];
 *   //   lView[2].appendChild(node);
 *   1 << SHIFT_REF | Select, 2 << SHIFT_PARENT | 0 << SHIFT_REF | AppendChild,
 *
 *   // For removing existing nodes
 *   // --------------------------------------------------
 *   //   const node = lView[1];
 *   //   removeChild(tView.data(1), node, lView);
 *   1 << SHIFT_REF | Remove,
 *
 *   // For writing attributes
 *   // --------------------------------------------------
 *   //   const node = lView[1];
 *   //   node.setAttribute('attr', 'value');
 *   1 << SHIFT_REF | Attr, 'attr', 'value'
 * ];
 * ```
 */
interface IcuCreateOpCodes extends Array<number | string | ELEMENT_MARKER | ICU_MARKER | null>, I18nDebug {
    __brand__: 'I18nCreateOpCodes';
}
/**
 * Marks that the next string is an element name.
 *
 * See `I18nMutateOpCodes` documentation.
 */
declare const ELEMENT_MARKER: ELEMENT_MARKER;
interface ELEMENT_MARKER {
    marker: 'element';
}
/**
 * Marks that the next string is comment text need for ICU.
 *
 * See `I18nMutateOpCodes` documentation.
 */
declare const ICU_MARKER: ICU_MARKER;
interface ICU_MARKER {
    marker: 'ICU';
}
interface I18nDebug {
    /**
     * Human readable representation of the OpCode arrays.
     *
     * NOTE: This property only exists if `ngDevMode` is set to `true` and it is not present in
     * production. Its presence is purely to help debug issue in development, and should not be relied
     * on in production application.
     */
    debug?: string[];
}
/**
 * Array storing OpCode for dynamically creating `i18n` translation DOM elements.
 *
 * This array creates a sequence of `Text` and `Comment` (as ICU anchor) DOM elements. It consists
 * of a pair of `number` and `string` pairs which encode the operations for the creation of the
 * translated block.
 *
 * The number is shifted and encoded according to `I18nCreateOpCode`
 *
 * Pseudocode:
 * ```ts
 * const i18nCreateOpCodes = [
 *   10 << I18nCreateOpCode.SHIFT, "Text Node add to DOM",
 *   11 << I18nCreateOpCode.SHIFT | I18nCreateOpCode.COMMENT, "Comment Node add to DOM",
 *   12 << I18nCreateOpCode.SHIFT | I18nCreateOpCode.APPEND_LATER, "Text Node added later"
 * ];
 *
 * for(var i=0; i<i18nCreateOpCodes.length; i++) {
 *   const opcode = i18NCreateOpCodes[i++];
 *   const index = opcode >> I18nCreateOpCode.SHIFT;
 *   const text = i18NCreateOpCodes[i];
 *   let node: Text|Comment;
 *   if (opcode & I18nCreateOpCode.COMMENT === I18nCreateOpCode.COMMENT) {
 *     node = lView[~index] = document.createComment(text);
 *   } else {
 *     node = lView[index] = document.createText(text);
 *   }
 *   if (opcode & I18nCreateOpCode.APPEND_EAGERLY !== I18nCreateOpCode.APPEND_EAGERLY) {
 *     parentNode.appendChild(node);
 *   }
 * }
 * ```
 */
interface I18nCreateOpCodes extends Array<number | string>, I18nDebug {
    __brand__: 'I18nCreateOpCodes';
}
/**
 * Stores DOM operations which need to be applied to update DOM render tree due to changes in
 * expressions.
 *
 * The basic idea is that `i18nExp` OpCodes capture expression changes and update a change
 * mask bit. (Bit 1 for expression 1, bit 2 for expression 2 etc..., bit 32 for expression 32 and
 * higher.) The OpCodes then compare its own change mask against the expression change mask to
 * determine if the OpCodes should execute.
 *
 * NOTE: 32nd bit is special as it says 32nd or higher. This way if we have more than 32 bindings
 * the code still works, but with lower efficiency. (it is unlikely that a translation would have
 * more than 32 bindings.)
 *
 * These OpCodes can be used by both the i18n block as well as ICU sub-block.
 *
 * ## Example
 *
 * Assume
 * ```ts
 *   if (rf & RenderFlags.Update) {
 *    i18nExp(ctx.exp1); // If changed set mask bit 1
 *    i18nExp(ctx.exp2); // If changed set mask bit 2
 *    i18nExp(ctx.exp3); // If changed set mask bit 3
 *    i18nExp(ctx.exp4); // If changed set mask bit 4
 *    i18nApply(0);            // Apply all changes by executing the OpCodes.
 *  }
 * ```
 * We can assume that each call to `i18nExp` sets an internal `changeMask` bit depending on the
 * index of `i18nExp`.
 *
 * ### OpCodes
 * ```ts
 * <I18nUpdateOpCodes>[
 *   // The following OpCodes represent: `<div i18n-title="pre{{exp1}}in{{exp2}}post">`
 *   // If `changeMask & 0b11`
 *   //        has changed then execute update OpCodes.
 *   //        has NOT changed then skip `8` values and start processing next OpCodes.
 *   0b11, 8,
 *   // Concatenate `newValue = 'pre'+lView[bindIndex-4]+'in'+lView[bindIndex-3]+'post';`.
 *   'pre', -4, 'in', -3, 'post',
 *   // Update attribute: `elementAttribute(1, 'title', sanitizerFn(newValue));`
 *   1 << SHIFT_REF | Attr, 'title', sanitizerFn,
 *
 *   // The following OpCodes represent: `<div i18n>Hello {{exp3}}!">`
 *   // If `changeMask & 0b100`
 *   //        has changed then execute update OpCodes.
 *   //        has NOT changed then skip `4` values and start processing next OpCodes.
 *   0b100, 4,
 *   // Concatenate `newValue = 'Hello ' + lView[bindIndex -2] + '!';`.
 *   'Hello ', -2, '!',
 *   // Update text: `lView[1].textContent = newValue;`
 *   1 << SHIFT_REF | Text,
 *
 *   // The following OpCodes represent: `<div i18n>{exp4, plural, ... }">`
 *   // If `changeMask & 0b1000`
 *   //        has changed then execute update OpCodes.
 *   //        has NOT changed then skip `2` values and start processing next OpCodes.
 *   0b1000, 2,
 *   // Concatenate `newValue = lView[bindIndex -1];`.
 *   -1,
 *   // Switch ICU: `icuSwitchCase(lView[1], 0, newValue);`
 *   0 << SHIFT_ICU | 1 << SHIFT_REF | IcuSwitch,
 *
 *   // Note `changeMask & -1` is always true, so the IcuUpdate will always execute.
 *   -1, 1,
 *   // Update ICU: `icuUpdateCase(lView[1], 0);`
 *   0 << SHIFT_ICU | 1 << SHIFT_REF | IcuUpdate,
 *
 * ];
 * ```
 *
 */
interface I18nUpdateOpCodes extends Array<string | number | SanitizerFn | null>, I18nDebug {
    __brand__: 'I18nUpdateOpCodes';
}
/**
 * Store information for the i18n translation block.
 */
interface TI18n {
    /**
     * A set of OpCodes which will create the Text Nodes and ICU anchors for the translation blocks.
     *
     * NOTE: The ICU anchors are filled in with ICU Update OpCode.
     */
    create: I18nCreateOpCodes;
    /**
     * A set of OpCodes which will be executed on each change detection to determine if any changes to
     * DOM are required.
     */
    update: I18nUpdateOpCodes;
    /**
     * An AST representing the translated message. This is used for hydration (and serialization),
     * while the Update and Create OpCodes are used at runtime.
     */
    ast: Array<I18nNode>;
    /**
     * Index of a parent TNode, which represents a host node for this i18n block.
     */
    parentTNodeIndex: number;
}
/**
 * Defines the ICU type of `select` or `plural`
 */
declare const enum IcuType {
    select = 0,
    plural = 1
}
interface TIcu {
    /**
     * Defines the ICU type of `select` or `plural`
     */
    type: IcuType;
    /**
     * Index in `LView` where the anchor node is stored. `<!-- ICU 0:0 -->`
     */
    anchorIdx: number;
    /**
     * Currently selected ICU case pointer.
     *
     * `lView[currentCaseLViewIndex]` stores the currently selected case. This is needed to know how
     * to clean up the current case when transitioning no the new case.
     *
     * If the value stored is:
     * `null`: No current case selected.
     *   `<0`: A flag which means that the ICU just switched and that `icuUpdate` must be executed
     *         regardless of the `mask`. (After the execution the flag is cleared)
     *   `>=0` A currently selected case index.
     */
    currentCaseLViewIndex: number;
    /**
     * A list of case values which the current ICU will try to match.
     *
     * The last value is `other`
     */
    cases: any[];
    /**
     * A set of OpCodes to apply in order to build up the DOM render tree for the ICU
     */
    create: IcuCreateOpCodes[];
    /**
     * A set of OpCodes to apply in order to destroy the DOM render tree for the ICU.
     */
    remove: I18nRemoveOpCodes[];
    /**
     * A set of OpCodes to apply in order to update the DOM render tree for the ICU bindings.
     */
    update: I18nUpdateOpCodes[];
}
type I18nNode = I18nTextNode | I18nElementNode | I18nICUNode | I18nPlaceholderNode;
/**
 * Represents a block of text in a translation, such as `Hello, {{ name }}!`.
 */
interface I18nTextNode {
    /** The AST node kind */
    kind: I18nNodeKind.TEXT;
    /** The LView index */
    index: number;
}
/**
 * Represents a simple DOM element in a translation, such as `<div>...</div>`
 */
interface I18nElementNode {
    /** The AST node kind */
    kind: I18nNodeKind.ELEMENT;
    /** The LView index */
    index: number;
    /** The child nodes */
    children: Array<I18nNode>;
}
/**
 * Represents an ICU in a translation.
 */
interface I18nICUNode {
    /** The AST node kind */
    kind: I18nNodeKind.ICU;
    /** The LView index */
    index: number;
    /** The branching cases */
    cases: Array<Array<I18nNode>>;
    /** The LView index that stores the active case */
    currentCaseLViewIndex: number;
}
/**
 * Represents special content that is embedded into the translation. This can
 * either be a special built-in element, such as <ng-container> and <ng-content>,
 * or it can be a sub-template, for example, from a structural directive.
 */
interface I18nPlaceholderNode {
    /** The AST node kind */
    kind: I18nNodeKind.PLACEHOLDER;
    /** The LView index */
    index: number;
    /** The child nodes */
    children: Array<I18nNode>;
    /** The placeholder type */
    type: I18nPlaceholderType;
}
declare const enum I18nPlaceholderType {
    ELEMENT = 0,
    SUBTEMPLATE = 1
}
declare const enum I18nNodeKind {
    TEXT = 0,
    ELEMENT = 1,
    PLACEHOLDER = 2,
    ICU = 3
}

/**
 * The goal here is to make sure that the browser DOM API is the Renderer.
 * We do this by defining a subset of DOM API to be the renderer and then
 * use that at runtime for rendering.
 *
 * At runtime we can then use the DOM api directly, in server or web-worker
 * it will be easy to implement such API.
 */
/** Subset of API needed for appending elements and text nodes. */
interface RNode {
    /**
     * Returns the parent Element, Document, or DocumentFragment
     */
    parentNode: RNode | null;
    /**
     * Returns the parent Element if there is one
     */
    parentElement: RElement | null;
    /**
     * Gets the Node immediately following this one in the parent's childNodes
     */
    nextSibling: RNode | null;
    /**
     * Insert a child node.
     *
     * Used exclusively for adding View root nodes into ViewAnchor location.
     */
    insertBefore(newChild: RNode, refChild: RNode | null, isViewRoot: boolean): void;
    /**
     * Append a child node.
     *
     * Used exclusively for building up DOM which are static (ie not View roots)
     */
    appendChild(newChild: RNode): RNode;
}
/**
 * Subset of API needed for writing attributes, properties, and setting up
 * listeners on Element.
 */
interface RElement extends RNode {
    firstChild: RNode | null;
    style: RCssStyleDeclaration;
    classList: RDomTokenList;
    className: string;
    tagName: string;
    textContent: string | null;
    hasAttribute(name: string): boolean;
    getAttribute(name: string): string | null;
    setAttribute(name: string, value: string | TrustedHTML | TrustedScript | TrustedScriptURL): void;
    removeAttribute(name: string): void;
    setAttributeNS(namespaceURI: string, qualifiedName: string, value: string | TrustedHTML | TrustedScript | TrustedScriptURL): void;
    addEventListener(type: string, listener: EventListener, useCapture?: boolean): void;
    removeEventListener(type: string, listener?: EventListener, options?: boolean): void;
    remove(): void;
    setProperty?(name: string, value: any): void;
}
interface RCssStyleDeclaration {
    removeProperty(propertyName: string): string;
    setProperty(propertyName: string, value: string | null, priority?: string): void;
}
interface RDomTokenList {
    add(token: string): void;
    remove(token: string): void;
}
interface RText extends RNode {
    textContent: string | null;
}
interface RComment extends RNode {
    textContent: string | null;
}

/**
 * Keys within serialized view data structure to represent various
 * parts. See the `SerializedView` interface below for additional information.
 */
declare const ELEMENT_CONTAINERS = "e";
declare const TEMPLATES = "t";
declare const CONTAINERS = "c";
declare const MULTIPLIER = "x";
declare const NUM_ROOT_NODES = "r";
declare const TEMPLATE_ID = "i";
declare const NODES = "n";
declare const DISCONNECTED_NODES = "d";
declare const I18N_DATA = "l";
declare const DEFER_BLOCK_ID = "di";
declare const DEFER_BLOCK_STATE = "s";
/**
 * Represents element containers within this view, stored as key-value pairs
 * where key is an index of a container in an LView (also used in the
 * `elementContainerStart` instruction), the value is the number of root nodes
 * in this container. This information is needed to locate an anchor comment
 * node that goes after all container nodes.
 */
interface SerializedElementContainers {
    [key: number]: number;
}
/**
 * Serialized data structure that contains relevant hydration
 * annotation information that describes a given hydration boundary
 * (e.g. a component).
 */
interface SerializedView {
    /**
     * Serialized information about <ng-container>s.
     */
    [ELEMENT_CONTAINERS]?: SerializedElementContainers;
    /**
     * Serialized information about templates.
     * Key-value pairs where a key is an index of the corresponding
     * `template` instruction and the value is a unique id that can
     * be used during hydration to identify that template.
     */
    [TEMPLATES]?: Record<number, string>;
    /**
     * Serialized information about view containers.
     * Key-value pairs where a key is an index of the corresponding
     * LContainer entry within an LView, and the value is a list
     * of serialized information about views within this container.
     */
    [CONTAINERS]?: Record<number, SerializedContainerView[]>;
    /**
     * Serialized information about nodes in a template.
     * Key-value pairs where a key is an index of the corresponding
     * DOM node in an LView and the value is a path that describes
     * the location of this node (as a set of navigation instructions).
     */
    [NODES]?: Record<number, string>;
    /**
     * A list of ids which represents a set of nodes disconnected
     * from the DOM tree at the serialization time, but otherwise
     * present in the internal data structures.
     *
     * This information is used to avoid triggering the hydration
     * logic for such nodes and instead use a regular "creation mode".
     */
    [DISCONNECTED_NODES]?: number[];
    /**
     * Serialized information about i18n blocks in a template.
     * Key-value pairs where a key is an index of the corresponding
     * i18n entry within an LView, and the value is a list of
     * active ICU cases.
     */
    [I18N_DATA]?: Record<number, number[]>;
    /**
     * If this view represents a `@defer` block, this field contains
     * unique id of the block.
     */
    [DEFER_BLOCK_ID]?: string;
    /**
     * This field represents a status, based on the `DeferBlockState` enum.
     */
    [DEFER_BLOCK_STATE]?: number;
}
/**
 * Serialized data structure that contains relevant hydration
 * annotation information about a view that is a part of a
 * ViewContainer collection.
 */
interface SerializedContainerView extends SerializedView {
    /**
     * Unique id that represents a TView that was used to create
     * a given instance of a view:
     *  - TViewType.Embedded: a unique id generated during serialization on the server
     *  - TViewType.Component: an id generated based on component properties
     *                        (see `getComponentId` function for details)
     */
    [TEMPLATE_ID]: string;
    /**
     * Number of root nodes that belong to this view.
     * This information is needed to effectively traverse the DOM tree
     * and identify segments that belong to different views.
     */
    [NUM_ROOT_NODES]: number;
    /**
     * Number of times this view is repeated.
     * This is used to avoid serializing and sending the same hydration
     * information about similar views (for example, produced by *ngFor).
     */
    [MULTIPLIER]?: number;
}
/**
 * An object that contains hydration-related information serialized
 * on the server, as well as the necessary references to segments of
 * the DOM, to facilitate the hydration process for a given hydration
 * boundary on the client.
 */
interface DehydratedView {
    /**
     * The readonly hydration annotation data.
     */
    data: Readonly<SerializedView>;
    /**
     * A reference to the first child in a DOM segment associated
     * with a given hydration boundary.
     *
     * Once a view becomes hydrated, the value is set to `null`, which
     * indicates that further detaching/attaching view actions should result
     * in invoking corresponding DOM actions (attaching DOM nodes action is
     * skipped when we hydrate, since nodes are already in the DOM).
     */
    firstChild: RNode | null;
    /**
     * Stores references to first nodes in DOM segments that
     * represent either an <ng-container> or a view container.
     */
    segmentHeads?: {
        [index: number]: RNode | null;
    };
    /**
     * An instance of a Set that represents nodes disconnected from
     * the DOM tree at the serialization time, but otherwise present
     * in the internal data structures.
     *
     * The Set is based on the `SerializedView[DISCONNECTED_NODES]` data
     * and is needed to have constant-time lookups.
     *
     * If the value is `null`, it means that there were no disconnected
     * nodes detected in this view at serialization time.
     */
    disconnectedNodes?: Set<number> | null;
    /**
     * A mapping from a view to the first child to begin claiming nodes.
     *
     * This mapping is generated by an i18n block, and is the source of
     * truth for the nodes inside of it.
     */
    i18nNodes?: Map<number, RNode | null>;
    /**
     * A mapping from the index of an ICU node to dehydrated data for it.
     *
     * This information is used during the hydration process on the client.
     * ICU cases that were active during server-side rendering will be added
     * to the map. The hydration logic will "claim" matching cases, removing
     * them from the map. The remaining entries are "unclaimed", and will be
     * removed from the DOM during hydration cleanup.
     */
    dehydratedIcuData?: Map<number, DehydratedIcuData>;
}
/**
 * An object that contains hydration-related information serialized
 * on the server, as well as the necessary references to segments of
 * the DOM, to facilitate the hydration process for a given view
 * inside a view container (either an embedded view or a view created
 * for a component).
 */
interface DehydratedContainerView extends DehydratedView {
    data: Readonly<SerializedContainerView>;
}
/**
 * An object that contains information about a dehydrated ICU case,
 * to facilitate cleaning up ICU cases that were active during
 * server-side rendering, but not during hydration.
 */
interface DehydratedIcuData {
    /**
     * The case index that this data represents.
     */
    case: number;
    /**
     * A reference back to the AST for the ICU node. This allows the
     * AST to be used to clean up dehydrated nodes.
     */
    node: I18nICUNode;
}

/**
 * `KeyValueArray` is an array where even positions contain keys and odd positions contain values.
 *
 * `KeyValueArray` provides a very efficient way of iterating over its contents. For small
 * sets (~10) the cost of binary searching an `KeyValueArray` has about the same performance
 * characteristics that of a `Map` with significantly better memory footprint.
 *
 * If used as a `Map` the keys are stored in alphabetical order so that they can be binary searched
 * for retrieval.
 *
 * See: `keyValueArraySet`, `keyValueArrayGet`, `keyValueArrayIndexOf`, `keyValueArrayDelete`.
 */
interface KeyValueArray<VALUE> extends Array<VALUE | string> {
    __brand__: 'array-map';
}

/**
 * Value stored in the `TData` which is needed to re-concatenate the styling.
 *
 * See: `TStylingKeyPrimitive` and `TStylingStatic`
 */
type TStylingKey = TStylingKeyPrimitive | TStylingStatic;
/**
 * The primitive portion (`TStylingStatic` removed) of the value stored in the `TData` which is
 * needed to re-concatenate the styling.
 *
 * - `string`: Stores the property name. Used with `ɵɵstyleProp`/`ɵɵclassProp` instruction.
 * - `null`: Represents map, so there is no name. Used with `ɵɵstyleMap`/`ɵɵclassMap`.
 * - `false`: Represents an ignore case. This happens when `ɵɵstyleProp`/`ɵɵclassProp` instruction
 *   is combined with directive which shadows its input `@Input('class')`. That way the binding
 *   should not participate in the styling resolution.
 */
type TStylingKeyPrimitive = string | null | false;
/**
 * Store the static values for the styling binding.
 *
 * The `TStylingStatic` is just `KeyValueArray` where key `""` (stored at location 0) contains the
 * `TStylingKey` (stored at location 1). In other words this wraps the `TStylingKey` such that the
 * `""` contains the wrapped value.
 *
 * When instructions are resolving styling they may need to look forward or backwards in the linked
 * list to resolve the value. For this reason we have to make sure that he linked list also contains
 * the static values. However the list only has space for one item per styling instruction. For this
 * reason we store the static values here as part of the `TStylingKey`. This means that the
 * resolution function when looking for a value needs to first look at the binding value, and than
 * at `TStylingKey` (if it exists).
 *
 * Imagine we have:
 *
 * ```angular-ts
 * <div class="TEMPLATE" my-dir>
 *
 * @Directive({
 *   host: {
 *     class: 'DIR',
 *     '[class.dynamic]': 'exp' // ɵɵclassProp('dynamic', ctx.exp);
 *   }
 * })
 * ```
 *
 * In the above case the linked list will contain one item:
 *
 * ```ts
 *   // assume binding location: 10 for `ɵɵclassProp('dynamic', ctx.exp);`
 *   tData[10] = <TStylingStatic>[
 *     '': 'dynamic', // This is the wrapped value of `TStylingKey`
 *     'DIR': true,   // This is the default static value of directive binding.
 *   ];
 *   tData[10 + 1] = 0; // We don't have prev/next.
 *
 *   lView[10] = undefined;     // assume `ctx.exp` is `undefined`
 *   lView[10 + 1] = undefined; // Just normalized `lView[10]`
 * ```
 *
 * So when the function is resolving styling value, it first needs to look into the linked list
 * (there is none) and than into the static `TStylingStatic` too see if there is a default value for
 * `dynamic` (there is not). Therefore it is safe to remove it.
 *
 * If setting `true` case:
 * ```ts
 *   lView[10] = true;     // assume `ctx.exp` is `true`
 *   lView[10 + 1] = true; // Just normalized `lView[10]`
 * ```
 * So when the function is resolving styling value, it first needs to look into the linked list
 * (there is none) and than into `TNode.residualClass` (TNode.residualStyle) which contains
 * ```ts
 *   tNode.residualClass = [
 *     'TEMPLATE': true,
 *   ];
 * ```
 *
 * This means that it is safe to add class.
 */
interface TStylingStatic extends KeyValueArray<any> {
}
/**
 * This is a branded number which contains previous and next index.
 *
 * When we come across styling instructions we need to store the `TStylingKey` in the correct
 * order so that we can re-concatenate the styling value in the desired priority.
 *
 * The insertion can happen either at the:
 * - end of template as in the case of coming across additional styling instruction in the template
 * - in front of the template in the case of coming across additional instruction in the
 *   `hostBindings`.
 *
 * We use `TStylingRange` to store the previous and next index into the `TData` where the template
 * bindings can be found.
 *
 * - bit 0 is used to mark that the previous index has a duplicate for current value.
 * - bit 1 is used to mark that the next index has a duplicate for the current value.
 * - bits 2-16 are used to encode the next/tail of the template.
 * - bits 17-32 are used to encode the previous/head of template.
 *
 * NODE: *duplicate* false implies that it is statically known that this binding will not collide
 * with other bindings and therefore there is no need to check other bindings. For example the
 * bindings in `<div [style.color]="exp" [style.width]="exp">` will never collide and will have
 * their bits set accordingly. Previous duplicate means that we may need to check previous if the
 * current binding is `null`. Next duplicate means that we may need to check next bindings if the
 * current binding is not `null`.
 *
 * NOTE: `0` has special significance and represents `null` as in no additional pointer.
 */
type TStylingRange = number & {
    __brand__: 'TStylingRange';
};

/**
 * A set of marker values to be used in the attributes arrays. These markers indicate that some
 * items are not regular attributes and the processing should be adapted accordingly.
 */
declare const enum AttributeMarker {
    /**
     * An implicit marker which indicates that the value in the array are of `attributeKey`,
     * `attributeValue` format.
     *
     * NOTE: This is implicit as it is the type when no marker is present in array. We indicate that
     * it should not be present at runtime by the negative number.
     */
    ImplicitAttributes = -1,
    /**
     * Marker indicates that the following 3 values in the attributes array are:
     * namespaceUri, attributeName, attributeValue
     * in that order.
     */
    NamespaceURI = 0,
    /**
     * Signals class declaration.
     *
     * Each value following `Classes` designates a class name to include on the element.
     * ## Example:
     *
     * Given:
     * ```html
     * <div class="foo bar baz">...</div>
     * ```
     *
     * the generated code is:
     * ```ts
     * var _c1 = [AttributeMarker.Classes, 'foo', 'bar', 'baz'];
     * ```
     */
    Classes = 1,
    /**
     * Signals style declaration.
     *
     * Each pair of values following `Styles` designates a style name and value to include on the
     * element.
     * ## Example:
     *
     * Given:
     * ```html
     * <div style="width:100px; height:200px; color:red">...</div>
     * ```
     *
     * the generated code is:
     * ```ts
     * var _c1 = [AttributeMarker.Styles, 'width', '100px', 'height'. '200px', 'color', 'red'];
     * ```
     */
    Styles = 2,
    /**
     * Signals that the following attribute names were extracted from input or output bindings.
     *
     * For example, given the following HTML:
     *
     * ```html
     * <div moo="car" [foo]="exp" (bar)="doSth()">
     * ```
     *
     * the generated code is:
     *
     * ```ts
     * var _c1 = ['moo', 'car', AttributeMarker.Bindings, 'foo', 'bar'];
     * ```
     */
    Bindings = 3,
    /**
     * Signals that the following attribute names were hoisted from an inline-template declaration.
     *
     * For example, given the following HTML:
     *
     * ```html
     * <div *ngFor="let value of values; trackBy:trackBy" dirA [dirB]="value">
     * ```
     *
     * the generated code for the `template()` instruction would include:
     *
     * ```
     * ['dirA', '', AttributeMarker.Bindings, 'dirB', AttributeMarker.Template, 'ngFor', 'ngForOf',
     * 'ngForTrackBy', 'let-value']
     * ```
     *
     * while the generated code for the `element()` instruction inside the template function would
     * include:
     *
     * ```
     * ['dirA', '', AttributeMarker.Bindings, 'dirB']
     * ```
     */
    Template = 4,
    /**
     * Signals that the following attribute is `ngProjectAs` and its value is a parsed
     * `CssSelector`.
     *
     * For example, given the following HTML:
     *
     * ```html
     * <h1 attr="value" ngProjectAs="[title]">
     * ```
     *
     * the generated code for the `element()` instruction would include:
     *
     * ```ts
     * ['attr', 'value', AttributeMarker.ProjectAs, ['', 'title', '']]
     * ```
     */
    ProjectAs = 5,
    /**
     * Signals that the following attribute will be translated by runtime i18n
     *
     * For example, given the following HTML:
     *
     * ```html
     * <div moo="car" foo="value" i18n-foo [bar]="binding" i18n-bar>
     * ```
     *
     * the generated code is:
     *
     * ```ts
     * var _c1 = ['moo', 'car', AttributeMarker.I18n, 'foo', 'bar'];
     * ```
     */
    I18n = 6
}

/**
 * Expresses a single CSS Selector.
 *
 * Beginning of array
 * - First index: element name
 * - Subsequent odd indices: attr keys
 * - Subsequent even indices: attr values
 *
 * After SelectorFlags.CLASS flag
 * - Class name values
 *
 * SelectorFlags.NOT flag
 * - Changes the mode to NOT
 * - Can be combined with other flags to set the element / attr / class mode
 *
 * e.g. SelectorFlags.NOT | SelectorFlags.ELEMENT
 *
 * Example:
 * Original: `div.foo.bar[attr1=val1][attr2]`
 * Parsed: ['div', 'attr1', 'val1', 'attr2', '', SelectorFlags.CLASS, 'foo', 'bar']
 *
 * Original: 'div[attr1]:not(.foo[attr2])
 * Parsed: [
 *  'div', 'attr1', '',
 *  SelectorFlags.NOT | SelectorFlags.ATTRIBUTE 'attr2', '', SelectorFlags.CLASS, 'foo'
 * ]
 *
 * See more examples in node_selector_matcher_spec.ts
 */
type CssSelector = (string | SelectorFlags)[];
/**
 * A list of CssSelectors.
 *
 * A directive or component can have multiple selectors. This type is used for
 * directive defs so any of the selectors in the list will match that directive.
 *
 * Original: 'form, [ngForm]'
 * Parsed: [['form'], ['', 'ngForm', '']]
 */
type CssSelectorList = CssSelector[];
/**
 * List of slots for a projection. A slot can be either based on a parsed CSS selector
 * which will be used to determine nodes which are projected into that slot.
 *
 * When set to "*", the slot is reserved and can be used for multi-slot projection
 * using {@link ViewContainerRef#createComponent}. The last slot that specifies the
 * wildcard selector will retrieve all projectable nodes which do not match any selector.
 */
type ProjectionSlots = (CssSelectorList | '*')[];
/** Flags used to build up CssSelectors */
declare const enum SelectorFlags {
    /** Indicates this is the beginning of a new negative selector */
    NOT = 1,
    /** Mode for matching attributes */
    ATTRIBUTE = 2,
    /** Mode for matching tag names */
    ELEMENT = 4,
    /** Mode for matching class names */
    CLASS = 8
}

/**
 * TNodeType corresponds to the {@link TNode} `type` property.
 *
 * NOTE: type IDs are such that we use each bit to denote a type. This is done so that we can easily
 * check if the `TNode` is of more than one type.
 *
 * `if (tNode.type === TNodeType.Text || tNode.type === TNode.Element)`
 * can be written as:
 * `if (tNode.type & (TNodeType.Text | TNodeType.Element))`
 *
 * However any given `TNode` can only be of one type.
 */
declare const enum TNodeType {
    /**
     * The TNode contains information about a DOM element aka {@link RText}.
     */
    Text = 1,
    /**
     * The TNode contains information about a DOM element aka {@link RElement}.
     */
    Element = 2,
    /**
     * The TNode contains information about an {@link LContainer} for embedded views.
     */
    Container = 4,
    /**
     * The TNode contai   ns information about an `<ng-container>` element {@link RNode}.
     */
    ElementContainer = 8,
    /**
     * The TNode contains information about an `<ng-content>` projection
     */
    Projection = 16,
    /**
     * The TNode contains information about an ICU comment used in `i18n`.
     */
    Icu = 32,
    /**
     * Special node type representing a placeholder for future `TNode` at this location.
     *
     * I18n translation blocks are created before the element nodes which they contain. (I18n blocks
     * can span over many elements.) Because i18n `TNode`s (representing text) are created first they
     * often may need to point to element `TNode`s which are not yet created. In such a case we create
     * a `Placeholder` `TNode`. This allows the i18n to structurally link the `TNode`s together
     * without knowing any information about the future nodes which will be at that location.
     *
     * On `firstCreatePass` When element instruction executes it will try to create a `TNode` at that
     * location. Seeing a `Placeholder` `TNode` already there tells the system that it should reuse
     * existing `TNode` (rather than create a new one) and just update the missing information.
     */
    Placeholder = 64,
    /**
     * The TNode contains information about a `@let` declaration.
     */
    LetDeclaration = 128,
    AnyRNode = 3,// Text | Element
    AnyContainer = 12
}
/**
 * Corresponds to the TNode.flags property.
 */
declare const enum TNodeFlags {
    /** Bit #1 - This bit is set if the node is a host for any directive (including a component) */
    isDirectiveHost = 1,
    /** Bit #2 - This bit is set if the node has been projected */
    isProjected = 2,
    /** Bit #3 - This bit is set if any directive on this node has content queries */
    hasContentQuery = 4,
    /** Bit #4 - This bit is set if the node has any "class" inputs */
    hasClassInput = 8,
    /** Bit #5 - This bit is set if the node has any "style" inputs */
    hasStyleInput = 16,
    /** Bit #6 - This bit is set if the node has been detached by i18n */
    isDetached = 32,
    /**
     * Bit #7 - This bit is set if the node has directives with host bindings.
     *
     * This flags allows us to guard host-binding logic and invoke it only on nodes
     * that actually have directives with host bindings.
     */
    hasHostBindings = 64,
    /**
     * Bit #8 - This bit is set if the node is a located inside skip hydration block.
     */
    inSkipHydrationBlock = 128
}
/**
 * Corresponds to the TNode.providerIndexes property.
 */
declare const enum TNodeProviderIndexes {
    /** The index of the first provider on this node is encoded on the least significant bits. */
    ProvidersStartIndexMask = 1048575,
    /**
     * The count of view providers from the component on this node is
     * encoded on the 20 most significant bits.
     */
    CptViewProvidersCountShift = 20,
    CptViewProvidersCountShifter = 1048576
}
/**
 * A combination of:
 * - Attribute names and values.
 * - Special markers acting as flags to alter attributes processing.
 * - Parsed ngProjectAs selectors.
 */
type TAttributes = (string | AttributeMarker | CssSelector)[];
/**
 * Constants that are associated with a view. Includes:
 * - Attribute arrays.
 * - Local definition arrays.
 * - Translated messages (i18n).
 */
type TConstants = (TAttributes | string)[];
/**
 * Factory function that returns an array of consts. Consts can be represented as a function in
 * case any additional statements are required to define consts in the list. An example is i18n
 * where additional i18n calls are generated, which should be executed when consts are requested
 * for the first time.
 */
type TConstantsFactory = () => TConstants;
/**
 * TConstants type that describes how the `consts` field is generated on ComponentDef: it can be
 * either an array or a factory function that returns that array.
 */
type TConstantsOrFactory = TConstants | TConstantsFactory;
/**
 * Binding data (flyweight) for a particular node that is shared between all templates
 * of a specific type.
 *
 * If a property is:
 *    - PropertyAliases: that property's data was generated and this is it
 *    - Null: that property's data was already generated and nothing was found.
 *    - Undefined: that property's data has not yet been generated
 *
 * see: https://en.wikipedia.org/wiki/Flyweight_pattern for more on the Flyweight pattern
 */
interface TNode {
    /** The type of the TNode. See TNodeType. */
    type: TNodeType;
    /**
     * Index of the TNode in TView.data and corresponding native element in LView.
     *
     * This is necessary to get from any TNode to its corresponding native element when
     * traversing the node tree.
     *
     * If index is -1, this is a dynamically created container node or embedded view node.
     */
    index: number;
    /**
     * Insert before existing DOM node index.
     *
     * When DOM nodes are being inserted, normally they are being appended as they are created.
     * Under i18n case, the translated text nodes are created ahead of time as part of the
     * `ɵɵi18nStart` instruction which means that this `TNode` can't just be appended and instead
     * needs to be inserted using `insertBeforeIndex` semantics.
     *
     * Additionally sometimes it is necessary to insert new text nodes as a child of this `TNode`. In
     * such a case the value stores an array of text nodes to insert.
     *
     * Example:
     * ```html
     * <div i18n>
     *   Hello <span>World</span>!
     * </div>
     * ```
     * In the above example the `ɵɵi18nStart` instruction can create `Hello `, `World` and `!` text
     * nodes. It can also insert `Hello ` and `!` text node as a child of `<div>`, but it can't
     * insert `World` because the `<span>` node has not yet been created. In such a case the
     * `<span>` `TNode` will have an array which will direct the `<span>` to not only insert
     * itself in front of `!` but also to insert the `World` (created by `ɵɵi18nStart`) into
     * `<span>` itself.
     *
     * Pseudo code:
     * ```ts
     *   if (insertBeforeIndex === null) {
     *     // append as normal
     *   } else if (Array.isArray(insertBeforeIndex)) {
     *     // First insert current `TNode` at correct location
     *     const currentNode = lView[this.index];
     *     parentNode.insertBefore(currentNode, lView[this.insertBeforeIndex[0]]);
     *     // Now append all of the children
     *     for(let i=1; i<this.insertBeforeIndex; i++) {
     *       currentNode.appendChild(lView[this.insertBeforeIndex[i]]);
     *     }
     *   } else {
     *     parentNode.insertBefore(lView[this.index], lView[this.insertBeforeIndex])
     *   }
     * ```
     * - null: Append as normal using `parentNode.appendChild`
     * - `number`: Append using
     *      `parentNode.insertBefore(lView[this.index], lView[this.insertBeforeIndex])`
     *
     * *Initialization*
     *
     * Because `ɵɵi18nStart` executes before nodes are created, on `TView.firstCreatePass` it is not
     * possible for `ɵɵi18nStart` to set the `insertBeforeIndex` value as the corresponding `TNode`
     * has not yet been created. For this reason the `ɵɵi18nStart` creates a `TNodeType.Placeholder`
     * `TNode` at that location. See `TNodeType.Placeholder` for more information.
     */
    insertBeforeIndex: InsertBeforeIndex;
    /**
     * The index of the closest injector in this node's LView.
     *
     * If the index === -1, there is no injector on this node or any ancestor node in this view.
     *
     * If the index !== -1, it is the index of this node's injector OR the index of a parent
     * injector in the same view. We pass the parent injector index down the node tree of a view so
     * it's possible to find the parent injector without walking a potentially deep node tree.
     * Injector indices are not set across view boundaries because there could be multiple component
     * hosts.
     *
     * If tNode.injectorIndex === tNode.parent.injectorIndex, then the index belongs to a parent
     * injector.
     */
    injectorIndex: number;
    /** Stores starting index of the directives. */
    directiveStart: number;
    /**
     * Stores final exclusive index of the directives.
     *
     * The area right behind the `directiveStart-directiveEnd` range is used to allocate the
     * `HostBindingFunction` `vars` (or null if no bindings.) Therefore `directiveEnd` is used to set
     * `LFrame.bindingRootIndex` before `HostBindingFunction` is executed.
     */
    directiveEnd: number;
    /**
     * Offset from the `directiveStart` at which the component (one at most) of the node is stored.
     * Set to -1 if no components have been applied to the node. Component index can be found using
     * `directiveStart + componentOffset`.
     */
    componentOffset: number;
    /**
     * Stores the last directive which had a styling instruction.
     *
     * Initial value of this is `-1` which means that no `hostBindings` styling instruction has
     * executed. As `hostBindings` instructions execute they set the value to the index of the
     * `DirectiveDef` which contained the last `hostBindings` styling instruction.
     *
     * Valid values are:
     * - `-1` No `hostBindings` instruction has executed.
     * - `directiveStart <= directiveStylingLast < directiveEnd`: Points to the `DirectiveDef` of
     * the last styling instruction which executed in the `hostBindings`.
     *
     * This data is needed so that styling instructions know which static styling data needs to be
     * collected from the `DirectiveDef.hostAttrs`. A styling instruction needs to collect all data
     * since last styling instruction.
     */
    directiveStylingLast: number;
    /**
     * Stores indexes of property bindings. This field is only set in the ngDevMode and holds
     * indexes of property bindings so TestBed can get bound property metadata for a given node.
     */
    propertyBindings: number[] | null;
    /**
     * Stores if Node isComponent, isProjected, hasContentQuery, hasClassInput and hasStyleInput
     * etc.
     */
    flags: TNodeFlags;
    /**
     * This number stores two values using its bits:
     *
     * - the index of the first provider on that node (first 16 bits)
     * - the count of view providers from the component on this node (last 16 bits)
     */
    providerIndexes: TNodeProviderIndexes;
    /**
     * The value name associated with this node.
     * if type:
     *   `TNodeType.Text`: text value
     *   `TNodeType.Element`: tag name
     *   `TNodeType.ICUContainer`: `TIcu`
     */
    value: any;
    /**
     * Attributes associated with an element. We need to store attributes to support various
     * use-cases (attribute injection, content projection with selectors, directives matching).
     * Attributes are stored statically because reading them from the DOM would be way too slow for
     * content projection and queries.
     *
     * Since attrs will always be calculated first, they will never need to be marked undefined by
     * other instructions.
     *
     * For regular attributes a name of an attribute and its value alternate in the array.
     * e.g. ['role', 'checkbox']
     * This array can contain flags that will indicate "special attributes" (attributes with
     * namespaces, attributes extracted from bindings and outputs).
     */
    attrs: TAttributes | null;
    /**
     * Same as `TNode.attrs` but contains merged data across all directive host bindings.
     *
     * We need to keep `attrs` as unmerged so that it can be used for attribute selectors.
     * We merge attrs here so that it can be used in a performant way for initial rendering.
     *
     * The `attrs` are merged in first pass in following order:
     * - Component's `hostAttrs`
     * - Directives' `hostAttrs`
     * - Template `TNode.attrs` associated with the current `TNode`.
     */
    mergedAttrs: TAttributes | null;
    /**
     * A set of local names under which a given element is exported in a template and
     * visible to queries. An entry in this array can be created for different reasons:
     * - an element itself is referenced, ex.: `<div #foo>`
     * - a component is referenced, ex.: `<my-cmpt #foo>`
     * - a directive is referenced, ex.: `<my-cmpt #foo="directiveExportAs">`.
     *
     * A given element might have different local names and those names can be associated
     * with a directive. We store local names at even indexes while odd indexes are reserved
     * for directive index in a view (or `-1` if there is no associated directive).
     *
     * Some examples:
     * - `<div #foo>` => `["foo", -1]`
     * - `<my-cmpt #foo>` => `["foo", myCmptIdx]`
     * - `<my-cmpt #foo #bar="directiveExportAs">` => `["foo", myCmptIdx, "bar", directiveIdx]`
     * - `<div #foo #bar="directiveExportAs">` => `["foo", -1, "bar", directiveIdx]`
     */
    localNames: (string | number)[] | null;
    /** Information about input properties that need to be set once from attribute data. */
    initialInputs: InitialInputData | null;
    /**
     * Input data for all directives on this node. `null` means that there are no directives with
     * inputs on this node.
     */
    inputs: NodeInputBindings | null;
    /**
     * Input data for host directives applied to the node.
     */
    hostDirectiveInputs: HostDirectiveInputs | null;
    /**
     * Output data for all directives on this node. `null` means that there are no directives with
     * outputs on this node.
     */
    outputs: NodeOutputBindings | null;
    /**
     * Input data for host directives applied to the node.
     */
    hostDirectiveOutputs: HostDirectiveOutputs | null;
    /**
     * Mapping between directive classes applied to the node and their indexes.
     */
    directiveToIndex: DirectiveIndexMap | null;
    /**
     * The TView attached to this node.
     *
     * If this TNode corresponds to an LContainer with a template (e.g. structural
     * directive), the template's TView will be stored here.
     *
     * If this TNode corresponds to an element, tView will be `null`.
     */
    tView: TView | null;
    /**
     * The next sibling node. Necessary so we can propagate through the root nodes of a view
     * to insert them or remove them from the DOM.
     */
    next: TNode | null;
    /**
     * The previous sibling node.
     * This simplifies operations when we need a pointer to the previous node.
     */
    prev: TNode | null;
    /**
     * The next projected sibling. Since in Angular content projection works on the node-by-node
     * basis the act of projecting nodes might change nodes relationship at the insertion point
     * (target view). At the same time we need to keep initial relationship between nodes as
     * expressed in content view.
     */
    projectionNext: TNode | null;
    /**
     * First child of the current node.
     *
     * For component nodes, the child will always be a ContentChild (in same view).
     * For embedded view nodes, the child will be in their child view.
     */
    child: TNode | null;
    /**
     * Parent node (in the same view only).
     *
     * We need a reference to a node's parent so we can append the node to its parent's native
     * element at the appropriate time.
     *
     * If the parent would be in a different view (e.g. component host), this property will be null.
     * It's important that we don't try to cross component boundaries when retrieving the parent
     * because the parent will change (e.g. index, attrs) depending on where the component was
     * used (and thus shouldn't be stored on TNode). In these cases, we retrieve the parent through
     * LView.node instead (which will be instance-specific).
     *
     * If this is an inline view node (V), the parent will be its container.
     */
    parent: TElementNode | TContainerNode | null;
    /**
     * List of projected TNodes for a given component host element OR index into the said nodes.
     *
     * For easier discussion assume this example:
     * `<parent>`'s view definition:
     * ```html
     * <child id="c1">content1</child>
     * <child id="c2"><span>content2</span></child>
     * ```
     * `<child>`'s view definition:
     * ```html
     * <ng-content id="cont1"></ng-content>
     * ```
     *
     * If `Array.isArray(projection)` then `TNode` is a host element:
     * - `projection` stores the content nodes which are to be projected.
     *    - The nodes represent categories defined by the selector: For example:
     *      `<ng-content/><ng-content select="abc"/>` would represent the heads for `<ng-content/>`
     *      and `<ng-content select="abc"/>` respectively.
     *    - The nodes we store in `projection` are heads only, we used `.next` to get their
     *      siblings.
     *    - The nodes `.next` is sorted/rewritten as part of the projection setup.
     *    - `projection` size is equal to the number of projections `<ng-content>`. The size of
     *      `c1` will be `1` because `<child>` has only one `<ng-content>`.
     * - we store `projection` with the host (`c1`, `c2`) rather than the `<ng-content>` (`cont1`)
     *   because the same component (`<child>`) can be used in multiple locations (`c1`, `c2`) and
     * as a result have different set of nodes to project.
     * - without `projection` it would be difficult to efficiently traverse nodes to be projected.
     *
     * If `typeof projection == 'number'` then `TNode` is a `<ng-content>` element:
     * - `projection` is an index of the host's `projection`Nodes.
     *   - This would return the first head node to project:
     *     `getHost(currentTNode).projection[currentTNode.projection]`.
     * - When projecting nodes the parent node retrieved may be a `<ng-content>` node, in which case
     *   the process is recursive in nature.
     *
     * If `projection` is of type `RNode[][]` than we have a collection of native nodes passed as
     * projectable nodes during dynamic component creation.
     */
    projection: (TNode | RNode[])[] | number | null;
    /**
     * A collection of all `style` static values for an element (including from host).
     *
     * This field will be populated if and when:
     *
     * - There are one or more initial `style`s on an element (e.g. `<div style="width:200px;">`)
     * - There are one or more initial `style`s on a directive/component host
     *   (e.g. `@Directive({host: {style: "width:200px;" } }`)
     */
    styles: string | null;
    /**
     * A collection of all `style` static values for an element excluding host sources.
     *
     * Populated when there are one or more initial `style`s on an element
     * (e.g. `<div style="width:200px;">`)
     * Must be stored separately from `tNode.styles` to facilitate setting directive
     * inputs that shadow the `style` property. If we used `tNode.styles` as is for shadowed inputs,
     * we would feed host styles back into directives as "inputs". If we used `tNode.attrs`, we
     * would have to concatenate the attributes on every template pass. Instead, we process once on
     * first create pass and store here.
     */
    stylesWithoutHost: string | null;
    /**
     * A `KeyValueArray` version of residual `styles`.
     *
     * When there are styling instructions than each instruction stores the static styling
     * which is of lower priority than itself. This means that there may be a higher priority
     * styling than the instruction.
     *
     * Imagine:
     * ```angular-ts
     * <div style="color: highest;" my-dir>
     *
     * @Directive({
     *   host: {
     *     style: 'color: lowest; ',
     *     '[styles.color]': 'exp' // ɵɵstyleProp('color', ctx.exp);
     *   }
     * })
     * ```
     *
     * In the above case:
     * - `color: lowest` is stored with `ɵɵstyleProp('color', ctx.exp);` instruction
     * -  `color: highest` is the residual and is stored here.
     *
     * - `undefined': not initialized.
     * - `null`: initialized but `styles` is `null`
     * - `KeyValueArray`: parsed version of `styles`.
     */
    residualStyles: KeyValueArray<any> | undefined | null;
    /**
     * A collection of all class static values for an element (including from host).
     *
     * This field will be populated if and when:
     *
     * - There are one or more initial classes on an element (e.g. `<div class="one two three">`)
     * - There are one or more initial classes on an directive/component host
     *   (e.g. `@Directive({host: {class: "SOME_CLASS" } }`)
     */
    classes: string | null;
    /**
     * A collection of all class static values for an element excluding host sources.
     *
     * Populated when there are one or more initial classes on an element
     * (e.g. `<div class="SOME_CLASS">`)
     * Must be stored separately from `tNode.classes` to facilitate setting directive
     * inputs that shadow the `class` property. If we used `tNode.classes` as is for shadowed
     * inputs, we would feed host classes back into directives as "inputs". If we used
     * `tNode.attrs`, we would have to concatenate the attributes on every template pass. Instead,
     * we process once on first create pass and store here.
     */
    classesWithoutHost: string | null;
    /**
     * A `KeyValueArray` version of residual `classes`.
     *
     * Same as `TNode.residualStyles` but for classes.
     *
     * - `undefined': not initialized.
     * - `null`: initialized but `classes` is `null`
     * - `KeyValueArray`: parsed version of `classes`.
     */
    residualClasses: KeyValueArray<any> | undefined | null;
    /**
     * Stores the head/tail index of the class bindings.
     *
     * - If no bindings, the head and tail will both be 0.
     * - If there are template bindings, stores the head/tail of the class bindings in the template.
     * - If no template bindings but there are host bindings, the head value will point to the last
     *   host binding for "class" (not the head of the linked list), tail will be 0.
     *
     * See: `style_binding_list.ts` for details.
     *
     * This is used by `insertTStylingBinding` to know where the next styling binding should be
     * inserted so that they can be sorted in priority order.
     */
    classBindings: TStylingRange;
    /**
     * Stores the head/tail index of the class bindings.
     *
     * - If no bindings, the head and tail will both be 0.
     * - If there are template bindings, stores the head/tail of the style bindings in the template.
     * - If no template bindings but there are host bindings, the head value will point to the last
     *   host binding for "style" (not the head of the linked list), tail will be 0.
     *
     * See: `style_binding_list.ts` for details.
     *
     * This is used by `insertTStylingBinding` to know where the next styling binding should be
     * inserted so that they can be sorted in priority order.
     */
    styleBindings: TStylingRange;
}
/**
 * See `TNode.insertBeforeIndex`
 */
type InsertBeforeIndex = null | number | number[];
/** Static data for an element  */
interface TElementNode extends TNode {
    /** Index in the data[] array */
    index: number;
    child: TElementNode | TTextNode | TElementContainerNode | TContainerNode | TProjectionNode | null;
    /**
     * Element nodes will have parents unless they are the first node of a component or
     * embedded view (which means their parent is in a different view and must be
     * retrieved using viewData[HOST_NODE]).
     */
    parent: TElementNode | TElementContainerNode | null;
    tView: null;
    /**
     * If this is a component TNode with projection, this will be an array of projected
     * TNodes or native nodes (see TNode.projection for more info). If it's a regular element node
     * or a component without projection, it will be null.
     */
    projection: (TNode | RNode[])[] | null;
    /**
     * Stores TagName
     */
    value: string;
}
/** Static data for a text node */
interface TTextNode extends TNode {
    /** Index in the data[] array */
    index: number;
    child: null;
    /**
     * Text nodes will have parents unless they are the first node of a component or
     * embedded view (which means their parent is in a different view and must be
     * retrieved using LView.node).
     */
    parent: TElementNode | TElementContainerNode | null;
    tView: null;
    projection: null;
}
/** Static data for an LContainer */
interface TContainerNode extends TNode {
    /**
     * Index in the data[] array.
     *
     * If it's -1, this is a dynamically created container node that isn't stored in
     * data[] (e.g. when you inject ViewContainerRef) .
     */
    index: number;
    child: null;
    /**
     * Container nodes will have parents unless:
     *
     * - They are the first node of a component or embedded view
     * - They are dynamically created
     */
    parent: TElementNode | TElementContainerNode | null;
    tView: TView | null;
    projection: null;
    value: null;
}
/** Static data for an <ng-container> */
interface TElementContainerNode extends TNode {
    /** Index in the LView[] array. */
    index: number;
    child: TElementNode | TTextNode | TContainerNode | TElementContainerNode | TProjectionNode | null;
    parent: TElementNode | TElementContainerNode | null;
    tView: null;
    projection: null;
}
/** Static data for an LProjectionNode  */
interface TProjectionNode extends TNode {
    /** Index in the data[] array */
    child: null;
    /**
     * Projection nodes will have parents unless they are the first node of a component
     * or embedded view (which means their parent is in a different view and must be
     * retrieved using LView.node).
     */
    parent: TElementNode | TElementContainerNode | null;
    tView: null;
    /** Index of the projection node. (See TNode.projection for more info.) */
    projection: number;
    value: null;
}
/**
 * Maps the public names of outputs available on a specific node to the index
 * of the directive instance that defines the output, for example:
 *
 * ```
 * {
 *   "publicName": [0, 5]
 * }
 * ```
 */
type NodeOutputBindings = Record<string, number[]>;
/**
 * Maps the public names of inputs applied to a specific node to the index of the
 * directive instance to which the input value should be written, for example:
 *
 * ```
 * {
 *   "publicName": [0, 5]
 * }
 * ```
 */
type NodeInputBindings = Record<string, number[]>;
/**
 * This array contains information about input properties that
 * need to be set once from attribute data. It's ordered by
 * directive index (relative to element) so it's simple to
 * look up a specific directive's initial input data.
 *
 * Within each sub-array:
 *
 * i+0: public name
 * i+1: initial value
 *
 * If a directive on a node does not have any input properties
 * that should be set from attributes, its index is set to null
 * to avoid a sparse array.
 *
 * e.g. [null, ['role-min', 'minified-input', 'button']]
 */
type InitialInputData = (InitialInputs | null)[];
/**
 * Used by InitialInputData to store input properties
 * that should be set once from attributes.
 *
 * i+0: attribute name
 * i+1: minified/internal input name
 * i+2: input flags
 * i+3: initial value
 *
 * e.g. ['role-min', 'minified-input', 'button']
 */
type InitialInputs = string[];
/**
 * Represents inputs coming from a host directive and exposed on a TNode.
 *
 * - The key is the public name of an input as it is exposed on the specific node.
 * - The value is an array where:
 *   - i+0: Index of the host directive that should be written to.
 *   - i+1: Public name of the input as it was defined on the host directive before aliasing.
 */
type HostDirectiveInputs = Record<string, (number | string)[]>;
/**
 * Represents outputs coming from a host directive and exposed on a TNode.
 *
 * - The key is the public name of an output as it is exposed on the specific node.
 * - The value is an array where:
 *   - i+0: Index of the host directive on which the output is defined..
 *   - i+1: Public name of the output as it was defined on the host directive before aliasing.
 */
type HostDirectiveOutputs = Record<string, (number | string)[]>;
/**
 * Represents a map between a class reference and the index at which its directive is available on
 * a specific TNode. The value can be either:
 *   1. A number means that there's only one selector-matched directive on the node and it
 *      doesn't have any host directives.
 *   2. An array means that there's a selector-matched directive and it has host directives.
 *      The array is structured as follows:
 *        - 0: Index of the selector-matched directive.
 *        - 1: Start index of the range within which the host directives are defined.
 *        - 2: End of the host directive range.
 *
 * Example:
 * ```
 * Map {
 *   [NoHostDirectives]: 5,
 *   [HasHostDirectives]: [10, 6, 8],
 * }
 * ```
 */
type DirectiveIndexMap = Map<Type$1<unknown>, number | [directiveIndex: number, hostDirectivesStart: number, hostDirectivesEnd: number]>;
/**
 * Type representing a set of TNodes that can have local refs (`#foo`) placed on them.
 */
type TNodeWithLocalRefs = TContainerNode | TElementNode | TElementContainerNode;
/**
 * Type for a function that extracts a value for a local refs.
 * Example:
 * - `<div #nativeDivEl>` - `nativeDivEl` should point to the native `<div>` element;
 * - `<ng-template #tplRef>` - `tplRef` should point to the `TemplateRef` instance;
 */
type LocalRefExtractor = (tNode: TNodeWithLocalRefs, currentView: LView) => any;

/**
 * Special location which allows easy identification of type. If we have an array which was
 * retrieved from the `LView` and that array has `true` at `TYPE` location, we know it is
 * `LContainer`.
 */
declare const TYPE = 1;
/**
 * Below are constants for LContainer indices to help us look up LContainer members
 * without having to remember the specific indices.
 * Uglify will inline these when minifying so there shouldn't be a cost.
 */
declare const DEHYDRATED_VIEWS = 6;
declare const NATIVE = 7;
declare const VIEW_REFS = 8;
declare const MOVED_VIEWS = 9;
/**
 * Size of LContainer's header. Represents the index after which all views in the
 * container will be inserted. We need to keep a record of current views so we know
 * which views are already in the DOM (and don't need to be re-added) and so we can
 * remove views from the DOM when they are no longer required.
 */
declare const CONTAINER_HEADER_OFFSET = 10;
/**
 * The state associated with a container.
 *
 * This is an array so that its structure is closer to LView. This helps
 * when traversing the view tree (which is a mix of containers and component
 * views), so we can jump to viewOrContainer[NEXT] in the same way regardless
 * of type.
 */
interface LContainer extends Array<any> {
    /**
     * The host element of this LContainer.
     *
     * The host could be an LView if this container is on a component node.
     * In that case, the component LView is its HOST.
     */
    readonly [HOST]: RElement | RComment | LView;
    /**
     * This is a type field which allows us to differentiate `LContainer` from `StylingContext` in an
     * efficient way. The value is always set to `true`
     */
    [TYPE]: true;
    /** Flags for this container. See LContainerFlags for more info. */
    [FLAGS]: LContainerFlags;
    /**
     * Access to the parent view is necessary so we can propagate back
     * up from inside a container to parent[NEXT].
     */
    [PARENT]: LView;
    /**
     * This allows us to jump from a container to a sibling container or component
     * view with the same parent, so we can remove listeners efficiently.
     */
    [NEXT]: LView | LContainer | null;
    /**
     * A collection of views created based on the underlying `<ng-template>` element but inserted into
     * a different `LContainer`. We need to track views created from a given declaration point since
     * queries collect matches from the embedded view declaration point and _not_ the insertion point.
     */
    [MOVED_VIEWS]: LView[] | null;
    /**
     * Pointer to the `TNode` which represents the host of the container.
     */
    [T_HOST]: TNode;
    /** The comment element that serves as an anchor for this LContainer. */
    [NATIVE]: RComment;
    /**
     * Array of `ViewRef`s used by any `ViewContainerRef`s that point to this container.
     *
     * This is lazily initialized by `ViewContainerRef` when the first view is inserted.
     *
     * NOTE: This is stored as `any[]` because render3 should really not be aware of `ViewRef` and
     * doing so creates circular dependency.
     */
    [VIEW_REFS]: unknown[] | null;
    /**
     * Array of dehydrated views within this container.
     *
     * This information is used during the hydration process on the client.
     * The hydration logic tries to find a matching dehydrated view, "claim" it
     * and use this information to do further matching. After that, this "claimed"
     * view is removed from the list. The remaining "unclaimed" views are
     * "garbage-collected" later on, i.e. removed from the DOM once the hydration
     * logic finishes.
     */
    [DEHYDRATED_VIEWS]: DehydratedContainerView[] | null;
}
/** Flags associated with an LContainer (saved in LContainer[FLAGS]) */
declare const enum LContainerFlags {
    None = 0,
    /**
     * Flag to signify that this `LContainer` may have transplanted views which need to be change
     * detected. (see: `LView[DECLARATION_COMPONENT_VIEW])`.
     *
     * This flag, once set, is never unset for the `LContainer`.
     */
    HasTransplantedViews = 2
}

/**
 * Injection flags for DI.
 *
 * @publicApi
 * @deprecated use an options object for [`inject`](api/core/inject) instead.
 */
declare enum InjectFlags {
    /** Check self and check parent injector if needed */
    Default = 0,
    /**
     * Specifies that an injector should retrieve a dependency from any injector until reaching the
     * host element of the current component. (Only used with Element Injector)
     */
    Host = 1,
    /** Don't ascend to ancestors of the node requesting injection. */
    Self = 2,
    /** Skip the node that is requesting injection. */
    SkipSelf = 4,
    /** Inject `defaultValue` instead if token not found. */
    Optional = 8
}
/**
 * This enum is an exact copy of the `InjectFlags` enum above, but the difference is that this is a
 * const enum, so actual enum values would be inlined in generated code. The `InjectFlags` enum can
 * be turned into a const enum when ViewEngine is removed (see TODO at the `InjectFlags` enum
 * above). The benefit of inlining is that we can use these flags at the top level without affecting
 * tree-shaking (see "no-toplevel-property-access" tslint rule for more info).
 * Keep this enum in sync with `InjectFlags` enum above.
 */
declare const enum InternalInjectFlags {
    /** Check self and check parent injector if needed */
    Default = 0,
    /**
     * Specifies that an injector should retrieve a dependency from any injector until reaching the
     * host element of the current component. (Only used with Element Injector)
     */
    Host = 1,
    /** Don't ascend to ancestors of the node requesting injection. */
    Self = 2,
    /** Skip the node that is requesting injection. */
    SkipSelf = 4,
    /** Inject `defaultValue` instead if token not found. */
    Optional = 8,
    /**
     * This token is being injected into a pipe.
     *
     * This flag is intentionally not in the public facing `InjectFlags` because it is only added by
     * the compiler and is not a developer applicable flag.
     */
    ForPipe = 16
}
/**
 * Type of the options argument to [`inject`](api/core/inject).
 *
 * @publicApi
 */
interface InjectOptions {
    /**
     * Use optional injection, and return `null` if the requested token is not found.
     */
    optional?: boolean;
    /**
     * Start injection at the parent of the current injector.
     */
    skipSelf?: boolean;
    /**
     * Only query the current injector for the token, and don't fall back to the parent injector if
     * it's not found.
     */
    self?: boolean;
    /**
     * Stop injection at the host component's injector. Only relevant when injecting from an element
     * injector, and a no-op for environment injectors.
     */
    host?: boolean;
}

/**
 * @description
 *
 * Token that can be used to retrieve an instance from an injector or through a query.
 *
 * @publicApi
 */
type ProviderToken<T> = Type$1<T> | AbstractType<T> | InjectionToken<T>;

/**
 * Concrete injectors implement this interface. Injectors are configured
 * with [providers](guide/di/dependency-injection-providers) that associate
 * dependencies of various types with [injection tokens](guide/di/dependency-injection-providers).
 *
 * @see [DI Providers](guide/di/dependency-injection-providers).
 * @see {@link StaticProvider}
 *
 * @usageNotes
 *
 *  The following example creates a service injector instance.
 *
 * {@example core/di/ts/provider_spec.ts region='ConstructorProvider'}
 *
 * ### Usage example
 *
 * {@example core/di/ts/injector_spec.ts region='Injector'}
 *
 * `Injector` returns itself when given `Injector` as a token:
 *
 * {@example core/di/ts/injector_spec.ts region='injectInjector'}
 *
 * @publicApi
 */
declare abstract class Injector {
    static THROW_IF_NOT_FOUND: {};
    static NULL: Injector;
    /**
     * Internal note on the `options?: InjectOptions|InjectFlags` override of the `get`
     * method: consider dropping the `InjectFlags` part in one of the major versions.
     * It can **not** be done in minor/patch, since it's breaking for custom injectors
     * that only implement the old `InjectorFlags` interface.
     */
    /**
     * Retrieves an instance from the injector based on the provided token.
     * @returns The instance from the injector if defined, otherwise the `notFoundValue`.
     * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.
     */
    abstract get<T>(token: ProviderToken<T>, notFoundValue: undefined, options: InjectOptions & {
        optional?: false;
    }): T;
    /**
     * Retrieves an instance from the injector based on the provided token.
     * @returns The instance from the injector if defined, otherwise the `notFoundValue`.
     * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.
     */
    abstract get<T>(token: ProviderToken<T>, notFoundValue: null | undefined, options: InjectOptions): T | null;
    /**
     * Retrieves an instance from the injector based on the provided token.
     * @returns The instance from the injector if defined, otherwise the `notFoundValue`.
     * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.
     */
    abstract get<T>(token: ProviderToken<T>, notFoundValue?: T, options?: InjectOptions | InjectFlags): T;
    /**
     * Retrieves an instance from the injector based on the provided token.
     * @returns The instance from the injector if defined, otherwise the `notFoundValue`.
     * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.
     * @deprecated use object-based flags (`InjectOptions`) instead.
     */
    abstract get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): T;
    /**
     * @deprecated from v4.0.0 use ProviderToken<T>
     * @suppress {duplicate}
     */
    abstract get(token: any, notFoundValue?: any): any;
    /**
     * @deprecated from v5 use the new signature Injector.create(options)
     */
    static create(providers: StaticProvider[], parent?: Injector): Injector;
    /**
     * Creates a new injector instance that provides one or more dependencies,
     * according to a given type or types of `StaticProvider`.
     *
     * @param options An object with the following properties:
     * * `providers`: An array of providers of the [StaticProvider type](api/core/StaticProvider).
     * * `parent`: (optional) A parent injector.
     * * `name`: (optional) A developer-defined identifying name for the new injector.
     *
     * @returns The new injector instance.
     *
     */
    static create(options: {
        providers: Array<Provider | StaticProvider>;
        parent?: Injector;
        name?: string;
    }): Injector;
    /** @nocollapse */
    static ɵprov: unknown;
}

/**
 * Information about how a type or `InjectionToken` interfaces with the DI system.
 *
 * At a minimum, this includes a `factory` which defines how to create the given type `T`, possibly
 * requesting injection of other types if necessary.
 *
 * Optionally, a `providedIn` parameter specifies that the given type belongs to a particular
 * `Injector`, `NgModule`, or a special scope (e.g. `'root'`). A value of `null` indicates
 * that the injectable does not belong to any scope.
 *
 * @codeGenApi
 * @publicApi The ViewEngine compiler emits code with this type for injectables. This code is
 *   deployed to npm, and should be treated as public api.

 */
interface ɵɵInjectableDeclaration<T> {
    /**
     * Specifies that the given type belongs to a particular injector:
     * - `InjectorType` such as `NgModule`,
     * - `'root'` the root injector
     * - `'any'` all injectors.
     * - `null`, does not belong to any injector. Must be explicitly listed in the injector
     *   `providers`.
     */
    providedIn: InjectorType<any> | 'root' | 'platform' | 'any' | 'environment' | null;
    /**
     * The token to which this definition belongs.
     *
     * Note that this may not be the same as the type that the `factory` will create.
     */
    token: unknown;
    /**
     * Factory method to execute to create an instance of the injectable.
     */
    factory: (t?: Type$1<any>) => T;
    /**
     * In a case of no explicit injector, a location where the instance of the injectable is stored.
     */
    value: T | undefined;
}
/**
 * Information about the providers to be included in an `Injector` as well as how the given type
 * which carries the information should be created by the DI system.
 *
 * An `InjectorDef` can import other types which have `InjectorDefs`, forming a deep nested
 * structure of providers with a defined priority (identically to how `NgModule`s also have
 * an import/dependency structure).
 *
 * NOTE: This is a private type and should not be exported
 *
 * @codeGenApi
 */
interface ɵɵInjectorDef<T> {
    providers: (Type$1<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | EnvironmentProviders | any[])[];
    imports: (InjectorType<any> | InjectorTypeWithProviders<any>)[];
}
/**
 * A `Type` which has a `ɵprov: ɵɵInjectableDeclaration` static field.
 *
 * `InjectableType`s contain their own Dependency Injection metadata and are usable in an
 * `InjectorDef`-based `StaticInjector`.
 *
 * @publicApi
 */
interface InjectableType<T> extends Type$1<T> {
    /**
     * Opaque type whose structure is highly version dependent. Do not rely on any properties.
     */
    ɵprov: unknown;
}
/**
 * A type which has an `InjectorDef` static field.
 *
 * `InjectorTypes` can be used to configure a `StaticInjector`.
 *
 * This is an opaque type whose structure is highly version dependent. Do not rely on any
 * properties.
 *
 * @publicApi
 */
interface InjectorType<T> extends Type$1<T> {
    ɵfac?: unknown;
    ɵinj: unknown;
}
/**
 * Describes the `InjectorDef` equivalent of a `ModuleWithProviders`, an `InjectorType` with an
 * associated array of providers.
 *
 * Objects of this type can be listed in the imports section of an `InjectorDef`.
 *
 * NOTE: This is a private type and should not be exported
 */
interface InjectorTypeWithProviders<T> {
    ngModule: InjectorType<T>;
    providers?: (Type$1<any> | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | EnvironmentProviders | any[])[];
}
/**
 * Construct an injectable definition which defines how a token will be constructed by the DI
 * system, and in which injectors (if any) it will be available.
 *
 * This should be assigned to a static `ɵprov` field on a type, which will then be an
 * `InjectableType`.
 *
 * Options:
 * * `providedIn` determines which injectors will include the injectable, by either associating it
 *   with an `@NgModule` or other `InjectorType`, or by specifying that this injectable should be
 *   provided in the `'root'` injector, which will be the application-level injector in most apps.
 * * `factory` gives the zero argument function which will create an instance of the injectable.
 *   The factory can call [`inject`](api/core/inject) to access the `Injector` and request injection
 * of dependencies.
 *
 * @codeGenApi
 * @publicApi This instruction has been emitted by ViewEngine for some time and is deployed to npm.
 */
declare function ɵɵdefineInjectable<T>(opts: {
    token: unknown;
    providedIn?: Type$1<any> | 'root' | 'platform' | 'any' | 'environment' | null;
    factory: () => T;
}): unknown;
/**
 * @deprecated in v8, delete after v10. This API should be used only by generated code, and that
 * code should now use ɵɵdefineInjectable instead.
 * @publicApi
 */
declare const defineInjectable: typeof ɵɵdefineInjectable;
/**
 * Construct an `InjectorDef` which configures an injector.
 *
 * This should be assigned to a static injector def (`ɵinj`) field on a type, which will then be an
 * `InjectorType`.
 *
 * Options:
 *
 * * `providers`: an optional array of providers to add to the injector. Each provider must
 *   either have a factory or point to a type which has a `ɵprov` static property (the
 *   type must be an `InjectableType`).
 * * `imports`: an optional array of imports of other `InjectorType`s or `InjectorTypeWithModule`s
 *   whose providers will also be added to the injector. Locally provided types will override
 *   providers from imports.
 *
 * @codeGenApi
 */
declare function ɵɵdefineInjector(options: {
    providers?: any[];
    imports?: any[];
}): unknown;
/**
 * Read the injectable def (`ɵprov`) for `type` in a way which is immune to accidentally reading
 * inherited value.
 *
 * @param type A type which may have its own (non-inherited) `ɵprov`.
 */
declare function getInjectableDef<T>(type: any): ɵɵInjectableDeclaration<T> | null;
declare function isInjectable(type: any): boolean;
declare const NG_PROV_DEF: string;
declare const NG_INJ_DEF: string;

/**
 * Wrap an array of `Provider`s into `EnvironmentProviders`, preventing them from being accidentally
 * referenced in `@Component` in a component injector.
 *
 * @publicApi
 */
declare function makeEnvironmentProviders(providers: (Provider | EnvironmentProviders)[]): EnvironmentProviders;
/**
 * @description
 * This function is used to provide initialization functions that will be executed upon construction
 * of an environment injector.
 *
 * Note that the provided initializer is run in the injection context.
 *
 * Previously, this was achieved using the `ENVIRONMENT_INITIALIZER` token which is now deprecated.
 *
 * @see {@link ENVIRONMENT_INITIALIZER}
 *
 * @usageNotes
 * The following example illustrates how to configure an initialization function using
 * `provideEnvironmentInitializer()`
 * ```ts
 * createEnvironmentInjector(
 *   [
 *     provideEnvironmentInitializer(() => {
 *       console.log('environment initialized');
 *     }),
 *   ],
 *   parentInjector
 * );
 * ```
 *
 * @publicApi
 */
declare function provideEnvironmentInitializer(initializerFn: () => void): EnvironmentProviders;
/**
 * A source of providers for the `importProvidersFrom` function.
 *
 * @publicApi
 */
type ImportProvidersSource = Type$1<unknown> | ModuleWithProviders<unknown> | Array<ImportProvidersSource>;
/**
 * Collects providers from all NgModules and standalone components, including transitively imported
 * ones.
 *
 * Providers extracted via `importProvidersFrom` are only usable in an application injector or
 * another environment injector (such as a route injector). They should not be used in component
 * providers.
 *
 * More information about standalone components can be found in [this
 * guide](guide/components/importing).
 *
 * @usageNotes
 * The results of the `importProvidersFrom` call can be used in the `bootstrapApplication` call:
 *
 * ```ts
 * await bootstrapApplication(RootComponent, {
 *   providers: [
 *     importProvidersFrom(NgModuleOne, NgModuleTwo)
 *   ]
 * });
 * ```
 *
 * You can also use the `importProvidersFrom` results in the `providers` field of a route, when a
 * standalone component is used:
 *
 * ```ts
 * export const ROUTES: Route[] = [
 *   {
 *     path: 'foo',
 *     providers: [
 *       importProvidersFrom(NgModuleOne, NgModuleTwo)
 *     ],
 *     component: YourStandaloneComponent
 *   }
 * ];
 * ```
 *
 * @returns Collected providers from the specified list of types.
 * @publicApi
 */
declare function importProvidersFrom(...sources: ImportProvidersSource[]): EnvironmentProviders;
/**
 * Internal type for a single provider in a deep provider array.
 */
type SingleProvider = TypeProvider | ValueProvider | ClassProvider | ConstructorProvider | ExistingProvider | FactoryProvider | StaticClassProvider;

type InjectorScope = 'root' | 'platform' | 'environment';
/**
 * An internal token whose presence in an injector indicates that the injector should treat itself
 * as a root scoped injector when processing requests for unknown tokens which may indicate
 * they are provided in the root scope.
 */
declare const INJECTOR_SCOPE: InjectionToken<InjectorScope | null>;

/**
 * An `Injector` that's part of the environment injector hierarchy, which exists outside of the
 * component tree.
 */
declare abstract class EnvironmentInjector implements Injector {
    /**
     * Retrieves an instance from the injector based on the provided token.
     * @returns The instance from the injector if defined, otherwise the `notFoundValue`.
     * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.
     */
    abstract get<T>(token: ProviderToken<T>, notFoundValue: undefined, options: InjectOptions & {
        optional?: false;
    }): T;
    /**
     * Retrieves an instance from the injector based on the provided token.
     * @returns The instance from the injector if defined, otherwise the `notFoundValue`.
     * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.
     */
    abstract get<T>(token: ProviderToken<T>, notFoundValue: null | undefined, options: InjectOptions): T | null;
    /**
     * Retrieves an instance from the injector based on the provided token.
     * @returns The instance from the injector if defined, otherwise the `notFoundValue`.
     * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.
     */
    abstract get<T>(token: ProviderToken<T>, notFoundValue?: T, options?: InjectOptions): T;
    /**
     * Retrieves an instance from the injector based on the provided token.
     * @returns The instance from the injector if defined, otherwise the `notFoundValue`.
     * @throws When the `notFoundValue` is `undefined` or `Injector.THROW_IF_NOT_FOUND`.
     * @deprecated use object-based flags (`InjectOptions`) instead.
     */
    abstract get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): T;
    /**
     * @deprecated from v4.0.0 use ProviderToken<T>
     * @suppress {duplicate}
     */
    abstract get(token: any, notFoundValue?: any): any;
    /**
     * Runs the given function in the context of this `EnvironmentInjector`.
     *
     * Within the function's stack frame, [`inject`](api/core/inject) can be used to inject
     * dependencies from this injector. Note that `inject` is only usable synchronously, and cannot be
     * used in any asynchronous callbacks or after any `await` points.
     *
     * @param fn the closure to be run in the context of this injector
     * @returns the return value of the function, if any
     * @deprecated use the standalone function `runInInjectionContext` instead
     */
    abstract runInContext<ReturnT>(fn: () => ReturnT): ReturnT;
    abstract destroy(): void;
}
declare class R3Injector extends EnvironmentInjector implements Injector$1 {
    readonly parent: Injector;
    readonly source: string | null;
    readonly scopes: Set<InjectorScope>;
    /**
     * Map of tokens to records which contain the instances of those tokens.
     * - `null` value implies that we don't have the record. Used by tree-shakable injectors
     * to prevent further searches.
     */
    private records;
    /**
     * Set of values instantiated by this injector which contain `ngOnDestroy` lifecycle hooks.
     */
    private _ngOnDestroyHooks;
    private _onDestroyHooks;
    /**
     * Flag indicating that this injector was previously destroyed.
     */
    get destroyed(): boolean;
    private _destroyed;
    private injectorDefTypes;
    constructor(providers: Array<Provider | EnvironmentProviders>, parent: Injector, source: string | null, scopes: Set<InjectorScope>);
    retrieve<T>(token: InjectionToken$1<T>, options?: unknown): T | NotFound;
    /**
     * Destroy the injector and release references to every instance or provider associated with it.
     *
     * Also calls the `OnDestroy` lifecycle hooks of every instance that was created for which a
     * hook was found.
     */
    destroy(): void;
    onDestroy(callback: () => void): () => void;
    runInContext<ReturnT>(fn: () => ReturnT): ReturnT;
    get<T>(token: ProviderToken<T>, notFoundValue?: any, flags?: InjectFlags | InjectOptions): T;
    toString(): string;
    /**
     * Process a `SingleProvider` and add it.
     */
    private processProvider;
    private hydrate;
    private injectableDefInScope;
    private removeOnDestroy;
}

/**
 * A schema definition associated with a component or an NgModule.
 *
 * @see {@link NgModule}
 * @see {@link CUSTOM_ELEMENTS_SCHEMA}
 * @see {@link NO_ERRORS_SCHEMA}
 *
 * @param name The name of a defined schema.
 *
 * @publicApi
 */
interface SchemaMetadata {
    name: string;
}
/**
 * Defines a schema that allows an NgModule to contain the following:
 * - Non-Angular elements named with dash case (`-`).
 * - Element properties named with dash case (`-`).
 * Dash case is the naming convention for custom elements.
 *
 * @publicApi
 */
declare const CUSTOM_ELEMENTS_SCHEMA: SchemaMetadata;
/**
 * Defines a schema that allows any property on any element.
 *
 * This schema allows you to ignore the errors related to any unknown elements or properties in a
 * template. The usage of this schema is generally discouraged because it prevents useful validation
 * and may hide real errors in your template. Consider using the `CUSTOM_ELEMENTS_SCHEMA` instead.
 *
 * @publicApi
 */
declare const NO_ERRORS_SCHEMA: SchemaMetadata;

/**
 * Defines the CSS styles encapsulation policies for the {@link /api/core/Component Component} decorator's
 * `encapsulation` option.
 *
 * See {@link Component#encapsulation encapsulation}.
 *
 * @usageNotes
 * ### Example
 *
 * {@example core/ts/metadata/encapsulation.ts region='longform'}
 *
 * @publicApi
 */
declare enum ViewEncapsulation$1 {
    /**
     * Emulates a native Shadow DOM encapsulation behavior by adding a specific attribute to the
     * component's host element and applying the same attribute to all the CSS selectors provided
     * via {@link Component#styles styles} or {@link Component#styleUrls styleUrls}.
     *
     * This is the default option.
     */
    Emulated = 0,
    /**
     * Doesn't provide any sort of CSS style encapsulation, meaning that all the styles provided
     * via {@link Component#styles styles} or {@link Component#styleUrls styleUrls} are applicable
     * to any HTML element of the application regardless of their host Component.
     */
    None = 2,
    /**
     * Uses the browser's native Shadow DOM API to encapsulate CSS styles, meaning that it creates
     * a ShadowRoot for the component's host element which is then used to encapsulate
     * all the Component's styling.
     */
    ShadowDom = 3
}

/**
 * Definition of what a factory function should look like.
 */
type FactoryFn<T> = {
    /**
     * Subclasses without an explicit constructor call through to the factory of their base
     * definition, providing it with their own constructor to instantiate.
     */
    <U extends T>(t?: Type$1<U>): U;
    /**
     * If no constructor to instantiate is provided, an instance of type T itself is created.
     */
    (t?: undefined): T;
};

/** Flags describing an input for a directive. */
declare enum InputFlags {
    None = 0,
    SignalBased = 1,
    HasDecoratorInputTransform = 2
}

/**
 * Definition of what a template rendering function should look like for a component.
 */
type ComponentTemplate<T> = {
    <U extends T>(rf: RenderFlags, ctx: T | U): void;
};
/**
 * Definition of what a view queries function should look like.
 */
type ViewQueriesFunction<T> = <U extends T>(rf: RenderFlags, ctx: U) => void;
/**
 * Definition of what a content queries function should look like.
 */
type ContentQueriesFunction<T> = <U extends T>(rf: RenderFlags, ctx: U, directiveIndex: number) => void;
interface ClassDebugInfo {
    className: string;
    filePath?: string;
    lineNumber?: number;
    forbidOrphanRendering?: boolean;
}
/**
 * Flags passed into template functions to determine which blocks (i.e. creation, update)
 * should be executed.
 *
 * Typically, a template runs both the creation block and the update block on initialization and
 * subsequent runs only execute the update block. However, dynamically created views require that
 * the creation block be executed separately from the update block (for backwards compat).
 */
declare const enum RenderFlags {
    Create = 1,
    Update = 2
}
/**
 * A subclass of `Type` which has a static `ɵcmp`:`ComponentDef` field making it
 * consumable for rendering.
 */
interface ComponentType<T> extends Type$1<T> {
    ɵcmp: unknown;
}
/**
 * A subclass of `Type` which has a static `ɵdir`:`DirectiveDef` field making it
 * consumable for rendering.
 */
interface DirectiveType<T> extends Type$1<T> {
    ɵdir: unknown;
    ɵfac: unknown;
}
/**
 * A subclass of `Type` which has a static `ɵpipe`:`PipeDef` field making it
 * consumable for rendering.
 */
interface PipeType<T> extends Type$1<T> {
    ɵpipe: unknown;
}
/**
 * Runtime link information for Directives.
 *
 * This is an internal data structure used by the render to link
 * directives into templates.
 *
 * NOTE: Always use `defineDirective` function to create this object,
 * never create the object directly since the shape of this object
 * can change between versions.
 *
 * @param Selector type metadata specifying the selector of the directive or component
 *
 * See: {@link defineDirective}
 */
interface DirectiveDef<T> {
    /**
     * A dictionary mapping the inputs' public name to their minified property names
     * (along with flags if there are any).
     */
    readonly inputs: Record<string, [
        minifiedName: string,
        flags: InputFlags,
        transform: InputTransformFunction | null
    ]>;
    /**
     * Contains the raw input information produced by the compiler. Can be
     * used to do further processing after the `inputs` have been inverted.
     */
    readonly inputConfig: {
        [P in keyof T]?: string | [InputFlags, string, string?, InputTransformFunction?];
    };
    /**
     * @deprecated This is only here because `NgOnChanges` incorrectly uses declared name instead of
     * public or minified name.
     */
    readonly declaredInputs: Record<string, string>;
    /**
     * A dictionary mapping the outputs' minified property names to their public API names, which
     * are their aliases if any, or their original unminified property names
     * (as in `@Output('alias') propertyName: any;`).
     */
    readonly outputs: Record<string, string>;
    /**
     * Function to create and refresh content queries associated with a given directive.
     */
    contentQueries: ContentQueriesFunction<T> | null;
    /**
     * Query-related instructions for a directive. Note that while directives don't have a
     * view and as such view queries won't necessarily do anything, there might be
     * components that extend the directive.
     */
    viewQuery: ViewQueriesFunction<T> | null;
    /**
     * Refreshes host bindings on the associated directive.
     */
    readonly hostBindings: HostBindingsFunction<T> | null;
    /**
     * The number of bindings in this directive `hostBindings` (including pure fn bindings).
     *
     * Used to calculate the length of the component's LView array, so we
     * can pre-fill the array and set the host binding start index.
     */
    readonly hostVars: number;
    /**
     * Assign static attribute values to a host element.
     *
     * This property will assign static attribute values as well as class and style
     * values to a host element. Since attribute values can consist of different types of values, the
     * `hostAttrs` array must include the values in the following format:
     *
     * attrs = [
     *   // static attributes (like `title`, `name`, `id`...)
     *   attr1, value1, attr2, value,
     *
     *   // a single namespace value (like `x:id`)
     *   NAMESPACE_MARKER, namespaceUri1, name1, value1,
     *
     *   // another single namespace value (like `x:name`)
     *   NAMESPACE_MARKER, namespaceUri2, name2, value2,
     *
     *   // a series of CSS classes that will be applied to the element (no spaces)
     *   CLASSES_MARKER, class1, class2, class3,
     *
     *   // a series of CSS styles (property + value) that will be applied to the element
     *   STYLES_MARKER, prop1, value1, prop2, value2
     * ]
     *
     * All non-class and non-style attributes must be defined at the start of the list
     * first before all class and style values are set. When there is a change in value
     * type (like when classes and styles are introduced) a marker must be used to separate
     * the entries. The marker values themselves are set via entries found in the
     * [AttributeMarker] enum.
     */
    readonly hostAttrs: TAttributes | null;
    /** Token representing the directive. Used by DI. */
    readonly type: Type$1<T>;
    /** Function that resolves providers and publishes them into the DI system. */
    providersResolver: (<U extends T>(def: DirectiveDef<U>, processProvidersFn?: ProcessProvidersFunction) => void) | null;
    /** The selectors that will be used to match nodes to this directive. */
    readonly selectors: CssSelectorList;
    /**
     * Name under which the directive is exported (for use with local references in template)
     */
    readonly exportAs: string[] | null;
    /**
     * Whether this directive (or component) is standalone.
     */
    readonly standalone: boolean;
    /**
     * Whether this directive (or component) uses the signals authoring experience.
     */
    readonly signals: boolean;
    /**
     * Factory function used to create a new directive instance. Will be null initially.
     * Populated when the factory is first requested by directive instantiation logic.
     */
    readonly factory: FactoryFn<T> | null;
    /**
     * The features applied to this directive
     */
    readonly features: DirectiveDefFeature[] | null;
    /**
     * Info related to debugging/troubleshooting for this component. This info is only available in
     * dev mode.
     */
    debugInfo: ClassDebugInfo | null;
    /**
     * Function that will add the host directives to the list of matches during directive matching.
     * Patched onto the definition by the `HostDirectivesFeature`.
     * @param currentDef Definition that has been matched.
     * @param matchedDefs List of all matches for a specified node. Will be mutated to include the
     * host directives.
     * @param hostDirectiveDefs Mapping of directive definitions to their host directive
     * configuration. Host directives will be added to the map as they're being matched to the node.
     */
    findHostDirectiveDefs: ((currentDef: DirectiveDef<unknown>, matchedDefs: DirectiveDef<unknown>[], hostDirectiveDefs: HostDirectiveDefs) => void) | null;
    /**
     * Additional directives to be applied whenever the directive has been matched.
     *
     * `HostDirectiveConfig` objects represent a host directive that can be resolved eagerly and were
     * already pre-processed when the definition was created. A function needs to be resolved lazily
     * during directive matching, because it's a forward reference.
     *
     * **Note:** we can't `HostDirectiveConfig` in the array, because there's no way to distinguish if
     * a function in the array is a `Type` or a `() => HostDirectiveConfig[]`.
     */
    hostDirectives: (HostDirectiveDef | (() => HostDirectiveConfig[]))[] | null;
    setInput: (<U extends T>(this: DirectiveDef<U>, instance: U, inputSignalNode: null | InputSignalNode<unknown, unknown>, value: any, publicName: string, privateName: string) => void) | null;
}
/**
 * Runtime link information for Components.
 *
 * This is an internal d   ata structure used by the render to link
 * components into templates.
 *
 * NOTE: Always use `defineComponent` function to create this object,
 * never create the object directly since the shape of this object
 * can change between versions.
 *
 * See: {@link defineComponent}
 */
interface ComponentDef<T> extends DirectiveDef<T> {
    /**
     * Unique ID for the component. Used in view encapsulation and
     * to keep track of the injector in standalone components.
     */
    readonly id: string;
    /**
     * The View template of the component.
     */
    readonly template: ComponentTemplate<T>;
    /** Constants associated with the component's view. */
    readonly consts: TConstantsOrFactory | null;
    /**
     * An array of `ngContent[selector]` values that were found in the template.
     */
    readonly ngContentSelectors?: string[];
    /**
     * A set of styles that the component needs to be present for component to render correctly.
     */
    readonly styles: string[];
    /**
     * The number of nodes, local refs, and pipes in this component template.
     *
     * Used to calculate the length of the component's LView array, so we
     * can pre-fill the array and set the binding start index.
     */
    readonly decls: number;
    /**
     * The number of bindings in this component template (including pure fn bindings).
     *
     * Used to calculate the length of the component's LView array, so we
     * can pre-fill the array and set the host binding start index.
     */
    readonly vars: number;
    /**
     * Query-related instructions for a component.
     */
    viewQuery: ViewQueriesFunction<T> | null;
    /**
     * The view encapsulation type, which determines how styles are applied to
     * DOM elements. One of
     * - `Emulated` (default): Emulate native scoping of styles.
     * - `Native`: Use the native encapsulation mechanism of the renderer.
     * - `ShadowDom`: Use modern [ShadowDOM](https://w3c.github.io/webcomponents/spec/shadow/) and
     *   create a ShadowRoot for component's host element.
     * - `None`: Do not provide any template or style encapsulation.
     */
    readonly encapsulation: ViewEncapsulation$1;
    /**
     * Defines arbitrary developer-defined data to be stored on a renderer instance.
     * This is useful for renderers that delegate to other renderers.
     */
    readonly data: {
        [kind: string]: any;
        animation?: any[];
    };
    /** Whether or not this component's ChangeDetectionStrategy is OnPush */
    readonly onPush: boolean;
    /** Whether or not this component is signal-based. */
    readonly signals: boolean;
    /**
     * Registry of directives and components that may be found in this view.
     *
     * The property is either an array of `DirectiveDef`s or a function which returns the array of
     * `DirectiveDef`s. The function is necessary to be able to support forward declarations.
     */
    directiveDefs: DirectiveDefListOrFactory | null;
    /**
     * Registry of pipes that may be found in this view.
     *
     * The property is either an array of `PipeDefs`s or a function which returns the array of
     * `PipeDefs`s. The function is necessary to be able to support forward declarations.
     */
    pipeDefs: PipeDefListOrFactory | null;
    /**
     * Unfiltered list of all dependencies of a component, or `null` if none.
     */
    dependencies: TypeOrFactory<DependencyTypeList> | null;
    /**
     * The set of schemas that declare elements to be allowed in the component's template.
     */
    schemas: SchemaMetadata[] | null;
    /**
     * Ivy runtime uses this place to store the computed tView for the component. This gets filled on
     * the first run of component.
     */
    tView: TView | null;
    /**
     * A function used by the framework to create standalone injectors.
     */
    getStandaloneInjector: ((parentInjector: EnvironmentInjector) => EnvironmentInjector | null) | null;
    /**
     * A function used by the framework to create the list of external runtime style URLs.
     */
    getExternalStyles: ((encapsulationId?: string) => string[]) | null;
    /**
     * Used to store the result of `noSideEffects` function so that it is not removed by closure
     * compiler. The property should never be read.
     */
    readonly _?: unknown;
}
/**
 * Runtime link information for Pipes.
 *
 * This is an internal data structure used by the renderer to link
 * pipes into templates.
 *
 * NOTE: Always use `definePipe` function to create this object,
 * never create the object directly since the shape of this object
 * can change between versions.
 *
 * See: {@link definePipe}
 */
interface PipeDef<T> {
    /** Token representing the pipe. */
    type: Type$1<T>;
    /**
     * Pipe name.
     *
     * Used to resolve pipe in templates.
     */
    readonly name: string;
    /**
     * Factory function used to create a new pipe instance. Will be null initially.
     * Populated when the factory is first requested by pipe instantiation logic.
     */
    factory: FactoryFn<T> | null;
    /**
     * Whether or not the pipe is pure.
     *
     * Pure pipes result only depends on the pipe input and not on internal
     * state of the pipe.
     */
    readonly pure: boolean;
    /**
     * Whether this pipe is standalone.
     */
    readonly standalone: boolean;
    onDestroy: (() => void) | null;
}
interface DirectiveDefFeature {
    <T>(directiveDef: DirectiveDef<T>): void;
    /**
     * Marks a feature as something that {@link InheritDefinitionFeature} will execute
     * during inheritance.
     *
     * NOTE: DO NOT SET IN ROOT OF MODULE! Doing so will result in tree-shakers/bundlers
     * identifying the change as a side effect, and the feature will be included in
     * every bundle.
     */
    ngInherit?: true;
}
/** Runtime information used to configure a host directive. */
interface HostDirectiveDef<T = unknown> {
    /** Class representing the host directive. */
    directive: Type$1<T>;
    /** Directive inputs that have been exposed. */
    inputs: HostDirectiveBindingMap;
    /** Directive outputs that have been exposed. */
    outputs: HostDirectiveBindingMap;
}
/**
 * Mapping between the public aliases of directive bindings and the underlying inputs/outputs that
 * they represent. Also serves as an allowlist of the inputs/outputs from the host directive that
 * the author has decided to expose.
 */
type HostDirectiveBindingMap = {
    [publicName: string]: string;
};
/**
 * Mapping between a directive that was used as a host directive
 * and the configuration that was used to define it as such.
 */
type HostDirectiveDefs = Map<DirectiveDef<unknown>, HostDirectiveDef>;
/** Value that can be used to configure a host directive. */
type HostDirectiveConfig = Type$1<unknown> | {
    directive: Type$1<unknown>;
    inputs?: string[];
    outputs?: string[];
};
interface ComponentDefFeature {
    <T>(componentDef: ComponentDef<T>): void;
    /**
     * Marks a feature as something that {@link InheritDefinitionFeature} will execute
     * during inheritance.
     *
     * NOTE: DO NOT SET IN ROOT OF MODULE! Doing so will result in tree-shakers/bundlers
     * identifying the change as a side effect, and the feature will be included in
     * every bundle.
     */
    ngInherit?: true;
}
/** Function that can be used to transform incoming input values. */
type InputTransformFunction = (value: any) => any;
/**
 * Type used for directiveDefs on component definition.
 *
 * The function is necessary to be able to support forward declarations.
 */
type DirectiveDefListOrFactory = (() => DirectiveDefList) | DirectiveDefList;
type DirectiveDefList = (DirectiveDef<any> | ComponentDef<any>)[];
type DependencyType = DirectiveType<any> | ComponentType<any> | PipeType<any> | Type$1<any>;
type DependencyTypeList = Array<DependencyType>;
type TypeOrFactory<T> = T | (() => T);
type HostBindingsFunction<T> = <U extends T>(rf: RenderFlags, ctx: U) => void;
/**
 * Type used for PipeDefs on component definition.
 *
 * The function is necessary to be able to support forward declarations.
 */
type PipeDefListOrFactory = (() => PipeDefList) | PipeDefList;
type PipeDefList = PipeDef<any>[];
/**
 * NgModule scope info as provided by AoT compiler
 *
 * In full compilation Ivy resolved all the "module with providers" and forward refs the whole array
 * if at least one element is forward refed. So we end up with type `Type<any>[]|(() =>
 * Type<any>[])`.
 *
 * In local mode the compiler passes the raw info as they are to the runtime functions as it is not
 * possible to resolve them any further due to limited info at compile time. So we end up with type
 * `RawScopeInfoFromDecorator[]`.
 */
interface NgModuleScopeInfoFromDecorator {
    /** List of components, directives, and pipes declared by this module. */
    declarations?: Type$1<any>[] | (() => Type$1<any>[]) | RawScopeInfoFromDecorator[];
    /** List of modules or `ModuleWithProviders` or standalone components imported by this module. */
    imports?: Type$1<any>[] | (() => Type$1<any>[]) | RawScopeInfoFromDecorator[];
    /**
     * List of modules, `ModuleWithProviders`, components, directives, or pipes exported by this
     * module.
     */
    exports?: Type$1<any>[] | (() => Type$1<any>[]) | RawScopeInfoFromDecorator[];
    /**
     * The set of components that are bootstrapped when this module is bootstrapped. This field is
     * only available in local compilation mode. In full compilation mode bootstrap info is passed
     * directly to the module def runtime after statically analyzed and resolved.
     */
    bootstrap?: Type$1<any>[] | (() => Type$1<any>[]) | RawScopeInfoFromDecorator[];
}
/**
 * The array element type passed to:
 *  - NgModule's annotation imports/exports/declarations fields
 *  - standalone component annotation imports field
 */
type RawScopeInfoFromDecorator = Type$1<any> | ModuleWithProviders<any> | (() => Type$1<any>) | (() => ModuleWithProviders<any>) | any[];

/**
 * Basic set of data structures used for identifying a defer block
 * and triggering defer blocks
 */
interface DehydratedDeferBlock {
    lView: LView;
    tNode: TNode;
    lContainer: LContainer;
}
/**
 * Describes the shape of a function generated by the compiler
 * to download dependencies that can be defer-loaded.
 */
type DependencyResolverFn = () => Array<Promise<DependencyType>>;
/**
 * Describes the state of defer block dependency loading.
 */
declare enum DeferDependenciesLoadingState {
    /** Initial state, dependency loading is not yet triggered */
    NOT_STARTED = 0,
    /** Dependency loading is in progress */
    IN_PROGRESS = 1,
    /** Dependency loading has completed successfully */
    COMPLETE = 2,
    /** Dependency loading has failed */
    FAILED = 3
}
/** Configuration object for a loading block as it is stored in the component constants. */
type DeferredLoadingBlockConfig = [minimumTime: number | null, afterTime: number | null];
/** Configuration object for a placeholder block as it is stored in the component constants. */
type DeferredPlaceholderBlockConfig = [minimumTime: number | null];
/**
 * Describes the data shared across all instances of a defer block.
 */
interface TDeferBlockDetails {
    /**
     * Index in an LView and TData arrays where a template for the primary content
     * can be found.
     */
    primaryTmplIndex: number;
    /**
     * Index in an LView and TData arrays where a template for the loading block can be found.
     */
    loadingTmplIndex: number | null;
    /**
     * Extra configuration parameters (such as `after` and `minimum`) for the loading block.
     */
    loadingBlockConfig: DeferredLoadingBlockConfig | null;
    /**
     * Index in an LView and TData arrays where a template for the placeholder block can be found.
     */
    placeholderTmplIndex: number | null;
    /**
     * Extra configuration parameters (such as `after` and `minimum`) for the placeholder block.
     */
    placeholderBlockConfig: DeferredPlaceholderBlockConfig | null;
    /**
     * Index in an LView and TData arrays where a template for the error block can be found.
     */
    errorTmplIndex: number | null;
    /**
     * Compiler-generated function that loads all dependencies for a defer block.
     */
    dependencyResolverFn: DependencyResolverFn | null;
    /**
     * Keeps track of the current loading state of defer block dependencies.
     */
    loadingState: DeferDependenciesLoadingState;
    /**
     * Dependency loading Promise. This Promise is helpful for cases when there
     * are multiple instances of a defer block (e.g. if it was used inside of an *ngFor),
     * which all await the same set of dependencies.
     */
    loadingPromise: Promise<unknown> | null;
    /**
     * List of providers collected from all NgModules that were imported by
     * standalone components used within this defer block.
     */
    providers: Provider[] | null;
    /**
     * List of hydrate triggers for a given block
     */
    hydrateTriggers: Map<DeferBlockTrigger, HydrateTriggerDetails | null> | null;
    /**
     * Defer block flags, which should be used for all
     * instances of a given defer block (the flags that should be
     * placed into the `TDeferDetails` at runtime).
     */
    flags: TDeferDetailsFlags;
    /**
     * Tracks debugging information about the deferred block.
     */
    debug: {
        /** Text representations of the block's triggers. */
        triggers?: Set<string>;
    } | null;
}
/**
 * Specifies defer block flags, which should be used for all
 * instances of a given defer block (the flags that should be
 * placed into the `TDeferDetails` at runtime).
 */
declare const enum TDeferDetailsFlags {
    Default = 0,
    /**
     * Whether or not the defer block has hydrate triggers.
     */
    HasHydrateTriggers = 1
}
/**
 * Describes the current state of this defer block instance.
 *
 * @publicApi
 */
declare enum DeferBlockState {
    /** The placeholder block content is rendered */
    Placeholder = 0,
    /** The loading block content is rendered */
    Loading = 1,
    /** The main content block content is rendered */
    Complete = 2,
    /** The error block content is rendered */
    Error = 3
}
/**
 * Represents defer trigger types.
 */
declare const enum DeferBlockTrigger {
    Idle = 0,
    Immediate = 1,
    Viewport = 2,
    Interaction = 3,
    Hover = 4,
    Timer = 5,
    When = 6,
    Never = 7
}
/** * Describes specified delay (in ms) in the `hydrate on timer()` trigger. */
interface HydrateTimerTriggerDetails {
    delay: number;
}
/** * Describes all possible hydration trigger details specified in a template. */
type HydrateTriggerDetails = HydrateTimerTriggerDetails;
/**
 * Internal structure used for configuration of defer block behavior.
 * */
interface DeferBlockConfig {
    behavior: DeferBlockBehavior;
}
/**
 * Options for configuring defer blocks behavior.
 * @publicApi
 */
declare enum DeferBlockBehavior {
    /**
     * Manual triggering mode for defer blocks. Provides control over when defer blocks render
     * and which state they render.
     */
    Manual = 0,
    /**
     * Playthrough mode for defer blocks. This mode behaves like defer blocks would in a browser.
     * This is the default behavior in test environments.
     */
    Playthrough = 1
}
/**
 * **INTERNAL**, avoid referencing it in application code.
 *
 * Describes a helper class that allows to intercept a call to retrieve current
 * dependency loading function and replace it with a different implementation.
 * This interceptor class is needed to allow testing blocks in different states
 * by simulating loading response.
 */
interface DeferBlockDependencyInterceptor {
    /**
     * Invoked for each defer block when dependency loading function is accessed.
     */
    intercept(dependencyFn: DependencyResolverFn | null): DependencyResolverFn | null;
    /**
     * Allows to configure an interceptor function.
     */
    setInterceptor(interceptorFn: (current: DependencyResolverFn) => DependencyResolverFn): void;
}

/**
 * A SecurityContext marks a location that has dangerous security implications, e.g. a DOM property
 * like `innerHTML` that could cause Cross Site Scripting (XSS) security bugs when improperly
 * handled.
 *
 * See DomSanitizer for more details on security in Angular applications.
 *
 * @publicApi
 */
declare enum SecurityContext {
    NONE = 0,
    HTML = 1,
    STYLE = 2,
    SCRIPT = 3,
    URL = 4,
    RESOURCE_URL = 5
}

/**
 * Sanitizer is used by the views to sanitize potentially dangerous values.
 *
 * @publicApi
 */
declare abstract class Sanitizer {
    abstract sanitize(context: SecurityContext, value: {} | string | null): string | null;
    /** @nocollapse */
    static ɵprov: unknown;
}

/** Actions that are supported by the tracing framework. */
declare enum TracingAction {
    CHANGE_DETECTION = 0,
    AFTER_NEXT_RENDER = 1
}
/** A single tracing snapshot. */
interface TracingSnapshot {
    run<T>(action: TracingAction, fn: () => T): T;
    /** Disposes of the tracing snapshot. Must be run exactly once per TracingSnapshot. */
    dispose(): void;
}
/**
 * Injection token for a `TracingService`, optionally provided.
 */
declare const TracingService: InjectionToken<TracingService<TracingSnapshot>>;
/**
 * Tracing mechanism which can associate causes (snapshots) with runs of
 * subsequent operations.
 *
 * Not defined by Angular directly, but defined in contexts where tracing is
 * desired.
 */
interface TracingService<T extends TracingSnapshot> {
    /**
     * Take a snapshot of the current context which will be stored by Angular and
     * used when additional work is performed that was scheduled in this context.
     *
     * @param linkedSnapshot Optional snapshot to use link to the current context.
     * The caller is no longer responsible for calling dispose on the linkedSnapshot.
     *
     * @return The tracing snapshot. The caller is responsible for diposing of the
     * snapshot.
     */
    snapshot(linkedSnapshot: T | null): T;
    /**
     * Wrap an event listener bound by the framework for tracing.
     * @param element Element on which the event is bound.
     * @param eventName Name of the event.
     * @param handler Event handler.
     * @return A new event handler to be bound instead of the original one.
     */
    wrapEventListener?<T extends Function>(element: HTMLElement, eventName: string, handler: T): T;
}

/**
 * The phase to run an `afterRender` or `afterNextRender` callback in.
 *
 * Callbacks in the same phase run in the order they are registered. Phases run in the
 * following order after each render:
 *
 *   1. `AfterRenderPhase.EarlyRead`
 *   2. `AfterRenderPhase.Write`
 *   3. `AfterRenderPhase.MixedReadWrite`
 *   4. `AfterRenderPhase.Read`
 *
 * Angular is unable to verify or enforce that phases are used correctly, and instead
 * relies on each developer to follow the guidelines documented for each value and
 * carefully choose the appropriate one, refactoring their code if necessary. By doing
 * so, Angular is better able to minimize the performance degradation associated with
 * manual DOM access, ensuring the best experience for the end users of your application
 * or library.
 *
 * @deprecated Specify the phase for your callback to run in by passing a spec-object as the first
 *   parameter to `afterRender` or `afterNextRender` instead of a function.
 */
declare enum AfterRenderPhase {
    /**
     * Use `AfterRenderPhase.EarlyRead` for callbacks that only need to **read** from the
     * DOM before a subsequent `AfterRenderPhase.Write` callback, for example to perform
     * custom layout that the browser doesn't natively support. Prefer the
     * `AfterRenderPhase.Read` phase if reading can wait until after the write phase.
     * **Never** write to the DOM in this phase.
     *
     * <div class="docs-alert docs-alert-important">
     *
     * Using this value can degrade performance.
     * Instead, prefer using built-in browser functionality when possible.
     *
     * </div>
     */
    EarlyRead = 0,
    /**
     * Use `AfterRenderPhase.Write` for callbacks that only **write** to the DOM. **Never**
     * read from the DOM in this phase.
     */
    Write = 1,
    /**
     * Use `AfterRenderPhase.MixedReadWrite` for callbacks that read from or write to the
     * DOM, that haven't been refactored to use a different phase. **Never** use this phase if
     * it is possible to divide the work among the other phases instead.
     *
     * <div class="docs-alert docs-alert-critical">
     *
     * Using this value can **significantly** degrade performance.
     * Instead, prefer dividing work into the appropriate phase callbacks.
     *
     * </div>
     */
    MixedReadWrite = 2,
    /**
     * Use `AfterRenderPhase.Read` for callbacks that only **read** from the DOM. **Never**
     * write to the DOM in this phase.
     */
    Read = 3
}
/**
 * A callback that runs after render.
 *
 * @developerPreview
 */
interface AfterRenderRef {
    /**
     * Shut down the callback, preventing it from being called again.
     */
    destroy(): void;
}

declare class AfterRenderManager {
    impl: AfterRenderImpl | null;
    execute(): void;
    /** @nocollapse */
    static ɵprov: unknown;
}
declare class AfterRenderImpl {
    private readonly ngZone;
    private readonly scheduler;
    private readonly errorHandler;
    /** Current set of active sequences. */
    private readonly sequences;
    /** Tracks registrations made during the current set of executions. */
    private readonly deferredRegistrations;
    /** Whether the `AfterRenderManager` is currently executing hooks. */
    executing: boolean;
    constructor();
    /**
     * Run the sequence of phases of hooks, once through. As a result of executing some hooks, more
     * might be scheduled.
     */
    execute(): void;
    register(sequence: AfterRenderSequence): void;
    addSequence(sequence: AfterRenderSequence): void;
    unregister(sequence: AfterRenderSequence): void;
    protected maybeTrace<T>(fn: () => T, snapshot: TracingSnapshot | null): T;
    /** @nocollapse */
    static ɵprov: unknown;
}
type AfterRenderHook = (value?: unknown) => unknown;
type AfterRenderHooks = [
    AfterRenderHook | undefined,
    AfterRenderHook | undefined,
    AfterRenderHook | undefined,
    AfterRenderHook | undefined
];
declare class AfterRenderSequence implements AfterRenderRef {
    readonly impl: AfterRenderImpl;
    readonly hooks: AfterRenderHooks;
    readonly view: LView | undefined;
    once: boolean;
    snapshot: TracingSnapshot | null;
    /**
     * Whether this sequence errored or was destroyed during this execution, and hooks should no
     * longer run for it.
     */
    erroredOrDestroyed: boolean;
    /**
     * The value returned by the last hook execution (if any), ready to be pipelined into the next
     * one.
     */
    pipelinedValue: unknown;
    private unregisterOnDestroy;
    constructor(impl: AfterRenderImpl, hooks: AfterRenderHooks, view: LView | undefined, once: boolean, destroyRef: DestroyRef | null, snapshot?: TracingSnapshot | null);
    afterRun(): void;
    destroy(): void;
}

interface ReactiveLViewConsumer extends ReactiveNode {
    lView: LView | null;
}

/**
 * Abstraction that encompasses any kind of effect that can be scheduled.
 */
interface SchedulableEffect {
    run(): void;
    zone: {
        run<T>(fn: () => T): T;
    } | null;
}
/**
 * A scheduler which manages the execution of effects.
 */
declare abstract class EffectScheduler {
    /**
     * Schedule the given effect to be executed at a later time.
     *
     * It is an error to attempt to execute any effects synchronously during a scheduling operation.
     */
    abstract schedule(e: SchedulableEffect): void;
    /**
     * Run any scheduled effects.
     */
    abstract flush(): void;
    /** Remove a scheduled effect */
    abstract remove(e: SchedulableEffect): void;
    /** @nocollapse */
    static ɵprov: unknown;
}
/**
 * A wrapper around `ZoneAwareQueueingScheduler` that schedules flushing via the microtask queue
 * when.
 */
declare class ZoneAwareEffectScheduler implements EffectScheduler {
    private queuedEffectCount;
    private queues;
    schedule(handle: SchedulableEffect): void;
    remove(handle: SchedulableEffect): void;
    private enqueue;
    /**
     * Run all scheduled effects.
     *
     * Execution order of effects within the same zone is guaranteed to be FIFO, but there is no
     * ordering guarantee between effects scheduled in different zones.
     */
    flush(): void;
    private flushQueue;
}

/**
 * A global reactive effect, which can be manually destroyed.
 *
 * @developerPreview
 */
interface EffectRef {
    /**
     * Shut down the effect, removing it from any upcoming scheduled executions.
     */
    destroy(): void;
}
/**
 * Options passed to the `effect` function.
 *
 * @developerPreview
 */
interface CreateEffectOptions {
    /**
     * The `Injector` in which to create the effect.
     *
     * If this is not provided, the current [injection context](guide/di/dependency-injection-context)
     * will be used instead (via `inject`).
     */
    injector?: Injector;
    /**
     * Whether the `effect` should require manual cleanup.
     *
     * If this is `false` (the default) the effect will automatically register itself to be cleaned up
     * with the current `DestroyRef`.
     */
    manualCleanup?: boolean;
    /**
     * Always create a root effect (which is scheduled as a microtask) regardless of whether `effect`
     * is called within a component.
     */
    forceRoot?: true;
    /**
     * @deprecated no longer required, signal writes are allowed by default.
     */
    allowSignalWrites?: boolean;
    /**
     * A debug name for the effect. Used in Angular DevTools to identify the effect.
     */
    debugName?: string;
}
/**
 * An effect can, optionally, register a cleanup function. If registered, the cleanup is executed
 * before the next effect run. The cleanup function makes it possible to "cancel" any work that the
 * previous effect run might have started.
 *
 * @developerPreview
 */
type EffectCleanupFn = () => void;
/**
 * A callback passed to the effect function that makes it possible to register cleanup logic.
 *
 * @developerPreview
 */
type EffectCleanupRegisterFn = (cleanupFn: EffectCleanupFn) => void;
/**
 * Registers an "effect" that will be scheduled & executed whenever the signals that it reads
 * changes.
 *
 * Angular has two different kinds of effect: component effects and root effects. Component effects
 * are created when `effect()` is called from a component, directive, or within a service of a
 * component/directive. Root effects are created when `effect()` is called from outside the
 * component tree, such as in a root service, or when the `forceRoot` option is provided.
 *
 * The two effect types differ in their timing. Component effects run as a component lifecycle
 * event during Angular's synchronization (change detection) process, and can safely read input
 * signals or create/destroy views that depend on component state. Root effects run as microtasks
 * and have no connection to the component tree or change detection.
 *
 * `effect()` must be run in injection context, unless the `injector` option is manually specified.
 *
 * @developerPreview
 */
declare function effect(effectFn: (onCleanup: EffectCleanupRegisterFn) => void, options?: CreateEffectOptions): EffectRef;
interface EffectNode extends ReactiveNode, SchedulableEffect {
    hasRun: boolean;
    cleanupFns: EffectCleanupFn[] | undefined;
    injector: Injector;
    notifier: ChangeDetectionScheduler;
    onDestroyFn: () => void;
    fn: (cleanupFn: EffectCleanupRegisterFn) => void;
    run(): void;
    destroy(): void;
    maybeCleanup(): void;
}
interface ViewEffectNode extends EffectNode {
    view: LView;
}

/**
 * An unmodifiable list of items that Angular keeps up to date when the state
 * of the application changes.
 *
 * The type of object that {@link ViewChildren}, {@link ContentChildren}, and {@link QueryList}
 * provide.
 *
 * Implements an iterable interface, therefore it can be used in both ES6
 * javascript `for (var i of items)` loops as well as in Angular templates with
 * `*ngFor="let i of myList"`.
 *
 * Changes can be observed by subscribing to the changes `Observable`.
 *
 * NOTE: In the future this class will implement an `Observable` interface.
 *
 * @usageNotes
 * ### Example
 * ```ts
 * @Component({...})
 * class Container {
 *   @ViewChildren(Item) items:QueryList<Item>;
 * }
 * ```
 *
 * @publicApi
 */
declare class QueryList<T> implements Iterable<T> {
    private _emitDistinctChangesOnly;
    readonly dirty = true;
    private _onDirty?;
    private _results;
    private _changesDetected;
    private _changes;
    readonly length: number;
    readonly first: T;
    readonly last: T;
    /**
     * Returns `Observable` of `QueryList` notifying the subscriber of changes.
     */
    get changes(): Observable<any>;
    /**
     * @param emitDistinctChangesOnly Whether `QueryList.changes` should fire only when actual change
     *     has occurred. Or if it should fire when query is recomputed. (recomputing could resolve in
     *     the same result)
     */
    constructor(_emitDistinctChangesOnly?: boolean);
    /**
     * Returns the QueryList entry at `index`.
     */
    get(index: number): T | undefined;
    /**
     * See
     * [Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
     */
    map<U>(fn: (item: T, index: number, array: T[]) => U): U[];
    /**
     * See
     * [Array.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
     */
    filter<S extends T>(predicate: (value: T, index: number, array: readonly T[]) => value is S): S[];
    filter(predicate: (value: T, index: number, array: readonly T[]) => unknown): T[];
    /**
     * See
     * [Array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
     */
    find(fn: (item: T, index: number, array: T[]) => boolean): T | undefined;
    /**
     * See
     * [Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
     */
    reduce<U>(fn: (prevValue: U, curValue: T, curIndex: number, array: T[]) => U, init: U): U;
    /**
     * See
     * [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
     */
    forEach(fn: (item: T, index: number, array: T[]) => void): void;
    /**
     * See
     * [Array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
     */
    some(fn: (value: T, index: number, array: T[]) => boolean): boolean;
    /**
     * Returns a copy of the internal results list as an Array.
     */
    toArray(): T[];
    toString(): string;
    /**
     * Updates the stored data of the query list, and resets the `dirty` flag to `false`, so that
     * on change detection, it will not notify of changes to the queries, unless a new change
     * occurs.
     *
     * @param resultsTree The query results to store
     * @param identityAccessor Optional function for extracting stable object identity from a value
     *    in the array. This function is executed for each element of the query result list while
     *    comparing current query list with the new one (provided as a first argument of the `reset`
     *    function) to detect if the lists are different. If the function is not provided, elements
     *    are compared as is (without any pre-processing).
     */
    reset(resultsTree: Array<T | any[]>, identityAccessor?: (value: T) => unknown): void;
    /**
     * Triggers a change event by emitting on the `changes` {@link EventEmitter}.
     */
    notifyOnChanges(): void;
    /** internal */
    setDirty(): void;
    /** internal */
    destroy(): void;
    [Symbol.iterator]: () => Iterator<T>;
}

/**
 * An object representing query metadata extracted from query annotations.
 */
interface TQueryMetadata {
    predicate: ProviderToken<unknown> | string[];
    read: any;
    flags: QueryFlags;
}
/**
 * A set of flags to be used with Queries.
 *
 * NOTE: Ensure changes here are reflected in `packages/compiler/src/render3/view/compiler.ts`
 */
declare const enum QueryFlags {
    /**
     * No flags
     */
    none = 0,
    /**
     * Whether or not the query should descend into children.
     */
    descendants = 1,
    /**
     * The query can be computed statically and hence can be assigned eagerly.
     *
     * NOTE: Backwards compatibility with ViewEngine.
     */
    isStatic = 2,
    /**
     * If the `QueryList` should fire change event only if actual change to query was computed (vs old
     * behavior where the change was fired whenever the query was recomputed, even if the recomputed
     * query resulted in the same list.)
     */
    emitDistinctChangesOnly = 4
}
/**
 * TQuery objects represent all the query-related data that remain the same from one view instance
 * to another and can be determined on the very first template pass. Most notably TQuery holds all
 * the matches for a given view.
 */
interface TQuery {
    /**
     * Query metadata extracted from query annotations.
     */
    metadata: TQueryMetadata;
    /**
     * Index of a query in a declaration view in case of queries propagated to en embedded view, -1
     * for queries declared in a given view. We are storing this index so we can find a parent query
     * to clone for an embedded view (when an embedded view is created).
     */
    indexInDeclarationView: number;
    /**
     * Matches collected on the first template pass. Each match is a pair of:
     * - TNode index;
     * - match index;
     *
     * A TNode index can be either:
     * - a positive number (the most common case) to indicate a matching TNode;
     * - a negative number to indicate that a given query is crossing a <ng-template> element and
     * results from views created based on TemplateRef should be inserted at this place.
     *
     * A match index is a number used to find an actual value (for a given node) when query results
     * are materialized. This index can have one of the following values:
     * - -2 - indicates that we need to read a special token (TemplateRef, ViewContainerRef etc.);
     * - -1 - indicates that we need to read a default value based on the node type (TemplateRef for
     * ng-template and ElementRef for other elements);
     * - a positive number - index of an injectable to be read from the element injector.
     */
    matches: number[] | null;
    /**
     * A flag indicating if a given query crosses an <ng-template> element. This flag exists for
     * performance reasons: we can notice that queries not crossing any <ng-template> elements will
     * have matches from a given view only (and adapt processing accordingly).
     */
    crossesNgTemplate: boolean;
    /**
     * A method call when a given query is crossing an element (or element container). This is where a
     * given TNode is matched against a query predicate.
     * @param tView
     * @param tNode
     */
    elementStart(tView: TView, tNode: TNode): void;
    /**
     * A method called when processing the elementEnd instruction - this is mostly useful to determine
     * if a given content query should match any nodes past this point.
     * @param tNode
     */
    elementEnd(tNode: TNode): void;
    /**
     * A method called when processing the template instruction. This is where a
     * given TContainerNode is matched against a query predicate.
     * @param tView
     * @param tNode
     */
    template(tView: TView, tNode: TNode): void;
    /**
     * A query-related method called when an embedded TView is created based on the content of a
     * <ng-template> element. We call this method to determine if a given query should be propagated
     * to the embedded view and if so - return a cloned TQuery for this embedded view.
     * @param tNode
     * @param childQueryIndex
     */
    embeddedTView(tNode: TNode, childQueryIndex: number): TQuery | null;
}
/**
 * TQueries represent a collection of individual TQuery objects tracked in a given view. Most of the
 * methods on this interface are simple proxy methods to the corresponding functionality on TQuery.
 */
interface TQueries {
    /**
     * Adds a new TQuery to a collection of queries tracked in a given view.
     * @param tQuery
     */
    track(tQuery: TQuery): void;
    /**
     * Returns a TQuery instance for at the given index  in the queries array.
     * @param index
     */
    getByIndex(index: number): TQuery;
    /**
     * Returns the number of queries tracked in a given view.
     */
    length: number;
    /**
     * A proxy method that iterates over all the TQueries in a given TView and calls the corresponding
     * `elementStart` on each and every TQuery.
     * @param tView
     * @param tNode
     */
    elementStart(tView: TView, tNode: TNode): void;
    /**
     * A proxy method that iterates over all the TQueries in a given TView and calls the corresponding
     * `elementEnd` on each and every TQuery.
     * @param tNode
     */
    elementEnd(tNode: TNode): void;
    /**
     * A proxy method that iterates over all the TQueries in a given TView and calls the corresponding
     * `template` on each and every TQuery.
     * @param tView
     * @param tNode
     */
    template(tView: TView, tNode: TNode): void;
    /**
     * A proxy method that iterates over all the TQueries in a given TView and calls the corresponding
     * `embeddedTView` on each and every TQuery.
     * @param tNode
     */
    embeddedTView(tNode: TNode): TQueries | null;
}
/**
 * An interface that represents query-related information specific to a view instance. Most notably
 * it contains:
 * - materialized query matches;
 * - a pointer to a QueryList where materialized query results should be reported.
 */
interface LQuery<T> {
    /**
     * Materialized query matches for a given view only (!). Results are initialized lazily so the
     * array of matches is set to `null` initially.
     */
    matches: (T | null)[] | null;
    /**
     * A QueryList where materialized query results should be reported.
     */
    queryList: QueryList<T>;
    /**
     * Clones an LQuery for an embedded view. A cloned query shares the same `QueryList` but has a
     * separate collection of materialized matches.
     */
    clone(): LQuery<T>;
    /**
     * Called when an embedded view, impacting results of this query, is inserted or removed.
     */
    setDirty(): void;
}
/**
 * lQueries represent a collection of individual LQuery objects tracked in a given view.
 */
interface LQueries {
    /**
     * A collection of queries tracked in a given view.
     */
    queries: LQuery<any>[];
    /**
     * A method called when a new embedded view is created. As a result a set of LQueries applicable
     * for a new embedded view is instantiated (cloned) from the declaration view.
     * @param tView
     */
    createEmbeddedView(tView: TView): LQueries | null;
    /**
     * A method called when an embedded view is inserted into a container. As a result all impacted
     * `LQuery` objects (and associated `QueryList`) are marked as dirty.
     * @param tView
     */
    insertView(tView: TView): void;
    /**
     * A method called when an embedded view is detached from a container. As a result all impacted
     * `LQuery` objects (and associated `QueryList`) are marked as dirty.
     * @param tView
     */
    detachView(tView: TView): void;
    /**
     * A method called when a view finishes its creation pass. As a result all impacted
     * `LQuery` objects (and associated `QueryList`) are marked as dirty. This additional dirty
     * marking gives us a precise point in time where we can collect results for a given view in an
     * atomic way.
     * @param tView
     */
    finishViewCreation(tView: TView): void;
}

/**
 * Used by `RendererFactory2` to associate custom rendering data and styles
 * with a rendering implementation.
 *  @publicApi
 */
interface RendererType2 {
    /**
     * A unique identifying string for the new renderer, used when creating
     * unique styles for encapsulation.
     */
    id: string;
    /**
     * The view encapsulation type, which determines how styles are applied to
     * DOM elements. One of
     * - `Emulated` (default): Emulate native scoping of styles.
     * - `Native`: Use the native encapsulation mechanism of the renderer.
     * - `ShadowDom`: Use modern [Shadow
     * DOM](https://w3c.github.io/webcomponents/spec/shadow/) and
     * create a ShadowRoot for component's host element.
     * - `None`: Do not provide any template or style encapsulation.
     */
    encapsulation: ViewEncapsulation$1;
    /**
     * Defines CSS styles to be stored on a renderer instance.
     */
    styles: string[];
    /**
     * Defines arbitrary developer-defined data to be stored on a renderer instance.
     * This is useful for renderers that delegate to other renderers.
     */
    data: {
        [kind: string]: any;
    };
    /**
     * A function used by the framework to create the list of external runtime style URLs.
     */
    getExternalStyles?: ((encapsulationId?: string) => string[]) | null;
}
/**
 * Flags for renderer-specific style modifiers.
 * @publicApi
 */
declare enum RendererStyleFlags2 {
    /**
     * Marks a style as important.
     */
    Important = 1,
    /**
     * Marks a style as using dash case naming (this-is-dash-case).
     */
    DashCase = 2
}

/**
 * Creates and initializes a custom renderer that implements the `Renderer2` base class.
 *
 * @publicApi
 */
declare abstract class RendererFactory2 {
    /**
     * Creates and initializes a custom renderer for a host DOM element.
     * @param hostElement The element to render.
     * @param type The base class to implement.
     * @returns The new custom renderer instance.
     */
    abstract createRenderer(hostElement: any, type: RendererType2 | null): Renderer2;
    /**
     * A callback invoked when rendering has begun.
     */
    abstract begin?(): void;
    /**
     * A callback invoked when rendering has completed.
     */
    abstract end?(): void;
    /**
     * Use with animations test-only mode. Notifies the test when rendering has completed.
     * @returns The asynchronous result of the developer-defined function.
     */
    abstract whenRenderingDone?(): Promise<any>;
}
/**
 * Extend this base class to implement custom rendering. By default, Angular
 * renders a template into DOM. You can use custom rendering to intercept
 * rendering calls, or to render to something other than DOM.
 *
 * <div class="docs-alert docs-alert-important">
 * <p>
 * Please be aware that usage of `Renderer2`, in context of accessing DOM elements, provides no
 * extra security which makes it equivalent to
 * {@link /best-practices/security#direct-use-of-the-dom-apis-and-explicit-sanitization-calls Security vulnerabilities}.
 * </p>
 * </div>
 *
 * Create your custom renderer using `RendererFactory2`.
 *
 * Use a custom renderer to bypass Angular's templating and
 * make custom UI changes that can't be expressed declaratively.
 * For example if you need to set a property or an attribute whose name is
 * not statically known, use the `setProperty()` or
 * `setAttribute()` method.
 *
 * @publicApi
 */
declare abstract class Renderer2 {
    /**
     * Use to store arbitrary developer-defined data on a renderer instance,
     * as an object containing key-value pairs.
     * This is useful for renderers that delegate to other renderers.
     */
    abstract get data(): {
        [key: string]: any;
    };
    /**
     * Implement this callback to destroy the renderer or the host element.
     */
    abstract destroy(): void;
    /**
     * Implement this callback to create an instance of the host element.
     * @param name An identifying name for the new element, unique within the namespace.
     * @param namespace The namespace for the new element.
     * @returns The new element.
     */
    abstract createElement(name: string, namespace?: string | null): any;
    /**
     * Implement this callback to add a comment to the DOM of the host element.
     * @param value The comment text.
     * @returns The modified element.
     */
    abstract createComment(value: string): any;
    /**
     * Implement this callback to add text to the DOM of the host element.
     * @param value The text string.
     * @returns The modified element.
     */
    abstract createText(value: string): any;
    /**
     * If null or undefined, the view engine won't call it.
     * This is used as a performance optimization for production mode.
     */
    destroyNode: ((node: any) => void) | null;
    /**
     * Appends a child to a given parent node in the host element DOM.
     * @param parent The parent node.
     * @param newChild The new child node.
     */
    abstract appendChild(parent: any, newChild: any): void;
    /**
     * Implement this callback to insert a child node at a given position in a parent node
     * in the host element DOM.
     * @param parent The parent node.
     * @param newChild The new child nodes.
     * @param refChild The existing child node before which `newChild` is inserted.
     * @param isMove Optional argument which signifies if the current `insertBefore` is a result of a
     *     move. Animation uses this information to trigger move animations. In the past the Animation
     *     would always assume that any `insertBefore` is a move. This is not strictly true because
     *     with runtime i18n it is possible to invoke `insertBefore` as a result of i18n and it should
     *     not trigger an animation move.
     */
    abstract insertBefore(parent: any, newChild: any, refChild: any, isMove?: boolean): void;
    /**
     * Implement this callback to remove a child node from the host element's DOM.
     * @param parent The parent node.
     * @param oldChild The child node to remove.
     * @param isHostElement Optionally signal to the renderer whether this element is a host element
     * or not
     */
    abstract removeChild(parent: any, oldChild: any, isHostElement?: boolean): void;
    /**
     * Implement this callback to prepare an element to be bootstrapped
     * as a root element, and return the element instance.
     * @param selectorOrNode The DOM element.
     * @param preserveContent Whether the contents of the root element
     * should be preserved, or cleared upon bootstrap (default behavior).
     * Use with `ViewEncapsulation.ShadowDom` to allow simple native
     * content projection via `<slot>` elements.
     * @returns The root element.
     */
    abstract selectRootElement(selectorOrNode: string | any, preserveContent?: boolean): any;
    /**
     * Implement this callback to get the parent of a given node
     * in the host element's DOM.
     * @param node The child node to query.
     * @returns The parent node, or null if there is no parent.
     * This is because the check is synchronous,
     * and the caller can't rely on checking for null.
     */
    abstract parentNode(node: any): any;
    /**
     * Implement this callback to get the next sibling node of a given node
     * in the host element's DOM.
     * @returns The sibling node, or null if there is no sibling.
     * This is because the check is synchronous,
     * and the caller can't rely on checking for null.
     */
    abstract nextSibling(node: any): any;
    /**
     * Implement this callback to set an attribute value for an element in the DOM.
     * @param el The element.
     * @param name The attribute name.
     * @param value The new value.
     * @param namespace The namespace.
     */
    abstract setAttribute(el: any, name: string, value: string, namespace?: string | null): void;
    /**
     * Implement this callback to remove an attribute from an element in the DOM.
     * @param el The element.
     * @param name The attribute name.
     * @param namespace The namespace.
     */
    abstract removeAttribute(el: any, name: string, namespace?: string | null): void;
    /**
     * Implement this callback to add a class to an element in the DOM.
     * @param el The element.
     * @param name The class name.
     */
    abstract addClass(el: any, name: string): void;
    /**
     * Implement this callback to remove a class from an element in the DOM.
     * @param el The element.
     * @param name The class name.
     */
    abstract removeClass(el: any, name: string): void;
    /**
     * Implement this callback to set a CSS style for an element in the DOM.
     * @param el The element.
     * @param style The name of the style.
     * @param value The new value.
     * @param flags Flags for style variations. No flags are set by default.
     */
    abstract setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2): void;
    /**
     * Implement this callback to remove the value from a CSS style for an element in the DOM.
     * @param el The element.
     * @param style The name of the style.
     * @param flags Flags for style variations to remove, if set. ???
     */
    abstract removeStyle(el: any, style: string, flags?: RendererStyleFlags2): void;
    /**
     * Implement this callback to set the value of a property of an element in the DOM.
     * @param el The element.
     * @param name The property name.
     * @param value The new value.
     */
    abstract setProperty(el: any, name: string, value: any): void;
    /**
     * Implement this callback to set the value of a node in the host element.
     * @param node The node.
     * @param value The new value.
     */
    abstract setValue(node: any, value: string): void;
    /**
     * Implement this callback to start an event listener.
     * @param target The context in which to listen for events. Can be
     * the entire window or document, the body of the document, or a specific
     * DOM element.
     * @param eventName The event to listen for.
     * @param callback A handler function to invoke when the event occurs.
     * @param options Options that configure how the event listener is bound.
     * @returns An "unlisten" function for disposing of this handler.
     */
    abstract listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void, options?: ListenerOptions): () => void;
}
/**
 * This enum is meant to be used by `ɵtype` properties of the different renderers implemented
 * by the framework
 *
 * We choose to not add `ɵtype` to `Renderer2` to no expose it to the public API.
 */
declare const enum AnimationRendererType {
    Regular = 0,
    Delegated = 1
}
/**
 * Options that can be used to configure an event listener.
 * @publicApi
 */
interface ListenerOptions {
    capture?: boolean;
    once?: boolean;
    passive?: boolean;
}

/**
 * The goal here is to make sure that the browser DOM API is the Renderer.
 * We do this by defining a subset of DOM API to be the renderer and then
 * use that at runtime for rendering.
 *
 * At runtime we can then use the DOM api directly, in server or web-worker
 * it will be easy to implement such API.
 */
type GlobalTargetName = 'document' | 'window' | 'body';
type GlobalTargetResolver = (element: any) => EventTarget;
/**
 * Procedural style of API needed to create elements and text nodes.
 *
 * In non-native browser environments (e.g. platforms such as web-workers), this is the
 * facade that enables element manipulation. In practice, this is implemented by `Renderer2`.
 */
interface Renderer {
    destroy(): void;
    createComment(value: string): RComment;
    createElement(name: string, namespace?: string | null): RElement;
    createText(value: string): RText;
    /**
     * This property is allowed to be null / undefined,
     * in which case the view engine won't call it.
     * This is used as a performance optimization for production mode.
     */
    destroyNode?: ((node: RNode) => void) | null;
    appendChild(parent: RElement, newChild: RNode): void;
    insertBefore(parent: RNode, newChild: RNode, refChild: RNode | null, isMove?: boolean): void;
    removeChild(parent: RElement | null, oldChild: RNode, isHostElement?: boolean): void;
    selectRootElement(selectorOrNode: string | any, preserveContent?: boolean): RElement;
    parentNode(node: RNode): RElement | null;
    nextSibling(node: RNode): RNode | null;
    setAttribute(el: RElement, name: string, value: string | TrustedHTML | TrustedScript | TrustedScriptURL, namespace?: string | null): void;
    removeAttribute(el: RElement, name: string, namespace?: string | null): void;
    addClass(el: RElement, name: string): void;
    removeClass(el: RElement, name: string): void;
    setStyle(el: RElement, style: string, value: any, flags?: RendererStyleFlags2): void;
    removeStyle(el: RElement, style: string, flags?: RendererStyleFlags2): void;
    setProperty(el: RElement, name: string, value: any): void;
    setValue(node: RText | RComment, value: string): void;
    listen(target: GlobalTargetName | RNode, eventName: string, callback: (event: any) => boolean | void, options?: ListenerOptions): () => void;
}
interface RendererFactory {
    createRenderer(hostElement: RElement | null, rendererType: RendererType2 | null): Renderer;
    begin?(): void;
    end?(): void;
}

declare const HOST = 0;
declare const TVIEW = 1;
declare const FLAGS = 2;
declare const PARENT = 3;
declare const NEXT = 4;
declare const T_HOST = 5;
declare const HYDRATION = 6;
declare const CLEANUP = 7;
declare const CONTEXT = 8;
declare const INJECTOR$1 = 9;
declare const ENVIRONMENT = 10;
declare const RENDERER = 11;
declare const CHILD_HEAD = 12;
declare const CHILD_TAIL = 13;
declare const DECLARATION_VIEW = 14;
declare const DECLARATION_COMPONENT_VIEW = 15;
declare const DECLARATION_LCONTAINER = 16;
declare const PREORDER_HOOK_FLAGS = 17;
declare const QUERIES = 18;
declare const ID = 19;
declare const EMBEDDED_VIEW_INJECTOR = 20;
declare const ON_DESTROY_HOOKS = 21;
declare const EFFECTS_TO_SCHEDULE = 22;
declare const EFFECTS = 23;
declare const REACTIVE_TEMPLATE_CONSUMER = 24;
declare const AFTER_RENDER_SEQUENCES_TO_ADD = 25;
interface OpaqueViewState {
    '__brand__': 'Brand for OpaqueViewState that nothing will match';
}
/**
 * `LView` stores all of the information needed to process the instructions as
 * they are invoked from the template. Each embedded view and component view has its
 * own `LView`. When processing a particular view, we set the `viewData` to that
 * `LView`. When that view is done processing, the `viewData` is set back to
 * whatever the original `viewData` was before (the parent `LView`).
 *
 * Keeping separate state for each view facilities view insertion / deletion, so we
 * don't have to edit the data array based on which views are present.
 */
interface LView<T = unknown> extends Array<any> {
    /**
     * The node into which this `LView` is inserted.
     */
    [HOST]: RElement | null;
    /**
     * The static data for this view. We need a reference to this so we can easily walk up the
     * node tree in DI and get the TView.data array associated with a node (where the
     * directive defs are stored).
     */
    readonly [TVIEW]: TView;
    /** Flags for this view. See LViewFlags for more info. */
    [FLAGS]: LViewFlags;
    /**
     * This may store an {@link LView} or {@link LContainer}.
     *
     * `LView` - The parent view. This is needed when we exit the view and must restore the previous
     * LView. Without this, the render method would have to keep a stack of
     * views as it is recursively rendering templates.
     *
     * `LContainer` - The current view is part of a container, and is an embedded view.
     */
    [PARENT]: LView | LContainer | null;
    /**
     *
     * The next sibling LView or LContainer.
     *
     * Allows us to propagate between sibling view states that aren't in the same
     * container. Embedded views already have a node.next, but it is only set for
     * views in the same container. We need a way to link component views and views
     * across containers as well.
     */
    [NEXT]: LView | LContainer | null;
    /** Queries active for this view - nodes from a view are reported to those queries. */
    [QUERIES]: LQueries | null;
    /**
     * Store the `TNode` of the location where the current `LView` is inserted into.
     *
     * Given:
     * ```html
     * <div>
     *   <ng-template><span></span></ng-template>
     * </div>
     * ```
     *
     * We end up with two `TView`s.
     * - `parent` `TView` which contains `<div><!-- anchor --></div>`
     * - `child` `TView` which contains `<span></span>`
     *
     * Typically the `child` is inserted into the declaration location of the `parent`, but it can be
     * inserted anywhere. Because it can be inserted anywhere it is not possible to store the
     * insertion information in the `TView` and instead we must store it in the `LView[T_HOST]`.
     *
     * So to determine where is our insertion parent we would execute:
     * ```ts
     * const parentLView = lView[PARENT];
     * const parentTNode = lView[T_HOST];
     * const insertionParent = parentLView[parentTNode.index];
     * ```
     *
     *
     * If `null`, this is the root view of an application (root component is in this view) and it has
     * no parents.
     */
    [T_HOST]: TNode | null;
    /**
     * When a view is destroyed, listeners need to be released and outputs need to be
     * unsubscribed. This context array stores both listener functions wrapped with
     * their context and output subscription instances for a particular view.
     *
     * These change per LView instance, so they cannot be stored on TView. Instead,
     * TView.cleanup saves an index to the necessary context in this array.
     *
     * After `LView` is created it is possible to attach additional instance specific functions at the
     * end of the `lView[CLEANUP]` because we know that no more `T` level cleanup functions will be
     * added here.
     */
    [CLEANUP]: any[] | null;
    /**
     * - For dynamic views, this is the context with which to render the template (e.g.
     *   `NgForContext`), or `{}` if not defined explicitly.
     * - For root view of the root component it's a reference to the component instance itself.
     * - For components, the context is a reference to the component instance itself.
     * - For inline views, the context is null.
     */
    [CONTEXT]: T;
    /** A Module Injector to be used as fall back after Element Injectors are consulted. */
    readonly [INJECTOR$1]: Injector;
    /**
     * Contextual data that is shared across multiple instances of `LView` in the same application.
     */
    [ENVIRONMENT]: LViewEnvironment;
    /** Renderer to be used for this view. */
    [RENDERER]: Renderer;
    /**
     * Reference to the first LView or LContainer beneath this LView in
     * the hierarchy.
     *
     * Necessary to store this so views can traverse through their nested views
     * to remove listeners and call onDestroy callbacks.
     */
    [CHILD_HEAD]: LView | LContainer | null;
    /**
     * The last LView or LContainer beneath this LView in the hierarchy.
     *
     * The tail allows us to quickly add a new state to the end of the view list
     * without having to propagate starting from the first child.
     */
    [CHILD_TAIL]: LView | LContainer | null;
    /**
     * View where this view's template was declared.
     *
     * The template for a dynamically created view may be declared in a different view than
     * it is inserted. We already track the "insertion view" (view where the template was
     * inserted) in LView[PARENT], but we also need access to the "declaration view"
     * (view where the template was declared). Otherwise, we wouldn't be able to call the
     * view's template function with the proper contexts. Context should be inherited from
     * the declaration view tree, not the insertion view tree.
     *
     * Example (AppComponent template):
     *
     * <ng-template #foo></ng-template>       <-- declared here -->
     * <some-comp [tpl]="foo"></some-comp>    <-- inserted inside this component -->
     *
     * The <ng-template> above is declared in the AppComponent template, but it will be passed into
     * SomeComp and inserted there. In this case, the declaration view would be the AppComponent,
     * but the insertion view would be SomeComp. When we are removing views, we would want to
     * traverse through the insertion view to clean up listeners. When we are calling the
     * template function during change detection, we need the declaration view to get inherited
     * context.
     */
    [DECLARATION_VIEW]: LView | null;
    /**
     * Points to the declaration component view, used to track transplanted `LView`s.
     *
     * See: `DECLARATION_VIEW` which points to the actual `LView` where it was declared, whereas
     * `DECLARATION_COMPONENT_VIEW` points to the component which may not be same as
     * `DECLARATION_VIEW`.
     *
     * Example:
     * ```html
     * <#VIEW #myComp>
     *  <div *ngIf="true">
     *   <ng-template #myTmpl>...</ng-template>
     *  </div>
     * </#VIEW>
     * ```
     * In the above case `DECLARATION_VIEW` for `myTmpl` points to the `LView` of `ngIf` whereas
     * `DECLARATION_COMPONENT_VIEW` points to `LView` of the `myComp` which owns the template.
     *
     * The reason for this is that all embedded views are always check-always whereas the component
     * view can be check-always or on-push. When we have a transplanted view it is important to
     * determine if we have transplanted a view from check-always declaration to on-push insertion
     * point. In such a case the transplanted view needs to be added to the `LContainer` in the
     * declared `LView` and CD during the declared view CD (in addition to the CD at the insertion
     * point.) (Any transplanted views which are intra Component are of no interest because the CD
     * strategy of declaration and insertion will always be the same, because it is the same
     * component.)
     *
     * Queries already track moved views in `LView[DECLARATION_LCONTAINER]` and
     * `LContainer[MOVED_VIEWS]`. However the queries also track `LView`s which moved within the same
     * component `LView`. Transplanted views are a subset of moved views, and we use
     * `DECLARATION_COMPONENT_VIEW` to differentiate them. As in this example.
     *
     * Example showing intra component `LView` movement.
     * ```html
     * <#VIEW #myComp>
     *   <div *ngIf="condition; then thenBlock else elseBlock"></div>
     *   <ng-template #thenBlock>Content to render when condition is true.</ng-template>
     *   <ng-template #elseBlock>Content to render when condition is false.</ng-template>
     * </#VIEW>
     * ```
     * The `thenBlock` and `elseBlock` is moved but not transplanted.
     *
     * Example showing inter component `LView` movement (transplanted view).
     * ```html
     * <#VIEW #myComp>
     *   <ng-template #myTmpl>...</ng-template>
     *   <insertion-component [template]="myTmpl"></insertion-component>
     * </#VIEW>
     * ```
     * In the above example `myTmpl` is passed into a different component. If `insertion-component`
     * instantiates `myTmpl` and `insertion-component` is on-push then the `LContainer` needs to be
     * marked as containing transplanted views and those views need to be CD as part of the
     * declaration CD.
     *
     *
     * When change detection runs, it iterates over `[MOVED_VIEWS]` and CDs any child `LView`s where
     * the `DECLARATION_COMPONENT_VIEW` of the current component and the child `LView` does not match
     * (it has been transplanted across components.)
     *
     * Note: `[DECLARATION_COMPONENT_VIEW]` points to itself if the LView is a component view (the
     *       simplest / most common case).
     *
     * see also:
     *   - https://hackmd.io/@mhevery/rJUJsvv9H write up of the problem
     *   - `LContainer[HAS_TRANSPLANTED_VIEWS]` which marks which `LContainer` has transplanted views.
     *   - `LContainer[TRANSPLANT_HEAD]` and `LContainer[TRANSPLANT_TAIL]` storage for transplanted
     *   - `LView[DECLARATION_LCONTAINER]` similar problem for queries
     *   - `LContainer[MOVED_VIEWS]` similar problem for queries
     */
    [DECLARATION_COMPONENT_VIEW]: LView;
    /**
     * A declaration point of embedded views (ones instantiated based on the content of a
     * <ng-template>), null for other types of views.
     *
     * We need to track all embedded views created from a given declaration point so we can prepare
     * query matches in a proper order (query matches are ordered based on their declaration point and
     * _not_ the insertion point).
     */
    [DECLARATION_LCONTAINER]: LContainer | null;
    /**
     * More flags for this view. See PreOrderHookFlags for more info.
     */
    [PREORDER_HOOK_FLAGS]: PreOrderHookFlags;
    /   ** Unique ID of the view. Used for `__ngContext__` lookups in the `LView` registry. */
    [ID]: number;
    /**
     * A container related to hydration annotation information that's associated with this LView.
     */
    [HYDRATION]: DehydratedView | null;
    /**
     * Optional injector assigned to embedded views that takes
     * precedence over the element and module injectors.
     */
    readonly [EMBEDDED_VIEW_INJECTOR]: Injector | null;
    /**
     * Effect scheduling operations that need to run during this views's update pass.
     */
    [EFFECTS_TO_SCHEDULE]: Array<() => void> | null;
    [EFFECTS]: Set<ViewEffectNode> | null;
    /**
     * A collection of callbacks functions that are executed when a given LView is destroyed. Those
     * are user defined, LView-specific destroy callbacks that don't have any corresponding TView
     * entries.
     */
    [ON_DESTROY_HOOKS]: Array<() => void> | null;
    /**
     * The `Consumer` for this `LView`'s template so that signal reads can be tracked.
     *
     * This is initially `null` and gets assigned a consumer after template execution
     * if any signals were read.
     */
    [REACTIVE_TEMPLATE_CONSUMER]: ReactiveLViewConsumer | null;
    [AFTER_RENDER_SEQUENCES_TO_ADD]: AfterRenderSequence[] | null;
}
/**
 * Contextual data that is shared across multiple instances of `LView` in the same application.
 */
interface LViewEnvironment {
    /** Factory to be used for creating Renderer. */
    rendererFactory: RendererFactory;
    /** An optional custom sanitizer. */
    sanitizer: Sanitizer | null;
    /** Scheduler for change detection to notify when application state changes. */
    changeDetectionScheduler: ChangeDetectionScheduler | null;
}
/** Flags associated with an LView (saved in LView[FLAGS]) */
declare const enum LViewFlags {
    /** The state of the init phase on the first 2 bits */
    InitPhaseStateIncrementer = 1,
    InitPhaseStateMask = 3,
    /**
     * Whether or not the view is in creationMode.
     *
     * This must be stored in the view rather than using `data` as a marker so that
     * we can properly support embedded views. Otherwise, when exiting a child view
     * back into the parent view, `data` will be defined and `creationMode` will be
     * improperly reported as false.
     */
    CreationMode = 4,
    /**
     * Whether or not this LView instance is on its first processing pass.
     *
     * An LView instance is considered to be on its "first pass" until it
     * has completed one creation mode run and one update mode run. At this
     * time, the flag is turned off.
     */
    FirstLViewPass = 8,
    /** Whether this view has default change detection strategy (checks always) or onPush */
    CheckAlways = 16,
    /** Whether there are any i18n blocks inside this LView. */
    HasI18n = 32,
    /** Whether or not this view is currently dirty (needing check) */
    Dirty = 64,
    /** Whether or not this view is currently attached to change detection tree. */
    Attached = 128,
    /** Whether or not this view is destroyed. */
    Destroyed = 256,
    /** Whether or not this view is the root view */
    IsRoot = 512,
    /**
     * Whether this moved LView needs to be refreshed. Similar to the Dirty flag, but used for
     * transplanted and signal views where the parent/ancestor views are not marked dirty as well.
     * i.e. "Refresh just this view". Used in conjunction with the HAS_CHILD_VIEWS_TO_REFRESH
     * flag.
     */
    RefreshView = 1024,
    /** Indicates that the view **or any of its ancestors** have an embedded view injector. */
    HasEmbeddedViewInjector = 2048,
    /** Indicates that the view was created with `signals: true`. */
    SignalView = 4096,
    /**
     * Indicates that this LView has a view underneath it that needs to be refreshed during change
     * detection. This flag indicates that even if this view is not dirty itself, we still need to
     * traverse its children during change detection.
     */
    HasChildViewsToRefresh = 8192,
    /**
     * This is the count of the bits the 1 was shifted above (base 10)
     */
    IndexWithinInitPhaseShift = 14,
    /**
     * Index of the current init phase on last 21 bits
     */
    IndexWithinInitPhaseIncrementer = 16384,
    IndexWithinInitPhaseReset = 16383
}
/** More flags associated with an LView (saved in LView[PREORDER_HOOK_FLAGS]) */
declare const enum PreOrderHookFlags {
    /**
       The index of the next pre-order hook to be called in the hooks array, on the first 16
       bits
     */
    IndexOfTheNextPreOrderHookMaskMask = 65535,
    /**
     * The number of init hooks that have already been called, on the last 16 bits
     */
    NumberOfInitHooksCalledIncrementer = 65536,
    NumberOfInitHooksCalledShift = 16,
    NumberOfInitHooksCalledMask = 4294901760
}
/**
 * Stores a set of OpCodes to process `HostBindingsFunction` associated with a current view.
 *
 * In order to invoke `HostBindingsFunction` we need:
 * 1. 'elementIdx`: Index to the element associated with the `HostBindingsFunction`.
 * 2. 'directiveIdx`: Index to the directive associated with the `HostBindingsFunction`. (This will
 *    become the context for the `HostBindingsFunction` invocation.)
 * 3. `bindingRootIdx`: Location where the bindings for the `HostBindingsFunction` start. Internally
 *    `HostBindingsFunction` binding indexes start from `0` so we need to add `bindingRootIdx` to
 *    it.
 * 4. `HostBindingsFunction`: A host binding function to execute.
 *
 * The above information needs to be encoded into the `HostBindingOpCodes` in an efficient manner.
 *
 * 1. `elementIdx` is encoded into the `HostBindingOpCodes` as `~elementIdx` (so a negative number);
 * 2. `directiveIdx`
 * 3. `bindingRootIdx`
 * 4. `HostBindingsFunction` is passed in as is.
 *
 * The `HostBindingOpCodes` array contains:
 * - negative number to select the element index.
 * - followed by 1 or more of:
 *    - a number to select the directive index
 *    - a number to select the bindingRoot index
 *    - and a function to invoke.
 *
 * ## Example
 *
 * ```ts
 * const hostBindingOpCodes = [
 *   ~30,                               // Select element 30
 *   40, 45, MyDir.ɵdir.hostBindings    // Invoke host bindings on MyDir on element 30;
 *                                      // directiveIdx = 40; bindingRootIdx = 45;
 *   50, 55, OtherDir.ɵdir.hostBindings // Invoke host bindings on OtherDire on element 30
 *                                      // directiveIdx = 50; bindingRootIdx = 55;
 * ]
 * ```
 *
 * ## Pseudocode
 * ```ts
 * const hostBindingOpCodes = tView.hostBindingOpCodes;
 * if (hostBindingOpCodes === null) return;
 * for (let i = 0; i < hostBindingOpCodes.length; i++) {
 *   const opCode = hostBindingOpCodes[i] as number;
 *   if (opCode < 0) {
 *     // Negative numbers are element indexes.
 *     setSelectedIndex(~opCode);
 *   } else {
 *     // Positive numbers are NumberTuple which store bindingRootIndex and directiveIndex.
 *     const directiveIdx = opCode;
 *     const bindingRootIndx = hostBindingOpCodes[++i] as number;
 *     const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction<any>;
 *     setBindingRootForHostBindings(bindingRootIndx, directiveIdx);
 *     const context = lView[directiveIdx];
 *     hostBindingFn(RenderFlags.Update, context);
 *   }
 * }
 * ```
 *
 */
interface HostBindingOpCodes extends Array<number | HostBindingsFunction<any>> {
    __brand__: 'HostBindingOpCodes';
    debug?: string[];
}
/**
 * Explicitly marks `TView` as a specific type in `ngDevMode`
 *
 * It is useful to know conceptually what time of `TView` we are dealing with when
 * debugging an application (even if the runtime does not need it.) For this reason
 * we store this information in the `ngDevMode` `TView` and than use it for
 * better debugging experience.
 */
declare const enum TViewType {
    /**
     * Root `TView` is the used to bootstrap components into. It is used in conjunction with
     * `LView` which takes an existing DOM node not owned by Angular and wraps it in `TView`/`LView`
     * so that other components can be loaded into it.
     */
    Root = 0,
    /**
     * `TView` associated with a Component. This would be the `TView` directly associated with the
     * component view (as opposed an `Embedded` `TView` which would be a child of `Component` `TView`)
     */
    Component = 1,
    /**
     * `TView` associated with a template. Such as `*ngIf`, `<ng-template>` etc... A `Component`
     * can have zero or more `Embedded` `TView`s.
     */
    Embedded = 2
}
/**
 * The static data for an LView (shared between all templates of a
 * given type).
 *
 * Stored on the `ComponentDef.tView`.
 */
interface TView {
    /**
     * Type of `TView` (`Root`|`Component`|`Embedded`).
     */
    type: TViewType;
    /**
     * This is a blueprint used to generate LView instances for this TView. Copying this
     * blueprint is faster than creating a new LView from scratch.
     */
    blueprint: LView;
    /**
     * The template function used to refresh the view of dynamically created views
     * and components. Will be null for inline views.
     */
    template: ComponentTemplate<{}> | null;
    /**
     * A function containing query-related instructions.
     */
    viewQuery: ViewQueriesFunction<{}> | null;
    /**
     * A `TNode` representing the declaration location of this `TView` (not part of this TView).
     */
    declTNode: TNode | null;
    /** Whether or not this template has been processed in creation mode. */
    firstCreatePass: boolean;
    /**
     *  Whether or not this template has been processed in update mode (e.g. change detected)
     *
     * `firstUpdatePass` is used by styling to set up `TData` to contain metadata about the styling
     * instructions. (Mainly to build up a linked list of styling priority order.)
     *
     * Typically this function gets cleared after first execution. If exception is thrown then this
     * flag can remain turned un until there is first successful (no exception) pass. This means that
     * individual styling instructions keep track of if they have already been added to the linked
     * list to prevent double adding.
     */
    firstUpdatePass: boolean;
    /** Static data equivalent of LView.data[]. Contains TNodes, PipeDefInternal or TI18n. */
    data: TData;
    /**
     * The binding start index is the index at which the data array
     * starts to store bindings only. Saving this value ensures that we
     * will begin reading bindings at the correct point in the array when
     * we are in update mode.
     *
     * -1 means that it has not been initialized.
     */
    bindingStartIndex: number;
    /**
     * The index where the "expando" section of `LView` begins. The expando
     * section contains injectors, directive instances, and host binding values.
     * Unlike the "decls" and "vars" sections of `LView`, the length of this
     * section cannot be calculated at compile-time because directives are matched
     * at runtime to preserve locality.
     *
     * We store this start index so we know where to start checking host bindings
     * in `setHostBindings`.
     */
    expandoStartIndex: number;
    /**
     * Whether or not there are any static view queries tracked on this view.
     *
     * We store this so we know whether or not we should do a view query
     * refresh after creation mode to collect static query results.
     */
    staticViewQueries: boolean;
    /**
     * Whether or not there are any static content queries tracked on this view.
     *
     * We store this so we know whether or not we should do a content query
     * refresh after creation mode to collect static query results.
     */
    staticContentQueries: boolean;
    /**
     * A reference to the first child node located in the view.
     */
    firstChild: TNode | null;
    /**
     * Stores the OpCodes to be replayed during change-detection to process the `HostBindings`
     *
     * See `HostBindingOpCodes` for encoding details.
     */
    hostBindingOpCodes: HostBindingOpCodes | null;
    /**
     * Full registry of directives and components that may be found in this view.
     *
     * It's necessary to keep a copy of the full def list on the TView so it's possible
     * to render template functions without a host component.
     */
    directiveRegistry: DirectiveDefList | null;
    /**
     * Full registry of pipes that may be found in this view.
     *
     * The property is either an array of `PipeDefs`s or a function which returns the array of
     * `PipeDefs`s. The function is necessary to be able to support forward declarations.
     *
     * It's necessary to keep a copy of the full def list on the TView so it's possible
     * to render template functions without a host component.
     */
    pipeRegistry: PipeDefList | null;
    /**
     * Array of ngOnInit, ngOnChanges and ngDoCheck hooks that should be executed for this view in
     * creation mode.
     *
     * This array has a flat structure and contains TNode indices, directive indices (where an
     * instance can be found in `LView`) and hook functions. TNode index is followed by the directive
     * index and a hook function. If there are multiple hooks for a given TNode, the TNode index is
     * not repeated and the next lifecycle hook information is stored right after the previous hook
     * function. This is done so that at runtime the system can efficiently iterate over all of the
     * functions to invoke without having to make any decisions/lookups.
     */
    preOrderHooks: HookData | null;
    /**
     * Array of ngOnChanges and ngDoCheck hooks that should be executed for this view in update mode.
     *
     * This array has the same structure as the `preOrderHooks` one.
     */
    preOrderCheckHooks: HookData | null;
    /**
     * Array of ngAfterContentInit and ngAfterContentChecked hooks that should be executed
     * for this view in creation mode.
     *
     * Even indices: Directive index
     * Odd indices: Hook function
     */
    contentHooks: HookData | null;
    /**
     * Array of ngAfterContentChecked hooks that should be executed for this view in update
     * mode.
     *
     * Even indices: Directive index
     * Odd indices: Hook function
     */
    contentCheckHooks: HookData | null;
    /**
     * Array of ngAfterViewInit and ngAfterViewChecked hooks that should be executed for
     * this view in creation mode.
     *
     * Even indices: Directive index
     * Odd indices: Hook function
     */
    viewHooks: HookData | null;
    /**
     * Array of ngAfterViewChecked hooks that should be executed for this view in
     * update mode.
     *
     * Even indices: Directive index
     * Odd indices: Hook function
     */
    viewCheckHooks: HookData | null;
    /**
     * Array of ngOnDestroy hooks that should be executed when this view is destroyed.
     *
     * Even indices: Directive index
     * Odd indices: Hook function
     */
    destroyHooks: DestroyHookData | null;
    /**
     * When a view is destroyed, listeners need to be released and outputs need to be
     * unsubscribed. This cleanup array stores both listener data (in chunks of 4)
     * and output data (in chunks of 2) for a particular view. Combining the arrays
     * saves on memory (70 bytes per array) and on a few bytes of code size (for two
     * separate for loops).
     *
     * If it's a native DOM listener or output subscription being stored:
     * 1st index is: event name  `name = tView.cleanup[i+0]`
     * 2nd index is: index of native element or a function that retrieves global target (window,
     *               document or body) reference based on the native element:
     *    `typeof idxOrTargetGetter === 'function'`: global target getter function
     *    `typeof idxOrTargetGetter === 'number'`: index of native element
     *
     * 3rd index is: index of listener function `listener = lView[CLEANUP][tView.cleanup[i+2]]`
     * 4th index is: `useCaptureOrIndx = tView.cleanup[i+3]`
     *    `typeof useCaptureOrIndx == 'boolean' : useCapture boolean
     *    `typeof useCaptureOrIndx == 'number':
     *         `useCaptureOrIndx >= 0` `removeListener = LView[CLEANUP][useCaptureOrIndx]`
     *         `useCaptureOrIndx <  0` `subscription = LView[CLEANUP][-useCaptureOrIndx]`
     *
     * If it's an output subscription or query list destroy hook:
     * 1st index is: output unsubscribe function / query list destroy function
     * 2nd index is: index of function context in LView.cleanupInstances[]
     *               `tView.cleanup[i+0].call(lView[CLEANUP][tView.cleanup[i+1]])`
     */
    cleanup: any[] | null;
    /**
     * A list of element indices for child components that will need to be
     * refreshed when the current view has finished its check. These indices have
     * already been adjusted for the HEADER_OFFSET.
     *
     */
    components: number[] | null;
    /**
     * A collection of queries tracked in a given view.
     */
    queries: TQueries | null;
    /**
     * An array of indices pointing to directives with content queries alongside with the
     * corresponding query index. Each entry in this array is a tuple of:
     * - index of the first content query index declared by a given directive;
     * - index of a directive.
     *
     * We are storing those indexes so we can refresh content queries as part of a view refresh
     * process.
     */
    contentQueries: number[] | null;
    /**
     * Set of schemas that declare elements to be allowed inside the view.
     */
    schemas: SchemaMetadata[] | null;
    /**
     * Array of constants for the view. Includes attribute arrays, local definition arrays etc.
     * Used for directive matching, attribute bindings, local definitions and more.
     */
    consts: TConstants | null;
    /**
     * Indicates that there was an error before we managed to complete the first create pass of the
     * view. This means that the view is likely corrupted and we should try to recover it.
     */
    incompleteFirstPass: boolean;
    /**
     * Unique id of this TView for hydration purposes:
     * - TViewType.Embedded: a unique id generated during serialization on the server
     * - TViewType.Component: an id generated based on component properties
     *                        (see `getComponentId` function for details)
     */
    ssrId: string | null;
}
/** Single hook callback function. */
type HookFn = () => void;
/**
 * Information necessary to call a hook. E.g. the callback that
 * needs to invoked and the index at which to find its context.
 */
type HookEntry = number | HookFn;
/**
 * Array of hooks that should be executed for a view and their directive indices.
 *
 * For each node of the view, the following data is stored:
 * 1) Node index (optional)
 * 2) A series of number/function pairs where:
 *  - even indices are directive indices
 *  - odd indices are hook functions
 *
 * Special cases:
 *  - a negative directive index flags an init hook (ngOnInit, ngAfterContentInit, ngAfterViewInit)
 */
type HookData = HookEntry[];
/**
 * Array of destroy hooks that should be executed for a view and their directive indices.
 *
 * The array is set up as a series of number/function or number/(number|function)[]:
 * - Even indices represent the context with which hooks should be called.
 * - Odd indices are the hook functions themselves. If a value at an odd index is an array,
 *   it represents the destroy hooks of a `multi` provider where:
 *     - Even indices represent the index of the provider for which we've registered a destroy hook,
 *       inside of the `multi` provider array.
 *     - Odd indices are the destroy hook functions.
 * For example:
 * LView: `[0, 1, 2, AService, 4, [BService, CService, DService]]`
 * destroyHooks: `[3, AService.ngOnDestroy, 5, [0, BService.ngOnDestroy, 2, DService.ngOnDestroy]]`
 *
 * In the example above `AService` is a type provider with an `ngOnDestroy`, whereas `BService`,
 * `CService` and `DService` are part of a `multi` provider where only `BService` and `DService`
 * have an `ngOnDestroy` hook.
 */
type DestroyHookData = (HookEntry | HookData)[];
/**
 * Static data that corresponds to the instance-specific data array on an LView.
 *
 * Each node's static data is stored in tData at the same index that it's stored
 * in the data array.  Any nodes that do not have static data store a null value in
 * tData to avoid a sparse array.
 *
 * Each pipe's definition is stored here at the same index as its pipe instance in
 * the data array.
 *
 * Each host property's name is stored here at the same index as its value in the
 * data array.
 *
 * Each property binding name is stored here at the same index as its value in
 * the data array. If the binding is an interpolation, the static string values
 * are stored parallel to the dynamic values. Example:
 *
 * id="prefix {{ v0 }} a {{ v1 }} b {{ v2 }} suffix"
 *
 * LView       |   TView.data
 *------------------------
 *  v0 value   |   'a'
 *  v1 value   |   'b'
 *  v2 value   |   id � prefix � suffix
 *
 * Injector bloom filters are also stored here.
 */
type TData = (TNode | PipeDef<any> | DirectiveDef<any> | ComponentDef<any> | number | TStylingRange | TStylingKey | ProviderToken<any> | TI18n | I18nUpdateOpCodes | TIcu | null | string | TDeferBlockDetails)[];

/**
 * `DestroyRef` lets you set callbacks to run for any cleanup or destruction behavior.
 * The scope of this destruction depends on where `DestroyRef` is injected. If `DestroyRef`
 * is injected in a component or directive, the callbacks run when that component or
 * directive is destroyed. Otherwise the callbacks run when a corresponding injector is destroyed.
 *
 * @publicApi
 */
declare abstract class DestroyRef {
    /**
     * Registers a destroy callback in a given lifecycle scope.  Returns a cleanup function that can
     * be invoked to unregister the callback.
     *
     * @usageNotes
     * ### Example
     * ```ts
     * const destroyRef = inject(DestroyRef);
     *
     * // register a destroy callback
     * const unregisterFn = destroyRef.onDestroy(() => doSomethingOnDestroy());
     *
     * // stop the destroy callback from executing if needed
     * unregisterFn();
     * ```
     */
    abstract onDestroy(callback: () => void): () => void;
}

/**
 * An `OutputEmitterRef` is created by the `output()` function and can be
 * used to emit values to consumers of your directive or component.
 *
 * Consumers of your directive/component can bind to the output and
 * subscribe to changes via the bound event syntax. For example:
 *
 * ```html
 * <my-comp (valueChange)="processNewValue($event)" />
 * ```
 *
 * @publicAPI
 */
declare class OutputEmitterRef<T> implements OutputRef<T> {
    private destroyed;
    private listeners;
    private errorHandler;
    constructor();
    subscribe(callback: (value: T) => void): OutputRefSubscription;
    /** Emits a new value to the output. */
    emit(value: T): void;
}
/** Gets the owning `DestroyRef` for the given output. */
declare function getOutputDestroyRef(ref: OutputRef<unknown>): DestroyRef | undefined;

/**
 * Options for declaring an output.
 *
 * @publicAPI
 */
interface OutputOptions {
    alias?: string;
}
/**
 * The `output` function allows declaration of Angular outputs in
 * directives and components.
 *
 * You can use outputs to emit values to parent directives and component.
 * Parents can subscribe to changes via:
 *
 * - template event bindings. For example, `(myOutput)="doSomething($event)"`
 * - programmatic subscription by using `OutputRef#subscribe`.
 *
 * @usageNotes
 *
 * To use `output()`, import the function from `@angular/core`.
 *
 * ```ts
 * import {output} from '@angular/core';
 * ```
 *
 * Inside your component, introduce a new class member and initialize
 * it with a call to `output`.
 *
 * ```ts
 * @Directive({
 *   ...
 * })
 * export class MyDir {
 *   nameChange = output<string>();    // OutputEmitterRef<string>
 *   onClick    = output();            // OutputEmitterRef<void>
 * }
 * ```
 *
 * You can emit values to consumers of your directive, by using
 * the `emit` method from `OutputEmitterRef`.
 *
 * ```ts
 * updateName(newName: string): void {
 *   this.nameChange.emit(newName);
 * }
 * ```
 * @initializerApiFunction {"showTypesInSignaturePreview": true}
 * @publicAPI
 */
declare function output<T = void>(opts?: OutputOptions): OutputEmitterRef<T>;

/**
 * Type of the `viewChild` function. The viewChild function creates a singular view query.
 *
 * It is a special function that also provides access to required query results via the `.required`
 * property.
 *
 * @publicAPI
 * @docsPrivate Ignored because `viewChild` is the canonical API entry.
 */
interface ViewChildFunction {
    /**
     * Initializes a view child query. Consider using `viewChild.required` for queries that should
     * always match.
     *
     * @publicAPI
     */
    <LocatorT, ReadT>(locator: ProviderToken<LocatorT> | string, opts: {
        read: ProviderToken<ReadT>;
        debugName?: string;
    }): Signal<ReadT | undefined>;
    <LocatorT>(locator: ProviderToken<LocatorT> | string, opts?: {
        debugName?: string;
    }): Signal<LocatorT | undefined>;
    /**
     * Initializes a view child query that is expected to always match an element.
     *
     * @publicAPI
     */
    required: {
        <LocatorT>(locator: ProviderToken<LocatorT> | string, opts?: {
            debugName?: string;
        }): Signal<LocatorT>;
        <LocatorT, ReadT>(locator: ProviderToken<LocatorT> | string, opts: {
            read: ProviderToken<ReadT>;
            debugName?: string;
        }): Signal<ReadT>;
    };
}
/**
 * Initializes a view child query.
 *
 * Consider using `viewChild.required` for queries that should always match.
 *
 * @usageNotes
 * Create a child query in your component by declaring a
 * class field and initializing it with the `viewChild()` function.
 *
 * ```angular-ts
 * @Component({template: '<div #el></div><my-component #cmp />'})
 * export class TestComponent {
 *   divEl = viewChild<ElementRef>('el');                   // Signal<ElementRef|undefined>
 *   divElRequired = viewChild.required<ElementRef>('el');  // Signal<ElementRef>
 *   cmp = viewChild(MyComponent);                          // Signal<MyComponent|undefined>
 *   cmpRequired = viewChild.required(MyComponent);         // Signal<MyComponent>
 * }
 * ```
 *
 * @publicAPI
 * @initializerApiFunction
 */
declare const viewChild: ViewChildFunction;
declare function viewChildren<LocatorT>(locator: ProviderToken<LocatorT> | string, opts?: {
    debugName?: string;
}): Signal<ReadonlyArray<LocatorT>>;
declare function viewChildren<LocatorT, ReadT>(locator: ProviderToken<LocatorT> | string, opts: {
    read: ProviderToken<ReadT>;
    debugName?: string;
}): Signal<ReadonlyArray<ReadT>>;
/**
 * Type of the `contentChild` function.
 *
 * The contentChild function creates a singular content query. It is a special function that also
 * provides access to required query results via the `.required` property.
 *
 * @publicAPI
 * @docsPrivate Ignored because `contentChild` is the canonical API entry.
 */
interface ContentChildFunction {
    /**
     * Initializes a content child query.
     *
     * Consider using `contentChild.required` for queries that should always match.
     * @publicAPI
     */
    <LocatorT>(locator: ProviderToken<LocatorT> | string, opts?: {
        descendants?: boolean;
        read?: undefined;
        debugName?: string;
    }): Signal<LocatorT | undefined>;
    <LocatorT, ReadT>(locator: ProviderToken<LocatorT> | string, opts: {
        descendants?: boolean;
        read: ProviderToken<ReadT>;
        debugName?: string;
    }): Signal<ReadT | undefined>;
    /**
     * Initializes a content child query that is always expected to match.
     */
    required: {
        <LocatorT>(locator: ProviderToken<LocatorT> | string, opts?: {
            descendants?: boolean;
            read?: undefined;
            debugName?: string;
        }): Signal<LocatorT>;
        <LocatorT, ReadT>(locator: ProviderToken<LocatorT> | string, opts: {
            descendants?: boolean;
            read: ProviderToken<ReadT>;
            debugName?: string;
        }): Signal<ReadT>;
    };
}
/**
 * Initializes a content child query. Consider using `contentChild.required` for queries that should
 * always match.
 *
 * @usageNotes
 * Create a child query in your component by declaring a
 * class field and initializing it with the `contentChild()` function.
 *
 * ```ts
 * @Component({...})
 * export class TestComponent {
 *   headerEl = contentChild<ElementRef>('h');                    // Signal<ElementRef|undefined>
 *   headerElElRequired = contentChild.required<ElementRef>('h'); // Signal<ElementRef>
 *   header = contentChild(MyHeader);                             // Signal<MyHeader|undefined>
 *   headerRequired = contentChild.required(MyHeader);            // Signal<MyHeader>
 * }
 * ```
 *
 * @initializerApiFunction
 * @publicAPI
 */
declare const contentChild: ContentChildFunction;
declare function contentChildren<LocatorT>(locator: ProviderToken<LocatorT> | string, opts?: {
    descendants?: boolean;
    read?: undefined;
    debugName?: string;
}): Signal<ReadonlyArray<LocatorT>>;
declare function contentChildren<LocatorT, ReadT>(locator: ProviderToken<LocatorT> | string, opts: {
    descendants?: boolean;
    read: ProviderToken<ReadT>;
    debugName?: string;
}): Signal<ReadonlyArray<ReadT>>;

/**
 * Type of the Attribute decorator / constructor function.
 *
 * @publicApi
 */
interface AttributeDecorator {
    /**
     * Parameter decorator for a directive constructor that designates
     * a host-element attribute whose value is injected as a constant string literal.
     *
     * @usageNotes
     *
     * Suppose we have an `<input>` element and want to know its `type`.
     *
     * ```html
     * <input type="text">
     * ```
     *
     * The following example uses the decorator to inject the string literal `text` in a directive.
     *
     * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}
     *
     * The following example uses the decorator in a component constructor.
     *
     * {@example core/ts/metadata/metadata.ts region='attributeFactory'}
     *
     */
    (name: string): any;
    new (name: string): Attribute;
}
/**
 * Type of the Attribute metadata.
 *
 * @publicApi
 */
interface Attribute {
    /**
     * The name of the attribute whose value can be injected.
     */
    attributeName: string;
}
/**
 * Attribute decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const Attribute: AttributeDecorator;

/**
 * Represents a basic change from a previous to a new value for a single
 * property on a directive instance. Passed as a value in a
 * {@link SimpleChanges} object to the `ngOnChanges` hook.
 *
 * @see {@link OnChanges}
 *
 * @publicApi
 */
declare class SimpleChange {
    previousValue: any;
    currentValue: any;
    firstChange: boolean;
    constructor(previousValue: any, currentValue: any, firstChange: boolean);
    /**
     * Check whether the new value is the first value assigned.
     */
    isFirstChange(): boolean;
}
/**
 * A hashtable of changes represented by {@link SimpleChange} objects stored
 * at the declared property name they belong to on a Directive or Component. This is
 * the type passed to the `ngOnChanges` hook.
 *
 * @see {@link OnChanges}
 *
 * @publicApi
 */
interface SimpleChanges {
    [propName: string]: SimpleChange;
}

/**
 * @description
 * A lifecycle hook that is called when any data-bound property of a directive changes.
 * Define an `ngOnChanges()` method to handle the changes.
 *
 * @see {@link DoCheck}
 * @see {@link OnInit}
 * @see [Lifecycle hooks guide](guide/components/lifecycle)
 *
 * @usageNotes
 * The following snippet shows how a component can implement this interface to
 * define an on-changes handler for an input property.
 *
 * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnChanges'}
 *
 * @publicApi
 */
interface OnChanges {
    /**
     * A callback method that is invoked immediately after the
     * default change detector has checked data-bound properties
     * if at least one has changed, and before the view and content
     * children are checked.
     * @param changes The changed properties.
     */
    ngOnChanges(changes: SimpleChanges): void;
}
/**
 * @description
 * A lifecycle hook that is called after Angular has initialized
 * all data-bound properties of a directive.
 * Define an `ngOnInit()` method to handle any additional initialization tasks.
 *
 * @see {@link AfterContentInit}
 * @see [Lifecycle hooks guide](guide/components/lifecycle)
 *
 * @usageNotes
 * The following snippet shows how a component can implement this interface to
 * define its own initialization method.
 *
 * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnInit'}
 *
 * @publicApi
 */
interface OnInit {
    /**
     * A callback method that is invoked immediately after the
     * default change detector has checked the directive's
     * data-bound properties for the first time,
     * and before any of the view or content children have been checked.
     * It is invoked only once when the directive is instantiated.
     */
    ngOnInit(): void;
}
/**
 * A lifecycle hook that invokes a custom change-detection function for a directive,
 * in addition to the check performed by the default change-detector.
 *
 * The default change-detection algorithm looks for differences by comparing
 * bound-property values by reference across change detection runs. You can use this
 * hook to check for and respond to changes by some other means.
 *
 * When the default change detector detects changes, it invokes `ngOnChanges()` if supplied,
 * regardless of whether you perform additional change detection.
 * Typically, you should not use both `DoCheck` and `OnChanges` to respond to
 * changes on the same input.
 *
 * @see {@link OnChanges}
 * @see [Lifecycle hooks guide](guide/components/lifecycle)
 *
 * @usageNotes
 * The following snippet shows how a component can implement this interface
 * to invoke it own change-detection cycle.
 *
 * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='DoCheck'}
 *
 * For a more complete example and discussion, see
 * [Defining custom change detection](guide/components/lifecycle#defining-custom-change-detection).
 *
 * @publicApi
 */
interface DoCheck {
    /**
     * A callback method that performs change-detection, invoked
     * after the default change-detector runs.
     * See `KeyValueDiffers` and `IterableDiffers` for implementing
     * custom change checking for collections.
     *
     */
    ngDoCheck(): void;
}
/**
 * A lifecycle hook that is called when a directive, pipe, or service is destroyed.
 * Use for any custom cleanup that needs to occur when the
 * instance is destroyed.
 * @see [Lifecycle hooks guide](guide/components/lifecycle)
 *
 * @usageNotes
 * The following snippet shows how a component can implement this interface
 * to define its own custom clean-up method.
 *
 * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnDestroy'}
 *
 * @publicApi
 */
interface OnDestroy {
    /**
     * A callback method that performs custom clean-up, invoked immediately
     * before a directive, pipe, or service instance is destroyed.
     */
    ngOnDestroy(): void;
}
/**
 * @description
 * A lifecycle hook that is called after Angular has fully initialized
 * all content of a directive. It will run only once when the projected content is initialized.
 * Define an `ngAfterContentInit()` method to handle any additional initialization tasks.
 *
 * @see {@link OnInit}
 * @see {@link AfterViewInit}
 * @see [Lifecycle hooks guide](guide/components/lifecycle)
 *
 * @usageNotes
 * The following snippet shows how a component can implement this interface to
 * define its own content initialization method.
 *
 * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterContentInit'}
 *
 * @publicApi
 */
interface AfterContentInit {
    /**
     * A callback method that is invoked immediately after
     * Angular has completed initialization of all of the directive's
     * content.
     * It is invoked only once when the directive is instantiated.
     */
    ngAfterContentInit(): void;
}
/**
 * @description
 * A lifecycle hook that is called after the default change detector has
 * completed checking all content of a directive. It will run after the content
 * has been checked and most of the time it's during a change detection cycle.
 *
 * @see {@link AfterViewChecked}
 * @see [Lifecycle hooks guide](guide/components/lifecycle)
 *
 * @usageNotes
 * The following snippet shows how a component can implement this interface to
 * define its own after-check functionality.
 *
 * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterContentChecked'}
 *
 * @publicApi
 */
interface AfterContentChecked {
    /**
     * A callback method that is invoked immediately after the
     * default change detector has completed checking all of the directive's
     * content.
     */
    ngAfterContentChecked(): void;
}
/**
 * @description
 * A lifecycle hook that is called after Angular has fully initialized
 * a component's view.
 * Define an `ngAfterViewInit()` method to handle any additional initialization tasks.
 *
 * @see {@link OnInit}
 * @see {@link AfterContentInit}
 * @see [Lifecycle hooks guide](guide/components/lifecycle)
 *
 * @usageNotes
 * The following snippet shows how a component can implement this interface to
 * define its own view initialization method.
 *
 * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterViewInit'}
 *
 * @publicApi
 */
interface AfterViewInit {
    /**
     * A callback method that is invoked immediately after
     * Angular has completed initialization of a component's view.
     * It is invoked only once when the view is instantiated.
     *
     */
    ngAfterViewInit(): void;
}
/**
 * @description
 * A lifecycle hook that is called after the default change detector has
 * completed checking a component's view for changes.
 *
 * @see {@link AfterContentChecked}
 * @see [Lifecycle hooks guide](guide/components/lifecycle)
 *
 * @usageNotes
 * The following snippet shows how a component can implement this interface to
 * define its own after-check functionality.
 *
 * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterViewChecked'}
 *
 * @publicApi
 */
interface AfterViewChecked {
    /**
     * A callback method that is invoked immediately after the
     * default change detector has completed one change-check cycle
     * for a component's view.
     */
    ngAfterViewChecked(): void;
}

/**
 * Type of the Query metadata.
 *
 * @publicApi
 */
interface Query {
    descendants: boolean;
    emitDistinctChangesOnly: boolean;
    first: boolean;
    read: any;
    isViewQuery: boolean;
    selector: any;
    static?: boolean;
}
/**
 * Base class for query metadata.
 *
 * @see {@link ContentChildren}
 * @see {@link ContentChild}
 * @see {@link ViewChildren}
 * @see {@link ViewChild}
 *
 * @publicApi
 */
declare abstract class Query {
}
/**
 * Type of the ContentChildren decorator / constructor function.
 *
 * @see {@link ContentChildren}
 * @publicApi
 */
interface ContentChildrenDecorator {
    /**
     * @description
     * Property decorator that configures a content query.
     *
     * Use to get the `QueryList` of elements or directives from the content DOM.
     * Any time a child element is added, removed, or moved, the query list will be
     * updated, and the changes observable of the query list will emit a new value.
     *
     * Content queries are set before the `ngAfterContentInit` callback is called.
     *
     * Does not retrieve elements or directives that are in other components' templates,
     * since a component's template is always a black box to its ancestors.
     *
     * **Metadata Properties**:
     *
     * * **selector** - The directive type or the name used for querying.
     * * **descendants** - If `true` include all descendants of the element. If `false` then only
     * query direct children of the element.
     * * **emitDistinctChangesOnly** - The ` QueryList#changes` observable will emit new values only
     *   if the QueryList result has changed. When `false` the `changes` observable might emit even
     *   if the QueryList has not changed.
     *   ** Note: *** This config option is **deprecated**, it will be permanently set to `true` and
     *   removed in future versions of Angular.
     * * **read** - Used to read a different token from the queried elements.
     *
     * The following selectors are supported.
     *   * Any class with the `@Component` or `@Directive` decorator
     *   * A template reference variable as a string (e.g. query `<my-component #cmp></my-component>`
     * with `@ContentChildren('cmp')`)
     *   * Any provider defined in the child component tree of the current component (e.g.
     * `@ContentChildren(SomeService) someService: SomeService`)
     *   * Any provider defined through a string token (e.g. `@ContentChildren('someToken')
     * someTokenVal: any`)
     *   * A `TemplateRef` (e.g. query `<ng-template></ng-template>` with
     * `@ContentChildren(TemplateRef) template;`)
     *
     * In addition, multiple string selectors can be separated with a comma (e.g.
     * `@ContentChildren('cmp1,cmp2')`)
     *
     * The following values are supported by `read`:
     *   * Any class with the `@Component` or `@Directive` decorator
     *   * Any provider defined on the injector of the component that is matched by the `selector` of
     * this query
     *   * Any provider defined through a string token (e.g. `{provide: 'token', useValue: 'val'}`)
     *   * `TemplateRef`, `ElementRef`, and `ViewContainerRef`
     *
     * @usageNotes
     *
     * Here is a simple demonstration of how the `ContentChildren` decorator can be used.
     *
     * {@example core/di/ts/contentChildren/content_children_howto.ts region='HowTo'}
     *
     * ### Tab-pane example
     *
     * Here is a slightly more realistic example that shows how `ContentChildren` decorators
     * can be used to implement a tab pane component.
     *
     * {@example core/di/ts/contentChildren/content_children_example.ts region='Component'}
     *
     * @Annotation
     */
    (selector: ProviderToken<unknown> | Function | string, opts?: {
        descendants?: boolean;
        emitDistinctChangesOnly?: boolean;
        read?: any;
    }): any;
    new (selector: ProviderToken<unknown> | Function | string, opts?: {
        descendants?: boolean;
        emitDistinctChangesOnly?: boolean;
        read?: any;
    }): Query;
}
/**
 * Type of the ContentChildren metadata.
 *
 *
 * @Annotation
 * @publicApi
 */
type ContentChildren = Query;
/**
 * ContentChildren decorator and metadata.
 *
 *
 * @Annotation
 * @publicApi
 */
declare const ContentChildren: ContentChildrenDecorator;
/**
 * Type of the ContentChild decorator / constructor function.
 *
 * @publicApi
 */
interface ContentChildDecorator {
    /**
     * @description
     * Property decorator that configures a content query.
     *
     * Use to get the first element or the directive matching the selector from the content DOM.
     * If the content DOM changes, and a new child matches the selector,
     * the property will be updated.
     *
     * Does not retrieve elements or directives that are in other components' templates,
     * since a component's template is always a black box to its ancestors.
     *
     * **Metadata Properties**:
     *
     * * **selector** - The directive type or the name used for querying.
     * * **descendants** - If `true` (default) include all descendants of the element. If `false` then
     * only query direct children of the element.
     * * **read** - Used to read a different token from the queried element.
     * * **static** - True to resolve query results before change detection runs,
     * false to resolve after change detection. Defaults to false.
     *
     * The following selectors are supported.
     *   * Any class with the `@Component` or `@Directive` decorator
     *   * A template reference variable as a string (e.g. query `<my-component #cmp></my-component>`
     * with `@ContentChild('cmp')`)
     *   * Any provider defined in the child component tree of the current component (e.g.
     * `@ContentChild(SomeService) someService: SomeService`)
     *   * Any provider defined through a string token (e.g. `@ContentChild('someToken') someTokenVal:
     * any`)
     *   * A `TemplateRef` (e.g. query `<ng-template></ng-template>` with `@ContentChild(TemplateRef)
     * template;`)
     *
     * The following values are supported by `read`:
     *   * Any class with the `@Component` or `@Directive` decorator
     *   * Any provider defined on the injector of the component that is matched by the `selector` of
     * this query
     *   * Any provider defined through a string token (e.g. `{provide: 'token', useValue: 'val'}`)
     *   * `TemplateRef`, `ElementRef`, and `ViewContainerRef`
     *
     * Difference between dynamic and static queries:
     *
     * | Queries                             | Details |
     * |:---                                 |:---     |
     * | Dynamic queries \(`static: false`\) | The query resolves before the `ngAfterContentInit()`
     * callback is called. The result will be updated for changes to your view, such as changes to
     * `ngIf` and `ngFor` blocks. | | Static queries \(`static: true`\)   | The query resolves once
     * the view has been created, but before change detection runs (before the `ngOnInit()` callback
     * is called). The result, though, will never be updated to reflect changes to your view, such as
     * changes to `ngIf` and `ngFor` blocks.  |
     *
     * @usageNotes
     *
     * {@example core/di/ts/contentChild/content_child_howto.ts region='HowTo'}
     *
     * ### Example
     *
     * {@example core/di/ts/contentChild/content_child_example.ts region='Component'}
     *
     * @Annotation
     */
    (selector: ProviderToken<unknown> | Function | string, opts?: {
        descendants?: boolean;
        read?: any;
        static?: boolean;
    }): any;
    new (selector: ProviderToken<unknown> | Function | string, opts?: {
        descendants?: boolean;
        read?: any;
        static?: boolean;
    }): ContentChild;
}
/**
 * Type of the ContentChild metadata.
 *
 * @publicApi
 */
type ContentChild = Query;
/**
 * ContentChild decorator and metadata.
 *
 *
 * @Annotation
 *
 * @publicApi
 */
declare const ContentChild: ContentChildDecorator;
/**
 * Type of the ViewChildren decorator / constructor function.
 *
 * @see {@link ViewChildren}
 *
 * @publicApi
 */
interface ViewChildrenDecorator {
    /**
     * @description
     * Property decorator that configures a view query.
     *
     * Use to get the `QueryList` of elements or directives from the view DOM.
     * Any time a child element is added, removed, or moved, the query list will be updated,
     * and the changes observable of the query list will emit a new value.
     *
     * View queries are set before the `ngAfterViewInit` callback is called.
     *
     * **Metadata Properties**:
     *
     * * **selector** - The directive type or the name used for querying.
     * * **read** - Used to read a different token from the queried elements.
     * * **emitDistinctChangesOnly** - The ` QueryList#changes` observable will emit new values only
     *   if the QueryList result has changed. When `false` the `changes` observable might emit even
     *   if the QueryList has not changed.
     *   ** Note: *** This config option is **deprecated**, it will be permanently set to `true` and
     * removed in future versions of Angular.
     *
     * The following selectors are supported.
     *   * Any class with the `@Component` or `@Directive` decorator
     *   * A template reference variable as a string (e.g. query `<my-component #cmp></my-component>`
     * with `@ViewChildren('cmp')`)
     *   * Any provider defined in the child component tree of the current component (e.g.
     * `@ViewChildren(SomeService) someService!: SomeService`)
     *   * Any provider defined through a string token (e.g. `@ViewChildren('someToken')
     * someTokenVal!: any`)
     *   * A `TemplateRef` (e.g. query `<ng-template></ng-template>` with `@ViewChildren(TemplateRef)
     * template;`)
     *
     * In addition, multiple string selectors can be separated with a comma (e.g.
     * `@ViewChildren('cmp1,cmp2')`)
     *
     * The following values are supported by `read`:
     *   * Any class with the `@Component` or `@Directive` decorator
     *   * Any provider defined on the injector of the component that is matched by the `selector` of
     * this query
     *   * Any provider defined through a string token (e.g. `{provide: 'token', useValue: 'val'}`)
     *   * `TemplateRef`, `ElementRef`, and `ViewContainerRef`
     *
     * @usageNotes
     *
     * {@example core/di/ts/viewChildren/view_children_howto.ts region='HowTo'}
     *
     * ### Another example
     *
     * {@example core/di/ts/viewChildren/view_children_example.ts region='Component'}
     *
     * @Annotation
     */
    (selector: ProviderToken<unknown> | Function | string, opts?: {
        read?: any;
        emitDistinctChangesOnly?: boolean;
    }): any;
    new (selector: ProviderToken<unknown> | Function | string, opts?: {
        read?: any;
        emitDistinctChangesOnly?: boolean;
    }): ViewChildren;
}
/**
 * Type of the ViewChildren metadata.
 *
 * @publicApi
 */
type ViewChildren = Query;
/**
 * ViewChildren decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const ViewChildren: ViewChildrenDecorator;
/**
 * Type of the ViewChild decorator / constructor function.
 *
 * @see {@link ViewChild}
 * @publicApi
 */
interface ViewChildDecorator {
    /**
     * @description
     * Property decorator that configures a view query.
     * The change detector looks for the first element or the directive matching the selector
     * in the view DOM. If the view DOM changes, and a new child matches the selector,
     * the property is updated.
     *
     * **Metadata Properties**:
     *
     * * **selector** - The directive type or the name used for querying.
     * * **read** - Used to read a different token from the queried elements.
     * * **static** - `true` to resolve query results before change detection runs,
     * `false` to resolve after change detection. Defaults to `false`.
     *
     *
     * The following selectors are supported.
     *   * Any class with the `@Component` or `@Directive` decorator
     *   * A template reference variable as a string (e.g. query `<my-component #cmp></my-component>`
     * with `@ViewChild('cmp')`)
     *   * Any provider defined in the child component tree of the current component (e.g.
     * `@ViewChild(SomeService) someService: SomeService`)
     *   * Any provider defined through a string token (e.g. `@ViewChild('someToken') someTokenVal:
     * any`)
     *   * A `TemplateRef` (e.g. query `<ng-template></ng-template>` with `@ViewChild(TemplateRef)
     * template;`)
     *
     * The following values are supported by `read`:
     *   * Any class with the `@Component` or `@Directive` decorator
     *   * Any provider defined on the injector of the component that is matched by the `selector` of
     * this query
     *   * Any provider defined through a string token (e.g. `{provide: 'token', useValue: 'val'}`)
     *   * `TemplateRef`, `ElementRef`, and `ViewContainerRef`
     *
     * Difference between dynamic and static queries:
     *   * Dynamic queries \(`static: false`\) - The query resolves before the `ngAfterViewInit()`
     * callback is called. The result will be updated for changes to your view, such as changes to
     * `ngIf` and `ngFor` blocks.
     *   * Static queries \(`static: true`\) - The query resolves once
     * the view has been created, but before change detection runs (before the `ngOnInit()` callback
     * is called). The result, though, will never be updated to reflect changes to your view, such as
     * changes to `ngIf` and `ngFor` blocks.
     *
     * @usageNotes
     *
     * ### Example 1
     *
     * {@example core/di/ts/viewChild/view_child_example.ts region='Component'}
     *
     * ### Example 2
     *
     * {@example core/di/ts/viewChild/view_child_howto.ts region='HowTo'}
     *
     * @Annotation
     */
    (selector: ProviderToken<unknown> | Function | string, opts?: {
        read?: any;
        static?: boolean;
    }): any;
    new (selector: ProviderToken<unknown> | Function | string, opts?: {
        read?: any;
        static?: boolean;
    }): ViewChild;
}
/**
 * Type of the ViewChild metadata.
 *
 * @publicApi
 */
type ViewChild = Query;
/**
 * ViewChild decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const ViewChild: ViewChildDecorator;

/**
 * The strategy that the default change detector uses to detect changes.
 * When set, takes effect the next time change detection is triggered.
 *
 * @see {@link /api/core/ChangeDetectorRef?tab=usage-notes Change detection usage}
 * @see {@link /best-practices/skipping-subtrees Skipping component subtrees}
 *
 * @publicApi
 */
declare enum ChangeDetectionStrategy$1 {
    /**
     * Use the `CheckOnce` strategy, meaning that automatic change detection is deactivated
     * until reactivated by setting the strategy to `Default` (`CheckAlways`).
     * Change detection can still be explicitly invoked.
     * This strategy applies to all child directives and cannot be overridden.
     */
    OnPush = 0,
    /**
     * Use the default `CheckAlways` strategy, in which change detection is automatic until
     * explicitly deactivated.
     */
    Default = 1
}

/**
 * An interface implemented by all Angular type decorators, which allows them to be used as
 * decorators as well as Angular syntax.
 *
 * ```ts
 * @ng.Component({...})
 * class MyClass {...}
 * ```
 *
 * @publicApi
 */
interface TypeDecorator {
    /**
     * Invoke as decorator.
     */
    <T extends Type$1<any>>(type: T): T;
    (target: Object, propertyKey?: string | symbol, parameterIndex?: number): void;
    (target: unknown, context: unknown): void;
}

/**
 * Type of the Directive decorator / constructor function.
 * @publicApi
 */
interface DirectiveDecorator {
    /**
     * Decorator that marks a class as an Angular directive.
     * You can define your own directives to attach custom behavior to elements in the DOM.
     *
     * The options provide configuration metadata that determines
     * how the directive should be processed, instantiated and used at
     * runtime.
     *
     * Directive classes, like component classes, can implement
     * [life-cycle hooks](guide/components/lifecycle) to influence their configuration and behavior.
     *
     *
     * @usageNotes
     * To define a directive, mark the class with the decorator and provide metadata.
     *
     * ```ts
     * import {Directive} from '@angular/core';
     *
     * @Directive({
     *   selector: 'my-directive',
     * })
     * export class MyDirective {
     * ...
     * }
     * ```
     *
     * ### Declaring directives
     *
     * In order to make a directive available to other components in your application, you should do
     * one of the following:
     *  - either mark the directive as [standalone](guide/components/importing),
     *  - or declare it in an NgModule by adding it to the `declarations` and `exports` fields.
     *
     * ** Marking a directive as standalone **
     *
     * You can add the `standalone: true` flag to the Directive decorator metadata to declare it as
     * [standalone](guide/components/importing):
     *
     * ```ts
     * @Directive({
     *   standalone: true,
     *   selector: 'my-directive',
     * })
     * class MyDirective {}
     * ```
     *
     * When marking a directive as standalone, please make sure that the directive is not already
     * declared in an NgModule.
     *
     *
     * ** Declaring a directive in an NgModule **
     *
     * Another approach is to declare a directive in an NgModule:
     *
     * ```ts
     * @Directive({
     *   selector: 'my-directive',
     * })
     * class MyDirective {}
     *
     * @NgModule({
     *   declarations: [MyDirective, SomeComponent],
     *   exports: [MyDirective], // making it available outside of this module
     * })
     * class SomeNgModule {}
     * ```
     *
     * When declaring a directive in an NgModule, please make sure that:
     *  - the directive is declared in exactly one NgModule.
     *  - the directive is not standalone.
     *  - you do not re-declare a directive imported from another module.
     *  - the directive is included into the `exports` field as well if you want this directive to be
     *    accessible for components outside of the NgModule.
     *
     *
     * @Annotation
     */
    (obj?: Directive): TypeDecorator;
    /**
     * See the `Directive` decorator.
     */
    new (obj?: Directive): Directive;
}
/**
 * Directive decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
interface Directive {
    /**
     * The CSS selector that identifies this directive in a template
     * and triggers instantiation of the directive.
     *
     * Declare as one of the following:
     *
     * - `element-name`: Select by element name.
     * - `.class`: Select by class name.
     * - `[attribute]`: Select by attribute name.
     * - `[attribute=value]`: Select by attribute name and value.
     * - `:not(sub_selector)`: Select only if the element does not match the `sub_selector`.
     * - `selector1, selector2`: Select if either `selector1` or `selector2` matches.
     *
     * Angular only allows directives to apply on CSS selectors that do not cross
     * element boundaries.
     *
     * For the following template HTML, a directive with an `input[type=text]` selector,
     * would be instantiated only on the `<input type="text">` element.
     *
     * ```html
     * <form>
     *   <input type="text">
     *   <input type="radio">
     * <form>
     * ```
     *
     */
    selector?: string;
    /**
     * Enumerates the set of data-bound input properties for a directive
     *
     * Angular automatically updates input properties during change detection.
     * The `inputs` property accepts either strings or object literals that configure the directive
     * properties that should be exposed as inputs.
     *
     * When an object literal is passed in, the `name` property indicates which property on the
     * class the input should write to, while the `alias` determines the name under
     * which the input will be available in template bindings. The `required` property indicates that
     * the input is required which will trigger a compile-time error if it isn't passed in when the
     * directive is used.
     *
     * When a string is passed into the `inputs` array, it can have a format of `'name'` or
     * `'name: alias'` where `name` is the property on the class that the directive should write
     * to, while the `alias` determines the name under which the input will be available in
     * template bindings. String-based input definitions are assumed to be optional.
     *
     * @usageNotes
     *
     * The following example creates a component with two data-bound properties.
     *
     * ```ts
     * @Component({
     *   selector: 'bank-account',
     *   inputs: ['bankName', {name: 'id', alias: 'account-id'}],
     *   template: `
     *     Bank Name: {{bankName}}
     *     Account Id: {{id}}
     *   `
     * })
     * class BankAccount {
     *   bankName: string;
     *   id: string;
     * }
     * ```
     *
     */
    inputs?: ({
        name: string;
        alias?: string;
        required?: boolean;
        transform?: (value: any) => any;
    } | string)[];
    /**
     * Enumerates the set of event-bound output properties.
     *
     * When an output property emits an event, an event handler attached to that event
     * in the template is invoked.
     *
     * The `outputs` property defines a set of `directiveProperty` to `alias`
     * configuration:
     *
     * - `directiveProperty` specifies the component property that emits events.
     * - `alias` specifies the DOM property the event handler is attached to.
     *
     * @usageNotes
     *
     * ```ts
     * @Component({
     *   selector: 'child-dir',
     *   outputs: [ 'bankNameChange' ],
     *   template: `<input (input)="bankNameChange.emit($event.target.value)" />`
     * })
     * class ChildDir {
     *  bankNameChange: EventEmitter<string> = new EventEmitter<string>();
     * }
     *
     * @Component({
     *   selector: 'main',
     *   template: `
     *     {{ bankName }} <child-dir (bankNameChange)="onBankNameChange($event)"></child-dir>
     *   `
     * })
     * class MainComponent {
     *  bankName: string;
     *
     *   onBankNameChange(bankName: string) {
     *     this.bankName = bankName;
     *   }
     * }
     * ```
     *
     */
    outputs?: string[];
    /**
     * Configures the injector of this
     * directive or component with a token
     * that maps to a provider of a dependency.
     */
    providers?: Provider[];
    /**
     * Defines the name that can be used in the template to assign this directive to a variable.
     *
     * @usageNotes
     *
     * ```ts
     * @Directive({
     *   selector: 'child-dir',
     *   exportAs: 'child'
     * })
     * class ChildDir {
     * }
     *
     * @Component({
     *   selector: 'main',
     *   template: `<child-dir #c="child"></child-dir>`
     * })
     * class MainComponent {
     * }
     * ```
     *
     */
    exportAs?: string;
    /**
     * Configures the queries that will be injected into the directive.
     *
     * Content queries are set before the `ngAfterContentInit` callback is called.
     * View queries are set before the `ngAfterViewInit` callback is called.
     *
     * @usageNotes
     *
     * The following example shows how queries are defined
     * and when their results are available in lifecycle hooks:
     *
     * ```ts
     * @Component({
     *   selector: 'someDir',
     *   queries: {
     *     contentChildren: new ContentChildren(ChildDirective),
     *     viewChildren: new ViewChildren(ChildDirective)
     *   },
     *   template: '<child-directive></child-directive>'
     * })
     * class SomeDir {
     *   contentChildren: QueryList<ChildDirective>,
     *   viewChildren: QueryList<ChildDirective>
     *
     *   ngAfterContentInit() {
     *     // contentChildren is set
     *   }
     *
     *   ngAfterViewInit() {
     *     // viewChildren is set
     *   }
     * }
     * ```
     *
     * @Annotation
     */
    queries?: {
        [key: string]: any;
    };
    /**
     * Maps class properties to host element bindings for properties,
     * attributes, and events, using a set of key-value pairs.
     *
     * Angular automatically checks host property bindings during change detection.
     * If a binding changes, Angular updates the directive's host element.
     *
     * When the key is a property of the host element, the property value is
     * propagated to the specified DOM property.
     *
     * When the key is a static attribute in the DOM, the attribute value
     * is propagated to the specified property in the host element.
     *
     * For event handling:
     * - The key is the DOM event that the directive listens to.
     * To listen to global events, add the target to the event name.
     * The target can be `window`, `document` or `body`.
     * - The value is the statement to execute when the event occurs. If the
     * statement evaluates to `false`, then `preventDefault` is applied on the DOM
     * event. A handler method can refer to the `$event` local variable.
     *
     */
    host?: {
        [key: string]: string;
    };
    /**
     * When present, this directive/component is ignored by the AOT compiler.
     * It remains in distributed code, and the JIT compiler attempts to compile it
     * at run time, in the browser.
     * To ensure the correct behavior, the app must import `@angular/compiler`.
     */
    jit?: true;
    /**
     * Angular directives marked as `standalone` do not need to be declared in an NgModule. Such
     * directives don't depend on any "intermediate context" of an NgModule (ex. configured
     * providers).
     *
     * More information about standalone components, directives, and pipes can be found in [this
     * guide](guide/components/importing).
     */
    standalone?: boolean;
    /**
     * Standalone directives that should be applied to the host whenever the directive is matched.
     * By default, none of the inputs or outputs of the host directives will be available on the host,
     * unless they are specified in the `inputs` or `outputs` properties.
     *
     * You can additionally alias inputs and outputs by putting a colon and the alias after the   
     * original input or output name. For example, if a directive applied via `hostDirectives`
     * defines an input named `menuDisabled`, you can alias this to `disabled` by adding
     * `'menuDisabled: disabled'` as an entry to `inputs`.
     */
    hostDirectives?: (Type$1<unknown> | {
        directive: Type$1<unknown>;
        inputs?: string[];
        outputs?: string[];
    })[];
}
/**
 * Type of the Directive metadata.
 *
 * @publicApi
 */
declare const Directive: DirectiveDecorator;
/**
 * Component decorator interface
 *
 * @publicApi
 */
interface ComponentDecorator {
    /**
     * Decorator that marks a class as an Angular component and provides configuration
     * metadata that determines how the component should be processed,
     * instantiated, and used at runtime.
     *
     * Components are the most basic UI building block of an Angular app.
     * An Angular app contains a tree of Angular components.
     *
     * Angular components are a subset of directives, always associated with a template.
     * Unlike other directives, only one component can be instantiated for a given element in a
     * template.
     *
     * Standalone components can be directly imported in any other standalone component or NgModule.
     * NgModule based apps on the other hand require components to belong to an NgModule in
     * order for them to be available to another component or application. To make a component a
     * member of an NgModule, list it in the `declarations` field of the `NgModule` metadata.
     *
     * Note that, in addition to these options for configuring a directive,
     * you can control a component's runtime behavior by implementing
     * life-cycle hooks. For more information, see the
     * [Lifecycle Hooks](guide/components/lifecycle) guide.
     *
     * @usageNotes
     *
     * ### Setting component inputs
     *
     * The following example creates a component with two data-bound properties,
     * specified by the `inputs` value.
     *
     * {@example core/ts/metadata/directives.ts region='component-input'}
     *
     *
     * ### Setting component outputs
     *
     * The following example shows two output function that emit on an interval. One
     * emits an output every second, while the other emits every five seconds.
     *
     * {@example core/ts/metadata/directives.ts region='component-output-interval'}
     *
     * ### Injecting a class with a view provider
     *
     * The following simple example injects a class into a component
     * using the view provider specified in component metadata:
     *
     * ```ts
     * class Greeter {
     *    greet(name:string) {
     *      return 'Hello ' + name + '!';
     *    }
     * }
     *
     * @Directive({
     *   selector: 'needs-greeter'
     * })
     * class NeedsGreeter {
     *   greeter:Greeter;
     *
     *   constructor(greeter:Greeter) {
     *     this.greeter = greeter;
     *   }
     * }
     *
     * @Component({
     *   selector: 'greet',
     *   viewProviders: [
     *     Greeter
     *   ],
     *   template: `<needs-greeter></needs-greeter>`
     * })
     * class HelloWorld {
     * }
     *
     * ```
     *
     * ### Preserving whitespace
     *
     * Removing whitespace can greatly reduce AOT-generated code size and speed up view creation.
     * As of Angular 6, the default for `preserveWhitespaces` is false (whitespace is removed).
     * To change the default setting for all components in your application, set
     * the `preserveWhitespaces` option of the AOT compiler.
     *
     * By default, the AOT compiler removes whitespace characters as follows:
     * * Trims all whitespaces at the beginning and the end of a template.
     * * Removes whitespace-only text nodes. For example,
     *
     * ```html
     * <button>Action 1</button>  <button>Action 2</button>
     * ```
     *
     * becomes:
     *
     * ```html
     * <button>Action 1</button><button>Action 2</button>
     * ```
     *
     * * Replaces a series of whitespace characters in text nodes with a single space.
     * For example, `<span>\n some text\n</span>` becomes `<span> some text </span>`.
     * * Does NOT alter text nodes inside HTML tags such as `<pre>` or `<textarea>`,
     * where whitespace characters are significant.
     *
     * Note that these transformations can influence DOM nodes layout, although impact
     * should be minimal.
     *
     * You can override the default behavior to preserve whitespace characters
     * in certain fragments of a template. For example, you can exclude an entire
     * DOM sub-tree by using the `ngPreserveWhitespaces` attribute:
     *
     * ```html
     * <div ngPreserveWhitespaces>
     *     whitespaces are preserved here
     *     <span>    and here </span>
     * </div>
     * ```
     *
     * You can force a single space to be preserved in a text node by using `&ngsp;`,
     * which is replaced with a space character by Angular's template
     * compiler:
     *
     * ```html
     * <a>Spaces</a>&ngsp;<a>between</a>&ngsp;<a>links.</a>
     * <!-- compiled to be equivalent to:
     *  <a>Spaces</a> <a>between</a> <a>links.</a>  -->
     * ```
     *
     * Note that sequences of `&ngsp;` are still collapsed to just one space character when
     * the `preserveWhitespaces` option is set to `false`.
     *
     * ```html
     * <a>before</a>&ngsp;&ngsp;&ngsp;<a>after</a>
     * <!-- compiled to be equivalent to:
     *  <a>before</a> <a>after</a> -->
     * ```
     *
     * To preserve sequences of whitespace characters, use the
     * `ngPreserveWhitespaces` attribute.
     *
     * @Annotation
     */
    (obj: Component): TypeDecorator;
    /**
     * See the `Component` decorator.
     */
    new (obj: Component): Component;
}
/**
 * Supplies configuration metadata for an Angular component.
 *
 * @publicApi
 */
interface Component extends Directive {
    /**
     * The change-detection strategy to use for this component.
     *
     * When a component is instantiated, Angular creates a change detector,
     * which is responsible for propagating the component's bindings.
     * The strategy is one of:
     * - `ChangeDetectionStrategy#OnPush` sets the strategy to `CheckOnce` (on demand).
     * - `ChangeDetectionStrategy#Default` sets the strategy to `CheckAlways`.
     */
    changeDetection?: ChangeDetectionStrategy$1;
    /**
     * Defines the set of injectable objects that are visible to its view DOM children.
     * See [example](#injecting-a-class-with-a-view-provider).
     *
     */
    viewProviders?: Provider[];
    /**
     * The module ID of the module that contains the component.
     * The component must be able to resolve relative URLs for templates and styles.
     * SystemJS exposes the `__moduleName` variable within each module.
     * In CommonJS, this can  be set to `module.id`.
     *
     * @deprecated This option does not have any effect. Will be removed in Angular v17.
     */
    moduleId?: string;
    /**
     * The relative path or absolute URL of a template file for an Angular component.
     * If provided, do not supply an inline template using `template`.
     *
     */
    templateUrl?: string;
    /**
     * An inline template for an Angular component. If provided,
     * do not supply a template file using `templateUrl`.
     *
     */
    template?: string;
    /**
     * One relative path or an absolute URL for file containing a CSS stylesheet to use
     * in this component.
     */
    styleUrl?: string;
    /**
     * Relative paths or absolute URLs for files containing CSS stylesheets to use in this component.
     */
    styleUrls?: string[];
    /**
     * One or more inline CSS stylesheets to use
     * in this component.
     */
    styles?: string | string[];
    /**
     * One or more animation `trigger()` calls, containing
     * [`state()`](api/animations/state) and `transition()` definitions.
     * See the [Animations guide](guide/animations) and animations API documentation.
     *
     */
    animations?: any[];
    /**
     * An encapsulation policy for the component's styling.
     * Possible values:
     * - `ViewEncapsulation.Emulated`: Apply modified component styles in order to emulate
     *                                 a native Shadow DOM CSS encapsulation behavior.
     * - `ViewEncapsulation.None`: Apply component styles globally without any sort of encapsulation.
     * - `ViewEncapsulation.ShadowDom`: Use the browser's native Shadow DOM API to encapsulate styles.
     *
     * If not supplied, the value is taken from the `CompilerOptions`
     * which defaults to `ViewEncapsulation.Emulated`.
     *
     * If the policy is `ViewEncapsulation.Emulated` and the component has no
     * {@link Component#styles styles} nor {@link Component#styleUrls styleUrls},
     * the policy is automatically switched to `ViewEncapsulation.None`.
     */
    encapsulation?: ViewEncapsulation$1;
    /**
     * Overrides the default interpolation start and end delimiters (`{{` and `}}`).
     *
     * @deprecated use Angular's default interpolation delimiters instead.
     */
    interpolation?: [string, string];
    /**
     * True to preserve or false to remove potentially superfluous whitespace characters
     * from the compiled template. Whitespace characters are those matching the `\s`
     * character class in JavaScript regular expressions. Default is false, unless
     * overridden in compiler options.
     */
    preserveWhitespaces?: boolean;
    /**
     * Angular components marked as `standalone` do not need to be declared in an NgModule. Such
     * components directly manage their own template dependencies (components, directives, and pipes
     * used in a template) via the imports property.
     *
     * More information about standalone components, directives, and pipes can be found in [this
     * guide](guide/components/importing).
     */
    standalone?: boolean;
    /**
     * The imports property specifies the standalone component's template dependencies — those
     * directives, components, and pipes that can be used within its template. Standalone components
     * can import other standalone components, directives, and pipes as well as existing NgModules.
     *
     * This property is only available for standalone components - specifying it for components
     * declared in an NgModule generates a compilation error.
     *
     * More information about standalone components, directives, and pipes can be found in [this
     * guide](guide/components/importing).
     */
    imports?: (Type$1<any> | ReadonlyArray<any>)[];
    /**
     * The set of schemas that declare elements to be allowed in a standalone component. Elements and
     * properties that are neither Angular components nor directives must be declared in a schema.
     *
     * This property is only available for standalone components - specifying it for components
     * declared in an NgModule generates a compilation error.
     *
     * More information about standalone components, directives, and pipes can be found in [this
     * guide](guide/components/importing).
     */
    schemas?: SchemaMetadata[];
}
/**
 * Component decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const Component: ComponentDecorator;
/**
 * Type of the Pipe decorator / constructor function.
 *
 * @publicApi
 */
interface PipeDecorator {
    /**
     *
     * Decorator that marks a class as pipe and supplies configuration metadata.
     *
     * A pipe class must implement the `PipeTransform` interface.
     * For example, if the name is "myPipe", use a template binding expression
     * such as the following:
     *
     * ```html
     * {{ exp | myPipe }}
     * ```
     *
     * The result of the expression is passed to the pipe's `transform()` method.
     *
     * A pipe must belong to an NgModule in order for it to be available
     * to a template. To make it a member of an NgModule,
     * list it in the `declarations` field of the `NgModule` metadata.
     *
     * @see [Style Guide: Pipe Names](style-guide#02-09)
     *
     */
    (obj: Pipe): TypeDecorator;
    /**
     * See the `Pipe` decorator.
     */
    new (obj: Pipe): Pipe;
}
/**
 * Type of the Pipe metadata.
 *
 * @publicApi
 */
interface Pipe {
    /**
     * The pipe name to use in template bindings.
     * Typically uses lowerCamelCase
     * because the name cannot contain hyphens.
     */
    name: string;
    /**
     * When true, the pipe is pure, meaning that the
     * `transform()` method is invoked only when its input arguments
     * change. Pipes are pure by default.
     *
     * If the pipe has internal state (that is, the result
     * depends on state other than its arguments), set `pure` to false.
     * In this case, the pipe is invoked on each change-detection cycle,
     * even if the arguments have not changed.
     */
    pure?: boolean;
    /**
     * Angular pipes marked as `standalone` do not need to be declared in an NgModule. Such
     * pipes don't depend on any "intermediate context" of an NgModule (ex. configured providers).
     *
     * More information about standalone components, directives, and pipes can be found in [this
     * guide](guide/components/importing).
     */
    standalone?: boolean;
}
/**
 * @Annotation
 * @publicApi
 */
declare const Pipe: PipeDecorator;
/**
 * @publicApi
 */
interface InputDecorator {
    /**
     * Decorator that marks a class field as an input property and supplies configuration metadata.
     * The input property is bound to a DOM property in the template. During change detection,
     * Angular automatically updates the data property with the DOM property's value.
     *
     * @usageNotes
     *
     * You can supply an optional name to use in templates when the
     * component is instantiated, that maps to the
     * name of the bound property. By default, the original
     * name of the bound property is used for input binding.
     *
     * The following example creates a component with two input properties,
     * one of which is given a special binding name.
     *
     * ```ts
     * import { Component, Input, numberAttribute, booleanAttribute } from '@angular/core';
     * @Component({
     *   selector: 'bank-account',
     *   template: `
     *     Bank Name: {{bankName}}
     *     Account Id: {{id}}
     *     Account Status: {{status ? 'Active' : 'InActive'}}
     *   `
     * })
     * class BankAccount {
     *   // This property is bound using its original name.
     *   // Defining argument required as true inside the Input Decorator
     *   // makes this property deceleration as mandatory
     *   @Input({ required: true }) bankName!: string;
     *   // Argument alias makes this property value is bound to a different property name
     *   // when this component is instantiated in a template.
     *   // Argument transform convert the input value from string to number
     *   @Input({ alias:'account-id', transform: numberAttribute }) id: number;
     *   // Argument transform the input value from string to boolean
     *   @Input({ transform: booleanAttribute }) status: boolean;
     *   // this property is not bound, and is not automatically updated by Angular
     *   normalizedBankName: string;
     * }
     *
     * @Component({
     *   selector: 'app',
     *   template: `
     *     <bank-account bankName="RBC" account-id="4747" status="true"></bank-account>
     *   `
     * })
     * class App {}
     * ```
     *
     * @see [Input properties](guide/components/inputs)
     * @see [Output properties](guide/components/outputs)
     */
    (arg?: string | Input): any;
    new (arg?: string | Input): any;
}
/**
 * Type of metadata for an `Input` property.
 *
 * @publicApi
 */
interface Input {
    /**
     * The name of the DOM property to which the input property is bound.
     */
    alias?: string;
    /**
     * Whether the input is required for the directive to function.
     */
    required?: boolean;
    /**
     * Function with which to transform the input value before assigning it to the directive instance.
     */
    transform?: (value: any) => any;
}
/**
 * @Annotation
 * @publicApi
 */
declare const Input: InputDecorator;
/**
 * Type of the Output decorator / constructor function.
 *
 * @publicApi
 */
interface OutputDecorator {
    /**
     * Decorator that marks a class field as an output property and supplies configuration metadata.
     * The DOM property bound to the output property is automatically updated during change detection.
     *
     * @usageNotes
     *
     * You can supply an optional name to use in templates when the
     * component is instantiated, that maps to the
     * name of the bound property. By default, the original
     * name of the bound property is used for output binding.
     *
     * See `Input` decorator for an example of providing a binding name.
     *
     * @see [Input properties](guide/components/inputs)
     * @see [Output properties](guide/components/outputs)
     *
     */
    (alias?: string): any;
    new (alias?: string): any;
}
/**
 * Type of the Output metadata.
 *
 * @publicApi
 */
interface Output {
    /**
     * The name of the DOM property to which the output property is bound.
     */
    alias?: string;
}
/**
 * @Annotation
 * @publicApi
 */
declare const Output: OutputDecorator;
/**
 * Type of the HostBinding decorator / constructor function.
 *
 * @publicApi
 */
interface HostBindingDecorator {
    /**
     * Decorator that marks a DOM property or an element class, style or attribute as a host-binding
     * property and supplies configuration metadata. Angular automatically checks host bindings during
     * change detection, and if a binding changes it updates the host element of the directive.
     *
     * @usageNotes
     *
     * The following example creates a directive that sets the `valid` and `invalid`
     * class, a style color, and an id on the DOM element that has an `ngModel` directive on it.
     *
     * ```ts
     * @Directive({selector: '[ngModel]'})
     * class NgModelStatus {
     *   constructor(public control: NgModel) {}
     *   // class bindings
     *   @HostBinding('class.valid') get valid() { return this.control.valid; }
     *   @HostBinding('class.invalid') get invalid() { return this.control.invalid; }
     *
     *   // style binding
     *   @HostBinding('style.color') get color() { return this.control.valid ? 'green': 'red'; }
     *
     *   // style binding also supports a style unit extension
     *   @HostBinding('style.width.px') @Input() width: number = 500;
     *
     *   // attribute binding
     *   @HostBinding('attr.aria-required')
     *   @Input() required: boolean = false;
     *
     *   // property binding
     *   @HostBinding('id') get id() { return this.control.value?.length ? 'odd':  'even'; }
     *
     * @Component({
     *   selector: 'app',
     *   template: `<input [(ngModel)]="prop">`,
     * })
     * class App {
     *   prop;
     * }
     * ```
     *
     */
    (hostPropertyName?: string): any;
    new (hostPropertyName?: string): any;
}
/**
 * Type of the HostBinding metadata.
 *
 * @publicApi
 */
interface HostBinding {
    /**
     * The DOM property that is bound to a data property.
     * This field also accepts:
     *   * classes, prefixed by `class.`
     *   * styles, prefixed by `style.`
     *   * attributes, prefixed by `attr.`
     */
    hostPropertyName?: string;
}
/**
 * @Annotation
 * @publicApi
 */
declare const HostBinding: HostBindingDecorator;
/**
 * Type of the HostListener decorator / constructor function.
 *
 * @publicApi
 */
interface HostListenerDecorator {
    /**
     * Decorator that declares a DOM event to listen for,
     * and provides a handler method to run when that event occurs.
     *
     * Angular invokes the supplied handler method when the host element emits the specified event,
     * and updates the bound element with the result.
     *
     * If the handler method returns false, applies `preventDefault` on the bound element.
     *
     * @usageNotes
     *
     * The following example declares a directive
     * that attaches a click listener to a button and counts clicks.
     *
     * ```ts
     * @Directive({selector: 'button[counting]'})
     * class CountClicks {
     *   numberOfClicks = 0;
     *
     *   @HostListener('click', ['$event.target'])
     *   onClick(btn) {
     *     console.log('button', btn, 'number of clicks:', this.numberOfClicks++);
     *   }
     * }
     *
     * @Component({
     *   selector: 'app',
     *   template: '<button counting>Increment</button>',
     * })
     * class App {}
     * ```
     *
     * The following example registers another DOM event handler that listens for `Enter` key-press
     * events on the global `window`.
     * ```ts
     * import { HostListener, Component } from "@angular/core";
     *
     * @Component({
     *   selector: 'app',
     *   template: `<h1>Hello, you have pressed enter {{counter}} number of times!</h1> Press enter
     * key to increment the counter. <button (click)="resetCounter()">Reset Counter</button>`
     * })
     * class AppComponent {
     *   counter = 0;
     *   @HostListener('window:keydown.enter', ['$event'])
     *   handleKeyDown(event: KeyboardEvent) {
     *     this.counter++;
     *   }
     *   resetCounter() {
     *     this.counter = 0;
     *   }
     * }
     * ```
     * The list of valid key names for `keydown` and `keyup` events
     * can be found here:
     * https://www.w3.org/TR/DOM-Level-3-Events-key/#named-key-attribute-values
     *
     * Note that keys can also be combined, e.g. `@HostListener('keydown.shift.a')`.
     *
     * The global target names that can be used to prefix an event name are
     * `document:`, `window:` and `body:`.
     *
     */
    (eventName: string, args?: string[]): any;
    new (eventName: string, args?: string[]): any;
}
/**
 * Type of the HostListener metadata.
 *
 * @publicApi
 */
interface HostListener {
    /**
     * The DOM event to listen for.
     */
    eventName?: string;
    /**
     * A set of arguments to pass to the handler method when the event occurs.
     */
    args?: string[];
}
/**
 * @Annotation
 * @publicApi
 */
declare const HostListener: HostListenerDecorator;

declare global {
    /**
     * Indicates whether HMR is enabled for the application.
     *
     * `ngHmrMode` is a global flag set by Angular's CLI.
     *
     * @remarks
     * - **Internal Angular Flag**: This is an *internal* Angular flag (not a public API), avoid relying on it in application code.
     * - **Avoid Direct Use**: This variable is intended for runtime configuration; it should not be accessed directly in application code.
     */
    var ngHmrMode: boolean | undefined;
}

declare global {
    const ngJitMode: boolean;
}

declare global {
    /**
     * Indicates whether the application is operating in server-rendering mode.
     *
     * `ngServerMode` is a global flag set by Angular's server-side rendering mechanisms,
     * typically configured by `provideServerRendering` and `platformServer` during runtime.
     *
     * @remarks
     * - **Internal Angular Flag**: This is an *internal* Angular flag (not a public API), avoid relying on it in application code.
     * - **Avoid Direct Use**: This variable is intended for runtime configuration; it should not be accessed directly in application code.
     */
    var ngServerMode: boolean | undefined;
}

/**
 * A type describing supported iterable types.
 *
 * @publicApi
 */
type NgIterable<T> = Array<T> | Iterable<T>;
/**
 * A strategy for tracking changes over time to an iterable. Used by {@link /api/common/NgForOf NgForOf} to
 * respond to changes in an iterable by effecting equivalent changes in the DOM.
 *
 * @publicApi
 */
interface IterableDiffer<V> {
    /**
     * Compute a difference between the previous state and the new `object` state.
     *
     * @param object containing the new value.
     * @returns an object describing the difference. The return value is only valid until the next
     * `diff()` invocation.
     */
    diff(object: NgIterable<V> | undefined | null): IterableChanges<V> | null;
}
/**
 * An object describing the changes in the `Iterable` collection since last time
 * `IterableDiffer#diff()` was invoked.
 *
 * @publicApi
 */
interface IterableChanges<V> {
    /**
     * Iterate over all changes. `IterableChangeRecord` will contain information about changes
     * to each item.
     */
    forEachItem(fn: (record: IterableChangeRecord<V>) => void): void;
    /**
     * Iterate over a set of operations which when applied to the original `Iterable` will produce the
     * new `Iterable`.
     *
     * NOTE: These are not necessarily the actual operations which were applied to the original
     * `Iterable`, rather these are a set of computed operations which may not be the same as the
     * ones applied.
     *
     * @param record A change which needs to be applied
     * @param previousIndex The `IterableChangeRecord#previousIndex` of the `record` refers to the
     *        original `Iterable` location, where as `previousIndex` refers to the transient location
     *        of the item, after applying the operations up to this point.
     * @param currentIndex The `IterableChangeRecord#currentIndex` of the `record` refers to the
     *        original `Iterable` location, where as `currentIndex` refers to the transient location
     *        of the item, after applying the operations up to this point.
     */
    forEachOperation(fn: (record: IterableChangeRecord<V>, previousIndex: number | null, currentIndex: number | null) => void): void;
    /**
     * Iterate over changes in the order of original `Iterable` showing where the original items
     * have moved.
     */
    forEachPreviousItem(fn: (record: IterableChangeRecord<V>) => void): void;
    /** Iterate over all added items. */
    forEachAddedItem(fn: (record: IterableChangeRecord<V>) => void): void;
    /** Iterate over all moved items. */
    forEachMovedItem(fn: (record: IterableChangeRecord<V>) => void): void;
    /** Iterate over all removed items. */
    forEachRemovedItem(fn: (record: IterableChangeRecord<V>) => void): void;
    /**
     * Iterate over all items which had their identity (as computed by the `TrackByFunction`)
     * changed.
     */
    forEachIdentityChange(fn: (record: IterableChangeRecord<V>) => void): void;
}
/**
 * Record representing the item change information.
 *
 * @publicApi
 */
interface IterableChangeRecord<V> {
    /** Current index of the item in `Iterable` or null if removed. */
    readonly currentIndex: number | null;
    /** Previous index of the item in `Iterable` or null if added. */
    readonly previousIndex: number | null;
    /** The item. */
    readonly item: V;
    /** Track by identity as computed by the `TrackByFunction`. */
    readonly trackById: any;
}
/**
 * A function optionally passed into the `NgForOf` directive to customize how `NgForOf` uniquely
 * identifies items in an iterable.
 *
 * `NgForOf` needs to uniquely identify items in the iterable to correctly perform DOM updates
 * when items in the iterable are reordered, new items are added, or existing items are removed.
 *
 *
 * In all of these scenarios it is usually desirable to only update the DOM elements associated
 * with the items affected by the change. This behavior is important to:
 *
 * - preserve any DOM-specific UI state (like cursor position, focus, text selection) when the
 *   iterable is modified
 * - enable animation of item addition, removal, and iterable reordering
 * - preserve the value of the `<select>` element when nested `<option>` elements are dynamically
 *   populated using `NgForOf` and the bound iterable is updated
 *
 * A common use for custom `trackBy` functions is when the model that `NgForOf` iterates over
 * contains a property with a unique identifier. For example, given a model:
 *
 * ```ts
 * class User {
 *   id: number;
 *   name: string;
 *   ...
 * }
 * ```
 * a custom `trackBy` function could look like the following:
 * ```ts
 * function userTrackBy(index, user) {
 *   return user.id;
 * }
 * ```
 *
 * A custom `trackBy` function must have several properties:
 *
 * - be [idempotent](https://en.wikipedia.org/wiki/Idempotence) (be without side effects, and always
 * return the same value for a given input)
 * - return unique value for all unique inputs
 * - be fast
 *
 * @see [`NgForOf#ngForTrackBy`](api/common/NgForOf#ngForTrackBy)
 * @publicApi
 */
interface TrackByFunction<T> {
    /**
     * @param index The index of the item within the iterable.
     * @param item The item in the iterable.
     */
    <U extends T>(index: number, item: T & U): any;
}
/**
 * Provides a factory for {@link IterableDiffer}.
 *
 * @publicApi
 */
interface IterableDifferFactory {
    supports(objects: any): boolean;
    create<V>(trackByFn?: TrackByFunction<V>): IterableDiffer<V>;
}
/**
 * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.
 *
 * @publicApi
 */
declare class IterableDiffers {
    private factories;
    /** @nocollapse */
    static ɵprov: unknown;
    constructor(factories: IterableDifferFactory[]);
    static create(factories: IterableDifferFactory[], parent?: IterableDiffers): IterableDiffers;
    /**
     * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the
     * inherited {@link IterableDiffers} instance with the provided factories and return a new
     * {@link IterableDiffers} instance.
     *
     * @usageNotes
     * ### Example
     *
     * The following example shows how to extend an existing list of factories,
     * which will only be applied to the injector for this component and its children.
     * This step is all that's required to make a new {@link IterableDiffer} available.
     *
     * ```ts
     * @Component({
     *   viewProviders: [
     *     IterableDiffers.extend([new ImmutableListDiffer()])
     *   ]
     * })
     * ```
     */
    static extend(factories: IterableDifferFactory[]): StaticProvider;
    find(iterable: any): IterableDifferFactory;
}

/**
 * Type of the Inject decorator / constructor function.
 *
 * @publicApi
 */
interface InjectDecorator {
    /**
     * Parameter decorator on a dependency parameter of a class constructor
     * that specifies a custom provider of the dependency.
     *
     * @usageNotes
     * The following example shows a class constructor that specifies a
     * custom provider of a dependency using the parameter decorator.
     *
     * When `@Inject()` is not present, the injector uses the type annotation of the
     * parameter as the provider.
     *
     * {@example core/di/ts/metadata_spec.ts region='InjectWithoutDecorator'}
     *
     * @see [Dependency Injection Guide](guide/di/dependency-injection
     *
     */
    (token: any): any;
    new (token: any): Inject;
}
/**
 * Type of the Inject metadata.
 *
 * @publicApi
 */
interface Inject {
    /**
     * A DI token that maps to the dependency to be injected.
     */
    token: any;
}
/**
 * Inject decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const Inject: InjectDecorator;
/**
 * Type of the Optional decorator / constructor function.
 *
 * @publicApi
 */
interface OptionalDecorator {
    /**
     * Parameter decorator to be used on constructor parameters,
     * which marks the parameter as being an optional dependency.
     * The DI framework provides `null` if the dependency is not found.
     *
     * Can be used together with other parameter decorators
     * that modify how dependency injection operates.
     *
     * @usageNotes
     *
     * The following code allows the possibility of a `null` result:
     *
     * {@example core/di/ts/metadata_spec.ts region='Optional'}
     *
     * @see [Dependency Injection Guide](guide/di/dependency-injection.
     */
    (): any;
    new (): Optional;
}
/**
 * Type of the Optional metadata.
 *
 * @publicApi
 */
interface Optional {
}
/**
 * Optional decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const Optional: OptionalDecorator;
/**
 * Type of the Self decorator / constructor function.
 *
 * @publicApi
 */
interface SelfDecorator {
    /**
     * Parameter decorator to be used on constructor parameters,
     * which tells the DI framework to start dependency resolution from the local injector.
     *
     * Resolution works upward through the injector hierarchy, so the children
     * of this class must configure their own providers or be prepared for a `null` result.
     *
     * @usageNotes
     *
     * In the following example, the dependency can be resolved
     * by the local injector when instantiating the class itself, but not
     * when instantiating a child.
     *
     * {@example core/di/ts/metadata_spec.ts region='Self'}
     *
     * @see {@link SkipSelf}
     * @see {@link Optional}
     *
     */
    (): any;
    new (): Self;
}
/**
 * Type of the Self metadata.
 *
 * @publicApi
 */
interface Self {
}
/**
 * Self decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const Self: SelfDecorator;
/**
 * Type of the `SkipSelf` decorator / constructor function.
 *
 * @publicApi
 */
interface SkipSelfDecorator {
    /**
     * Parameter decorator to be used on constructor parameters,
     * which tells the DI framework to start dependency resolution from the parent injector.
     * Resolution works upward through the injector hierarchy, so the local injector
     * is not checked for a provider.
     *
     * @usageNotes
     *
     * In the following example, the dependency can be resolved when
     * instantiating a child, but not when instantiating the class itself.
     *
     * {@example core/di/ts/metadata_spec.ts region='SkipSelf'}
     *
     * @see [Dependency Injection guide](guide/di/di-in-action#skip).
     * @see {@link Self}
     * @see {@link Optional}
     *
     */
    (): any;
    new (): SkipSelf;
}
/**
 * Type of the `SkipSelf` metadata.
 *
 * @publicApi
 */
interface SkipSelf {
}
/**
 * `SkipSelf` decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const SkipSelf: SkipSelfDecorator;
/**
 * Type of the `Host` decorator / constructor function.
 *
 * @publicApi
 */
interface HostDecorator {
    /**
     * Parameter decorator on a view-provider parameter of a class constructor
     * that tells the DI framework to resolve the view by checking injectors of child
     * elements, and stop when reaching the host element of the current component.
     *
     * @usageNotes
     *
     * The following shows use with the `@Optional` decorator, and allows for a `null` result.
     *
     * {@example core/di/ts/metadata_spec.ts region='Host'}
     *
     * For an extended example, see ["Dependency Injection
     * Guide"](guide/di/di-in-action#optional).
     */
    (): any;
    new (): Host;
}
/**
 * Type of the Host metadata.
 *
 * @publicApi
 */
interface Host {
}
/**
 * Host decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const Host: HostDecorator;

/**
 * Runs the given function in the [context](guide/di/dependency-injection-context) of the given
 * `Injector`.
 *
 * Within the function's stack frame, [`inject`](api/core/inject) can be used to inject dependencies
 * from the given `Injector`. Note that `inject` is only usable synchronously, and cannot be used in
 * any asynchronous callbacks or after any `await` points.
 *
 * @param injector the injector which will satisfy calls to [`inject`](api/core/inject) while `fn`
 *     is executing
 * @param fn the closure to be run in the context of `injector`
 * @returns the return value of the function, if any
 * @publicApi
 */
declare function runInInjectionContext<ReturnT>(injector: Injector, fn: () => ReturnT): ReturnT;
/**
 * Asserts that the current stack frame is within an [injection
 * context](guide/di/dependency-injection-context) and has access to `inject`.
 *
 * @param debugFn a reference to the function making the assertion (used for the error message).
 *
 * @publicApi
 */
declare function assertInInjectionContext(debugFn: Function): void;

/**
 * An interface that a function passed into `forwardRef` has to implement.
 *
 * @usageNotes
 * ### Example
 *
 * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref_fn'}
 * @publicApi
 */
interface ForwardRefFn {
    (): any;
}
/**
 * Allows to refer to references which are not yet defined.
 *
 * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of
 * DI is declared, but not yet defined. It is also used when the `token` which we use when creating
 * a query is not yet defined.
 *
 * `forwardRef` is also used to break circularities in standalone components imports.
 *
 * @usageNotes
 * ### Circular dependency example
 * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref'}
 *
 * ### Circular standalone reference import example
 * ```angular-ts
 * @Component({
 *   standalone: true,
 *   imports: [ChildComponent],
 *   selector: 'app-parent',
 *   template: `<app-child [hideParent]="hideParent"></app-child>`,
 * })
 * export class ParentComponent {
 *   @Input() hideParent: boolean;
 * }
 *
 *
 * @Component({
 *   standalone: true,
 *   imports: [CommonModule, forwardRef(() => ParentComponent)],
 *   selector: 'app-child',
 *   template: `<app-parent *ngIf="!hideParent"></app-parent>`,
 * })
 * export class ChildComponent {
 *   @Input() hideParent: boolean;
 * }
 * ```
 *
 * @publicApi
 */
declare function forwardRef(forwardRefFn: ForwardRefFn): Type$1<any>;
/**
 * Lazily retrieves the reference value from a forwardRef.
 *
 * Acts as the identity function when given a non-forward-ref value.
 *
 * @usageNotes
 * ### Example
 *
 * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='resolve_forward_ref'}
 *
 * @see {@link forwardRef}
 * @publicApi
 */
declare function resolveForwardRef<T>(type: T): T;

/**
 * Injectable providers used in `@Injectable` decorator.
 *
 * @publicApi
 */
type InjectableProvider = ValueSansProvider | ExistingSansProvider | StaticClassSansProvider | ConstructorSansProvider | FactorySansProvider | ClassSansProvider;
/**
 * Type of the Injectable decorator / constructor function.
 *
 * @publicApi
 */
interface InjectableDecorator {
    /**
     * Decorator that marks a class as available to be
     * provided and injected as a dependency.
     *
     * @see [Introduction to Services and DI](guide/di)
     * @see [Dependency Injection Guide](guide/di/dependency-injection
     *
     * @usageNotes
     *
     * Marking a class with `@Injectable` ensures that the compiler
     * will generate the necessary metadata to create the class's
     * dependencies when the class is injected.
     *
     * The following example shows how a service class is properly
     *  marked so that a supporting service can be injected upon creation.
     *
     * {@example core/di/ts/metadata_spec.ts region='Injectable'}
     *
     */
    (): TypeDecorator;
    (options?: {
        providedIn: Type$1<any> | 'root' | 'platform' | 'any' | null;
    } & InjectableProvider): TypeDecorator;
    new (): Injectable;
    new (options?: {
        providedIn: Type$1<any> | 'root' | 'platform' | 'any' | null;
    } & InjectableProvider): Injectable;
}
/**
 * Type of the Injectable metadata.
 *
 * @publicApi
 */
interface Injectable {
    /**
     * Determines which injectors will provide the injectable.
     *
     * - `Type<any>` - associates the injectable with an `@NgModule` or other `InjectorType`. This
     * option is DEPRECATED.
     * - 'null' : Equivalent to `undefined`. The injectable is not provided in any scope automatically
     * and must be added to a `providers` array of an [@NgModule](api/core/NgModule#providers),
     * [@Component](api/core/Directive#providers) or [@Directive](api/core/Directive#providers).
     *
     * The following options specify that this injectable should be provided in one of the following
     * injectors:
     * - 'root' : The application-level injector in most apps.
     * - 'platform' : A special singleton platform injector shared by all
     * applications on the page.
     * - 'any' : Provides a unique instance in each lazy loaded module while all eagerly loaded
     * modules share one instance. This option is DEPRECATED.
     *
     */
    providedIn?: Type$1<any> | 'root' | 'platform' | 'any' | null;
}
/**
 * Injectable decorator and metadata.
 *
 * @Annotation
 * @publicApi
 */
declare const Injectable: InjectableDecorator;

/**
 * A multi-provider token for initialization functions that will run upon construction of an
 * environment injector.
 *
 * @deprecated from v19.0.0, use provideEnvironmentInitializer instead
 *
 * @see {@link provideEnvironmentInitializer}
 *
 * Note: As opposed to the `APP_INITIALIZER` token, the `ENVIRONMENT_INITIALIZER` functions are not awaited,
 * hence they should not be `async`.
 *
 * @publicApi
 */
declare const ENVIRONMENT_INITIALIZER: InjectionToken<readonly (() => void)[]>;

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Creates a token that can be used to inject static attributes of the host node.
 *
 * @usageNotes
 * ### Injecting an attribute that is known to exist
 * ```ts
 * @Directive()
 * class MyDir {
 *   attr: string = inject(new HostAttributeToken('some-attr'));
 * }
 * ```
 *
 * ### Optionally injecting an attribute
 * ```ts
 * @Directive()
 * class MyDir {
 *   attr: string | null = inject(new HostAttributeToken('some-attr'), {optional: true});
 * }
 * ```
 * @publicApi
 */
declare class HostAttributeToken {
    private attributeName;
    constructor(attributeName: string);
    toString(): string;
}

/**
 * Generated instruction: injects a token from the currently active injector.
 *
 * (Additional documentation moved to `inject`, as it is the public API, and an alias for this
 * instruction)
 *
 * @see inject
 * @codeGenApi
 * @publicApi This instruction has been emitted by ViewEngine for some time and is deployed to npm.
 */
declare function ɵɵinject<T>(token: ProviderToken<T>): T;
declare function ɵɵinject<T>(token: ProviderToken<T>, flags?: InjectFlags): T | null;
declare function ɵɵinject(token: HostAttributeToken): string;
declare function ɵɵinject(token: HostAttributeToken, flags?: InjectFlags): string | null;
declare function ɵɵinject<T>(token: ProviderToken<T> | HostAttributeToken, flags?: InjectFlags): string | null;
/**
 * Throws an error indicating that a factory function could not be generated by the compiler for a
 * particular class.
 *
 * The name of the class is not mentioned here, but will be in the generated factory function name
 * and thus in the stack trace.
 *
 * @codeGenApi
 */
declare function ɵɵinvalidFactoryDep(index: number): never;
/**
 * @param token A token that represents a dependency that should be injected.
 * @returns the injected value if operation is successful, `null` otherwise.
 * @throws if called outside of a supported context.
 *
 * @publicApi
 */
declare function inject<T>(token: ProviderToken<T>): T;
/**
 * @param token A token that represents a dependency that should be injected.
 * @param flags Control how injection is executed. The flags correspond to injection strategies that
 *     can be specified with parameter decorators `@Host`, `@Self`, `@SkipSelf`, and `@Optional`.
 * @returns the injected value if operation is successful, `null` otherwise.
 * @throws if called outside of a supported context.
 *
 * @publicApi
 * @deprecated prefer an options object instead of `InjectFlags`
 */
declare function inject<T>(token: ProviderToken<T>, flags?: InjectFlags): T | null;
/**
 * @param token A token that represents a dependency that should be injected.
 * @param options Control how injection is executed. Options correspond to injection strategies
 *     that can be specified with parameter decorators `@Host`, `@Self`, `@SkipSelf`, and
 *     `@Optional`.
 * @returns the injected value if operation is successful.
 * @throws if called outside of a supported context, or if the token is not found.
 *
 * @publicApi
 */
declare function inject<T>(token: ProviderToken<T>, options: InjectOptions & {
    optional?: false;
}): T;
/**
 * @param token A token that represents a dependency that should be injected.
 * @param options Control how injection is executed. Options correspond to injection strategies
 *     that can be specified with parameter decorators `@Host`, `@Self`, `@SkipSelf`, and
 *     `@Optional`.
 * @returns the injected value if operation is successful,  `null` if the token is not
 *     found and optional injection has been requested.
 * @throws if called outside of a supported context, or if the token is not found and optional
 *     injection was not requested.
 *
 * @publicApi
 */
declare function inject<T>(token: ProviderToken<T>, options: InjectOptions): T | null;
/**
 * @param token A token that represents a static attribute on the host node that should be injected.
 * @returns Value of the attribute if it exists.
 * @throws If called outside of a supported context or the attribute does not exist.
 *
 * @publicApi
 */
declare function inject(token: HostAttributeToken): string;
/**
 * @param token A token that represents a static attribute on the host node that should be injected.
 * @returns Value of the attribute if it exists, otherwise `null`.
 * @throws If called outside of a supported context.
 *
 * @publicApi
 */
declare function inject(token: HostAttributeToken, options: {
    optional: true;
}): string | null;
/**
 * @param token A token that represents a static attribute on the host node that should be injected.
 * @returns Value of the attribute if it exists.
 * @throws If called outside of a supported context or the attribute does not exist.
 *
 * @publicApi
 */
declare function inject(token: HostAttributeToken, options: {
    optional: false;
}): string;
declare function convertToBitFlags(flags: InjectOptions | InjectFlags | undefined): InjectFlags | undefined;

/**
 * An InjectionToken that gets the current `Injector` for `createInjector()`-style injectors.
 *
 * Requesting this token instead of `Injector` allows `StaticInjector` to be tree-shaken from a
 * project.
 *
 * @publicApi
 */
declare const INJECTOR: InjectionToken<Injector>;

/**
 * A token that can be used to inject the tag name of the host node.
 *
 * @usageNotes
 * ### Injecting a tag name that is known to exist
 * ```ts
 * @Directive()
 * class MyDir {
 *   tagName: string = inject(HOST_TAG_NAME);
 * }
 * ```
 *
 * ### Optionally injecting a tag name
 * ```ts
 * @Directive()
 * class MyDir {
 *   tagName: string | null = inject(HOST_TAG_NAME, {optional: true});
 * }
 * ```
 * @publicApi
 */
declare const HOST_TAG_NAME: InjectionToken<string>;

/**
 * A differ that tracks changes made to an object over time.
 *
 * @publicApi
 */
interface KeyValueDiffer<K, V> {
    /**
     * Compute a difference between the previous state and the new `object` state.
     *
     * @param object containing the new value.
     * @returns an object describing the difference. The return value is only valid until the next
     * `diff()` invocation.
     */
    diff(object: Map<K, V>): KeyValueChanges<K, V> | null;
    /**
     * Compute a difference between the previous state and the new `object` state.
     *
     * @param object containing the new value.
     * @returns an object describing the difference. The return value is only valid until the next
     * `diff()` invocation.
     */
    diff(object: {
        [key: string]: V;
    }): KeyValueChanges<string, V> | null;
}
/**
 * An object describing the changes in the `Map` or `{[k:string]: string}` since last time
 * `KeyValueDiffer#diff()` was invoked.
 *
 * @publicApi
 */
interface KeyValueChanges<K, V> {
    /**
     * Iterate over all changes. `KeyValueChangeRecord` will contain information about changes
     * to each item.
     */
    forEachItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;
    /**
     * Iterate over changes in the order of original Map showing where the original items
     * have moved.
     */
    forEachPreviousItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;
    /**
     * Iterate over all keys for which values have changed.
     */
    forEachChangedItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;
    /**
     * Iterate over all added items.
     */
    forEachAddedItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;
    /**
     * Iterate over all removed items.
     */
    forEachRemovedItem(fn: (r: KeyValueChangeRecord<K, V>) => void): void;
}
/**
 * Record representing the item change information.
 *
 * @publicApi
 */
interface KeyValueChangeRecord<K, V> {
    /**
     * Current key in the Map.
     */
    readonly key: K;
    /**
     * Current value for the key or `null` if removed.
     */
    readonly currentValue: V | null;
    /**
     * Previous value for the key or `null` if added.
     */
    readonly previousValue: V | null;
}
/**
 * Provides a factory for {@link KeyValueDiffer}.
 *
 * @publicApi
 */
interface KeyValueDifferFactory {
    /**
     * Test to see if the differ knows how to diff this kind of object.
     */
    supports(objects: any): boolean;
    /**
     * Create a `KeyValueDiffer`.
     */
    create<K, V>(): KeyValueDiffer<K, V>;
}
/**
 * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.
 *
 * @publicApi
 */
declare class KeyValueDiffers {
    /** @nocollapse */
    static ɵprov: unknown;
    private readonly factories;
    constructor(factories: KeyValueDifferFactory[]);
    static create<S>(factories: KeyValueDifferFactory[], parent?: KeyValueDiffers): KeyValueDiffers;
    /**
     * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the
     * inherited {@link KeyValueDiffers} instance with the provided factories and return a new
     * {@link KeyValueDiffers} instance.
     *
     * @usageNotes
     * ### Example
     *
     * The following example shows how to extend an existing list of factories,
     * which will only be applied to the injector for this component and its children.
     * This step is all that's required to make a new {@link KeyValueDiffer} available.
     *
     * ```ts
     * @Component({
     *   viewProviders: [
     *     KeyValueDiffers.extend([new ImmutableMapDiffer()])
     *   ]
     * })
     * ```
     */
    static extend<S>(factories: KeyValueDifferFactory[]): StaticProvider;
    find(kv: any): KeyValueDifferFactory;
}

declare function devModeEqual(a: any, b: any): boolean;

/**
 * Base class that provides change detection functionality.
 * A change-detection tree collects all views that are to be checked for changes.
 * Use the methods to add and remove views from the tree, initiate change-detection,
 * and explicitly mark views as _dirty_, meaning that they have changed and need to be re-rendered.
 *
 * @see [Using change detection hooks](guide/components/lifecycle#using-change-detection-hooks)
 * @see [Defining custom change detection](guide/components/lifecycle#defining-custom-change-detection)
 *
 * @usageNotes
 *
 * The following examples demonstrate how to modify default change-detection behavior
 * to perform explicit detection when needed.
 *
 * ### Use `markForCheck()` with `CheckOnce` strategy
 *
 * The following example sets the `OnPush` change-detection strategy for a component
 * (`CheckOnce`, rather than the default `CheckAlways`), then forces a second check
 * after an interval.
 *
 * {@example core/ts/change_detect/change-detection.ts region='mark-for-check'}
 *
 * ### Detach change detector to limit how often check occurs
 *
 * The following example defines a component with a large list of read-only data
 * that is expected to change constantly, many times per second.
 * To improve performance, we want to check and update the list
 * less often than the changes actually occur. To do that, we detach
 * the component's change detector and perform an explicit local check every five seconds.
 *
 * {@example core/ts/change_detect/change-detection.ts region='detach'}
 *
 *
 * ### Reattaching a detached component
 *
 * The following example creates a component displaying live data.
 * The component detaches its change detector from the main change detector tree
 * when the `live` property is set to false, and reattaches it when the property
 * becomes true.
 *
 * {@example core/ts/change_detect/change-detection.ts region='reattach'}
 *
 * @publicApi
 */
declare abstract class ChangeDetectorRef {
    /**
     * When a view uses the {@link ChangeDetectionStrategy#OnPush} (checkOnce)
     * change detection strategy, explicitly marks the view as changed so that
     * it can be checked again.
     *
     * Components are normally marked as dirty (in need of rerendering) when inputs
     * have changed or events have fired in the view. Call this method to ensure that
     * a component is checked even if these triggers have not occurred.
     *
     * <!-- TODO: Add a link to a chapter on OnPush components -->
     *
     */
    abstract markForCheck(): void;
    /**
     * Detaches this view from the change-detection tree.
     * A detached view is  not checked until it is reattached.
     * Use in combination with `detectChanges()` to implement local change detection checks.
     *
     * Detached views are not checked during change detection runs until they are
     * re-attached, even if they are marked as dirty.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
     *
     */
    abstract detach(): void;
    /**
     * Checks this view and its children. Use in combination with {@link ChangeDetectorRef#detach}
     * to implement local change detection checks.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
     *
     */
    abstract detectChanges(): void;
    /**
     * Checks the change detector and its children, and throws if any changes are detected.
     *
     * Use in development mode to verify that running change detection doesn't introduce
     * other changes. Calling it in production mode is a noop.
     *
     * @deprecated This is a test-only API that does not have a place in production interface.
     * `checkNoChanges` is already part of an `ApplicationRef` tick when the app is running in dev
     * mode. For more granular `checkNoChanges` validation, use `ComponentFixture`.
     */
    abstract checkNoChanges(): void;
    /**
     * Re-attaches the previously detached view to the change detection tree.
     * Views are attached to the tree by default.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     *
     */
    abstract reattach(): void;
}
/** Returns a ChangeDetectorRef (a.k.a. a ViewRef) */
declare function injectChangeDetectorRef(flags: InjectFlags): ChangeDetectorRef;

/**
 * @deprecated v4.0.0 - Should not be part of public API.
 * @publicApi
 */
declare class DefaultIterableDiffer<V> implements IterableDiffer<V>, IterableChanges<V> {
    readonly length: number;
    readonly collection: V[] | Iterable<V> | null;
    private _linkedRecords;
    private _unlinkedRecords;
    private _previousItHead;
    private _itHead;
    private _itTail;
    private _additionsHead;
    private _additionsTail;
    private _movesHead;
    private _movesTail;
    private _removalsHead;
    private _removalsTail;
    private _identityChangesHead;
    private _identityChangesTail;
    private _trackByFn;
    constructor(trackByFn?: TrackByFunction<V>);
    forEachItem(fn: (record: IterableChangeRecord_<V>) => void): void;
    forEachOperation(fn: (item: IterableChangeRecord<V>, previousIndex: number | null, currentIndex: number | null) => void): void;
    forEachPreviousItem(fn: (record: IterableChangeRecord_<V>) => void): void;
    forEachAddedItem(fn: (record: IterableChangeRecord_<V>) => void): void;
    forEachMovedItem(fn: (record: IterableChangeRecord_<V>) => void): void;
    forEachRemovedItem(fn: (record: IterableChangeRecord_<V>) => void): void;
    forEachIdentityChange(fn: (record: IterableChangeRecord_<V>) => void): void;
    diff(collection: NgIterable<V> | null | undefined): DefaultIterableDiffer<V> | null;
    onDestroy(): void;
    check(collection: NgIterable<V>): boolean;
    get isDirty(): boolean;
    private _addToRemovals;
}
declare class IterableChangeRecord_<V> implements IterableChangeRecord<V> {
    item: V;
    trackById: any;
    currentIndex: number | null;
    previousIndex: number | null;
    constructor(item: V, trackById: any);
}

/**
 * An interface that is implemented by pipes in order to perform a transformation.
 * Angular invokes the `transform` method with the value of a binding
 * as the first argument, and any parameters as the second argument in list form.
 *
 * @usageNotes
 *
 * In the following example, `TruncatePipe` returns the shortened value with an added ellipses.
 *
 * <code-example path="core/ts/pipes/simple_truncate.ts" header="simple_truncate.ts"></code-example>
 *
 * Invoking `{{ 'It was the best of times' | truncate }}` in a template will produce `It was...`.
 *
 * In the following example, `TruncatePipe` takes parameters that sets the truncated length and the
 * string to append with.
 *
 * <code-example path="core/ts/pipes/truncate.ts" header="truncate.ts"></code-example>
 *
 * Invoking `{{ 'It was the best of times' | truncate:4:'....' }}` in a template will produce `It
 * was the best....`.
 *
 * @publicApi
 */
interface PipeTransform {
    transform(value: any, ...args: any[]): any;
}

declare const defaultIterableDiffers: IterableDiffers;
declare const defaultKeyValueDiffers: KeyValueDiffers;

/**
 * A wrapper around a native element inside of a View.
 *
 * An `ElementRef` is backed by a render-specific element. In the browser, this is usually a DOM
 * element.
 *
 * @security Permitting direct access to the DOM can make your application more vulnerable to
 * XSS attacks. Carefully review any use of `ElementRef` in your code. For more detail, see the
 * [Security Guide](https://g.co/ng/security).
 *
 * @publicApi
 */
declare class ElementRef<T = any> {
    /**
     * <div class="docs-alert docs-alert-important">
     *   <header>Use with caution</header>
     *   <p>
     *    Use this API as the last resort when direct access to DOM is needed. Use templating and
     *    data-binding provided by Angular instead. If used, it is recommended in combination with
     *    {@link /best-practices/security#direct-use-of-the-dom-apis-and-explicit-sanitization-calls DomSanitizer}
     *    for maxiumum security;
     *   </p>
     * </div>
     */
    nativeElement: T;
    constructor(nativeElement: T);
}

/**
 * A simple registry that maps `Components` to generated `ComponentFactory` classes
 * that can be used to create instances of components.
 * Use to obtain the factory for a given component type,
 * then use the factory's `create()` method to create a component of that type.
 *
 * Note: since v13, dynamic component creation via
 * [`ViewContainerRef.createComponent`](api/core/ViewContainerRef#createComponent)
 * does **not** require resolving component factory: component class can be used directly.
 *
 * @publicApi
 *
 * @deprecated Angular no longer requires Component factories. Please use other APIs where
 *     Component class can be used directly.
 */
declare abstract class ComponentFactoryResolver$1 {
    static NULL: ComponentFactoryResolver$1;
    /**
     * Retrieves the factory object that creates a component of the given type.
     * @param component The component type.
     */
    abstract resolveComponentFactory<T>(component: Type$1<T>): ComponentFactory$1<T>;
}

/**
 * Represents an instance of an `NgModule` created by an `NgModuleFactory`.
 * Provides access to the `NgModule` instance and related objects.
 *
 * @publicApi
 */
declare abstract class NgModuleRef$1<T> {
    /**
     * The injector that contains all of the providers of the `NgModule`.
     */
    abstract get injector(): EnvironmentInjector;
    /**
     * The resolver that can retrieve component factories in a context of this module.
     *
     * Note: since v13, dynamic component creation via
     * [`ViewContainerRef.createComponent`](api/core/ViewContainerRef#createComponent)
     * does **not** require resolving component factory: component class can be used directly.
     *
     * @deprecated Angular no longer requires Component factories. Please use other APIs where
     *     Component class can be used directly.
     */
    abstract get componentFactoryResolver(): ComponentFactoryResolver$1;
    /**
     * The `NgModule` instance.
     */
    abstract get instance(): T;
    /**
     * Destroys the module instance and all of the data structures associated with it.
     */
    abstract destroy(): void;
    /**
     * Registers a callback to be executed when the module is destroyed.
     */
    abstract onDestroy(callback: () => void): void;
}
interface InternalNgModuleRef<T> extends NgModuleRef$1<T> {
    _bootstrapComponents: Type$1<any>[];
    resolveInjectorInitializers(): void;
}
/**
 * @publicApi
 *
 * @deprecated
 * This class was mostly used as a part of ViewEngine-based JIT API and is no longer needed in Ivy
 * JIT mode. Angular provides APIs that accept NgModule classes directly (such as
 * [PlatformRef.bootstrapModule](api/core/PlatformRef#bootstrapModule) and
 * [createNgModule](api/core/createNgModule)), consider switching to those APIs instead of
 * using factory-based ones.
 */
declare abstract class NgModuleFactory$1<T> {
    abstract get moduleType(): Type$1<T>;
    abstract create(parentInjector: Injector | null): NgModuleRef$1<T>;
}

/**
 * Represents an Angular view.
 *
 * @see {@link /api/core/ChangeDetectorRef?tab=usage-notes Change detection usage}
 *
 * @publicApi
 */
declare abstract class ViewRef$1 extends ChangeDetectorRef {
    /**
     * Destroys this view and all of the data structures associated with it.
     */
    abstract destroy(): void;
    /**
     * Reports whether this view has been destroyed.
     * @returns True after the `destroy()` method has been called, false otherwise.
     */
    abstract get destroyed(): boolean;
    /**
     * A lifecycle hook that provides additional developer-defined cleanup
     * functionality for views.
     * @param callback A handler function that cleans up developer-defined data
     * associated with a view. Called when the `destroy()` method is invoked.
     */
    abstract onDestroy(callback: Function): void;
}
/**
 * Represents an Angular view in a view container.
 * An embedded view can be referenced from a component
 * other than the hosting component whose template defines it, or it can be defined
 * independently by a `TemplateRef`.
 *
 * Properties of elements in a view can change, but the structure (number and order) of elements in
 * a view cannot. Change the structure of elements by inserting, moving, or
 * removing nested views in a view container.
 *
 * @see {@link ViewContainerRef}
 *
 * @usageNotes
 *
 * The following template breaks down into two separate `TemplateRef` instances,
 * an outer one and an inner one.
 *
 * ```html
 * Count: {{items.length}}
 * <ul>
 *   <li *ngFor="let  item of items">{{item}}</li>
 * </ul>
 * ```
 *
 * This is the outer `TemplateRef`:
 *
 * ```html
 * Count: {{items.length}}
 * <ul>
 *   <ng-template ngFor let-item [ngForOf]="items"></ng-template>
 * </ul>
 * ```
 *
 * This is the inner `TemplateRef`:
 *
 * ```html
 *   <li>{{item}}</li>
 * ```
 *
 * The outer and inner `TemplateRef` instances are assembled into views as follows:
 *
 * ```html
 * <!-- ViewRef: outer-0 -->
 * Count: 2
 * <ul>
 *   <ng-template view-container-ref></ng-template>
 *   <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->
 *   <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->
 * </ul>
 * <!-- /ViewRef: outer-0 -->
 * ```
 * @publicApi
 */
declare abstract class EmbeddedViewRef<C> extends ViewRef$1 {
    /**
     * The context for this view, inherited from the anchor element.
     */
    abstract context: C;
    /**
     * The root nodes for this embedded view.
     */
    abstract get rootNodes(): any[];
}

/**
 * Represents a component created by a `ComponentFactory`.
 * Provides access to the component instance and related objects,
 * and provides the means of destroying the instance.
 *
 * @publicApi
 */
declare abstract class ComponentRef$1<C> {
    /**
     * Updates a specified input name to a new value. Using this method will properly mark for check
     * component using the `OnPush` change detection strategy. It will also assure that the
     * `OnChanges` lifecycle hook runs when a dynamically created component is change-detected.
     *
     * @param name The name of an input.
     * @param value The new value of an    input.
     */
    abstract setInput(name: string, value: unknown): void;
    /**
     * The host or anchor element for this component instance.
     */
    abstract get location(): ElementRef;
    /**
     * The dependency injector for this component instance.
     */
    abstract get injector(): Injector;
    /**
     * This component instance.
     */
    abstract get instance(): C;
    /**
     * The host view defined by the template
     * for this component instance.
     */
    abstract get hostView(): ViewRef$1;
    /**
     * The change detector for this component instance.
     */
    abstract get changeDetectorRef(): ChangeDetectorRef;
    /**
     * The type of this component (as created by a `ComponentFactory` class).
     */
    abstract get componentType(): Type$1<any>;
    /**
     * Destroys the component instance and all of the data structures associated with it.
     */
    abstract destroy(): void;
    /**
     * A lifecycle hook that provides additional developer-defined cleanup
     * functionality for the component.
     * @param callback A handler function that cleans up developer-defined data
     * associated with this component. Called when the `destroy()` method is invoked.
     */
    abstract onDestroy(callback: Function): void;
}
/**
 * Base class for a factory that can create a component dynamically.
 * Instantiate a factory for a given type of component with `resolveComponentFactory()`.
 * Use the resulting `ComponentFactory.create()` method to create a component of that type.
 *
 * @publicApi
 *
 * @deprecated Angular no longer requires Component factories. Please use other APIs where
 *     Component class can be used directly.
 */
declare abstract class ComponentFactory$1<C> {
    /**
     * The component's HTML selector.
     */
    abstract get selector(): string;
    /**
     * The type of component the factory will create.
     */
    abstract get componentType(): Type$1<any>;
    /**
     * Selector for all <ng-content> elements in the component.
     */
    abstract get ngContentSelectors(): string[];
    /**
     * The inputs of the component.
     */
    abstract get inputs(): {
        propName: string;
        templateName: string;
        transform?: (value: any) => any;
        isSignal: boolean;
    }[];
    /**
     * The outputs of the component.
     */
    abstract get outputs(): {
        propName: string;
        templateName: string;
    }[];
    /**
     * Creates a new component.
     */
    abstract create(injector: Injector, projectableNodes?: any[][], rootSelectorOrNode?: string | any, environmentInjector?: EnvironmentInjector | NgModuleRef$1<any>): ComponentRef$1<C>;
}

/**
 * Use in components with the `@Output` directive to emit custom events
 * synchronously or asynchronously, and register handlers for those events
 * by subscribing to an instance.
 *
 * @usageNotes
 *
 * Extends
 * [RxJS `Subject`](https://rxjs.dev/api/index/class/Subject)
 * for Angular by adding the `emit()` method.
 *
 * In the following example, a component defines two output properties
 * that create event emitters. When the title is clicked, the emitter
 * emits an open or close event to toggle the current visibility state.
 *
 * ```angular-ts
 * @Component({
 *   selector: 'zippy',
 *   template: `
 *   <div class="zippy">
 *     <div (click)="toggle()">Toggle</div>
 *     <div [hidden]="!visible">
 *       <ng-content></ng-content>
 *     </div>
 *  </div>`})
 * export class Zippy {
 *   visible: boolean = true;
 *   @Output() open: EventEmitter<any> = new EventEmitter();
 *   @Output() close: EventEmitter<any> = new EventEmitter();
 *
 *   toggle() {
 *     this.visible = !this.visible;
 *     if (this.visible) {
 *       this.open.emit(null);
 *     } else {
 *       this.close.emit(null);
 *     }
 *   }
 * }
 * ```
 *
 * Access the event object with the `$event` argument passed to the output event
 * handler:
 *
 * ```html
 * <zippy (open)="onOpen($event)" (close)="onClose($event)"></zippy>
 * ```
 *
 * @publicApi
 */
interface EventEmitter<T> extends Subject<T>, OutputRef<T> {
    /**
     * Creates an instance of this class that can
     * deliver events synchronously or asynchronously.
     *
     * @param [isAsync=false] When true, deliver events asynchronously.
     *
     */
    new (isAsync?: boolean): EventEmitter<T>;
    /**
     * Emits an event containing a given value.
     * @param value The value to emit.
     */
    emit(value?: T): void;
    /**
     * Registers handlers for events emitted by this instance.
     * @param next When supplied, a custom handler for emitted events.
     * @param error When supplied, a custom handler for an error notification from this emitter.
     * @param complete When supplied, a custom handler for a completion notification from this
     *     emitter.
     */
    subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;
    /**
     * Registers handlers for events emitted by this instance.
     * @param observerOrNext When supplied, a custom handler for emitted events, or an observer
     *     object.
     * @param error When supplied, a custom handler for an error notification from this emitter.
     * @param complete When supplied, a custom handler for a completion notification from this
     *     emitter.
     */
    subscribe(observerOrNext?: any, error?: any, complete?: any): Subscription;
}
/**
 * @publicApi
 */
declare const EventEmitter: {
    new (isAsync?: boolean): EventEmitter<any>;
    new <T>(isAsync?: boolean): EventEmitter<T>;
    readonly prototype: EventEmitter<any>;
};

/**
 * An injectable service for executing work inside or outside of the Angular zone.
 *
 * The most common use of this service is to optimize performance when starting a work consisting of
 * one or more asynchronous tasks that don't require UI updates or error handling to be handled by
 * Angular. Such tasks can be kicked off via {@link #runOutsideAngular} and if needed, these tasks
 * can reenter the Angular zone via {@link #run}.
 *
 * <!-- TODO: add/fix links to:
 *   - docs explaining zones and the use of zones in Angular and change-detection
 *   - link to runOutsideAngular/run (throughout this file!)
 *   -->
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import {Component, NgZone} from '@angular/core';
 * import {NgIf} from '@angular/common';
 *
 * @Component({
 *   selector: 'ng-zone-demo',
 *   template: `
 *     <h2>Demo: NgZone</h2>
 *
 *     <p>Progress: {{progress}}%</p>
 *     <p *ngIf="progress >= 100">Done processing {{label}} of Angular zone!</p>
 *
 *     <button (click)="processWithinAngularZone()">Process within Angular zone</button>
 *     <button (click)="processOutsideOfAngularZone()">Process outside of Angular zone</button>
 *   `,
 * })
 * export class NgZoneDemo {
 *   progress: number = 0;
 *   label: string;
 *
 *   constructor(private _ngZone: NgZone) {}
 *
 *   // Loop inside the Angular zone
 *   // so the UI DOES refresh after each setTimeout cycle
 *   processWithinAngularZone() {
 *     this.label = 'inside';
 *     this.progress = 0;
 *     this._increaseProgress(() => console.log('Inside Done!'));
 *   }
 *
 *   // Loop outside of the Angular zone
 *   // so the UI DOES NOT refresh after each setTimeout cycle
 *   processOutsideOfAngularZone() {
 *     this.label = 'outside';
 *     this.progress = 0;
 *     this._ngZone.runOutsideAngular(() => {
 *       this._increaseProgress(() => {
 *         // reenter the Angular zone and display done
 *         this._ngZone.run(() => { console.log('Outside Done!'); });
 *       });
 *     });
 *   }
 *
 *   _increaseProgress(doneCallback: () => void) {
 *     this.progress += 1;
 *     console.log(`Current progress: ${this.progress}%`);
 *
 *     if (this.progress < 100) {
 *       window.setTimeout(() => this._increaseProgress(doneCallback), 10);
 *     } else {
 *       doneCallback();
 *     }
 *   }
 * }
 * ```
 *
 * @publicApi
 */
declare class NgZone {
    readonly hasPendingMacrotasks: boolean;
    readonly hasPendingMicrotasks: boolean;
    /**
     * Whether there are no outstanding microtasks or macrotasks.
     */
    readonly isStable: boolean;
    /**
     * Notifies when code enters Angular Zone. This gets fired first on VM Turn.
     */
    readonly onUnstable: EventEmitter<any>;
    /**
     * Notifies when there is no more microtasks enqueued in the current VM Turn.
     * This is a hint for Angular to do change detection, which may enqueue more microtasks.
     * For this reason this event can fire multiple times per VM Turn.
     */
    readonly onMicrotaskEmpty: EventEmitter<any>;
    /**
     * Notifies when the last `onMicrotaskEmpty` has run and there are no more microtasks, which
     * implies we are about to relinquish VM turn.
     * This event gets called just once.
     */
    readonly onStable: EventEmitter<any>;
    /**
     * Notifies that an error has been delivered.
     */
    readonly onError: EventEmitter<any>;
    constructor(options: {
        enableLongStackTrace?: boolean;
        shouldCoalesceEventChangeDetection?: boolean;
        shouldCoalesceRunChangeDetection?: boolean;
    });
    /**
      This method checks whether the method call happens within an Angular Zone instance.
    */
    static isInAngularZone(): boolean;
    /**
      Assures that the method is called within the Angular Zone, otherwise throws an error.
    */
    static assertInAngularZone(): void;
    /**
      Assures that the method is called outside of the Angular Zone, otherwise throws an error.
    */
    static assertNotInAngularZone(): void;
    /**
     * Executes the `fn` function synchronously within the Angular zone and returns value returned by
     * the function.
     *
     * Running functions via `run` allows you to reenter Angular zone from a task that was executed
     * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
     *
     * Any future tasks or microtasks scheduled from within this function will continue executing from
     * within the Angular zone.
     *
     * If a synchronous error happens it will be rethrown and not reported via `onError`.
     */
    run<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any[]): T;
    /**
     * Executes the `fn` function synchronously within the Angular zone as a task and returns value
     * returned by the function.
     *
     * Running functions via `runTask` allows you to reenter Angular zone from a task that was executed
     * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
     *
     * Any future tasks or microtasks scheduled from within this function will continue executing from
     * within the Angular zone.
     *
     * If a synchronous error happens it will be rethrown and not reported via `onError`.
     */
    runTask<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any[], name?: string): T;
    /**
     * Same as `run`, except that synchronous errors are caught and forwarded via `onError` and not
     * rethrown.
     */
    runGuarded<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any[]): T;
    /**
     * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by
     * the function.
     *
     * Running functions via {@link #runOutsideAngular} allows you to escape Angular's zone and do
     * work that
     * doesn't trigger Angular change-detection or is subject to Angular's error handling.
     *
     * Any future tasks or microtasks scheduled from within this function will continue executing from
     * outside of the Angular zone.
     *
     * Use {@link #run} to reenter the Angular zone and do work that updates the application model.
     */
    runOutsideAngular<T>(fn: (...args: any[]) => T): T;
}
/**
 * Provides a noop implementation of `NgZone` which does nothing. This zone requires explicit calls
 * to framework to perform rendering.
 */
declare class NoopNgZone implements NgZone {
    readonly hasPendingMicrotasks = false;
    readonly hasPendingMacrotasks = false;
    readonly isStable = true;
    readonly onUnstable: EventEmitter<any>;
    readonly onMicrotaskEmpty: EventEmitter<any>;
    readonly onStable: EventEmitter<any>;
    readonly onError: EventEmitter<any>;
    run<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any): T;
    runGuarded<T>(fn: (...args: any[]) => any, applyThis?: any, applyArgs?: any): T;
    runOutsideAngular<T>(fn: (...args: any[]) => T): T;
    runTask<T>(fn: (...args: any[]) => T, applyThis?: any, applyArgs?: any, name?: string): T;
}

interface NgModuleType<T = any> extends Type$1<T> {
    ɵmod: NgModuleDef<T>;
}
/**
 * Represents the expansion of an `NgModule` into its scopes.
 *
 * A scope is a set of directives and pipes that are visible in a particular context. Each
 * `NgModule` has two scopes. The `compilation` scope is the set of directives and pipes that will
 * be recognized in the templates of components declared by the module. The `exported` scope is the
 * set of directives and pipes exported by a module (that is, module B's exported scope gets added
 * to module A's compilation scope when module A imports B).
 */
interface NgModuleTransitiveScopes {
    compilation: {
        directives: Set<any>;
        pipes: Set<any>;
    };
    exported: {
        directives: Set<any>;
        pipes: Set<any>;
    };
    schemas: SchemaMetadata[] | null;
}
/**
 * Runtime link information for NgModules.
 *
 * This is the internal data structure used by the runtime to assemble components, directives,
 * pipes, and injectors.
 *
 * NOTE: Always use `ɵɵdefineNgModule` function to create this object,
 * never create the object directly since the shape of this object
 * can change between versions.
 */
interface NgModuleDef<T> {
    /** Token representing the module. Used by DI. */
    type: T;
    /**
     * List of components to bootstrap.
     *
     * @see {NgModuleScopeInfoFromDecorator} This field is only used in global compilation mode. In local compilation mode the bootstrap info is computed and added in runtime.
     */
    bootstrap: Type$1<any>[] | (() => Type$1<any>[]);
    /** List of components, directives, and pipes declared by this module. */
    declarations: Type$1<any>[] | (() => Type$1<any>[]);
    /** List of modules or `ModuleWithProviders` imported by this module. */
    imports: Type$1<any>[] | (() => Type$1<any>[]);
    /**
     * List of modules, `ModuleWithProviders`, components, directives, or pipes exported by this
     * module.
     */
    exports: Type$1<any>[] | (() => Type$1<any>[]);
    /**
     * Cached value of computed `transitiveCompileScopes` for this module.
     *
     * This should never be read directly, but accessed via `transitiveScopesFor`.
     */
    transitiveCompileScopes: NgModuleTransitiveScopes | null;
    /** The set of schemas that declare elements to be allowed in the NgModule. */
    schemas: SchemaMetadata[] | null;
    /** Unique ID for the module with which it should be registered.  */
    id: string | null;
}

/**
 * Map of inputs for a given directive/component.
 *
 * Given:
 * ```ts
 * class MyComponent {
 *   @Input()
 *   publicInput1: string;
 *
 *   @Input('publicInput2')
 *   declaredInput2: string;
 *
 *   @Input({transform: (value: boolean) => value ? 1 : 0})
 *   transformedInput3: number;
 *
 *   signalInput = input(3);
 * }
 * ```
 *
 * is described as:
 * ```ts
 * {
 *   publicInput1: 'publicInput1',
 *   declaredInput2: [InputFlags.None, 'declaredInput2', 'publicInput2'],
 *   transformedInput3: [
 *     InputFlags.None,
 *     'transformedInput3',
 *     'transformedInput3',
 *     (value: boolean) => value ? 1 : 0
 *   ],
 *   signalInput: [InputFlags.SignalBased, "signalInput"],
 * }
 * ```
 *
 * Which the minifier may translate to:
 * ```ts
 * {
 *   minifiedPublicInput1: 'publicInput1',
 *   minifiedDeclaredInput2: [InputFlags.None, 'publicInput2', 'declaredInput2'],
 *   minifiedTransformedInput3: [
 *     InputFlags.None,
 *     'transformedInput3',
 *     'transformedInput3',
 *     (value: boolean) => value ? 1 : 0
 *   ],
 *   minifiedSignalInput: [InputFlags.SignalBased, "signalInput"],
 * }
 * ```
 *
 * This allows the render to re-construct the minified, public, and declared names
 * of properties.
 *
 * NOTE:
 *  - Because declared and public name are usually same we only generate the array
 *    `['declared', 'public']` format when they differ, or there is a transform.
 *  - The reason why this API and `outputs` API is not the same is that `NgOnChanges` has
 *    inconsistent behavior in that it uses declared names rather than minified or public.
 */
type DirectiveInputs<T> = {
    [P in keyof T]?: string | [
        flags: InputFlags,
        publicName: string,
        declaredName?: string,
        transform?: InputTransformFunction
    ];
};
interface DirectiveDefinition<T> {
    /**
     * Directive type, needed to configure the injector.
     */
    type: Type$1<T>;
    /** The selectors that will be used to match nodes to this directive. */
    selectors?: CssSelectorList;
    /**
     * A map of input names.
     */
    inputs?: DirectiveInputs<T>;
    /**
     * A map of output names.
     *
     * The format is in: `{[actualPropertyName: string]:string}`.
     *
     * Which the minifier may translate to: `{[minifiedPropertyName: string]:string}`.
     *
     * This allows the render to re-construct the minified and non-minified names
     * of properties.
     */
    outputs?: {
        [P in keyof T]?: string;
    };
    /**
     * A list of optional features to apply.
     *
     * See: {@link NgOnChangesFeature}, {@link ProvidersFeature}, {@link InheritDefinitionFeature}
     */
    features?: DirectiveDefFeature[];
    /**
     * Function executed by the parent template to allow child directive to apply host bindings.
     */
    hostBindings?: HostBindingsFunction<T>;
    /**
     * The number of bindings in this directive `hostBindings` (including pure fn bindings).
     *
     * Used to calculate the length of the component's LView array, so we
     * can pre-fill the array and set the host binding start index.
     */
    hostVars?: number;
    /**
     * Assign static attribute values to a host element.
     *
     * This property will assign static attribute values as well as class and style
     * values to a host element. Since attribute values can consist of different types of values,
     * the `hostAttrs` array must include the values in the following format:
     *
     * attrs = [
     *   // static attributes (like `title`, `name`, `id`...)
     *   attr1, value1, attr2, value,
     *
     *   // a single namespace value (like `x:id`)
     *   NAMESPACE_MARKER, namespaceUri1, name1, value1,
     *
     *   // another single namespace value (like `x:name`)
     *   NAMESPACE_MARKER, namespaceUri2, name2, value2,
     *
     *   // a series of CSS classes that will be applied to the element (no spaces)
     *   CLASSES_MARKER, class1, class2, class3,
     *
     *   // a series of CSS styles (property + value) that will be applied to the element
     *   STYLES_MARKER, prop1, value1, prop2, value2
     * ]
     *
     * All non-class and non-style attributes must be defined at the start of the list
     * first before all class and style values are set. When there is a change in value
     * type (like when classes and styles are introduced) a marker must be used to separate
     * the entries. The marker values themselves are set via entries found in the
     * [AttributeMarker] enum.
     */
    hostAttrs?: TAttributes;
    /**
     * Function to create instances of content queries associated with a given directive.
     */
    contentQueries?: ContentQueriesFunction<T>;
    /**
     * Additional set of instructions specific to view query processing. This could be seen as a
     * set of instructions to be inserted into the template function.
     */
    viewQuery?: ViewQueriesFunction<T> | null;
    /**
     * Defines the name that can be used in the template to assign this directive to a variable.
     *
     * See: {@link Directive.exportAs}
     */
    exportAs?: string[];
    /**
     * Whether this directive/component is standalone.
     */
    standalone?: boolean;
    /**
     * Whether this directive/component is signal-based.
     */
    signals?: boolean;
}
interface ComponentDefinition<T> extends Omit<DirectiveDefinition<T>, 'features'> {
    /**
     * The number of nodes, local refs, and pipes in this component template.
     *
     * Used to calculate the length of this component's LView array, so we
     * can pre-fill the array and set the binding start index.
     */
    decls: number;
    /**
     * The number of bindings in this component template (including pure fn bindings).
     *
     * Used to calculate the length of this component's LView array, so we
     * can pre-fill the array and set the host binding start index.
     */
    vars: number;
    /**
     * Template function use for rendering DOM.
     *
     * This function has following structure.
     *
     * ```ts
     * function Template<T>(ctx:T, creationMode: boolean) {
     *   if (creationMode) {
     *     // Contains creation mode instructions.
     *   }
     *   // Contains binding update instructions
     * }
     * ```
     *
     * Common instructions are:
     * Creation mode instructions:
     *  - `elementStart`, `elementEnd`
     *  - `text`
     *  - `container`
     *  - `listener`
     *
     * Binding update instructions:
     * - `bind`
     * - `elementAttribute`
     * - `elementProperty`
     * - `elementClass`
     * - `elementStyle`
     *
     */
    template: ComponentTemplate<T>;
    /**
     * Constants for the nodes in the component's view.
     * Includes attribute arrays, local definition arrays etc.
     */
    consts?: TConstantsOrFactory;
    /**
     * An array of `ngContent[selector]` values that were found in the template.
     */
    ngContentSelectors?: string[];
    /**
     * A list of optional features to apply.
     *
     * See: {@link NgOnChangesFeature}, {@link ProvidersFeature}
     */
    features?: ComponentDefFeature[];
    /**
     * Defines template and style encapsulation options available for Component's {@link /api/core/Component Component}.
     */
    encapsulation?: ViewEncapsulation$1;
    /**
     * Defines arbitrary developer-defined data to be stored on a renderer instance.
     * This is useful for renderers that delegate to other renderers.
     *
     * see: animation
     */
    data?: {
        [kind: string]: any;
    };
    /**
     * A set of styles that the component needs to be present for component to render correctly.
     */
    styles?: string[];
    /**
     * The strategy that the default change detector uses to detect changes.
     * When set, takes effect the next time change detection is triggered.
     */
    changeDetection?: ChangeDetectionStrategy$1;
    /**
     * Registry of directives, components, and pipes that may be found in this component's view.
     *
     * This property is either an array of types or a function that returns the array of types. This
     * function may be necessary to support forward declarations.
     */
    dependencies?: TypeOrFactory<DependencyTypeList>;
    /**
     * The set of schemas that declare elements to be allowed in the component's template.
     */
    schemas?: SchemaMetadata[] | null;
}
/**
 * Create a component definition object.
 *
 *
 * # Example
 * ```ts
 * class MyComponent {
 *   // Generated by Angular Template Compiler
 *   // [Symbol] syntax will not be supported by TypeScript until v2.7
 *   static ɵcmp = defineComponent({
 *     ...
 *   });
 * }
 * ```
 * @codeGenApi
 */
declare function ɵɵdefineComponent<T>(componentDefinition: ComponentDefinition<T>): ComponentDef<any>;
/**
 * @codeGenApi
 */
declare function ɵɵdefineNgModule<T>(def: {
    /** Token representing the module. Used by DI. */
    type: T;
    /** List of components to bootstrap. */
    bootstrap?: Type$1<any>[] | (() => Type$1<any>[]);
    /** List of components, directives, and pipes declared by this module. */
    declarations?: Type$1<any>[] | (() => Type$1<any>[]);
    /** List of modules or `ModuleWithProviders` imported by this module. */
    imports?: Type$1<any>[] | (() => Type$1<any>[]);
    /**
     * List of modules, `ModuleWithProviders`, components, directives, or pipes exported by this
     * module.
     */
    exports?: Type$1<any>[] | (() => Type$1<any>[]);
    /** The set of schemas that declare elements to be allowed in the NgModule. */
    schemas?: SchemaMetadata[] | null;
    /** Unique ID for the module that is used with `getModuleFactory`. */
    id?: string | null;
}): unknown;
/**
 * Create a directive definition object.
 *
 * # Example
 * ```ts
 * class MyDirective {
 *   // Generated by Angular Template Compiler
 *   // [Symbol] syntax will not be supported by TypeScript until v2.7
 *   static ɵdir = ɵɵdefineDirective({
 *     ...
 *   });
 * }
 * ```
 *
 * @codeGenApi
 */
declare function ɵɵdefineDirective<T>(directiveDefinition: DirectiveDefinition<T>): DirectiveDef<any>;
/**
 * Create a pipe definition object.
 *
 * # Example
 * ```ts
 * class MyPipe implements PipeTransform {
 *   // Generated by Angular Template Compiler
 *   static ɵpipe = definePipe({
 *     ...
 *   });
 * }
 * ```
 * @param pipeDef Pipe definition generated by the compiler
 *
 * @codeGenApi
 */
declare function ɵɵdefinePipe<T>(pipeDef: {
    /** Name of the pipe. Used for matching pipes in template to pipe defs. */
    name: string;
    /** Pipe class reference. Needed to extract pipe lifecycle hooks. */
    type: Type$1<T>;
    /** Whether the pipe is pure. */
    pure?: boolean;
    /**
     * Whether the pipe is standalone.
     */
    standalone?: boolean;
}): unknown;

/**
 * @publicApi
 */
type ɵɵDirectiveDeclaration<T, Selector extends string, ExportAs extends string[], InputMap extends {
    [key: string]: string | {
        alias: string | null;
        required: boolean;
        isSignal?: boolean;
    };
}, OutputMap extends {
    [key: string]: string;
}, QueryFields extends string[], NgContentSelectors extends never = never, IsStandalone extends boolean = false, HostDirectives = never, IsSignal extends boolean = false> = unknown;
/**
 * @publicApi
 */
type ɵɵComponentDeclaration<T, Selector extends String, ExportAs extends string[], InputMap extends {
    [key: string]: string | {
        alias: string | null;
        required: boolean;
    };
}, OutputMap extends {
    [key: string]: string;
}, QueryFields extends string[], NgContentSelectors extends string[], IsStandalone extends boolean = false, HostDirectives = never, IsSignal extends boolean = false> = unknown;
/**
 * @publicApi
 */
type ɵɵNgModuleDeclaration<T, Declarations, Imports, Exports> = unknown;
/**
 * @publicApi
 */
type ɵɵPipeDeclaration<T, Name extends string, IsStandalone extends boolean = false> = unknown;
/**
 * @publicApi
 */
type ɵɵInjectorDeclaration<T> = unknown;
/**
 * @publicApi
 */
type ɵɵFactoryDeclaration<T, CtorDependencies extends CtorDependency[]> = unknown;
/**
 * An object literal of this type is used to represent the metadata of a constructor dependency.
 * The type itself is never referred to from generated code.
 *
 * @publicApi
 */
type CtorDependency = {
    /**
     * If an `@Attribute` decorator is used, this represents the injected attribute's name. If the
     * attribute name is a dynamic expression instead of a string literal, this will be the unknown
     * type.
     */
    attribute?: string | unknown;
    /**
     * If `@Optional()` is used, this key is set to true.
     */
    optional?: true;
    /**
     * If `@Host` is used, this key is set to true.
     */
    host?: true;
    /**
     * If `@Self` is used, this key is set to true.
     */
    self?: true;
    /**
     * If `@SkipSelf` is used, this key is set to true.
     */
    skipSelf?: true;
} | null;

/**
 * If a given component has unresolved async metadata - returns a reference
 * to a function that applies component metadata after resolving defer-loadable
 * dependencies. Otherwise - this function returns `null`.
 */
declare function getAsyncClassMetadataFn(type: Type$1<unknown>): (() => Promise<Array<Type$1<unknown>>>) | null;
/**
 * Handles the process of applying metadata info to a component class in case
 * component template has defer blocks (thus some dependencies became deferrable).
 *
 * @param type Component class where metadata should be added
 * @param dependencyLoaderFn Function that loads dependencies
 * @param metadataSetterFn Function that forms a scope in which the `setClassMetadata` is invoked
 */
declare function setClassMetadataAsync(type: Type$1<any>, dependencyLoaderFn: () => Array<Promise<Type$1<unknown>>>, metadataSetterFn: (...types: Type$1<unknown>[]) => void): () => Promise<Array<Type$1<unknown>>>;
/**
 * Adds decorator, constructor, and property metadata to a given type via static metadata fields
 * on the type.
 *
 * These metadata fields can later be read with Angular's `ReflectionCapabilities` API.
 *
 * Calls to `setClassMetadata` can be guarded by ngDevMode, resulting in the metadata assignments
 * being tree-shaken away during production builds.
 */
declare function setClassMetadata(type: Type$1<any>, decorators: any[] | null, ctorParameters: (() => any[]) | null, propDecorators: {
    [field: string]: any;
} | null): void;

interface ChangeDetectorRefInterface extends ChangeDetectorRef {
}
declare class ViewRef<T> implements EmbeddedViewRef<T>, ChangeDetectorRefInterface {
    /**
     * This represents the `LView` associated with the point where `ChangeDetectorRef` was
     * requested.
     *
     * This may be different from `_lView` if the `_cdRefInjectingView` is an embedded view.
     */
    private _cdRefInjectingView?;
    readonly notifyErrorHandler: boolean;
    private _appRef;
    private _attachedToViewContainer;
    get rootNodes(): any[];
    constructor(
    /**
     * This represents `LView` associated with the component when ViewRef is a ChangeDetectorRef.
     *
     * When ViewRef is created for a dynamic component, this also represents the `LView` for the
     * component.
     *
     * For a "regular" ViewRef created for an embedded view, this is the `LView` for the embedded
     * view.
     *
     * @internal
     */
    _lView: LView, 
    /**
     * This represents the `LView` associated with the point where `ChangeDetectorRef` was
     * requested.
     *
     * This may be different from `_lView` if the `_cdRefInjectingView` is an embedded view.
     */
    _cdRefInjectingView?: LView | undefined, notifyErrorHandler?: boolean);
    get context(): T;
    /**
     * @deprecated Replacing the full context object is not supported. Modify the context
     *   directly, or consider using a `Proxy` if you need to replace the full object.
     * // TODO(devversion): Remove this.
     */
    set context(value: T);
    get destroyed(): boolean;
    destroy(): void;
    onDestroy(callback: Function): void;
    /**
     * Marks a view and all of its ancestors dirty.
     *
     * This can be used to ensure an {@link ChangeDetectionStrategy#OnPush} component is
     * checked when it needs to be re-rendered but the two normal triggers haven't marked it
     * dirty (i.e. inputs haven't changed and events haven't fired in the view).
     *
     * <!-- TODO: Add a link to a chapter on OnPush components -->
     *
     * @usageNotes
     * ### Example
     *
     * ```ts
     * @Component({
     *   selector: 'app-root',
     *   template: `Number of ticks: {{numberOfTicks}}`
     *   changeDetection: ChangeDetectionStrategy.OnPush,
     * })
     * class AppComponent {
     *   numberOfTicks = 0;
     *
     *   constructor(private ref: ChangeDetectorRef) {
     *     setInterval(() => {
     *       this.numberOfTicks++;
     *       // the following is required, otherwise the view will not be updated
     *       this.ref.markForCheck();
     *     }, 1000);
     *   }
     * }
     * ```
     */
    markForCheck(): void;
    /**
     * Detaches the view from the change detection tree.
     *
     * Detached views will not be checked during change detection runs until they are
     * re-attached, even if they are dirty. `detach` can be used in combination with
     * {@link ChangeDetectorRef#detectChanges} to implement local change
     * detection checks.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
     *
     * @usageNotes
     * ### Example
     *
     * The following example defines a component with a large list of readonly data.
     * Imagine the data changes constantly, many times per second. For performance reasons,
     * we want to check and update the list every five seconds. We can do that by detaching
     * the component's change detector and doing a local check every five seconds.
     *
     * ```ts
     * class DataProvider {
     *   // in a real application the returned data will be different every time
     *   get data() {
     *     return [1,2,3,4,5];
     *   }
     * }
     *
     * @Component({
     *   selector: 'giant-list',
     *   template: `
     *     <li *ngFor="let d of dataProvider.data">Data {{d}}</li>
     *   `,
     * })
     * class GiantList {
     *   constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {
     *     ref.detach();
     *     setInterval(() => {
     *       this.ref.detectChanges();
     *     }, 5000);
     *   }
     * }
     *
     * @Component({
     *   selector: 'app',
     *   providers: [DataProvider],
     *   template: `
     *     <giant-list><giant-list>
     *   `,
     * })
     * class App {
     * }
     * ```
     */
    detach(): void;
    /**
     * Re-attaches a view to the change detection tree.
     *
     * This can be used to re-attach views that were previously detached from the tree
     * using {@link ChangeDetectorRef#detach}. Views are attached to the tree by default.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     *
     * @usageNotes
     * ### Example
     *
     * The following example creates a component displaying `live` data. The component will detach
     * its change detector from the main change detector tree when the component's live property
     * is set to false.
     *
     * ```ts
     * class DataProvider {
     *   data = 1;
     *
     *   constructor() {
     *     setInterval(() => {
     *       this.data = this.data * 2;
     *     }, 500);
     *   }
     * }
     *
     * @Component({
     *   selector: 'live-data',
     *   inputs: ['live'],
     *   template: 'Data: {{dataProvider.data}}'
     * })
     * class LiveData {
     *   constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {}
     *
     *   set live(value) {
     *     if (value) {
     *       this.ref.reattach();
     *     } else {
     *       this.ref.detach();
     *     }
     *   }
     * }
     *
     * @Component({
     *   selector: 'app-root',
     *   providers: [DataProvider],
     *   template: `
     *     Live Update: <input type="checkbox" [(ngModel)]="live">
     *     <live-data [live]="live"><live-data>
     *   `,
     * })
     * class AppComponent {
     *   live = true;
     * }
     * ```
     */
    reattach(): void;
    /**
     * Checks the view and its children.
     *
     * This can also be used in combination with {@link ChangeDetectorRef#detach} to implement
     * local change detection checks.
     *
     * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
     * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
     *
     * @usageNotes
     * ### Example
     *
     * The following example defines a component with a large list of readonly data.
     * Imagine, the data changes constantly, many times per second. For performance reasons,
     * we want to check and update the list every five seconds.
     *
     * We can do that by detaching the component's change detector and doing a local change detection
     * check every five seconds.
     *
     * See {@link ChangeDetectorRef#detach} for more information.
     */
    detectChanges(): void;
    /**
     * Checks the change detector and its children, and throws if any changes are detected.
     *
     * This is used in development mode to verify that running change detection doesn't
     * introduce other changes.
     */
    checkNoChanges(): void;
    attachToViewContainerRef(): void;
    detachFromAppRef(): void;
    attachToAppRef(appRef: ApplicationRef): void;
}
/**
 * Reports whether the given view is considered dirty according to the different marking mechanisms.
 */
declare function isViewDirty(view: ViewRef<unknown>): boolean;
declare function markForRefresh(view: ViewRef<unknown>): void;

declare class ComponentFactoryResolver extends ComponentFactoryResolver$1 {
    private ngModule?;
    /**
     * @param ngModule The NgModuleRef to which all resolved factories are bound.
     */
    constructor(ngModule?: NgModuleRef$1<any> | undefined);
    resolveComponentFactory<T>(component: Type$1<T>): ComponentFactory$1<T>;
}
/**
 * ComponentFactory interface implementation.
 */
declare class ComponentFactory<T> extends ComponentFactory$1<T> {
    private componentDef;
    private ngModule?;
    selector: string;
    componentType: Type$1<any>;
    ngContentSelectors: string[];
    isBoundToModule: boolean;
    private cachedInputs;
    private cachedOutputs;
    get inputs(): {
        propName: string;
        templateName: string;
        isSignal: boolean;
        transform?: (value: any) => any;
    }[];
    get outputs(): {
        propName: string;
        templateName: string;
    }[];
    /**
     * @param componentDef The component definition.
     * @param ngModule The NgModuleRef to which the factory is bound.
     */
    constructor(componentDef: ComponentDef<any>, ngModule?: NgModuleRef$1<any> | undefined);
    create(injector: Injector, projectableNodes?: any[][] | undefined, rootSelectorOrNode?: any, environmentInjector?: NgModuleRef$1<any> | EnvironmentInjector | undefined): ComponentRef$1<T>;
}
/**
 * Represents an instance of a Component created via a {@link ComponentFactory}.
 *
 * `ComponentRef` provides access to the Component Instance as well other objects related to this
 * Component Instance and allows you to destroy the Component Instance via the {@link #destroy}
 * method.
 *
 */
declare class ComponentRef<T> extends ComponentRef$1<T> {
    private _rootLView;
    instance: T;
    hostView: ViewRef<T>;
    changeDetectorRef: ChangeDetectorRef;
    componentType: Type$1<T>;
    location: ElementRef;
    private previousInputValues;
    private _tNode;
    constructor(componentType: Type$1<T>, _rootLView: LView);
    setInput(name: string, value: unknown): void;
    get injector(): Injector;
    destroy(): void;
    onDestroy(callback: () => void): void;
}

/**
 * Returns a new NgModuleRef instance based on the NgModule class and parent injector provided.
 *
 * @param ngModule NgModule class.
 * @param parentInjector Optional injector instance to use as a parent for the module injector. If
 *     not provided, `NullInjector` will be used instead.
 * @returns NgModuleRef that represents an NgModule instance.
 *
 * @publicApi
 */
declare function createNgModule<T>(ngModule: Type$1<T>, parentInjector?: Injector): NgModuleRef$1<T>;
/**
 * The `createNgModule` function alias for backwards-compatibility.
 * Please avoid using it directly and use `createNgModule` instead.
 *
 * @deprecated Use `createNgModule` instead.
 */
declare const createNgModuleRef: typeof createNgModule;
declare class NgModuleRef<T> extends NgModuleRef$1<T> implements InternalNgModuleRef<T> {
    private readonly ngModuleType;
    _parent: Injector | null;
    _bootstrapComponents: Type$1<any>[];
    private readonly _r3Injector;
    instance: T;
    destroyCbs: (() => void)[] | null;
    readonly componentFactoryResolver: ComponentFactoryResolver;
    constructor(ngModuleType: Type$1<T>, _parent: Injector | null, additionalProviders: StaticProvider[], runInjectorInitializers?: boolean);
    resolveInjectorInitializers(): void;
    get injector(): EnvironmentInjector;
    destroy(): void;
    onDestroy(callback: () => void): void;
}
declare class NgModuleFactory<T> extends NgModuleFactory$1<T> {
    moduleType: Type$1<T>;
    constructor(moduleType: Type$1<T>);
    create(parentInjector: Injector | null): NgModuleRef$1<T>;
}
/**
 * Create a new environment injector.
 *
 * @param providers An array of providers.
 * @param parent A parent environment injector.
 * @param debugName An optional name for this injector instance, which will be used in error
 *     messages.
 *
 * @publicApi
 */
declare function createEnvironmentInjector(providers: Array<Provider | EnvironmentProviders>, parent: EnvironmentInjector, debugName?: string | null): EnvironmentInjector;

/**
 * Convince closure compiler that the wrapped function has no side-effects.
 *
 * Closure compiler always assumes that `toString` has no side-effects. We use this quirk to
 * allow us to execute a function but have closure compiler mark the call as no-side-effects.
 * It is important that the return value for the `noSideEffects` function be assigned
 * to something which is retained otherwise the call to `noSideEffects` will be removed by closure
 * compiler.
 */
declare function noSideEffects<T>(fn: () => T): T;

/**
 * A DI token that provides a set of callbacks to
 * be called for every component that is bootstrapped.
 *
 * Each callback must take a `ComponentRef` instance and return nothing.
 *
 * `(componentRef: ComponentRef) => void`
 *
 * @publicApi
 */
declare const APP_BOOTSTRAP_LISTENER: InjectionToken<readonly ((compRef: ComponentRef$1<any>) => void)[]>;
declare function isBoundToModule<C>(cf: ComponentFactory$1<C>): boolean;
/**
 * A token for third-party components that can register themselves with NgProbe.
 *
 * @deprecated
 * @publicApi
 */
declare class NgProbeToken {
    name: string;
    token: any;
    constructor(name: string, token: any);
}
/**
 * Provides additional options to the bootstrapping process.
 *
 * @publicApi
 */
interface BootstrapOptions {
    /**
     * Optionally specify which `NgZone` should be used when not configured in the providers.
     *
     * - Provide your own `NgZone` instance.
     * - `zone.js` - Use default `NgZone` which requires `Zone.js`.
     * - `noop` - Use `NoopNgZone` which does nothing.
     */
    ngZone?: NgZone | 'zone.js' | 'noop';
    /**
     * Optionally specify coalescing event change detections or not.
     * Consider the following case.
     *
     * ```html
     * <div (click)="doSomething()">
     *   <button (click)="doSomethingElse()"></button>
     * </div>
     * ```
     *
     * When button is clicked, because of the event bubbling, both
     * event handlers will be called and 2 change detections will be
     * triggered. We can coalesce such kind of events to only trigger
     * change detection only once.
     *
     * By default, this option will be false. So the events will not be
     * coalesced and the change detection will be triggered multiple times.
     * And if this option be set to true, the change detection will be
     * triggered async by scheduling a animation frame. So in the case above,
     * the change detection will only be triggered once.
     */
    ngZoneEventCoalescing?: boolean;
    /**
     * Optionally specify if `NgZone#run()` method invocations should be coalesced
     * into a single change detection.
     *
     * Consider the following case.
     * ```ts
     * for (let i = 0; i < 10; i ++) {
     *   ngZone.run(() => {
     *     // do something
     *   });
     * }
     * ```
     *
     * This case triggers the change detection multiple times.
     * With ngZoneRunCoalescing options, all change detections in an event loop trigger only once.
     * In addition, the change detection executes in requestAnimation.
     *
     */
    ngZoneRunCoalescing?: boolean;
    /**
     * When false, change detection is scheduled when Angular receives
     * a clear indication that templates need to be refreshed. This includes:
     *
     * - calling `ChangeDetectorRef.markForCheck`
     * - calling `ComponentRef.setInput`
     * - updating a signal that is read in a template
     * - attaching a view that is marked dirty
     * - removing a view
     * - registering a render hook (templates are only refreshed if render hooks do one of the above)
     *
     * @deprecated This option was introduced out of caution as a way for developers to opt out of the
     *    new behavior in v18 which schedule change detection for the above events when they occur
     *    outside the Zone. After monitoring the results post-release, we have determined that this
     *    feature is working as desired and do not believe it should ever be disabled by setting
     *    this option to `true`.
     */
    ignoreChangesOutsideZone?: boolean;
}
/**
 * A reference to an Angular application running on a page.
 *
 * @usageNotes
 * ### isStable examples and caveats
 *
 * Note two important points about `isStable`, demonstrated in the examples below:
 * - the application will never be stable if you start any kind
 * of recurrent asynchronous task when the application starts
 * (for example for a polling process, started with a `setInterval`, a `setTimeout`
 * or using RxJS operators like `interval`);
 * - the `isStable` Observable runs outside of the Angular zone.
 *
 * Let's imagine that you start a recurrent task
 * (here incrementing a counter, using RxJS `interval`),
 * and at the same time subscribe to `isStable`.
 *
 * ```ts
 * constructor(appRef: ApplicationRef) {
 *   appRef.isStable.pipe(
 *      filter(stable => stable)
 *   ).subscribe(() => console.log('App is stable now');
 *   interval(1000).subscribe(counter => console.log(counter));
 * }
 * ```
 * In this example, `isStable` will never emit `true`,
 * and the trace "App is stable now" will never get logged.
 *
 * If you want to execute something when the app is stable,
 * you have to wait for the application to be stable
 * before starting your polling process.
 *
 * ```ts
 * constructor(appRef: ApplicationRef) {
 *   appRef.isStable.pipe(
 *     first(stable => stable),
 *     tap(stable => console.log('App is stable now')),
 *     switchMap(() => interval(1000))
 *   ).subscribe(counter => console.log(counter));
 * }
 * ```
 * In this example, the trace "App is stable now" will be logged
 * and then the counter starts incrementing every second.
 *
 * Note also that this Observable runs outside of the Angular zone,
 * which means that the code in the subscription
 * to this Observable will not trigger the change detection.
 *
 * Let's imagine that instead of logging the counter value,
 * you update a field of your component
 * and display it in its template.
 *
 * ```ts
 * constructor(appRef: ApplicationRef) {
 *   appRef.isStable.pipe(
 *     first(stable => stable),
 *     switchMap(() => interval(1000))
 *   ).subscribe(counter => this.value = counter);
 * }
 * ```
 * As the `isStable` Observable runs outside the zone,
 * the `value` field will be updated properly,
 * but the template will not be refreshed!
 *
 * You'll have to manually trigger the change detection to update the template.
 *
 * ```ts
 * constructor(appRef: ApplicationRef, cd: ChangeDetectorRef) {
 *   appRef.isStable.pipe(
 *     first(stable => stable),
 *     switchMap(() => interval(1000))
 *   ).subscribe(counter => {
 *     this.value = counter;
 *     cd.detectChanges();
 *   });
 * }
 * ```
 *
 * Or make the subscription callback run inside the zone.
 *
 * ```ts
 * constructor(appRef: ApplicationRef, zone: NgZone) {
 *   appRef.isStable.pipe(
 *     first(stable => stable),
 *     switchMap(() => interval(1000))
 *   ).subscribe(counter => zone.run(() => this.value = counter));
 * }
 * ```
 *
 * @publicApi
 */
declare class ApplicationRef {
    private _destroyed;
    private _destroyListeners;
    private readonly internalErrorHandler;
    private readonly afterRenderManager;
    private readonly zonelessEnabled;
    private readonly rootEffectScheduler;
    private externalTestViews;
    /**
     * Indicates whether this instance was destroyed.
     */
    get destroyed(): boolean;
    /**
     * Get a list of component types registered to this application.
     * This list is populated even before the component is created.
     */
    readonly componentTypes: Type$1<any>[];
    /**
     * Get a list of components registered to this application.
     */
    readonly components: ComponentRef$1<any>[];
    /**
     * Returns an Observable that indicates when the application is stable or unstable.
     */
    readonly isStable: Observable<boolean>;
    constructor();
    /**
     * @returns A promise that resolves when the application becomes stable
     */
    whenStable(): Promise<void>;
    private readonly _injector;
    private _rendererFactory;
    /**
     * The `EnvironmentInjector` used to create this application.
     */
    get injector(): EnvironmentInjector;
    /**
     * Bootstrap a component onto the element identified by its selector or, optionally, to a
     * specified element.
     *
     * @usageNotes
     * ### Bootstrap process
     *
     * When bootstrapping a component, Angular mounts it onto a target DOM element
     * and kicks off automatic change detection. The target DOM element can be
     * provided using the `rootSelectorOrNode` argument.
     *
     * If the target DOM element is not provided, Angular tries to find one on a page
     * using the `selector` of the component that is being bootstrapped
     * (first matched element is used).
     *
     * ### Example
     *
     * Generally, we define the component to bootstrap in the `bootstrap` array of `NgModule`,
     * but it requires us to know the component while writing the application code.
     *
     * Imagine a situation where we have to wait for an API call to decide about the component to
     * bootstrap. We can use the `ngDoBootstrap` hook of the `NgModule` and call this method to
     * dynamically bootstrap a component.
     *
     * {@example core/ts/platform/platform.ts region='componentSelector'}
     *
     * Optionally, a component can be mounted onto a DOM element that does not match the
     * selector of the bootstrapped component.
     *
     * In the following example, we are providing a CSS selector to match the target element.
     *
     * {@example core/ts/platform/platform.ts region='cssSelector'}
     *
     * While in this example, we are providing reference to a DOM node.
     *
     * {@example core/ts/platform/platform.ts region='domNode'}
     */
    bootstrap<C>(component: Type$1<C>, rootSelectorOrNode?: string | any): ComponentRef$1<C>;
    /**
     * Bootstrap a component onto the element identified by its selector or, optionally, to a
     * specified element.
     *
     * @usageNotes
     * ### Bootstrap process
     *
     * When bootstrapping a component, Angular mounts it onto a target DOM element
     * and kicks off automatic change detection. The target DOM element can be
     * provided using the `rootSelectorOrNode` argument.
     *
     * If the target DOM element is not provided, Angular tries to find one on a page
     * using the `selector` of the component that is being bootstrapped
     * (first matched element is used).
     *
     * ### Example
     *
     * Generally, we define the component to bootstrap in the `bootstrap` array of `NgModule`,
     * but it requires us to know the component while writing the application code.
     *
     * Imagine a situation where we have to wait for an API call to decide about the component to
     * bootstrap. We can use the `ngDoBootstrap` hook of the `NgModule` and call this method to
     * dynamically bootstrap a component.
     *
     * {@example core/ts/platform/platform.ts region='componentSelector'}
     *
     * Optionally, a component can be mounted onto a DOM element that does not match the
     * selector of the bootstrapped component.
     *
     * In the following example, we are providing a CSS selector to match the target element.
     *
     * {@example core/ts/platform/platform.ts region='cssSelector'}
     *
     * While in this example, we are providing reference to a DOM node.
     *
     * {@example core/ts/platform/platform.ts region='domNode'}
     *
     * @deprecated Passing Component factories as the `Application.bootstrap` function argument is
     *     deprecated. Pass Component Types instead.
     */
    bootstrap<C>(componentFactory: ComponentFactory$1<C>, rootSelectorOrNode?: string | any): ComponentRef$1<C>;
    private bootstrapImpl;
    /**
     * Invoke this method to explicitly process change detection and its side-effects.
     *
     * In development mode, `tick()` also performs a second change detection cycle to ensure that no
     * further changes are detected. If additional changes are picked up during this second cycle,
     * bindings in the app have side-effects that cannot be resolved in a single change detection
     * pass.
     * In this case, Angular throws an error, since an Angular application can only have one change
     * detection pass during which all change detection must complete.
     */
    tick(): void;
    private tickImpl;
    /**
     * Performs the core work of synchronizing the application state with the UI, resolving any
     * pending dirtiness (potentially in a loop).
     */
    private synchronize;
    /**
     * Perform a single synchronization pass.
     */
    private synchronizeOnce;
    /**
     * Checks `allViews` for views which require refresh/traversal, and updates `dirtyFlags`
     * accordingly, with two potential behaviors:
     *
     * 1. If any of our views require updating, then this adds the `ViewTreeTraversal` dirty flag.
     *    This _should_ be a no-op, since the scheduler should've added the flag at the same time the
     *    view was marked as needing updating.
     *
     *    TODO(alxhub): figure out if this behavior is still needed for edge cases.
     *
     * 2. If none of our views require updating, then clear the view-related `dirtyFlag`s. This
     *    happens when the scheduler is notified of a view becoming dirty, but the view itself isn't
     *    reachable through traversal from our roots (e.g. it's detached from the CD tree).
     */
    private syncDirtyFlagsWithViews;
    /**
     * Attaches a view so that it will be dirty checked.
     * The view will be automatically detached when it is destroyed.
     * This will throw if the view is already attached to a ViewContainer.
     */
    attachView(viewRef: ViewRef$1): void;
    /**
     * Detaches a view from dirty checking again.
     */
    detachView(viewRef: ViewRef$1): void;
    private _loadComponent;
    /**
     * Registers a listener to be called when an instance is destroyed.
     *
     * @param callback A callback function to add as a listener.
     * @returns A function which unregisters a listener.
     */
    onDestroy(callback: () => void): VoidFunction;
    /**
     * Destroys an Angular application represented by this `ApplicationRef`. Calling this function
     * will destroy the associated environment injectors as well as all the bootstrapped components
     * with their views.
     */
    destroy(): void;
    /**
     * Returns the number of attached views.
     */
    get viewCount(): number;
    static ɵfac: ɵɵFactoryDeclaration<ApplicationRef, never>;
    static ɵprov: ɵɵInjectableDeclaration<ApplicationRef>;
}
declare function detectChangesInViewIfRequired(lView: LView, notifyErrorHandler: boolean, isFirstPass: boolean, zonelessEnabled: boolean): void;

/**
 * @description
 * Hook for manual bootstrapping of the application instead of using `bootstrap` array in @NgModule
 * annotation. This hook is invoked only when the `bootstrap` array is empty or not provided.
 *
 * Reference to the current application is provided as a parameter.
 *
 * See ["Bootstrapping"](guide/ngmodules/bootstrapping).
 *
 * @usageNotes
 * The example below uses `ApplicationRef.bootstrap()` to render the
 * `AppComponent` on the page.
 *
 * ```ts
 * class AppModule implements DoBootstrap {
 *   ngDoBootstrap(appRef: ApplicationRef) {
 *     appRef.bootstrap(AppComponent); // Or some other component
 *   }
 * }
 * ```
 *
 * @publicApi
 */
interface DoBootstrap {
    ngDoBootstrap(appRef: ApplicationRef): void;
}

/**
 * Type of the NgModule decorator / constructor function.
 *
 * @publicApi
 */
interface NgModuleDecorator {
    /**
     * Decorator that marks a class as an NgModule and supplies configuration metadata.
     */
    (obj?: NgModule): TypeDecorator;
    new (obj?: NgModule): NgModule;
}
/**
 * Type of the NgModule metadata.
 *
 * @publicApi
 */
interface NgModule {
    /**
     * The set of injectable objects that are available in the injector
     * of this module.
     *
     * @see [Dependency Injection guide](guide/di/dependency-injection
     * @see [NgModule guide](guide/ngmodules/providers)
     *
     * @usageNotes
     *
     * Dependencies whose providers are listed here become available for injection
     * into any component, directive, pipe or service that is a child of this injector.
     * The NgModule used for bootstrapping uses the root injector, and can provide dependencies
     * to any part of the app.
     *
     * A lazy-loaded module has its own injector, typically a child of the app root injector.
     * Lazy-loaded services are scoped to the lazy-loaded module's injector.
     * If a lazy-loaded module also provides the `UserService`, any component created
     * within that module's context (such as by router navigation) gets the local instance
     * of the service, not the instance in the root injector.
     * Components in external modules continue to receive the instance provided by their injectors.
     *
     * ### Example
     *
     * The following example defines a class that is injected in
     * the HelloWorld NgModule:
     *
     * ```ts
     * class Greeter {
     *    greet(name:string) {
     *      return 'Hello ' + name + '!';
     *    }
     * }
     *
     * @NgModule({
     *   providers: [
     *     Greeter
     *   ]
     * })
     * class HelloWorld {
     *   greeter:Greeter;
     *
     *   constructor(greeter:Greeter) {
     *     this.greeter = greeter;
     *   }
     * }
     * ```
     */
    providers?: Array<Provider | EnvironmentProviders>;
    /**
     * The set of components, directives, and pipes (declarables
     * that belong to this module.
     *
     * @usageNotes
     *
     * The set of selectors that are available to a template include those declared here, and
     * those that are exported from imported NgModules.
     *
     * Declarables must belong to exactly one module.
     * The compiler emits an error if you try to declare the same class in more than one module.
     * Be careful not to declare a class that is imported from another module.
     *
     * ### Example
     *
     * The following example allows the CommonModule to use the `NgFor`
     * directive.
     *
     * ```javascript
     * @NgModule({
     *   declarations: [NgFor]
     * })
     * class CommonModule {
     * }
     * ```
     */
    declarations?: Array<Type$1<any> | any[]>;
    /**
     * The set of NgModules whose exported declarables
     * are available to templates in this module.
     *
     * @usageNotes
     *
     * A template can use exported declarables from any
     * imported module, including those from modules that are imported indirectly
     * and re-exported.
     * For example, `ModuleA` imports `ModuleB`, and also exports
     * it, which makes the declarables from `ModuleB` available
     * wherever `ModuleA` is imported.
     *
     * ### Example
     *
     * The following example allows MainModule to use anything exported by
     * `CommonModule`:
     *
     * ```javascript
     * @NgModule({
     *   imports: [CommonModule]
     * })
     * class MainModule {
     * }
     * ```
     *
     */
    imports?: Array<Type$1<any> | ModuleWithProviders<{}> | any[]>;
    /**
     * The set of components, directives, and pipes declared in this
     * NgModule that can be used in the template of any component that is part of an
     * NgModule that imports this NgModule. Exported declarations are the module's public API.
     *
     * A declarable belongs to one and only one NgModule.
     * A module can list another module among its exports, in which case all of that module's
     * public declaration are exported.
     *
     * @usageNotes
     *
     * Declarations are private by default.
     * If this ModuleA does not export UserComponent, then only the components within this
     * ModuleA can use UserComponent.
     *
     * ModuleA can import ModuleB and also export it, making exports from ModuleB
     * available to an NgModule that imports ModuleA.
     *
     * ### Example
     *
     * The following example exports the `NgFor` directive from CommonModule.
     *
     * ```javascript
     * @NgModule({
     *   exports: [NgFor]
     * })
     * class CommonModule {
     * }
     * ```
     */
    exports?: Array<Type$1<any> | any[]>;
    /**
     * The set of components that are bootstrapped when this module is bootstrapped.
     */
    bootstrap?: Array<Type$1<any> | any[]>;
    /**
     * The set of schemas that declare elements to be allowed in the NgModule.
     * Elements and properties that are neither Angular components nor directives
     * must be declared in a schema.
     *
     * Allowed value are `NO_ERRORS_SCHEMA` and `CUSTOM_ELEMENTS_SCHEMA`.
     *
     * @security When using one of `NO_ERRORS_SCHEMA` or `CUSTOM_ELEMENTS_SCHEMA`
     * you must ensure that allowed elements and properties securely escape inputs.
     */
    schemas?: Array<SchemaMetadata | any[]>;
    /**
     * A name or path that uniquely identifies this NgModule in `getNgModuleById`.
     * If left `undefined`, the NgModule is not registered with `getNgModuleById`.
     */
    id?: string;
    /**
     * When present, this module is ignored by the AOT compiler.
     * It remains in distributed code, and the JIT compiler attempts to compile it
     * at run time, in the browser.
     * To ensure the correct behavior, the app must import `@angular/compiler`.
     */
    jit?: true;
}
/**
 * @Annotation
 */
declare const NgModule: NgModuleDecorator;

/**
 * @description Represents the version of Angular
 *
 * @publicApi
 */
declare class Version {
    full: string;
    readonly major: string;
    readonly minor: string;
    readonly patch: string;
    constructor(full: string);
}
/**
 * @publicApi
 */
declare const VERSION: Version;

/**
 * Combination of NgModuleFactory and ComponentFactories.
 *
 * @publicApi
 *
 * @deprecated
 * Ivy JIT mode doesn't require accessing this symbol.
 */
declare class ModuleWithComponentFactories<T> {
    ngModuleFactory: NgModuleFactory$1<T>;
    componentFactories: ComponentFactory$1<any>[];
    constructor(ngModuleFactory: NgModuleFactory$1<T>, componentFactories: ComponentFactory$1<any>[]);
}
/**
 * Low-level service for running the angular compiler during runtime
 * to create {@link ComponentFactory}s, which
 * can later be used to create and render a Component instance.
 *
 * Each `@NgModule` provides an own `Compiler` to its injector,
 * that will use the directives/pipes of the ng module for compilation
 * of components.
 *
 * @publicApi
 *
 * @deprecated
 * Ivy JIT mode doesn't require accessing this symbol.
 */
declare class Compiler {
    /**
     * Compiles the given NgModule and all of its components. All templates of the components
     * have to be inlined.
     */
    compileModuleSync<T>(moduleType: Type$1<T>): NgModuleFactory$1<T>;
    /**
     * Compiles the given NgModule and all of its components
     */
    compileModuleAsync<T>(moduleType: Type$1<T>): Promise<NgModuleFactory$1<T>>;
    /**
     * Same as {@link Compiler#compileModuleSync compileModuleSync} but also creates ComponentFactories for all components.
     */
    compileModuleAndAllComponentsSync<T>(moduleType: Type$1<T>): ModuleWithComponentFactories<T>;
    /**
     * Same as {@link Compiler#compileModuleAsync compileModuleAsync} but also creates ComponentFactories for all components.
     */
    compileModuleAndAllComponentsAsync<T>(moduleType: Type$1<T>): Promise<ModuleWithComponentFactories<T>>;
    /**
     * Clears all caches.
     */
    clearCache(): void;
    /**
     * Clears the cache for the given component/ngModule.
     */
    clearCacheFor(type: Type$1<any>): void;
    /**
     * Returns the id for a given NgModule, if one is defined and known to the compiler.
     */
    getModuleId(moduleType: Type$1<any>): string | undefined;
    static ɵfac: ɵɵFactoryDeclaration<Compiler, never>;
    static ɵprov: ɵɵInjectableDeclaration<Compiler>;
}
/**
 * Options for creating a com   piler.
 *
 * @publicApi
 */
type CompilerOptions = {
    defaultEncapsulation?: ViewEncapsulation$1;
    providers?: StaticProvider[];
    preserveWhitespaces?: boolean;
};
/**
 * Token to provide CompilerOptions in the platform injector.
 *
 * @publicApi
 */
declare const COMPILER_OPTIONS: InjectionToken<CompilerOptions[]>;
/**
 * A factory for creating a Compiler
 *
 * @publicApi
 *
 * @deprecated
 * Ivy JIT mode doesn't require accessing this symbol.
 */
declare abstract class CompilerFactory {
    abstract createCompiler(options?: CompilerOptions[]): Compiler;
}

/**
 * Returns the NgModuleFactory with the given id (specified using [@NgModule.id
 * field](api/core/NgModule#id)), if it exists and has been loaded. Factories for NgModules that do
 * not specify an `id` cannot be retrieved. Throws if an NgModule cannot be found.
 * @publicApi
 * @deprecated Use `getNgModuleById` instead.
 */
declare function getModuleFactory(id: string): NgModuleFactory$1<any>;
/**
 * Returns the NgModule class with the given id (specified using [@NgModule.id
 * field](api/core/NgModule#id)), if it exists and has been loaded. Classes for NgModules that do
 * not specify an `id` cannot be retrieved. Throws if an NgModule cannot be found.
 * @publicApi
 */
declare function getNgModuleById<T>(id: string): Type$1<T>;

/**
 * Represents an embedded template that can be used to instantiate embedded views.
 * To instantiate embedded views based on a template, use the `ViewContainerRef`
 * method `createEmbeddedView()`.
 *
 * Access a `TemplateRef` instance by placing a directive on an `<ng-template>`
 * element (or directive prefixed with `*`). The `TemplateRef` for the embedded view
 * is injected into the constructor of the directive,
 * using the `TemplateRef` token.
 *
 * You can also use a `Query` to find a `TemplateRef` associated with
 * a component or a directive.
 *
 * @see {@link ViewContainerRef}
 *
 * @publicApi
 */
declare abstract class TemplateRef<C> {
    /**
     * The anchor element in the parent view for this embedded view.
     *
     * The data-binding and [injection contexts](guide/di/dependency-injection-context) of embedded
     * views created from this `TemplateRef` inherit from the contexts of this location.
     *
     * Typically new embedded views are attached to the view container of this location, but in
     * advanced use-cases, the view can be attached to a different container while keeping the
     * data-binding and injection context from the original location.
     *
     */
    abstract readonly elementRef: ElementRef;
    /**
     * Instantiates an unattached embedded view based on this template.
     * @param context The data-binding context of the embedded view, as declared
     * in the `<ng-template>` usage.
     * @param injector Injector to be used within the embedded view.
     * @returns The new embedded view object.
     */
    abstract createEmbeddedView(context: C, injector?: Injector): EmbeddedViewRef<C>;
}

/**
 * Represents a container where one or more views can be attached to a component.
 *
 * Can contain *host views* (created by instantiating a
 * component with the `createComponent()` method), and *embedded views*
 * (created by instantiating a `TemplateRef` with the `createEmbeddedView()` method).
 *
 * A view container instance can contain other view containers,
 * creating a view hierarchy.
 *
 * @usageNotes
 *
 * The example below demonstrates how the `createComponent` function can be used
 * to create an instance of a ComponentRef dynamically and attach it to an ApplicationRef,
 * so that it gets included into change detection cycles.
 *
 * Note: the example uses standalone components, but the function can also be used for
 * non-standalone components (declared in an NgModule) as well.
 *
 * ```angular-ts
 * @Component({
 *   standalone: true,
 *   selector: 'dynamic',
 *   template: `<span>This is a content of a dynamic component.</span>`,
 * })
 * class DynamicComponent {
 *   vcr = inject(ViewContainerRef);
 * }
 *
 * @Component({
 *   standalone: true,
 *   selector: 'app',
 *   template: `<main>Hi! This is the main content.</main>`,
 * })
 * class AppComponent {
 *   vcr = inject(ViewContainerRef);
 *
 *   ngAfterViewInit() {
 *     const compRef = this.vcr.createComponent(DynamicComponent);
 *     compRef.changeDetectorRef.detectChanges();
 *   }
 * }
 * ```
 *
 * @see {@link ComponentRef}
 * @see {@link EmbeddedViewRef}
 *
 * @publicApi
 */
declare abstract class ViewContainerRef {
    /**
     * Anchor element that specifies the location of this container in the containing view.
     * Each view container can have only one anchor element, and each anchor element
     * can have only a single view container.
     *
     * Root elements of views attached to this container become siblings of the anchor element in
     * the rendered view.
     *
     * Access the `ViewContainerRef` of an element by placing a `Directive` injected
     * with `ViewContainerRef` on the element, or use a `ViewChild` query.
     *
     * <!-- TODO: rename to anchorElement -->
     */
    abstract get element(): ElementRef;
    /**
     * The dependency injector for this view container.
     */
    abstract get injector(): Injector;
    /** @deprecated No replacement */
    abstract get parentInjector(): Injector;
    /**
     * Destroys all views in this container.
     */
    abstract clear(): void;
    /**
     * Retrieves a view from this container.
     * @param index The 0-based index of the view to retrieve.
     * @returns The `ViewRef` instance, or null if the index is out of range.
     */
    abstract get(index: number): ViewRef$1 | null;
    /**
     * Reports how many views are currently attached to this container.
     * @returns The number of views.
     */
    abstract get length(): number;
    /**
     * Instantiates an embedded view and inserts it
     * into this container.
     * @param templateRef The HTML template that defines the view.
     * @param context The data-binding context of the embedded view, as declared
     * in the `<ng-template>` usage.
     * @param options Extra configuration for the created view. Includes:
     *  * index: The 0-based index at which to insert the new view into this container.
     *           If not specified, appends the new view as the last entry.
     *  * injector: Injector to be used within the embedded view.
     *
     * @returns The `ViewRef` instance for the newly created view.
     */
    abstract createEmbeddedView<C>(templateRef: TemplateRef<C>, context?: C, options?: {
        index?: number;
        injector?: Injector;
    }): EmbeddedViewRef<C>;
    /**
     * Instantiates an embedded view and inserts it
     * into this container.
     * @param templateRef The HTML template that defines the view.
     * @param context The data-binding context of the embedded view, as declared
     * in the `<ng-template>` usage.
     * @param index The 0-based index at which to insert the new view into this container.
     * If not specified, appends the new view as the last entry.
     *
     * @returns The `ViewRef` instance for the newly created view.
     */
    abstract createEmbeddedView<C>(templateRef: TemplateRef<C>, context?: C, index?: number): EmbeddedViewRef<C>;
    /**
     * Instantiates a component and inserts its host view into this view container.
     *
     * @param componentType Component Type to use.
     * @param options An object that contains extra parameters:
     *  * index: the index at which to insert the new component's host view into this container.
     *           If not specified, appends the new view as the last entry.
     *  * injector: the injector to use as the parent for the new component.
     *  * ngModuleRef: an NgModuleRef of the component's NgModule, you should almost always provide
     *                 this to ensure that all expected providers are available for the component
     *                 instantiation.
     *  * environmentInjector: an EnvironmentInjector which will provide the component's environment.
     *                 you should almost always provide this to ensure that all expected providers
     *                 are available for the component instantiation. This option is intended to
     *                 replace the `ngModuleRef` parameter.
     *  * projectableNodes: list of DOM nodes that should be projected through
     *                      [`<ng-content>`](api/core/ng-content) of the new component instance.
     *
     * @returns The new `ComponentRef` which contains the component instance and the host view.
     */
    abstract createComponent<C>(componentType: Type$1<C>, options?: {
        index?: number;
        injector?: Injector;
        ngModuleRef?: NgModuleRef$1<unknown>;
        environmentInjector?: EnvironmentInjector | NgModuleRef$1<unknown>;
        projectableNodes?: Node[][];
    }): ComponentRef$1<C>;
    /**
     * Instantiates a single component and inserts its host view into this container.
     *
     * @param componentFactory Component factory to use.
     * @param index The index at which to insert the new component's host view into this container.
     * If not specified, appends the new view as the last entry.
     * @param injector The injector to use as the parent for the new component.
     * @param projectableNodes List of DOM nodes that should be projected through
     *     [`<ng-content>`](api/core/ng-content) of the new component instance.
     * @param ngModuleRef An instance of the NgModuleRef that represent an NgModule.
     * This information is used to retrieve corresponding NgModule injector.
     *
     * @returns The new `ComponentRef` which contains the component instance and the host view.
     *
     * @deprecated Angular no longer requires component factories to dynamically create components.
     *     Use different signature of the `createComponent` method, which allows passing
     *     Component class directly.
     */
    abstract createComponent<C>(componentFactory: ComponentFactory$1<C>, index?: number, injector?: Injector, projectableNodes?: any[][], environmentInjector?: EnvironmentInjector | NgModuleRef$1<any>): ComponentRef$1<C>;
    /**
     * Inserts a view into this container.
     * @param viewRef The view to insert.
     * @param index The 0-based index at which to insert the view.
     * If not specified, appends the new view as the last entry.
     * @returns The inserted `ViewRef` instance.
     *
     */
    abstract insert(viewRef: ViewRef$1, index?: number): ViewRef$1;
    /**
     * Moves a view to a new location in this container.
     * @param viewRef The view to move.
     * @param index The 0-based index of the new location.
     * @returns The moved `ViewRef` instance.
     */
    abstract move(viewRef: ViewRef$1, currentIndex: number): ViewRef$1;
    /**
     * Returns the index of a view within the current container.
     * @param viewRef The view to query.
     * @returns The 0-based index of the view's position in this container,
     * or `-1` if this container doesn't contain the view.
     */
    abstract indexOf(viewRef: ViewRef$1): number;
    /**
     * Destroys a view attached to this container
     * @param index The 0-based index of the view to destroy.
     * If not specified, the last view in the container is removed.
     */
    abstract remove(index?: number): void;
    /**
     * Detaches a view from this container without destroying it.
     * Use along with `insert()` to move a view within the current container.
     * @param index The 0-based index of the view to detach.
     * If not specified, the last view in the container is detached.
     */
    abstract detach(index?: number): ViewRef$1 | null;
}

/**
 * The Angular platform is the entry point for Angular on a web page.
 * Each page has exactly one platform. Services (such as reflection) which are common
 * to every Angular application running on the page are bound in its scope.
 * A page's platform is initialized implicitly when a platform is created using a platform
 * factory such as `PlatformBrowser`, or explicitly by calling the `createPlatform()` function.
 *
 * @publicApi
 */
declare class PlatformRef {
    private _injector;
    private _modules;
    private _destroyListeners;
    private _destroyed;
    /**
     * Creates an instance of an `@NgModule` for the given platform.
     *
     * @deprecated Passing NgModule factories as the `PlatformRef.bootstrapModuleFactory` function
     *     argument is deprecated. Use the `PlatformRef.bootstrapModule` API instead.
     */
    bootstrapModuleFactory<M>(moduleFactory: NgModuleFactory$1<M>, options?: BootstrapOptions): Promise<NgModuleRef$1<M>>;
    /**
     * Creates an instance of an `@NgModule` for a given platform.
     *
     * @usageNotes
     * ### Simple Example
     *
     * ```ts
     * @NgModule({
     *   imports: [BrowserModule]
     * })
     * class MyModule {}
     *
     * let moduleRef = platformBrowser().bootstrapModule(MyModule);
     * ```
     *
     */
    bootstrapModule<M>(moduleType: Type$1<M>, compilerOptions?: (CompilerOptions & BootstrapOptions) | Array<CompilerOptions & BootstrapOptions>): Promise<NgModuleRef$1<M>>;
    /**
     * Registers a listener to be called when the platform is destroyed.
     */
    onDestroy(callback: () => void): void;
    /**
     * Retrieves the platform {@link Injector}, which is the parent injector for
     * every Angular application on the page and provides singleton providers.
     */
    get injector(): Injector;
    /**
     * Destroys the current Angular platform and all Angular applications on the page.
     * Destroys all modules and listeners registered with the platform.
     */
    destroy(): void;
    /**
     * Indicates whether this instance was destroyed.
     */
    get destroyed(): boolean;
    static ɵfac: ɵɵFactoryDeclaration<PlatformRef, never>;
    static ɵprov: ɵɵInjectableDeclaration<PlatformRef>;
}

/**
 * Internal token to indicate whether having multiple bootstrapped platform should be allowed (only
 * one bootstrapped platform is allowed by default). This token helps to support SSR scenarios.
 */
declare const ALLOW_MULTIPLE_PLATFORMS: InjectionToken<boolean>;
/**
 * Creates a platform.
 * Platforms must be created on launch using this function.
 *
 * @publicApi
 */
declare function createPlatform(injector: Injector): PlatformRef;
/**
 * Creates a factory for a platform. Can be used to provide or override `Providers` specific to
 * your application's runtime needs, such as `PLATFORM_INITIALIZER` and `PLATFORM_ID`.
 * @param parentPlatformFactory Another platform factory to modify. Allows you to compose factories
 * to build up configurations that might be required by different libraries or parts of the
 * application.
 * @param name Identifies the new platform factory.
 * @param providers A set of dependency providers for platforms created with the new factory.
 *
 * @publicApi
 */
declare function createPlatformFactory(parentPlatformFactory: ((extraProviders?: StaticProvider[]) => PlatformRef) | null, name: string, providers?: StaticProvider[]): (extraProviders?: StaticProvider[]) => PlatformRef;
/**
 * Checks that there is currently a platform that contains the given token as a provider.
 *
 * @publicApi
 */
declare function assertPlatform(requiredToken: any): PlatformRef;
/**
 * Returns the current platform.
 *
 * @publicApi
 */
declare function getPlatform(): PlatformRef | null;
/**
 * Destroys the current Angular platform and all Angular applications on the page.
 * Destroys all modules and listeners registered with the platform.
 *
 * @publicApi
 */
declare function destroyPlatform(): void;
/**
 * The goal of this function is to bootstrap a platform injector,
 * but avoid referencing `PlatformRef` class.
 * This function is needed for bootstrapping a Standalone Component.
 */
declare function createOrReusePlatformInjector(providers?: StaticProvider[]): Injector;
/**
 * @description
 * This function is used to provide initialization functions that will be executed upon
 * initialization of the platform injector.
 *
 * Note that the provided initializer is run in the injection context.
 *
 * Previously, this was achieved using the `PLATFORM_INITIALIZER` token which is now deprecated.
 *
 * @see {@link PLATFORM_INITIALIZER}
 *
 * @publicApi
 */
declare function providePlatformInitializer(initializerFn: () => void): EnvironmentProviders;

/**
 * Internal token used to verify that `provideZoneChangeDetection` is not used
 * with the bootstrapModule API.
 */
declare const PROVIDED_NG_ZONE: InjectionToken<boolean>;
declare function internalProvideZoneChangeDetection({ ngZoneFactory, ignoreChangesOutsideZone, scheduleInRootZone, }: {
    ngZoneFactory?: () => NgZone;
    ignoreChangesOutsideZone?: boolean;
    scheduleInRootZone?: boolean;
}): StaticProvider[];
/**
 * Provides `NgZone`-based change detection for the application bootstrapped using
 * `bootstrapApplication`.
 *
 * `NgZone` is already provided in applications by default. This provider allows you to configure
 * options like `eventCoalescing` in the `NgZone`.
 * This provider is not available for `platformBrowser().bootstrapModule`, which uses
 * `BootstrapOptions` instead.
 *
 * @usageNotes
 * ```ts
 * bootstrapApplication(MyApp, {providers: [
 *   provideZoneChangeDetection({eventCoalescing: true}),
 * ]});
 * ```
 *
 * @publicApi
 * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}
 * @see {@link NgZoneOptions}
 */
declare function provideZoneChangeDetection(options?: NgZoneOptions): EnvironmentProviders;
/**
 * Used to configure event and run coalescing with `provideZoneChangeDetection`.
 *
 * @publicApi
 *
 * @see {@link provideZoneChangeDetection}
 */
interface NgZoneOptions {
    /**
     * Optionally specify coalescing event change detections or not.
     * Consider the following case.
     *
     * ```html
     * <div (click)="doSomething()">
     *   <button (click)="doSomethingElse()"></button>
     * </div>
     * ```
     *
     * When button is clicked, because of the event bubbling, both
     * event handlers will be called and 2 change detections will be
     * triggered. We can coalesce such kind of events to trigger
     * change detection only once.
     *
     * By default, this option is set to false, meaning events will
     * not be coalesced, and change detection will be triggered multiple times.
     * If this option is set to true, change detection will be triggered
     * once in the scenario described above.
     */
    eventCoalescing?: boolean;
    /**
     * Optionally specify if `NgZone#run()` method invocations should be coalesced
     * into a single change detection.
     *
     * Consider the following case.
     * ```ts
     * for (let i = 0; i < 10; i ++) {
     *   ngZone.run(() => {
     *     // do something
     *   });
     * }
     * ```
     *
     * This case triggers the change detection multiple times.
     * With ngZoneRunCoalescing options, all change detections in an event loop trigger only once.
     * In addition, the change detection executes in requestAnimation.
     *
     */
    runCoalescing?: boolean;
    /**
     * When false, change detection is scheduled when Angular receives
     * a clear indication that templates need to be refreshed. This includes:
     *
     * - calling `ChangeDetectorRef.markForCheck`
     * - calling `ComponentRef.setInput`
     * - updating a signal that is read in a template
     * - attaching a view that is marked dirty
     * - removing a view
     * - registering a render hook (templates are only refreshed if render hooks do one of the above)
     *
     * @deprecated This option was introduced out of caution as a way for developers to opt out of the
     *    new behavior in v18 which schedule change detection for the above events when they occur
     *    outside the Zone. After monitoring the results post-release, we have determined that this
     *    feature is working as desired and do not believe it should ever be disabled by setting
     *    this option to `true`.
     */
    ignoreChangesOutsideZone?: boolean;
}

declare class ChangeDetectionSchedulerImpl implements ChangeDetectionScheduler {
    private readonly appRef;
    private readonly taskService;
    private readonly ngZone;
    private readonly zonelessEnabled;
    private readonly tracing;
    private readonly disableScheduling;
    private readonly zoneIsDefined;
    private readonly schedulerTickApplyArgs;
    private readonly subscriptions;
    private readonly angularZoneId;
    private readonly scheduleInRootZone;
    private cancelScheduledCallback;
    private useMicrotaskScheduler;
    runningTick: boolean;
    pendingRenderTaskId: number | null;
    constructor();
    notify(source: NotificationSource): void;
    private shouldScheduleTick;
    /**
     * Calls ApplicationRef._tick inside the `NgZone`.
     *
     * Calling `tick` directly runs change detection and cancels any change detection that had been
     * scheduled previously.
     *
     * @param shouldRefreshViews Passed directly to `ApplicationRef._tick` and skips straight to
     *     render hooks when `false`.
     */
    private tick;
    ngOnDestroy(): void;
    private cleanup;
    static ɵfac: ɵɵFactoryDeclaration<ChangeDetectionSchedulerImpl, never>;
    static ɵprov: ɵɵInjectableDeclaration<ChangeDetectionSchedulerImpl>;
}
/**
 * Provides change detection without ZoneJS for the application bootstrapped using
 * `bootstrapApplication`.
 *
 * This function allows you to configure the application to not use the state/state changes of
 * ZoneJS to schedule change detection in the application. This will work when ZoneJS is not present
 * on the page at all or if it exists because something else is using it (either another Angular
 * application which uses ZoneJS for scheduling or some other library that relies on ZoneJS).
 *
 * This can also be added to the `TestBed` providers to configure the test environment to more
 * closely match production behavior. This will help give higher confidence that components are
 * compatible with zoneless change detection.
 *
 * ZoneJS uses browser events to trigger change detection. When using this provider, Angular will
 * instead use Angular APIs to schedule change detection. These APIs include:
 *
 * - `ChangeDetectorRef.markForCheck`
 * - `ComponentRef.setInput`
 * - updating a signal that is read in a template
 * - when bound host or template listeners are triggered
 * - attaching a view that was marked dirty by one of the above
 * - removing a view
 * - registering a render hook (templates are only refreshed if render hooks do one of the above)
 *
 * @usageNotes
 * ```ts
 * bootstrapApplication(MyApp, {providers: [
 *   provideExperimentalZonelessChangeDetection(),
 * ]});
 * ```
 *
 * This API is experimental. Neither the shape, nor the underlying behavior is stable and can change
 * in patch versions. There are known feature gaps and API ergonomic considerations. We will iterate
 * on the exact API based on the feedback and our understanding of the problem and solution space.
 *
 * @publicApi
 * @experimental
 * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}
 */
declare function provideExperimentalZonelessChangeDetection(): EnvironmentProviders;

/**
 * Internal implementation of the pending tasks service.
 */
declare class PendingTasksInternal implements OnDestroy {
    private taskId;
    private pendingTasks;
    private get _hasPendingTasks();
    hasPendingTasks: BehaviorSubject<boolean>;
    add(): number;
    has(taskId: number): boolean;
    remove(taskId: number): void;
    ngOnDestroy(): void;
    /** @nocollapse */
    static ɵprov: unknown;
}
/**
 * Service that keeps track of pending tasks contributing to the stableness of Angular
 * application. While several existing Angular services (ex.: `HttpClient`) will internally manage
 * tasks influencing stability, this API gives control over stability to library and application
 * developers for specific cases not covered by Angular internals.
 *
 * The concept of stability comes into play in several important scenarios:
 * - SSR process needs to wait for the application stability before serializing and sending rendered
 * HTML;
 * - tests might want to delay assertions until the application becomes stable;
 *
 * @usageNotes
 * ```ts
 * const pendingTasks = inject(PendingTasks);
 * const taskCleanup = pendingTasks.add();
 * // do work that should block application's stability and then:
 * taskCleanup();
 * ```
 *
 * @publicApi
 * @developerPreview
 */
declare class PendingTasks {
    private internalPendingTasks;
    private scheduler;
    /**
     * Adds a new task that should block application's stability.
     * @returns A cleanup function that removes a task when called.
     */
    add(): () => void;
    /**
     * Runs an asynchronous function and blocks the application's stability until the function completes.
     *
     * ```ts
     * pendingTasks.run(async () => {
     *   const userData = await fetch('/api/user');
     *   this.userData.set(userData);
     * });
     * ```
     *
     * Application stability is at least delayed until the next tick after the `run` method resolves
     * so it is safe to make additional updates to application state that would require UI synchronization:
     *
     * ```ts
     * const userData = await pendingTasks.run(() => fetch('/api/user'));
     * this.userData.set(userData);
     * ```
     *
     * @param fn The asynchronous function to execute
     */
    run<T>(fn: () => Promise<T>): Promise<T>;
    /** @nocollapse */
    static ɵprov: unknown;
}

/**
 * Enables directive matching on elements.
 *
 *  * Example:
 * ```html
 * <my-comp my-directive>
 *   Should match component / directive.
 * </my-comp>
 * <div ngNonBindable>
 *   <!-- ɵɵdisableBindings() -->
 *   <my-comp my-directive>
 *     Should not match component / directive because we are in ngNonBindable.
 *   </my-comp>
 *   <!-- ɵɵenableBindings() -->
 * </div>
 * ```
 *
 * @codeGenApi
 */
declare function ɵɵenableBindings(): void;
/**
 * Disables directive matching on element.
 *
 *  * Example:
 * ```html
 * <my-comp my-directive>
 *   Should match component / directive.
 * </my-comp>
 * <div ngNonBindable>
 *   <!-- ɵɵdisableBindings() -->
 *   <my-comp my-directive>
 *     Should not match component / directive because we are in ngNonBindable.
 *   </my-comp>
 *   <!-- ɵɵenableBindings() -->
 * </div>
 * ```
 *
 * @codeGenApi
 */
declare function ɵɵdisableBindings(): void;
/**
 * Restores `contextViewData` to the given OpaqueViewState instance.
 *
 * Used in conjunction with the getCurrentView() instruction to save a snapshot
 * of the current view and restore it when listeners are invoked. This allows
 * walking the declaration view tree in listeners to get vars from parent views.
 *
 * @param viewToRestore The OpaqueViewState instance to restore.
 * @returns Context of the restored OpaqueViewState instance.
 *
 * @codeGenApi
 */
declare function ɵɵrestoreView<T = any>(viewToRestore: OpaqueViewState): T;
/**
 * Clears the view set in `ɵɵrestoreView` from memory. Returns the passed in
 * value so that it can be used as a return value of an instruction.
 *
 * @codeGenApi
 */
declare function ɵɵresetView<T>(value?: T): T | undefined;
/**
 * Sets the namespace used to create elements to `'http://www.w3.org/2000/svg'` in global state.
 *
 * @codeGenApi
 */
declare function ɵɵnamespaceSVG(): void;
/**
 * Sets the namespace used to create elements to `'http://www.w3.org/1998/MathML/'` in global state.
 *
 * @codeGenApi
 */
declare function ɵɵnamespaceMathML(): void;
/**
 * Sets the namespace used to create elements to `null`, which forces element creation to use
 * `createElement` rather than `createElementNS`.
 *
 * @codeGenApi
 */
declare function ɵɵnamespaceHTML(): void;

/**
 * Used to periodically verify no expressions have changed after they were checked.
 *
 * @param options Used to configure when the check will execute.
 *   - `interval` will periodically run exhaustive `checkNoChanges` on application views
 *   - `useNgZoneOnStable` will use ZoneJS to determine when change detection might have run
 *      in an application using ZoneJS to drive change detection. When the `NgZone.onStable` would
 *      have emitted, all views attached to the `ApplicationRef` are checked for changes.
 *   - 'exhaustive' means that all views attached to `ApplicationRef` and all the descendants of those views will be
 *     checked for changes (excluding those subtrees which are detached via `ChangeDetectorRef.detach()`).
 *     This is useful because the check that runs after regular change detection does not work for components using `ChangeDetectionStrategy.OnPush`.
 *     This check is will surface any existing errors hidden by `OnPush` components. By default, this check is exhaustive
 *     and will always check all views, regardless of their "dirty" state and `ChangeDetectionStrategy`.
 *
 * When the `useNgZoneOnStable` option is `true`, this function will provide its own `NgZone` implementation and needs
 * to come after any other `NgZone` provider, including `provideZoneChangeDetection()` and `provideExperimentalZonelessChangeDetection()`.
 *
 * @experimental
 * @publicApi
 */
declare function provideExperimentalCheckNoChangesForDebug(options: {
    interval?: number;
    useNgZoneOnStable?: boolean;
    exhaustive?: boolean;
}): _angular_core.EnvironmentProviders;

/**
 * Returns whether Angular is in development mode.
 *
 * By default, this is true, unless `enableProdMode` is invoked prior to calling this method or the
 * application is built using the Angular CLI with the `optimization` option.
 * @see {@link /cli/build ng build}
 *
 * @publicApi
 */
declare function isDevMode(): boolean;
/**
 * Disable Angular's development mode, which turns off assertions and other
 * checks within the framework.
 *
 * One important assertion this disables verifies that a change detection pass
 * does not result in additional changes to any bindings (also known as
 * unidirectional data flow).
 *
 * Using this method is discouraged as the Angular CLI will set production mode when using the
 * `optimization` option.
 * @see {@link /cli/build ng build}
 *
 * @publicApi
 */
declare function enableProdMode(): void;

/**
 * A DI token representing a string ID, used
 * primarily for prefixing application attributes and CSS styles when
 * {@link ViewEncapsulation#Emulated} is being used.
 *
 * The token is needed in cases when multiple applications are bootstrapped on a page
 * (for example, using `bootstrapApplication` calls). In this case, ensure that those applications
 * have different `APP_ID` value setup. For example:
 *
 * ```ts
 * bootstrapApplication(ComponentA, {
 *   providers: [
 *     { provide: APP_ID, useValue: 'app-a' },
 *     // ... other providers ...
 *   ]
 * });
 *
 * bootstrapApplication(ComponentB, {
 *   providers: [
 *     { provide: APP_ID, useValue: 'app-b' },
 *     // ... other providers ...
 *   ]
 * });
 * ```
 *
 * By default, when there is only one application bootstrapped, you don't need to provide the
 * `APP_ID` token (the `ng` will be used as an app ID).
 *
 * @publicApi
 */
declare const APP_ID: InjectionToken<string>;
/**
 * A function that is executed when a platform is initialized.
 *
 * @deprecated from v19.0.0, use providePlatformInitializer instead
 *
 * @see {@link providePlatformInitializer}
 *
 * @publicApi
 */
declare const PLATFORM_INITIALIZER: InjectionToken<readonly (() => void)[]>;
/**
 * A token that indicates an opaque platform ID.
 * @publicApi
 */
declare const PLATFORM_ID: InjectionToken<Object>;
/**
 * A DI token that indicates the root directory of
 * the application
 * @publicApi
 * @deprecated
 */
declare const PACKAGE_ROOT_URL: InjectionToken<string>;
/**
 * A [DI token](api/core/InjectionToken) that indicates which animations
 * module has been loaded.
 * @publicApi
 */
declare const ANIMATION_MODULE_TYPE: InjectionToken<"NoopAnimations" | "BrowserAnimations">;
/**
 * Token used to configure the [Content Security Policy](https://web.dev/strict-csp/) nonce that
 * Angular will apply when inserting inline styles. If not provided, Angular will look up its value
 * from the `ngCspNonce` attribute of the application root node.
 *
 * @publicApi
 */
declare const CSP_NONCE: InjectionToken<string | null>;
/**
 * A configuration object for the image-related options. Contains:
 * - breakpoints: An array of integer breakpoints used to generate
 *      srcsets for responsive images.
 * - disableImageSizeWarning: A boolean value. Setting this to true will
 *      disable console warnings about oversized images.
 * - disableImageLazyLoadWarning: A boolean value. Setting this to true will
 *      disable console warnings about LCP images configured with `loading="lazy"`.
 * Learn more about the responsive image configuration in [the NgOptimizedImage
 * guide](guide/image-optimization).
 * Learn more about image warning options in [the related error page](errors/NG0913).
 * @publicApi
 */
type ImageConfig = {
    breakpoints?: number[];
    placeholderResolution?: number;
    disableImageSizeWarning?: boolean;
    disableImageLazyLoadWarning?: boolean;
};
declare const IMAGE_CONFIG_DEFAULTS: ImageConfig;
/**
 * Injection token that configures the image optimized image functionality.
 * See {@link ImageConfig} for additional information about parameters that
 * can be used.
 *
 * @see {@link NgOptimizedImage}
 * @see {@link ImageConfig}
 * @publicApi
 */
declare const IMAGE_CONFIG: InjectionToken<ImageConfig>;

/**
 * A DI token that you can use to provide
 * one or more initialization functions.
 *
 * The provided functions are injected at application startup and executed during
 * app initialization. If any of these functions returns a Promise or an Observable, initialization
 * does not complete until the Promise is resolved or the Observable is completed.
 *
 * You can, for example, create a factory function that loads language data
 * or an external configuration, and provide that function to the `APP_INITIALIZER` token.
 * The function is executed during the application bootstrap process,
 * and the needed data is available on startup.
 *
 * Note that the provided initializer is run in the injection context.
 *
 * @deprecated from v19.0.0, use provideAppInitializer instead
 *
 * @see {@link ApplicationInitStatus}
 * @see {@link provideAppInitializer}
 *
 * @usageNotes
 *
 * The following example illustrates how to configure a multi-provider using `APP_INITIALIZER` token
 * and a function returning a promise.
 * ### Example with NgModule-based application
 * ```ts
 *  function initializeApp(): Promise<any> {
 *    const http = inject(HttpClient);
 *    return firstValueFrom(
 *      http
 *        .get("https://someUrl.com/api/user")
 *        .pipe(tap(user => { ... }))
 *    );
 *  }
 *
 *  @NgModule({
 *   imports: [BrowserModule],
 *   declarations: [AppComponent],
 *   bootstrap: [AppComponent],
 *   providers: [{
 *     provide: APP_INITIALIZER,
 *     useValue: initializeApp,
 *     multi: true,
 *    }]
 *   })
 *  export class AppModule {}
 * ```
 *
 * ### Example with standalone application
 * ```ts
 * function initializeApp() {
 *   const http = inject(HttpClient);
 *   return firstValueFrom(
 *     http
 *       .get("https://someUrl.com/api/user")
 *       .pipe(tap(user => { ... }))
 *   );
 * }
 *
 * bootstrapApplication(App, {
 *   providers: [
 *     provideHttpClient(),
 *     {
 *       provide: APP_INITIALIZER,
 *       useValue: initializeApp,
 *       multi: true,
 *     },
 *   ],
 * });

 * ```
 *
 *
 * It's also possible to configure a multi-provider using `APP_INITIALIZER` token and a function
 * returning an observable, see an example below. Note: the `HttpClient` in this example is used for
 * demo purposes to illustrate how the factory function can work with other providers available
 * through DI.
 *
 * ### Example with NgModule-based application
 * ```ts
 * function initializeApp() {
 *   const http = inject(HttpClient);
 *   return firstValueFrom(
 *     http
 *       .get("https://someUrl.com/api/user")
 *       .pipe(tap(user => { ... }))
 *   );
 * }
 *
 * @NgModule({
 *   imports: [BrowserModule, HttpClientModule],
 *   declarations: [AppComponent],
 *   bootstrap: [AppComponent],
 *   providers: [{
 *     provide: APP_INITIALIZER,
 *     useValue: initializeApp,
 *     multi: true,
 *   }]
 * })
 * export class AppModule {}
 * ```
 *
 * ### Example with standalone application
 * ```ts
 * function initializeApp() {
 *   const http = inject(HttpClient);
 *   return firstValueFrom(
 *     http
 *       .get("https://someUrl.com/api/user")
 *       .pipe(tap(user => { ... }))
 *   );
 * }
 *
 * bootstrapApplication(App, {
 *   providers: [
 *     provideHttpClient(),
 *     {
 *       provide: APP_INITIALIZER,
 *       useValue: initializeApp,
 *       multi: true,
 *     },
 *   ],
 * });
 * ```
 *
 * @publicApi
 */
declare const APP_INITIALIZER: InjectionToken<readonly (() => Observable<unknown> | Promise<unknown> | void)[]>;
/**
 * @description
 * The provided function is injected at application startup and executed during
 * app initialization. If the function returns a Promise or an Observable, initialization
 * does not complete until the Promise is resolved or the Observable is completed.
 *
 * You can, for example, create a function that loads language data
 * or an external configuration, and provide that function using `provideAppInitializer()`.
 * The function is executed during the application bootstrap process,
 * and the needed data is available on startup.
 *
 * Note that the provided initializer is run in the injection context.
 *
 * Previously, this was achieved using the `APP_INITIALIZER` token which is now deprecated.
 *
 * @see {@link APP_INITIALIZER}
 *
 * @usageNotes
 * The following example illustrates how to configure an initialization function using
 * `provideAppInitializer()`
 * ```ts
 * bootstrapApplication(App, {
 *   providers: [
 *     provideAppInitializer(() => {
 *       const http = inject(HttpClient);
 *       return firstValueFrom(
 *         http
 *           .get("https://someUrl.com/api/user")
 *           .pipe(tap(user => { ... }))
 *       );
 *     }),
 *     provideHttpClient(),
 *   ],
 * });
 * ```
 *
 * @publicApi
 */
declare function provideAppInitializer(initializerFn: () => Observable<unknown> | Promise<unknown> | void): EnvironmentProviders;
/**
 * A class that reflects the state of running {@link APP_INITIALIZER} functions.
 *
 * @publicApi
 */
declare class ApplicationInitStatus {
    private resolve;
    private reject;
    private initialized;
    readonly done = false;
    readonly donePromise: Promise<any>;
    private readonly appInits;
    private readonly injector;
    constructor();
    static ɵfac: ɵɵFactoryDeclaration<ApplicationInitStatus, never>;
    static ɵprov: ɵɵInjectableDeclaration<ApplicationInitStatus>;
}

/**
 * @publicApi
 */
declare class DebugEventListener {
    name: string;
    callback: Function;
    constructor(name: string, callback: Function);
}
/**
 * @publicApi
 */
declare function asNativeElements(debugEls: DebugElement[]): any;
/**
 * @publicApi
 */
declare class DebugNode {
    /**
     * The underlying DOM node.
     */
    readonly nativeNode: any;
    constructor(nativeNode: Node);
    /**
     * The `DebugElement` parent. Will be `null` if this is the root element.
     */
    get parent(): DebugElement | null;
    /**
     * The host dependency injector. For example, the root element's component instance injector.
     */
    get injector(): Injector;
    /**
     * The element's own component instance, if it has one.
     */
    get componentInstance(): any;
    /**
     * An object that provides parent context for this element. Often an ancestor component instance
     * that governs this element.
     *
     * When an element is repeated within *ngFor, the context is an `NgForOf` whose `$implicit`
     * property is the value of the row instance value. For example, the `hero` in `*ngFor="let hero
     * of heroes"`.
     */
    get context(): any;
    /**
     * The callbacks attached to the component's @Output properties and/or the element's event
     * properties.
     */
    get listeners(): DebugEventListener[];
    /**
     * Dictionary of objects associated with template local variables (e.g. #foo), keyed by the local
     * variable name.
     */
    get references(): {
        [key: string]: any;
    };
    /**
     * This component's injector lookup tokens. Includes the component itself plus the tokens that the
     * component lists in its providers metadata.
     */
    get providerTokens(): any[];
}
/**
 * @publicApi
 *
 * @see [Component testing scenarios](guide/testing/components-scenarios)
 * @see [Basics of testing components](guide/testing/components-basics)
 * @see [Testing utility APIs](guide/testing/utility-apis)
 */
declare class DebugElement extends DebugNode {
    constructor(nativeNode: Element);
    /**
     * The underlying DOM element at the root of the component.
     */
    get nativeElement(): any;
    /**
     * The element tag name, if it is an element.
     */
    get name(): string;
    /**
     *  Gets a map of property names to property values for an element.
     *
     *  This map includes:
     *  - Regular property bindings (e.g. `[id]="id"`)
     *  - Host property bindings (e.g. `host: { '[id]': "id" }`)
     *  - Interpolated property bindings (e.g. `id="{{ value }}")
     *
     *  It does not include:
     *  - input property bindings (e.g. `[myCustomInput]="value"`)
     *  - attribute bindings (e.g. `[attr.role]="menu"`)
     */
    get properties(): {
        [key: string]: any;
    };
    /**
     *  A map of attribute names to attribute values for an element.
     */
    get attributes(): {
        [key: string]: string | null;
    };
    /**
     * The inline styles of the DOM element.
     */
    get styles(): {
        [key: string]: string | null;
    };
    /**
     * A map containing the class names on the element as keys.
     *
     * This map is derived from the `className` property of the DOM element.
     *
     * Note: The values of this object will always be `true`. The class key will not appear in the KV
     * object if it does not exist on the element.
     *
     * @see [Element.className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className)
     */
    get classes(): {
        [key: string]: boolean;
    };
    /**
     * The `childNodes` of the DOM element as a `DebugNode` array.
     *
     * @see [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes)
     */
    get childNodes(): DebugNode[];
    /**
     * The immediate `DebugElement` children. Walk the tree by descending through `children`.
     */
    get children(): DebugElement[];
    /**
     * @returns the first `DebugElement` that matches the predicate at any depth in the subtree.
     */
    query(predicate: Predicate<DebugElement>): DebugElement;
    /**
     * @returns All `DebugElement` matches for the predicate at any depth in the subtree.
     */
    queryAll(predicate: Predicate<DebugElement>): DebugElement[];
    /**
     * @returns All `DebugNode` matches for the predicate at any depth in the subtree.
     */
    queryAllNodes(predicate: Predicate<DebugNode>): DebugNode[];
    /**
     * Triggers the event by its name if there is a corresponding listener in the element's
     * `listeners` collection.
     *
     * If the event lacks a listener or there's some other problem, consider
     * calling `nativeElement.dispatchEvent(eventObject)`.
     *
     * @param eventName The name of the event to trigger
     * @param eventObj The _event object_ expected by the handler
     *
     * @see [Testing components scenarios](guide/testing/components-scenarios#trigger-event-handler)
     */
    triggerEventHandler(eventName: string, eventObj?: any): void;
}
/**
 * @publicApi
 */
declare function getDebugNode(nativeNode: any): DebugNode | null;
/**
 * A boolean-valued function over a value, possibly including context information
 * regarding that value's position in an array.
 *
 * @publicApi
 */
type Predicate<T> = (value: T) => boolean;

/**
 * Testability API.
 * `declare` keyword causes tsickle to generate externs, so these methods are
 * not renamed by Closure Compiler.
 * @publicApi
 */
declare interface PublicTestability {
    isStable(): boolean;
    whenStable(callback: Function, timeout?: number, updateCallback?: Function): void;
    findProviders(using: any, provider: string, exactMatch: boolean): any[];
}
/**
 * Internal injection token that can used to access an instance of a Testability class.
 *
 * This token acts as a bridge between the core bootstrap code and the `Testability` class. This is
 * needed to ensure that there are no direct references to the `Testability` class, so it can be
 * tree-shaken away (if not referenced). For the environments/setups when the `Testability` class
 * should be available, this token is used to add a provider that references the `Testability`
 * class. Otherwise, only this token is retained in a bundle, but the `Testability` class is not.
 */
declare const TESTABILITY: InjectionToken<Testability>;
/**
 * Internal injection token to retrieve Testability getter class instance.
 */
declare const TESTABILITY_GETTER: InjectionToken<GetTestability>;
/**
 * The Testability service provides testing hooks that can be accessed from
 * the browser.
 *
 * Angular applications bootstrapped using an NgModule (via `@NgModule.bootstrap` field) will also
 * instantiate Testability by default (in both development and production modes).
 *
 * For applications bootstrapped using the `bootstrapApplication` function, Testability is not
 * included by default. You can include it into your applications by getting the list of necessary
 * providers using the `provideProtractorTestingSupport()` function and adding them into the
 * `options.providers` array. Example:
 *
 * ```ts
 * import {provideProtractorTestingSupport} from '@angular/platform-browser';
 *
 * await bootstrapApplication(RootComponent, providers: [provideProtractorTestingSupport()]);
 * ```
 *
 * @publicApi
 */
declare class Testability implements PublicTestability {
    private _ngZone;
    private registry;
    private _isZoneStable;
    private _callbacks;
    private _taskTrackingZone;
    private _destroyRef?;
    constructor(_ngZone: NgZone, registry: TestabilityRegistry, testabilityGetter: GetTestability);
    private _watchAngularEvents;
    /**
     * Whether an associated application is stable
     */
    isStable(): boolean;
    private _runCallbacksIfReady;
    private getPendingTasks;
    private addCallback;
    /**
     * Wait for the application to be stable with a timeout. If the timeout is reached before that
     * happens, the callback receives a list of the macro tasks that were pending, otherwise null.
     *
     * @param doneCb The callback to invoke when Angular is stable or the timeout expires
     *    whichever comes first.
     * @param timeout Optional. The maximum time to wait for Angular to become stable. If not
     *    specified, whenStable() will wait forever.
     * @param updateCb Optional. If specified, this callback will be invoked whenever the set of
     *    pending macrotasks changes. If this callback returns true doneCb will not be invoked
     *    and no further updates will be issued.
     */
    whenStable(doneCb: Function, timeout?: number, updateCb?: Function): void;
    /**
     * Find providers by name
     * @param using The root element to search from
     * @param provider The name of binding variable
     * @param exactMatch Whether using exactMatch
     */
    findProviders(using: any, provider: string, exactMatch: boolean): any[];
    static ɵfac: ɵɵFactoryDeclaration<Testability, never>;
    static ɵprov: ɵɵInjectableDeclaration<Testability>;
}
/**
 * A global registry of {@link Testability} instances for specific elements.
 * @publicApi
 */
declare class TestabilityRegistry {
    /**
     * Registers an application with a testability hook so that it can be tracked
     * @param token token of application, root element
     * @param testability Testability hook
     */
    registerApplication(token: any, testability: Testability): void;
    /**
     * Unregisters an application.
     * @param token token of application, root element
     */
    unregisterApplication(token: any): void;
    /**
     * Unregisters all applications
     */
    unregisterAllApplications(): void;
    /**
     * Get a testability hook associated with the application
     * @param elem root element
     */
    getTestability(elem: any): Testability | null;
    /**
     * Get all registered testabilities
     */
    getAllTestabilities(): Testability[];
    /**
     * Get all registered applications(root elements)
     */
    getAllRootElements(): any[];
    /**
     * Find testability of a node in the Tree
     * @param elem node
     * @param findInAncestors whether finding testability in ancestors if testability was not found in
     * current node
     */
    findTestabilityInTree(elem: Node, findInAncestors?: boolean): Testability | null;
    static ɵfac: ɵɵFactoryDeclaration<TestabilityRegistry, never>;
    static ɵprov: ɵɵInjectableDeclaration<TestabilityRegistry>;
}
/**
 * Adapter interface for retrieving the `Testability` service associated for a
 * particular context.
 *
 * @publicApi
 */
interface GetTestability {
    addToWindow(registry: TestabilityRegistry): void;
    findTestabilityInTree(registry: TestabilityRegistry, elem: any, findInAncestors: boolean): Testability | null;
}
/**
 * Set the {@link GetTestability} implementation used by the Angular testing framework.
 * @publicApi
 */
declare function setTestabilityGetter(getter: GetTestability): void;

/**
 * This platform has to be included in any other platform
 *
 * @publicApi
 */
declare const platformCore: (extraProviders?: StaticProvider[] | undefined) => PlatformRef;

/**
 * Provide this token to set the locale of your application.
 * It is used for i18n extraction, by i18n pipes (DatePipe, I18nPluralPipe, CurrencyPipe,
 * DecimalPipe and PercentPipe) and by ICU expressions.
 *
 * See the [i18n guide](guide/i18n/locale-id) for more information.
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import { LOCALE_ID } from '@angular/core';
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   providers: [{provide: LOCALE_ID, useValue: 'en-US' }]
 * });
 * ```
 *
 * @publicApi
 */
declare const LOCALE_ID: InjectionToken<string>;
/**
 * Provide this token to set the default currency code your application uses for
 * CurrencyPipe when there is no currency code passed into it. This is only used by
 * CurrencyPipe and has no relation to locale currency. Defaults to USD if not configured.
 *
 * See the [i18n guide](guide/i18n/locale-id) for more information.
 *
 * <div class="docs-alert docs-alert-helpful">
 *
 * The default currency code is currently always `USD`.
 *
 * If you need the previous behavior then set it by creating a `DEFAULT_CURRENCY_CODE` provider in
 * your application `NgModule`:
 *
 * ```ts
 * {provide: DEFAULT_CURRENCY_CODE, useValue: 'USD'}
 * ```
 *
 * </div>
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   providers: [{provide: DEFAULT_CURRENCY_CODE, useValue: 'EUR' }]
 * });
 * ```
 *
 * @publicApi
 */
declare const DEFAULT_CURRENCY_CODE: InjectionToken<string>;
/**
 * Use this token at bootstrap to provide the content of your translation file (`xtb`,
 * `xlf` or `xlf2`) when you want to translate your application in another language.
 *
 * See the [i18n guide](guide/i18n/merge) for more information.
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import { TRANSLATIONS } from '@angular/core';
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * // content of your translation file
 * const translations = '....';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   providers: [{provide: TRANSLATIONS, useValue: translations }]
 * });
 * ```
 *
 * @publicApi
 */
declare const TRANSLATIONS: InjectionToken<string>;
/**
 * Provide this token at bootstrap to set the format of your {@link TRANSLATIONS}: `xtb`,
 * `xlf` or `xlf2`.
 *
 * See the [i18n guide](guide/i18n/merge) for more information.
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * import { TRANSLATIONS_FORMAT } from '@angular/core';
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   providers: [{provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }]
 * });
 * ```
 *
 * @publicApi
 */
declare const TRANSLATIONS_FORMAT: InjectionToken<string>;
/**
 * Use this enum at bootstrap as an option of `bootstrapModule` to define the strategy
 * that the compiler should use in case of missing translations:
 * - Error: throw if you have missing translations.
 * - Warning (default): show a warning in the console and/or shell.
 * - Ignore: do nothing.
 *
 * See the [i18n guide](guide/i18n/merge#report-missing-translations) for more information.
 *
 * @usageNotes
 * ### Example
 * ```ts
 * import { MissingTranslationStrategy } from '@angular/core';
 * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 * import { AppModule } from './app/app.module';
 *
 * platformBrowserDynamic().bootstrapModule(AppModule, {
 *   missingTranslation: MissingTranslationStrategy.Error
 * });
 * ```
 *
 * @publicApi
 */
declare enum MissingTranslationStrategy {
    Error = 0,
    Warning = 1,
    Ignore = 2
}

/**
 * Re-exported by `BrowserModule`, which is included automatically in the root
 * `AppModule` when you create a new app with the CLI `new` command. Eagerly injects
 * `ApplicationRef` to instantiate it.
 *
 * @publicApi
 */
declare class ApplicationModule {
    constructor(appRef: ApplicationRef);
    static ɵfac: ɵɵFactoryDeclaration<ApplicationModule, never>;
    static ɵmod: ɵɵNgModuleDeclaration<ApplicationModule, never, never, never>;
    static ɵinj: ɵɵInjectorDeclaration<ApplicationModule>;
}

/**
 * Provides a hook for centralized exception handling.
 *
 * The default implementation of `ErrorHandler` prints error messages to the `console`. To
 * intercept error handling, write a custom exception handler that replaces this default as
 * appropriate for your app.
 *
 * @usageNotes
 * ### Example
 *
 * ```ts
 * class MyErrorHandler implements ErrorHandler {
 *   handleError(error) {
 *     // do something with the exception
 *   }
 * }
 *
 * // Provide in standalone apps
 * bootstrapApplication(AppComponent, {
 *   providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
 * })
 *
 * // Provide in module-based apps
 * @NgModule({
 *   providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
 * })
 * class MyModule {}
 * ```
 *
 * @publicApi
 */
declare class ErrorHandler {
    handleError(error: any): void;
}
/**
 * `InjectionToken` used to configure how to call the `ErrorHandler`.
 *
 * `NgZone` is provided by default today so the default (and only) implementation for this
 * is calling `ErrorHandler.handleError` outside of the Angular zone.
 */
declare const INTERNAL_APPLICATION_ERROR_HANDLER: InjectionToken<(e: any) => void>;

/**
 * Internal create application API that implements the core application creation logic and optional
 * bootstrap logic.
 *
 * Platforms (such as `platform-browser`) may require different set of application and platform
 * providers for an application to function correctly. As a result, platforms may use this function
 * internally and supply the necessary providers during the bootstrap, while exposing
 * platform-specific APIs as a part of their public API.
 *
 * @returns A promise that returns an `ApplicationRef` instance once resolved.
 */
declare function internalCreateApplication(config: {
    rootComponent?: Type$1<unknown>;
    appProviders?: Array<Provider | EnvironmentProviders>;
    platformProviders?: Provider[];
}): Promise<ApplicationRef>;

declare class Console {
    log(message: string): void;
    warn(message: string): void;
    static ɵfac: ɵɵFactoryDeclaration<Console, never>;
    static ɵprov: ɵɵInjectableDeclaration<Console>;
}

/**
 * Defer block instance for testing.
 */
interface DeferBlockDetails extends DehydratedDeferBlock {
    tDetails: TDeferBlockDetails;
}
/**
 * Retrieves all defer blocks in a given LView.
 *
 * @param lView lView with defer blocks
 * @param deferBlocks defer block aggregator array
 */
declare function getDeferBlocks$1(lView: LView, deferBlocks: DeferBlockDetails[]): void;

/**
 * **INTERNAL**, avoid referencing it in application code.
 * *
 * Injector token that allows to provide `DeferBlockDependencyInterceptor` class
 * implementation.
 *
 * This token is only injected in devMode
 */
declare const DEFER_BLOCK_DEPENDENCY_INTERCEPTOR: InjectionToken<DeferBlockDependencyInterceptor>;
/**
 * **INTERNAL**, token used for configuring defer block behavior.
 */
declare const DEFER_BLOCK_CONFIG: InjectionToken<DeferBlockConfig>;
/** Rendering Helpers */
/**
 * Transitions a defer block to the new state. Updates the  necessary
 * data structures and renders corresponding block.
 *
 * @param newState New state that should be applied to the defer block.
 * @param tNode TNode that represents a defer block.
 * @param lContainer Represents an instance of a defer block.
 * @param skipTimerScheduling Indicates that `@loading` and `@placeholder` block
 *   should be rendered immediately, even if they have `after` or `minimum` config
 *   options setup. This flag to needed for testing APIs to transition defer block
 *   between states via `DeferFixture.render` method.
 */
declare function renderDeferBlockState(newState: DeferBlockState, tNode: TNode, lContainer: LContainer, skipTimerScheduling?: boolean): void;
/**
 * Enables timer-related scheduling if `after` or `minimum` parameters are setup
 * on the `@loading` or `@placeholder` blocks.
 */
declare function ɵɵdeferEnableTimerScheduling(tView: TView, tDetails: TDeferBlockDetails, placeholderConfigIndex?: number | null, loadingConfigIndex?: number | null): void;

/**
 * Trigger loading of defer block dependencies if the process hasn't started yet.
 *
 * @param tDetails Static information about this defer block.
 * @param lView LView of a host view.
 */
declare function triggerResourceLoading(tDetails: TDeferBlockDetails, lView: LView, tNode: TNode): Promise<unknown>;

/**
 * Tell ivy what the `document` is for this platform.
 *
 * It is only necessary to call this if the current platform is not a browser.
 *
 * @param document The object representing the global `document` in this environment.
 */
declare function setDocument(document: Document | undefined): void;
/**
 * Access the object that represents the `document` for this platform.
 *
 * Ivy calls this whenever it needs to access the `document` object.
 * For example to create the renderer or to do sanitization.
 */
declare function getDocument(): Document;

/**
 * URL for the XSS security documentation.
 */
declare const XSS_SECURITY_URL = "https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss";

/**
 * The list of error codes used in runtime code of the `core` package.
 * Reserved error code range: 100-999.
 *
 * Note: the minus sign denotes the fact that a particular code has a detailed guide on
 * angular.io. This extra annotation is needed to avoid introducing a separate set to store
 * error codes which have guides, which might leak into runtime code.
 *
 * Full list of available error guides can be found at https://angular.dev/errors.
 *
 * Error code ranges per package:
 *  - core (this package): 100-999
 *  - forms: 1000-1999
 *  - common: 2000-2999
 *  - animations: 3000-3999
 *  - router: 4000-4999
 *  - platform-browser: 5000-5500
 */
declare const enum RuntimeErrorCode {
    EXPRESSION_CHANGED_AFTER_CHECKED = -100,
    RECURSIVE_APPLICATION_REF_TICK = 101,
    INFINITE_CHANGE_DETECTION = 103,
    CYCLIC_DI_DEPENDENCY = -200,
    PROVIDER_NOT_FOUND = -201,
    INVALID_FACTORY_DEPENDENCY = 202,
    MISSING_INJECTION_CONTEXT = -203,
    INVALID_INJECTION_TOKEN = 204,
    INJECTOR_ALREADY_DESTROYED = 205,
    PROVIDER_IN_WRONG_CONTEXT = 207,
    MISSING_INJECTION_TOKEN = 208,
    INVALID_MULTI_PROVIDER = -209,
    MISSING_DOCUMENT = 210,
    MULTIPLE_COMPONENTS_MATCH = -300,
    EXPORT_NOT_FOUND = -301,
    PIPE_NOT_FOUND = -302,
    UNKNOWN_BINDING = 303,
    UNKNOWN_ELEMENT = 304,
    TEMPLATE_STRUCTURE_ERROR = 305,
    INVALID_EVENT_BINDING = 306,
    HOST_DIRECTIVE_UNRESOLVABLE = 307,
    HOST_DIRECTIVE_NOT_STANDALONE = 308,
    DUPLICATE_DIRECTIVE = 309,
    HOST_DIRECTIVE_COMPONENT = 310,
    HOST_DIRECTIVE_UNDEFINED_BINDING = 311,
    HOST_DIRECTIVE_CONFLICTING_ALIAS = 312,
    MULTIPLE_MATCHING_PIPES = 313,
    UNINITIALIZED_LET_ACCESS = 314,
    MULTIPLE_PLATFORMS = 400,
    PLATFORM_NOT_FOUND = 401,
    MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP = 402,
    BOOTSTRAP_COMPONENTS_NOT_FOUND = -403,
    PLATFORM_ALREADY_DESTROYED = 404,
    ASYNC_INITIALIZERS_STILL_RUNNING = 405,
    APPLICATION_REF_ALREADY_DESTROYED = 406,
    RENDERER_NOT_FOUND = 407,
    PROVIDED_BOTH_ZONE_AND_ZONELESS = 408,
    HYDRATION_NODE_MISMATCH = -500,
    HYDRATION_MISSING_SIBLINGS = -501,
    HYDRATION_MISSING_NODE = -502,
    UNSUPPORTED_PROJECTION_DOM_NODES = -503,
    INVALID_SKIP_HYDRATION_HOST = -504,
    MISSING_HYDRATION_ANNOTATIONS = -505,
    HYDRATION_STABLE_TIMEDOUT = -506,
    MISSING_SSR_CONTENT_INTEGRITY_MARKER = -507,
    MISCONFIGURED_INCREMENTAL_HYDRATION = 508,
    SIGNAL_WRITE_FROM_ILLEGAL_CONTEXT = 600,
    REQUIRE_SYNC_WITHOUT_SYNC_EMIT = 601,
    ASSERTION_NOT_INSIDE_REACTIVE_CONTEXT = -602,
    INVALID_I18N_STRUCTURE = 700,
    MISSING_LOCALE_DATA = 701,
    DEFER_LOADING_FAILED = -750,
    DEFER_IN_HMR_MODE = -751,
    IMPORT_PROVIDERS_FROM_STANDALONE = 800,
    INVALID_DIFFER_INPUT = 900,
    NO_SUPPORTING_DIFFER_FACTORY = 901,
    VIEW_ALREADY_ATTACHED = 902,
    INVALID_INHERITANCE = 903,
    UNSAFE_VALUE_IN_RESOURCE_URL = 904,
    UNSAFE_VALUE_IN_SCRIPT = 905,
    MISSING_GENERATED_DEF = 906,
    TYPE_IS_NOT_STANDALONE = 907,
    MISSING_ZONEJS = 908,
    UNEXPECTED_ZONE_STATE = 909,
    UNSAFE_IFRAME_ATTRS = -910,
    VIEW_ALREADY_DESTROYED = 911,
    COMPONENT_ID_COLLISION = -912,
    IMAGE_PERFORMANCE_WARNING = -913,
    UNEXPECTED_ZONEJS_PRESENT_IN_ZONELESS_MODE = 914,
    REQUIRED_INPUT_NO_VALUE = -950,
    REQUIRED_QUERY_NO_VALUE = -951,
    REQUIRED_MODEL_NO_VALUE = 952,
    OUTPUT_REF_DESTROYED = 953,
    LOOP_TRACK_DUPLICATE_KEYS = -955,
    LOOP_TRACK_RECREATE = -956,
    RUNTIME_DEPS_INVALID_IMPORTED_TYPE = 980,
    RUNTIME_DEPS_ORPHAN_COMPONENT = 981
}
/**
 * Class that represents a runtime error.
 * Formats and outputs the error message in a consistent way.
 *
 * Example:
 * ```ts
 *  throw new RuntimeError(
 *    RuntimeErrorCode.INJECTOR_ALREADY_DESTROYED,
 *    ngDevMode && 'Injector has already been destroyed.');
 * ```
 *
 * Note: the `message` argument contains a descriptive error message as a string in development
 * mode (when the `ngDevMode` is defined). In production mode (after tree-shaking pass), the
 * `message` argument becomes `false`, thus we account for it in the typings and the runtime
 * logic.
 */
declare class RuntimeError<T extends number = RuntimeErrorCode> extends Error {
    code: T;
    constructor(code: T, message: null | false | string);
}
/**
 * Called to format a runtime error.
 * See additional info on the `message` argument type in the `RuntimeError` class description.
 */
declare function formatRuntimeError<T extends number = RuntimeErrorCode>(code: T, message: null | false | string): string;

/**
 * A type-safe key to use with `TransferState`.
 *
 * Example:
 *
 * ```ts
 * const COUNTER_KEY = makeStateKey<number>('counter');
 * let value = 10;
 *
 * transferState.set(COUNTER_KEY, value);
 * ```
 *
 * @publicApi
 */
type StateKey<T> = string & {
    __not_a_string: never;
    __value_type?: T;
};
/**
 * Create a `StateKey<T>` that can be used to store value of type T with `TransferState`.
 *
 * Example:
 *
 * ```ts
 * const COUNTER_KEY = makeStateKey<number>('counter');
 * let value = 10;
 *
 * transferState.set(COUNTER_KEY, value);
 * ```
 *
 * @publicApi
 */
declare function makeStateKey<T = void>(key: string): StateKey<T>;
/**
 * A key value store that is transferred from the application on the server side to the application
 * on the client side.
 *
 * The `TransferState` is available as an injectable token.
 * On the client, just inject this token using DI and use it,    it will be lazily initialized.
 * On the server it's already included if `renderApplication` function is used. Otherwise, import
 * the `ServerTransferStateModule` module to make the `TransferState` available.
 *
 * The values in the store are serialized/deserialized using JSON.stringify/JSON.parse. So only
 * boolean, number, string, null and non-class objects will be serialized and deserialized in a
 * non-lossy manner.
 *
 * @publicApi
 */
declare class TransferState {
    /** @nocollapse */
    static ɵprov: unknown;
    private onSerializeCallbacks;
    /**
     * Get the value corresponding to a key. Return `defaultValue` if key is not found.
     */
    get<T>(key: StateKey<T>, defaultValue: T): T;
    /**
     * Set the value corresponding to a key.
     */
    set<T>(key: StateKey<T>, value: T): void;
    /**
     * Remove a key from the store.
     */
    remove<T>(key: StateKey<T>): void;
    /**
     * Test whether a key exists in the store.
     */
    hasKey<T>(key: StateKey<T>): boolean;
    /**
     * Indicates whether the state is empty.
     */
    get isEmpty(): boolean;
    /**
     * Register a callback to provide the value for a key when `toJson` is called.
     */
    onSerialize<T>(key: StateKey<T>, callback: () => T): void;
    /**
     * Serialize the current state of the store to JSON.
     */
    toJson(): string;
}

/**
 * Marker used in a comment node to ensure hydration content integrity
 */
declare const SSR_CONTENT_INTEGRITY_MARKER = "nghm";
/**
 * Internal type that represents a claimed node.
 * Only used in dev mode.
 */
declare enum HydrationStatus {
    Hydrated = "hydrated",
    Skipped = "skipped",
    Mismatched = "mismatched"
}
type HydrationInfo = {
    status: HydrationStatus.Hydrated | HydrationStatus.Skipped;
} | {
    status: HydrationStatus.Mismatched;
    actualNodeDetails: string | null;
    expectedNodeDetails: string | null;
};
declare const HYDRATION_INFO_KEY = "__ngDebugHydrationInfo__";
type HydratedNode = {
    [HYDRATION_INFO_KEY]?: HydrationInfo;
};
declare function readHydrationInfo(node: RNode): HydrationInfo | null;

/**
 * Annotates all components bootstrapped in a given ApplicationRef
 * with info needed for hydration.
 *
 * @param appRef An instance of an ApplicationRef.
 * @param doc A reference to the current Document instance.
 * @return event types that need to be replayed
 */
declare function annotateForHydration(appRef: ApplicationRef, doc: Document): {
    regular: Set<string>;
    capture: Set<string>;
};

/**
 * Defines a name of an attribute that is added to the <body> tag
 * in the `index.html` file in case a given route was configured
 * with `RenderMode.Client`. 'cm' is an abbreviation for "Client Mode".
 */
declare const CLIENT_RENDER_MODE_FLAG = "ngcm";
/**
 * Returns a set of providers required to setup hydration support
 * for an application that is server side rendered. This function is
 * included into the `provideClientHydration` public API function from
 * the `platform-browser` package.
 *
 * The function sets up an internal flag that would be recognized during
 * the server side rendering time as well, so there is no need to
 * configure or change anything in NgUniversal to enable the feature.
 */
declare function withDomHydration(): EnvironmentProviders;
/**
 * Returns a set of providers required to setup support for i18n hydration.
 * Requires hydration to be enabled separately.
 */
declare function withI18nSupport(): Provider[];
/**
 * Returns a set of providers required to setup support for incremental hydration.
 * Requires hydration to be enabled separately.
 * Enabling incremental hydration also enables event replay for the entire app.
 *
 * @developerPreview
 */
declare function withIncrementalHydration(): Provider[];

/**
 * Returns a set of providers required to setup support for event replay.
 * Requires hydration to be enabled separately.
 */
declare function withEventReplay(): Provider[];

declare global {
    interface Element {
        __jsaction_fns: Map<string, Function[]> | undefined;
    }
}
interface EventContractDetails {
    instance?: EventContract;
}
declare const JSACTION_EVENT_CONTRACT: InjectionToken<EventContractDetails>;

/**
 * Internal token that specifies whether DOM reuse logic
 * during hydration is enabled.
 */
declare const IS_HYDRATION_DOM_REUSE_ENABLED: InjectionToken<boolean>;
/**
 * Internal token that indicates whether incremental hydration support
 * is enabled.
 */
declare const IS_INCREMENTAL_HYDRATION_ENABLED: InjectionToken<boolean>;
/**
 * A map of DOM elements with `jsaction` attributes grouped by action names.
 */
declare const JSACTION_BLOCK_ELEMENT_MAP: InjectionToken<Map<string, Set<Element>>>;

/**
 * Register locale data to be used internally by Angular. See the
 * ["I18n guide"](guide/i18n/format-data-locale) to know how to import additional locale
 * data.
 *
 * The signature `registerLocaleData(data: any, extraData?: any)` is deprecated since v5.1
 */
declare function registerLocaleData(data: any, localeId?: string | any, extraData?: any): void;
/**
 * Finds the locale data for a given locale.
 *
 * @param locale The locale code.
 * @returns The locale data.
 * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
 */
declare function findLocaleData(locale: string): any;
/**
 * Retrieves the default currency code for the given locale.
 *
 * The default is defined as the first currency which is still in use.
 *
 * @param locale The code of the locale whose currency code we want.
 * @returns The code of the default currency for the given locale.
 *
 */
declare function getLocaleCurrencyCode(locale: string): string | null;
/**
 * Retrieves the plural function used by ICU expressions to determine the plural case to use
 * for a given locale.
 * @param locale A locale code for the locale format rules to use.
 * @returns The plural function for the locale.
 * @see {@link NgPlural}
 * @see [Internationalization (i18n) Guide](guide/i18n)
 */
declare function getLocalePluralCase(locale: string): (value: number) => number;
/**
 * Helper function to remove all the locale data from `LOCALE_DATA`.
 */
declare function unregisterAllLocaleData(): void;
/**
 * Index of each type of locale data from the locale data array
 */
declare enum LocaleDataIndex {
    LocaleId = 0,
    DayPeriodsFormat = 1,
    DayPeriodsStandalone = 2,
    DaysFormat = 3,
    DaysStandalone = 4,
    MonthsFormat = 5,
    MonthsStandalone = 6,
    Eras = 7,
    FirstDayOfWeek = 8,
    WeekendRange = 9,
    DateFormat = 10,
    TimeFormat = 11,
    DateTimeFormat = 12,
    NumberSymbols = 13,
    NumberFormats = 14,
    CurrencyCode = 15,
    CurrencySymbol = 16,
    CurrencyName = 17,
    Currencies = 18,
    Directionality = 19,
    PluralCase = 20,
    ExtraData = 21
}
/**
 * Index of each type of locale data from the extra locale data array
 */
declare const enum ExtraLocaleDataIndex {
    ExtraDayPeriodFormats = 0,
    ExtraDayPeriodStandalone = 1,
    ExtraDayPeriodsRules = 2
}
/**
 * Index of each value in currency data (used to describe CURRENCIES_EN in currencies.ts)
 */
declare const enum CurrencyIndex {
    Symbol = 0,
    SymbolNarrow = 1,
    NbOfDigits = 2
}

/**
 * The locale id that the application is using by default (for translations and ICU expressions).
 */
declare const DEFAULT_LOCALE_ID = "en-US";

/**
 * Used to resolve resource URLs on `@Component` when used with JIT compilation.
 *
 * Example:
 * ```ts
 * @Component({
 *   selector: 'my-comp',
 *   templateUrl: 'my-comp.html', // This requires asynchronous resolution
 * })
 * class MyComponent{
 * }
 *
 * // Calling `renderComponent` will fail because `renderComponent` is a synchronous process
 * // and `MyComponent`'s `@Component.templateUrl` needs to be resolved asynchronously.
 *
 * // Calling `resolveComponentResources()` will resolve `@Component.templateUrl` into
 * // `@Component.template`, which allows `renderComponent` to proceed in a synchronous manner.
 *
 * // Use browser's `fetch()` function as the default resource resolution strategy.
 * resolveComponentResources(fetch).then(() => {
 *   // After resolution all URLs have been converted into `template` strings.
 *   renderComponent(MyComponent);
 * });
 *
 * ```
 *
 * NOTE: In AOT the resolution happens during compilation, and so there should be no need
 * to call this method outside JIT mode.
 *
 * @param resourceResolver a function which is responsible for returning a `Promise` to the
 * contents of the resolved URL. Browser's `fetch()` method is a good default implementation.
 */
declare function resolveComponentResources(resourceResolver: (url: string) => Promise<string | {
    text(): Promise<string>;
}>): Promise<void>;
declare function isComponentDefPendingResolution(type: Type$1<any>): boolean;
declare function clearResolutionOfComponentResourcesQueue(): Map<Type$1<any>, Component>;
declare function restoreComponentResolutionQueue(queue: Map<Type$1<any>, Component>): void;

/**
 * InjectionToken to control root component bootstrap behavior.
 *
 * This token is primarily used in Angular's server-side rendering (SSR) scenarios,
 * particularly by the `@angular/ssr` package, to manage whether the root component
 * should be bootstrapped during the application initialization process.
 *
 * ## Purpose:
 * During SSR route extraction, setting this token to `false` prevents Angular from
 * bootstrapping the root component. This avoids unnecessary component rendering,
 * enabling route extraction without requiring additional APIs or triggering
 * component logic.
 *
 * ## Behavior:
 * - **`false`**: Prevents the root component from being bootstrapped.
 * - **`true`** (default): Proceeds with the normal root component bootstrap process.
 *
 * This mechanism ensures SSR can efficiently separate route extraction logic
 * from component rendering.
 */
declare const ENABLE_ROOT_COMPONENT_BOOTSTRAP: InjectionToken<boolean>;

interface PlatformReflectionCapabilities {
    factory(type: Type$1<any>): Function;
    hasLifecycleHook(type: any, lcProperty: string): boolean;
    /**
     * Return a list of annotations/types for constructor parameters
     */
    parameters(type: Type$1<any>): any[][];
    /**
     * Return a list of annotations declared on the class
     */
    annotations(type: Type$1<any>): any[];
    /**
     * Return a object literal which describes the annotations on Class fields/properties.
     */
    propMetadata(typeOrFunc: Type$1<any>): {
        [key: string]: any[];
    };
}

declare class ReflectionCapabilities implements PlatformReflectionCapabilities {
    private _reflect;
    constructor(reflect?: any);
    factory<T>(t: Type$1<T>): (args: any[]) => T;
    private _ownParameters;
    parameters(type: Type$1<any>): any[][];
    private _ownAnnotations;
    annotations(typeOrFunc: Type$1<any>): any[];
    private _ownPropMetadata;
    propMetadata(typeOrFunc: any): {
        [key: string]: any[];
    };
    ownPropMetadata(typeOrFunc: any): {
        [key: string]: any[];
    };
    hasLifecycleHook(type: any, lcProperty: string): boolean;
}

/**
 * An object that defines an injection context for the injector profiler.
 */
interface InjectorProfilerContext {
    /**
     *  The Injector that service is being injected into.
     *      - Example: if ModuleA --provides--> ServiceA --injects--> ServiceB
     *                 then inject(ServiceB) in ServiceA has ModuleA as an injector context
     */
    injector: Injector;
    /**
     *  The class where the constructor that is calling `inject` is located
     *      - Example: if ModuleA --provides--> ServiceA --injects--> ServiceB
     *                 then inject(ServiceB) in ServiceA has ServiceA as a construction context
     */
    token: Type$1<unknown> | null;
}
/**
 * An object that contains information about a provider that has been configured
 *
 * TODO: rename to indicate that it is a debug structure eg. ProviderDebugInfo.
 */
interface ProviderRecord {
    /**
     * DI token that this provider is configuring
     */
    token: Type$1<unknown> | InjectionToken<unknown>;
    /**
     * Determines if provider is configured as view provider.
     */
    isViewProvider: boolean;
    /**
     * The raw provider associated with this ProviderRecord.
     */
    provider: SingleProvider;
    /**
     * The path of DI containers that were followed to import this provider
     */
    importPath?: Type$1<unknown>[];
}
/**
 * An object that contains information a service that has been injected within an
 * InjectorProfilerContext
 */
interface InjectedService {
    /**
     * DI token of the Service that is injected
     */
    token?: Type$1<unknown> | InjectionToken<unknown>;
    /**
     * Value of the injected service
     */
    value: unknown;
    /**
     * Flags that this service was injected with
     */
    flags?: InternalInjectFlags | InjectFlags | InjectOptions;
    /**
     * Injector that this service was provided in.
     */
    providedIn?: Injector;
    /**
     * In NodeInjectors, the LView and TNode that serviced this injection.
     */
    injectedIn?: {
        lView: LView;
        tNode: TNode;
    };
}
declare function setInjectorProfilerContext(context: InjectorProfilerContext): InjectorProfilerContext;

declare const enum BypassType {
    Url = "URL",
    Html = "HTML",
    ResourceUrl = "ResourceURL",
    Script = "Script",
    Style = "Style"
}
/**
 * Marker interface for a value that's safe to use in a particular context.
 *
 * @publicApi
 */
interface SafeValue {
}
/**
 * Marker interface for a value that's safe to use as HTML.
 *
 * @publicApi
 */
interface SafeHtml extends SafeValue {
}
/**
 * Marker interface for a value that's safe to use as style (CSS).
 *
 * @publicApi
 */
interface SafeStyle extends SafeValue {
}
/**
 * Marker interface for a value that's safe to use as JavaScript.
 *
 * @publicApi
 */
interface SafeScript extends SafeValue {
}
/**
 * Marker interface for a value that's safe to use as a URL linking to a document.
 *
 * @publicApi
 */
interface SafeUrl extends SafeValue {
}
/**
 * Marker interface for a value that's safe to use as a URL to load executable code from.
 *
 * @publicApi
 */
interface SafeResourceUrl extends SafeValue {
}
declare function unwrapSafeValue(value: SafeValue): string;
declare function unwrapSafeValue<T>(value: T): T;
declare function allowSanitizationBypassAndThrow(value: any, type: BypassType.Html): value is SafeHtml;
declare function allowSanitizationBypassAndThrow(value: any, type: BypassType.ResourceUrl): value is SafeResourceUrl;
declare function allowSanitizationBypassAndThrow(value: any, type: BypassType.Script): value is SafeScript;
declare function allowSanitizationBypassAndThrow(value: any, type: BypassType.Style): value is SafeStyle;
declare function allowSanitizationBypassAndThrow(value: any, type: BypassType.Url): value is SafeUrl;
declare function allowSanitizationBypassAndThrow(value: any, type: BypassType): boolean;
declare function getSanitizationBypassType(value: any): BypassType | null;
/**
 * Mark `html` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link htmlSanitizer} to be trusted implicitly.
 *
 * @param trustedHtml `html` string which needs to be implicitly trusted.
 * @returns a `html` which has been branded to be implicitly trusted.
 */
declare function bypassSanitizationTrustHtml(trustedHtml: string): SafeHtml;
/**
 * Mark `style` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link styleSanitizer} to be trusted implicitly.
 *
 * @param trustedStyle `style` string which needs to be implicitly trusted.
 * @returns a `style` hich has been branded to be implicitly trusted.
 */
declare function bypassSanitizationTrustStyle(trustedStyle: string): SafeStyle;
/**
 * Mark `script` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link scriptSanitizer} to be trusted implicitly.
 *
 * @param trustedScript `script` string which needs to be implicitly trusted.
 * @returns a `script` which has been branded to be implicitly trusted.
 */
declare function bypassSanitizationTrustScript(trustedScript: string): SafeScript;
/**
 * Mark `url` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link urlSanitizer} to be trusted implicitly.
 *
 * @param trustedUrl `url` string which needs to be implicitly trusted.
 * @returns a `url`  which has been branded to be implicitly trusted.
 */
declare function bypassSanitizationTrustUrl(trustedUrl: string): SafeUrl;
/**
 * Mark `url` string as trusted.
 *
 * This function wraps the trusted string in `String` and brands it in a way which makes it
 * recognizable to {@link resourceUrlSanitizer} to be trusted implicitly.
 *
 * @param trustedResourceUrl `url` string which needs to be implicitly trusted.
 * @returns a `url` which has been branded to be implicitly trusted.
 */
declare function bypassSanitizationTrustResourceUrl(trustedResourceUrl: string): SafeResourceUrl;

/**
 * Sanitizes the given unsafe, untrusted HTML fragment, and returns HTML text that is safe to add to
 * the DOM in a browser environment.
 */
declare function _sanitizeHtml(defaultDoc: any, unsafeHtmlInput: string): TrustedHTML | string;

declare function _sanitizeUrl(url: string): string;

/**
 * Transforms a value (typically a string) to a boolean.
 * Intended to be used as a transform function of an input.
 *
 *  @usageNotes
 *  ```ts
 *  @Input({ transform: booleanAttribute }) status!: boolean;
 *  ```
 * @param value Value to be transformed.
 *
 * @publicApi
 */
declare function booleanAttribute(value: unknown): boolean;
/**
 * Transforms a value (typically a string) to a number.
 * Intended to be used as a transform function of an input.
 * @param value Value to be transformed.
 * @param fallbackValue Value to use if the provided value can't be parsed as a number.
 *
 *  @usageNotes
 *  ```ts
 *  @Input({ transform: numberAttribute }) id!: number;
 *  ```
 *
 * @publicApi
 */
declare function numberAttribute(value: unknown, fallbackValue?: number): number;

declare const _global: any;

/**
 * Determine if the argument is shaped like a Promise
 */
declare function isPromise<T = any>(obj: any): obj is Promise<T>;
/**
 * Determine if the argument is a Subscribable
 */
declare function isSubscribable<T>(obj: any | Subscribable<T>): obj is Subscribable<T>;

/**
 * A guarded `performance.mark` for feature marking.
 *
 * This method exists because while all supported browser and node.js version supported by Angular
 * support performance.mark API. This is not the case for other environments such as JSDOM and
 * Cloudflare workers.
 */
declare function performanceMarkFeature(feature: string): void;

declare function stringify(token: any): string;
/**
 * Ellipses the string in the middle when longer than the max length
 *
 * @param string
 * @param maxLength of the output string
 * @returns ellipsed string with ... in the middle
 */
declare function truncateMiddle(str: string, maxLength?: number): string;

declare const NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR: {};

declare const PERFORMANCE_MARK_PREFIX = "\uD83C\uDD70\uFE0F";
/**
 * Function that will start measuring against the performance API
 * Should be used in pair with stopMeasuring
 */
declare function startMeasuring<T>(label: string): void;
/**
 * Function that will stop measuring against the performance API
 * Should be used in pair with stopMeasuring
 */
declare function stopMeasuring(label: string): void;
/**
 * This enables an internal performance profiler
 *
 * It should not be imported in application code
 */
declare function enableProfiling(): void;
declare function disableProfiling(): void;

/**
 * Status of a `Resource`.
 *
 * @experimental
 */
declare enum ResourceStatus {
    /**
     * The resource has no valid request and will not perform any loading.
     *
     * `value()` will be `undefined`.
     */
    Idle = 0,
    /**
     * Loading failed with an error.
     *
     * `value()` will be `undefined`.
     */
    Error = 1,
    /**
     * The resource is currently loading a new value as a result of a change in its `request`.
     *
     * `value()` will be `undefined`.
     */
    Loading = 2,
    /**
     * The resource is currently reloading a fresh value for the same request.
     *
     * `value()` will continue to return the previously fetched value during the reloading operation.
     */
    Reloading = 3,
    /**
     * Loading has completed and the resource has the value returned from the loader.
     */
    Resolved = 4,
    /**
     * The resource's value was set locally via `.set()` or `.update()`.
     */
    Local = 5
}
/**
 * A Resource is an asynchronous dependency (for example, the results of an API call) that is
 * managed and delivered through signals.
 *
 * The usual way of creating a `Resource` is through the `resource` function, but various other APIs
 * may present `Resource` instances to describe their own concepts.
 *
 * @experimental
 */
interface Resource<T> {
    /**
     * The current value of the `Resource`, or `undefined` if there is no current value.
     */
    readonly value: Signal<T>;
    /**
     * The current status of the `Resource`, which describes what the resource is currently doing and
     * what can be expected of its `value`.
     */
    readonly status: Signal<ResourceStatus>;
    /**
     * When in the `error` state, this returns the last known error from the `Resource`.
     */
    readonly error: Signal<unknown>;
    /**
     * Whether this resource is loading a new value (or reloading the existing one).
     */
    readonly isLoading: Signal<boolean>;
    /**
     * Whether this resource has a valid current value.
     *
     * This function is reactive.
     */
    hasValue(): this is Resource<Exclude<T, undefined>>;
    /**
     * Instructs the resource to re-load any asynchronous dependency it may have.
     *
     * Note that the resource will not enter its reloading state until the actual backend request is
     * made.
     *
     * @returns true if a reload was initiated, false if a reload was unnecessary or unsupported
     */
    reload(): boolean;
}
/**
 * A `Resource` with a mutable value.
 *
 * Overwriting the value of a resource sets it to the 'local' state.
 *
 * @experimental
 */
interface WritableResource<T> extends Resource<T> {
    readonly value: WritableSignal<T>;
    hasValue(): this is WritableResource<Exclude<T, undefined>>;
    /**
     * Convenience wrapper for `value.set`.
     */
    set(value: T): void;
    /**
     * Convenience wrapper for `value.update`.
     */
    update(updater: (value: T) => T): void;
    asReadonly(): Resource<T>;
}
/**
 * A `WritableResource` created through the `resource` function.
 *
 * @experimental
 */
interface ResourceRef<T> extends WritableResource<T> {
    hasValue(): this is ResourceRef<Exclude<T, undefined>>;
    /**
     * Manually destroy the resource, which cancels pending requests and returns it to `idle` state.
     */
    destroy(): void;
}
/**
 * Parameter to a `ResourceLoader` which gives the request and other options for the current loading
 * operation.
 *
 * @experimental
 */
interface ResourceLoaderParams<R> {
    request: Exclude<NoInfer<R>, undefined>;
    abortSignal: AbortSignal;
    previous: {
        status: ResourceStatus;
    };
}
/**
 * Loading function for a `Resource`.
 *
 * @experimental
 */
type ResourceLoader<T, R> = (param: ResourceLoaderParams<R>) => PromiseLike<T>;
/**
 * Streaming loader for a `Resource`.
 *
 * @experimental
 */
type ResourceStreamingLoader<T, R> = (param: ResourceLoaderParams<R>) => PromiseLike<Signal<ResourceStreamItem<T>>>;
/**
 * Options to the `resource` function, for creating a resource.
 *
 * @experimental
 */
interface BaseResourceOptions<T, R> {
    /**
     * A reactive function which determines the request to be made. Whenever the request changes, the
     * loader will be triggered to fetch a new value for the resource.
     *
     * If a request function isn't provided, the loader won't rerun unless the resource is reloaded.
     */
    request?: () => R;
    /**
     * The value which will be returned from the resource when a server value is unavailable, such as
     * when the resource is still loading, or in an error state.
     */
    defaultValue?: NoInfer<T>;
    /**
     * Equality function used to compare the return value of the loader.
     */
    equal?: ValueEqualityFn<T>;
    /**
     * Overrides the `Injector` used by `resource`.
     */
    injector?: Injector;
}
/**
 * Options to the `resource` function, for creating a resource.
 *
 * @experimental
 */
interface PromiseResourceOptions<T, R> extends BaseResourceOptions<T, R> {
    /**
     * Loading function which returns a `Promise` of the resource's value for a given request.
     */
    loader: ResourceLoader<T, R>;
    /**
     * Cannot specify `stream` and `loader` at the same time.
     */
    stream?: never;
}
/**
 * Options to the `resource` function, for creating a resource.
 *
 * @experimental
 */
interface StreamingResourceOptions<T, R> extends BaseResourceOptions<T, R> {
    /**
     * Loading function which returns a `Promise` of a signal of the resource's value for a given
     * request, which can change over time as new values are received from a stream.
     */
    stream: ResourceStreamingLoader<T, R>;
    /**
     * Cannot specify `stream` and `loader` at the same time.
     */
    loader?: never;
}
/**
 * @experimental
 */
type ResourceOptions<T, R> = PromiseResourceOptions<T, R> | StreamingResourceOptions<T, R>;
/**
 * @experimental
 */
type ResourceStreamItem<T> = {
    value: T;
} | {
    error: unknown;
};

/**
 * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by
 * a loader function, which exposes the result of the loading operation via signals.
 *
 * Note that `resource` is intended for _read_ operations, not operations which perform mutations.
 * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new
 * request object becomes available, which could prematurely abort mutations.
 *
 * @experimental
 */
declare function resource<T, R>(options: ResourceOptions<T, R> & {
    defaultValue: NoInfer<T>;
}): ResourceRef<T>;
/**
 * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by
 * a loader function, which exposes the result of the loading operation via signals.
 *
 * Note that `resource` is intended for _read_ operations, not operations which perform mutations.
 * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new
 * request object becomes available, which could prematurely abort mutations.
 *
 * @experimental
 */
declare function resource<T, R>(options: ResourceOptions<T, R>): ResourceRef<T | undefined>;
type WrappedRequest = {
    request: unknown;
    reload: number;
};
/**
 * Base class which implements `.value` as a `WritableSignal` by delegating `.set` and `.update`.
 */
declare abstract class BaseWritableResource<T> implements WritableResource<T> {
    readonly value: WritableSignal<T>;
    abstract readonly status: Signal<ResourceStatus>;
    abstract readonly error: Signal<unknown>;
    abstract reload(): boolean;
    constructor(value: Signal<T>);
    abstract set(value: T): void;
    update(updateFn: (value: T) => T): void;
    readonly isLoading: Signal<boolean>;
    hasValue(): this is ResourceRef<Exclude<T, undefined>>;
    asReadonly(): Resource<T>;
}
/**
 * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state.
 */
declare class ResourceImpl<T, R> extends BaseWritableResource<T> implements ResourceRef<T> {
    private readonly loaderFn;
    private readonly defaultValue;
    private readonly equal;
    private readonly pendingTasks;
    /**
     * The current state of the resource. Status, value, and error are derived from this.
     */
    private readonly state;
    /**
     * Combines the current request with a reload counter which allows the resource to be reloaded on
     * imperative command.
     */
    protected readonly extRequest: WritableSignal<WrappedRequest>;
    private readonly effectRef;
    private pendingController;
    private resolvePendingTask;
    private destroyed;
    constructor(request: () => R, loaderFn: ResourceStreamingLoader<T, R>, defaultValue: T, equal: ValueEqualityFn$1<T> | undefined, injector: Injector);
    readonly status: Signal<ResourceStatus>;
    readonly error: Signal<unknown>;
    /**
     * Called either directly via `WritableResource.set` or via `.value.set()`.
     */
    set(value: T): void;
    reload(): boolean;
    destroy(): void;
    private loadEffect;
    private abortInProgressLoad;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Gets the class name of the closest component to a node.
 * Warning! this function will return minified names if the name of the component is minified. The
 * consumer of the function is responsible for resolving the minified name to its original name.
 * @param node Node from which to start the search.
 */
declare function getClosestComponentName(node: Node): string | null;

/**
 * The following getter methods retrieve the definition from the type. Currently the retrieval
 * honors inheritance, but in the future we may change the rule to require that definitions are
 * explicit. This would require some sort of migration strategy.
 */
declare function getComponentDef<T>(type: any): ComponentDef<T> | null;
/**
 * Checks whether a given Component, Directive or Pipe is marked as standalone.
 * This will return false if passed anything other than a Component, Directive, or Pipe class
 * See [this guide](guide/components/importing) for additional information:
 *
 * @param type A reference to a Component, Directive or Pipe.
 * @publicApi
 */
declare function isStandalone(type: Type$1<unknown>): boolean;

/**
 * TODO(incremental-hydration): Remove this file entirely once PromiseWithResolvers lands in stable
 * node / TS.
 */
interface PromiseWithResolvers<T> {
    promise: Promise<T>;
    resolve: (value: T | PromiseLike<T>) => void;
    reject: (reason?: any) => void;
}

/**
 * An internal injection token to reference `DehydratedBlockRegistry` implementation
 * in a tree-shakable way.
 */
declare const DEHYDRATED_BLOCK_REGISTRY: InjectionToken<DehydratedBlockRegistry>;
/**
 * The DehydratedBlockRegistry is used for incremental hydration purposes. It keeps
 * track of the Defer Blocks that need hydration so we can effectively
 * navigate up to the top dehydrated defer block and fire appropriate cleanup
 * functions post hydration.
 */
declare class DehydratedBlockRegistry {
    private registry;
    private cleanupFns;
    private jsActionMap;
    private contract;
    add(blockId: string, info: DehydratedDeferBlock): void;
    get(blockId: string): DehydratedDeferBlock | null;
    has(blockId: string): boolean;
    cleanup(hydratedBlocks: string[]): void;
    get size(): number;
    addCleanupFn(blockId: string, fn: Function): void;
    invokeTriggerCleanupFns(blockId: string): void;
    hydrating: Map<string, PromiseWithResolvers<void>>;
    private awaitingCallbacks;
    awaitParentBlock(topmostParentBlock: string, callback: Function): void;
    /** @nocollapse */
    static ɵprov: unknown;
}

/**
 * Helper service to schedule `setTimeout`s for batches of defer blocks,
 * to avoid calling `setTimeout` for each defer block (e.g. if defer blocks
 * are created inside a for loop).
 */
declare class TimerScheduler {
    executingCallbacks: boolean;
    timeoutId: number | null;
    invokeTimerAt: number | null;
    current: Array<number | VoidFunction>;
    deferred: Array<number | VoidFunction>;
    add(delay: number, callback: VoidFunction, ngZone: NgZone): void;
    remove(callback: VoidFunction): void;
    private addToQueue;
    private removeFromQueue;
    private scheduleTimer;
    private clearTimeout;
    ngOnDestroy(): void;
    /** @nocollapse */
    static ɵprov: unknown;
}

declare function compileNgModuleFactory<M>(injector: Injector, options: CompilerOptions, moduleType: Type$1<M>): Promise<NgModuleFactory$1<M>>;

/**
 * Create a new `Injector` which is configured using a `defType` of `InjectorType<any>`s.
 */
declare function createInjector(defType: any, parent?: Injector | null, additionalProviders?: Array<Provider | StaticProvider> | null, name?: string): Injector;

/**
 * Adds the given NgModule type to Angular's NgModule registry.
 *
 * This is generated as a side-effect of NgModule compilation. Note that the `id` is passed in
 * explicitly and not read from the NgModule definition. This is for two reasons: it avoids a
 * megamorphic read, and in JIT there's a chicken-and-egg problem where the NgModule may not be
 * fully resolved when it's registered.
 *
 * @codeGenApi
 */
declare function registerNgModuleType(ngModuleType: NgModuleType, id: string): void;
/**
 * Control whether the NgModule registration system enforces that each NgModule type registered has
 * a unique id.
 *
 * This is useful for testing as the NgModule registry cannot be properly reset between tests with
 * Angular's current API.
 */
declare function setAllowDuplicateNgModuleIdsForTest(allowDuplicates: boolean): void;

/**
 * The internal view context which is specific to a given DOM element, directive or
 * component instance. Each value in here (besides the LView and element node details)
 * can be present, null or undefined. If undefined then it implies the value has not been
 * looked up yet, otherwise, if null, then a lookup was executed and nothing was found.
 *
 * Each value will get filled when the respective value is examined within the getContext
 * function. The component, element and each directive instance will share the same instance
 * of the context.
 */
declare class LContext {
    /**
     * ID of the component's parent view data.
     */
    private lViewId;
    /**
     * The index instance of the node.
     */
    nodeIndex: number;
    /**
     * The instance of the DOM node that is attached to the lNode.
     */
    native: RNode;
    /**
     * The instance of the Component node.
     */
    component: {} | null | undefined;
    /**
     * The list of active directives that exist on this element.
     */
    directives: any[] | null | undefined;
    /**
     * The map of local references (local reference name => element or directive instance) that
     * exist on this element.
     */
    localRefs: {
        [key: string]: any;
    } | null | undefined;
    /** Component's parent view data. */
    get lView(): LView | null;
    constructor(
    /**
     * ID of the component's parent view data.
     */
    lViewId: number, 
    /**
     * The index instance of the node.
     */
    nodeIndex: number, 
    /**
     * The instance of the DOM node that is attached to the lNode.
     */
    native: RNode);
}

/**
 * Returns the matching `LContext` data for a given DOM node, directive or component instance.
 *
 * This function will examine the provided DOM element, component, or directive instance\'s
 * monkey-patched property to derive the `LContext` data. Once called then the monkey-patched
 * value will be that of the newly created `LContext`.
 *
 * If the monkey-patched value is the `LView` instance then the context value for that
 * target will be created and the monkey-patch reference will be updated. Therefore when this
 * function is called it may mutate the provided element\'s, component\'s or any of the associated
 * directive\'s monkey-patch values.
 *
 * If the monkey-patch value is not detected then the code will walk up the DOM until an element
 * is found which contains a monkey-patch reference. When that occurs then the provided element
 * will be updated with a new context (which is then returned). If the monkey-patch value is not
 * detected for a component/directive instance then it will throw an error (all components and
 * directives should be automatically monkey-patched by ivy).
 *
 * @param target Component, Directive or DOM Node.
 */
declare function getLContext(target: any): LContext | null;

declare const NG_COMP_DEF: string;
declare const NG_DIR_DEF: string;
declare const NG_PIPE_DEF: string;
declare const NG_MOD_DEF: string;
/**
 * If a directive is diPublic, bloomAdd sets a property on the type with this constant as
 * the key and the directive's unique ID as the value. This allows us to map directives to their
 * bloom filter bit for DI.
 */
declare const NG_ELEMENT_ID: string;

/**
 * Copies the fields not handled by the `ɵɵInheritDefinitionFeature` from the supertype of a
 * definition.
 *
 * This exists primarily to support ngcc migration of an existing View Engine pattern, where an
 * entire decorator is inherited from a parent to a child class. When ngcc detects this case, it
 * generates a skeleton definition on the child class, and applies this feature.
 *
 * The `ɵɵCopyDefinitionFeature` then copies any needed fields from the parent class' definition,
 * including things like the component template function.
 *
 * @param definition The definition of a child class which inherits from a parent class with its
 * own definition.
 *
 * @codeGenApi
 */
declare function ɵɵCopyDefinitionFeature(definition: DirectiveDef<any> | ComponentDef<any>): void;

/**
 * This feature adds the host directives behavior to a directive definition by patching a
 * function onto it. The expectation is that the runtime will invoke the function during
 * directive matching.
 *
 * For example:
 * ```ts
 * class ComponentWithHostDirective {
 *   static ɵcmp = defineComponent({
 *    type: ComponentWithHostDirective,
 *    features: [ɵɵHostDirectivesFeature([
 *      SimpleHostDirective,
 *      {directive: AdvancedHostDirective, inputs: ['foo: alias'], outputs: ['bar']},
 *    ])]
 *  });
 * }
 * ```
 *
 * @codeGenApi
 */
declare function ɵɵHostDirectivesFeature(rawHostDirectives: HostDirectiveConfig[] | (() => HostDirectiveConfig[])): DirectiveDefFeature;

/**
 * Merges the definition from a super class to a sub class.
 * @param definition The definition that is a SubClass of another directive of component
 *
 * @codeGenApi
 */
declare function ɵɵInheritDefinitionFeature(definition: DirectiveDef<any> | ComponentDef<any>): void;

/**
 * The NgOnChangesFeature decorates a component with support for the ngOnChanges
 * lifecycle hook, so it should be included in any component that implements
 * that hook.
 *
 * If the component or directive uses inheritance, the NgOnChangesFeature MUST
 * be included as a feature AFTER {@link InheritDefinitionFeature}, otherwise
 * inherited properties will not be propagated to the ngOnChanges lifecycle
 * hook.
 *
 * Example usage:
 *
 * ```ts
 * static ɵcmp = defineComponent({
 *   ...
 *   inputs: {name: 'publicName'},
 *   features: [NgOnChangesFeature]
 * });
 * ```
 *
 * @codeGenApi
 */
declare const ɵɵNgOnChangesFeature: () => DirectiveDefFeature;

/**
 * This feature resolves the providers of a directive (or component),
 * and publish them into the DI system, making it visible to others for injection.
 *
 * For example:
 * ```ts
 * class ComponentWithProviders {
 *   constructor(private greeter: GreeterDE) {}
 *
 *   static ɵcmp = defineComponent({
 *     type: ComponentWithProviders,
 *     selectors: [['component-with-providers']],
 *    factory: () => new ComponentWithProviders(directiveInject(GreeterDE as any)),
 *    decls: 1,
 *    vars: 1,
 *    template: function(fs: RenderFlags, ctx: ComponentWithProviders) {
 *      if (fs & RenderFlags.Create) {
 *        ɵɵtext(0);
 *      }
 *      if (fs & RenderFlags.Update) {
 *        ɵɵtextInterpolate(ctx.greeter.greet());
 *      }
 *    },
 *    features: [ɵɵProvidersFeature([GreeterDE])]
 *  });
 * }
 * ```
 *
 * @param definition
 *
 * @codeGenApi
 */
declare function ɵɵProvidersFeature<T>(providers: Provider[], viewProviders?: Provider[]): (definition: DirectiveDef<T>) => void;

/**
 * A feature that adds support for external runtime styles for a component.
 * An external runtime style is a URL to a CSS stylesheet that contains the styles
 * for a given component. For browsers, this URL will be used in an appended `link` element
 * when the component is rendered. This feature is typically used for Hot Module Replacement
 * (HMR) of component stylesheets by leveraging preexisting global stylesheet HMR available
 * in most development servers.
 *
 * @codeGenApi
 */
declare function ɵɵExternalStylesFeature(styleUrls: string[]): ComponentDefFeature;

/**
 * Generated next to NgModules to monkey-patch directive and pipe references onto a component's
 * definition, when generating a direct reference in the component file would otherwise create an
 * import cycle.
 *
 * See [this explanation](https://hackmd.io/Odw80D0pR6yfsOjg_7XCJg?view) for more details.
 *
 * @codeGenApi
 */
declare function ɵɵsetComponentScope(type: ComponentType<any>, directives: Type$1<any>[] | (() => Type$1<any>[]), pipes: Type$1<any>[] | (() => Type$1<any>[])): void;
/**
 * Adds the module metadata that is necessary to compute the module's transitive scope to an
 * existing module definition.
 *
 * Scope metadata of modules is not used in production builds, so calls to this function can be
 * marked pure to tree-shake it from the bundle, allowing for all referenced declarations
 * to become eligible for tree-shaking as well.
 *
 * @codeGenApi
 */
declare function ɵɵsetNgModuleScope(type: any, scope: NgModuleScopeInfoFromDecorator): unknown;

/**
 * Retrieves the component instance associated with a given DOM element.
 *
 * @usageNotes
 * Given the following DOM structure:
 *
 * ```html
 * <app-root>
 *   <div>
 *     <child-comp></child-comp>
 *   </div>
 * </app-root>
 * ```
 *
 * Calling `getComponent` on `<child-comp>` will return the instance of `ChildComponent`
 * associated with this DOM element.
 *
 * Calling the function on `<app-root>` will return the `MyApp` instance.
 *
 *
 * @param element DOM element from which the component should be retrieved.
 * @returns Component instance associated with the element or `null` if there
 *    is no component associated with it.
 *
 * @publicApi
 */
declare function getComponent<T>(element: Element): T | null;
/**
 * If inside an embedded view (e.g. `*ngIf` or `*ngFor`), retrieves the context of the embedded
 * view that the element is part of. Otherwise retrieves the instance of the component whose view
 * owns the element (in this case, the result is the same as calling `getOwningComponent`).
 *
 * @param element Element for which to get the surrounding component instance.
 * @returns Instance of the component that is around the element or null if the element isn't
 *    inside any component.
 *
 * @publicApi
 */
declare function getContext<T extends {}>(element: Element): T | null;
/**
 * Retrieves the component instance whose view contains the DOM element.
 *
 * For example, if `<child-comp>` is used in the template of `<app-comp>`
 * (i.e. a `ViewChild` of `<app-comp>`), calling `getOwningComponent` on `<child-comp>`
 * would return `<app-comp>`.
 *
 * @param elementOrDir DOM element, component or directive instance
 *    for which to retrieve the root components.
 * @returns Component instance whose view owns the DOM element or null if the element is not
 *    part of a component view.
 *
 * @publicApi
 */
declare function getOwningComponent<T>(elementOrDir: Element | {}): T | null;
/**
 * Retrieves all root components associated with a DOM element, directive or component instance.
 * Root components are those which have been bootstrapped by Angular.
 *
 * @param elementOrDir DOM element, component or directive instance
 *    for which to retrieve the root components.
 * @returns Root components associated with the target object.
 *
 * @publicApi
 */
declare function getRootComponents(elementOrDir: Element | {}): {}[];
/**
 * Retrieves an `Injector` associated with an element, component or directive instance.
 *
 * @param elementOrDir DOM element, component or directive instance for which to
 *    retrieve the injector.
 * @returns Injector associated with the element, component or directive instance.
 *
 * @publicApi
 */
declare function getInjector(elementOrDir: Element | {}): Injector;
/**
 * Retrieves directive instances associated with a given DOM node. Does not include
 * component instances.
 *
 * @usageNotes
 * Given the following DOM structure:
 *
 * ```html
 * <app-root>
 *   <button my-button></button>
 *   <my-comp></my-comp>
 * </app-root>
 * ```
 *
 * Calling `getDirectives` on `<button>` will return an array with an instance of the `MyButton`
 * directive that is associated with the DOM node.
 *
 * Calling `getDirectives` on `<my-comp>` will return an empty array.
 *
 * @param node DOM node for which to get the directives.
 * @returns Array of directives associated with the node.
 *
 * @publicApi
 */
declare function getDirectives(node: Node): {}[];
/**
 * Partial metadata for a given directive instance.
 * This information might be useful for debugging purposes or tooling.
 * Currently only `inputs` and `outputs` metadata is available.
 *
 * @publicApi
 */
interface DirectiveDebugMetadata {
    inputs: Record<string, string>;
    outputs: Record<string, string>;
}
/**
 * Partial metadata for a given component instance.
 * This information might be useful for debugging purposes or tooling.
 * Currently the following fields are available:
 *  - inputs
 *  - outputs
 *  - encapsulation
 *  - changeDetection
 *
 * @publicApi
 */
interface ComponentDebugMetadata extends DirectiveDebugMetadata {
    encapsulation: ViewEncapsulation$1;
    changeDetection: ChangeDetectionStrategy$1;
}
/**
 * Returns the debug (partial) metadata for a particular directive or component instance.
 * The function accepts an instance of a directive or component and returns the corresponding
 * metadata.
 *
 * @param directiveOrComponentInstance Instance of a directive or component
 * @returns metadata of the passed directive or component
 *
 * @publicApi
 */
declare function getDirectiveMetadata(directiveOrComponentInstance: any): ComponentDebugMetadata | DirectiveDebugMetadata | null;
/**
 * Retrieves the host element of a component or directive instance.
 * The host element is the DOM element that matched the selector of the directive.
 *
 * @param componentOrDirective Component or directive instance for which the host
 *     element should be retrieved.
 * @returns Host element of the target.
 *
 * @publicApi
 */
declare function getHostElement(componentOrDirective: {}): Element;
/**
 * Event listener configuration returned from `getListeners`.
 * @publicApi
 */
interface Listener {
    /** Name of the event listener. */
    name: string;
    /** Element that the listener is bound to. */
    element: Element;
    /** Callback that is invoked when the event is triggered. */
    callback: (value: any) => any;
    /** Whether the listener is using event capturing. */
    useCapture: boolean;
    /**
     * Type of the listener (e.g. a native DOM event or a custom @Output).
     */
    type: 'dom' | 'output';
}
/**
 * Retrieves a list of event listeners associated with a DOM element. The list does include host
 * listeners, but it does not include event listeners defined outside of the Angular context
 * (e.g. through `addEventListener`).
 *
 * @usageNotes
 * Given the following DOM structure:
 *
 * ```html
 * <app-root>
 *   <div (click)="doSomething()"></div>
 * </app-root>
 * ```
 *
 * Calling `getListeners` on `<div>` will return an object that looks as follows:
 *
 * ```ts
 * {
 *   name: 'click',
 *   element: <div>,
 *   callback: () => doSomething(),
 *   useCapture: false
 * }
 * ```
 *
 * @param element Element for which the DOM listeners should be retrieved.
 * @returns Array of event listeners on the DOM element.
 *
 * @publicApi
 */
declare function getListeners(element: Element): Listener[];

/**
 * @codeGenApi
 */
declare function ɵɵgetInheritedFactory<T>(type: Type$1<any>): (type: Type$1<T>) => T;

/**
 * Sets the locale id that will be used for translations and ICU expressions.
 * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
 * but is now defined as a global value.
 *
 * @param localeId
 */
declare function setLocaleId(localeId: string): void;

/**
 * Creates runtime data structures for defer blocks.
 *
 * @param index Index of the `defer` instruction.
 * @param primaryTmplIndex Index of the template with the primary block content.
 * @param dependencyResolverFn Function that contains dependencies for this defer block.
 * @param loadingTmplIndex Index of the template with the loading block content.
 * @param placeholderTmplIndex Index of the template with the placeholder block content.
 * @param errorTmplIndex Index of the template with the error block content.
 * @param loadingConfigIndex Index in the constants array of the configuration of the loading.
 *     block.
 * @param placeholderConfigIndex Index in the constants array of the configuration of the
 *     placeholder block.
 * @param enableTimerScheduling Function that enables timer-related scheduling if `after`
 *     or `minimum` parameters are setup on the `@loading` or `@placeholder` blocks.
 * @param flags A set of flags to define a particular behavior (e.g. to indicate that
 *              hydrate triggers are present and regular triggers should be deactivated
 *              in certain scenarios).
 *
 * @codeGenApi
 */
declare function ɵɵdefer(index: number, primaryTmplIndex: number, dependencyResolverFn?: DependencyResolverFn | null, loadingTmplIndex?: number | null, placeholderTmplIndex?: number | null, errorTmplIndex?: number | null, loadingConfigIndex?: number | null, placeholderConfigIndex?: number | null, enableTimerScheduling?: typeof ɵɵdeferEnableTimerScheduling, flags?: TDeferDetailsFlags | null): void;
/**
 * Loads defer block dependencies when a trigger value becomes truthy.
 * @codeGenApi
 */
declare function ɵɵdeferWhen(rawValue: unknown): void;
/**
 * Prefetches the deferred content when a value becomes truthy.
 * @codeGenApi
 */
declare function ɵɵdeferPrefetchWhen(rawValue: unknown): void;
/**
 * Hydrates the deferred content when a value becomes truthy.
 * @codeGenApi
 */
declare function ɵɵdeferHydrateWhen(rawValue: unknown): void;
/**
 * Specifies that hydration never occurs.
 * @codeGenApi
 */
declare function ɵɵdeferHydrateNever(): void;
/**
 * Sets up logic to handle the `on idle` deferred trigger.
 * @codeGenApi
 */
declare function ɵɵdeferOnIdle(): void;
/**
 * Sets up logic to handle the `prefetch on idle` deferred trigger.
 * @codeGenApi
 */
declare function ɵɵdeferPrefetchOnIdle(): void;
/**
 * Sets up logic to handle the `on idle` deferred trigger.
 * @codeGenApi
 */
declare function ɵɵdeferHydrateOnIdle(): void;
/**
 * Sets up logic to handle the `on immediate` deferred trigger.
 * @codeGenApi
 */
declare function ɵɵdeferOnImmediate(): void;
/**
 * Sets up logic to handle the `prefetch on immediate` deferred trigger.
 * @codeGenApi
 */
declare function ɵɵdeferPrefetchOnImmediate(): void;
/**
 * Sets up logic to handle the `on immediate` hydrate trigger.
 * @codeGenApi
 */
declare function ɵɵdeferHydrateOnImmediate(): void;
/**
 * Creates runtime data structures for the `on timer` deferred trigger.
 * @param delay Amount of time to wait before loading the content.
 * @codeGenApi
 */
declare function ɵɵdeferOnTimer(delay: number): void;
/**
 * Creates runtime data structures for the `prefetch on timer` deferred trigger.
 * @param delay Amount of time to wait before prefetching the content.
 * @codeGenApi
 */
declare function ɵɵdeferPrefetchOnTimer(delay: number): void;
/**
 * Creates runtime data structures for the `on timer` hydrate trigger.
 * @param delay Amount of time to wait before loading the content.
 * @codeGenApi
 */
declare function ɵɵdeferHydrateOnTimer(delay: number): void;
/**
 * Creates runtime data structures for the `on hover` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
declare function ɵɵdeferOnHover(triggerIndex: number, walkUpTimes?: number): void;
/**
 * Creates runtime data structures for the `prefetch on hover` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
declare function ɵɵdeferPrefetchOnHover(triggerIndex: number, walkUpTimes?: number): void;
/**
 * Creates runtime data structures for the `on hover` hydrate trigger.
 * @codeGenApi
 */
declare function ɵɵdeferHydrateOnHover(): void;
/**
 * Creates runtime data structures for the `on interaction` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
declare function ɵɵdeferOnInteraction(triggerIndex: number, walkUpTimes?: number): void;
/**
 * Creates runtime data structures for the `prefetch on interaction` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
declare function ɵɵdeferPrefetchOnInteraction(triggerIndex: number, walkUpTimes?: number): void;
/**
 * Creates runtime data structures for the `on interaction` hydrate trigger.
 * @codeGenApi
 */
declare function ɵɵdeferHydrateOnInteraction(): void;
/**
 * Creates runtime data structures for the `on viewport` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
declare function ɵɵdeferOnViewport(triggerIndex: number, walkUpTimes?: number): void;
/**
 * Creates runtime data structures for the `prefetch on viewport` deferred trigger.
 * @param triggerIndex Index at which to find the trigger element.
 * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
 * @codeGenApi
 */
declare function ɵɵdeferPrefetchOnViewport(triggerIndex: number, walkUpTimes?: number): void;
/**
 * Creates runtime data structures for the `on viewport` hydrate trigger.
 * @codeGenApi
 */
declare function ɵɵdeferHydrateOnViewport(): void;

/**
 * Advances to an element for later binding instructions.
 *
 * Used in conjunction with instructions like {@link property} to act on elements with specified
 * indices, for example those created with {@link element} or {@link elementStart}.
 *
 * ```ts
 * (rf: RenderFlags, ctx: any) => {
 *   if (rf & 1) {
 *     text(0, 'Hello');
 *     text(1, 'Goodbye')
 *     element(2, 'div');
 *   }
 *   if (rf & 2) {
 *     advance(2); // Advance twice to the <div>.
 *     property('title', 'test');
 *   }
 *  }
 * ```
 * @param delta Number of elements to advance forwards by.
 *
 * @codeGenApi
 */
declare function ɵɵadvance(delta?: number): void;

/**
 * Updates the value of or removes a bound attribute on an Element.
 *
 * Used in the case of `[attr.title]="value"`
 *
 * @param name name The name of the attribute.
 * @param value value The attribute is removed when value is `null` or `undefined`.
 *                  Otherwise the attribute value is set to the stringified value.
 * @param sanitizer An optional function used to sanitize the value.
 * @param namespace Optional namespace to use when setting the attribute.
 *
 * @codeGenApi
 */
declare function ɵɵattribute(name: string, value: any, sanitizer?: SanitizerFn | null, namespace?: string): typeof ɵɵattribute;

/**
 *
 * Update an interpolated attribute on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate1('title', 'prefix', v0, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolate1(attrName: string, prefix: string, v0: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolate1;
/**
 *
 * Update an interpolated attribute on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate2('title', 'prefix', v0, '-', v1, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolate2(attrName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolate2;
/**
 *
 * Update an interpolated attribute on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate3(
 * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolate3(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolate3;
/**
 *
 * Update an interpolated attribute on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate4(
 * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolate4(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolate4;
/**
 *
 * Update an interpolated attribute on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate5(
 * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolate5(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolate5;
/**
 *
 * Update an interpolated attribute on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate6(
 *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolate6(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolate6;
/**
 *
 * Update an interpolated attribute on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate7(
 *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolate7(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolate7;
/**
 *
 * Update an interpolated attribute on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a p   roperty has 8 interpolated values in it:
 *
 * ```html
 * <div attr.title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolate8(
 *  'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
 * ```
 *
 * @param attrName The name of the attribute to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolate8(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolate8;
/**
 * Update an interpolated attribute on an element with 9 or more bound values surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵattributeInterpolateV(
 *  'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *
 * @param attrName The name of the attribute to update.
 * @param values The collection of values and the strings in-between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵattributeInterpolateV(attrName: string, values: any[], sanitizer?: SanitizerFn, namespace?: string): typeof ɵɵattributeInterpolateV;

/**
 *
 * Update an interpolated class on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div class="prefix{{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate1('prefix', v0, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolate1(prefix: string, v0: any, suffix: string): void;
/**
 *
 * Update an interpolated class on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate2('prefix', v0, '-', v1, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolate2(prefix: string, v0: any, i0: string, v1: any, suffix: string): void;
/**
 *
 * Update an interpolated class on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate3(
 * 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolate3(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): void;
/**
 *
 * Update an interpolated class on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate4(
 * 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolate4(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string): void;
/**
 *
 * Update an interpolated class on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate5(
 * 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolate5(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string): void;
/**
 *
 * Update an interpolated class on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate6(
 *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolate6(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): void;
/**
 *
 * Update an interpolated class on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate7(
 *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolate7(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): void;
/**
 *
 * Update an interpolated class on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolate8(
 *  'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolate8(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string): void;
/**
 * Update an interpolated class on an element with 9 or more bound values surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  class="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵclassMapInterpolateV(
 *  ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *.
 * @param values The collection of values and the strings in-between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 * @codeGenApi
 */
declare function ɵɵclassMapInterpolateV(values: any[]): void;

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Instruction that returns the component instance in which the current instruction is executing.
 * This is a constant-time version of `nextContent` for the case where we know that we need the
 * component instance specifically, rather than the context of a particular template.
 *
 * @codeGenApi
 */
declare function ɵɵcomponentInstance(): unknown;

/**
 * The conditional instruction represents the basic building block on the runtime side to support
 * built-in "if" and "switch". On the high level this instruction is responsible for adding and
 * removing views selected by a conditional expression.
 *
 * @param matchingTemplateIndex Index of a template TNode representing a conditional view to be
 *     inserted; -1 represents a special case when there is no view to insert.
 * @param contextValue Value that should be exposed as the context of the conditional.
 * @codeGenApi
 */
declare function ɵɵconditional<T>(matchingTemplateIndex: number, contextValue?: T): void;
/**
 * A built-in trackBy function used for situations where users specified collection index as a
 * tracking expression. Having this function body in the runtime avoids unnecessary code generation.
 *
 * @param index
 * @returns
 */
declare function ɵɵrepeaterTrackByIndex(index: number): number;
/**
 * A built-in trackBy function used for situations where users specified collection item reference
 * as a tracking expression. Having this function body in the runtime avoids unnecessary code
 * generation.
 *
 * @param index
 * @returns
 */
declare function ɵɵrepeaterTrackByIdentity<T>(_: number, value: T): T;
/**
 * The repeaterCreate instruction runs in the creation part of the template pass and initializes
 * internal data structures required by the update pass of the built-in repeater logic. Repeater
 * metadata are allocated in the data part of LView with the following layout:
 * - LView[HEADER_OFFSET + index] - metadata
 * - LView[HEADER_OFFSET + index + 1] - reference to a template function rendering an item
 * - LView[HEADER_OFFSET + index + 2] - optional reference to a template function rendering an empty
 * block
 *
 * @param index Index at which to store the metadata of the repeater.
 * @param templateFn Reference to the template of the main repeater block.
 * @param decls The number of nodes, local refs, and pipes for the main block.
 * @param vars The number of bindings for the main block.
 * @param tagName The name of the container element, if applicable
 * @param attrsIndex Index of template attributes in the `consts` array.
 * @param trackByFn Reference to the tracking function.
 * @param trackByUsesComponentInstance Whether the tracking function has any references to the
 *  component instance. If it doesn't, we can avoid rebinding it.
 * @param emptyTemplateFn Reference to the template function of the empty block.
 * @param emptyDecls The number of nodes, local refs, and pipes for the empty block.
 * @param emptyVars The number of bindings for the empty block.
 * @param emptyTagName The name of the empty block container element, if applicable
 * @param emptyAttrsIndex Index of the empty block template attributes in the `consts` array.
 *
 * @codeGenApi
 */
declare function ɵɵrepeaterCreate(index: number, templateFn: ComponentTemplate<unknown>, decls: number, vars: number, tagName: string | null, attrsIndex: number | null, trackByFn: TrackByFunction<unknown>, trackByUsesComponentInstance?: boolean, emptyTemplateFn?: ComponentTemplate<unknown>, emptyDecls?: number, emptyVars?: number, emptyTagName?: string | null, emptyAttrsIndex?: number | null): void;
/**
 * The repeater instruction does update-time diffing of a provided collection (against the
 * collection seen previously) and maps changes in the collection to views structure (by adding,
 * removing or moving views as needed).
 * @param collection - the collection instance to be checked for changes
 * @codeGenApi
 */
declare function ɵɵrepeater(collection: Iterable<unknown> | undefined | null): void;

/**
 * Returns the value associated to the given token from the injectors.
 *
 * `directiveInject` is intended to be used for directive, component and pipe factories.
 *  All other injection use `inject` which does not walk the node injector tree.
 *
 * Usage example (in factory function):
 *
 * ```ts
 * class SomeDirective {
 *   constructor(directive: DirectiveA) {}
 *
 *   static ɵdir = ɵɵdefineDirective({
 *     type: SomeDirective,
 *     factory: () => new SomeDirective(ɵɵdirectiveInject(DirectiveA))
 *   });
 * }
 * ```
 * @param token the type or token to inject
 * @param flags Injection flags
 * @returns the value from the injector or `null` when not found
 *
 * @codeGenApi
 */
declare function ɵɵdirectiveInject<T>(token: ProviderToken<T>): T;
declare function ɵɵdirectiveInject<T>(token: ProviderToken<T>, flags: InjectFlags): T;
/**
 * Throws an error indicating that a factory function could not be generated by the compiler for a
 * particular class.
 *
 * This instruction allows the actual error message to be optimized away when ngDevMode is turned
 * off, saving bytes of generated code while still providing a good experience in dev mode.
 *
 * The name of the class is not mentioned here, but will be in the generated factory function name
 * and thus in the stack trace.
 *
 * @codeGenApi
 */
declare function ɵɵinvalidFactory(): never;

/**
 * Facade for the attribute injection from DI.
 *
 * @codeGenApi
 */
declare function ɵɵinjectAttribute(attrNameToInject: string): string | null;

/**
 * Create DOM element. The instruction must later be followed by `elementEnd()` call.
 *
 * @param index Index of the element in the LView array
 * @param name Name of the DOM Node
 * @param attrsIndex Index of the element's attributes in the `consts` array.
 * @param localRefsIndex Index of the element's local references in the `consts` array.
 * @returns This function returns itself so that it may be chained.
 *
 * Attributes and localRefs are passed as an array of strings where elements with an even index
 * hold an attribute name and elements with an odd index hold an attribute value, ex.:
 * ['id', 'warning5', 'class', 'alert']
 *
 * @codeGenApi
 */
declare function ɵɵelementStart(index: number, name: string, attrsIndex?: number | null, localRefsIndex?: number): typeof ɵɵelementStart;
/**
 * Mark the end of the element.
 * @returns This function returns itself so that it may be chained.
 *
 * @codeGenApi
 */
declare function ɵɵelementEnd(): typeof ɵɵelementEnd;
/**
 * Creates an empty element using {@link elementStart} and {@link elementEnd}
 *
 * @param index Index of the element in the data array
 * @param name Name of the DOM Node
 * @param attrsIndex Index of the element's attributes in the `consts` array.
 * @param localRefsIndex Index of the element's local references in the `consts` array.
 * @returns This function returns itself so that it may be chained.
 *
 * @codeGenApi
 */
declare function ɵɵelement(index: number, name: string, attrsIndex?: number | null, localRefsIndex?: number): typeof ɵɵelement;

/**
 * Creates a logical container for other nodes (<ng-container>) backed by a comment node in the DOM.
 * The instruction must later be followed by `elementContainerEnd()` call.
 *
 * @param index Index of the element in the LView array
 * @param attrsIndex Index of the container attributes in the `consts` array.
 * @param localRefsIndex Index of the container's local references in the `consts` array.
 * @returns This function returns itself so that it may be chained.
 *
 * Even if this instruction accepts a set of attributes no actual attribute values are propagated to
 * the DOM (as a comment node can't have attributes). Attributes are here only for directive
 * matching purposes and setting initial inputs of directives.
 *
 * @codeGenApi
 */
declare function ɵɵelementContainerStart(index: number, attrsIndex?: number | null, localRefsIndex?: number): typeof ɵɵelementContainerStart;
/**
 * Mark the end of the <ng-container>.
 * @returns This function returns itself so that it may be chained.
 *
 * @codeGenApi
 */
declare function ɵɵelementContainerEnd(): typeof ɵɵelementContainerEnd;
/**
 * Creates an empty logical container using {@link elementContainerStart}
 * and {@link elementContainerEnd}
 *
 * @param index Index of the element in the LView array
 * @param attrsIndex Index of the container attributes in the `consts` array.
 * @param localRefsIndex Index of the container's local references in the `consts` array.
 * @returns This function returns itself so that it may be chained.
 *
 * @codeGenApi
 */
declare function ɵɵelementContainer(index: number, attrsIndex?: number | null, localRefsIndex?: number): typeof ɵɵelementContainer;

/**
 * Sets a strict mode for JIT-compiled components to throw an error on unknown elements,
 * instead of just logging the error.
 * (for AOT-compiled ones this check happens at build time).
 */
declare function ɵsetUnknownElementStrictMode(shouldThrow: boolean): void;
/**
 * Gets the current value of the strict mode.
 */
declare function ɵgetUnknownElementStrictMode(): boolean;
/**
 * Sets a strict mode for JIT-compiled components to throw an error on unknown properties,
 * instead of just logging the error.
 * (for AOT-compiled ones this check happens at build time).
 */
declare function ɵsetUnknownPropertyStrictMode(shouldThrow: boolean): void;
/**
 * Gets the current value of the strict mode.
 */
declare function ɵgetUnknownPropertyStrictMode(): boolean;

/**
 * Returns the current OpaqueViewState instance.
 *
 * Used in conjunction with the restoreView() instruction to save a snapshot
 * of the current view and restore it when listeners are invoked. This allows
 * walking the declaration view tree in listeners to get vars from parent views.
 *
 * @codeGenApi
 */
declare function ɵɵgetCurrentView(): OpaqueViewState;

interface NO_CHANGE {
    __brand__: 'NO_CHANGE';
}
/** A special value which designates that a value has not changed. */
declare const NO_CHANGE: NO_CHANGE;

/**
 * Update a property on a host element. Only applies to native node properties, not inputs.
 *
 * Operates on the element selected by index via the {@link select} instruction.
 *
 * @param propName Name of property. Because it is going to DOM, this is not subject to
 *        renaming as part of minification.
 * @param value New value to write.
 * @param sanitizer An optional function used to sanitize the value.
 * @returns This function returns itself so that it may be chained
 * (e.g. `property('name', ctx.name)('title', ctx.title)`)
 *
 * @codeGenApi
 */
declare function ɵɵhostProperty<T>(propName: string, value: T, sanitizer?: SanitizerFn | null): typeof ɵɵhostProperty;
/**
 * Updates a synthetic host binding (e.g. `[@foo]`) on a component or directive.
 *
 * This instruction is for compatibility purposes and is designed to ensure that a
 * synthetic host binding (e.g. `@HostBinding('@foo')`) properly gets rendered in
 * the component's renderer. Normally all host bindings are evaluated with the parent
 * component's renderer, but, in the case of animation @triggers, they need to be
 * evaluated with the sub component's renderer (because that's where the animation
 * triggers are defined).
 *
 * Do not use this instruction as a replacement for `elementProperty`. This instruction
 * only exists to ensure compatibility with the ViewEngine's host binding behavior.
 *
 * @param index The index of the element to update in the data array
 * @param propName Name of property. Because it is going to DOM, this is not subject to
 *        renaming as part of minification.
 * @param value New value to write.
 * @param sanitizer An optional function used to sanitize the value.
 *
 * @codeGenApi
 */
declare function ɵɵsyntheticHostProperty<T>(propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null): typeof ɵɵsyntheticHostProperty;

declare global {
    const ngI18nClosureMode: boolean;
}

/**
 * Marks a block of text as translatable.
 *
 * The instructions `i18nStart` and `i18nEnd` mark the translation block in the template.
 * The translation `message` is the value which is locale specific. The translation string may
 * contain placeholders which associate inner elements and sub-templates within the translation.
 *
 * The translation `message` placeholders are:
 * - `�{index}(:{block})�`: *Binding Placeholder*: Marks a location where an expression will be
 *   interpolated into. The placeholder `index` points to the expression binding index. An optional
 *   `block` that matches the sub-template in which it was declared.
 * - `�#{index}(:{block})�`/`�/#{index}(:{block})�`: *Element Placeholder*:  Marks the beginning
 *   and end of DOM element that were embedded in the original translation block. The placeholder
 *   `index` points to the element index in the template instructions set. An optional `block` that
 *   matches the sub-template in which it was declared.
 * - `�*{index}:{block}�`/`�/*{index}:{block}�`: *Sub-template Placeholder*: Sub-templates must be
 *   split up and translated separately in each angular template function. The `index` points to the
 *   `template` instruction index. A `block` that matches the sub-template in which it was declared.
 *
 * @param index A unique index of the translation in the static block.
 * @param messageIndex An index of the translation message from the `def.consts` array.
 * @param subTemplateIndex Optional sub-template index in the `message`.
 *
 * @codeGenApi
 */
declare function ɵɵi18nStart(index: number, messageIndex: number, subTemplateIndex?: number): void;
/**
 * Translates a translation block marked by `i18nStart` and `i18nEnd`. It inserts the text/ICU nodes
 * into the render tree, moves the placeholder nodes and removes the deleted nodes.
 *
 * @codeGenApi
 */
declare function ɵɵi18nEnd(): void;
/**
 *
 * Use this instruction to create a translation block that doesn't contain any placeholder.
 * It calls both {@link i18nStart} and {@link i18nEnd} in one instruction.
 *
 * The translation `message` is the value which is locale specific. The translation string may
 * contain placeholders which associate inner elements and sub-templates within the translation.
 *
 * The translation `message` placeholders are:
 * - `�{index}(:{block})�`: *Binding Placeholder*: Marks a location where an expression will be
 *   interpolated into. The placeholder `index` points to the expression binding index. An optional
 *   `block` that matches the sub-template in which it was declared.
 * - `�#{index}(:{block})�`/`�/#{index}(:{block})�`: *Element Placeholder*:  Marks the beginning
 *   and end of DOM element that were embedded in the original translation block. The placeholder
 *   `index` points to the element index in the template instructions set. An optional `block` that
 *   matches the sub-template in which it was declared.
 * - `�*{index}:{block}�`/`�/*{index}:{block}�`: *Sub-template Placeholder*: Sub-templates must be
 *   split up and translated separately in each angular template function. The `index` points to the
 *   `template` instruction index. A `block` that matches the sub-template in which it was declared.
 *
 * @param index A unique index of the translation in the static block.
 * @param messageIndex An index of the translation message from the `def.consts` array.
 * @param subTemplateIndex Optional sub-template index in the `message`.
 *
 * @codeGenApi
 */
declare function ɵɵi18n(index: number, messageIndex: number, subTemplateIndex?: number): void;
/**
 * Marks a list of attributes as translatable.
 *
 * @param index A unique index in the static block
 * @param values
 *
 * @codeGenApi
 */
declare function ɵɵi18nAttributes(index: number, attrsIndex: number): void;
/**
 * Stores the values of the bindings during each update cycle in order to determine if we need to
 * update the translated nodes.
 *
 * @param value The binding's value
 * @returns This function returns itself so that it may be chained
 * (e.g. `i18nExp(ctx.name)(ctx.title)`)
 *
 * @codeGenApi
 */
declare function ɵɵi18nExp<T>(value: T): typeof ɵɵi18nExp;
/**
 * Updates a translation block or an i18n attribute when the bindings have changed.
 *
 * @param index Index of either {@link i18nStart} (translation block) or {@link i18nAttributes}
 * (i18n attribute) on which it should update the content.
 *
 * @codeGenApi
 */
declare function ɵɵi18nApply(index: number): void;
/**
 * Handles message string post-processing for internationalization.
 *
 * Handles message string post-processing by transforming it from intermediate
 * format (that might contain some markers that we need to replace) to the final
 * form, consumable by i18nStart instruction. Post processing steps include:
 *
 * 1. Resolve all multi-value cases (like [�*1:1��#2:1�|�#4:1�|�5�])
 * 2. Replace all ICU vars (like "VAR_PLURAL")
 * 3. Replace all placeholders used inside ICUs in a form of {PLACEHOLDER}
 * 4. Replace all ICU references with corresponding values (like �ICU_EXP_ICU_1�)
 *    in case multiple ICUs have the same placeholder name
 *
 * @param message Raw translation string for post processing
 * @param replacements Set of replacements that should be applied
 *
 * @returns Transformed string that can be consumed by i18nStart instruction
 *
 * @codeGenApi
 */
declare function ɵɵi18nPostprocess(message: string, replacements?: {
    [key: string]: string | string[];
}): string;

/**
 * Adds an event listener to the current node.
 *
 * If an output exists on one of the node's directives, it also subscribes to the output
 * and saves the subscription for later cleanup.
 *
 * @param eventName Name of the event
 * @param listenerFn The function to be called when event emits
 * @param useCapture Whether or not to use capture in event listener - this argument is a reminder
 *     from the Renderer3 infrastructure and should be removed from the instruction arguments
 * @param eventTargetResolver Function that returns global target information in case this listener
 * should be attached to a global object like window, document or body
 *
 * @codeGenApi
 */
declare function ɵɵlistener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): typeof ɵɵlistener;
/**
 * Registers a synthetic host listener (e.g. `(@foo.start)`) on a component or directive.
 *
 * This instruction is for compatibility purposes and is designed to ensure that a
 * synthetic host listener (e.g. `@HostListener('@foo.start')`) properly gets rendered
 * in the component's renderer. Normally all host listeners are evaluated with the
 * parent component's renderer, but, in the case of animation @triggers, they need
 * to be evaluated with the sub component's renderer (because that's where the
 * animation triggers are defined).
 *
 * Do not use this instruction as a replacement for `listener`. This instruction
 * only exists to ensure compatibility with the ViewEngine's host binding behavior.
 *
 * @param eventName Name of the event
 * @param listenerFn The function to be called when event emits
 * @param useCapture Whether or not to use capture in event listener
 * @param eventTargetResolver Function that returns global target information in case this listener
 * should be attached to a global object like window, document or body
 *
 * @codeGenApi
 */
declare function ɵɵsyntheticHostListener(eventName: string, listenerFn: (e?: any) => any): typeof ɵɵsyntheticHostListener;

/**
 * Retrieves a context at the level specified and saves it as the global, contextViewData.
 * Will get the next level up if level is not specified.
 *
 * This is used to save contexts of parent views so they can be bound in embedded views, or
 * in conjunction with reference() to bind a ref from a parent view.
 *
 * @param level The relative level of the view from which to grab context compared to contextVewData
 * @returns context
 *
 * @codeGenApi
 */
declare function ɵɵnextContext<T = any>(level?: number): T;

/**
 * Instruction to distribute projectable nodes among <ng-content> occurrences in a given template.
 * It takes all the selectors from the entire component's template and decides where
 * each projected node belongs (it re-distributes nodes among "buckets" where each "bucket" is
 * backed by a selector).
 *
 * This function requires CSS selectors to be provided in 2 forms: parsed (by a compiler) and text,
 * un-parsed form.
 *
 * The parsed form is needed for efficient matching of a node against a given CSS selector.
 * The un-parsed, textual form is needed for support of the ngProjectAs attribute.
 *
 * Having a CSS selector in 2 different formats is not ideal, but alternatives have even more
 * drawbacks:
 * - having only a textual form would require runtime parsing of CSS selectors;
 * - we can't have only a parsed as we can't re-construct textual form from it (as entered by a
 * template author).
 *
 * @param projectionSlots? A collection of projection slots. A projection slot can be based
 *        on a parsed CSS selectors or set to the wildcard selector ("*") in order to match
 *        all nodes which do not match any selector. If not specified, a single wildcard
 *        selector projection slot will be defined.
 *
 * @codeGenApi
 */
declare function ɵɵprojectionDef(projectionSlots?: ProjectionSlots): void;
/**
 * Inserts previously re-distributed projected nodes. This instruction must be preceded by a call
 * to the projectionDef instruction.
 *
 * @param nodeIndex Index of the projection node.
 * @param selectorIndex Index of the slot selector.
 *  - 0 when the selector is `*` (or unspecified as this is the default value),
 *  - 1 based index of the selector from the {@link projectionDef}
 * @param attrs Static attributes set on the `ng-content` node.
 * @param fallbackTemplateFn Template function with fallback content.
 *   Will be rendered if the slot is empty at runtime.
 * @param fallbackDecls Number of declarations in the fallback template.
 * @param fallbackVars Number of variables in the fallback template.
 *
 * @codeGenApi
 */
declare function ɵɵprojection(nodeIndex: number, selectorIndex?: number, attrs?: TAttributes, fallbackTemplateFn?: ComponentTemplate<unknown>, fallbackDecls?: number, fallbackVars?: number): void;

/**
 * Update a property on a selected element.
 *
 * Operates on the element selected by index via the {@link select} instruction.
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled
 *
 * @param propName Name of property. Because it is going to DOM, this is not subject to
 *        renaming as part of minification.
 * @param value New value to write.
 * @param sanitizer An optional function used to sanitize the value.
 * @returns This function returns itself so that it may be chained
 * (e.g. `property('name', ctx.name)('title', ctx.title)`)
 *
 * @codeGenApi
 */
declare function ɵɵproperty<T>(propName: string, value: T, sanitizer?: SanitizerFn | null): typeof ɵɵproperty;

/**
 *
 * Update an interpolated property on an element with a lone bound value
 *
 * Used when the value passed to a property has 1 interpolated value in it, an no additional text
 * surrounds that interpolated value:
 *
 * ```html
 * <div title="{{v0}}"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate('title', v0);
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate(propName: string, v0: any, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate;
/**
 *
 * Update an interpolated property on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div title="prefix{{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate1('title', 'prefix', v0, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate1(propName: string, prefix: string, v0: any, suffix: string, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate1;
/**
 *
 * Update an interpolated property on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate2('title', 'prefix', v0, '-', v1, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate2(propName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate2;
/**
 *
 * Update an interpolated property on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate3(
 * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate3(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate3;
/**
 *
 * Update an interpolated property on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate4(
 * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate4(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate4;
/**
 *
 * Update an interpolated property on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate5(
 * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate5(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate5;
/**
 *
 * Update an interpolated property on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate6(
 *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate6(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate6;
/**
 *
 * Update an interpolated property on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate7(
 *    'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate7(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate7;
/**
 *
 * Update an interpolated property on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolate8(
 *  'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolate8(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string, sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolate8;
/**
 * Update an interpolated property on an element with 9 or more bound values surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  title="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix"></div>
 * ```
 *
 * Its compiled representation is::
 *
 * ```ts
 * ɵɵpropertyInterpolateV(
 *  'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *
 * If the property name also exists as an input property on one of the element's directives,
 * the component property will be set instead of the element property. This check must
 * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled.
 *
 * @param propName The name of the property to update.
 * @param values The collection of values and the strings in between those values, beginning with a
 * string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 * @param sanitizer An optional sanitizer function
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵpropertyInterpolateV(propName: string, values: any[], sanitizer?: SanitizerFn): typeof ɵɵpropertyInterpolateV;

/**
 * Registers a QueryList, associated with a content query, for later refresh (part of a view
 * refresh).
 *
 * @param directiveIndex Current directive index
 * @param predicate The type for which the query will search
 * @param flags Flags associated with the query
 * @param read What to save in the query
 * @returns QueryList<T>
 *
 * @codeGenApi
 */
declare function ɵɵcontentQuery<T>(directiveIndex: number, predicate: ProviderToken<unknown> | string | string[], flags: QueryFlags, read?: any): void;
/**
 * Creates a new view query by initializing internal data structures.
 *
 * @param predicate The type for which the query will search
 * @param flags Flags associated with the query
 * @param read What to save in the query
 *
 * @codeGenApi
 */
declare function ɵɵviewQuery<T>(predicate: ProviderToken<unknown> | string | string[], flags: QueryFlags, read?: any): void;
/**
 * Refreshes a query by combining matches from all active views and removing matches from deleted
 * views.
 *
 * @returns `true` if a query got dirty during change detection or if this is a static query
 * resolving in creation mode, `false` otherwise.
 *
 * @codeGenApi
 */
declare function ɵɵqueryRefresh(queryList: QueryList<any>): boolean;
/**
 * Loads a QueryList corresponding to the current view or content query.
 *
 * @codeGenApi
 */
declare function ɵɵloadQuery<T>(): QueryList<T>;

/**
 * Creates a new content query and binds it to a signal created by an authoring function.
 *
 * @param directiveIndex Current directive index
 * @param target The target signal to which the query should be bound
 * @param predicate The type for which the query will search
 * @param flags Flags associated with the query
 * @param read What to save in the query
 *
 * @codeGenApi
 */
declare function ɵɵcontentQuerySignal<T>(directiveIndex: number, target: Signal<T>, predicate: ProviderToken<unknown> | string[], flags: QueryFlags, read?: any): void;
/**
 * Creates a new view query by initializing internal data structures and binding a new query to the
 * target signal.
 *
 * @param target The target signal to assign the query results to.
 * @param predicate The type or label that should match a given query
 * @param flags Flags associated with the query
 * @param read What to save in the query
 *
 * @codeGenApi
 */
declare function ɵɵviewQuerySignal(target: Signal<unknown>, predicate: ProviderToken<unknown> | string[], flags: QueryFlags, read?: ProviderToken<unknown>): void;
/**
 * Advances the current query index by a specified offset.
 *
 * Adjusting the current query index is necessary in cases where a given directive has a mix of
 * zone-based and signal-based queries. The signal-based queries don't require tracking of the
 * current index (those are refreshed on demand and not during change detection) so this instruction
 * is only necessary for backward-compatibility.
 *
 * @param index offset to apply to the current query index (defaults to 1)
 *
 * @codeGenApi
 */
declare function ɵɵqueryAdvance(indexOffset?: number): void;

/**
 * Retrieves a local reference from the current contextViewData.
 *
 * If the reference to retrieve is in a parent view, this instruction is used in conjunction
 * with a nextContext() call, which walks up the tree and updates the contextViewData instance.
 *
 * @param index The index of the local ref in contextViewData.
 *
 * @codeGenApi
 */
declare function ɵɵreference<T>(index: number): T;

/**
 *
 * Update an interpolated style on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div style="key: {{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate1('key: ', v0, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolate1(prefix: string, v0: any, suffix: string): void;
/**
 *
 * Update an interpolated style on an element with 2 bound values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate2('key: ', v0, '; key1: ', v1, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolate2(prefix: string, v0: any, i0: string, v1: any, suffix: string): void;
/**
 *
 * Update an interpolated style on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key2: {{v1}}; key2: {{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate3(
 *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolate3(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): void;
/**
 *
 * Update an interpolated style on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate4(
 *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolate4(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string): void;
/**
 *
 * Update an interpolated style on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate5(
 *     'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolate5(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string): void;
/**
 *
 * Update an interpolated style on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}};
 *             key5: {{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate6(
 *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,
 *    'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolate6(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): void;
/**
 *
 * Update an interpolated style on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};
 *             key6: {{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate7(
 *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,
 *    '; key6: ', v6, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolate7(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): void;
/**
 *
 * Update an interpolated style on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div style="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};
 *             key6: {{v6}}; key7: {{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolate8(
 *    'key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,
 *    '; key6: ', v6, '; key7: ', v7, 'suffix');
 * ```
 *
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolate8(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string): void;
/**
 * Update an interpolated style on an element with 9 or more bound values surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  class="key: {{v0}}; key1: {{v1}}; key2: {{v2}}; key3: {{v3}}; key4: {{v4}}; key5: {{v5}};
 *         key6: {{v6}}; key7: {{v7}}; key8: {{v8}}; key9: {{v9}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstyleMapInterpolateV(
 *    ['key: ', v0, '; key1: ', v1, '; key2: ', v2, '; key3: ', v3, '; key4: ', v4, '; key5: ', v5,
 *     '; key6: ', v6, '; key7: ', v7, '; key8: ', v8, '; key9: ', v9, 'suffix']);
 * ```
 *.
 * @param values The collection of values and the strings in-between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '; key2: ', value1, '; key2: ', value2, ..., value99, 'suffix']`)
 * @codeGenApi
 */
declare function ɵɵstyleMapInterpolateV(values: any[]): void;

/**
 *
 * Update an interpolated style property on an element with single bound value surrounded by text.
 *
 * Used when the value passed to a property has 1 interpolated value in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate1(0, 'prefix', v0, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolate1(prop: string, prefix: string, v0: any, suffix: string, valueSuffix?: string | null): typeof ɵɵstylePropInterpolate1;
/**
 *
 * Update an interpolated style property on an element with 2 bound    values surrounded by text.
 *
 * Used when the value passed to a property has 2 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate2(0, 'prefix', v0, '-', v1, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolate2(prop: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, valueSuffix?: string | null): typeof ɵɵstylePropInterpolate2;
/**
 *
 * Update an interpolated style property on an element with 3 bound values surrounded by text.
 *
 * Used when the value passed to a property has 3 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate3(0, 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolate3(prop: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string, valueSuffix?: string | null): typeof ɵɵstylePropInterpolate3;
/**
 *
 * Update an interpolated style property on an element with 4 bound values surrounded by text.
 *
 * Used when the value passed to a property has 4 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate4(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolate4(prop: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string, valueSuffix?: string | null): typeof ɵɵstylePropInterpolate4;
/**
 *
 * Update an interpolated style property on an element with 5 bound values surrounded by text.
 *
 * Used when the value passed to a property has 5 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate5(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolate5(prop: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string, valueSuffix?: string | null): typeof ɵɵstylePropInterpolate5;
/**
 *
 * Update an interpolated style property on an element with 6 bound values surrounded by text.
 *
 * Used when the value passed to a property has 6 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate6(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolate6(prop: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, valueSuffix?: string | null): typeof ɵɵstylePropInterpolate6;
/**
 *
 * Update an interpolated style property on an element with 7 bound values surrounded by text.
 *
 * Used when the value passed to a property has 7 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate7(
 *    0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolate7(prop: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, valueSuffix?: string | null): typeof ɵɵstylePropInterpolate7;
/**
 *
 * Update an interpolated style property on an element with 8 bound values surrounded by text.
 *
 * Used when the value passed to a property has 8 interpolated values in it:
 *
 * ```html
 * <div style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix"></div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolate8(0, 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6,
 * '-', v7, 'suffix');
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`.
 * @param prefix Static value used for concatenation only.
 * @param v0 Value checked for change.
 * @param i0 Static value used for concatenation only.
 * @param v1 Value checked for change.
 * @param i1 Static value used for concatenation only.
 * @param v2 Value checked for change.
 * @param i2 Static value used for concatenation only.
 * @param v3 Value checked for change.
 * @param i3 Static value used for concatenation only.
 * @param v4 Value checked for change.
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change.
 * @param i5 Static value used for concatenation only.
 * @param v6 Value checked for change.
 * @param i6 Static value used for concatenation only.
 * @param v7 Value checked for change.
 * @param suffix Static value used for concatenation only.
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolate8(prop: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string, valueSuffix?: string | null): typeof ɵɵstylePropInterpolate8;
/**
 * Update an interpolated style property on an element with 9 or more bound values surrounded by
 * text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div
 *  style.color="prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix">
 * </div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵstylePropInterpolateV(
 *  0, ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *
 * @param styleIndex Index of style to update. This index value refers to the
 *        index of the style in the style bindings array that was passed into
 *        `styling`..
 * @param values The collection of values and the strings in-between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 * @param valueSuffix Optional suffix. Used with scalar values to add unit such as `px`.
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵstylePropInterpolateV(prop: string, values: any[], valueSuffix?: string | null): typeof ɵɵstylePropInterpolateV;

/**
 * Update a style binding on an element with the provided value.
 *
 * If the style value is falsy then it will be removed from the element
 * (or assigned a different value depending if there are any styles placed
 * on the element with `styleMap` or any static styles that are
 * present from when the element was created with `styling`).
 *
 * Note that the styling element is updated as part of `stylingApply`.
 *
 * @param prop A valid CSS property.
 * @param value New value to write (`null` or an empty string to remove).
 * @param suffix Optional suffix. Used with scalar values to add unit such as `px`.
 *
 * Note that this will apply the provided style value to the host element if this function is called
 * within a host binding function.
 *
 * @codeGenApi
 */
declare function ɵɵstyleProp(prop: string, value: string | number | SafeValue | undefined | null, suffix?: string | null): typeof ɵɵstyleProp;
/**
 * Update a class binding on an element with the provided value.
 *
 * This instruction is meant to handle the `[class.foo]="exp"` case and,
 * therefore, the class binding itself must already be allocated using
 * `styling` within the creation block.
 *
 * @param prop A valid CSS class (only one).
 * @param value A true/false value which will turn the class on or off.
 *
 * Note that this will apply the provided class value to the host element if this function
 * is called within a host binding function.
 *
 * @codeGenApi
 */
declare function ɵɵclassProp(className: string, value: boolean | undefined | null): typeof ɵɵclassProp;
/**
 * Update style bindings using an object literal on an element.
 *
 * This instruction is meant to apply styling via the `[style]="exp"` template bindings.
 * When styles are applied to the element they will then be updated with respect to
 * any styles/classes set via `styleProp`. If any styles are set to falsy
 * then they will be removed from the element.
 *
 * Note that the styling instruction will not be applied until `stylingApply` is called.
 *
 * @param styles A key/value style map of the styles that will be applied to the given element.
 *        Any missing styles (that have already been applied to the element beforehand) will be
 *        removed (unset) from the element's styling.
 *
 * Note that this will apply the provided styleMap value to the host element if this function
 * is called within a host binding.
 *
 * @codeGenApi
 */
declare function ɵɵstyleMap(styles: {
    [styleName: string]: any;
} | string | undefined | null): void;
/**
 * Update class bindings using an object literal or class-string on an element.
 *
 * This instruction is meant to apply styling via the `[class]="exp"` template bindings.
 * When classes are applied to the element they will then be updated with
 * respect to any styles/classes set via `classProp`. If any
 * classes are set to falsy then they will be removed from the element.
 *
 * Note that the styling instruction will not be applied until `stylingApply` is called.
 * Note that this will the provided classMap value to the host element if this function is called
 * within a host binding.
 *
 * @param classes A key/value map or string of CSS classes that will be added to the
 *        given element. Any missing classes (that have already been applied to the element
 *        beforehand) will be removed (unset) from the element's list of CSS classes.
 *
 * @codeGenApi
 */
declare function ɵɵclassMap(classes: {
    [className: string]: boolean | undefined | null;
} | string | undefined | null): void;

/**
 * Creates an LContainer for an ng-template (dynamically-inserted view), e.g.
 *
 * <ng-template #foo>
 *    <div></div>
 * </ng-template>
 *
 * @param index The index of the container in the data array
 * @param templateFn Inline template
 * @param decls The number of nodes, local refs, and pipes for this template
 * @param vars The number of bindings for this template
 * @param tagName The name of the container element, if applicable
 * @param attrsIndex Index of template attributes in the `consts` array.
 * @param localRefs Index of the local references in the `consts` array.
 * @param localRefExtractor A function which extracts local-refs values from the template.
 *        Defaults to the current element associated with the local-ref.
 *
 * @codeGenApi
 */
declare function ɵɵtemplate(index: number, templateFn: ComponentTemplate<any> | null, decls: number, vars: number, tagName?: string | null, attrsIndex?: number | null, localRefsIndex?: number | null, localRefExtractor?: LocalRefExtractor): typeof ɵɵtemplate;

/**
 * Create static text node
 *
 * @param index Index of the node in the data array
 * @param value Static string value to write.
 *
 * @codeGenApi
 */
declare function ɵɵtext(index: number, value?: string): void;

/**
 *
 * Update text content with a lone bound value
 *
 * Used when a text node has 1 interpolated value in it, an no additional text
 * surrounds that interpolated value:
 *
 * ```html
 * <div>{{v0}}</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate(v0);
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate(v0: any): typeof ɵɵtextInterpolate;
/**
 *
 * Update text content with single bound value surrounded by other text.
 *
 * Used when a text node has 1 interpolated value in it:
 *
 * ```html
 * <div>prefix{{v0}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate1('prefix', v0, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate1(prefix: string, v0: any, suffix: string): typeof ɵɵtextInterpolate1;
/**
 *
 * Update text content with 2 bound values surrounded by other text.
 *
 * Used when a text node has 2 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate2('prefix', v0, '-', v1, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate2(prefix: string, v0: any, i0: string, v1: any, suffix: string): typeof ɵɵtextInterpolate2;
/**
 *
 * Update text content with 3 bound values surrounded by other text.
 *
 * Used when a text node has 3 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate3(
 * 'prefix', v0, '-', v1, '-', v2, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate3(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): typeof ɵɵtextInterpolate3;
/**
 *
 * Update text content with 4 bound values surrounded by other text.
 *
 * Used when a text node has 4 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate4(
 * 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see ɵɵtextInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate4(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string): typeof ɵɵtextInterpolate4;
/**
 *
 * Update text content with 5 bound values surrounded by other text.
 *
 * Used when a text node has 5 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate5(
 * 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate5(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string): typeof ɵɵtextInterpolate5;
/**
 *
 * Update text content with 6 bound values surrounded by other text.
 *
 * Used when a text node has 6 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate6(
 *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
 * ```
 *
 * @param i4 Static value used for concatenation only.
 * @param v5 Value checked for change. @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate6(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): typeof ɵɵtextInterpolate6;
/**
 *
 * Update text content with 7 bound values surrounded by other text.
 *
 * Used when a text node has 7 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate7(
 *    'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate7(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): typeof ɵɵtextInterpolate7;
/**
 *
 * Update text content with 8 bound values surrounded by other text.
 *
 * Used when a text node has 8 interpolated values in it:
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolate8(
 *  'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
 * ```
 * @returns itself, so that it may be chained.
 * @see textInterpolateV
 * @codeGenApi
 */
declare function ɵɵtextInterpolate8(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string): typeof ɵɵtextInterpolate8;
/**
 * Update text content with 9 or more bound values other surrounded by text.
 *
 * Used when the number of interpolated values exceeds 8.
 *
 * ```html
 * <div>prefix{{v0}}-{{v1}}-{{v2}}-{{v3}}-{{v4}}-{{v5}}-{{v6}}-{{v7}}-{{v8}}-{{v9}}suffix</div>
 * ```
 *
 * Its compiled representation is:
 *
 * ```ts
 * ɵɵtextInterpolateV(
 *  ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
 *  'suffix']);
 * ```
 *.
 * @param values The collection of values and the strings in between those values, beginning with
 * a string prefix and ending with a string suffix.
 * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
 *
 * @returns itself, so that it may be chained.
 * @codeGenApi
 */
declare function ɵɵtextInterpolateV(values: any[]): typeof ɵɵtextInterpolateV;

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

/**
 * Update a two-way bound property on a selected element.
 *
 * Operates on the element selected by index via the {@link select} instruction.
 *
 * @param propName Name of property.
 * @param value New value to write.
 * @param sanitizer An optional function used to sanitize the value.
 * @returns This function returns itself so that it may be chained
 * (e.g. `twoWayProperty('name', ctx.name)('title', ctx.title)`)
 *
 * @codeGenApi
 */
declare function ɵɵtwoWayProperty<T>(propName: string, value: T | WritableSignal<T>, sanitizer?: SanitizerFn | null): typeof ɵɵtwoWayProperty;
/**
 * Function used inside two-way listeners to conditionally set the value of the bound expression.
 *
 * @param target Field on which to set the value.
 * @param value Value to be set to the field.
 *
 * @codeGenApi
 */
declare function ɵɵtwoWayBindingSet<T>(target: unknown, value: T): boolean;
/**
 * Adds an event listener that updates a two-way binding to the current node.
 *
 * @param eventName Name of the event.
 * @param listenerFn The function to be called when event emits.
 *
 * @codeGenApi
 */
declare function ɵɵtwoWayListener(eventName: string, listenerFn: (e?: any) => any): typeof ɵɵtwoWayListener;

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Declares an `@let` at a specific data slot. Returns itself to allow chaining.
 *
 * @param index Index at which to declare the `@let`.
 *
 * @codeGenApi
 */
declare function ɵɵdeclareLet(index: number): typeof ɵɵdeclareLet;
/**
 * Instruction that stores the value of a `@let` declaration on the current view.
 * Returns the value to allow usage inside variable initializers.
 *
 * @codeGenApi
 */
declare function ɵɵstoreLet<T>(value: T): T;
/**
 * Retrieves the value of a `@let` declaration defined in a parent view.
 *
 * @param index Index of the declaration within the view.
 *
 * @codeGenApi
 */
declare function ɵɵreadContextLet<T>(index: number): T;

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Sets the location within the source template at which
 * each element in the current view was defined.
 *
 * @param index Index at which the DOM node was created.
 * @param templatePath Path to the template at which the node was defined.
 * @param locations Element locations to which to attach the source location.
 *
 * @codeGenApi
 */
declare function ɵɵattachSourceLocations(templatePath: string, locations: [index: number, offset: number, line: number, column: number][]): void;

/**
 * Create a pipe.
 *
 * @param index Pipe index where the pipe will be stored.
 * @param pipeName The name of the pipe
 * @returns T the instance of the pipe.
 *
 * @codeGenApi
 */
declare function ɵɵpipe(index: number, pipeName: string): any;
/**
 * Invokes a pipe with 1 arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param offset the binding offset
 * @param v1 1st argument to {@link PipeTransform#transform}.
 *
 * @codeGenApi
 */
declare function ɵɵpipeBind1(index: number, offset: number, v1: any): any;
/**
 * Invokes a pipe with 2 arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param slotOffset the offset in the reserved slot space
 * @param v1 1st argument to {@link PipeTransform#transform}.
 * @param v2 2nd argument to {@link PipeTransform#transform}.
 *
 * @codeGenApi
 */
declare function ɵɵpipeBind2(index: number, slotOffset: number, v1: any, v2: any): any;
/**
 * Invokes a pipe with 3 arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param slotOffset the offset in the reserved slot space
 * @param v1 1st argument to {@link PipeTransform#transform}.
 * @param v2 2nd argument to {@link PipeTransform#transform}.
 * @param v3 4rd argument to {@link PipeTransform#transform}.
 *
 * @codeGenApi
 */
declare function ɵɵpipeBind3(index: number, slotOffset: number, v1: any, v2: any, v3: any): any;
/**
 * Invokes a pipe with 4 arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param slotOffset the offset in the reserved slot space
 * @param v1 1st argument to {@link PipeTransform#transform}.
 * @param v2 2nd argument to {@link PipeTransform#transform}.
 * @param v3 3rd argument to {@link PipeTransform#transform}.
 * @param v4 4th argument to {@link PipeTransform#transform}.
 *
 * @codeGenApi
 */
declare function ɵɵpipeBind4(index: number, slotOffset: number, v1: any, v2: any, v3: any, v4: any): any;
/**
 * Invokes a pipe with variable number of arguments.
 *
 * This instruction acts as a guard to {@link PipeTransform#transform} invoking
 * the pipe only when an input to the pipe changes.
 *
 * @param index Pipe index where the pipe was stored on creation.
 * @param slotOffset the offset in the reserved slot space
 * @param values Array of arguments to pass to {@link PipeTransform#transform} method.
 *
 * @codeGenApi
 */
declare function ɵɵpipeBindV(index: number, slotOffset: number, values: [any, ...any[]]): any;

/**
 * Bindings for pure functions are stored after regular bindings.
 *
 * |-------decls------|---------vars---------|                 |----- hostVars (dir1) ------|
 * ------------------------------------------------------------------------------------------
 * | nodes/refs/pipes | bindings | fn slots  | injector | dir1 | host bindings | host slots |
 * ------------------------------------------------------------------------------------------
 *                    ^                      ^
 *      TView.bindingStartIndex      TView.expandoStartIndex
 *
 * Pure function instructions are given an offset from the binding root. Adding the offset to the
 * binding root gives the first index where the bindings are stored. In component views, the binding
 * root is the bindingStartIndex. In host bindings, the binding root is the expandoStartIndex +
 * any directive instances + any hostVars in directives evaluated before it.
 *
 * See VIEW_DATA.md for more information about host binding resolution.
 */
/**
 * If the value hasn't been saved, calls the pure function to store and return the
 * value. If it has been saved, returns the saved value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn Function that returns a value
 * @param thisArg Optional calling context of pureFn
 * @returns value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction0<T>(slotOffset: number, pureFn: () => T, thisArg?: any): T;
/**
 * If the value of the provided exp has changed, calls the pure function to return
 * an updated value. Or if the value has not changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn Function that returns an updated value
 * @param exp Updated expression value
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction1(slotOffset: number, pureFn: (v: any) => any, exp: any, thisArg?: any): any;
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction2(slotOffset: number, pureFn: (v1: any, v2: any) => any, exp1: any, exp2: any, thisArg?: any): any;
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction3(slotOffset: number, pureFn: (v1: any, v2: any, v3: any) => any, exp1: any, exp2: any, exp3: any, thisArg?: any): any;
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction4(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, thisArg?: any): any;
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param exp5
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction5(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, thisArg?: any): any;
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param exp5
 * @param exp6
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction6(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, thisArg?: any): any;
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param exp5
 * @param exp6
 * @param exp7
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction7(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, thisArg?: any): any;
/**
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn
 * @param exp1
 * @param exp2
 * @param exp3
 * @param exp4
 * @param exp5
 * @param exp6
 * @param exp7
 * @param exp8
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunction8(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any, v8: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, exp8: any, thisArg?: any): any;
/**
 * pureFunction instruction that can support any number of bindings.
 *
 * If the value of any provided exp has changed, calls the pure function to return
 * an updated value. Or if no values have changed, returns cached value.
 *
 * @param slotOffset the offset from binding root to the reserved slot
 * @param pureFn A pure function that takes binding values and builds an object or array
 * containing those values.
 * @param exps An array of binding values
 * @param thisArg Optional calling context of pureFn
 * @returns Updated or cached value
 *
 * @codeGenApi
 */
declare function ɵɵpureFunctionV(slotOffset: number, pureFn: (...v: any[]) => any, exps: any[], thisArg?: any): any;

/**
 *
 * @codeGenApi
 */
declare function ɵɵresolveWindow(element: RElement & {
    ownerDocument: Document;
}): (Window & typeof globalThis) | null;
/**
 *
 * @codeGenApi
 */
declare function ɵɵresolveDocument(element: RElement & {
    ownerDocument: Document;
}): Document;
/**
 *
 * @codeGenApi
 */
declare function ɵɵresolveBody(element: RElement & {
    ownerDocument: Document;
}): HTMLElement;

/**
 * Retrieves `TemplateRef` instance from `Injector` when a local reference is placed on the
 * `<ng-template>` element.
 *
 * @codeGenApi
 */
declare function ɵɵtemplateRefExtractor(tNode: TNode, lView: LView): TemplateRef<any> | null;

declare function ɵɵgetComponentDepsFactory(type: ComponentType<any>, rawImports?: RawScopeInfoFromDecorator[]): () => DependencyTypeList;

/**
 * Sets the debug info for an Angular class.
 *
 * This runtime is guarded by ngDevMode flag.
 */
declare function ɵsetClassDebugInfo(type: Type$1<any>, debugInfo: ClassDebugInfo): void;

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

/** Represents `import.meta` plus some information that's not in the built-in types. */
type ImportMetaExtended = ImportMeta & {
    hot?: {
        send?: (name: string, payload: unknown) => void;
    };
};
/**
 * Gets the URL from which the client will fetch a new version of a component's metadata so it
 * can be replaced during hot module reloading.
 * @param id Unique ID for the component, generated during compile time.
 * @param timestamp Time at which the request happened.
 * @param base Base URL against which to resolve relative paths.
 * @codeGenApi
 */
declare function ɵɵgetReplaceMetadataURL(id: string, timestamp: string, base: string): string;
/**
 * Replaces the metadata of a component type and re-renders all live instances of the component.
 * @param type Class whose metadata will be replaced.
 * @param applyMetadata Callback that will apply a new set of metadata on the `type` when invoked.
 * @param environment Syntehtic namespace imports that need to be passed along to the callback.
 * @param locals Local symbols from the source location that have to be exposed to the callback.
 * @param importMeta `import.meta` from the call site of the replacement function. Optional since
 *   it isn't used internally.
 * @param id ID to the class being replaced. **Not** the same as the component definition ID.
 *   Optional since the ID might not be available internally.
 * @codeGenApi
 */
declare function ɵɵreplaceMetadata(type: Type$1<unknown>, applyMetadata: (...args: [Type$1<unknown>, unknown[], ...unknown[]]) => void, namespaces: unknown[], locals: unknown[], importMeta?: ImportMetaExtended | null, id?: string | null): void;

/** Store a value in the `data` at a given `index`. */
declare function store<T>(tView: TView, lView: LView, index: number, value: T): void;

type Type = Function;
type OpaqueValue = unknown;
declare enum FactoryTarget {
    Directive = 0,
    Component = 1,
    Injectable = 2,
    Pipe = 3,
    NgModule = 4
}
interface R3DeclareDependencyMetadataFacade {
    token: OpaqueValue;
    attribute?: boolean;
    host?: boolean;
    optional?: boolean;
    self?: boolean;
    skipSelf?: boolean;
}
interface R3HostDirectiveMetadataFacade {
    directive: Type;
    inputs?: string[];
    outputs?: string[];
}
type LegacyInputPartialMapping = string | [bindingPropertyName: string, classPropertyName: string, transformFunction?: Function];
interface R3DeclareDirectiveFacade {
    selector?: string;
    type: Type;
    version: string;
    inputs?: {
        [fieldName: string]: {
            classPropertyName: string;
            publicName: string;
            isSignal: boolean;
            isRequired: boolean;
            transformFunction: Function | null;
        } | LegacyInputPartialMapping;
    };
    outputs?: {
        [classPropertyName: string]: string;
    };
    host?: {
        attributes?: {
            [key: string]: OpaqueValue;
        };
        listeners?: {
            [key: string]: string;
        };
        properties?: {
            [key: string]: string;
        };
        classAttribute?: string;
        styleAttribute?: string;
    };
    queries?: R3DeclareQueryMetadataFacade[];
    viewQueries?: R3DeclareQueryMetadataFacade[];
    providers?: OpaqueValue;
    exportAs?: string[];
    usesInheritance?: boolean;
    usesOnChanges?: boolean;
    isStandalone?: boolean;
    hostDirectives?: R3HostDirectiveMetadataFacade[] | null;
    isSignal?: boolean;
}
interface R3DeclareComponentFacade extends R3DeclareDirectiveFacade {
    template: string;
    isInline?: boolean;
    styles?: string[];
    dependencies?: R3DeclareTemplateDependencyFacade[];
    components?: R3DeclareDirectiveDependencyFacade[];
    directives?: R3DeclareDirectiveDependencyFacade[];
    pipes?: {
        [pipeName: string]: OpaqueValue | (() => OpaqueValue);
    };
    deferBlockDependencies?: (() => Promise<Type> | null)[];
    viewProviders?: OpaqueValue;
    animations?: OpaqueValue;
    changeDetection?: ChangeDetectionStrategy;
    encapsulation?: ViewEncapsulation;
    interpolation?: [string, string];
    preserveWhitespaces?: boolean;
}
type R3DeclareTemplateDependencyFacade = {
    kind: string;
} & (R3DeclareDirectiveDependencyFacade | R3DeclarePipeDependencyFacade | R3DeclareNgModuleDependencyFacade);
interface R3DeclareDirectiveDependencyFacade {
    kind?: 'directive' | 'component';
    selector: string;
    type: OpaqueValue | (() => OpaqueValue);
    inputs?: string[];
    outputs?: string[];
    exportAs?: string[];
}
interface R3DeclarePipeDependencyFacade {
    kind?: 'pipe';
    name: string;
    type: OpaqueValue | (() => OpaqueValue);
}
interface R3DeclareNgModuleDependencyFacade {
    kind: 'ngmodule';
    type: OpaqueValue | (() => OpaqueValue);
}
interface R3DeclareFactoryFacade {
    type: Type;
    deps: R3DeclareDependencyMetadataFacade[] | 'invalid' | null;
    target: FactoryTarget;
}
interface R3DeclareInjectableFacade {
    type: Type;
    providedIn?: Type | 'root' | 'platform' | 'any' | null;
    useClass?: OpaqueValue;
    useFactory?: OpaqueValue;
    useExisting?: OpaqueValue;
    useValue?: OpaqueValue;
    deps?: R3DeclareDependencyMetadataFacade[];
}
declare enum ViewEncapsulation {
    Emulated = 0,
    None = 2,
    ShadowDom = 3
}
type ChangeDetectionStrategy = number;
interface R3DeclareQueryMetadataFacade {
    propertyName: string;
    first?: boolean;
    predicate: OpaqueValue | string[];
    descendants?: boolean;
    read?: OpaqueValue;
    static?: boolean;
    emitDistinctChangesOnly?: boolean;
    isSignal?: boolean;
}
interface R3DeclareInjectorFacade {
    type: Type;
    imports?: OpaqueValue[];
    providers?: OpaqueValue[];
}
interface R3DeclareNgModuleFacade {
    type: Type;
    bootstrap?: OpaqueValue[] | (() => OpaqueValue[]);
    declarations?: OpaqueValue[] | (() => OpaqueValue[]);
    imports?: OpaqueValue[] | (() => OpaqueValue[]);
    exports?: OpaqueValue[] | (() => OpaqueValue[]);
    schemas?: OpaqueValue[];
    id?: OpaqueValue;
}
interface R3DeclarePipeFacade {
    type: Type;
    name: string;
    version: string;
    pure?: boolean;
    isStandalone?: boolean;
}

/**
 * Compile an Angular component according to its decorator metadata, and patch the resulting
 * component def (ɵcmp) onto the component type.
 *
 * Compilation may be asynchronous (due to the need to resolve URLs for the component template or
 * other resources, for example). In the event that compilation is not immediate, `compileComponent`
 * will enqueue resource resolution into a global queue and will fail to return the `ɵcmp`
 * until the global queue has been resolved with a call to `resolveComponentResources`.
 */
declare function compileComponent(type: Type$1<any>, metadata: Component): void;
/**
 * Compile an Angular directive according to its decorator metadata, and patch the resulting
 * directive def onto the component type.
 *
 * In the event that compilation is not immediate, `compileDirective` will return a `Promise` which
 * will resolve when compilation completes and the directive becomes usable.
 */
declare function compileDirective(type: Type$1<any>, directive: Directive | null): void;

declare function resetJitOptions(): void;

/**
 * Loops over queued module definitions, if a given module definition has all of its
 * declarations resolved, it dequeues that module definition and sets the scope on
 * its declarations.
 */
declare function flushModuleScopingQueueAsMuchAsPossible(): void;
/**
 * Compiles a module in JIT mode.
 *
 * This function automatically gets called when a class has a `@NgModule` decorator.
 */
declare function compileNgModule(moduleType: Type$1<any>, ngModule?: NgModule): void;
/**
 * Compiles and adds the `ɵmod`, `ɵfac` and `ɵinj` properties to the module class.
 *
 * It's possible to compile a module via this API which will allow duplicate declarations in its
 * root.
 */
declare function compileNgModuleDefs(moduleType: NgModuleType, ngModule: NgModule, allowDuplicateDeclarationsInRoot?: boolean): void;
declare function generateStandaloneInDeclarationsError(type: Type$1<any>, location: string): string;
declare function resetCompiledComponents(): void;
/**
 * Patch the definition of a component with directives and pipes from the compilation scope of
 * a given module.
 */
declare function patchComponentDefWithScope<C>(componentDef: ComponentDef<C>, transitiveScopes: NgModuleTransitiveScopes): void;
/**
 * Compute the pair of transitive scopes (compilation scope and exported scope) for a given type
 * (either a NgModule or a standalone component / directive / pipe).
 */
declare function transitiveScopesFor<T>(type: Type$1<T>): NgModuleTransitiveScopes;

/**
 * Compiles a partial directive declaration object into a full directive definition object.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclareDirective(decl: R3DeclareDirectiveFacade): unknown;
/**
 * Evaluates the class metadata declaration.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclareClassMetadata(decl: {
    type: Type$1<any>;
    decorators: any[];
    ctorParameters?: () => any[];
    propDecorators?: {
        [field: string]: any;
    };
}): void;
/**
 * Evaluates the class metadata of a component that contains deferred blocks.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclareClassMetadataAsync(decl: {
    type: Type$1<any>;
    resolveDeferredDeps: () => Promise<Type$1<unknown>>[];
    resolveMetadata: (...types: Type$1<unknown>[]) => {
        decorators: any[];
        ctorParameters: (() => any[]) | null;
        propDecorators: {
            [field: string]: any;
        } | null;
    };
}): void;
/**
 * Compiles a partial component declaration object into a full component definition object.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclareComponent(decl: R3DeclareComponentFacade): unknown;
/**
 * Compiles a partial pipe declaration object into a full pipe definition object.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclareFactory(decl: R3DeclareFactoryFacade): unknown;
/**
 * Compiles a partial injectable declaration object into a full injectable definition object.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclareInjectable(decl: R3DeclareInjectableFacade): unknown;

/**
 * Compiles a partial injector declaration object into a full injector definition object.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclareInjector(decl: R3DeclareInjectorFacade): unknown;
/**
 * Compiles a partial NgModule declaration object into a full NgModule definition object.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclareNgModule(decl: R3DeclareNgModuleFacade): unknown;
/**
 * Compiles a partial pipe declaration object into a full pipe definition object.
 *
 * @codeGenApi
 */
declare function ɵɵngDeclarePipe(decl: R3DeclarePipeFacade): unknown;

declare function compilePipe(type: Type$1<any>, meta: Pipe): void;

declare function isNgModule<T>(value: Type$1<T>): value is Type$1<T> & {
    ɵmod: NgModuleDef<T>;
};

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Profiler events is an enum used by the profiler to distinguish between different calls of user
 * code invoked throughout the application lifecycle.
 */
declare const enum ProfilerEvent {
    /**
     * Corresponds to the point in time before the runtime has called the template function of a
     * component with `RenderFlags.Create`.
     */
    TemplateCreateStart = 0,
    /**
     * Corresponds to the point in time after the runtime has called the template function of a
     * component with `RenderFlags.Create`.
     */
    TemplateCreateEnd = 1,
    /**
     * Corresponds to the point in time before the runtime has called the template function of a
     * component with `RenderFlags.Update`.
     */
    TemplateUpdateStart = 2,
    /**
     * Corresponds to the point in time after the runtime has called the template function of a
     * component with `RenderFlags.Update`.
     */
    TemplateUpdateEnd = 3,
    /**
     * Corresponds to the point in time before the runtime has called a lifecycle hook of a component
     * or directive.
     */
    LifecycleHookStart = 4,
    /**
     * Corresponds to the point in time after the runtime has called a lifecycle hook of a component
     * or directive.
     */
    LifecycleHookEnd = 5,
    /**
     * Corresponds to the point in time before the runtime has evaluated an expression associated with
     * an event or an output.
     */
    OutputStart = 6,
    /**
     * Corresponds to the point in time after the runtime has evaluated an expression associated with
     * an event or an output.
     */
    OutputEnd = 7,
    /**
     * Corresponds to the point in time just before application bootstrap.
     */
    BootstrapApplicationStart = 8,
    /**
     * Corresponds to the point in time after application bootstrap.
     */
    BootstrapApplicationEnd = 9,
    /**
     * Corresponds to the point in time just before root component bootstrap.
     */
    BootstrapComponentStart = 10,
    /**
     * Corresponds to the point in time after root component bootstrap.
     */
    BootstrapComponentEnd = 11,
    /**
     * Corresponds to the point in time just before Angular starts a change detection tick.
     */
    ChangeDetectionStart = 12,
    /**
     * Corresponds to the point in time after Angular ended a change detection tick.
     */
    ChangeDetectionEnd = 13,
    /**
     * Corresponds to the point in time just before Angular starts a new synchronization pass of change detection tick.
     */
    ChangeDetectionSyncStart = 14,
    /**
     * Corresponds to the point in time after Angular ended a synchronization pass.
     */
    ChangeDetectionSyncEnd = 15,
    /**
     * Corresponds to the point in time just before Angular executes after render hooks.
     */
    AfterRenderHooksStart = 16,
    /**
     * Corresponds to the point in time after Angular executed after render hooks.
     */
    AfterRenderHooksEnd = 17,
    /**
     * Corresponds to the point in time just before Angular starts processing a component (create or update).
     */
    ComponentStart = 18,
    /**
     * Corresponds to the point in time after Angular finished processing a component.
     */
    ComponentEnd = 19,
    /**
     * Corresponds to the point in time just before a defer block transitions between states.
     */
    DeferBlockStateStart = 20,
    /**
     * Corresponds to the point in time after a defer block transitioned between states.
     */
    DeferBlockStateEnd = 21,
    /**
     * Corresponds to the point in time just before a component instance is created dynamically.
     */
    DynamicComponentStart = 22,
    /**
     * Corresponds to the point in time after a a component instance is created dynamically.
     */
    DynamicComponentEnd = 23,
    /**
     * Corresponds to the point in time before the runtime has called the host bindings function
     * of a directive.
     */
    HostBindingsUpdateStart = 24,
    /**
     * Corresponds to the point in time after the runtime has called the host bindings function
     * of a directive.
     */
    HostBindingsUpdateEnd = 25
}
/**
 * Profiler function which the runtime will invoke before and after user code.
 */
interface Profiler {
    (event: ProfilerEvent, instance?: {} | null, hookOrListener?: (e?: any) => any): void;
}

/**
 * Marks a component for check (in case of OnPush components) and synchronously
 * performs change detection on the application this component belongs to.
 *
 * @param component Component to {@link /api/core/ChangeDetectorRef#markForCheck mark for check}
 *
 * @publicApi
 */
declare function applyChanges(component: {}): void;

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/** Retrieved information about a `@defer` block. */
interface DeferBlockData {
    /** Current state of the block. */
    state: 'placeholder' | 'loading' | 'complete' | 'error' | 'initial';
    /** Hydration state of the block. */
    incrementalHydrationState: 'not-configured' | 'hydrated' | 'dehydrated';
    /** Wherther the block has a connected `@error` block. */
    hasErrorBlock: boolean;
    /** Information about the connected `@loading` block. */
    loadingBlock: {
        /** Whether the block is defined. */
        exists: boolean;
        /** Minimum amount of milliseconds that the block should be shown. */
        minimumTime: number | null;
        /** Amount of time after which the block should be shown. */
        afterTime: number | null;
    };
    /** Information about the connected `@placeholder` block. */
    placeholderBlock: {
        /** Whether the block is defined. */
        exists: boolean;
        /** Minimum amount of time that block should be shown. */
        minimumTime: number | null;
    };
    /** Stringified version of the block's triggers. */
    triggers: string[];
    /** Element root nodes that are currently being shown in the block. */
    rootNodes: Node[];
}
/**
 * Gets all of the `@defer` blocks that are present inside the specified DOM node.
 * @param node Node in which to look for `@defer` blocks.
 *
 * @publicApi
 */
declare function getDeferBlocks(node: Node): DeferBlockData[];

/**
 * Discovers the dependencies of an injectable instance. Provides DI information about each
 * dependency that the injectable was instantiated with, including where they were provided from.
 *
 * @param injector An injector instance
 * @param token a DI token that was constructed by the given injector instance
 * @returns an object that contains the created instance of token as well as all of the dependencies
 * that it was instantiated with OR undefined if the token was not created within the given
 * injector.
 */
declare function getDependenciesFromInjectable<T>(injector: Injector, token: Type$1<T> | InjectionToken<T>): {
    instance: T;
    dependencies: Omit<InjectedService, 'injectedIn'>[];
} | undefined;
/**
 * Gets the providers configured on an injector.
 *
 * @param injector the injector to lookup the providers of
 * @returns ProviderRecord[] an array of objects representing the providers of the given injector
 */
declare function getInjectorProviders(injector: Injector): ProviderRecord[];
/**
 *
 * Given an injector, this function will return
 * an object containing the type and source of the injector.
 *
 * |              | type        | source                                                      |
 * |--------------|-------------|-------------------------------------------------------------|
 * | NodeInjector | element     | DOM element that created this injector                      |
 * | R3Injector   | environment | `injector.source`                                           |
 * | NullInjector | null        | null                                                        |
 *
 * @param injector the Injector to get metadata for
 * @returns an object containing the type and source of the given injector. If the injector metadata
 *     cannot be determined, returns null.
 */
declare function getInjectorMetadata(injector: Injector): {
    type: 'element';
    source: RElement;
} | {
    type: 'environment';
    source: string | null;
} | {
    type: 'null';
    source: null;
} | null;
declare function getInjectorResolutionPath(injector: Injector): Injector[];

interface DebugSignalGraphNode {
    kind: string;
    label?: string;
    value?: unknown;
}
interface DebugSignalGraphEdge {
    /**
     * Index of a signal node in the `nodes` array that is a consumer of the signal produced by the producer node.
     */
    consumer: number;
    /**
     * Index of a signal node in the `nodes` array that is a producer of the signal consumed by the consumer node.
     */
    producer: number;
}
/**
 * A debug representation of the signal graph.
 */
interface DebugSignalGraph {
    nodes: DebugSignalGraphNode[];
    edges: DebugSignalGraphEdge[];
}
/**
 * Returns a debug representation of the signal graph for the given injector.
 *
 * Currently only supports element injectors. Starts by discovering the consumer nodes
 * and then traverses their producer nodes to build the signal graph.
 *
 * @param injector The injector to get the signal graph for.
 * @returns A debug representation of the signal graph.
 * @throws If the injector is an environment injector.
 */
declare function getSignalGraph(injector: Injector): DebugSignalGraph;

/**
 * This file introduces series of globally accessible debug tools
 * to allow for the Angular debugging story to function.
 *
 * To see this in action run the following command:
 *
 *   bazel run //packages/core/test/bundling/todo:devserver
 *
 *  Then load `localhost:5432` and start using the console tools.
 */
/**
 * This value reflects the property on the window where the dev
 * tools are patched (window.ng).
 * */
declare const GLOBAL_PUBLISH_EXPANDO_KEY = "ng";
interface NgGlobalPublishUtils {
    ɵgetLoadedRoutes(route: any): any;
}
declare const globalUtilsFunctions: {
    /**
     * Warning: functions that start with `ɵ` are considered *INTERNAL* and should not be relied upon
     * in application's code. The contract of those functions might be changed in any release and/or a
     * function can be removed completely.
     */
    ɵgetDependenciesFromInjectable: typeof getDependenciesFromInjectable;
    ɵgetInjectorProviders: typeof getInjectorProviders;
    ɵgetInjectorResolutionPath: typeof getInjectorResolutionPath;
    ɵgetInjectorMetadata: typeof getInjectorMetadata;
    ɵsetProfiler: (profiler: _angular_core.ɵProfiler | null) => void;
    ɵgetSignalGraph: typeof getSignalGraph;
    ɵgetDeferBlocks: typeof getDeferBlocks;
    getDirectiveMetadata: typeof getDirectiveMetadata;
    getComponent: typeof getComponent;
    getContext: typeof getContext;
    getListeners: typeof getListeners;
    getOwningComponent: typeof getOwningComponent;
    getHostElement: typeof getHostElement;
    getInjector: typeof getInjector;
    getRootComponents: typeof getRootComponents;
    getDirectives: typeof getDirectives;
    applyChanges: typeof applyChanges;
    isSignal: typeof isSignal;
};
type ExternalGlobalUtilsFunctions = keyof NgGlobalPublishUtils;
/**
 * Default debug tools available under `window.ng`.
 */
type GlobalDevModeUtils = {
    [GLOBAL_PUBLISH_EXPANDO_KEY]: typeof globalUtilsFunctions;
};
/**
 * Publishes the given function to `window.ng` from package other than @angular/core
 * So that it can be used from the browser console when an application is not in production.
 */
declare function publishExternalGlobalUtil<K extends ExternalGlobalUtilsFunctions>(name: K, fn: NgGlobalPublishUtils[K]): void;

/**
 * An `html` sanitizer which converts untrusted `html` **string** into trusted string by removing
 * dangerous content.
 *
 * This method parses the `html` and locates potentially dangerous content (such as urls and
 * javascript) and removes it.
 *
 * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustHtml}.
 *
 * @param unsafeHtml untrusted `html`, typically from the user.
 * @returns `html` string which is safe to display to user, because all of the dangerous javascript
 * and urls have been removed.
 *
 * @codeGenApi
 */
declare function ɵɵsanitizeHtml(unsafeHtml: any): TrustedHTML | string;
/**
 * A `style` sanitizer which converts untrusted `style` **string** into trusted string by removing
 * dangerous content.
 *
 * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustStyle}.
 *
 * @param unsafeStyle untrusted `style`, typically from the user.
 * @returns `style` string which is safe to bind to the `style` properties.
 *
 * @codeGenApi
 */
declare function ɵɵsanitizeStyle(unsafeStyle: any): string;
/**
 * A `url` sanitizer which converts untrusted `url` **string** into trusted string by removing
 * dangerous
 * content.
 *
 * This method parses the `url` and locates potentially dangerous content (such as javascript) and
 * removes it.
 *
 * It is possible to mark a string as trusted by calling {@link bypassSanitizationTrustUrl}.
 *
 * @param unsafeUrl untrusted `url`, typically from the user.
 * @returns `url` string which is safe to bind to the `src` properties such as `<img src>`, because
 * all of the dangerous javascript has been removed.
 *
 * @codeGenApi
 */
declare function ɵɵsanitizeUrl(unsafeUrl: any): string;
/**
 * A `url` sanitizer which only lets trusted `url`s through.
 *
 * This passes only `url`s marked trusted by calling {@link bypassSanitizationTrustResourceUrl}.
 *
 * @param unsafeResourceUrl untrusted `url`, typically from the user.
 * @returns `url` string which is safe to bind to the `src` properties such as `<img src>`, because
 * only trusted `url`s have been allowed to pass.
 *
 * @codeGenApi
 */
declare function ɵɵsanitizeResourceUrl(unsafeResourceUrl: any): TrustedScriptURL | string;
/**
 * A `script` sanitizer which only lets trusted javascript through.
 *
 * This passes only `script`s marked trusted by calling {@link
 * bypassSanitizationTrustScript}.
 *
 * @param unsafeScript untrusted `script`, typically from the user.
 * @returns `url` string which is safe to bind to the `<script>` element such as `<img src>`,
 * because only trusted `scripts` have been allowed to pass.
 *
 * @codeGenApi
 */
declare function ɵɵsanitizeScript(unsafeScript: any): TrustedScript | string;
/**
 * A template tag function for promoting the associated constant literal to a
 * TrustedHTML. Interpolation is explicitly not allowed.
 *
 * @param html constant template literal containing trusted HTML.
 * @returns TrustedHTML wrapping `html`.
 *
 * @security This is a security-sensitive function and should only be used to
 * convert constant values of attributes and properties found in
 * application-provided Angular templates to TrustedHTML.
 *
 * @codeGenApi
 */
declare function ɵɵtrustConstantHtml(html: TemplateStringsArray): TrustedHTML | string;
/**
 * A template tag function for promoting the associated constant literal to a
 * TrustedScriptURL. Interpolation is explicitly not allowed.
 *
 * @param url constant template literal containing a trusted script URL.
 * @returns TrustedScriptURL wrapping `url`.
 *
 * @security This is a security-sensitive function and should only be used to
 * convert constant values of attributes and properties found in
 * application-provided Angular templates to TrustedScriptURL.
 *
 * @codeGenApi
 */
declare function ɵɵtrustConstantResourceUrl(url: TemplateStringsArray): TrustedScriptURL | string;
/**
 * Sanitizes URL, selecting sanitizer function based on tag and property names.
 *
 * This function is used in case we can't define security context at compile time, when only prop
 * name is available. This happens when we generate host bindings for Directives/Components. The
 * host element is unknown at compile time, so we defer calculation of specific sanitizer to
 * runtime.
 *
 * @param unsafeUrl untrusted `url`, typically from the user.
 * @param tag target element tag name.
 * @param prop name of the property that contains the value.
 * @returns `url` string which is safe to bind.
 *
 * @codeGenApi
 */
declare function ɵɵsanitizeUrlOrResourceUrl(unsafeUrl: any, tag: string, prop: string): any;

/**
 * Validation function invoked at runtime for each binding that might potentially
 * represent a security-sensitive attribute of an <iframe>.
 * See `IFRAME_SECURITY_SENSITIVE_ATTRS` in the
 * `packages/compiler/src/schema/dom_security_schema.ts` script for the full list
 * of such attributes.
 *
 * @codeGenApi
 */
declare function ɵɵvalidateIframeAttribute(attrValue: any, tagName: string,: attrName: string): any;

/**
 * Represents the set of dependencies of a type in a certain context.
 */
interface ScopeData {
    pipes: Set<PipeType<any>>;
    directives: Set<DirectiveType<any> | ComponentType<any> | Type$1<any>>;
    /**
     * If true it indicates that calculating this scope somehow was not successful. The consumers
     * should interpret this as empty dependencies. The application of this flag is when calculating
     * scope recursively, the presence of this flag in a scope dependency implies that the scope is
     * also poisoned and thus we can return immediately without having to continue the recursion. The
     * reason for this error is displayed as an error message in the console as per JIT behavior
     * today. In addition to that, in local compilation the other build/compilations run in parallel
     * with local compilation may or may not reveal some details about the error as well.
     */
    isPoisoned?: boolean;
}
/**
 * Represents scope data for standalone components as calculated during runtime by the deps
 * tracker.
 */
interface StandaloneCompScopeData extends ScopeData {
    ngModules: Set<NgModuleType<any>>;
}
/** Represents scope data for NgModule as calculated during runtime by the deps tracker. */
interface NgModuleScope {
    compilation: ScopeData;
    exported: ScopeData;
}
/**
 * Represents scope data for standalone component as calculated during runtime by the deps tracker.
 */
interface StandaloneComponentScope {
    compilation: StandaloneCompScopeData;
}
/** Component dependencies info as calculated during runtime by the deps tracker. */
interface ComponentDependencies {
    dependencies: DependencyTypeList;
}
/**
 * Public API for runtime deps tracker (RDT).
 *
 * All downstream tools should only use these methods.
 */
interface DepsTrackerApi {
    /**
     * Computes the component dependencies, i.e., a set of components/directive/pipes that could be
     * present in the component's template (This set might contain directives/components/pipes not
     * necessarily used in the component's template depending on the implementation).
     *
     * Standalone components should specify `rawImports` as this information is not available from
     * their type. The consumer (e.g., {@link getStandaloneDefFunctions}) is expected to pass this
     * parameter.
     *
     * The implementation is expected to use some caching mechanism in order to optimize the resources
     * needed to do this computation.
     */
    getComponentDependencies(cmp: ComponentType<any>, rawImports?: (Type$1<any> | (() => Type$1<any>))[]): ComponentDependencies;
    /**
     * Registers an NgModule into the tracker with the given scope info.
     *
     * This method should be called for every NgModule whether it is compiled in local mode or not.
     * This is needed in order to compute component's dependencies as some dependencies might be in
     * different compilation units with different compilation mode.
     */
    registerNgModule(type: Type$1<any>, scopeInfo: NgModuleScopeInfoFromDecorator): void;
    /**
     * Clears the scope cache for NgModule or standalone component. This will force re-calculation of
     * the scope, which could be an expensive operation as it involves aggregating transitive closure.
     *
     * The main application of this method is for test beds where we want to clear the cache to
     * enforce scope update after overriding.
     */
    clearScopeCacheFor(type: Type$1<any>): void;
    /**
     * Returns the scope of NgModule. Mainly to be used by JIT and test bed.
     *
     * The scope value here is memoized. To enforce a new calculation bust the cache by using
     * `clearScopeCacheFor` method.
     */
    getNgModuleScope(type: NgModuleType<any>): NgModuleScope;
    /**
     * Returns the scope of standalone component. Mainly to be used by JIT. This method should be
     * called lazily after the initial parsing so that all the forward refs can be resolved.
     *
     * @param rawImports the imports statement as appears on the component decorate which consists of
     *     Type as well as forward refs.
     *
     * The scope value here is memoized. To enforce a new calculation bust the cache by using
     * `clearScopeCacheFor` method.
     */
    getStandaloneComponentScope(type: ComponentType<any>, rawImports: (Type$1<any> | (() => Type$1<any>))[]): StandaloneComponentScope;
    /**
     * Checks if the NgModule declaring the component is not loaded into the browser yet. Always
     * returns false for standalone components.
     */
    isOrphanComponent(cmp: ComponentType<any>): boolean;
}

/**
 * Indicates whether to use the runtime dependency tracker for scope calculation in JIT compilation.
 * The value "false" means the old code path based on patching scope info into the types will be
 * used.
 *
 * @deprecated For migration purposes only, to be removed soon.
 */
declare const USE_RUNTIME_DEPS_TRACKER_FOR_JIT = true;
/**
 * An implementation of DepsTrackerApi which will be used for JIT and local compilation.
 */
declare class DepsTracker implements DepsTrackerApi {
    private ownerNgModule;
    private ngModulesWithSomeUnresolvedDecls;
    private ngModulesScopeCache;
    private standaloneComponentsScopeCache;
    /**
     * Attempts to resolve ng module's forward ref declarations as much as possible and add them to
     * the `ownerNgModule` map. This method normally should be called after the initial parsing when
     * all the forward refs are resolved (e.g., when trying to render a component)
     */
    private resolveNgModulesDecls;
    /** @override */
    getComponentDependencies(type: ComponentType<any>, rawImports?: RawScopeInfoFromDecorator[]): ComponentDependencies;
    /**
     * @override
     * This implementation does not make use of param scopeInfo since it assumes the scope info is
     * already added to the type itself through methods like {@link ɵɵsetNgModuleScope}
     */
    registerNgModule(type: Type$1<any>, scopeInfo: NgModuleScopeInfoFromDecorator): void;
    /** @override */
    clearScopeCacheFor(type: Type$1<any>): void;
    /** @override */
    getNgModuleScope(type: NgModuleType<any>): NgModuleScope;
    /** Compute NgModule scope afresh. */
    private computeNgModuleScope;
    /** @override */
    getStandaloneComponentScope(type: ComponentType<any>, rawImports?: RawScopeInfoFromDecorator[]): StandaloneComponentScope;
    private computeStandaloneComponentScope;
    /** @override */
    isOrphanComponent(cmp: Type$1<any>): boolean;
}
/** The deps tracker to be used in the current Angular app in dev mode. */
declare const depsTracker: DepsTracker;

/**
 * Options passed to the `computed` creation function.
 */
interface CreateComputedOptions<T> {
    /**
     * A comparison function which defines equality for computed values.
     */
    equal?: ValueEqualityFn<T>;
    /**
     * A debug name for the computed signal. Used in Angular DevTools to identify the signal.
     */
    debugName?: string;
}
/**
 * Create a computed `Signal` which derives a reactive value from an expression.
 */
declare function computed<T>(computation: () => T, options?: CreateComputedOptions<T>): Signal<T>;

/**
 * Creates a writable signal whose value is initialized and reset by the linked, reactive computation.
 *
 * @developerPreview
 */
declare function linkedSignal<D>(computation: () => D, options?: {
    equal?: ValueEqualityFn<NoInfer<D>>;
}): WritableSignal<D>;
/**
 * Creates a writable signal whose value is initialized and reset by the linked, reactive computation.
 * This is an advanced API form where the computation has access to the previous value of the signal and the computation result.
 *
 * Note: The computation is reactive, meaning the linked signal will automatically update whenever any of the signals used within the computation change.
 *
 * @developerPreview
 */
declare function linkedSignal<S, D>(options: {
    source: () => S;
    computation: (source: NoInfer<S>, previous?: {
        source: NoInfer<S>;
        value: NoInfer<D>;
    }) => D;
    equal?: ValueEqualityFn<NoInfer<D>>;
}): WritableSignal<D>;

/**
 * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
 * can, optionally, return a value.
 */
declare function untracked<T>(nonReactiveReadsFn: () => T): T;

declare class MicrotaskEffectScheduler extends ZoneAwareEffectScheduler {
    private readonly pendingTasks;
    private taskId;
    schedule(effect: SchedulableEffect): void;
    flush(): void;
    /** @nocollapse */
    static ɵprov: unknown;
}
/**
 * Create a global `Effect` for the given reactive function.
 */
declare function microtaskEffect(effectFn: (onCleanup: EffectCleanupRegisterFn) => void, options?: CreateEffectOptions): EffectRef;

/**
 * An argument list containing the first non-never type in the given type array, or an empty
 * argument list if there are no non-never types in the type array.
 */
type ɵFirstAvailable<T extends unknown[]> = T extends [infer H, ...infer R] ? [H] extends [never] ? ɵFirstAvailable<R> : [H] : [];
/**
 * Options passed to `afterRender` and `afterNextRender`.
 *
 * @developerPreview
 */
interface AfterRenderOptions {
    /**
     * The `Injector` to use during creation.
     *
     * If this is not provided, the current injection context will be used instead (via `inject`).
     */
    injector?: Injector;
    /**
     * Whether the hook should require manual cleanup.
     *
     * If this is `false` (the default) the hook will automatically register itself to be cleaned up
     * with the current `DestroyRef`.
     */
    manualCleanup?: boolean;
    /**
     * The phase the callback should be invoked in.
     *
     * <div class="docs-alert docs-alert-critical">
     *
     * Defaults to `AfterRenderPhase.MixedReadWrite`. You should choose a more specific
     * phase instead. See `AfterRenderPhase` for more information.
     *
     * </div>
     *
     * @deprecated Specify the phase for your callback to run in by passing a spec-object as the first
     *   parameter to `afterRender` or `afterNextRender` instead of a function.
     */
    phase?: AfterRenderPhase;
}
/**
 * Register callbacks to be invoked each time the application finishes rendering, during the
 * specified phases. The available phases are:
 * - `earlyRead`
 *   Use this phase to **read** from the DOM before a subsequent `write` callback, for example to
 *   perform custom layout that the browser doesn't natively support. Prefer the `read` phase if
 *   reading can wait until after the write phase. **Never** write to the DOM in this phase.
 * - `write`
 *    Use this phase to **write** to the DOM. **Never** read from the DOM in this phase.
 * - `mixedReadWrite`
 *    Use this phase to read from and write to the DOM simultaneously. **Never** use this phase if
 *    it is possible to divide the work among the other phases instead.
 * - `read`
 *    Use this phase to **read** from the DOM. **Never** write to the DOM in this phase.
 *
 * <div class="docs-alert docs-alert-critical">
 *
 * You should prefer using the `read` and `write` phases over the `earlyRead` and `mixedReadWrite`
 * phases when possible, to avoid performance degradation.
 *
 * </div>
 *
 * Note that:
 * - Callbacks run in the following phase order *after each render*:
 *   1. `earlyRead`
 *   2. `write`
 *   3. `mixedReadWrite`
 *   4. `read`
 * - Callbacks in the same phase run in the order they are registered.
 * - Callbacks run on browser platforms only, they will not run on the server.
 *
 * The first phase callback to run as part of this spec will receive no parameters. Each
 * subsequent phase callback in this spec will receive the return value of the previously run
 * phase callback as a parameter. This can be used to coordinate work across multiple phases.
 *
 * Angular is unable to verify or enforce that phases are used correctly, and instead
 * relies on each developer to follow the guidelines documented for each value and
 * carefully choose the appropriate one, refactoring their code if necessary. By doing
 * so, Angular is better able to minimize the performance degradation associated with
 * manual DOM access, ensuring the best experience for the end users of your application
 * or library.
 *
 * <div class="docs-alert docs-alert-important">
 *
 * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.
 * You must use caution when directly reading or writing the DOM and layout.
 *
 * </div>
 *
 * @param spec The callback functions to register
 * @param options Options to control the behavior of the callback
 *
 * @usageNotes
 *
 * Use `afterRender` to read or write the DOM after each render.
 *
 * ### Example
 * ```angular-ts
 * @Component({
 *   selector: 'my-cmp',
 *   template: `<span #content>{{ ... }}</span>`,
 * })
 * export class MyComponent {
 *   @ViewChild('content') contentRef: ElementRef;
 *
 *   constructor() {
 *     afterRender({
 *       read: () => {
 *         console.log('content height: ' + this.contentRef.nativeElement.scrollHeight);
 *       }
 *     });
 *   }
 * }
 * ```
 *
 * @developerPreview
 */
declare function afterRender<E = never, W = never, M = never>(spec: {
    earlyRead?: () => E;
    write?: (...args: ɵFirstAvailable<[E]>) => W;
    mixedReadWrite?: (...args: ɵFirstAvailable<[W, E]>) => M;
    read?: (...args: ɵFirstAvailable<[M, W, E]>) => void;
}, options?: Omit<AfterRenderOptions, 'phase'>): AfterRenderRef;
/**
 * Register a callback to be invoked each time the application finishes rendering, during the
 * `mixedReadWrite` phase.
 *
 * <div class="docs-alert docs-alert-critical">
 *
 * You should prefer specifying an explicit phase for the callback instead, or you risk significant
 * performance degradation.
 *
 * </div>
 *
 * Note that the callback will run
 * - in the order it was registered
 * - once per render
 * - on browser platforms only
 * - during the `mixedReadWrite` phase
 *
 * <div class="docs-alert docs-alert-important">
 *
 * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.
 * You must use caution when directly reading or writing the DOM and layout.
 *
 * </div>
 *
 * @param callback A callback function to register
 * @param options Options to control the behavior of the callback
 *
 * @usageNotes
 *
 * Use `afterRender` to read or write the DOM after each render.
 *
 * ### Example
 * ```angular-ts
 * @Component({
 *   selector: 'my-cmp',
 *   template: `<span #content>{{ ... }}</span>`,
 * })
 * export class MyComponent {
 *   @ViewChild('content') contentRef: ElementRef;
 *
 *   constructor() {
 *     afterRender({
 *       read: () => {
 *         console.log('content height: ' + this.contentRef.nativeElement.scrollHeight);
 *       }
 *     });
 *   }
 * }
 * ```
 *
 * @developerPreview
 */
declare function afterRender(callback: VoidFunction, options?: AfterRenderOptions): AfterRenderRef;
/**
 * Register callbacks to be invoked the next time the application finishes rendering, during the
 * specified phases. The available phases are:
 * - `earlyRead`
 *   Use this phase to **read** from the DOM before a subsequent `write` callback, for example to
 *   perform custom layout that the browser doesn't natively support. Prefer the `read` phase if
 *   reading can wait until after the write phase. **Never** write to the DOM in this phase.
 * - `write`
 *    Use this phase to **write** to the DOM. **Never** read from the DOM in this phase.
 * - `mixedReadWrite`
 *    Use this phase to read from and write to the DOM simultaneously. **Never** use this phase if
 *    it is possible to divide the work among the other phases instead.
 * - `read`
 *    Use this phase to **read** from the DOM. **Never** write to the DOM in this phase.
 *
 * <div class="docs-alert docs-alert-critical">
 *
 * You should prefer using the `read` and `write` phases over the `earlyRead` and `mixedReadWrite`
 * phases when possible, to avoid performance degradation.
 *
 * </div>
 *
 * Note that:
 * - Callbacks run in the following phase order *once, after the next render*:
 *   1. `earlyRead`
 *   2. `write`
 *   3. `mixedReadWrite`
 *   4. `read`
 * - Callbacks in the same phase run in the order they are registered.
 * - Callbacks run on browser platforms only, they will not run on the server.
 *
 * The first phase callback to run as part of this spec will receive no parameters. Each
 * subsequent phase callback in this spec will receive the return value of the previously run
 * phase callback as a parameter. This can be used to coordinate work across multiple phases.
 *
 * Angular is unable to verify or enforce that phases are used correctly, and instead
 * relies on each developer to follow the guidelines documented for each value and
 * carefully choose the appropriate one, refactoring their code if necessary. By doing
 * so, Angular is better able to minimize the performance degradation associated with
 * manual DOM access, ensuring the best experience for the end users of your application
 * or library.
 *
 * <div class="docs-alert docs-alert-important">
 *
 * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.
 * You must use caution when directly reading or writing the DOM and layout.
 *
 * </div>
 *
 * @param spec The callback functions to register
 * @param options Options to control the behavior of the callback
 *
 * @usageNotes
 *
 * Use `afterNextRender` to read or write the DOM once,
 * for example to initialize a non-Angular library.
 *
 * ### Example
 * ```angular-ts
 * @Component({
 *   selector: 'my-chart-cmp',
 *   template: `<div #chart>{{ ... }}</div>`,
 * })
 * export class MyChartCmp {
 *   @ViewChild('chart') chartRef: ElementRef;
 *   chart: MyChart|null;
 *
 *   constructor() {
 *     afterNextRender({
 *       write: () => {
 *         this.chart = new MyChart(this.chartRef.nativeElement);
 *       }
 *     });
 *   }
 * }
 * ```
 *
 * @developerPreview
 */
declare function afterNextRender<E = never, W = never, M = never>(spec: {
    earlyRead?: () => E;
    write?: (...args: ɵFirstAvailable<[E]>) => W;
    mixedReadWrite?: (...args: ɵFirstAvailable<[W, E]>) => M;
    read?: (...args: ɵFirstAvailable<[M, W, E]>) => void;
}, options?: Omit<AfterRenderOptions, 'phase'>): AfterRenderRef;
/**
 * Register a callback to be invoked the next time the application finishes rendering, during the
 * `mixedReadWrite` phase.
 *
 * <div class="docs-alert docs-alert-critical">
 *
 * You should prefer specifying an explicit phase for the callback instead, or you risk significant
 * performance degradation.
 *
 * </div>
 *
 * Note that the callback will run
 * - in the order it was registered
 * - on browser platforms only
 * - during the `mixedReadWrite` phase
 *
 * <div class="docs-alert docs-alert-important">
 *
 * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.
 * You must use caution when directly reading or writing the DOM and layout.
 *
 * </div>
 *
 * @param callback A callback function to register
 * @param options Options to control the behavior of the callback
 *
 * @usageNotes
 *
 * Use `afterNextRender` to read or write the DOM once,
 * for example to initialize a non-Angular library.
 *
 * ### Example
 * ```angular-ts
 * @Component({
 *   selector: 'my-chart-cmp',
 *   template: `<div #chart>{{ ... }}</div>`,
 * })
 * export class MyChartCmp {
 *   @ViewChild('chart') chartRef: ElementRef;
 *   chart: MyChart|null;
 *
 *   constructor() {
 *     afterNextRender({
 *       write: () => {
 *         this.chart = new MyChart(this.chartRef.nativeElement);
 *       }
 *     });
 *   }
 * }
 * ```
 *
 * @developerPreview
 */
declare function afterNextRender(callback: VoidFunction, options?: AfterRenderOptions): AfterRenderRef;

/**
 * An argument list containing the first non-never type in the given type array, or an empty
 * argument list if there are no non-never types in the type array.
 */
type ɵFirstAvailableSignal<T extends unknown[]> = T extends [infer H, ...infer R] ? [H] extends [never] ? ɵFirstAvailableSignal<R> : [Signal<H>] : [];
/**
 * Register an effect that, when triggered, is invoked when the application finishes rendering, during the
 * `mixedReadWrite` phase.
 *
 * <div class="docs-alert docs-alert-critical">
 *
 * You should prefer specifying an explicit phase for the effect instead, or you risk significant
 * performance degradation.
 *
 * </div>
 *
 * Note that callback-based `afterRenderEffect`s will run
 * - in the order it they are registered
 * - only when dirty
 * - on browser platforms only
 * - during the `mixedReadWrite` phase
 *
 * <div class="docs-alert docs-alert-important">
 *
 * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.
 * You must use caution when directly reading or writing the DOM and layout.
 *
 * </div>
 *
 * @param callback An effect callback function to register
 * @param options Options to control the behavior of the callback
 *
 * @experimental
 */
declare function afterRenderEffect(callback: (onCleanup: EffectCleanupRegisterFn) => void, options?: Omit<AfterRenderOptions, 'phase'>): AfterRenderRef;
/**
 * Register effects that, when triggered, are invoked when the application finishes rendering,
 * during the specified phases. The available phases are:
 * - `earlyRead`
 *   Use this phase to **read** from the DOM before a subsequent `write` callback, for example to
 *   perform custom layout that the browser doesn't natively support. Prefer the `read` phase if
 *   reading can wait until after the write phase. **Never** write to the DOM in this phase.
 * - `write`
 *    Use this phase to **write** to the DOM. **Never** read from the DOM in this phase.
 * - `mixedReadWrite`
 *    Use this phase to read from and write to the DOM simultaneously. **Never** use this phase if
 *    it is possible to divide the work among the other phases instead.
 * - `read`
 *    Use this phase to **read** from the DOM. **Never** write to the DOM in this phase.
 *
 * <div class="docs-alert docs-alert-critical">
 *
 * You should prefer using the `read` and `write` phases over the `earlyRead` and `mixedReadWrite`
 * phases when possible, to avoid performance degradation.
 *
 * </div>
 *
 * Note that:
 * - Effects run in the following phase order, only when dirty through signal dependencies:
 *   1. `earlyRead`
 *   2. `write`
 *   3. `mixedReadWrite`
 *   4. `read`
 * - `afterRenderEffect`s in the same phase run in the order they are registered.
 * - `afterRenderEffect`s run on browser platforms only, they will not run on the server.
 * - `afterRenderEffect`s will run at least once.
 *
 * The first phase callback to run as part of this spec will receive no parameters. Each
 * subsequent phase callback in this spec will receive the return value of the previously run
 * phase callback as a `Signal`. This can be used to coordinate work across multiple phases.
 *
 * Angular is unable to verify or enforce that phases are used correctly, and instead
 * relies on each developer to follow the guidelines documented for each value and
 * carefully choose the appropriate one, refactoring their code if necessary. By doing
 * so, Angular is better able to minimize the performance degradation associated with
 * manual DOM access, ensuring the best experience for the end users of your application
 * or library.
 *
 * <div class="docs-alert docs-alert-important">
 *
 * Components are not guaranteed to be [hydrated](guide/hydration) before the callback runs.
 * You must use caution when directly reading or writing the DOM and layout.
 *
 * </div>
 *
 * @param spec The effect functions to register
 * @param options Options to control the behavior of the effects
 *
 * @usageNotes
 *
 * Use `afterRenderEffect` to create effects that will read or write from the DOM and thus should
 * run after rendering.
 *
 * @experimental
 */
declare function afterRenderEffect<E = never, W = never, M = never>(spec: {
    earlyRead?: (onCleanup: EffectCleanupRegisterFn) => E;
    write?: (...args: [...ɵFirstAvailableSignal<[E]>, EffectCleanupRegisterFn]) => W;
    mixedReadWrite?: (...args: [...ɵFirstAvailableSignal<[W, E]>, EffectCleanupRegisterFn]) => M;
    read?: (...args: [...ɵFirstAvailableSignal<[M, W, E]>, EffectCleanupRegisterFn]) => void;
}, options?: Omit<AfterRenderOptions, 'phase'>): AfterRenderRef;

/**
 * Asserts that the current stack frame is not within a reactive context. Useful
 * to disallow certain code from running inside a reactive context (see {@link /api/core/rxjs/toSignal toSignal})
 *
 * @param debugFn a reference to the function making the assertion (used for the error message).
 *
 * @publicApi
 */
declare function assertNotInReactiveContext(debugFn: Function, extraContext?: string): void;

/**
 * Creates a `ComponentRef` instance based on provided component type and a set of options.
 *
 * @usageNotes
 *
 * The example below demonstrates how the `createComponent` function can be used
 * to create an instance of a ComponentRef dynamically and attach it to an ApplicationRef,
 * so that it gets included into change detection cycles.
 *
 * Note: the example uses standalone components, but the function can also be used for
 * non-standalone components (declared in an NgModule) as well.
 *
 * ```angular-ts
 * @Component({
 *   standalone: true,
 *   template: `Hello {{ name }}!`
 * })
 * class HelloComponent {
 *   name = 'Angular';
 * }
 *
 * @Component({
 *   standalone: true,
 *   template: `<div id="hello-component-host"></div>`
 * })
 * class RootComponent {}
 *
 * // Bootstrap an application.
 * const applicationRef = await bootstrapApplication(RootComponent);
 *
 * // Locate a DOM node that would be used as a host.
 * const hostElement = document.getElementById('hello-component-host');
 *
 * // Get an `EnvironmentInjector` instance from the `ApplicationRef`.
 * const environmentInjector = applicationRef.injector;
 *
 * // We can now create a `ComponentRef` instance.
 * const componentRef = createComponent(HelloComponent, {hostElement, environmentInjector});
 *
 * // Last step is to register the newly created ref using the `ApplicationRef` instance
 * // to include the component view into change detection cycles.
 * applicationRef.attachView(componentRef.hostView);
 * componentRef.changeDetectorRef.detectChanges();
 * ```
 *
 * @param component Component class reference.
 * @param options Set of options to use:
 *  * `environmentInjector`: An `EnvironmentInjector` instance to be used for the component.
 *  * `hostElement` (optional): A DOM node that should act as a host node for the component. If not
 * provided, Angular creates one based on the tag name used in the component selector (and falls
 * back to using `div` if selector doesn't have tag name info).
 *  * `elementInjector` (optional): An `ElementInjector` instance, see additional info about it
 * [here](guide/di/hierarchical-dependency-injection#elementinjector).
 *  * `projectableNodes` (optional): A list of DOM nodes that should be projected through
 * [`<ng-content>`](api/core/ng-content) of the new component instance, e.g.,
 * `[[element1, element2]]`: projects `element1` and `element2` into the same `<ng-content>`.
 * `[[element1, element2], [element3]]`: projects `element1` and `element2` into one `<ng-content>`,
 * and `element3` into a separate `<ng-content>`.
 * @returns ComponentRef instance that represents a given Component.
 *
 * @publicApi
 */
declare function createComponent<C>(component: Type$1<C>, options: {
    environmentInjector: EnvironmentInjector;
    hostElement?: Element;
    elementInjector?: Injector;
    projectableNodes?: Node[][];
}): ComponentRef$1<C>;
/**
 * An interface that describes the subset of component metadata
 * that can be retrieved using the `reflectComponentType` function.
 *
 * @publicApi
 */
interface ComponentMirror<C> {
    /**
     * The component's HTML selector.
     */
    get selector(): string;
    /**
     * The type of component the factory will create.
     */
    get type(): Type$1<C>;
    /**
     * The inputs of the component.
     */
    get inputs(): ReadonlyArray<{
        readonly propName: string;
        readonly templateName: string;
        readonly transform?: (value: any) => any;
        readonly isSignal: boolean;
    }>;
    /**
     * The outputs of the component.
     */
    get outputs(): ReadonlyArray<{
        readonly propName: string;
        readonly templateName: string;
    }>;
    /**
     * Selector for all <ng-content> elements in the component.
     */
    get ngContentSelectors(): ReadonlyArray<string>;
    /**
     * Whether this component is marked as standalone.
     * Note: an extra flag, not present in `ComponentFactory`.
     */
    get isStandalone(): boolean;
}
/**
 * Creates an object that allows to retrieve component metadata.
 *
 * @usageNotes
 *
 * The example below demonstrates how to use the function and how the fields
 * of the returned object map to the component metadata.
 *
 * ```angular-ts
 * @Component({
 *   standalone: true,
 *   selector: 'foo-component',
 *   template: `
 *     <ng-content></ng-content>
 *     <ng-content select="content-selector-a"></ng-content>
 *   `,
 * })
 * class FooComponent {
 *   @Input('inputName') inputPropName: string;
 *   @Output('outputName') outputPropName = new EventEmitter<void>();
 * }
 *
 * const mirror = reflectComponentType(FooComponent);
 * expect(mirror.type).toBe(FooComponent);
 * expect(mirror.selector).toBe('foo-component');
 * expect(mirror.isStandalone).toBe(true);
 * expect(mirror.inputs).toEqual([{propName: 'inputName', templateName: 'inputPropName'}]);
 * expect(mirror.outputs).toEqual([{propName: 'outputName', templateName: 'outputPropName'}]);
 * expect(mirror.ngContentSelectors).toEqual([
 *   '*',                 // first `<ng-content>` in a template, the selector defaults to `*`
 *   'content-selector-a' // second `<ng-content>` in a template
 * ]);
 * ```
 *
 * @param component Component class reference.
 * @returns An object that allows to retrieve component metadata.
 *
 * @publicApi
 */
declare function reflectComponentType<C>(component: Type$1<C>): ComponentMirror<C> | null;

/**
 * Set of config options available during the application bootstrap operation.
 *
 * @publicApi
 */
interface ApplicationConfig {
    /**
     * List of providers that should be available to the root component and all its children.
     */
    providers: Array<Provider | EnvironmentProviders>;
}
/**
 * Merge multiple application configurations from left to right.
 *
 * @param configs Two or more configurations to be merged.
 * @returns A merged [ApplicationConfig](api/core/ApplicationConfig).
 *
 * @publicApi
 */
declare function mergeApplicationConfig(...configs: ApplicationConfig[]): ApplicationConfig;

/**
 * Injection token representing the current HTTP request object.
 *
 * Use this token to access the current request when handling server-side
 * rendering (SSR).
 *
 * @remarks
 * This token may be `null` in the following scenarios:
 *
 * * During the build processes.
 * * When the application is rendered in the browser (client-side rendering).
 * * When performing static site generation (SSG).
 * * During route extraction in development (at the time of the request).
 *
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Request | `Request` on MDN}
 *
 * @developerPreview
 */
declare const REQUEST: InjectionToken<Request | null>;
/**
 * Injection token for response initialization options.
 *
 * Use this token to provide response options for configuring or initializing
 * HTTP responses in server-side rendering or API endpoints.
 *
 * @remarks
 * This token may be `null` in the following scenarios:
 *
 * * During the build processes.
 * * When the application is rendered in the browser (client-side rendering).
 * * When performing static site generation (SSG).
 * * During route extraction in development (at the time of the request).
 *
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response | `ResponseInit` on MDN}
 *
 * @developerPreview
 */
declare const RESPONSE_INIT: InjectionToken<ResponseInit | null>;
/**
 * Injection token for additional request context.
 *
 * Use this token to pass custom metadata or context related to the current request in server-side rendering.
 *
 * @remarks
 * This token is only available during server-side rendering and will be `null` in other contexts.
 *
 * @developerPreview
 */
declare const REQUEST_CONTEXT: InjectionToken<unknown>;

export { ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AfterRenderPhase, ApplicationInitStatus, ApplicationModule, ApplicationRef, Attribute, COMPILER_OPTIONS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy$1 as ChangeDetectionStrategy, ChangeDetectorRef, Compiler, CompilerFactory, Component, ComponentFactory$1 as ComponentFactory, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ContentChild, ContentChildren, DEFAULT_CURRENCY_CODE, DebugElement, DebugEventListener, DebugNode, DefaultIterableDiffer, DestroyRef, Directive, ENVIRONMENT_INITIALIZER, ElementRef, EmbeddedViewRef, EnvironmentInjector, ErrorHandler, EventEmitter, HOST_TAG_NAME, Host, HostAttributeToken, HostBinding, HostListener, INJECTOR, Inject, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory$1 as NgModuleFactory, NgModuleRef$1 as NgModuleRef, NgProbeToken, NgZone, Optional, Output, OutputEmitterRef, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PendingTasks, Pipe, PlatformRef, Query, QueryList, REQUEST, REQUEST_CONTEXT, RESPONSE_INIT, Renderer2, RendererFactory2, RendererStyleFlags2, ResourceStatus, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type$1 as Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation$1 as ViewEncapsulation, ViewRef$1 as ViewRef, afterNextRender, afterRender, afterRenderEffect, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, contentChild, contentChildren, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, input, isDevMode, isSignal, isStandalone, linkedSignal, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, model, numberAttribute, output, platformCore, provideAppInitializer, provideEnvironmentInitializer, provideExperimentalCheckNoChangesForDebug, provideExperimentalZonelessChangeDetection, providePlatformInitializer, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, resource, runInInjectionContext, setTestabilityGetter, signal, untracked, viewChild, viewChildren, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderManager as ɵAfterRenderManager, AnimationRendererType as ɵAnimationRendererType, AttributeMarker as ɵAttributeMarker, BypassType as ɵBypassType, CLIENT_RENDER_MODE_FLAG as ɵCLIENT_RENDER_MODE_FLAG, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ChangeDetectionScheduler as ɵChangeDetectionScheduler, ChangeDetectionSchedulerImpl as ɵChangeDetectionSchedulerImpl, ComponentFactory$1 as ɵComponentFactory, Console as ɵConsole, CurrencyIndex as ɵCurrencyIndex, DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG as ɵDEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR as ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DEHYDRATED_BLOCK_REGISTRY as ɵDEHYDRATED_BLOCK_REGISTRY, DeferBlockBehavior as ɵDeferBlockBehavior, DeferBlockState as ɵDeferBlockState, ENABLE_ROOT_COMPONENT_BOOTSTRAP as ɵENABLE_ROOT_COMPONENT_BOOTSTRAP, EffectScheduler as ɵEffectScheduler, ExtraLocaleDataIndex as ɵExtraLocaleDataIndex, HydrationStatus as ɵHydrationStatus, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, INJECTOR_SCOPE as ɵINJECTOR_SCOPE, ɵINPUT_SIGNAL_BRAND_WRITE_TYPE, INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED as ɵIS_INCREMENTAL_HYDRATION_ENABLED, JSACTION_BLOCK_ELEMENT_MAP as ɵJSACTION_BLOCK_ELEMENT_MAP, JSACTION_EVENT_CONTRACT as ɵJSACTION_EVENT_CONTRACT, LContext as ɵLContext, LocaleDataIndex as ɵLocaleDataIndex, MicrotaskEffectScheduler as ɵMicrotaskEffectScheduler, NG_COMP_DEF as ɵNG_COMP_DEF, NG_DIR_DEF as ɵNG_DIR_DEF, NG_ELEMENT_ID as ɵNG_ELEMENT_ID, NG_INJ_DEF as ɵNG_INJ_DEF, NG_MOD_DEF as ɵNG_MOD_DEF, NG_PIPE_DEF as ɵNG_PIPE_DEF, NG_PROV_DEF as ɵNG_PROV_DEF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE as ɵNO_CHANGE, NgModuleFactory as ɵNgModuleFactory, NoopNgZone as ɵNoopNgZone, NotificationSource as ɵNotificationSource, PERFORMANCE_MARK_PREFIX as ɵPERFORMANCE_MARK_PREFIX, PROVIDED_NG_ZONE as ɵPROVIDED_NG_ZONE, PendingTasksInternal as ɵPendingTasksInternal, ProfilerEvent as ɵProfilerEvent, R3Injector as ɵR3Injector, ReflectionCapabilities as ɵReflectionCapabilities, ComponentFactory as ɵRender3ComponentFactory, ComponentRef as ɵRender3ComponentRef, NgModuleRef as ɵRender3NgModuleRef, RenderFlags as ɵRenderFlags, ResourceImpl as ɵResourceImpl, RuntimeError as ɵRuntimeError, RuntimeErrorCode as ɵRuntimeErrorCode, SIGNAL as ɵSIGNAL, SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER, TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER, TimerScheduler as ɵTimerScheduler, TracingAction as ɵTracingAction, TracingService as ɵTracingService, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZONELESS_ENABLED as ɵZONELESS_ENABLED, _sanitizeHtml as ɵ_sanitizeHtml, _sanitizeUrl as ɵ_sanitizeUrl, allowSanitizationBypassAndThrow as ɵallowSanitizationBypassAndThrow, annotateForHydration as ɵannotateForHydration, bypassSanitizationTrustHtml as ɵbypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl as ɵbypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript as ɵbypassSanitizationTrustScript, bypassSanitizationTrustStyle as ɵbypassSanitizationTrustStyle, bypassSanitizationTrustUrl as ɵbypassSanitizationTrustUrl, clearResolutionOfComponentResourcesQueue as ɵclearResolutionOfComponentResourcesQueue, compileComponent as ɵcompileComponent, compileDirective as ɵcompileDirective, compileNgModule as ɵcompileNgModule, compileNgModuleDefs as ɵcompileNgModuleDefs, compileNgModuleFactory as ɵcompileNgModuleFactory, compilePipe as ɵcompilePipe, convertToBitFlags as ɵconvertToBitFlags, createInjector as ɵcreateInjector, createOrReusePlatformInjector as ɵcreateOrReusePlatformInjector, defaultIterableDiffers as ɵdefaultIterableDiffers, defaultKeyValueDiffers as ɵdefaultKeyValueDiffers, depsTracker as ɵdepsTracker, detectChangesInViewIfRequired as ɵdetectChangesInViewIfRequired, devModeEqual as ɵdevModeEqual, disableProfiling as ɵdisableProfiling, enableProfiling as ɵenableProfiling, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn, getClosestComponentName as ɵgetClosestComponentName, getComponentDef as ɵgetComponentDef, getDebugNode as ɵgetDebugNode, getDeferBlocks$1 as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getDocument as ɵgetDocument, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getOutputDestroyRef as ɵgetOutputDestroyRef, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalCreateApplication as ɵinternalCreateApplication, internalProvideZoneChangeDetection as ɵinternalProvideZoneChangeDetection, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, isViewDirty as ɵisViewDirty, markForRefresh as ɵmarkForRefresh, microtaskEffect as ɵmicrotaskEffect, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, performanceMarkFeature as ɵperformanceMarkFeature, publishExternalGlobalUtil as ɵpublishExternalGlobalUtil, readHydrationInfo as ɵreadHydrationInfo, registerLocaleData as ɵregisterLocaleData, renderDeferBlockState as ɵrenderDeferBlockState, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, startMeasuring as ɵstartMeasuring, stopMeasuring as ɵstopMeasuring, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, ɵunwrapWritableSignal, withDomHydration as ɵwithDomHydration, withEventReplay as ɵwithEventReplay, withI18nSupport as ɵwithI18nSupport, withIncrementalHydration as ɵwithIncrementalHydration, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵattachSourceLocations, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdisableBindings, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵenableBindings, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵgetReplaceMetadataURL, ɵɵhostProperty, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinject, ɵɵinjectAttribute, ɵɵinvalidFactory, ɵɵinvalidFactoryDep, ɵɵlistener, ɵɵloadQuery, ɵɵnamespaceHTML, ɵɵnamespaceMathML, ɵɵnamespaceSVG, ɵɵnextContext, ɵɵngDeclareClassMetadata, ɵɵngDeclareClassMetadataAsync, ɵɵngDeclareComponent, ɵɵngDeclareDirective, ɵɵngDeclareFactory, ɵɵngDeclareInjectable, ɵɵngDeclareInjector, ɵɵngDeclareNgModule, ɵɵngDeclarePipe, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpropertyInterpolate, ɵɵpropertyInterpolate1, ɵɵpropertyInterpolate2, ɵɵpropertyInterpolate3, ɵɵpropertyInterpolate4, ɵɵpropertyInterpolate5, ɵɵpropertyInterpolate6, ɵɵpropertyInterpolate7, ɵɵpropertyInterpolate8, ɵɵpropertyInterpolateV, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵstyleMap, ɵɵstyleMapInterpolate1, ɵɵstyleMapInterpolate2, ɵɵstyleMapInterpolate3, ɵɵstyleMapInterpolate4, ɵɵstyleMapInterpolate5, ɵɵstyleMapInterpolate6, ɵɵstyleMapInterpolate7, ɵɵstyleMapInterpolate8, ɵɵstyleMapInterpolateV, ɵɵstyleProp, ɵɵstylePropInterpolate1, ɵɵstylePropInterpolate2, ɵɵstylePropInterpolate3, ɵɵstylePropInterpolate4, ɵɵstylePropInterpolate5, ɵɵstylePropInterpolate6, ɵɵstylePropInterpolate7, ɵɵstylePropInterpolate8, ɵɵstylePropInterpolateV, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
export type { AbstractType, AfterContentChecked, AfterContentInit, AfterRenderOptions, AfterRenderRef, AfterViewChecked, AfterViewInit, ApplicationConfig, AttributeDecorator, BaseResourceOptions, BootstrapOptions, ClassProvider, ClassSansProvider, CompilerOptions, ComponentDecorator, ComponentMirror, ConstructorProvider, ConstructorSansProvider, ContentChildDecorator, ContentChildFunction, ContentChildrenDecorator, CreateComputedOptions, CreateEffectOptions, CreateSignalOptions, DirectiveDecorator, DoBootstrap, DoCheck, EffectCleanupFn, EffectCleanupRegisterFn, EffectRef, EnvironmentProviders, ExistingProvider, ExistingSansProvider, FactoryProvider, FactorySansProvider, ForwardRefFn, GetTestability, HostBindingDecorator, HostDecorator, HostListenerDecorator, ImportProvidersSource, ImportedNgModuleProviders, InjectDecorator, InjectOptions, InjectableDecorator, InjectableProvider, InjectableType, InjectorType, InputDecorator, InputFunction, InputOptions, InputOptionsWithTransform, InputOptionsWithoutTransform, InputSignal, InputSignalWithTransform, IterableChangeRecord, IterableChanges, IterableDiffer, IterableDifferFactory, KeyValueChangeRecord, KeyValueChanges, KeyValueDiffer, KeyValueDifferFactory, ListenerOptions, ModelFunction, ModelOptions, ModelSignal, ModuleWithProviders, NgIterable, NgModuleDecorator, NgZoneOptions, OnChanges, OnDestroy, OnInit, OptionalDecorator, OutputDecorator, OutputOptions, OutputRef, OutputRefSubscription, PipeDecorator, PipeTransform, Predicate, PromiseResourceOptions, Provider, ProviderToken, RendererType2, Resource, ResourceLoader, ResourceLoaderParams, ResourceOptions, ResourceRef, ResourceStreamItem, ResourceStreamingLoader, SchemaMetadata, SelfDecorator, Signal, SimpleChanges, SkipSelfDecorator, StateKey, StaticClassProvider, StaticClassSansProvider, StaticProvider, StreamingResourceOptions, TrackByFunction, TypeDecorator, TypeProvider, ValueEqualityFn, ValueProvider, ValueSansProvider, ViewChildDecorator, ViewChildFunction, ViewChildrenDecorator, WritableResource, WritableSignal, ComponentDebugMetadata as ɵComponentDebugMetadata, ComponentDef as ɵComponentDef, ComponentType as ɵComponentType, CssSelectorList as ɵCssSelectorList, DeferBlockConfig as ɵDeferBlockConfig, DeferBlockDependencyInterceptor as ɵDeferBlockDependencyInterceptor, DeferBlockDetails as ɵDeferBlockDetails, DirectiveDef as ɵDirectiveDef, DirectiveType as ɵDirectiveType, ɵFirstAvailable, ɵFirstAvailableSignal, GlobalDevModeUtils as ɵGlobalDevModeUtils, HydratedNode as ɵHydratedNode, HydrationInfo as ɵHydrationInfo, ImageConfig as ɵImageConfig, InjectorProfilerContext as ɵInjectorProfilerContext, InputSignalNode as ɵInputSignalNode, InternalEnvironmentProviders as ɵInternalEnvironmentProviders, NgModuleDef as ɵNgModuleDef, NgModuleTransitiveScopes as ɵNgModuleTransitiveScopes, NgModuleType as ɵNgModuleType, PipeDef as ɵPipeDef, Profiler as ɵProfiler, ProviderRecord as ɵProviderRecord, SafeHtml as ɵSafeHtml, SafeResourceUrl as ɵSafeResourceUrl, SafeScript as ɵSafeScript, SafeStyle as ɵSafeStyle, SafeUrl as ɵSafeUrl, SafeValue as ɵSafeValue, TracingSnapshot as ɵTracingSnapshot, ɵUnwrapDirectiveSignalInputs, Writable as ɵWritable, ɵɵComponentDeclaration, ɵɵDirectiveDeclaration, ɵɵFactoryDeclaration, ɵɵInjectableDeclaration, ɵɵInjectorDeclaration, ɵɵInjectorDef, ɵɵNgModuleDeclaration, ɵɵPipeDeclaration };
ñ	x>/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

interface NavigationEventMap {
    navigate: NavigateEvent;
    navigatesuccess: Event;
    navigateerror: ErrorEvent;
    currententrychange: NavigationCurrentEntryChangeEvent;
}
interface NavigationResult {
    committed: Promise<NavigationHistoryEntry>;
    finished: Promise<NavigationHistoryEntry>;
}
declare class Navigation extends EventTarget {
    entries(): NavigationHistoryEntry[];
    readonly currentEntry: NavigationHistoryEntry | null;
    updateCurrentEntry(options: NavigationUpdateCurrentEntryOptions): void;
    readonly transition: NavigationTransition | null;
    readonly canGoBack: boolean;
    readonly canGoForward: boolean;
    navigate(url: string, options?: NavigationNavigateOptions): NavigationResult;
    reload(options?: NavigationReloadOptions): NavigationResult;
    traverseTo(key: string, options?: NavigationOptions): NavigationResult;
    back(options?: NavigationOptions): NavigationResult;
    forward(options?: NavigationOptions): NavigationResult;
    onnavigate: ((this: Navigation, ev: NavigateEvent) => any) | null;
    onnavigatesuccess: ((this: Navigation, ev: Event) => any) | null;
    onnavigateerror: ((this: Navigation, ev: ErrorEvent) => any) | null;
    oncurrententrychange: ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null;
    addEventListener<K extends keyof NavigationEventMap>(type: K, listener: (this: Navigation, ev: NavigationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof NavigationEventMap>(type: K, listener: (this: Navigation, ev: NavigationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}
declare class NavigationTransition {
    readonly navigationType: NavigationTypeString;
    readonly from: NavigationHistoryEntry;
    readonly finished: Promise<void>;
}
interface NavigationHistoryEntryEventMap {
    dispose: Event;
}
declare class NavigationHistoryEntry extends EventTarget {
    readonly key: string;
    readonly id: string;
    readonly url: string | null;
    readonly index: number;
    readonly sameDocument: boolean;
    getState(): unknown;
    ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null;
    addEventListener<K extends keyof NavigationHistoryEntryEventMap>(type: K, listener: (this: NavigationHistoryEntry, ev: NavigationHistoryEntryEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof NavigationHistoryEntryEventMap>(type: K, listener: (this: NavigationHistoryEntry, ev: NavigationHistoryEntryEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}
type NavigationTypeString = 'reload' | 'push' | 'replace' | 'traverse';
interface NavigationUpdateCurrentEntryOptions {
    state: unknown;
}
interface NavigationOptions {
    info?: unknown;
}
interface NavigationNavigateOptions extends NavigationOptions {
    state?: unknown;
    history?: 'auto' | 'push' | 'replace';
}
interface NavigationReloadOptions extends NavigationOptions {
    state?: unknown;
}
declare class NavigationCurrentEntryChangeEvent extends Event {
    constructor(type: string, eventInit?: NavigationCurrentEntryChangeEventInit);
    readonly navigationType: NavigationTypeString | null;
    readonly from: NavigationHistoryEntry;
}
interface NavigationCurrentEntryChangeEventInit extends EventInit {
    navigationType?: NavigationTypeString | null;
    from: NavigationHistoryEntry;
}
declare class NavigateEvent extends Event {
    constructor(type: string, eventInit?: NavigateEventInit);
    readonly navigationType: NavigationTypeString;
    readonly canIntercept: boolean;
    readonly userInitiated: boolean;
    readonly hashChange: boolean;
    readonly destination: NavigationDestination;
    readonly signal: AbortSignal;
    readonly formData: FormData | null;
    readonly downloadRequest: string | null;
    readonly info?: unknown;
    intercept(options?: NavigationInterceptOptions): void;
    scroll(): void;
}
interface NavigateEventInit extends EventInit {
    navigationType?: NavigationTypeString;
    canIntercept?: boolean;
    userInitiated?: boolean;
    hashChange?: boolean;
    destination: NavigationDestination;
    signal: AbortSignal;
    formData?: FormData | null;
    downloadRequest?: string | null;
    info?: unknown;
}
interface NavigationInterceptOptions {
    handler?: () => Promise<void>;
    focusReset?: 'after-transition' | 'manual';
    scroll?: 'after-transition' | 'manual';
}
declare class NavigationDestination {
    readonly url: string;
    readonly key: string | null;
    readonly id: string | null;
    readonly index: number;
    readonly sameDocument: boolean;
    getState(): unknown;
}

export { NavigateEvent, Navigation, NavigationCurrentEntryChangeEvent, NavigationDestination, NavigationHistoryEntry, NavigationTransition };
export type { NavigationInterceptOptions, NavigationNavigateOptions, NavigationOptions, NavigationReloadOptions, NavigationResult, NavigationTypeString, NavigationUpdateCurrentEntryOptions };
x
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

/**
 * @description
 *
 * Represents a type that a Component or other object is instances of.
 *
 * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is represented by
 * the `MyCustomComponent` constructor function.
 *
 * @publicApi
 */
declare const Type: FunctionConstructor;
interface Type<T> extends Function {
    new (...args: any[]): T;
}

/**
 * Information about how a type or `InjectionToken` interfaces with the DI
 * system. This describes:
 *
 * 1. *How* the type is provided
 *    The declaration must specify only one of the following:
 *    - A `value` which is a predefined instance of the type.
 *    - A `factory` which defines how to create the given type `T`, possibly
 *      requesting injection of other types if necessary.
 *    - Neither, in which case the type is expected to already be present in the
 *      injector hierarchy. This is used for internal use cases.
 *
 * 2. *Where* the type is stored (if it is stored)
 *    - The `providedIn` parameter specifies which injector the type belongs to.
 *    - The `token` is used as the key to store the type in the injector.
 */
interface ɵɵInjectableDeclaration<T> {
    /**
     * Specifies that the given type belongs to a particular `Injector`,
     * `NgModule`, or a special scope (e.g. `'root'`).
     *
     * `any` is deprecated and will be removed soon.
     *
     * A value of `null` indicates that the injectable does not belong to any
     * scope, and won't be stored in any injector. For declarations with a
     * factory, this will create a new instance of the type each time it is
     * requested.
     */
    providedIn: Type<any> | 'root' | 'platform' | 'any' | null;
    /**
     * The token to which this definition belongs.
     *
     * Note that this may not be the same as the type that the `factory` will create.
     */
    token: unknown;
    /**
     * Factory method to execute to create an instance of the injectable.
     */
    factory?: (t?: Type<any>) => T;
    /**
     * In a case of no explicit injector, a location where the instance of the injectable is stored.
     */
    value?: T;
}
/**
 * A `Type` which has a `ɵprov: ɵɵInjectableDeclaration` static field.
 *
 * `InjectableType`s contain their own Dependency Injection metadata and are usable in an
 * `InjectorDef`-based `StaticInjector`.
 *
 * @publicApi
 */
interface InjectionToken<T> extends Type<T> {
    ɵprov: ɵɵInjectableDeclaration<T>;
}

/**
 * Value returned if the key-value pair couldn't be found in the context
 * hierarchy.
 */
declare const NOT_FOUND: unique symbol;
/**
 * Error thrown when the key-value pair couldn't be found in the context
 * hierarchy. Context can be attached below.
 */
declare class NotFoundError extends Error {
    constructor(message: string);
}
/**
 * Type guard for checking if an unknown value is a NotFound.
 */
declare function isNotFound(e: unknown): e is NotFound;
/**
 * Type union of NotFound and NotFoundError.
 */
type NotFound = typeof NOT_FOUND | NotFoundError;

interface Injector {
    retrieve<T>(token: InjectionToken<T>, options?: unknown): T | NotFound;
}
declare function getCurrentInjector(): Injector | undefined | null;
declare function setCurrentInjector(injector: Injector | null | undefined): Injector | undefined | null;

export { NOT_FOUND, NotFoundError, getCurrentInjector, isNotFound, setCurrentInjector };
export type { InjectionToken, Injector, NotFound, ɵɵInjectableDeclaration };
&ϣnx;/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { EarlyJsactionDataContainer, EventInfo, Restriction } from '../../event_dispatcher.d-K56StcHr.js';
export { EventContract, EventContractContainer, EventDispatcher, EventInfoWrapper, EventPhase, registerDispatcher } from '../../event_dispatcher.d-K56StcHr.js';

declare const Attribute: {
    /**
     * The jsaction attribute defines a mapping of a DOM event to a
     * generic event (aka jsaction), to which the actual event handlers
     * that implement the behavior of the application are bound. The
     * value is a semicolon separated list of colon separated pairs of
     * an optional DOM event name and a jsaction name. If the optional
     * DOM event name is omitted, 'click' is assumed. The jsaction names
     * are dot separated pairs of a namespace and a simple jsaction
     * name.
     *
     * See grammar in README.md for expected syntax in the attribute value.
     */
    JSACTION: "jsaction";
};

/**
 * Reads the jsaction parser cache for the given DOM element. If no cache is yet present,
 * creates an empty one.
 */
declare function getDefaulted(element: Element): {
    [key: string]: string | undefined;
};

/**
 * Whether or not an event type should be registered in the capture phase.
 * @param eventType
 * @returns bool
 */
declare const isCaptureEventType: (eventType: string) => boolean;
/**
 * Whether or not an event type is registered in the early contract.
 */
declare const isEarlyEventType: (eventType: string) => boolean;

/**
 * Creates an `EarlyJsactionData`, adds events to it, and populates it on a nested object on
 * the window.
 */
declare function bootstrapAppScopedEarlyEventContract(container: HTMLElement, appId: string, bubbleEventTypes: string[], captureEventTypes: string[], dataContainer?: EarlyJsactionDataContainer): void;
/** Get the queued `EventInfo` objects that were dispatched before a dispatcher was registered. */
declare function getAppScopedQueuedEventInfos(appId: string, dataContainer?: EarlyJsactionDataContainer): EventInfo[];
/**
 * Registers a dispatcher function on the `EarlyJsactionData` present on the nested object on the
 * window.
 */
declare function registerAppScopedDispatcher(restriction: Restriction, appId: string, dispatcher: (eventInfo: EventInfo) => void, dataContainer?: EarlyJsactionDataContainer): void;
/** Removes all event listener handlers. */
declare function removeAllAppScopedEventListeners(appId: string, dataContainer?: EarlyJsactionDataContainer): void;
/** Clear the early event contract. */
declare function clearAppScopedEarlyEventContract(appId: string, dataContainer?: EarlyJsactionDataContainer): void;

export { Attribute, EarlyJsactionDataContainer, bootstrapAppScopedEarlyEventContract, clearAppScopedEarlyEventContract, getDefaulted as getActionCache, getAppScopedQueuedEventInfos, isCaptureEventType, isEarlyEventType, registerAppScopedDispatcher, removeAllAppScopedEventListeners };
Ax/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { ReactiveNode, ValueEqualityFn, SIGNAL, SignalNode } from '../../weak_ref.d-DWHPG08n.js';
export { REACTIVE_NODE, Reactive, SIGNAL_NODE, SignalGetter, consumerAfterComputation, consumerBeforeComputation, consumerDestroy, consumerMarkDirty, consumerPollProducersForChange, createSignal, defaultEquals, getActiveConsumer, isInNotificationPhase, isReactive, producerAccessed, producerIncrementEpoch, producerMarkClean, producerNotifyConsumers, producerUpdateValueVersion, producerUpdatesAllowed, runPostSignalSetFn, setActiveConsumer, setAlternateWeakRefImpl, setPostSignalSetFn, signalSetFn, signalUpdateFn } from '../../weak_ref.d-DWHPG08n.js';

/**
 * A computation, which derives a value from a declarative reactive expression.
 *
 * `Computed`s are both producers and consumers of reactivity.
 */
interface ComputedNode<T> extends ReactiveNode {
    /**
     * Current value of the computation, or one of the sentinel values above (`UNSET`, `COMPUTING`,
     * `ERROR`).
     */
    value: T;
    /**
     * If `value` is `ERRORED`, the error caught from the last computation attempt which will
     * be re-thrown.
     */
    error: unknown;
    /**
     * The computation function which will produce a new value.
     */
    computation: () => T;
    equal: ValueEqualityFn<T>;
}
type ComputedGetter<T> = (() => T) & {
    [SIGNAL]: ComputedNode<T>;
};
/**
 * Create a computed signal which derives a reactive value from an expression.
 */
declare function createComputed<T>(computation: () => T, equal?: ValueEqualityFn<T>): ComputedGetter<T>;

type ComputationFn<S, D> = (source: S, previous?: {
    source: S;
    value: D;
}) => D;
interface LinkedSignalNode<S, D> extends ReactiveNode {
    /**
     * Value of the source signal that was used to derive the computed value.
     */
    sourceValue: S;
    /**
     * Current state value, or one of the sentinel values (`UNSET`, `COMPUTING`,
     * `ERROR`).
     */
    value: D;
    /**
     * If `value` is `ERRORED`, the error caught from the last computation attempt which will
     * be re-thrown.
     */
    error: unknown;
    /**
     * The source function represents reactive dependency based on which the linked state is reset.
     */
    source: () => S;
    /**
     * The computation function which will produce a new value based on the source and, optionally - previous values.
     */
    computation: ComputationFn<S, D>;
    equal: ValueEqualityFn<D>;
}
type LinkedSignalGetter<S, D> = (() => D) & {
    [SIGNAL]: LinkedSignalNode<S, D>;
};
declare function createLinkedSignal<S, D>(sourceFn: () => S, computationFn: ComputationFn<S, D>, equalityFn?: ValueEqualityFn<D>): LinkedSignalGetter<S, D>;
declare function linkedSignalSetFn<S, D>(node: LinkedSignalNode<S, D>, newValue: D): void;
declare function linkedSignalUpdateFn<S, D>(node: LinkedSignalNode<S, D>, updater: (value: D) => D): void;

declare function setThrowInvalidWriteToSignalError(fn: <T>(node: SignalNode<T>) => never): void;

/**
 * A cleanup function that can be optionally registered from the watch logic. If registered, the
 * cleanup logic runs before the next watch execution.
 */
type WatchCleanupFn = () => void;
/**
 * A callback passed to the watch function that makes it possible to register cleanup logic.
 */
type WatchCleanupRegisterFn = (cleanupFn: WatchCleanupFn) => void;
interface Watch {
    notify(): void;
    /**
     * Execute the reactive expression in the context of this `Watch` consumer.
     *
     * Should be called by the user scheduling algorithm when the provided
     * `schedule` hook is called by `Watch`.
     */
    run(): void;
    cleanup(): void;
    /**
     * Destroy the watcher:
     * - disconnect it from the reactive graph;
     * - mark it as destroyed so subsequent run and notify operations are noop.
     */
    destroy(): void;
    [SIGNAL]: WatchNode;
}
interface WatchNode extends ReactiveNode {
    hasRun: boolean;
    fn: ((onCleanup: WatchCleanupRegisterFn) => void) | null;
    schedule: ((watch: Watch) => void) | null;
    cleanupFn: WatchCleanupFn;
    ref: Watch;
}
declare function createWatch(fn: (onCleanup: WatchCleanupRegisterFn) => void, schedule: (watch: Watch) => void, allowSignalWrites: boolean): Watch;

/**
 * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
 * can, optionally, return a value.
 */
declare function untracked<T>(nonReactiveReadsFn: () => T): T;

export { ReactiveNode, SIGNAL, SignalNode, ValueEqualityFn, createComputed, createLinkedSignal, createWatch, linkedSignalSetFn, linkedSignalUpdateFn, setThrowInvalidWriteToSignalError, untracked };
export type { ComputationFn, ComputedNode, LinkedSignalGetter, LinkedSignalNode, Watch, WatchCleanupFn, WatchCleanupRegisterFn };
|C;x*/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import { OutputOptions, OutputRef, DestroyRef, Signal, Injector, BaseResourceOptions, ResourceLoaderParams, ResourceRef } from '@angular/core';
import { Observable, MonoTypeOperatorFunction, Subscribable } from 'rxjs';
import { ValueEqualityFn } from '@angular/core/primitives/signals';

/**
 * Declares an Angular output that is using an RxJS observable as a source
 * for events dispatched to parent subscribers.
 *
 * The behavior for an observable as source is defined as followed:
 *    1. New values are forwarded to the Angular output (next notifications).
 *    2. Errors notifications are not handled by Angular. You need to handle these manually.
 *       For example by using `catchError`.
 *    3. Completion notifications stop the output from emitting new values.
 *
 * @usageNotes
 * Initialize an output in your directive by declaring a
 * class field and initializing it with the `outputFromObservable()` function.
 *
 * ```ts
 * @Directive({..})
 * export class MyDir {
 *   nameChange$ = <some-observable>;
 *   nameChange = outputFromObservable(this.nameChange$);
 * }
 * ```
 *
 * @publicApi
 */
declare function outputFromObservable<T>(observable: Observable<T>, opts?: OutputOptions): OutputRef<T>;

/**
 * Converts an Angular output declared via `output()` or `outputFromObservable()`
 * to an observable.
 *
 * You can subscribe to the output via `Observable.subscribe` then.
 *
 * @publicApi
 */
declare function outputToObservable<T>(ref: OutputRef<T>): Observable<T>;

/**
 * Operator which completes the Observable when the calling context (component, directive, service,
 * etc) is destroyed.
 *
 * @param destroyRef optionally, the `DestroyRef` representing the current context. This can be
 *     passed explicitly to use `takeUntilDestroyed` outside of an [injection
 * context](guide/di/dependency-injection-context). Otherwise, the current `DestroyRef` is injected.
 *
 * @publicApi
 */
declare function takeUntilDestroyed<T>(destroyRef?: DestroyRef): MonoTypeOperatorFunction<T>;

/**
 * Options for `toObservable`.
 *
 * @developerPreview
 */
interface ToObservableOptions {
    /**
     * The `Injector` to use when creating the underlying `effect` which watches the signal.
     *
     * If this isn't specified, the current [injection context](guide/di/dependency-injection-context)
     * will be used.
     */
    injector?: Injector;
}
/**
 * Exposes the value of an Angular `Signal` as an RxJS `Observable`.
 *
 * The signal's value will be propagated into the `Observable`'s subscribers using an `effect`.
 *
 * `toObservable` must be called in an injection context unless an injector is provided via options.
 *
 * @developerPreview
 */
declare function toObservable<T>(source: Signal<T>, options?: ToObservableOptions): Observable<T>;
declare function toObservableMicrotask<T>(source: Signal<T>, options?: ToObservableOptions): Observable<T>;

/**
 * Options for `toSignal`.
 *
 * @publicApi
 */
interface ToSignalOptions<T> {
    /**
     * Initial value for the signal produced by `toSignal`.
     *
     * This will be the value of the signal until the observable emits its first value.
     */
    initialValue?: unknown;
    /**
     * Whether to require that the observable emits synchronously when `toSignal` subscribes.
     *
     * If this is `true`, `toSignal` will assert that the observable produces a value immediately upon
     * subscription. Setting this option removes the need to either deal with `undefined` in the
     * signal type or provide an `initialValue`, at the cost of a runtime error if this requirement is
     * not met.
     */
    requireSync?: boolean;
    /**
     * `Injector` which will provide the `DestroyRef` used to clean up the Observable subscription.
     *
     * If this is not provided, a `DestroyRef` will be retrieved from the current [injection
     * context](guide/di/dependency-injection-context), unless manual cleanup is requested.
     */
    injector?: Injector;
    /**
     * Whether the subscription should be automatically cleaned up (via `DestroyRef`) when
     * `toSignal`'s creation context is destroyed.
     *
     * If manual cleanup is enabled, then `DestroyRef` is not used, and the subscription will persist
     * until the `Observable` itself completes.
     */
    manualCleanup?: boolean;
    /**
     * Whether `toSignal` should throw errors from the Observable error channel back to RxJS, where
     * they'll be processed as uncaught exceptions.
     *
     * In practice, this means that the signal returned by `toSignal` will keep returning the last
     * good value forever, as Observables which error produce no further values. This option emulates
     * the behavior of the `async` pipe.
     */
    rejectErrors?: boolean;
    /**
     * A comparison function which defines equality for values emitted by the observable.
     *
     * Equality comparisons are executed against the initial value if one is provided.
     */
    equal?: ValueEqualityFn<T>;
}
declare function toSignal<T>(source: Observable<T> | Subscribable<T>): Signal<T | undefined>;
declare function toSignal<T>(source: Observable<T> | Subscribable<T>, options: NoInfer<ToSignalOptions<T | undefined>> & {
    initialValue?: undefined;
    requireSync?: false;
}): Signal<T | undefined>;
declare function toSignal<T>(source: Observable<T> | Subscribable<T>, options: NoInfer<ToSignalOptions<T | null>> & {
    initialValue?: null;
    requireSync?: false;
}): Signal<T | null>;
declare function toSignal<T>(source: Observable<T> | Subscribable<T>, options: NoInfer<ToSignalOptions<T>> & {
    initialValue?: undefined;
    requireSync: true;
}): Signal<T>;
declare function toSignal<T, const U extends T>(source: Observable<T> | Subscribable<T>, options: NoInfer<ToSignalOptions<T | U>> & {
    initialValue: U;
    requireSync?: false;
}): Signal<T | U>;

/**
 * Operator which makes the application unstable until the observable emits, completes, errors, or is unsubscribed.
 *
 * Use this operator in observables whose subscriptions are important for rendering and should be included in SSR serialization.
 *
 * @param injector The `Injector` to use during creation. If this is not provided, the current injection context will be used instead (via `inject`).
 *
 * @experimental
 */
declare function pendingUntilEvent<T>(injector?: Injector): MonoTypeOperatorFunction<T>;

/**
 * Like `ResourceOptions` but uses an RxJS-based `loader`.
 *
 * @experimental
 */
interface RxResourceOptions<T, R> extends BaseResourceOptions<T, R> {
    loader: (params: ResourceLoaderParams<R>) => Observable<T>;
}
/**
 * Like `resource` but uses an RxJS based `loader` which maps the request to an `Observable` of the
 * resource's value.
 *
 * @experimental
 */
declare function rxResource<T, R>(opts: RxResourceOptions<T, R> & {
    defaultValue: NoInfer<T>;
}): ResourceRef<T>;
/**
 * Like `resource` but uses an RxJS based `loader` which maps the request to an `Observable` of the
 * resource's value.
 *
 * @experimental
 */
declare function rxResource<T, R>(opts: RxResourceOptions<T, R>): ResourceRef<T | undefined>;

export { outputFromObservable, outputToObservable, pendingUntilEvent, rxResource, takeUntilDestroyed, toObservable, toSignal, toObservableMicrotask as ɵtoObservableMicrotask };
export type { RxResourceOptions, ToObservableOptions, ToSignalOptions };
}xD'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');
require('os');
var checker = require('./checker-BwV9MjSQ.cjs');
var project_paths = require('./project_paths-DY3SIODd.cjs');

/**
 * Applies import manager changes, and writes them as replacements the
 * given result array.
 */
function applyImportManagerChanges(importManager, replacements, sourceFiles, info) {
    const { newImports, updatedImports, deletedImports } = importManager.finalize();
    const printer = ts.createPrinter({});
    const pathToFile = new Map(sourceFiles.map((s) => [s.fileName, s]));
    // Capture new imports
    newImports.forEach((newImports, fileName) => {
        newImports.forEach((newImport) => {
            const printedImport = printer.printNode(ts.EmitHint.Unspecified, newImport, pathToFile.get(fileName));
            replacements.push(new project_paths.Replacement(project_paths.projectFile(checker.absoluteFrom(fileName), info), new project_paths.TextUpdate({ position: 0, end: 0, toInsert: `${printedImport}\n` })));
        });
    });
    // Capture updated imports
    for (const [oldBindings, newBindings] of updatedImports.entries()) {
        // The import will be generated as multi-line if it already is multi-line,
        // or if the number of elements significantly increased and it previously
        // consisted of very few specifiers.
        const isMultiline = oldBindings.getText().includes('\n') ||
            (newBindings.elements.length >= 6 && oldBindings.elements.length <= 3);
        const hasSpaceBetweenBraces = oldBindings.getText().startsWith('{ ');
        let formatFlags = ts.ListFormat.NamedImportsOrExportsElements |
            ts.ListFormat.Indented |
            ts.ListFormat.Braces |
            ts.ListFormat.PreserveLines |
            (isMultiline ? ts.ListFormat.MultiLine : ts.ListFormat.SingleLine);
        if (hasSpaceBetweenBraces) {
            formatFlags |= ts.ListFormat.SpaceBetweenBraces;
        }
        else {
            formatFlags &= ~ts.ListFormat.SpaceBetweenBraces;
        }
        const printedBindings = printer.printList(formatFlags, newBindings.elements, oldBindings.getSourceFile());
        replacements.push(new project_paths.Replacement(project_paths.projectFile(oldBindings.getSourceFile(), info), new project_paths.TextUpdate({
            position: oldBindings.getStart(),
            end: oldBindings.getEnd(),
            // TS uses four spaces as indent. We migrate to two spaces as we
            // assume this to be more common.
            toInsert: printedBindings.replace(/^ {4}/gm, '  '),
        })));
    }
    // Update removed imports
    for (const removedImport of deletedImports) {
        replacements.push(new project_paths.Replacement(project_paths.projectFile(removedImport.getSourceFile(), info), new project_paths.TextUpdate({
            position: removedImport.getStart(),
            end: removedImport.getEnd(),
            toInsert: '',
        })));
    }
}

exports.applyImportManagerChanges = applyImportManagerChanges;
x   'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');
require('os');
var fs$1 = require('fs');
var module$1 = require('module');
var p = require('path');
var url = require('url');

var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
function _interopNamespaceDefault(e) {
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n.default = e;
    return Object.freeze(n);
}

var p__namespace = /*#__PURE__*/_interopNamespaceDefault(p);

const _SELECTOR_REGEXP = new RegExp('(\\:not\\()|' + // 1: ":not("
    '(([\\.\\#]?)[-\\w]+)|' + // 2: "tag"; 3: "."/"#";
    // "-" should appear first in the regexp below as FF31 parses "[.-\w]" as a range
    // 4: attribute; 5: attribute_string; 6: attribute_value
    '(?:\\[([-.\\w*\\\\$]+)(?:=(["\']?)([^\\]"\']*)\\5)?\\])|' + // "[name]", "[name=value]",
    // "[name="value"]",
    // "[name='value']"
    '(\\))|' + // 7: ")"
    '(\\s*,\\s*)', // 8: ","
'g');
/**
 * A css selector contains an element name,
 * css classes and attribute/value pairs with the purpose
 * of selecting subsets out of them.
 */
class CssSelector {
    element = null;
    classNames = [];
    /**
     * The selectors are encoded in pairs where:
     * - even locations are attribute names
     * - odd locations are attribute values.
     *
     * Example:
     * Selector: `[key1=value1][key2]` would parse to:
     * ```
     * ['key1', 'value1', 'key2', '']
     * ```
     */
    attrs = [];
    notSelectors = [];
    static parse(selector) {
        const results = [];
        const _addResult = (res, cssSel) => {
            if (cssSel.notSelectors.length > 0 &&
                !cssSel.element &&
                cssSel.classNames.length == 0 &&
                cssSel.attrs.length == 0) {
                cssSel.element = '*';
            }
            res.push(cssSel);
        };
        let cssSelector = new CssSelector();
        let match;
        let current = cssSelector;
        let inNot = false;
        _SELECTOR_REGEXP.lastIndex = 0;
        while ((match = _SELECTOR_REGEXP.exec(selector))) {
            if (match[1 /* SelectorRegexp.NOT */]) {
                if (inNot) {
                    throw new Error('Nesting :not in a selector is not allowed');
                }
                inNot = true;
                current = new CssSelector();
                cssSelector.notSelectors.push(current);
            }
            const tag = match[2 /* SelectorRegexp.TAG */];
            if (tag) {
                const prefix = match[3 /* SelectorRegexp.PREFIX */];
                if (prefix === '#') {
                    // #hash
                    current.addAttribute('id', tag.slice(1));
                }
                else if (prefix === '.') {
                    // Class
                    current.addClassName(tag.slice(1));
                }
                else {
                    // Element
                    current.setElement(tag);
                }
            }
            const attribute = match[4 /* SelectorRegexp.ATTRIBUTE */];
            if (attribute) {
                current.addAttribute(current.unescapeAttribute(attribute), match[6 /* SelectorRegexp.ATTRIBUTE_VALUE */]);
            }
            if (match[7 /* SelectorRegexp.NOT_END */]) {
                inNot = false;
                current = cssSelector;
            }
            if (match[8 /* SelectorRegexp.SEPARATOR */]) {
                if (inNot) {
                    throw new Error('Multiple selectors in :not are not supported');
                }
                _addResult(results, cssSelector);
                cssSelector = current = new CssSelector();
            }
        }
        _addResult(results, cssSelector);
        return results;
    }
    /**
     * Unescape `\$` sequences from the CSS attribute selector.
     *
     * This is needed because `$` can have a special meaning in CSS selectors,
     * but we might want to match an attribute that contains `$`.
     * [MDN web link for more
     * info](https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors).
     * @param attr the attribute to unescape.
     * @returns the unescaped string.
     */
    unescapeAttribute(attr) {
        let result = '';
        let escaping = false;
        for (let i = 0; i < attr.length; i++) {
            const char = attr.charAt(i);
            if (char === '\\') {
                escaping = true;
                continue;
            }
            if (char === '$' && !escaping) {
                throw new Error(`Error in attribute selector "${attr}". ` +
                    `Unescaped "$" is not supported. Please escape with "\\$".`);
            }
            escaping = false;
            result += char;
        }
        return result;
    }
    /**
     * Escape `$` sequences from the CSS attribute selector.
     *
     * This is needed because `$` can have a special meaning in CSS selectors,
     * with this method we are escaping `$` with `\$'.
     * [MDN web link for more
     * info](https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors).
     * @param attr the attribute to escape.
     * @returns the escaped string.
     */
    escapeAttribute(attr) {
        return attr.replace(/\\/g, '\\\\').replace(/\$/g, '\\$');
    }
    isElementSelector() {
        return (this.hasElementSelector() &&
            this.classNames.length == 0 &&
            this.attrs.length == 0 &&
            this.notSelectors.length === 0);
    }
    hasElementSelector() {
        return !!this.element;
    }
    setElement(element = null) {
        this.element = element;
    }
    getAttrs() {
        const result = [];
        if (this.classNames.length > 0) {
            result.push('class', this.classNames.join(' '));
        }
        return result.concat(this.attrs);
    }
    addAttribute(name, value = '') {
        this.attrs.push(name, (value && value.toLowerCase()) || '');
    }
    addClassName(name) {
        this.classNames.push(name.toLowerCase());
    }
    toString() {
        let res = this.element || '';
        if (this.classNames) {
            this.classNames.forEach((klass) => (res += `.${klass}`));
        }
        if (this.attrs) {
            for (let i = 0; i < this.attrs.length; i += 2) {
                const name = this.escapeAttribute(this.attrs[i]);
                const value = this.attrs[i + 1];
                res += `[${name}${value ? '=' + value : ''}]`;
            }
        }
        this.notSelectors.forEach((notSelector) => (res += `:not(${notSelector})`));
        return res;
    }
}
/**
 * Reads a list of CssSelectors and allows to calculate which ones
 * are contained in a given CssSelector.
 */
class SelectorMatcher {
    static createNotMatcher(notSelectors) {
        const notMatcher = new SelectorMatcher();
        notMatcher.addSelectables(notSelectors, null);
        return notMatcher;
    }
    _elementMap = new Map();
    _elementPartialMap = new Map();
    _classMap = new Map();
    _classPartialMap = new Map();
    _attrValueMap = new Map();
    _attrValuePartialMap = new Map();
    _listContexts = [];
    addSelectables(cssSelectors, callbackCtxt) {
        let listContext = null;
        if (cssSelectors.length > 1) {
            listContext = new SelectorListContext(cssSelectors);
            this._listContexts.push(listContext);
        }
        for (let i = 0; i < cssSelectors.length; i++) {
            this._addSelectable(cssSelectors[i], callbackCtxt, listContext);
        }
    }
    /**
     * Add an object that can be found later on by calling `match`.
     * @param cssSelector A css selector
     * @param callbackCtxt An opaque object that will be given to the callback of the `match` function
     */
    _addSelectable(cssSelector, callbackCtxt, listContext) {
        let matcher = this;
        const element = cssSelector.element;
        const classNames = cssSelector.classNames;
        const attrs = cssSelector.attrs;
        const selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);
        if (element) {
            const isTerminal = attrs.length === 0 && classNames.length === 0;
            if (isTerminal) {
                this._addTerminal(matcher._elementMap, element, selectable);
            }
            else {
                matcher = this._addPartial(matcher._elementPartialMap, element);
            }
        }
        if (classNames) {
            for (let i = 0; i < classNames.length; i++) {
                const isTerminal = attrs.length === 0 && i === classNames.length - 1;
                const className = classNames[i];
                if (isTerminal) {
                    this._addTerminal(matcher._classMap, className, selectable);
                }
                else {
                    matcher = this._addPartial(matcher._classPartialMap, className);
                }
            }
        }
        if (attrs) {
            for (let i = 0; i < attrs.length; i += 2) {
                const isTerminal = i === attrs.length - 2;
                const name = attrs[i];
                const value = attrs[i + 1];
                if (isTerminal) {
                    const terminalMap = matcher._attrValueMap;
                    let terminalValuesMap = terminalMap.get(name);
                    if (!terminalValuesMap) {
                        terminalValuesMap = new Map();
                        terminalMap.set(name, terminalValuesMap);
                    }
                    this._addTerminal(terminalValuesMap, value, selectable);
                }
                else {
                    const partialMap = matcher._attrValuePartialMap;
                    let partialValuesMap = partialMap.get(name);
                    if (!partialValuesMap) {
                        partialValuesMap = new Map();
                        partialMap.set(name, partialValuesMap);
                    }
                    matcher = this._addPartial(partialValuesMap, value);
                }
            }
        }
    }
    _addTerminal(map, name, selectable) {
        let terminalList = map.get(name);
        if (!terminalList) {
            terminalList = [];
            map.set(name, terminalList);
        }
        terminalList.push(selectable);
    }
    _addPartial(map, name) {
        let matcher = map.get(name);
        if (!matcher) {
            matcher = new SelectorMatcher();
            map.set(name, matcher);
        }
        return matcher;
    }
    /**
     * Find the objects that have been added via `addSelectable`
     * whose css selector is contained in the given css selector.
     * @param cssSelector A css selector
     * @param matchedCallback This callback will be called with the object handed into `addSelectable`
     * @return boolean true if a match was found
     */
    match(cssSelector, matchedCallback) {
        let result = false;
        const element = cssSelector.element;
        const classNames = cssSelector.classNames;
        const attrs = cssSelector.attrs;
        for (let i = 0; i < this._listContexts.length; i++) {
            this._listContexts[i].alreadyMatched = false;
        }
        result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;
        result =
            this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) || result;
        if (classNames) {
            for (let i = 0; i < classNames.length; i++) {
                const className = classNames[i];
                result =
                    this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;
                result =
                    this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) ||
                        result;
            }
        }
        if (attrs) {
            for (let i = 0; i < attrs.length; i += 2) {
                const name = attrs[i];
                const value = attrs[i + 1];
                const terminalValuesMap = this._attrValueMap.get(name);
                if (value) {
                    result =
                        this._matchTerminal(terminalValuesMap, '', cssSelector, matchedCallback) || result;
                }
                result =
                    this._matchTerminal(terminalValuesMap, value, cssSelector, matchedCallback) || result;
                const partialValuesMap = this._attrValuePartialMap.get(name);
                if (value) {
                    result = this._matchPartial(partialValuesMap, '', cssSelector, matchedCallback) || result;
                }
                result =
                    this._matchPartial(partialValuesMap, value, cssSelector, matchedCallback) || result;
            }
        }
        return result;
    }
    /** @internal */
    _matchTerminal(map, name, cssSelector, matchedCallback) {
        if (!map || typeof name !== 'string') {
            return false;
        }
        let selectables = map.get(name) || [];
        const starSelectables = map.get('*');
        if (starSelectables) {
            selectables = selectables.concat(starSelectables);
        }
        if (selectables.length === 0) {
            return false;
        }
        let selectable;
        let result = false;
        for (let i = 0; i < selectables.length; i++) {
            selectable = selectables[i];
            result = selectable.finalize(cssSelector, matchedCallback) || result;
        }
        return result;
    }
    /** @internal */
    _matchPartial(map, name, cssSelector, matchedCallback) {
        if (!map || typeof name !== 'string') {
            return false;
        }
        const nestedSelector = map.get(name);
        if (!nestedSelector) {
            return false;
        }
        // TODO(perf): get rid of recursion and measure again
        // TODO(perf): don't pass the whole selector into the recursion,
        // but only the not processed parts
        return nestedSelector.match(cssSelector, matchedCallback);
    }
}
class SelectorListContext {
    selectors;
    alreadyMatched = false;
    constructor(selectors) {
        this.selectors = selectors;
    }
}
// Store context to pass back selector and context when a selector is matched
class SelectorContext {
    selector;
    cbContext;
    listContext;
    notSelectors;
    constructor(selector, cbContext, listContext) {
        this.selector = selector;
        this.cbContext = cbContext;
        this.listContext = listContext;
        this.notSelectors = selector.notSelectors;
    }
    finalize(cssSelector, callback) {
        let result = true;
        if (this.notSelectors.length > 0 && (!this.listContext || !this.listContext.alreadyMatched)) {
            const notMatcher = SelectorMatcher.createNotMatcher(this.notSelectors);
            result = !notMatcher.match(cssSelector, null);
        }
        if (result && callback && (!this.listContext || !this.listContext.alreadyMatched)) {
            if (this.listContext) {
                this.listContext.alreadyMatched = true;
            }
            callback(this.selector, this.cbContext);
        }
        return result;
    }
}

// Attention:
// This file duplicates types and values from @angular/core
// so that we are able to make @angular/compiler independent of @angular/core.
// This is important to prevent a build cycle, as @angular/core needs to
// be compiled with the compiler.
// Stores the default value of `emitDistinctChangesOnly` when the `emitDistinctChangesOnly` is not
// explicitly set.
const emitDistinctChangesOnlyDefaultValue = true;
exports.ViewEncapsulation = void 0;
(function (ViewEncapsulation) {
    ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
    // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.
    ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
    ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
})(exports.ViewEncapsulation || (exports.ViewEncapsulation = {}));
exports.ChangeDetectionStrategy = void 0;
(function (ChangeDetectionStrategy) {
    ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush";
    ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default";
})(exports.ChangeDetectionStrategy || (exports.ChangeDetectionStrategy = {}));
/** Flags describing an input for a directive. */
var InputFlags;
(function (InputFlags) {
    InputFlags[InputFlags["None"] = 0] = "None";
    InputFlags[InputFlags["SignalBased"] = 1] = "SignalBased";
    InputFlags[InputFlags["HasDecoratorInputTransform"] = 2] = "HasDecoratorInputTransform";
})(InputFlags || (InputFlags = {}));
const CUSTOM_ELEMENTS_SCHEMA = {
    name: 'custom-elements',
};
const NO_ERRORS_SCHEMA = {
    name: 'no-errors-schema',
};
var SecurityContext;
(function (SecurityContext) {
    SecurityContext[SecurityContext["NONE"] = 0] = "NONE";
    SecurityContext[SecurityContext["HTML"] = 1] = "HTML";
    SecurityContext[SecurityContext["STYLE"] = 2] = "STYLE";
    SecurityContext[SecurityContext["SCRIPT"] = 3] = "SCRIPT";
    SecurityContext[SecurityContext["URL"] = 4] = "URL";
    SecurityContext[SecurityContext["RESOURCE_URL"] = 5] = "RESOURCE_URL";
})(SecurityContext || (SecurityContext = {}));
var MissingTranslationStrategy;
(function (MissingTranslationStrategy) {
    MissingTranslationStrategy[MissingTranslationStrategy["Error"] = 0] = "Error";
    MissingTranslationStrategy[MissingTranslationStrategy["Warning"] = 1] = "Warning";
    MissingTranslationStrategy[MissingTranslationStrategy["Ignore"] = 2] = "Ignore";
})(MissingTranslationStrategy || (MissingTranslationStrategy = {}));
function parserSelectorToSimpleSelector(selector) {
    const classes = selector.classNames && selector.classNames.length
        ? [8 /* SelectorFlags.CLASS */, ...selector.classNames]
        : [];
    const elementName = selector.element && selector.element !== '*' ? selector.element : '';
    return [elementName, ...selector.attrs, ...classes];
}
function parserSelectorToNegativeSelector(selector) {
    const classes = selector.classNames && selector.classNames.length
        ? [8 /* SelectorFlags.CLASS */, ...selector.classNames]
        : [];
    if (selector.element) {
        return [
            1 /* SelectorFlags.NOT */ | 4 /* SelectorFlags.ELEMENT */,
            selector.element,
            ...selector.attrs,
            ...classes,
        ];
    }
    else if (selector.attrs.length) {
        return [1 /* SelectorFlags.NOT */ | 2 /* SelectorFlags.ATTRIBUTE */, ...selector.attrs, ...classes];
    }
    else {
        return selector.classNames && selector.classNames.length
            ? [1 /* SelectorFlags.NOT */ | 8 /* SelectorFlags.CLASS */, ...selector.classNames]
            : [];
    }
}
function parserSelectorToR3Selector(selector) {
    const positive = parserSelectorToSimpleSelector(selector);
    const negative = selector.notSelectors && selector.notSelectors.length
        ? selector.notSelectors.map((notSelector) => parserSelectorToNegativeSelector(notSelector))
        : [];
    return positive.concat(...negative);
}
function parseSelectorToR3Selector(selector) {
    return selector ? CssSelector.parse(selector).map(parserSelectorToR3Selector) : [];
}

exports.FactoryTarget = void 0;
(function (FactoryTarget) {
    FactoryTarget[FactoryTarget["Directive"] = 0] = "Directive";
    FactoryTarget[FactoryTarget["Component"] = 1] = "Component";
    FactoryTarget[FactoryTarget["Injectable"] = 2] = "Injectable";
    FactoryTarget[FactoryTarget["Pipe"] = 3] = "Pipe";
    FactoryTarget[FactoryTarget["NgModule"] = 4] = "NgModule";
})(exports.FactoryTarget || (exports.FactoryTarget = {}));
var R3TemplateDependencyKind;
(function (R3TemplateDependencyKind) {
    R3TemplateDependencyKind[R3TemplateDependencyKind["Directive"] = 0] = "Directive";
    R3TemplateDependencyKind[R3TemplateDependencyKind["Pipe"] = 1] = "Pipe";
    R3TemplateDependencyKind[R3TemplateDependencyKind["NgModule"] = 2] = "NgModule";
})(R3TemplateDependencyKind || (R3TemplateDependencyKind = {}));
var ViewEncapsulation;
(function (ViewEncapsulation) {
    ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
    // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.
    ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
    ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
})(ViewEncapsulation || (ViewEncapsulation = {}));

/**
 * A lazily created TextEncoder instance for converting strings into UTF-8 bytes
 */
let textEncoder;
/**
 * Return the message id or compute it using the XLIFF1 digest.
 */
function digest$1(message) {
    return message.id || computeDigest(message);
}
/**
 * Compute the message id using the XLIFF1 digest.
 */
function computeDigest(message) {
    return sha1(serializeNodes(message.nodes).join('') + `[${message.meaning}]`);
}
/**
 * Return the message id or compute it using the XLIFF2/XMB/$localize digest.
 */
function decimalDigest(message) {
    return message.id || computeDecimalDigest(message);
}
/**
 * Compute the message id using the XLIFF2/XMB/$localize digest.
 */
function computeDecimalDigest(message) {
    const visitor = new _SerializerIgnoreIcuExpVisitor();
    const parts = message.nodes.map((a) => a.visit(visitor, null));
    return computeMsgId(parts.join(''), message.meaning);
}
/**
 * Serialize the i18n ast to something xml-like in order to generate an UID.
 *
 * The visitor is also used in the i18n parser tests
 *
 * @internal
 */
class _SerializerVisitor {
    visitText(text, context) {
        return text.value;
    }
    visitContainer(container, context) {
        return `[${container.children.map((child) => child.visit(this)).join(', ')}]`;
    }
    visitIcu(icu, context) {
        const strCases = Object.keys(icu.cases).map((k) => `${k} {${icu.cases[k].visit(this)}}`);
        return `{${icu.expression}, ${icu.type}, ${strCases.join(', ')}}`;
    }
    visitTagPlaceholder(ph, context) {
        return ph.isVoid
            ? `<ph tag name="${ph.startName}"/>`
            : `<ph tag name="${ph.startName}">${ph.children
                .map((child) => child.visit(this))
                .join(', ')}</ph name="${ph.closeName}">`;
    }
    visitPlaceholder(ph, context) {
        return ph.value ? `<ph name="${ph.name}">${ph.value}</ph>` : `<ph name="${ph.name}"/>`;
    }
    visitIcuPlaceholder(ph, context) {
        return `<ph icu name="${ph.name}">${ph.value.visit(this)}</ph>`;
    }
    visitBlockPlaceholder(ph, context) {
        return `<ph block name="${ph.startName}">${ph.children
            .map((child) => child.visit(this))
            .join(', ')}</ph name="${ph.closeName}">`;
    }
}
const serializerVisitor$1 = new _SerializerVisitor();
function serializeNodes(nodes) {
    return nodes.map((a) => a.visit(serializerVisitor$1, null));
}
/**
 * Serialize the i18n ast to something xml-like in order to generate an UID.
 *
 * Ignore the ICU expressions so that message IDs stays identical if only the expression changes.
 *
 * @internal
 */
class _SerializerIgnoreIcuExpVisitor extends _SerializerVisitor {
    visitIcu(icu) {
        let strCases = Object.keys(icu.cases).map((k) => `${k} {${icu.cases[k].visit(this)}}`);
        // Do not take the expression into account
        return `{${icu.type}, ${strCases.join(', ')}}`;
    }
}
/**
 * Compute the SHA1 of the given string
 *
 * see https://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
 *
 * WARNING: this function has not been designed not tested with security in mind.
 *          DO NOT USE IT IN A SECURITY SENSITIVE CONTEXT.
 */
function sha1(str) {
    textEncoder ??= new TextEncoder();
    const utf8 = [...textEncoder.encode(str)];
    const words32 = bytesToWords32(utf8, Endian.Big);
    const len = utf8.length * 8;
    const w = new Uint32Array(80);
    let a = 0x67452301, b = 0xefcdab89, c = 0x98badcfe, d = 0x10325476, e = 0xc3d2e1f0;
    words32[len >> 5] |= 0x80 << (24 - (len % 32));
    words32[(((len + 64) >> 9) << 4) + 15] = len;
    for (let i = 0; i < words32.length; i += 16) {
        const h0 = a, h1 = b, h2 = c, h3 = d, h4 = e;
        for (let j = 0; j < 80; j++) {
            if (j < 16) {
                w[j] = words32[i + j];
            }
            else {
                w[j] = rol32(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
            }
            const fkVal = fk(j, b, c, d);
            const f = fkVal[0];
            const k = fkVal[1];
            const temp = [rol32(a, 5), f, e, k, w[j]].reduce(add32);
            e = d;
            d = c;
            c = rol32(b, 30);
            b = a;
            a = temp;
        }
        a = add32(a, h0);
        b = add32(b, h1);
        c = add32(c, h2);
        d = add32(d, h3);
        e = add32(e, h4);
    }
    // Convert the output parts to a 160-bit hexadecimal string
    return toHexU32(a) + toHexU32(b) + toHexU32(c) + toHexU32(d) + toHexU32(e);
}
/**
 * Convert and format a number as a string representing a 32-bit unsigned hexadecimal number.
 * @param value The value to format as a string.
 * @returns A hexadecimal string representing the value.
 */
function toHexU32(value) {
    // unsigned right shift of zero ensures an unsigned 32-bit number
    return (value >>> 0).toString(16).padStart(8, '0');
}
function fk(index, b, c, d) {
    if (index < 20) {
        return [(b & c) | (~b & d), 0x5a827999];
    }
    if (index < 40) {
        return [b ^ c ^ d, 0x6ed9eba1];
    }
    if (index < 60) {
        return [(b & c) | (b & d) | (c & d), 0x8f1bbcdc];
    }
    return [b ^ c ^ d, 0xca62c1d6];
}
/**
 * Compute the fingerprint of the given string
 *
 * The output is 64 bit number encoded as a decimal string
 *
 * based on:
 * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/GoogleJsMessageIdGenerator.java
 */
function fingerprint(str) {
    textEncoder ??= new TextEncoder();
    const utf8 = textEncoder.encode(str);
    const view = new DataView(utf8.buffer, utf8.byteOffset, utf8.byteLength);
    let hi = hash32(view, utf8.length, 0);
    let lo = hash32(view, utf8.length, 102072);
    if (hi == 0 && (lo == 0 || lo == 1)) {
        hi = hi ^ 0x130f9bef;
        lo = lo ^ -1801410264;
    }
    return (BigInt.asUintN(32, BigInt(hi)) << BigInt(32)) | BigInt.asUintN(32, BigInt(lo));
}
function computeMsgId(msg, meaning = '') {
    let msgFingerprint = fingerprint(msg);
    if (meaning) {
        // Rotate the 64-bit message fingerprint one bit to the left and then add the meaning
        // fingerprint.
        msgFingerprint =
            BigInt.asUintN(64, msgFingerprint << BigInt(1)) |
                ((msgFingerprint >> BigInt(63)) & BigInt(1));
        msgFingerprint += fingerprint(meaning);
    }
    return BigInt.asUintN(63, msgFingerprint).toString();
}
function hash32(view, length, c) {
    let a = 0x9e3779b9, b = 0x9e3779b9;
    let index = 0;
    const end = length - 12;
    for (; index <= end; index += 12) {
        a += view.getUint32(index, true);
        b += view.getUint32(index + 4, true);
        c += view.getUint32(index + 8, true);
        const res = mix(a, b, c);
        (a = res[0]), (b = res[1]), (c = res[2]);
    }
    const remainder = length - index;
    // the first byte of c is reserved for the length
    c += length;
    if (remainder >= 4) {
        a += view.getUint32(index, true);
        index += 4;
        if (remainder >= 8) {
            b += view.getUint32(index, true);
            index += 4;
            // Partial 32-bit word for c
            if (remainder >= 9) {
                c += view.getUint8(index++) << 8;
            }
            if (remainder >= 10) {
                c += view.getUint8(index++) << 16;
            }
            if (remainder === 11) {
                c += view.getUint8(index++) << 24;
            }
        }
        else {
            // Partial 32-bit word for b
            if (remainder >= 5) {
                b += view.getUint8(index++);
            }
            if (remainder >= 6) {
                b += view.getUint8(index++) << 8;
            }
            if (remainder === 7) {
                b += view.getUint8(index++) << 16;
            }
        }
    }
    else {
        // Partial 32-bit word for a
        if (remainder >= 1) {
            a += view.getUint8(index++);
        }
        if (remainder >= 2) {
            a += view.getUint8(index++) << 8;
        }
        if (remainder === 3) {
            a += view.getUint8(index++) << 16;
        }
    }
    return mix(a, b, c)[2];
}
function mix(a, b, c) {
    a -= b;
    a -= c;
    a ^= c >>> 13;
    b -= c;
    b -= a;
    b ^= a << 8;
    c -= a;
    c -= b;
    c ^= b >>> 13;
    a -= b;
    a -= c;
    a ^= c >>> 12;
    b -= c;
    b -= a;
    b ^= a << 16;
    c -= a;
    c -= b;
    c ^= b >>> 5;
    a -= b;
    a -= c;
    a ^= c >>> 3;
    b -= c;
    b -= a;
    b ^= a << 10;
    c -= a;
    c -= b;
    c ^= b >>> 15;
    return [a, b, c];
}
// Utils
var Endian;
(function (Endian) {
    Endian[Endian["Little"] = 0] = "Little";
    Endian[Endian["Big"] = 1] = "Big";
})(Endian || (Endian = {}));
function add32(a, b) {
    return add32to64(a, b)[1];
}
function add32to64(a, b) {
    const low = (a & 0xffff) + (b & 0xffff);
    const high = (a >>> 16) + (b >>> 16) + (low >>> 16);
    return [high >>> 16, (high << 16) | (low & 0xffff)];
}
// Rotate a 32b number left `count` position
function rol32(a, count) {
    return (a << count) | (a >>> (32 - count));
}
function bytesToWords32(bytes, endian) {
    const size = (bytes.length + 3) >>> 2;
    const words32 = [];
    for (let i = 0; i < size; i++) {
        words32[i] = wordAt(bytes, i * 4, endian);
    }
    return words32;
}
function byteAt(bytes, index) {
    return index >= bytes.length ? 0 : bytes[index];
}
function wordAt(bytes, index, endian) {
    let word = 0;
    if (endian === Endian.Big) {
        for (let i = 0; i < 4; i++) {
            word += byteAt(bytes, index + i) << (24 - 8 * i);
        }
    }
    else {
        for (let i = 0; i < 4; i++) {
            word += byteAt(bytes, index + i) << (8 * i);
        }
    }
    return word;
}

//// Types
var TypeModifier;
(function (TypeModifier) {
    TypeModifier[TypeModifier["None"] = 0] = "None";
    TypeModifier[TypeModifier["Const"] = 1] = "Const";
})(TypeModifier || (TypeModifier = {}));
class Type {
    modifiers;
    constructor(modifiers = TypeModifier.None) {
        this.modifiers = modifiers;
    }
    hasModifier(modifier) {
        return (this.modifiers & modifier) !== 0;
    }
}
var BuiltinTypeName;
(function (BuiltinTypeName) {
    BuiltinTypeName[BuiltinTypeName["Dynamic"] = 0] = "Dynamic";
    BuiltinTypeName[BuiltinTypeName["Bool"] = 1] = "Bool";
    BuiltinTypeName[BuiltinTypeName["String"] = 2] = "String";
    BuiltinTypeName[BuiltinTypeName["Int"] = 3] = "Int";
    BuiltinTypeName[BuiltinTypeName["Number"] = 4] = "Number";
    BuiltinTypeName[BuiltinTypeName["Function"] = 5] = "Function";
    BuiltinTypeName[BuiltinTypeName["Inferred"] = 6] = "Inferred";
    BuiltinTypeName[BuiltinTypeName["None"] = 7] = "None";
})(BuiltinTypeName || (BuiltinTypeName = {}));
class BuiltinType extends Type {
    name;
    constructor(name, modifiers) {
        super(modifiers);
        this.name = name;
    }
    visitType(visitor, context) {
        return visitor.visitBuiltinType(this, context);
    }
}
class ExpressionType extends Type {
    value;
    typeParams;
    constructor(value, modifiers, typeParams = null) {
        super(modifiers);
        this.value = value;
        this.typeParams = typeParams;
    }
    visitType(visitor, context) {
        return visitor.visitExpressionType(this, context);
    }
}
class TransplantedType extends Type {
    type;
    constructor(type, modifiers) {
        super(modifiers);
        this.type = type;
    }
    visitType(visitor, context) {
        return visitor.visitTransplantedType(this, context);
    }
}
const DYNAMIC_TYPE = new BuiltinType(BuiltinTypeName.Dynamic);
const INFERRED_TYPE = new BuiltinType(BuiltinTypeName.Inferred);
const BOOL_TYPE = new BuiltinType(BuiltinTypeName.Bool);
new BuiltinType(BuiltinTypeName.Int);
const NUMBER_TYPE = new BuiltinType(BuiltinTypeName.Number);
const STRING_TYPE = new BuiltinType(BuiltinTypeName.String);
new BuiltinType(BuiltinTypeName.Function);
const NONE_TYPE = new BuiltinType(BuiltinTypeName.None);
///// Expressions
var UnaryOperator;
(function (UnaryOperator) {
    UnaryOperator[UnaryOperator["Minus"] = 0] = "Minus";
    UnaryOperator[UnaryOperator["Plus"] = 1] = "Plus";
})(UnaryOperator || (UnaryOperator = {}));
var BinaryOperator;
(function (BinaryOperator) {
    BinaryOperator[BinaryOperator["Equals"] = 0] = "Equals";
    BinaryOperator[BinaryOperator["NotEquals"] = 1] = "NotEquals";
    BinaryOperator[BinaryOperator["Identical"] = 2] = "Identical";
    BinaryOperator[BinaryOperator["NotIdentical"] = 3] = "NotIdentical";
    BinaryOperator[BinaryOperator["Minus"] = 4] = "Minus";
    BinaryOperator[BinaryOperator["Plus"] = 5] = "Plus";
    BinaryOperator[BinaryOperator["Divide"] = 6] = "Divide";
    BinaryOperator[BinaryOperator["Multiply"] = 7] = "Multiply";
    BinaryOperator[BinaryOperator["Modulo"] = 8] = "Modulo";
    BinaryOperator[BinaryOperator["And"] = 9] = "And";
    BinaryOperator[BinaryOperator["Or"] = 10] = "Or";
    BinaryOperator[BinaryOperator["BitwiseOr"] = 11] = "BitwiseOr";
    BinaryOperator[BinaryOperator["BitwiseAnd"] = 12] = "BitwiseAnd";
    BinaryOperator[BinaryOperator["Lower"] = 13] = "Lower";
    BinaryOperator[BinaryOperator["LowerEquals"] = 14] = "LowerEquals";
    BinaryOperator[BinaryOperator["Bigger"] = 15] = "Bigger";
    BinaryOperator[BinaryOperator["BiggerEquals"] = 16] = "BiggerEquals";
    BinaryOperator[BinaryOperator["NullishCoalesce"] = 17] = "NullishCoalesce";
})(BinaryOperator || (BinaryOperator = {}));
function nullSafeIsEquivalent(base, other) {
    if (base == null || other == null) {
        return base == other;
    }
    return base.isEquivalent(other);
}
function areAllEquivalentPredicate(base, other, equivalentPredicate) {
    const len = base.length;
    if (len !== other.length) {
        return false;
    }
    for (let i = 0; i < len; i++) {
        if (!equivalentPredicate(base[i], other[i])) {
            return false;
        }
    }
    return true;
}
function areAllEquivalent(base, other) {
    return areAllEquivalentPredicate(base, other, (baseElement, otherElement) => baseElement.isEquivalent(otherElement));
}
class Expression {
    type;
    sourceSpan;
    constructor(type, sourceSpan) {
        this.type = type || null;
        this.sourceSpan = sourceSpan || null;
    }
    prop(name, sourceSpan) {
        return new ReadPropExpr(this, name, null, sourceSpan);
    }
    key(index, type, sourceSpan) {
        return new ReadKeyExpr(this, index, type, sourceSpan);
    }
    callFn(params, sourceSpan, pure) {
        return new InvokeFunctionExpr(this, params, null, sourceSpan, pure);
    }
    instantiate(params, type, sourceSpan) {
        return new InstantiateExpr(this, params, type, sourceSpan);
    }
    conditional(trueCase, falseCase = null, sourceSpan) {
        return new ConditionalExpr(this, trueCase, falseCase, null, sourceSpan);
    }
    equals(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Equals, this, rhs, null, sourceSpan);
    }
    notEquals(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.NotEquals, this, rhs, null, sourceSpan);
    }
    identical(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Identical, this, rhs, null, sourceSpan);
    }
    notIdentical(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.NotIdentical, this, rhs, null, sourceSpan);
    }
    minus(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Minus, this, rhs, null, sourceSpan);
    }
    plus(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Plus, this, rhs, null, sourceSpan);
    }
    divide(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Divide, this, rhs, null, sourceSpan);
    }
    multiply(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Multiply, this, rhs, null, sourceSpan);
    }
    modulo(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Modulo, this, rhs, null, sourceSpan);
    }
    and(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.And, this, rhs, null, sourceSpan);
    }
    bitwiseOr(rhs, sourceSpan, parens = true) {
        return new BinaryOperatorExpr(BinaryOperator.BitwiseOr, this, rhs, null, sourceSpan, parens);
    }
    bitwiseAnd(rhs, sourceSpan, parens = true) {
        return new BinaryOperatorExpr(BinaryOperator.BitwiseAnd, this, rhs, null, sourceSpan, parens);
    }
    or(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Or, this, rhs, null, sourceSpan);
    }
    lower(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Lower, this, rhs, null, sourceSpan);
    }
    lowerEquals(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.LowerEquals, this, rhs, null, sourceSpan);
    }
    bigger(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Bigger, this, rhs, null, sourceSpan);
    }
    biggerEquals(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.BiggerEquals, this, rhs, null, sourceSpan);
    }
    isBlank(sourceSpan) {
        // Note: We use equals by purpose here to compare to null and undefined in JS.
        // We use the typed null to allow strictNullChecks to narrow types.
        return this.equals(TYPED_NULL_EXPR, sourceSpan);
    }
    nullishCoalesce(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.NullishCoalesce, this, rhs, null, sourceSpan);
    }
    toStmt() {
        return new ExpressionStatement(this, null);
    }
}
class ReadVarExpr extends Expression {
    name;
    constructor(name, type, sourceSpan) {
        super(type, sourceSpan);
        this.name = name;
    }
    isEquivalent(e) {
        return e instanceof ReadVarExpr && this.name === e.name;
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitReadVarExpr(this, context);
    }
    clone() {
        return new ReadVarExpr(this.name, this.type, this.sourceSpan);
    }
    set(value) {
        return new WriteVarExpr(this.name, value, null, this.sourceSpan);
    }
}
class TypeofExpr extends Expression {
    expr;
    constructor(expr, type, sourceSpan) {
        super(type, sourceSpan);
        this.expr = expr;
    }
    visitExpression(visitor, context) {
        return visitor.visitTypeofExpr(this, context);
    }
    isEquivalent(e) {
        return e instanceof TypeofExpr && e.expr.isEquivalent(this.expr);
    }
    isConstant() {
        return this.expr.isConstant();
    }
    clone() {
        return new TypeofExpr(this.expr.clone());
    }
}
class WrappedNodeExpr extends Expression {
    node;
    constructor(node, type, sourceSpan) {
        super(type, sourceSpan);
        this.node = node;
    }
    isEquivalent(e) {
        return e instanceof WrappedNodeExpr && this.node === e.node;
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitWrappedNodeExpr(this, context);
    }
    clone() {
        return new WrappedNodeExpr(this.node, this.type, this.sourceSpan);
    }
}
class WriteVarExpr extends Expression {
    name;
    value;
    constructor(name, value, type, sourceSpan) {
        super(type || value.type, sourceSpan);
        this.name = name;
        this.value = value;
    }
    isEquivalent(e) {
        return e instanceof WriteVarExpr && this.name === e.name && this.value.isEquivalent(e.value);
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitWriteVarExpr(this, context);
    }
    clone() {
        return new WriteVarExpr(this.name, this.value.clone(), this.type, this.sourceSpan);
    }
    toDeclStmt(type, modifiers) {
        return new DeclareVarStmt(this.name, this.value, type, modifiers, this.sourceSpan);
    }
    toConstDecl() {
        return this.toDeclStmt(INFERRED_TYPE, exports.StmtModifier.Final);
    }
}
class WriteKeyExpr extends Expression {
    receiver;
    index;
    value;
    constructor(receiver, index, value, type, sourceSpan) {
        super(type || value.type, sourceSpan);
        this.receiver = receiver;
        this.index = index;
        this.value = value;
    }
    isEquivalent(e) {
        return (e instanceof WriteKeyExpr &&
            this.receiver.isEquivalent(e.receiver) &&
            this.index.isEquivalent(e.index) &&
            this.value.isEquivalent(e.value));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitWriteKeyExpr(this, context);
    }
    clone() {
        return new WriteKeyExpr(this.receiver.clone(), this.index.clone(), this.value.clone(), this.type, this.sourceSpan);
    }
}
class WritePropExpr extends Expression {
    receiver;
    name;
    value;
    constructor(receiver, name, value, type, sourceSpan) {
        super(type || value.type, sourceSpan);
        this.receiver = receiver;
        this.name = name;
        this.value = value;
    }
    isEquivalent(e) {
        return (e instanceof WritePropExpr &&
            this.receiver.isEquivalent(e.receiver) &&
            this.name === e.name &&
            this.value.isEquivalent(e.value));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitWritePropExpr(this, context);
    }
    clone() {
        return new WritePropExpr(this.receiver.clone(), this.name, this.value.clone(), this.type, this.sourceSpan);
    }
}
class InvokeFunctionExpr extends Expression {
    fn;
    args;
    pure;
    constructor(fn, args, type, sourceSpan, pure = false) {
        super(type, sourceSpan);
        this.fn = fn;
        this.args = args;
        this.pure = pure;
    }
    // An alias for fn, which allows other logic to handle calls and property reads together.
    get receiver() {
        return this.fn;
    }
    isEquivalent(e) {
        return (e instanceof InvokeFunctionExpr &&
            this.fn.isEquivalent(e.fn) &&
            areAllEquivalent(this.args, e.args) &&
            this.pure === e.pure);
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitInvokeFunctionExpr(this, context);
    }
    clone() {
        return new InvokeFunctionExpr(this.fn.clone(), this.args.map((arg) => arg.clone()), this.type, this.sourceSpan, this.pure);
    }
}
class TaggedTemplateLiteralExpr extends Expression {
    tag;
    template;
    constructor(tag, template, type, sourceSpan) {
        super(type, sourceSpan);
        this.tag = tag;
        this.template = template;
    }
    isEquivalent(e) {
        return (e instanceof TaggedTemplateLiteralExpr &&
            this.tag.isEquivalent(e.tag) &&
            this.template.isEquivalent(e.template));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitTaggedTemplateLiteralExpr(this, context);
    }
    clone() {
        return new TaggedTemplateLiteralExpr(this.tag.clone(), this.template.clone(), this.type, this.sourceSpan);
    }
}
class InstantiateExpr extends Expression {
    classExpr;
    args;
    constructor(classExpr, args, type, sourceSpan) {
        super(type, sourceSpan);
        this.classExpr = classExpr;
        this.args = args;
    }
    isEquivalent(e) {
        return (e instanceof InstantiateExpr &&
            this.classExpr.isEquivalent(e.classExpr) &&
            areAllEquivalent(this.args, e.args));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitInstantiateExpr(this, context);
    }
    clone() {
        return new InstantiateExpr(this.classExpr.clone(), this.args.map((arg) => arg.clone()), this.type, this.sourceSpan);
    }
}
class LiteralExpr extends Expression {
    value;
    constructor(value, type, sourceSpan) {
        super(type, sourceSpan);
        this.value = value;
    }
    isEquivalent(e) {
        return e instanceof LiteralExpr && this.value === e.value;
    }
    isConstant() {
        return true;
    }
    visitExpression(visitor, context) {
        return visitor.visitLiteralExpr(this, context);
    }
    clone() {
        return new LiteralExpr(this.value, this.type, this.sourceSpan);
    }
}
class TemplateLiteralExpr extends Expression {
    elements;
    expressions;
    constructor(elements, expressions, sourceSpan) {
        super(null, sourceSpan);
        this.elements = elements;
        this.expressions = expressions;
    }
    isEquivalent(e) {
        return (e instanceof TemplateLiteralExpr &&
            areAllEquivalentPredicate(this.elements, e.elements, (a, b) => a.text === b.text) &&
            areAllEquivalent(this.expressions, e.expressions));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitTemplateLiteralExpr(this, context);
    }
    clone() {
        return new TemplateLiteralExpr(this.elements.map((el) => el.clone()), this.expressions.map((expr) => expr.clone()));
    }
}
class TemplateLiteralElementExpr extends Expression {
    text;
    rawText;
    constructor(text, sourceSpan, rawText) {
        super(STRING_TYPE, sourceSpan);
        this.text = text;
        // If `rawText` is not provided, "fake" the raw string by escaping the following sequences:
        // - "\" would otherwise indicate that the next character is a control character.
        // - "`" and "${" are template string control sequences that would otherwise prematurely
        // indicate the end of the template literal element.
        // Note that we can't rely on the `sourceSpan` here, because it may be incorrect (see
        // https://github.com/angular/angular/pull/60267#discussion_r1986402524).
        this.rawText = rawText ?? escapeForTemplateLiteral(escapeSlashes(text));
    }
    visitExpression(visitor, context) {
        return visitor.visitTemplateLiteralElementExpr(this, context);
    }
    isEquivalent(e) {
        return (e instanceof TemplateLiteralElementExpr && e.text === this.text && e.rawText === this.rawText);
    }
    isConstant() {
        return true;
    }
    clone() {
        return new TemplateLiteralElementExpr(this.text, this.sourceSpan, this.rawText);
    }
}
class LiteralPiece {
    text;
    sourceSpan;
    constructor(text, sourceSpan) {
        this.text = text;
        this.sourceSpan = sourceSpan;
    }
}
class PlaceholderPiece {
    text;
    sourceSpan;
    associatedMessage;
    /**
     * Create a new instance of a `PlaceholderPiece`.
     *
     * @param text the name of this placeholder (e.g. `PH_1`).
     * @param sourceSpan the location of this placeholder in its localized message the source code.
     * @param associatedMessage reference to another message that this placeholder is associated with.
     * The `associatedMessage` is mainly used to provide a relationship to an ICU message that has
     * been extracted out from the message containing the placeholder.
     */
    constructor(text, sourceSpan, associatedMessage) {
        this.text = text;
        this.sourceSpan = sourceSpan;
        this.associatedMessage = associatedMessage;
    }
}
const MEANING_SEPARATOR$1 = '|';
const ID_SEPARATOR$1 = '@@';
const LEGACY_ID_INDICATOR = '␟';
class LocalizedString extends Expression {
    metaBlock;
    messageParts;
    placeHolderNames;
    expressions;
    constructor(metaBlock, messageParts, placeHolderNames, expressions, sourceSpan) {
        super(STRING_TYPE, sourceSpan);
        this.metaBlock = metaBlock;
        this.messageParts = messageParts;
        this.placeHolderNames = placeHolderNames;
        this.expressions = expressions;
    }
    isEquivalent(e) {
        // return e instanceof LocalizedString && this.message === e.message;
        return false;
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitLocalizedString(this, context);
    }
    clone() {
        return new LocalizedString(this.metaBlock, this.messageParts, this.placeHolderNames, this.expressions.map((expr) => expr.clone()), this.sourceSpan);
    }
    /**
     * Serialize the given `meta` and `messagePart` into "cooked" and "raw" strings that can be used
     * in a `$localize` tagged string. The format of the metadata is the same as that parsed by
     * `parseI18nMeta()`.
     *
     * @param meta The metadata to serialize
     * @param messagePart The first part of the tagged string
     */
    serializeI18nHead() {
        let metaBlock = this.metaBlock.description || '';
        if (this.metaBlock.meaning) {
            metaBlock = `${this.metaBlock.meaning}${MEANING_SEPARATOR$1}${metaBlock}`;
        }
        if (this.metaBlock.customId) {
            metaBlock = `${metaBlock}${ID_SEPARATOR$1}${this.metaBlock.customId}`;
        }
        if (this.metaBlock.legacyIds) {
            this.metaBlock.legacyIds.forEach((legacyId) => {
                metaBlock = `${metaBlock}${LEGACY_ID_INDICATOR}${legacyId}`;
            });
        }
        return createCookedRawString(metaBlock, this.messageParts[0].text, this.getMessagePartSourceSpan(0));
    }
    getMessagePartSourceSpan(i) {
        return this.messageParts[i]?.sourceSpan ?? this.sourceSpan;
    }
    getPlaceholderSourceSpan(i) {
        return (this.placeHolderNames[i]?.sourceSpan ?? this.expressions[i]?.sourceSpan ?? this.sourceSpan);
    }
    /**
     * Serialize the given `placeholderName` and `messagePart` into "cooked" and "raw" strings that
     * can be used in a `$localize` tagged string.
     *
     * The format is `:<placeholder-name>[@@<associated-id>]:`.
     *
     * The `associated-id` is the message id of the (usually an ICU) message to which this placeholder
     * refers.
     *
     * @param partIndex The index of the message part to serialize.
     */
    serializeI18nTemplatePart(partIndex) {
        const placeholder = this.placeHolderNames[partIndex - 1];
        const messagePart = this.messageParts[partIndex];
        let metaBlock = placeholder.text;
        if (placeholder.associatedMessage?.legacyIds.length === 0) {
            metaBlock += `${ID_SEPARATOR$1}${computeMsgId(placeholder.associatedMessage.messageString, placeholder.associatedMessage.meaning)}`;
        }
        return createCookedRawString(metaBlock, messagePart.text, this.getMessagePartSourceSpan(partIndex));
    }
}
const escapeSlashes = (str) => str.replace(/\\/g, '\\\\');
const escapeStartingColon = (str) => str.replace(/^:/, '\\:');
const escapeColons = (str) => str.replace(/:/g, '\\:');
const escapeForTemplateLiteral = (str) => str.replace(/`/g, '\\`').replace(/\${/g, '$\\{');
/**
 * Creates a `{cooked, raw}` object from the `metaBlock` and `messagePart`.
 *
 * The `raw` text must have various character sequences escaped:
 * * "\" would otherwise indicate that the next character is a control character.
 * * "`" and "${" are template string control sequences that would otherwise prematurely indicate
 *   the end of a message part.
 * * ":" inside a metablock would prematurely indicate the end of the metablock.
 * * ":" at the start of a messagePart with no metablock would erroneously indicate the start of a
 *   metablock.
 *
 * @param metaBlock Any metadata that should be prepended to the string
 * @param messagePart The message part of the string
 */
function createCookedRawString(metaBlock, messagePart, range) {
    if (metaBlock === '') {
        return {
            cooked: messagePart,
            raw: escapeForTemplateLiteral(escapeStartingColon(escapeSlashes(messagePart))),
            range,
        };
    }
    else {
        return {
            cooked: `:${metaBlock}:${messagePart}`,
            raw: escapeForTemplateLiteral(`:${escapeColons(escapeSlashes(metaBlock))}:${escapeSlashes(messagePart)}`),
            range,
        };
    }
}
class ExternalExpr extends Expression {
    value;
    typeParams;
    constructor(value, type, typeParams = null, sourceSpan) {
        super(type, sourceSpan);
        this.value = value;
        this.typeParams = typeParams;
    }
    isEquivalent(e) {
        return (e instanceof ExternalExpr &&
            this.value.name === e.value.name &&
            this.value.moduleName === e.value.moduleName);
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitExternalExpr(this, context);
    }
    clone() {
        return new ExternalExpr(this.value, this.type, this.typeParams, this.sourceSpan);
    }
}
class ExternalReference {
    moduleName;
    name;
    constructor(moduleName, name) {
        this.moduleName = moduleName;
        this.name = name;
    }
}
class ConditionalExpr extends Expression {
    condition;
    falseCase;
    trueCase;
    constructor(condition, trueCase, falseCase = null, type, sourceSpan) {
        super(type || trueCase.type, sourceSpan);
        this.condition = condition;
        this.falseCase = falseCase;
        this.trueCase = trueCase;
    }
    isEquivalent(e) {
        return (e instanceof ConditionalExpr &&
            this.condition.isEquivalent(e.condition) &&
            this.trueCase.isEquivalent(e.trueCase) &&
            nullSafeIsEquivalent(this.falseCase, e.falseCase));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitConditionalExpr(this, context);
    }
    clone() {
        return new ConditionalExpr(this.condition.clone(), this.trueCase.clone(), this.falseCase?.clone(), this.type, this.sourceSpan);
    }
}
class DynamicImportExpr extends Expression {
    url;
    urlComment;
    constructor(url, sourceSpan, urlComment) {
        super(null, sourceSpan);
        this.url = url;
        this.urlComment = urlComment;
    }
    isEquivalent(e) {
        return e instanceof DynamicImportExpr && this.url === e.url && this.urlComment === e.urlComment;
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitDynamicImportExpr(this, context);
    }
    clone() {
        return new DynamicImportExpr(typeof this.url === 'string' ? this.url : this.url.clone(), this.sourceSpan, this.urlComment);
    }
}
class NotExpr extends Expression {
    condition;
    constructor(condition, sourceSpan) {
        super(BOOL_TYPE, sourceSpan);
        this.condition = condition;
    }
    isEquivalent(e) {
        return e instanceof NotExpr && this.condition.isEquivalent(e.condition);
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitNotExpr(this, context);
    }
    clone() {
        return new NotExpr(this.condition.clone(), this.sourceSpan);
    }
}
class FnParam {
    name;
    type;
    constructor(name, type = null) {
        this.name = name;
        this.type = type;
    }
    isEquivalent(param) {
        return this.name === param.name;
    }
    clone() {
        return new FnParam(this.name, this.type);
    }
}
class FunctionExpr extends Expression {
    params;
    statements;
    name;
    constructor(params, statements, type, sourceSpan, name) {
        super(type, sourceSpan);
        this.params = params;
        this.statements = statements;
        this.name = name;
    }
    isEquivalent(e) {
        return ((e instanceof FunctionExpr || e instanceof DeclareFunctionStmt) &&
            areAllEquivalent(this.params, e.params) &&
            areAllEquivalent(this.statements, e.statements));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitFunctionExpr(this, context);
    }
    toDeclStmt(name, modifiers) {
        return new DeclareFunctionStmt(name, this.params, this.statements, this.type, modifiers, this.sourceSpan);
    }
    clone() {
        // TODO: Should we deep clone statements?
        return new FunctionExpr(this.params.map((p) => p.clone()), this.statements, this.type, this.sourceSpan, this.name);
    }
}
class ArrowFunctionExpr extends Expression {
    params;
    body;
    // Note that `body: Expression` represents `() => expr` whereas
    // `body: Statement[]` represents `() => { expr }`.
    constructor(params, body, type, sourceSpan) {
        super(type, sourceSpan);
        this.params = params;
        this.body = body;
    }
    isEquivalent(e) {
        if (!(e instanceof ArrowFunctionExpr) || !areAllEquivalent(this.params, e.params)) {
            return false;
        }
        if (this.body instanceof Expression && e.body instanceof Expression) {
            return this.body.isEquivalent(e.body);
        }
        if (Array.isArray(this.body) && Array.isArray(e.body)) {
            return areAllEquivalent(this.body, e.body);
        }
        return false;
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitArrowFunctionExpr(this, context);
    }
    clone() {
        // TODO: Should we deep clone statements?
        return new ArrowFunctionExpr(this.params.map((p) => p.clone()), Array.isArray(this.body) ? this.body : this.body.clone(), this.type, this.sourceSpan);
    }
    toDeclStmt(name, modifiers) {
        return new DeclareVarStmt(name, this, INFERRED_TYPE, modifiers, this.sourceSpan);
    }
}
class UnaryOperatorExpr extends Expression {
    operator;
    expr;
    parens;
    constructor(operator, expr, type, sourceSpan, parens = true) {
        super(type || NUMBER_TYPE, sourceSpan);
        this.operator = operator;
        this.expr = expr;
        this.parens = parens;
    }
    isEquivalent(e) {
        return (e instanceof UnaryOperatorExpr &&
            this.operator === e.operator &&
            this.expr.isEquivalent(e.expr));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitUnaryOperatorExpr(this, context);
    }
    clone() {
        return new UnaryOperatorExpr(this.operator, this.expr.clone(), this.type, this.sourceSpan, this.parens);
    }
}
class BinaryOperatorExpr extends Expression {
    operator;
    rhs;
    parens;
    lhs;
    constructor(operator, lhs, rhs, type, sourceSpan, parens = true) {
        super(type || lhs.type, sourceSpan);
        this.operator = operator;
        this.rhs = rhs;
        this.parens = parens;
        this.lhs = lhs;
    }
    isEquivalent(e) {
        return (e instanceof BinaryOperatorExpr &&
            this.operator === e.operator &&
            this.lhs.isEquivalent(e.lhs) &&
            this.rhs.isEquivalent(e.rhs));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitBinaryOperatorExpr(this, context);
    }
    clone() {
        return new BinaryOperatorExpr(this.operator, this.lhs.clone(), this.rhs.clone(), this.type, this.sourceSpan, this.parens);
    }
}
class ReadPropExpr extends Expression {
    receiver;
    name;
    constructor(receiver, name, type, sourceSpan) {
        super(type, sourceSpan);
        this.receiver = receiver;
        this.name = name;
    }
    // An alias for name, which allows other logic to handle property reads and keyed reads together.
    get index() {
        return this.name;
    }
    isEquivalent(e) {
        return (e instanceof ReadPropExpr && this.receiver.isEquivalent(e.receiver) && this.name === e.name);
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitReadPropExpr(this, context);
    }
    set(value) {
        return new WritePropExpr(this.receiver, this.name, value, null, this.sourceSpan);
    }
    clone() {
        return new ReadPropExpr(this.receiver.clone(), this.name, this.type, this.sourceSpan);
    }
}
class ReadKeyExpr extends Expression {
    receiver;
    index;
    constructor(receiver, index, type, sourceSpan) {
        super(type, sourceSpan);
        this.receiver = receiver;
        this.index = index;
    }
    isEquivalent(e) {
        return (e instanceof ReadKeyExpr &&
            this.receiver.isEquivalent(e.receiver) &&
            this.index.isEquivalent(e.index));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitReadKeyExpr(this, context);
    }
    set(value) {
        return new WriteKeyExpr(this.receiver, this.index, value, null, this.sourceSpan);
    }
    clone() {
        return new ReadKeyExpr(this.receiver.clone(), this.index.clone(), this.type, this.sourceSpan);
    }
}
class LiteralArrayExpr extends Expression {
    entries;
    constructor(entries, type, sourceSpan) {
        super(type, sourceSpan);
        this.entries = entries;
    }
    isConstant() {
        return this.entries.every((e) => e.isConstant());
    }
    isEquivalent(e) {
        return e instanceof LiteralArrayExpr && areAllEquivalent(this.entries, e.entries);
    }
    visitExpression(visitor, context) {
        return visitor.visitLiteralArrayExpr(this, context);
    }
    clone() {
        return new LiteralArrayExpr(this.entries.map((e) => e.clone()), this.type, this.sourceSpan);
    }
}
class LiteralMapEntry {
    key;
    value;
    quoted;
    constructor(key, value, quoted) {
        this.key = key;
        this.value = value;
        this.quoted = quoted;
    }
    isEquivalent(e) {
        return this.key === e.key && this.value.isEquivalent(e.value);
    }
    clone() {
        return new LiteralMapEntry(this.key, this.value.clone(), this.quoted);
    }
}
class LiteralMapExpr extends Expression {
    entries;
    valueType = null;
    constructor(entries, type, sourceSpan) {
        super(type, sourceSpan);
        this.entries = entries;
        if (type) {
            this.valueType = type.valueType;
        }
    }
    isEquivalent(e) {
        return e instanceof LiteralMapExpr && areAllEquivalent(this.entries, e.entries);
    }
    isConstant() {
        return this.entries.every((e) => e.value.isConstant());
    }
    visitExpression(visitor, context) {
        return visitor.visitLiteralMapExpr(this, context);
    }
    clone() {
        const entriesClone = this.entries.map((entry) => entry.clone());
        return new LiteralMapExpr(entriesClone, this.type, this.sourceSpan);
    }
}
const NULL_EXPR = new LiteralExpr(null, null, null);
const TYPED_NULL_EXPR = new LiteralExpr(null, INFERRED_TYPE, null);
//// Statements
exports.StmtModifier = void 0;
(function (StmtModifier) {
    StmtModifier[StmtModifier["None"] = 0] = "None";
    StmtModifier[StmtModifier["Final"] = 1] = "Final";
    StmtModifier[StmtModifier["Private"] = 2] = "Private";
    StmtModifier[StmtModifier["Exported"] = 4] = "Exported";
    StmtModifier[StmtModifier["Static"] = 8] = "Static";
})(exports.StmtModifier || (exports.StmtModifier = {}));
class LeadingComment {
    text;
    multiline;
    trailingNewline;
    constructor(text, multiline, trailingNewline) {
        this.text = text;
        this.multiline = multiline;
        this.trailingNewline = trailingNewline;
    }
    toString() {
        return this.multiline ? ` ${this.text} ` : this.text;
    }
}
class JSDocComment extends LeadingComment {
    tags;
    constructor(tags) {
        super('', /* multiline */ true, /* trailingNewline */ true);
        this.tags = tags;
    }
    toString() {
        return serializeTags(this.tags);
    }
}
class Statement {
    modifiers;
    sourceSpan;
    leadingComments;
    constructor(modifiers = exports.StmtModifier.None, sourceSpan = null, leadingComments) {
        this.modifiers = modifiers;
        this.sourceSpan = sourceSpan;
        this.leadingComments = leadingComments;
    }
    hasModifier(modifier) {
        return (this.modifiers & modifier) !== 0;
    }
    addLeadingComment(leadingComment) {
        this.leadingComments = this.leadingComments ?? [];
        this.leadingComments.push(leadingComment);
    }
}
class DeclareVarStmt extends Statement {
    name;
    value;
    type;
    constructor(name, value, type, modifiers, sourceSpan, leadingComments) {
        super(modifiers, sourceSpan, leadingComments);
        this.name = name;
        this.value = value;
        this.type = type || (value && value.type) || null;
    }
    isEquivalent(stmt) {
        return (stmt instanc   eof DeclareVarStmt &&
            this.name === stmt.name &&
            (this.value ? !!stmt.value && this.value.isEquivalent(stmt.value) : !stmt.value));
    }
    visitStatement(visitor, context) {
        return visitor.visitDeclareVarStmt(this, context);
    }
}
class DeclareFunctionStmt extends Statement {
    name;
    params;
    statements;
    type;
    constructor(name, params, statements, type, modifiers, sourceSpan, leadingComments) {
        super(modifiers, sourceSpan, leadingComments);
        this.name = name;
        this.params = params;
        this.statements = statements;
        this.type = type || null;
    }
    isEquivalent(stmt) {
        return (stmt instanceof DeclareFunctionStmt &&
            areAllEquivalent(this.params, stmt.params) &&
            areAllEquivalent(this.statements, stmt.statements));
    }
    visitStatement(visitor, context) {
        return visitor.visitDeclareFunctionStmt(this, context);
    }
}
class ExpressionStatement extends Statement {
    expr;
    constructor(expr, sourceSpan, leadingComments) {
        super(exports.StmtModifier.None, sourceSpan, leadingComments);
        this.expr = expr;
    }
    isEquivalent(stmt) {
        return stmt instanceof ExpressionStatement && this.expr.isEquivalent(stmt.expr);
    }
    visitStatement(visitor, context) {
        return visitor.visitExpressionStmt(this, context);
    }
}
class ReturnStatement extends Statement {
    value;
    constructor(value, sourceSpan = null, leadingComments) {
        super(exports.StmtModifier.None, sourceSpan, leadingComments);
        this.value = value;
    }
    isEquivalent(stmt) {
        return stmt instanceof ReturnStatement && this.value.isEquivalent(stmt.value);
    }
    visitStatement(visitor, context) {
        return visitor.visitReturnStmt(this, context);
    }
}
class IfStmt extends Statement {
    condition;
    trueCase;
    falseCase;
    constructor(condition, trueCase, falseCase = [], sourceSpan, leadingComments) {
        super(exports.StmtModifier.None, sourceSpan, leadingComments);
        this.condition = condition;
        this.trueCase = trueCase;
        this.falseCase = falseCase;
    }
    isEquivalent(stmt) {
        return (stmt instanceof IfStmt &&
            this.condition.isEquivalent(stmt.condition) &&
            areAllEquivalent(this.trueCase, stmt.trueCase) &&
            areAllEquivalent(this.falseCase, stmt.falseCase));
    }
    visitStatement(visitor, context) {
        return visitor.visitIfStmt(this, context);
    }
}
let RecursiveAstVisitor$1 = class RecursiveAstVisitor {
    visitType(ast, context) {
        return ast;
    }
    visitExpression(ast, context) {
        if (ast.type) {
            ast.type.visitType(this, context);
        }
        return ast;
    }
    visitBuiltinType(type, context) {
        return this.visitType(type, context);
    }
    visitExpressionType(type, context) {
        type.value.visitExpression(this, context);
        if (type.typeParams !== null) {
            type.typeParams.forEach((param) => this.visitType(param, context));
        }
        return this.visitType(type, context);
    }
    visitArrayType(type, context) {
        return this.visitType(type, context);
    }
    visitMapType(type, context) {
        return this.visitType(type, context);
    }
    visitTransplantedType(type, context) {
        return type;
    }
    visitWrappedNodeExpr(ast, context) {
        return ast;
    }
    visitTypeofExpr(ast, context) {
        return this.visitExpression(ast, context);
    }
    visitReadVarExpr(ast, context) {
        return this.visitExpression(ast, context);
    }
    visitWriteVarExpr(ast, context) {
        ast.value.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitWriteKeyExpr(ast, context) {
        ast.receiver.visitExpression(this, context);
        ast.index.visitExpression(this, context);
        ast.value.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitWritePropExpr(ast, context) {
        ast.receiver.visitExpression(this, context);
        ast.value.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitDynamicImportExpr(ast, context) {
        return this.visitExpression(ast, context);
    }
    visitInvokeFunctionExpr(ast, context) {
        ast.fn.visitExpression(this, context);
        this.visitAllExpressions(ast.args, context);
        return this.visitExpression(ast, context);
    }
    visitTaggedTemplateLiteralExpr(ast, context) {
        ast.tag.visitExpression(this, context);
        ast.template.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitInstantiateExpr(ast, context) {
        ast.classExpr.visitExpression(this, context);
        this.visitAllExpressions(ast.args, context);
        return this.visitExpression(ast, context);
    }
    visitLiteralExpr(ast, context) {
        return this.visitExpression(ast, context);
    }
    visitLocalizedString(ast, context) {
        return this.visitExpression(ast, context);
    }
    visitExternalExpr(ast, context) {
        if (ast.typeParams) {
            ast.typeParams.forEach((type) => type.visitType(this, context));
        }
        return this.visitExpression(ast, context);
    }
    visitConditionalExpr(ast, context) {
        ast.condition.visitExpression(this, context);
        ast.trueCase.visitExpression(this, context);
        ast.falseCase.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitNotExpr(ast, context) {
        ast.condition.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitFunctionExpr(ast, context) {
        this.visitAllStatements(ast.statements, context);
        return this.visitExpression(ast, context);
    }
    visitArrowFunctionExpr(ast, context) {
        if (Array.isArray(ast.body)) {
            this.visitAllStatements(ast.body, context);
        }
        else {
            // Note: `body.visitExpression`, rather than `this.visitExpressiont(body)`,
            // because the latter won't recurse into the sub-expressions.
            ast.body.visitExpression(this, context);
        }
        return this.visitExpression(ast, context);
    }
    visitUnaryOperatorExpr(ast, context) {
        ast.expr.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitBinaryOperatorExpr(ast, context) {
        ast.lhs.visitExpression(this, context);
        ast.rhs.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitReadPropExpr(ast, context) {
        ast.receiver.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitReadKeyExpr(ast, context) {
        ast.receiver.visitExpression(this, context);
        ast.index.visitExpression(this, context);
        return this.visitExpression(ast, context);
    }
    visitLiteralArrayExpr(ast, context) {
        this.visitAllExpressions(ast.entries, context);
        return this.visitExpression(ast, context);
    }
    visitLiteralMapExpr(ast, context) {
        ast.entries.forEach((entry) => entry.value.visitExpression(this, context));
        return this.visitExpression(ast, context);
    }
    visitCommaExpr(ast, context) {
        this.visitAllExpressions(ast.parts, context);
        return this.visitExpression(ast, context);
    }
    visitTemplateLiteralExpr(ast, context) {
        this.visitAllExpressions(ast.elements, context);
        this.visitAllExpressions(ast.expressions, context);
        return this.visitExpression(ast, context);
    }
    visitTemplateLiteralElementExpr(ast, context) {
        return this.visitExpression(ast, context);
    }
    visitAllExpressions(exprs, context) {
        exprs.forEach((expr) => expr.visitExpression(this, context));
    }
    visitDeclareVarStmt(stmt, context) {
        if (stmt.value) {
            stmt.value.visitExpression(this, context);
        }
        if (stmt.type) {
            stmt.type.visitType(this, context);
        }
        return stmt;
    }
    visitDeclareFunctionStmt(stmt, context) {
        this.visitAllStatements(stmt.statements, context);
        if (stmt.type) {
            stmt.type.visitType(this, context);
        }
        return stmt;
    }
    visitExpressionStmt(stmt, context) {
        stmt.expr.visitExpression(this, context);
        return stmt;
    }
    visitReturnStmt(stmt, context) {
        stmt.value.visitExpression(this, context);
        return stmt;
    }
    visitIfStmt(stmt, context) {
        stmt.condition.visitExpression(this, context);
        this.visitAllStatements(stmt.trueCase, context);
        this.visitAllStatements(stmt.falseCase, context);
        return stmt;
    }
    visitAllStatements(stmts, context) {
        stmts.forEach((stmt) => stmt.visitStatement(this, context));
    }
};
function leadingComment(text, multiline = false, trailingNewline = true) {
    return new LeadingComment(text, multiline, trailingNewline);
}
function jsDocComment(tags = []) {
    return new JSDocComment(tags);
}
function variable(name, type, sourceSpan) {
    return new ReadVarExpr(name, type, sourceSpan);
}
function importExpr(id, typeParams = null, sourceSpan) {
    return new ExternalExpr(id, null, typeParams, sourceSpan);
}
function expressionType(expr, typeModifiers, typeParams) {
    return new ExpressionType(expr, typeModifiers, typeParams);
}
function transplantedType(type, typeModifiers) {
    return new TransplantedType(type, typeModifiers);
}
function typeofExpr(expr) {
    return new TypeofExpr(expr);
}
function literalArr(values, type, sourceSpan) {
    return new LiteralArrayExpr(values, type, sourceSpan);
}
function literalMap(values, type = null) {
    return new LiteralMapExpr(values.map((e) => new LiteralMapEntry(e.key, e.value, e.quoted)), type, null);
}
function not(expr, sourceSpan) {
    return new NotExpr(expr, sourceSpan);
}
function fn(params, body, type, sourceSpan, name) {
    return new FunctionExpr(params, body, type, sourceSpan, name);
}
function arrowFn(params, body, type, sourceSpan) {
    return new ArrowFunctionExpr(params, body, type, sourceSpan);
}
function ifStmt(condition, thenClause, elseClause, sourceSpan, leadingComments) {
    return new IfStmt(condition, thenClause, elseClause, sourceSpan, leadingComments);
}
function taggedTemplate(tag, template, type, sourceSpan) {
    return new TaggedTemplateLiteralExpr(tag, template, type, sourceSpan);
}
function literal$1(value, type, sourceSpan) {
    return new LiteralExpr(value, type, sourceSpan);
}
function localizedString(metaBlock, messageParts, placeholderNames, expressions, sourceSpan) {
    return new LocalizedString(metaBlock, messageParts, placeholderNames, expressions, sourceSpan);
}
/*
 * Serializes a `Tag` into a string.
 * Returns a string like " @foo {bar} baz" (note the leading whitespace before `@foo`).
 */
function tagToString(tag) {
    let out = '';
    if (tag.tagName) {
        out += ` @${tag.tagName}`;
    }
    if (tag.text) {
        if (tag.text.match(/\/\*|\*\//)) {
            throw new Error('JSDoc text cannot contain "/*" and "*/"');
        }
        out += ' ' + tag.text.replace(/@/g, '\\@');
    }
    return out;
}
function serializeTags(tags) {
    if (tags.length === 0)
        return '';
    if (tags.length === 1 && tags[0].tagName && !tags[0].text) {
        // The JSDOC comment is a single simple tag: e.g `/** @tagname */`.
        return `*${tagToString(tags[0])} `;
    }
    let out = '*\n';
    for (const tag of tags) {
        out += ' *';
        // If the tagToString is multi-line, insert " * " prefixes on lines.
        out += tagToString(tag).replace(/\n/g, '\n * ');
        out += '\n';
    }
    out += ' ';
    return out;
}

const CONSTANT_PREFIX = '_c';
/**
 * `ConstantPool` tries to reuse literal factories when two or more literals are identical.
 * We determine whether literals are identical by creating a key out of their AST using the
 * `KeyVisitor`. This constant is used to replace dynamic expressions which can't be safely
 * converted into a key. E.g. given an expression `{foo: bar()}`, since we don't know what
 * the result of `bar` will be, we create a key that looks like `{foo: <unknown>}`. Note
 * that we use a variable, rather than something like `null` in order to avoid collisions.
 */
const UNKNOWN_VALUE_KEY = variable('<unknown>');
/**
 * Context to use when producing a key.
 *
 * This ensures we see the constant not the reference variable when producing
 * a key.
 */
const KEY_CONTEXT = {};
/**
 * Generally all primitive values are excluded from the `ConstantPool`, but there is an exclusion
 * for strings that reach a certain length threshold. This constant defines the length threshold for
 * strings.
 */
const POOL_INCLUSION_LENGTH_THRESHOLD_FOR_STRINGS = 50;
/**
 * A node that is a place-holder that allows the node to be replaced when the actual
 * node is known.
 *
 * This allows the constant pool to change an expression from a direct reference to
 * a constant to a shared constant. It returns a fix-up node that is later allowed to
 * change the referenced expression.
 */
class FixupExpression extends Expression {
    resolved;
    original;
    shared = false;
    constructor(resolved) {
        super(resolved.type);
        this.resolved = resolved;
        this.original = resolved;
    }
    visitExpression(visitor, context) {
        if (context === KEY_CONTEXT) {
            // When producing a key we want to traverse the constant not the
            // variable used to refer to it.
            return this.original.visitExpression(visitor, context);
        }
        else {
            return this.resolved.visitExpression(visitor, context);
        }
    }
    isEquivalent(e) {
        return e instanceof FixupExpression && this.resolved.isEquivalent(e.resolved);
    }
    isConstant() {
        return true;
    }
    clone() {
        throw new Error(`Not supported.`);
    }
    fixup(expression) {
        this.resolved = expression;
        this.shared = true;
    }
}
/**
 * A constant pool allows a code emitter to share constant in an output context.
 *
 * The constant pool also supports sharing access to ivy definitions references.
 */
class ConstantPool {
    isClosureCompilerEnabled;
    statements = [];
    literals = new Map();
    literalFactories = new Map();
    sharedConstants = new Map();
    /**
     * Constant pool also tracks claimed names from {@link uniqueName}.
     * This is useful to avoid collisions if variables are intended to be
     * named a certain way- but may conflict. We wouldn't want to always suffix
     * them with unique numbers.
     */
    _claimedNames = new Map();
    nextNameIndex = 0;
    constructor(isClosureCompilerEnabled = false) {
        this.isClosureCompilerEnabled = isClosureCompilerEnabled;
    }
    getConstLiteral(literal, forceShared) {
        if ((literal instanceof LiteralExpr && !isLongStringLiteral(literal)) ||
            literal instanceof FixupExpression) {
            // Do no put simple literals into the constant pool or try to produce a constant for a
            // reference to a constant.
            return literal;
        }
        const key = GenericKeyFn.INSTANCE.keyOf(literal);
        let fixup = this.literals.get(key);
        let newValue = false;
        if (!fixup) {
            fixup = new FixupExpression(literal);
            this.literals.set(key, fixup);
            newValue = true;
        }
        if ((!newValue && !fixup.shared) || (newValue && forceShared)) {
            // Replace the expression with a variable
            const name = this.freshName();
            let definition;
            let usage;
            if (this.isClosureCompilerEnabled && isLongStringLiteral(literal)) {
                // For string literals, Closure will **always** inline the string at
                // **all** usages, duplicating it each time. For large strings, this
                // unnecessarily bloats bundle size. To work around this restriction, we
                // wrap the string in a function, and call that function for each usage.
                // This tricks Closure into using inline logic for functions instead of
                // string literals. Function calls are only inlined if the body is small
                // enough to be worth it. By doing this, very large strings will be
                // shared across multiple usages, rather than duplicating the string at
                // each usage site.
                //
                // const myStr = function() { return "very very very long string"; };
                // const usage1 = myStr();
                // const usage2 = myStr();
                definition = variable(name).set(new FunctionExpr([], // Params.
                [
                    // Statements.
                    new ReturnStatement(literal),
                ]));
                usage = variable(name).callFn([]);
            }
            else {
                // Just declare and use the variable directly, without a function call
                // indirection. This saves a few bytes and avoids an unnecessary call.
                definition = variable(name).set(literal);
                usage = variable(name);
            }
            this.statements.push(definition.toDeclStmt(INFERRED_TYPE, exports.StmtModifier.Final));
            fixup.fixup(usage);
        }
        return fixup;
    }
    getSharedConstant(def, expr) {
        const key = def.keyOf(expr);
        if (!this.sharedConstants.has(key)) {
            const id = this.freshName();
            this.sharedConstants.set(key, variable(id));
            this.statements.push(def.toSharedConstantDeclaration(id, expr));
        }
        return this.sharedConstants.get(key);
    }
    getLiteralFactory(literal) {
        // Create a pure function that builds an array of a mix of constant and variable expressions
        if (literal instanceof LiteralArrayExpr) {
            const argumentsForKey = literal.entries.map((e) => (e.isConstant() ? e : UNKNOWN_VALUE_KEY));
            const key = GenericKeyFn.INSTANCE.keyOf(literalArr(argumentsForKey));
            return this._getLiteralFactory(key, literal.entries, (entries) => literalArr(entries));
        }
        else {
            const expressionForKey = literalMap(literal.entries.map((e) => ({
                key: e.key,
                value: e.value.isConstant() ? e.value : UNKNOWN_VALUE_KEY,
                quoted: e.quoted,
            })));
            const key = GenericKeyFn.INSTANCE.keyOf(expressionForKey);
            return this._getLiteralFactory(key, literal.entries.map((e) => e.value), (entries) => literalMap(entries.map((value, index) => ({
                key: literal.entries[index].key,
                value,
                quoted: literal.entries[index].quoted,
            }))));
        }
    }
    // TODO: useUniqueName(false) is necessary for naming compatibility with
    // TemplateDefinitionBuilder, but should be removed once Template Pipeline is the default.
    getSharedFunctionReference(fn, prefix, useUniqueName = true) {
        const isArrow = fn instanceof ArrowFunctionExpr;
        for (const current of this.statements) {
            // Arrow functions are saved as variables so we check if the
            // value of the variable is the same as the arrow function.
            if (isArrow && current instanceof DeclareVarStmt && current.value?.isEquivalent(fn)) {
                return variable(current.name);
            }
            // Function declarations are saved as function statements
            // so we compare them directly to the passed-in function.
            if (!isArrow &&
                current instanceof DeclareFunctionStmt &&
                fn instanceof FunctionExpr &&
                fn.isEquivalent(current)) {
                return variable(current.name);
            }
        }
        // Otherwise declare the function.
        const name = useUniqueName ? this.uniqueName(prefix) : prefix;
        this.statements.push(fn instanceof FunctionExpr
            ? fn.toDeclStmt(name, exports.StmtModifier.Final)
            : new DeclareVarStmt(name, fn, INFERRED_TYPE, exports.StmtModifier.Final, fn.sourceSpan));
        return variable(name);
    }
    _getLiteralFactory(key, values, resultMap) {
        let literalFactory = this.literalFactories.get(key);
        const literalFactoryArguments = values.filter((e) => !e.isConstant());
        if (!literalFactory) {
            const resultExpressions = values.map((e, index) => e.isConstant() ? this.getConstLiteral(e, true) : variable(`a${index}`));
            const parameters = resultExpressions
                .filter(isVariable)
                .map((e) => new FnParam(e.name, DYNAMIC_TYPE));
            const pureFunctionDeclaration = arrowFn(parameters, resultMap(resultExpressions), INFERRED_TYPE);
            const name = this.freshName();
            this.statements.push(variable(name)
                .set(pureFunctionDeclaration)
                .toDeclStmt(INFERRED_TYPE, exports.StmtModifier.Final));
            literalFactory = variable(name);
            this.literalFactories.set(key, literalFactory);
        }
        return { literalFactory, literalFactoryArguments };
    }
    /**
     * Produce a unique name in the context of this pool.
     *
     * The name might be unique among different prefixes if any of the prefixes end in
     * a digit so the prefix should be a constant string (not based on user input) and
     * must not end in a digit.
     */
    uniqueName(name, alwaysIncludeSuffix = true) {
        const count = this._claimedNames.get(name) ?? 0;
        const result = count === 0 && !alwaysIncludeSuffix ? `${name}` : `${name}${count}`;
        this._claimedNames.set(name, count + 1);
        return result;
    }
    freshName() {
        return this.uniqueName(CONSTANT_PREFIX);
    }
}
class GenericKeyFn {
    static INSTANCE = new GenericKeyFn();
    keyOf(expr) {
        if (expr instanceof LiteralExpr && typeof expr.value === 'string') {
            return `"${expr.value}"`;
        }
        else if (expr instanceof LiteralExpr) {
            return String(expr.value);
        }
        else if (expr instanceof LiteralArrayExpr) {
            const entries = [];
            for (const entry of expr.entries) {
                entries.push(this.keyOf(entry));
            }
            return `[${entries.join(',')}]`;
        }
        else if (expr instanceof LiteralMapExpr) {
            const entries = [];
            for (const entry of expr.entries) {
                let key = entry.key;
                if (entry.quoted) {
                    key = `"${key}"`;
                }
                entries.push(key + ':' + this.keyOf(entry.value));
            }
            return `{${entries.join(',')}}`;
        }
        else if (expr instanceof ExternalExpr) {
            return `import("${expr.value.moduleName}", ${expr.value.name})`;
        }
        else if (expr instanceof ReadVarExpr) {
            return `read(${expr.name})`;
        }
        else if (expr instanceof TypeofExpr) {
            return `typeof(${this.keyOf(expr.expr)})`;
        }
        else {
            throw new Error(`${this.constructor.name} does not handle expressions of type ${expr.constructor.name}`);
        }
    }
}
function isVariable(e) {
    return e instanceof ReadVarExpr;
}
function isLongStringLiteral(expr) {
    return (expr instanceof LiteralExpr &&
        typeof expr.value === 'string' &&
        expr.value.length >= POOL_INCLUSION_LENGTH_THRESHOLD_FOR_STRINGS);
}

const CORE = '@angular/core';
class Identifiers {
    /* Methods */
    static NEW_METHOD = 'factory';
    static TRANSFORM_METHOD = 'transform';
    static PATCH_DEPS = 'patchedDeps';
    static core = { name: null, moduleName: CORE };
    /* Instructions */
    static namespaceHTML = { name: 'ɵɵnamespaceHTML', moduleName: CORE };
    static namespaceMathML = { name: 'ɵɵnamespaceMathML', moduleName: CORE };
    static namespaceSVG = { name: 'ɵɵnamespaceSVG', moduleName: CORE };
    static element = { name: 'ɵɵelement', moduleName: CORE };
    static elementStart = { name: 'ɵɵelementStart', moduleName: CORE };
    static elementEnd = { name: 'ɵɵelementEnd', moduleName: CORE };
    static advance = { name: 'ɵɵadvance', moduleName: CORE };
    static syntheticHostProperty = {
        name: 'ɵɵsyntheticHostProperty',
        moduleName: CORE,
    };
    static syntheticHostListener = {
        name: 'ɵɵsyntheticHostListener',
        moduleName: CORE,
    };
    static attribute = { name: 'ɵɵattribute', moduleName: CORE };
    static attributeInterpolate1 = {
        name: 'ɵɵattributeInterpolate1',
        moduleName: CORE,
    };
    static attributeInterpolate2 = {
        name: 'ɵɵattributeInterpolate2',
        moduleName: CORE,
    };
    static attributeInterpolate3 = {
        name: 'ɵɵattributeInterpolate3',
        moduleName: CORE,
    };
    static attributeInterpolate4 = {
        name: 'ɵɵattributeInterpolate4',
        moduleName: CORE,
    };
    static attributeInterpolate5 = {
        name: 'ɵɵattributeInterpolate5',
        moduleName: CORE,
    };
    static attributeInterpolate6 = {
        name: 'ɵɵattributeInterpolate6',
        moduleName: CORE,
    };
    static attributeInterpolate7 = {
        name: 'ɵɵattributeInterpolate7',
        moduleName: CORE,
    };
    static attributeInterpolate8 = {
        name: 'ɵɵattributeInterpolate8',
        moduleName: CORE,
    };
    static attributeInterpolateV = {
        name: 'ɵɵattributeInterpolateV',
        moduleName: CORE,
    };
    static classProp = { name: 'ɵɵclassProp', moduleName: CORE };
    static elementContainerStart = {
        name: 'ɵɵelementContainerStart',
        moduleName: CORE,
    };
    static elementContainerEnd = {
        name: 'ɵɵelementContainerEnd',
        moduleName: CORE,
    };
    static elementContainer = { name: 'ɵɵelementContainer', moduleName: CORE };
    static styleMap = { name: 'ɵɵstyleMap', moduleName: CORE };
    static styleMapInterpolate1 = {
        name: 'ɵɵstyleMapInterpolate1',
        moduleName: CORE,
    };
    static styleMapInterpolate2 = {
        name: 'ɵɵstyleMapInterpolate2',
        moduleName: CORE,
    };
    static styleMapInterpolate3 = {
        name: 'ɵɵstyleMapInterpolate3',
        moduleName: CORE,
    };
    static styleMapInterpolate4 = {
        name: 'ɵɵstyleMapInterpolate4',
        moduleName: CORE,
    };
    static styleMapInterpolate5 = {
        name: 'ɵɵstyleMapInterpolate5',
        moduleName: CORE,
    };
    static styleMapInterpolate6 = {
        name: 'ɵɵstyleMapInterpolate6',
        moduleName: CORE,
    };
    static styleMapInterpolate7 = {
        name: 'ɵɵstyleMapInterpolate7',
        moduleName: CORE,
    };
    static styleMapInterpolate8 = {
        name: 'ɵɵstyleMapInterpolate8',
        moduleName: CORE,
    };
    static styleMapInterpolateV = {
        name: 'ɵɵstyleMapInterpolateV',
        moduleName: CORE,
    };
    static classMap = { name: 'ɵɵclassMap', moduleName: CORE };
    static classMapInterpolate1 = {
        name: 'ɵɵclassMapInterpolate1',
        moduleName: CORE,
    };
    static classMapInterpolate2 = {
        name: 'ɵɵclassMapInterpolate2',
        moduleName: CORE,
    };
    static classMapInterpolate3 = {
        name: 'ɵɵclassMapInterpolate3',
        moduleName: CORE,
    };
    static classMapInterpolate4 = {
        name: 'ɵɵclassMapInterpolate4',
        moduleName: CORE,
    };
    static classMapInterpolate5 = {
        name: 'ɵɵclassMapInterpolate5',
        moduleName: CORE,
    };
    static classMapInterpolate6 = {
        name: 'ɵɵclassMapInterpolate6',
        moduleName: CORE,
    };
    static classMapInterpolate7 = {
        name: 'ɵɵclassMapInterpolate7',
        moduleName: CORE,
    };
    static classMapInterpolate8 = {
        name: 'ɵɵclassMapInterpolate8',
        moduleName: CORE,
    };
    static classMapInterpolateV = {
        name: 'ɵɵclassMapInterpolateV',
        moduleName: CORE,
    };
    static styleProp = { name: 'ɵɵstyleProp', moduleName: CORE };
    static stylePropInterpolate1 = {
        name: 'ɵɵstylePropInterpolate1',
        moduleName: CORE,
    };
    static stylePropInterpolate2 = {
        name: 'ɵɵstylePropInterpolate2',
        moduleName: CORE,
    };
    static stylePropInterpolate3 = {
        name: 'ɵɵstylePropInterpolate3',
        moduleName: CORE,
    };
    static stylePropInterpolate4 = {
        name: 'ɵɵstylePropInterpolate4',
        moduleName: CORE,
    };
    static stylePropInterpolate5 = {
        name: 'ɵɵstylePropInterpolate5',
        moduleName: CORE,
    };
    static stylePropInterpolate6 = {
        name: 'ɵɵstylePropInterpolate6',
        moduleName: CORE,
    };
    static stylePropInterpolate7 = {
        name: 'ɵɵstylePropInterpolate7',
        moduleName: CORE,
    };
    static stylePropInterpolate8 = {
        name: 'ɵɵstylePropInterpolate8',
        moduleName: CORE,
    };
    static stylePropInterpolateV = {
        name: 'ɵɵstylePropInterpolateV',
        moduleName: CORE,
    };
    static nextContext = { name: 'ɵɵnextContext', moduleName: CORE };
    static resetView = { name: 'ɵɵresetView', moduleName: CORE };
    static templateCreate = { name: 'ɵɵtemplate', moduleName: CORE };
    static defer = { name: 'ɵɵdefer', moduleName: CORE };
    static deferWhen = { name: 'ɵɵdeferWhen', moduleName: CORE };
    static deferOnIdle = { name: 'ɵɵdeferOnIdle', moduleName: CORE };
    static deferOnImmediate = { name: 'ɵɵdeferOnImmediate', moduleName: CORE };
    static deferOnTimer = { name: 'ɵɵdeferOnTimer', moduleName: CORE };
    static deferOnHover = { name: 'ɵɵdeferOnHover', moduleName: CORE };
    static deferOnInteraction = { name: 'ɵɵdeferOnInteraction', moduleName: CORE };
    static deferOnViewport = { name: 'ɵɵdeferOnViewport', moduleName: CORE };
    static deferPrefetchWhen = { name: 'ɵɵdeferPrefetchWhen', moduleName: CORE };
    static deferPrefetchOnIdle = {
        name: 'ɵɵdeferPrefetchOnIdle',
        moduleName: CORE,
    };
    static deferPrefetchOnImmediate = {
        name: 'ɵɵdeferPrefetchOnImmediate',
        moduleName: CORE,
    };
    static deferPrefetchOnTimer = {
        name: 'ɵɵdeferPrefetchOnTimer',
        moduleName: CORE,
    };
    static deferPrefetchOnHover = {
        name: 'ɵɵdeferPrefetchOnHover',
        moduleName: CORE,
    };
    static deferPrefetchOnInteraction = {
        name: 'ɵɵdeferPrefetchOnInteraction',
        moduleName: CORE,
    };
    static deferPrefetchOnViewport = {
        name: 'ɵɵdeferPrefetchOnViewport',
        moduleName: CORE,
    };
    static deferHydrateWhen = { name: 'ɵɵdeferHydrateWhen', moduleName: CORE };
    static deferHydrateNever = { name: 'ɵɵdeferHydrateNever', moduleName: CORE };
    static deferHydrateOnIdle = {
        name: 'ɵɵdeferHydrateOnIdle',
        moduleName: CORE,
    };
    static deferHydrateOnImmediate = {
        name: 'ɵɵdeferHydrateOnImmediate',
        moduleName: CORE,
    };
    static deferHydrateOnTimer = {
        name: 'ɵɵdeferHydrateOnTimer',
        moduleName: CORE,
    };
    static deferHydrateOnHover = {
        name: 'ɵɵdeferHydrateOnHover',
        moduleName: CORE,
    };
    static deferHydrateOnInteraction = {
        name: 'ɵɵdeferHydrateOnInteraction',
        moduleName: CORE,
    };
    static deferHydrateOnViewport = {
        name: 'ɵɵdeferHydrateOnViewport',
        moduleName: CORE,
    };
    static deferEnableTimerScheduling = {
        name: 'ɵɵdeferEnableTimerScheduling',
        moduleName: CORE,
    };
    static conditional = { name: 'ɵɵconditional', moduleName: CORE };
    static repeater = { name: 'ɵɵrepeater', moduleName: CORE };
    static repeaterCreate = { name: 'ɵɵrepeaterCreate', moduleName: CORE };
    static repeaterTrackByIndex = {
        name: 'ɵɵrepeaterTrackByIndex',
        moduleName: CORE,
    };
    static repeaterTrackByIdentity = {
        name: 'ɵɵrepeaterTrackByIdentity',
        moduleName: CORE,
    };
    static componentInstance = { name: 'ɵɵcomponentInstance', moduleName: CORE };
    static text = { name: 'ɵɵtext', moduleName: CORE };
    static enableBindings = { name: 'ɵɵenableBindings', moduleName: CORE };
    static disableBindings = { name: 'ɵɵdisableBindings', moduleName: CORE };
    static getCurrentView = { name: 'ɵɵgetCurrentView', moduleName: CORE };
    static textInterpolate = { name: 'ɵɵtextInterpolate', moduleName: CORE };
    static textInterpolate1 = { name: 'ɵɵtextInterpolate1', moduleName: CORE };
    static textInterpolate2 = { name: 'ɵɵtextInterpolate2', moduleName: CORE };
    static textInterpolate3 = { name: 'ɵɵtextInterpolate3', moduleName: CORE };
    static textInterpolate4 = { name: 'ɵɵtextInterpolate4', moduleName: CORE };
    static textInterpolate5 = { name: 'ɵɵtextInterpolate5', moduleName: CORE };
    static textInterpolate6 = { name: 'ɵɵtextInterpolate6', moduleName: CORE };
    static textInterpolate7 = { name: 'ɵɵtextInterpolate7', moduleName: CORE };
    static textInterpolate8 = { name: 'ɵɵtextInterpolate8', moduleName: CORE };
    static textInterpolateV = { name: 'ɵɵtextInterpolateV', moduleName: CORE };
    static restoreView = { name: 'ɵɵrestoreView', moduleName: CORE };
    static pureFunction0 = { name: 'ɵɵpureFunction0', moduleName: CORE };
    static pureFunction1 = { name: 'ɵɵpureFunction1', moduleName: CORE };
    static pureFunction2 = { name: 'ɵɵpureFunction2', moduleName: CORE };
    static pureFunction3 = { name: 'ɵɵpureFunction3', moduleName: CORE };
    static pureFunction4 = { name: 'ɵɵpureFunction4', moduleName: CORE };
    static pureFunction5 = { name: 'ɵɵpureFunction5', moduleName: CORE };
    static pureFunction6 = { name: 'ɵɵpureFunction6', moduleName: CORE };
    static pureFunction7 = { name: 'ɵɵpureFunction7', moduleName: CORE };
    static pureFunction8 = { name: 'ɵɵpureFunction8', moduleName: CORE };
    static pureFunctionV = { name: 'ɵɵpureFunctionV', moduleName: CORE };
    static pipeBind1 = { name: 'ɵɵpipeBind1', moduleName: CORE };
    static pipeBind2 = { name: 'ɵɵpipeBind2', moduleName: CORE };
    static pipeBind3 = { name: 'ɵɵpipeBind3', moduleName: CORE };
    static pipeBind4 = { name: 'ɵɵpipeBind4', moduleName: CORE };
    static pipeBindV = { name: 'ɵɵpipeBindV', moduleName: CORE };
    static hostProperty = { name: 'ɵɵhostProperty', moduleName: CORE };
    static property = { name: 'ɵɵproperty', moduleName: CORE };
    static propertyInterpolate = {
        name: 'ɵɵpropertyInterpolate',
        moduleName: CORE,
    };
    static propertyInterpolate1 = {
        name: 'ɵɵpropertyInterpolate1',
        moduleName: CORE,
    };
    static propertyInterpolate2 = {
        name: 'ɵɵpropertyInterpolate2',
        moduleName: CORE,
    };
    static propertyInterpolate3 = {
        name: 'ɵɵpropertyInterpolate3',
        moduleName: CORE,
    };
    static propertyInterpolate4 = {
        name: 'ɵɵpropertyInterpolate4',
        moduleName: CORE,
    };
    static propertyInterpolate5 = {
        name: 'ɵɵpropertyInterpolate5',
        moduleName: CORE,
    };
    static propertyInterpolate6 = {
        name: 'ɵɵpropertyInterpolate6',
        moduleName: CORE,
    };
    static propertyInterpolate7 = {
        name: 'ɵɵpropertyInterpolate7',
        moduleName: CORE,
    };
    static propertyInterpolate8 = {
        name: 'ɵɵpropertyInterpolate8',
        moduleName: CORE,
    };
    static propertyInterpolateV = {
        name: 'ɵɵpropertyInterpolateV',
        moduleName: CORE,
    };
    static i18n = { name: 'ɵɵi18n', moduleName: CORE };
    static i18nAttributes = { name: 'ɵɵi18nAttributes', moduleName: CORE };
    static i18nExp = { name: 'ɵɵi18nExp', moduleName: CORE };
    static i18nStart = { name: 'ɵɵi18nStart', moduleName: CORE };
    static i18nEnd = { name: 'ɵɵi18nEnd', moduleName: CORE };
    static i18nApply = { name: 'ɵɵi18nApply', moduleName: CORE };
    static i18nPostprocess = { name: 'ɵɵi18nPostprocess', moduleName: CORE };
    static pipe = { name: 'ɵɵpipe', moduleName: CORE };
    static projection = { name: 'ɵɵprojection', moduleName: CORE };
    static projectionDef = { name: 'ɵɵprojectionDef', moduleName: CORE };
    static reference = { name: 'ɵɵreference', moduleName: CORE };
    static inject = { name: 'ɵɵinject', moduleName: CORE };
    static injectAttribute = { name: 'ɵɵinjectAttribute', moduleName: CORE };
    static directiveInject = { name: 'ɵɵdirectiveInject', moduleName: CORE };
    static invalidFactory = { name: 'ɵɵinvalidFactory', moduleName: CORE };
    static invalidFactoryDep = { name: 'ɵɵinvalidFactoryDep', moduleName: CORE };
    static templateRefExtractor = {
        name: 'ɵɵtemplateRefExtractor',
        moduleName: CORE,
    };
    static forwardRef = { name: 'forwardRef', moduleName: CORE };
    static resolveForwardRef = { name: 'resolveForwardRef', moduleName: CORE };
    static replaceMetadata = { name: 'ɵɵreplaceMetadata', moduleName: CORE };
    static getReplaceMetadataURL = {
        name: 'ɵɵgetReplaceMetadataURL',
        moduleName: CORE,
    };
    static ɵɵdefineInjectable = { name: 'ɵɵdefineInjectable', moduleName: CORE };
    static declareInjectable = { name: 'ɵɵngDeclareInjectable', moduleName: CORE };
    static InjectableDeclaration = {
        name: 'ɵɵInjectableDeclaration',
        moduleName: CORE,
    };
    static resolveWindow = { name: 'ɵɵresolveWindow', moduleName: CORE };
    static resolveDocument = { name: 'ɵɵresolveDocument', moduleName: CORE };
    static resolveBody = { name: 'ɵɵresolveBody', moduleName: CORE };
    static getComponentDepsFactory = {
        name: 'ɵɵgetComponentDepsFactory',
        moduleName: CORE,
    };
    static defineComponent = { name: 'ɵɵdefineComponent', moduleName: CORE };
    static declareComponent = { name: 'ɵɵngDeclareComponent', moduleName: CORE };
    static setComponentScope = { name: 'ɵɵsetComponentScope', moduleName: CORE };
    static ChangeDetectionStrategy = {
        name: 'ChangeDetectionStrategy',
        moduleName: CORE,
    };
    static ViewEncapsulation = {
        name: 'ViewEncapsulation',
        moduleName: CORE,
    };
    static ComponentDeclaration = {
        name: 'ɵɵComponentDeclaration',
        moduleName: CORE,
    };
    static FactoryDeclaration = {
        name: 'ɵɵFactoryDeclaration',
        moduleName: CORE,
    };
    static declareFactory = { name: 'ɵɵngDeclareFactory', moduleName: CORE };
    static FactoryTarget = { name: 'ɵɵFactoryTarget', moduleName: CORE };
    static defineDirective = { name: 'ɵɵdefineDirective', moduleName: CORE };
    static declareDirective = { name: 'ɵɵngDeclareDirective', moduleName: CORE };
    static DirectiveDeclaration = {
        name: 'ɵɵDirectiveDeclaration',
        moduleName: CORE,
    };
    static InjectorDef = { name: 'ɵɵInjectorDef', moduleName: CORE };
    static InjectorDeclaration = {
        name: 'ɵɵInjectorDeclaration',
        moduleName: CORE,
    };
    static defineInjector = { name: 'ɵɵdefineInjector', moduleName: CORE };
    static declareInjector = { name: 'ɵɵngDeclareInjector', moduleName: CORE };
    static NgModuleDeclaration = {
        name: 'ɵɵNgModuleDeclaration',
        moduleName: CORE,
    };
    static ModuleWithProviders = {
        name: 'ModuleWithProviders',
        moduleName: CORE,
    };
    static defineNgModule = { name: 'ɵɵdefineNgModule', moduleName: CORE };
    static declareNgModule = { name: 'ɵɵngDeclareNgModule', moduleName: CORE };
    static setNgModuleScope = { name: 'ɵɵsetNgModuleScope', moduleName: CORE };
    static registerNgModuleType = {
        name: 'ɵɵregisterNgModuleType',
        moduleName: CORE,
    };
    static PipeDeclaration = { name: 'ɵɵPipeDeclaration', moduleName: CORE };
    static definePipe = { name: 'ɵɵdefinePipe', moduleName: CORE };
    static declarePipe = { name: 'ɵɵngDeclarePipe', moduleName: CORE };
    static declareClassMetadata = {
        name: 'ɵɵngDeclareClassMetadata',
        moduleName: CORE,
    };
    static declareClassMetadataAsync = {
        name: 'ɵɵngDeclareClassMetadataAsync',
        moduleName: CORE,
    };
    static setClassMetadata = { name: 'ɵsetClassMetadata', moduleName: CORE };
    static setClassMetadataAsync = {
        name: 'ɵsetClassMetadataAsync',
        moduleName: CORE,
    };
    static setClassDebugInfo = { name: 'ɵsetClassDebugInfo', moduleName: CORE };
    static queryRefresh = { name: 'ɵɵqueryRefresh', moduleName: CORE };
    static viewQuery = { name: 'ɵɵviewQuery', moduleName: CORE };
    static loadQuery = { name: 'ɵɵloadQuery', moduleName: CORE };
    static contentQuery = { name: 'ɵɵcontentQuery', moduleName: CORE };
    // Signal queries
    static viewQuerySignal = { name: 'ɵɵviewQuerySignal', moduleName: CORE };
    static contentQuerySignal = { name: 'ɵɵcontentQuerySignal', moduleName: CORE };
    static queryAdvance = { name: 'ɵɵqueryAdvance', moduleName: CORE };
    // Two-way bindings
    static twoWayProperty = { name: 'ɵɵtwoWayProperty', moduleName: CORE };
    static twoWayBindingSet = { name: 'ɵɵtwoWayBindingSet', moduleName: CORE };
    static twoWayListener = { name: 'ɵɵtwoWayListener', moduleName: CORE };
    static declareLet = { name: 'ɵɵdeclareLet', moduleName: CORE };
    static storeLet = { name: 'ɵɵstoreLet', moduleName: CORE };
    static readContextLet = { name: 'ɵɵreadContextLet', moduleName: CORE };
    static attachSourceLocations = {
        name: 'ɵɵattachSourceLocations',
        moduleName: CORE,
    };
    static NgOnChangesFeature = { name: 'ɵɵNgOnChangesFeature', moduleName: CORE };
    static InheritDefinitionFeature = {
        name: 'ɵɵInheritDefinitionFeature',
        moduleName: CORE,
    };
    static CopyDefinitionFeature = {
        name: 'ɵɵCopyDefinitionFeature',
        moduleName: CORE,
    };
    static ProvidersFeature = { name: 'ɵɵProvidersFeature', moduleName: CORE };
    static HostDirectivesFeature = {
        name: 'ɵɵHostDirectivesFeature',
        moduleName: CORE,
    };
    static ExternalStylesFeature = {
        name: 'ɵɵExternalStylesFeature',
        moduleName: CORE,
    };
    static listener = { name: 'ɵɵlistener', moduleName: CORE };
    static getInheritedFactory = {
        name: 'ɵɵgetInheritedFactory',
        moduleName: CORE,
    };
    // sanitization-related functions
    static sanitizeHtml = { name: 'ɵɵsanitizeHtml', moduleName: CORE };
    static sanitizeStyle = { name: 'ɵɵsanitizeStyle', moduleName: CORE };
    static sanitizeResourceUrl = {
        name: 'ɵɵsanitizeResourceUrl',
        moduleName: CORE,
    };
    static sanitizeScript = { name: 'ɵɵsanitizeScript', moduleName: CORE };
    static sanitizeUrl = { name: 'ɵɵsanitizeUrl', moduleName: CORE };
    static sanitizeUrlOrResourceUrl = {
        name: 'ɵɵsanitizeUrlOrResourceUrl',
        moduleName: CORE,
    };
    static trustConstantHtml = { name: 'ɵɵtrustConstantHtml', moduleName: CORE };
    static trustConstantResourceUrl = {
        name: 'ɵɵtrustConstantResourceUrl',
        moduleName: CORE,
    };
    static validateIframeAttribute = {
        name: 'ɵɵvalidateIframeAttribute',
        moduleName: CORE,
    };
    // type-checking
    static InputSignalBrandWriteType = { name: 'ɵINPUT_SIGNAL_BRAND_WRITE_TYPE', moduleName: CORE };
    static UnwrapDirectiveSignalInputs = { name: 'ɵUnwrapDirectiveSignalInputs', moduleName: CORE };
    static unwrapWritableSignal = { name: 'ɵunwrapWritableSignal', moduleName: CORE };
}

const DASH_CASE_REGEXP = /-+([a-z0-9])/g;
function dashCaseToCamelCase(input) {
    return input.replace(DASH_CASE_REGEXP, (...m) => m[1].toUpperCase());
}
function splitAtColon(input, defaultValues) {
    return _splitAt(input, ':', defaultValues);
}
function splitAtPeriod(input, defaultValues) {
    return _splitAt(input, '.', defaultValues);
}
function _splitAt(input, character, defaultValues) {
    const characterIndex = input.indexOf(character);
    if (characterIndex == -1)
        return defaultValues;
    return [input.slice(0, characterIndex).trim(), input.slice(characterIndex + 1).trim()];
}
function utf8Encode(str) {
    let encoded = [];
    for (let index = 0; index < str.length; index++) {
        let codePoint = str.charCodeAt(index);
        // decode surrogate
        // see https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
        if (codePoint >= 0xd800 && codePoint <= 0xdbff && str.length > index + 1) {
            const low = str.charCodeAt(index + 1);
            if (low >= 0xdc00 && low <= 0xdfff) {
                index++;
                codePoint = ((codePoint - 0xd800) << 10) + low - 0xdc00 + 0x10000;
            }
        }
        if (codePoint <= 0x7f) {
            encoded.push(codePoint);
        }
        else if (codePoint <= 0x7ff) {
            encoded.push(((codePoint >> 6) & 0x1f) | 0xc0, (codePoint & 0x3f) | 0x80);
        }
        else if (codePoint <= 0xffff) {
            encoded.push((codePoint >> 12) | 0xe0, ((codePoint >> 6) & 0x3f) | 0x80, (codePoint & 0x3f) | 0x80);
        }
        else if (codePoint <= 0x1fffff) {
            encoded.push(((codePoint >> 18) & 0x07) | 0xf0, ((codePoint >> 12) & 0x3f) | 0x80, ((codePoint >> 6) & 0x3f) | 0x80, (codePoint & 0x3f) | 0x80);
        }
    }
    return encoded;
}
function stringify(token) {
    if (typeof token === 'string') {
        return token;
    }
    if (Array.isArray(token)) {
        return `[${token.map(stringify).join(', ')}]`;
    }
    if (token == null) {
        return '' + token;
    }
    const name = token.overriddenName || token.name;
    if (name) {
        return `${name}`;
    }
    if (!token.toString) {
        return 'object';
    }
    // WARNING: do not try to `JSON.stringify(token)` here
    // see https://github.com/angular/angular/issues/23440
    const result = token.toString();
    if (result == null) {
        return '' + result;
    }
    const newLineIndex = result.indexOf('\n');
    return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result;
}
class Version {
    full;
    major;
    minor;
    patch;
    constructor(full) {
        this.full = full;
        const splits = full.split('.');
        this.major = splits[0];
        this.minor = splits[1];
        this.patch = splits.slice(2).join('.');
    }
}
const _global = globalThis;
const V1_TO_18 = /^([1-9]|1[0-8])\./;
function getJitStandaloneDefaultForVersion(version) {
    if (version.startsWith('0.')) {
        // 0.0.0 is always "latest", default is true.
        return true;
    }
    if (V1_TO_18.test(version)) {
        // Angular v2 - v18 default is false.
        return false;
    }
    // All other Angular versions (v19+) default to true.
    return true;
}

// https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
const VERSION = 3;
const JS_B64_PREFIX = '# sourceMappingURL=data:application/json;base64,';
class SourceMapGenerator {
    file;
    sourcesContent = new Map();
    lines = [];
    lastCol0 = 0;
    hasMappings = false;
    constructor(file = null) {
        this.file = file;
    }
    // The content is `null` when the content is expected to be loaded using the URL
    addSource(url, content = null) {
        if (!this.sourcesContent.has(url)) {
            this.sourcesContent.set(url, content);
        }
        return this;
    }
    addLine() {
        this.lines.push([]);
        this.lastCol0 = 0;
        return this;
    }
    addMapping(col0, sourceUrl, sourceLine0, sourceCol0) {
        if (!this.currentLine) {
            throw new Error(`A line must be added before mappings can be added`);
        }
        if (sourceUrl != null && !this.sourcesContent.has(sourceUrl)) {
            throw new Error(`Unknown source file "${sourceUrl}"`);
        }
        if (col0 == null) {
            throw new Error(`The column in the generated code must be provided`);
        }
        if (col0 < this.lastCol0) {
            throw new Error(`Mapping should be added in output order`);
        }
        if (sourceUrl && (sourceLine0 == null || sourceCol0 == null)) {
            throw new Error(`The source location must be provided when a source url is provided`);
        }
        this.hasMappings = true;
        this.lastCol0 = col0;
        this.currentLine.push({ col0, sourceUrl, sourceLine0, sourceCol0 });
        return this;
    }
    /**
     * @internal strip this from published d.ts files due to
     * https://github.com/microsoft/TypeScript/issues/36216
     */
    get currentLine() {
        return this.lines.slice(-1)[0];
    }
    toJSON() {
        if (!this.hasMappings) {
            return null;
        }
        const sourcesIndex = new Map();
        const sources = [];
        const sourcesContent = [];
        Array.from(this.sourcesContent.keys()).forEach((url, i) => {
            sourcesIndex.set(url, i);
            sources.push(url);
            sourcesContent.push(this.sourcesContent.get(url) || null);
        });
        let mappings = '';
        let lastCol0 = 0;
        let lastSourceIndex = 0;
        let lastSourceLine0 = 0;
        let lastSourceCol0 = 0;
        this.lines.forEach((segments) => {
            lastCol0 = 0;
            mappings += segments
                .map((segment) => {
                // zero-based starting column of the line in the generated code
                let segAsStr = toBase64VLQ(segment.col0 - lastCol0);
                lastCol0 = segment.col0;
                if (segment.sourceUrl != null) {
                    // zero-based index into the “sources” list
                    segAsStr += toBase64VLQ(sourcesIndex.get(segment.sourceUrl) - lastSourceIndex);
                    lastSourceIndex = sourcesIndex.get(segment.sourceUrl);
                    // the zero-based starting line in the original source
                    segAsStr += toBase64VLQ(segment.sourceLine0 - lastSourceLine0);
                    lastSourceLine0 = segment.sourceLine0;
                    // the zero-based starting column in the original source
                    segAsStr += toBase64VLQ(segment.sourceCol0 - lastSourceCol0);
                    lastSourceCol0 = segment.sourceCol0;
                }
                return segAsStr;
            })
                .join(',');
            mappings += ';';
        });
        mappings = mappings.slice(0, -1);
        return {
            'file': this.file || '',
            'version': VERSION,
            'sourceRoot': '',
            'sources': sources,
            'sourcesContent': sourcesContent,
            'mappings': mappings,
        };
    }
    toJsComment() {
        return this.hasMappings
            ? '//' + JS_B64_PREFIX + toBase64String(JSON.stringify(this, null, 0))
            : '';
    }
}
function toBase64String(value) {
    let b64 = '';
    const encoded = utf8Encode(value);
    for (let i = 0; i < encoded.length;) {
        const i1 = encoded[i++];
        const i2 = i < encoded.length ? encoded[i++] : null;
        const i3 = i < encoded.length ? encoded[i++] : null;
        b64 += toBase64Digit(i1 >> 2);
        b64 += toBase64Digit(((i1 & 3) << 4) | (i2 === null ? 0 : i2 >> 4));
        b64 += i2 === null ? '=' : toBase64Digit(((i2 & 15) << 2) | (i3 === null ? 0 : i3 >> 6));
        b64 += i2 === null || i3 === null ? '=' : toBase64Digit(i3 & 63);
    }
    return b64;
}
function toBase64VLQ(value) {
    value = value < 0 ? (-value << 1) + 1 : value << 1;
    let out = '';
    do {
        let digit = value & 31;
        value = value >> 5;
        if (value > 0) {
            digit = digit | 32;
        }
        out += toBase64Digit(digit);
    } while (value > 0);
    return out;
}
const B64_DIGITS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
function toBase64Digit(value) {
    if (value < 0 || value >= 64) {
        throw new Error(`Can only encode value in the range [0, 63]`);
    }
    return B64_DIGITS[value];
}

const _SINGLE_QUOTE_ESCAPE_STRING_RE = /'|\\|\n|\r|\$/g;
const _LEGAL_IDENTIFIER_RE = /^[$A-Z_][0-9A-Z_$]*$/i;
const _INDENT_WITH = '  ';
class _EmittedLine {
    indent;
    partsLength = 0;
    parts = [];
    srcSpans = [];
    constructor(indent) {
        this.indent = indent;
    }
}
class EmitterVisitorContext {
    _indent;
    static createRoot() {
        return new EmitterVisitorContext(0);
    }
    _lines;
    constructor(_indent) {
        this._indent = _indent;
        this._lines = [new _EmittedLine(_indent)];
    }
    /**
     * @internal strip this from published d.ts files due to
     * https://github.com/microsoft/TypeScript/issues/36216
     */
    get _currentLine() {
        return this._lines[this._lines.length - 1];
    }
    println(from, lastPart = '') {
        this.print(from || null, lastPart, true);
    }
    lineIsEmpty() {
        return this._currentLine.parts.length === 0;
    }
    lineLength() {
        return this._currentLine.indent * _INDENT_WITH.length + this._currentLine.partsLength;
    }
    print(from, part, newLine = false) {
        if (part.length > 0) {
            this._currentLine.parts.push(part);
            this._currentLine.partsLength += part.length;
            this._currentLine.srcSpans.push((from && from.sourceSpan) || null);
        }
        if (newLine) {
            this._lines.push(new _EmittedLine(this._indent));
        }
    }
    removeEmptyLastLine() {
        if (this.lineIsEmpty()) {
            this._lines.pop();
        }
    }
    incIndent() {
        this._indent++;
        if (this.lineIsEmpty()) {
            this._currentLine.indent = this._indent;
        }
    }
    decIndent() {
        this._indent--;
        if (this.lineIsEmpty()) {
            this._currentLine.indent = this._indent;
        }
    }
    toSource() {
        return this.sourceLines
            .map((l) => (l.parts.length > 0 ? _createIndent(l.indent) + l.parts.join('') : ''))
            .join('\n');
    }
    toSourceMapGenerator(genFilePath, startsAtLine = 0) {
        const map = new SourceMapGenerator(genFilePath);
        let firstOffsetMapped = false;
        const mapFirstOffsetIfNeeded = () => {
            if (!firstOffsetMapped) {
                // Add a single space so that tools won't try to load the file from disk.
                // Note: We are using virtual urls like `ng:///`, so we have to
                // provide a content here.
                map.addSource(genFilePath, ' ').addMapping(0, genFilePath, 0, 0);
                firstOffsetMapped = true;
            }
        };
        for (let i = 0; i < startsAtLine; i++) {
            map.addLine();
            mapFirstOffsetIfNeeded();
        }
        this.sourceLines.forEach((line, lineIdx) => {
            map.addLine();
            const spans = line.srcSpans;
            const parts = line.parts;
            let col0 = line.indent * _INDENT_WITH.length;
            let spanIdx = 0;
            // skip leading parts without source spans
            while (spanIdx < spans.length && !spans[spanIdx]) {
                col0 += parts[spanIdx].length;
                spanIdx++;
            }
            if (spanIdx < spans.length && lineIdx === 0 && col0 === 0) {
                firstOffsetMapped = true;
            }
            else {
                mapFirstOffsetIfNeeded();
            }
            while (spanIdx < spans.length) {
                const span = spans[spanIdx];
                const source = span.start.file;
                const sourceLine = span.start.line;
                const sourceCol = span.start.col;
                map
                    .addSource(source.url, source.content)
                    .addMapping(col0, source.url, sourceLine, sourceCol);
                col0 += parts[spanIdx].length;
                spanIdx++;
                // assign parts without span or the same span to the previous segment
                while (spanIdx < spans.length && (span === spans[spanIdx] || !spans[spanIdx])) {
                    col0 += parts[spanIdx].length;
                    spanIdx++;
                }
            }
        });
        return map;
    }
    spanOf(line, column) {
        const emittedLine = this._lines[line];
        if (emittedLine) {
            let columnsLeft = column - _createIndent(emittedLine.indent).length;
            for (let partIndex = 0; partIndex < emittedLine.parts.length; partIndex++) {
                const part = emittedLine.parts[partIndex];
                if (part.length > columnsLeft) {
                    return emittedLine.srcSpans[partIndex];
                }
                columnsLeft -= part.length;
            }
        }
        return null;
    }
    /**
     * @internal strip this from published d.ts files due to
     * https://github.com/microsoft/TypeScript/issues/36216
     */
    get sourceLines() {
        if (this._lines.length && this._lines[this._lines.length - 1].parts.length === 0) {
            return this._lines.slice(0, -1);
        }
        return this._lines;
    }
}
class AbstractEmitterVisitor {
    _escapeDollarInStrings;
    constructor(_escapeDollarInStrings) {
        this._escapeDollarInStrings = _escapeDollarInStrings;
    }
    printLeadingComments(stmt, ctx) {
        if (stmt.leadingComments === undefined) {
            return;
        }
        for (const comment of stmt.leadingComments) {
            if (comment instanceof JSDocComment) {
                ctx.print(stmt, `/*${comment.toString()}*/`, comment.trailingNewline);
            }
            else {
                if (comment.multiline) {
                    ctx.print(stmt, `/* ${comment.text} */`, comment.trailingNewline);
                }
                else {
                    comment.text.split('\n').forEach((line) => {
                        ctx.println(stmt, `// ${line}`);
                    });
                }
            }
        }
    }
    visitExpressionStmt(stmt, ctx) {
        this.printLeadingComments(stmt, ctx);
        stmt.expr.visitExpression(this, ctx);
        ctx.println(stmt, ';');
        return null;
    }
    visitReturnStmt(stmt, ctx) {
        this.printLeadingComments(stmt, ctx);
        ctx.print(stmt, `return `);
        stmt.value.visitExpression(this, ctx);
        ctx.println(stmt, ';');
        return null;
    }
    visitIfStmt(stmt, ctx) {
        this.printLeadingComments(stmt, ctx);
        ctx.print(stmt, `if (`);
        stmt.condition.visitExpression(this, ctx);
        ctx.print(stmt, `) {`);
        const hasElseCase = stmt.falseCase != null && stmt.falseCase.length > 0;
        if (stmt.trueCase.length <= 1 && !hasElseCase) {
            ctx.print(stmt, ` `);
            this.visitAllStatements(stmt.trueCase, ctx);
            ctx.removeEmptyLastLine();
            ctx.print(stmt, ` `);
        }
        else {
            ctx.println();
            ctx.incIndent();
            this.visitAllStatements(stmt.trueCase, ctx);
            ctx.decIndent();
            if (hasElseCase) {
                ctx.println(stmt, `} else {`);
                ctx.incIndent();
                this.visitAllStatements(stmt.falseCase, ctx);
                ctx.decIndent();
            }
        }
        ctx.println(stmt, `}`);
        return null;
    }
    visitWriteVarExpr(expr, ctx) {
        const lineWasEmpty = ctx.lineIsEmpty();
        if (!lineWasEmpty) {
            ctx.print(expr, '(');
        }
        ctx.print(expr, `${expr.name} = `);
        expr.value.visitExpression(this, ctx);
        if (!lineWasEmpty) {
            ctx.print(expr, ')');
        }
        return null;
    }
    visitWriteKeyExpr(expr, ctx) {
        const lineWasEmpty = ctx.lineIsEmpty();
        if (!lineWasEmpty) {
            ctx.print(expr, '(');
        }
        expr.receiver.visitExpression(this, ctx);
        ctx.print(expr, `[`);
        expr.index.visitExpression(this, ctx);
        ctx.print(expr, `] = `);
        expr.value.visitExpression(this, ctx);
        if (!lineWasEmpty) {
            ctx.print(expr, ')');
        }
        return null;
    }
    visitWritePropExpr(expr, ctx) {
        const lineWasEmpty = ctx.lineIsEmpty();
        if (!lineWasEmpty) {
            ctx.print(expr, '(');
        }
        expr.receiver.visitExpression(this, ctx);
        ctx.print(expr, `.${expr.name} = `);
        expr.value.visitExpression(this, ctx);
        if (!lineWasEmpty) {
            ctx.print(expr, ')');
        }
        return null;
    }
    visitInvokeFunctionExpr(expr, ctx) {
        const shouldParenthesize = expr.fn instanceof ArrowFunctionExpr;
        if (shouldParenthesize) {
            ctx.print(expr.fn, '(');
        }
        expr.fn.visitExpression(this, ctx);
        if (shouldParenthesize) {
            ctx.print(expr.fn, ')');
        }
        ctx.print(expr, `(`);
        this.visitAllExpressions(expr.args, ctx, ',');
        ctx.print(expr, `)`);
        return null;
    }
    visitTaggedTemplateLiteralExpr(expr, ctx) {
        expr.tag.visitExpression(this, ctx);
        expr.template.visitExpression(this, ctx);
        return null;
    }
    visitTemplateLiteralExpr(expr, ctx) {
        ctx.print(expr, '`');
        for (let i = 0; i < expr.elements.length; i++) {
            expr.elements[i].visitExpression(this, ctx);
            const expression = i < expr.expressions.length ? expr.expressions[i] : null;
            if (expression !== null) {
                ctx.print(expression, '${');
                expression.visitExpression(this, ctx);
                ctx.print(expression, '}');
            }
        }
        ctx.print(expr, '`');
    }
    visitTemplateLiteralElementExpr(expr, ctx) {
        ctx.print(expr, expr.rawText);
    }
    visitWrappedNodeExpr(ast, ctx) {
        throw new Error('Abstract emitter cannot visit WrappedNodeExpr.');
    }
    visitTypeofExpr(expr, ctx) {
        ctx.print(expr, 'typeof ');
        expr.expr.visitExpression(this, ctx);
    }
    visitReadVarExpr(ast, ctx) {
        ctx.print(ast, ast.name);
        return null;
    }
    visitInstantiateExpr(ast, ctx) {
        ctx.print(ast, `new `);
        ast.classExpr.visitExpression(this, ctx);
        ctx.print(ast, `(`);
        this.visitAllExpressions(ast.args, ctx, ',');
        ctx.print(ast, `)`);
        return null;
    }
    visitLiteralExpr(ast, ctx) {
        const value = ast.value;
        if (typeof value === 'string') {
            ctx.print(ast, escapeIdentifier(value, this._escapeDollarInStrings));
        }
        else {
            ctx.print(ast, `${value}`);
        }
        return null;
    }
    visitLocalizedString(ast, ctx) {
        const head = ast.serializeI18nHead();
        ctx.print(ast, '$localize `' + head.raw);
        for (let i = 1; i < ast.messageParts.length; i++) {
            ctx.print(ast, '${');
            ast.expressions[i - 1].visitExpression(this, ctx);
            ctx.print(ast, `}${ast.serializeI18nTemplatePart(i).raw}`);
        }
        ctx.print(ast, '`');
        return null;
    }
    visitConditionalExpr(ast, ctx) {
        ctx.print(ast, `(`);
        ast.condition.visitExpression(this, ctx);
        ctx.print(ast, '? ');
        ast.trueCase.visitExpression(this, ctx);
        ctx.print(ast, ': ');
        ast.falseCase.visitExpression(this, ctx);
        ctx.print(ast, `)`);
        return null;
    }
    visitDynamicImportExpr(ast, ctx) {
        ctx.print(ast, `import(${ast.url})`);
    }
    visitNotExpr(ast, ctx) {
        ctx.print(ast, '!');
        ast.condition.visitExpression(this, ctx);
        return null;
    }
    visitUnaryOperatorExpr(ast, ctx) {
        let opStr;
        switch (ast.operator) {
            case UnaryOperator.Plus:
                opStr = '+';
                break;
            case UnaryOperator.Minus:
                opStr = '-';
                break;
            default:
                throw new Error(`Unknown operator ${ast.operator}`);
        }
        if (ast.parens)
            ctx.print(ast, `(`);
        ctx.print(ast, opStr);
        ast.expr.visitExpression(this, ctx);
        if (ast.parens)
            ctx.print(ast, `)`);
        return null;
    }
    visitBinaryOperatorExpr(ast, ctx) {
        let opStr;
        switch (ast.operator) {
            case BinaryOperator.Equals:
                opStr = '==';
                break;
            case BinaryOperator.Identical:
                opStr = '===';
                break;
            case BinaryOperator.NotEquals:
                opStr = '!=';
                break;
            case BinaryOperator.NotIdentical:
                opStr = '!==';
                break;
            case BinaryOperator.And:
                opStr = '&&';
                break;
            case BinaryOperator.Bitw   iseOr:
                opStr = '|';
                break;
            case BinaryOperator.BitwiseAnd:
                opStr = '&';
                break;
            case BinaryOperator.Or:
                opStr = '||';
                break;
            case BinaryOperator.Plus:
                opStr = '+';
                break;
            case BinaryOperator.Minus:
                opStr = '-';
                break;
            case BinaryOperator.Divide:
                opStr = '/';
                break;
            case BinaryOperator.Multiply:
                opStr = '*';
                break;
            case BinaryOperator.Modulo:
                opStr = '%';
                break;
            case BinaryOperator.Lower:
                opStr = '<';
                break;
            case BinaryOperator.LowerEquals:
                opStr = '<=';
                break;
            case BinaryOperator.Bigger:
                opStr = '>';
                break;
            case BinaryOperator.BiggerEquals:
                opStr = '>=';
                break;
            case BinaryOperator.NullishCoalesce:
                opStr = '??';
                break;
            default:
                throw new Error(`Unknown operator ${ast.operator}`);
        }
        if (ast.parens)
            ctx.print(ast, `(`);
        ast.lhs.visitExpression(this, ctx);
        ctx.print(ast, ` ${opStr} `);
        ast.rhs.visitExpression(this, ctx);
        if (ast.parens)
            ctx.print(ast, `)`);
        return null;
    }
    visitReadPropExpr(ast, ctx) {
        ast.receiver.visitExpression(this, ctx);
        ctx.print(ast, `.`);
        ctx.print(ast, ast.name);
        return null;
    }
    visitReadKeyExpr(ast, ctx) {
        ast.receiver.visitExpression(this, ctx);
        ctx.print(ast, `[`);
        ast.index.visitExpression(this, ctx);
        ctx.print(ast, `]`);
        return null;
    }
    visitLiteralArrayExpr(ast, ctx) {
        ctx.print(ast, `[`);
        this.visitAllExpressions(ast.entries, ctx, ',');
        ctx.print(ast, `]`);
        return null;
    }
    visitLiteralMapExpr(ast, ctx) {
        ctx.print(ast, `{`);
        this.visitAllObjects((entry) => {
            ctx.print(ast, `${escapeIdentifier(entry.key, this._escapeDollarInStrings, entry.quoted)}:`);
            entry.value.visitExpression(this, ctx);
        }, ast.entries, ctx, ',');
        ctx.print(ast, `}`);
        return null;
    }
    visitCommaExpr(ast, ctx) {
        ctx.print(ast, '(');
        this.visitAllExpressions(ast.parts, ctx, ',');
        ctx.print(ast, ')');
        return null;
    }
    visitAllExpressions(expressions, ctx, separator) {
        this.visitAllObjects((expr) => expr.visitExpression(this, ctx), expressions, ctx, separator);
    }
    visitAllObjects(handler, expressions, ctx, separator) {
        let incrementedIndent = false;
        for (let i = 0; i < expressions.length; i++) {
            if (i > 0) {
                if (ctx.lineLength() > 80) {
                    ctx.print(null, separator, true);
                    if (!incrementedIndent) {
                        // continuation are marked with double indent.
                        ctx.incIndent();
                        ctx.incIndent();
                        incrementedIndent = true;
                    }
                }
                else {
                    ctx.print(null, separator, false);
                }
            }
            handler(expressions[i]);
        }
        if (incrementedIndent) {
            // continuation are marked with double indent.
            ctx.decIndent();
            ctx.decIndent();
        }
    }
    visitAllStatements(statements, ctx) {
        statements.forEach((stmt) => stmt.visitStatement(this, ctx));
    }
}
function escapeIdentifier(input, escapeDollar, alwaysQuote = true) {
    if (input == null) {
        return null;
    }
    const body = input.replace(_SINGLE_QUOTE_ESCAPE_STRING_RE, (...match) => {
        if (match[0] == '$') {
            return escapeDollar ? '\\$' : '$';
        }
        else if (match[0] == '\n') {
            return '\\n';
        }
        else if (match[0] == '\r') {
            return '\\r';
        }
        else {
            return `\\${match[0]}`;
        }
    });
    const requiresQuotes = alwaysQuote || !_LEGAL_IDENTIFIER_RE.test(body);
    return requiresQuotes ? `'${body}'` : body;
}
function _createIndent(count) {
    let res = '';
    for (let i = 0; i < count; i++) {
        res += _INDENT_WITH;
    }
    return res;
}

function typeWithParameters(type, numParams) {
    if (numParams === 0) {
        return expressionType(type);
    }
    const params = [];
    for (let i = 0; i < numParams; i++) {
        params.push(DYNAMIC_TYPE);
    }
    return expressionType(type, undefined, params);
}
function getSafePropertyAccessString(accessor, name) {
    const escapedName = escapeIdentifier(name, false, false);
    return escapedName !== name ? `${accessor}[${escapedName}]` : `${accessor}.${name}`;
}
function jitOnlyGuardedExpression(expr) {
    return guardedExpression('ngJitMode', expr);
}
function devOnlyGuardedExpression(expr) {
    return guardedExpression('ngDevMode', expr);
}
function guardedExpression(guard, expr) {
    const guardExpr = new ExternalExpr({ name: guard, moduleName: null });
    const guardNotDefined = new BinaryOperatorExpr(BinaryOperator.Identical, new TypeofExpr(guardExpr), literal$1('undefined'));
    const guardUndefinedOrTrue = new BinaryOperatorExpr(BinaryOperator.Or, guardNotDefined, guardExpr, 
    /* type */ undefined, 
    /* sourceSpan */ undefined, true);
    return new BinaryOperatorExpr(BinaryOperator.And, guardUndefinedOrTrue, expr);
}
function wrapReference(value) {
    const wrapped = new WrappedNodeExpr(value);
    return { value: wrapped, type: wrapped };
}
function refsToArray(refs, shouldForwardDeclare) {
    const values = literalArr(refs.map((ref) => ref.value));
    return shouldForwardDeclare ? arrowFn([], values) : values;
}
function createMayBeForwardRefExpression(expression, forwardRef) {
    return { expression, forwardRef };
}
/**
 * Convert a `MaybeForwardRefExpression` to an `Expression`, possibly wrapping its expression in a
 * `forwardRef()` call.
 *
 * If `MaybeForwardRefExpression.forwardRef` is `ForwardRefHandling.Unwrapped` then the expression
 * was originally wrapped in a `forwardRef()` call to prevent the value from being eagerly evaluated
 * in the code.
 *
 * See `packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts` and
 * `packages/compiler/src/jit_compiler_facade.ts` for more information.
 */
function convertFromMaybeForwardRefExpression({ expression, forwardRef, }) {
    switch (forwardRef) {
        case 0 /* ForwardRefHandling.None */:
        case 1 /* ForwardRefHandling.Wrapped */:
            return expression;
        case 2 /* ForwardRefHandling.Unwrapped */:
            return generateForwardRef(expression);
    }
}
/**
 * Generate an expression that has the given `expr` wrapped in the following form:
 *
 * ```ts
 * forwardRef(() => expr)
 * ```
 */
function generateForwardRef(expr) {
    return importExpr(Identifiers.forwardRef).callFn([arrowFn([], expr)]);
}

var R3FactoryDelegateType;
(function (R3FactoryDelegateType) {
    R3FactoryDelegateType[R3FactoryDelegateType["Class"] = 0] = "Class";
    R3FactoryDelegateType[R3FactoryDelegateType["Function"] = 1] = "Function";
})(R3FactoryDelegateType || (R3FactoryDelegateType = {}));
/**
 * Construct a factory function expression for the given `R3FactoryMetadata`.
 */
function compileFactoryFunction(meta) {
    const t = variable('__ngFactoryType__');
    let baseFactoryVar = null;
    // The type to instantiate via constructor invocation. If there is no delegated factory, meaning
    // this type is always created by constructor invocation, then this is the type-to-create
    // parameter provided by the user (t) if specified, or the current type if not. If there is a
    // delegated factory (which is used to create the current type) then this is only the type-to-
    // create parameter (t).
    const typeForCtor = !isDelegatedFactoryMetadata(meta)
        ? new BinaryOperatorExpr(BinaryOperator.Or, t, meta.type.value)
        : t;
    let ctorExpr = null;
    if (meta.deps !== null) {
        // There is a constructor (either explicitly or implicitly defined).
        if (meta.deps !== 'invalid') {
            ctorExpr = new InstantiateExpr(typeForCtor, injectDependencies(meta.deps, meta.target));
        }
    }
    else {
        // There is no constructor, use the base class' factory to construct typeForCtor.
        baseFactoryVar = variable(`ɵ${meta.name}_BaseFactory`);
        ctorExpr = baseFactoryVar.callFn([typeForCtor]);
    }
    const body = [];
    let retExpr = null;
    function makeConditionalFactory(nonCtorExpr) {
        const r = variable('__ngConditionalFactory__');
        body.push(r.set(NULL_EXPR).toDeclStmt());
        const ctorStmt = ctorExpr !== null
            ? r.set(ctorExpr).toStmt()
            : importExpr(Identifiers.invalidFactory).callFn([]).toStmt();
        body.push(ifStmt(t, [ctorStmt], [r.set(nonCtorExpr).toStmt()]));
        return r;
    }
    if (isDelegatedFactoryMetadata(meta)) {
        // This type is created with a delegated factory. If a type parameter is not specified, call
        // the factory instead.
        const delegateArgs = injectDependencies(meta.delegateDeps, meta.target);
        // Either call `new delegate(...)` or `delegate(...)` depending on meta.delegateType.
        const factoryExpr = new (meta.delegateType === R3FactoryDelegateType.Class ? InstantiateExpr : InvokeFunctionExpr)(meta.delegate, delegateArgs);
        retExpr = makeConditionalFactory(factoryExpr);
    }
    else if (isExpressionFactoryMetadata(meta)) {
        // TODO(alxhub): decide whether to lower the value here or in the caller
        retExpr = makeConditionalFactory(meta.expression);
    }
    else {
        retExpr = ctorExpr;
    }
    if (retExpr === null) {
        // The expression cannot be formed so render an `ɵɵinvalidFactory()` call.
        body.push(importExpr(Identifiers.invalidFactory).callFn([]).toStmt());
    }
    else if (baseFactoryVar !== null) {
        // This factory uses a base factory, so call `ɵɵgetInheritedFactory()` to compute it.
        const getInheritedFactoryCall = importExpr(Identifiers.getInheritedFactory).callFn([meta.type.value]);
        // Memoize the base factoryFn: `baseFactory || (baseFactory = ɵɵgetInheritedFactory(...))`
        const baseFactory = new BinaryOperatorExpr(BinaryOperator.Or, baseFactoryVar, baseFactoryVar.set(getInheritedFactoryCall));
        body.push(new ReturnStatement(baseFactory.callFn([typeForCtor])));
    }
    else {
        // This is straightforward factory, just return it.
        body.push(new ReturnStatement(retExpr));
    }
    let factoryFn = fn([new FnParam(t.name, DYNAMIC_TYPE)], body, INFERRED_TYPE, undefined, `${meta.name}_Factory`);
    if (baseFactoryVar !== null) {
        // There is a base factory variable so wrap its declaration along with the factory function into
        // an IIFE.
        factoryFn = arrowFn([], [new DeclareVarStmt(baseFactoryVar.name), new ReturnStatement(factoryFn)])
            .callFn([], /* sourceSpan */ undefined, /* pure */ true);
    }
    return {
        expression: factoryFn,
        statements: [],
        type: createFactoryType(meta),
    };
}
function createFactoryType(meta) {
    const ctorDepsType = meta.deps !== null && meta.deps !== 'invalid' ? createCtorDepsType(meta.deps) : NONE_TYPE;
    return expressionType(importExpr(Identifiers.FactoryDeclaration, [
        typeWithParameters(meta.type.type, meta.typeArgumentCount),
        ctorDepsType,
    ]));
}
function injectDependencies(deps, target) {
    return deps.map((dep, index) => compileInjectDependency(dep, target, index));
}
function compileInjectDependency(dep, target, index) {
    // Interpret the dependency according to its resolved type.
    if (dep.token === null) {
        return importExpr(Identifiers.invalidFactoryDep).callFn([literal$1(index)]);
    }
    else if (dep.attributeNameType === null) {
        // Build up the injection flags according to the metadata.
        const flags = 0 /* InjectFlags.Default */ |
            (dep.self ? 2 /* InjectFlags.Self */ : 0) |
            (dep.skipSelf ? 4 /* InjectFlags.SkipSelf */ : 0) |
            (dep.host ? 1 /* InjectFlags.Host */ : 0) |
            (dep.optional ? 8 /* InjectFlags.Optional */ : 0) |
            (target === exports.FactoryTarget.Pipe ? 16 /* InjectFlags.ForPipe */ : 0);
        // If this dependency is optional or otherwise has non-default flags, then additional
        // parameters describing how to inject the dependency must be passed to the inject function
        // that's being used.
        let flagsParam = flags !== 0 /* InjectFlags.Default */ || dep.optional ? literal$1(flags) : null;
        // Build up the arguments to the injectFn call.
        const injectArgs = [dep.token];
        if (flagsParam) {
            injectArgs.push(flagsParam);
        }
        const injectFn = getInjectFn(target);
        return importExpr(injectFn).callFn(injectArgs);
    }
    else {
        // The `dep.attributeTypeName` value is defined, which indicates that this is an `@Attribute()`
        // type dependency. For the generated JS we still want to use the `dep.token` value in case the
        // name given for the attribute is not a string literal. For example given `@Attribute(foo())`,
        // we want to generate `ɵɵinjectAttribute(foo())`.
        //
        // The `dep.attributeTypeName` is only actually used (in `createCtorDepType()`) to generate
        // typings.
        return importExpr(Identifiers.injectAttribute).callFn([dep.token]);
    }
}
function createCtorDepsType(deps) {
    let hasTypes = false;
    const attributeTypes = deps.map((dep) => {
        const type = createCtorDepType(dep);
        if (type !== null) {
            hasTypes = true;
            return type;
        }
        else {
            return literal$1(null);
        }
    });
    if (hasTypes) {
        return expressionType(literalArr(attributeTypes));
    }
    else {
        return NONE_TYPE;
    }
}
function createCtorDepType(dep) {
    const entries = [];
    if (dep.attributeNameType !== null) {
        entries.push({ key: 'attribute', value: dep.attributeNameType, quoted: false });
    }
    if (dep.optional) {
        entries.push({ key: 'optional', value: literal$1(true), quoted: false });
    }
    if (dep.host) {
        entries.push({ key: 'host', value: literal$1(true), quoted: false });
    }
    if (dep.self) {
        entries.push({ key: 'self', value: literal$1(true), quoted: false });
    }
    if (dep.skipSelf) {
        entries.push({ key: 'skipSelf', value: literal$1(true), quoted: false });
    }
    return entries.length > 0 ? literalMap(entries) : null;
}
function isDelegatedFactoryMetadata(meta) {
    return meta.delegateType !== undefined;
}
function isExpressionFactoryMetadata(meta) {
    return meta.expression !== undefined;
}
function getInjectFn(target) {
    switch (target) {
        case exports.FactoryTarget.Component:
        case exports.FactoryTarget.Directive:
        case exports.FactoryTarget.Pipe:
            return Identifiers.directiveInject;
        case exports.FactoryTarget.NgModule:
        case exports.FactoryTarget.Injectable:
        default:
            return Identifiers.inject;
    }
}

class ParserError {
    input;
    errLocation;
    ctxLocation;
    message;
    constructor(message, input, errLocation, ctxLocation) {
        this.input = input;
        this.errLocation = errLocation;
        this.ctxLocation = ctxLocation;
        this.message = `Parser Error: ${message} ${errLocation} [${input}] in ${ctxLocation}`;
    }
}
class ParseSpan {
    start;
    end;
    constructor(start, end) {
        this.start = start;
        this.end = end;
    }
    toAbsolute(absoluteOffset) {
        return new AbsoluteSourceSpan(absoluteOffset + this.start, absoluteOffset + this.end);
    }
}
class AST {
    span;
    sourceSpan;
    constructor(span, 
    /**
     * Absolute location of the expression AST in a source code file.
     */
    sourceSpan) {
        this.span = span;
        this.sourceSpan = sourceSpan;
    }
    toString() {
        return 'AST';
    }
}
class ASTWithName extends AST {
    nameSpan;
    constructor(span, sourceSpan, nameSpan) {
        super(span, sourceSpan);
        this.nameSpan = nameSpan;
    }
}
let EmptyExpr$1 = class EmptyExpr extends AST {
    visit(visitor, context = null) {
        // do nothing
    }
};
class ImplicitReceiver extends AST {
    visit(visitor, context = null) {
        return visitor.visitImplicitReceiver(this, context);
    }
}
/**
 * Receiver when something is accessed through `this` (e.g. `this.foo`). Note that this class
 * inherits from `ImplicitReceiver`, because accessing something through `this` is treated the
 * same as accessing it implicitly inside of an Angular template (e.g. `[attr.title]="this.title"`
 * is the same as `[attr.title]="title"`.). Inheriting allows for the `this` accesses to be treated
 * the same as implicit ones, except for a couple of exceptions like `$event` and `$any`.
 * TODO: we should find a way for this class not to extend from `ImplicitReceiver` in the future.
 */
class ThisReceiver extends ImplicitReceiver {
    visit(visitor, context = null) {
        return visitor.visitThisReceiver?.(this, context);
    }
}
/**
 * Multiple expressions separated by a semicolon.
 */
class Chain extends AST {
    expressions;
    constructor(span, sourceSpan, expressions) {
        super(span, sourceSpan);
        this.expressions = expressions;
    }
    visit(visitor, context = null) {
        return visitor.visitChain(this, context);
    }
}
class Conditional extends AST {
    condition;
    trueExp;
    falseExp;
    constructor(span, sourceSpan, condition, trueExp, falseExp) {
        super(span, sourceSpan);
        this.condition = condition;
        this.trueExp = trueExp;
        this.falseExp = falseExp;
    }
    visit(visitor, context = null) {
        return visitor.visitConditional(this, context);
    }
}
class PropertyRead extends ASTWithName {
    receiver;
    name;
    constructor(span, sourceSpan, nameSpan, receiver, name) {
        super(span, sourceSpan, nameSpan);
        this.receiver = receiver;
        this.name = name;
    }
    visit(visitor, context = null) {
        return visitor.visitPropertyRead(this, context);
    }
}
class PropertyWrite extends ASTWithName {
    receiver;
    name;
    value;
    constructor(span, sourceSpan, nameSpan, receiver, name, value) {
        super(span, sourceSpan, nameSpan);
        this.receiver = receiver;
        this.name = name;
        this.value = value;
    }
    visit(visitor, context = null) {
        return visitor.visitPropertyWrite(this, context);
    }
}
class SafePropertyRead extends ASTWithName {
    receiver;
    name;
    constructor(span, sourceSpan, nameSpan, receiver, name) {
        super(span, sourceSpan, nameSpan);
        this.receiver = receiver;
        this.name = name;
    }
    visit(visitor, context = null) {
        return visitor.visitSafePropertyRead(this, context);
    }
}
class KeyedRead extends AST {
    receiver;
    key;
    constructor(span, sourceSpan, receiver, key) {
        super(span, sourceSpan);
        this.receiver = receiver;
        this.key = key;
    }
    visit(visitor, context = null) {
        return visitor.visitKeyedRead(this, context);
    }
}
class SafeKeyedRead extends AST {
    receiver;
    key;
    constructor(span, sourceSpan, receiver, key) {
        super(span, sourceSpan);
        this.receiver = receiver;
        this.key = key;
    }
    visit(visitor, context = null) {
        return visitor.visitSafeKeyedRead(this, context);
    }
}
class KeyedWrite extends AST {
    receiver;
    key;
    value;
    constructor(span, sourceSpan, receiver, key, value) {
        super(span, sourceSpan);
        this.receiver = receiver;
        this.key = key;
        this.value = value;
    }
    visit(visitor, context = null) {
        return visitor.visitKeyedWrite(this, context);
    }
}
class BindingPipe extends ASTWithName {
    exp;
    name;
    args;
    constructor(span, sourceSpan, exp, name, args, nameSpan) {
        super(span, sourceSpan, nameSpan);
        this.exp = exp;
        this.name = name;
        this.args = args;
    }
    visit(visitor, context = null) {
        return visitor.visitPipe(this, context);
    }
}
class LiteralPrimitive extends AST {
    value;
    constructor(span, sourceSpan, value) {
        super(span, sourceSpan);
        this.value = value;
    }
    visit(visitor, context = null) {
        return visitor.visitLiteralPrimitive(this, context);
    }
}
class LiteralArray extends AST {
    expressions;
    constructor(span, sourceSpan, expressions) {
        super(span, sourceSpan);
        this.expressions = expressions;
    }
    visit(visitor, context = null) {
        return visitor.visitLiteralArray(this, context);
    }
}
class LiteralMap extends AST {
    keys;
    values;
    constructor(span, sourceSpan, keys, values) {
        super(span, sourceSpan);
        this.keys = keys;
        this.values = values;
    }
    visit(visitor, context = null) {
        return visitor.visitLiteralMap(this, context);
    }
}
let Interpolation$1 = class Interpolation extends AST {
    strings;
    expressions;
    constructor(span, sourceSpan, strings, expressions) {
        super(span, sourceSpan);
        this.strings = strings;
        this.expressions = expressions;
    }
    visit(visitor, context = null) {
        return visitor.visitInterpolation(this, context);
    }
};
class Binary extends AST {
    operation;
    left;
    right;
    constructor(span, sourceSpan, operation, left, right) {
        super(span, sourceSpan);
        this.operation = operation;
        this.left = left;
        this.right = right;
    }
    visit(visitor, context = null) {
        return visitor.visitBinary(this, context);
    }
}
/**
 * For backwards compatibility reasons, `Unary` inherits from `Binary` and mimics the binary AST
 * node that was originally used. This inheritance relation can be deleted in some future major,
 * after consumers have been given a chance to fully support Unary.
 */
class Unary extends Binary {
    operator;
    expr;
    // Redeclare the properties that are inherited from `Binary` as `never`, as consumers should not
    // depend on these fields when operating on `Unary`.
    left = null;
    right = null;
    operation = null;
    /**
     * Creates a unary minus expression "-x", represented as `Binary` using "0 - x".
     */
    static createMinus(span, sourceSpan, expr) {
        return new Unary(span, sourceSpan, '-', expr, '-', new LiteralPrimitive(span, sourceSpan, 0), expr);
    }
    /**
     * Creates a unary plus expression "+x", represented as `Binary` using "x - 0".
     */
    static createPlus(span, sourceSpan, expr) {
        return new Unary(span, sourceSpan, '+', expr, '-', expr, new LiteralPrimitive(span, sourceSpan, 0));
    }
    /**
     * During the deprecation period this constructor is private, to avoid consumers from creating
     * a `Unary` with the fallback properties for `Binary`.
     */
    constructor(span, sourceSpan, operator, expr, binaryOp, binaryLeft, binaryRight) {
        super(span, sourceSpan, binaryOp, binaryLeft, binaryRight);
        this.operator = operator;
        this.expr = expr;
    }
    visit(visitor, context = null) {
        if (visitor.visitUnary !== undefined) {
            return visitor.visitUnary(this, context);
        }
        return visitor.visitBinary(this, context);
    }
}
class PrefixNot extends AST {
    expression;
    constructor(span, sourceSpan, expression) {
        super(span, sourceSpan);
        this.expression = expression;
    }
    visit(visitor, context = null) {
        return visitor.visitPrefixNot(this, context);
    }
}
class TypeofExpression extends AST {
    expression;
    constructor(span, sourceSpan, expression) {
        super(span, sourceSpan);
        this.expression = expression;
    }
    visit(visitor, context = null) {
        return visitor.visitTypeofExpression(this, context);
    }
}
class NonNullAssert extends AST {
    expression;
    constructor(span, sourceSpan, expression) {
        super(span, sourceSpan);
        this.expression = expression;
    }
    visit(visitor, context = null) {
        return visitor.visitNonNullAssert(this, context);
    }
}
class Call extends AST {
    receiver;
    args;
    argumentSpan;
    constructor(span, sourceSpan, receiver, args, argumentSpan) {
        super(span, sourceSpan);
        this.receiver = receiver;
        this.args = args;
        this.argumentSpan = argumentSpan;
    }
    visit(visitor, context = null) {
        return visitor.visitCall(this, context);
    }
}
class SafeCall extends AST {
    receiver;
    args;
    argumentSpan;
    constructor(span, sourceSpan, receiver, args, argumentSpan) {
        super(span, sourceSpan);
        this.receiver = receiver;
        this.args = args;
        this.argumentSpan = argumentSpan;
    }
    visit(visitor, context = null) {
        return visitor.visitSafeCall(this, context);
    }
}
class TemplateLiteral extends AST {
    elements;
    expressions;
    constructor(span, sourceSpan, elements, expressions) {
        super(span, sourceSpan);
        this.elements = elements;
        this.expressions = expressions;
    }
    visit(visitor, context) {
        return visitor.visitTemplateLiteral(this, context);
    }
}
class TemplateLiteralElement extends AST {
    text;
    constructor(span, sourceSpan, text) {
        super(span, sourceSpan);
        this.text = text;
    }
    visit(visitor, context) {
        return visitor.visitTemplateLiteralElement(this, context);
    }
}
/**
 * Records the absolute position of a text span in a source file, where `start` and `end` are the
 * starting and ending byte offsets, respectively, of the text span in a source file.
 */
class AbsoluteSourceSpan {
    start;
    end;
    constructor(start, end) {
        this.start = start;
        this.end = end;
    }
}
class ASTWithSource extends AST {
    ast;
    source;
    location;
    errors;
    constructor(ast, source, location, absoluteOffset, errors) {
        super(new ParseSpan(0, source === null ? 0 : source.length), new AbsoluteSourceSpan(absoluteOffset, source === null ? absoluteOffset : absoluteOffset + source.length));
        this.ast = ast;
        this.source = source;
        this.location = location;
        this.errors = errors;
    }
    visit(visitor, context = null) {
        if (visitor.visitASTWithSource) {
            return visitor.visitASTWithSource(this, context);
        }
        return this.ast.visit(visitor, context);
    }
    toString() {
        return `${this.source} in ${this.location}`;
    }
}
class VariableBinding {
    sourceSpan;
    key;
    value;
    /**
     * @param sourceSpan entire span of the binding.
     * @param key name of the LHS along with its span.
     * @param value optional value for the RHS along with its span.
     */
    constructor(sourceSpan, key, value) {
        this.sourceSpan = sourceSpan;
        this.key = key;
        this.value = value;
    }
}
class ExpressionBinding {
    sourceSpan;
    key;
    value;
    /**
     * @param sourceSpan entire span of the binding.
     * @param key binding name, like ngForOf, ngForTrackBy, ngIf, along with its
     * span. Note that the length of the span may not be the same as
     * `key.source.length`. For example,
     * 1. key.source = ngFor, key.span is for "ngFor"
     * 2. key.source = ngForOf, key.span is for "of"
     * 3. key.source = ngForTrackBy, key.span is for "trackBy"
     * @param value optional expression for the RHS.
     */
    constructor(sourceSpan, key, value) {
        this.sourceSpan = sourceSpan;
        this.key = key;
        this.value = value;
    }
}
class RecursiveAstVisitor {
    visit(ast, context) {
        // The default implementation just visits every node.
        // Classes that extend RecursiveAstVisitor should override this function
        // to selectively visit the specified node.
        ast.visit(this, context);
    }
    visitUnary(ast, context) {
        this.visit(ast.expr, context);
    }
    visitBinary(ast, context) {
        this.visit(ast.left, context);
        this.visit(ast.right, context);
    }
    visitChain(ast, context) {
        this.visitAll(ast.expressions, context);
    }
    visitConditional(ast, context) {
        this.visit(ast.condition, context);
        this.visit(ast.trueExp, context);
        this.visit(ast.falseExp, context);
    }
    visitPipe(ast, context) {
        this.visit(ast.exp, context);
        this.visitAll(ast.args, context);
    }
    visitImplicitReceiver(ast, context) { }
    visitThisReceiver(ast, context) { }
    visitInterpolation(ast, context) {
        this.visitAll(ast.expressions, context);
    }
    visitKeyedRead(ast, context) {
        this.visit(ast.receiver, context);
        this.visit(ast.key, context);
    }
    visitKeyedWrite(ast, context) {
        this.visit(ast.receiver, context);
        this.visit(ast.key, context);
        this.visit(ast.value, context);
    }
    visitLiteralArray(ast, context) {
        this.visitAll(ast.expressions, context);
    }
    visitLiteralMap(ast, context) {
        this.visitAll(ast.values, context);
    }
    visitLiteralPrimitive(ast, context) { }
    visitPrefixNot(ast, context) {
        this.visit(ast.expression, context);
    }
    visitTypeofExpression(ast, context) {
        this.visit(ast.expression, context);
    }
    visitNonNullAssert(ast, context) {
        this.visit(ast.expression, context);
    }
    visitPropertyRead(ast, context) {
        this.visit(ast.receiver, context);
    }
    visitPropertyWrite(ast, context) {
        this.visit(ast.receiver, context);
        this.visit(ast.value, context);
    }
    visitSafePropertyRead(ast, context) {
        this.visit(ast.receiver, context);
    }
    visitSafeKeyedRead(ast, context) {
        this.visit(ast.receiver, context);
        this.visit(ast.key, context);
    }
    visitCall(ast, context) {
        this.visit(ast.receiver, context);
        this.visitAll(ast.args, context);
    }
    visitSafeCall(ast, context) {
        this.visit(ast.receiver, context);
        this.visitAll(ast.args, context);
    }
    visitTemplateLiteral(ast, context) {
        // Iterate in the declaration order. Note that there will
        // always be one expression less than the number of elements.
        for (let i = 0; i < ast.elements.length; i++) {
            this.visit(ast.elements[i], context);
            const expression = i < ast.expressions.length ? ast.expressions[i] : null;
            if (expression !== null) {
                this.visit(expression, context);
            }
        }
    }
    visitTemplateLiteralElement(ast, context) { }
    // This is not part of the AstVisitor interface, just a helper method
    visitAll(asts, context) {
        for (const ast of asts) {
            this.visit(ast, context);
        }
    }
}
// Bindings
class ParsedProperty {
    name;
    expression;
    type;
    sourceSpan;
    keySpan;
    valueSpan;
    isLiteral;
    isAnimation;
    constructor(name, expression, type, sourceSpan, keySpan, valueSpan) {
        this.name = name;
        this.expression = expression;
        this.type = type;
        this.sourceSpan = sourceSpan;
        this.keySpan = keySpan;
        this.valueSpan = valueSpan;
        this.isLiteral = this.type === ParsedPropertyType.LITERAL_ATTR;
        this.isAnimation = this.type === ParsedPropertyType.ANIMATION;
    }
}
var ParsedPropertyType;
(function (ParsedPropertyType) {
    ParsedPropertyType[ParsedPropertyType["DEFAULT"] = 0] = "DEFAULT";
    ParsedPropertyType[ParsedPropertyType["LITERAL_ATTR"] = 1] = "LITERAL_ATTR";
    ParsedPropertyType[ParsedPropertyType["ANIMATION"] = 2] = "ANIMATION";
    ParsedPropertyType[ParsedPropertyType["TWO_WAY"] = 3] = "TWO_WAY";
})(ParsedPropertyType || (ParsedPropertyType = {}));
exports.ParsedEventType = void 0;
(function (ParsedEventType) {
    // DOM or Directive event
    ParsedEventType[ParsedEventType["Regular"] = 0] = "Regular";
    // Animation specific event
    ParsedEventType[ParsedEventType["Animation"] = 1] = "Animation";
    // Event side of a two-way binding (e.g. `[(property)]="expression"`).
    ParsedEventType[ParsedEventType["TwoWay"] = 2] = "TwoWay";
})(exports.ParsedEventType || (exports.ParsedEventType = {}));
class ParsedEvent {
    name;
    targetOrPhase;
    type;
    handler;
    sourceSpan;
    handlerSpan;
    keySpan;
    constructor(name, targetOrPhase, type, handler, sourceSpan, handlerSpan, keySpan) {
        this.name = name;
        this.targetOrPhase = targetOrPhase;
        this.type = type;
        this.handler = handler;
        this.sourceSpan = sourceSpan;
        this.handlerSpan = handlerSpan;
        this.keySpan = keySpan;
    }
}
/**
 * ParsedVariable represents a variable declaration in a microsyntax expression.
 */
class ParsedVariable {
    name;
    value;
    sourceSpan;
    keySpan;
    valueSpan;
    constructor(name, value, sourceSpan, keySpan, valueSpan) {
        this.name = name;
        this.value = value;
        this.sourceSpan = sourceSpan;
        this.keySpan = keySpan;
        this.valueSpan = valueSpan;
    }
}
exports.BindingType = void 0;
(function (BindingType) {
    // A regular binding to a property (e.g. `[property]="expression"`).
    BindingType[BindingType["Property"] = 0] = "Property";
    // A binding to an element attribute (e.g. `[attr.name]="expression"`).
    BindingType[BindingType["Attribute"] = 1] = "Attribute";
    // A binding to a CSS class (e.g. `[class.name]="condition"`).
    BindingType[BindingType["Class"] = 2] = "Class";
    // A binding to a style rule (e.g. `[style.rule]="expression"`).
    BindingType[BindingType["Style"] = 3] = "Style";
    // A binding to an animation reference (e.g. `[animate.key]="expression"`).
    BindingType[BindingType["Animation"] = 4] = "Animation";
    // Property side of a two-way binding (e.g. `[(property)]="expression"`).
    BindingType[BindingType["TwoWay"] = 5] = "TwoWay";
})(exports.BindingType || (exports.BindingType = {}));
class BoundElementProperty {
    name;
    type;
    securityContext;
    value;
    unit;
    sourceSpan;
    keySpan;
    valueSpan;
    constructor(name, type, securityContext, value, unit, sourceSpan, keySpan, valueSpan) {
        this.name = name;
        this.type = type;
        this.securityContext = securityContext;
        this.value = value;
        this.unit = unit;
        this.sourceSpan = sourceSpan;
        this.keySpan = keySpan;
        this.valueSpan = valueSpan;
    }
}

exports.TagContentType = void 0;
(function (TagContentType) {
    TagContentType[TagContentType["RAW_TEXT"] = 0] = "RAW_TEXT";
    TagContentType[TagContentType["ESCAPABLE_RAW_TEXT"] = 1] = "ESCAPABLE_RAW_TEXT";
    TagContentType[TagContentType["PARSABLE_DATA"] = 2] = "PARSABLE_DATA";
})(exports.TagContentType || (exports.TagContentType = {}));
function splitNsName(elementName, fatal = true) {
    if (elementName[0] != ':') {
        return [null, elementName];
    }
    const colonIndex = elementName.indexOf(':', 1);
    if (colonIndex === -1) {
        if (fatal) {
            throw new Error(`Unsupported format "${elementName}" expecting ":namespace:name"`);
        }
        else {
            return [null, elementName];
        }
    }
    return [elementName.slice(1, colonIndex), elementName.slice(colonIndex + 1)];
}
// `<ng-container>` tags work the same regardless the namespace
function isNgContainer(tagName) {
    return splitNsName(tagName)[1] === 'ng-container';
}
// `<ng-content>` tags work the same regardless the namespace
function isNgContent(tagName) {
    return splitNsName(tagName)[1] === 'ng-content';
}
// `<ng-template>` tags work the same regardless the namespace
function isNgTemplate(tagName) {
    return splitNsName(tagName)[1] === 'ng-template';
}
function getNsPrefix(fullName) {
    return fullName === null ? null : splitNsName(fullName)[0];
}
function mergeNsAndName(prefix, localName) {
    return prefix ? `:${prefix}:${localName}` : localName;
}

/**
 * This is an R3 `Node`-like wrapper for a raw `html.Comment` node. We do not currently
 * require the implementation of a visitor for Comments as they are only collected at
 * the top-level of the R3 AST, and only if `Render3ParseOptions['collectCommentNodes']`
 * is true.
 */
let Comment$1 = class Comment {
    value;
    sourceSpan;
    constructor(value, sourceSpan) {
        this.value = value;
        this.sourceSpan = sourceSpan;
    }
    visit(_visitor) {
        throw new Error('visit() not implemented for Comment');
    }
};
let Text$3 = class Text {
    value;
    sourceSpan;
    constructor(value, sourceSpan) {
        this.value = value;
        this.sourceSpan = sourceSpan;
    }
    visit(visitor) {
        return visitor.visitText(this);
    }
};
class BoundText {
    value;
    sourceSpan;
    i18n;
    constructor(value, sourceSpan, i18n) {
        this.value = value;
        this.sourceSpan = sourceSpan;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitBoundText(this);
    }
}
/**
 * Represents a text attribute in the template.
 *
 * `valueSpan` may not be present in cases where there is no value `<div a></div>`.
 * `keySpan` may also not be present for synthetic attributes from ICU expansions.
 */
class TextAttribute {
    name;
    value;
    sourceSpan;
    keySpan;
    valueSpan;
    i18n;
    constructor(name, value, sourceSpan, keySpan, valueSpan, i18n) {
        this.name = name;
        this.value = value;
        this.sourceSpan = sourceSpan;
        this.keySpan = keySpan;
        this.valueSpan = valueSpan;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitTextAttribute(this);
    }
}
class BoundAttribute {
    name;
    type;
    securityContext;
    value;
    unit;
    sourceSpan;
    keySpan;
    valueSpan;
    i18n;
    constructor(name, type, securityContext, value, unit, sourceSpan, keySpan, valueSpan, i18n) {
        this.name = name;
        this.type = type;
        this.securityContext = securityContext;
        this.value = value;
        this.unit = unit;
        this.sourceSpan = sourceSpan;
        this.keySpan = keySpan;
        this.valueSpan = valueSpan;
        this.i18n = i18n;
    }
    static fromBoundElementProperty(prop, i18n) {
        if (prop.keySpan === undefined) {
            throw new Error(`Unexpected state: keySpan must be defined for bound attributes but was not for ${prop.name}: ${prop.sourceSpan}`);
        }
        return new BoundAttribute(prop.name, prop.type, prop.securityContext, prop.value, prop.unit, prop.sourceSpan, prop.keySpan, prop.valueSpan, i18n);
    }
    visit(visitor) {
        return visitor.visitBoundAttribute(this);
    }
}
class BoundEvent {
    name;
    type;
    handler;
    target;
    phase;
    sourceSpan;
    handlerSpan;
    keySpan;
    constructor(name, type, handler, target, phase, sourceSpan, handlerSpan, keySpan) {
        this.name = name;
        this.type = type;
        this.handler = handler;
        this.target = target;
        this.phase = phase;
        this.sourceSpan = sourceSpan;
        this.handlerSpan = handlerSpan;
        this.keySpan = keySpan;
    }
    static fromParsedEvent(event) {
        const target = event.type === exports.ParsedEventType.Regular ? event.targetOrPhase : null;
        const phase = event.type === exports.ParsedEventType.Animation ? event.targetOrPhase : null;
        if (event.keySpan === undefined) {
            throw new Error(`Unexpected state: keySpan must be defined for bound event but was not for ${event.name}: ${event.sourceSpan}`);
        }
        return new BoundEvent(event.name, event.type, event.handler, target, phase, event.sourceSpan, event.handlerSpan, event.keySpan);
    }
    visit(visitor) {
        return visitor.visitBoundEvent(this);
    }
}
let Element$1 = class Element {
    name;
    attributes;
    inputs;
    outputs;
    children;
    references;
    sourceSpan;
    startSourceSpan;
    endSourceSpan;
    i18n;
    constructor(name, attributes, inputs, outputs, children, references, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
        this.name = name;
        this.attributes = attributes;
        this.inputs = inputs;
        this.outputs = outputs;
        this.children = children;
        this.references = references;
        this.sourceSpan = sourceSpan;
        this.startSourceSpan = startSourceSpan;
        this.endSourceSpan = endSourceSpan;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitElement(this);
    }
};
class DeferredTrigger {
    nameSpan;
    sourceSpan;
    prefetchSpan;
    whenOrOnSourceSpan;
    hydrateSpan;
    constructor(nameSpan, sourceSpan, prefetchSpan, whenOrOnSourceSpan, hydrateSpan) {
        this.nameSpan = nameSpan;
        this.sourceSpan = sourceSpan;
        this.prefetchSpan = prefetchSpan;
        this.whenOrOnSourceSpan = whenOrOnSourceSpan;
        this.hydrateSpan = hydrateSpan;
    }
    visit(visitor) {
        return visitor.visitDeferredTrigger(this);
    }
}
class BoundDeferredTrigger extends DeferredTrigger {
    value;
    constructor(value, sourceSpan, prefetchSpan, whenSourceSpan, hydrateSpan) {
        // BoundDeferredTrigger is for 'when' triggers. These aren't really "triggers" and don't have a
        // nameSpan. Trigger names are the built in event triggers like hover, interaction, etc.
        super(/** nameSpan */ null, sourceSpan, prefetchSpan, whenSourceSpan, hydrateSpan);
        this.value = value;
    }
}
class NeverDeferredTrigger extends DeferredTrigger {
}
class IdleDeferredTrigger extends DeferredTrigger {
}
class ImmediateDeferredTrigger extends DeferredTrigger {
}
class HoverDeferredTrigger extends DeferredTrigger {
    reference;
    constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
        super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
        this.reference = reference;
    }
}
class TimerDeferredTrigger extends DeferredTrigger {
    delay;
    constructor(delay, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
        super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
        this.delay = delay;
    }
}
class InteractionDeferredTrigger extends DeferredTrigger {
    reference;
    constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
        super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
        this.reference = reference;
    }
}
class ViewportDeferredTrigger extends DeferredTrigger {
    reference;
    constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
        super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
        this.reference = reference;
    }
}
class BlockNode {
    nameSpan;
    sourceSpan;
    startSourceSpan;
    endSourceSpan;
    constructor(nameSpan, sourceSpan, startSourceSpan, endSourceSpan) {
        this.nameSpan = nameSpan;
        this.sourceSpan = sourceSpan;
        this.startSourceSpan = startSourceSpan;
        this.endSourceSpan = endSourceSpan;
    }
}
class DeferredBlockPlaceholder extends BlockNode {
    children;
    minimumTime;
    i18n;
    constructor(children, minimumTime, nameSpan, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.children = children;
        this.minimumTime = minimumTime;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitDeferredBlockPlaceholder(this);
    }
}
class DeferredBlockLoading extends BlockNode {
    children;
    afterTime;
    minimumTime;
    i18n;
    constructor(children, afterTime, minimumTime, nameSpan, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.children = children;
        this.afterTime = afterTime;
        this.minimumTime = minimumTime;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitDeferredBlockLoading(this);
    }
}
class DeferredBlockError extends BlockNode {
    children;
    i18n;
    constructor(children, nameSpan, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.children = children;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitDeferredBlockError(this);
    }
}
class DeferredBlock extends BlockNode {
    children;
    placeholder;
    loading;
    error;
    mainBlockSpan;
    i18n;
    triggers;
    prefetchTriggers;
    hydrateTriggers;
    definedTriggers;
    definedPrefetchTriggers;
    definedHydrateTriggers;
    constructor(children, triggers, prefetchTriggers, hydrateTriggers, placeholder, loading, error, nameSpan, sourceSpan, mainBlockSpan, startSourceSpan, endSourceSpan, i18n) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.children = children;
        this.placeholder = placeholder;
        this.loading = loading;
        this.error = error;
        this.mainBlockSpan = mainBlockSpan;
        this.i18n = i18n;
        this.triggers = triggers;
        this.prefetchTriggers = prefetchTriggers;
        this.hydrateTriggers = hydrateTriggers;
        // We cache the keys since we know that they won't change and we
        // don't want to enumarate them every time we're traversing the AST.
        this.definedTriggers = Object.keys(triggers);
        this.definedPrefetchTriggers = Object.keys(prefetchTriggers);
        this.definedHydrateTriggers = Object.keys(hydrateTriggers);
    }
    visit(visitor) {
        return visitor.visitDeferredBlock(this);
    }
    visitAll(visitor) {
        // Visit the hydrate triggers first to match their insertion order.
        this.visitTriggers(this.definedHydrateTriggers, this.hydrateTriggers, visitor);
        this.visitTriggers(this.definedTriggers, this.triggers, visitor);
        this.visitTriggers(this.definedPrefetchTriggers, this.prefetchTriggers, visitor);
        visitAll$1(visitor, this.children);
        const remainingBlocks = [this.placeholder, this.loading, this.error].filter((x) => x !== null);
        visitAll$1(visitor, remainingBlocks);
    }
    visitTriggers(keys, triggers, visitor) {
        visitAll$1(visitor, keys.map((k) => triggers[k]));
    }
}
class SwitchBlock extends BlockNode {
    expression;
    cases;
    unknownBlocks;
    constructor(expression, cases, 
    /**
     * These blocks are only captured to allow for autocompletion in the language service. They
     * aren't meant to be processed in any other way.
     */
    unknownBlocks, sourceSpan, startSourceSpan, endSourceSpan, nameSpan) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.expression = expression;
        this.cases = cases;
        this.unknownBlocks = unknownBlocks;
    }
    visit(visitor) {
        return visitor.visitSwitchBlock(this);
    }
}
class SwitchBlockCase extends BlockNode {
    expression;
    children;
    i18n;
    constructor(expression, children, sourceSpan, startSourceSpan, endSourceSpan, nameSpan, i18n) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.expression = expression;
        this.children = children;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitSwitchBlockCase(this);
    }
}
class ForLoopBlock extends BlockNode {
    item;
    expression;
    trackBy;
    trackKeywordSpan;
    contextVariables;
    children;
    empty;
    mainBlockSpan;
    i18n;
    constructor(item, expression, trackBy, trackKeywordSpan, contextVariables, children, empty, sourceSpan, mainBlockSpan, startSourceSpan, endSourceSpan, nameSpan, i18n) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.item = item;
        this.expression = expression;
        this.trackBy = trackBy;
        this.trackKeywordSpan = trackKeywordSpan;
        this.contextVariables = contextVariables;
        this.children = children;
        this.empty = empty;
        this.mainBlockSpan = mainBlockSpan;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitForLoopBlock(this);
    }
}
class ForLoopBlockEmpty extends BlockNode {
    children;
    i18n;
    constructor(children, sourceSpan, startSourceSpan, endSourceSpan, nameSpan, i18n) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.children = children;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitForLoopBlockEmpty(this);
    }
}
class IfBlock extends BlockNode {
    branches;
    constructor(branches, sourceSpan, startSourceSpan, endSourceSpan, nameSpan) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.branches = branches;
    }
    visit(visitor) {
        return visitor.visitIfBlock(this);
    }
}
class IfBlockBranch extends BlockNode {
    expression;
    children;
    expressionAlias;
    i18n;
    constructor(expression, children, expressionAlias, sourceSpan, startSourceSpan, endSourceSpan, nameSpan, i18n) {
        super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
        this.expression = expression;
        this.children = children;
        this.expressionAlias = expressionAlias;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitIfBlockBranch(this);
    }
}
class UnknownBlock {
    name;
    sourceSpan;
    nameSpan;
    constructor(name, sourceSpan, nameSpan) {
        this.name = name;
        this.sourceSpan = sourceSpan;
        this.nameSpan = nameSpan;
    }
    visit(visitor) {
        return visitor.visitUnknownBlock(this);
    }
}
let LetDeclaration$1 = class LetDeclaration {
    name;
    value;
    sourceSpan;
    nameSpan;
    valueSpan;
    constructor(name, value, sourceSpan, nameSpan, valueSpan) {
        this.name = name;
        this.value = value;
        this.sourceSpan = sourceSpan;
        this.nameSpan = nameSpan;
        this.valueSpan = valueSpan;
    }
    visit(visitor) {
        return visitor.visitLetDeclaration(this);
    }
};
class Template {
    tagName;
    attributes;
    inputs;
    outputs;
    templateAttrs;
    children;
    references;
    variables;
    sourceSpan;
    startSourceSpan;
    endSourceSpan;
    i18n;
    constructor(
    // tagName is the name of the container element, if applicable.
    // `null` is a special case for when there is a structural directive on an `ng-template` so
    // the renderer can differentiate between the synthetic template and the one written in the
    // file.
    tagName, attributes, inputs, outputs, templateAttrs, children, references, variables, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
        this.tagName = tagName;
        this.attributes = attributes;
        this.inputs = inputs;
        this.outputs = outputs;
        this.templateAttrs = templateAttrs;
        this.children = children;
        this.references = references;
        this.variables = variables;
        this.sourceSpan = sourceSpan;
        this.startSourceSpan = startSourceSpan;
        this.endSourceSpan = endSourceSpan;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitTemplate(this);
    }
}
class Content {
    selector;
    attributes;
    children;
    sourceSpan;
    i18n;
    name = 'ng-content';
    constructor(selector, attributes, children, sourceSpan, i18n) {
        this.selector = selector;
        this.attributes = attributes;
        this.children = children;
        this.sourceSpan = sourceSpan;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitContent(this);
    }
}
class Variable {
    name;
    value;
    sourceSpan;
    keySpan;
    valueSpan;
    constructor(name, value, sourceSpan, keySpan, valueSpan) {
        this.name = name;
        this.value = value;
        this.sourceSpan = sourceSpan;
        this.keySpan = keySpan;
        this.valueSpan = valueSpan;
    }
    visit(visitor) {
        return visitor.visitVariable(this);
    }
}
let Reference$1 = class Reference {
    name;
    value;
    sourceSpan;
    keySpan;
    valueSpan;
    constructor(name, value, sourceSpan, keySpan, valueSpan) {
        this.name = name;
        this.value = value;
        this.sourceSpan = sourceSpan;
        this.keySpan = keySpan;
        this.valueSpan = valueSpan;
    }
    visit(visitor) {
        return visitor.visitReference(this);
    }
};
let Icu$1 = class Icu {
    vars;
    placeholders;
    sourceSpan;
    i18n;
    constructor(vars, placeholders, sourceSpan, i18n) {
        this.vars = vars;
        this.placeholders = placeholders;
        this.sourceSpan = sourceSpan;
        this.i18n = i18n;
    }
    visit(visitor) {
        return visitor.visitIcu(this);
    }
};
let RecursiveVisitor$1 = class RecursiveVisitor {
    visitElement(element) {
        visitAll$1(this, element.attributes);
        visitAll$1(this, element.inputs);
        visitAll$1(this, element.outputs);
        visitAll$1(this, element.children);
        visitAll$1(this, element.references);
    }
    visitTemplate(template) {
        visitAll$1(this, template.attributes);
        visitAll$1(this, template.inputs);
        visitAll$1(this, template.outputs);
        visitAll$1(this, template.children);
        visitAll$1(this, template.references);
        visitAll$1(this, template.variables);
    }
    visitDeferredBlock(deferred) {
        deferred.visitAll(this);
    }
    visitDeferredBlockPlaceholder(block) {
        visitAll$1(this, block.children);
    }
    visitDeferredBlockError(block) {
        visitAll$1(this, block.children);
    }
    visitDeferredBlockLoading(block) {
        visitAll$1(this, block.children);
    }
    visitSwitchBlock(block) {
        visitAll$1(this, block.cases);
    }
    visitSwitchBlockCase(block) {
        visitAll$1(this, block.children);
    }
    visitForLoopBlock(block) {
        const blockItems = [block.item, ...block.contextVariables, ...block.children];
        block.empty && blockItems.push(block.empty);
        visitAll$1(this, blockItems);
    }
    visitForLoopBlockEmpty(block) {
        visitAll$1(this, block.children);
    }
    visitIfBlock(block) {
        visitAll$1(this, block.branches);
    }
    visitIfBlockBranch(block) {
        const blockItems = block.children;
        block.expressionAlias && blockItems.push(block.expressionAlias);
        visitAll$1(this, blockItems);
    }
    visitContent(content) {
        visitAll$1(this, content.children);
    }
    visitVariable(variable) { }
    visitReference(reference) { }
    visitTextAttribute(attribute) { }
    visitBoundAttribute(attribute) { }
    visitBoundEvent(attribute) { }
    visitText(text) { }
    visitBoundText(text) { }
    visitIcu(icu) { }
    visitDeferredTrigger(trigger) { }
    visitUnknownBlock(block) { }
    visitLetDeclaration(decl) { }
};
function visitAll$1(visitor, nodes) {
    const result = [];
    if (visitor.visit) {
        for (const node of nodes) {
            visitor.visit(node) || node.visit(visitor);
        }
    }
    else {
        for (const node of nodes) {
            const newNode = node.visit(visitor);
            if (newNode) {
                result.push(newNode);
            }
        }
    }
    return result;
}

class Message {
    nodes;
    placeholders;
    placeholderToMessage;
    meaning;
    description;
    customId;
    sources;
    id;
    /** The ids to use if there are no custom id and if `i18nLegacyMessageIdFormat` is not empty */
    legacyIds = [];
    messageString;
    /**
     * @param nodes message AST
     * @param placeholders maps placeholder names to static content and their source spans
     * @param placeholderToMessage maps placeholder names to messages (used for nested ICU messages)
     * @param meaning
     * @param description
     * @param customId
     */
    constructor(nodes, placeholders, placeholderToMessage, meaning, description, customId) {
        this.nodes = nodes;
        this.placeholders = placeholders;
        this.placeholderToMessage = placeholderToMessage;
        this.meaning = meaning;
        this.description = description;
        this.customId = customId;
        this.id = this.customId;
        this.messageString = serializeMessage(this.nodes);
        if (nodes.length) {
            this.sources = [
                {
                    filePath: nodes[0].sourceSpan.start.file.url,
                    startLine: nodes[0].sourceSpan.start.line + 1,
                    startCol: nodes[0].sourceSpan.start.col + 1,
                    endLine: nodes[nodes.length - 1].sourceSpan.end.line + 1,
                    endCol: nodes[0].sourceSpan.start.col + 1,
                },
            ];
        }
        else {
            this.sources = [];
        }
    }
}
let Text$2 = class Text {
    value;
    sourceSpan;
    constructor(value, sourceSpan) {
        this.value = value;
        this.sourceSpan = sourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitText(this, context);
    }
};
// TODO(vicb): do we really need this node (vs an array) ?
class Container {
    children;
    sourceSpan;
    constructor(children, sourceSpan) {
        this.children = children;
        this.sourceSpan = sourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitContainer(this, context);
    }
}
class Icu {
    expression;
    type;
    cases;
    sourceSpan;
    expressionPlaceholder;
    constructor(expression, type, cases, sourceSpan, expressionPlaceholder) {
        this.expression = expression;
        this.type = type;
        this.cases = cases;
        this.sourceSpan = sourceSpan;
        this.expressionPlaceholder = expressionPlaceholder;
    }
    visit(visitor, context) {
        return visitor.visitIcu(this, context);
    }
}
class TagPlaceholder {
    tag;
    attrs;
    startName;
    closeName;
    children;
    isVoid;
    sourceSpan;
    startSourceSpan;
    endSourceSpan;
    constructor(tag, attrs, startName, closeName, children, isVoid, 
    // TODO sourceSpan should cover all (we need a startSourceSpan and endSourceSpan)
    sourceSpan, startSourceSpan, endSourceSpan) {
        this.tag = tag;
        this.attrs = attrs;
        this.startName = startName;
        this.closeName = closeName;
        this.children = children;
        this.isVoid = isVoid;
        this.sourceSpan = sourceSpan;
        this.startSourceSpan = startSourceSpan;
        this.endSourceSpan = endSourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitTagPlaceholder(this, context);
    }
}
class Placeholder {
    value;
    name;
    sourceSpan;
    constructor(value, name, sourceSpan) {
        this.value = value;
        this.name = name;
        this.sourceSpan = sourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitPlaceholder(this, context);
    }
}
class IcuPlaceholder {
    value;
    name;
    sourceSpan;
    /** Used to capture a message computed from a previous processing pass (see `setI18nRefs()`). */
    previousMessage;
    constructor(value, name, sourceSpan) {
        this.value = value;
        this.name = name;
        this.sourceSpan = sourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitIcuPlaceholder(this, context);
    }
}
class BlockPlaceholder {
    name;
    parameters;
    startName;
    closeName;
    children;
    sourceSpan;
    startSourceSpan;
    endSourceSpan;
    constructor(name, parameters, startName, closeName, children, sourceSpan, startSourceSpan, endSourceSpan) {
        this.name = name;
        this.parameters = parameters;
        this.startName = startName;
        this.closeName = closeName;
        this.children = children;
        this.sourceSpan = sourceSpan;
        this.startSourceSpan = startSourceSpan;
        this.endSourceSpan = endSourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitBlockPlaceholder(this, context);
    }
}
// Clone the AST
class CloneVisitor {
    visitText(text, context) {
        return new Text$2(text.value, text.sourceSpan);
    }
    visitContainer(container, context) {
        const children = container.children.map((n) => n.visit(this, context));
        return new Container(children, container.sourceSpan);
    }
    visitIcu(icu, context) {
        const cases = {};
        Object.keys(icu.cases).forEach((key) => (cases[key] = icu.cases[key].visit(this, context)));
        const msg = new Icu(icu.expression, icu.type, cases, icu.sourceSpan, icu.expressionPlaceholder);
        return msg;
    }
    visitTagPlaceholder(ph, context) {
        const children = ph.children.map((n) => n.visit(this, context));
        return new TagPlaceholder(ph.tag, ph.attrs, ph.startName, ph.closeName, children, ph.isVoid, ph.sourceSpan, ph.startSourceSpan, ph.endSourceSpan);
    }
    visitPlaceholder(ph, context) {
        return new Placeholder(ph.value, ph.name, ph.sourceSpan);
    }
    visitIcuPlaceholder(ph, context) {
        return new IcuPlaceholder(ph.value, ph.name, ph.sourceSpan);
    }
    visitBlockPlaceholder(ph, context) {
        const children = ph.children.map((n) => n.visit(this, context));
        return new BlockPlaceholder(ph.name, ph.parameters, ph.startName, ph.closeName, children, ph.sourceSpan, ph.startSourceSpan, ph.endSourceSpan);
    }
}
// Visit all the nodes recursively
class RecurseVisitor {
    visitText(text, context) { }
    visitContainer(container, context) {
        container.children.forEach((child) => child.visit(this));
    }
    visitIcu(icu, context) {
        Object.keys(icu.cases).forEach((k) => {
            icu.cases[k].visit(this);
        });
    }
    visitTagPlaceholder(ph, context) {
        ph.children.forEach((child) => child.visit(this));
    }
    visitPlaceholder(ph, context) { }
    visitIcuPlaceholder(ph, context) { }
    visitBlockPlaceholder(ph, context) {
        ph.children.forEach((child) => child.visit(this));
    }
}
/**
 * Serialize the message to the Localize backtick string format that would appear in compiled code.
 */
function serializeMessage(messageNodes) {
    const visitor = new LocalizeMessageStringVisitor();
    const str = messageNodes.map((n) => n.visit(visitor)).join('');
    return str;
}
class LocalizeMessageStringVisitor {
    visitText(text) {
        return text.value;
    }
    visitContainer(container) {
        return container.children.map((child) => child.visit(this)).join('');
    }
    visitIcu(icu) {
        const strCases = Object.keys(icu.cases).map((k) => `${k} {${icu.cases[k].visit(this)}}`);
        return `{${icu.expressionPlaceholder}, ${icu.type}, ${strCases.join(' ')}}`;
    }
    visitTagPlaceholder(ph) {
        const children = ph.children.map((child) => child.visit(this)).join('');
        return `{$${ph.startName}}${children}{$${ph.closeName}}`;
    }
    visitPlaceholder(ph) {
        return `{$${ph.name}}`;
    }
    visitIcuPlaceholder(ph) {
        return `{$${ph.name}}`;
    }
    visitBlockPlaceholder(ph) {
        const children = ph.children.map((child) => child.visit(this)).join('');
        return `{$${ph.startName}}${children}{$${ph.closeName}}`;
    }
}

class Serializer {
    // Creates a name mapper, see `PlaceholderMapper`
    // Returning `null` means that no name mapping is used.
    createNameMapper(message) {
        return null;
    }
}
/**
 * A simple mapper that take a function to transform an internal name to a public name
 */
class SimplePlaceholderMapper extends RecurseVisitor {
    mapName;
    internalToPublic = {};
    publicToNextId = {};
    publicToInternal = {};
    // create a mapping from the message
    constructor(message, mapName) {
        super();
        this.mapName = mapName;
        message.nodes.forEach((node) => node.visit(this));
    }
    toPublicName(internalName) {
        return this.internalToPublic.hasOwnProperty(internalName)
            ? this.internalToPublic[internalName]
            : null;
    }
    toInternalName(publicName) {
        return this.publicToInternal.hasOwnProperty(publicName)
            ? this.publicToInternal[publicName]
            : null;
    }
    visitText(text, context) {
        return null;
    }
    visitTagPlaceholder(ph, context) {
        this.visitPlaceholderName(ph.startName);
        super.visitTagPlaceholder(ph, context);
        this.visitPlaceholderName(ph.closeName);
    }
    visitPlaceholder(ph, context) {
        this.visitPlaceholderName(ph.name);
    }
    visitBlockPlaceholder(ph, context) {
        this.visitPlaceholderName(ph.startName);
        super.visitBlockPla   ceholder(ph, context);
        this.visitPlaceholderName(ph.closeName);
    }
    visitIcuPlaceholder(ph, context) {
        this.visitPlaceholderName(ph.name);
    }
    // XMB placeholders could only contains A-Z, 0-9 and _
    visitPlaceholderName(internalName) {
        if (!internalName || this.internalToPublic.hasOwnProperty(internalName)) {
            return;
        }
        let publicName = this.mapName(internalName);
        if (this.publicToInternal.hasOwnProperty(publicName)) {
            // Create a new XMB when it has already been used
            const nextId = this.publicToNextId[publicName];
            this.publicToNextId[publicName] = nextId + 1;
            publicName = `${publicName}_${nextId}`;
        }
        else {
            this.publicToNextId[publicName] = 1;
        }
        this.internalToPublic[internalName] = publicName;
        this.publicToInternal[publicName] = internalName;
    }
}

let _Visitor$2 = class _Visitor {
    visitTag(tag) {
        const strAttrs = this._serializeAttributes(tag.attrs);
        if (tag.children.length == 0) {
            return `<${tag.name}${strAttrs}/>`;
        }
        const strChildren = tag.children.map((node) => node.visit(this));
        return `<${tag.name}${strAttrs}>${strChildren.join('')}</${tag.name}>`;
    }
    visitText(text) {
        return text.value;
    }
    visitDeclaration(decl) {
        return `<?xml${this._serializeAttributes(decl.attrs)} ?>`;
    }
    _serializeAttributes(attrs) {
        const strAttrs = Object.keys(attrs)
            .map((name) => `${name}="${attrs[name]}"`)
            .join(' ');
        return strAttrs.length > 0 ? ' ' + strAttrs : '';
    }
    visitDoctype(doctype) {
        return `<!DOCTYPE ${doctype.rootTag} [\n${doctype.dtd}\n]>`;
    }
};
const _visitor = new _Visitor$2();
function serialize$1(nodes) {
    return nodes.map((node) => node.visit(_visitor)).join('');
}
class Declaration {
    attrs = {};
    constructor(unescapedAttrs) {
        Object.keys(unescapedAttrs).forEach((k) => {
            this.attrs[k] = escapeXml(unescapedAttrs[k]);
        });
    }
    visit(visitor) {
        return visitor.visitDeclaration(this);
    }
}
class Doctype {
    rootTag;
    dtd;
    constructor(rootTag, dtd) {
        this.rootTag = rootTag;
        this.dtd = dtd;
    }
    visit(visitor) {
        return visitor.visitDoctype(this);
    }
}
class Tag {
    name;
    children;
    attrs = {};
    constructor(name, unescapedAttrs = {}, children = []) {
        this.name = name;
        this.children = children;
        Object.keys(unescapedAttrs).forEach((k) => {
            this.attrs[k] = escapeXml(unescapedAttrs[k]);
        });
    }
    visit(visitor) {
        return visitor.visitTag(this);
    }
}
let Text$1 = class Text {
    value;
    constructor(unescapedValue) {
        this.value = escapeXml(unescapedValue);
    }
    visit(visitor) {
        return visitor.visitText(this);
    }
};
class CR extends Text$1 {
    constructor(ws = 0) {
        super(`\n${new Array(ws + 1).join(' ')}`);
    }
}
const _ESCAPED_CHARS = [
    [/&/g, '&amp;'],
    [/"/g, '&quot;'],
    [/'/g, '&apos;'],
    [/</g, '&lt;'],
    [/>/g, '&gt;'],
];
// Escape `_ESCAPED_CHARS` characters in the given text with encoded entities
function escapeXml(text) {
    return _ESCAPED_CHARS.reduce((text, entry) => text.replace(entry[0], entry[1]), text);
}

/**
 * Defines the `handler` value on the serialized XMB, indicating that Angular
 * generated the bundle. This is useful for analytics in Translation Console.
 *
 * NOTE: Keep in sync with
 * packages/localize/tools/src/extract/translation_files/xmb_translation_serializer.ts.
 */
const _XMB_HANDLER = 'angular';
const _MESSAGES_TAG = 'messagebundle';
const _MESSAGE_TAG = 'msg';
const _PLACEHOLDER_TAG = 'ph';
const _EXAMPLE_TAG = 'ex';
const _SOURCE_TAG = 'source';
const _DOCTYPE = `<!ELEMENT messagebundle (msg)*>
<!ATTLIST messagebundle class CDATA #IMPLIED>

<!ELEMENT msg (#PCDATA|ph|source)*>
<!ATTLIST msg id CDATA #IMPLIED>
<!ATTLIST msg seq CDATA #IMPLIED>
<!ATTLIST msg name CDATA #IMPLIED>
<!ATTLIST msg desc CDATA #IMPLIED>
<!ATTLIST msg meaning CDATA #IMPLIED>
<!ATTLIST msg obsolete (obsolete) #IMPLIED>
<!ATTLIST msg xml:space (default|preserve) "default">
<!ATTLIST msg is_hidden CDATA #IMPLIED>

<!ELEMENT source (#PCDATA)>

<!ELEMENT ph (#PCDATA|ex)*>
<!ATTLIST ph name CDATA #REQUIRED>

<!ELEMENT ex (#PCDATA)>`;
class Xmb extends Serializer {
    write(messages, locale) {
        const exampleVisitor = new ExampleVisitor();
        const visitor = new _Visitor$1();
        const rootNode = new Tag(_MESSAGES_TAG);
        rootNode.attrs['handler'] = _XMB_HANDLER;
        messages.forEach((message) => {
            const attrs = { id: message.id };
            if (message.description) {
                attrs['desc'] = message.description;
            }
            if (message.meaning) {
                attrs['meaning'] = message.meaning;
            }
            let sourceTags = [];
            message.sources.forEach((source) => {
                sourceTags.push(new Tag(_SOURCE_TAG, {}, [
                    new Text$1(`${source.filePath}:${source.startLine}${source.endLine !== source.startLine ? ',' + source.endLine : ''}`),
                ]));
            });
            rootNode.children.push(new CR(2), new Tag(_MESSAGE_TAG, attrs, [...sourceTags, ...visitor.serialize(message.nodes)]));
        });
        rootNode.children.push(new CR());
        return serialize$1([
            new Declaration({ version: '1.0', encoding: 'UTF-8' }),
            new CR(),
            new Doctype(_MESSAGES_TAG, _DOCTYPE),
            new CR(),
            exampleVisitor.addDefaultExamples(rootNode),
            new CR(),
        ]);
    }
    load(content, url) {
        throw new Error('Unsupported');
    }
    digest(message) {
        return digest(message);
    }
    createNameMapper(message) {
        return new SimplePlaceholderMapper(message, toPublicName);
    }
}
let _Visitor$1 = class _Visitor {
    visitText(text, context) {
        return [new Text$1(text.value)];
    }
    visitContainer(container, context) {
        const nodes = [];
        container.children.forEach((node) => nodes.push(...node.visit(this)));
        return nodes;
    }
    visitIcu(icu, context) {
        const nodes = [new Text$1(`{${icu.expressionPlaceholder}, ${icu.type}, `)];
        Object.keys(icu.cases).forEach((c) => {
            nodes.push(new Text$1(`${c} {`), ...icu.cases[c].visit(this), new Text$1(`} `));
        });
        nodes.push(new Text$1(`}`));
        return nodes;
    }
    visitTagPlaceholder(ph, context) {
        const startTagAsText = new Text$1(`<${ph.tag}>`);
        const startEx = new Tag(_EXAMPLE_TAG, {}, [startTagAsText]);
        // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
        const startTagPh = new Tag(_PLACEHOLDER_TAG, { name: ph.startName }, [
            startEx,
            startTagAsText,
        ]);
        if (ph.isVoid) {
            // void tags have no children nor closing tags
            return [startTagPh];
        }
        const closeTagAsText = new Text$1(`</${ph.tag}>`);
        const closeEx = new Tag(_EXAMPLE_TAG, {}, [closeTagAsText]);
        // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
        const closeTagPh = new Tag(_PLACEHOLDER_TAG, { name: ph.closeName }, [
            closeEx,
            closeTagAsText,
        ]);
        return [startTagPh, ...this.serialize(ph.children), closeTagPh];
    }
    visitPlaceholder(ph, context) {
        const interpolationAsText = new Text$1(`{{${ph.value}}}`);
        // Example tag needs to be not-empty for TC.
        const exTag = new Tag(_EXAMPLE_TAG, {}, [interpolationAsText]);
        return [
            // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
            new Tag(_PLACEHOLDER_TAG, { name: ph.name }, [exTag, interpolationAsText]),
        ];
    }
    visitBlockPlaceholder(ph, context) {
        const startAsText = new Text$1(`@${ph.name}`);
        const startEx = new Tag(_EXAMPLE_TAG, {}, [startAsText]);
        // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
        const startTagPh = new Tag(_PLACEHOLDER_TAG, { name: ph.startName }, [startEx, startAsText]);
        const closeAsText = new Text$1(`}`);
        const closeEx = new Tag(_EXAMPLE_TAG, {}, [closeAsText]);
        // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
        const closeTagPh = new Tag(_PLACEHOLDER_TAG, { name: ph.closeName }, [closeEx, closeAsText]);
        return [startTagPh, ...this.serialize(ph.children), closeTagPh];
    }
    visitIcuPlaceholder(ph, context) {
        const icuExpression = ph.value.expression;
        const icuType = ph.value.type;
        const icuCases = Object.keys(ph.value.cases)
            .map((value) => value + ' {...}')
            .join(' ');
        const icuAsText = new Text$1(`{${icuExpression}, ${icuType}, ${icuCases}}`);
        const exTag = new Tag(_EXAMPLE_TAG, {}, [icuAsText]);
        return [
            // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
            new Tag(_PLACEHOLDER_TAG, { name: ph.name }, [exTag, icuAsText]),
        ];
    }
    serialize(nodes) {
        return [].concat(...nodes.map((node) => node.visit(this)));
    }
};
function digest(message) {
    return decimalDigest(message);
}
// TC requires at least one non-empty example on placeholders
class ExampleVisitor {
    addDefaultExamples(node) {
        node.visit(this);
        return node;
    }
    visitTag(tag) {
        if (tag.name === _PLACEHOLDER_TAG) {
            if (!tag.children || tag.children.length == 0) {
                const exText = new Text$1(tag.attrs['name'] || '...');
                tag.children = [new Tag(_EXAMPLE_TAG, {}, [exText])];
            }
        }
        else if (tag.children) {
            tag.children.forEach((node) => node.visit(this));
        }
    }
    visitText(text) { }
    visitDeclaration(decl) { }
    visitDoctype(doctype) { }
}
// XMB/XTB placeholders can only contain A-Z, 0-9 and _
function toPublicName(internalName) {
    return internalName.toUpperCase().replace(/[^A-Z0-9_]/g, '_');
}

/** Name of the i18n attributes **/
const I18N_ATTR = 'i18n';
const I18N_ATTR_PREFIX = 'i18n-';
/** Prefix of var expressions used in ICUs */
const I18N_ICU_VAR_PREFIX = 'VAR_';
function isI18nAttribute(name) {
    return name === I18N_ATTR || name.startsWith(I18N_ATTR_PREFIX);
}
function hasI18nAttrs(element) {
    return element.attrs.some((attr) => isI18nAttribute(attr.name));
}
function icuFromI18nMessage(message) {
    return message.nodes[0];
}
/**
 * Format the placeholder names in a map of placeholders to expressions.
 *
 * The placeholder names are converted from "internal" format (e.g. `START_TAG_DIV_1`) to "external"
 * format (e.g. `startTagDiv_1`).
 *
 * @param params A map of placeholder names to expressions.
 * @param useCamelCase whether to camelCase the placeholder name when formatting.
 * @returns A new map of formatted placeholder names to expressions.
 */
function formatI18nPlaceholderNamesInMap(params = {}, useCamelCase) {
    const _params = {};
    if (params && Object.keys(params).length) {
        Object.keys(params).forEach((key) => (_params[formatI18nPlaceholderName(key, useCamelCase)] = params[key]));
    }
    return _params;
}
/**
 * Converts internal placeholder names to public-facing format
 * (for example to use in goog.getMsg call).
 * Example: `START_TAG_DIV_1` is converted to `startTagDiv_1`.
 *
 * @param name The placeholder name that should be formatted
 * @returns Formatted placeholder name
 */
function formatI18nPlaceholderName(name, useCamelCase = true) {
    const publicName = toPublicName(name);
    if (!useCamelCase) {
        return publicName;
    }
    const chunks = publicName.split('_');
    if (chunks.length === 1) {
        // if no "_" found - just lowercase the value
        return name.toLowerCase();
    }
    let postfix;
    // eject last element if it's a number
    if (/^\d+$/.test(chunks[chunks.length - 1])) {
        postfix = chunks.pop();
    }
    let raw = chunks.shift().toLowerCase();
    if (chunks.length) {
        raw += chunks.map((c) => c.charAt(0).toUpperCase() + c.slice(1).toLowerCase()).join('');
    }
    return postfix ? `${raw}_${postfix}` : raw;
}

/**
 * Checks whether an object key contains potentially unsafe chars, thus the key should be wrapped in
 * quotes. Note: we do not wrap all keys into quotes, as it may have impact on minification and may
 * not work in some cases when object keys are mangled by a minifier.
 *
 * TODO(FW-1136): this is a temporary solution, we need to come up with a better way of working with
 * inputs that contain potentially unsafe chars.
 */
const UNSAFE_OBJECT_KEY_NAME_REGEXP = /[-.]/;
/** Name of the temporary to use during data binding */
const TEMPORARY_NAME = '_t';
/** Name of the context parameter passed into a template function */
const CONTEXT_NAME = 'ctx';
/** Name of the RenderFlag passed into a template function */
const RENDER_FLAGS = 'rf';
/**
 * Creates an allocator for a temporary variable.
 *
 * A variable declaration is added to the statements the first time the allocator is invoked.
 */
function temporaryAllocator(pushStatement, name) {
    let temp = null;
    return () => {
        if (!temp) {
            pushStatement(new DeclareVarStmt(TEMPORARY_NAME, undefined, DYNAMIC_TYPE));
            temp = variable(name);
        }
        return temp;
    };
}
function asLiteral(value) {
    if (Array.isArray(value)) {
        return literalArr(value.map(asLiteral));
    }
    return literal$1(value, INFERRED_TYPE);
}
/**
 * Serializes inputs and outputs for `defineDirective` and `defineComponent`.
 *
 * This will attempt to generate optimized data structures to minimize memory or
 * file size of fully compiled applications.
 */
function conditionallyCreateDirectiveBindingLiteral(map, forInputs) {
    const keys = Object.getOwnPropertyNames(map);
    if (keys.length === 0) {
        return null;
    }
    return literalMap(keys.map((key) => {
        const value = map[key];
        let declaredName;
        let publicName;
        let minifiedName;
        let expressionValue;
        if (typeof value === 'string') {
            // canonical syntax: `dirProp: publicProp`
            declaredName = key;
            minifiedName = key;
            publicName = value;
            expressionValue = asLiteral(publicName);
        }
        else {
            minifiedName = key;
            declaredName = value.classPropertyName;
            publicName = value.bindingPropertyName;
            const differentDeclaringName = publicName !== declaredName;
            const hasDecoratorInputTransform = value.transformFunction !== null;
            let flags = InputFlags.None;
            // Build up input flags
            if (value.isSignal) {
                flags |= InputFlags.SignalBased;
            }
            if (hasDecoratorInputTransform) {
                flags |= InputFlags.HasDecoratorInputTransform;
            }
            // Inputs, compared to outputs, will track their declared name (for `ngOnChanges`), support
            // decorator input transform functions, or store flag information if there is any.
            if (forInputs &&
                (differentDeclaringName || hasDecoratorInputTransform || flags !== InputFlags.None)) {
                const result = [literal$1(flags), asLiteral(publicName)];
                if (differentDeclaringName || hasDecoratorInputTransform) {
                    result.push(asLiteral(declaredName));
                    if (hasDecoratorInputTransform) {
                        result.push(value.transformFunction);
                    }
                }
                expressionValue = literalArr(result);
            }
            else {
                expressionValue = asLiteral(publicName);
            }
        }
        return {
            key: minifiedName,
            // put quotes around keys that contain potentially unsafe characters
            quoted: UNSAFE_OBJECT_KEY_NAME_REGEXP.test(minifiedName),
            value: expressionValue,
        };
    }));
}
/**
 * A representation for an object literal used during codegen of definition objects. The generic
 * type `T` allows to reference a documented type of the generated structure, such that the
 * property names that are set can be resolved to their documented declaration.
 */
class DefinitionMap {
    values = [];
    set(key, value) {
        if (value) {
            const existing = this.values.find((value) => value.key === key);
            if (existing) {
                existing.value = value;
            }
            else {
                this.values.push({ key: key, value, quoted: false });
            }
        }
    }
    toLiteralMap() {
        return literalMap(this.values);
    }
}
/**
 * Creates a `CssSelector` from an AST node.
 */
function createCssSelectorFromNode(node) {
    const elementName = node instanceof Element$1 ? node.name : 'ng-template';
    const attributes = getAttrsForDirectiveMatching(node);
    const cssSelector = new CssSelector();
    const elementNameNoNs = splitNsName(elementName)[1];
    cssSelector.setElement(elementNameNoNs);
    Object.getOwnPropertyNames(attributes).forEach((name) => {
        const nameNoNs = splitNsName(name)[1];
        const value = attributes[name];
        cssSelector.addAttribute(nameNoNs, value);
        if (name.toLowerCase() === 'class') {
            const classes = value.trim().split(/\s+/);
            classes.forEach((className) => cssSelector.addClassName(className));
        }
    });
    return cssSelector;
}
/**
 * Extract a map of properties to values for a given element or template node, which can be used
 * by the directive matching machinery.
 *
 * @param elOrTpl the element or template in question
 * @return an object set up for directive matching. For attributes on the element/template, this
 * object maps a property name to its (static) value. For any bindings, this map simply maps the
 * property name to an empty string.
 */
function getAttrsForDirectiveMatching(elOrTpl) {
    const attributesMap = {};
    if (elOrTpl instanceof Template && elOrTpl.tagName !== 'ng-template') {
        elOrTpl.templateAttrs.forEach((a) => (attributesMap[a.name] = ''));
    }
    else {
        elOrTpl.attributes.forEach((a) => {
            if (!isI18nAttribute(a.name)) {
                attributesMap[a.name] = a.value;
            }
        });
        elOrTpl.inputs.forEach((i) => {
            if (i.type === exports.BindingType.Property || i.type === exports.BindingType.TwoWay) {
                attributesMap[i.name] = '';
            }
        });
        elOrTpl.outputs.forEach((o) => {
            attributesMap[o.name] = '';
        });
    }
    return attributesMap;
}

function compileInjectable(meta, resolveForwardRefs) {
    let result = null;
    const factoryMeta = {
        name: meta.name,
        type: meta.type,
        typeArgumentCount: meta.typeArgumentCount,
        deps: [],
        target: exports.FactoryTarget.Injectable,
    };
    if (meta.useClass !== undefined) {
        // meta.useClass has two modes of operation. Either deps are specified, in which case `new` is
        // used to instantiate the class with dependencies injected, or deps are not specified and
        // the factory of the class is used to instantiate it.
        //
        // A special case exists for useClass: Type where Type is the injectable type itself and no
        // deps are specified, in which case 'useClass' is effectively ignored.
        const useClassOnSelf = meta.useClass.expression.isEquivalent(meta.type.value);
        let deps = undefined;
        if (meta.deps !== undefined) {
            deps = meta.deps;
        }
        if (deps !== undefined) {
            // factory: () => new meta.useClass(...deps)
            result = compileFactoryFunction({
                ...factoryMeta,
                delegate: meta.useClass.expression,
                delegateDeps: deps,
                delegateType: R3FactoryDelegateType.Class,
            });
        }
        else if (useClassOnSelf) {
            result = compileFactoryFunction(factoryMeta);
        }
        else {
            result = {
                statements: [],
                expression: delegateToFactory(meta.type.value, meta.useClass.expression, resolveForwardRefs),
            };
        }
    }
    else if (meta.useFactory !== undefined) {
        if (meta.deps !== undefined) {
            result = compileFactoryFunction({
                ...factoryMeta,
                delegate: meta.useFactory,
                delegateDeps: meta.deps || [],
                delegateType: R3FactoryDelegateType.Function,
            });
        }
        else {
            result = { statements: [], expression: arrowFn([], meta.useFactory.callFn([])) };
        }
    }
    else if (meta.useValue !== undefined) {
        // Note: it's safe to use `meta.useValue` instead of the `USE_VALUE in meta` check used for
        // client code because meta.useValue is an Expression which will be defined even if the actual
        // value is undefined.
        result = compileFactoryFunction({
            ...factoryMeta,
            expression: meta.useValue.expression,
        });
    }
    else if (meta.useExisting !== undefined) {
        // useExisting is an `inject` call on the existing token.
        result = compileFactoryFunction({
            ...factoryMeta,
            expression: importExpr(Identifiers.inject).callFn([meta.useExisting.expression]),
        });
    }
    else {
        result = {
            statements: [],
            expression: delegateToFactory(meta.type.value, meta.type.value, resolveForwardRefs),
        };
    }
    const token = meta.type.value;
    const injectableProps = new DefinitionMap();
    injectableProps.set('token', token);
    injectableProps.set('factory', result.expression);
    // Only generate providedIn property if it has a non-null value
    if (meta.providedIn.expression.value !== null) {
        injectableProps.set('providedIn', convertFromMaybeForwardRefExpression(meta.providedIn));
    }
    const expression = importExpr(Identifiers.ɵɵdefineInjectable)
        .callFn([injectableProps.toLiteralMap()], undefined, true);
    return {
        expression,
        type: createInjectableType(meta),
        statements: result.statements,
    };
}
function createInjectableType(meta) {
    return new ExpressionType(importExpr(Identifiers.InjectableDeclaration, [
        typeWithParameters(meta.type.type, meta.typeArgumentCount),
    ]));
}
function delegateToFactory(type, useType, unwrapForwardRefs) {
    if (type.node === useType.node) {
        // The types are the same, so we can simply delegate directly to the type's factory.
        // ```
        // factory: type.ɵfac
        // ```
        return useType.prop('ɵfac');
    }
    if (!unwrapForwardRefs) {
        // The type is not wrapped in a `forwardRef()`, so we create a simple factory function that
        // accepts a sub-type as an argument.
        // ```
        // factory: function(t) { return useType.ɵfac(t); }
        // ```
        return createFactoryFunction(useType);
    }
    // The useType is actually wrapped in a `forwardRef()` so we need to resolve that before
    // calling its factory.
    // ```
    // factory: function(t) { return core.resolveForwardRef(type).ɵfac(t); }
    // ```
    const unwrappedType = importExpr(Identifiers.resolveForwardRef).callFn([useType]);
    return createFactoryFunction(unwrappedType);
}
function createFactoryFunction(type) {
    const t = new FnParam('__ngFactoryType__', DYNAMIC_TYPE);
    return arrowFn([t], type.prop('ɵfac').callFn([variable(t.name)]));
}

const UNUSABLE_INTERPOLATION_REGEXPS = [
    /@/, // control flow reserved symbol
    /^\s*$/, // empty
    /[<>]/, // html tag
    /^[{}]$/, // i18n expansion
    /&(#|[a-z])/i, // character reference,
    /^\/\//, // comment
];
function assertInterpolationSymbols(identifier, value) {
    if (value != null && !(Array.isArray(value) && value.length == 2)) {
        throw new Error(`Expected '${identifier}' to be an array, [start, end].`);
    }
    else if (value != null) {
        const start = value[0];
        const end = value[1];
        // Check for unusable interpolation symbols
        UNUSABLE_INTERPOLATION_REGEXPS.forEach((regexp) => {
            if (regexp.test(start) || regexp.test(end)) {
                throw new Error(`['${start}', '${end}'] contains unusable interpolation symbol.`);
            }
        });
    }
}

class InterpolationConfig {
    start;
    end;
    static fromArray(markers) {
        if (!markers) {
            return DEFAULT_INTERPOLATION_CONFIG;
        }
        assertInterpolationSymbols('interpolation', markers);
        return new InterpolationConfig(markers[0], markers[1]);
    }
    constructor(start, end) {
        this.start = start;
        this.end = end;
    }
}
const DEFAULT_INTERPOLATION_CONFIG = new InterpolationConfig('{{', '}}');
const DEFAULT_CONTAINER_BLOCKS = new Set(['switch']);

const $EOF = 0;
const $BSPACE = 8;
const $TAB = 9;
const $LF = 10;
const $VTAB = 11;
const $FF = 12;
const $CR = 13;
const $SPACE = 32;
const $BANG = 33;
const $DQ = 34;
const $HASH = 35;
const $$ = 36;
const $PERCENT = 37;
const $AMPERSAND = 38;
const $SQ = 39;
const $LPAREN = 40;
const $RPAREN = 41;
const $STAR = 42;
const $PLUS = 43;
const $COMMA = 44;
const $MINUS = 45;
const $PERIOD = 46;
const $SLASH = 47;
const $COLON = 58;
const $SEMICOLON = 59;
const $LT = 60;
const $EQ = 61;
const $GT = 62;
const $QUESTION = 63;
const $0 = 48;
const $7 = 55;
const $9 = 57;
const $A = 65;
const $E = 69;
const $F = 70;
const $X = 88;
const $Z = 90;
const $LBRACKET = 91;
const $BACKSLASH = 92;
const $RBRACKET = 93;
const $CARET = 94;
const $_ = 95;
const $a = 97;
const $b = 98;
const $e = 101;
const $f = 102;
const $n = 110;
const $r = 114;
const $t = 116;
const $u = 117;
const $v = 118;
const $x = 120;
const $z = 122;
const $LBRACE = 123;
const $BAR = 124;
const $RBRACE = 125;
const $NBSP = 160;
const $AT = 64;
const $BT = 96;
function isWhitespace(code) {
    return (code >= $TAB && code <= $SPACE) || code == $NBSP;
}
function isDigit(code) {
    return $0 <= code && code <= $9;
}
function isAsciiLetter(code) {
    return (code >= $a && code <= $z) || (code >= $A && code <= $Z);
}
function isAsciiHexDigit(code) {
    return (code >= $a && code <= $f) || (code >= $A && code <= $F) || isDigit(code);
}
function isNewLine(code) {
    return code === $LF || code === $CR;
}
function isOctalDigit(code) {
    return $0 <= code && code <= $7;
}
function isQuote(code) {
    return code === $SQ || code === $DQ || code === $BT;
}

class ParseLocation {
    file;
    offset;
    line;
    col;
    constructor(file, offset, line, col) {
        this.file = file;
        this.offset = offset;
        this.line = line;
        this.col = col;
    }
    toString() {
        return this.offset != null ? `${this.file.url}@${this.line}:${this.col}` : this.file.url;
    }
    moveBy(delta) {
        const source = this.file.content;
        const len = source.length;
        let offset = this.offset;
        let line = this.line;
        let col = this.col;
        while (offset > 0 && delta < 0) {
            offset--;
            delta++;
            const ch = source.charCodeAt(offset);
            if (ch == $LF) {
                line--;
                const priorLine = source
                    .substring(0, offset - 1)
                    .lastIndexOf(String.fromCharCode($LF));
                col = priorLine > 0 ? offset - priorLine : offset;
            }
            else {
                col--;
            }
        }
        while (offset < len && delta > 0) {
            const ch = source.charCodeAt(offset);
            offset++;
            delta--;
            if (ch == $LF) {
                line++;
                col = 0;
            }
            else {
                col++;
            }
        }
        return new ParseLocation(this.file, offset, line, col);
    }
    // Return the source around the location
    // Up to `maxChars` or `maxLines` on each side of the location
    getContext(maxChars, maxLines) {
        const content = this.file.content;
        let startOffset = this.offset;
        if (startOffset != null) {
            if (startOffset > content.length - 1) {
                startOffset = content.length - 1;
            }
            let endOffset = startOffset;
            let ctxChars = 0;
            let ctxLines = 0;
            while (ctxChars < maxChars && startOffset > 0) {
                startOffset--;
                ctxChars++;
                if (content[startOffset] == '\n') {
                    if (++ctxLines == maxLines) {
                        break;
                    }
                }
            }
            ctxChars = 0;
            ctxLines = 0;
            while (ctxChars < maxChars && endOffset < content.length - 1) {
                endOffset++;
                ctxChars++;
                if (content[endOffset] == '\n') {
                    if (++ctxLines == maxLines) {
                        break;
                    }
                }
            }
            return {
                before: content.substring(startOffset, this.offset),
                after: content.substring(this.offset, endOffset + 1),
            };
        }
        return null;
    }
}
class ParseSourceFile {
    content;
    url;
    constructor(content, url) {
        this.content = content;
        this.url = url;
    }
}
class ParseSourceSpan {
    start;
    end;
    fullStart;
    details;
    /**
     * Create an object that holds information about spans of tokens/nodes captured during
     * lexing/parsing of text.
     *
     * @param start
     * The location of the start of the span (having skipped leading trivia).
     * Skipping leading trivia makes source-spans more "user friendly", since things like HTML
     * elements will appear to begin at the start of the opening tag, rather than at the start of any
     * leading trivia, which could include newlines.
     *
     * @param end
     * The location of the end of the span.
     *
     * @param fullStart
     * The start of the token without skipping the leading trivia.
     * This is used by tooling that splits tokens further, such as extracting Angular interpolations
     * from text tokens. Such tooling creates new source-spans relative to the original token's
     * source-span. If leading trivia characters have been skipped then the new source-spans may be
     * incorrectly offset.
     *
     * @param details
     * Additional information (such as identifier names) that should be associated with the span.
     */
    constructor(start, end, fullStart = start, details = null) {
        this.start = start;
        this.end = end;
        this.fullStart = fullStart;
        this.details = details;
    }
    toString() {
        return this.start.file.content.substring(this.start.offset, this.end.offset);
    }
}
var ParseErrorLevel;
(function (ParseErrorLevel) {
    ParseErrorLevel[ParseErrorLevel["WARNING"] = 0] = "WARNING";
    ParseErrorLevel[ParseErrorLevel["ERROR"] = 1] = "ERROR";
})(ParseErrorLevel || (ParseErrorLevel = {}));
class ParseError {
    span;
    msg;
    level;
    relatedError;
    constructor(
    /** Location of the error. */
    span, 
    /** Error message. */
    msg, 
    /** Severity level of the error. */
    level = ParseErrorLevel.ERROR, 
    /**
     * Error that caused the error to be surfaced. For example, an error in a sub-expression that
     * couldn't be parsed. Not guaranteed to be defined, but can be used to provide more context.
     */
    relatedError) {
        this.span = span;
        this.msg = msg;
        this.level = level;
        this.relatedError = relatedError;
    }
    contextualMessage() {
        const ctx = this.span.start.getContext(100, 3);
        return ctx
            ? `${this.msg} ("${ctx.before}[${ParseErrorLevel[this.level]} ->]${ctx.after}")`
            : this.msg;
    }
    toString() {
        const details = this.span.details ? `, ${this.span.details}` : '';
        return `${this.contextualMessage()}: ${this.span.start}${details}`;
    }
}
/**
 * Generates Source Span object for a given R3 Type for JIT mode.
 *
 * @param kind Component or Directive.
 * @param typeName name of the Component or Directive.
 * @param sourceUrl reference to Component or Directive source.
 * @returns instance of ParseSourceSpan that represent a given Component or Directive.
 */
function r3JitTypeSourceSpan(kind, typeName, sourceUrl) {
    const sourceFileName = `in ${kind} ${typeName} in ${sourceUrl}`;
    const sourceFile = new ParseSourceFile('', sourceFileName);
    return new ParseSourceSpan(new ParseLocation(sourceFile, -1, -1, -1), new ParseLocation(sourceFile, -1, -1, -1));
}
let _anonymousTypeIndex = 0;
function identifierName(compileIdentifier) {
    if (!compileIdentifier || !compileIdentifier.reference) {
        return null;
    }
    const ref = compileIdentifier.reference;
    if (ref['__anonymousType']) {
        return ref['__anonymousType'];
    }
    if (ref['__forward_ref__']) {
        // We do not want to try to stringify a `forwardRef()` function because that would cause the
        // inner function to be evaluated too early, defeating the whole point of the `forwardRef`.
        return '__forward_ref__';
    }
    let identifier = stringify(ref);
    if (identifier.indexOf('(') >= 0) {
        // case: anonymous functions!
        identifier = `anonymous_${_anonymousTypeIndex++}`;
        ref['__anonymousType'] = identifier;
    }
    else {
        identifier = sanitizeIdentifier(identifier);
    }
    return identifier;
}
function sanitizeIdentifier(name) {
    return name.replace(/\W/g, '_');
}

/**
 * In TypeScript, tagged template functions expect a "template object", which is an array of
 * "cooked" strings plus a `raw` property that contains an array of "raw" strings. This is
 * typically constructed with a function called `__makeTemplateObject(cooked, raw)`, but it may not
 * be available in all environments.
 *
 * This is a JavaScript polyfill that uses __makeTemplateObject when it's available, but otherwise
 * creates an inline helper with the same functionality.
 *
 * In the inline function, if `Object.defineProperty` is available we use that to attach the `raw`
 * array.
 */
const makeTemplateObjectPolyfill = '(this&&this.__makeTemplateObject||function(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e})';
class AbstractJsEmitterVisitor extends AbstractEmitterVisitor {
    constructor() {
        super(false);
    }
    visitWrappedNodeExpr(ast, ctx) {
        throw new Error('Cannot emit a WrappedNodeExpr in Javascript.');
    }
    visitDeclareVarStmt(stmt, ctx) {
        ctx.print(stmt, `var ${stmt.name}`);
        if (stmt.value) {
            ctx.print(stmt, ' = ');
            stmt.value.visitExpression(this, ctx);
        }
        ctx.println(stmt, `;`);
        return null;
    }
    visitTaggedTemplateLiteralExpr(ast, ctx) {
        // The following convoluted piece of code is effectively the downlevelled equivalent of
        // ```
        // tag`...`
        // ```
        // which is effectively like:
        // ```
        // tag(__makeTemplateObject(cooked, raw), expression1, expression2, ...);
        // ```
        const elements = ast.template.elements;
        ast.tag.visitExpression(this, ctx);
        ctx.print(ast, `(${makeTemplateObjectPolyfill}(`);
        ctx.print(ast, `[${elements.map((part) => escapeIdentifier(part.text, false)).join(', ')}], `);
        ctx.print(ast, `[${elements.map((part) => escapeIdentifier(part.rawText, false)).join(', ')}])`);
        ast.template.expressions.forEach((expression) => {
            ctx.print(ast, ', ');
            expression.visitExpression(this, ctx);
        });
        ctx.print(ast, ')');
        return null;
    }
    visitTemplateLiteralExpr(expr, ctx) {
        ctx.print(expr, '`');
        for (let i = 0; i < expr.elements.length; i++) {
            expr.elements[i].visitExpression(this, ctx);
            const expression = i < expr.expressions.length ? expr.expressions[i] : null;
            if (expression !== null) {
                ctx.print(expression, '${');
                expression.visitExpression(this, ctx);
                ctx.print(expression, '}');
            }
        }
        ctx.print(expr, '`');
    }
    visitTemplateLiteralElementExpr(expr, ctx) {
        ctx.print(expr, expr.rawText);
        return null;
    }
    visitFunctionExpr(ast, ctx) {
        ctx.print(ast, `function${ast.name ? ' ' + ast.name : ''}(`);
        this._visitParams(ast.params, ctx);
        ctx.println(ast, `) {`);
        ctx.incIndent();
        this.visitAllStatements(ast.statements, ctx);
        ctx.decIndent();
        ctx.print(ast, `}`);
        return null;
    }
    visitArrowFunctionExpr(ast, ctx) {
        ctx.print(ast, '(');
        this._visitParams(ast.params, ctx);
        ctx.print(ast, ') =>');
        if (Array.isArray(ast.body)) {
            ctx.println(ast, `{`);
            ctx.incIndent();
            this.visitAllStatements(ast.body, ctx);
            ctx.decIndent();
            ctx.print(ast, `}`);
        }
        else {
            const isObjectLiteral = ast.body instanceof LiteralMapExpr;
            if (isObjectLiteral) {
                ctx.print(ast, '(');
            }
            ast.body.visitExpression(this, ctx);
            if (isObjectLiteral) {
                ctx.print(ast, ')');
            }
        }
        return null;
    }
    visitDeclareFunctionStmt(stmt, ctx) {
        ctx.print(stmt, `function ${stmt.name}(`);
        this._visitParams(stmt.params, ctx);
        ctx.println(stmt, `) {`);
        ctx.incIndent();
        this.visitAllStatements(stmt.statements, ctx);
        ctx.decIndent();
        ctx.println(stmt, `}`);
        return null;
    }
    visitLocalizedString(ast, ctx) {
        // The following convoluted piece of code is effectively the downlevelled equivalent of
        // ```
        // $localize `...`
        // ```
        // which is effectively like:
        // ```
        // $localize(__makeTemplateObject(cooked, raw), expression1, expression2, ...);
        // ```
        ctx.print(ast, `$localize(${makeTemplateObjectPolyfill}(`);
        const parts = [ast.serializeI18nHead()];
        for (let i = 1; i < ast.messageParts.length; i++) {
            parts.push(ast.serializeI18nTemplatePart(i));
        }
        ctx.print(ast, `[${parts.map((part) => escapeIdentifier(part.cooked, false)).join(', ')}], `);
        ctx.print(ast, `[${parts.map((part) => escapeIdentifier(part.raw, false)).join(', ')}])`);
        ast.expressions.forEach((expression) => {
            ctx.print(ast, ', ');
            expression.visitExpression(this, ctx);
        });
        ctx.print(ast, ')');
        return null;
    }
    _visitParams(params, ctx) {
        this.visitAllObjects((param) => ctx.print(null, param.name), params, ctx, ',');
    }
}

/**
 * @fileoverview
 * A module to facilitate use of a Trusted Types policy within the JIT
 * compiler. It lazily constructs the Trusted Types policy, providing helper
 * utilities for promoting strings to Trusted Types. When Trusted Types are not
 * available, strings are used as a fallback.
 * @security All use of this module is security-sensitive and should go through
 * security review.
 */
/**
 * The Trusted Types policy, or null if Trusted Types are not
 * enabled/supported, or undefined if the policy has not been created yet.
 */
let policy;
/**
 * Returns the Trusted Types policy, or null if Trusted Types are not
 * enabled/supported. The first call to this function will create the policy.
 */
function getPolicy() {
    if (policy === undefined) {
        const trustedTypes = _global['trustedTypes'];
        policy = null;
        if (trustedTypes) {
            try {
                policy = trustedTypes.createPolicy('angular#unsafe-jit', {
                    createScript: (s) => s,
                });
            }
            catch {
                // trustedTypes.createPolicy throws if called with a name that is
                // already registered, even in report-only mode. Until the API changes,
                // catch the error not to break the applications functionally. In such
                // cases, the code will fall back to using strings.
            }
        }
    }
    return policy;
}
/**
 * Unsafely promote a string to a TrustedScript, falling back to strings when
 * Trusted Types are not available.
 * @security In particular, it must be assured that the provided string will
 * never cause an XSS vulnerability if used in a context that will be
 * interpreted and executed as a script by a browser, e.g. when calling eval.
 */
function trustedScriptFromString(script) {
    return getPolicy()?.createScript(script) || script;
}
/**
 * Unsafely call the Function constructor with the given string arguments.
 * @security This is a security-sensitive function; any use of this function
 * must go through security review. In particular, it must be assured that it
 * is only called from the JIT compiler, as use in other code can lead to XSS
 * vulnerabilities.
 */
function newTrustedFunctionForJIT(...args) {
    if (!_global['trustedTypes']) {
        // In environments that don't support Trusted Types, fall back to the most
        // straightforward implementation:
        return new Function(...args);
    }
    // Chrome currently does not support passing TrustedScript to the Function
    // constructor. The following implements the workaround proposed on the page
    // below, where the Chromium bug is also referenced:
    // https://github.com/w3c/webappsec-trusted-types/wiki/Trusted-Types-for-function-constructor
    const fnArgs = args.slice(0, -1).join(',');
    const fnBody = args[args.length - 1];
    const body = `(function anonymous(${fnArgs}
) { ${fnBody}
})`;
    // Using eval directly confuses the compiler and prevents this module from
    // being stripped out of JS binaries even if not used. The global['eval']
    // indirection fixes that.
    const fn = _global['eval'](trustedScriptFromString(body));
    if (fn.bind === undefined) {
        // Workaround for a browser bug that only exists in Chrome 83, where passing
        // a TrustedScript to eval just returns the TrustedScript back without
        // evaluating it. In that case, fall back to the most straightforward
        // implementation:
        return new Function(...args);
    }
    // To completely mimic the behavior of calling "new Function", two more
    // things need to happen:
    // 1. Stringifying the resulting function should return its source code
    fn.toString = () => body;
    // 2. When calling the resulting function, `this` should refer to `global`
    return fn.bind(_global);
    // When Trusted Types support in Function constructors is widely available,
    // the implementation of this function can be simplified to:
    // return new Function(...args.map(a => trustedScriptFromString(a)));
}

/**
 * A helper class to manage the evaluation of JIT generated code.
 */
class JitEvaluator {
    /**
     *
     * @param sourceUrl The URL of the generated code.
     * @param statements An array of Angular statement AST nodes to be evaluated.
     * @param refResolver Resolves `o.ExternalReference`s into values.
     * @param createSourceMaps If true then create a source-map for the generated code and include it
     * inline as a source-map comment.
     * @returns A map of all the variables in the generated code.
     */
    evaluateStatements(sourceUrl, statements, refResolver, createSourceMaps) {
        const converter = new JitEmitterVisitor(refResolver);
        const ctx = EmitterVisitorContext.createRoot();
        // Ensure generated code is in strict mode
        if (statements.length > 0 && !isUseStrictStatement(statements[0])) {
            statements = [literal$1('use strict').toStmt(), ...statements];
        }
        converter.visitAllStatements(statements, ctx);
        converter.createReturnStmt(ctx);
        return this.evaluateCode(sourceUrl, ctx, converter.getArgs(), createSourceMaps);
    }
    /**
     * Evaluate a piece of JIT generated code.
     * @param sourceUrl The URL of this generated code.
     * @param ctx A context object that contains an AST of the code to be evaluated.
     * @param vars A map containing the names and values of variables that the evaluated code might
     * reference.
     * @param createSourceMap If true then create a source-map for the generated code and include it
     * inline as a source-map comment.
     * @returns The result of evaluating the code.
     */
    evaluateCode(sourceUrl, ctx, vars, createSourceMap) {
        let fnBody = `"use strict";${ctx.toSource()}\n//# sourceURL=${sourceUrl}`;
        const fnArgNames = [];
        const fnArgValues = [];
        for (const argName in vars) {
            fnArgValues.push(vars[argName]);
            fnArgNames.push(argName);
        }
        if (createSourceMap) {
            // using `new Function(...)` generates a header, 1 line of no arguments, 2 lines otherwise
            // E.g. ```
            // function anonymous(a,b,c
            // /**/) { ... }```
            // We don't want to hard code this fact, so we auto detect it via an empty function first.
            const emptyFn = newTrustedFunctionForJIT(...fnArgNames.concat('return null;')).toString();
            const headerLines = emptyFn.slice(0, emptyFn.indexOf('return null;')).split('\n').length - 1;
            fnBody += `\n${ctx.toSourceMapGenerator(sourceUrl, headerLines).toJsComment()}`;
        }
        const fn = newTrustedFunctionForJIT(...fnArgNames.concat(fnBody));
        return this.executeFunction(fn, fnArgValues);
    }
    /**
     * Execute a JIT generated function by calling it.
     *
     * This method can be overridden in tests to capture the functions that are generated
     * by this `JitEvaluator` class.
     *
     * @param fn A function to execute.
     * @param args The arguments to pass to the function being executed.
     * @returns The return value of the executed function.
     */
    executeFunction(fn, args) {
        return fn(...args);
    }
}
/**
 * An Angular AST visitor that converts AST nodes into executable JavaScript code.
 */
class JitEmitterVisitor extends AbstractJsEmitterVisitor {
    refResolver;
    _evalArgNames = [];
    _evalArgValues = [];
    _evalExportedVars = [];
    constructor(refResolver) {
        super();
        this.refResolver = refResolver;
    }
    createReturnStmt(ctx) {
        const stmt = new ReturnStatement(new LiteralMapExpr(this._evalExportedVars.map((resultVar) => new LiteralMapEntry(resultVar, variable(resultVar), false))));
        stmt.visitStatement(this, ctx);
    }
    getArgs() {
        const result = {};
        for (let i = 0; i < this._evalArgNames.length; i++) {
            result[this._evalArgNames[i]] = this._evalArgValues[i];
        }
        return result;
    }
    visitExternalExpr(ast, ctx) {
        this._emitReferenceToExternal(ast, this.refResolver.resolveExternalReference(ast.value), ctx);
        return null;
    }
    visitWrappedNodeExpr(ast, ctx) {
        this._emitReferenceToExternal(ast, ast.node, ctx);
        return null;
    }
    visitDeclareVarStmt(stmt, ctx) {
        if (stmt.hasModifier(exports.StmtModifier.Exported)) {
            this._evalExportedVars.push(stmt.name);
        }
        return super.visitDeclareVarStmt(stmt, ctx);
    }
    visitDeclareFunctionStmt(stmt, ctx) {
        if (stmt.hasModifier(exports.StmtModifier.Exported)) {
            this._evalExportedVars.push(stmt.name);
        }
        return super.visitDeclareFunctionStmt(stmt, ctx);
    }
    _emitReferenceToExternal(ast, value, ctx) {
        let id = this._evalArgValues.indexOf(value);
        if (id === -1) {
            id = this._evalArgValues.length;
            this._evalArgValues.push(value);
            const name = identifierName({ reference: value }) || 'val';
            this._evalArgNames.push(`jit_${name}_${id}`);
        }
        ctx.print(ast, this._evalArgNames[id]);
    }
}
function isUseStrictStatement(statement) {
    return statement.isEquivalent(literal$1('use strict').toStmt());
}

function compileInjector(meta) {
    const definitionMap = new DefinitionMap();
    if (meta.providers !== null) {
        definitionMap.set('providers', meta.providers);
    }
    if (meta.imports.length > 0) {
        definitionMap.set('imports', literalArr(meta.imports));
    }
    const expression = importExpr(Identifiers.defineInjector)
        .callFn([definitionMap.toLiteralMap()], undefined, true);
    const type = createInjectorType(meta);
    return { expression, type, statements: [] };
}
function createInjectorType(meta) {
    return new ExpressionType(importExpr(Identifiers.InjectorDeclaration, [new ExpressionType(meta.type.type)]));
}

/**
 * Implementation of `CompileReflector` which resolves references to @angular/core
 * symbols at runtime, according to a consumer-provided mapping.
 *
 * Only supports `resolveExternalReference`, all other methods throw.
 */
class R3JitReflector {
    context;
    constructor(context) {
        this.context = context;
    }
    resolveExternalReference(ref) {
        // This reflector only handles @angular/core imports.
        if (ref.moduleName !== '@angular/core') {
            throw new Error(`Cannot resolve external reference to ${ref.moduleName}, only references to @angular/core are supported.`);
        }
        if (!this.context.hasOwnProperty(ref.name)) {
            throw new Error(`No value provided for @angular/core symbol '${ref.name}'.`);
        }
        return this.context[ref.name];
    }
}

/**
 * How the selector scope of an NgModule (its declarations, imports, and exports) should be emitted
 * as a part of the NgModule definition.
 */
exports.R3SelectorScopeMode = void 0;
(function (R3SelectorScopeMode) {
    /**
     * Emit the declarations inline into the module definition.
     *
     * This option is useful in certain contexts where it's known that JIT support is required. The
     * tradeoff here is that this emit style prevents directives and pipes from being tree-shaken if
     * they are unused, but the NgModule is used.
     */
    R3SelectorScopeMode[R3SelectorScopeMode["Inline"] = 0] = "Inline";
    /**
     * Emit the declarations using a side effectful function call, `ɵɵsetNgModuleScope`, that is
     * guarded with the `ngJitMode` flag.
     *
     * This form of emit supports JIT and can be optimized away if the `ngJitMode` flag is set to
     * false, which allows unused directives and pipes to be tree-shaken.
     */
    R3SelectorScopeMode[R3SelectorScopeMode["SideEffect"] = 1] = "SideEffect";
    /**
     * Don't generate selector scopes at all.
     *
     * This is useful for contexts where JIT support is known to be unnecessary.
     */
    R3SelectorScopeMode[R3SelectorScopeMode["Omit"] = 2] = "Omit";
})(exports.R3SelectorScopeMode || (exports.R3SelectorScopeMode = {}));
/**
 * The type of the NgModule meta data.
 * - Global: Used for full and partial compilation modes which mainly includes R3References.
 * - Local: Used for the local compilation mode which mainly includes the raw expressions as appears
 * in the NgModule decorator.
 */
exports.R3NgModuleMetadataKind = void 0;
(function (R3NgModuleMetadataKind) {
    R3NgModuleMetadataKind[R3NgModuleMetadataKind["Global"] = 0] = "Global";
    R3NgModuleMetadataKind[R3NgModuleMetadataKind["Local"] = 1] = "Local";
})(exports.R3NgModuleMetadataKind || (exports.R3NgModuleMetadataKind = {}));
/**
 * Construct an `R3NgModuleDef` for the given `R3NgModuleMetadata`.
 */
function compileNgModule(meta) {
    const statements = [];
    const definitionMap = new DefinitionMap();
    definitionMap.set('type', meta.type.value);
    // Assign bootstrap definition. In local compilation mode (i.e., for
    // `R3NgModuleMetadataKind.LOCAL`) we assign the bootstrap field using the runtime
    // `ɵɵsetNgModuleScope`.
    if (meta.kind === exports.R3NgModuleMetadataKind.Global && meta.bootstrap.length > 0) {
        definitionMap.set('bootstrap', refsToArray(meta.bootstrap, meta.containsForwardDecls));
    }
    if (meta.selectorScopeMode === exports.R3SelectorScopeMode.Inline) {
        // If requested to emit scope information inline, pass the `declarations`, `imports` and
        // `exports` to the `ɵɵdefineNgModule()` call directly.
        if (meta.declarations.length > 0) {
            definitionMap.set('declarations', refsToArray(meta.declarations, meta.containsForwardDecls));
        }
        if (meta.imports.length > 0) {
            definitionMap.set('imports', refsToArray(meta.imports, meta.containsForwardDecls));
        }
        if (meta.exports.length > 0) {
            definitionMap.set('exports', refsToArray(meta.exports, meta.containsForwardDecls));
        }
    }
    else if (meta.selectorScopeMode === exports.R3SelectorScopeMode.SideEffect) {
        // In this mode, scope information is not passed into `ɵɵdefineNgModule` as it
        // would prevent tree-shaking of the declarations, imports and exports references. Instead, it's
        // patched onto the NgModule definition with a `ɵɵsetNgModuleScope` call that's guarded by the
        // `ngJitMode` flag.
        const setNgModuleScopeCall = generateSetNgModuleScopeCall(meta);
        if (setNgModuleScopeCall !== null) {
            statements.push(setNgModuleScopeCall);
        }
    }
    else ;
    if (meta.schemas !== null && meta.schemas.length > 0) {
        definitionMap.set('schemas', literalArr(meta.schemas.map((ref) => ref.value)));
    }
    if (meta.id !== null) {
        definitionMap.set('id', meta.id);
        // Generate a side-effectful call to register this NgModule by its id, as per the semantics of
        // NgModule ids.
        statements.push(importExpr(Identifiers.registerNgModuleType).callFn([meta.type.value, meta.id]).toStmt());
    }
    const expression = importExpr(Identifiers.defineNgModule)
        .callFn([definitionMap.toLiteralMap()], undefined, true);
    const type = createNgModuleType(meta);
    return { expression, type, statements };
}
/**
 * This function is used in JIT mode to generate the call to `ɵɵdefineNgModule()` from a call to
 * `ɵɵngDeclareNgModule()`.
 */
function compileNgModuleDeclarationExpression(meta) {
    const definitionMap = new DefinitionMap();
    definitionMap.set('type', new WrappedNodeExpr(meta.type));
    if (meta.bootstrap !== undefined) {
        definitionMap.set('bootstrap', new WrappedNodeExpr(meta.bootstrap));
    }
    if (meta.declarations !== undefined) {
        definitionMap.set('declarations', new WrappedNodeExpr(meta.declarations));
    }
    if (meta.imports !== undefined) {
        definitionMap.set('imports', new WrappedNodeExpr(meta.imports));
    }
    if (meta.exports !== undefined) {
        definitionMap.set('exports', new WrappedNodeExpr(meta.exports));
    }
    if (meta.schemas !== undefined) {
        definitionMap.set('schemas', new WrappedNodeExpr(meta.schemas));
    }
    if (meta.id !== undefined) {
        definitionMap.set('id', new WrappedNodeExpr(meta.id));
    }
    return importExpr(Identifiers.defineNgModule).callFn([definitionMap.toLiteralMap()]);
}
function createNgModuleType(meta) {
    if (meta.kind === exports.R3NgModuleMetadataKind.Local) {
        return new ExpressionType(meta.type.value);
    }
    const { type: moduleType, declarations, exports: exports$1, imports, includeImportTypes, publicDeclarationTypes, } = meta;
    return new ExpressionType(importExpr(Identifiers.NgModuleDeclaration, [
        new ExpressionType(moduleType.type),
        publicDeclarationTypes === null
            ? tupleTypeOf(declarations)
            : tupleOfTypes(publicDeclarationTypes),
        includeImportTypes ? tupleTypeOf(imports) : NONE_TYPE,
        tupleTypeOf(exports$1),
    ]));
}
/**
 * Generates a function call to `ɵɵsetNgModuleScope` with all necessary information so that the
 * transitive module scope can be computed during runtime in JIT mode. This call is marked pure
 * such that the references to declarations, imports and exports may be elided causing these
 * symbols to become tree-shakeable.
 */
function generateSetNgModuleScopeCall(meta) {
    const scopeMap = new DefinitionMap();
    if (meta.kind === exports.R3NgModuleMetadataKind.Global) {
        if (meta.declarations.length > 0) {
            scopeMap.set('declarations', refsToArray(meta.declarations, meta.containsForwardDecls));
        }
    }
    else {
        if (meta.declarationsExpression) {
            scopeMap.set('declarations', meta.declarationsExpression);
        }
    }
    if (meta.kind === exports.R3NgModuleMetadataKind.Global) {
        if (meta.imports.length > 0) {
            scopeMap.set('imports', refsToArray(meta.imports, meta.containsForwardDecls));
        }
    }
    else {
        if (meta.importsExpression) {
            scopeMap.set('imports', meta.importsExpression);
        }
    }
    if (meta.kind === exports.R3NgModuleMetadataKind.Global) {
        if (meta.exports.length > 0) {
            scopeMap.set('exports', refsToArray(meta.exports, meta.containsForwardDecls));
        }
    }
    else {
        if (meta.exportsExpression) {
            scopeMap.set('exports', meta.exportsExpression);
        }
    }
    if (meta.kind === exports.R3NgModuleMetadataKind.Local && meta.bootstrapExpression) {
        scopeMap.set('bootstrap', meta.bootstrapExpression);
    }
    if (Object.keys(scopeMap.values).length === 0) {
        return null;
    }
    // setNgModuleScope(...)
    const fnCall = new InvokeFunctionExpr(
    /* fn */ importExpr(Identifiers.setNgModuleScope), 
    /* args */ [meta.type.value, scopeMap.toLiteralMap()]);
    // (ngJitMode guard) && setNgModuleScope(...)
    const guardedCall = jitOnlyGuardedExpression(fnCall);
    // function() { (ngJitMode guard) && setNgModuleScope(...); }
    const iife = new FunctionExpr(/* params */ [], /* statements */ [guardedCall.toStmt()]);
    // (function() { (ngJitMode guard) && setNgModuleScope(...); })()
    const iifeCall = new InvokeFunctionExpr(/* fn */ iife, /* args */ []);
    return iifeCall.toStmt();
}
function tupleTypeOf(exp) {
    const types = exp.map((ref) => typeofExpr(ref.type));
    return exp.length > 0 ? expressionType(literalArr(types)) : NONE_TYPE;
}
function tupleOfTypes(types) {
    const typeofTypes = types.map((type) => typeofExpr(type));
    return types.length > 0 ? expressionType(literalArr(typeofTypes)) : NONE_TYPE;
}

function compilePipeFromMetadata(metadata) {
    const definitionMapValues = [];
    // e.g. `name: 'myPipe'`
    definitionMapValues.push({ key: 'name', value: literal$1(metadata.pipeName), quoted: false });
    // e.g. `type: MyPipe`
    definitionMapValues.push({ key: 'type', value: metadata.type.value, quoted: false });
    // e.g. `pure: true`
    definitionMapValues.push({ key: 'pure', value: literal$1(metadata.pure), quoted: false });
    if (metadata.isStandalone === false) {
        definitionMapValues.push({ key: 'standalone', value: literal$1(false), quoted: false });
    }
    const expression = importExpr(Identifiers.definePipe)
        .callFn([literalMap(definitionMapValues)], undefined, true);
    const type = createPipeType(metadata);
    return { expression, type, statements: [] };
}
function createPipeType(metadata) {
    return new ExpressionType(importExpr(Identifiers.PipeDeclaration, [
        typeWithParameters(metadata.type.type, metadata.typeArgumentCount),
        new ExpressionType(new LiteralExpr(metadata.pipeName)),
        new ExpressionType(new LiteralExpr(metadata.isStandalone)),
    ]));
}

exports.R3TemplateDependencyKind = void 0;
(function (R3TemplateDependencyKind) {
    R3TemplateDependencyKind[R3TemplateDependencyKind["Directive"] = 0] = "Directive";
    R3TemplateDependencyKind[R3TemplateDependencyKind["Pipe"] = 1] = "Pipe";
    R3TemplateDependencyKind[R3TemplateDependencyKind["NgModule"] = 2] = "NgModule";
})(exports.R3TemplateDependencyKind || (exports.R3TemplateDependencyKind = {}));

/**
 * The following set contains all keywords that can be used in the animation css shorthand
 * property and is used during the scoping of keyframes to make sure such keywords
 * are not modified.
 */
const animationKeywords = new Set([
    // global values
    'inherit',
    'initial',
    'revert',
    'unset',
    // animation-direction
    'alternate',
    'alternate-reverse',
    'normal',
    'reverse',
    // animation-fill-mode
    'backwards',
    'both',
    'forwards',
    'none',
    // animation-play-state
    'paused',
    'running',
    // animation-timing-function
    'ease',
    'ease-in',
    'ease-in-out',
    'ease-out',
    'linear',
    'step-start',
    'step-end',
    // `steps()` function
    'end',
    'jump-both',
    'jump-end',
    'jump-none',
    'jump-start',
    'start',
]);
/**
 * The following array contains all of the CSS at-rule identifiers which are scoped.
 */
const scopedAtRuleIdentifiers = [
    '@media',
    '@supports',
    '@document',
    '@layer',
    '@container',
    '@scope',
    '@starting-style',
];
/**
 * The following class has its origin from a port of shadowCSS from webcomponents.js to TypeScript.
 * It has since diverge in many ways to tailor Angular's needs.
 *
 * Source:
 * https://github.com/webcomponents/webcomponentsjs/blob/4efecd7e0e/src/ShadowCSS/ShadowCSS.js
 *
 * The original file level comment is reproduced below
 */
/*
  This is a limited shim for ShadowDOM css styling.
  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles

  The intention here is to support only the styling features which can be
  relatively simply implemented. The goal is to allow users to avoid the
  most obvious pitfalls and do so without compromising performance significantly.
  For ShadowDOM styling that's not covered here, a set of best practices
  can be provided that should allow users to accomplish more complex styling.

  The following is a list of specific ShadowDOM styling features and a brief
  discussion of the approach used to shim.

  Shimmed features:

  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
  element using the :host rule. To shim this feature, the :host styles are
  reformatted and prefixed with a given scope name and promoted to a
  document level stylesheet.
  For example, given a scope name of .foo, a rule like this:

    :host {
        background: red;
      }
    }

  becomes:

    .foo {
      background: red;
    }

  * encapsulation: Styles defined within ShadowDOM, apply only to
  dom inside the ShadowDOM.
  The selectors are scoped by adding an attribute selector suffix to each
  simple selector that contains the host element tag name. Each element
  in the element's ShadowDOM template is also given the scope attribute.
  Thus, these rules match only elements that have the scope attribute.
  For example, given a scope name of x-foo, a rule like this:

    div {
      font-weight: bold;
    }

  becomes:

    div[x-foo] {
      font-weight: bold;
    }

  Note that elements that are dynamically added to a scope must have the scope
  selector added to them manually.

  * upper/lower bound encapsulation: Styles which are defined outside a
  shadowRoot should not cross the ShadowDOM boundary and should not apply
  inside a shadowRoot.

  This styling behavior is not emulated. Some possible ways to do this that
  were rejected due to complexity and/or performance concerns include: (1) reset
  every possible property for every possible selector for a given scope name;
  (2) re-implement css in javascript.

  As an alternative, users should make sure to use selectors
  specific to the scope in which they are working.

  * ::distributed: This behavior is not emulated. It's often not necessary
  to style the contents of a specific insertion point and instead, descendants
  of the host element can be styled selectively. Users can also create an
  extra node around an insertion point and style that node's contents
  via descendent selectors. For example, with a shadowRoot like this:

    <style>
      ::content(div) {
        background: red;
      }
    </style>
    <content></content>

  could become:

    <style>
      / *@polyfill .content-container div * /
      ::content(div) {
        background: red;
      }
    </style>
    <div class="content-container">
      <content></content>
    </div>

  Note the use of @polyfill in the comment above a ShadowDOM specific style
  declaration. This is a directive to the    styling shim to use the selector
  in comments in lieu of the next selector when running under polyfill.
*/
class ShadowCss {
    /*
     * Shim some cssText with the given selector. Returns cssText that can be included in the document
     *
     * The selector is the attribute added to all elements inside the host,
     * The hostSelector is the attribute added to the host itself.
     */
    shimCssText(cssText, selector, hostSelector = '') {
        // **NOTE**: Do not strip comments as this will cause component sourcemaps to break
        // due to shift in lines.
        // Collect comments and replace them with a placeholder, this is done to avoid complicating
        // the rule parsing RegExp and keep it safer.
        const comments = [];
        cssText = cssText.replace(_commentRe, (m) => {
            if (m.match(_commentWithHashRe)) {
                comments.push(m);
            }
            else {
                // Replace non hash comments with empty lines.
                // This is done so that we do not leak any sensitive data in comments.
                const newLinesMatches = m.match(_newLinesRe);
                comments.push((newLinesMatches?.join('') ?? '') + '\n');
            }
            return COMMENT_PLACEHOLDER;
        });
        cssText = this._insertDirectives(cssText);
        const scopedCssText = this._scopeCssText(cssText, selector, hostSelector);
        // Add back comments at the original position.
        let commentIdx = 0;
        return scopedCssText.replace(_commentWithHashPlaceHolderRe, () => comments[commentIdx++]);
    }
    _insertDirectives(cssText) {
        cssText = this._insertPolyfillDirectivesInCssText(cssText);
        return this._insertPolyfillRulesInCssText(cssText);
    }
    /**
     * Process styles to add scope to keyframes.
     *
     * Modify both the names of the keyframes defined in the component styles and also the css
     * animation rules using them.
     *
     * Animation rules using keyframes defined elsewhere are not modified to allow for globally
     * defined keyframes.
     *
     * For example, we convert this css:
     *
     * ```scss
     * .box {
     *   animation: box-animation 1s forwards;
     * }
     *
     * @keyframes box-animation {
     *   to {
     *     background-color: green;
     *   }
     * }
     * ```
     *
     * to this:
     *
     * ```scss
     * .box {
     *   animation: scopeName_box-animation 1s forwards;
     * }
     *
     * @keyframes scopeName_box-animation {
     *   to {
     *     background-color: green;
     *   }
     * }
     * ```
     *
     * @param cssText the component's css text that needs to be scoped.
     * @param scopeSelector the component's scope selector.
     *
     * @returns the scoped css text.
     */
    _scopeKeyframesRelatedCss(cssText, scopeSelector) {
        const unscopedKeyframesSet = new Set();
        const scopedKeyframesCssText = processRules(cssText, (rule) => this._scopeLocalKeyframeDeclarations(rule, scopeSelector, unscopedKeyframesSet));
        return processRules(scopedKeyframesCssText, (rule) => this._scopeAnimationRule(rule, scopeSelector, unscopedKeyframesSet));
    }
    /**
     * Scopes local keyframes names, returning the updated css rule and it also
     * adds the original keyframe name to a provided set to collect all keyframes names
     * so that it can later be used to scope the animation rules.
     *
     * For example, it takes a rule such as:
     *
     * ```scss
     * @keyframes box-animation {
     *   to {
     *     background-color: green;
     *   }
     * }
     * ```
     *
     * and returns:
     *
     * ```scss
     * @keyframes scopeName_box-animation {
     *   to {
     *     background-color: green;
     *   }
     * }
     * ```
     * and as a side effect it adds "box-animation" to the `unscopedKeyframesSet` set
     *
     * @param cssRule the css rule to process.
     * @param scopeSelector the component's scope selector.
     * @param unscopedKeyframesSet the set of unscoped keyframes names (which can be
     * modified as a side effect)
     *
     * @returns the css rule modified with the scoped keyframes name.
     */
    _scopeLocalKeyframeDeclarations(rule, scopeSelector, unscopedKeyframesSet) {
        return {
            ...rule,
            selector: rule.selector.replace(/(^@(?:-webkit-)?keyframes(?:\s+))(['"]?)(.+)\2(\s*)$/, (_, start, quote, keyframeName, endSpaces) => {
                unscopedKeyframesSet.add(unescapeQuotes(keyframeName, quote));
                return `${start}${quote}${scopeSelector}_${keyframeName}${quote}${endSpaces}`;
            }),
        };
    }
    /**
     * Function used to scope a keyframes name (obtained from an animation declaration)
     * using an existing set of unscopedKeyframes names to discern if the scoping needs to be
     * performed (keyframes names of keyframes not defined in the component's css need not to be
     * scoped).
     *
     * @param keyframe the keyframes name to check.
     * @param scopeSelector the component's scope selector.
     * @param unscopedKeyframesSet the set of unscoped keyframes names.
     *
     * @returns the scoped name of the keyframe, or the original name is the name need not to be
     * scoped.
     */
    _scopeAnimationKeyframe(keyframe, scopeSelector, unscopedKeyframesSet) {
        return keyframe.replace(/^(\s*)(['"]?)(.+?)\2(\s*)$/, (_, spaces1, quote, name, spaces2) => {
            name = `${unscopedKeyframesSet.has(unescapeQuotes(name, quote)) ? scopeSelector + '_' : ''}${name}`;
            return `${spaces1}${quote}${name}${quote}${spaces2}`;
        });
    }
    /**
     * Regular expression used to extrapolate the possible keyframes from an
     * animation declaration (with possibly multiple animation definitions)
     *
     * The regular expression can be divided in three parts
     *  - (^|\s+|,)
     *    captures how many (if any) leading whitespaces are present or a comma
     *  - (?:(?:(['"])((?:\\\\|\\\2|(?!\2).)+)\2)|(-?[A-Za-z][\w\-]*))
     *    captures two different possible keyframes, ones which are quoted or ones which are valid css
     * indents (custom properties excluded)
     *  - (?=[,\s;]|$)
     *    simply matches the end of the possible keyframe, valid endings are: a comma, a space, a
     * semicolon or the end of the string
     */
    _animationDeclarationKeyframesRe = /(^|\s+|,)(?:(?:(['"])((?:\\\\|\\\2|(?!\2).)+)\2)|(-?[A-Za-z][\w\-]*))(?=[,\s]|$)/g;
    /**
     * Scope an animation rule so that the keyframes mentioned in such rule
     * are scoped if defined in the component's css and left untouched otherwise.
     *
     * It can scope values of both the 'animation' and 'animation-name' properties.
     *
     * @param rule css rule to scope.
     * @param scopeSelector the component's scope selector.
     * @param unscopedKeyframesSet the set of unscoped keyframes names.
     *
     * @returns the updated css rule.
     **/
    _scopeAnimationRule(rule, scopeSelector, unscopedKeyframesSet) {
        let content = rule.content.replace(/((?:^|\s+|;)(?:-webkit-)?animation\s*:\s*),*([^;]+)/g, (_, start, animationDeclarations) => start +
            animationDeclarations.replace(this._animationDeclarationKeyframesRe, (original, leadingSpaces, quote = '', quotedName, nonQuotedName) => {
                if (quotedName) {
                    return `${leadingSpaces}${this._scopeAnimationKeyframe(`${quote}${quotedName}${quote}`, scopeSelector, unscopedKeyframesSet)}`;
                }
                else {
                    return animationKeywords.has(nonQuotedName)
                        ? original
                        : `${leadingSpaces}${this._scopeAnimationKeyframe(nonQuotedName, scopeSelector, unscopedKeyframesSet)}`;
                }
            }));
        content = content.replace(/((?:^|\s+|;)(?:-webkit-)?animation-name(?:\s*):(?:\s*))([^;]+)/g, (_match, start, commaSeparatedKeyframes) => `${start}${commaSeparatedKeyframes
            .split(',')
            .map((keyframe) => this._scopeAnimationKeyframe(keyframe, scopeSelector, unscopedKeyframesSet))
            .join(',')}`);
        return { ...rule, content };
    }
    /*
     * Process styles to convert native ShadowDOM rules that will trip
     * up the css parser; we rely on decorating the stylesheet with inert rules.
     *
     * For example, we convert this rule:
     *
     * polyfill-next-selector { content: ':host menu-item'; }
     * ::content menu-item {
     *
     * to this:
     *
     * scopeName menu-item {
     *
     **/
    _insertPolyfillDirectivesInCssText(cssText) {
        return cssText.replace(_cssContentNextSelectorRe, function (...m) {
            return m[2] + '{';
        });
    }
    /*
     * Process styles to add rules which will only apply under the polyfill
     *
     * For example, we convert this rule:
     *
     * polyfill-rule {
     *   content: ':host menu-item';
     * ...
     * }
     *
     * to this:
     *
     * scopeName menu-item {...}
     *
     **/
    _insertPolyfillRulesInCssText(cssText) {
        return cssText.replace(_cssContentRuleRe, (...m) => {
            const rule = m[0].replace(m[1], '').replace(m[2], '');
            return m[4] + rule;
        });
    }
    /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
     *
     *  .foo {... }
     *
     *  and converts this to
     *
     *  scopeName .foo { ... }
     */
    _scopeCssText(cssText, scopeSelector, hostSelector) {
        const unscopedRules = this._extractUnscopedRulesFromCssText(cssText);
        // replace :host and :host-context with -shadowcsshost and -shadowcsshostcontext respectively
        cssText = this._insertPolyfillHostInCssText(cssText);
        cssText = this._convertColonHost(cssText);
        cssText = this._convertColonHostContext(cssText);
        cssText = this._convertShadowDOMSelectors(cssText);
        if (scopeSelector) {
            cssText = this._scopeKeyframesRelatedCss(cssText, scopeSelector);
            cssText = this._scopeSelectors(cssText, scopeSelector, hostSelector);
        }
        cssText = cssText + '\n' + unscopedRules;
        return cssText.trim();
    }
    /*
     * Process styles to add rules which will only apply under the polyfill
     * and do not process via CSSOM. (CSSOM is destructive to rules on rare
     * occasions, e.g. -webkit-calc on Safari.)
     * For example, we convert this rule:
     *
     * @polyfill-unscoped-rule {
     *   content: 'menu-item';
     * ... }
     *
     * to this:
     *
     * menu-item {...}
     *
     **/
    _extractUnscopedRulesFromCssText(cssText) {
        let r = '';
        let m;
        _cssContentUnscopedRuleRe.lastIndex = 0;
        while ((m = _cssContentUnscopedRuleRe.exec(cssText)) !== null) {
            const rule = m[0].replace(m[2], '').replace(m[1], m[4]);
            r += rule + '\n\n';
        }
        return r;
    }
    /*
     * convert a rule like :host(.foo) > .bar { }
     *
     * to
     *
     * .foo<scopeName> > .bar
     */
    _convertColonHost(cssText) {
        return cssText.replace(_cssColonHostRe, (_, hostSelectors, otherSelectors) => {
            if (hostSelectors) {
                const convertedSelectors = [];
                const hostSelectorArray = hostSelectors.split(',').map((p) => p.trim());
                for (const hostSelector of hostSelectorArray) {
                    if (!hostSelector)
                        break;
                    const convertedSelector = _polyfillHostNoCombinator + hostSelector.replace(_polyfillHost, '') + otherSelectors;
                    convertedSelectors.push(convertedSelector);
                }
                return convertedSelectors.join(',');
            }
            else {
                return _polyfillHostNoCombinator + otherSelectors;
            }
        });
    }
    /*
     * convert a rule like :host-context(.foo) > .bar { }
     *
     * to
     *
     * .foo<scopeName> > .bar, .foo <scopeName> > .bar { }
     *
     * and
     *
     * :host-context(.foo:host) .bar { ... }
     *
     * to
     *
     * .foo<scopeName> .bar { ... }
     */
    _convertColonHostContext(cssText) {
        const length = cssText.length;
        let parens = 0;
        let prev = 0;
        let result = '';
        // Splits up the selectors on their top-level commas, processes the :host-context in them
        // individually and stitches them back together. This ensures that individual selectors don't
        // affect each other.
        for (let i = 0; i < length; i++) {
            const char = cssText[i];
            // If we hit a comma and there are no open parentheses, take the current chunk and process it.
            if (char === ',' && parens === 0) {
                result += this._convertColonHostContextInSelectorPart(cssText.slice(prev, i)) + ',';
                prev = i + 1;
                continue;
            }
            // We've hit the end. Take everything since the last comma.
            if (i === length - 1) {
                result += this._convertColonHostContextInSelectorPart(cssText.slice(prev));
                break;
            }
            if (char === '(') {
                parens++;
            }
            else if (char === ')') {
                parens--;
            }
        }
        return result;
    }
    _convertColonHostContextInSelectorPart(cssText) {
        return cssText.replace(_cssColonHostContextReGlobal, (selectorText, pseudoPrefix) => {
            // We have captured a selector that contains a `:host-context` rule.
            // For backward compatibility `:host-context` may contain a comma separated list of selectors.
            // Each context selector group will contain a list of host-context selectors that must match
            // an ancestor of the host.
            // (Normally `contextSelectorGroups` will only contain a single array of context selectors.)
            const contextSelectorGroups = [[]];
            // There may be more than `:host-context` in this selector so `selectorText` could look like:
            // `:host-context(.one):host-context(.two)`.
            // Execute `_cssColonHostContextRe` over and over until we have extracted all the
            // `:host-context` selectors from this selector.
            let match;
            while ((match = _cssColonHostContextRe.exec(selectorText))) {
                // `match` = [':host-context(<selectors>)<rest>', <selectors>, <rest>]
                // The `<selectors>` could actually be a comma separated list: `:host-context(.one, .two)`.
                const newContextSelectors = (match[1] ?? '')
                    .trim()
                    .split(',')
                    .map((m) => m.trim())
                    .filter((m) => m !== '');
                // We must duplicate the current selector group for each of these new selectors.
                // For example if the current groups are:
                // ```
                // [
                //   ['a', 'b', 'c'],
                //   ['x', 'y', 'z'],
                // ]
                // ```
                // And we have a new set of comma separated selectors: `:host-context(m,n)` then the new
                // groups are:
                // ```
                // [
                //   ['a', 'b', 'c', 'm'],
                //   ['x', 'y', 'z', 'm'],
                //   ['a', 'b', 'c', 'n'],
                //   ['x', 'y', 'z', 'n'],
                // ]
                // ```
                const contextSelectorGroupsLength = contextSelectorGroups.length;
                repeatGroups(contextSelectorGroups, newContextSelectors.length);
                for (let i = 0; i < newContextSelectors.length; i++) {
                    for (let j = 0; j < contextSelectorGroupsLength; j++) {
                        contextSelectorGroups[j + i * contextSelectorGroupsLength].push(newContextSelectors[i]);
                    }
                }
                // Update the `selectorText` and see repeat to see if there are more `:host-context`s.
                selectorText = match[2];
            }
            // The context selectors now must be combined with each other to capture all the possible
            // selectors that `:host-context` can match. See `_combineHostContextSelectors()` for more
            // info about how this is done.
            return contextSelectorGroups
                .map((contextSelectors) => _combineHostContextSelectors(contextSelectors, selectorText, pseudoPrefix))
                .join(', ');
        });
    }
    /*
     * Convert combinators like ::shadow and pseudo-elements like ::content
     * by replacing with space.
     */
    _convertShadowDOMSelectors(cssText) {
        return _shadowDOMSelectorsRe.reduce((result, pattern) => result.replace(pattern, ' '), cssText);
    }
    // change a selector like 'div' to 'name div'
    _scopeSelectors(cssText, scopeSelector, hostSelector) {
        return processRules(cssText, (rule) => {
            let selector = rule.selector;
            let content = rule.content;
            if (rule.selector[0] !== '@') {
                selector = this._scopeSelector({
                    selector,
                    scopeSelector,
                    hostSelector,
                    isParentSelector: true,
                });
            }
            else if (scopedAtRuleIdentifiers.some((atRule) => rule.selector.startsWith(atRule))) {
                content = this._scopeSelectors(rule.content, scopeSelector, hostSelector);
            }
            else if (rule.selector.startsWith('@font-face') || rule.selector.startsWith('@page')) {
                content = this._stripScopingSelectors(rule.content);
            }
            return new CssRule(selector, content);
        });
    }
    /**
     * Handle a css text that is within a rule that should not contain scope selectors by simply
     * removing them! An example of such a rule is `@font-face`.
     *
     * `@font-face` rules cannot contain nested selectors. Nor can they be nested under a selector.
     * Normally this would be a syntax error by the author of the styles. But in some rare cases, such
     * as importing styles from a library, and applying `:host ::ng-deep` to the imported styles, we
     * can end up with broken css if the imported styles happen to contain @font-face rules.
     *
     * For example:
     *
     * ```
     * :host ::ng-deep {
     *   import 'some/lib/containing/font-face';
     * }
     *
     * Similar logic applies to `@page` rules which can contain a particular set of properties,
     * as well as some specific at-rules. Since they can't be encapsulated, we have to strip
     * any scoping selectors from them. For more information: https://www.w3.org/TR/css-page-3
     * ```
     */
    _stripScopingSelectors(cssText) {
        return processRules(cssText, (rule) => {
            const selector = rule.selector
                .replace(_shadowDeepSelectors, ' ')
                .replace(_polyfillHostNoCombinatorRe, ' ');
            return new CssRule(selector, rule.content);
        });
    }
    _safeSelector;
    _shouldScopeIndicator;
    // `isParentSelector` is used to distinguish the selectors which are coming from
    // the initial selector string and any nested selectors, parsed recursively,
    // for example `selector = 'a:where(.one)'` could be the parent, while recursive call
    // would have `selector = '.one'`.
    _scopeSelector({ selector, scopeSelector, hostSelector, isParentSelector = false, }) {
        // Split the selector into independent parts by `,` (comma) unless
        // comma is within parenthesis, for example `:is(.one, two)`.
        // Negative lookup after comma allows not splitting inside nested parenthesis,
        // up to three levels (((,))).
        const selectorSplitRe = / ?,(?!(?:[^)(]*(?:\([^)(]*(?:\([^)(]*(?:\([^)(]*\)[^)(]*)*\)[^)(]*)*\)[^)(]*)*\))) ?/;
        return selector
            .split(selectorSplitRe)
            .map((part) => part.split(_shadowDeepSelectors))
            .map((deepParts) => {
            const [shallowPart, ...otherParts] = deepParts;
            const applyScope = (shallowPart) => {
                if (this._selectorNeedsScoping(shallowPart, scopeSelector)) {
                    return this._applySelectorScope({
                        selector: shallowPart,
                        scopeSelector,
                        hostSelector,
                        isParentSelector,
                    });
                }
                else {
                    return shallowPart;
                }
            };
            return [applyScope(shallowPart), ...otherParts].join(' ');
        })
            .join(', ');
    }
    _selectorNeedsScoping(selector, scopeSelector) {
        const re = this._makeScopeMatcher(scopeSelector);
        return !re.test(selector);
    }
    _makeScopeMatcher(scopeSelector) {
        const lre = /\[/g;
        const rre = /\]/g;
        scopeSelector = scopeSelector.replace(lre, '\\[').replace(rre, '\\]');
        return new RegExp('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');
    }
    // scope via name and [is=name]
    _applySimpleSelectorScope(selector, scopeSelector, hostSelector) {
        // In Android browser, the lastIndex is not reset when the regex is used in String.replace()
        _polyfillHostRe.lastIndex = 0;
        if (_polyfillHostRe.test(selector)) {
            const replaceBy = `[${hostSelector}]`;
            let result = selector;
            while (result.match(_polyfillHostNoCombinatorRe)) {
                result = result.replace(_polyfillHostNoCombinatorRe, (_hnc, selector) => {
                    return selector.replace(/([^:\)]*)(:*)(.*)/, (_, before, colon, after) => {
                        return before + replaceBy + colon + after;
                    });
                });
            }
            return result.replace(_polyfillHostRe, replaceBy);
        }
        return scopeSelector + ' ' + selector;
    }
    // return a selector with [name] suffix on each simple selector
    // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]  /** @internal */
    _applySelectorScope({ selector, scopeSelector, hostSelector, isParentSelector, }) {
        const isRe = /\[is=([^\]]*)\]/g;
        scopeSelector = scopeSelector.replace(isRe, (_, ...parts) => parts[0]);
        const attrName = `[${scopeSelector}]`;
        const _scopeSelectorPart = (p) => {
            let scopedP = p.trim();
            if (!scopedP) {
                return p;
            }
            if (p.includes(_polyfillHostNoCombinator)) {
                scopedP = this._applySimpleSelectorScope(p, scopeSelector, hostSelector);
                if (!p.match(_polyfillHostNoCombinatorOutsidePseudoFunction)) {
                    const [_, before, colon, after] = scopedP.match(/([^:]*)(:*)([\s\S]*)/);
                    scopedP = before + attrName + colon + after;
                }
            }
            else {
                // remove :host since it should be unnecessary
                const t = p.replace(_polyfillHostRe, '');
                if (t.length > 0) {
                    const matches = t.match(/([^:]*)(:*)([\s\S]*)/);
                    if (matches) {
                        scopedP = matches[1] + attrName + matches[2] + matches[3];
                    }
                }
            }
            return scopedP;
        };
        // Wraps `_scopeSelectorPart()` to not use it directly on selectors with
        // pseudo selector functions like `:where()`. Selectors within pseudo selector
        // functions are recursively sent to `_scopeSelector()`.
        const _pseudoFunctionAwareScopeSelectorPart = (selectorPart) => {
            let scopedPart = '';
            // Collect all outer `:where()` and `:is()` selectors,
            // counting parenthesis to keep nested selectors intact.
            const pseudoSelectorParts = [];
            let pseudoSelectorMatch;
            while ((pseudoSelectorMatch = _cssPrefixWithPseudoSelectorFunction.exec(selectorPart)) !== null) {
                let openedBrackets = 1;
                let index = _cssPrefixWithPseudoSelectorFunction.lastIndex;
                while (index < selectorPart.length) {
                    const currentSymbol = selectorPart[index];
                    index++;
                    if (currentSymbol === '(') {
                        openedBrackets++;
                        continue;
                    }
                    if (currentSymbol === ')') {
                        openedBrackets--;
                        if (openedBrackets === 0) {
                            break;
                        }
                        continue;
                    }
                }
                pseudoSelectorParts.push(`${pseudoSelectorMatch[0]}${selectorPart.slice(_cssPrefixWithPseudoSelectorFunction.lastIndex, index)}`);
                _cssPrefixWithPseudoSelectorFunction.lastIndex = index;
            }
            // If selector consists of only `:where()` and `:is()` on the outer level
            // scope those pseudo-selectors individually, otherwise scope the whole
            // selector.
            if (pseudoSelectorParts.join('') === selectorPart) {
                scopedPart = pseudoSelectorParts
                    .map((selectorPart) => {
                    const [cssPseudoSelectorFunction] = selectorPart.match(_cssPrefixWithPseudoSelectorFunction) ?? [];
                    // Unwrap the pseudo selector to scope its contents.
                    // For example,
                    // - `:where(selectorToScope)` -> `selectorToScope`;
                    // - `:is(.foo, .bar)` -> `.foo, .bar`.
                    const selectorToScope = selectorPart.slice(cssPseudoSelectorFunction?.length, -1);
                    if (selectorToScope.includes(_polyfillHostNoCombinator)) {
                        this._shouldScopeIndicator = true;
                    }
                    const scopedInnerPart = this._scopeSelector({
                        selector: selectorToScope,
                        scopeSelector,
                        hostSelector,
                    });
                    // Put the result back into the pseudo selector function.
                    return `${cssPseudoSelectorFunction}${scopedInnerPart})`;
                })
                    .join('');
            }
            else {
                this._shouldScopeIndicator =
                    this._shouldScopeIndicator || selectorPart.includes(_polyfillHostNoCombinator);
                scopedPart = this._shouldScopeIndicator ? _scopeSelectorPart(selectorPart) : selectorPart;
            }
            return scopedPart;
        };
        if (isParentSelector) {
            this._safeSelector = new SafeSelector(selector);
            selector = this._safeSelector.content();
        }
        let scopedSelector = '';
        let startIndex = 0;
        let res;
        // Combinators aren't used as a delimiter if they are within parenthesis,
        // for example `:where(.one .two)` stays intact.
        // Similarly to selector separation by comma initially, negative lookahead
        // is used here to not break selectors within nested parenthesis up to three
        // nested layers.
        const sep = /( |>|\+|~(?!=))(?!([^)(]*(?:\([^)(]*(?:\([^)(]*(?:\([^)(]*\)[^)(]*)*\)[^)(]*)*\)[^)(]*)*\)))\s*/g;
        // If a selector appears before :host it should not be shimmed as it
        // matches on ancestor elements and not on elements in the host's shadow
        // `:host-context(div)` is transformed to
        // `-shadowcsshost-no-combinatordiv, div -shadowcsshost-no-combinator`
        // the `div` is not part of the component in the 2nd selectors and should not be scoped.
        // Historically `component-tag:host` was matching the component so we also want to preserve
        // this behavior to avoid breaking legacy apps (it should not match).
        // The behavior should be:
        // - `tag:host` -> `tag[h]` (this is to avoid breaking legacy apps, should not match anything)
        // - `tag :host` -> `tag [h]` (`tag` is not scoped because it's considered part of a
        //   `:host-context(tag)`)
        const hasHost = selector.includes(_polyfillHostNoCombinator);
        // Only scope parts after or on the same level as the first `-shadowcsshost-no-combinator`
        // when it is present. The selector has the same level when it is a part of a pseudo
        // selector, like `:where()`, for example `:where(:host, .foo)` would result in `.foo`
        // being scoped.
        if (isParentSelector || this._shouldScopeIndicator) {
            this._shouldScopeIndicator = !hasHost;
        }
        while ((res = sep.exec(selector)) !== null) {
            const separator = res[1];
            // Do not trim the selector, as otherwise this will break sourcemaps
            // when they are defined on multiple lines
            // Example:
            //  div,
            //  p { color: red}
            const part = selector.slice(startIndex, res.index);
            // A space following an escaped hex value and followed by another hex character
            // (ie: ".\fc ber" for ".über") is not a separator between 2 selectors
            // also keep in mind that backslashes are replaced by a placeholder by SafeSelector
            // These escaped selectors happen for example when esbuild runs with optimization.minify.
            if (part.match(/__esc-ph-(\d+)__/) && selector[res.index + 1]?.match(/[a-fA-F\d]/)) {
                continue;
            }
            const scopedPart = _pseudoFunctionAwareScopeSelectorPart(part);
            scopedSelector += `${scopedPart} ${separator} `;
            startIndex = sep.lastIndex;
        }
        const part = selector.substring(startIndex);
        scopedSelector += _pseudoFunctionAwareScopeSelectorPart(part);
        // replace the placeholders with their original values
        // using values stored inside the `safeSelector` instance.
        return this._safeSelector.restore(scopedSelector);
    }
    _insertPolyfillHostInCssText(selector) {
        return selector
            .replace(_colonHostContextRe, _polyfillHostContext)
            .replace(_colonHostRe, _polyfillHost);
    }
}
class SafeSelector {
    placeholders = [];
    index = 0;
    _content;
    constructor(selector) {
        // Replaces attribute selectors with placeholders.
        // The WS in [attr="va lue"] would otherwise be interpreted as a selector separator.
        selector = this._escapeRegexMatches(selector, /(\[[^\]]*\])/g);
        // CSS allows for certain special characters to be used in selectors if they're escaped.
        // E.g. `.foo:blue` won't match a class called `foo:blue`, because the colon denotes a
        // pseudo-class, but writing `.foo\:blue` will match, because the colon was escaped.
        // Replace all escape sequences (`\` followed by a character) with a placeholder so
        // that our handling of pseudo-selectors doesn't mess with them.
        // Escaped characters have a specific placeholder so they can be detected separately.
        selector = selector.replace(/(\\.)/g, (_, keep) => {
            const replaceBy = `__esc-ph-${this.index}__`;
            this.placeholders.push(keep);
            this.index++;
            return replaceBy;
        });
        // Replaces the expression in `:nth-child(2n + 1)` with a placeholder.
        // WS and "+" would otherwise be interpreted as selector separators.
        this._content = selector.replace(/(:nth-[-\w]+)(\([^)]+\))/g, (_, pseudo, exp) => {
            const replaceBy = `__ph-${this.index}__`;
            this.placeholders.push(exp);
            this.index++;
            return pseudo + replaceBy;
        });
    }
    restore(content) {
        return content.replace(/__(?:ph|esc-ph)-(\d+)__/g, (_ph, index) => this.placeholders[+index]);
    }
    content() {
        return this._content;
    }
    /**
     * Replaces all of the substrings that match a regex within a
     * special string (e.g. `__ph-0__`, `__ph-1__`, etc).
     */
    _escapeRegexMatches(content, pattern) {
        return content.replace(pattern, (_, keep) => {
            const replaceBy = `__ph-${this.index}__`;
            this.placeholders.push(keep);
            this.index++;
            return replaceBy;
        });
    }
}
const _cssScopedPseudoFunctionPrefix = '(:(where|is)\\()?';
const _cssPrefixWithPseudoSelectorFunction = /:(where|is)\(/gi;
const _cssContentNextSelectorRe = /polyfill-next-selector[^}]*content:[\s]*?(['"])(.*?)\1[;\s]*}([^{]*?){/gim;
const _cssContentRuleRe = /(polyfill-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim;
const _cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim;
const _polyfillHost = '-shadowcsshost';
// note: :host-context pre-processed to -shadowcsshostcontext.
const _polyfillHostContext = '-shadowcsscontext';
const _parenSuffix = '(?:\\((' + '(?:\\([^)(]*\\)|[^)(]*)+?' + ')\\))';
const _cssColonHostRe = new RegExp(_polyfillHost + _parenSuffix + '?([^,{]*)', 'gim');
// note: :host-context patterns are terminated with `{`, as opposed to :host which
// is both `{` and `,` because :host-context handles top-level commas differently.
const _hostContextPattern = _polyfillHostContext + _parenSuffix + '?([^{]*)';
const _cssColonHostContextReGlobal = new RegExp(`${_cssScopedPseudoFunctionPrefix}(${_hostContextPattern})`, 'gim');
const _cssColonHostContextRe = new RegExp(_hostContextPattern, 'im');
const _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';
const _polyfillHostNoCombinatorOutsidePseudoFunction = new RegExp(`${_polyfillHostNoCombinator}(?![^(]*\\))`, 'g');
const _polyfillHostNoCombinatorRe = /-shadowcsshost-no-combinator([^\s,]*)/;
const _shadowDOMSelectorsRe = [
    /::shadow/g,
    /::content/g,
    // Deprecated selectors
    /\/shadow-deep\//g,
    /\/shadow\//g,
];
// The deep combinator is deprecated in the CSS spec
// Support for `>>>`, `deep`, `::ng-deep` is then also deprecated and will be removed in the future.
// see https://github.com/angular/angular/pull/17677
const _shadowDeepSelectors = /(?:>>>)|(?:\/deep\/)|(?:::ng-deep)/g;
const _selectorReSuffix = '([>\\s~+[.,{:][\\s\\S]*)?$';
const _polyfillHostRe = /-shadowcsshost/gim;
const _colonHostRe = /:host/gim;
const _colonHostContextRe = /:host-context/gim;
const _newLinesRe = /\r?\n/g;
const _commentRe = /\/\*[\s\S]*?\*\//g;
const _commentWithHashRe = /\/\*\s*#\s*source(Mapping)?URL=/g;
const COMMENT_PLACEHOLDER = '%COMMENT%';
const _commentWithHashPlaceHolderRe = new RegExp(COMMENT_PLACEHOLDER, 'g');
const BLOCK_PLACEHOLDER = '%BLOCK%';
const _ruleRe = new RegExp(`(\\s*(?:${COMMENT_PLACEHOLDER}\\s*)*)([^;\\{\\}]+?)(\\s*)((?:{%BLOCK%}?\\s*;?)|(?:\\s*;))`, 'g');
const CONTENT_PAIRS = new Map([['{', '}']]);
const COMMA_IN_PLACEHOLDER = '%COMMA_IN_PLACEHOLDER%';
const SEMI_IN_PLACEHOLDER = '%SEMI_IN_PLACEHOLDER%';
const COLON_IN_PLACEHOLDER = '%COLON_IN_PLACEHOLDER%';
const _cssCommaInPlaceholderReGlobal = new RegExp(COMMA_IN_PLACEHOLDER, 'g');
const _cssSemiInPlaceholderReGlobal = new RegExp(SEMI_IN_PLACEHOLDER, 'g');
const _cssColonInPlaceholderReGlobal = new RegExp(COLON_IN_PLACEHOLDER, 'g');
class CssRule {
    selector;
    content;
    constructor(selector, content) {
        this.selector = selector;
        this.content = content;
    }
}
function processRules(input, ruleCallback) {
    const escaped = escapeInStrings(input);
    const inputWithEscapedBlocks = escapeBlocks(escaped, CONTENT_PAIRS, BLOCK_PLACEHOLDER);
    let nextBlockIndex = 0;
    const escapedResult = inputWithEscapedBlocks.escapedString.replace(_ruleRe, (...m) => {
        const selector = m[2];
        let content = '';
        let suffix = m[4];
        let contentPrefix = '';
        if (suffix && suffix.startsWith('{' + BLOCK_PLACEHOLDER)) {
            content = inputWithEscapedBlocks.blocks[nextBlockIndex++];
            suffix = suffix.substring(BLOCK_PLACEHOLDER.length + 1);
            contentPrefix = '{';
        }
        const rule = ruleCallback(new CssRule(selector, content));
        return `${m[1]}${rule.selector}${m[3]}${contentPrefix}${rule.content}${suffix}`;
    });
    return unescapeInStrings(escapedResult);
}
class StringWithEscapedBlocks {
    escapedString;
    blocks;
    constructor(escapedString, blocks) {
        this.escapedString = escapedString;
        this.blocks = blocks;
    }
}
function escapeBlocks(input, charPairs, placeholder) {
    const resultParts = [];
    const escapedBlocks = [];
    let openCharCount = 0;
    let nonBlockStartIndex = 0;
    let blockStartIndex = -1;
    let openChar;
    let closeChar;
    for (let i = 0; i < input.length; i++) {
        const char = input[i];
        if (char === '\\') {
            i++;
        }
        else if (char === closeChar) {
            openCharCount--;
            if (openCharCount === 0) {
                escapedBlocks.push(input.substring(blockStartIndex, i));
                resultParts.push(placeholder);
                nonBlockStartIndex = i;
                blockStartIndex = -1;
                openChar = closeChar = undefined;
            }
        }
        else if (char === openChar) {
            openCharCount++;
        }
        else if (openCharCount === 0 && charPairs.has(char)) {
            openChar = char;
            closeChar = charPairs.get(char);
            openCharCount = 1;
            blockStartIndex = i + 1;
            resultParts.push(input.substring(nonBlockStartIndex, blockStartIndex));
        }
    }
    if (blockStartIndex !== -1) {
        escapedBlocks.push(input.substring(blockStartIndex));
        resultParts.push(placeholder);
    }
    else {
        resultParts.push(input.substring(nonBlockStartIndex));
    }
    return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks);
}
/**
 * Object containing as keys characters that should be substituted by placeholders
 * when found in strings during the css text parsing, and as values the respective
 * placeholders
 */
const ESCAPE_IN_STRING_MAP = {
    ';': SEMI_IN_PLACEHOLDER,
    ',': COMMA_IN_PLACEHOLDER,
    ':': COLON_IN_PLACEHOLDER,
};
/**
 * Parse the provided css text and inside strings (meaning, inside pairs of unescaped single or
 * double quotes) replace specific characters with their respective placeholders as indicated
 * by the `ESCAPE_IN_STRING_MAP` map.
 *
 * For example convert the text
 *  `animation: "my-anim:at\"ion" 1s;`
 * to
 *  `animation: "my-anim%COLON_IN_PLACEHOLDER%at\"ion" 1s;`
 *
 * This is necessary in order to remove the meaning of some characters when found inside strings
 * (for example `;` indicates the end of a css declaration, `,` the sequence of values and `:` the
 * division between property and value during a declaration, none of these meanings apply when such
 * characters are within strings and so in order to prevent parsing issues they need to be replaced
 * with placeholder text for the duration of the css manipulation process).
 *
 * @param input the original css text.
 *
 * @returns the css text with specific characters in strings replaced by placeholders.
 **/
function escapeInStrings(input) {
    let result = input;
    let currentQuoteChar = null;
    for (let i = 0; i < result.length; i++) {
        const char = result[i];
        if (char === '\\') {
            i++;
        }
        else {
            if (currentQuoteChar !== null) {
                // index i is inside a quoted sub-string
                if (char === currentQuoteChar) {
                    currentQuoteChar = null;
                }
                else {
                    const placeholder = ESCAPE_IN_STRING_MAP[char];
                    if (placeholder) {
                        result = `${result.substr(0, i)}${placeholder}${result.substr(i + 1)}`;
                        i += placeholder.length - 1;
                    }
                }
            }
            else if (char === "'" || char === '"') {
                currentQuoteChar = char;
            }
        }
    }
    return result;
}
/**
 * Replace in a string all occurrences of keys in the `ESCAPE_IN_STRING_MAP` map with their
 * original representation, this is simply used to revert the changes applied by the
 * escapeInStrings function.
 *
 * For example it reverts the text:
 *  `animation: "my-anim%COLON_IN_PLACEHOLDER%at\"ion" 1s;`
 * to it's original form of:
 *  `animation: "my-anim:at\"ion" 1s;`
 *
 * Note: For the sake of simplicity this function does not check that the placeholders are
 * actually inside strings as it would anyway be extremely unlikely to find them outside of strings.
 *
 * @param input the css text containing the placeholders.
 *
 * @returns the css text without the placeholders.
 */
function unescapeInStrings(input) {
    let result = input.replace(_cssCommaInPlaceholderReGlobal, ',');
    result = result.replace(_cssSemiInPlaceholderReGlobal, ';');
    result = result.replace(_cssColonInPlaceholderReGlobal, ':');
    return result;
}
/**
 * Unescape all quotes present in a string, but only if the string was actually already
 * quoted.
 *
 * This generates a "canonical" representation of strings which can be used to match strings
 * which would otherwise only differ because of differently escaped quotes.
 *
 * For example it converts the string (assumed to be quoted):
 *  `this \\"is\\" a \\'\\\\'test`
 * to:
 *  `this "is" a '\\\\'test`
 * (note that the latter backslashes are not removed as they are not actually escaping the single
 * quote)
 *
 *
 * @param input the string possibly containing escaped quotes.
 * @param isQuoted boolean indicating whether the string was quoted inside a bigger string (if not
 * then it means that it doesn't represent an inner string and thus no unescaping is required)
 *
 * @returns the string in the "canonical" representation without escaped quotes.
 */
function unescapeQuotes(str, isQuoted) {
    return !isQuoted ? str : str.replace(/((?:^|[^\\])(?:\\\\)*)\\(?=['"])/g, '$1');
}
/**
 * Combine the `contextSelectors` with the `hostMarker` and the `otherSelectors`
 * to create a selector that matches the same as `:host-context()`.
 *
 * Given a single context selector `A` we need to output selectors that match on the host and as an
 * ancestor of the host:
 *
 * ```
 * A <hostMarker>, A<hostMarker> {}
 * ```
 *
 * When there is more than one context selector we also have to create combinations of those
 * selectors with each other. For example if there are `A` and `B` selectors the output is:
 *
 * ```
 * AB<hostMarker>, AB <hostMarker>, A B<hostMarker>,
 * B A<hostMarker>, A B <hostMarker>, B A <hostMarker> {}
 * ```
 *
 * And so on...
 *
 * @param contextSelectors an array of context selectors that will be combined.
 * @param otherSelectors the rest of the selectors that are not context selectors.
 */
function _combineHostContextSelectors(contextSelectors, otherSelectors, pseudoPrefix = '') {
    const hostMarker = _polyfillHostNoCombinator;
    _polyfillHostRe.lastIndex = 0; // reset the regex to ensure we get an accurate test
    const otherSelectorsHasHost = _polyfillHostRe.test(otherSelectors);
    // If there are no context selectors then just output a host marker
    if (contextSelectors.length === 0) {
        return hostMarker + otherSelectors;
    }
    const combined = [contextSelectors.pop() || ''];
    while (contextSelectors.length > 0) {
        const length = combined.length;
        const contextSelector = contextSelectors.pop();
        for (let i = 0; i < length; i++) {
            const previousSelectors = combined[i];
            // Add the new selector as a descendant of the previous selectors
            combined[length * 2 + i] = previousSelectors + ' ' + contextSelector;
            // Add the new selector as an ancestor of the previous selectors
            combined[length + i] = contextSelector + ' ' + previousSelectors;
            // Add the new selector to act on the same element as the previous selectors
            combined[i] = contextSelector + previousSelectors;
        }
    }
    // Finally connect the selector to the `hostMarker`s: either acting directly on the host
    // (A<hostMarker>) or as an ancestor (A <hostMarker>).
    return combined
        .map((s) => otherSelectorsHasHost
        ? `${pseudoPrefix}${s}${otherSelectors}`
        : `${pseudoPrefix}${s}${hostMarker}${otherSelectors}, ${pseudoPrefix}${s} ${hostMarker}${otherSelectors}`)
        .join(',');
}
/**
 * Mutate the given `groups` array so that there are `multiples` clones of the original array
 * stored.
 *
 * For example `repeatGroups([a, b], 3)` will result in `[a, b, a, b, a, b]` - but importantly the
 * newly added groups will be clones of the original.
 *
 * @param groups An array of groups of strings that will be repeated. This array is mutated
 *     in-place.
 * @param multiples The number of times the current groups should appear.
 */
function repeatGroups(groups, multiples) {
    const length = groups.length;
    for (let i = 1; i < multiples; i++) {
        for (let j = 0; j < length; j++) {
            groups[j + i * length] = groups[j].slice(0);
        }
    }
}

/**
 * Distinguishes different kinds of IR operations.
 *
 * Includes both creation and update operations.
 */
var OpKind;
(function (OpKind) {
    /**
     * A special operation type which is used to represent the beginning and end nodes of a linked
     * list of operations.
     */
    OpKind[OpKind["ListEnd"] = 0] = "ListEnd";
    /**
     * An operation which wraps an output AST statement.
     */
    OpKind[OpKind["Statement"] = 1] = "Statement";
    /**
     * An operation which declares and initializes a `SemanticVariable`.
     */
    OpKind[OpKind["Variable"] = 2] = "Variable";
    /**
     * An operation to begin rendering of an element.
     */
    OpKind[OpKind["ElementStart"] = 3] = "ElementStart";
    /**
     * An operation to render an element with no children.
     */
    OpKind[OpKind["Element"] = 4] = "Element";
    /**
     * An operation which declares an embedded view.
     */
    OpKind[OpKind["Template"] = 5] = "Template";
    /**
     * An operation to end rendering of an element previously started with `ElementStart`.
     */
    OpKind[OpKind["ElementEnd"] = 6] = "ElementEnd";
    /**
     * An operation to begin an `ng-container`.
     */
    OpKind[OpKind["ContainerStart"] = 7] = "ContainerStart";
    /**
     * An operation for an `ng-container` with no children.
     */
    OpKind[OpKind["Container"] = 8] = "Container";
    /**
     * An operation to end an `ng-container`.
     */
    OpKind[OpKind["ContainerEnd"] = 9] = "ContainerEnd";
    /**
     * An operation disable binding for subsequent elements, which are descendants of a non-bindable
     * node.
     */
    OpKind[OpKind["DisableBindings"] = 10] = "DisableBindings";
    /**
     * An op to conditionally render a template.
     */
    OpKind[OpKind["Conditional"] = 11] = "Conditional";
    /**
     * An operation to re-enable binding, after it was previously disabled.
     */
    OpKind[OpKind["EnableBindings"] = 12] = "EnableBindings";
    /**
     * An operation to render a text node.
     */
    OpKind[OpKind["Text"] = 13] = "Text";
    /**
     * An operation declaring an event listener for an element.
     */
    OpKind[OpKind["Listener"] = 14] = "Listener";
    /**
     * An operation to interpolate text into a text node.
     */
    OpKind[OpKind["InterpolateText"] = 15] = "InterpolateText";
    /**
     * An intermediate binding op, that has not yet been processed into an individual property,
     * attribute, style, etc.
     */
    OpKind[OpKind["Binding"] = 16] = "Binding";
    /**
     * An operation to bind an expression to a property of an element.
     */
    OpKind[OpKind["Property"] = 17] = "Property";
    /**
     * An operation to bind an expression to a style property of an element.
     */
    OpKind[OpKind["StyleProp"] = 18] = "StyleProp";
    /**
     * An operation to bind an expression to a class property of an element.
     */
    OpKind[OpKind["ClassProp"] = 19] = "ClassProp";
    /**
     * An operation to bind an expression to the styles of an element.
     */
    OpKind[OpKind["StyleMap"] = 20] = "StyleMap";
    /**
     * An operation to bind an expression to the classes of an element.
     */
    OpKind[OpKind["ClassMap"] = 21] = "ClassMap";
    /**
     * An operation to advance the runtime's implicit slot context during the update phase of a view.
     */
    OpKind[OpKind["Advance"] = 22] = "Advance";
    /**
     * An operation to instantiate a pipe.
     */
    OpKind[OpKind["Pipe"] = 23] = "Pipe";
    /**
     * An operation to associate an attribute with an element.
     */
    OpKind[OpKind["Attribute"] = 24] = "Attribute";
    /**
     * An attribute that has been extracted for inclusion in the consts array.
     */
    OpKind[OpKind["ExtractedAttribute"] = 25] = "ExtractedAttribute";
    /**
     * An operation that configures a `@defer` block.
     */
    OpKind[OpKind["Defer"] = 26] = "Defer";
    /**
     * An operation that controls when a `@defer` loads.
     */
    OpKind[OpKind["DeferOn"] = 27] = "DeferOn";
    /**
     * An operation that controls when a `@defer` loads, using a custom expression as the condition.
     */
    OpKind[OpKind["DeferWhen"] = 28] = "DeferWhen";
    /**
     * An i18n message that has been extracted for inclusion in the consts array.
     */
    OpKind[OpKind["I18nMessage"] = 29] = "I18nMessage";
    /**
     * A host binding property.
     */
    OpKind[OpKind["HostProperty"] = 30] = "HostProperty";
    /**
     * A namespace change, which causes the subsequent elements to be processed as either HTML or SVG.
     */
    OpKind[OpKind["Namespace"] = 31] = "Namespace";
    /**
     * Configure a content projeciton definition for the view.
     */
    OpKind[OpKind["ProjectionDef"] = 32] = "ProjectionDef";
    /**
     * Create a content projection slot.
     */
    OpKind[OpKind["Projection"] = 33] = "Projection";
    /**
     * Create a repeater creation instruction op.
     */
    OpKind[OpKind["RepeaterCreate"] = 34] = "RepeaterCreate";
    /**
     * An update up for a repeater.
     */
    OpKind[OpKind["Repeater"] = 35] = "Repeater";
    /**
     * An operation to bind an expression to the property side of a two-way binding.
     */
    OpKind[OpKind["TwoWayProperty"] = 36] = "TwoWayProperty";
    /**
     * An operation declaring the event side of a two-way binding.
     */
    OpKind[OpKind["TwoWayListener"] = 37] = "TwoWayListener";
    /**
     * A creation-time operation that initializes the slot for a `@let` declaration.
     */
    OpKind[OpKind["DeclareLet"] = 38] = "DeclareLet";
    /**
     * An update-time operation that stores the current value of a `@let` declaration.
     */
    OpKind[OpKind["StoreLet"] = 39] = "StoreLet";
    /**
     * The start of an i18n block.
     */
    OpKind[OpKind["I18nStart"] = 40] = "I18nStart";
    /**
     * A self-closing i18n on a single element.
     */
    OpKind[OpKind["I18n"] = 41] = "I18n";
    /**
     * The end of an i18n block.
     */
    OpKind[OpKind["I18nEnd"] = 42] = "I18nEnd";
    /**
     * An expression in an i18n message.
     */
    OpKind[OpKind["I18nExpression"] = 43] = "I18nExpression";
    /**
     * An instruction that applies a set of i18n expressions.
     */
    OpKind[OpKind["I18nApply"] = 44] = "I18nApply";
    /**
     * An instruction to create an ICU expression.
     */
    OpKind[OpKind["IcuStart"] = 45] = "IcuStart";
    /**
     * An instruction to update an ICU expression.
     */
    OpKind[OpKind["IcuEnd"] = 46] = "IcuEnd";
    /**
     * An instruction representing a placeholder in an ICU expression.
     */
    OpKind[OpKind["IcuPlaceholder"] = 47] = "IcuPlaceholder";
    /**
     * An i18n context containing information needed to generate an i18n message.
     */
    OpKind[OpKind["I18nContext"] = 48] = "I18nContext";
    /**
     * A creation op that corresponds to i18n attributes on an element.
     */
    OpKind[OpKind["I18nAttributes"] = 49] = "I18nAttributes";
    /**
     * Creation op that attaches the location at which an element was defined in a template to it.
     */
    OpKind[OpKind["SourceLocation"] = 50] = "SourceLocation";
})(OpKind || (OpKind = {}));
/**
 * Distinguishes different kinds of IR expressions.
 */
var ExpressionKind;
(function (ExpressionKind) {
    /**
     * Read of a variable in a lexical scope.
     */
    ExpressionKind[ExpressionKind["LexicalRead"] = 0] = "LexicalRead";
    /**
     * A reference to the current view context.
     */
    ExpressionKind[ExpressionKind["Context"] = 1] = "Context";
    /**
     * A reference to the view context, for use inside a track function.
     */
    ExpressionKind[ExpressionKind["TrackContext"] = 2] = "TrackContext";
    /**
     * Read of a variable declared in a `VariableOp`.
     */
    ExpressionKind[ExpressionKind["ReadVariable"] = 3] = "ReadVariable";
    /**
     * Runtime operation to navigate to the next view context in the view hierarchy.
     */
    ExpressionKind[ExpressionKind["NextContext"] = 4] = "NextContext";
    /**
     * Runtime operation to retrieve the value of a local reference.
     */
    ExpressionKind[ExpressionKind["Reference"] = 5] = "Reference";
    /**
     * A call storing the value of a `@let` declaration.
     */
    ExpressionKind[ExpressionKind["StoreLet"] = 6] = "StoreLet";
    /**
     * A reference to a `@let` declaration read from the context view.
     */
    ExpressionKind[ExpressionKind["ContextLetReference"] = 7] = "ContextLetReference";
    /**
     * Runtime operation to snapshot the current view context.
     */
    ExpressionKind[ExpressionKind["GetCurrentView"] = 8] = "GetCurrentView";
    /**
     * Runtime operation to restore a snapshotted view.
     */
    ExpressionKind[ExpressionKind["RestoreView"] = 9] = "RestoreView";
    /**
     * Runtime operation to reset the current view context after `RestoreView`.
     */
    ExpressionKind[ExpressionKind["ResetView"] = 10] = "ResetView";
    /**
     * Defines and calls a function with change-detected arguments.
     */
    ExpressionKind[ExpressionKind["PureFunctionExpr"] = 11] = "PureFunctionExpr";
    /**
     * Indicates a positional parameter to a pure function definition.
     */
    ExpressionKind[ExpressionKind["PureFunctionParameterExpr"] = 12] = "PureFunctionParameterExpr";
    /**
     * Binding to a pipe transformation.
     */
    ExpressionKind[ExpressionKind["PipeBinding"] = 13] = "PipeBinding";
    /**
     * Binding to a pipe transformation with a variable number of arguments.
     */
    ExpressionKind[ExpressionKind["PipeBindingVariadic"] = 14] = "PipeBindingVariadic";
    /*
     * A safe property read requiring expansion into a null check.
     */
    ExpressionKind[ExpressionKind["SafePropertyRead"] = 15] = "SafePropertyRead";
    /**
     * A safe keyed read requiring expansion into a null check.
     */
    ExpressionKind[ExpressionKind["SafeKeyedRead"] = 16] = "SafeKeyedRead";
    /**
     * A safe function call requiring expansion into a null check.
     */
    ExpressionKind[ExpressionKind["SafeInvokeFunction"] = 17] = "SafeInvokeFunction";
    /**
     * An intermediate expression that will be expanded from a safe read into an explicit ternary.
     */
    ExpressionKind[ExpressionKind["SafeTernaryExpr"] = 18] = "SafeTernaryExpr";
    /**
     * An empty expression that will be stipped before generating the final output.
     */
    ExpressionKind[ExpressionKind["EmptyExpr"] = 19] = "EmptyExpr";
    /*
     * An assignment to a temporary variable.
     */
    ExpressionKind[ExpressionKind["AssignTemporaryExpr"] = 20] = "AssignTemporaryExpr";
    /**
     * A reference to a temporary variable.
     */
    ExpressionKind[ExpressionKind["ReadTemporaryExpr"] = 21] = "ReadTemporaryExpr";
    /**
     * An expression that will cause a literal slot index to be emitted.
     */
    ExpressionKind[ExpressionKind["SlotLiteralExpr"] = 22] = "SlotLiteralExpr";
    /**
     * A test expression for a conditional op.
     */
    ExpressionKind[ExpressionKind["ConditionalCase"] = 23] = "ConditionalCase";
    /**
     * An expression that will be automatically extracted to the component const array.
     */
    ExpressionKind[ExpressionKind["ConstCollected"] = 24] = "ConstCollected";
    /**
     * Operation that sets the value of a two-way binding.
     */
    ExpressionKind[ExpressionKind["TwoWayBindingSet"] = 25] = "TwoWayBindingSet";
})(ExpressionKind || (ExpressionKind = {}));
var VariableFlags;
(function (VariableFlags) {
    VariableFlags[VariableFlags["None"] = 0] = "None";
    /**
     * Always inline this variable, regardless of the number of times it's used.
     * An `AlwaysInline` variable may not depend on context, because doing so may cause side effects
     * that are illegal when multi-inlined. (The optimizer will enforce this constraint.)
     */
    VariableFlags[VariableFlags["AlwaysInline"] = 1] = "AlwaysInline";
})(VariableFlags || (VariableFlags = {}));
/**
 * Distinguishes between different kinds of `SemanticVariable`s.
 */
var SemanticVariableKind;
(function (SemanticVariableKind) {
    /**
     * Represents the context of a particular view.
     */
    SemanticVariableKind[SemanticVariableKind["Context"] = 0] = "Context";
    /**
     * Represents an identifier declared in the lexical scope of a view.
     */
    SemanticVariableKind[SemanticVariableKind["Identifier"] = 1] = "Identifier";
    /**
     * Represents a saved state that can be used to restore a view in a listener handler function.
     */
    SemanticVariableKind[SemanticVariableKind["SavedView"] = 2] = "SavedView";
    /**
     * An alias generated by a special embedded view type (e.g. a `@for` block).
     */
    SemanticVariableKind[SemanticVariableKind["Alias"] = 3] = "Alias";
})(SemanticVariableKind || (SemanticVariableKind = {}));
/**
 * Whether to compile in compatibilty mode. In compatibility mode, the template pipeline will
 * attempt to match the output of `TemplateDefinitionBuilder` as exactly as possible, at the cost
 * of producing quirky or larger code in some cases.
 */
var CompatibilityMode;
(function (CompatibilityMode) {
    CompatibilityMode[CompatibilityMode["Normal"] = 0] = "Normal";
    CompatibilityMode[CompatibilityMode["TemplateDefinitionBuilder"] = 1] = "TemplateDefinitionBuilder";
})(CompatibilityMode || (CompatibilityMode = {}));
/**
 * Enumeration of the types of attributes which can be applied to an element.
 */
var BindingKind;
(function (BindingKind) {
    /**
     * Static attributes.
     */
    BindingKind[BindingKind["Attribute"] = 0] = "Attribute";
    /**
     * Class bindings.
     */
    BindingKind[BindingKind["ClassName"] = 1] = "ClassName";
    /**
     * Style bindings.
     */
    BindingKind[BindingKind["StyleProperty"] = 2] = "StyleProperty";
    /**
     * Dynamic property bindings.
     */
    BindingKind[BindingKind["Property"] = 3] = "Property";
    /**
     * Property or attribute bindings on a template.
     */
    BindingKind[BindingKind["Template"] = 4] = "Template";
    /**
     * Internationalized attributes.
     */
    BindingKind[BindingKind["I18n"] = 5] = "I18n";
    /**
     * Animation property bindings.
     */
    BindingKind[BindingKind["Animation"] = 6] = "Animation";
    /**
     * Property side of a two-way binding.
     */
    BindingKind[BindingKind["TwoWayProperty"] = 7] = "TwoWayProperty";
})(BindingKind || (BindingKind = {}));
/**
 * Enumeration of possible times i18n params can be resolved.
 */
var I18nParamResolutionTime;
(function (I18nParamResolutionTime) {
    /**
     * Param is resolved at message creation time. Most params should be resolved at message creation
     * time. However, ICU params need to be handled in post-processing.
     */
    I18nParamResolutionTime[I18nParamResolutionTime["Creation"] = 0] = "Creation";
    /**
     * Param is resolved during post-processing. This should be used for params whose value comes from
     * an ICU.
     */
    I18nParamResolutionTime[I18nParamResolutionTime["Postproccessing"] = 1] = "Postproccessing";
})(I18nParamResolutionTime || (I18nParamResolutionTime = {}));
/**
 * The contexts in which an i18n expression can be used.
 */
var I18nExpressionFor;
(function (I18nExpressionFor) {
    /**
     * This expression is used as a value (i.e. inside an i18n block).
     */
    I18nExpressionFor[I18nExpressionFor["I18nText"] = 0] = "I18nText";
    /**
     * This expression is used in a binding.
     */
    I18nExpressionFor[I18nExpressionFor["I18nAttribute"] = 1] = "I18nAttribute";
})(I18nExpressionFor || (I18nExpressionFor = {}));
/**
 * Flags that describe what an i18n param value. These determine how the value is serialized into
 * the final map.
 */
var I18nParamValueFlags;
(function (I18nParamValueFlags) {
    I18nParamValueFlags[I18nParamValueFlags["None"] = 0] = "None";
    /**
     *  This value represents an element tag.
     */
    I18nParamValueFlags[I18nParamValueFlags["ElementTag"] = 1] = "ElementTag";
    /**
     * This value represents a template tag.
     */
    I18nParamValueFlags[I18nParamValueFlags["TemplateTag"] = 2] = "TemplateTag";
    /**
     * This value represents the opening of a tag.
     */
    I18nParamValueFlags[I18nParamValueFlags["OpenTag"] = 4] = "OpenTag";
    /**
     * This value represents the closing of a tag.
     */
    I18nParamValueFlags[I18nParamValueFlags["CloseTag"] = 8] = "CloseTag";
    /**
     * This value represents an i18n expression index.
     */
    I18nParamValueFlags[I18nParamValueFlags["ExpressionIndex"] = 16] = "ExpressionIndex";
})(I18nParamValueFlags || (I18nParamValueFlags = {}));
/**
 * Whether the active namespace is HTML, MathML, or SVG mode.
 */
var Namespace;
(function (Namespace) {
    Namespace[Namespace["HTML"] = 0] = "HTML";
    Namespace[Namespace["SVG"] = 1] = "SVG";
    Namespace[Namespace["Math"] = 2] = "Math";
})(Namespace || (Namespace = {}));
/**
 * The type of a `@defer` trigger, for use in the ir.
 */
var DeferTriggerKind;
(function (DeferTriggerKind) {
    DeferTriggerKind[DeferTriggerKind["Idle"] = 0] = "Idle";
    DeferTriggerKind[DeferTriggerKind["Immediate"] = 1] = "Immediate";
    DeferTriggerKind[DeferTriggerKind["Timer"] = 2] = "Timer";
    DeferTriggerKind[DeferTriggerKind["Hover"] = 3] = "Hover";
    DeferTriggerKind[DeferTriggerKind["Interaction"] = 4] = "Interaction";
    DeferTriggerKind[DeferTriggerKind["Viewport"] = 5] = "Viewport";
    DeferTriggerKind[DeferTriggerKind["Never"] = 6] = "Never";
})(DeferTriggerKind || (DeferTriggerKind = {}));
/**
 * Kinds of i18n contexts. They can be created because of root i18n blocks, or ICUs.
 */
var I18nContextKind;
(function (I18nContextKind) {
    I18nContextKind[I18nContextKind["RootI18n"] = 0] = "RootI18n";
    I18nContextKind[I18nContextKind["Icu"] = 1] = "Icu";
    I18nContextKind[I18nContextKind["Attr"] = 2] = "Attr";
})(I18nContextKind || (I18nContextKind = {}));
var TemplateKind;
(function (TemplateKind) {
    TemplateKind[TemplateKind["NgTemplate"] = 0] = "NgTemplate";
    TemplateKind[TemplateKind["Structural"] = 1] = "Structural";
    TemplateKind[TemplateKind["Block"] = 2] = "Block";
})(TemplateKind || (TemplateKind = {}));

/**
 * Marker symbol for `ConsumesSlotOpTrait`.
 */
const ConsumesSlot = Symbol('ConsumesSlot');
/**
 * Marker symbol for `DependsOnSlotContextOpTrait`.
 */
const DependsOnSlotContext = Symbol('DependsOnSlotContext');
/**
 * Marker symbol for `ConsumesVars` trait.
 */
const ConsumesVarsTrait = Symbol('ConsumesVars');
/**
 * Marker symbol for `UsesVarOffset` trait.
 */
const UsesVarOffset = Symbol('UsesVarOffset');
/**
 * Default values for most `ConsumesSlotOpTrait` fields (used with the spread operator to initialize
 * implementors of the trait).
 */
const TRAIT_CONSUMES_SLOT = {
    [ConsumesSlot]: true,
    numSlotsUsed: 1,
};
/**
 * Default values for most `DependsOnSlotContextOpTrait` fields (used with the spread operator to
 * initialize implementors of the trait).
 */
const TRAIT_DEPENDS_ON_SLOT_CONTEXT = {
    [DependsOnSlotContext]: true,
};
/**
 * Default values for `UsesVars` fields (used with the spread operator to initialize
 * implementors of the trait).
 */
const TRAIT_CONSUMES_VARS = {
    [ConsumesVarsTrait]: true,
};
/**
 * Test whether an operation implements `ConsumesSlotOpTrait`.
 */
function hasConsumesSlotTrait(op) {
    return op[ConsumesSlot] === true;
}
function hasDependsOnSlotContextTrait(value) {
    return value[DependsOnSlotContext] === true;
}
function hasConsumesVarsTrait(value) {
    return value[ConsumesVarsTrait] === true;
}
/**
 * Test whether an expression implements `UsesVarOffsetTrait`.
 */
function hasUsesVarOffsetTrait(expr) {
    return expr[UsesVarOffset] === true;
}

/**
 * Create a `StatementOp`.
 */
function createStatementOp(statement) {
    return {
        kind: OpKind.Statement,
        statement,
        ...NEW_OP,
    };
}
/**
 * Create a `VariableOp`.
 */
function createVariableOp(xref, variable, initializer, flags) {
    return {
        kin   d: OpKind.Variable,
        xref,
        variable,
        initializer,
        flags,
        ...NEW_OP,
    };
}
/**
 * Static structure shared by all operations.
 *
 * Used as a convenience via the spread operator (`...NEW_OP`) when creating new operations, and
 * ensures the fields are always in the same order.
 */
const NEW_OP = {
    debugListId: null,
    prev: null,
    next: null,
};

/**
 * Create an `InterpolationTextOp`.
 */
function createInterpolateTextOp(xref, interpolation, sourceSpan) {
    return {
        kind: OpKind.InterpolateText,
        target: xref,
        interpolation,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}
class Interpolation {
    strings;
    expressions;
    i18nPlaceholders;
    constructor(strings, expressions, i18nPlaceholders) {
        this.strings = strings;
        this.expressions = expressions;
        this.i18nPlaceholders = i18nPlaceholders;
        if (i18nPlaceholders.length !== 0 && i18nPlaceholders.length !== expressions.length) {
            throw new Error(`Expected ${expressions.length} placeholders to match interpolation expression count, but got ${i18nPlaceholders.length}`);
        }
    }
}
/**
 * Create a `BindingOp`, not yet transformed into a particular type of binding.
 */
function createBindingOp(target, kind, name, expression, unit, securityContext, isTextAttribute, isStructuralTemplateAttribute, templateKind, i18nMessage, sourceSpan) {
    return {
        kind: OpKind.Binding,
        bindingKind: kind,
        target,
        name,
        expression,
        unit,
        securityContext,
        isTextAttribute,
        isStructuralTemplateAttribute,
        templateKind,
        i18nContext: null,
        i18nMessage,
        sourceSpan,
        ...NEW_OP,
    };
}
/**
 * Create a `PropertyOp`.
 */
function createPropertyOp(target, name, expression, isAnimationTrigger, securityContext, isStructuralTemplateAttribute, templateKind, i18nContext, i18nMessage, sourceSpan) {
    return {
        kind: OpKind.Property,
        target,
        name,
        expression,
        isAnimationTrigger,
        securityContext,
        sanitizer: null,
        isStructuralTemplateAttribute,
        templateKind,
        i18nContext,
        i18nMessage,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}
/**
 * Create a `TwoWayPropertyOp`.
 */
function createTwoWayPropertyOp(target, name, expression, securityContext, isStructuralTemplateAttribute, templateKind, i18nContext, i18nMessage, sourceSpan) {
    return {
        kind: OpKind.TwoWayProperty,
        target,
        name,
        expression,
        securityContext,
        sanitizer: null,
        isStructuralTemplateAttribute,
        templateKind,
        i18nContext,
        i18nMessage,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}
/** Create a `StylePropOp`. */
function createStylePropOp(xref, name, expression, unit, sourceSpan) {
    return {
        kind: OpKind.StyleProp,
        target: xref,
        name,
        expression,
        unit,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}
/**
 * Create a `ClassPropOp`.
 */
function createClassPropOp(xref, name, expression, sourceSpan) {
    return {
        kind: OpKind.ClassProp,
        target: xref,
        name,
        expression,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}
/** Create a `StyleMapOp`. */
function createStyleMapOp(xref, expression, sourceSpan) {
    return {
        kind: OpKind.StyleMap,
        target: xref,
        expression,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}
/**
 * Create a `ClassMapOp`.
 */
function createClassMapOp(xref, expression, sourceSpan) {
    return {
        kind: OpKind.ClassMap,
        target: xref,
        expression,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}
/**
 * Create an `AttributeOp`.
 */
function createAttributeOp(target, namespace, name, expression, securityContext, isTextAttribute, isStructuralTemplateAttribute, templateKind, i18nMessage, sourceSpan) {
    return {
        kind: OpKind.Attribute,
        target,
        namespace,
        name,
        expression,
        securityContext,
        sanitizer: null,
        isTextAttribute,
        isStructuralTemplateAttribute,
        templateKind,
        i18nContext: null,
        i18nMessage,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}
/**
 * Create an `AdvanceOp`.
 */
function createAdvanceOp(delta, sourceSpan) {
    return {
        kind: OpKind.Advance,
        delta,
        sourceSpan,
        ...NEW_OP,
    };
}
/**
 * Create a conditional op, which will display an embedded view according to a condtion.
 */
function createConditionalOp(target, test, conditions, sourceSpan) {
    return {
        kind: OpKind.Conditional,
        target,
        test,
        conditions,
        processed: null,
        sourceSpan,
        contextValue: null,
        ...NEW_OP,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
    };
}
function createRepeaterOp(repeaterCreate, targetSlot, collection, sourceSpan) {
    return {
        kind: OpKind.Repeater,
        target: repeaterCreate,
        targetSlot,
        collection,
        sourceSpan,
        ...NEW_OP,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
    };
}
function createDeferWhenOp(target, expr, modifier, sourceSpan) {
    return {
        kind: OpKind.DeferWhen,
        target,
        expr,
        modifier,
        sourceSpan,
        ...NEW_OP,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
    };
}
/**
 * Create an i18n expression op.
 */
function createI18nExpressionOp(context, target, i18nOwner, handle, expression, icuPlaceholder, i18nPlaceholder, resolutionTime, usage, name, sourceSpan) {
    return {
        kind: OpKind.I18nExpression,
        context,
        target,
        i18nOwner,
        handle,
        expression,
        icuPlaceholder,
        i18nPlaceholder,
        resolutionTime,
        usage,
        name,
        sourceSpan,
        ...NEW_OP,
        ...TRAIT_CONSUMES_VARS,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
    };
}
/**
 * Creates an op to apply i18n expression ops.
 */
function createI18nApplyOp(owner, handle, sourceSpan) {
    return {
        kind: OpKind.I18nApply,
        owner,
        handle,
        sourceSpan,
        ...NEW_OP,
    };
}
/**
 * Creates a `StoreLetOp`.
 */
function createStoreLetOp(target, declaredName, value, sourceSpan) {
    return {
        kind: OpKind.StoreLet,
        target,
        declaredName,
        value,
        sourceSpan,
        ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}

/**
 * Check whether a given `o.Expression` is a logical IR expression type.
 */
function isIrExpression(expr) {
    return expr instanceof ExpressionBase;
}
/**
 * Base type used for all logical IR expressions.
 */
class ExpressionBase extends Expression {
    constructor(sourceSpan = null) {
        super(null, sourceSpan);
    }
}
/**
 * Logical expression representing a lexical read of a variable name.
 */
class LexicalReadExpr extends ExpressionBase {
    name;
    kind = ExpressionKind.LexicalRead;
    constructor(name) {
        super();
        this.name = name;
    }
    visitExpression(visitor, context) { }
    isEquivalent(other) {
        // We assume that the lexical reads are in the same context, which must be true for parent
        // expressions to be equivalent.
        // TODO: is this generally safe?
        return this.name === other.name;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions() { }
    clone() {
        return new LexicalReadExpr(this.name);
    }
}
/**
 * Runtime operation to retrieve the value of a local reference.
 */
class ReferenceExpr extends ExpressionBase {
    target;
    targetSlot;
    offset;
    kind = ExpressionKind.Reference;
    constructor(target, targetSlot, offset) {
        super();
        this.target = target;
        this.targetSlot = targetSlot;
        this.offset = offset;
    }
    visitExpression() { }
    isEquivalent(e) {
        return e instanceof ReferenceExpr && e.target === this.target;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions() { }
    clone() {
        return new ReferenceExpr(this.target, this.targetSlot, this.offset);
    }
}
class StoreLetExpr extends ExpressionBase {
    target;
    value;
    sourceSpan;
    kind = ExpressionKind.StoreLet;
    [ConsumesVarsTrait] = true;
    [DependsOnSlotContext] = true;
    constructor(target, value, sourceSpan) {
        super();
        this.target = target;
        this.value = value;
        this.sourceSpan = sourceSpan;
    }
    visitExpression() { }
    isEquivalent(e) {
        return (e instanceof StoreLetExpr && e.target === this.target && e.value.isEquivalent(this.value));
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.value = transformExpressionsInExpression(this.value, transform, flags);
    }
    clone() {
        return new StoreLetExpr(this.target, this.value, this.sourceSpan);
    }
}
class ContextLetReferenceExpr extends ExpressionBase {
    target;
    targetSlot;
    kind = ExpressionKind.ContextLetReference;
    constructor(target, targetSlot) {
        super();
        this.target = target;
        this.targetSlot = targetSlot;
    }
    visitExpression() { }
    isEquivalent(e) {
        return e instanceof ContextLetReferenceExpr && e.target === this.target;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions() { }
    clone() {
        return new ContextLetReferenceExpr(this.target, this.targetSlot);
    }
}
/**
 * A reference to the current view context (usually the `ctx` variable in a template function).
 */
class ContextExpr extends ExpressionBase {
    view;
    kind = ExpressionKind.Context;
    constructor(view) {
        super();
        this.view = view;
    }
    visitExpression() { }
    isEquivalent(e) {
        return e instanceof ContextExpr && e.view === this.view;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions() { }
    clone() {
        return new ContextExpr(this.view);
    }
}
/**
 * A reference to the current view context inside a track function.
 */
class TrackContextExpr extends ExpressionBase {
    view;
    kind = ExpressionKind.TrackContext;
    constructor(view) {
        super();
        this.view = view;
    }
    visitExpression() { }
    isEquivalent(e) {
        return e instanceof TrackContextExpr && e.view === this.view;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions() { }
    clone() {
        return new TrackContextExpr(this.view);
    }
}
/**
 * Runtime operation to navigate to the next view context in the view hierarchy.
 */
class NextContextExpr extends ExpressionBase {
    kind = ExpressionKind.NextContext;
    steps = 1;
    constructor() {
        super();
    }
    visitExpression() { }
    isEquivalent(e) {
        return e instanceof NextContextExpr && e.steps === this.steps;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions() { }
    clone() {
        const expr = new NextContextExpr();
        expr.steps = this.steps;
        return expr;
    }
}
/**
 * Runtime operation to snapshot the current view context.
 *
 * The result of this operation can be stored in a variable and later used with the `RestoreView`
 * operation.
 */
class GetCurrentViewExpr extends ExpressionBase {
    kind = ExpressionKind.GetCurrentView;
    constructor() {
        super();
    }
    visitExpression() { }
    isEquivalent(e) {
        return e instanceof GetCurrentViewExpr;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions() { }
    clone() {
        return new GetCurrentViewExpr();
    }
}
/**
 * Runtime operation to restore a snapshotted view.
 */
class RestoreViewExpr extends ExpressionBase {
    view;
    kind = ExpressionKind.RestoreView;
    constructor(view) {
        super();
        this.view = view;
    }
    visitExpression(visitor, context) {
        if (typeof this.view !== 'number') {
            this.view.visitExpression(visitor, context);
        }
    }
    isEquivalent(e) {
        if (!(e instanceof RestoreViewExpr) || typeof e.view !== typeof this.view) {
            return false;
        }
        if (typeof this.view === 'number') {
            return this.view === e.view;
        }
        else {
            return this.view.isEquivalent(e.view);
        }
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        if (typeof this.view !== 'number') {
            this.view = transformExpressionsInExpression(this.view, transform, flags);
        }
    }
    clone() {
        return new RestoreViewExpr(this.view instanceof Expression ? this.view.clone() : this.view);
    }
}
/**
 * Runtime operation to reset the current view context after `RestoreView`.
 */
class ResetViewExpr extends ExpressionBase {
    expr;
    kind = ExpressionKind.ResetView;
    constructor(expr) {
        super();
        this.expr = expr;
    }
    visitExpression(visitor, context) {
        this.expr.visitExpression(visitor, context);
    }
    isEquivalent(e) {
        return e instanceof ResetViewExpr && this.expr.isEquivalent(e.expr);
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.expr = transformExpressionsInExpression(this.expr, transform, flags);
    }
    clone() {
        return new ResetViewExpr(this.expr.clone());
    }
}
class TwoWayBindingSetExpr extends ExpressionBase {
    target;
    value;
    kind = ExpressionKind.TwoWayBindingSet;
    constructor(target, value) {
        super();
        this.target = target;
        this.value = value;
    }
    visitExpression(visitor, context) {
        this.target.visitExpression(visitor, context);
        this.value.visitExpression(visitor, context);
    }
    isEquivalent(other) {
        return this.target.isEquivalent(other.target) && this.value.isEquivalent(other.value);
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.target = transformExpressionsInExpression(this.target, transform, flags);
        this.value = transformExpressionsInExpression(this.value, transform, flags);
    }
    clone() {
        return new TwoWayBindingSetExpr(this.target, this.value);
    }
}
/**
 * Read of a variable declared as an `ir.VariableOp` and referenced through its `ir.XrefId`.
 */
class ReadVariableExpr extends ExpressionBase {
    xref;
    kind = ExpressionKind.ReadVariable;
    name = null;
    constructor(xref) {
        super();
        this.xref = xref;
    }
    visitExpression() { }
    isEquivalent(other) {
        return other instanceof ReadVariableExpr && other.xref === this.xref;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions() { }
    clone() {
        const expr = new ReadVariableExpr(this.xref);
        expr.name = this.name;
        return expr;
    }
}
class PureFunctionExpr extends ExpressionBase {
    kind = ExpressionKind.PureFunctionExpr;
    [ConsumesVarsTrait] = true;
    [UsesVarOffset] = true;
    varOffset = null;
    /**
     * The expression which should be memoized as a pure computation.
     *
     * This expression contains internal `PureFunctionParameterExpr`s, which are placeholders for the
     * positional argument expressions in `args.
     */
    body;
    /**
     * Positional arguments to the pure function which will memoize the `body` expression, which act
     * as memoization keys.
     */
    args;
    /**
     * Once extracted to the `ConstantPool`, a reference to the function which defines the computation
     * of `body`.
     */
    fn = null;
    constructor(expression, args) {
        super();
        this.body = expression;
        this.args = args;
    }
    visitExpression(visitor, context) {
        this.body?.visitExpression(visitor, context);
        for (const arg of this.args) {
            arg.visitExpression(visitor, context);
        }
    }
    isEquivalent(other) {
        if (!(other instanceof PureFunctionExpr) || other.args.length !== this.args.length) {
            return false;
        }
        return (other.body !== null &&
            this.body !== null &&
            other.body.isEquivalent(this.body) &&
            other.args.every((arg, idx) => arg.isEquivalent(this.args[idx])));
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        if (this.body !== null) {
            // TODO: figure out if this is the right flag to pass here.
            this.body = transformExpressionsInExpression(this.body, transform, flags | VisitorContextFlag.InChildOperation);
        }
        else if (this.fn !== null) {
            this.fn = transformExpressionsInExpression(this.fn, transform, flags);
        }
        for (let i = 0; i < this.args.length; i++) {
            this.args[i] = transformExpressionsInExpression(this.args[i], transform, flags);
        }
    }
    clone() {
        const expr = new PureFunctionExpr(this.body?.clone() ?? null, this.args.map((arg) => arg.clone()));
        expr.fn = this.fn?.clone() ?? null;
        expr.varOffset = this.varOffset;
        return expr;
    }
}
class PureFunctionParameterExpr extends ExpressionBase {
    index;
    kind = ExpressionKind.PureFunctionParameterExpr;
    constructor(index) {
        super();
        this.index = index;
    }
    visitExpression() { }
    isEquivalent(other) {
        return other instanceof PureFunctionParameterExpr && other.index === this.index;
    }
    isConstant() {
        return true;
    }
    transformInternalExpressions() { }
    clone() {
        return new PureFunctionParameterExpr(this.index);
    }
}
class PipeBindingExpr extends ExpressionBase {
    target;
    targetSlot;
    name;
    args;
    kind = ExpressionKind.PipeBinding;
    [ConsumesVarsTrait] = true;
    [UsesVarOffset] = true;
    varOffset = null;
    constructor(target, targetSlot, name, args) {
        super();
        this.target = target;
        this.targetSlot = targetSlot;
        this.name = name;
        this.args = args;
    }
    visitExpression(visitor, context) {
        for (const arg of this.args) {
            arg.visitExpression(visitor, context);
        }
    }
    isEquivalent() {
        return false;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        for (let idx = 0; idx < this.args.length; idx++) {
            this.args[idx] = transformExpressionsInExpression(this.args[idx], transform, flags);
        }
    }
    clone() {
        const r = new PipeBindingExpr(this.target, this.targetSlot, this.name, this.args.map((a) => a.clone()));
        r.varOffset = this.varOffset;
        return r;
    }
}
class PipeBindingVariadicExpr extends ExpressionBase {
    target;
    targetSlot;
    name;
    args;
    numArgs;
    kind = ExpressionKind.PipeBindingVariadic;
    [ConsumesVarsTrait] = true;
    [UsesVarOffset] = true;
    varOffset = null;
    constructor(target, targetSlot, name, args, numArgs) {
        super();
        this.target = target;
        this.targetSlot = targetSlot;
        this.name = name;
        this.args = args;
        this.numArgs = numArgs;
    }
    visitExpression(visitor, context) {
        this.args.visitExpression(visitor, context);
    }
    isEquivalent() {
        return false;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.args = transformExpressionsInExpression(this.args, transform, flags);
    }
    clone() {
        const r = new PipeBindingVariadicExpr(this.target, this.targetSlot, this.name, this.args.clone(), this.numArgs);
        r.varOffset = this.varOffset;
        return r;
    }
}
class SafePropertyReadExpr extends ExpressionBase {
    receiver;
    name;
    kind = ExpressionKind.SafePropertyRead;
    constructor(receiver, name) {
        super();
        this.receiver = receiver;
        this.name = name;
    }
    // An alias for name, which allows other logic to handle property reads and keyed reads together.
    get index() {
        return this.name;
    }
    visitExpression(visitor, context) {
        this.receiver.visitExpression(visitor, context);
    }
    isEquivalent() {
        return false;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.receiver = transformExpressionsInExpression(this.receiver, transform, flags);
    }
    clone() {
        return new SafePropertyReadExpr(this.receiver.clone(), this.name);
    }
}
class SafeKeyedReadExpr extends ExpressionBase {
    receiver;
    index;
    kind = ExpressionKind.SafeKeyedRead;
    constructor(receiver, index, sourceSpan) {
        super(sourceSpan);
        this.receiver = receiver;
        this.index = index;
    }
    visitExpression(visitor, context) {
        this.receiver.visitExpression(visitor, context);
        this.index.visitExpression(visitor, context);
    }
    isEquivalent() {
        return false;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.receiver = transformExpressionsInExpression(this.receiver, transform, flags);
        this.index = transformExpressionsInExpression(this.index, transform, flags);
    }
    clone() {
        return new SafeKeyedReadExpr(this.receiver.clone(), this.index.clone(), this.sourceSpan);
    }
}
class SafeInvokeFunctionExpr extends ExpressionBase {
    receiver;
    args;
    kind = ExpressionKind.SafeInvokeFunction;
    constructor(receiver, args) {
        super();
        this.receiver = receiver;
        this.args = args;
    }
    visitExpression(visitor, context) {
        this.receiver.visitExpression(visitor, context);
        for (const a of this.args) {
            a.visitExpression(visitor, context);
        }
    }
    isEquivalent() {
        return false;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.receiver = transformExpressionsInExpression(this.receiver, transform, flags);
        for (let i = 0; i < this.args.length; i++) {
            this.args[i] = transformExpressionsInExpression(this.args[i], transform, flags);
        }
    }
    clone() {
        return new SafeInvokeFunctionExpr(this.receiver.clone(), this.args.map((a) => a.clone()));
    }
}
class SafeTernaryExpr extends ExpressionBase {
    guard;
    expr;
    kind = ExpressionKind.SafeTernaryExpr;
    constructor(guard, expr) {
        super();
        this.guard = guard;
        this.expr = expr;
    }
    visitExpression(visitor, context) {
        this.guard.visitExpression(visitor, context);
        this.expr.visitExpression(visitor, context);
    }
    isEquivalent() {
        return false;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.guard = transformExpressionsInExpression(this.guard, transform, flags);
        this.expr = transformExpressionsInExpression(this.expr, transform, flags);
    }
    clone() {
        return new SafeTernaryExpr(this.guard.clone(), this.expr.clone());
    }
}
class EmptyExpr extends ExpressionBase {
    kind = ExpressionKind.EmptyExpr;
    visitExpression(visitor, context) { }
    isEquivalent(e) {
        return e instanceof EmptyExpr;
    }
    isConstant() {
        return true;
    }
    clone() {
        return new EmptyExpr();
    }
    transformInternalExpressions() { }
}
class AssignTemporaryExpr extends ExpressionBase {
    expr;
    xref;
    kind = ExpressionKind.AssignTemporaryExpr;
    name = null;
    constructor(expr, xref) {
        super();
        this.expr = expr;
        this.xref = xref;
    }
    visitExpression(visitor, context) {
        this.expr.visitExpression(visitor, context);
    }
    isEquivalent() {
        return false;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) {
        this.expr = transformExpressionsInExpression(this.expr, transform, flags);
    }
    clone() {
        const a = new AssignTemporaryExpr(this.expr.clone(), this.xref);
        a.name = this.name;
        return a;
    }
}
class ReadTemporaryExpr extends ExpressionBase {
    xref;
    kind = ExpressionKind.ReadTemporaryExpr;
    name = null;
    constructor(xref) {
        super();
        this.xref = xref;
    }
    visitExpression(visitor, context) { }
    isEquivalent() {
        return this.xref === this.xref;
    }
    isConstant() {
        return false;
    }
    transformInternalExpressions(transform, flags) { }
    clone() {
        const r = new ReadTemporaryExpr(this.xref);
        r.name = this.name;
        return r;
    }
}
class SlotLiteralExpr extends ExpressionBase {
    slot;
    kind = ExpressionKind.SlotLiteralExpr;
    constructor(slot) {
        super();
        this.slot = slot;
    }
    visitExpression(visitor, context) { }
    isEquivalent(e) {
        return e instanceof SlotLiteralExpr && e.slot === this.slot;
    }
    isConstant() {
        return true;
    }
    clone() {
        return new SlotLiteralExpr(this.slot);
    }
    transformInternalExpressions() { }
}
class ConditionalCaseExpr extends ExpressionBase {
    expr;
    target;
    targetSlot;
    alias;
    kind = ExpressionKind.ConditionalCase;
    /**
     * Create an expression for one branch of a conditional.
     * @param expr The expression to be tested for this case. Might be null, as in an `else` case.
     * @param target The Xref of the view to be displayed if this condition is true.
     */
    constructor(expr, target, targetSlot, alias = null) {
        super();
        this.expr = expr;
        this.target = target;
        this.targetSlot = targetSlot;
        this.alias = alias;
    }
    visitExpression(visitor, context) {
        if (this.expr !== null) {
            this.expr.visitExpression(visitor, context);
        }
    }
    isEquivalent(e) {
        return e instanceof ConditionalCaseExpr && e.expr === this.expr;
    }
    isConstant() {
        return true;
    }
    clone() {
        return new ConditionalCaseExpr(this.expr, this.target, this.targetSlot);
    }
    transformInternalExpressions(transform, flags) {
        if (this.expr !== null) {
            this.expr = transformExpressionsInExpression(this.expr, transform, flags);
        }
    }
}
class ConstCollectedExpr extends ExpressionBase {
    expr;
    kind = ExpressionKind.ConstCollected;
    constructor(expr) {
        super();
        this.expr = expr;
    }
    transformInternalExpressions(transform, flags) {
        this.expr = transform(this.expr, flags);
    }
    visitExpression(visitor, context) {
        this.expr.visitExpression(visitor, context);
    }
    isEquivalent(e) {
        if (!(e instanceof ConstCollectedExpr)) {
            return false;
        }
        return this.expr.isEquivalent(e.expr);
    }
    isConstant() {
        return this.expr.isConstant();
    }
    clone() {
        return new ConstCollectedExpr(this.expr);
    }
}
/**
 * Visits all `Expression`s in the AST of `op` with the `visitor` function.
 */
function visitExpressionsInOp(op, visitor) {
    transformExpressionsInOp(op, (expr, flags) => {
        visitor(expr, flags);
        return expr;
    }, VisitorContextFlag.None);
}
var VisitorContextFlag;
(function (VisitorContextFlag) {
    VisitorContextFlag[VisitorContextFlag["None"] = 0] = "None";
    VisitorContextFlag[VisitorContextFlag["InChildOperation"] = 1] = "InChildOperation";
})(VisitorContextFlag || (VisitorContextFlag = {}));
function transformExpressionsInInterpolation(interpolation, transform, flags) {
    for (let i = 0; i < interpolation.expressions.length; i++) {
        interpolation.expressions[i] = transformExpressionsInExpression(interpolation.expressions[i], transform, flags);
    }
}
/**
 * Transform all `Expression`s in the AST of `op` with the `transform` function.
 *
 * All such operations will be replaced with the result of applying `transform`, which may be an
 * identity transformation.
 */
function transformExpressionsInOp(op, transform, flags) {
    switch (op.kind) {
        case OpKind.StyleProp:
        case OpKind.StyleMap:
        case OpKind.ClassProp:
        case OpKind.ClassMap:
        case OpKind.Binding:
            if (op.expression instanceof Interpolation) {
                transformExpressionsInInterpolation(op.expression, transform, flags);
            }
            else {
                op.expression = transformExpressionsInExpression(op.expression, transform, flags);
            }
            break;
        case OpKind.Property:
        case OpKind.HostProperty:
        case OpKind.Attribute:
            if (op.expression instanceof Interpolation) {
                transformExpressionsInInterpolation(op.expression, transform, flags);
            }
            else {
                op.expression = transformExpressionsInExpression(op.expression, transform, flags);
            }
            op.sanitizer =
                op.sanitizer && transformExpressionsInExpression(op.sanitizer, transform, flags);
            break;
        case OpKind.TwoWayProperty:
            op.expression = transformExpressionsInExpression(op.expression, transform, flags);
            op.sanitizer =
                op.sanitizer && transformExpressionsInExpression(op.sanitizer, transform, flags);
            break;
        case OpKind.I18nExpression:
            op.expression = transformExpressionsInExpression(op.expression, transform, flags);
            break;
        case OpKind.InterpolateText:
            transformExpressionsInInterpolation(op.interpolation, transform, flags);
            break;
        case OpKind.Statement:
            transformExpressionsInStatement(op.statement, transform, flags);
            break;
        case OpKind.Variable:
            op.initializer = transformExpressionsInExpression(op.initializer, transform, flags);
            break;
        case OpKind.Conditional:
            for (const condition of op.conditions) {
                if (condition.expr === null) {
                    // This is a default case.
                    continue;
                }
                condition.expr = transformExpressionsInExpression(condition.expr, transform, flags);
            }
            if (op.processed !== null) {
                op.processed = transformExpressionsInExpression(op.processed, transform, flags);
            }
            if (op.contextValue !== null) {
                op.contextValue = transformExpressionsInExpression(op.contextValue, transform, flags);
            }
            break;
        case OpKind.Listener:
        case OpKind.TwoWayListener:
            for (const innerOp of op.handlerOps) {
                transformExpressionsInOp(innerOp, transform, flags | VisitorContextFlag.InChildOperation);
            }
            break;
        case OpKind.ExtractedAttribute:
            op.expression =
                op.expression && transformExpressionsInExpression(op.expression, transform, flags);
            op.trustedValueFn =
                op.trustedValueFn && transformExpressionsInExpression(op.trustedValueFn, transform, flags);
            break;
        case OpKind.RepeaterCreate:
            if (op.trackByOps === null) {
                op.track = transformExpressionsInExpression(op.track, transform, flags);
            }
            else {
                for (const innerOp of op.trackByOps) {
                    transformExpressionsInOp(innerOp, transform, flags | VisitorContextFlag.InChildOperation);
                }
            }
            if (op.trackByFn !== null) {
                op.trackByFn = transformExpressionsInExpression(op.trackByFn, transform, flags);
            }
            break;
        case OpKind.Repeater:
            op.collection = transformExpressionsInExpression(op.collection, transform, flags);
            break;
        case OpKind.Defer:
            if (op.loadingConfig !== null) {
                op.loadingConfig = transformExpressionsInExpression(op.loadingConfig, transform, flags);
            }
            if (op.placeholderConfig !== null) {
                op.placeholderConfig = transformExpressionsInExpression(op.placeholderConfig, transform, flags);
            }
            if (op.resolverFn !== null) {
                op.resolverFn = transformExpressionsInExpression(op.resolverFn, transform, flags);
            }
            break;
        case OpKind.I18nMessage:
            for (const [placeholder, expr] of op.params) {
                op.params.set(placeholder, transformExpressionsInExpression(expr, transform, flags));
            }
            for (const [placeholder, expr] of op.postprocessingParams) {
                op.postprocessingParams.set(placeholder, transformExpressionsInExpression(expr, transform, flags));
            }
            break;
        case OpKind.DeferWhen:
            op.expr = transformExpressionsInExpression(op.expr, transform, flags);
            break;
        case OpKind.StoreLet:
            op.value = transformExpressionsInExpression(op.value, transform, flags);
            break;
        case OpKind.Advance:
        case OpKind.Container:
        case OpKind.ContainerEnd:
        case OpKind.ContainerStart:
        case OpKind.DeferOn:
        case OpKind.DisableBindings:
        case OpKind.Element:
        case OpKind.ElementEnd:
        case OpKind.ElementStart:
        case OpKind.EnableBindings:
        case OpKind.I18n:
        case OpKind.I18nApply:
        case OpKind.I18nContext:
        case OpKind.I18nEnd:
        case OpKind.I18nStart:
        case OpKind.IcuEnd:
        case OpKind.IcuStart:
        case OpKind.Namespace:
        case OpKind.Pipe:
        case OpKind.Projection:
        case OpKind.ProjectionDef:
        case OpKind.Template:
        case OpKind.Text:
        case OpKind.I18nAttributes:
        case OpKind.IcuPlaceholder:
        case OpKind.DeclareLet:
        case OpKind.SourceLocation:
            // These operations contain no expressions.
            break;
        default:
            throw new Error(`AssertionError: transformExpressionsInOp doesn't handle ${OpKind[op.kind]}`);
    }
}
/**
 * Transform all `Expression`s in the AST of `expr` with the `transform` function.
 *
 * All such operations will be replaced with the result of applying `transform`, which may be an
 * identity transformation.
 */
function transformExpressionsInExpression(expr, transform, flags) {
    if (expr instanceof ExpressionBase) {
        expr.transformInternalExpressions(transform, flags);
    }
    else if (expr instanceof BinaryOperatorExpr) {
        expr.lhs = transformExpressionsInExpression(expr.lhs, transform, flags);
        expr.rhs = transformExpressionsInExpression(expr.rhs, transform, flags);
    }
    else if (expr instanceof UnaryOperatorExpr) {
        expr.expr = transformExpressionsInExpression(expr.expr, transform, flags);
    }
    else if (expr instanceof ReadPropExpr) {
        expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
    }
    else if (expr instanceof ReadKeyExpr) {
        expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
        expr.index = transformExpressionsInExpression(expr.index, transform, flags);
    }
    else if (expr instanceof WritePropExpr) {
        expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
        expr.value = transformExpressionsInExpression(expr.value, transform, flags);
    }
    else if (expr instanceof WriteKeyExpr) {
        expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
        expr.index = transformExpressionsInExpression(expr.index, transform, flags);
        expr.value = transformExpressionsInExpression(expr.value, transform, flags);
    }
    else if (expr instanceof InvokeFunctionExpr) {
        expr.fn = transformExpressionsInExpression(expr.fn, transform, flags);
        for (let i = 0; i < expr.args.length; i++) {
            expr.args[i] = transformExpressionsInExpression(expr.args[i], transform, flags);
        }
    }
    else if (expr instanceof LiteralArrayExpr) {
        for (let i = 0; i < expr.entries.length; i++) {
            expr.entries[i] = transformExpressionsInExpression(expr.entries[i], transform, flags);
        }
    }
    else if (expr instanceof LiteralMapExpr) {
        for (let i = 0; i < expr.entries.length; i++) {
            expr.entries[i].value = transformExpressionsInExpression(expr.entries[i].value, transform, flags);
        }
    }
    else if (expr instanceof ConditionalExpr) {
        expr.condition = transformExpressionsInExpression(expr.condition, transform, flags);
        expr.trueCase = transformExpressionsInExpression(expr.trueCase, transform, flags);
        if (expr.falseCase !== null) {
            expr.falseCase = transformExpressionsInExpression(expr.falseCase, transform, flags);
        }
    }
    else if (expr instanceof TypeofExpr) {
        expr.expr = transformExpressionsInExpression(expr.expr, transform, flags);
    }
    else if (expr instanceof WriteVarExpr) {
        expr.value = transformExpressionsInExpression(expr.value, transform, flags);
    }
    else if (expr instanceof LocalizedString) {
        for (let i = 0; i < expr.expressions.length; i++) {
            expr.expressions[i] = transformExpressionsInExpression(expr.expressions[i], transform, flags);
        }
    }
    else if (expr instanceof NotExpr) {
        expr.condition = transformExpressionsInExpression(expr.condition, transform, flags);
    }
    else if (expr instanceof TaggedTemplateLiteralExpr) {
        expr.tag = transformExpressionsInExpression(expr.tag, transform, flags);
        expr.template.expressions = expr.template.expressions.map((e) => transformExpressionsInExpression(e, transform, flags));
    }
    else if (expr instanceof ArrowFunctionExpr) {
        if (Array.isArray(expr.body)) {
            for (let i = 0; i < expr.body.length; i++) {
                transformExpressionsInStatement(expr.body[i], transform, flags);
            }
        }
        else {
            expr.body = transformExpressionsInExpression(expr.body, transform, flags);
        }
    }
    else if (expr instanceof WrappedNodeExpr) ;
    else if (expr instanceof TemplateLiteralExpr) {
        for (let i = 0; i < expr.expressions.length; i++) {
            expr.expressions[i] = transformExpressionsInExpression(expr.expressions[i], transform, flags);
        }
    }
    else if (expr instanceof ReadVarExpr ||
        expr instanceof ExternalExpr ||
        expr instanceof LiteralExpr) ;
    else {
        throw new Error(`Unhandled expression kind: ${expr.constructor.name}`);
    }
    return transform(expr, flags);
}
/**
 * Transform all `Expression`s in the AST of `stmt` with the `transform` function.
 *
 * All such operations will be replaced with the result of applying `transform`, which may be an
 * identity transformation.
 */
function transformExpressionsInStatement(stmt, transform, flags) {
    if (stmt instanceof ExpressionStatement) {
        stmt.expr = transformExpressionsInExpression(stmt.expr, transform, flags);
    }
    else if (stmt instanceof ReturnStatement) {
        stmt.value = transformExpressionsInExpression(stmt.value, transform, flags);
    }
    else if (stmt instanceof DeclareVarStmt) {
        if (stmt.value !== undefined) {
            stmt.value = transformExpressionsInExpression(stmt.value, transform, flags);
        }
    }
    else if (stmt instanceof IfStmt) {
        stmt.condition = transformExpressionsInExpression(stmt.condition, transform, flags);
        for (const caseStatement of stmt.trueCase) {
            transformExpressionsInStatement(caseStatement, transform, flags);
        }
        for (const caseStatement of stmt.falseCase) {
            transformExpressionsInStatement(caseStatement, transform, flags);
        }
    }
    else {
        throw new Error(`Unhandled statement kind: ${stmt.constructor.name}`);
    }
}
/**
 * Checks whether the given expression is a string literal.
 */
function isStringLiteral(expr) {
    return expr instanceof LiteralExpr && typeof expr.value === 'string';
}

/**
 * A linked list of `Op` nodes of a given subtype.
 *
 * @param OpT specific subtype of `Op` nodes which this list contains.
 */
class OpList {
    static nextListId = 0;
    /**
     * Debug ID of this `OpList` instance.
     */
    debugListId = OpList.nextListId++;
    // OpList uses static head/tail nodes of a special `ListEnd` type.
    // This avoids the need for special casing of the first and last list
    // elements in all list operations.
    head = {
        kind: OpKind.ListEnd,
        next: null,
        prev: null,
        debugListId: this.debugListId,
    };
    tail = {
        kind: OpKind.ListEnd,
        next: null,
        prev: null,
        debugListId: this.debugListId,
    };
    constructor() {
        // Link `head` and `tail` together at the start (list is empty).
        this.head.next = this.tail;
        this.tail.prev = this.head;
    }
    /**
     * Push a new operation to the tail of the list.
     */
    push(op) {
        if (Array.isArray(op)) {
            for (const o of op) {
                this.push(o);
            }
            return;
        }
        OpList.assertIsNotEnd(op);
        OpList.assertIsUnowned(op);
        op.debugListId = this.debugListId;
        // The old "previous" node (which might be the head, if the list is empty).
        const oldLast = this.tail.prev;
        // Insert `op` following the old last node.
        op.prev = oldLast;
        oldLast.next = op;
        // Connect `op` with the list tail.
        op.next = this.tail;
        this.tail.prev = op;
    }
    /**
     * Prepend one or more nodes to the start of the list.
     */
    prepend(ops) {
        if (ops.length === 0) {
            return;
        }
        for (const op of ops) {
            OpList.assertIsNotEnd(op);
            OpList.assertIsUnowned(op);
            op.debugListId = this.debugListId;
        }
        const first = this.head.next;
        let prev = this.head;
        for (const op of ops) {
            prev.next = op;
            op.prev = prev;
            prev = op;
        }
        prev.next = first;
        first.prev = prev;
    }
    /**
     * `OpList` is iterable via the iteration protocol.
     *
     * It's safe to mutate the part of the list that has already been returned by the iterator, up to
     * and including the last operation returned. Mutations beyond that point _may_ be safe, but may
     * also corrupt the iteration position and should be avoided.
     */
    *[Symbol.iterator]() {
        let current = this.head.next;
        while (current !== this.tail) {
            // Guards against corruption of the iterator state by mutations to the tail of the list during
            // iteration.
            OpList.assertIsOwned(current, this.debugListId);
            const next = current.next;
            yield current;
            current = next;
        }
    }
    *reversed() {
        let current = this.tail.prev;
        while (current !== this.head) {
            OpList.assertIsOwned(current, this.debugListId);
            const prev = current.prev;
            yield current;
            current = prev;
        }
    }
    /**
     * Replace `oldOp` with `newOp` in the list.
     */
    static replace(oldOp, newOp) {
        OpList.assertIsNotEnd(oldOp);
        OpList.assertIsNotEnd(newOp);
        OpList.assertIsOwned(oldOp);
        OpList.assertIsUnowned(newOp);
        newOp.debugListId = oldOp.debugListId;
        if (oldOp.prev !== null) {
            oldOp.prev.next = newOp;
            newOp.prev = oldOp.prev;
        }
        if (oldOp.next !== null) {
            oldOp.next.prev = newOp;
            newOp.next = oldOp.next;
        }
        oldOp.debugListId = null;
        oldOp.prev = null;
        oldOp.next = null;
    }
    /**
     * Replace `oldOp` with some number of new operations in the list (which may include `oldOp`).
     */
    static replaceWithMany(oldOp, newOps) {
        if (newOps.length === 0) {
            // Replacing with an empty list -> pure removal.
            OpList.remove(oldOp);
            return;
        }
        OpList.assertIsNotEnd(oldOp);
        OpList.assertIsOwned(oldOp);
        const listId = oldOp.debugListId;
        oldOp.debugListId = null;
        for (const newOp of newOps) {
            OpList.assertIsNotEnd(newOp);
            // `newOp` might be `oldOp`, but at this point it's been marked as unowned.
            OpList.assertIsUnowned(newOp);
        }
        // It should be safe to reuse `oldOp` in the `newOps` list - maybe you want to sandwich an
        // operation between two new ops.
        const { prev: oldPrev, next: oldNext } = oldOp;
        oldOp.prev = null;
        oldOp.next = null;
        let prev = oldPrev;
        for (const newOp of newOps) {
            this.assertIsUnowned(newOp);
            newOp.debugListId = listId;
            prev.next = newOp;
            newOp.prev = prev;
            // This _should_ be the case, but set it just in case.
            newOp.next = null;
            prev = newOp;
        }
        // At the end of iteration, `prev` holds the last node in the list.
        const first = newOps[0];
        const last = prev;
        // Replace `oldOp` with the chain `first` -> `last`.
        if (oldPrev !== null) {
            oldPrev.next = first;
            first.prev = oldPrev;
        }
        if (oldNext !== null) {
            oldNext.prev = last;
            last.next = oldNext;
        }
    }
    /**
     * Remove the given node from the list which contains it.
     */
    static remove(op) {
        OpList.assertIsNotEnd(op);
        OpList.assertIsOwned(op);
        op.prev.next = op.next;
        op.next.prev = op.prev;
        // Break any link between the node and this list to safeguard against its usage in future
        // operations.
        op.debugListId = null;
        op.prev = null;
        op.next = null;
    }
    /**
     * Insert `op` before `target`.
     */
    static insertBefore(op, target) {
        if (Array.isArray(op)) {
            for (const o of op) {
                this.insertBefore(o, target);
            }
            return;
        }
        OpList.assertIsOwned(target);
        if (target.prev === null) {
            throw new Error(`AssertionError: illegal operation on list start`);
        }
        OpList.assertIsNotEnd(op);
        OpList.assertIsUnowned(op);
        op.debugListId = target.debugListId;
        // Just in case.
        op.prev = null;
        target.prev.next = op;
        op.prev = target.prev;
        op.next = target;
        target.prev = op;
    }
    /**
     * Insert `op` after `target`.
     */
    static insertAfter(op, target) {
        OpList.assertIsOwned(target);
        if (target.next === null) {
            throw new Error(`AssertionError: illegal operation on list end`);
        }
        OpList.assertIsNotEnd(op);
        OpList.assertIsUnowned(op);
        op.debugListId = target.debugListId;
        target.next.prev = op;
        op.next = target.next;
        op.prev = target;
        target.next = op;
    }
    /**
     * Asserts that `op` does not currently belong to a list.
     */
    static assertIsUnowned(op) {
        if (op.debugListId !== null) {
            throw new Error(`AssertionError: illegal operation on owned node: ${OpKind[op.kind]}`);
        }
    }
    /**
     * Asserts that `op` currently belongs to a list. If `byList` is passed, `op` is asserted to
     * specifically belong to that list.
     */
    static assertIsOwned(op, byList) {
        if (op.debugListId === null) {
            throw new Error(`AssertionError: illegal operation on unowned node: ${OpKind[op.kind]}`);
        }
        else if (byList !== undefined && op.debugListId !== byList) {
            throw new Error(`AssertionError: node belongs to the wrong list (expected ${byList}, actual ${op.debugListId})`);
        }
    }
    /**
     * Asserts that `op` is not a special `ListEnd` node.
     */
    static assertIsNotEnd(op) {
        if (op.kind === OpKind.ListEnd) {
            throw new Error(`AssertionError: illegal operation on list head or tail`);
        }
    }
}

class SlotHandle {
    slot = null;
}

/**
 * The set of OpKinds that represent the creation of an element or container
 */
const elementContainerOpKinds = new Set([
    OpKind.Element,
    OpKind.ElementStart,
    OpKind.Container,
    OpKind.ContainerStart,
    OpKind.Template,
    OpKind.RepeaterCreate,
]);
/**
 * Checks whether the given operation represents the creation of an element or container.
 */
function isElementOrContainerOp(op) {
    return elementContainerOpKinds.has(op.kind);
}
/**
 * Create an `ElementStartOp`.
 */
function createElementStartOp(tag, xref, namespace, i18nPlaceholder, startSourceSpan, wholeSourceSpan) {
    return {
        kind: OpKind.ElementStart,
        xref,
        tag,
        handle: new SlotHandle(),
        attributes: null,
        localRefs: [],
        nonBindable: false,
        namespace,
        i18nPlaceholder,
        startSourceSpan,
        wholeSourceSpan,
        ...TRAIT_CONSUMES_SLOT,
        ...NEW_OP,
    };
}
/**
 * Create a `TemplateOp`.
 */
function createTemplateOp(xref, templateKind, tag, functionNameSuffix, namespace, i18nPlaceholder, startSourceSpan, wholeSourceSpan) {
    return {
        kind: OpKind.Template,
        xref,
        templateKind,
        attributes: null,
        tag,
        handle: new SlotHandle(),
        functionNameSuffix,
        decls: null,
        vars: null,
        localRefs: [],
        nonBindable: false,
        namespace,
        i18nPlaceholder,
        startSourceSpan,
        wholeSourceSpan,
        ...TRAIT_CONSUMES_SLOT,
        ...NEW_OP,
    };
}
function createRepeaterCreateOp(primaryView, emptyView, tag, track, varNames, emptyTag, i18nPlaceholder, emptyI18nPlaceholder, startSourceSpan, wholeSourceSpan) {
    return {
        kind: OpKind.RepeaterCreate,
        attributes: null,
        xref: primaryView,
        handle: new SlotHandle(),
        emptyView,
        track,
        trackByFn: null,
        trackByOps: null,
        tag,
        emptyTag,
        emptyAttributes: null,
        functionNameSuffix: 'For',
        namespace: Namespace.HTML,
        nonBindable: false,
        localRefs: [],
        decls: null,
        vars: null,
        varNames,
        usesComponentInstance: false,
        i18nPlaceholder,
        emptyI18nPlaceholder,
        startSourceSpan,
        wholeSourceSpan,
        ...TRAIT_CONSUMES_SLOT,
        ...NEW_OP,
        ...TRAIT_CONSUMES_VARS,
        numSlotsUsed: emptyView === null ? 2 : 3,
    };
}
/**
 * Create an `ElementEndOp`.
 */
function createElementEndOp(xref, sourceSpan) {
    return {
        kind: OpKind.ElementEnd,
        xref,
        sourceSpan,
        ...NEW_OP,
    };
}
function createDisableBindingsOp(xref) {
    return {
        kind: OpKind.DisableBindings,
        xref,
        ...NEW_OP,
    };
}
function createEnableBindingsOp(xref) {
    return {
        kind: OpKind.EnableBindings,
        xref,
        ...NEW_OP,
    };
}
/**
 * Create a `TextOp`.
 */
function createTextOp(xref, initialValue, icuPlaceholder, sourceSpan) {
    return {
        kind: OpKind.Text,
        xref,
        handle: new SlotHandle(),
        initialValue,
        icuPlaceholder,
        sourceSpan,
        ...TRAIT_CONSUMES_SLOT,
        ...NEW_OP,
    };
}
/**
 * Create a `ListenerOp`. Host bindings reuse all the listener logic.
 */
function createListenerOp(target, targetSlot, name, tag, handlerOps, animationPhase, eventTarget, hostListener, sourceSpan) {
    const handlerList = new OpList();
    handlerList.push(handlerOps);
    return {
        kind: OpKind.Listener,
        target,
        targetSlot,
        tag,
        hostListener,
        name,
        handlerOps: handlerList,
        handlerFnName: null,
        consumesDollarEvent: false,
        isAnimationListener: animationPhase !== null,
        animationPhase,
        eventTarget,
        sourceSpan,
        ...NEW_OP,
    };
}
/**
 * Create a `TwoWayListenerOp`.
 */
function createTwoWayListenerOp(target, targetSlot, name, tag, handlerOps, sourceSpan) {
    const handlerList = new OpList();
    handlerList.push(handlerOps);
    return {
        kind: OpKind.TwoWayListener,
        target,
        targetSlot,
        tag,
        name,
        handlerOps: handlerList,
        handlerFnName: null,
        sourceSpan,
        ...NEW_OP,
    };
}
function createPipeOp(xref, slot, name) {
    return {
        kind: OpKind.Pipe,
        xref,
        handle: slot,
        name,
        ...NEW_OP,
        ...TRAIT_CONSUMES_SLOT,
    };
}
function createNamespaceOp(namespace) {
    return {
        kind: OpKind.Namespace,
        active: namespace,
        ...NEW_OP,
    };
}
function createProjectionDefOp(def) {
    return {
        kind: OpKind.ProjectionDef,
        def,
        ...NEW_OP,
    };
}
function createProjectionOp(xref, selector, i18nPlaceholder, fallbackView, sourceSpan) {
    return {
        kind: OpKind.Projection,
        xref,
        handle: new SlotHandle(),
        selector,
        i18nPlaceholder,
        fallbackView,
        projectionSlotIndex: 0,
        attributes: null,
        localRefs: [],
        sourceSpan,
        ...NEW_OP,
        ...TRAIT_CONSUMES_SLOT,
        numSlotsUsed: fallbackView === null ? 1 : 2,
    };
}
/**
 * Create an `ExtractedAttributeOp`.
 */
function createExtractedAttributeOp(target, bindingKind, namespace, name, expression, i18nContext, i18nMessage, securityContext) {
    return {
        kind: OpKind.ExtractedAttribute,
        target,
        bindingKind,
        namespace,
        name,
        expression,
        i18nContext,
        i18nMessage,
        securityContext,
        trustedValueFn: null,
        ...NEW_OP,
    };
}
function createDeferOp(xref, main, mainSlot, ownResolverFn, resolverFn, sourceSpan) {
    return {
        kind: OpKind.Defer,
        xref,
        handle: new SlotHandle(),
        mainView: main,
        mainSlot,
        loadingView: null,
        loadingSlot: null,
        loadingConfig: null,
        loadingMinimumTime: null,
        loadingAfterTime: null,
        placeholderView: null,
        placeholderSlot: null,
        placeholderConfig: null,
        placeholderMinimumTime: null,
        errorView: null,
        errorSlot: null,
        ownResolverFn,
        resolverFn,
        flags: null,
        sourceSpan,
        ...NEW_OP,
        ...TRAIT_CONSUMES_SLOT,
        numSlotsUsed: 2,
    };
}
function createDeferOnOp(defer, trigger, modifier, sourceSpan) {
    return {
        kind: OpKind.DeferOn,
        defer,
        trigger,
        modifier,
        sourceSpan,
        ...NEW_OP,
    };
}
/**
 * Creates a `DeclareLetOp`.
 */
function createDeclareLetOp(xref, declaredName, sourceSpan) {
    return {
        kind: OpKind.DeclareLet,
        xref,
        declaredName,
        sourceSpan,
        handle: new SlotHandle(),
        ...TRAIT_CONSUMES_SLOT,
        ...NEW_OP,
    };
}
/**
 * Create an `ExtractedMessageOp`.
 */
function createI18nMessageOp(xref, i18nContext, i18nBlock, message, messagePlaceholder, params, postprocessingParams, needsPostprocessing) {
    return {
        kind: OpKind.I18nMessage,
        xref,
        i18nContext,
        i18nBlock,
        message,
        messagePlaceholder,
        params,
        postprocessingParams,
        needsPostprocessing,
        subMessages: [],
        ...NEW_OP,
    };
}
/**
 * Create an `I18nStartOp`.
 */
function createI18nStartOp(xref, message, root, sourceSpan) {
    return {
        kind: OpKind.I18nStart,
        xref,
        handle: new SlotHandle(),
        root: root ?? xref,
        message,
        messageIndex: null,
        subTemplateIndex: null,
        context: null,
        sourceSpan,
        ...NEW_OP,
        ...TRAIT_CONSUMES_SLOT,
    };
}
/**
 * Create an `I18nEndOp`.
 */
function createI18nEndOp(xref, sourceSpan) {
    return {
        kind: OpKind.I18nEnd,
        xref,
        sourceSpan,
        ...NEW_OP,
    };
}
/**
 * Creates an ICU start op.
 */
function createIcuStartOp(xref, message, messagePlaceholder, sourceSpan) {
    return {
        kind: OpKind.IcuStart,
        xref,
        message,
        messagePlaceholder,
        context: null,
        sourceSpan,
        ...NEW_OP,
    };
}
/**
 * Creates an ICU end op.
 */
function createIcuEndOp(xref) {
    return {
        kind: OpKind.IcuEnd,
        xref,
        ...NEW_OP,
    };
}
/**
 * Creates an ICU placeholder op.
 */
function createIcuPlaceholderOp(xref, name, strings) {
    return {
        kind: OpKind.IcuPlaceholder,
        xref,
        name,
        strings,
        expressionPlaceholders: [],
        ...NEW_OP,
    };
}
function createI18nContextOp(contextKind, xref, i18nBlock, message, sourceSpan) {
    if (i18nBlock === null && contextKind !== I18nContextKind.Attr) {
        throw new Error('AssertionError: i18nBlock must be provided for non-attribute contexts.');
    }
    return {
        kind: OpKind.I18nContext,
        contextKind,
        xref,
        i18nBlock,
        message,
        sourceSpan,
        params: new Map(),
        postprocessingParams: new Map(),
        ...NEW_OP,
    };
}
function createI18nAttributesOp(xref, handle, target) {
    return {
        kind: OpKind.I18nAttributes,
        xref,
        handle,
        target,
        i18nAttributesConfig: null,
        ...NEW_OP,
        ...TRAIT_CONSUMES_SLOT,
    };
}
/** Create a `SourceLocationOp`. */
function createSourceLocationOp(templatePath, locations) {
    return {
        kind: OpKind.SourceLocation,
        templatePath,
        locations,
        ...NEW_OP,
    };
}

function createHostPropertyOp(name, expression, isAnimationTrigger, i18nContext, securityContext, sourceSpan) {
    return {
        kind: OpKind.HostProperty,
        name,
        expression,
        isAnimationTrigger,
        i18nContext,
        securityContext,
        sanitizer: null,
        sourceSpan,
        ...TRAIT_CONSUMES_VARS,
        ...NEW_OP,
    };
}

/**
 * When referenced in the template's context parameters, this indicates a reference to the entire
 * context object, rather than a specific parameter.
 */
const CTX_REF = 'CTX_REF_MARKER';

var CompilationJobKind;
(function (CompilationJobKind) {
    CompilationJobKind[CompilationJobKind["Tmpl"] = 0] = "Tmpl";
    CompilationJobKind[CompilationJobKind["Host"] = 1] = "Host";
    CompilationJobKind[CompilationJobKind["Both"] = 2] = "Both";
})(CompilationJobKind || (CompilationJobKind = {}));
/**
 * An entire ongoing compilation, which will result in one or more template functions when complete.
 * Contains one or more corresponding compilation units.
 */
class CompilationJob {
    componentName;
    pool;
    compatibility;
    constructor(componentName, pool, compatibility) {
        this.componentName = componentName;
        this.pool = pool;
        this.compatibility = compatibility;
    }
    kind = CompilationJobKind.Both;
    /**
     * Generate a new unique `ir.XrefId` in this job.
     */
    allocateXrefId() {
        return this.nextXrefId++;
    }
    /**
     * Tracks the next `ir.XrefId` which can be assigned as template structures are ingested.
     */
    nextXrefId = 0;
}
/**
 * Compilation-in-progress of a whole component's template, including the main template and any
 * embedded views or host bindings.
 */
class ComponentCompilationJob extends CompilationJob {
    relativeContextFilePath;
    i18nUseExternalIds;
    deferMeta;
    allDeferrableDepsFn;
    relativeTemplatePath;
    enableDebugLocations;
    constructor(componentName, pool, compatibility, relativeContextFilePath, i18nUseExternalIds, deferMeta, allDeferrableDepsFn, relativeTemplatePath, enableDebugLocations) {
        super(componentName, pool, compatibility);
        this.relativeContextFilePath = relativeContextFilePath;
        this.i18nUseExternalIds = i18nUseExternalIds;
        this.deferMeta = deferMeta;
        this.allDeferrableDepsFn = allDeferrableDepsFn;
        this.relativeTemplatePath = relativeTemplatePath;
        this.enableDebugLocations = enableDebugLocations;
        this.root = new ViewCompilationUnit(this, this.allocateXrefId(), null);
        this.views.set(this.root.xref, this.root);
    }
    kind = CompilationJobKind.Tmpl;
    fnSuffix = 'Template';
    /**
     * The root view, representing the component's template.
     */
    root;
    views = new Map();
    /**
     * Causes ngContentSelectors to be emitted, for content projection slots in the view. Possibly a
     * reference into the constant pool.
     */
    contentSelectors = null;
    /**
     * Add a `ViewCompilation` for a new embedded view to this compilation.
     */
    allocateView(parent) {
        const view = new ViewCompilationUnit(this, this.allocateXrefId(), parent);
        this.views.set(view.xref, view);
        return view;
    }
    get units() {
        return this.views.values();
    }
    /**
     * Add a constant `o.Expression` to the compilation and return its index in the `consts` array.
     */
    addConst(newConst, initializers) {
        for (let idx = 0; idx < this.consts.length; idx++) {
            if (this.consts[idx].isEquivalent(newConst)) {
                return idx;
            }
        }
        const idx = this.consts.length;
        this.consts.push(newConst);
        if (initializers) {
            this.constsInitializers.push(...initializers);
        }
        return idx;
    }
    /**
     * Constant expressions used by operations within this component's compilation.
     *
     * This will eventually become the `consts` array in the component definition.
     */
    consts = [];
    /**
     * Initialization statements needed to set up the consts.
     */
    constsInitializers = [];
}
/**
 * A compilation unit is compiled into a template function. Some example units are views and host
 * bindings.
 */
class CompilationUnit {
    xref;
    constructor(xref) {
        this.xref = xref;
    }
    /**
     * List of creation operations for this view.
     *
     * Creation operations may internally contain other operations, including update operations.
     */
    create = new OpList();
    /**
     * List of update operations for this view.
     */
    update = new OpList();
    /**
     * Name of the function which will be generated for this unit.
     *
     * May be `null` if not yet determined.
     */
    fnName = null;
    /**
     * Number of variable slots used within this view, or `null` if variables have not yet been
     * counted.
     */
    vars = null;
    /**
     * Iterate over all `ir.Op`s within this view.
     *
     * Some operations may have child operations, which this iterator will visit.
     */
    *ops() {
        for (const op of this.create) {
            yield op;
            if (op.kind === OpKind.Listener || op.kind === OpKind.TwoWayListener) {
                for (const listenerOp of op.handlerOps) {
                    yield listenerOp;
                }
            }
            else if (op.kind === OpKind.RepeaterCreate && op.trackByOps !== null) {
                for (const trackOp of op.trackByOps) {
                    yield trackOp;
                }
            }
        }
        for (const op of this.update) {
            yield op;
        }
    }
}
/**
 * Compilation-in-progress of an individual view within a template.
 */
class ViewCompilationUnit extends CompilationUnit {
    job;
    parent;
    constructor(job, xref, parent) {
        super(xref);
        this.job = job;
        this.parent = parent;
    }
    /**
     * Map of declared variables available within this view to the property on the context object
     * which they alias.
     */
    contextVariables = new Map();
    /**
     * Set of aliases available within this view. An alias is a variable whose provided expression is
     * inlined at every location it is used. It may also depend on context variables, by name.
     */
    aliases = new Set();
    /**
     * Number of declaration slots used within th   is view, or `null` if slots have not yet been
     * allocated.
     */
    decls = null;
}
/**
 * Compilation-in-progress of a host binding, which contains a single unit for that host binding.
 */
class HostBindingCompilationJob extends CompilationJob {
    constructor(componentName, pool, compatibility) {
        super(componentName, pool, compatibility);
        this.root = new HostBindingCompilationUnit(this);
    }
    kind = CompilationJobKind.Host;
    fnSuffix = 'HostBindings';
    root;
    get units() {
        return [this.root];
    }
}
class HostBindingCompilationUnit extends CompilationUnit {
    job;
    constructor(job) {
        super(0);
        this.job = job;
    }
    /**
     * Much like an element can have attributes, so can a host binding function.
     */
    attributes = null;
}

/**
 * Find any function calls to `$any`, excluding `this.$any`, and delete them, since they have no
 * runtime effects.
 */
function deleteAnyCasts(job) {
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            transformExpressionsInOp(op, removeAnys, VisitorContextFlag.None);
        }
    }
}
function removeAnys(e) {
    if (e instanceof InvokeFunctionExpr &&
        e.fn instanceof LexicalReadExpr &&
        e.fn.name === '$any') {
        if (e.args.length !== 1) {
            throw new Error('The $any builtin function expects exactly one argument.');
        }
        return e.args[0];
    }
    return e;
}

/**
 * Adds apply operations after i18n expressions.
 */
function applyI18nExpressions(job) {
    const i18nContexts = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.I18nContext) {
                i18nContexts.set(op.xref, op);
            }
        }
    }
    for (const unit of job.units) {
        for (const op of unit.update) {
            // Only add apply after expressions that are not followed by more expressions.
            if (op.kind === OpKind.I18nExpression && needsApplication(i18nContexts, op)) {
                // TODO: what should be the source span for the apply op?
                OpList.insertAfter(createI18nApplyOp(op.i18nOwner, op.handle, null), op);
            }
        }
    }
}
/**
 * Checks whether the given expression op needs to be followed with an apply op.
 */
function needsApplication(i18nContexts, op) {
    // If the next op is not another expression, we need to apply.
    if (op.next?.kind !== OpKind.I18nExpression) {
        return true;
    }
    const context = i18nContexts.get(op.context);
    const nextContext = i18nContexts.get(op.next.context);
    if (context === undefined) {
        throw new Error("AssertionError: expected an I18nContextOp to exist for the I18nExpressionOp's context");
    }
    if (nextContext === undefined) {
        throw new Error("AssertionError: expected an I18nContextOp to exist for the next I18nExpressionOp's context");
    }
    // If the next op is an expression targeting a different i18n block (or different element, in the
    // case of i18n attributes), we need to apply.
    // First, handle the case of i18n blocks.
    if (context.i18nBlock !== null) {
        // This is a block context. Compare the blocks.
        if (context.i18nBlock !== nextContext.i18nBlock) {
            return true;
        }
        return false;
    }
    // Second, handle the case of i18n attributes.
    if (op.i18nOwner !== op.next.i18nOwner) {
        return true;
    }
    return false;
}

/**
 * Updates i18n expression ops to target the last slot in their owning i18n block, and moves them
 * after the last update instruction that depends on that slot.
 */
function assignI18nSlotDependencies(job) {
    for (const unit of job.units) {
        // The first update op.
        let updateOp = unit.update.head;
        // I18n expressions currently being moved during the iteration.
        let i18nExpressionsInProgress = [];
        // Non-null  while we are iterating through an i18nStart/i18nEnd pair
        let state = null;
        for (const createOp of unit.create) {
            if (createOp.kind === OpKind.I18nStart) {
                state = {
                    blockXref: createOp.xref,
                    lastSlotConsumer: createOp.xref,
                };
            }
            else if (createOp.kind === OpKind.I18nEnd) {
                for (const op of i18nExpressionsInProgress) {
                    op.target = state.lastSlotConsumer;
                    OpList.insertBefore(op, updateOp);
                }
                i18nExpressionsInProgress.length = 0;
                state = null;
            }
            if (hasConsumesSlotTrait(createOp)) {
                if (state !== null) {
                    state.lastSlotConsumer = createOp.xref;
                }
                while (true) {
                    if (updateOp.next === null) {
                        break;
                    }
                    if (state !== null &&
                        updateOp.kind === OpKind.I18nExpression &&
                        updateOp.usage === I18nExpressionFor.I18nText &&
                        updateOp.i18nOwner === state.blockXref) {
                        const opToRemove = updateOp;
                        updateOp = updateOp.next;
                        OpList.remove(opToRemove);
                        i18nExpressionsInProgress.push(opToRemove);
                        continue;
                    }
                    if (hasDependsOnSlotContextTrait(updateOp) && updateOp.target !== createOp.xref) {
                        break;
                    }
                    updateOp = updateOp.next;
                }
            }
        }
    }
}

/**
 * Gets a map of all elements in the given view by their xref id.
 */
function createOpXrefMap(unit) {
    const map = new Map();
    for (const op of unit.create) {
        if (!hasConsumesSlotTrait(op)) {
            continue;
        }
        map.set(op.xref, op);
        // TODO(dylhunn): `@for` loops with `@empty` blocks need to be special-cased here,
        // because the slot consumer trait currently only supports one slot per consumer and we
        // need two. This should be revisited when making the refactors mentioned in:
        // https://github.com/angular/angular/pull/53620#discussion_r1430918822
        if (op.kind === OpKind.RepeaterCreate && op.emptyView !== null) {
            map.set(op.emptyView, op);
        }
    }
    return map;
}

/**
 * Find all extractable attribute and binding ops, and create ExtractedAttributeOps for them.
 * In cases where no instruction needs to be generated for the attribute or binding, it is removed.
 */
function extractAttributes(job) {
    for (const unit of job.units) {
        const elements = createOpXrefMap(unit);
        for (const op of unit.ops()) {
            switch (op.kind) {
                case OpKind.Attribute:
                    extractAttributeOp(unit, op, elements);
                    break;
                case OpKind.Property:
                    if (!op.isAnimationTrigger) {
                        let bindingKind;
                        if (op.i18nMessage !== null && op.templateKind === null) {
                            // If the binding has an i18n context, it is an i18n attribute, and should have that
                            // kind in the consts array.
                            bindingKind = BindingKind.I18n;
                        }
                        else if (op.isStructuralTemplateAttribute) {
                            bindingKind = BindingKind.Template;
                        }
                        else {
                            bindingKind = BindingKind.Property;
                        }
                        OpList.insertBefore(
                        // Deliberately null i18nMessage value
                        createExtractedAttributeOp(op.target, bindingKind, null, op.name, 
                        /* expression */ null, 
                        /* i18nContext */ null, 
                        /* i18nMessage */ null, op.securityContext), lookupElement$2(elements, op.target));
                    }
                    break;
                case OpKind.TwoWayProperty:
                    OpList.insertBefore(createExtractedAttributeOp(op.target, BindingKind.TwoWayProperty, null, op.name, 
                    /* expression */ null, 
                    /* i18nContext */ null, 
                    /* i18nMessage */ null, op.securityContext), lookupElement$2(elements, op.target));
                    break;
                case OpKind.StyleProp:
                case OpKind.ClassProp:
                    // TODO: Can style or class bindings be i18n attributes?
                    // The old compiler treated empty style bindings as regular bindings for the purpose of
                    // directive matching. That behavior is incorrect, but we emulate it in compatibility
                    // mode.
                    if (unit.job.compatibility === CompatibilityMode.TemplateDefinitionBuilder &&
                        op.expression instanceof EmptyExpr) {
                        OpList.insertBefore(createExtractedAttributeOp(op.target, BindingKind.Property, null, op.name, 
                        /* expression */ null, 
                        /* i18nContext */ null, 
                        /* i18nMessage */ null, SecurityContext.STYLE), lookupElement$2(elements, op.target));
                    }
                    break;
                case OpKind.Listener:
                    if (!op.isAnimationListener) {
                        const extractedAttributeOp = createExtractedAttributeOp(op.target, BindingKind.Property, null, op.name, 
                        /* expression */ null, 
                        /* i18nContext */ null, 
                        /* i18nMessage */ null, SecurityContext.NONE);
                        if (job.kind === CompilationJobKind.Host) {
                            if (job.compatibility) {
                                // TemplateDefinitionBuilder does not extract listener bindings to the const array
                                // (which is honestly pretty inconsistent).
                                break;
                            }
                            // This attribute will apply to the enclosing host binding compilation unit, so order
                            // doesn't matter.
                            unit.create.push(extractedAttributeOp);
                        }
                        else {
                            OpList.insertBefore(extractedAttributeOp, lookupElement$2(elements, op.target));
                        }
                    }
                    break;
                case OpKind.TwoWayListener:
                    // Two-way listeners aren't supported in host bindings.
                    if (job.kind !== CompilationJobKind.Host) {
                        const extractedAttributeOp = createExtractedAttributeOp(op.target, BindingKind.Property, null, op.name, 
                        /* expression */ null, 
                        /* i18nContext */ null, 
                        /* i18nMessage */ null, SecurityContext.NONE);
                        OpList.insertBefore(extractedAttributeOp, lookupElement$2(elements, op.target));
                    }
                    break;
            }
        }
    }
}
/**
 * Looks up an element in the given map by xref ID.
 */
function lookupElement$2(elements, xref) {
    const el = elements.get(xref);
    if (el === undefined) {
        throw new Error('All attributes should have an element-like target.');
    }
    return el;
}
/**
 * Extracts an attribute binding.
 */
function extractAttributeOp(unit, op, elements) {
    if (op.expression instanceof Interpolation) {
        return;
    }
    let extractable = op.isTextAttribute || op.expression.isConstant();
    if (unit.job.compatibility === CompatibilityMode.TemplateDefinitionBuilder) {
        // TemplateDefinitionBuilder only extracts text attributes. It does not extract attriibute
        // bindings, even if they are constants.
        extractable &&= op.isTextAttribute;
    }
    if (extractable) {
        const extractedAttributeOp = createExtractedAttributeOp(op.target, op.isStructuralTemplateAttribute ? BindingKind.Template : BindingKind.Attribute, op.namespace, op.name, op.expression, op.i18nContext, op.i18nMessage, op.securityContext);
        if (unit.job.kind === CompilationJobKind.Host) {
            // This attribute will apply to the enclosing host binding compilation unit, so order doesn't
            // matter.
            unit.create.push(extractedAttributeOp);
        }
        else {
            const ownerOp = lookupElement$2(elements, op.target);
            OpList.insertBefore(extractedAttributeOp, ownerOp);
        }
        OpList.remove(op);
    }
}

/**
 * Looks up an element in the given map by xref ID.
 */
function lookupElement$1(elements, xref) {
    const el = elements.get(xref);
    if (el === undefined) {
        throw new Error('All attributes should have an element-like target.');
    }
    return el;
}
function specializeBindings(job) {
    const elements = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (!isElementOrContainerOp(op)) {
                continue;
            }
            elements.set(op.xref, op);
        }
    }
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            if (op.kind !== OpKind.Binding) {
                continue;
            }
            switch (op.bindingKind) {
                case BindingKind.Attribute:
                    if (op.name === 'ngNonBindable') {
                        OpList.remove(op);
                        const target = lookupElement$1(elements, op.target);
                        target.nonBindable = true;
                    }
                    else {
                        const [namespace, name] = splitNsName(op.name);
                        OpList.replace(op, createAttributeOp(op.target, namespace, name, op.expression, op.securityContext, op.isTextAttribute, op.isStructuralTemplateAttribute, op.templateKind, op.i18nMessage, op.sourceSpan));
                    }
                    break;
                case BindingKind.Property:
                case BindingKind.Animation:
                    if (job.kind === CompilationJobKind.Host) {
                        OpList.replace(op, createHostPropertyOp(op.name, op.expression, op.bindingKind === BindingKind.Animation, op.i18nContext, op.securityContext, op.sourceSpan));
                    }
                    else {
                        OpList.replace(op, createPropertyOp(op.target, op.name, op.expression, op.bindingKind === BindingKind.Animation, op.securityContext, op.isStructuralTemplateAttribute, op.templateKind, op.i18nContext, op.i18nMessage, op.sourceSpan));
                    }
                    break;
                case BindingKind.TwoWayProperty:
                    if (!(op.expression instanceof Expression)) {
                        // We shouldn't be able to hit this code path since interpolations in two-way bindings
                        // result in a parser error. We assert here so that downstream we can assume that
                        // the value is always an expression.
                        throw new Error(`Expected value of two-way property binding "${op.name}" to be an expression`);
                    }
                    OpList.replace(op, createTwoWayPropertyOp(op.target, op.name, op.expression, op.securityContext, op.isStructuralTemplateAttribute, op.templateKind, op.i18nContext, op.i18nMessage, op.sourceSpan));
                    break;
                case BindingKind.I18n:
                case BindingKind.ClassName:
                case BindingKind.StyleProperty:
                    throw new Error(`Unhandled binding of kind ${BindingKind[op.bindingKind]}`);
            }
        }
    }
}

const CHAINABLE = new Set([
    Identifiers.attribute,
    Identifiers.classProp,
    Identifiers.element,
    Identifiers.elementContainer,
    Identifiers.elementContainerEnd,
    Identifiers.elementContainerStart,
    Identifiers.elementEnd,
    Identifiers.elementStart,
    Identifiers.hostProperty,
    Identifiers.i18nExp,
    Identifiers.listener,
    Identifiers.listener,
    Identifiers.property,
    Identifiers.styleProp,
    Identifiers.stylePropInterpolate1,
    Identifiers.stylePropInterpolate2,
    Identifiers.stylePropInterpolate3,
    Identifiers.stylePropInterpolate4,
    Identifiers.stylePropInterpolate5,
    Identifiers.stylePropInterpolate6,
    Identifiers.stylePropInterpolate7,
    Identifiers.stylePropInterpolate8,
    Identifiers.stylePropInterpolateV,
    Identifiers.syntheticHostListener,
    Identifiers.syntheticHostProperty,
    Identifiers.templateCreate,
    Identifiers.twoWayProperty,
    Identifiers.twoWayListener,
    Identifiers.declareLet,
]);
/**
 * Chaining results in repeated call expressions, causing a deep AST of receiver expressions. To prevent running out of
 * stack depth the maximum number of chained instructions is limited to this threshold, which has been selected
 * arbitrarily.
 */
const MAX_CHAIN_LENGTH = 256;
/**
 * Post-process a reified view compilation and convert sequential calls to chainable instructions
 * into chain calls.
 *
 * For example, two `elementStart` operations in sequence:
 *
 * ```ts
 * elementStart(0, 'div');
 * elementStart(1, 'span');
 * ```
 *
 * Can be called as a chain instead:
 *
 * ```ts
 * elementStart(0, 'div')(1, 'span');
 * ```
 */
function chain(job) {
    for (const unit of job.units) {
        chainOperationsInList(unit.create);
        chainOperationsInList(unit.update);
    }
}
function chainOperationsInList(opList) {
    let chain = null;
    for (const op of opList) {
        if (op.kind !== OpKind.Statement || !(op.statement instanceof ExpressionStatement)) {
            // This type of statement isn't chainable.
            chain = null;
            continue;
        }
        if (!(op.statement.expr instanceof InvokeFunctionExpr) ||
            !(op.statement.expr.fn instanceof ExternalExpr)) {
            // This is a statement, but not an instruction-type call, so not chainable.
            chain = null;
            continue;
        }
        const instruction = op.statement.expr.fn.value;
        if (!CHAINABLE.has(instruction)) {
            // This instruction isn't chainable.
            chain = null;
            continue;
        }
        // This instruction can be chained. It can either be added on to the previous chain (if
        // compatible) or it can be the start of a new chain.
        if (chain !== null && chain.instruction === instruction && chain.length < MAX_CHAIN_LENGTH) {
            // This instruction can be added onto the previous chain.
            const expression = chain.expression.callFn(op.statement.expr.args, op.statement.expr.sourceSpan, op.statement.expr.pure);
            chain.expression = expression;
            chain.op.statement = expression.toStmt();
            chain.length++;
            OpList.remove(op);
        }
        else {
            // Leave this instruction alone for now, but consider it the start of a new chain.
            chain = {
                op,
                instruction,
                expression: op.statement.expr,
                length: 1,
            };
        }
    }
}

/**
 * Attribute interpolations of the form `[attr.foo]="{{foo}}""` should be "collapsed" into a plain
 * attribute instruction, instead of an `attributeInterpolate` instruction.
 *
 * (We cannot do this for singleton property interpolations, because `propertyInterpolate`
 * stringifies its expression.)
 *
 * The reification step is also capable of performing this transformation, but doing it early in the
 * pipeline allows other phases to accurately know what instruction will be emitted.
 */
function collapseSingletonInterpolations(job) {
    for (const unit of job.units) {
        for (const op of unit.update) {
            const eligibleOpKind = op.kind === OpKind.Attribute;
            if (eligibleOpKind &&
                op.expression instanceof Interpolation &&
                op.expression.strings.length === 2 &&
                op.expression.strings.every((s) => s === '')) {
                op.expression = op.expression.expressions[0];
            }
        }
    }
}

/**
 * Collapse the various conditions of conditional ops (if, switch) into a single test expression.
 */
function generateConditionalExpressions(job) {
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            if (op.kind !== OpKind.Conditional) {
                continue;
            }
            let test;
            // Any case with a `null` condition is `default`. If one exists, default to it instead.
            const defaultCase = op.conditions.findIndex((cond) => cond.expr === null);
            if (defaultCase >= 0) {
                const slot = op.conditions.splice(defaultCase, 1)[0].targetSlot;
                test = new SlotLiteralExpr(slot);
            }
            else {
                // By default, a switch evaluates to `-1`, causing no template to be displayed.
                test = literal$1(-1);
            }
            // Switch expressions assign their main test to a temporary, to avoid re-executing it.
            let tmp = op.test == null ? null : new AssignTemporaryExpr(op.test, job.allocateXrefId());
            // For each remaining condition, test whether the temporary satifies the check. (If no temp is
            // present, just check each expression directly.)
            for (let i = op.conditions.length - 1; i >= 0; i--) {
                let conditionalCase = op.conditions[i];
                if (conditionalCase.expr === null) {
                    continue;
                }
                if (tmp !== null) {
                    const useTmp = i === 0 ? tmp : new ReadTemporaryExpr(tmp.xref);
                    conditionalCase.expr = new BinaryOperatorExpr(BinaryOperator.Identical, useTmp, conditionalCase.expr);
                }
                else if (conditionalCase.alias !== null) {
                    const caseExpressionTemporaryXref = job.allocateXrefId();
                    conditionalCase.expr = new AssignTemporaryExpr(conditionalCase.expr, caseExpressionTemporaryXref);
                    op.contextValue = new ReadTemporaryExpr(caseExpressionTemporaryXref);
                }
                test = new ConditionalExpr(conditionalCase.expr, new SlotLiteralExpr(conditionalCase.targetSlot), test);
            }
            // Save the resulting aggregate Joost-expression.
            op.processed = test;
            // Clear the original conditions array, since we no longer need it, and don't want it to
            // affect subsequent phases (e.g. pipe creation).
            op.conditions = [];
        }
    }
}

const BINARY_OPERATORS$3 = new Map([
    ['&&', BinaryOperator.And],
    ['>', BinaryOperator.Bigger],
    ['>=', BinaryOperator.BiggerEquals],
    ['|', BinaryOperator.BitwiseOr],
    ['&', BinaryOperator.BitwiseAnd],
    ['/', BinaryOperator.Divide],
    ['==', BinaryOperator.Equals],
    ['===', BinaryOperator.Identical],
    ['<', BinaryOperator.Lower],
    ['<=', BinaryOperator.LowerEquals],
    ['-', BinaryOperator.Minus],
    ['%', BinaryOperator.Modulo],
    ['*', BinaryOperator.Multiply],
    ['!=', BinaryOperator.NotEquals],
    ['!==', BinaryOperator.NotIdentical],
    ['??', BinaryOperator.NullishCoalesce],
    ['||', BinaryOperator.Or],
    ['+', BinaryOperator.Plus],
]);
function namespaceForKey(namespacePrefixKey) {
    const NAMESPACES = new Map([
        ['svg', Namespace.SVG],
        ['math', Namespace.Math],
    ]);
    if (namespacePrefixKey === null) {
        return Namespace.HTML;
    }
    return NAMESPACES.get(namespacePrefixKey) ?? Namespace.HTML;
}
function keyForNamespace(namespace) {
    const NAMESPACES = new Map([
        ['svg', Namespace.SVG],
        ['math', Namespace.Math],
    ]);
    for (const [k, n] of NAMESPACES.entries()) {
        if (n === namespace) {
            return k;
        }
    }
    return null; // No namespace prefix for HTML
}
function prefixWithNamespace(strippedTag, namespace) {
    if (namespace === Namespace.HTML) {
        return strippedTag;
    }
    return `:${keyForNamespace(namespace)}:${strippedTag}`;
}
function literalOrArrayLiteral(value) {
    if (Array.isArray(value)) {
        return literalArr(value.map(literalOrArrayLiteral));
    }
    return literal$1(value);
}

/**
 * Converts the semantic attributes of element-like operations (elements, templates) into constant
 * array expressions, and lifts them into the overall component `consts`.
 */
function collectElementConsts(job) {
    // Collect all extracted attributes.
    const allElementAttributes = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.ExtractedAttribute) {
                const attributes = allElementAttributes.get(op.target) || new ElementAttributes(job.compatibility);
                allElementAttributes.set(op.target, attributes);
                attributes.add(op.bindingKind, op.name, op.expression, op.namespace, op.trustedValueFn);
                OpList.remove(op);
            }
        }
    }
    // Serialize the extracted attributes into the const array.
    if (job instanceof ComponentCompilationJob) {
        for (const unit of job.units) {
            for (const op of unit.create) {
                // TODO: Simplify and combine these cases.
                if (op.kind == OpKind.Projection) {
                    const attributes = allElementAttributes.get(op.xref);
                    if (attributes !== undefined) {
                        const attrArray = serializeAttributes(attributes);
                        if (attrArray.entries.length > 0) {
                            op.attributes = attrArray;
                        }
                    }
                }
                else if (isElementOrContainerOp(op)) {
                    op.attributes = getConstIndex(job, allElementAttributes, op.xref);
                    // TODO(dylhunn): `@for` loops with `@empty` blocks need to be special-cased here,
                    // because the slot consumer trait currently only supports one slot per consumer and we
                    // need two. This should be revisited when making the refactors mentioned in:
                    // https://github.com/angular/angular/pull/53620#discussion_r1430918822
                    if (op.kind === OpKind.RepeaterCreate && op.emptyView !== null) {
                        op.emptyAttributes = getConstIndex(job, allElementAttributes, op.emptyView);
                    }
                }
            }
        }
    }
    else if (job instanceof HostBindingCompilationJob) {
        // TODO: If the host binding case further diverges, we may want to split it into its own
        // phase.
        for (const [xref, attributes] of allElementAttributes.entries()) {
            if (xref !== job.root.xref) {
                throw new Error(`An attribute would be const collected into the host binding's template function, but is not associated with the root xref.`);
            }
            const attrArray = serializeAttributes(attributes);
            if (attrArray.entries.length > 0) {
                job.root.attributes = attrArray;
            }
        }
    }
}
function getConstIndex(job, allElementAttributes, xref) {
    const attributes = allElementAttributes.get(xref);
    if (attributes !== undefined) {
        const attrArray = serializeAttributes(attributes);
        if (attrArray.entries.length > 0) {
            return job.addConst(attrArray);
        }
    }
    return null;
}
/**
 * Shared instance of an empty array to avoid unnecessary array allocations.
 */
const FLYWEIGHT_ARRAY = Object.freeze([]);
/**
 * Container for all of the various kinds of attributes which are applied on an element.
 */
class ElementAttributes {
    compatibility;
    known = new Map();
    byKind = new Map();
    propertyBindings = null;
    projectAs = null;
    get attributes() {
        return this.byKind.get(BindingKind.Attribute) ?? FLYWEIGHT_ARRAY;
    }
    get classes() {
        return this.byKind.get(BindingKind.ClassName) ?? FLYWEIGHT_ARRAY;
    }
    get styles() {
        return this.byKind.get(BindingKind.StyleProperty) ?? FLYWEIGHT_ARRAY;
    }
    get bindings() {
        return this.propertyBindings ?? FLYWEIGHT_ARRAY;
    }
    get template() {
        return this.byKind.get(BindingKind.Template) ?? FLYWEIGHT_ARRAY;
    }
    get i18n() {
        return this.byKind.get(BindingKind.I18n) ?? FLYWEIGHT_ARRAY;
    }
    constructor(compatibility) {
        this.compatibility = compatibility;
    }
    isKnown(kind, name) {
        const nameToValue = this.known.get(kind) ?? new Set();
        this.known.set(kind, nameToValue);
        if (nameToValue.has(name)) {
            return true;
        }
        nameToValue.add(name);
        return false;
    }
    add(kind, name, value, namespace, trustedValueFn) {
        // TemplateDefinitionBuilder puts duplicate attribute, class, and style values into the consts
        // array. This seems inefficient, we can probably keep just the first one or the last value
        // (whichever actually gets applied when multiple values are listed for the same attribute).
        const allowDuplicates = this.compatibility === CompatibilityMode.TemplateDefinitionBuilder &&
            (kind === BindingKind.Attribute ||
                kind === BindingKind.ClassName ||
                kind === BindingKind.StyleProperty);
        if (!allowDuplicates && this.isKnown(kind, name)) {
            return;
        }
        // TODO: Can this be its own phase
        if (name === 'ngProjectAs') {
            if (value === null ||
                !(value instanceof LiteralExpr) ||
                value.value == null ||
                typeof value.value?.toString() !== 'string') {
                throw Error('ngProjectAs must have a string literal value');
            }
            this.projectAs = value.value.toString();
            // TODO: TemplateDefinitionBuilder allows `ngProjectAs` to also be assigned as a literal
            // attribute. Is this sane?
        }
        const array = this.arrayFor(kind);
        array.push(...getAttributeNameLiterals(namespace, name));
        if (kind === BindingKind.Attribute || kind === BindingKind.StyleProperty) {
            if (value === null) {
                throw Error('Attribute, i18n attribute, & style element attributes must have a value');
            }
            if (trustedValueFn !== null) {
                if (!isStringLiteral(value)) {
                    throw Error('AssertionError: extracted attribute value should be string literal');
                }
                array.push(taggedTemplate(trustedValueFn, new TemplateLiteralExpr([new TemplateLiteralElementExpr(value.value)], []), undefined, value.sourceSpan));
            }
            else {
                array.push(value);
            }
        }
    }
    arrayFor(kind) {
        if (kind === BindingKind.Property || kind === BindingKind.TwoWayProperty) {
            this.propertyBindings ??= [];
            return this.propertyBindings;
        }
        else {
            if (!this.byKind.has(kind)) {
                this.byKind.set(kind, []);
            }
            return this.byKind.get(kind);
        }
    }
}
/**
 * Gets an array of literal expressions representing the attribute's namespaced name.
 */
function getAttributeNameLiterals(namespace, name) {
    const nameLiteral = literal$1(name);
    if (namespace) {
        return [literal$1(0 /* core.AttributeMarker.NamespaceURI */), literal$1(namespace), nameLiteral];
    }
    return [nameLiteral];
}
/**
 * Serializes an ElementAttributes object into an array expression.
 */
function serializeAttributes({ attributes, bindings, classes, i18n, projectAs, styles, template, }) {
    const attrArray = [...attributes];
    if (projectAs !== null) {
        // Parse the attribute value into a CssSelectorList. Note that we only take the
        // first selector, because we don't support multiple selectors in ngProjectAs.
        const parsedR3Selector = parseSelectorToR3Selector(projectAs)[0];
        attrArray.push(literal$1(5 /* core.AttributeMarker.ProjectAs */), literalOrArrayLiteral(parsedR3Selector));
    }
    if (classes.length > 0) {
        attrArray.push(literal$1(1 /* core.AttributeMarker.Classes */), ...classes);
    }
    if (styles.length > 0) {
        attrArray.push(literal$1(2 /* core.AttributeMarker.Styles */), ...styles);
    }
    if (bindings.length > 0) {
        attrArray.push(literal$1(3 /* core.AttributeMarker.Bindings */), ...bindings);
    }
    if (template.length > 0) {
        attrArray.push(literal$1(4 /* core.AttributeMarker.Template */), ...template);
    }
    if (i18n.length > 0) {
        attrArray.push(literal$1(6 /* core.AttributeMarker.I18n */), ...i18n);
    }
    return literalArr(attrArray);
}

/**
 * Some binding instructions in the update block may actually correspond to i18n bindings. In that
 * case, they should be replaced with i18nExp instructions for the dynamic portions.
 */
function convertI18nBindings(job) {
    const i18nAttributesByElem = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.I18nAttributes) {
                i18nAttributesByElem.set(op.target, op);
            }
        }
        for (const op of unit.update) {
            switch (op.kind) {
                case OpKind.Property:
                case OpKind.Attribute:
                    if (op.i18nContext === null) {
                        continue;
                    }
                    if (!(op.expression instanceof Interpolation)) {
                        continue;
                    }
                    const i18nAttributesForElem = i18nAttributesByElem.get(op.target);
                    if (i18nAttributesForElem === undefined) {
                        throw new Error('AssertionError: An i18n attribute binding instruction requires the owning element to have an I18nAttributes create instruction');
                    }
                    if (i18nAttributesForElem.target !== op.target) {
                        throw new Error('AssertionError: Expected i18nAttributes target element to match binding target element');
                    }
                    const ops = [];
                    for (let i = 0; i < op.expression.expressions.length; i++) {
                        const expr = op.expression.expressions[i];
                        if (op.expression.i18nPlaceholders.length !== op.expression.expressions.length) {
                            throw new Error(`AssertionError: An i18n attribute binding instruction requires the same number of expressions and placeholders, but found ${op.expression.i18nPlaceholders.length} placeholders and ${op.expression.expressions.length} expressions`);
                        }
                        ops.push(createI18nExpressionOp(op.i18nContext, i18nAttributesForElem.target, i18nAttributesForElem.xref, i18nAttributesForElem.handle, expr, null, op.expression.i18nPlaceholders[i], I18nParamResolutionTime.Creation, I18nExpressionFor.I18nAttribute, op.name, op.sourceSpan));
                    }
                    OpList.replaceWithMany(op, ops);
                    break;
            }
        }
    }
}

/**
 * Resolve the dependency function of a deferred block.
 */
function resolveDeferDepsFns(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.Defer) {
                if (op.resolverFn !== null) {
                    continue;
                }
                if (op.ownResolverFn !== null) {
                    if (op.handle.slot === null) {
                        throw new Error('AssertionError: slot must be assigned before extracting defer deps functions');
                    }
                    const fullPathName = unit.fnName?.replace('_Template', '');
                    op.resolverFn = job.pool.getSharedFunctionReference(op.ownResolverFn, `${fullPathName}_Defer_${op.handle.slot}_DepsFn`, 
                    /* Don't use unique names for TDB compatibility */ false);
                }
            }
        }
    }
}

/**
 * Create one helper context op per i18n block (including generate descending blocks).
 *
 * Also, if an ICU exists inside an i18n block that also contains other localizable content (such as
 * string), create an additional helper context op for the ICU.
 *
 * These context ops are later used for generating i18n messages. (Although we generate at least one
 * context op per nested view, we will collect them up the tree later, to generate a top-level
 * message.)
 */
function createI18nContexts(job) {
    // Create i18n context ops for i18n attrs.
    const attrContextByMessage = new Map();
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            switch (op.kind) {
                case OpKind.Binding:
                case OpKind.Property:
                case OpKind.Attribute:
                case OpKind.ExtractedAttribute:
                    if (op.i18nMessage === null) {
                        continue;
                    }
                    if (!attrContextByMessage.has(op.i18nMessage)) {
                        const i18nContext = createI18nContextOp(I18nContextKind.Attr, job.allocateXrefId(), null, op.i18nMessage, null);
                        unit.create.push(i18nContext);
                        attrContextByMessage.set(op.i18nMessage, i18nContext.xref);
                    }
                    op.i18nContext = attrContextByMessage.get(op.i18nMessage);
                    break;
            }
        }
    }
    // Create i18n context ops for root i18n blocks.
    const blockContextByI18nBlock = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nStart:
                    if (op.xref === op.root) {
                        const contextOp = createI18nContextOp(I18nContextKind.RootI18n, job.allocateXrefId(), op.xref, op.message, null);
                        unit.create.push(contextOp);
                        op.context = contextOp.xref;
                        blockContextByI18nBlock.set(op.xref, contextOp);
                    }
                    break;
            }
        }
    }
    // Assign i18n contexts for child i18n blocks. These don't need their own conext, instead they
    // should inherit from their root i18n block.
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.I18nStart && op.xref !== op.root) {
                const rootContext = blockContextByI18nBlock.get(op.root);
                if (rootContext === undefined) {
                    throw Error('AssertionError: Root i18n block i18n context should have been created.');
                }
                op.context = rootContext.xref;
                blockContextByI18nBlock.set(op.xref, rootContext);
            }
        }
    }
    // Create or assign i18n contexts for ICUs.
    let currentI18nOp = null;
    for (const unit of job.units) {
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nStart:
                    currentI18nOp = op;
                    break;
                case OpKind.I18nEnd:
                    currentI18nOp = null;
                    break;
                case OpKind.IcuStart:
                    if (currentI18nOp === null) {
                        throw Error('AssertionError: Unexpected ICU outside of an i18n block.');
                    }
                    if (op.message.id !== currentI18nOp.message.id) {
                        // This ICU is a sub-message inside its parent i18n block message. We need to give it
                        // its own context.
                        const contextOp = createI18nContextOp(I18nContextKind.Icu, job.allocateXrefId(), currentI18nOp.root, op.message, null);
                        unit.create.push(contextOp);
                        op.context = contextOp.xref;
                    }
                    else {
                        // This ICU is the only translatable content in its parent i18n block. We need to
                        // convert the parent's context into an ICU context.
                        op.context = currentI18nOp.context;
                        blockContextByI18nBlock.get(currentI18nOp.xref).contextKind = I18nContextKind.Icu;
                    }
                    break;
            }
        }
    }
}

/**
 * Deduplicate text bindings, e.g. <div class="cls1" class="cls2">
 */
function deduplicateTextBindings(job) {
    const seen = new Map();
    for (const unit of job.units) {
        for (const op of unit.update.reversed()) {
            if (op.kind === OpKind.Binding && op.isTextAttribute) {
                const seenForElement = seen.get(op.target) || new Set();
                if (seenForElement.has(op.name)) {
                    if (job.compatibility === CompatibilityMode.TemplateDefinitionBuilder) {
                        // For most duplicated attributes, TemplateDefinitionBuilder lists all of the values in
                        // the consts array. However, for style and class attributes it only keeps the last one.
                        // We replicate that behavior here since it has actual consequences for apps with
                        // duplicate class or style attrs.
                        if (op.name === 'style' || op.name === 'class') {
                            OpList.remove(op);
                        }
                    }
                }
                seenForElement.add(op.name);
                seen.set(op.target, seenForElement);
            }
        }
    }
}

/**
 * Defer instructions take a configuration array, which should be collected into the component
 * consts. This phase finds the config options, and creates the corresponding const array.
 */
function configureDeferInstructions(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind !== OpKind.Defer) {
                continue;
            }
            if (op.placeholderMinimumTime !== null) {
                op.placeholderConfig = new ConstCollectedExpr(literalOrArrayLiteral([op.placeholderMinimumTime]));
            }
            if (op.loadingMinimumTime !== null || op.loadingAfterTime !== null) {
                op.loadingConfig = new ConstCollectedExpr(literalOrArrayLiteral([op.loadingMinimumTime, op.loadingAfterTime]));
            }
        }
    }
}

/**
 * Some `defer` conditions can reference other elements in the template, using their local reference
 * names. However, the semantics are quite different from the normal local reference system: in
 * particular, we need to look at local reference names in enclosing views. This phase resolves
 * all such references to actual xrefs.
 */
function resolveDeferTargetNames(job) {
    const scopes = new Map();
    function getScopeForView(view) {
        if (scopes.has(view.xref)) {
            return scopes.get(view.xref);
        }
        const scope = new Scope$2();
        for (const op of view.create) {
            // add everything that can be referenced.
            if (!isElementOrContainerOp(op) || op.localRefs === null) {
                continue;
            }
            if (!Array.isArray(op.localRefs)) {
                throw new Error('LocalRefs were already processed, but were needed to resolve defer targets.');
            }
            for (const ref of op.localRefs) {
                if (ref.target !== '') {
                    continue;
                }
                scope.targets.set(ref.name, { xref: op.xref, slot: op.handle });
            }
        }
        scopes.set(view.xref, scope);
        return scope;
    }
    function resolveTrigger(deferOwnerView, op, placeholderView) {
        switch (op.trigger.kind) {
            case DeferTriggerKind.Idle:
            case DeferTriggerKind.Never:
            case DeferTriggerKind.Immediate:
            case DeferTriggerKind.Timer:
                return;
            case DeferTriggerKind.Hover:
            case DeferTriggerKind.Interaction:
            case DeferTriggerKind.Viewport:
                if (op.trigger.targetName === null) {
                    // A `null` target name indicates we should default to the first element in the
                    // placeholder block.
                    if (placeholderView === null) {
                        throw new Error('defer on trigger with no target name must have a placeholder block');
                    }
                    const placeholder = job.views.get(placeholderView);
                    if (placeholder == undefined) {
                        throw new Error('AssertionError: could not find placeholder view for defer on trigger');
                    }
                    for (const placeholderOp of placeholder.create) {
                        if (hasConsumesSlotTrait(placeholderOp) &&
                            (isElementOrContainerOp(placeholderOp) ||
                                placeholderOp.kind === OpKind.Projection)) {
                            op.trigger.targetXref = placeholderOp.xref;
                            op.trigger.targetView = placeholderView;
                            op.trigger.targetSlotViewSteps = -1;
                            op.trigger.targetSlot = placeholderOp.handle;
                            return;
                        }
                    }
                    return;
                }
                let view = placeholderView !== null ? job.views.get(placeholderView) : deferOwnerView;
                let step = placeholderView !== null ? -1 : 0;
                while (view !== null) {
                    const scope = getScopeForView(view);
                    if (scope.targets.has(op.trigger.targetName)) {
                        const { xref, slot } = scope.targets.get(op.trigger.targetName);
                        op.trigger.targetXref = xref;
                        op.trigger.targetView = view.xref;
                        op.trigger.targetSlotViewSteps = step;
                        op.trigger.targetSlot = slot;
                        return;
                    }
                    view = view.parent !== null ? job.views.get(view.parent) : null;
                    step++;
                }
                break;
            default:
                throw new Error(`Trigger kind ${op.trigger.kind} not handled`);
        }
    }
    // Find the defer ops, and assign the data about their targets.
    for (const unit of job.units) {
        const defers = new Map();
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.Defer:
                    defers.set(op.xref, op);
                    break;
                case OpKind.DeferOn:
                    const deferOp = defers.get(op.defer);
                    resolveTrigger(unit, op, op.modifier === "hydrate" /* ir.DeferOpModifierKind.HYDRATE */
                        ? deferOp.mainView
                        : deferOp.placeholderView);
                    break;
            }
        }
    }
}
let Scope$2 = class Scope {
    targets = new Map();
};

const REPLACEMENTS = new Map([
    [OpKind.ElementEnd, [OpKind.ElementStart, OpKind.Element]],
    [OpKind.ContainerEnd, [OpKind.ContainerStart, OpKind.Container]],
    [OpKind.I18nEnd, [OpKind.I18nStart, OpKind.I18n]],
]);
/**
 * Op kinds that should not prevent merging of start/end ops.
 */
const IGNORED_OP_KINDS = new Set([OpKind.Pipe]);
/**
 * Replace sequences of mergable instructions (e.g. `ElementStart` and `ElementEnd`) with a
 * consolidated instruction (e.g. `Element`).
 */
function collapseEmptyInstructions(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            // Find end ops that may be able to be merged.
            const opReplacements = REPLACEMENTS.get(op.kind);
            if (opReplacements === undefined) {
                continue;
            }
            const [startKind, mergedKind] = opReplacements;
            // Locate the previous (non-ignored) op.
            let prevOp = op.prev;
            while (prevOp !== null && IGNORED_OP_KINDS.has(prevOp.kind)) {
                prevOp = prevOp.prev;
            }
            // If the previous op is the corresponding start op, we can megre.
            if (prevOp !== null && prevOp.kind === startKind) {
                // Transmute the start instruction to the merged version. This is safe as they're designed
                // to be identical apart from the `kind`.
                prevOp.kind = mergedKind;
                // Remove the end instruction.
                OpList.remove(op);
            }
        }
    }
}

/**
 * Safe read expressions such as `a?.b` have different semantics in Angular templates as
 * compared to JavaScript. In particular, they default to `null` instead of `undefined`. This phase
 * finds all unresolved safe read expressions, and converts them into the appropriate output AST
 * reads, guarded by null checks. We generate temporaries as needed, to avoid re-evaluating the same
 * sub-expression multiple times.
 */
function expandSafeReads(job) {
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            transformExpressionsInOp(op, (e) => safeTransform(e, { job }), VisitorContextFlag.None);
            transformExpressionsInOp(op, ternaryTransform, VisitorContextFlag.None);
        }
    }
}
// A lookup set of all the expression kinds that require a temporary variable to be generated.
[
    InvokeFunctionExpr,
    LiteralArrayExpr,
    LiteralMapExpr,
    SafeInvokeFunctionExpr,
    PipeBindingExpr,
].map((e) => e.constructor.name);
function needsTemporaryInSafeAccess(e) {
    // TODO: We probably want to use an expression visitor to recursively visit all descendents.
    // However, that would potentially do a lot of extra work (because it cannot short circuit), so we
    // implement the logic ourselves for now.
    if (e instanceof UnaryOperatorExpr) {
        return needsTemporaryInSafeAccess(e.expr);
    }
    else if (e instanceof BinaryOperatorExpr) {
        return needsTemporaryInSafeAccess(e.lhs) || needsTemporaryInSafeAccess(e.rhs);
    }
    else if (e instanceof ConditionalExpr) {
        if (e.falseCase && needsTemporaryInSafeAccess(e.falseCase))
            return true;
        return needsTemporaryInSafeAccess(e.condition) || needsTemporaryInSafeAccess(e.trueCase);
    }
    else if (e instanceof NotExpr) {
        return needsTemporaryInSafeAccess(e.condition);
    }
    else if (e instanceof AssignTemporaryExpr) {
        return needsTemporaryInSafeAccess(e.expr);
    }
    else if (e instanceof ReadPropExpr) {
        return needsTemporaryInSafeAccess(e.receiver);
    }
    else if (e instanceof ReadKeyExpr) {
        return needsTemporaryInSafeAccess(e.receiver) || needsTemporaryInSafeAccess(e.index);
    }
    // TODO: Switch to a method which is exhaustive of newly added expression subtypes.
    return (e instanceof InvokeFunctionExpr ||
        e instanceof LiteralArrayExpr ||
        e instanceof LiteralMapExpr ||
        e instanceof SafeInvokeFunctionExpr ||
        e instanceof PipeBindingExpr);
}
function temporariesIn(e) {
    const temporaries = new Set();
    // TODO: Although it's not currently supported by the transform helper, we should be able to
    // short-circuit exploring the tree to do less work. In particular, we don't have to penetrate
    // into the subexpressions of temporary assignments.
    transformExpressionsInExpression(e, (e) => {
        if (e instanceof AssignTemporaryExpr) {
            temporaries.add(e.xref);
        }
        return e;
    }, VisitorContextFlag.None);
    return temporaries;
}
function eliminateTemporaryAssignments(e, tmps, ctx) {
    // TODO: We can be more efficient than the transform helper here. We don't need to visit any
    // descendents of temporary assignments.
    transformExpressionsInExpression(e, (e) => {
        if (e instanceof AssignTemporaryExpr && tmps.has(e.xref)) {
            const read = new ReadTemporaryExpr(e.xref);
            // `TemplateDefinitionBuilder` has the (accidental?) behavior of generating assignments of
            // temporary variables to themselves. This happens because some subexpression that the
            // temporary refers to, possibly through nested temporaries, has a function call. We copy that
            // behavior here.
            return ctx.job.compatibility === CompatibilityMode.TemplateDefinitionBuilder
                ? new AssignTemporaryExpr(read, read.xref)
                : read;
        }
        return e;
    }, VisitorContextFlag.None);
    return e;
}
/**
 * Creates a safe ternary guarded by the input expression, and with a body generated by the provided
 * callback on the input expression. Generates a temporary variable assignment if needed, and
 * deduplicates nested temporary assignments if needed.
 */
function safeTernaryWithTemporary(guard, body, ctx) {
    let result;
    if (needsTemporaryInSafeAccess(guard)) {
        const xref = ctx.job.allocateXrefId();
        result = [new AssignTemporaryExpr(guard, xref), new ReadTemporaryExpr(xref)];
    }
    else {
        result = [guard, guard.clone()];
        // Consider an expression like `a?.[b?.c()]?.d`. The `b?.c()` will be transformed first,
        // introducing a temporary assignment into the key. Then, as part of expanding the `?.d`. That
        // assignment will be duplicated into both the guard and expression sides. We de-duplicate it,
        // by transforming it from an assignment into a read on the expression side.
        eliminateTemporaryAssignments(result[1], temporariesIn(result[0]), ctx);
    }
    return new SafeTernaryExpr(result[0], body(result[1]));
}
function isSafeAccessExpression(e) {
    return (e instanceof SafePropertyReadExpr ||
        e instanceof SafeKeyedReadExpr ||
        e instanceof SafeInvokeFunctionExpr);
}
function isUnsafeAccessExpression(e) {
    return (e instanceof ReadPropExpr || e instanceof ReadKeyExpr || e instanceof InvokeFunctionExpr);
}
function isAccessExpression$1(e) {
    return isSafeAccessExpression(e) || isUnsafeAccessExpression(e);
}
function deepestSafeTernary(e) {
    if (isAccessExpression$1(e) && e.receiver instanceof SafeTernaryExpr) {
        let st = e.receiver;
        while (st.expr instanceof SafeTernaryExpr) {
            st = st.expr;
        }
        return st;
    }
    return null;
}
// TODO: When strict compatibility with TemplateDefinitionBuilder is not required, we can use `&&`
// instead to save some code size.
function safeTransform(e, ctx) {
    if (!isAccessExpression$1(e)) {
        return e;
    }
    const dst = deepestSafeTernary(e);
    if (dst) {
        if (e instanceof InvokeFunctionExpr) {
            dst.expr = dst.expr.callFn(e.args);
            return e.receiver;
        }
        if (e instanceof ReadPropExpr) {
            dst.expr = dst.expr.prop(e.name);
            return e.receiver;
        }
        if (e instanceof ReadKeyExpr) {
            dst.expr = dst.expr.key(e.index);
            return e.receiver;
        }
        if (e instanceof SafeInvokeFunctionExpr) {
            dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.callFn(e.args), ctx);
            return e.receiver;
        }
        if (e instanceof SafePropertyReadExpr) {
            dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.prop(e.name), ctx);
            return e.receiver;
        }
        if (e instanceof SafeKeyedReadExpr) {
            dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.key(e.index), ctx);
            return e.receiver;
        }
    }
    else {
        if (e instanceof SafeInvokeFunctionExpr) {
            return safeTernaryWithTemporary(e.receiver, (r) => r.callFn(e.args), ctx);
        }
        if (e instanceof SafePropertyReadExpr) {
            return safeTernaryWithTemporary(e.receiver, (r) => r.prop(e.name), ctx);
        }
        if (e instanceof SafeKeyedReadExpr) {
            return safeTernaryWithTemporary(e.receiver, (r) => r.key(e.index), ctx);
        }
    }
    return e;
}
function ternaryTransform(e) {
    if (!(e instanceof SafeTernaryExpr)) {
        return e;
    }
    return new ConditionalExpr(new BinaryOperatorExpr(BinaryOperator.Equals, e.guard, NULL_EXPR), NULL_EXPR, e.expr);
}

/**
 * The escape sequence used indicate message param values.
 */
const ESCAPE$1 = '\uFFFD';
/**
 * Marker used to indicate an element tag.
 */
const ELEMENT_MARKER = '#';
/**
 * Marker used to indicate a template tag.
 */
const TEMPLATE_MARKER = '*';
/**
 * Marker used to indicate closing of an element or template tag.
 */
const TAG_CLOSE_MARKER = '/';
/**
 * Marker used to indicate the sub-template context.
 */
const CONTEXT_MARKER = ':';
/**
 * Marker used to indicate the start of a list of values.
 */
const LIST_START_MARKER = '[';
/**
 * Marker used to indicate the end of a list of values.
 */
const LIST_END_MARKER = ']';
/**
 * Delimiter used to separate multiple values in a list.
 */
const LIST_DELIMITER = '|';
/**
 * Formats the param maps on extracted message ops into a maps of `Expression` objects that can be
 * used in the final output.
 */
function extractI18nMessages(job) {
    // Create an i18n message for each context.
    // TODO: Merge the context op with the message op since they're 1:1 anyways.
    const i18nMessagesByContext = new Map();
    const i18nBlocks = new Map();
    const i18nContexts = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nContext:
                    const i18nMessageOp = createI18nMessage(job, op);
                    unit.create.push(i18nMessageOp);
                    i18nMessagesByContext.set(op.xref, i18nMessageOp);
                    i18nContexts.set(op.xref, op);
                    break;
                case OpKind.I18nStart:
                    i18nBlocks.set(op.xref, op);
                    break;
            }
        }
    }
    // Associate sub-messages for ICUs with their root message. At this point we can also remove the
    // ICU start/end ops, as they are no longer needed.
    let currentIcu = null;
    for (const unit of job.units) {
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.IcuStart:
                    currentIcu = op;
                    OpList.remove(op);
                    // Skip any contexts not associated with an ICU.
                    const icuContext = i18nContexts.get(op.context);
                    if (icuContext.contextKind !== I18nContextKind.Icu) {
                        continue;
                    }
                    // Skip ICUs that share a context with their i18n message. These represent root-level
                    // ICUs, not sub-messages.
                    const i18nBlock = i18nBlocks.get(icuContext.i18nBlock);
                    if (i18nBlock.context === icuContext.xref) {
                        continue;
                    }
                    // Find the root message and push this ICUs message as a sub-message.
                    const rootI18nBlock = i18nBlocks.get(i18nBlock.root);
                    const rootMessage = i18nMessagesByContext.get(rootI18nBlock.context);
                    if (rootMessage === undefined) {
                        throw Error('AssertionError: ICU sub-message should belong to a root message.');
                    }
                    const subMessage = i18nMessagesByContext.get(icuContext.xref);
                    subMessage.messagePlaceholder = op.messagePlaceholder;
                    rootMessage.subMessages.push(subMessage.xref);
                    break;
                case OpKind.IcuEnd:
                    currentIcu = null;
                    OpList.remove(op);
                    break;
                case OpKind.IcuPlaceholder:
                    // Add ICU placeholders to the message, then remove the ICU placeholder ops.
                    if (currentIcu === null || currentIcu.context == null) {
                        throw Error('AssertionError: Unexpected ICU placeholder outside of i18n context');
                    }
                    const msg = i18nMessagesByContext.get(currentIcu.context);
                    msg.postprocessingParams.set(op.name, literal$1(formatIcuPlaceholder(op)));
                    OpList.remove(op);
                    break;
            }
        }
    }
}
/**
 * Create an i18n message op from an i18n context op.
 */
function createI18nMessage(job, context, messagePlaceholder) {
    let formattedParams = formatParams(context.params);
    const formattedPostprocessingParams = formatParams(context.postprocessingParams);
    let needsPostprocessing = [...context.params.values()].some((v) => v.length > 1);
    return createI18nMessageOp(job.allocateXrefId(), context.xref, context.i18nBlock, context.message, null, formattedParams, formattedPostprocessingParams, needsPostprocessing);
}
/**
 * Formats an ICU placeholder into a single string with expression placeholders.
 */
function formatIcuPlaceholder(op) {
    if (op.strings.length !== op.expressionPlaceholders.length + 1) {
        throw Error(`AssertionError: Invalid ICU placeholder with ${op.strings.length} strings and ${op.expressionPlaceholders.length} expressions`);
    }
    const values = op.expressionPlaceholders.map(formatValue);
    return op.strings.flatMap((str, i) => [str, values[i] || '']).join('');
}
/**
 * Formats a map of `I18nParamValue[]` values into a map of `Expression` values.
 */
function formatParams(params) {
    const formattedParams = new Map();
    for (const [placeholder, placeholderValues] of params) {
        const serializedValues = formatParamValues(placeholderValues);
        if (serializedValues !== null) {
            formattedParams.set(placeholder, literal$1(serializedValues));
        }
    }
    return formattedParams;
}
/**
 * Formats an `I18nParamValue[]` into a string (or null for empty array).
 */
function formatParamValues(values) {
    if (values.length === 0) {
        return null;
    }
    const serializedValues = values.map((value) => formatValue(value));
    return serializedValues.length === 1
        ? serializedValues[0]
        : `${LIST_START_MARKER}${serializedValues.join(LIST_DELIMITER)}${LIST_END_MARKER}`;
}
/**
 * Formats a single `I18nParamValue` into a string
 */
function formatValue(value) {
    // Element tags with a structural directive use a special form that concatenates the element and
    // template values.
    if (value.flags & I18nParamValueFlags.ElementTag &&
        value.flags & I18nParamValueFlags.TemplateTag) {
        if (typeof value.value !== 'object') {
            throw Error('AssertionError: Expected i18n param value to have an element and template slot');
        }
        const elementValue = formatValue({
            ...value,
            value: value.value.element,
            flags: value.flags & ~I18nParamValueFlags.TemplateTag,
        });
        const templateValue = formatValue({
            ...value,
            value: value.value.template,
            flags: value.flags & ~I18nParamValueFlags.ElementTag,
        });
        // TODO(mmalerba): This is likely a bug in TemplateDefinitionBuilder, we should not need to
        // record the template value twice. For now I'm re-implementing the behavior here to keep the
        // output consistent with TemplateDefinitionBuilder.
        if (value.flags & I18nParamValueFlags.OpenTag &&
            value.flags & I18nParamValueFlags.CloseTag) {
            return `${templateValue}${elementValue}${templateValue}`;
        }
        // To match the TemplateDefinitionBuilder output, flip the order depending on whether the
        // values represent a closing or opening tag (or both).
        // TODO(mmalerba): Figure out if this makes a difference in terms of either functionality,
        // or the resulting message ID. If not, we can remove the special-casing in the future.
        return value.flags & I18nParamValueFlags.CloseTag
            ? `${elementValue}${templateValue}`
            : `${templateValue}${elementValue}`;
    }
    // Self-closing tags use a special form that concatenates the start and close tag values.
    if (value.flags & I18nParamValueFlags.OpenTag &&
        value.flags & I18nParamValueFlags.CloseTag) {
        return `${formatValue({
            ...value,
            flags: value.flags & ~I18nParamValueFlags.CloseTag,
        })}${formatValue({ ...value, flags: value.flags & ~I18nParamValueFlags.OpenTag })}`;
       }
    // If there are no special flags, just return the raw value.
    if (value.flags === I18nParamValueFlags.None) {
        return `${value.value}`;
    }
    // Encode the remaining flags as part of the value.
    let tagMarker = '';
    let closeMarker = '';
    if (value.flags & I18nParamValueFlags.ElementTag) {
        tagMarker = ELEMENT_MARKER;
    }
    else if (value.flags & I18nParamValueFlags.TemplateTag) {
        tagMarker = TEMPLATE_MARKER;
    }
    if (tagMarker !== '') {
        closeMarker = value.flags & I18nParamValueFlags.CloseTag ? TAG_CLOSE_MARKER : '';
    }
    const context = value.subTemplateIndex === null ? '' : `${CONTEXT_MARKER}${value.subTemplateIndex}`;
    return `${ESCAPE$1}${closeMarker}${tagMarker}${value.value}${context}${ESCAPE$1}`;
}

/**
 * Generate `ir.AdvanceOp`s in between `ir.UpdateOp`s that ensure the runtime's implicit slot
 * context will be advanced correctly.
 */
function generateAdvance(job) {
    for (const unit of job.units) {
        // First build a map of all of the declarations in the view that have assigned slots.
        const slotMap = new Map();
        for (const op of unit.create) {
            if (!hasConsumesSlotTrait(op)) {
                continue;
            }
            else if (op.handle.slot === null) {
                throw new Error(`AssertionError: expected slots to have been allocated before generating advance() calls`);
            }
            slotMap.set(op.xref, op.handle.slot);
        }
        // Next, step through the update operations and generate `ir.AdvanceOp`s as required to ensure
        // the runtime's implicit slot counter will be set to the correct slot before executing each
        // update operation which depends on it.
        //
        // To do that, we track what the runtime's slot counter will be through the update operations.
        let slotContext = 0;
        for (const op of unit.update) {
            let consumer = null;
            if (hasDependsOnSlotContextTrait(op)) {
                consumer = op;
            }
            else {
                visitExpressionsInOp(op, (expr) => {
                    if (consumer === null && hasDependsOnSlotContextTrait(expr)) {
                        consumer = expr;
                    }
                });
            }
            if (consumer === null) {
                continue;
            }
            if (!slotMap.has(consumer.target)) {
                // We expect ops that _do_ depend on the slot counter to point at declarations that exist in
                // the `slotMap`.
                throw new Error(`AssertionError: reference to unknown slot for target ${consumer.target}`);
            }
            const slot = slotMap.get(consumer.target);
            // Does the slot counter need to be adjusted?
            if (slotContext !== slot) {
                // If so, generate an `ir.AdvanceOp` to advance the counter.
                const delta = slot - slotContext;
                if (delta < 0) {
                    throw new Error(`AssertionError: slot counter should never need to move backwards`);
                }
                OpList.insertBefore(createAdvanceOp(delta, consumer.sourceSpan), op);
                slotContext = slot;
            }
        }
    }
}

/**
 * Locate projection slots, populate the each component's `ngContentSelectors` literal field,
 * populate `project` arguments, and generate the required `projectionDef` instruction for the job's
 * root view.
 */
function generateProjectionDefs(job) {
    // TODO: Why does TemplateDefinitionBuilder force a shared constant?
    const share = job.compatibility === CompatibilityMode.TemplateDefinitionBuilder;
    // Collect all selectors from this component, and its nested views. Also, assign each projection a
    // unique ascending projection slot index.
    const selectors = [];
    let projectionSlotIndex = 0;
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.Projection) {
                selectors.push(op.selector);
                op.projectionSlotIndex = projectionSlotIndex++;
            }
        }
    }
    if (selectors.length > 0) {
        // Create the projectionDef array. If we only found a single wildcard selector, then we use the
        // default behavior with no arguments instead.
        let defExpr = null;
        if (selectors.length > 1 || selectors[0] !== '*') {
            const def = selectors.map((s) => (s === '*' ? s : parseSelectorToR3Selector(s)));
            defExpr = job.pool.getConstLiteral(literalOrArrayLiteral(def), share);
        }
        // Create the ngContentSelectors constant.
        job.contentSelectors = job.pool.getConstLiteral(literalOrArrayLiteral(selectors), share);
        // The projection def instruction goes at the beginning of the root view, before any
        // `projection` instructions.
        job.root.create.prepend([createProjectionDefOp(defExpr)]);
    }
}

/**
 * Generate a preamble sequence for each view creation block and listener function which declares
 * any variables that be referenced in other operations in the block.
 *
 * Variables generated include:
 *   * a saved view context to be used to restore the current view in event listeners.
 *   * the context of the restored view within event listener handlers.
 *   * context variables from the current view as well as all parent views (including the root
 *     context if needed).
 *   * local references from elements within the current view and any lexical parents.
 *
 * Variables are generated here unconditionally, and may optimized away in future operations if it
 * turns out their values (and any side effects) are unused.
 */
function generateVariables(job) {
    recursivelyProcessView(job.root, /* there is no parent scope for the root view */ null);
}
/**
 * Process the given `ViewCompilation` and generate preambles for it and any listeners that it
 * declares.
 *
 * @param `parentScope` a scope extracted from the parent view which captures any variables which
 *     should be inherited by this view. `null` if the current view is the root view.
 */
function recursivelyProcessView(view, parentScope) {
    // Extract a `Scope` from this view.
    const scope = getScopeForView(view, parentScope);
    for (const op of view.create) {
        switch (op.kind) {
            case OpKind.Template:
                // Descend into child embedded views.
                recursivelyProcessView(view.job.views.get(op.xref), scope);
                break;
            case OpKind.Projection:
                if (op.fallbackView !== null) {
                    recursivelyProcessView(view.job.views.get(op.fallbackView), scope);
                }
                break;
            case OpKind.RepeaterCreate:
                // Descend into child embedded views.
                recursivelyProcessView(view.job.views.get(op.xref), scope);
                if (op.emptyView) {
                    recursivelyProcessView(view.job.views.get(op.emptyView), scope);
                }
                if (op.trackByOps !== null) {
                    op.trackByOps.prepend(generateVariablesInScopeForView(view, scope, false));
                }
                break;
            case OpKind.Listener:
            case OpKind.TwoWayListener:
                // Prepend variables to listener handler functions.
                op.handlerOps.prepend(generateVariablesInScopeForView(view, scope, true));
                break;
        }
    }
    view.update.prepend(generateVariablesInScopeForView(view, scope, false));
}
/**
 * Process a view and generate a `Scope` representing the variables available for reference within
 * that view.
 */
function getScopeForView(view, parent) {
    const scope = {
        view: view.xref,
        viewContextVariable: {
            kind: SemanticVariableKind.Context,
            name: null,
            view: view.xref,
        },
        contextVariables: new Map(),
        aliases: view.aliases,
        references: [],
        letDeclarations: [],
        parent,
    };
    for (const identifier of view.contextVariables.keys()) {
        scope.contextVariables.set(identifier, {
            kind: SemanticVariableKind.Identifier,
            name: null,
            identifier,
            local: false,
        });
    }
    for (const op of view.create) {
        switch (op.kind) {
            case OpKind.ElementStart:
            case OpKind.Template:
                if (!Array.isArray(op.localRefs)) {
                    throw new Error(`AssertionError: expected localRefs to be an array`);
                }
                // Record available local references from this element.
                for (let offset = 0; offset < op.localRefs.length; offset++) {
                    scope.references.push({
                        name: op.localRefs[offset].name,
                        targetId: op.xref,
                        targetSlot: op.handle,
                        offset,
                        variable: {
                            kind: SemanticVariableKind.Identifier,
                            name: null,
                            identifier: op.localRefs[offset].name,
                            local: false,
                        },
                    });
                }
                break;
            case OpKind.DeclareLet:
                scope.letDeclarations.push({
                    targetId: op.xref,
                    targetSlot: op.handle,
                    variable: {
                        kind: SemanticVariableKind.Identifier,
                        name: null,
                        identifier: op.declaredName,
                        local: false,
                    },
                });
                break;
        }
    }
    return scope;
}
/**
 * Generate declarations for all variables that are in scope for a given view.
 *
 * This is a recursive process, as views inherit variables available from their parent view, which
 * itself may have inherited variables, etc.
 */
function generateVariablesInScopeForView(view, scope, isListener) {
    const newOps = [];
    if (scope.view !== view.xref) {
        // Before generating variables for a parent view, we need to switch to the context of the parent
        // view with a `nextContext` expression. This context switching operation itself declares a
        // variable, because the context of the view may be referenced directly.
        newOps.push(createVariableOp(view.job.allocateXrefId(), scope.viewContextVariable, new NextContextExpr(), VariableFlags.None));
    }
    // Add variables for all context variables available in this scope's view.
    const scopeView = view.job.views.get(scope.view);
    for (const [name, value] of scopeView.contextVariables) {
        const context = new ContextExpr(scope.view);
        // We either read the context, or, if the variable is CTX_REF, use the context directly.
        const variable = value === CTX_REF ? context : new ReadPropExpr(context, value);
        // Add the variable declaration.
        newOps.push(createVariableOp(view.job.allocateXrefId(), scope.contextVariables.get(name), variable, VariableFlags.None));
    }
    for (const alias of scopeView.aliases) {
        newOps.push(createVariableOp(view.job.allocateXrefId(), alias, alias.expression.clone(), VariableFlags.AlwaysInline));
    }
    // Add variables for all local references declared for elements in this scope.
    for (const ref of scope.references) {
        newOps.push(createVariableOp(view.job.allocateXrefId(), ref.variable, new ReferenceExpr(ref.targetId, ref.targetSlot, ref.offset), VariableFlags.None));
    }
    if (scope.view !== view.xref || isListener) {
        for (const decl of scope.letDeclarations) {
            newOps.push(createVariableOp(view.job.allocateXrefId(), decl.variable, new ContextLetReferenceExpr(decl.targetId, decl.targetSlot), VariableFlags.None));
        }
    }
    if (scope.parent !== null) {
        // Recursively add variables from the parent scope.
        newOps.push(...generateVariablesInScopeForView(view, scope.parent, false));
    }
    return newOps;
}

/**
 * `ir.ConstCollectedExpr` may be present in any IR expression. This means that expression needs to
 * be lifted into the component const array, and replaced with a reference to the const array at its
 *
 * usage site. This phase walks the IR and performs this transformation.
 */
function collectConstExpressions(job) {
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            transformExpressionsInOp(op, (expr) => {
                if (!(expr instanceof ConstCollectedExpr)) {
                    return expr;
                }
                return literal$1(job.addConst(expr.expr));
            }, VisitorContextFlag.None);
        }
    }
}

const STYLE_DOT = 'style.';
const CLASS_DOT = 'class.';
const STYLE_BANG = 'style!';
const CLASS_BANG = 'class!';
const BANG_IMPORTANT = '!important';
/**
 * Host bindings are compiled using a different parser entrypoint, and are parsed quite differently
 * as a result. Therefore, we need to do some extra parsing for host style properties, as compared
 * to non-host style properties.
 * TODO: Unify host bindings and non-host bindings in the parser.
 */
function parseHostStyleProperties(job) {
    for (const op of job.root.update) {
        if (!(op.kind === OpKind.Binding && op.bindingKind === BindingKind.Property)) {
            continue;
        }
        if (op.name.endsWith(BANG_IMPORTANT)) {
            // Delete any `!important` suffixes from the binding name.
            op.name = op.name.substring(0, op.name.length - BANG_IMPORTANT.length);
        }
        if (op.name.startsWith(STYLE_DOT)) {
            op.bindingKind = BindingKind.StyleProperty;
            op.name = op.name.substring(STYLE_DOT.length);
            if (!isCssCustomProperty(op.name)) {
                op.name = hyphenate$1(op.name);
            }
            const { property, suffix } = parseProperty(op.name);
            op.name = property;
            op.unit = suffix;
        }
        else if (op.name.startsWith(STYLE_BANG)) {
            op.bindingKind = BindingKind.StyleProperty;
            op.name = 'style';
        }
        else if (op.name.startsWith(CLASS_DOT)) {
            op.bindingKind = BindingKind.ClassName;
            op.name = parseProperty(op.name.substring(CLASS_DOT.length)).property;
        }
        else if (op.name.startsWith(CLASS_BANG)) {
            op.bindingKind = BindingKind.ClassName;
            op.name = parseProperty(op.name.substring(CLASS_BANG.length)).property;
        }
    }
}
/**
 * Checks whether property name is a custom CSS property.
 * See: https://www.w3.org/TR/css-variables-1
 */
function isCssCustomProperty(name) {
    return name.startsWith('--');
}
function hyphenate$1(value) {
    return value
        .replace(/[a-z][A-Z]/g, (v) => {
        return v.charAt(0) + '-' + v.charAt(1);
    })
        .toLowerCase();
}
function parseProperty(name) {
    const overrideIndex = name.indexOf('!important');
    if (overrideIndex !== -1) {
        name = overrideIndex > 0 ? name.substring(0, overrideIndex) : '';
    }
    let suffix = null;
    let property = name;
    const unitIndex = name.lastIndexOf('.');
    if (unitIndex > 0) {
        suffix = name.slice(unitIndex + 1);
        property = name.substring(0, unitIndex);
    }
    return { property, suffix };
}

function mapLiteral(obj, quoted = false) {
    return literalMap(Object.keys(obj).map((key) => ({
        key,
        quoted,
        value: obj[key],
    })));
}

class IcuSerializerVisitor {
    visitText(text) {
        return text.value;
    }
    visitContainer(container) {
        return container.children.map((child) => child.visit(this)).join('');
    }
    visitIcu(icu) {
        const strCases = Object.keys(icu.cases).map((k) => `${k} {${icu.cases[k].visit(this)}}`);
        const result = `{${icu.expressionPlaceholder}, ${icu.type}, ${strCases.join(' ')}}`;
        return result;
    }
    visitTagPlaceholder(ph) {
        return ph.isVoid
            ? this.formatPh(ph.startName)
            : `${this.formatPh(ph.startName)}${ph.children
                .map((child) => child.visit(this))
                .join('')}${this.formatPh(ph.closeName)}`;
    }
    visitPlaceholder(ph) {
        return this.formatPh(ph.name);
    }
    visitBlockPlaceholder(ph) {
        return `${this.formatPh(ph.startName)}${ph.children
            .map((child) => child.visit(this))
            .join('')}${this.formatPh(ph.closeName)}`;
    }
    visitIcuPlaceholder(ph, context) {
        return this.formatPh(ph.name);
    }
    formatPh(value) {
        return `{${formatI18nPlaceholderName(value, /* useCamelCase */ false)}}`;
    }
}
const serializer = new IcuSerializerVisitor();
function serializeIcuNode(icu) {
    return icu.visit(serializer);
}

class NodeWithI18n {
    sourceSpan;
    i18n;
    constructor(sourceSpan, i18n) {
        this.sourceSpan = sourceSpan;
        this.i18n = i18n;
    }
}
class Text extends NodeWithI18n {
    value;
    tokens;
    constructor(value, sourceSpan, tokens, i18n) {
        super(sourceSpan, i18n);
        this.value = value;
        this.tokens = tokens;
    }
    visit(visitor, context) {
        return visitor.visitText(this, context);
    }
}
class Expansion extends NodeWithI18n {
    switchValue;
    type;
    cases;
    switchValueSourceSpan;
    constructor(switchValue, type, cases, sourceSpan, switchValueSourceSpan, i18n) {
        super(sourceSpan, i18n);
        this.switchValue = switchValue;
        this.type = type;
        this.cases = cases;
        this.switchValueSourceSpan = switchValueSourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitExpansion(this, context);
    }
}
class ExpansionCase {
    value;
    expression;
    sourceSpan;
    valueSourceSpan;
    expSourceSpan;
    constructor(value, expression, sourceSpan, valueSourceSpan, expSourceSpan) {
        this.value = value;
        this.expression = expression;
        this.sourceSpan = sourceSpan;
        this.valueSourceSpan = valueSourceSpan;
        this.expSourceSpan = expSourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitExpansionCase(this, context);
    }
}
class Attribute extends NodeWithI18n {
    name;
    value;
    keySpan;
    valueSpan;
    valueTokens;
    constructor(name, value, sourceSpan, keySpan, valueSpan, valueTokens, i18n) {
        super(sourceSpan, i18n);
        this.name = name;
        this.value = value;
        this.keySpan = keySpan;
        this.valueSpan = valueSpan;
        this.valueTokens = valueTokens;
    }
    visit(visitor, context) {
        return visitor.visitAttribute(this, context);
    }
}
class Element extends NodeWithI18n {
    name;
    attrs;
    children;
    startSourceSpan;
    endSourceSpan;
    constructor(name, attrs, children, sourceSpan, startSourceSpan, endSourceSpan = null, i18n) {
        super(sourceSpan, i18n);
        this.name = name;
        this.attrs = attrs;
        this.children = children;
        this.startSourceSpan = startSourceSpan;
        this.endSourceSpan = endSourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitElement(this, context);
    }
}
class Comment {
    value;
    sourceSpan;
    constructor(value, sourceSpan) {
        this.value = value;
        this.sourceSpan = sourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitComment(this, context);
    }
}
class Block extends NodeWithI18n {
    name;
    parameters;
    children;
    nameSpan;
    startSourceSpan;
    endSourceSpan;
    constructor(name, parameters, children, sourceSpan, nameSpan, startSourceSpan, endSourceSpan = null, i18n) {
        super(sourceSpan, i18n);
        this.name = name;
        this.parameters = parameters;
        this.children = children;
        this.nameSpan = nameSpan;
        this.startSourceSpan = startSourceSpan;
        this.endSourceSpan = endSourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitBlock(this, context);
    }
}
class BlockParameter {
    expression;
    sourceSpan;
    constructor(expression, sourceSpan) {
        this.expression = expression;
        this.sourceSpan = sourceSpan;
    }
    visit(visitor, context) {
        return visitor.visitBlockParameter(this, context);
    }
}
class LetDeclaration {
    name;
    value;
    sourceSpan;
    nameSpan;
    valueSpan;
    constructor(name, value, sourceSpan, nameSpan, valueSpan) {
        this.name = name;
        this.value = value;
        this.sourceSpan = sourceSpan;
        this.nameSpan = nameSpan;
        this.valueSpan = valueSpan;
    }
    visit(visitor, context) {
        return visitor.visitLetDeclaration(this, context);
    }
}
function visitAll(visitor, nodes, context = null) {
    const result = [];
    const visit = visitor.visit
        ? (ast) => visitor.visit(ast, context) || ast.visit(visitor, context)
        : (ast) => ast.visit(visitor, context);
    nodes.forEach((ast) => {
        const astResult = visit(ast);
        if (astResult) {
            result.push(astResult);
        }
    });
    return result;
}
class RecursiveVisitor {
    constructor() { }
    visitElement(ast, context) {
        this.visitChildren(context, (visit) => {
            visit(ast.attrs);
            visit(ast.children);
        });
    }
    visitAttribute(ast, context) { }
    visitText(ast, context) { }
    visitComment(ast, context) { }
    visitExpansion(ast, context) {
        return this.visitChildren(context, (visit) => {
            visit(ast.cases);
        });
    }
    visitExpansionCase(ast, context) { }
    visitBlock(block, context) {
        this.visitChildren(context, (visit) => {
            visit(block.parameters);
            visit(block.children);
        });
    }
    visitBlockParameter(ast, context) { }
    visitLetDeclaration(decl, context) { }
    visitChildren(context, cb) {
        let results = [];
        let t = this;
        function visit(children) {
            if (children)
                results.push(visitAll(t, children, context));
        }
        cb(visit);
        return Array.prototype.concat.apply([], results);
    }
}

// Mapping between all HTML entity names and their unicode representation.
// Generated from https://html.spec.whatwg.org/multipage/entities.json by stripping
// the `&` and `;` from the keys and removing the duplicates.
// see https://www.w3.org/TR/html51/syntax.html#named-character-references
const NAMED_ENTITIES = {
    'AElig': '\u00C6',
    'AMP': '\u0026',
    'amp': '\u0026',
    'Aacute': '\u00C1',
    'Abreve': '\u0102',
    'Acirc': '\u00C2',
    'Acy': '\u0410',
    'Afr': '\uD835\uDD04',
    'Agrave': '\u00C0',
    'Alpha': '\u0391',
    'Amacr': '\u0100',
    'And': '\u2A53',
    'Aogon': '\u0104',
    'Aopf': '\uD835\uDD38',
    'ApplyFunction': '\u2061',
    'af': '\u2061',
    'Aring': '\u00C5',
    'angst': '\u00C5',
    'Ascr': '\uD835\uDC9C',
    'Assign': '\u2254',
    'colone': '\u2254',
    'coloneq': '\u2254',
    'Atilde': '\u00C3',
    'Auml': '\u00C4',
    'Backslash': '\u2216',
    'setminus': '\u2216',
    'setmn': '\u2216',
    'smallsetminus': '\u2216',
    'ssetmn': '\u2216',
    'Barv': '\u2AE7',
    'Barwed': '\u2306',
    'doublebarwedge': '\u2306',
    'Bcy': '\u0411',
    'Because': '\u2235',
    'becaus': '\u2235',
    'because': '\u2235',
    'Bernoullis': '\u212C',
    'Bscr': '\u212C',
    'bernou': '\u212C',
    'Beta': '\u0392',
    'Bfr': '\uD835\uDD05',
    'Bopf': '\uD835\uDD39',
    'Breve': '\u02D8',
    'breve': '\u02D8',
    'Bumpeq': '\u224E',
    'HumpDownHump': '\u224E',
    'bump': '\u224E',
    'CHcy': '\u0427',
    'COPY': '\u00A9',
    'copy': '\u00A9',
    'Cacute': '\u0106',
    'Cap': '\u22D2',
    'CapitalDifferentialD': '\u2145',
    'DD': '\u2145',
    'Cayleys': '\u212D',
    'Cfr': '\u212D',
    'Ccaron': '\u010C',
    'Ccedil': '\u00C7',
    'Ccirc': '\u0108',
    'Cconint': '\u2230',
    'Cdot': '\u010A',
    'Cedilla': '\u00B8',
    'cedil': '\u00B8',
    'CenterDot': '\u00B7',
    'centerdot': '\u00B7',
    'middot': '\u00B7',
    'Chi': '\u03A7',
    'CircleDot': '\u2299',
    'odot': '\u2299',
    'CircleMinus': '\u2296',
    'ominus': '\u2296',
    'CirclePlus': '\u2295',
    'oplus': '\u2295',
    'CircleTimes': '\u2297',
    'otimes': '\u2297',
    'ClockwiseContourIntegral': '\u2232',
    'cwconint': '\u2232',
    'CloseCurlyDoubleQuote': '\u201D',
    'rdquo': '\u201D',
    'rdquor': '\u201D',
    'CloseCurlyQuote': '\u2019',
    'rsquo': '\u2019',
    'rsquor': '\u2019',
    'Colon': '\u2237',
    'Proportion': '\u2237',
    'Colone': '\u2A74',
    'Congruent': '\u2261',
    'equiv': '\u2261',
    'Conint': '\u222F',
    'DoubleContourIntegral': '\u222F',
    'ContourIntegral': '\u222E',
    'conint': '\u222E',
    'oint': '\u222E',
    'Copf': '\u2102',
    'complexes': '\u2102',
    'Coproduct': '\u2210',
    'coprod': '\u2210',
    'CounterClockwiseContourIntegral': '\u2233',
    'awconint': '\u2233',
    'Cross': '\u2A2F',
    'Cscr': '\uD835\uDC9E',
    'Cup': '\u22D3',
    'CupCap': '\u224D',
    'asympeq': '\u224D',
    'DDotrahd': '\u2911',
    'DJcy': '\u0402',
    'DScy': '\u0405',
    'DZcy': '\u040F',
    'Dagger': '\u2021',
    'ddagger': '\u2021',
    'Darr': '\u21A1',
    'Dashv': '\u2AE4',
    'DoubleLeftTee': '\u2AE4',
    'Dcaron': '\u010E',
    'Dcy': '\u0414',
    'Del': '\u2207',
    'nabla': '\u2207',
    'Delta': '\u0394',
    'Dfr': '\uD835\uDD07',
    'DiacriticalAcute': '\u00B4',
    'acute': '\u00B4',
    'DiacriticalDot': '\u02D9',
    'dot': '\u02D9',
    'DiacriticalDoubleAcute': '\u02DD',
    'dblac': '\u02DD',
    'DiacriticalGrave': '\u0060',
    'grave': '\u0060',
    'DiacriticalTilde': '\u02DC',
    'tilde': '\u02DC',
    'Diamond': '\u22C4',
    'diam': '\u22C4',
    'diamond': '\u22C4',
    'DifferentialD': '\u2146',
    'dd': '\u2146',
    'Dopf': '\uD835\uDD3B',
    'Dot': '\u00A8',
    'DoubleDot': '\u00A8',
    'die': '\u00A8',
    'uml': '\u00A8',
    'DotDot': '\u20DC',
    'DotEqual': '\u2250',
    'doteq': '\u2250',
    'esdot': '\u2250',
    'DoubleDownArrow': '\u21D3',
    'Downarrow': '\u21D3',
    'dArr': '\u21D3',
    'DoubleLeftArrow': '\u21D0',
    'Leftarrow': '\u21D0',
    'lArr': '\u21D0',
    'DoubleLeftRightArrow': '\u21D4',
    'Leftrightarrow': '\u21D4',
    'hArr': '\u21D4',
    'iff': '\u21D4',
    'DoubleLongLeftArrow': '\u27F8',
    'Longleftarrow': '\u27F8',
    'xlArr': '\u27F8',
    'DoubleLongLeftRightArrow': '\u27FA',
    'Longleftrightarrow': '\u27FA',
    'xhArr': '\u27FA',
    'DoubleLongRightArrow': '\u27F9',
    'Longrightarrow': '\u27F9',
    'xrArr': '\u27F9',
    'DoubleRightArrow': '\u21D2',
    'Implies': '\u21D2',
    'Rightarrow': '\u21D2',
    'rArr': '\u21D2',
    'DoubleRightTee': '\u22A8',
    'vDash': '\u22A8',
    'DoubleUpArrow': '\u21D1',
    'Uparrow': '\u21D1',
    'uArr': '\u21D1',
    'DoubleUpDownArrow': '\u21D5',
    'Updownarrow': '\u21D5',
    'vArr': '\u21D5',
    'DoubleVerticalBar': '\u2225',
    'par': '\u2225',
    'parallel': '\u2225',
    'shortparallel': '\u2225',
    'spar': '\u2225',
    'DownArrow': '\u2193',
    'ShortDownArrow': '\u2193',
    'darr': '\u2193',
    'downarrow': '\u2193',
    'DownArrowBar': '\u2913',
    'DownArrowUpArrow': '\u21F5',
    'duarr': '\u21F5',
    'DownBreve': '\u0311',
    'DownLeftRightVector': '\u2950',
    'DownLeftTeeVector': '\u295E',
    'DownLeftVector': '\u21BD',
    'leftharpoondown': '\u21BD',
    'lhard': '\u21BD',
    'DownLeftVectorBar': '\u2956',
    'DownRightTeeVector': '\u295F',
    'DownRightVector': '\u21C1',
    'rhard': '\u21C1',
    'rightharpoondown': '\u21C1',
    'DownRightVectorBar': '\u2957',
    'DownTee': '\u22A4',
    'top': '\u22A4',
    'DownTeeArrow': '\u21A7',
    'mapstodown': '\u21A7',
    'Dscr': '\uD835\uDC9F',
    'Dstrok': '\u0110',
    'ENG': '\u014A',
    'ETH': '\u00D0',
    'Eacute': '\u00C9',
    'Ecaron': '\u011A',
    'Ecirc': '\u00CA',
    'Ecy': '\u042D',
    'Edot': '\u0116',
    'Efr': '\uD835\uDD08',
    'Egrave': '\u00C8',
    'Element': '\u2208',
    'in': '\u2208',
    'isin': '\u2208',
    'isinv': '\u2208',
    'Emacr': '\u0112',
    'EmptySmallSquare': '\u25FB',
    'EmptyVerySmallSquare': '\u25AB',
    'Eogon': '\u0118',
    'Eopf': '\uD835\uDD3C',
    'Epsilon': '\u0395',
    'Equal': '\u2A75',
    'EqualTilde': '\u2242',
    'eqsim': '\u2242',
    'esim': '\u2242',
    'Equilibrium': '\u21CC',
    'rightleftharpoons': '\u21CC',
    'rlhar': '\u21CC',
    'Escr': '\u2130',
    'expectation': '\u2130',
    'Esim': '\u2A73',
    'Eta': '\u0397',
    'Euml': '\u00CB',
    'Exists': '\u2203',
    'exist': '\u2203',
    'ExponentialE': '\u2147',
    'ee': '\u2147',
    'exponentiale': '\u2147',
    'Fcy': '\u0424',
    'Ffr': '\uD835\uDD09',
    'FilledSmallSquare': '\u25FC',
    'FilledVerySmallSquare': '\u25AA',
    'blacksquare': '\u25AA',
    'squarf': '\u25AA',
    'squf': '\u25AA',
    'Fopf': '\uD835\uDD3D',
    'ForAll': '\u2200',
    'forall': '\u2200',
    'Fouriertrf': '\u2131',
    'Fscr': '\u2131',
    'GJcy': '\u0403',
    'GT': '\u003E',
    'gt': '\u003E',
    'Gamma': '\u0393',
    'Gammad': '\u03DC',
    'Gbreve': '\u011E',
    'Gcedil': '\u0122',
    'Gcirc': '\u011C',
    'Gcy': '\u0413',
    'Gdot': '\u0120',
    'Gfr': '\uD835\uDD0A',
    'Gg': '\u22D9',
    'ggg': '\u22D9',
    'Gopf': '\uD835\uDD3E',
    'GreaterEqual': '\u2265',
    'ge': '\u2265',
    'geq': '\u2265',
    'GreaterEqualLess': '\u22DB',
    'gel': '\u22DB',
    'gtreqless': '\u22DB',
    'GreaterFullEqual': '\u2267',
    'gE': '\u2267',
    'geqq': '\u2267',
    'GreaterGreater': '\u2AA2',
    'GreaterLess': '\u2277',
    'gl': '\u2277',
    'gtrless': '\u2277',
    'GreaterSlantEqual': '\u2A7E',
    'geqslant': '\u2A7E',
    'ges': '\u2A7E',
    'GreaterTilde': '\u2273',
    'gsim': '\u2273',
    'gtrsim': '\u2273',
    'Gscr': '\uD835\uDCA2',
    'Gt': '\u226B',
    'NestedGreaterGreater': '\u226B',
    'gg': '\u226B',
    'HARDcy': '\u042A',
    'Hacek': '\u02C7',
    'caron': '\u02C7',
    'Hat': '\u005E',
    'Hcirc': '\u0124',
    'Hfr': '\u210C',
    'Poincareplane': '\u210C',
    'HilbertSpace': '\u210B',
    'Hscr': '\u210B',
    'hamilt': '\u210B',
    'Hopf': '\u210D',
    'quaternions': '\u210D',
    'HorizontalLine': '\u2500',
    'boxh': '\u2500',
    'Hstrok': '\u0126',
    'HumpEqual': '\u224F',
    'bumpe': '\u224F',
    'bumpeq': '\u224F',
    'IEcy': '\u0415',
    'IJlig': '\u0132',
    'IOcy': '\u0401',
    'Iacute': '\u00CD',
    'Icirc': '\u00CE',
    'Icy': '\u0418',
    'Idot': '\u0130',
    'Ifr': '\u2111',
    'Im': '\u2111',
    'image': '\u2111',
    'imagpart': '\u2111',
    'Igrave': '\u00CC',
    'Imacr': '\u012A',
    'ImaginaryI': '\u2148',
    'ii': '\u2148',
    'Int': '\u222C',
    'Integral': '\u222B',
    'int': '\u222B',
    'Intersection': '\u22C2',
    'bigcap': '\u22C2',
    'xcap': '\u22C2',
    'InvisibleComma': '\u2063',
    'ic': '\u2063',
    'InvisibleTimes': '\u2062',
    'it': '\u2062',
    'Iogon': '\u012E',
    'Iopf': '\uD835\uDD40',
    'Iota': '\u0399',
    'Iscr': '\u2110',
    'imagline': '\u2110',
    'Itilde': '\u0128',
    'Iukcy': '\u0406',
    'Iuml': '\u00CF',
    'Jcirc': '\u0134',
    'Jcy': '\u0419',
    'Jfr': '\uD835\uDD0D',
    'Jopf': '\uD835\uDD41',
    'Jscr': '\uD835\uDCA5',
    'Jsercy': '\u0408',
    'Jukcy': '\u0404',
    'KHcy': '\u0425',
    'KJcy': '\u040C',
    'Kappa': '\u039A',
    'Kcedil': '\u0136',
    'Kcy': '\u041A',
    'Kfr': '\uD835\uDD0E',
    'Kopf': '\uD835\uDD42',
    'Kscr': '\uD835\uDCA6',
    'LJcy': '\u0409',
    'LT': '\u003C',
    'lt': '\u003C',
    'Lacute': '\u0139',
    'Lambda': '\u039B',
    'Lang': '\u27EA',
    'Laplacetrf': '\u2112',
    'Lscr': '\u2112',
    'lagran': '\u2112',
    'Larr': '\u219E',
    'twoheadleftarrow': '\u219E',
    'Lcaron': '\u013D',
    'Lcedil': '\u013B',
    'Lcy': '\u041B',
    'LeftAngleBracket': '\u27E8',
    'lang': '\u27E8',
    'langle': '\u27E8',
    'LeftArrow': '\u2190',
    'ShortLeftArrow': '\u2190',
    'larr': '\u2190',
    'leftarrow': '\u2190',
    'slarr': '\u2190',
    'LeftArrowBar': '\u21E4',
    'larrb': '\u21E4',
    'LeftArrowRightArrow': '\u21C6',
    'leftrightarrows': '\u21C6',
    'lrarr': '\u21C6',
    'LeftCeiling': '\u2308',
    'lceil': '\u2308',
    'LeftDoubleBracket': '\u27E6',
    'lobrk': '\u27E6',
    'LeftDownTeeVector': '\u2961',
    'LeftDownVector': '\u21C3',
    'dharl': '\u21C3',
    'downharpoonleft': '\u21C3',
    'LeftDownVectorBar': '\u2959',
    'LeftFloor': '\u230A',
    'lfloor': '\u230A',
    'LeftRightArrow': '\u2194',
    'harr': '\u2194',
    'leftrightarrow': '\u2194',
    'LeftRightVector': '\u294E',
    'LeftTee': '\u22A3',
    'dashv': '\u22A3',
    'LeftTeeArrow': '\u21A4',
    'mapstoleft': '\u21A4',
    'LeftTeeVector': '\u295A',
    'LeftTriangle': '\u22B2',
    'vartriangleleft': '\u22B2',
    'vltri': '\u22B2',
    'LeftTriangleBar': '\u29CF',
    'LeftTriangleEqual': '\u22B4',
    'ltrie': '\u22B4',
    'trianglelefteq': '\u22B4',
    'LeftUpDownVector': '\u2951',
    'LeftUpTeeVector': '\u2960',
    'LeftUpVector': '\u21BF',
    'uharl': '\u21BF',
    'upharpoonleft': '\u21BF',
    'LeftUpVectorBar': '\u2958',
    'LeftVector': '\u21BC',
    'leftharpoonup': '\u21BC',
    'lharu': '\u21BC',
    'LeftVectorBar': '\u2952',
    'LessEqualGreater': '\u22DA',
    'leg': '\u22DA',
    'lesseqgtr': '\u22DA',
    'LessFullEqual': '\u2266',
    'lE': '\u2266',
    'leqq': '\u2266',
    'LessGreater': '\u2276',
    'lessgtr': '\u2276',
    'lg': '\u2276',
    'LessLess': '\u2AA1',
    'LessSlantEqual': '\u2A7D',
    'leqslant': '\u2A7D',
    'les': '\u2A7D',
    'LessTilde': '\u2272',
    'lesssim': '\u2272',
    'lsim': '\u2272',
    'Lfr': '\uD835\uDD0F',
    'Ll': '\u22D8',
    'Lleftarrow': '\u21DA',
    'lAarr': '\u21DA',
    'Lmidot': '\u013F',
    'LongLeftArrow': '\u27F5',
    'longleftarrow': '\u27F5',
    'xlarr': '\u27F5',
    'LongLeftRightArrow': '\u27F7',
    'longleftrightarrow': '\u27F7',
    'xharr': '\u27F7',
    'LongRightArrow': '\u27F6',
    'longrightarrow': '\u27F6',
    'xrarr': '\u27F6',
    'Lopf': '\uD835\uDD43',
    'LowerLeftArrow': '\u2199',
    'swarr': '\u2199',
    'swarrow': '\u2199',
    'LowerRightArrow': '\u2198',
    'searr': '\u2198',
    'searrow': '\u2198',
    'Lsh': '\u21B0',
    'lsh': '\u21B0',
    'Lstrok': '\u0141',
    'Lt': '\u226A',
    'NestedLessLess': '\u226A',
    'll': '\u226A',
    'Map': '\u2905',
    'Mcy': '\u041C',
    'MediumSpace': '\u205F',
    'Mellintrf': '\u2133',
    'Mscr': '\u2133',
    'phmmat': '\u2133',
    'Mfr': '\uD835\uDD10',
    'MinusPlus': '\u2213',
    'mnplus': '\u2213',
    'mp': '\u2213',
    'Mopf': '\uD835\uDD44',
    'Mu': '\u039C',
    'NJcy': '\u040A',
    'Nacute': '\u0143',
    'Ncaron': '\u0147',
    'Ncedil': '\u0145',
    'Ncy': '\u041D',
    'NegativeMediumSpace': '\u200B',
    'NegativeThickSpace': '\u200B',
    'NegativeThinSpace': '\u200B',
    'NegativeVeryThinSpace': '\u200B',
    'ZeroWidthSpace': '\u200B',
    'NewLine': '\u000A',
    'Nfr': '\uD835\uDD11',
    'NoBreak': '\u2060',
    'NonBreakingSpace': '\u00A0',
    'nbsp': '\u00A0',
    'Nopf': '\u2115',
    'naturals': '\u2115',
    'Not': '\u2AEC',
    'NotCongruent': '\u2262',
    'nequiv': '\u2262',
    'NotCupCap': '\u226D',
    'NotDoubleVerticalBar': '\u2226',
    'npar': '\u2226',
    'nparallel': '\u2226',
    'nshortparallel': '\u2226',
    'nspar': '\u2226',
    'NotElement': '\u2209',
    'notin': '\u2209',
    'notinva': '\u2209',
    'NotEqual': '\u2260',
    'ne': '\u2260',
    'NotEqualTilde': '\u2242\u0338',
    'nesim': '\u2242\u0338',
    'NotExists': '\u2204',
    'nexist': '\u2204',
    'nexists': '\u2204',
    'NotGreater': '\u226F',
    'ngt': '\u226F',
    'ngtr': '\u226F',
    'NotGreaterEqual': '\u2271',
    'nge': '\u2271',
    'ngeq': '\u2271',
    'NotGreaterFullEqual': '\u2267\u0338',
    'ngE': '\u2267\u0338',
    'ngeqq': '\u2267\u0338',
    'NotGreaterGreater': '\u226B\u0338',
    'nGtv': '\u226B\u0338',
    'NotGreaterLess': '\u2279',
    'ntgl': '\u2279',
    'NotGreaterSlantEqual': '\u2A7E\u0338',
    'ngeqslant': '\u2A7E\u0338',
    'nges': '\u2A7E\u0338',
    'NotGreaterTilde': '\u2275',
    'ngsim': '\u2275',
    'NotHumpDownHump': '\u224E\u0338',
    'nbump': '\u224E\u0338',
    'NotHumpEqual': '\u224F\u0338',
    'nbumpe': '\u224F\u0338',
    'NotLeftTriangle': '\u22EA',
    'nltri': '\u22EA',
    'ntriangleleft': '\u22EA',
    'NotLeftTriangleBar': '\u29CF\u0338',
    'NotLeftTriangleEqual': '\u22EC',
    'nltrie': '\u22EC',
    'ntrianglelefteq': '\u22EC',
    'NotLess': '\u226E',
    'nless': '\u226E',
    'nlt': '\u226E',
    'NotLessEqual': '\u2270',
    'nle': '\u2270',
    'nleq': '\u2270',
    'NotLessGreater': '\u2278',
    'ntlg': '\u2278',
    'NotLessLess': '\u226A\u0338',
    'nLtv': '\u226A\u0338',
    'NotLessSlantEqual': '\u2A7D\u0338',
    'nleqslant': '\u2A7D\u0338',
    'nles': '\u2A7D\u0338',
    'NotLessTilde': '\u2274',
    'nlsim': '\u2274',
    'NotNestedGreaterGreater': '\u2AA2\u0338',
    'NotNestedLessLess': '\u2AA1\u0338',
    'NotPrecedes': '\u2280',
    'npr': '\u2280',
    'nprec': '\u2280',
    'NotPrecedesEqual': '\u2AAF\u0338',
    'npre': '\u2AAF\u0338',
    'npreceq': '\u2AAF\u0338',
    'NotPrecedesSlantEqual': '\u22E0',
    'nprcue': '\u22E0',
    'NotReverseElement': '\u220C',
    'notni': '\u220C',
    'notniva': '\u220C',
    'NotRightTriangle': '\u22EB',
    'nrtri': '\u22EB',
    'ntriangleright': '\u22EB',
    'NotRightTriangleBar': '\u29D0\u0338',
    'NotRightTriangleEqual': '\u22ED',
    'nrtrie': '\u22ED',
    'ntrianglerighteq': '\u22ED',
    'NotSquareSubset': '\u228F\u0338',
    'NotSquareSubsetEqual': '\u22E2',
    'nsqsube': '\u22E2',
    'NotSquareSuperset': '\u2290\u0338',
    'NotSquareSupersetEqual': '\u22E3',
    'nsqsupe': '\u22E3',
    'NotSubset': '\u2282\u20D2',
    'nsubset': '\u2282\u20D2',
    'vnsub': '\u2282\u20D2',
    'NotSubsetEqual': '\u2288',
    'nsube': '\u2288',
    'nsubseteq': '\u2288',
    'NotSucceeds': '\u2281',
    'nsc': '\u2281',
    'nsucc': '\u2281',
    'NotSucceedsEqual': '\u2AB0\u0338',
    'nsce': '\u2AB0\u0338',
    'nsucceq': '\u2AB0\u0338',
    'NotSucceedsSlantEqual': '\u22E1',
    'nsccue': '\u22E1',
    'NotSucceedsTilde': '\u227F\u0338',
    'NotSuperset': '\u2283\u20D2',
    'nsupset': '\u2283\u20D2',
    'vnsup': '\u2283\u20D2',
    'NotSupersetEqual': '\u2289',
    'nsupe': '\u2289',
    'nsupseteq': '\u2289',
    'NotTilde': '\u2241',
    'nsim': '\u2241',
    'NotTildeEqual': '\u2244',
    'nsime': '\u2244',
    'nsimeq': '\u2244',
    'NotTildeFullEqual': '\u2247',
    'ncong': '\u2247',
    'NotTildeTilde': '\u2249',
    'nap': '\u2249',
    'napprox': '\u2249',
    'NotVerticalBar': '\u2224',
    'nmid': '\u2224',
    'nshortmid': '\u2224',
    'nsmid': '\u2224',
    'Nscr': '\uD835\uDCA9',
    'Ntilde': '\u00D1',
    'Nu': '\u039D',
    'OElig': '\u0152',
    'Oacute': '\u00D3',
    'Ocirc': '\u00D4',
    'Ocy': '\u041E',
    'Odblac': '\u0150',
    'Ofr': '\uD835\uDD12',
    'Ograve': '\u00D2',
    'Omacr': '\u014C',
    'Omega': '\u03A9',
    'ohm': '\u03A9',
    'Omicron': '\u039F',
    'Oopf': '\uD835\uDD46',
    'OpenCurlyDoubleQuote': '\u201C',
    'ldquo': '\u201C',
    'OpenCurlyQuote': '\u2018',
    'lsquo': '\u2018',
    'Or': '\u2A54',
    'Oscr': '\uD835\uDCAA',
    'Oslash': '\u00D8',
    'Otilde': '\u00D5',
    'Otimes': '\u2A37',
    'Ouml': '\u00D6',
    'OverBar': '\u203E',
    'oline': '\u203E',
    'OverBrace': '\u23DE',
    'OverBracket': '\u23B4',
    'tbrk': '\u23B4',
    'OverParenthesis': '\u23DC',
    'PartialD': '\u2202',
    'part': '\u2202',
    'Pcy': '\u041F',
    'Pfr': '\uD835\uDD13',
    'Phi': '\u03A6',
    'Pi': '\u03A0',
    'PlusMinus': '\u00B1',
    'plusmn': '\u00B1',
    'pm': '\u00B1',
    'Popf': '\u2119',
    'primes': '\u2119',
    'Pr': '\u2ABB',
    'Precedes': '\u227A',
    'pr': '\u227A',
    'prec': '\u227A',
    'PrecedesEqual': '\u2AAF',
    'pre': '\u2AAF',
    'preceq': '\u2AAF',
    'PrecedesSlantEqual': '\u227C',
    'prcue': '\u227C',
    'preccurlyeq': '\u227C',
    'PrecedesTilde': '\u227E',
    'precsim': '\u227E',
    'prsim': '\u227E',
    'Prime': '\u2033',
    'Product': '\u220F',
    'prod': '\u220F',
    'Proportional': '\u221D',
    'prop': '\u221D',
    'propto': '\u221D',
    'varpropto': '\u221D',
    'vprop': '\u221D',
    'Pscr': '\uD835\uDCAB',
    'Psi': '\u03A8',
    'QUOT': '\u0022',
    'quot': '\u0022',
    'Qfr': '\uD835\uDD14',
    'Qopf': '\u211A',
    'rationals': '\u211A',
    'Qscr': '\uD835\uDCAC',
    'RBarr': '\u2910',
    'drbkarow': '\u2910',
    'REG': '\u00AE',
    'circledR': '\u00AE',
    'reg': '\u00AE',
    'Racute': '\u0154',
    'Rang': '\u27EB',
    'Rarr': '\u21A0',
    'twoheadrightarrow': '\u21A0',
    'Rarrtl': '\u2916',
    'Rcaron': '\u0158',
    'Rcedil': '\u0156',
    'Rcy': '\u0420',
    'Re': '\u211C',
    'Rfr': '\u211C',
    'real': '\u211C',
    'realpart': '\u211C',
    'ReverseElement': '\u220B',
    'SuchThat': '\u220B',
    'ni': '\u220B',
    'niv': '\u220B',
    'ReverseEquilibrium': '\u21CB',
    'leftrightharpoons': '\u21CB',
    'lrhar': '\u21CB',
    'ReverseUpEquilibrium': '\u296F',
    'duhar': '\u296F',
    'Rho': '\u03A1',
    'RightAngleBracket': '\u27E9',
    'rang': '\u27E9',
    'rangle': '\u27E9',
    'RightArrow': '\u2192',
    'ShortRightArrow': '\u2192',
    'rarr': '\u2192',
    'rightarrow': '\u2192',
    'srarr': '\u2192',
    'RightArrowBar': '\u21E5',
    'rarrb': '\u21E5',
    'RightArrowLeftArrow': '\u21C4',
    'rightleftarrows': '\u21C4',
    'rlarr': '\u21C4',
    'RightCeiling': '\u2309',
    'rceil': '\u2309',
    'RightDoubleBracket': '\u27E7',
    'robrk': '\u27E7',
    'RightDownTeeVector': '\u295D',
    'RightDownVector': '\u21C2',
    'dharr': '\u21C2',
    'downharpoonright': '\u21C2',
    'RightDownVectorBar': '\u2955',
    'RightFloor': '\u230B',
    'rfloor': '\u230B',
    'RightTee': '\u22A2',
    'vdash': '\u22A2',
    'RightTeeArrow': '\u21A6',
    'map': '\u21A6',
    'mapsto': '\u21A6',
    'RightTeeVector': '\u295B',
    'RightTriangle': '\u22B3',
    'vartriangleright': '\u22B3',
    'vrtri': '\u22B3',
    'RightTriangleBar': '\u29D0',
    'RightTriangleEqual': '\u22B5',
    'rtrie': '\u22B5',
    'trianglerighteq': '\u22B5',
    'RightUpDownVector': '\u294F',
    'RightUpTeeVector': '\u295C',
    'RightUpVector': '\u21BE',
    'uharr': '\u21BE',
    'upharpoonright': '\u21BE',
    'RightUpVectorBar': '\u2954',
    'RightVector': '\u21C0',
    'rharu': '\u21C0',
    'rightharpoonup': '\u21C0',
    'RightVectorBar': '\u2953',
    'Ropf': '\u211D',
    'reals': '\u211D',
    'RoundImplies': '\u2970',
    'Rrightarrow': '\u21DB',
    'rAarr': '\u21DB',
    'Rscr': '\u211B',
    'realine': '\u211B',
    'Rsh': '\u21B1',
    'rsh': '\u21B1',
    'RuleDelayed': '\u29F4',
    'SHCHcy': '\u0429',
    'SHcy': '\u0428',
    'SOFTcy': '\u042C',
    'Sacute': '\u015A',
    'Sc': '\u2ABC',
    'Scaron': '\u0160',
    'Scedil': '\u015E',
    'Scirc': '\u015C',
    'Scy': '\u0421',
    'Sfr': '\uD835\uDD16',
    'ShortUpArrow': '\u2191',
    'UpArrow': '\u2191',
    'uarr': '\u2191',
    'uparrow': '\u2191',
    'Sigma': '\u03A3',
    'SmallCircle': '\u2218',
    'compfn': '\u2218',
    'Sopf': '\uD835\uDD4A',
    'Sqrt': '\u221A',
    'radic': '\u221A',
    'Square': '\u25A1',
    'squ': '\u25A1',
    'square': '\u25A1',
    'SquareIntersection': '\u2293',
    'sqcap': '\u2293',
    'SquareSubset': '\u228F',
    'sqsub': '\u228F',
    'sqsubset': '\u228F',
    'SquareSubsetEqual': '\u2291',
    'sqsube': '\u2291',
    'sqsubseteq': '\u2291',
    'SquareSuperset': '\u2290',
    'sqsup': '\u2290',
    'sqsupset': '\u2290',
    'SquareSupersetEqual': '\u2292',
    'sqsupe': '\u2292',
    'sqsupseteq': '\u2292',
    'SquareUnion': '\u2294',
    'sqcup': '\u2294',
    'Sscr': '\uD835\uDCAE',
    'Star': '\u22C6',
    'sstarf': '\u22C6',
    'Sub': '\u22D0',
    'Subset': '\u22D0',
    'SubsetEqual': '\u2286',
    'sube': '\u2286',
    'subseteq': '\u2286',
    'Succeeds': '\u227B',
    'sc': '\u227B',
    'succ': '\u227B',
    'SucceedsEqual': '\u2AB0',
    'sce': '\u2AB0',
    'succeq': '\u2AB0',
    'SucceedsSlantEqual': '\u227D',
    'sccue': '\u227D',
    'succcurlyeq': '\u227D',
    'SucceedsTilde': '\u227F',
    'scsim': '\u227F',
    'succsim': '\u227F',
    'Sum': '\u2211',
    'sum': '\u2211',
    'Sup': '\u22D1',
    'Supset': '\u22D1',
    'Superset': '\u2283',
    'sup': '\u2283',
    'supset': '\u2283',
    'SupersetEqual': '\u2287',
    'supe': '\u2287',
    'supseteq': '\u2287',
    'THORN': '\u00DE',
    'TRADE': '\u2122',
    'trade': '\u2122',
    'TSHcy': '\u040B',
    'TScy': '\u0426',
    'Tab': '\u0009',
    'Tau': '\u03A4',
    'Tcaron': '\u0164',
    'Tcedil': '\u0162',
    'Tcy': '\u0422',
    'Tfr': '\uD835\uDD17',
    'Therefore': '\u2234',
    'there4': '\u2234',
    'therefore': '\u2234',
    'Theta': '\u0398',
    'ThickSpace': '\u205F\u200A',
    'ThinSpace': '\u2009',
    'thinsp': '\u2009',
    'Tilde': '\u223C',
    'sim': '\u223C',
    'thicksim': '\u223C',
    'thksim': '\u223C',
    'TildeEqual': '\u2243',
    'sime': '\u2243',
    'simeq': '\u2243',
    'TildeFullEqual': '\u2245',
    'cong': '\u2245',
    'TildeTilde': '\u2248',
    'ap': '\u2248',
    'approx': '\u2248',
    'asymp': '\u2248',
    'thickapprox': '\u2248',
    'thkap': '\u2248',
    'Topf': '\uD835\uDD4B',
    'TripleDot': '\u20DB',
    'tdot': '\u20DB',
    'Tscr': '\uD835\uDCAF',
    'Tstrok': '\u0166',
    'Uacute': '\u00DA',
    'Uarr': '\u219F',
    'Uarrocir': '\u2949',
    'Ubrcy': '\u040E',
    'Ubreve': '\u016C',
    'Ucirc': '\u00DB',
    'Ucy': '\u0423',
    'Udblac': '\u0170',
    'Ufr': '\uD835\uDD18',
    'Ugrave': '\u00D9',
    'Umacr': '\u016A',
    'UnderBar': '\u005F',
    'lowbar': '\u005F',
    'UnderBrace': '\u23DF',
    'UnderBracket': '\u23B5',
    'bbrk': '\u23B5',
    'UnderParenthesis': '\u23DD',
    'Union': '\u22C3',
    'bigcup': '\u22C3',
    'xcup': '\u22C3',
    'UnionPlus': '\u228E',
    'uplus': '\u228E',
    'Uogon': '\u0172',
    'Uopf': '\uD835\uDD4C',
    'UpArrowBar': '\u2912',
    'UpArrowDownArrow': '\u21C5',
    'udarr': '\u21C5',
    'UpDownArrow': '\u2195',
    'updownarrow': '\u2195',
    'varr': '\u2195',
    'UpEquilibrium': '\u296E',
    'udhar': '\u296E',
    'UpTee': '\u22A5',
    'bot': '\u22A5',
    'bottom': '\u22A5',
    'perp': '\u22A5',
    'UpTeeArrow': '\u21A5',
    'mapstoup': '\u21A5',
    'UpperLeftArrow': '\u2196',
    'nwarr': '\u2196',
    'nwarrow': '\u2196',
    'UpperRightArrow': '\u2197',
    'nearr': '\u2197',
    'nearrow': '\u2197',
    'Upsi': '\u03D2',
    'upsih': '\u03D2',
    'Upsilon': '\u03A5',
    'Uring': '\u016E',
    'Uscr': '\uD835\uDCB0',
    'Utilde': '\u0168',
    'Uuml': '\u00DC',
    'VDash': '\u22AB',
    'Vbar': '\u2AEB',
    'Vcy': '\u0412',
    'Vdash': '\u22A9',
    'Vdashl': '\u2AE6',
    'Vee': '\u22C1',
    'bigvee': '\u22C1',
    'xvee': '\u22C1',
    'Verbar': '\u2016',
    'Vert': '\u2016',
    'VerticalBar': '\u2223',
    'mid': '\u2223',
    'shortmid': '\u2223',
    'smid': '\u2223',
    'VerticalLine': '\u007C',
    'verbar': '\u007C',
    'vert': '\u007C',
    'VerticalSeparator': '\u2758',
    'VerticalTilde': '\u2240',
    'wr': '\u2240',
    'wreath': '\u2240',
    'VeryThinSpace': '\u200A',
    'hairsp': '\u200A',
    'Vfr': '\uD835\uDD19',
    'Vopf': '\uD835\uDD4D',
    'Vscr': '\uD835\uDCB1',
    'Vvdash': '\u22AA',
    'Wcirc': '\u0174',
    'Wedge': '\u22C0',
    'bigwedge': '\u22C0',
    'xwedge': '\u22C0',
    'Wfr': '\uD835\uDD1A',
    'Wopf': '\uD835\uDD4E',
    'Wscr': '\uD835\uDCB2',
    'Xfr': '\uD835\uDD1B',
    'Xi': '\u039E',
    'Xopf': '\uD835\uDD4F',
    'Xscr': '\uD835\uDCB3',
    'YAcy': '\u042F',
    'YIcy': '\u0407',
    'YUcy': '\u042E',
    'Yacute': '\u00DD',
    'Ycirc': '\u0176',
    'Ycy': '\u042B',
    'Yfr': '\uD835\uDD1C',
    'Yopf': '\uD835\uDD50',
    'Yscr': '\uD835\uDCB4',
    'Yuml': '\u0178',
    'ZHcy': '\u0416',
    'Zacute': '\u0179',
    'Zcaron': '\u017D',
    'Zcy': '\u0417',
    'Zdot': '\u017B',
    'Zeta': '\u0396',
    'Zfr': '\u2128',
    'zeetrf': '\u2128',
    'Zopf': '\u2124',
    'integers': '\u2124',
    'Zscr': '\uD835\uDCB5',
    'aacute': '\u00E1',
    'abreve': '\u0103',
    'ac': '\u223E',
    'mstpos': '\u223E',
    'acE': '\u223E\u0333',
    'acd': '\u223F',
    'acirc': '\u00E2',
    'acy': '\u0430',
    'aelig': '\u00E6',
    'afr': '\uD835\uDD1E',
    'agrave': '\u00E0',
    'alefsym': '\u2135',
    'aleph': '\u2135',
    'alpha': '\u03B1',
    'amacr': '\u0101',
    'amalg': '\u2A3F',
    'and': '\u2227',
    'wedge': '\u2227',
    'andand': '\u2A55',
    'andd': '\u2A5C',
    'andslope': '\u2A58',
    'andv': '\u2A5A',
    'ang': '\u2220',
    'angle': '\u2220',
    'ange': '\u29A4',
    'angmsd': '\u2221',
    'measuredangle': '\u2221',
    'angmsdaa': '\u29A8',
    'angmsdab': '\u29A9',
    'angmsdac': '\u29AA',
    'angmsdad': '\u29AB',
    'angmsdae': '\u29AC',
    'angmsdaf': '\u29AD',
    'angmsdag': '\u29AE',
    'angmsdah': '\u29AF',
    'angrt': '\u221F',
    'angrtvb': '\u22BE',
    'angrtvbd': '\u299D',
    'angsph': '\u2222',
    'angzarr': '\u237C',
    'aogon': '\u0105',
    'aopf': '\uD835\uDD52',
    'apE': '\u2A70',
    'apacir': '\u2A6F',
    'ape': '\u224A',
    'approxeq': '\u224A',
    'apid': '\u224B',
    'apos': '\u0027',
    'aring': '\u00E5',
    'ascr': '\uD835\uDCB6',
    'ast': '\u002A',
    'midast': '\u002A',
    'atilde': '\u00E3',
    'auml': '\u00E4',
    'awint': '\u2A11',
    'bNot': '\u2AED',
    'backcong': '\u224C',
    'bcong': '\u224C',
    'backepsilon': '\u03F6',
    'bepsi': '\u03F6',
    'backprime': '\u2035',
    'bprime': '\u2035',
    'backsim': '\u223D',
    'bsim': '\u223D',
    'backsimeq': '\u22CD',
    'bsime': '\u22CD',
    'barvee': '\u22BD',
    'barwed': '\u2305',
    'barwedge': '\u2305',
    'bbrktbrk': '\u23B6',
    'bcy': '\u0431',
    'bdquo': '\u201E',
    'ldquor': '\u201E',
    'bemptyv': '\u29B0',
    'beta': '\u03B2',
    'beth': '\u2136',
    'between': '\u226C',
    'twixt': '\u226C',
    'bfr': '\uD835\uDD1F',
    'bigcirc': '\u25EF',
    'xcirc': '\u25EF',
    'bigodot': '\u2A00',
    'xodot': '\u2A00',
    'bigoplus': '\u2A01',
    'xoplus': '\u2A01',
    'bigotimes': '\u2A02',
    'xotime': '\u2A02',
    'bigsqcup': '\u2A06',
    'xsqcup': '\u2A06',
    'bigstar': '\u2605',
    'starf': '\u2605',
    'bigtriangledown': '\u25BD',
    'xdtri': '\u25BD',
    'bigtriangleup': '\u25B3',
    'xutri': '\u25B3',
    'biguplus': '\u2A04',
    'xuplus': '\u2A04',
    'bkarow': '\u290D',
    'rbarr': '\u290D',
    'blacklozenge': '\u29EB',
    'lozf': '\u29EB',
    'blacktriangle': '\u25B4',
    'utrif': '\u25B4',
    'blacktriangledown': '\u25BE',
    'dtrif': '\u25BE',
    'blacktriangleleft': '\u25C2',
    'ltrif': '\u25C2',
    'blacktriangleright': '\u25B8',
    'rtrif': '\u25B8',
    'blank': '\u2423',
    'blk12': '\u2592',
    'blk14': '\u2591',
    'blk34': '\u2593',
    'block': '\u2588',
    'bne': '\u003D\u20E5',
    'bnequiv': '\u2261\u20E5',
    'bnot': '\u2310',
    'bopf': '\uD835\uDD53',
    'bowtie': '\u22C8',
    'boxDL': '\u2557',
    'boxDR': '\u2554',
    'boxDl': '\u2556',
    'boxDr': '\u2553',
    'boxH': '\u2550',
    'boxHD': '\u2566',
    'boxHU': '\u2569',
    'boxHd': '\u2564',
    'boxHu': '\u2567',
    'boxUL': '\u255D',
    'boxUR': '\u255A',
    'boxUl': '\u255C',
    'boxUr': '\u2559',
    'boxV': '\u2551',
    'boxVH': '\u256C',
    'boxVL': '\u2563',
    'boxVR': '\u2560',
    'boxVh': '\u256B',
    'boxVl': '\u2562',
    'boxVr': '\u255F',
    'boxbox': '\u29C9',
    'boxdL': '\u2555',
    'boxdR': '\u2552',
    'boxdl': '\u2510',
    'boxdr': '\u250C',
    'boxhD': '\u2565',
    'boxhU': '\u2568',
    'boxhd': '\u252C',
    'boxhu': '\u2534',
    'boxminus': '\u229F',
    'minusb': '\u229F',
    'boxplus': '\u229E',
    'plusb': '\u229E',
    'boxtimes': '\u22A0',
    'timesb': '\u22A0',
    'boxuL': '\u255B',
    'boxuR': '\u2558',
    'boxul': '\u2518',
    'boxur': '\u2514',
    'boxv': '\u2502',
    'boxvH': '\u256A',
    'boxvL': '\u2561',
    'boxvR': '\u255E',
    'boxvh': '\u253C',
    'boxvl': '\u2524',
    'boxvr': '\u251C',
    'brvbar': '\u00A6',
    'bscr': '\uD835\uDCB7',
    'bsemi': '\u204F',
    'bsol': '\u005C',
    'bsolb': '\u29C5',
    'bsolhsub': '\u27C8',
    'bull': '\u2022',
    'bullet': '\u2022',
    'bumpE': '\u2AAE',
    'cacute': '\u0107',
    'cap': '\u2229',
    'capand': '\u2A44',
    'capbrcup': '\u2A49',
    'capcap': '\u2A4B',
    'capcup': '\u2A47',
    'capdot': '\u2A40',
    'caps': '\u2229\uFE00',
    'caret': '\u2041',
    'ccaps': '\u2A4D',
    'ccaron': '\u010D',
    'ccedil': '\u00E7',
    'ccirc': '\u0109',
    'ccups': '\u2A4C',
    'ccupssm': '\u2A50',
    'cdot': '\u010B',
    'cemptyv': '\u29B2',
    'cent': '\u00A2',
    'cfr': '\uD835\uDD20',
    'chcy': '\u0447',
    'check': '\u2713',
    'checkmark': '\u2713',
    'chi': '\u03C7',
    'cir': '\u25CB',
    'cirE': '\u29C3',
    'circ': '\u02C6',
    'circeq': '\u2257',
    'cire': '\u2257',
    'circlearrowleft': '\u21BA',
    'olarr': '\u21BA',
    'circlearrowright': '\u21BB',
    'orarr': '\u21BB',
    'circledS': '\u24C8',
    'oS': '\u24C8',
    'circledast': '\u229B',
    'oast': '\u229B',
    'circledcirc': '\u229A',
    'ocir': '\u229A',
    'circleddash': '\u229D',
    'odash': '\u229D',
    'cirfnint': '\u2A10',
    'cirmid': '\u2AEF',
    'cirscir': '\u29C2',
    'clubs': '\u2663',
    'clubsuit': '\u2663',
    'colon': '\u003A',
    'comma': '\u002C',
    'commat': '\u0040',
    'comp': '\u2201',
    'complement': '\u2201',
    'congdot': '\u2A6D',
    'copf': '\uD835\uDD54',
    'copysr': '\u2117',
    'crarr': '\u21B5',
    'cross': '\u2717',
    'cscr': '\uD835\uDCB8',
    'csub': '\u2ACF',
    'csube': '\u2AD1',
    'csup': '\u2AD0',
    'csupe': '\u2AD2',
    'ctdot': '\u22EF',
    'cudarrl': '\u2938',
    'cudarrr': '\u2935',
    'cuepr': '\u22DE',
    'curlyeqprec': '\u22DE',
    'cuesc': '\u22DF',
    'curlyeqsucc': '\u22DF',
    'cularr': '\u21B6',
    'curvearrowleft': '\u21B6',
    'cularrp': '\u293D',
    'cup': '\u222A',
    'cupbrcap': '\u2A48',
    'cupcap': '\u2A46',
    'cupcup': '\u2A4A',
    'cupdot': '\u228D',
    'cupor': '\u2A45',
    'cups': '\u222A\uFE00',
    'curarr': '\u21B7',
    'curvearrowright': '\u21B7',
    'curarrm': '\u293C',
    'curlyvee': '\u22CE',
    'cuvee': '\u22CE',
    'curlywedge': '\u22CF',
    'cuwed': '\u22CF',
    'curren': '\u00A4',
    'cwint': '\u2231',
    'cylcty': '\u232D',
    'dHar': '\u2965',
    'dagger': '\u2020',
    'daleth': '\u2138',
    'dash': '\u2010',
    'hyphen': '\u2010',
    'dbkarow': '\u290F',
    'rBarr': '\u290F',
    'dcaron': '\u010F',
    'dcy': '\u0434',
    'ddarr': '\u21CA',
    'downdownarrows': '\u21CA',
    'ddotseq': '\u2A77',
    'eDDot': '\u2A77',
    'deg': '\u00B0',
    'delta': '\u03B4',
    'demptyv': '\u29B1',
    'dfisht': '\u297F',
    'dfr': '\uD835\uDD21',
    'diamondsuit': '\u2666',
    'diams': '\u2666',
    'digamma': '\u03DD',
    'gammad': '\u03DD',
    'disin': '\u22F2',
    'div': '\u00F7',
    'divide': '\u00F7',
    'divideontimes': '\u22C7',
    'divonx': '\u22C7',
    'djcy': '\u0452',
    'dlcorn': '\u231E',
    'llcorner': '\u231E',
    'dlcrop': '\u230D',
    'dollar': '\u0024',
    'dopf': '\uD835\uDD55',
    'doteqdot': '\u2251',
    'eDot': '\u2251',
    'dotminus': '\u2238',
    'minusd': '\u2238',
    'dotplus': '\u2214',
    'plusdo': '\u2214',
    'dotsquare': '\u22A1',
    'sdotb': '\u22A1',
    'drcorn': '\u231F',
    'lrcorner': '\u231F',
    'drcrop': '\u230C',
    'dscr': '\uD835\uDCB9',
    'dscy': '\u0455',
    'dsol': '\u29F6',
    'dstrok': '\u0111',
    'dtdot': '\u22F1',
    'dtri': '\u25BF',
    'triangledown': '\u25BF',
    'dwangle': '\u29A6',
    'dzcy': '\u045F',
    'dzigrarr': '\u27FF',
    'eacute': '\u00E9',
    'easter': '\u2A6E',
    'ecaron': '\u011B',
    'ecir': '\u2256',
    'eqcirc': '\u2256',
    'ecirc': '\u00EA',
    'ecolon': '\u2255',
    'eqcolon': '\u2255',
    'ecy': '\u044D',
    'edot': '\u0117',
    'efDot': '\u2252',
    'fallingdotseq': '\u2252',
    'efr': '\uD835\uDD22',
    'eg': '\u2A9A',
    'egrave': '\u00E8',
    'egs': '\u2A96',
    'eqslantgtr': '\u2A96',
    'egsdot': '\u2A98',
    'el': '\u2A99',
    'elinters': '\u23E7',
    'ell': '\u2113',
    'els': '\u2A95',
    'eqslantless': '\u2A95',
    'elsdot': '\u2A97',
    'emacr': '\u0113',
    'empty': '\u2205',
    'emptyset': '\u2205',
    'emptyv': '\u2205',
    'varnothing': '\u2205',
    'emsp13': '\u2004',
    'emsp14': '\u2005',
    'emsp': '\u2003',
    'eng': '\u014B',
    'ensp': '\u2002',
    'eogon': '\u0119',
    'eopf': '\uD835\uDD56',
    'epar': '\u22D5',
    'eparsl': '\u29E3',
    'eplus': '\u2A71',
    'epsi': '\u03B5',
    'epsilon': '\u03B5',
    'epsiv': '\u03F5',
    'straightepsilon': '\u03F5',
    'varepsilon': '\u03F5',
    'equals': '\u003D',
    'equest': '\u225F',
    'questeq': '\u225F',
    'equivDD': '\u2A78',
    'eqvparsl': '\u29E5',
    'erDot': '\u2253',
    'risingdotseq': '\u2253',
    'erarr': '\u2971',
    'escr': '\u212F',
    'eta': '\u03B7',
    'eth': '\u00F0',
    'euml': '\u00EB',
    'euro': '\u20AC',
    'excl': '\u0021',
    'fcy': '\u0444',
    'female': '\u2640',
    'ffilig': '\uFB03',
    'fflig': '\uFB00',
    'ffllig': '\uFB04',
    'ffr': '\uD835\uDD23',
    'filig': '\uFB01',
    'fjlig': '\u0066\u006A',
    'flat': '\u266D',
    'fllig': '\uFB02',
    'fltns': '\u25B1',
    'fnof': '\u0192',
    'fopf': '\uD835\uDD57',
    'fork': '\u22D4',
    'pitchfork': '\u22D4',
    'forkv': '\u2AD9',
    'fpartint': '\u2A0D',
    'frac12': '\u00BD',
    'half': '\u00BD',
    'frac13': '\u2153',
    'frac14': '\u00BC',
    'frac15': '\u2155',
    'frac16': '\u2159',
    'frac18': '\u215B',
    'frac23': '\u2154',
    'frac25': '\u2156',
    'frac34': '\u00BE',
    'frac35': '\u2157',
    'frac38': '\u215C',
    'frac45': '\u2158',
    'frac56': '\u215A',
    'frac58': '\u215D',
    'frac78': '\u215E',
    'frasl': '\u2044',
    'frown': '\u2322',
    'sfrown': '\u2322',
    'fscr': '\uD835\uDCBB',
    'gEl': '\u2A8C',
    'gtreqqless': '\u2A8C',
    'gacute': '\u01F5',
    'gamma': '\u03B3',
    'gap': '\u2A86',
    'gtrapprox': '\u2A86',
    'gbreve': '\u011F',
    'gcirc': '\u011D',
    'gcy': '\u0433',
    'gdot': '\u0121',
    'gescc': '\u2AA9',
    'gesdot': '\u2A80',
    'gesdoto': '\u2A82',
    'gesdotol': '\u2A84',
    'gesl': '\u22DB\uFE00',
    'gesles': '\u2A94',
    'gfr': '\uD835\uDD24',
    'gimel': '\u2137',
    'gjcy': '\u0453',
    'glE': '\u2A92',
    'gla': '\u2AA5',
    'glj': '\u2AA4',
    'gnE': '\u2269',
    'gneqq': '\u2269',
    'gnap': '\u2A8A',
    'gnapprox': '\u2A8A',
    'gne': '\u2A88',
    'gneq': '\u2A88',
    'gnsim': '\u22E7',
    'gopf': '\uD835\uDD58',
    'gscr': '\u210A',
    'gsime': '\u2A8E',
    'gsiml': '\u2A90',
    'gtcc': '\u2AA7',
    'gtcir': '\u2A7A',
    'gtdot': '\u22D7',
    'gtrdot': '\u22D7',
    'gtlPar': '\u2995',
    'gtquest': '\u2A7C',
    'gtrarr': '\u2978',
    'gvertneqq': '\u2269\uFE00',
    'gvnE': '\u2269\uFE00',
    'hardcy': '\u044A',
    'harrcir': '\u2948',
    'harrw': '\u21AD',
    'leftrightsquigarrow': '\u21AD',
    'hbar': '\u210F',
    'hslash': '\u210F',
    'planck': '\u210F',
    'plankv': '\u210F',
    'hcirc': '\u0125',
    'hearts': '\u2665',
    'heartsuit': '\u2665',
    'hellip': '\u2026',
    'mldr': '\u2026',
    'hercon': '\u22B9',
    'hfr': '\uD835\uDD25',
    'hksearow': '\u2925',
    'searhk': '\u2925',
    'hkswarow': '\u2926',
    'swarhk': '\u2926',
    'hoarr': '\u21FF',
    'homtht': '\u223B',
    'hookleftarrow': '\u21A9',
    'larrhk': '\u21A9',
    'hookrightarrow': '\u21AA',
    'rarrhk': '\u21AA',
    'hopf': '\uD835\uDD59',
    'horbar': '\u2015',
    'hscr': '\uD835\uDCBD',
    'hstrok': '\u0127',
    'hybull': '\u2043',
    'iacute': '\u00ED',
    'icirc': '\u00EE',
    'icy': '\u0438',
    'iecy': '\u0435',
    'iexcl': '\u00A1',
    'ifr': '\uD835\uDD26',
    'igrave': '\u00EC',
    'iiiint': '\u2A0C',
    'qint': '\u2A0C',
    'iiint': '\u222D',
    'tint': '\u222D',
    'iinfin': '\u29DC',
    'iiota': '\u2129',
    'ijlig': '\u0133',
    'imacr': '\u012B',
    'imath': '\u0131',
    'inodot': '\u0131',
    'imof': '\u22B7',
    'imped': '\u01B5',
    'incare': '\u2105',
    'infin': '\u221E',
    'infintie': '\u29DD',
    'intcal': '\u22BA',
    'intercal': '\u22BA',
    'intlarhk': '\u2A17',
    'intprod': '\u2A3C',
    'iprod': '\u2A3C',
    'iocy': '\u0451',
    'iogon': '\u012F',
    'iopf': '\uD835\uDD5A',
    'iota': '\u03B9',
    'iquest': '\u00BF',
    'iscr': '\uD835\uDCBE',
    'isinE': '\u22F9',
    'isindot': '\u22F5',
    'isins': '\u22F4',
    'isinsv': '\u22F3',
    'itilde': '\u0129',
    'iukcy': '\u0456',
    'iuml': '\u00EF',
    'jcirc': '\u0135',
    'jcy': '\u0439',
    'jfr': '\uD835\uDD27',
    'jmath': '\u0237',
    'jopf': '\uD835\uDD5B',
    'jscr': '\uD835\uDCBF',
    'jsercy': '\u0458',
    'jukcy': '\u0454',
    'kappa': '\u03BA',
    'kappav': '\u03F0',
    'varkappa': '\u03F0',
    'kcedil': '\u0137',
    'kcy': '\u043A',
    'kfr': '\uD835\uDD28',
    'kgreen': '\u0138',
    'khcy': '\u0445',
    'kjcy': '\u045C',
    'kopf': '\uD835\uDD5C',
    'kscr': '\uD835\uDCC0',
    'lAtail': '\u291B',
    'lBarr': '\u290E',
    'lEg': '\u2A8B',
    'lesseqqgtr': '\u2A8B',
    'lHar': '\u2962',
    'lacute': '\u013A',
    'laemptyv': '\u29B4',
    'lambda': '\u03BB',
    'langd': '\u2991',
    'lap': '\u2A85',
    'lessapprox': '\u2A85',
    'laquo': '\u00AB',
    'larrbfs': '\u291F',
    'larrfs': '\u291D',
    'larrlp': '\u21AB',
    'looparrowleft': '\u21AB',
    'larrpl': '\u2939',
    'larrsim': '\u2973',
    'larrtl': '\u21A2',
    'leftarrowtail': '\u21A2',
    'lat': '\u2AAB',
    'latail': '\u2919',
    'late': '\u2AAD',
    'lates': '\u2AAD\uFE00',
    'lbarr': '\u290C',
    'lbbrk': '\u2772',
    'lbrace': '\u007B',
    'lcub': '\u007B',
    'lbrack': '\u005B',
    'lsqb': '\u005B',
    'lbrke': '\u298B',
    'lbrksld': '\u298F',
    'lbrkslu': '\u298D',
    'lcaron': '\u013E',
    'lcedil': '\u013C',
    'lcy': '\u043B',
    'ldca': '\u2936',
    'ldrdhar': '\u2967',
    'ldrushar': '\u294B',
    'ldsh': '\u21B2',
    'le': '\u2264',
    'leq': '\u2264',
    'leftleftarrows': '\u21C7',
    'llarr': '\u21C7',
    'leftthreetimes': '\u22CB',
    'lthree': '\u22CB',
    'lescc': '\u2AA8',
    'lesdot': '\u2A7F',
    'lesdoto': '\u2A81',
    'lesdotor': '\u2A83',
    'lesg': '\u22DA\uFE00',
    'lesges': '\u2A93',
    'lessdot': '\u22D6',
    'ltdot': '\u22D6',
    'lfisht': '\u297C',
    'lfr': '\uD835\uDD29',
    'lgE': '\u2A91',
    'lharul': '\u296A',
    'lhblk': '\u2584',
    'ljcy': '\u0459',
    'llhard': '\u296B',
    'lltri': '\u25FA',
    'lmidot': '\u0140',
    'lmoust': '\u23B0',
    'lmoustache': '\u23B0',
    'lnE': '\u2268',
    'lneqq': '\u2268',
    'lnap': '\u2A89',
    'lnapprox': '\u2A89',
    'lne': '\u2A87',
    'lneq': '\u2A87',
    'lnsim': '\u22E6',
    'loang': '\u27EC',
    'loarr': '\u21FD',
    'longmapsto': '\u27FC',
    'xmap': '\u27FC',
    'looparrowright': '\u21AC',
    'rarrlp': '\u21AC',
    'lopar': '\u2985',
    'lopf': '\uD835\uDD5D',
    'loplus': '\u2A2D',
    'lotimes': '\u2A34',
    'lowast': '\u2217',
    'loz': '\u25CA',
    'lozenge': '\u25CA',
    'lpar': '\u0028',
    'lparlt': '\u2993',
    'lrhard': '\u296D',
    'lrm': '\u200E',
    'lrtri': '\u22BF',
    'lsaquo': '\u2039',
    'lscr': '\uD835\uDCC1',
    'lsime': '\u2A8D',
    'lsimg': '\u2A8F',
    'lsquor': '\u201A',
    'sbquo': '\u201A',
    'lstrok': '\u0142',
    'ltcc': '\u2AA6',
    'ltcir': '\u2A79',
    'ltimes': '\u22C9',
    'ltlarr': '\u2976',
    'ltquest': '\u2A7B',
    'ltrPar': '\u2996',
    'ltri': '\u25C3',
    'triangleleft': '\u25C3',
    'lurdshar': '\u294A',
    'luruhar': '\u2966',
    'lvertneqq': '\u2268\uFE00',
    'lvnE': '\u2268\uFE00',
    'mDDot': '\u223A',
    'macr': '\u00AF',
    'strns': '\u00AF',
    'male': '\u2642',
    'malt': '\u2720',
    'maltese': '\u2720',
    'marker': '\u25AE',
    'mcomma': '\u2A29',
    'mcy': '\u043C',
    'mdash': '\u2014',
    'mfr': '\uD835\uDD2A',
    'mho': '\u2127',
    'micro': '\u00B5',
    'midcir': '\u2AF0',
    'minus': '\u2212',
    'minusdu': '\u2A2A',
    'mlcp': '\u2ADB',
    'models': '\u22A7',
    'mopf': '\uD835\uDD5E',
    'mscr': '\uD835\uDCC2',
    'mu': '\u03BC',
    'multimap': '\u22B8',
    'mumap': '\u22B8',
    'nGg': '\u22D9\u0338',
    'nGt': '\u226B\u20D2',
    'nLeftarrow': '\u21CD',
    'nlArr': '\u21CD',
    'nLeftrightarrow': '\u21CE',
    'nhArr': '\u21CE',
    'nLl': '\u22D8\u0338',
    'nLt': '\u226A\u20D2',
    'nRightarrow': '\u21CF',
    'nrArr': '\u21CF',
    'nVDash': '\u22AF',
    'nVdash': '\u22AE',
    'nacute': '\u0144',
    'nang': '\u2220\u20D2',
    'napE': '\u2A70\u0338',
    'napid': '\u224B\u0338',
    'napos': '\u0149',
    'natur': '\u266E',
    'natural': '\u266E',
    'ncap': '\u2A43',
    'ncaron': '\u0148',
    'ncedil': '\u0146',
    'ncongdot': '\u2A6D\u0338',
    'ncup': '\u2A42',
    'ncy': '\u043D',
       'ndash': '\u2013',
    'neArr': '\u21D7',
    'nearhk': '\u2924',
    'nedot': '\u2250\u0338',
    'nesear': '\u2928',
    'toea': '\u2928',
    'nfr': '\uD835\uDD2B',
    'nharr': '\u21AE',
    'nleftrightarrow': '\u21AE',
    'nhpar': '\u2AF2',
    'nis': '\u22FC',
    'nisd': '\u22FA',
    'njcy': '\u045A',
    'nlE': '\u2266\u0338',
    'nleqq': '\u2266\u0338',
    'nlarr': '\u219A',
    'nleftarrow': '\u219A',
    'nldr': '\u2025',
    'nopf': '\uD835\uDD5F',
    'not': '\u00AC',
    'notinE': '\u22F9\u0338',
    'notindot': '\u22F5\u0338',
    'notinvb': '\u22F7',
    'notinvc': '\u22F6',
    'notnivb': '\u22FE',
    'notnivc': '\u22FD',
    'nparsl': '\u2AFD\u20E5',
    'npart': '\u2202\u0338',
    'npolint': '\u2A14',
    'nrarr': '\u219B',
    'nrightarrow': '\u219B',
    'nrarrc': '\u2933\u0338',
    'nrarrw': '\u219D\u0338',
    'nscr': '\uD835\uDCC3',
    'nsub': '\u2284',
    'nsubE': '\u2AC5\u0338',
    'nsubseteqq': '\u2AC5\u0338',
    'nsup': '\u2285',
    'nsupE': '\u2AC6\u0338',
    'nsupseteqq': '\u2AC6\u0338',
    'ntilde': '\u00F1',
    'nu': '\u03BD',
    'num': '\u0023',
    'numero': '\u2116',
    'numsp': '\u2007',
    'nvDash': '\u22AD',
    'nvHarr': '\u2904',
    'nvap': '\u224D\u20D2',
    'nvdash': '\u22AC',
    'nvge': '\u2265\u20D2',
    'nvgt': '\u003E\u20D2',
    'nvinfin': '\u29DE',
    'nvlArr': '\u2902',
    'nvle': '\u2264\u20D2',
    'nvlt': '\u003C\u20D2',
    'nvltrie': '\u22B4\u20D2',
    'nvrArr': '\u2903',
    'nvrtrie': '\u22B5\u20D2',
    'nvsim': '\u223C\u20D2',
    'nwArr': '\u21D6',
    'nwarhk': '\u2923',
    'nwnear': '\u2927',
    'oacute': '\u00F3',
    'ocirc': '\u00F4',
    'ocy': '\u043E',
    'odblac': '\u0151',
    'odiv': '\u2A38',
    'odsold': '\u29BC',
    'oelig': '\u0153',
    'ofcir': '\u29BF',
    'ofr': '\uD835\uDD2C',
    'ogon': '\u02DB',
    'ograve': '\u00F2',
    'ogt': '\u29C1',
    'ohbar': '\u29B5',
    'olcir': '\u29BE',
    'olcross': '\u29BB',
    'olt': '\u29C0',
    'omacr': '\u014D',
    'omega': '\u03C9',
    'omicron': '\u03BF',
    'omid': '\u29B6',
    'oopf': '\uD835\uDD60',
    'opar': '\u29B7',
    'operp': '\u29B9',
    'or': '\u2228',
    'vee': '\u2228',
    'ord': '\u2A5D',
    'order': '\u2134',
    'orderof': '\u2134',
    'oscr': '\u2134',
    'ordf': '\u00AA',
    'ordm': '\u00BA',
    'origof': '\u22B6',
    'oror': '\u2A56',
    'orslope': '\u2A57',
    'orv': '\u2A5B',
    'oslash': '\u00F8',
    'osol': '\u2298',
    'otilde': '\u00F5',
    'otimesas': '\u2A36',
    'ouml': '\u00F6',
    'ovbar': '\u233D',
    'para': '\u00B6',
    'parsim': '\u2AF3',
    'parsl': '\u2AFD',
    'pcy': '\u043F',
    'percnt': '\u0025',
    'period': '\u002E',
    'permil': '\u2030',
    'pertenk': '\u2031',
    'pfr': '\uD835\uDD2D',
    'phi': '\u03C6',
    'phiv': '\u03D5',
    'straightphi': '\u03D5',
    'varphi': '\u03D5',
    'phone': '\u260E',
    'pi': '\u03C0',
    'piv': '\u03D6',
    'varpi': '\u03D6',
    'planckh': '\u210E',
    'plus': '\u002B',
    'plusacir': '\u2A23',
    'pluscir': '\u2A22',
    'plusdu': '\u2A25',
    'pluse': '\u2A72',
    'plussim': '\u2A26',
    'plustwo': '\u2A27',
    'pointint': '\u2A15',
    'popf': '\uD835\uDD61',
    'pound': '\u00A3',
    'prE': '\u2AB3',
    'prap': '\u2AB7',
    'precapprox': '\u2AB7',
    'precnapprox': '\u2AB9',
    'prnap': '\u2AB9',
    'precneqq': '\u2AB5',
    'prnE': '\u2AB5',
    'precnsim': '\u22E8',
    'prnsim': '\u22E8',
    'prime': '\u2032',
    'profalar': '\u232E',
    'profline': '\u2312',
    'profsurf': '\u2313',
    'prurel': '\u22B0',
    'pscr': '\uD835\uDCC5',
    'psi': '\u03C8',
    'puncsp': '\u2008',
    'qfr': '\uD835\uDD2E',
    'qopf': '\uD835\uDD62',
    'qprime': '\u2057',
    'qscr': '\uD835\uDCC6',
    'quatint': '\u2A16',
    'quest': '\u003F',
    'rAtail': '\u291C',
    'rHar': '\u2964',
    'race': '\u223D\u0331',
    'racute': '\u0155',
    'raemptyv': '\u29B3',
    'rangd': '\u2992',
    'range': '\u29A5',
    'raquo': '\u00BB',
    'rarrap': '\u2975',
    'rarrbfs': '\u2920',
    'rarrc': '\u2933',
    'rarrfs': '\u291E',
    'rarrpl': '\u2945',
    'rarrsim': '\u2974',
    'rarrtl': '\u21A3',
    'rightarrowtail': '\u21A3',
    'rarrw': '\u219D',
    'rightsquigarrow': '\u219D',
    'ratail': '\u291A',
    'ratio': '\u2236',
    'rbbrk': '\u2773',
    'rbrace': '\u007D',
    'rcub': '\u007D',
    'rbrack': '\u005D',
    'rsqb': '\u005D',
    'rbrke': '\u298C',
    'rbrksld': '\u298E',
    'rbrkslu': '\u2990',
    'rcaron': '\u0159',
    'rcedil': '\u0157',
    'rcy': '\u0440',
    'rdca': '\u2937',
    'rdldhar': '\u2969',
    'rdsh': '\u21B3',
    'rect': '\u25AD',
    'rfisht': '\u297D',
    'rfr': '\uD835\uDD2F',
    'rharul': '\u296C',
    'rho': '\u03C1',
    'rhov': '\u03F1',
    'varrho': '\u03F1',
    'rightrightarrows': '\u21C9',
    'rrarr': '\u21C9',
    'rightthreetimes': '\u22CC',
    'rthree': '\u22CC',
    'ring': '\u02DA',
    'rlm': '\u200F',
    'rmoust': '\u23B1',
    'rmoustache': '\u23B1',
    'rnmid': '\u2AEE',
    'roang': '\u27ED',
    'roarr': '\u21FE',
    'ropar': '\u2986',
    'ropf': '\uD835\uDD63',
    'roplus': '\u2A2E',
    'rotimes': '\u2A35',
    'rpar': '\u0029',
    'rpargt': '\u2994',
    'rppolint': '\u2A12',
    'rsaquo': '\u203A',
    'rscr': '\uD835\uDCC7',
    'rtimes': '\u22CA',
    'rtri': '\u25B9',
    'triangleright': '\u25B9',
    'rtriltri': '\u29CE',
    'ruluhar': '\u2968',
    'rx': '\u211E',
    'sacute': '\u015B',
    'scE': '\u2AB4',
    'scap': '\u2AB8',
    'succapprox': '\u2AB8',
    'scaron': '\u0161',
    'scedil': '\u015F',
    'scirc': '\u015D',
    'scnE': '\u2AB6',
    'succneqq': '\u2AB6',
    'scnap': '\u2ABA',
    'succnapprox': '\u2ABA',
    'scnsim': '\u22E9',
    'succnsim': '\u22E9',
    'scpolint': '\u2A13',
    'scy': '\u0441',
    'sdot': '\u22C5',
    'sdote': '\u2A66',
    'seArr': '\u21D8',
    'sect': '\u00A7',
    'semi': '\u003B',
    'seswar': '\u2929',
    'tosa': '\u2929',
    'sext': '\u2736',
    'sfr': '\uD835\uDD30',
    'sharp': '\u266F',
    'shchcy': '\u0449',
    'shcy': '\u0448',
    'shy': '\u00AD',
    'sigma': '\u03C3',
    'sigmaf': '\u03C2',
    'sigmav': '\u03C2',
    'varsigma': '\u03C2',
    'simdot': '\u2A6A',
    'simg': '\u2A9E',
    'simgE': '\u2AA0',
    'siml': '\u2A9D',
    'simlE': '\u2A9F',
    'simne': '\u2246',
    'simplus': '\u2A24',
    'simrarr': '\u2972',
    'smashp': '\u2A33',
    'smeparsl': '\u29E4',
    'smile': '\u2323',
    'ssmile': '\u2323',
    'smt': '\u2AAA',
    'smte': '\u2AAC',
    'smtes': '\u2AAC\uFE00',
    'softcy': '\u044C',
    'sol': '\u002F',
    'solb': '\u29C4',
    'solbar': '\u233F',
    'sopf': '\uD835\uDD64',
    'spades': '\u2660',
    'spadesuit': '\u2660',
    'sqcaps': '\u2293\uFE00',
    'sqcups': '\u2294\uFE00',
    'sscr': '\uD835\uDCC8',
    'star': '\u2606',
    'sub': '\u2282',
    'subset': '\u2282',
    'subE': '\u2AC5',
    'subseteqq': '\u2AC5',
    'subdot': '\u2ABD',
    'subedot': '\u2AC3',
    'submult': '\u2AC1',
    'subnE': '\u2ACB',
    'subsetneqq': '\u2ACB',
    'subne': '\u228A',
    'subsetneq': '\u228A',
    'subplus': '\u2ABF',
    'subrarr': '\u2979',
    'subsim': '\u2AC7',
    'subsub': '\u2AD5',
    'subsup': '\u2AD3',
    'sung': '\u266A',
    'sup1': '\u00B9',
    'sup2': '\u00B2',
    'sup3': '\u00B3',
    'supE': '\u2AC6',
    'supseteqq': '\u2AC6',
    'supdot': '\u2ABE',
    'supdsub': '\u2AD8',
    'supedot': '\u2AC4',
    'suphsol': '\u27C9',
    'suphsub': '\u2AD7',
    'suplarr': '\u297B',
    'supmult': '\u2AC2',
    'supnE': '\u2ACC',
    'supsetneqq': '\u2ACC',
    'supne': '\u228B',
    'supsetneq': '\u228B',
    'supplus': '\u2AC0',
    'supsim': '\u2AC8',
    'supsub': '\u2AD4',
    'supsup': '\u2AD6',
    'swArr': '\u21D9',
    'swnwar': '\u292A',
    'szlig': '\u00DF',
    'target': '\u2316',
    'tau': '\u03C4',
    'tcaron': '\u0165',
    'tcedil': '\u0163',
    'tcy': '\u0442',
    'telrec': '\u2315',
    'tfr': '\uD835\uDD31',
    'theta': '\u03B8',
    'thetasym': '\u03D1',
    'thetav': '\u03D1',
    'vartheta': '\u03D1',
    'thorn': '\u00FE',
    'times': '\u00D7',
    'timesbar': '\u2A31',
    'timesd': '\u2A30',
    'topbot': '\u2336',
    'topcir': '\u2AF1',
    'topf': '\uD835\uDD65',
    'topfork': '\u2ADA',
    'tprime': '\u2034',
    'triangle': '\u25B5',
    'utri': '\u25B5',
    'triangleq': '\u225C',
    'trie': '\u225C',
    'tridot': '\u25EC',
    'triminus': '\u2A3A',
    'triplus': '\u2A39',
    'trisb': '\u29CD',
    'tritime': '\u2A3B',
    'trpezium': '\u23E2',
    'tscr': '\uD835\uDCC9',
    'tscy': '\u0446',
    'tshcy': '\u045B',
    'tstrok': '\u0167',
    'uHar': '\u2963',
    'uacute': '\u00FA',
    'ubrcy': '\u045E',
    'ubreve': '\u016D',
    'ucirc': '\u00FB',
    'ucy': '\u0443',
    'udblac': '\u0171',
    'ufisht': '\u297E',
    'ufr': '\uD835\uDD32',
    'ugrave': '\u00F9',
    'uhblk': '\u2580',
    'ulcorn': '\u231C',
    'ulcorner': '\u231C',
    'ulcrop': '\u230F',
    'ultri': '\u25F8',
    'umacr': '\u016B',
    'uogon': '\u0173',
    'uopf': '\uD835\uDD66',
    'upsi': '\u03C5',
    'upsilon': '\u03C5',
    'upuparrows': '\u21C8',
    'uuarr': '\u21C8',
    'urcorn': '\u231D',
    'urcorner': '\u231D',
    'urcrop': '\u230E',
    'uring': '\u016F',
    'urtri': '\u25F9',
    'uscr': '\uD835\uDCCA',
    'utdot': '\u22F0',
    'utilde': '\u0169',
    'uuml': '\u00FC',
    'uwangle': '\u29A7',
    'vBar': '\u2AE8',
    'vBarv': '\u2AE9',
    'vangrt': '\u299C',
    'varsubsetneq': '\u228A\uFE00',
    'vsubne': '\u228A\uFE00',
    'varsubsetneqq': '\u2ACB\uFE00',
    'vsubnE': '\u2ACB\uFE00',
    'varsupsetneq': '\u228B\uFE00',
    'vsupne': '\u228B\uFE00',
    'varsupsetneqq': '\u2ACC\uFE00',
    'vsupnE': '\u2ACC\uFE00',
    'vcy': '\u0432',
    'veebar': '\u22BB',
    'veeeq': '\u225A',
    'vellip': '\u22EE',
    'vfr': '\uD835\uDD33',
    'vopf': '\uD835\uDD67',
    'vscr': '\uD835\uDCCB',
    'vzigzag': '\u299A',
    'wcirc': '\u0175',
    'wedbar': '\u2A5F',
    'wedgeq': '\u2259',
    'weierp': '\u2118',
    'wp': '\u2118',
    'wfr': '\uD835\uDD34',
    'wopf': '\uD835\uDD68',
    'wscr': '\uD835\uDCCC',
    'xfr': '\uD835\uDD35',
    'xi': '\u03BE',
    'xnis': '\u22FB',
    'xopf': '\uD835\uDD69',
    'xscr': '\uD835\uDCCD',
    'yacute': '\u00FD',
    'yacy': '\u044F',
    'ycirc': '\u0177',
    'ycy': '\u044B',
    'yen': '\u00A5',
    'yfr': '\uD835\uDD36',
    'yicy': '\u0457',
    'yopf': '\uD835\uDD6A',
    'yscr': '\uD835\uDCCE',
    'yucy': '\u044E',
    'yuml': '\u00FF',
    'zacute': '\u017A',
    'zcaron': '\u017E',
    'zcy': '\u0437',
    'zdot': '\u017C',
    'zeta': '\u03B6',
    'zfr': '\uD835\uDD37',
    'zhcy': '\u0436',
    'zigrarr': '\u21DD',
    'zopf': '\uD835\uDD6B',
    'zscr': '\uD835\uDCCF',
    'zwj': '\u200D',
    'zwnj': '\u200C',
};
// The &ngsp; pseudo-entity is denoting a space.
// 0xE500 is a PUA (Private Use Areas) unicode character
// This is inspired by the Angular Dart implementation.
const NGSP_UNICODE = '\uE500';
NAMED_ENTITIES['ngsp'] = NGSP_UNICODE;

class TokenError extends ParseError {
    tokenType;
    constructor(errorMsg, tokenType, span) {
        super(span, errorMsg);
        this.tokenType = tokenType;
    }
}
class TokenizeResult {
    tokens;
    errors;
    nonNormalizedIcuExpressions;
    constructor(tokens, errors, nonNormalizedIcuExpressions) {
        this.tokens = tokens;
        this.errors = errors;
        this.nonNormalizedIcuExpressions = nonNormalizedIcuExpressions;
    }
}
function tokenize(source, url, getTagDefinition, options = {}) {
    const tokenizer = new _Tokenizer(new ParseSourceFile(source, url), getTagDefinition, options);
    tokenizer.tokenize();
    return new TokenizeResult(mergeTextTokens(tokenizer.tokens), tokenizer.errors, tokenizer.nonNormalizedIcuExpressions);
}
const _CR_OR_CRLF_REGEXP = /\r\n?/g;
function _unexpectedCharacterErrorMsg(charCode) {
    const char = charCode === $EOF ? 'EOF' : String.fromCharCode(charCode);
    return `Unexpected character "${char}"`;
}
function _unknownEntityErrorMsg(entitySrc) {
    return `Unknown entity "${entitySrc}" - use the "&#<decimal>;" or  "&#x<hex>;" syntax`;
}
function _unparsableEntityErrorMsg(type, entityStr) {
    return `Unable to parse entity "${entityStr}" - ${type} character reference entities must end with ";"`;
}
var CharacterReferenceType;
(function (CharacterReferenceType) {
    CharacterReferenceType["HEX"] = "hexadecimal";
    CharacterReferenceType["DEC"] = "decimal";
})(CharacterReferenceType || (CharacterReferenceType = {}));
class _ControlFlowError {
    error;
    constructor(error) {
        this.error = error;
    }
}
// See https://www.w3.org/TR/html51/syntax.html#writing-html-documents
class _Tokenizer {
    _getTagDefinition;
    _cursor;
    _tokenizeIcu;
    _interpolationConfig;
    _leadingTriviaCodePoints;
    _currentTokenStart = null;
    _currentTokenType = null;
    _expansionCaseStack = [];
    _inInterpolation = false;
    _preserveLineEndings;
    _i18nNormalizeLineEndingsInICUs;
    _tokenizeBlocks;
    _tokenizeLet;
    tokens = [];
    errors = [];
    nonNormalizedIcuExpressions = [];
    /**
     * @param _file The html source file being tokenized.
     * @param _getTagDefinition A function that will retrieve a tag definition for a given tag name.
     * @param options Configuration of the tokenization.
     */
    constructor(_file, _getTagDefinition, options) {
        this._getTagDefinition = _getTagDefinition;
        this._tokenizeIcu = options.tokenizeExpansionForms || false;
        this._interpolationConfig = options.interpolationConfig || DEFAULT_INTERPOLATION_CONFIG;
        this._leadingTriviaCodePoints =
            options.leadingTriviaChars && options.leadingTriviaChars.map((c) => c.codePointAt(0) || 0);
        const range = options.range || {
            endPos: _file.content.length,
            startPos: 0,
            startLine: 0,
            startCol: 0,
        };
        this._cursor = options.escapedString
            ? new EscapedCharacterCursor(_file, range)
            : new PlainCharacterCursor(_file, range);
        this._preserveLineEndings = options.preserveLineEndings || false;
        this._i18nNormalizeLineEndingsInICUs = options.i18nNormalizeLineEndingsInICUs || false;
        this._tokenizeBlocks = options.tokenizeBlocks ?? true;
        this._tokenizeLet = options.tokenizeLet ?? true;
        try {
            this._cursor.init();
        }
        catch (e) {
            this.handleError(e);
        }
    }
    _processCarriageReturns(content) {
        if (this._preserveLineEndings) {
            return content;
        }
        // https://www.w3.org/TR/html51/syntax.html#preprocessing-the-input-stream
        // In order to keep the original position in the source, we can not
        // pre-process it.
        // Instead CRs are processed right before instantiating the tokens.
        return content.replace(_CR_OR_CRLF_REGEXP, '\n');
    }
    tokenize() {
        while (this._cursor.peek() !== $EOF) {
            const start = this._cursor.clone();
            try {
                if (this._attemptCharCode($LT)) {
                    if (this._attemptCharCode($BANG)) {
                        if (this._attemptCharCode($LBRACKET)) {
                            this._consumeCdata(start);
                        }
                        else if (this._attemptCharCode($MINUS)) {
                            this._consumeComment(start);
                        }
                        else {
                            this._consumeDocType(start);
                        }
                    }
                    else if (this._attemptCharCode($SLASH)) {
                        this._consumeTagClose(start);
                    }
                    else {
                        this._consumeTagOpen(start);
                    }
                }
                else if (this._tokenizeLet &&
                    // Use `peek` instead of `attempCharCode` since we
                    // don't want to advance in case it's not `@let`.
                    this._cursor.peek() === $AT &&
                    !this._inInterpolation &&
                    this._attemptStr('@let')) {
                    this._consumeLetDeclaration(start);
                }
                else if (this._tokenizeBlocks && this._attemptCharCode($AT)) {
                    this._consumeBlockStart(start);
                }
                else if (this._tokenizeBlocks &&
                    !this._inInterpolation &&
                    !this._isInExpansionCase() &&
                    !this._isInExpansionForm() &&
                    this._attemptCharCode($RBRACE)) {
                    this._consumeBlockEnd(start);
                }
                else if (!(this._tokenizeIcu && this._tokenizeExpansionForm())) {
                    // In (possibly interpolated) text the end of the text is given by `isTextEnd()`, while
                    // the premature end of an interpolation is given by the start of a new HTML element.
                    this._consumeWithInterpolation(5 /* TokenType.TEXT */, 8 /* TokenType.INTERPOLATION */, () => this._isTextEnd(), () => this._isTagStart());
                }
            }
            catch (e) {
                this.handleError(e);
            }
        }
        this._beginToken(33 /* TokenType.EOF */);
        this._endToken([]);
    }
    _getBlockName() {
        // This allows us to capture up something like `@else if`, but not `@ if`.
        let spacesInNameAllowed = false;
        const nameCursor = this._cursor.clone();
        this._attemptCharCodeUntilFn((code) => {
            if (isWhitespace(code)) {
                return !spacesInNameAllowed;
            }
            if (isBlockNameChar(code)) {
                spacesInNameAllowed = true;
                return false;
            }
            return true;
        });
        return this._cursor.getChars(nameCursor).trim();
    }
    _consumeBlockStart(start) {
        this._beginToken(24 /* TokenType.BLOCK_OPEN_START */, start);
        const startToken = this._endToken([this._getBlockName()]);
        if (this._cursor.peek() === $LPAREN) {
            // Advance past the opening paren.
            this._cursor.advance();
            // Capture the parameters.
            this._consumeBlockParameters();
            // Allow spaces before the closing paren.
            this._attemptCharCodeUntilFn(isNotWhitespace);
            if (this._attemptCharCode($RPAREN)) {
                // Allow spaces after the paren.
                this._attemptCharCodeUntilFn(isNotWhitespace);
            }
            else {
                startToken.type = 28 /* TokenType.INCOMPLETE_BLOCK_OPEN */;
                return;
            }
        }
        if (this._attemptCharCode($LBRACE)) {
            this._beginToken(25 /* TokenType.BLOCK_OPEN_END */);
            this._endToken([]);
        }
        else {
            startToken.type = 28 /* TokenType.INCOMPLETE_BLOCK_OPEN */;
        }
    }
    _consumeBlockEnd(start) {
        this._beginToken(26 /* TokenType.BLOCK_CLOSE */, start);
        this._endToken([]);
    }
    _consumeBlockParameters() {
        // Trim the whitespace until the first parameter.
        this._attemptCharCodeUntilFn(isBlockParameterChar);
        while (this._cursor.peek() !== $RPAREN && this._cursor.peek() !== $EOF) {
            this._beginToken(27 /* TokenType.BLOCK_PARAMETER */);
            const start = this._cursor.clone();
            let inQuote = null;
            let openParens = 0;
            // Consume the parameter until the next semicolon or brace.
            // Note that we skip over semicolons/braces inside of strings.
            while ((this._cursor.peek() !== $SEMICOLON && this._cursor.peek() !== $EOF) ||
                inQuote !== null) {
                const char = this._cursor.peek();
                // Skip to the next character if it was escaped.
                if (char === $BACKSLASH) {
                    this._cursor.advance();
                }
                else if (char === inQuote) {
                    inQuote = null;
                }
                else if (inQuote === null && isQuote(char)) {
                    inQuote = char;
                }
                else if (char === $LPAREN && inQuote === null) {
                    openParens++;
                }
                else if (char === $RPAREN && inQuote === null) {
                    if (openParens === 0) {
                        break;
                    }
                    else if (openParens > 0) {
                        openParens--;
                    }
                }
                this._cursor.advance();
            }
            this._endToken([this._cursor.getChars(start)]);
            // Skip to the next parameter.
            this._attemptCharCodeUntilFn(isBlockParameterChar);
        }
    }
    _consumeLetDeclaration(start) {
        this._beginToken(29 /* TokenType.LET_START */, start);
        // Require at least one white space after the `@let`.
        if (isWhitespace(this._cursor.peek())) {
            this._attemptCharCodeUntilFn(isNotWhitespace);
        }
        else {
            const token = this._endToken([this._cursor.getChars(start)]);
            token.type = 32 /* TokenType.INCOMPLETE_LET */;
            return;
        }
        const startToken = this._endToken([this._getLetDeclarationName()]);
        // Skip over white space before the equals character.
        this._attemptCharCodeUntilFn(isNotWhitespace);
        // Expect an equals sign.
        if (!this._attemptCharCode($EQ)) {
            startToken.type = 32 /* TokenType.INCOMPLETE_LET */;
            return;
        }
        // Skip spaces after the equals.
        this._attemptCharCodeUntilFn((code) => isNotWhitespace(code) && !isNewLine(code));
        this._consumeLetDeclarationValue();
        // Terminate the `@let` with a semicolon.
        const endChar = this._cursor.peek();
        if (endChar === $SEMICOLON) {
            this._beginToken(31 /* TokenType.LET_END */);
            this._endToken([]);
            this._cursor.advance();
        }
        else {
            startToken.type = 32 /* TokenType.INCOMPLETE_LET */;
            startToken.sourceSpan = this._cursor.getSpan(start);
        }
    }
    _getLetDeclarationName() {
        const nameCursor = this._cursor.clone();
        let allowDigit = false;
        this._attemptCharCodeUntilFn((code) => {
            if (isAsciiLetter(code) ||
                code === $$ ||
                code === $_ ||
                // `@let` names can't start with a digit, but digits are valid anywhere else in the name.
                (allowDigit && isDigit(code))) {
                allowDigit = true;
                return false;
            }
            return true;
        });
        return this._cursor.getChars(nameCursor).trim();
    }
    _consumeLetDeclarationValue() {
        const start = this._cursor.clone();
        this._beginToken(30 /* TokenType.LET_VALUE */, start);
        while (this._cursor.peek() !== $EOF) {
            const char = this._cursor.peek();
            // `@let` declarations terminate with a semicolon.
            if (char === $SEMICOLON) {
                break;
            }
            // If we hit a quote, skip over its content since we don't care what's inside.
            if (isQuote(char)) {
                this._cursor.advance();
                this._attemptCharCodeUntilFn((inner) => {
                    if (inner === $BACKSLASH) {
                        this._cursor.advance();
                        return false;
                    }
                    return inner === char;
                });
            }
            this._cursor.advance();
        }
        this._endToken([this._cursor.getChars(start)]);
    }
    /**
     * @returns whether an ICU token has been created
     * @internal
     */
    _tokenizeExpansionForm() {
        if (this.isExpansionFormStart()) {
            this._consumeExpansionFormStart();
            return true;
        }
        if (isExpansionCaseStart(this._cursor.peek()) && this._isInExpansionForm()) {
            this._consumeExpansionCaseStart();
            return true;
        }
        if (this._cursor.peek() === $RBRACE) {
            if (this._isInExpansionCase()) {
                this._consumeExpansionCaseEnd();
                return true;
            }
            if (this._isInExpansionForm()) {
                this._consumeExpansionFormEnd();
                return true;
            }
        }
        return false;
    }
    _beginToken(type, start = this._cursor.clone()) {
        this._currentTokenStart = start;
        this._currentTokenType = type;
    }
    _endToken(parts, end) {
        if (this._currentTokenStart === null) {
            throw new TokenError('Programming error - attempted to end a token when there was no start to the token', this._currentTokenType, this._cursor.getSpan(end));
        }
        if (this._currentTokenType === null) {
            throw new TokenError('Programming error - attempted to end a token which has no token type', null, this._cursor.getSpan(this._currentTokenStart));
        }
        const token = {
            type: this._currentTokenType,
            parts,
            sourceSpan: (end ?? this._cursor).getSpan(this._currentTokenStart, this._leadingTriviaCodePoints),
        };
        this.tokens.push(token);
        this._currentTokenStart = null;
        this._currentTokenType = null;
        return token;
    }
    _createError(msg, span) {
        if (this._isInExpansionForm()) {
            msg += ` (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.)`;
        }
        const error = new TokenError(msg, this._currentTokenType, span);
        this._currentTokenStart = null;
        this._currentTokenType = null;
        return new _ControlFlowError(error);
    }
    handleError(e) {
        if (e instanceof CursorError) {
            e = this._createError(e.msg, this._cursor.getSpan(e.cursor));
        }
        if (e instanceof _ControlFlowError) {
            this.errors.push(e.error);
        }
        else {
            throw e;
        }
    }
    _attemptCharCode(charCode) {
        if (this._cursor.peek() === charCode) {
            this._cursor.advance();
            return true;
        }
        return false;
    }
    _attemptCharCodeCaseInsensitive(charCode) {
        if (compareCharCodeCaseInsensitive(this._cursor.peek(), charCode)) {
            this._cursor.advance();
            return true;
        }
        return false;
    }
    _requireCharCode(charCode) {
        const location = this._cursor.clone();
        if (!this._attemptCharCode(charCode)) {
            throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(location));
        }
    }
    _attemptStr(chars) {
        const len = chars.length;
        if (this._cursor.charsLeft() < len) {
            return false;
        }
        const initialPosition = this._cursor.clone();
        for (let i = 0; i < len; i++) {
            if (!this._attemptCharCode(chars.charCodeAt(i))) {
                // If attempting to parse the string fails, we want to reset the parser
                // to where it was before the attempt
                this._cursor = initialPosition;
                return false;
            }
        }
        return true;
    }
    _attemptStrCaseInsensitive(chars) {
        for (let i = 0; i < chars.length; i++) {
            if (!this._attemptCharCodeCaseInsensitive(chars.charCodeAt(i))) {
                return false;
            }
        }
        return true;
    }
    _requireStr(chars) {
        const location = this._cursor.clone();
        if (!this._attemptStr(chars)) {
            throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(location));
        }
    }
    _attemptCharCodeUntilFn(predicate) {
        while (!predicate(this._cursor.peek())) {
            this._cursor.advance();
        }
    }
    _requireCharCodeUntilFn(predicate, len) {
        const start = this._cursor.clone();
        this._attemptCharCodeUntilFn(predicate);
        if (this._cursor.diff(start) < len) {
            throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(start));
        }
    }
    _attemptUntilChar(char) {
        while (this._cursor.peek() !== char) {
            this._cursor.advance();
        }
    }
    _readChar() {
        // Don't rely upon reading directly from `_input` as the actual char value
        // may have been generated from an escape sequence.
        const char = String.fromCodePoint(this._cursor.peek());
        this._cursor.advance();
        return char;
    }
    _consumeEntity(textTokenType) {
        this._beginToken(9 /* TokenType.ENCODED_ENTITY */);
        const start = this._cursor.clone();
        this._cursor.advance();
        if (this._attemptCharCode($HASH)) {
            const isHex = this._attemptCharCode($x) || this._attemptCharCode($X);
            const codeStart = this._cursor.clone();
            this._attemptCharCodeUntilFn(isDigitEntityEnd);
            if (this._cursor.peek() != $SEMICOLON) {
                // Advance cursor to include the peeked character in the string provided to the error
                // message.
                this._cursor.advance();
                const entityType = isHex ? CharacterReferenceType.HEX : CharacterReferenceType.DEC;
                throw this._createError(_unparsableEntityErrorMsg(entityType, this._cursor.getChars(start)), this._cursor.getSpan());
            }
            const strNum = this._cursor.getChars(codeStart);
            this._cursor.advance();
            try {
                const charCode = parseInt(strNum, isHex ? 16 : 10);
                this._endToken([String.fromCharCode(charCode), this._cursor.getChars(start)]);
            }
            catch {
                throw this._createError(_unknownEntityErrorMsg(this._cursor.getChars(start)), this._cursor.getSpan());
            }
        }
        else {
            const nameStart = this._cursor.clone();
            this._attemptCharCodeUntilFn(isNamedEntityEnd);
            if (this._cursor.peek() != $SEMICOLON) {
                // No semicolon was found so abort the encoded entity token that was in progress, and treat
                // this as a text token
                this._beginToken(textTokenType, start);
                this._cursor = nameStart;
                this._endToken(['&']);
            }
            else {
                const name = this._cursor.getChars(nameStart);
                this._cursor.advance();
                const char = NAMED_ENTITIES.hasOwnProperty(name) && NAMED_ENTITIES[name];
                if (!char) {
                    throw this._createError(_unknownEntityErrorMsg(name), this._cursor.getSpan(start));
                }
                this._endToken([char, `&${name};`]);
            }
        }
    }
    _consumeRawText(consumeEntities, endMarkerPredicate) {
        this._beginToken(consumeEntities ? 6 /* TokenType.ESCAPABLE_RAW_TEXT */ : 7 /* TokenType.RAW_TEXT */);
        const parts = [];
        while (true) {
            const tagCloseStart = this._cursor.clone();
            const foundEndMarker = endMarkerPredicate();
            this._cursor = tagCloseStart;
            if (foundEndMarker) {
                break;
            }
            if (consumeEntities && this._cursor.peek() === $AMPERSAND) {
                this._endToken([this._processCarriageReturns(parts.join(''))]);
                parts.length = 0;
                this._consumeEntity(6 /* TokenType.ESCAPABLE_RAW_TEXT */);
                this._beginToken(6 /* TokenType.ESCAPABLE_RAW_TEXT */);
            }
            else {
                parts.push(this._readChar());
            }
        }
        this._endToken([this._processCarriageReturns(parts.join(''))]);
    }
    _consumeComment(start) {
        this._beginToken(10 /* TokenType.COMMENT_START */, start);
        this._requireCharCode($MINUS);
        this._endToken([]);
        this._consumeRawText(false, () => this._attemptStr('-->'));
        this._beginToken(11 /* TokenType.COMMENT_END */);
        this._requireStr('-->');
        this._endToken([]);
    }
    _consumeCdata(start) {
        this._beginToken(12 /* TokenType.CDATA_START */, start);
        this._requireStr('CDATA[');
        this._endToken([]);
        this._consumeRawText(false, () => this._attemptStr(']]>'));
        this._beginToken(13 /* TokenType.CDATA_END */);
        this._requireStr(']]>');
        this._endToken([]);
    }
    _consumeDocType(start) {
        this._beginToken(18 /* TokenType.DOC_TYPE */, start);
        const contentStart = this._cursor.clone();
        this._attemptUntilChar($GT);
        const content = this._cursor.getChars(contentStart);
        this._cursor.advance();
        this._endToken([content]);
    }
    _consumePrefixAndName() {
        const nameOrPrefixStart = this._cursor.clone();
        let prefix = '';
        while (this._cursor.peek() !== $COLON && !isPrefixEnd(this._cursor.peek())) {
            this._cursor.advance();
        }
        let nameStart;
        if (this._cursor.peek() === $COLON) {
            prefix = this._cursor.getChars(nameOrPrefixStart);
            this._cursor.advance();
            nameStart = this._cursor.clone();
        }
        else {
            nameStart = nameOrPrefixStart;
        }
        this._requireCharCodeUntilFn(isNameEnd, prefix === '' ? 0 : 1);
        const name = this._cursor.getChars(nameStart);
        return [prefix, name];
    }
    _consumeTagOpen(start) {
        let tagName;
        let prefix;
        let openTagToken;
        try {
            if (!isAsciiLetter(this._cursor.peek())) {
                throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(start));
            }
            openTagToken = this._consumeTagOpenStart(start);
            prefix = openTagToken.parts[0];
            tagName = openTagToken.parts[1];
            this._attemptCharCodeUntilFn(isNotWhitespace);
            while (this._cursor.peek() !== $SLASH &&
                this._cursor.peek() !== $GT &&
                this._cursor.peek() !== $LT &&
                this._cursor.peek() !== $EOF) {
                this._consumeAttributeName();
                this._attemptCharCodeUntilFn(isNotWhitespace);
                if (this._attemptCharCode($EQ)) {
                    this._attemptCharCodeUntilFn(isNotWhitespace);
                    this._consumeAttributeValue();
                }
                this._attemptCharCodeUntilFn(isNotWhitespace);
            }
            this._consumeTagOpenEnd();
        }
        catch (e) {
            if (e instanceof _ControlFlowError) {
                if (openTagToken) {
                    // We errored before we could close the opening tag, so it is incomplete.
                    openTagToken.type = 4 /* TokenType.INCOMPLETE_TAG_OPEN */;
                }
                else {
                    // When the start tag is invalid, assume we want a "<" as text.
                    // Back to back text tokens are merged at the end.
                    this._beginToken(5 /* TokenType.TEXT */, start);
                    this._endToken(['<']);
                }
                return;
            }
            throw e;
        }
        const contentTokenType = this._getTagDefinition(tagName).getContentType(prefix);
        if (contentTokenType === exports.TagContentType.RAW_TEXT) {
            this._consumeRawTextWithTagClose(prefix, tagName, false);
        }
        else if (contentTokenType === exports.TagContentType.ESCAPABLE_RAW_TEXT) {
            this._consumeRawTextWithTagClose(prefix, tagName, true);
        }
    }
    _consumeRawTextWithTagClose(prefix, tagName, consumeEntities) {
        this._consumeRawText(consumeEntities, () => {
            if (!this._attemptCharCode($LT))
                return false;
            if (!this._attemptCharCode($SLASH))
                return false;
            this._attemptCharCodeUntilFn(isNotWhitespace);
            if (!this._attemptStrCaseInsensitive(tagName))
                return false;
            this._attemptCharCodeUntilFn(isNotWhitespace);
            return this._attemptCharCode($GT);
        });
        this._beginToken(3 /* TokenType.TAG_CLOSE */);
        this._requireCharCodeUntilFn((code) => code === $GT, 3);
        this._cursor.advance(); // Consume the `>`
        this._endToken([prefix, tagName]);
    }
    _consumeTagOpenStart(start) {
        this._beginToken(0 /* TokenType.TAG_OPEN_START */, start);
        const parts = this._consumePrefixAndName();
        return this._endToken(parts);
    }
    _consumeAttributeName() {
        const attrNameStart = this._cursor.peek();
        if (attrNameStart === $SQ || attrNameStart === $DQ) {
            throw this._createError(_unexpectedCharacterErrorMsg(attrNameStart), this._cursor.getSpan());
        }
        this._beginToken(14 /* TokenType.ATTR_NAME */);
        const prefixAndName = this._consumePrefixAndName();
        this._endToken(prefixAndName);
    }
    _consumeAttributeValue() {
        if (this._cursor.peek() === $SQ || this._cursor.peek() === $DQ) {
            const quoteChar = this._cursor.peek();
            this._consumeQuote(quoteChar);
            // In an attribute then end of the attribute value and the premature end to an interpolation
            // are both triggered by the `quoteChar`.
            const endPredicate = () => this._cursor.peek() === quoteChar;
            this._consumeWithInterpolation(16 /* TokenType.ATTR_VALUE_TEXT */, 17 /* TokenType.ATTR_VALUE_INTERPOLATION */, endPredicate, endPredicate);
            this._consumeQuote(quoteChar);
        }
        else {
            const endPredicate = () => isNameEnd(this._cursor.peek());
            this._consumeWithInterpolation(16 /* TokenType.ATTR_VALUE_TEXT */, 17 /* TokenType.ATTR_VALUE_INTERPOLATION */, endPredicate, endPredicate);
        }
    }
    _consumeQuote(quoteChar) {
        this._beginToken(15 /* TokenType.ATTR_QUOTE */);
        this._requireCharCode(quoteChar);
        this._endToken([String.fromCodePoint(quoteChar)]);
    }
    _consumeTagOpenEnd() {
        const tokenType = this._attemptCharCode($SLASH)
            ? 2 /* TokenType.TAG_OPEN_END_VOID */
            : 1 /* TokenType.TAG_OPEN_END */;
        this._beginToken(tokenType);
        this._requireCharCode($GT);
        this._endToken([]);
    }
    _consumeTagClose(start) {
        this._beginToken(3 /* TokenType.TAG_CLOSE */, start);
        this._attemptCharCodeUntilFn(isNotWhitespace);
        const prefixAndName = this._consumePrefixAndName();
        this._attemptCharCodeUntilFn(isNotWhitespace);
        this._requireCharCode($GT);
        this._endToken(prefixAndName);
    }
    _consumeExpansionFormStart() {
        this._beginToken(19 /* TokenType.EXPANSION_FORM_START */);
        this._requireCharCode($LBRACE);
        this._endToken([]);
        this._expansionCaseStack.push(19 /* TokenType.EXPANSION_FORM_START */);
        this._beginToken(7 /* TokenType.RAW_TEXT */);
        const condition = this._readUntil($COMMA);
        const normalizedCondition = this._processCarriageReturns(condition);
        if (this._i18nNormalizeLineEndingsInICUs) {
            // We explicitly want to normalize line endings for this text.
            this._endToken([normalizedCondition]);
        }
        else {
            // We are not normalizing line endings.
            const conditionToken = this._endToken([condition]);
            if (normalizedCondition !== condition) {
                this.nonNormalizedIcuExpressions.push(conditionToken);
            }
        }
        this._requireCharCode($COMMA);
        this._attemptCharCodeUntilFn(isNotWhitespace);
        this._beginToken(7 /* TokenType.RAW_TEXT */);
        const type = this._readUntil($COMMA);
        this._endToken([type]);
        this._requireCharCode($COMMA);
        this._attemptCharCodeUntilFn(isNotWhitespace);
    }
    _consumeExpansionCaseStart() {
        this._beginToken(20 /* TokenType.EXPANSION_CASE_VALUE */);
        const value = this._readUntil($LBRACE).trim();
        this._endToken([value]);
        this._attemptCharCodeUntilFn(isNotWhitespace);
        this._beginToken(21 /* TokenType.EXPANSION_CASE_EXP_START */);
        this._requireCharCode($LBRACE);
        this._endToken([]);
        this._attemptCharCodeUntilFn(isNotWhitespace);
        this._expansionCaseStack.push(21 /* TokenType.EXPANSION_CASE_EXP_START */);
    }
    _consumeExpansionCaseEnd() {
        this._beginToken(22 /* TokenType.EXPANSION_CASE_EXP_END */);
        this._requireCharCode($RBRACE);
        this._endToken([]);
        this._attemptCharCodeUntilFn(isNotWhitespace);
        this._expansionCaseStack.pop();
    }
    _consumeExpansionFormEnd() {
        this._beginToken(23 /* TokenType.EXPANSION_FORM_END */);
        this._requireCharCode($RBRACE);
        this._endToken([]);
        this._expansionCaseStack.pop();
    }
    /**
     * Consume a string that may contain interpolation expressions.
     *
     * The first token consumed will be of `tokenType` and then there will be alternating
     * `interpolationTokenType` and `tokenType` tokens until the `endPredicate()` returns true.
     *
     * If an interpolation token ends prematurely it will have no end marker in its `parts` array.
     *
     * @param textTokenType the kind of tokens to interleave around interpolation tokens.
     * @param interpolationTokenType the kind of tokens that contain interpolation.
     * @param endPredicate a function that should return true when we should stop consuming.
     * @param endInterpolation a function that should return true if there is a premature end to an
     *     interpolation expression - i.e. before we get to the normal interpolation closing marker.
     */
    _consumeWithInterpolation(textTokenType, interpolationTokenType, endPredicate, endInterpolation) {
        this._beginToken(textTokenType);
        const parts = [];
        while (!endPredicate()) {
            const current = this._cursor.clone();
            if (this._interpolationConfig && this._attemptStr(this._interpolationConfig.start)) {
                this._endToken([this._processCarriageReturns(parts.join(''))], current);
                parts.length = 0;
                this._consumeInterpolation(interpolationTokenType, current, endInterpolation);
                this._beginToken(textTokenType);
            }
            else if (this._cursor.peek() === $AMPERSAND) {
                this._endToken([this._processCarriageReturns(parts.join(''))]);
                parts.length = 0;
                this._consumeEntity(textTokenType);
                this._beginToken(textTokenType);
            }
            else {
                parts.push(this._readChar());
            }
        }
        // It is possible that an interpolation was started but not ended inside this text token.
        // Make sure that we reset the state of the lexer correctly.
        this._inInterpolation = false;
        this._endToken([this._processCarriageReturns(parts.join(''))]);
    }
    /**
     * Consume a block of text that has been interpreted as an Angular interpolation.
     *
     * @param interpolationTokenType the type of the interpolation token to generate.
     * @param interpolationStart a cursor that points to the start of this interpolation.
     * @param prematureEndPredicate a function that should return true if the next characters indicate
     *     an end to the interpolation before its normal closing marker.
     */
    _consumeInterpolation(interpolationTokenType, interpolationStart, prematureEndPredicate) {
        const parts = [];
        this._beginToken(interpolationTokenType, interpolationStart);
        parts.push(this._interpolationConfig.start);
        // Find the end of the interpolation, ignoring content inside quotes.
        const expressionStart = this._cursor.clone();
        let inQuote = null;
        let inComment = false;
        while (this._cursor.peek() !== $EOF &&
            (prematureEndPredicate === null || !prematureEndPredicate())) {
            const current = this._cursor.clone();
            if (this._isTagStart()) {
                // We are starting what looks like an HTML element in the middle of this interpolation.
                // Reset the cursor to before the `<` character and end the interpolation token.
                // (This is actually wrong but here for backward compatibility).
                this._cursor = current;
                parts.push(this._getProcessedChars(expressionStart, current));
                this._endToken(parts);
                return;
            }
            if (inQuote === null) {
                if (this._attemptStr(this._interpolationConfig.end)) {
                    // We are not in a string, and we hit the end interpolation marker
                    parts.push(this._getProcessedChars(expressionStart, current));
                    parts.push(this._interpolationConfig.end);
                    this._endToken(parts);
                    return;
                }
                else if (this._attemptStr('//')) {
                    // Once we are in a comment we ignore any quotes
                    inComment = true;
                }
            }
            const char = this._cursor.peek();
            this._cursor.advance();
            if (char === $BACKSLASH) {
                // Skip the next character because it was escaped.
                this._cursor.advance();
            }
            else if (char === inQuote) {
                // Exiting the current quoted string
                inQuote = null;
            }
            else if (!inComment && inQuote === null && isQuote(char)) {
                // Entering a new quoted string
                inQuote = char;
            }
        }
        // We hit EOF without finding a closing interpolation marker
        parts.push(this._getProcessedChars(expressionStart, this._cursor));
        this._endToken(parts);
    }
    _getProcessedChars(start, end) {
        return this._processCarriageReturns(end.getChars(start));
    }
    _isTextEnd() {
        if (this._isTagStart() || this._cursor.peek() === $EOF) {
            return true;
        }
        if (this._tokenizeIcu && !this._inInterpolation) {
            if (this.isExpansionFormStart()) {
                // start of an expansion form
                return true;
            }
            if (this._cursor.peek() === $RBRACE && this._isInExpansionCase()) {
                // end of and expansion case
                return true;
            }
        }
        if (this._tokenizeBlocks &&
            !this._inInterpolation &&
            !this._isInExpansion() &&
            (this._cursor.peek() === $AT || this._cursor.peek() === $RBRACE)) {
            return true;
        }
        return false;
    }
    /**
     * Returns true if the current cursor is pointing to the start of a tag
     * (opening/closing/comments/cdata/etc).
     */
    _isTagStart() {
        if (this._cursor.peek() === $LT) {
            // We assume that `<` followed by whitespace is not the start of an HTML element.
            const tmp = this._cursor.clone();
            tmp.advance();
            // If the next character is alphabetic, ! nor / then it is a tag start
            const code = tmp.peek();
            if (($a <= code && code <= $z) ||
                ($A <= code && code <= $Z) ||
                code === $SLASH ||
                code === $BANG) {
                return true;
            }
        }
        return false;
    }
    _readUntil(char) {
        const start = this._cursor.clone();
        this._attemptUntilChar(char);
        return this._cursor.getChars(start);
    }
    _isInExpansion() {
        return this._isInExpansionCase() || this._isInExpansionForm();
    }
    _isInExpansionCase() {
        return (this._expansionCaseStack.length > 0 &&
            this._expansionCaseStack[this._expansionCaseStack.length - 1] ===
                21 /* TokenType.EXPANSION_CASE_EXP_START */);
    }
    _isInExpansionForm() {
        return (this._expansionCaseStack.length > 0 &&
            this._expansionCaseStack[this._expansionCaseStack.length - 1] ===
                19 /* TokenType.EXPANSION_FORM_START */);
    }
    isExpansionFormStart() {
        if (this._cursor.peek() !== $LBRACE) {
            return false;
        }
        if (this._interpolationConfig) {
            const start = this._cursor.clone();
            const isInterpolation = this._attemptStr(this._interpolationConfig.start);
            this._cursor = start;
            return !isInterpolation;
        }
        return true;
    }
}
function isNotWhitespace(code) {
    return !isWhitespace(code) || code === $EOF;
}
function isNameEnd(code) {
    return (isWhitespace(code) ||
        code === $GT ||
        code === $LT ||
        code === $SLASH ||
        code === $SQ ||
        code === $DQ ||
        code === $EQ ||
        code === $EOF);
}
function isPrefixEnd(code) {
    return ((code < $a || $z < code) &&
        (code < $A || $Z < code) &&
        (code < $0 || code > $9));
}
function isDigitEntityEnd(code) {
    return code === $SEMICOLON || code === $EOF || !isAsciiHexDigit(code);
}
function isNamedEntityEnd(code) {
    return code === $SEMICOLON || code === $EOF || !isAsciiLetter(code);
}
function isExpansionCaseStart(peek) {
    return peek !== $RBRACE;
}
function compareCharCodeCaseInsensitive(code1, code2) {
    return toUpperCaseCharCode(code1) === toUpperCaseCharCode(code2);
}
function toUpperCaseCharCode(code) {
    return code >= $a && code <= $z ? code - $a + $A : code;
}
function isBlockNameChar(code) {
    return isAsciiLetter(code) || isDigit(code) || code === $_;
}
function isBlockParameterChar(code) {
    return code !== $SEMICOLON && isNotWhitespace(code);
}
function mergeTextTokens(srcTokens) {
    const dstTokens = [];
    let lastDstToken = undefined;
    for (let i = 0; i < srcTokens.length; i++) {
        const token = srcTokens[i];
        if ((lastDstToken && lastDstToken.type === 5 /* TokenType.TEXT */ && token.type === 5 /* TokenType.TEXT */) ||
            (lastDstToken &&
                lastDstToken.type === 16 /* TokenType.ATTR_VALUE_TEXT */ &&
                token.type === 16 /* TokenType.ATTR_VALUE_TEXT */)) {
            lastDstToken.parts[0] += token.parts[0];
            lastDstToken.sourceSpan.end = token.sourceSpan.end;
        }
        else {
            lastDstToken = token;
            dstTokens.push(lastDstToken);
        }
    }
    return dstTokens;
}
class PlainCharacterCursor {
    state;
    file;
    input;
    end;
    constructor(fileOrCursor, range) {
        if (fileOrCursor instanceof PlainCharacterCursor) {
            this.file = fileOrCursor.file;
            this.input = fileOrCursor.input;
            this.end = fileOrCursor.end;
            const state = fileOrCursor.state;
            // Note: avoid using `{...fileOrCursor.state}` here as that has a severe performance penalty.
            // In ES5 bundles the object spread operator is translated into the `__assign` helper, which
            // is not optimized by VMs as efficiently as a raw object literal. Since this constructor is
            // called in tight loops, this difference matters.
            this.state = {
                peek: state.peek,
                offset: state.offset,
                line: state.line,
                column: state.column,
            };
        }
        else {
            if (!range) {
                throw new Error('Programming error: the range argument must be provided with a file argument.');
            }
            this.file = fileOrCursor;
            this.input = fileOrCursor.content;
            this.end = range.endPos;
            this.state = {
                peek: -1,
                offset: range.startPos,
                line: range.startLine,
                column: range.startCol,
            };
        }
    }
    clone() {
        return new PlainCharacterCursor(this);
    }
    peek() {
        return this.state.peek;
    }
    charsLeft() {
        return this.end - this.state.offset;
    }
    diff(other) {
        return this.state.offset - other.state.offset;
    }
    advance() {
        this.advanceState(this.state);
    }
    init() {
        this.updatePeek(this.state);
    }
    getSpan(start, leadingTriviaCodePoints) {
        start = start || this;
        let fullStart = start;
        if (leadingTriviaCodePoints) {
            while (this.diff(start) > 0 && leadingTriviaCodePoints.indexOf(start.peek()) !== -1) {
                if (fullStart === start) {
                    start = start.clone();
                }
                start.advance();
            }
        }
        const startLocation = this.locationFromCursor(start);
        const endLocation = this.locationFromCursor(this);
        const fullStartLocation = fullStart !== start ? this.locationFromCursor(fullStart) : startLocation;
        return new ParseSourceSpan(startLocation, endLocation, fullStartLocation);
    }
    getChars(start) {
        return this.input.substring(start.state.offset, this.state.offset);
    }
    charAt(pos) {
        return this.input.charCodeAt(pos);
    }
    advanceState(state) {
        if (state.offset >= this.end) {
            this.state = state;
            throw new CursorError('Unexpected character "EOF"', this);
        }
        const currentChar = this.charAt(state.offset);
        if (currentChar === $LF) {
            state.line++;
            state.column = 0;
        }
        else if (!isNewLine(currentChar)) {
            state.column++;
        }
        state.offset++;
        this.updatePeek(state);
    }
    updatePeek(state) {
        state.peek = state.offset >= this.end ? $EOF : this.charAt(state.offset);
    }
    locationFromCursor(cursor) {
        return new ParseLocation(cursor.file, cursor.state.offset, cursor.state.line, cursor.state.column);
    }
}
class EscapedCharacterCursor extends PlainCharacterCursor {
    internalState;
    constructor(fileOrCursor, range) {
        if (fileOrCursor instanceof EscapedCharacterCursor) {
            super(fileOrCursor);
            this.internalState = { ...fileOrCursor.internalState };
        }
        else {
            super(fileOrCursor, range);
            this.internalState = this.state;
        }
    }
    advance() {
        this.state = this.internalState;
        super.advance();
        this.processEscapeSequence();
    }
    init() {
        super.init();
        this.processEscapeSequence();
    }
    clone() {
        return new EscapedCharacterCursor(this);
    }
    getChars(start) {
        const cursor = start.clone();
        let chars = '';
        while (cursor.internalState.offset < this.internalState.offset) {
            chars += String.fromCodePoint(cursor.peek());
            cursor.advance();
        }
        return chars;
    }
    /**
     * Process the escape sequence that starts at the current position in the text.
     *
     * This method is called to ensure that `peek` has the unescaped value of escape sequences.
     */
    processEscapeSequence() {
        const peek = () => this.internalState.peek;
        if (peek() === $BACKSLASH) {
            // We have hit an escape sequence so we need the internal state to become independent
            // of the external state.
            this.internalState = { ...this.state };
            // Move past the backslash
            this.advanceState(this.internalState);
            // First check for standard control char sequences
            if (peek() === $n) {
                this.state.peek = $LF;
            }
            else if (peek() === $r) {
                this.state.peek = $CR;
            }
            else if (peek() === $v) {
                this.state.peek = $VTAB;
            }
            else if (peek() === $t) {
                this.state.peek = $TAB;
            }
            else if (peek() === $b) {
                this.state.peek = $BSPACE;
            }
            else if (peek() === $f) {
                this.state.peek = $FF;
            }
            // Now consider more complex sequences
            else if (peek() === $u) {
                // Unicode code-point sequence
                this.advanceState(this.internalState); // advance past the `u` char
                if (peek() === $LBRACE) {
                    // Variable length Unicode, e.g. `\x{123}`
                    this.advanceState(this.internalState); // advance past the `{` char
                    // Advance past the variable number of hex digits until we hit a `}` char
                    const digitStart = this.clone();
                    let length = 0;
                    while (peek() !== $RBRACE) {
                        this.advanceState(this.internalState);
                        length++;
                    }
                    this.state.peek = this.decodeHexDigits(digitStart, length);
                }
                else {
                    // Fixed length Unicode, e.g. `\u1234`
                    const digitStart = this.clone();
                    this.advanceState(this.internalState);
                    this.advanceState(this.internalState);
                    this.advanceState(this.internalState);
                    this.state.peek = this.decodeHexDigits(digitStart, 4);
                }
            }
            else if (peek() === $x) {
                // Hex char code, e.g. `\x2F`
                this.advanceState(this.internalState); // advance past the `x` char
                const digitStart = this.clone();
                this.advanceState(this.internalState);
                this.state.peek = this.decodeHexDigits(digitStart, 2);
            }
            else if (isOctalDigit(peek())) {
                // Octal char code, e.g. `\012`,
                let octal = '';
                let length = 0;
                let previous = this.clone();
                while (isOctalDigit(peek()) && length < 3) {
                    previous = this.clone();
                    octal += String.fromCodePoint(peek());
                    this.advanceState(this.internalState);
                    length++;
                }
                this.state.peek = parseInt(octal, 8);
                // Backup one char
                this.internalState = previous.internalState;
            }
            else if (isNewLine(this.internalState.peek)) {
                // Line continuation `\` followed by a new line
                this.advanceState(this.internalState); // advance over the newline
                this.state = this.internalState;
            }
            else {
                // If none of the `if` blocks were executed then we just have an escaped normal character.
                // In that case we just, effectively, skip the backslash from the character.
                this.state.peek = this.internalState.peek;
            }
        }
    }
    decodeHexDigits(start, length) {
        const hex = this.input.slice(start.internalState.offset, start.internalState.offset + length);
        const charCode = parseInt(hex, 16);
        if (!isNaN(charCode)) {
            return charCode;
        }
        else {
            start.state = start.internalState;
            throw new CursorError('Invalid hexadecimal escape sequence', start);
        }
    }
}
class CursorError {
    msg;
    cursor;
    constructor(msg, cursor) {
        this.msg = msg;
        this.cursor = cursor;
    }
}

class TreeError extends ParseError {
    elementName;
    static create(elementName, span, msg) {
        return new TreeError(elementName, span, msg);
    }
    constructor(elementName, span, msg) {
        super(span, msg);
        this.elementName = elementName;
    }
}
class ParseTreeResult {
    rootNodes;
    errors;
    constructor(rootNodes, errors) {
        this.rootNodes = rootNodes;
        this.errors = errors;
    }
}
let Parser$1 = class Parser {
    getTagDefinition;
    constructor(getTagDefinition) {
        this.getTagDefinition = getTagDefinition;
    }
    parse(source, url, options) {
        const tokenizeResult = tokenize(source, url, this.getTagDefinition, options);
        const parser = new _TreeBuilder(tokenizeResult.tokens, this.getTagDefinition);
        parser.build();
        return new ParseTreeResult(parser.rootNodes, tokenizeResult.errors.concat(parser.errors));
    }
};
class _TreeBuilder {
    tokens;
    getTagDefinition;
    _index = -1;
    // `_peek` will be initialized by the call to `_advance()` in the constructor.
    _peek;
    _containerStack = [];
    rootNodes = [];
    errors = [];
    constructor(tokens, getTagDefinition) {
        this.tokens = tokens;
        this.getTagDefinition = getTagDefinition;
        this._advance();
    }
    build() {
        while (this._peek.type !== 33 /* TokenType.EOF */) {
            if (this._peek.type === 0 /* TokenType.TAG_OPEN_START */ ||
                this._peek.type === 4 /* TokenType.INCOMPLETE_TAG_OPEN */) {
                this._consumeStartTag(this._advance());
            }
            else if (this._peek.type === 3 /* TokenType.TAG_CLOSE */) {
                this._consumeEndTag(this._advance());
            }
            else if (this._peek.type === 12 /* TokenType.CDATA_START */) {
                this._closeVoidElement();
                this._consumeCdata(this._advance());
            }
            else if (this._peek.type === 10 /* TokenType.COMMENT_START */) {
                this._closeVoidElement();
                this._consumeComment(this._advance());
            }
            else if (this._peek.type === 5 /* TokenType.TEXT */ ||
                this._peek.type === 7 /* TokenType.RAW_TEXT */ ||
                this._peek.type === 6 /* TokenType.ESCAPABLE_RAW_TEXT */) {
                this._closeVoidElement();
                this._consumeText(this._advance());
            }
            else if (this._peek.type === 19 /* TokenType.EXPANSION_FORM_START */) {
                this._consumeExpansion(this._advance());
            }
            else if (this._peek.type === 24 /* TokenType.BLOCK_OPEN_START */) {
                this._closeVoidElement();
                this._consumeBlockOpen(this._advance());
            }
            else if (this._peek.type === 26 /* TokenType.BLOCK_CLOSE */) {
                this._closeVoidElement();
                this._consumeBlockClose(this._advance());
            }
            else if (this._peek.type === 28 /* TokenType.INCOMPLETE_BLOCK_OPEN */) {
                this._closeVoidElement();
                this._consumeIncompleteBlock(this._advance());
            }
            else if (this._peek.type === 29 /* TokenType.LET_START */) {
                this._closeVoidElement();
                this._consumeLet(this._advance());
            }
            else if (this._peek.type === 32 /* TokenType.INCOMPLETE_LET */) {
                this._closeVoidElement();
                this._consumeIncompleteLet(this._advance());
            }
            else {
                // Skip all other tokens...
                this._advance();
            }
        }
        for (const leftoverContainer of this._containerStack) {
            // Unlike HTML elements, blocks aren't closed implicitly by the end of the file.
            if (leftoverContainer instanceof Block) {
                this.errors.push(TreeError.create(leftoverContainer.name, leftoverContainer.sourceSpan, `Unclosed block "${leftoverContainer.name}"`));
            }
        }
    }
    _advance() {
        const prev = this._peek;
        if (this._index < this.tokens.length - 1) {
            // Note: there is always an EOF token at the end
            this._index++;
        }
        this._peek = this.tokens[this._index];
        return prev;
    }
    _advanceIf(type) {
        if (this._peek.type === type) {
            return this._advance();
        }
        return null;
    }
    _consumeCdata(_startToken) {
        this._consumeText(this._advance());
        this._advanceIf(13 /* TokenType.CDATA_END */);
    }
    _consumeComment(token) {
        const text = this._advanceIf(7 /* TokenType.RAW_TEXT */);
        const endToken = this._advanceIf(11 /* TokenType.COMMENT_END */);
        const value = text != null ? text.parts[0].trim() : null;
        const sourceSpan = endToken == null
            ? token.sourceSpan
            : new ParseSourceSpan(token.sourceSpan.start, endToken.sourceSpan.end, token.sourceSpan.fullStart);
        this._addToParent(new Comment(value, sourceSpan));
    }
    _consumeExpansion(token) {
        const switchValue = this._advance();
        const type = this._advance();
        const cases = [];
        // read =
        while (this._peek.type === 20 /* TokenType.EXPANSION_CASE_VALUE */) {
            const expCase = this._parseExpansionCase();
            if (!expCase)
                ret   urn; // error
            cases.push(expCase);
        }
        // read the final }
        if (this._peek.type !== 23 /* TokenType.EXPANSION_FORM_END */) {
            this.errors.push(TreeError.create(null, this._peek.sourceSpan, `Invalid ICU message. Missing '}'.`));
            return;
        }
        const sourceSpan = new ParseSourceSpan(token.sourceSpan.start, this._peek.sourceSpan.end, token.sourceSpan.fullStart);
        this._addToParent(new Expansion(switchValue.parts[0], type.parts[0], cases, sourceSpan, switchValue.sourceSpan));
        this._advance();
    }
    _parseExpansionCase() {
        const value = this._advance();
        // read {
        if (this._peek.type !== 21 /* TokenType.EXPANSION_CASE_EXP_START */) {
            this.errors.push(TreeError.create(null, this._peek.sourceSpan, `Invalid ICU message. Missing '{'.`));
            return null;
        }
        // read until }
        const start = this._advance();
        const exp = this._collectExpansionExpTokens(start);
        if (!exp)
            return null;
        const end = this._advance();
        exp.push({ type: 33 /* TokenType.EOF */, parts: [], sourceSpan: end.sourceSpan });
        // parse everything in between { and }
        const expansionCaseParser = new _TreeBuilder(exp, this.getTagDefinition);
        expansionCaseParser.build();
        if (expansionCaseParser.errors.length > 0) {
            this.errors = this.errors.concat(expansionCaseParser.errors);
            return null;
        }
        const sourceSpan = new ParseSourceSpan(value.sourceSpan.start, end.sourceSpan.end, value.sourceSpan.fullStart);
        const expSourceSpan = new ParseSourceSpan(start.sourceSpan.start, end.sourceSpan.end, start.sourceSpan.fullStart);
        return new ExpansionCase(value.parts[0], expansionCaseParser.rootNodes, sourceSpan, value.sourceSpan, expSourceSpan);
    }
    _collectExpansionExpTokens(start) {
        const exp = [];
        const expansionFormStack = [21 /* TokenType.EXPANSION_CASE_EXP_START */];
        while (true) {
            if (this._peek.type === 19 /* TokenType.EXPANSION_FORM_START */ ||
                this._peek.type === 21 /* TokenType.EXPANSION_CASE_EXP_START */) {
                expansionFormStack.push(this._peek.type);
            }
            if (this._peek.type === 22 /* TokenType.EXPANSION_CASE_EXP_END */) {
                if (lastOnStack(expansionFormStack, 21 /* TokenType.EXPANSION_CASE_EXP_START */)) {
                    expansionFormStack.pop();
                    if (expansionFormStack.length === 0)
                        return exp;
                }
                else {
                    this.errors.push(TreeError.create(null, start.sourceSpan, `Invalid ICU message. Missing '}'.`));
                    return null;
                }
            }
            if (this._peek.type === 23 /* TokenType.EXPANSION_FORM_END */) {
                if (lastOnStack(expansionFormStack, 19 /* TokenType.EXPANSION_FORM_START */)) {
                    expansionFormStack.pop();
                }
                else {
                    this.errors.push(TreeError.create(null, start.sourceSpan, `Invalid ICU message. Missing '}'.`));
                    return null;
                }
            }
            if (this._peek.type === 33 /* TokenType.EOF */) {
                this.errors.push(TreeError.create(null, start.sourceSpan, `Invalid ICU message. Missing '}'.`));
                return null;
            }
            exp.push(this._advance());
        }
    }
    _consumeText(token) {
        const tokens = [token];
        const startSpan = token.sourceSpan;
        let text = token.parts[0];
        if (text.length > 0 && text[0] === '\n') {
            const parent = this._getContainer();
            if (parent != null &&
                parent.children.length === 0 &&
                this.getTagDefinition(parent.name).ignoreFirstLf) {
                text = text.substring(1);
                tokens[0] = { type: token.type, sourceSpan: token.sourceSpan, parts: [text] };
            }
        }
        while (this._peek.type === 8 /* TokenType.INTERPOLATION */ ||
            this._peek.type === 5 /* TokenType.TEXT */ ||
            this._peek.type === 9 /* TokenType.ENCODED_ENTITY */) {
            token = this._advance();
            tokens.push(token);
            if (token.type === 8 /* TokenType.INTERPOLATION */) {
                // For backward compatibility we decode HTML entities that appear in interpolation
                // expressions. This is arguably a bug, but it could be a considerable breaking change to
                // fix it. It should be addressed in a larger project to refactor the entire parser/lexer
                // chain after View Engine has been removed.
                text += token.parts.join('').replace(/&([^;]+);/g, decodeEntity);
            }
            else if (token.type === 9 /* TokenType.ENCODED_ENTITY */) {
                text += token.parts[0];
            }
            else {
                text += token.parts.join('');
            }
        }
        if (text.length > 0) {
            const endSpan = token.sourceSpan;
            this._addToParent(new Text(text, new ParseSourceSpan(startSpan.start, endSpan.end, startSpan.fullStart, startSpan.details), tokens));
        }
    }
    _closeVoidElement() {
        const el = this._getContainer();
        if (el instanceof Element && this.getTagDefinition(el.name).isVoid) {
            this._containerStack.pop();
        }
    }
    _consumeStartTag(startTagToken) {
        const [prefix, name] = startTagToken.parts;
        const attrs = [];
        while (this._peek.type === 14 /* TokenType.ATTR_NAME */) {
            attrs.push(this._consumeAttr(this._advance()));
        }
        const fullName = this._getElementFullName(prefix, name, this._getClosestParentElement());
        let selfClosing = false;
        // Note: There could have been a tokenizer error
        // so that we don't get a token for the end tag...
        if (this._peek.type === 2 /* TokenType.TAG_OPEN_END_VOID */) {
            this._advance();
            selfClosing = true;
            const tagDef = this.getTagDefinition(fullName);
            if (!(tagDef.canSelfClose || getNsPrefix(fullName) !== null || tagDef.isVoid)) {
                this.errors.push(TreeError.create(fullName, startTagToken.sourceSpan, `Only void, custom and foreign elements can be self closed "${startTagToken.parts[1]}"`));
            }
        }
        else if (this._peek.type === 1 /* TokenType.TAG_OPEN_END */) {
            this._advance();
            selfClosing = false;
        }
        const end = this._peek.sourceSpan.fullStart;
        const span = new ParseSourceSpan(startTagToken.sourceSpan.start, end, startTagToken.sourceSpan.fullStart);
        // Create a separate `startSpan` because `span` will be modified when there is an `end` span.
        const startSpan = new ParseSourceSpan(startTagToken.sourceSpan.start, end, startTagToken.sourceSpan.fullStart);
        const el = new Element(fullName, attrs, [], span, startSpan, undefined);
        const parentEl = this._getContainer();
        this._pushContainer(el, parentEl instanceof Element &&
            this.getTagDefinition(parentEl.name).isClosedByChild(el.name));
        if (selfClosing) {
            // Elements that are self-closed have their `endSourceSpan` set to the full span, as the
            // element start tag also represents the end tag.
            this._popContainer(fullName, Element, span);
        }
        else if (startTagToken.type === 4 /* TokenType.INCOMPLETE_TAG_OPEN */) {
            // We already know the opening tag is not complete, so it is unlikely it has a corresponding
            // close tag. Let's optimistically parse it as a full element and emit an error.
            this._popContainer(fullName, Element, null);
            this.errors.push(TreeError.create(fullName, span, `Opening tag "${fullName}" not terminated.`));
        }
    }
    _pushContainer(node, isClosedByChild) {
        if (isClosedByChild) {
            this._containerStack.pop();
        }
        this._addToParent(node);
        this._containerStack.push(node);
    }
    _consumeEndTag(endTagToken) {
        const fullName = this._getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getClosestParentElement());
        if (this.getTagDefinition(fullName).isVoid) {
            this.errors.push(TreeError.create(fullName, endTagToken.sourceSpan, `Void elements do not have end tags "${endTagToken.parts[1]}"`));
        }
        else if (!this._popContainer(fullName, Element, endTagToken.sourceSpan)) {
            const errMsg = `Unexpected closing tag "${fullName}". It may happen when the tag has already been closed by another tag. For more info see https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags`;
            this.errors.push(TreeError.create(fullName, endTagToken.sourceSpan, errMsg));
        }
    }
    /**
     * Closes the nearest element with the tag name `fullName` in the parse tree.
     * `endSourceSpan` is the span of the closing tag, or null if the element does
     * not have a closing tag (for example, this happens when an incomplete
     * opening tag is recovered).
     */
    _popContainer(expectedName, expectedType, endSourceSpan) {
        let unexpectedCloseTagDetected = false;
        for (let stackIndex = this._containerStack.length - 1; stackIndex >= 0; stackIndex--) {
            const node = this._containerStack[stackIndex];
            if ((node.name === expectedName || expectedName === null) && node instanceof expectedType) {
                // Record the parse span with the element that is being closed. Any elements that are
                // removed from the element stack at this point are closed implicitly, so they won't get
                // an end source span (as there is no explicit closing element).
                node.endSourceSpan = endSourceSpan;
                node.sourceSpan.end = endSourceSpan !== null ? endSourceSpan.end : node.sourceSpan.end;
                this._containerStack.splice(stackIndex, this._containerStack.length - stackIndex);
                return !unexpectedCloseTagDetected;
            }
            // Blocks and most elements are not self closing.
            if (node instanceof Block ||
                (node instanceof Element && !this.getTagDefinition(node.name).closedByParent)) {
                // Note that we encountered an unexpected close tag but continue processing the element
                // stack so we can assign an `endSourceSpan` if there is a corresponding start tag for this
                // end tag in the stack.
                unexpectedCloseTagDetected = true;
            }
        }
        return false;
    }
    _consumeAttr(attrName) {
        const fullName = mergeNsAndName(attrName.parts[0], attrName.parts[1]);
        let attrEnd = attrName.sourceSpan.end;
        // Consume any quote
        if (this._peek.type === 15 /* TokenType.ATTR_QUOTE */) {
            this._advance();
        }
        // Consume the attribute value
        let value = '';
        const valueTokens = [];
        let valueStartSpan = undefined;
        let valueEnd = undefined;
        // NOTE: We need to use a new variable `nextTokenType` here to hide the actual type of
        // `_peek.type` from TS. Otherwise TS will narrow the type of `_peek.type` preventing it from
        // being able to consider `ATTR_VALUE_INTERPOLATION` as an option. This is because TS is not
        // able to see that `_advance()` will actually mutate `_peek`.
        const nextTokenType = this._peek.type;
        if (nextTokenType === 16 /* TokenType.ATTR_VALUE_TEXT */) {
            valueStartSpan = this._peek.sourceSpan;
            valueEnd = this._peek.sourceSpan.end;
            while (this._peek.type === 16 /* TokenType.ATTR_VALUE_TEXT */ ||
                this._peek.type === 17 /* TokenType.ATTR_VALUE_INTERPOLATION */ ||
                this._peek.type === 9 /* TokenType.ENCODED_ENTITY */) {
                const valueToken = this._advance();
                valueTokens.push(valueToken);
                if (valueToken.type === 17 /* TokenType.ATTR_VALUE_INTERPOLATION */) {
                    // For backward compatibility we decode HTML entities that appear in interpolation
                    // expressions. This is arguably a bug, but it could be a considerable breaking change to
                    // fix it. It should be addressed in a larger project to refactor the entire parser/lexer
                    // chain after View Engine has been removed.
                    value += valueToken.parts.join('').replace(/&([^;]+);/g, decodeEntity);
                }
                else if (valueToken.type === 9 /* TokenType.ENCODED_ENTITY */) {
                    value += valueToken.parts[0];
                }
                else {
                    value += valueToken.parts.join('');
                }
                valueEnd = attrEnd = valueToken.sourceSpan.end;
            }
        }
        // Consume any quote
        if (this._peek.type === 15 /* TokenType.ATTR_QUOTE */) {
            const quoteToken = this._advance();
            attrEnd = quoteToken.sourceSpan.end;
        }
        const valueSpan = valueStartSpan &&
            valueEnd &&
            new ParseSourceSpan(valueStartSpan.start, valueEnd, valueStartSpan.fullStart);
        return new Attribute(fullName, value, new ParseSourceSpan(attrName.sourceSpan.start, attrEnd, attrName.sourceSpan.fullStart), attrName.sourceSpan, valueSpan, valueTokens.length > 0 ? valueTokens : undefined, undefined);
    }
    _consumeBlockOpen(token) {
        const parameters = [];
        while (this._peek.type === 27 /* TokenType.BLOCK_PARAMETER */) {
            const paramToken = this._advance();
            parameters.push(new BlockParameter(paramToken.parts[0], paramToken.sourceSpan));
        }
        if (this._peek.type === 25 /* TokenType.BLOCK_OPEN_END */) {
            this._advance();
        }
        const end = this._peek.sourceSpan.fullStart;
        const span = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart);
        // Create a separate `startSpan` because `span` will be modified when there is an `end` span.
        const startSpan = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart);
        const block = new Block(token.parts[0], parameters, [], span, token.sourceSpan, startSpan);
        this._pushContainer(block, false);
    }
    _consumeBlockClose(token) {
        if (!this._popContainer(null, Block, token.sourceSpan)) {
            this.errors.push(TreeError.create(null, token.sourceSpan, `Unexpected closing block. The block may have been closed earlier. ` +
                `If you meant to write the } character, you should use the "&#125;" ` +
                `HTML entity instead.`));
        }
    }
    _consumeIncompleteBlock(token) {
        const parameters = [];
        while (this._peek.type === 27 /* TokenType.BLOCK_PARAMETER */) {
            const paramToken = this._advance();
            parameters.push(new BlockParameter(paramToken.parts[0], paramToken.sourceSpan));
        }
        const end = this._peek.sourceSpan.fullStart;
        const span = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart);
        // Create a separate `startSpan` because `span` will be modified when there is an `end` span.
        const startSpan = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart);
        const block = new Block(token.parts[0], parameters, [], span, token.sourceSpan, startSpan);
        this._pushContainer(block, false);
        // Incomplete blocks don't have children so we close them immediately and report an error.
        this._popContainer(null, Block, null);
        this.errors.push(TreeError.create(token.parts[0], span, `Incomplete block "${token.parts[0]}". If you meant to write the @ character, ` +
            `you should use the "&#64;" HTML entity instead.`));
    }
    _consumeLet(startToken) {
        const name = startToken.parts[0];
        let valueToken;
        let endToken;
        if (this._peek.type !== 30 /* TokenType.LET_VALUE */) {
            this.errors.push(TreeError.create(startToken.parts[0], startToken.sourceSpan, `Invalid @let declaration "${name}". Declaration must have a value.`));
            return;
        }
        else {
            valueToken = this._advance();
        }
        // Type cast is necessary here since TS narrowed the type of `peek` above.
        if (this._peek.type !== 31 /* TokenType.LET_END */) {
            this.errors.push(TreeError.create(startToken.parts[0], startToken.sourceSpan, `Unterminated @let declaration "${name}". Declaration must be terminated with a semicolon.`));
            return;
        }
        else {
            endToken = this._advance();
        }
        const end = endToken.sourceSpan.fullStart;
        const span = new ParseSourceSpan(startToken.sourceSpan.start, end, startToken.sourceSpan.fullStart);
        // The start token usually captures the `@let`. Construct a name span by
        // offsetting the start by the length of any text before the name.
        const startOffset = startToken.sourceSpan.toString().lastIndexOf(name);
        const nameStart = startToken.sourceSpan.start.moveBy(startOffset);
        const nameSpan = new ParseSourceSpan(nameStart, startToken.sourceSpan.end);
        const node = new LetDeclaration(name, valueToken.parts[0], span, nameSpan, valueToken.sourceSpan);
        this._addToParent(node);
    }
    _consumeIncompleteLet(token) {
        // Incomplete `@let` declaration may end up with an empty name.
        const name = token.parts[0] ?? '';
        const nameString = name ? ` "${name}"` : '';
        // If there's at least a name, we can salvage an AST node that can be used for completions.
        if (name.length > 0) {
            const startOffset = token.sourceSpan.toString().lastIndexOf(name);
            const nameStart = token.sourceSpan.start.moveBy(startOffset);
            const nameSpan = new ParseSourceSpan(nameStart, token.sourceSpan.end);
            const valueSpan = new ParseSourceSpan(token.sourceSpan.start, token.sourceSpan.start.moveBy(0));
            const node = new LetDeclaration(name, '', token.sourceSpan, nameSpan, valueSpan);
            this._addToParent(node);
        }
        this.errors.push(TreeError.create(token.parts[0], token.sourceSpan, `Incomplete @let declaration${nameString}. ` +
            `@let declarations must be written as \`@let <name> = <value>;\``));
    }
    _getContainer() {
        return this._containerStack.length > 0
            ? this._containerStack[this._containerStack.length - 1]
            : null;
    }
    _getClosestParentElement() {
        for (let i = this._containerStack.length - 1; i > -1; i--) {
            if (this._containerStack[i] instanceof Element) {
                return this._containerStack[i];
            }
        }
        return null;
    }
    _addToParent(node) {
        const parent = this._getContainer();
        if (parent === null) {
            this.rootNodes.push(node);
        }
        else {
            parent.children.push(node);
        }
    }
    _getElementFullName(prefix, localName, parentElement) {
        if (prefix === '') {
            prefix = this.getTagDefinition(localName).implicitNamespacePrefix || '';
            if (prefix === '' && parentElement != null) {
                const parentTagName = splitNsName(parentElement.name)[1];
                const parentTagDefinition = this.getTagDefinition(parentTagName);
                if (!parentTagDefinition.preventNamespaceInheritance) {
                    prefix = getNsPrefix(parentElement.name);
                }
            }
        }
        return mergeNsAndName(prefix, localName);
    }
}
function lastOnStack(stack, element) {
    return stack.length > 0 && stack[stack.length - 1] === element;
}
/**
 * Decode the `entity` string, which we believe is the contents of an HTML entity.
 *
 * If the string is not actually a valid/known entity then just return the original `match` string.
 */
function decodeEntity(match, entity) {
    if (NAMED_ENTITIES[entity] !== undefined) {
        return NAMED_ENTITIES[entity] || match;
    }
    if (/^#x[a-f0-9]+$/i.test(entity)) {
        return String.fromCodePoint(parseInt(entity.slice(2), 16));
    }
    if (/^#\d+$/.test(entity)) {
        return String.fromCodePoint(parseInt(entity.slice(1), 10));
    }
    return match;
}

const PRESERVE_WS_ATTR_NAME = 'ngPreserveWhitespaces';
const SKIP_WS_TRIM_TAGS = new Set(['pre', 'template', 'textarea', 'script', 'style']);
// Equivalent to \s with \u00a0 (non-breaking space) excluded.
// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
const WS_CHARS = ' \f\n\r\t\v\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff';
const NO_WS_REGEXP = new RegExp(`[^${WS_CHARS}]`);
const WS_REPLACE_REGEXP = new RegExp(`[${WS_CHARS}]{2,}`, 'g');
function hasPreserveWhitespacesAttr(attrs) {
    return attrs.some((attr) => attr.name === PRESERVE_WS_ATTR_NAME);
}
/**
 * &ngsp; is a placeholder for non-removable space
 * &ngsp; is converted to the 0xE500 PUA (Private Use Areas) unicode character
 * and later on replaced by a space.
 */
function replaceNgsp(value) {
    // lexer is replacing the &ngsp; pseudo-entity with NGSP_UNICODE
    return value.replace(new RegExp(NGSP_UNICODE, 'g'), ' ');
}
/**
 * This visitor can walk HTML parse tree and remove / trim text nodes using the following rules:
 * - consider spaces, tabs and new lines as whitespace characters;
 * - drop text nodes consisting of whitespace characters only;
 * - for all other text nodes replace consecutive whitespace characters with one space;
 * - convert &ngsp; pseudo-entity to a single space;
 *
 * Removal and trimming of whitespaces have positive performance impact (less code to generate
 * while compiling templates, faster view creation). At the same time it can be "destructive"
 * in some cases (whitespaces can influence layout). Because of the potential of breaking layout
 * this visitor is not activated by default in Angular 5 and people need to explicitly opt-in for
 * whitespace removal. The default option for whitespace removal will be revisited in Angular 6
 * and might be changed to "on" by default.
 *
 * If `originalNodeMap` is provided, the transformed nodes will be mapped back to their original
 * inputs. Any output nodes not in the map were not transformed. This supports correlating and
 * porting information between the trimmed nodes and original nodes (such as `i18n` properties)
 * such that trimming whitespace does not does not drop required information from the node.
 */
class WhitespaceVisitor {
    preserveSignificantWhitespace;
    originalNodeMap;
    requireContext;
    // How many ICU expansions which are currently being visited. ICUs can be nested, so this
    // tracks the current depth of nesting. If this depth is greater than 0, then this visitor is
    // currently processing content inside an ICU expansion.
    icuExpansionDepth = 0;
    constructor(preserveSignificantWhitespace, originalNodeMap, requireContext = true) {
        this.preserveSignificantWhitespace = preserveSignificantWhitespace;
        this.originalNodeMap = originalNodeMap;
        this.requireContext = requireContext;
    }
    visitElement(element, context) {
        if (SKIP_WS_TRIM_TAGS.has(element.name) || hasPreserveWhitespacesAttr(element.attrs)) {
            // don't descent into elements where we need to preserve whitespaces
            // but still visit all attributes to eliminate one used as a market to preserve WS
            const newElement = new Element(element.name, visitAllWithSiblings(this, element.attrs), element.children, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
            this.originalNodeMap?.set(newElement, element);
            return newElement;
        }
        const newElement = new Element(element.name, element.attrs, visitAllWithSiblings(this, element.children), element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
        this.originalNodeMap?.set(newElement, element);
        return newElement;
    }
    visitAttribute(attribute, context) {
        return attribute.name !== PRESERVE_WS_ATTR_NAME ? attribute : null;
    }
    visitText(text, context) {
        const isNotBlank = text.value.match(NO_WS_REGEXP);
        const hasExpansionSibling = context && (context.prev instanceof Expansion || context.next instanceof Expansion);
        // Do not trim whitespace within ICU expansions when preserving significant whitespace.
        // Historically, ICU whitespace was never trimmed and this is really a bug. However fixing it
        // would change message IDs which we can't easily do. Instead we only trim ICU whitespace within
        // ICU expansions when not preserving significant whitespace, which is the new behavior where it
        // most matters.
        const inIcuExpansion = this.icuExpansionDepth > 0;
        if (inIcuExpansion && this.preserveSignificantWhitespace)
            return text;
        if (isNotBlank || hasExpansionSibling) {
            // Process the whitespace in the tokens of this Text node
            const tokens = text.tokens.map((token) => token.type === 5 /* TokenType.TEXT */ ? createWhitespaceProcessedTextToken(token) : token);
            // Fully trim message when significant whitespace is not preserved.
            if (!this.preserveSignificantWhitespace && tokens.length > 0) {
                // The first token should only call `.trimStart()` and the last token
                // should only call `.trimEnd()`, but there might be only one token which
                // needs to call both.
                const firstToken = tokens[0];
                tokens.splice(0, 1, trimLeadingWhitespace(firstToken, context));
                const lastToken = tokens[tokens.length - 1]; // Could be the same as the first token.
                tokens.splice(tokens.length - 1, 1, trimTrailingWhitespace(lastToken, context));
            }
            // Process the whitespace of the value of this Text node. Also trim the leading/trailing
            // whitespace when we don't need to preserve significant whitespace.
            const processed = processWhitespace(text.value);
            const value = this.preserveSignificantWhitespace
                ? processed
                : trimLeadingAndTrailingWhitespace(processed, context);
            const result = new Text(value, text.sourceSpan, tokens, text.i18n);
            this.originalNodeMap?.set(result, text);
            return result;
        }
        return null;
    }
    visitComment(comment, context) {
        return comment;
    }
    visitExpansion(expansion, context) {
        this.icuExpansionDepth++;
        let newExpansion;
        try {
            newExpansion = new Expansion(expansion.switchValue, expansion.type, visitAllWithSiblings(this, expansion.cases), expansion.sourceSpan, expansion.switchValueSourceSpan, expansion.i18n);
        }
        finally {
            this.icuExpansionDepth--;
        }
        this.originalNodeMap?.set(newExpansion, expansion);
        return newExpansion;
    }
    visitExpansionCase(expansionCase, context) {
        const newExpansionCase = new ExpansionCase(expansionCase.value, visitAllWithSiblings(this, expansionCase.expression), expansionCase.sourceSpan, expansionCase.valueSourceSpan, expansionCase.expSourceSpan);
        this.originalNodeMap?.set(newExpansionCase, expansionCase);
        return newExpansionCase;
    }
    visitBlock(block, context) {
        const newBlock = new Block(block.name, block.parameters, visitAllWithSiblings(this, block.children), block.sourceSpan, block.nameSpan, block.startSourceSpan, block.endSourceSpan);
        this.originalNodeMap?.set(newBlock, block);
        return newBlock;
    }
    visitBlockParameter(parameter, context) {
        return parameter;
    }
    visitLetDeclaration(decl, context) {
        return decl;
    }
    visit(_node, context) {
        // `visitAllWithSiblings` provides context necessary for ICU messages to be handled correctly.
        // Prefer that over calling `html.visitAll` directly on this visitor.
        if (this.requireContext && !context) {
            throw new Error(`WhitespaceVisitor requires context. Visit via \`visitAllWithSiblings\` to get this context.`);
        }
        return false;
    }
}
function trimLeadingWhitespace(token, context) {
    if (token.type !== 5 /* TokenType.TEXT */)
        return token;
    const isFirstTokenInTag = !context?.prev;
    if (!isFirstTokenInTag)
        return token;
    return transformTextToken(token, (text) => text.trimStart());
}
function trimTrailingWhitespace(token, context) {
    if (token.type !== 5 /* TokenType.TEXT */)
        return token;
    const isLastTokenInTag = !context?.next;
    if (!isLastTokenInTag)
        return token;
    return transformTextToken(token, (text) => text.trimEnd());
}
function trimLeadingAndTrailingWhitespace(text, context) {
    const isFirstTokenInTag = !context?.prev;
    const isLastTokenInTag = !context?.next;
    const maybeTrimmedStart = isFirstTokenInTag ? text.trimStart() : text;
    const maybeTrimmed = isLastTokenInTag ? maybeTrimmedStart.trimEnd() : maybeTrimmedStart;
    return maybeTrimmed;
}
function createWhitespaceProcessedTextToken({ type, parts, sourceSpan }) {
    return { type, parts: [processWhitespace(parts[0])], sourceSpan };
}
function transformTextToken({ type, parts, sourceSpan }, transform) {
    // `TextToken` only ever has one part as defined in its type, so we just transform the first element.
    return { type, parts: [transform(parts[0])], sourceSpan };
}
function processWhitespace(text) {
    return replaceNgsp(text).replace(WS_REPLACE_REGEXP, ' ');
}
function visitAllWithSiblings(visitor, nodes) {
    const result = [];
    nodes.forEach((ast, i) => {
        const context = { prev: nodes[i - 1], next: nodes[i + 1] };
        const astResult = ast.visit(visitor, context);
        if (astResult) {
            result.push(astResult);
        }
    });
    return result;
}

var TokenType;
(function (TokenType) {
    TokenType[TokenType["Character"] = 0] = "Character";
    TokenType[TokenType["Identifier"] = 1] = "Identifier";
    TokenType[TokenType["PrivateIdentifier"] = 2] = "PrivateIdentifier";
    TokenType[TokenType["Keyword"] = 3] = "Keyword";
    TokenType[TokenType["String"] = 4] = "String";
    TokenType[TokenType["Operator"] = 5] = "Operator";
    TokenType[TokenType["Number"] = 6] = "Number";
    TokenType[TokenType["Error"] = 7] = "Error";
})(TokenType || (TokenType = {}));
var StringTokenKind;
(function (StringTokenKind) {
    StringTokenKind[StringTokenKind["Plain"] = 0] = "Plain";
    StringTokenKind[StringTokenKind["TemplateLiteralPart"] = 1] = "TemplateLiteralPart";
    StringTokenKind[StringTokenKind["TemplateLiteralEnd"] = 2] = "TemplateLiteralEnd";
})(StringTokenKind || (StringTokenKind = {}));
const KEYWORDS = [
    'var',
    'let',
    'as',
    'null',
    'undefined',
    'true',
    'false',
    'if',
    'else',
    'this',
    'typeof',
];
class Lexer {
    tokenize(text) {
        return new _Scanner(text).scan();
    }
}
class Token {
    index;
    end;
    type;
    numValue;
    strValue;
    constructor(index, end, type, numValue, strValue) {
        this.index = index;
        this.end = end;
        this.type = type;
        this.numValue = numValue;
        this.strValue = strValue;
    }
    isCharacter(code) {
        return this.type === TokenType.Character && this.numValue === code;
    }
    isNumber() {
        return this.type === TokenType.Number;
    }
    isString() {
        return this.type === TokenType.String;
    }
    isOperator(operator) {
        return this.type === TokenType.Operator && this.strValue === operator;
    }
    isIdentifier() {
        return this.type === TokenType.Identifier;
    }
    isPrivateIdentifier() {
        return this.type === TokenType.PrivateIdentifier;
    }
    isKeyword() {
        return this.type === TokenType.Keyword;
    }
    isKeywordLet() {
        return this.type === TokenType.Keyword && this.strValue === 'let';
    }
    isKeywordAs() {
        return this.type === TokenType.Keyword && this.strValue === 'as';
    }
    isKeywordNull() {
        return this.type === TokenType.Keyword && this.strValue === 'null';
    }
    isKeywordUndefined() {
        return this.type === TokenType.Keyword && this.strValue === 'undefined';
    }
    isKeywordTrue() {
        return this.type === TokenType.Keyword && this.strValue === 'true';
    }
    isKeywordFalse() {
        return this.type === TokenType.Keyword && this.strValue === 'false';
    }
    isKeywordThis() {
        return this.type === TokenType.Keyword && this.strValue === 'this';
    }
    isKeywordTypeof() {
        return this.type === TokenType.Keyword && this.strValue === 'typeof';
    }
    isError() {
        return this.type === TokenType.Error;
    }
    toNumber() {
        return this.type === TokenType.Number ? this.numValue : -1;
    }
    isTemplateLiteralPart() {
        return this.isString() && this.kind === StringTokenKind.TemplateLiteralPart;
    }
    isTemplateLiteralEnd() {
        return this.isString() && this.kind === StringTokenKind.TemplateLiteralEnd;
    }
    isTemplateLiteralInterpolationStart() {
        return this.isOperator('${');
    }
    isTemplateLiteralInterpolationEnd() {
        return this.isOperator('}');
    }
    toString() {
        switch (this.type) {
            case TokenType.Character:
            case TokenType.Identifier:
            case TokenType.Keyword:
            case TokenType.Operator:
            case TokenType.PrivateIdentifier:
            case TokenType.String:
            case TokenType.Error:
                return this.strValue;
            case TokenType.Number:
                return this.numValue.toString();
            default:
                return null;
        }
    }
}
class StringToken extends Token {
    kind;
    constructor(index, end, strValue, kind) {
        super(index, end, TokenType.String, 0, strValue);
        this.kind = kind;
    }
}
function newCharacterToken(index, end, code) {
    return new Token(index, end, TokenType.Character, code, String.fromCharCode(code));
}
function newIdentifierToken(index, end, text) {
    return new Token(index, end, TokenType.Identifier, 0, text);
}
function newPrivateIdentifierToken(index, end, text) {
    return new Token(index, end, TokenType.PrivateIdentifier, 0, text);
}
function newKeywordToken(index, end, text) {
    return new Token(index, end, TokenType.Keyword, 0, text);
}
function newOperatorToken(index, end, text) {
    return new Token(index, end, TokenType.Operator, 0, text);
}
function newNumberToken(index, end, n) {
    return new Token(index, end, TokenType.Number, n, '');
}
function newErrorToken(index, end, message) {
    return new Token(index, end, TokenType.Error, 0, message);
}
const EOF = new Token(-1, -1, TokenType.Character, 0, '');
class _Scanner {
    input;
    tokens = [];
    length;
    peek = 0;
    index = -1;
    braceStack = [];
    constructor(input) {
        this.input = input;
        this.length = input.length;
        this.advance();
    }
    scan() {
        let token = this.scanToken();
        while (token !== null) {
            this.tokens.push(token);
            token = this.scanToken();
        }
        return this.tokens;
    }
    advance() {
        this.peek = ++this.index >= this.length ? $EOF : this.input.charCodeAt(this.index);
    }
    scanToken() {
        const input = this.input;
        const length = this.length;
        let peek = this.peek;
        let index = this.index;
        // Skip whitespace.
        while (peek <= $SPACE) {
            if (++index >= length) {
                peek = $EOF;
                break;
            }
            else {
                peek = input.charCodeAt(index);
            }
        }
        this.peek = peek;
        this.index = index;
        if (index >= length) {
            return null;
        }
        // Handle identifiers and numbers.
        if (isIdentifierStart(peek)) {
            return this.scanIdentifier();
        }
        if (isDigit(peek)) {
            return this.scanNumber(index);
        }
        const start = index;
        switch (peek) {
            case $PERIOD:
                this.advance();
                return isDigit(this.peek)
                    ? this.scanNumber(start)
                    : newCharacterToken(start, this.index, $PERIOD);
            case $LPAREN:
            case $RPAREN:
            case $LBRACKET:
            case $RBRACKET:
            case $COMMA:
            case $COLON:
            case $SEMICOLON:
                return this.scanCharacter(start, peek);
            case $LBRACE:
                return this.scanOpenBrace(start, peek);
            case $RBRACE:
                return this.scanCloseBrace(start, peek);
            case $SQ:
            case $DQ:
                return this.scanString();
            case $BT:
                this.advance();
                return this.scanTemplateLiteralPart(start);
            case $HASH:
                return this.scanPrivateIdentifier();
            case $PLUS:
            case $MINUS:
            case $STAR:
            case $SLASH:
            case $PERCENT:
            case $CARET:
                return this.scanOperator(start, String.fromCharCode(peek));
            case $QUESTION:
                return this.scanQuestion(start);
            case $LT:
            case $GT:
                return this.scanComplexOperator(start, String.fromCharCode(peek), $EQ, '=');
            case $BANG:
            case $EQ:
                return this.scanComplexOperator(start, String.fromCharCode(peek), $EQ, '=', $EQ, '=');
            case $AMPERSAND:
                return this.scanComplexOperator(start, '&', $AMPERSAND, '&');
            case $BAR:
                return this.scanComplexOperator(start, '|', $BAR, '|');
            case $NBSP:
                while (isWhitespace(this.peek))
                    this.advance();
                return this.scanToken();
        }
        this.advance();
        return this.error(`Unexpected character [${String.fromCharCode(peek)}]`, 0);
    }
    scanCharacter(start, code) {
        this.advance();
        return newCharacterToken(start, this.index, code);
    }
    scanOperator(start, str) {
        this.advance();
        return newOperatorToken(start, this.index, str);
    }
    scanOpenBrace(start, code) {
        this.braceStack.push('expression');
        this.advance();
        return newCharacterToken(start, this.index, code);
    }
    scanCloseBrace(start, code) {
        this.advance();
        const currentBrace = this.braceStack.pop();
        if (currentBrace === 'interpolation') {
            this.tokens.push(newOperatorToken(start, this.index, '}'));
            return this.scanTemplateLiteralPart(this.index);
        }
        return newCharacterToken(start, this.index, code);
    }
    /**
     * Tokenize a 2/3 char long operator
     *
     * @param start start index in the expression
     * @param one first symbol (always part of the operator)
     * @param twoCode code point for the second symbol
     * @param two second symbol (part of the operator when the second code point matches)
     * @param threeCode code point for the third symbol
     * @param three third symbol (part of the operator when provided and matches source expression)
     */
    scanComplexOperator(start, one, twoCode, two, threeCode, three) {
        this.advance();
        let str = one;
        if (this.peek == twoCode) {
            this.advance();
            str += two;
        }
        if (threeCode != null && this.peek == threeCode) {
            this.advance();
            str += three;
        }
        return newOperatorToken(start, this.index, str);
    }
    scanIdentifier() {
        const start = this.index;
        this.advance();
        while (isIdentifierPart(this.peek))
            this.advance();
        const str = this.input.substring(start, this.index);
        return KEYWORDS.indexOf(str) > -1
            ? newKeywordToken(start, this.index, str)
            : newIdentifierToken(start, this.index, str);
    }
    /** Scans an ECMAScript private identifier. */
    scanPrivateIdentifier() {
        const start = this.index;
        this.advance();
        if (!isIdentifierStart(this.peek)) {
            return this.error('Invalid character [#]', -1);
        }
        while (isIdentifierPart(this.peek))
            this.advance();
        const identifierName = this.input.substring(start, this.index);
        return newPrivateIdentifierToken(start, this.index, identifierName);
    }
    scanNumber(start) {
        let simple = this.index === start;
        let hasSeparators = false;
        this.advance(); // Skip initial digit.
        while (true) {
            if (isDigit(this.peek)) ;
            else if (this.peek === $_) {
                // Separators are only valid when they're surrounded by digits. E.g. `1_0_1` is
                // valid while `_101` and `101_` are not. The separator can't be next to the decimal
                // point or another separator either. Note that it's unlikely that we'll hit a case where
                // the underscore is at the start, because that's a valid identifier and it will be picked
                // up earlier in the parsing. We validate for it anyway just in case.
                if (!isDigit(this.input.charCodeAt(this.index - 1)) ||
                    !isDigit(this.input.charCodeAt(this.index + 1))) {
                    return this.error('Invalid numeric separator', 0);
                }
                hasSeparators = true;
            }
            else if (this.peek === $PERIOD) {
                simple = false;
            }
            else if (isExponentStart(this.peek)) {
                this.advance();
                if (isExponentSign(this.peek))
                    this.advance();
                if (!isDigit(this.peek))
                    return this.error('Invalid exponent', -1);
                simple = false;
            }
            else {
                break;
            }
            this.advance();
        }
        let str = this.input.substring(start, this.index);
        if (hasSeparators) {
            str = str.replace(/_/g, '');
        }
        const value = simple ? parseIntAutoRadix(str) : parseFloat(str);
        return newNumberToken(start, this.index, value);
    }
    scanString() {
        const start = this.index;
        const quote = this.peek;
        this.advance(); // Skip initial quote.
        let buffer = '';
        let marker = this.index;
        const input = this.input;
        while (this.peek != quote) {
            if (this.peek == $BACKSLASH) {
                const result = this.scanStringBackslash(buffer, marker);
                if (typeof result !== 'string') {
                    return result; // Error
                }
                buffer = result;
                marker = this.index;
            }
            else if (this.peek == $EOF) {
                return this.error('Unterminated quote', 0);
            }
            else {
                this.advance();
            }
        }
        const last = input.substring(marker, this.index);
        this.advance(); // Skip terminating quote.
        return new StringToken(start, this.index, buffer + last, StringTokenKind.Plain);
    }
    scanQuestion(start) {
        this.advance();
        let str = '?';
        // Either `a ?? b` or 'a?.b'.
        if (this.peek === $QUESTION || this.peek === $PERIOD) {
            str += this.peek === $PERIOD ? '.' : '?';
            this.advance();
        }
        return newOperatorToken(start, this.index, str);
    }
    scanTemplateLiteralPart(start) {
        let buffer = '';
        let marker = this.index;
        while (this.peek !== $BT) {
            if (this.peek === $BACKSLASH) {
                const result = this.scanStringBackslash(buffer, marker);
                if (typeof result !== 'string') {
                    return result; // Error
                }
                buffer = result;
                marker = this.index;
            }
            else if (this.peek === $$) {
                const dollar = this.index;
                this.advance();
                // @ts-expect-error
                if (this.peek === $LBRACE) {
                    this.braceStack.push('interpolation');
                    this.tokens.push(new StringToken(start, dollar, buffer + this.input.substring(marker, dollar), StringTokenKind.TemplateLiteralPart));
                    this.advance();
                    return newOperatorToken(dollar, this.index, this.input.substring(dollar, this.index));
                }
            }
            else if (this.peek === $EOF) {
                return this.error('Unterminated template literal', 0);
            }
            else {
                this.advance();
            }
        }
        const last = this.input.substring(marker, this.index);
        this.advance();
        return new StringToken(start, this.index, buffer + last, StringTokenKind.TemplateLiteralEnd);
    }
    error(message, offset) {
        const position = this.index + offset;
        return newErrorToken(position, this.index, `Lexer Error: ${message} at column ${position} in expression [${this.input}]`);
    }
    scanStringBackslash(buffer, marker) {
        buffer += this.input.substring(marker, this.index);
        let unescapedCode;
        this.advance();
        if (this.peek === $u) {
            // 4 character hex code for unicode character.
            const hex = this.input.substring(this.index + 1, this.index + 5);
            if (/^[0-9a-f]+$/i.test(hex)) {
                unescapedCode = parseInt(hex, 16);
            }
            else {
                return this.error(`Invalid unicode escape [\\u${hex}]`, 0);
            }
            for (let i = 0; i < 5; i++) {
                this.advance();
            }
        }
        else {
            unescapedCode = unescape$1(this.peek);
            this.advance();
        }
        buffer += String.fromCharCode(unescapedCode);
        return buffer;
    }
}
function isIdentifierStart(code) {
    return (($a <= code && code <= $z) ||
        ($A <= code && code <= $Z) ||
        code == $_ ||
        code == $$);
}
function isIdentifierPart(code) {
    return isAsciiLetter(code) || isDigit(code) || code == $_ || code == $$;
}
function isExponentStart(code) {
    return code == $e || code == $E;
}
function isExponentSign(code) {
    return code == $MINUS || code == $PLUS;
}
function unescape$1(code) {
    switch (code) {
        case $n:
            return $LF;
        case $f:
            return $FF;
        case $r:
            return $CR;
        case $t:
            return $TAB;
        case $v:
            return $VTAB;
        default:
            return code;
    }
}
function parseIntAutoRadix(text) {
    const result = parseInt(text);
    if (isNaN(result)) {
        throw new Error('Invalid integer literal when parsing ' + text);
    }
    return result;
}

class SplitInterpolation {
    strings;
    expressions;
    offsets;
    constructor(strings, expressions, offsets) {
        this.strings = strings;
        this.expressions = expressions;
        this.offsets = offsets;
    }
}
class TemplateBindingParseResult {
    templateBindings;
    warnings;
    errors;
    constructor(templateBindings, warnings, errors) {
        this.templateBindings = templateBindings;
        this.warnings = warnings;
        this.errors = errors;
    }
}
class Parser {
    _lexer;
    errors = [];
    constructor(_lexer) {
        this._lexer = _lexer;
    }
    parseAction(input, location, absoluteOffset, interpolationConfig = DEFAULT_INTERPOLATION_CONFIG) {
        this._checkNoInterpolation(input, location, interpolationConfig);
        const sourceToLex = this._stripComments(input);
        const tokens = this._lexer.tokenize(sourceToLex);
        const ast = new _ParseAST(input, location, absoluteOffset, tokens, 1 /* ParseFlags.Action */, this.errors, 0).parseChain();
        return new ASTWithSource(ast, input, location, absoluteOffset, this.errors);
    }
    parseBinding(input, location, absoluteOffset, interpolationConfig = DEFAULT_INTERPOLATION_CONFIG) {
        const ast = this._parseBindingAst(input, location, absoluteOffset, interpolationConfig);
        return new ASTWithSource(ast, input, location, absoluteOffset, this.errors);
    }
    checkSimpleExpression(ast) {
        const checker = new SimpleExpressionChecker();
        ast.visit(checker);
        return checker.errors;
    }
    // Host bindings parsed here
    parseSimpleBinding(input, location, absoluteOffset, interpolationConfig = DEFAULT_INTERPOLATION_CONFIG) {
        const ast = this._parseBindingAst(input, location, absoluteOffset, interpolationConfig);
        const errors = this.checkSimpleExpression(ast);
        if (errors.length > 0) {
            this._reportError(`Host binding expression cannot contain ${errors.join(' ')}`, input, location);
        }
        return new ASTWithSource(ast, input, location, absoluteOffset, this.errors);
    }
    _reportError(message, input, errLocation, ctxLocation) {
        this.errors.push(new ParserError(message, input, errLocation, ctxLocation));
    }
    _parseBindingAst(input, location, absoluteOffset, interpolationConfig) {
        this._checkNoInterpolation(input, location, interpolationConfig);
        const sourceToLex = this._stripComments(input);
        const tokens = this._lexer.tokenize(sourceToLex);
        return new _ParseAST(input, location, absoluteOffset, tokens, 0 /* ParseFlags.None */, this.errors, 0).parseChain();
    }
    /**
     * Parse microsyntax template expression and return a list of bindings or
     * parsing errors in case the given expression is invalid.
     *
     * For example,
     * ```html
     *   <div *ngFor="let item of items">
     *         ^      ^ absoluteValueOffset for `templateValue`
     *         absoluteKeyOffset for `templateKey`
     * ```
     * contains three bindings:
     * 1. ngFor -> null
     * 2. item -> NgForOfContext.$implicit
     * 3. ngForOf -> items
     *
     * This is apparent from the de-sugared template:
     * ```html
     *   <ng-template ngFor let-item [ngForOf]="items">
     * ```
     *
     * @param templateKey name of directive, without the * prefix. For example: ngIf, ngFor
     * @param templateValue RHS of the microsyntax attribute
     * @param templateUrl template filename if it's external, component filename if it's inline
     * @param absoluteKeyOffset start of the `templateKey`
     * @param absoluteValueOffset start of the `templateValue`
     */
    parseTemplateBindings(templateKey, templateValue, templateUrl, absoluteKeyOffset, absoluteValueOffset) {
        const tokens = this._lexer.tokenize(templateValue);
        const parser = new _ParseAST(templateValue, templateUrl, absoluteValueOffset, tokens, 0 /* ParseFlags.None */, this.errors, 0 /* relative offset */);
        return parser.parseTemplateBindings({
            source: templateKey,
            span: new AbsoluteSourceSpan(absoluteKeyOffset, absoluteKeyOffset + templateKey.length),
        });
    }
    parseInterpolation(input, location, absoluteOffset, interpolatedTokens, interpolationConfig = DEFAULT_INTERPOLATION_CONFIG) {
        const { strings, expressions, offsets } = this.splitInterpolation(input, location, interpolatedTokens, interpolationConfig);
        if (expressions.length === 0)
            return null;
        const expressionNodes = [];
        for (let i = 0; i < expressions.length; ++i) {
            const expressionText = expressions[i].text;
            const sourceToLex = this._stripComments(expressionText);
            const tokens = this._lexer.tokenize(sourceToLex);
            const ast = new _ParseAST(input, location, absoluteOffset, tokens, 0 /* ParseFlags.None */, this.errors, offsets[i]).parseChain();
            expressionNodes.push(ast);
        }
        return this.createInterpolationAst(strings.map((s) => s.text), expressionNodes, input, location, absoluteOffset);
    }
    /**
     * Similar to `parseInterpolation`, but treats the provided string as a single expression
     * element that would normally appear within the interpolation prefix and suffix (`{{` and `}}`).
     * This is used for parsing the switch expression in ICUs.
     */
    parseInterpolationExpression(expression, location, absoluteOffset) {
        const sourceToLex = this._stripComments(expression);
        const tokens = this._lexer.tokenize(sourceToLex);
        const ast = new _ParseAST(expression, location, absoluteOffset, tokens, 0 /* ParseFlags.None */, this.errors, 0).parseChain();
        const strings = ['', '']; // The prefix and suffix strings are both empty
        return this.createInterpolationAst(strings, [ast], expression, location, absoluteOffset);
    }
    createInterpolationAst(strings, expressions, input, location, absoluteOffset) {
        const span = new ParseSpan(0, input.length);
        const interpolation = new Interpolation$1(span, span.toAbsolute(absoluteOffset), strings, expressions);
        return new ASTWithSource(interpolation, input, location, absoluteOffset, this.errors);
    }
    /**
     * Splits a string of text into "raw" text segments and expressions present in interpolations in
     * the string.
     * Returns `null` if there are no interpolations, otherwise a
     * `SplitInterpolation` with splits that look like
     *   <raw text> <expression> <raw text> ... <raw text> <expression> <raw text>
     */
    splitInterpolation(input, location, interpolatedTokens, interpolationConfig = DEFAULT_INTERPOLATION_CONFIG) {
        const strings = [];
        const expressions = [];
        const offsets = [];
        const inputToTemplateIndexMap = interpolatedTokens
            ? getIndexMapForOriginalTemplate(interpolatedTokens)
            : null;
        let i = 0;
        let atInterpolation = false;
        let extendLastString = false;
        let { start: interpStart, end: interpEnd } = interpolationConfig;
        while (i < input.length) {
            if (!atInterpolation) {
                // parse until starting {{
                const start = i;
                i = input.indexOf(interpStart, i);
                if (i === -1) {
                    i = input.length;
                }
                const text = input.substring(start, i);
                strings.push({ text, start, end: i });
                atInterpolation = true;
            }
            else {
                // parse from starting {{ to ending }} while ignoring content inside quotes.
                const fullStart = i;
                const exprStart = fullStart + interpStart.length;
                const exprEnd = this._getInterpolationEndIndex(input, interpEnd, exprStart);
                if (exprEnd === -1) {
                    // Could not find the end of the interpolation; do not parse an expression.
                    // Instead we should extend the content on the last raw string.
                    atInterpolation = false;
                    extendLastString = true;
                    break;
                }
                const fullEnd = exprEnd + interpEnd.length;
                const text = input.substring(exprStart, exprEnd);
                if (text.trim().length === 0) {
                    this._reportError('Blank expressions are not allowed in interpolated strings', input, `at column ${i} in`, location);
                }
                expressions.push({ text, start: fullStart, end: fullEnd });
                const startInOriginalTemplate = inputToTemplateIndexMap?.get(fullStart) ?? fullStart;
                const offset = startInOriginalTemplate + interpStart.length;
                offsets.push(offset);
                i = fullEnd;
                atInterpolation = false;
            }
        }
        if (!atInterpolation) {
            // If we are now at a text section, add the remaining content as a raw string.
            if (extendLastString) {
                const piece = strings[strings.length - 1];
                piece.text += input.substring(i);
                piece.end = input.length;
            }
            else {
                strings.push({ text: input.substring(i), start: i, end: input.length });
            }
        }
        return new SplitInterpolation(strings, expressions, offsets);
    }
    wrapLiteralPrimitive(input, location, absoluteOffset) {
        const span = new ParseSpan(0, input == null ? 0 : input.length);
        return new ASTWithSource(new LiteralPrimitive(span, span.toAbsolute(absoluteOffset), input), input, location, absoluteOffset, this.errors);
    }
    _stripComments(input) {
        const i = this._commentStart(input);
        return i != null ? input.substring(0, i) : input;
    }
    _commentStart(input) {
        let outerQuote = null;
        for (let i = 0; i < input.length - 1; i++) {
            const char = input.charCodeAt(i);
            const nextChar = input.charCodeAt(i + 1);
            if (char === $SLASH && nextChar == $SLASH && outerQuote == null)
                return i;
            if (outerQuote === char) {
                outerQuote = null;
            }
            else if (outerQuote == null && isQuote(char)) {
                outerQuote = char;
            }
        }
        return null;
    }
    _checkNoInterpolation(input, location, { start, end }) {
        let startIndex = -1;
        let endIndex = -1;
        for (const charIndex of this._forEachUnquotedChar(input, 0)) {
            if (startIndex === -1) {
                if (input.startsWith(start)) {
                    startIndex = charIndex;
                }
            }
            else {
                endIndex = this._getInterpolationEndIndex(input, end, charIndex);
                if (endIndex > -1) {
                    break;
                }
            }
        }
        if (startIndex > -1 && endIndex > -1) {
            this._reportError(`Got interpolation (${start}${end}) where expression was expected`, input, `at column ${startIndex} in`, location);
        }
    }
    /**
     * Finds the index of the end of an interpolation expression
     * while ignoring comments and quoted content.
     */
    _getInterpolationEndIndex(input, expressionEnd, start) {
        for (const charIndex of this._forEachUnquotedChar(input, start)) {
            if (input.startsWith(expressionEnd, charIndex)) {
                return charIndex;
            }
            // Nothing else in the expression matters after we've
            // hit a comment so look directly for the end token.
            if (input.startsWith('//', charIndex)) {
                return input.indexOf(expressionEnd, charIndex);
            }
        }
        return -1;
    }
    /**
     * Generator used to iterate over the character indexes of a string that are outside of quotes.
     * @param input String to loop through.
     * @param start Index within the string at which to start.
     */
    *_forEachUnquotedChar(input, start) {
        let currentQuote = null;
        let escapeCount = 0;
        for (let i = start; i < input.length; i++) {
            const char = input[i];
            // Skip the characters inside quotes. Note that we only care about the outer-most
            // quotes matching up and we need to account for escape characters.
            if (isQuote(input.charCodeAt(i)) &&
                (currentQuote === null || currentQuote === char) &&
                escapeCount % 2 === 0) {
                currentQuote = currentQuote === null ? char : null;
            }
            else if (currentQuote === null) {
                yield i;
            }
            escapeCount = char === '\\' ? escapeCount + 1 : 0;
        }
    }
}
/** Describes a stateful context an expression parser is in. */
var ParseContextFlags;
(function (ParseContextFlags) {
    ParseContextFlags[ParseContextFlags["None"] = 0] = "None";
    /**
     * A Writable context is one in which a value may be written to an lvalue.
     * For example, after we see a property access, we may expect a write to the
     * property via the "=" operator.
     *   prop
     *        ^ possible "=" after
     */
    ParseContextFlags[ParseContextFlags["Writable"] = 1] = "Writable";
})(ParseContextFlags || (ParseContextFlags = {}));
class _ParseAST {
    input;
    location;
    absoluteOffset;
    tokens;
    parseFlags;
    errors;
    offset;
    rparensExpected = 0;
    rbracketsExpected = 0;
    rbracesExpected = 0;
    context = ParseContextFlags.None;
    // Cache of expression start and input indeces to the absolute source span they map to, used to
    // prevent creating superfluous source spans in `sourceSpan`.
    // A serial of the expression start and input index is used for mapping because both are stateful
    // and may change for subsequent expressions visited by the parser.
    sourceSpanCache = new Map();
    index = 0;
    constructor(input, location, absoluteOffset, tokens, parseFlags, errors, offset) {
        this.input = input;
        this.location = location;
        this.absoluteOffset = absoluteOffset;
        this.tokens = tokens;
        this.parseFlags = parseFlags;
        this.errors = errors;
        this.offset = offset;
    }
    peek(offset) {
        const i = this.index + offset;
        return i < this.tokens.length ? this.tokens[i] : EOF;
    }
    get next() {
        return this.peek(0);
    }
    /** Whether all the parser input has been processed. */
    get atEOF() {
        return this.index >= this.tokens.length;
    }
    /**
     * Index of the next token to be processed, or the end of the last token if all have been
     * processed.
     */
    get inputIndex() {
        return this.atEOF ? this.currentEndIndex : this.next.index + this.offset;
    }
    /**
     * End index of the last processed token, or the start of the first token if none have been
     * processed.
     */
    get currentEndIndex() {
        if (this.index > 0) {
            const curToken = this.peek(-1);
            return curToken.end + this.offset;
        }
        // No tokens have been processed yet; return the next token's start or the length of the input
        // if there is no token.
        if (this.tokens.length === 0) {
            return this.input.length + this.offset;
        }
        return this.next.index + this.offset;
    }
    /**
     * Returns the absolute offset of the start of the current token.
     */
    get currentAbsoluteOffset() {
        return this.absoluteOffset + this.inputIndex;
    }
    /**
     * Retrieve a `ParseSpan` from `start` to the current position (or to `artificialEndIndex` if
     * provided).
     *
     * @param start Position from which the `ParseSpan` will start.
     * @param artificialEndIndex Optional ending index to be used if provided (and if greater than the
     *     natural ending index)
     */
    span(start, artificialEndIndex) {
        let endIndex = this.currentEndIndex;
        if (artificialEndIndex !== undefined && artificialEndIndex > this.currentEndIndex) {
            endIndex = artificialEndIndex;
        }
        // In some unusual parsing scenarios (like when certain tokens are missing and an `EmptyExpr` is
        // being created), the current token may already be advanced beyond the `currentEndIndex`. This
        // appears to be a deep-seated parser bug.
        //
        // As a workaround for now, swap the start and end indices to ensure a valid `ParseSpan`.
        // TODO(alxhub): fix the bug upstream in the parser state, and remove this workaround.
        if (start > endIndex) {
            const tmp = endIndex;
            endIndex = start;
            start = tmp;
        }
        return new ParseSpan(start, endIndex);
    }
    sourceSpan(start, artificialEndIndex) {
        const serial = `${start}@${this.inputIndex}:${artificialEndIndex}`;
        if (!this.sourceSpanCache.has(serial)) {
            this.sourceSpanCache.set(serial, this.span(start, artificialEndIndex).toAbsolute(this.absoluteOffset));
        }
        return this.sourceSpanCache.get(serial);
    }
    advance() {
        this.index++;
    }
    /**
     * Executes a callback in the provided context.
     */
    withContext(context, cb) {
        this.context |= context;
        const ret = cb();
        this.context ^= context;
        return ret;
    }
    consumeOptionalCharacter(code) {
        if (this.next.isCharacter(code)) {
            this.advance();
            return true;
        }
        else {
            return false;
        }   
    }
    peekKeywordLet() {
        return this.next.isKeywordLet();
    }
    peekKeywordAs() {
        return this.next.isKeywordAs();
    }
    /**
     * Consumes an expected character, otherwise emits an error about the missing expected character
     * and skips over the token stream until reaching a recoverable point.
     *
     * See `this.error` and `this.skip` for more details.
     */
    expectCharacter(code) {
        if (this.consumeOptionalCharacter(code))
            return;
        this.error(`Missing expected ${String.fromCharCode(code)}`);
    }
    consumeOptionalOperator(op) {
        if (this.next.isOperator(op)) {
            this.advance();
            return true;
        }
        else {
            return false;
        }
    }
    expectOperator(operator) {
        if (this.consumeOptionalOperator(operator))
            return;
        this.error(`Missing expected operator ${operator}`);
    }
    prettyPrintToken(tok) {
        return tok === EOF ? 'end of input' : `token ${tok}`;
    }
    expectIdentifierOrKeyword() {
        const n = this.next;
        if (!n.isIdentifier() && !n.isKeyword()) {
            if (n.isPrivateIdentifier()) {
                this._reportErrorForPrivateIdentifier(n, 'expected identifier or keyword');
            }
            else {
                this.error(`Unexpected ${this.prettyPrintToken(n)}, expected identifier or keyword`);
            }
            return null;
        }
        this.advance();
        return n.toString();
    }
    expectIdentifierOrKeywordOrString() {
        const n = this.next;
        if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) {
            if (n.isPrivateIdentifier()) {
                this._reportErrorForPrivateIdentifier(n, 'expected identifier, keyword or string');
            }
            else {
                this.error(`Unexpected ${this.prettyPrintToken(n)}, expected identifier, keyword, or string`);
            }
            return '';
        }
        this.advance();
        return n.toString();
    }
    parseChain() {
        const exprs = [];
        const start = this.inputIndex;
        while (this.index < this.tokens.length) {
            const expr = this.parsePipe();
            exprs.push(expr);
            if (this.consumeOptionalCharacter($SEMICOLON)) {
                if (!(this.parseFlags & 1 /* ParseFlags.Action */)) {
                    this.error('Binding expression cannot contain chained expression');
                }
                while (this.consumeOptionalCharacter($SEMICOLON)) { } // read all semicolons
            }
            else if (this.index < this.tokens.length) {
                const errorIndex = this.index;
                this.error(`Unexpected token '${this.next}'`);
                // The `error` call above will skip ahead to the next recovery point in an attempt to
                // recover part of the expression, but that might be the token we started from which will
                // lead to an infinite loop. If that's the case, break the loop assuming that we can't
                // parse further.
                if (this.index === errorIndex) {
                    break;
                }
            }
        }
        if (exprs.length === 0) {
            // We have no expressions so create an empty expression that spans the entire input length
            const artificialStart = this.offset;
            const artificialEnd = this.offset + this.input.length;
            return new EmptyExpr$1(this.span(artificialStart, artificialEnd), this.sourceSpan(artificialStart, artificialEnd));
        }
        if (exprs.length == 1)
            return exprs[0];
        return new Chain(this.span(start), this.sourceSpan(start), exprs);
    }
    parsePipe() {
        const start = this.inputIndex;
        let result = this.parseExpression();
        if (this.consumeOptionalOperator('|')) {
            if (this.parseFlags & 1 /* ParseFlags.Action */) {
                this.error(`Cannot have a pipe in an action expression`);
            }
            do {
                const nameStart = this.inputIndex;
                let nameId = this.expectIdentifierOrKeyword();
                let nameSpan;
                let fullSpanEnd = undefined;
                if (nameId !== null) {
                    nameSpan = this.sourceSpan(nameStart);
                }
                else {
                    // No valid identifier was found, so we'll assume an empty pipe name ('').
                    nameId = '';
                    // However, there may have been whitespace present between the pipe character and the next
                    // token in the sequence (or the end of input). We want to track this whitespace so that
                    // the `BindingPipe` we produce covers not just the pipe character, but any trailing
                    // whitespace beyond it. Another way of thinking about this is that the zero-length name
                    // is assumed to be at the end of any whitespace beyond the pipe character.
                    //
                    // Therefore, we push the end of the `ParseSpan` for this pipe all the way up to the
                    // beginning of the next token, or until the end of input if the next token is EOF.
                    fullSpanEnd = this.next.index !== -1 ? this.next.index : this.input.length + this.offset;
                    // The `nameSpan` for an empty pipe name is zero-length at the end of any whitespace
                    // beyond the pipe character.
                    nameSpan = new ParseSpan(fullSpanEnd, fullSpanEnd).toAbsolute(this.absoluteOffset);
                }
                const args = [];
                while (this.consumeOptionalCharacter($COLON)) {
                    args.push(this.parseExpression());
                    // If there are additional expressions beyond the name, then the artificial end for the
                    // name is no longer relevant.
                }
                result = new BindingPipe(this.span(start), this.sourceSpan(start, fullSpanEnd), result, nameId, args, nameSpan);
            } while (this.consumeOptionalOperator('|'));
        }
        return result;
    }
    parseExpression() {
        return this.parseConditional();
    }
    parseConditional() {
        const start = this.inputIndex;
        const result = this.parseLogicalOr();
        if (this.consumeOptionalOperator('?')) {
            const yes = this.parsePipe();
            let no;
            if (!this.consumeOptionalCharacter($COLON)) {
                const end = this.inputIndex;
                const expression = this.input.substring(start, end);
                this.error(`Conditional expression ${expression} requires all 3 expressions`);
                no = new EmptyExpr$1(this.span(start), this.sourceSpan(start));
            }
            else {
                no = this.parsePipe();
            }
            return new Conditional(this.span(start), this.sourceSpan(start), result, yes, no);
        }
        else {
            return result;
        }
    }
    parseLogicalOr() {
        // '||'
        const start = this.inputIndex;
        let result = this.parseLogicalAnd();
        while (this.consumeOptionalOperator('||')) {
            const right = this.parseLogicalAnd();
            result = new Binary(this.span(start), this.sourceSpan(start), '||', result, right);
        }
        return result;
    }
    parseLogicalAnd() {
        // '&&'
        const start = this.inputIndex;
        let result = this.parseNullishCoalescing();
        while (this.consumeOptionalOperator('&&')) {
            const right = this.parseNullishCoalescing();
            result = new Binary(this.span(start), this.sourceSpan(start), '&&', result, right);
        }
        return result;
    }
    parseNullishCoalescing() {
        // '??'
        const start = this.inputIndex;
        let result = this.parseEquality();
        while (this.consumeOptionalOperator('??')) {
            const right = this.parseEquality();
            result = new Binary(this.span(start), this.sourceSpan(start), '??', result, right);
        }
        return result;
    }
    parseEquality() {
        // '==','!=','===','!=='
        const start = this.inputIndex;
        let result = this.parseRelational();
        while (this.next.type == TokenType.Operator) {
            const operator = this.next.strValue;
            switch (operator) {
                case '==':
                case '===':
                case '!=':
                case '!==':
                    this.advance();
                    const right = this.parseRelational();
                    result = new Binary(this.span(start), this.sourceSpan(start), operator, result, right);
                    continue;
            }
            break;
        }
        return result;
    }
    parseRelational() {
        // '<', '>', '<=', '>='
        const start = this.inputIndex;
        let result = this.parseAdditive();
        while (this.next.type == TokenType.Operator) {
            const operator = this.next.strValue;
            switch (operator) {
                case '<':
                case '>':
                case '<=':
                case '>=':
                    this.advance();
                    const right = this.parseAdditive();
                    result = new Binary(this.span(start), this.sourceSpan(start), operator, result, right);
                    continue;
            }
            break;
        }
        return result;
    }
    parseAdditive() {
        // '+', '-'
        const start = this.inputIndex;
        let result = this.parseMultiplicative();
        while (this.next.type == TokenType.Operator) {
            const operator = this.next.strValue;
            switch (operator) {
                case '+':
                case '-':
                    this.advance();
                    let right = this.parseMultiplicative();
                    result = new Binary(this.span(start), this.sourceSpan(start), operator, result, right);
                    continue;
            }
            break;
        }
        return result;
    }
    parseMultiplicative() {
        // '*', '%', '/'
        const start = this.inputIndex;
        let result = this.parsePrefix();
        while (this.next.type == TokenType.Operator) {
            const operator = this.next.strValue;
            switch (operator) {
                case '*':
                case '%':
                case '/':
                    this.advance();
                    let right = this.parsePrefix();
                    result = new Binary(this.span(start), this.sourceSpan(start), operator, result, right);
                    continue;
            }
            break;
        }
        return result;
    }
    parsePrefix() {
        if (this.next.type == TokenType.Operator) {
            const start = this.inputIndex;
            const operator = this.next.strValue;
            let result;
            switch (operator) {
                case '+':
                    this.advance();
                    result = this.parsePrefix();
                    return Unary.createPlus(this.span(start), this.sourceSpan(start), result);
                case '-':
                    this.advance();
                    result = this.parsePrefix();
                    return Unary.createMinus(this.span(start), this.sourceSpan(start), result);
                case '!':
                    this.advance();
                    result = this.parsePrefix();
                    return new PrefixNot(this.span(start), this.sourceSpan(start), result);
            }
        }
        else if (this.next.isKeywordTypeof()) {
            this.advance();
            const start = this.inputIndex;
            let result = this.parsePrefix();
            return new TypeofExpression(this.span(start), this.sourceSpan(start), result);
        }
        return this.parseCallChain();
    }
    parseCallChain() {
        const start = this.inputIndex;
        let result = this.parsePrimary();
        while (true) {
            if (this.consumeOptionalCharacter($PERIOD)) {
                result = this.parseAccessMember(result, start, false);
            }
            else if (this.consumeOptionalOperator('?.')) {
                if (this.consumeOptionalCharacter($LPAREN)) {
                    result = this.parseCall(result, start, true);
                }
                else {
                    result = this.consumeOptionalCharacter($LBRACKET)
                        ? this.parseKeyedReadOrWrite(result, start, true)
                        : this.parseAccessMember(result, start, true);
                }
            }
            else if (this.consumeOptionalCharacter($LBRACKET)) {
                result = this.parseKeyedReadOrWrite(result, start, false);
            }
            else if (this.consumeOptionalCharacter($LPAREN)) {
                result = this.parseCall(result, start, false);
            }
            else if (this.consumeOptionalOperator('!')) {
                result = new NonNullAssert(this.span(start), this.sourceSpan(start), result);
            }
            else {
                return result;
            }
        }
    }
    parsePrimary() {
        const start = this.inputIndex;
        if (this.consumeOptionalCharacter($LPAREN)) {
            this.rparensExpected++;
            const result = this.parsePipe();
            this.rparensExpected--;
            this.expectCharacter($RPAREN);
            return result;
        }
        else if (this.next.isKeywordNull()) {
            this.advance();
            return new LiteralPrimitive(this.span(start), this.sourceSpan(start), null);
        }
        else if (this.next.isKeywordUndefined()) {
            this.advance();
            return new LiteralPrimitive(this.span(start), this.sourceSpan(start), void 0);
        }
        else if (this.next.isKeywordTrue()) {
            this.advance();
            return new LiteralPrimitive(this.span(start), this.sourceSpan(start), true);
        }
        else if (this.next.isKeywordFalse()) {
            this.advance();
            return new LiteralPrimitive(this.span(start), this.sourceSpan(start), false);
        }
        else if (this.next.isKeywordThis()) {
            this.advance();
            return new ThisReceiver(this.span(start), this.sourceSpan(start));
        }
        else if (this.consumeOptionalCharacter($LBRACKET)) {
            this.rbracketsExpected++;
            const elements = this.parseExpressionList($RBRACKET);
            this.rbracketsExpected--;
            this.expectCharacter($RBRACKET);
            return new LiteralArray(this.span(start), this.sourceSpan(start), elements);
        }
        else if (this.next.isCharacter($LBRACE)) {
            return this.parseLiteralMap();
        }
        else if (this.next.isIdentifier()) {
            return this.parseAccessMember(new ImplicitReceiver(this.span(start), this.sourceSpan(start)), start, false);
        }
        else if (this.next.isNumber()) {
            const value = this.next.toNumber();
            this.advance();
            return new LiteralPrimitive(this.span(start), this.sourceSpan(start), value);
        }
        else if (this.next.isTemplateLiteralEnd()) {
            return this.parseNoInterpolationTemplateLiteral();
        }
        else if (this.next.isTemplateLiteralPart()) {
            return this.parseTemplateLiteral();
        }
        else if (this.next.isString() && this.next.kind === StringTokenKind.Plain) {
            const literalValue = this.next.toString();
            this.advance();
            return new LiteralPrimitive(this.span(start), this.sourceSpan(start), literalValue);
        }
        else if (this.next.isPrivateIdentifier()) {
            this._reportErrorForPrivateIdentifier(this.next, null);
            return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
        }
        else if (this.index >= this.tokens.length) {
            this.error(`Unexpected end of expression: ${this.input}`);
            return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
        }
        else {
            this.error(`Unexpected token ${this.next}`);
            return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
        }
    }
    parseExpressionList(terminator) {
        const result = [];
        do {
            if (!this.next.isCharacter(terminator)) {
                result.push(this.parsePipe());
            }
            else {
                break;
            }
        } while (this.consumeOptionalCharacter($COMMA));
        return result;
    }
    parseLiteralMap() {
        const keys = [];
        const values = [];
        const start = this.inputIndex;
        this.expectCharacter($LBRACE);
        if (!this.consumeOptionalCharacter($RBRACE)) {
            this.rbracesExpected++;
            do {
                const keyStart = this.inputIndex;
                const quoted = this.next.isString();
                const key = this.expectIdentifierOrKeywordOrString();
                const literalMapKey = { key, quoted };
                keys.push(literalMapKey);
                // Properties with quoted keys can't use the shorthand syntax.
                if (quoted) {
                    this.expectCharacter($COLON);
                    values.push(this.parsePipe());
                }
                else if (this.consumeOptionalCharacter($COLON)) {
                    values.push(this.parsePipe());
                }
                else {
                    literalMapKey.isShorthandInitialized = true;
                    const span = this.span(keyStart);
                    const sourceSpan = this.sourceSpan(keyStart);
                    values.push(new PropertyRead(span, sourceSpan, sourceSpan, new ImplicitReceiver(span, sourceSpan), key));
                }
            } while (this.consumeOptionalCharacter($COMMA) &&
                !this.next.isCharacter($RBRACE));
            this.rbracesExpected--;
            this.expectCharacter($RBRACE);
        }
        return new LiteralMap(this.span(start), this.sourceSpan(start), keys, values);
    }
    parseAccessMember(readReceiver, start, isSafe) {
        const nameStart = this.inputIndex;
        const id = this.withContext(ParseContextFlags.Writable, () => {
            const id = this.expectIdentifierOrKeyword() ?? '';
            if (id.length === 0) {
                this.error(`Expected identifier for property access`, readReceiver.span.end);
            }
            return id;
        });
        const nameSpan = this.sourceSpan(nameStart);
        let receiver;
        if (isSafe) {
            if (this.consumeOptionalOperator('=')) {
                this.error("The '?.' operator cannot be used in the assignment");
                receiver = new EmptyExpr$1(this.span(start), this.sourceSpan(start));
            }
            else {
                receiver = new SafePropertyRead(this.span(start), this.sourceSpan(start), nameSpan, readReceiver, id);
            }
        }
        else {
            if (this.consumeOptionalOperator('=')) {
                if (!(this.parseFlags & 1 /* ParseFlags.Action */)) {
                    this.error('Bindings cannot contain assignments');
                    return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
                }
                const value = this.parseConditional();
                receiver = new PropertyWrite(this.span(start), this.sourceSpan(start), nameSpan, readReceiver, id, value);
            }
            else {
                receiver = new PropertyRead(this.span(start), this.sourceSpan(start), nameSpan, readReceiver, id);
            }
        }
        return receiver;
    }
    parseCall(receiver, start, isSafe) {
        const argumentStart = this.inputIndex;
        this.rparensExpected++;
        const args = this.parseCallArguments();
        const argumentSpan = this.span(argumentStart, this.inputIndex).toAbsolute(this.absoluteOffset);
        this.expectCharacter($RPAREN);
        this.rparensExpected--;
        const span = this.span(start);
        const sourceSpan = this.sourceSpan(start);
        return isSafe
            ? new SafeCall(span, sourceSpan, receiver, args, argumentSpan)
            : new Call(span, sourceSpan, receiver, args, argumentSpan);
    }
    parseCallArguments() {
        if (this.next.isCharacter($RPAREN))
            return [];
        const positionals = [];
        do {
            positionals.push(this.parsePipe());
        } while (this.consumeOptionalCharacter($COMMA));
        return positionals;
    }
    /**
     * Parses an identifier, a keyword, a string with an optional `-` in between,
     * and returns the string along with its absolute source span.
     */
    expectTemplateBindingKey() {
        let result = '';
        let operatorFound = false;
        const start = this.currentAbsoluteOffset;
        do {
            result += this.expectIdentifierOrKeywordOrString();
            operatorFound = this.consumeOptionalOperator('-');
            if (operatorFound) {
                result += '-';
            }
        } while (operatorFound);
        return {
            source: result,
            span: new AbsoluteSourceSpan(start, start + result.length),
        };
    }
    /**
     * Parse microsyntax template expression and return a list of bindings or
     * parsing errors in case the given expression is invalid.
     *
     * For example,
     * ```html
     *   <div *ngFor="let item of items; index as i; trackBy: func">
     * ```
     * contains five bindings:
     * 1. ngFor -> null
     * 2. item -> NgForOfContext.$implicit
     * 3. ngForOf -> items
     * 4. i -> NgForOfContext.index
     * 5. ngForTrackBy -> func
     *
     * For a full description of the microsyntax grammar, see
     * https://gist.github.com/mhevery/d3530294cff2e4a1b3fe15ff75d08855
     *
     * @param templateKey name of the microsyntax directive, like ngIf, ngFor,
     * without the *, along with its absolute span.
     */
    parseTemplateBindings(templateKey) {
        const bindings = [];
        // The first binding is for the template key itself
        // In *ngFor="let item of items", key = "ngFor", value = null
        // In *ngIf="cond | pipe", key = "ngIf", value = "cond | pipe"
        bindings.push(...this.parseDirectiveKeywordBindings(templateKey));
        while (this.index < this.tokens.length) {
            // If it starts with 'let', then this must be variable declaration
            const letBinding = this.parseLetBinding();
            if (letBinding) {
                bindings.push(letBinding);
            }
            else {
                // Two possible cases here, either `value "as" key` or
                // "directive-keyword expression". We don't know which case, but both
                // "value" and "directive-keyword" are template binding key, so consume
                // the key first.
                const key = this.expectTemplateBindingKey();
                // Peek at the next token, if it is "as" then this must be variable
                // declaration.
                const binding = this.parseAsBinding(key);
                if (binding) {
                    bindings.push(binding);
                }
                else {
                    // Otherwise the key must be a directive keyword, like "of". Transform
                    // the key to actual key. Eg. of -> ngForOf, trackBy -> ngForTrackBy
                    key.source =
                        templateKey.source + key.source.charAt(0).toUpperCase() + key.source.substring(1);
                    bindings.push(...this.parseDirectiveKeywordBindings(key));
                }
            }
            this.consumeStatementTerminator();
        }
        return new TemplateBindingParseResult(bindings, [] /* warnings */, this.errors);
    }
    parseKeyedReadOrWrite(receiver, start, isSafe) {
        return this.withContext(ParseContextFlags.Writable, () => {
            this.rbracketsExpected++;
            const key = this.parsePipe();
            if (key instanceof EmptyExpr$1) {
                this.error(`Key access cannot be empty`);
            }
            this.rbracketsExpected--;
            this.expectCharacter($RBRACKET);
            if (this.consumeOptionalOperator('=')) {
                if (isSafe) {
                    this.error("The '?.' operator cannot be used in the assignment");
                }
                else {
                    const value = this.parseConditional();
                    return new KeyedWrite(this.span(start), this.sourceSpan(start), receiver, key, value);
                }
            }
            else {
                return isSafe
                    ? new SafeKeyedRead(this.span(start), this.sourceSpan(start), receiver, key)
                    : new KeyedRead(this.span(start), this.sourceSpan(start), receiver, key);
            }
            return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
        });
    }
    /**
     * Parse a directive keyword, followed by a mandatory expression.
     * For example, "of items", "trackBy: func".
     * The bindings are: ngForOf -> items, ngForTrackBy -> func
     * There could be an optional "as" binding that follows the expression.
     * For example,
     * ```
     *   *ngFor="let item of items | slice:0:1 as collection".
     *                    ^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^
     *               keyword    bound target   optional 'as' binding
     * ```
     *
     * @param key binding key, for example, ngFor, ngIf, ngForOf, along with its
     * absolute span.
     */
    parseDirectiveKeywordBindings(key) {
        const bindings = [];
        this.consumeOptionalCharacter($COLON); // trackBy: trackByFunction
        const value = this.getDirectiveBoundTarget();
        let spanEnd = this.currentAbsoluteOffset;
        // The binding could optionally be followed by "as". For example,
        // *ngIf="cond | pipe as x". In this case, the key in the "as" binding
        // is "x" and the value is the template key itself ("ngIf"). Note that the
        // 'key' in the current context now becomes the "value" in the next binding.
        const asBinding = this.parseAsBinding(key);
        if (!asBinding) {
            this.consumeStatementTerminator();
            spanEnd = this.currentAbsoluteOffset;
        }
        const sourceSpan = new AbsoluteSourceSpan(key.span.start, spanEnd);
        bindings.push(new ExpressionBinding(sourceSpan, key, value));
        if (asBinding) {
            bindings.push(asBinding);
        }
        return bindings;
    }
    /**
     * Return the expression AST for the bound target of a directive keyword
     * binding. For example,
     * ```
     *   *ngIf="condition | pipe"
     *          ^^^^^^^^^^^^^^^^ bound target for "ngIf"
     *   *ngFor="let item of items"
     *                       ^^^^^ bound target for "ngForOf"
     * ```
     */
    getDirectiveBoundTarget() {
        if (this.next === EOF || this.peekKeywordAs() || this.peekKeywordLet()) {
            return null;
        }
        const ast = this.parsePipe(); // example: "condition | async"
        const { start, end } = ast.span;
        const value = this.input.substring(start, end);
        return new ASTWithSource(ast, value, this.location, this.absoluteOffset + start, this.errors);
    }
    /**
     * Return the binding for a variable declared using `as`. Note that the order
     * of the key-value pair in this declaration is reversed. For example,
     * ```
     *   *ngFor="let item of items; index as i"
     *                              ^^^^^    ^
     *                              value    key
     * ```
     *
     * @param value name of the value in the declaration, "ngIf" in the example
     * above, along with its absolute span.
     */
    parseAsBinding(value) {
        if (!this.peekKeywordAs()) {
            return null;
        }
        this.advance(); // consume the 'as' keyword
        const key = this.expectTemplateBindingKey();
        this.consumeStatementTerminator();
        const sourceSpan = new AbsoluteSourceSpan(value.span.start, this.currentAbsoluteOffset);
        return new VariableBinding(sourceSpan, key, value);
    }
    /**
     * Return the binding for a variable declared using `let`. For example,
     * ```
     *   *ngFor="let item of items; let i=index;"
     *           ^^^^^^^^           ^^^^^^^^^^^
     * ```
     * In the first binding, `item` is bound to `NgForOfContext.$implicit`.
     * In the second binding, `i` is bound to `NgForOfContext.index`.
     */
    parseLetBinding() {
        if (!this.peekKeywordLet()) {
            return null;
        }
        const spanStart = this.currentAbsoluteOffset;
        this.advance(); // consume the 'let' keyword
        const key = this.expectTemplateBindingKey();
        let value = null;
        if (this.consumeOptionalOperator('=')) {
            value = this.expectTemplateBindingKey();
        }
        this.consumeStatementTerminator();
        const sourceSpan = new AbsoluteSourceSpan(spanStart, this.currentAbsoluteOffset);
        return new VariableBinding(sourceSpan, key, value);
    }
    parseNoInterpolationTemplateLiteral() {
        const text = this.next.strValue;
        const start = this.inputIndex;
        this.advance();
        const span = this.span(start);
        const sourceSpan = this.sourceSpan(start);
        return new TemplateLiteral(span, sourceSpan, [new TemplateLiteralElement(span, sourceSpan, text)], []);
    }
    parseTemplateLiteral() {
        const start = this.inputIndex;
        const elements = [];
        const expressions = [];
        while (this.next !== EOF) {
            const token = this.next;
            if (token.isTemplateLiteralPart() || token.isTemplateLiteralEnd()) {
                const partStart = this.inputIndex;
                this.advance();
                elements.push(new TemplateLiteralElement(this.span(partStart), this.sourceSpan(partStart), token.strValue));
                if (token.isTemplateLiteralEnd()) {
                    break;
                }
            }
            else if (token.isTemplateLiteralInterpolationStart()) {
                this.advance();
                const expression = this.parsePipe();
                if (expression instanceof EmptyExpr$1) {
                    this.error('Template literal interpolation cannot be empty');
                }
                else {
                    expressions.push(expression);
                }
            }
            else {
                this.advance();
            }
        }
        return new TemplateLiteral(this.span(start), this.sourceSpan(start), elements, expressions);
    }
    /**
     * Consume the optional statement terminator: semicolon or comma.
     */
    consumeStatementTerminator() {
        this.consumeOptionalCharacter($SEMICOLON) || this.consumeOptionalCharacter($COMMA);
    }
    /**
     * Records an error and skips over the token stream until reaching a recoverable point. See
     * `this.skip` for more details on token skipping.
     */
    error(message, index = null) {
        this.errors.push(new ParserError(message, this.input, this.locationText(index), this.location));
        this.skip();
    }
    locationText(index = null) {
        if (index == null)
            index = this.index;
        return index < this.tokens.length
            ? `at column ${this.tokens[index].index + 1} in`
            : `at the end of the expression`;
    }
    /**
     * Records an error for an unexpected private identifier being discovered.
     * @param token Token representing a private identifier.
     * @param extraMessage Optional additional message being appended to the error.
     */
    _reportErrorForPrivateIdentifier(token, extraMessage) {
        let errorMessage = `Private identifiers are not supported. Unexpected private identifier: ${token}`;
        if (extraMessage !== null) {
            errorMessage += `, ${extraMessage}`;
        }
        this.error(errorMessage);
    }
    /**
     * Error recovery should skip tokens until it encounters a recovery point.
     *
     * The following are treated as unconditional recovery points:
     *   - end of input
     *   - ';' (parseChain() is always the root production, and it expects a ';')
     *   - '|' (since pipes may be chained and each pipe expression may be treated independently)
     *
     * The following are conditional recovery points:
     *   - ')', '}', ']' if one of calling productions is expecting one of these symbols
     *     - This allows skip() to recover from errors such as '(a.) + 1' allowing more of the AST to
     *       be retained (it doesn't skip any tokens as the ')' is retained because of the '(' begins
     *       an '(' <expr> ')' production).
     *       The recovery points of grouping symbols must be conditional as they must be skipped if
     *       none of the calling productions are not expecting the closing token else we will never
     *       make progress in the case of an extraneous group closing symbol (such as a stray ')').
     *       That is, we skip a closing symbol if we are not in a grouping production.
     *   - '=' in a `Writable` context
     *     - In this context, we are able to recover after seeing the `=` operator, which
     *       signals the presence of an independent rvalue expression following the `=` operator.
     *
     * If a production expects one of these token it increments the corresponding nesting count,
     * and then decrements it just prior to checking if the token is in the input.
     */
    skip() {
        let n = this.next;
        while (this.index < this.tokens.length &&
            !n.isCharacter($SEMICOLON) &&
            !n.isOperator('|') &&
            (this.rparensExpected <= 0 || !n.isCharacter($RPAREN)) &&
            (this.rbracesExpected <= 0 || !n.isCharacter($RBRACE)) &&
            (this.rbracketsExpected <= 0 || !n.isCharacter($RBRACKET)) &&
            (!(this.context & ParseContextFlags.Writable) || !n.isOperator('='))) {
            if (this.next.isError()) {
                this.errors.push(new ParserError(this.next.toString(), this.input, this.locationText(), this.location));
            }
            this.advance();
            n = this.next;
        }
    }
}
class SimpleExpressionChecker extends RecursiveAstVisitor {
    errors = [];
    visitPipe() {
        this.errors.push('pipes');
    }
}
/**
 * Computes the real offset in the original template for indexes in an interpolation.
 *
 * Because templates can have encoded HTML entities and the input passed to the parser at this stage
 * of the compiler is the _decoded_ value, we need to compute the real offset using the original
 * encoded values in the interpolated tokens. Note that this is only a special case handling for
 * `MlParserTokenType.ENCODED_ENTITY` token types. All other interpolated tokens are expected to
 * have parts which exactly match the input string for parsing the interpolation.
 *
 * @param interpolatedTokens The tokens for the interpolated value.
 *
 * @returns A map of index locations in the decoded template to indexes in the original template
 */
function getIndexMapForOriginalTemplate(interpolatedTokens) {
    let offsetMap = new Map();
    let consumedInOriginalTemplate = 0;
    let consumedInInput = 0;
    let tokenIndex = 0;
    while (tokenIndex < interpolatedTokens.length) {
        const currentToken = interpolatedTokens[tokenIndex];
        if (currentToken.type === 9 /* MlParserTokenType.ENCODED_ENTITY */) {
            const [decoded, encoded] = currentToken.parts;
            consumedInOriginalTemplate += encoded.length;
            consumedInInput += decoded.length;
        }
        else {
            const lengthOfParts = currentToken.parts.reduce((sum, current) => sum + current.length, 0);
            consumedInInput += lengthOfParts;
            consumedInOriginalTemplate += lengthOfParts;
        }
        offsetMap.set(consumedInInput, consumedInOriginalTemplate);
        tokenIndex++;
    }
    return offsetMap;
}

/** Serializes the given AST into a normalized string format. */
function serialize(expression) {
    return expression.visit(new SerializeExpressionVisitor());
}
class SerializeExpressionVisitor {
    visitUnary(ast, context) {
        return `${ast.operator}${ast.expr.visit(this, context)}`;
    }
    visitBinary(ast, context) {
        return `${ast.left.visit(this, context)} ${ast.operation} ${ast.right.visit(this, context)}`;
    }
    visitChain(ast, context) {
        return ast.expressions.map((e) => e.visit(this, context)).join('; ');
    }
    visitConditional(ast, context) {
        return `${ast.condition.visit(this, context)} ? ${ast.trueExp.visit(this, context)} : ${ast.falseExp.visit(this, context)}`;
    }
    visitThisReceiver() {
        return 'this';
    }
    visitImplicitReceiver() {
        return '';
    }
    visitInterpolation(ast, context) {
        return interleave(ast.strings, ast.expressions.map((e) => e.visit(this, context))).join('');
    }
    visitKeyedRead(ast, context) {
        return `${ast.receiver.visit(this, context)}[${ast.key.visit(this, context)}]`;
    }
    visitKeyedWrite(ast, context) {
        return `${ast.receiver.visit(this, context)}[${ast.key.visit(this, context)}] = ${ast.value.visit(this, context)}`;
    }
    visitLiteralArray(ast, context) {
        return `[${ast.expressions.map((e) => e.visit(this, context)).join(', ')}]`;
    }
    visitLiteralMap(ast, context) {
        return `{${zip(ast.keys.map((literal) => (literal.quoted ? `'${literal.key}'` : literal.key)), ast.values.map((value) => value.visit(this, context)))
            .map(([key, value]) => `${key}: ${value}`)
            .join(', ')}}`;
    }
    visitLiteralPrimitive(ast) {
        if (ast.value === null)
            return 'null';
        switch (typeof ast.value) {
            case 'number':
            case 'boolean':
                return ast.value.toString();
            case 'undefined':
                return 'undefined';
            case 'string':
                return `'${ast.value.replace(/'/g, `\\'`)}'`;
            default:
                throw new Error(`Unsupported primitive type: ${ast.value}`);
        }
    }
    visitPipe(ast, context) {
        return `${ast.exp.visit(this, context)} | ${ast.name}`;
    }
    visitPrefixNot(ast, context) {
        return `!${ast.expression.visit(this, context)}`;
    }
    visitNonNullAssert(ast, context) {
        return `${ast.expression.visit(this, context)}!`;
    }
    visitPropertyRead(ast, context) {
        if (ast.receiver instanceof ImplicitReceiver) {
            return ast.name;
        }
        else {
            return `${ast.receiver.visit(this, context)}.${ast.name}`;
        }
    }
    visitPropertyWrite(ast, context) {
        if (ast.receiver instanceof ImplicitReceiver) {
            return `${ast.name} = ${ast.value.visit(this, context)}`;
        }
        else {
            return `${ast.receiver.visit(this, context)}.${ast.name} = ${ast.value.visit(this, context)}`;
        }
    }
    visitSafePropertyRead(ast, context) {
        return `${ast.receiver.visit(this, context)}?.${ast.name}`;
    }
    visitSafeKeyedRead(ast, context) {
        return `${ast.receiver.visit(this, context)}?.[${ast.key.visit(this, context)}]`;
    }
    visitCall(ast, context) {
        return `${ast.receiver.visit(this, context)}(${ast.args
            .map((e) => e.visit(this, context))
            .join(', ')})`;
    }
    visitSafeCall(ast, context) {
        return `${ast.receiver.visit(this, context)}?.(${ast.args
            .map((e) => e.visit(this, context))
            .join(', ')})`;
    }
    visitTypeofExpression(ast, context) {
        return `typeof ${ast.expression.visit(this, context)}`;
    }
    visitASTWithSource(ast, context) {
        return ast.ast.visit(this, context);
    }
    visitTemplateLiteral(ast, context) {
        let result = '';
        for (let i = 0; i < ast.elements.length; i++) {
            result += ast.elements[i].visit(this, context);
            const expression = i < ast.expressions.length ? ast.expressions[i] : null;
            if (expression !== null) {
                result += '${' + expression.visit(this, context) + '}';
            }
        }
        return '`' + result + '`';
    }
    visitTemplateLiteralElement(ast, context) {
        return ast.text;
    }
}
/** Zips the two input arrays into a single array of pairs of elements at the same index. */
function zip(left, right) {
    if (left.length !== right.length)
        throw new Error('Array lengths must match');
    return left.map((l, i) => [l, right[i]]);
}
/**
 * Interleaves the two arrays, starting with the first item on the left, then the first item
 * on the right, second item from the left, and so on. When the first array's items are exhausted,
 * the remaining items from the other array are included with no interleaving.
 */
function interleave(left, right) {
    const result = [];
    for (let index = 0; index < Math.max(left.length, right.length); index++) {
        if (index < left.length)
            result.push(left[index]);
        if (index < right.length)
            result.push(right[index]);
    }
    return result;
}

// =================================================================================================
// =================================================================================================
// =========== S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P  ===========
// =================================================================================================
// =================================================================================================
//
//        DO NOT EDIT THIS LIST OF SECURITY SENSITIVE PROPERTIES WITHOUT A SECURITY REVIEW!
//                               Reach out to mprobst for details.
//
// =================================================================================================
/** Map from tagName|propertyName to SecurityContext. Properties applying to all tags use '*'. */
let _SECURITY_SCHEMA;
function SECURITY_SCHEMA() {
    if (!_SECURITY_SCHEMA) {
        _SECURITY_SCHEMA = {};
        // Case is insignificant below, all element and attribute names are lower-cased for lookup.
        registerContext(SecurityContext.HTML, ['iframe|srcdoc', '*|innerHTML', '*|outerHTML']);
        registerContext(SecurityContext.STYLE, ['*|style']);
        // NB: no SCRIPT contexts here, they are never allowed due to the parser stripping them.
        registerContext(SecurityContext.URL, [
            '*|formAction',
            'area|href',
            'area|ping',
            'audio|src',
            'a|href',
            'a|ping',
            'blockquote|cite',
            'body|background',
            'del|cite',
            'form|action',
            'img|src',
            'input|src',
            'ins|cite',
            'q|cite',
            'source|src',
            'track|src',
            'video|poster',
            'video|src',
        ]);
        registerContext(SecurityContext.RESOURCE_URL, [
            'applet|code',
            'applet|codebase',
            'base|href',
            'embed|src',
            'frame|src',
            'head|profile',
            'html|manifest',
            'iframe|src',
            'link|href',
            'media|src',
            'object|codebase',
            'object|data',
            'script|src',
        ]);
    }
    return _SECURITY_SCHEMA;
}
function registerContext(ctx, specs) {
    for (const spec of specs)
        _SECURITY_SCHEMA[spec.toLowerCase()] = ctx;
}
/**
 * The set of security-sensitive attributes of an `<iframe>` that *must* be
 * applied as a static attribute only. This ensures that all security-sensitive
 * attributes are taken into account while creating an instance of an `<iframe>`
 * at runtime.
 *
 * Note: avoid using this set directly, use the `isIframeSecuritySensitiveAttr` function
 * in the code instead.
 */
const IFRAME_SECURITY_SENSITIVE_ATTRS = new Set([
    'sandbox',
    'allow',
    'allowfullscreen',
    'referrerpolicy',
    'csp',
    'fetchpriority',
]);
/**
 * Checks whether a given attribute name might represent a security-sensitive
 * attribute of an <iframe>.
 */
function isIframeSecuritySensitiveAttr(attrName) {
    // The `setAttribute` DOM API is case-insensitive, so we lowercase the value
    // before checking it against a known security-sensitive attributes.
    return IFRAME_SECURITY_SENSITIVE_ATTRS.has(attrName.toLowerCase());
}

class ElementSchemaRegistry {
}

const BOOLEAN = 'boolean';
const NUMBER = 'number';
const STRING = 'string';
const OBJECT = 'object';
/**
 * This array represents the DOM schema. It encodes inheritance, properties, and events.
 *
 * ## Overview
 *
 * Each line represents one kind of element. The `element_inheritance` and properties are joined
 * using `element_inheritance|properties` syntax.
 *
 * ## Element Inheritance
 *
 * The `element_inheritance` can be further subdivided as `element1,element2,...^parentElement`.
 * Here the individual elements are separated by `,` (commas). Every element in the list
 * has identical properties.
 *
 * An `element` may inherit additional properties from `parentElement` If no `^parentElement` is
 * specified then `""` (blank) element is assumed.
 *
 * NOTE: The blank element inherits from root `[Element]` element, the super element of all
 * elements.
 *
 * NOTE an element prefix such as `:svg:` has no special meaning to the schema.
 *
 * ## Properties
 *
 * Each element has a set of properties separated by `,` (commas). Each property can be prefixed
 * by a special character designating its type:
 *
 * - (no prefix): property is a string.
 * - `*`: property represents an event.
 * - `!`: property is a boolean.
 * - `#`: property is a number.
 * - `%`: property is an object.
 *
 * ## Query
 *
 * The class creates an internal squas representation which allows to easily answer the query of
 * if a given property exist on a given element.
 *
 * NOTE: We don't yet support querying for types or events.
 * NOTE: This schema is auto extracted from `schema_extractor.ts` located in the test folder,
 *       see dom_element_schema_registry_spec.ts
 */
// =================================================================================================
// =================================================================================================
// =========== S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P  ===========
// =================================================================================================
// =================================================================================================
//
//                       DO NOT EDIT THIS DOM SCHEMA WITHOUT A SECURITY REVIEW!
//
// Newly added properties must be security reviewed and assigned an appropriate SecurityContext in
// dom_security_schema.ts. Reach out to mprobst & rjamet for details.
//
// =================================================================================================
const SCHEMA = [
    '[Element]|textContent,%ariaAtomic,%ariaAutoComplete,%ariaBusy,%ariaChecked,%ariaColCount,%ariaColIndex,%ariaColSpan,%ariaCurrent,%ariaDescription,%ariaDisabled,%ariaExpanded,%ariaHasPopup,%ariaHidden,%ariaKeyShortcuts,%ariaLabel,%ariaLevel,%ariaLive,%ariaModal,%ariaMultiLine,%ariaMultiSelectable,%ariaOrientation,%ariaPlaceholder,%ariaPosInSet,%ariaPressed,%ariaReadOnly,%ariaRelevant,%ariaRequired,%ariaRoleDescription,%ariaRowCount,%ariaRowIndex,%ariaRowSpan,%ariaSelected,%ariaSetSize,%ariaSort,%ariaValueMax,%ariaValueMin,%ariaValueNow,%ariaValueText,%classList,className,elementTiming,id,innerHTML,*beforecopy,*beforecut,*beforepaste,*fullscreenchange,*fullscreenerror,*search,*webkitfullscreenchange,*webkitfullscreenerror,outerHTML,%part,#scrollLeft,#scrollTop,slot' +
        /* added manually to avoid breaking changes */
        ',*message,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored',
    '[HTMLElement]^[Element]|accessKey,autocapitalize,!autofocus,contentEditable,dir,!draggable,enterKeyHint,!hidden,!inert,innerText,inputMode,lang,nonce,*abort,*animationend,*animationiteration,*animationstart,*auxclick,*beforexrselect,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*copy,*cuechange,*cut,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*formdata,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*paste,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerrawupdate,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*securitypolicyviolation,*seeked,*seeking,*select,*selectionchange,*selectstart,*slotchange,*stalled,*submit,*suspend,*timeupdate,*toggle,*transitioncancel,*transitionend,*transitionrun,*transitionstart,*volumechange,*waiting,*webkitanimationend,*webkitanimationiteration,*webkitanimationstart,*webkittransitionend,*wheel,outerText,!spellcheck,%style,#tabIndex,title,!translate,virtualKeyboardPolicy',
    'abbr,address,article,aside,b,bdi,bdo,cite,content,code,dd,dfn,dt,em,figcaption,figure,footer,header,hgroup,i,kbd,main,mark,nav,noscript,rb,rp,rt,rtc,ruby,s,samp,search,section,small,strong,sub,sup,u,var,wbr^[HTMLElement]|accessKey,autocapitalize,!autofocus,contentEditable,dir,!draggable,enterKeyHint,!hidden,innerText,inputMode,lang,nonce,*abort,*animationend,*animationiteration,*animationstart,*auxclick,*beforexrselect,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*copy,*cuechange,*cut,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*formdata,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*paste,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerrawupdate,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*securitypolicyviolation,*seeked,*seeking,*select,*selectionchange,*selectstart,*slotchange,*stalled,*submit,*suspend,*timeupdate,*toggle,*transitioncancel,*transitionend,*transitionrun,*transitionstart,*volumechange,*waiting,*webkitanimationend,*webkitanimationiteration,*webkitanimationstart,*webkittransitionend,*wheel,outerText,!spellcheck,%style,#tabIndex,title,!translate,virtualKeyboardPolicy',
    'media^[HTMLElement]|!autoplay,!controls,%controlsList,%crossOrigin,#currentTime,!defaultMuted,#defaultPlaybackRate,!disableRemotePlayback,!loop,!muted,*encrypted,*waitingforkey,#playbackRate,preload,!preservesPitch,src,%srcObject,#volume',
    ':svg:^[HTMLElement]|!autofocus,nonce,*abort,*animationend,*animationiteration,*animationstart,*auxclick,*beforexrselect,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*copy,*cuechange,*cut,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*formdata,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*paste,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerrawupdate,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*securitypolicyviolation,*seeked,*seeking,*select,*selectionchange,*selectstart,*slotchange,*stalled,*submit,*suspend,*timeupdate,*toggle,*transitioncancel,*transitionend,*transitionrun,*transitionstart,*volumechange,*waiting,*webkitanimationend,*webkitanimationiteration,*webkitanimationstart,*webkittransitionend,*wheel,%style,#tabIndex',
    ':svg:graphics^:svg:|',
    ':svg:animation^:svg:|*begin,*end,*repeat',
    ':svg:geometry^:svg:|',
    ':svg:componentTransferFunction^:svg:|',
    ':svg:gradient^:svg:|',
    ':svg:textContent^:svg:graphics|',
    ':svg:textPositioning^:svg:textContent|',
    'a^[HTMLElement]|charset,coords,download,hash,host,hostname,href,hreflang,name,password,pathname,ping,port,protocol,referrerPolicy,rel,%relList,rev,search,shape,target,text,type,username',
    'area^[HTMLElement]|alt,coords,download,hash,host,hostname,href,!noHref,password,pathname,ping,port,protocol,referrerPolicy,rel,%relList,search,shape,target,username',
    'audio^media|',
    'br^[HTMLElement]|clear',
    'base^[HTMLElement]|href,target',
    'body^[HTMLElement]|aLink,background,bgColor,link,*afterprint,*beforeprint,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*messageerror,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,text,vLink',
    'button^[HTMLElement]|!disabled,formAction,formEnctype,formMethod,!formNoValidate,formTarget,name,type,value',
    'canvas^[HTMLElement]|#height,#width',
    'content^[HTMLElement]|select',
    'dl^[HTMLElement]|!compact',
    'data^[HTMLElement]|value',
    'datalist^[HTMLElement]|',
    'details^[HTMLElement]|!open',
    'dialog^[HTMLElement]|!open,returnValue',
    'dir^[HTMLElement]|!compact',
    'div^[HTMLElement]|align',
    'embed^[HTMLElement]|align,height,name,src,type,width',
    'fieldset^[HTMLElement]|!disabled,name',
    'font^[HTMLElement]|color,face,size',
    'form^[HTMLElement]|acceptCharset,action,autocomplete,encoding,enctype,method,name,!noValidate,target',
    'frame^[HTMLElement]|frameBorder,longDesc,marginHeight,marginWidth,name,!noResize,scrolling,src',
    'frameset^[HTMLElement]|cols,*afterprint,*beforeprint,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*messageerror,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,rows',
    'hr^[HTMLElement]|align,color,!noShade,size,width',
    'head^[HTMLElement]|',
    'h1,h2,h3,h4,h5,h6^[HTMLElement]|align',
    'html^[HTMLElement]|version',
    'iframe^[HTMLElement]|align,allow,!allowFullscreen,!allowPaymentRequest,csp,frameBorder,height,loading,longDesc,marginHeight,marginWidth,name,referrerPolicy,%sandbox,scrolling,src,srcdoc,width',
    'img^[HTMLElement]|align,alt,border,%crossOrigin,decoding,#height,#hspace,!isMap,loading,longDesc,lowsrc,name,referrerPolicy,sizes,src,srcset,useMap,#vspace,#width',
    'input^[HTMLElement]|accept,align,alt,autocomplete,!checked,!defaultChecked,defaultValue,dirName,!disabled,%files,formAction,formEnctype,formMethod,!formNoValidate,formTarget,#height,!incremental,!indeterminate,max,#maxLength,min,#minLength,!multiple,name,pattern,placeholder,!readOnly,!required,selectionDirection,#selectionEnd,#selectionStart,#size,src,step,type,useMap,value,%valueAsDate,#valueAsNumber,#width',
    'li^[HTMLElement]|type,#value',
    'label^[HTMLElement]|htmlFor',
    'legend^[HTMLElement]|align',
    'link^[HTMLElement]|as,charset,%crossOrigin,!disabled,href,hreflang,imageSizes,imageSrcset,integrity,media,referrerPolicy,rel,%relList,rev,%sizes,target,type',
    'map^[HTMLElement]|name',
    'marquee^[HTMLElement]|behavior,bgColor,direction,height,#hspace,#loop,#scrollAmount,#scrollDelay,!trueSpeed,#vspace,width',
    'menu^[HTMLElement]|!compact',
    'meta^[HTMLElement]|content,httpEquiv,media,name,scheme',
    'meter^[HTMLElement]|#high,#low,#max,#min,#optimum,#value',
    'ins,del^[HTMLElement]|cite,dateTime',
    'ol^[HTMLElement]|!compact,!reversed,#start,type',
    'object^[HTMLElement]|align,archive,border,code,codeBase,codeType,data,!declare,height,#hspace,name,standby,type,useMap,#vspace,width',
    'optgroup^[HTMLElement]|!disabled,label',
    'option^[HTMLElement]|!defaultSelected,!disabled,label,!selected,text,value',
    'output^[HTMLElement]|defaultValue,%htmlFor,name,value',
    'p^[HTMLElement]|align',
    'param^[HTMLElement]|name,type,value,valueType',
    'picture^[HTMLElement]|',
    'pre^[HTMLElement]|#width',
    'progress^[HTMLElement]|#max,#value',
    'q,blockquote,cite^[HTMLElement]|',
    'script^[HTMLElement]|!async,charset,%crossOrigin,!defer,event,htmlFor,integrity,!noModule,%referrerPolicy,src,text,type',
    'select^[HTMLElement]|autocomplete,!disabled,#length,!multiple,name,!required,#selectedIndex,#size,value',
    'slot^[HTMLElement]|name',
    'source^[HTMLElement]|#height,media,sizes,src,srcset,type,#width',
    'span^[HTMLElement]|',
    'style^[HTMLElement]|!disabled,media,type',
    'search^[HTMLELement]|',
    'caption^[HTMLElement]|align',
    'th,td^[HTMLElement]|abbr,align,axis,bgColor,ch,chOff,#colSpan,headers,height,!noWrap,#rowSpan,scope,vAlign,width',
    'col,colgroup^[HTMLElement]|align,ch,chOff,#span,vAlign,width',
    'table^[HTMLElement]|align,bgColor,border,%caption,cellPadding,cellSpacing,frame,rules,summary,%tFoot,%tHead,width',
    'tr^[HTMLElement]|align,bgColor,ch,chOff,vAlign',
    'tfoot,thead,tbody^[HTMLElement]|align,ch,chOff,vAlign',
    'template^[HTMLElement]|',
    'textarea^[HTMLElement]|autocomplete,#cols,defaultValue,dirName,!disabled,#maxLength,#minLength,name,placeholder,!readOnly,!required,#rows,selectionDirection,#selectionEnd,#selectionStart,value,wrap',
    'time^[HTMLElement]|dateTime',
    'title^[HTMLElement]|text',
    'track^[HTMLElement]|!default,kind,label,src,srclang',
    'ul^[HTMLElement]|!compact,type',
    'unknown^[HTMLElement]|',
    'video^media|!disablePictureInPicture,#height,*enterpictureinpicture,*leavepictureinpicture,!playsInline,poster,#width',
    ':svg:a^:svg:graphics|',
    ':svg:animate^:svg:animation|',
    ':svg:animateMotion^:svg:animation|',
    ':svg:animateTransform^:svg:animation|',
    ':svg:circle^:svg:geometry|',
    ':svg:clipPath^:svg:graphics|',
    ':svg:defs^:svg:graphics|',
    ':svg:desc^:svg:|',
    ':svg:discard^:svg:|',
    ':svg:ellipse^:svg:geometry|',
    ':svg:feBlend^:svg:|',
    ':svg:feColorMatrix^:svg:|',
    ':svg:feComponentTransfer^:svg:|',
    ':svg:feComposite^:svg:|',
    ':svg:feConvolveMatrix^:svg:|',
    ':svg:feDiffuseLighting^:svg:|',
    ':svg:feDisplacementMap^:svg:|',
    ':svg:feDistantLight^:svg:|',
    ':svg:feDropShadow^:svg:|',
    ':svg:feFlood^:svg:|',
    ':svg:feFuncA^:svg:componentTransferFunction|',
    ':svg:feFuncB^:svg:componentTransferFunction|',
    ':svg:feFuncG^:svg:componentTransferFunction|',
    ':svg:feFuncR^:svg:componentTransferFunction|',
    ':svg:feGaussianBlur^:svg:|',
    ':svg:feImage^:svg:|',
    ':svg:feMerge^:svg:|',
    ':svg:feMergeNode^:svg:|',
    ':svg:feMorphology^:svg:|',
    ':svg:feOffset^:svg:|',
    ':svg:fePointLight^:svg:|',
    ':svg:feSpecularLighting^:svg:|',
    ':svg:feSpotLight^:svg:|',
    ':svg:feTile^:svg:|',
    ':svg:feTurbulence^:svg:|',
    ':svg:filter^:svg:|',
    ':svg:foreignObject^:svg:graphics|',
    ':svg:g^:svg:graphics|',
    ':svg:image^:svg:graphics|decoding',
    ':svg:line^:svg:geometry|',
    ':svg:linearGradient^:svg:gradient|',
    ':svg:mpath^:svg:|',
    ':svg:marker^:svg:|',
    ':svg:mask^:svg:|',
    ':svg:metadata^:svg:|',
    ':svg:path^:svg:geometry|',
    ':svg:pattern^:svg:|',
    ':svg:polygon^:svg:geometry|',
    ':svg:polyline^:svg:geometry|',
    ':svg:radialGradient^:svg:gradient|',
    ':svg:rect^:svg:geometry|',
    ':svg:svg^:svg:graphics|#currentScale,#zoomAndPan',
    ':svg:script^:svg:|type',
    ':svg:set^:svg:animation|',
    ':svg:stop^:svg:|',
    ':svg:style^:svg:|!disabled,media,title,type',
    ':svg:switch^:svg:graphics|',
    ':svg:symbol^:svg:|',
    ':svg:tspan^:svg:textPositioning|',
    ':svg:text^:svg:textPositioning|',
    ':svg:textPath^:svg:textContent|',
    ':svg:title^:svg:|',
    ':svg:use^:svg:graphics|',
    ':svg:view^:svg:|#zoomAndPan',
    'data^[HTMLElement]|value',
    'keygen^[HTMLElement]|!autofocus,challenge,!disabled,form,keytype,name',
    'menuitem^[HTMLElement]|type,label,icon,!disabled,!checked,radiogroup,!default',
    'summary^[HTMLElement]|',
    'time^[HTMLElement]|dateTime',
    ':svg:cursor^:svg:|',
    ':math:^[HTMLElement]|!autofocus,nonce,*abort,*animationend,*animationiteration,*animationstart,*auxclick,*beforeinput,*beforematch,*beforetoggle,*beforexrselect,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contentvisibilityautostatechange,*contextlost,*contextmenu,*contextrestored,*copy,*cuechange,*cut,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*formdata,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*paste,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerrawupdate,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*scrollend,*securitypolicyviolation,*seeked,*seeking,*select,*selectionchange,*selectstart,*slotchange,*stalled,*submit,*suspend,*timeupdate,*toggle,*transitioncancel,*transitionend,*transitionrun,*transitionstart,*volumechange,*waiting,*webkitanimationend,*webkitanimationiteration,*webkitanimationstart,*webkittransitionend,*wheel,%style,#tabIndex',
    ':math:math^:math:|',
    ':math:maction^:math:|',
    ':math:menclose^:math:|',
    ':math:merror^:math:|',
    ':math:mfenced^:math:|',
    ':math:mfrac^:math:|',
    ':math:mi^:math:|',
    ':math:mmultiscripts^:math:|',
    ':math:mn^:math:|',
    ':math:mo^:math:|',
    ':math:mover^:math:|',
    ':math:mpadded^:math:|',
    ':math:mphantom^:math:|',
    ':math:mroot^:math:|',
    ':math:mrow^:math:|',
    ':math:ms^:math:|',
    ':math:mspace^:math:|',
    ':math:msqrt^:math:|',
    ':math:mstyle^:math:|',
    ':math:msub^:math:|',
    ':math:msubsup^:math:|',
    ':math:msup^:math:|',
    ':math:mtable^:math:|',
    ':math:mtd^:math:|',
    ':math:mtext^:math:|',
    ':math:mtr^:math:|',
    ':math:munder^:math:|',
    ':math:munderover^:math:|',
    ':math:semantics^:math:|',
];
const _ATTR_TO_PROP = new Map(Object.entries({
    'class': 'className',
    'for': 'htmlFor',
    'formaction': 'formAction',
    'innerHtml': 'innerHTML',
    'readonly': 'readOnly',
    'tabindex': 'tabIndex',
}));
// Invert _ATTR_TO_PROP.
const _PROP_TO_ATTR = Array.from(_ATTR_TO_PROP).reduce((inverted, [propertyName, attributeName]) => {
    inverted.set(propertyName, attributeName);
    return inverted;
}, new Map());
class DomElementSchemaRegistry extends ElementSchemaRegistry {
    _schema = new Map();
    // We don't allow binding to events for security reasons. Allowing event bindings would almost
    // certainly introduce bad XSS vulnerabilities. Instead, we store events in a separate schema.
    _eventSchema = new Map();
    constructor() {
        super();
        SCHEMA.forEach((encodedType) => {
            const type = new Map();
            const events = new Set();
            const [strType, strProperties] = encodedType.split('|');
            const properties = strProperties.split(',');
            const [typeNames, superName] = strType.split('^');
            typeNames.split(',').forEach((tag) => {
                this._schema.set(tag.toLowerCase(), type);
                this._eventSchema.set(tag.toLowerCase(), events);
            });
            const superType = superName && this._schema.get(superName.toLowerCase());
            if (superType) {
                for (const [prop, value] of superType) {
                    type.set(prop, value);
                }
                for (const superEvent of this._eventSchema.get(superName.toLowerCase())) {
                    events.add(superEvent);
                }
            }
            properties.forEach((property) => {
                if (property.length > 0) {
                    switch (property[0]) {
                        case '*':
                            events.add(property.substring(1));
                            break;
                        case '!':
                            type.set(property.substring(1), BOOLEAN);
                            break;
                        case '#':
                            type.set(property.substring(1), NUMBER);
                            break;
                        case '%':
                            type.set(property.substring(1), OBJECT);
                            break;
                        default:
                            type.set(property, STRING);
                    }
                }
            });
        });
    }
    hasProperty(tagName, propName, schemaMetas) {
           if (schemaMetas.some((schema) => schema.name === NO_ERRORS_SCHEMA.name)) {
            return true;
        }
        if (tagName.indexOf('-') > -1) {
            if (isNgContainer(tagName) || isNgContent(tagName)) {
                return false;
            }
            if (schemaMetas.some((schema) => schema.name === CUSTOM_ELEMENTS_SCHEMA.name)) {
                // Can't tell now as we don't know which properties a custom element will get
                // once it is instantiated
                return true;
            }
        }
        const elementProperties = this._schema.get(tagName.toLowerCase()) || this._schema.get('unknown');
        return elementProperties.has(propName);
    }
    hasElement(tagName, schemaMetas) {
        if (schemaMetas.some((schema) => schema.name === NO_ERRORS_SCHEMA.name)) {
            return true;
        }
        if (tagName.indexOf('-') > -1) {
            if (isNgContainer(tagName) || isNgContent(tagName)) {
                return true;
            }
            if (schemaMetas.some((schema) => schema.name === CUSTOM_ELEMENTS_SCHEMA.name)) {
                // Allow any custom elements
                return true;
            }
        }
        return this._schema.has(tagName.toLowerCase());
    }
    /**
     * securityContext returns the security context for the given property on the given DOM tag.
     *
     * Tag and property name are statically known and cannot change at runtime, i.e. it is not
     * possible to bind a value into a changing attribute or tag name.
     *
     * The filtering is based on a list of allowed tags|attributes. All attributes in the schema
     * above are assumed to have the 'NONE' security context, i.e. that they are safe inert
     * string values. Only specific well known attack vectors are assigned their appropriate context.
     */
    securityContext(tagName, propName, isAttribute) {
        if (isAttribute) {
            // NB: For security purposes, use the mapped property name, not the attribute name.
            propName = this.getMappedPropName(propName);
        }
        // Make sure comparisons are case insensitive, so that case differences between attribute and
        // property names do not have a security impact.
        tagName = tagName.toLowerCase();
        propName = propName.toLowerCase();
        let ctx = SECURITY_SCHEMA()[tagName + '|' + propName];
        if (ctx) {
            return ctx;
        }
        ctx = SECURITY_SCHEMA()['*|' + propName];
        return ctx ? ctx : SecurityContext.NONE;
    }
    getMappedPropName(propName) {
        return _ATTR_TO_PROP.get(propName) ?? propName;
    }
    getDefaultComponentElementName() {
        return 'ng-component';
    }
    validateProperty(name) {
        if (name.toLowerCase().startsWith('on')) {
            const msg = `Binding to event property '${name}' is disallowed for security reasons, ` +
                `please use (${name.slice(2)})=...` +
                `\nIf '${name}' is a directive input, make sure the directive is imported by the` +
                ` current module.`;
            return { error: true, msg: msg };
        }
        else {
            return { error: false };
        }
    }
    validateAttribute(name) {
        if (name.toLowerCase().startsWith('on')) {
            const msg = `Binding to event attribute '${name}' is disallowed for security reasons, ` +
                `please use (${name.slice(2)})=...`;
            return { error: true, msg: msg };
        }
        else {
            return { error: false };
        }
    }
    allKnownElementNames() {
        return Array.from(this._schema.keys());
    }
    allKnownAttributesOfElement(tagName) {
        const elementProperties = this._schema.get(tagName.toLowerCase()) || this._schema.get('unknown');
        // Convert properties to attributes.
        return Array.from(elementProperties.keys()).map((prop) => _PROP_TO_ATTR.get(prop) ?? prop);
    }
    allKnownEventsOfElement(tagName) {
        return Array.from(this._eventSchema.get(tagName.toLowerCase()) ?? []);
    }
    normalizeAnimationStyleProperty(propName) {
        return dashCaseToCamelCase(propName);
    }
    normalizeAnimationStyleValue(camelCaseProp, userProvidedProp, val) {
        let unit = '';
        const strVal = val.toString().trim();
        let errorMsg = null;
        if (_isPixelDimensionStyle(camelCaseProp) && val !== 0 && val !== '0') {
            if (typeof val === 'number') {
                unit = 'px';
            }
            else {
                const valAndSuffixMatch = val.match(/^[+-]?[\d\.]+([a-z]*)$/);
                if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {
                    errorMsg = `Please provide a CSS unit value for ${userProvidedProp}:${val}`;
                }
            }
        }
        return { error: errorMsg, value: strVal + unit };
    }
}
function _isPixelDimensionStyle(prop) {
    switch (prop) {
        case 'width':
        case 'height':
        case 'minWidth':
        case 'minHeight':
        case 'maxWidth':
        case 'maxHeight':
        case 'left':
        case 'top':
        case 'bottom':
        case 'right':
        case 'fontSize':
        case 'outlineWidth':
        case 'outlineOffset':
        case 'paddingTop':
        case 'paddingLeft':
        case 'paddingBottom':
        case 'paddingRight':
        case 'marginTop':
        case 'marginLeft':
        case 'marginBottom':
        case 'marginRight':
        case 'borderRadius':
        case 'borderWidth':
        case 'borderTopWidth':
        case 'borderLeftWidth':
        case 'borderRightWidth':
        case 'borderBottomWidth':
        case 'textIndent':
            return true;
        default:
            return false;
    }
}

class HtmlTagDefinition {
    closedByChildren = {};
    contentType;
    closedByParent = false;
    implicitNamespacePrefix;
    isVoid;
    ignoreFirstLf;
    canSelfClose;
    preventNamespaceInheritance;
    constructor({ closedByChildren, implicitNamespacePrefix, contentType = exports.TagContentType.PARSABLE_DATA, closedByParent = false, isVoid = false, ignoreFirstLf = false, preventNamespaceInheritance = false, canSelfClose = false, } = {}) {
        if (closedByChildren && closedByChildren.length > 0) {
            closedByChildren.forEach((tagName) => (this.closedByChildren[tagName] = true));
        }
        this.isVoid = isVoid;
        this.closedByParent = closedByParent || isVoid;
        this.implicitNamespacePrefix = implicitNamespacePrefix || null;
        this.contentType = contentType;
        this.ignoreFirstLf = ignoreFirstLf;
        this.preventNamespaceInheritance = preventNamespaceInheritance;
        this.canSelfClose = canSelfClose ?? isVoid;
    }
    isClosedByChild(name) {
        return this.isVoid || name.toLowerCase() in this.closedByChildren;
    }
    getContentType(prefix) {
        if (typeof this.contentType === 'object') {
            const overrideType = prefix === undefined ? undefined : this.contentType[prefix];
            return overrideType ?? this.contentType.default;
        }
        return this.contentType;
    }
}
let DEFAULT_TAG_DEFINITION;
// see https://www.w3.org/TR/html51/syntax.html#optional-tags
// This implementation does not fully conform to the HTML5 spec.
let TAG_DEFINITIONS;
function getHtmlTagDefinition(tagName) {
    if (!TAG_DEFINITIONS) {
        DEFAULT_TAG_DEFINITION = new HtmlTagDefinition({ canSelfClose: true });
        TAG_DEFINITIONS = Object.assign(Object.create(null), {
            'base': new HtmlTagDefinition({ isVoid: true }),
            'meta': new HtmlTagDefinition({ isVoid: true }),
            'area': new HtmlTagDefinition({ isVoid: true }),
            'embed': new HtmlTagDefinition({ isVoid: true }),
            'link': new HtmlTagDefinition({ isVoid: true }),
            'img': new HtmlTagDefinition({ isVoid: true }),
            'input': new HtmlTagDefinition({ isVoid: true }),
            'param': new HtmlTagDefinition({ isVoid: true }),
            'hr': new HtmlTagDefinition({ isVoid: true }),
            'br': new HtmlTagDefinition({ isVoid: true }),
            'source': new HtmlTagDefinition({ isVoid: true }),
            'track': new HtmlTagDefinition({ isVoid: true }),
            'wbr': new HtmlTagDefinition({ isVoid: true }),
            'p': new HtmlTagDefinition({
                closedByChildren: [
                    'address',
                    'article',
                    'aside',
                    'blockquote',
                    'div',
                    'dl',
                    'fieldset',
                    'footer',
                    'form',
                    'h1',
                    'h2',
                    'h3',
                    'h4',
                    'h5',
                    'h6',
                    'header',
                    'hgroup',
                    'hr',
                    'main',
                    'nav',
                    'ol',
                    'p',
                    'pre',
                    'section',
                    'table',
                    'ul',
                ],
                closedByParent: true,
            }),
            'thead': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'] }),
            'tbody': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'], closedByParent: true }),
            'tfoot': new HtmlTagDefinition({ closedByChildren: ['tbody'], closedByParent: true }),
            'tr': new HtmlTagDefinition({ closedByChildren: ['tr'], closedByParent: true }),
            'td': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
            'th': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
            'col': new HtmlTagDefinition({ isVoid: true }),
            'svg': new HtmlTagDefinition({ implicitNamespacePrefix: 'svg' }),
            'foreignObject': new HtmlTagDefinition({
                // Usually the implicit namespace here would be redundant since it will be inherited from
                // the parent `svg`, but we have to do it for `foreignObject`, because the way the parser
                // works is that the parent node of an end tag is its own start tag which means that
                // the `preventNamespaceInheritance` on `foreignObject` would have it default to the
                // implicit namespace which is `html`, unless specified otherwise.
                implicitNamespacePrefix: 'svg',
                // We want to prevent children of foreignObject from inheriting its namespace, because
                // the point of the element is to allow nodes from other namespaces to be inserted.
                preventNamespaceInheritance: true,
            }),
            'math': new HtmlTagDefinition({ implicitNamespacePrefix: 'math' }),
            'li': new HtmlTagDefinition({ closedByChildren: ['li'], closedByParent: true }),
            'dt': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'] }),
            'dd': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'], closedByParent: true }),
            'rb': new HtmlTagDefinition({
                closedByChildren: ['rb', 'rt', 'rtc', 'rp'],
                closedByParent: true,
            }),
            'rt': new HtmlTagDefinition({
                closedByChildren: ['rb', 'rt', 'rtc', 'rp'],
                closedByParent: true,
            }),
            'rtc': new HtmlTagDefinition({ closedByChildren: ['rb', 'rtc', 'rp'], closedByParent: true }),
            'rp': new HtmlTagDefinition({
                closedByChildren: ['rb', 'rt', 'rtc', 'rp'],
                closedByParent: true,
            }),
            'optgroup': new HtmlTagDefinition({ closedByChildren: ['optgroup'], closedByParent: true }),
            'option': new HtmlTagDefinition({
                closedByChildren: ['option', 'optgroup'],
                closedByParent: true,
            }),
            'pre': new HtmlTagDefinition({ ignoreFirstLf: true }),
            'listing': new HtmlTagDefinition({ ignoreFirstLf: true }),
            'style': new HtmlTagDefinition({ contentType: exports.TagContentType.RAW_TEXT }),
            'script': new HtmlTagDefinition({ contentType: exports.TagContentType.RAW_TEXT }),
            'title': new HtmlTagDefinition({
                // The browser supports two separate `title` tags which have to use
                // a different content type: `HTMLTitleElement` and `SVGTitleElement`
                contentType: {
                    default: exports.TagContentType.ESCAPABLE_RAW_TEXT,
                    svg: exports.TagContentType.PARSABLE_DATA,
                },
            }),
            'textarea': new HtmlTagDefinition({
                contentType: exports.TagContentType.ESCAPABLE_RAW_TEXT,
                ignoreFirstLf: true,
            }),
        });
        new DomElementSchemaRegistry().allKnownElementNames().forEach((knownTagName) => {
            if (!TAG_DEFINITIONS[knownTagName] && getNsPrefix(knownTagName) === null) {
                TAG_DEFINITIONS[knownTagName] = new HtmlTagDefinition({ canSelfClose: false });
            }
        });
    }
    // We have to make both a case-sensitive and a case-insensitive lookup, because
    // HTML tag names are case insensitive, whereas some SVG tags are case sensitive.
    return (TAG_DEFINITIONS[tagName] ?? TAG_DEFINITIONS[tagName.toLowerCase()] ?? DEFAULT_TAG_DEFINITION);
}

const TAG_TO_PLACEHOLDER_NAMES = {
    'A': 'LINK',
    'B': 'BOLD_TEXT',
    'BR': 'LINE_BREAK',
    'EM': 'EMPHASISED_TEXT',
    'H1': 'HEADING_LEVEL1',
    'H2': 'HEADING_LEVEL2',
    'H3': 'HEADING_LEVEL3',
    'H4': 'HEADING_LEVEL4',
    'H5': 'HEADING_LEVEL5',
    'H6': 'HEADING_LEVEL6',
    'HR': 'HORIZONTAL_RULE',
    'I': 'ITALIC_TEXT',
    'LI': 'LIST_ITEM',
    'LINK': 'MEDIA_LINK',
    'OL': 'ORDERED_LIST',
    'P': 'PARAGRAPH',
    'Q': 'QUOTATION',
    'S': 'STRIKETHROUGH_TEXT',
    'SMALL': 'SMALL_TEXT',
    'SUB': 'SUBSTRIPT',
    'SUP': 'SUPERSCRIPT',
    'TBODY': 'TABLE_BODY',
    'TD': 'TABLE_CELL',
    'TFOOT': 'TABLE_FOOTER',
    'TH': 'TABLE_HEADER_CELL',
    'THEAD': 'TABLE_HEADER',
    'TR': 'TABLE_ROW',
    'TT': 'MONOSPACED_TEXT',
    'U': 'UNDERLINED_TEXT',
    'UL': 'UNORDERED_LIST',
};
/**
 * Creates unique names for placeholder with different content.
 *
 * Returns the same placeholder name when the content is identical.
 */
class PlaceholderRegistry {
    // Count the occurrence of the base name top generate a unique name
    _placeHolderNameCounts = {};
    // Maps signature to placeholder names
    _signatureToName = {};
    getStartTagPlaceholderName(tag, attrs, isVoid) {
        const signature = this._hashTag(tag, attrs, isVoid);
        if (this._signatureToName[signature]) {
            return this._signatureToName[signature];
        }
        const upperTag = tag.toUpperCase();
        const baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || `TAG_${upperTag}`;
        const name = this._generateUniqueName(isVoid ? baseName : `START_${baseName}`);
        this._signatureToName[signature] = name;
        return name;
    }
    getCloseTagPlaceholderName(tag) {
        const signature = this._hashClosingTag(tag);
        if (this._signatureToName[signature]) {
            return this._signatureToName[signature];
        }
        const upperTag = tag.toUpperCase();
        const baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || `TAG_${upperTag}`;
        const name = this._generateUniqueName(`CLOSE_${baseName}`);
        this._signatureToName[signature] = name;
        return name;
    }
    getPlaceholderName(name, content) {
        const upperName = name.toUpperCase();
        const signature = `PH: ${upperName}=${content}`;
        if (this._signatureToName[signature]) {
            return this._signatureToName[signature];
        }
        const uniqueName = this._generateUniqueName(upperName);
        this._signatureToName[signature] = uniqueName;
        return uniqueName;
    }
    getUniquePlaceholder(name) {
        return this._generateUniqueName(name.toUpperCase());
    }
    getStartBlockPlaceholderName(name, parameters) {
        const signature = this._hashBlock(name, parameters);
        if (this._signatureToName[signature]) {
            return this._signatureToName[signature];
        }
        const placeholder = this._generateUniqueName(`START_BLOCK_${this._toSnakeCase(name)}`);
        this._signatureToName[signature] = placeholder;
        return placeholder;
    }
    getCloseBlockPlaceholderName(name) {
        const signature = this._hashClosingBlock(name);
        if (this._signatureToName[signature]) {
            return this._signatureToName[signature];
        }
        const placeholder = this._generateUniqueName(`CLOSE_BLOCK_${this._toSnakeCase(name)}`);
        this._signatureToName[signature] = placeholder;
        return placeholder;
    }
    // Generate a hash for a tag - does not take attribute order into account
    _hashTag(tag, attrs, isVoid) {
        const start = `<${tag}`;
        const strAttrs = Object.keys(attrs)
            .sort()
            .map((name) => ` ${name}=${attrs[name]}`)
            .join('');
        const end = isVoid ? '/>' : `></${tag}>`;
        return start + strAttrs + end;
    }
    _hashClosingTag(tag) {
        return this._hashTag(`/${tag}`, {}, false);
    }
    _hashBlock(name, parameters) {
        const params = parameters.length === 0 ? '' : ` (${parameters.sort().join('; ')})`;
        return `@${name}${params} {}`;
    }
    _hashClosingBlock(name) {
        return this._hashBlock(`close_${name}`, []);
    }
    _toSnakeCase(name) {
        return name.toUpperCase().replace(/[^A-Z0-9]/g, '_');
    }
    _generateUniqueName(base) {
        const seen = this._placeHolderNameCounts.hasOwnProperty(base);
        if (!seen) {
            this._placeHolderNameCounts[base] = 1;
            return base;
        }
        const id = this._placeHolderNameCounts[base];
        this._placeHolderNameCounts[base] = id + 1;
        return `${base}_${id}`;
    }
}

const _expParser = new Parser(new Lexer());
/**
 * Returns a function converting html nodes to an i18n Message given an interpolationConfig
 */
function createI18nMessageFactory(interpolationConfig, containerBlocks, retainEmptyTokens, preserveExpressionWhitespace) {
    const visitor = new _I18nVisitor(_expParser, interpolationConfig, containerBlocks, retainEmptyTokens, preserveExpressionWhitespace);
    return (nodes, meaning, description, customId, visitNodeFn) => visitor.toI18nMessage(nodes, meaning, description, customId, visitNodeFn);
}
function noopVisitNodeFn(_html, i18n) {
    return i18n;
}
class _I18nVisitor {
    _expressionParser;
    _interpolationConfig;
    _containerBlocks;
    _retainEmptyTokens;
    _preserveExpressionWhitespace;
    constructor(_expressionParser, _interpolationConfig, _containerBlocks, _retainEmptyTokens, _preserveExpressionWhitespace) {
        this._expressionParser = _expressionParser;
        this._interpolationConfig = _interpolationConfig;
        this._containerBlocks = _containerBlocks;
        this._retainEmptyTokens = _retainEmptyTokens;
        this._preserveExpressionWhitespace = _preserveExpressionWhitespace;
    }
    toI18nMessage(nodes, meaning = '', description = '', customId = '', visitNodeFn) {
        const context = {
            isIcu: nodes.length == 1 && nodes[0] instanceof Expansion,
            icuDepth: 0,
            placeholderRegistry: new PlaceholderRegistry(),
            placeholderToContent: {},
            placeholderToMessage: {},
            visitNodeFn: visitNodeFn || noopVisitNodeFn,
        };
        const i18nodes = visitAll(this, nodes, context);
        return new Message(i18nodes, context.placeholderToContent, context.placeholderToMessage, meaning, description, customId);
    }
    visitElement(el, context) {
        const children = visitAll(this, el.children, context);
        const attrs = {};
        el.attrs.forEach((attr) => {
            // Do not visit the attributes, translatable ones are top-level ASTs
            attrs[attr.name] = attr.value;
        });
        const isVoid = getHtmlTagDefinition(el.name).isVoid;
        const startPhName = context.placeholderRegistry.getStartTagPlaceholderName(el.name, attrs, isVoid);
        context.placeholderToContent[startPhName] = {
            text: el.startSourceSpan.toString(),
            sourceSpan: el.startSourceSpan,
        };
        let closePhName = '';
        if (!isVoid) {
            closePhName = context.placeholderRegistry.getCloseTagPlaceholderName(el.name);
            context.placeholderToContent[closePhName] = {
                text: `</${el.name}>`,
                sourceSpan: el.endSourceSpan ?? el.sourceSpan,
            };
        }
        const node = new TagPlaceholder(el.name, attrs, startPhName, closePhName, children, isVoid, el.sourceSpan, el.startSourceSpan, el.endSourceSpan);
        return context.visitNodeFn(el, node);
    }
    visitAttribute(attribute, context) {
        const node = attribute.valueTokens === undefined || attribute.valueTokens.length === 1
            ? new Text$2(attribute.value, attribute.valueSpan || attribute.sourceSpan)
            : this._visitTextWithInterpolation(attribute.valueTokens, attribute.valueSpan || attribute.sourceSpan, context, attribute.i18n);
        return context.visitNodeFn(attribute, node);
    }
    visitText(text, context) {
        const node = text.tokens.length === 1
            ? new Text$2(text.value, text.sourceSpan)
            : this._visitTextWithInterpolation(text.tokens, text.sourceSpan, context, text.i18n);
        return context.visitNodeFn(text, node);
    }
    visitComment(comment, context) {
        return null;
    }
    visitExpansion(icu, context) {
        context.icuDepth++;
        const i18nIcuCases = {};
        const i18nIcu = new Icu(icu.switchValue, icu.type, i18nIcuCases, icu.sourceSpan);
        icu.cases.forEach((caze) => {
            i18nIcuCases[caze.value] = new Container(caze.expression.map((node) => node.visit(this, context)), caze.expSourceSpan);
        });
        context.icuDepth--;
        if (context.isIcu || context.icuDepth > 0) {
            // Returns an ICU node when:
            // - the message (vs a part of the message) is an ICU message, or
            // - the ICU message is nested.
            const expPh = context.placeholderRegistry.getUniquePlaceholder(`VAR_${icu.type}`);
            i18nIcu.expressionPlaceholder = expPh;
            context.placeholderToContent[expPh] = {
                text: icu.switchValue,
                sourceSpan: icu.switchValueSourceSpan,
            };
            return context.visitNodeFn(icu, i18nIcu);
        }
        // Else returns a placeholder
        // ICU placeholders should not be replaced with their original content but with the their
        // translations.
        // TODO(vicb): add a html.Node -> i18n.Message cache to avoid having to re-create the msg
        const phName = context.placeholderRegistry.getPlaceholderName('ICU', icu.sourceSpan.toString());
        context.placeholderToMessage[phName] = this.toI18nMessage([icu], '', '', '', undefined);
        const node = new IcuPlaceholder(i18nIcu, phName, icu.sourceSpan);
        return context.visitNodeFn(icu, node);
    }
    visitExpansionCase(_icuCase, _context) {
        throw new Error('Unreachable code');
    }
    visitBlock(block, context) {
        const children = visitAll(this, block.children, context);
        if (this._containerBlocks.has(block.name)) {
            return new Container(children, block.sourceSpan);
        }
        const parameters = block.parameters.map((param) => param.expression);
        const startPhName = context.placeholderRegistry.getStartBlockPlaceholderName(block.name, parameters);
        const closePhName = context.placeholderRegistry.getCloseBlockPlaceholderName(block.name);
        context.placeholderToContent[startPhName] = {
            text: block.startSourceSpan.toString(),
            sourceSpan: block.startSourceSpan,
        };
        context.placeholderToContent[closePhName] = {
            text: block.endSourceSpan ? block.endSourceSpan.toString() : '}',
            sourceSpan: block.endSourceSpan ?? block.sourceSpan,
        };
        const node = new BlockPlaceholder(block.name, parameters, startPhName, closePhName, children, block.sourceSpan, block.startSourceSpan, block.endSourceSpan);
        return context.visitNodeFn(block, node);
    }
    visitBlockParameter(_parameter, _context) {
        throw new Error('Unreachable code');
    }
    visitLetDeclaration(decl, context) {
        return null;
    }
    /**
     * Convert, text and interpolated tokens up into text and placeholder pieces.
     *
     * @param tokens The text and interpolated tokens.
     * @param sourceSpan The span of the whole of the `text` string.
     * @param context The current context of the visitor, used to compute and store placeholders.
     * @param previousI18n Any i18n metadata associated with this `text` from a previous pass.
     */
    _visitTextWithInterpolation(tokens, sourceSpan, context, previousI18n) {
        // Return a sequence of `Text` and `Placeholder` nodes grouped in a `Container`.
        const nodes = [];
        // We will only create a container if there are actually interpolations,
        // so this flag tracks that.
        let hasInterpolation = false;
        for (const token of tokens) {
            switch (token.type) {
                case 8 /* TokenType.INTERPOLATION */:
                case 17 /* TokenType.ATTR_VALUE_INTERPOLATION */:
                    hasInterpolation = true;
                    const [startMarker, expression, endMarker] = token.parts;
                    const baseName = extractPlaceholderName(expression) || 'INTERPOLATION';
                    const phName = context.placeholderRegistry.getPlaceholderName(baseName, expression);
                    if (this._preserveExpressionWhitespace) {
                        context.placeholderToContent[phName] = {
                            text: token.parts.join(''),
                            sourceSpan: token.sourceSpan,
                        };
                        nodes.push(new Placeholder(expression, phName, token.sourceSpan));
                    }
                    else {
                        const normalized = this.normalizeExpression(token);
                        context.placeholderToContent[phName] = {
                            text: `${startMarker}${normalized}${endMarker}`,
                            sourceSpan: token.sourceSpan,
                        };
                        nodes.push(new Placeholder(normalized, phName, token.sourceSpan));
                    }
                    break;
                default:
                    // Try to merge text tokens with previous tokens. We do this even for all tokens
                    // when `retainEmptyTokens == true` because whitespace tokens may have non-zero
                    // length, but will be trimmed by `WhitespaceVisitor` in one extraction pass and
                    // be considered "empty" there. Therefore a whitespace token with
                    // `retainEmptyTokens === true` should be treated like an empty token and either
                    // retained or merged into the previous node. Since extraction does two passes with
                    // different trimming behavior, the second pass needs to have identical node count
                    // to reuse source spans, so we need this check to get the same answer when both
                    // trimming and not trimming.
                    if (token.parts[0].length > 0 || this._retainEmptyTokens) {
                        // This token is text or an encoded entity.
                        // If it is following on from a previous text node then merge it into that node
                        // Otherwise, if it is following an interpolation, then add a new node.
                        const previous = nodes[nodes.length - 1];
                        if (previous instanceof Text$2) {
                            previous.value += token.parts[0];
                            previous.sourceSpan = new ParseSourceSpan(previous.sourceSpan.start, token.sourceSpan.end, previous.sourceSpan.fullStart, previous.sourceSpan.details);
                        }
                        else {
                            nodes.push(new Text$2(token.parts[0], token.sourceSpan));
                        }
                    }
                    else {
                        // Retain empty tokens to avoid breaking dropping entire nodes such that source
                        // spans should not be reusable across multiple parses of a template. We *should*
                        // do this all the time, however we need to maintain backwards compatibility
                        // with existing message IDs so we can't do it by default and should only enable
                        // this when removing significant whitespace.
                        if (this._retainEmptyTokens) {
                            nodes.push(new Text$2(token.parts[0], token.sourceSpan));
                        }
                    }
                    break;
            }
        }
        if (hasInterpolation) {
            // Whitespace removal may have invalidated the interpolation source-spans.
            reusePreviousSourceSpans(nodes, previousI18n);
            return new Container(nodes, sourceSpan);
        }
        else {
            return nodes[0];
        }
    }
    // Normalize expression whitespace by parsing and re-serializing it. This makes
    // message IDs more durable to insignificant whitespace changes.
    normalizeExpression(token) {
        const expression = token.parts[1];
        const expr = this._expressionParser.parseBinding(expression, 
        /* location */ token.sourceSpan.start.toString(), 
        /* absoluteOffset */ token.sourceSpan.start.offset, this._interpolationConfig);
        return serialize(expr);
    }
}
/**
 * Re-use the source-spans from `previousI18n` metadata for the `nodes`.
 *
 * Whitespace removal can invalidate the source-spans of interpolation nodes, so we
 * reuse the source-span stored from a previous pass before the whitespace was removed.
 *
 * @param nodes The `Text` and `Placeholder` nodes to be processed.
 * @param previousI18n Any i18n metadata for these `nodes` stored from a previous pass.
 */
function reusePreviousSourceSpans(nodes, previousI18n) {
    if (previousI18n instanceof Message) {
        // The `previousI18n` is an i18n `Message`, so we are processing an `Attribute` with i18n
        // metadata. The `Message` should consist only of a single `Container` that contains the
        // parts (`Text` and `Placeholder`) to process.
        assertSingleContainerMessage(previousI18n);
        previousI18n = previousI18n.nodes[0];
    }
    if (previousI18n instanceof Container) {
        // The `previousI18n` is a `Container`, which means that this is a second i18n extraction pass
        // after whitespace has been removed from the AST nodes.
        assertEquivalentNodes(previousI18n.children, nodes);
        // Reuse the source-spans from the first pass.
        for (let i = 0; i < nodes.length; i++) {
            nodes[i].sourceSpan = previousI18n.children[i].sourceSpan;
        }
    }
}
/**
 * Asserts that the `message` contains exactly one `Container` node.
 */
function assertSingleContainerMessage(message) {
    const nodes = message.nodes;
    if (nodes.length !== 1 || !(nodes[0] instanceof Container)) {
        throw new Error('Unexpected previous i18n message - expected it to consist of only a single `Container` node.');
    }
}
/**
 * Asserts that the `previousNodes` and `node` collections have the same number of elements and
 * corresponding elements have the same node type.
 */
function assertEquivalentNodes(previousNodes, nodes) {
    if (previousNodes.length !== nodes.length) {
        throw new Error(`
The number of i18n message children changed between first and second pass.

First pass (${previousNodes.length} tokens):
${previousNodes.map((node) => `"${node.sourceSpan.toString()}"`).join('\n')}

Second pass (${nodes.length} tokens):
${nodes.map((node) => `"${node.sourceSpan.toString()}"`).join('\n')}
    `.trim());
    }
    if (previousNodes.some((node, i) => nodes[i].constructor !== node.constructor)) {
        throw new Error('The types of the i18n message children changed between first and second pass.');
    }
}
const _CUSTOM_PH_EXP = /\/\/[\s\S]*i18n[\s\S]*\([\s\S]*ph[\s\S]*=[\s\S]*("|')([\s\S]*?)\1[\s\S]*\)/g;
function extractPlaceholderName(input) {
    return input.split(_CUSTOM_PH_EXP)[2];
}

/**
 * An i18n error.
 */
class I18nError extends ParseError {
    constructor(span, msg) {
        super(span, msg);
    }
}

/**
 * Set of tagName|propertyName corresponding to Trusted Types sinks. Properties applying to all
 * tags use '*'.
 *
 * Extracted from, and should be kept in sync with
 * https://w3c.github.io/webappsec-trusted-types/dist/spec/#integrations
 */
const TRUSTED_TYPES_SINKS = new Set([
    // NOTE: All strings in this set *must* be lowercase!
    // TrustedHTML
    'iframe|srcdoc',
    '*|innerhtml',
    '*|outerhtml',
    // NB: no TrustedScript here, as the corresponding tags are stripped by the compiler.
    // TrustedScriptURL
    'embed|src',
    'object|codebase',
    'object|data',
]);
/**
 * isTrustedTypesSink returns true if the given property on the given DOM tag is a Trusted Types
 * sink. In that case, use `ElementSchemaRegistry.securityContext` to determine which particular
 * Trusted Type is required for values passed to the sink:
 * - SecurityContext.HTML corresponds to TrustedHTML
 * - SecurityContext.RESOURCE_URL corresponds to TrustedScriptURL
 */
function isTrustedTypesSink(tagName, propName) {
    // Make sure comparisons are case insensitive, so that case differences between attribute and
    // property names do not have a security impact.
    tagName = tagName.toLowerCase();
    propName = propName.toLowerCase();
    return (TRUSTED_TYPES_SINKS.has(tagName + '|' + propName) || TRUSTED_TYPES_SINKS.has('*|' + propName));
}

const setI18nRefs = (originalNodeMap) => {
    return (trimmedNode, i18nNode) => {
        // We need to set i18n properties on the original, untrimmed AST nodes. The i18n nodes needs to
        // use the trimmed content for message IDs to make messages more stable to whitespace changes.
        // But we don't want to actually trim the content, so we can't use the trimmed HTML AST for
        // general code gen. Instead we map the trimmed HTML AST back to the original AST and then
        // attach the i18n nodes so we get trimmed i18n nodes on the original (untrimmed) HTML AST.
        const originalNode = originalNodeMap.get(trimmedNode) ?? trimmedNode;
        if (originalNode instanceof NodeWithI18n) {
            if (i18nNode instanceof IcuPlaceholder && originalNode.i18n instanceof Message) {
                // This html node represents an ICU but this is a second processing pass, and the legacy id
                // was computed in the previous pass and stored in the `i18n` property as a message.
                // We are about to wipe out that property so capture the previous message to be reused when
                // generating the message for this ICU later. See `_generateI18nMessage()`.
                i18nNode.previousMessage = originalNode.i18n;
            }
            originalNode.i18n = i18nNode;
        }
        return i18nNode;
    };
};
/**
 * This visitor walks over HTML parse tree and converts information stored in
 * i18n-related attributes ("i18n" and "i18n-*") into i18n meta object that is
 * stored with other element's and attribute's information.
 */
class I18nMetaVisitor {
    interpolationConfig;
    keepI18nAttrs;
    enableI18nLegacyMessageIdFormat;
    containerBlocks;
    preserveSignificantWhitespace;
    retainEmptyTokens;
    // whether visited nodes contain i18n information
    hasI18nMeta = false;
    _errors = [];
    constructor(interpolationConfig = DEFAULT_INTERPOLATION_CONFIG, keepI18nAttrs = false, enableI18nLegacyMessageIdFormat = false, containerBlocks = DEFAULT_CONTAINER_BLOCKS, preserveSignificantWhitespace = true, 
    // When dropping significant whitespace we need to retain empty tokens or
    // else we won't be able to reuse source spans because empty tokens would be
    // removed and cause a mismatch. Unfortunately this still needs to be
    // configurable and sometimes needs to be set independently in order to make
    // sure the number of nodes don't change between parses, even when
    // `preserveSignificantWhitespace` changes.
    retainEmptyTokens = !preserveSignificantWhitespace) {
        this.interpolationConfig = interpolationConfig;
        this.keepI18nAttrs = keepI18nAttrs;
        this.enableI18nLegacyMessageIdFormat = enableI18nLegacyMessageIdFormat;
        this.containerBlocks = containerBlocks;
        this.preserveSignificantWhitespace = preserveSignificantWhitespace;
        this.retainEmptyTokens = retainEmptyTokens;
    }
    _generateI18nMessage(nodes, meta = '', visitNodeFn) {
        const { meaning, description, customId } = this._parseMetadata(meta);
        const createI18nMessage = createI18nMessageFactory(this.interpolationConfig, this.containerBlocks, this.retainEmptyTokens, 
        /* preserveExpressionWhitespace */ this.preserveSignificantWhitespace);
        const message = createI18nMessage(nodes, meaning, description, customId, visitNodeFn);
        this._setMessageId(message, meta);
        this._setLegacyIds(message, meta);
        return message;
    }
    visitAllWithErrors(nodes) {
        const result = nodes.map((node) => node.visit(this, null));
        return new ParseTreeResult(result, this._errors);
    }
    visitElement(element) {
        let message = undefined;
        if (hasI18nAttrs(element)) {
            this.hasI18nMeta = true;
            const attrs = [];
            const attrsMeta = {};
            for (const attr of element.attrs) {
                if (attr.name === I18N_ATTR) {
                    // root 'i18n' node attribute
                    const i18n = element.i18n || attr.value;
                    // Generate a new AST with whitespace trimmed, but also generate a map
                    // to correlate each new node to its original so we can apply i18n
                    // information to the original node based on the trimmed content.
                    //
                    // `WhitespaceVisitor` removes *insignificant* whitespace as well as
                    // significant whitespace. Enabling this visitor should be conditional
                    // on `preserveWhitespace` rather than `preserveSignificantWhitespace`,
                    // however this would be a breaking change for existing behavior where
                    // `preserveWhitespace` was not respected correctly when generating
                    // message IDs. This is really a bug but one we need to keep to maintain
                    // backwards compatibility.
                    const originalNodeMap = new Map();
                    const trimmedNodes = this.preserveSignificantWhitespace
                        ? element.children
                        : visitAllWithSiblings(new WhitespaceVisitor(false /* preserveSignificantWhitespace */, originalNodeMap), element.children);
                    message = this._generateI18nMessage(trimmedNodes, i18n, setI18nRefs(originalNodeMap));
                    if (message.nodes.length === 0) {
                        // Ignore the message if it is empty.
                        message = undefined;
                    }
                    // Store the message on the element
                    element.i18n = message;
                }
                else if (attr.name.startsWith(I18N_ATTR_PREFIX)) {
                    // 'i18n-*' attributes
                    const name = attr.name.slice(I18N_ATTR_PREFIX.length);
                    if (isTrustedTypesSink(element.name, name)) {
                        this._reportError(attr, `Translating attribute '${name}' is disallowed for security reasons.`);
                    }
                    else {
                        attrsMeta[name] = attr.value;
                    }
                }
                else {
                    // non-i18n attributes
                    attrs.push(attr);
                }
            }
            // set i18n meta for attributes
            if (Object.keys(attrsMeta).length) {
                for (const attr of attrs) {
                    const meta = attrsMeta[attr.name];
                    // do not create translation for empty attributes
                    if (meta !== undefined && attr.value) {
                        attr.i18n = this._generateI18nMessage([attr], attr.i18n || meta);
                    }
                }
            }
            if (!this.keepI18nAttrs) {
                // update element's attributes,
                // keeping only non-i18n related ones
                element.attrs = attrs;
            }
        }
        visitAll(this, element.children, message);
        return element;
    }
    visitExpansion(expansion, currentMessage) {
        let message;
        const meta = expansion.i18n;
        this.hasI18nMeta = true;
        if (meta instanceof IcuPlaceholder) {
            // set ICU placeholder name (e.g. "ICU_1"),
            // generated while processing root element contents,
            // so we can reference it when we output translation
            const name = meta.name;
            message = this._generateI18nMessage([expansion], meta);
            const icu = icuFromI18nMessage(message);
            icu.name = name;
            if (currentMessage !== null) {
                // Also update the placeholderToMessage map with this new message
                currentMessage.placeholderToMessage[name] = message;
            }
        }
        else {
            // ICU is a top level message, try to use metadata from container element if provided via
            // `context` argument. Note: context may not be available for standalone ICUs (without
            // wrapping element), so fallback to ICU metadata in this case.
            message = this._generateI18nMessage([expansion], currentMessage || meta);
        }
        expansion.i18n = message;
        return expansion;
    }
    visitText(text) {
        return text;
    }
    visitAttribute(attribute) {
        return attribute;
    }
    visitComment(comment) {
        return comment;
    }
    visitExpansionCase(expansionCase) {
        return expansionCase;
    }
    visitBlock(block, context) {
        visitAll(this, block.children, context);
        return block;
    }
    visitBlockParameter(parameter, context) {
        return parameter;
    }
    visitLetDeclaration(decl, context) {
        return decl;
    }
    /**
     * Parse the general form `meta` passed into extract the explicit metadata needed to create a
     * `Message`.
     *
     * There are three possibilities for the `meta` variable
     * 1) a string from an `i18n` template attribute: parse it to extract the metadata values.
     * 2) a `Message` from a previous processing pass: reuse the metadata values in the message.
     * 4) other: ignore this and just process the message metadata as normal
     *
     * @param meta the bucket that holds information about the message
     * @returns the parsed metadata.
     */
    _parseMetadata(meta) {
        return typeof meta === 'string'
            ? parseI18nMeta(meta)
            : meta instanceof Message
                ? meta
                : {};
    }
    /**
     * Generate (or restore) message id if not specified already.
     */
    _setMessageId(message, meta) {
        if (!message.id) {
            message.id = (meta instanceof Message && meta.id) || decimalDigest(message);
        }
    }
    /**
     * Update the `message` with a `legacyId` if necessary.
     *
     * @param message the message whose legacy id should be set
     * @param meta information about the message being processed
     */
    _setLegacyIds(message, meta) {
        if (this.enableI18nLegacyMessageIdFormat) {
            message.legacyIds = [computeDigest(message), computeDecimalDigest(message)];
        }
        else if (typeof meta !== 'string') {
            // This occurs if we are doing the 2nd pass after whitespace removal (see `parseTemplate()` in
            // `packages/compiler/src/render3/view/template.ts`).
            // In that case we want to reuse the legacy message generated in the 1st pass (see
            // `setI18nRefs()`).
            const previousMessage = meta instanceof Message
                ? meta
                : meta instanceof IcuPlaceholder
                    ? meta.previousMessage
                    : undefined;
            message.legacyIds = previousMessage ? previousMessage.legacyIds : [];
        }
    }
    _reportError(node, msg) {
        this._errors.push(new I18nError(node.sourceSpan, msg));
    }
}
/** I18n separators for metadata **/
const I18N_MEANING_SEPARATOR = '|';
const I18N_ID_SEPARATOR = '@@';
/**
 * Parses i18n metas like:
 *  - "@@id",
 *  - "description[@@id]",
 *  - "meaning|description[@@id]"
 * and returns an object with parsed output.
 *
 * @param meta String that represents i18n meta
 * @returns Object with id, meaning and description fields
 */
function parseI18nMeta(meta = '') {
    let customId;
    let meaning;
    let description;
    meta = meta.trim();
    if (meta) {
        const idIndex = meta.indexOf(I18N_ID_SEPARATOR);
        const descIndex = meta.indexOf(I18N_MEANING_SEPARATOR);
        let meaningAndDesc;
        [meaningAndDesc, customId] =
            idIndex > -1 ? [meta.slice(0, idIndex), meta.slice(idIndex + 2)] : [meta, ''];
        [meaning, description] =
            descIndex > -1
                ? [meaningAndDesc.slice(0, descIndex), meaningAndDesc.slice(descIndex + 1)]
                : ['', meaningAndDesc];
    }
    return { customId, meaning, description };
}
// Converts i18n meta information for a message (id, description, meaning)
// to a JsDoc statement formatted as expected by the Closure compiler.
function i18nMetaToJSDoc(meta) {
    const tags = [];
    if (meta.description) {
        tags.push({ tagName: "desc" /* o.JSDocTagName.Desc */, text: meta.description });
    }
    else {
        // Suppress the JSCompiler warning that a `@desc` was not given for this message.
        tags.push({ tagName: "suppress" /* o.JSDocTagName.Suppress */, text: '{msgDescriptions}' });
    }
    if (meta.meaning) {
        tags.push({ tagName: "meaning" /* o.JSDocTagName.Meaning */, text: meta.meaning });
    }
    return jsDocComment(tags);
}

/** Closure uses `goog.getMsg(message)` to lookup translations */
const GOOG_GET_MSG = 'goog.getMsg';
/**
 * Generates a `goog.getMsg()` statement and reassignment. The template:
 *
 * ```html
 * <div i18n>Sent from {{ sender }} to <span class="receiver">{{ receiver }}</span></div>
 * ```
 *
 * Generates:
 *
 * ```ts
 * const MSG_FOO = goog.getMsg(
 *   // Message template.
 *   'Sent from {$interpolation} to {$startTagSpan}{$interpolation_1}{$closeTagSpan}.',
 *   // Placeholder values, set to magic strings which get replaced by the Angular runtime.
 *   {
 *     'interpolation': '\uFFFD0\uFFFD',
 *     'startTagSpan': '\uFFFD1\uFFFD',
 *     'interpolation_1': '\uFFFD2\uFFFD',
 *     'closeTagSpan': '\uFFFD3\uFFFD',
 *   },
 *   // Options bag.
 *   {
 *     // Maps each placeholder to the original Angular source code which generates it's value.
 *     original_code: {
 *       'interpolation': '{{ sender }}',
 *       'startTagSpan': '<span class="receiver">',
 *       'interpolation_1': '{{ receiver }}',
 *       'closeTagSpan': '</span>',
 *     },
 *   },
 * );
 * const I18N_0 = MSG_FOO;
 * ```
 */
function createGoogleGetMsgStatements(variable$1, message, closureVar, placeholderValues) {
    const messageString = serializeI18nMessageForGetMsg(message);
    const args = [literal$1(messageString)];
    if (Object.keys(placeholderValues).length) {
        // Message template parameters containing the magic strings replaced by the Angular runtime with
        // real data, e.g. `{'interpolation': '\uFFFD0\uFFFD'}`.
        args.push(mapLiteral(formatI18nPlaceholderNamesInMap(placeholderValues, true /* useCamelCase */), true /* quoted */));
        // Message options object, which contains original source code for placeholders (as they are
        // present in a template, e.g.
        // `{original_code: {'interpolation': '{{ name }}', 'startTagSpan': '<span>'}}`.
        args.push(mapLiteral({
            original_code: literalMap(Object.keys(placeholderValues).map((param) => ({
                key: formatI18nPlaceholderName(param),
                quoted: true,
                value: message.placeholders[param]
                    ? // Get source span for typical placeholder if it exists.
                        literal$1(message.placeholders[param].sourceSpan.toString())
                    : // Otherwise must be an ICU expression, get it's source span.
                        literal$1(message.placeholderToMessage[param].nodes
                            .map((node) => node.sourceSpan.toString())
                            .join('')),
            }))),
        }));
    }
    // /**
    //  * @desc description of message
    //  * @meaning meaning of message
    //  */
    // const MSG_... = goog.getMsg(..);
    // I18N_X = MSG_...;
    const googGetMsgStmt = closureVar.set(variable(GOOG_GET_MSG).callFn(args)).toConstDecl();
    googGetMsgStmt.addLeadingComment(i18nMetaToJSDoc(message));
    const i18nAssignmentStmt = new ExpressionStatement(variable$1.set(closureVar));
    return [googGetMsgStmt, i18nAssignmentStmt];
}
/**
 * This visitor walks over i18n tree and generates its string representation, including ICUs and
 * placeholders in `{$placeholder}` (for plain messages) or `{PLACEHOLDER}` (inside ICUs) format.
 */
class GetMsgSerializerVisitor {
    formatPh(value) {
        return `{$${formatI18nPlaceholderName(value)}}`;
    }
    visitText(text) {
        return text.value;
    }
    visitContainer(container) {
        return container.children.map((child) => child.visit(this)).join('');
    }
    visitIcu(icu) {
        return serializeIcuNode(icu);
    }
    visitTagPlaceholder(ph) {
        return ph.isVoid
            ? this.formatPh(ph.startName)
            : `${this.formatPh(ph.startName)}${ph.children
                .map((child) => child.visit(this))
                .join('')}${this.formatPh(ph.closeName)}`;
    }
    visitPlaceholder(ph) {
        return this.formatPh(ph.name);
    }
    visitBlockPlaceholder(ph) {
        return `${this.formatPh(ph.startName)}${ph.children
            .map((child) => child.visit(this))
            .join('')}${this.formatPh(ph.closeName)}`;
    }
    visitIcuPlaceholder(ph, context) {
        return this.formatPh(ph.name);
    }
}
const serializerVisitor = new GetMsgSerializerVisitor();
function serializeI18nMessageForGetMsg(message) {
    return message.nodes.map((node) => node.visit(serializerVisitor, null)).join('');
}

function createLocalizeStatements(variable, message, params) {
    const { messageParts, placeHolders } = serializeI18nMessageForLocalize(message);
    const sourceSpan = getSourceSpan(message);
    const expressions = placeHolders.map((ph) => params[ph.text]);
    const localizedString$1 = localizedString(message, messageParts, placeHolders, expressions, sourceSpan);
    const variableInitialization = variable.set(localizedString$1);
    return [new ExpressionStatement(variableInitialization)];
}
/**
 * This visitor walks over an i18n tree, capturing literal strings and placeholders.
 *
 * The result can be used for generating the `$localize` tagged template literals.
 */
class LocalizeSerializerVisitor {
    placeholderToMessage;
    pieces;
    constructor(placeholderToMessage, pieces) {
        this.placeholderToMessage = placeholderToMessage;
        this.pieces = pieces;
    }
    visitText(text) {
        if (this.pieces[this.pieces.length - 1] instanceof LiteralPiece) {
            // Two literal pieces in a row means that there was some comment node in-between.
            this.pieces[this.pieces.length - 1].text += text.value;
        }
        else {
            const sourceSpan = new ParseSourceSpan(text.sourceSpan.fullStart, text.sourceSpan.end, text.sourceSpan.fullStart, text.sourceSpan.details);
            this.pieces.push(new LiteralPiece(text.value, sourceSpan));
        }
    }
    visitContainer(container) {
        container.children.forEach((child) => child.visit(this));
    }
    visitIcu(icu) {
        this.pieces.push(new LiteralPiece(serializeIcuNode(icu), icu.sourceSpan));
    }
    visitTagPlaceholder(ph) {
        this.pieces.push(this.createPlaceholderPiece(ph.startName, ph.startSourceSpan ?? ph.sourceSpan));
        if (!ph.isVoid) {
            ph.children.forEach((child) => child.visit(this));
            this.pieces.push(this.createPlaceholderPiece(ph.closeName, ph.endSourceSpan ?? ph.sourceSpan));
        }
    }
    visitPlaceholder(ph) {
        this.pieces.push(this.createPlaceholderPiece(ph.name, ph.sourceSpan));
    }
    visitBlockPlaceholder(ph) {
        this.pieces.push(this.createPlaceholderPiece(ph.startName, ph.startSourceSpan ?? ph.sourceSpan));
        ph.children.forEach((child) => child.visit(this));
        this.pieces.push(this.createPlaceholderPiece(ph.closeName, ph.endSourceSpan ?? ph.sourceSpan));
    }
    visitIcuPlaceholder(ph) {
        this.pieces.push(this.createPlaceholderPiece(ph.name, ph.sourceSpan, this.placeholderToMessage[ph.name]));
    }
    createPlaceholderPiece(name, sourceSpan, associatedMessage) {
        return new PlaceholderPiece(formatI18nPlaceholderName(name, /* useCamelCase */ false), sourceSpan, associatedMessage);
    }
}
/**
 * Serialize an i18n message into two arrays: messageParts and placeholders.
 *
 * These arrays will be used to generate `$localize` tagged template literals.
 *
 * @param message The message to be serialized.
 * @returns an object containing the messageParts and placeholders.
 */
function serializeI18nMessageForLocalize(message) {
    const pieces = [];
    const serializerVisitor = new LocalizeSerializerVisitor(message.placeholderToMessage, pieces);
    message.nodes.forEach((node) => node.visit(serializerVisitor));
    return processMessagePieces(pieces);
}
function getSourceSpan(message) {
    const startNode = message.nodes[0];
    const endNode = message.nodes[message.nodes.length - 1];
    return new ParseSourceSpan(startNode.sourceSpan.fullStart, endNode.sourceSpan.end, startNode.sourceSpan.fullStart, startNode.sourceSpan.details);
}
/**
 * Convert the list of serialized MessagePieces into two arrays.
 *
 * One contains the literal string pieces and the other the placeholders that will be replaced by
 * expressions when rendering `$localize` tagged template literals.
 *
 * @param pieces The pieces to process.
 * @returns an object containing the messageParts and placeholders.
 */
function processMessagePieces(pieces) {
    const messageParts = [];
    const placeHolders = [];
    if (pieces[0] instanceof PlaceholderPiece) {
        // The first piece was a placeholder so we need to add an initial empty message part.
        messageParts.push(createEmptyMessagePart(pieces[0].sourceSpan.start));
    }
    for (let i = 0; i < pieces.length; i++) {
        const part = pieces[i];
        if (part instanceof LiteralPiece) {
            messageParts.push(part);
        }
        else {
            placeHolders.push(part);
            if (pieces[i - 1] instanceof PlaceholderPiece) {
                // There were two placeholders in a row, so we need to add an empty message part.
                messageParts.push(createEmptyMessagePart(pieces[i - 1].sourceSpan.end));
            }
        }
    }
    if (pieces[pieces.length - 1] instanceof PlaceholderPiece) {
        // The last piece was a placeholder so we need to add a final empty message part.
        messageParts.push(createEmptyMessagePart(pieces[pieces.length - 1].sourceSpan.end));
    }
    return { messageParts, placeHolders };
}
function createEmptyMessagePart(location) {
    return new LiteralPiece('', new ParseSourceSpan(location, location));
}

/** Name of the global variable that is used to determine if we use Closure translations or not */
const NG_I18N_CLOSURE_MODE = 'ngI18nClosureMode';
/**
 * Prefix for non-`goog.getMsg` i18n-related vars.
 * Note: the prefix uses lowercase characters intentionally due to a Closure behavior that
 * considers variables like `I18N_0` as constants and throws an error when their value changes.
 */
const TRANSLATION_VAR_PREFIX = 'i18n_';
/** Prefix of ICU expressions for post processing */
const I18N_ICU_MAPPING_PREFIX = 'I18N_EXP_';
/**
 * The escape sequence used for message param values.
 */
const ESCAPE = '\uFFFD';
/* Closure variables holding messages must be named `MSG_[A-Z0-9]+` */
const CLOSURE_TRANSLATION_VAR_PREFIX = 'MSG_';
/**
 * Generates a prefix for translation const name.
 *
 * @param extra Additional local prefix that should be injected into translation var name
 * @returns Complete translation const prefix
 */
function getTranslationConstPrefix(extra) {
    return `${CLOSURE_TRANSLATION_VAR_PREFIX}${extra}`.toUpperCase();
}
/**
 * Generate AST to declare a variable. E.g. `var I18N_1;`.
 * @param variable the name of the variable to declare.
 */
function declareI18nVariable(variable) {
    return new DeclareVarStmt(variable.name, undefined, INFERRED_TYPE, undefined, variable.sourceSpan);
}
/**
 * Lifts i18n properties into the consts array.
 * TODO: Can we use `ConstCollectedExpr`?
 * TODO: The way the various attributes are linked together is very complex. Perhaps we could
 * simplify the process, maybe by combining the context and message ops?
 */
function collectI18nConsts(job) {
    const fileBasedI18nSuffix = job.relativeContextFilePath.replace(/[^A-Za-z0-9]/g, '_').toUpperCase() + '_';
    // Step One: Build up various lookup maps we need to collect all the consts.
    // Context Xref -> Extracted Attribute Ops
    const extractedAttributesByI18nContext = new Map();
    // Element/ElementStart Xref -> I18n Attributes config op
    const i18nAttributesByElement = new Map();
    // Element/ElementStart Xref -> All I18n Expression ops for attrs on that target
    const i18nExpressionsByElement = new Map();
    // I18n Message Xref -> I18n Message Op (TODO: use a central op map)
    const messages = new Map();
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            if (op.kind === OpKind.ExtractedAttribute && op.i18nContext !== null) {
                const attributes = extractedAttributesByI18nContext.get(op.i18nContext) ?? [];
                attributes.push(op);
                extractedAttributesByI18nContext.set(op.i18nContext, attributes);
            }
            else if (op.kind === OpKind.I18nAttributes) {
                i18nAttributesByElement.set(op.target, op);
            }
            else if (op.kind === OpKind.I18nExpression &&
                op.usage === I18nExpressionFor.I18nAttribute) {
                const expressions = i18nExpressionsByElement.get(op.target) ?? [];
                expressions.push(op);
                i18nExpressionsByElement.set(op.target, expressions);
            }
            else if (op.kind === OpKind.I18nMessage) {
                messages.set(op.xref, op);
            }
        }
    }
    // Step Two: Serialize the extracted i18n messages for root i18n blocks and i18n attributes into
    // the const array.
    //
    // Also, each i18n message will have a variable expression that can refer to its
    // value. Store these expressions in the appropriate place:
    // 1. For normal i18n content, it also goes in the const array. We save the const index to use
    // later.
    // 2. For extracted attributes, it becomes the value of the extracted attribute instruction.
    // 3. For i18n bindings, it will go in a separate const array instruction below; for now, we just
    // save it.
    const i18nValuesByContext = new Map();
    const messageConstIndices = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.I18nMessage) {
                if (op.messagePlaceholder === null) {
                    const { mainVar, statements } = collectMessage(job, fileBasedI18nSuffix, messages, op);
                    if (op.i18nBlock !== null) {
                        // This is a regular i18n message with a corresponding i18n block. Collect it into the
                        // const array.
                        const i18nConst = job.addConst(mainVar, statements);
                        messageConstIndices.set(op.i18nBlock, i18nConst);
                    }
                    else {
                        // This is an i18n attribute. Extract the initializers into the const pool.
                        job.constsInitializers.push(...statements);
                        // Save the i18n variable value for later.
                        i18nValuesByContext.set(op.i18nContext, mainVar);
                        // This i18n message may correspond to an individual extracted attribute. If so, The
                        // value of that attribute is updated to read the extracted i18n variable.
                        const attributesForMessage = extractedAttributesByI18nContext.get(op.i18nContext);
                        if (attributesForMessage !== undefined) {
                            for (const attr of attributesForMessage) {
                                attr.expression = mainVar.clone();
                            }
                        }
                    }
                }
                OpList.remove(op);
            }
        }
    }
    // Step Three: Serialize I18nAttributes configurations into the const array. Each I18nAttributes
    // instruction has a config array, which contains k-v pairs describing each binding name, and the
    // i18n variable that provides the value.
    for (const unit of job.units) {
        for (const elem of unit.create) {
            if (isElementOrContainerOp(elem)) {
                const i18nAttributes = i18nAttributesByElement.get(elem.xref);
                if (i18nAttributes === undefined) {
                    // This element is not associated with an i18n attributes configuration instruction.
                    continue;
                }
                let i18nExpressions = i18nExpressionsByElement.get(elem.xref);
                if (i18nExpressions === undefined) {
                    // Unused i18nAttributes should have already been removed.
                    // TODO: Should the removal of those dead instructions be merged with this phase?
                    throw new Error('AssertionError: Could not find any i18n expressions associated with an I18nAttributes instruction');
                }
                // Find expressions for all the unique property names, removing duplicates.
                const seenPropertyNames = new Set();
                i18nExpressions = i18nExpressions.filter((i18nExpr) => {
                    const seen = seenPropertyNames.has(i18nExpr.name);
                    seenPropertyNames.add(i18nExpr.name);
                    return !seen;
                });
                const i18nAttributeConfig = i18nExpressions.flatMap((i18nExpr) => {
                    const i18nExprValue = i18nValuesByContext.get(i18nExpr.context);
                    if (i18nExprValue === undefined) {
                        throw new Error("AssertionError: Could not find i18n expression's value");
                    }
                    return [literal$1(i18nExpr.name), i18nExprValue];
                });
                i18nAttributes.i18nAttributesConfig = job.addConst(new LiteralArrayExpr(i18nAttributeConfig));
            }
        }
    }
    // Step Four: Propagate the extracted const index into i18n ops that messages were extracted from.
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.I18nStart) {
                const msgIndex = messageConstIndices.get(op.root);
                if (msgIndex === undefined) {
                    throw new Error('AssertionError: Could not find corresponding i18n block index for an i18n message op; was an i18n message incorrectly assumed to correspond to an attribute?');
                }
                op.messageIndex = msgIndex;
            }
        }
    }
}
/**
 * Collects the given message into a set of statements that can be added to the const array.
 * This will recursively collect any sub-messages referenced from the parent message as well.
 */
function collectMessage(job, fileBasedI18nSuffix, messages, messageOp) {
    // Recursively collect any sub-messages, record e   ach sub-message's main variable under its
    // placeholder so that we can add them to the params for the parent message. It is possible
    // that multiple sub-messages will share the same placeholder, so we need to track an array of
    // variables for each placeholder.
    const statements = [];
    const subMessagePlaceholders = new Map();
    for (const subMessageId of messageOp.subMessages) {
        const subMessage = messages.get(subMessageId);
        const { mainVar: subMessageVar, statements: subMessageStatements } = collectMessage(job, fileBasedI18nSuffix, messages, subMessage);
        statements.push(...subMessageStatements);
        const subMessages = subMessagePlaceholders.get(subMessage.messagePlaceholder) ?? [];
        subMessages.push(subMessageVar);
        subMessagePlaceholders.set(subMessage.messagePlaceholder, subMessages);
    }
    addSubMessageParams(messageOp, subMessagePlaceholders);
    // Sort the params for consistency with TemaplateDefinitionBuilder output.
    messageOp.params = new Map([...messageOp.params.entries()].sort());
    const mainVar = variable(job.pool.uniqueName(TRANSLATION_VAR_PREFIX));
    // Closure Compiler requires const names to start with `MSG_` but disallows any other
    // const to start with `MSG_`. We define a variable starting with `MSG_` just for the
    // `goog.getMsg` call
    const closureVar = i18nGenerateClosureVar(job.pool, messageOp.message.id, fileBasedI18nSuffix, job.i18nUseExternalIds);
    let transformFn = undefined;
    // If nescessary, add a post-processing step and resolve any placeholder params that are
    // set in post-processing.
    if (messageOp.needsPostprocessing || messageOp.postprocessingParams.size > 0) {
        // Sort the post-processing params for consistency with TemaplateDefinitionBuilder output.
        const postprocessingParams = Object.fromEntries([...messageOp.postprocessingParams.entries()].sort());
        const formattedPostprocessingParams = formatI18nPlaceholderNamesInMap(postprocessingParams, 
        /* useCamelCase */ false);
        const extraTransformFnParams = [];
        if (messageOp.postprocessingParams.size > 0) {
            extraTransformFnParams.push(mapLiteral(formattedPostprocessingParams, /* quoted */ true));
        }
        transformFn = (expr) => importExpr(Identifiers.i18nPostprocess).callFn([expr, ...extraTransformFnParams]);
    }
    // Add the message's statements
    statements.push(...getTranslationDeclStmts(messageOp.message, mainVar, closureVar, messageOp.params, transformFn));
    return { mainVar, statements };
}
/**
 * Adds the given subMessage placeholders to the given message op.
 *
 * If a placeholder only corresponds to a single sub-message variable, we just set that variable
 * as the param value. However, if the placeholder corresponds to multiple sub-message
 * variables, we need to add a special placeholder value that is handled by the post-processing
 * step. We then add the array of variables as a post-processing param.
 */
function addSubMessageParams(messageOp, subMessagePlaceholders) {
    for (const [placeholder, subMessages] of subMessagePlaceholders) {
        if (subMessages.length === 1) {
            messageOp.params.set(placeholder, subMessages[0]);
        }
        else {
            messageOp.params.set(placeholder, literal$1(`${ESCAPE}${I18N_ICU_MAPPING_PREFIX}${placeholder}${ESCAPE}`));
            messageOp.postprocessingParams.set(placeholder, literalArr(subMessages));
        }
    }
}
/**
 * Generate statements that define a given translation message.
 *
 * ```ts
 * var I18N_1;
 * if (typeof ngI18nClosureMode !== undefined && ngI18nClosureMode) {
 *     var MSG_EXTERNAL_XXX = goog.getMsg(
 *          "Some message with {$interpolation}!",
 *          { "interpolation": "\uFFFD0\uFFFD" }
 *     );
 *     I18N_1 = MSG_EXTERNAL_XXX;
 * }
 * else {
 *     I18N_1 = $localize`Some message with ${'\uFFFD0\uFFFD'}!`;
 * }
 * ```
 *
 * @param message The original i18n AST message node
 * @param variable The variable that will be assigned the translation, e.g. `I18N_1`.
 * @param closureVar The variable for Closure `goog.getMsg` calls, e.g. `MSG_EXTERNAL_XXX`.
 * @param params Object mapping placeholder names to their values (e.g.
 * `{ "interpolation": "\uFFFD0\uFFFD" }`).
 * @param transformFn Optional transformation function that will be applied to the translation
 *     (e.g.
 * post-processing).
 * @returns An array of statements that defined a given translation.
 */
function getTranslationDeclStmts(message, variable, closureVar, params, transformFn) {
    const paramsObject = Object.fromEntries(params);
    const statements = [
        declareI18nVariable(variable),
        ifStmt(createClosureModeGuard(), createGoogleGetMsgStatements(variable, message, closureVar, paramsObject), createLocalizeStatements(variable, message, formatI18nPlaceholderNamesInMap(paramsObject, /* useCamelCase */ false))),
    ];
    if (transformFn) {
        statements.push(new ExpressionStatement(variable.set(transformFn(variable))));
    }
    return statements;
}
/**
 * Create the expression that will be used to guard the closure mode block
 * It is equivalent to:
 *
 * ```ts
 * typeof ngI18nClosureMode !== undefined && ngI18nClosureMode
 * ```
 */
function createClosureModeGuard() {
    return typeofExpr(variable(NG_I18N_CLOSURE_MODE))
        .notIdentical(literal$1('undefined', STRING_TYPE))
        .and(variable(NG_I18N_CLOSURE_MODE));
}
/**
 * Generates vars with Closure-specific names for i18n blocks (i.e. `MSG_XXX`).
 */
function i18nGenerateClosureVar(pool, messageId, fileBasedI18nSuffix, useExternalIds) {
    let name;
    const suffix = fileBasedI18nSuffix;
    if (useExternalIds) {
        const prefix = getTranslationConstPrefix(`EXTERNAL_`);
        const uniqueSuffix = pool.uniqueName(suffix);
        name = `${prefix}${sanitizeIdentifier(messageId)}$$${uniqueSuffix}`;
    }
    else {
        const prefix = getTranslationConstPrefix(suffix);
        name = pool.uniqueName(prefix);
    }
    return variable(name);
}

/**
 * Removes text nodes within i18n blocks since they are already hardcoded into the i18n message.
 * Also, replaces interpolations on these text nodes with i18n expressions of the non-text portions,
 * which will be applied later.
 */
function convertI18nText(job) {
    for (const unit of job.units) {
        // Remove all text nodes within i18n blocks, their content is already captured in the i18n
        // message.
        let currentI18n = null;
        let currentIcu = null;
        const textNodeI18nBlocks = new Map();
        const textNodeIcus = new Map();
        const icuPlaceholderByText = new Map();
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nStart:
                    if (op.context === null) {
                        throw Error('I18n op should have its context set.');
                    }
                    currentI18n = op;
                    break;
                case OpKind.I18nEnd:
                    currentI18n = null;
                    break;
                case OpKind.IcuStart:
                    if (op.context === null) {
                        throw Error('Icu op should have its context set.');
                    }
                    currentIcu = op;
                    break;
                case OpKind.IcuEnd:
                    currentIcu = null;
                    break;
                case OpKind.Text:
                    if (currentI18n !== null) {
                        textNodeI18nBlocks.set(op.xref, currentI18n);
                        textNodeIcus.set(op.xref, currentIcu);
                        if (op.icuPlaceholder !== null) {
                            // Create an op to represent the ICU placeholder. Initially set its static text to the
                            // value of the text op, though this may be overwritten later if this text op is a
                            // placeholder for an interpolation.
                            const icuPlaceholderOp = createIcuPlaceholderOp(job.allocateXrefId(), op.icuPlaceholder, [op.initialValue]);
                            OpList.replace(op, icuPlaceholderOp);
                            icuPlaceholderByText.set(op.xref, icuPlaceholderOp);
                        }
                        else {
                            // Otherwise just remove the text op, since its value is already accounted for in the
                            // translated message.
                            OpList.remove(op);
                        }
                    }
                    break;
            }
        }
        // Update any interpolations to the removed text, and instead represent them as a series of i18n
        // expressions that we then apply.
        for (const op of unit.update) {
            switch (op.kind) {
                case OpKind.InterpolateText:
                    if (!textNodeI18nBlocks.has(op.target)) {
                        continue;
                    }
                    const i18nOp = textNodeI18nBlocks.get(op.target);
                    const icuOp = textNodeIcus.get(op.target);
                    const icuPlaceholder = icuPlaceholderByText.get(op.target);
                    const contextId = icuOp ? icuOp.context : i18nOp.context;
                    const resolutionTime = icuOp
                        ? I18nParamResolutionTime.Postproccessing
                        : I18nParamResolutionTime.Creation;
                    const ops = [];
                    for (let i = 0; i < op.interpolation.expressions.length; i++) {
                        const expr = op.interpolation.expressions[i];
                        // For now, this i18nExpression depends on the slot context of the enclosing i18n block.
                        // Later, we will modify this, and advance to a different point.
                        ops.push(createI18nExpressionOp(contextId, i18nOp.xref, i18nOp.xref, i18nOp.handle, expr, icuPlaceholder?.xref ?? null, op.interpolation.i18nPlaceholders[i] ?? null, resolutionTime, I18nExpressionFor.I18nText, '', expr.sourceSpan ?? op.sourceSpan));
                    }
                    OpList.replaceWithMany(op, ops);
                    // If this interpolation is part of an ICU placeholder, add the strings and expressions to
                    // the placeholder.
                    if (icuPlaceholder !== undefined) {
                        icuPlaceholder.strings = op.interpolation.strings;
                    }
                    break;
            }
        }
    }
}

/**
 * Lifts local reference declarations on element-like structures within each view into an entry in
 * the `consts` array for the whole component.
 */
function liftLocalRefs(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.ElementStart:
                case OpKind.Template:
                    if (!Array.isArray(op.localRefs)) {
                        throw new Error(`AssertionError: expected localRefs to be an array still`);
                    }
                    op.numSlotsUsed += op.localRefs.length;
                    if (op.localRefs.length > 0) {
                        const localRefs = serializeLocalRefs(op.localRefs);
                        op.localRefs = job.addConst(localRefs);
                    }
                    else {
                        op.localRefs = null;
                    }
                    break;
            }
        }
    }
}
function serializeLocalRefs(refs) {
    const constRefs = [];
    for (const ref of refs) {
        constRefs.push(literal$1(ref.name), literal$1(ref.target));
    }
    return literalArr(constRefs);
}

/**
 * Change namespaces between HTML, SVG and MathML, depending on the next element.
 */
function emitNamespaceChanges(job) {
    for (const unit of job.units) {
        let activeNamespace = Namespace.HTML;
        for (const op of unit.create) {
            if (op.kind !== OpKind.ElementStart) {
                continue;
            }
            if (op.namespace !== activeNamespace) {
                OpList.insertBefore(createNamespaceOp(op.namespace), op);
                activeNamespace = op.namespace;
            }
        }
    }
}

/**
 * Parses string representation of a style and converts it into object literal.
 *
 * @param value string representation of style as used in the `style` attribute in HTML.
 *   Example: `color: red; height: auto`.
 * @returns An array of style property name and value pairs, e.g. `['color', 'red', 'height',
 * 'auto']`
 */
function parse(value) {
    // we use a string array here instead of a string map
    // because a string-map is not guaranteed to retain the
    // order of the entries whereas a string array can be
    // constructed in a [key, value, key, value] format.
    const styles = [];
    let i = 0;
    let parenDepth = 0;
    let quote = 0 /* Char.QuoteNone */;
    let valueStart = 0;
    let propStart = 0;
    let currentProp = null;
    while (i < value.length) {
        const token = value.charCodeAt(i++);
        switch (token) {
            case 40 /* Char.OpenParen */:
                parenDepth++;
                break;
            case 41 /* Char.CloseParen */:
                parenDepth--;
                break;
            case 39 /* Char.QuoteSingle */:
                // valueStart needs to be there since prop values don't
                // have quotes in CSS
                if (quote === 0 /* Char.QuoteNone */) {
                    quote = 39 /* Char.QuoteSingle */;
                }
                else if (quote === 39 /* Char.QuoteSingle */ && value.charCodeAt(i - 1) !== 92 /* Char.BackSlash */) {
                    quote = 0 /* Char.QuoteNone */;
                }
                break;
            case 34 /* Char.QuoteDouble */:
                // same logic as above
                if (quote === 0 /* Char.QuoteNone */) {
                    quote = 34 /* Char.QuoteDouble */;
                }
                else if (quote === 34 /* Char.QuoteDouble */ && value.charCodeAt(i - 1) !== 92 /* Char.BackSlash */) {
                    quote = 0 /* Char.QuoteNone */;
                }
                break;
            case 58 /* Char.Colon */:
                if (!currentProp && parenDepth === 0 && quote === 0 /* Char.QuoteNone */) {
                    // TODO: Do not hyphenate CSS custom property names like: `--intentionallyCamelCase`
                    currentProp = hyphenate(value.substring(propStart, i - 1).trim());
                    valueStart = i;
                }
                break;
            case 59 /* Char.Semicolon */:
                if (currentProp && valueStart > 0 && parenDepth === 0 && quote === 0 /* Char.QuoteNone */) {
                    const styleVal = value.substring(valueStart, i - 1).trim();
                    styles.push(currentProp, styleVal);
                    propStart = i;
                    valueStart = 0;
                    currentProp = null;
                }
                break;
        }
    }
    if (currentProp && valueStart) {
        const styleVal = value.slice(valueStart).trim();
        styles.push(currentProp, styleVal);
    }
    return styles;
}
function hyphenate(value) {
    return value
        .replace(/[a-z][A-Z]/g, (v) => {
        return v.charAt(0) + '-' + v.charAt(1);
    })
        .toLowerCase();
}
/**
 * Parses extracted style and class attributes into separate ExtractedAttributeOps per style or
 * class property.
 */
function parseExtractedStyles(job) {
    const elements = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (isElementOrContainerOp(op)) {
                elements.set(op.xref, op);
            }
        }
    }
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.ExtractedAttribute &&
                op.bindingKind === BindingKind.Attribute &&
                isStringLiteral(op.expression)) {
                const target = elements.get(op.target);
                if (target !== undefined &&
                    target.kind === OpKind.Template &&
                    target.templateKind === TemplateKind.Structural) {
                    // TemplateDefinitionBuilder will not apply class and style bindings to structural
                    // directives; instead, it will leave them as attributes.
                    // (It's not clear what that would mean, anyway -- classes and styles on a structural
                    // element should probably be a parse error.)
                    // TODO: We may be able to remove this once Template Pipeline is the default.
                    continue;
                }
                if (op.name === 'style') {
                    const parsedStyles = parse(op.expression.value);
                    for (let i = 0; i < parsedStyles.length - 1; i += 2) {
                        OpList.insertBefore(createExtractedAttributeOp(op.target, BindingKind.StyleProperty, null, parsedStyles[i], literal$1(parsedStyles[i + 1]), null, null, SecurityContext.STYLE), op);
                    }
                    OpList.remove(op);
                }
                else if (op.name === 'class') {
                    const parsedClasses = op.expression.value.trim().split(/\s+/g);
                    for (const parsedClass of parsedClasses) {
                        OpList.insertBefore(createExtractedAttributeOp(op.target, BindingKind.ClassName, null, parsedClass, null, null, null, SecurityContext.NONE), op);
                    }
                    OpList.remove(op);
                }
            }
        }
    }
}

/**
 * Generate names for functions and variables across all views.
 *
 * This includes propagating those names into any `ir.ReadVariableExpr`s of those variables, so that
 * the reads can be emitted correctly.
 */
function nameFunctionsAndVariables(job) {
    addNamesToView(job.root, job.componentName, { index: 0 }, job.compatibility === CompatibilityMode.TemplateDefinitionBuilder);
}
function addNamesToView(unit, baseName, state, compatibility) {
    if (unit.fnName === null) {
        // Ensure unique names for view units. This is necessary because there might be multiple
        // components with same names in the context of the same pool. Only add the suffix
        // if really needed.
        unit.fnName = unit.job.pool.uniqueName(sanitizeIdentifier(`${baseName}_${unit.job.fnSuffix}`), 
        /* alwaysIncludeSuffix */ false);
    }
    // Keep track of the names we assign to variables in the view. We'll need to propagate these
    // into reads of those variables afterwards.
    const varNames = new Map();
    for (const op of unit.ops()) {
        switch (op.kind) {
            case OpKind.Property:
            case OpKind.HostProperty:
                if (op.isAnimationTrigger) {
                    op.name = '@' + op.name;
                }
                break;
            case OpKind.Listener:
                if (op.handlerFnName !== null) {
                    break;
                }
                if (!op.hostListener && op.targetSlot.slot === null) {
                    throw new Error(`Expected a slot to be assigned`);
                }
                let animation = '';
                if (op.isAnimationListener) {
                    op.name = `@${op.name}.${op.animationPhase}`;
                    animation = 'animation';
                }
                if (op.hostListener) {
                    op.handlerFnName = `${baseName}_${animation}${op.name}_HostBindingHandler`;
                }
                else {
                    op.handlerFnName = `${unit.fnName}_${op.tag.replace('-', '_')}_${animation}${op.name}_${op.targetSlot.slot}_listener`;
                }
                op.handlerFnName = sanitizeIdentifier(op.handlerFnName);
                break;
            case OpKind.TwoWayListener:
                if (op.handlerFnName !== null) {
                    break;
                }
                if (op.targetSlot.slot === null) {
                    throw new Error(`Expected a slot to be assigned`);
                }
                op.handlerFnName = sanitizeIdentifier(`${unit.fnName}_${op.tag.replace('-', '_')}_${op.name}_${op.targetSlot.slot}_listener`);
                break;
            case OpKind.Variable:
                varNames.set(op.xref, getVariableName(unit, op.variable, state));
                break;
            case OpKind.RepeaterCreate:
                if (!(unit instanceof ViewCompilationUnit)) {
                    throw new Error(`AssertionError: must be compiling a component`);
                }
                if (op.handle.slot === null) {
                    throw new Error(`Expected slot to be assigned`);
                }
                if (op.emptyView !== null) {
                    const emptyView = unit.job.views.get(op.emptyView);
                    // Repeater empty view function is at slot +2 (metadata is in the first slot).
                    addNamesToView(emptyView, `${baseName}_${op.functionNameSuffix}Empty_${op.handle.slot + 2}`, state, compatibility);
                }
                // Repeater primary view function is at slot +1 (metadata is in the first slot).
                addNamesToView(unit.job.views.get(op.xref), `${baseName}_${op.functionNameSuffix}_${op.handle.slot + 1}`, state, compatibility);
                break;
            case OpKind.Projection:
                if (!(unit instanceof ViewCompilationUnit)) {
                    throw new Error(`AssertionError: must be compiling a component`);
                }
                if (op.handle.slot === null) {
                    throw new Error(`Expected slot to be assigned`);
                }
                if (op.fallbackView !== null) {
                    const fallbackView = unit.job.views.get(op.fallbackView);
                    addNamesToView(fallbackView, `${baseName}_ProjectionFallback_${op.handle.slot}`, state, compatibility);
                }
                break;
            case OpKind.Template:
                if (!(unit instanceof ViewCompilationUnit)) {
                    throw new Error(`AssertionError: must be compiling a component`);
                }
                const childView = unit.job.views.get(op.xref);
                if (op.handle.slot === null) {
                    throw new Error(`Expected slot to be assigned`);
                }
                const suffix = op.functionNameSuffix.length === 0 ? '' : `_${op.functionNameSuffix}`;
                addNamesToView(childView, `${baseName}${suffix}_${op.handle.slot}`, state, compatibility);
                break;
            case OpKind.StyleProp:
                op.name = normalizeStylePropName(op.name);
                if (compatibility) {
                    op.name = stripImportant(op.name);
                }
                break;
            case OpKind.ClassProp:
                if (compatibility) {
                    op.name = stripImportant(op.name);
                }
                break;
        }
    }
    // Having named all variables declared in the view, now we can push those names into the
    // `ir.ReadVariableExpr` expressions which represent reads of those variables.
    for (const op of unit.ops()) {
        visitExpressionsInOp(op, (expr) => {
            if (!(expr instanceof ReadVariableExpr) || expr.name !== null) {
                return;
            }
            if (!varNames.has(expr.xref)) {
                throw new Error(`Variable ${expr.xref} not yet named`);
            }
            expr.name = varNames.get(expr.xref);
        });
    }
}
function getVariableName(unit, variable, state) {
    if (variable.name === null) {
        switch (variable.kind) {
            case SemanticVariableKind.Context:
                variable.name = `ctx_r${state.index++}`;
                break;
            case SemanticVariableKind.Identifier:
                if (unit.job.compatibility === CompatibilityMode.TemplateDefinitionBuilder) {
                    // TODO: Prefix increment and `_r` are for compatibility with the old naming scheme.
                    // This has the potential to cause collisions when `ctx` is the identifier, so we need a
                    // special check for that as well.
                    const compatPrefix = variable.identifier === 'ctx' ? 'i' : '';
                    variable.name = `${variable.identifier}_${compatPrefix}r${++state.index}`;
                }
                else {
                    variable.name = `${variable.identifier}_i${state.index++}`;
                }
                break;
            default:
                // TODO: Prefix increment for compatibility only.
                variable.name = `_r${++state.index}`;
                break;
        }
    }
    return variable.name;
}
/**
 * Normalizes a style prop name by hyphenating it (unless its a CSS variable).
 */
function normalizeStylePropName(name) {
    return name.startsWith('--') ? name : hyphenate(name);
}
/**
 * Strips `!important` out of the given style or class name.
 */
function stripImportant(name) {
    const importantIndex = name.indexOf('!important');
    if (importantIndex > -1) {
        return name.substring(0, importantIndex);
    }
    return name;
}

/**
 * Merges logically sequential `NextContextExpr` operations.
 *
 * `NextContextExpr` can be referenced repeatedly, "popping" the runtime's context stack each time.
 * When two such expressions appear back-to-back, it's possible to merge them together into a single
 * `NextContextExpr` that steps multiple contexts. This merging is possible if all conditions are
 * met:
 *
 *   * The result of the `NextContextExpr` that's folded into the subsequent one is not stored (that
 *     is, the call is purely side-effectful).
 *   * No operations in between them uses the implicit context.
 */
function mergeNextContextExpressions(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.Listener || op.kind === OpKind.TwoWayListener) {
                mergeNextContextsInOps(op.handlerOps);
            }
        }
        mergeNextContextsInOps(unit.update);
    }
}
function mergeNextContextsInOps(ops) {
    for (const op of ops) {
        // Look for a candidate operation to maybe merge.
        if (op.kind !== OpKind.Statement ||
            !(op.statement instanceof ExpressionStatement) ||
            !(op.statement.expr instanceof NextContextExpr)) {
            continue;
        }
        const mergeSteps = op.statement.expr.steps;
        // Try to merge this `ir.NextContextExpr`.
        let tryToMerge = true;
        for (let candidate = op.next; candidate.kind !== OpKind.ListEnd && tryToMerge; candidate = candidate.next) {
            visitExpressionsInOp(candidate, (expr, flags) => {
                if (!isIrExpression(expr)) {
                    return expr;
                }
                if (!tryToMerge) {
                    // Either we've already merged, or failed to merge.
                    return;
                }
                if (flags & VisitorContextFlag.InChildOperation) {
                    // We cannot merge into child operations.
                    return;
                }
                switch (expr.kind) {
                    case ExpressionKind.NextContext:
                        // Merge the previous `ir.NextContextExpr` into this one.
                        expr.steps += mergeSteps;
                        OpList.remove(op);
                        tryToMerge = false;
                        break;
                    case ExpressionKind.GetCurrentView:
                    case ExpressionKind.Reference:
                    case ExpressionKind.ContextLetReference:
                        // Can't merge past a dependency on the context.
                        tryToMerge = false;
                        break;
                }
                return;
            });
        }
    }
}

const CONTAINER_TAG = 'ng-container';
/**
 * Replace an `Element` or `ElementStart` whose tag is `ng-container` with a specific op.
 */
function generateNgContainerOps(job) {
    for (const unit of job.units) {
        const updatedElementXrefs = new Set();
        for (const op of unit.create) {
            if (op.kind === OpKind.ElementStart && op.tag === CONTAINER_TAG) {
                // Transmute the `ElementStart` instruction to `ContainerStart`.
                op.kind = OpKind.ContainerStart;
                updatedElementXrefs.add(op.xref);
            }
            if (op.kind === OpKind.ElementEnd && updatedElementXrefs.has(op.xref)) {
                // This `ElementEnd` is associated with an `ElementStart` we already transmuted.
                op.kind = OpKind.ContainerEnd;
            }
        }
    }
}

/**
 * Looks up an element in the given map by xref ID.
 */
function lookupElement(elements, xref) {
    const el = elements.get(xref);
    if (el === undefined) {
        throw new Error('All attributes should have an element-like target.');
    }
    return el;
}
/**
 * When a container is marked with `ngNonBindable`, the non-bindable characteristic also applies to
 * all descendants of that container. Therefore, we must emit `disableBindings` and `enableBindings`
 * instructions for every such container.
 */
function disableBindings$1(job) {
    const elements = new Map();
    for (const view of job.units) {
        for (const op of view.create) {
            if (!isElementOrContainerOp(op)) {
                continue;
            }
            elements.set(op.xref, op);
        }
    }
    for (const unit of job.units) {
        for (const op of unit.create) {
            if ((op.kind === OpKind.ElementStart || op.kind === OpKind.ContainerStart) &&
                op.nonBindable) {
                OpList.insertAfter(createDisableBindingsOp(op.xref), op);
            }
            if ((op.kind === OpKind.ElementEnd || op.kind === OpKind.ContainerEnd) &&
                lookupElement(elements, op.xref).nonBindable) {
                OpList.insertBefore(createEnableBindingsOp(op.xref), op);
            }
        }
    }
}

/**
 * Nullish coalescing expressions such as `a ?? b` have different semantics in Angular templates as
 * compared to JavaScript. In particular, they default to `null` instead of `undefined`. Therefore,
 * we replace them with ternary expressions, assigning temporaries as needed to avoid re-evaluating
 * the same sub-expression multiple times.
 */
function generateNullishCoalesceExpressions(job) {
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            transformExpressionsInOp(op, (expr) => {
                if (!(expr instanceof BinaryOperatorExpr) ||
                    expr.operator !== BinaryOperator.NullishCoalesce) {
                    return expr;
                }
                const assignment = new AssignTemporaryExpr(expr.lhs.clone(), job.allocateXrefId());
                const read = new ReadTemporaryExpr(assignment.xref);
                // TODO: When not in compatibility mode for TemplateDefinitionBuilder, we can just emit
                // `t != null` instead of including an undefined check as well.
                return new ConditionalExpr(new BinaryOperatorExpr(BinaryOperator.And, new BinaryOperatorExpr(BinaryOperator.NotIdentical, assignment, NULL_EXPR), new BinaryOperatorExpr(BinaryOperator.NotIdentical, read, new LiteralExpr(undefined))), read.clone(), expr.rhs);
            }, VisitorContextFlag.None);
        }
    }
}

function kindTest(kind) {
    return (op) => op.kind === kind;
}
function kindWithInterpolationTest(kind, interpolation) {
    return (op) => {
        return op.kind === kind && interpolation === op.expression instanceof Interpolation;
    };
}
function basicListenerKindTest(op) {
    return ((op.kind === OpKind.Listener && !(op.hostListener && op.isAnimationListener)) ||
        op.kind === OpKind.TwoWayListener);
}
function nonInterpolationPropertyKindTest(op) {
    return ((op.kind === OpKind.Property || op.kind === OpKind.TwoWayProperty) &&
        !(op.expression instanceof Interpolation));
}
/**
 * Defines the groups based on `OpKind` that ops will be divided into, for the various create
 * op kinds. Ops will be collected into groups, then optionally transformed, before recombining
 * the groups in the order defined here.
 */
const CREATE_ORDERING = [
    { test: (op) => op.kind === OpKind.Listener && op.hostListener && op.isAnimationListener },
    { test: basicListenerKindTest },
];
/**
 * Defines the groups based on `OpKind` that ops will be divided into, for the various update
 * op kinds.
 */
const UPDATE_ORDERING = [
    { test: kindTest(OpKind.StyleMap), transform: keepLast },
    { test: kindTest(OpKind.ClassMap), transform: keepLast },
    { test: kindTest(OpKind.StyleProp) },
    { test: kindTest(OpKind.ClassProp) },
    { test: kindWithInterpolationTest(OpKind.Attribute, true) },
    { test: kindWithInterpolationTest(OpKind.Property, true) },
    { test: nonInterpolationPropertyKindTest },
    { test: kindWithInterpolationTest(OpKind.Attribute, false) },
];
/**
 * Host bindings have their own update ordering.
 */
const UPDATE_HOST_ORDERING = [
    { test: kindWithInterpolationTest(OpKind.HostProperty, true) },
    { test: kindWithInterpolationTest(OpKind.HostProperty, false) },
    { test: kindTest(OpKind.Attribute) },
    { test: kindTest(OpKind.StyleMap), transform: keepLast },
    { test: kindTest(OpKind.ClassMap), transform: keepLast },
    { test: kindTest(OpKind.StyleProp) },
    { test: kindTest(OpKind.ClassProp) },
];
/**
 * The set of all op kinds we handle in the reordering phase.
 */
const handledOpKinds = new Set([
    OpKind.Listener,
    OpKind.TwoWayListener,
    OpKind.StyleMap,
    OpKind.ClassMap,
    OpKind.StyleProp,
    OpKind.ClassProp,
    OpKind.Property,
    OpKind.TwoWayProperty,
    OpKind.HostProperty,
    OpKind.Attribute,
]);
/**
 * Many type of operations have ordering constraints that must be respected. For example, a
 * `ClassMap` instruction must be ordered after a `StyleMap` instruction, in order to have
 * predictable semantics that match TemplateDefinitionBuilder and don't break applications.
 */
function orderOps(job) {
    for (const unit of job.units) {
        // First, we pull out ops that need to be ordered. Then, when we encounter an op that shouldn't
        // be reordered, put the ones we've pulled so far back in the correct order. Finally, if we
        // still have ops pulled at the end, put them back in the correct order.
        // Create mode:
        orderWithin(unit.create, CREATE_ORDERING);
        // Update mode:
        const ordering = unit.job.kind === CompilationJobKind.Host ? UPDATE_HOST_ORDERING : UPDATE_ORDERING;
        orderWithin(unit.update, ordering);
    }
}
/**
 * Order all the ops within the specified group.
 */
function orderWithin(opList, ordering) {
    let opsToOrder = [];
    // Only reorder ops that target the same xref; do not mix ops that target different xrefs.
    let firstTargetInGroup = null;
    for (const op of opList) {
        const currentTarget = hasDependsOnSlotContextTrait(op) ? op.target : null;
        if (!handledOpKinds.has(op.kind) ||
            (currentTarget !== firstTargetInGroup &&
                firstTargetInGroup !== null &&
                currentTarget !== null)) {
            OpList.insertBefore(reorder(opsToOrder, ordering), op);
            opsToOrder = [];
            firstTargetInGroup = null;
        }
        if (handledOpKinds.has(op.kind)) {
            opsToOrder.push(op);
            OpList.remove(op);
            firstTargetInGroup = currentTarget ?? firstTargetInGroup;
        }
    }
    opList.push(reorder(opsToOrder, ordering));
}
/**
 * Reorders the given list of ops according to the ordering defined by `ORDERING`.
 */
function reorder(ops, ordering) {
    // Break the ops list into groups based on OpKind.
    const groups = Array.from(ordering, () => new Array());
    for (const op of ops) {
        const groupIndex = ordering.findIndex((o) => o.test(op));
        groups[groupIndex].push(op);
    }
    // Reassemble the groups into a single list, in the correct order.
    return groups.flatMap((group, i) => {
        const transform = ordering[i].transform;
        return transform ? transform(group) : group;
    });
}
/**
 * Keeps only the last op in a list of ops.
 */
function keepLast(ops) {
    return ops.slice(ops.length - 1);
}

/**
 * Attributes of `ng-content` named 'select' are specifically removed, because they control which
 * content matches as a property of the `projection`, and are not a plain attribute.
 */
function removeContentSelectors(job) {
    for (const unit of job.units) {
        const elements = createOpXrefMap(unit);
        for (const op of unit.ops()) {
            switch (op.kind) {
                case OpKind.Binding:
                    const target = lookupInXrefMap(elements, op.target);
                    if (isSelectAttribute(op.name) && target.kind === OpKind.Projection) {
                        OpList.remove(op);
                    }
                    break;
            }
        }
    }
}
function isSelectAttribute(name) {
    return name.toLowerCase() === 'select';
}
/**
 * Looks up an element in the given map by xref ID.
 */
function lookupInXrefMap(map, xref) {
    const el = map.get(xref);
    if (el === undefined) {
        throw new Error('All attributes should have an slottable target.');
    }
    return el;
}

/**
 * This phase generates pipe creation instructions. We do this based on the pipe bindings found in
 * the update block, in the order we see them.
 *
 * When not in compatibility mode, we can simply group all these creation instructions together, to
 * maximize chaining opportunities.
 */
function createPipes(job) {
    for (const unit of job.units) {
        processPipeBindingsInView(unit);
    }
}
function processPipeBindingsInView(unit) {
    for (const updateOp of unit.update) {
        visitExpressionsInOp(updateOp, (expr, flags) => {
            if (!isIrExpression(expr)) {
                return;
            }
            if (expr.kind !== ExpressionKind.PipeBinding) {
                return;
            }
            if (flags & VisitorContextFlag.InChildOperation) {
                throw new Error(`AssertionError: pipe bindings should not appear in child expressions`);
            }
            if (unit.job.compatibility) {
                // TODO: We can delete this cast and check once compatibility mode is removed.
                const slotHandle = updateOp.target;
                if (slotHandle == undefined) {
                    throw new Error(`AssertionError: expected slot handle to be assigned for pipe creation`);
                }
                addPipeToCreationBlock(unit, updateOp.target, expr);
            }
            else {
                // When not in compatibility mode, we just add the pipe to the end of the create block. This
                // is not only simpler and faster, but allows more chaining opportunities for other
                // instructions.
                unit.create.push(createPipeOp(expr.target, expr.targetSlot, expr.name));
            }
        });
    }
}
function addPipeToCreationBlock(unit, afterTargetXref, binding) {
    // Find the appropriate point to insert the Pipe creation operation.
    // We're looking for `afterTargetXref` (and also want to insert after any other pipe operations
    // which might be beyond it).
    for (let op = unit.create.head.next; op.kind !== OpKind.ListEnd; op = op.next) {
        if (!hasConsumesSlotTrait(op)) {
            continue;
        }
        if (op.xref !== afterTargetXref) {
            continue;
        }
        // We've found a tentative insertion point; however, we also want to skip past any _other_ pipe
        // operations present.
        while (op.next.kind === OpKind.Pipe) {
            op = op.next;
        }
        const pipe = createPipeOp(binding.target, binding.targetSlot, binding.name);
        OpList.insertBefore(pipe, op.next);
        // This completes adding the pipe to the creation block.
        return;
    }
    // At this point, we've failed to add the pipe to the creation block.
    throw new Error(`AssertionError: unable to find insertion point for pipe ${binding.name}`);
}

/**
 * Pipes that accept more than 4 arguments are variadic, and are handled with a different runtime
 * instruction.
 */
function createVariadicPipes(job) {
    for (const unit of job.units) {
        for (const op of unit.update) {
            transformExpressionsInOp(op, (expr) => {
                if (!(expr instanceof PipeBindingExpr)) {
                    return expr;
                }
                // Pipes are variadic if they have more than 4 arguments.
                if (expr.args.length <= 4) {
                    return expr;
                }
                return new PipeBindingVariadicExpr(expr.target, expr.targetSlot, expr.name, literalArr(expr.args), expr.args.length);
            }, VisitorContextFlag.None);
        }
    }
}

/**
 * Propagate i18n blocks down through child templates that act as placeholders in the root i18n
 * message. Specifically, perform an in-order traversal of all the views, and add i18nStart/i18nEnd
 * op pairs into descending views. Also, assign an increasing sub-template index to each
 * descending view.
 */
function propagateI18nBlocks(job) {
    propagateI18nBlocksToTemplates(job.root, 0);
}
/**
 * Propagates i18n ops in the given view through to any child views recursively.
 */
function propagateI18nBlocksToTemplates(unit, subTemplateIndex) {
    let i18nBlock = null;
    for (const op of unit.create) {
        switch (op.kind) {
            case OpKind.I18nStart:
                op.subTemplateIndex = subTemplateIndex === 0 ? null : subTemplateIndex;
                i18nBlock = op;
                break;
            case OpKind.I18nEnd:
                // When we exit a root-level i18n block, reset the sub-template index counter.
                if (i18nBlock.subTemplateIndex === null) {
                    subTemplateIndex = 0;
                }
                i18nBlock = null;
                break;
            case OpKind.Template:
                subTemplateIndex = propagateI18nBlocksForView(unit.job.views.get(op.xref), i18nBlock, op.i18nPlaceholder, subTemplateIndex);
                break;
            case OpKind.RepeaterCreate:
                // Propagate i18n blocks to the @for template.
                const forView = unit.job.views.get(op.xref);
                subTemplateIndex = propagateI18nBlocksForView(forView, i18nBlock, op.i18nPlaceholder, subTemplateIndex);
                // Then if there's an @empty template, propagate the i18n blocks for it as well.
                if (op.emptyView !== null) {
                    subTemplateIndex = propagateI18nBlocksForView(unit.job.views.get(op.emptyView), i18nBlock, op.emptyI18nPlaceholder, subTemplateIndex);
                }
                break;
        }
    }
    return subTemplateIndex;
}
/**
 * Propagate i18n blocks for a view.
 */
function propagateI18nBlocksForView(view, i18nBlock, i18nPlaceholder, subTemplateIndex) {
    // We found an <ng-template> inside an i18n block; increment the sub-template counter and
    // wrap the template's view in a child i18n block.
    if (i18nPlaceholder !== undefined) {
        if (i18nBlock === null) {
            throw Error('Expected template with i18n placeholder to be in an i18n block.');
        }
        subTemplateIndex++;
        wrapTemplateWithI18n(view, i18nBlock);
    }
    // Continue traversing inside the template's view.
    return propagateI18nBlocksToTemplates(view, subTemplateIndex);
}
/**
 * Wraps a template view with i18n start and end ops.
 */
function wrapTemplateWithI18n(unit, parentI18n) {
    // Only add i18n ops if they have not already been propagated to this template.
    if (unit.create.head.next?.kind !== OpKind.I18nStart) {
        const id = unit.job.allocateXrefId();
        OpList.insertAfter(
        // Nested ng-template i18n start/end ops should not receive source spans.
        createI18nStartOp(id, parentI18n.message, parentI18n.root, null), unit.create.head);
        OpList.insertBefore(createI18nEndOp(id, null), unit.create.tail);
    }
}

function extractPureFunctions(job) {
    for (const view of job.units) {
        for (const op of view.ops()) {
            visitExpressionsInOp(op, (expr) => {
                if (!(expr instanceof PureFunctionExpr) || expr.body === null) {
                    return;
                }
                const constantDef = new PureFunctionConstant(expr.args.length);
                expr.fn = job.pool.getSharedConstant(constantDef, expr.body);
                expr.body = null;
            });
        }
    }
}
class PureFunctionConstant extends GenericKeyFn {
    numArgs;
    constructor(numArgs) {
        super();
        this.numArgs = numArgs;
    }
    keyOf(expr) {
        if (expr instanceof PureFunctionParameterExpr) {
            return `param(${expr.index})`;
        }
        else {
            return super.keyOf(expr);
        }
    }
    // TODO: Use the new pool method `getSharedFunctionReference`
    toSharedConstantDeclaration(declName, keyExpr) {
        const fnParams = [];
        for (let idx = 0; idx < this.numArgs; idx++) {
            fnParams.push(new FnParam('a' + idx));
        }
        // We will never visit `ir.PureFunctionParameterExpr`s that don't belong to us, because this
        // transform runs inside another visitor which will visit nested pure functions before this one.
        const returnExpr = transformExpressionsInExpression(keyExpr, (expr) => {
            if (!(expr instanceof PureFunctionParameterExpr)) {
                return expr;
            }
            return variable('a' + expr.index);
        }, VisitorContextFlag.None);
        return new DeclareVarStmt(declName, new ArrowFunctionExpr(fnParams, returnExpr), undefined, exports.StmtModifier.Final);
    }
}

function generatePureLiteralStructures(job) {
    for (const unit of job.units) {
        for (const op of unit.update) {
            transformExpressionsInOp(op, (expr, flags) => {
                if (flags & VisitorContextFlag.InChildOperation) {
                    return expr;
                }
                if (expr instanceof LiteralArrayExpr) {
                    return transformLiteralArray(expr);
                }
                else if (expr instanceof LiteralMapExpr) {
                    return transformLiteralMap(expr);
                }
                return expr;
            }, VisitorContextFlag.None);
        }
    }
}
function transformLiteralArray(expr) {
    const derivedEntries = [];
    const nonConstantArgs = [];
    for (const entry of expr.entries) {
        if (entry.isConstant()) {
            derivedEntries.push(entry);
        }
        else {
            const idx = nonConstantArgs.length;
            nonConstantArgs.push(entry);
            derivedEntries.push(new PureFunctionParameterExpr(idx));
        }
    }
    return new PureFunctionExpr(literalArr(derivedEntries), nonConstantArgs);
}
function transformLiteralMap(expr) {
    let derivedEntries = [];
    const nonConstantArgs = [];
    for (const entry of expr.entries) {
        if (entry.value.isConstant()) {
            derivedEntries.push(entry);
        }
        else {
            const idx = nonConstantArgs.length;
            nonConstantArgs.push(entry.value);
            derivedEntries.push(new LiteralMapEntry(entry.key, new PureFunctionParameterExpr(idx), entry.quoted));
        }
    }
    return new PureFunctionExpr(literalMap(derivedEntries), nonConstantArgs);
}

// This file contains helpers for generating calls to Ivy instructions. In particular, each
// instruction type is represented as a function, which may select a specific instruction variant
// depending on the exact arguments.
function element(slot, tag, constIndex, localRefIndex, sourceSpan) {
    return elementOrContainerBase(Identifiers.element, slot, tag, constIndex, localRefIndex, sourceSpan);
}
function elementStart(slot, tag, constIndex, localRefIndex, sourceSpan) {
    return elementOrContainerBase(Identifiers.elementStart, slot, tag, constIndex, localRefIndex, sourceSpan);
}
function elementOrContainerBase(instruction, slot, tag, constIndex, localRefIndex, sourceSpan) {
    const args = [literal$1(slot)];
    if (tag !== null) {
        args.push(literal$1(tag));
    }
    if (localRefIndex !== null) {
        args.push(literal$1(constIndex), // might be null, but that's okay.
        literal$1(localRefIndex));
    }
    else if (constIndex !== null) {
        args.push(literal$1(constIndex));
    }
    return call(instruction, args, sourceSpan);
}
function elementEnd(sourceSpan) {
    return call(Identifiers.elementEnd, [], sourceSpan);
}
function elementContainerStart(slot, constIndex, localRefIndex, sourceSpan) {
    return elementOrContainerBase(Identifiers.elementContainerStart, slot, 
    /* tag */ null, constIndex, localRefIndex, sourceSpan);
}
function elementContainer(slot, constIndex, localRefIndex, sourceSpan) {
    return elementOrContainerBase(Identifiers.elementContainer, slot, 
    /* tag */ null, constIndex, localRefIndex, sourceSpan);
}
function elementContainerEnd() {
    return call(Identifiers.elementContainerEnd, [], null);
}
function template(slot, templateFnRef, decls, vars, tag, constIndex, localRefs, sourceSpan) {
    const args = [
        literal$1(slot),
        templateFnRef,
        literal$1(decls),
        literal$1(vars),
        literal$1(tag),
        literal$1(constIndex),
    ];
    if (localRefs !== null) {
        args.push(literal$1(localRefs));
        args.push(importExpr(Identifiers.templateRefExtractor));
    }
    while (args[args.length - 1].isEquivalent(NULL_EXPR)) {
        args.pop();
    }
    return call(Identifiers.templateCreate, args, sourceSpan);
}
function disableBindings() {
    return call(Identifiers.disableBindings, [], null);
}
function enableBindings() {
    return call(Identifiers.enableBindings, [], null);
}
function listener(name, handlerFn, eventTargetResolver, syntheticHost, sourceSpan) {
    const args = [literal$1(name), handlerFn];
    if (eventTargetResolver !== null) {
        args.push(literal$1(false)); // `useCapture` flag, defaults to `false`
        args.push(importExpr(eventTargetResolver));
    }
    return call(syntheticHost ? Identifiers.syntheticHostListener : Identifiers.listener, args, sourceSpan);
}
function twoWayBindingSet(target, value) {
    return importExpr(Identifiers.twoWayBindingSet).callFn([target, value]);
}
function twoWayListener(name, handlerFn, sourceSpan) {
    return call(Identifiers.twoWayListener, [literal$1(name), handlerFn], sourceSpan);
}
function pipe(slot, name) {
    return call(Identifiers.pipe, [literal$1(slot), literal$1(name)], null);
}
function namespaceHTML() {
    return call(Identifiers.namespaceHTML, [], null);
}
function namespaceSVG() {
    return call(Identifiers.namespaceSVG, [], null);
}
function namespaceMath() {
    return call(Identifiers.namespaceMathML, [], null);
}
function advance(delta, sourceSpan) {
    return call(Identifiers.advance, delta > 1 ? [literal$1(delta)] : [], sourceSpan);
}
function reference(slot) {
    return importExpr(Identifiers.reference).callFn([literal$1(slot)]);
}
function nextContext(steps) {
    return importExpr(Identifiers.nextContext).callFn(steps === 1 ? [] : [literal$1(steps)]);
}
function getCurrentView() {
    return importExpr(Identifiers.getCurrentView).callFn([]);
}
function restoreView(savedView) {
    return importExpr(Identifiers.restoreView).callFn([savedView]);
}
function resetView(returnValue) {
    return importExpr(Identifiers.resetView).callFn([returnValue]);
}
function text(slot, initialValue, sourceSpan) {
    const args = [literal$1(slot, null)];
    if (initialValue !== '') {
        args.push(literal$1(initialValue));
    }
    return call(Identifiers.text, args, sourceSpan);
}
function defer(selfSlot, primarySlot, dependencyResolverFn, loadingSlot, placeholderSlot, errorSlot, loadingConfig, placeholderConfig, enableTimerScheduling, sourceSpan, flags) {
    const args = [
        literal$1(selfSlot),
        literal$1(primarySlot),
        dependencyResolverFn ?? literal$1(null),
        literal$1(loadingSlot),
        literal$1(placeholderSlot),
        literal$1(errorSlot),
        loadingConfig ?? literal$1(null),
        placeholderConfig ?? literal$1(null),
        enableTimerScheduling ? importExpr(Identifiers.deferEnableTimerScheduling) : literal$1(null),
        literal$1(flags),
    ];
    let expr;
    while ((expr = args[args.length - 1]) !== null &&
        expr instanceof LiteralExpr &&
        expr.value === null) {
        args.pop();
    }
    return call(Identifiers.defer, args, sourceSpan);
}
const deferTriggerToR3TriggerInstructionsMap = new Map([
    [
        DeferTriggerKind.Idle,
        {
            ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnIdle,
            ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnIdle,
            ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnIdle,
        },
    ],
    [
        DeferTriggerKind.Immediate,
        {
            ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnImmediate,
            ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnImmediate,
            ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnImmediate,
        },
    ],
    [
        DeferTriggerKind.Timer,
        {
            ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnTimer,
            ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnTimer,
            ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnTimer,
        },
    ],
    [
        DeferTriggerKind.Hover,
        {
            ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnHover,
            ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnHover,
            ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnHover,
        },
    ],
    [
        DeferTriggerKind.Interaction,
        {
            ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnInteraction,
            ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnInteraction,
            ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnInteraction,
        },
    ],
    [
        DeferTriggerKind.Viewport,
        {
            ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnViewport,
            ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnViewport,
            ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnViewport,
        },
    ],
    [
        DeferTriggerKind.Never,
        {
            ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferHydrateNever,
            ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferHydrateNever,
            ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateNever,
        },
    ],
]);
function deferOn(trigger, args, modifier, sourceSpan) {
    const instructionToCall = deferTriggerToR3TriggerInstructionsMap.get(trigger)?.[modifier];
    if (instructionToCall === undefined) {
        throw new Error(`Unable to determine instruction for trigger ${trigger}`);
    }
    return call(instructionToCall, args.map((a) => literal$1(a)), sourceSpan);
}
function projectionDef(def) {
    return call(Identifiers.projectionDef, def ? [def] : [], null);
}
function projection(slot, projectionSlotIndex, attributes, fallbackFnName, fallbackDecls, fallbackVars, sourceSpan) {
    const args = [literal$1(slot)];
    if (projectionSlotIndex !== 0 || attributes !== null || fallbackFnName !== null) {
        args.push(literal$1(projectionSlotIndex));
        if (attributes !== null) {
            args.push(attributes);
        }
        if (fallbackFnName !== null) {
            if (attributes === null) {
                args.push(literal$1(null));
            }
            args.push(variable(fallbackFnName), literal$1(fallbackDecls), literal$1(fallbackVars));
        }
    }
    return call(Identifiers.projection, args, sourceSpan);
}
function i18nStart(slot, constIndex, subTemplateIndex, sourceSpan) {
    const args = [literal$1(slot), literal$1(constIndex)];
    if (subTemplateIndex !== null) {
        args.push(literal$1(subTemplateIndex));
    }
    return call(Identifiers.i18nStart, args, sourceSpan);
}
function repeaterCreate(slot, viewFnName, decls, vars, tag, constIndex, trackByFn, trackByUsesComponentInstance, emptyViewFnName, emptyDecls, emptyVars, emptyTag, emptyConstIndex, sourceSpan) {
    const args = [
        literal$1(slot),
        variable(viewFnName),
        literal$1(decls),
        literal$1(vars),
        literal$1(tag),
        literal$1(constIndex),
        trackByFn,
    ];
    if (trackByUsesComponentInstance || emptyViewFnName !== null) {
        args.push(literal$1(trackByUsesComponentInstance));
        if (emptyViewFnName !== null) {
            args.push(variable(emptyViewFnName), literal$1(emptyDecls), literal$1(emptyVars));
            if (emptyTag !== null || emptyConstIndex !== null) {
                args.push(literal$1(emptyTag));
            }
            if (emptyConstIndex !== null) {
                args.push(literal$1(emptyConstIndex));
            }
        }
    }
    return call(Identifiers.repeaterCreate, args, sourceSpan);
}
function repeater(collection, sourceSpan) {
    return call(Identifiers.repeater, [collection], sourceSpan);
}
function deferWhen(modifier, expr, sourceSpan) {
    if (modifier === "prefetch" /* ir.DeferOpModifierKind.PREFETCH */) {
        return call(Identifiers.deferPrefetchWhen, [expr], sourceSpan);
    }
    else if (modifier === "hydrate" /* ir.DeferOpModifierKind.HYDRATE */) {
        return call(Identifiers.deferHydrateWhen, [expr], sourceSpan);
    }
    return call(Identifiers.deferWhen, [expr], sourceSpan);
}
function declareLet(slot, sourceSpan) {
    return call(Identifiers.declareLet, [literal$1(slot)], sourceSpan);
}
function storeLet(value, sourceSpan) {
    return importExpr(Identifiers.storeLet).callFn([value], sourceSpan);
}
function readContextLet(slot) {
    return importExpr(Identifiers.readContextLet).callFn([literal$1(slot)]);
}
function i18n(slot, constIndex, subTemplateIndex, sourceSpan) {
    const args = [literal$1(slot), literal$1(constIndex)];
    if (subTemplateIndex) {
        args.push(literal$1(subTemplateIndex));
    }
    return call(Identifiers.i18n, args, sourceSpan);
}
function i18nEnd(endSourceSpan) {
    return call(Identifiers.i18nEnd, [], endSourceSpan);
}
function i18nAttributes(slot, i18nAttributesConfig) {
    const args = [literal$1(slot), literal$1(i18nAttributesConfig)];
    return call(Identifiers.i18nAttributes, args, null);
}
function property(name, expression, sanitizer, sourceSpan) {
    const args = [literal$1(name), expression];
    if (sanitizer !== null) {
        args.push(sanitizer);
    }
    return call(Identifiers.property, args, sourceSpan);
}
function twoWayProperty(name, expression, sanitizer, sourceSpan) {
    const args = [literal$1(name), expression];
    if (sanitizer !== null) {
        args.push(sanitizer);
    }
    return call(Identifiers.twoWayProperty, args, sourceSpan);
}
function attribute(name, expression, sanitizer, namespace) {
    const args = [literal$1(name), expression];
    if (sanitizer !== null || namespace !== null) {
        args.push(sanitizer ?? literal$1(null));
    }
    if (namespace !== null) {
        args.push(literal$1(namespace));
    }
    return call(Identifiers.attribute, args, null);
}
function styleProp(name, expression, unit, sourceSpan) {
    const args = [literal$1(name), expression];
    if (unit !== null) {
        args.push(literal$1(unit));
    }
    return call(Identifiers.styleProp, args, sourceSpan);
}
function classProp(name, expression, sourceSpan) {
    return call(Identifiers.classProp, [literal$1(name), expression], sourceSpan);
}
function styleMap(expression, sourceSpan) {
    return call(Identifiers.styleMap, [expression], sourceSpan);
}
function classMap(expression, sourceSpan) {
    return call(Identifiers.classMap, [expression], sourceSpan);
}
const PIPE_BINDINGS = [
    Identifiers.pipeBind1,
    Identifiers.pipeBind2,
    Identifiers.pipeBind3,
    Identifiers.pipeBind4,
];
function pipeBind(slot, varOffset, args) {
    if (args.length < 1 || args.length > PIPE_BINDINGS.length) {
        throw new Error(`pipeBind() argument count out of bounds`);
    }
    const instruction = PIPE_BINDINGS[args.length - 1];
    return importExpr(instruction).callFn([literal$1(slot), literal$1(varOffset), ...args]);
}
function pipeBindV(slot, varOffset, args) {
    return importExpr(Identifiers.pipeBindV).callFn([literal$1(slot), literal$1(varOffset), args]);
}
function textInterpolate(strings, expressions, sourceSpan) {
    const interpolationArgs = collateInterpolationArgs(strings, expressions);
    return callVariadicInstruction(TEXT_INTERPOLATE_CONFIG, [], interpolationArgs, [], sourceSpan);
}
function i18nExp(expr, sourceSpan) {
    return call(Identifiers.i18nExp, [expr], sourceSpan);
}
function i18nApply(slot, sourceSpan) {
    return call(Identifiers.i18nApply, [literal$1(slot)], sourceSpan);
}
function propertyInterpolate(name, strings, expressions, sanitizer, sourceSpan) {
    const interpolationArgs = collateInterpolationArgs(strings, expressions);
    const extraArgs = [];
    if (sanitizer !== null) {
        extraArgs.push(sanitizer);
    }
    return callVariadicInstruction(PROPERTY_INTERPOLATE_CONFIG, [literal$1(name)], interpolationArgs, extraArgs, sourceSpan);
}
function attributeInterpolate(name, strings, expressions, sanitizer, sourceSpan) {
    const interpolationArgs = collateInterpolationArgs(strings, expressions);
    const extraArgs = [];
    if (sanitizer !== null) {
        extraArgs.push(sanitizer);
    }
    return callVariadicInstruction(ATTRIBUTE_INTERPOLATE_CONFIG, [literal$1(name)], interpolationArgs, extraArgs, sourceSpan);
}
function stylePropInterpolate(name, strings, expressions, unit, sourceSpan) {
    const interpolationArgs = collateInterpolationArgs(strings, expressions);
    const extraArgs = [];
    if (unit !== null) {
        extraArgs.push(literal$1(unit));
    }
    return callVariadicInstruction(STYLE_PROP_INTERPOLATE_CONFIG, [literal$1(name)], interpolationArgs, extraArgs, sourceSpan);
}
function styleMapInterpolate(strings, expressions, sourceSpan) {
    const interpolationArgs = collateInterpolationArgs(strings, expressions);
    return callVariadicInstruction(STYLE_MAP_INTERPOLATE_CONFIG, [], interpolationArgs, [], sourceSpan);
}
function classMapInterpolate(strings, expressions, sourceSpan) {
    const interpolationArgs = collateInterpolationArgs(strings, expressions);
    return callVariadicInstruction(CLASS_MAP_INTERPOLATE_CONFIG, [], interpolationArgs, [], sourceSpan);
}
function hostProperty(name, expression, sanitizer, sourceSpan) {
    const args = [literal$1(name), expression];
    if (sanitizer !== null) {
        args.push(sanitizer);
    }
    return call(Identifiers.hostProperty, args, sourceSpan);
}
function syntheticHostProperty(name, expression, sourceSpan) {
    return call(Identifiers.syntheticHostProperty, [literal$1(name), expression], sourceSpan);
}
function pureFunction(varOffset, fn, args) {
    return callVariadicInstructionExpr(PURE_FUNCTION_CONFIG, [literal$1(varOffset), fn], args, [], null);
}
function attachSourceLocation(templatePath, locations) {
    return call(Identifiers.attachSourceLocations, [literal$1(templatePath), locations], null);
}
/**
 * Collates the string an expression arguments for an interpolation instruction.
 */
function collateInterpolationArgs(strings, expressions) {
    if (strings.length < 1 || expressions.length !== strings.length - 1) {
        throw new Error(`AssertionError: expected specific shape of args for strings/expressions in interpolation`);
    }
    const interpolationArgs = [];
    if (expressions.length === 1 && strings[0] === '' && strings[1] === '') {
        interpolationArgs.push(expressions[0]);
    }
    else {
        let idx;
        for (idx = 0; idx < expressions.length; idx++) {
            interpolationArgs.push(literal$1(strings[idx]), expressions[idx]);
        }
        // idx points at the last string.
        interpolationArgs.push(literal$1(strings[idx]));
    }
    return interpolationArgs;
}
function call(instruction, args, sourceSpan) {
    const expr = importExpr(instruction).callFn(args, sourceSpan);
    return createStatementOp(new ExpressionStatement(expr, sourceSpan));
}
function conditional(condition, contextValue, sou   rceSpan) {
    const args = [condition];
    if (contextValue !== null) {
        args.push(contextValue);
    }
    return call(Identifiers.conditional, args, sourceSpan);
}
/**
 * `InterpolationConfig` for the `textInterpolate` instruction.
 */
const TEXT_INTERPOLATE_CONFIG = {
    constant: [
        Identifiers.textInterpolate,
        Identifiers.textInterpolate1,
        Identifiers.textInterpolate2,
        Identifiers.textInterpolate3,
        Identifiers.textInterpolate4,
        Identifiers.textInterpolate5,
        Identifiers.textInterpolate6,
        Identifiers.textInterpolate7,
        Identifiers.textInterpolate8,
    ],
    variable: Identifiers.textInterpolateV,
    mapping: (n) => {
        if (n % 2 === 0) {
            throw new Error(`Expected odd number of arguments`);
        }
        return (n - 1) / 2;
    },
};
/**
 * `InterpolationConfig` for the `propertyInterpolate` instruction.
 */
const PROPERTY_INTERPOLATE_CONFIG = {
    constant: [
        Identifiers.propertyInterpolate,
        Identifiers.propertyInterpolate1,
        Identifiers.propertyInterpolate2,
        Identifiers.propertyInterpolate3,
        Identifiers.propertyInterpolate4,
        Identifiers.propertyInterpolate5,
        Identifiers.propertyInterpolate6,
        Identifiers.propertyInterpolate7,
        Identifiers.propertyInterpolate8,
    ],
    variable: Identifiers.propertyInterpolateV,
    mapping: (n) => {
        if (n % 2 === 0) {
            throw new Error(`Expected odd number of arguments`);
        }
        return (n - 1) / 2;
    },
};
/**
 * `InterpolationConfig` for the `stylePropInterpolate` instruction.
 */
const STYLE_PROP_INTERPOLATE_CONFIG = {
    constant: [
        Identifiers.styleProp,
        Identifiers.stylePropInterpolate1,
        Identifiers.stylePropInterpolate2,
        Identifiers.stylePropInterpolate3,
        Identifiers.stylePropInterpolate4,
        Identifiers.stylePropInterpolate5,
        Identifiers.stylePropInterpolate6,
        Identifiers.stylePropInterpolate7,
        Identifiers.stylePropInterpolate8,
    ],
    variable: Identifiers.stylePropInterpolateV,
    mapping: (n) => {
        if (n % 2 === 0) {
            throw new Error(`Expected odd number of arguments`);
        }
        return (n - 1) / 2;
    },
};
/**
 * `InterpolationConfig` for the `attributeInterpolate` instruction.
 */
const ATTRIBUTE_INTERPOLATE_CONFIG = {
    constant: [
        Identifiers.attribute,
        Identifiers.attributeInterpolate1,
        Identifiers.attributeInterpolate2,
        Identifiers.attributeInterpolate3,
        Identifiers.attributeInterpolate4,
        Identifiers.attributeInterpolate5,
        Identifiers.attributeInterpolate6,
        Identifiers.attributeInterpolate7,
        Identifiers.attributeInterpolate8,
    ],
    variable: Identifiers.attributeInterpolateV,
    mapping: (n) => {
        if (n % 2 === 0) {
            throw new Error(`Expected odd number of arguments`);
        }
        return (n - 1) / 2;
    },
};
/**
 * `InterpolationConfig` for the `styleMapInterpolate` instruction.
 */
const STYLE_MAP_INTERPOLATE_CONFIG = {
    constant: [
        Identifiers.styleMap,
        Identifiers.styleMapInterpolate1,
        Identifiers.styleMapInterpolate2,
        Identifiers.styleMapInterpolate3,
        Identifiers.styleMapInterpolate4,
        Identifiers.styleMapInterpolate5,
        Identifiers.styleMapInterpolate6,
        Identifiers.styleMapInterpolate7,
        Identifiers.styleMapInterpolate8,
    ],
    variable: Identifiers.styleMapInterpolateV,
    mapping: (n) => {
        if (n % 2 === 0) {
            throw new Error(`Expected odd number of arguments`);
        }
        return (n - 1) / 2;
    },
};
/**
 * `InterpolationConfig` for the `classMapInterpolate` instruction.
 */
const CLASS_MAP_INTERPOLATE_CONFIG = {
    constant: [
        Identifiers.classMap,
        Identifiers.classMapInterpolate1,
        Identifiers.classMapInterpolate2,
        Identifiers.classMapInterpolate3,
        Identifiers.classMapInterpolate4,
        Identifiers.classMapInterpolate5,
        Identifiers.classMapInterpolate6,
        Identifiers.classMapInterpolate7,
        Identifiers.classMapInterpolate8,
    ],
    variable: Identifiers.classMapInterpolateV,
    mapping: (n) => {
        if (n % 2 === 0) {
            throw new Error(`Expected odd number of arguments`);
        }
        return (n - 1) / 2;
    },
};
const PURE_FUNCTION_CONFIG = {
    constant: [
        Identifiers.pureFunction0,
        Identifiers.pureFunction1,
        Identifiers.pureFunction2,
        Identifiers.pureFunction3,
        Identifiers.pureFunction4,
        Identifiers.pureFunction5,
        Identifiers.pureFunction6,
        Identifiers.pureFunction7,
        Identifiers.pureFunction8,
    ],
    variable: Identifiers.pureFunctionV,
    mapping: (n) => n,
};
function callVariadicInstructionExpr(config, baseArgs, interpolationArgs, extraArgs, sourceSpan) {
    const n = config.mapping(interpolationArgs.length);
    if (n < config.constant.length) {
        // Constant calling pattern.
        return importExpr(config.constant[n])
            .callFn([...baseArgs, ...interpolationArgs, ...extraArgs], sourceSpan);
    }
    else if (config.variable !== null) {
        // Variable calling pattern.
        return importExpr(config.variable)
            .callFn([...baseArgs, literalArr(interpolationArgs), ...extraArgs], sourceSpan);
    }
    else {
        throw new Error(`AssertionError: unable to call variadic function`);
    }
}
function callVariadicInstruction(config, baseArgs, interpolationArgs, extraArgs, sourceSpan) {
    return createStatementOp(callVariadicInstructionExpr(config, baseArgs, interpolationArgs, extraArgs, sourceSpan).toStmt());
}

/**
 * Map of target resolvers for event listeners.
 */
const GLOBAL_TARGET_RESOLVERS = new Map([
    ['window', Identifiers.resolveWindow],
    ['document', Identifiers.resolveDocument],
    ['body', Identifiers.resolveBody],
]);
/**
 * Compiles semantic operations across all views and generates output `o.Statement`s with actual
 * runtime calls in their place.
 *
 * Reification replaces semantic operations with selected Ivy instructions and other generated code
 * structures. After reification, the create/update operation lists of all views should only contain
 * `ir.StatementOp`s (which wrap generated `o.Statement`s).
 */
function reify(job) {
    for (const unit of job.units) {
        reifyCreateOperations(unit, unit.create);
        reifyUpdateOperations(unit, unit.update);
    }
}
function reifyCreateOperations(unit, ops) {
    for (const op of ops) {
        transformExpressionsInOp(op, reifyIrExpression, VisitorContextFlag.None);
        switch (op.kind) {
            case OpKind.Text:
                OpList.replace(op, text(op.handle.slot, op.initialValue, op.sourceSpan));
                break;
            case OpKind.ElementStart:
                OpList.replace(op, elementStart(op.handle.slot, op.tag, op.attributes, op.localRefs, op.startSourceSpan));
                break;
            case OpKind.Element:
                OpList.replace(op, element(op.handle.slot, op.tag, op.attributes, op.localRefs, op.wholeSourceSpan));
                break;
            case OpKind.ElementEnd:
                OpList.replace(op, elementEnd(op.sourceSpan));
                break;
            case OpKind.ContainerStart:
                OpList.replace(op, elementContainerStart(op.handle.slot, op.attributes, op.localRefs, op.startSourceSpan));
                break;
            case OpKind.Container:
                OpList.replace(op, elementContainer(op.handle.slot, op.attributes, op.localRefs, op.wholeSourceSpan));
                break;
            case OpKind.ContainerEnd:
                OpList.replace(op, elementContainerEnd());
                break;
            case OpKind.I18nStart:
                OpList.replace(op, i18nStart(op.handle.slot, op.messageIndex, op.subTemplateIndex, op.sourceSpan));
                break;
            case OpKind.I18nEnd:
                OpList.replace(op, i18nEnd(op.sourceSpan));
                break;
            case OpKind.I18n:
                OpList.replace(op, i18n(op.handle.slot, op.messageIndex, op.subTemplateIndex, op.sourceSpan));
                break;
            case OpKind.I18nAttributes:
                if (op.i18nAttributesConfig === null) {
                    throw new Error(`AssertionError: i18nAttributesConfig was not set`);
                }
                OpList.replace(op, i18nAttributes(op.handle.slot, op.i18nAttributesConfig));
                break;
            case OpKind.Template:
                if (!(unit instanceof ViewCompilationUnit)) {
                    throw new Error(`AssertionError: must be compiling a component`);
                }
                if (Array.isArray(op.localRefs)) {
                    throw new Error(`AssertionError: local refs array should have been extracted into a constant`);
                }
                const childView = unit.job.views.get(op.xref);
                OpList.replace(op, template(op.handle.slot, variable(childView.fnName), childView.decls, childView.vars, op.tag, op.attributes, op.localRefs, op.startSourceSpan));
                break;
            case OpKind.DisableBindings:
                OpList.replace(op, disableBindings());
                break;
            case OpKind.EnableBindings:
                OpList.replace(op, enableBindings());
                break;
            case OpKind.Pipe:
                OpList.replace(op, pipe(op.handle.slot, op.name));
                break;
            case OpKind.DeclareLet:
                OpList.replace(op, declareLet(op.handle.slot, op.sourceSpan));
                break;
            case OpKind.Listener:
                const listenerFn = reifyListenerHandler(unit, op.handlerFnName, op.handlerOps, op.consumesDollarEvent);
                const eventTargetResolver = op.eventTarget
                    ? GLOBAL_TARGET_RESOLVERS.get(op.eventTarget)
                    : null;
                if (eventTargetResolver === undefined) {
                    throw new Error(`Unexpected global target '${op.eventTarget}' defined for '${op.name}' event. Supported list of global targets: window,document,body.`);
                }
                OpList.replace(op, listener(op.name, listenerFn, eventTargetResolver, op.hostListener && op.isAnimationListener, op.sourceSpan));
                break;
            case OpKind.TwoWayListener:
                OpList.replace(op, twoWayListener(op.name, reifyListenerHandler(unit, op.handlerFnName, op.handlerOps, true), op.sourceSpan));
                break;
            case OpKind.Variable:
                if (op.variable.name === null) {
                    throw new Error(`AssertionError: unnamed variable ${op.xref}`);
                }
                OpList.replace(op, createStatementOp(new DeclareVarStmt(op.variable.name, op.initializer, undefined, exports.StmtModifier.Final)));
                break;
            case OpKind.Namespace:
                switch (op.active) {
                    case Namespace.HTML:
                        OpList.replace(op, namespaceHTML());
                        break;
                    case Namespace.SVG:
                        OpList.replace(op, namespaceSVG());
                        break;
                    case Namespace.Math:
                        OpList.replace(op, namespaceMath());
                        break;
                }
                break;
            case OpKind.Defer:
                const timerScheduling = !!op.loadingMinimumTime || !!op.loadingAfterTime || !!op.placeholderMinimumTime;
                OpList.replace(op, defer(op.handle.slot, op.mainSlot.slot, op.resolverFn, op.loadingSlot?.slot ?? null, op.placeholderSlot?.slot ?? null, op.errorSlot?.slot ?? null, op.loadingConfig, op.placeholderConfig, timerScheduling, op.sourceSpan, op.flags));
                break;
            case OpKind.DeferOn:
                let args = [];
                switch (op.trigger.kind) {
                    case DeferTriggerKind.Never:
                    case DeferTriggerKind.Idle:
                    case DeferTriggerKind.Immediate:
                        break;
                    case DeferTriggerKind.Timer:
                        args = [op.trigger.delay];
                        break;
                    case DeferTriggerKind.Interaction:
                    case DeferTriggerKind.Hover:
                    case DeferTriggerKind.Viewport:
                        // `hydrate` triggers don't support targets.
                        if (op.modifier === "hydrate" /* ir.DeferOpModifierKind.HYDRATE */) {
                            args = [];
                        }
                        else {
                            if (op.trigger.targetSlot?.slot == null || op.trigger.targetSlotViewSteps === null) {
                                throw new Error(`Slot or view steps not set in trigger reification for trigger kind ${op.trigger.kind}`);
                            }
                            args = [op.trigger.targetSlot.slot];
                            if (op.trigger.targetSlotViewSteps !== 0) {
                                args.push(op.trigger.targetSlotViewSteps);
                            }
                        }
                        break;
                    default:
                        throw new Error(`AssertionError: Unsupported reification of defer trigger kind ${op.trigger.kind}`);
                }
                OpList.replace(op, deferOn(op.trigger.kind, args, op.modifier, op.sourceSpan));
                break;
            case OpKind.ProjectionDef:
                OpList.replace(op, projectionDef(op.def));
                break;
            case OpKind.Projection:
                if (op.handle.slot === null) {
                    throw new Error('No slot was assigned for project instruction');
                }
                let fallbackViewFnName = null;
                let fallbackDecls = null;
                let fallbackVars = null;
                if (op.fallbackView !== null) {
                    if (!(unit instanceof ViewCompilationUnit)) {
                        throw new Error(`AssertionError: must be compiling a component`);
                    }
                    const fallbackView = unit.job.views.get(op.fallbackView);
                    if (fallbackView === undefined) {
                        throw new Error('AssertionError: projection had fallback view xref, but fallback view was not found');
                    }
                    if (fallbackView.fnName === null ||
                        fallbackView.decls === null ||
                        fallbackView.vars === null) {
                        throw new Error(`AssertionError: expected projection fallback view to have been named and counted`);
                    }
                    fallbackViewFnName = fallbackView.fnName;
                    fallbackDecls = fallbackView.decls;
                    fallbackVars = fallbackView.vars;
                }
                OpList.replace(op, projection(op.handle.slot, op.projectionSlotIndex, op.attributes, fallbackViewFnName, fallbackDecls, fallbackVars, op.sourceSpan));
                break;
            case OpKind.RepeaterCreate:
                if (op.handle.slot === null) {
                    throw new Error('No slot was assigned for repeater instruction');
                }
                if (!(unit instanceof ViewCompilationUnit)) {
                    throw new Error(`AssertionError: must be compiling a component`);
                }
                const repeaterView = unit.job.views.get(op.xref);
                if (repeaterView.fnName === null) {
                    throw new Error(`AssertionError: expected repeater primary view to have been named`);
                }
                let emptyViewFnName = null;
                let emptyDecls = null;
                let emptyVars = null;
                if (op.emptyView !== null) {
                    const emptyView = unit.job.views.get(op.emptyView);
                    if (emptyView === undefined) {
                        throw new Error('AssertionError: repeater had empty view xref, but empty view was not found');
                    }
                    if (emptyView.fnName === null || emptyView.decls === null || emptyView.vars === null) {
                        throw new Error(`AssertionError: expected repeater empty view to have been named and counted`);
                    }
                    emptyViewFnName = emptyView.fnName;
                    emptyDecls = emptyView.decls;
                    emptyVars = emptyView.vars;
                }
                OpList.replace(op, repeaterCreate(op.handle.slot, repeaterView.fnName, op.decls, op.vars, op.tag, op.attributes, reifyTrackBy(unit, op), op.usesComponentInstance, emptyViewFnName, emptyDecls, emptyVars, op.emptyTag, op.emptyAttributes, op.wholeSourceSpan));
                break;
            case OpKind.SourceLocation:
                const locationsLiteral = literalArr(op.locations.map(({ targetSlot, offset, line, column }) => {
                    if (targetSlot.slot === null) {
                        throw new Error('No slot was assigned for source location');
                    }
                    return literalArr([
                        literal$1(targetSlot.slot),
                        literal$1(offset),
                        literal$1(line),
                        literal$1(column),
                    ]);
                }));
                OpList.replace(op, attachSourceLocation(op.templatePath, locationsLiteral));
                break;
            case OpKind.Statement:
                // Pass statement operations directly through.
                break;
            default:
                throw new Error(`AssertionError: Unsupported reification of create op ${OpKind[op.kind]}`);
        }
    }
}
function reifyUpdateOperations(_unit, ops) {
    for (const op of ops) {
        transformExpressionsInOp(op, reifyIrExpression, VisitorContextFlag.None);
        switch (op.kind) {
            case OpKind.Advance:
                OpList.replace(op, advance(op.delta, op.sourceSpan));
                break;
            case OpKind.Property:
                if (op.expression instanceof Interpolation) {
                    OpList.replace(op, propertyInterpolate(op.name, op.expression.strings, op.expression.expressions, op.sanitizer, op.sourceSpan));
                }
                else {
                    OpList.replace(op, property(op.name, op.expression, op.sanitizer, op.sourceSpan));
                }
                break;
            case OpKind.TwoWayProperty:
                OpList.replace(op, twoWayProperty(op.name, op.expression, op.sanitizer, op.sourceSpan));
                break;
            case OpKind.StyleProp:
                if (op.expression instanceof Interpolation) {
                    OpList.replace(op, stylePropInterpolate(op.name, op.expression.strings, op.expression.expressions, op.unit, op.sourceSpan));
                }
                else {
                    OpList.replace(op, styleProp(op.name, op.expression, op.unit, op.sourceSpan));
                }
                break;
            case OpKind.ClassProp:
                OpList.replace(op, classProp(op.name, op.expression, op.sourceSpan));
                break;
            case OpKind.StyleMap:
                if (op.expression instanceof Interpolation) {
                    OpList.replace(op, styleMapInterpolate(op.expression.strings, op.expression.expressions, op.sourceSpan));
                }
                else {
                    OpList.replace(op, styleMap(op.expression, op.sourceSpan));
                }
                break;
            case OpKind.ClassMap:
                if (op.expression instanceof Interpolation) {
                    OpList.replace(op, classMapInterpolate(op.expression.strings, op.expression.expressions, op.sourceSpan));
                }
                else {
                    OpList.replace(op, classMap(op.expression, op.sourceSpan));
                }
                break;
            case OpKind.I18nExpression:
                OpList.replace(op, i18nExp(op.expression, op.sourceSpan));
                break;
            case OpKind.I18nApply:
                OpList.replace(op, i18nApply(op.handle.slot, op.sourceSpan));
                break;
            case OpKind.InterpolateText:
                OpList.replace(op, textInterpolate(op.interpolation.strings, op.interpolation.expressions, op.sourceSpan));
                break;
            case OpKind.Attribute:
                if (op.expression instanceof Interpolation) {
                    OpList.replace(op, attributeInterpolate(op.name, op.expression.strings, op.expression.expressions, op.sanitizer, op.sourceSpan));
                }
                else {
                    OpList.replace(op, attribute(op.name, op.expression, op.sanitizer, op.namespace));
                }
                break;
            case OpKind.HostProperty:
                if (op.expression instanceof Interpolation) {
                    throw new Error('not yet handled');
                }
                else {
                    if (op.isAnimationTrigger) {
                        OpList.replace(op, syntheticHostProperty(op.name, op.expression, op.sourceSpan));
                    }
                    else {
                        OpList.replace(op, hostProperty(op.name, op.expression, op.sanitizer, op.sourceSpan));
                    }
                }
                break;
            case OpKind.Variable:
                if (op.variable.name === null) {
                    throw new Error(`AssertionError: unnamed variable ${op.xref}`);
                }
                OpList.replace(op, createStatementOp(new DeclareVarStmt(op.variable.name, op.initializer, undefined, exports.StmtModifier.Final)));
                break;
            case OpKind.Conditional:
                if (op.processed === null) {
                    throw new Error(`Conditional test was not set.`);
                }
                OpList.replace(op, conditional(op.processed, op.contextValue, op.sourceSpan));
                break;
            case OpKind.Repeater:
                OpList.replace(op, repeater(op.collection, op.sourceSpan));
                break;
            case OpKind.DeferWhen:
                OpList.replace(op, deferWhen(op.modifier, op.expr, op.sourceSpan));
                break;
            case OpKind.StoreLet:
                throw new Error(`AssertionError: unexpected storeLet ${op.declaredName}`);
            case OpKind.Statement:
                // Pass statement operations directly through.
                break;
            default:
                throw new Error(`AssertionError: Unsupported reification of update op ${OpKind[op.kind]}`);
        }
    }
}
function reifyIrExpression(expr) {
    if (!isIrExpression(expr)) {
        return expr;
    }
    switch (expr.kind) {
        case ExpressionKind.NextContext:
            return nextContext(expr.steps);
        case ExpressionKind.Reference:
            return reference(expr.targetSlot.slot + 1 + expr.offset);
        case ExpressionKind.LexicalRead:
            throw new Error(`AssertionError: unresolved LexicalRead of ${expr.name}`);
        case ExpressionKind.TwoWayBindingSet:
            throw new Error(`AssertionError: unresolved TwoWayBindingSet`);
        case ExpressionKind.RestoreView:
            if (typeof expr.view === 'number') {
                throw new Error(`AssertionError: unresolved RestoreView`);
            }
            return restoreView(expr.view);
        case ExpressionKind.ResetView:
            return resetView(expr.expr);
        case ExpressionKind.GetCurrentView:
            return getCurrentView();
        case ExpressionKind.ReadVariable:
            if (expr.name === null) {
                throw new Error(`Read of unnamed variable ${expr.xref}`);
            }
            return variable(expr.name);
        case ExpressionKind.ReadTemporaryExpr:
            if (expr.name === null) {
                throw new Error(`Read of unnamed temporary ${expr.xref}`);
            }
            return variable(expr.name);
        case ExpressionKind.AssignTemporaryExpr:
            if (expr.name === null) {
                throw new Error(`Assign of unnamed temporary ${expr.xref}`);
            }
            return variable(expr.name).set(expr.expr);
        case ExpressionKind.PureFunctionExpr:
            if (expr.fn === null) {
                throw new Error(`AssertionError: expected PureFunctions to have been extracted`);
            }
            return pureFunction(expr.varOffset, expr.fn, expr.args);
        case ExpressionKind.PureFunctionParameterExpr:
            throw new Error(`AssertionError: expected PureFunctionParameterExpr to have been extracted`);
        case ExpressionKind.PipeBinding:
            return pipeBind(expr.targetSlot.slot, expr.varOffset, expr.args);
        case ExpressionKind.PipeBindingVariadic:
            return pipeBindV(expr.targetSlot.slot, expr.varOffset, expr.args);
        case ExpressionKind.SlotLiteralExpr:
            return literal$1(expr.slot.slot);
        case ExpressionKind.ContextLetReference:
            return readContextLet(expr.targetSlot.slot);
        case ExpressionKind.StoreLet:
            return storeLet(expr.value, expr.sourceSpan);
        case ExpressionKind.TrackContext:
            return variable('this');
        default:
            throw new Error(`AssertionError: Unsupported reification of ir.Expression kind: ${ExpressionKind[expr.kind]}`);
    }
}
/**
 * Listeners get turned into a function expression, which may or may not have the `$event`
 * parameter defined.
 */
function reifyListenerHandler(unit, name, handlerOps, consumesDollarEvent) {
    // First, reify all instruction calls within `handlerOps`.
    reifyUpdateOperations(unit, handlerOps);
    // Next, extract all the `o.Statement`s from the reified operations. We can expect that at this
    // point, all operations have been converted to statements.
    const handlerStmts = [];
    for (const op of handlerOps) {
        if (op.kind !== OpKind.Statement) {
            throw new Error(`AssertionError: expected reified statements, but found op ${OpKind[op.kind]}`);
        }
        handlerStmts.push(op.statement);
    }
    // If `$event` is referenced, we need to generate it as a parameter.
    const params = [];
    if (consumesDollarEvent) {
        // We need the `$event` parameter.
        params.push(new FnParam('$event'));
    }
    return fn(params, handlerStmts, undefined, undefined, name);
}
/** Reifies the tracking expression of a `RepeaterCreateOp`. */
function reifyTrackBy(unit, op) {
    // If the tracking function was created already, there's nothing left to do.
    if (op.trackByFn !== null) {
        return op.trackByFn;
    }
    const params = [new FnParam('$index'), new FnParam('$item')];
    let fn$1;
    if (op.trackByOps === null) {
        // If there are no additional ops related to the tracking function, we just need
        // to turn it into a function that returns the result of the expression.
        fn$1 = op.usesComponentInstance
            ? fn(params, [new ReturnStatement(op.track)])
            : arrowFn(params, op.track);
    }
    else {
        // Otherwise first we need to reify the track-related ops.
        reifyUpdateOperations(unit, op.trackByOps);
        const statements = [];
        for (const trackOp of op.trackByOps) {
            if (trackOp.kind !== OpKind.Statement) {
                throw new Error(`AssertionError: expected reified statements, but found op ${OpKind[trackOp.kind]}`);
            }
            statements.push(trackOp.statement);
        }
        // Afterwards we can create the function from those ops.
        fn$1 =
            op.usesComponentInstance ||
                statements.length !== 1 ||
                !(statements[0] instanceof ReturnStatement)
                ? fn(params, statements)
                : arrowFn(params, statements[0].value);
    }
    op.trackByFn = unit.job.pool.getSharedFunctionReference(fn$1, '_forTrack');
    return op.trackByFn;
}

/**
 * Binding with no content can be safely deleted.
 */
function removeEmptyBindings(job) {
    for (const unit of job.units) {
        for (const op of unit.update) {
            switch (op.kind) {
                case OpKind.Attribute:
                case OpKind.Binding:
                case OpKind.ClassProp:
                case OpKind.ClassMap:
                case OpKind.Property:
                case OpKind.StyleProp:
                case OpKind.StyleMap:
                    if (op.expression instanceof EmptyExpr) {
                        OpList.remove(op);
                    }
                    break;
            }
        }
    }
}

/**
 * Remove the i18n context ops after they are no longer needed, and null out references to them to
 * be safe.
 */
function removeI18nContexts(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nContext:
                    OpList.remove(op);
                    break;
                case OpKind.I18nStart:
                    op.context = null;
                    break;
            }
        }
    }
}

/**
 * i18nAttributes ops will be generated for each i18n attribute. However, not all i18n attribues
 * will contain dynamic content, and so some of these i18nAttributes ops may be unnecessary.
 */
function removeUnusedI18nAttributesOps(job) {
    for (const unit of job.units) {
        const ownersWithI18nExpressions = new Set();
        for (const op of unit.update) {
            switch (op.kind) {
                case OpKind.I18nExpression:
                    ownersWithI18nExpressions.add(op.i18nOwner);
            }
        }
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nAttributes:
                    if (ownersWithI18nExpressions.has(op.xref)) {
                        continue;
                    }
                    OpList.remove(op);
            }
        }
    }
}

/**
 * Resolves `ir.ContextExpr` expressions (which represent embedded view or component contexts) to
 * either the `ctx` parameter to component functions (for the current view context) or to variables
 * that store those contexts (for contexts accessed via the `nextContext()` instruction).
 */
function resolveContexts(job) {
    for (const unit of job.units) {
        processLexicalScope$1(unit, unit.create);
        processLexicalScope$1(unit, unit.update);
    }
}
function processLexicalScope$1(view, ops) {
    // Track the expressions used to access all available contexts within the current view, by the
    // view `ir.XrefId`.
    const scope = new Map();
    // The current view's context is accessible via the `ctx` parameter.
    scope.set(view.xref, variable('ctx'));
    for (const op of ops) {
        switch (op.kind) {
            case OpKind.Variable:
                switch (op.variable.kind) {
                    case SemanticVariableKind.Context:
                        scope.set(op.variable.view, new ReadVariableExpr(op.xref));
                        break;
                }
                break;
            case OpKind.Listener:
            case OpKind.TwoWayListener:
                processLexicalScope$1(view, op.handlerOps);
                break;
            case OpKind.RepeaterCreate:
                if (op.trackByOps !== null) {
                    processLexicalScope$1(view, op.trackByOps);
                }
                break;
        }
    }
    if (view === view.job.root) {
        // Prefer `ctx` of the root view to any variables which happen to contain the root context.
        scope.set(view.xref, variable('ctx'));
    }
    for (const op of ops) {
        transformExpressionsInOp(op, (expr) => {
            if (expr instanceof ContextExpr) {
                if (!scope.has(expr.view)) {
                    throw new Error(`No context found for reference to view ${expr.view} from view ${view.xref}`);
                }
                return scope.get(expr.view);
            }
            else {
                return expr;
            }
        }, VisitorContextFlag.None);
    }
}

/**
 * Any variable inside a listener with the name `$event` will be transformed into a output lexical
 * read immediately, and does not participate in any of the normal logic for handling variables.
 */
function resolveDollarEvent(job) {
    for (const unit of job.units) {
        transformDollarEvent(unit.create);
        transformDollarEvent(unit.update);
    }
}
function transformDollarEvent(ops) {
    for (const op of ops) {
        if (op.kind === OpKind.Listener || op.kind === OpKind.TwoWayListener) {
            transformExpressionsInOp(op, (expr) => {
                if (expr instanceof LexicalReadExpr && expr.name === '$event') {
                    // Two-way listeners always consume `$event` so they omit this field.
                    if (op.kind === OpKind.Listener) {
                        op.consumesDollarEvent = true;
                    }
                    return new ReadVarExpr(expr.name);
                }
                return expr;
            }, VisitorContextFlag.InChildOperation);
        }
    }
}

/**
 * Resolve the element placeholders in i18n messages.
 */
function resolveI18nElementPlaceholders(job) {
    // Record all of the element and i18n context ops for use later.
    const i18nContexts = new Map();
    const elements = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nContext:
                    i18nContexts.set(op.xref, op);
                    break;
                case OpKind.ElementStart:
                    elements.set(op.xref, op);
                    break;
            }
        }
    }
    resolvePlaceholdersForView(job, job.root, i18nContexts, elements);
}
/**
 * Recursively resolves element and template tag placeholders in the given view.
 */
function resolvePlaceholdersForView(job, unit, i18nContexts, elements, pendingStructuralDirective) {
    // Track the current i18n op and corresponding i18n context op as we step through the creation
    // IR.
    let currentOps = null;
    let pendingStructuralDirectiveCloses = new Map();
    for (const op of unit.create) {
        switch (op.kind) {
            case OpKind.I18nStart:
                if (!op.context) {
                    throw Error('Could not find i18n context for i18n op');
                }
                currentOps = { i18nBlock: op, i18nContext: i18nContexts.get(op.context) };
                break;
            case OpKind.I18nEnd:
                currentOps = null;
                break;
            case OpKind.ElementStart:
                // For elements with i18n placeholders, record its slot value in the params map under the
                // corresponding tag start placeholder.
                if (op.i18nPlaceholder !== undefined) {
                    if (currentOps === null) {
                        throw Error('i18n tag placeholder should only occur inside an i18n block');
                    }
                    recordElementStart(op, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                    // If there is a separate close tag placeholder for this element, save the pending
                    // structural directive so we can pass it to the closing tag as well.
                    if (pendingStructuralDirective && op.i18nPlaceholder.closeName) {
                        pendingStructuralDirectiveCloses.set(op.xref, pendingStructuralDirective);
                    }
                    // Clear out the pending structural directive now that its been accounted for.
                    pendingStructuralDirective = undefined;
                }
                break;
            case OpKind.ElementEnd:
                // For elements with i18n placeholders, record its slot value in the params map under the
                // corresponding tag close placeholder.
                const startOp = elements.get(op.xref);
                if (startOp && startOp.i18nPlaceholder !== undefined) {
                    if (currentOps === null) {
                        throw Error('AssertionError: i18n tag placeholder should only occur inside an i18n block');
                    }
                    recordElementClose(startOp, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirectiveCloses.get(op.xref));
                    // Clear out the pending structural directive close that was accounted for.
                    pendingStructuralDirectiveCloses.delete(op.xref);
                }
                break;
            case OpKind.Projection:
                // For content projections with i18n placeholders, record its slot value in the params map
                // under the corresponding tag start and close placeholders.
                if (op.i18nPlaceholder !== undefined) {
                    if (currentOps === null) {
                        throw Error('i18n tag placeholder should only occur inside an i18n block');
                    }
                    recordElementStart(op, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                    recordElementClose(op, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                    // Clear out the pending structural directive now that its been accounted for.
                    pendingStructuralDirective = undefined;
                }
                break;
            case OpKind.Template:
                const view = job.views.get(op.xref);
                if (op.i18nPlaceholder === undefined) {
                    // If there is no i18n placeholder, just recurse into the view in case it contains i18n
                    // blocks.
                    resolvePlaceholdersForView(job, view, i18nContexts, elements);
                }
                else {
                    if (currentOps === null) {
                        throw Error('i18n tag placeholder should only occur inside an i18n block');
                    }
                    if (op.templateKind === TemplateKind.Structural) {
                        // If this is a structural directive template, don't record anything yet. Instead pass
                        // the current template as a pending structural directive to be recorded when we find
                        // the element, content, or template it belongs to. This allows us to create combined
                        // values that represent, e.g. the start of a template and element at the same time.
                        resolvePlaceholdersForView(job, view, i18nContexts, elements, op);
                    }
                    else {
                        // If this is some other kind of template, we can record its start, recurse into its
                        // view, and then record its end.
                        recordTemplateStart(job, view, op.handle.slot, op.i18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                        resolvePlaceholdersForView(job, view, i18nContexts, elements);
                        recordTemplateClose(job, view, op.handle.slot, op.i18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                        pendingStructuralDirective = undefined;
                    }
                }
                break;
            case OpKind.RepeaterCreate:
                if (pendingStructuralDirective !== undefined) {
                    throw Error('AssertionError: Unexpected structural directive associated with @for block');
                }
                // RepeaterCreate has 3 slots: the first is for the op itself, the second is for the @for
                // template and the (optional) third is for the @empty template.
                const forSlot = op.handle.slot + 1;
                const forView = job.views.get(op.xref);
                // First record all of the placeholders for the @for template.
                if (op.i18nPlaceholder === undefined) {
                    // If there is no i18n placeholder, just recurse into the view in case it contains i18n
                    // blocks.
                    resolvePlaceholdersForView(job, forView, i18nContexts, elements);
                }
                else {
                    if (currentOps === null) {
                        throw Error('i18n tag placeholder should only occur inside an i18n block');
                    }
                    recordTemplateStart(job, forView, forSlot, op.i18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                    resolvePlaceholdersForView(job, forView, i18nContexts, elements);
                    recordTemplateClose(job, forView, forSlot, op.i18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                    pendingStructuralDirective = undefined;
                }
                // Then if there's an @empty template, add its placeholders as well.
                if (op.emptyView !== null) {
                    // RepeaterCreate has 3 slots: the first is for the op itself, the second is for the @for
                    // template and the (optional) third is for the @empty template.
                    const emptySlot = op.handle.slot + 2;
                    const emptyView = job.views.get(op.emptyView);
                    if (op.emptyI18nPlaceholder === undefined) {
                        // If there is no i18n placeholder, just recurse into the view in case it contains i18n
                        // blocks.
                        resolvePlaceholdersForView(job, emptyView, i18nContexts, elements);
                    }
                    else {
                        if (currentOps === null) {
                            throw Error('i18n tag placeholder should only occur inside an i18n block');
                        }
                        recordTemplateStart(job, emptyView, emptySlot, op.emptyI18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                        resolvePlaceholdersForView(job, emptyView, i18nContexts, elements);
                        recordTemplateClose(job, emptyView, emptySlot, op.emptyI18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
                        pendingStructuralDirective = undefined;
                    }
                }
                break;
        }
    }
}
/**
 * Records an i18n param value for the start of an element.
 */
function recordElementStart(op, i18nContext, i18nBlock, structuralDirective) {
    const { startName, closeName } = op.i18nPlaceholder;
    let flags = I18nParamValueFlags.ElementTag | I18nParamValueFlags.OpenTag;
    let value = op.handle.slot;
    // If the element is associated with a structural directive, start it as well.
    if (structuralDirective !== undefined) {
        flags |= I18nParamValueFlags.TemplateTag;
        value = { element: value, template: structuralDirective.handle.slot };
    }
    // For self-closing tags, there is no close tag placeholder. Instead, the start tag
    // placeholder accounts for the start and close of the element.
    if (!closeName) {
        flags |= I18nParamValueFlags.CloseTag;
    }
    addParam(i18nContext.params, startName, value, i18nBlock.subTemplateIndex, flags);
}
/**
 * Records an i18n param value for the closing of an element.
 */
function recordElementClose(op, i18nContext, i18nBlock, structuralDirective) {
    const { closeName } = op.i18nPlaceholder;
    // Self-closing tags don't have a closing tag placeholder, instead the element closing is
    // recorded via an additional flag on the element start value.
    if (closeName) {
        let flags = I18nParamValueFlags.ElementTag | I18nParamValueFlags.CloseTag;
        let value = op.handle.slot;
        // If the element is associated with a structural directive, close it as well.
        if (structuralDirective !== undefined) {
            flags |= I18nParamValueFlags.TemplateTag;
            value = { element: value, template: structuralDirective.handle.slot };
        }
        addParam(i18nContext.params, closeName, value, i18nBlock.subTemplateIndex, flags);
    }
}
/**
 * Records an i18n param value for the start of a template.
 */
function recordTemplateStart(job, view, slot, i18nPlaceholder, i18nContext, i18nBlock, structuralDirective) {
    let { startName, closeName } = i18nPlaceholder;
    let flags = I18nParamValueFlags.TemplateTag | I18nParamValueFlags.OpenTag;
    // For self-closing tags, there is no close tag placeholder. Instead, the start tag
    // placeholder accounts for the start and close of the element.
    if (!closeName) {
        flags |= I18nParamValueFlags.CloseTag;
    }
    // If the template is associated with a structural directive, record the structural directive's
    // start first. Since this template must be in the structural directive's view, we can just
    // directly use the current i18n block's sub-template index.
    if (structuralDirective !== undefined) {
        addParam(i18nContext.params, startName, structuralDirective.handle.slot, i18nBlock.subTemplateIndex, flags);
    }
    // Record the start of the template. For the sub-template index, pass the index for the template's
    // view, rather than the current i18n block's index.
    addParam(i18nContext.params, startName, slot, getSubTemplateIndexForTemplateTag(job, i18nBlock, view), flags);
}
/**
 * Records an i18n param value for the closing of a template.
 */
function recordTemplateClose(job, view, slot, i18nPlaceholder, i18nContext, i18nBlock, structuralDirective) {
    const { closeName } = i18nPlaceholder;
    const flags = I18nParamValueFlags.TemplateTag | I18nParamValueFlags.CloseTag;
    // Self-closing tags don't have a closing tag placeholder, instead the template's closing is
    // recorded via an additional flag on the template start value.
    if (closeName) {
        // Record the closing of the template. For the sub-template index, pass the index for the
        // template's view, rather than the current i18n block's index.
        addParam(i18nContext.params, closeName, slot, getSubTemplateIndexForTemplateTag(job, i18nBlock, view), flags);
        // If the template is associated with a structural directive, record the structural directive's
        // closing after. Since this template must be in the structural directive's view, we can just
        // directly use the current i18n block's sub-template index.
        if (structuralDirective !== undefined) {
            addParam(i18nContext.params, closeName, structuralDirective.handle.slot, i18nBlock.subTemplateIndex, flags);
        }
    }
}
/**
 * Get the subTemplateIndex for the given template op. For template ops, use the subTemplateIndex of
 * the child i18n block inside the template.
 */
function getSubTemplateIndexForTemplateTag(job, i18nOp, view) {
    for (const childOp of view.create) {
        if (childOp.kind === OpKind.I18nStart) {
            return childOp.subTemplateIndex;
        }
    }
    return i18nOp.subTemplateIndex;
}
/**
 * Add a param value to the given params map.
 */
function addParam(params, placeholder, value, subTemplateIndex, flags) {
    const values = params.get(placeholder) ?? [];
    values.push({ value, subTemplateIndex, flags });
    params.set(placeholder, values);
}

/**
 * Resolve the i18n expression placeholders in i18n messages.
 */
function resolveI18nExpressionPlaceholders(job) {
    // Record all of the i18n context ops, and the sub-template index for each i18n op.
    const subTemplateIndices = new Map();
    const i18nContexts = new Map();
    const icuPlaceholders = new Map();
    for (const unit of job.units) {
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nStart:
                    subTemplateIndices.set(op.xref, op.subTemplateIndex);
                    break;
                case OpKind.I18nContext:
                    i18nContexts.set(op.xref, op);
                    break;
                case OpKind.IcuPlaceholder:
                    icuPlaceholders.set(op.xref, op);
                    break;
            }
        }
    }
    // Keep track of the next available expression index for each i18n message.
    const expressionIndices = new Map();
    // Keep track of a reference index for each expression.
    // We use different references for normal i18n expressio and attribute i18n expressions. This is
    // because child i18n blocks in templates don't get their own context, since they're rolled into
    // the translated message of the parent, but they may target a different slot.
    const referenceIndex = (op) => op.usage === I18nExpressionFor.I18nText ? op.i18nOwner : op.context;
    for (const unit of job.units) {
        for (const op of unit.update) {
            if (op.kind === OpKind.I18nExpression) {
                const index = expressionIndices.get(referenceIndex(op)) || 0;
                const subTemplateIndex = subTemplateIndices.get(op.i18nOwner) ?? null;
                const value = {
                    value: index,
                    subTemplateIndex: subTemplateIndex,
                    flags: I18nParamValueFlags.ExpressionIndex,
                };
                updatePlaceholder(op, value, i18nContexts, icuPlaceholders);
                expressionIndices.set(referenceIndex(op), index + 1);
            }
        }
    }
}
function updatePlaceholder(op, value, i18nContexts, icuPlaceholders) {
    if (op.i18nPlaceholder !== null) {
        const i18nContext = i18nContexts.get(op.context);
        const params = op.resolutionTime === I18nParamResolutionTime.Creation
            ? i18nContext.params
            : i18nContext.postprocessingParams;
        const values = params.get(op.i18nPlaceholder) || [];
        values.push(value);
        params.set(op.i18nPlaceholder, values);
    }
    if (op.icuPlaceholder !== null) {
        const icuPlaceholderOp = icuPlaceholders.get(op.icuPlaceholder);
        icuPlaceholderOp?.expressionPlaceholders.push(value);
    }
}

/**
 * Resolves lexical references in views (`ir.LexicalReadExpr`) to either a target variable or to
 * property reads on the top-level component context.
 *
 * Also matches `ir.RestoreViewExpr` expressions with the variables of their corresponding saved
 * views.
 */
function resolveNames(job) {
    for (const unit of job.units) {
        processLexicalScope(unit, unit.create, null);
        processLexicalScope(unit, unit.update, null);
    }
}
function processLexicalScope(unit, ops, savedView) {
    // Maps names defined in the lexical scope of this template to the `ir.XrefId`s of the variable
    // declarations which represent those values.
    //
    // Since variables are generated in each view for the entire lexical scope (including any
    // identifiers from parent templates) only local variables need be considered here.
    const scope = new Map();
    // Symbols defined within the current scope. They take precedence over ones defined outside.
    const localDefinitions = new Map();
    // First, step through the operations list and:
    // 1) build up the `scope` mapping
    // 2) recurse into any listener functions
    for (const op of ops) {
        switch (op.kind) {
            case OpKind.Variable:
                switch (op.variable.kind) {
                    case SemanticVariableKind.Identifier:
                        if (op.variable.local) {
                            if (localDefinitions.has(op.variable.identifier)) {
                                continue;
                            }
                            localDefinitions.set(op.variable.identifier, op.xref);
                        }
                        else if (scope.has(op.variable.identifier)) {
                            continue;
                        }
                        scope.set(op.variable.identifier, op.xref);
                        break;
                    case SemanticVariableKind.Alias:
                        // This variable represents some kind of identifier which can be used in the template.
                        if (scope.has(op.variable.identifier)) {
                            continue;
                        }
                        scope.set(op.variable.identifier, op.xref);
                        break;
                    case SemanticVariableKind.SavedView:
                        // This variable represents a snapshot of the current view context, and can be used to
                        // restore that context within listener functions.
                        savedView = {
                            view: op.variable.view,
                            variable: op.xref,
                        };
                        break;
                }
                break;
            case OpKind.Listener:
            case OpKind.TwoWayListener:
                // Listener functions have separate variable declarations, so process them as a separate
                // lexical scope.
                processLexicalScope(unit, op.handlerOps, savedView);
                break;
            case OpKind.RepeaterCreate:
                if (op.trackByOps !== null) {
                    processLexicalScope(unit, op.trackByOps, savedView);
                }
                break;
        }
    }
    // Next, use the `scope` mapping to match `ir.LexicalReadExpr` with defined names in the lexical
    // scope. Also, look for `ir.RestoreViewExpr`s and match them with the snapshotted view context
    // variable.
    for (const op of ops) {
        if (op.kind == OpKind.Listener || op.kind === OpKind.TwoWayListener) {
            // Listeners were already processed above with their own scopes.
            continue;
        }
        transformExpressionsInOp(op, (expr) => {
            if (expr instanceof LexicalReadExpr) {
                // `expr` is a read of a name within the lexical scope of this view.
                // Either that name is defined within the current view, or it represents a property from the
                // main component context.
                if (localDefinitions.has(expr.name)) {
                    return new ReadVariableExpr(localDefinitions.get(expr.name));
                }
                else if (scope.has(expr.name)) {
                    // This was a defined variable in the current scope.
                    return new ReadVariableExpr(scope.get(expr.name));
                }
                else {
                    // Reading from the component context.
                    return new ReadPropExpr(new ContextExpr(unit.job.root.xref), expr.name);
                }
            }
            else if (expr instanceof RestoreViewExpr && typeof expr.view === 'number') {
                // `ir.RestoreViewExpr` happens in listener functions and restores a saved view from the
                // parent creation list. We expect to find that we captured the `savedView` previously, and
                // that it matches the expected view to be restored.
                if (savedView === null || savedView.view !== expr.view) {
                    throw new Error(`AssertionError: no saved view ${expr.view} from view ${unit.xref}`);
                }
                expr.view = new ReadVariableExpr(savedView.variable);
                return expr;
            }
            else {
                return expr;
            }
        }, VisitorContextFlag.None);
    }
    for (const op of ops) {
        visitExpressionsInOp(op, (expr) => {
            if (expr instanceof LexicalReadExpr) {
                throw new Error(`AssertionError: no lexical reads should remain, but found read of ${expr.name}`);
            }
        });
    }
}

/**
 * Map of security contexts to their sanitizer function.
 */
const sanitizerFns = new Map([
    [SecurityContext.HTML, Identifiers.sanitizeHtml],
    [SecurityContext.RESOURCE_URL, Identifiers.sanitizeResourceUrl],
    [SecurityContext.SCRIPT, Identifiers.sanitizeScript],
    [SecurityContext.STYLE, Identifiers.sanitizeStyle],
    [SecurityContext.URL, Identifiers.sanitizeUrl],
]);
/**
 * Map of security contexts to their trusted value function.
 */
const trustedValueFns = new Map([
    [SecurityContext.HTML, Identifiers.trustConstantHtml],
    [SecurityContext.RESOURCE_URL, Identifiers.trustConstantResourceUrl],
]);
/**
 * Resolves sanitization functions for ops that need them.
 */
function resolveSanitizers(job) {
    for (const unit of job.units) {
        const elements = createOpXrefMap(unit);
        // For normal element bindings we create trusted values for security sensitive constant
        // attributes. However, for host bindings we skip this step (this matches what
        // TemplateDefinitionBuilder does).
        // TODO: Is the TDB behavior correct here?
        if (job.kind !== CompilationJobKind.Host) {
            for (const op of unit.create) {
                if (op.kind === OpKind.ExtractedAttribute) {
                    const trustedValueFn = trustedValueFns.get(getOnlySecurityContext(op.securityContext)) ?? null;
                    op.trustedValueFn = trustedValueFn !== null ? importExpr(trustedValueFn) : null;
                }
            }
        }
        for (const op of unit.update) {
            switch (op.kind) {
                case OpKind.Property:
                case OpKind.Attribute:
                case OpKind.HostProperty:
                    let sanitizerFn = null;
                    if (Array.isArray(op.securityContext) &&
                        op.securityContext.length === 2 &&
                        op.securityContext.indexOf(SecurityContext.URL) > -1 &&
                        op.securityContext.indexOf(SecurityContext.RESOURCE_URL) > -1) {
                        // When the host element isn't known, some URL attributes (such as "src" and "href") may
                        // be part of multiple different security contexts. In this case we use special
                        // sanitization function and select the actual sanitizer at runtime based on a tag name
                        // that is provided while invoking sanitization function.
                        sanitizerFn = Identifiers.sanitizeUrlOrResourceUrl;
                    }
                    else {
                        sanitizerFn = sanitizerFns.get(getOnlySecurityContext(op.securityContext)) ?? null;
                    }
                    op.sanitizer = sanitizerFn !== null ? importExpr(sanitizerFn) : null;
                    // If there was no sanitization function found based on the security context of an
                    // attribute/property, check whether this attribute/property is one of the
                    // security-sensitive <iframe> attributes (and that the current element is actually an
                    // <iframe>).
                    if (op.sanitizer === null) {
                        let isIframe = false;
                        if (job.kind === CompilationJobKind.Host || op.kind === OpKind.HostProperty) {
                            // Note: for host bindings defined on a directive, we do not try to find all
                            // possible places where it can be matched, so we can not determine whether
                            // the host element is an <iframe>. In this case, we just assume it is and append a
                            // validation function, which is invoked at runtime and would have access to the
                            // underlying DOM element to check if it's an <iframe> and if so - run extra checks.
                            isIframe = true;
                        }
                        else {
                            // For a normal binding we can just check if the element its on is an iframe.
                            const ownerOp = elements.get(op.target);
                            if (ownerOp === undefined || !isElementOrContainerOp(ownerOp)) {
                                throw Error('Property should have an element-like owner');
                            }
                            isIframe = isIframeElement(ownerOp);
                        }
                        if (isIframe && isIframeSecuritySensitiveAttr(op.name)) {
                            op.sanitizer = importExpr(Identifiers.validateIframeAttribute);
                        }
                    }
                    break;
            }
        }
    }
}
/**
 * Checks whether the given op represents an iframe element.
 */
function isIframeElement(op) {
    return op.kind === OpKind.ElementStart && op.tag?.toLowerCase() === 'iframe';
}
/**
 * Asserts that there is only a single security context and returns it.
 */
function getOnlySecurityContext(securityContext) {
    if (Array.isArray(securityContext)) {
        if (securityContext.length > 1) {
            // TODO: What should we do here? TDB just took the first one, but this feels like something we
            // would want to know about and create a special case for like we did for Url/ResourceUrl. My
            // guess is that, outside of the Url/ResourceUrl case, this never actually happens. If there
            // do turn out to be other cases, throwing an error until we can address it feels safer.
            throw Error(`AssertionError: Ambiguous security context`);
        }
        return securityContext[0] || SecurityContext.NONE;
    }
    return securityContext;
}

/**
 * Transforms a `TwoWayBindingSet` expression into an expression that either
 * sets a value through the `twoWayBindingSet` instruction or falls back to setting
 * the value directly. E.g. the expression `TwoWayBindingSet(target, value)` becomes:
 * `ng.twoWayBindingSet(target, value) || (target = value)`.
 */
function transformTwoWayBindingSet(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind === OpKind.TwoWayListener) {
                transformExpressionsInOp(op, (expr) => {
                    if (!(expr instanceof TwoWayBindingSetExpr)) {
                        return expr;
                    }
                    const { target, value } = expr;
                    if (target instanceof ReadPropExpr || target instanceof ReadKeyExpr) {
                        return twoWayBindingSet(target, value).or(target.set(value));
                    }
                    // ASSUMPTION: here we're assuming that `ReadVariableExpr` will be a reference
                    // to a local template variable. This appears to be the case at the time of writing.
                    // If the expression is targeting a variable read, we only emit the `twoWayBindingSet`
                    // since the fallback would be attempting to write into a constant. Invalid usages will be
                    // flagged during template type checking.
                    if (target instanceof ReadVariableExpr) {
                        return twoWayBindingSet(target, value);
                    }
                    throw new Error(`Unsupported expression in two-way action binding.`);
                }, VisitorContextFlag.InChildOperation);
            }
        }
    }
}

/**
 * When inside of a listener, we may need access to one or more enclosing views. Therefore, each
 * view should save the current view, and each listener must have the ability to restore the
 * appropriate view. We eagerly generate all save view variables; they will be optimized away later.
 */
function saveAndRestoreView(job) {
    for (const unit of job.units) {
        unit.create.prepend([
            createVariableOp(unit.job.allocateXrefId(), {
                kind: SemanticVariableKind.SavedView,
                name: null,
                view: unit.xref,
            }, new GetCurrentViewExpr(), VariableFlags.None),
        ]);
        for (const op of unit.create) {
            if (op.kind !== OpKind.Listener && op.kind !== OpKind.TwoWayListener) {
                continue;
            }
            // Embedded views always need the save/restore view operation.
            let needsRestoreView = unit !== job.root;
            if (!needsRestoreView) {
                for (const handlerOp of op.handlerOps) {
                    visitExpressionsInOp(handlerOp, (expr) => {
                        if (expr instanceof ReferenceExpr || expr instanceof ContextLetReferenceExpr) {
                            // Listeners that reference() a local ref need the save/restore view operation.
                            needsRestoreView = true;
                        }
                    });
                }
            }
            if (needsRestoreView) {
                addSaveRestoreViewOperationToListener(unit, op);
               }
        }
    }
}
function addSaveRestoreViewOperationToListener(unit, op) {
    op.handlerOps.prepend([
        createVariableOp(unit.job.allocateXrefId(), {
            kind: SemanticVariableKind.Context,
            name: null,
            view: unit.xref,
        }, new RestoreViewExpr(unit.xref), VariableFlags.None),
    ]);
    // The "restore view" operation in listeners requires a call to `resetView` to reset the
    // context prior to returning from the listener operation. Find any `return` statements in
    // the listener body and wrap them in a call to reset the view.
    for (const handlerOp of op.handlerOps) {
        if (handlerOp.kind === OpKind.Statement &&
            handlerOp.statement instanceof ReturnStatement) {
            handlerOp.statement.value = new ResetViewExpr(handlerOp.statement.value);
        }
    }
}

/**
 * Assign data slots for all operations which implement `ConsumesSlotOpTrait`, and propagate the
 * assigned data slots of those operations to any expressions which reference them via
 * `UsesSlotIndexTrait`.
 *
 * This phase is also responsible for counting the number of slots used for each view (its `decls`)
 * and propagating that number into the `Template` operations which declare embedded views.
 */
function allocateSlots(job) {
    // Map of all declarations in all views within the component which require an assigned slot index.
    // This map needs to be global (across all views within the component) since it's possible to
    // reference a slot from one view from an expression within another (e.g. local references work
    // this way).
    const slotMap = new Map();
    // Process all views in the component and assign slot indexes.
    for (const unit of job.units) {
        // Slot indices start at 0 for each view (and are not unique between views).
        let slotCount = 0;
        for (const op of unit.create) {
            // Only consider declarations which consume data slots.
            if (!hasConsumesSlotTrait(op)) {
                continue;
            }
            // Assign slots to this declaration starting at the current `slotCount`.
            op.handle.slot = slotCount;
            // And track its assigned slot in the `slotMap`.
            slotMap.set(op.xref, op.handle.slot);
            // Each declaration may use more than 1 slot, so increment `slotCount` to reserve the number
            // of slots required.
            slotCount += op.numSlotsUsed;
        }
        // Record the total number of slots used on the view itself. This will later be propagated into
        // `ir.TemplateOp`s which declare those views (except for the root view).
        unit.decls = slotCount;
    }
    // After slot assignment, `slotMap` now contains slot assignments for every declaration in the
    // whole template, across all views. Next, look for expressions which implement
    // `UsesSlotIndexExprTrait` and propagate the assigned slot indexes into them.
    // Additionally, this second scan allows us to find `ir.TemplateOp`s which declare views and
    // propagate the number of slots used for each view into the operation which declares it.
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            if (op.kind === OpKind.Template || op.kind === OpKind.RepeaterCreate) {
                // Record the number of slots used by the view this `ir.TemplateOp` declares in the
                // operation itself, so it can be emitted later.
                const childView = job.views.get(op.xref);
                op.decls = childView.decls;
                // TODO: currently we handle the decls for the RepeaterCreate empty template in the reify
                // phase. We should handle that here instead.
            }
        }
    }
}

/**
 * Transforms special-case bindings with 'style' or 'class' in their names. Must run before the
 * main binding specialization pass.
 */
function specializeStyleBindings(job) {
    for (const unit of job.units) {
        for (const op of unit.update) {
            if (op.kind !== OpKind.Binding) {
                continue;
            }
            switch (op.bindingKind) {
                case BindingKind.ClassName:
                    if (op.expression instanceof Interpolation) {
                        throw new Error(`Unexpected interpolation in ClassName binding`);
                    }
                    OpList.replace(op, createClassPropOp(op.target, op.name, op.expression, op.sourceSpan));
                    break;
                case BindingKind.StyleProperty:
                    OpList.replace(op, createStylePropOp(op.target, op.name, op.expression, op.unit, op.sourceSpan));
                    break;
                case BindingKind.Property:
                case BindingKind.Template:
                    if (op.name === 'style') {
                        OpList.replace(op, createStyleMapOp(op.target, op.expression, op.sourceSpan));
                    }
                    else if (op.name === 'class') {
                        OpList.replace(op, createClassMapOp(op.target, op.expression, op.sourceSpan));
                    }
                    break;
            }
        }
    }
}

/**
 * Find all assignments and usages of temporary variables, which are linked to each other with cross
 * references. Generate names for each cross-reference, and add a `DeclareVarStmt` to initialize
 * them at the beginning of the update block.
 *
 * TODO: Sometimes, it will be possible to reuse names across different subexpressions. For example,
 * in the double keyed read `a?.[f()]?.[f()]`, the two function calls have non-overlapping scopes.
 * Implement an algorithm for reuse.
 */
function generateTemporaryVariables(job) {
    for (const unit of job.units) {
        unit.create.prepend(generateTemporaries(unit.create));
        unit.update.prepend(generateTemporaries(unit.update));
    }
}
function generateTemporaries(ops) {
    let opCount = 0;
    let generatedStatements = [];
    // For each op, search for any variables that are assigned or read. For each variable, generate a
    // name and produce a `DeclareVarStmt` to the beginning of the block.
    for (const op of ops) {
        // Identify the final time each temp var is read.
        const finalReads = new Map();
        visitExpressionsInOp(op, (expr, flag) => {
            if (flag & VisitorContextFlag.InChildOperation) {
                return;
            }
            if (expr instanceof ReadTemporaryExpr) {
                finalReads.set(expr.xref, expr);
            }
        });
        // Name the temp vars, accounting for the fact that a name can be reused after it has been
        // read for the final time.
        let count = 0;
        const assigned = new Set();
        const released = new Set();
        const defs = new Map();
        visitExpressionsInOp(op, (expr, flag) => {
            if (flag & VisitorContextFlag.InChildOperation) {
                return;
            }
            if (expr instanceof AssignTemporaryExpr) {
                if (!assigned.has(expr.xref)) {
                    assigned.add(expr.xref);
                    // TODO: Exactly replicate the naming scheme used by `TemplateDefinitionBuilder`.
                    // It seems to rely on an expression index instead of an op index.
                    defs.set(expr.xref, `tmp_${opCount}_${count++}`);
                }
                assignName(defs, expr);
            }
            else if (expr instanceof ReadTemporaryExpr) {
                if (finalReads.get(expr.xref) === expr) {
                    released.add(expr.xref);
                    count--;
                }
                assignName(defs, expr);
            }
        });
        // Add declarations for the temp vars.
        generatedStatements.push(...Array.from(new Set(defs.values())).map((name) => createStatementOp(new DeclareVarStmt(name))));
        opCount++;
        if (op.kind === OpKind.Listener || op.kind === OpKind.TwoWayListener) {
            op.handlerOps.prepend(generateTemporaries(op.handlerOps));
        }
        else if (op.kind === OpKind.RepeaterCreate && op.trackByOps !== null) {
            op.trackByOps.prepend(generateTemporaries(op.trackByOps));
        }
    }
    return generatedStatements;
}
/**
 * Assigns a name to the temporary variable in the given temporary variable expression.
 */
function assignName(names, expr) {
    const name = names.get(expr.xref);
    if (name === undefined) {
        throw new Error(`Found xref with unassigned name: ${expr.xref}`);
    }
    expr.name = name;
}

/**
 * `track` functions in `for` repeaters can sometimes be "optimized," i.e. transformed into inline
 * expressions, in lieu of an external function call. For example, tracking by `$index` can be be
 * optimized into an inline `trackByIndex` reference. This phase checks track expressions for
 * optimizable cases.
 */
function optimizeTrackFns(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind !== OpKind.RepeaterCreate) {
                continue;
            }
            if (op.track instanceof ReadVarExpr && op.track.name === '$index') {
                // Top-level access of `$index` uses the built in `repeaterTrackByIndex`.
                op.trackByFn = importExpr(Identifiers.repeaterTrackByIndex);
            }
            else if (op.track instanceof ReadVarExpr && op.track.name === '$item') {
                // Top-level access of the item uses the built in `repeaterTrackByIdentity`.
                op.trackByFn = importExpr(Identifiers.repeaterTrackByIdentity);
            }
            else if (isTrackByFunctionCall(job.root.xref, op.track)) {
                // Mark the function as using the component instance to play it safe
                // since the method might be using `this` internally (see #53628).
                op.usesComponentInstance = true;
                // Top-level method calls in the form of `fn($index, item)` can be passed in directly.
                if (op.track.receiver.receiver.view === unit.xref) {
                    // TODO: this may be wrong
                    op.trackByFn = op.track.receiver;
                }
                else {
                    // This is a plain method call, but not in the component's root view.
                    // We need to get the component instance, and then call the method on it.
                    op.trackByFn = importExpr(Identifiers.componentInstance)
                        .callFn([])
                        .prop(op.track.receiver.name);
                    // Because the context is not avaiable (without a special function), we don't want to
                    // try to resolve it later. Let's get rid of it by overwriting the original track
                    // expression (which won't be used anyway).
                    op.track = op.trackByFn;
                }
            }
            else {
                // The track function could not be optimized.
                // Replace context reads with a special IR expression, since context reads in a track
                // function are emitted specially.
                op.track = transformExpressionsInExpression(op.track, (expr) => {
                    if (expr instanceof PipeBindingExpr || expr instanceof PipeBindingVariadicExpr) {
                        throw new Error(`Illegal State: Pipes are not allowed in this context`);
                    }
                    else if (expr instanceof ContextExpr) {
                        op.usesComponentInstance = true;
                        return new TrackContextExpr(expr.view);
                    }
                    return expr;
                }, VisitorContextFlag.None);
                // Also create an OpList for the tracking expression since it may need
                // additional ops when generating the final code (e.g. temporary variables).
                const trackOpList = new OpList();
                trackOpList.push(createStatementOp(new ReturnStatement(op.track, op.track.sourceSpan)));
                op.trackByOps = trackOpList;
            }
        }
    }
}
function isTrackByFunctionCall(rootView, expr) {
    if (!(expr instanceof InvokeFunctionExpr) || expr.args.length === 0 || expr.args.length > 2) {
        return false;
    }
    if (!(expr.receiver instanceof ReadPropExpr && expr.receiver.receiver instanceof ContextExpr) ||
        expr.receiver.receiver.view !== rootView) {
        return false;
    }
    const [arg0, arg1] = expr.args;
    if (!(arg0 instanceof ReadVarExpr) || arg0.name !== '$index') {
        return false;
    }
    else if (expr.args.length === 1) {
        return true;
    }
    if (!(arg1 instanceof ReadVarExpr) || arg1.name !== '$item') {
        return false;
    }
    return true;
}

/**
 * Inside the `track` expression on a `for` repeater, the `$index` and `$item` variables are
 * ambiently available. In this phase, we find those variable usages, and replace them with the
 * appropriate output read.
 */
function generateTrackVariables(job) {
    for (const unit of job.units) {
        for (const op of unit.create) {
            if (op.kind !== OpKind.RepeaterCreate) {
                continue;
            }
            op.track = transformExpressionsInExpression(op.track, (expr) => {
                if (expr instanceof LexicalReadExpr) {
                    if (op.varNames.$index.has(expr.name)) {
                        return variable('$index');
                    }
                    else if (expr.name === op.varNames.$implicit) {
                        return variable('$item');
                    }
                    // TODO: handle prohibited context variables (emit as globals?)
                }
                return expr;
            }, VisitorContextFlag.None);
        }
    }
}

/**
 * Counts the number of variable slots used within each view, and stores that on the view itself, as
 * well as propagates it to the `ir.TemplateOp` for embedded views.
 */
function countVariables(job) {
    // First, count the vars used in each view, and update the view-level counter.
    for (const unit of job.units) {
        let varCount = 0;
        // Count variables on top-level ops first. Don't explore nested expressions just yet.
        for (const op of unit.ops()) {
            if (hasConsumesVarsTrait(op)) {
                varCount += varsUsedByOp(op);
            }
        }
        // Count variables on expressions inside ops. We do this later because some of these expressions
        // might be conditional (e.g. `pipeBinding` inside of a ternary), and we don't want to interfere
        // with indices for top-level binding slots (e.g. `property`).
        for (const op of unit.ops()) {
            visitExpressionsInOp(op, (expr) => {
                if (!isIrExpression(expr)) {
                    return;
                }
                // TemplateDefinitionBuilder assigns variable offsets for everything but pure functions
                // first, and then assigns offsets to pure functions lazily. We emulate that behavior by
                // assigning offsets in two passes instead of one, only in compatibility mode.
                if (job.compatibility === CompatibilityMode.TemplateDefinitionBuilder &&
                    expr instanceof PureFunctionExpr) {
                    return;
                }
                // Some expressions require knowledge of the number of variable slots consumed.
                if (hasUsesVarOffsetTrait(expr)) {
                    expr.varOffset = varCount;
                }
                if (hasConsumesVarsTrait(expr)) {
                    varCount += varsUsedByIrExpression(expr);
                }
            });
        }
        // Compatibility mode pass for pure function offsets (as explained above).
        if (job.compatibility === CompatibilityMode.TemplateDefinitionBuilder) {
            for (const op of unit.ops()) {
                visitExpressionsInOp(op, (expr) => {
                    if (!isIrExpression(expr) || !(expr instanceof PureFunctionExpr)) {
                        return;
                    }
                    // Some expressions require knowledge of the number of variable slots consumed.
                    if (hasUsesVarOffsetTrait(expr)) {
                        expr.varOffset = varCount;
                    }
                    if (hasConsumesVarsTrait(expr)) {
                        varCount += varsUsedByIrExpression(expr);
                    }
                });
            }
        }
        unit.vars = varCount;
    }
    if (job instanceof ComponentCompilationJob) {
        // Add var counts for each view to the `ir.TemplateOp` which declares that view (if the view is
        // an embedded view).
        for (const unit of job.units) {
            for (const op of unit.create) {
                if (op.kind !== OpKind.Template && op.kind !== OpKind.RepeaterCreate) {
                    continue;
                }
                const childView = job.views.get(op.xref);
                op.vars = childView.vars;
                // TODO: currently we handle the vars for the RepeaterCreate empty template in the reify
                // phase. We should handle that here instead.
            }
        }
    }
}
/**
 * Different operations that implement `ir.UsesVarsTrait` use different numbers of variables, so
 * count the variables used by any particular `op`.
 */
function varsUsedByOp(op) {
    let slots;
    switch (op.kind) {
        case OpKind.Property:
        case OpKind.HostProperty:
        case OpKind.Attribute:
            // All of these bindings use 1 variable slot, plus 1 slot for every interpolated expression,
            // if any.
            slots = 1;
            if (op.expression instanceof Interpolation && !isSingletonInterpolation(op.expression)) {
                slots += op.expression.expressions.length;
            }
            return slots;
        case OpKind.TwoWayProperty:
            // Two-way properties can only have expressions so they only need one variable slot.
            return 1;
        case OpKind.StyleProp:
        case OpKind.ClassProp:
        case OpKind.StyleMap:
        case OpKind.ClassMap:
            // Style & class bindings use 2 variable slots, plus 1 slot for every interpolated expression,
            // if any.
            slots = 2;
            if (op.expression instanceof Interpolation) {
                slots += op.expression.expressions.length;
            }
            return slots;
        case OpKind.InterpolateText:
            // `ir.InterpolateTextOp`s use a variable slot for each dynamic expression.
            return op.interpolation.expressions.length;
        case OpKind.I18nExpression:
        case OpKind.Conditional:
        case OpKind.DeferWhen:
        case OpKind.StoreLet:
            return 1;
        case OpKind.RepeaterCreate:
            // Repeaters may require an extra variable binding slot, if they have an empty view, for the
            // empty block tracking.
            // TODO: It's a bit odd to have a create mode instruction consume variable slots. Maybe we can
            // find a way to use the Repeater update op instead.
            return op.emptyView ? 1 : 0;
        default:
            throw new Error(`Unhandled op: ${OpKind[op.kind]}`);
    }
}
function varsUsedByIrExpression(expr) {
    switch (expr.kind) {
        case ExpressionKind.PureFunctionExpr:
            return 1 + expr.args.length;
        case ExpressionKind.PipeBinding:
            return 1 + expr.args.length;
        case ExpressionKind.PipeBindingVariadic:
            return 1 + expr.numArgs;
        case ExpressionKind.StoreLet:
            return 1;
        default:
            throw new Error(`AssertionError: unhandled ConsumesVarsTrait expression ${expr.constructor.name}`);
    }
}
function isSingletonInterpolation(expr) {
    if (expr.expressions.length !== 1 || expr.strings.length !== 2) {
        return false;
    }
    if (expr.strings[0] !== '' || expr.strings[1] !== '') {
        return false;
    }
    return true;
}

/**
 * Optimize variables declared and used in the IR.
 *
 * Variables are eagerly generated by pipeline stages for all possible values that could be
 * referenced. This stage processes the list of declared variables and all variable usages,
 * and optimizes where possible. It performs 3 main optimizations:
 *
 *   * It transforms variable declarations to side effectful expressions when the
 *     variable is not used, but its initializer has global effects which other
 *     operations rely upon.
 *   * It removes variable declarations if those variables are not referenced and
 *     either they do not have global effects, or nothing relies on them.
 *   * It inlines variable declarations when those variables are only used once
 *     and the inlining is semantically safe.
 *
 * To guarantee correctness, analysis of "fences" in the instruction lists is used to determine
 * which optimizations are safe to perform.
 */
function optimizeVariables(job) {
    for (const unit of job.units) {
        inlineAlwaysInlineVariables(unit.create);
        inlineAlwaysInlineVariables(unit.update);
        for (const op of unit.create) {
            if (op.kind === OpKind.Listener || op.kind === OpKind.TwoWayListener) {
                inlineAlwaysInlineVariables(op.handlerOps);
            }
            else if (op.kind === OpKind.RepeaterCreate && op.trackByOps !== null) {
                inlineAlwaysInlineVariables(op.trackByOps);
            }
        }
        optimizeVariablesInOpList(unit.create, job.compatibility);
        optimizeVariablesInOpList(unit.update, job.compatibility);
        for (const op of unit.create) {
            if (op.kind === OpKind.Listener || op.kind === OpKind.TwoWayListener) {
                optimizeVariablesInOpList(op.handlerOps, job.compatibility);
            }
            else if (op.kind === OpKind.RepeaterCreate && op.trackByOps !== null) {
                optimizeVariablesInOpList(op.trackByOps, job.compatibility);
            }
        }
    }
}
/**
 * A [fence](https://en.wikipedia.org/wiki/Memory_barrier) flag for an expression which indicates
 * how that expression can be optimized in relation to other expressions or instructions.
 *
 * `Fence`s are a bitfield, so multiple flags may be set on a single expression.
 */
var Fence;
(function (Fence) {
    /**
     * Empty flag (no fence exists).
     */
    Fence[Fence["None"] = 0] = "None";
    /**
     * A context read fence, meaning that the expression in question reads from the "current view"
     * context of the runtime.
     */
    Fence[Fence["ViewContextRead"] = 1] = "ViewContextRead";
    /**
     * A context write fence, meaning that the expression in question writes to the "current view"
     * context of the runtime.
     *
     * Note that all `ContextWrite` fences are implicitly `ContextRead` fences as operations which
     * change the view context do so based on the current one.
     */
    Fence[Fence["ViewContextWrite"] = 2] = "ViewContextWrite";
    /**
     * Indicates that a call is required for its side-effects, even if nothing reads its result.
     *
     * This is also true of `ViewContextWrite` operations **if** they are followed by a
     * `ViewContextRead`.
     */
    Fence[Fence["SideEffectful"] = 4] = "SideEffectful";
})(Fence || (Fence = {}));
function inlineAlwaysInlineVariables(ops) {
    const vars = new Map();
    for (const op of ops) {
        if (op.kind === OpKind.Variable && op.flags & VariableFlags.AlwaysInline) {
            visitExpressionsInOp(op, (expr) => {
                if (isIrExpression(expr) && fencesForIrExpression(expr) !== Fence.None) {
                    throw new Error(`AssertionError: A context-sensitive variable was marked AlwaysInline`);
                }
            });
            vars.set(op.xref, op);
        }
        transformExpressionsInOp(op, (expr) => {
            if (expr instanceof ReadVariableExpr && vars.has(expr.xref)) {
                const varOp = vars.get(expr.xref);
                // Inline by cloning, because we might inline into multiple places.
                return varOp.initializer.clone();
            }
            return expr;
        }, VisitorContextFlag.None);
    }
    for (const op of vars.values()) {
        OpList.remove(op);
    }
}
/**
 * Process a list of operations and optimize variables within that list.
 */
function optimizeVariablesInOpList(ops, compatibility) {
    const varDecls = new Map();
    const varUsages = new Map();
    // Track variables that are used outside of the immediate operation list. For example, within
    // `ListenerOp` handler operations of listeners in the current operation list.
    const varRemoteUsages = new Set();
    const opMap = new Map();
    // First, extract information about variables declared or used within the whole list.
    for (const op of ops) {
        if (op.kind === OpKind.Variable) {
            if (varDecls.has(op.xref) || varUsages.has(op.xref)) {
                throw new Error(`Should not see two declarations of the same variable: ${op.xref}`);
            }
            varDecls.set(op.xref, op);
            varUsages.set(op.xref, 0);
        }
        opMap.set(op, collectOpInfo(op));
        countVariableUsages(op, varUsages, varRemoteUsages);
    }
    // The next step is to remove any variable declarations for variables that aren't used. The
    // variable initializer expressions may be side-effectful, so they may need to be retained as
    // expression statements.
    // Track whether we've seen an operation which reads from the view context yet. This is used to
    // determine whether a write to the view context in a variable initializer can be observed.
    let contextIsUsed = false;
    // Note that iteration through the list happens in reverse, which guarantees that we'll process
    // all reads of a variable prior to processing its declaration.
    for (const op of ops.reversed()) {
        const opInfo = opMap.get(op);
        if (op.kind === OpKind.Variable && varUsages.get(op.xref) === 0) {
            // This variable is unused and can be removed. We might need to keep the initializer around,
            // though, if something depends on it running.
            if ((contextIsUsed && opInfo.fences & Fence.ViewContextWrite) ||
                opInfo.fences & Fence.SideEffectful) {
                // This variable initializer has a side effect which must be retained. Either:
                //  * it writes to the view context, and we know there is a future operation which depends
                //    on that write, or
                //  * it's an operation which is inherently side-effectful.
                // We can't remove the initializer, but we can remove the variable declaration itself and
                // replace it with a side-effectful statement.
                const stmtOp = createStatementOp(op.initializer.toStmt());
                opMap.set(stmtOp, opInfo);
                OpList.replace(op, stmtOp);
            }
            else {
                // It's safe to delete this entire variable declaration as nothing depends on it, even
                // side-effectfully. Note that doing this might make other variables unused. Since we're
                // iterating in reverse order, we should always be processing usages before declarations
                // and therefore by the time we get to a declaration, all removable usages will have been
                // removed.
                uncountVariableUsages(op, varUsages);
                OpList.remove(op);
            }
            opMap.delete(op);
            varDecls.delete(op.xref);
            varUsages.delete(op.xref);
            continue;
        }
        // Does this operation depend on the view context?
        if (opInfo.fences & Fence.ViewContextRead) {
            contextIsUsed = true;
        }
    }
    // Next, inline any remaining variables with exactly one usage.
    const toInline = [];
    for (const [id, count] of varUsages) {
        const decl = varDecls.get(id);
        // We can inline variables that:
        //  - are used exactly once, and
        //  - are not used remotely
        // OR
        //  - are marked for always inlining
        const isAlwaysInline = !!(decl.flags & VariableFlags.AlwaysInline);
        if (count !== 1 || isAlwaysInline) {
            // We can't inline this variable as it's used more than once.
            continue;
        }
        if (varRemoteUsages.has(id)) {
            // This variable is used once, but across an operation boundary, so it can't be inlined.
            continue;
        }
        toInline.push(id);
    }
    let candidate;
    while ((candidate = toInline.pop())) {
        // We will attempt to inline this variable. If inlining fails (due to fences for example),
        // no future operation will make inlining legal.
        const decl = varDecls.get(candidate);
        const varInfo = opMap.get(decl);
        const isAlwaysInline = !!(decl.flags & VariableFlags.AlwaysInline);
        if (isAlwaysInline) {
            throw new Error(`AssertionError: Found an 'AlwaysInline' variable after the always inlining pass.`);
        }
        // Scan operations following the variable declaration and look for the point where that variable
        // is used. There should only be one usage given the precondition above.
        for (let targetOp = decl.next; targetOp.kind !== OpKind.ListEnd; targetOp = targetOp.next) {
            const opInfo = opMap.get(targetOp);
            // Is the variable used in this operation?
            if (opInfo.variablesUsed.has(candidate)) {
                if (compatibility === CompatibilityMode.TemplateDefinitionBuilder &&
                    !allowConservativeInlining(decl, targetOp)) {
                    // We're in conservative mode, and this variable is not eligible for inlining into the
                    // target operation in this mode.
                    break;
                }
                // Yes, try to inline it. Inlining may not be successful if fences in this operation before
                // the variable's usage cannot be safely crossed.
                if (tryInlineVariableInitializer(candidate, decl.initializer, targetOp, varInfo.fences)) {
                    // Inlining was successful! Update the tracking structures to reflect the inlined
                    // variable.
                    opInfo.variablesUsed.delete(candidate);
                    // Add all variables used in the variable's initializer to its new usage site.
                    for (const id of varInfo.variablesUsed) {
                        opInfo.variablesUsed.add(id);
                    }
                    // Merge fences in the variable's initializer into its new usage site.
                    opInfo.fences |= varInfo.fences;
                    // Delete tracking info related to the declaration.
                    varDecls.delete(candidate);
                    varUsages.delete(candidate);
                    opMap.delete(decl);
                    // And finally, delete the original declaration from the operation list.
                    OpList.remove(decl);
                }
                // Whether inlining succeeded or failed, we're done processing this variable.
                break;
            }
            // If the variable is not used in this operation, then we'd need to inline across it. Check if
            // that's safe to do.
            if (!safeToInlinePastFences(opInfo.fences, varInfo.fences)) {
                // We can't safely inline this variable beyond this operation, so don't proceed with
                // inlining this variable.
                break;
            }
        }
    }
}
/**
 * Given an `ir.Expression`, returns the `Fence` flags for that expression type.
 */
function fencesForIrExpression(expr) {
    switch (expr.kind) {
        case ExpressionKind.NextContext:
            return Fence.ViewContextRead | Fence.ViewContextWrite;
        case ExpressionKind.RestoreView:
            return Fence.ViewContextRead | Fence.ViewContextWrite | Fence.SideEffectful;
        case ExpressionKind.StoreLet:
            return Fence.SideEffectful;
        case ExpressionKind.Reference:
        case ExpressionKind.ContextLetReference:
            return Fence.ViewContextRead;
        default:
            return Fence.None;
    }
}
/**
 * Build the `OpInfo` structure for the given `op`. This performs two operations:
 *
 *  * It tracks which variables are used in the operation's expressions.
 *  * It rolls up fence flags for expressions within the operation.
 */
function collectOpInfo(op) {
    let fences = Fence.None;
    const variablesUsed = new Set();
    visitExpressionsInOp(op, (expr) => {
        if (!isIrExpression(expr)) {
            return;
        }
        switch (expr.kind) {
            case ExpressionKind.ReadVariable:
                variablesUsed.add(expr.xref);
                break;
            default:
                fences |= fencesForIrExpression(expr);
        }
    });
    return { fences, variablesUsed };
}
/**
 * Count the number of usages of each variable, being careful to track whether those usages are
 * local or remote.
 */
function countVariableUsages(op, varUsages, varRemoteUsage) {
    visitExpressionsInOp(op, (expr, flags) => {
        if (!isIrExpression(expr)) {
            return;
        }
        if (expr.kind !== ExpressionKind.ReadVariable) {
            return;
        }
        const count = varUsages.get(expr.xref);
        if (count === undefined) {
            // This variable is declared outside the current scope of optimization.
            return;
        }
        varUsages.set(expr.xref, count + 1);
        if (flags & VisitorContextFlag.InChildOperation) {
            varRemoteUsage.add(expr.xref);
        }
    });
}
/**
 * Remove usages of a variable in `op` from the `varUsages` tracking.
 */
function uncountVariableUsages(op, varUsages) {
    visitExpressionsInOp(op, (expr) => {
        if (!isIrExpression(expr)) {
            return;
        }
        if (expr.kind !== ExpressionKind.ReadVariable) {
            return;
        }
        const count = varUsages.get(expr.xref);
        if (count === undefined) {
            // This variable is declared outside the current scope of optimization.
            return;
        }
        else if (count === 0) {
            throw new Error(`Inaccurate variable count: ${expr.xref} - found another read but count is already 0`);
        }
        varUsages.set(expr.xref, count - 1);
    });
}
/**
 * Checks whether it's safe to inline a variable across a particular operation.
 *
 * @param fences the fences of the operation which the inlining will cross
 * @param declFences the fences of the variable being inlined.
 */
function safeToInlinePastFences(fences, declFences) {
    if (fences & Fence.ViewContextWrite) {
        // It's not safe to inline context reads across context writes.
        if (declFences & Fence.ViewContextRead) {
            return false;
        }
    }
    else if (fences & Fence.ViewContextRead) {
        // It's not safe to inline context writes across context reads.
        if (declFences & Fence.ViewContextWrite) {
            return false;
        }
    }
    return true;
}
/**
 * Attempt to inline the initializer of a variable into a target operation's expressions.
 *
 * This may or may not be safe to do. For example, the variable could be read following the
 * execution of an expression with fences that don't permit the variable to be inlined across them.
 */
function tryInlineVariableInitializer(id, initializer, target, declFences) {
    // We use `ir.transformExpressionsInOp` to walk the expressions and inline the variable if
    // possible. Since this operation is callback-based, once inlining succeeds or fails we can't
    // "stop" the expression processing, and have to keep track of whether inlining has succeeded or
    // is no longer allowed.
    let inlined = false;
    let inliningAllowed = true;
    transformExpressionsInOp(target, (expr, flags) => {
        if (!isIrExpression(expr)) {
            return expr;
        }
        if (inlined || !inliningAllowed) {
            // Either the inlining has already succeeded, or we've passed a fence that disallows inlining
            // at this point, so don't try.
            return expr;
        }
        else if (flags & VisitorContextFlag.InChildOperation &&
            declFences & Fence.ViewContextRead) {
            // We cannot inline variables that are sensitive to the current context across operation
            // boundaries.
            return expr;
        }
        switch (expr.kind) {
            case ExpressionKind.ReadVariable:
                if (expr.xref === id) {
                    // This is the usage site of the variable. Since nothing has disallowed inlining, it's
                    // safe to inline the initializer here.
                    inlined = true;
                    return initializer;
                }
                break;
            default:
                // For other types of `ir.Expression`s, whether inlining is allowed depends on their fences.
                const exprFences = fencesForIrExpression(expr);
                inliningAllowed = inliningAllowed && safeToInlinePastFences(exprFences, declFences);
                break;
        }
        return expr;
    }, VisitorContextFlag.None);
    return inlined;
}
/**
 * Determines whether inlining of `decl` should be allowed in "conservative" mode.
 *
 * In conservative mode, inlining behavior is limited to those operations which the
 * `TemplateDefinitionBuilder` supported, with the goal of producing equivalent output.
 */
function allowConservativeInlining(decl, target) {
    // TODO(alxhub): understand exactly how TemplateDefinitionBuilder approaches inlining, and record
    // that behavior here.
    switch (decl.variable.kind) {
        case SemanticVariableKind.Identifier:
            if (decl.initializer instanceof ReadVarExpr && decl.initializer.name === 'ctx') {
                // Although TemplateDefinitionBuilder is cautious about inlining, we still want to do so
                // when the variable is the context, to imitate its behavior with aliases in control flow
                // blocks. This quirky behavior will become dead code once compatibility mode is no longer
                // supported.
                return true;
            }
            return false;
        case SemanticVariableKind.Context:
            // Context can only be inlined into other variables.
            return target.kind === OpKind.Variable;
        default:
            return true;
    }
}

/**
 * Wraps ICUs that do not already belong to an i18n block in a new i18n block.
 */
function wrapI18nIcus(job) {
    for (const unit of job.units) {
        let currentI18nOp = null;
        let addedI18nId = null;
        for (const op of unit.create) {
            switch (op.kind) {
                case OpKind.I18nStart:
                    currentI18nOp = op;
                    break;
                case OpKind.I18nEnd:
                    currentI18nOp = null;
                    break;
                case OpKind.IcuStart:
                    if (currentI18nOp === null) {
                        addedI18nId = job.allocateXrefId();
                        // ICU i18n start/end ops should not receive source spans.
                        OpList.insertBefore(createI18nStartOp(addedI18nId, op.message, undefined, null), op);
                    }
                    break;
                case OpKind.IcuEnd:
                    if (addedI18nId !== null) {
                        OpList.insertAfter(createI18nEndOp(addedI18nId, null), op);
                        addedI18nId = null;
                    }
                    break;
            }
        }
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Removes any `storeLet` calls that aren't referenced outside of the current view.
 */
function optimizeStoreLet(job) {
    const letUsedExternally = new Set();
    // Since `@let` declarations can be referenced in child views, both in
    // the creation block (via listeners) and in the update block, we have
    // to look through all the ops to find the references.
    for (const unit of job.units) {
        for (const op of unit.ops()) {
            visitExpressionsInOp(op, (expr) => {
                if (expr instanceof ContextLetReferenceExpr) {
                    letUsedExternally.add(expr.target);
                }
            });
        }
    }
    // TODO(crisbeto): potentially remove the unused calls completely, pending discussion.
    for (const unit of job.units) {
        for (const op of unit.update) {
            transformExpressionsInOp(op, (expression) => expression instanceof StoreLetExpr && !letUsedExternally.has(expression.target)
                ? expression.value
                : expression, VisitorContextFlag.None);
        }
    }
}

/**
 * It's not allowed to access a `@let` declaration before it has been defined. This is enforced
 * already via template type checking, however it can trip some of the assertions in the pipeline.
 * E.g. the naming phase can fail because we resolved the variable here, but the variable doesn't
 * exist anymore because the optimization phase removed it since it's invalid. To avoid surfacing
 * confusing errors to users in the case where template type checking isn't running (e.g. in JIT
 * mode) this phase detects illegal forward references and replaces them with `undefined`.
 * Eventually users will see the proper error from the template type checker.
 */
function removeIllegalLetReferences(job) {
    for (const unit of job.units) {
        for (const op of unit.update) {
            if (op.kind !== OpKind.Variable ||
                op.variable.kind !== SemanticVariableKind.Identifier ||
                !(op.initializer instanceof StoreLetExpr)) {
                continue;
            }
            const name = op.variable.identifier;
            let current = op;
            while (current && current.kind !== OpKind.ListEnd) {
                transformExpressionsInOp(current, (expr) => expr instanceof LexicalReadExpr && expr.name === name ? literal$1(undefined) : expr, VisitorContextFlag.None);
                current = current.prev;
            }
        }
    }
}

/**
 * Replaces the `storeLet` ops with variables that can be
 * used to reference the value within the same view.
 */
function generateLocalLetReferences(job) {
    for (const unit of job.units) {
        for (const op of unit.update) {
            if (op.kind !== OpKind.StoreLet) {
                continue;
            }
            const variable = {
                kind: SemanticVariableKind.Identifier,
                name: null,
                identifier: op.declaredName,
                local: true,
            };
            OpList.replace(op, createVariableOp(job.allocateXrefId(), variable, new StoreLetExpr(op.target, op.value, op.sourceSpan), VariableFlags.None));
        }
    }
}

/**
 * Locates all of the elements defined in a creation block and outputs an op
 * that will expose their definition location in the DOM.
 */
function attachSourceLocations(job) {
    if (!job.enableDebugLocations || job.relativeTemplatePath === null) {
        return;
    }
    for (const unit of job.units) {
        const locations = [];
        for (const op of unit.create) {
            if (op.kind === OpKind.ElementStart || op.kind === OpKind.Element) {
                const start = op.startSourceSpan.start;
                locations.push({
                    targetSlot: op.handle,
                    offset: start.offset,
                    line: start.line,
                    column: start.col,
                });
            }
        }
        if (locations.length > 0) {
            unit.create.push(createSourceLocationOp(job.relativeTemplatePath, locations));
        }
    }
}

/**
 *
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
const phases = [
    { kind: CompilationJobKind.Tmpl, fn: removeContentSelectors },
    { kind: CompilationJobKind.Host, fn: parseHostStyleProperties },
    { kind: CompilationJobKind.Tmpl, fn: emitNamespaceChanges },
    { kind: CompilationJobKind.Tmpl, fn: propagateI18nBlocks },
    { kind: CompilationJobKind.Tmpl, fn: wrapI18nIcus },
    { kind: CompilationJobKind.Both, fn: deduplicateTextBindings },
    { kind: CompilationJobKind.Both, fn: specializeStyleBindings },
    { kind: CompilationJobKind.Both, fn: specializeBindings },
    { kind: CompilationJobKind.Both, fn: extractAttributes },
    { kind: CompilationJobKind.Tmpl, fn: createI18nContexts },
    { kind: CompilationJobKind.Both, fn: parseExtractedStyles },
    { kind: CompilationJobKind.Tmpl, fn: removeEmptyBindings },
    { kind: CompilationJobKind.Both, fn: collapseSingletonInterpolations },
    { kind: CompilationJobKind.Both, fn: orderOps },
    { kind: CompilationJobKind.Tmpl, fn: generateConditionalExpressions },
    { kind: CompilationJobKind.Tmpl, fn: createPipes },
    { kind: CompilationJobKind.Tmpl, fn: configureDeferInstructions },
    { kind: CompilationJobKind.Tmpl, fn: convertI18nText },
    { kind: CompilationJobKind.Tmpl, fn: convertI18nBindings },
    { kind: CompilationJobKind.Tmpl, fn: removeUnusedI18nAttributesOps },
    { kind: CompilationJobKind.Tmpl, fn: assignI18nSlotDependencies },
    { kind: CompilationJobKind.Tmpl, fn: applyI18nExpressions },
    { kind: CompilationJobKind.Tmpl, fn: createVariadicPipes },
    { kind: CompilationJobKind.Both, fn: generatePureLiteralStructures },
    { kind: CompilationJobKind.Tmpl, fn: generateProjectionDefs },
    { kind: CompilationJobKind.Tmpl, fn: generateLocalLetReferences },
    { kind: CompilationJobKind.Tmpl, fn: generateVariables },
    { kind: CompilationJobKind.Tmpl, fn: saveAndRestoreView },
    { kind: CompilationJobKind.Both, fn: deleteAnyCasts },
    { kind: CompilationJobKind.Both, fn: resolveDollarEvent },
    { kind: CompilationJobKind.Tmpl, fn: generateTrackVariables },
    { kind: CompilationJobKind.Tmpl, fn: removeIllegalLetReferences },
    { kind: CompilationJobKind.Both, fn: resolveNames },
    { kind: CompilationJobKind.Tmpl, fn: resolveDeferTargetNames },
    { kind: CompilationJobKind.Tmpl, fn: transformTwoWayBindingSet },
    { kind: CompilationJobKind.Tmpl, fn: optimizeTrackFns },
    { kind: CompilationJobKind.Both, fn: resolveContexts },
    { kind: CompilationJobKind.Both, fn: resolveSanitizers },
    { kind: CompilationJobKind.Tmpl, fn: liftLocalRefs },
    { kind: CompilationJobKind.Both, fn: generateNullishCoalesceExpressions },
    { kind: CompilationJobKind.Both, fn: expandSafeReads },
    { kind: CompilationJobKind.Both, fn: generateTemporaryVariables },
    { kind: CompilationJobKind.Both, fn: optimizeVariables },
    { kind: CompilationJobKind.Both, fn: optimizeStoreLet },
    { kind: CompilationJobKind.Tmpl, fn: allocateSlots },
    { kind: CompilationJobKind.Tmpl, fn: resolveI18nElementPlaceholders },
    { kind: CompilationJobKind.Tmpl, fn: resolveI18nExpressionPlaceholders },
    { kind: CompilationJobKind.Tmpl, fn: extractI18nMessages },
    { kind: CompilationJobKind.Tmpl, fn: collectI18nConsts },
    { kind: CompilationJobKind.Tmpl, fn: collectConstExpressions },
    { kind: CompilationJobKind.Both, fn: collectElementConsts },
    { kind: CompilationJobKind.Tmpl, fn: removeI18nContexts },
    { kind: CompilationJobKind.Both, fn: countVariables },
    { kind: CompilationJobKind.Tmpl, fn: generateAdvance },
    { kind: CompilationJobKind.Both, fn: nameFunctionsAndVariables },
    { kind: CompilationJobKind.Tmpl, fn: resolveDeferDepsFns },
    { kind: CompilationJobKind.Tmpl, fn: mergeNextContextExpressions },
    { kind: CompilationJobKind.Tmpl, fn: generateNgContainerOps },
    { kind: CompilationJobKind.Tmpl, fn: collapseEmptyInstructions },
    { kind: CompilationJobKind.Tmpl, fn: attachSourceLocations },
    { kind: CompilationJobKind.Tmpl, fn: disableBindings$1 },
    { kind: CompilationJobKind.Both, fn: extractPureFunctions },
    { kind: CompilationJobKind.Both, fn: reify },
    { kind: CompilationJobKind.Both, fn: chain },
];
/**
 * Run all transformation phases in the correct order against a compilation job. After this
 * processing, the compilation should be in a state where it can be emitted.
 */
function transform(job, kind) {
    for (const phase of phases) {
        if (phase.kind === kind || phase.kind === CompilationJobKind.Both) {
            // The type of `Phase` above ensures it is impossible to call a phase that doesn't support the
            // job kind.
            phase.fn(job);
        }
    }
}
/**
 * Compile all views in the given `ComponentCompilation` into the final template function, which may
 * reference constants defined in a `ConstantPool`.
 */
function emitTemplateFn(tpl, pool) {
    const rootFn = emitView(tpl.root);
    emitChildViews(tpl.root, pool);
    return rootFn;
}
function emitChildViews(parent, pool) {
    for (const unit of parent.job.units) {
        if (unit.parent !== parent.xref) {
            continue;
        }
        // Child views are emitted depth-first.
        emitChildViews(unit, pool);
        const viewFn = emitView(unit);
        pool.statements.push(viewFn.toDeclStmt(viewFn.name));
    }
}
/**
 * Emit a template function for an individual `ViewCompilation` (which may be either the root view
 * or an embedded view).
 */
function emitView(view) {
    if (view.fnName === null) {
        throw new Error(`AssertionError: view ${view.xref} is unnamed`);
    }
    const createStatements = [];
    for (const op of view.create) {
        if (op.kind !== OpKind.Statement) {
            throw new Error(`AssertionError: expected all create ops to have been compiled, but got ${OpKind[op.kind]}`);
        }
        createStatements.push(op.statement);
    }
    const updateStatements = [];
    for (const op of view.update) {
        if (op.kind !== OpKind.Statement) {
            throw new Error(`AssertionError: expected all update ops to have been compiled, but got ${OpKind[op.kind]}`);
        }
        updateStatements.push(op.statement);
    }
    const createCond = maybeGenerateRfBlock(1, createStatements);
    const updateCond = maybeGenerateRfBlock(2, updateStatements);
    return fn([new FnParam('rf'), new FnParam('ctx')], [...createCond, ...updateCond], 
    /* type */ undefined, 
    /* sourceSpan */ undefined, view.fnName);
}
function maybeGenerateRfBlock(flag, statements) {
    if (statements.length === 0) {
        return [];
    }
    return [
        ifStmt(new BinaryOperatorExpr(BinaryOperator.BitwiseAnd, variable('rf'), literal$1(flag)), statements),
    ];
}
function emitHostBindingFunction(job) {
    if (job.root.fnName === null) {
        throw new Error(`AssertionError: host binding function is unnamed`);
    }
    const createStatements = [];
    for (const op of job.root.create) {
        if (op.kind !== OpKind.Statement) {
            throw new Error(`AssertionError: expected all create ops to have been compiled, but got ${OpKind[op.kind]}`);
        }
        createStatements.push(op.statement);
    }
    const updateStatements = [];
    for (const op of job.root.update) {
        if (op.kind !== OpKind.Statement) {
            throw new Error(`AssertionError: expected all update ops to have been compiled, but got ${OpKind[op.kind]}`);
        }
        updateStatements.push(op.statement);
    }
    if (createStatements.length === 0 && updateStatements.length === 0) {
        return null;
    }
    const createCond = maybeGenerateRfBlock(1, createStatements);
    const updateCond = maybeGenerateRfBlock(2, updateStatements);
    return fn([new FnParam('rf'), new FnParam('ctx')], [...createCond, ...updateCond], 
    /* type */ undefined, 
    /* sourceSpan */ undefined, job.root.fnName);
}

const compatibilityMode = CompatibilityMode.TemplateDefinitionBuilder;
// Schema containing DOM elements and their properties.
const domSchema = new DomElementSchemaRegistry();
// Tag name of the `ng-template` element.
const NG_TEMPLATE_TAG_NAME = 'ng-template';
function isI18nRootNode(meta) {
    return meta instanceof Message;
}
function isSingleI18nIcu(meta) {
    return isI18nRootNode(meta) && meta.nodes.length === 1 && meta.nodes[0] instanceof Icu;
}
/**
 * Process a template AST and convert it into a `ComponentCompilation` in the intermediate
 * representation.
 * TODO: Refactor more of the ingestion code into phases.
 */
function ingestComponent(componentName, template, constantPool, relativeContextFilePath, i18nUseExternalIds, deferMeta, allDeferrableDepsFn, relativeTemplatePath, enableDebugLocations) {
    const job = new ComponentCompilationJob(componentName, constantPool, compatibilityMode, relativeContextFilePath, i18nUseExternalIds, deferMeta, allDeferrableDepsFn, relativeTemplatePath, enableDebugLocations);
    ingestNodes(job.root, template);
    return job;
}
/**
 * Process a host binding AST and convert it into a `HostBindingCompilationJob` in the intermediate
 * representation.
 */
function ingestHostBinding(input, bindingParser, constantPool) {
    const job = new HostBindingCompilationJob(input.componentName, constantPool, compatibilityMode);
    for (const property of input.properties ?? []) {
        let bindingKind = BindingKind.Property;
        // TODO: this should really be handled in the parser.
        if (property.name.startsWith('attr.')) {
            property.name = property.name.substring('attr.'.length);
            bindingKind = BindingKind.Attribute;
        }
        if (property.isAnimation) {
            bindingKind = BindingKind.Animation;
        }
        const securityContexts = bindingParser
            .calcPossibleSecurityContexts(input.componentSelector, property.name, bindingKind === BindingKind.Attribute)
            .filter((context) => context !== SecurityContext.NONE);
        ingestHostProperty(job, property, bindingKind, securityContexts);
    }
    for (const [name, expr] of Object.entries(input.attributes) ?? []) {
        const securityContexts = bindingParser
            .calcPossibleSecurityContexts(input.componentSelector, name, true)
            .filter((context) => context !== SecurityContext.NONE);
        ingestHostAttribute(job, name, expr, securityContexts);
    }
    for (const event of input.events ?? []) {
        ingestHostEvent(job, event);
    }
    return job;
}
// TODO: We should refactor the parser to use the same types and structures for host bindings as
// with ordinary components. This would allow us to share a lot more ingestion code.
function ingestHostProperty(job, property, bindingKind, securityContexts) {
    let expression;
    const ast = property.expression.ast;
    if (ast instanceof Interpolation$1) {
        expression = new Interpolation(ast.strings, ast.expressions.map((expr) => convertAst(expr, job, property.sourceSpan)), []);
    }
    else {
        expression = convertAst(ast, job, property.sourceSpan);
    }
    job.root.update.push(createBindingOp(job.root.xref, bindingKind, property.name, expression, null, securityContexts, false, false, null, 
    /* TODO: How do Host bindings handle i18n attrs? */ null, property.sourceSpan));
}
function ingestHostAttribute(job, name, value, securityContexts) {
    const attrBinding = createBindingOp(job.root.xref, BindingKind.Attribute, name, value, null, securityContexts, 
    /* Host attributes should always be extracted to const hostAttrs, even if they are not
     *strictly* text literals */
    true, false, null, 
    /* TODO */ null, 
    /** TODO: May be null? */ value.sourceSpan);
    job.root.update.push(attrBinding);
}
function ingestHostEvent(job, event) {
    const [phase, target] = event.type !== exports.ParsedEventType.Animation
        ? [null, event.targetOrPhase]
        : [event.targetOrPhase, null];
    const eventBinding = createListenerOp(job.root.xref, new SlotHandle(), event.name, null, makeListenerHandlerOps(job.root, event.handler, event.handlerSpan), phase, target, true, event.sourceSpan);
    job.root.create.push(eventBinding);
}
/**
 * Ingest the nodes of a template AST into the given `ViewCompilation`.
 */
function ingestNodes(unit, template) {
    for (const node of template) {
        if (node instanceof Element$1) {
            ingestElement(unit, node);
        }
        else if (node instanceof Template) {
            ingestTemplate(unit, node);
        }
        else if (node instanceof Content) {
            ingestContent(unit, node);
        }
        else if (node instanceof Text$3) {
            ingestText(unit, node, null);
        }
        else if (node instanceof BoundText) {
            ingestBoundText(unit, node, null);
        }
        else if (node instanceof IfBlock) {
            ingestIfBlock(unit, node);
        }
        else if (node instanceof SwitchBlock) {
            ingestSwitchBlock(unit, node);
        }
        else if (node instanceof DeferredBlock) {
            ingestDeferBlock(unit, node);
        }
        else if (node instanceof Icu$1) {
            ingestIcu(unit, node);
        }
        else if (node instanceof ForLoopBlock) {
            ingestForBlock(unit, node);
        }
        else if (node instanceof LetDeclaration$1) {
            ingestLetDeclaration(unit, node);
        }
        else {
            throw new Error(`Unsupported template node: ${node.constructor.name}`);
        }
    }
}
/**
 * Ingest an element AST from the template into the given `ViewCompilation`.
 */
function ingestElement(unit, element) {
    if (element.i18n !== undefined &&
        !(element.i18n instanceof Message || element.i18n instanceof TagPlaceholder)) {
        throw Error(`Unhandled i18n metadata type for element: ${element.i18n.constructor.name}`);
    }
    const id = unit.job.allocateXrefId();
    const [namespaceKey, elementName] = splitNsName(element.name);
    const startOp = createElementStartOp(elementName, id, namespaceForKey(namespaceKey), element.i18n instanceof TagPlaceholder ? element.i18n : undefined, element.startSourceSpan, element.sourceSpan);
    unit.create.push(startOp);
    ingestElementBindings(unit, startOp, element);
    ingestReferences(startOp, element);
    // Start i18n, if needed, goes after the element create and bindings, but before the nodes
    let i18nBlockId = null;
    if (element.i18n instanceof Message) {
        i18nBlockId = unit.job.allocateXrefId();
        unit.create.push(createI18nStartOp(i18nBlockId, element.i18n, undefined, element.startSourceSpan));
    }
    ingestNodes(unit, element.children);
    // The source span for the end op is typically the element closing tag. However, if no closing tag
    // exists, such as in `<input>`, we use the start source span instead. Usually the start and end
    // instructions will be collapsed into one `element` instruction, negating the purpose of this
    // fallback, but in cases when it is not collapsed (such as an input with a binding), we still
    // want to map the end instruction to the main element.
    const endOp = createElementEndOp(id, element.endSourceSpan ?? element.startSourceSpan);
    unit.create.push(endOp);
    // If there is an i18n message associated with this element, insert i18n start and end ops.
    if (i18nBlockId !== null) {
        OpList.insertBefore(createI18nEndOp(i18nBlockId, element.endSourceSpan ?? element.startSourceSpan), endOp);
    }
}
/**
 * Ingest an `ng-template` node from the AST into the given `ViewCompilation`.
 */
function ingestTemplate(unit, tmpl) {
    if (tmpl.i18n !== undefined &&
        !(tmpl.i18n instanceof Message || tmpl.i18n instanceof TagPlaceholder)) {
        throw Error(`Unhandled i18n metadata type for template: ${tmpl.i18n.constructor.name}`);
    }
    const childView = unit.job.allocateView(unit.xref);
    let tagNameWithoutNamespace = tmpl.tagName;
    let namespacePrefix = '';
    if (tmpl.tagName) {
        [namespacePrefix, tagNameWithoutNamespace] = splitNsName(tmpl.tagName);
    }
    const i18nPlaceholder = tmpl.i18n instanceof TagPlaceholder ? tmpl.i18n : undefined;
    const namespace = namespaceForKey(namespacePrefix);
    const functionNameSuffix = tagNameWithoutNamespace === null ? '' : prefixWithNamespace(tagNameWithoutNamespace, namespace);
    const templateKind = isPlainTemplate(tmpl)
        ? TemplateKind.NgTemplate
        : TemplateKind.Structural;
    const templateOp = createTemplateOp(childView.xref, templateKind, tagNameWithoutNamespace, functionNameSuffix, namespace, i18nPlaceholder, tmpl.startSourceSpan, tmpl.sourceSpan);
    unit.create.push(templateOp);
    ingestTemplateBindings(unit, templateOp, tmpl, templateKind);
    ingestReferences(templateOp, tmpl);
    ingestNodes(childView, tmpl.children);
    for (const { name, value } of tmpl.variables) {
        childView.contextVariables.set(name, value !== '' ? value : '$implicit');
    }
    // If this is a plain template and there is an i18n message associated with it, insert i18n start
    // and end ops. For structural directive templates, the i18n ops will be added when ingesting the
    // element/template the directive is placed on.
    if (templateKind === TemplateKind.NgTemplate && tmpl.i18n instanceof Message) {
        const id = unit.job.allocateXrefId();
        OpList.insertAfter(createI18nStartOp(id, tmpl.i18n, undefined, tmpl.startSourceSpan), childView.create.head);
        OpList.insertBefore(createI18nEndOp(id, tmpl.endSourceSpan ?? tmpl.startSourceSpan), childView.create.tail);
    }
}
/**
 * Ingest a content node from the AST into the given `ViewCompilation`.
 */
function ingestContent(unit, content) {
    if (content.i18n !== undefined && !(content.i18n instanceof TagPlaceholder)) {
        throw Error(`Unhandled i18n metadata type for element: ${content.i18n.constructor.name}`);
    }
    let fallbackView = null;
    // Don't capture default content that's only made up of empty text nodes and comments.
    // Note that we process the default content before the projection in order to match the
    // insertion order at runtime.
    if (content.children.some((child) => !(child instanceof Comment$1) &&
        (!(child instanceof Text$3) || child.value.trim().length > 0))) {
        fallbackView = unit.job.allocateView(unit.xref);
        ingestNodes(fallbackView, content.children);
    }
    const id = unit.job.allocateXrefId();
    const op = createProjectionOp(id, content.selector, content.i18n, fallbackView?.xref ?? null, content.sourceSpan);
    for (const attr of content.attributes) {
        const securityContext = domSchema.securityContext(content.name, attr.name, true);
        unit.update.push(createBindingOp(op.xref, BindingKind.Attribute, attr.name, literal$1(attr.value), null, securityContext, true, false, null, asMessage(attr.i18n), attr.sourceSpan));
    }
    unit.create.push(op);
}
/**
 * Ingest a literal text node from the AST into the given `ViewCompilation`.
 */
function ingestText(unit, text, icuPlaceholder) {
    unit.create.push(createTextOp(unit.job.allocateXrefId(), text.value, icuPlaceholder, text.sourceSpan));
}
/**
 * Ingest an interpolated text node from the AST into the given `ViewCompilation`.
 */
function ingestBoundText(unit, text, icuPlaceholder) {
    let value = text.value;
    if (value instanceof ASTWithSource) {
        value = value.ast;
    }
    if (!(value instanceof Interpolation$1)) {
        throw new Error(`AssertionError: expected Interpolation for BoundText node, got ${value.constructor.name}`);
    }
    if (text.i18n !== undefined && !(text.i18n instanceof Container)) {
        throw Error(`Unhandled i18n metadata type for text interpolation: ${text.i18n?.constructor.name}`);
    }
    const i18nPlaceholders = text.i18n instanceof Container
        ? text.i18n.children
            .filter((node) => node instanceof Placeholder)
            .map((placeholder) => placeholder.name)
        : [];
    if (i18nPlaceholders.length > 0 && i18nPlaceholders.length !== value.expressions.length) {
        throw Error(`Unexpected number of i18n placeholders (${value.expressions.length}) for BoundText with ${value.expressions.length} expressions`);
    }
    const textXref = unit.job.allocateXrefId();
    unit.create.push(createTextOp(textXref, '', icuPlaceholder, text.sourceSpan));
    // TemplateDefinitionBuilder does not generate source maps for sub-expressions inside an
    // interpolation. We copy that behavior in compatibility mode.
    // TODO: is it actually correct to generate these extra maps in modern mode?
    const baseSourceSpan = unit.job.compatibility ? null : text.sourceSpan;
    unit.update.push(createInterpolateTextOp(textXref, new Interpolation(value.strings, value.expressions.map((expr) => convertAst(expr, unit.job, baseSo   urceSpan)), i18nPlaceholders), text.sourceSpan));
}
/**
 * Ingest an `@if` block into the given `ViewCompilation`.
 */
function ingestIfBlock(unit, ifBlock) {
    let firstXref = null;
    let conditions = [];
    for (let i = 0; i < ifBlock.branches.length; i++) {
        const ifCase = ifBlock.branches[i];
        const cView = unit.job.allocateView(unit.xref);
        const tagName = ingestControlFlowInsertionPoint(unit, cView.xref, ifCase);
        if (ifCase.expressionAlias !== null) {
            cView.contextVariables.set(ifCase.expressionAlias.name, CTX_REF);
        }
        let ifCaseI18nMeta = undefined;
        if (ifCase.i18n !== undefined) {
            if (!(ifCase.i18n instanceof BlockPlaceholder)) {
                throw Error(`Unhandled i18n metadata type for if block: ${ifCase.i18n?.constructor.name}`);
            }
            ifCaseI18nMeta = ifCase.i18n;
        }
        const templateOp = createTemplateOp(cView.xref, TemplateKind.Block, tagName, 'Conditional', Namespace.HTML, ifCaseI18nMeta, ifCase.startSourceSpan, ifCase.sourceSpan);
        unit.create.push(templateOp);
        if (firstXref === null) {
            firstXref = cView.xref;
        }
        const caseExpr = ifCase.expression ? convertAst(ifCase.expression, unit.job, null) : null;
        const conditionalCaseExpr = new ConditionalCaseExpr(caseExpr, templateOp.xref, templateOp.handle, ifCase.expressionAlias);
        conditions.push(conditionalCaseExpr);
        ingestNodes(cView, ifCase.children);
    }
    unit.update.push(createConditionalOp(firstXref, null, conditions, ifBlock.sourceSpan));
}
/**
 * Ingest an `@switch` block into the given `ViewCompilation`.
 */
function ingestSwitchBlock(unit, switchBlock) {
    // Don't ingest empty switches since they won't render anything.
    if (switchBlock.cases.length === 0) {
        return;
    }
    let firstXref = null;
    let conditions = [];
    for (const switchCase of switchBlock.cases) {
        const cView = unit.job.allocateView(unit.xref);
        const tagName = ingestControlFlowInsertionPoint(unit, cView.xref, switchCase);
        let switchCaseI18nMeta = undefined;
        if (switchCase.i18n !== undefined) {
            if (!(switchCase.i18n instanceof BlockPlaceholder)) {
                throw Error(`Unhandled i18n metadata type for switch block: ${switchCase.i18n?.constructor.name}`);
            }
            switchCaseI18nMeta = switchCase.i18n;
        }
        const templateOp = createTemplateOp(cView.xref, TemplateKind.Block, tagName, 'Case', Namespace.HTML, switchCaseI18nMeta, switchCase.startSourceSpan, switchCase.sourceSpan);
        unit.create.push(templateOp);
        if (firstXref === null) {
            firstXref = cView.xref;
        }
        const caseExpr = switchCase.expression
            ? convertAst(switchCase.expression, unit.job, switchBlock.startSourceSpan)
            : null;
        const conditionalCaseExpr = new ConditionalCaseExpr(caseExpr, templateOp.xref, templateOp.handle);
        conditions.push(conditionalCaseExpr);
        ingestNodes(cView, switchCase.children);
    }
    unit.update.push(createConditionalOp(firstXref, convertAst(switchBlock.expression, unit.job, null), conditions, switchBlock.sourceSpan));
}
function ingestDeferView(unit, suffix, i18nMeta, children, sourceSpan) {
    if (i18nMeta !== undefined && !(i18nMeta instanceof BlockPlaceholder)) {
        throw Error('Unhandled i18n metadata type for defer block');
    }
    if (children === undefined) {
        return null;
    }
    const secondaryView = unit.job.allocateView(unit.xref);
    ingestNodes(secondaryView, children);
    const templateOp = createTemplateOp(secondaryView.xref, TemplateKind.Block, null, `Defer${suffix}`, Namespace.HTML, i18nMeta, sourceSpan, sourceSpan);
    unit.create.push(templateOp);
    return templateOp;
}
function ingestDeferBlock(unit, deferBlock) {
    let ownResolverFn = null;
    if (unit.job.deferMeta.mode === 0 /* DeferBlockDepsEmitMode.PerBlock */) {
        if (!unit.job.deferMeta.blocks.has(deferBlock)) {
            throw new Error(`AssertionError: unable to find a dependency function for this deferred block`);
        }
        ownResolverFn = unit.job.deferMeta.blocks.get(deferBlock) ?? null;
    }
    // Generate the defer main view and all secondary views.
    const main = ingestDeferView(unit, '', deferBlock.i18n, deferBlock.children, deferBlock.sourceSpan);
    const loading = ingestDeferView(unit, 'Loading', deferBlock.loading?.i18n, deferBlock.loading?.children, deferBlock.loading?.sourceSpan);
    const placeholder = ingestDeferView(unit, 'Placeholder', deferBlock.placeholder?.i18n, deferBlock.placeholder?.children, deferBlock.placeholder?.sourceSpan);
    const error = ingestDeferView(unit, 'Error', deferBlock.error?.i18n, deferBlock.error?.children, deferBlock.error?.sourceSpan);
    // Create the main defer op, and ops for all secondary views.
    const deferXref = unit.job.allocateXrefId();
    const deferOp = createDeferOp(deferXref, main.xref, main.handle, ownResolverFn, unit.job.allDeferrableDepsFn, deferBlock.sourceSpan);
    deferOp.placeholderView = placeholder?.xref ?? null;
    deferOp.placeholderSlot = placeholder?.handle ?? null;
    deferOp.loadingSlot = loading?.handle ?? null;
    deferOp.errorSlot = error?.handle ?? null;
    deferOp.placeholderMinimumTime = deferBlock.placeholder?.minimumTime ?? null;
    deferOp.loadingMinimumTime = deferBlock.loading?.minimumTime ?? null;
    deferOp.loadingAfterTime = deferBlock.loading?.afterTime ?? null;
    deferOp.flags = calcDeferBlockFlags(deferBlock);
    unit.create.push(deferOp);
    // Configure all defer `on` conditions.
    // TODO: refactor prefetch triggers to use a separate op type, with a shared superclass. This will
    // make it easier to refactor prefetch behavior in the future.
    const deferOnOps = [];
    const deferWhenOps = [];
    // Ingest the hydrate triggers first since they set up all the other triggers during SSR.
    ingestDeferTriggers("hydrate" /* ir.DeferOpModifierKind.HYDRATE */, deferBlock.hydrateTriggers, deferOnOps, deferWhenOps, unit, deferXref);
    ingestDeferTriggers("none" /* ir.DeferOpModifierKind.NONE */, deferBlock.triggers, deferOnOps, deferWhenOps, unit, deferXref);
    ingestDeferTriggers("prefetch" /* ir.DeferOpModifierKind.PREFETCH */, deferBlock.prefetchTriggers, deferOnOps, deferWhenOps, unit, deferXref);
    // If no (non-prefetching or hydrating) defer triggers were provided, default to `idle`.
    const hasConcreteTrigger = deferOnOps.some((op) => op.modifier === "none" /* ir.DeferOpModifierKind.NONE */) ||
        deferWhenOps.some((op) => op.modifier === "none" /* ir.DeferOpModifierKind.NONE */);
    if (!hasConcreteTrigger) {
        deferOnOps.push(createDeferOnOp(deferXref, { kind: DeferTriggerKind.Idle }, "none" /* ir.DeferOpModifierKind.NONE */, null));
    }
    unit.create.push(deferOnOps);
    unit.update.push(deferWhenOps);
}
function calcDeferBlockFlags(deferBlockDetails) {
    if (Object.keys(deferBlockDetails.hydrateTriggers).length > 0) {
        return 1 /* ir.TDeferDetailsFlags.HasHydrateTriggers */;
    }
    return null;
}
function ingestDeferTriggers(modifier, triggers, onOps, whenOps, unit, deferXref) {
    if (triggers.idle !== undefined) {
        const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Idle }, modifier, triggers.idle.sourceSpan);
        onOps.push(deferOnOp);
    }
    if (triggers.immediate !== undefined) {
        const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Immediate }, modifier, triggers.immediate.sourceSpan);
        onOps.push(deferOnOp);
    }
    if (triggers.timer !== undefined) {
        const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Timer, delay: triggers.timer.delay }, modifier, triggers.timer.sourceSpan);
        onOps.push(deferOnOp);
    }
    if (triggers.hover !== undefined) {
        const deferOnOp = createDeferOnOp(deferXref, {
            kind: DeferTriggerKind.Hover,
            targetName: triggers.hover.reference,
            targetXref: null,
            targetSlot: null,
            targetView: null,
            targetSlotViewSteps: null,
        }, modifier, triggers.hover.sourceSpan);
        onOps.push(deferOnOp);
    }
    if (triggers.interaction !== undefined) {
        const deferOnOp = createDeferOnOp(deferXref, {
            kind: DeferTriggerKind.Interaction,
            targetName: triggers.interaction.reference,
            targetXref: null,
            targetSlot: null,
            targetView: null,
            targetSlotViewSteps: null,
        }, modifier, triggers.interaction.sourceSpan);
        onOps.push(deferOnOp);
    }
    if (triggers.viewport !== undefined) {
        const deferOnOp = createDeferOnOp(deferXref, {
            kind: DeferTriggerKind.Viewport,
            targetName: triggers.viewport.reference,
            targetXref: null,
            targetSlot: null,
            targetView: null,
            targetSlotViewSteps: null,
        }, modifier, triggers.viewport.sourceSpan);
        onOps.push(deferOnOp);
    }
    if (triggers.never !== undefined) {
        const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Never }, modifier, triggers.never.sourceSpan);
        onOps.push(deferOnOp);
    }
    if (triggers.when !== undefined) {
        if (triggers.when.value instanceof Interpolation$1) {
            // TemplateDefinitionBuilder supports this case, but it's very strange to me. What would it
            // even mean?
            throw new Error(`Unexpected interpolation in defer block when trigger`);
        }
        const deferOnOp = createDeferWhenOp(deferXref, convertAst(triggers.when.value, unit.job, triggers.when.sourceSpan), modifier, triggers.when.sourceSpan);
        whenOps.push(deferOnOp);
    }
}
function ingestIcu(unit, icu) {
    if (icu.i18n instanceof Message && isSingleI18nIcu(icu.i18n)) {
        const xref = unit.job.allocateXrefId();
        unit.create.push(createIcuStartOp(xref, icu.i18n, icuFromI18nMessage(icu.i18n).name, null));
        for (const [placeholder, text] of Object.entries({ ...icu.vars, ...icu.placeholders })) {
            if (text instanceof BoundText) {
                ingestBoundText(unit, text, placeholder);
            }
            else {
                ingestText(unit, text, placeholder);
            }
        }
        unit.create.push(createIcuEndOp(xref));
    }
    else {
        throw Error(`Unhandled i18n metadata type for ICU: ${icu.i18n?.constructor.name}`);
    }
}
/**
 * Ingest an `@for` block into the given `ViewCompilation`.
 */
function ingestForBlock(unit, forBlock) {
    const repeaterView = unit.job.allocateView(unit.xref);
    // We copy TemplateDefinitionBuilder's scheme of creating names for `$count` and `$index`
    // that are suffixed with special information, to disambiguate which level of nested loop
    // the below aliases refer to.
    // TODO: We should refactor Template Pipeline's variable phases to gracefully handle
    // shadowing, and arbitrarily many levels of variables depending on each other.
    const indexName = `ɵ$index_${repeaterView.xref}`;
    const countName = `ɵ$count_${repeaterView.xref}`;
    const indexVarNames = new Set();
    // Set all the context variables and aliases available in the repeater.
    repeaterView.contextVariables.set(forBlock.item.name, forBlock.item.value);
    for (const variable of forBlock.contextVariables) {
        if (variable.value === '$index') {
            indexVarNames.add(variable.name);
        }
        if (variable.name === '$index') {
            repeaterView.contextVariables.set('$index', variable.value).set(indexName, variable.value);
        }
        else if (variable.name === '$count') {
            repeaterView.contextVariables.set('$count', variable.value).set(countName, variable.value);
        }
        else {
            repeaterView.aliases.add({
                kind: SemanticVariableKind.Alias,
                name: null,
                identifier: variable.name,
                expression: getComputedForLoopVariableExpression(variable, indexName, countName),
            });
        }
    }
    const sourceSpan = convertSourceSpan(forBlock.trackBy.span, forBlock.sourceSpan);
    const track = convertAst(forBlock.trackBy, unit.job, sourceSpan);
    ingestNodes(repeaterView, forBlock.children);
    let emptyView = null;
    let emptyTagName = null;
    if (forBlock.empty !== null) {
        emptyView = unit.job.allocateView(unit.xref);
        ingestNodes(emptyView, forBlock.empty.children);
        emptyTagName = ingestControlFlowInsertionPoint(unit, emptyView.xref, forBlock.empty);
    }
    const varNames = {
        $index: indexVarNames,
        $implicit: forBlock.item.name,
    };
    if (forBlock.i18n !== undefined && !(forBlock.i18n instanceof BlockPlaceholder)) {
        throw Error('AssertionError: Unhandled i18n metadata type or @for');
    }
    if (forBlock.empty?.i18n !== undefined &&
        !(forBlock.empty.i18n instanceof BlockPlaceholder)) {
        throw Error('AssertionError: Unhandled i18n metadata type or @empty');
    }
    const i18nPlaceholder = forBlock.i18n;
    const emptyI18nPlaceholder = forBlock.empty?.i18n;
    const tagName = ingestControlFlowInsertionPoint(unit, repeaterView.xref, forBlock);
    const repeaterCreate = createRepeaterCreateOp(repeaterView.xref, emptyView?.xref ?? null, tagName, track, varNames, emptyTagName, i18nPlaceholder, emptyI18nPlaceholder, forBlock.startSourceSpan, forBlock.sourceSpan);
    unit.create.push(repeaterCreate);
    const expression = convertAst(forBlock.expression, unit.job, convertSourceSpan(forBlock.expression.span, forBlock.sourceSpan));
    const repeater = createRepeaterOp(repeaterCreate.xref, repeaterCreate.handle, expression, forBlock.sourceSpan);
    unit.update.push(repeater);
}
/**
 * Gets an expression that represents a variable in an `@for` loop.
 * @param variable AST representing the variable.
 * @param indexName Loop-specific name for `$index`.
 * @param countName Loop-specific name for `$count`.
 */
function getComputedForLoopVariableExpression(variable, indexName, countName) {
    switch (variable.value) {
        case '$index':
            return new LexicalReadExpr(indexName);
        case '$count':
            return new LexicalReadExpr(countName);
        case '$first':
            return new LexicalReadExpr(indexName).identical(literal$1(0));
        case '$last':
            return new LexicalReadExpr(indexName).identical(new LexicalReadExpr(countName).minus(literal$1(1)));
        case '$even':
            return new LexicalReadExpr(indexName).modulo(literal$1(2)).identical(literal$1(0));
        case '$odd':
            return new LexicalReadExpr(indexName).modulo(literal$1(2)).notIdentical(literal$1(0));
        default:
            throw new Error(`AssertionError: unknown @for loop variable ${variable.value}`);
    }
}
function ingestLetDeclaration(unit, node) {
    const target = unit.job.allocateXrefId();
    unit.create.push(createDeclareLetOp(target, node.name, node.sourceSpan));
    unit.update.push(createStoreLetOp(target, node.name, convertAst(node.value, unit.job, node.valueSpan), node.sourceSpan));
}
/**
 * Convert a template AST expression into an output AST expression.
 */
function convertAst(ast, job, baseSourceSpan) {
    if (ast instanceof ASTWithSource) {
        return convertAst(ast.ast, job, baseSourceSpan);
    }
    else if (ast instanceof PropertyRead) {
        // Whether this is an implicit receiver, *excluding* explicit reads of `this`.
        const isImplicitReceiver = ast.receiver instanceof ImplicitReceiver && !(ast.receiver instanceof ThisReceiver);
        if (isImplicitReceiver) {
            return new LexicalReadExpr(ast.name);
        }
        else {
            return new ReadPropExpr(convertAst(ast.receiver, job, baseSourceSpan), ast.name, null, convertSourceSpan(ast.span, baseSourceSpan));
        }
    }
    else if (ast instanceof PropertyWrite) {
        if (ast.receiver instanceof ImplicitReceiver) {
            return new WritePropExpr(
            // TODO: Is it correct to always use the root context in place of the implicit receiver?
            new ContextExpr(job.root.xref), ast.name, convertAst(ast.value, job, baseSourceSpan), null, convertSourceSpan(ast.span, baseSourceSpan));
        }
        return new WritePropExpr(convertAst(ast.receiver, job, baseSourceSpan), ast.name, convertAst(ast.value, job, baseSourceSpan), undefined, convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof KeyedWrite) {
        return new WriteKeyExpr(convertAst(ast.receiver, job, baseSourceSpan), convertAst(ast.key, job, baseSourceSpan), convertAst(ast.value, job, baseSourceSpan), undefined, convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof Call) {
        if (ast.receiver instanceof ImplicitReceiver) {
            throw new Error(`Unexpected ImplicitReceiver`);
        }
        else {
            return new InvokeFunctionExpr(convertAst(ast.receiver, job, baseSourceSpan), ast.args.map((arg) => convertAst(arg, job, baseSourceSpan)), undefined, convertSourceSpan(ast.span, baseSourceSpan));
        }
    }
    else if (ast instanceof LiteralPrimitive) {
        return literal$1(ast.value, undefined, convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof Unary) {
        switch (ast.operator) {
            case '+':
                return new UnaryOperatorExpr(UnaryOperator.Plus, convertAst(ast.expr, job, baseSourceSpan), undefined, convertSourceSpan(ast.span, baseSourceSpan));
            case '-':
                return new UnaryOperatorExpr(UnaryOperator.Minus, convertAst(ast.expr, job, baseSourceSpan), undefined, convertSourceSpan(ast.span, baseSourceSpan));
            default:
                throw new Error(`AssertionError: unknown unary operator ${ast.operator}`);
        }
    }
    else if (ast instanceof Binary) {
        const operator = BINARY_OPERATORS$3.get(ast.operation);
        if (operator === undefined) {
            throw new Error(`AssertionError: unknown binary operator ${ast.operation}`);
        }
        return new BinaryOperatorExpr(operator, convertAst(ast.left, job, baseSourceSpan), convertAst(ast.right, job, baseSourceSpan), undefined, convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof ThisReceiver) {
        // TODO: should context expressions have source maps?
        return new ContextExpr(job.root.xref);
    }
    else if (ast instanceof KeyedRead) {
        return new ReadKeyExpr(convertAst(ast.receiver, job, baseSourceSpan), convertAst(ast.key, job, baseSourceSpan), undefined, convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof Chain) {
        throw new Error(`AssertionError: Chain in unknown context`);
    }
    else if (ast instanceof LiteralMap) {
        const entries = ast.keys.map((key, idx) => {
            const value = ast.values[idx];
            // TODO: should literals have source maps, or do we just map the whole surrounding
            // expression?
            return new LiteralMapEntry(key.key, convertAst(value, job, baseSourceSpan), key.quoted);
        });
        return new LiteralMapExpr(entries, undefined, convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof LiteralArray) {
        // TODO: should literals have source maps, or do we just map the whole surrounding expression?
        return new LiteralArrayExpr(ast.expressions.map((expr) => convertAst(expr, job, baseSourceSpan)));
    }
    else if (ast instanceof Conditional) {
        return new ConditionalExpr(convertAst(ast.condition, job, baseSourceSpan), convertAst(ast.trueExp, job, baseSourceSpan), convertAst(ast.falseExp, job, baseSourceSpan), undefined, convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof NonNullAssert) {
        // A non-null assertion shouldn't impact generated instructions, so we can just drop it.
        return convertAst(ast.expression, job, baseSourceSpan);
    }
    else if (ast instanceof BindingPipe) {
        // TODO: pipes should probably have source maps; figure out details.
        return new PipeBindingExpr(job.allocateXrefId(), new SlotHandle(), ast.name, [
            convertAst(ast.exp, job, baseSourceSpan),
            ...ast.args.map((arg) => convertAst(arg, job, baseSourceSpan)),
        ]);
    }
    else if (ast instanceof SafeKeyedRead) {
        return new SafeKeyedReadExpr(convertAst(ast.receiver, job, baseSourceSpan), convertAst(ast.key, job, baseSourceSpan), convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof SafePropertyRead) {
        // TODO: source span
        return new SafePropertyReadExpr(convertAst(ast.receiver, job, baseSourceSpan), ast.name);
    }
    else if (ast instanceof SafeCall) {
        // TODO: source span
        return new SafeInvokeFunctionExpr(convertAst(ast.receiver, job, baseSourceSpan), ast.args.map((a) => convertAst(a, job, baseSourceSpan)));
    }
    else if (ast instanceof EmptyExpr$1) {
        return new EmptyExpr(convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof PrefixNot) {
        return not(convertAst(ast.expression, job, baseSourceSpan), convertSourceSpan(ast.span, baseSourceSpan));
    }
    else if (ast instanceof TypeofExpression) {
        return typeofExpr(convertAst(ast.expression, job, baseSourceSpan));
    }
    else if (ast instanceof TemplateLiteral) {
        return new TemplateLiteralExpr(ast.elements.map((el) => {
            return new TemplateLiteralElementExpr(el.text, convertSourceSpan(el.span, baseSourceSpan));
        }), ast.expressions.map((expr) => convertAst(expr, job, baseSourceSpan)), convertSourceSpan(ast.span, baseSourceSpan));
    }
    else {
        throw new Error(`Unhandled expression type "${ast.constructor.name}" in file "${baseSourceSpan?.start.file.url}"`);
    }
}
function convertAstWithInterpolation(job, value, i18nMeta, sourceSpan) {
    let expression;
    if (value instanceof Interpolation$1) {
        expression = new Interpolation(value.strings, value.expressions.map((e) => convertAst(e, job, null)), Object.keys(asMessage(i18nMeta)?.placeholders ?? {}));
    }
    else if (value instanceof AST) {
        expression = convertAst(value, job, null);
    }
    else {
        expression = literal$1(value);
    }
    return expression;
}
// TODO: Can we populate Template binding kinds in ingest?
const BINDING_KINDS = new Map([
    [exports.BindingType.Property, BindingKind.Property],
    [exports.BindingType.TwoWay, BindingKind.TwoWayProperty],
    [exports.BindingType.Attribute, BindingKind.Attribute],
    [exports.BindingType.Class, BindingKind.ClassName],
    [exports.BindingType.Style, BindingKind.StyleProperty],
    [exports.BindingType.Animation, BindingKind.Animation],
]);
/**
 * Checks whether the given template is a plain ng-template (as opposed to another kind of template
 * such as a structural directive template or control flow template). This is checked based on the
 * tagName. We can expect that only plain ng-templates will come through with a tagName of
 * 'ng-template'.
 *
 * Here are some of the cases we expect:
 *
 * | Angular HTML                       | Template tagName   |
 * | ---------------------------------- | ------------------ |
 * | `<ng-template>`                    | 'ng-template'      |
 * | `<div *ngIf="true">`               | 'div'              |
 * | `<svg><ng-template>`               | 'svg:ng-template'  |
 * | `@if (true) {`                     | 'Conditional'      |
 * | `<ng-template *ngIf>` (plain)      | 'ng-template'      |
 * | `<ng-template *ngIf>` (structural) | null               |
 */
function isPlainTemplate(tmpl) {
    return splitNsName(tmpl.tagName ?? '')[1] === NG_TEMPLATE_TAG_NAME;
}
/**
 * Ensures that the i18nMeta, if provided, is an i18n.Message.
 */
function asMessage(i18nMeta) {
    if (i18nMeta == null) {
        return null;
    }
    if (!(i18nMeta instanceof Message)) {
        throw Error(`Expected i18n meta to be a Message, but got: ${i18nMeta.constructor.name}`);
    }
    return i18nMeta;
}
/**
 * Process all of the bindings on an element in the template AST and convert them to their IR
 * representation.
 */
function ingestElementBindings(unit, op, element) {
    let bindings = new Array();
    let i18nAttributeBindingNames = new Set();
    for (const attr of element.attributes) {
        // Attribute literal bindings, such as `attr.foo="bar"`.
        const securityContext = domSchema.securityContext(element.name, attr.name, true);
        bindings.push(createBindingOp(op.xref, BindingKind.Attribute, attr.name, convertAstWithInterpolation(unit.job, attr.value, attr.i18n), null, securityContext, true, false, null, asMessage(attr.i18n), attr.sourceSpan));
        if (attr.i18n) {
            i18nAttributeBindingNames.add(attr.name);
        }
    }
    for (const input of element.inputs) {
        if (i18nAttributeBindingNames.has(input.name)) {
            console.error(`On component ${unit.job.componentName}, the binding ${input.name} is both an i18n attribute and a property. You may want to remove the property binding. This will become a compilation error in future versions of Angular.`);
        }
        // All dynamic bindings (both attribute and property bindings).
        bindings.push(createBindingOp(op.xref, BINDING_KINDS.get(input.type), input.name, convertAstWithInterpolation(unit.job, astOf(input.value), input.i18n), input.unit, input.securityContext, false, false, null, asMessage(input.i18n) ?? null, input.sourceSpan));
    }
    unit.create.push(bindings.filter((b) => b?.kind === OpKind.ExtractedAttribute));
    unit.update.push(bindings.filter((b) => b?.kind === OpKind.Binding));
    for (const output of element.outputs) {
        if (output.type === exports.ParsedEventType.Animation && output.phase === null) {
            throw Error('Animation listener should have a phase');
        }
        if (output.type === exports.ParsedEventType.TwoWay) {
            unit.create.push(createTwoWayListenerOp(op.xref, op.handle, output.name, op.tag, makeTwoWayListenerHandlerOps(unit, output.handler, output.handlerSpan), output.sourceSpan));
        }
        else {
            unit.create.push(createListenerOp(op.xref, op.handle, output.name, op.tag, makeListenerHandlerOps(unit, output.handler, output.handlerSpan), output.phase, output.target, false, output.sourceSpan));
        }
    }
    // If any of the bindings on this element have an i18n message, then an i18n attrs configuration
    // op is also required.
    if (bindings.some((b) => b?.i18nMessage) !== null) {
        unit.create.push(createI18nAttributesOp(unit.job.allocateXrefId(), new SlotHandle(), op.xref));
    }
}
/**
 * Process all of the bindings on a template in the template AST and convert them to their IR
 * representation.
 */
function ingestTemplateBindings(unit, op, template, templateKind) {
    let bindings = new Array();
    for (const attr of template.templateAttrs) {
        if (attr instanceof TextAttribute) {
            const securityContext = domSchema.securityContext(NG_TEMPLATE_TAG_NAME, attr.name, true);
            bindings.push(createTemplateBinding(unit, op.xref, exports.BindingType.Attribute, attr.name, attr.value, null, securityContext, true, templateKind, asMessage(attr.i18n), attr.sourceSpan));
        }
        else {
            bindings.push(createTemplateBinding(unit, op.xref, attr.type, attr.name, astOf(attr.value), attr.unit, attr.securityContext, true, templateKind, asMessage(attr.i18n), attr.sourceSpan));
        }
    }
    for (const attr of template.attributes) {
        // Attribute literal bindings, such as `attr.foo="bar"`.
        const securityContext = domSchema.securityContext(NG_TEMPLATE_TAG_NAME, attr.name, true);
        bindings.push(createTemplateBinding(unit, op.xref, exports.BindingType.Attribute, attr.name, attr.value, null, securityContext, false, templateKind, asMessage(attr.i18n), attr.sourceSpan));
    }
    for (const input of template.inputs) {
        // Dynamic bindings (both attribute and property bindings).
        bindings.push(createTemplateBinding(unit, op.xref, input.type, input.name, astOf(input.value), input.unit, input.securityContext, false, templateKind, asMessage(input.i18n), input.sourceSpan));
    }
    unit.create.push(bindings.filter((b) => b?.kind === OpKind.ExtractedAttribute));
    unit.update.push(bindings.filter((b) => b?.kind === OpKind.Binding));
    for (const output of template.outputs) {
        if (output.type === exports.ParsedEventType.Animation && output.phase === null) {
            throw Error('Animation listener should have a phase');
        }
        if (templateKind === TemplateKind.NgTemplate) {
            if (output.type === exports.ParsedEventType.TwoWay) {
                unit.create.push(createTwoWayListenerOp(op.xref, op.handle, output.name, op.tag, makeTwoWayListenerHandlerOps(unit, output.handler, output.handlerSpan), output.sourceSpan));
            }
            else {
                unit.create.push(createListenerOp(op.xref, op.handle, output.name, op.tag, makeListenerHandlerOps(unit, output.handler, output.handlerSpan), output.phase, output.target, false, output.sourceSpan));
            }
        }
        if (templateKind === TemplateKind.Structural &&
            output.type !== exports.ParsedEventType.Animation) {
            // Animation bindings are excluded from the structural template's const array.
            const securityContext = domSchema.securityContext(NG_TEMPLATE_TAG_NAME, output.name, false);
            unit.create.push(createExtractedAttributeOp(op.xref, BindingKind.Property, null, output.name, null, null, null, securityContext));
        }
    }
    // TODO: Perhaps we could do this in a phase? (It likely wouldn't change the slot indices.)
    if (bindings.some((b) => b?.i18nMessage) !== null) {
        unit.create.push(createI18nAttributesOp(unit.job.allocateXrefId(), new SlotHandle(), op.xref));
    }
}
/**
 * Helper to ingest an individual binding on a template, either an explicit `ng-template`, or an
 * implicit template created via structural directive.
 *
 * Bindings on templates are *extremely* tricky. I have tried to isolate all of the confusing edge
 * cases into this function, and to comment it well to document the behavior.
 *
 * Some of this behavior is intuitively incorrect, and we should consider changing it in the future.
 *
 * @param view The compilation unit for the view containing the template.
 * @param xref The xref of the template op.
 * @param type The binding type, according to the parser. This is fairly reasonable, e.g. both
 *     dynamic and static attributes have e.BindingType.Attribute.
 * @param name The binding's name.
 * @param value The bindings's value, which will either be an input AST expression, or a string
 *     literal. Note that the input AST expression may or may not be const -- it will only be a
 *     string literal if the parser considered it a text binding.
 * @param unit If the binding has a unit (e.g. `px` for style bindings), then this is the unit.
 * @param securityContext The security context of the binding.
 * @param isStructuralTemplateAttribute Whether this binding actually applies to the structural
 *     ng-template. For example, an `ngFor` would actually apply to the structural template. (Most
 *     bindings on structural elements target the inner element, not the template.)
 * @param templateKind Whether this is an explicit `ng-template` or an implicit template created by
 *     a structural directive. This should never be a block template.
 * @param i18nMessage The i18n metadata for the binding, if any.
 * @param sourceSpan The source span of the binding.
 * @returns An IR binding op, or null if the binding should be skipped.
 */
function createTemplateBinding(view, xref, type, name, value, unit, securityContext, isStructuralTemplateAttribute, templateKind, i18nMessage, sourceSpan) {
    const isTextBinding = typeof value === 'string';
    // If this is a structural template, then several kinds of bindings should not result in an
    // update instruction.
    if (templateKind === TemplateKind.Structural) {
        if (!isStructuralTemplateAttribute) {
            switch (type) {
                case exports.BindingType.Property:
                case exports.BindingType.Class:
                case exports.BindingType.Style:
                    // Because this binding doesn't really target the ng-template, it must be a binding on an
                    // inner node of a structural template. We can't skip it entirely, because we still need
                    // it on the ng-template's consts (e.g. for the purposes of directive matching). However,
                    // we should not generate an update instruction for it.
                    return createExtractedAttributeOp(xref, BindingKind.Property, null, name, null, null, i18nMessage, securityContext);
                case exports.BindingType.TwoWay:
                    return createExtractedAttributeOp(xref, BindingKind.TwoWayProperty, null, name, null, null, i18nMessage, securityContext);
            }
        }
        if (!isTextBinding && (type === exports.BindingType.Attribute || type === exports.BindingType.Animation)) {
            // Again, this binding doesn't really target the ng-template; it actually targets the element
            // inside the structural template. In the case of non-text attribute or animation bindings,
            // the binding doesn't even show up on the ng-template const array, so we just skip it
            // entirely.
            return null;
        }
    }
    let bindingType = BINDING_KINDS.get(type);
    if (templateKind === TemplateKind.NgTemplate) {
        // We know we are dealing with bindings directly on an explicit ng-template.
        // Static attribute bindings should be collected into the const array as k/v pairs. Property
        // bindings should result in a `property` instruction, and `AttributeMarker.Bindings` const
        // entries.
        //
        // The difficulty is with dynamic attribute, style, and class bindings. These don't really make
        // sense on an `ng-template` and should probably be parser errors. However,
        // TemplateDefinitionBuilder generates `property` instructions for them, and so we do that as
        // well.
        //
        // Note that we do have a slight behavior difference with TemplateDefinitionBuilder: although
        // TDB emits `property` instructions for dynamic attributes, styles, and classes, only styles
        // and classes also get const collected into the `AttributeMarker.Bindings` field. Dynamic
        // attribute bindings are missing from the consts entirely. We choose to emit them into the
        // consts field anyway, to avoid creating special cases for something so arcane and nonsensical.
        if (type === exports.BindingType.Class ||
            type === exports.BindingType.Style ||
            (type === exports.BindingType.Attribute && !isTextBinding)) {
            // TODO: These cases should be parse errors.
            bindingType = BindingKind.Property;
        }
    }
    return createBindingOp(xref, bindingType, name, convertAstWithInterpolation(view.job, value, i18nMessage), unit, securityContext, isTextBinding, isStructuralTemplateAttribute, templateKind, i18nMessage, sourceSpan);
}
function makeListenerHandlerOps(unit, handler, handlerSpan) {
    handler = astOf(handler);
    const handlerOps = new Array();
    let handlerExprs = handler instanceof Chain ? handler.expressions : [handler];
    if (handlerExprs.length === 0) {
        throw new Error('Expected listener to have non-empty expression list.');
    }
    const expressions = handlerExprs.map((expr) => convertAst(expr, unit.job, handlerSpan));
    const returnExpr = expressions.pop();
    handlerOps.push(...expressions.map((e) => createStatementOp(new ExpressionStatement(e, e.sourceSpan))));
    handlerOps.push(createStatementOp(new ReturnStatement(returnExpr, returnExpr.sourceSpan)));
    return handlerOps;
}
function makeTwoWayListenerHandlerOps(unit, handler, handlerSpan) {
    handler = astOf(handler);
    const handlerOps = new Array();
    if (handler instanceof Chain) {
        if (handler.expressions.length === 1) {
            handler = handler.expressions[0];
        }
        else {
            // This is validated during parsing already, but we do it here just in case.
            throw new Error('Expected two-way listener to have a single expression.');
        }
    }
    const handlerExpr = convertAst(handler, unit.job, handlerSpan);
    const eventReference = new LexicalReadExpr('$event');
    const twoWaySetExpr = new TwoWayBindingSetExpr(handlerExpr, eventReference);
    handlerOps.push(createStatementOp(new ExpressionStatement(twoWaySetExpr)));
    handlerOps.push(createStatementOp(new ReturnStatement(eventReference)));
    return handlerOps;
}
function astOf(ast) {
    return ast instanceof ASTWithSource ? ast.ast : ast;
}
/**
 * Process all of the local references on an element-like structure in the template AST and
 * convert them to their IR representation.
 */
function ingestReferences(op, element) {
    assertIsArray(op.localRefs);
    for (const { name, value } of element.references) {
        op.localRefs.push({
            name,
            target: value,
        });
    }
}
/**
 * Assert that the given value is an array.
 */
function assertIsArray(value) {
    if (!Array.isArray(value)) {
        throw new Error(`AssertionError: expected an array`);
    }
}
/**
 * Creates an absolute `ParseSourceSpan` from the relative `ParseSpan`.
 *
 * `ParseSpan` objects are relative to the start of the expression.
 * This method converts these to full `ParseSourceSpan` objects that
 * show where the span is within the overall source file.
 *
 * @param span the relative span to convert.
 * @param baseSourceSpan a span corresponding to the base of the expression tree.
 * @returns a `ParseSourceSpan` for the given span or null if no `baseSourceSpan` was provided.
 */
function convertSourceSpan(span, baseSourceSpan) {
    if (baseSourceSpan === null) {
        return null;
    }
    const start = baseSourceSpan.start.moveBy(span.start);
    const end = baseSourceSpan.start.moveBy(span.end);
    const fullStart = baseSourceSpan.fullStart.moveBy(span.start);
    return new ParseSourceSpan(start, end, fullStart);
}
/**
 * With the directive-based control flow users were able to conditionally project content using
 * the `*` syntax. E.g. `<div *ngIf="expr" projectMe></div>` will be projected into
 * `<ng-content select="[projectMe]"/>`, because the attributes and tag name from the `div` are
 * copied to the template via the template creation instruction. With `@if` and `@for` that is
 * not the case, because the conditional is placed *around* elements, rather than *on* them.
 * The result is that content projection won't work in the same way if a user converts from
 * `*ngIf` to `@if`.
 *
 * This function aims to cover the most common case by doing the same copying when a control flow
 * node has *one and only one* root element or template node.
 *
 * This approach comes with some caveats:
 * 1. As soon as any other node is added to the root, the copying behavior won't work anymore.
 *    A diagnostic will be added to flag cases like this and to explain how to work around it.
 * 2. If `preserveWhitespaces` is enabled, it's very likely that indentation will break this
 *    workaround, because it'll include an additional text node as the first child. We can work
 *    around it here, but in a discussion it was decided not to, because the user explicitly opted
 *    into preserving the whitespace and we would have to drop it from the generated code.
 *    The diagnostic mentioned point in #1 will flag such cases to users.
 *
 * @returns Tag name to be used for the control flow template.
 */
function ingestControlFlowInsertionPoint(unit, xref, node) {
    let root = null;
    for (const child of node.children) {
        // Skip over comment nodes and @let declarations since
        // it doesn't matter where they end up in the DOM.
        if (child instanceof Comment$1 || child instanceof LetDeclaration$1) {
            continue;
        }
        // We can only infer the tag name/attributes if there's a single root node.
        if (root !== null) {
            return null;
        }
        // Root nodes can only elements or templates with a tag name (e.g. `<div *foo></div>`).
        if (child instanceof Element$1 || (child instanceof Template && child.tagName !== null)) {
            root = child;
        }
        else {
            return null;
        }
    }
    // If we've found a single root node, its tag name and attributes can be
    // copied to the surrounding template to be used for content projection.
    if (root !== null) {
        // Collect the static attributes for content projection purposes.
        for (const attr of root.attributes) {
            const securityContext = domSchema.securityContext(NG_TEMPLATE_TAG_NAME, attr.name, true);
            unit.update.push(createBindingOp(xref, BindingKind.Attribute, attr.name, literal$1(attr.value), null, securityContext, true, false, null, asMessage(attr.i18n), attr.sourceSpan));
        }
        // Also collect the inputs since they participate in content projection as well.
        // Note that TDB used to collect the outputs as well, but it wasn't passing them into
        // the template instruction. Here we just don't collect them.
        for (const attr of root.inputs) {
            if (attr.type !== exports.BindingType.Animation && attr.type !== exports.BindingType.Attribute) {
                const securityContext = domSchema.securityContext(NG_TEMPLATE_TAG_NAME, attr.name, true);
                unit.create.push(createExtractedAttributeOp(xref, BindingKind.Property, null, attr.name, null, null, null, securityContext));
            }
        }
        const tagName = root instanceof Element$1 ? root.name : root.tagName;
        // Don't pass along `ng-template` tag name since it enables directive matching.
        return tagName === NG_TEMPLATE_TAG_NAME ? null : tagName;
    }
    return null;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Whether to produce instructions that will attach the source location to each DOM node.
 *
 * !!!Important!!! at the time of writing this flag isn't exposed externally, but internal debug
 * tools enable it via a local change. Any modifications to this flag need to update the
 * internal tooling as well.
 */
let ENABLE_TEMPLATE_SOURCE_LOCATIONS = false;
/** Gets whether template source locations are enabled. */
function getTemplateSourceLocationsEnabled() {
    return ENABLE_TEMPLATE_SOURCE_LOCATIONS;
}

//  if (rf & flags) { .. }
function renderFlagCheckIfStmt(flags, statements) {
    return ifStmt(variable(RENDER_FLAGS).bitwiseAnd(literal$1(flags), null, false), statements);
}
/**
 * Translates query flags into `TQueryFlags` type in
 * packages/core/src/render3/interfaces/query.ts
 * @param query
 */
function toQueryFlags(query) {
    return ((query.descendants ? 1 /* QueryFlags.descendants */ : 0 /* QueryFlags.none */) |
        (query.static ? 2 /* QueryFlags.isStatic */ : 0 /* QueryFlags.none */) |
        (query.emitDistinctChangesOnly ? 4 /* QueryFlags.emitDistinctChangesOnly */ : 0 /* QueryFlags.none */));
}
function getQueryPredicate(query, constantPool) {
    if (Array.isArray(query.predicate)) {
        let predicate = [];
        query.predicate.forEach((selector) => {
            // Each item in predicates array may contain strings with comma-separated refs
            // (for ex. 'ref, ref1, ..., refN'), thus we extract individual refs and store them
            // as separate array entities
            const selectors = selector.split(',').map((token) => literal$1(token.trim()));
            predicate.push(...selectors);
        });
        return constantPool.getConstLiteral(literalArr(predicate), true);
    }
    else {
        // The original predicate may have been wrapped in a `forwardRef()` call.
        switch (query.predicate.forwardRef) {
            case 0 /* ForwardRefHandling.None */:
            case 2 /* ForwardRefHandling.Unwrapped */:
                return query.predicate.expression;
            case 1 /* ForwardRefHandling.Wrapped */:
                return importExpr(Identifiers.resolveForwardRef).callFn([query.predicate.expression]);
        }
    }
}
function createQueryCreateCall(query, constantPool, queryTypeFns, prependParams) {
    const parameters = [];
    if (prependParams !== undefined) {
        parameters.push(...prependParams);
    }
    if (query.isSignal) {
        parameters.push(new ReadPropExpr(variable(CONTEXT_NAME), query.propertyName));
    }
    parameters.push(getQueryPredicate(query, constantPool), literal$1(toQueryFlags(query)));
    if (query.read) {
        parameters.push(query.read);
    }
    const queryCreateFn = query.isSignal ? queryTypeFns.signalBased : queryTypeFns.nonSignal;
    return importExpr(queryCreateFn).callFn(parameters);
}
const queryAdvancePlaceholder = Symbol('queryAdvancePlaceholder');
/**
 * Collapses query advance placeholders in a list of statements.
 *
 * This allows for less generated code because multiple sibling query advance
 * statements can be collapsed into a single call with the count as argument.
 *
 * e.g.
 *
 * ```ts
 *   bla();
 *   queryAdvance();
 *   queryAdvance();
 *   bla();
 * ```
 *
 *   --> will turn into
 *
 * ```ts
 *   bla();
 *   queryAdvance(2);
 *   bla();
 * ```
 */
function collapseAdvanceStatements(statements) {
    const result = [];
    let advanceCollapseCount = 0;
    const flushAdvanceCount = () => {
        if (advanceCollapseCount > 0) {
            result.unshift(importExpr(Identifiers.queryAdvance)
                .callFn(advanceCollapseCount === 1 ? [] : [literal$1(advanceCollapseCount)])
                .toStmt());
            advanceCollapseCount = 0;
        }
    };
    // Iterate through statements in reverse and collapse advance placeholders.
    for (let i = statements.length - 1; i >= 0; i--) {
        const st = statements[i];
        if (st === queryAdvancePlaceholder) {
            advanceCollapseCount++;
        }
        else {
            flushAdvanceCount();
            result.unshift(st);
        }
    }
    flushAdvanceCount();
    return result;
}
// Define and update any view queries
function createViewQueriesFunction(viewQueries, constantPool, name) {
    const createStatements = [];
    const updateStatements = [];
    const tempAllocator = temporaryAllocator((st) => updateStatements.push(st), TEMPORARY_NAME);
    viewQueries.forEach((query) => {
        // creation call, e.g. r3.viewQuery(somePredicate, true) or
        //                r3.viewQuerySignal(ctx.prop, somePredicate, true);
        const queryDefinitionCall = createQueryCreateCall(query, constantPool, {
            signalBased: Identifiers.viewQuerySignal,
            nonSignal: Identifiers.viewQuery,
        });
        createStatements.push(queryDefinitionCall.toStmt());
        // Signal queries update lazily and we just advance the index.
        if (query.isSignal) {
            updateStatements.push(queryAdvancePlaceholder);
            return;
        }
        // update, e.g. (r3.queryRefresh(tmp = r3.loadQuery()) && (ctx.someDir = tmp));
        const temporary = tempAllocator();
        const getQueryList = importExpr(Identifiers.loadQuery).callFn([]);
        const refresh = importExpr(Identifiers.queryRefresh).callFn([temporary.set(getQueryList)]);
        const updateDirective = variable(CONTEXT_NAME)
            .prop(query.propertyName)
            .set(query.first ? temporary.prop('first') : temporary);
        updateStatements.push(refresh.and(updateDirective).toStmt());
    });
    const viewQueryFnName = name ? `${name}_Query` : null;
    return fn([new FnParam(RENDER_FLAGS, NUMBER_TYPE), new FnParam(CONTEXT_NAME, null)], [
        renderFlagCheckIfStmt(1 /* core.RenderFlags.Create */, createStatements),
        renderFlagCheckIfStmt(2 /* core.RenderFlags.Update */, collapseAdvanceStatements(updateStatements)),
    ], INFERRED_TYPE, null, viewQueryFnName);
}
// Define and update any content queries
function createContentQueriesFunction(queries, constantPool, name) {
    const createStatements = [];
    const updateStatements = [];
    const tempAllocator = temporaryAllocator((st) => updateStatements.push(st), TEMPORARY_NAME);
    for (const query of queries) {
        // creation, e.g. r3.contentQuery(dirIndex, somePredicate, true, null) or
        //                r3.contentQuerySignal(dirIndex, propName, somePredicate, <flags>, <read>).
        createStatements.push(createQueryCreateCall(query, constantPool, { nonSignal: Identifiers.contentQuery, signalBased: Identifiers.contentQuerySignal }, 
        /* prependParams */ [variable('dirIndex')]).toStmt());
        // Signal queries update lazily and we just advance the index.
        if (query.isSignal) {
            updateStatements.push(queryAdvancePlaceholder);
            continue;
        }
        // update, e.g. (r3.queryRefresh(tmp = r3.loadQuery()) && (ctx.someDir = tmp));
        const temporary = tempAllocator();
        const getQueryList = importExpr(Identifiers.loadQuery).callFn([]);
        const refresh = importExpr(Identifiers.queryRefresh).callFn([temporary.set(getQueryList)]);
        const updateDirective = variable(CONTEXT_NAME)
            .prop(query.propertyName)
            .set(query.first ? temporary.prop('first') : temporary);
        updateStatements.push(refresh.and(updateDirective).toStmt());
    }
    const contentQueriesFnName = name ? `${name}_ContentQueries` : null;
    return fn([
        new FnParam(RENDER_FLAGS, NUMBER_TYPE),
        new FnParam(CONTEXT_NAME, null),
        new FnParam('dirIndex', null),
    ], [
        renderFlagCheckIfStmt(1 /* core.RenderFlags.Create */, createStatements),
        renderFlagCheckIfStmt(2 /* core.RenderFlags.Update */, collapseAdvanceStatements(updateStatements)),
    ], INFERRED_TYPE, null, contentQueriesFnName);
}

class HtmlParser extends Parser$1 {
    constructor() {
        super(getHtmlTagDefinition);
    }
    parse(source, url, options) {
        return super.parse(source, url, options);
    }
}

const PROPERTY_PARTS_SEPARATOR = '.';
const ATTRIBUTE_PREFIX = 'attr';
const CLASS_PREFIX = 'class';
const STYLE_PREFIX = 'style';
const TEMPLATE_ATTR_PREFIX$1 = '*';
const ANIMATE_PROP_PREFIX = 'animate-';
/**
 * Parses bindings in templates and in the directive host area.
 */
class BindingParser {
    _exprParser;
    _interpolationConfig;
    _schemaRegistry;
    errors;
    constructor(_exprParser, _interpolationConfig, _schemaRegistry, errors) {
        this._exprParser = _exprParser;
        this._interpolationConfig = _interpolationConfig;
        this._schemaRegistry = _schemaRegistry;
        this.errors = errors;
    }
    get interpolationConfig() {
        return this._interpolationConfig;
    }
    createBoundHostProperties(properties, sourceSpan) {
        const boundProps = [];
        for (const propName of Object.keys(properties)) {
            const expression = properties[propName];
            if (typeof expression === 'string') {
                this.parsePropertyBinding(propName, expression, true, false, sourceSpan, sourceSpan.start.offset, undefined, [], 
                // Use the `sourceSpan` for  `keySpan`. This isn't really accurate, but neither is the
                // sourceSpan, as it represents the sourceSpan of the host itself rather than the
                // source of the host binding (which doesn't exist in the template). Regardless,
                // neither of these values are used in Ivy but are only here to satisfy the function
                // signature. This should likely be refactored in the future so that `sourceSpan`
                // isn't being used inaccurately.
                boundProps, sourceSpan);
            }
            else {
                this._reportError(`Value of the host property binding "${propName}" needs to be a string representing an expression but got "${expression}" (${typeof expression})`, sourceSpan);
            }
        }
        return boundProps;
    }
    createDirectiveHostEventAsts(hostListeners, sourceSpan) {
        const targetEvents = [];
        for (const propName of Object.keys(hostListeners)) {
            const expression = hostListeners[propName];
            if (typeof expression === 'string') {
                // Use the `sourceSpan` for  `keySpan` and `handlerSpan`. This isn't really accurate, but
                // neither is the `sourceSpan`, as it represents the `sourceSpan` of the host itself
                // rather than the source of the host binding (which doesn't exist in the template).
                // Regardless, neither of these values are used in Ivy but are only here to satisfy the
                // function signature. This should likely be refactored in the future so that `sourceSpan`
                // isn't being used inaccurately.
                this.parseEvent(propName, expression, 
                /* isAssignmentEvent */ false, sourceSpan, sourceSpan, [], targetEvents, sourceSpan);
            }
            else {
                this._reportError(`Value of the host listener "${propName}" needs to be a string representing an expression but got "${expression}" (${typeof expression})`, sourceSpan);
            }
        }
        return targetEvents;
    }
    parseInterpolation(value, sourceSpan, interpolatedTokens) {
        const sourceInfo = sourceSpan.start.toString();
        const absoluteOffset = sourceSpan.fullStart.offset;
        try {
            const ast = this._exprParser.parseInterpolation(value, sourceInfo, absoluteOffset, interpolatedTokens, this._interpolationConfig);
            if (ast)
                this._reportExpressionParserErrors(ast.errors, sourceSpan);
            return ast;
        }
        catch (e) {
            this._reportError(`${e}`, sourceSpan);
            return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset);
        }
    }
    /**
     * Similar to `parseInterpolation`, but treats the provided string as a single expression
     * element that would normally appear within the interpolation prefix and suffix (`{{` and `}}`).
     * This is used for parsing the switch expression in ICUs.
     */
    parseInterpolationExpression(expression, sourceSpan) {
        const sourceInfo = sourceSpan.start.toString();
        const absoluteOffset = sourceSpan.start.offset;
        try {
            const ast = this._exprParser.parseInterpolationExpression(expression, sourceInfo, absoluteOffset);
            if (ast)
                this._reportExpressionParserErrors(ast.errors, sourceSpan);
            return ast;
        }
        catch (e) {
            this._reportError(`${e}`, sourceSpan);
            return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset);
        }
    }
    /**
     * Parses the bindings in a microsyntax expression, and converts them to
     * `ParsedProperty` or `ParsedVariable`.
     *
     * @param tplKey template binding name
     * @param tplValue template binding value
     * @param sourceSpan span of template binding relative to entire the template
     * @param absoluteValueOffset start of the tplValue relative to the entire template
     * @param targetMatchableAttrs potential attributes to match in the template
     * @param targetProps target property bindings in the template
     * @param targetVars target variables in the template
     */
    parseInlineTemplateBinding(tplKey, tplValue, sourceSpan, absoluteValueOffset, targetMatchableAttrs, targetProps, targetVars, isIvyAst) {
        const absoluteKeyOffset = sourceSpan.start.offset + TEMPLATE_ATTR_PREFIX$1.length;
        const bindings = this._parseTemplateBindings(tplKey, tplValue, sourceSpan, absoluteKeyOffset, absoluteValueOffset);
        for (const binding of bindings) {
            // sourceSpan is for the entire HTML attribute. bindingSpan is for a particular
            // binding within the microsyntax expression so it's more narrow than sourceSpan.
            const bindingSpan = moveParseSourceSpan(sourceSpan, binding.sourceSpan);
            const key = binding.key.source;
            const keySpan = moveParseSourceSpan(sourceSpan, binding.key.span);
            if (binding instanceof VariableBinding) {
                const value = binding.value ? binding.value.source : '$implicit';
                const valueSpan = binding.value
                    ? moveParseSourceSpan(sourceSpan, binding.value.span)
                    : undefined;
                targetVars.push(new ParsedVariable(key, value, bindingSpan, keySpan, valueSpan));
            }
            else if (binding.value) {
                const srcSpan = isIvyAst ? bindingSpan : sourceSpan;
                const valueSpan = moveParseSourceSpan(sourceSpan, binding.value.ast.sourceSpan);
                this._parsePropertyAst(key, binding.value, false, srcSpan, keySpan, valueSpan, targetMatchableAttrs, targetProps);
            }
            else {
                targetMatchableAttrs.push([key, '' /* value */]);
                // Since this is a literal attribute with no RHS, source span should be
                // just the key span.
                this.parseLiteralAttr(key, null /* value */, keySpan, absoluteValueOffset, undefined /* valueSpan */, targetMatchableAttrs, targetProps, keySpan);
            }
        }
    }
    /**
     * Parses the bindings in a microsyntax expression, e.g.
     * ```html
     *    <tag *tplKey="let value1 = prop; let value2 = localVar">
     * ```
     *
     * @param tplKey template binding name
     * @param tplValue template binding value
     * @param sourceSpan span of template binding relative to entire the template
     * @param absoluteKeyOffset start of the `tplKey`
     * @param absoluteValueOffset start of the `tplValue`
     */
    _parseTemplateBindings(tplKey, tplValue, sourceSpan, absoluteKeyOffset, absoluteValueOffset) {
        const sourceInfo = sourceSpan.start.toString();
        try {
            const bindingsResult = this._exprParser.parseTemplateBindings(tplKey, tplValue, sourceInfo, absoluteKeyOffset, absoluteValueOffset);
            this._reportExpressionParserErrors(bindingsResult.errors, sourceSpan);
            bindingsResult.warnings.forEach((warning) => {
                this._reportError(warning, sourceSpan, ParseErrorLevel.WARNING);
            });
            return bindingsResult.templateBindings;
        }
        catch (e) {
            this._reportError(`${e}`, sourceSpan);
            return [];
        }
    }
    parseLiteralAttr(name, value, sourceSpan, absoluteOffset, valueSpan, targetMatchableAttrs, targetProps, keySpan) {
        if (isAnimationLabel(name)) {
            name = name.substring(1);
            if (keySpan !== undefined) {
                keySpan = moveParseSourceSpan(keySpan, new AbsoluteSourceSpan(keySpan.start.offset + 1, keySpan.end.offset));
            }
            if (value) {
                this._reportError(`Assigning animation triggers via @prop="exp" attributes with an expression is invalid.` +
                    ` Use property bindings (e.g. [@prop]="exp") or use an attribute without a value (e.g. @prop) instead.`, sourceSpan, ParseErrorLevel.ERROR);
            }
            this._parseAnimation(name, value, sourceSpan, absoluteOffset, keySpan, valueSpan, targetMatchableAttrs, targetProps);
        }
        else {
            targetProps.push(new ParsedProperty(name, this._exprParser.wrapLiteralPrimitive(value, '', absoluteOffset), ParsedPropertyType.LITERAL_ATTR, sourceSpan, keySpan, valueSpan));
        }
    }
    parsePropertyBinding(name, expression, isHost, isPartOfAssignmentBinding, sourceSpan, absoluteOffset, valueSpan, targetMatchableAttrs, targetProps, keySpan) {
        if (name.length === 0) {
            this._reportError(`Property name is missing in binding`, sourceSpan);
        }
        let isAnimationProp = false;
        if (name.startsWith(ANIMATE_PROP_PREFIX)) {
            isAnimationProp = true;
            name = name.substring(ANIMATE_PROP_PREFIX.length);
            if (keySpan !== undefined) {
                keySpan = moveParseSourceSpan(keySpan, new AbsoluteSourceSpan(keySpan.start.offset + ANIMATE_PROP_PREFIX.length, keySpan.end.offset));
            }
        }
        else if (isAnimationLabel(name)) {
            isAnimationProp = true;
            name = name.substring(1);
            if (keySpan !== undefined) {
                keySpan = moveParseSourceSpan(keySpan, new AbsoluteSourceSpan(keySpan.start.offset + 1, keySpan.end.offset));
            }
        }
        if (isAnimationProp) {
            this._parseAnimation(name, expression, sourceSpan, absoluteOffset, keySpan, valueSpan, targetMatchableAttrs, targetProps);
        }
        else {
            this._parsePropertyAst(name, this.parseBinding(expression, isHost, valueSpan || sourceSpan, absoluteOffset), isPartOfAssignmentBinding, sourceSpan, keySpan, valueSpan, targetMatchableAttrs, targetProps);
        }
    }
    parsePropertyInterpolation(name, value, sourceSpan, valueSpan, targetMatchableAttrs, targetProps, keySpan, interpolatedTokens) {
        const expr = this.parseInterpolation(value, valueSpan || sourceSpan, interpolatedTokens);
        if (expr) {
            this._parsePropertyAst(name, expr, false, sourceSpan, keySpan, valueSpan, targetMatchableAttrs, targetProps);
            return true;
        }
        return false;
    }
    _parsePropertyAst(name, ast, isPartOfAssignmentBinding, sourceSpan, keySpan, valueSpan, targetMatchableAttrs, targetProps) {
        targetMatchableAttrs.push([name, ast.source]);
        targetProps.push(new ParsedProperty(name, ast, isPartOfAssignmentBinding ? ParsedPropertyType.TWO_WAY : ParsedPropertyType.DEFAULT, sourceSpan, keySpan, valueSpan));
    }
    _parseAnimation(name, expression, sourceSpan, absoluteOffset, keySpan, valueSpan, targetMatchableAttrs, targetProps) {
        if (name.length === 0) {
            this._reportError('Animation trigger is missing', sourceSpan);
        }
        // This will occur when a @trigger is not paired with an expression.
        // For animations it is valid to not have an expression since */void
        // states will be applied by angular when the element is attached/detached
        const ast = this.parseBinding(expression || 'undefined', false, valueSpan || sourceSpan, absoluteOffset);
        targetMatchableAttrs.push([name, ast.source]);
        targetProps.push(new ParsedProperty(name, ast, ParsedPropertyType.ANIMATION, sourceSpan, keySpan, valueSpan));
    }
    parseBinding(value, isHostBinding, sourceSpan, absoluteOffset) {
        const sourceInfo = ((sourceSpan && sourceSpan.start) || '(unknown)').toString();
        try {
            const ast = isHostBinding
                ? this._exprParser.parseSimpleBinding(value, sourceInfo, absoluteOffset, this._interpolationConfig)
                : this._exprParser.parseBinding(value, sourceInfo, absoluteOffset, this._interpolationConfig);
            if (ast)
                this._reportExpressionParserErrors(ast.errors, sourceSpan);
            return ast;
        }
        catch (e) {
            this._reportError(`${e}`, sourceSpan);
            return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset);
        }
    }
    createBoundElementProperty(elementSelector, boundProp, skipValidation = false, mapPropertyName = true) {
        if (boundProp.isAnimation) {
            return new BoundElementProperty(boundProp.name, exports.BindingType.Animation, SecurityContext.NONE, boundProp.expression, null, boundProp.sourceSpan, boundProp.keySpan, boundProp.valueSpan);
        }
        let unit = null;
        let bindingType = undefined;
        let boundPropertyName = null;
        const parts = boundProp.name.split(PROPERTY_PARTS_SEPARATOR);
        let securityContexts = undefined;
        // Check for special cases (prefix style, attr, class)
        if (parts.length > 1) {
            if (parts[0] == ATTRIBUTE_PREFIX) {
                boundPropertyName = parts.slice(1).join(PROPERTY_PARTS_SEPARATOR);
                if (!skipValidation) {
                    this._validatePropertyOrAttributeName(boundPropertyName, boundProp.sourceSpan, true);
                }
                securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, boundPropertyName, true);
                const nsSeparatorIdx = boundPropertyName.indexOf(':');
                if (nsSeparatorIdx > -1) {
                    const ns = boundPropertyName.substring(0, nsSeparatorIdx);
                       const name = boundPropertyName.substring(nsSeparatorIdx + 1);
                    boundPropertyName = mergeNsAndName(ns, name);
                }
                bindingType = exports.BindingType.Attribute;
            }
            else if (parts[0] == CLASS_PREFIX) {
                boundPropertyName = parts[1];
                bindingType = exports.BindingType.Class;
                securityContexts = [SecurityContext.NONE];
            }
            else if (parts[0] == STYLE_PREFIX) {
                unit = parts.length > 2 ? parts[2] : null;
                boundPropertyName = parts[1];
                bindingType = exports.BindingType.Style;
                securityContexts = [SecurityContext.STYLE];
            }
        }
        // If not a special case, use the full property name
        if (boundPropertyName === null) {
            const mappedPropName = this._schemaRegistry.getMappedPropName(boundProp.name);
            boundPropertyName = mapPropertyName ? mappedPropName : boundProp.name;
            securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, mappedPropName, false);
            bindingType =
                boundProp.type === ParsedPropertyType.TWO_WAY ? exports.BindingType.TwoWay : exports.BindingType.Property;
            if (!skipValidation) {
                this._validatePropertyOrAttributeName(mappedPropName, boundProp.sourceSpan, false);
            }
        }
        return new BoundElementProperty(boundPropertyName, bindingType, securityContexts[0], boundProp.expression, unit, boundProp.sourceSpan, boundProp.keySpan, boundProp.valueSpan);
    }
    // TODO: keySpan should be required but was made optional to avoid changing VE parser.
    parseEvent(name, expression, isAssignmentEvent, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents, keySpan) {
        if (name.length === 0) {
            this._reportError(`Event name is missing in binding`, sourceSpan);
        }
        if (isAnimationLabel(name)) {
            name = name.slice(1);
            if (keySpan !== undefined) {
                keySpan = moveParseSourceSpan(keySpan, new AbsoluteSourceSpan(keySpan.start.offset + 1, keySpan.end.offset));
            }
            this._parseAnimationEvent(name, expression, sourceSpan, handlerSpan, targetEvents, keySpan);
        }
        else {
            this._parseRegularEvent(name, expression, isAssignmentEvent, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents, keySpan);
        }
    }
    calcPossibleSecurityContexts(selector, propName, isAttribute) {
        const prop = this._schemaRegistry.getMappedPropName(propName);
        return calcPossibleSecurityContexts(this._schemaRegistry, selector, prop, isAttribute);
    }
    _parseAnimationEvent(name, expression, sourceSpan, handlerSpan, targetEvents, keySpan) {
        const matches = splitAtPeriod(name, [name, '']);
        const eventName = matches[0];
        const phase = matches[1].toLowerCase();
        const ast = this._parseAction(expression, handlerSpan);
        targetEvents.push(new ParsedEvent(eventName, phase, exports.ParsedEventType.Animation, ast, sourceSpan, handlerSpan, keySpan));
        if (eventName.length === 0) {
            this._reportError(`Animation event name is missing in binding`, sourceSpan);
        }
        if (phase) {
            if (phase !== 'start' && phase !== 'done') {
                this._reportError(`The provided animation output phase value "${phase}" for "@${eventName}" is not supported (use start or done)`, sourceSpan);
            }
        }
        else {
            this._reportError(`The animation trigger output event (@${eventName}) is missing its phase value name (start or done are currently supported)`, sourceSpan);
        }
    }
    _parseRegularEvent(name, expression, isAssignmentEvent, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents, keySpan) {
        // long format: 'target: eventName'
        const [target, eventName] = splitAtColon(name, [null, name]);
        const prevErrorCount = this.errors.length;
        const ast = this._parseAction(expression, handlerSpan);
        const isValid = this.errors.length === prevErrorCount;
        targetMatchableAttrs.push([name, ast.source]);
        // Don't try to validate assignment events if there were other
        // parsing errors to avoid adding more noise to the error logs.
        if (isAssignmentEvent && isValid && !this._isAllowedAssignmentEvent(ast)) {
            this._reportError('Unsupported expression in a two-way binding', sourceSpan);
        }
        targetEvents.push(new ParsedEvent(eventName, target, isAssignmentEvent ? exports.ParsedEventType.TwoWay : exports.ParsedEventType.Regular, ast, sourceSpan, handlerSpan, keySpan));
        // Don't detect directives for event names for now,
        // so don't add the event name to the matchableAttrs
    }
    _parseAction(value, sourceSpan) {
        const sourceInfo = ((sourceSpan && sourceSpan.start) || '(unknown').toString();
        const absoluteOffset = sourceSpan && sourceSpan.start ? sourceSpan.start.offset : 0;
        try {
            const ast = this._exprParser.parseAction(value, sourceInfo, absoluteOffset, this._interpolationConfig);
            if (ast) {
                this._reportExpressionParserErrors(ast.errors, sourceSpan);
            }
            if (!ast || ast.ast instanceof EmptyExpr$1) {
                this._reportError(`Empty expressions are not allowed`, sourceSpan);
                return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset);
            }
            return ast;
        }
        catch (e) {
            this._reportError(`${e}`, sourceSpan);
            return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset);
        }
    }
    _reportError(message, sourceSpan, level = ParseErrorLevel.ERROR, relatedError) {
        this.errors.push(new ParseError(sourceSpan, message, level, relatedError));
    }
    _reportExpressionParserErrors(errors, sourceSpan) {
        for (const error of errors) {
            this._reportError(error.message, sourceSpan, undefined, error);
        }
    }
    /**
     * @param propName the name of the property / attribute
     * @param sourceSpan
     * @param isAttr true when binding to an attribute
     */
    _validatePropertyOrAttributeName(propName, sourceSpan, isAttr) {
        const report = isAttr
            ? this._schemaRegistry.validateAttribute(propName)
            : this._schemaRegistry.validateProperty(propName);
        if (report.error) {
            this._reportError(report.msg, sourceSpan, ParseErrorLevel.ERROR);
        }
    }
    /**
     * Returns whether a parsed AST is allowed to be used within the event side of a two-way binding.
     * @param ast Parsed AST to be checked.
     */
    _isAllowedAssignmentEvent(ast) {
        if (ast instanceof ASTWithSource) {
            return this._isAllowedAssignmentEvent(ast.ast);
        }
        if (ast instanceof NonNullAssert) {
            return this._isAllowedAssignmentEvent(ast.expression);
        }
        if (ast instanceof Call &&
            ast.args.length === 1 &&
            ast.receiver instanceof PropertyRead &&
            ast.receiver.name === '$any' &&
            ast.receiver.receiver instanceof ImplicitReceiver &&
            !(ast.receiver.receiver instanceof ThisReceiver)) {
            return this._isAllowedAssignmentEvent(ast.args[0]);
        }
        if (ast instanceof PropertyRead || ast instanceof KeyedRead) {
            return true;
        }
        return false;
    }
}
function isAnimationLabel(name) {
    return name[0] == '@';
}
function calcPossibleSecurityContexts(registry, selector, propName, isAttribute) {
    const ctxs = [];
    CssSelector.parse(selector).forEach((selector) => {
        const elementNames = selector.element ? [selector.element] : registry.allKnownElementNames();
        const notElementNames = new Set(selector.notSelectors
            .filter((selector) => selector.isElementSelector())
            .map((selector) => selector.element));
        const possibleElementNames = elementNames.filter((elementName) => !notElementNames.has(elementName));
        ctxs.push(...possibleElementNames.map((elementName) => registry.securityContext(elementName, propName, isAttribute)));
    });
    return ctxs.length === 0 ? [SecurityContext.NONE] : Array.from(new Set(ctxs)).sort();
}
/**
 * Compute a new ParseSourceSpan based off an original `sourceSpan` by using
 * absolute offsets from the specified `absoluteSpan`.
 *
 * @param sourceSpan original source span
 * @param absoluteSpan absolute source span to move to
 */
function moveParseSourceSpan(sourceSpan, absoluteSpan) {
    // The difference of two absolute offsets provide the relative offset
    const startDiff = absoluteSpan.start - sourceSpan.start.offset;
    const endDiff = absoluteSpan.end - sourceSpan.end.offset;
    return new ParseSourceSpan(sourceSpan.start.moveBy(startDiff), sourceSpan.end.moveBy(endDiff), sourceSpan.fullStart.moveBy(startDiff), sourceSpan.details);
}

// Some of the code comes from WebComponents.JS
// https://github.com/webcomponents/webcomponentsjs/blob/master/src/HTMLImports/path.js
function isStyleUrlResolvable(url) {
    if (url == null || url.length === 0 || url[0] == '/')
        return false;
    const schemeMatch = url.match(URL_WITH_SCHEMA_REGEXP);
    return schemeMatch === null || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';
}
const URL_WITH_SCHEMA_REGEXP = /^([^:/?#]+):/;

const NG_CONTENT_SELECT_ATTR = 'select';
const LINK_ELEMENT = 'link';
const LINK_STYLE_REL_ATTR = 'rel';
const LINK_STYLE_HREF_ATTR = 'href';
const LINK_STYLE_REL_VALUE = 'stylesheet';
const STYLE_ELEMENT = 'style';
const SCRIPT_ELEMENT = 'script';
const NG_NON_BINDABLE_ATTR = 'ngNonBindable';
const NG_PROJECT_AS = 'ngProjectAs';
function preparseElement(ast) {
    let selectAttr = null;
    let hrefAttr = null;
    let relAttr = null;
    let nonBindable = false;
    let projectAs = '';
    ast.attrs.forEach((attr) => {
        const lcAttrName = attr.name.toLowerCase();
        if (lcAttrName == NG_CONTENT_SELECT_ATTR) {
            selectAttr = attr.value;
        }
        else if (lcAttrName == LINK_STYLE_HREF_ATTR) {
            hrefAttr = attr.value;
        }
        else if (lcAttrName == LINK_STYLE_REL_ATTR) {
            relAttr = attr.value;
        }
        else if (attr.name == NG_NON_BINDABLE_ATTR) {
            nonBindable = true;
        }
        else if (attr.name == NG_PROJECT_AS) {
            if (attr.value.length > 0) {
                projectAs = attr.value;
            }
        }
    });
    selectAttr = normalizeNgContentSelect(selectAttr);
    const nodeName = ast.name.toLowerCase();
    let type = PreparsedElementType.OTHER;
    if (isNgContent(nodeName)) {
        type = PreparsedElementType.NG_CONTENT;
    }
    else if (nodeName == STYLE_ELEMENT) {
        type = PreparsedElementType.STYLE;
    }
    else if (nodeName == SCRIPT_ELEMENT) {
        type = PreparsedElementType.SCRIPT;
    }
    else if (nodeName == LINK_ELEMENT && relAttr == LINK_STYLE_REL_VALUE) {
        type = PreparsedElementType.STYLESHEET;
    }
    return new PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs);
}
var PreparsedElementType;
(function (PreparsedElementType) {
    PreparsedElementType[PreparsedElementType["NG_CONTENT"] = 0] = "NG_CONTENT";
    PreparsedElementType[PreparsedElementType["STYLE"] = 1] = "STYLE";
    PreparsedElementType[PreparsedElementType["STYLESHEET"] = 2] = "STYLESHEET";
    PreparsedElementType[PreparsedElementType["SCRIPT"] = 3] = "SCRIPT";
    PreparsedElementType[PreparsedElementType["OTHER"] = 4] = "OTHER";
})(PreparsedElementType || (PreparsedElementType = {}));
class PreparsedElement {
    type;
    selectAttr;
    hrefAttr;
    nonBindable;
    projectAs;
    constructor(type, selectAttr, hrefAttr, nonBindable, projectAs) {
        this.type = type;
        this.selectAttr = selectAttr;
        this.hrefAttr = hrefAttr;
        this.nonBindable = nonBindable;
        this.projectAs = projectAs;
    }
}
function normalizeNgContentSelect(selectAttr) {
    if (selectAttr === null || selectAttr.length === 0) {
        return '*';
    }
    return selectAttr;
}

/** Pattern for the expression in a for loop block. */
const FOR_LOOP_EXPRESSION_PATTERN = /^\s*([0-9A-Za-z_$]*)\s+of\s+([\S\s]*)/;
/** Pattern for the tracking expression in a for loop block. */
const FOR_LOOP_TRACK_PATTERN = /^track\s+([\S\s]*)/;
/** Pattern for the `as` expression in a conditional block. */
const CONDITIONAL_ALIAS_PATTERN = /^(as\s+)(.*)/;
/** Pattern used to identify an `else if` block. */
const ELSE_IF_PATTERN = /^else[^\S\r\n]+if/;
/** Pattern used to identify a `let` parameter. */
const FOR_LOOP_LET_PATTERN = /^let\s+([\S\s]*)/;
/** Pattern used to validate a JavaScript identifier. */
const IDENTIFIER_PATTERN = /^[$A-Z_][0-9A-Z_$]*$/i;
/**
 * Pattern to group a string into leading whitespace, non whitespace, and trailing whitespace.
 * Useful for getting the variable name span when a span can contain leading and trailing space.
 */
const CHARACTERS_IN_SURROUNDING_WHITESPACE_PATTERN = /(\s*)(\S+)(\s*)/;
/** Names of variables that are allowed to be used in the `let` expression of a `for` loop. */
const ALLOWED_FOR_LOOP_LET_VARIABLES = new Set([
    '$index',
    '$first',
    '$last',
    '$even',
    '$odd',
    '$count',
]);
/**
 * Predicate function that determines if a block with
 * a specific name cam be connected to a `for` block.
 */
function isConnectedForLoopBlock(name) {
    return name === 'empty';
}
/**
 * Predicate function that determines if a block with
 * a specific name cam be connected to an `if` block.
 */
function isConnectedIfLoopBlock(name) {
    return name === 'else' || ELSE_IF_PATTERN.test(name);
}
/** Creates an `if` loop block from an HTML AST node. */
function createIfBlock(ast, connectedBlocks, visitor, bindingParser) {
    const errors = validateIfConnectedBlocks(connectedBlocks);
    const branches = [];
    const mainBlockParams = parseConditionalBlockParameters(ast, errors, bindingParser);
    if (mainBlockParams !== null) {
        branches.push(new IfBlockBranch(mainBlockParams.expression, visitAll(visitor, ast.children, ast.children), mainBlockParams.expressionAlias, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.nameSpan, ast.i18n));
    }
    for (const block of connectedBlocks) {
        if (ELSE_IF_PATTERN.test(block.name)) {
            const params = parseConditionalBlockParameters(block, errors, bindingParser);
            if (params !== null) {
                const children = visitAll(visitor, block.children, block.children);
                branches.push(new IfBlockBranch(params.expression, children, params.expressionAlias, block.sourceSpan, block.startSourceSpan, block.endSourceSpan, block.nameSpan, block.i18n));
            }
        }
        else if (block.name === 'else') {
            const children = visitAll(visitor, block.children, block.children);
            branches.push(new IfBlockBranch(null, children, null, block.sourceSpan, block.startSourceSpan, block.endSourceSpan, block.nameSpan, block.i18n));
        }
    }
    // The outer IfBlock should have a span that encapsulates all branches.
    const ifBlockStartSourceSpan = branches.length > 0 ? branches[0].startSourceSpan : ast.startSourceSpan;
    const ifBlockEndSourceSpan = branches.length > 0 ? branches[branches.length - 1].endSourceSpan : ast.endSourceSpan;
    let wholeSourceSpan = ast.sourceSpan;
    const lastBranch = branches[branches.length - 1];
    if (lastBranch !== undefined) {
        wholeSourceSpan = new ParseSourceSpan(ifBlockStartSourceSpan.start, lastBranch.sourceSpan.end);
    }
    return {
        node: new IfBlock(branches, wholeSourceSpan, ast.startSourceSpan, ifBlockEndSourceSpan, ast.nameSpan),
        errors,
    };
}
/** Creates a `for` loop block from an HTML AST node. */
function createForLoop(ast, connectedBlocks, visitor, bindingParser) {
    const errors = [];
    const params = parseForLoopParameters(ast, errors, bindingParser);
    let node = null;
    let empty = null;
    for (const block of connectedBlocks) {
        if (block.name === 'empty') {
            if (empty !== null) {
                errors.push(new ParseError(block.sourceSpan, '@for loop can only have one @empty block'));
            }
            else if (block.parameters.length > 0) {
                errors.push(new ParseError(block.sourceSpan, '@empty block cannot have parameters'));
            }
            else {
                empty = new ForLoopBlockEmpty(visitAll(visitor, block.children, block.children), block.sourceSpan, block.startSourceSpan, block.endSourceSpan, block.nameSpan, block.i18n);
            }
        }
        else {
            errors.push(new ParseError(block.sourceSpan, `Unrecognized @for loop block "${block.name}"`));
        }
    }
    if (params !== null) {
        if (params.trackBy === null) {
            // TODO: We should not fail here, and instead try to produce some AST for the language
            // service.
            errors.push(new ParseError(ast.startSourceSpan, '@for loop must have a "track" expression'));
        }
        else {
            // The `for` block has a main span that includes the `empty` branch. For only the span of the
            // main `for` body, use `mainSourceSpan`.
            const endSpan = empty?.endSourceSpan ?? ast.endSourceSpan;
            const sourceSpan = new ParseSourceSpan(ast.sourceSpan.start, endSpan?.end ?? ast.sourceSpan.end);
            node = new ForLoopBlock(params.itemName, params.expression, params.trackBy.expression, params.trackBy.keywordSpan, params.context, visitAll(visitor, ast.children, ast.children), empty, sourceSpan, ast.sourceSpan, ast.startSourceSpan, endSpan, ast.nameSpan, ast.i18n);
        }
    }
    return { node, errors };
}
/** Creates a switch block from an HTML AST node. */
function createSwitchBlock(ast, visitor, bindingParser) {
    const errors = validateSwitchBlock(ast);
    const primaryExpression = ast.parameters.length > 0
        ? parseBlockParameterToBinding(ast.parameters[0], bindingParser)
        : bindingParser.parseBinding('', false, ast.sourceSpan, 0);
    const cases = [];
    const unknownBlocks = [];
    let defaultCase = null;
    // Here we assume that all the blocks are valid given that we validated them above.
    for (const node of ast.children) {
        if (!(node instanceof Block)) {
            continue;
        }
        if ((node.name !== 'case' || node.parameters.length === 0) && node.name !== 'default') {
            unknownBlocks.push(new UnknownBlock(node.name, node.sourceSpan, node.nameSpan));
            continue;
        }
        const expression = node.name === 'case' ? parseBlockParameterToBinding(node.parameters[0], bindingParser) : null;
        const ast = new SwitchBlockCase(expression, visitAll(visitor, node.children, node.children), node.sourceSpan, node.startSourceSpan, node.endSourceSpan, node.nameSpan, node.i18n);
        if (expression === null) {
            defaultCase = ast;
        }
        else {
            cases.push(ast);
        }
    }
    // Ensure that the default case is last in the array.
    if (defaultCase !== null) {
        cases.push(defaultCase);
    }
    return {
        node: new SwitchBlock(primaryExpression, cases, unknownBlocks, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.nameSpan),
        errors,
    };
}
/** Parses the parameters of a `for` loop block. */
function parseForLoopParameters(block, errors, bindingParser) {
    if (block.parameters.length === 0) {
        errors.push(new ParseError(block.startSourceSpan, '@for loop does not have an expression'));
        return null;
    }
    const [expressionParam, ...secondaryParams] = block.parameters;
    const match = stripOptionalParentheses(expressionParam, errors)?.match(FOR_LOOP_EXPRESSION_PATTERN);
    if (!match || match[2].trim().length === 0) {
        errors.push(new ParseError(expressionParam.sourceSpan, 'Cannot parse expression. @for loop expression must match the pattern "<identifier> of <expression>"'));
        return null;
    }
    const [, itemName, rawExpression] = match;
    if (ALLOWED_FOR_LOOP_LET_VARIABLES.has(itemName)) {
        errors.push(new ParseError(expressionParam.sourceSpan, `@for loop item name cannot be one of ${Array.from(ALLOWED_FOR_LOOP_LET_VARIABLES).join(', ')}.`));
    }
    // `expressionParam.expression` contains the variable declaration and the expression of the
    // for...of statement, i.e. 'user of users' The variable of a ForOfStatement is _only_ the "const
    // user" part and does not include "of x".
    const variableName = expressionParam.expression.split(' ')[0];
    const variableSpan = new ParseSourceSpan(expressionParam.sourceSpan.start, expressionParam.sourceSpan.start.moveBy(variableName.length));
    const result = {
        itemName: new Variable(itemName, '$implicit', variableSpan, variableSpan),
        trackBy: null,
        expression: parseBlockParameterToBinding(expressionParam, bindingParser, rawExpression),
        context: Array.from(ALLOWED_FOR_LOOP_LET_VARIABLES, (variableName) => {
            // Give ambiently-available context variables empty spans at the end of
            // the start of the `for` block, since they are not explicitly defined.
            const emptySpanAfterForBlockStart = new ParseSourceSpan(block.startSourceSpan.end, block.startSourceSpan.end);
            return new Variable(variableName, variableName, emptySpanAfterForBlockStart, emptySpanAfterForBlockStart);
        }),
    };
    for (const param of secondaryParams) {
        const letMatch = param.expression.match(FOR_LOOP_LET_PATTERN);
        if (letMatch !== null) {
            const variablesSpan = new ParseSourceSpan(param.sourceSpan.start.moveBy(letMatch[0].length - letMatch[1].length), param.sourceSpan.end);
            parseLetParameter(param.sourceSpan, letMatch[1], variablesSpan, itemName, result.context, errors);
            continue;
        }
        const trackMatch = param.expression.match(FOR_LOOP_TRACK_PATTERN);
        if (trackMatch !== null) {
            if (result.trackBy !== null) {
                errors.push(new ParseError(param.sourceSpan, '@for loop can only have one "track" expression'));
            }
            else {
                const expression = parseBlockParameterToBinding(param, bindingParser, trackMatch[1]);
                if (expression.ast instanceof EmptyExpr$1) {
                    errors.push(new ParseError(block.startSourceSpan, '@for loop must have a "track" expression'));
                }
                const keywordSpan = new ParseSourceSpan(param.sourceSpan.start, param.sourceSpan.start.moveBy('track'.length));
                result.trackBy = { expression, keywordSpan };
            }
            continue;
        }
        errors.push(new ParseError(param.sourceSpan, `Unrecognized @for loop parameter "${param.expression}"`));
    }
    return result;
}
/** Parses the `let` parameter of a `for` loop block. */
function parseLetParameter(sourceSpan, expression, span, loopItemName, context, errors) {
    const parts = expression.split(',');
    let startSpan = span.start;
    for (const part of parts) {
        const expressionParts = part.split('=');
        const name = expressionParts.length === 2 ? expressionParts[0].trim() : '';
        const variableName = expressionParts.length === 2 ? expressionParts[1].trim() : '';
        if (name.length === 0 || variableName.length === 0) {
            errors.push(new ParseError(sourceSpan, `Invalid @for loop "let" parameter. Parameter should match the pattern "<name> = <variable name>"`));
        }
        else if (!ALLOWED_FOR_LOOP_LET_VARIABLES.has(variableName)) {
            errors.push(new ParseError(sourceSpan, `Unknown "let" parameter variable "${variableName}". The allowed variables are: ${Array.from(ALLOWED_FOR_LOOP_LET_VARIABLES).join(', ')}`));
        }
        else if (name === loopItemName) {
            errors.push(new ParseError(sourceSpan, `Invalid @for loop "let" parameter. Variable cannot be called "${loopItemName}"`));
        }
        else if (context.some((v) => v.name === name)) {
            errors.push(new ParseError(sourceSpan, `Duplicate "let" parameter variable "${variableName}"`));
        }
        else {
            const [, keyLeadingWhitespace, keyName] = expressionParts[0].match(CHARACTERS_IN_SURROUNDING_WHITESPACE_PATTERN) ?? [];
            const keySpan = keyLeadingWhitespace !== undefined && expressionParts.length === 2
                ? new ParseSourceSpan(
                /* strip leading spaces */
                startSpan.moveBy(keyLeadingWhitespace.length), 
                /* advance to end of the variable name */
                startSpan.moveBy(keyLeadingWhitespace.length + keyName.length))
                : span;
            let valueSpan = undefined;
            if (expressionParts.length === 2) {
                const [, valueLeadingWhitespace, implicit] = expressionParts[1].match(CHARACTERS_IN_SURROUNDING_WHITESPACE_PATTERN) ?? [];
                valueSpan =
                    valueLeadingWhitespace !== undefined
                        ? new ParseSourceSpan(startSpan.moveBy(expressionParts[0].length + 1 + valueLeadingWhitespace.length), startSpan.moveBy(expressionParts[0].length + 1 + valueLeadingWhitespace.length + implicit.length))
                        : undefined;
            }
            const sourceSpan = new ParseSourceSpan(keySpan.start, valueSpan?.end ?? keySpan.end);
            context.push(new Variable(name, variableName, sourceSpan, keySpan, valueSpan));
        }
        startSpan = startSpan.moveBy(part.length + 1 /* add 1 to move past the comma */);
    }
}
/**
 * Checks that the shape of the blocks connected to an
 * `@if` block is correct. Returns an array of errors.
 */
function validateIfConnectedBlocks(connectedBlocks) {
    const errors = [];
    let hasElse = false;
    for (let i = 0; i < connectedBlocks.length; i++) {
        const block = connectedBlocks[i];
        if (block.name === 'else') {
            if (hasElse) {
                errors.push(new ParseError(block.startSourceSpan, 'Conditional can only have one @else block'));
            }
            else if (connectedBlocks.length > 1 && i < connectedBlocks.length - 1) {
                errors.push(new ParseError(block.startSourceSpan, '@else block must be last inside the conditional'));
            }
            else if (block.parameters.length > 0) {
                errors.push(new ParseError(block.startSourceSpan, '@else block cannot have parameters'));
            }
            hasElse = true;
        }
        else if (!ELSE_IF_PATTERN.test(block.name)) {
            errors.push(new ParseError(block.startSourceSpan, `Unrecognized conditional block @${block.name}`));
        }
    }
    return errors;
}
/** Checks that the shape of a `switch` block is valid. Returns an array of errors. */
function validateSwitchBlock(ast) {
    const errors = [];
    let hasDefault = false;
    if (ast.parameters.length !== 1) {
        errors.push(new ParseError(ast.startSourceSpan, '@switch block must have exactly one parameter'));
        return errors;
    }
    for (const node of ast.children) {
        // Skip over comments and empty text nodes inside the switch block.
        // Empty text nodes can be used for formatting while comments don't affect the runtime.
        if (node instanceof Comment ||
            (node instanceof Text && node.value.trim().length === 0)) {
            continue;
        }
        if (!(node instanceof Block) || (node.name !== 'case' && node.name !== 'default')) {
            errors.push(new ParseError(node.sourceSpan, '@switch block can only contain @case and @default blocks'));
            continue;
        }
        if (node.name === 'default') {
            if (hasDefault) {
                errors.push(new ParseError(node.startSourceSpan, '@switch block can only have one @default block'));
            }
            else if (node.parameters.length > 0) {
                errors.push(new ParseError(node.startSourceSpan, '@default block cannot have parameters'));
            }
            hasDefault = true;
        }
        else if (node.name === 'case' && node.parameters.length !== 1) {
            errors.push(new ParseError(node.startSourceSpan, '@case block must have exactly one parameter'));
        }
    }
    return errors;
}
/**
 * Parses a block parameter into a binding AST.
 * @param ast Block parameter that should be parsed.
 * @param bindingParser Parser that the expression should be parsed with.
 * @param part Specific part of the expression that should be parsed.
 */
function parseBlockParameterToBinding(ast, bindingParser, part) {
    let start;
    let end;
    if (typeof part === 'string') {
        // Note: `lastIndexOf` here should be enough to know the start index of the expression,
        // because we know that it'll be at the end of the param. Ideally we could use the `d`
        // flag when matching via regex and get the index from `match.indices`, but it's unclear
        // if we can use it yet since it's a relatively new feature. See:
        // https://github.com/tc39/proposal-regexp-match-indices
        start = Math.max(0, ast.expression.lastIndexOf(part));
        end = start + part.length;
    }
    else {
        start = 0;
        end = ast.expression.length;
    }
    return bindingParser.parseBinding(ast.expression.slice(start, end), false, ast.sourceSpan, ast.sourceSpan.start.offset + start);
}
/** Parses the parameter of a conditional block (`if` or `else if`). */
function parseConditionalBlockParameters(block, errors, bindingParser) {
    if (block.parameters.length === 0) {
        errors.push(new ParseError(block.startSourceSpan, 'Conditional block does not have an expression'));
        return null;
    }
    const expression = parseBlockParameterToBinding(block.parameters[0], bindingParser);
    let expressionAlias = null;
    // Start from 1 since we processed the first parameter already.
    for (let i = 1; i < block.parameters.length; i++) {
        const param = block.parameters[i];
        const aliasMatch = param.expression.match(CONDITIONAL_ALIAS_PATTERN);
        // For now conditionals can only have an `as` parameter.
        // We may want to rework this later if we add more.
        if (aliasMatch === null) {
            errors.push(new ParseError(param.sourceSpan, `Unrecognized conditional parameter "${param.expression}"`));
        }
        else if (block.name !== 'if') {
            errors.push(new ParseError(param.sourceSpan, '"as" expression is only allowed on the primary @if block'));
        }
        else if (expressionAlias !== null) {
            errors.push(new ParseError(param.sourceSpan, 'Conditional can only have one "as" expression'));
        }
        else {
            const name = aliasMatch[2].trim();
            if (IDENTIFIER_PATTERN.test(name)) {
                const variableStart = param.sourceSpan.start.moveBy(aliasMatch[1].length);
                const variableSpan = new ParseSourceSpan(variableStart, variableStart.moveBy(name.length));
                expressionAlias = new Variable(name, name, variableSpan, variableSpan);
            }
            else {
                errors.push(new ParseError(param.sourceSpan, '"as" expression must be a valid JavaScript identifier'));
            }
        }
    }
    return { expression, expressionAlias };
}
/** Strips optional parentheses around from a control from expression parameter. */
function stripOptionalParentheses(param, errors) {
    const expression = param.expression;
    const spaceRegex = /^\s$/;
    let openParens = 0;
    let start = 0;
    let end = expression.length - 1;
    for (let i = 0; i < expression.length; i++) {
        const char = expression[i];
        if (char === '(') {
            start = i + 1;
            openParens++;
        }
        else if (spaceRegex.test(char)) {
            continue;
        }
        else {
            break;
        }
    }
    if (openParens === 0) {
        return expression;
    }
    for (let i = expression.length - 1; i > -1; i--) {
        const char = expression[i];
        if (char === ')') {
            end = i;
            openParens--;
            if (openParens === 0) {
                break;
            }
        }
        else if (spaceRegex.test(char)) {
            continue;
        }
        else {
            break;
        }
    }
    if (openParens !== 0) {
        errors.push(new ParseError(param.sourceSpan, 'Unclosed parentheses in expression'));
        return null;
    }
    return expression.slice(start, end);
}

/** Pattern for a timing value in a trigger. */
const TIME_PATTERN = /^\d+\.?\d*(ms|s)?$/;
/** Pattern for a separator between keywords in a trigger expression. */
const SEPARATOR_PATTERN = /^\s$/;
/** Pairs of characters that form syntax that is comma-delimited. */
const COMMA_DELIMITED_SYNTAX = new Map([
    [$LBRACE, $RBRACE], // Object literals
    [$LBRACKET, $RBRACKET], // Array literals
    [$LPAREN, $RPAREN], // Function calls
]);
/** Possible types of `on` triggers. */
var OnTriggerType;
(function (OnTriggerType) {
    OnTriggerType["IDLE"] = "idle";
    OnTriggerType["TIMER"] = "timer";
    OnTriggerType["INTERACTION"] = "interaction";
    OnTriggerType["IMMEDIATE"] = "immediate";
    OnTriggerType["HOVER"] = "hover";
    OnTriggerType["VIEWPORT"] = "viewport";
    OnTriggerType["NEVER"] = "never";
})(OnTriggerType || (OnTriggerType = {}));
/** Parses a `when` deferred trigger. */
function parseNeverTrigger({ expression, sourceSpan }, triggers, errors) {
    const neverIndex = expression.indexOf('never');
    const neverSourceSpan = new ParseSourceSpan(sourceSpan.start.moveBy(neverIndex), sourceSpan.start.moveBy(neverIndex + 'never'.length));
    const prefetchSpan = getPrefetchSpan(expression, sourceSpan);
    const hydrateSpan = getHydrateSpan(expression, sourceSpan);
    // This is here just to be safe, we shouldn't enter this function
    // in the first place if a block doesn't have the "on" keyword.
    if (neverIndex === -1) {
        errors.push(new ParseError(sourceSpan, `Could not find "never" keyword in expression`));
    }
    else {
        trackTrigger('never', triggers, errors, new NeverDeferredTrigger(neverSourceSpan, sourceSpan, prefetchSpan, null, hydrateSpan));
    }
}
/** Parses a `when` deferred trigger. */
function parseWhenTrigger({ expression, sourceSpan }, bindingParser, triggers, errors) {
    const whenIndex = expression.indexOf('when');
    const whenSourceSpan = new ParseSourceSpan(sourceSpan.start.moveBy(whenIndex), sourceSpan.start.moveBy(whenIndex + 'when'.length));
    const prefetchSpan = getPrefetchSpan(expression, sourceSpan);
    const hydrateSpan = getHydrateSpan(expression, sourceSpan);
    // This is here just to be safe, we shouldn't enter this function
    // in the first place if a block doesn't have the "when" keyword.
    if (whenIndex === -1) {
        errors.push(new ParseError(sourceSpan, `Could not find "when" keyword in expression`));
    }
    else {
        const start = getTriggerParametersStart(expression, whenIndex + 1);
        const parsed = bindingParser.parseBinding(expression.slice(start), false, sourceSpan, sourceSpan.start.offset + start);
        trackTrigger('when', triggers, errors, new BoundDeferredTrigger(parsed, sourceSpan, prefetchSpan, whenSourceSpan, hydrateSpan));
    }
}
/** Parses an `on` trigger */
function parseOnTrigger({ expression, sourceSpan }, triggers, errors, placeholder) {
    const onIndex = expression.indexOf('on');
    const onSourceSpan = new ParseSourceSpan(sourceSpan.start.moveBy(onIndex), sourceSpan.start.moveBy(onIndex + 'on'.length));
    const prefetchSpan = getPrefetchSpan(expression, sourceSpan);
    const hydrateSpan = getHydrateSpan(expression, sourceSpan);
    // This is here just to be safe, we shouldn't enter this function
    // in the first place if a block doesn't have the "on" keyword.
    if (onIndex === -1) {
        errors.push(new ParseError(sourceSpan, `Could not find "on" keyword in expression`));
    }
    else {
        const start = getTriggerParametersStart(expression, onIndex + 1);
        const parser = new OnTriggerParser(expression, start, sourceSpan, triggers, errors, expression.startsWith('hydrate')
            ? validateHydrateReferenceBasedTrigger
            : validatePlainReferenceBasedTrigger, placeholder, prefetchSpan, onSourceSpan, hydrateSpan);
        parser.parse();
    }
}
function getPrefetchSpan(expression, sourceSpan) {
    if (!expression.startsWith('prefetch')) {
        return null;
    }
    return new ParseSourceSpan(sourceSpan.start, sourceSpan.start.moveBy('prefetch'.length));
}
function getHydrateSpan(expression, sourceSpan) {
    if (!expression.startsWith('hydrate')) {
        return null;
    }
    return new ParseSourceSpan(sourceSpan.start, sourceSpan.start.moveBy('hydrate'.length));
}
class OnTriggerParser {
    expression;
    start;
    span;
    triggers;
    errors;
    validator;
    placeholder;
    prefetchSpan;
    onSourceSpan;
    hydrateSpan;
    index = 0;
    tokens;
    constructor(expression, start, span, triggers, errors, validator, placeholder, prefetchSpan, onSourceSpan, hydrateSpan) {
        this.expression = expression;
        this.start = start;
        this.span = span;
        this.triggers = triggers;
        this.errors = errors;
        this.validator = validator;
        this.placeholder = placeholder;
        this.prefetchSpan = prefetchSpan;
        this.onSourceSpan = onSourceSpan;
        this.hydrateSpan = hydrateSpan;
        this.tokens = new Lexer().tokenize(expression.slice(start));
    }
    parse() {
        while (this.tokens.length > 0 && this.index < this.tokens.length) {
            const token = this.token();
            if (!token.isIdentifier()) {
                this.unexpectedToken(token);
                break;
            }
            // An identifier immediately followed by a comma or the end of
            // the expression cannot have parameters so we can exit early.
            if (this.isFollowedByOrLast($COMMA)) {
                this.consumeTrigger(token, []);
                this.advance();
            }
            else if (this.isFollowedByOrLast($LPAREN)) {
                this.advance(); // Advance to the opening paren.
                const prevErrors = this.errors.length;
                const parameters = this.consumeParameters();
                if (this.errors.length !== prevErrors) {
                    break;
                }
                this.consumeTrigger(token, parameters);
                this.advance(); // Advance past the closing paren.
            }
            else if (this.index < this.tokens.length - 1) {
                this.unexpectedToken(this.tokens[this.index + 1]);
            }
            this.advance();
        }
    }
    advance() {
        this.index++;
    }
    isFollowedByOrLast(char) {
        if (this.index === this.tokens.length - 1) {
            return true;
        }
        return this.tokens[this.index + 1].isCharacter(char);
    }
    token() {
        return this.tokens[Math.min(this.index, this.tokens.length - 1)];
    }
    consumeTrigger(identifier, parameters) {
        const triggerNameStartSpan = this.span.start.moveBy(this.start + identifier.index - this.tokens[0].index);
        const nameSpan = new ParseSourceSpan(triggerNameStartSpan, triggerNameStartSpan.moveBy(identifier.strValue.length));
        const endSpan = triggerNameStartSpan.moveBy(this.token().end - identifier.index);
        // Put the prefetch and on spans with the first trigger
        // This should maybe be refactored to have something like an outer OnGroup AST
        // Since triggers can be grouped with commas "on hover(x), interaction(y)"
        const isFirstTrigger = identifier.index === 0;
        const onSourceSpan = isFirstTrigger ? this.onSourceSpan : null;
        const prefetchSourceSpan = isFirstTrigger ? this.prefetchSpan : null;
        const hydrateSourceSpan = isFirstTrigger ? this.hydrateSpan : null;
        const sourceSpan = new ParseSourceSpan(isFirstTrigger ? this.span.start : triggerNameStartSpan, endSpan);
        try {
            switch (identifier.toString()) {
                case OnTriggerType.IDLE:
                    this.trackTrigger('idle', createIdleTrigger(parameters, nameSpan, sourceSpan, prefetchSourceSpan, onSourceSpan, hydrateSourceSpan));
                    break;
                case OnTriggerType.TIMER:
                    this.trackTrigger('timer', createTimerTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan));
                    break;
                case OnTriggerType.INTERACTION:
                    this.trackTrigger('interaction', createInteractionTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan, this.placeholder, this.validator));
                    break;
                case OnTriggerType.IMMEDIATE:
                    this.trackTrigger('immediate', createImmediateTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan));
                    break;
                case OnTriggerType.HOVER:
                    this.trackTrigger('hover', createHoverTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan, this.placeholder, this.validator));
                    break;
                case OnTriggerType.VIEWPORT:
                    this.trackTrigger('viewport', createViewportTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan, this.placeholder, this.validator));
                    break;
                default:
                    throw new Error(`Unrecognized trigger type "${identifier}"`);
            }
        }
        catch (e) {
            this.error(identifier, e.message);
        }
    }
    consumeParameters() {
        const parameters = [];
        if (!this.token().isCharacter($LPAREN)) {
            this.unexpectedToken(this.token());
            return parameters;
        }
        this.advance();
        const commaDelimStack = [];
        let current = '';
        while (this.index < this.tokens.length) {
            const token = this.token();
            // Stop parsing if we've hit the end character and we're outside of a comma-delimited syntax.
            // Note that we don't need to account for strings here since the lexer already parsed them
            // into string tokens.
            if (token.isCharacter($RPAREN) && commaDelimStack.length === 0) {
                if (current.length) {
                    parameters.push(current);
                }
                break;
            }
            // In the `on` microsyntax "top-level" commas (e.g. ones outside of an parameters) separate
            // the different triggers (e.g. `on idle,timer(500)`). This is problematic, because the
            // function-like syntax also implies that multiple parameters can be passed into the
            // individual trigger (e.g. `on foo(a, b)`). To avoid tripping up the parser with commas that
            // are part of other sorts of syntax (object literals, arrays), we treat anything inside
            // a comma-delimited syntax block as plain text.
            if (token.type === TokenType.Character && COMMA_DELIMITED_SYNTAX.has(token.numValue)) {
                commaDelimStack.push(COMMA_DELIMITED_SYNTAX.get(token.numValue));
            }
            if (commaDelimStack.length > 0 &&
                token.isCharacter(commaDelimStack[commaDelimStack.length - 1])) {
                commaDelimStack.pop();
            }
            // If we hit a comma outside of a comma-delimited syntax, it means
            // that we're at the top level and we're starting a new parameter.
            if (commaDelimStack.length === 0 && token.isCharacter($COMMA) && current.length > 0) {
                parameters.push(current);
                current = '';
                this.advance();
                continue;
            }
            // Otherwise treat the token as a plain text character in the current parameter.
            current += this.tokenText();
            this.advance();
        }
        if (!this.token().isCharacter($RPAREN) || commaDelimStack.length > 0) {
            this.error(this.token(), 'Unexpected end of expression');
        }
        if (this.index < this.tokens.length - 1 &&
            !this.tokens[this.index + 1].isCharacter($COMMA)) {
            this.unexpectedToken(this.tokens[this.index + 1]);
        }
        return parameters;
    }
    tokenText() {
        // Tokens have a toString already which we could use, but for string tokens it omits the quotes.
        // Eventually we could expose this information on the token directly.
        return this.expression.slice(this.start + this.token().index, this.start + this.token().end);
    }
    trackTrigger(name, trigger) {
        trackTrigger(name, this.triggers, this.errors, trigger);
    }
    error(token, message) {
        const newStart = this.span.start.moveBy(this.start + token.index);
        const newEnd = newStart.moveBy(token.end - token.index);
        this.errors.push(new ParseError(new ParseSourceSpan(newStart, newEnd), message));
    }
    unexpectedToken(token) {
        this.error(token, `Unexpected token "${token}"`);
    }
}
/** Adds a trigger to a map of triggers. */
function trackTrigger(name, allTriggers, errors, trigger) {
    if (allTriggers[name]) {
        errors.push(new ParseError(trigger.sourceSpan, `Duplicate "${name}" trigger is not allowed`));
    }
    else {
        allTriggers[name] = trigger;
    }
}
function createIdleTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
    if (parameters.length > 0) {
        throw new Error(`"${OnTriggerType.IDLE}" trigger cannot have parameters`);
    }
    return new IdleDeferredTrigger(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
}
function createTimerTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
    if (parameters.length !== 1) {
        throw new Error(`"${OnTriggerType.TIMER}" trigger must have exactly one parameter`);
    }
    const delay = parseDeferredTime(parameters[0]);
    if (delay === null) {
        throw new Error(`Could not parse time value of trigger "${OnTriggerType.TIMER}"`);
    }
    return new TimerDeferredTrigger(delay, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
}
function createImmediateTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
    if (parameters.length > 0) {
        throw new Error(`"${OnTriggerType.IMMEDIATE}" trigger cannot have parameters`);
    }
    return new ImmediateDeferredTrigger(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
}
function createHoverTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan, placeholder, validator) {
    validator(OnTriggerType.HOVER, parameters, placeholder);
    return new HoverDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
}
function createInteractionTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan, placeholder, validator) {
    validator(OnTriggerType.INTERACTION, parameters, placeholder);
    return new InteractionDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
}
function createViewportTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan, placeholder, validator) {
    validator(OnTriggerType.VIEWPORT, parameters, placeholder);
    return new ViewportDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
}
/**
 * Checks whether the structure of a non-hydrate reference-based trigger is valid.
 * @param type Type of the trigger being validated.
 * @param parameters Parameters of the trigger.
 * @param placeholder Placeholder of the defer block.
 */
function validatePlainReferenceBasedTrigger(type, parameters, placeholder) {
    if (parameters.length > 1) {
        throw new Error(`"${type}" trigger can only have zero or one parameters`);
    }
    if (parameters.length === 0) {
        if (placeholder === null) {
            throw new Error(`"${type}" trigger with no parameters can only be placed on an @defer that has a @placeholder block`);
        }
        if (placeholder.children.length !== 1 || !(placeholder.children[0] instanceof Element$1)) {
            throw new Error(`"${type}" trigger with no parameters can only be placed on an @defer that has a ` +
                `@placeholder block with exactly one root element node`);
        }
    }
}
/**
 * Checks whether the structure of a hydrate trigger is valid.
 * @param type Type of the trigger being validated.
 * @param parameters Parameters of the trigger.
 */
function validateHydrateReferenceBasedTrigger(type, parameters) {
    if (parameters.length > 0) {
        throw new Error(`Hydration trigger "${type}" cannot have parameters`);
    }
}
/** Gets the index within an expression at which the trigger parameters start. */
function getTriggerParametersStart(value, startPosition = 0) {
    let hasFoundSeparator = false;
    for (let i = startPosition; i < value.length; i++) {
        if (SEPARATOR_PATTERN.test(value[i])) {
            hasFoundSeparator = true;
        }
        else if (hasFoundSeparator) {
            return i;
        }
    }
    return -1;
}
/**
 * Parses a time expression from a deferred trigger to
 * milliseconds. Returns null if it cannot be parsed.
 */
function parseDeferredTime(value) {
    const match = value.match(TIME_PATTERN);
    if (!match) {
        return null;
    }
    const [time, units] = match;
    return parseFloat(time) * (units === 's' ? 1000 : 1);
}

/** Pattern to identify a `prefetch when` trigger. */
const PREFETCH_WHEN_PATTERN = /^prefetch\s+when\s/;
/** Pattern to identify a `prefetch on` trigger. */
const PREFETCH_ON_PATTERN = /^prefetch\s+on\s/;
/** Pattern to identify a `hydrate when` trigger. */
const HYDRATE_WHEN_PATTERN = /^hydrate\s+when\s/;
/** Pattern to identify a `hydrate on` trigger. */
const HYDRATE_ON_PATTERN = /^hydrate\s+on\s/;
/** Pattern to identify a `hydrate never` trigger. */
const HYDRATE_NEVER_PATTERN = /^hydrate\s+never(\s*)$/;
/** Pattern to identify a `minimum` parameter in a block. */
const MINIMUM_PARAMETER_PATTERN = /^minimum\s/;
/** Pattern to identify a `after` parameter in a block. */
const AFTER_PARAMETER_PATTERN = /^after\s/;
/** Pattern to identify a `when` parameter in a block. */
const WHEN_PARAMETER_PATTERN = /^when\s/;
/** Pattern to identify a `on` parameter in a block. */
const ON_PARAMETER_PATTERN = /^on\s/;
/**
 * Predicate function that determines if a block with
 * a specific name cam be connected to a `defer` block.
 */
function isConnectedDeferLoopBlock(name) {
    return name === 'placeholder' || name === 'loading' || name === 'error';
}
/** Creates a deferred block from an HTML AST node. */
function createDeferredBlock(ast, connectedBlocks, visitor, bindingParser) {
    const errors = [];
    const { placeholder, loading, error } = parseConnectedBlocks(connectedBlocks, errors, visitor);
    const { triggers, prefetchTriggers, hydrateTriggers } = parsePrimaryTriggers(ast, bindingParser, errors, placeholder);
    // The `defer` block has a main span encompassing all of the connected branches as well.
    let lastEndSourceSpan = ast.endSourceSpan;
    let endOfLastSourceSpan = ast.sourceSpan.end;
    if (connectedBlocks.length > 0) {
        const lastConnectedBlock = connectedBlocks[connectedBlocks.length - 1];
        lastEndSourceSpan = lastConnectedBlock.endSourceSpan;
        endOfLastSourceSpan = lastConnectedBlock.sourceSpan.end;
    }
    const sourceSpanWithConnectedBlocks = new ParseSourceSpan(ast.sourceSpan.start, endOfLastSourceSpan);
    const node = new DeferredBlock(visitAll(visitor, ast.children, ast.children), triggers, prefetchTriggers, hydrateTriggers, placeholder, loading, error, ast.nameSpan, sourceSpanWithConnectedBlocks, ast.sourceSpan, ast.startSourceSpan, lastEndSourceSpan, ast.i18n);
    return { node, errors };
}
function parseConnectedBlocks(connectedBlocks, errors, visitor) {
    let placeholder = null;
    let loading = null;
    let error = null;
    for (const block of connectedBlocks) {
        try {
            if (!isConnectedDeferLoopBlock(block.name)) {
                errors.push(new ParseError(block.startSourceSpan, `Unrecognized block "@${block.name}"`));
                break;
            }
            switch (block.name) {
                case 'placeholder':
                    if (placeholder !== null) {
                        errors.push(new ParseError(block.startSourceSpan, `@defer block can only have one @placeholder block`));
                    }
                    else {
                        placeholder = parsePlaceholderBlock(block, visitor);
                    }
                    break;
                case 'loading':
                    if (loading !== null) {
                        errors.push(new ParseError(block.startSourceSpan, `@defer block can only have one @loading block`));
                    }
                    else {
                        loading = parseLoadingBlock(block, visitor);
                    }
                    break;
                case 'error':
                    if (error !== null) {
                        errors.push(new ParseError(block.startSourceSpan, `@defer block can only have one @error block`));
                    }
                    else {
                        error = parseErrorBlock(block, visitor);
                    }
                    break;
            }
        }
        catch (e) {
            errors.push(new ParseError(block.startSourceSpan, e.message));
        }
    }
    return { placeholder, loading, error };
}
function parsePlaceholderBlock(ast, visitor) {
    let minimumTime = null;
    for (const param of ast.parameters) {
        if (MINIMUM_PARAMETER_PATTERN.test(param.expression)) {
            if (minimumTime != null) {
                throw new Error(`@placeholder block can only have one "minimum" parameter`);
            }
            const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
            if (parsedTime === null) {
                throw new Error(`Could not parse time value of parameter "minimum"`);
            }
            minimumTime = parsedTime;
        }
        else {
            throw new Error(`Unrecognized parameter in @placeholder block: "${param.expression}"`);
        }
    }
    return new DeferredBlockPlaceholder(visitAll(visitor, ast.children, ast.children), minimumTime, ast.nameSpan, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.i18n);
}
function parseLoadingBlock(ast, visitor) {
    let afterTime = null;
    let minimumTime = null;
    for (const param of ast.parameters) {
        if (AFTER_PARAMETER_PATTERN.test(param.expression)) {
            if (afterTime != null) {
                throw new Error(`@loading block can only have one "after" parameter`);
            }
            const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
            if (parsedTime === null) {
                throw new Error(`Could not parse time value of parameter "after"`);
            }
            afterTime = parsedTime;
        }
        else if (MINIMUM_PARAMETER_PATTERN.test(param.expression)) {
            if (minimumTime != null) {
                throw new Error(`@loading block can only have one "minimum" parameter`);
            }
            const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
            if (parsedTime === null) {
                throw new Error(`Could not parse time value of parameter "minimum"`);
            }
            minimumTime = parsedTime;
        }
        else {
            throw new Error(`Unrecognized parameter in @loading block: "${param.expression}"`);
        }
    }
    return new DeferredBlockLoading(visitAll(visitor, ast.children, ast.children), afterTime, minimumTime, ast.nameSpan, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.i18n);
}
function parseErrorBlock(ast, visitor) {
    if (ast.parameters.length > 0) {
        throw new Error(`@error block cannot have parameters`);
    }
    return new DeferredBlockError(visitAll(visitor, ast.children, ast.children), ast.nameSpan, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.i18n);
}
function parsePrimaryTriggers(ast, bindingParser, errors, placeholder) {
    const triggers = {};
    const prefetchTriggers = {};
    const hydrateTriggers = {};
    for (const param of ast.parameters) {
        // The lexer ignores the leading spaces so we can assume
        // that the expression starts with a keyword.
        if (WHEN_PARAMETER_PATTERN.test(param.expression)) {
            parseWhenTrigger(param, bindingParser, triggers, errors);
        }
        else if (ON_PARAMETER_PATTERN.test(param.expression)) {
            parseOnTrigger(param, triggers, errors, placeholder);
        }
        else if (PREFETCH_WHEN_PATTERN.test(param.expression)) {
            parseWhenTrigger(param, bindingParser, prefetchTriggers, errors);
        }
        else if (PREFETCH_ON_PATTERN.test(param.expression)) {
            parseOnTrigger(param, prefetchTriggers, errors, placeholder);
        }
        else if (HYDRATE_WHEN_PATTERN.test(param.expression)) {
            parseWhenTrigger(param, bindingParser, hydrateTriggers, errors);
        }
        else if (HYDRATE_ON_PATTERN.test(param.expression)) {
            parseOnTrigger(param, hydrateTriggers, errors, placeholder);
        }
        else if (HYDRATE_NEVER_PATTERN.test(param.expression)) {
            parseNeverTrigger(param, hydrateTriggers, errors);
        }
        else {
            errors.push(new ParseError(param.sourceSpan, 'Unrecognized trigger'));
        }
    }
    if (hydrateTriggers.never && Object.keys(hydrateTriggers).length > 1) {
        errors.push(new ParseError(ast.startSourceSpan, 'Cannot specify additional `hydrate` triggers if `hydrate never` is present'));
    }
    return { triggers, prefetchTriggers, hydrateTriggers };
}

const BIND_NAME_REGEXP = /^(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.*)$/;
// Group 1 = "bind-"
const KW_BIND_IDX = 1;
// Group 2 = "let-"
const KW_LET_IDX = 2;
// Group 3 = "ref-/#"
const KW_REF_IDX = 3;
// Group 4 = "on-"
const KW_ON_IDX = 4;
// Group 5 = "bindon-"
const KW_BINDON_IDX = 5;
// Group 6 = "@"
const KW_AT_IDX = 6;
// Group 7 = the identifier after "bind-", "let-", "ref-/#", "on-", "bindon-" or "@"
const IDENT_KW_IDX = 7;
const BINDING_DELIMS = {
    BANANA_BOX: { start: '[(', end: ')]' },
    PROPERTY: { start: '[', end: ']' },
    EVENT: { start: '(', end: ')' },
};
const TEMPLATE_ATTR_PREFIX = '*';
function htmlAstToRender3Ast(htmlNodes, bindingParser, options) {
    const transformer = new HtmlAstToIvyAst(bindingParser, options);
    const ivyNodes = visitAll(transformer, htmlNodes, htmlNodes);
    // Errors might originate in either the binding parser or the html to ivy transformer
    const allErrors = bindingParser.errors.concat(transformer.errors);
    const result = {
        nodes: ivyNodes,
        errors: allErrors,
        styleUrls: transformer.styleUrls,
        styles: transformer.styles,
        ngContentSelectors: transformer.ngContentSelectors,
    };
    if (options.collectCommentNodes) {
        result.commentNodes = transformer.commentNodes;
    }
    return result;
}
class HtmlAstToIvyAst {
    bindingParser;
    options;
    errors = [];
    styles = [];
    styleUrls = [];
    ngContentSelectors = [];
    // This array will be populated if `Render3ParseOptions['collectCommentNodes']` is true
    commentNodes = [];
    inI18nBlock = false;
    /**
     * Keeps track of the nodes that have been processed already when previous nodes were visited.
     * These are typically blocks connected to other blocks or text nodes between connected blocks.
     */
    processedNodes = new Set();
    constructor(bindingParser, options) {
        this.bindingParser = bindingParser;
        this.options = options;
    }
    // HTML visitor
    visitElement(element) {
        const isI18nRootElement = isI18nRootNode(element.i18n);
        if (isI18nRootElement) {
            if (this.inI18nBlock) {
                this.reportError('Cannot mark an element as translatable inside of a translatable section. Please remove the nested i18n marker.', element.sourceSpan);
            }
            this.inI18nBlock = true;
        }
        const preparsedElement = preparseElement(element);
        if (preparsedElement.type === PreparsedElementType.SCRIPT) {
            return null;
        }
        else if (preparsedElement.type === PreparsedElementType.STYLE) {
            const contents = textContents(element);
            if (contents !== null) {
                this.styles.push(contents);
            }
            return null;
        }
        else if (preparsedElement.type === PreparsedElementType.STYLESHEET &&
            isStyleUrlResolvable(preparsedElement.hrefAttr)) {
            this.styleUrls.push(preparsedElement.hrefAttr);
            return null;
        }
        // Whether the element is a `<ng-template>`
        const isTemplateElement = isNgTemplate(element.name);
        const parsedProperties = [];
        const boundEvents = [];
        const variables = [];
        const references = [];
        const attributes = [];
        const i18nAttrsMeta = {};
        const templateParsedProperties = [];
        const templateVariables = [];
        // Whether the element has any *-attribute
        let elementHasInlineTemplate = false;
        for (const attribute of element.attrs) {
            let hasBinding = false;
            const normalizedName = normalizeAttributeName(attribute.name);
            // `*attr` defines template bindings
            let isTemplateBinding = false;
            if (attribute.i18n) {
                i18nAttrsMeta[attribute.name] = attribute.i18n;
            }
            if (normalizedName.startsWith(TEMPLATE_ATTR_PREFIX)) {
                // *-attributes
                if (elementHasInlineTemplate) {
                    this.reportError(`Can't have multiple template bindings on one element. Use only one attribute prefixed with *`, attribute.sourceSpan);
                }
                isTemplateBinding = true;
                elementHasInlineTemplate = true;
                const templateValue = attribute.value;
                const templateKey = normalizedName.substring(TEMPLATE_ATTR_PREFIX.length);
                const parsedVariables = [];
                const absoluteValueOffset = attribute.valueSpan
                    ? attribute.valueSpan.start.offset
                    : // If there is no value span the attribute does not have a value, like `attr` in
                        //`<div attr></div>`. In this case, point to one character beyond the last character of
                        // the attribute name.
                        attribute.sourceSpan.start.offset + attribute.name.length;
                this.bindingParser.parseInlineTemplateBinding(templateKey, templateValue, attribute.sourceSpan, absoluteValueOffset, [], templateParsedProperties, parsedVariables, true /* isIvyAst */);
                templateVariables.push(...parsedVariables.map((v) => new Variable(v.name, v.value, v.sourceSpan, v.keySpan, v.valueSpan)));
            }
            else {
                // Check for variables, events, property bindings, interpolation
                hasBinding = this.parseAttribute(isTemplateElement, attribute, [], parsedProperties, boundEvents, variables, references);
            }
            if (!hasBinding && !isTemplateBinding) {
                // don't include the bindings as attributes as well in the AST
                attributes.push(this.visitAttribute(attribute));
            }
        }
        let children;
        if (preparsedElement.nonBindable) {
            // The `NonBindableVisitor` may need to return an array of nodes for blocks so we need
            // to flatten the array here. Avoid doing this for the `HtmlAstToIvyAst` since `flat` creates
            // a new array.
            children = visitAll(NON_BINDABLE_VISITOR, element.children).flat(Infinity);
        }
        else {
            children = visitAll(this, element.children, element.children);
        }
        let parsedElement;
        if (preparsedElement.type === PreparsedElementType.NG_CONTENT) {
            const selector = preparsedElement.selectAttr;
            const attrs = element.attrs.map((a   ttr) => this.visitAttribute(attr));
            parsedElement = new Content(selector, attrs, children, element.sourceSpan, element.i18n);
            this.ngContentSelectors.push(selector);
        }
        else if (isTemplateElement) {
            // `<ng-template>`
            const attrs = this.extractAttributes(element.name, parsedProperties, i18nAttrsMeta);
            parsedElement = new Template(element.name, attributes, attrs.bound, boundEvents, [
            /* no template attributes */
            ], children, references, variables, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
        }
        else {
            const attrs = this.extractAttributes(element.name, parsedProperties, i18nAttrsMeta);
            parsedElement = new Element$1(element.name, attributes, attrs.bound, boundEvents, children, references, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
        }
        if (elementHasInlineTemplate) {
            // If this node is an inline-template (e.g. has *ngFor) then we need to create a template
            // node that contains this node.
            // Moreover, if the node is an element, then we need to hoist its attributes to the template
            // node for matching against content projection selectors.
            const attrs = this.extractAttributes('ng-template', templateParsedProperties, i18nAttrsMeta);
            const templateAttrs = [];
            attrs.literal.forEach((attr) => templateAttrs.push(attr));
            attrs.bound.forEach((attr) => templateAttrs.push(attr));
            const hoistedAttrs = parsedElement instanceof Element$1
                ? {
                    attributes: parsedElement.attributes,
                    inputs: parsedElement.inputs,
                    outputs: parsedElement.outputs,
                }
                : { attributes: [], inputs: [], outputs: [] };
            // For <ng-template>s with structural directives on them, avoid passing i18n information to
            // the wrapping template to prevent unnecessary i18n instructions from being generated. The
            // necessary i18n meta information will be extracted from child elements.
            const i18n = isTemplateElement && isI18nRootElement ? undefined : element.i18n;
            const name = parsedElement instanceof Template ? null : parsedElement.name;
            parsedElement = new Template(name, hoistedAttrs.attributes, hoistedAttrs.inputs, hoistedAttrs.outputs, templateAttrs, [parsedElement], [
            /* no references */
            ], templateVariables, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, i18n);
        }
        if (isI18nRootElement) {
            this.inI18nBlock = false;
        }
        return parsedElement;
    }
    visitAttribute(attribute) {
        return new TextAttribute(attribute.name, attribute.value, attribute.sourceSpan, attribute.keySpan, attribute.valueSpan, attribute.i18n);
    }
    visitText(text) {
        return this.processedNodes.has(text)
            ? null
            : this._visitTextWithInterpolation(text.value, text.sourceSpan, text.tokens, text.i18n);
    }
    visitExpansion(expansion) {
        if (!expansion.i18n) {
            // do not generate Icu in case it was created
            // outside of i18n block in a template
            return null;
        }
        if (!isI18nRootNode(expansion.i18n)) {
            throw new Error(`Invalid type "${expansion.i18n.constructor}" for "i18n" property of ${expansion.sourceSpan.toString()}. Expected a "Message"`);
        }
        const message = expansion.i18n;
        const vars = {};
        const placeholders = {};
        // extract VARs from ICUs - we process them separately while
        // assembling resulting message via goog.getMsg function, since
        // we need to pass them to top-level goog.getMsg call
        Object.keys(message.placeholders).forEach((key) => {
            const value = message.placeholders[key];
            if (key.startsWith(I18N_ICU_VAR_PREFIX)) {
                // Currently when the `plural` or `select` keywords in an ICU contain trailing spaces (e.g.
                // `{count, select , ...}`), these spaces are also included into the key names in ICU vars
                // (e.g. "VAR_SELECT "). These trailing spaces are not desirable, since they will later be
                // converted into `_` symbols while normalizing placeholder names, which might lead to
                // mismatches at runtime (i.e. placeholder will not be replaced with the correct value).
                const formattedKey = key.trim();
                const ast = this.bindingParser.parseInterpolationExpression(value.text, value.sourceSpan);
                vars[formattedKey] = new BoundText(ast, value.sourceSpan);
            }
            else {
                placeholders[key] = this._visitTextWithInterpolation(value.text, value.sourceSpan, null);
            }
        });
        return new Icu$1(vars, placeholders, expansion.sourceSpan, message);
    }
    visitExpansionCase(expansionCase) {
        return null;
    }
    visitComment(comment) {
        if (this.options.collectCommentNodes) {
            this.commentNodes.push(new Comment$1(comment.value || '', comment.sourceSpan));
        }
        return null;
    }
    visitLetDeclaration(decl, context) {
        const value = this.bindingParser.parseBinding(decl.value, false, decl.valueSpan, decl.valueSpan.start.offset);
        if (value.errors.length === 0 && value.ast instanceof EmptyExpr$1) {
            this.reportError('@let declaration value cannot be empty', decl.valueSpan);
        }
        return new LetDeclaration$1(decl.name, value, decl.sourceSpan, decl.nameSpan, decl.valueSpan);
    }
    visitBlockParameter() {
        return null;
    }
    visitBlock(block, context) {
        const index = Array.isArray(context) ? context.indexOf(block) : -1;
        if (index === -1) {
            throw new Error('Visitor invoked incorrectly. Expecting visitBlock to be invoked siblings array as its context');
        }
        // Connected blocks may have been processed as a part of the previous block.
        if (this.processedNodes.has(block)) {
            return null;
        }
        let result = null;
        switch (block.name) {
            case 'defer':
                result = createDeferredBlock(block, this.findConnectedBlocks(index, context, isConnectedDeferLoopBlock), this, this.bindingParser);
                break;
            case 'switch':
                result = createSwitchBlock(block, this, this.bindingParser);
                break;
            case 'for':
                result = createForLoop(block, this.findConnectedBlocks(index, context, isConnectedForLoopBlock), this, this.bindingParser);
                break;
            case 'if':
                result = createIfBlock(block, this.findConnectedBlocks(index, context, isConnectedIfLoopBlock), this, this.bindingParser);
                break;
            default:
                let errorMessage;
                if (isConnectedDeferLoopBlock(block.name)) {
                    errorMessage = `@${block.name} block can only be used after an @defer block.`;
                    this.processedNodes.add(block);
                }
                else if (isConnectedForLoopBlock(block.name)) {
                    errorMessage = `@${block.name} block can only be used after an @for block.`;
                    this.processedNodes.add(block);
                }
                else if (isConnectedIfLoopBlock(block.name)) {
                    errorMessage = `@${block.name} block can only be used after an @if or @else if block.`;
                    this.processedNodes.add(block);
                }
                else {
                    errorMessage = `Unrecognized block @${block.name}.`;
                }
                result = {
                    node: new UnknownBlock(block.name, block.sourceSpan, block.nameSpan),
                    errors: [new ParseError(block.sourceSpan, errorMessage)],
                };
                break;
        }
        this.errors.push(...result.errors);
        return result.node;
    }
    findConnectedBlocks(primaryBlockIndex, siblings, predicate) {
        const relatedBlocks = [];
        for (let i = primaryBlockIndex + 1; i < siblings.length; i++) {
            const node = siblings[i];
            // Skip over comments.
            if (node instanceof Comment) {
                continue;
            }
            // Ignore empty text nodes between blocks.
            if (node instanceof Text && node.value.trim().length === 0) {
                // Add the text node to the processed nodes since we don't want
                // it to be generated between the connected nodes.
                this.processedNodes.add(node);
                continue;
            }
            // Stop searching as soon as we hit a non-block node or a block that is unrelated.
            if (!(node instanceof Block) || !predicate(node.name)) {
                break;
            }
            relatedBlocks.push(node);
            this.processedNodes.add(node);
        }
        return relatedBlocks;
    }
    // convert view engine `ParsedProperty` to a format suitable for IVY
    extractAttributes(elementName, properties, i18nPropsMeta) {
        const bound = [];
        const literal = [];
        properties.forEach((prop) => {
            const i18n = i18nPropsMeta[prop.name];
            if (prop.isLiteral) {
                literal.push(new TextAttribute(prop.name, prop.expression.source || '', prop.sourceSpan, prop.keySpan, prop.valueSpan, i18n));
            }
            else {
                // Note that validation is skipped and property mapping is disabled
                // due to the fact that we need to make sure a given prop is not an
                // input of a directive and directive matching happens at runtime.
                const bep = this.bindingParser.createBoundElementProperty(elementName, prop, 
                /* skipValidation */ true, 
                /* mapPropertyName */ false);
                bound.push(BoundAttribute.fromBoundElementProperty(bep, i18n));
            }
        });
        return { bound, literal };
    }
    parseAttribute(isTemplateElement, attribute, matchableAttributes, parsedProperties, boundEvents, variables, references) {
        const name = normalizeAttributeName(attribute.name);
        const value = attribute.value;
        const srcSpan = attribute.sourceSpan;
        const absoluteOffset = attribute.valueSpan
            ? attribute.valueSpan.start.offset
            : srcSpan.start.offset;
        function createKeySpan(srcSpan, prefix, identifier) {
            // We need to adjust the start location for the keySpan to account for the removed 'data-'
            // prefix from `normalizeAttributeName`.
            const normalizationAdjustment = attribute.name.length - name.length;
            const keySpanStart = srcSpan.start.moveBy(prefix.length + normalizationAdjustment);
            const keySpanEnd = keySpanStart.moveBy(identifier.length);
            return new ParseSourceSpan(keySpanStart, keySpanEnd, keySpanStart, identifier);
        }
        const bindParts = name.match(BIND_NAME_REGEXP);
        if (bindParts) {
            if (bindParts[KW_BIND_IDX] != null) {
                const identifier = bindParts[IDENT_KW_IDX];
                const keySpan = createKeySpan(srcSpan, bindParts[KW_BIND_IDX], identifier);
                this.bindingParser.parsePropertyBinding(identifier, value, false, false, srcSpan, absoluteOffset, attribute.valueSpan, matchableAttributes, parsedProperties, keySpan);
            }
            else if (bindParts[KW_LET_IDX]) {
                if (isTemplateElement) {
                    const identifier = bindParts[IDENT_KW_IDX];
                    const keySpan = createKeySpan(srcSpan, bindParts[KW_LET_IDX], identifier);
                    this.parseVariable(identifier, value, srcSpan, keySpan, attribute.valueSpan, variables);
                }
                else {
                    this.reportError(`"let-" is only supported on ng-template elements.`, srcSpan);
                }
            }
            else if (bindParts[KW_REF_IDX]) {
                const identifier = bindParts[IDENT_KW_IDX];
                const keySpan = createKeySpan(srcSpan, bindParts[KW_REF_IDX], identifier);
                this.parseReference(identifier, value, srcSpan, keySpan, attribute.valueSpan, references);
            }
            else if (bindParts[KW_ON_IDX]) {
                const events = [];
                const identifier = bindParts[IDENT_KW_IDX];
                const keySpan = createKeySpan(srcSpan, bindParts[KW_ON_IDX], identifier);
                this.bindingParser.parseEvent(identifier, value, 
                /* isAssignmentEvent */ false, srcSpan, attribute.valueSpan || srcSpan, matchableAttributes, events, keySpan);
                addEvents(events, boundEvents);
            }
            else if (bindParts[KW_BINDON_IDX]) {
                const identifier = bindParts[IDENT_KW_IDX];
                const keySpan = createKeySpan(srcSpan, bindParts[KW_BINDON_IDX], identifier);
                this.bindingParser.parsePropertyBinding(identifier, value, false, true, srcSpan, absoluteOffset, attribute.valueSpan, matchableAttributes, parsedProperties, keySpan);
                this.parseAssignmentEvent(identifier, value, srcSpan, attribute.valueSpan, matchableAttributes, boundEvents, keySpan);
            }
            else if (bindParts[KW_AT_IDX]) {
                const keySpan = createKeySpan(srcSpan, '', name);
                this.bindingParser.parseLiteralAttr(name, value, srcSpan, absoluteOffset, attribute.valueSpan, matchableAttributes, parsedProperties, keySpan);
            }
            return true;
        }
        // We didn't see a kw-prefixed property binding, but we have not yet checked
        // for the []/()/[()] syntax.
        let delims = null;
        if (name.startsWith(BINDING_DELIMS.BANANA_BOX.start)) {
            delims = BINDING_DELIMS.BANANA_BOX;
        }
        else if (name.startsWith(BINDING_DELIMS.PROPERTY.start)) {
            delims = BINDING_DELIMS.PROPERTY;
        }
        else if (name.startsWith(BINDING_DELIMS.EVENT.start)) {
            delims = BINDING_DELIMS.EVENT;
        }
        if (delims !== null &&
            // NOTE: older versions of the parser would match a start/end delimited
            // binding iff the property name was terminated by the ending delimiter
            // and the identifier in the binding was non-empty.
            // TODO(ayazhafiz): update this to handle malformed bindings.
            name.endsWith(delims.end) &&
            name.length > delims.start.length + delims.end.length) {
            const identifier = name.substring(delims.start.length, name.length - delims.end.length);
            const keySpan = createKeySpan(srcSpan, delims.start, identifier);
            if (delims.start === BINDING_DELIMS.BANANA_BOX.start) {
                this.bindingParser.parsePropertyBinding(identifier, value, false, true, srcSpan, absoluteOffset, attribute.valueSpan, matchableAttributes, parsedProperties, keySpan);
                this.parseAssignmentEvent(identifier, value, srcSpan, attribute.valueSpan, matchableAttributes, boundEvents, keySpan);
            }
            else if (delims.start === BINDING_DELIMS.PROPERTY.start) {
                this.bindingParser.parsePropertyBinding(identifier, value, false, false, srcSpan, absoluteOffset, attribute.valueSpan, matchableAttributes, parsedProperties, keySpan);
            }
            else {
                const events = [];
                this.bindingParser.parseEvent(identifier, value, 
                /* isAssignmentEvent */ false, srcSpan, attribute.valueSpan || srcSpan, matchableAttributes, events, keySpan);
                addEvents(events, boundEvents);
            }
            return true;
        }
        // No explicit binding found.
        const keySpan = createKeySpan(srcSpan, '' /* prefix */, name);
        const hasBinding = this.bindingParser.parsePropertyInterpolation(name, value, srcSpan, attribute.valueSpan, matchableAttributes, parsedProperties, keySpan, attribute.valueTokens ?? null);
        return hasBinding;
    }
    _visitTextWithInterpolation(value, sourceSpan, interpolatedTokens, i18n) {
        const valueNoNgsp = replaceNgsp(value);
        const expr = this.bindingParser.parseInterpolation(valueNoNgsp, sourceSpan, interpolatedTokens);
        return expr ? new BoundText(expr, sourceSpan, i18n) : new Text$3(valueNoNgsp, sourceSpan);
    }
    parseVariable(identifier, value, sourceSpan, keySpan, valueSpan, variables) {
        if (identifier.indexOf('-') > -1) {
            this.reportError(`"-" is not allowed in variable names`, sourceSpan);
        }
        else if (identifier.length === 0) {
            this.reportError(`Variable does not have a name`, sourceSpan);
        }
        variables.push(new Variable(identifier, value, sourceSpan, keySpan, valueSpan));
    }
    parseReference(identifier, value, sourceSpan, keySpan, valueSpan, references) {
        if (identifier.indexOf('-') > -1) {
            this.reportError(`"-" is not allowed in reference names`, sourceSpan);
        }
        else if (identifier.length === 0) {
            this.reportError(`Reference does not have a name`, sourceSpan);
        }
        else if (references.some((reference) => reference.name === identifier)) {
            this.reportError(`Reference "#${identifier}" is defined more than once`, sourceSpan);
        }
        references.push(new Reference$1(identifier, value, sourceSpan, keySpan, valueSpan));
    }
    parseAssignmentEvent(name, expression, sourceSpan, valueSpan, targetMatchableAttrs, boundEvents, keySpan) {
        const events = [];
        this.bindingParser.parseEvent(`${name}Change`, expression, 
        /* isAssignmentEvent */ true, sourceSpan, valueSpan || sourceSpan, targetMatchableAttrs, events, keySpan);
        addEvents(events, boundEvents);
    }
    reportError(message, sourceSpan, level = ParseErrorLevel.ERROR) {
        this.errors.push(new ParseError(sourceSpan, message, level));
    }
}
class NonBindableVisitor {
    visitElement(ast) {
        const preparsedElement = preparseElement(ast);
        if (preparsedElement.type === PreparsedElementType.SCRIPT ||
            preparsedElement.type === PreparsedElementType.STYLE ||
            preparsedElement.type === PreparsedElementType.STYLESHEET) {
            // Skipping <script> for security reasons
            // Skipping <style> and stylesheets as we already processed them
            // in the StyleCompiler
            return null;
        }
        const children = visitAll(this, ast.children, null);
        return new Element$1(ast.name, visitAll(this, ast.attrs), 
        /* inputs */ [], 
        /* outputs */ [], children, 
        /* references */ [], ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan);
    }
    visitComment(comment) {
        return null;
    }
    visitAttribute(attribute) {
        return new TextAttribute(attribute.name, attribute.value, attribute.sourceSpan, attribute.keySpan, attribute.valueSpan, attribute.i18n);
    }
    visitText(text) {
        return new Text$3(text.value, text.sourceSpan);
    }
    visitExpansion(expansion) {
        return null;
    }
    visitExpansionCase(expansionCase) {
        return null;
    }
    visitBlock(block, context) {
        const nodes = [
            // In an ngNonBindable context we treat the opening/closing tags of block as plain text.
            // This is the as if the `tokenizeBlocks` option was disabled.
            new Text$3(block.startSourceSpan.toString(), block.startSourceSpan),
            ...visitAll(this, block.children),
        ];
        if (block.endSourceSpan !== null) {
            nodes.push(new Text$3(block.endSourceSpan.toString(), block.endSourceSpan));
        }
        return nodes;
    }
    visitBlockParameter(parameter, context) {
        return null;
    }
    visitLetDeclaration(decl, context) {
        return new Text$3(`@let ${decl.name} = ${decl.value};`, decl.sourceSpan);
    }
}
const NON_BINDABLE_VISITOR = new NonBindableVisitor();
function normalizeAttributeName(attrName) {
    return /^data-/i.test(attrName) ? attrName.substring(5) : attrName;
}
function addEvents(events, boundEvents) {
    boundEvents.push(...events.map((e) => BoundEvent.fromParsedEvent(e)));
}
function textContents(node) {
    if (node.children.length !== 1 || !(node.children[0] instanceof Text)) {
        return null;
    }
    else {
        return node.children[0].value;
    }
}

const LEADING_TRIVIA_CHARS = [' ', '\n', '\r', '\t'];
/**
 * Parse a template into render3 `Node`s and additional metadata, with no other dependencies.
 *
 * @param template text of the template to parse
 * @param templateUrl URL to use for source mapping of the parsed template
 * @param options options to modify how the template is parsed
 */
function parseTemplate(template, templateUrl, options = {}) {
    const { interpolationConfig, preserveWhitespaces, enableI18nLegacyMessageIdFormat } = options;
    const bindingParser = makeBindingParser(interpolationConfig);
    const htmlParser = new HtmlParser();
    const parseResult = htmlParser.parse(template, templateUrl, {
        leadingTriviaChars: LEADING_TRIVIA_CHARS,
        ...options,
        tokenizeExpansionForms: true,
        tokenizeBlocks: options.enableBlockSyntax ?? true,
        tokenizeLet: options.enableLetSyntax ?? true,
    });
    if (!options.alwaysAttemptHtmlToR3AstConversion &&
        parseResult.errors &&
        parseResult.errors.length > 0) {
        const parsedTemplate = {
            interpolationConfig,
            preserveWhitespaces,
            errors: parseResult.errors,
            nodes: [],
            styleUrls: [],
            styles: [],
            ngContentSelectors: [],
        };
        if (options.collectCommentNodes) {
            parsedTemplate.commentNodes = [];
        }
        return parsedTemplate;
    }
    let rootNodes = parseResult.rootNodes;
    // We need to use the same `retainEmptyTokens` value for both parses to avoid
    // causing a mismatch when reusing source spans, even if the
    // `preserveSignificantWhitespace` behavior is different between the two
    // parses.
    const retainEmptyTokens = !(options.preserveSignificantWhitespace ?? true);
    // process i18n meta information (scan attributes, generate ids)
    // before we run whitespace removal process, because existing i18n
    // extraction process (ng extract-i18n) relies on a raw content to generate
    // message ids
    const i18nMetaVisitor = new I18nMetaVisitor(interpolationConfig, 
    /* keepI18nAttrs */ !preserveWhitespaces, enableI18nLegacyMessageIdFormat, 
    /* containerBlocks */ undefined, options.preserveSignificantWhitespace, retainEmptyTokens);
    const i18nMetaResult = i18nMetaVisitor.visitAllWithErrors(rootNodes);
    if (!options.alwaysAttemptHtmlToR3AstConversion &&
        i18nMetaResult.errors &&
        i18nMetaResult.errors.length > 0) {
        const parsedTemplate = {
            interpolationConfig,
            preserveWhitespaces,
            errors: i18nMetaResult.errors,
            nodes: [],
            styleUrls: [],
            styles: [],
            ngContentSelectors: [],
        };
        if (options.collectCommentNodes) {
            parsedTemplate.commentNodes = [];
        }
        return parsedTemplate;
    }
    rootNodes = i18nMetaResult.rootNodes;
    if (!preserveWhitespaces) {
        // Always preserve significant whitespace here because this is used to generate the `goog.getMsg`
        // and `$localize` calls which should retain significant whitespace in order to render the
        // correct output. We let this diverge from the message IDs generated earlier which might not
        // have preserved significant whitespace.
        //
        // This should use `visitAllWithSiblings` to set `WhitespaceVisitor` context correctly, however
        // there is an existing bug where significant whitespace is not properly retained in the JS
        // output of leading/trailing whitespace for ICU messages due to the existing lack of context\
        // in `WhitespaceVisitor`. Using `visitAllWithSiblings` here would fix that bug and retain the
        // whitespace, however it would also change the runtime representation which we don't want to do
        // right now.
        rootNodes = visitAll(new WhitespaceVisitor(
        /* preserveSignificantWhitespace */ true, 
        /* originalNodeMap */ undefined, 
        /* requireContext */ false), rootNodes);
        // run i18n meta visitor again in case whitespaces are removed (because that might affect
        // generated i18n message content) and first pass indicated that i18n content is present in a
        // template. During this pass i18n IDs generated at the first pass will be preserved, so we can
        // mimic existing extraction process (ng extract-i18n)
        if (i18nMetaVisitor.hasI18nMeta) {
            rootNodes = visitAll(new I18nMetaVisitor(interpolationConfig, 
            /* keepI18nAttrs */ false, 
            /* enableI18nLegacyMessageIdFormat */ undefined, 
            /* containerBlocks */ undefined, 
            /* preserveSignificantWhitespace */ true, retainEmptyTokens), rootNodes);
        }
    }
    const { nodes, errors, styleUrls, styles, ngContentSelectors, commentNodes } = htmlAstToRender3Ast(rootNodes, bindingParser, { collectCommentNodes: !!options.collectCommentNodes });
    errors.push(...parseResult.errors, ...i18nMetaResult.errors);
    const parsedTemplate = {
        interpolationConfig,
        preserveWhitespaces,
        errors: errors.length > 0 ? errors : null,
        nodes,
        styleUrls,
        styles,
        ngContentSelectors,
    };
    if (options.collectCommentNodes) {
        parsedTemplate.commentNodes = commentNodes;
    }
    return parsedTemplate;
}
const elementRegistry = new DomElementSchemaRegistry();
/**
 * Construct a `BindingParser` with a default configuration.
 */
function makeBindingParser(interpolationConfig = DEFAULT_INTERPOLATION_CONFIG) {
    return new BindingParser(new Parser(new Lexer()), interpolationConfig, elementRegistry, []);
}

const COMPONENT_VARIABLE = '%COMP%';
const HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`;
const CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;
function baseDirectiveFields(meta, constantPool, bindingParser) {
    const definitionMap = new DefinitionMap();
    const selectors = parseSelectorToR3Selector(meta.selector);
    // e.g. `type: MyDirective`
    definitionMap.set('type', meta.type.value);
    // e.g. `selectors: [['', 'someDir', '']]`
    if (selectors.length > 0) {
        definitionMap.set('selectors', asLiteral(selectors));
    }
    if (meta.queries.length > 0) {
        // e.g. `contentQueries: (rf, ctx, dirIndex) => { ... }
        definitionMap.set('contentQueries', createContentQueriesFunction(meta.queries, constantPool, meta.name));
    }
    if (meta.viewQueries.length) {
        definitionMap.set('viewQuery', createViewQueriesFunction(meta.viewQueries, constantPool, meta.name));
    }
    // e.g. `hostBindings: (rf, ctx) => { ... }
    definitionMap.set('hostBindings', createHostBindingsFunction(meta.host, meta.typeSourceSpan, bindingParser, constantPool, meta.selector || '', meta.name, definitionMap));
    // e.g 'inputs: {a: 'a'}`
    definitionMap.set('inputs', conditionallyCreateDirectiveBindingLiteral(meta.inputs, true));
    // e.g 'outputs: {a: 'a'}`
    definitionMap.set('outputs', conditionallyCreateDirectiveBindingLiteral(meta.outputs));
    if (meta.exportAs !== null) {
        definitionMap.set('exportAs', literalArr(meta.exportAs.map((e) => literal$1(e))));
    }
    if (meta.isStandalone === false) {
        definitionMap.set('standalone', literal$1(false));
    }
    if (meta.isSignal) {
        definitionMap.set('signals', literal$1(true));
    }
    return definitionMap;
}
/**
 * Add features to the definition map.
 */
function addFeatures(definitionMap, meta) {
    // e.g. `features: [NgOnChangesFeature]`
    const features = [];
    const providers = meta.providers;
    const viewProviders = meta.viewProviders;
    if (providers || viewProviders) {
        const args = [providers || new LiteralArrayExpr([])];
        if (viewProviders) {
            args.push(viewProviders);
        }
        features.push(importExpr(Identifiers.ProvidersFeature).callFn(args));
    }
    // Note: host directives feature needs to be inserted before the
    // inheritance feature to ensure the correct execution order.
    if (meta.hostDirectives?.length) {
        features.push(importExpr(Identifiers.HostDirectivesFeature)
            .callFn([createHostDirectivesFeatureArg(meta.hostDirectives)]));
    }
    if (meta.usesInheritance) {
        features.push(importExpr(Identifiers.InheritDefinitionFeature));
    }
    if (meta.fullInheritance) {
        features.push(importExpr(Identifiers.CopyDefinitionFeature));
    }
    if (meta.lifecycle.usesOnChanges) {
        features.push(importExpr(Identifiers.NgOnChangesFeature));
    }
    if ('externalStyles' in meta && meta.externalStyles?.length) {
        const externalStyleNodes = meta.externalStyles.map((externalStyle) => literal$1(externalStyle));
        features.push(importExpr(Identifiers.ExternalStylesFeature).callFn([literalArr(externalStyleNodes)]));
    }
    if (features.length) {
        definitionMap.set('features', literalArr(features));
    }
}
/**
 * Compile a directive for the render3 runtime as defined by the `R3DirectiveMetadata`.
 */
function compileDirectiveFromMetadata(meta, constantPool, bindingParser) {
    const definitionMap = baseDirectiveFields(meta, constantPool, bindingParser);
    addFeatures(definitionMap, meta);
    const expression = importExpr(Identifiers.defineDirective)
        .callFn([definitionMap.toLiteralMap()], undefined, true);
    const type = createDirectiveType(meta);
    return { expression, type, statements: [] };
}
/**
 * Compile a component for the render3 runtime as defined by the `R3ComponentMetadata`.
 */
function compileComponentFromMetadata(meta, constantPool, bindingParser) {
    const definitionMap = baseDirectiveFields(meta, constantPool, bindingParser);
    addFeatures(definitionMap, meta);
    const selector = meta.selector && CssSelector.parse(meta.selector);
    const firstSelector = selector && selector[0];
    // e.g. `attr: ["class", ".my.app"]`
    // This is optional an only included if the first selector of a component specifies attributes.
    if (firstSelector) {
        const selectorAttributes = firstSelector.getAttrs();
        if (selectorAttributes.length) {
            definitionMap.set('attrs', constantPool.getConstLiteral(literalArr(selectorAttributes.map((value) => value != null ? literal$1(value) : literal$1(undefined))), 
            /* forceShared */ true));
        }
    }
    // e.g. `template: function MyComponent_Template(_ctx, _cm) {...}`
    const templateTypeName = meta.name;
    let allDeferrableDepsFn = null;
    if (meta.defer.mode === 1 /* DeferBlockDepsEmitMode.PerComponent */ &&
        meta.defer.dependenciesFn !== null) {
        const fnName = `${templateTypeName}_DeferFn`;
        constantPool.statements.push(new DeclareVarStmt(fnName, meta.defer.dependenciesFn, undefined, exports.StmtModifier.Final));
        allDeferrableDepsFn = variable(fnName);
    }
    // First the template is ingested into IR:
    const tpl = ingestComponent(meta.name, meta.template.nodes, constantPool, meta.relativeContextFilePath, meta.i18nUseExternalIds, meta.defer, allDeferrableDepsFn, meta.relativeTemplatePath, getTemplateSourceLocationsEnabled());
    // Then the IR is transformed to prepare it for cod egeneration.
    transform(tpl, CompilationJobKind.Tmpl);
    // Finally we emit the template function:
    const templateFn = emitTemplateFn(tpl, constantPool);
    if (tpl.contentSelectors !== null) {
        definitionMap.set('ngContentSelectors', tpl.contentSelectors);
    }
    definitionMap.set('decls', literal$1(tpl.root.decls));
    definitionMap.set('vars', literal$1(tpl.root.vars));
    if (tpl.consts.length > 0) {
        if (tpl.constsInitializers.length > 0) {
            definitionMap.set('consts', arrowFn([], [...tpl.constsInitializers, new ReturnStatement(literalArr(tpl.consts))]));
        }
        else {
            definitionMap.set('consts', literalArr(tpl.consts));
        }
    }
    definitionMap.set('template', templateFn);
    if (meta.declarationListEmitMode !== 3 /* DeclarationListEmitMode.RuntimeResolved */ &&
        meta.declarations.length > 0) {
        definitionMap.set('dependencies', compileDeclarationList(literalArr(meta.declarations.map((decl) => decl.type)), meta.declarationListEmitMode));
    }
    else if (meta.declarationListEmitMode === 3 /* DeclarationListEmitMode.RuntimeResolved */) {
        const args = [meta.type.value];
        if (meta.rawImports) {
            args.push(meta.rawImports);
        }
        definitionMap.set('dependencies', importExpr(Identifiers.getComponentDepsFactory).callFn(args));
    }
    if (meta.encapsulation === null) {
        meta.encapsulation = exports.ViewEncapsulation.Emulated;
    }
    let hasStyles = !!meta.externalStyles?.length;
    // e.g. `styles: [str1, str2]`
    if (meta.styles && meta.styles.length) {
        const styleValues = meta.encapsulation == exports.ViewEncapsulation.Emulated
            ? compileStyles(meta.styles, CONTENT_ATTR, HOST_ATTR)
            : meta.styles;
        const styleNodes = styleValues.reduce((result, style) => {
            if (style.trim().length > 0) {
                result.push(constantPool.getConstLiteral(literal$1(style)));
            }
            return result;
        }, []);
        if (styleNodes.length > 0) {
            hasStyles = true;
            definitionMap.set('styles', literalArr(styleNodes));
        }
    }
    if (!hasStyles && meta.encapsulation === exports.ViewEncapsulation.Emulated) {
        // If there is no style, don't generate css selectors on elements
        meta.encapsulation = exports.ViewEncapsulation.None;
    }
    // Only set view encapsulation if it's not the default value
    if (meta.encapsulation !== exports.ViewEncapsulation.Emulated) {
        definitionMap.set('encapsulation', literal$1(meta.encapsulation));
    }
    // e.g. `animation: [trigger('123', [])]`
    if (meta.animations !== null) {
        definitionMap.set('data', literalMap([{ key: 'animation', value: meta.animations, quoted: false }]));
    }
    // Setting change detection flag
    if (meta.changeDetection !== null) {
        if (typeof meta.changeDetection === 'number' &&
            meta.changeDetection !== exports.ChangeDetectionStrategy.Default) {
            // changeDetection is resolved during analysis. Only set it if not the default.
            definitionMap.set('changeDetection', literal$1(meta.changeDetection));
        }
        else if (typeof meta.changeDetection === 'object') {
            // changeDetection is not resolved during analysis (e.g., we are in local compilation mode).
            // So place it as is.
            definitionMap.set('changeDetection', meta.changeDetection);
        }
    }
    const expression = importExpr(Identifiers.defineComponent)
        .callFn([definitionMap.toLiteralMap()], undefined, true);
    const type = createComponentType(meta);
    return { expression, type, statements: [] };
}
/**
 * Creates the type specification from the component meta. This type is inserted into .d.ts files
 * to be consumed by upstream compilations.
 */
function createComponentType(meta) {
    const typeParams = createBaseDirectiveTypeParams(meta);
    typeParams.push(stringArrayAsType(meta.template.ngContentSelectors));
    typeParams.push(expressionType(literal$1(meta.isStandalone)));
    typeParams.push(createHostDirectivesType(meta));
    // TODO(signals): Always include this metadata starting with v17. Right
    // now Angular v16.0.x does not support this field and library distributions
    // would then be incompatible with v16.0.x framework users.
    if (meta.isSignal) {
        typeParams.push(expressionType(literal$1(meta.isSignal)));
    }
    return expressionType(importExpr(Identifiers.ComponentDeclaration, typeParams));
}
/**
 * Compiles the array literal of declarations into an expression according to the provided emit
 * mode.
 */
function compileDeclarationList(list, mode) {
    switch (mode) {
        case 0 /* DeclarationListEmitMode.Direct */:
            // directives: [MyDir],
            return list;
        case 1 /* DeclarationListEmitMode.Closure */:
            // directives: function () { return [MyDir]; }
            return arrowFn([], list);
        case 2 /* DeclarationListEmitMode.ClosureResolved */:
            // directives: function () { return [MyDir].map(ng.resolveForwardRef); }
            const resolvedList = list.prop('map').callFn([importExpr(Identifiers.resolveForwardRef)]);
            return arrowFn([], resolvedList);
        case 3 /* DeclarationListEmitMode.RuntimeResolved */:
            throw new Error(`Unsupported with an array of pre-resolved dependencies`);
    }
}
function stringAsType(str) {
    return expressionType(literal$1(str));
}
function stringMapAsLiteralExpression(map) {
    const mapValues = Object.keys(map).map((key) => {
        const value = Array.isArray(map[key]) ? map[key][0] : map[key];
        return {
            key,
            value: literal$1(value),
            quoted: true,
        };
    });
    return literalMap(mapValues);
}
function stringArrayAsType(arr) {
    return arr.length > 0
        ? expressionType(literalArr(arr.map((value) => literal$1(value))))
        : NONE_TYPE;
}
function createBaseDirectiveTypeParams(meta) {
    // On the type side, remove newlines from the selector as it will need to fit into a TypeScript
    // string literal, which must be on one line.
    const selectorForType = meta.selector !== null ? meta.selector.replace(/\n/g, '') : null;
    return [
        typeWithParameters(meta.type.type, meta.typeArgumentCount),
        selectorForType !== null ? stringAsType(selectorForType) : NONE_TYPE,
        meta.exportAs !== null ? stringArrayAsType(meta.exportAs) : NONE_TYPE,
        expressionType(getInputsTypeExpression(meta)),
        expressionType(stringMapAsLiteralExpression(meta.outputs)),
        stringArrayAsType(meta.queries.map((q) => q.propertyName)),
    ];
}
function getInputsTypeExpression(meta) {
    return literalMap(Object.keys(meta.inputs).map((key) => {
        const value = meta.inputs[key];
        const values = [
            { key: 'alias', value: literal$1(value.bindingPropertyName), quoted: true },
            { key: 'required', value: literal$1(value.required), quoted: true },
        ];
        // TODO(legacy-partial-output-inputs): Consider always emitting this information,
        // or leaving it as is.
        if (value.isSignal) {
            values.push({ key: 'isSignal', value: literal$1(value.isSignal), quoted: true });
        }
        return { key, value: literalMap(values), quoted: true };
    }));
}
/**
 * Creates the type specification from the directive meta. This type is inserted into .d.ts files
 * to be consumed by upstream compilations.
 */
function createDirectiveType(meta) {
    const typeParams = createBaseDirectiveTypeParams(meta);
    // Directives have no NgContentSelectors slot, but instead express a `never` type
    // so that future fields align.
    typeParams.push(NONE_TYPE);
    typeParams.push(expressionType(literal$1(meta.isStandalone)));
    typeParams.push(createHostDirectivesType(meta));
    // TODO(signals): Always include this metadata starting with v17. Right
    // now Angular v16.0.x does not support this field and library distributions
    // would then be incompatible with v16.0.x framework users.
    if (meta.isSignal) {
        typeParams.push(expressionType(literal$1(meta.isSignal)));
    }
    return expressionType(importExpr(Identifiers.DirectiveDeclaration, typeParams));
}
// Return a host binding function or null if one is not necessary.
function createHostBindingsFunction(hostBindingsMetadata, typeSourceSpan, bindingParser, constantPool, selector, name, definitionMap) {
    const bindings = bindingParser.createBoundHostProperties(hostBindingsMetadata.properties, typeSourceSpan);
    // Calculate host event bindings
    const eventBindings = bindingParser.createDirectiveHostEventAsts(hostBindingsMetadata.listeners, typeSourceSpan);
    // The parser for host bindings treats class and style attributes specially -- they are
    // extracted into these separate fields. This is not the case for templates, so the compiler can
    // actually already handle these special attributes internally. Therefore, we just drop them
    // into the attributes map.
    if (hostBindingsMetadata.specialAttributes.styleAttr) {
        hostBindingsMetadata.attributes['style'] = literal$1(hostBindingsMetadata.specialAttributes.styleAttr);
    }
    if (hostBindingsMetadata.specialAttributes.classAttr) {
        hostBindingsMetadata.attributes['class'] = literal$1(hostBindingsMetadata.specialAttributes.classAttr);
    }
    const hostJob = ingestHostBinding({
        componentName: name,
        componentSelector: selector,
        properties: bindings,
        events: eventBindings,
        attributes: hostBindingsMetadata.attributes,
    }, bindingParser, constantPool);
    transform(hostJob, CompilationJobKind.Host);
    definitionMap.set('hostAttrs', hostJob.root.attributes);
    const varCount = hostJob.root.vars;
    if (varCount !== null && varCount > 0) {
        definitionMap.set('hostVars', literal$1(varCount));
    }
    return emitHostBindingFunction(hostJob);
}
const HOST_REG_EXP = /^(?:\[([^\]]+)\])|(?:\(([^\)]+)\))$/;
function parseHostBindings(host) {
    const attributes = {};
    const listeners = {};
    const properties = {};
    const specialAttributes = {};
    for (const key of Object.keys(host)) {
        const value = host[key];
        const matches = key.match(HOST_REG_EXP);
        if (matches === null) {
            switch (key) {
                case 'class':
                    if (typeof value !== 'string') {
                        // TODO(alxhub): make this a diagnostic.
                        throw new Error(`Class binding must be string`);
                    }
                    specialAttributes.classAttr = value;
                    break;
                case 'style':
                    if (typeof value !== 'string') {
                        // TODO(alxhub): make this a diagnostic.
                        throw new Error(`Style binding must be string`);
                    }
                    specialAttributes.styleAttr = value;
                    break;
                default:
                    if (typeof value === 'string') {
                        attributes[key] = literal$1(value);
                    }
                    else {
                        attributes[key] = value;
                    }
            }
        }
        else if (matches[1 /* HostBindingGroup.Binding */] != null) {
            if (typeof value !== 'string') {
                // TODO(alxhub): make this a diagnostic.
                throw new Error(`Property binding must be string`);
            }
            // synthetic properties (the ones that have a `@` as a prefix)
            // are still treated the same as regular properties. Therefore
            // there is no point in storing them in a separate map.
            properties[matches[1 /* HostBindingGroup.Binding */]] = value;
        }
        else if (matches[2 /* HostBindingGroup.Event */] != null) {
            if (typeof value !== 'string') {
                // TODO(alxhub): make this a diagnostic.
                throw new Error(`Event binding must be string`);
            }
            listeners[matches[2 /* HostBindingGroup.Event */]] = value;
        }
    }
    return { attributes, listeners, properties, specialAttributes };
}
/**
 * Verifies host bindings and returns the list of errors (if any). Empty array indicates that a
 * given set of host bindings has no errors.
 *
 * @param bindings set of host bindings to verify.
 * @param sourceSpan source span where host bindings were defined.
 * @returns array of errors associated with a given set of host bindings.
 */
function verifyHostBindings(bindings, sourceSpan) {
    // TODO: abstract out host bindings verification logic and use it instead of
    // creating events and properties ASTs to detect errors (FW-996)
    const bindingParser = makeBindingParser();
    bindingParser.createDirectiveHostEventAsts(bindings.listeners, sourceSpan);
    bindingParser.createBoundHostProperties(bindings.properties, sourceSpan);
    return bindingParser.errors;
}
function compileStyles(styles, selector, hostSelector) {
    const shadowCss = new ShadowCss();
    return styles.map((style) => {
        return shadowCss.shimCssText(style, selector, hostSelector);
    });
}
function createHostDirectivesType(meta) {
    if (!meta.hostDirectives?.length) {
        return NONE_TYPE;
    }
    return expressionType(literalArr(meta.hostDirectives.map((hostMeta) => literalMap([
        { key: 'directive', value: typeofExpr(hostMeta.directive.type), quoted: false },
        {
            key: 'inputs',
            value: stringMapAsLiteralExpression(hostMeta.inputs || {}),
            quoted: false,
        },
        {
            key: 'outputs',
            value: stringMapAsLiteralExpression(hostMeta.outputs || {}),
            quoted: false,
        },
    ]))));
}
function createHostDirectivesFeatureArg(hostDirectives) {
    const expressions = [];
    let hasForwardRef = false;
    for (const current of hostDirectives) {
        // Use a shorthand if there are no inputs or outputs.
        if (!current.inputs && !current.outputs) {
            expressions.push(current.directive.type);
        }
        else {
            const keys = [{ key: 'directive', value: current.directive.type, quoted: false }];
            if (current.inputs) {
                const inputsLiteral = createHostDirectivesMappingArray(current.inputs);
                if (inputsLiteral) {
                    keys.push({ key: 'inputs', value: inputsLiteral, quoted: false });
                }
            }
            if (current.outputs) {
                const outputsLiteral = createHostDirectivesMappingArray(current.outputs);
                if (outputsLiteral) {
                    keys.push({ key: 'outputs', value: outputsLiteral, quoted: false });
                }
            }
            expressions.push(literalMap(keys));
        }
        if (current.isForwardReference) {
            hasForwardRef = true;
        }
    }
    // If there's a forward reference, we generate a `function() { return [HostDir] }`,
    // otherwise we can save some bytes by using a plain array, e.g. `[HostDir]`.
    return hasForwardRef
        ? new FunctionExpr([], [new ReturnStatement(literalArr(expressions))])
        : literalArr(expressions);
}
/**
 * Converts an input/output mapping object literal into an array where the even keys are the
 * public name of the binding and the odd ones are the name it was aliased to. E.g.
 * `{inputOne: 'aliasOne', inputTwo: 'aliasTwo'}` will become
 * `['inputOne', 'aliasOne', 'inputTwo', 'aliasTwo']`.
 *
 * This conversion is necessary, because hosts bind to the public name of the host directive and
 * keeping the mapping in an object literal will break for apps using property renaming.
 */
function createHostDirectivesMappingArray(mapping) {
    const elements = [];
    for (const publicName in mapping) {
        if (mapping.hasOwnProperty(publicName)) {
            elements.push(literal$1(publicName), literal$1(mapping[publicName]));
        }
    }
    return elements.length > 0 ? literalArr(elements) : null;
}
/**
 * Compiles the dependency resolver function for a defer block.
 */
function compileDeferResolverFunction(meta) {
    const depExpressions = [];
    if (meta.mode === 0 /* DeferBlockDepsEmitMode.PerBlock */) {
        for (const dep of meta.dependencies) {
            if (dep.isDeferrable) {
                // Callback function, e.g. `m () => m.MyCmp;`.
                const innerFn = arrowFn(
                // Default imports are always accessed through the `default` property.
                [new FnParam('m', DYNAMIC_TYPE)], variable('m').prop(dep.isDefaultImport ? 'default' : dep.symbolName));
                // Dynamic import, e.g. `import('./a').then(...)`.
                const importExpr = new DynamicImportExpr(dep.importPath).prop('then').callFn([innerFn]);
                depExpressions.push(importExpr);
            }
            else {
                // Non-deferrable symbol, just use a reference to the type. Note that it's important to
                // go through `typeReference`, rather than `symbolName` in order to preserve the
                // original reference within the source file.
                depExpressions.push(dep.typeReference);
            }
        }
    }
    else {
        for (const { symbolName, importPath, isDefaultImport } of meta.dependencies) {
            // Callback function, e.g. `m () => m.MyCmp;`.
            const innerFn = arrowFn([new FnParam('m', DYNAMIC_TYPE)], variable('m').prop(isDefaultImport ? 'default' : symbolName));
            // Dynamic import, e.g. `import('./a').then(...)`.
            const importExpr = new DynamicImportExpr(importPath).prop('then').callFn([innerFn]);
            depExpressions.push(importExpr);
        }
    }
    return arrowFn([], literalArr(depExpressions));
}

/**
 * Processes `Target`s with a given set of directives and performs a binding operation, which
 * returns an object similar to TypeScript's `ts.TypeChecker` that contains knowledge about the
 * target.
 */
class R3TargetBinder {
    directiveMatcher;
    constructor(directiveMatcher) {
        this.directiveMatcher = directiveMatcher;
    }
    /**
     * Perform a binding operation on the given `Target` and return a `BoundTarget` which contains
     * metadata about the types referenced in the template.
     */
    bind(target) {
        if (!target.template) {
            throw new Error('Empty bound targets are not supported');
        }
        const directives = new Map();
        const eagerDirectives = [];
        const bindings = new Map();
        const references = new Map();
        const scopedNodeEntities = new Map();
        const expressions = new Map();
        const symbols = new Map();
        const nestingLevel = new Map();
        const usedPipes = new Set();
        const eagerPipes = new Set();
        const deferBlocks = [];
        if (target.template) {
            // First, parse the template into a `Scope` structure. This operation captures the syntactic
            // scopes in the template and makes them available for later use.
            const scope = Scope$1.apply(target.template);
            // Use the `Scope` to extract the entities present at every level of the template.
            extractScopedNodeEntities(scope, scopedNodeEntities);
            // Next, perform directive matching on the template using the `DirectiveBinder`. This returns:
            //   - directives: Map of nodes (elements & ng-templates) to the directives on them.
            //   - bindings: Map of inputs, outputs, and attributes to the directive/element that claims
            //     them. TODO(alxhub): handle multiple directives claiming an input/output/etc.
            //   - references: Map of #references to their targets.
            DirectiveBinder.apply(target.template, this.directiveMatcher, directives, eagerDirectives, bindings, references);
            // Finally, run the TemplateBinder to bind references, variables, and other entities within the
            // template. This extracts all the metadata that doesn't depend on directive matching.
            TemplateBinder.applyWithScope(target.template, scope, expressions, symbols, nestingLevel, usedPipes, eagerPipes, deferBlocks);
        }
        return new R3BoundTarget(target, directives, eagerDirectives, bindings, references, expressions, symbols, nestingLevel, scopedNodeEntities, usedPipes, eagerPipes, deferBlocks);
    }
}
/**
 * Represents a binding scope within a template.
 *
 * Any variables, references, or other named entities declared within the template will
 * be captured and available by name in `namedEntities`. Additionally, child templates will
 * be analyzed and have their child `Scope`s available in `childScopes`.
 */
let Scope$1 = class Scope {
    parentScope;
    rootNode;
    /**
     * Named members of the `Scope`, such as `Reference`s or `Variable`s.
     */
    namedEntities = new Map();
    /**
     * Set of elements that belong to this scope.
     */
    elementsInScope = new Set();
    /**
     * Child `Scope`s for immediately nested `ScopedNode`s.
     */
    childScopes = new Map();
    /** Whether this scope is deferred or if any of its ancestors are deferred. */
    isDeferred;
    constructor(parentScope, rootNode) {
        this.parentScope = parentScope;
        this.rootNode = rootNode;
        this.isDeferred =
            parentScope !== null && parentScope.isDeferred ? true : rootNode instanceof DeferredBlock;
    }
    static newRootScope() {
        return new Scope(null, null);
    }
    /**
     * Process a template (either as a `Template` sub-template with variables, or a plain array of
     * template `Node`s) and construct its `Scope`.
     */
    static apply(template) {
        const scope = Scope.newRootScope();
        scope.ingest(template);
        return scope;
    }
    /**
     * Internal method to process the scoped node and populate the `Scope`.
     */
    ingest(nodeOrNodes) {
        if (nodeOrNodes instanceof Template) {
            // Variables on an <ng-template> are defined in the inner scope.
            nodeOrNodes.variables.forEach((node) => this.visitVariable(node));
            // Process the nodes of the template.
            nodeOrNodes.children.forEach((node) => node.visit(this));
        }
        else if (nodeOrNodes instanceof IfBlockBranch) {
            if (nodeOrNodes.expressionAlias !== null) {
                this.visitVariable(nodeOrNodes.expressionAlias);
            }
            nodeOrNodes.children.forEach((node) => node.visit(this));
        }
        else if (nodeOrNodes instanceof ForLoopBlock) {
            this.visitVariable(nodeOrNodes.item);
            nodeOrNodes.contextVariables.forEach((v) => this.visitVariable(v));
            nodeOrNodes.children.forEach((node) => node.visit(this));
        }
        else if (nodeOrNodes instanceof SwitchBlockCase ||
            nodeOrNodes instanceof ForLoopBlockEmpty ||
            nodeOrNodes instanceof DeferredBlock ||
            nodeOrNodes instanceof DeferredBlockError ||
            nodeOrNodes instanceof DeferredBlockPlaceholder ||
            nodeOrNodes instanceof DeferredBlockLoading ||
            nodeOrNodes instanceof Content) {
            nodeOrNodes.children.forEach((node) => node.visit(this));
        }
        else {
            // No overarching `Template` instance, so process the nodes directly.
            nodeOrNodes.forEach((node) => node.visit(this));
        }
    }
    visitElement(element) {
        // `Element`s in the template may have `Reference`s which are captured in the scope.
        element.references.forEach((node) => this.visitReference(node));
        // Recurse into the `Element`'s children.
        element.children.forEach((node) => node.visit(this));
        this.elementsInScope.add(element);
    }
    visitTemplate(template) {
        // References on a <ng-template> are defined in the outer scope, so capture them before
        // processing the template's child scope.
        template.references.forEach((node) => this.visitReference(node));
        // Next, create an inner scope and process the template within it.
        this.ingestScopedNode(template);
    }
    visitVariable(variable) {
        // Declare the variable if it's not already.
        this.maybeDeclare(variable);
    }
    visitReference(reference) {
        // Declare the variable if it's not already.
        this.maybeDeclare(reference);
    }
    visitDeferredBlock(deferred) {
        this.ingestScopedNode(deferred);
        deferred.placeholder?.visit(this);
        deferred.loading?.visit(this);
        deferred.error?.visit(this);
    }
    visitDeferredBlockPlaceholder(block) {
        this.ingestScopedNode(block);
    }
    visitDeferredBlockError(block) {
        this.ingestScopedNode(block);
    }
    visitDeferredBlockLoading(block) {
        this.ingestScopedNode(block);
    }
    visitSwitchBlock(block) {
        block.cases.forEach((node) => node.visit(this));
    }
    visitSwitchBlockCase(block) {
        this.ingestScopedNode(block);
    }
    visitForLoopBlock(block) {
        this.ingestScopedNode(block);
        block.empty?.visit(this);
    }
    visitForLoopBlockEmpty(block) {
        this.ingestScopedNode(block);
    }
    visitIfBlock(block) {
        block.branches.forEach((node) => node.visit(this));
    }
    visitIfBlockBranch(block) {
        this.ingestScopedNode(block);
    }
    visitContent(content) {
        this.ingestScopedNode(content);
    }
    visitLetDeclaration(decl) {
        this.maybeDeclare(decl);
    }
    // Unused visitors.
    visitBoundAttribute(attr) { }
    visitBoundEvent(event) { }
    visitBoundText(text) { }
    visitText(text) { }
    visitTextAttribute(attr) { }
    visitIcu(icu) { }
    visitDeferredTrigger(trigger) { }
    visitUnknownBlock(block) { }
    maybeDeclare(thing) {
        // Declare something with a name, as long as that name isn't taken.
        if (!this.namedEntities.has(thing.name)) {
            this.namedEntities.set(thing.name, thing);
        }
    }
    /**
     * Look up a variable within this `Scope`.
     *
     * This can recurse into a parent `Scope` if it's available.
     */
    lookup(name) {
        if (this.namedEntities.has(name)) {
            // Found in the local scope.
            return this.namedEntities.get(name);
        }
        else if (this.parentScope !== null) {
            // Not in the local scope, but there's a parent scope so check there.
            return this.parentScope.lookup(name);
        }
        else {
            // At the top level and it wasn't found.
            return null;
        }
    }
    /**
     * Get the child scope for a `ScopedNode`.
     *
     * This should always be defined.
     */
    getChildScope(node) {
        const res = this.childScopes.get(node);
        if (res === undefined) {
            throw new Error(`Assertion error: child scope for ${node} not found`);
        }
        return res;
    }
    ingestScopedNode(node) {
        const scope = new Scope(this, node);
        scope.ingest(node);
        this.childScopes.set(node, scope);
    }
};
/**
 * Processes a template and matches directives on nodes (elements and templates).
 *
 * Usually used via the static `apply()` method.
 */
class DirectiveBinder {
    matcher;
    directives;
    eagerDirectives;
    bindings;
    references;
    // Indicates whether we are visiting elements within a `defer` block
    isInDeferBlock = false;
    constructor(matcher, directives, eagerDirectives, bindings, references) {
        this.matcher = matcher;
        this.directives = directives;
        this.eagerDirectives = eagerDirectives;
        this.bindings = bindings;
        this.references = references;
    }
    /**
     * Process a template (list of `Node`s) and perform directive matching against each node.
     *
     * @param template the list of template `Node`s to match (recursively).
     * @param selectorMatcher a `SelectorMatcher` containing the directives that are in scope for
     * this template.
     * @returns three maps which contain information about directives in the template: the
     * `directives` map which lists directives matched on each node, the `bindings` map which
     * indicates which directives claimed which bindings (inputs, outputs, etc), and the `references`
     * map which resolves #references (`Reference`s) within the template to the named directive or
     * template node.
     */
    static apply(template, selectorMatcher, directives, eagerDirectives, bindings, references) {
        const matcher = new DirectiveBinder(selectorMatcher, directives, eagerDirectives, bindings, references);
        matcher.ingest(template);
    }
    ingest(template) {
        template.forEach((node) => node.visit(this));
    }
    visitElement(element) {
        this.visitElementOrTemplate(element);
    }
    visitTemplate(template) {
        this.visitElementOrTemplate(template);
    }
    visitElementOrTemplate(node) {
        // First, determine the HTML shape of the node for the purpose of directive matching.
        // Do this by building up a `CssSelector` for the node.
        const cssSelector = createCssSelectorFromNode(node);
        // Next, use the `SelectorMatcher` to get the list of directives on the node.
        const directives = [];
        this.matcher.match(cssSelector, (_selector, results) => directives.push(...results));
        if (directives.length > 0) {
            this.directives.set(node, directives);
            if (!this.isInDeferBlock) {
                this.eagerDirectives.push(...directives);
            }
        }
        // Resolve any references that are created on this node.
        node.references.forEach((ref) => {
            let dirTarget = null;
            // If the reference expression is empty, then it matches the "primary" directive on the node
            // (if there is one). Otherwise it matches the host node itself (either an element or
            // <ng-template> node).
            if (ref.value.trim() === '') {
                // This could be a reference to a component if there is one.
                dirTarget = directives.find((dir) => dir.isComponent) || null;
            }
            else {
                // This should be a reference to a directive exported via exportAs.
                dirTarget =
                    directives.find((dir) => dir.exportAs !== null && dir.exportAs.some((value) => value === ref.value)) || null;
                // Check if a matching directive was found.
                if (dirTarget === null) {
                    // No matching directive was found - this reference points to an unknown target. Leave it
                    // unmapped.
                    return;
                }
            }
            if (dirTarget !== null) {
                // This reference points to a directive.
                this.references.set(ref, { directive: dirTarget, node });
            }
            else {
                // This reference points to the node itself.
                this.references.set(ref, node);
            }
        });
        const setAttributeBinding = (attribute, ioType) => {
            const dir = directives.find((dir) => dir[ioType].hasBindingPropertyName(attribute.name));
            const binding = dir !== undefined ? dir : node;
            this.bindings.set(attribute, binding);
        };
        // Node inputs (bound attributes) and text attributes can be bound to an
        // input on a directive.
        node.inputs.forEach((input) => setAttributeBinding(input, 'inputs'));
        node.attributes.forEach((attr) => setAttributeBinding(attr, 'inputs'));
        if (node instanceof Template) {
            node.templateAttrs.forEach((attr) => setAttributeBinding(attr, 'inputs'));
        }
        // Node outputs (bound events) can be bound to an output on a directive.
        node.outputs.forEach((output) => setAttributeBinding(output, 'outputs'));
        // Recurse into the node's children.
        node.children.forEach((child) => child.visit(this));
    }
    visitDeferredBlock(deferred) {
        const wasInDeferBlock = this.isInDeferBlock;
        this.isInDeferBlock = true;
        deferred.children.forEach((child) => child.visit(this));
        this.isInDeferBlock = wasInDeferBlock;
        deferred.placeholder?.visit(this);
        deferred.loading?.visit(this);
        deferred.error?.visit(this);
    }
    visitDeferredBlockPlaceholder(block) {
        block.children.forEach((child) => child.visit(this));
    }
    visitDeferredBlockError(block) {
        block.children.forEach((child) => child.visit(this));
    }
    visitDeferredBlockLoading(block) {
        block.children.forEach((child) => child.visit(this));
    }
    visitSwitchBlock(block) {
        block.cases.forEach((node) => node.visit(this));
    }
    visitSwitchBlockCase(block) {
        block.children.forEach((node) => node.visit(this));
    }
    visitForLoopBlock(block) {
        block.item.visit(this);
        block.contextVariables.   forEach((v) => v.visit(this));
        block.children.forEach((node) => node.visit(this));
        block.empty?.visit(this);
    }
    visitForLoopBlockEmpty(block) {
        block.children.forEach((node) => node.visit(this));
    }
    visitIfBlock(block) {
        block.branches.forEach((node) => node.visit(this));
    }
    visitIfBlockBranch(block) {
        block.expressionAlias?.visit(this);
        block.children.forEach((node) => node.visit(this));
    }
    visitContent(content) {
        content.children.forEach((child) => child.visit(this));
    }
    // Unused visitors.
    visitVariable(variable) { }
    visitReference(reference) { }
    visitTextAttribute(attribute) { }
    visitBoundAttribute(attribute) { }
    visitBoundEvent(attribute) { }
    visitBoundAttributeOrEvent(node) { }
    visitText(text) { }
    visitBoundText(text) { }
    visitIcu(icu) { }
    visitDeferredTrigger(trigger) { }
    visitUnknownBlock(block) { }
    visitLetDeclaration(decl) { }
}
/**
 * Processes a template and extract metadata about expressions and symbols within.
 *
 * This is a companion to the `DirectiveBinder` that doesn't require knowledge of directives matched
 * within the template in order to operate.
 *
 * Expressions are visited by the superclass `RecursiveAstVisitor`, with custom logic provided
 * by overridden methods from that visitor.
 */
class TemplateBinder extends RecursiveAstVisitor {
    bindings;
    symbols;
    usedPipes;
    eagerPipes;
    deferBlocks;
    nestingLevel;
    scope;
    rootNode;
    level;
    visitNode;
    constructor(bindings, symbols, usedPipes, eagerPipes, deferBlocks, nestingLevel, scope, rootNode, level) {
        super();
        this.bindings = bindings;
        this.symbols = symbols;
        this.usedPipes = usedPipes;
        this.eagerPipes = eagerPipes;
        this.deferBlocks = deferBlocks;
        this.nestingLevel = nestingLevel;
        this.scope = scope;
        this.rootNode = rootNode;
        this.level = level;
        // Save a bit of processing time by constructing this closure in advance.
        this.visitNode = (node) => node.visit(this);
    }
    // This method is defined to reconcile the type of TemplateBinder since both
    // RecursiveAstVisitor and Visitor define the visit() method in their
    // interfaces.
    visit(node, context) {
        if (node instanceof AST) {
            node.visit(this, context);
        }
        else {
            node.visit(this);
        }
    }
    /**
     * Process a template and extract metadata about expressions and symbols within.
     *
     * @param nodes the nodes of the template to process
     * @param scope the `Scope` of the template being processed.
     * @returns three maps which contain metadata about the template: `expressions` which interprets
     * special `AST` nodes in expressions as pointing to references or variables declared within the
     * template, `symbols` which maps those variables and references to the nested `Template` which
     * declares them, if any, and `nestingLevel` which associates each `Template` with a integer
     * nesting level (how many levels deep within the template structure the `Template` is), starting
     * at 1.
     */
    static applyWithScope(nodes, scope, expressions, symbols, nestingLevel, usedPipes, eagerPipes, deferBlocks) {
        const template = nodes instanceof Template ? nodes : null;
        // The top-level template has nesting level 0.
        const binder = new TemplateBinder(expressions, symbols, usedPipes, eagerPipes, deferBlocks, nestingLevel, scope, template, 0);
        binder.ingest(nodes);
    }
    ingest(nodeOrNodes) {
        if (nodeOrNodes instanceof Template) {
            // For <ng-template>s, process only variables and child nodes. Inputs, outputs, templateAttrs,
            // and references were all processed in the scope of the containing template.
            nodeOrNodes.variables.forEach(this.visitNode);
            nodeOrNodes.children.forEach(this.visitNode);
            // Set the nesting level.
            this.nestingLevel.set(nodeOrNodes, this.level);
        }
        else if (nodeOrNodes instanceof IfBlockBranch) {
            if (nodeOrNodes.expressionAlias !== null) {
                this.visitNode(nodeOrNodes.expressionAlias);
            }
            nodeOrNodes.children.forEach(this.visitNode);
            this.nestingLevel.set(nodeOrNodes, this.level);
        }
        else if (nodeOrNodes instanceof ForLoopBlock) {
            this.visitNode(nodeOrNodes.item);
            nodeOrNodes.contextVariables.forEach((v) => this.visitNode(v));
            nodeOrNodes.trackBy.visit(this);
            nodeOrNodes.children.forEach(this.visitNode);
            this.nestingLevel.set(nodeOrNodes, this.level);
        }
        else if (nodeOrNodes instanceof DeferredBlock) {
            if (this.scope.rootNode !== nodeOrNodes) {
                throw new Error(`Assertion error: resolved incorrect scope for deferred block ${nodeOrNodes}`);
            }
            this.deferBlocks.push([nodeOrNodes, this.scope]);
            nodeOrNodes.children.forEach((node) => node.visit(this));
            this.nestingLevel.set(nodeOrNodes, this.level);
        }
        else if (nodeOrNodes instanceof SwitchBlockCase ||
            nodeOrNodes instanceof ForLoopBlockEmpty ||
            nodeOrNodes instanceof DeferredBlockError ||
            nodeOrNodes instanceof DeferredBlockPlaceholder ||
            nodeOrNodes instanceof DeferredBlockLoading ||
            nodeOrNodes instanceof Content) {
            nodeOrNodes.children.forEach((node) => node.visit(this));
            this.nestingLevel.set(nodeOrNodes, this.level);
        }
        else {
            // Visit each node from the top-level template.
            nodeOrNodes.forEach(this.visitNode);
        }
    }
    visitElement(element) {
        // Visit the inputs, outputs, and children of the element.
        element.inputs.forEach(this.visitNode);
        element.outputs.forEach(this.visitNode);
        element.children.forEach(this.visitNode);
        element.references.forEach(this.visitNode);
    }
    visitTemplate(template) {
        // First, visit inputs, outputs and template attributes of the template node.
        template.inputs.forEach(this.visitNode);
        template.outputs.forEach(this.visitNode);
        template.templateAttrs.forEach(this.visitNode);
        template.references.forEach(this.visitNode);
        // Next, recurse into the template.
        this.ingestScopedNode(template);
    }
    visitVariable(variable) {
        // Register the `Variable` as a symbol in the current `Template`.
        if (this.rootNode !== null) {
            this.symbols.set(variable, this.rootNode);
        }
    }
    visitReference(reference) {
        // Register the `Reference` as a symbol in the current `Template`.
        if (this.rootNode !== null) {
            this.symbols.set(reference, this.rootNode);
        }
    }
    // Unused template visitors
    visitText(text) { }
    visitTextAttribute(attribute) { }
    visitUnknownBlock(block) { }
    visitDeferredTrigger() { }
    visitIcu(icu) {
        Object.keys(icu.vars).forEach((key) => icu.vars[key].visit(this));
        Object.keys(icu.placeholders).forEach((key) => icu.placeholders[key].visit(this));
    }
    // The remaining visitors are concerned with processing AST expressions within template bindings
    visitBoundAttribute(attribute) {
        attribute.value.visit(this);
    }
    visitBoundEvent(event) {
        event.handler.visit(this);
    }
    visitDeferredBlock(deferred) {
        this.ingestScopedNode(deferred);
        deferred.triggers.when?.value.visit(this);
        deferred.prefetchTriggers.when?.value.visit(this);
        deferred.hydrateTriggers.when?.value.visit(this);
        deferred.hydrateTriggers.never?.visit(this);
        deferred.placeholder && this.visitNode(deferred.placeholder);
        deferred.loading && this.visitNode(deferred.loading);
        deferred.error && this.visitNode(deferred.error);
    }
    visitDeferredBlockPlaceholder(block) {
        this.ingestScopedNode(block);
    }
    visitDeferredBlockError(block) {
        this.ingestScopedNode(block);
    }
    visitDeferredBlockLoading(block) {
        this.ingestScopedNode(block);
    }
    visitSwitchBlock(block) {
        block.expression.visit(this);
        block.cases.forEach(this.visitNode);
    }
    visitSwitchBlockCase(block) {
        block.expression?.visit(this);
        this.ingestScopedNode(block);
    }
    visitForLoopBlock(block) {
        block.expression.visit(this);
        this.ingestScopedNode(block);
        block.empty?.visit(this);
    }
    visitForLoopBlockEmpty(block) {
        this.ingestScopedNode(block);
    }
    visitIfBlock(block) {
        block.branches.forEach((node) => node.visit(this));
    }
    visitIfBlockBranch(block) {
        block.expression?.visit(this);
        this.ingestScopedNode(block);
    }
    visitContent(content) {
        this.ingestScopedNode(content);
    }
    visitBoundText(text) {
        text.value.visit(this);
    }
    visitLetDeclaration(decl) {
        decl.value.visit(this);
        if (this.rootNode !== null) {
            this.symbols.set(decl, this.rootNode);
        }
    }
    visitPipe(ast, context) {
        this.usedPipes.add(ast.name);
        if (!this.scope.isDeferred) {
            this.eagerPipes.add(ast.name);
        }
        return super.visitPipe(ast, context);
    }
    // These five types of AST expressions can refer to expression roots, which could be variables
    // or references in the current scope.
    visitPropertyRead(ast, context) {
        this.maybeMap(ast, ast.name);
        return super.visitPropertyRead(ast, context);
    }
    visitSafePropertyRead(ast, context) {
        this.maybeMap(ast, ast.name);
        return super.visitSafePropertyRead(ast, context);
    }
    visitPropertyWrite(ast, context) {
        this.maybeMap(ast, ast.name);
        return super.visitPropertyWrite(ast, context);
    }
    ingestScopedNode(node) {
        const childScope = this.scope.getChildScope(node);
        const binder = new TemplateBinder(this.bindings, this.symbols, this.usedPipes, this.eagerPipes, this.deferBlocks, this.nestingLevel, childScope, node, this.level + 1);
        binder.ingest(node);
    }
    maybeMap(ast, name) {
        // If the receiver of the expression isn't the `ImplicitReceiver`, this isn't the root of an
        // `AST` expression that maps to a `Variable` or `Reference`.
        if (!(ast.receiver instanceof ImplicitReceiver) || ast.receiver instanceof ThisReceiver) {
            return;
        }
        // Check whether the name exists in the current scope. If so, map it. Otherwise, the name is
        // probably a property on the top-level component context.
        const target = this.scope.lookup(name);
        if (target !== null) {
            this.bindings.set(ast, target);
        }
    }
}
/**
 * Metadata container for a `Target` that allows queries for specific bits of metadata.
 *
 * See `BoundTarget` for documentation on the individual methods.
 */
class R3BoundTarget {
    target;
    directives;
    eagerDirectives;
    bindings;
    references;
    exprTargets;
    symbols;
    nestingLevel;
    scopedNodeEntities;
    usedPipes;
    eagerPipes;
    /** Deferred blocks, ordered as they appear in the template. */
    deferredBlocks;
    /** Map of deferred blocks to their scope. */
    deferredScopes;
    constructor(target, directives, eagerDirectives, bindings, references, exprTargets, symbols, nestingLevel, scopedNodeEntities, usedPipes, eagerPipes, rawDeferred) {
        this.target = target;
        this.directives = directives;
        this.eagerDirectives = eagerDirectives;
        this.bindings = bindings;
        this.references = references;
        this.exprTargets = exprTargets;
        this.symbols = symbols;
        this.nestingLevel = nestingLevel;
        this.scopedNodeEntities = scopedNodeEntities;
        this.usedPipes = usedPipes;
        this.eagerPipes = eagerPipes;
        this.deferredBlocks = rawDeferred.map((current) => current[0]);
        this.deferredScopes = new Map(rawDeferred);
    }
    getEntitiesInScope(node) {
        return this.scopedNodeEntities.get(node) ?? new Set();
    }
    getDirectivesOfNode(node) {
        return this.directives.get(node) || null;
    }
    getReferenceTarget(ref) {
        return this.references.get(ref) || null;
    }
    getConsumerOfBinding(binding) {
        return this.bindings.get(binding) || null;
    }
    getExpressionTarget(expr) {
        return this.exprTargets.get(expr) || null;
    }
    getDefinitionNodeOfSymbol(symbol) {
        return this.symbols.get(symbol) || null;
    }
    getNestingLevel(node) {
        return this.nestingLevel.get(node) || 0;
    }
    getUsedDirectives() {
        const set = new Set();
        this.directives.forEach((dirs) => dirs.forEach((dir) => set.add(dir)));
        return Array.from(set.values());
    }
    getEagerlyUsedDirectives() {
        const set = new Set(this.eagerDirectives);
        return Array.from(set.values());
    }
    getUsedPipes() {
        return Array.from(this.usedPipes);
    }
    getEagerlyUsedPipes() {
        return Array.from(this.eagerPipes);
    }
    getDeferBlocks() {
        return this.deferredBlocks;
    }
    getDeferredTriggerTarget(block, trigger) {
        // Only triggers that refer to DOM nodes can be resolved.
        if (!(trigger instanceof InteractionDeferredTrigger) &&
            !(trigger instanceof ViewportDeferredTrigger) &&
            !(trigger instanceof HoverDeferredTrigger)) {
            return null;
        }
        const name = trigger.reference;
        if (name === null) {
            let trigger = null;
            if (block.placeholder !== null) {
                for (const child of block.placeholder.children) {
                    // Skip over comment nodes. Currently by default the template parser doesn't capture
                    // comments, but we have a safeguard here just in case since it can be enabled.
                    if (child instanceof Comment$1) {
                        continue;
                    }
                    // We can only infer the trigger if there's one root element node. Any other
                    // nodes at the root make it so that we can't infer the trigger anymore.
                    if (trigger !== null) {
                        return null;
                    }
                    if (child instanceof Element$1) {
                        trigger = child;
                    }
                }
            }
            return trigger;
        }
        const outsideRef = this.findEntityInScope(block, name);
        // First try to resolve the target in the scope of the main deferred block. Note that we
        // skip triggers defined inside the main block itself, because they might not exist yet.
        if (outsideRef instanceof Reference$1 && this.getDefinitionNodeOfSymbol(outsideRef) !== block) {
            const target = this.getReferenceTarget(outsideRef);
            if (target !== null) {
                return this.referenceTargetToElement(target);
            }
        }
        // If the trigger couldn't be found in the main block, check the
        // placeholder block which is shown before the main block has loaded.
        if (block.placeholder !== null) {
            const refInPlaceholder = this.findEntityInScope(block.placeholder, name);
            const targetInPlaceholder = refInPlaceholder instanceof Reference$1 ? this.getReferenceTarget(refInPlaceholder) : null;
            if (targetInPlaceholder !== null) {
                return this.referenceTargetToElement(targetInPlaceholder);
            }
        }
        return null;
    }
    isDeferred(element) {
        for (const block of this.deferredBlocks) {
            if (!this.deferredScopes.has(block)) {
                continue;
            }
            const stack = [this.deferredScopes.get(block)];
            while (stack.length > 0) {
                const current = stack.pop();
                if (current.elementsInScope.has(element)) {
                    return true;
                }
                stack.push(...current.childScopes.values());
            }
        }
        return false;
    }
    /**
     * Finds an entity with a specific name in a scope.
     * @param rootNode Root node of the scope.
     * @param name Name of the entity.
     */
    findEntityInScope(rootNode, name) {
        const entities = this.getEntitiesInScope(rootNode);
        for (const entity of entities) {
            if (entity.name === name) {
                return entity;
            }
        }
        return null;
    }
    /** Coerces a `ReferenceTarget` to an `Element`, if possible. */
    referenceTargetToElement(target) {
        if (target instanceof Element$1) {
            return target;
        }
        if (target instanceof Template) {
            return null;
        }
        return this.referenceTargetToElement(target.node);
    }
}
function extractScopedNodeEntities(rootScope, templateEntities) {
    const entityMap = new Map();
    function extractScopeEntities(scope) {
        if (entityMap.has(scope.rootNode)) {
            return entityMap.get(scope.rootNode);
        }
        const currentEntities = scope.namedEntities;
        let entities;
        if (scope.parentScope !== null) {
            entities = new Map([...extractScopeEntities(scope.parentScope), ...currentEntities]);
        }
        else {
            entities = new Map(currentEntities);
        }
        entityMap.set(scope.rootNode, entities);
        return entities;
    }
    const scopesToProcess = [rootScope];
    while (scopesToProcess.length > 0) {
        const scope = scopesToProcess.pop();
        for (const childScope of scope.childScopes.values()) {
            scopesToProcess.push(childScope);
        }
        extractScopeEntities(scope);
    }
    for (const [template, entities] of entityMap) {
        templateEntities.set(template, new Set(entities.values()));
    }
}

/**
 * An interface for retrieving documents by URL that the compiler uses to
 * load templates.
 *
 * This is an abstract class, rather than an interface, so that it can be used
 * as injection token.
 */
class ResourceLoader {
}

class CompilerFacadeImpl {
    jitEvaluator;
    FactoryTarget = exports.FactoryTarget;
    ResourceLoader = ResourceLoader;
    elementSchemaRegistry = new DomElementSchemaRegistry();
    constructor(jitEvaluator = new JitEvaluator()) {
        this.jitEvaluator = jitEvaluator;
    }
    compilePipe(angularCoreEnv, sourceMapUrl, facade) {
        const metadata = {
            name: facade.name,
            type: wrapReference(facade.type),
            typeArgumentCount: 0,
            pipeName: facade.pipeName,
            pure: facade.pure,
            isStandalone: facade.isStandalone,
        };
        const res = compilePipeFromMetadata(metadata);
        return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, []);
    }
    compilePipeDeclaration(angularCoreEnv, sourceMapUrl, declaration) {
        const meta = convertDeclarePipeFacadeToMetadata(declaration);
        const res = compilePipeFromMetadata(meta);
        return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, []);
    }
    compileInjectable(angularCoreEnv, sourceMapUrl, facade) {
        const { expression, statements } = compileInjectable({
            name: facade.name,
            type: wrapReference(facade.type),
            typeArgumentCount: facade.typeArgumentCount,
            providedIn: computeProvidedIn(facade.providedIn),
            useClass: convertToProviderExpression(facade, 'useClass'),
            useFactory: wrapExpression(facade, 'useFactory'),
            useValue: convertToProviderExpression(facade, 'useValue'),
            useExisting: convertToProviderExpression(facade, 'useExisting'),
            deps: facade.deps?.map(convertR3DependencyMetadata),
        }, 
        /* resolveForwardRefs */ true);
        return this.jitExpression(expression, angularCoreEnv, sourceMapUrl, statements);
    }
    compileInjectableDeclaration(angularCoreEnv, sourceMapUrl, facade) {
        const { expression, statements } = compileInjectable({
            name: facade.type.name,
            type: wrapReference(facade.type),
            typeArgumentCount: 0,
            providedIn: computeProvidedIn(facade.providedIn),
            useClass: convertToProviderExpression(facade, 'useClass'),
            useFactory: wrapExpression(facade, 'useFactory'),
            useValue: convertToProviderExpression(facade, 'useValue'),
            useExisting: convertToProviderExpression(facade, 'useExisting'),
            deps: facade.deps?.map(convertR3DeclareDependencyMetadata),
        }, 
        /* resolveForwardRefs */ true);
        return this.jitExpression(expression, angularCoreEnv, sourceMapUrl, statements);
    }
    compileInjector(angularCoreEnv, sourceMapUrl, facade) {
        const meta = {
            name: facade.name,
            type: wrapReference(facade.type),
            providers: facade.providers && facade.providers.length > 0
                ? new WrappedNodeExpr(facade.providers)
                : null,
            imports: facade.imports.map((i) => new WrappedNodeExpr(i)),
        };
        const res = compileInjector(meta);
        return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, []);
    }
    compileInjectorDeclaration(angularCoreEnv, sourceMapUrl, declaration) {
        const meta = convertDeclareInjectorFacadeToMetadata(declaration);
        const res = compileInjector(meta);
        return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, []);
    }
    compileNgModule(angularCoreEnv, sourceMapUrl, facade) {
        const meta = {
            kind: exports.R3NgModuleMetadataKind.Global,
            type: wrapReference(facade.type),
            bootstrap: facade.bootstrap.map(wrapReference),
            declarations: facade.declarations.map(wrapReference),
            publicDeclarationTypes: null, // only needed for types in AOT
            imports: facade.imports.map(wrapReference),
            includeImportTypes: true,
            exports: facade.exports.map(wrapReference),
            selectorScopeMode: exports.R3SelectorScopeMode.Inline,
            containsForwardDecls: false,
            schemas: facade.schemas ? facade.schemas.map(wrapReference) : null,
            id: facade.id ? new WrappedNodeExpr(facade.id) : null,
        };
        const res = compileNgModule(meta);
        return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, []);
    }
    compileNgModuleDeclaration(angularCoreEnv, sourceMapUrl, declaration) {
        const expression = compileNgModuleDeclarationExpression(declaration);
        return this.jitExpression(expression, angularCoreEnv, sourceMapUrl, []);
    }
    compileDirective(angularCoreEnv, sourceMapUrl, facade) {
        const meta = convertDirectiveFacadeToMetadata(facade);
        return this.compileDirectiveFromMeta(angularCoreEnv, sourceMapUrl, meta);
    }
    compileDirectiveDeclaration(angularCoreEnv, sourceMapUrl, declaration) {
        const typeSourceSpan = this.createParseSourceSpan('Directive', declaration.type.name, sourceMapUrl);
        const meta = convertDeclareDirectiveFacadeToMetadata(declaration, typeSourceSpan);
        return this.compileDirectiveFromMeta(angularCoreEnv, sourceMapUrl, meta);
    }
    compileDirectiveFromMeta(angularCoreEnv, sourceMapUrl, meta) {
        const constantPool = new ConstantPool();
        const bindingParser = makeBindingParser();
        const res = compileDirectiveFromMetadata(meta, constantPool, bindingParser);
        return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, constantPool.statements);
    }
    compileComponent(angularCoreEnv, sourceMapUrl, facade) {
        // Parse the template and check for errors.
        const { template, interpolation, defer } = parseJitTemplate(facade.template, facade.name, sourceMapUrl, facade.preserveWhitespaces, facade.interpolation, undefined);
        // Compile the component metadata, including template, into an expression.
        const meta = {
            ...facade,
            ...convertDirectiveFacadeToMetadata(facade),
            selector: facade.selector || this.elementSchemaRegistry.getDefaultComponentElementName(),
            template,
            declarations: facade.declarations.map(convertDeclarationFacadeToMetadata),
            declarationListEmitMode: 0 /* DeclarationListEmitMode.Direct */,
            defer,
            styles: [...facade.styles, ...template.styles],
            encapsulation: facade.encapsulation,
            interpolation,
            changeDetection: facade.changeDetection ?? null,
            animations: facade.animations != null ? new WrappedNodeExpr(facade.animations) : null,
            viewProviders: facade.viewProviders != null ? new WrappedNodeExpr(facade.viewProviders) : null,
            relativeContextFilePath: '',
            i18nUseExternalIds: true,
            relativeTemplatePath: null,
        };
        const jitExpressionSourceMap = `ng:///${facade.name}.js`;
        return this.compileComponentFromMeta(angularCoreEnv, jitExpressionSourceMap, meta);
    }
    compileComponentDeclaration(angularCoreEnv, sourceMapUrl, declaration) {
        const typeSourceSpan = this.createParseSourceSpan('Component', declaration.type.name, sourceMapUrl);
        const meta = convertDeclareComponentFacadeToMetadata(declaration, typeSourceSpan, sourceMapUrl);
        return this.compileComponentFromMeta(angularCoreEnv, sourceMapUrl, meta);
    }
    compileComponentFromMeta(angularCoreEnv, sourceMapUrl, meta) {
        const constantPool = new ConstantPool();
        const bindingParser = makeBindingParser(meta.interpolation);
        const res = compileComponentFromMetadata(meta, constantPool, bindingParser);
        return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, constantPool.statements);
    }
    compileFactory(angularCoreEnv, sourceMapUrl, meta) {
        const factoryRes = compileFactoryFunction({
            name: meta.name,
            type: wrapReference(meta.type),
            typeArgumentCount: meta.typeArgumentCount,
            deps: convertR3DependencyMetadataArray(meta.deps),
            target: meta.target,
        });
        return this.jitExpression(factoryRes.expression, angularCoreEnv, sourceMapUrl, factoryRes.statements);
    }
    compileFactoryDeclaration(angularCoreEnv, sourceMapUrl, meta) {
        const factoryRes = compileFactoryFunction({
            name: meta.type.name,
            type: wrapReference(meta.type),
            typeArgumentCount: 0,
            deps: Array.isArray(meta.deps)
                ? meta.deps.map(convertR3DeclareDependencyMetadata)
                : meta.deps,
            target: meta.target,
        });
        return this.jitExpression(factoryRes.expression, angularCoreEnv, sourceMapUrl, factoryRes.statements);
    }
    createParseSourceSpan(kind, typeName, sourceUrl) {
        return r3JitTypeSourceSpan(kind, typeName, sourceUrl);
    }
    /**
     * JIT compiles an expression and returns the result of executing that expression.
     *
     * @param def the definition which will be compiled and executed to get the value to patch
     * @param context an object map of @angular/core symbol names to symbols which will be available
     * in the context of the compiled expression
     * @param sourceUrl a URL to use for the source map of the compiled expression
     * @param preStatements a collection of statements that should be evaluated before the expression.
     */
    jitExpression(def, context, sourceUrl, preStatements) {
        // The ConstantPool may contain Statements which declare variables used in the final expression.
        // Therefore, its statements need to precede the actual JIT operation. The final statement is a
        // declaration of $def which is set to the expression being compiled.
        const statements = [
            ...preStatements,
            new DeclareVarStmt('$def', def, undefined, exports.StmtModifier.Exported),
        ];
        const res = this.jitEvaluator.evaluateStatements(sourceUrl, statements, new R3JitReflector(context), 
        /* enableSourceMaps */ true);
        return res['$def'];
    }
}
function convertToR3QueryMetadata(facade) {
    return {
        ...facade,
        isSignal: facade.isSignal,
        predicate: convertQueryPredicate(facade.predicate),
        read: facade.read ? new WrappedNodeExpr(facade.read) : null,
        static: facade.static,
        emitDistinctChangesOnly: facade.emitDistinctChangesOnly,
    };
}
function convertQueryDeclarationToMetadata(declaration) {
    return {
        propertyName: declaration.propertyName,
        first: declaration.first ?? false,
        predicate: convertQueryPredicate(declaration.predicate),
        descendants: declaration.descendants ?? false,
        read: declaration.read ? new WrappedNodeExpr(declaration.read) : null,
        static: declaration.static ?? false,
        emitDistinctChangesOnly: declaration.emitDistinctChangesOnly ?? true,
        isSignal: !!declaration.isSignal,
    };
}
function convertQueryPredicate(predicate) {
    return Array.isArray(predicate)
        ? // The predicate is an array of strings so pass it through.
            predicate
        : // The predicate is a type - assume that we will need to unwrap any `forwardRef()` calls.
            createMayBeForwardRefExpression(new WrappedNodeExpr(predicate), 1 /* ForwardRefHandling.Wrapped */);
}
function convertDirectiveFacadeToMetadata(facade) {
    const inputsFromMetadata = parseInputsArray$1(facade.inputs || []);
    const outputsFromMetadata = parseMappingStringArray$1(facade.outputs || []);
    const propMetadata = facade.propMetadata;
    const inputsFromType = {};
    const outputsFromType = {};
    for (const field in propMetadata) {
        if (propMetadata.hasOwnProperty(field)) {
            propMetadata[field].forEach((ann) => {
                if (isInput(ann)) {
                    inputsFromType[field] = {
                        bindingPropertyName: ann.alias || field,
                        classPropertyName: field,
                        required: ann.required || false,
                        // For JIT, decorators are used to declare signal inputs. That is because of
                        // a technical limitation where it's not possible to statically reflect class
                        // members of a directive/component at runtime before instantiating the class.
                        isSignal: !!ann.isSignal,
                        transformFunction: ann.transform != null ? new WrappedNodeExpr(ann.transform) : null,
                    };
                }
                else if (isOutput(ann)) {
                    outputsFromType[field] = ann.alias || field;
                }
            });
        }
    }
    const hostDirectives = facade.hostDirectives?.length
        ? facade.hostDirectives.map((hostDirective) => {
            return typeof hostDirective === 'function'
                ? {
                    directive: wrapReference(hostDirective),
                    inputs: null,
                    outputs: null,
                    isForwardReference: false,
                }
                : {
                    directive: wrapReference(hostDirective.directive),
                    isForwardReference: false,
                    inputs: hostDirective.inputs ? parseMappingStringArray$1(hostDirective.inputs) : null,
                    outputs: hostDirective.outputs
                        ? parseMappingStringArray$1(hostDirective.outputs)
                        : null,
                };
        })
        : null;
    return {
        ...facade,
        typeArgumentCount: 0,
        typeSourceSpan: facade.typeSourceSpan,
        type: wrapReference(facade.type),
        deps: null,
        host: {
            ...extractHostBindings$1(facade.propMetadata, facade.typeSourceSpan, facade.host),
        },
        inputs: { ...inputsFromMetadata, ...inputsFromType },
        outputs: { ...outputsFromMetadata, ...outputsFromType },
        queries: facade.queries.map(convertToR3QueryMetadata),
        providers: facade.providers != null ? new WrappedNodeExpr(facade.providers) : null,
        viewQueries: facade.viewQueries.map(convertToR3QueryMetadata),
        fullInheritance: false,
        hostDirectives,
    };
}
function convertDeclareDirectiveFacadeToMetadata(declaration, typeSourceSpan) {
    const hostDirectives = declaration.hostDirectives?.length
        ? declaration.hostDirectives.map((dir) => ({
            directive: wrapReference(dir.directive),
            isForwardReference: false,
            inputs: dir.inputs ? getHostDirectiveBindingMapping(dir.inputs) : null,
            outputs: dir.outputs ? getHostDirectiveBindingMapping(dir.outputs) : null,
        }))
        : null;
    return {
        name: declaration.type.name,
        type: wrapReference(declaration.type),
        typeSourceSpan,
        selector: declaration.selector ?? null,
        inputs: declaration.inputs ? inputsPartialMetadataToInputMetadata(declaration.inputs) : {},
        outputs: declaration.outputs ?? {},
        host: convertHostDeclarationToMetadata(declaration.host),
        queries: (declaration.queries ?? []).map(convertQueryDeclarationToMetadata),
        viewQueries: (declaration.viewQueries ?? []).map(convertQueryDeclarationToMetadata),
        providers: declaration.providers !== undefined ? new WrappedNodeExpr(declaration.providers) : null,
        exportAs: declaration.exportAs ?? null,
        usesInheritance: declaration.usesInheritance ?? false,
        lifecycle: { usesOnChanges: declaration.usesOnChanges ?? false },
        deps: null,
        typeArgumentCount: 0,
        fullInheritance: false,
        isStandalone: declaration.isStandalone ?? getJitStandaloneDefaultForVersion(declaration.version),
        isSignal: declaration.isSignal ?? false,
        hostDirectives,
    };
}
function convertHostDeclarationToMetadata(host = {}) {
    return {
        attributes: convertOpaqueValuesToExpressions(host.attributes ?? {}),
        listeners: host.listeners ?? {},
        properties: host.properties ?? {},
        specialAttributes: {
            classAttr: host.classAttribute,
            styleAttr: host.styleAttribute,
        },
    };
}
/**
 * Parses a host directive mapping where each odd array key is the name of an input/output
 * and each even key is its public name, e.g. `['one', 'oneAlias', 'two', 'two']`.
 */
function getHostDirectiveBindingMapping(array) {
    let result = null;
    for (let i = 1; i < array.length; i += 2) {
        result = result || {};
        result[array[i - 1]] = array[i];
    }
    return result;
}
function convertOpaqueValuesToExpressions(obj) {
    const result = {};
    for (const key of Object.keys(obj)) {
        result[key] = new WrappedNodeExpr(obj[key]);
    }
    return result;
}
function convertDeclareComponentFacadeToMetadata(decl, typeSourceSpan, sourceMapUrl) {
    const { template, interpolation, defer } = parseJitTemplate(decl.template, decl.type.name, sourceMapUrl, decl.preserveWhitespaces ?? false, decl.interpolation, decl.deferBlockDependencies);
    const declarations = [];
    if (decl.dependencies) {
        for (const innerDep of decl.dependencies) {
            switch (innerDep.kind) {
                case 'directive':
                case 'component':
                    declarations.push(convertDirectiveDeclarationToMetadata(innerDep));
                    break;
                case 'pipe':
                    declarations.push(convertPipeDeclarationToMetadata(innerDep));
                    break;
            }
        }
    }
    else if (decl.components || decl.directives || decl.pipes) {
        // Existing declarations on NPM may not be using the new `dependencies` merged field, and may
        // have separate fields for dependencies instead. Unify them for JIT compilation.
        decl.components &&
            declarations.push(...decl.components.map((dir) => convertDirectiveDeclarationToMetadata(dir, /* isComponent */ true)));
        decl.directives &&
            declarations.push(...decl.directives.map((dir) => convertDirectiveDeclarationToMetadata(dir)));
        decl.pipes && declarations.push(...convertPipeMapToMetadata(decl.pipes));
    }
    return {
        ...convertDeclareDirectiveFacadeToMetadata(decl, typeSourceSpan),
        template,
        styles: decl.styles ?? [],
        declarations,
        viewProviders: decl.viewProviders !== undefined ? new WrappedNodeExpr(decl.viewProviders) : null,
        animations: decl.animations !== undefined ? new WrappedNodeExpr(decl.animations) : null,
        defer,
        changeDetection: decl.changeDetection ?? exports.ChangeDetectionStrategy.Default,
        encapsulation: decl.encapsulation ?? exports.ViewEncapsulation.Emulated,
        interpolation,
        declarationListEmitMode: 2 /* DeclarationListEmitMode.ClosureResolved */,
        relativeContextFilePath: '',
        i18nUseExternalIds: true,
        relativeTemplatePath: null,
    };
}
function convertDeclarationFacadeToMetadata(declaration) {
    return {
        ...declaration,
        type: new WrappedNodeExpr(declaration.type),
    };
}
function convertDirectiveDeclarationToMetadata(declaration, isComponent = null) {
    return {
        kind: exports.R3TemplateDependencyKind.Directive,
        isComponent: isComponent || declaration.kind === 'component',
        selector: declaration.selector,
        type: new WrappedNodeExpr(declaration.type),
        inputs: declaration.inputs ?? [],
        outputs: declaration.outputs ?? [],
        exportAs: declaration.exportAs ?? null,
    };
}
function convertPipeMapToMetadata(pipes) {
    if (!pipes) {
        return [];
    }
    return Object.keys(pipes).map((name) => {
        return {
            kind: exports.R3TemplateDependencyKind.Pipe,
            name,
            type: new WrappedNodeExpr(pipes[name]),
        };
    });
}
function convertPipeDeclarationToMetadata(pipe) {
    return {
        kind: exports.R3TemplateDependencyKind.Pipe,
        name: pipe.name,
        type: new WrappedNodeExpr(pipe.type),
    };
}
function parseJitTemplate(template, typeName, sourceMapUrl, preserveWhitespaces, interpolation, deferBlockDependencies) {
    const interpolationConfig = interpolation
        ? InterpolationConfig.fromArray(interpolation)
        : DEFAULT_INTERPOLATION_CONFIG;
    // Parse the template and check for errors.
    const parsed = parseTemplate(template, sourceMapUrl, {
        preserveWhitespaces,
        interpolationConfig,
    });
    if (parsed.errors !== null) {
        const errors = parsed.errors.map((err) => err.toString()).join(', ');
        throw new Error(`Errors during JIT compilation of template for ${typeName}: ${errors}`);
    }
    const binder = new R3TargetBinder(new SelectorMatcher());
    const boundTarget = binder.bind({ template: parsed.nodes });
    return {
        template: parsed,
        interpolation: interpolationConfig,
        defer: createR3ComponentDeferMetadata(boundTarget, deferBlockDependencies),
    };
}
/**
 * Convert the expression, if present to an `R3ProviderExpression`.
 *
 * In JIT mode we do not want the compiler to wrap the expression in a `forwardRef()` call because,
 * if it is referencing a type that has not yet been defined, it will have already been wrapped in
 * a `forwardRef()` - either by the application developer or during partial-compilation. Thus we can
 * use `ForwardRefHandling.None`.
 */
function convertToProviderExpression(obj, property) {
    if (obj.hasOwnProperty(property)) {
        return createMayBeForwardRefExpression(new WrappedNodeExpr(obj[property]), 0 /* ForwardRefHandling.None */);
    }
    else {
        return undefined;
    }
}
function wrapExpression(obj, property) {
    if (obj.hasOwnProperty(property)) {
        return new WrappedNodeExpr(obj[property]);
    }
    else {
        return undefined;
    }
}
function computeProvidedIn(providedIn) {
    const expression = typeof providedIn === 'function'
        ? new WrappedNodeExpr(providedIn)
        : new LiteralExpr(providedIn ?? null);
    // See `convertToProviderExpression()` for why this uses `ForwardRefHandling.None`.
    return createMayBeForwardRefExpression(expression, 0 /* ForwardRefHandling.None */);
}
function convertR3DependencyMetadataArray(facades) {
    return facades == null ? null : facades.map(convertR3DependencyMetadata);
}
function convertR3DependencyMetadata(facade) {
    const isAttributeDep = facade.attribute != null; // both `null` and `undefined`
    const rawToken = facade.token === null ? null : new WrappedNodeExpr(facade.token);
    // In JIT mode, if the dep is an `@Attribute()` then we use the attribute name given in
    // `attribute` rather than the `token`.
    const token = isAttributeDep ? new WrappedNodeExpr(facade.attribute) : rawToken;
    return createR3DependencyMetadata(token, isAttributeDep, facade.host, facade.optional, facade.self, facade.skipSelf);
}
function convertR3DeclareDependencyMetadata(facade) {
    const isAttributeDep = facade.attribute ?? false;
    const token = facade.token === null ? null : new WrappedNodeExpr(facade.token);
    return createR3DependencyMetadata(token, isAttributeDep, facade.host ?? false, facade.optional ?? false, facade.self ?? false, facade.skipSelf ?? false);
}
function createR3DependencyMetadata(token, isAttributeDep, host, optional, self, skipSelf) {
    // If the dep is an `@Attribute()` the `attributeNameType` ought to be the `unknown` type.
    // But types are not available at runtime so we just use a literal `"<unknown>"` string as a dummy
    // marker.
    const attributeNameType = isAttributeDep ? literal$1('unknown') : null;
    return { token, attributeNameType, host, optional, self, skipSelf };
}
function createR3ComponentDeferMetadata(boundTarget, deferBlockDependencies) {
    const deferredBlocks = boundTarget.getDeferBlocks();
    const blocks = new Map();
    for (let i = 0; i < deferredBlocks.length; i++) {
        const dependencyFn = deferBlockDependencies?.[i];
        blocks.set(deferredBlocks[i], dependencyFn ? new WrappedNodeExpr(dependencyFn) : null);
    }
    return { mode: 0 /* DeferBlockDepsEmitMode.PerBlock */, blocks };
}
function extractHostBindings$1(propMetadata, sourceSpan, host) {
    // First parse the declarations from the metadata.
    const bindings = parseHostBindings(host || {});
    // After that check host bindings for errors
    const errors = verifyHostBindings(bindings, sourceSpan);
    if (errors.length) {
        throw new Error(errors.map((error) => error.msg).join('\n'));
    }
    // Next, loop over the properties of the object, looking for @HostBinding and @HostListener.
    for (const field in propMetadata) {
        if (propMetadata.hasOwnProperty(field)) {
            propMetadata[field].forEach((ann) => {
                if (isHostBinding(ann)) {
                    // Since this is a decorator, we know that the value is a class member. Always access it
                    // through `this` so that further down the line it can't be confused for a literal value
                    // (e.g. if there's a property called `true`).
                    bindings.properties[ann.hostPropertyName || field] = getSafePropertyAccessString('this', field);
                }
                else if (isHostListener(ann)) {
                    bindings.listeners[ann.eventName || field] = `${field}(${(ann.args || []).join(',')})`;
                }
            });
        }
    }
    return bindings;
}
function isHostBinding(value) {
    return value.ngMetadataName === 'HostBinding';
}
function isHostListener(value) {
    return value.ngMetadataName === 'HostListener';
}
function isInput(value) {
    return value.ngMetadataName === 'Input';
}
function isOutput(value) {
    return value.ngMetadataName === 'Output';
}
function inputsPartialMetadataToInputMetadata(inputs) {
    return Object.keys(inputs).reduce((result, minifiedClassName) => {
        const value = inputs[minifiedClassName];
        // Handle legacy partial input output.
        if (typeof value === 'string' || Array.isArray(value)) {
            result[minifiedClassName] = parseLegacyInputPartialOutput(value);
        }
        else {
            result[minifiedClassName] = {
                bindingPropertyName: value.publicName,
                classPropertyName: minifiedClassName,
                transformFunction: value.transformFunction !== null ? new WrappedNodeExpr(value.transformFunction) : null,
                required: value.isRequired,
                isSignal: value.isSignal,
            };
        }
        return result;
    }, {});
}
/**
 * Parses the legacy input partial output. For more details see `partial/directive.ts`.
 * TODO(legacy-partial-output-inputs): Remove in v18.
 */
function parseLegacyInputPartialOutput(value) {
    if (typeof value === 'string') {
        return {
            bindingPropertyName: value,
            classPropertyName: value,
            transformFunction: null,
            required: false,
            // legacy partial output does not capture signal inputs.
            isSignal: false,
        };
    }
    return {
        bindingPropertyName: value[0],
        classPropertyName: value[1],
        transformFunction: value[2] ? new WrappedNodeExpr(value[2]) : null,
        required: false,
        // legacy partial output does not capture signal inputs.
        isSignal: false,
    };
}
function parseInputsArray$1(values) {
    return values.reduce((results, value) => {
        if (typeof value === 'string') {
            const [bindingPropertyName, classPropertyName] = parseMappingString$1(value);
            results[classPropertyName] = {
                bindingPropertyName,
                classPropertyName,
                required: false,
                // Signal inputs not supported for the inputs array.
                isSignal: false,
                transformFunction: null,
            };
        }
        else {
            results[value.name] = {
                bindingPropertyName: value.alias || value.name,
                classPropertyName: value.name,
                required: value.required || false,
                // Signal inputs not supported for the inputs array.
                isSignal: false,
                transformFunction: value.transform != null ? new WrappedNodeExpr(value.transform) : null,
            };
        }
        return results;
    }, {});
}
function parseMappingStringArray$1(values) {
    return values.reduce((results, value) => {
        const [alias, fieldName] = parseMappingString$1(value);
        results[fieldName] = alias;
        return results;
    }, {});
}
function parseMappingString$1(value) {
    // Either the value is 'field' or 'field: property'. In the first case, `property` will
    // be undefined, in which case the field name should also be used as the property name.
    const [fieldName, bindingPropertyName] = value.split(':', 2).map((str) => str.trim());
    return [bindingPropertyName ?? fieldName, fieldName];
}
function convertDeclarePipeFacadeToMetadata(declaration) {
    return {
        name: declaration.type.name,
        type: wrapReference(declaration.type),
        typeArgumentCount: 0,
        pipeName: declaration.name,
        deps: null,
        pure: declaration.pure ?? true,
        isStandalone: declaration.isStandalone ?? getJitStandaloneDefaultForVersion(declaration.version),
    };
}
function convertDeclareInjectorFacadeToMetadata(declaration) {
    return {
        name: declaration.type.name,
        type: wrapReference(declaration.type),
        providers: declaration.providers !== undefined && declaration.providers.length > 0
            ? new WrappedNodeExpr(declaration.providers)
            : null,
        imports: declaration.imports !== undefined
            ? declaration.imports.map((i) => new WrappedNodeExpr(i))
            : [],
    };
}
function publishFacade(global) {
    const ng = global.ng || (global.ng = {});
    ng.ɵcompilerFacade = new CompilerFacadeImpl();
}

/**
 * @module
 * @description
 * Entry point for all public APIs of the compiler package.
 */
new Version('19.2.14');

const _I18N_ATTR = 'i18n';
const _I18N_ATTR_PREFIX = 'i18n-';
const _I18N_COMMENT_PREFIX_REGEXP = /^i18n:?/;
const MEANING_SEPARATOR = '|';
const ID_SEPARATOR = '@@';
let i18nCommentsWarned = false;
/**
 * Extract translatable messages from an html AST
 */
function extractMessages(nodes, interpolationConfig, implicitTags, implicitAttrs, preserveSignificantWhitespace) {
    const visitor = new _Visitor(implicitTags, implicitAttrs, preserveSignificantWhitespace);
    return visitor.extract(nodes, interpolationConfig);
}
class ExtractionResult {
    messages;
    errors;
    constructor(messages, errors) {
        this.messages = messages;
        this.errors = errors;
    }
}
var _VisitorMode;
(function (_VisitorMode) {
    _VisitorMode[_VisitorMode["Extract"] = 0] = "Extract";
    _VisitorMode[_VisitorMode["Merge"] = 1] = "Merge";
})(_VisitorMode || (_VisitorMode = {}));
/**
 * This Visitor is used:
 * 1. to extract all the translatable strings from an html AST (see `extract()`),
 * 2. to replace the translatable strings with the actual translations (see `merge()`)
 *
 * @internal
 */
class _Visitor {
    _implicitTags;
    _implicitAttrs;
    _preserveSignificantWhitespace;
    // Using non-null assertions because all variables are (re)set in init()
    _depth;
    // <el i18n>...</el>
    _inI18nNode;
    _inImplicitNode;
    // <!--i18n-->...<!--/i18n-->
    _inI18nBlock;
    _blockMeaningAndDesc;
    _blockChildren;
    _blockStartDepth;
    // {<icu message>}
    _inIcu;
    // set to void 0 when not in a section
    _msgCountAtSectionStart;
    _errors;
    _mode;
    // _VisitorMode.Extract only
    _messages;
    // _VisitorMode.Merge only
    _translations;
    _createI18nMessage;
    constructor(_implicitTags, _implicitAttrs, _preserveSignificantWhitespace = true) {
        this._implicitTags = _implicitTags;
        this._implicitAttrs = _implicitAttrs;
        this._preserveSignificantWhitespace = _preserveSignificantWhitespace;
    }
    /**
     * Extracts the messages from the tree
     */
    extract(nodes, interpolationConfig) {
        this._init(_VisitorMode.Extract, interpolationConfig);
        nodes.forEach((node) => node.visit(this, null));
        if (this._inI18nBlock) {
            this._reportError(nodes[nodes.length - 1], 'Unclosed block');
        }
        return new ExtractionResult(this._messages, this._errors);
    }
    /**
     * Returns a tree where all translatable nodes are translated
     */
    merge(nodes, translations, interpolationConfig) {
        this._init(_VisitorMode.Merge, interpolationConfig);
        this._translations = translations;
        // Construct a single fake root element
        const wrapper = new Element('wrapper', [], nodes, undefined, undefined, undefined);
        const translatedNode = wrapper.visit(this, null);
        if (this._inI18nBlock) {
            this._reportError(nodes[nodes.length - 1], 'Unclosed block');
        }
        return new ParseTreeResult(translatedNode.children, this._errors);
    }
    visitExpansionCase(icuCase, context) {
        // Parse cases for translatable html attributes
        const expression = visitAll(this, icuCase.expression, context);
        if (this._mode === _VisitorMode.Merge) {
            return new ExpansionCase(icuCase.value, expression, icuCase.sourceSpan, icuCase.valueSourceSpan, icuCase.expSourceSpan);
        }
    }
    visitExpansion(icu, context) {
        this._mayBeAddBlockChildren(icu);
        const wasInIcu = this._inIcu;
        if (!this._inIcu) {
            // nested ICU messages should not be extracted but top-level translated as a whole
            if (this._isInTranslatableSection) {
                this._addMessage([icu]);
            }
            this._inIcu = true;
        }
        const cases = visitAll(this, icu.cases, context);
        if (this._mode === _VisitorMode.Merge) {
            icu = new Expansion(icu.switchValue, icu.type, cases, icu.sourceSpan, icu.switchValueSourceSpan);
        }
        this._inIcu = wasInIcu;
        return icu;
    }
    visitComment(comment, context) {
        const isOpening = _isOpeningComment(comment);
        if (isOpening && this._isInTranslatableSection) {
            this._reportError(comment, 'Could not start a block inside a translatable section');
            return;
        }
        const isClosing = _isClosingComment(comment);
        if (isClosing && !this._inI18nBlock) {
            this._reportError(comment, 'Trying to close an unopened block');
            return;
        }
        if (!this._inI18nNode && !this._inIcu) {
            if (!this._inI18nBlock) {
                if (isOpening) {
                    // deprecated from v5 you should use <ng-container i18n> instead of i18n comments
                    if (!i18nCommentsWarned && console && console.warn) {
                        i18nCommentsWarned = true;
                        const details = comment.sourceSpan.details ? `, ${comment.sourceSpan.details}` : '';
                        // TODO(ocombe): use a log service once there is a public one available
                        console.warn(`I18n comments are deprecated, use an <ng-container> element instead (${comment.sourceSpan.start}${details})`);
                    }
                    this._inI18nBlock = true;
                    this._blockStartDepth = this._depth;
                    this._blockChildren = [];
                    this._blockMeaningAndDesc = comment
                        .value.replace(_I18N_COMMENT_PREFIX_REGEXP, '')
                        .trim();
                    this._openTranslatableSection(comment);
                }
            }
            else {
                if (isClosing) {
                    if (this._depth == this._blockStartDepth) {
                        this._closeTranslatableSection(comment, this._blockChildren);
                        this._inI18nBlock = false;
                        const message = this._addMessage(this._blockChildren, this._blockMeaningAndDesc);
                        // merge attributes in sections
                        const nodes = this._translateMessage(comment, message);
                        return visitAll(this, nodes);
                    }
                    else {
                        this._reportError(comment, 'I18N blocks should not cross element boundaries');
                        return;
                    }
                }
            }
        }
    }
    visitText(text, context) {
        if (this._isInTranslatableSection) {
            this._mayBeAddBlockChildren(text);
        }
        return text;
    }
    visitElement(el, context) {
        this._mayBeAddBlockChildren(el);
        this._depth++;
        const wasInI18nNode = this._inI18nNode;
        const wasInImplicitNode = this._inImplicitNode;
        let childNodes = [];
        let translatedChildNodes = undefined;
        // Extract:
        // - top level nodes with the (implicit) "i18n" attribute if not already in a section
        // - ICU messages
        const i18nAttr = _getI18nAttr(el);
        const i18nMeta = i18nAttr ? i18nAttr.value : '';
        const isImplicit = this._implicitTags.some((tag) => el.name === tag) &&
            !this._inIcu &&
            !this._isInTranslatableSection;
        const isTopLevelImplicit = !wasInImplicitNode && isImplicit;
        this._inImplicitNode = wasInImplicitNode || isImplicit;
        if (!this._isInTranslatableSection && !this._inIcu) {
            if (i18nAttr || isTopLevelImplicit) {
                this._inI18nNode = true;
                const message = this._addMessage(el.children, i18nMeta);
                translatedChildNodes = this._translateMessage(el, message);
            }
            if (this._mode == _VisitorMode.Extract) {
                const isTranslatable = i18nAttr || isTopLevelImplicit;
                if (isTranslatable)
                    this._openTranslatableSection(el);
                visitAll(this, el.children);
                if (isTranslatable)
                    this._closeTranslatableSection(el, el.children);
            }
        }
        else {
            if (i18nAttr || isTopLevelImplicit) {
                this._reportError(el, 'Could not mark an element as translatable inside a translatable section');
            }
            if (this._mode == _VisitorMode.Extract) {
                // Descend into child nodes for extraction
                visitAll(this, el.children);
            }
        }
        if (this._mode === _VisitorMode.Merge) {
            const visitNodes = translatedChildNodes || el.children;
            visitNodes.forEach((child) => {
                const visited = child.visit(this, context);
                if (visited && !this._isInTranslatableSection) {
                    // Do not add the children from translatable sections (= i18n blocks here)
                    // They will be added later in this loop when the block closes (i.e. on `<!-- /i18n -->`)
                    childNodes = childNodes.concat(visited);
                }
            });
        }
        this._visitAttributesOf(el);
        this._depth--;
        this._inI18nNode = wasInI18nNode;
        this._inImplicitNode = wasInImplicitNode;
        if (this._mode === _VisitorMode.Merge) {
            const translatedAttrs = this._translateAttributes(el);
            return new Element(el.name, translatedAttrs, childNodes, el.sourceSpan, el.startSourceSpan, el.endSourceSpan);
        }
        return null;
    }
    visitAttribute(attribute, context) {
        throw new Error('unreachable code');
    }
    visitBlock(block, context) {
        visitAll(this, block.children, context);
    }
    visitBlockParameter(parameter, context) { }
    visitLetDeclaration(decl, context) { }
    _init(mode, interpolationConfig) {
        this._mode = mode;
        this._inI18nBlock = false;
        this._inI18nNode = false;
        this._depth = 0;
        this._inIcu = false;
        this._msgCountAtSectionStart = undefined;
        this._errors = [];
        this._messages = [];
        this._inImplicitNode = false;
        this._createI18nMessage = createI18nMessageFactory(interpolationConfig, DEFAULT_CONTAINER_BLOCKS, 
        // When dropping significant whitespace we need to retain whitespace tokens or
        // else we won't be able to reuse source spans because empty tokens would be
        // removed and cause a mismatch.
        /* retainEmptyTokens */ !this._preserveSignificantWhitespace, 
        /* preserveExpressionWhitespace */ this._preserveSignificantWhitespace);
    }
    // looks for translatable attributes
    _visitAttributesOf(el) {
        const explicitAttrNameToValue = {};
        const implicitAttrNames = this._implicitAttrs[el.name] || [];
        el.attrs
            .filter((attr) => attr.name.startsWith(_I18N_ATTR_PREFIX))
            .forEach((attr) => (explicitAttrNameToValue[attr.name.slice(_I18N_ATTR_PREFIX.length)] = attr.value));
        el.attrs.forEach((attr) => {
            if (attr.name in explicitAttrNameToValue) {
                this._addMessage([attr], explicitAttrNameToValue[attr.name]);
            }
            else if (implicitAttrNames.some((name) => attr.name === name)) {
                this._addMessage([attr]);
            }
        });
    }
    // add a translatable message
    _addMessage(ast, msgMeta) {
        if (ast.length == 0 ||
            this._isEmptyAttributeValue(ast) ||
            this._isPlaceholderOnlyAttributeValue(ast) ||
            this._isPlaceholderOnlyMessage(ast)) {
            // Do not create empty messages
            return null;
        }
        const { meaning, description, id } = _parseMessageMeta(msgMeta);
        const message = this._createI18nMessage(ast, meaning, description, id);
        this._messages.push(message);
        return message;
    }
    // Check for cases like `<div i18n-title title="">`.
    _isEmptyAttributeValue(ast) {
        if (!isAttrNode(ast))
            return false;
        const node = ast[0];
        return node.value.trim() === '';
    }
    // Check for cases like `<div i18n-title title="{{ name }}">`.
    _isPlaceholderOnlyAttributeValue(ast) {
        if (!isAttrNode(ast))
            return false;
        const tokens = ast[0].valueTokens ?? [];
        const interpolations = tokens.filter((token) => token.type === 17 /* TokenType.ATTR_VALUE_INTERPOLATION */);
        const plainText = tokens
            .filter((token) => token.type === 16 /* TokenType.ATTR_VALUE_TEXT */)
            // `AttributeValueTextToken` always has exactly one part per its type.
            .map((token) => token.parts[0].trim())
            .join('');
        // Check if there is a single interpolation and all text around it is empty.
        return interpolations.length === 1 && plainText === '';
    }
    // Check for cases like `<div i18n>{{ name }}</div>`.
    _isPlaceholderOnlyMessage(ast) {
        if (!isTextNode(ast))
            return false;
        const tokens = ast[0].tokens;
        const interpolations = tokens.filter((token) => token.type === 8 /* TokenType.INTERPOLATION */);
        const plainText = tokens
            .filter((token) => token.type === 5 /* TokenType.TEXT */)
            // `TextToken` always has exactly one part per its type.
            .map((token) => token.parts[0].trim())
            .join('');
        // Check if there is a single interpolation and all text around it is empty.
        return interpolations.length === 1 && plainText === '';
    }
    // Translates the given message given the `TranslationBundle`
    // This is used for translating elements / blocks - see `_translateAttributes` for attributes
    // no-op when called in extraction mode (returns [])
    _translateMessage(el, message) {
        if (message && this._mode === _VisitorMode.Merge) {
            const nodes = this._translations.get(message);
            if (nodes) {
                return nodes;
            }
            this._reportError(el, `Translation unavailable for message id="${this._translations.digest(message)}"`);
        }
        return [];
    }
    // translate the attributes of an element and remove i18n specific attributes
    _translateAttributes(el) {
        const attributes = el.attrs;
        const i18nParsedMessageMeta = {};
        attributes.forEach((attr) => {
            if (attr.name.startsWith(_I18N_ATTR_PREFIX)) {
                i18nParsedMessageMeta[attr.name.slice(_I18N_ATTR_PREFIX.length)] = _parseMessageMeta(attr.value);
            }
        });
        const translatedAttributes = [];
        attributes.forEach((attr) => {
            if (attr.name === _I18N_ATTR || attr.name.startsWith(_I18N_ATTR_PREFIX)) {
                // strip i18n specific attributes
                return;
            }
            if (attr.value && attr.value != '' && i18nParsedMessageMeta.hasOwnProperty(attr.name)) {
                const { meaning, description, id } = i18nParsedMessageMeta[attr.name];
                const message = this._createI18nMessage([attr], meaning, description, id);
                const nodes = this._translations.get(message);
                if (nodes) {
                    if (nodes.length == 0) {
                        translatedAttributes.push(new Attribute(attr.name, '', attr.sourceSpan, undefined /* keySpan */, undefined /* valueSpan */, undefined /* valueTokens */, undefined /* i18n */));
                    }
                    else if (nodes[0] instanceof Text) {
                        const value = nodes[0].value;
                        translatedAttributes.push(new Attribute(attr.name, value, attr.sourceSpan, undefined /* keySpan */, undefined /* valueSpan */, undefined /* valueTokens */, undefined /* i18n */));
                    }
                    else {
                        this._reportError(el, `Unexpected translation for attribute "${attr.name}" (id="${id || this._translations.digest(message)}")`);
                    }
                }
                else {
                    this._reportError(el, `Translation unavailable for attribute "${attr.name}" (id="${id || this._translations.digest(message)}")`);
                }
            }
            else {
                translatedAttributes.push(attr);
            }
        });
        return translatedAttributes;
    }
    /**
     * Add the node as a child of the block when:
     * - we are in a block,
     * - we are not inside a ICU message (those are handled separately),
     * - the node is a "direct child" of the block
     */
    _mayBeAddBlockChildren(node) {
        if (this._inI18nBloc   k && !this._inIcu && this._depth == this._blockStartDepth) {
            this._blockChildren.push(node);
        }
    }
    /**
     * Marks the start of a section, see `_closeTranslatableSection`
     */
    _openTranslatableSection(node) {
        if (this._isInTranslatableSection) {
            this._reportError(node, 'Unexpected section start');
        }
        else {
            this._msgCountAtSectionStart = this._messages.length;
        }
    }
    /**
     * A translatable section could be:
     * - the content of translatable element,
     * - nodes between `<!-- i18n -->` and `<!-- /i18n -->` comments
     */
    get _isInTranslatableSection() {
        return this._msgCountAtSectionStart !== void 0;
    }
    /**
     * Terminates a section.
     *
     * If a section has only one significant children (comments not significant) then we should not
     * keep the message from this children:
     *
     * `<p i18n="meaning|description">{ICU message}</p>` would produce two messages:
     * - one for the <p> content with meaning and description,
     * - another one for the ICU message.
     *
     * In this case the last message is discarded as it contains less information (the AST is
     * otherwise identical).
     *
     * Note that we should still keep messages extracted from attributes inside the section (ie in the
     * ICU message here)
     */
    _closeTranslatableSection(node, directChildren) {
        if (!this._isInTranslatableSection) {
            this._reportError(node, 'Unexpected section end');
            return;
        }
        const startIndex = this._msgCountAtSectionStart;
        const significantChildren = directChildren.reduce((count, node) => count + (node instanceof Comment ? 0 : 1), 0);
        if (significantChildren == 1) {
            for (let i = this._messages.length - 1; i >= startIndex; i--) {
                const ast = this._messages[i].nodes;
                if (!(ast.length == 1 && ast[0] instanceof Text$2)) {
                    this._messages.splice(i, 1);
                    break;
                }
            }
        }
        this._msgCountAtSectionStart = undefined;
    }
    _reportError(node, msg) {
        this._errors.push(new I18nError(node.sourceSpan, msg));
    }
}
function _isOpeningComment(n) {
    return !!(n instanceof Comment && n.value && n.value.startsWith('i18n'));
}
function _isClosingComment(n) {
    return !!(n instanceof Comment && n.value && n.value === '/i18n');
}
function _getI18nAttr(p) {
    return p.attrs.find((attr) => attr.name === _I18N_ATTR) || null;
}
function _parseMessageMeta(i18n) {
    if (!i18n)
        return { meaning: '', description: '', id: '' };
    const idIndex = i18n.indexOf(ID_SEPARATOR);
    const descIndex = i18n.indexOf(MEANING_SEPARATOR);
    const [meaningAndDesc, id] = idIndex > -1 ? [i18n.slice(0, idIndex), i18n.slice(idIndex + 2)] : [i18n, ''];
    const [meaning, description] = descIndex > -1
        ? [meaningAndDesc.slice(0, descIndex), meaningAndDesc.slice(descIndex + 1)]
        : ['', meaningAndDesc];
    return { meaning, description, id: id.trim() };
}
function isTextNode(ast) {
    return ast.length === 1 && ast[0] instanceof Text;
}
function isAttrNode(ast) {
    return ast.length === 1 && ast[0] instanceof Attribute;
}

//////////////////////////////////////
// THIS FILE HAS GLOBAL SIDE EFFECT //
//       (see bottom of file)       //
//////////////////////////////////////
/**
 * @module
 * @description
 * Entry point for all APIs of the compiler package.
 *
 * <div class="callout is-critical">
 *   <header>Unstable APIs</header>
 *   <p>
 *     All compiler apis are currently considered experimental and private!
 *   </p>
 *   <p>
 *     We expect the APIs in this package to keep on changing. Do not rely on them.
 *   </p>
 * </div>
 */
// This file only reexports content of the `src` folder. Keep it that way.
// This function call has a global side effects and publishes the compiler into global namespace for
// the late binding of the Compiler to the @angular/core for jit compilation.
publishFacade(_global);

/**
 * @publicApi
 */
exports.ErrorCode = void 0;
(function (ErrorCode) {
    ErrorCode[ErrorCode["DECORATOR_ARG_NOT_LITERAL"] = 1001] = "DECORATOR_ARG_NOT_LITERAL";
    ErrorCode[ErrorCode["DECORATOR_ARITY_WRONG"] = 1002] = "DECORATOR_ARITY_WRONG";
    ErrorCode[ErrorCode["DECORATOR_NOT_CALLED"] = 1003] = "DECORATOR_NOT_CALLED";
    ErrorCode[ErrorCode["DECORATOR_UNEXPECTED"] = 1005] = "DECORATOR_UNEXPECTED";
    /**
     * This error code indicates that there are incompatible decorators on a type or a class field.
     */
    ErrorCode[ErrorCode["DECORATOR_COLLISION"] = 1006] = "DECORATOR_COLLISION";
    ErrorCode[ErrorCode["VALUE_HAS_WRONG_TYPE"] = 1010] = "VALUE_HAS_WRONG_TYPE";
    ErrorCode[ErrorCode["VALUE_NOT_LITERAL"] = 1011] = "VALUE_NOT_LITERAL";
    ErrorCode[ErrorCode["DUPLICATE_DECORATED_PROPERTIES"] = 1012] = "DUPLICATE_DECORATED_PROPERTIES";
    /**
     * Raised when an initializer API is annotated with an unexpected decorator.
     *
     * e.g. `@Input` is also applied on the class member using `input`.
     */
    ErrorCode[ErrorCode["INITIALIZER_API_WITH_DISALLOWED_DECORATOR"] = 1050] = "INITIALIZER_API_WITH_DISALLOWED_DECORATOR";
    /**
     * Raised when an initializer API feature (like signal inputs) are also
     * declared in the class decorator metadata.
     *
     * e.g. a signal input is also declared in the `@Directive` `inputs` array.
     */
    ErrorCode[ErrorCode["INITIALIZER_API_DECORATOR_METADATA_COLLISION"] = 1051] = "INITIALIZER_API_DECORATOR_METADATA_COLLISION";
    /**
     * Raised whenever an initializer API does not support the `.required`
     * function, but is still detected unexpectedly.
     */
    ErrorCode[ErrorCode["INITIALIZER_API_NO_REQUIRED_FUNCTION"] = 1052] = "INITIALIZER_API_NO_REQUIRED_FUNCTION";
    /**
     * Raised whenever an initializer API is used on a class member
     * and the given access modifiers (e.g. `private`) are not allowed.
     */
    ErrorCode[ErrorCode["INITIALIZER_API_DISALLOWED_MEMBER_VISIBILITY"] = 1053] = "INITIALIZER_API_DISALLOWED_MEMBER_VISIBILITY";
    /**
     * An Angular feature, like inputs, outputs or queries is incorrectly
     * declared on a static member.
     */
    ErrorCode[ErrorCode["INCORRECTLY_DECLARED_ON_STATIC_MEMBER"] = 1100] = "INCORRECTLY_DECLARED_ON_STATIC_MEMBER";
    ErrorCode[ErrorCode["COMPONENT_MISSING_TEMPLATE"] = 2001] = "COMPONENT_MISSING_TEMPLATE";
    ErrorCode[ErrorCode["PIPE_MISSING_NAME"] = 2002] = "PIPE_MISSING_NAME";
    ErrorCode[ErrorCode["PARAM_MISSING_TOKEN"] = 2003] = "PARAM_MISSING_TOKEN";
    ErrorCode[ErrorCode["DIRECTIVE_MISSING_SELECTOR"] = 2004] = "DIRECTIVE_MISSING_SELECTOR";
    /** Raised when an undecorated class is passed in as a provider to a module or a directive. */
    ErrorCode[ErrorCode["UNDECORATED_PROVIDER"] = 2005] = "UNDECORATED_PROVIDER";
    /**
     * Raised when a Directive inherits its constructor from a base class without an Angular
     * decorator.
     */
    ErrorCode[ErrorCode["DIRECTIVE_INHERITS_UNDECORATED_CTOR"] = 2006] = "DIRECTIVE_INHERITS_UNDECORATED_CTOR";
    /**
     * Raised when an undecorated class that is using Angular features
     * has been discovered.
     */
    ErrorCode[ErrorCode["UNDECORATED_CLASS_USING_ANGULAR_FEATURES"] = 2007] = "UNDECORATED_CLASS_USING_ANGULAR_FEATURES";
    /**
     * Raised when an component cannot resolve an external resource, such as a template or a style
     * sheet.
     */
    ErrorCode[ErrorCode["COMPONENT_RESOURCE_NOT_FOUND"] = 2008] = "COMPONENT_RESOURCE_NOT_FOUND";
    /**
     * Raised when a component uses `ShadowDom` view encapsulation, but its selector
     * does not match the shadow DOM tag name requirements.
     */
    ErrorCode[ErrorCode["COMPONENT_INVALID_SHADOW_DOM_SELECTOR"] = 2009] = "COMPONENT_INVALID_SHADOW_DOM_SELECTOR";
    /**
     * Raised when a component has `imports` but is not marked as `standalone: true`.
     */
    ErrorCode[ErrorCode["COMPONENT_NOT_STANDALONE"] = 2010] = "COMPONENT_NOT_STANDALONE";
    /**
     * Raised when a type in the `imports` of a component is a directive or pipe, but is not
     * standalone.
     */
    ErrorCode[ErrorCode["COMPONENT_IMPORT_NOT_STANDALONE"] = 2011] = "COMPONENT_IMPORT_NOT_STANDALONE";
    /**
     * Raised when a type in the `imports` of a component is not a directive, pipe, or NgModule.
     */
    ErrorCode[ErrorCode["COMPONENT_UNKNOWN_IMPORT"] = 2012] = "COMPONENT_UNKNOWN_IMPORT";
    /**
     * Raised when the compiler wasn't able to resolve the metadata of a host directive.
     */
    ErrorCode[ErrorCode["HOST_DIRECTIVE_INVALID"] = 2013] = "HOST_DIRECTIVE_INVALID";
    /**
     * Raised when a host directive isn't standalone.
     */
    ErrorCode[ErrorCode["HOST_DIRECTIVE_NOT_STANDALONE"] = 2014] = "HOST_DIRECTIVE_NOT_STANDALONE";
    /**
     * Raised when a host directive is a component.
     */
    ErrorCode[ErrorCode["HOST_DIRECTIVE_COMPONENT"] = 2015] = "HOST_DIRECTIVE_COMPONENT";
    /**
     * Raised when a type with Angular decorator inherits its constructor from a base class
     * which has a constructor that is incompatible with Angular DI.
     */
    ErrorCode[ErrorCode["INJECTABLE_INHERITS_INVALID_CONSTRUCTOR"] = 2016] = "INJECTABLE_INHERITS_INVALID_CONSTRUCTOR";
    /** Raised when a host tries to alias a host directive binding that does not exist. */
    ErrorCode[ErrorCode["HOST_DIRECTIVE_UNDEFINED_BINDING"] = 2017] = "HOST_DIRECTIVE_UNDEFINED_BINDING";
    /**
     * Raised when a host tries to alias a host directive
     * binding to a pre-existing binding's public name.
     */
    ErrorCode[ErrorCode["HOST_DIRECTIVE_CONFLICTING_ALIAS"] = 2018] = "HOST_DIRECTIVE_CONFLICTING_ALIAS";
    /**
     * Raised when a host directive definition doesn't expose a
     * required binding from the host directive.
     */
    ErrorCode[ErrorCode["HOST_DIRECTIVE_MISSING_REQUIRED_BINDING"] = 2019] = "HOST_DIRECTIVE_MISSING_REQUIRED_BINDING";
    /**
     * Raised when a component specifies both a `transform` function on an input
     * and has a corresponding `ngAcceptInputType_` member for the same input.
     */
    ErrorCode[ErrorCode["CONFLICTING_INPUT_TRANSFORM"] = 2020] = "CONFLICTING_INPUT_TRANSFORM";
    /** Raised when a component has both `styleUrls` and `styleUrl`. */
    ErrorCode[ErrorCode["COMPONENT_INVALID_STYLE_URLS"] = 2021] = "COMPONENT_INVALID_STYLE_URLS";
    /**
     * Raised when a type in the `deferredImports` of a component is not a component, directive or
     * pipe.
     */
    ErrorCode[ErrorCode["COMPONENT_UNKNOWN_DEFERRED_IMPORT"] = 2022] = "COMPONENT_UNKNOWN_DEFERRED_IMPORT";
    /**
     * Raised when a `standalone: false` component is declared but `strictStandalone` is set.
     */
    ErrorCode[ErrorCode["NON_STANDALONE_NOT_ALLOWED"] = 2023] = "NON_STANDALONE_NOT_ALLOWED";
    ErrorCode[ErrorCode["SYMBOL_NOT_EXPORTED"] = 3001] = "SYMBOL_NOT_EXPORTED";
    /**
     * Raised when a relationship between directives and/or pipes would cause a cyclic import to be
     * created that cannot be handled, such as in partial compilation mode.
     */
    ErrorCode[ErrorCode["IMPORT_CYCLE_DETECTED"] = 3003] = "IMPORT_CYCLE_DETECTED";
    /**
     * Raised when the compiler is unable to generate an import statement for a reference.
     */
    ErrorCode[ErrorCode["IMPORT_GENERATION_FAILURE"] = 3004] = "IMPORT_GENERATION_FAILURE";
    ErrorCode[ErrorCode["CONFIG_FLAT_MODULE_NO_INDEX"] = 4001] = "CONFIG_FLAT_MODULE_NO_INDEX";
    ErrorCode[ErrorCode["CONFIG_STRICT_TEMPLATES_IMPLIES_FULL_TEMPLATE_TYPECHECK"] = 4002] = "CONFIG_STRICT_TEMPLATES_IMPLIES_FULL_TEMPLATE_TYPECHECK";
    ErrorCode[ErrorCode["CONFIG_EXTENDED_DIAGNOSTICS_IMPLIES_STRICT_TEMPLATES"] = 4003] = "CONFIG_EXTENDED_DIAGNOSTICS_IMPLIES_STRICT_TEMPLATES";
    ErrorCode[ErrorCode["CONFIG_EXTENDED_DIAGNOSTICS_UNKNOWN_CATEGORY_LABEL"] = 4004] = "CONFIG_EXTENDED_DIAGNOSTICS_UNKNOWN_CATEGORY_LABEL";
    ErrorCode[ErrorCode["CONFIG_EXTENDED_DIAGNOSTICS_UNKNOWN_CHECK"] = 4005] = "CONFIG_EXTENDED_DIAGNOSTICS_UNKNOWN_CHECK";
    /**
     * Raised when a host expression has a parse error, such as a host listener or host binding
     * expression containing a pipe.
     */
    ErrorCode[ErrorCode["HOST_BINDING_PARSE_ERROR"] = 5001] = "HOST_BINDING_PARSE_ERROR";
    /**
     * Raised when the compiler cannot parse a component's template.
     */
    ErrorCode[ErrorCode["TEMPLATE_PARSE_ERROR"] = 5002] = "TEMPLATE_PARSE_ERROR";
    /**
     * Raised when an NgModule contains an invalid reference in `declarations`.
     */
    ErrorCode[ErrorCode["NGMODULE_INVALID_DECLARATION"] = 6001] = "NGMODULE_INVALID_DECLARATION";
    /**
     * Raised when an NgModule contains an invalid type in `imports`.
     */
    ErrorCode[ErrorCode["NGMODULE_INVALID_IMPORT"] = 6002] = "NGMODULE_INVALID_IMPORT";
    /**
     * Raised when an NgModule contains an invalid type in `exports`.
     */
    ErrorCode[ErrorCode["NGMODULE_INVALID_EXPORT"] = 6003] = "NGMODULE_INVALID_EXPORT";
    /**
     * Raised when an NgModule contains a type in `exports` which is neither in `declarations` nor
     * otherwise imported.
     */
    ErrorCode[ErrorCode["NGMODULE_INVALID_REEXPORT"] = 6004] = "NGMODULE_INVALID_REEXPORT";
    /**
     * Raised when a `ModuleWithProviders` with a missing
     * generic type argument is passed into an `NgModule`.
     */
    ErrorCode[ErrorCode["NGMODULE_MODULE_WITH_PROVIDERS_MISSING_GENERIC"] = 6005] = "NGMODULE_MODULE_WITH_PROVIDERS_MISSING_GENERIC";
    /**
     * Raised when an NgModule exports multiple directives/pipes of the same name and the compiler
     * attempts to generate private re-exports within the NgModule file.
     */
    ErrorCode[ErrorCode["NGMODULE_REEXPORT_NAME_COLLISION"] = 6006] = "NGMODULE_REEXPORT_NAME_COLLISION";
    /**
     * Raised when a directive/pipe is part of the declarations of two or more NgModules.
     */
    ErrorCode[ErrorCode["NGMODULE_DECLARATION_NOT_UNIQUE"] = 6007] = "NGMODULE_DECLARATION_NOT_UNIQUE";
    /**
     * Raised when a standalone directive/pipe is part of the declarations of an NgModule.
     */
    ErrorCode[ErrorCode["NGMODULE_DECLARATION_IS_STANDALONE"] = 6008] = "NGMODULE_DECLARATION_IS_STANDALONE";
    /**
     * Raised when a standalone component is part of the bootstrap list of an NgModule.
     */
    ErrorCode[ErrorCode["NGMODULE_BOOTSTRAP_IS_STANDALONE"] = 6009] = "NGMODULE_BOOTSTRAP_IS_STANDALONE";
    /**
     * Indicates that an NgModule is declared with `id: module.id`. This is an anti-pattern that is
     * disabled explicitly in the compiler, that was originally based on a misunderstanding of
     * `NgModule.id`.
     */
    ErrorCode[ErrorCode["WARN_NGMODULE_ID_UNNECESSARY"] = 6100] = "WARN_NGMODULE_ID_UNNECESSARY";
    /**
     * 6999 was previously assigned to NGMODULE_VE_DEPENDENCY_ON_IVY_LIB
     * To prevent any confusion, let's not reassign it.
     */
    /**
     * An element name failed validation against the DOM schema.
     */
    ErrorCode[ErrorCode["SCHEMA_INVALID_ELEMENT"] = 8001] = "SCHEMA_INVALID_ELEMENT";
    /**
     * An element's attribute name failed validation against the DOM schema.
     */
    ErrorCode[ErrorCode["SCHEMA_INVALID_ATTRIBUTE"] = 8002] = "SCHEMA_INVALID_ATTRIBUTE";
    /**
     * No matching directive was found for a `#ref="target"` expression.
     */
    ErrorCode[ErrorCode["MISSING_REFERENCE_TARGET"] = 8003] = "MISSING_REFERENCE_TARGET";
    /**
     * No matching pipe was found for a
     */
    ErrorCode[ErrorCode["MISSING_PIPE"] = 8004] = "MISSING_PIPE";
    /**
     * The left-hand side of an assignment expression was a template variable. Effectively, the
     * template looked like:
     *
     * ```html
     * <ng-template let-something>
     *   <button (click)="something = ...">...</button>
     * </ng-template>
     * ```
     *
     * Template variables are read-only.
     */
    ErrorCode[ErrorCode["WRITE_TO_READ_ONLY_VARIABLE"] = 8005] = "WRITE_TO_READ_ONLY_VARIABLE";
    /**
     * A template variable was declared twice. For example:
     *
     * ```html
     * <div *ngFor="let i of items; let i = index">
     * </div>
     * ```
     */
    ErrorCode[ErrorCode["DUPLICATE_VARIABLE_DECLARATION"] = 8006] = "DUPLICATE_VARIABLE_DECLARATION";
    /**
     * A template has a two way binding (two bindings created by a single syntactical element)
     * in which the input and output are going to different places.
     */
    ErrorCode[ErrorCode["SPLIT_TWO_WAY_BINDING"] = 8007] = "SPLIT_TWO_WAY_BINDING";
    /**
     * A directive usage isn't binding to one or more required inputs.
     */
    ErrorCode[ErrorCode["MISSING_REQUIRED_INPUTS"] = 8008] = "MISSING_REQUIRED_INPUTS";
    /**
     * The tracking expression of a `for` loop block is accessing a variable that is unavailable,
     * for example:
     *
     * ```angular-html
     * <ng-template let-ref>
     *   @for (item of items; track ref) {}
     * </ng-template>
     * ```
     */
    ErrorCode[ErrorCode["ILLEGAL_FOR_LOOP_TRACK_ACCESS"] = 8009] = "ILLEGAL_FOR_LOOP_TRACK_ACCESS";
    /**
     * The trigger of a `defer` block cannot access its trigger element,
     * either because it doesn't exist or it's in a different view.
     *
     * ```angular-html
     * @defer (on interaction(trigger)) {...}
     *
     * <ng-template>
     *   <button #trigger></button>
     * </ng-template>
     * ```
     */
    ErrorCode[ErrorCode["INACCESSIBLE_DEFERRED_TRIGGER_ELEMENT"] = 8010] = "INACCESSIBLE_DEFERRED_TRIGGER_ELEMENT";
    /**
     * A control flow node is projected at the root of a component and is preventing its direct
     * descendants from being projected, because it has more than one root node.
     *
     * ```angular-html
     * <comp>
     *  @if (expr) {
     *    <div projectsIntoSlot></div>
     *    Text preventing the div from being projected
     *  }
     * </comp>
     * ```
     */
    ErrorCode[ErrorCode["CONTROL_FLOW_PREVENTING_CONTENT_PROJECTION"] = 8011] = "CONTROL_FLOW_PREVENTING_CONTENT_PROJECTION";
    /**
     * A pipe imported via `@Component.deferredImports` is
     * used outside of a `@defer` block in a template.
     */
    ErrorCode[ErrorCode["DEFERRED_PIPE_USED_EAGERLY"] = 8012] = "DEFERRED_PIPE_USED_EAGERLY";
    /**
     * A directive/component imported via `@Component.deferredImports` is
     * used outside of a `@defer` block in a template.
     */
    ErrorCode[ErrorCode["DEFERRED_DIRECTIVE_USED_EAGERLY"] = 8013] = "DEFERRED_DIRECTIVE_USED_EAGERLY";
    /**
     * A directive/component/pipe imported via `@Component.deferredImports` is
     * also included into the `@Component.imports` list.
     */
    ErrorCode[ErrorCode["DEFERRED_DEPENDENCY_IMPORTED_EAGERLY"] = 8014] = "DEFERRED_DEPENDENCY_IMPORTED_EAGERLY";
    /** An expression is trying to write to an `@let` declaration. */
    ErrorCode[ErrorCode["ILLEGAL_LET_WRITE"] = 8015] = "ILLEGAL_LET_WRITE";
    /** An expression is trying to read an `@let` before it has been defined. */
    ErrorCode[ErrorCode["LET_USED_BEFORE_DEFINITION"] = 8016] = "LET_USED_BEFORE_DEFINITION";
    /** A `@let` declaration conflicts with another symbol in the same scope. */
    ErrorCode[ErrorCode["CONFLICTING_LET_DECLARATION"] = 8017] = "CONFLICTING_LET_DECLARATION";
    /**
     * A two way binding in a template has an incorrect syntax,
     * parentheses outside brackets. For example:
     *
     * ```html
     * <div ([foo])="bar" />
     * ```
     */
    ErrorCode[ErrorCode["INVALID_BANANA_IN_BOX"] = 8101] = "INVALID_BANANA_IN_BOX";
    /**
     * The left side of a nullish coalescing operation is not nullable.
     *
     * ```html
     * {{ foo ?? bar }}
     * ```
     * When the type of foo doesn't include `null` or `undefined`.
     */
    ErrorCode[ErrorCode["NULLISH_COALESCING_NOT_NULLABLE"] = 8102] = "NULLISH_COALESCING_NOT_NULLABLE";
    /**
     * A known control flow directive (e.g. `*ngIf`) is used in a template,
     * but the `CommonModule` is not imported.
     */
    ErrorCode[ErrorCode["MISSING_CONTROL_FLOW_DIRECTIVE"] = 8103] = "MISSING_CONTROL_FLOW_DIRECTIVE";
    /**
     * A text attribute is not interpreted as a binding but likely intended to be.
     *
     * For example:
     * ```html
     * <div
     *   attr.x="value"
     *   class.blue="true"
     *   style.margin-right.px="5">
     * </div>
     * ```
     *
     * All of the above attributes will just be static text attributes and will not be interpreted as
     * bindings by the compiler.
     */
    ErrorCode[ErrorCode["TEXT_ATTRIBUTE_NOT_BINDING"] = 8104] = "TEXT_ATTRIBUTE_NOT_BINDING";
    /**
     * NgForOf is used in a template, but the user forgot to include let
     * in their statement.
     *
     * For example:
     * ```html
     * <ul><li *ngFor="item of items">{{item["name"]}};</li></ul>
     * ```
     */
    ErrorCode[ErrorCode["MISSING_NGFOROF_LET"] = 8105] = "MISSING_NGFOROF_LET";
    /**
     * Indicates that the binding suffix is not supported
     *
     * Style bindings support suffixes like `style.width.px`, `.em`, and `.%`.
     * These suffixes are _not_ supported for attribute bindings.
     *
     * For example `[attr.width.px]="5"` becomes `width.px="5"` when bound.
     * This is almost certainly unintentional and this error is meant to
     * surface this mistake to the developer.
     */
    ErrorCode[ErrorCode["SUFFIX_NOT_SUPPORTED"] = 8106] = "SUFFIX_NOT_SUPPORTED";
    /**
     * The left side of an optional chain operation is not nullable.
     *
     * ```html
     * {{ foo?.bar }}
     * {{ foo?.['bar'] }}
     * {{ foo?.() }}
     * ```
     * When the type of foo doesn't include `null` or `undefined`.
     */
    ErrorCode[ErrorCode["OPTIONAL_CHAIN_NOT_NULLABLE"] = 8107] = "OPTIONAL_CHAIN_NOT_NULLABLE";
    /**
     * `ngSkipHydration` should not be a binding (it should be a static attribute).
     *
     * For example:
     * ```html
     * <my-cmp [ngSkipHydration]="someTruthyVar" />
     * ```
     *
     * `ngSkipHydration` cannot be a binding and can not have values other than "true" or an empty
     * value
     */
    ErrorCode[ErrorCode["SKIP_HYDRATION_NOT_STATIC"] = 8108] = "SKIP_HYDRATION_NOT_STATIC";
    /**
     * Signal functions should be invoked when interpolated in templates.
     *
     * For example:
     * ```html
     * {{ mySignal() }}
     * ```
     */
    ErrorCode[ErrorCode["INTERPOLATED_SIGNAL_NOT_INVOKED"] = 8109] = "INTERPOLATED_SIGNAL_NOT_INVOKED";
    /**
     * Initializer-based APIs can only be invoked from inside of an initializer.
     *
     * ```ts
     * // Allowed
     * myInput = input();
     *
     * // Not allowed
     * function myInput() {
     *   return input();
     * }
     * ```
     */
    ErrorCode[ErrorCode["UNSUPPORTED_INITIALIZER_API_USAGE"] = 8110] = "UNSUPPORTED_INITIALIZER_API_USAGE";
    /**
     * A function in an event binding is not called.
     *
     * For example:
     * ```html
     * <button (click)="myFunc"></button>
     * ```
     *
     * This will not call `myFunc` when the button is clicked. Instead, it should be
     * `<button (click)="myFunc()"></button>`.
     */
    ErrorCode[ErrorCode["UNINVOKED_FUNCTION_IN_EVENT_BINDING"] = 8111] = "UNINVOKED_FUNCTION_IN_EVENT_BINDING";
    /**
     * A `@let` declaration in a template isn't used.
     *
     * For example:
     * ```angular-html
     * @let used = 1; <!-- Not an error -->
     * @let notUsed = 2; <!-- Error -->
     *
     * {{used}}
     * ```
     */
    ErrorCode[ErrorCode["UNUSED_LET_DECLARATION"] = 8112] = "UNUSED_LET_DECLARATION";
    /**
     * A symbol referenced in `@Component.imports` isn't being used within the template.
     */
    ErrorCode[ErrorCode["UNUSED_STANDALONE_IMPORTS"] = 8113] = "UNUSED_STANDALONE_IMPORTS";
    /**
     * The template type-checking engine would need to generate an inline type check block for a
     * component, but the current type-checking environment doesn't support it.
     */
    ErrorCode[ErrorCode["INLINE_TCB_REQUIRED"] = 8900] = "INLINE_TCB_REQUIRED";
    /**
     * The template type-checking engine would need to generate an inline type constructor for a
     * directive or component, but the current type-checking environment doesn't support it.
     */
    ErrorCode[ErrorCode["INLINE_TYPE_CTOR_REQUIRED"] = 8901] = "INLINE_TYPE_CTOR_REQUIRED";
    /**
     * An injectable already has a `ɵprov` property.
     */
    ErrorCode[ErrorCode["INJECTABLE_DUPLICATE_PROV"] = 9001] = "INJECTABLE_DUPLICATE_PROV";
    // 10XXX error codes are reserved for diagnostics with categories other than
    // `ts.DiagnosticCategory.Error`. These diagnostics are generated by the compiler when configured
    // to do so by a tool such as the Language Service, or by the Language Service itself.
    /**
     * Suggest users to enable `strictTemplates` to make use of full capabilities
     * provided by Angular language service.
     */
    ErrorCode[ErrorCode["SUGGEST_STRICT_TEMPLATES"] = 10001] = "SUGGEST_STRICT_TEMPLATES";
    /**
     * Indicates that a particular structural directive provides advanced type narrowing
     * functionality, but the current template type-checking configuration does not allow its usage in
     * type inference.
     */
    ErrorCode[ErrorCode["SUGGEST_SUBOPTIMAL_TYPE_INFERENCE"] = 10002] = "SUGGEST_SUBOPTIMAL_TYPE_INFERENCE";
    /**
     * In local compilation mode a const is required to be resolved statically but cannot be so since
     * it is imported from a file outside of the compilation unit. This usually happens with const
     * being used as Angular decorators parameters such as `@Component.template`,
     * `@HostListener.eventName`, etc.
     */
    ErrorCode[ErrorCode["LOCAL_COMPILATION_UNRESOLVED_CONST"] = 11001] = "LOCAL_COMPILATION_UNRESOLVED_CONST";
    /**
     * In local compilation mode a certain expression or syntax is not supported. This is usually
     * because the expression/syntax is not very common and so we did not add support for it yet. This
     * can be changed in the future and support for more expressions could be added if need be.
     * Meanwhile, this error is thrown to indicate a current unavailability.
     */
    ErrorCode[ErrorCode["LOCAL_COMPILATION_UNSUPPORTED_EXPRESSION"] = 11003] = "LOCAL_COMPILATION_UNSUPPORTED_EXPRESSION";
})(exports.ErrorCode || (exports.ErrorCode = {}));

/**
 * Contains a set of error messages that have detailed guides at angular.io.
 * Full list of available error guides can be found at https://angular.dev/errors
 */
const COMPILER_ERRORS_WITH_GUIDES = new Set([
    exports.ErrorCode.DECORATOR_ARG_NOT_LITERAL,
    exports.ErrorCode.IMPORT_CYCLE_DETECTED,
    exports.ErrorCode.PARAM_MISSING_TOKEN,
    exports.ErrorCode.SCHEMA_INVALID_ELEMENT,
    exports.ErrorCode.SCHEMA_INVALID_ATTRIBUTE,
    exports.ErrorCode.MISSING_REFERENCE_TARGET,
    exports.ErrorCode.COMPONENT_INVALID_SHADOW_DOM_SELECTOR,
    exports.ErrorCode.WARN_NGMODULE_ID_UNNECESSARY,
]);

function ngErrorCode(code) {
    return parseInt('-99' + code);
}

class FatalDiagnosticError extends Error {
    code;
    node;
    diagnosticMessage;
    relatedInformation;
    constructor(code, node, diagnosticMessage, relatedInformation) {
        super(`FatalDiagnosticError: Code: ${code}, Message: ${ts.flattenDiagnosticMessageText(diagnosticMessage, '\n')}`);
        this.code = code;
        this.node = node;
        this.diagnosticMessage = diagnosticMessage;
        this.relatedInformation = relatedInformation;
        // Extending `Error` ends up breaking some internal tests. This appears to be a known issue
        // when extending errors in TS and the workaround is to explicitly set the prototype.
        // https://stackoverflow.com/questions/41102060/typescript-extending-error-class
        Object.setPrototypeOf(this, new.target.prototype);
    }
    /**
     * @internal
     */
    _isFatalDiagnosticError = true;
    toDiagnostic() {
        return makeDiagnostic(this.code, this.node, this.diagnosticMessage, this.relatedInformation);
    }
}
function makeDiagnostic(code, node, messageText, relatedInformation, category = ts.DiagnosticCategory.Error) {
    node = ts.getOriginalNode(node);
    return {
        category,
        code: ngErrorCode(code),
        file: ts.getOriginalNode(node).getSourceFile(),
        start: node.getStart(undefined, false),
        length: node.getWidth(),
        messageText,
        relatedInformation,
    };
}
function makeDiagnosticChain(messageText, next) {
    return {
        category: ts.DiagnosticCategory.Message,
        code: 0,
        messageText,
        next,
    };
}
function makeRelatedInformation(node, messageText) {
    node = ts.getOriginalNode(node);
    return {
        category: ts.DiagnosticCategory.Message,
        code: 0,
        file: node.getSourceFile(),
        start: node.getStart(),
        length: node.getWidth(),
        messageText,
    };
}
function addDiagnosticChain(messageText, add) {
    if (typeof messageText === 'string') {
        return makeDiagnosticChain(messageText, add);
    }
    if (messageText.next === undefined) {
        messageText.next = add;
    }
    else {
        messageText.next.push(...add);
    }
    return messageText;
}
function isFatalDiagnosticError(err) {
    return err._isFatalDiagnosticError === true;
}

/**
 * Enum holding the name of each extended template diagnostic. The name is used as a user-meaningful
 * value for configuring the diagnostic in the project's options.
 *
 * See the corresponding `ErrorCode` for documentation about each specific error.
 * packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts
 *
 * @publicApi
 */
exports.ExtendedTemplateDiagnosticName = void 0;
(function (ExtendedTemplateDiagnosticName) {
    ExtendedTemplateDiagnosticName["INVALID_BANANA_IN_BOX"] = "invalidBananaInBox";
    ExtendedTemplateDiagnosticName["NULLISH_COALESCING_NOT_NULLABLE"] = "nullishCoalescingNotNullable";
    ExtendedTemplateDiagnosticName["OPTIONAL_CHAIN_NOT_NULLABLE"] = "optionalChainNotNullable";
    ExtendedTemplateDiagnosticName["MISSING_CONTROL_FLOW_DIRECTIVE"] = "missingControlFlowDirective";
    ExtendedTemplateDiagnosticName["TEXT_ATTRIBUTE_NOT_BINDING"] = "textAttributeNotBinding";
    ExtendedTemplateDiagnosticName["UNINVOKED_FUNCTION_IN_EVENT_BINDING"] = "uninvokedFunctionInEventBinding";
    ExtendedTemplateDiagnosticName["MISSING_NGFOROF_LET"] = "missingNgForOfLet";
    ExtendedTemplateDiagnosticName["SUFFIX_NOT_SUPPORTED"] = "suffixNotSupported";
    ExtendedTemplateDiagnosticName["SKIP_HYDRATION_NOT_STATIC"] = "skipHydrationNotStatic";
    ExtendedTemplateDiagnosticName["INTERPOLATED_SIGNAL_NOT_INVOKED"] = "interpolatedSignalNotInvoked";
    ExtendedTemplateDiagnosticName["CONTROL_FLOW_PREVENTING_CONTENT_PROJECTION"] = "controlFlowPreventingContentProjection";
    ExtendedTemplateDiagnosticName["UNUSED_LET_DECLARATION"] = "unusedLetDeclaration";
    ExtendedTemplateDiagnosticName["UNUSED_STANDALONE_IMPORTS"] = "unusedStandaloneImports";
})(exports.ExtendedTemplateDiagnosticName || (exports.ExtendedTemplateDiagnosticName = {}));

/**
 * The default `FileSystem` that will always fail.
 *
 * This is a way of ensuring that the developer consciously chooses and
 * configures the `FileSystem` before using it; particularly important when
 * considering static functions like `absoluteFrom()` which rely on
 * the `FileSystem` under the hood.
 */
class InvalidFileSystem {
    exists(path) {
        throw makeError();
    }
    readFile(path) {
        throw makeError();
    }
    readFileBuffer(path) {
        throw makeError();
    }
    writeFile(path, data, exclusive) {
        throw makeError();
    }
    removeFile(path) {
        throw makeError();
    }
    symlink(target, path) {
        throw makeError();
    }
    readdir(path) {
        throw makeError();
    }
    lstat(path) {
        throw makeError();
    }
    stat(path) {
        throw makeError();
    }
    pwd() {
        throw makeError();
    }
    chdir(path) {
        throw makeError();
    }
    extname(path) {
        throw makeError();
    }
    copyFile(from, to) {
        throw makeError();
    }
    moveFile(from, to) {
        throw makeError();
    }
    ensureDir(path) {
        throw makeError();
    }
    removeDeep(path) {
        throw makeError();
    }
    isCaseSensitive() {
        throw makeError();
    }
    resolve(...paths) {
        throw makeError();
    }
    dirname(file) {
        throw makeError();
    }
    join(basePath, ...paths) {
        throw makeError();
    }
    isRoot(path) {
        throw makeError();
    }
    isRooted(path) {
        throw makeError();
    }
    relative(from, to) {
        throw makeError();
    }
    basename(filePath, extension) {
        throw makeError();
    }
    realpath(filePath) {
        throw makeError();
    }
    getDefaultLibLocation() {
        throw makeError();
    }
    normalize(path) {
        throw makeError();
    }
}
function makeError() {
    return new Error('FileSystem has not been configured. Please call `setFileSystem()` before calling this method.');
}

const TS_DTS_JS_EXTENSION = /(?:\.d)?\.ts$|\.js$/;
/**
 * Remove a .ts, .d.ts, or .js extension from a file name.
 */
function stripExtension(path) {
    return path.replace(TS_DTS_JS_EXTENSION, '');
}
function getSourceFileOrError(program, fileName) {
    const sf = program.getSourceFile(fileName);
    if (sf === undefined) {
        throw new Error(`Program does not contain "${fileName}" - available files are ${program
            .getSourceFiles()
            .map((sf) => sf.fileName)
            .join(', ')}`);
    }
    return sf;
}

let fs = new InvalidFileSystem();
function getFileSystem() {
    return fs;
}
function setFileSystem(fileSystem) {
    fs = fileSystem;
}
/**
 * Convert the path `path` to an `AbsoluteFsPath`, throwing an error if it's not an absolute path.
 */
function absoluteFrom(path) {
    if (!fs.isRooted(path)) {
        throw new Error(`Internal Error: absoluteFrom(${path}): path is not absolute`);
    }
    return fs.resolve(path);
}
const ABSOLUTE_PATH = Symbol('AbsolutePath');
/**
 * Extract an `AbsoluteFsPath` from a `ts.SourceFile`-like object.
 */
function absoluteFromSourceFile(sf) {
    const sfWithPatch = sf;
    if (sfWithPatch[ABSOLUTE_PATH] === undefined) {
        sfWithPatch[ABSOLUTE_PATH] = fs.resolve(sfWithPatch.fileName);
    }
    // Non-null assertion needed since TS doesn't narrow the type of fields that use a symbol as a key
    // apparently.
    return sfWithPatch[ABSOLUTE_PATH];
}
/**
 * Static access to `dirname`.
 */
function dirname(file) {
    return fs.dirname(file);
}
/**
 * Static access to `join`.
 */
function join(basePath, ...paths) {
    return fs.join(basePath, ...paths);
}
/**
 * Static access to `resolve`s.
 */
function resolve(basePath, ...paths) {
    return fs.resolve(basePath, ...paths);
}
/**
 * Static access to `isRooted`.
 */
function isRooted(path) {
    return fs.isRooted(path);
}
/**
 * Static access to `relative`.
 */
function relative(from, to) {
    return fs.relative(from, to);
}
/**
 * Returns true if the given path is locally relative.
 *
 * This is used to work out if the given path is relative (i.e. not absolute) but also is not
 * escaping the current directory.
 */
function isLocalRelativePath(relativePath) {
    return !isRooted(relativePath) && !relativePath.startsWith('..');
}
/**
 * Converts a path to a form suitable for use as a relative module import specifier.
 *
 * In other words it adds the `./` to the path if it is locally relative.
 */
function toRelativeImport(relativePath) {
    return isLocalRelativePath(relativePath) ? `./${relativePath}` : relativePath;
}

const LogicalProjectPath = {
    /**
     * Get the relative path between two `LogicalProjectPath`s.
     *
     * This will return a `PathSegment` which would be a valid module specifier to use in `from` when
     * importing from `to`.
     */
    relativePathBetween: function (from, to) {
        const relativePath = relative(dirname(resolve(from)), resolve(to));
        return toRelativeImport(relativePath);
    },
};
/**
 * A utility class which can translate absolute paths to source files into logical paths in
 * TypeScript's logical file system, based on the root directories of the project.
 */
class LogicalFileSystem {
    compilerHost;
    /**
     * The root directories of the project, sorted with the longest path first.
     */
    rootDirs;
    /**
     * The same root directories as `rootDirs` but with each one converted to its
     * canonical form for matching in case-insensitive file-systems.
     */
    canonicalRootDirs;
    /**
     * A cache of file paths to project paths, because computation of these paths is slightly
     * expensive.
     */
    cache = new Map();
    constructor(rootDirs, compilerHost) {
        this.compilerHost = compilerHost;
        // Make a copy and sort it by length in reverse order (longest first). This speeds up lookups,
        // since there's no need to keep going through the array once a match is found.
        this.rootDirs = rootDirs.concat([]).sort((a, b) => b.length - a.length);
        this.canonicalRootDirs = this.rootDirs.map((dir) => this.compilerHost.getCanonicalFileName(dir));
    }
    /**
     * Get the logical path in the project of a `ts.SourceFile`.
     *
     * This method is provided as a convenient alternative to calling
     * `logicalPathOfFile(absoluteFromSourceFile(sf))`.
     */
    logicalPathOfSf(sf) {
        return this.logicalPathOfFile(absoluteFromSourceFile(sf));
    }
    /**
     * Get the logical path in the project of a source file.
     *
     * @returns A `LogicalProjectPath` to the source file, or `null` if the source file is not in any
     * of the TS project's root directories.
     */
    logicalPathOfFile(physicalFile) {
        if (!this.cache.has(physicalFile)) {
            const canonicalFilePath = this.compilerHost.getCanonicalFileName(physicalFile);
            let logicalFile = null;
            for (let i = 0; i < this.rootDirs.length; i++) {
                const rootDir = this.rootDirs[i];
                const canonicalRootDir = this.canonicalRootDirs[i];
                if (isWithinBasePath(canonicalRootDir, canonicalFilePath)) {
                    // Note that we match against canonical paths but then create the logical path from
                    // original paths.
                    logicalFile = this.createLogicalProjectPath(physicalFile, rootDir);
                    // The logical project does not include any special "node_modules" nested directories.
                    if (logicalFile.indexOf('/node_modules/') !== -1) {
                        logicalFile = null;
                    }
                    else {
                        break;
                    }
                }
            }
            this.cache.set(physicalFile, logicalFile);
        }
        return this.cache.get(physicalFile);
    }
    createLogicalProjectPath(file, rootDir) {
        const logicalPath = stripExtension(file.slice(rootDir.length));
        return (logicalPath.startsWith('/') ? logicalPath : '/' + logicalPath);
    }
}
/**
 * Is the `path` a descendant of the `base`?
 * E.g. `foo/bar/zee` is within `foo/bar` but not within `foo/car`.
 */
function isWithinBasePath(base, path) {
    return isLocalRelativePath(relative(base, path));
}

/// <reference types="node" />
/**
 * A wrapper around the Node.js file-system that supports path manipulation.
 */
class NodeJSPathManipulation {
    pwd() {
        return this.normalize(process.cwd());
    }
    chdir(dir) {
        process.chdir(dir);
    }
    resolve(...paths) {
        return this.normalize(p__namespace.resolve(...paths));
    }
    dirname(file) {
        return this.normalize(p__namespace.dirname(file));
    }
    join(basePath, ...paths) {
        return this.normalize(p__namespace.join(basePath, ...paths));
    }
    isRoot(path) {
        return this.dirname(path) === this.normalize(path);
    }
    isRooted(path) {
        return p__namespace.isAbsolute(path);
    }
    relative(from, to) {
        return this.normalize(p__namespace.relative(from, to));
    }
    basename(filePath, extension) {
        return p__namespace.basename(filePath, extension);
    }
    extname(path) {
        return p__namespace.extname(path);
    }
    normalize(path) {
        // Convert backslashes to forward slashes
        return path.replace(/\\/g, '/');
    }
}
// G3-ESM-MARKER: G3 uses CommonJS, but externally everything in ESM.
// CommonJS/ESM interop for determining the current file name and containing dir.
const isCommonJS = typeof __filename !== 'undefined';
const currentFileUrl = isCommonJS ? null : (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('checker-BwV9MjSQ.cjs', document.baseURI).href));
const currentFileName = isCommonJS ? __filename : url.fileURLToPath(currentFileUrl);
/**
 * A wrapper around the Node.js file-system that supports readonly operations and path manipulation.
 */
class NodeJSReadonlyFileSystem extends NodeJSPathManipulation {
    _caseSensitive = undefined;
    isCaseSensitive() {
        if (this._caseSensitive === undefined) {
            // Note the use of the real file-system is intentional:
            // `this.exists()` relies upon `isCaseSensitive()` so that would cause an infinite recursion.
            this._caseSensitive = !fs$1.existsSync(this.normalize(toggleCase(currentFileName)));
        }
        return this._caseSensitive;
    }
    exists(path) {
        return fs$1.existsSync(path);
    }
    readFile(path) {
        return fs$1.readFileSync(path, 'utf8');
    }
    readFileBuffer(path) {
        return fs$1.readFileSync(path);
    }
    readdir(path) {
        return fs$1.readdirSync(path);
    }
    lstat(path) {
        return fs$1.lstatSync(path);
    }
    stat(path) {
        return fs$1.statSync(path);
    }
    realpath(path) {
        return this.resolve(fs$1.realpathSync(path));
    }
    getDefaultLibLocation() {
        // G3-ESM-MARKER: G3 uses CommonJS, but externally everything in ESM.
        const requireFn = isCommonJS ? require : module$1.createRequire(currentFileUrl);
        return this.resolve(requireFn.resolve('typescript'), '..');
    }
}
/**
 * A wrapper around the Node.js file-system (i.e. the `fs` package).
 */
class NodeJSFileSystem extends NodeJSReadonlyFileSystem {
    writeFile(path, data, exclusive = false) {
        fs$1.writeFileSync(path, data, exclusive ? { flag: 'wx' } : undefined);
    }
    removeFile(path) {
        fs$1.unlinkSync(path);
    }
    symlink(target, path) {
        fs$1.symlinkSync(target, path);
    }
    copyFile(from, to) {
        fs$1.copyFileSync(from, to);
    }
    moveFile(from, to) {
        fs$1.renameSync(from, to);
    }
    ensureDir(path) {
        fs$1.mkdirSync(path, { recursive: true });
    }
    removeDeep(path) {
        fs$1.rmdirSync(path, { recursive: true });
    }
}
/**
 * Toggle the case of each character in a string.
 */
function toggleCase(str) {
    return str.replace(/\w/g, (ch) => ch.toUpperCase() === ch ? ch.toLowerCase() : ch.toUpperCase());
}

const TS = /\.tsx?$/i;
const D_TS = /\.d\.ts$/i;
function isSymbolWithValueDeclaration(symbol) {
    // If there is a value declaration set, then the `declarations` property is never undefined. We
    // still check for the property to exist as this matches with the type that `symbol` is narrowed
    // to.
    return (symbol != null && symbol.valueDeclaration !== undefined && symbol.declarations !== undefined);
}
function isDtsPath(filePath) {
    return D_TS.test(filePath);
}
function isNonDeclarationTsPath(filePath) {
    return TS.test(filePath) && !D_TS.test(filePath);
}
function isFromDtsFile(node) {
    let sf = node.getSourceFile();
    if (sf === undefined) {
        sf = ts.getOriginalNode(node).getSourceFile();
    }
    return sf !== undefined && sf.isDeclarationFile;
}
function nodeNameForError(node) {
    if (node.name !== undefined && ts.isIdentifier(node.name)) {
        return node.name.text;
    }
    else {
        const kind = ts.SyntaxKind[node.kind];
        const { line, character } = ts.getLineAndCharacterOfPosition(node.getSourceFile(), node.getStart());
        return `${kind}@${line}:${character}`;
    }
}
function getSourceFile(node) {
    // In certain transformation contexts, `ts.Node.getSourceFile()` can actually return `undefined`,
    // despite the type signature not allowing it. In that event, get the `ts.SourceFile` via the
    // original node instead (which works).
    const directSf = node.getSourceFile();
    return directSf !== undefined ? directSf : ts.getOriginalNode(node).getSourceFile();
}
function getSourceFileOrNull(program, fileName) {
    return program.getSourceFile(fileName) || null;
}
function getTokenAtPosition(sf, pos) {
    // getTokenAtPosition is part of TypeScript's private API.
    return ts.getTokenAtPosition(sf, pos);
}
function identifierOfNode(decl) {
    if (decl.name !== undefined && ts.isIdentifier(decl.name)) {
        return decl.name;
    }
    else {
        return null;
    }
}
function isDeclaration(node) {
    return isValueDeclaration(node) || isTypeDeclaration(node);
}
function isValueDeclaration(node) {
    return (ts.isClassDeclaration(node) || ts.isFunctionDeclaration(node) || ts.isVariableDeclaration(node));
}
function isTypeDeclaration(node) {
    return (ts.isEnumDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node));
}
function isNamedDeclaration(node) {
    const namedNode = node;
    return namedNode.name !== undefined && ts.isIdentifier(namedNode.name);
}
function getRootDirs(host, options) {
    const rootDirs = [];
    const cwd = host.getCurrentDirectory();
    const fs = getFileSystem();
    if (options.rootDirs !== undefined) {
        rootDirs.push(...options.rootDirs);
    }
    else if (options.rootDir !== undefined) {
        rootDirs.push(options.rootDir);
    }
    else {
        rootDirs.push(cwd);
    }
    // In Windows the above might not always return posix separated paths
    // See:
    // https://github.com/Microsoft/TypeScript/blob/3f7357d37f66c842d70d835bc925ec2a873ecfec/src/compiler/sys.ts#L650
    // Also compiler options might be set via an API which doesn't normalize paths
    return rootDirs.map((rootDir) => fs.resolve(cwd, host.getCanonicalFileName(rootDir)));
}
function nodeDebugInfo(node) {
    const sf = getSourceFile(node);
    const { line, character } = ts.getLineAndCharacterOfPosition(sf, node.pos);
    return `[${sf.fileName}: ${ts.SyntaxKind[node.kind]} @ ${line}:${character}]`;
}
/**
 * Resolve the specified `moduleName` using the given `compilerOptions` and `compilerHost`.
 *
 * This helper will attempt to use the `CompilerHost.resolveModuleNames()` method if available.
 * Otherwise it will fallback on the `ts.ResolveModuleName()` function.
 */
function resolveModuleName(moduleName, containingFile, compilerOptions, compilerHost, moduleResolutionCache) {
    if (compilerHost.resolveModuleNames) {
        return compilerHost.resolveModuleNames([moduleName], containingFile, undefined, // reusedNames
        undefined, // redirectedReference
        compilerOptions)[0];
    }
    else {
        return ts.resolveModuleName(moduleName, containingFile, compilerOptions, compilerHost, moduleResolutionCache !== null ? moduleResolutionCache : undefined).resolvedModule;
    }
}
/** Returns true if the node is an assignment expression. */
function isAssignment(node) {
    return ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken;
}
/**
 * Obtains the non-redirected source file for `sf`.
 */
function toUnredirectedSourceFile(sf) {
    const redirectInfo = sf.redirectInfo;
    if (redirectInfo === undefined) {
        return sf;
    }
    return redirectInfo.unredirected;
}

/**
 * Find the name, if any, by which a node is exported from a given file.
 */
function findExportedNameOfNode(target, file, reflector) {
    const exports = reflector.getExportsOfModule(file);
    if (exports === null) {
        return null;
    }
    const declaredName = isNamedDeclaration(target) ? target.name.text : null;
    // Look for the export which declares the node.
    let foundExportName = null;
    for (const [exportName, declaration] of exports) {
        if (declaration.node !== target) {
            continue;
        }
        if (exportName === declaredName) {
            // A non-alias export exists which is always preferred, so use that one.
            return exportName;
        }
        foundExportName = exportName;
    }
    return foundExportName;
}

/**
 * Flags which alter the imports generated by the `ReferenceEmitter`.
 */
exports.ImportFlags = void 0;
(function (ImportFlags) {
    ImportFlags[ImportFlags["None"] = 0] = "None";
    /**
     * Force the generation of a new import when generating a reference, even if an identifier already
     * exists in the target file which could be used instead.
     *
     * This is sometimes required if there's a risk TypeScript might remove imports during emit.
     */
    ImportFlags[ImportFlags["ForceNewImport"] = 1] = "ForceNewImport";
    /**
     * Don't make use of any aliasing information when emitting a reference.
     *
     * This is sometimes required if emitting into a context where generated references will be fed
     * into TypeScript and type-checked (such as in template type-checking).
     */
    ImportFlags[ImportFlags["NoAliasing"] = 2] = "NoAliasing";
    /**
     * Indicates that an import to a type-only declaration is allowed.
     *
     * For references that occur in type-positions, the referred declaration may be a type-only
     * declaration that is not retained during emit. Including this flag allows to emit references to
     * type-only declarations as used in e.g. template type-checking.
     */
    ImportFlags[ImportFlags["AllowTypeImports"] = 4] = "AllowTypeImports";
    /**
     * Indicates that importing from a declaration file using a relative import path is allowed.
     *
     * The generated imports should normally use module specifiers that are valid for use in
     * production code, where arbitrary relative imports into e.g. node_modules are not allowed. For
     * template type-checking code it is however acceptable to use relative imports, as such files are
     * never emitted to JS code.
     *
     * Non-declaration files have to be contained within a configured `rootDir` so using relative
     * paths may not be possible for those, hence this flag only applies when importing from a
     * declaration file.
     */
    ImportFlags[ImportFlags["AllowRelativeDtsImports"] = 8] = "AllowRelativeDtsImports";
    /**
     * Indicates that references coming from ambient imports are allowed.
     */
    ImportFlags[ImportFlags["AllowAmbientReferences"] = 16] = "AllowAmbientReferences";
})(exports.ImportFlags || (exports.ImportFlags = {}));
exports.ReferenceEmitKind = void 0;
(function (ReferenceEmitKind) {
    ReferenceEmitKind[ReferenceEmitKind["Success"] = 0] = "Success";
    ReferenceEmitKind[ReferenceEmitKind["Failed"] = 1] = "Failed";
})(exports.ReferenceEmitKind || (exports.ReferenceEmitKind = {}));
/**
 * Verifies that a reference was emitted successfully, or raises a `FatalDiagnosticError` otherwise.
 * @param result The emit result that should have been successful.
 * @param origin The node that is used to report the failure diagnostic.
 * @param typeKind The kind of the symbol that the reference represents, e.g. 'component' or
 *     'class'.
 */
function assertSuccessfulReferenceEmit(result, origin, typeKind) {
    if (result.kind === exports.ReferenceEmitKind.Success) {
        return;
    }
    const message = makeDiagnosticChain(`Unable to import ${typeKind} ${nodeNameForError(result.ref.node)}.`, [makeDiagnosticChain(result.reason)]);
    throw new FatalDiagnosticError(exports.ErrorCode.IMPORT_GENERATION_FAILURE, origin, message, [
        makeRelatedInformation(result.ref.node, `The ${typeKind} is declared here.`),
    ]);
}
/**
 * Generates `Expression`s which refer to `Reference`s in a given context.
 *
 * A `ReferenceEmitter` uses one or more `ReferenceEmitStrategy` implementations to produce an
 * `Expression` which refers to a `Reference` in the context of a particular file.
 */
class ReferenceEmitter {
    strategies;
    constructor(strategies) {
        this.strategies = strategies;
    }
    emit(ref, context, importFlags = exports.ImportFlags.None) {
        for (const strategy of this.strategies) {
            const emitted = strategy.emit(ref, context, importFlags);
            if (emitted !== null) {
                return emitted;
            }
        }
        return {
            kind: exports.ReferenceEmitKind.Failed,
            ref,
            context,
            reason: `Unable to write a reference to ${nodeNameForError(ref.node)}.`,
        };
    }
}
/**
 * A `ReferenceEmitStrategy` which will refer to declarations by any local `ts.Identifier`s, if
 * such identifiers are available.
 */
class LocalIdentifierStrategy {
    emit(ref, context, importFlags) {
        const refSf = getSourceFile(ref.node);
        // If the emitter has specified ForceNewImport, then LocalIdentifierStrategy should not use a
        // local identifier at all, *except* in the source file where the node is actually declared.
        if (importFlags & exports.ImportFlags.ForceNewImport && refSf !== context) {
            return null;
        }
        // If referenced node is not an actual TS declaration (e.g. `class Foo` or `function foo() {}`,
        // etc) and it is in the current file then just use it directly.
        // This is important because the reference could be a property access (e.g. `exports.foo`). In
        // such a case, the reference's `identities` property would be `[foo]`, which would result in an
        // invalid emission of a free-standing `foo` identifier, rather than `exports.foo`.
        if (!isDeclaration(ref.node) && refSf === context) {
            return {
                kind: exports.ReferenceEmitKind.Success,
                expression: new WrappedNodeExpr(ref.node),
                importedFile: null,
            };
        }
        // If the reference is to an ambient type, it can be referenced directly.
        if (ref.isAmbient && importFlags & exports.ImportFlags.AllowAmbientReferences) {
            const identifier = identifierOfNode(ref.node);
            if (identifier !== null) {
                return {
                    kind: exports.ReferenceEmitKind.Success,
                    expression: new WrappedNodeExpr(identifier),
                    importedFile: null,
                };
            }
            else {
                return null;
            }
        }
        // A Reference can have multiple identities in different files, so it may already have an
        // Identifier in the requested context file.
        const identifier = ref.getIdentityIn(context);
        if (identifier !== null) {
            return {
                kind: exports.ReferenceEmitKind.Success,
                expression: new WrappedNodeExpr(identifier),
                importedFile: null,
            };
        }
        else {
            return null;
        }
    }
}
/**
 * A `ReferenceEmitStrategy` which will refer to declarations that come from `node_modules` using
 * an absolute import.
 *
 * Part of this strategy involves looking at the target entry point and identifying the exported
 * name of the targeted declaration, as it might be different from the declared name (e.g. a
 * directive might be declared as FooDirImpl, but exported as FooDir). If no export can be found
 * which maps back to the original directive, an error is thrown.
 */
class AbsoluteModuleStrategy {
    program;
    checker;
    moduleResolver;
    reflectionHost;
    /**
     * A cache of the exports of specific modules, because resolving a module to its exports is a
     * costly operation.
     */
    moduleExportsCache = new Map();
    constructor(program, checker, moduleResolver, reflectionHost) {
        this.program = program;
        this.checker = checker;
        this.moduleResolver = moduleResolver;
        this.reflectionHost = reflectionHost;
    }
    emit(ref, context, importFlags) {
        if (ref.bestGuessOwningModule === null) {
            // There is no module name available for this Reference, meaning it was arrived at via a
            // relative path.
            return null;
        }
        else if (!isDeclaration(ref.node)) {
            // It's not possible to import something which isn't a declaration.
            throw new Error(`Debug assert: unable to import a Reference to non-declaration of type ${ts.SyntaxKind[ref.node.kind]}.`);
        }
        else if ((importFlags & exports.ImportFlags.AllowTypeImports) === 0 && isTypeDeclaration(ref.node)) {
            throw new Error(`Importing a type-only declaration of type ${ts.SyntaxKind[ref.node.kind]} in a value position is not allowed.`);
        }
        // Try to find the exported name of the declaration, if one is available.
        const { specifier, resolutionContext } = ref.bestGuessOwningModule;
        const exports$1 = this.getExportsOfModule(specifier, resolutionContext);
        if (exports$1.module === null) {
            return {
                kind: exports.ReferenceEmitKind.Failed,
                ref,
                context,
                reason: `The module '${specifier}' could not be found.`,
            };
        }
        else if (exports$1.exportMap === null || !exports$1.exportMap.has(ref.node)) {
            return {
                kind: exports.ReferenceEmitKind.Failed,
                ref,
                context,
                reason: `The symbol is not exported from ${exports$1.module.fileName} (module '${specifier}').`,
            };
        }
        const symbolName = exports$1.exportMap.get(ref.node);
        return {
            kind: exports.ReferenceEmitKind.Success,
            expression: new ExternalExpr(new ExternalReference(specifier, symbolName)),
            importedFile: exports$1.module,
        };
    }
    getExportsOfModule(moduleName, fromFile) {
        if (!this.moduleExportsCache.has(moduleName)) {
            this.moduleExportsCache.set(moduleName, this.enumerateExportsOfModule(moduleName, fromFile));
        }
        return this.moduleExportsCache.get(moduleName);
    }
    enumerateExportsOfModule(specifier, fromFile) {
        // First, resolve the module specifier to its entry point, and get the ts.Symbol for it.
        const entryPointFile = this.moduleResolver.resolveModule(specifier, fromFile);
        if (entryPointFile === null) {
            return { module: null, exportMap: null };
        }
        const exports = this.reflectionHost.getExportsOfModule(entryPointFile);
        if (exports === null) {
            return { module: entryPointFile, exportMap: null };
        }
        const exportMap = new Map();
        for (const [name, declaration] of exports) {
            if (exportMap.has(declaration.node)) {
                // An export for this declaration has already been registered. We prefer an export that
                // has the same name as the declared name, i.e. is not an aliased export. This is relevant
                // for partial compilations where emitted references should import symbols using a stable
                // name. This is particularly relevant for declarations inside VE-generated libraries, as
                // such libraries contain private, unstable reexports of symbols.
                const existingExport = exportMap.get(declaration.node);
                if (isNamedDeclaration(declaration.node) && declaration.node.name.text === existingExport) {
                    continue;
                }
            }
            exportMap.set(declaration.node, name);
        }
        return { module: entryPointFile, exportMap };
    }
}
/**
 * A `ReferenceEmitStrategy` which will refer to declarations via relative paths, provided they're
 * both in the logical project "space" of paths.
 *
 * This is trickier than it sounds, as the two files may be in different root directories in the
 * project. Simply calculating a file system relative path between the two is not sufficient.
 * Instead, `LogicalProjectPath`s are used.
 */
class LogicalProjectStrategy {
    reflector;
    logicalFs;
    relativePathStrategy;
    constructor(reflector, logicalFs) {
        this.reflector = reflector;
        this.logicalFs = logicalFs;
        this.relativePathStrategy = new RelativePathStrategy(this.reflector);
    }
    emit(ref, context, importFlags) {
        const destSf = getSourceFile(ref.node);
        // Compute the relative path from the importing file to the file being imported. This is done
        // as a logical path computation, because the two files might be in different rootDirs.
        const destPath = this.logicalFs.logicalPathOfSf(destSf);
        if (destPath === null) {
            // The imported file is not within the logical project filesystem. An import into a
            // declaration file is exempt from `TS6059: File is not under 'rootDir'` so we choose to allow
            // using a filesystem relative path as fallback, if allowed per the provided import flags.
            if (destSf.isDeclarationFile && importFlags & exports.ImportFlags.AllowRelativeDtsImports) {
                return this.relativePathStrategy.emit(ref, context);
            }
            // Note: this error is analogous to `TS6059: File is not under 'rootDir'` that TypeScript
            // reports.
            return {
                kind: exports.ReferenceEmitKind.Failed,
                ref,
                context,
                reason: `The file ${destSf.fileName} is outside of the configured 'rootDir'.`,
            };
        }
        const originPath = this.logicalFs.logicalPathOfSf(context);
        if (originPath === null) {
            throw new Error(`Debug assert: attempt to import from ${context.fileName} but it's outside the program?`);
        }
        // There's no way to emit a relative reference from a file to itself.
        if (destPath === originPath) {
            return null;
        }
        const name = findExportedNameOfNode(ref.node, destSf, this.reflector);
        if (name === null) {
            // The target declaration isn't exported from the file it's declared in. This is an issue!
            return {
                kind: exports.ReferenceEmitKind.Failed,
                ref,
                context,
                reason: `The symbol is not exported from ${destSf.fileName}.`,
            };
        }
        // With both files expressed as LogicalProjectPaths, getting the module specifier as a relative
        // path is now straightforward.
        const moduleName = LogicalProjectPath.relativePathBetween(originPath, destPath);
        return {
            kind: exports.ReferenceEmitKind.Success,
            expression: new ExternalExpr({ moduleName, name }),
            importedFile: destSf,
        };
    }
}
/**
 * A `ReferenceEmitStrategy` which constructs relatives paths between `ts.SourceFile`s.
 *
 * This strategy can be used if there is no `rootDir`/`rootDirs` structure for the project which
 * necessitates the stronger logic of `LogicalProjectStrategy`.
 */
class RelativePathStrategy {
    reflector;
    constructor(reflector) {
        this.reflector = reflector;
    }
    emit(ref, context) {
        const destSf = getSourceFile(ref.node);
        const relativePath = relative(dirname(absoluteFromSourceFile(context)), absoluteFromSourceFile(destSf));
        const moduleName = toRelativeImport(stripExtension(relativePath));
        const name = findExportedNameOfNode(ref.node, destSf, this.reflector);
        if (name === null) {
            return {
                kind: exports.ReferenceEmitKind.Failed,
                ref,
                context,
                reason: `The symbol is not exported from ${destSf.fileName}.`,
            };
        }
        return {
            kind: exports.ReferenceEmitKind.Success,
            expression: new ExternalExpr({ moduleName, name }),
            importedFile: destSf,
        };
    }
}
/**
 * A `ReferenceEmitStrategy` which uses a `UnifiedModulesHost` to generate absolute import
 * references.
 */
class UnifiedModulesStrategy {
    reflector;
    unifiedModulesHost;
    constructor(reflector, unifiedModulesHost) {
        this.reflector = reflector;
        this.unifiedModulesHost = unifiedModulesHost;
    }
    emit(ref, context) {
        const destSf = getSourceFile(ref.node);
        const name = findExportedNameOfNode(ref.node, destSf, this.reflector);
        if (name === null) {
            return null;
        }
        const moduleName = this.unifiedModulesHost.fileNameToModuleName(destSf.fileName, context.fileName);
        return {
            kind: exports.ReferenceEmitKind.Success,
            expression: new ExternalExpr({ moduleName, name }),
            import   edFile: destSf,
        };
    }
}

const patchedReferencedAliasesSymbol = Symbol('patchedReferencedAliases');
/**
 * Patches the alias declaration reference resolution for a given transformation context
 * so that TypeScript knows about the specified alias declarations being referenced.
 *
 * This exists because TypeScript performs analysis of import usage before transformers
 * run and doesn't refresh its state after transformations. This means that imports
 * for symbols used as constructor types are elided due to their original type-only usage.
 *
 * In reality though, since we downlevel decorators and constructor parameters, we want
 * these symbols to be retained in the JavaScript output as they will be used as values
 * at runtime. We can instruct TypeScript to preserve imports for such identifiers by
 * creating a mutable clone of a given import specifier/clause or namespace, but that
 * has the downside of preserving the full import in the JS output. See:
 * https://github.com/microsoft/TypeScript/blob/3eaa7c65f6f076a08a5f7f1946fd0df7c7430259/src/compiler/transformers/ts.ts#L242-L250.
 *
 * This is a trick the CLI used in the past  for constructor parameter downleveling in JIT:
 * https://github.com/angular/angular-cli/blob/b3f84cc5184337666ce61c07b7b9df418030106f/packages/ngtools/webpack/src/transformers/ctor-parameters.ts#L323-L325
 * The trick is not ideal though as it preserves the full import (as outlined before), and it
 * results in a slow-down due to the type checker being involved multiple times. The CLI worked
 * around this import preserving issue by having another complex post-process step that detects and
 * elides unused imports. Note that these unused imports could cause unused chunks being generated
 * by webpack if the application or library is not marked as side-effect free.
 *
 * This is not ideal though, as we basically re-implement the complex import usage resolution
 * from TypeScript. We can do better by letting TypeScript do the import eliding, but providing
 * information about the alias declarations (e.g. import specifiers) that should not be elided
 * because they are actually referenced (as they will now appear in static properties).
 *
 * More information about these limitations with transformers can be found in:
 *   1. https://github.com/Microsoft/TypeScript/issues/17552.
 *   2. https://github.com/microsoft/TypeScript/issues/17516.
 *   3. https://github.com/angular/tsickle/issues/635.
 *
 * The patch we apply to tell TypeScript about actual referenced aliases (i.e. imported symbols),
 * matches conceptually with the logic that runs internally in TypeScript when the
 * `emitDecoratorMetadata` flag is enabled. TypeScript basically surfaces the same problem and
 * solves it conceptually the same way, but obviously doesn't need to access an internal API.
 *
 * The set that is returned by this function is meant to be filled with import declaration nodes
 * that have been referenced in a value-position by the transform, such the installed patch can
 * ensure that those import declarations are not elided.
 *
 * If `null` is returned then the transform operates in an isolated context, i.e. using the
 * `ts.transform` API. In such scenario there is no information whether an alias declaration
 * is referenced, so all alias declarations are naturally preserved and explicitly registering
 * an alias declaration as used isn't necessary.
 *
 * See below. Note that this uses sourcegraph as the TypeScript checker file doesn't display on
 * Github.
 * https://sourcegraph.com/github.com/microsoft/TypeScript@3eaa7c65f6f076a08a5f7f1946fd0df7c7430259/-/blob/src/compiler/checker.ts#L31219-31257
 */
function loadIsReferencedAliasDeclarationPatch(context) {
    // If the `getEmitResolver` method is not available, TS most likely changed the
    // internal structure of the transformation context. We will abort gracefully.
    if (!isTransformationContextWithEmitResolver(context)) {
        throwIncompatibleTransformationContextError();
    }
    const emitResolver = context.getEmitResolver();
    if (emitResolver === undefined) {
        // In isolated `ts.transform` operations no emit resolver is present, return null as `isReferencedAliasDeclaration`
        // will never be invoked.
        return null;
    }
    // The emit resolver may have been patched already, in which case we return the set of referenced
    // aliases that was created when the patch was first applied.
    // See https://github.com/angular/angular/issues/40276.
    const existingReferencedAliases = emitResolver[patchedReferencedAliasesSymbol];
    if (existingReferencedAliases !== undefined) {
        return existingReferencedAliases;
    }
    const originalIsReferencedAliasDeclaration = emitResolver.isReferencedAliasDeclaration;
    // If the emit resolver does not have a function called `isReferencedAliasDeclaration`, then
    // we abort gracefully as most likely TS changed the internal structure of the emit resolver.
    if (originalIsReferencedAliasDeclaration === undefined) {
        throwIncompatibleTransformationContextError();
    }
    const referencedAliases = new Set();
    emitResolver.isReferencedAliasDeclaration = function (node, ...args) {
        if (isAliasImportDeclaration(node) && referencedAliases.has(node)) {
            return true;
        }
        return originalIsReferencedAliasDeclaration.call(emitResolver, node, ...args);
    };
    return (emitResolver[patchedReferencedAliasesSymbol] = referencedAliases);
}
/**
 * Gets whether a given node corresponds to an import alias declaration. Alias
 * declarations can be import specifiers, namespace imports or import clauses
 * as these do not declare an actual symbol but just point to a target declaration.
 */
function isAliasImportDeclaration(node) {
    return ts.isImportSpecifier(node) || ts.isNamespaceImport(node) || ts.isImportClause(node);
}
/** Whether the transformation context exposes its emit resolver. */
function isTransformationContextWithEmitResolver(context) {
    return context.getEmitResolver !== undefined;
}
/**
 * Throws an error about an incompatible TypeScript version for which the alias
 * declaration reference resolution could not be monkey-patched. The error will
 * also propose potential solutions that can be applied by developers.
 */
function throwIncompatibleTransformationContextError() {
    throw Error('Angular compiler is incompatible with this version of the TypeScript compiler.\n\n' +
        'If you recently updated TypeScript and this issue surfaces now, consider downgrading.\n\n' +
        'Please report an issue on the Angular repositories when this issue ' +
        'surfaces and you are using a supposedly compatible TypeScript version.');
}

const DefaultImportDeclaration = Symbol('DefaultImportDeclaration');
/**
 * Attaches a default import declaration to `expr` to indicate the dependency of `expr` on the
 * default import.
 */
function attachDefaultImportDeclaration(expr, importDecl) {
    expr[DefaultImportDeclaration] = importDecl;
}
/**
 * Obtains the default import declaration that `expr` depends on, or `null` if there is no such
 * dependency.
 */
function getDefaultImportDeclaration(expr) {
    return expr[DefaultImportDeclaration] ?? null;
}
/**
 * TypeScript has trouble with generating default imports inside of transformers for some module
 * formats. The issue is that for the statement:
 *
 * import X from 'some/module';
 * console.log(X);
 *
 * TypeScript will not use the "X" name in generated code. For normal user code, this is fine
 * because references to X will also be renamed. However, if both the import and any references are
 * added in a transformer, TypeScript does not associate the two, and will leave the "X" references
 * dangling while renaming the import variable. The generated code looks something like:
 *
 * const module_1 = require('some/module');
 * console.log(X); // now X is a dangling reference.
 *
 * Therefore, we cannot synthetically add default imports, and must reuse the imports that users
 * include. Doing this poses a challenge for imports that are only consumed in the type position in
 * the user's code. If Angular reuses the imported symbol in a value position (for example, we
 * see a constructor parameter of type Foo and try to write "inject(Foo)") we will also end up with
 * a dangling reference, as TS will elide the import because it was only used in the type position
 * originally.
 *
 * To avoid this, the compiler must patch the emit resolver, and should only do this for imports
 * which are actually consumed. The `DefaultImportTracker` keeps track of these imports as they're
 * encountered and emitted, and implements a transform which can correctly flag the imports as
 * required.
 *
 * This problem does not exist for non-default imports as the compiler can easily insert
 * "import * as X" style imports for those, and the "X" identifier survives transformation.
 */
class DefaultImportTracker {
    /**
     * A `Map` which tracks the `Set` of `ts.ImportClause`s for default imports that were used in
     * a given file name.
     */
    sourceFileToUsedImports = new Map();
    recordUsedImport(importDecl) {
        if (importDecl.importClause) {
            const sf = getSourceFile(importDecl);
            // Add the default import declaration to the set of used import declarations for the file.
            if (!this.sourceFileToUsedImports.has(sf.fileName)) {
                this.sourceFileToUsedImports.set(sf.fileName, new Set());
            }
            this.sourceFileToUsedImports.get(sf.fileName).add(importDecl.importClause);
        }
    }
    /**
     * Get a `ts.TransformerFactory` which will preserve default imports that were previously marked
     * as used.
     *
     * This transformer must run after any other transformers which call `recordUsedImport`.
     */
    importPreservingTransformer() {
        return (context) => {
            let clausesToPreserve = null;
            return (sourceFile) => {
                const clausesForFile = this.sourceFileToUsedImports.get(sourceFile.fileName);
                if (clausesForFile !== undefined) {
                    for (const clause of clausesForFile) {
                        // Initialize the patch lazily so that apps that
                        // don't use default imports aren't patched.
                        if (clausesToPreserve === null) {
                            clausesToPreserve = loadIsReferencedAliasDeclarationPatch(context);
                        }
                        clausesToPreserve?.add(clause);
                    }
                }
                return sourceFile;
            };
        };
    }
}

function isDecoratorIdentifier(exp) {
    return (ts.isIdentifier(exp) ||
        (ts.isPropertyAccessExpression(exp) &&
            ts.isIdentifier(exp.expression) &&
            ts.isIdentifier(exp.name)));
}
/**
 * An enumeration of possible kinds of class members.
 */
exports.ClassMemberKind = void 0;
(function (ClassMemberKind) {
    ClassMemberKind[ClassMemberKind["Constructor"] = 0] = "Constructor";
    ClassMemberKind[ClassMemberKind["Getter"] = 1] = "Getter";
    ClassMemberKind[ClassMemberKind["Setter"] = 2] = "Setter";
    ClassMemberKind[ClassMemberKind["Property"] = 3] = "Property";
    ClassMemberKind[ClassMemberKind["Method"] = 4] = "Method";
})(exports.ClassMemberKind || (exports.ClassMemberKind = {}));
/** Possible access levels of a class member. */
exports.ClassMemberAccessLevel = void 0;
(function (ClassMemberAccessLevel) {
    ClassMemberAccessLevel[ClassMemberAccessLevel["PublicWritable"] = 0] = "PublicWritable";
    ClassMemberAccessLevel[ClassMemberAccessLevel["PublicReadonly"] = 1] = "PublicReadonly";
    ClassMemberAccessLevel[ClassMemberAccessLevel["Protected"] = 2] = "Protected";
    ClassMemberAccessLevel[ClassMemberAccessLevel["Private"] = 3] = "Private";
    ClassMemberAccessLevel[ClassMemberAccessLevel["EcmaScriptPrivate"] = 4] = "EcmaScriptPrivate";
})(exports.ClassMemberAccessLevel || (exports.ClassMemberAccessLevel = {}));
/** Indicates that a declaration is referenced through an ambient type. */
const AmbientImport = {};

/**
 * Potentially convert a `ts.TypeNode` to a `TypeValueReference`, which indicates how to use the
 * type given in the `ts.TypeNode` in a value position.
 *
 * This can return `null` if the `typeNode` is `null`, if it does not refer to a symbol with a value
 * declaration, or if it is not possible to statically understand.
 */
function typeToValue(typeNode, checker, isLocalCompilation) {
    // It's not possible to get a value expression if the parameter doesn't even have a type.
    if (typeNode === null) {
        return missingType();
    }
    if (!ts.isTypeReferenceNode(typeNode)) {
        return unsupportedType(typeNode);
    }
    const symbols = resolveTypeSymbols(typeNode, checker);
    if (symbols === null) {
        return unknownReference(typeNode);
    }
    const { local, decl } = symbols;
    // It's only valid to convert a type reference to a value reference if the type actually
    // has a value declaration associated with it. Note that const enums are an exception,
    // because while they do have a value declaration, they don't exist at runtime.
    if (decl.valueDeclaration === undefined || decl.flags & ts.SymbolFlags.ConstEnum) {
        let typeOnlyDecl = null;
        if (decl.declarations !== undefined && decl.declarations.length > 0) {
            typeOnlyDecl = decl.declarations[0];
        }
        // In local compilation mode a declaration is considered invalid only if it is a type related
        // declaration.
        if (!isLocalCompilation ||
            (typeOnlyDecl &&
                [
                    ts.SyntaxKind.TypeParameter,
                    ts.SyntaxKind.TypeAliasDeclaration,
                    ts.SyntaxKind.InterfaceDeclaration,
                ].includes(typeOnlyDecl.kind))) {
            return noValueDeclaration(typeNode, typeOnlyDecl);
        }
    }
    // The type points to a valid value declaration. Rewrite the TypeReference into an
    // Expression which references the value pointed to by the TypeReference, if possible.
    // Look at the local `ts.Symbol`'s declarations and see if it comes from an import
    // statement. If so, extract the module specifier and the name of the imported type.
    const firstDecl = local.declarations && local.declarations[0];
    if (firstDecl !== undefined) {
        if (ts.isImportClause(firstDecl) && firstDecl.name !== undefined) {
            // This is a default import.
            //   import Foo from 'foo';
            if (firstDecl.isTypeOnly) {
                // Type-only imports cannot be represented as value.
                return typeOnlyImport(typeNode, firstDecl);
            }
            if (!ts.isImportDeclaration(firstDecl.parent)) {
                return unsupportedType(typeNode);
            }
            return {
                kind: 0 /* TypeValueReferenceKind.LOCAL */,
                expression: firstDecl.name,
                defaultImportStatement: firstDecl.parent,
            };
        }
        else if (ts.isImportSpecifier(firstDecl)) {
            // The symbol was imported by name
            //   import {Foo} from 'foo';
            // or
            //   import {Foo as Bar} from 'foo';
            if (firstDecl.isTypeOnly) {
                // The import specifier can't be type-only (e.g. `import {type Foo} from '...')`.
                return typeOnlyImport(typeNode, firstDecl);
            }
            if (firstDecl.parent.parent.isTypeOnly) {
                // The import specifier can't be inside a type-only import clause
                // (e.g. `import type {Foo} from '...')`.
                return typeOnlyImport(typeNode, firstDecl.parent.parent);
            }
            // Determine the name to import (`Foo`) from the import specifier, as the symbol names of
            // the imported type could refer to a local alias (like `Bar` in the example above).
            const importedName = (firstDecl.propertyName || firstDecl.name).text;
            // The first symbol name refers to the local name, which is replaced by `importedName` above.
            // Any remaining symbol names make up the complete path to the value.
            const [_localName, ...nestedPath] = symbols.symbolNames;
            const importDeclaration = firstDecl.parent.parent.parent;
            if (!ts.isImportDeclaration(importDeclaration)) {
                return unsupportedType(typeNode);
            }
            const moduleName = extractModuleName(importDeclaration);
            return {
                kind: 1 /* TypeValueReferenceKind.IMPORTED */,
                valueDeclaration: decl.valueDeclaration ?? null,
                moduleName,
                importedName,
                nestedPath,
            };
        }
        else if (ts.isNamespaceImport(firstDecl)) {
            // The import is a namespace import
            //   import * as Foo from 'foo';
            if (firstDecl.parent.isTypeOnly) {
                // Type-only imports cannot be represented as value.
                return typeOnlyImport(typeNode, firstDecl.parent);
            }
            if (symbols.symbolNames.length === 1) {
                // The type refers to the namespace itself, which cannot be represented as a value.
                return namespaceImport(typeNode, firstDecl.parent);
            }
            // The first symbol name refers to the local name of the namespace, which is is discarded
            // as a new namespace import will be generated. This is followed by the symbol name that needs
            // to be imported and any remaining names that constitute the complete path to the value.
            const [_ns, importedName, ...nestedPath] = symbols.symbolNames;
            const importDeclaration = firstDecl.parent.parent;
            if (!ts.isImportDeclaration(importDeclaration)) {
                return unsupportedType(typeNode);
            }
            const moduleName = extractModuleName(importDeclaration);
            return {
                kind: 1 /* TypeValueReferenceKind.IMPORTED */,
                valueDeclaration: decl.valueDeclaration ?? null,
                moduleName,
                importedName,
                nestedPath,
            };
        }
    }
    // If the type is not imported, the type reference can be converted into an expression as is.
    const expression = typeNodeToValueExpr(typeNode);
    if (expression !== null) {
        return {
            kind: 0 /* TypeValueReferenceKind.LOCAL */,
            expression,
            defaultImportStatement: null,
        };
    }
    else {
        return unsupportedType(typeNode);
    }
}
function unsupportedType(typeNode) {
    return {
        kind: 2 /* TypeValueReferenceKind.UNAVAILABLE */,
        reason: { kind: 5 /* ValueUnavailableKind.UNSUPPORTED */, typeNode },
    };
}
function noValueDeclaration(typeNode, decl) {
    return {
        kind: 2 /* TypeValueReferenceKind.UNAVAILABLE */,
        reason: { kind: 1 /* ValueUnavailableKind.NO_VALUE_DECLARATION */, typeNode, decl },
    };
}
function typeOnlyImport(typeNode, node) {
    return {
        kind: 2 /* TypeValueReferenceKind.UNAVAILABLE */,
        reason: { kind: 2 /* ValueUnavailableKind.TYPE_ONLY_IMPORT */, typeNode, node },
    };
}
function unknownReference(typeNode) {
    return {
        kind: 2 /* TypeValueReferenceKind.UNAVAILABLE */,
        reason: { kind: 3 /* ValueUnavailableKind.UNKNOWN_REFERENCE */, typeNode },
    };
}
function namespaceImport(typeNode, importClause) {
    return {
        kind: 2 /* TypeValueReferenceKind.UNAVAILABLE */,
        reason: { kind: 4 /* ValueUnavailableKind.NAMESPACE */, typeNode, importClause },
    };
}
function missingType() {
    return {
        kind: 2 /* TypeValueReferenceKind.UNAVAILABLE */,
        reason: { kind: 0 /* ValueUnavailableKind.MISSING_TYPE */ },
    };
}
/**
 * Attempt to extract a `ts.Expression` that's equivalent to a `ts.TypeNode`, as the two have
 * different AST shapes but can reference the same symbols.
 *
 * This will return `null` if an equivalent expression cannot be constructed.
 */
function typeNodeToValueExpr(node) {
    if (ts.isTypeReferenceNode(node)) {
        return entityNameToValue(node.typeName);
    }
    else {
        return null;
    }
}
/**
 * Resolve a `TypeReference` node to the `ts.Symbol`s for both its declaration and its local source.
 *
 * In the event that the `TypeReference` refers to a locally declared symbol, these will be the
 * same. If the `TypeReference` refers to an imported symbol, then `decl` will be the fully resolved
 * `ts.Symbol` of the referenced symbol. `local` will be the `ts.Symbol` of the `ts.Identifier`
 * which points to the import statement by which the symbol was imported.
 *
 * All symbol names that make up the type reference are returned left-to-right into the
 * `symbolNames` array, which is guaranteed to include at least one entry.
 */
function resolveTypeSymbols(typeRef, checker) {
    const typeName = typeRef.typeName;
    // typeRefSymbol is the ts.Symbol of the entire type reference.
    const typeRefSymbol = checker.getSymbolAtLocation(typeName);
    if (typeRefSymbol === undefined) {
        return null;
    }
    // `local` is the `ts.Symbol` for the local `ts.Identifier` for the type.
    // If the type is actually locally declared or is imported by name, for example:
    //   import {Foo} from './foo';
    // then it'll be the same as `typeRefSymbol`.
    //
    // If the type is imported via a namespace import, for example:
    //   import * as foo from './foo';
    // and then referenced as:
    //   constructor(f: foo.Foo)
    // then `local` will be the `ts.Symbol` of `foo`, whereas `typeRefSymbol` will be the `ts.Symbol`
    // of `foo.Foo`. This allows tracking of the import behind whatever type reference exists.
    let local = typeRefSymbol;
    // Destructure a name like `foo.X.Y.Z` as follows:
    // - in `leftMost`, the `ts.Identifier` of the left-most name (`foo`) in the qualified name.
    //   This identifier is used to resolve the `ts.Symbol` for `local`.
    // - in `symbolNames`, all names involved in the qualified path, or a single symbol name if the
    //   type is not qualified.
    let leftMost = typeName;
    const symbolNames = [];
    while (ts.isQualifiedName(leftMost)) {
        symbolNames.unshift(leftMost.right.text);
        leftMost = leftMost.left;
    }
    symbolNames.unshift(leftMost.text);
    if (leftMost !== typeName) {
        const localTmp = checker.getSymbolAtLocation(leftMost);
        if (localTmp !== undefined) {
            local = localTmp;
        }
    }
    // De-alias the top-level type reference symbol to get the symbol of the actual declaration.
    let decl = typeRefSymbol;
    if (typeRefSymbol.flags & ts.SymbolFlags.Alias) {
        decl = checker.getAliasedSymbol(typeRefSymbol);
    }
    return { local, decl, symbolNames };
}
function entityNameToValue(node) {
    if (ts.isQualifiedName(node)) {
        const left = entityNameToValue(node.left);
        return left !== null ? ts.factory.createPropertyAccessExpression(left, node.right) : null;
    }
    else if (ts.isIdentifier(node)) {
        const clone = ts.setOriginalNode(ts.factory.createIdentifier(node.text), node);
        clone.parent = node.parent;
        return clone;
    }
    else {
        return null;
    }
}
function extractModuleName(node) {
    if (!ts.isStringLiteral(node.moduleSpecifier)) {
        throw new Error('not a module specifier');
    }
    return node.moduleSpecifier.text;
}

function isNamedClassDeclaration(node) {
    return ts.isClassDeclaration(node) && isIdentifier(node.name);
}
function isIdentifier(node) {
    return node !== undefined && ts.isIdentifier(node);
}
/**
 * Converts the given class member access level to a string.
 * Useful fo error messages.
 */
function classMemberAccessLevelToString(level) {
    switch (level) {
        case exports.ClassMemberAccessLevel.EcmaScriptPrivate:
            return 'ES private';
        case exports.ClassMemberAccessLevel.Private:
            return 'private';
        case exports.ClassMemberAccessLevel.Protected:
            return 'protected';
        case exports.ClassMemberAccessLevel.PublicReadonly:
            return 'public readonly';
        case exports.ClassMemberAccessLevel.PublicWritable:
        default:
            return 'public';
    }
}

/**
 * reflector.ts implements static reflection of declarations using the TypeScript `ts.TypeChecker`.
 */
class TypeScriptReflectionHost {
    checker;
    isLocalCompilation;
    skipPrivateValueDeclarationTypes;
    /**
     * @param skipPrivateValueDeclarationTypes Avoids using a value declaration that is considered private (using a ɵ-prefix),
     * instead using the first available declaration. This is needed for the {@link FormControl} API of
     * which the type declaration documents the type and the value declaration corresponds with an implementation detail.
     */
    constructor(checker, isLocalCompilation = false, skipPrivateValueDeclarationTypes = false) {
        this.checker = checker;
        this.isLocalCompilation = isLocalCompilation;
        this.skipPrivateValueDeclarationTypes = skipPrivateValueDeclarationTypes;
    }
    getDecoratorsOfDeclaration(declaration) {
        const decorators = ts.canHaveDecorators(declaration)
            ? ts.getDecorators(declaration)
            : undefined;
        return decorators !== undefined && decorators.length
            ? decorators
                .map((decorator) => this._reflectDecorator(decorator))
                .filter((dec) => dec !== null)
            : null;
    }
    getMembersOfClass(clazz) {
        const tsClazz = castDeclarationToClassOrDie(clazz);
        return tsClazz.members
            .map((member) => {
            const result = reflectClassMember(member);
            if (result === null) {
                return null;
            }
            return {
                ...result,
                decorators: this.getDecoratorsOfDeclaration(member),
            };
        })
            .filter((member) => member !== null);
    }
    getConstructorParameters(clazz) {
        const tsClazz = castDeclarationToClassOrDie(clazz);
        const isDeclaration = tsClazz.getSourceFile().isDeclarationFile;
        // For non-declaration files, we want to find the constructor with a `body`. The constructors
        // without a `body` are overloads whereas we want the implementation since it's the one that'll
        // be executed and which can have decorators. For declaration files, we take the first one that
        // we get.
        const ctor = tsClazz.members.find((member) => ts.isConstructorDeclaration(member) && (isDeclaration || member.body !== undefined));
        if (ctor === undefined) {
            return null;
        }
        return ctor.parameters.map((node) => {
            // The name of the parameter is easy.
            const name = parameterName(node.name);
            const decorators = this.getDecoratorsOfDeclaration(node);
            // It may or may not be possible to write an expression that refers to the value side of the
            // type named for the parameter.
            let originalTypeNode = node.type || null;
            let typeNode = originalTypeNode;
            // Check if we are dealing with a simple nullable union type e.g. `foo: Foo|null`
            // and extract the type. More complex union types e.g. `foo: Foo|Bar` are not supported.
            // We also don't need to support `foo: Foo|undefined` because Angular's DI injects `null` for
            // optional tokes that don't have providers.
            if (typeNode && ts.isUnionTypeNode(typeNode)) {
                let childTypeNodes = typeNode.types.filter((childTypeNode) => !(ts.isLiteralTypeNode(childTypeNode) &&
                    childTypeNode.literal.kind === ts.SyntaxKind.NullKeyword));
                if (childTypeNodes.length === 1) {
                    typeNode = childTypeNodes[0];
                }
            }
            const typeValueReference = typeToValue(typeNode, this.checker, this.isLocalCompilation);
            return {
                name,
                nameNode: node.name,
                typeValueReference,
                typeNode: originalTypeNode,
                decorators,
            };
        });
    }
    getImportOfIdentifier(id) {
        const directImport = this.getDirectImportOfIdentifier(id);
        if (directImport !== null) {
            return directImport;
        }
        else if (ts.isQualifiedName(id.parent) && id.parent.right === id) {
            return this.getImportOfNamespacedIdentifier(id, getQualifiedNameRoot(id.parent));
        }
        else if (ts.isPropertyAccessExpression(id.parent) && id.parent.name === id) {
            return this.getImportOfNamespacedIdentifier(id, getFarLeftIdentifier(id.parent));
        }
        else {
            return null;
        }
    }
    getExportsOfModule(node) {
        // In TypeScript code, modules are only ts.SourceFiles. Throw if the node isn't a module.
        if (!ts.isSourceFile(node)) {
            throw new Error(`getExportsOfModule() called on non-SourceFile in TS code`);
        }
        // Reflect the module to a Symbol, and use getExportsOfModule() to get a list of exported
        // Symbols.
        const symbol = this.checker.getSymbolAtLocation(node);
        if (symbol === undefined) {
            return null;
        }
        const map = new Map();
        this.checker.getExportsOfModule(symbol).forEach((exportSymbol) => {
            // Map each exported Symbol to a Declaration and add it to the map.
            const decl = this.getDeclarationOfSymbol(exportSymbol, null);
            if (decl !== null) {
                map.set(exportSymbol.name, decl);
            }
        });
        return map;
    }
    isClass(node) {
        // For our purposes, classes are "named" ts.ClassDeclarations;
        // (`node.name` can be undefined in unnamed default exports: `default export class { ... }`).
        return isNamedClassDeclaration(node);
    }
    hasBaseClass(clazz) {
        return this.getBaseClassExpression(clazz) !== null;
    }
    getBaseClassExpression(clazz) {
        if (!(ts.isClassDeclaration(clazz) || ts.isClassExpression(clazz)) ||
            clazz.heritageClauses === undefined) {
            return null;
        }
        const extendsClause = clazz.heritageClauses.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword);
        if (extendsClause === undefined) {
            return null;
        }
        const extendsType = extendsClause.types[0];
        if (extendsType === undefined) {
            return null;
        }
        return extendsType.expression;
    }
    getDeclarationOfIdentifier(id) {
        // Resolve the identifier to a Symbol, and return the declaration of that.
        let symbol = this.checker.getSymbolAtLocation(id);
        if (symbol === undefined) {
            return null;
        }
        return this.getDeclarationOfSymbol(symbol, id);
    }
    getDefinitionOfFunction(node) {
        if (!ts.isFunctionDeclaration(node) &&
            !ts.isMethodDeclaration(node) &&
            !ts.isFunctionExpression(node) &&
            !ts.isArrowFunction(node)) {
            return null;
        }
        let body = null;
        if (node.body !== undefined) {
            // The body might be an expression if the node is an arrow function.
            body = ts.isBlock(node.body)
                ? Array.from(node.body.statements)
                : [ts.factory.createReturnStatement(node.body)];
        }
        const type = this.checker.getTypeAtLocation(node);
        const signatures = this.checker.getSignaturesOfType(type, ts.SignatureKind.Call);
        return {
            node,
            body,
            signatureCount: signatures.length,
            typeParameters: node.typeParameters === undefined ? null : Array.from(node.typeParameters),
            parameters: node.parameters.map((param) => {
                const name = parameterName(param.name);
                const initializer = param.initializer || null;
                return { name, node: param, initializer, type: param.type || null };
            }),
        };
    }
    getGenericArityOfClass(clazz) {
        if (!ts.isClassDeclaration(clazz)) {
            return null;
        }
        return clazz.typeParameters !== undefined ? clazz.typeParameters.length : 0;
    }
    getVariableValue(declaration) {
        return declaration.initializer || null;
    }
    isStaticallyExported(decl) {
        // First check if there's an `export` modifier directly on the declaration.
        let topLevel = decl;
        if (ts.isVariableDeclaration(decl) && ts.isVariableDeclarationList(decl.parent)) {
            topLevel = decl.parent.parent;
        }
        const modifiers = ts.canHaveModifiers(topLevel) ? ts.getModifiers(topLevel) : undefined;
        if (modifiers !== undefined &&
            modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)) {
            // The node is part of a declaration that's directly exported.
            return true;
        }
        // If `topLevel` is not directly exported via a modifier, then it might be indirectly exported,
        // e.g.:
        //
        // class Foo {}
        // export {Foo};
        //
        // The only way to check this is to look at the module level for exports of the class. As a
        // performance optimization, this check is only performed if the class is actually declared at
        // the top level of the file and thus eligible for exporting in the first place.
        if (topLevel.parent === undefined || !ts.isSourceFile(topLevel.parent)) {
            return false;
        }
        const localExports = this.getLocalExportedDeclarationsOfSourceFile(decl.getSourceFile());
        return localExports.has(decl);
    }
    getDirectImportOfIdentifier(id) {
        const symbol = this.checker.getSymbolAtLocation(id);
        if (symbol === undefined ||
            symbol.declarations === undefined ||
            symbol.declarations.length !== 1) {
            return null;
        }
        const decl = symbol.declarations[0];
        const importDecl = getContainingImportDeclaration(decl);
        // Ignore declarations that are defined locally (not imported).
        if (importDecl === null) {
            return null;
        }
        // The module specifier is guaranteed to be a string literal, so this should always pass.
        if (!ts.isStringLiteral(importDecl.moduleSpecifier)) {
            // Not allowed to happen in TypeScript ASTs.
            return null;
        }
        return {
            from: importDecl.moduleSpecifier.text,
            name: getExportedName(decl, id),
            node: importDecl,
        };
    }
    /**
     * Try to get the import info for this identifier as though it is a namespaced import.
     *
     * For example, if the identifier is the `Directive` part of a qualified type chain like:
     *
     * ```ts
     * core.Directive
     * ```
     *
     * then it might be that `core` is a namespace import such as:
     *
     * ```ts
     * import * as core from 'tslib';
     * ```
     *
     * @param id the TypeScript identifier to find the import info for.
     * @returns The import info if this is a namespaced import or `null`.
     */
    getImportOfNamespacedIdentifier(id, namespaceIdentifier) {
        if (namespaceIdentifier === null) {
            return null;
        }
        const namespaceSymbol = this.checker.getSymbolAtLocation(namespaceIdentifier);
        if (!namespaceSymbol || namespaceSymbol.declarations === undefined) {
            return null;
        }
        const declaration = namespaceSymbol.declarations.length === 1 ? namespaceSymbol.declarations[0] : null;
        if (!declaration) {
            return null;
        }
        const namespaceDeclaration = ts.isNamespaceImport(declaration) ? declaration : null;
        if (!namespaceDeclaration) {
            return null;
        }
        const importDeclaration = namespaceDeclaration.parent.parent;
        if (!ts.isImportDeclaration(importDeclaration) ||
            !ts.isStringLiteral(importDeclaration.moduleSpecifier)) {
            // Should not happen as this would be invalid TypesScript
            return null;
        }
        return {
            from: importDeclaration.moduleSpecifier.text,
            name: id.text,
            node: importDeclaration,
        };
    }
    /**
     * Resolve a `ts.Symbol` to its declaration, keeping track of the `viaModule` along the way.
     */
    getDeclarationOfSymbol(symbol, originalId) {
        // If the symbol points to a ShorthandPropertyAssignment, resolve it.
        let valueDeclaration = undefined;
        if (symbol.valueDeclaration !== undefined) {
            valueDeclaration = symbol.valueDeclaration;
        }
        else if (symbol.declarations !== undefined && symbol.declarations.length > 0) {
            valueDeclaration = symbol.declarations[0];
        }
        if (valueDeclaration !== undefined && ts.isShorthandPropertyAssignment(valueDeclaration)) {
            const shorthandSymbol = this.checker.getShorthandAssignmentValueSymbol(valueDeclaration);
            if (shorthandSymbol === undefined) {
                return null;
            }
            return this.getDeclarationOfSymbol(shorthandSymbol, originalId);
        }
        else if (valueDeclaration !== undefined && ts.isExportSpecifier(valueDeclaration)) {
            const targetSymbol = this.checker.getExportSpecifierLocalTargetSymbol(valueDeclaration);
            if (targetSymbol === undefined) {
                return null;
            }
            return this.getDeclarationOfSymbol(targetSymbol, originalId);
        }
        const importInfo = originalId && this.getImportOfIdentifier(originalId);
        // Now, resolve the Symbol to its declaration by following any and all aliases.
        while (symbol.flags & ts.SymbolFlags.Alias) {
            symbol = this.checker.getAliasedSymbol(symbol);
        }
        // Look at the resolved Symbol's declarations and pick one of them to return.
        // Value declarations are given precedence over type declarations if not specified otherwise
        if (symbol.valueDeclaration !== undefined &&
            (!this.skipPrivateValueDeclarationTypes || !isPrivateSymbol(this.checker, symbol))) {
            return {
                node: symbol.valueDeclaration,
                viaModule: this._viaModule(symbol.valueDeclaration, originalId, importInfo),
            };
        }
        else if (symbol.declarations !== undefined && symbol.declarations.length > 0) {
            return {
                node: symbol.declarations[0],
                viaModule: this._viaModule(symbol.declarations[0], originalId, importInfo),
            };
        }
        else {
            return null;
        }
    }
    _reflectDecorator(node) {
        // Attempt to resolve the decorator expression into a reference to a concrete Identifier. The
        // expression may contain a call to a function which returns the decorator function, in which
        // case we want to return the arguments.
        let decoratorExpr = node.expression;
        let args = null;
        // Check for call expressions.
        if (ts.isCallExpression(decoratorExpr)) {
            args = Array.from(decoratorExpr.arguments);
            decoratorExpr = decoratorExpr.expression;
        }
        // The final resolved decorator should be a `ts.Identifier` - if it's not, then something is
        // wrong and the decorator can't be resolved statically.
        if (!isDecoratorIdentifier(decoratorExpr)) {
            return null;
        }
        const decoratorIdentifier = ts.isIdentifier(decoratorExpr) ? decoratorExpr : decoratorExpr.name;
        const importDecl = this.getImportOfIdentifier(decoratorIdentifier);
        return {
            name: decoratorIdentifier.text,
            identifier: decoratorExpr,
            import: importDecl,
            node,
            args,
        };
    }
    /**
     * Get the set of declarations declared in `file` which are exported.
     */
    getLocalExportedDeclarationsOfSourceFile(file) {
        const cacheSf = file;
        if (cacheSf[LocalExportedDeclarations] !== undefined) {
            // TS does not currently narrow symbol-keyed fields, hence the non-null assert is needed.
            return cacheSf[LocalExportedDeclarations];
        }
        const exportSet = new Set();
        cacheSf[LocalExportedDeclarations] = exportSet;
        const sfSymbol = this.checker.getSymbolAtLocation(cacheSf);
        if (sfSymbol === undefined || sfSymbol.exports === undefined) {
            return exportSet;
        }
        // Scan the exported symbol of the `ts.SourceFile` for the original `symbol` of the class
        // declaration.
        //
        // Note: when checking multiple classes declared in the same file, this repeats some operations.
        // In theory, this could be expensive if run in the context of a massive input file. If
        // performance does become an issue here, it should be possible to create a `Set<>`
        // Unfortunately, `ts.Iterator` doesn't implement the iterator protocol, so iteration here is
        // done manually.
        const iter = sfSymbol.exports.values();
        let item = iter.next();
        while (item.done !== true) {
            let exportedSymbol = item.value;
            // If this exported symbol comes from an `export {Foo}` statement, then the symbol is actually
            // for the export declaration, not the original declaration. Such a symbol will be an alias,
            // so unwrap aliasing if necessary.
            if (exportedSymbol.flags & ts.SymbolFlags.Alias) {
                exportedSymbol = this.checker.getAliasedSymbol(exportedSymbol);
            }
            if (exportedSymbol.valueDeclaration !== undefined &&
                exportedSymbol.valueDeclaration.getSourceFile() === file) {
                exportSet.add(exportedSymbol.valueDeclaration);
            }
            item = iter.next();
        }
        return exportSet;
    }
    _viaModule(declaration, originalId, importInfo) {
        if (importInfo === null &&
            originalId !== null &&
            declaration.getSourceFile() !== originalId.getSourceFile()) {
            return AmbientImport;
        }
        return importInfo !== null && importInfo.from !== null && !importInfo.from.startsWith('.')
            ? importInfo.from
            : null;
    }
}
class TypeEntityToDeclarationError extends Error {
    constructor(message) {
        super(message);
        // Extending `Error` ends up breaking some internal tests. This appears to be a known issue
        // when extending errors in TS and the workaround is to explicitly set the prototype.
        // https://stackoverflow.com/questions/41102060/typescript-extending-error-class
        Object.setPrototypeOf(this, new.target.prototype);
    }
}
/**
 * @throws {TypeEntityToDeclarationError} if the type cannot be converted
 *   to a declaration.
 */
function reflectTypeEntityToDeclaration(type, checker) {
    let realSymbol = checker.getSymbolAtLocation(type);
    if (realSymbol === undefined) {
        throw new TypeEntityToDeclarationError(`Cannot resolve type entity ${type.getText()} to symbol`);
    }
    while (realSymbol.flags & ts.SymbolFlags.Alias) {
        realSymbol = checker.getAliasedSymbol(realSymbol);
    }
    let node = null;
    if (realSymbol.valueDeclaration !== undefined) {
        node = realSymbol.valueDeclaration;
    }
    else if (realSymbol.declarations !== undefined && realSymbol.declarations.length === 1) {
        node = realSymbol.declarations[0];
    }
    else {
        throw new TypeEntityToDeclarationError(`Cannot resolve type entity symbol to declaration`);
    }
    if (ts.isQualifiedName(type)) {
        if (!ts.isIdentifier(type.left)) {
            throw new TypeEntityToDeclarationError(`Cannot handle qualified name with non-identifier lhs`);
        }
        const symbol = checker.getSymbolAtLocation(type.left);
        if (symbol === undefined ||
            symbol.declarations === undefined ||
            symbol.declarations.length !== 1) {
            throw new TypeEntityToDeclarationError(`Cannot resolve qualified type entity lhs to symbol`);
        }
        const decl = symbol.declarations[0];
        if (ts.isNamespaceImport(decl)) {
            const clause = decl.parent;
            const importDecl = clause.parent;
            if (!ts.isStringLiteral(importDecl.moduleSpecifier)) {
                throw new TypeEntityToDeclarationError(`Module specifier is not a string`);
            }
            return { node, from: importDecl.moduleSpecifier.text };
        }
        else if (ts.isModuleDeclaration(decl)) {
            return { node, from: null };
        }
        else {
            throw new TypeEntityToDeclarationError(`Unknown import type?`);
        }
    }
    else {
        return { node, from: null };
    }
}
function filterToMembersWithDecorator(members, name, module) {
    return members
        .filter((member) => !member.isStatic)
        .map((member) => {
        if (member.decorators === null) {
            return null;
        }
        const decorators = member.decorators.filter((dec) => {
            if (dec.import !== null) {
                return dec.import.name === name && (module === undefined || dec.import.from === module);
            }
            else {
                return dec.name === name && module === undefined;
            }
        });
        if (decorators.length === 0) {
            return null;
        }
        return { member, decorators };
    })
        .filter((value) => value !== null);
}
function extractModifiersOfMember(node) {
    const modifiers = ts.getModifiers(node);
    let isStatic = false;
    let isReadonly = false;
    let accessLevel = exports.ClassMemberAccessLevel.PublicWritable;
    if (modifiers !== undefined) {
        for (const modifier of modifiers) {
            switch (modifier.kind) {
                case ts.SyntaxKind.StaticKeyword:
                    isStatic = true;
                    break;
                case ts.SyntaxKind.PrivateKeyword:
                    accessLevel = exports.ClassMemberAccessLevel.Private;
                    break;
                case ts.SyntaxKind.ProtectedKeyword:
                    accessLevel = exports.ClassMemberAccessLevel.Protected;
                    break;
                case ts.SyntaxKind.ReadonlyKeyword:
                    isReadonly = true;
                    break;
            }
        }
    }
    if (isReadonly && accessLevel === exports.ClassMemberAccessLevel.PublicWritable) {
        accessLevel = exports.ClassMemberAccessLevel.PublicReadonly;
    }
    if (node.name !== undefined && ts.isPrivateIdentifier(node.name)) {
        accessLevel = exports.ClassMemberAccessLevel.EcmaScriptPrivate;
    }
    return { accessLevel, isStatic };
}
/**
 * Reflects a class element and returns static information about the
 * class member.
 *
 * Note: Decorator information is not included in this helper as it relies
 * on type checking to resolve originating import.
 */
function reflectClassMember(node) {
    let kind = null;
    let value = null;
    let name = null;
    let nameNode = null;
    if (ts.isPropertyDeclaration(node)) {
        kind = exports.ClassMemberKind.Property;
        value = node.initializer || null;
    }
    else if (ts.isGetAccessorDeclaration(node)) {
        kind = exports.ClassMemberKind.Getter;
    }
    else if (ts.isSetAccessorDeclaration(node)) {
        kind = exports.ClassMemberKind.Setter;
    }
    else if (ts.isMethodDeclaration(node)) {
        kind = exports.ClassMemberKind.Method;
    }
    else if (ts.isConstructorDeclaration(node)) {
        kind = exports.ClassMemberKind.Constructor;
    }
    else {
        return null;
    }
    if (ts.isConstructorDeclaration(node)) {
        name = 'constructor';
    }
    else if (ts.isIdentifier(node.name)) {
        name = node.name.text;
        nameNode = node.name;
    }
    else if (ts.isStringLiteral(node.name)) {
        name = node.name.text;
        nameNode = node.name;
    }
    else if (ts.isPrivateIdentifier(node.name)) {
        name = node.name.text;
        nameNode = node.name;
    }
    else {
        return null;
    }
    const { accessLevel, isStatic } = extractModifiersOfMember(node);
    return {
        node,
        implementation: node,
        kind,
        type: node.type || null,
        accessLevel,
        name,
        nameNode,
        value,
        isStatic,
    };
}
function reflectObjectLiteral(node) {
    const map = new Map();
    node.properties.forEach((prop) => {
        if (ts.isPropertyAssignment(prop)) {
            const name = propertyNameToString(prop.name);
            if (name === null) {
                return;
            }
            map.set(name, prop.initializer);
        }
        else if (ts.isShorthandPropertyAssignment(prop)) {
            map.set(prop.name.text, prop.name);
        }
        else {
            return;
        }
    });
    return map;
}
function castDeclarationToClassOrDie(declaration) {
    if (!ts.isClassDeclaration(declaration)) {
        throw new Error(`Reflecting on a ${ts.SyntaxKind[declaration.kind]} instead of a ClassDeclaration.`);
    }
    return declaration;
}
function parameterName(name) {
    if (ts.isIdentifier(name)) {
        return name.text;
    }
    else {
        return null;
    }
}
function propertyNameToString(node) {
    if (ts.isIdentifier(node) || ts.isStringLiteral(node) || ts.isNumericLiteral(node)) {
        return node.text;
    }
    else {
        return null;
    }
}
/** Determines whether a given symbol represents a private API (symbols with names that start with `ɵ`) */
function isPrivateSymbol(typeChecker, symbol) {
    if (symbol.valueDeclaration !== undefined) {
        const symbolType = typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
        return symbolType?.symbol?.name.startsWith('ɵ') === true;
    }
    return false;
}
/**
 * Compute the left most identifier in a qualified type chain. E.g. the `a` of `a.b.c.SomeType`.
 * @param qualifiedName The starting property access expression from which we want to compute
 * the left most identifier.
 * @returns the left most identifier in the chain or `null` if it is not an identifier.
 */
function getQualifiedNameRoot(qualifiedName) {
    while (ts.isQualifiedName(qualifiedName.left)) {
        qualifiedName = qualifiedName.left;
    }
    return ts.isIdentifier(qualifiedName.left) ? qualifiedName.left : null;
}
/**
 * Compute the left most identifier in a property access chain. E.g. the `a` of `a.b.c.d`.
 * @param propertyAccess The starting property access expression from which we want to compute
 * the left most identifier.
 * @returns the left most identifier in the chain or `null` if it is not an identifier.
 */
function getFarLeftIdentifier(propertyAccess) {
    while (ts.isPropertyAccessExpression(propertyAccess.expression)) {
        propertyAccess = propertyAccess.expression;
    }
    return ts.isIdentifier(propertyAccess.expression) ? propertyAccess.expression : null;
}
/**
 * Gets the closest ancestor `ImportDeclaration` to a node.
 */
function getContainingImportDeclaration(node) {
    let parent = node.parent;
    while (parent && !ts.isSourceFile(parent)) {
        if (ts.isImportDeclaration(parent)) {
            return parent;
        }
        parent = parent.parent;
    }
    return null;
}
/**
 * Compute the name by which the `decl` was exported, not imported.
 * If no such declaration can be found (e.g. it is a namespace import)
 * then fallback to the `originalId`.
 */
function getExportedName(decl, originalId) {
    return ts.isImportSpecifier(decl)
        ? (decl.propertyName !== undefined ? decl.propertyName : decl.name).text
        : originalId.text;
}
const LocalExportedDeclarations = Symbol('LocalExportedDeclarations');

/**
 * A `ts.Node` plus the context in which it was discovered.
 *
 * A `Reference` is a pointer to a `ts.Node` that was extracted from the program somehow. It
 * contains not only the node itself, but the information regarding how the node was located. In
 * particular, it might track different identifiers by which the node is exposed, as well as
 * potentially a module specifier which might expose the node.
 *
 * The Angular compiler uses `Reference`s instead of `ts.Node`s when tracking classes or generating
 * imports.
 */
class Reference {
    node;
    /**
     * The compiler's best guess at an absolute module specifier which owns this `Reference`.
     *
     * This is usually determined by tracking the import statements which led the compiler to a given
     * node. If any of these imports are absolute, it's an indication that the node being imported
     * might come from that module.
     *
     * It is not _guaranteed_ that the node in question is exported from its `bestGuessOwningModule` -
     * that is mostly a convention that applies in certain package formats.
     *
     * If `bestGuessOwningModule` is `null`, then it's likely the node came from the current program.
     */
    bestGuessOwningModule;
    identifiers = [];
    /**
     * Indicates that the Reference was created synthetically, not as a result of natural value
     * resolution.
     *
     * This is used to avoid misinterpreting the Reference in certain contexts.
     */
    synthetic = false;
    _alias = null;
    isAmbient;
    constructor(node, bestGuessOwningModule = null) {
        this.node = node;
        if (bestGuessOwningModule === AmbientImport) {
            this.isAmbient = true;
            this.bestGuessOwningModule = null;
        }
        else {
            this.isAmbient = false;
            this.bestGuessOwningModule = bestGuessOwningModule;
        }
        const id = identifierOfNode(node);
        if (id !== null) {
            this.identifiers.push(id);
        }
    }
    /**
     * The best guess at which module specifier owns this particular reference, or `null` if there
     * isn't one.
     */
    get ownedByModuleGuess() {
        if (this.bestGuessOwningModule !== null) {
            return this.bestGuessOwningModule.specifier;
        }
        else {
            return null;
        }
    }
    /**
     * Whether this reference has a potential owning module or not.
     *
     * See `bestGuessOwningModule`.
     */
    get hasOwningModuleGuess() {
        return this.bestGuessOwningModule !== null;
    }
    /**
     * A name for the node, if one is available.
     *
     * This is only suited for debugging. Any actual references to this node should be made with
     * `ts.Identifier`s (see `getIdentityIn`).
     */
    get debugName() {
        const id = identifierOfNode(this.node);
        return id !== null ? id.text : null;
    }
    get alias() {
        return this._alias;
    }
    /**
     * Record a `ts.Identifier` by which it's valid to refer to this node, within the context of this
     * `Reference`.
     */
    addIdentifier(identifier) {
        this.identifiers.push(identifier);
    }
    /**
     * Get a `ts.Identifier` within this `Reference` that can be used to refer within the context of a
     * given `ts.SourceFile`, if any.
     */
    getIdentityIn(context) {
        return this.identifiers.find((id) => id.getSourceFile() === context) || null;
    }
    /**
     * Get a `ts.Identifier` for this `Reference` that exists within the given expression.
     *
     * This is very useful for producing `ts.Diagnostic`s that reference `Reference`s that were
     * extracted from some larger expression, as it can be used to pinpoint the `ts.Identifier` within
     * the expression from which the `Reference` originated.
     */
    getIdentityInExpression(expr) {
        const sf = expr.getSourceFile();
        return (this.identifiers.find((id) => {
            if (id.getSourceFile() !== sf) {
                return false;
            }
            // This identifier is a match if its position lies within the given expression.
            return id.pos >= expr.pos && id.end <= expr.end;
        }) || null);
    }
    /**
     * Given the 'container' expression from which this `Reference` was extracted, produce a
     * `ts.Expression` to use in a diagnostic which best indicates the position within the container
     * expression that generated the `Reference`.
     *
     * For example, given a `Reference` to the class 'Bar' and the containing expression:
     * `[Foo, Bar, Baz]`, this function would attempt to return the `ts.Identifier` for `Bar` within
     * the array. This could be used to produce a nice diagnostic context:
     *
     * ```text
     * [Foo, Bar, Baz]
     *       ~~~
     * ```
     *
     * If no specific node can be found, then the `fallback` expression is used, which defaults to the
     * entire containing expression.
     */
    getOriginForDiagnostics(container, fallback = container) {
        const id = this.getIdentityInExpression(container);
        return id !== null ? id : fallback;
    }
    cloneWithAlias(alias) {
        const ref = new Reference(this.node, this.isAmbient ? AmbientImport : this.bestGuessOwningModule);
        ref.identifiers = [...this.identifiers];
        ref._alias = alias;
        return ref;
    }
    cloneWithNoIdentifiers() {
        const ref = new Reference(this.node, this.isAmbient ? AmbientImport : this.bestGuessOwningModule);
        ref._alias = this._alias;
        ref.identifiers = [];
        return ref;
    }
}

/** Module name of the framework core. */
const CORE_MODULE = '@angular/core';
function valueReferenceToExpression(valueRef) {
    if (valueRef.kind === 2 /* TypeValueReferenceKind.UNAVAILABLE */) {
        return null;
    }
    else if (valueRef.kind === 0 /* TypeValueReferenceKind.LOCAL */) {
        const expr = new WrappedNodeExpr(valueRef.expression);
        if (valueRef.defaultImportStatement !== null) {
            attachDefaultImportDeclaration(expr, valueRef.defaultImportStatement);
        }
        return expr;
    }
    else {
        let importExpr = new ExternalExpr({
            moduleName: valueRef.moduleName,
            name: valueRef.importedName,
        });
        if (valueRef.nestedPath !== null) {
            for (const property of valueRef.nestedPath) {
                importExpr = new ReadPropExpr(importExpr, property);
            }
        }
        return importExpr;
    }
}
function toR3Reference(origin, ref, context, refEmitter) {
    const emittedValueRef = refEmitter.emit(ref, context);
    assertSuccessfulReferenceEmit(emittedValueRef, origin, 'class');
    const emittedTypeRef = refEmitter.emit(ref, context, exports.ImportFlags.ForceNewImport | exports.ImportFlags.AllowTypeImports);
    assertSuccessfulReferenceEmit(emittedTypeRef, origin, 'class');
    return {
        value: emittedValueRef.expression,
        type: emittedTypeRef.expression,
    };
}
function isAngularCore(decorator) {
    return decorator.import !== null && decorator.import.from === CORE_MODULE;
}
/**
 * This function is used for verifying that a given reference is declared
 * inside `@angular/core` and corresponds to the given symbol name.
 *
 * In some cases, due to the compiler face duplicating many symbols as
 * an independent bridge between core and the compiler, the dts bundler may
 * decide to alias declarations in the `.d.ts`, to avoid conflicts.
 *
 * e.g.
 *
 * ```
 * declare enum ViewEncapsulation {} // from the facade
 * declare enum ViewEncapsulation$1 {} // the real one exported to users.
 * ```
 *
 * This function accounts for such potential re-namings.
 */
function isAngularCoreReferenceWithPotentialAliasing(reference, symbolName, isCore) {
    return ((reference.ownedByModuleGuess === CORE_MODULE || isCore) &&
        reference.debugName?.replace(/\$\d+$/, '') === symbolName);
}
function findAngularDecorator(decorators, name, isCore) {
    return decorators.find((decorator) => isAngularDecorator(decorator, name, isCore));
}
function isAngularDecorator(decorator, name, isCore) {
    if (isCore) {
        return decorator.name === name;
    }
    else if (isAngularCore(decorator)) {
        return decorator.import.name === name;
    }
    return false;
}
function getAngularDecorators(decorators, names, isCore) {
    return decorators.filter((decorator) => {
        const name = isCore ? decorator.name : decorator.import?.name;
        if (name === undefined || !names.includes(name)) {
            return false;
        }
        return isCore || isAngularCore(decorator);
    });
}
/**
 * Unwrap a `ts.Expression`, removing outer type-casts or parentheses until the expression is in its
 * lowest level form.
 *
 * For example, the expression "(foo as Type)" unwraps to "foo".
 */
function unwrapExpression(node) {
    while (ts.isAsExpression(node) || ts.isParenthesizedExpression(node)) {
        node = node.expression;
    }
    return node;
}
function expandForwardRef(arg) {
    arg = unwrapExpression(arg);
    if (!ts.isArrowFunction(arg) && !ts.isFunctionExpression(arg)) {
        return null;
    }
    const body = arg.body;
    // Either the body is a ts.Expression directly, or a block with a single return statement.
    if (ts.isBlock(body)) {
        // Block body - look for a single return statement.
        if (body.statements.length !== 1) {
            return null;
        }
        const stmt = body.statements[0];
        if (!ts.isReturnStatement(stmt) || stmt.expression === undefined) {
            return null;
        }
        return stmt.expression;
    }
    else {
        // Shorthand body - return as an expression.
        return body;
    }
}
/**
 * If the given `node` is a forwardRef() expression then resolve its inner value, otherwise return
 * `null`.
 *
 * @param node the forwardRef() expression to resolve
 * @param reflector a ReflectionHost
 * @returns the resolved expression, if the original expression was a forwardRef(), or `null`
 *     otherwise.
 */
function tryUnwrapForwardRef(node, reflector) {
    node = unwrapExpression(node);
    if (!ts.isCallExpression(node) || node.arguments.length !== 1) {
        return null;
    }
    const fn = ts.isPropertyAccessExpression(node.expression)
        ? node.expression.name
        : node.expression;
    if (!ts.isIdentifier(fn)) {
        return null;
    }
    const expr = expandForwardRef(node.arguments[0]);
    if (expr === null) {
        return null;
    }
    const imp = reflector.getImportOfIdentifier(fn);
    if (imp === null || imp.from !== '@angular/core' || imp.name !== 'forwardRef') {
        return null;
    }
    return expr;
}
/**
 * A foreign function resolver for `staticallyResolve` which unwraps forwardRef() expressions.
 *
 * @param ref a Reference to the declaration of the function being called (which might be
 * forwardRef)
 * @param args the arguments to the invocation of the forwardRef expression
 * @returns an unwrapped argument if `ref` pointed to forwardRef, or null otherwise
 */
function createForwardRefResolver(isCore) {
    return (fn, callExpr, resolve, unresolvable) => {
        if (!isAngularCoreReferenceWithPotentialAliasing(fn, 'forwardRef', isCore) ||
            callExpr.arguments.length !== 1) {
            return unresolvable;
        }
        const expanded = expandForwardRef(callExpr.arguments[0]);
        if (expanded !== null) {
            return resolve(expanded);
        }
        else {
            return unresolvable;
        }
    };
}
/**
 * Combines an array of resolver functions into a one.
 * @param resolvers Resolvers to be combined.
 */
function combineResolvers(resolvers) {
    return (fn, callExpr, resolve, unresolvable) => {
        for (const resolver of resolvers) {
            const resolved = resolver(fn, callExpr, resolve, unresolvable);
            if (resolved !== unresolvable) {
                return resolved;
            }
        }
        return unresolvable;
    };
}
function isExpressionForwardReference(expr, context, contextSource) {
    if (isWrappedTsNodeExpr(expr)) {
        const node = ts.getOriginalNode(expr.node);
        return node.getSourceFile() === contextSource && context.pos < node.pos;
    }
    else {
        return false;
    }
}
function isWrappedTsNodeExpr(expr) {
    return expr instanceof WrappedNodeExpr;
}
function readBaseClass(node, reflector, evaluator) {
    const baseExpression = reflector.getBaseClassExpression(node);
    if (baseExpression !== null) {
        const baseClass = evaluator.evaluate(baseExpression);
        if (baseClass instanceof Reference && reflector.isClass(baseClass.node)) {
            return baseClass;
        }
        else {
            return 'dynamic';
        }
    }
    return null;
}
const parensWrapperTransformerFactory = (context) => {
    const visitor = (node) => {
        const visited = ts.visitEachC   hild(node, visitor, context);
        if (ts.isArrowFunction(visited) || ts.isFunctionExpression(visited)) {
            return ts.factory.createParenthesizedExpression(visited);
        }
        return visited;
    };
    return (node) => ts.visitEachChild(node, visitor, context);
};
/**
 * Wraps all functions in a given expression in parentheses. This is needed to avoid problems
 * where Tsickle annotations added between analyse and transform phases in Angular may trigger
 * automatic semicolon insertion, e.g. if a function is the expression in a `return` statement.
 * More
 * info can be found in Tsickle source code here:
 * https://github.com/angular/tsickle/blob/d7974262571c8a17d684e5ba07680e1b1993afdd/src/jsdoc_transformer.ts#L1021
 *
 * @param expression Expression where functions should be wrapped in parentheses
 */
function wrapFunctionExpressionsInParens(expression) {
    return ts.transform(expression, [parensWrapperTransformerFactory]).transformed[0];
}
/**
 * Resolves the given `rawProviders` into `ClassDeclarations` and returns
 * a set containing those that are known to require a factory definition.
 * @param rawProviders Expression that declared the providers array in the source.
 */
function resolveProvidersRequiringFactory(rawProviders, reflector, evaluator) {
    const providers = new Set();
    const resolvedProviders = evaluator.evaluate(rawProviders);
    if (!Array.isArray(resolvedProviders)) {
        return providers;
    }
    resolvedProviders.forEach(function processProviders(provider) {
        let tokenClass = null;
        if (Array.isArray(provider)) {
            // If we ran into an array, recurse into it until we've resolve all the classes.
            provider.forEach(processProviders);
        }
        else if (provider instanceof Reference) {
            tokenClass = provider;
        }
        else if (provider instanceof Map && provider.has('useClass') && !provider.has('deps')) {
            const useExisting = provider.get('useClass');
            if (useExisting instanceof Reference) {
                tokenClass = useExisting;
            }
        }
        // TODO(alxhub): there was a bug where `getConstructorParameters` would return `null` for a
        // class in a .d.ts file, always, even if the class had a constructor. This was fixed for
        // `getConstructorParameters`, but that fix causes more classes to be recognized here as needing
        // provider checks, which is a breaking change in g3. Avoid this breakage for now by skipping
        // classes from .d.ts files here directly, until g3 can be cleaned up.
        if (tokenClass !== null &&
            !tokenClass.node.getSourceFile().isDeclarationFile &&
            reflector.isClass(tokenClass.node)) {
            const constructorParameters = reflector.getConstructorParameters(tokenClass.node);
            // Note that we only want to capture providers with a non-trivial constructor,
            // because they're the ones that might be using DI and need to be decorated.
            if (constructorParameters !== null && constructorParameters.length > 0) {
                providers.add(tokenClass);
            }
        }
    });
    return providers;
}
/**
 * Create an R3Reference for a class.
 *
 * The `value` is the exported declaration of the class from its source file.
 * The `type` is an expression that would be used in the typings (.d.ts) files.
 */
function wrapTypeReference(reflector, clazz) {
    const value = new WrappedNodeExpr(clazz.name);
    const type = value;
    return { value, type };
}
/** Creates a ParseSourceSpan for a TypeScript node. */
function createSourceSpan(node) {
    const sf = node.getSourceFile();
    const [startOffset, endOffset] = [node.getStart(), node.getEnd()];
    const { line: startLine, character: startCol } = sf.getLineAndCharacterOfPosition(startOffset);
    const { line: endLine, character: endCol } = sf.getLineAndCharacterOfPosition(endOffset);
    const parseSf = new ParseSourceFile(sf.getFullText(), sf.fileName);
    // +1 because values are zero-indexed.
    return new ParseSourceSpan(new ParseLocation(parseSf, startOffset, startLine + 1, startCol + 1), new ParseLocation(parseSf, endOffset, endLine + 1, endCol + 1));
}
/**
 * Collate the factory and definition compiled results into an array of CompileResult objects.
 */
function compileResults(fac, def, metadataStmt, propName, additionalFields, deferrableImports, debugInfo = null, hmrInitializer = null) {
    const statements = def.statements;
    if (metadataStmt !== null) {
        statements.push(metadataStmt);
    }
    if (debugInfo !== null) {
        statements.push(debugInfo);
    }
    if (hmrInitializer !== null) {
        statements.push(hmrInitializer);
    }
    const results = [
        fac,
        {
            name: propName,
            initializer: def.expression,
            statements: def.statements,
            type: def.type,
            deferrableImports,
        },
    ];
    if (additionalFields !== null) {
        results.push(...additionalFields);
    }
    return results;
}
function toFactoryMetadata(meta, target) {
    return {
        name: meta.name,
        type: meta.type,
        typeArgumentCount: meta.typeArgumentCount,
        deps: meta.deps,
        target,
    };
}
function resolveImportedFile(moduleResolver, importedFile, expr, origin) {
    // If `importedFile` is not 'unknown' then it accurately reflects the source file that is
    // being imported.
    if (importedFile !== 'unknown') {
        return importedFile;
    }
    // Otherwise `expr` has to be inspected to determine the file that is being imported. If `expr`
    // is not an `ExternalExpr` then it does not correspond with an import, so return null in that
    // case.
    if (!(expr instanceof ExternalExpr)) {
        return null;
    }
    // Figure out what file is being imported.
    return moduleResolver.resolveModule(expr.value.moduleName, origin.fileName);
}
/**
 * Determines the most appropriate expression for diagnostic reporting purposes. If `expr` is
 * contained within `container` then `expr` is used as origin node, otherwise `container` itself is
 * used.
 */
function getOriginNodeForDiagnostics(expr, container) {
    const nodeSf = expr.getSourceFile();
    const exprSf = container.getSourceFile();
    if (nodeSf === exprSf && expr.pos >= container.pos && expr.end <= container.end) {
        // `expr` occurs within the same source file as `container` and is contained within it, so
        // `expr` is appropriate to use as origin node for diagnostics.
        return expr;
    }
    else {
        return container;
    }
}
function isAbstractClassDeclaration(clazz) {
    return ts.canHaveModifiers(clazz) && clazz.modifiers !== undefined
        ? clazz.modifiers.some((mod) => mod.kind === ts.SyntaxKind.AbstractKeyword)
        : false;
}

function getConstructorDependencies(clazz, reflector, isCore) {
    const deps = [];
    const errors = [];
    let ctorParams = reflector.getConstructorParameters(clazz);
    if (ctorParams === null) {
        if (reflector.hasBaseClass(clazz)) {
            return null;
        }
        else {
            ctorParams = [];
        }
    }
    ctorParams.forEach((param, idx) => {
        let token = valueReferenceToExpression(param.typeValueReference);
        let attributeNameType = null;
        let optional = false, self = false, skipSelf = false, host = false;
        (param.decorators || [])
            .filter((dec) => isCore || isAngularCore(dec))
            .forEach((dec) => {
            const name = isCore || dec.import === null ? dec.name : dec.import.name;
            if (name === 'Inject') {
                if (dec.args === null || dec.args.length !== 1) {
                    throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, dec.node, `Unexpected number of arguments to @Inject().`);
                }
                token = new WrappedNodeExpr(dec.args[0]);
            }
            else if (name === 'Optional') {
                optional = true;
            }
            else if (name === 'SkipSelf') {
                skipSelf = true;
            }
            else if (name === 'Self') {
                self = true;
            }
            else if (name === 'Host') {
                host = true;
            }
            else if (name === 'Attribute') {
                if (dec.args === null || dec.args.length !== 1) {
                    throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, dec.node, `Unexpected number of arguments to @Attribute().`);
                }
                const attributeName = dec.args[0];
                token = new WrappedNodeExpr(attributeName);
                if (ts.isStringLiteralLike(attributeName)) {
                    attributeNameType = new LiteralExpr(attributeName.text);
                }
                else {
                    attributeNameType = new WrappedNodeExpr(ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword));
                }
            }
            else {
                throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_UNEXPECTED, dec.node, `Unexpected decorator ${name} on parameter.`);
            }
        });
        if (token === null) {
            if (param.typeValueReference.kind !== 2 /* TypeValueReferenceKind.UNAVAILABLE */) {
                throw new Error('Illegal state: expected value reference to be unavailable if no token is present');
            }
            errors.push({
                index: idx,
                param,
                reason: param.typeValueReference.reason,
            });
        }
        else {
            deps.push({ token, attributeNameType, optional, self, skipSelf, host });
        }
    });
    if (errors.length === 0) {
        return { deps };
    }
    else {
        return { deps: null, errors };
    }
}
/**
 * Convert `ConstructorDeps` into the `R3DependencyMetadata` array for those deps if they're valid,
 * or into an `'invalid'` signal if they're not.
 *
 * This is a companion function to `validateConstructorDependencies` which accepts invalid deps.
 */
function unwrapConstructorDependencies(deps) {
    if (deps === null) {
        return null;
    }
    else if (deps.deps !== null) {
        // These constructor dependencies are valid.
        return deps.deps;
    }
    else {
        // These deps are invalid.
        return 'invalid';
    }
}
function getValidConstructorDependencies(clazz, reflector, isCore) {
    return validateConstructorDependencies(clazz, getConstructorDependencies(clazz, reflector, isCore));
}
/**
 * Validate that `ConstructorDeps` does not have any invalid dependencies and convert them into the
 * `R3DependencyMetadata` array if so, or raise a diagnostic if some deps are invalid.
 *
 * This is a companion function to `unwrapConstructorDependencies` which does not accept invalid
 * deps.
 */
function validateConstructorDependencies(clazz, deps) {
    if (deps === null) {
        return null;
    }
    else if (deps.deps !== null) {
        return deps.deps;
    }
    else {
        // There is at least one error.
        const error = deps.errors[0];
        throw createUnsuitableInjectionTokenError(clazz, error);
    }
}
/**
 * Creates a fatal error with diagnostic for an invalid injection token.
 * @param clazz The class for which the injection token was unavailable.
 * @param error The reason why no valid injection token is available.
 */
function createUnsuitableInjectionTokenError(clazz, error) {
    const { param, index, reason } = error;
    let chainMessage = undefined;
    let hints = undefined;
    switch (reason.kind) {
        case 5 /* ValueUnavailableKind.UNSUPPORTED */:
            chainMessage = 'Consider using the @Inject decorator to specify an injection token.';
            hints = [
                makeRelatedInformation(reason.typeNode, 'This type is not supported as injection token.'),
            ];
            break;
        case 1 /* ValueUnavailableKind.NO_VALUE_DECLARATION */:
            chainMessage = 'Consider using the @Inject decorator to specify an injection token.';
            hints = [
                makeRelatedInformation(reason.typeNode, 'This type does not have a value, so it cannot be used as injection token.'),
            ];
            if (reason.decl !== null) {
                hints.push(makeRelatedInformation(reason.decl, 'The type is declared here.'));
            }
            break;
        case 2 /* ValueUnavailableKind.TYPE_ONLY_IMPORT */:
            chainMessage =
                'Consider changing the type-only import to a regular import, or use the @Inject decorator to specify an injection token.';
            hints = [
                makeRelatedInformation(reason.typeNode, 'This type is imported using a type-only import, which prevents it from being usable as an injection token.'),
                makeRelatedInformation(reason.node, 'The type-only import occurs here.'),
            ];
            break;
        case 4 /* ValueUnavailableKind.NAMESPACE */:
            chainMessage = 'Consider using the @Inject decorator to specify an injection token.';
            hints = [
                makeRelatedInformation(reason.typeNode, 'This type corresponds with a namespace, which cannot be used as injection token.'),
                makeRelatedInformation(reason.importClause, 'The namespace import occurs here.'),
            ];
            break;
        case 3 /* ValueUnavailableKind.UNKNOWN_REFERENCE */:
            chainMessage = 'The type should reference a known declaration.';
            hints = [makeRelatedInformation(reason.typeNode, 'This type could not be resolved.')];
            break;
        case 0 /* ValueUnavailableKind.MISSING_TYPE */:
            chainMessage =
                'Consider adding a type to the parameter or use the @Inject decorator to specify an injection token.';
            break;
    }
    const chain = {
        messageText: `No suitable injection token for parameter '${param.name || index}' of class '${clazz.name.text}'.`,
        category: ts.DiagnosticCategory.Error,
        code: 0,
        next: [
            {
                messageText: chainMessage,
                category: ts.DiagnosticCategory.Message,
                code: 0,
            },
        ],
    };
    return new FatalDiagnosticError(exports.ErrorCode.PARAM_MISSING_TOKEN, param.nameNode, chain, hints);
}

/**
 * Disambiguates different kinds of compiler metadata objects.
 */
exports.MetaKind = void 0;
(function (MetaKind) {
    MetaKind[MetaKind["Directive"] = 0] = "Directive";
    MetaKind[MetaKind["Pipe"] = 1] = "Pipe";
    MetaKind[MetaKind["NgModule"] = 2] = "NgModule";
})(exports.MetaKind || (exports.MetaKind = {}));
/**
 * Possible ways that a directive can be matched.
 */
exports.MatchSource = void 0;
(function (MatchSource) {
    /** The directive was matched by its selector. */
    MatchSource[MatchSource["Selector"] = 0] = "Selector";
    /** The directive was applied as a host directive. */
    MatchSource[MatchSource["HostDirective"] = 1] = "HostDirective";
})(exports.MatchSource || (exports.MatchSource = {}));

/**
 * A mapping of component property and template binding property names, for example containing the
 * inputs of a particular directive or component.
 *
 * A single component property has exactly one input/output annotation (and therefore one binding
 * property name) associated with it, but the same binding property name may be shared across many
 * component property names.
 *
 * Allows bidirectional querying of the mapping - looking up all inputs/outputs with a given
 * property name, or mapping from a specific class property to its binding property name.
 */
class ClassPropertyMapping {
    /**
     * Mapping from class property names to the single `InputOrOutput` for that class property.
     */
    forwardMap;
    /**
     * Mapping from property names to one or more `InputOrOutput`s which share that name.
     */
    reverseMap;
    constructor(forwardMap) {
        this.forwardMap = forwardMap;
        this.reverseMap = reverseMapFromForwardMap(forwardMap);
    }
    /**
     * Construct a `ClassPropertyMapping` with no entries.
     */
    static empty() {
        return new ClassPropertyMapping(new Map());
    }
    /**
     * Construct a `ClassPropertyMapping` from a primitive JS object which maps class property names
     * to either binding property names or an array that contains both names, which is used in on-disk
     * metadata formats (e.g. in .d.ts files).
     */
    static fromMappedObject(obj) {
        const forwardMap = new Map();
        for (const classPropertyName of Object.keys(obj)) {
            const value = obj[classPropertyName];
            let inputOrOutput;
            if (typeof value === 'string') {
                inputOrOutput = {
                    classPropertyName,
                    bindingPropertyName: value,
                    // Inputs/outputs not captured via an explicit `InputOrOutput` mapping
                    // value are always considered non-signal. This is the string shorthand.
                    isSignal: false,
                };
            }
            else {
                inputOrOutput = value;
            }
            forwardMap.set(classPropertyName, inputOrOutput);
        }
        return new ClassPropertyMapping(forwardMap);
    }
    /**
     * Merge two mappings into one, with class properties from `b` taking precedence over class
     * properties from `a`.
     */
    static merge(a, b) {
        const forwardMap = new Map(a.forwardMap.entries());
        for (const [classPropertyName, inputOrOutput] of b.forwardMap) {
            forwardMap.set(classPropertyName, inputOrOutput);
        }
        return new ClassPropertyMapping(forwardMap);
    }
    /**
     * All class property names mapped in this mapping.
     */
    get classPropertyNames() {
        return Array.from(this.forwardMap.keys());
    }
    /**
     * All binding property names mapped in this mapping.
     */
    get propertyNames() {
        return Array.from(this.reverseMap.keys());
    }
    /**
     * Check whether a mapping for the given property name exists.
     */
    hasBindingPropertyName(propertyName) {
        return this.reverseMap.has(propertyName);
    }
    /**
     * Lookup all `InputOrOutput`s that use this `propertyName`.
     */
    getByBindingPropertyName(propertyName) {
        return this.reverseMap.has(propertyName) ? this.reverseMap.get(propertyName) : null;
    }
    /**
     * Lookup the `InputOrOutput` associated with a `classPropertyName`.
     */
    getByClassPropertyName(classPropertyName) {
        return this.forwardMap.has(classPropertyName) ? this.forwardMap.get(classPropertyName) : null;
    }
    /**
     * Convert this mapping to a primitive JS object which maps each class property directly to the
     * binding property name associated with it.
     */
    toDirectMappedObject() {
        const obj = {};
        for (const [classPropertyName, inputOrOutput] of this.forwardMap) {
            obj[classPropertyName] = inputOrOutput.bindingPropertyName;
        }
        return obj;
    }
    /**
     * Convert this mapping to a primitive JS object which maps each class property either to itself
     * (for cases where the binding property name is the same) or to an array which contains both
     * names if they differ.
     *
     * This object format is used when mappings are serialized (for example into .d.ts files).
     * @param transform Function used to transform the values of the generated map.
     */
    toJointMappedObject(transform) {
        const obj = {};
        for (const [classPropertyName, inputOrOutput] of this.forwardMap) {
            obj[classPropertyName] = transform(inputOrOutput);
        }
        return obj;
    }
    /**
     * Implement the iterator protocol and return entry objects which contain the class and binding
     * property names (and are useful for destructuring).
     */
    *[Symbol.iterator]() {
        for (const inputOrOutput of this.forwardMap.values()) {
            yield inputOrOutput;
        }
    }
}
function reverseMapFromForwardMap(forwardMap) {
    const reverseMap = new Map();
    for (const [_, inputOrOutput] of forwardMap) {
        if (!reverseMap.has(inputOrOutput.bindingPropertyName)) {
            reverseMap.set(inputOrOutput.bindingPropertyName, []);
        }
        reverseMap.get(inputOrOutput.bindingPropertyName).push(inputOrOutput);
    }
    return reverseMap;
}

function extractReferencesFromType(checker, def, bestGuessOwningModule) {
    if (!ts.isTupleTypeNode(def)) {
        return { result: [], isIncomplete: false };
    }
    const result = [];
    let isIncomplete = false;
    for (const element of def.elements) {
        if (!ts.isTypeQueryNode(element)) {
            throw new Error(`Expected TypeQueryNode: ${nodeDebugInfo(element)}`);
        }
        const ref = extraReferenceFromTypeQuery(checker, element, def, bestGuessOwningModule);
        // Note: Sometimes a reference inside the type tuple/array
        // may not be resolvable/existent. We proceed with incomplete data.
        if (ref === null) {
            isIncomplete = true;
        }
        else {
            result.push(ref);
        }
    }
    return { result, isIncomplete };
}
function extraReferenceFromTypeQuery(checker, typeNode, origin, bestGuessOwningModule) {
    const type = typeNode.exprName;
    let node;
    let from;
    // Gracefully handle when the type entity could not be converted or
    // resolved to its declaration node.
    try {
        const result = reflectTypeEntityToDeclaration(type, checker);
        node = result.node;
        from = result.from;
    }
    catch (e) {
        if (e instanceof TypeEntityToDeclarationError) {
            return null;
        }
        throw e;
    }
    if (!isNamedClassDeclaration(node)) {
        throw new Error(`Expected named ClassDeclaration: ${nodeDebugInfo(node)}`);
    }
    if (from !== null && !from.startsWith('.')) {
        // The symbol was imported using an absolute module specifier so return a reference that
        // uses that absolute module specifier as its best guess owning module.
        return new Reference(node, {
            specifier: from,
            resolutionContext: origin.getSourceFile().fileName,
        });
    }
    // For local symbols or symbols that were imported using a relative module import it is
    // assumed that the symbol is exported from the provided best guess owning module.
    return new Reference(node, bestGuessOwningModule);
}
function readBooleanType(type) {
    if (!ts.isLiteralTypeNode(type)) {
        return null;
    }
    switch (type.literal.kind) {
        case ts.SyntaxKind.TrueKeyword:
            return true;
        case ts.SyntaxKind.FalseKeyword:
            return false;
        default:
            return null;
    }
}
function readStringType(type) {
    if (!ts.isLiteralTypeNode(type) || !ts.isStringLiteral(type.literal)) {
        return null;
    }
    return type.literal.text;
}
function readMapType(type, valueTransform) {
    if (!ts.isTypeLiteralNode(type)) {
        return {};
    }
    const obj = {};
    type.members.forEach((member) => {
        if (!ts.isPropertySignature(member) ||
            member.type === undefined ||
            member.name === undefined ||
            (!ts.isStringLiteral(member.name) && !ts.isIdentifier(member.name))) {
            return;
        }
        const value = valueTransform(member.type);
        if (value !== null) {
            obj[member.name.text] = value;
        }
    });
    return obj;
}
function readStringArrayType(type) {
    if (!ts.isTupleTypeNode(type)) {
        return [];
    }
    const res = [];
    type.elements.forEach((el) => {
        if (!ts.isLiteralTypeNode(el) || !ts.isStringLiteral(el.literal)) {
            return;
        }
        res.push(el.literal.text);
    });
    return res;
}
/**
 * Inspects the class' members and extracts the metadata that is used when type-checking templates
 * that use the directive. This metadata does not contain information from a base class, if any,
 * making this metadata invariant to changes of inherited classes.
 */
function extractDirectiveTypeCheckMeta(node, inputs, reflector) {
    const members = reflector.getMembersOfClass(node);
    const staticMembers = members.filter((member) => member.isStatic);
    const ngTemplateGuards = staticMembers
        .map(extractTemplateGuard)
        .filter((guard) => guard !== null);
    const hasNgTemplateContextGuard = staticMembers.some((member) => member.kind === exports.ClassMemberKind.Method && member.name === 'ngTemplateContextGuard');
    const coercedInputFields = new Set(staticMembers.map(extractCoercedInput).filter((inputName) => {
        // If the input refers to a signal input, we will not respect coercion members.
        // A transform function should be used instead.
        if (inputName === null || inputs.getByClassPropertyName(inputName)?.isSignal) {
            return false;
        }
        return true;
    }));
    const restrictedInputFields = new Set();
    const stringLiteralInputFields = new Set();
    const undeclaredInputFields = new Set();
    for (const { classPropertyName, transform } of inputs) {
        const field = members.find((member) => member.name === classPropertyName);
        if (field === undefined || field.node === null) {
            undeclaredInputFields.add(classPropertyName);
            continue;
        }
        if (isRestricted(field.node)) {
            restrictedInputFields.add(classPropertyName);
        }
        if (field.nameNode !== null && ts.isStringLiteral(field.nameNode)) {
            stringLiteralInputFields.add(classPropertyName);
        }
        if (transform !== null) {
            coercedInputFields.add(classPropertyName);
        }
    }
    const arity = reflector.getGenericArityOfClass(node);
    return {
        hasNgTemplateContextGuard,
        ngTemplateGuards,
        coercedInputFields,
        restrictedInputFields,
        stringLiteralInputFields,
        undeclaredInputFields,
        isGeneric: arity !== null && arity > 0,
    };
}
function isRestricted(node) {
    const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;
    return (modifiers !== undefined &&
        modifiers.some(({ kind }) => {
            return (kind === ts.SyntaxKind.PrivateKeyword ||
                kind === ts.SyntaxKind.ProtectedKeyword ||
                kind === ts.SyntaxKind.ReadonlyKeyword);
        }));
}
function extractTemplateGuard(member) {
    if (!member.name.startsWith('ngTemplateGuard_')) {
        return null;
    }
    const inputName = afterUnderscore(member.name);
    if (member.kind === exports.ClassMemberKind.Property) {
        let type = null;
        if (member.type !== null &&
            ts.isLiteralTypeNode(member.type) &&
            ts.isStringLiteral(member.type.literal)) {
            type = member.type.literal.text;
        }
        // Only property members with string literal type 'binding' are considered as template guard.
        if (type !== 'binding') {
            return null;
        }
        return { inputName, type };
    }
    else if (member.kind === exports.ClassMemberKind.Method) {
        return { inputName, type: 'invocation' };
    }
    else {
        return null;
    }
}
function extractCoercedInput(member) {
    if (member.kind !== exports.ClassMemberKind.Property || !member.name.startsWith('ngAcceptInputType_')) {
        return null;
    }
    return afterUnderscore(member.name);
}
/**
 * A `MetadataReader` that reads from an ordered set of child readers until it obtains the requested
 * metadata.
 *
 * This is used to combine `MetadataReader`s that read from different sources (e.g. from a registry
 * and from .d.ts files).
 */
class CompoundMetadataReader {
    readers;
    constructor(readers) {
        this.readers = readers;
    }
    getDirectiveMetadata(node) {
        for (const reader of this.readers) {
            const meta = reader.getDirectiveMetadata(node);
            if (meta !== null) {
                return meta;
            }
        }
        return null;
    }
    getNgModuleMetadata(node) {
        for (const reader of this.readers) {
            const meta = reader.getNgModuleMetadata(node);
            if (meta !== null) {
                return meta;
            }
        }
        return null;
    }
    getPipeMetadata(node) {
        for (const reader of this.readers) {
            const meta = reader.getPipeMetadata(node);
            if (meta !== null) {
                return meta;
            }
        }
        return null;
    }
}
function afterUnderscore(str) {
    const pos = str.indexOf('_');
    if (pos === -1) {
        throw new Error(`Expected '${str}' to contain '_'`);
    }
    return str.slice(pos + 1);
}
/** Returns whether a class declaration has the necessary class fields to make it injectable. */
function hasInjectableFields(clazz, host) {
    const members = host.getMembersOfClass(clazz);
    return members.some(({ isStatic, name }) => isStatic && (name === 'ɵprov' || name === 'ɵfac'));
}
function isHostDirectiveMetaForGlobalMode(hostDirectiveMeta) {
    return hostDirectiveMeta.directive instanceof Reference;
}

/**
 * Given a reference to a directive, return a flattened version of its `DirectiveMeta` metadata
 * which includes metadata from its entire inheritance chain.
 *
 * The returned `DirectiveMeta` will either have `baseClass: null` if the inheritance chain could be
 * fully resolved, or `baseClass: 'dynamic'` if the inheritance chain could not be completely
 * followed.
 */
function flattenInheritedDirectiveMetadata(reader, dir) {
    const topMeta = reader.getDirectiveMetadata(dir);
    if (topMeta === null) {
        return null;
    }
    if (topMeta.baseClass === null) {
        return topMeta;
    }
    const coercedInputFields = new Set();
    const undeclaredInputFields = new Set();
    const restrictedInputFields = new Set();
    const stringLiteralInputFields = new Set();
    let hostDirectives = null;
    let isDynamic = false;
    let inputs = ClassPropertyMapping.empty();
    let outputs = ClassPropertyMapping.empty();
    let isStructural = false;
    const addMetadata = (meta) => {
        if (meta.baseClass === 'dynamic') {
            isDynamic = true;
        }
        else if (meta.baseClass !== null) {
            const baseMeta = reader.getDirectiveMetadata(meta.baseClass);
            if (baseMeta !== null) {
                addMetadata(baseMeta);
            }
            else {
                // Missing metadata for the base class means it's effectively dynamic.
                isDynamic = true;
            }
        }
        isStructural = isStructural || meta.isStructural;
        inputs = ClassPropertyMapping.merge(inputs, meta.inputs);
        outputs = ClassPropertyMapping.merge(outputs, meta.outputs);
        for (const coercedInputField of meta.coercedInputFields) {
            coercedInputFields.add(coercedInputField);
        }
        for (const undeclaredInputField of meta.undeclaredInputFields) {
            undeclaredInputFields.add(undeclaredInputField);
        }
        for (const restrictedInputField of meta.restrictedInputFields) {
            restrictedInputFields.add(restrictedInputField);
        }
        for (const field of meta.stringLiteralInputFields) {
            stringLiteralInputFields.add(field);
        }
        if (meta.hostDirectives !== null && meta.hostDirectives.length > 0) {
            hostDirectives ??= [];
            hostDirectives.push(...meta.hostDirectives);
        }
    };
    addMetadata(topMeta);
    return {
        ...topMeta,
        inputs,
        outputs,
        coercedInputFields,
        undeclaredInputFields,
        restrictedInputFields,
        stringLiteralInputFields,
        baseClass: isDynamic ? 'dynamic' : null,
        isStructural,
        hostDirectives,
    };
}

/**
 * Represents a value which cannot be determined statically.
 */
class DynamicValue {
    node;
    reason;
    code;
    constructor(node, reason, code) {
        this.node = node;
        this.reason = reason;
        this.code = code;
    }
    static fromDynamicInput(node, input) {
        return new DynamicValue(node, input, 0 /* DynamicValueReason.DYNAMIC_INPUT */);
    }
    static fromDynamicString(node) {
        return new DynamicValue(node, undefined, 1 /* DynamicValueReason.DYNAMIC_STRING */);
    }
    static fromExternalReference(node, ref) {
        return new DynamicValue(node, ref, 2 /* DynamicValueReason.EXTERNAL_REFERENCE */);
    }
    static fromUnsupportedSyntax(node) {
        return new DynamicValue(node, undefined, 3 /* DynamicValueReason.UNSUPPORTED_SYNTAX */);
    }
    static fromUnknownIdentifier(node) {
        return new DynamicValue(node, undefined, 4 /* DynamicValueReason.UNKNOWN_IDENTIFIER */);
    }
    static fromInvalidExpressionType(node, value) {
        return new DynamicValue(node, value, 5 /* DynamicValueReason.INVALID_EXPRESSION_TYPE */);
    }
    static fromComplexFunctionCall(node, fn) {
        return new DynamicValue(node, fn, 6 /* DynamicValueReason.COMPLEX_FUNCTION_CALL */);
    }
    static fromDynamicType(node) {
        return new DynamicValue(node, undefined, 7 /* DynamicValueReason.DYNAMIC_TYPE */);
    }
    static fromSyntheticInput(node, value) {
        return new DynamicValue(node, value, 8 /* DynamicValueReason.SYNTHETIC_INPUT */);
    }
    static fromUnknown(node) {
        return new DynamicValue(node, undefined, 9 /* DynamicValueReason.UNKNOWN */);
    }
    isFromDynamicInput() {
        return this.code === 0 /* DynamicValueReason.DYNAMIC_INPUT */;
    }
    isFromDynamicString() {
        return this.code === 1 /* DynamicValueReason.DYNAMIC_STRING */;
    }
    isFromExternalReference() {
        return this.code === 2 /* DynamicValueReason.EXTERNAL_REFERENCE */;
    }
    isFromUnsupportedSyntax() {
        return this.code === 3 /* DynamicValueReason.UNSUPPORTED_SYNTAX */;
    }
    isFromUnknownIdentifier() {
        return this.code === 4 /* DynamicValueReason.UNKNOWN_IDENTIFIER */;
    }
    isFromInvalidExpressionType() {
        return this.code === 5 /* DynamicValueReason.INVALID_EXPRESSION_TYPE */;
    }
    isFromComplexFunctionCall() {
        return this.code === 6 /* DynamicValueReason.COMPLEX_FUNCTION_CALL */;
    }
    isFromDynamicType() {
        return this.code === 7 /* DynamicValueReason.DYNAMIC_TYPE */;
    }
    isFromUnknown() {
        return this.code === 9 /* DynamicValueReason.UNKNOWN */;
    }
    accept(visitor) {
        switch (this.code) {
            case 0 /* DynamicValueReason.DYNAMIC_INPUT */:
                return visitor.visitDynamicInput(this);
            case 1 /* DynamicValueReason.DYNAMIC_STRING */:
                return visitor.visitDynamicString(this);
            case 2 /* DynamicValueReason.EXTERNAL_REFERENCE */:
                return visitor.visitExternalReference(this);
            case 3 /* DynamicValueReason.UNSUPPORTED_SYNTAX */:
                return visitor.visitUnsupportedSyntax(this);
            case 4 /* DynamicValueReason.UNKNOWN_IDENTIFIER */:
                return visitor.visitUnknownIdentifier(this);
            case 5 /* DynamicValueReason.INVALID_EXPRESSION_TYPE */:
                return visitor.visitInvalidExpressionType(this);
            case 6 /* DynamicValueReason.COMPLEX_FUNCTION_CALL */:
                return visitor.visitComplexFunctionCall(this);
            case 7 /* DynamicValueReason.DYNAMIC_TYPE */:
                return visitor.visitDynamicType(this);
            case 8 /* DynamicValueReason.SYNTHETIC_INPUT */:
                return visitor.visitSyntheticInput(this);
            case 9 /* DynamicValueReason.UNKNOWN */:
                return visitor.visitUnknown(this);
        }
    }
}

/**
 * A collection of publicly exported declarations from a module. Each declaration is evaluated
 * lazily upon request.
 */
class ResolvedModule {
    exports;
    evaluate;
    constructor(exports, evaluate) {
        this.exports = exports;
        this.evaluate = evaluate;
    }
    getExport(name) {
        if (!this.exports.has(name)) {
            return undefined;
        }
        return this.evaluate(this.exports.get(name));
    }
    getExports() {
        const map = new Map();
        this.exports.forEach((decl, name) => {
            map.set(name, this.evaluate(decl));
        });
        return map;
    }
}
/**
 * A value member of an enumeration.
 *
 * Contains a `Reference` to the enumeration itself, and the name of the referenced member.
 */
class EnumValue {
    enumRef;
    name;
    resolved;
    constructor(enumRef, name, resolved) {
        this.enumRef = enumRef;
        this.name = name;
        this.resolved = resolved;
    }
}
/**
 * An implementation of a known function that can be statically evaluated.
 * It could be a built-in function or method (such as `Array.prototype.slice`) or a TypeScript
 * helper (such as `__spread`).
 */
class KnownFn {
}

/**
 * Derives a type representation from a resolved value to be reported in a diagnostic.
 *
 * @param value The resolved value for which a type representation should be derived.
 * @param maxDepth The maximum nesting depth of objects and arrays, defaults to 1 level.
 */
function describeResolvedType(value, maxDepth = 1) {
    if (value === null) {
        return 'null';
    }
    else if (value === undefined) {
        return 'undefined';
    }
    else if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {
        return typeof value;
    }
    else if (value instanceof Map) {
        if (maxDepth === 0) {
            return 'object';
        }
        const entries = Array.from(value.entries()).map(([key, v]) => {
            return `${quoteKey(key)}: ${describeResolvedType(v, maxDepth - 1)}`;
        });
        return entries.length > 0 ? `{ ${entries.join('; ')} }` : '{}';
    }
    else if (value instanceof ResolvedModule) {
        return '(module)';
    }
    else if (value instanceof EnumValue) {
        return value.enumRef.debugName ?? '(anonymous)';
    }
    else if (value instanceof Reference) {
        return value.debugName ?? '(anonymous)';
    }
    else if (Array.isArray(value)) {
        if (maxDepth === 0) {
            return 'Array';
        }
        return `[${value.map((v) => describeResolvedType(v, maxDepth - 1)).join(', ')}]`;
    }
    else if (value instanceof DynamicValue) {
        return '(not statically analyzable)';
    }
    else if (value instanceof KnownFn) {
        return 'Function';
    }
    else {
        return 'unknown';
    }
}
function quoteKey(key) {
    if (/^[a-z0-9_]+$/i.test(key)) {
        return key;
    }
    else {
        return `'${key.replace(/'/g, "\\'")}'`;
    }
}
/**
 * Creates an array of related information diagnostics for a `DynamicValue` that describe the trace
 * of why an expression was evaluated as dynamic.
 *
 * @param node The node for which a `ts.Diagnostic` is to be created with the trace.
 * @param value The dynamic value for which a trace should be created.
 */
function traceDynamicValue(node, value) {
    return value.accept(new TraceDynamicValueVisitor(node));
}
class TraceDynamicValueVisitor {
    node;
    currentContainerNode = null;
    constructor(node) {
        this.node = node;
    }
    visitDynamicInput(value) {
        const trace = value.reason.accept(this);
        if (this.shouldTrace(value.node)) {
            const info = makeRelatedInformation(value.node, 'Unable to evaluate this expression statically.');
            trace.unshift(info);
        }
        return trace;
    }
    visitSyntheticInput(value) {
        return [makeRelatedInformation(value.node, 'Unable to evaluate this expression further.')];
    }
    visitDynamicString(value) {
        return [
            makeRelatedInformation(value.node, 'A string value could not be determined statically.'),
        ];
    }
    visitExternalReference(value) {
        const name = value.reason.debugName;
        const description = name !== null ? `'${name}'` : 'an anonymous declaration';
        return [
            makeRelatedInformation(value.node, `A value for ${description} cannot be determined statically, as it is an external declaration.`),
        ];
    }
    visitComplexFunctionCall(value) {
        return [
            makeRelatedInformation(value.node, 'Unable to evaluate function call of complex function. A function must have exactly one return statement.'),
            makeRelatedInformation(value.reason.node, 'Function is declared here.'),
        ];
    }
    visitInvalidExpressionType(value) {
        return [makeRelatedInformation(value.node, 'Unable to evaluate an invalid expression.')];
    }
    visitUnknown(value) {
        return [makeRelatedInformation(value.node, 'Unable to evaluate statically.')];
    }
    visitUnknownIdentifier(value) {
        return [makeRelatedInformation(value.node, 'Unknown reference.')];
    }
    visitDynamicType(value) {
        return [makeRelatedInformation(value.node, 'Dynamic type.')];
    }
    visitUnsupportedSyntax(value) {
        return [makeRelatedInformation(value.node, 'This syntax is not supported.')];
    }
    /**
     * Determines whether the dynamic value reported for the node should be traced, i.e. if it is not
     * part of the container for which the most recent trace was created.
     */
    shouldTrace(node) {
        if (node === this.node) {
            // Do not include a dynamic value for the origin node, as the main diagnostic is already
            // reported on that node.
            return false;
        }
        const container = getContainerNode(node);
        if (container === this.currentContainerNode) {
            // The node is part of the same container as the previous trace entry, so this dynamic value
            // should not become part of the trace.
            return false;
        }
        this.currentContainerNode = container;
        return true;
    }
}
/**
 * Determines the closest parent node that is to be considered as container, which is used to reduce
 * the granularity of tracing the dynamic values to a single entry per container. Currently, full
 * statements and destructuring patterns are considered as container.
 */
function getContainerNode(node) {
    let currentNode = node;
    while (currentNode !== undefined) {
        switch (currentNode.kind) {
            case ts.SyntaxKind.ExpressionStatement:
            case ts.SyntaxKind.VariableStatement:
            case ts.SyntaxKind.ReturnStatement:
            case ts.SyntaxKind.IfStatement:
            case ts.SyntaxKind.SwitchStatement:
            case ts.SyntaxKind.DoStatement:
            case ts.SyntaxKind.WhileStatement:
            case ts.SyntaxKind.ForStatement:
            case ts.SyntaxKind.ForInStatement:
            case ts.SyntaxKind.ForOfStatement:
            case ts.SyntaxKind.ContinueStatement:
            case ts.SyntaxKind.BreakStatement:
            case ts.SyntaxKind.ThrowStatement:
            case ts.SyntaxKind.ObjectBindingPattern:
            case ts.SyntaxKind.ArrayBindingPattern:
                return currentNode;
        }
        currentNode = currentNode.parent;
    }
    return node.getSourceFile();
}

class ArraySliceBuiltinFn extends KnownFn {
    lhs;
    constructor(lhs) {
        super();
        this.lhs = lhs;
    }
    evaluate(node, args) {
        if (args.length === 0) {
            return this.lhs;
        }
        else {
            return DynamicValue.fromUnknown(node);
        }
    }
}
class ArrayConcatBuiltinFn extends KnownFn {
    lhs;
    constructor(lhs) {
        super();
        this.lhs = lhs;
    }
    evaluate(node, args) {
        const result = [...this.lhs];
        for (const arg of args) {
            if (arg instanceof DynamicValue) {
                result.push(DynamicValue.fromDynamicInput(node, arg));
            }
            else if (Array.isArray(arg)) {
                result.push(...arg);
            }
            else {
                result.push(arg);
            }
        }
        return result;
    }
}
class StringConcatBuiltinFn extends KnownFn {
    lhs;
    constructor(lhs) {
        super();
        this.lhs = lhs;
    }
    evaluate(node, args) {
        let result = this.lhs;
        for (const arg of args) {
            const resolved = arg instanceof EnumValue ? arg.resolved : arg;
            if (typeof resolved === 'string' ||
                typeof resolved === 'number' ||
                typeof resolved === 'boolean' ||
                resolved == null) {
                // Cast to `any`, because `concat` will convert
                // anything to a string, but TS only allows strings.
                result = result.concat(resolved);
            }
            else {
                return DynamicValue.fromUnknown(node);
            }
        }
        return result;
    }
}

/**
 * A value produced which originated in a `ForeignFunctionResolver` and doesn't come from the
 * template itself.
 *
 * Synthetic values cannot be further evaluated, and attempts to do so produce `DynamicValue`s
 * instead.
 */
class SyntheticValue {
    value;
    constructor(value) {
        this.value = value;
    }
}

function literalBinaryOp(op) {
    return { op, literal: true };
}
function referenceBinaryOp(op) {
    return { op, literal: false };
}
const BINARY_OPERATORS$2 = new Map([
    [ts.SyntaxKind.PlusToken, literalBinaryOp((a, b) => a + b)],
    [ts.SyntaxKind.MinusToken, literalBinaryOp((a, b) => a - b)],
    [ts.SyntaxKind.AsteriskToken, literalBinaryOp((a, b) => a * b)],
    [ts.SyntaxKind.SlashToken, literalBinaryOp((a, b) => a / b)],
    [ts.SyntaxKind.PercentToken, literalBinaryOp((a, b) => a % b)],
    [ts.SyntaxKind.AmpersandToken, literalBinaryOp((a, b) => a & b)],
    [ts.SyntaxKind.BarToken, literalBinaryOp((a, b) => a | b)],
    [ts.SyntaxKind.CaretToken, literalBinaryOp((a, b) => a ^ b)],
    [ts.SyntaxKind.LessThanToken, literalBinaryOp((a, b) => a < b)],
    [ts.SyntaxKind.LessThanEqualsToken, literalBinaryOp((a, b) => a <= b)],
    [ts.SyntaxKind.GreaterThanToken, literalBinaryOp((a, b) => a > b)],
    [ts.SyntaxKind.GreaterThanEqualsToken, literalBinaryOp((a, b) => a >= b)],
    [ts.SyntaxKind.EqualsEqualsToken, literalBinaryOp((a, b) => a == b)],
    [ts.SyntaxKind.EqualsEqualsEqualsToken, literalBinaryOp((a, b) => a === b)],
    [ts.SyntaxKind.ExclamationEqualsToken, literalBinaryOp((a, b) => a != b)],
    [ts.SyntaxKind.ExclamationEqualsEqualsToken, literalBinaryOp((a, b) => a !== b)],
    [ts.SyntaxKind.LessThanLessThanToken, literalBinaryOp((a, b) => a << b)],
    [ts.SyntaxKind.GreaterThanGreaterThanToken, literalBinaryOp((a, b) => a >> b)],
    [ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken, literalBinaryOp((a, b) => a >>> b)],
    [ts.SyntaxKind.AsteriskAsteriskToken, literalBinaryOp((a, b) => Math.pow(a, b))],
    [ts.SyntaxKind.AmpersandAmpersandToken, referenceBinaryOp((a, b) => a && b)],
    [ts.SyntaxKind.BarBarToken, referenceBinaryOp((a, b) => a || b)],
]);
const UNARY_OPERATORS$2 = new Map([
    [ts.SyntaxKind.TildeToken, (a) => ~a],
    [ts.SyntaxKind.MinusToken, (a) => -a],
    [ts.SyntaxKind.PlusToken, (a) => +a],
    [ts.SyntaxKind.ExclamationToken, (a) => !a],
]);
class StaticInterpreter {
    host;
    checker;
    dependencyTracker;
    constructor(host, checker, dependencyTracker) {
        this.host = host;
        this.checker = checker;
        this.dependencyTracker = dependencyTracker;
    }
    visit(node, context) {
        return this.visitExpression(node, context);
    }
    visitExpression(node, context) {
        let result;
        if (node.kind === ts.SyntaxKind.TrueKeyword) {
            return true;
        }
        else if (node.kind === ts.SyntaxKind.FalseKeyword) {
            return false;
        }
        else if (node.kind === ts.SyntaxKind.NullKeyword) {
            return null;
        }
        else if (ts.isStringLiteral(node)) {
            return node.text;
        }
        else if (ts.isNoSubstitutionTemplateLiteral(node)) {
            return node.text;
        }
        else if (ts.isTemplateExpression(node)) {
            result = this.visitTemplateExpression(node, context);
        }
        else if (ts.isNumericLiteral(node)) {
            return parseFloat(node.text);
        }
        else if (ts.isObjectLiteralExpression(node)) {
            result = this.visitObjectLiteralExpression(node, context);
        }
        else if (ts.isIdentifier(node)) {
            result = this.visitIdentifier(node, context);
        }
        else if (ts.isPropertyAccessExpression(node)) {
            result = this.visitPropertyAccessExpression(node, context);
        }
        else if (ts.isCallExpression(node)) {
            result = this.visitCallExpression(node, context);
        }
        else if (ts.isConditionalExpression(node)) {
            result = this.visitConditionalExpression(node, context);
        }
        else if (ts.isPrefixUnaryExpression(node)) {
            result = this.visitPrefixUnaryExpression(node, context);
        }
        else if (ts.isBinaryExpression(node)) {
            result = this.visitBinaryExpression(node, context);
        }
        else if (ts.isArrayLiteralExpression(node)) {
            result = this.visitArrayLiteralExpression(node, context);
        }
        else if (ts.isParenthesizedExpression(node)) {
            result = this.visitParenthesizedExpression(node, context);
        }
        else if (ts.isElementAccessExpression(node)) {
            result = this.visitElementAccessExpression(node, context);
        }
        else if (ts.isAsExpression(node)) {
            result = this.visitExpression(node.expression, context);
        }
        else if (ts.isNonNullExpression(node)) {
            result = this.visitExpression(node.expression, context);
        }
        else if (this.host.isClass(node)) {
            result = this.visitDeclaration(node, context);
        }
        else {
            return DynamicValue.fromUnsupportedSyntax(node);
        }
        if (result instanceof DynamicValue && result.node !== node) {
            return DynamicValue.fromDynamicInput(node, result);
        }
        return result;
    }
    visitArrayLiteralExpression(node, context) {
        const array = [];
        for (let i = 0; i < node.elements.length; i++) {
            const element = node.elements[i];
            if (ts.isSpreadElement(element)) {
                array.push(...this.visitSpreadElement(element, context));
            }
            else {
                array.push(this.visitExpression(element, context));
            }
        }
        return array;
    }
    visitObjectLiteralExpression(node, context) {
        const map = new Map();
        for (let i = 0; i < node.properties.length; i++) {
            const property = node.properties[i];
            if (ts.isPropertyAssignment(property)) {
                const name = this.stringNameFromPropertyName(property.name, context);
                // Check whether the name can be determined statically.
                if (name === undefined) {
                    return DynamicValue.fromDynamicInput(node, DynamicValue.fromDynamicString(property.name));
                }
                map.set(name, this.visitExpression(property.initializer, context));
            }
            else if (ts.isShorthandPropertyAssignment(property)) {
                const symbol = this.checker.getShorthandAssignmentValueSymbol(property);
                if (symbol === undefined || symbol.valueDeclaration === undefined) {
                    map.set(property.name.text, DynamicValue.fromUnknown(property));
                }
                else {
                    map.set(property.name.text, this.visitDeclaration(symbol.valueDeclaration, context));
                }
            }
            else if (ts.isSpreadAssignment(property)) {
                const spread = this.visitExpression(property.expression, context);
                if (spread instanceof DynamicValue) {
                    return DynamicValue.fromDynamicInput(node, spread);
                }
                else if (spread instanceof Map) {
                    spread.forEach((value, key) => map.set(key, value));
                }
                else if (spread instanceof ResolvedModule) {
                    spread.getExports().forEach((value, key) => map.set(key, value));
                }
                else {
                    return DynamicValue.fromDynamicInput(node, DynamicValue.fromInvalidExpressionType(property, spread));
                }
            }
            else {
                return DynamicValue.fromUnknown(node);
            }
        }
        return map;
    }
    visitTemplateExpression(node, context) {
        const pieces = [node.head.text];
        for (let i = 0; i < node.templateSpans.length; i++) {
            const span = node.templateSpans[i];
            const value = literal(this.visit(span.expression, context), () => DynamicValue.fromDynamicString(span.expression));
            if (value instanceof DynamicValue) {
                return DynamicValue.fromDynamicInput(node, value);
            }
            pieces.push(`${value}`, span.literal.text);
        }
        return pieces.join('');
    }
    visitIdentifier(node, context) {
        const decl = this.host.getDeclarationOfIdentifier(node);
        if (decl === null) {
            if (ts.identifierToKeywordKind(node) === ts.SyntaxKind.UndefinedKeyword) {
                return undefined;
            }
            else {
                // Check if the symbol here is imported.
                if (this.dependencyTracker !== null && this.host.getImportOfIdentifier(node) !== null) {
                    // It was, but no declaration for the node could be found. This means that the dependency
                    // graph for the current file cannot be properly updated to account for this (broken)
                    // import. Instead, the originating file is reported as failing dependency analysis,
                    // ensuring that future compilations will always attempt to re-resolve the previously
                    // broken identifier.
                    this.dependencyTracker.recordDependencyAnalysisFailure(context.originatingFile);
                }
                return DynamicValue.fromUnknownIdentifier(node);
            }
        }
        const declContext = { ...context, ...joinModuleContext(context, node, decl) };
        const result = this.visitDeclaration(decl.node, declContext);
        if (result instanceof Reference) {
            // Only record identifiers to non-synthetic references. Synthetic references may not have the
            // same value at runtime as they do at compile time, so it's not legal to refer to them by the
            // identifier here.
            if (!result.synthetic) {
                result.addIdentifier(node);
            }
        }
        else if (result instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, result);
        }
        return result;
    }
    visitDeclaration(node, context) {
        if (this.dependencyTracker !== null) {
            this.dependencyTracker.addDependency(context.originatingFile, node.getSourceFile());
        }
        if (this.host.isClass(node)) {
            return this.getReference(node, context);
        }
        else if (ts.isVariableDeclaration(node)) {
            return this.visitVariableDeclaration(node, context);
        }
        else if (ts.isParameter(node) && context.scope.has(node)) {
            return context.scope.get(node);
        }
        else if (ts.isExportAssignment(node)) {
            return this.visitExpression(node.expression, context);
        }
        else if (ts.isEnumDeclaration(node)) {
            return this.visitEnumDeclaration(node, context);
        }
        else if (ts.isSourceFile(node)) {
            return this.visitSourceFile(node, context);
        }
        else if (ts.isBindingElement(node)) {
            return this.visitBindingElement(node, context);
        }
        else {
            return this.getReference(node, context);
        }
    }
    visitVariableDeclaration(node, context) {
        const value = this.host.getVariableValue(node);
        if (value !== null) {
            return this.visitExpression(value, context);
        }
        else if (isVariableDeclarationDeclared(node)) {
            // If the declaration has a literal type that can be statically reduced to a value, resolve to
            // that value. If not, the historical behavior for variable declarations is to return a
            // `Reference` to the variable, as the consumer could use it in a context where knowing its
            // static value is not necessary.
            //
            // Arguably, since the value cannot be statically determined, we should return a
            // `DynamicValue`. This returns a `Reference` because it's the same behavior as before
            // `visitType` was introduced.
            //
            // TODO(zarend): investigate switching to a `DynamicValue` and verify this won't break any
            // use cases, especially in ngcc
            if (node.type !== undefined) {
                const evaluatedType = this.visitType(node.type, context);
                if (!(evaluatedType instanceof DynamicValue)) {
                    return evaluatedType;
                }
            }
            return this.getReference(node, context);
        }
        else {
            return undefined;
        }
    }
    visitEnumDeclaration(node, context) {
        const enumRef = this.getReference(node, context);
        const map = new Map();
        node.members.forEach((member, index) => {
            const name = this.stringNameFromPropertyName(member.name, context);
            if (name !== undefined) {
                const resolved = member.initializer ? this.visit(member.initializer, context) : index;
                map.set(name, new EnumValue(enumRef, name, resolved));
            }
        });
        return map;
    }
    visitElementAccessExpression(node, context) {
        const lhs = this.visitExpression(node.expression, context);
        if (lhs instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, lhs);
        }
        const rhs = this.visitExpression(node.argumentExpression, context);
        if (rhs instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, rhs);
        }
        if (typeof rhs !== 'string' && typeof rhs !== 'number') {
            return DynamicValue.fromInvalidExpressionType(node, rhs);
        }
        return this.accessHelper(node, lhs, rhs, context);
    }
    visitPropertyAccessExpression(node, context) {
        const lhs = this.visitExpression(node.expression, context);
        const rhs = node.name.text;
        // TODO: handle reference to class declaration.
        if (lhs instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, lhs);
        }
        return this.accessHelper(node, lhs, rhs, context);
    }
    visitSourceFile(node, context) {
        const declarations = this.host.getExportsOfModule(node);
        if (declarations === null) {
            return DynamicValue.fromUnknown(node);
        }
        return new ResolvedModule(declarations, (decl) => {
            const declContext = {
                ...context,
                ...joinModuleContext(context, node, decl),
            };
            // Visit both concrete and inline declarations.
            return this.visitDeclaration(decl.node, declContext);
        });
    }
    accessHelper(node, lhs, rhs, context) {
        const strIndex = `${rhs}`;
        if (lhs instanceof Map) {
            if (lhs.has(strIndex)) {
                return lhs.get(strIndex);
            }
            else {
                return undefined;
            }
        }
        else if (lhs instanceof ResolvedModule) {
            return lhs.getExport(strIndex);
        }
        else if (Array.isArray(lhs)) {
            if (rhs === 'length') {
                return lhs.length;
            }
            else if (rhs === 'slice') {
                return new ArraySliceBuiltinFn(lhs);
            }
            else if (rhs === 'concat') {
                return new ArrayConcatBuiltinFn(lhs);
            }
            if (typeof rhs !== 'number' || !Number.isInteger(rhs)) {
                return DynamicValue.fromInvalidExpressionType(node, rhs);
            }
            return lhs[rhs];
        }
        else if (typeof lhs === 'string' && rhs === 'concat') {
            return new StringConcatBuiltinFn(lhs);
        }
        else if (lhs instanceof Reference) {
            const ref = lhs.node;
            if (this.host.isClass(ref)) {
                const module = owningModule(context, lhs.bestGuessOwningModule);
                let value = undefined;
                const member = this.host
                    .getMembersOfClass(ref)
                    .find((member) => member.isStatic && member.name === strIndex);
                if (member !== undefined) {
                    if (member.value !== null) {
                        value = this.visitExpression(member.value, context);
                    }
                    else if (member.implementation !== null) {
                        value = new Reference(member.implementation, module);
                    }
                    else if (member.node) {
                        value = new Reference(member.node, module);
                    }
                }
                return value;
            }
            else if (isDeclaration(ref)) {
                return DynamicValue.fromDynamicInput(node, DynamicValue.fromExternalReference(ref, lhs));
            }
        }
        else if (lhs instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, lhs);
        }
        else if (lhs instanceof SyntheticValue) {
            return DynamicValue.fromSyntheticInput(node, lhs);
        }
        return DynamicValue.fromUnknown(node);
    }
    visitCallExpression(node, context) {
        const lhs = this.visitExpression(node.expression, context);
        if (lhs instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, lhs);
        }
        // If the call refers to a builtin function, attempt to evaluate the function.
        if (lhs instanceof KnownFn) {
            return lhs.evaluate(node, this.evaluateFunctionArguments(node, context));
        }
        if (!(lhs instanceof Reference)) {
            return DynamicValue.fromInvalidExpressionType(node.expression, lhs);
        }
        const fn = this.host.getDefinitionOfFunction(lhs.node);
        if (fn === null) {
            return DynamicValue.fromInvalidExpressionType(node.expression, lhs);
        }
        if (!isFunctionOrMethodReference(lhs)) {
            return DynamicValue.fromInvalidExpressionType(node.expression, lhs);
        }
        const resolveFfrExpr = (expr) => {
            let contextExtension = {};
            // TODO(alxhub): the condition `fn.body === null` here is vestigial - we probably _do_ want to
            // change the context like this even for non-null function bodies. But, this is being
            // redesigned as a refactoring with no behavior changes so that should be done as a follow-up.
            if (fn.body === null &&
                expr.getSourceFile() !== node.expression.getSourceFile() &&
                lhs.bestGuessOwningModule !== null) {
                contextExtension = {
                    absoluteModuleName: lhs.bestGuessOwningModule.specifier,
                    resolutionContext: lhs.bestGuessOwningModule.resolutionContext,
                };
            }
            return this.visitFfrExpression(expr, { ...context, ...contextExtension });
        };
        // If the function is foreign (declared through a d.ts file), attempt to resolve it with the
        // foreignFunctionResolver, if one is specified.
        if (fn.body === null && context.foreignFunctionResolver !== undefined) {
            const unresolvable = DynamicValue.fromDynamicInput(node, DynamicValue.fromExternalReference(node.expression, lhs));
            return context.foreignFunctionResolver(lhs, node, resolveFfrExpr, unresolvable);
        }
        const res = this.visitFunctionBody(node, fn, context);
        // If the result of attempting to resolve the function body was a DynamicValue, attempt to use
        // the foreignFunctionResolver if one is present. This could still potentially yield a usable
        // value.
        if (res instanceof DynamicValue && context.foreignFunctionResolver !== undefined) {
            const unresolvable = DynamicValue.fromComplexFunctionCall(node, fn);
            return context.foreignFunctionResolver(lhs, node, resolveFfrExpr, unresolvable);
        }
        return res;
    }
    /**
     * Visit an expression which was ex   tracted from a foreign-function resolver.
     *
     * This will process the result and ensure it's correct for FFR-resolved values, including marking
     * `Reference`s as synthetic.
     */
    visitFfrExpression(expr, context) {
        const res = this.visitExpression(expr, context);
        if (res instanceof Reference) {
            // This Reference was created synthetically, via a foreign function resolver. The real
            // runtime value of the function expression may be different than the foreign function
            // resolved value, so mark the Reference as synthetic to avoid it being misinterpreted.
            res.synthetic = true;
        }
        return res;
    }
    visitFunctionBody(node, fn, context) {
        if (fn.body === null) {
            return DynamicValue.fromUnknown(node);
        }
        else if (fn.body.length !== 1 || !ts.isReturnStatement(fn.body[0])) {
            return DynamicValue.fromComplexFunctionCall(node, fn);
        }
        const ret = fn.body[0];
        const args = this.evaluateFunctionArguments(node, context);
        const newScope = new Map();
        const calleeContext = { ...context, scope: newScope };
        fn.parameters.forEach((param, index) => {
            let arg = args[index];
            if (param.node.dotDotDotToken !== undefined) {
                arg = args.slice(index);
            }
            if (arg === undefined && param.initializer !== null) {
                arg = this.visitExpression(param.initializer, calleeContext);
            }
            newScope.set(param.node, arg);
        });
        return ret.expression !== undefined
            ? this.visitExpression(ret.expression, calleeContext)
            : undefined;
    }
    visitConditionalExpression(node, context) {
        const condition = this.visitExpression(node.condition, context);
        if (condition instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, condition);
        }
        if (condition) {
            return this.visitExpression(node.whenTrue, context);
        }
        else {
            return this.visitExpression(node.whenFalse, context);
        }
    }
    visitPrefixUnaryExpression(node, context) {
        const operatorKind = node.operator;
        if (!UNARY_OPERATORS$2.has(operatorKind)) {
            return DynamicValue.fromUnsupportedSyntax(node);
        }
        const op = UNARY_OPERATORS$2.get(operatorKind);
        const value = this.visitExpression(node.operand, context);
        if (value instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, value);
        }
        else {
            return op(value);
        }
    }
    visitBinaryExpression(node, context) {
        const tokenKind = node.operatorToken.kind;
        if (!BINARY_OPERATORS$2.has(tokenKind)) {
            return DynamicValue.fromUnsupportedSyntax(node);
        }
        const opRecord = BINARY_OPERATORS$2.get(tokenKind);
        let lhs, rhs;
        if (opRecord.literal) {
            lhs = literal(this.visitExpression(node.left, context), (value) => DynamicValue.fromInvalidExpressionType(node.left, value));
            rhs = literal(this.visitExpression(node.right, context), (value) => DynamicValue.fromInvalidExpressionType(node.right, value));
        }
        else {
            lhs = this.visitExpression(node.left, context);
            rhs = this.visitExpression(node.right, context);
        }
        if (lhs instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, lhs);
        }
        else if (rhs instanceof DynamicValue) {
            return DynamicValue.fromDynamicInput(node, rhs);
        }
        else {
            return opRecord.op(lhs, rhs);
        }
    }
    visitParenthesizedExpression(node, context) {
        return this.visitExpression(node.expression, context);
    }
    evaluateFunctionArguments(node, context) {
        const args = [];
        for (const arg of node.arguments) {
            if (ts.isSpreadElement(arg)) {
                args.push(...this.visitSpreadElement(arg, context));
            }
            else {
                args.push(this.visitExpression(arg, context));
            }
        }
        return args;
    }
    visitSpreadElement(node, context) {
        const spread = this.visitExpression(node.expression, context);
        if (spread instanceof DynamicValue) {
            return [DynamicValue.fromDynamicInput(node, spread)];
        }
        else if (!Array.isArray(spread)) {
            return [DynamicValue.fromInvalidExpressionType(node, spread)];
        }
        else {
            return spread;
        }
    }
    visitBindingElement(node, context) {
        const path = [];
        let closestDeclaration = node;
        while (ts.isBindingElement(closestDeclaration) ||
            ts.isArrayBindingPattern(closestDeclaration) ||
            ts.isObjectBindingPattern(closestDeclaration)) {
            if (ts.isBindingElement(closestDeclaration)) {
                path.unshift(closestDeclaration);
            }
            closestDeclaration = closestDeclaration.parent;
        }
        if (!ts.isVariableDeclaration(closestDeclaration) ||
            closestDeclaration.initializer === undefined) {
            return DynamicValue.fromUnknown(node);
        }
        let value = this.visit(closestDeclaration.initializer, context);
        for (const element of path) {
            let key;
            if (ts.isArrayBindingPattern(element.parent)) {
                key = element.parent.elements.indexOf(element);
            }
            else {
                const name = element.propertyName || element.name;
                if (ts.isIdentifier(name)) {
                    key = name.text;
                }
                else {
                    return DynamicValue.fromUnknown(element);
                }
            }
            value = this.accessHelper(element, value, key, context);
            if (value instanceof DynamicValue) {
                return value;
            }
        }
        return value;
    }
    stringNameFromPropertyName(node, context) {
        if (ts.isIdentifier(node) || ts.isStringLiteral(node) || ts.isNumericLiteral(node)) {
            return node.text;
        }
        else if (ts.isComputedPropertyName(node)) {
            const literal = this.visitExpression(node.expression, context);
            return typeof literal === 'string' ? literal : undefined;
        }
        else {
            return undefined;
        }
    }
    getReference(node, context) {
        return new Reference(node, owningModule(context));
    }
    visitType(node, context) {
        if (ts.isLiteralTypeNode(node)) {
            return this.visitExpression(node.literal, context);
        }
        else if (ts.isTupleTypeNode(node)) {
            return this.visitTupleType(node, context);
        }
        else if (ts.isNamedTupleMember(node)) {
            return this.visitType(node.type, context);
        }
        else if (ts.isTypeOperatorNode(node) && node.operator === ts.SyntaxKind.ReadonlyKeyword) {
            return this.visitType(node.type, context);
        }
        else if (ts.isTypeQueryNode(node)) {
            return this.visitTypeQuery(node, context);
        }
        return DynamicValue.fromDynamicType(node);
    }
    visitTupleType(node, context) {
        const res = [];
        for (const elem of node.elements) {
            res.push(this.visitType(elem, context));
        }
        return res;
    }
    visitTypeQuery(node, context) {
        if (!ts.isIdentifier(node.exprName)) {
            return DynamicValue.fromUnknown(node);
        }
        const decl = this.host.getDeclarationOfIdentifier(node.exprName);
        if (decl === null) {
            return DynamicValue.fromUnknownIdentifier(node.exprName);
        }
        const declContext = { ...context, ...joinModuleContext(context, node, decl) };
        return this.visitDeclaration(decl.node, declContext);
    }
}
function isFunctionOrMethodReference(ref) {
    return (ts.isFunctionDeclaration(ref.node) ||
        ts.isMethodDeclaration(ref.node) ||
        ts.isFunctionExpression(ref.node));
}
function literal(value, reject) {
    if (value instanceof EnumValue) {
        value = value.resolved;
    }
    if (value instanceof DynamicValue ||
        value === null ||
        value === undefined ||
        typeof value === 'string' ||
        typeof value === 'number' ||
        typeof value === 'boolean') {
        return value;
    }
    return reject(value);
}
function isVariableDeclarationDeclared(node) {
    if (node.parent === undefined || !ts.isVariableDeclarationList(node.parent)) {
        return false;
    }
    const declList = node.parent;
    if (declList.parent === undefined || !ts.isVariableStatement(declList.parent)) {
        return false;
    }
    const varStmt = declList.parent;
    const modifiers = ts.getModifiers(varStmt);
    return (modifiers !== undefined && modifiers.some((mod) => mod.kind === ts.SyntaxKind.DeclareKeyword));
}
const EMPTY = {};
function joinModuleContext(existing, node, decl) {
    if (typeof decl.viaModule === 'string' && decl.viaModule !== existing.absoluteModuleName) {
        return {
            absoluteModuleName: decl.viaModule,
            resolutionContext: node.getSourceFile().fileName,
        };
    }
    else {
        return EMPTY;
    }
}
function owningModule(context, override = null) {
    let specifier = context.absoluteModuleName;
    if (override !== null) {
        specifier = override.specifier;
    }
    if (specifier !== null) {
        return {
            specifier,
            resolutionContext: context.resolutionContext,
        };
    }
    else {
        return null;
    }
}

/**
 * Specifies the compilation mode that is used for the compilation.
 */
exports.CompilationMode = void 0;
(function (CompilationMode) {
    /**
     * Generates fully AOT compiled code using Ivy instructions.
     */
    CompilationMode[CompilationMode["FULL"] = 0] = "FULL";
    /**
     * Generates code using a stable, but intermediate format suitable to be published to NPM.
     */
    CompilationMode[CompilationMode["PARTIAL"] = 1] = "PARTIAL";
    /**
     * Generates code based on each individual source file without using its
     * dependencies (suitable for local dev edit/refresh workflow).
     */
    CompilationMode[CompilationMode["LOCAL"] = 2] = "LOCAL";
})(exports.CompilationMode || (exports.CompilationMode = {}));
exports.HandlerPrecedence = void 0;
(function (HandlerPrecedence) {
    /**
     * Handler with PRIMARY precedence cannot overlap - there can only be one on a given class.
     *
     * If more than one PRIMARY handler matches a class, an error is produced.
     */
    HandlerPrecedence[HandlerPrecedence["PRIMARY"] = 0] = "PRIMARY";
    /**
     * Handlers with SHARED precedence can match any class, possibly in addition to a single PRIMARY
     * handler.
     *
     * It is not an error for a class to have any number of SHARED handlers.
     */
    HandlerPrecedence[HandlerPrecedence["SHARED"] = 1] = "SHARED";
    /**
     * Handlers with WEAK precedence that match a class are ignored if any handlers with stronger
     * precedence match a class.
     */
    HandlerPrecedence[HandlerPrecedence["WEAK"] = 2] = "WEAK";
})(exports.HandlerPrecedence || (exports.HandlerPrecedence = {}));

/**
 * A phase of compilation for which time is tracked in a distinct bucket.
 */
exports.PerfPhase = void 0;
(function (PerfPhase) {
    /**
     * The "default" phase which tracks time not spent in any other phase.
     */
    PerfPhase[PerfPhase["Unaccounted"] = 0] = "Unaccounted";
    /**
     * Time spent setting up the compiler, before a TypeScript program is created.
     *
     * This includes operations like configuring the `ts.CompilerHost` and any wrappers.
     */
    PerfPhase[PerfPhase["Setup"] = 1] = "Setup";
    /**
     * Time spent in `ts.createProgram`, including reading and parsing `ts.SourceFile`s in the
     * `ts.CompilerHost`.
     *
     * This might be an incremental program creation operation.
     */
    PerfPhase[PerfPhase["TypeScriptProgramCreate"] = 2] = "TypeScriptProgramCreate";
    /**
     * Time spent reconciling the contents of an old `ts.Program` with the new incremental one.
     *
     * Only present in incremental compilations.
     */
    PerfPhase[PerfPhase["Reconciliation"] = 3] = "Reconciliation";
    /**
     * Time spent updating an `NgCompiler` instance with a resource-only change.
     *
     * Only present in incremental compilations where the change was resource-only.
     */
    PerfPhase[PerfPhase["ResourceUpdate"] = 4] = "ResourceUpdate";
    /**
     * Time spent calculating the plain TypeScript diagnostics (structural and semantic).
     */
    PerfPhase[PerfPhase["TypeScriptDiagnostics"] = 5] = "TypeScriptDiagnostics";
    /**
     * Time spent in Angular analysis of individual classes in the program.
     */
    PerfPhase[PerfPhase["Analysis"] = 6] = "Analysis";
    /**
     * Time spent in Angular global analysis (synthesis of analysis information into a complete
     * understanding of the program).
     */
    PerfPhase[PerfPhase["Resolve"] = 7] = "Resolve";
    /**
     * Time spent building the import graph of the program in order to perform cycle detection.
     */
    PerfPhase[PerfPhase["CycleDetection"] = 8] = "CycleDetection";
    /**
     * Time spent generating the text of Type Check Blocks in order to perform template type checking.
     */
    PerfPhase[PerfPhase["TcbGeneration"] = 9] = "TcbGeneration";
    /**
     * Time spent updating the `ts.Program` with new Type Check Block code.
     */
    PerfPhase[PerfPhase["TcbUpdateProgram"] = 10] = "TcbUpdateProgram";
    /**
     * Time spent by TypeScript performing its emit operations, including downleveling and writing
     * output files.
     */
    PerfPhase[PerfPhase["TypeScriptEmit"] = 11] = "TypeScriptEmit";
    /**
     * Time spent by Angular performing code transformations of ASTs as they're about to be emitted.
     *
     * This includes the actual code generation step for templates, and occurs during the emit phase
     * (but is tracked separately from `TypeScriptEmit` time).
     */
    PerfPhase[PerfPhase["Compile"] = 12] = "Compile";
    /**
     * Time spent performing a `TemplateTypeChecker` autocompletion operation.
     */
    PerfPhase[PerfPhase["TtcAutocompletion"] = 13] = "TtcAutocompletion";
    /**
     * Time spent computing template type-checking diagnostics.
     */
    PerfPhase[PerfPhase["TtcDiagnostics"] = 14] = "TtcDiagnostics";
    /**
     * Time spent getting a `Symbol` from the `TemplateTypeChecker`.
     */
    PerfPhase[PerfPhase["TtcSymbol"] = 15] = "TtcSymbol";
    /**
     * Time spent by the Angular Language Service calculating a "get references" or a renaming
     * operation.
     */
    PerfPhase[PerfPhase["LsReferencesAndRenames"] = 16] = "LsReferencesAndRenames";
    /**
     * Time spent by the Angular Language Service calculating a "quick info" operation.
     */
    PerfPhase[PerfPhase["LsQuickInfo"] = 17] = "LsQuickInfo";
    /**
     * Time spent by the Angular Language Service calculating a "get type definition" or "get
     * definition" operation.
     */
    PerfPhase[PerfPhase["LsDefinition"] = 18] = "LsDefinition";
    /**
     * Time spent by the Angular Language Service calculating a "get completions" (AKA autocomplete)
     * operation.
     */
    PerfPhase[PerfPhase["LsCompletions"] = 19] = "LsCompletions";
    /**
     * Time spent by the Angular Language Service calculating a "view template typecheck block"
     * operation.
     */
    PerfPhase[PerfPhase["LsTcb"] = 20] = "LsTcb";
    /**
     * Time spent by the Angular Language Service calculating diagnostics.
     */
    PerfPhase[PerfPhase["LsDiagnostics"] = 21] = "LsDiagnostics";
    /**
     * Time spent by the Angular Language Service calculating a "get component locations for template"
     * operation.
     */
    PerfPhase[PerfPhase["LsComponentLocations"] = 22] = "LsComponentLocations";
    /**
     * Time spent by the Angular Language Service calculating signature help.
     */
    PerfPhase[PerfPhase["LsSignatureHelp"] = 23] = "LsSignatureHelp";
    /**
     * Time spent by the Angular Language Service calculating outlining spans.
     */
    PerfPhase[PerfPhase["OutliningSpans"] = 24] = "OutliningSpans";
    /**
     * Tracks the number of `PerfPhase`s, and must appear at the end of the list.
     */
    PerfPhase[PerfPhase["LAST"] = 25] = "LAST";
    /**
     * Time spent by the Angular Language Service calculating code fixes.
     */
    PerfPhase[PerfPhase["LsCodeFixes"] = 26] = "LsCodeFixes";
    /**
     * Time spent by the Angular Language Service to fix all detected same type errors.
     */
    PerfPhase[PerfPhase["LsCodeFixesAll"] = 27] = "LsCodeFixesAll";
    /**
     * Time spent computing possible Angular refactorings.
     */
    PerfPhase[PerfPhase["LSComputeApplicableRefactorings"] = 28] = "LSComputeApplicableRefactorings";
    /**
     * Time spent computing changes for applying a given refactoring.
     */
    PerfPhase[PerfPhase["LSApplyRefactoring"] = 29] = "LSApplyRefactoring";
})(exports.PerfPhase || (exports.PerfPhase = {}));
/**
 * Represents some occurrence during compilation, and is tracked with a counter.
 */
exports.PerfEvent = void 0;
(function (PerfEvent) {
    /**
     * Counts the number of `.d.ts` files in the program.
     */
    PerfEvent[PerfEvent["InputDtsFile"] = 0] = "InputDtsFile";
    /**
     * Counts the number of non-`.d.ts` files in the program.
     */
    PerfEvent[PerfEvent["InputTsFile"] = 1] = "InputTsFile";
    /**
     * An `@Component` class was analyzed.
     */
    PerfEvent[PerfEvent["AnalyzeComponent"] = 2] = "AnalyzeComponent";
    /**
     * An `@Directive` class was analyzed.
     */
    PerfEvent[PerfEvent["AnalyzeDirective"] = 3] = "AnalyzeDirective";
    /**
     * An `@Injectable` class was analyzed.
     */
    PerfEvent[PerfEvent["AnalyzeInjectable"] = 4] = "AnalyzeInjectable";
    /**
     * An `@NgModule` class was analyzed.
     */
    PerfEvent[PerfEvent["AnalyzeNgModule"] = 5] = "AnalyzeNgModule";
    /**
     * An `@Pipe` class was analyzed.
     */
    PerfEvent[PerfEvent["AnalyzePipe"] = 6] = "AnalyzePipe";
    /**
     * A trait was analyzed.
     *
     * In theory, this should be the sum of the `Analyze` counters for each decorator type.
     */
    PerfEvent[PerfEvent["TraitAnalyze"] = 7] = "TraitAnalyze";
    /**
     * A trait had a prior analysis available from an incremental program, and did not need to be
     * re-analyzed.
     */
    PerfEvent[PerfEvent["TraitReuseAnalysis"] = 8] = "TraitReuseAnalysis";
    /**
     * A `ts.SourceFile` directly changed between the prior program and a new incremental compilation.
     */
    PerfEvent[PerfEvent["SourceFilePhysicalChange"] = 9] = "SourceFilePhysicalChange";
    /**
     * A `ts.SourceFile` did not physically changed, but according to the file dependency graph, has
     * logically changed between the prior program and a new incremental compilation.
     */
    PerfEvent[PerfEvent["SourceFileLogicalChange"] = 10] = "SourceFileLogicalChange";
    /**
     * A `ts.SourceFile` has not logically changed and all of its analysis results were thus available
     * for reuse.
     */
    PerfEvent[PerfEvent["SourceFileReuseAnalysis"] = 11] = "SourceFileReuseAnalysis";
    /**
     * A Type Check Block (TCB) was generated.
     */
    PerfEvent[PerfEvent["GenerateTcb"] = 12] = "GenerateTcb";
    /**
     * A Type Check Block (TCB) could not be generated because inlining was disabled, and the block
     * would've required inlining.
     */
    PerfEvent[PerfEvent["SkipGenerateTcbNoInline"] = 13] = "SkipGenerateTcbNoInline";
    /**
     * A `.ngtypecheck.ts` file could be reused from the previous program and did not need to be
     * regenerated.
     */
    PerfEvent[PerfEvent["ReuseTypeCheckFile"] = 14] = "ReuseTypeCheckFile";
    /**
     * The template type-checking program required changes and had to be updated in an incremental
     * step.
     */
    PerfEvent[PerfEvent["UpdateTypeCheckProgram"] = 15] = "UpdateTypeCheckProgram";
    /**
     * The compiler was able to prove that a `ts.SourceFile` did not need to be re-emitted.
     */
    PerfEvent[PerfEvent["EmitSkipSourceFile"] = 16] = "EmitSkipSourceFile";
    /**
     * A `ts.SourceFile` was emitted.
     */
    PerfEvent[PerfEvent["EmitSourceFile"] = 17] = "EmitSourceFile";
    /**
     * Tracks the number of `PrefEvent`s, and must appear at the end of the list.
     */
    PerfEvent[PerfEvent["LAST"] = 18] = "LAST";
})(exports.PerfEvent || (exports.PerfEvent = {}));
/**
 * Represents a checkpoint during compilation at which the memory usage of the compiler should be
 * recorded.
 */
exports.PerfCheckpoint = void 0;
(function (PerfCheckpoint) {
    /**
     * The point at which the `PerfRecorder` was created, and ideally tracks memory used before any
     * compilation structures are created.
     */
    PerfCheckpoint[PerfCheckpoint["Initial"] = 0] = "Initial";
    /**
     * The point just after the `ts.Program` has been created.
     */
    PerfCheckpoint[PerfCheckpoint["TypeScriptProgramCreate"] = 1] = "TypeScriptProgramCreate";
    /**
     * The point just before Angular analysis starts.
     *
     * In the main usage pattern for the compiler, TypeScript diagnostics have been calculated at this
     * point, so the `ts.TypeChecker` has fully ingested the current program, all `ts.Type` structures
     * and `ts.Symbol`s have been created.
     */
    PerfCheckpoint[PerfCheckpoint["PreAnalysis"] = 2] = "PreAnalysis";
    /**
     * The point just after Angular analysis completes.
     */
    PerfCheckpoint[PerfCheckpoint["Analysis"] = 3] = "Analysis";
    /**
     * The point just after Angular resolution is complete.
     */
    PerfCheckpoint[PerfCheckpoint["Resolve"] = 4] = "Resolve";
    /**
     * The point just after Type Check Blocks (TCBs) have been generated.
     */
    PerfCheckpoint[PerfCheckpoint["TtcGeneration"] = 5] = "TtcGeneration";
    /**
     * The point just after the template type-checking program has been updated with any new TCBs.
     */
    PerfCheckpoint[PerfCheckpoint["TtcUpdateProgram"] = 6] = "TtcUpdateProgram";
    /**
     * The point just before emit begins.
     *
     * In the main usage pattern for the compiler, all template type-checking diagnostics have been
     * requested at this point.
     */
    PerfCheckpoint[PerfCheckpoint["PreEmit"] = 7] = "PreEmit";
    /**
     * The point just after the program has been fully emitted.
     */
    PerfCheckpoint[PerfCheckpoint["Emit"] = 8] = "Emit";
    /**
     * Tracks the number of `PerfCheckpoint`s, and must appear at the end of the list.
     */
    PerfCheckpoint[PerfCheckpoint["LAST"] = 9] = "LAST";
})(exports.PerfCheckpoint || (exports.PerfCheckpoint = {}));

exports.TraitState = void 0;
(function (TraitState) {
    /**
     * Pending traits are freshly created and have never been analyzed.
     */
    TraitState[TraitState["Pending"] = 0] = "Pending";
    /**
     * Analyzed traits have successfully been analyzed, but are pending resolution.
     */
    TraitState[TraitState["Analyzed"] = 1] = "Analyzed";
    /**
     * Resolved traits have successfully been analyzed and resolved and are ready for compilation.
     */
    TraitState[TraitState["Resolved"] = 2] = "Resolved";
    /**
     * Skipped traits are no longer considered for compilation.
     */
    TraitState[TraitState["Skipped"] = 3] = "Skipped";
})(exports.TraitState || (exports.TraitState = {}));
/**
 * The value side of `Trait` exposes a helper to create a `Trait` in a pending state (by delegating
 * to `TraitImpl`).
 */
const Trait = {
    pending: (handler, detected) => TraitImpl.pending(handler, detected),
};
/**
 * An implementation of the `Trait` type which transitions safely between the various
 * `TraitState`s.
 */
class TraitImpl {
    state = exports.TraitState.Pending;
    handler;
    detected;
    analysis = null;
    symbol = null;
    resolution = null;
    analysisDiagnostics = null;
    resolveDiagnostics = null;
    typeCheckDiagnostics = null;
    constructor(handler, detected) {
        this.handler = handler;
        this.detected = detected;
    }
    toAnalyzed(analysis, diagnostics, symbol) {
        // Only pending traits can be analyzed.
        this.assertTransitionLegal(exports.TraitState.Pending, exports.TraitState.Analyzed);
        this.analysis = analysis;
        this.analysisDiagnostics = diagnostics;
        this.symbol = symbol;
        this.state = exports.TraitState.Analyzed;
        return this;
    }
    toResolved(resolution, diagnostics) {
        // Only analyzed traits can be resolved.
        this.assertTransitionLegal(exports.TraitState.Analyzed, exports.TraitState.Resolved);
        if (this.analysis === null) {
            throw new Error(`Cannot transition an Analyzed trait with a null analysis to Resolved`);
        }
        this.resolution = resolution;
        this.state = exports.TraitState.Resolved;
        this.resolveDiagnostics = diagnostics;
        this.typeCheckDiagnostics = null;
        return this;
    }
    toSkipped() {
        // Only pending traits can be skipped.
        this.assertTransitionLegal(exports.TraitState.Pending, exports.TraitState.Skipped);
        this.state = exports.TraitState.Skipped;
        return this;
    }
    /**
     * Verifies that the trait is currently in one of the `allowedState`s.
     *
     * If correctly used, the `Trait` type and transition methods prevent illegal transitions from
     * occurring. However, if a reference to the `TraitImpl` instance typed with the previous
     * interface is retained after calling one of its transition methods, it will allow for illegal
     * transitions to take place. Hence, this assertion provides a little extra runtime protection.
     */
    assertTransitionLegal(allowedState, transitionTo) {
        if (!(this.state === allowedState)) {
            throw new Error(`Assertion failure: cannot transition from ${exports.TraitState[this.state]} to ${exports.TraitState[transitionTo]}.`);
        }
    }
    /**
     * Construct a new `TraitImpl` in the pending state.
     */
    static pending(handler, detected) {
        return new TraitImpl(handler, detected);
    }
}

/**
 * The current context of a translator visitor as it traverses the AST tree.
 *
 * It tracks whether we are in the process of outputting a statement or an expression.
 */
let Context$1 = class Context {
    isStatement;
    constructor(isStatement) {
        this.isStatement = isStatement;
    }
    get withExpressionMode() {
        return this.isStatement ? new Context(false) : this;
    }
    get withStatementMode() {
        return !this.isStatement ? new Context(true) : this;
    }
};

/**
 * Generates a helper for `ImportManagerConfig` to generate unique identifiers
 * for a given source file.
 */
function createGenerateUniqueIdentifierHelper() {
    const generatedIdentifiers = new Set();
    const isGeneratedIdentifier = (sf, identifierName) => generatedIdentifiers.has(`${sf.fileName}@@${identifierName}`);
    const markIdentifierAsGenerated = (sf, identifierName) => generatedIdentifiers.add(`${sf.fileName}@@${identifierName}`);
    return (sourceFile, symbolName) => {
        const sf = sourceFile;
        if (sf.identifiers === undefined) {
            throw new Error('Source file unexpectedly lacks map of parsed `identifiers`.');
        }
        const isUniqueIdentifier = (name) => !sf.identifiers.has(name) && !isGeneratedIdentifier(sf, name);
        if (isUniqueIdentifier(symbolName)) {
            markIdentifierAsGenerated(sf, symbolName);
            return null;
        }
        let name = null;
        let counter = 1;
        do {
            name = `${symbolName}_${counter++}`;
        } while (!isUniqueIdentifier(name));
        markIdentifierAsGenerated(sf, name);
        return ts.factory.createUniqueName(name, ts.GeneratedIdentifierFlags.Optimistic);
    };
}

/**
 * Creates a TypeScript transform for the given import manager.
 *
 *  - The transform updates existing imports with new symbols to be added.
 *  - The transform adds new necessary imports.
 *  - The transform inserts additional optional statements after imports.
 *  - The transform deletes any nodes that are marked for deletion by the manager.
 */
function createTsTransformForImportManager(manager, extraStatementsForFiles) {
    return (ctx) => {
        const { affectedFiles, newImports, updatedImports, reusedOriginalAliasDeclarations, deletedImports, } = manager.finalize();
        // If we re-used existing source file alias declarations, mark those as referenced so TypeScript
        // doesn't drop these thinking they are unused.
        if (reusedOriginalAliasDeclarations.size > 0) {
            const referencedAliasDeclarations = loadIsReferencedAliasDeclarationPatch(ctx);
            if (referencedAliasDeclarations !== null) {
                reusedOriginalAliasDeclarations.forEach((aliasDecl) => referencedAliasDeclarations.add(aliasDecl));
            }
        }
        // Update the set of affected files to include files that need extra statements to be inserted.
        if (extraStatementsForFiles !== undefined) {
            for (const [fileName, statements] of extraStatementsForFiles.entries()) {
                if (statements.length > 0) {
                    affectedFiles.add(fileName);
                }
            }
        }
        const visitStatement = (node) => {
            if (!ts.isImportDeclaration(node)) {
                return node;
            }
            if (deletedImports.has(node)) {
                return undefined;
            }
            if (node.importClause === undefined || !ts.isImportClause(node.importClause)) {
                return node;
            }
            const clause = node.importClause;
            if (clause.namedBindings === undefined ||
                !ts.isNamedImports(clause.namedBindings) ||
                !updatedImports.has(clause.namedBindings)) {
                return node;
            }
            const newClause = ctx.factory.updateImportClause(clause, clause.isTypeOnly, clause.name, updatedImports.get(clause.namedBindings));
            const newImport = ctx.factory.updateImportDeclaration(node, node.modifiers, newClause, node.moduleSpecifier, node.attributes);
            // This tricks TypeScript into thinking that the `importClause` is still optimizable.
            // By default, TS assumes, no specifiers are elide-able if the clause of the "original
            // node" has changed. google3:
            // typescript/unstable/src/compiler/transformers/ts.ts;l=456;rcl=611254538.
            ts.setOriginalNode(newImport, {
                importClause: newClause,
                kind: newImport.kind,
            });
            return newImport;
        };
        return (sourceFile) => {
            if (!affectedFiles.has(sourceFile.fileName)) {
                return sourceFile;
            }
            sourceFile = ts.visitEachChild(sourceFile, visitStatement, ctx);
            // Filter out the existing imports and the source file body.
            // All new statements will be inserted between them.
            const extraStatements = extraStatementsForFiles?.get(sourceFile.fileName) ?? [];
            const existingImports = [];
            const body = [];
            for (const statement of sourceFile.statements) {
                if (isImportStatement(statement)) {
                    existingImports.push(statement);
                }
                else {
                    body.push(statement);
                }
            }
            return ctx.factory.updateSourceFile(sourceFile, [
                ...existingImports,
                ...(newImports.get(sourceFile.fileName) ?? []),
                ...extraStatements,
                ...body,
            ], sourceFile.isDeclarationFile, sourceFile.referencedFiles, sourceFile.typeReferenceDirectives, sourceFile.hasNoDefaultLib, sourceFile.libReferenceDirectives);
        };
    };
}
/** Whether the given statement is an import statement. */
function isImportStatement(stmt) {
    return (ts.isImportDeclaration(stmt) || ts.isImportEqualsDeclaration(stmt) || ts.isNamespaceImport(stmt));
}

/** Attempts to efficiently re-use previous generated import requests. */
function attemptToReuseGeneratedImports(tracker, request) {
    const requestHash = hashImportRequest(request);
    // In case the given import has been already generated previously, we just return
    // the previous generated identifier in order to avoid duplicate generated imports.
    const existingExactImport = tracker.directReuseCache.get(requestHash);
    if (existingExactImport !== undefined) {
        return existingExactImport;
    }
    const potentialNamespaceImport = tracker.namespaceImportReuseCache.get(request.exportModuleSpecifier);
    if (potentialNamespaceImport === undefined) {
        return null;
    }
    if (request.exportSymbolName === null) {
        return potentialNamespaceImport;
    }
    return [potentialNamespaceImport, ts.factory.createIdentifier(request.exportSymbolName)];
}
/** Captures the given import request and its generated reference node/path for future re-use. */
function captureGeneratedImport(request, tracker, referenceNode) {
    tracker.directReuseCache.set(hashImportRequest(request), referenceNode);
    if (request.exportSymbolName === null && !Array.isArray(referenceNode)) {
        tracker.namespaceImportReuseCache.set(request.exportModuleSpecifier, referenceNode);
    }
}
/** Generates a unique hash for the given import request. */
function hashImportRequest(req) {
    return `${req.requestedFile.fileName}:${req.exportModuleSpecifier}:${req.exportSymbolName}${req.unsafeAliasOverride ? ':' + req.unsafeAliasOverride : ''}`;
}

/** Attempts to re-use original source file imports for the given request. */
function attemptToReuseExistingSourceFileImports(tracker, sourceFile, request) {
    // Walk through all source-file top-level statements and search for import declarations
    // that already match the specified "moduleName" and can be updated to import the
    // given symbol. If no matching import can be found, the last import in the source-file
    // will be used as starting point for a new import that will be generated.
    let candidateImportToBeUpdated = null;
    for (let i = sourceFile.statements.length - 1; i >= 0; i--) {
        const statement = sourceFile.statements[i];
        if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {
            continue;
        }
        // Side-effect imports are ignored, or type-only imports.
        // TODO: Consider re-using type-only imports efficiently.
        if (!statement.importClause || statement.importClause.isTypeOnly) {
            continue;
        }
        const moduleSpecifier = statement.moduleSpecifier.text;
        // If the import does not match the module name, or requested target file, continue.
        // Note: In the future, we may consider performing better analysis here. E.g. resolve paths,
        // or try to detect re-usable symbols via type-checking.
        if (moduleSpecifier !== request.exportModuleSpecifier) {
            continue;
        }
        if (statement.importClause.namedBindings) {
            const namedBindings = statement.importClause.namedBindings;
            // A namespace import can be reused.
            if (ts.isNamespaceImport(namedBindings)) {
                tracker.reusedAliasDeclarations.add(namedBindings);
                if (request.exportSymbolName === null) {
                    return namedBindings.name;
                }
                return [namedBindings.name, ts.factory.createIdentifier(request.exportSymbolName)];
            }
            // Named imports can be re-used if a specific symbol is requested.
            if (ts.isNamedImports(namedBindings) && request.exportSymbolName !== null) {
                const existingElement = namedBindings.elements.find((e) => {
                    // TODO: Consider re-using type-only imports efficiently.
                    let nameMatches;
                    if (request.unsafeAliasOverride) {
                        // If a specific alias is passed, both the original name and alias have to match.
                        nameMatches =
                            e.propertyName?.text === request.exportSymbolName &&
                                e.name.text === request.unsafeAliasOverride;
                    }
                    else {
                        nameMatches = e.propertyName
                            ? e.propertyName.text === request.exportSymbolName
                            : e.name.text === request.exportSymbolName;
                    }
                    return !e.isTypeOnly && nameMatches;
                });
                if (existingElement !== undefined) {
                    tracker.reusedAliasDeclarations.add(existingElement);
                    return existingElement.name;
                }
                // In case the symbol could not be found in an existing import, we
                // keep track of the import declaration as it can be updated to include
                // the specified symbol name without having to create a new import.
                candidateImportToBeUpdated = statement;
            }
        }
    }
    if (candidateImportToBeUpdated === null || request.exportSymbolName === null) {
        return null;
    }
    // We have a candidate import. Update it to import what we need.
    if (!tracker.updatedImports.has(candidateImportToBeUpdated)) {
        tracker.updatedImports.set(candidateImportToBeUpdated, []);
    }
    const symbolsToBeImported = tracker.updatedImports.get(candidateImportToBeUpdated);
    const propertyName = ts.factory.createIdentifier(request.exportSymbolName);
    const fileUniqueAlias = request.unsafeAliasOverride
        ? ts.factory.createIdentifier(request.unsafeAliasOverride)
        : tracker.generateUniqueIdentifier(sourceFile, request.exportSymbolName);
    // Since it can happen that multiple classes need to be imported within the
    // specified source file and we want to add the identifiers to the existing
    // import declaration, we need to keep track of the updated import declarations.
    // We can't directly update the import declaration for each identifier as this
    // would not be reflected in the AST— or would throw of update recording offsets.
    symbolsToBeImported.push({
        propertyName,
        fileUniqueAlias,
    });
    return fileUniqueAlias ?? propertyName;
}

/**
 * Preset configuration for forcing namespace imports.
 *
 * This preset is commonly used to avoid test differences to previous
 * versions of the `ImportManager`.
 */
const presetImportManagerForceNamespaceImports = {
    // Forcing namespace imports also means no-reuse.
    // Re-using would otherwise become more complicated and we don't
    // expect re-usable namespace imports.
    disableOriginalSourceFileReuse: true,
    forceGenerateNamespacesForNewImports: true,
};
/**
 * Import manager that can be used to conveniently and efficiently generate
 * imports It efficiently re-uses existing source file imports, or previous
 * generated imports.
 *
 * These capabilities are important for efficient TypeScript transforms that
 * minimize structural changes to the dependency graph of source files, enabling
 * as much incremental re-use as possible.
 *
 * Those imports may be inserted via a TypeScript transform, or via manual string
 * manipulation using e.g. `magic-string`.
 */
class ImportManager {
    /** List of new imports that will be inserted into given source files. */
    newImports = new Map();
    /**
     * Keeps track of imports marked for removal. The root-level key is the file from which the
     * import should be removed, the inner map key is the name of the module from which the symbol
     * is being imported. The value of the inner map is a set of symbol names that should be removed.
     * Note! the inner map tracks the original names of the imported symbols, not their local aliases.
     */
    removedImports = new Map();
    nextUniqueIndex = 0;
    config;
    reuseSourceFileImportsTracker;
    reuseGeneratedImportsTracker = {
        directReuseCache: new Map(),
        namespaceImportReuseCache: new Map(),
    };
    constructor(config = {}) {
        this.config = {
            shouldUseSingleQuotes: config.shouldUseSingleQuotes ?? (() => false),
            rewriter: config.rewriter ?? null,
            disableOriginalSourceFileReuse: config.disableOriginalSourceFileReuse ?? false,
            forceGenerateNamespacesForNewImports: config.forceGenerateNamespacesForNewImports ?? false,
            namespaceImportPrefix: config.namespaceImportPrefix ?? 'i',
            generateUniqueIdentifier: config.generateUniqueIdentifier ?? createGenerateUniqueIdentifierHelper(),
        };
        this.reuseSourceFileImportsTracker = {
            generateUniqueIdentifier: this.config.generateUniqueIdentifier,
            reusedAliasDeclarations: new Set(),
            updatedImports: new Map(),
        };
    }
    /** Adds a side-effect import for the given module. */
    addSideEffectImport(requestedFile, moduleSpecifier) {
        if (this.config.rewriter !== null) {
            moduleSpecifier = this.config.rewriter.rewriteSpecifier(moduleSpecifier, requestedFile.fileName);
        }
        this._getNewImportsTrackerForFile(requestedFile).sideEffectImports.add(moduleSpecifier);
    }
    addImport(request) {
        if (this.config.rewriter !== null) {
            if (request.exportSymbolName !== null) {
                request.exportSymbolName = this.config.rewriter.rewriteSymbol(request.exportSymbolName, request.exportModuleSpecifier);
            }
            request.exportModuleSpecifier = this.config.rewriter.rewriteSpecifier(request.exportModuleSpecifier, request.requestedFile.fileName);
        }
        // Remove the newly-added import from the set of removed imports.
        if (request.exportSymbolName !== null && !request.asTypeReference) {
            this.removedImports
                .get(request.requestedFile)
                ?.get(request.exportModuleSpecifier)
                ?.delete(request.exportSymbolName);
        }
        // Attempt to re-use previous identical import requests.
        const previousGeneratedImportRef = attemptToReuseGeneratedImports(this.reuseGeneratedImportsTracker, request);
        if (previousGeneratedImportRef !== null) {
            return createImportReference(!!request.asTypeReference, previousGeneratedImportRef);
        }
        // Generate a new one, and cache it.
        const resultImportRef = this._generateNewImport(request);
        captureGeneratedImport(request, this.reuseGeneratedImportsTracker, resultImportRef);
        return createImportReference(!!request.asTypeReference, resultImportRef);
    }
    /**
     * Marks all imported symbols with a specific name for removal.
     * Call `addImport` to undo this operation.
     * @param requestedFile File from which to remove the imports.
     * @param exportSymbolName Declared name of the symbol being removed.
     * @param moduleSpecifier Module from which the symbol is being imported.
     */
    removeImport(requestedFile, exportSymbolName, moduleSpecifier) {
        let moduleMap = this.removedImports.get(requestedFile);
        if (!moduleMap) {
            moduleMap = new Map();
            this.removedImports.set(requestedFile, moduleMap);
        }
        let removedSymbols = moduleMap.get(moduleSpecifier);
        if (!removedSymbols) {
            removedSymbols = new Set();
            moduleMap.set(moduleSpecifier, removedSymbols);
        }
        removedSymbols.add(exportSymbolName);
    }
    _generateNewImport(request) {
        const { requestedFile: sourceFile } = request;
        const disableOriginalSourceFileReuse = this.config.disableOriginalSourceFileReuse;
        const forceGenerateNamespacesForNewImports = this.config.forceGenerateNamespacesForNewImports;
        // If desired, attempt to re-use original source file imports as a base, or as much as possible.
        // This may involve updates to existing import named bindings.
        if (!disableOriginalSourceFileReuse) {
            const reuseResult = attemptToReuseExistingSourceFileImports(this.reuseSourceFileImportsTracker, sourceFile, request);
            if (reuseResult !== null) {
                return reuseResult;
            }
        }
        // A new import needs to be generated.
        // No candidate existing import was found.
        const { namedImports, namespaceImports } = this._getNewImportsTrackerForFile(sourceFile);
        // If a namespace import is requested, or the symbol should be forcibly
        // imported through namespace imports:
        if (request.exportSymbolName === null || forceGenerateNamespacesForNewImports) {
            let namespaceImportName = `${this.config.namespaceImportPrefix}${this.nextUniqueIndex++}`;
            if (this.config.rewriter) {
                namespaceImportName = this.config.rewriter.rewriteNamespaceImportIdentifier(namespaceImportName, request.exportModuleSpecifier);
            }
            const namespaceImport = ts.factory.createNamespaceImport(this.config.generateUniqueIdentifier(sourceFile, namespaceImportName) ??
                ts.factory.createIdentifier(namespaceImportName));
            namespaceImports.set(request.exportModuleSpecifier, namespaceImport);
            // Capture the generated namespace import alone, to allow re-use.
            captureGeneratedImport({ ...request, exportSymbolName: null }, this.reuseGeneratedImportsTracker, namespaceImport.name);
            if (request.exportSymbolName !== null) {
                return [namespaceImport.name, ts.factory.createIdentifier(request.exportSymbolName)];
            }
            return namespaceImport.name;
        }
        // Otherwise, an individual named import is requested.
        if (!namedImports.has(request.exportModuleSpecifier)) {
            namedImports.set(request.exportModuleSpecifier, []);
        }
        const exportSymbolName = ts.factory.createIdentifier(request.exportSymbolName);
        const fileUniqueName = request.unsafeAliasOverride
            ? null
            : this.config.generateUniqueIdentifier(sourceFile, request.exportSymbolName);
        let needsAlias;
        let specifierName;
        if (request.unsafeAliasOverride) {
            needsAlias = true;
            specifierName = ts.factory.createIdentifier(request.unsafeAliasOverride);
        }
        else if (fileUniqueName !== null) {
            needsAlias = true;
            specifierName = fileUniqueName;
        }
        else {
            needsAlias = false;
            specifierName = exportSymbolName;
        }
        namedImports
            .get(request.exportModuleSpecifier)
            .push(ts.factory.createImportSpecifier(false, needsAlias ? exportSymbolName : undefined, specifierName));
        return specifierName;
    }
    /**
     * Finalizes the import manager by computing all necessary import changes
     * and returning them.
     *
     * Changes are collected once at the end, after all imports are requested,
     * because this simplifies building up changes to existing imports that need
     * to be updated, and allows more trivial re-use of previous generated imports.
     */
    finalize() {
        const affectedFiles = new Set();
        const updatedImportsResult = new Map();
        const newImportsResult = new Map();
        const deletedImports = new Set();
        const importDeclarationsPerFile = new Map();
        const addNewImport = (fileName, importDecl) => {
            affectedFiles.add(fileName);
            if (newImportsResult.has(fileName)) {
                newImportsResult.get(fileName).push(importDecl);
            }
            else {
                newImportsResult.set(fileName, [importDecl]);
            }
        };
        // Collect original source file imports that need to be updated.
        this.reuseSourceFileImportsTracker.updatedImports.forEach((expressions, importDecl) => {
            const sourceFile = importDecl.getSourceFile();
            const namedBindings = importDecl.importClause.namedBindings;
            const moduleName = importDecl.moduleSpecifier.text;
            const newElements = namedBindings.elements
                .concat(expressions.map(({ propertyName, fileUniqueAlias }) => ts.factory.createImportSpecifier(false, fileUniqueAlias !== null ? propertyName : undefined, fileUniqueAlias ?? propertyName)))
                .filter((specifier) => this._canAddSpecifier(sourceFile, moduleName, specifier));
            affectedFiles.add(sourceFile.fileName);
            if (newElements.length === 0) {
                deletedImports.add(importDecl);
            }
            else {
                updatedImportsResult.set(namedBindings, ts.factory.updateNamedImports(namedBindings, newElements));
            }
        });
        this.removedImports.forEach((removeMap, sourceFile) => {
            if (removeMap.size === 0) {
                return;
            }
            let allImports = importDeclarationsPerFile.get(sourceFile);
            if (!allImports) {
                allImports = sourceFile.statements.filter(ts.isImportDeclaration);
                importDeclarationsPerFile.set(sourceFile, allImports);
            }
            for (const node of allImports) {
                if (!node.importClause?.namedBindings ||
                    !ts.isNamedImports(node.importClause.namedBindings) ||
                    this.reuseSourceFileImportsTracker.updatedImports.has(node) ||
                    deletedImports.has(node)) {
                    continue;
                }
                const namedBindings = node.importClause.namedBindings;
                const moduleName = node.moduleSpecifier.text;
                const newImports = namedBindings.elements.filter((specifier) => this._canAddSpecifier(sourceFile, moduleName, specifier));
                if (newImports.length === 0) {
                    affectedFiles.add(sourceFile.fileName);
                    deletedImports.add(node);
                }
                else if (newImports.length !== namedBindings.elements.length) {
                    affectedFiles.add(sourceFile.fileName);
                    updatedImportsResult.set(namedBindings, ts.factory.updateNamedImports(namedBindings, newImports));
                }
            }
        });
        // Collect all new imports to be added. Named imports, namespace imports or side-effects.
        this.newImports.forEach(({ namedImports, namespaceImports, sideEffectImports }, sourceFile) => {
            const useSingleQuotes = this.config.shouldUseSingleQuotes(sourceFile);
            const fileName = sourceFile.fileName;
            sideEffectImports.forEach((moduleName) => {
                addNewImport(fileName, ts.factory.createImportDeclaration(undefined, undefined, ts.factory.createStringLiteral(moduleName)));
            });
            namespaceImports.forEach((namespaceImport, moduleName) => {
                const newImport = ts.factory.createImportDeclaration(undefined, ts.factory.createImportClause(false, undefined, namespaceImport), ts.factory.createStringLiteral(moduleName, useSingleQuotes));
                // IMPORTANT: Set the original TS node to the `ts.ImportDeclaration`. This allows
                // downstream transforms such as tsickle to properly process references to this import.
                //
                // This operation is load-bearing in g3 as some imported modules contain special metadata
                // generated by clutz, which tsickle uses to transform imports and references to those
                // imports. See: `google3: node_modules/tsickle/src/googmodule.ts;l=637-640;rcl=615418148`
                ts.setOriginalNode(namespaceImport.name, newImport);
                addNewImport(fileName, newImport);
            });
            namedImports.forEach((specifiers, moduleName) => {
                const filteredSpecifiers = specifiers.filter((specifier) => this._canAddSpecifier(sourceFile, moduleName, specifier));
                if (filteredSpecifiers.length > 0) {
                    const newImport = ts.factory.createImportDeclaration(undefined, ts.factory.createImportClause(false, undefined, ts.factory.createNamedImports(filteredSpecifiers)), ts.factory.createStringLiteral(moduleName, useSingleQuotes));
                    addNewImport(fileName, newImport);
                }
            });
        });
        return {
            affectedFiles,
            newImports: newImportsResult,
            updatedImports: updatedImportsResult,
            reusedOriginalAliasDeclarations: this.reuseSourceFileImportsTracker.reusedAliasDeclarations,
            deletedImports,
        };
    }
    /**
     * Gets a TypeScript transform for the import manager.
     *
     * @param extraStatementsMap Additional set of statements to be inserted
     *   for given source files after their imports. E.g. top-level constants.
     */
    toTsTransform(extraStatementsMap) {
        return createTsTransformForImportManager(this, extraStatementsMap);
    }
    /**
     * Transforms a single file as a shorthand, using {@link toTsTransform}.
     *
     * @param extraStatementsMap Additional set of statements to be inserted
     *   for given source files after their imports. E.g. top-level constants.
     */
    transformTsFile(ctx, file, extraStatementsAfterImports) {
        const extraStatementsMap = extraStatementsAfterImports
            ? new Map([[file.fileName, extraStatementsAfterImports]])
            : undefined;
        return this.toTsTransform(extraStatementsMap)(ctx)(file);
    }
    _getNewImportsTrackerForFile(file) {
        if (!this.newImports.has(file)) {
            this.newImports.set(file, {
                namespaceImports: new Map(),
                namedImports: new Map(),
                sideEffectImports: new Set(),
            });
        }
        return this.newImports.get(file);
    }
    _canAddSpecifier(sourceFile, moduleSpecifier, specifier) {
        return !this.removedImports
            .get(sourceFile)
            ?.get(moduleSpecifier)
            ?.has((specifier.propertyName || specifier.name).text);
    }
}
/** Creates an import reference based on the given identifier, or nested access. */
function createImportReference(asTypeReference, ref) {
    if (asTypeReference) {
        return Array.isArray(ref) ? ts.factory.createQualifiedName(ref[0], ref[1]) : ref;
    }
    else {
        return Array.isArray(ref) ? ts.factory.createPropertyAccessExpression(ref[0], ref[1]) : ref;
    }
}

const UNARY_OPERATORS$1 = new Map([
    [UnaryOperator.Minus, '-'],
    [UnaryOperator.Plus, '+'],
]);
const BINARY_OPERATORS$1 = new Map([
    [BinaryOperator.And, '&&'],
    [BinaryOperator.Bigger, '>'],
    [BinaryOperator.BiggerEquals, '>='],
    [BinaryOperator.BitwiseAnd, '&'],
    [BinaryOperator.BitwiseOr, '|'],
    [BinaryOperator.Divide, '/'],
    [BinaryOperator.Equals, '=='],
    [BinaryOperator.Identical, '==='],
    [BinaryOperator.Lower, '<'],
    [BinaryOperator.LowerEquals, '<='],
    [BinaryOperator.Minus, '-'],
    [BinaryOperator.Modulo, '%'],
    [BinaryOperator.Multiply, '*'],
    [BinaryOperator.NotEquals, '!='],
    [BinaryOperator.NotIdentical, '!=='],
    [BinaryOperator.Or, '||'],
    [BinaryOperator.Plus, '+'],
    [BinaryOperator.NullishCoalesce, '??'],
]);
class ExpressionTranslatorVisitor {
    factory;
    imports;
    contextFile;
    downlevelTaggedTemplates;
    downlevelVariableDeclarations;
    recordWrappedNode;
    constructor(factory, imports, contextFile, options) {
        this.factory = factory;
        this.imports = imports;
        this.contextFile = contextFile;
        this.downlevelTaggedTemplates = options.downlevelTaggedTemplates === true;
        this.downlevelVariableDeclarations = options.downlevelVariableDeclarations === true;
        this.recordWrappedNode = options.recordWrappedNode || (() => { });
    }
    visitDeclareVarStmt(stmt, context) {
        const varType = this.downlevelVariableDeclarations
            ? 'var'
            : stmt.hasModifier(exports.StmtModifier.Final)
                ? 'const'
                : 'let';
        return this.attachComments(this.factory.createVariableDeclaration(stmt.name, stmt.value?.visitExpression(this, context.withExpressionMode), varType), stmt.leadingComments);
    }
    visitDeclareFunctionStmt(stmt, context) {
        return this.attachComments(this.factory.createFunctionDeclaration(stmt.name, stmt.params.map((param) => param.name), this.factory.createBlock(this.visitStatements(stmt.statements, context.withStatementMode))), stmt.leadingComments);
    }
    visitExpressionStmt(stmt, context) {
        return this.attachComments(this.factory.createExpressionStatement(stmt.expr.visitExpression(this, context.withStatementMode)), stmt.leadingComments);
    }
    visitReturnStmt(stmt, context) {
        return this.attachComments(this.factory.createReturnStatement(stmt.value.visitExpression(this, context.withExpressionMode)), stmt.leadingComments);
    }
    visitIfStmt(stmt, context) {
        return this.attachComments(this.factory.createIfStatement(stmt.condition.visitExpression(this, context), this.factory.createBlock(this.visitStatements(stmt.trueCase, context.withStatementMode)), stmt.falseCase.length > 0
            ? this.factory.createBlock(this.visitStatements(stmt.falseCase, context.withStatementMode))
            : null), stmt.leadingComments);
    }
    visitReadVarExpr(ast, _context) {
        const identifier = this.factory.createIdentifier(ast.name);
        this.setSourceMapRange(identifier, ast.sourceSpan);
        return identifier;
    }
    visitWriteVarExpr(expr, context) {
        const assignment = this.factory.createAssignment(this.setSourceMapRange(this.factory.createIdentifier(expr.name), expr.sourceSpan), expr.value.visitExpression(this, context));
        return context.isStatement
            ? assignment
            : this.factory.createParenthesizedExpression(assignment);
    }
    visitWriteKeyExpr(expr, context) {
        const exprContext = context.withExpressionMode;
        const target = this.factory.createElementAccess(expr.receiver.visitExpression(this, exprContext), expr.index.visitExpression(this, exprContext));
        const assignment = this.factory.createAssignment(target, expr.value.visitExpression(this, exprContext));
        return context.isStatement
            ? assignment
            : this.factory.createParenthesizedExpression(assignment);
    }
    visitWritePropExpr(expr, context) {
        const target = this.factory.createPropertyAccess(expr.receiver.visitExpression(this, context), expr.name);
        return this.factory.createAssignment(target, expr.value.visitExpression(this, context));
    }
    visitInvokeFunctionExpr(ast, context) {
        return this.setSourceMapRange(this.factory.createCallExpression(ast.fn.visitExpression(this, context), ast.args.map((arg) => arg.visitExpression(this, context)), ast.pure), ast.sourceSpan);
    }
    visitTaggedTemplateLiteralExpr(ast, context) {
        return this.setSourceMapRange(this.createTaggedTemplateExpression(ast.tag.visitExpression(this, context), this.getTemplateLiteralFromAst(ast.template, context)), ast.sourceSpan);
    }
    visitTemplateLiteralExpr(ast, context) {
        return this.setSourceMapRange(this.factory.createTemplateLiteral(this.getTemplateLiteralFromAst(ast, context)), ast.sourceSpan);
    }
    visitInstantiateExpr(ast, context) {
        return this.factory.createNewExpression(ast.classExpr.visitExpression(this, context), ast.args.map((arg) => arg.visitExpression(this, context)));
    }
    visitLiteralExpr(ast, _context) {
        return this.setSourceMapRange(this.factory.createLiteral(ast.value), ast.sourceSpan);
    }
    visitLocalizedString(ast, context) {
        // A `$localize` message consists of `messageParts` and `expressions`, which get interleaved
        // together. The interleaved pieces look like:
        // `[messagePart0, expression0, messagePart1, expression1, messagePart2]`
        //
        // Note that there is always a message part at the start and end, and so therefore
        // `messageParts.length === expressions.length + 1`.
        //
        // Each message part may be prefixed with "metadata", which is wrapped in colons (:) delimiters.
        // The metadata is attached to the first and subsequent message parts by calls to
        // `serializeI18nHead()` and `serializeI18nTemplatePart()` respectively.
        //
        // The first message part (i.e. `ast.messageParts[0]`) is used to initialize `messageParts`
        // array.
        const elements = [createTemplateElement(ast.serializeI18nHead())];
        const expressions = [];
        for (let i = 0; i < ast.expressions.length; i++) {
            const placeholder = this.setSourceMapRange(ast.expressions[i].visitExpression(this, context), ast.getPlaceholderSourceSpan(i));
            expressions.push(placeholder);
            elements.push(createTemplateElement(ast.serializeI18nTemplatePart(i + 1)));
        }
        const localizeTag = this.factory.createIdentifier('$localize');
        return this.setSourceMapRange(this.createTaggedTemplateExpression(localizeTag, { elements, expressions }), ast.sourceSpan);
    }
    createTaggedTemplateExpression(tag, template) {
        return this.downlevelTaggedTemplates
            ? this.createES5TaggedTemplateFunctionCall(tag, template)
            : this.factory.createTaggedTemplate(tag, template);
    }
    /**
     * Translate the tagged template literal into a call that is compatible with ES5, using the
     * imported `__makeTemplateObject` helper for ES5 formatted output.
     */
    createES5TaggedTemplateFunctionCall(tagHandler, { elements, expressions }) {
        // Ensure that the `__makeTemplateObject()` helper has been imported.
        const __makeTemplateObjectHelper = this.imports.addImport({
            exportModuleSpecifier: 'tslib',
            exportSymbolName: '__makeTemplateObject',
            requestedFile: this.contextFile,
        });
        // Collect up the cooked and raw strings into two separate arrays.
        const cooked = [];
        const raw = [];
        for (const element of elements) {
            cooked.push(this.factory.setSourceMapRange(this.factory.createLiteral(element.cooked), element.range));
            raw.push(this.factory.setSourceMapRange(this.factory.createLiteral(element.raw), element.range));
        }
        // Generate the helper call in the form: `__makeTemplateObject([cooked], [raw]);`
        const templateHelperCall = this.factory.createCallExpression(__makeTemplateObjectHelper, [this.factory.createArrayLiteral(cooked), this.factory.createArrayLiteral(raw)], 
        /* pure */ false);
        // Finally create the tagged handler call in the form:
        // `tag(__makeTemplateObject([cooked], [raw]), ...expressions);`
        return this.factory.createCallExpression(tagHandler, [templateHelperCall, ...expressions], 
        /* pure */ false);
    }
    visitExternalExpr(ast, _context) {
        if (ast.value.name === null) {
            if (ast.value.moduleName === null) {
                throw new Error('Invalid import without name nor moduleName');
            }
            return this.imports.addImport({
                exportModuleSpecifier: ast.value.moduleName,
                exportSymbolName: null,
                requestedFile: this.contextFile,
            });
        }
        // If a moduleName is specified, this is a normal import. If there's no module name, it's a
        // reference to a global/ambient symbol.
        if (ast.value.moduleName !== null) {
            // This is a normal import. Find the imported module.
            return this.imports.addImport({
                exportModuleSpecifier: ast.value.moduleName,
                exportSymbolName: ast.value.name,
                requestedFile: this.contextFile,
            });
        }
        else {
            // The symbol is ambient, so just reference it.
            return this.factory.createIdentifier(ast.value.name);
        }
    }
    visitConditionalExpr(ast, context) {
        let cond = ast.condition.visitExpression(this, context);
        // Ordinarily the ternary operator is right-associative. The following are equivalent:
        //   `a ? b : c ? d : e` => `a ? b : (c ? d : e)`
        //
        // However, occasionally Angular needs to produce a left-associative conditional, such as in
        // the case of a null-safe navigation production: `{{a?.b ? c : d}}`. This template produces
        // a ternary of the form:
        //   `a == null ? null : rest of expression`
        // If the rest of the expression is also a ternary though, this w   ould produce the form:
        //   `a == null ? null : a.b ? c : d`
        // which, if left as right-associative, would be incorrectly associated as:
        //   `a == null ? null : (a.b ? c : d)`
        //
        // In such cases, the left-associativity needs to be enforced with parentheses:
        //   `(a == null ? null : a.b) ? c : d`
        //
        // Such parentheses could always be included in the condition (guaranteeing correct behavior) in
        // all cases, but this has a code size cost. Instead, parentheses are added only when a
        // conditional expression is directly used as the condition of another.
        //
        // TODO(alxhub): investigate better logic for precendence of conditional operators
        if (ast.condition instanceof ConditionalExpr) {
            // The condition of this ternary needs to be wrapped in parentheses to maintain
            // left-associativity.
            cond = this.factory.createParenthesizedExpression(cond);
        }
        return this.factory.createConditional(cond, ast.trueCase.visitExpression(this, context), ast.falseCase.visitExpression(this, context));
    }
    visitDynamicImportExpr(ast, context) {
        const urlExpression = typeof ast.url === 'string'
            ? this.factory.createLiteral(ast.url)
            : ast.url.visitExpression(this, context);
        if (ast.urlComment) {
            this.factory.attachComments(urlExpression, [leadingComment(ast.urlComment, true)]);
        }
        return this.factory.createDynamicImport(urlExpression);
    }
    visitNotExpr(ast, context) {
        return this.factory.createUnaryExpression('!', ast.condition.visitExpression(this, context));
    }
    visitFunctionExpr(ast, context) {
        return this.factory.createFunctionExpression(ast.name ?? null, ast.params.map((param) => param.name), this.factory.createBlock(this.visitStatements(ast.statements, context)));
    }
    visitArrowFunctionExpr(ast, context) {
        return this.factory.createArrowFunctionExpression(ast.params.map((param) => param.name), Array.isArray(ast.body)
            ? this.factory.createBlock(this.visitStatements(ast.body, context))
            : ast.body.visitExpression(this, context));
    }
    visitBinaryOperatorExpr(ast, context) {
        if (!BINARY_OPERATORS$1.has(ast.operator)) {
            throw new Error(`Unknown binary operator: ${BinaryOperator[ast.operator]}`);
        }
        return this.factory.createBinaryExpression(ast.lhs.visitExpression(this, context), BINARY_OPERATORS$1.get(ast.operator), ast.rhs.visitExpression(this, context));
    }
    visitReadPropExpr(ast, context) {
        return this.factory.createPropertyAccess(ast.receiver.visitExpression(this, context), ast.name);
    }
    visitReadKeyExpr(ast, context) {
        return this.factory.createElementAccess(ast.receiver.visitExpression(this, context), ast.index.visitExpression(this, context));
    }
    visitLiteralArrayExpr(ast, context) {
        return this.factory.createArrayLiteral(ast.entries.map((expr) => this.setSourceMapRange(expr.visitExpression(this, context), ast.sourceSpan)));
    }
    visitLiteralMapExpr(ast, context) {
        const properties = ast.entries.map((entry) => {
            return {
                propertyName: entry.key,
                quoted: entry.quoted,
                value: entry.value.visitExpression(this, context),
            };
        });
        return this.setSourceMapRange(this.factory.createObjectLiteral(properties), ast.sourceSpan);
    }
    visitCommaExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitTemplateLiteralElementExpr(ast, context) {
        throw new Error('Method not implemented');
    }
    visitWrappedNodeExpr(ast, _context) {
        this.recordWrappedNode(ast);
        return ast.node;
    }
    visitTypeofExpr(ast, context) {
        return this.factory.createTypeOfExpression(ast.expr.visitExpression(this, context));
    }
    visitUnaryOperatorExpr(ast, context) {
        if (!UNARY_OPERATORS$1.has(ast.operator)) {
            throw new Error(`Unknown unary operator: ${UnaryOperator[ast.operator]}`);
        }
        return this.factory.createUnaryExpression(UNARY_OPERATORS$1.get(ast.operator), ast.expr.visitExpression(this, context));
    }
    visitStatements(statements, context) {
        return statements
            .map((stmt) => stmt.visitStatement(this, context))
            .filter((stmt) => stmt !== undefined);
    }
    setSourceMapRange(ast, span) {
        return this.factory.setSourceMapRange(ast, createRange(span));
    }
    attachComments(statement, leadingComments) {
        if (leadingComments !== undefined) {
            this.factory.attachComments(statement, leadingComments);
        }
        return statement;
    }
    getTemplateLiteralFromAst(ast, context) {
        return {
            elements: ast.elements.map((e) => createTemplateElement({
                cooked: e.text,
                raw: e.rawText,
                range: e.sourceSpan ?? ast.sourceSpan,
            })),
            expressions: ast.expressions.map((e) => e.visitExpression(this, context)),
        };
    }
}
/**
 * Convert a cooked-raw string object into one that can be used by the AST factories.
 */
function createTemplateElement({ cooked, raw, range, }) {
    return { cooked, raw, range: createRange(range) };
}
/**
 * Convert an OutputAST source-span into a range that can be used by the AST factories.
 */
function createRange(span) {
    if (span === null) {
        return null;
    }
    const { start, end } = span;
    const { url, content } = start.file;
    if (!url) {
        return null;
    }
    return {
        url,
        content,
        start: { offset: start.offset, line: start.line, column: start.col },
        end: { offset: end.offset, line: end.line, column: end.col },
    };
}

const INELIGIBLE = {};
/**
 * Determines whether the provided type can be emitted, which means that it can be safely emitted
 * into a different location.
 *
 * If this function returns true, a `TypeEmitter` should be able to succeed. Vice versa, if this
 * function returns false, then using the `TypeEmitter` should not be attempted as it is known to
 * fail.
 */
function canEmitType(type, canEmit) {
    return canEmitTypeWorker(type);
    function canEmitTypeWorker(type) {
        return visitNode(type) !== INELIGIBLE;
    }
    // To determine whether a type can be emitted, we have to recursively look through all type nodes.
    // If an unsupported type node is found at any position within the type, then the `INELIGIBLE`
    // constant is returned to stop the recursive walk as the type as a whole cannot be emitted in
    // that case. Otherwise, the result of visiting all child nodes determines the result. If no
    // ineligible type reference node is found then the walk returns `undefined`, indicating that
    // no type node was visited that could not be emitted.
    function visitNode(node) {
        // `import('module')` type nodes are not supported, as it may require rewriting the module
        // specifier which is currently not done.
        if (ts.isImportTypeNode(node)) {
            return INELIGIBLE;
        }
        // Emitting a type reference node in a different context requires that an import for the type
        // can be created. If a type reference node cannot be emitted, `INELIGIBLE` is returned to stop
        // the walk.
        if (ts.isTypeReferenceNode(node) && !canEmitTypeReference(node)) {
            return INELIGIBLE;
        }
        else {
            return ts.forEachChild(node, visitNode);
        }
    }
    function canEmitTypeReference(type) {
        if (!canEmit(type)) {
            return false;
        }
        // The type can be emitted if either it does not have any type arguments, or all of them can be
        // emitted.
        return type.typeArguments === undefined || type.typeArguments.every(canEmitTypeWorker);
    }
}
/**
 * Given a `ts.TypeNode`, this class derives an equivalent `ts.TypeNode` that has been emitted into
 * a different context.
 *
 * For example, consider the following code:
 *
 * ```ts
 * import {NgIterable} from '@angular/core';
 *
 * class NgForOf<T, U extends NgIterable<T>> {}
 * ```
 *
 * Here, the generic type parameters `T` and `U` can be emitted into a different context, as the
 * type reference to `NgIterable` originates from an absolute module import so that it can be
 * emitted anywhere, using that same module import. The process of emitting translates the
 * `NgIterable` type reference to a type reference that is valid in the context in which it is
 * emitted, for example:
 *
 * ```ts
 * import * as i0 from '@angular/core';
 * import * as i1 from '@angular/common';
 *
 * const _ctor1: <T, U extends i0.NgIterable<T>>(o: Pick<i1.NgForOf<T, U>, 'ngForOf'>):
 * i1.NgForOf<T, U>;
 * ```
 *
 * Notice how the type reference for `NgIterable` has been translated into a qualified name,
 * referring to the namespace import that was created.
 */
class TypeEmitter {
    translator;
    constructor(translator) {
        this.translator = translator;
    }
    emitType(type) {
        const typeReferenceTransformer = (context) => {
            const visitNode = (node) => {
                if (ts.isImportTypeNode(node)) {
                    throw new Error('Unable to emit import type');
                }
                if (ts.isTypeReferenceNode(node)) {
                    return this.emitTypeReference(node);
                }
                else if (ts.isLiteralExpression(node)) {
                    // TypeScript would typically take the emit text for a literal expression from the source
                    // file itself. As the type node is being emitted into a different file, however,
                    // TypeScript would extract the literal text from the wrong source file. To mitigate this
                    // issue the literal is cloned and explicitly marked as synthesized by setting its text
                    // range to a negative range, forcing TypeScript to determine the node's literal text from
                    // the synthesized node's text instead of the incorrect source file.
                    let clone;
                    if (ts.isStringLiteral(node)) {
                        clone = ts.factory.createStringLiteral(node.text);
                    }
                    else if (ts.isNumericLiteral(node)) {
                        clone = ts.factory.createNumericLiteral(node.text);
                    }
                    else if (ts.isBigIntLiteral(node)) {
                        clone = ts.factory.createBigIntLiteral(node.text);
                    }
                    else if (ts.isNoSubstitutionTemplateLiteral(node)) {
                        clone = ts.factory.createNoSubstitutionTemplateLiteral(node.text, node.rawText);
                    }
                    else if (ts.isRegularExpressionLiteral(node)) {
                        clone = ts.factory.createRegularExpressionLiteral(node.text);
                    }
                    else {
                        throw new Error(`Unsupported literal kind ${ts.SyntaxKind[node.kind]}`);
                    }
                    ts.setTextRange(clone, { pos: -1, end: -1 });
                    return clone;
                }
                else {
                    return ts.visitEachChild(node, visitNode, context);
                }
            };
            return (node) => ts.visitNode(node, visitNode, ts.isTypeNode);
        };
        return ts.transform(type, [typeReferenceTransformer]).transformed[0];
    }
    emitTypeReference(type) {
        // Determine the reference that the type corresponds with.
        const translatedType = this.translator(type);
        if (translatedType === null) {
            throw new Error('Unable to emit an unresolved reference');
        }
        // Emit the type arguments, if any.
        let typeArguments = undefined;
        if (type.typeArguments !== undefined) {
            typeArguments = ts.factory.createNodeArray(type.typeArguments.map((typeArg) => this.emitType(typeArg)));
        }
        return ts.factory.updateTypeReferenceNode(type, translatedType.typeName, typeArguments);
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Creates a TypeScript node representing a numeric value.
 */
function tsNumericExpression$1(value) {
    // As of TypeScript 5.3 negative numbers are represented as `prefixUnaryOperator` and passing a
    // negative number (even as a string) into `createNumericLiteral` will result in an error.
    if (value < 0) {
        const operand = ts.factory.createNumericLiteral(Math.abs(value));
        return ts.factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, operand);
    }
    return ts.factory.createNumericLiteral(value);
}

function translateType(type, contextFile, reflector, refEmitter, imports) {
    return type.visitType(new TypeTranslatorVisitor(imports, contextFile, reflector, refEmitter), new Context$1(false));
}
class TypeTranslatorVisitor {
    imports;
    contextFile;
    reflector;
    refEmitter;
    constructor(imports, contextFile, reflector, refEmitter) {
        this.imports = imports;
        this.contextFile = contextFile;
        this.reflector = reflector;
        this.refEmitter = refEmitter;
    }
    visitBuiltinType(type, context) {
        switch (type.name) {
            case BuiltinTypeName.Bool:
                return ts.factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword);
            case BuiltinTypeName.Dynamic:
                return ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
            case BuiltinTypeName.Int:
            case BuiltinTypeName.Number:
                return ts.factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword);
            case BuiltinTypeName.String:
                return ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
            case BuiltinTypeName.None:
                return ts.factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword);
            default:
                throw new Error(`Unsupported builtin type: ${BuiltinTypeName[type.name]}`);
        }
    }
    visitExpressionType(type, context) {
        const typeNode = this.translateExpression(type.value, context);
        if (type.typeParams === null) {
            return typeNode;
        }
        if (!ts.isTypeReferenceNode(typeNode)) {
            throw new Error('An ExpressionType with type arguments must translate into a TypeReferenceNode');
        }
        else if (typeNode.typeArguments !== undefined) {
            throw new Error(`An ExpressionType with type arguments cannot have multiple levels of type arguments`);
        }
        const typeArgs = type.typeParams.map((param) => this.translateType(param, context));
        return ts.factory.createTypeReferenceNode(typeNode.typeName, typeArgs);
    }
    visitArrayType(type, context) {
        return ts.factory.createArrayTypeNode(this.translateType(type.of, context));
    }
    visitMapType(type, context) {
        const parameter = ts.factory.createParameterDeclaration(undefined, undefined, 'key', undefined, ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
        const typeArgs = type.valueType !== null
            ? this.translateType(type.valueType, context)
            : ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword);
        const indexSignature = ts.factory.createIndexSignature(undefined, [parameter], typeArgs);
        return ts.factory.createTypeLiteralNode([indexSignature]);
    }
    visitTransplantedType(ast, context) {
        const node = ast.type instanceof Reference ? ast.type.node : ast.type;
        if (!ts.isTypeNode(node)) {
            throw new Error(`A TransplantedType must wrap a TypeNode`);
        }
        const viaModule = ast.type instanceof Reference ? ast.type.bestGuessOwningModule : null;
        const emitter = new TypeEmitter((typeRef) => this.translateTypeReference(typeRef, context, viaModule));
        return emitter.emitType(node);
    }
    visitReadVarExpr(ast, context) {
        if (ast.name === null) {
            throw new Error(`ReadVarExpr with no variable name in type`);
        }
        return ts.factory.createTypeQueryNode(ts.factory.createIdentifier(ast.name));
    }
    visitWriteVarExpr(expr, context) {
        throw new Error('Method not implemented.');
    }
    visitWriteKeyExpr(expr, context) {
        throw new Error('Method not implemented.');
    }
    visitWritePropExpr(expr, context) {
        throw new Error('Method not implemented.');
    }
    visitInvokeFunctionExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitTaggedTemplateLiteralExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitTemplateLiteralExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitTemplateLiteralElementExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitInstantiateExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitLiteralExpr(ast, context) {
        if (ast.value === null) {
            return ts.factory.createLiteralTypeNode(ts.factory.createNull());
        }
        else if (ast.value === undefined) {
            return ts.factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword);
        }
        else if (typeof ast.value === 'boolean') {
            return ts.factory.createLiteralTypeNode(ast.value ? ts.factory.createTrue() : ts.factory.createFalse());
        }
        else if (typeof ast.value === 'number') {
            return ts.factory.createLiteralTypeNode(tsNumericExpression$1(ast.value));
        }
        else {
            return ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(ast.value));
        }
    }
    visitLocalizedString(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitExternalExpr(ast, context) {
        if (ast.value.moduleName === null || ast.value.name === null) {
            throw new Error(`Import unknown module or symbol`);
        }
        const typeName = this.imports.addImport({
            exportModuleSpecifier: ast.value.moduleName,
            exportSymbolName: ast.value.name,
            requestedFile: this.contextFile,
            asTypeReference: true,
        });
        const typeArguments = ast.typeParams !== null
            ? ast.typeParams.map((type) => this.translateType(type, context))
            : undefined;
        return ts.factory.createTypeReferenceNode(typeName, typeArguments);
    }
    visitConditionalExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitDynamicImportExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitNotExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitFunctionExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitArrowFunctionExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitUnaryOperatorExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitBinaryOperatorExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitReadPropExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitReadKeyExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitLiteralArrayExpr(ast, context) {
        const values = ast.entries.map((expr) => this.translateExpression(expr, context));
        return ts.factory.createTupleTypeNode(values);
    }
    visitLiteralMapExpr(ast, context) {
        const entries = ast.entries.map((entry) => {
            const { key, quoted } = entry;
            const type = this.translateExpression(entry.value, context);
            return ts.factory.createPropertySignature(
            /* modifiers */ undefined, 
            /* name */ quoted ? ts.factory.createStringLiteral(key) : key, 
            /* questionToken */ undefined, 
            /* type */ type);
        });
        return ts.factory.createTypeLiteralNode(entries);
    }
    visitCommaExpr(ast, context) {
        throw new Error('Method not implemented.');
    }
    visitWrappedNodeExpr(ast, context) {
        const node = ast.node;
        if (ts.isEntityName(node)) {
            return ts.factory.createTypeReferenceNode(node, /* typeArguments */ undefined);
        }
        else if (ts.isTypeNode(node)) {
            return node;
        }
        else if (ts.isLiteralExpression(node)) {
            return ts.factory.createLiteralTypeNode(node);
        }
        else {
            throw new Error(`Unsupported WrappedNodeExpr in TypeTranslatorVisitor: ${ts.SyntaxKind[node.kind]}`);
        }
    }
    visitTypeofExpr(ast, context) {
        const typeNode = this.translateExpression(ast.expr, context);
        if (!ts.isTypeReferenceNode(typeNode)) {
            throw new Error(`The target of a typeof expression must be a type reference, but it was
          ${ts.SyntaxKind[typeNode.kind]}`);
        }
        return ts.factory.createTypeQueryNode(typeNode.typeName);
    }
    translateType(type, context) {
        const typeNode = type.visitType(this, context);
        if (!ts.isTypeNode(typeNode)) {
            throw new Error(`A Type must translate to a TypeNode, but was ${ts.SyntaxKind[typeNode.kind]}`);
        }
        return typeNode;
    }
    translateExpression(expr, context) {
        const typeNode = expr.visitExpression(this, context);
        if (!ts.isTypeNode(typeNode)) {
            throw new Error(`An Expression must translate to a TypeNode, but was ${ts.SyntaxKind[typeNode.kind]}`);
        }
        return typeNode;
    }
    translateTypeReference(type, context, viaModule) {
        const target = ts.isIdentifier(type.typeName) ? type.typeName : type.typeName.right;
        const declaration = this.reflector.getDeclarationOfIdentifier(target);
        if (declaration === null) {
            throw new Error(`Unable to statically determine the declaration file of type node ${target.text}`);
        }
        let owningModule = viaModule;
        if (typeof declaration.viaModule === 'string') {
            owningModule = {
                specifier: declaration.viaModule,
                resolutionContext: type.getSourceFile().fileName,
            };
        }
        const reference = new Reference(declaration.node, declaration.viaModule === AmbientImport ? AmbientImport : owningModule);
        const emittedType = this.refEmitter.emit(reference, this.contextFile, exports.ImportFlags.NoAliasing | exports.ImportFlags.AllowTypeImports | exports.ImportFlags.AllowAmbientReferences);
        assertSuccessfulReferenceEmit(emittedType, target, 'type');
        const typeNode = this.translateExpression(emittedType.expression, context);
        if (!ts.isTypeReferenceNode(typeNode)) {
            throw new Error(`Expected TypeReferenceNode for emitted reference, got ${ts.SyntaxKind[typeNode.kind]}.`);
        }
        return typeNode;
    }
}

/**
 * Different optimizers use different annotations on a function or method call to indicate its pure
 * status.
 */
var PureAnnotation;
(function (PureAnnotation) {
    /**
     * Closure's annotation for purity is `@pureOrBreakMyCode`, but this needs to be in a semantic
     * (jsdoc) enabled comment. Thus, the actual comment text for Closure must include the `*` that
     * turns a `/*` comment into a `/**` comment, as well as surrounding whitespace.
     */
    PureAnnotation["CLOSURE"] = "* @pureOrBreakMyCode ";
    PureAnnotation["TERSER"] = "@__PURE__";
})(PureAnnotation || (PureAnnotation = {}));
const UNARY_OPERATORS = {
    '+': ts.SyntaxKind.PlusToken,
    '-': ts.SyntaxKind.MinusToken,
    '!': ts.SyntaxKind.ExclamationToken,
};
const BINARY_OPERATORS = {
    '&&': ts.SyntaxKind.AmpersandAmpersandToken,
    '>': ts.SyntaxKind.GreaterThanToken,
    '>=': ts.SyntaxKind.GreaterThanEqualsToken,
    '&': ts.SyntaxKind.AmpersandToken,
    '|': ts.SyntaxKind.BarToken,
    '/': ts.SyntaxKind.SlashToken,
    '==': ts.SyntaxKind.EqualsEqualsToken,
    '===': ts.SyntaxKind.EqualsEqualsEqualsToken,
    '<': ts.SyntaxKind.LessThanToken,
    '<=': ts.SyntaxKind.LessThanEqualsToken,
    '-': ts.SyntaxKind.MinusToken,
    '%': ts.SyntaxKind.PercentToken,
    '*': ts.SyntaxKind.AsteriskToken,
    '!=': ts.SyntaxKind.ExclamationEqualsToken,
    '!==': ts.SyntaxKind.ExclamationEqualsEqualsToken,
    '||': ts.SyntaxKind.BarBarToken,
    '+': ts.SyntaxKind.PlusToken,
    '??': ts.SyntaxKind.QuestionQuestionToken,
};
const VAR_TYPES = {
    'const': ts.NodeFlags.Const,
    'let': ts.NodeFlags.Let,
    'var': ts.NodeFlags.None,
};
/**
 * A TypeScript flavoured implementation of the AstFactory.
 */
class TypeScriptAstFactory {
    annotateForClosureCompiler;
    externalSourceFiles = new Map();
    constructor(annotateForClosureCompiler) {
        this.annotateForClosureCompiler = annotateForClosureCompiler;
    }
    attachComments = attachComments;
    createArrayLiteral = ts.factory.createArrayLiteralExpression;
    createAssignment(target, value) {
        return ts.factory.createBinaryExpression(target, ts.SyntaxKind.EqualsToken, value);
    }
    createBinaryExpression(leftOperand, operator, rightOperand) {
        return ts.factory.createBinaryExpression(leftOperand, BINARY_OPERATORS[operator], rightOperand);
    }
    createBlock(body) {
        return ts.factory.createBlock(body);
    }
    createCallExpression(callee, args, pure) {
        const call = ts.factory.createCallExpression(callee, undefined, args);
        if (pure) {
            ts.addSyntheticLeadingComment(call, ts.SyntaxKind.MultiLineCommentTrivia, this.annotateForClosureCompiler ? PureAnnotation.CLOSURE : PureAnnotation.TERSER, 
            /* trailing newline */ false);
        }
        return call;
    }
    createConditional(condition, whenTrue, whenFalse) {
        return ts.factory.createConditionalExpression(condition, undefined, whenTrue, undefined, whenFalse);
    }
    createElementAccess = ts.factory.createElementAccessExpression;
    createExpressionStatement = ts.factory.createExpressionStatement;
    createDynamicImport(url) {
        return ts.factory.createCallExpression(ts.factory.createToken(ts.SyntaxKind.ImportKeyword), 
        /* type */ undefined, [typeof url === 'string' ? ts.factory.createStringLiteral(url) : url]);
    }
    createFunctionDeclaration(functionName, parameters, body) {
        if (!ts.isBlock(body)) {
            throw new Error(`Invalid syntax, expected a block, but got ${ts.SyntaxKind[body.kind]}.`);
        }
        return ts.factory.createFunctionDeclaration(undefined, undefined, functionName, undefined, parameters.map((param) => ts.factory.createParameterDeclaration(undefined, undefined, param)), undefined, body);
    }
    createFunctionExpression(functionName, parameters, body) {
        if (!ts.isBlock(body)) {
            throw new Error(`Invalid syntax, expected a block, but got ${ts.SyntaxKind[body.kind]}.`);
        }
        return ts.factory.createFunctionExpression(undefined, undefined, functionName ?? undefined, undefined, parameters.map((param) => ts.factory.createParameterDeclaration(undefined, undefined, param)), undefined, body);
    }
    createArrowFunctionExpression(parameters, body) {
        if (ts.isStatement(body) && !ts.isBlock(body)) {
            throw new Error(`Invalid syntax, expected a block, but got ${ts.SyntaxKind[body.kind]}.`);
        }
        return ts.factory.createArrowFunction(undefined, undefined, parameters.map((param) => ts.factory.createParameterDeclaration(undefined, undefined, param)), undefined, undefined, body);
    }
    createIdentifier = ts.factory.createIdentifier;
    createIfStatement(condition, thenStatement, elseStatement) {
        return ts.factory.createIfStatement(condition, thenStatement, elseStatement ?? undefined);
    }
    createLiteral(value) {
        if (value === undefined) {
            return ts.factory.createIdentifier('undefined');
        }
        else if (value === null) {
            return ts.factory.createNull();
        }
        else if (typeof value === 'boolean') {
            return value ? ts.factory.createTrue() : ts.factory.createFalse();
        }
        else if (typeof value === 'number') {
            return tsNumericExpression$1(value);
        }
        else {
            return ts.factory.createStringLiteral(value);
        }
    }
    createNewExpression(expression, args) {
        return ts.factory.createNewExpression(expression, undefined, args);
    }
    createObjectLiteral(properties) {
        return ts.factory.createObjectLiteralExpression(properties.map((prop) => ts.factory.createPropertyAssignment(prop.quoted
            ? ts.factory.createStringLiteral(prop.propertyName)
            : ts.factory.createIdentifier(prop.propertyName), prop.value)));
    }
    createParenthesizedExpression = ts.factory.createParenthesizedExpression;
    createPropertyAccess = ts.factory.createPropertyAccessExpression;
    createReturnStatement(expression) {
        return ts.factory.createReturnStatement(expression ?? undefined);
    }
    createTaggedTemplate(tag, template) {
        return ts.factory.createTaggedTemplateExpression(tag, undefined, this.createTemplateLiteral(template));
    }
    createTemplateLiteral(template) {
        let templateLiteral;
        const length = template.elements.length;
        const head = template.elements[0];
        if (length === 1) {
            templateLiteral = ts.factory.createNoSubstitutionTemplateLiteral(head.cooked, head.raw);
        }
        else {
            const spans = [];
            // Create the middle parts
            for (let i = 1; i < length - 1; i++) {
                const { cooked, raw, range } = template.elements[i];
                const middle = createTemplateMiddle(cooked, raw);
                if (range !== null) {
                    this.setSourceMapRange(middle, range);
                }
                spans.push(ts.factory.createTemplateSpan(template.expressions[i - 1], middle));
            }
            // Create the tail part
            const resolvedExpression = template.expressions[length - 2];
            const templatePart = template.elements[length - 1];
            const templateTail = createTemplateTail(templatePart.cooked, templatePart.raw);
            if (templatePart.range !== null) {
                this.setSourceMapRange(templateTail, templatePart.range);
            }
            spans.push(ts.factory.createTemplateSpan(resolvedExpression, templateTail));
            // Put it all together
            templateLiteral = ts.factory.createTemplateExpression(ts.factory.createTemplateHead(head.cooked, head.raw), spans);
        }
        if (head.range !== null) {
            this.setSourceMapRange(templateLiteral, head.range);
        }
        return templateLiteral;
    }
    createThrowStatement = ts.factory.createThrowStatement;
    createTypeOfExpression = ts.factory.createTypeOfExpression;
    createUnaryExpression(operator, operand) {
        return ts.factory.createPrefixUnaryExpression(UNARY_OPERATORS[operator], operand);
    }
    createVariableDeclaration(variableName, initializer, type) {
        return ts.factory.createVariableStatement(undefined, ts.factory.createVariableDeclarationList([
            ts.factory.createVariableDeclaration(variableName, undefined, undefined, initializer ?? undefined),
        ], VAR_TYPES[type]));
    }
    setSourceMapRange(node, sourceMapRange) {
        if (sourceMapRange === null) {
            return node;
        }
        const url = sourceMapRange.url;
        if (!this.externalSourceFiles.has(url)) {
            this.externalSourceFiles.set(url, ts.createSourceMapSource(url, sourceMapRange.content, (pos) => pos));
        }
        const source = this.externalSourceFiles.get(url);
        ts.setSourceMapRange(node, {
            pos: sourceMapRange.start.offset,
            end: sourceMapRange.end.offset,
            source,
        });
        return node;
    }
}
// HACK: Use this in place of `ts.createTemplateMiddle()`.
// Revert once https://github.com/microsoft/TypeScript/issues/35374 is fixed.
function createTemplateMiddle(cooked, raw) {
    const node = ts.factory.createTemplateHead(cooked, raw);
    node.kind = ts.SyntaxKind.TemplateMiddle;
    return node;
}
// HACK: Use this in place of `ts.createTemplateTail()`.
// Revert once https://github.com/microsoft/TypeScript/issues/35374 is fixed.
function createTemplateTail(cooked, raw) {
    const node = ts.factory.createTemplateHead(cooked, raw);
    node.kind = ts.SyntaxKind.TemplateTail;
    return node;
}
/**
 * Attach the given `leadingComments` to the `statement` node.
 *
 * @param statement The statement that will have comments attached.
 * @param leadingComments The comments to attach to the statement.
 */
function attachComments(statement, leadingComments) {
    for (const comment of leadingComments) {
        const commentKind = comment.multiline
            ? ts.SyntaxKind.MultiLineCommentTrivia
            : ts.SyntaxKind.SingleLineCommentTrivia;
        if (comment.multiline) {
            ts.addSyntheticLeadingComment(statement, commentKind, comment.toString(), comment.trailingNewline);
        }
        else {
            for (const line of comment.toString().split('\n')) {
                ts.addSyntheticLeadingComment(statement, commentKind, line, comment.trailingNewline);
            }
        }
    }
}

function translateExpression(contextFile, expression, imports, options = {}) {
    return expression.visitExpression(new ExpressionTranslatorVisitor(new TypeScriptAstFactory(options.annotateForClosureCompiler === true), imports, contextFile, options), new Context$1(false));
}
function translateStatement(contextFile, statement, imports, options = {}) {
    return statement.visitStatement(new ExpressionTranslatorVisitor(new TypeScriptAstFactory(options.annotateForClosureCompiler === true), imports, contextFile, options), new Context$1(true));
}

/**
 * Create a `ts.Diagnostic` which indicates the given class is part of the declarations of two or
 * more NgModules.
 *
 * The resulting `ts.Diagnostic` will have a context entry for each NgModule showing the point where
 * the directive/pipe exists in its `declarations` (if possible).
 */
function makeDuplicateDeclarationError(node, data, kind) {
    const context = [];
    for (const decl of data) {
        if (decl.rawDeclarations === null) {
            continue;
        }
        // Try to find the reference to the declaration within the declarations array, to hang the
        // error there. If it can't be found, fall back on using the NgModule's name.
        const contextNode = decl.ref.getOriginForDiagnostics(decl.rawDeclarations, decl.ngModule.name);
        context.push(makeRelatedInformation(contextNode, `'${node.name.text}' is listed in the declarations of the NgModule '${decl.ngModule.name.text}'.`));
    }
    // Finally, produce the diagnostic.
    return makeDiagnostic(exports.ErrorCode.NGMODULE_DECLARATION_NOT_UNIQUE, node.name, `The ${kind} '${node.name.text}' is declared by more than one NgModule.`, context);
}
/**
 * Creates a `FatalDiagnosticError` for a node that did not evaluate to the expected type. The
 * diagnostic that is created will include details on why the value is incorrect, i.e. it includes
 * a representation of the actual type that was unsupported, or in the case of a dynamic value the
 * trace to the node where the dynamic value originated.
 *
 * @param node The node for which the diagnostic should be produced.
 * @param value The evaluated value that has the wrong type.
 * @param messageText The message text of the error.
 */
function createValueHasWrongTypeError(node, value, messageText) {
    let chainedMessage;
    let relatedInformation;
    if (value instanceof DynamicValue) {
        chainedMessage = 'Value could not be determined statically.';
        relatedInformation = traceDynamicValue(node, value);
    }
    else if (value instanceof Reference) {
        const target = value.debugName !== null ? `'${value.debugName}'` : 'an anonymous declaration';
        chainedMessage = `Value is a reference to ${target}.`;
        const referenceNode = identifierOfNode(value.node) ?? value.node;
        relatedInformation = [makeRelatedInformation(referenceNode, 'Reference is declared here.')];
    }
    else {
        chainedMessage = `Value is of type '${describeResolvedType(value)}'.`;
    }
    const chain = {
        messageText,
        category: ts.DiagnosticCategory.Error,
        code: 0,
        next: [
            {
                messageText: chainedMessage,
                category: ts.DiagnosticCategory.Message,
                code: 0,
            },
        ],
    };
    return new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, node, chain, relatedInformation);
}
/**
 * Gets the diagnostics for a set of provider classes.
 * @param providerClasses Classes that should be checked.
 * @param providersDeclaration Node that declares the providers array.
 * @param registry Registry that keeps track of the registered injectable classes.
 */
function getProviderDiagnostics(providerClasses, providersDeclaration, registry) {
    const diagnostics = [];
    for (const provider of providerClasses) {
        const injectableMeta = registry.getInjectableMeta(provider.node);
        if (injectableMeta !== null) {
            // The provided type is recognized as injectable, so we don't report a diagnostic for this
            // provider.
            continue;
        }
        const contextNode = provider.getOriginForDiagnostics(providersDeclaration);
        diagnostics.push(makeDiagnostic(exports.ErrorCode.UNDECORATED_PROVIDER, contextNode, `The class '${provider.node.name.text}' cannot be created via dependency injection, as it does not have an Angular decorator. This will result in an error at runtime.

Either add the @Injectable() decorator to '${provider.node.name.text}', or configure a different provider (such as a provider with 'useFactory').
`, [makeRelatedInformation(provider.node, `'${provider.node.name.text}' is declared here.`)]));
    }
    return diagnostics;
}
function getDirectiveDiagnostics(node, injectableRegistry, evaluator, reflector, scopeRegistry, strictInjectionParameters, kind) {
    let diagnostics = [];
    const addDiagnostics = (more) => {
        if (more === null) {
            return;
        }
        else if (diagnostics === null) {
            diagnostics = Array.isArray(more) ? more : [more];
        }
        else if (Array.isArray(more)) {
            diagnostics.push(...more);
        }
        else {
            diagnostics.push(more);
        }
    };
    const duplicateDeclarations = scopeRegistry.getDuplicateDeclarations(node);
    if (duplicateDeclarations !== null) {
        addDiagnostics(makeDuplicateDeclarationError(node, duplicateDeclarations, kind));
    }
    addDiagnostics(checkInheritanceOfInjectable(node, injectableRegistry, reflector, evaluator, strictInjectionParameters, kind));
    return diagnostics;
}
function validateHostDirectives(origin, hostDirectives, metaReader) {
    const diagnostics = [];
    for (const current of hostDirectives) {
        if (!isHostDirectiveMetaForGlobalMode(current)) {
            throw new Error('Impossible state: diagnostics code path for local compilation');
        }
        const hostMeta = flattenInheritedDirectiveMetadata(metaReader, current.directive);
        if (hostMeta === null) {
            diagnostics.push(makeDiagnostic(exports.ErrorCode.HOST_DIRECTIVE_INVALID, current.directive.getOriginForDiagnostics(origin), `${current.directive.debugName} must be a standalone directive to be used as a host directive`));
            continue;
        }
        if (!hostMeta.isStandalone) {
            diagnostics.push(makeDiagnostic(exports.ErrorCode.HOST_DIRECTIVE_NOT_STANDALONE, current.directive.getOriginForDiagnostics(origin), `Host directive ${hostMeta.name} must be standalone`));
        }
        if (hostMeta.isComponent) {
            diagnostics.push(makeDiagnostic(exports.ErrorCode.HOST_DIRECTIVE_COMPONENT, current.directive.getOriginForDiagnostics(origin), `Host directive ${hostMeta.name} cannot be a component`));
        }
        const requiredInputNames = Array.from(hostMeta.inputs)
            .filter((input) => input.required)
            .map((input) => input.classPropertyName);
        validateHostDirectiveMappings('input', current, hostMeta, origin, diagnostics, requiredInputNames.length > 0 ? new Set(requiredInputNames) : null);
        validateHostDirectiveMappings('output', current, hostMeta, origin, diagnostics, null);
    }
    return diagnostics;
}
function validateHostDirectiveMappings(bindingType, hostDirectiveMeta, meta, origin, diagnostics, requiredBindings) {
    if (!isHostDirectiveMetaForGlobalMode(hostDirectiveMeta)) {
        throw new Error('Impossible state: diagnostics code path for local compilation');
    }
    const className = meta.name;
    const hostDirectiveMappings = bindingType === 'input' ? hostDirectiveMeta.inputs : hostDirectiveMeta.outputs;
    const existingBindings = bindingType === 'input' ? meta.inputs : meta.outputs;
    const exposedRequiredBindings = new Set();
    for (const publicName in hostDirectiveMappings) {
        if (hostDirectiveMappings.hasOwnProperty(publicName)) {
            const bindings = existingBindings.getByBindingPropertyName(publicName);
            if (bindings === null) {
                diagnostics.push(makeDiagnostic(exports.ErrorCode.HOST_DIRECTIVE_UNDEFINED_BINDING, hostDirectiveMeta.directive.getOriginForDiagnostics(origin), `Directive ${className} does not have an ${bindingType} with a public name of ${publicName}.`));
            }
            else if (requiredBindings !== null) {
                for (const field of bindings) {
                    if (requiredBindings.has(field.classPropertyName)) {
                        exposedRequiredBindings.add(field.classPropertyName);
                    }
                }
            }
            const remappedPublicName = hostDirectiveMappings[publicName];
            const bindingsForPublicName = existingBindings.getByBindingPropertyName(remappedPublicName);
            if (bindingsForPublicName !== null) {
                for (const binding of bindingsForPublicName) {
                    if (binding.bindingPropertyName !== publicName) {
                        diagnostics.push(makeDiagnostic(exports.ErrorCode.HOST_DIRECTIVE_CONFLICTING_ALIAS, hostDirectiveMeta.directive.getOriginForDiagnostics(origin), `Cannot alias ${bindingType} ${publicName} of host directive ${className} to ${remappedPublicName}, because it already has a different ${bindingType} with the same public name.`));
                    }
                }
            }
        }
    }
    if (requiredBindings !== null && requiredBindings.size !== exposedRequiredBindings.size) {
        const missingBindings = [];
        for (const publicName of requiredBindings) {
            if (!exposedRequiredBindings.has(publicName)) {
                const name = existingBindings.getByClassPropertyName(publicName);
                if (name) {
                    missingBindings.push(`'${name.bindingPropertyName}'`);
                }
            }
        }
        diagnostics.push(makeDiagnostic(exports.ErrorCode.HOST_DIRECTIVE_MISSING_REQUIRED_BINDING, hostDirectiveMeta.directive.getOriginForDiagnostics(origin), `Required ${bindingType}${missingBindings.length === 1 ? '' : 's'} ${missingBindings.join(', ')} from host directive ${className} must be exposed.`));
    }
}
function getUndecoratedClassWithAngularFeaturesDiagnostic(node) {
    return makeDiagnostic(exports.ErrorCode.UNDECORATED_CLASS_USING_ANGULAR_FEATURES, node.name, `Class is using Angular features but is not decorated. Please add an explicit ` +
        `Angular decorator.`);
}
function checkInheritanceOfInjectable(node, injectableRegistry, reflector, evaluator, strictInjectionParameters, kind) {
    const classWithCtor = findInheritedCtor(node, injectableRegistry, reflector, evaluator);
    if (classWithCtor === null || classWithCtor.isCtorValid) {
        // The class does not inherit a constructor, or the inherited constructor is compatible
        // with DI; no need to report a diagnostic.
        return null;
    }
    if (!classWithCtor.isDecorated) {
        // The inherited constructor exists in a class that does not have an Angular decorator.
        // This is an error, as there won't be a factory definition available for DI to invoke
        // the constructor.
        return getInheritedUndecoratedCtorDiagnostic(node, classWithCtor.ref, kind);
    }
    if (isFromDtsFile(classWithCtor.ref.node)) {
        // The inherited class is declared in a declaration file, in which case there is not enough
        // information to detect invalid constructors as `@Inject()` metadata is not present in the
        // declaration file. Consequently, we have to accept such occurrences, although they might
        // still fail at runtime.
        return null;
    }
    if (!strictInjectionParameters || isAbstractClassDeclaration(node)) {
        // An invalid constructor is only reported as error under `strictInjectionParameters` and
        // only for concrete classes; follow the same exclusions for derived types.
        return null;
    }
    return getInheritedInvalidCtorDiagnostic(node, classWithCtor.ref, kind);
}
function findInheritedCtor(node, injectableRegistry, reflector, evaluator) {
    if (!reflector.isClass(node) || reflector.getConstructorParameters(node) !== null) {
        // We should skip nodes that aren't classes. If a constructor exists, then no base class
        // definition is required on the runtime side - it's legal to inherit from any class.
        return null;
    }
    // The extends clause is an expression which can be as dynamic as the user wants. Try to
    // evaluate it, but fall back on ignoring the clause if it can't be understood. This is a View
    // Engine compatibility hack: View Engine ignores 'extends' expressions that it cannot understand.
    let baseClass = readBaseClass(node, reflector, evaluator);
    while (baseClass !== null) {
        if (baseClass === 'dynamic') {
            return null;
        }
        const injectableMeta = injectableRegistry.getInjectableMeta(baseClass.node);
        if (injectableMeta !== null) {
            if (injectableMeta.ctorDeps !== null) {
                // The class has an Angular decorator with a constructor.
                return {
                    ref: baseClass,
                    isCtorValid: injectableMeta.ctorDeps !== 'invalid',
                    isDecorated: true,
                };
            }
        }
        else {
            const baseClassConstructorParams = reflector.getConstructorParameters(baseClass.node);
            if (baseClassConstructorParams !== null) {
                // The class is not decorated, but it does have constructor. An undecorated class is only
                // allowed to have a constructor without parameters, otherwise it is invalid.
                return {
                    ref: baseClass,
                    isCtorValid: baseClassConstructorParams.length === 0,
                    isDecorated: false,
                };
            }
        }
        // Go up the chain and continue
        baseClass = readBaseClass(baseClass.node, reflector, evaluator);
    }
    return null;
}
function getInheritedInvalidCtorDiagnostic(node, baseClass, kind) {
    const baseClassName = baseClass.debugName;
    return makeDiagnostic(exports.ErrorCode.INJECTABLE_INHERITS_INVALID_CONSTRUCTOR, node.name, `The ${kind.toLowerCase()} ${node.name.text} inherits its constructor from ${baseClassName}, ` +
        `but the latter has a constructor parameter that is not compatible with dependency injection. ` +
        `Either add an explicit constructor to ${node.name.text} or change ${baseClassName}'s constructor to ` +
        `use parameters that are valid for DI.`);
}
function getInheritedUndecoratedCtorDiagnostic(node, baseClass, kind) {
    const baseClassName = baseClass.debugName;
    const baseNeedsDecorator = kind === 'Component' || kind === 'Directive' ? 'Directive' : 'Injectable';
    return makeDiagnostic(exports.ErrorCode.DIRECTIVE_INHERITS_UNDECORATED_CTOR, node.name, `The ${kind.toLowerCase()} ${node.name.text} inherits its constructor from ${baseClassName}, ` +
        `but the latter does not have an Angular decorator of its own. Dependency injection will not be able to ` +
        `resolve the parameters of ${baseClassName}'s constructor. Either add a @${baseNeedsDecorator} decorator ` +
        `to ${baseClassName}, or add an explicit constructor to ${node.name.text}.`);
}
/**
 * Throws `FatalDiagnosticError` with error code `LOCAL_COMPILATION_UNRESOLVED_CONST`
 * if the compilation mode is local and the value is not resolved due to being imported
 * from external files. This is a common scenario for errors in local compilation mode,
 * and so this helper can be used to quickly generate the relevant errors.
 *
 * @param nodeToHighlight Node to be highlighted in teh error message.
 * Will default to value.node if not provided.
 */
function assertLocalCompilationUnresolvedConst(compilationMode, value, nodeToHighlight, errorMessage) {
    if (compilationMode === exports.CompilationMode.LOCAL &&
        value instanceof DynamicValue &&
        value.isFromUnknownIdentifier()) {
        throw new FatalDiagnosticError(exports.ErrorCode.LOCAL_COMPILATION_UNRESOLVED_CONST, nodeToHighlight ?? value.node, errorMessage);
    }
}

exports.ComponentScopeKind = void 0;
(function (ComponentScopeKind) {
    ComponentScopeKind[ComponentScopeKind["NgModule"] = 0] = "NgModule";
    ComponentScopeKind[ComponentScopeKind["Standalone"] = 1] = "Standalone";
})(exports.ComponentScopeKind || (exports.ComponentScopeKind = {}));

/**
 * Validates that the initializer member is compatible with the given class
 * member in terms of field access and visibility.
 *
 * @throws {FatalDiagnosticError} If the recognized initializer API is
 *   incompatible.
 */
function validateAccessOfInitializerApiMember({ api, call }, member) {
    if (!api.allowedAccessLevels.includes(member.accessLevel)) {
        throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_DISALLOWED_MEMBER_VISIBILITY, call, makeDiagnosticChain(`Cannot use "${api.functionName}" on a class member that is declared as ${classMemberAccessLevelToString(member.accessLevel)}.`, [
            makeDiagnosticChain(`Update the class field to be either: ` +
                api.allowedAccessLevels.map((l) => classMemberAccessLevelToString(l)).join(', ')),
        ]));
    }
}

/**
 * Attempts to identify an Angular initializer function call.
 *
 * Note that multiple possible initializer API function names can be specified,
 * allowing for checking multiple types in one pass.
 *
 * @returns The parsed initializer API, or null if none was found.
 */
function tryParseInitializerApi(functions, expression, reflector, importTracker) {
    if (!ts.isCallExpression(expression)) {
        return null;
    }
    const staticResult = parseTopLevelCall(expression, functions, importTracker) ||
        parseTopLevelRequiredCall(expression, functions, importTracker) ||
        parseTopLevelCallFromNamespace(expression, functions, importTracker);
    if (staticResult === null) {
        return null;
    }
    const { api, apiReference, isRequired } = staticResult;
    // Once we've statically determined that the initializer is one of the APIs we're looking for, we
    // need to verify it using the type checker which accounts for things like shadowed variables.
    // This should be done as the absolute last step since using the type check can be expensive.
    const resolvedImport = reflector.getImportOfIdentifier(apiReference);
    if (resolvedImport === null ||
        api.functionName !== resolvedImport.name ||
        api.owningModule !== resolvedImport.from) {
        return null;
    }
    return {
        api,
        call: expression,
        isRequired,
    };
}
/**
 * Attempts to parse a top-level call to an initializer function,
 * e.g. `prop = input()`. Returns null if it can't be parsed.
 */
function parseTopLevelCall(call, functions, importTracker) {
    const node = call.expression;
    if (!ts.isIdentifier(node)) {
        return null;
    }
    const matchingApi = functions.find((fn) => importTracker.isPotentialReferenceToNamedImport(node, fn.functionName, fn.owningModule));
    if (matchingApi === undefined) {
        return null;
    }
    return { api: matchingApi, apiReference: node, isRequired: false };
}
/**
 * Attempts to parse a top-level call to a required initializer,
 * e.g. `prop = input.required()`. Returns null if it can't be parsed.
 */
function parseTopLevelRequiredCall(call, functions, importTracker) {
    const node = call.expression;
    if (!ts.isPropertyAccessExpression(node) ||
        !ts.isIdentifier(node.expression) ||
        node.name.text !== 'required') {
        return null;
    }
    const expression = node.expression;
    const matchingApi = functions.find((fn) => importTracker.isPotentialReferenceToNamedImport(expression, fn.functionName, fn.owningModule));
    if (matchingApi === undefined) {
        return null;
    }
    return { api: matchingApi, apiReference: expression, isRequired: true };
}
/**
 * Attempts to parse a top-level call to a function referenced via a namespace import,
 * e.g. `prop = core.input.required()`. Returns null if it can't be parsed.
 */
function parseTopLevelCallFromNamespace(call, functions, importTracker) {
    const node = call.expression;
    if (!ts.isPropertyAccessExpression(node)) {
        return null;
    }
    let apiReference = null;
    let matchingApi = undefined;
    let isRequired = false;
    // `prop = core.input()`
    if (ts.isIdentifier(node.expression) && ts.isIdentifier(node.name)) {
        const namespaceRef = node.expression;
        apiReference = node.name;
        matchingApi = functions.find((fn) => node.name.text === fn.functionName &&
            importTracker.isPotentialReferenceToNamespaceImport(namespaceRef, fn.owningModule));
    }
    else if (
    // `prop = core.input.required()`
    ts.isPropertyAccessExpression(node.expression) &&
        ts.isIdentifier(node.expression.expression) &&
        ts.isIdentifier(node.expression.name) &&
        node.name.text === 'required') {
        const potentialName = node.expression.name.text;
        const namespaceRef = node.expression.expression;
        apiReference = node.expression.name;
        matchingApi = functions.find((fn) => fn.functionName === potentialName &&
            importTracker.isPotentialReferenceToNamespaceImport(namespaceRef, fn.owningModule));
        isRequired = true;
    }
    if (matchingApi === undefined || apiReference === null) {
        return null;
    }
    return { api: matchingApi, apiReference, isRequired };
}

/**
 * Parses and validates input and output initializer function options.
 *
 * This currently only parses the `alias` option and returns it. The other
 * options for signal inputs are runtime constructs that aren't relevant at
 * compile time.
 */
function parseAndValidateInputAndOutputOptions(optionsNode) {
    if (!ts.isObjectLiteralExpression(optionsNode)) {
        throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, optionsNode, 'Argument needs to be an object literal that is statically analyzable.');
    }
    const options = reflectObjectLiteral(optionsNode);
    let alias = undefined;
    if (options.has('alias')) {
        const aliasExpr = options.get('alias');
        if (!ts.isStringLiteralLike(aliasExpr)) {
            throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, aliasExpr, 'Alias needs to be a string that is statically analyzable.');
        }
        alias = aliasExpr.text;
    }
    return { alias };
}

/** Represents a function that can declare an input. */
const INPUT_INITIALIZER_FN = {
    functionName: 'input',
    owningModule: '@angular/core',
    // Inputs are accessed from parents, via the `property` instruction.
    // Conceptually, the fields need to be publicly readable, but in practice,
    // accessing `protected` or `private` members works at runtime, so we can allow
    // cases where the input is intentionally not part of the public API, programmatically.
    // Note: `private` is omitted intentionally as this would be a conceptual confusion point.
    allowedAccessLevels: [
        exports.ClassMemberAccessLevel.PublicWritable,
        exports.ClassMemberAccessLevel.PublicReadonly,
        exports.ClassMemberAccessLevel.Protected,
    ],
};
/**
 * Attempts to parse a signal input class member. Returns the parsed
 * input mapping if possible.
 */
function tryParseSignalInputMapping(member, reflector, importTracker) {
    if (member.value === null) {
        return null;
    }
    const signalInput = tryParseInitializerApi([INPUT_INITIALIZER_FN], member.value, reflector, importTracker);
    if (signalInput === null) {
        return null;
    }
    validateAccessOfInitializerApiMember(signalInput, member);
    const optionsNode = (signalInput.isRequired ? signalInput.call.arguments[0] : signalInput.call.arguments[1]);
    const options = optionsNode !== undefined ? parseAndValidateInputAndOutputOptions(optionsNode) : null;
    const classPropertyName = member.name;
    return {
        isSignal: true,
        classPropertyName,
        bindingPropertyName: options?.alias ?? classPropertyName,
        required: signalInput.isRequired,
        // Signal inputs do not capture complex transform metadata.
        // See more details in the `transform` type of `InputMapping`.
        transform: null,
    };
}

/** Represents a function that can declare a model. */
const MODEL_INITIALIZER_FN = {
    functionName: 'model',
    owningModule: '@angular/core',
    // Inputs are accessed from parents, via the `property` instruction.
    // Conceptually, the fields need to be publicly readable, but in practice,
    // accessing `protected` or `private` members works at runtime, so we can allow
    // cases where the input is intentionally not part of the public API, programmatically.
    allowedAccessLevels: [
        exports.ClassMemberAccessLevel.PublicWritable,
        exports.ClassMemberAccessLevel.PublicReadonly,
        exports.ClassMemberAccessLevel.Protected,
    ],
};
/**
 * Attempts to parse a model class member. Returns the parsed model mapping if possible.
 */
function tryParseSignalModelMapping(member, reflector, importTracker) {
    if (member.value === null) {
        return null;
    }
    const model = tryParseInitializerApi([MODEL_INITIALIZER_FN], member.value, reflector, importTracker);
    if (model === null) {
        return null;
    }
    validateAccessOfInitializerApiMember(model, member);
    const optionsNode = (model.isRequired ? model.call.arguments[0] : model.call.arguments[1]);
    const options = optionsNode !== undefined ? parseAndValidateInputAndOutputOptions(optionsNode) : null;
    const classPropertyName = member.name;
    const bindingPropertyName = options?.alias ?? classPropertyName;
    return {
        call: model.call,
        input: {
            isSignal: true,
            transform: null,
            classPropertyName,
            bindingPropertyName,
            required: model.isRequired,
        },
        output: {
            isSignal: false,
            classPropertyName,
            bindingPropertyName: bindingPropertyName + 'Change',
        },
    };
}

// Outputs are accessed from parents, via the `listener` instruction.
// Conceptually, the fields need to be publicly readable, but in practice,
// accessing `protected` or `private` members works at runtime, so we can allow
// such outputs that may not want to expose the `OutputRef` as part of the
// component API, programmatically.
// Note: `private` is omitted intentionally as this would be a conceptual confusion point.
const allowedAccessLevels = [
    exports.ClassMemberAccessLevel.PublicWritable,
    exports.ClassMemberAccessLevel.PublicReadonly,
    exports.ClassMemberAccessLevel.Protected,
];
/** Possible functions that can declare an output. */
const OUTPUT_INITIALIZER_FNS = [
    {
        functionName: 'output',
        owningModule: '@angular/core',
        allowedAccessLevels,
    },
    {
        functionName: 'outputFromObservable',
        owningModule: '@angular/core/rxjs-interop',
        allowedAccessLevels,
    },
];
/**
 * Attempts to parse a signal output class member. Returns the parsed
 * input mapping if possible.
 */
function tryParseInitializerBasedOutput(member, reflector, importTracker) {
    if (member.value === null) {
        return null;
    }
    const output = tryParseInitializerApi(OUTPUT_INITIALIZER_FNS, member.value, reflector, importTracker);
    if (output === null) {
        return null;
    }
    if (output.isRequired) {
        throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_NO_REQUIRED_FUNCTION, output.call, `Output does not support ".required()".`);
    }
    validateAccessOfInitializerApiMember(output, member);
    // Options are the first parameter for `output()`, while for
    // the interop `outputFromObservable()` they are the second argument.
    const optionsNode = (output.api.functionName === 'output' ? output.call.arguments[0] : output.call.arguments[1]);
    const options = optionsNode !== undefined ? parseAndValidateInputAndOutputOptions(optionsNode) : null;
    const classPropertyName = member.name;
    return {
        call: output.call,
        metadata: {
            // Outputs are not signal-based.
            isSignal: false,
            classPropertyName,
            bindingPropertyName: options?.alias ?? classPropertyName,
        },
    };
}

/** Possible names of query initializer APIs. */
const queryFunctionNames = [
    'viewChild',
    'viewChildren',
    'contentChild',
    'contentChildren',
];
/** Possible query initializer API functions. */
const QUERY_INITIALIZER_FNS = queryFunctionNames.map((fnName) => ({
    functionName: fnName,
    owningModule: '@angular/core',
    // Queries are accessed from within static blocks, via the query definition functions.
    // Conceptually, the fields could access private members— even ES private fields.
    // Support for ES private fields requires special caution and complexity when partial
    // output is linked— hence not supported. TS private members are allowed in static blocks.
    allowedAccessLevels: [
        exports.ClassMemberAccessLevel.PublicWritable,
        exports.ClassMemberAccessLevel.PublicReadonly,
        exports.ClassMemberAccessLevel.Protected,
        exports.ClassMemberAccessLevel.Private,
    ],
}));
// The `descendants` option is enabled by default, except for content children.
const defaultDescendantsValue = (type) => type !== 'contentChildren';
/**
 * Attempts to detect a possible query definition for the given class member.
 *
 * This function checks for all possible variants of queries and matches the
 * first one. The query is then analyzed and its resolved metadata is returned.
 *
 * @returns Resolved query metadata, or null if no query is declared.
 */
function tryParseSignalQueryFromInitializer(member, reflector, importTracker) {
    if (member.value === null) {
        return null;
    }
    const query = tryParseInitializerApi(QUERY_INITIALIZER_FNS, member.value, reflector, importTracker);
    if (query === null) {
        return null;
    }
    validateAccessOfInitializerApiMember(query, member);
    const { functionName } = query.api;
    const isSingleQuery = functionName === 'viewChild' || functionName === 'contentChild';
    const predicateNode = query.call.arguments[0];
    if (predicateNode === undefined) {
        throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, query.call, 'No locator specified.');
    }
    const optionsNode = query.call.arguments[1];
    if (optionsNode !== undefined && !ts.isObjectLiteralExpression(optionsNode)) {
        throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, optionsNode, 'Argument needs to be an object literal.');
    }
    const options = optionsNode && reflectObjectLiteral(optionsNode);
    const read = options?.has('read') ? parseReadOption(options.get('read')) : null;
    const descendants = options?.has('descendants')
        ? parseDescendantsOption(options.get('descendants'))
        : defaultDescendantsValue(functionName);
    return {
        name: functionName,
        call: query.call,
        metadata: {
            isSignal: true,
            propertyName: member.name,
            static: false,
            emitDistinctChangesOnly: true,
               predicate: parseLocator(predicateNode, reflector),
            first: isSingleQuery,
            read,
            descendants,
        },
    };
}
/** Parses the locator/predicate of the query. */
function parseLocator(expression, reflector) {
    // Attempt to unwrap `forwardRef` calls.
    const unwrappedExpression = tryUnwrapForwardRef(expression, reflector);
    if (unwrappedExpression !== null) {
        expression = unwrappedExpression;
    }
    if (ts.isStringLiteralLike(expression)) {
        return [expression.text];
    }
    return createMayBeForwardRefExpression(new WrappedNodeExpr(expression), unwrappedExpression !== null ? 2 /* ForwardRefHandling.Unwrapped */ : 0 /* ForwardRefHandling.None */);
}
/**
 * Parses the `read` option of a query.
 *
 * We only support the following patterns for the `read` option:
 *     - `read: someImport.BLA`,
 *     - `read: BLA`
 *
 * That is because we cannot trivially support complex expressions,
 * especially those referencing `this`. The read provider token will
 * live outside of the class in the static class definition.
 */
function parseReadOption(value) {
    if (ts.isExpressionWithTypeArguments(value) ||
        ts.isParenthesizedExpression(value) ||
        ts.isAsExpression(value)) {
        return parseReadOption(value.expression);
    }
    if ((ts.isPropertyAccessExpression(value) && ts.isIdentifier(value.expression)) ||
        ts.isIdentifier(value)) {
        return new WrappedNodeExpr(value);
    }
    throw new FatalDiagnosticError(exports.ErrorCode.VALUE_NOT_LITERAL, value, `Query "read" option expected a literal class reference.`);
}
/** Parses the `descendants` option of a query. */
function parseDescendantsOption(value) {
    if (value.kind === ts.SyntaxKind.TrueKeyword) {
        return true;
    }
    else if (value.kind === ts.SyntaxKind.FalseKeyword) {
        return false;
    }
    throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, value, `Expected "descendants" option to be a boolean literal.`);
}

const EMPTY_OBJECT = {};
const queryDecoratorNames = [
    'ViewChild',
    'ViewChildren',
    'ContentChild',
    'ContentChildren',
];
const QUERY_TYPES = new Set(queryDecoratorNames);
/**
 * Helper function to extract metadata from a `Directive` or `Component`. `Directive`s without a
 * selector are allowed to be used for abstract base classes. These abstract directives should not
 * appear in the declarations of an `NgModule` and additional verification is done when processing
 * the module.
 */
function extractDirectiveMetadata(clazz, decorator, reflector, importTracker, evaluator, refEmitter, referencesRegistry, isCore, annotateForClosureCompiler, compilationMode, defaultSelector, strictStandalone, implicitStandaloneValue) {
    let directive;
    if (decorator.args === null || decorator.args.length === 0) {
        directive = new Map();
    }
    else if (decorator.args.length !== 1) {
        throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, decorator.node, `Incorrect number of arguments to @${decorator.name} decorator`);
    }
    else {
        const meta = unwrapExpression(decorator.args[0]);
        if (!ts.isObjectLiteralExpression(meta)) {
            throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARG_NOT_LITERAL, meta, `@${decorator.name} argument must be an object literal`);
        }
        directive = reflectObjectLiteral(meta);
    }
    if (directive.has('jit')) {
        // The only allowed value is true, so there's no need to expand further.
        return { jitForced: true };
    }
    const members = reflector.getMembersOfClass(clazz);
    // Precompute a list of ts.ClassElements that have decorators. This includes things like @Input,
    // @Output, @HostBinding, etc.
    const decoratedElements = members.filter((member) => !member.isStatic && member.decorators !== null);
    const coreModule = isCore ? undefined : '@angular/core';
    // Construct the map of inputs both from the @Directive/@Component
    // decorator, and the decorated fields.
    const inputsFromMeta = parseInputsArray(clazz, directive, evaluator, reflector, refEmitter, compilationMode);
    const inputsFromFields = parseInputFields(clazz, members, evaluator, reflector, importTracker, refEmitter, isCore, compilationMode, inputsFromMeta, decorator);
    const inputs = ClassPropertyMapping.fromMappedObject({ ...inputsFromMeta, ...inputsFromFields });
    // And outputs.
    const outputsFromMeta = parseOutputsArray(directive, evaluator);
    const outputsFromFields = parseOutputFields(clazz, decorator, members, isCore, reflector, importTracker, evaluator, outputsFromMeta);
    const outputs = ClassPropertyMapping.fromMappedObject({ ...outputsFromMeta, ...outputsFromFields });
    // Parse queries of fields.
    const { viewQueries, contentQueries } = parseQueriesOfClassFields(members, reflector, importTracker, evaluator, isCore);
    if (directive.has('queries')) {
        const signalQueryFields = new Set([...viewQueries, ...contentQueries].filter((q) => q.isSignal).map((q) => q.propertyName));
        const queriesFromDecorator = extractQueriesFromDecorator(directive.get('queries'), reflector, evaluator, isCore);
        // Checks if the query is already declared/reserved via class members declaration.
        // If so, we throw a fatal diagnostic error to prevent this unintentional pattern.
        const checkAndUnwrapQuery = (q) => {
            if (signalQueryFields.has(q.metadata.propertyName)) {
                throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_DECORATOR_METADATA_COLLISION, q.expr, `Query is declared multiple times. "@${decorator.name}" declares a query for the same property.`);
            }
            return q.metadata;
        };
        contentQueries.push(...queriesFromDecorator.content.map((q) => checkAndUnwrapQuery(q)));
        viewQueries.push(...queriesFromDecorator.view.map((q) => checkAndUnwrapQuery(q)));
    }
    // Parse the selector.
    let selector = defaultSelector;
    if (directive.has('selector')) {
        const expr = directive.get('selector');
        const resolved = evaluator.evaluate(expr);
        assertLocalCompilationUnresolvedConst(compilationMode, resolved, null, 'Unresolved identifier found for @Component.selector field! Did you ' +
            'import this identifier from a file outside of the compilation unit? ' +
            'This is not allowed when Angular compiler runs in local mode. Possible ' +
            'solutions: 1) Move the declarations into a file within the compilation ' +
            'unit, 2) Inline the selector');
        if (typeof resolved !== 'string') {
            throw createValueHasWrongTypeError(expr, resolved, `selector must be a string`);
        }
        // use default selector in case selector is an empty string
        selector = resolved === '' ? defaultSelector : resolved;
        if (!selector) {
            throw new FatalDiagnosticError(exports.ErrorCode.DIRECTIVE_MISSING_SELECTOR, expr, `Directive ${clazz.name.text} has no selector, please add it!`);
        }
    }
    const host = extractHostBindings(decoratedElements, evaluator, coreModule, compilationMode, directive);
    const providers = directive.has('providers')
        ? new WrappedNodeExpr(annotateForClosureCompiler
            ? wrapFunctionExpressionsInParens(directive.get('providers'))
            : directive.get('providers'))
        : null;
    // Determine if `ngOnChanges` is a lifecycle hook defined on the component.
    const usesOnChanges = members.some((member) => !member.isStatic && member.kind === exports.ClassMemberKind.Method && member.name === 'ngOnChanges');
    // Parse exportAs.
    let exportAs = null;
    if (directive.has('exportAs')) {
        const expr = directive.get('exportAs');
        const resolved = evaluator.evaluate(expr);
        assertLocalCompilationUnresolvedConst(compilationMode, resolved, null, 'Unresolved identifier found for exportAs field! Did you import this ' +
            'identifier from a file outside of the compilation unit? This is not ' +
            'allowed when Angular compiler runs in local mode. Possible solutions: ' +
            '1) Move the declarations into a file within the compilation unit, ' +
            '2) Inline the selector');
        if (typeof resolved !== 'string') {
            throw createValueHasWrongTypeError(expr, resolved, `exportAs must be a string`);
        }
        exportAs = resolved.split(',').map((part) => part.trim());
    }
    const rawCtorDeps = getConstructorDependencies(clazz, reflector, isCore);
    // Non-abstract directives (those with a selector) require valid constructor dependencies, whereas
    // abstract directives are allowed to have invalid dependencies, given that a subclass may call
    // the constructor explicitly.
    const ctorDeps = selector !== null
        ? validateConstructorDependencies(clazz, rawCtorDeps)
        : unwrapConstructorDependencies(rawCtorDeps);
    // Structural directives must have a `TemplateRef` dependency.
    const isStructural = ctorDeps !== null &&
        ctorDeps !== 'invalid' &&
        ctorDeps.some((dep) => dep.token instanceof ExternalExpr &&
            dep.token.value.moduleName === '@angular/core' &&
            dep.token.value.name === 'TemplateRef');
    let isStandalone = implicitStandaloneValue;
    if (directive.has('standalone')) {
        const expr = directive.get('standalone');
        const resolved = evaluator.evaluate(expr);
        if (typeof resolved !== 'boolean') {
            throw createValueHasWrongTypeError(expr, resolved, `standalone flag must be a boolean`);
        }
        isStandalone = resolved;
        if (!isStandalone && strictStandalone) {
            throw new FatalDiagnosticError(exports.ErrorCode.NON_STANDALONE_NOT_ALLOWED, expr, `Only standalone components/directives are allowed when 'strictStandalone' is enabled.`);
        }
    }
    let isSignal = false;
    if (directive.has('signals')) {
        const expr = directive.get('signals');
        const resolved = evaluator.evaluate(expr);
        if (typeof resolved !== 'boolean') {
            throw createValueHasWrongTypeError(expr, resolved, `signals flag must be a boolean`);
        }
        isSignal = resolved;
    }
    // Detect if the component inherits from another class
    const usesInheritance = reflector.hasBaseClass(clazz);
    const sourceFile = clazz.getSourceFile();
    const type = wrapTypeReference(reflector, clazz);
    const rawHostDirectives = directive.get('hostDirectives') || null;
    const hostDirectives = rawHostDirectives === null
        ? null
        : extractHostDirectives(rawHostDirectives, evaluator, compilationMode, createForwardRefResolver(isCore));
    if (compilationMode !== exports.CompilationMode.LOCAL && hostDirectives !== null) {
        // In global compilation mode where we do type checking, the template type-checker will need to
        // import host directive types, so add them as referenced by `clazz`. This will ensure that
        // libraries are required to export host directives which are visible from publicly exported
        // components.
        referencesRegistry.add(clazz, ...hostDirectives.map((hostDir) => {
            if (!isHostDirectiveMetaForGlobalMode(hostDir)) {
                throw new Error('Impossible state');
            }
            return hostDir.directive;
        }));
    }
    const metadata = {
        name: clazz.name.text,
        deps: ctorDeps,
        host: {
            ...host,
        },
        lifecycle: {
            usesOnChanges,
        },
        inputs: inputs.toJointMappedObject(toR3InputMetadata),
        outputs: outputs.toDirectMappedObject(),
        queries: contentQueries,
        viewQueries,
        selector,
        fullInheritance: false,
        type,
        typeArgumentCount: reflector.getGenericArityOfClass(clazz) || 0,
        typeSourceSpan: createSourceSpan(clazz.name),
        usesInheritance,
        exportAs,
        providers,
        isStandalone,
        isSignal,
        hostDirectives: hostDirectives?.map((hostDir) => toHostDirectiveMetadata(hostDir, sourceFile, refEmitter)) ||
            null,
    };
    return {
        jitForced: false,
        decorator: directive,
        metadata,
        inputs,
        outputs,
        isStructural,
        hostDirectives,
        rawHostDirectives,
        // Track inputs from class metadata. This is useful for migration efforts.
        inputFieldNamesFromMetadataArray: new Set(Object.values(inputsFromMeta).map((i) => i.classPropertyName)),
    };
}
function extractDecoratorQueryMetadata(exprNode, name, args, propertyName, reflector, evaluator) {
    if (args.length === 0) {
        throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, exprNode, `@${name} must have arguments`);
    }
    const first = name === 'ViewChild' || name === 'ContentChild';
    const forwardReferenceTarget = tryUnwrapForwardRef(args[0], reflector);
    const node = forwardReferenceTarget ?? args[0];
    const arg = evaluator.evaluate(node);
    /** Whether or not this query should collect only static results (see view/api.ts)  */
    let isStatic = false;
    // Extract the predicate
    let predicate = null;
    if (arg instanceof Reference || arg instanceof DynamicValue) {
        // References and predicates that could not be evaluated statically are emitted as is.
        predicate = createMayBeForwardRefExpression(new WrappedNodeExpr(node), forwardReferenceTarget !== null ? 2 /* ForwardRefHandling.Unwrapped */ : 0 /* ForwardRefHandling.None */);
    }
    else if (typeof arg === 'string') {
        predicate = [arg];
    }
    else if (isStringArrayOrDie(arg, `@${name} predicate`, node)) {
        predicate = arg;
    }
    else {
        throw createValueHasWrongTypeError(node, arg, `@${name} predicate cannot be interpreted`);
    }
    // Extract the read and descendants options.
    let read = null;
    // The default value for descendants is true for every decorator except @ContentChildren.
    let descendants = name !== 'ContentChildren';
    let emitDistinctChangesOnly = emitDistinctChangesOnlyDefaultValue;
    if (args.length === 2) {
        const optionsExpr = unwrapExpression(args[1]);
        if (!ts.isObjectLiteralExpression(optionsExpr)) {
            throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARG_NOT_LITERAL, optionsExpr, `@${name} options must be an object literal`);
        }
        const options = reflectObjectLiteral(optionsExpr);
        if (options.has('read')) {
            read = new WrappedNodeExpr(options.get('read'));
        }
        if (options.has('descendants')) {
            const descendantsExpr = options.get('descendants');
            const descendantsValue = evaluator.evaluate(descendantsExpr);
            if (typeof descendantsValue !== 'boolean') {
                throw createValueHasWrongTypeError(descendantsExpr, descendantsValue, `@${name} options.descendants must be a boolean`);
            }
            descendants = descendantsValue;
        }
        if (options.has('emitDistinctChangesOnly')) {
            const emitDistinctChangesOnlyExpr = options.get('emitDistinctChangesOnly');
            const emitDistinctChangesOnlyValue = evaluator.evaluate(emitDistinctChangesOnlyExpr);
            if (typeof emitDistinctChangesOnlyValue !== 'boolean') {
                throw createValueHasWrongTypeError(emitDistinctChangesOnlyExpr, emitDistinctChangesOnlyValue, `@${name} options.emitDistinctChangesOnly must be a boolean`);
            }
            emitDistinctChangesOnly = emitDistinctChangesOnlyValue;
        }
        if (options.has('static')) {
            const staticValue = evaluator.evaluate(options.get('static'));
            if (typeof staticValue !== 'boolean') {
                throw createValueHasWrongTypeError(node, staticValue, `@${name} options.static must be a boolean`);
            }
            isStatic = staticValue;
        }
    }
    else if (args.length > 2) {
        // Too many arguments.
        throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, node, `@${name} has too many arguments`);
    }
    return {
        isSignal: false,
        propertyName,
        predicate,
        first,
        descendants,
        read,
        static: isStatic,
        emitDistinctChangesOnly,
    };
}
function extractHostBindings(members, evaluator, coreModule, compilationMode, metadata) {
    let bindings;
    if (metadata && metadata.has('host')) {
        bindings = evaluateHostExpressionBindings(metadata.get('host'), evaluator);
    }
    else {
        bindings = parseHostBindings({});
    }
    filterToMembersWithDecorator(members, 'HostBinding', coreModule).forEach(({ member, decorators }) => {
        decorators.forEach((decorator) => {
            let hostPropertyName = member.name;
            if (decorator.args !== null && decorator.args.length > 0) {
                if (decorator.args.length !== 1) {
                    throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, decorator.node, `@HostBinding can have at most one argument, got ${decorator.args.length} argument(s)`);
                }
                const resolved = evaluator.evaluate(decorator.args[0]);
                // Specific error for local compilation mode if the argument cannot be resolved
                assertLocalCompilationUnresolvedConst(compilationMode, resolved, null, "Unresolved identifier found for @HostBinding's argument! Did " +
                    'you import this identifier from a file outside of the compilation ' +
                    'unit? This is not allowed when Angular compiler runs in local mode. ' +
                    'Possible solutions: 1) Move the declaration into a file within ' +
                    'the compilation unit, 2) Inline the argument');
                if (typeof resolved !== 'string') {
                    throw createValueHasWrongTypeError(decorator.node, resolved, `@HostBinding's argument must be a string`);
                }
                hostPropertyName = resolved;
            }
            // Since this is a decorator, we know that the value is a class member. Always access it
            // through `this` so that further down the line it can't be confused for a literal value
            // (e.g. if there's a property called `true`). There is no size penalty, because all
            // values (except literals) are converted to `ctx.propName` eventually.
            bindings.properties[hostPropertyName] = getSafePropertyAccessString('this', member.name);
        });
    });
    filterToMembersWithDecorator(members, 'HostListener', coreModule).forEach(({ member, decorators }) => {
        decorators.forEach((decorator) => {
            let eventName = member.name;
            let args = [];
            if (decorator.args !== null && decorator.args.length > 0) {
                if (decorator.args.length > 2) {
                    throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, decorator.args[2], `@HostListener can have at most two arguments`);
                }
                const resolved = evaluator.evaluate(decorator.args[0]);
                // Specific error for local compilation mode if the event name cannot be resolved
                assertLocalCompilationUnresolvedConst(compilationMode, resolved, null, "Unresolved identifier found for @HostListener's event name " +
                    'argument! Did you import this identifier from a file outside of ' +
                    'the compilation unit? This is not allowed when Angular compiler ' +
                    'runs in local mode. Possible solutions: 1) Move the declaration ' +
                    'into a file within the compilation unit, 2) Inline the argument');
                if (typeof resolved !== 'string') {
                    throw createValueHasWrongTypeError(decorator.args[0], resolved, `@HostListener's event name argument must be a string`);
                }
                eventName = resolved;
                if (decorator.args.length === 2) {
                    const expression = decorator.args[1];
                    const resolvedArgs = evaluator.evaluate(decorator.args[1]);
                    if (!isStringArrayOrDie(resolvedArgs, '@HostListener.args', expression)) {
                        throw createValueHasWrongTypeError(decorator.args[1], resolvedArgs, `@HostListener's second argument must be a string array`);
                    }
                    args = resolvedArgs;
                }
            }
            bindings.listeners[eventName] = `${member.name}(${args.join(',')})`;
        });
    });
    return bindings;
}
function extractQueriesFromDecorator(queryData, reflector, evaluator, isCore) {
    const content = [];
    const view = [];
    if (!ts.isObjectLiteralExpression(queryData)) {
        throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, queryData, 'Decorator queries metadata must be an object literal');
    }
    reflectObjectLiteral(queryData).forEach((queryExpr, propertyName) => {
        queryExpr = unwrapExpression(queryExpr);
        if (!ts.isNewExpression(queryExpr)) {
            throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, queryData, 'Decorator query metadata must be an instance of a query type');
        }
        const queryType = ts.isPropertyAccessExpression(queryExpr.expression)
            ? queryExpr.expression.name
            : queryExpr.expression;
        if (!ts.isIdentifier(queryType)) {
            throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, queryData, 'Decorator query metadata must be an instance of a query type');
        }
        const type = reflector.getImportOfIdentifier(queryType);
        if (type === null ||
            (!isCore && type.from !== '@angular/core') ||
            !QUERY_TYPES.has(type.name)) {
            throw new FatalDiagnosticError(exports.ErrorCode.VALUE_HAS_WRONG_TYPE, queryData, 'Decorator query metadata must be an instance of a query type');
        }
        const query = extractDecoratorQueryMetadata(queryExpr, type.name, queryExpr.arguments || [], propertyName, reflector, evaluator);
        if (type.name.startsWith('Content')) {
            content.push({ expr: queryExpr, metadata: query });
        }
        else {
            view.push({ expr: queryExpr, metadata: query });
        }
    });
    return { content, view };
}
function parseDirectiveStyles(directive, evaluator, compilationMode) {
    const expression = directive.get('styles');
    if (!expression) {
        return null;
    }
    const evaluated = evaluator.evaluate(expression);
    const value = typeof evaluated === 'string' ? [evaluated] : evaluated;
    // Check if the identifier used for @Component.styles cannot be resolved in local compilation
    // mode. if the case, an error specific to this situation is generated.
    if (compilationMode === exports.CompilationMode.LOCAL) {
        let unresolvedNode = null;
        if (Array.isArray(value)) {
            const entry = value.find((e) => e instanceof DynamicValue && e.isFromUnknownIdentifier());
            unresolvedNode = entry?.node ?? null;
        }
        else if (value instanceof DynamicValue && value.isFromUnknownIdentifier()) {
            unresolvedNode = value.node;
        }
        if (unresolvedNode !== null) {
            throw new FatalDiagnosticError(exports.ErrorCode.LOCAL_COMPILATION_UNRESOLVED_CONST, unresolvedNode, 'Unresolved identifier found for @Component.styles field! Did you import ' +
                'this identifier from a file outside of the compilation unit? This is ' +
                'not allowed when Angular compiler runs in local mode. Possible ' +
                'solutions: 1) Move the declarations into a file within the compilation ' +
                'unit, 2) Inline the styles, 3) Move the styles into separate files and ' +
                'include it using @Component.styleUrls');
        }
    }
    if (!isStringArrayOrDie(value, 'styles', expression)) {
        throw createValueHasWrongTypeError(expression, value, `Failed to resolve @Component.styles to a string or an array of strings`);
    }
    return value;
}
function parseFieldStringArrayValue(directive, field, evaluator) {
    if (!directive.has(field)) {
        return null;
    }
    // Resolve the field of interest from the directive metadata to a string[].
    const expression = directive.get(field);
    const value = evaluator.evaluate(expression);
    if (!isStringArrayOrDie(value, field, expression)) {
        throw createValueHasWrongTypeError(expression, value, `Failed to resolve @Directive.${field} to a string array`);
    }
    return value;
}
function isStringArrayOrDie(value, name, node) {
    if (!Array.isArray(value)) {
        return false;
    }
    for (let i = 0; i < value.length; i++) {
        if (typeof value[i] !== 'string') {
            throw createValueHasWrongTypeError(node, value[i], `Failed to resolve ${name} at position ${i} to a string`);
        }
    }
    return true;
}
function tryGetQueryFromFieldDecorator(member, reflector, evaluator, isCore) {
    const decorators = member.decorators;
    if (decorators === null) {
        return null;
    }
    const queryDecorators = getAngularDecorators(decorators, queryDecoratorNames, isCore);
    if (queryDecorators.length === 0) {
        return null;
    }
    if (queryDecorators.length !== 1) {
        throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_COLLISION, member.node ?? queryDecorators[0].node, 'Cannot combine multiple query decorators.');
    }
    const decorator = queryDecorators[0];
    const node = member.node || decorator.node;
    // Throw in case of `@Input() @ContentChild('foo') foo: any`, which is not supported in Ivy
    if (decorators.some((v) => v.name === 'Input')) {
        throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_COLLISION, node, 'Cannot combine @Input decorators with query decorators');
    }
    if (!isPropertyTypeMember(member)) {
        throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_UNEXPECTED, node, 'Query decorator must go on a property-type member');
    }
    // Either the decorator was aliased, or is referenced directly with
    // the proper query name.
    const name = (decorator.import?.name ?? decorator.name);
    return {
        name,
        decorator,
        metadata: extractDecoratorQueryMetadata(node, name, decorator.args || [], member.name, reflector, evaluator),
    };
}
function isPropertyTypeMember(member) {
    return (member.kind === exports.ClassMemberKind.Getter ||
        member.kind === exports.ClassMemberKind.Setter ||
        member.kind === exports.ClassMemberKind.Property);
}
function parseMappingStringArray(values) {
    return values.reduce((results, value) => {
        if (typeof value !== 'string') {
            throw new Error('Mapping value must be a string');
        }
        const [bindingPropertyName, fieldName] = parseMappingString(value);
        results[fieldName] = bindingPropertyName;
        return results;
    }, {});
}
function parseMappingString(value) {
    // Either the value is 'field' or 'field: property'. In the first case, `property` will
    // be undefined, in which case the field name should also be used as the property name.
    const [fieldName, bindingPropertyName] = value.split(':', 2).map((str) => str.trim());
    return [bindingPropertyName ?? fieldName, fieldName];
}
/** Parses the `inputs` array of a directive/component decorator. */
function parseInputsArray(clazz, decoratorMetadata, evaluator, reflector, refEmitter, compilationMode) {
    const inputsField = decoratorMetadata.get('inputs');
    if (inputsField === undefined) {
        return {};
    }
    const inputs = {};
    const inputsArray = evaluator.evaluate(inputsField);
    if (!Array.isArray(inputsArray)) {
        throw createValueHasWrongTypeError(inputsField, inputsArray, `Failed to resolve @Directive.inputs to an array`);
    }
    for (let i = 0; i < inputsArray.length; i++) {
        const value = inputsArray[i];
        if (typeof value === 'string') {
            // If the value is a string, we treat it as a mapping string.
            const [bindingPropertyName, classPropertyName] = parseMappingString(value);
            inputs[classPropertyName] = {
                bindingPropertyName,
                classPropertyName,
                required: false,
                transform: null,
                // Note: Signal inputs are not allowed with the array form.
                isSignal: false,
            };
        }
        else if (value instanceof Map) {
            // If it's a map, we treat it as a config object.
            const name = value.get('name');
            const alias = value.get('alias');
            const required = value.get('required');
            let transform = null;
            if (typeof name !== 'string') {
                throw createValueHasWrongTypeError(inputsField, name, `Value at position ${i} of @Directive.inputs array must have a "name" property`);
            }
            if (value.has('transform')) {
                const transformValue = value.get('transform');
                if (!(transformValue instanceof DynamicValue) && !(transformValue instanceof Reference)) {
                    throw createValueHasWrongTypeError(inputsField, transformValue, `Transform of value at position ${i} of @Directive.inputs array must be a function`);
                }
                transform = parseDecoratorInputTransformFunction(clazz, name, transformValue, reflector, refEmitter, compilationMode);
            }
            inputs[name] = {
                classPropertyName: name,
                bindingPropertyName: typeof alias === 'string' ? alias : name,
                required: required === true,
                // Note: Signal inputs are not allowed with the array form.
                isSignal: false,
                transform,
            };
        }
        else {
            throw createValueHasWrongTypeError(inputsField, value, `@Directive.inputs array can only contain strings or object literals`);
        }
    }
    return inputs;
}
/** Attempts to find a given Angular decorator on the class member. */
function tryGetDecoratorOnMember(member, decoratorName, isCore) {
    if (member.decorators === null) {
        return null;
    }
    for (const decorator of member.decorators) {
        if (isAngularDecorator(decorator, decoratorName, isCore)) {
            return decorator;
        }
    }
    return null;
}
function tryParseInputFieldMapping(clazz, member, evaluator, reflector, importTracker, isCore, refEmitter, compilationMode) {
    const classPropertyName = member.name;
    const decorator = tryGetDecoratorOnMember(member, 'Input', isCore);
    const signalInputMapping = tryParseSignalInputMapping(member, reflector, importTracker);
    const modelInputMapping = tryParseSignalModelMapping(member, reflector, importTracker);
    if (decorator !== null && signalInputMapping !== null) {
        throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_WITH_DISALLOWED_DECORATOR, decorator.node, `Using @Input with a signal input is not allowed.`);
    }
    if (decorator !== null && modelInputMapping !== null) {
        throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_WITH_DISALLOWED_DECORATOR, decorator.node, `Using @Input with a model input is not allowed.`);
    }
    // Check `@Input` case.
    if (decorator !== null) {
        if (decorator.args !== null && decorator.args.length > 1) {
            throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, decorator.node, `@${decorator.name} can have at most one argument, got ${decorator.args.length} argument(s)`);
        }
        const optionsNode = decorator.args !== null && decorator.args.length === 1 ? decorator.args[0] : undefined;
        const options = optionsNode !== undefined ? evaluator.evaluate(optionsNode) : null;
        const required = options instanceof Map ? options.get('required') === true : false;
        // To preserve old behavior: Even though TypeScript types ensure proper options are
        // passed, we sanity check for unsupported values here again.
        if (options !== null && typeof options !== 'string' && !(options instanceof Map)) {
            throw createValueHasWrongTypeError(decorator.node, options, `@${decorator.name} decorator argument must resolve to a string or an object literal`);
        }
        let alias = null;
        if (typeof options === 'string') {
            alias = options;
        }
        else if (options instanceof Map && typeof options.get('alias') === 'string') {
            alias = options.get('alias');
        }
        const publicInputName = alias ?? classPropertyName;
        let transform = null;
        if (options instanceof Map && options.has('transform')) {
            const transformValue = options.get('transform');
            if (!(transformValue instanceof DynamicValue) && !(transformValue instanceof Reference)) {
                throw createValueHasWrongTypeError(optionsNode, transformValue, `Input transform must be a function`);
            }
            transform = parseDecoratorInputTransformFunction(clazz, classPropertyName, transformValue, reflector, refEmitter, compilationMode);
        }
        return {
            isSignal: false,
            classPropertyName,
            bindingPropertyName: publicInputName,
            transform,
            required,
        };
    }
    // Look for signal inputs. e.g. `memberName = input()`
    if (signalInputMapping !== null) {
        return signalInputMapping;
    }
    if (modelInputMapping !== null) {
        return modelInputMapping.input;
    }
    return null;
}
/** Parses the class members that declare inputs (via decorator or initializer). */
function parseInputFields(clazz, members, evaluator, reflector, importTracker, refEmitter, isCore, compilationMode, inputsFromClassDecorator, classDecorator) {
    const inputs = {};
    for (const member of members) {
        const classPropertyName = member.name;
        const inputMapping = tryParseInputFieldMapping(clazz, member, evaluator, reflector, importTracker, isCore, refEmitter, compilationMode);
        if (inputMapping === null) {
            continue;
        }
        if (member.isStatic) {
            throw new FatalDiagnosticError(exports.ErrorCode.INCORRECTLY_DECLARED_ON_STATIC_MEMBER, member.node ?? clazz, `Input "${member.name}" is incorrectly declared as static member of "${clazz.name.text}".`);
        }
        // Validate that signal inputs are not accidentally declared in the `inputs` metadata.
        if (inputMapping.isSignal && inputsFromClassDecorator.hasOwnProperty(classPropertyName)) {
            throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_DECORATOR_METADATA_COLLISION, member.node ?? clazz, `Input "${member.name}" is also declared as non-signal in @${classDecorator.name}.`);
        }
        inputs[classPropertyName] = inputMapping;
    }
    return inputs;
}
/**
 * Parses the `transform` function and its type for a decorator `@Input`.
 *
 * This logic verifies feasibility of extracting the transform write type
 * into a different place, so that the input write type can be captured at
 * a later point in a static acceptance member.
 *
 * Note: This is not needed for signal inputs where the transform type is
 * automatically captured in the type of the `InputSignal`.
 *
 */
function parseDecoratorInputTransformFunction(clazz, classPropertyName, value, reflector, refEmitter, compilationMode) {
    // In local compilation mode we can skip type checking the function args. This is because usually
    // the type check is done in a separate build which runs in full compilation mode. So here we skip
    // all the diagnostics.
    if (compilationMode === exports.CompilationMode.LOCAL) {
        const node = value instanceof Reference ? value.getIdentityIn(clazz.getSourceFile()) : value.node;
        // This should never be null since we know the reference originates
        // from the same file, but we null check it just in case.
        if (node === null) {
            throw createValueHasWrongTypeError(value.node, value, 'Input transform function could not be referenced');
        }
        return {
            node,
            type: new Reference(ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword)),
        };
    }
    const definition = reflector.getDefinitionOfFunction(value.node);
    if (definition === null) {
        throw createValueHasWrongTypeError(value.node, value, 'Input transform must be a function');
    }
    if (definition.typeParameters !== null && definition.typeParameters.length > 0) {
        throw createValueHasWrongTypeError(value.node, value, 'Input transform function cannot be generic');
    }
    if (definition.signatureCount > 1) {
        throw createValueHasWrongTypeError(value.node, value, 'Input transform function cannot have multiple signatures');
    }
    const members = reflector.getMembersOfClass(clazz);
    for (const member of members) {
        const conflictingName = `ngAcceptInputType_${classPropertyName}`;
        if (member.name === conflictingName && member.isStatic) {
            throw new FatalDiagnosticError(exports.ErrorCode.CONFLICTING_INPUT_TRANSFORM, value.node, `Class cannot have both a transform function on Input ${classPropertyName} and a static member called ${conflictingName}`);
        }
    }
    const node = value instanceof Reference ? value.getIdentityIn(clazz.getSourceFile()) : value.node;
    // This should never be null since we know the reference originates
    // from the same file, but we null check it just in case.
    if (node === null) {
        throw createValueHasWrongTypeError(value.node, value, 'Input transform function could not be referenced');
    }
    // Skip over `this` parameters since they're typing the context, not the actual parameter.
    // `this` parameters are guaranteed to be first if they exist, and the only to distinguish them
    // is using the name, TS doesn't have a special AST for them.
    const firstParam = definition.parameters[0]?.name === 'this' ? definition.parameters[1] : definition.parameters[0];
    // Treat functions with no arguments as `unknown` since returning
    // the same value from the transform function is valid.
    if (!firstParam) {
        return {
            node,
            type: new Reference(ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword)),
        };
    }
    // This should be caught by `noImplicitAny` already, but null check it just in case.
    if (!firstParam.type) {
        throw createValueHasWrongTypeError(value.node, value, 'Input transform function first parameter must have a type');
    }
    if (firstParam.node.dotDotDotToken) {
        throw createValueHasWrongTypeError(value.node, value, 'Input transform function first parameter cannot be a spread parameter');
    }
    assertEmittableInputType(firstParam.type, clazz.getSourceFile(), reflector, refEmitter);
    const viaModule = value instanceof Reference ? value.bestGuessOwningModule : null;
    return { node, type: new Reference(firstParam.type, viaModule) };
}
/**
 * Verifies that a type and all types contained within
 * it can be referenced in a specific context file.
 */
function assertEmittableInputType(type, contextFile, reflector, refEmitter) {
    (function walk(node) {
        if (ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName)) {
            const declaration = reflector.getDeclarationOfIdentifier(node.typeName);
            if (declaration !== null) {
                // If the type is declared in a different file, we have to check that it can be imported
                // into the context file. If they're in the same file, we need to verify that they're
                // exported, otherwise TS won't emit it to the .d.ts.
                if (declaration.node.getSourceFile() !== contextFile) {
                    const emittedType = refEmitter.emit(new Reference(declaration.node, declaration.viaModule === AmbientImport ? AmbientImport : null), contextFile, exports.ImportFlags.NoAliasing |
                        exports.ImportFlags.AllowTypeImports |
                        exports.ImportFlags.AllowRelativeDtsImports |
                        exports.ImportFlags.AllowAmbientReferences);
                    assertSuccessfulReferenceEmit(emittedType, node, 'type');
                }
                else if (!reflector.isStaticallyExported(declaration.node)) {
                    throw new FatalDiagnosticError(exports.ErrorCode.SYMBOL_NOT_EXPORTED, type, `Symbol must be exported in order to be used as the type of an Input transform function`, [makeRelatedInformation(declaration.node, `The symbol is declared here.`)]);
                }
            }
        }
        node.forEachChild(walk);
    })(type);
}
/**
 * Iterates through all specified class members and attempts to detect
 * view and content queries defined.
 *
 * Queries may be either defined via decorators, or through class member
 * initializers for signal-based queries.
 */
function parseQueriesOfClassFields(members, reflector, importTracker, evaluator, isCore) {
    const viewQueries = [];
    const contentQueries = [];
    // For backwards compatibility, decorator-based queries are grouped and
    // ordered in a specific way. The order needs to match with what we had in:
    // https://github.com/angular/angular/blob/8737544d6963bf664f752de273e919575cca08ac/packages/compiler-cli/src/ngtsc/annotations/directive/src/shared.ts#L94-L111.
    const decoratorViewChild = [];
    const decoratorViewChildren = [];
    const decoratorContentChild = [];
    const decoratorContentChildren = [];
    for (const member of members) {
        const decoratorQuery = tryGetQueryFromFieldDecorator(member, reflector, evaluator, isCore);
        const signalQuery = tryParseSignalQueryFromInitializer(member, reflector, importTracker);
        if (decoratorQuery !== null && signalQuery !== null) {
            throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_WITH_DISALLOWED_DECORATOR, decoratorQuery.decorator.node, `Using @${decoratorQuery.name} with a signal-based query is not allowed.`);
        }
        const queryNode = decoratorQuery?.decorator.node ?? signalQuery?.call;
        if (queryNode !== undefined && member.isStatic) {
            throw new FatalDiagnosticError(exports.ErrorCode.INCORRECTLY_DECLARED_ON_STATIC_MEMBER, queryNode, `Query is incorrectly declared on a static class member.`);
        }
        if (decoratorQuery !== null) {
            switch (decoratorQuery.name) {
                case 'ViewChild':
                    decoratorViewChild.push(decoratorQuery.metadata);
                    break;
                case 'ViewChildren':
                    decoratorViewChildren.push(decoratorQuery.metadata);
                    break;
                case 'ContentChild':
                    decoratorContentChild.push(decoratorQuery.metadata);
                    break;
                case 'ContentChildren':
                    decoratorContentChildren.push(decoratorQuery.metadata);
                    break;
            }
        }
        else if (signalQuery !== null) {
            switch (signalQuery.name) {
                case 'viewChild':
                case 'viewChildren':
                    viewQueries.push(signalQuery.metadata);
                    break;
                case 'contentChild':
                case 'contentChildren':
                    contentQueries.push(signalQuery.metadata);
                    break;
            }
        }
    }
    return {
        viewQueries: [...viewQueries, ...decoratorViewChild, ...decoratorViewChildren],
        contentQueries: [...contentQueries, ...decoratorContentChild, ...decoratorContentChildren],
    };
}
/** Parses the `outputs` array of a directive/component. */
function parseOutputsArray(directive, evaluator) {
    const metaValues = parseFieldStringArrayValue(directive, 'outputs', evaluator);
    return metaValues ? parseMappingStringArray(metaValues) : EMPTY_OBJECT;
}
/** Parses the class members that are outputs. */
function parseOutputFields(clazz, classDecorator, members, isCore, reflector, importTracker, evaluator, outputsFromMeta) {
    const outputs = {};
    for (const member of members) {
        const decoratorOutput = tryParseDecoratorOutput(member, evaluator, isCore);
        const initializerOutput = tryParseInitializerBasedOutput(member, reflector, importTracker);
        const modelMapping = tryParseSignalModelMapping(member, reflector, importTracker);
        if (decoratorOutput !== null && initializerOutput !== null) {
            throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_WITH_DISALLOWED_DECORATOR, decoratorOutput.decorator.node, `Using "@Output" with "output()" is not allowed.`);
        }
        if (decoratorOutput !== null && modelMapping !== null) {
            throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_WITH_DISALLOWED_DECORATOR, decoratorOutput.decorator.node, `Using @Output with a model input is not allowed.`);
        }
        const queryNode = decoratorOutput?.decorator.node ?? initializerOutput?.call ?? modelMapping?.call;
        if (queryNode !== undefined && member.isStatic) {
            throw new FatalDiagnosticError(exports.ErrorCode.INCORRECTLY_DECLARED_ON_STATIC_MEMBER, queryNode, `Output is incorrectly declared on a static class member.`);
        }
        let bindingPropertyName;
        if (decoratorOutput !== null) {
            bindingPropertyName = decoratorOutput.metadata.bindingPropertyName;
        }
        else if (initializerOutput !== null) {
            bindingPropertyName = initializerOutput.metadata.bindingPropertyName;
        }
        else if (modelMapping !== null) {
            bindingPropertyName = modelMapping.output.bindingPropertyName;
        }
        else {
            continue;
        }
        // Validate that initializer-based outputs are not accidentally declared
        // in the `outputs` class metadata.
        if ((initializerOutput !== null || modelMapping !== null) &&
            outputsFromMeta.hasOwnProperty(member.name)) {
            throw new FatalDiagnosticError(exports.ErrorCode.INITIALIZER_API_DECORATOR_METADATA_COLLISION, member.node ?? clazz, `Output "${member.name}" is unexpectedly declared in @${classDecorator.name} as well.`);
        }
        outputs[member.name] = bindingPropertyName;
    }
    return outputs;
}
/** Attempts to parse a decorator-based @Output. */
function tryParseDecoratorOutput(member, evaluator, isCore) {
    const decorator = tryGetDecoratorOnMember(member, 'Output', isCore);
    if (decorator === null) {
        return null;
    }
    if (decorator.args !== null && decorator.args.length > 1) {
        throw new FatalDiagnosticError(exports.ErrorCode.DECORATOR_ARITY_WRONG, decorator.node, `@Output can have at most one argument, got ${decorator.args.length} argument(s)`);
    }
    const classPropertyName = member.name;
    let alias = null;
    if (decorator.args?.length === 1) {
        const resolvedAlias = evaluator.evaluate(decorator.args[0]);
        if (typeof resolvedAlias !== 'string') {
            throw createValueHasWrongTypeError(decorator.node, resolvedAlias, `@Output decorator argument must resolve to a string`);
        }
        alias = resolvedAlias;
    }
    return {
        decorator,
        metadata: {
            isSignal: false,
            classPropertyName,
            bindingPropertyName: alias ?? classPropertyName,
        },
    };
}
function evaluateHostExpressionBindings(hostExpr, evaluator) {
    const hostMetaMap = evaluator.evaluate(hostExpr);
    if (!(hostMetaMap instanceof Map)) {
        throw createValueHasWrongTypeError(hostExpr, hostMetaMap, `Decorator host metadata must be an object`);
    }
    const hostMetadata = {};
    hostMetaMap.forEach((value, key) => {
        // Resolve Enum references to their declared value.
        if (value instanceof EnumValue) {
            value = value.resolved;
        }
        if (typeof key !== 'string') {
            throw createValueHasWrongTypeError(hostExpr, key, `Decorator host metadata must be a string -> string object, but found unparseable key`);
        }
        if (typeof value == 'string') {
            hostMetadata[key] = value;
        }
        else if (value instanceof DynamicValue) {
            hostMetadata[key] = new WrappedNodeExpr(value.node);
        }
        else {
            throw createValueHasWrongTypeError(hostExpr, value, `Decorator host metadata must be a string -> string object, but found unparseable value`);
        }
    });
    const bindings = parseHostBindings(hostMetadata);
    const errors = verifyHostBindings(bindings, createSourceSpan(hostExpr));
    if (errors.length > 0) {
        throw new FatalDiagnosticError(exports.ErrorCode.HOST_BINDING_PARSE_ERROR, getHostBindingErrorNode(errors[0], hostExpr), errors.map((error) => error.msg).join('\n'));
    }
    return bindings;
}
/**
 * Attempts to match a parser error to the host binding expression that caused it.
 * @param error Error to match.
 * @param hostExpr Expression declaring the host bindings.
 */
function getHostBindingErrorNode(error, hostExpr) {
    // In the most common case the `host` object is an object literal with string values. We can
    // confidently match the error to its expression by looking at the string value that the parser
    // failed to parse and the initializers for each of the properties. If we fail to match, we fall
    // back to the old behavior where the error is reported on the entire `host` object.
    if (ts.isObjectLiteralExpression(hostExpr) && error.relatedError instanceof ParserError) {
        for (const prop of hostExpr.properties) {
            if (ts.isPropertyAssignment(prop) &&
                ts.isStringLiteralLike(prop.initializer) &&
                prop.initializer.text === error.relatedError.input) {
                return prop.initializer;
            }
        }
    }
    return hostExpr;
}
/**
 * Extracts and prepares the host directives metadata from an array literal expression.
 * @param rawHostDirectives Expression that defined the `hostDirectives`.
 */
function extractHostDirectives(rawHostDirectives, evaluator, compilationMode, forwardRefResolver) {
    const resolved = evaluator.evaluate(rawHostDirectives, forwardRefResolver);
    if (!Array.isArray(resolved)) {
        throw createValueHasWrongTypeError(rawHostDirectives, resolved, 'hostDirectives must be an array');
    }
    return resolved.map((value) => {
        const hostReference = value instanceof Map ? value.get('directive') : value;
        // Diagnostics
        if (compilationMode !== exports.CompilationMode.LOCAL) {
            if (!(hostReference instanceof Reference)) {
                throw createValueHasWrongTypeError(rawHostDirectives, hostReference, 'Host directive must be a reference');
            }
            if (!isNamedClassDeclaration(hostReference.node)) {
                throw createValueHasWrongTypeError(rawHostDirectives, hostReference, 'Host directive reference must be a class');
            }
        }
        let directive;
        let nameForErrors = (fieldName) => '@Directive.hostDirectives';
        if (compilationMode === exports.CompilationMode.LOCAL && hostReference instanceof DynamicValue) {
            // At the moment in local compilation we only support simple array for host directives, i.e.,
            // an array consisting of the directive identifiers. We don't support forward refs or other
            // expressions applied on externally imported directives. The main reason is simplicity, and
            // that almost nobody wants to use host directives this way (e.g., what would be the point of
            // forward ref for imported symbols?!)
            if (!ts.isIdentifier(hostReference.node) &&
                !ts.isPropertyAccessExpression(hostReference.node)) {
                throw new FatalDiagnosticError(exports.ErrorCode.LOCAL_COMPILATION_UNSUPPORTED_EXPRESSION, hostReference.node, `In local compilation mode, host directive cannot be an expression. Use an identifier instead`);
            }
            directive = new WrappedNodeExpr(hostReference.node);
        }
        else if (hostReference instanceof Reference) {
            directive = hostReference;
            nameForErrors = (fieldName) => `@Directive.hostDirectives.${directive.node.name.text}.${fieldName}`;
        }
        else {
            throw new Error('Impossible state');
        }
        const meta = {
            directive,
            isForwardReference: hostReference instanceof Reference && hostReference.synthetic,
            inputs: parseHostDirectivesMapping('inputs', value, nameForErrors('input'), rawHostDirectives),
            outputs: parseHostDirectivesMapping('outputs', value, nameForErrors('output'), rawHostDirectives),
        };
        return meta;
    });
}
/**
 * Parses the expression that defines the `inputs` or `outputs` of a host directive.
 * @param field Name of the field that is being parsed.
 * @param resolvedValue Evaluated value of the expression that defined the field.
 * @param classReference Reference to the host directive class.
 * @param sourceExpression Expression that the host directive is referenced in.
 */
function parseHostDirectivesMapping(field, resolvedValue, nameForErrors, sourceExpression) {
    if (resolvedValue instanceof Map && resolvedValue.has(field)) {
        const rawInputs = resolvedValue.get(field);
        if (isStringArrayOrDie(rawInputs, nameForErrors, sourceExpression)) {
            return parseMappingStringArray(rawInputs);
        }
    }
    return null;
}
/** Converts the parsed host directive information into metadata. */
function toHostDirectiveMetadata(hostDirective, context, refEmitter) {
    let directive;
    if (hostDirective.directive instanceof Reference) {
        directive = toR3Reference(hostDirective.directive.node, hostDirective.directive, context, refEmitter);
    }
    else {
        directive = {
            value: hostDirective.directive,
            type: hostDirective.directive,
        };
    }
    return {
        directive,
        isForwardReference: hostDirective.isForwardReference,
        inputs: hostDirective.inputs || null,
        outputs: hostDirective.outputs || null,
    };
}
/** Converts the parsed input information into metadata. */
function toR3InputMetadata(mapping) {
    return {
        classPropertyName: mapping.classPropertyName,
        bindingPropertyName: mapping.bindingPropertyName,
        required: mapping.required,
        transformFunction: mapping.transform !== null ? new WrappedNodeExpr(mapping.transform.node) : null,
        isSignal: mapping.isSignal,
    };
}

const NgOriginalFile = Symbol('NgOriginalFile');
exports.UpdateMode = void 0;
(function (UpdateMode) {
    /**
     * A complete update creates a completely new overlay of type-checking code on top of the user's
     * original program, which doesn't include type-checking code from previous calls to
     * `updateFiles`.
     */
    UpdateMode[UpdateMode["Complete"] = 0] = "Complete";
    /**
     * An incremental update changes the contents of some files in the type-checking program without
     * reverting any prior changes.
     */
    UpdateMode[UpdateMode["Incremental"] = 1] = "Incremental";
})(exports.UpdateMode || (exports.UpdateMode = {}));

/**
 * A `Symbol` which is used to patch extension data onto `ts.SourceFile`s.
 */
const NgExtension = Symbol('NgExtension');
/**
 * Narrows a `ts.SourceFile` if it has an `NgExtension` property.
 */
function isExtended(sf) {
    return sf[NgExtension] !== undefined;
}
/**
 * Returns the `NgExtensionData` for a given `ts.SourceFile`, adding it if none exists.
 */
function sfExtensionData(sf) {
    const extSf = sf;
    if (extSf[NgExtension] !== undefined) {
        // The file already has extension data, so return it directly.
        return extSf[NgExtension];
    }
    // The file has no existing extension data, so add it and return it.
    const extension = {
        isTopLevelShim: false,
        fileShim: null,
        originalReferencedFiles: null,
        taggedReferenceFiles: null,
    };
    extSf[NgExtension] = extension;
    return extension;
}
/**
 * Check whether `sf` is a per-file shim `ts.SourceFile`.
 */
function isFileShimSourceFile(sf) {
    return isExtended(sf) && sf[NgExtension].fileShim !== null;
}
/**
 * Check whether `sf` is a shim `ts.SourceFile` (either a per-file shim or a top-level shim).
 */
function isShim(sf) {
    return isExtended(sf) && (sf[NgExtension].fileShim !== null || sf[NgExtension].isTopLevelShim);
}
/**
 * Copy any shim data from one `ts.SourceFile` to another.
 */
function copyFileShimData(from, to) {
    if (!isFileShimSourceFile(from)) {
        return;
    }
    sfExtensionData(to).fileShim = sfExtensionData(from).fileShim;
}
/**
 * For those `ts.SourceFile`s in the `program` which have previously been tagged by a
 * `ShimReferenceTagger`, restore the original `referencedFiles` array that does not have shim tags.
 */
function untagAllTsFiles(program) {
    for (const sf of program.getSourceFiles()) {
        untagTsFile(sf);
    }
}
/**
 * For those `ts.SourceFile`s in the `program` which have previously been tagged by a
 * `ShimReferenceTagger`, re-apply the effects of tagging by updating the `referencedFiles` array to
 * the tagged version produced previously.
 */
function retagAllTsFiles(program) {
    for (const sf of program.getSourceFiles()) {
        retagTsFile(sf);
    }
}
/**
 * Restore the original `referencedFiles` for the given `ts.SourceFile`.
 */
function untagTsFile(sf) {
    if (sf.isDeclarationFile || !isExtended(sf)) {
        return;
    }
    const ext = sfExtensionData(sf);
    if (ext.originalReferencedFiles !== null) {
        sf.referencedFiles = ext.originalReferencedFiles;
    }
}
/**
 * Apply the previously tagged `referencedFiles` to the given `ts.SourceFile`, if it was previously
 * tagged.
 */
function retagTsFile(sf) {
    if (sf.isDeclarationFile || !isExtended(sf)) {
        return;
    }
    const ext = sfExtensionData(sf);
    if (ext.taggedReferenceFiles !== null) {
        sf.referencedFiles = ext.taggedReferenceFiles;
    }
}

/**
 * Describes the scope of the caller's interest in template type-checking results.
 */
exports.OptimizeFor = void 0;
(function (OptimizeFor) {
    /**
     * Indicates that a consumer of a `TemplateTypeChecker` is only interested in results for a
     * given file, and wants them as fast as possible.
     *
     * Calling `TemplateTypeChecker` methods successively for multiple files while specifying
     * `OptimizeFor.SingleFile` can result in significant unnecessary overhead overall.
     */
    OptimizeFor[OptimizeFor["SingleFile"] = 0] = "SingleFile";
    /**
     * Indicates that a consumer of a `TemplateTypeChecker` intends to query for results pertaining
     * to the entire user program, and so the type-checker should internally optimize for this case.
     *
     * Initial calls to retrieve type-checking information may take longer, but repeated calls to
     * gather information for the whole user program will be significantly faster with this mode of
     * optimization.
     */
    OptimizeFor[OptimizeFor["WholeProgram"] = 1] = "WholeProgram";
})(exports.OptimizeFor || (exports.OptimizeFor = {}));

/**
 * Discriminant of an autocompletion source (a `Completion`).
 */
var CompletionKind;
(function (CompletionKind) {
    CompletionKind[CompletionKind["Reference"] = 0] = "Reference";
    CompletionKind[CompletionKind["Variable"] = 1] = "Variable";
    CompletionKind[CompletionKind["LetDeclaration"] = 2] = "LetDeclaration";
})(CompletionKind || (CompletionKind = {}));

/**
 * Which kind of Angular Trait the import targets.
 */
exports.PotentialImportKind = void 0;
(function (PotentialImportKind) {
    PotentialImportKind[PotentialImportKind["NgModule"] = 0] = "NgModule";
    PotentialImportKind[PotentialImportKind["Standalone"] = 1] = "Standalone";
})(exports.PotentialImportKind || (exports.PotentialImportKind = {}));
/**
 * Possible modes in which to look up a potential import.
 */
exports.PotentialImportMode = void 0;
(function (PotentialImportMode) {
    /** Whether an import is standalone is inferred based on its metadata. */
    PotentialImportMode[PotentialImportMode["Normal"] = 0] = "Normal";
    /**
     * An import is assumed to be standalone and is imported directly. This is useful for migrations
     * where a declaration wasn't standalone when the program was created, but will become standalone
     * as a part of the migration.
     */
    PotentialImportMode[PotentialImportMode["ForceDirect"] = 1] = "ForceDirect";
})(exports.PotentialImportMode || (exports.PotentialImportMode = {}));

exports.SymbolKind = void 0;
(function (SymbolKind) {
    SymbolKind[SymbolKind["Input"] = 0] = "Input";
    SymbolKind[SymbolKind["Output"] = 1] = "Output";
    SymbolKind[SymbolKind["Binding"] = 2] = "Binding";
    SymbolKind[SymbolKind["Reference"] = 3] = "Reference";
    SymbolKind[SymbolKind["Variable"] = 4] = "Variable";
    SymbolKind[SymbolKind["Directive"] = 5] = "Directive";
    SymbolKind[SymbolKind["Element"] = 6] = "Element";
    SymbolKind[SymbolKind["Template"] = 7] = "Template";
    SymbolKind[SymbolKind["Expression"] = 8] = "Expression";
    SymbolKind[SymbolKind["DomBinding"] = 9] = "DomBinding";
    SymbolKind[SymbolKind["Pipe"] = 10] = "Pipe";
    SymbolKind[SymbolKind["LetDeclaration"] = 11] = "LetDeclaration";
})(exports.SymbolKind || (exports.SymbolKind = {}));

/**
 * Constructs a `ts.Diagnostic` for a given `ParseSourceSpan` within a template.
 */
function makeTemplateDiagnostic(id, mapping, span, category, code, messageText, relatedMessages) {
    if (mapping.type === 'direct') {
        let relatedInformation = undefined;
        if (relatedMessages !== undefined) {
            relatedInformation = [];
            for (const relatedMessage of relatedMessages) {
                relatedInformation.push({
                    category: ts.DiagnosticCategory.Message,
                    code: 0,
                    file: relatedMessage.sourceFile,
                    start: relatedMessage.start,
                    length: relatedMessage.end - relatedMessage.start,
                    messageText: relatedMessage.text,
                });
            }
        }
        // For direct mappings, the error is shown inline as ngtsc was able to pinpoint a string
        // constant within the `@Component` decorator for the template. This allows us to map the error
        // directly into the bytes of the source file.
        return {
            source: 'ngtsc',
            code,
            category,
            messageText,
            file: mapping.node.getSourceFile(),
            sourceFile: mapping.node.getSourceFile(),
            typeCheckId: id,
            start: span.start.offset,
            length: span.end.offset - span.start.offset,
            relatedInformation,
        };
    }
    else if (mapping.type === 'indirect' || mapping.type === 'external') {
        // For indirect mappings (template was declared inline, but ngtsc couldn't map it directly
        // to a string constant in the decorator), the component's file name is given with a suffix
        // indicating it's not the TS file being displayed, but a template.
        // For external temoplates, the HTML filename is used.
        const componentSf = mapping.componentClass.getSourceFile();
        const componentName = mapping.componentClass.name.text;
        const fileName = mapping.type === 'indirect'
            ? `${componentSf.fileName} (${componentName} template)`
            : mapping.templateUrl;
        let relatedInformation = [];
        if (relatedMessages !== undefined) {
            for (const relatedMessage of relatedMessages) {
                relatedInformation.push({
                    category: ts.DiagnosticCategory.Message,
                    code: 0,
                    file: relatedMessage.sourceFile,
                    start: relatedMessage.start,
                    length: relatedMessage.end - relatedMessage.start,
                    messageText: relatedMessage.text,
                });
            }
        }
        let sf;
        try {
            sf = getParsedTemplateSourceFile(fileName, mapping);
        }
        catch (e) {
            const failureChain = makeDiagnosticChain(`Failed to report an error in '${fileName}' at ${span.start.line + 1}:${span.start.col + 1}`, [makeDiagnosticChain(e?.stack ?? `${e}`)]);
            return {
                source: 'ngtsc',
                category,
                code,
                messageText: addDiagnosticChain(messageText, [failureChain]),
                file: componentSf,
                sourceFile: componentSf,
                typeCheckId: id,
                // mapping.node represents either the    'template' or 'templateUrl' expression. getStart()
                // and getEnd() are used because they don't include surrounding whitespace.
                start: mapping.node.getStart(),
                length: mapping.node.getEnd() - mapping.node.getStart(),
                relatedInformation,
            };
        }
        relatedInformation.push({
            category: ts.DiagnosticCategory.Message,
            code: 0,
            file: componentSf,
            // mapping.node represents either the 'template' or 'templateUrl' expression. getStart()
            // and getEnd() are used because they don't include surrounding whitespace.
            start: mapping.node.getStart(),
            length: mapping.node.getEnd() - mapping.node.getStart(),
            messageText: `Error occurs in the template of component ${componentName}.`,
        });
        return {
            source: 'ngtsc',
            category,
            code,
            messageText,
            file: sf,
            sourceFile: componentSf,
            typeCheckId: id,
            start: span.start.offset,
            length: span.end.offset - span.start.offset,
            // Show a secondary message indicating the component whose template contains the error.
            relatedInformation,
        };
    }
    else {
        throw new Error(`Unexpected source mapping type: ${mapping.type}`);
    }
}
const TemplateSourceFile = Symbol('TemplateSourceFile');
function getParsedTemplateSourceFile(fileName, mapping) {
    if (mapping[TemplateSourceFile] === undefined) {
        mapping[TemplateSourceFile] = parseTemplateAsSourceFile(fileName, mapping.template);
    }
    return mapping[TemplateSourceFile];
}
function parseTemplateAsSourceFile(fileName, template) {
    // TODO(alxhub): investigate creating a fake `ts.SourceFile` here instead of invoking the TS
    // parser against the template (HTML is just really syntactically invalid TypeScript code ;).
    return ts.createSourceFile(fileName, template, ts.ScriptTarget.Latest, 
    /* setParentNodes */ false, ts.ScriptKind.JSX);
}

const TYPE_CHECK_ID_MAP = Symbol('TypeCheckId');
function getTypeCheckId(clazz) {
    const sf = clazz.getSourceFile();
    if (sf[TYPE_CHECK_ID_MAP] === undefined) {
        sf[TYPE_CHECK_ID_MAP] = new Map();
    }
    if (sf[TYPE_CHECK_ID_MAP].get(clazz) === undefined) {
        sf[TYPE_CHECK_ID_MAP].set(clazz, `tcb${sf[TYPE_CHECK_ID_MAP].size + 1}`);
    }
    return sf[TYPE_CHECK_ID_MAP].get(clazz);
}

const parseSpanComment = /^(\d+),(\d+)$/;
/**
 * Reads the trailing comments and finds the first match which is a span comment (i.e. 4,10) on a
 * node and returns it as an `AbsoluteSourceSpan`.
 *
 * Will return `null` if no trailing comments on the node match the expected form of a source span.
 */
function readSpanComment(node, sourceFile = node.getSourceFile()) {
    return (ts.forEachTrailingCommentRange(sourceFile.text, node.getEnd(), (pos, end, kind) => {
        if (kind !== ts.SyntaxKind.MultiLineCommentTrivia) {
            return null;
        }
        const commentText = sourceFile.text.substring(pos + 2, end - 2);
        const match = commentText.match(parseSpanComment);
        if (match === null) {
            return null;
        }
        return new AbsoluteSourceSpan(+match[1], +match[2]);
    }) || null);
}
/** Used to identify what type the comment is. */
var CommentTriviaType;
(function (CommentTriviaType) {
    CommentTriviaType["DIAGNOSTIC"] = "D";
    CommentTriviaType["EXPRESSION_TYPE_IDENTIFIER"] = "T";
})(CommentTriviaType || (CommentTriviaType = {}));
/** Identifies what the TCB expression is for (for example, a directive declaration). */
var ExpressionIdentifier;
(function (ExpressionIdentifier) {
    ExpressionIdentifier["DIRECTIVE"] = "DIR";
    ExpressionIdentifier["COMPONENT_COMPLETION"] = "COMPCOMP";
    ExpressionIdentifier["EVENT_PARAMETER"] = "EP";
    ExpressionIdentifier["VARIABLE_AS_EXPRESSION"] = "VAE";
})(ExpressionIdentifier || (ExpressionIdentifier = {}));
/** Tags the node with the given expression identifier. */
function addExpressionIdentifier(node, identifier) {
    ts.addSyntheticTrailingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, `${CommentTriviaType.EXPRESSION_TYPE_IDENTIFIER}:${identifier}`, 
    /* hasTrailingNewLine */ false);
}
const IGNORE_FOR_DIAGNOSTICS_MARKER = `${CommentTriviaType.DIAGNOSTIC}:ignore`;
/**
 * Tag the `ts.Node` with an indication that any errors arising from the evaluation of the node
 * should be ignored.
 */
function markIgnoreDiagnostics(node) {
    ts.addSyntheticTrailingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, IGNORE_FOR_DIAGNOSTICS_MARKER, 
    /* hasTrailingNewLine */ false);
}
/** Returns true if the node has a marker that indicates diagnostics errors should be ignored.  */
function hasIgnoreForDiagnosticsMarker(node, sourceFile) {
    return (ts.forEachTrailingCommentRange(sourceFile.text, node.getEnd(), (pos, end, kind) => {
        if (kind !== ts.SyntaxKind.MultiLineCommentTrivia) {
            return null;
        }
        const commentText = sourceFile.text.substring(pos + 2, end - 2);
        return commentText === IGNORE_FOR_DIAGNOSTICS_MARKER;
    }) === true);
}
function makeRecursiveVisitor(visitor) {
    function recursiveVisitor(node) {
        const res = visitor(node);
        return res !== null ? res : node.forEachChild(recursiveVisitor);
    }
    return recursiveVisitor;
}
function getSpanFromOptions(opts) {
    let withSpan = null;
    if (opts.withSpan !== undefined) {
        if (opts.withSpan instanceof AbsoluteSourceSpan) {
            withSpan = opts.withSpan;
        }
        else {
            withSpan = { start: opts.withSpan.start.offset, end: opts.withSpan.end.offset };
        }
    }
    return withSpan;
}
/**
 * Given a `ts.Node` with finds the first node whose matching the criteria specified
 * by the `FindOptions`.
 *
 * Returns `null` when no `ts.Node` matches the given conditions.
 */
function findFirstMatchingNode(tcb, opts) {
    const withSpan = getSpanFromOptions(opts);
    const withExpressionIdentifier = opts.withExpressionIdentifier;
    const sf = tcb.getSourceFile();
    const visitor = makeRecursiveVisitor((node) => {
        if (!opts.filter(node)) {
            return null;
        }
        if (withSpan !== null) {
            const comment = readSpanComment(node, sf);
            if (comment === null || withSpan.start !== comment.start || withSpan.end !== comment.end) {
                return null;
            }
        }
        if (withExpressionIdentifier !== undefined &&
            !hasExpressionIdentifier(sf, node, withExpressionIdentifier)) {
            return null;
        }
        return node;
    });
    return tcb.forEachChild(visitor) ?? null;
}
/**
 * Given a `ts.Node` with source span comments, finds the first node whose source span comment
 * matches the given `sourceSpan`. Additionally, the `filter` function allows matching only
 * `ts.Nodes` of a given type, which provides the ability to select only matches of a given type
 * when there may be more than one.
 *
 * Returns `null` when no `ts.Node` matches the given conditions.
 */
function findAllMatchingNodes(tcb, opts) {
    const withSpan = getSpanFromOptions(opts);
    const withExpressionIdentifier = opts.withExpressionIdentifier;
    const results = [];
    const stack = [tcb];
    const sf = tcb.getSourceFile();
    while (stack.length > 0) {
        const node = stack.pop();
        if (!opts.filter(node)) {
            stack.push(...node.getChildren());
            continue;
        }
        if (withSpan !== null) {
            const comment = readSpanComment(node, sf);
            if (comment === null || withSpan.start !== comment.start || withSpan.end !== comment.end) {
                stack.push(...node.getChildren());
                continue;
            }
        }
        if (withExpressionIdentifier !== undefined &&
            !hasExpressionIdentifier(sf, node, withExpressionIdentifier)) {
            continue;
        }
        results.push(node);
    }
    return results;
}
function hasExpressionIdentifier(sourceFile, node, identifier) {
    return (ts.forEachTrailingCommentRange(sourceFile.text, node.getEnd(), (pos, end, kind) => {
        if (kind !== ts.SyntaxKind.MultiLineCommentTrivia) {
            return false;
        }
        const commentText = sourceFile.text.substring(pos + 2, end - 2);
        return commentText === `${CommentTriviaType.EXPRESSION_TYPE_IDENTIFIER}:${identifier}`;
    }) || false);
}

/**
 * Powers autocompletion for a specific component.
 *
 * Internally caches autocompletion results, and must be discarded if the component template or
 * surrounding TS program have changed.
 */
class CompletionEngine {
    tcb;
    data;
    tcbPath;
    tcbIsShim;
    componentContext;
    /**
     * Cache of completions for various levels of the template, including the root template (`null`).
     * Memoizes `getTemplateContextCompletions`.
     */
    templateContextCache = new Map();
    expressionCompletionCache = new Map();
    constructor(tcb, data, tcbPath, tcbIsShim) {
        this.tcb = tcb;
        this.data = data;
        this.tcbPath = tcbPath;
        this.tcbIsShim = tcbIsShim;
        // Find the component completion expression within the TCB. This looks like: `ctx. /* ... */;`
        const globalRead = findFirstMatchingNode(this.tcb, {
            filter: ts.isPropertyAccessExpression,
            withExpressionIdentifier: ExpressionIdentifier.COMPONENT_COMPLETION,
        });
        if (globalRead !== null) {
            this.componentContext = {
                tcbPath: this.tcbPath,
                isShimFile: this.tcbIsShim,
                // `globalRead.name` is an empty `ts.Identifier`, so its start position immediately follows
                // the `.` in `ctx.`. TS autocompletion APIs can then be used to access completion results
                // for the component context.
                positionInFile: globalRead.name.getStart(),
            };
        }
        else {
            this.componentContext = null;
        }
    }
    /**
     * Get global completions within the given template context and AST node.
     *
     * @param context the given template context - either a `TmplAstTemplate` embedded view, or `null`
     *     for the root
     * template context.
     * @param node the given AST node
     */
    getGlobalCompletions(context, node) {
        if (this.componentContext === null) {
            return null;
        }
        const templateContext = this.getTemplateContextCompletions(context);
        if (templateContext === null) {
            return null;
        }
        let nodeContext = null;
        if (node instanceof EmptyExpr$1) {
            const nodeLocation = findFirstMatchingNode(this.tcb, {
                filter: ts.isIdentifier,
                withSpan: node.sourceSpan,
            });
            if (nodeLocation !== null) {
                nodeContext = {
                    tcbPath: this.tcbPath,
                    isShimFile: this.tcbIsShim,
                    positionInFile: nodeLocation.getStart(),
                };
            }
        }
        if (node instanceof PropertyRead && node.receiver instanceof ImplicitReceiver) {
            const nodeLocation = findFirstMatchingNode(this.tcb, {
                filter: ts.isPropertyAccessExpression,
                withSpan: node.sourceSpan,
            });
            if (nodeLocation) {
                nodeContext = {
                    tcbPath: this.tcbPath,
                    isShimFile: this.tcbIsShim,
                    positionInFile: nodeLocation.getStart(),
                };
            }
        }
        return {
            componentContext: this.componentContext,
            templateContext,
            nodeContext,
        };
    }
    getExpressionCompletionLocation(expr) {
        if (this.expressionCompletionCache.has(expr)) {
            return this.expressionCompletionCache.get(expr);
        }
        // Completion works inside property reads and method calls.
        let tsExpr = null;
        if (expr instanceof PropertyRead || expr instanceof PropertyWrite) {
            // Non-safe navigation operations are trivial: `foo.bar` or `foo.bar()`
            tsExpr = findFirstMatchingNode(this.tcb, {
                filter: ts.isPropertyAccessExpression,
                withSpan: expr.nameSpan,
            });
        }
        else if (expr instanceof SafePropertyRead) {
            // Safe navigation operations are a little more complex, and involve a ternary. Completion
            // happens in the "true" case of the ternary.
            const ternaryExpr = findFirstMatchingNode(this.tcb, {
                filter: ts.isParenthesizedExpression,
                withSpan: expr.sourceSpan,
            });
            if (ternaryExpr === null || !ts.isConditionalExpression(ternaryExpr.expression)) {
                return null;
            }
            const whenTrue = ternaryExpr.expression.whenTrue;
            if (ts.isPropertyAccessExpression(whenTrue)) {
                tsExpr = whenTrue;
            }
            else if (ts.isCallExpression(whenTrue) &&
                ts.isPropertyAccessExpression(whenTrue.expression)) {
                tsExpr = whenTrue.expression;
            }
        }
        if (tsExpr === null) {
            return null;
        }
        const res = {
            tcbPath: this.tcbPath,
            isShimFile: this.tcbIsShim,
            positionInFile: tsExpr.name.getEnd(),
        };
        this.expressionCompletionCache.set(expr, res);
        return res;
    }
    getLiteralCompletionLocation(expr) {
        if (this.expressionCompletionCache.has(expr)) {
            return this.expressionCompletionCache.get(expr);
        }
        let tsExpr = null;
        if (expr instanceof TextAttribute) {
            const strNode = findFirstMatchingNode(this.tcb, {
                filter: ts.isParenthesizedExpression,
                withSpan: expr.sourceSpan,
            });
            if (strNode !== null && ts.isStringLiteral(strNode.expression)) {
                tsExpr = strNode.expression;
            }
        }
        else {
            tsExpr = findFirstMatchingNode(this.tcb, {
                filter: (n) => ts.isStringLiteral(n) || ts.isNumericLiteral(n),
                withSpan: expr.sourceSpan,
            });
        }
        if (tsExpr === null) {
            return null;
        }
        let positionInShimFile = tsExpr.getEnd();
        if (ts.isStringLiteral(tsExpr)) {
            // In the shimFile, if `tsExpr` is a string, the position should be in the quotes.
            positionInShimFile -= 1;
        }
        const res = {
            tcbPath: this.tcbPath,
            isShimFile: this.tcbIsShim,
            positionInFile: positionInShimFile,
        };
        this.expressionCompletionCache.set(expr, res);
        return res;
    }
    /**
     * Get global completions within the given template context - either a `TmplAstTemplate` embedded
     * view, or `null` for the root context.
     */
    getTemplateContextCompletions(context) {
        if (this.templateContextCache.has(context)) {
            return this.templateContextCache.get(context);
        }
        const templateContext = new Map();
        // The bound template already has details about the references and variables in scope in the
        // `context` template - they just need to be converted to `Completion`s.
        for (const node of this.data.boundTarget.getEntitiesInScope(context)) {
            if (node instanceof Reference$1) {
                templateContext.set(node.name, {
                    kind: CompletionKind.Reference,
                    node,
                });
            }
            else if (node instanceof LetDeclaration$1) {
                templateContext.set(node.name, {
                    kind: CompletionKind.LetDeclaration,
                    node,
                });
            }
            else {
                templateContext.set(node.name, {
                    kind: CompletionKind.Variable,
                    node,
                });
            }
        }
        this.templateContextCache.set(context, templateContext);
        return templateContext;
    }
}

const comma = ','.charCodeAt(0);
const semicolon = ';'.charCodeAt(0);
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
const intToChar = new Uint8Array(64); // 64 possible chars.
const charToInt = new Uint8Array(128); // z is 122 in ASCII
for (let i = 0; i < chars.length; i++) {
    const c = chars.charCodeAt(i);
    intToChar[i] = c;
    charToInt[c] = i;
}
function encodeInteger(builder, num, relative) {
    let delta = num - relative;
    delta = delta < 0 ? (-delta << 1) | 1 : delta << 1;
    do {
        let clamped = delta & 0b011111;
        delta >>>= 5;
        if (delta > 0)
            clamped |= 0b100000;
        builder.write(intToChar[clamped]);
    } while (delta > 0);
    return num;
}

const bufLength = 1024 * 16;
// Provide a fallback for older environments.
const td = typeof TextDecoder !== 'undefined'
    ? /* #__PURE__ */ new TextDecoder()
    : typeof Buffer !== 'undefined'
        ? {
            decode(buf) {
                const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
                return out.toString();
            },
        }
        : {
            decode(buf) {
                let out = '';
                for (let i = 0; i < buf.length; i++) {
                    out += String.fromCharCode(buf[i]);
                }
                return out;
            },
        };
class StringWriter {
    constructor() {
        this.pos = 0;
        this.out = '';
        this.buffer = new Uint8Array(bufLength);
    }
    write(v) {
        const { buffer } = this;
        buffer[this.pos++] = v;
        if (this.pos === bufLength) {
            this.out += td.decode(buffer);
            this.pos = 0;
        }
    }
    flush() {
        const { buffer, out, pos } = this;
        return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;
    }
}
function encode(decoded) {
    const writer = new StringWriter();
    let sourcesIndex = 0;
    let sourceLine = 0;
    let sourceColumn = 0;
    let namesIndex = 0;
    for (let i = 0; i < decoded.length; i++) {
        const line = decoded[i];
        if (i > 0)
            writer.write(semicolon);
        if (line.length === 0)
            continue;
        let genColumn = 0;
        for (let j = 0; j < line.length; j++) {
            const segment = line[j];
            if (j > 0)
                writer.write(comma);
            genColumn = encodeInteger(writer, segment[0], genColumn);
            if (segment.length === 1)
                continue;
            sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);
            sourceLine = encodeInteger(writer, segment[2], sourceLine);
            sourceColumn = encodeInteger(writer, segment[3], sourceColumn);
            if (segment.length === 4)
                continue;
            namesIndex = encodeInteger(writer, segment[4], namesIndex);
        }
    }
    return writer.flush();
}

class BitSet {
	constructor(arg) {
		this.bits = arg instanceof BitSet ? arg.bits.slice() : [];
	}

	add(n) {
		this.bits[n >> 5] |= 1 << (n & 31);
	}

	has(n) {
		return !!(this.bits[n >> 5] & (1 << (n & 31)));
	}
}

class Chunk {
	constructor(start, end, content) {
		this.start = start;
		this.end = end;
		this.original = content;

		this.intro = '';
		this.outro = '';

		this.content = content;
		this.storeName = false;
		this.edited = false;

		{
			this.previous = null;
			this.next = null;
		}
	}

	appendLeft(content) {
		this.outro += content;
	}

	appendRight(content) {
		this.intro = this.intro + content;
	}

	clone() {
		const chunk = new Chunk(this.start, this.end, this.original);

		chunk.intro = this.intro;
		chunk.outro = this.outro;
		chunk.content = this.content;
		chunk.storeName = this.storeName;
		chunk.edited = this.edited;

		return chunk;
	}

	contains(index) {
		return this.start < index && index < this.end;
	}

	eachNext(fn) {
		let chunk = this;
		while (chunk) {
			fn(chunk);
			chunk = chunk.next;
		}
	}

	eachPrevious(fn) {
		let chunk = this;
		while (chunk) {
			fn(chunk);
			chunk = chunk.previous;
		}
	}

	edit(content, storeName, contentOnly) {
		this.content = content;
		if (!contentOnly) {
			this.intro = '';
			this.outro = '';
		}
		this.storeName = storeName;

		this.edited = true;

		return this;
	}

	prependLeft(content) {
		this.outro = content + this.outro;
	}

	prependRight(content) {
		this.intro = content + this.intro;
	}

	reset() {
		this.intro = '';
		this.outro = '';
		if (this.edited) {
			this.content = this.original;
			this.storeName = false;
			this.edited = false;
		}
	}

	split(index) {
		const sliceIndex = index - this.start;

		const originalBefore = this.original.slice(0, sliceIndex);
		const originalAfter = this.original.slice(sliceIndex);

		this.original = originalBefore;

		const newChunk = new Chunk(index, this.end, originalAfter);
		newChunk.outro = this.outro;
		this.outro = '';

		this.end = index;

		if (this.edited) {
			// after split we should save the edit content record into the correct chunk
			// to make sure sourcemap correct
			// For example:
			// '  test'.trim()
			//     split   -> '  ' + 'test'
			//   ✔️ edit    -> '' + 'test'
			//   ✖️ edit    -> 'test' + ''
			// TODO is this block necessary?...
			newChunk.edit('', false);
			this.content = '';
		} else {
			this.content = originalBefore;
		}

		newChunk.next = this.next;
		if (newChunk.next) newChunk.next.previous = newChunk;
		newChunk.previous = this;
		this.next = newChunk;

		return newChunk;
	}

	toString() {
		return this.intro + this.content + this.outro;
	}

	trimEnd(rx) {
		this.outro = this.outro.replace(rx, '');
		if (this.outro.length) return true;

		const trimmed = this.content.replace(rx, '');

		if (trimmed.length) {
			if (trimmed !== this.content) {
				this.split(this.start + trimmed.length).edit('', undefined, true);
				if (this.edited) {
					// save the change, if it has been edited
					this.edit(trimmed, this.storeName, true);
				}
			}
			return true;
		} else {
			this.edit('', undefined, true);

			this.intro = this.intro.replace(rx, '');
			if (this.intro.length) return true;
		}
	}

	trimStart(rx) {
		this.intro = this.intro.replace(rx, '');
		if (this.intro.length) return true;

		const trimmed = this.content.replace(rx, '');

		if (trimmed.length) {
			if (trimmed !== this.content) {
				const newChunk = this.split(this.end - trimmed.length);
				if (this.edited) {
					// save the change, if it has been edited
					newChunk.edit(trimmed, this.storeName, true);
				}
				this.edit('', undefined, true);
			}
			return true;
		} else {
			this.edit('', undefined, true);

			this.outro = this.outro.replace(rx, '');
			if (this.outro.length) return true;
		}
	}
}

function getBtoa() {
	if (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {
		return (str) => globalThis.btoa(unescape(encodeURIComponent(str)));
	} else if (typeof Buffer === 'function') {
		return (str) => Buffer.from(str, 'utf-8').toString('base64');
	} else {
		return () => {
			throw new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');
		};
	}
}

const btoa = /*#__PURE__*/ getBtoa();

class SourceMap {
	constructor(properties) {
		this.version = 3;
		this.file = properties.file;
		this.sources = properties.sources;
		this.sourcesContent = properties.sourcesContent;
		this.names = properties.names;
		this.mappings = encode(properties.mappings);
		if (typeof properties.x_google_ignoreList !== 'undefined') {
			this.x_google_ignoreList = properties.x_google_ignoreList;
		}
		if (typeof properties.debugId !== 'undefined') {
			this.debugId = properties.debugId;
		}
	}

	toString() {
		return JSON.stringify(this);
	}

	toUrl() {
		return 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());
	}
}

function guessIndent(code) {
	const lines = code.split('\n');

	const tabbed = lines.filter((line) => /^\t+/.test(line));
	const spaced = lines.filter((line) => /^ {2,}/.test(line));

	if (tabbed.length === 0 && spaced.length === 0) {
		return null;
	}

	// More lines tabbed than spaced? Assume tabs, and
	// default to tabs in the case of a tie (or nothing
	// to go on)
	if (tabbed.length >= spaced.length) {
		return '\t';
	}

	// Otherwise, we need to guess the multiple
	const min = spaced.reduce((previous, current) => {
		const numSpaces = /^ +/.exec(current)[0].length;
		return Math.min(numSpaces, previous);
	}, Infinity);

	return new Array(min + 1).join(' ');
}

function getRelativePath(from, to) {
	const fromParts = from.split(/[/\\]/);
	const toParts = to.split(/[/\\]/);

	fromParts.pop(); // get dirname

	while (fromParts[0] === toParts[0]) {
		fromParts.shift();
		toParts.shift();
	}

	if (fromParts.length) {
		let i = fromParts.length;
		while (i--) fromParts[i] = '..';
	}

	return fromParts.concat(toParts).join('/');
}

const toString = Object.prototype.toString;

function isObject(thing) {
	return toString.call(thing) === '[object Object]';
}

function getLocator(source) {
	const originalLines = source.split('\n');
	const lineOffsets = [];

	for (let i = 0, pos = 0; i < originalLines.length; i++) {
		lineOffsets.push(pos);
		pos += originalLines[i].length + 1;
	}

	return function locate(index) {
		let i = 0;
		let j = lineOffsets.length;
		while (i < j) {
			const m = (i + j) >> 1;
			if (index < lineOffsets[m]) {
				j = m;
			} else {
				i = m + 1;
			}
		}
		const line = i - 1;
		const column = index - lineOffsets[line];
		return { line, column };
	};
}

const wordRegex = /\w/;

class Mappings {
	constructor(hires) {
		this.hires = hires;
		this.generatedCodeLine = 0;
		this.generatedCodeColumn = 0;
		this.raw = [];
		this.rawSegments = this.raw[this.generatedCodeLine] = [];
		this.pending = null;
	}

	addEdit(sourceIndex, content, loc, nameIndex) {
		if (content.length) {
			const contentLengthMinusOne = content.length - 1;
			let contentLineEnd = content.indexOf('\n', 0);
			let previousContentLineEnd = -1;
			// Loop through each line in the content and add a segment, but stop if the last line is empty,
			// else code afterwards would fill one line too many
			while (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {
				const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];
				if (nameIndex >= 0) {
					segment.push(nameIndex);
				}
				this.rawSegments.push(segment);

				this.generatedCodeLine += 1;
				this.raw[this.generatedCodeLine] = this.rawSegments = [];
				this.generatedCodeColumn = 0;

				previousContentLineEnd = contentLineEnd;
				contentLineEnd = content.indexOf('\n', contentLineEnd + 1);
			}

			const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];
			if (nameIndex >= 0) {
				segment.push(nameIndex);
			}
			this.rawSegments.push(segment);

			this.advance(content.slice(previousContentLineEnd + 1));
		} else if (this.pending) {
			this.rawSegments.push(this.pending);
			this.advance(content);
		}

		this.pending = null;
	}

	addUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {
		let originalCharIndex = chunk.start;
		let first = true;
		// when iterating each char, check if it's in a word boundary
		let charInHiresBoundary = false;

		while (originalCharIndex < chunk.end) {
			if (original[originalCharIndex] === '\n') {
				loc.line += 1;
				loc.column = 0;
				this.generatedCodeLine += 1;
				this.raw[this.generatedCodeLine] = this.rawSegments = [];
				this.generatedCodeColumn = 0;
				first = true;
				charInHiresBoundary = false;
			} else {
				if (this.hires || first || sourcemapLocations.has(originalCharIndex)) {
					const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];

					if (this.hires === 'boundary') {
						// in hires "boundary", group segments per word boundary than per char
						if (wordRegex.test(original[originalCharIndex])) {
							// for first char in the boundary found, start the boundary by pushing a segment
							if (!charInHiresBoundary) {
								this.rawSegments.push(segment);
								charInHiresBoundary = true;
							}
						} else {
							// for non-word char, end the boundary by pushing a segment
							this.rawSegments.push(segment);
							charInHiresBoundary = false;
						}
					} else {
						this.rawSegments.push(segment);
					}
				}

				loc.column += 1;
				this.generatedCodeColumn += 1;
				first = false;
			}

			originalCharIndex += 1;
		}

		this.pending = null;
	}

	advance(str) {
		if (!str) return;

		const lines = str.split('\n');

		if (lines.length > 1) {
			for (let i = 0; i < lines.length - 1; i++) {
				this.generatedCodeLine++;
				this.raw[this.generatedCodeLine] = this.rawSegments = [];
			}
			this.generatedCodeColumn = 0;
		}

		this.generatedCodeColumn += lines[lines.length - 1].length;
	}
}

const n = '\n';

const warned = {
	insertLeft: false,
	insertRight: false,
	storeName: false,
};

class MagicString {
	constructor(string, options = {}) {
		const chunk = new Chunk(0, string.length, string);

		Object.defineProperties(this, {
			original: { writable: true, value: string },
			outro: { writable: true, value: '' },
			intro: { writable: true, value: '' },
			firstChunk: { writable: true, value: chunk },
			lastChunk: { writable: true, value: chunk },
			lastSearchedChunk: { writable: true, value: chunk },
			byStart: { writable: true, value: {} },
			byEnd: { writable: true, value: {} },
			filename: { writable: true, value: options.filename },
			indentExclusionRanges: { writable: true, value: options.indentExclusionRanges },
			sourcemapLocations: { writable: true, value: new BitSet() },
			storedNames: { writable: true, value: {} },
			indentStr: { writable: true, value: undefined },
			ignoreList: { writable: true, value: options.ignoreList },
			offset: { writable: true, value: options.offset || 0 },
		});

		this.byStart[0] = chunk;
		this.byEnd[string.length] = chunk;
	}

	addSourcemapLocation(char) {
		this.sourcemapLocations.add(char);
	}

	append(content) {
		if (typeof content !== 'string') throw new TypeError('outro content must be a string');

		this.outro += content;
		return this;
	}

	appendLeft(index, content) {
		index = index + this.offset;

		if (typeof content !== 'string') throw new TypeError('inserted content must be a string');

		this._split(index);

		const chunk = this.byEnd[index];

		if (chunk) {
			chunk.appendLeft(content);
		} else {
			this.intro += content;
		}
		return this;
	}

	appendRight(index, content) {
		index = index + this.offset;

		if (typeof content !== 'string') throw new TypeError('inserted content must be a string');

		this._split(index);

		const chunk = this.byStart[index];

		if (chunk) {
			chunk.appendRight(content);
		} else {
			this.outro += content;
		}
		return this;
	}

	clone() {
		const cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset });

		let originalChunk = this.firstChunk;
		let clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());

		while (originalChunk) {
			cloned.byStart[clonedChunk.start] = clonedChunk;
			cloned.byEnd[clonedChunk.end] = clonedChunk;

			const nextOriginalChunk = originalChunk.next;
			const nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();

			if (nextClonedChunk) {
				clonedChunk.next = nextClonedChunk;
				nextClonedChunk.previous = clonedChunk;

				clonedChunk = nextClonedChunk;
			}

			originalChunk = nextOriginalChunk;
		}

		cloned.lastChunk = clonedChunk;

		if (this.indentExclusionRanges) {
			cloned.indentExclusionRanges = this.indentExclusionRanges.slice();
		}

		cloned.sourcemapLocations = new BitSet(this.sourcemapLocations);

		cloned.intro = this.intro;
		cloned.outro = this.outro;

		return cloned;
	}

	generateDecodedMap(options) {
		options = options || {};

		const sourceIndex = 0;
		const names = Object.keys(this.storedNames);
		const mappings = new Mappings(options.hires);

		const locate = getLocator(this.original);

		if (this.intro) {
			mappings.advance(this.intro);
		}

		this.firstChunk.eachNext((chunk) => {
			const loc = locate(chunk.start);

			if (chunk.intro.length) mappings.advance(chunk.intro);

			if (chunk.edited) {
				mappings.addEdit(
					sourceIndex,
					chunk.content,
					loc,
					chunk.storeName ? names.indexOf(chunk.original) : -1,
				);
			} else {
				mappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);
			}

			if (chunk.outro.length) mappings.advance(chunk.outro);
		});

		return {
			file: options.file ? options.file.split(/[/\\]/).pop() : undefined,
			sources: [
				options.source ? getRelativePath(options.file || '', options.source) : options.file || '',
			],
			sourcesContent: options.includeContent ? [this.original] : undefined,
			names,
			mappings: mappings.raw,
			x_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,
		};
	}

	generateMap(options) {
		return new SourceMap(this.generateDecodedMap(options));
	}

	_ensureindentStr() {
		if (this.indentStr === undefined) {
			this.indentStr = guessIndent(this.original);
		}
	}

	_getRawIndentString() {
		this._ensureindentStr();
		return this.indentStr;
	}

	getIndentString() {
		this._ensureindentStr();
		return this.indentStr === null ? '\t' : this.indentStr;
	}

	indent(indentStr, options) {
		const pattern = /^[^\r\n]/gm;

		if (isObject(indentStr)) {
			options = indentStr;
			indentStr = undefined;
		}

		if (indentStr === undefined) {
			this._ensureindentStr();
			indentStr = this.indentStr || '\t';
		}

		if (indentStr === '') return this; // noop

		options = options || {};

		// Process exclusion ranges
		const isExcluded = {};

		if (options.exclude) {
			const exclusions =
				typeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;
			exclusions.forEach((exclusion) => {
				for (let i = exclusion[0]; i < exclusion[1]; i += 1) {
					isExcluded[i] = true;
				}
			});
		}

		let shouldIndentNextCharacter = options.indentStart !== false;
		const replacer = (match) => {
			if (shouldIndentNextCharacter) return `${indentStr}${match}`;
			shouldIndentNextCharacter = true;
			return match;
		};

		this.intro = this.intro.replace(pattern, replacer);

		let charIndex = 0;
		let chunk = this.firstChunk;

		while (chunk) {
			const end = chunk.end;

			if (chunk.edited) {
				if (!isExcluded[charIndex]) {
					chunk.content = chunk.content.replace(pattern, replacer);

					if (chunk.content.length) {
						shouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\n';
					}
				}
			} else {
				charIndex = chunk.start;

				while (charIndex < end) {
					if (!isExcluded[charIndex]) {
						const char = this.original[charIndex];

						if (char === '\n') {
							shouldIndentNextCharacter = true;
						} else if (char !== '\r' && shouldIndentNextCharacter) {
							shouldIndentNextCharacter = false;

							if (charIndex === chunk.start) {
								chunk.prependRight(indentStr);
							} else {
								this._splitChunk(chunk, charIndex);
								chunk = chunk.next;
								chunk.prependRight(indentStr);
							}
						}
					}

					charIndex += 1;
				}
			}

			charIndex = chunk.end;
			chunk = chunk.next;
		}

		this.outro = this.outro.replace(pattern, replacer);

		return this;
	}

	insert() {
		throw new Error(
			'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',
		);
	}

	insertLeft(index, content) {
		if (!warned.insertLeft) {
			console.warn(
				'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',
			);
			warned.insertLeft = true;
		}

		return this.appendLeft(index, content);
	}

	insertRight(index, content) {
		if (!warned.insertRight) {
			console.warn(
				'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',
			);
			warned.insertRight = true;
		}

		return this.prependRight(index, content);
	}

	move(start, end, index) {
		start = start + this.offset;
		end = end + this.offset;
		index = index + this.offset;

		if (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');

		this._split(start);
		this._split(end);
		this._split(index);

		const first = this.byStart[start];
		const last = this.byEnd[end];

		const oldLeft = first.previous;
		const oldRight = last.next;

		const newRight = this.byStart[index];
		if (!newRight && last === this.lastChunk) return this;
		const newLeft = newRight ? newRight.previous : this.lastChunk;

		if (oldLeft) oldLeft.next = oldRight;
		if (oldRight) oldRight.previous = oldLeft;

		if (newLeft) newLeft.next = first;
		if (newRight) newRight.previous = last;

		if (!first.previous) this.firstChunk = last.next;
		if (!last.next) {
			this.lastChunk = first.previous;
			this.lastChunk.next = null;
		}

		first.previous = newLeft;
		last.next = newRight || null;

		if (!newLeft) this.firstChunk = first;
		if (!newRight) this.lastChunk = last;
		return this;
	}

	overwrite(start, end, content, options) {
		options = options || {};
		return this.update(start, end, content, { ...options, overwrite: !options.contentOnly });
	}

	update(start, end, content, options) {
		start = start + this.offset;
		end = end + this.offset;

		if (typeof content !== 'string') throw new TypeError('replacement content must be a string');

		if (this.original.length !== 0) {
			while (start < 0) start += this.original.length;
			while (end < 0) end += this.original.length;
		}

		if (end > this.original.length) throw new Error('end is out of bounds');
		if (start === end)
			throw new Error(
				'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',
			);

		this._split(start);
		this._split(end);

		if (options === true) {
			if (!warned.storeName) {
				console.warn(
					'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',
				);
				warned.storeName = true;
			}

			options = { storeName: true };
		}
		const storeName = options !== undefined ? options.storeName : false;
		const overwrite = options !== undefined ? options.overwrite : false;

		if (storeName) {
			const original = this.original.slice(start, end);
			Object.defineProperty(this.storedNames, original, {
				writable: true,
				value: true,
				enumerable: true,
			});
		}

		const first = this.byStart[start];
		const last = this.byEnd[end];

		if (first) {
			let chunk = first;
			while (chunk !== last) {
				if (chunk.next !== this.byStart[chunk.end]) {
					throw new Error('Cannot overwrite across a split point');
				}
				chunk = chunk.next;
				chunk.edit('', false);
			}

			first.edit(content, storeName, !overwrite);
		} else {
			// must be inserting at the end
			const newChunk = new Chunk(start, end, '').edit(content, storeName);

			// TODO last chunk in the array may not be the last chunk, if it's moved...
			last.next = newChunk;
			newChunk.previous = last;
		}
		return this;
	}

	prepend(content) {
		if (typeof content !== 'string') throw new TypeError('outro content must be a string');

		this.intro = content + this.intro;
		return this;
	}

	prependLeft(index, content) {
		index = index + this.offset;

		if (typeof content !== 'string') throw new TypeError('inserted content must be a string');

		this._split(index);

		const chunk = this.byEnd[index];

		if (chunk) {
			chunk.prependLeft(content);
		} else {
			this.intro = content + this.intro;
		}
		return this;
	}

	prependRight(index, content) {
		index = index + this.offset;

		if (typeof content !== 'string') throw new TypeError('inserted content must be a string');

		this._split(index);

		const chunk = this.byStart[index];

		if (chunk) {
			chunk.prependRight(content);
		} else {
			this.outro = content + this.outro;
		}
		return this;
	}

	remove(start, end) {
		start = start + this.offset;
		end = end + this.offset;

		if (this.original.length !== 0) {
			while (start < 0) start += this.original.length;
			while (end < 0) end += this.original.length;
		}

		if (start === end) return this;

		if (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');
		if (start > end) throw new Error('end must be greater than start');

		this._split(start);
		this._split(end);

		let chunk = this.byStart[start];

		while (chunk) {
			chunk.intro = '';
			chunk.outro = '';
			chunk.edit('');

			chunk = end > chunk.end ? this.byStart[chunk.end] : null;
		}
		return this;
	}

	reset(start, end) {
		start = start + this.offset;
		end = end + this.offset;

		if (this.original.length !== 0) {
			while (start < 0) start += this.original.length;
			while (end < 0) end += this.original.length;
		}

		if (start === end) return this;

		if (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');
		if (start > end) throw new Error('end must be greater than start');

		this._split(start);
		this._split(end);

		let chunk = this.byStart[start];

		while (chunk) {
			chunk.reset();

			chunk = end > chunk.end ? this.byStart[chunk.end] : null;
		}
		return this;
	}

	lastChar() {
		if (this.outro.length) return this.outro[this.outro.length - 1];
		let chunk = this.lastChunk;
		do {
			if (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];
			if (chunk.content.length) return chunk.content[chunk.content.length - 1];
			if (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];
		} while ((chunk = chunk.previous));
		if (this.intro.length) return this.intro[this.intro.length - 1];
		return '';
	}

	lastLine() {
		let lineIndex = this.outro.lastIndexOf(n);
		if (lineIndex !== -1) return this.outro.substr(lineIndex + 1);
		let lineStr = this.outro;
		let chunk = this.lastChunk;
		do {
			if (chunk.outro.length > 0) {
				lineIndex = chunk.outro.lastIndexOf(n);
				if (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;
				lineStr = chunk.outro + lineStr;
			}

			if (chunk.content.length > 0) {
				lineIndex = chunk.content.lastIndexOf(n);
				if (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;
				lineStr = chunk.content + lineStr;
			}

			if (chunk.intro.length > 0) {
				lineIndex = chunk.intro.lastIndexOf(n);
				if (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;
				lineStr = chunk.intro + lineStr;
			}
		} while ((chunk = chunk.previous));
		lineIndex = this.intro.lastIndexOf(n);
		if (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;
		return this.intro + lineStr;
	}

	slice(start = 0, end = this.original.length - this.offset) {
		start = start + this.offset;
		end = end + this.offset;

		if (this.original.length !== 0) {
			while (start < 0) start += this.original.length;
			while (end < 0) end += this.original.length;
		}

		let result = '';

		// find start chunk
		let chunk = this.firstChunk;
		while (chunk && (chunk.start > start || chunk.end <= start)) {
			// found end chunk before start
			if (chunk.start < end && chunk.end >= end) {
				return result;
			}

			chunk = chunk.next;
		}

		if (chunk && chunk.edited && chunk.start !== start)
			throw new Error(`Cannot use replaced character ${start} as slice start anchor.`);

		const startChunk = chunk;
		while (chunk) {
			if (chunk.intro && (startChunk !== chunk || chunk.start === start)) {
				result += chunk.intro;
			}

			const containsEnd = chunk.start < end && chunk.end >= end;
			if (containsEnd && chunk.edited && chunk.end !== end)
				throw new Error(`Cannot use replaced character ${end} as slice end anchor.`);

			const sliceStart = startChunk === chunk ? start - chunk.start : 0;
			const sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;

			result += chunk.content.slice(sliceStart, sliceEnd);

			if (chunk.outro && (!containsEnd || chunk.end === end)) {
				result += chunk.outro;
			}

			if (containsEnd) {
				break;
			}

			chunk = chunk.next;
		}

		return result;
	}

	// TODO deprecate this? not really very useful
	snip(start, end) {
		const clone = this.clone();
		clone.remove(0, start);
		clone.remove(end, clone.original.length);

		return clone;
	}

	_split(index) {
		if (this.byStart[index] || this.byEnd[index]) return;

		let chunk = this.lastSearchedChunk;
		const searchForward = index > chunk.end;

		while (chunk) {
			if (chunk.contains(index)) return this._splitChunk(chunk, index);

			chunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];
		}
	}

	_splitChunk(chunk, index) {
		if (chunk.edited && chunk.content.length) {
			// zero-length edited chunks are a special case (overlapping replacements)
			const loc = getLocator(this.original)(index);
			throw new Error(
				`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – "${chunk.original}")`,
			);
		}

		const newChunk = chunk.split(index);

		this.byEnd[index] = chunk;
		this.byStart[index] = newChunk;
		this.byEnd[newChunk.end] = newChunk;

		if (chunk === this.lastChunk) this.lastChunk = newChunk;

		this.lastSearchedChunk = chunk;
		return true;
	}

	toString() {
		let str = this.intro;

		let chunk = this.firstChunk;
		while (chunk) {
			str += chunk.toString();
			chunk = chunk.next;
		}

		return str + this.outro;
	}

	isEmpty() {
		let chunk = this.firstChunk;
		do {
			if (
				(chunk.intro.length && chunk.intro.trim()) ||
				(chunk.content.length && chunk.content.trim()) ||
				(chunk.outro.length && chunk.outro.trim())
			)
				return false;
		} while ((chunk = chunk.next));
		return true;
	}

	length() {
		let chunk = this.firstChunk;
		let length = 0;
		do {
			length += chunk.intro.length + chunk.content.length + chunk.outro.length;
		} while ((chunk = chunk.next));
		return length;
	}

	trimLines() {
		return this.trim('[\\r\\n]');
	}

	trim(charType) {
		return this.trimStart(charType).trimEnd(charType);
	}

	trimEndAborted(charType) {
		const rx = new RegExp((charType || '\\s') + '+$');

		this.outro = this.outro.replace(rx, '');
		if (this.outro.length) return true;

		let chunk = this.lastChunk;

		do {
			const end = chunk.end;
			const aborted = chunk.trimEnd(rx);

			// if chunk was trimmed, we have a new lastChunk
			if (chunk.end !== end) {
				if (this.lastChunk === chunk) {
					this.lastChunk = chunk.next;
				}

				this.byEnd[chunk.end] = chunk;
				this.byStart[chunk.next.start] = chunk.next;
				this.byEnd[chunk.next.end] = chunk.next;
			}

			if (aborted) return true;
			chunk = chunk.previous;
		} while (chunk);

		return false;
	}

	trimEnd(charType) {
		this.trimEndAborted(charType);
		return this;
	}
	trimStartAborted(charType) {
		const rx = new RegExp('^' + (charType || '\\s') + '+');

		this.intro = this.intro.replace(rx, '');
		if (this.intro.length) return true;

		let chunk = this.firstChunk;

		do {
			const end = chunk.end;
			const aborted = chunk.trimStart(rx);

			if (chunk.end !== end) {
				// special case...
				if (chunk === this.lastChunk) this.lastChunk = chunk.next;

				this.byEnd[chunk.end] = chunk;
				this.byStart[chunk.next.start] = chunk.next;
				this.byEnd[chunk.next.end] = chunk.next;
			}

			if (aborted) return true;
			chunk = chunk.next;
		} while (chunk);

		return false;
	}

	trimStart(charType) {
		this.trimStartAborted(charType);
		return this;
	}

	hasChanged() {
		return this.original !== this.toString();
	}

	_replaceRegexp(searchValue, replacement) {
		function getReplacement(match, str) {
			if (typeof replacement === 'string') {
				return replacement.replace(/\$(\$|&|\d+)/g, (_, i) => {
					// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter
					if (i === '$') return '$';
					if (i === '&') return match[0];
					const num = +i;
					if (num < match.length) return match[+i];
					return `$${i}`;
				});
			} else {
				return replacement(...match, match.index, str, match.groups);
			}
		}
		function matchAll(re, str) {
			let match;
			const matches = [];
			while ((match = re.exec(str))) {
				matches.push(match);
			}
			return matches;
		}
		if (searchValue.global) {
			const matches = matchAll(searchValue, this.original);
			matches.forEach((match) => {
				if (match.index != null) {
					const replacement = getReplacement(match, this.original);
					if (replacement !== match[0]) {
						this.overwrite(match.index, match.index + match[0].length, replacement);
					}
				}
			});
		} else {
			const match = this.original.match(searchValue);
			if (match && match.index != null) {
				const replacement = getReplacement(match, this.original);
				if (replacement !== match[0]) {
					this.overwrite(match.index, match.index + match[0].length, replacement);
				}
			}
		}
		return this;
	}

	_replaceString(string, replacement) {
		const { original } = this;
		const index = original.indexOf(string);

		if (index !== -1) {
			this.overwrite(index, index + string.length, replacement);
		}

		return this;
	}

	replace(searchValue, replacement) {
		if (typeof searchValue === 'string') {
			return this._replaceString(searchValue, replacement);
		}

		return this._replaceRegexp(searchValue, replacement);
	}

	_replaceAllString(string, replacement) {
		const { original } = this;
		const stringLength = string.length;
		for (
			let index = original.indexOf(string);
			index !== -1;
			index = original.indexOf(string, index + stringLength)
		) {
			const previous = original.slice(index, index + stringLength);
			if (previous !== replacement) this.overwrite(index, index + stringLength, replacement);
		}

		return this;
	}

	replaceAll(searchValue, replacement) {
		if (typeof searchValue === 'string') {
			return this._replaceAllString(searchValue, replacement);
		}

		if (!searchValue.global) {
			throw new TypeError(
				'MagicString.prototype.replaceAll called with a non-global RegExp argument',
			);
		}

		return this._replaceRegexp(searchValue, replacement);
	}
}

const REGISTRY$1 = new DomElementSchemaRegistry();
const REMOVE_XHTML_REGEX = /^:xhtml:/;
/**
 * Checks non-Angular elements and properties against the `DomElementSchemaRegistry`, a schema
 * maintained by the Angular team via extraction from a browser IDL.
 */
class RegistryDomSchemaChecker {
    resolver;
    _diagnostics = [];
    get diagnostics() {
        return this._diagnostics;
    }
    constructor(resolver) {
        this.resolver = resolver;
    }
    checkElement(id, element, schemas, hostIsStandalone) {
        // HTML elements inside an SVG `foreignObject` are declared in the `xhtml` namespace.
        // We need to strip it before handing it over to the registry because all HTML tag names
        // in the registry are without a namespace.
        const name = element.name.replace(REMOVE_XHTML_REGEX, '');
        if (!REGISTRY$1.hasElement(name, schemas)) {
            const mapping = this.resolver.getTemplateSourceMapping(id);
            const schemas = `'${hostIsStandalone ? '@Component' : '@NgModule'}.schemas'`;
            let errorMsg = `'${name}' is not a known element:\n`;
            errorMsg += `1. If '${name}' is an Angular component, then verify that it is ${hostIsStandalone
                ? "included in the '@Component.imports' of this component"
                : 'part of this module'}.\n`;
            if (name.indexOf('-') > -1) {
                errorMsg += `2. If '${name}' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the ${schemas} of this component to suppress this message.`;
            }
            else {
                errorMsg += `2. To allow any element add 'NO_ERRORS_SCHEMA' to the ${schemas} of this component.`;
            }
            const diag = makeTemplateDiagnostic(id, mapping, element.startSourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.SCHEMA_INVALID_ELEMENT), errorMsg);
            this._diagnostics.push(diag);
        }
    }
    checkProperty(id, element, name, span, schemas, hostIsStandalone) {
        if (!REGISTRY$1.hasProperty(element.name, name, schemas)) {
            const mapping = this.resolver.getTemplateSourceMapping(id);
            const decorator = hostIsStandalone ? '@Component' : '@NgModule';
            const schemas = `'${decorator}.schemas'`;
            let errorMsg = `Can't bind to '${name}' since it isn't a known property of '${element.name}'.`;
            if (element.name.startsWith('ng-')) {
                errorMsg +=
                    `\n1. If '${name}' is an Angular directive, then add 'CommonModule' to the '${decorator}.imports' of this component.` +
                        `\n2. To allow any property add 'NO_ERRORS_SCHEMA' to the ${schemas} of this component.`;
            }
            else if (element.name.indexOf('-') > -1) {
                errorMsg +=
                    `\n1. If '${element.name}' is an Angular component and it has '${name}' input, then verify that it is ${hostIsStandalone
                        ? "included in the '@Component.imports' of this component"
                        : 'part of this module'}.` +
                        `\n2. If '${element.name}' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the ${schemas} of this component to suppress this message.` +
                        `\n3. To allow any property add 'NO_ERRORS_SCHEMA' to the ${schemas} of this component.`;
            }
            const diag = makeTemplateDiagnostic(id, mapping, span, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.SCHEMA_INVALID_ATTRIBUTE), errorMsg);
            this._diagnostics.push(diag);
        }
    }
}

/**
 * An environment for a given source file that can be used to emit references.
 *
 * This can be used by the type-checking block, or constructor logic to generate
 * references to directives or other symbols or types.
 */
class ReferenceEmitEnvironment {
    importManager;
    refEmitter;
    reflector;
    contextFile;
    constructor(importManager, refEmitter, reflector, contextFile) {
        this.importManager = importManager;
        this.refEmitter = refEmitter;
        this.reflector = reflector;
        this.contextFile = contextFile;
    }
    canReferenceType(ref, flags = exports.ImportFlags.NoAliasing |
        exports.ImportFlags.AllowTypeImports |
        exports.ImportFlags.AllowRelativeDtsImports) {
        const result = this.refEmitter.emit(ref, this.contextFile, flags);
        return result.kind === exports.ReferenceEmitKind.Success;
    }
    /**
     * Generate a `ts.TypeNode` that references the given node as a type.
     *
     * This may involve importing the node into the file if it's not declared there already.
     */
    referenceType(ref, flags = exports.ImportFlags.NoAliasing |
        exports.ImportFlags.AllowTypeImports |
        exports.ImportFlags.AllowRelativeDtsImports) {
        const ngExpr = this.refEmitter.emit(ref, this.contextFile, flags);
        assertSuccessfulReferenceEmit(ngExpr, this.contextFile, 'symbol');
        // Create an `ExpressionType` from the `Expression` and translate it via `translateType`.
        // TODO(alxhub): support references to types with generic arguments in a clean way.
        return translateType(new ExpressionType(ngExpr.expression), this.contextFile, this.reflector, this.refEmitter, this.importManager);
    }
    /**
     * Generate a `ts.Expression` that refers to the external symbol. This
     * may result in new imports being generated.
     */
    referenceExternalSymbol(moduleName, name) {
        const external = new ExternalExpr({ moduleName, name });
        return translateExpression(this.contextFile, external, this.importManager);
    }
    /**
     * Generate a `ts.TypeNode` that references a given type from the provided module.
     *
     * This will involve importing the type into the file, and will also add type parameters if
     * provided.
     */
    referenceExternalType(moduleName, name, typeParams) {
        const external = new ExternalExpr({ moduleName, name });
        return translateType(new ExpressionType(external, TypeModifier.None, typeParams), this.contextFile, this.reflector, this.refEmitter, this.importManager);
    }
    /**
     * Generates a `ts.TypeNode` representing a type that is being referenced from a different place
     * in the program. Any type references inside the transplanted type will be rewritten so that
     * they can be imported in the context file.
     */
    referenceTransplantedType(type) {
        return translateType(type, this.contextFile, this.reflector, this.refEmitter, this.importManager);
    }
}

/**
 * A `Set` of `ts.SyntaxKind`s of `ts.Expression` which are safe to wrap in a `ts.AsExpression`
 * without needing to be wrapped in parentheses.
 *
 * For example, `foo.bar()` is a `ts.CallExpression`, and can be safely cast to `any` with
 * `foo.bar() as any`. however, `foo !== bar` is a `ts.BinaryExpression`, and attempting to cast
 * without the parentheses yields the expression `foo !== bar as any`. This is semantically
 * equivalent to `foo !== (bar as any)`, which is not what was intended. Thus,
 * `ts.BinaryExpression`s need to be wrapped in parentheses before casting.
 */
//
const SAFE_TO_CAST_WITHOUT_PARENS = new Set([
    // Expressions which are already parenthesized can be cast without further wrapping.
    ts.SyntaxKind.ParenthesizedExpression,
    // Expressions which form a single lexical unit leave no room for precedence issues with the cast.
    ts.SyntaxKind.Identifier,
    ts.SyntaxKind.CallExpression,
    ts.SyntaxKind.NonNullExpression,
    ts.SyntaxKind.ElementAccessExpression,
    ts.SyntaxKind.PropertyAccessExpression,
    ts.SyntaxKind.ArrayLiteralExpression,
    ts.SyntaxKind.ObjectLiteralExpression,
    // The same goes for various literals.
    ts.SyntaxKind.StringLiteral,
    ts.SyntaxKind.NumericLiteral,
    ts.SyntaxKind.TrueKeyword,
    ts.SyntaxKind.FalseKeyword,
    ts.SyntaxKind.NullKeyword,
    ts.SyntaxKind.UndefinedKeyword,
]);
function tsCastToAny(expr) {
    // Wrap `expr` in parentheses if needed (see `SAFE_TO_CAST_WITHOUT_PARENS` above).
    if (!SAFE_TO_CAST_WITHOUT_PARENS.has(expr.kind)) {
        expr = ts.factory.createParenthesizedExpression(expr);
    }
    // The outer expression is always wrapped in parentheses.
    return ts.factory.createParenthesizedExpression(ts.factory.createAsExpression(expr, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)));
}
/**
 * Create an expression which instantiates an element by its HTML tagName.
 *
 * Thanks to narrowing of `document.createElement()`, this expression will have its type inferred
 * based on the tag name, including for custom elements that have appropriate .d.ts definitions.
 */
function tsCreateElement(tagName) {
    const createElement = ts.factory.createPropertyAccessExpression(
    /* expression */ ts.factory.createIdentifier('document'), 'createElement');
    return ts.factory.createCallExpression(
    /* expression */ createElement, 
    /* typeArguments */ undefined, 
    /* argumentsArray */ [ts.factory.createStringLiteral(tagName)]);
}
/**
 * Create a `ts.VariableStatement` which declares a variable without explicit initialization.
 *
 * The initializer `null!` is used to bypass strict variable initialization checks.
 *
 * Unlike with `tsCreateVariable`, the type of the variable is explicitly specified.
 */
function tsDeclareVariable(id, type) {
    // When we create a variable like `var _t1: boolean = null!`, TypeScript actually infers `_t1`
    // to be `never`, instead of a `boolean`. To work around it, we cast the value
    // in the initializer, e.g. `var _t1 = null! as boolean;`.
    addExpressionIdentifier(type, ExpressionIdentifier.VARIABLE_AS_EXPRESSION);
    const initializer = ts.factory.createAsExpression(ts.factory.createNonNullExpression(ts.factory.createNull()), type);
    const decl = ts.factory.createVariableDeclaration(
    /* name */ id, 
    /* exclamationToken */ undefined, 
    /* type */ undefined, 
    /* initializer */ initializer);
    return ts.factory.createVariableStatement(
    /* modifiers */ undefined, 
    /* declarationList */ [decl]);
}
/**
 * Creates a `ts.TypeQueryNode` for a coerced input.
 *
 * For example: `typeof MatInput.ngAcceptInputType_value`, where MatInput is `typeName` and `value`
 * is the `coercedInputName`.
 *
 * @param typeName The `EntityName` of the Directive where the static coerced input is defined.
 * @param coercedInputName The field name of the coerced input.
 */
function tsCreateTypeQueryForCoercedInput(typeName, coercedInputName) {
    return ts.factory.createTypeQueryNode(ts.factory.createQualifiedName(typeName, `ngAcceptInputType_${coercedInputName}`));
}
/**
 * Create a `ts.VariableStatement` that initializes a variable with a given expression.
 *
 * Unlike with `tsDeclareVariable`, the type of the variable is inferred from the initializer
 * expression.
 */
function tsCreateVariable(id, initializer, flags = null) {
    const decl = ts.factory.createVariableDeclaration(
    /* name */ id, 
    /* exclamationToken */ undefined, 
    /* type */ undefined, 
    /* initializer */ initializer);
    return ts.factory.createVariableStatement(
    /* modifiers */ undefined, 
    /* declarationList */ flags === null
        ? [decl]
        : ts.factory.createVariableDeclarationList([decl], flags));
}
/**
 * Construct a `ts.CallExpression` that calls a method on a receiver.
 */
function tsCallMethod(receiver, methodName, args = []) {
    const methodAccess = ts.factory.createPropertyAccessExpression(receiver, methodName);
    return ts.factory.createCallExpression(
    /* expression */ methodAccess, 
    /* typeArguments */ undefined, 
    /* argumentsArray */ args);
}
function isAccessExpression(node) {
    return ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node);
}
/**
 * Creates a TypeScript node representing a numeric value.
 */
function tsNumericExpression(value) {
    // As of TypeScript 5.3 negative numbers are represented as `prefixUnaryOperator` and passing a
    // negative number (even as a string) into `createNumericLiteral` will result in an error.
    if (value < 0) {
        const operand = ts.factory.createNumericLiteral(Math.abs(value));
        return ts.factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, operand);
    }
    return ts.factory.createNumericLiteral(value);
}

/**
 * See `TypeEmitter` for more information on the emitting process.
 */
class TypeParameterEmitter {
    typeParameters;
    reflector;
    constructor(typeParameters, reflector) {
        this.typeParameters = typeParameters;
        this.reflector = reflector;
    }
    /**
     * Determines whether the type parameters can be emitted. If this returns true, then a call to
     * `emit` is known to succeed. Vice versa, if false is returned then `emit` should not be
     * called, as it would fail.
     */
    canEmit(canEmitReference) {
        if (this.typeParameters === undefined) {
            return true;
        }
        return this.typeParameters.every((typeParam) => {
            return (this.canEmitType(typeParam.constraint, canEmitReference) &&
                this.canEmitType(typeParam.default, canEmitReference));
        });
    }
    canEmitType(type, canEmitReference) {
        if (type === undefined) {
            return true;
        }
        return canEmitType(type, (typeReference) => {
            const reference = this.resolveTypeReference(typeReference);
            if (reference === null) {
                return false;
            }
            if (reference instanceof Reference) {
                return canEmitReference(reference);
            }
            return true;
        });
    }
    /**
     * Emits the type parameters using the provided emitter function for `Reference`s.
     */
    emit(emitReference) {
        if (this.typeParameters === undefined) {
            return undefined;
        }
        const emitter = new TypeEmitter((type) => this.translateTypeReference(type, emitReference));
        return this.typeParameters.map((typeParam) => {
            const constraint = typeParam.constraint !== undefined ? emitter.emitType(typeParam.constraint) : undefined;
            const defaultType = typeParam.default !== undefined ? emitter.emitType(typeParam.default) : undefined;
            return ts.factory.updateTypeParameterDeclaration(typeParam, typeParam.modifiers, typeParam.name, constraint, defaultType);
        });
    }
    resolveTypeReference(type) {
        const target = ts.isIdentifier(type.typeName) ? type.typeName : type.typeName.right;
        const declaration = this.reflector.getDeclarationOfIdentifier(target);
        // If no declaration could be resolved or does not have a `ts.Declaration`, the type cannot be
        // resolved.
        if (declaration === null || declaration.node === null) {
            return null;
        }
        // If the declaration corresponds with a local type parameter, the type reference can be used
        // as is.
        if (this.isLocalTypeParameter(declaration.node)) {
               return type;
        }
        let owningModule = null;
        if (typeof declaration.viaModule === 'string') {
            owningModule = {
                specifier: declaration.viaModule,
                resolutionContext: type.getSourceFile().fileName,
            };
        }
        return new Reference(declaration.node, declaration.viaModule === AmbientImport ? AmbientImport : owningModule);
    }
    translateTypeReference(type, emitReference) {
        const reference = this.resolveTypeReference(type);
        if (!(reference instanceof Reference)) {
            return reference;
        }
        const typeNode = emitReference(reference);
        if (typeNode === null) {
            return null;
        }
        if (!ts.isTypeReferenceNode(typeNode)) {
            throw new Error(`Expected TypeReferenceNode for emitted reference, got ${ts.SyntaxKind[typeNode.kind]}.`);
        }
        return typeNode;
    }
    isLocalTypeParameter(decl) {
        // Checking for local type parameters only occurs during resolution of type parameters, so it is
        // guaranteed that type parameters are present.
        return this.typeParameters.some((param) => param === decl);
    }
}

/**
 * External modules/identifiers that always should exist for type check
 * block files.
 *
 * Importing the modules in preparation helps ensuring a stable import graph
 * that would not degrade TypeScript's incremental program structure re-use.
 *
 * Note: For inline type check blocks, or type constructors, we cannot add preparation
 * imports, but ideally the required modules are already imported and can be re-used
 * to not incur a structural TypeScript program re-use discarding.
 */
const TCB_FILE_IMPORT_GRAPH_PREPARE_IDENTIFIERS = [
    // Imports may be added for signal input checking. We wouldn't want to change the
    // import graph for incremental compilations when suddenly a signal input is used,
    // or removed.
    Identifiers.InputSignalBrandWriteType,
];
/**
 * Indicates whether a particular component requires an inline type check block.
 *
 * This is not a boolean state as inlining might only be required to get the best possible
 * type-checking, but the component could theoretically still be checked without it.
 */
var TcbInliningRequirement;
(function (TcbInliningRequirement) {
    /**
     * There is no way to type check this component without inlining.
     */
    TcbInliningRequirement[TcbInliningRequirement["MustInline"] = 0] = "MustInline";
    /**
     * Inlining should be used due to the component's generic bounds, but a non-inlining fallback
     * method can be used if that's not possible.
     */
    TcbInliningRequirement[TcbInliningRequirement["ShouldInlineForGenericBounds"] = 1] = "ShouldInlineForGenericBounds";
    /**
     * There is no requirement for this component's TCB to be inlined.
     */
    TcbInliningRequirement[TcbInliningRequirement["None"] = 2] = "None";
})(TcbInliningRequirement || (TcbInliningRequirement = {}));
function requiresInlineTypeCheckBlock(ref, env, usedPipes, reflector) {
    // In order to qualify for a declared TCB (not inline) two conditions must be met:
    // 1) the class must be suitable to be referenced from `env` (e.g. it must be exported)
    // 2) it must not have contextual generic type bounds
    if (!env.canReferenceType(ref)) {
        // Condition 1 is false, the class is not exported.
        return TcbInliningRequirement.MustInline;
    }
    else if (!checkIfGenericTypeBoundsCanBeEmitted(ref.node, reflector, env)) {
        // Condition 2 is false, the class has constrained generic types. It should be checked with an
        // inline TCB if possible, but can potentially use fallbacks to avoid inlining if not.
        return TcbInliningRequirement.ShouldInlineForGenericBounds;
    }
    else if (usedPipes.some((pipeRef) => !env.canReferenceType(pipeRef))) {
        // If one of the pipes used by the component is not exported, a non-inline TCB will not be able
        // to import it, so this requires an inline TCB.
        return TcbInliningRequirement.MustInline;
    }
    else {
        return TcbInliningRequirement.None;
    }
}
/** Maps a shim position back to a source code location. */
function getSourceMapping(shimSf, position, resolver, isDiagnosticRequest) {
    const node = getTokenAtPosition(shimSf, position);
    const sourceLocation = findSourceLocation(node, shimSf, isDiagnosticRequest);
    if (sourceLocation === null) {
        return null;
    }
    const mapping = resolver.getTemplateSourceMapping(sourceLocation.id);
    const span = resolver.toTemplateParseSourceSpan(sourceLocation.id, sourceLocation.span);
    if (span === null) {
        return null;
    }
    // TODO(atscott): Consider adding a context span by walking up from `node` until we get a
    // different span.
    return { sourceLocation, sourceMapping: mapping, span };
}
function findTypeCheckBlock(file, id, isDiagnosticRequest) {
    for (const stmt of file.statements) {
        if (ts.isFunctionDeclaration(stmt) && getTemplateId(stmt, file, isDiagnosticRequest) === id) {
            return stmt;
        }
    }
    return null;
}
/**
 * Traverses up the AST starting from the given node to extract the source location from comments
 * that have been emitted into the TCB. If the node does not exist within a TCB, or if an ignore
 * marker comment is found up the tree (and this is part of a diagnostic request), this function
 * returns null.
 */
function findSourceLocation(node, sourceFile, isDiagnosticsRequest) {
    // Search for comments until the TCB's function declaration is encountered.
    while (node !== undefined && !ts.isFunctionDeclaration(node)) {
        if (hasIgnoreForDiagnosticsMarker(node, sourceFile) && isDiagnosticsRequest) {
            // There's an ignore marker on this node, so the diagnostic should not be reported.
            return null;
        }
        const span = readSpanComment(node, sourceFile);
        if (span !== null) {
            // Once the positional information has been extracted, search further up the TCB to extract
            // the unique id that is attached with the TCB's function declaration.
            const id = getTemplateId(node, sourceFile, isDiagnosticsRequest);
            if (id === null) {
                return null;
            }
            return { id, span };
        }
        node = node.parent;
    }
    return null;
}
function getTemplateId(node, sourceFile, isDiagnosticRequest) {
    // Walk up to the function declaration of the TCB, the file information is attached there.
    while (!ts.isFunctionDeclaration(node)) {
        if (hasIgnoreForDiagnosticsMarker(node, sourceFile) && isDiagnosticRequest) {
            // There's an ignore marker on this node, so the diagnostic should not be reported.
            return null;
        }
        node = node.parent;
        // Bail once we have reached the root.
        if (node === undefined) {
            return null;
        }
    }
    const start = node.getFullStart();
    return (ts.forEachLeadingCommentRange(sourceFile.text, start, (pos, end, kind) => {
        if (kind !== ts.SyntaxKind.MultiLineCommentTrivia) {
            return null;
        }
        const commentText = sourceFile.text.substring(pos + 2, end - 2);
        return commentText;
    }) || null);
}
/**
 * Ensure imports for certain external modules that should always
 * exist are generated. These are ensured to exist to avoid frequent
 * import graph changes whenever e.g. a signal input is introduced in user code.
 */
function ensureTypeCheckFilePreparationImports(env) {
    for (const identifier of TCB_FILE_IMPORT_GRAPH_PREPARE_IDENTIFIERS) {
        env.importManager.addImport({
            exportModuleSpecifier: identifier.moduleName,
            exportSymbolName: identifier.name,
            requestedFile: env.contextFile,
        });
    }
}
function checkIfGenericTypeBoundsCanBeEmitted(node, reflector, env) {
    // Generic type parameters are considered context free if they can be emitted into any context.
    const emitter = new TypeParameterEmitter(node.typeParameters, reflector);
    return emitter.canEmit((ref) => env.canReferenceType(ref));
}

function generateTypeCtorDeclarationFn(env, meta, nodeTypeRef, typeParams) {
    const rawTypeArgs = typeParams !== undefined ? generateGenericArgs(typeParams) : undefined;
    const rawType = ts.factory.createTypeReferenceNode(nodeTypeRef, rawTypeArgs);
    const initParam = constructTypeCtorParameter(env, meta, rawType);
    const typeParameters = typeParametersWithDefaultTypes(typeParams);
    if (meta.body) {
        const fnType = ts.factory.createFunctionTypeNode(
        /* typeParameters */ typeParameters, 
        /* parameters */ [initParam], 
        /* type */ rawType);
        const decl = ts.factory.createVariableDeclaration(
        /* name */ meta.fnName, 
        /* exclamationToken */ undefined, 
        /* type */ fnType, 
        /* body */ ts.factory.createNonNullExpression(ts.factory.createNull()));
        const declList = ts.factory.createVariableDeclarationList([decl], ts.NodeFlags.Const);
        return ts.factory.createVariableStatement(
        /* modifiers */ undefined, 
        /* declarationList */ declList);
    }
    else {
        return ts.factory.createFunctionDeclaration(
        /* modifiers */ [ts.factory.createModifier(ts.SyntaxKind.DeclareKeyword)], 
        /* asteriskToken */ undefined, 
        /* name */ meta.fnName, 
        /* typeParameters */ typeParameters, 
        /* parameters */ [initParam], 
        /* type */ rawType, 
        /* body */ undefined);
    }
}
/**
 * Generate an inline type constructor for the given class and metadata.
 *
 * An inline type constructor is a specially shaped TypeScript static method, intended to be placed
 * within a directive class itself, that permits type inference of any generic type parameters of
 * the class from the types of expressions bound to inputs or outputs, and the types of elements
 * that match queries performed by the directive. It also catches any errors in the types of these
 * expressions. This method is never called at runtime, but is used in type-check blocks to
 * construct directive types.
 *
 * An inline type constructor for NgFor looks like:
 *
 * static ngTypeCtor<T>(init: Pick<NgForOf<T>, 'ngForOf'|'ngForTrackBy'|'ngForTemplate'>):
 *   NgForOf<T>;
 *
 * A typical constructor would be:
 *
 * NgForOf.ngTypeCtor(init: {
 *   ngForOf: ['foo', 'bar'],
 *   ngForTrackBy: null as any,
 *   ngForTemplate: null as any,
 * }); // Infers a type of NgForOf<string>.
 *
 * Any inputs declared on the type for which no property binding is present are assigned a value of
 * type `any`, to avoid producing any type errors for unset inputs.
 *
 * Inline type constructors are used when the type being created has bounded generic types which
 * make writing a declared type constructor (via `generateTypeCtorDeclarationFn`) difficult or
 * impossible.
 *
 * @param node the `ClassDeclaration<ts.ClassDeclaration>` for which a type constructor will be
 * generated.
 * @param meta additional metadata required to generate the type constructor.
 * @returns a `ts.MethodDeclaration` for the type constructor.
 */
function generateInlineTypeCtor(env, node, meta) {
    // Build rawType, a `ts.TypeNode` of the class with its generic parameters passed through from
    // the definition without any type bounds. For example, if the class is
    // `FooDirective<T extends Bar>`, its rawType would be `FooDirective<T>`.
    const rawTypeArgs = node.typeParameters !== undefined ? generateGenericArgs(node.typeParameters) : undefined;
    const rawType = ts.factory.createTypeReferenceNode(node.name, rawTypeArgs);
    const initParam = constructTypeCtorParameter(env, meta, rawType);
    // If this constructor is being generated into a .ts file, then it needs a fake body. The body
    // is set to a return of `null!`. If the type constructor is being generated into a .d.ts file,
    // it needs no body.
    let body = undefined;
    if (meta.body) {
        body = ts.factory.createBlock([
            ts.factory.createReturnStatement(ts.factory.createNonNullExpression(ts.factory.createNull())),
        ]);
    }
    // Create the type constructor method declaration.
    return ts.factory.createMethodDeclaration(
    /* modifiers */ [ts.factory.createModifier(ts.SyntaxKind.StaticKeyword)], 
    /* asteriskToken */ undefined, 
    /* name */ meta.fnName, 
    /* questionToken */ undefined, 
    /* typeParameters */ typeParametersWithDefaultTypes(node.typeParameters), 
    /* parameters */ [initParam], 
    /* type */ rawType, 
    /* body */ body);
}
function constructTypeCtorParameter(env, meta, rawType) {
    // initType is the type of 'init', the single argument to the type constructor method.
    // If the Directive has any inputs, its initType will be:
    //
    // Pick<rawType, 'inputA'|'inputB'>
    //
    // Pick here is used to select only those fields from which the generic type parameters of the
    // directive will be inferred.
    //
    // In the special case there are no inputs, initType is set to {}.
    let initType = null;
    const plainKeys = [];
    const coercedKeys = [];
    const signalInputKeys = [];
    for (const { classPropertyName, transform, isSignal } of meta.fields.inputs) {
        if (isSignal) {
            signalInputKeys.push(ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(classPropertyName)));
        }
        else if (!meta.coercedInputFields.has(classPropertyName)) {
            plainKeys.push(ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(classPropertyName)));
        }
        else {
            const coercionType = transform != null
                ? transform.type.node
                : tsCreateTypeQueryForCoercedInput(rawType.typeName, classPropertyName);
            coercedKeys.push(ts.factory.createPropertySignature(
            /* modifiers */ undefined, 
            /* name */ classPropertyName, 
            /* questionToken */ undefined, 
            /* type */ coercionType));
        }
    }
    if (plainKeys.length > 0) {
        // Construct a union of all the field names.
        const keyTypeUnion = ts.factory.createUnionTypeNode(plainKeys);
        // Construct the Pick<rawType, keyTypeUnion>.
        initType = ts.factory.createTypeReferenceNode('Pick', [rawType, keyTypeUnion]);
    }
    if (coercedKeys.length > 0) {
        const coercedLiteral = ts.factory.createTypeLiteralNode(coercedKeys);
        initType =
            initType !== null
                ? ts.factory.createIntersectionTypeNode([initType, coercedLiteral])
                : coercedLiteral;
    }
    if (signalInputKeys.length > 0) {
        const keyTypeUnion = ts.factory.createUnionTypeNode(signalInputKeys);
        // Construct the UnwrapDirectiveSignalInputs<rawType, keyTypeUnion>.
        const unwrapDirectiveSignalInputsExpr = env.referenceExternalType(Identifiers.UnwrapDirectiveSignalInputs.moduleName, Identifiers.UnwrapDirectiveSignalInputs.name, [
            // TODO:
            new ExpressionType(new WrappedNodeExpr(rawType)),
            new ExpressionType(new WrappedNodeExpr(keyTypeUnion)),
        ]);
        initType =
            initType !== null
                ? ts.factory.createIntersectionTypeNode([initType, unwrapDirectiveSignalInputsExpr])
                : unwrapDirectiveSignalInputsExpr;
    }
    if (initType === null) {
        // Special case - no inputs, outputs, or other fields which could influence the result type.
        initType = ts.factory.createTypeLiteralNode([]);
    }
    // Create the 'init' parameter itself.
    return ts.factory.createParameterDeclaration(
    /* modifiers */ undefined, 
    /* dotDotDotToken */ undefined, 
    /* name */ 'init', 
    /* questionToken */ undefined, 
    /* type */ initType, 
    /* initializer */ undefined);
}
function generateGenericArgs(params) {
    return params.map((param) => ts.factory.createTypeReferenceNode(param.name, undefined));
}
function requiresInlineTypeCtor(node, host, env) {
    // The class requires an inline type constructor if it has generic type bounds that can not be
    // emitted into the provided type-check environment.
    return !checkIfGenericTypeBoundsCanBeEmitted(node, host, env);
}
/**
 * Add a default `= any` to type parameters that don't have a default value already.
 *
 * TypeScript uses the default type of a type parameter whenever inference of that parameter
 * fails. This can happen when inferring a complex type from 'any'. For example, if `NgFor`'s
 * inference is done with the TCB code:
 *
 * ```ts
 * class NgFor<T> {
 *   ngForOf: T[];
 * }
 *
 * declare function ctor<T>(o: Pick<NgFor<T>, 'ngForOf'|'ngForTrackBy'|'ngForTemplate'>):
 * NgFor<T>;
 * ```
 *
 * An invocation looks like:
 *
 * ```ts
 * var _t1 = ctor({ngForOf: [1, 2], ngForTrackBy: null as any, ngForTemplate: null as any});
 * ```
 *
 * This correctly infers the type `NgFor<number>` for `_t1`, since `T` is inferred from the
 * assignment of type `number[]` to `ngForOf`'s type `T[]`. However, if `any` is passed instead:
 *
 * ```ts
 * var _t2 = ctor({ngForOf: [1, 2] as any, ngForTrackBy: null as any, ngForTemplate: null as
 * any});
 * ```
 *
 * then inference for `T` fails (it cannot be inferred from `T[] = any`). In this case, `T`
 * takes the type `{}`, and so `_t2` is inferred as `NgFor<{}>`. This is obviously wrong.
 *
 * Adding a default type to the generic declaration in the constructor solves this problem, as
 * the default type will be used in the event that inference fails.
 *
 * ```ts
 * declare function ctor<T = any>(o: Pick<NgFor<T>, 'ngForOf'>): NgFor<T>;
 *
 * var _t3 = ctor({ngForOf: [1, 2] as any});
 * ```
 *
 * This correctly infers `T` as `any`, and therefore `_t3` as `NgFor<any>`.
 */
function typeParametersWithDefaultTypes(params) {
    if (params === undefined) {
        return undefined;
    }
    return params.map((param) => {
        if (param.default === undefined) {
            return ts.factory.updateTypeParameterDeclaration(param, param.modifiers, param.name, param.constraint, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
        }
        else {
            return param;
        }
    });
}

/**
 * A context which hosts one or more Type Check Blocks (TCBs).
 *
 * An `Environment` supports the generation of TCBs by tracking necessary imports, declarations of
 * type constructors, and other statements beyond the type-checking code within the TCB itself.
 * Through method calls on `Environment`, the TCB generator can request `ts.Expression`s which
 * reference declarations in the `Environment` for these artifacts`.
 *
 * `Environment` can be used in a standalone fashion, or can be extended to support more specialized
 * usage.
 */
class Environment extends ReferenceEmitEnvironment {
    config;
    nextIds = {
        pipeInst: 1,
        typeCtor: 1,
    };
    typeCtors = new Map();
    typeCtorStatements = [];
    pipeInsts = new Map();
    pipeInstStatements = [];
    constructor(config, importManager, refEmitter, reflector, contextFile) {
        super(importManager, refEmitter, reflector, contextFile);
        this.config = config;
    }
    /**
     * Get an expression referring to a type constructor for the given directive.
     *
     * Depending on the shape of the directive itself, this could be either a reference to a declared
     * type constructor, or to an inline type constructor.
     */
    typeCtorFor(dir) {
        const dirRef = dir.ref;
        const node = dirRef.node;
        if (this.typeCtors.has(node)) {
            return this.typeCtors.get(node);
        }
        if (requiresInlineTypeCtor(node, this.reflector, this)) {
            // The constructor has already been created inline, we just need to construct a reference to
            // it.
            const ref = this.reference(dirRef);
            const typeCtorExpr = ts.factory.createPropertyAccessExpression(ref, 'ngTypeCtor');
            this.typeCtors.set(node, typeCtorExpr);
            return typeCtorExpr;
        }
        else {
            const fnName = `_ctor${this.nextIds.typeCtor++}`;
            const nodeTypeRef = this.referenceType(dirRef);
            if (!ts.isTypeReferenceNode(nodeTypeRef)) {
                throw new Error(`Expected TypeReferenceNode from reference to ${dirRef.debugName}`);
            }
            const meta = {
                fnName,
                body: true,
                fields: {
                    inputs: dir.inputs,
                    // TODO: support queries
                    queries: dir.queries,
                },
                coercedInputFields: dir.coercedInputFields,
            };
            const typeParams = this.emitTypeParameters(node);
            const typeCtor = generateTypeCtorDeclarationFn(this, meta, nodeTypeRef.typeName, typeParams);
            this.typeCtorStatements.push(typeCtor);
            const fnId = ts.factory.createIdentifier(fnName);
            this.typeCtors.set(node, fnId);
            return fnId;
        }
    }
    /*
     * Get an expression referring to an instance of the given pipe.
     */
    pipeInst(ref) {
        if (this.pipeInsts.has(ref.node)) {
            return this.pipeInsts.get(ref.node);
        }
        const pipeType = this.referenceType(ref);
        const pipeInstId = ts.factory.createIdentifier(`_pipe${this.nextIds.pipeInst++}`);
        this.pipeInstStatements.push(tsDeclareVariable(pipeInstId, pipeType));
        this.pipeInsts.set(ref.node, pipeInstId);
        return pipeInstId;
    }
    /**
     * Generate a `ts.Expression` that references the given node.
     *
     * This may involve importing the node into the file if it's not declared there already.
     */
    reference(ref) {
        // Disable aliasing for imports generated in a template type-checking context, as there is no
        // guarantee that any alias re-exports exist in the .d.ts files. It's safe to use direct imports
        // in these cases as there is no strict dependency checking during the template type-checking
        // pass.
        const ngExpr = this.refEmitter.emit(ref, this.contextFile, exports.ImportFlags.NoAliasing);
        assertSuccessfulReferenceEmit(ngExpr, this.contextFile, 'class');
        // Use `translateExpression` to convert the `Expression` into a `ts.Expression`.
        return translateExpression(this.contextFile, ngExpr.expression, this.importManager);
    }
    emitTypeParameters(declaration) {
        const emitter = new TypeParameterEmitter(declaration.typeParameters, this.reflector);
        return emitter.emit((ref) => this.referenceType(ref));
    }
    getPreludeStatements() {
        return [...this.pipeInstStatements, ...this.typeCtorStatements];
    }
}

class OutOfBandDiagnosticRecorderImpl {
    resolver;
    _diagnostics = [];
    /**
     * Tracks which `BindingPipe` nodes have already been recorded as invalid, so only one diagnostic
     * is ever produced per node.
     */
    recordedPipes = new Set();
    constructor(resolver) {
        this.resolver = resolver;
    }
    get diagnostics() {
        return this._diagnostics;
    }
    missingReferenceTarget(id, ref) {
        const mapping = this.resolver.getTemplateSourceMapping(id);
        const value = ref.value.trim();
        const errorMsg = `No directive found with exportAs '${value}'.`;
        this._diagnostics.push(makeTemplateDiagnostic(id, mapping, ref.valueSpan || ref.sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.MISSING_REFERENCE_TARGET), errorMsg));
    }
    missingPipe(id, ast) {
        if (this.recordedPipes.has(ast)) {
            return;
        }
        const mapping = this.resolver.getTemplateSourceMapping(id);
        const errorMsg = `No pipe found with name '${ast.name}'.`;
        const sourceSpan = this.resolver.toTemplateParseSourceSpan(id, ast.nameSpan);
        if (sourceSpan === null) {
            throw new Error(`Assertion failure: no SourceLocation found for usage of pipe '${ast.name}'.`);
        }
        this._diagnostics.push(makeTemplateDiagnostic(id, mapping, sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.MISSING_PIPE), errorMsg));
        this.recordedPipes.add(ast);
    }
    deferredPipeUsedEagerly(id, ast) {
        if (this.recordedPipes.has(ast)) {
            return;
        }
        const mapping = this.resolver.getTemplateSourceMapping(id);
        const errorMsg = `Pipe '${ast.name}' was imported  via \`@Component.deferredImports\`, ` +
            `but was used outside of a \`@defer\` block in a template. To fix this, either ` +
            `use the '${ast.name}' pipe inside of a \`@defer\` block or import this dependency ` +
            `using the \`@Component.imports\` field.`;
        const sourceSpan = this.resolver.toTemplateParseSourceSpan(id, ast.nameSpan);
        if (sourceSpan === null) {
            throw new Error(`Assertion failure: no SourceLocation found for usage of pipe '${ast.name}'.`);
        }
        this._diagnostics.push(makeTemplateDiagnostic(id, mapping, sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.DEFERRED_PIPE_USED_EAGERLY), errorMsg));
        this.recordedPipes.add(ast);
    }
    deferredComponentUsedEagerly(id, element) {
        const mapping = this.resolver.getTemplateSourceMapping(id);
        const errorMsg = `Element '${element.name}' contains a component or a directive that ` +
            `was imported  via \`@Component.deferredImports\`, but the element itself is located ` +
            `outside of a \`@defer\` block in a template. To fix this, either ` +
            `use the '${element.name}' element inside of a \`@defer\` block or ` +
            `import referenced component/directive dependency using the \`@Component.imports\` field.`;
        const { start, end } = element.startSourceSpan;
        const absoluteSourceSpan = new AbsoluteSourceSpan(start.offset, end.offset);
        const sourceSpan = this.resolver.toTemplateParseSourceSpan(id, absoluteSourceSpan);
        if (sourceSpan === null) {
            throw new Error(`Assertion failure: no SourceLocation found for usage of pipe '${element.name}'.`);
        }
        this._diagnostics.push(makeTemplateDiagnostic(id, mapping, sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.DEFERRED_DIRECTIVE_USED_EAGERLY), errorMsg));
    }
    duplicateTemplateVar(id, variable, firstDecl) {
        const mapping = this.resolver.getTemplateSourceMapping(id);
        const errorMsg = `Cannot redeclare variable '${variable.name}' as it was previously declared elsewhere for the same template.`;
        // The allocation of the error here is pretty useless for variables declared in microsyntax,
        // since the sourceSpan refers to the entire microsyntax property, not a span for the specific
        // variable in question.
        //
        // TODO(alxhub): allocate to a tighter span once one is available.
        this._diagnostics.push(makeTemplateDiagnostic(id, mapping, variable.sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.DUPLICATE_VARIABLE_DECLARATION), errorMsg, [
            {
                text: `The variable '${firstDecl.name}' was first declared here.`,
                start: firstDecl.sourceSpan.start.offset,
                end: firstDecl.sourceSpan.end.offset,
                sourceFile: mapping.node.getSourceFile(),
            },
        ]));
    }
    requiresInlineTcb(id, node) {
        this._diagnostics.push(makeInlineDiagnostic(id, exports.ErrorCode.INLINE_TCB_REQUIRED, node.name, `This component requires inline template type-checking, which is not supported by the current environment.`));
    }
    requiresInlineTypeConstructors(id, node, directives) {
        let message;
        if (directives.length > 1) {
            message = `This component uses directives which require inline type constructors, which are not supported by the current environment.`;
        }
        else {
            message = `This component uses a directive which requires an inline type constructor, which is not supported by the current environment.`;
        }
        this._diagnostics.push(makeInlineDiagnostic(id, exports.ErrorCode.INLINE_TYPE_CTOR_REQUIRED, node.name, message, directives.map((dir) => makeRelatedInformation(dir.name, `Requires an inline type constructor.`))));
    }
    suboptimalTypeInference(id, variables) {
        const mapping = this.resolver.getTemplateSourceMapping(id);
        // Select one of the template variables that's most suitable for reporting the diagnostic. Any
        // variable will do, but prefer one bound to the context's $implicit if present.
        let diagnosticVar = null;
        for (const variable of variables) {
            if (diagnosticVar === null || variable.value === '' || variable.value === '$implicit') {
                diagnosticVar = variable;
            }
        }
        if (diagnosticVar === null) {
            // There is no variable on which to report the diagnostic.
            return;
        }
        let varIdentification = `'${diagnosticVar.name}'`;
        if (variables.length === 2) {
            varIdentification += ` (and 1 other)`;
        }
        else if (variables.length > 2) {
            varIdentification += ` (and ${variables.length - 1} others)`;
        }
        const message = `This structural directive supports advanced type inference, but the current compiler configuration prevents its usage. The variable ${varIdentification} will have type 'any' as a result.\n\nConsider enabling the 'strictTemplates' option in your tsconfig.json for better type inference within this template.`;
        this._diagnostics.push(makeTemplateDiagnostic(id, mapping, diagnosticVar.keySpan, ts.DiagnosticCategory.Suggestion, ngErrorCode(exports.ErrorCode.SUGGEST_SUBOPTIMAL_TYPE_INFERENCE), message));
    }
    splitTwoWayBinding(id, input, output, inputConsumer, outputConsumer) {
        const mapping = this.resolver.getTemplateSourceMapping(id);
        const errorMsg = `The property and event halves of the two-way binding '${input.name}' are not bound to the same target.
            Find more at https://angular.dev/guide/templates/two-way-binding#how-two-way-binding-works`;
        const relatedMessages = [];
        relatedMessages.push({
            text: `The property half of the binding is to the '${inputConsumer.name.text}' component.`,
            start: inputConsumer.name.getStart(),
            end: inputConsumer.name.getEnd(),
            sourceFile: inputConsumer.name.getSourceFile(),
        });
        if (outputConsumer instanceof Element$1) {
            let message = `The event half of the binding is to a native event called '${input.name}' on the <${outputConsumer.name}> DOM element.`;
            if (!mapping.node.getSourceFile().isDeclarationFile) {
                message += `\n \n Are you missing an output declaration called '${output.name}'?`;
            }
            relatedMessages.push({
                text: message,
                start: outputConsumer.sourceSpan.start.offset + 1,
                end: outputConsumer.sourceSpan.start.offset + outputConsumer.name.length + 1,
                sourceFile: mapping.node.getSourceFile(),
            });
        }
        else {
            relatedMessages.push({
                text: `The event half of the binding is to the '${outputConsumer.name.text}' component.`,
                start: outputConsumer.name.getStart(),
                end: outputConsumer.name.getEnd(),
                sourceFile: outputConsumer.name.getSourceFile(),
            });
        }
        this._diagnostics.push(makeTemplateDiagnostic(id, mapping, input.keySpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.SPLIT_TWO_WAY_BINDING), errorMsg, relatedMessages));
    }
    missingRequiredInputs(id, element, directiveName, isComponent, inputAliases) {
        const message = `Required input${inputAliases.length === 1 ? '' : 's'} ${inputAliases
            .map((n) => `'${n}'`)
            .join(', ')} from ${isComponent ? 'component' : 'directive'} ${directiveName} must be specified.`;
        this._diagnostics.push(makeTemplateDiagnostic(id, this.resolver.getTemplateSourceMapping(id), element.startSourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.MISSING_REQUIRED_INPUTS), message));
    }
    illegalForLoopTrackAccess(id, block, access) {
        const sourceSpan = this.resolver.toTemplateParseSourceSpan(id, access.sourceSpan);
        if (sourceSpan === null) {
            throw new Error(`Assertion failure: no SourceLocation found for property read.`);
        }
        const messageVars = [block.item, ...block.contextVariables.filter((v) => v.value === '$index')]
            .map((v) => `'${v.name}'`)
            .join(', ');
        const message = `Cannot access '${access.name}' inside of a track expression. ` +
            `Only ${messageVars} and properties on the containing component are available to this expression.`;
        this._diagnostics.push(makeTemplateDiagnostic(id, this.resolver.getTemplateSourceMapping(id), sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.ILLEGAL_FOR_LOOP_TRACK_ACCESS), message));
    }
    inaccessibleDeferredTriggerElement(id, trigger) {
        let message;
        if (trigger.reference === null) {
            message =
                `Trigger cannot find reference. Make sure that the @defer block has a ` +
                    `@placeholder with at least one root element node.`;
        }
        else {
            message =
                `Trigger cannot find reference "${trigger.reference}".\nCheck that an element with #${trigger.reference} exists in the same template and it's accessible from the ` +
                    `@defer block.\nDeferred blocks can only access triggers in same view, a parent ` +
                    `embedded view or the root view of the @placeholder block.`;
        }
        this._diagnostics.push(makeTemplateDiagnostic(id, this.resolver.getTemplateSourceMapping(id), trigger.sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.INACCESSIBLE_DEFERRED_TRIGGER_ELEMENT), message));
    }
    controlFlowPreventingContentProjection(id, category, projectionNode, componentName, slotSelector, controlFlowNode, preservesWhitespaces) {
        const blockName = controlFlowNode.nameSpan.toString().trim();
        const lines = [
            `Node matches the "${slotSelector}" slot of the "${componentName}" component, but will not be projected into the specific slot because the surrounding ${blockName} has more than one node at its root. To project the node in the right slot, you can:\n`,
            `1. Wrap the content of the ${blockName} block in an <ng-container/> that matches the "${slotSelector}" selector.`,
            `2. Split the content of the ${blockName} block across multiple ${blockName} blocks such that each one only has a single projectable node at its root.`,
            `3. Remove all content from the ${blockName} block, except for the node being projected.`,
        ];
        if (preservesWhitespaces) {
            lines.push('Note: the host component has `preserveWhitespaces: true` which may ' +
                'cause whitespace to affect content projection.');
        }
        lines.push('', 'This check can be disabled using the `extendedDiagnostics.checks.' +
            'controlFlowPreventingContentProjection = "suppress" compiler option.`');
        this._diagnostics.push(makeTemplateDiagnostic(id, this.resolver.getTemplateSourceMapping(id), projectionNode.startSourceSpan, category, ngErrorCode(exports.ErrorCode.CONTROL_FLOW_PREVENTING_CONTENT_PROJECTION), lines.join('\n')));
    }
    illegalWriteToLetDeclaration(id, node, target) {
        const sourceSpan = this.resolver.toTemplateParseSourceSpan(id, node.sourceSpan);
        if (sourceSpan === null) {
            throw new Error(`Assertion failure: no SourceLocation found for property write.`);
        }
        this._diagnostics.push(makeTemplateDiagnostic(id, this.resolver.getTemplateSourceMapping(id), sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.ILLEGAL_LET_WRITE), `Cannot assign to @let declaration '${target.name}'.`));
    }
    letUsedBeforeDefinition(id, node, target) {
        const sourceSpan = this.resolver.toTemplateParseSourceSpan(id, node.sourceSpan);
        if (sourceSpan === null) {
            throw new Error(`Assertion failure: no SourceLocation found for property read.`);
        }
        this._diagnostics.push(makeTemplateDiagnostic(id, this.resolver.getTemplateSourceMapping(id), sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.LET_USED_BEFORE_DEFINITION), `Cannot read @let declaration '${target.name}' before it has been defined.`));
    }
    conflictingDeclaration(id, decl) {
        const mapping = this.resolver.getTemplateSourceMapping(id);
        const errorMsg = `Cannot declare @let called '${decl.name}' as there is another symbol in the template with the same name.`;
        this._diagnostics.push(makeTemplateDiagnostic(id, mapping, decl.sourceSpan, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.CONFLICTING_LET_DECLARATION), errorMsg));
    }
}
function makeInlineDiagnostic(id, code, node, messageText, relatedInformation) {
    return {
        ...makeDiagnostic(code, node, messageText, relatedInformation),
        sourceFile: node.getSourceFile(),
        typeCheckId: id,
    };
}

/**
 * A `ShimGenerator` which adds type-checking files to the `ts.Program`.
 *
 * This is a requirement for performant template type-checking, as TypeScript will only reuse
 * information in the main program when creating the type-checking program if the set of files in
 * each are exactly the same. Thus, the main program also needs the synthetic type-checking files.
 */
class TypeCheckShimGenerator {
    extensionPrefix = 'ngtypecheck';
    shouldEmit = false;
    generateShimForFile(sf, genFilePath, priorShimSf) {
        if (priorShimSf !== null) {
            // If this shim existed in the previous program, reuse it now. It might not be correct, but
            // reusing it in the main program allows the shape of its imports to potentially remain the
            // same and TS can then use the fastest path for incremental program creation. Later during
            // the type-checking phase it's going to either be reused, or replaced anyways. Thus there's
            // no harm in reuse here even if it's out of date.
            return priorShimSf;
        }
        return ts.createSourceFile(genFilePath, 'export const USED_FOR_NG_TYPE_CHECKING = true;', ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
    }
    static shimFor(fileName) {
        return absoluteFrom(fileName.replace(/\.tsx?$/, '.ngtypecheck.ts'));
    }
}

/**
 * Wraps the node in parenthesis such that inserted span comments become attached to the proper
 * node. This is an alias for `ts.factory.createParenthesizedExpression` with the benefit that it
 * signifies that the inserted parenthesis are for diagnostic purposes, not for correctness of the
 * rendered TCB code.
 *
 * Note that it is important that nodes and its attached comment are not wrapped into parenthesis
 * by default, as it prevents correct translation of e.g. diagnostics produced for incorrect method
 * arguments. Such diagnostics would then be produced for the parenthesised node whereas the
 * positional comment would be located within that node, resulting in a mismatch.
 */
function wrapForDiagnostics(expr) {
    return ts.factory.createParenthesizedExpression(expr);
}
/**
 * Wraps the node in parenthesis such that inserted span comments become attached to the proper
 * node. This is an alias for `ts.factory.createParenthesizedExpression` with the benefit that it
 * signifies that the inserted parenthesis are for use by the type checker, not for correctness of
 * the rendered TCB code.
 */
function wrapForTypeChecker(expr) {
    return ts.factory.createParenthesizedExpression(expr);
}
/**
 * Adds a synthetic comment to the expression that represents the parse span of the provided node.
 * This comment can later be retrieved as trivia of a node to recover original source locations.
 */
function addParseSpanInfo(node, span) {
    let commentText;
    if (span instanceof AbsoluteSourceSpan) {
        commentText = `${span.start},${span.end}`;
    }
    else {
        commentText = `${span.start.offset},${span.end.offset}`;
    }
    ts.addSyntheticTrailingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, commentText, 
    /* hasTrailingNewLine */ false);
}
/**
 * Adds a synthetic comment to the function declaration that contains the type checking ID
 * of the class declaration.
 */
function addTypeCheckId(tcb, id) {
    ts.addSyntheticLeadingComment(tcb, ts.SyntaxKind.MultiLineCommentTrivia, id, true);
}
/**
 * Determines if the diagnostic should be reported. Some diagnostics are produced because of the
 * way TCBs are generated; those diagnostics should not be reported as type check errors of the
 * template.
 */
function shouldReportDiagnostic(diagnostic) {
    const { code } = diagnostic;
    if (code === 6133 /* $var is declared but its value is never read. */) {
        return false;
    }
    else if (code === 6199 /* All variables are unused. */) {
        return false;
    }
    else if (code === 2695 /* Left side of comma operator is unused and has no side effects. */) {
        return false;
    }
    else if (code === 7006 /* Parameter '$event' implicitly has an 'any' type. */) {
        return false;
    }
    return true;
}
/**
 * Attempts to translate a TypeScript diagnostic produced during template type-checking to their
 * location of origin, based on the comments that are emitted in the TCB code.
 *
 * If the diagnostic could not be translated, `null` is returned to indicate that the diagnostic
 * should not be reported at all. This prevents diagnostics from non-TCB code in a user's source
 * file from being reported as type-check errors.
 */
function translateDiagnostic(diagnostic, resolver) {
    if (diagnostic.file === undefined || diagnostic.start === undefined) {
        return null;
    }
    const fullMapping = getSourceMapping(diagnostic.file, diagnostic.start, resolver, 
    /*isDiagnosticsRequest*/ true);
    if (fullMapping === null) {
        return null;
    }
    const { sourceLocation, sourceMapping: templateSourceMapping, span } = fullMapping;
    return makeTemplateDiagnostic(sourceLocation.id, templateSourceMapping, span, diagnostic.category, diagnostic.code, diagnostic.messageText);
}

/**
 * Expression that is cast to any. Currently represented as `0 as any`.
 *
 * Historically this expression was using `null as any`, but a newly-added check in TypeScript 5.6
 * (https://devblogs.microsoft.com/typescript/announcing-typescript-5-6-beta/#disallowed-nullish-and-truthy-checks)
 * started flagging it as always being nullish. Other options that were considered:
 * - `NaN as any` or `Infinity as any` - not used, because they don't work if the `noLib` compiler
 *   option is enabled. Also they require more characters.
 * - Some flavor of function call, like `isNan(0) as any` - requires even more characters than the
 *   NaN option and has the same issue with `noLib`.
 */
const ANY_EXPRESSION = ts.factory.createAsExpression(ts.factory.createNumericLiteral('0'), ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
const UNDEFINED = ts.factory.createIdentifier('undefined');
const UNARY_OPS = new Map([
    ['+', ts.SyntaxKind.PlusToken],
    ['-', ts.SyntaxKind.MinusToken],
]);
const BINARY_OPS = new Map([
    ['+', ts.SyntaxKind.PlusToken],
    ['-', ts.SyntaxKind.MinusToken],
    ['<', ts.SyntaxKind.LessThanToken],
    ['>', ts.SyntaxKind.GreaterThanToken],
    ['<=', ts.SyntaxKind.LessThanEqualsToken],
    ['>=', ts.SyntaxKind.GreaterThanEqualsToken],
    ['==', ts.SyntaxKind.EqualsEqualsToken],
    ['===', ts.SyntaxKind.EqualsEqualsEqualsToken],
    ['*', ts.SyntaxKind.AsteriskToken],
    ['/', ts.SyntaxKind.SlashToken],
    ['%', ts.SyntaxKind.PercentToken],
    ['!=', ts.SyntaxKind.ExclamationEqualsToken],
    ['!==', ts.SyntaxKind.ExclamationEqualsEqualsToken],
    ['||', ts.SyntaxKind.BarBarToken],
    ['&&', ts.SyntaxKind.AmpersandAmpersandToken],
    ['&', ts.SyntaxKind.AmpersandToken],
    ['|', ts.SyntaxKind.BarToken],
    ['??', ts.SyntaxKind.QuestionQuestionToken],
]);
/**
 * Convert an `AST` to TypeScript code directly, without going through an intermediate `Expression`
 * AST.
 */
function astToTypescript(ast, maybeResolve, config) {
    const translator = new AstTranslator(maybeResolve, config);
    return translator.translate(ast);
}
class AstTranslator {
    maybeResolve;
    config;
    constructor(maybeResolve, config) {
        this.maybeResolve = maybeResolve;
        this.config = config;
    }
    translate(ast) {
        // Skip over an `ASTWithSource` as its `visit` method calls directly into its ast's `visit`,
        // which would prevent any custom resolution through `maybeResolve` for that node.
        if (ast instanceof ASTWithSource) {
            ast = ast.ast;
        }
        // The `EmptyExpr` doesn't have a dedicated method on `AstVisitor`, so it's special cased here.
        if (ast instanceof EmptyExpr$1) {
            const res = ts.factory.createIdentifier('undefined');
            addParseSpanInfo(res, ast.sourceSpan);
            return res;
        }
        // First attempt to let any custom resolution logic provide a translation for the given node.
        const resolved = this.maybeResolve(ast);
        if (resolved !== null) {
            return resolved;
        }
        return ast.visit(this);
    }
    visitUnary(ast) {
        const expr = this.translate(ast.expr);
        const op = UNARY_OPS.get(ast.operator);
        if (op === undefined) {
            throw new Error(`Unsupported Unary.operator: ${ast.operator}`);
        }
        const node = wrapForDiagnostics(ts.factory.createPrefixUnaryExpression(op, expr));
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitBinary(ast) {
        const lhs = wrapForDiagnostics(this.translate(ast.left));
        const rhs = wrapForDiagnostics(this.translate(ast.right));
        const op = BINARY_OPS.get(ast.operation);
        if (op === undefined) {
            throw new Error(`Unsupported Binary.operation: ${ast.operation}`);
        }
        const node = ts.factory.createBinaryExpression(lhs, op, rhs);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitChain(ast) {
        const elements = ast.expressions.map((expr) => this.translate(expr));
        const node = wrapForDiagnostics(ts.factory.createCommaListExpression(elements));
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitConditional(ast) {
        const condExpr = this.translate(ast.condition);
        const trueExpr = this.translate(ast.trueExp);
        // Wrap `falseExpr` in parens so that the trailing parse span info is not attributed to the
        // whole conditional.
        // In the following example, the last source span comment (5,6) could be seen as the
        // trailing comment for _either_ the whole conditional expression _or_ just the `falseExpr` that
        // is immediately before it:
        // `conditional /*1,2*/ ? trueExpr /*3,4*/ : falseExpr /*5,6*/`
        // This should be instead be `conditional /*1,2*/ ? trueExpr /*3,4*/ : (falseExpr /*5,6*/)`
        const falseExpr = wrapForTypeChecker(this.translate(ast.falseExp));
        const node = ts.factory.createParenthesizedExpression(ts.factory.createConditionalExpression(condExpr, undefined, trueExpr, undefined, falseExpr));
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitImplicitReceiver(ast) {
        throw new Error('Method not implemented.');
    }
    visitThisReceiver(ast) {
        throw new Error('Method not implemented.');
    }
    visitInterpolation(ast) {
        // Build up a chain of binary + operations to simulate the string concatenation of the
        // interpolation's expressions. The chain is started using an actual string literal to ensure
        // the type is inferred as 'string'.
        return ast.expressions.reduce((lhs, ast) => ts.factory.createBinaryExpression(lhs, ts.SyntaxKind.PlusToken, wrapForTypeChecker(this.translate(ast))), ts.factory.createStringLiteral(''));
    }
    visitKeyedRead(ast) {
        const receiver = wrapForDiagnostics(this.translate(ast.receiver));
        const key = this.translate(ast.key);
        const node = ts.factory.createElementAccessExpression(receiver, key);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitKeyedWrite(ast) {
        const receiver = wrapForDiagnostics(this.translate(ast.receiver));
        const left = ts.factory.createElementAccessExpression(receiver, this.translate(ast.key));
        // TODO(joost): annotate `left` with the span of the element access, which is not currently
        //  available on `ast`.
        const right = wrapForTypeChecker(this.translate(ast.value));
        const node = wrapForDiagnostics(ts.factory.createBinaryExpression(left, ts.SyntaxKind.EqualsToken, right));
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitLiteralArray(ast) {
        const elements = ast.expressions.map((expr) => this.translate(expr));
        const literal = ts.factory.createArrayLiteralExpression(elements);
        // If strictLiteralTypes is disabled, array literals are cast to `any`.
        const node = this.config.strictLiteralTypes ? literal : tsCastToAny(literal);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitLiteralMap(ast) {
        const properties = ast.keys.map(({ key }, idx) => {
            const value = this.translate(ast.values[idx]);
            return ts.factory.createPropertyAssignment(ts.factory.createStringLiteral(key), value);
        });
        const literal = ts.factory.createObjectLiteralExpression(properties, true);
        // If strictLiteralTypes is disabled, object literals are cast to `any`.
        const node = this.config.strictLiteralTypes ? literal : tsCastToAny(literal);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitLiteralPrimitive(ast) {
        let node;
        if (ast.value === undefined) {
            node = ts.factory.createIdentifier('undefined');
        }
        else if (ast.value === null) {
            node = ts.factory.createNull();
        }
        else if (typeof ast.value === 'string') {
            node = ts.factory.createStringLiteral(ast.value);
        }
        else if (typeof ast.value === 'number') {
            node = tsNumericExpression(ast.value);
        }
        else if (typeof ast.value === 'boolean') {
            node = ast.value ? ts.factory.createTrue() : ts.factory.createFalse();
        }
        else {
            throw Error(`Unsupported AST value of type ${typeof ast.value}`);
        }
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitNonNullAssert(ast) {
        const expr = wrapForDiagnostics(this.translate(ast.expression));
        const node = ts.factory.createNonNullExpression(expr);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitPipe(ast) {
        throw new Error('Method not implemented.');
    }
    visitPrefixNot(ast) {
        const expression = wrapForDiagnostics(this.translate(ast.expression));
        const node = ts.factory.createLogicalNot(expression);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitTypeofExpression(ast) {
        const expression = wrapForDiagnostics(this.translate(ast.expression));
        const node = ts.factory.createTypeOfExpression(expression);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitPropertyRead(ast) {
        // This is a normal property read - convert the receiver to an expression and emit the correct
        // TypeScript expression to read the property.
        const receiver = wrapForDiagnostics(this.translate(ast.receiver));
        const name = ts.factory.createPropertyAccessExpression(receiver, ast.name);
        addParseSpanInfo(name, ast.nameSpan);
        const node = wrapForDiagnostics(name);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitPropertyWrite(ast) {
        const receiver = wrapForDiagnostics(this.translate(ast.receiver));
        const left = ts.factory.createPropertyAccessExpression(receiver, ast.name);
        addParseSpanInfo(left, ast.nameSpan);
        // TypeScript reports assignment errors on the entire lvalue expression. Annotate the lvalue of
        // the assignment with the sourceSpan, which includes receivers, rather than nameSpan for
        // consistency of the diagnostic location.
        // a.b.c = 1
        // ^^^^^^^^^ sourceSpan
        //     ^     nameSpan
        const leftWithPath = wrapForDiagnostics(left);
        addParseSpanInfo(leftWithPath, ast.sourceSpan);
        // The right needs to be wrapped in parens as well or we cannot accurately match its
        // span to just the RHS. For example, the span in `e = $event /*0,10*/` is ambiguous.
        // It could refer to either the whole binary expression or just the RHS.
        // We should instead generate `e = ($event /*0,10*/)` so we know the span 0,10 matches RHS.
        const right = wrapForTypeChecker(this.translate(ast.value));
        const node = wrapForDiagnostics(ts.factory.createBinaryExpression(leftWithPath, ts.SyntaxKind.EqualsToken, right));
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitSafePropertyRead(ast) {
        let node;
        const receiver = wrapForDiagnostics(this.translate(ast.receiver));
        // The form of safe property reads depends on whether strictness is in use.
        if (this.config.strictSafeNavigationTypes) {
            // Basically, the return here is either the type of the complete expression with a null-safe
            // property read, or `undefined`. So a ternary is used to create an "or" type:
            // "a?.b" becomes (0 as any ? a!.b : undefined)
            // The type of this expression is (typeof a!.b) | undefined, which is exactly as desired.
            const expr = ts.factory.createPropertyAccessExpression(ts.factory.createNonNullExpression(receiver), ast.name);
            addParseSpanInfo(expr, ast.nameSpan);
            node = ts.factory.createParenthesizedExpression(ts.factory.createConditionalExpression(ANY_EXPRESSION, undefined, expr, undefined, UNDEFINED));
        }
        else if (VeSafeLhsInferenceBugDetector.veWillInferAnyFor(ast)) {
            // Emulate a View Engine bug where 'any' is inferred for the left-hand side of the safe
            // navigation operation. With this bug, the type of the left-hand side is regarded as any.
            // Therefore, the left-hand side only needs repeating in the output (to validate it), and then
            // 'any' is used for the rest of the expression. This is done using a comma operator:
            // "a?.b" becomes (a as any).b, which will of course have type 'any'.
            node = ts.factory.createPropertyAccessExpression(tsCastToAny(receiver), ast.name);
        }
        else {
            // The View Engine bug isn't active, so check the entire type of the expression, but the final
            // result is still inferred as `any`.
            // "a?.b" becomes (a!.b as any)
            const expr = ts.factory.createPropertyAccessExpression(ts.factory.createNonNullExpression(receiver), ast.name);
            addParseSpanInfo(expr, ast.nameSpan);
            node = tsCastToAny(expr);
        }
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitSafeKeyedRead(ast) {
        const receiver = wrapForDiagnostics(this.translate(ast.receiver));
        const key = this.translate(ast.key);
        let node;
        // The form of safe property reads depends on whether strictness is in use.
        if (this.config.strictSafeNavigationTypes) {
            // "a?.[...]" becomes (0 as any ? a![...] : undefined)
            const expr = ts.factory.createElementAccessExpression(ts.factory.createNonNullExpression(receiver), key);
            addParseSpanInfo(expr, ast.sourceSpan);
            node = ts.factory.createParenthesizedExpression(ts.factory.createConditionalExpression(ANY_EXPRESSION, undefined, expr, undefined, UNDEFINED));
        }
        else if (VeSafeLhsInferenceBugDetector.veWillInferAnyFor(ast)) {
            // "a?.[...]" becomes (a as any)[...]
            node = ts.factory.createElementAccessExpression(tsCastToAny(receiver), key);
        }
        else {
            // "a?.[...]" becomes (a!.[...] as any)
            const expr = ts.factory.createElementAccessExpression(ts.factory.createNonNullExpression(receiver), key);
            addParseSpanInfo(expr, ast.sourceSpan);
            node = tsCastToAny(expr);
        }
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitCall(ast) {
        const args = ast.args.map((expr) => this.translate(expr));
        let expr;
        const receiver = ast.receiver;
        // For calls that have a property read as receiver, we have to special-case their emit to avoid
        // inserting superfluous parenthesis as they prevent TypeScript from applying a narrowing effect
        // if the method acts as a type guard.
        if (receiver instanceof PropertyRead) {
            const resolved = this.maybeResolve(receiver);
            if (resolved !== null) {
                expr = resolved;
            }
            else {
                const propertyReceiver = wrapForDiagnostics(this.translate(receiver.receiver));
                expr = ts.factory.createPropertyAccessExpression(propertyReceiver, receiver.name);
                addParseSpanInfo(expr, receiver.nameSpan);
            }
        }
        else {
            expr = this.translate(receiver);
        }
        let node;
        // Safe property/keyed reads will produce a ternary whose value is nullable.
        // We have to generate a similar ternary around the call.
        if (ast.receiver instanceof SafePropertyRead || ast.receiver instanceof SafeKeyedRead) {
            node = this.convertToSafeCall(ast, expr, args);
        }
        else {
            node = ts.factory.createCallExpression(expr, undefined, args);
        }
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitSafeCall(ast) {
        const args = ast.args.map((expr) => this.translate(expr));
        const expr = wrapForDiagnostics(this.translate(ast.receiver));
        const node = this.convertToSafeCall(ast, expr, args);
        addParseSpanInfo(node, ast.sourceSpan);
        return node;
    }
    visitTemplateLiteral(ast) {
        const length = ast.elements.length;
        const head = ast.elements[0];
        let result;
        if (length === 1) {
            result = ts.factory.createNoSubstitutionTemplateLiteral(head.text);
        }
        else {
            const spans = [];
            const tailIndex = length - 1;
            for (let i = 1; i < tailIndex; i++) {
                const middle = ts.factory.createTemplateMiddle(ast.elements[i].text);
                spans.push(ts.factory.createTemplateSpan(this.translate(ast.expressions[i - 1]), middle));
            }
            const resolvedExpression = this.translate(ast.expressions[tailIndex - 1]);
            const templateTail = ts.factory.createTemplateTail(ast.elements[tailIndex].text);
            spans.push(ts.factory.createTemplateSpan(resolvedExpression, templateTail));
            result = ts.factory.createTemplateExpression(ts.factory.createTemplateHead(head.text), spans);
        }
        return result;
    }
    visitTemplateLiteralElement(ast, context) {
        throw new Error('Method not implemented');
    }
    convertToSafeCall(ast, expr, args) {
        if (this.config.strictSafeNavigationTypes) {
            // "a?.method(...)" becomes (0 as any ? a!.method(...) : undefined)
            const call = ts.factory.createCallExpression(ts.factory.createNonNullExpression(expr), undefined, args);
            return ts.factory.createParenthesizedExpression(ts.factory.createConditionalExpression(ANY_EXPRESSION, undefined, call, undefined, UNDEFINED));
        }
        if (VeSafeLhsInferenceBugDetector.veWillInferAnyFor(ast)) {
            // "a?.method(...)" becomes (a as any).method(...)
            return ts.factory.createCallExpression(tsCastToAny(expr), undefined, args);
        }
        // "a?.method(...)" becomes (a!.method(...) as any)
        return tsCastToAny(ts.factory.createCallExpression(ts.factory.createNonNullExpression(expr), undefined, args));
    }
}
/**
 * Checks whether View Engine will infer a type of 'any' for the left-hand side of a safe navigation
 * operation.
 *
 * In View Engine's template type-checker, certain receivers of safe navigation operations will
 * cause a temporary variable to be allocated as part of the checking expression, to save the value
 * of the receiver and use it more than once in the expression. This temporary variable has type
 * 'any'. In practice, this means certain receivers cause View Engine to not check the full
 * expression, and other receivers will receive more complete checking.
 *
 * For compatibility, this logic is adapted from View Engine's expression_converter.ts so that the
 * Ivy checker can emulate this bug when needed.
 */
class VeSafeLhsInferenceBugDetector {
    static SINGLETON = new VeSafeLhsInferenceBugDetector();
    static veWillInferAnyFor(ast) {
        const visitor = VeSafeLhsInferenceBugDetector.SINGLETON;
        return ast instanceof Call ? ast.visit(visitor) : ast.receiver.visit(visitor);
    }
    visitUnary(ast) {
        return ast.expr.visit(this);
    }
    visitBinary(ast) {
        return ast.left.visit(this) || ast.right.visit(this);
    }
    visitChain(ast) {
        return false;
    }
    visitConditional(ast) {
        return ast.condition.visit(this) || ast.trueExp.visit(this) || ast.falseExp.visit(this);
    }
    visitCall(ast) {
        return true;
    }
    visitSafeCall(ast) {
        return false;
    }
    visitImplicitReceiver(ast) {
        return false;
    }
    visitThisReceiver(ast) {
        return false;
    }
    visitInterpolation(ast) {
        return ast.expressions.some((exp) => exp.visit(this));
    }
    visitKeyedRead(ast) {
        return false;
    }
    visitKeyedWrite(ast) {
        return false;
    }
    visitLiteralArray(ast) {
        return true;
    }
    visitLiteralMap(ast) {
        return true;
    }
    visitLiteralPrimitive(ast) {
        return false;
    }
    visitPipe(ast) {
        return true;
    }
    visitPrefixNot(ast) {
        return ast.expression.visit(this);
    }
    visitTypeofExpression(ast) {
        return ast.expression.visit(this);
    }
    visitNonNullAssert(ast) {
        return ast.expression.visit(this);
    }
    visitPropertyRead(ast) {
        return false;
    }
    visitPropertyWrite(ast) {
        return false;
    }
    visitSafePropertyRead(ast) {
        return false;
    }
    visitSafeKeyedRead(ast) {
        return false;
    }
    visitTemplateLiteral(ast, context) {
        return false;
    }
    visitTemplateLiteralElement(ast, context) {
        return false;
    }
}

/**
 * Controls how generics for the component context class will be handled during TCB generation.
 */
var TcbGenericContextBehavior;
(function (TcbGenericContextBehavior) {
    /**
     * References to generic parameter bounds will be emitted via the `TypeParameterEmitter`.
     *
     * The caller must verify that all parameter bounds are emittable in order to use this mode.
     */
    TcbGenericContextBehavior[TcbGenericContextBehavior["UseEmitter"] = 0] = "UseEmitter";
    /**
     * Generic parameter declarations will be copied directly from the `ts.ClassDeclaration` of the
     * component class.
     *
     * The caller must only use the generated TCB code in a context where such copies will still be
     * valid, such as an inline type check block.
     */
    TcbGenericContextBehavior[TcbGenericContextBehavior["CopyClassNodes"] = 1] = "CopyClassNodes";
    /**
     * Any generic parameters for the component context class will be set to `any`.
     *
     * Produces a less useful type, but is always safe to use.
     */
    TcbGenericContextBehavior[TcbGenericContextBehavior["FallbackToAny"] = 2] = "FallbackToAny";
})(TcbGenericContextBehavior || (TcbGenericContextBehavior = {}));
/**
 * Given a `ts.ClassDeclaration` for a component, and metadata regarding that component, compose a
 * "type check block" function.
 *
 * When passed through TypeScript's TypeChecker, type errors that arise within the type check block
 * function indicate issues in the template itself.
 *
 * As a side effect of generating a TCB f   or the component, `ts.Diagnostic`s may also be produced
 * directly for issues within the template which are identified during generation. These issues are
 * recorded in either the `domSchemaChecker` (which checks usage of DOM elements and bindings) as
 * well as the `oobRecorder` (which records errors when the type-checking code generator is unable
 * to sufficiently understand a template).
 *
 * @param env an `Environment` into which type-checking code will be generated.
 * @param ref a `Reference` to the component class which should be type-checked.
 * @param name a `ts.Identifier` to use for the generated `ts.FunctionDeclaration`.
 * @param meta metadata about the component's template and the function being generated.
 * @param domSchemaChecker used to check and record errors regarding improper usage of DOM elements
 * and bindings.
 * @param oobRecorder used to record errors regarding template elements which could not be correctly
 * translated into types during TCB generation.
 * @param genericContextBehavior controls how generic parameters (especially parameters with generic
 * bounds) will be referenced from the generated TCB code.
 */
function generateTypeCheckBlock(env, ref, name, meta, domSchemaChecker, oobRecorder, genericContextBehavior) {
    const tcb = new Context(env, domSchemaChecker, oobRecorder, meta.id, meta.boundTarget, meta.pipes, meta.schemas, meta.isStandalone, meta.preserveWhitespaces);
    const scope = Scope.forNodes(tcb, null, null, tcb.boundTarget.target.template, /* guard */ null);
    const ctxRawType = env.referenceType(ref);
    if (!ts.isTypeReferenceNode(ctxRawType)) {
        throw new Error(`Expected TypeReferenceNode when referencing the ctx param for ${ref.debugName}`);
    }
    let typeParameters = undefined;
    let typeArguments = undefined;
    if (ref.node.typeParameters !== undefined) {
        if (!env.config.useContextGenericType) {
            genericContextBehavior = TcbGenericContextBehavior.FallbackToAny;
        }
        switch (genericContextBehavior) {
            case TcbGenericContextBehavior.UseEmitter:
                // Guaranteed to emit type parameters since we checked that the class has them above.
                typeParameters = new TypeParameterEmitter(ref.node.typeParameters, env.reflector).emit((typeRef) => env.referenceType(typeRef));
                typeArguments = typeParameters.map((param) => ts.factory.createTypeReferenceNode(param.name));
                break;
            case TcbGenericContextBehavior.CopyClassNodes:
                typeParameters = [...ref.node.typeParameters];
                typeArguments = typeParameters.map((param) => ts.factory.createTypeReferenceNode(param.name));
                break;
            case TcbGenericContextBehavior.FallbackToAny:
                typeArguments = ref.node.typeParameters.map(() => ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
                break;
        }
    }
    const paramList = [tcbThisParam(ctxRawType.typeName, typeArguments)];
    const scopeStatements = scope.render();
    const innerBody = ts.factory.createBlock([...env.getPreludeStatements(), ...scopeStatements]);
    // Wrap the body in an "if (true)" expression. This is unnecessary but has the effect of causing
    // the `ts.Printer` to format the type-check block nicely.
    const body = ts.factory.createBlock([
        ts.factory.createIfStatement(ts.factory.createTrue(), innerBody, undefined),
    ]);
    const fnDecl = ts.factory.createFunctionDeclaration(
    /* modifiers */ undefined, 
    /* asteriskToken */ undefined, 
    /* name */ name, 
    /* typeParameters */ env.config.useContextGenericType ? typeParameters : undefined, 
    /* parameters */ paramList, 
    /* type */ undefined, 
    /* body */ body);
    addTypeCheckId(fnDecl, meta.id);
    return fnDecl;
}
/**
 * A code generation operation that's involved in the construction of a Type Check Block.
 *
 * The generation of a TCB is non-linear. Bindings within a template may result in the need to
 * construct certain types earlier than they otherwise would be constructed. That is, if the
 * generation of a TCB for a template is broken down into specific operations (constructing a
 * directive, extracting a variable from a let- operation, etc), then it's possible for operations
 * earlier in the sequence to depend on operations which occur later in the sequence.
 *
 * `TcbOp` abstracts the different types of operations which are required to convert a template into
 * a TCB. This allows for two phases of processing for the template, where 1) a linear sequence of
 * `TcbOp`s is generated, and then 2) these operations are executed, not necessarily in linear
 * order.
 *
 * Each `TcbOp` may insert statements into the body of the TCB, and also optionally return a
 * `ts.Expression` which can be used to reference the operation's result.
 */
class TcbOp {
    /**
     * Replacement value or operation used while this `TcbOp` is executing (i.e. to resolve circular
     * references during its execution).
     *
     * This is usually a `null!` expression (which asks TS to infer an appropriate type), but another
     * `TcbOp` can be returned in cases where additional code generation is necessary to deal with
     * circular references.
     */
    circularFallback() {
        return INFER_TYPE_FOR_CIRCULAR_OP_EXPR;
    }
}
/**
 * A `TcbOp` which creates an expression for a native DOM element (or web component) from a
 * `TmplAstElement`.
 *
 * Executing this operation returns a reference to the element variable.
 */
class TcbElementOp extends TcbOp {
    tcb;
    scope;
    element;
    constructor(tcb, scope, element) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.element = element;
    }
    get optional() {
        // The statement generated by this operation is only used for type-inference of the DOM
        // element's type and won't report diagnostics by itself, so the operation is marked as optional
        // to avoid generating statements for DOM elements that are never referenced.
        return true;
    }
    execute() {
        const id = this.tcb.allocateId();
        // Add the declaration of the element using document.createElement.
        const initializer = tsCreateElement(this.element.name);
        addParseSpanInfo(initializer, this.element.startSourceSpan || this.element.sourceSpan);
        this.scope.addStatement(tsCreateVariable(id, initializer));
        return id;
    }
}
/**
 * A `TcbOp` which creates an expression for particular let- `TmplAstVariable` on a
 * `TmplAstTemplate`'s context.
 *
 * Executing this operation returns a reference to the variable variable (lol).
 */
class TcbTemplateVariableOp extends TcbOp {
    tcb;
    scope;
    template;
    variable;
    constructor(tcb, scope, template, variable) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.template = template;
        this.variable = variable;
    }
    get optional() {
        return false;
    }
    execute() {
        // Look for a context variable for the template.
        const ctx = this.scope.resolve(this.template);
        // Allocate an identifier for the TmplAstVariable, and initialize it to a read of the variable
        // on the template context.
        const id = this.tcb.allocateId();
        const initializer = ts.factory.createPropertyAccessExpression(
        /* expression */ ctx, 
        /* name */ this.variable.value || '$implicit');
        addParseSpanInfo(id, this.variable.keySpan);
        // Declare the variable, and return its identifier.
        let variable;
        if (this.variable.valueSpan !== undefined) {
            addParseSpanInfo(initializer, this.variable.valueSpan);
            variable = tsCreateVariable(id, wrapForTypeChecker(initializer));
        }
        else {
            variable = tsCreateVariable(id, initializer);
        }
        addParseSpanInfo(variable.declarationList.declarations[0], this.variable.sourceSpan);
        this.scope.addStatement(variable);
        return id;
    }
}
/**
 * A `TcbOp` which generates a variable for a `TmplAstTemplate`'s context.
 *
 * Executing this operation returns a reference to the template's context variable.
 */
class TcbTemplateContextOp extends TcbOp {
    tcb;
    scope;
    constructor(tcb, scope) {
        super();
        this.tcb = tcb;
        this.scope = scope;
    }
    // The declaration of the context variable is only needed when the context is actually referenced.
    optional = true;
    execute() {
        // Allocate a template ctx variable and declare it with an 'any' type. The type of this variable
        // may be narrowed as a result of template guard conditions.
        const ctx = this.tcb.allocateId();
        const type = ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
        this.scope.addStatement(tsDeclareVariable(ctx, type));
        return ctx;
    }
}
/**
 * A `TcbOp` which generates a constant for a `TmplAstLetDeclaration`.
 *
 * Executing this operation returns a reference to the `@let` declaration.
 */
class TcbLetDeclarationOp extends TcbOp {
    tcb;
    scope;
    node;
    constructor(tcb, scope, node) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.node = node;
    }
    /**
     * `@let` declarations are mandatory, because their expressions
     * should be checked even if they aren't referenced anywhere.
     */
    optional = false;
    execute() {
        const id = this.tcb.allocateId();
        addParseSpanInfo(id, this.node.nameSpan);
        const value = tcbExpression(this.node.value, this.tcb, this.scope);
        // Value needs to be wrapped, because spans for the expressions inside of it can
        // be picked up incorrectly as belonging to the full variable declaration.
        const varStatement = tsCreateVariable(id, wrapForTypeChecker(value), ts.NodeFlags.Const);
        addParseSpanInfo(varStatement.declarationList.declarations[0], this.node.sourceSpan);
        this.scope.addStatement(varStatement);
        return id;
    }
}
/**
 * A `TcbOp` which descends into a `TmplAstTemplate`'s children and generates type-checking code for
 * them.
 *
 * This operation wraps the children's type-checking code in an `if` block, which may include one
 * or more type guard conditions that narrow types within the template body.
 */
class TcbTemplateBodyOp extends TcbOp {
    tcb;
    scope;
    template;
    constructor(tcb, scope, template) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.template = template;
    }
    get optional() {
        return false;
    }
    execute() {
        // An `if` will be constructed, within which the template's children will be type checked. The
        // `if` is used for two reasons: it creates a new syntactic scope, isolating variables declared
        // in the template's TCB from the outer context, and it allows any directives on the templates
        // to perform type narrowing of either expressions or the template's context.
        //
        // The guard is the `if` block's condition. It's usually set to `true` but directives that exist
        // on the template can trigger extra guard expressions that serve to narrow types within the
        // `if`. `guard` is calculated by starting with `true` and adding other conditions as needed.
        // Collect these into `guards` by processing the directives.
        const directiveGuards = [];
        const directives = this.tcb.boundTarget.getDirectivesOfNode(this.template);
        if (directives !== null) {
            for (const dir of directives) {
                const dirInstId = this.scope.resolve(this.template, dir);
                const dirId = this.tcb.env.reference(dir.ref);
                // There are two kinds of guards. Template guards (ngTemplateGuards) allow type narrowing of
                // the expression passed to an @Input of the directive. Scan the directive to see if it has
                // any template guards, and generate them if needed.
                dir.ngTemplateGuards.forEach((guard) => {
                    // For each template guard function on the directive, look for a binding to that input.
                    const boundInput = this.template.inputs.find((i) => i.name === guard.inputName) ||
                        this.template.templateAttrs.find((i) => i instanceof BoundAttribute && i.name === guard.inputName);
                    if (boundInput !== undefined) {
                        // If there is such a binding, generate an expression for it.
                        const expr = tcbExpression(boundInput.value, this.tcb, this.scope);
                        // The expression has already been checked in the type constructor invocation, so
                        // it should be ignored when used within a template guard.
                        markIgnoreDiagnostics(expr);
                        if (guard.type === 'binding') {
                            // Use the binding expression itself as guard.
                            directiveGuards.push(expr);
                        }
                        else {
                            // Call the guard function on the directive with the directive instance and that
                            // expression.
                            const guardInvoke = tsCallMethod(dirId, `ngTemplateGuard_${guard.inputName}`, [
                                dirInstId,
                                expr,
                            ]);
                            addParseSpanInfo(guardInvoke, boundInput.value.sourceSpan);
                            directiveGuards.push(guardInvoke);
                        }
                    }
                });
                // The second kind of guard is a template context guard. This guard narrows the template
                // rendering context variable `ctx`.
                if (dir.hasNgTemplateContextGuard) {
                    if (this.tcb.env.config.applyTemplateContextGuards) {
                        const ctx = this.scope.resolve(this.template);
                        const guardInvoke = tsCallMethod(dirId, 'ngTemplateContextGuard', [dirInstId, ctx]);
                        addParseSpanInfo(guardInvoke, this.template.sourceSpan);
                        directiveGuards.push(guardInvoke);
                    }
                    else if (this.template.variables.length > 0 &&
                        this.tcb.env.config.suggestionsForSuboptimalTypeInference) {
                        // The compiler could have inferred a better type for the variables in this template,
                        // but was prevented from doing so by the type-checking configuration. Issue a warning
                        // diagnostic.
                        this.tcb.oobRecorder.suboptimalTypeInference(this.tcb.id, this.template.variables);
                    }
                }
            }
        }
        // By default the guard is simply `true`.
        let guard = null;
        // If there are any guards from directives, use them instead.
        if (directiveGuards.length > 0) {
            // Pop the first value and use it as the initializer to reduce(). This way, a single guard
            // will be used on its own, but two or more will be combined into binary AND expressions.
            guard = directiveGuards.reduce((expr, dirGuard) => ts.factory.createBinaryExpression(expr, ts.SyntaxKind.AmpersandAmpersandToken, dirGuard), directiveGuards.pop());
        }
        // Create a new Scope for the template. This constructs the list of operations for the template
        // children, as well as tracks bindings within the template.
        const tmplScope = Scope.forNodes(this.tcb, this.scope, this.template, this.template.children, guard);
        // Render the template's `Scope` into its statements.
        const statements = tmplScope.render();
        if (statements.length === 0) {
            // As an optimization, don't generate the scope's block if it has no statements. This is
            // beneficial for templates that contain for example `<span *ngIf="first"></span>`, in which
            // case there's no need to render the `NgIf` guard expression. This seems like a minor
            // improvement, however it reduces the number of flow-node antecedents that TypeScript needs
            // to keep into account for such cases, resulting in an overall reduction of
            // type-checking time.
            return null;
        }
        let tmplBlock = ts.factory.createBlock(statements);
        if (guard !== null) {
            // The scope has a guard that needs to be applied, so wrap the template block into an `if`
            // statement containing the guard expression.
            tmplBlock = ts.factory.createIfStatement(
            /* expression */ guard, 
            /* thenStatement */ tmplBlock);
        }
        this.scope.addStatement(tmplBlock);
        return null;
    }
}
/**
 * A `TcbOp` which renders an Angular expression (e.g. `{{foo() && bar.baz}}`).
 *
 * Executing this operation returns nothing.
 */
class TcbExpressionOp extends TcbOp {
    tcb;
    scope;
    expression;
    constructor(tcb, scope, expression) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.expression = expression;
    }
    get optional() {
        return false;
    }
    execute() {
        const expr = tcbExpression(this.expression, this.tcb, this.scope);
        this.scope.addStatement(ts.factory.createExpressionStatement(expr));
        return null;
    }
}
/**
 * A `TcbOp` which constructs an instance of a directive. For generic directives, generic
 * parameters are set to `any` type.
 */
class TcbDirectiveTypeOpBase extends TcbOp {
    tcb;
    scope;
    node;
    dir;
    constructor(tcb, scope, node, dir) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.node = node;
        this.dir = dir;
    }
    get optional() {
        // The statement generated by this operation is only used to declare the directive's type and
        // won't report diagnostics by itself, so the operation is marked as optional to avoid
        // generating declarations for directives that don't have any inputs/outputs.
        return true;
    }
    execute() {
        const dirRef = this.dir.ref;
        const rawType = this.tcb.env.referenceType(this.dir.ref);
        let type;
        if (this.dir.isGeneric === false || dirRef.node.typeParameters === undefined) {
            type = rawType;
        }
        else {
            if (!ts.isTypeReferenceNode(rawType)) {
                throw new Error(`Expected TypeReferenceNode when referencing the type for ${this.dir.ref.debugName}`);
            }
            const typeArguments = dirRef.node.typeParameters.map(() => ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
            type = ts.factory.createTypeReferenceNode(rawType.typeName, typeArguments);
        }
        const id = this.tcb.allocateId();
        addExpressionIdentifier(id, ExpressionIdentifier.DIRECTIVE);
        addParseSpanInfo(id, this.node.startSourceSpan || this.node.sourceSpan);
        this.scope.addStatement(tsDeclareVariable(id, type));
        return id;
    }
}
/**
 * A `TcbOp` which constructs an instance of a non-generic directive _without_ setting any of its
 * inputs. Inputs are later set in the `TcbDirectiveInputsOp`. Type checking was found to be
 * faster when done in this way as opposed to `TcbDirectiveCtorOp` which is only necessary when the
 * directive is generic.
 *
 * Executing this operation returns a reference to the directive instance variable with its inferred
 * type.
 */
class TcbNonGenericDirectiveTypeOp extends TcbDirectiveTypeOpBase {
    /**
     * Creates a variable declaration for this op's directive of the argument type. Returns the id of
     * the newly created variable.
     */
    execute() {
        const dirRef = this.dir.ref;
        if (this.dir.isGeneric) {
            throw new Error(`Assertion Error: expected ${dirRef.debugName} not to be generic.`);
        }
        return super.execute();
    }
}
/**
 * A `TcbOp` which constructs an instance of a generic directive with its generic parameters set
 * to `any` type. This op is like `TcbDirectiveTypeOp`, except that generic parameters are set to
 * `any` type. This is used for situations where we want to avoid inlining.
 *
 * Executing this operation returns a reference to the directive instance variable with its generic
 * type parameters set to `any`.
 */
class TcbGenericDirectiveTypeWithAnyParamsOp extends TcbDirectiveTypeOpBase {
    execute() {
        const dirRef = this.dir.ref;
        if (dirRef.node.typeParameters === undefined) {
            throw new Error(`Assertion Error: expected typeParameters when creating a declaration for ${dirRef.debugName}`);
        }
        return super.execute();
    }
}
/**
 * A `TcbOp` which creates a variable for a local ref in a template.
 * The initializer for the variable is the variable expression for the directive, template, or
 * element the ref refers to. When the reference is used in the template, those TCB statements will
 * access this variable as well. For example:
 * ```ts
 * var _t1 = document.createElement('div');
 * var _t2 = _t1;
 * _t2.value
 * ```
 * This operation supports more fluent lookups for the `TemplateTypeChecker` when getting a symbol
 * for a reference. In most cases, this isn't essential; that is, the information for the symbol
 * could be gathered without this operation using the `BoundTarget`. However, for the case of
 * ng-template references, we will need this reference variable to not only provide a location in
 * the shim file, but also to narrow the variable to the correct `TemplateRef<T>` type rather than
 * `TemplateRef<any>` (this work is still TODO).
 *
 * Executing this operation returns a reference to the directive instance variable with its inferred
 * type.
 */
class TcbReferenceOp extends TcbOp {
    tcb;
    scope;
    node;
    host;
    target;
    constructor(tcb, scope, node, host, target) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.node = node;
        this.host = host;
        this.target = target;
    }
    // The statement generated by this operation is only used to for the Type Checker
    // so it can map a reference variable in the template directly to a node in the TCB.
    optional = true;
    execute() {
        const id = this.tcb.allocateId();
        let initializer = this.target instanceof Template || this.target instanceof Element$1
            ? this.scope.resolve(this.target)
            : this.scope.resolve(this.host, this.target);
        // The reference is either to an element, an <ng-template> node, or to a directive on an
        // element or template.
        if ((this.target instanceof Element$1 && !this.tcb.env.config.checkTypeOfDomReferences) ||
            !this.tcb.env.config.checkTypeOfNonDomReferences) {
            // References to DOM nodes are pinned to 'any' when `checkTypeOfDomReferences` is `false`.
            // References to `TemplateRef`s and directives are pinned to 'any' when
            // `checkTypeOfNonDomReferences` is `false`.
            initializer = ts.factory.createAsExpression(initializer, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
        }
        else if (this.target instanceof Template) {
            // Direct references to an <ng-template> node simply require a value of type
            // `TemplateRef<any>`. To get this, an expression of the form
            // `(_t1 as any as TemplateRef<any>)` is constructed.
            initializer = ts.factory.createAsExpression(initializer, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
            initializer = ts.factory.createAsExpression(initializer, this.tcb.env.referenceExternalType('@angular/core', 'TemplateRef', [DYNAMIC_TYPE]));
            initializer = ts.factory.createParenthesizedExpression(initializer);
        }
        addParseSpanInfo(initializer, this.node.sourceSpan);
        addParseSpanInfo(id, this.node.keySpan);
        this.scope.addStatement(tsCreateVariable(id, initializer));
        return id;
    }
}
/**
 * A `TcbOp` which is used when the target of a reference is missing. This operation generates a
 * variable of type any for usages of the invalid reference to resolve to. The invalid reference
 * itself is recorded out-of-band.
 */
class TcbInvalidReferenceOp extends TcbOp {
    tcb;
    scope;
    constructor(tcb, scope) {
        super();
        this.tcb = tcb;
        this.scope = scope;
    }
    // The declaration of a missing reference is only needed when the reference is resolved.
    optional = true;
    execute() {
        const id = this.tcb.allocateId();
        this.scope.addStatement(tsCreateVariable(id, ANY_EXPRESSION));
        return id;
    }
}
/**
 * A `TcbOp` which constructs an instance of a directive with types inferred from its inputs. The
 * inputs themselves are not checked here; checking of inputs is achieved in `TcbDirectiveInputsOp`.
 * Any errors reported in this statement are ignored, as the type constructor call is only present
 * for type-inference.
 *
 * When a Directive is generic, it is required that the TCB generates the instance using this method
 * in order to infer the type information correctly.
 *
 * Executing this operation returns a reference to the directive instance variable with its inferred
 * type.
 */
class TcbDirectiveCtorOp extends TcbOp {
    tcb;
    scope;
    node;
    dir;
    constructor(tcb, scope, node, dir) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.node = node;
        this.dir = dir;
    }
    get optional() {
        // The statement generated by this operation is only used to infer the directive's type and
        // won't report diagnostics by itself, so the operation is marked as optional.
        return true;
    }
    execute() {
        const id = this.tcb.allocateId();
        addExpressionIdentifier(id, ExpressionIdentifier.DIRECTIVE);
        addParseSpanInfo(id, this.node.startSourceSpan || this.node.sourceSpan);
        const genericInputs = new Map();
        const boundAttrs = getBoundAttributes(this.dir, this.node);
        for (const attr of boundAttrs) {
            // Skip text attributes if configured to do so.
            if (!this.tcb.env.config.checkTypeOfAttributes &&
                attr.attribute instanceof TextAttribute) {
                continue;
            }
            for (const { fieldName, isTwoWayBinding } of attr.inputs) {
                // Skip the field if an attribute has already been bound to it; we can't have a duplicate
                // key in the type constructor call.
                if (genericInputs.has(fieldName)) {
                    continue;
                }
                const expression = translateInput(attr.attribute, this.tcb, this.scope);
                genericInputs.set(fieldName, {
                    type: 'binding',
                    field: fieldName,
                    expression,
                    sourceSpan: attr.attribute.sourceSpan,
                    isTwoWayBinding,
                });
            }
        }
        // Add unset directive inputs for each of the remaining unset fields.
        for (const { classPropertyName } of this.dir.inputs) {
            if (!genericInputs.has(classPropertyName)) {
                genericInputs.set(classPropertyName, { type: 'unset', field: classPropertyName });
            }
        }
        // Call the type constructor of the directive to infer a type, and assign the directive
        // instance.
        const typeCtor = tcbCallTypeCtor(this.dir, this.tcb, Array.from(genericInputs.values()));
        markIgnoreDiagnostics(typeCtor);
        this.scope.addStatement(tsCreateVariable(id, typeCtor));
        return id;
    }
    circularFallback() {
        return new TcbDirectiveCtorCircularFallbackOp(this.tcb, this.scope, this.node, this.dir);
    }
}
/**
 * A `TcbOp` which generates code to check input bindings on an element that correspond with the
 * members of a directive.
 *
 * Executing this operation returns nothing.
 */
class TcbDirectiveInputsOp extends TcbOp {
    tcb;
    scope;
    node;
    dir;
    constructor(tcb, scope, node, dir) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.node = node;
        this.dir = dir;
    }
    get optional() {
        return false;
    }
    execute() {
        let dirId = null;
        // TODO(joost): report duplicate properties
        const boundAttrs = getBoundAttributes(this.dir, this.node);
        const seenRequiredInputs = new Set();
        for (const attr of boundAttrs) {
            // For bound inputs, the property is assigned the binding expression.
            const expr = widenBinding(translateInput(attr.attribute, this.tcb, this.scope), this.tcb);
            let assignment = wrapForDiagnostics(expr);
            for (const { fieldName, required, transformType, isSignal, isTwoWayBinding } of attr.inputs) {
                let target;
                if (required) {
                    seenRequiredInputs.add(fieldName);
                }
                // Note: There is no special logic for transforms/coercion with signal inputs.
                // For signal inputs, a `transformType` will never be set as we do not capture
                // the transform in the compiler metadata. Signal inputs incorporate their
                // transform write type into their member type, and we extract it below when
                // setting the `WriteT` of such `InputSignalWithTransform<_, WriteT>`.
                if (this.dir.coercedInputFields.has(fieldName)) {
                    let type;
                    if (transformType !== null) {
                        type = this.tcb.env.referenceTransplantedType(new TransplantedType(transformType));
                    }
                    else {
                        // The input has a coercion declaration which should be used instead of assigning the
                        // expression into the input field directly. To achieve this, a variable is declared
                        // with a type of `typeof Directive.ngAcceptInputType_fieldName` which is then used as
                        // target of the assignment.
                        const dirTypeRef = this.tcb.env.referenceType(this.dir.ref);
                        if (!ts.isTypeReferenceNode(dirTypeRef)) {
                            throw new Error(`Expected TypeReferenceNode from reference to ${this.dir.ref.debugName}`);
                        }
                        type = tsCreateTypeQueryForCoercedInput(dirTypeRef.typeName, fieldName);
                    }
                    const id = this.tcb.allocateId();
                    this.scope.addStatement(tsDeclareVariable(id, type));
                    target = id;
                }
                else if (this.dir.undeclaredInputFields.has(fieldName)) {
                    // If no coercion declaration is present nor is the field declared (i.e. the input is
                    // declared in a `@Directive` or `@Component` decorator's `inputs` property) there is no
                    // assignment target available, so this field is skipped.
                    continue;
                }
                else if (!this.tcb.env.config.honorAccessModifiersForInputBindings &&
                    this.dir.restrictedInputFields.has(fieldName)) {
                    // If strict checking of access modifiers is disabled and the field is restricted
                    // (i.e. private/protected/readonly), generate an assignment into a temporary variable
                    // that has the type of the field. This achieves type-checking but circumvents the access
                    // modifiers.
                    if (dirId === null) {
                        dirId = this.scope.resolve(this.node, this.dir);
                    }
                    const id = this.tcb.allocateId();
                    const dirTypeRef = this.tcb.env.referenceType(this.dir.ref);
                    if (!ts.isTypeReferenceNode(dirTypeRef)) {
                        throw new Error(`Expected TypeReferenceNode from reference to ${this.dir.ref.debugName}`);
                    }
                    const type = ts.factory.createIndexedAccessTypeNode(ts.factory.createTypeQueryNode(dirId), ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(fieldName)));
                    const temp = tsDeclareVariable(id, type);
                    this.scope.addStatement(temp);
                    target = id;
                }
                else {
                    if (dirId === null) {
                        dirId = this.scope.resolve(this.node, this.dir);
                    }
                    // To get errors assign directly to the fields on the instance, using property access
                    // when possible. String literal fields may not be valid JS identifiers so we use
                    // literal element access instead for those cases.
                    target = this.dir.stringLiteralInputFields.has(fieldName)
                        ? ts.factory.createElementAccessExpression(dirId, ts.factory.createStringLiteral(fieldName))
                        : ts.factory.createPropertyAccessExpression(dirId, ts.factory.createIdentifier(fieldName));
                }
                // For signal inputs, we unwrap the target `InputSignal`. Note that
                // we intentionally do the following things:
                //   1. keep the direct access to `dir.[field]` so that modifiers are honored.
                //   2. follow the existing pattern where multiple targets assign a single expression.
                //      This is a significant requirement for language service auto-completion.
                if (isSignal) {
                    const inputSignalBrandWriteSymbol = this.tcb.env.referenceExternalSymbol(Identifiers.InputSignalBrandWriteType.moduleName, Identifiers.InputSignalBrandWriteType.name);
                    if (!ts.isIdentifier(inputSignalBrandWriteSymbol) &&
                        !ts.isPropertyAccessExpression(inputSignalBrandWriteSymbol)) {
                        throw new Error(`Expected identifier or property access for reference to ${Identifiers.InputSignalBrandWriteType.name}`);
                    }
                    target = ts.factory.createElementAccessExpression(target, inputSignalBrandWriteSymbol);
                }
                if (attr.attribute.keySpan !== undefined) {
                    addParseSpanInfo(target, attr.attribute.keySpan);
                }
                // Two-way bindings accept `T | WritableSignal<T>` so we have to unwrap the value.
                if (isTwoWayBinding && this.tcb.env.config.allowSignalsInTwoWayBindings) {
                    assignment = unwrapWritableSignal(assignment, this.tcb);
                }
                // Finally the assignment is extended by assigning it into the target expression.
                assignment = ts.factory.createBinaryExpression(target, ts.SyntaxKind.EqualsToken, assignment);
            }
            addParseSpanInfo(assignment, attr.attribute.sourceSpan);
            // Ignore diagnostics for text attributes if configured to do so.
            if (!this.tcb.env.config.checkTypeOfAttributes &&
                attr.attribute instanceof TextAttribute) {
                markIgnoreDiagnostics(assignment);
            }
            this.scope.addStatement(ts.factory.createExpressionStatement(assignment));
        }
        this.checkRequiredInputs(seenRequiredInputs);
        return null;
    }
    checkRequiredInputs(seenRequiredInputs) {
        const missing = [];
        for (const input of this.dir.inputs) {
            if (input.required && !seenRequiredInputs.has(input.classPropertyName)) {
                missing.push(input.bindingPropertyName);
            }
        }
        if (missing.length > 0) {
            this.tcb.oobRecorder.missingRequiredInputs(this.tcb.id, this.node, this.dir.name, this.dir.isComponent, missing);
        }
    }
}
/**
 * A `TcbOp` which is used to generate a fallback expression if the inference of a directive type
 * via `TcbDirectiveCtorOp` requires a reference to its own type. This can happen using a template
 * reference:
 *
 * ```html
 * <some-cmp #ref [prop]="ref.foo"></some-cmp>
 * ```
 *
 * In this case, `TcbDirectiveCtorCircularFallbackOp` will add a second inference of the directive
 * type to the type-check block, this time calling the directive's type constructor without any
 * input expressions. This infers the widest possible supertype for the directive, which is used to
 * resolve any recursive references required to infer the real type.
 */
class TcbDirectiveCtorCircularFallbackOp extends TcbOp {
    tcb;
    scope;
    node;
    dir;
    constructor(tcb, scope, node, dir) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.node = node;
        this.dir = dir;
    }
    get optional() {
        return false;
    }
    execute() {
        const id = this.tcb.allocateId();
        const typeCtor = this.tcb.env.typeCtorFor(this.dir);
        const circularPlaceholder = ts.factory.createCallExpression(typeCtor, 
        /* typeArguments */ undefined, [ts.factory.createNonNullExpression(ts.factory.createNull())]);
        this.scope.addStatement(tsCreateVariable(id, circularPlaceholder));
        return id;
    }
}
/**
 * A `TcbOp` which feeds elements and unclaimed properties to the `DomSchemaChecker`.
 *
 * The DOM schema is not checked via TCB code generation. Instead, the `DomSchemaChecker` ingests
 * elements and property bindings and accumulates synthetic `ts.Diagnostic`s out-of-band. These are
 * later merged with the diagnostics generated from the TCB.
 *
 * For convenience, the TCB iteration of the template is used to drive the `DomSchemaChecker` via
 * the `TcbDomSchemaCheckerOp`.
 */
class TcbDomSchemaCheckerOp extends TcbOp {
    tcb;
    element;
    checkElement;
    claimedInputs;
    constructor(tcb, element, checkElement, claimedInputs) {
        super();
        this.tcb = tcb;
        this.element = element;
        this.checkElement = checkElement;
        this.claimedInputs = claimedInputs;
    }
    get optional() {
        return false;
    }
    execute() {
        if (this.checkElement) {
            this.tcb.domSchemaChecker.checkElement(this.tcb.id, this.element, this.tcb.schemas, this.tcb.hostIsStandalone);
        }
        // TODO(alxhub): this could be more efficient.
        for (const binding of this.element.inputs) {
            const isPropertyBinding = binding.type === exports.BindingType.Property || binding.type === exports.BindingType.TwoWay;
            if (isPropertyBinding && this.claimedInputs.has(binding.name)) {
                // Skip this binding as it was claimed by a directive.
                continue;
            }
            if (isPropertyBinding && binding.name !== 'style' && binding.name !== 'class') {
                // A direct binding to a property.
                const propertyName = ATTR_TO_PROP.get(binding.name) ?? binding.name;
                this.tcb.domSchemaChecker.checkProperty(this.tcb.id, this.element, propertyName, binding.sourceSpan, this.tcb.schemas, this.tcb.hostIsStandalone);
            }
        }
        return null;
    }
}
/**
 * A `TcbOp` that finds and flags control flow nodes that interfere with content projection.
 *
 * Context:
 * Control flow blocks try to emulate the content projection behavior of `*ngIf` and `*ngFor`
 * in order to reduce breakages when moving from one syntax to the other (see #52414), however the
 * approach only works if there's only one element at the root of the control flow expression.
 * This means that a stray sibling node (e.g. text) can prevent an element from being projected
 * into the right slot. The purpose of the `TcbOp` is to find any places where a node at the root
 * of a control flow expression *would have been projected* into a specific slot, if the control
 * flow node didn't exist.
 */
class TcbControlFlowContentProjectionOp extends TcbOp {
    tcb;
    element;
    ngContentSelectors;
    componentName;
    category;
    constructor(tcb, element, ngContentSelectors, componentName) {
        super();
        this.tcb = tcb;
        this.element = element;
        this.ngContentSelectors = ngContentSelectors;
        this.componentName = componentName;
        // We only need to account for `error` and `warning` since
        // this check won't be enabled for `suppress`.
        this.category =
            tcb.env.config.controlFlowPreventingContentProjection === 'error'
                ? ts.DiagnosticCategory.Error
                : ts.DiagnosticCategory.Warning;
    }
    optional = false;
    execute() {
        const controlFlowToCheck = this.findPotentialControlFlowNodes();
        if (controlFlowToCheck.length > 0) {
            const matcher = new SelectorMatcher();
            for (const selector of this.ngContentSelectors) {
                // `*` is a special selector for the catch-all slot.
                if (selector !== '*') {
                    matcher.addSelectables(CssSelector.parse(selector), selector);
                }
            }
            for (const root of controlFlowToCheck) {
                for (const child of root.children) {
                    if (child instanceof Element$1 || child instanceof Template) {
                        matcher.match(createCssSelectorFromNode(child), (_, originalSelector) => {
                            this.tcb.oobRecorder.controlFlowPreventingContentProjection(this.tcb.id, this.category, child, this.componentName, originalSelector, root, this.tcb.hostPreserveWhitespaces);
                        });
                    }
                }
            }
        }
        return null;
    }
    findPotentialControlFlowNodes() {
        const result = [];
        for (const child of this.element.children) {
            if (child instanceof ForLoopBlock) {
                if (this.shouldCheck(child)) {
                    result.push(child);
                }
                if (child.empty !== null && this.shouldCheck(child.empty)) {
                    result.push(child.empty);
                }
            }
            else if (child instanceof IfBlock) {
                for (const branch of child.branches) {
                    if (this.shouldCheck(branch)) {
                        result.push(branch);
                    }
                }
            }
            else if (child instanceof SwitchBlock) {
                for (const current of child.cases) {
                    if (this.shouldCheck(current)) {
                        result.push(current);
                    }
                }
            }
        }
        return result;
    }
    shouldCheck(node) {
        // Skip nodes with less than two children since it's impossible
        // for them to run into the issue that we're checking for.
        if (node.children.length < 2) {
            return false;
        }
        let hasSeenRootNode = false;
        // Check the number of root nodes while skipping empty text where relevant.
        for (const child of node.children) {
            // Normally `preserveWhitspaces` would have been accounted for during parsing, however
            // in `ngtsc/annotations/component/src/resources.ts#parseExtractedTemplate` we enable
            // `preserveWhitespaces` to preserve the accuracy of source maps diagnostics. This means
            // that we have to account for it here since the presence of text nodes affects the
            // content projection behavior.
            if (!(child instanceof Text$3) ||
                this.tcb.hostPreserveWhitespaces ||
                child.value.trim().length > 0) {
                // Content projection will be affected if there's more than one root node.
                if (hasSeenRootNode) {
                    return true;
                }
                hasSeenRootNode = true;
            }
        }
        return false;
    }
}
/**
 * Mapping between attributes names that don't correspond to their element property names.
 * Note: this mapping has to be kept in sync with the equally named mapping in the runtime.
 */
const ATTR_TO_PROP = new Map(Object.entries({
    'class': 'className',
    'for': 'htmlFor',
    'formaction': 'formAction',
    'innerHtml': 'innerHTML',
    'readonly': 'readOnly',
    'tabindex': 'tabIndex',
}));
/**
 * A `TcbOp` which generates code to check "unclaimed inputs" - bindings on an element which were
 * not attributed to any directive or component, and are instead processed against the HTML element
 * itself.
 *
 * Currently, only the expressions of these bindings are checked. The targets of the bindings are
 * checked against the DOM schema via a `TcbDomSchemaCheckerOp`.
 *
 * Executing this operation returns nothing.
 */
class TcbUnclaimedInputsOp extends TcbOp {
    tcb;
    scope;
    element;
    claimedInputs;
    constructor(tcb, scope, element, claimedInputs) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.element = element;
        this.claimedInputs = claimedInputs;
    }
    get optional() {
        return false;
    }
    execute() {
        // `this.inputs` contains only those bindings not matched by any directive. These bindings go to
        // the element itself.
        let elId = null;
        // TODO(alxhub): this could be more efficient.
        for (const binding of this.element.inputs) {
            const isPropertyBinding = binding.type === exports.BindingType.Property || binding.type === exports.BindingType.TwoWay;
            if (isPropertyBinding && this.claimedInputs.has(binding.name)) {
                // Skip this binding as it was claimed by a directive.
                continue;
            }
            const expr = widenBinding(tcbExpression(binding.value, this.tcb, this.scope), this.tcb);
            if (this.tcb.env.config.checkTypeOfDomBindings && isPropertyBinding) {
                if (binding.name !== 'style' && binding.name !== 'class') {
                    if (elId === null) {
                        elId = this.scope.resolve(this.element);
                    }
                    // A direct binding to a property.
                    const propertyName = ATTR_TO_PROP.get(binding.name) ?? binding.name;
                    const prop = ts.factory.createElementAccessExpression(elId, ts.factory.createStringLiteral(propertyName));
                    const stmt = ts.factory.createBinaryExpression(prop, ts.SyntaxKind.EqualsToken, wrapForDiagnostics(expr));
                    addParseSpanInfo(stmt, binding.sourceSpan);
                    this.scope.addStatement(ts.factory.createExpressionStatement(stmt));
                }
                else {
                    this.scope.addStatement(ts.factory.createExpressionStatement(expr));
                }
            }
            else {
                // A binding to an animation, attribute, class or style. For now, only validate the right-
                // hand side of the expression.
                // TODO: properly check class and style bindings.
                this.scope.addStatement(ts.factory.createExpressionStatement(expr));
            }
        }
        return null;
    }
}
/**
 * A `TcbOp` which generates code to check event bindings on an element that correspond with the
 * outputs of a directive.
 *
 * Executing this operation returns nothing.
 */
class TcbDirectiveOutputsOp extends TcbOp {
    tcb;
    scope;
    node;
    dir;
    constructor(tcb, scope, node, dir) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.node = node;
        this.dir = dir;
    }
    get optional() {
        return false;
    }
    execute() {
        let dirId = null;
        const outputs = this.dir.outputs;
        for (const output of this.node.outputs) {
            if (output.type === exports.ParsedEventType.Animation ||
                !outputs.hasBindingPropertyName(output.name)) {
                continue;
            }
            if (this.tcb.env.config.checkTypeOfOutputEvents && output.name.endsWith('Change')) {
                const inputName = output.name.slice(0, -6);
                checkSplitTwoWayBinding(inputName, output, this.node.inputs, this.tcb);
            }
            // TODO(alxhub): consider supporting multiple fields with the same property name for outputs.
            const field = outputs.getByBindingPropertyName(output.name)[0].classPropertyName;
            if (dirId === null) {
                dirId = this.scope.resolve(this.node, this.dir);
            }
            const outputField = ts.factory.createElementAccessExpression(dirId, ts.factory.createStringLiteral(field));
            addParseSpanInfo(outputField, output.keySpan);
            if (this.tcb.env.config.checkTypeOfOutputEvents) {
                // For strict checking of directive events, generate a call to the `subscribe` method
                // on the directive's output field to let type information flow into the handler function's
                // `$event` parameter.
                const handler = tcbCreateEventHandler(output, this.tcb, this.scope, 0 /* EventParamType.Infer */);
                const subscribeFn = ts.factory.createPropertyAccessExpression(outputField, 'subscribe');
                const call = ts.factory.createCallExpression(subscribeFn, /* typeArguments */ undefined, [
                    handler,
                ]);
                addParseSpanInfo(call, output.sourceSpan);
                this.scope.addStatement(ts.factory.createExpressionStatement(call));
            }
            else {
                // If strict checking of directive events is disabled:
                //
                // * We still generate the access to the output field as a statement in the TCB so consumers
                //   of the `TemplateTypeChecker` can still find the node for the class member for the
                //   output.
                // * Emit a handler function where the `$event` parameter has an explicit `any` type.
                this.scope.addStatement(ts.factory.createExpressionStatement(outputField));
                const handler = tcbCreateEventHandler(output, this.tcb, this.scope, 1 /* EventParamType.Any */);
                this.scope.addStatement(ts.factory.createExpressionStatement(handler));
            }
        }
        return null;
    }
}
/**
 * A `TcbOp` which generates code to check "unclaimed outputs" - event bindings on an element which
 * were not attributed to any directive or component, and are instead processed against the HTML
 * element itself.
 *
 * Executing this operation returns nothing.
 */
class TcbUnclaimedOutputsOp extends TcbOp {
    tcb;
    scope;
    element;
    claimedOutputs;
    constructor(tcb, scope, element, claimedOutputs) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.element = element;
        this.claimedOutputs = claimedOutputs;
    }
    get optional() {
        return false;
    }
    execute() {
        let elId = null;
        // TODO(alxhub): this could be more efficient.
        for (const output of this.element.outputs) {
            if (this.claimedOutputs.has(output.name)) {
                // Skip this event handler as it was claimed by a directive.
                continue;
            }
            if (this.tcb.env.config.checkTypeOfOutputEvents && output.name.endsWith('Change')) {
                const inputName = output.name.slice(0, -6);
                if (checkSplitTwoWayBinding(inputName, output, this.element.inputs, this.tcb)) {
                    // Skip this event handler as the error was already handled.
                    continue;
                }
            }
            if (output.type === exports.ParsedEventType.Animation) {
                // Animation output bindings always have an `$event` parameter of type `AnimationEvent`.
                const eventType = this.tcb.env.config.checkTypeOfAnimationEvents
                    ? this.tcb.env.referenceExternalType('@angular/animations', 'AnimationEvent')
                    : 1 /* EventParamType.Any */;
                const handler = tcbCreateEventHandler(output, this.tcb, this.scope, eventType);
                this.scope.addStatement(ts.factory.createExpressionStatement(handler));
            }
            else if (this.tcb.env.config.checkTypeOfDomEvents) {
                // If strict checking of DOM events is enabled, generate a call to `addEventListener` on
                // the element instance so that TypeScript's type inference for
                // `HTMLElement.addEventListener` using `HTMLElementEventMap` to infer an accurate type for
                // `$event` depending on the event name. For unknown event names, TypeScript resorts to the
                // base `Event` type.
                const handler = tcbCreateEventHandler(output, this.tcb, this.scope, 0 /* EventParamType.Infer */);
                if (elId === null) {
                    elId = this.scope.resolve(this.element);
                }
                const propertyAccess = ts.factory.createPropertyAccessExpression(elId, 'addEventListener');
                addParseSpanInfo(propertyAccess, output.keySpan);
                const call = ts.factory.createCallExpression(
                /* expression */ propertyAccess, 
                /* typeArguments */ undefined, 
                /* arguments */ [ts.factory.createStringLiteral(output.name), handler]);
                addParseSpanInfo(call, output.sourceSpan);
                this.scope.addStatement(ts.factory.createExpressionStatement(call));
            }
            else {
                // If strict checking of DOM inputs is disabled, emit a handler function where the `$event`
                // parameter has an explicit `any` type.
                const handler = tcbCreateEventHandler(output, this.tcb, this.scope, 1 /* EventParamType.Any */);
                this.scope.addStatement(ts.factory.createExpressionStatement(handler));
            }
        }
        return null;
    }
}
/**
 * A `TcbOp` which generates a completion point for the component context.
 *
 * This completion point looks like `this. ;` in the TCB output, and does not produce diagnostics.
 * TypeScript autocompletion APIs can be used at this completion point (after the '.') to produce
 * autocompletion results of properties and methods from the template's component context.
 */
class TcbComponentContextCompletionOp extends TcbOp {
    scope;
    constructor(scope) {
        super();
        this.scope = scope;
    }
    optional = false;
    execute() {
        const ctx = ts.factory.createThis();
        const ctxDot = ts.factory.createPropertyAccessExpression(ctx, '');
        markIgnoreDiagnostics(ctxDot);
        addExpressionIdentifier(ctxDot, ExpressionIdentifier.COMPONENT_COMPLETION);
        this.scope.addStatement(ts.factory.createExpressionStatement(ctxDot));
        return null;
    }
}
/**
 * A `TcbOp` which renders a variable defined inside of block syntax (e.g. `@if (expr; as var) {}`).
 *
 * Executing this operation returns the identifier which can be used to refer to the variable.
 */
class TcbBlockVariableOp extends TcbOp {
    tcb;
    scope;
    initializer;
    variable;
    constructor(tcb, scope, initializer, variable) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.initializer = initializer;
        this.variable = variable;
    }
    get optional() {
        return false;
    }
    execute() {
        const id = this.tcb.allocateId();
        addParseSpanInfo(id, this.variable.keySpan);
        const variable = tsCreateVariable(id, wrapForTypeChecker(this.initializer));
        addParseSpanInfo(variable.declarationList.declarations[0], this.variable.sourceSpan);
        this.scope.addStatement(variable);
        return id;
    }
}
/**
 * A `TcbOp` which renders a variable that is implicitly available within a block (e.g. `$count`
 * in a `@for` block).
 *
 * Executing this operation returns the identifier which can be used to refer to the variable.
 */
class TcbBlockImplicitVariableOp extends TcbOp {
    tcb;
    scope;
    type;
    variable;
    constructor(tcb, scope, type, variable) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.type = type;
        this.variable = variable;
    }
    optional = true;
    execute() {
        const id = this.tcb.allocateId();
        addParseSpanInfo(id, this.variable.keySpan);
        const variable = tsDeclareVariable(id, this.type);
        addParseSpanInfo(variable.declarationList.declarations[0], this.variable.sourceSpan);
        this.scope.addStatement(variable);
        return id;
    }
}
/**
 * A `TcbOp` which renders an `if` template block as a TypeScript `if` statement.
 *
 * Executing this operation returns nothing.
 */
class TcbIfOp extends TcbOp {
    tcb;
    scope;
    block;
    expressionScopes = new Map();
    constructor(tcb, scope, block) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.block = block;
    }
    get optional() {
        return false;
    }
    execute() {
        const root = this.generateBranch(0);
        root && this.scope.addStatement(root);
        return null;
    }
    generateBranch(index) {
        const branch = this.block.branches[index];
        if (!branch) {
            return undefined;
        }
        // If the expression is null, it means that it's an `else` statement.
        if (branch.expression === null) {
            const branchScope = this.getBranchScope(this.scope, branch, index);
            return ts.factory.createBlock(branchScope.render());
        }
        // We process the expression first in the parent scope, but create a scope around the block
        // that the body will inherit from. We do this, because we need to declare a separate variable
        // for the case where the expression has an alias _and_ because we need the processed
        // expression when generating the guard for the body.
        const outerScope = Scope.forNodes(this.tcb, this.scope, branch, [], null);
        outerScope.render().forEach((stmt) => this.scope.addStatement(stmt));
        this.expressionScopes.set(branch, outerScope);
        let expression = tcbExpression(branch.expression, this.tcb, this.scope);
        if (branch.expressionAlias !== null) {
            expression = ts.factory.createBinaryExpression(ts.factory.createParenthesizedExpression(expression), ts.SyntaxKind.AmpersandAmpersandToken, outerScope.resolve(branch.expressionAlias));
        }
        const bodyScope = this.getBranchScope(outerScope, branch, index);
        return ts.factory.createIfStatement(expression, ts.factory.createBlock(bodyScope.render()), this.generateBranch(index + 1));
    }
    getBranchScope(parentScope, branch, index) {
        const checkBody = this.tcb.env.config.checkControlFlowBodies;
        return Scope.forNodes(this.tcb, parentScope, null, checkBody ? branch.children : [], checkBody ? this.generateBranchGuard(index) : null);
    }
    generateBranchGuard(index) {
        let guard = null;
        // Since event listeners are inside callbacks, type narrowing doesn't apply to them anymore.
        // To recreate the behavior, we generate an expression that negates all the values of the
        // branches _before_ the current one, and then we add the current branch's expression on top.
        // For example `@if (expr === 1) {} @else if (expr === 2) {} @else if (expr === 3)`, the guard
        // for the last expression will be `!(expr === 1) && !(expr === 2) && expr === 3`.
        for (let i = 0; i <= index; i++) {
            const branch = this.block.branches[i];
            // Skip over branches without an expression.
            if (branch.expression === null) {
                continue;
            }
            // This shouldn't happen since all the state is handled
            // internally, but we have the check just in case.
            if (!this.expressionScopes.has(branch)) {
                throw new Error(`Could not determine expression scope of branch at index ${i}`);
            }
            const expressionScope = this.expressionScopes.get(branch);
            let expression;
            // We need to recreate the expression and mark it to be ignored for diagnostics,
            // because it was already checked as a part of the block's condition and we don't
            // want it to produce a duplicate diagnostic.
            expression = tcbExpression(branch.expression, this.tcb, expressionScope);
            if (branch.expressionAlias !== null) {
                expression = ts.factory.createBinaryExpression(ts.factory.createParenthesizedExpression(expression), ts.SyntaxKind.AmpersandAmpersandToken, expressionScope.resolve(branch.expressionAlias));
            }
            markIgnoreDiagnostics(expression);
            // The expressions of the preceding branches have to be negated
            // (e.g. `expr` becomes `!(expr)`) when comparing in the guard, except
            // for the branch's own expression which is preserved as is.
            const comparisonExpression = i === index
                ? expression
                : ts.factory.createPrefixUnaryExpression(ts.SyntaxKind.ExclamationToken, ts.factory.createParenthesizedExpression(expression));
            // Finally add the expression to the guard with an && operator.
            guard =
                guard === null
                    ? comparisonExpression
                    : ts.factory.createBinaryExpression(guard, ts.SyntaxKind.AmpersandAmpersandToken, comparisonExpression);
        }
        return guard;
    }
}
/**
 * A `TcbOp` which renders a `switch` block as a TypeScript `switch` statement.
 *
 * Executing this operation returns nothing.
 */
class TcbSwitchOp extends TcbOp {
    tcb;
    scope;
    block;
    constructor(tcb, scope, block) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.block = block;
    }
    get optional() {
        return false;
    }
    execute() {
        const switchExpression = tcbExpression(this.block.expression, this.tcb, this.scope);
        const clauses = this.block.cases.map((current) => {
            const checkBody = this.tcb.env.config.checkControlFlowBodies;
            const clauseScope = Scope.forNodes(this.tcb, this.scope, null, checkBody ? current.children : [], checkBody ? this.generateGuard(current, switchExpression) : null);
            const statements = [...clauseScope.render(), ts.factory.createBreakStatement()];
            return current.expression === null
                ? ts.factory.createDefaultClause(statements)
                : ts.factory.createCaseClause(tcbExpression(current.expression, this.tcb, clauseScope), statements);
        });
        this.scope.addStatement(ts.factory.createSwitchStatement(switchExpression, ts.factory.createCaseBlock(clauses)));
        return null;
    }
    generateGuard(node, switchValue) {
        // For non-default cases, the guard needs to compare against the case value, e.g.
        // `switchExpression === caseExpression`.
        if (node.expression !== null) {
            // The expression needs to be ignored for diagnostics since it has been checked already.
            const expression = tcbExpression(node.expression, this.tcb, this.scope);
            markIgnoreDiagnostics(expression);
            return ts.factory.createBinaryExpression(switchValue, ts.SyntaxKind.EqualsEqualsEqualsToken, expression);
        }
        // To fully narrow the type in the default case, we need to generate an expression that negates
        // the values of all of the other expressions. For example:
        // @switch (expr) {
        //   @case (1) {}
        //   @case (2) {}
        //   @default {}
        // }
        // Will produce the guard `expr !== 1 && expr !== 2`.
        let guard = null;
        for (const current of this.block.cases) {
            if (current.expression === null) {
                continue;
            }
            // The expression needs to be ignored for diagnostics since it has been checked already.
            const expression = tcbExpression(current.expression, this.tcb, this.scope);
            markIgnoreDiagnostics(expression);
            const comparison = ts.factory.createBinaryExpression(switchValue, ts.SyntaxKind.ExclamationEqualsEqualsToken, expression);
            if (guard === null) {
                guard = comparison;
            }
            else {
                guard = ts.factory.createBinaryExpression(guard, ts.SyntaxKind.AmpersandAmpersandToken, comparison);
            }
        }
        return guard;
    }
}
/**
 * A `TcbOp` which renders a `for` block as a TypeScript `for...of` loop.
 *
 * Executing this operation returns nothing.
 */
class TcbForOfOp extends TcbOp    {
    tcb;
    scope;
    block;
    constructor(tcb, scope, block) {
        super();
        this.tcb = tcb;
        this.scope = scope;
        this.block = block;
    }
    get optional() {
        return false;
    }
    execute() {
        const loopScope = Scope.forNodes(this.tcb, this.scope, this.block, this.tcb.env.config.checkControlFlowBodies ? this.block.children : [], null);
        const initializerId = loopScope.resolve(this.block.item);
        if (!ts.isIdentifier(initializerId)) {
            throw new Error(`Could not resolve for loop variable ${this.block.item.name} to an identifier`);
        }
        const initializer = ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(initializerId)], ts.NodeFlags.Const);
        addParseSpanInfo(initializer, this.block.item.keySpan);
        // It's common to have a for loop over a nullable value (e.g. produced by the `async` pipe).
        // Add a non-null expression to allow such values to be assigned.
        const expression = ts.factory.createNonNullExpression(tcbExpression(this.block.expression, this.tcb, this.scope));
        const trackTranslator = new TcbForLoopTrackTranslator(this.tcb, loopScope, this.block);
        const trackExpression = trackTranslator.translate(this.block.trackBy);
        const statements = [
            ...loopScope.render(),
            ts.factory.createExpressionStatement(trackExpression),
        ];
        this.scope.addStatement(ts.factory.createForOfStatement(undefined, initializer, expression, ts.factory.createBlock(statements)));
        return null;
    }
}
/**
 * Value used to break a circular reference between `TcbOp`s.
 *
 * This value is returned whenever `TcbOp`s have a circular dependency. The expression is a non-null
 * assertion of the null value (in TypeScript, the expression `null!`). This construction will infer
 * the least narrow type for whatever it's assigned to.
 */
const INFER_TYPE_FOR_CIRCULAR_OP_EXPR = ts.factory.createNonNullExpression(ts.factory.createNull());
/**
 * Overall generation context for the type check block.
 *
 * `Context` handles operations during code generation which are global with respect to the whole
 * block. It's responsible for variable name allocation and management of any imports needed. It
 * also contains the template metadata itself.
 */
class Context {
    env;
    domSchemaChecker;
    oobRecorder;
    id;
    boundTarget;
    pipes;
    schemas;
    hostIsStandalone;
    hostPreserveWhitespaces;
    nextId = 1;
    constructor(env, domSchemaChecker, oobRecorder, id, boundTarget, pipes, schemas, hostIsStandalone, hostPreserveWhitespaces) {
        this.env = env;
        this.domSchemaChecker = domSchemaChecker;
        this.oobRecorder = oobRecorder;
        this.id = id;
        this.boundTarget = boundTarget;
        this.pipes = pipes;
        this.schemas = schemas;
        this.hostIsStandalone = hostIsStandalone;
        this.hostPreserveWhitespaces = hostPreserveWhitespaces;
    }
    /**
     * Allocate a new variable name for use within the `Context`.
     *
     * Currently this uses a monotonically increasing counter, but in the future the variable name
     * might change depending on the type of data being stored.
     */
    allocateId() {
        return ts.factory.createIdentifier(`_t${this.nextId++}`);
    }
    getPipeByName(name) {
        if (this.pipes === null || !this.pipes.has(name)) {
            return null;
        }
        return this.pipes.get(name);
    }
}
/**
 * Local scope within the type check block for a particular template.
 *
 * The top-level template and each nested `<ng-template>` have their own `Scope`, which exist in a
 * hierarchy. The structure of this hierarchy mirrors the syntactic scopes in the generated type
 * check block, where each nested template is encased in an `if` structure.
 *
 * As a template's `TcbOp`s are executed in a given `Scope`, statements are added via
 * `addStatement()`. When this processing is complete, the `Scope` can be turned into a `ts.Block`
 * via `renderToBlock()`.
 *
 * If a `TcbOp` requires the output of another, it can call `resolve()`.
 */
class Scope {
    tcb;
    parent;
    guard;
    /**
     * A queue of operations which need to be performed to generate the TCB code for this scope.
     *
     * This array can contain either a `TcbOp` which has yet to be executed, or a `ts.Expression|null`
     * representing the memoized result of executing the operation. As operations are executed, their
     * results are written into the `opQueue`, overwriting the original operation.
     *
     * If an operation is in the process of being executed, it is temporarily overwritten here with
     * `INFER_TYPE_FOR_CIRCULAR_OP_EXPR`. This way, if a cycle is encountered where an operation
     * depends transitively on its own result, the inner operation will infer the least narrow type
     * that fits instead. This has the same semantics as TypeScript itself when types are referenced
     * circularly.
     */
    opQueue = [];
    /**
     * A map of `TmplAstElement`s to the index of their `TcbElementOp` in the `opQueue`
     */
    elementOpMap = new Map();
    /**
     * A map of maps which tracks the index of `TcbDirectiveCtorOp`s in the `opQueue` for each
     * directive on a `TmplAstElement` or `TmplAstTemplate` node.
     */
    directiveOpMap = new Map();
    /**
     * A map of `TmplAstReference`s to the index of their `TcbReferenceOp` in the `opQueue`
     */
    referenceOpMap = new Map();
    /**
     * Map of immediately nested <ng-template>s (within this `Scope`) represented by `TmplAstTemplate`
     * nodes to the index of their `TcbTemplateContextOp`s in the `opQueue`.
     */
    templateCtxOpMap = new Map();
    /**
     * Map of variables declared on the template that created this `Scope` (represented by
     * `TmplAstVariable` nodes) to the index of their `TcbVariableOp`s in the `opQueue`, or to
     * pre-resolved variable identifiers.
     */
    varMap = new Map();
    /**
     * A map of the names of `TmplAstLetDeclaration`s to the index of their op in the `opQueue`.
     *
     * Assumes that there won't be duplicated `@let` declarations within the same scope.
     */
    letDeclOpMap = new Map();
    /**
     * Statements for this template.
     *
     * Executing the `TcbOp`s in the `opQueue` populates this array.
     */
    statements = [];
    /**
     * Names of the for loop context variables and their types.
     */
    static forLoopContextVariableTypes = new Map([
        ['$first', ts.SyntaxKind.BooleanKeyword],
        ['$last', ts.SyntaxKind.BooleanKeyword],
        ['$even', ts.SyntaxKind.BooleanKeyword],
        ['$odd', ts.SyntaxKind.BooleanKeyword],
        ['$index', ts.SyntaxKind.NumberKeyword],
        ['$count', ts.SyntaxKind.NumberKeyword],
    ]);
    constructor(tcb, parent = null, guard = null) {
        this.tcb = tcb;
        this.parent = parent;
        this.guard = guard;
    }
    /**
     * Constructs a `Scope` given either a `TmplAstTemplate` or a list of `TmplAstNode`s.
     *
     * @param tcb the overall context of TCB generation.
     * @param parentScope the `Scope` of the parent template (if any) or `null` if this is the root
     * `Scope`.
     * @param scopedNode Node that provides the scope around the child nodes (e.g. a
     * `TmplAstTemplate` node exposing variables to its children).
     * @param children Child nodes that should be appended to the TCB.
     * @param guard an expression that is applied to this scope for type narrowing purposes.
     */
    static forNodes(tcb, parentScope, scopedNode, children, guard) {
        const scope = new Scope(tcb, parentScope, guard);
        if (parentScope === null && tcb.env.config.enableTemplateTypeChecker) {
            // Add an autocompletion point for the component context.
            scope.opQueue.push(new TcbComponentContextCompletionOp(scope));
        }
        // If given an actual `TmplAstTemplate` instance, then process any additional information it
        // has.
        if (scopedNode instanceof Template) {
            // The template's variable declarations need to be added as `TcbVariableOp`s.
            const varMap = new Map();
            for (const v of scopedNode.variables) {
                // Validate that variables on the `TmplAstTemplate` are only declared once.
                if (!varMap.has(v.name)) {
                    varMap.set(v.name, v);
                }
                else {
                    const firstDecl = varMap.get(v.name);
                    tcb.oobRecorder.duplicateTemplateVar(tcb.id, v, firstDecl);
                }
                this.registerVariable(scope, v, new TcbTemplateVariableOp(tcb, scope, scopedNode, v));
            }
        }
        else if (scopedNode instanceof IfBlockBranch) {
            const { expression, expressionAlias } = scopedNode;
            if (expression !== null && expressionAlias !== null) {
                this.registerVariable(scope, expressionAlias, new TcbBlockVariableOp(tcb, scope, tcbExpression(expression, tcb, scope), expressionAlias));
            }
        }
        else if (scopedNode instanceof ForLoopBlock) {
            // Register the variable for the loop so it can be resolved by
            // children. It'll be declared once the loop is created.
            const loopInitializer = tcb.allocateId();
            addParseSpanInfo(loopInitializer, scopedNode.item.sourceSpan);
            scope.varMap.set(scopedNode.item, loopInitializer);
            for (const variable of scopedNode.contextVariables) {
                if (!this.forLoopContextVariableTypes.has(variable.value)) {
                    throw new Error(`Unrecognized for loop context variable ${variable.name}`);
                }
                const type = ts.factory.createKeywordTypeNode(this.forLoopContextVariableTypes.get(variable.value));
                this.registerVariable(scope, variable, new TcbBlockImplicitVariableOp(tcb, scope, type, variable));
            }
        }
        for (const node of children) {
            scope.appendNode(node);
        }
        // Once everything is registered, we need to check if there are `@let`
        // declarations that conflict with other local symbols defined after them.
        for (const variable of scope.varMap.keys()) {
            Scope.checkConflictingLet(scope, variable);
        }
        for (const ref of scope.referenceOpMap.keys()) {
            Scope.checkConflictingLet(scope, ref);
        }
        return scope;
    }
    /** Registers a local variable with a scope. */
    static registerVariable(scope, variable, op) {
        const opIndex = scope.opQueue.push(op) - 1;
        scope.varMap.set(variable, opIndex);
    }
    /**
     * Look up a `ts.Expression` representing the value of some operation in the current `Scope`,
     * including any parent scope(s). This method always returns a mutable clone of the
     * `ts.Expression` with the comments cleared.
     *
     * @param node a `TmplAstNode` of the operation in question. The lookup performed will depend on
     * the type of this node:
     *
     * Assuming `directive` is not present, then `resolve` will return:
     *
     * * `TmplAstElement` - retrieve the expression for the element DOM node
     * * `TmplAstTemplate` - retrieve the template context variable
     * * `TmplAstVariable` - retrieve a template let- variable
     * * `TmplAstLetDeclaration` - retrieve a template `@let` declaration
     * * `TmplAstReference` - retrieve variable created for the local ref
     *
     * @param directive if present, a directive type on a `TmplAstElement` or `TmplAstTemplate` to
     * look up instead of the default for an element or template node.
     */
    resolve(node, directive) {
        // Attempt to resolve the operation locally.
        const res = this.resolveLocal(node, directive);
        if (res !== null) {
            // We want to get a clone of the resolved expression and clear the trailing comments
            // so they don't continue to appear in every place the expression is used.
            // As an example, this would otherwise produce:
            // var _t1 /**T:DIR*/ /*1,2*/ = _ctor1();
            // _t1 /**T:DIR*/ /*1,2*/.input = 'value';
            //
            // In addition, returning a clone prevents the consumer of `Scope#resolve` from
            // attaching comments at the declaration site.
            let clone;
            if (ts.isIdentifier(res)) {
                clone = ts.factory.createIdentifier(res.text);
            }
            else if (ts.isNonNullExpression(res)) {
                clone = ts.factory.createNonNullExpression(res.expression);
            }
            else {
                throw new Error(`Could not resolve ${node} to an Identifier or a NonNullExpression`);
            }
            ts.setOriginalNode(clone, res);
            clone.parent = clone.parent;
            return ts.setSyntheticTrailingComments(clone, []);
        }
        else if (this.parent !== null) {
            // Check with the parent.
            return this.parent.resolve(node, directive);
        }
        else {
            throw new Error(`Could not resolve ${node} / ${directive}`);
        }
    }
    /**
     * Add a statement to this scope.
     */
    addStatement(stmt) {
        this.statements.push(stmt);
    }
    /**
     * Get the statements.
     */
    render() {
        for (let i = 0; i < this.opQueue.length; i++) {
            // Optional statements cannot be skipped when we are generating the TCB for use
            // by the TemplateTypeChecker.
            const skipOptional = !this.tcb.env.config.enableTemplateTypeChecker;
            this.executeOp(i, skipOptional);
        }
        return this.statements;
    }
    /**
     * Returns an expression of all template guards that apply to this scope, including those of
     * parent scopes. If no guards have been applied, null is returned.
     */
    guards() {
        let parentGuards = null;
        if (this.parent !== null) {
            // Start with the guards from the parent scope, if present.
            parentGuards = this.parent.guards();
        }
        if (this.guard === null) {
            // This scope does not have a guard, so return the parent's guards as is.
            return parentGuards;
        }
        else if (parentGuards === null) {
            // There's no guards from the parent scope, so this scope's guard represents all available
            // guards.
            return this.guard;
        }
        else {
            // Both the parent scope and this scope provide a guard, so create a combination of the two.
            // It is important that the parent guard is used as left operand, given that it may provide
            // narrowing that is required for this scope's guard to be valid.
            return ts.factory.createBinaryExpression(parentGuards, ts.SyntaxKind.AmpersandAmpersandToken, this.guard);
        }
    }
    /** Returns whether a template symbol is defined locally within the current scope. */
    isLocal(node) {
        if (node instanceof Variable) {
            return this.varMap.has(node);
        }
        if (node instanceof LetDeclaration$1) {
            return this.letDeclOpMap.has(node.name);
        }
        return this.referenceOpMap.has(node);
    }
    resolveLocal(ref, directive) {
        if (ref instanceof Reference$1 && this.referenceOpMap.has(ref)) {
            return this.resolveOp(this.referenceOpMap.get(ref));
        }
        else if (ref instanceof LetDeclaration$1 && this.letDeclOpMap.has(ref.name)) {
            return this.resolveOp(this.letDeclOpMap.get(ref.name).opIndex);
        }
        else if (ref instanceof Variable && this.varMap.has(ref)) {
            // Resolving a context variable for this template.
            // Execute the `TcbVariableOp` associated with the `TmplAstVariable`.
            const opIndexOrNode = this.varMap.get(ref);
            return typeof opIndexOrNode === 'number' ? this.resolveOp(opIndexOrNode) : opIndexOrNode;
        }
        else if (ref instanceof Template &&
            directive === undefined &&
            this.templateCtxOpMap.has(ref)) {
            // Resolving the context of the given sub-template.
            // Execute the `TcbTemplateContextOp` for the template.
            return this.resolveOp(this.templateCtxOpMap.get(ref));
        }
        else if ((ref instanceof Element$1 || ref instanceof Template) &&
            directive !== undefined &&
            this.directiveOpMap.has(ref)) {
            // Resolving a directive on an element or sub-template.
            const dirMap = this.directiveOpMap.get(ref);
            if (dirMap.has(directive)) {
                return this.resolveOp(dirMap.get(directive));
            }
            else {
                return null;
            }
        }
        else if (ref instanceof Element$1 && this.elementOpMap.has(ref)) {
            // Resolving the DOM node of an element in this template.
            return this.resolveOp(this.elementOpMap.get(ref));
        }
        else {
            return null;
        }
    }
    /**
     * Like `executeOp`, but assert that the operation actually returned `ts.Expression`.
     */
    resolveOp(opIndex) {
        const res = this.executeOp(opIndex, /* skipOptional */ false);
        if (res === null) {
            throw new Error(`Error resolving operation, got null`);
        }
        return res;
    }
    /**
     * Execute a particular `TcbOp` in the `opQueue`.
     *
     * This method replaces the operation in the `opQueue` with the result of execution (once done)
     * and also protects against a circular dependency from the operation to itself by temporarily
     * setting the operation's result to a special expression.
     */
    executeOp(opIndex, skipOptional) {
        const op = this.opQueue[opIndex];
        if (!(op instanceof TcbOp)) {
            return op;
        }
        if (skipOptional && op.optional) {
            return null;
        }
        // Set the result of the operation in the queue to its circular fallback. If executing this
        // operation results in a circular dependency, this will prevent an infinite loop and allow for
        // the resolution of such cycles.
        this.opQueue[opIndex] = op.circularFallback();
        const res = op.execute();
        // Once the operation has finished executing, it's safe to cache the real result.
        this.opQueue[opIndex] = res;
        return res;
    }
    appendNode(node) {
        if (node instanceof Element$1) {
            const opIndex = this.opQueue.push(new TcbElementOp(this.tcb, this, node)) - 1;
            this.elementOpMap.set(node, opIndex);
            if (this.tcb.env.config.controlFlowPreventingContentProjection !== 'suppress') {
                this.appendContentProjectionCheckOp(node);
            }
            this.appendDirectivesAndInputsOfNode(node);
            this.appendOutputsOfNode(node);
            this.appendChildren(node);
            this.checkAndAppendReferencesOfNode(node);
        }
        else if (node instanceof Template) {
            // Template children are rendered in a child scope.
            this.appendDirectivesAndInputsOfNode(node);
            this.appendOutputsOfNode(node);
            const ctxIndex = this.opQueue.push(new TcbTemplateContextOp(this.tcb, this)) - 1;
            this.templateCtxOpMap.set(node, ctxIndex);
            if (this.tcb.env.config.checkTemplateBodies) {
                this.opQueue.push(new TcbTemplateBodyOp(this.tcb, this, node));
            }
            else if (this.tcb.env.config.alwaysCheckSchemaInTemplateBodies) {
                this.appendDeepSchemaChecks(node.children);
            }
            this.checkAndAppendReferencesOfNode(node);
        }
        else if (node instanceof DeferredBlock) {
            this.appendDeferredBlock(node);
        }
        else if (node instanceof IfBlock) {
            this.opQueue.push(new TcbIfOp(this.tcb, this, node));
        }
        else if (node instanceof SwitchBlock) {
            this.opQueue.push(new TcbSwitchOp(this.tcb, this, node));
        }
        else if (node instanceof ForLoopBlock) {
            this.opQueue.push(new TcbForOfOp(this.tcb, this, node));
            node.empty && this.tcb.env.config.checkControlFlowBodies && this.appendChildren(node.empty);
        }
        else if (node instanceof BoundText) {
            this.opQueue.push(new TcbExpressionOp(this.tcb, this, node.value));
        }
        else if (node instanceof Icu$1) {
            this.appendIcuExpressions(node);
        }
        else if (node instanceof Content) {
            this.appendChildren(node);
        }
        else if (node instanceof LetDeclaration$1) {
            const opIndex = this.opQueue.push(new TcbLetDeclarationOp(this.tcb, this, node)) - 1;
            if (this.isLocal(node)) {
                this.tcb.oobRecorder.conflictingDeclaration(this.tcb.id, node);
            }
            else {
                this.letDeclOpMap.set(node.name, { opIndex, node });
            }
        }
    }
    appendChildren(node) {
        for (const child of node.children) {
            this.appendNode(child);
        }
    }
    checkAndAppendReferencesOfNode(node) {
        for (const ref of node.references) {
            const target = this.tcb.boundTarget.getReferenceTarget(ref);
            let ctxIndex;
            if (target === null) {
                // The reference is invalid if it doesn't have a target, so report it as an error.
                this.tcb.oobRecorder.missingReferenceTarget(this.tcb.id, ref);
                // Any usages of the invalid reference will be resolved to a variable of type any.
                ctxIndex = this.opQueue.push(new TcbInvalidReferenceOp(this.tcb, this)) - 1;
            }
            else if (target instanceof Template || target instanceof Element$1) {
                ctxIndex = this.opQueue.push(new TcbReferenceOp(this.tcb, this, ref, node, target)) - 1;
            }
            else {
                ctxIndex =
                    this.opQueue.push(new TcbReferenceOp(this.tcb, this, ref, node, target.directive)) - 1;
            }
            this.referenceOpMap.set(ref, ctxIndex);
        }
    }
    appendDirectivesAndInputsOfNode(node) {
        // Collect all the inputs on the element.
        const claimedInputs = new Set();
        const directives = this.tcb.boundTarget.getDirectivesOfNode(node);
        if (directives === null || directives.length === 0) {
            // If there are no directives, then all inputs are unclaimed inputs, so queue an operation
            // to add them if needed.
            if (node instanceof Element$1) {
                this.opQueue.push(new TcbUnclaimedInputsOp(this.tcb, this, node, claimedInputs));
                this.opQueue.push(new TcbDomSchemaCheckerOp(this.tcb, node, /* checkElement */ true, claimedInputs));
            }
            return;
        }
        else {
            if (node instanceof Element$1) {
                const isDeferred = this.tcb.boundTarget.isDeferred(node);
                if (!isDeferred && directives.some((dirMeta) => dirMeta.isExplicitlyDeferred)) {
                    // This node has directives/components that were defer-loaded (included into
                    // `@Component.deferredImports`), but the node itself was used outside of a
                    // `@defer` block, which is the error.
                    this.tcb.oobRecorder.deferredComponentUsedEagerly(this.tcb.id, node);
                }
            }
        }
        const dirMap = new Map();
        for (const dir of directives) {
            let directiveOp;
            const host = this.tcb.env.reflector;
            const dirRef = dir.ref;
            if (!dir.isGeneric) {
                // The most common case is that when a directive is not generic, we use the normal
                // `TcbNonDirectiveTypeOp`.
                directiveOp = new TcbNonGenericDirectiveTypeOp(this.tcb, this, node, dir);
            }
            else if (!requiresInlineTypeCtor(dirRef.node, host, this.tcb.env) ||
                this.tcb.env.config.useInlineTypeConstructors) {
                // For generic directives, we use a type constructor to infer types. If a directive requires
                // an inline type constructor, then inlining must be available to use the
                // `TcbDirectiveCtorOp`. If not we, we fallback to using `any` – see below.
                directiveOp = new TcbDirectiveCtorOp(this.tcb, this, node, dir);
            }
            else {
                // If inlining is not available, then we give up on inferring the generic params, and use
                // `any` type for the directive's generic parameters.
                directiveOp = new TcbGenericDirectiveTypeWithAnyParamsOp(this.tcb, this, node, dir);
            }
            const dirIndex = this.opQueue.push(directiveOp) - 1;
            dirMap.set(dir, dirIndex);
            this.opQueue.push(new TcbDirectiveInputsOp(this.tcb, this, node, dir));
        }
        this.directiveOpMap.set(node, dirMap);
        // After expanding the directives, we might need to queue an operation to check any unclaimed
        // inputs.
        if (node instanceof Element$1) {
            // Go through the directives and remove any inputs that it claims from `elementInputs`.
            for (const dir of directives) {
                for (const propertyName of dir.inputs.propertyNames) {
                    claimedInputs.add(propertyName);
                }
            }
            this.opQueue.push(new TcbUnclaimedInputsOp(this.tcb, this, node, claimedInputs));
            // If there are no directives which match this element, then it's a "plain" DOM element (or a
            // web component), and should be checked against the DOM schema. If any directives match,
            // we must assume that the element could be custom (either a component, or a directive like
            // <router-outlet>) and shouldn't validate the element name itself.
            const checkElement = directives.length === 0;
            this.opQueue.push(new TcbDomSchemaCheckerOp(this.tcb, node, checkElement, claimedInputs));
        }
    }
    appendOutputsOfNode(node) {
        // Collect all the outputs on the element.
        const claimedOutputs = new Set();
        const directives = this.tcb.boundTarget.getDirectivesOfNode(node);
        if (directives === null || directives.length === 0) {
            // If there are no directives, then all outputs are unclaimed outputs, so queue an operation
            // to add them if needed.
            if (node instanceof Element$1) {
                this.opQueue.push(new TcbUnclaimedOutputsOp(this.tcb, this, node, claimedOutputs));
            }
            return;
        }
        // Queue operations for all directives to check the relevant outputs for a directive.
        for (const dir of directives) {
            this.opQueue.push(new TcbDirectiveOutputsOp(this.tcb, this, node, dir));
        }
        // After expanding the directives, we might need to queue an operation to check any unclaimed
        // outputs.
        if (node instanceof Element$1) {
            // Go through the directives and register any outputs that it claims in `claimedOutputs`.
            for (const dir of directives) {
                for (const outputProperty of dir.outputs.propertyNames) {
                    claimedOutputs.add(outputProperty);
                }
            }
            this.opQueue.push(new TcbUnclaimedOutputsOp(this.tcb, this, node, claimedOutputs));
        }
    }
    appendDeepSchemaChecks(nodes) {
        for (const node of nodes) {
            if (!(node instanceof Element$1 || node instanceof Template)) {
                continue;
            }
            if (node instanceof Element$1) {
                const claimedInputs = new Set();
                const directives = this.tcb.boundTarget.getDirectivesOfNode(node);
                let hasDirectives;
                if (directives === null || directives.length === 0) {
                    hasDirectives = false;
                }
                else {
                    hasDirectives = true;
                    for (const dir of directives) {
                        for (const propertyName of dir.inputs.propertyNames) {
                            claimedInputs.add(propertyName);
                        }
                    }
                }
                this.opQueue.push(new TcbDomSchemaCheckerOp(this.tcb, node, !hasDirectives, claimedInputs));
            }
            this.appendDeepSchemaChecks(node.children);
        }
    }
    appendIcuExpressions(node) {
        for (const variable of Object.values(node.vars)) {
            this.opQueue.push(new TcbExpressionOp(this.tcb, this, variable.value));
        }
        for (const placeholder of Object.values(node.placeholders)) {
            if (placeholder instanceof BoundText) {
                this.opQueue.push(new TcbExpressionOp(this.tcb, this, placeholder.value));
            }
        }
    }
    appendContentProjectionCheckOp(root) {
        const meta = this.tcb.boundTarget.getDirectivesOfNode(root)?.find((meta) => meta.isComponent) || null;
        if (meta !== null && meta.ngContentSelectors !== null && meta.ngContentSelectors.length > 0) {
            const selectors = meta.ngContentSelectors;
            // We don't need to generate anything for components that don't have projection
            // slots, or they only have one catch-all slot (represented by `*`).
            if (selectors.length > 1 || (selectors.length === 1 && selectors[0] !== '*')) {
                this.opQueue.push(new TcbControlFlowContentProjectionOp(this.tcb, root, selectors, meta.name));
            }
        }
    }
    appendDeferredBlock(block) {
        this.appendDeferredTriggers(block, block.triggers);
        this.appendDeferredTriggers(block, block.prefetchTriggers);
        // Only the `when` hydration trigger needs to be checked.
        if (block.hydrateTriggers.when) {
            this.opQueue.push(new TcbExpressionOp(this.tcb, this, block.hydrateTriggers.when.value));
        }
        this.appendChildren(block);
        if (block.placeholder !== null) {
            this.appendChildren(block.placeholder);
        }
        if (block.loading !== null) {
            this.appendChildren(block.loading);
        }
        if (block.error !== null) {
            this.appendChildren(block.error);
        }
    }
    appendDeferredTriggers(block, triggers) {
        if (triggers.when !== undefined) {
            this.opQueue.push(new TcbExpressionOp(this.tcb, this, triggers.when.value));
        }
        if (triggers.hover !== undefined) {
            this.appendReferenceBasedDeferredTrigger(block, triggers.hover);
        }
        if (triggers.interaction !== undefined) {
            this.appendReferenceBasedDeferredTrigger(block, triggers.interaction);
        }
        if (triggers.viewport !== undefined) {
            this.appendReferenceBasedDeferredTrigger(block, triggers.viewport);
        }
    }
    appendReferenceBasedDeferredTrigger(block, trigger) {
        if (this.tcb.boundTarget.getDeferredTriggerTarget(block, trigger) === null) {
            this.tcb.oobRecorder.inaccessibleDeferredTriggerElement(this.tcb.id, trigger);
        }
    }
    /** Reports a diagnostic if there are any `@let` declarations that conflict with a node. */
    static checkConflictingLet(scope, node) {
        if (scope.letDeclOpMap.has(node.name)) {
            scope.tcb.oobRecorder.conflictingDeclaration(scope.tcb.id, scope.letDeclOpMap.get(node.name).node);
        }
    }
}
/**
 * Create the `this` parameter to the top-level TCB function, with the given generic type
 * arguments.
 */
function tcbThisParam(name, typeArguments) {
    return ts.factory.createParameterDeclaration(
    /* modifiers */ undefined, 
    /* dotDotDotToken */ undefined, 
    /* name */ 'this', 
    /* questionToken */ undefined, 
    /* type */ ts.factory.createTypeReferenceNode(name, typeArguments), 
    /* initializer */ undefined);
}
/**
 * Process an `AST` expression and convert it into a `ts.Expression`, generating references to the
 * correct identifiers in the current scope.
 */
function tcbExpression(ast, tcb, scope) {
    const translator = new TcbExpressionTranslator(tcb, scope);
    return translator.translate(ast);
}
class TcbExpressionTranslator {
    tcb;
    scope;
    constructor(tcb, scope) {
        this.tcb = tcb;
        this.scope = scope;
    }
    translate(ast) {
        // `astToTypescript` actually does the conversion. A special resolver `tcbResolve` is passed
        // which interprets specific expression nodes that interact with the `ImplicitReceiver`. These
        // nodes actually refer to identifiers within the current scope.
        return astToTypescript(ast, (ast) => this.resolve(ast), this.tcb.env.config);
    }
    /**
     * Resolve an `AST` expression within the given scope.
     *
     * Some `AST` expressions refer to top-level concepts (references, variables, the component
     * context). This method assists in resolving those.
     */
    resolve(ast) {
        if (ast instanceof PropertyRead &&
            ast.receiver instanceof ImplicitReceiver &&
            !(ast.receiver instanceof ThisReceiver)) {
            // Try to resolve a bound target for this expression. If no such target is available, then
            // the expression is referencing the top-level component context. In that case, `null` is
            // returned here to let it fall through resolution so it will be caught when the
            // `ImplicitReceiver` is resolved in the branch below.
            const target = this.tcb.boundTarget.getExpressionTarget(ast);
            const targetExpression = target === null ? null : this.getTargetNodeExpression(target, ast);
            if (target instanceof LetDeclaration$1 &&
                !this.isValidLetDeclarationAccess(target, ast)) {
                this.tcb.oobRecorder.letUsedBeforeDefinition(this.tcb.id, ast, target);
                // Cast the expression to `any` so we don't produce additional diagnostics.
                // We don't use `markIgnoreForDiagnostics` here, because it won't prevent duplicate
                // diagnostics for nested accesses in cases like `@let value = value.foo.bar.baz`.
                if (targetExpression !== null) {
                    return ts.factory.createAsExpression(targetExpression, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
                }
            }
            return targetExpression;
        }
        else if (ast instanceof PropertyWrite && ast.receiver instanceof ImplicitReceiver) {
            const target = this.tcb.boundTarget.getExpressionTarget(ast);
            if (target === null) {
                return null;
            }
            const targetExpression = this.getTargetNodeExpression(target, ast);
            const expr = this.translate(ast.value);
            const result = ts.factory.createParenthesizedExpression(ts.factory.createBinaryExpression(targetExpression, ts.SyntaxKind.EqualsToken, expr));
            addParseSpanInfo(result, ast.sourceSpan);
            // Ignore diagnostics from TS produced for writes to `@let` and re-report them using
            // our own infrastructure. We can't rely on the TS reporting, because it includes
            // the name of the auto-generated TCB variable name.
            if (target instanceof LetDeclaration$1) {
                markIgnoreDiagnostics(result);
                this.tcb.oobRecorder.illegalWriteToLetDeclaration(this.tcb.id, ast, target);
            }
            return result;
        }
        else if (ast instanceof ImplicitReceiver) {
            // AST instances representing variables and references look very similar to property reads
            // or method calls from the component context: both have the shape
            // PropertyRead(ImplicitReceiver, 'propName') or Call(ImplicitReceiver, 'methodName').
            //
            // `translate` will first try to `resolve` the outer PropertyRead/Call. If this works,
            // it's because the `BoundTarget` found an expression target for the whole expression, and
            // therefore `translate` will never attempt to `resolve` the ImplicitReceiver of that
            // PropertyRead/Call.
            //
            // Therefore if `resolve` is called on an `ImplicitReceiver`, it's because no outer
            // PropertyRead/Call resolved to a variable or reference, and therefore this is a
            // property read or method call on the component context itself.
            return ts.factory.createThis();
        }
        else if (ast instanceof BindingPipe) {
            const expr = this.translate(ast.exp);
            const pipeMeta = this.tcb.getPipeByName(ast.name);
            let pipe;
            if (pipeMeta === null) {
                // No pipe by that name exists in scope. Record this as an error.
                this.tcb.oobRecorder.missingPipe(this.tcb.id, ast);
                // Use an 'any' value to at least allow the rest of the expression to be checked.
                pipe = ANY_EXPRESSION;
            }
            else if (pipeMeta.isExplicitlyDeferred &&
                this.tcb.boundTarget.getEagerlyUsedPipes().includes(ast.name)) {
                // This pipe was defer-loaded (included into `@Component.deferredImports`),
                // but was used outside of a `@defer` block, which is the error.
                this.tcb.oobRecorder.deferredPipeUsedEagerly(this.tcb.id, ast);
                // Use an 'any' value to at least allow the rest of the expression to be checked.
                pipe = ANY_EXPRESSION;
            }
            else {
                // Use a variable declared as the pipe's type.
                pipe = this.tcb.env.pipeInst(pipeMeta.ref);
            }
            const args = ast.args.map((arg) => this.translate(arg));
            let methodAccess = ts.factory.createPropertyAccessExpression(pipe, 'transform');
            addParseSpanInfo(methodAccess, ast.nameSpan);
            if (!this.tcb.env.config.checkTypeOfPipes) {
                methodAccess = ts.factory.createAsExpression(methodAccess, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
            }
            const result = ts.factory.createCallExpression(
            /* expression */ methodAccess, 
            /* typeArguments */ undefined, 
            /* argumentsArray */ [expr, ...args]);
            addParseSpanInfo(result, ast.sourceSpan);
            return result;
        }
        else if ((ast instanceof Call || ast instanceof SafeCall) &&
            (ast.receiver instanceof PropertyRead || ast.receiver instanceof SafePropertyRead)) {
            // Resolve the special `$any(expr)` syntax to insert a cast of the argument to type `any`.
            // `$any(expr)` -> `expr as any`
            if (ast.receiver.receiver instanceof ImplicitReceiver &&
                !(ast.receiver.receiver instanceof ThisReceiver) &&
                ast.receiver.name === '$any' &&
                ast.args.length === 1) {
                const expr = this.translate(ast.args[0]);
                const exprAsAny = ts.factory.createAsExpression(expr, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
                const result = ts.factory.createParenthesizedExpression(exprAsAny);
                addParseSpanInfo(result, ast.sourceSpan);
                return result;
            }
            // Attempt to resolve a bound target for the method, and generate the method call if a target
            // could be resolved. If no target is available, then the method is referencing the top-level
            // component context, in which case `null` is returned to let the `ImplicitReceiver` being
            // resolved to the component context.
            const target = this.tcb.boundTarget.getExpressionTarget(ast);
            if (target === null) {
                return null;
            }
            const receiver = this.getTargetNodeExpression(target, ast);
            const method = wrapForDiagnostics(receiver);
            addParseSpanInfo(method, ast.receiver.nameSpan);
            const args = ast.args.map((arg) => this.translate(arg));
            const node = ts.factory.createCallExpression(method, undefined, args);
            addParseSpanInfo(node, ast.sourceSpan);
            return node;
        }
        else {
            // This AST isn't special after all.
            return null;
        }
    }
    getTargetNodeExpression(targetNode, expressionNode) {
        const expr = this.scope.resolve(targetNode);
        addParseSpanInfo(expr, expressionNode.sourceSpan);
        return expr;
    }
    isValidLetDeclarationAccess(target, ast) {
        const targetStart = target.sourceSpan.start.offset;
        const targetEnd = target.sourceSpan.end.offset;
        const astStart = ast.sourceSpan.start;
        // We only flag local references that occur before the declaration, because embedded views
        // are updated before the child views. In practice this means that something like
        // `<ng-template [ngIf]="true">{{value}}</ng-template> @let value = 1;` is valid.
        return (targetStart < astStart && astStart > targetEnd) || !this.scope.isLocal(target);
    }
}
/**
 * Call the type constructor of a directive instance on a given template node, inferring a type for
 * the directive instance from any bound inputs.
 */
function tcbCallTypeCtor(dir, tcb, inputs) {
    const typeCtor = tcb.env.typeCtorFor(dir);
    // Construct an array of `ts.PropertyAssignment`s for each of the directive's inputs.
    const members = inputs.map((input) => {
        const propertyName = ts.factory.createStringLiteral(input.field);
        if (input.type === 'binding') {
            // For bound inputs, the property is assigned the binding expression.
            let expr = widenBinding(input.expression, tcb);
            if (input.isTwoWayBinding && tcb.env.config.allowSignalsInTwoWayBindings) {
                expr = unwrapWritableSignal(expr, tcb);
            }
            const assignment = ts.factory.createPropertyAssignment(propertyName, wrapForDiagnostics(expr));
            addParseSpanInfo(assignment, input.sourceSpan);
            return assignment;
        }
        else {
            // A type constructor is required to be called with all input properties, so any unset
            // inputs are simply assigned a value of type `any` to ignore them.
            return ts.factory.createPropertyAssignment(propertyName, ANY_EXPRESSION);
        }
    });
    // Call the `ngTypeCtor` method on the directive class, with an object literal argument created
    // from the matched inputs.
    return ts.factory.createCallExpression(
    /* expression */ typeCtor, 
    /* typeArguments */ undefined, 
    /* argumentsArray */ [ts.factory.createObjectLiteralExpression(members)]);
}
function getBoundAttributes(directive, node) {
    const boundInputs = [];
    const processAttribute = (attr) => {
        // Skip non-property bindings.
        if (attr instanceof BoundAttribute &&
            attr.type !== exports.BindingType.Property &&
            attr.type !== exports.BindingType.TwoWay) {
            return;
        }
        // Skip the attribute if the directive does not have an input for it.
        const inputs = directive.inputs.getByBindingPropertyName(attr.name);
        if (inputs !== null) {
            boundInputs.push({
                attribute: attr,
                inputs: inputs.map((input) => {
                    return {
                        fieldName: input.classPropertyName,
                        required: input.required,
                        transformType: input.transform?.type || null,
                        isSignal: input.isSignal,
                        isTwoWayBinding: attr instanceof BoundAttribute && attr.type === exports.BindingType.TwoWay,
                    };
                }),
            });
        }
    };
    node.inputs.forEach(processAttribute);
    node.attributes.forEach(processAttribute);
    if (node instanceof Template) {
        node.templateAttrs.forEach(processAttribute);
    }
    return boundInputs;
}
/**
 * Translates the given attribute binding to a `ts.Expression`.
 */
function translateInput(attr, tcb, scope) {
    if (attr instanceof BoundAttribute) {
        // Produce an expression representing the value of the binding.
        return tcbExpression(attr.value, tcb, scope);
    }
    else {
        // For regular attributes with a static string value, use the represented string literal.
        return ts.factory.createStringLiteral(attr.value);
    }
}
/**
 * Potentially widens the type of `expr` according to the type-checking configuration.
 */
function widenBinding(expr, tcb) {
    if (!tcb.env.config.checkTypeOfInputBindings) {
        // If checking the type of bindings is disabled, cast the resulting expression to 'any'
        // before the assignment.
        return tsCastToAny(expr);
    }
    else if (!tcb.env.config.strictNullInputBindings) {
        if (ts.isObjectLiteralExpression(expr) || ts.isArrayLiteralExpression(expr)) {
            // Object literals and array literals should not be wrapped in non-null assertions as that
            // would cause literals to be prematurely widened, resulting in type errors when assigning
            // into a literal type.
            return expr;
        }
        else {
            // If strict null checks are disabled, erase `null` and `undefined` from the type by
            // wrapping the expression in a non-null assertion.
            return ts.factory.createNonNullExpression(expr);
        }
    }
    else {
        // No widening is requested, use the expression as is.
        return expr;
    }
}
/**
 * Wraps an expression in an `unwrapSignal` call which extracts the signal's value.
 */
function unwrapWritableSignal(expression, tcb) {
    const unwrapRef = tcb.env.referenceExternalSymbol(Identifiers.unwrapWritableSignal.moduleName, Identifiers.unwrapWritableSignal.name);
    return ts.factory.createCallExpression(unwrapRef, undefined, [expression]);
}
const EVENT_PARAMETER = '$event';
/**
 * Creates an arrow function to be used as handler function for event bindings. The handler
 * function has a single parameter `$event` and the bound event's handler `AST` represented as a
 * TypeScript expression as its body.
 *
 * When `eventType` is set to `Infer`, the `$event` parameter will not have an explicit type. This
 * allows for the created handler function to have its `$event` parameter's type inferred based on
 * how it's used, to enable strict type checking of event bindings. When set to `Any`, the `$event`
 * parameter will have an explicit `any` type, effectively disabling strict type checking of event
 * bindings. Alternatively, an explicit type can be passed for the `$event` parameter.
 */
function tcbCreateEventHandler(event, tcb, scope, eventType) {
    const handler = tcbEventHandlerExpression(event.handler, tcb, scope);
    const statements = [];
    // TODO(crisbeto): remove the `checkTwoWayBoundEvents` check in v20.
    if (event.type === exports.ParsedEventType.TwoWay && tcb.env.config.checkTwoWayBoundEvents) {
        // If we're dealing with a two-way event, we create a variable initialized to the unwrapped
        // signal value of the expression and then we assign `$event` to it. Note that in most cases
        // this will already be covered by the corresponding input binding, however it allows us to
        // handle the case where the input has a wider type than the output (see #58971).
        const target = tcb.allocateId();
        const assignment = ts.factory.createBinaryExpression(target, ts.SyntaxKind.EqualsToken, ts.factory.createIdentifier(EVENT_PARAMETER));
        statements.push(tsCreateVariable(target, tcb.env.config.allowSignalsInTwoWayBindings ? unwrapWritableSignal(handler, tcb) : handler), ts.factory.createExpressionStatement(assignment));
    }
    else {
        statements.push(ts.factory.createExpressionStatement(handler));
    }
    let eventParamType;
    if (eventType === 0 /* EventParamType.Infer */) {
        eventParamType = undefined;
    }
    else if (eventType === 1 /* EventParamType.Any */) {
        eventParamType = ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
    }
    else {
        eventParamType = eventType;
    }
    // Obtain all guards that have been applied to the scope and its parents, as they have to be
    // repeated within the handler function for their narrowing to be in effect within the handler.
    const guards = scope.guards();
    let body = ts.factory.createBlock(statements);
    if (guards !== null) {
        // Wrap the body in an `if` statement containing all guards that have to be applied.
        body = ts.factory.createBlock([ts.factory.createIfStatement(guards, body)]);
    }
    const eventParam = ts.factory.createParameterDeclaration(
    /* modifiers */ undefined, 
    /* dotDotDotToken */ undefined, 
    /* name */ EVENT_PARAMETER, 
    /* questionToken */ undefined, 
    /* type */ eventParamType);
    addExpressionIdentifier(eventParam, ExpressionIdentifier.EVENT_PARAMETER);
    // Return an arrow function instead of a function expression to preserve the `this` context.
    return ts.factory.createArrowFunction(
    /* modifiers */ undefined, 
    /* typeParameters */ undefined, 
    /* parameters */ [eventParam], 
    /* type */ ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), 
    /* equalsGreaterThanToken */ undefined, 
    /* body */ body);
}
/**
 * Similar to `tcbExpression`, this function converts the provided `AST` expression into a
 * `ts.Expression`, with special handling of the `$event` variable that can be used within event
 * bindings.
 */
function tcbEventHandlerExpression(ast, tcb, scope) {
    const translator = new TcbEventHandlerTranslator(tcb, scope);
    return translator.translate(ast);
}
function checkSplitTwoWayBinding(inputName, output, inputs, tcb) {
    const input = inputs.find((input) => input.name === inputName);
    if (input === undefined || input.sourceSpan !== output.sourceSpan) {
        return false;
    }
    // Input consumer should be a directive because it's claimed
    const inputConsumer = tcb.boundTarget.getConsumerOfBinding(input);
    const outputConsumer = tcb.boundTarget.getConsumerOfBinding(output);
    if (outputConsumer === null ||
        inputConsumer.ref === undefined ||
        outputConsumer instanceof Template) {
        return false;
    }
    if (outputConsumer instanceof Element$1) {
        tcb.oobRecorder.splitTwoWayBinding(tcb.id, input, output, inputConsumer.ref.node, outputConsumer);
        return true;
    }
    else if (outputConsumer.ref !== inputConsumer.ref) {
        tcb.oobRecorder.splitTwoWayBinding(tcb.id, input, output, inputConsumer.ref.node, outputConsumer.ref.node);
        return true;
    }
    return false;
}
class TcbEventHandlerTranslator extends TcbExpressionTranslator {
    resolve(ast) {
        // Recognize a property read on the implicit receiver corresponding with the event parameter
        // that is available in event bindings. Since this variable is a parameter of the handler
        // function that the converted expression becomes a child of, just create a reference to the
        // parameter by its name.
        if (ast instanceof PropertyRead &&
            ast.receiver instanceof ImplicitReceiver &&
            !(ast.receiver instanceof ThisReceiver) &&
            ast.name === EVENT_PARAMETER) {
            const event = ts.factory.createIdentifier(EVENT_PARAMETER);
            addParseSpanInfo(event, ast.nameSpan);
            return event;
        }
        return super.resolve(ast);
    }
    isValidLetDeclarationAccess() {
        // Event listeners are allowed to read `@let` declarations before
        // they're declared since the callback won't be executed immediately.
        return true;
    }
}
class TcbForLoopTrackTranslator extends TcbExpressionTranslator {
    block;
    allowedVariables;
    constructor(tcb, scope, block) {
        super(tcb, scope);
        this.block = block;
        // Tracking expressions are only allowed to read the `$index`,
        // the item and properties off the component instance.
        this.allowedVariables = new Set([block.item]);
        for (const variable of block.contextVariables) {
            if (variable.value === '$index') {
                this.allowedVariables.add(variable);
            }
        }
    }
    resolve(ast) {
        if (ast instanceof PropertyRead && ast.receiver instanceof ImplicitReceiver) {
            const target = this.tcb.boundTarget.getExpressionTarget(ast);
            if (target !== null &&
                (!(target instanceof Variable) || !this.allowedVariables.has(target))) {
                this.tcb.oobRecorder.illegalForLoopTrackAccess(this.tcb.id, this.block, ast);
            }
        }
        return super.resolve(ast);
    }
}

/**
 * An `Environment` representing the single type-checking file into which most (if not all) Type
 * Check Blocks (TCBs) will be generated.
 *
 * The `TypeCheckFile` hosts multiple TCBs and allows the sharing of declarations (e.g. type
 * constructors) between them. Rather than return such declarations via `getPreludeStatements()`, it
 * hoists them to the top of the generated `ts.SourceFile`.
 */
class TypeCheckFile extends Environment {
    fileName;
    nextTcbId = 1;
    tcbStatements = [];
    constructor(fileName, config, refEmitter, reflector, compilerHost) {
        super(config, new ImportManager({
            // This minimizes noticeable changes with older versions of `ImportManager`.
            forceGenerateNamespacesForNewImports: true,
            // Type check block code affects code completion and fix suggestions.
            // We want to encourage single quotes for now, like we always did.
            shouldUseSingleQuotes: () => true,
        }), refEmitter, reflector, ts.createSourceFile(compilerHost.getCanonicalFileName(fileName), '', ts.ScriptTarget.Latest, true));
        this.fileName = fileName;
    }
    addTypeCheckBlock(ref, meta, domSchemaChecker, oobRecorder, genericContextBehavior) {
        const fnId = ts.factory.createIdentifier(`_tcb${this.nextTcbId++}`);
        const fn = generateTypeCheckBlock(this, ref, fnId, meta, domSchemaChecker, oobRecorder, genericContextBehavior);
        this.tcbStatements.push(fn);
    }
    render(removeComments) {
        // NOTE: We are conditionally adding imports whenever we discover signal inputs. This has a
        // risk of changing the import graph of the TypeScript program, degrading incremental program
        // re-use due to program structure changes. For type check block files, we are ensuring an
        // import to e.g. `@angular/core` always exists to guarantee a stable graph.
        ensureTypeCheckFilePreparationImports(this);
        const importChanges = this.importManager.finalize();
        if (importChanges.updatedImports.size > 0) {
            throw new Error('AssertionError: Expected no imports to be updated for a new type check file.');
        }
        const printer = ts.createPrinter({ removeComments });
        let source = '';
        const newImports = importChanges.newImports.get(this.contextFile.fileName);
        if (newImports !== undefined) {
            source += newImports
                .map((i) => printer.printNode(ts.EmitHint.Unspecified, i, this.contextFile))
                .join('\n');
        }
        source += '\n';
        for (const stmt of this.pipeInstStatements) {
            source += printer.printNode(ts.EmitHint.Unspecified, stmt, this.contextFile) + '\n';
        }
        for (const stmt of this.typeCtorStatements) {
            source += printer.printNode(ts.EmitHint.Unspecified, stmt, this.contextFile) + '\n';
        }
        source += '\n';
        for (const stmt of this.tcbStatements) {
            source += printer.printNode(ts.EmitHint.Unspecified, stmt, this.contextFile) + '\n';
        }
        // Ensure the template type-checking file is an ES module. Otherwise, it's interpreted as some
        // kind of global namespace in TS, which forces a full re-typecheck of the user's program that
        // is somehow more expensive than the initial parse.
        source += '\nexport const IS_A_MODULE = true;\n';
        return source;
    }
    getPreludeStatements() {
        return [];
    }
}

/**
 * How a type-checking context should handle operations which would require inlining.
 */
var InliningMode;
(function (InliningMode) {
    /**
     * Use inlining operations when required.
     */
    InliningMode[InliningMode["InlineOps"] = 0] = "InlineOps";
    /**
     * Produce diagnostics if an operation would require inlining.
     */
    InliningMode[InliningMode["Error"] = 1] = "Error";
})(InliningMode || (InliningMode = {}));
/**
 * A template type checking context for a program.
 *
 * The `TypeCheckContext` allows registration of directives to be type checked.
 */
class TypeCheckContextImpl {
    config;
    compilerHost;
    refEmitter;
    reflector;
    host;
    inlining;
    perf;
    fileMap = new Map();
    constructor(config, compilerHost, refEmitter, reflector, host, inlining, perf) {
        this.config = config;
        this.compilerHost = compilerHost;
        this.refEmitter = refEmitter;
        this.reflector = reflector;
        this.host = host;
        this.inlining = inlining;
        this.perf = perf;
        if (inlining === InliningMode.Error && config.useInlineTypeConstructors) {
            // We cannot use inlining for type checking since this environment does not support it.
            throw new Error(`AssertionError: invalid inlining configuration.`);
        }
    }
    /**
     * A `Map` of `ts.SourceFile`s that the context has seen to the operations (additions of methods
     * or type-check blocks) that need to be eventually performed on that file.
     */
    opMap = new Map();
    /**
     * Tracks when an a particular class has a pending type constructor patching operation already
     * queued.
     */
    typeCtorPending = new Set();
    /**
     * Register a template to potentially be type-checked.
     *
     * Implements `TypeCheckContext.addTemplate`.
     */
    addDirective(ref, binder, schemas, templateContext, isStandalone) {
        if (!this.host.shouldCheckClass(ref.node)) {
            return;
        }
        const fileData = this.dataForFile(ref.node.getSourceFile());
        const shimData = this.pendingShimForClass(ref.node);
        const id = fileData.sourceManager.getTypeCheckId(ref.node);
        const templateParsingDiagnostics = [];
        if (templateContext !== null && templateContext.parseErrors !== null) {
            templateParsingDiagnostics.push(...getTemplateDiagnostics(templateContext.parseErrors, id, templateContext.sourceMapping));
        }
        const boundTarget = binder.bind({ template: templateContext?.nodes });
        if (this.inlining === InliningMode.InlineOps) {
            // Get all of the directives used in the template and record inline type constructors when
            // required.
            for (const dir of boundTarget.getUsedDirectives()) {
                const dirRef = dir.ref;
                const dirNode = dirRef.node;
                if (!dir.isGeneric || !requiresInlineTypeCtor(dirNode, this.reflector, shimData.file)) {
                    // inlining not required
                    continue;
                }
                // Add an inline type constructor operation for the directive.
                this.addInlineTypeCtor(fileData, dirNode.getSourceFile(), dirRef, {
                    fnName: 'ngTypeCtor',
                    // The constructor should have a body if the directive comes from a .ts file, but not if
                    // it comes from a .d.ts file. .d.ts declarations don't have bodies.
                    body: !dirNode.getSourceFile().isDeclarationFile,
                    fields: {
                        inputs: dir.inputs,
                        // TODO(alxhub): support queries
                        queries: dir.queries,
                    },
                    coercedInputFields: dir.coercedInputFields,
                });
            }
        }
        shimData.data.set(id, {
            template: templateContext?.nodes || null,
            boundTarget,
            templateParsingDiagnostics,
        });
        const usedPipes = [];
        if (templateContext !== null) {
            for (const name of boundTarget.getUsedPipes()) {
                if (templateContext.pipes.has(name)) {
                    usedPipes.push(templateContext.pipes.get(name).ref);
                }
            }
        }
        const inliningRequirement = requiresInlineTypeCheckBlock(ref, shimData.file, usedPipes, this.reflector);
        // If inlining is not supported, but is required for either the TCB or one of its directive
        // dependencies, then exit here with an error.
        if (this.inlining === InliningMode.Error &&
            inliningRequirement === TcbInliningRequirement.MustInline) {
            // This template cannot be supported because the underlying strategy does not support inlining
            // and inlining would be required.
            // Record diagnostics to indicate the issues with this template.
            shimData.oobRecorder.requiresInlineTcb(id, ref.node);
            // Checking this template would be unsupported, so don't try.
            this.perf.eventCount(exports.PerfEvent.SkipGenerateTcbNoInline);
            return;
        }
        if (templateContext !== null) {
            fileData.sourceManager.captureTemplateSource(id, templateContext.sourceMapping, templateContext.file);
        }
        const meta = {
            id,
            boundTarget,
            pipes: templateContext?.pipes || null,
            schemas,
            isStandalone,
            preserveWhitespaces: templateContext?.preserveWhitespaces ?? false,
        };
        this.perf.eventCount(exports.PerfEvent.GenerateTcb);
        if (inliningRequirement !== TcbInliningRequirement.None &&
            this.inlining === InliningMode.InlineOps) {
            // This class didn't meet the requirements for external type checking, so generate an inline
            // TCB for the class.
            this.addInlineTypeCheckBlock(fileData, shimData, ref, meta);
        }
        else if (inliningRequirement === TcbInliningRequirement.ShouldInlineForGenericBounds &&
            this.inlining === InliningMode.Error) {
            // It's suggested that this TCB should be generated inline due to the class' generic
            // bounds, but inlining is not supported by the current environment. Use a non-inline type
            // check block, but fall back to `any` generic parameters since the generic bounds can't be
            // referenced in that context. This will infer a less useful type for the class, but allow
            // for type-checking it in an environment where that would not be possible otherwise.
            shimData.file.addTypeCheckBlock(ref, meta, shimData.domSchemaChecker, shimData.oobRecorder, TcbGenericContextBehavior.FallbackToAny);
        }
        else {
            shimData.file.addTypeCheckBlock(ref, meta, shimData.domSchemaChecker, shimData.oobRecorder, TcbGenericContextBehavior.UseEmitter);
        }
    }
    /**
     * Record a type constructor for the given `node` with the given `ctorMetadata`.
     */
    addInlineTypeCtor(fileData, sf, ref, ctorMeta) {
        if (this.typeCtorPending.has(ref.node)) {
            return;
        }
        this.typeCtorPending.add(ref.node);
        // Lazily construct the operation map.
        if (!this.opMap.has(sf)) {
            this.opMap.set(sf, []);
        }
        const ops = this.opMap.get(sf);
        // Push a `TypeCtorOp` into the operation queue for the source file.
        ops.push(new TypeCtorOp(ref, this.reflector, ctorMeta));
        fileData.hasInlines = true;
    }
    /**
     * Transform a `ts.SourceFile` into a version that includes type checking code.
     *
     * If this particular `ts.SourceFile` requires changes, the text representing its new contents
     * will be returned. Otherwise, a `null` return indicates no changes were necessary.
     */
    transform(sf) {
        // If there are no operations pending for this particular file, return `null` to indicate no
        // changes.
        if (!this.opMap.has(sf)) {
            return null;
        }
        // Use a `ts.Printer` to generate source code.
        const printer = ts.createPrinter({ omitTrailingSemicolon: true });
        // Imports may need to be added to the file to support type-checking of directives
        // used in the template within it.
        const importManager = new ImportManager({
            // This minimizes noticeable changes    with older versions of `ImportManager`.
            forceGenerateNamespacesForNewImports: true,
            // Type check block code affects code completion and fix suggestions.
            // We want to encourage single quotes for now, like we always did.
            shouldUseSingleQuotes: () => true,
        });
        // Execute ops.
        // Each Op has a splitPoint index into the text where it needs to be inserted.
        const updates = this.opMap
            .get(sf)
            .map((op) => {
            return {
                pos: op.splitPoint,
                text: op.execute(importManager, sf, this.refEmitter, printer),
            };
        });
        const { newImports, updatedImports } = importManager.finalize();
        // Capture new imports
        if (newImports.has(sf.fileName)) {
            newImports.get(sf.fileName).forEach((newImport) => {
                updates.push({
                    pos: 0,
                    text: printer.printNode(ts.EmitHint.Unspecified, newImport, sf),
                });
            });
        }
        // Capture updated imports
        for (const [oldBindings, newBindings] of updatedImports.entries()) {
            if (oldBindings.getSourceFile() !== sf) {
                throw new Error('Unexpected updates to unrelated source files.');
            }
            updates.push({
                pos: oldBindings.getStart(),
                deletePos: oldBindings.getEnd(),
                text: printer.printNode(ts.EmitHint.Unspecified, newBindings, sf),
            });
        }
        const result = new MagicString(sf.text, { filename: sf.fileName });
        for (const update of updates) {
            if (update.deletePos !== undefined) {
                result.remove(update.pos, update.deletePos);
            }
            result.appendLeft(update.pos, update.text);
        }
        return result.toString();
    }
    finalize() {
        // First, build the map of updates to source files.
        const updates = new Map();
        for (const originalSf of this.opMap.keys()) {
            const newText = this.transform(originalSf);
            if (newText !== null) {
                updates.set(absoluteFromSourceFile(originalSf), {
                    newText,
                    originalFile: originalSf,
                });
            }
        }
        // Then go through each input file that has pending code generation operations.
        for (const [sfPath, pendingFileData] of this.fileMap) {
            // For each input file, consider generation operations for each of its shims.
            for (const pendingShimData of pendingFileData.shimData.values()) {
                this.host.recordShimData(sfPath, {
                    genesisDiagnostics: [
                        ...pendingShimData.domSchemaChecker.diagnostics,
                        ...pendingShimData.oobRecorder.diagnostics,
                    ],
                    hasInlines: pendingFileData.hasInlines,
                    path: pendingShimData.file.fileName,
                    data: pendingShimData.data,
                });
                const sfText = pendingShimData.file.render(false /* removeComments */);
                updates.set(pendingShimData.file.fileName, {
                    newText: sfText,
                    // Shim files do not have an associated original file.
                    originalFile: null,
                });
            }
        }
        return updates;
    }
    addInlineTypeCheckBlock(fileData, shimData, ref, tcbMeta) {
        const sf = ref.node.getSourceFile();
        if (!this.opMap.has(sf)) {
            this.opMap.set(sf, []);
        }
        const ops = this.opMap.get(sf);
        ops.push(new InlineTcbOp(ref, tcbMeta, this.config, this.reflector, shimData.domSchemaChecker, shimData.oobRecorder));
        fileData.hasInlines = true;
    }
    pendingShimForClass(node) {
        const fileData = this.dataForFile(node.getSourceFile());
        const shimPath = TypeCheckShimGenerator.shimFor(absoluteFromSourceFile(node.getSourceFile()));
        if (!fileData.shimData.has(shimPath)) {
            fileData.shimData.set(shimPath, {
                domSchemaChecker: new RegistryDomSchemaChecker(fileData.sourceManager),
                oobRecorder: new OutOfBandDiagnosticRecorderImpl(fileData.sourceManager),
                file: new TypeCheckFile(shimPath, this.config, this.refEmitter, this.reflector, this.compilerHost),
                data: new Map(),
            });
        }
        return fileData.shimData.get(shimPath);
    }
    dataForFile(sf) {
        const sfPath = absoluteFromSourceFile(sf);
        if (!this.fileMap.has(sfPath)) {
            const data = {
                hasInlines: false,
                sourceManager: this.host.getSourceManager(sfPath),
                shimData: new Map(),
            };
            this.fileMap.set(sfPath, data);
        }
        return this.fileMap.get(sfPath);
    }
}
function getTemplateDiagnostics(parseErrors, templateId, sourceMapping) {
    return parseErrors.map((error) => {
        const span = error.span;
        if (span.start.offset === span.end.offset) {
            // Template errors can contain zero-length spans, if the error occurs at a single point.
            // However, TypeScript does not handle displaying a zero-length diagnostic very well, so
            // increase the ending offset by 1 for such errors, to ensure the position is shown in the
            // diagnostic.
            span.end.offset++;
        }
        return makeTemplateDiagnostic(templateId, sourceMapping, span, ts.DiagnosticCategory.Error, ngErrorCode(exports.ErrorCode.TEMPLATE_PARSE_ERROR), error.msg);
    });
}
/**
 * A type check block operation which produces inline type check code for a particular directive.
 */
class InlineTcbOp {
    ref;
    meta;
    config;
    reflector;
    domSchemaChecker;
    oobRecorder;
    constructor(ref, meta, config, reflector, domSchemaChecker, oobRecorder) {
        this.ref = ref;
        this.meta = meta;
        this.config = config;
        this.reflector = reflector;
        this.domSchemaChecker = domSchemaChecker;
        this.oobRecorder = oobRecorder;
    }
    /**
     * Type check blocks are inserted immediately after the end of the directve class.
     */
    get splitPoint() {
        return this.ref.node.end + 1;
    }
    execute(im, sf, refEmitter, printer) {
        const env = new Environment(this.config, im, refEmitter, this.reflector, sf);
        const fnName = ts.factory.createIdentifier(`_tcb_${this.ref.node.pos}`);
        // Inline TCBs should copy any generic type parameter nodes directly, as the TCB code is
        // inlined into the class in a context where that will always be legal.
        const fn = generateTypeCheckBlock(env, this.ref, fnName, this.meta, this.domSchemaChecker, this.oobRecorder, TcbGenericContextBehavior.CopyClassNodes);
        return printer.printNode(ts.EmitHint.Unspecified, fn, sf);
    }
}
/**
 * A type constructor operation which produces type constructor code for a particular directive.
 */
class TypeCtorOp {
    ref;
    reflector;
    meta;
    constructor(ref, reflector, meta) {
        this.ref = ref;
        this.reflector = reflector;
        this.meta = meta;
    }
    /**
     * Type constructor operations are inserted immediately before the end of the directive class.
     */
    get splitPoint() {
        return this.ref.node.end - 1;
    }
    execute(im, sf, refEmitter, printer) {
        const emitEnv = new ReferenceEmitEnvironment(im, refEmitter, this.reflector, sf);
        const tcb = generateInlineTypeCtor(emitEnv, this.ref.node, this.meta);
        return printer.printNode(ts.EmitHint.Unspecified, tcb, sf);
    }
}

const LF_CHAR = 10;
const CR_CHAR = 13;
const LINE_SEP_CHAR = 8232;
const PARAGRAPH_CHAR = 8233;
/** Gets the line and character for the given position from the line starts map. */
function getLineAndCharacterFromPosition(lineStartsMap, position) {
    const lineIndex = findClosestLineStartPosition(lineStartsMap, position);
    return { character: position - lineStartsMap[lineIndex], line: lineIndex };
}
/**
 * Computes the line start map of the given text. This can be used in order to
 * retrieve the line and character of a given text position index.
 */
function computeLineStartsMap(text) {
    const result = [0];
    let pos = 0;
    while (pos < text.length) {
        const char = text.charCodeAt(pos++);
        // Handles the "CRLF" line break. In that case we peek the character
        // after the "CR" and check if it is a line feed.
        if (char === CR_CHAR) {
            if (text.charCodeAt(pos) === LF_CHAR) {
                pos++;
            }
            result.push(pos);
        }
        else if (char === LF_CHAR || char === LINE_SEP_CHAR || char === PARAGRAPH_CHAR) {
            result.push(pos);
        }
    }
    result.push(pos);
    return result;
}
/** Finds the closest line start for the given position. */
function findClosestLineStartPosition(linesMap, position, low = 0, high = linesMap.length - 1) {
    while (low <= high) {
        const pivotIdx = Math.floor((low + high) / 2);
        const pivotEl = linesMap[pivotIdx];
        if (pivotEl === position) {
            return pivotIdx;
        }
        else if (position > pivotEl) {
            low = pivotIdx + 1;
        }
        else {
            high = pivotIdx - 1;
        }
    }
    // In case there was no exact match, return the closest "lower" line index. We also
    // subtract the index by one because want the index of the previous line start.
    return low - 1;
}

/**
 * Represents the source of a template that was processed during type-checking. This information is
 * used when translating parse offsets in diagnostics back to their original line/column location.
 */
class TemplateSource {
    mapping;
    file;
    lineStarts = null;
    constructor(mapping, file) {
        this.mapping = mapping;
        this.file = file;
    }
    toParseSourceSpan(start, end) {
        const startLoc = this.toParseLocation(start);
        const endLoc = this.toParseLocation(end);
        return new ParseSourceSpan(startLoc, endLoc);
    }
    toParseLocation(position) {
        const lineStarts = this.acquireLineStarts();
        const { line, character } = getLineAndCharacterFromPosition(lineStarts, position);
        return new ParseLocation(this.file, position, line, character);
    }
    acquireLineStarts() {
        if (this.lineStarts === null) {
            this.lineStarts = computeLineStartsMap(this.file.content);
        }
        return this.lineStarts;
    }
}
/**
 * Assigns IDs for type checking and keeps track of their origins.
 *
 * Implements `TypeCheckSourceResolver` to resolve the source of a template based on these IDs.
 */
class DirectiveSourceManager {
    /**
     * This map keeps track of all template sources that have been type-checked by the id that is
     * attached to a TCB's function declaration as leading trivia. This enables translation of
     * diagnostics produced for TCB code to their source location in the template.
     */
    templateSources = new Map();
    getTypeCheckId(node) {
        return getTypeCheckId(node);
    }
    captureTemplateSource(id, mapping, file) {
        this.templateSources.set(id, new TemplateSource(mapping, file));
    }
    getTemplateSourceMapping(id) {
        if (!this.templateSources.has(id)) {
            throw new Error(`Unexpected unknown type check ID: ${id}`);
        }
        return this.templateSources.get(id).mapping;
    }
    toTemplateParseSourceSpan(id, span) {
        if (!this.templateSources.has(id)) {
            return null;
        }
        const templateSource = this.templateSources.get(id);
        return templateSource.toParseSourceSpan(span.start, span.end);
    }
}

/**
 * Generates and caches `Symbol`s for various template structures for a given component.
 *
 * The `SymbolBuilder` internally caches the `Symbol`s it creates, and must be destroyed and
 * replaced if the component's template changes.
 */
class SymbolBuilder {
    tcbPath;
    tcbIsShim;
    typeCheckBlock;
    typeCheckData;
    componentScopeReader;
    getTypeChecker;
    symbolCache = new Map();
    constructor(tcbPath, tcbIsShim, typeCheckBlock, typeCheckData, componentScopeReader, 
    // The `ts.TypeChecker` depends on the current type-checking program, and so must be requested
    // on-demand instead of cached.
    getTypeChecker) {
        this.tcbPath = tcbPath;
        this.tcbIsShim = tcbIsShim;
        this.typeCheckBlock = typeCheckBlock;
        this.typeCheckData = typeCheckData;
        this.componentScopeReader = componentScopeReader;
        this.getTypeChecker = getTypeChecker;
    }
    getSymbol(node) {
        if (this.symbolCache.has(node)) {
            return this.symbolCache.get(node);
        }
        let symbol = null;
        if (node instanceof BoundAttribute || node instanceof TextAttribute) {
            // TODO(atscott): input and output bindings only return the first directive match but should
            // return a list of bindings for all of them.
            symbol = this.getSymbolOfInputBinding(node);
        }
        else if (node instanceof BoundEvent) {
            symbol = this.getSymbolOfBoundEvent(node);
        }
        else if (node instanceof Element$1) {
            symbol = this.getSymbolOfElement(node);
        }
        else if (node instanceof Template) {
            symbol = this.getSymbolOfAstTemplate(node);
        }
        else if (node instanceof Variable) {
            symbol = this.getSymbolOfVariable(node);
        }
        else if (node instanceof LetDeclaration$1) {
            symbol = this.getSymbolOfLetDeclaration(node);
        }
        else if (node instanceof Reference$1) {
            symbol = this.getSymbolOfReference(node);
        }
        else if (node instanceof BindingPipe) {
            symbol = this.getSymbolOfPipe(node);
        }
        else if (node instanceof AST) {
            symbol = this.getSymbolOfTemplateExpression(node);
        }
        else ;
        this.symbolCache.set(node, symbol);
        return symbol;
    }
    getSymbolOfAstTemplate(template) {
        const directives = this.getDirectivesOfNode(template);
        return { kind: exports.SymbolKind.Template, directives, templateNode: template };
    }
    getSymbolOfElement(element) {
        const elementSourceSpan = element.startSourceSpan ?? element.sourceSpan;
        const node = findFirstMatchingNode(this.typeCheckBlock, {
            withSpan: elementSourceSpan,
            filter: ts.isVariableDeclaration,
        });
        if (node === null) {
            return null;
        }
        const symbolFromDeclaration = this.getSymbolOfTsNode(node);
        if (symbolFromDeclaration === null || symbolFromDeclaration.tsSymbol === null) {
            return null;
        }
        const directives = this.getDirectivesOfNode(element);
        // All statements in the TCB are `Expression`s that optionally include more information.
        // An `ElementSymbol` uses the information returned for the variable declaration expression,
        // adds the directives for the element, and updates the `kind` to be `SymbolKind.Element`.
        return {
            ...symbolFromDeclaration,
            kind: exports.SymbolKind.Element,
            directives,
            templateNode: element,
        };
    }
    getDirectivesOfNode(element) {
        const elementSourceSpan = element.startSourceSpan ?? element.sourceSpan;
        const tcbSourceFile = this.typeCheckBlock.getSourceFile();
        // directives could be either:
        // - var _t1: TestDir /*T:D*/ = null! as TestDir;
        // - var _t1 /*T:D*/ = _ctor1({});
        const isDirectiveDeclaration = (node) => (ts.isTypeNode(node) || ts.isIdentifier(node)) &&
            ts.isVariableDeclaration(node.parent) &&
            hasExpressionIdentifier(tcbSourceFile, node, ExpressionIdentifier.DIRECTIVE);
        const nodes = findAllMatchingNodes(this.typeCheckBlock, {
            withSpan: elementSourceSpan,
            filter: isDirectiveDeclaration,
        });
        const symbols = [];
        for (const node of nodes) {
            const symbol = this.getSymbolOfTsNode(node.parent);
            if (symbol === null ||
                !isSymbolWithValueDeclaration(symbol.tsSymbol) ||
                !ts.isClassDeclaration(symbol.tsSymbol.valueDeclaration)) {
                continue;
            }
            const meta = this.getDirectiveMeta(element, symbol.tsSymbol.valueDeclaration);
            if (meta !== null && meta.selector !== null) {
                const ref = new Reference(symbol.tsSymbol.valueDeclaration);
                if (meta.hostDirectives !== null) {
                    this.addHostDirectiveSymbols(element, meta.hostDirectives, symbols);
                }
                const directiveSymbol = {
                    ...symbol,
                    ref,
                    tsSymbol: symbol.tsSymbol,
                    selector: meta.selector,
                    isComponent: meta.isComponent,
                    ngModule: this.getDirectiveModule(symbol.tsSymbol.valueDeclaration),
                    kind: exports.SymbolKind.Directive,
                    isStructural: meta.isStructural,
                    isInScope: true,
                    isHostDirective: false,
                };
                symbols.push(directiveSymbol);
            }
        }
        return symbols;
    }
    addHostDirectiveSymbols(host, hostDirectives, symbols) {
        for (const current of hostDirectives) {
            if (!isHostDirectiveMetaForGlobalMode(current)) {
                throw new Error('Impossible state: typecheck code path in local compilation mode.');
            }
            if (!ts.isClassDeclaration(current.directive.node)) {
                continue;
            }
            const symbol = this.getSymbolOfTsNode(current.directive.node);
            const meta = this.getDirectiveMeta(host, current.directive.node);
            if (meta !== null && symbol !== null && isSymbolWithValueDeclaration(symbol.tsSymbol)) {
                if (meta.hostDirectives !== null) {
                    this.addHostDirectiveSymbols(host, meta.hostDirectives, symbols);
                }
                const directiveSymbol = {
                    ...symbol,
                    isHostDirective: true,
                    ref: current.directive,
                    tsSymbol: symbol.tsSymbol,
                    exposedInputs: current.inputs,
                    exposedOutputs: current.outputs,
                    selector: meta.selector,
                    isComponent: meta.isComponent,
                    ngModule: this.getDirectiveModule(current.directive.node),
                    kind: exports.SymbolKind.Directive,
                    isStructural: meta.isStructural,
                    isInScope: true,
                };
                symbols.push(directiveSymbol);
            }
        }
    }
    getDirectiveMeta(host, directiveDeclaration) {
        let directives = this.typeCheckData.boundTarget.getDirectivesOfNode(host);
        // `getDirectivesOfNode` will not return the directives intended for an element
        // on a microsyntax template, for example `<div *ngFor="let user of users;" dir>`,
        // the `dir` will be skipped, but it's needed in language service.
        const firstChild = host.children[0];
        if (firstChild instanceof Element$1) {
            const isMicrosyntaxTemplate = host instanceof Template && sourceSpanEqual(firstChild.sourceSpan, host.sourceSpan);
            if (isMicrosyntaxTemplate) {
                const firstChildDirectives = this.typeCheckData.boundTarget.getDirectivesOfNode(firstChild);
                if (firstChildDirectives !== null && directives !== null) {
                    directives = directives.concat(firstChildDirectives);
                }
                else {
                    directives = directives ?? firstChildDirectives;
                }
            }
        }
        if (directives === null) {
            return null;
        }
        return directives.find((m) => m.ref.node === directiveDeclaration) ?? null;
    }
    getDirectiveModule(declaration) {
        const scope = this.componentScopeReader.getScopeForComponent(declaration);
        if (scope === null || scope.kind !== exports.ComponentScopeKind.NgModule) {
            return null;
        }
        return scope.ngModule;
    }
    getSymbolOfBoundEvent(eventBinding) {
        const consumer = this.typeCheckData.boundTarget.getConsumerOfBinding(eventBinding);
        if (consumer === null) {
            return null;
        }
        // Outputs in the TCB look like one of the two:
        // * _t1["outputField"].subscribe(handler);
        // * _t1.addEventListener(handler);
        // Even with strict null checks disabled, we still produce the access as a separate statement
        // so that it can be found here.
        let expectedAccess;
        if (consumer instanceof Template || consumer instanceof Element$1) {
            expectedAccess = 'addEventListener';
        }
        else {
            const bindingPropertyNames = consumer.outputs.getByBindingPropertyName(eventBinding.name);
            if (bindingPropertyNames === null || bindingPropertyNames.length === 0) {
                return null;
            }
            // Note that we only get the expectedAccess text from a single consumer of the binding. If
            // there are multiple consumers (not supported in the `boundTarget` API) and one of them has
            // an alias, it will not get matched here.
            expectedAccess = bindingPropertyNames[0].classPropertyName;
        }
        function filter(n) {
            if (!isAccessExpression(n)) {
                return false;
            }
            if (ts.isPropertyAccessExpression(n)) {
                return n.name.getText() === expectedAccess;
            }
            else {
                return (ts.isStringLiteral(n.argumentExpression) && n.argumentExpression.text === expectedAccess);
            }
        }
        const outputFieldAccesses = findAllMatchingNodes(this.typeCheckBlock, {
            withSpan: eventBinding.keySpan,
            filter,
        });
        const bindings = [];
        for (const outputFieldAccess of outputFieldAccesses) {
            if (consumer instanceof Template || consumer instanceof Element$1) {
                if (!ts.isPropertyAccessExpression(outputFieldAccess)) {
                    continue;
                }
                const addEventListener = outputFieldAccess.name;
                const tsSymbol = this.getTypeChecker().getSymbolAtLocation(addEventListener);
                const tsType = this.getTypeChecker().getTypeAtLocation(addEventListener);
                const positionInFile = this.getTcbPositionForNode(addEventListener);
                const target = this.getSymbol(consumer);
                if (target === null || tsSymbol === undefined) {
                    continue;
                }
                bindings.push({
                    kind: exports.SymbolKind.Binding,
                    tsSymbol,
                    tsType,
                    target,
                    tcbLocation: {
                        tcbPath: this.tcbPath,
                        isShimFile: this.tcbIsShim,
                        positionInFile,
                    },
                });
            }
            else {
                if (!ts.isElementAccessExpression(outputFieldAccess)) {
                    continue;
                }
                const tsSymbol = this.getTypeChecker().getSymbolAtLocation(outputFieldAccess.argumentExpression);
                if (tsSymbol === undefined) {
                    continue;
                }
                const target = this.getDirectiveSymbolForAccessExpression(outputFieldAccess, consumer);
                if (target === null) {
                    continue;
                }
                const positionInFile = this.getTcbPositionForNode(outputFieldAccess);
                const tsType = this.getTypeChecker().getTypeAtLocation(outputFieldAccess);
                bindings.push({
                    kind: exports.SymbolKind.Binding,
                    tsSymbol,
                    tsType,
                    target,
                    tcbLocation: {
                        tcbPath: this.tcbPath,
                        isShimFile: this.tcbIsShim,
                        positionInFile,
                    },
                });
            }
        }
        if (bindings.length === 0) {
            return null;
        }
        return { kind: exports.SymbolKind.Output, bindings };
    }
    getSymbolOfInputBinding(binding) {
        const consumer = this.typeCheckData.boundTarget.getConsumerOfBinding(binding);
        if (consumer === null) {
            return null;
        }
        if (consumer instanceof Element$1 || consumer instanceof Template) {
            const host = this.getSymbol(consumer);
            return host !== null ? { kind: exports.SymbolKind.DomBinding, host } : null;
        }
        const nodes = findAllMatchingNodes(this.typeCheckBlock, {
            withSpan: binding.sourceSpan,
            filter: isAssignment,
        });
        const bindings = [];
        for (const node of nodes) {
            if (!isAccessExpression(node.left)) {
                continue;
            }
            const signalInputAssignment = unwrapSignalInputWriteTAccessor(node.left);
            let fieldAccessExpr;
            let symbolInfo = null;
            // Signal inputs need special treatment because they are generated with an extra keyed
            // access. E.g. `_t1.prop[WriteT_ACCESSOR_SYMBOL]`. Observations:
            //   - The keyed access for the write type needs to be resolved for the "input type".
            //   - The definition symbol of the input should be the input class member, and not the
            //     internal write accessor. Symbol should resolve `_t1.prop`.
            if (signalInputAssignment !== null) {
                // Note: If the field expression for the input binding refers to just an identifier,
                // then we are handling the case of a temporary variable being used for the input field.
                // This is the case with `honorAccessModifiersForInputBindings = false` and in those cases
                // we cannot resolve the owning directive, similar to how we guard above with `isAccessExpression`.
                if (ts.isIdentifier(signalInputAssignment.fieldExpr)) {
                    continue;
                }
                const fieldSymbol = this.getSymbolOfTsNode(signalInputAssignment.fieldExpr);
                const typeSymbol = this.getSymbolOfTsNode(signalInputAssignment.typeExpr);
                fieldAccessExpr = signalInputAssignment.fieldExpr;
                symbolInfo =
                    fieldSymbol === null || typeSymbol === null
                        ? null
                        : {
                            tcbLocation: fieldSymbol.tcbLocation,
                            tsSymbol: fieldSymbol.tsSymbol,
                            tsType: typeSymbol.tsType,
                        };
            }
            else {
                fieldAccessExpr = node.left;
                symbolInfo = this.getSymbolOfTsNode(node.left);
            }
            if (symbolInfo === null || symbolInfo.tsSymbol === null) {
                continue;
            }
            const target = this.getDirectiveSymbolForAccessExpression(fieldAccessExpr, consumer);
            if (target === null) {
                continue;
            }
            bindings.push({
                ...symbolInfo,
                tsSymbol: symbolInfo.tsSymbol,
                kind: exports.SymbolKind.Binding,
                target,
            });
        }
        if (bindings.length === 0) {
            return null;
        }
        return { kind: exports.SymbolKind.Input, bindings };
    }
    getDirectiveSymbolForAccessExpression(fieldAccessExpr, { isComponent, selector, isStructural }) {
        // In all cases, `_t1["index"]` or `_t1.index`, `node.expression` is _t1.
        const tsSymbol = this.getTypeChecker().getSymbolAtLocation(fieldAccessExpr.expression);
        if (tsSymbol?.declarations === undefined ||
            tsSymbol.declarations.length === 0 ||
            selector === null) {
            return null;
        }
        const [declaration] = tsSymbol.declarations;
        if (!ts.isVariableDeclaration(declaration) ||
            !hasExpressionIdentifier(
            // The expression identifier could be on the type (for regular directives) or the name
            // (for generic directives and the ctor op).
            declaration.getSourceFile(), declaration.type ?? declaration.name, ExpressionIdentifier.DIRECTIVE)) {
            return null;
        }
        const symbol = this.getSymbolOfTsNode(declaration);
        if (symbol === null ||
            !isSymbolWithValueDeclaration(symbol.tsSymbol) ||
            !ts.isClassDeclaration(symbol.tsSymbol.valueDeclaration)) {
            return null;
        }
        const ref = new Reference(symbol.tsSymbol.valueDeclaration);
        const ngModule = this.getDirectiveModule(symbol.tsSymbol.valueDeclaration);
        return {
            ref,
            kind: exports.SymbolKind.Directive,
            tsSymbol: symbol.tsSymbol,
            tsType: symbol.tsType,
            tcbLocation: symbol.tcbLocation,
            isComponent,
            isStructural,
            selector,
            ngModule,
            isHostDirective: false,
            isInScope: true, // TODO: this should always be in scope in this context, right?
        };
    }
    getSymbolOfVariable(variable) {
        const node = findFirstMatchingNode(this.typeCheckBlock, {
            withSpan: variable.sourceSpan,
            filter: ts.isVariableDeclaration,
        });
        if (node === null) {
            return null;
        }
        let nodeValueSymbol = null;
        if (ts.isForOfStatement(node.parent.parent)) {
            nodeValueSymbol = this.getSymbolOfTsNode(node);
        }
        else if (node.initializer !== undefined) {
            nodeValueSymbol = this.getSymbolOfTsNode(node.initializer);
        }
        if (nodeValueSymbol === null) {
            return null;
        }
        return {
            tsType: nodeValueSymbol.tsType,
            tsSymbol: nodeValueSymbol.tsSymbol,
            initializerLocation: nodeValueSymbol.tcbLocation,
            kind: exports.SymbolKind.Variable,
            declaration: variable,
            localVarLocation: {
                tcbPath: this.tcbPath,
                isShimFile: this.tcbIsShim,
                positionInFile: this.getTcbPositionForNode(node.name),
            },
        };
    }
    getSymbolOfReference(ref) {
        const target = this.typeCheckData.boundTarget.getReferenceTarget(ref);
        // Find the node for the reference declaration, i.e. `var _t2 = _t1;`
        let node = findFirstMatchingNode(this.typeCheckBlock, {
            withSpan: ref.sourceSpan,
            filter: ts.isVariableDeclaration,
        });
        if (node === null || target === null || node.initializer === undefined) {
            return null;
        }
        // Get the original declaration for the references variable, with the exception of template refs
        // which are of the form var _t3 = (_t2 as any as i2.TemplateRef<any>)
        // TODO(atscott): Consider adding an `ExpressionIdentifier` to tag variable declaration
        // initializers as invalid for symbol retrieval.
        const originalDeclaration = ts.isParenthesizedExpression(node.initializer) &&
            ts.isAsExpression(node.initializer.expression)
            ? this.getTypeChecker().getSymbolAtLocation(node.name)
            : this.getTypeChecker().getSymbolAtLocation(node.initializer);
        if (originalDeclaration === undefined || originalDeclaration.valueDeclaration === undefined) {
            return null;
        }
        const symbol = this.getSymbolOfTsNode(originalDeclaration.valueDeclaration);
        if (symbol === null || symbol.tsSymbol === null) {
            return null;
        }
        const referenceVarTcbLocation = {
            tcbPath: this.tcbPath,
            isShimFile: this.tcbIsShim,
            positionInFile: this.getTcbPositionForNode(node),
        };
        if (target instanceof Template || target instanceof Element$1) {
            return {
                kind: exports.SymbolKind.Reference,
                tsSymbol: symbol.tsSymbol,
                tsType: symbol.tsType,
                target,
                declaration: ref,
                targetLocation: symbol.tcbLocation,
                referenceVarLocation: referenceVarTcbLocation,
            };
        }
        else {
            if (!ts.isClassDeclaration(target.directive.ref.node)) {
                return null;
            }
            return {
                kind: exports.SymbolKind.Reference,
                tsSymbol: symbol.tsSymbol,
                tsType: symbol.tsType,
                declaration: ref,
                target: target.directive.ref.node,
                targetLocation: symbol.tcbLocation,
                referenceVarLocation: referenceVarTcbLocation,
            };
        }
    }
    getSymbolOfLetDeclaration(decl) {
        const node = findFirstMatchingNode(this.typeCheckBlock, {
            withSpan: decl.sourceSpan,
            filter: ts.isVariableDeclaration,
        });
        if (node === null) {
            return null;
        }
        const nodeValueSymbol = this.getSymbolOfTsNode(node.initializer);
        if (nodeValueSymbol === null) {
            return null;
        }
        return {
            tsType: nodeValueSymbol.tsType,
            tsSymbol: nodeValueSymbol.tsSymbol,
            initializerLocation: nodeValueSymbol.tcbLocation,
            kind: exports.SymbolKind.LetDeclaration,
            declaration: decl,
            localVarLocation: {
                tcbPath: this.tcbPath,
                isShimFile: this.tcbIsShim,
                positionInFile: this.getTcbPositionForNode(node.name),
            },
        };
    }
    getSymbolOfPipe(expression) {
        const methodAccess = findFirstMatchingNode(this.typeCheckBlock, {
            withSpan: expression.nameSpan,
            filter: ts.isPropertyAccessExpression,
        });
        if (methodAccess === null) {
            return null;
        }
        const pipeVariableNode = methodAccess.expression;
        const pipeDeclaration = this.getTypeChecker().getSymbolAtLocation(pipeVariableNode);
        if (pipeDeclaration === undefined || pipeDeclaration.valueDeclaration === undefined) {
            return null;
        }
        const pipeInstance = this.getSymbolOfTsNode(pipeDeclaration.valueDeclaration);
        // The instance should never be null, nor should the symbol lack a value declaration. This
        // is because the node used to look for the `pipeInstance` symbol info is a value
        // declaration of another symbol (i.e. the `pipeDeclaration` symbol).
        if (pipeInstance === null || !isSymbolWithValueDeclaration(pipeInstance.tsSymbol)) {
            return null;
        }
        const symbolInfo = this.getSymbolOfTsNode(methodAccess);
        if (symbolInfo === null) {
            return null;
        }
        return {
            kind: exports.SymbolKind.Pipe,
            ...symbolInfo,
            classSymbol: {
                ...pipeInstance,
                tsSymbol: pipeInstance.tsSymbol,
            },
        };
    }
    getSymbolOfTemplateExpression(expression) {
        if (expression instanceof ASTWithSource) {
            expression = expression.ast;
        }
        const expressionTarget = this.typeCheckData.boundTarget.getExpressionTarget(expression);
        if (expressionTarget !== null) {
            return this.getSymbol(expressionTarget);
        }
        let withSpan = expression.sourceSpan;
        // The `name` part of a `PropertyWrite` and `ASTWithName` do not have their own
        // AST so there is no way to retrieve a `Symbol` for just the `name` via a specific node.
        // Also skipping SafePropertyReads as it breaks nullish coalescing not nullable extended diagnostic
        if (expression instanceof PropertyWrite ||
            (expression instanceof ASTWithName && !(expression instanceof SafePropertyRead))) {
            withSpan = expression.nameSpan;
        }
        let node = null;
        // Property reads in templates usually map to a `PropertyAccessExpression`
        // (e.g. `ctx.foo`) so try looking for one first.
        if (expression instanceof PropertyRead) {
            node = findFirstMatchingNode(this.typeCheckBlock, {
                withSpan,
                filter: ts.isPropertyAccessExpression,
            });
        }
        // Otherwise fall back to searching for any AST node.
        if (node === null) {
            node = findFirstMatchingNode(this.typeCheckBlock, { withSpan, filter: anyNodeFilter });
        }
        if (node === null) {
            return null;
        }
        while (ts.isParenthesizedExpression(node)) {
            node = node.expression;
        }
        // - If we have safe property read ("a?.b") we want to get the Symbol for b, the `whenTrue`
        // expression.
        // - If our expression is a pipe binding ("a | test:b:c"), we want the Symbol for the
        // `transform` on the pipe.
        // - Otherwise, we retrieve the symbol for the node itself with no special considerations
        if (expression instanceof SafePropertyRead && ts.isConditionalExpression(node)) {
            const whenTrueSymbol = this.getSymbolOfTsNode(node.whenTrue);
            if (whenTrueSymbol === null) {
                return null;
            }
            return {
                ...whenTrueSymbol,
                kind: exports.SymbolKind.Expression,
                // Rather than using the type of only the `whenTrue` part of the expression, we should
                // still get the type of the whole conditional expression to include `|undefined`.
                tsType: this.getTypeChecker().getTypeAtLocation(node),
            };
        }
        else {
            const symbolInfo = this.getSymbolOfTsNode(node);
            return symbolInfo === null ? null : { ...symbolInfo, kind: exports.SymbolKind.Expression };
        }
    }
    getSymbolOfTsNode(node) {
        while (ts.isParenthesizedExpression(node)) {
            node = node.expression;
        }
        let tsSymbol;
        if (ts.isPropertyAccessExpression(node)) {
            tsSymbol = this.getTypeChecker().getSymbolAtLocation(node.name);
        }
        else if (ts.isCallExpression(node)) {
            tsSymbol = this.getTypeChecker().getSymbolAtLocation(node.expression);
        }
        else {
            tsSymbol = this.getTypeChecker().getSymbolAtLocation(node);
        }
        const positionInFile = this.getTcbPositionForNode(node);
        const type = this.getTypeChecker().getTypeAtLocation(node);
        return {
            // If we could not find a symbol, fall back to the symbol on the type for the node.
            // Some nodes won't have a "symbol at location" but will have a symbol for the type.
            // Examples of this would be literals and `document.createElement('div')`.
            tsSymbol: tsSymbol ?? type.symbol ?? null,
            tsType: type,
            tcbLocation: {
                tcbPath: this.tcbPath,
                isShimFile: this.tcbIsShim,
                positionInFile,
            },
        };
    }
    getTcbPositionForNode(node) {
        if (ts.isTypeReferenceNode(node)) {
            return this.getTcbPositionForNode(node.typeName);
        }
        else if (ts.isQualifiedName(node)) {
            return node.right.getStart();
        }
        else if (ts.isPropertyAccessExpression(node)) {
            return node.name.getStart();
        }
        else if (ts.isElementAccessExpression(node)) {
            return node.argumentExpression.getStart();
        }
        else {
            return node.getStart();
        }
    }
}
/** Filter predicate function that matches any AST node. */
function anyNodeFilter(n) {
    return true;
}
function sourceSpanEqual(a, b) {
    return a.start.offset === b.start.offset && a.end.offset === b.end.offset;
}
function unwrapSignalInputWriteTAccessor(expr) {
    // e.g. `_t2.inputA[i2.ɵINPUT_SIGNAL_BRAND_WRITE_TYPE]`
    // 1. Assert that we are dealing with an element access expression.
    // 2. Assert that we are dealing with a signal brand symbol access in the argument expression.
    if (!ts.isElementAccessExpression(expr) ||
        !ts.isPropertyAccessExpression(expr.argumentExpression)) {
        return null;
    }
    // Assert that the property access in the element access is a simple identifier and
    // refers to `ɵINPUT_SIGNAL_BRAND_WRITE_TYPE`.
    if (!ts.isIdentifier(expr.argumentExpression.name) ||
        expr.argumentExpression.name.text !== Identifiers.InputSignalBrandWriteType.name) {
        return null;
    }
    // Assert that the expression is either:
    //   - `_t2.inputA[ɵINPUT_SIGNAL_BRAND_WRITE_TYPE]` or (common case)
    //   - or `_t2['input-A'][ɵINPUT_SIGNAL_BRAND_WRITE_TYPE]` (non-identifier input field names)
    //   - or `_dirInput[ɵINPUT_SIGNAL_BRAND_WRITE_TYPE` (honorAccessModifiersForInputBindings=false)
    // This is checked for type safety and to catch unexpected cases.
    if (!ts.isPropertyAccessExpression(expr.expression) &&
        !ts.isElementAccessExpression(expr.expression) &&
        !ts.isIdentifier(expr.expression)) {
        throw new Error('Unexpected expression for signal input write type.');
    }
    return {
        fieldExpr: expr.expression,
        typeExpr: expr,
    };
}

const REGISTRY = new DomElementSchemaRegistry();
/**
 * Primary template type-checking engine, which performs type-checking using a
 * `TypeCheckingProgramStrategy` for type-checking program maintenance, and the
 * `ProgramTypeCheckAdapter` for generation of template type-checking code.
 */
class TemplateTypeCheckerImpl {
    originalProgram;
    programDriver;
    typeCheckAdapter;
    config;
    refEmitter;
    reflector;
    compilerHost;
    priorBuild;
    metaReader;
    localMetaReader;
    ngModuleIndex;
    componentScopeReader;
    typeCheckScopeRegistry;
    perf;
    state = new Map();
    /**
     * Stores the `CompletionEngine` which powers autocompletion for each component class.
     *
     * Must be invalidated whenever the component's template or the `ts.Program` changes. Invalidation
     * on template changes is performed within this `TemplateTypeCheckerImpl` instance. When the
     * `ts.Program` changes, the `TemplateTypeCheckerImpl` as a whole is destroyed and replaced.
     */
    completionCache = new Map();
    /**
     * Stores the `SymbolBuilder` which creates symbols for each component class.
     *
     * Must be invalidated whenever the component's template or the `ts.Program` changes. Invalidation
     * on template changes is performed within this `TemplateTypeCheckerImpl` instance. When the
     * `ts.Program` changes, the `TemplateTypeCheckerImpl` as a whole is destroyed and replaced.
     */
    symbolBuilderCache = new Map();
    /**
     * Stores directives and pipes that are in scope for each component.
     *
     * Unlike other caches, the scope of a component is not affected by its template. It will be
     * destroyed when the `ts.Program` changes and the `TemplateTypeCheckerImpl` as a whole is
     * destroyed and replaced.
     */
    scopeCache = new Map();
    /**
     * Stores potential element tags for each component (a union of DOM tags as well as directive
     * tags).
     *
     * Unlike other caches, the scope of a component is not affected by its template. It will be
     * destroyed when the `ts.Program` changes and the `TemplateTypeCheckerImpl` as a whole is
     * destroyed and replaced.
     */
    elementTagCache = new Map();
    isComplete = false;
    priorResultsAdopted = false;
    constructor(originalProgram, programDriver, typeCheckAdapter, config, refEmitter, reflector, compilerHost, priorBuild, metaReader, localMetaReader, ngModuleIndex, componentScopeReader, typeCheckScopeRegistry, perf) {
        this.originalProgram = originalProgram;
        this.programDriver = programDriver;
        this.typeCheckAdapter = typeCheckAdapter;
        this.config = config;
        this.refEmitter = refEmitter;
        this.reflector = reflector;
        this.compilerHost = compilerHost;
        this.priorBuild = priorBuild;
        this.metaReader = metaReader;
        this.localMetaReader = localMetaReader;
        this.ngModuleIndex = ngModuleIndex;
        this.componentScopeReader = componentScopeReader;
        this.typeCheckScopeRegistry = typeCheckScopeRegistry;
        this.perf = perf;
    }
    getTemplate(component, optimizeFor) {
        const { data } = this.getLatestComponentState(component, optimizeFor);
        if (data === null) {
            return null;
        }
        return data.template;
    }
    getUsedDirectives(component) {
        return this.getLatestComponentState(component).data?.boundTarget.getUsedDirectives() || null;
    }
    getUsedPipes(component) {
        return this.getLatestComponentState(component).data?.boundTarget.getUsedPipes() || null;
    }
    getLatestComponentState(component, optimizeFor = exports.OptimizeFor.SingleFile) {
        switch (optimizeFor) {
            case exports.OptimizeFor.WholeProgram:
                this.ensureAllShimsForAllFiles();
                break;
            case exports.OptimizeFor.SingleFile:
                this.ensureShimForComponent(component);
                break;
        }
        const sf = component.getSourceFile();
        const sfPath = absoluteFromSourceFile(sf);
        const shimPath = TypeCheckShimGenerator.shimFor(sfPath);
        const fileRecord = this.getFileData(sfPath);
        if (!fileRecord.shimData.has(shimPath)) {
            return { data: null, tcb: null, tcbPath: shimPath, tcbIsShim: true };
        }
        const id = fileRecord.sourceManager.getTypeCheckId(component);
        const shimRecord = fileRecord.shimData.get(shimPath);
        const program = this.programDriver.getProgram();
        const shimSf = getSourceFileOrNull(program, shimPath);
        if (shimSf === null || !fileRecord.shimData.has(shimPath)) {
            throw new Error(`Error: no shim file in program: ${shimPath}`);
        }
        let tcb = findTypeCheckBlock(shimSf, id, /*isDiagnosticsRequest*/ false);
        let tcbPath = shimPath;
        if (tcb === null) {
            // Try for an inline block.
            const inlineSf = getSourceFileOrError(program, sfPath);
            tcb = findTypeCheckBlock(inlineSf, id, /*isDiagnosticsRequest*/ false);
            if (tcb !== null) {
                tcbPath = sfPath;
            }
        }
        let data = null;
        if (shimRecord.data.has(id)) {
            data = shimRecord.data.get(id);
        }
        return { data, tcb, tcbPath, tcbIsShim: tcbPath === shimPath };
    }
    isTrackedTypeCheckFile(filePath) {
        return this.getFileAndShimRecordsForPath(filePath) !== null;
    }
    getFileRecordForTcbLocation({ tcbPath, isShimFile, }) {
        if (!isShimFile) {
            // The location is not within a shim file but corresponds with an inline TCB in an original
            // source file; we can obtain the record directly by its path.
            if (this.state.has(tcbPath)) {
                return this.state.get(tcbPath);
            }
            else {
                return null;
            }
        }
        // The location is within a type-checking shim file; find the type-checking data that owns this
        // shim path.
        const records = this.getFileAndShimRecordsForPath(tcbPath);
        if (records !== null) {
            return records.fileRecord;
        }
        else {
            return null;
        }
    }
    getFileAndShimRecordsForPath(shimPath) {
        for (const fileRecord of this.state.values()) {
            if (fileRecord.shimData.has(shimPath)) {
                return { fileRecord, shimRecord: fileRecord.shimData.get(shimPath) };
            }
        }
        return null;
    }
    getSourceMappingAtTcbLocation(tcbLocation) {
        const fileRecord = this.getFileRecordForTcbLocation(tcbLocation);
        if (fileRecord === null) {
            return null;
        }
        const shimSf = this.programDriver.getProgram().getSourceFile(tcbLocation.tcbPath);
        if (shimSf === undefined) {
            return null;
        }
        return getSourceMapping(shimSf, tcbLocation.positionInFile, fileRecord.sourceManager, 
        /*isDiagnosticsRequest*/ false);
    }
    generateAllTypeCheckBlocks() {
        this.ensureAllShimsForAllFiles();
    }
    /**
     * Retrieve type-checking and template parse diagnostics from the given `ts.SourceFile` using the
     * most recent type-checking program.
     */
    getDiagnosticsForFile(sf, optimizeFor) {
        switch (optimizeFor) {
            case exports.OptimizeFor.WholeProgram:
                this.ensureAllShimsForAllFiles();
                break;
            case exports.OptimizeFor.SingleFile:
                this.ensureAllShimsForOneFile(sf);
                break;
        }
        return this.perf.inPhase(exports.PerfPhase.TtcDiagnostics, () => {
            const sfPath = absoluteFromSourceFile(sf);
            const fileRecord = this.state.get(sfPath);
            const typeCheckProgram = this.programDriver.getProgram();
            const diagnostics = [];
            if (fileRecord.hasInlines) {
                const inlineSf = getSourceFileOrError(typeCheckProgram, sfPath);
                diagnostics.push(...typeCheckProgram
                    .getSemanticDiagnostics(inlineSf)
                    .map((diag) => convertDiagnostic(diag, fileRecord.sourceManager)));
            }
            for (const [shimPath, shimRecord] of fileRecord.shimData) {
                const shimSf = getSourceFileOrError(typeCheckProgram, shimPath);
                diagnostics.push(...typeCheckProgram
                    .getSemanticDiagnostics(shimSf)
                    .map((diag) => convertDiagnostic(diag, fileRecord.sourceManager)));
                diagnostics.push(...shimRecord.genesisDiagnostics);
                for (const templateData of shimRecord.data.values()) {
                    diagnostics.push(...templateData.templateParsingDiagnostics);
                }
            }
            return diagnostics.filter((diag) => diag !== null);
        });
    }
    getDiagnosticsForComponent(component) {
        this.ensureShimForComponent(component);
        return this.perf.inPhase(exports.PerfPhase.TtcDiagnostics, () => {
            const sf = component.getSourceFile();
            const sfPath = absoluteFromSourceFile(sf);
            const shimPath = TypeCheckShimGenerator.shimFor(sfPath);
            const fileRecord = this.getFileData(sfPath);
            if (!fileRecord.shimData.has(shimPath)) {
                return [];
            }
            const id = fileRecord.sourceManager.getTypeCheckId(component);
            const shimRecord = fileRecord.shimData.get(shimPath);
            const typeCheckProgram = this.programDriver.getProgram();
            const diagnostics = [];
            if (shimRecord.hasInlines) {
                const inlineSf = getSourceFileOrError(typeCheckProgram, sfPath);
                diagnostics.push(...typeCheckProgram
                    .getSemanticDiagnostics(inlineSf)
                    .map((diag) => convertDiagnostic(diag, fileRecord.sourceManager)));
            }
            const shimSf = getSourceFileOrError(typeCheckProgram, shimPath);
            diagnostics.push(...typeCheckProgram
                .getSemanticDiagnostics(shimSf)
                .map((diag) => convertDiagnostic(diag, fileRecord.sourceManager)));
            diagnostics.push(...shimRecord.genesisDiagnostics);
            for (const templateData of shimRecord.data.values()) {
                diagnostics.push(...templateData.templateParsingDiagnostics);
            }
            return diagnostics.filter((diag) => diag !== null && diag.typeCheckId === id);
        });
    }
    getTypeCheckBlock(component) {
        return this.getLatestComponentState(component).tcb;
    }
    getGlobalCompletions(context, component, node) {
        const engine = this.getOrCreateCompletionEngine(component);
        if (engine === null) {
            return null;
        }
        return this.perf.inPhase(exports.PerfPhase.TtcAutocompletion, () => engine.getGlobalCompletions(context, node));
    }
    getExpressionCompletionLocation(ast, component) {
        const engine = this.getOrCreateCompletionEngine(component);
        if (engine === null) {
            return null;
        }
        return this.perf.inPhase(exports.PerfPhase.TtcAutocompletion, () => engine.getExpressionCompletionLocation(ast));
    }
    getLiteralCompletionLocation(node, component) {
        const engine = this.getOrCreateCompletionEngine(component);
        if (engine === null) {
            return null;
        }
        return this.perf.inPhase(exports.PerfPhase.TtcAutocompletion, () => engine.getLiteralCompletionLocation(node));
    }
    invalidateClass(clazz) {
        this.completionCache.delete(clazz);
        this.symbolBuilderCache.delete(clazz);
        this.scopeCache.delete(clazz);
        this.elementTagCache.delete(clazz);
        const sf = clazz.getSourceFile();
        const sfPath = absoluteFromSourceFile(sf);
        const shimPath = TypeCheckShimGenerator.shimFor(sfPath);
        const fileData = this.getFileData(sfPath);
        fileData.sourceManager.getTypeCheckId(clazz);
        fileData.shimData.delete(shimPath);
        fileData.isComplete = false;
        this.isComplete = false;
    }
    getExpressionTarget(expression, clazz) {
        return (this.getLatestComponentState(clazz).data?.boundTarget.getExpressionTarget(expression) || null);
    }
    makeTemplateDiagnostic(clazz, sourceSpan, category, errorCode, message, relatedInformation) {
        const sfPath = absoluteFromSourceFile(clazz.getSourceFile());
        const fileRecord = this.state.get(sfPath);
        const id = fileRecord.sourceManager.getTypeCheckId(clazz);
        const mapping = fileRecord.sourceManager.getTemplateSourceMapping(id);
        return {
            ...makeTemplateDiagnostic(id, mapping, sourceSpan, category, ngErrorCode(errorCode), message, relatedInformation),
            __ngCode: errorCode,
        };
    }
    getOrCreateCompletionEngine(component) {
        if (this.completionCache.has(component)) {
            return this.completionCache.get(component);
        }
        const { tcb, data, tcbPath, tcbIsShim } = this.getLatestComponentState(component);
        if (tcb === null || data === null) {
            return null;
        }
        const engine = new CompletionEngine(tcb, data, tcbPath, tcbIsShim);
        this.completionCache.set(component, engine);
        return engine;
    }
    maybeAdoptPriorResults() {
        if (this.priorResultsAdopted) {
            return;
        }
        for (const sf of this.originalProgram.getSourceFiles()) {
            if (sf.isDeclarationFile || isShim(sf)) {
                continue;
            }
            const sfPath = absoluteFromSourceFile(sf);
            if (this.state.has(sfPath)) {
                const existingResults = this.state.get(sfPath);
                if (existingResults.isComplete) {
                    // All data for this file has already been generated, so no need to adopt anything.
                    continue;
                }
            }
            const previousResults = this.priorBuild.priorTypeCheckingResultsFor(sf);
            if (previousResults === null || !previousResults.isComplete) {
                continue;
            }
            this.perf.eventCount(exports.PerfEvent.ReuseTypeCheckFile);
            this.state.set(sfPath, previousResults);
        }
        this.priorResultsAdopted = true;
    }
    ensureAllShimsForAllFiles() {
        if (this.isComplete) {
            return;
        }
        this.maybeAdoptPriorResults();
        this.perf.inPhase(exports.PerfPhase.TcbGeneration, () => {
            const host = new WholeProgramTypeCheckingHost(this);
            const ctx = this.newContext(host);
            for (const sf of this.originalProgram.getSourceFiles()) {
                if (sf.isDeclarationFile || isShim(sf)) {
                    continue;
                }
                const sfPath = absoluteFromSourceFile(sf);
                const fileData = this.getFileData(sfPath);
                if (fileData.isComplete) {
                    continue;
                }
                this.typeCheckAdapter.typeCheck(sf, ctx);
                fileData.isComplete = true;
            }
            this.updateFromContext(ctx);
            this.isComplete = true;
        });
    }
    ensureAllShimsForOneFile(sf) {
        this.maybeAdoptPriorResults();
        this.perf.inPhase(exports.PerfPhase.TcbGeneration, () => {
            const sfPath = absoluteFromSourceFile(sf);
            const fileData = this.getFileData(sfPath);
            if (fileData.isComplete) {
                // All data for this file is present and accounted for already.
                return;
            }
            const host = new SingleFileTypeCheckingHost(sfPath, fileData, this);
            const ctx = this.newContext(host);
            this.typeCheckAdapter.typeCheck(sf, ctx);
            fileData.isComplete = true;
            this.updateFromContext(ctx);
        });
    }
    ensureShimForComponent(component) {
        this.maybeAdoptPriorResults();
        const sf = component.getSourceFile();
        const sfPath = absoluteFromSourceFile(sf);
        const shimPath = TypeCheckShimGenerator.shimFor(sfPath);
        const fileData = this.getFileData(sfPath);
        if (fileData.shimData.has(shimPath)) {
            // All data for this component is available.
            return;
        }
        const host = new SingleShimTypeCheckingHost(sfPath, fileData, this, shimPath);
        const ctx = this.newContext(host);
        this.typeCheckAdapter.typeCheck(sf, ctx);
        this.updateFromContext(ctx);
    }
    newContext(host) {
        const inlining = this.programDriver.supportsInlineOperations
            ? InliningMode.InlineOps
            : InliningMode.Error;
        return new TypeCheckContextImpl(this.config, this.compilerHost, this.refEmitter, this.reflector, host, inlining, this.perf);
    }
    /**
     * Remove any shim data that depends on inline operations applied to the type-checking program.
     *
     * This can be useful if new inlines need to be applied, and it's not possible to guarantee that
     * they won't overwrite or corrupt existing inlines that are used by such shims.
     */
    clearAllShimDataUsingInlines() {
        for (const fileData of this.state.values()) {
            if (!fileData.hasInlines) {
                continue;
            }
            for (const [shimFile, shimData] of fileData.shimData.entries()) {
                if (shimData.hasInlines) {
                    fileData.shimData.delete(shimFile);
                }
            }
            fileData.hasInlines = false;
            fileData.isComplete = false;
            this.isComplete = false;
        }
    }
    updateFromContext(ctx) {
        const updates = ctx.finalize();
        return this.perf.inPhase(exports.PerfPhase.TcbUpdateProgram, () => {
            if (updates.size > 0) {
                this.perf.eventCount(exports.PerfEvent.UpdateTypeCheckProgram);
            }
            this.programDriver.updateFiles(updates, exports.UpdateMode.Incremental);
            this.priorBuild.recordSuccessfulTypeCheck(this.state);
            this.perf.memory(exports.PerfCheckpoint.TtcUpdateProgram);
        });
    }
    getFileData(path) {
        if (!this.state.has(path)) {
            this.state.set(path, {
                hasInlines: false,
                sourceManager: new DirectiveSourceManager(),
                isComplete: false,
                shimData: new Map(),
            });
        }
        return this.state.get(path);
    }
    getSymbolOfNode(node, component) {
        const builder = this.getOrCreateSymbolBuilder(component);
        if (builder === null) {
            return null;
        }
        return this.perf.inPhase(exports.PerfPhase.TtcSymbol, () => builder.getSymbol(node));
    }
    getOrCreateSymbolBuilder(component) {
        if (this.symbolBuilderCache.has(component)) {
            return this.symbolBuilderCache.get(component);
        }
        const { tcb, data, tcbPath, tcbIsShim } = this.getLatestComponentState(component);
        if (tcb === null || data === null) {
            return null;
        }
        const builder = new SymbolBuilder(tcbPath, tcbIsShim, tcb, data, this.componentScopeReader, () => this.programDriver.getProgram().getTypeChecker());
        this.symbolBuilderCache.set(component, builder);
        return builder;
    }
    getPotentialTemplateDirectives(component) {
        const typeChecker = this.programDriver.getProgram().getTypeChecker();
        const inScopeDirectives = this.getScopeData(component)?.directives ?? [];
        const resultingDirectives = new Map();
        // First, all in scope directives can be used.
        for (const d of inScopeDirectives) {
            resultingDirectives.set(d.ref.node, d);
        }
        // Any additional directives found from the global registry can be used, but are not in scope.
        // In the future, we can also walk other registries for .d.ts files, or traverse the
        // import/export graph.
        for (const directiveClass of this.localMetaReader.getKnown(exports.MetaKind.Directive)) {
            const directiveMeta = this.metaReader.getDirectiveMetadata(new Reference(directiveClass));
            if (directiveMeta === null)
                continue;
            if (resultingDirectives.has(directiveClass))
                continue;
            const withScope = this.scopeDataOfDirectiveMeta(typeChecker, directiveMeta);
            if (withScope === null)
                continue;
            resultingDirectives.set(directiveClass, { ...withScope, isInScope: false });
        }
        return Array.from(resultingDirectives.values());
    }
    getPotentialPipes(component) {
        // Very similar to the above `getPotentialTemplateDirectives`, but on pipes.
        const typeChecker = this.programDriver.getProgram().getTypeChecker();
        const inScopePipes = this.getScopeData(component)?.pipes ?? [];
        const resultingPipes = new Map();
        for (const p of inScopePipes) {
            resultingPipes.set(p.ref.node, p);
        }
        for (const pipeClass of this.localMetaReader.getKnown(exports.MetaKind.Pipe)) {
            const pipeMeta = this.metaReader.getPipeMetadata(new Reference(pipeClass));
            if (pipeMeta === null)
                continue;
            if (resultingPipes.has(pipeClass))
                continue;
            const withScope = this.scopeDataOfPipeMeta(typeChecker, pipeMeta);
            if (withScope === null)
                continue;
            resultingPipes.set(pipeClass, { ...withScope, isInScope: false });
        }
        return Array.from(resultingPipes.values());
    }
    getDirectiveMetadata(dir) {
        if (!isNamedClassDeclaration(dir)) {
            return null;
        }
        return this.typeCheckScopeRegistry.getTypeCheckDirectiveMetadata(new Reference(dir));
    }
    getNgModuleMetadata(module) {
        if (!isNamedClassDeclaration(module)) {
            return null;
        }
        return this.metaReader.getNgModuleMetadata(new Reference(module));
    }
    getPipeMetadata(pipe) {
        if (!isNamedClassDeclaration(pipe)) {
            return null;
        }
        return this.metaReader.getPipeMetadata(new Reference(pipe));
    }
    getPotentialElementTags(component) {
        if (this.elementTagCache.has(component)) {
            return this.elementTagCache.get(component);
        }
        const tagMap = new Map();
        for (const tag of REGISTRY.allKnownElementNames()) {
            tagMap.set(tag, null);
        }
        const potentialDirectives = this.getPotentialTemplateDirectives(component);
        for (const directive of potentialDirectives) {
            if (directive.selector === null) {
                continue;
            }
            for (const selector of CssSelector.parse(directive.selector)) {
                if (selector.element === null || tagMap.has(selector.element)) {
                    // Skip this directive if it doesn't match an element tag, or if another directive has
                    // already been included with the same eZlement name.
                    continue;
                }
                tagMap.set(selector.element, directive);
            }
        }
        this.elementTagCache.set(component, tagMap);
        return tagMap;
    }
    getPotentialDomBindings(tagName) {
        const attributes = REGISTRY.allKnownAttributesOfElement(tagName);
        return attributes.map((attribute) => ({
            attribute,
            property: REGISTRY.getMappedPropName(attribute),
        }));
    }
    getPotentialDomEvents(tagName) {
        return REGISTRY.allKnownEventsOfElement(tagName);
    }
    getPrimaryAngularDecorator(target) {
        this.ensureAllShimsForOneFile(target.getSourceFile());
        if (!isNamedClassDeclaration(target)) {
            return null;
        }
        const ref = new Reference(target);
        const dirMeta = this.metaReader.getDirectiveMetadata(ref);
        if (dirMeta !== null) {
            return dirMeta.decorator;
        }
        const pipeMeta = this.metaReader.getPipeMetadata(ref);
        if (pipeMeta !== null) {
            return pipeMeta.decorator;
        }
        const ngModuleMeta = this.metaReader.getNgModuleMetadata(ref);
        if (ngModuleMeta !== null) {
            return ngModuleMeta.decorator;
        }
        return null;
    }
    getOwningNgModule(component) {
        if (!isNamedClassDeclaration(component)) {
            return null;
        }
        const dirMeta = this.metaReader.getDirectiveMetadata(new Reference(component));
        if (dirMeta !== null && dirMeta.isStandalone) {
            return null;
        }
        const scope = this.componentScopeReader.getScopeForComponent(component);
        if (scope === null ||
            scope.kind !== exports.ComponentScopeKind.NgModule ||
            !isNamedClassDeclaration(scope.ngModule)) {
            return null;
        }
        return scope.ngModule;
    }
    emit(kind, refTo, inContext) {
        const emittedRef = this.refEmitter.emit(refTo, inContext.getSourceFile());
        if (emittedRef.kind === exports.ReferenceEmitKind.Failed) {
            return null;
        }
        const emitted = emittedRef.expression;
        if (emitted instanceof WrappedNodeExpr) {
            if (refTo.node === inContext) {
                // Suppress self-imports since components do not have to import themselves.
                return null;
            }
            let isForwardReference = false;
            if (emitted.node.getStart() > inContext.getStart()) {
                const declaration = this.programDriver
                    .getProgram()
                    .getTypeChecker()
                    .getTypeAtLocation(emitted.node)
                    .getSymbol()?.declarations?.[0];
                if (declaration && declaration.getSourceFile() === inContext.getSourceFile()) {
                    isForwardReference = true;
                }
            }
            // An appropriate identifier is already in scope.
            return { kind, symbolName: emitted.node.text, isForwardReference };
        }
        else if (emitted instanceof ExternalExpr &&
            emitted.value.moduleName !== null &&
            emitted.value.name !== null) {
            return {
                kind,
                moduleSpecifier: emitted.value.moduleName,
                symbolName: emitted.value.name,
                isForwardReference: false,
            };
        }
        return null;
    }
    getPotentialImportsFor(toImport, inContext, importMode) {
        const imports = [];
        const meta = this.metaReader.getDirectiveMetadata(toImport) ?? this.metaReader.getPipeMetadata(toImport);
        if (meta === null) {
            return imports;
        }
        if (meta.isStandalone || importMode === exports.PotentialImportMode.ForceDirect) {
            const emitted = this.emit(exports.PotentialImportKind.Standalone, toImport, inContext);
            if (emitted !== null) {
                imports.push(emitted);
            }
        }
        const exportingNgModules = this.ngModuleIndex.getNgModulesExporting(meta.ref.node);
        if (exportingNgModules !== null) {
            for (const exporter of exportingNgModules) {
                const emittedRef = this.emit(exports.PotentialImportKind.NgModule, exporter, inContext);
                if (emittedRef !== null) {
                    imports.push(emittedRef);
                }
            }
        }
        return imports;
    }
    getScopeData(component) {
        if (this.scopeCache.has(component)) {
            return this.scopeCache.get(component);
        }
        if (!isNamedClassDeclaration(component)) {
            throw new Error(`AssertionError: components must have names`);
        }
        const scope = this.componentScopeReader.getScopeForComponent(component);
        if (scope === null) {
            return null;
        }
        const dependencies = scope.kind === exports.ComponentScopeKind.NgModule
            ? scope.compilation.dependencies
            : scope.dependencies;
        const data = {
            directives: [],
            pipes: [],
            isPoisoned: scope.kind === exports.ComponentScopeKind.NgModule
                ? scope.compilation.isPoisoned
                : scope.isPoisoned,
        };
        const typeChecker = this.programDriver.getProgram().getTypeChecker();
        for (const dep of dependencies) {
            if (dep.kind === exports.MetaKind.Directive) {
                const dirScope = this.scopeDataOfDirectiveMeta(typeChecker, dep);
                if (dirScope === null)
                    continue;
                data.directives.push({ ...dirScope, isInScope: true });
            }
            else if (dep.kind === exports.MetaKind.Pipe) {
                const pipeScope = this.scopeDataOfPipeMeta(typeChecker, dep);
                if (pipeScope === null)
                    continue;
                data.pipes.push({ ...pipeScope, isInScope: true });
            }
        }
        this.scopeCache.set(component, data);
        return data;
    }
    scopeDataOfDirectiveMeta(typeChecker, dep) {
        if (dep.selector === null) {
            // Skip this directive, it can't be added to a template anyway.
            return null;
        }
        const tsSymbol = typeChecker.getSymbolAtLocation(dep.ref.node.name);
        if (!isSymbolWithValueDeclaration(tsSymbol)) {
            return null;
        }
        let ngModule = null;
        const moduleScopeOfDir = this.componentScopeReader.getScopeForComponent(dep.ref.node);
        if (moduleScopeOfDir !== null && moduleScopeOfDir.kind === exports.ComponentScopeKind.NgModule) {
            ngModule = moduleScopeOfDir.ngModule;
        }
        return {
            ref: dep.ref,
            isComponent: dep.isComponent,
            isStructural: dep.isStructural,
            selector: dep.selector,
            tsSymbol,
            ngModule,
        };
    }
    scopeDataOfPipeMeta(typeChecker, dep) {
        const tsSymbol = typeChecker.getSymbolAtLocation(dep.ref.node.name);
        if (tsSymbol === undefined) {
            return null;
        }
        return {
            ref: dep.ref,
            name: dep.name,
            tsSymbol,
        };
    }
}
function convertDiagnostic(diag, sourceResolver) {
    if (!shouldReportDiagnostic(diag)) {
        return null;
    }
    return translateDiagnostic(diag, sourceResolver);
}
/**
 * Drives a `TypeCheckContext` to generate type-checking code for every component in the program.
 */
class WholeProgramTypeCheckingHost {
    impl;
    constructor(impl) {
        this.impl = impl;
    }
    getSourceManager(sfPath) {
        return this.impl.getFileData(sfPath).sourceManager;
    }
    shouldCheckClass(node) {
        const sfPath = absoluteFromSourceFile(node.getSourceFile());
        const shimPath = TypeCheckShimGenerator.shimFor(sfPath);
        const fileData = this.impl.getFileData(sfPath);
        // The component needs to be checked unless the shim which would contain it already exists.
        return !fileData.shimData.has(shimPath);
    }
    recordShimData(sfPath, data) {
        const fileData = this.impl.getFileData(sfPath);
        fileData.shimData.set(data.path, data);
        if (data.hasInlines) {
            fileData.hasInlines = true;
        }
    }
    recordComplete(sfPath) {
        this.impl.getFileData(sfPath).isComplete = true;
    }
}
/**
 * Drives a `TypeCheckContext` to generate type-checking code efficiently for a single input file.
 */
class SingleFileTypeCheckingHost {
    sfPath;
    fileData;
    impl;
    seenInlines = false;
    constructor(sfPath, fileData, impl) {
        this.sfPath = sfPath;
        this.fileData = fileData;
        this.impl = impl;
    }
    assertPath(sfPath) {
        if (this.sfPath !== sfPath) {
            throw new Error(`AssertionError: querying TypeCheckingHost outside of assigned file`);
        }
    }
    getSourceManager(sfPath) {
        this.assertPath(sfPath);
        return this.fileData.sourceManager;
    }
    shouldCheckClass(node) {
        if (this.sfPath !== absoluteFromSourceFile(node.getSourceFile())) {
            return false;
        }
        const shimPath = TypeCheckShimGenerator.shimFor(this.sfPath);
        // Only need to generate a TCB for the class if no shim exists for it currently.
        return !this.fileData.shimData.has(shimPath);
    }
    recordShimData(sfPath, data) {
        this.assertPath(sfPath);
        // Previous type-checking state may have required the use of inlines (assuming they were
        // supported). If the current operation also requires inlines, this presents a problem:
        // generating new inlines may invalidate any old inlines that old state depends on.
        //
        // Rather than resolve this issue by tracking specific dependencies on inlines, if the new state
        // relies on inlines, any old state that relied on them is simply cleared. This happens when the
        // first new state that uses inlines is encountered.
        if (data.hasInlines && !this.seenInlines) {
            this.impl.clearAllShimDataUsingInlines();
            this.seenInlines = true;
        }
        this.fileData.shimData.set(data.path, data);
        if (data.hasInlines) {
            this.fileData.hasInlines = true;
        }
    }
    recordComplete(sfPath) {
        this.assertPath(sfPath);
        this.fileData.isComplete = true;
    }
}
/**
 * Drives a `TypeCheckContext` to generate type-checking code efficiently for only those components
 * which map to a single shim of a single input file.
 */
class SingleShimTypeCheckingHost extends SingleFileTypeCheckingHost {
    shimPath;
    constructor(sfPath, fileData, impl, shimPath) {
        super(sfPath, fileData, impl);
        this.shimPath = shimPath;
    }
    shouldCheckNode(node) {
        if (this.sfPath !== absoluteFromSourceFile(node.getSourceFile())) {
            return false;
        }
        // Only generate a TCB for the component if it maps to the requested shim file.
        const shimPath = TypeCheckShimGenerator.shimFor(this.sfPath);
        if (shimPath !== this.shimPath) {
            return false;
        }
        // Only need to generate a TCB for the class if no shim exists for it currently.
        return !this.fileData.shimData.has(shimPath);
    }
}

exports.AST = AST;
exports.ASTWithSource = ASTWithSource;
exports.AbsoluteModuleStrategy = AbsoluteModuleStrategy;
exports.ArrowFunctionExpr = ArrowFunctionExpr;
exports.Binary = Binary;
exports.BlockPlaceholder = BlockPlaceholder;
exports.BoundAttribute = BoundAttribute;
exports.BoundDeferredTrigger = BoundDeferredTrigger;
exports.BoundEvent = BoundEvent;
exports.COMPILER_ERRORS_WITH_GUIDES = COMPILER_ERRORS_WITH_GUIDES;
exports.CR = CR;
exports.CUSTOM_ELEMENTS_SCHEMA = CUSTOM_ELEMENTS_SCHEMA;
exports.Call = Call;
exports.Chain = Chain;
exports.ClassPropertyMapping = ClassPropertyMapping;
exports.CloneVisitor = CloneVisitor;
exports.CompoundMetadataReader = CompoundMetadataReader;
exports.Conditional = Conditional;
exports.ConstantPool = ConstantPool;
exports.Container = Container;
exports.CssSelector = CssSelector;
exports.DEFAULT_INTERPOLATION_CONFIG = DEFAULT_INTERPOLATION_CONFIG;
exports.DYNAMIC_TYPE = DYNAMIC_TYPE;
exports.Declaration = Declaration;
exports.DeclareFunctionStmt = DeclareFunctionStmt;
exports.DeclareVarStmt = DeclareVarStmt;
exports.DefaultImportTracker = DefaultImportTracker;
exports.DefinitionMap = DefinitionMap;
exports.DomElementSchemaRegistry = DomElementSchemaRegistry;
exports.DynamicImportExpr = DynamicImportExpr;
exports.DynamicValue = DynamicValue;
exports.Element = Element;
exports.Element$1 = Element$1;
exports.EnumValue = EnumValue;
exports.ExternalExpr = ExternalExpr;
exports.FatalDiagnosticError = FatalDiagnosticError;
exports.FnParam = FnParam;
exports.FunctionExpr = FunctionExpr;
exports.HtmlParser = HtmlParser;
exports.I18nError = I18nError;
exports.INPUT_INITIALIZER_FN = INPUT_INITIALIZER_FN;
exports.Icu = Icu;
exports.IcuPlaceholder = IcuPlaceholder;
exports.Identifiers = Identifiers;
exports.ImplicitReceiver = ImplicitReceiver;
exports.ImportManager = ImportManager;
exports.Interpolation = Interpolation$1;
exports.InterpolationConfig = InterpolationConfig;
exports.InvokeFunctionExpr = InvokeFunctionExpr;
exports.LetDeclaration = LetDeclaration$1;
exports.LiteralArrayExpr = LiteralArrayExpr;
exports.LiteralExpr = LiteralExpr;
exports.LocalIdentifierStrategy = LocalIdentifierStrategy;
exports.LogicalFileSystem = LogicalFileSystem;
exports.LogicalProjectStrategy = LogicalProjectStrategy;
exports.MODEL_INITIALIZER_FN = MODEL_INITIALIZER_FN;
exports.Message = Message;
exports.NO_ERRORS_SCHEMA = NO_ERRORS_SCHEMA;
exports.NULL_EXPR = NULL_EXPR;
exports.NgOriginalFile = NgOriginalFile;
exports.NodeJSFileSystem = NodeJSFileSystem;
exports.OUTPUT_INITIALIZER_FNS = OUTPUT_INITIALIZER_FNS;
exports.ParseLocation = ParseLocation;
exports.ParseSourceFile = ParseSourceFile;
exports.ParseSourceSpan = ParseSourceSpan;
exports.Parser = Parser$1;
exports.Placeholder = Placeholder;
exports.PropertyRead = PropertyRead;
exports.PropertyWrite = PropertyWrite;
exports.QUERY_INITIALIZER_FNS = QUERY_INITIALIZER_FNS;
exports.R3TargetBinder = R3TargetBinder;
exports.ReadVarExpr = ReadVarExpr;
exports.RecursiveAstVisitor = RecursiveAstVisitor;
exports.RecursiveAstVisitor$1 = RecursiveAstVisitor$1;
exports.RecursiveVisitor = RecursiveVisitor;
exports.RecursiveVisitor$1 = RecursiveVisitor$1;
exports.Reference = Reference;
exports.Reference$1 = Reference$1;
exports.ReferenceEmitter = ReferenceEmitter;
exports.RelativePathStrategy = RelativePathStrategy;
exports.ReturnStatement = ReturnStatement;
exports.SafeCall = SafeCall;
exports.SafeKeyedRead = SafeKeyedRead;
exports.SafePropertyRead = SafePropertyRead;
exports.SelectorMatcher = SelectorMatcher;
exports.Serializer = Serializer;
exports.StaticInterpreter = StaticInterpreter;
exports.SyntheticValue = SyntheticValue;
exports.Tag = Tag;
exports.TagPlaceholder = TagPlaceholder;
exports.Template = Template;
exports.TemplateTypeCheckerImpl = TemplateTypeCheckerImpl;
exports.Text = Text;
exports.Text$1 = Text$1;
exports.Text$2 = Text$2;
exports.TextAttribute = TextAttribute;
exports.ThisReceiver = ThisReceiver;
exports.Trait = Trait;
exports.TypeCheckShimGenerator = TypeCheckShimGenerator;
exports.TypeScriptReflectionHost = TypeScriptReflectionHost;
exports.UNSAFE_OBJECT_KEY_NAME_REGEXP = UNSAFE_OBJECT_KEY_NAME_REGEXP;
exports.UnifiedModulesStrategy = UnifiedModulesStrategy;
exports.Variable = Variable;
exports.Version = Version;
exports.WhitespaceVisitor = WhitespaceVisitor;
exports.WrappedNodeExpr = WrappedNodeExpr;
exports.Xmb = Xmb;
exports.absoluteFrom = absoluteFrom;
exports.absoluteFromSourceFile = absoluteFromSourceFile;
exports.arrowFn = arrowFn;
exports.asLiteral = asLiteral;
exports.assertLocalCompilationUnresolvedConst = assertLocalCompilationUnresolvedConst;
exports.assertSuccessfulReferenceEmit = assertSuccessfulReferenceEmit;
exports.checkInheritanceOfInjectable = checkInheritanceOfInjectable;
exports.combineResolvers = combineResolvers;
exports.compileComponentFromMetadata = compileComponentFromMetadata;
exports.compileDeferResolverFunction = compileDeferResolverFunction;
exports.compileDirectiveFromMetadata = compileDirectiveFromMetadata;
exports.compileFactoryFunction = compileFactoryFunction;
exports.compileInjectable = compileInjectable;
exports.compileInjector = compileInjector;
exports.compileNgModule = compileNgModule;
exports.compilePipeFromMetadata = compilePipeFromMetadata;
exports.compileResults = compileResults;
exports.conditionallyCreateDirectiveBindingLiteral = conditionallyCreateDirectiveBindingLiteral;
exports.convertFromMaybeForwardRefExpression = convertFromMaybeForwardRefExpression;
exports.copyFileShimData = copyFileShimData;
exports.createComponentType = createComponentType;
exports.createDirectiveType = createDirectiveType;
exports.createFactoryType = createFactoryType;
exports.createForwardRefResolver = createForwardRefResolver;
exports.createHostDirectivesMappingArray = createHostDirectivesMappingArray;
exports.createInjectableType = createInjectableType;
exports.createInjectorType = createInjectorType;
exports.createMayBeForwardRefExpression = createMayBeForwardRefExpression;
exports.createNgModuleType = createNgModuleType;
exports.createPipeType = createPipeType;
exports.createValueHasWrongTypeError = createValueHasWrongTypeError;
exports.decimalDigest = decimalDigest;
exports.devOnlyGuardedExpression = devOnlyGuardedExpression;
exports.digest = digest$1;
exports.dirname = dirname;
exports.entityNameToValue = entityNameToValue;
exports.extraReferenceFromTypeQuery = extraReferenceFromTypeQuery;
exports.extractDecoratorQueryMetadata = extractDecoratorQueryMetadata;
exports.extractDirectiveMetadata = extractDirectiveMetadata;
exports.extractDirectiveTypeCheckMeta = extractDirectiveTypeCheckMeta;
exports.extractMessages = extractMessages;
exports.extractReferencesFromType = extractReferencesFromType;
exports.findAngularDecorator = findAngularDecorator;
exports.flattenInheritedDirectiveMetadata = flattenInheritedDirectiveMetadata;
exports.generateForwardRef = generateForwardRef;
exports.getAngularDecorators = getAngularDecorators;
exports.getConstructorDependencies = getConstructorDependencies;
exports.getContainingImportDeclaration = getContainingImportDeclaration;
exports.getDefaultImportDeclaration = getDefaultImportDeclaration;
exports.getDirectiveDiagnostics = getDirectiveDiagnostics;
exports.getFileSystem = getFileSystem;
exports.getOriginNodeForDiagnostics = getOriginNodeForDiagnostics;
exports.getProviderDiagnostics = getProviderDiagnostics;
exports.getRootDirs = getRootDirs;
exports.getSourceFile = getSourceFile;
exports.getSourceFileOrNull = getSourceFileOrNull;
exports.getTemplateDiagnostics = getTemplateDiagnostics;
exports.getUndecoratedClassWithAngularFeaturesDiagnostic = getUndecoratedClassWithAngularFeaturesDiagnostic;
exports.getValidConstructorDependencies = getValidConstructorDependencies;
exports.hasInjectableFields = hasInjectableFields;
exports.identifierOfNode = identifierOfNode;
exports.importExpr = importExpr;
exports.isAbstractClassDeclaration = isAbstractClassDeclaration;
exports.isAliasImportDeclaration = isAliasImportDeclaration;
exports.isAngularCore = isAngularCore;
exports.isAngularCoreReferenceWithPotentialAliasing = isAngularCoreReferenceWithPotentialAliasing;
exports.isAngularDecorator = isAngularDecorator;
exports.isDtsPath = isDtsPath;
exports.isExpressionForwardReference = isExpressionForwardReference;
exports.isFatalDiagnosticError = isFatalDiagnosticError;
exports.isFileShimSourceFile = isFileShimSourceFile;
exports.isHostDirectiveMetaForGlobalMode = isHostDirectiveMetaForGlobalMode;
exports.isLocalRelativePath = isLocalRelativePath;
exports.isNamedClassDeclaration = isNamedClassDeclaration;
exports.isNonDeclarationTsPath = isNonDeclarationTsPath;
exports.isShim = isShim;
exports.join = join;
exports.literal = literal$1;
exports.literalArr = literalArr;
exports.literalMap = literalMap;
exports.loadIsReferencedAliasDeclarationPatch = loadIsReferencedAliasDeclarationPatch;
exports.makeBindingParser = makeBindingParser;
exports.makeDiagnostic = makeDiagnostic;
exports.makeDuplicateDeclarationError = makeDuplicateDeclarationError;
exports.makeRelatedInformation = makeRelatedInformation;
exports.mapLiteral = mapLiteral;
exports.ngErrorCode = ngErrorCode;
exports.nodeDebugInfo = nodeDebugInfo;
exports.nodeNameForError = nodeNameForError;
exports.parseDecoratorInputTransformFunction = parseDecoratorInputTransformFunction;
exports.parseDirectiveStyles = parseDirectiveStyles;
exports.parseTemplate = parseTemplate;
exports.presetImportManagerForceNamespaceImports = presetImportManagerForceNamespaceImports;
exports.queryDecoratorNames = queryDecoratorNames;
exports.readBaseClass = readBaseClass;
exports.readBooleanType = readBooleanType;
exports.readMapType = readMapType;
exports.readStringArrayType = readStringArrayType;
exports.readStringType = readStringType;
exports.reflectClassMember = reflectClassMember;
exports.reflectObjectLiteral = reflectObjectLiteral;
exports.refsToArray = refsToArray;
exports.relative = relative;
exports.resolve = resolve;
exports.resolveImportedFile = resolveImportedFile;
exports.resolveModuleName = resolveModuleName;
exports.resolveProvidersRequiringFactory = resolveProvidersRequiringFactory;
exports.retagAllTsFiles = retagAllTsFiles;
exports.serialize = serialize$1;
exports.setFileSystem = setFileSystem;
exports.sfExtensionData = sfExtensionData;
exports.stripExtension = stripExtension;
exports.toFactoryMetadata = toFactoryMetadata;
exports.toR3Reference = toR3Reference;
exports.toRelativeImport = toRelativeImport;
exports.toUnredirectedSourceFile = toUnredirectedSourceFile;
exports.translateExpression = translateExpression;
exports.translateStatement = translateStatement;
exports.translateType = translateType;
exports.transplantedType = transplantedType;
exports.tryParseInitializerApi = tryParseInitializerApi;
exports.tryParseInitializerBasedOutput = tryParseInitializerBasedOutput;
exports.tryParseSignalInputMapping = tryParseSignalInputMapping;
exports.tryParseSignalModelMapping = tryParseSignalModelMapping;
exports.tryParseSignalQueryFromInitializer = tryParseSignalQueryFromInitializer;
exports.tryUnwrapForwardRef = tryUnwrapForwardRef;
exports.typeNodeToValueExpr = typeNodeToValueExpr;
exports.untagAllTsFiles = untagAllTsFiles;
exports.unwrapConstructorDependencies = unwrapConstructorDependencies;
exports.unwrapExpression = unwrapExpression;
exports.validateConstructorDependencies = validateConstructorDependencies;
exports.validateHostDirectives = validateHostDirectives;
exports.valueReferenceToExpression = valueReferenceToExpression;
exports.variable = variable;
exports.visitAll = visitAll;
exports.visitAll$1 = visitAll$1;
exports.visitAllWithSiblings = visitAllWithSiblings;
exports.wrapFunctionExpressionsInParens = wrapFunctionExpressionsInParens;
exports.wrapTypeReference = wrapTypeReference;
Exf7'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

require('@angular-devkit/core');
require('node:path/posix');
var project_paths = require('./project_paths-DY3SIODd.cjs');
var ts = require('typescript');
require('os');
var checker = require('./checker-BwV9MjSQ.cjs');
var index = require('./index-BnJH1Hc7.cjs');
require('path');
var apply_import_manager = require('./apply_import_manager-DF0BUe6N.cjs');
var leading_space = require('./leading_space-D9nQ8UQC.cjs');
require('@angular-devkit/schematics');
require('./project_tsconfig_paths-CDVxT6Ov.cjs');
require('fs');
require('module');
require('url');

/** Migration that cleans up unused imports from a project. */
class UnusedImportsMigration extends project_paths.TsurgeFunnelMigration {
    printer = ts.createPrinter();
    createProgram(tsconfigAbsPath, fs) {
        return super.createProgram(tsconfigAbsPath, fs, {
            extendedDiagnostics: {
                checks: {
                    // Ensure that the diagnostic is enabled.
                    unusedStandaloneImports: index.DiagnosticCategoryLabel.Warning,
                },
            },
        });
    }
    async analyze(info) {
        const nodePositions = new Map();
        const replacements = [];
        let removedImports = 0;
        let changedFiles = 0;
        info.ngCompiler?.getDiagnostics().forEach((diag) => {
            if (diag.file !== undefined &&
                diag.start !== undefined &&
                diag.length !== undefined &&
                diag.code === checker.ngErrorCode(checker.ErrorCode.UNUSED_STANDALONE_IMPORTS)) {
                // Skip files that aren't owned by this compilation unit.
                if (!info.sourceFiles.includes(diag.file)) {
                    return;
                }
                if (!nodePositions.has(diag.file)) {
                    nodePositions.set(diag.file, new Set());
                }
                nodePositions.get(diag.file).add(this.getNodeKey(diag.start, diag.length));
            }
        });
        nodePositions.forEach((locations, sourceFile) => {
            const resolvedLocations = this.resolveRemovalLocations(sourceFile, locations);
            const usageAnalysis = this.analyzeUsages(sourceFile, resolvedLocations);
            if (resolvedLocations.allRemovedIdentifiers.size > 0) {
                removedImports += resolvedLocations.allRemovedIdentifiers.size;
                changedFiles++;
            }
            this.generateReplacements(sourceFile, resolvedLocations, usageAnalysis, info, replacements);
        });
        return project_paths.confirmAsSerializable({ replacements, removedImports, changedFiles });
    }
    async migrate(globalData) {
        return project_paths.confirmAsSerializable(globalData);
    }
    async combine(unitA, unitB) {
        return project_paths.confirmAsSerializable({
            replacements: [...unitA.replacements, ...unitB.replacements],
            removedImports: unitA.removedImports + unitB.removedImports,
            changedFiles: unitA.changedFiles + unitB.changedFiles,
        });
    }
    async globalMeta(combinedData) {
        return project_paths.confirmAsSerializable(combinedData);
    }
    async stats(globalMetadata) {
        return {
            counters: {
                removedImports: globalMetadata.removedImports,
                changedFiles: globalMetadata.changedFiles,
            },
        };
    }
    /** Gets a key that can be used to look up a node based on its location. */
    getNodeKey(start, length) {
        return `${start}/${length}`;
    }
    /**
     * Resolves a set of node locations to the actual AST nodes that need to be migrated.
     * @param sourceFile File in which to resolve the locations.
     * @param locations Location keys that should be resolved.
     */
    resolveRemovalLocations(sourceFile, locations) {
        const result = {
            fullRemovals: new Set(),
            partialRemovals: new Map(),
            allRemovedIdentifiers: new Set(),
        };
        const walk = (node) => {
            if (!ts.isIdentifier(node)) {
                node.forEachChild(walk);
                return;
            }
            // The TS typings don't reflect that the parent can be undefined.
            const parent = node.parent;
            if (!parent) {
                return;
            }
            if (locations.has(this.getNodeKey(node.getStart(), node.getWidth()))) {
                // When the entire array needs to be cleared, the diagnostic is
                // reported on the property assignment, rather than an array element.
                if (ts.isPropertyAssignment(parent) &&
                    parent.name === node &&
                    ts.isArrayLiteralExpression(parent.initializer)) {
                    result.fullRemovals.add(parent.initializer);
                    parent.initializer.elements.forEach((element) => {
                        if (ts.isIdentifier(element)) {
                            result.allRemovedIdentifiers.add(element.text);
                        }
                    });
                }
                else if (ts.isArrayLiteralExpression(parent)) {
                    if (!result.partialRemovals.has(parent)) {
                        result.partialRemovals.set(parent, new Set());
                    }
                    result.partialRemovals.get(parent).add(node);
                    result.allRemovedIdentifiers.add(node.text);
                }
            }
        };
        walk(sourceFile);
        return result;
    }
    /**
     * Analyzes how identifiers are used across a file.
     * @param sourceFile File to be analyzed.
     * @param locations Locations that will be changed as a part of this migration.
     */
    analyzeUsages(sourceFile, locations) {
        const { partialRemovals, fullRemovals } = locations;
        const result = {
            importedSymbols: new Map(),
            identifierCounts: new Map(),
        };
        const walk = (node) => {
            if (ts.isIdentifier(node) &&
                node.parent &&
                // Don't track individual identifiers marked for removal.
                (!ts.isArrayLiteralExpression(node.parent) ||
                    !partialRemovals.has(node.parent) ||
                    !partialRemovals.get(node.parent).has(node))) {
                result.identifierCounts.set(node.text, (result.identifierCounts.get(node.text) ?? 0) + 1);
            }
            // Don't track identifiers in array literals that are about to be removed.
            if (ts.isArrayLiteralExpression(node) && fullRemovals.has(node)) {
                return;
            }
            if (ts.isImportDeclaration(node)) {
                const namedBindings = node.importClause?.namedBindings;
                const moduleName = ts.isStringLiteral(node.moduleSpecifier)
                    ? node.moduleSpecifier.text
                    : null;
                if (namedBindings && ts.isNamedImports(namedBindings) && moduleName !== null) {
                    namedBindings.elements.forEach((imp) => {
                        if (!result.importedSymbols.has(moduleName)) {
                            result.importedSymbols.set(moduleName, new Map());
                        }
                        const symbolName = (imp.propertyName || imp.name).text;
                        const localName = imp.name.text;
                        result.importedSymbols.get(moduleName).set(localName, symbolName);
                    });
                }
                // Don't track identifiers in imports.
                return;
            }
            // Track identifiers in all other node kinds.
            node.forEachChild(walk);
        };
        walk(sourceFile);
        return result;
    }
    /**
     * Generates text replacements based on the data produced by the migration.
     * @param sourceFile File being migrated.
     * @param removalLocations Data about nodes being removed.
     * @param usages Data about identifier usage.
     * @param info Information about the current program.
     * @param replacements Array tracking all text replacements.
     */
    generateReplacements(sourceFile, removalLocations, usages, info, replacements) {
        const { fullRemovals, partialRemovals, allRemovedIdentifiers } = removalLocations;
        const { importedSymbols, identifierCounts } = usages;
        const importManager = new checker.ImportManager();
        const sourceText = sourceFile.getFullText();
        // Replace full arrays with empty ones. This allows preserves more of the user's formatting.
        fullRemovals.forEach((node) => {
            replacements.push(new project_paths.Replacement(project_paths.projectFile(sourceFile, info), new project_paths.TextUpdate({
                position: node.getStart(),
                end: node.getEnd(),
                toInsert: '[]',
            })));
        });
        // Filter out the unused identifiers from an array.
        partialRemovals.forEach((toRemove, parent) => {
            toRemove.forEach((node) => {
                replacements.push(new project_paths.Replacement(project_paths.projectFile(sourceFile, info), getArrayElementRemovalUpdate(node, parent, sourceText)));
            });
        });
        // Attempt to clean up unused import declarations. Note that this isn't foolproof, because we
        // do the matching based on identifier text, rather than going through the type checker which
        // can be expensive. This should be enough for the vast majority of cases in this schematic
        // since we're dealing exclusively with directive/pipe class names which tend to be very
        // specific. In the worst case we may end up not removing an import declaration which would
        // still be valid code that the user can clean up themselves.
        importedSymbols.forEach((names, moduleName) => {
            names.forEach((symbolName, localName) => {
                // Note that in the `identifierCounts` lookup both zero and undefined
                // are valid and mean that the identifiers isn't being used anymore.
                if (allRemovedIdentifiers.has(localName) && !identifierCounts.get(localName)) {
                    importManager.removeImport(sourceFile, symbolName, moduleName);
                }
            });
        });
        apply_import_manager.applyImportManagerChanges(importManager, replacements, [sourceFile], info);
    }
}
/** Generates a `TextUpdate` for the removal of an array element. */
function getArrayElementRemovalUpdate(node, parent, sourceText) {
    let position = node.getStart();
    let end = node.getEnd();
    let toInsert = '';
    const whitespaceOrLineFeed = /\s/;
    // Usually the way we'd remove the nodes would be to recreate the `parent` while excluding
    // the nodes that should be removed. The problem with this is that it'll strip out comments
    // inside the array which can have special meaning internally. We work around it by removing
    // only the node's own offsets. This comes with another problem in that it won't remove the commas
    // that separate array elements which in turn can look weird if left in place (e.g.
    // `[One, Two, Three, Four]` can turn into `[One,,Four]`). To account for them, we start with the
    // node's end offset and then expand it to include trailing commas, whitespace and line breaks.
    for (let i = end; i < sourceText.length; i++) {
        if (sourceText[i] === ',' || whitespaceOrLineFeed.test(sourceText[i])) {
            end++;
        }
        else {
            break;
        }
    }
    // If we're removing the last element in the array, adjust the starting offset so that
    // it includes the previous comma on the same line. This avoids turning something like
    // `[One, Two, Three]` into `[One,]`. We only do this within the same like, because
    // trailing comma at the end of the line is fine.
    if (parent.elements[parent.elements.length - 1] === node) {
        for (let i = position - 1; i >= 0; i--) {
            if (sourceText[i] === ',' || sourceText[i] === ' ') {
                position--;
            }
            else {
                break;
            }
        }
        // Replace the node with its leading whitespace to preserve the formatting.
        toInsert = leading_space.getLeadingLineWhitespaceOfNode(node);
    }
    return new project_paths.TextUpdate({ position, end, toInsert });
}

function migrate() {
    return async (tree, context) => {
        await project_paths.runMigrationInDevkit({
            getMigration: () => new UnusedImportsMigration(),
            tree,
            beforeProgramCreation: (tsconfigPath, stage) => {
                if (stage === project_paths.MigrationStage.Analysis) {
                    context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
                }
                else {
                    context.logger.info(`Running migration for: ${tsconfigPath}...`);
                }
            },
            beforeUnitAnalysis: (tsconfigPath) => {
                context.logger.info(`Scanning for unused imports using ${tsconfigPath}`);
            },
            afterAnalysisFailure: () => {
                context.logger.error('Schematic failed unexpectedly with no analysis data');
            },
            whenDone: (stats) => {
                const { removedImports, changedFiles } = stats.counters;
                let statsMessage;
                if (removedImports === 0) {
                    statsMessage = 'Schematic could not find unused imports in the project';
                }
                else {
                    statsMessage =
                        `Removed ${removedImports} import${removedImports !== 1 ? 's' : ''} ` +
                            `in ${changedFiles} file${changedFiles !== 1 ? 's' : ''}`;
                }
                context.logger.info('');
                context.logger.info(statsMessage);
            },
        });
    };
}

exports.migrate = migrate;
PxJ8'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');
var checker = require('./checker-BwV9MjSQ.cjs');
require('os');
var p = require('path');

function _interopNamespaceDefault(e) {
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n.default = e;
    return Object.freeze(n);
}

var p__namespace = /*#__PURE__*/_interopNamespaceDefault(p);

/** Tracks changes that have to be made for specific files. */
class ChangeTracker {
    _printer;
    _importRemapper;
    _changes = new Map();
    _importManager;
    _quotesCache = new WeakMap();
    constructor(_printer, _importRemapper) {
        this._printer = _printer;
        this._importRemapper = _importRemapper;
        this._importManager = new checker.ImportManager({
            shouldUseSingleQuotes: (file) => this._getQuoteKind(file) === 0 /* QuoteKind.SINGLE */,
        });
    }
    /**
     * Tracks the insertion of some text.
     * @param sourceFile File in which the text is being inserted.
     * @param start Index at which the text is insert.
     * @param text Text to be inserted.
     */
    insertText(sourceFile, index, text) {
        this._trackChange(sourceFile, { start: index, text });
    }
    /**
     * Replaces text within a file.
     * @param sourceFile File in which to replace the text.
     * @param start Index from which to replace the text.
     * @param removeLength Length of the text being replaced.
     * @param text Text to be inserted instead of the old one.
     */
    replaceText(sourceFile, start, removeLength, text) {
        this._trackChange(sourceFile, { start, removeLength, text });
    }
    /**
     * Replaces the text of an AST node with a new one.
     * @param oldNode Node to be replaced.
     * @param newNode New node to be inserted.
     * @param emitHint Hint when formatting the text of the new node.
     * @param sourceFileWhenPrinting File to use when printing out the new node. This is important
     * when copying nodes from one file to another, because TypeScript might not output literal nodes
     * without it.
     */
    replaceNode(oldNode, newNode, emitHint = ts.EmitHint.Unspecified, sourceFileWhenPrinting) {
        const sourceFile = oldNode.getSourceFile();
        this.replaceText(sourceFile, oldNode.getStart(), oldNode.getWidth(), this._printer.printNode(emitHint, newNode, sourceFileWhenPrinting || sourceFile));
    }
    /**
     * Removes the text of an AST node from a file.
     * @param node Node whose text should be removed.
     * @param useFullOffsets Whether to remove the node using its full offset (e.g. `getFullStart`
     * rather than `fullStart`). This has the advantage of removing any comments that may be tied
     * to the node, but can lead to too much code being deleted.
     */
    removeNode(node, useFullOffsets = false) {
        this._trackChange(node.getSourceFile(), {
            start: useFullOffsets ? node.getFullStart() : node.getStart(),
            removeLength: useFullOffsets ? node.getFullWidth() : node.getWidth(),
            text: '',
        });
    }
    /**
     * Adds an import to a file.
     * @param sourceFile File to which to add the import.
     * @param symbolName Symbol being imported.
     * @param moduleName Module from which the symbol is imported.
     * @param alias Alias to use for the import.
     */
    addImport(sourceFile, symbolName, moduleName, alias) {
        if (this._importRemapper) {
            moduleName = this._importRemapper(moduleName, sourceFile.fileName);
        }
        // It's common for paths to be manipulated with Node's `path` utilties which
        // can yield a path with back slashes. Normalize them since outputting such
        // paths will also cause TS to escape the forward slashes.
        moduleName = normalizePath(moduleName);
        if (!this._changes.has(sourceFile)) {
            this._changes.set(sourceFile, []);
        }
        return this._importManager.addImport({
            requestedFile: sourceFile,
            exportSymbolName: symbolName,
            exportModuleSpecifier: moduleName,
            unsafeAliasOverride: alias,
        });
    }
    /**
     * Removes an import from a file.
     * @param sourceFile File from which to remove the import.
     * @param symbolName Original name of the symbol to be removed. Used even if the import is aliased.
     * @param moduleName Module from which the symbol is imported.
     */
    removeImport(sourceFile, symbolName, moduleName) {
        // It's common for paths to be manipulated with Node's `path` utilties which
        // can yield a path with back slashes. Normalize them since outputting such
        // paths will also cause TS to escape the forward slashes.
        moduleName = normalizePath(moduleName);
        if (!this._changes.has(sourceFile)) {
            this._changes.set(sourceFile, []);
        }
        this._importManager.removeImport(sourceFile, symbolName, moduleName);
    }
    /**
     * Gets the changes that should be applied to all the files in the migration.
     * The changes are sorted in the order in which they should be applied.
     */
    recordChanges() {
        this._recordImports();
        return this._changes;
    }
    /**
     * Clear the tracked changes
     */
    clearChanges() {
        this._changes.clear();
    }
    /**
     * Adds a change to a `ChangesByFile` map.
     * @param file File that the change is associated with.
     * @param change Change to be added.
     */
    _trackChange(file, change) {
        const changes = this._changes.get(file);
        if (changes) {
            // Insert the changes in reverse so that they're applied in reverse order.
            // This ensures that the offsets of subsequent changes aren't affected by
            // previous changes changing the file's text.
            const insertIndex = changes.findIndex((current) => current.start <= change.start);
            if (insertIndex === -1) {
                changes.push(change);
            }
            else {
                changes.splice(insertIndex, 0, change);
            }
        }
        else {
            this._changes.set(file, [change]);
        }
    }
    /** Determines what kind of quotes to use for a specific file. */
    _getQuoteKind(sourceFile) {
        if (this._quotesCache.has(sourceFile)) {
            return this._quotesCache.get(sourceFile);
        }
        let kind = 0 /* QuoteKind.SINGLE */;
        for (const statement of sourceFile.statements) {
            if (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {
                kind = statement.moduleSpecifier.getText()[0] === '"' ? 1 /* QuoteKind.DOUBLE */ : 0 /* QuoteKind.SINGLE */;
                this._quotesCache.set(sourceFile, kind);
                break;
            }
        }
        return kind;
    }
    /** Records the pending import changes from the import manager. */
    _recordImports() {
        const { newImports, updatedImports, deletedImports } = this._importManager.finalize();
        for (const [original, replacement] of updatedImports) {
            this.replaceNode(original, replacement);
        }
        for (const node of deletedImports) {
            this.removeNode(node);
        }
        for (const [sourceFile] of this._changes) {
            const importsToAdd = newImports.get(sourceFile.fileName);
            if (!importsToAdd) {
                continue;
            }
            const importLines = [];
            let lastImport = null;
            for (const statement of sourceFile.statements) {
                if (ts.isImportDeclaration(statement)) {
                    lastImport = statement;
                }
            }
            for (const decl of importsToAdd) {
                importLines.push(this._printer.printNode(ts.EmitHint.Unspecified, decl, sourceFile));
            }
            this.insertText(sourceFile, lastImport ? lastImport.getEnd() : 0, (lastImport ? '\n' : '') + importLines.join('\n'));
        }
    }
}
/** Normalizes a path to use posix separators. */
function normalizePath(path) {
    return path.replace(/\\/g, '/');
}

function parseTsconfigFile(tsconfigPath, basePath) {
    const { config } = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
    const parseConfigHost = {
        useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
        fileExists: ts.sys.fileExists,
        readDirectory: ts.sys.readDirectory,
        readFile: ts.sys.readFile,
    };
    // Throw if incorrect arguments are passed to this function. Passing relative base paths
    // results in root directories not being resolved and in later type checking runtime errors.
    // More details can be found here: https://github.com/microsoft/TypeScript/issues/37731.
    if (!p__namespace.isAbsolute(basePath)) {
        throw Error('Unexpected relative base path has been specified.');
    }
    return ts.parseJsonConfigFileContent(config, parseConfigHost, basePath, {});
}

/**
 * Creates a TypeScript program instance for a TypeScript project within
 * the virtual file system tree.
 * @param tree Virtual file system tree that contains the source files.
 * @param tsconfigPath Virtual file system path that resolves to the TypeScript project.
 * @param basePath Base path for the virtual file system tree.
 * @param fakeFileRead Optional file reader function. Can be used to overwrite files in
 *   the TypeScript program, or to add in-memory files (e.g. to add global types).
 * @param additionalFiles Additional file paths that should be added to the program.
 */
function createMigrationProgram(tree, tsconfigPath, basePath, fakeFileRead, additionalFiles) {
    const { rootNames, options, host } = createProgramOptions(tree, tsconfigPath, basePath, fakeFileRead);
    return ts.createProgram(rootNames, options, host);
}
/**
 * Creates the options necessary to instantiate a TypeScript program.
 * @param tree Virtual file system tree that contains the source files.
 * @param tsconfigPath Virtual file system path that resolves to the TypeScript project.
 * @param basePath Base path for the virtual file system tree.
 * @param fakeFileRead Optional file reader function. Can be used to overwrite files in
 *   the TypeScript program, or to add in-memory files (e.g. to add global types).
 * @param additionalFiles Additional file paths that should be added to the program.
 * @param optionOverrides Overrides of the parsed compiler options.
 */
function createProgramOptions(tree, tsconfigPath, basePath, fakeFileRead, additionalFiles, optionOverrides) {
    // Resolve the tsconfig path to an absolute path. This is needed as TypeScript otherwise
    // is not able to resolve root directories in the given tsconfig. More details can be found
    // in the following issue: https://github.com/microsoft/TypeScript/issues/37731.
    tsconfigPath = p.resolve(basePath, tsconfigPath);
    const parsed = parseTsconfigFile(tsconfigPath, p.dirname(tsconfigPath));
    const options = optionOverrides ? { ...parsed.options, ...optionOverrides } : parsed.options;
    const host = createMigrationCompilerHost(tree, options, basePath, fakeFileRead);
    return { rootNames: parsed.fileNames.concat([]), options, host };
}
function createMigrationCompilerHost(tree, options, basePath, fakeRead) {
    const host = ts.createCompilerHost(options, true);
    const defaultReadFile = host.readFile;
    // We need to overwrite the host "readFile" method, as we want the TypeScript
    // program to be based on the file contents in the virtual file tree. Otherwise
    // if we run multiple migrations we might have intersecting changes and
    // source files.
    host.readFile = (fileName) => {
        const treeRelativePath = p.relative(basePath, fileName);
        let result = fakeRead?.(treeRelativePath);
        if (typeof result !== 'string') {
            // If the relative path resolved to somewhere outside of the tree, fall back to
            // TypeScript's default file reading function since the `tree` will throw an error.
            result = treeRelativePath.startsWith('..')
                ? defaultReadFile.call(host, fileName)
                : tree.read(treeRelativePath)?.toString();
        }
        // Strip BOM as otherwise TSC methods (Ex: getWidth) will return an offset,
        // which breaks the CLI UpdateRecorder.
        // See: https://github.com/angular/angular/pull/30719
        return typeof result === 'string' ? result.replace(/^\uFEFF/, '') : undefined;
    };
    return host;
}
/**
 * Checks whether a file can be migrate by our automated migrations.
 * @param basePath Absolute path to the project.
 * @param sourceFile File being checked.
 * @param program Program that includes the source file.
 */
function canMigrateFile(basePath, sourceFile, program) {
    // We shouldn't migrate .d.ts files, files from an external library or type checking files.
    if (sourceFile.fileName.endsWith('.ngtypecheck.ts') ||
        sourceFile.isDeclarationFile ||
        program.isSourceFileFromExternalLibrary(sourceFile)) {
        return false;
    }
    // Our migrations are set up to create a `Program` from the project's tsconfig and to migrate all
    // the files within the program. This can include files that are outside of the Angular CLI
    // project. We can't migrate files outside of the project, because our file system interactions
    // go through the CLI's `Tree` which assumes that all files are within the project. See:
    // https://github.com/angular/angular-cli/blob/0b0961c9c233a825b6e4bb59ab7f0790f9b14676/packages/angular_devkit/schematics/src/tree/host-tree.ts#L131
    return !p.relative(basePath, sourceFile.fileName).startsWith('..');
}

exports.ChangeTracker = ChangeTracker;
exports.canMigrateFile = canMigrateFile;
exports.createMigrationProgram = createMigrationProgram;
exports.createProgramOptions = createProgramOptions;
exports.normalizePath = normalizePath;
H'x   'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var schematics = require('@angular-devkit/schematics');
var p = require('path');
var compiler_host = require('./compiler_host-C55Cczah.cjs');
var checker = require('./checker-BwV9MjSQ.cjs');
var ts = require('typescript');
require('os');
require('fs');
require('module');
require('url');

function lookupIdentifiersInSourceFile(sourceFile, names) {
    const results = new Set();
    const visit = (node) => {
        if (ts.isIdentifier(node) && names.includes(node.text)) {
            results.add(node);
        }
        ts.forEachChild(node, visit);
    };
    visit(sourceFile);
    return results;
}

const ngtemplate = 'ng-template';
const boundngifelse = '[ngIfElse]';
const boundngifthenelse = '[ngIfThenElse]';
const boundngifthen = '[ngIfThen]';
const nakedngfor$1 = 'ngFor';
const startMarker = '◬';
const endMarker = '✢';
const startI18nMarker = '⚈';
const endI18nMarker = '⚉';
const importRemovals = [
    'NgIf',
    'NgIfElse',
    'NgIfThenElse',
    'NgFor',
    'NgForOf',
    'NgForTrackBy',
    'NgSwitch',
    'NgSwitchCase',
    'NgSwitchDefault',
];
const importWithCommonRemovals = [...importRemovals, 'CommonModule'];
function allFormsOf(selector) {
    return [selector, `*${selector}`, `[${selector}]`];
}
const commonModuleDirectives = new Set([
    ...allFormsOf('ngComponentOutlet'),
    ...allFormsOf('ngTemplateOutlet'),
    ...allFormsOf('ngClass'),
    ...allFormsOf('ngPlural'),
    ...allFormsOf('ngPluralCase'),
    ...allFormsOf('ngStyle'),
    ...allFormsOf('ngTemplateOutlet'),
    ...allFormsOf('ngComponentOutlet'),
    '[NgForOf]',
    '[NgForTrackBy]',
    '[ngIfElse]',
    '[ngIfThenElse]',
]);
function pipeMatchRegExpFor(name) {
    return new RegExp(`\\|\\s*${name}`);
}
const commonModulePipes = [
    'date',
    'async',
    'currency',
    'number',
    'i18nPlural',
    'i18nSelect',
    'json',
    'keyvalue',
    'slice',
    'lowercase',
    'uppercase',
    'titlecase',
    'percent',
].map((name) => pipeMatchRegExpFor(name));
/**
 * Represents an element with a migratable attribute
 */
class ElementToMigrate {
    el;
    attr;
    elseAttr;
    thenAttr;
    forAttrs;
    aliasAttrs;
    nestCount = 0;
    hasLineBreaks = false;
    constructor(el, attr, elseAttr = undefined, thenAttr = undefined, forAttrs = undefined, aliasAttrs = undefined) {
        this.el = el;
        this.attr = attr;
        this.elseAttr = elseAttr;
        this.thenAttr = thenAttr;
        this.forAttrs = forAttrs;
        this.aliasAttrs = aliasAttrs;
    }
    normalizeConditionString(value) {
        value = this.insertSemicolon(value, value.indexOf(' else '));
        value = this.insertSemicolon(value, value.indexOf(' then '));
        value = this.insertSemicolon(value, value.indexOf(' let '));
        return value.replace(';;', ';');
    }
    insertSemicolon(str, ix) {
        return ix > -1 ? `${str.slice(0, ix)};${str.slice(ix)}` : str;
    }
    getCondition() {
        const chunks = this.normalizeConditionString(this.attr.value).split(';');
        let condition = chunks[0];
        // checks for case of no usage of `;` in if else / if then else
        const elseIx = condition.indexOf(' else ');
        const thenIx = condition.indexOf(' then ');
        if (thenIx > -1) {
            condition = condition.slice(0, thenIx);
        }
        else if (elseIx > -1) {
            condition = condition.slice(0, elseIx);
        }
        let letVar = chunks.find((c) => c.search(/\s*let\s/) > -1);
        return condition + (letVar ? ';' + letVar : '');
    }
    getTemplateName(targetStr, secondStr) {
        const targetLocation = this.attr.value.indexOf(targetStr);
        const secondTargetLocation = secondStr ? this.attr.value.indexOf(secondStr) : undefined;
        let templateName = this.attr.value.slice(targetLocation + targetStr.length, secondTargetLocation);
        if (templateName.startsWith(':')) {
            templateName = templateName.slice(1).trim();
        }
        return templateName.split(';')[0].trim();
    }
    getValueEnd(offset) {
        return ((this.attr.valueSpan ? this.attr.valueSpan.end.offset + 1 : this.attr.keySpan.end.offset) -
            offset);
    }
    hasChildren() {
        return this.el.children.length > 0;
    }
    getChildSpan(offset) {
        const childStart = this.el.children[0].sourceSpan.start.offset - offset;
        const childEnd = this.el.children[this.el.children.length - 1].sourceSpan.end.offset - offset;
        return { childStart, childEnd };
    }
    shouldRemoveElseAttr() {
        return ((this.el.name === 'ng-template' || this.el.name === 'ng-container') &&
            this.elseAttr !== undefined);
    }
    getElseAttrStr() {
        if (this.elseAttr !== undefined) {
            const elseValStr = this.elseAttr.value !== '' ? `="${this.elseAttr.value}"` : '';
            return `${this.elseAttr.name}${elseValStr}`;
        }
        return '';
    }
    start(offset) {
        return this.el.sourceSpan?.start.offset - offset;
    }
    end(offset) {
        return this.el.sourceSpan?.end.offset - offset;
    }
    length() {
        return this.el.sourceSpan?.end.offset - this.el.sourceSpan?.start.offset;
    }
}
/**
 * Represents an ng-template inside a template being migrated to new control flow
 */
class Template {
    el;
    name;
    count = 0;
    contents = '';
    children = '';
    i18n = null;
    attributes;
    constructor(el, name, i18n) {
        this.el = el;
        this.name = name;
        this.attributes = el.attrs;
        this.i18n = i18n;
    }
    get isNgTemplateOutlet() {
        return this.attributes.find((attr) => attr.name === '*ngTemplateOutlet') !== undefined;
    }
    get outletContext() {
        const letVar = this.attributes.find((attr) => attr.name.startsWith('let-'));
        return letVar ? `; context: {$implicit: ${letVar.name.split('-')[1]}}` : '';
    }
    generateTemplateOutlet() {
        const attr = this.attributes.find((attr) => attr.name === '*ngTemplateOutlet');
        const outletValue = attr?.value ?? this.name.slice(1);
        return `<ng-container *ngTemplateOutlet="${outletValue}${this.outletContext}"></ng-container>`;
    }
    generateContents(tmpl) {
        this.contents = tmpl.slice(this.el.sourceSpan.start.offset, this.el.sourceSpan.end.offset);
        this.children = '';
        if (this.el.children.length > 0) {
            this.children = tmpl.slice(this.el.children[0].sourceSpan.start.offset, this.el.children[this.el.children.length - 1].sourceSpan.end.offset);
        }
    }
}
/** Represents a file that was analyzed by the migration. */
class AnalyzedFile {
    ranges = [];
    removeCommonModule = false;
    canRemoveImports = false;
    sourceFile;
    importRanges = [];
    templateRanges = [];
    constructor(sourceFile) {
        this.sourceFile = sourceFile;
    }
    /** Returns the ranges in the order in which they should be migrated. */
    getSortedRanges() {
        // templates first for checking on whether certain imports can be safely removed
        this.templateRanges = this.ranges
            .slice()
            .filter((x) => x.type === 'template' || x.type === 'templateUrl')
            .sort((aStart, bStart) => bStart.start - aStart.start);
        this.importRanges = this.ranges
            .slice()
            .filter((x) => x.type === 'importDecorator' || x.type === 'importDeclaration')
            .sort((aStart, bStart) => bStart.start - aStart.start);
        return [...this.templateRanges, ...this.importRanges];
    }
    /**
     * Adds a text range to an `AnalyzedFile`.
     * @param path Path of the file.
     * @param analyzedFiles Map keeping track of all the analyzed files.
     * @param range Range to be added.
     */
    static addRange(path, sourceFile, analyzedFiles, range) {
        let analysis = analyzedFiles.get(path);
        if (!analysis) {
            analysis = new AnalyzedFile(sourceFile);
            analyzedFiles.set(path, analysis);
        }
        const duplicate = analysis.ranges.find((current) => current.start === range.start && current.end === range.end);
        if (!duplicate) {
            analysis.ranges.push(range);
        }
    }
    /**
     * This verifies whether a component class is safe to remove module imports.
     * It is only run on .ts files.
     */
    verifyCanRemoveImports() {
        const importDeclaration = this.importRanges.find((r) => r.type === 'importDeclaration');
        const instances = lookupIdentifiersInSourceFile(this.sourceFile, importWithCommonRemovals);
        let foundImportDeclaration = false;
        let count = 0;
        for (let range of this.importRanges) {
            for (let instance of instances) {
                if (instance.getStart() >= range.start && instance.getEnd() <= range.end) {
                    if (range === importDeclaration) {
                        foundImportDeclaration = true;
                    }
                    count++;
                }
            }
        }
        if (instances.size !== count && importDeclaration !== undefined && foundImportDeclaration) {
            importDeclaration.remove = false;
        }
    }
}
/** Finds all non-control flow elements from common module. */
class CommonCollector extends checker.RecursiveVisitor {
    count = 0;
    visitElement(el) {
        if (el.attrs.length > 0) {
            for (const attr of el.attrs) {
                if (this.hasDirectives(attr.name) || this.hasPipes(attr.value)) {
                    this.count++;
                }
            }
        }
        super.visitElement(el, null);
    }
    visitBlock(ast) {
        for (const blockParam of ast.parameters) {
            if (this.hasPipes(blockParam.expression)) {
                this.count++;
            }
        }
        super.visitBlock(ast, null);
    }
    visitText(ast) {
        if (this.hasPipes(ast.value)) {
            this.count++;
        }
    }
    visitLetDeclaration(decl) {
        if (this.hasPipes(decl.value)) {
            this.count++;
        }
        super.visitLetDeclaration(decl, null);
    }
    hasDirectives(input) {
        return commonModuleDirectives.has(input);
    }
    hasPipes(input) {
        return commonModulePipes.some((regexp) => regexp.test(input));
    }
}
/** Finds all elements that represent i18n blocks. */
class i18nCollector extends checker.RecursiveVisitor {
    elements = [];
    visitElement(el) {
        if (el.attrs.find((a) => a.name === 'i18n') !== undefined) {
            this.elements.push(el);
        }
        super.visitElement(el, null);
    }
}
/** Finds all elements with ngif structural directives. */
class ElementCollector extends checker.RecursiveVisitor {
    _attributes;
    elements = [];
    constructor(_attributes = []) {
        super();
        this._attributes = _attributes;
    }
    visitElement(el) {
        if (el.attrs.length > 0) {
            for (const attr of el.attrs) {
                if (this._attributes.includes(attr.name)) {
                    const elseAttr = el.attrs.find((x) => x.name === boundngifelse);
                    const thenAttr = el.attrs.find((x) => x.name === boundngifthenelse || x.name === boundngifthen);
                    const forAttrs = attr.name === nakedngfor$1 ? this.getForAttrs(el) : undefined;
                    const aliasAttrs = this.getAliasAttrs(el);
                    this.elements.push(new ElementToMigrate(el, attr, elseAttr, thenAttr, forAttrs, aliasAttrs));
                }
            }
        }
        super.visitElement(el, null);
    }
    getForAttrs(el) {
        let trackBy = '';
        let forOf = '';
        for (const attr of el.attrs) {
            if (attr.name === '[ngForTrackBy]') {
                trackBy = attr.value;
            }
            if (attr.name === '[ngForOf]') {
                forOf = attr.value;
            }
        }
        return { forOf, trackBy };
    }
    getAliasAttrs(el) {
        const aliases = new Map();
        let item = '';
        for (const attr of el.attrs) {
            if (attr.name.startsWith('let-')) {
                if (attr.value === '') {
                    // item
                    item = attr.name.replace('let-', '');
                }
                else {
                    // alias
                    aliases.set(attr.name.replace('let-', ''), attr.value);
                }
            }
        }
        return { item, aliases };
    }
}
/** Finds all elements with ngif structural directives. */
class TemplateCollector extends checker.RecursiveVisitor {
    elements = [];
    templates = new Map();
    visitElement(el) {
        if (el.name === ngtemplate) {
            let i18n = null;
            let templateAttr = null;
            for (const attr of el.attrs) {
                if (attr.name === 'i18n') {
                    i18n = attr;
                }
                if (attr.name.startsWith('#')) {
                    templateAttr = attr;
                }
            }
            if (templateAttr !== null && !this.templates.has(templateAttr.name)) {
                this.templates.set(templateAttr.name, new Template(el, templateAttr.name, i18n));
                this.elements.push(new ElementToMigrate(el, templateAttr));
            }
            else if (templateAttr !== null) {
                throw new Error(`A duplicate ng-template name "${templateAttr.name}" was found. ` +
                    `The control flow migration requires unique ng-template names within a component.`);
            }
        }
        super.visitElement(el, null);
    }
}

const startMarkerRegex = new RegExp(startMarker, 'gm');
const endMarkerRegex = new RegExp(endMarker, 'gm');
const startI18nMarkerRegex = new RegExp(startI18nMarker, 'gm');
const endI18nMarkerRegex = new RegExp(endI18nMarker, 'gm');
const replaceMarkerRegex = new RegExp(`${startMarker}|${endMarker}`, 'gm');
/**
 * Analyzes a source file to find file that need to be migrated and the text ranges within them.
 * @param sourceFile File to be analyzed.
 * @param analyzedFiles Map in which to store the results.
 */
function analyze(sourceFile, analyzedFiles) {
    forEachClass(sourceFile, (node) => {
        if (ts.isClassDeclaration(node)) {
            analyzeDecorators(node, sourceFile, analyzedFiles);
        }
        else {
            analyzeImportDeclarations(node, sourceFile, analyzedFiles);
        }
    });
}
function checkIfShouldChange(decl, file) {
    const range = file.importRanges.find((r) => r.type === 'importDeclaration');
    if (range === undefined || !range.remove) {
        return false;
    }
    // should change if you can remove the common module
    // if it's not safe to remove the common module
    // and that's the only thing there, we should do nothing.
    const clause = decl.getChildAt(1);
    return !(!file.removeCommonModule &&
        clause.namedBindings &&
        ts.isNamedImports(clause.namedBindings) &&
        clause.namedBindings.elements.length === 1 &&
        clause.namedBindings.elements[0].getText() === 'CommonModule');
}
function updateImportDeclaration(decl, removeCommonModule) {
    const clause = decl.getChildAt(1);
    const updatedClause = updateImportClause(clause, removeCommonModule);
    if (updatedClause === null) {
        return '';
    }
    // removeComments is set to true to prevent duplication of comments
    // when the import declaration is at the top of the file, but right after a comment
    // without this, the comment gets duplicated when the declaration is updated.
    // the typescript AST includes that preceding comment as part of the import declaration full text.
    const printer = ts.createPrinter({
        removeComments: true,
    });
    const updated = ts.factory.updateImportDeclaration(decl, decl.modifiers, updatedClause, decl.moduleSpecifier, undefined);
    return printer.printNode(ts.EmitHint.Unspecified, updated, clause.getSourceFile());
}
function updateImportClause(clause, removeCommonModule) {
    if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {
        const removals = removeCommonModule ? importWithCommonRemovals : importRemovals;
        const elements = clause.namedBindings.elements.filter((el) => !removals.includes(el.getText()));
        if (elements.length === 0) {
            return null;
        }
        clause = ts.factory.updateImportClause(clause, clause.isTypeOnly, clause.name, ts.factory.createNamedImports(elements));
    }
    return clause;
}
function updateClassImports(propAssignment, removeCommonModule) {
    const printer = ts.createPrinter();
    const importList = propAssignment.initializer;
    // Can't change non-array literals.
    if (!ts.isArrayLiteralExpression(importList)) {
        return null;
    }
    const removals = removeCommonModule ? importWithCommonRemovals : importRemovals;
    const elements = importList.elements.filter((el) => !ts.isIdentifier(el) || !removals.includes(el.text));
    if (elements.length === importList.elements.length) {
        // nothing changed
        return null;
    }
    const updatedElements = ts.factory.updateArrayLiteralExpression(importList, elements);
    const updatedAssignment = ts.factory.updatePropertyAssignment(propAssignment, propAssignment.name, updatedElements);
    return printer.printNode(ts.EmitHint.Unspecified, updatedAssignment, updatedAssignment.getSourceFile());
}
function analyzeImportDeclarations(node, sourceFile, analyzedFiles) {
    if (node.getText().indexOf('@angular/common') === -1) {
        return;
    }
    const clause = node.getChildAt(1);
    if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {
        const elements = clause.namedBindings.elements.filter((el) => importWithCommonRemovals.includes(el.getText()));
        if (elements.length > 0) {
            AnalyzedFile.addRange(sourceFile.fileName, sourceFile, analyzedFiles, {
                start: node.getStart(),
                end: node.getEnd(),
                node,
                type: 'importDeclaration',
                remove: true,
            });
        }
    }
}
function analyzeDecorators(node, sourceFile, analyzedFiles) {
    // Note: we have a utility to resolve the Angular decorators from a class declaration already.
    // We don't use it here, because it requires access to the type checker which makes it more
    // time-consuming to run internally.
    const decorator = ts.getDecorators(node)?.find((dec) => {
        return (ts.isCallExpression(dec.expression) &&
            ts.isIdentifier(dec.expression.expression) &&
            dec.expression.expression.text === 'Component');
    });
    const metadata = decorator &&
        decorator.expression.arguments.length > 0 &&
        ts.isObjectLiteralExpression(decorator.expression.arguments[0])
        ? decorator.expression.arguments[0]
        : null;
    if (!metadata) {
        return;
    }
    for (const prop of metadata.properties) {
        // All the properties we care about should have static
        // names and be initialized to a static string.
        if (!ts.isPropertyAssignment(prop) ||
            (!ts.isIdentifier(prop.name) && !ts.isStringLiteralLike(prop.name))) {
            continue;
        }
        switch (prop.name.text) {
            case 'template':
                // +1/-1 to exclude the opening/closing characters from the range.
                AnalyzedFile.addRange(sourceFile.fileName, sourceFile, analyzedFiles, {
                    start: prop.initializer.getStart() + 1,
                    end: prop.initializer.getEnd() - 1,
                    node: prop,
                    type: 'template',
                    remove: true,
                });
                break;
            case 'imports':
                AnalyzedFile.addRange(sourceFile.fileName, sourceFile, analyzedFiles, {
                    start: prop.name.getStart(),
                    end: prop.initializer.getEnd(),
                    node: prop,
                    type: 'importDecorator',
                    remove: true,
                });
                break;
            case 'templateUrl':
                // Leave the end as undefined which means that the range is until the end of the file.
                if (ts.isStringLiteralLike(prop.initializer)) {
                    const path = p.join(p.dirname(sourceFile.fileName), prop.initializer.text);
                    AnalyzedFile.addRange(path, sourceFile, analyzedFiles, {
                        start: 0,
                        node: prop,
                        type: 'templateUrl',
                        remove: true,
                    });
                }
                break;
        }
    }
}
/**
 * returns the level deep a migratable element is nested
 */
function getNestedCount(etm, aggregator) {
    if (aggregator.length === 0) {
        return 0;
    }
    if (etm.el.sourceSpan.start.offset < aggregator[aggregator.length - 1] &&
        etm.el.sourceSpan.end.offset !== aggregator[aggregator.length - 1]) {
        // element is nested
        aggregator.push(etm.el.sourceSpan.end.offset);
        return aggregator.length - 1;
    }
    else {
        // not nested
        aggregator.pop();
        return getNestedCount(etm, aggregator);
    }
}
/**
 * parses the template string into the Html AST
 */
function parseTemplate(template) {
    let parsed;
    try {
        // Note: we use the HtmlParser here, instead of the `parseTemplate` function, because the
        // latter returns an Ivy AST, not an HTML AST. The HTML AST has the advantage of preserving
        // interpolated text as text nodes containing a mixture of interpolation tokens and text tokens,
        // rather than turning them into `BoundText` nodes like the Ivy AST does. This allows us to
        // easily get the text-only ranges without having to reconstruct the original text.
        parsed = new checker.HtmlParser().parse(template, '', {
            // Allows for ICUs to be parsed.
            tokenizeExpansionForms: true,
            // Explicitly disable blocks so that their characters are treated as plain text.
            tokenizeBlocks: true,
            preserveLineEndings: true,
        });
        // Don't migrate invalid templates.
        if (parsed.errors && parsed.errors.length > 0) {
            const errors = parsed.errors.map((e) => ({ type: 'parse', error: e }));
            return { tree: undefined, errors };
        }
    }
    catch (e) {
        return { tree: undefined, errors: [{ type: 'parse', error: e }] };
    }
    return { tree: parsed, errors: [] };
}
function validateMigratedTemplate(migrated, fileName) {
    const parsed = parseTemplate(migrated);
    let errors = [];
    if (parsed.errors.length > 0) {
        errors.push({
            type: 'parse',
            error: new Error(`The migration resulted in invalid HTML for ${fileName}. ` +
                `Please check the template for valid HTML structures and run the migration again.`),
        });
    }
    if (parsed.tree) {
        const i18nError = validateI18nStructure(parsed.tree, fileName);
        if (i18nError !== null) {
            errors.push({ type: 'i18n', error: i18nError });
        }
    }
    return errors;
}
function validateI18nStructure(parsed, fileName) {
    const visitor = new i18nCollector();
    checker.visitAll(visitor, parsed.rootNodes);
    const parents = visitor.elements.filter((el) => el.children.length > 0);
    for (const p of parents) {
        for (const el of visitor.elements) {
            if (el === p)
                continue;
            if (isChildOf(p, el)) {
                return new Error(`i18n Nesting error: The migration would result in invalid i18n nesting for ` +
                    `${fileName}. Element with i18n attribute "${p.name}" would result having a child of ` +
                    `element with i18n attribute "${el.name}". Please fix and re-run the migration.`);
            }
        }
    }
    return null;
}
function isChildOf(parent, el) {
    return (parent.sourceSpan.start.offset < el.sourceSpan.start.offset &&
        parent.sourceSpan.end.offset > el.sourceSpan.end.offset);
}
/** Possible placeholders that can be generated by `getPlaceholder`. */
var PlaceholderKind;
(function (PlaceholderKind) {
    PlaceholderKind[PlaceholderKind["Default"] = 0] = "Default";
    PlaceholderKind[PlaceholderKind["Alternate"] = 1] = "Alternate";
})(PlaceholderKind || (PlaceholderKind = {}));
/**
 * Wraps a string in a placeholder that makes it easier to identify during replacement operations.
 */
function getPlaceholder(value, kind = PlaceholderKind.Default) {
    const name = `<<<ɵɵngControlFlowMigration_${kind}ɵɵ>>>`;
    return `___${name}${value}${name}___`;
}
/**
 * calculates the level of nesting of the items in the collector
 */
function calculateNesting(visitor, hasLineBreaks) {
    // start from top of template
    // loop through each element
    let nestedQueue = [];
    for (let i = 0; i < visitor.elements.length; i++) {
        let currEl = visitor.elements[i];
        if (i === 0) {
            nestedQueue.push(currEl.el.sourceSpan.end.offset);
            currEl.hasLineBreaks = hasLineBreaks;
            continue;
        }
        currEl.hasLineBreaks = hasLineBreaks;
        currEl.nestCount = getNestedCount(currEl, nestedQueue);
        if (currEl.el.sourceSpan.end.offset !== nestedQueue[nestedQueue.length - 1]) {
            nestedQueue.push(currEl.el.sourceSpan.end.offset);
        }
    }
}
/**
 * determines if a given template string contains line breaks
 */
function hasLineBreaks(template) {
    return /\r|\n/.test(template);
}
/**
 * properly adjusts template offsets based on current nesting levels
 */
function reduceNestingOffset(el, nestLevel, offset, postOffsets) {
    if (el.nestCount <= nestLevel) {
        const count = nestLevel - el.nestCount;
        // reduced nesting, add postoffset
        for (let i = 0; i <= count; i++) {
            offset += postOffsets.pop() ?? 0;
        }
    }
    return offset;
}
/**
 * Replaces structural directive control flow instances with block control flow equivalents.
 * Returns null if the migration failed (e.g. there was a syntax error).
 */
function getTemplates(template) {
    const parsed = parseTemplate(template);
    if (parsed.tree !== undefined) {
        const visitor = new TemplateCollector();
        checker.visitAll(visitor, parsed.tree.rootNodes);
        for (let [key, tmpl] of visitor.templates) {
            tmpl.count = countTemplateUsage(parsed.tree.rootNodes, key);
            tmpl.generateContents(template);
        }
        return visitor.templates;
    }
    return new Map();
}
function countTemplateUsage(nodes, templateName) {
    let count = 0;
    let isReferencedInTemplateOutlet = false;
    for (const node of nodes) {
        if (node.attrs) {
            for (const attr of node.attrs) {
                if (attr.name === '*ngTemplateOutlet' && attr.value === templateName.slice(1)) {
                    isReferencedInTemplateOutlet = true;
                    break;
                }
                if (attr.name.trim() === templateName) {
                    count++;
                }
            }
        }
        if (node.children) {
            if (node.name === 'for') {
                for (const child of node.children) {
                    if (child.value?.includes(templateName.slice(1))) {
                        count++;
                    }
                }
            }
            count += countTemplateUsage(node.children, templateName);
        }
    }
    return isReferencedInTemplateOutlet ? count + 2 : count;
}
function updateTemplates(template, templates) {
    const updatedTemplates = getTemplates(template);
    for (let [key, tmpl] of updatedTemplates) {
        templates.set(key, tmpl);
    }
    return templates;
}
function wrapIntoI18nContainer(i18nAttr, content) {
    const { start, middle, end } = generatei18nContainer(i18nAttr, content);
    return `${start}${middle}${end}`;
}
function generatei18nContainer(i18nAttr, middle) {
    const i18n = i18nAttr.value === '' ? 'i18n' : `i18n="${i18nAttr.value}"`;
    return { start: `<ng-container ${i18n}>`, middle, end: `</ng-container>` };
}
/**
 * Counts, replaces, and removes any necessary ng-templates post control flow migration
 */
function processNgTemplates(template, sourceFile) {
    // count usage
    try {
        const templates = getTemplates(template);
        // swap placeholders and remove
        for (const [name, t] of templates) {
            const replaceRegex = new RegExp(getPlaceholder(name.slice(1)), 'g');
            const forRegex = new RegExp(getPlaceholder(name.slice(1), PlaceholderKind.Alternate), 'g');
            const forMatches = [...template.matchAll(forRegex)];
            const matches = [...forMatches, ...template.matchAll(replaceRegex)];
            let safeToRemove = true;
            if (matches.length > 0) {
                if (t.i18n !== null) {
                    const container = wrapIntoI18nContainer(t.i18n, t.children);
                    template = template.replace(replaceRegex, container);
                }
                else if (t.children.trim() === '' && t.isNgTemplateOutlet) {
                    template = template.replace(replaceRegex, t.generateTemplateOutlet());
                }
                else if (forMatches.length > 0) {
                    if (t.count === 2) {
                        template = template.replace(forRegex, t.children);
                    }
                    else {
                        template = template.replace(forRegex, t.generateTemplateOutlet());
                        safeToRemove = false;
                    }
                }
                else {
                    template = template.replace(replaceRegex, t.children);
                }
                const dist = matches.filter((obj, index, self) => index === self.findIndex((t) => t.input === obj.input));
                if ((t.count === dist.length || t.count - matches.length === 1) && safeToRemove) {
                    const refsInComponentFile = getViewChildOrViewChildrenNames(sourceFile);
                    if (refsInComponentFile?.length > 0) {
                        const templateRefs = getTemplateReferences(template);
                        for (const ref of refsInComponentFile) {
                            if (!templateRefs.includes(ref)) {
                                template = template.replace(t.contents, `${startMarker}${endMarker}`);
                            }
                        }
                    }
                    else {
                        template = template.replace(t.contents, `${startMarker}${endMarker}`);
                    }
                }
                // templates may have changed structure from nested replaced templates
                // so we need to reprocess them before the next loop.
                updateTemplates(template, templates);
            }
        }
        // template placeholders may still exist if the ng-template name is not
        // present in the component. This could be because it's passed in from
        // another component. In that case, we need to replace any remaining
        // template placeholders with template outlets.
        template = replaceRemainingPlaceholders(template);
        return { migrated: template, err: undefined };
    }
    catch (err) {
        return { migrated: template, err: err };
    }
}
function getViewChildOrViewChildrenNames(sourceFile) {
    const names = [];
    function visit(node) {
        if (ts.isDecorator(node) && ts.isCallExpression(node.expression)) {
            const expr = node.expression;
            if (ts.isIdentifier(expr.expression) &&
                (expr.expression.text === 'ViewChild' || expr.expression.text === 'ViewChildren')) {
                const firstArg = expr.arguments[0];
                if (firstArg && ts.isStringLiteral(firstArg)) {
                    names.push(firstArg.text);
                }
                return;
            }
        }
        ts.forEachChild(node, visit);
    }
    visit(sourceFile);
    return names;
}
function getTemplateReferences(template) {
    const parsed = parseTemplate(template);
    if (parsed.tree === undefined) {
        return [];
    }
    const references = [];
    function visitNodes(nodes) {
        for (const node of nodes) {
            if (node?.name === 'ng-template') {
                references.push(...node.attrs?.map((ref) => ref?.name?.slice(1)));
            }
            if (node.children) {
                visitNodes(node.children);
            }
        }
    }
    visitNodes(parsed.tree.rootNodes);
    return references;
}
function replaceRemainingPlaceholders(template) {
    const pattern = '.*';
    const placeholderPattern = getPlaceholder(pattern);
    const replaceRegex = new RegExp(placeholderPattern, 'g');
    const [placeholderStart, placeholderEnd] = placeholderPattern.split(pattern);
    const placeholders = [...template.matchAll(replaceRegex)];
    for (let ph of placeholders) {
        const placeholder = ph[0];
        const name = placeholder.slice(placeholderStart.length, placeholder.length - placeholderEnd.length);
        template = template.replace(placeholder, `<ng-template [ngTemplateOutlet]="${name}"></ng-template>`);
    }
    return template;
}
/**
 * determines if the CommonModule can be safely removed from imports
 */
function canRemoveCommonModule(template) {
    const parsed = parseTemplate(template);
    let removeCommonModule = false;
    if (parsed.tree !== undefined) {
        const visitor = new CommonCollector();
        checker.visitAll(visitor, parsed.tree.rootNodes);
        removeCommonModule = visitor.count === 0;
    }
    return removeCommonModule;
}
/**
 * removes imports from template imports and import declarations
 */
function removeImports(template, node, file) {
    if (template.startsWith('imports') && ts.isPropertyAssignment(node)) {
        const updatedImport = updateClassImports(node, file.removeCommonModule);
        return updatedImport ?? template;
    }
    else if (ts.isImportDeclaration(node) && checkIfShouldChange(node, file)) {
        return updateImportDeclaration(node, file.removeCommonModule);
    }
    return template;
}
/**
 * retrieves the original block of text in the template for length comparison during migration
 * processing
 */
function getOriginals(etm, tmpl, offset) {
    // original opening block
    if (etm.el.children.length > 0) {
        const childStart = etm.el.children[0].sourceSpan.start.offset - offset;
        const childEnd = etm.el.children[etm.el.children.length - 1].sourceSpan.end.offset - offset;
        const start = tmpl.slice(etm.el.sourceSpan.start.offset - offset, etm.el.children[0].sourceSpan.start.offset - offset);
        // original closing block
        const end = tmpl.slice(etm.el.children[etm.el.children.length - 1].sourceSpan.end.offset - offset, etm.el.sourceSpan.end.offset - offset);
        const childLength = childEnd - childStart;
        return {
            start,
            end,
            childLength,
            children: getOriginalChildren(etm.el.children, tmpl, offset),
            childNodes: etm.el.children,
        };
    }
    // self closing or no children
    const start = tmpl.slice(etm.el.sourceSpan.start.offset - offset, etm.el.sourceSpan.end.offset - offset);
    // original closing block
    return { start, end: '', childLength: 0, children: [], childNodes: [] };
}
function getOriginalChildren(children, tmpl, offset) {
    return children.map((child) => {
        return tmpl.slice(child.sourceSpan.start.offset - offset, child.sourceSpan.end.offset - offset);
    });
}
function isI18nTemplate(etm, i18nAttr) {
    let attrCount = countAttributes(etm);
    const safeToRemove = etm.el.attrs.length === attrCount + (i18nAttr !== undefined ? 1 : 0);
    return etm.el.name === 'ng-template' && i18nAttr !== undefined && safeToRemove;
}
function isRemovableContainer(etm) {
    let attrCount = countAttributes(etm);
    const safeToRemove = etm.el.attrs.length === attrCount;
    return (etm.el.name === 'ng-container' || etm.el.name === 'ng-template') && safeToRemove;
}
function countAttributes(etm) {
    let attrCount = 1;
    if (etm.elseAttr !== undefined) {
        attrCount++;
    }
    if (etm.thenAttr !== undefined) {
        attrCount++;
    }
    attrCount += etm.aliasAttrs?.aliases.size ?? 0;
    attrCount += etm.aliasAttrs?.item ? 1 : 0;
    attrCount += etm.forAttrs?.trackBy ? 1 : 0;
    attrCount += etm.forAttrs?.forOf ? 1 : 0;
    return attrCount;
}
/**
 * builds the proper contents of what goes inside a given control flow block after migration
 */
function getMainBlock(etm, tmpl, offset) {
    const i18nAttr = etm.el.attrs.find((x) => x.name === 'i18n');
    // removable containers are ng-templates or ng-containers that no longer need to exist
    // post migration
    if (isRemovableContainer(etm)) {
        let middle = '';
        if (etm.hasChildren()) {
            const { childStart, childEnd } = etm.getChildSpan(offset);
            middle = tmpl.slice(childStart, childEnd);
        }
        else {
            middle = '';
        }
        return { start: '', middle, end: '' };
    }
    else if (isI18nTemplate(etm, i18nAttr)) {
        // here we're removing an ng-template used for control flow and i18n and
        // converting it to an ng-container with i18n
        const { childStart, childEnd } = etm.getChildSpan(offset);
        return generatei18nContainer(i18nAttr, tmpl.slice(childStart, childEnd));
    }
    // the index of the start of the attribute adjusting for offset shift
    const attrStart = etm.attr.keySpan.start.offset - 1 - offset;
    // the index of the very end of the attribute value adjusted for offset shift
    const valEnd = etm.getValueEnd(offset);
    // the index of the children start and end span, if they exist. Otherwise use the value end.
    const { childStart, childEnd } = etm.hasChildren()
        ? etm.getChildSpan(offset)
        : { childStart: valEnd, childEnd: valEnd };
    // the beginning of the updated string in the main block, for example: <div some="attributes">
    let start = tmpl.slice(etm.start(offset), attrStart) + tmpl.slice(valEnd, childStart);
    // the middle is the actual contents of the element
    const middle = tmpl.slice(childStart, childEnd);
    // the end is the closing part of the element, example: </div>
    let end = tmpl.slice(childEnd, etm.end(offset));
    if (etm.shouldRemoveElseAttr()) {
        // this removes a bound ngIfElse attribute that's no longer needed
        // this could be on the start or end
        start = start.replace(etm.getElseAttrStr(), '');
        end = end.replace(etm.getElseAttrStr(), '');
    }
    return { start, middle, end };
}
function generateI18nMarkers(tmpl) {
    let parsed = parseTemplate(tmpl);
    if (parsed.tree !== undefined) {
        const visitor = new i18nCollector();
        checker.visitAll(visitor, parsed.tree.rootNodes);
        for (const [ix, el] of visitor.elements.entries()) {
            // we only care about elements with children and i18n tags
            // elements without children have nothing to translate
            // offset accounts for the addition of the 2 marker characters with each loop.
            const offset = ix * 2;
            if (el.children.length > 0) {
                tmpl = addI18nMarkers(tmpl, el, offset);
            }
        }
    }
    return tmpl;
}
function addI18nMarkers(tmpl, el, offset) {
    const startPos = el.children[0].sourceSpan.start.offset + offset;
    const endPos = el.children[el.children.length - 1].sourceSpan.end.offset + offset;
    return (tmpl.slice(0, startPos) +
        startI18nMarker +
        tmpl.slice(startPos, endPos) +
        endI18nMarker +
        tmpl.slice(endPos));
}
const selfClosingList = 'input|br|img|base|wbr|area|col|embed|hr|link|meta|param|source|track';
/**
 * re-indents all the lines in the template properly post migration
 */
function formatTemplate(tmpl, templateType) {
    if (tmpl.indexOf('\n') > -1) {
        tmpl = generateI18nMarkers(tmpl);
        // tracks if a self closing element opened without closing yet
        let openSelfClosingEl = false;
        // match any type of control flow block as start of string ignoring whitespace
        // @if | @switch | @case | @default | @for | } @else
        const openBlockRegex = /^\s*\@(if|switch|case|default|for)|^\s*\}\s\@else/;
        // regex for matching an html element opening
        // <div thing="stuff" [binding]="true"> || <div thing="stuff" [binding]="true"
        const openElRegex = /^\s*<([a-z0-9]+)(?![^>]*\/>)[^>]*>?/;
        // regex for matching an attribute string that was left open at the endof a line
        // so we can ensure we have the proper indent
        // <div thing="aefaefwe
        const openAttrDoubleRegex = /="([^"]|\\")*$/;
        const openAttrSingleRegex = /='([^']|\\')*$/;
        // regex for matching an attribute string that was closes on a separate line
        // from when it was opened.
        // <div thing="aefaefwe
        //             i18n message is here">
        const closeAttrDoubleRegex = /^\s*([^><]|\\")*"/;
        const closeAttrSingleRegex = /^\s*([^><]|\\')*'/;
        // regex for matching a self closing html element that has no />
        // <input type="button" [binding]="true">
        const selfClosingRegex = new RegExp(`^\\s*<(${selfClosingList}).+\\/?>`);
        // regex for matching a self closing html element that is on multi lines
        // <input type="button" [binding]="true"> || <input type="button" [binding]="true"
        const openSelfClosingRegex = new RegExp(`^\\s*<(${selfClosingList})(?![^>]*\\/>)[^>]*$`);
        // match closing block or else block
        // } | } @else
        const closeBlockRegex = /^\s*\}\s*$|^\s*\}\s\@else/;
        // matches closing of an html element
        // </element>
        const closeElRegex = /\s*<\/([a-zA-Z0-9\-_]+)\s*>/m;
        // matches closing of a self closing html element when the element is on multiple lines
        // [binding]="value" />
        const closeMultiLineElRegex = /^\s*([a-zA-Z0-9\-_\[\]]+)?=?"?([^”<]+)?"?\s?\/>$/;
        // matches closing of a self closing html element when the element is on multiple lines
        // with no / in the closing: [binding]="value">
        const closeSelfClosingMultiLineRegex = /^\s*([a-zA-Z0-9\-_\[\]]+)?=?"?([^”\/<]+)?"?\s?>$/;
        // matches an open and close of an html element on a single line with no breaks
        // <div>blah</div>
        const singleLineElRegex = /\s*<([a-zA-Z0-9]+)(?![^>]*\/>)[^>]*>.*<\/([a-zA-Z0-9\-_]+)\s*>/;
        const lines = tmpl.split('\n');
        const formatted = [];
        // the indent applied during formatting
        let indent = '';
        // the pre-existing indent in an inline template that we'd like to preserve
        let mindent = '';
        let depth = 0;
        let i18nDepth = 0;
        let inMigratedBlock = false;
        let inI18nBlock = false;
        let inAttribute = false;
        let isDoubleQuotes = false;
        for (let [index, line] of lines.entries()) {
            depth +=
                [...line.matchAll(startMarkerRegex)].length - [...line.matchAll(endMarkerRegex)].length;
            inMigratedBlock = depth > 0;
            i18nDepth +=
                [...line.matchAll(startI18nMarkerRegex)].length -
                    [...line.matchAll(endI18nMarkerRegex)].length;
            let lineWasMigrated = false;
            if (line.match(replaceMarkerRegex)) {
                line = line.replace(replaceMarkerRegex, '');
                lineWasMigrated = true;
            }
            if (line.trim() === '' &&
                index !== 0 &&
                index !== lines.length - 1 &&
                (inMigratedBlock || lineWasMigrated) &&
                !inI18nBlock &&
                !inAttribute) {
                // skip blank lines except if it's the first line or last line
                // this preserves leading and trailing spaces if they are already present
                continue;
            }
            // preserves the indentation of an inline template
            if (templateType === 'template' && index <= 1) {
                // first real line of an inline template
                const ind = line.search(/\S/);
                mindent = ind > -1 ? line.slice(0, ind) : '';
            }
            // if a block closes, an element closes, and it's not an element on a single line or the end
            // of a self closing tag
            if ((closeBlockRegex.test(line) ||
                (closeElRegex.test(line) &&
                    !singleLineElRegex.test(line) &&
                    !closeMultiLineElRegex.test(line))) &&
                indent !== '') {
                // close block, reduce indent
                indent = indent.slice(2);
            }
            // if a line ends in an unclosed attribute, we need to note that and close it later
            const isOpenDoubleAttr = openAttrDoubleRegex.test(line);
            const isOpenSingleAttr = openAttrSingleRegex.test(line);
            if (!inAttribute && isOpenDoubleAttr) {
                inAttribute = true;
                isDoubleQuotes = true;
            }
            else if (!inAttribute && isOpenSingleAttr) {
                inAttribute = true;
                isDoubleQuotes = false;
            }
            const newLine = inI18nBlock || inAttribute
                ? line
                : mindent + (line.trim() !== '' ? indent : '') + line.trim();
            formatted.push(newLine);
            if (!isOpenDoubleAttr &&
                !isOpenSingleAttr &&
                ((inAttribute && isDoubleQuotes && closeAttrDoubleRegex.test(line)) ||
                    (inAttribute && !isDoubleQuotes && closeAttrSingleRegex.test(line)))) {
                inAttribute = false;
            }
            // this matches any self closing element that actually has a />
            if (closeMultiLineElRegex.test(line)) {
                // multi line self closing tag
                indent = indent.slice(2);
                if (openSelfClosingEl) {
                    openSelfClosingEl = false;
                }
            }
            // this matches a self closing element that doesn't have a / in the >
            if (closeSelfClosingMultiLineRegex.test(line) && openSelfClosingEl) {
                openSelfClosingEl = false;
                indent = indent.slice(2);
            }
            // this matches an open control flow block, an open HTML element, but excludes single line
            // self closing tags
            if ((openBlockRegex.test(line) || openElRegex.test(line)) &&
                !singleLineElRegex.test(line) &&
                !selfClosingRegex.test(line) &&
                !openSelfClosingRegex.test(line)) {
                // open block, increase indent
                indent += '  ';
            }
            // This is a self closing element that is definitely not fully closed and is on multiple lines
            if (openSelfClosingRegex.test(line)) {
                openSelfClosingEl = true;
                // add to the indent for the properties on it to look nice
                indent += '  ';
            }
            inI18nBlock = i18nDepth > 0;
        }
        tmpl = formatted.join('\n');
    }
    return tmpl;
}
/** Executes a callback on each class declaration in a file. */
function forEachClass(sourceFile, callback) {
    sourceFile.forEachChild(function walk(node) {
        if (ts.isClassDeclaration(node) || ts.isImportDeclaration(node)) {
            callback(node);
        }
        node.forEachChild(walk);
    });
}

const boundcase = '[ngSwitchCase]';
const switchcase = '*ngSwitchCase';
const nakedcase = 'ngSwitchCase';
const switchdefault = '*ngSwitchDefault';
const nakeddefault = 'ngSwitchDefault';
const cases = [boundcase, switchcase, nakedcase, switchdefault, nakeddefault];
/**
 * Replaces structural directive ngSwitch instances with new switch.
 * Returns null if the migration failed (e.g. there was a syntax error).
 */
function migrateCase(template) {
    let errors = [];
    let parsed = parseTemplate(template);
    if (parsed.tree === undefined) {
        return { migrated: template, errors, changed: false };
    }
    let result = template;
    const visitor = new ElementCollector(cases);
    checker.visitAll(visitor, parsed.tree.rootNodes);
    calculateNesting(visitor, hasLineBreaks(template));
    // this tracks the character shift from different lengths of blocks from
    // the prior directives so as to adjust for nested block replacement during
    // migration. Each block calculates length differences and passes that offset
    // to the next migrating block to adjust character offsets properly.
    let offset = 0;
    let nestLevel = -1;
    let postOffsets = [];
    for (const el of visitor.elements) {
        let migrateResult = { tmpl: result, offsets: { pre: 0, post: 0 } };
        // applies the post offsets after closing
        offset = reduceNestingOffset(el, nestLevel, offset, postOffsets);
        if (el.attr.name === switchcase || el.attr.name === nakedcase || el.attr.name === boundcase) {
            try {
                migrateResult = migrateNgSwitchCase(el, result, offset);
            }
            catch (error) {
                errors.push({ type: switchcase, error });
            }
        }
        else if (el.attr.name === switchdefault || el.attr.name === nakeddefault) {
            try {
                migrateResult = migrateNgSwitchDefault(el, result, offset);
            }
            catch (error) {
                errors.push({ type: switchdefault, error });
            }
        }
        result = migrateResult.tmpl;
        offset += migrateResult.offsets.pre;
        postOffsets.push(migrateResult.offsets.post);
        nestLevel = el.nestCount;
    }
    const changed = visitor.elements.length > 0;
    return { migrated: result, errors, changed };
}
function migrateNgSwitchCase(etm, tmpl, offset) {
    // includes the mandatory semicolon before as
    const lbString = etm.hasLineBreaks ? '\n' : '';
    const leadingSpace = etm.hasLineBreaks ? '' : ' ';
    // ngSwitchCases with no values results into `case ()` which isn't valid, based off empty
    // value we add quotes instead of generating empty case
    const condition = etm.attr.value.length === 0 ? `''` : etm.attr.value;
    const originals = getOriginals(etm, tmpl, offset);
    const { start, middle, end } = getMainBlock(etm, tmpl, offset);
    const startBlock = `${startMarker}${leadingSpace}@case (${condition}) {${leadingSpace}${lbString}${start}`;
    const endBlock = `${end}${lbString}${leadingSpace}}${endMarker}`;
    const defaultBlock = startBlock + middle + endBlock;
    const updatedTmpl = tmpl.slice(0, etm.start(offset)) + defaultBlock + tmpl.slice(etm.end(offset));
    // this should be the difference between the starting element up to the start of the closing
    // element and the mainblock sans }
    const pre = originals.start.length - startBlock.length;
    const post = originals.end.length - endBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}
function migrateNgSwitchDefault(etm, tmpl, offset) {
    // includes the mandatory semicolon before as
    const lbString = etm.hasLineBreaks ? '\n' : '';
    const leadingSpace = etm.hasLineBreaks ? '' : ' ';
    const originals = getOriginals(etm, tmpl, offset);
    const { start, middle, end } = getMainBlock(etm, tmpl, offset);
    const startBlock = `${startMarker}${leadingSpace}@default {${leadingSpace}${lbString}${start}`;
    const endBlock = `${end}${lbString}${leadingSpace}}${endMarker}`;
    const defaultBlock = startBlock + middle + endBlock;
    const updatedTmpl = tmpl.slice(0, etm.start(offset)) + defaultBlock + tmpl.slice(etm.end(offset));
    // this should be the difference between the starting element up to the start of the closing
    // element and the mainblock sans }
    const pre = originals.start.length - startBlock.length;
    const post = originals.end.length - endBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}

const ngfor = '*ngFor';
const nakedngfor = 'ngFor';
const fors = [ngfor, nakedngfor];
const commaSeparatedSyntax = new Map([
    ['(', ')'],
    ['{', '}'],
    ['[', ']'],
]);
const stringPairs = new Map([
    [`"`, `"`],
    [`'`, `'`],
]);
/**
 * Replaces structural directive ngFor instances with new for.
 * Returns null if the migration failed (e.g. there was a syntax error).
 */
function migrateFor(template) {
    let errors = [];
    let parsed = parseTemplate(template);
    if (parsed.tree === undefined) {
        return { migrated: template, errors, changed: false };
    }
    let result = template;
    const visitor = new ElementCollector(fors);
    checker.visitAll(visitor, parsed.tree.rootNodes);
    calculateNesting(visitor, hasLineBreaks(template));
    // this tracks the character shift from different lengths of blocks from
    // the prior directives so as to adjust for nested block replacement during
    // migration. Each block calculates length differences and passes that offset
    // to the next migrating block to adjust character offsets properly.
    let offset = 0;
    let nestLevel = -1;
    let postOffsets = [];
    for (const el of visitor.elements) {
        let migrateResult = { tmpl: result, offsets: { pre: 0, post: 0 } };
        // applies the post offsets after closing
        offset = reduceNestingOffset(el, nestLevel, offset, postOffsets);
        try {
            migrateResult = migrateNgFor(el, result, offset);
        }
        catch (error) {
            errors.push({ type: ngfor, error });
        }
        result = migrateResult.tmpl;
        offset += migrateResult.offsets.pre;
        postOffsets.push(migrateResult.offsets.post);
        nestLevel = el.nestCount;
    }
    const changed = visitor.elements.length > 0;
    return { migrated: result, errors, changed };
}
function migrateNgFor(etm, tmpl, offset) {
    if (etm.forAttrs !== undefined) {
        return migrateBoundNgFor(etm, tmpl, offset);
    }
    return migrateStandardNgFor(etm, tmpl, offset);
}
function migrateStandardNgFor(etm, tmpl, offset) {
    const aliasWithEqualRegexp = /=\s*(count|index|first|last|even|odd)/gm;
    const aliasWithAsRegexp = /(count|index|first|last|even|odd)\s+as/gm;
    const aliases = [];
    const lbString = etm.hasLineBreaks ? '\n' : '';
    const parts = getNgForParts(etm.attr.value);
    const originals = getOriginals(etm, tmpl, offset);
    // first portion should always be the loop definition prefixed with `let`
    const condition = parts[0].replace('let ', '');
    if (condition.indexOf(' as ') > -1) {
        let errorMessage = `Found an aliased collection on an ngFor: "${condition}".` +
            ' Collection aliasing is not supported with @for.' +
            ' Refactor the code to remove the `as` alias and re-run the migration.';
        throw new Error(errorMessage);
    }
    const loopVar = condition.split(' of ')[0];
    let trackBy = loopVar;
    let aliasedIndex = null;
    let tmplPlaceholder = '';
    for (let i = 1; i < parts.length; i++) {
        const part = parts[i].trim();
        if (part.startsWith('trackBy:')) {
            // build trackby value
            const trackByFn = part.replace('trackBy:', '').trim();
            trackBy = `${trackByFn}($index, ${loopVar})`;
        }
        // template
        if (part.startsWith('template:')) {
            // use an alternate placeholder here to avoid conflicts
            tmplPlaceholder = getPlaceholder(part.split(':')[1].trim(), PlaceholderKind.Alternate);
        }
        // aliases
        // declared with `let myIndex = index`
        if (part.match(aliasWithEqualRegexp)) {
            // 'let myIndex = index' -> ['let myIndex', 'index']
            const aliasParts = part.split('=');
            const aliasedName = aliasParts[0].replace('let', '').trim();
            const originalName = aliasParts[1].trim();
            if (aliasedName !== '$' + originalName) {
                // -> 'let myIndex = $index'
                aliases.push(` let ${aliasedName} = $${originalName}`);
            }
            // if the aliased variable is the index, then we store it
            if (originalName === 'index') {
                // 'let myIndex' -> 'myIndex'
                aliasedIndex = aliasedName;
            }
        }
        // declared with `index as myIndex`
        if (part.match(aliasWithAsRegexp)) {
            // 'index    as   myIndex' -> ['index', 'myIndex']
            const aliasParts = part.split(/\s+as\s+/);
            const originalName = aliasParts[0].trim();
            const aliasedName = aliasParts[1].trim();
            if (aliasedName !== '$' + originalName) {
                // -> 'let myIndex = $index'
                aliases.push(` let ${aliasedName} = $${originalName}`);
            }
            // if the aliased variable is the index, then we store it
            if (originalName === 'index') {
                aliasedIndex = aliasedName;
            }
        }
    }
    // if an alias has been defined for the index, then the trackBy function must use it
    if (aliasedIndex !== null && trackBy !== loopVar) {
        // byId($index, user) -> byId(i, user)
        trackBy = trackBy.replace('$index', aliasedIndex);
    }
    const aliasStr = aliases.length > 0 ? `;${aliases.join(';')}` : '';
    let startBlock = `${startMarker}@for (${condition}; track ${trackBy}${aliasStr}) {${lbString}`;
    let endBlock = `${lbString}}${endMarker}`;
    let forBlock = '';
    if (tmplPlaceholder !== '') {
        startBlock = startBlock + tmplPlaceholder;
        forBlock = startBlock + endBlock;
    }
    else {
        const { start, middle, end } = getMainBlock(etm, tmpl, offset);
        startBlock += start;
        endBlock = end + endBlock;
        forBlock = startBlock + middle + endBlock;
    }
    const updatedTmpl = tmpl.slice(0, etm.start(offset)) + forBlock + tmpl.slice(etm.end(offset));
    const pre = originals.start.length - startBlock.length;
    const post = originals.end.length - endBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}
function migrateBoundNgFor(etm, tmpl, offset) {
    const forAttrs = etm.forAttrs;
    const aliasAttrs = etm.aliasAttrs;
    const aliasMap = aliasAttrs.aliases;
    const originals = getOriginals(etm, tmpl, offset);
    const condition = `${aliasAttrs.item} of ${forAttrs.forOf}`;
    const aliases = [];
    let aliasedIndex = '$index';
    for (const [key, val] of aliasMap) {
        aliases.push(` let ${key.trim()} = $${val}`);
        if (val.trim() === 'index') {
            aliasedIndex = key;
        }
    }
    const aliasStr = aliases.length > 0 ? `;${aliases.join(';')}` : '';
    let trackBy = aliasAttrs.item;
    if (forAttrs.trackBy !== '') {
        // build trackby value
        trackBy = `${forAttrs.trackBy.trim()}(${aliasedIndex}, ${aliasAttrs.item})`;
    }
    const { start, middle, end } = getMainBlock(etm, tmpl, offset);
    const startBlock = `${startMarker}@for (${condition}; track ${trackBy}${aliasStr}) {\n${start}`;
    const endBlock = `${end}\n}${endMarker}`;
    const forBlock = startBlock + middle + endBlock;
    const updatedTmpl = tmpl.slice(0, etm.start(offset)) + forBlock + tmpl.slice(etm.end(offset));
    const pre = originals.start.length - startBlock.length;
    const post = originals.end.length - endBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}
function getNgForParts(expression) {
    const parts = [];
    const commaSeparatedStack = [];
    const stringStack = [];
    let current = '';
    for (let i = 0; i < expression.length; i++) {
        const char = expression[i];
        const isInString = stringStack.length === 0;
        const isInCommaSeparated = commaSeparatedStack.length === 0;
        // Any semicolon is a delimiter, as well as any comma outside
        // of comma-separated syntax, as long as they're outside of a string.
        if (isInString &&
            current.length > 0 &&
            (char === ';' || (char === ',' && isInCommaSeparated))) {
            parts.push(current);
            current = '';
            continue;
        }
        if (stringStack.length > 0 && stringStack[stringStack.length - 1] === char) {
            stringStack.pop();
        }
        else if (stringPairs.has(char)) {
            stringStack.push(stringPairs.get(char));
        }
        if (commaSeparatedSyntax.has(char)) {
            commaSeparatedStack.push(commaSeparatedSyntax.get(char));
        }
        else if (commaSeparatedStack.length > 0 &&
            commaSeparatedStack[commaSeparatedStack.length - 1] === char) {
            commaSeparatedStack.pop();
        }
        current += char;
    }
    if (current.length > 0) {
        parts.push(current);
    }
    return parts;
}

const ngif = '*ngIf';
const boundngif = '[ngIf]';
const nakedngif = 'ngIf';
const ifs = [ngif, nakedngif, boundngif];
/**
 * Replaces structural directive ngif instances with new if.
 * Returns null if the migration failed (e.g. there was a syntax error).
 */
function migrateIf(template) {
    let errors = [];
    let parsed = parseTemplate(template);
    if (parsed.tree === undefined) {
        return { migrated: template, errors, changed: false };
    }
    let result = template;
    const visitor = new ElementCollector(ifs);
    checker.visitAll(visitor, parsed.tree.rootNodes);
    calculateNesting(visitor, hasLineBreaks(template));
    // this tracks the character shift from different lengths of blocks from
    // the prior directives so as to adjust for nested block replacement during
    // migration. Each block calculates length differences and passes that offset
    // to the next migrating block to adjust character offsets properly.
    let offset = 0;
    let nestLevel = -1;
    let postOffsets = [];
    for (const el of visitor.elements) {
        let migrateResult = { tmpl: result, offsets: { pre: 0, post: 0 } };
        // applies the post offsets after closing
        offset = reduceNestingOffset(el, nestLevel, offset, postOffsets);
        try {
            migrateResult = migrateNgIf(el, result, offset);
        }
        catch (error) {
            errors.push({ type: ngif, error });
        }
        result = migrateResult.tmpl;
        offset += migrateResult.offsets.pre;
        postOffsets.push(migrateResult.offsets.post);
        nestLevel = el.nestCount;
    }
    const changed = visitor.elements.length > 0;
    return { migrated: result, errors, changed };
}
function migrateNgIf(etm, tmpl, offset) {
    const matchThen = etm.attr.value.match(/[^\w\d];?\s*then/gm);
    const matchElse = etm.attr.value.match(/[^\w\d];?\s*else/gm);
    if (etm.thenAttr !== undefined || etm.elseAttr !== undefined) {
        // bound if then / if then else
        return buildBoundIfElseBlock(etm, tmpl, offset);
    }
    else if (matchThen && matchThen.length > 0 && matchElse && matchElse.length > 0) {
        // then else
        return buildStandardIfThenElseBlock(etm, tmpl, matchThen[0], matchElse[0], offset);
    }
    else if (matchThen && matchThen.length > 0) {
        // just then
        return buildStandardIfThenBlock(etm, tmpl, matchThen[0], offset);
    }
    else if (matchElse && matchElse.length > 0) {
        // just else
        return buildStandardIfElseBlock(etm, tmpl, matchElse[0], offset);
    }
    return buildIfBlock(etm, tmpl, offset);
}
function buildIfBlock(etm, tmpl, offset) {
    const aliasAttrs = etm.aliasAttrs;
    const aliases = [...aliasAttrs.aliases.keys()];
    if (aliasAttrs.item) {
        aliases.push(aliasAttrs.item);
    }
    // includes the mandatory semicolon before as
    const lbString = etm.hasLineBreaks ? '\n' : '';
    let condition = etm.attr.value
        .replace(' as ', '; as ')
        // replace 'let' with 'as' whatever spaces are between ; and 'let'
        .replace(/;\s*let/g, '; as');
    if (aliases.length > 1 || (aliases.length === 1 && condition.indexOf('; as') > -1)) {
        // only 1 alias allowed
        throw new Error('Found more than one alias on your ngIf. Remove one of them and re-run the migration.');
    }
    else if (aliases.length === 1) {
        condition += `; as ${aliases[0]}`;
    }
    const originals = getOriginals(etm, tmpl, offset);
    const { start, middle, end } = getMainBlock(etm, tmpl, offset);
    const startBlock = `${startMarker}@if (${condition}) {${lbString}${start}`;
    const endBlock = `${end}${lbString}}${endMarker}`;
    const ifBlock = startBlock + middle + endBlock;
    const updatedTmpl = tmpl.slice(0, etm.start(offset)) + ifBlock + tmpl.slice(etm.end(offset));
    // this should be the difference between the starting element up to the start of the closing
    // element and the mainblock sans }
    const pre = originals.start.length - startBlock.length;
    const post = originals.end.length - e=fndBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}
function buildStandardIfElseBlock(etm, tmpl, elseString, offset) {
    // includes the mandatory semicolon before as
    const condition = etm
        .getCondition()
        .replace(' as ', '; as ')
        // replace 'let' with 'as' whatever spaces are between ; and 'let'
        .replace(/;\s*let/g, '; as');
    const elsePlaceholder = getPlaceholder(etm.getTemplateName(elseString));
    return buildIfElseBlock(etm, tmpl, condition, elsePlaceholder, offset);
}
function buildBoundIfElseBlock(etm, tmpl, offset) {
    const aliasAttrs = etm.aliasAttrs;
    const aliases = [...aliasAttrs.aliases.keys()];
    if (aliasAttrs.item) {
        aliases.push(aliasAttrs.item);
    }
    // includes the mandatory semicolon before as
    let condition = etm.attr.value.replace(' as ', '; as ');
    if (aliases.length > 1 || (aliases.length === 1 && condition.indexOf('; as') > -1)) {
        // only 1 alias allowed
        throw new Error('Found more than one alias on your ngIf. Remove one of them and re-run the migration.');
    }
    else if (aliases.length === 1) {
        condition += `; as ${aliases[0]}`;
    }
    const elsePlaceholder = getPlaceholder(etm.elseAttr.value.trim());
    if (etm.thenAttr !== undefined) {
        const thenPlaceholder = getPlaceholder(etm.thenAttr.value.trim());
        return buildIfThenElseBlock(etm, tmpl, condition, thenPlaceholder, elsePlaceholder, offset);
    }
    return buildIfElseBlock(etm, tmpl, condition, elsePlaceholder, offset);
}
function buildIfElseBlock(etm, tmpl, condition, elsePlaceholder, offset) {
    const lbString = etm.hasLineBreaks ? '\n' : '';
    const originals = getOriginals(etm, tmpl, offset);
    const { start, middle, end } = getMainBlock(etm, tmpl, offset);
    const startBlock = `${startMarker}@if (${condition}) {${lbString}${start}`;
    const elseBlock = `${end}${lbString}} @else {${lbString}`;
    const postBlock = elseBlock + elsePlaceholder + `${lbString}}${endMarker}`;
    const ifElseBlock = startBlock + middle + postBlock;
    const tmplStart = tmpl.slice(0, etm.start(offset));
    const tmplEnd = tmpl.slice(etm.end(offset));
    const updatedTmpl = tmplStart + ifElseBlock + tmplEnd;
    const pre = originals.start.length - startBlock.length;
    const post = originals.end.length - postBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}
function buildStandardIfThenElseBlock(etm, tmpl, thenString, elseString, offset) {
    // includes the mandatory semicolon before as
    const condition = etm
        .getCondition()
        .replace(' as ', '; as ')
        // replace 'let' with 'as' whatever spaces are between ; and 'let'
        .replace(/;\s*let/g, '; as');
    const thenPlaceholder = getPlaceholder(etm.getTemplateName(thenString, elseString));
    const elsePlaceholder = getPlaceholder(etm.getTemplateName(elseString));
    return buildIfThenElseBlock(etm, tmpl, condition, thenPlaceholder, elsePlaceholder, offset);
}
function buildStandardIfThenBlock(etm, tmpl, thenString, offset) {
    // includes the mandatory semicolon before as
    const condition = etm
        .getCondition()
        .replace(' as ', '; as ')
        // replace 'let' with 'as' whatever spaces are between ; and 'let'
        .replace(/;\s*let/g, '; as');
    const thenPlaceholder = getPlaceholder(etm.getTemplateName(thenString));
    return buildIfThenBlock(etm, tmpl, condition, thenPlaceholder, offset);
}
function buildIfThenElseBlock(etm, tmpl, condition, thenPlaceholder, elsePlaceholder, offset) {
    const lbString = etm.hasLineBreaks ? '\n' : '';
    const originals = getOriginals(etm, tmpl, offset);
    const startBlock = `${startMarker}@if (${condition}) {${lbString}`;
    const elseBlock = `${lbString}} @else {${lbString}`;
    const postBlock = thenPlaceholder + elseBlock + elsePlaceholder + `${lbString}}${endMarker}`;
    const ifThenElseBlock = startBlock + postBlock;
    const tmplStart = tmpl.slice(0, etm.start(offset));
    const tmplEnd = tmpl.slice(etm.end(offset));
    const updatedTmpl = tmplStart + ifThenElseBlock + tmplEnd;
    // We ignore the contents of the element on if then else.
    // If there's anything there, we need to account for the length in the offset.
    const pre = originals.start.length + originals.childLength - startBlock.length;
    const post = originals.end.length - postBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}
function buildIfThenBlock(etm, tmpl, condition, thenPlaceholder, offset) {
    const lbString = etm.hasLineBreaks ? '\n' : '';
    const originals = getOriginals(etm, tmpl, offset);
    const startBlock = `${startMarker}@if (${condition}) {${lbString}`;
    const postBlock = thenPlaceholder + `${lbString}}${endMarker}`;
    const ifThenBlock = startBlock + postBlock;
    const tmplStart = tmpl.slice(0, etm.start(offset));
    const tmplEnd = tmpl.slice(etm.end(offset));
    const updatedTmpl = tmplStart + ifThenBlock + tmplEnd;
    // We ignore the contents of the element on if then else.
    // If there's anything there, we need to account for the length in the offset.
    const pre = originals.start.length + originals.childLength - startBlock.length;
    const post = originals.end.length - postBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}

const ngswitch = '[ngSwitch]';
const switches = [ngswitch];
/**
 * Replaces structural directive ngSwitch instances with new switch.
 * Returns null if the migration failed (e.g. there was a syntax error).
 */
function migrateSwitch(template) {
    let errors = [];
    let parsed = parseTemplate(template);
    if (parsed.tree === undefined) {
        return { migrated: template, errors, changed: false };
    }
    let result = template;
    const visitor = new ElementCollector(switches);
    checker.visitAll(visitor, parsed.tree.rootNodes);
    calculateNesting(visitor, hasLineBreaks(template));
    // this tracks the character shift from different lengths of blocks from
    // the prior directives so as to adjust for nested block replacement during
    // migration. Each block calculates length differences and passes that offset
    // to the next migrating block to adjust character offsets properly.
    let offset = 0;
    let nestLevel = -1;
    let postOffsets = [];
    for (const el of visitor.elements) {
        let migrateResult = { tmpl: result, offsets: { pre: 0, post: 0 } };
        // applies the post offsets after closing
        offset = reduceNestingOffset(el, nestLevel, offset, postOffsets);
        if (el.attr.name === ngswitch) {
            try {
                migrateResult = migrateNgSwitch(el, result, offset);
            }
            catch (error) {
                errors.push({ type: ngswitch, error });
            }
        }
        result = migrateResult.tmpl;
        offset += migrateResult.offsets.pre;
        postOffsets.push(migrateResult.offsets.post);
        nestLevel = el.nestCount;
    }
    const changed = visitor.elements.length > 0;
    return { migrated: result, errors, changed };
}
function assertValidSwitchStructure(children) {
    for (const child of children) {
        if (child instanceof checker.Text && child.value.trim() !== '') {
            throw new Error(`Text node: "${child.value}" would result in invalid migrated @switch block structure. ` +
                `@switch can only have @case or @default as children.`);
        }
        else if (child instanceof checker.Element) {
            let hasCase = false;
            for (const attr of child.attrs) {
                if (cases.includes(attr.name)) {
                    hasCase = true;
                }
            }
            if (!hasCase) {
                throw new Error(`Element node: "${child.name}" would result in invalid migrated @switch block structure. ` +
                    `@switch can only have @case or @default as children.`);
            }
        }
    }
}
function migrateNgSwitch(etm, tmpl, offset) {
    const lbString = etm.hasLineBreaks ? '\n' : '';
    const condition = etm.attr.value;
    const originals = getOriginals(etm, tmpl, offset);
    assertValidSwitchStructure(originals.childNodes);
    const { start, middle, end } = getMainBlock(etm, tmpl, offset);
    const startBlock = `${startMarker}${start}${lbString}@switch (${condition}) {`;
    const endBlock = `}${lbString}${end}${endMarker}`;
    const switchBlock = startBlock + middle + endBlock;
    const updatedTmpl = tmpl.slice(0, etm.start(offset)) + switchBlock + tmpl.slice(etm.end(offset));
    // this should be the difference between the starting element up to the start of the closing
    // element and the mainblock sans }
    const pre = originals.start.length - startBlock.length;
    const post = originals.end.length - endBlock.length;
    return { tmpl: updatedTmpl, offsets: { pre, post } };
}

/**
 * Actually migrates a given template to the new syntax
 */
function migrateTemplate(template, templateType, node, file, format = true, analyzedFiles) {
    let errors = [];
    let migrated = template;
    if (templateType === 'template' || templateType === 'templateUrl') {
        const ifResult = migrateIf(template);
        const forResult = migrateFor(ifResult.migrated);
        const switchResult = migrateSwitch(forResult.migrated);
        if (switchResult.errors.length > 0) {
            return { migrated: template, errors: switchResult.errors };
        }
        const caseResult = migrateCase(switchResult.migrated);
        const templateResult = processNgTemplates(caseResult.migrated, file.sourceFile);
        if (templateResult.err !== undefined) {
            return { migrated: template, errors: [{ type: 'template', error: templateResult.err }] };
        }
        migrated = templateResult.migrated;
        const changed = ifResult.changed || forResult.changed || switchResult.changed || caseResult.changed;
        if (changed) {
            // determine if migrated template is a valid structure
            // if it is not, fail out
            const errors = validateMigratedTemplate(migrated, file.sourceFile.fileName);
            if (errors.length > 0) {
                return { migrated: template, errors };
            }
        }
        if (format && changed) {
            migrated = formatTemplate(migrated, templateType);
        }
        const markerRegex = new RegExp(`${startMarker}|${endMarker}|${startI18nMarker}|${endI18nMarker}`, 'gm');
        migrated = migrated.replace(markerRegex, '');
        file.removeCommonModule = canRemoveCommonModule(template);
        file.canRemoveImports = true;
        // when migrating an external template, we have to pass back
        // whether it's safe to remove the CommonModule to the
        // original component class source file
        if (templateType === 'templateUrl' &&
            analyzedFiles !== null &&
            analyzedFiles.has(file.sourceFile.fileName)) {
            const componentFile = analyzedFiles.get(file.sourceFile.fileName);
            componentFile.getSortedRanges();
            // we have already checked the template file to see if it is safe to remove the imports
            // and common module. This check is passed off to the associated .ts file here so
            // the class knows whether it's safe to remove from the template side.
            componentFile.removeCommonModule = file.removeCommonModule;
            componentFile.canRemoveImports = file.canRemoveImports;
            // At this point, we need to verify the component class file doesn't have any other imports
            // that prevent safe removal of common module. It could be that there's an associated ngmodule
            // and in that case we can't safely remove the common module import.
            componentFile.verifyCanRemoveImports();
        }
        file.verifyCanRemoveImports();
        errors = [
            ...ifResult.errors,
            ...forResult.errors,
            ...switchResult.errors,
            ...caseResult.errors,
        ];
    }
    else if (file.canRemoveImports) {
        migrated = removeImports(template, node, file);
    }
    return { migrated, errors };
}

function migrate(options) {
    return async (tree, context) => {
        const basePath = process.cwd();
        const pathToMigrate = compiler_host.normalizePath(p.join(basePath, options.path));
        let allPaths = [];
        if (pathToMigrate.trim() !== '') {
            allPaths.push(pathToMigrate);
        }
        if (!allPaths.length) {
            throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the control flow migration.');
        }
        let errors = [];
        for (const tsconfigPath of allPaths) {
            const migrateErrors = runControlFlowMigration(tree, tsconfigPath, basePath, pathToMigrate, options);
            errors = [...errors, ...migrateErrors];
        }
        if (errors.length > 0) {
            context.logger.warn(`WARNING: ${errors.length} errors occurred during your migration:\n`);
            errors.forEach((err) => {
                context.logger.warn(err);
            });
        }
    };
}
function runControlFlowMigration(tree, tsconfigPath, basePath, pathToMigrate, schematicOptions) {
    if (schematicOptions.path.startsWith('..')) {
        throw new schematics.SchematicsException('Cannot run control flow migration outside of the current project.');
    }
    const program = compiler_host.createMigrationProgram(tree, tsconfigPath, basePath);
    const sourceFiles = program
        .getSourceFiles()
        .filter((sourceFile) => sourceFile.fileName.startsWith(pathToMigrate) &&
        compiler_host.canMigrateFile(basePath, sourceFile, program));
    if (sourceFiles.length === 0) {
        throw new schematics.SchematicsException(`Could not find any files to migrate under the path ${pathToMigrate}. Cannot run the control flow migration.`);
    }
    const analysis = new Map();
    const migrateErrors = new Map();
    for (const sourceFile of sourceFiles) {
        analyze(sourceFile, analysis);
    }
    // sort files with .html files first
    // this ensures class files know if it's safe to remove CommonModule
    const paths = sortFilePaths([...analysis.keys()]);
    for (const path of paths) {
        const file = analysis.get(path);
        const ranges = file.getSortedRanges();
        const relativePath = p.relative(basePath, path);
        const content = tree.readText(relativePath);
        const update = tree.beginUpdate(relativePath);
        for (const { start, end, node, type } of ranges) {
            const template = content.slice(start, end);
            const length = (end ?? content.length) - start;
            const { migrated, errors } = migrateTemplate(template, type, node, file, schematicOptions.format, analysis);
            if (migrated !== null) {
                update.remove(start, length);
                update.insertLeft(start, migrated);
            }
            if (errors.length > 0) {
                migrateErrors.set(path, errors);
            }
        }
        tree.commitUpdate(update);
    }
    const errorList = [];
    for (let [template, errors] of migrateErrors) {
        errorList.push(generateErrorMessage(template, errors));
    }
    return errorList;
}
function sortFilePaths(names) {
    names.sort((a, _) => (a.endsWith('.html') ? -1 : 0));
    return names;
}
function generateErrorMessage(path, errors) {
    let errorMessage = `Template "${path}" encountered ${errors.length} errors during migration:\n`;
    errorMessage += errors.map((e) => ` - ${e.type}: ${e.error}\n`);
    return errorMessage;
}

exports.migrate = migrate;
O@x~'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var schematics = require('@angular-devkit/schematics');
var p = require('path');
var project_tsconfig_paths = require('./project_tsconfig_paths-CDVxT6Ov.cjs');
var compiler_host = require('./compiler_host-C55Cczah.cjs');
var ts = require('typescript');
var imports = require('./imports-CIX-JgAN.cjs');
require('@angular-devkit/core');
require('./checker-BwV9MjSQ.cjs');
require('os');
require('fs');
require('module');
require('url');

const CORE = '@angular/core';
const DIRECTIVE = 'Directive';
const COMPONENT = 'Component';
const PIPE = 'Pipe';
function migrateFile(sourceFile, rewriteFn) {
    const changeTracker = new compiler_host.ChangeTracker(ts.createPrinter());
    // Check if there are any imports of the `AfterRenderPhase` enum.
    const coreImports = imports.getNamedImports(sourceFile, CORE);
    if (!coreImports) {
        return;
    }
    const directive = imports.getImportSpecifier(sourceFile, CORE, DIRECTIVE);
    const component = imports.getImportSpecifier(sourceFile, CORE, COMPONENT);
    const pipe = imports.getImportSpecifier(sourceFile, CORE, PIPE);
    if (!directive && !component && !pipe) {
        return;
    }
    ts.forEachChild(sourceFile, function visit(node) {
        ts.forEachChild(node, visit);
        // First we need to check for class declarations
        // Decorators will come after
        if (!ts.isClassDeclaration(node)) {
            return;
        }
        ts.getDecorators(node)?.forEach((decorator) => {
            if (!ts.isDecorator(decorator)) {
                return;
            }
            const callExpression = decorator.expression;
            if (!ts.isCallExpression(callExpression)) {
                return;
            }
            const decoratorIdentifier = callExpression.expression;
            if (!ts.isIdentifier(decoratorIdentifier)) {
                return;
            }
            // Checking the identifier of the decorator by comparing to the import specifier
            switch (decoratorIdentifier.text) {
                case directive?.name.text:
                case component?.name.text:
                case pipe?.name.text:
                    break;
                default:
                    // It's not a decorator to migrate
                    return;
            }
            const [decoratorArgument] = callExpression.arguments;
            if (!decoratorArgument || !ts.isObjectLiteralExpression(decoratorArgument)) {
                return;
            }
            const properties = decoratorArgument.properties;
            const standaloneProp = getStandaloneProperty(properties);
            const hasImports = decoratorHasImports(decoratorArgument);
            // We'll use the presence of imports to keep the migration idempotent
            // We need to take care of 3 cases
            // - standalone: true  => remove the property if we have imports
            // - standalone: false => nothing
            // - No standalone property => add a standalone: false property if there are no imports
            let newProperties;
            if (!standaloneProp) {
                if (!hasImports) {
                    const standaloneFalseProperty = ts.factory.createPropertyAssignment('standalone', ts.factory.createFalse());
                    newProperties = [...properties, standaloneFalseProperty];
                }
            }
            else if (standaloneProp.value === ts.SyntaxKind.TrueKeyword && hasImports) {
                // To keep the migration idempotent, we'll only remove the standalone prop when there are imports
                newProperties = properties.filter((p) => p !== standaloneProp.property);
            }
            if (newProperties) {
                // At this point we know that we need to add standalone: false or
                // remove an existing standalone: true property.
                const newPropsArr = ts.factory.createNodeArray(newProperties);
                const newFirstArg = ts.factory.createObjectLiteralExpression(newPropsArr, true);
                changeTracker.replaceNode(decoratorArgument, newFirstArg);
            }
        });
    });
    // Write the changes.
    for (const changesInFile of changeTracker.recordChanges().values()) {
        for (const change of changesInFile) {
            rewriteFn(change.start, change.removeLength ?? 0, change.text);
        }
    }
}
function getStandaloneProperty(properties) {
    for (const prop of properties) {
        if (ts.isShorthandPropertyAssignment(prop) && prop.name.text) {
            return { property: prop, value: prop.objectAssignmentInitializer };
        }
        if (isStandaloneProperty(prop)) {
            if (prop.initializer.kind === ts.SyntaxKind.TrueKeyword ||
                prop.initializer.kind === ts.SyntaxKind.FalseKeyword) {
                return { property: prop, value: prop.initializer.kind };
            }
            else {
                return { property: prop, value: prop.initializer };
            }
        }
    }
    return undefined;
}
function isStandaloneProperty(prop) {
    return (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'standalone');
}
function decoratorHasImports(decoratorArgument) {
    for (const prop of decoratorArgument.properties) {
        if (ts.isPropertyAssignment(prop) &&
            ts.isIdentifier(prop.name) &&
            prop.name.text === 'imports') {
            if (prop.initializer.kind === ts.SyntaxKind.ArrayLiteralExpression ||
                prop.initializer.kind === ts.SyntaxKind.Identifier) {
                return true;
            }
        }
    }
    return false;
}

function migrate() {
    return async (tree) => {
        const { buildPaths, testPaths } = await project_tsconfig_paths.getProjectTsConfigPaths(tree);
        const basePath = process.cwd();
        const allPaths = [...buildPaths, ...testPaths];
        if (!allPaths.length) {
            throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the explicit-standalone-flag migration.');
        }
        for (const tsconfigPath of allPaths) {
            runMigration(tree, tsconfigPath, basePath);
        }
    };
}
function runMigration(tree, tsconfigPath, basePath) {
    const program = compiler_host.createMigrationProgram(tree, tsconfigPath, basePath);
    const sourceFiles = program
        .getSourceFiles()
        .filter((sourceFile) => compiler_host.canMigrateFile(basePath, sourceFile, program));
    for (const sourceFile of sourceFiles) {
        let update = null;
        const rewriter = (startPos, width, text) => {
            if (update === null) {
                // Lazily initialize update, because most files will not require migration.
                update = tree.beginUpdate(p.relative(basePath, sourceFile.fileName));
            }
            update.remove(startPos, width);
            if (text !== null) {
                update.insertLeft(startPos, text);
            }
        };
        migrateFile(sourceFile, rewriter);
        if (update !== null) {
            tree.commitUpdate(update);
        }
    }
}

exports.migrate = migrate;
xT'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');

/** Gets import information about the specified identifier by using the Type checker. */
function getImportOfIdentifier(typeChecker, node) {
    const symbol = typeChecker.getSymbolAtLocation(node);
    if (!symbol || symbol.declarations === undefined || !symbol.declarations.length) {
        return null;
    }
    const decl = symbol.declarations[0];
    if (!ts.isImportSpecifier(decl)) {
        return null;
    }
    const importDecl = decl.parent.parent.parent;
    if (!ts.isImportDeclaration(importDecl) || !ts.isStringLiteral(importDecl.moduleSpecifier)) {
        return null;
    }
    return {
        // Handles aliased imports: e.g. "import {Component as myComp} from ...";
        name: decl.propertyName ? decl.propertyName.text : decl.name.text,
        importModule: importDecl.moduleSpecifier.text,
        node: importDecl,
    };
}
/**
 * Gets a top-level import specifier with a specific name that is imported from a particular module.
 * E.g. given a file that looks like:
 *
 * ```ts
 * import { Component, Directive } from '@angular/core';
 * import { Foo } from './foo';
 * ```
 *
 * Calling `getImportSpecifier(sourceFile, '@angular/core', 'Directive')` will yield the node
 * referring to `Directive` in the top import.
 *
 * @param sourceFile File in which to look for imports.
 * @param moduleName Name of the import's module.
 * @param specifierName Original name of the specifier to look for. Aliases will be resolved to
 *    their original name.
 */
function getImportSpecifier(sourceFile, moduleName, specifierName) {
    return getImportSpecifiers(sourceFile, moduleName, specifierName)[0] ?? null;
}
function getImportSpecifiers(sourceFile, moduleName, specifierOrSpecifiers) {
    const matches = [];
    for (const node of sourceFile.statements) {
        if (!ts.isImportDeclaration(node) || !ts.isStringLiteral(node.moduleSpecifier)) {
            continue;
        }
        const namedBindings = node.importClause?.namedBindings;
        const isMatch = typeof moduleName === 'string'
            ? node.moduleSpecifier.text === moduleName
            : moduleName.test(node.moduleSpecifier.text);
        if (!isMatch || !namedBindings || !ts.isNamedImports(namedBindings)) {
            continue;
        }
        if (typeof specifierOrSpecifiers === 'string') {
            const match = findImportSpecifier(namedBindings.elements, specifierOrSpecifiers);
            if (match) {
                matches.push(match);
            }
        }
        else {
            for (const specifierName of specifierOrSpecifiers) {
                const match = findImportSpecifier(namedBindings.elements, specifierName);
                if (match) {
                    matches.push(match);
                }
            }
        }
    }
    return matches;
}
function getNamedImports(sourceFile, moduleName) {
    for (const node of sourceFile.statements) {
        if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) {
            const isMatch = node.moduleSpecifier.text === moduleName
                ;
            const namedBindings = node.importClause?.namedBindings;
            if (isMatch && namedBindings && ts.isNamedImports(namedBindings)) {
                return namedBindings;
            }
        }
    }
    return null;
}
/** Finds an import specifier with a particular name. */
function findImportSpecifier(nodes, specifierName) {
    return nodes.find((element) => {
        const { name, propertyName } = element;
        return propertyName ? propertyName.text === specifierName : name.text === specifierName;
    });
}

exports.getImportOfIdentifier = getImportOfIdentifier;
exports.getImportSpecifier = getImportSpecifier;
exports.getNamedImports = getNamedImports;
xpX'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');
require('os');
var checker = require('./checker-BwV9MjSQ.cjs');
var index = require('./index-BnJH1Hc7.cjs');
require('path');
var project_paths = require('./project_paths-DY3SIODd.cjs');

function getMemberName(member) {
    if (member.name === undefined) {
        return null;
    }
    if (ts.isIdentifier(member.name) || ts.isStringLiteralLike(member.name)) {
        return member.name.text;
    }
    if (ts.isPrivateIdentifier(member.name)) {
        return `#${member.name.text}`;
    }
    return null;
}

/** Checks whether the given node can be an `@Input()` declaration node. */
function isInputContainerNode(node) {
    return (((ts.isAccessor(node) && ts.isClassDeclaration(node.parent)) ||
        ts.isPropertyDeclaration(node)) &&
        getMemberName(node) !== null);
}

/**
 * Detects `query(By.directive(T)).componentInstance` patterns and enhances
 * them with information of `T`. This is important because `.componentInstance`
 * is currently typed as `any` and may cause runtime test failures after input
 * migrations then.
 *
 * The reference resolution pass leverages information from this pattern
 * recognizer.
 */
class DebugElementComponentInstance {
    checker;
    cache = new WeakMap();
    constructor(checker) {
        this.checker = checker;
    }
    detect(node) {
        if (this.cache.has(node)) {
            return this.cache.get(node);
        }
        if (!ts.isPropertyAccessExpression(node)) {
            return null;
        }
        // Check for `<>.componentInstance`.
        if (!ts.isIdentifier(node.name) || node.name.text !== 'componentInstance') {
            return null;
        }
        // Check for `<>.query(..).<>`.
        if (!ts.isCallExpression(node.expression) ||
            !ts.isPropertyAccessExpression(node.expression.expression) ||
            !ts.isIdentifier(node.expression.expression.name) ||
            node.expression.expression.name.text !== 'query') {
            return null;
        }
        const queryCall = node.expression;
        if (queryCall.arguments.length !== 1) {
            return null;
        }
        const queryArg = queryCall.arguments[0];
        let typeExpr;
        if (ts.isCallExpression(queryArg) &&
            queryArg.arguments.length === 1 &&
            ts.isIdentifier(queryArg.arguments[0])) {
            // Detect references, like: `query(By.directive(T))`.
            typeExpr = queryArg.arguments[0];
        }
        else if (ts.isIdentifier(queryArg)) {
            // Detect references, like: `harness.query(T)`.
            typeExpr = queryArg;
        }
        else {
            return null;
        }
        const symbol = this.checker.getSymbolAtLocation(typeExpr);
        if (symbol?.valueDeclaration === undefined ||
            !ts.isClassDeclaration(symbol?.valueDeclaration)) {
            // Cache this as we use the expensive type checker.
            this.cache.set(node, null);
            return null;
        }
        const type = this.checker.getTypeAtLocation(symbol.valueDeclaration);
        this.cache.set(node, type);
        return type;
    }
}

/**
 * Recognizes `Partial<T>` instances in Catalyst tests. Those type queries
 * are likely used for typing property initialization values for the given class `T`
 * and we have a few scenarios:
 *
 *   1. The API does not unwrap signal inputs. In which case, the values are likely no
 *      longer assignable to an `InputSignal`.
 *   2. The API does unwrap signal inputs, in which case we need to unwrap the `Partial`
 *      because the values are raw initial values, like they were before.
 *
 * We can enable this heuristic when we detect Catalyst as we know it supports unwrapping.
 */
class PartialDirectiveTypeInCatalystTests {
    checker;
    knownFields;
    constructor(checker, knownFields) {
        this.checker = checker;
        this.knownFields = knownFields;
    }
    detect(node) {
        // Detect `Partial<...>`
        if (!ts.isTypeReferenceNode(node) ||
            !ts.isIdentifier(node.typeName) ||
            node.typeName.text !== 'Partial') {
            return null;
        }
        // Ignore if the source file doesn't reference Catalyst.
        if (!node.getSourceFile().text.includes('angular2/testing/catalyst')) {
            return null;
        }
        // Extract T of `Partial<T>`.
        const cmpTypeArg = node.typeArguments?.[0];
        if (!cmpTypeArg ||
            !ts.isTypeReferenceNode(cmpTypeArg) ||
            !ts.isIdentifier(cmpTypeArg.typeName)) {
            return null;
        }
        const cmpType = cmpTypeArg.typeName;
        const symbol = this.checker.getSymbolAtLocation(cmpType);
        // Note: Technically the class might be derived of an input-containing class,
        // but this is out of scope for now. We can expand if we see it's a common case.
        if (symbol?.valueDeclaration === undefined ||
            !ts.isClassDeclaration(symbol.valueDeclaration) ||
            !this.knownFields.shouldTrackClassReference(symbol.valueDeclaration)) {
            return null;
        }
        return { referenceNode: node, targetClass: symbol.valueDeclaration };
    }
}

/**
 * Attempts to look up the given property access chain using
 * the type checker.
 *
 * Notably this is not as safe as using the type checker directly to
 * retrieve symbols of a given identifier, but in some cases this is
 * a necessary approach to compensate e.g. for a lack of TCB information
 * when processing Angular templates.
 *
 * The path is a list of properties to be accessed sequentially on the
 * given type.
 */
function lookupPropertyAccess(checker, type, path, options = {}) {
    let symbol = null;
    for (const propName of path) {
        // Note: We support assuming `NonNullable` for the pathl This is necessary
        // in some situations as otherwise the lookups would fail to resolve the target
        // symbol just because of e.g. a ternary. This is used in the signal input migration
        // for host bindings.
        type = options.ignoreNullability ? type.getNonNullableType() : type;
        const propSymbol = type.getProperty(propName);
        if (propSymbol === undefined) {
            return null;
        }
        symbol = propSymbol;
        type = checker.getTypeOfSymbol(propSymbol);
    }
    if (symbol === null) {
        return null;
    }
    return { symbol, type };
}

/**
 * AST visitor that iterates through a template and finds all
 * input references.
 *
 * This resolution is important to be able to migrate references to inputs
 * that will be migrated to signal inputs.
 */
class TemplateReferenceVisitor extends checker.RecursiveVisitor$1 {
    result = [];
    /**
     * Whether we are currently descending into HTML AST nodes
     * where all bound attributes are considered potentially narrowing.
     *
     * Keeps track of all referenced inputs in such attribute expressions.
     */
    templateAttributeReferencedFields = null;
    expressionVisitor;
    seenKnownFieldsCount = new Map();
    constructor(typeChecker, templateTypeChecker, componentClass, knownFields, fieldNamesToConsiderForReferenceLookup) {
        super();
        this.expressionVisitor = new TemplateExpressionReferenceVisitor(typeChecker, templateTypeChecker, componentClass, knownFields, fieldNamesToConsiderForReferenceLookup);
    }
    checkExpressionForReferencedFields(activeNode, expressionNode) {
        const referencedFields = this.expressionVisitor.checkTemplateExpression(activeNode, expressionNode);
        // Add all references to the overall visitor result.
        this.result.push(...referencedFields);
        // Count usages of seen input references. We'll use this to make decisions
        // based on whether inputs are potentially narrowed or not.
        for (const input of referencedFields) {
            this.seenKnownFieldsCount.set(input.targetField.key, (this.seenKnownFieldsCount.get(input.targetField.key) ?? 0) + 1);
        }
        return referencedFields;
    }
    descendAndCheckForNarrowedSimilarReferences(potentiallyNarrowedInputs, descend) {
        const inputs = potentiallyNarrowedInputs.map((i) => ({
            ref: i,
            key: i.targetField.key,
            pastCount: this.seenKnownFieldsCount.get(i.targetField.key) ?? 0,
        }));
        descend();
        for (const input of inputs) {
            // Input was referenced inside a narrowable spot, and is used in child nodes.
            // This is a sign for the input to be narrowed. Mark it as such.
            if ((this.seenKnownFieldsCount.get(input.key) ?? 0) > input.pastCount) {
                input.ref.isLikelyNarrowed = true;
            }
        }
    }
    visitTemplate(template) {
        // Note: We assume all bound expressions for templates may be subject
        // to TCB narrowing. This is relevant for now until we support narrowing
        // of signal calls in templates.
        // TODO: Remove with: https://github.com/angular/angular/pull/55456.
        this.templateAttributeReferencedFields = [];
        checker.visitAll$1(this, template.attributes);
        checker.visitAll$1(this, template.templateAttrs);
        // If we are dealing with a microsyntax template, do not check
        // inputs and outputs as those are already passed to the children.
        // Template attributes may contain relevant expressions though.
        if (template.tagName === 'ng-template') {
            checker.visitAll$1(this, template.inputs);
            checker.visitAll$1(this, template.outputs);
        }
        const referencedInputs = this.templateAttributeReferencedFields;
        this.templateAttributeReferencedFields = null;
        this.descendAndCheckForNarrowedSimilarReferences(referencedInputs, () => {
            checker.visitAll$1(this, template.children);
            checker.visitAll$1(this, template.references);
            checker.visitAll$1(this, template.variables);
        });
    }
    visitIfBlockBranch(block) {
        if (block.expression) {
            const referencedFields = this.checkExpressionForReferencedFields(block, block.expression);
            this.descendAndCheckForNarrowedSimilarReferences(referencedFields, () => {
                super.visitIfBlockBranch(block);
            });
        }
        else {
            super.visitIfBlockBranch(block);
        }
    }
    visitForLoopBlock(block) {
        this.checkExpressionForReferencedFields(block, block.expression);
        this.checkExpressionForReferencedFields(block, block.trackBy);
        super.visitForLoopBlock(block);
    }
    visitSwitchBlock(block) {
        const referencedFields = this.checkExpressionForReferencedFields(block, block.expression);
        this.descendAndCheckForNarrowedSimilarReferences(referencedFields, () => {
            super.visitSwitchBlock(block);
        });
    }
    visitSwitchBlockCase(block) {
        if (block.expression) {
            const referencedFields = this.checkExpressionForReferencedFields(block, block.expression);
            this.descendAndCheckForNarrowedSimilarReferences(referencedFields, () => {
                super.visitSwitchBlockCase(block);
            });
        }
        else {
            super.visitSwitchBlockCase(block);
        }
    }
    visitDeferredBlock(deferred) {
        if (deferred.triggers.when) {
            this.checkExpressionForReferencedFields(deferred, deferred.triggers.when.value);
        }
        if (deferred.prefetchTriggers.when) {
            this.checkExpressionForReferencedFields(deferred, deferred.prefetchTriggers.when.value);
        }
        super.visitDeferredBlock(deferred);
    }
    visitBoundText(text) {
        this.checkExpressionForReferencedFields(text, text.value);
    }
    visitBoundEvent(attribute) {
        this.checkExpressionForReferencedFields(attribute, attribute.handler);
    }
    visitBoundAttribute(attribute) {
        const referencedFields = this.checkExpressionForReferencedFields(attribute, attribute.value);
        // Attributes inside templates are potentially "narrowed" and hence we
        // keep track of all referenced inputs to see if they actually are.
        if (this.templateAttributeReferencedFields !== null) {
            this.templateAttributeReferencedFields.push(...referencedFields);
        }
    }
}
/**
 * Expression AST visitor that checks whether a given expression references
 * a known `@Input()`.
 *
 * This resolution is important to be able to migrate references to inputs
 * that will be migrated to signal inputs.
 */
class TemplateExpressionReferenceVisitor extends checker.RecursiveAstVisitor {
    typeChecker;
    templateTypeChecker;
    componentClass;
    knownFields;
    fieldNamesToConsiderForReferenceLookup;
    activeTmplAstNode = null;
    detectedInputReferences = [];
    isInsideObjectShorthandExpression = false;
    insideConditionalExpressionsWithReads = [];
    constructor(typeChecker, templateTypeChecker, componentClass, knownFields, fieldNamesToConsiderForReferenceLookup) {
        super();
        this.typeChecker = typeChecker;
        this.templateTypeChecker = templateTypeChecker;
        this.componentClass = componentClass;
        this.knownFields = knownFields;
        this.fieldNamesToConsiderForReferenceLookup = fieldNamesToConsiderForReferenceLookup;
    }
    /** Checks the given AST expression. */
    checkTemplateExpression(activeNode, expressionNode) {
        this.detectedInputReferences = [];
        this.activeTmplAstNode = activeNode;
        expressionNode.visit(this, []);
        return this.detectedInputReferences;
    }
    visit(ast, context) {
        super.visit(ast, [...context, ast]);
    }
    // Keep track when we are inside an object shorthand expression. This is
    // necessary as we need to expand the shorthand to invoke a potential new signal.
    // E.g. `{bla}` may be transformed to `{bla: bla()}`.
    visitLiteralMap(ast, context) {
        for (const [idx, key] of ast.keys.entries()) {
            this.isInsideObjectShorthandExpression = !!key.isShorthandInitialized;
            ast.values[idx].visit(this, context);
            this.isInsideObjectShorthandExpression = false;
        }
    }
    visitPropertyRead(ast, context) {
        this._inspectPropertyAccess(ast, context);
        super.visitPropertyRead(ast, context);
    }
    visitSafePropertyRead(ast, context) {
        this._inspectPropertyAccess(ast, context);
        super.visitPropertyRead(ast, context);
    }
    visitPropertyWrite(ast, context) {
        this._inspectPropertyAccess(ast, context);
        super.visitPropertyWrite(ast, context);
    }
    visitConditional(ast, context) {
        this.visit(ast.condition, context);
        this.insideConditionalExpressionsWithReads.push(ast.condition);
        this.visit(ast.trueExp, context);
        this.visit(ast.falseExp, context);
        this.insideConditionalExpressionsWithReads.pop();
    }
    /**
     * Inspects the property access and attempts to resolve whether they access
     * a known field. If so, the result is captured.
     */
    _inspectPropertyAccess(ast, astPath) {
        if (this.fieldNamesToConsiderForReferenceLookup !== null &&
            !this.fieldNamesToConsiderForReferenceLookup.has(ast.name)) {
            return;
        }
        const isWrite = !!(ast instanceof checker.PropertyWrite ||
            (this.activeTmplAstNode && isTwoWayBindingNode(this.activeTmplAstNode)));
        this._checkAccessViaTemplateTypeCheckBlock(ast, isWrite, astPath) ||
            this._checkAccessViaOwningComponentClassType(ast, isWrite, astPath);
    }
    /**
     * Checks whether the node refers to an input using the TCB information.
     * Type check block may not exist for e.g. test components, so this can return `null`.
     */
    _checkAccessViaTemplateTypeCheckBlock(ast, isWrite, astPath) {
        // There might be no template type checker. E.g. if we check host bindings.
        if (this.templateTypeChecker === null) {
            return false;
        }
        const symbol = this.templateTypeChecker.getSymbolOfNode(ast, this.componentClass);
        if (symbol?.kind !== checker.SymbolKind.Expression || symbol.tsSymbol === null) {
            return false;
        }
        // Dangerous: Type checking symbol retrieval is a totally different `ts.Program`,
        // than the one where we analyzed `knownInputs`.
        // --> Find the input via its input id.
        const targetInput = this.knownFields.attemptRetrieveDescriptorFromSymbol(symbol.tsSymbol);
        if (targetInput === null) {
            return false;
        }
        this.detectedInputReferences.push({
            targetNode: targetInput.node,
            targetField: targetInput,
            read: ast,
            readAstPath: astPath,
            context: this.activeTmplAstNode,
            isLikelyNarrowed: this._isPartOfNarrowingTernary(ast),
            isObjectShorthandExpression: this.isInsideObjectShorthandExpression,
            isWrite,
        });
        return true;
    }
    /**
     * Simple resolution checking whether the given AST refers to a known input.
     * This is a fallback for when there is no type checking information (e.g. in host bindings).
     *
     * It attempts to resolve references by traversing accesses of the "component class" type.
     * e.g. `this.bla` is resolved via `CompType#bla` and further.
     */
    _checkAccessViaOwningComponentClassType(ast, isWrite, astPath) {
        // We might check host bindings, which can never point to template variables or local refs.
        const expressionTemplateTarget = this.templateTypeChecker === null
            ? null
            : this.templateTypeChecker.getExpressionTarget(ast, this.componentClass);
        // Skip checking if:
        // - the reference resolves to a template variable or local ref. No way to resolve without TCB.
        // - the owning component does not have a name (should not happen technically).
        if (expressionTemplateTarget !== null || this.componentClass.name === undefined) {
            return;
        }
        const property = traverseReceiverAndLookupSymbol(ast, this.componentClass, this.typeChecker);
        if (property === null) {
            return;
        }
        const matchingTarget = this.knownFields.attemptRetrieveDescriptorFromSymbol(property);
        if (matchingTarget === null) {
            return;
        }
        this.detectedInputReferences.push({
            targetNode: matchingTarget.node,
            targetField: matchingTarget,
            read: ast,
            readAstPath: astPath,
            context: this.activeTmplAstNode,
            isLikelyNarrowed: this._isPartOfNarrowingTernary(ast),
            isObjectShorthandExpression: this.isInsideObjectShorthandExpression,
            isWrite,
        });
    }
    _isPartOfNarrowingTernary(read) {
        // Note: We do not safe check that the reads are fully matching 1:1. This is acceptable
        // as worst case we just skip an input from being migrated. This is very unlikely too.
        return this.insideConditionalExpressionsWithReads.some((r) => (r instanceof checker.PropertyRead ||
            r instanceof checker.PropertyWrite ||
            r instanceof checker.SafePropertyRead) &&
            r.name === read.name);
    }
}
/**
 * Emulates an access to a given field using the TypeScript `ts.Type`
 * of the given class. The resolved symbol of the access is returned.
 */
function traverseReceiverAndLookupSymbol(readOrWrite, componentClass, checker$1) {
    const path = [readOrWrite.name];
    let node = readOrWrite;
    while (node.receiver instanceof checker.PropertyRead || node.receiver instanceof checker.PropertyWrite) {
        node = node.receiver;
        path.unshift(node.name);
    }
    if (!(node.receiver instanceof checker.ImplicitReceiver || node.receiver instanceof checker.ThisReceiver)) {
        return null;
    }
    const classType = checker$1.getTypeAtLocation(componentClass.name);
    return (lookupPropertyAccess(checker$1, classType, path, {
        // Necessary to avoid breaking the resolution if there is
        // some narrowing involved. E.g. `myClass ? myClass.input`.
        ignoreNullability: true,
    })?.symbol ?? null);
}
/** Whether the given node refers to a two-way binding AST node. */
function isTwoWayBindingNode(node) {
    return ((node instanceof checker.BoundAttribute && node.type === checker.BindingType.TwoWay) ||
        (node instanceof checker.BoundEvent && node.type === checker.ParsedEventType.TwoWay));
}

/** Possible types of references to known fields detected. */
exports.ReferenceKind = void 0;
(function (ReferenceKind) {
    ReferenceKind[ReferenceKind["InTemplate"] = 0] = "InTemplate";
    ReferenceKind[ReferenceKind["InHostBinding"] = 1] = "InHostBinding";
    ReferenceKind[ReferenceKind["TsReference"] = 2] = "TsReference";
    ReferenceKind[ReferenceKind["TsClassTypeReference"] = 3] = "TsClassTypeReference";
})(exports.ReferenceKind || (exports.ReferenceKind = {}));
/** Whether the given reference is a TypeScript reference. */
function isTsReference(ref) {
    return ref.kind === exports.ReferenceKind.TsReference;
}
/** Whether the given reference is a template reference. */
function isTemplateReference(ref) {
    return ref.kind === exports.ReferenceKind.InTemplate;
}
/** Whether the given reference is a host binding reference. */
function isHostBindingReference(ref) {
    return ref.kind === exports.ReferenceKind.InHostBinding;
}
/**
 * Whether the given reference is a TypeScript `ts.Type` reference
 * to a class containing known fields.
 */
function isTsClassTypeReference(ref) {
    return ref.kind === exports.ReferenceKind.TsClassTypeReference;
}

/**
 * Checks host bindings of the given class and tracks all
 * references to inputs within bindings.
 */
function identifyHostBindingReferences(node, programInfo, checker$1, reflector, result, knownFields, fieldNamesToConsiderForReferenceLookup) {
    if (node.name === undefined) {
        return;
    }
    const decorators = reflector.getDecoratorsOfDeclaration(node);
    if (decorators === null) {
        return;
    }
    const angularDecorators = checker.getAngularDecorators(decorators, ['Directive', 'Component'], 
    /* isAngularCore */ false);
    if (angularDecorators.length === 0) {
        return;
    }
    // Assume only one Angular decorator per class.
    const ngDecorator = angularDecorators[0];
    if (ngDecorator.args?.length !== 1) {
        return;
    }
    const metadataNode = checker.unwrapExpression(ngDecorator.args[0]);
    if (!ts.isObjectLiteralExpression(metadataNode)) {
        return;
    }
    const metadata = checker.reflectObjectLiteral(metadataNode);
    if (!metadata.has('host')) {
        return;
    }
    let hostField = checker.unwrapExpression(metadata.get('host'));
    // Special-case in case host bindings are shared via a variable.
    // e.g. Material button shares host bindings as a constant in the same target.
    if (ts.isIdentifier(hostField)) {
        let symbol = checker$1.getSymbolAtLocation(hostField);
        // Plain identifier references can point to alias symbols (e.g. imports).
        if (symbol !== undefined && symbol.flags & ts.SymbolFlags.Alias) {
            symbol = checker$1.getAliasedSymbol(symbol);
        }
        if (symbol !== undefined &&
            symbol.valueDeclaration !== undefined &&
            ts.isVariableDeclaration(symbol.valueDeclaration)) {
            hostField = symbol?.valueDeclaration.initializer;
        }
    }
    if (hostField === undefined || !ts.isObjectLiteralExpression(hostField)) {
        return;
    }
    const hostMap = checker.reflectObjectLiteral(hostField);
    const expressionResult = [];
    const expressionVisitor = new TemplateExpressionReferenceVisitor(checker$1, null, node, knownFields, fieldNamesToConsiderForReferenceLookup);
    for (const [rawName, expression] of hostMap.entries()) {
        if (!ts.isStringLiteralLike(expression)) {
            continue;
        }
        const isEventBinding = rawName.startsWith('(');
        const isPropertyBinding = rawName.startsWith('[');
        // Only migrate property or event bindings.
        if (!isPropertyBinding && !isEventBinding) {
            continue;
        }
        const parser = checker.makeBindingParser();
        const sourceSpan = new checker.ParseSourceSpan(
        // Fake source span to keep parsing offsets zero-based.
        // We then later combine these with the expression TS node offsets.
        new checker.ParseLocation({ content: '', url: '' }, 0, 0, 0), new checker.ParseLocation({ content: '', url: '' }, 0, 0, 0));
        const name = rawName.substring(1, rawName.length - 1);
        let parsed = undefined;
        if (isEventBinding) {
            const result = [];
            parser.parseEvent(name.substring(1, name.length - 1), expression.text, false, sourceSpan, sourceSpan, [], result, sourceSpan);
            parsed = result[0].handler;
        }
        else {
            const result = [];
            parser.parsePropertyBinding(name, expression.text, true, 
            /* isTwoWayBinding */ false, sourceSpan, 0, sourceSpan, [], result, sourceSpan);
            parsed = result[0].expression;
        }
        if (parsed != null) {
            expressionResult.push(...expressionVisitor.checkTemplateExpression(expression, parsed));
        }
    }
    for (const ref of expressionResult) {
        result.references.push({
            kind: exports.ReferenceKind.InHostBinding,
            from: {
                read: ref.read,
                readAstPath: ref.readAstPath,
                isObjectShorthandExpression: ref.isObjectShorthandExpression,
                isWrite: ref.isWrite,
                file: project_paths.projectFile(ref.context.getSourceFile(), programInfo),
                hostPropertyNode: ref.context,
            },
            target: ref.targetField,
        });
    }
}

/**
 * Attempts to extract the `TemplateDefinition` for the given
 * class, if possible.
 *
 * The definition can then be used with the Angular compiler to
 * load/parse the given template.
 */
function attemptExtractTemplateDefinition(node, checker$1, reflector, resourceLoader) {
    const classDecorators = reflector.getDecoratorsOfDeclaration(node);
    const evaluator = new index.PartialEvaluator(reflector, checker$1, null);
    const ngDecorators = classDecorators !== null
        ? checker.getAngularDecorators(classDecorators, ['Component'], /* isAngularCore */ false)
        : [];
    if (ngDecorators.length === 0 ||
        ngDecorators[0].args === null ||
        ngDecorators[0].args.length === 0 ||
        !ts.isObjectLiteralExpression(ngDecorators[0].args[0])) {
        return null;
    }
    const properties = checker.reflectObjectLiteral(ngDecorators[0].args[0]);
    const templateProp = properties.get('template');
    const templateUrlProp = properties.get('templateUrl');
    const containingFile = node.getSourceFile().fileName;
    // inline template.
    if (templateProp !== undefined) {
        const templateStr = evaluator.evaluate(templateProp);
        if (typeof templateStr === 'string') {
            return {
                isInline: true,
                expression: templateProp,
                interpolationConfig: checker.DEFAULT_INTERPOLATION_CONFIG,
                preserveWhitespaces: false,
                resolvedTemplateUrl: containingFile,
                templateUrl: containingFile,
            };
        }
    }
    try {
        // external template.
        if (templateUrlProp !== undefined) {
            const templateUrl = evaluator.evaluate(templateUrlProp);
            if (typeof templateUrl === 'string') {
                return {
                    isInline: false,
                    interpolationConfig: checker.DEFAULT_INTERPOLATION_CONFIG,
                    preserveWhitespaces: false,
                    templateUrlExpression: templateUrlProp,
                    templateUrl,
                    resolvedTemplateUrl: resourceLoader.resolve(templateUrl, containingFile),
                };
            }
        }
    }
    catch (e) {
        console.error(`Could not parse external template: ${e}`);
    }
    return null;
}

/**
 * Checks whether the given class has an Angular template, and resolves
 * all of the references to inputs.
 */
function identifyTemplateReferences(programInfo, node, reflector, checker$1, evaluator, templateTypeChecker, resourceLoader, options, result, knownFields, fieldNamesToConsiderForReferenceLookup) {
    const template = templateTypeChecker.getTemplate(node, checker.OptimizeFor.WholeProgram) ??
        // If there is no template registered in the TCB or compiler, the template may
        // be skipped due to an explicit `jit: true` setting. We try to detect this case
        // and parse the template manually.
        extractTemplateWithoutCompilerAnalysis(node, checker$1, reflector, resourceLoader, evaluator, options);
    if (template !== null) {
        const visitor = new TemplateReferenceVisitor(checker$1, templateTypeChecker, node, knownFields, fieldNamesToConsiderForReferenceLookup);
        template.forEach((node) => node.visit(visitor));
        for (const res of visitor.result) {
            const templateFilePath = res.context.sourceSpan.start.file.url;
            // Templates without an URL are non-mappable artifacts of e.g.
            // string concatenated templates. See the `indirect` template
            // source mapping concept in the compiler. We skip such references
            // as those cannot be migrated, but print an error for now.
            if (templateFilePath === '') {
                // TODO: Incorporate a TODO potentially.
                console.error(`Found reference to field ${res.targetField.key} that cannot be ` +
                    `migrated because the template cannot be parsed with source map information ` +
                    `(in file: ${node.getSourceFile().fileName}).`);
                continue;
            }
            result.references.push({
                kind: exports.ReferenceKind.InTemplate,
                from: {
                    read: res.read,
                    readAstPath: res.readAstPath,
                    node: res.context,
                    isObjectShorthandExpression: res.isObjectShorthandExpression,
                    originatingTsFile: project_paths.projectFile(node.getSourceFile(), programInfo),
                    templateFile: project_paths.projectFile(checker.absoluteFrom(templateFilePath), programInfo),
                    isLikelyPartOfNarrowing: res.isLikelyNarrowed,
                    isWrite: res.isWrite,
                },
                target: res.targetField,
            });
        }
    }
}
/**
 * Attempts to extract a `@Component` template from the given class,
 * without relying on the `NgCompiler` program analysis.
 *
 * This is useful for JIT components using `jit: true` which were not
 * processed by the Angular compiler, but may still have templates that
 * contain references to inputs that we can resolve via the fallback
 * reference resolutions (that does not use the type check block).
 */
function extractTemplateWithoutCompilerAnalysis(node, checker$1, reflector, resourceLoader, evaluator, options) {
    if (node.name === undefined) {
        return null;
    }
    const tmplDef = attemptExtractTemplateDefinition(node, checker$1, reflector, resourceLoader);
    if (tmplDef === null) {
        return null;
    }
    return index.extractTemplate(node, tmplDef, evaluator, null, resourceLoader, {
        enableBlockSyntax: true,
        enableLetSyntax: true,
        usePoisonedData: true,
        enableI18nLegacyMessageIdFormat: options.enableI18nLegacyMessageIdFormat !== false,
        i18nNormalizeLineEndingsInICUs: options.i18nNormalizeLineEndingsInICUs === true,
    }, checker.CompilationMode.FULL).nodes;
}

/** Gets the pattern and property name for a given binding element. */
function resolveBindingElement(node) {
    const name = node.propertyName ?? node.name;
    // If we are discovering a non-analyzable element in the path, abort.
    if (!ts.isStringLiteralLike(name) && !ts.isIdentifier(name)) {
        return null;
    }
    return {
        pattern: node.parent,
        propertyName: name.text,
    };
}
/** Gets the declaration node of the given binding element. */
function getBindingElementDeclaration(node) {
    while (true) {
        if (ts.isBindingElement(node.parent.parent)) {
            node = node.parent.parent;
        }
        else {
            return node.parent.parent;
        }
    }
}

/**
 * Expands the given reference to its containing expression, capturing
 * the full context.
 *
 * E.g. `traverseAccess(ref<`bla`>)` may return `this.bla`
 *   or `traverseAccess(ref<`bla`>)` may return `this.someObj.a.b.c.bla`.
 *
 * This helper is useful as we will replace the full access with a temporary
 * variable for narrowing. Replacing just the identifier is wrong.
 */
function traverseAccess(access) {
    if (ts.isPropertyAccessExpression(access.parent) && access.parent.name === access) {
        return access.parent;
    }
    else if (ts.isElementAccessExpression(access.parent) &&
        access.parent.argumentExpression === access) {
        return access.parent;
    }
    return access;
}

/**
 * Unwraps the parent of the given node, if it's a
 * parenthesized expression or `as` expression.
 */
function unwrapParent(node) {
    if (ts.isParenthesizedExpression(node.parent)) {
        return unwrapParent(node.parent);
    }
    else if (ts.isAsExpression(node.parent)) {
        return unwrapParent(node.parent);
    }
    return node;
}

/**
 * List of binary operators that indicate a write operation.
 *
 * Useful for figuring out whether an expression assigns to
 * something or not.
 */
const writeBinaryOperators = [
    ts.SyntaxKind.EqualsToken,
    ts.SyntaxKind.BarBarEqualsToken,
    ts.SyntaxKind.BarEqualsToken,
    ts.SyntaxKind.AmpersandEqualsToken,
    ts.SyntaxKind.AmpersandAmpersandEqualsToken,
    ts.SyntaxKind.SlashEqualsToken,
    ts.SyntaxKind.MinusEqualsToken,
    ts.SyntaxKind.PlusEqualsToken,
    ts.SyntaxKind.CaretEqualsToken,
    ts.SyntaxKind.PercentEqualsToken,
    ts.SyntaxKind.AsteriskEqualsToken,
    ts.SyntaxKind.ExclamationEqualsToken,
];

/**
 * Checks whether given TypeScript reference refers to an Angular input, and captures
 * the reference if possible.
 *
 * @param fieldNamesToConsiderForReferenceLookup List of field names that should be
 *   respected when expensively looking up references to known fields.
 *   May be null if all identifiers should be inspected.
 */
function identifyPotentialTypeScriptReference(node, programInfo, checker, knownFields, result, fieldNamesToConsiderForReferenceLookup, advisors) {
    // Skip all identifiers that never can point to a migrated field.
    // TODO: Capture these assumptions and performance optimizations in the design doc.
    if (fieldNamesToConsiderForReferenceLookup !== null &&
        !fieldNamesToConsiderForReferenceLookup.has(node.text)) {
        return;
    }
    let target = undefined;
    try {
        // Resolve binding elements to their declaration symbol.
        // Commonly inputs are accessed via object expansion. e.g. `const {input} = this;`.
        if (ts.isBindingElement(node.parent)) {
            // Skip binding elements that are using spread.
            if (node.parent.dotDotDotToken !== undefined) {
                return;
            }
            const bindingInfo = resolveBindingElement(node.parent);
            if (bindingInfo === null) {
                // The declaration could not be resolved. Skip analyzing this.
                return;
            }
            const bindingType = checker.getTypeAtLocation(bindingInfo.pattern);
            const resolved = lookupPropertyAccess(checker, bindingType, [bindingInfo.propertyName]);
            target = resolved?.symbol;
        }
        else {
            target = checker.getSymbolAtLocation(node);
        }
    }
    catch (e) {
        console.error('Unexpected error while trying to resolve identifier reference:');
        console.error(e);
        // Gracefully skip analyzing. This can happen when e.g. a reference is named similar
        // to an input, but is dependant on `.d.ts` that is not necessarily available (clutz dts).
        return;
    }
    noTargetSymbolCheck: if (target === undefined) {
        if (ts.isPropertyAccessExpression(node.parent) && node.parent.name === node) {
            const propAccessSymbol = checker.getSymbolAtLocation(node.parent.expression);
            if (propAccessSymbol !== undefined &&
                propAccessSymbol.valueDeclaration !== undefined &&
                ts.isVariableDeclaration(propAccessSymbol.valueDeclaration) &&
                propAccessSymbol.valueDeclaration.initializer !== undefined) {
                target = advisors.debugElComponentInstanceTracker
                    .detect(propAccessSymbol.valueDeclaration.initializer)
                    ?.getProperty(node.text);
                // We found a target in the fallback path. Break out.
                if (target !== undefined) {
                    break noTargetSymbolCheck;
                }
            }
        }
        return;
    }
    let targetInput = knownFields.attemptRetrieveDescriptorFromSymbol(target);
    if (targetInput === null) {
        return;
    }
    const access = unwrapParent(traverseAccess(node));
    const accessParent = access.parent;
    const isWriteReference = ts.isBinaryExpression(accessParent) &&
        accessParent.left === access &&
        writeBinaryOperators.includes(accessParent.operatorToken.kind);
    // track accesses from source files to known fields.
    result.references.push({
        kind: exports.ReferenceKind.TsReference,
        from: {
            node,
            file: project_paths.projectFile(node.getSourceFile(), programInfo),
            isWrite: isWriteReference,
            isPartOfElementBinding: ts.isBindingElement(node.parent),
        },
        target: targetInput,
    });
}

/**
 * Phase where we iterate through all source file references and
 * detect references to known fields (e.g. commonly inputs).
 *
 * This is useful, for example in the signal input migration whe
 * references need to be migrated to unwrap signals, given that
 * their target properties is no longer holding a raw value, but
 * instead an `InputSignal`.
 *
 * This phase detects references in all types of locations:
 *    - TS source files
 *    - Angular templates (inline or external)
 *    - Host binding expressions.
 */
function createFindAllSourceFileReferencesVisitor(programInfo, checker, reflector, resourceLoader, evaluator, templateTypeChecker, knownFields, fieldNamesToConsiderForReferenceLookup, result) {
    const debugElComponentInstanceTracker = new DebugElementComponentInstance(checker);
    const partialDirectiveCatalystTracker = new PartialDirectiveTypeInCatalystTests(checker, knownFields);
    const perfCounters = {
        template: 0,
        hostBindings: 0,
        tsReferences: 0,
        tsTypes: 0,
    };
    // Schematic NodeJS execution may not have `global.performance` defined.
    const currentTimeInMs = () => typeof global.performance !== 'undefined' ? global.performance.now() : Date.now();
    const visitor = (node) => {
        let lastTime = currentTimeInMs();
        // Note: If there is no template type checker and resource loader, we aren't processing
        // an Angular program, and can skip template detection.
        if (ts.isClassDeclaration(node) && templateTypeChecker !== null && resourceLoader !== null) {
            identifyTemplateReferences(programInfo, node, reflector, checker, evaluator, templateTypeChecker, resourceLoader, programInfo.userOptions, result, knownFields, fieldNamesToConsiderForReferenceLookup);
            perfCounters.template += (currentTimeInMs() - lastTime) / 1000;
            lastTime = currentTimeInMs();
            identifyHostBindingReferences(node, programInfo, checker, reflector, result, knownFields, fieldNamesToConsiderForReferenceLookup);
            perfCounters.hostBindings += (currentTimeInMs() - lastTime) / 1000;
            lastTime = currentTimeInMs();
        }
        lastTime = currentTimeInMs();
        // find references, but do not capture input declarations itself.
        if (ts.isIdentifier(node) &&
            !(isInputContainerNode(node.parent) && node.parent.name === node)) {
            identifyPotentialTypeScriptReference(node, programInfo, checker, knownFields, result, fieldNamesToConsiderForReferenceLookup, {
                debugElComponentInstanceTracker,
            });
        }
        perfCounters.tsReferences += (currentTimeInMs() - lastTime) / 1000;
        lastTime = currentTimeInMs();
        // Detect `Partial<T>` references.
        // Those are relevant to be tracked as they may be updated in Catalyst to
        // unwrap signal inputs. Commonly people use `Partial` in Catalyst to type
        // some "component initial values".
        const partialDirectiveInCatalyst = partialDirectiveCatalystTracker.detect(node);
        if (partialDirectiveInCatalyst !== null) {
            result.references.push({
                kind: exports.ReferenceKind.TsClassTypeReference,
                from: {
                    file: project_paths.projectFile(partialDirectiveInCatalyst.referenceNode.getSourceFile(), programInfo),
                    node: partialDirectiveInCatalyst.referenceNode,
                },
                isPartialReference: true,
                isPartOfCatalystFile: true,
                target: partialDirectiveInCatalyst.targetClass,
            });
        }
        perfCounters.tsTypes += (currentTimeInMs() - lastTime) / 1000;
    };
    return {
        visitor,
        debugPrintMetrics: () => {
            console.info('Source file analysis performance', perfCounters);
        },
    };
}

exports.createFindAllSourceFileReferencesVisitor = createFindAllSourceFileReferencesVisitor;
exports.getBindingElementDeclaration = getBindingElementDeclaration;
exports.getMemberName = getMemberName;
exports.isHostBindingReference = isHostBindingReference;
exports.isInputContainerNode = isInputContainerNode;
exports.isTemplateReference = isTemplateReference;
exports.isTsClassTypeReference = isTsClassTypeReference;
exports.isTsReference = isTsReference;
exports.traverseAccess = traverseAccess;
exports.unwrapParent = unwrapParent;
㉰x   'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var checker = require('./checker-BwV9MjSQ.cjs');
var ts = require('typescript');
var p = require('path');
require('os');

function _interopNamespaceDefault(e) {
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n.default = e;
    return Object.freeze(n);
}

var p__namespace = /*#__PURE__*/_interopNamespaceDefault(p);

class XmlTagDefinition {
    closedByParent = false;
    implicitNamespacePrefix = null;
    isVoid = false;
    ignoreFirstLf = false;
    canSelfClose = true;
    preventNamespaceInheritance = false;
    requireExtraParent(currentParent) {
        return false;
    }
    isClosedByChild(name) {
        return false;
    }
    getContentType() {
        return checker.TagContentType.PARSABLE_DATA;
    }
}
const _TAG_DEFINITION = new XmlTagDefinition();
function getXmlTagDefinition(tagName) {
    return _TAG_DEFINITION;
}

class XmlParser extends checker.Parser {
    constructor() {
        super(getXmlTagDefinition);
    }
    parse(source, url, options = {}) {
        // Blocks and let declarations aren't supported in an XML context.
        return super.parse(source, url, { ...options, tokenizeBlocks: false, tokenizeLet: false });
    }
}

const _VERSION$1 = '1.2';
const _XMLNS$1 = 'urn:oasis:names:tc:xliff:document:1.2';
// TODO(vicb): make this a param (s/_/-/)
const _DEFAULT_SOURCE_LANG$1 = 'en';
const _PLACEHOLDER_TAG$1 = 'x';
const _MARKER_TAG$1 = 'mrk';
const _FILE_TAG = 'file';
const _SOURCE_TAG$1 = 'source';
const _SEGMENT_SOURCE_TAG = 'seg-source';
const _ALT_TRANS_TAG = 'alt-trans';
const _TARGET_TAG$1 = 'target';
const _UNIT_TAG$1 = 'trans-unit';
const _CONTEXT_GROUP_TAG = 'context-group';
const _CONTEXT_TAG = 'context';
// https://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html
// https://docs.oasis-open.org/xliff/v1.2/xliff-profile-html/xliff-profile-html-1.2.html
class Xliff extends checker.Serializer {
    write(messages, locale) {
        const visitor = new _WriteVisitor$1();
        const transUnits = [];
        messages.forEach((message) => {
            let contextTags = [];
            message.sources.forEach((source) => {
                let contextGroupTag = new checker.Tag(_CONTEXT_GROUP_TAG, { purpose: 'location' });
                contextGroupTag.children.push(new checker.CR(10), new checker.Tag(_CONTEXT_TAG, { 'context-type': 'sourcefile' }, [
                    new checker.Text$1(source.filePath),
                ]), new checker.CR(10), new checker.Tag(_CONTEXT_TAG, { 'context-type': 'linenumber' }, [
                    new checker.Text$1(`${source.startLine}`),
                ]), new checker.CR(8));
                contextTags.push(new checker.CR(8), contextGroupTag);
            });
            const transUnit = new checker.Tag(_UNIT_TAG$1, { id: message.id, datatype: 'html' });
            transUnit.children.push(new checker.CR(8), new checker.Tag(_SOURCE_TAG$1, {}, visitor.serialize(message.nodes)), ...contextTags);
            if (message.description) {
                transUnit.children.push(new checker.CR(8), new checker.Tag('note', { priority: '1', from: 'description' }, [
                    new checker.Text$1(message.description),
                ]));
            }
            if (message.meaning) {
                transUnit.children.push(new checker.CR(8), new checker.Tag('note', { priority: '1', from: 'meaning' }, [new checker.Text$1(message.meaning)]));
            }
            transUnit.children.push(new checker.CR(6));
            transUnits.push(new checker.CR(6), transUnit);
        });
        const body = new checker.Tag('body', {}, [...transUnits, new checker.CR(4)]);
        const file = new checker.Tag('file', {
            'source-language': locale || _DEFAULT_SOURCE_LANG$1,
            datatype: 'plaintext',
            original: 'ng2.template',
        }, [new checker.CR(4), body, new checker.CR(2)]);
        const xliff = new checker.Tag('xliff', { version: _VERSION$1, xmlns: _XMLNS$1 }, [
            new checker.CR(2),
            file,
            new checker.CR(),
        ]);
        return checker.serialize([
            new checker.Declaration({ version: '1.0', encoding: 'UTF-8' }),
            new checker.CR(),
            xliff,
            new checker.CR(),
        ]);
    }
    load(content, url) {
        // xliff to xml nodes
        const xliffParser = new XliffParser();
        const { locale, msgIdToHtml, errors } = xliffParser.parse(content, url);
        // xml nodes to i18n nodes
        const i18nNodesByMsgId = {};
        const converter = new XmlToI18n$1();
        Object.keys(msgIdToHtml).forEach((msgId) => {
            const { i18nNodes, errors: e } = converter.convert(msgIdToHtml[msgId], url);
            errors.push(...e);
            i18nNodesByMsgId[msgId] = i18nNodes;
        });
        if (errors.length) {
            throw new Error(`xliff parse errors:\n${errors.join('\n')}`);
        }
        return { locale: locale, i18nNodesByMsgId };
    }
    digest(message) {
        return checker.digest(message);
    }
}
let _WriteVisitor$1 = class _WriteVisitor {
    visitText(text, context) {
        return [new checker.Text$1(text.value)];
    }
    visitContainer(container, context) {
        const nodes = [];
        container.children.forEach((node) => nodes.push(...node.visit(this)));
        return nodes;
    }
    visitIcu(icu, context) {
        const nodes = [new checker.Text$1(`{${icu.expressionPlaceholder}, ${icu.type}, `)];
        Object.keys(icu.cases).forEach((c) => {
            nodes.push(new checker.Text$1(`${c} {`), ...icu.cases[c].visit(this), new checker.Text$1(`} `));
        });
        nodes.push(new checker.Text$1(`}`));
        return nodes;
    }
    visitTagPlaceholder(ph, context) {
        const ctype = getCtypeForTag(ph.tag);
        if (ph.isVoid) {
            // void tags have no children nor closing tags
            return [
                new checker.Tag(_PLACEHOLDER_TAG$1, { id: ph.startName, ctype, 'equiv-text': `<${ph.tag}/>` }),
            ];
        }
        const startTagPh = new checker.Tag(_PLACEHOLDER_TAG$1, {
            id: ph.startName,
            ctype,
            'equiv-text': `<${ph.tag}>`,
        });
        const closeTagPh = new checker.Tag(_PLACEHOLDER_TAG$1, {
            id: ph.closeName,
            ctype,
            'equiv-text': `</${ph.tag}>`,
        });
        return [startTagPh, ...this.serialize(ph.children), closeTagPh];
    }
    visitPlaceholder(ph, context) {
        return [new checker.Tag(_PLACEHOLDER_TAG$1, { id: ph.name, 'equiv-text': `{{${ph.value}}}` })];
    }
    visitBlockPlaceholder(ph, context) {
        const ctype = `x-${ph.name.toLowerCase().replace(/[^a-z0-9]/g, '-')}`;
        const startTagPh = new checker.Tag(_PLACEHOLDER_TAG$1, {
            id: ph.startName,
            ctype,
            'equiv-text': `@${ph.name}`,
        });
        const closeTagPh = new checker.Tag(_PLACEHOLDER_TAG$1, { id: ph.closeName, ctype, 'equiv-text': `}` });
        return [startTagPh, ...this.serialize(ph.children), closeTagPh];
    }
    visitIcuPlaceholder(ph, context) {
        const equivText = `{${ph.value.expression}, ${ph.value.type}, ${Object.keys(ph.value.cases)
            .map((value) => value + ' {...}')
            .join(' ')}}`;
        return [new checker.Tag(_PLACEHOLDER_TAG$1, { id: ph.name, 'equiv-text': equivText })];
    }
    serialize(nodes) {
        return [].concat(...nodes.map((node) => node.visit(this)));
    }
};
// TODO(vicb): add error management (structure)
// Extract messages as xml nodes from the xliff file
class XliffParser {
    // using non-null assertions because they're re(set) by parse()
    _unitMlString;
    _errors;
    _msgIdToHtml;
    _locale = null;
    parse(xliff, url) {
        this._unitMlString = null;
        this._msgIdToHtml = {};
        const xml = new XmlParser().parse(xliff, url);
        this._errors = xml.errors;
        checker.visitAll(this, xml.rootNodes, null);
        return {
            msgIdToHtml: this._msgIdToHtml,
            errors: this._errors,
            locale: this._locale,
        };
    }
    visitElement(element, context) {
        switch (element.name) {
            case _UNIT_TAG$1:
                this._unitMlString = null;
                const idAttr = element.attrs.find((attr) => attr.name === 'id');
                if (!idAttr) {
                    this._addError(element, `<${_UNIT_TAG$1}> misses the "id" attribute`);
                }
                else {
                    const id = idAttr.value;
                    if (this._msgIdToHtml.hasOwnProperty(id)) {
                        this._addError(element, `Duplicated translations for msg ${id}`);
                    }
                    else {
                        checker.visitAll(this, element.children, null);
                        if (typeof this._unitMlString === 'string') {
                            this._msgIdToHtml[id] = this._unitMlString;
                        }
                        else {
                            this._addError(element, `Message ${id} misses a translation`);
                        }
                    }
                }
                break;
            // ignore those tags
            case _SOURCE_TAG$1:
            case _SEGMENT_SOURCE_TAG:
            case _ALT_TRANS_TAG:
                break;
            case _TARGET_TAG$1:
                const innerTextStart = element.startSourceSpan.end.offset;
                const innerTextEnd = element.endSourceSpan.start.offset;
                const content = element.startSourceSpan.start.file.content;
                const innerText = content.slice(innerTextStart, innerTextEnd);
                this._unitMlString = innerText;
                break;
            case _FILE_TAG:
                const localeAttr = element.attrs.find((attr) => attr.name === 'target-language');
                if (localeAttr) {
                    this._locale = localeAttr.value;
                }
                checker.visitAll(this, element.children, null);
                break;
            default:
                // TODO(vicb): assert file structure, xliff version
                // For now only recurse on unhandled nodes
                checker.visitAll(this, element.children, null);
        }
    }
    visitAttribute(attribute, context) { }
    visitText(text, context) { }
    visitComment(comment, context) { }
    visitExpansion(expansion, context) { }
    visitExpansionCase(expansionCase, context) { }
    visitBlock(block, context) { }
    visitBlockParameter(parameter, context) { }
    visitLetDeclaration(decl, context) { }
    _addError(node, message) {
        this._errors.push(new checker.I18nError(node.sourceSpan, message));
    }
}
// Convert ml nodes (xliff syntax) to i18n nodes
let XmlToI18n$1 = class XmlToI18n {
    // using non-null assertion because it's re(set) by convert()
    _errors;
    convert(message, url) {
        const xmlIcu = new XmlParser().parse(message, url, { tokenizeExpansionForms: true });
        this._errors = xmlIcu.errors;
        const i18nNodes = this._errors.length > 0 || xmlIcu.rootNodes.length == 0
            ? []
            : [].concat(...checker.visitAll(this, xmlIcu.rootNodes));
        return {
            i18nNodes: i18nNodes,
            errors: this._errors,
        };
    }
    visitText(text, context) {
        return new checker.Text$2(text.value, text.sourceSpan);
    }
    visitElement(el, context) {
        if (el.name === _PLACEHOLDER_TAG$1) {
            const nameAttr = el.attrs.find((attr) => attr.name === 'id');
            if (nameAttr) {
                return new checker.Placeholder('', nameAttr.value, el.sourceSpan);
            }
            this._addError(el, `<${_PLACEHOLDER_TAG$1}> misses the "id" attribute`);
            return null;
        }
        if (el.name === _MARKER_TAG$1) {
            return [].concat(...checker.visitAll(this, el.children));
        }
        this._addError(el, `Unexpected tag`);
        return null;
    }
    visitExpansion(icu, context) {
        const caseMap = {};
        checker.visitAll(this, icu.cases).forEach((c) => {
            caseMap[c.value] = new checker.Container(c.nodes, icu.sourceSpan);
        });
        return new checker.Icu(icu.switchValue, icu.type, caseMap, icu.sourceSpan);
    }
    visitExpansionCase(icuCase, context) {
        return {
            value: icuCase.value,
            nodes: checker.visitAll(this, icuCase.expression),
        };
    }
    visitComment(comment, context) { }
    visitAttribute(attribute, context) { }
    visitBlock(block, context) { }
    visitBlockParameter(parameter, context) { }
    visitLetDeclaration(decl, context) { }
    _addError(node, message) {
        this._errors.push(new checker.I18nError(node.sourceSpan, message));
    }
};
function getCtypeForTag(tag) {
    switch (tag.toLowerCase()) {
        case 'br':
            return 'lb';
        case 'img':
            return 'image';
        default:
            return `x-${tag}`;
    }
}

const _VERSION = '2.0';
const _XMLNS = 'urn:oasis:names:tc:xliff:document:2.0';
// TODO(vicb): make this a param (s/_/-/)
const _DEFAULT_SOURCE_LANG = 'en';
const _PLACEHOLDER_TAG = 'ph';
const _PLACEHOLDER_SPANNING_TAG = 'pc';
const _MARKER_TAG = 'mrk';
const _XLIFF_TAG = 'xliff';
const _SOURCE_TAG = 'source';
const _TARGET_TAG = 'target';
const _UNIT_TAG = 'unit';
// https://docs.oasis-open.org/xliff/xliff-core/v2.0/os/xliff-core-v2.0-os.html
class Xliff2 extends checker.Serializer {
    write(messages, locale) {
        const visitor = new _WriteVisitor();
        const units = [];
        messages.forEach((message) => {
            const unit = new checker.Tag(_UNIT_TAG, { id: message.id });
            const notes = new checker.Tag('notes');
            if (message.description || message.meaning) {
                if (message.description) {
                    notes.children.push(new checker.CR(8), new checker.Tag('note', { category: 'description' }, [new checker.Text$1(message.description)]));
                }
                if (message.meaning) {
                    notes.children.push(new checker.CR(8), new checker.Tag('note', { category: 'meaning' }, [new checker.Text$1(message.meaning)]));
                }
            }
            message.sources.forEach((source) => {
                notes.children.push(new checker.CR(8), new checker.Tag('note', { category: 'location' }, [
                    new checker.Text$1(`${source.filePath}:${source.startLine}${source.endLine !== source.startLine ? ',' + source.endLine : ''}`),
                ]));
            });
            notes.children.push(new checker.CR(6));
            unit.children.push(new checker.CR(6), notes);
            const segment = new checker.Tag('segment');
            segment.children.push(new checker.CR(8), new checker.Tag(_SOURCE_TAG, {}, visitor.serialize(message.nodes)), new checker.CR(6));
            unit.children.push(new checker.CR(6), segment, new checker.CR(4));
            units.push(new checker.CR(4), unit);
        });
        const file = new checker.Tag('file', { 'original': 'ng.template', id: 'ngi18n' }, [
            ...units,
            new checker.CR(2),
        ]);
        const xliff = new checker.Tag(_XLIFF_TAG, { version: _VERSION, xmlns: _XMLNS, srcLang: locale || _DEFAULT_SOURCE_LANG }, [new checker.CR(2), file, new checker.CR()]);
        return checker.serialize([
            new checker.Declaration({ version: '1.0', encoding: 'UTF-8' }),
            new checker.CR(),
            xliff,
            new checker.CR(),
        ]);
    }
    load(content, url) {
        // xliff to xml nodes
        const xliff2Parser = new Xliff2Parser();
        const { locale, msgIdToHtml, errors } = xliff2Parser.parse(content, url);
        // xml nodes to i18n nodes
        const i18nNodesByMsgId = {};
        const converter = new XmlToI18n();
        Object.keys(msgIdToHtml).forEach((msgId) => {
            const { i18nNodes, errors: e } = converter.convert(msgIdToHtml[msgId], url);
            errors.push(...e);
            i18nNodesByMsgId[msgId] = i18nNodes;
        });
        if (errors.length) {
            throw new Error(`xliff2 parse errors:\n${errors.join('\n')}`);
        }
        return { locale: locale, i18nNodesByMsgId };
    }
    digest(message) {
        return checker.decimalDigest(message);
    }
}
class _WriteVisitor {
    _nextPlaceholderId = 0;
    visitText(text, context) {
        return [new checker.Text$1(text.value)];
    }
    visitContainer(container, context) {
        const nodes = [];
        container.children.forEach((node) => nodes.push(...node.visit(this)));
        return nodes;
    }
    visitIcu(icu, context) {
        const nodes = [new checker.Text$1(`{${icu.expressionPlaceholder}, ${icu.type}, `)];
        Object.keys(icu.cases).forEach((c) => {
            nodes.push(new checker.Text$1(`${c} {`), ...icu.cases[c].visit(this), new checker.Text$1(`} `));
        });
        nodes.push(new checker.Text$1(`}`));
        return nodes;
    }
    visitTagPlaceholder(ph, context) {
        const type = getTypeForTag(ph.tag);
        if (ph.isVoid) {
            const tagPh = new checker.Tag(_PLACEHOLDER_TAG, {
                id: (this._nextPlaceholderId++).toString(),
                equiv: ph.startName,
                type: type,
                disp: `<${ph.tag}/>`,
            });
            return [tagPh];
        }
        const tagPc = new checker.Tag(_PLACEHOLDER_SPANNING_TAG, {
            id: (this._nextPlaceholderId++).toString(),
            equivStart: ph.startName,
            equivEnd: ph.closeName,
            type: type,
            dispStart: `<${ph.tag}>`,
            dispEnd: `</${ph.tag}>`,
        });
        const nodes = [].concat(...ph.children.map((node) => node.visit(this)));
        if (nodes.length) {
            nodes.forEach((node) => tagPc.children.push(node));
        }
        else {
            tagPc.children.push(new checker.Text$1(''));
        }
        return [tagPc];
    }
    visitPlaceholder(ph, context) {
        const idStr = (this._nextPlaceholderId++).toString();
        return [
            new checker.Tag(_PLACEHOLDER_TAG, {
                id: idStr,
                equiv: ph.name,
                disp: `{{${ph.value}}}`,
            }),
        ];
    }
    visitBlockPlaceholder(ph, context) {
        const tagPc = new checker.Tag(_PLACEHOLDER_SPANNING_TAG, {
            id: (this._nextPlaceholderId++).toString(),
            equivStart: ph.startName,
            equivEnd: ph.closeName,
            type: 'other',
            dispStart: `@${ph.name}`,
            dispEnd: `}`,
        });
        const nodes = [].concat(...ph.children.map((node) => node.visit(this)));
        if (nodes.length) {
            nodes.forEach((node) => tagPc.children.push(node));
        }
        else {
            tagPc.children.push(new checker.Text$1(''));
        }
        return [tagPc];
    }
    visitIcuPlaceholder(ph, context) {
        const cases = Object.keys(ph.value.cases)
            .map((value) => value + ' {...}')
            .join(' ');
        const idStr = (this._nextPlaceholderId++).toString();
        return [
            new checker.Tag(_PLACEHOLDER_TAG, {
                id: idStr,
                equiv: ph.name,
                disp: `{${ph.value.expression}, ${ph.value.type}, ${cases}}`,
            }),
        ];
    }
    serialize(nodes) {
        this._nextPlaceholderId = 0;
        return [].concat(...nodes.map((node) => node.visit(this)));
    }
}
// Extract messages as xml nodes from the xliff file
class Xliff2Parser {
    // using non-null assertions because they're all (re)set by parse()
    _unitMlString;
    _errors;
    _msgIdToHtml;
    _locale = null;
    parse(xliff, url) {
        this._unitMlString = null;
        this._msgIdToHtml = {};
        const xml = new XmlParser().parse(xliff, url);
        this._errors = xml.errors;
        checker.visitAll(this, xml.rootNodes, null);
        return {
            msgIdToHtml: this._msgIdToHtml,
            errors: this._errors,
            locale: this._locale,
        };
    }
    visitElement(element, context) {
        switch (element.name) {
            case _UNIT_TAG:
                this._unitMlString = null;
                const idAttr = element.attrs.find((attr) => attr.name === 'id');
                if (!idAttr) {
                    this._addError(element, `<${_UNIT_TAG}> misses the "id" attribute`);
                }
                else {
                    const id = idAttr.value;
                    if (this._msgIdToHtml.hasOwnProperty(id)) {
                        this._addError(element, `Duplicated translations for msg ${id}`);
                    }
                    else {
                        checker.visitAll(this, element.children, null);
                        if (typeof this._unitMlString === 'string') {
                            this._msgIdToHtml[id] = this._unitMlString;
                        }
                        else {
                            this._addError(element, `Message ${id} misses a translation`);
                        }
                    }
                }
                break;
            case _SOURCE_TAG:
                // ignore source message
                break;
            case _TARGET_TAG:
                const innerTextStart = element.startSourceSpan.end.offset;
                const innerTextEnd = element.endSourceSpan.start.offset;
                const content = element.startSourceSpan.start.file.content;
                const innerText = content.slice(innerTextStart, innerTextEnd);
                this._unitMlString = innerText;
                break;
            case _XLIFF_TAG:
                const localeAttr = element.attrs.find((attr) => attr.name === 'trgLang');
                if (localeAttr) {
                    this._locale = localeAttr.value;
                }
                const versionAttr = element.attrs.find((attr) => attr.name === 'version');
                if (versionAttr) {
                    const version = versionAttr.value;
                    if (version !== '2.0') {
                        this._addError(element, `The XLIFF file version ${version} is not compatible with XLIFF 2.0 serializer`);
                    }
                    else {
                        checker.visitAll(this, element.children, null);
                    }
                }
                break;
            default:
                checker.visitAll(this, element.children, null);
        }
    }
    visitAttribute(attribute, context) { }
    visitText(text, context) { }
    visitComment(comment, context) { }
    visitExpansion(expansion, context) { }
    visitExpansionCase(expansionCase, context) { }
    visitBlock(block, context) { }
    visitBlockParameter(parameter, context) { }
    visitLetDeclaration(decl, context) { }
    _addError(node, message) {
        this._errors.push(new checker.I18nError(node.sourceSpan, message));
    }
}
// Convert ml nodes (xliff syntax) to i18n nodes
class XmlToI18n {
    // using non-null assertion because re(set) by convert()
    _errors;
    convert(message, url) {
        const xmlIcu = new XmlParser().parse(message, url, { tokenizeExpansionForms: true });
        this._errors = xmlIcu.errors;
        const i18nNodes = this._errors.length > 0 || xmlIcu.rootNodes.length == 0
            ? []
            : [].concat(...checker.visitAll(this, xmlIcu.rootNodes));
        return {
            i18nNodes,
            errors: this._errors,
        };
    }
    visitText(text, context) {
        return new checker.Text$2(text.value, text.sourceSpan);
    }
    visitElement(el, context) {
        switch (el.name) {
            case _PLACEHOLDER_TAG:
                const nameAttr = el.attrs.find((attr) => attr.name === 'equiv');
                if (nameAttr) {
                    return [new checker.Placeholder('', nameAttr.value, el.sourceSpan)];
                }
                this._addError(el, `<${_PLACEHOLDER_TAG}> misses the "equiv" attribute`);
                break;
            case _PLACEHOLDER_SPANNING_TAG:
                const startAttr = el.attrs.find((attr) => attr.name === 'equivStart');
                const endAttr = el.attrs.find((attr) => attr.name === 'equivEnd');
                if (!startAttr) {
                    this._addError(el, `<${_PLACEHOLDER_TAG}> misses the "equivStart" attribute`);
                }
                else if (!endAttr) {
                    this._addError(el, `<${_PLACEHOLDER_TAG}> misses the "equivEnd" attribute`);
                }
                else {
                    const startId = startAttr.value;
                    const endId = endAttr.value;
                    const nodes = [];
                    return nodes.concat(new checker.Placeholder('', startId, el.sourceSpan), ...el.children.map((node) => node.visit(this, null)), new checker.Placeholder('', endId, el.sourceSpan));
                }
                break;
            case _MARKER_TAG:
                return [].concat(...checker.visitAll(this, el.children));
            default:
                this._addError(el, `Unexpected tag`);
        }
        return null;
    }
    visitExpansion(icu, context) {
        const caseMap = {};
        checker.visitAll(this, icu.cases).forEach((c) => {
            caseMap[c.value] = new checker.Container(c.nodes, icu.sourceSpan);
        });
        return new checker.Icu(icu.switchValue, icu.type, caseMap, icu.sourceSpan);
    }
    visitExpansionCase(icuCase, context) {
        return {
            value: icuCase.value,
            nodes: [].concat(...checker.visitAll(this, icuCase.expression)),
        };
    }
    visitComment(comment, context) { }
    visitAttribute(attribute, context) { }
    visitBlock(block, context) { }
    visitBlockParameter(parameter, context) { }
    visitLetDeclaration(decl, context) { }
    _addError(node, message) {
        this._errors.push(new checker.I18nError(node.sourceSpan, message));
    }
}
function getTypeForTag(tag) {
    switch (tag.toLowerCase()) {
        case 'br':
        case 'b':
        case 'i':
        case 'u':
            return 'fmt';
        case 'img':
            return 'image';
        case 'a':
            return 'link';
        default:
            return 'other';
    }
}

/**
 * A container for message extracted from the templates.
 */
class MessageBundle {
    _htmlParser;
    _implicitTags;
    _implicitAttrs;
    _locale;
    _preserveWhitespace;
    _messages = [];
    constructor(_htmlParser, _implicitTags, _implicitAttrs, _locale = null, _preserveWhitespace = true) {
        this._htmlParser = _htmlParser;
        this._implicitTags = _implicitTags;
        this._implicitAttrs = _implicitAttrs;
        this._locale = _locale;
        this._preserveWhitespace = _preserveWhitespace;
    }
    updateFromTemplate(source, url, interpolationConfig) {
        const htmlParserResult = this._htmlParser.parse(source, url, {
            tokenizeExpansionForms: true,
            interpolationConfig,
        });
        if (htmlParserResult.errors.length) {
            return htmlParserResult.errors;
        }
        // Trim unnecessary whitespace from extracted messages if requested. This
        // makes the messages more durable to trivial whitespace changes without
        // affected message IDs.
        const rootNodes = this._preserveWhitespace
            ? htmlParserResult.rootNodes
            : checker.visitAllWithSiblings(new checker.WhitespaceVisitor(/* preserveSignificantWhitespace */ false), htmlParserResult.rootNodes);
        const i18nParserResult = checker.extractMessages(rootNodes, interpolationConfig, this._implicitTags, this._implicitAttrs, 
        /* preserveSignificantWhitespace */ this._preserveWhitespace);
        if (i18nParserResult.errors.length) {
            return i18nParserResult.errors;
        }
        this._messages.push(...i18nParserResult.messages);
        return [];
    }
    // Return the message in the internal format
    // The public (serialized) format might be different, see the `write` method.
    getMessages() {
        return this._messages;
    }
    write(serializer, filterSources) {
        const messages = {};
        const mapperVisitor = new MapPlaceholderNames();
        // Deduplicate messages based on their ID
        this._messages.forEach((message) => {
            const id = serializer.digest(message);
            if (!messages.hasOwnProperty(id)) {
                messages[id] = message;
            }
            else {
                messages[id].sources.push(...message.sources);
            }
        });
        // Transform placeholder names using the serializer mapping
        const msgList = Object.keys(messages).map((id) => {
            const mapper = serializer.createNameMapper(messages[id]);
            const src = messages[id];
            const nodes = mapper ? mapperVisitor.convert(src.nodes, mapper) : src.nodes;
            let transformedMessage = new checker.Message(nodes, {}, {}, src.meaning, src.description, id);
            transformedMessage.sources = src.sources;
            if (filterSources) {
                transformedMessage.sources.forEach((source) => (source.filePath = filterSources(source.filePath)));
            }
            return transformedMessage;
        });
        return serializer.write(msgList, this._locale);
    }
}
// Transform an i18n AST by renaming the placeholder nodes with the given mapper
class MapPlaceholderNames extends checker.CloneVisitor {
    convert(nodes, mapper) {
        return mapper ? nodes.map((n) => n.visit(this, mapper)) : nodes;
    }
    visitTagPlaceholder(ph, mapper) {
        const startName = mapper.toPublicName(ph.startName);
        const closeName = ph.closeName ? mapper.toPublicName(ph.closeName) : ph.closeName;
        const children = ph.children.map((n) => n.visit(this, mapper));
        return new checker.TagPlaceholder(ph.tag, ph.attrs, startName, closeName, children, ph.isVoid, ph.sourceSpan, ph.startSourceSpan, ph.endSourceSpan);
    }
    visitBlockPlaceholder(ph, mapper) {
        const startName = mapper.toPublicName(ph.startName);
        const closeName = ph.closeName ? mapper.toPublicName(ph.closeName) : ph.closeName;
        const children = ph.children.map((n) => n.visit(this, mapper));
        return new checker.BlockPlaceholder(ph.name, ph.parameters, startName, closeName, children, ph.sourceSpan, ph.startSourceSpan, ph.endSourceSpan);
    }
    visitPlaceholder(ph, mapper) {
        return new checker.Placeholder(ph.value, mapper.toPublicName(ph.name), ph.sourceSpan);
    }
    visitIcuPlaceholder(ph, mapper) {
        return new checker.IcuPlaceholder(ph.value, mapper.toPublicName(ph.name), ph.sourceSpan);
    }
}

function compileClassMetadata(metadata) {
    const fnCall = internalCompileClassMetadata(metadata);
    return checker.arrowFn([], [checker.devOnlyGuardedExpression(fnCall).toStmt()]).callFn([]);
}
/** Compiles only the `setClassMetadata` call without any additional wrappers. */
function internalCompileClassMetadata(metadata) {
    return checker.importExpr(checker.Identifiers.setClassMetadata)
        .callFn([
        metadata.type,
        metadata.decorators,
        metadata.ctorParameters ?? checker.literal(null),
        metadata.propDecorators ?? checker.literal(null),
    ]);
}
/**
 * Wraps the `setClassMetadata` function with extra logic that dynamically
 * loads dependencies from `@defer` blocks.
 *
 * Generates a call like this:
 * ```ts
 * setClassMetadataAsync(type, () => [
 *   import('./cmp-a').then(m => m.CmpA);
 *   import('./cmp-b').then(m => m.CmpB);
 * ], (CmpA, CmpB) => {
 *   setClassMetadata(type, decorators, ctorParameters, propParameters);
 * });
 * ```
 *
 * Similar to the `setClassMetadata` call, it's wrapped into the `ngDevMode`
 * check to tree-shake away this code in production mode.
 */
function compileComponentClassMetadata(metadata, dependencies) {
    if (dependencies === null || dependencies.length === 0) {
        // If there are no deferrable symbols - just generate a regular `setClassMetadata` call.
        return compileClassMetadata(metadata);
    }
    return internalCompileSetClassMetadataAsync(metadata, dependencies.map((dep) => new checker.FnParam(dep.symbolName, checker.DYNAMIC_TYPE)), compileComponentMetadataAsyncResolver(dependencies));
}
/**
 * Internal logic used to compile a `setClassMetadataAsync` call.
 * @param metadata Class metadata for the internal `setClassMetadata` call.
 * @param wrapperParams Parameters to be set on the callback that wraps `setClassMetata`.
 * @param dependencyResolverFn Function to resolve the deferred dependencies.
 */
function internalCompileSetClassMetadataAsync(metadata, wrapperParams, dependencyResolverFn) {
    // Omit the wrapper since it'll be added around `setClassMetadataAsync` instead.
    const setClassMetadataCall = internalCompileClassMetadata(metadata);
    const setClassMetaWrapper = checker.arrowFn(wrapperParams, [setClassMetadataCall.toStmt()]);
    const setClassMetaAsync = checker.importExpr(checker.Identifiers.setClassMetadataAsync)
        .callFn([metadata.type, dependencyResolverFn, setClassMetaWrapper]);
    return checker.arrowFn([], [checker.devOnlyGuardedExpression(setClassMetaAsync).toStmt()]).callFn([]);
}
/**
 * Compiles the function that loads the dependencies for the
 * entire component in `setClassMetadataAsync`.
 */
function compileComponentMetadataAsyncResolver(dependencies) {
    const dynamicImports = dependencies.map(({ symbolName, importPath, isDefaultImport }) => {
        // e.g. `(m) => m.CmpA`
        const innerFn = 
        // Default imports are always accessed through the `default` property.
        checker.arrowFn([new checker.FnParam('m', checker.DYNAMIC_TYPE)], checker.variable('m').prop(isDefaultImport ? 'default' : symbolName));
        // e.g. `import('./cmp-a').then(...)`
        return new checker.DynamicImportExpr(importPath).prop('then').callFn([innerFn]);
    });
    // e.g. `() => [ ... ];`
    return checker.arrowFn([], checker.literalArr(dynamicImports));
}

/**
 * Generate an ngDevMode guarded call to setClassDebugInfo with the debug info about the class
 * (e.g., the file name in which the class is defined)
 */
function compileClassDebugInfo(debugInfo) {
    const debugInfoObject = {
        className: debugInfo.className,
    };
    // Include file path and line number only if the file relative path is calculated successfully.
    if (debugInfo.filePath) {
        debugInfoObject.filePath = debugInfo.filePath;
        debugInfoObject.lineNumber = debugInfo.lineNumber;
    }
    // Include forbidOrphanRendering only if it's set to true (to reduce generated code)
    if (debugInfo.forbidOrphanRendering) {
        debugInfoObject.forbidOrphanRendering = checker.literal(true);
    }
    const fnCall = checker.importExpr(checker.Identifiers.setClassDebugInfo)
        .callFn([debugInfo.type, checker.mapLiteral(debugInfoObject)]);
    const iife = checker.arrowFn([], [checker.devOnlyGuardedExpression(fnCall).toStmt()]);
    return iife.callFn([]);
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Compiles the expression that initializes HMR for a class.
 * @param meta HMR metadata extracted from the class.
 */
function compileHmrInitializer(meta) {
    const moduleName = 'm';
    const dataName = 'd';
    const timestampName = 't';
    const idName = 'id';
    const importCallbackName = `${meta.className}_HmrLoad`;
    const namespaces = meta.namespaceDependencies.map((dep) => {
        return new checker.ExternalExpr({ moduleName: dep.moduleName, name: null });
    });
    // m.default
    const defaultRead = checker.variable(moduleName).prop('default');
    // ɵɵreplaceMetadata(Comp, m.default, [...namespaces], [...locals], import.meta, id);
    const replaceCall = checker.importExpr(checker.Identifiers.replaceMetadata)
        .callFn([
        meta.type,
        defaultRead,
        checker.literalArr(namespaces),
        checker.literalArr(meta.localDependencies.map((l) => l.runtimeRepresentation)),
        checker.variable('import').prop('meta'),
        checker.variable(idName),
    ]);
    // (m) => m.default && ɵɵreplaceMetadata(...)
    const replaceCallback = checker.arrowFn([new checker.FnParam(moduleName)], defaultRead.and(replaceCall));
    // getReplaceMetadataURL(id, timestamp, import.meta.url)
    const url = checker.importExpr(checker.Identifiers.getReplaceMetadataURL)
        .callFn([
        checker.variable(idName),
        checker.variable(timestampName),
        checker.variable('import').prop('meta').prop('url'),
    ]);
    // function Cmp_HmrLoad(t) {
    //   import(/* @vite-ignore */ url).then((m) => m.default && replaceMetadata(...));
    // }
    const importCallback = new checker.DeclareFunctionStmt(importCallbackName, [new checker.FnParam(timestampName)], [
        // The vite-ignore special comment is required to prevent Vite from generating a superfluous
        // warning for each usage within the development code. If Vite provides a method to
        // programmatically avoid this warning in the future, this added comment can be removed here.
        new checker.DynamicImportExpr(url, null, '@vite-ignore')
            .prop('then')
            .callFn([replaceCallback])
            .toStmt(),
    ], null, checker.StmtModifier.Final);
    // (d) => d.id === id && Cmp_HmrLoad(d.timestamp)
    const updateCallback = checker.arrowFn([new checker.FnParam(dataName)], checker.variable(dataName)
        .prop('id')
        .identical(checker.variable(idName))
        .and(checker.variable(importCallbackName).callFn([checker.variable(dataName).prop('timestamp')])));
    // Cmp_HmrLoad(Date.now());
    // Initial call to kick off the loading in order to avoid edge cases with components
    // coming from lazy chunks that change before the chunk has loaded.
    const initialCall = checker.variable(importCallbackName)
        .callFn([checker.variable('Date').prop('now').callFn([])]);
    // import.meta.hot
    const hotRead = checker.variable('import').prop('meta').prop('hot');
    // import.meta.hot.on('angular:component-update', () => ...);
    const hotListener = hotRead
        .clone()
        .prop('on')
        .callFn([checker.literal('angular:component-update'), updateCallback]);
    return checker.arrowFn([], [
        // const id = <id>;
        new checker.DeclareVarStmt(idName, checker.literal(encodeURIComponent(`${meta.filePath}@${meta.className}`)), null, checker.StmtModifier.Final),
        // function Cmp_HmrLoad() {...}.
        importCallback,
        // ngDevMode && Cmp_HmrLoad(Date.now());
        checker.devOnlyGuardedExpression(initialCall).toStmt(),
        // ngDevMode && import.meta.hot && import.meta.hot.on(...)
        checker.devOnlyGuardedExpression(hotRead.and(hotListener)).toStmt(),
    ])
        .callFn([]);
}
/**
 * Compiles the HMR update callback for a class.
 * @param definitions Compiled definitions for the class (e.g. `defineComponent` calls).
 * @param constantStatements Supporting constants statements that were generated alongside
 *  the definition.
 * @param meta HMR metadata extracted from the class.
 */
function compileHmrUpdateCallback(definitions, constantStatements, meta) {
    const namespaces = 'ɵɵnamespaces';
    const params = [meta.className, namespaces].map((name) => new checker.FnParam(name, checker.DYNAMIC_TYPE));
    const body = [];
    for (const local of meta.localDependencies) {
        params.push(new checker.FnParam(local.name));
    }
    // Declare variables that read out the individual namespaces.
    for (let i = 0; i < meta.namespaceDependencies.length; i++) {
        body.push(new checker.DeclareVarStmt(meta.namespaceDependencies[i].assignedName, checker.variable(namespaces).key(checker.literal(i)), checker.DYNAMIC_TYPE, checker.StmtModifier.Final));
    }
    body.push(...constantStatements);
    for (const field of definitions) {
        if (field.initializer !== null) {
            body.push(checker.variable(meta.className).prop(field.name).set(field.initializer).toStmt());
            for (const stmt of field.statements) {
                body.push(stmt);
            }
        }
    }
    return new checker.DeclareFunctionStmt(`${meta.className}_UpdateMetadata`, params, body, null, checker.StmtModifier.Final);
}

/**
 * Every time we make a breaking change to the declaration interface or partial-linker behavior, we
 * must update this constant to prevent old partial-linkers from incorrectly processing the
 * declaration.
 *
 * Do not include any prerelease in these versions as they are ignored.
 */
const MINIMUM_PARTIAL_LINKER_VERSION$5 = '12.0.0';
/**
 * Minimum version at which deferred blocks are supported in the linker.
 */
const MINIMUM_PARTIAL_LINKER_DEFER_SUPPORT_VERSION = '18.0.0';
function compileDeclareClassMetadata(metadata) {
    const definitionMap = new checker.DefinitionMap();
    definitionMap.set('minVersion', checker.literal(MINIMUM_PARTIAL_LINKER_VERSION$5));
    definitionMap.set('version', checker.literal('19.2.14'));
    definitionMap.set('ngImport', checker.importExpr(checker.Identifiers.core));
    definitionMap.set('type', metadata.type);
    definitionMap.set('decorators', metadata.decorators);
    definitionMap.set('ctorParameters', metadata.ctorParameters);
    definitionMap.set('propDecorators', metadata.propDecorators);
    return checker.importExpr(checker.Identifiers.declareClassMetadata).callFn([definitionMap.toLiteralMap()]);
}
function compileComponentDeclareClassMetadata(metadata, dependencies) {
    if (dependencies === null || dependencies.length === 0) {
        return compileDeclareClassMetadata(metadata);
    }
    const definitionMap = new checker.DefinitionMap();
    const callbackReturnDefinitionMap = new checker.DefinitionMap();
    callbackReturnDefinitionMap.set('decorators', metadata.decorators);
    callbackReturnDefinitionMap.set('ctorParameters', metadata.ctorParameters ?? checker.literal(null));
    callbackReturnDefinitionMap.set('propDecorators', metadata.propDecorators ?? checker.literal(null));
    definitionMap.set('minVersion', checker.literal(MINIMUM_PARTIAL_LINKER_DEFER_SUPPORT_VERSION));
    definitionMap.set('version', checker.literal('19.2.14'));
    definitionMap.set('ngImport', checker.importExpr(checker.Identifiers.core));
    definitionMap.set('type', metadata.type);
    definitionMap.set('resolveDeferredDeps', compileComponentMetadataAsyncResolver(dependencies));
    definitionMap.set('resolveMetadata', checker.arrowFn(dependencies.map((dep) => new checker.FnParam(dep.symbolName, checker.DYNAMIC_TYPE)), callbackReturnDefinitionMap.toLiteralMap()));
    return checker.importExpr(checker.Identifiers.declareClassMetadataAsync).callFn([definitionMap.toLiteralMap()]);
}

/**
 * Creates an array literal expression from the given array, mapping all values to an expression
 * using the provided mapping function. If the array is empty or null, then null is returned.
 *
 * @param values The array to transfer into literal array expression.
 * @param mapper The logic to use for creating an expression for the array's values.
 * @returns An array literal expression representing `values`, or null if `values` is empty or
 * is itself null.
 */
function toOptionalLiteralArray(values, mapper) {
    if (values === null || values.length === 0) {
        return null;
    }
    return checker.literalArr(values.map((value) => mapper(value)));
}
/**
 * Creates an object literal expression from the given object, mapping all values to an expression
 * using the provided mapping function. If the object has no keys, then null is returned.
 *
 * @param object The object to transfer into an object literal expression.
 * @param mapper The logic to use for creating an expression for the object's values.
 * @returns An object literal expression representing `object`, or null if `object` does not have
 * any keys.
 */
function toOptionalLiteralMap(object, mapper) {
    const entries = Object.keys(object).map((key) => {
        const value = object[key];
        return { key, value: mapper(value), quoted: true };
    });
    if (entries.length > 0) {
        return checker.literalMap(entries);
    }
    else {
        return null;
    }
}
function compileDependencies(deps) {
    if (deps === 'invalid') {
        // The `deps` can be set to the string "invalid"  by the `unwrapConstructorDependencies()`
        // function, which tries to convert `ConstructorDeps` into `R3DependencyMetadata[]`.
        return checker.literal('invalid');
    }
    else if (deps === null) {
        return checker.literal(null);
    }
    else {
        return checker.literalArr(deps.map(compileDependency));
    }
}
function compileDependency(dep) {
    const depMeta = new checker.DefinitionMap();
    depMeta.set('token', dep.token);
    if (dep.attributeNameType !== null) {
        depMeta.set('attribute', checker.literal(true));
    }
    if (dep.host) {
        depMeta.set('host', checker.literal(true));
    }
    if (dep.optional) {
        depMeta.set('optional', checker.literal(true));
    }
    if (dep.self) {
        depMeta.set('self', checker.literal(true));
    }
    if (dep.skipSelf) {
        depMeta.set('skipSelf', checker.literal(true));
    }
    return depMeta.toLiteralMap();
}

/**
 * Compile a directive declaration defined by the `R3DirectiveMetadata`.
 */
function compileDeclareDirectiveFromMetadata(meta) {
    const definitionMap = createDirectiveDefinitionMap(meta);
    const expression = checker.importExpr(checker.Identifiers.declareDirective).callFn([definitionMap.toLiteralMap()]);
    const type = checker.createDirectiveType(meta);
    return { expression, type, statements: [] };
}
/**
 * Gathers the declaration fields for a directive into a `DefinitionMap`. This allows for reusing
 * this logic for components, as they extend the directive metadata.
 */
function createDirectiveDefinitionMap(meta) {
    const definitionMap = new checker.DefinitionMap();
    const minVersion = getMinimumVersionForPartialOutput(meta);
    definitionMap.set('minVersion', checker.literal(minVersion));
    definitionMap.set('version', checker.literal('19.2.14'));
    // e.g. `type: MyDirective`
    definitionMap.set('type', meta.type.value);
    if (meta.isStandalone !== undefined) {
        definitionMap.set('isStandalone', checker.literal(meta.isStandalone));
    }
    if (meta.isSignal) {
        definitionMap.set('isSignal', checker.literal(meta.isSignal));
    }
    // e.g. `selector: 'some-dir'`
    if (meta.selector !== null) {
        definitionMap.set('selector', checker.literal(meta.selector));
    }
    definitionMap.set('inputs', needsNewInputPartialOutput(meta)
        ? createInputsPartialMetadata(meta.inputs)
        : legacyInputsPartialMetadata(meta.inputs));
    definitionMap.set('outputs', checker.conditionallyCreateDirectiveBindingLiteral(meta.outputs));
    definitionMap.set('host', compileHostMetadata(meta.host));
    definitionMap.set('providers', meta.providers);
    if (meta.queries.length > 0) {
        definitionMap.set('queries', checker.literalArr(meta.queries.map(compileQuery)));
    }
    if (meta.viewQueries.length > 0) {
        definitionMap.set('viewQueries', checker.literalArr(meta.viewQueries.map(compileQuery)));
    }
    if (meta.exportAs !== null) {
        definitionMap.set('exportAs', checker.asLiteral(meta.exportAs));
    }
    if (meta.usesInheritance) {
        definitionMap.set('usesInheritance', checker.literal(true));
    }
    if (meta.lifecycle.usesOnChanges) {
        definitionMap.set('usesOnChanges', checker.literal(true));
    }
    if (meta.hostDirectives?.length) {
        definitionMap.set('hostDirectives', createHostDirectives(meta.hostDirectives));
    }
    definitionMap.set('ngImport', checker.importExpr(checker.Identifiers.core));
    return definitionMap;
}
/**
 * Determines the minimum linker version for the partial output
 * generated for this directive.
 *
 * Every time we make a breaking change to the declaration interface or partial-linker
 * behavior, we must update the minimum versions to prevent old partial-linkers from
 * incorrectly processing the declaration.
 *
 * NOTE: Do not include any prerelease in these versions as they are ignored.
 */
function getMinimumVersionForPartialOutput(meta) {
    // We are starting with the oldest minimum version that can work for common
    // directive partial compilation output. As we discover usages of new features
    // that require a newer partial output emit, we bump the `minVersion`. Our goal
    // is to keep libraries as much compatible with older linker versions as possible.
    let minVersion = '14.0.0';
    // Note: in order to allow consuming Angular libraries that have been compiled with 16.1+ in
    // Angular 16.0, we only force a minimum version of 16.1 if input transform feature as introduced
    // in 16.1 is actually used.
    const hasDecoratorTransformFunctions = Object.values(meta.inputs).some((input) => input.transformFunction !== null);
    if (hasDecoratorTransformFunctions) {
        minVersion = '16.1.0';
    }
    // If there are input flags and we need the new emit, use the actual minimum version,
    // where this was introduced. i.e. in 17.1.0
    // TODO(legacy-partial-output-inputs): Remove in v18.
    if (needsNewInputPartialOutput(meta)) {
        minVersion = '17.1.0';
    }
    // If there are signal-based queries, partial output generates an extra field
    // that should be parsed by linkers. Ensure a proper minimum linker version.
    if (meta.queries.some((q) => q.isSignal) || meta.viewQueries.some((q) => q.isSignal)) {
        minVersion = '17.2.0';
    }
    return minVersion;
}
/**
 * Gets whether the given directive needs the new input partial output structure
 * that can hold additional metadata like `isRequired`, `isSignal` etc.
 */
function needsNewInputPartialOutput(meta) {
    return Object.values(meta.inputs).some((input) => input.isSignal);
}
/**
 * Compiles the metadata of a single query into its partial declaration form as declared
 * by `R3DeclareQueryMetadata`.
 */
function compileQuery(query) {
    const meta = new checker.DefinitionMap();
    meta.set('propertyName', checker.literal(query.propertyName));
    if (query.first) {
        meta.set('first', checker.literal(true));
    }
    meta.set('predicate', Array.isArray(query.predicate)
        ? checker.asLiteral(query.predicate)
        : checker.convertFromMaybeForwardRefExpression(query.predicate));
    if (!query.emitDistinctChangesOnly) {
        // `emitDistinctChangesOnly` is special because we expect it to be `true`.
        // Therefore we explicitly emit the field, and explicitly place it only when it's `false`.
        meta.set('emitDistinctChangesOnly', checker.literal(false));
    }
    if (query.descendants) {
        meta.set('descendants', checker.literal(true));
    }
    meta.set('read', query.read);
    if (query.static) {
        meta.set('static', checker.literal(true));
    }
    if (query.isSignal) {
        meta.set('isSignal', checker.literal(true));
    }
    return meta.toLiteralMap();
}
/**
 * Compiles the host metadata into its partial declaration form as declared
 * in `R3DeclareDirectiveMetadata['host']`
 */
function compileHostMetadata(meta) {
    const hostMetadata = new checker.DefinitionMap();
    hostMetadata.set('attributes', toOptionalLiteralMap(meta.attributes, (expression) => expression));
    hostMetadata.set('listeners', toOptionalLiteralMap(meta.listeners, checker.literal));
    hostMetadata.set('properties', toOptionalLiteralMap(meta.properties, checker.literal));
    if (meta.specialAttributes.styleAttr) {
        hostMetadata.set('styleAttribute', checker.literal(meta.specialAttributes.styleAttr));
    }
    if (meta.specialAttributes.classAttr) {
        hostMetadata.set('classAttribute', checker.literal(meta.specialAttributes.classAttr));
    }
    if (hostMetadata.values.length > 0) {
        return hostMetadata.toLiteralMap();
    }
    else {
        return null;
    }
}
function createHostDirectives(hostDirectives) {
    const expressions = hostDirectives.map((current) => {
        const keys = [
            {
                key: 'directive',
                value: current.isForwardReference
                    ? checker.generateForwardRef(current.directive.type)
                    : current.directive.type,
                quoted: false,
            },
        ];
        const inputsLiteral = current.inputs ? checker.createHostDirectivesMappingArray(current.inputs) : null;
        const outputsLiteral = current.outputs
            ? checker.createHostDirectivesMappingArray(current.outputs)
            : null;
        if (inputsLiteral) {
            keys.push({ key: 'inputs', value: inputsLiteral, quoted: false });
        }
        if (outputsLiteral) {
            keys.push({ key: 'outputs', value: outputsLiteral, quoted: false });
        }
        return checker.literalMap(keys);
    });
    // If there's a forward reference, we generate a `function() { return [{directive: HostDir}] }`,
    // otherwise we can save some bytes by using a plain array, e.g. `[{directive: HostDir}]`.
    return checker.literalArr(expressions);
}
/**
 * Generates partial output metadata for inputs of a directive.
 *
 * The generated structure is expected to match `R3DeclareDirectiveFacade['inputs']`.
 */
function createInputsPartialMetadata(inputs) {
    const keys = Object.getOwnPropertyNames(inputs);
    if (keys.length === 0) {
        return null;
    }
    return checker.literalMap(keys.map((declaredName) => {
        const value = inputs[declaredName];
        return {
            key: declaredName,
            // put quotes around keys that contain potentially unsafe characters
            quoted: checker.UNSAFE_OBJECT_KEY_NAME_REGEXP.test(declaredName),
            value: checker.literalMap([
                { key: 'classPropertyName', quoted: false, value: checker.asLiteral(value.classPropertyName) },
                { key: 'publicName', quoted: false, value: checker.asLiteral(value.bindingPropertyName) },
                { key: 'isSignal', quoted: false, value: checker.asLiteral(value.isSignal) },
                { key: 'isRequired', quoted: false, value: checker.asLiteral(value.required) },
                { key: 'transformFunction', quoted: false, value: value.transformFunction ?? checker.NULL_EXPR },
            ]),
        };
    }));
}
/**
 * Pre v18 legacy partial output for inputs.
 *
 * Previously, inputs did not capture metadata like `isSignal` in the partial compilation output.
 * To enable capturing such metadata, we restructured how input metadata is communicated in the
 * partial output. This would make libraries incompatible with older Angular FW versions where the
 * linker would not know how to handle this new "format". For this reason, if we know this metadata
 * does not need to be captured- we fall back to the old format. This is what this function
 * generates.
 *
 * See:
 * https://github.com/angular/angular/blob/d4b423690210872b5c32a322a6090beda30b05a3/packages/core/src/compiler/compiler_facade_interface.ts#L197-L199
 */
function legacyInputsPartialMetadata(inputs) {
    // TODO(legacy-partial-output-inputs): Remove function in v18.
    const keys = Object.getOwnPropertyNames(inputs);
    if (keys.length === 0) {
        return null;
    }
    return checker.literalMap(keys.map((declaredName) => {
        const value = inputs[declaredName];
        const publicName = value.bindingPropertyName;
        const differentDeclaringName = publicName !== declaredName;
        let result;
        if (differentDeclaringName || value.transformFunction !== null) {
            const values = [checker.asLiteral(publicName), checker.asLiteral(declaredName)];
            if (value.transformFunction !== null) {
                values.push(value.transformFunction);
            }
            result = checker.literalArr(values);
        }
        else {
            result = checker.asLiteral(publicName);
        }
        return {
            key: declaredName,
            // put quotes around keys that contain potentially unsafe characters
            quoted: checker.UNSAFE_OBJECT_KEY_NAME_REGEXP.test(declaredName),
            value: result,
        };
    }));
}

/**
 * Compile a component declaration defined by the `R3ComponentMetadata`.
 */
function compileDeclareComponentFromMetadata(meta, template, additionalTemplateInfo) {
    const definitionMap = createComponentDefinitionMap(meta, template, additionalTemplateInfo);
    const expression = checker.importExpr(checker.Identifiers.declareComponent).callFn([definitionMap.toLiteralMap()]);
    const type = checker.createComponentType(meta);
    return { expression, type, statements: [] };
}
/**
 * Gathers the declaration fields for a component into a `DefinitionMap`.
 */
function createComponentDefinitionMap(meta, template, templateInfo) {
    const definitionMap = createDirectiveDefinitionMap(meta);
    const blockVisitor = new BlockPresenceVisitor();
    checker.visitAll$1(blockVisitor, template.nodes);
    definitionMap.set('template', getTemplateExpression(template, templateInfo));
    if (templateInfo.isInline) {
        definitionMap.set('isInline', checker.literal(true));
    }
    // Set the minVersion to 17.0.0 if the component is using at least one block in its template.
    // We don't do this for templates without blocks, in order to preserve backwards compatibility.
    if (blockVisitor.hasBlocks) {
        definitionMap.set('minVersion', checker.literal('17.0.0'));
    }
    definitionMap.set('styles', toOptionalLiteralArray(meta.styles, checker.literal));
    definitionMap.set('dependencies', compileUsedDependenciesMetadata(meta));
    definitionMap.set('viewProviders', meta.viewProviders);
    definitionMap.set('animations', meta.animations);
    if (meta.changeDetection !== null) {
        if (typeof meta.changeDetection === 'object') {
            throw new Error('Impossible state! Change detection flag is not resolved!');
        }
        definitionMap.set('changeDetection', checker.importExpr(checker.Identifiers.ChangeDetectionStrategy)
            .prop(checker.ChangeDetectionStrategy[meta.changeDetection]));
    }
    if (meta.encapsulation !== checker.ViewEncapsulation.Emulated) {
        definitionMap.set('encapsulation', checker.importExpr(checker.Identifiers.ViewEncapsulation).prop(checker.ViewEncapsulation[meta.encapsulation]));
    }
    if (meta.interpolation !== checker.DEFAULT_INTERPOLATION_CONFIG) {
        definitionMap.set('interpolation', checker.literalArr([checker.literal(meta.interpolation.start), checker.literal(meta.interpolation.end)]));
    }
    if (template.preserveWhitespaces === true) {
        definitionMap.set('preserveWhitespaces', checker.literal(true));
    }
    if (meta.defer.mode === 0 /* DeferBlockDepsEmitMode.PerBlock */) {
        const resolvers = [];
        let hasResolvers = false;
        for (const deps of meta.defer.blocks.values()) {
            // Note: we need to push a `null` even if there are no dependencies, because matching of
            // defer resolver functions to defer blocks happens by index and not adding an array
            // entry for a block can throw off the blocks coming after it.
            if (deps === null) {
                resolvers.push(checker.literal(null));
            }
            else {
                resolvers.push(deps);
                hasResolvers = true;
            }
        }
        // If *all* the resolvers are null, we can skip the field.
        if (hasResolvers) {
            definitionMap.set('deferBlockDependencies', checker.literalArr(resolvers));
        }
    }
    else {
        throw new Error('Unsupported defer function emit mode in partial compilation');
    }
    return definitionMap;
}
function getTemplateExpression(template, templateInfo) {
    // If the template has been defined using a direct literal, we use that expression directly
    // without any modifications. This is ensures proper source mapping from the partially
    // compiled code to the source file declaring the template. Note that this does not capture
    // template literals referenced indirectly through an identifier.
    if (templateInfo.inlineTemplateLiteralExpression !== null) {
        return templateInfo.inlineTemplateLiteralExpression;
    }
    // If the template is defined inline but not through a literal, the template has been resolved
    // through static interpretation. We create a literal but cannot provide any source span. Note
    // that we cannot use the expression defining the template because the linker expects the template
    // to be defined as a literal in the declaration.
    if (templateInfo.isInline) {
        return checker.literal(templateInfo.content, null, null);
    }
    // The template is external so we must synthesize an expression node with
    // the appropriate source-span.
    const contents = templateInfo.content;
    const file = new checker.ParseSourceFile(contents, templateInfo.sourceUrl);
    const start = new checker.ParseLocation(file, 0, 0, 0);
    const end = computeEndLocation(file, contents);
    const span = new checker.ParseSourceSpan(start, end);
    return checker.literal(contents, null, span);
}
function computeEndLocation(file, contents) {
    const length = contents.length;
    let lineStart = 0;
    let lastLineStart = 0;
    let line = 0;
    do {
        lineStart = contents.indexOf('\n', lastLineStart);
        if (lineStart !== -1) {
            lastLineStart = lineStart + 1;
            line++;
        }
    } while (lineStart !== -1);
    return new checker.ParseLocation(file, length, line, length - lastLineStart);
}
function compileUsedDependenciesMetadata(meta) {
    const wrapType = meta.declarationListEmitMode !== 0 /* DeclarationListEmitMode.Direct */
        ? checker.generateForwardRef
        : (expr) => expr;
    if (meta.declarationListEmitMode === 3 /* DeclarationListEmitMode.RuntimeResolved */) {
        throw new Error(`Unsupported emit mode`);
    }
    return toOptionalLiteralArray(meta.declarations, (decl) => {
        switch (decl.kind) {
            case checker.R3TemplateDependencyKind.Directive:
                const dirMeta = new checker.DefinitionMap();
                dirMeta.set('kind', checker.literal(decl.isComponent ? 'component' : 'directive'));
                dirMeta.set('type', wrapType(decl.type));
                dirMeta.set('selector', checker.literal(decl.selector));
                dirMeta.set('inputs', toOptionalLiteralArray(decl.inputs, checker.literal));
                dirMeta.set('outputs', toOptionalLiteralArray(decl.outputs, checker.literal));
                dirMeta.set('exportAs', toOptionalLiteralArray(decl.exportAs, checker.literal));
                return dirMeta.toLiteralMap();
            case checker.R3TemplateDependencyKind.Pipe:
                const pipeMeta = new checker.DefinitionMap();
                pipeMeta.set('kind', checker.literal('pipe'));
                pipeMeta.set('type', wrapType(decl.type));
                pipeMeta.set('name', checker.literal(decl.name));
                return pipeMeta.toLiteralMap();
            case checker.R3TemplateDependencyKind.NgModule:
                const ngModuleMeta = new checker.DefinitionMap();
                ngModuleMeta.set('kind', checker.literal('ngmodule'));
                ngModuleMeta.set('type', wrapType(decl.type));
                return ngModuleMeta.toLiteralMap();
        }
    });
}
class BlockPresenceVisitor extends checker.RecursiveVisitor$1 {
    hasBlocks = false;
    visitDeferredBlock() {
        this.hasBlocks = true;
    }
    visitDeferredBlockPlaceholder() {
        this.hasBlocks = true;
    }
    visitDeferredBlockLoading() {
        this.hasBlocks = true;
    }
    visitDeferredBlockError() {
        this.hasBlocks = true;
    }
    visitIfBlock() {
        this.hasBlocks = true;
    }
    visitIfBlockBranch() {
        this.hasBlocks = true;
    }
    visitForLoopBlock() {
        this.hasBlocks = true;
    }
    visitForLoopBlockEmpty() {
        this.hasBlocks = true;
    }
    visitSwitchBlock() {
        this.hasBlocks = true;
    }
    visitSwitchBlockCase() {
        this.hasBlocks = true;
    }
}

/**
 * Every time we make a breaking change to the declaration interface or partial-linker behavior, we
 * must update this constant to prevent old partial-linkers from incorrectly processing the
 * declaration.
 *
 * Do not include any prerelease in these vers   ions as they are ignored.
 */
const MINIMUM_PARTIAL_LINKER_VERSION$4 = '12.0.0';
function compileDeclareFactoryFunction(meta) {
    const definitionMap = new checker.DefinitionMap();
    definitionMap.set('minVersion', checker.literal(MINIMUM_PARTIAL_LINKER_VERSION$4));
    definitionMap.set('version', checker.literal('19.2.14'));
    definitionMap.set('ngImport', checker.importExpr(checker.Identifiers.core));
    definitionMap.set('type', meta.type.value);
    definitionMap.set('deps', compileDependencies(meta.deps));
    definitionMap.set('target', checker.importExpr(checker.Identifiers.FactoryTarget).prop(checker.FactoryTarget[meta.target]));
    return {
        expression: checker.importExpr(checker.Identifiers.declareFactory).callFn([definitionMap.toLiteralMap()]),
        statements: [],
        type: checker.createFactoryType(meta),
    };
}

/**
 * Every time we make a breaking change to the declaration interface or partial-linker behavior, we
 * must update this constant to prevent old partial-linkers from incorrectly processing the
 * declaration.
 *
 * Do not include any prerelease in these versions as they are ignored.
 */
const MINIMUM_PARTIAL_LINKER_VERSION$3 = '12.0.0';
/**
 * Compile a Injectable declaration defined by the `R3InjectableMetadata`.
 */
function compileDeclareInjectableFromMetadata(meta) {
    const definitionMap = createInjectableDefinitionMap(meta);
    const expression = checker.importExpr(checker.Identifiers.declareInjectable).callFn([definitionMap.toLiteralMap()]);
    const type = checker.createInjectableType(meta);
    return { expression, type, statements: [] };
}
/**
 * Gathers the declaration fields for a Injectable into a `DefinitionMap`.
 */
function createInjectableDefinitionMap(meta) {
    const definitionMap = new checker.DefinitionMap();
    definitionMap.set('minVersion', checker.literal(MINIMUM_PARTIAL_LINKER_VERSION$3));
    definitionMap.set('version', checker.literal('19.2.14'));
    definitionMap.set('ngImport', checker.importExpr(checker.Identifiers.core));
    definitionMap.set('type', meta.type.value);
    // Only generate providedIn property if it has a non-null value
    if (meta.providedIn !== undefined) {
        const providedIn = checker.convertFromMaybeForwardRefExpression(meta.providedIn);
        if (providedIn.value !== null) {
            definitionMap.set('providedIn', providedIn);
        }
    }
    if (meta.useClass !== undefined) {
        definitionMap.set('useClass', checker.convertFromMaybeForwardRefExpression(meta.useClass));
    }
    if (meta.useExisting !== undefined) {
        definitionMap.set('useExisting', checker.convertFromMaybeForwardRefExpression(meta.useExisting));
    }
    if (meta.useValue !== undefined) {
        definitionMap.set('useValue', checker.convertFromMaybeForwardRefExpression(meta.useValue));
    }
    // Factories do not contain `ForwardRef`s since any types are already wrapped in a function call
    // so the types will not be eagerly evaluated. Therefore we do not need to process this expression
    // with `convertFromProviderExpression()`.
    if (meta.useFactory !== undefined) {
        definitionMap.set('useFactory', meta.useFactory);
    }
    if (meta.deps !== undefined) {
        definitionMap.set('deps', checker.literalArr(meta.deps.map(compileDependency)));
    }
    return definitionMap;
}

/**
 * Every time we make a breaking change to the declaration interface or partial-linker behavior, we
 * must update this constant to prevent old partial-linkers from incorrectly processing the
 * declaration.
 *
 * Do not include any prerelease in these versions as they are ignored.
 */
const MINIMUM_PARTIAL_LINKER_VERSION$2 = '12.0.0';
function compileDeclareInjectorFromMetadata(meta) {
    const definitionMap = createInjectorDefinitionMap(meta);
    const expression = checker.importExpr(checker.Identifiers.declareInjector).callFn([definitionMap.toLiteralMap()]);
    const type = checker.createInjectorType(meta);
    return { expression, type, statements: [] };
}
/**
 * Gathers the declaration fields for an Injector into a `DefinitionMap`.
 */
function createInjectorDefinitionMap(meta) {
    const definitionMap = new checker.DefinitionMap();
    definitionMap.set('minVersion', checker.literal(MINIMUM_PARTIAL_LINKER_VERSION$2));
    definitionMap.set('version', checker.literal('19.2.14'));
    definitionMap.set('ngImport', checker.importExpr(checker.Identifiers.core));
    definitionMap.set('type', meta.type.value);
    definitionMap.set('providers', meta.providers);
    if (meta.imports.length > 0) {
        definitionMap.set('imports', checker.literalArr(meta.imports));
    }
    return definitionMap;
}

/**
 * Every time we make a breaking change to the declaration interface or partial-linker behavior, we
 * must update this constant to prevent old partial-linkers from incorrectly processing the
 * declaration.
 *
 * Do not include any prerelease in these versions as they are ignored.
 */
const MINIMUM_PARTIAL_LINKER_VERSION$1 = '14.0.0';
function compileDeclareNgModuleFromMetadata(meta) {
    const definitionMap = createNgModuleDefinitionMap(meta);
    const expression = checker.importExpr(checker.Identifiers.declareNgModule).callFn([definitionMap.toLiteralMap()]);
    const type = checker.createNgModuleType(meta);
    return { expression, type, statements: [] };
}
/**
 * Gathers the declaration fields for an NgModule into a `DefinitionMap`.
 */
function createNgModuleDefinitionMap(meta) {
    const definitionMap = new checker.DefinitionMap();
    if (meta.kind === checker.R3NgModuleMetadataKind.Local) {
        throw new Error('Invalid path! Local compilation mode should not get into the partial compilation path');
    }
    definitionMap.set('minVersion', checker.literal(MINIMUM_PARTIAL_LINKER_VERSION$1));
    definitionMap.set('version', checker.literal('19.2.14'));
    definitionMap.set('ngImport', checker.importExpr(checker.Identifiers.core));
    definitionMap.set('type', meta.type.value);
    // We only generate the keys in the metadata if the arrays contain values.
    // We must wrap the arrays inside a function if any of the values are a forward reference to a
    // not-yet-declared class. This is to support JIT execution of the `ɵɵngDeclareNgModule()` call.
    // In the linker these wrappers are stripped and then reapplied for the `ɵɵdefineNgModule()` call.
    if (meta.bootstrap.length > 0) {
        definitionMap.set('bootstrap', checker.refsToArray(meta.bootstrap, meta.containsForwardDecls));
    }
    if (meta.declarations.length > 0) {
        definitionMap.set('declarations', checker.refsToArray(meta.declarations, meta.containsForwardDecls));
    }
    if (meta.imports.length > 0) {
        definitionMap.set('imports', checker.refsToArray(meta.imports, meta.containsForwardDecls));
    }
    if (meta.exports.length > 0) {
        definitionMap.set('exports', checker.refsToArray(meta.exports, meta.containsForwardDecls));
    }
    if (meta.schemas !== null && meta.schemas.length > 0) {
        definitionMap.set('schemas', checker.literalArr(meta.schemas.map((ref) => ref.value)));
    }
    if (meta.id !== null) {
        definitionMap.set('id', meta.id);
    }
    return definitionMap;
}

/**
 * Every time we make a breaking change to the declaration interface or partial-linker behavior, we
 * must update this constant to prevent old partial-linkers from incorrectly processing the
 * declaration.
 *
 * Do not include any prerelease in these versions as they are ignored.
 */
const MINIMUM_PARTIAL_LINKER_VERSION = '14.0.0';
/**
 * Compile a Pipe declaration defined by the `R3PipeMetadata`.
 */
function compileDeclarePipeFromMetadata(meta) {
    const definitionMap = createPipeDefinitionMap(meta);
    const expression = checker.importExpr(checker.Identifiers.declarePipe).callFn([definitionMap.toLiteralMap()]);
    const type = checker.createPipeType(meta);
    return { expression, type, statements: [] };
}
/**
 * Gathers the declaration fields for a Pipe into a `DefinitionMap`.
 */
function createPipeDefinitionMap(meta) {
    const definitionMap = new checker.DefinitionMap();
    definitionMap.set('minVersion', checker.literal(MINIMUM_PARTIAL_LINKER_VERSION));
    definitionMap.set('version', checker.literal('19.2.14'));
    definitionMap.set('ngImport', checker.importExpr(checker.Identifiers.core));
    // e.g. `type: MyPipe`
    definitionMap.set('type', meta.type.value);
    if (meta.isStandalone !== undefined) {
        definitionMap.set('isStandalone', checker.literal(meta.isStandalone));
    }
    // e.g. `name: "myPipe"`
    definitionMap.set('name', checker.literal(meta.pipeName));
    if (meta.pure === false) {
        // e.g. `pure: false`
        definitionMap.set('pure', checker.literal(meta.pure));
    }
    return definitionMap;
}

/**
 * Base URL for the error details page.
 *
 * Keep the files below in full sync:
 *  - packages/compiler-cli/src/ngtsc/diagnostics/src/error_details_base_url.ts
 *  - packages/core/src/error_details_base_url.ts
 */
const ERROR_DETAILS_PAGE_BASE_URL = 'https://angular.dev/errors';

// Escape anything that isn't alphanumeric, '/' or '_'.
const CHARS_TO_ESCAPE = /[^a-zA-Z0-9/_]/g;
/**
 * An `AliasingHost` which generates and consumes alias re-exports when module names for each file
 * are determined by a `UnifiedModulesHost`.
 *
 * When using a `UnifiedModulesHost`, aliasing prevents issues with transitive dependencies. See the
 * README.md for more details.
 */
class UnifiedModulesAliasingHost {
    unifiedModulesHost;
    constructor(unifiedModulesHost) {
        this.unifiedModulesHost = unifiedModulesHost;
    }
    /**
     * With a `UnifiedModulesHost`, aliases are chosen automatically without the need to look through
     * the exports present in a .d.ts file, so we can avoid cluttering the .d.ts files.
     */
    aliasExportsInDts = false;
    maybeAliasSymbolAs(ref, context, ngModuleName, isReExport) {
        if (!isReExport) {
            // Aliasing is used with a UnifiedModulesHost to prevent transitive dependencies. Thus,
            // aliases
            // only need to be created for directives/pipes which are not direct declarations of an
            // NgModule which exports them.
            return null;
        }
        return this.aliasName(ref.node, context);
    }
    /**
     * Generates an `Expression` to import `decl` from `via`, assuming an export was added when `via`
     * was compiled per `maybeAliasSymbolAs` above.
     */
    getAliasIn(decl, via, isReExport) {
        if (!isReExport) {
            // Directly exported directives/pipes don't require an alias, per the logic in
            // `maybeAliasSymbolAs`.
            return null;
        }
        // viaModule is the module it'll actually be imported from.
        const moduleName = this.unifiedModulesHost.fileNameToModuleName(via.fileName, via.fileName);
        return new checker.ExternalExpr({ moduleName, name: this.aliasName(decl, via) });
    }
    /**
     * Generates an alias name based on the full module name of the file which declares the aliased
     * directive/pipe.
     */
    aliasName(decl, context) {
        // The declared module is used to get the name of the alias.
        const declModule = this.unifiedModulesHost.fileNameToModuleName(decl.getSourceFile().fileName, context.fileName);
        const replaced = declModule.replace(CHARS_TO_ESCAPE, '_').replace(/\//g, '$');
        return 'ɵng$' + replaced + '$$' + decl.name.text;
    }
}
/**
 * An `AliasingHost` which exports directives from any file containing an NgModule in which they're
 * declared/exported, under a private symbol name.
 *
 * These exports support cases where an NgModule is imported deeply from an absolute module path
 * (that is, it's not part of an Angular Package Format entrypoint), and the compiler needs to
 * import any matched directives/pipes from the same path (to the NgModule file). See README.md for
 * more details.
 */
class PrivateExportAliasingHost {
    host;
    constructor(host) {
        this.host = host;
    }
    /**
     * Under private export aliasing, the `AbsoluteModuleStrategy` used for emitting references will
     * will select aliased exports that it finds in the .d.ts file for an NgModule's file. Thus,
     * emitting these exports in .d.ts is a requirement for the `PrivateExportAliasingHost` to
     * function correctly.
     */
    aliasExportsInDts = true;
    maybeAliasSymbolAs(ref, context, ngModuleName) {
        if (ref.hasOwningModuleGuess) {
            // Skip nodes that already have an associated absolute module specifier, since they can be
            // safely imported from that specifier.
            return null;
        }
        // Look for a user-provided export of `decl` in `context`. If one exists, then an alias export
        // is not needed.
        // TODO(alxhub): maybe add a host method to check for the existence of an export without going
        // through the entire list of exports.
        const exports = this.host.getExportsOfModule(context);
        if (exports === null) {
            // Something went wrong, and no exports were available at all. Bail rather than risk creating
            // re-exports when they're not needed.
            throw new Error(`Could not determine the exports of: ${context.fileName}`);
        }
        let found = false;
        exports.forEach((value) => {
            if (value.node === ref.node) {
                found = true;
            }
        });
        if (found) {
            // The module exports the declared class directly, no alias is necessary.
            return null;
        }
        return `ɵngExportɵ${ngModuleName}ɵ${ref.node.name.text}`;
    }
    /**
     * A `PrivateExportAliasingHost` only generates re-exports and does not direct the compiler to
     * directly consume the aliases it creates.
     *
     * Instead, they're consumed indirectly: `AbsoluteModuleStrategy` `ReferenceEmitterStrategy` will
     * select these alias exports automatically when looking for an export of the directive/pipe from
     * the same path as the NgModule was imported.
     *
     * Thus, `getAliasIn` always returns `null`.
     */
    getAliasIn() {
        return null;
    }
}
/**
 * A `ReferenceEmitStrategy` which will consume the alias attached to a particular `Reference` to a
 * directive or pipe, if it exists.
 */
class AliasStrategy {
    emit(ref, context, importMode) {
        if (importMode & checker.ImportFlags.NoAliasing || ref.alias === null) {
            return null;
        }
        return {
            kind: checker.ReferenceEmitKind.Success,
            expression: ref.alias,
            importedFile: 'unknown',
        };
    }
}

function relativePathBetween(from, to) {
    const relativePath = checker.stripExtension(checker.relative(checker.dirname(checker.resolve(from)), checker.resolve(to)));
    return relativePath !== '' ? checker.toRelativeImport(relativePath) : null;
}
function normalizeSeparators(path) {
    // TODO: normalize path only for OS that need it.
    return path.replace(/\\/g, '/');
}
/**
 * Attempts to generate a project-relative path for a file.
 * @param fileName Absolute path to the file.
 * @param rootDirs Root directories of the project.
 * @param compilerHost Host used to resolve file names.
 * @returns
 */
function getProjectRelativePath(fileName, rootDirs, compilerHost) {
    // Note: we need to pass both the file name and the root directories through getCanonicalFileName,
    // because the root directories might've been passed through it already while the source files
    // definitely have not. This can break the relative return value, because in some platforms
    // getCanonicalFileName lowercases the path.
    const filePath = compilerHost.getCanonicalFileName(fileName);
    for (const rootDir of rootDirs) {
        const rel = checker.relative(compilerHost.getCanonicalFileName(rootDir), filePath);
        if (!rel.startsWith('..')) {
            return rel;
        }
    }
    return null;
}

/**
 * `ImportRewriter` that does no rewriting.
 */
class NoopImportRewriter {
    rewriteSymbol(symbol, specifier) {
        return symbol;
    }
    rewriteSpecifier(specifier, inContextOfFile) {
        return specifier;
    }
    rewriteNamespaceImportIdentifier(specifier) {
        return specifier;
    }
}
/**
 * A mapping of supported symbols that can be imported from within @angular/core, and the names by
 * which they're exported from r3_symbols.
 */
const CORE_SUPPORTED_SYMBOLS = new Map([
    ['ɵɵdefineInjectable', 'ɵɵdefineInjectable'],
    ['ɵɵdefineInjector', 'ɵɵdefineInjector'],
    ['ɵɵdefineNgModule', 'ɵɵdefineNgModule'],
    ['ɵɵsetNgModuleScope', 'ɵɵsetNgModuleScope'],
    ['ɵɵinject', 'ɵɵinject'],
    ['ɵɵFactoryDeclaration', 'ɵɵFactoryDeclaration'],
    ['ɵsetClassMetadata', 'setClassMetadata'],
    ['ɵsetClassMetadataAsync', 'setClassMetadataAsync'],
    ['ɵɵInjectableDeclaration', 'ɵɵInjectableDeclaration'],
    ['ɵɵInjectorDeclaration', 'ɵɵInjectorDeclaration'],
    ['ɵɵNgModuleDeclaration', 'ɵɵNgModuleDeclaration'],
    ['ɵNgModuleFactory', 'NgModuleFactory'],
    ['ɵnoSideEffects', 'ɵnoSideEffects'],
]);
const CORE_MODULE = '@angular/core';
/**
 * `ImportRewriter` that rewrites imports from '@angular/core' to be imported from the r3_symbols.ts
 * file instead.
 */
class R3SymbolsImportRewriter {
    r3SymbolsPath;
    constructor(r3SymbolsPath) {
        this.r3SymbolsPath = r3SymbolsPath;
    }
    rewriteSymbol(symbol, specifier) {
        if (specifier !== CORE_MODULE) {
            // This import isn't from core, so ignore it.
            return symbol;
        }
        return validateAndRewriteCoreSymbol(symbol);
    }
    rewriteSpecifier(specifier, inContextOfFile) {
        if (specifier !== CORE_MODULE) {
            // This module isn't core, so ignore it.
            return specifier;
        }
        const relativePathToR3Symbols = relativePathBetween(inContextOfFile, this.r3SymbolsPath);
        if (relativePathToR3Symbols === null) {
            throw new Error(`Failed to rewrite import inside ${CORE_MODULE}: ${inContextOfFile} -> ${this.r3SymbolsPath}`);
        }
        return relativePathToR3Symbols;
    }
    rewriteNamespaceImportIdentifier(specifier) {
        return specifier;
    }
}
function validateAndRewriteCoreSymbol(name) {
    if (!CORE_SUPPORTED_SYMBOLS.has(name)) {
        throw new Error(`Importing unexpected symbol ${name} while compiling ${CORE_MODULE}`);
    }
    return CORE_SUPPORTED_SYMBOLS.get(name);
}

const AssumeEager = 'AssumeEager';
/**
 * Allows to register a symbol as deferrable and keep track of its usage.
 *
 * This information is later used to determine whether it's safe to drop
 * a regular import of this symbol (actually the entire import declaration)
 * in favor of using a dynamic import for cases when defer blocks are used.
 */
class DeferredSymbolTracker {
    typeChecker;
    onlyExplicitDeferDependencyImports;
    imports = new Map();
    /**
     * Map of a component class -> all import declarations that bring symbols
     * used within `@Component.deferredImports` field.
     */
    explicitlyDeferredImports = new Map();
    constructor(typeChecker, onlyExplicitDeferDependencyImports) {
        this.typeChecker = typeChecker;
        this.onlyExplicitDeferDependencyImports = onlyExplicitDeferDependencyImports;
    }
    /**
     * Given an import declaration node, extract the names of all imported symbols
     * and return them as a map where each symbol is a key and `AssumeEager` is a value.
     *
     * The logic recognizes the following import shapes:
     *
     * Case 1: `import {a, b as B} from 'a'`
     * Case 2: `import X from 'a'`
     * Case 3: `import * as x from 'a'`
     */
    extractImportedSymbols(importDecl) {
        const symbolMap = new Map();
        // Unsupported case: `import 'a'`
        if (importDecl.importClause === undefined) {
            throw new Error(`Provided import declaration doesn't have any symbols.`);
        }
        // If the entire import is a type-only import, none of the symbols can be eager.
        if (importDecl.importClause.isTypeOnly) {
            return symbolMap;
        }
        if (importDecl.importClause.namedBindings !== undefined) {
            const bindings = importDecl.importClause.namedBindings;
            if (ts.isNamedImports(bindings)) {
                // Case 1: `import {a, b as B} from 'a'`
                for (const element of bindings.elements) {
                    if (!element.isTypeOnly) {
                        symbolMap.set(element.name.text, AssumeEager);
                    }
                }
            }
            else {
                // Case 2: `import X from 'a'`
                symbolMap.set(bindings.name.text, AssumeEager);
            }
        }
        else if (importDecl.importClause.name !== undefined) {
            // Case 2: `import * as x from 'a'`
            symbolMap.set(importDecl.importClause.name.text, AssumeEager);
        }
        else {
            throw new Error('Unrecognized import structure.');
        }
        return symbolMap;
    }
    /**
     * Retrieves a list of import declarations that contain symbols used within
     * `@Component.deferredImports` of a specific component class, but those imports
     * can not be removed, since there are other symbols imported alongside deferred
     * components.
     */
    getNonRemovableDeferredImports(sourceFile, classDecl) {
        const affectedImports = [];
        const importDecls = this.explicitlyDeferredImports.get(classDecl) ?? [];
        for (const importDecl of importDecls) {
            if (importDecl.getSourceFile() === sourceFile && !this.canDefer(importDecl)) {
                affectedImports.push(importDecl);
            }
        }
        return affectedImports;
    }
    /**
     * Marks a given identifier and an associated import declaration as a candidate
     * for defer loading.
     */
    markAsDeferrableCandidate(identifier, importDecl, componentClassDecl, isExplicitlyDeferred) {
        if (this.onlyExplicitDeferDependencyImports && !isExplicitlyDeferred) {
            // Ignore deferrable candidates when only explicit deferred imports mode is enabled.
            // In that mode only dependencies from the `@Component.deferredImports` field are
            // defer-loadable.
            return;
        }
        if (isExplicitlyDeferred) {
            if (this.explicitlyDeferredImports.has(componentClassDecl)) {
                this.explicitlyDeferredImports.get(componentClassDecl).push(importDecl);
            }
            else {
                this.explicitlyDeferredImports.set(componentClassDecl, [importDecl]);
            }
        }
        let symbolMap = this.imports.get(importDecl);
        // Do we come across this import for the first time?
        if (!symbolMap) {
            symbolMap = this.extractImportedSymbols(importDecl);
            this.imports.set(importDecl, symbolMap);
        }
        if (!symbolMap.has(identifier.text)) {
            throw new Error(`The '${identifier.text}' identifier doesn't belong ` +
                `to the provided import declaration.`);
        }
        if (symbolMap.get(identifier.text) === AssumeEager) {
            // We process this symbol for the first time, populate references.
            symbolMap.set(identifier.text, this.lookupIdentifiersInSourceFile(identifier.text, importDecl));
        }
        const identifiers = symbolMap.get(identifier.text);
        // Drop the current identifier, since we are trying to make it deferrable
        // (it's used as a dependency in one of the defer blocks).
        identifiers.delete(identifier);
    }
    /**
     * Whether all symbols from a given import declaration have no references
     * in a source file, thus it's safe to use dynamic imports.
     */
    canDefer(importDecl) {
        if (!this.imports.has(importDecl)) {
            return false;
        }
        const symbolsMap = this.imports.get(importDecl);
        for (const refs of symbolsMap.values()) {
            if (refs === AssumeEager || refs.size > 0) {
                // There may be still eager references to this symbol.
                return false;
            }
        }
        return true;
    }
    /**
     * Returns a set of import declarations that is safe to remove
     * from the current source file and generate dynamic imports instead.
     */
    getDeferrableImportDecls() {
        const deferrableDecls = new Set();
        for (const [importDecl] of this.imports) {
            if (this.canDefer(importDecl)) {
                deferrableDecls.add(importDecl);
            }
        }
        return deferrableDecls;
    }
    lookupIdentifiersInSourceFile(name, importDecl) {
        const results = new Set();
        const visit = (node) => {
            // Don't record references from the declaration itself or inside
            // type nodes which will be stripped from the JS output.
            if (node === importDecl || ts.isTypeNode(node)) {
                return;
            }
            if (ts.isIdentifier(node) && node.text === name) {
                // Is `node` actually a reference to this symbol?
                const sym = this.typeChecker.getSymbolAtLocation(node);
                if (sym === undefined) {
                    return;
                }
                if (sym.declarations === undefined || sym.declarations.length === 0) {
                    return;
                }
                const importClause = sym.declarations[0];
                // Is declaration from this import statement?
                const decl = checker.getContainingImportDeclaration(importClause);
                if (decl !== importDecl) {
                    return;
                }
                // `node` *is* a reference to the same import.
                results.add(node);
            }
            ts.forEachChild(node, visit);
        };
        visit(importDecl.getSourceFile());
        return results;
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Tracks which symbols are imported in specific files and under what names. Allows for efficient
 * querying for references to those symbols without having to consult the type checker early in the
 * process.
 *
 * Note that the tracker doesn't account for variable shadowing so a final verification with the
 * type checker may be necessary, depending on the context. Also does not track dynamic imports.
 */
class ImportedSymbolsTracker {
    fileToNamedImports = new WeakMap();
    fileToNamespaceImports = new WeakMap();
    /**
     * Checks if an identifier is a potential reference to a specific named import within the same
     * file.
     * @param node Identifier to be checked.
     * @param exportedName Name of the exported symbol that is being searched for.
     * @param moduleName Module from which the symbol should be imported.
     */
    isPotentialReferenceToNamedImport(node, exportedName, moduleName) {
        const sourceFile = node.getSourceFile();
        this.scanImports(sourceFile);
        const fileImports = this.fileToNamedImports.get(sourceFile);
        const moduleImports = fileImports.get(moduleName);
        const symbolImports = moduleImports?.get(exportedName);
        return symbolImports !== undefined && symbolImports.has(node.text);
    }
    /**
     * Checks if an identifier is a potential reference to a specific namespace import within the same
     * file.
     * @param node Identifier to be checked.
     * @param moduleName Module from which the namespace is imported.
     */
    isPotentialReferenceToNamespaceImport(node, moduleName) {
        const sourceFile = node.getSourceFile();
        this.scanImports(sourceFile);
        const namespaces = this.fileToNamespaceImports.get(sourceFile);
        return namespaces.get(moduleName)?.has(node.text) ?? false;
    }
    /**
     * Checks if a file has a named imported of a certain symbol.
     * @param sourceFile File to be checked.
     * @param exportedName Name of the exported symbol that is being checked.
     * @param moduleName Module that exports the symbol.
     */
    hasNamedImport(sourceFile, exportedName, moduleName) {
        this.scanImports(sourceFile);
        const fileImports = this.fileToNamedImports.get(sourceFile);
        const moduleImports = fileImports.get(moduleName);
        return moduleImports !== undefined && moduleImports.has(exportedName);
    }
    /**
     * Checks if a file has namespace imports of a certain symbol.
     * @param sourceFile File to be checked.
     * @param moduleName Module whose namespace import is being searched for.
     */
    hasNamespaceImport(sourceFile, moduleName) {
        this.scanImports(sourceFile);
        const namespaces = this.fileToNamespaceImports.get(sourceFile);
        return namespaces.has(moduleName);
    }
    /** Scans a `SourceFile` for import statements and caches them for later use. */
    scanImports(sourceFile) {
        if (this.fileToNamedImports.has(sourceFile) && this.fileToNamespaceImports.has(sourceFile)) {
            return;
        }
        const namedImports = new Map();
        const namespaceImports = new Map();
        this.fileToNamedImports.set(sourceFile, namedImports);
        this.fileToNamespaceImports.set(sourceFile, namespaceImports);
        // Only check top-level imports.
        for (const stmt of sourceFile.statements) {
            if (!ts.isImportDeclaration(stmt) ||
                !ts.isStringLiteralLike(stmt.moduleSpecifier) ||
                stmt.importClause?.namedBindings === undefined) {
                continue;
            }
            const moduleName = stmt.moduleSpecifier.text;
            if (ts.isNamespaceImport(stmt.importClause.namedBindings)) {
                // import * as foo from 'module'
                if (!namespaceImports.has(moduleName)) {
                    namespaceImports.set(moduleName, new Set());
                }
                namespaceImports.get(moduleName).add(stmt.importClause.namedBindings.name.text);
            }
            else {
                // import {foo, bar as alias} from 'module'
                for (const element of stmt.importClause.namedBindings.elements) {
                    const localName = element.name.text;
                    const exportedName = element.propertyName === undefined ? localName : element.propertyName.text;
                    if (!namedImports.has(moduleName)) {
                        namedImports.set(moduleName, new Map());
                    }
                    const localNames = namedImports.get(moduleName);
                    if (!localNames.has(exportedName)) {
                        localNames.set(exportedName, new Set());
                    }
                    localNames.get(exportedName)?.add(localName);
                }
            }
        }
    }
}

/**
 * A tool to track extra imports to be added to the generated files in the local compilation mode.
 *
 * This is needed for g3 bundling mechanism which requires dev files (= locally compiled) to have
 * imports resemble those generated for prod files (= full compilation mode). In full compilation
 * mode Angular compiler generates extra imports for statically analyzed component dependencies. We
 * need similar imports in local compilation as well.
 *
 * The tool offers API for adding local imports (to be added to a specific file) and global imports
 * (to be added to all the files in the local compilation). For more details on how these extra
 * imports are determined see this design doc:
 * https://docs.google.com/document/d/1dOWoSDvOY9ozlMmyCnxoFLEzGgHmTFVRAOVdVU-bxlI/edit?tab=t.0#heading=h.5n3k516r57g5
 *
 * An instance of this class will be passed to each annotation handler so that they can register the
 * extra imports that they see fit. Later on, the instance is passed to the Ivy transformer ({@link
 * ivyTransformFactory}) and it is used to add the extra imports registered by the handlers to the
 * import manager ({@link ImportManager}) in order to have these imports generated.
 *
 * The extra imports are all side effect imports, and so they are identified by a single string
 * containing the module name.
 *
 */
class LocalCompilationExtraImportsTracker {
    typeChecker;
    localImportsMap = new Map();
    globalImportsSet = new Set();
    /** Names of the files marked for extra import generation. */
    markedFilesSet = new Set();
    constructor(typeChecker) {
        this.typeChecker = typeChecker;
    }
    /**
     * Marks the source file for extra imports generation.
     *
     * The extra imports are generated only for the files marked through this method. In other words,
     * the method {@link getImportsForFile} returns empty if the file is not marked. This allows the
     * consumers of this tool to avoid generating extra imports for unrelated files (e.g., non-Angular
     * files)
     */
    markFileForExtraImportGeneration(sf) {
        this.markedFilesSet.add(sf.fileName);
    }
    /**
     * Adds an extra import to be added to the generated file of a specific source file.
     */
    addImportForFile(sf, moduleName) {
        if (!this.localImportsMap.has(sf.fileName)) {
            this.localImportsMap.set(sf.fileName, new Set());
        }
        this.localImportsMap.get(sf.fileName).add(moduleName);
    }
    /**
     * If the given node is an imported identifier, this method adds the module from which it is
     * imported as an extra import to the generated file of each source file in the compilation unit,
     * otherwise the method is noop.
     *
     * Adding an extra import to all files is not optimal though. There are rooms to optimize and a
     * add the import to a subset of files (e.g., exclude all the non Angular files as they don't need
     * any extra import). However for this first version of this feature we go by this mechanism for
     * simplicity. There will be on-going work to further optimize this method to add the extra import
     * to smallest possible candidate files instead of all files.
     */
    addGlobalImportFromIdentifier(node) {
        let identifier = null;
        if (ts.isIdentifier(node)) {
            identifier = node;
        }
        else if (ts.isPropertyAccessExpression(node) && ts.isIdentifier(node.expression)) {
            identifier = node.expression;
        }
        if (identifier === null) {
            return;
        }
        const sym = this.typeChecker.getSymbolAtLocation(identifier);
        if (!sym?.declarations?.length) {
            return;
        }
        const importClause = sym.declarations[0];
        const decl = checker.getContainingImportDeclaration(importClause);
        if (decl !== null) {
            this.globalImportsSet.add(removeQuotations(decl.moduleSpecifier.getText()));
        }
    }
    /**
     * Returns the list of all module names that the given file should include as its extra imports.
     */
    getImportsForFile(sf) {
        if (!this.markedFilesSet.has(sf.fileName)) {
            return [];
        }
        return [...this.globalImportsSet, ...(this.localImportsMap.get(sf.fileName) ?? [])];
    }
}
function removeQuotations(s) {
    return s.substring(1, s.length - 1).trim();
}

/**
 * Used by `RouterEntryPointManager` and `NgModuleRouteAnalyzer` (which is in turn is used by
 * `NgModuleDecoratorHandler`) for resolving the module source-files references in lazy-loaded
 * routes (relative to the source-file containing the `NgModule` that provides the route
 * definitions).
 */
class ModuleResolver {
    program;
    compilerOptions;
    host;
    moduleResolutionCache;
    constructor(program, compilerOptions, host, moduleResolutionCache) {
        this.program = program;
        this.compilerOptions = compilerOptions;
        this.host = host;
        this.moduleResolutionCache = moduleResolutionCache;
    }
    resolveModule(moduleName, containingFile) {
        const resolved = checker.resolveModuleName(moduleName, containingFile, this.compilerOptions, this.host, this.moduleResolutionCache);
        if (resolved === undefined) {
            return null;
        }
        return checker.getSourceFileOrNull(this.program, checker.absoluteFrom(resolved.resolvedFileName));
    }
}

/**
 * A `MetadataReader` that can read metadata from `.d.ts` files, which have static Ivy properties
 * from an upstream compilation already.
 */
class DtsMetadataReader {
    checker;
    reflector;
    constructor(checker, reflector) {
        this.checker = checker;
        this.reflector = reflector;
    }
    /**
     * Read the metadata from a class that has already been compiled somehow (either it's in a .d.ts
     * file, or in a .ts file with a handwritten definition).
     *
     * @param ref `Reference` to the class of interest, with the context of how it was obtained.
     */
    getNgModuleMetadata(ref) {
        const clazz = ref.node;
        // This operation is explicitly not memoized, as it depends on `ref.ownedByModuleGuess`.
        // TODO(alxhub): investigate caching of .d.ts module metadata.
        const ngModuleDef = this.reflector
            .getMembersOfClass(clazz)
            .find((member) => member.name === 'ɵmod' && member.isStatic);
        if (ngModuleDef === undefined) {
            return null;
        }
        else if (
        // Validate that the shape of the ngModuleDef type is correct.
        ngModuleDef.type === null ||
            !ts.isTypeReferenceNode(ngModuleDef.type) ||
            ngModuleDef.type.typeArguments === undefined ||
            ngModuleDef.type.typeArguments.length !== 4) {
            return null;
        }
        // Read the ModuleData out of the type arguments.
        const [_, declarationMetadata, importMetadata, exportMetadata] = ngModuleDef.type.typeArguments;
        const declarations = checker.extractReferencesFromType(this.checker, declarationMetadata, ref.bestGuessOwningModule);
        const exports = checker.extractReferencesFromType(this.checker, exportMetadata, ref.bestGuessOwningModule);
        const imports = checker.extractReferencesFromType(this.checker, importMetadata, ref.bestGuessOwningModule);
        // The module is considered poisoned if it's exports couldn't be
        // resolved completely. This would make the module not necessarily
        // usable for scope computation relying on this module; so we propagate
        // this "incompleteness" information to the caller.
        const isPoisoned = exports.isIncomplete;
        return {
            kind: checker.MetaKind.NgModule,
            ref,
            declarations: declarations.result,
            isPoisoned,
            exports: exports.result,
            imports: imports.result,
            schemas: [],
            rawDeclarations: null,
            rawImports: null,
            rawExports: null,
            decorator: null,
            // NgModules declared outside the current compilation are assumed to contain providers, as it
            // would be a non-breaking change for a library to introduce providers at any point.
            mayDeclareProviders: true,
        };
    }
    /**
     * Read directive (or component) metadata from a referenced class in a .d.ts file.
     */
    getDirectiveMetadata(ref) {
        const clazz = ref.node;
        const def = this.reflector
            .getMembersOfClass(clazz)
            .find((field) => field.isStatic && (field.name === 'ɵcmp' || field.name === 'ɵdir'));
        if (def === undefined) {
            // No definition could be found.
            return null;
        }
        else if (def.type === null ||
            !ts.isTypeReferenceNode(def.type) ||
            def.type.typeArguments === undefined ||
            def.type.typeArguments.length < 2) {
            // The type metadata was the wrong shape.
            return null;
        }
        const isComponent = def.name === 'ɵcmp';
        const ctorParams = this.reflector.getConstructorParameters(clazz);
        // A directive is considered to be structural if:
        // 1) it's a directive, not a component, and
        // 2) it injects `TemplateRef`
        const isStructural = !isComponent &&
            ctorParams !== null &&
            ctorParams.some((param) => {
                return (param.typeValueReference.kind === 1 /* TypeValueReferenceKind.IMPORTED */ &&
                    param.typeValueReference.moduleName === '@angular/core' &&
                    param.typeValueReference.importedName === 'TemplateRef');
            });
        const ngContentSelectors = def.type.typeArguments.length > 6 ? checker.readStringArrayType(def.type.typeArguments[6]) : null;
        // Note: the default value is still `false` here, because only legacy .d.ts files written before
        // we had so many arguments use this default.
        const isStandalone = def.type.typeArguments.length > 7 && (checker.readBooleanType(def.type.typeArguments[7]) ?? false);
        const inputs = checker.ClassPropertyMapping.fromMappedObject(readInputsType(def.type.typeArguments[3]));
        const outputs = checker.ClassPropertyMapping.fromMappedObject(checker.readMapType(def.type.typeArguments[4], checker.readStringType));
        const hostDirectives = def.type.typeArguments.length > 8
            ? readHostDirectivesType(this.checker, def.type.typeArguments[8], ref.bestGuessOwningModule)
            : null;
        const isSignal = def.type.typeArguments.length > 9 && (checker.readBooleanType(def.type.typeArguments[9]) ?? false);
        // At this point in time, the `.d.ts` may not be fully extractable when
        // trying to resolve host directive types to their declarations.
        // If this cannot be done completely, the metadata is incomplete and "poisoned".
        const isPoisoned = hostDirectives !== null && hostDirectives?.isIncomplete;
        return {
            kind: checker.MetaKind.Directive,
            matchSource: checker.MatchSource.Selector,
            ref,
            name: clazz.name.text,
            isComponent,
            selector: checker.readStringType(def.type.typeArguments[1]),
            exportAs: checker.readStringArrayType(def.type.typeArguments[2]),
            inputs,
            outputs,
            hostDirectives: hostDirectives?.result ?? null,
            queries: checker.readStringArrayType(def.type.typeArguments[5]),
            ...checker.extractDirectiveTypeCheckMeta(clazz, inputs, this.reflector),
            baseClass: readBaseClass(clazz, this.checker, this.reflector),
            isPoisoned,
            isStructural,
            animationTriggerNames: null,
            ngContentSelectors,
            isStandalone,
            isSignal,
            // We do not transfer information about inputs from class metadata
            // via `.d.ts` declarations. This is fine because this metadata is
            // currently only used for classes defined in source files. E.g. in migrations.
            inputFieldNamesFromMetadataArray: null,
            // Imports are tracked in metadata only for template type-checking purposes,
            // so standalone components from .d.ts files don't have any.
            imports: null,
            rawImports: null,
            deferredImports: null,
            // The same goes for schemas.
            schemas: null,
            decorator: null,
            // Assume that standalone components from .d.ts files may export providers.
            assumedToExportProviders: isComponent && isStandalone,
            // `preserveWhitespaces` isn't encoded in the .d.ts and is only
            // used to increase the accuracy of a diagnostic.
            preserveWhitespaces: false,
            isExplicitlyDeferred: false,
        };
    }
    /**
     * Read pipe metadata from a referenced class in a .d.ts file.
     */
    getPipeMetadata(ref) {
        const def = this.reflector
            .getMembersOfClass(ref.node)
            .find((field) => field.isStatic && field.name === 'ɵpipe');
        if (def === undefined) {
            // No definition could be found.
            return null;
        }
        else if (def.type === null ||
            !ts.isTypeReferenceNode(def.type) ||
            def.type.typeArguments === undefined ||
            def.type.typeArguments.length < 2) {
            // The type metadata was the wrong shape.
            return null;
        }
        const type = def.type.typeArguments[1];
        if (!ts.isLiteralTypeNode(type) || !ts.isStringLiteral(type.literal)) {
            // The type metadata was the wrong type.
            return null;
        }
        const name = type.literal.text;
        const isStandalone = def.type.typeArguments.length > 2 && (checker.readBooleanType(def.type.typeArguments[2]) ?? false);
        return {
            kind: checker.MetaKind.Pipe,
            ref,
            name,
            nameExpr: null,
            isStandalone,
            isPure: null, // The DTS has no idea about that
            decorator: null,
            isExplicitlyDeferred: false,
        };
    }
}
function readInputsType(type) {
    const inputsMap = {};
    if (ts.isTypeLiteralNode(type)) {
        for (const member of type.members) {
            if (!ts.isPropertySignature(member) ||
                member.type === undefined ||
                member.name === undefined ||
                (!ts.isStringLiteral(member.name) && !ts.isIdentifier(member.name))) {
                continue;
            }
            const stringValue = checker.readStringType(member.type);
            const classPropertyName = member.name.text;
            // Before v16 the inputs map has the type of `{[field: string]: string}`.
            // After v16 it has the type of `{[field: string]: {alias: string, required: boolean}}`.
            if (stringValue != null) {
                inputsMap[classPropertyName] = {
                    bindingPropertyName: stringValue,
                    classPropertyName,
                    required: false,
                    // Signal inputs were not supported pre v16- so those inputs are never signal based.
                    isSignal: false,
                    // Input transform are only tracked for locally-compiled directives. Directives coming
                    // from the .d.ts already have them included through `ngAcceptInputType` class members,
                    // or via the `InputSignal` type of the member.
                    transform: null,
                };
            }
            else {
                const config = checker.readMapType(member.type, (innerValue) => {
                    return checker.readStringType(innerValue) ?? checker.readBooleanType(innerValue);
                });
                inputsMap[classPropertyName] = {
                    classPropertyName,
                    bindingPropertyName: config.alias,
                    required: config.required,
                    isSignal: !!config.isSignal,
                    // Input transform are only tracked for locally-compiled directives. Directives coming
                    // from the .d.ts already have them included through `ngAcceptInputType` class members,
                    // or via the `InputSignal` type of the member.
                    transform: null,
                };
            }
        }
    }
    return inputsMap;
}
function readBaseClass(clazz, checker$1, reflector) {
    if (!checker.isNamedClassDeclaration(clazz)) {
        // Technically this is an error in a .d.ts file, but for the purposes of finding the base class
        // it's ignored.
        return reflector.hasBaseClass(clazz) ? 'dynamic' : null;
    }
    if (clazz.heritageClauses !== undefined) {
        for (const clause of clazz.heritageClauses) {
            if (clause.token === ts.SyntaxKind.ExtendsKeyword) {
                const baseExpr = clause.types[0].expression;
                let symbol = checker$1.getSymbolAtLocation(baseExpr);
                if (symbol === undefined) {
                    return 'dynamic';
                }
                else if (symbol.flags & ts.SymbolFlags.Alias) {
                    symbol = checker$1.getAliasedSymbol(symbol);
                }
                if (symbol.valueDeclaration !== undefined &&
                    checker.isNamedClassDeclaration(symbol.valueDeclaration)) {
                    return new checker.Reference(symbol.valueDeclaration);
                }
                else {
                    return 'dynamic';
                }
            }
        }
    }
    return null;
}
function readHostDirectivesType(checker$1, type, bestGuessOwningModule) {
    if (!ts.isTupleTypeNode(type) || type.elements.length === 0) {
        return null;
    }
    const result = [];
    let isIncomplete = false;
    for (const hostDirectiveType of type.elements) {
        const { directive, inputs, outputs } = checker.readMapType(hostDirectiveType, (type) => type);
        if (directive) {
            if (!ts.isTypeQueryNode(directive)) {
                throw new Error(`Expected TypeQueryNode: ${checker.nodeDebugInfo(directive)}`);
            }
            const ref = checker.extraReferenceFromTypeQuery(checker$1, directive, type, bestGuessOwningModule);
            if (ref === null) {
                isIncomplete = true;
                continue;
            }
            result.push({
                directive: ref,
                isForwardReference: false,
                inputs: checker.readMapType(inputs, checker.readStringType),
                outputs: checker.readMapType(outputs, checker.readStringType),
            });
        }
    }
    return result.length > 0 ? { result, isIncomplete } : null;
}

/**
 * A registry of directive, pipe, and module metadata for types defined in the current compilation
 * unit, which supports both reading and registering.
 */
class LocalMetadataRegistry {
    directives = new Map();
    ngModules = new Map();
    pipes = new Map();
    getDirectiveMetadata(ref) {
        return this.directives.has(ref.node) ? this.directives.get(ref.node) : null;
    }
    getNgModuleMetadata(ref) {
        return this.ngModules.has(ref.node) ? this.ngModules.get(ref.node) : null;
    }
    getPipeMetadata(ref) {
        return this.pipes.has(ref.node) ? this.pipes.get(ref.node) : null;
    }
    registerDirectiveMetadata(meta) {
        this.directives.set(meta.ref.node, meta);
    }
    registerNgModuleMetadata(meta) {
        this.ngModules.set(meta.ref.node, meta);
    }
    registerPipeMetadata(meta) {
        this.pipes.set(meta.ref.node, meta);
    }
    getKnown(kind) {
        switch (kind) {
            case checker.MetaKind.Directive:
                return Array.from(this.directives.values()).map((v) => v.ref.node);
            case checker.MetaKind.Pipe:
                return Array.from(this.pipes.values()).map((v) => v.ref.node);
            case checker.MetaKind.NgModule:
                return Array.from(this.ngModules.values()).map((v) => v.ref.node);
        }
    }
}
/**
 * A `MetadataRegistry` which registers metadata with multiple delegate `MetadataRegistry`
 * instances.
 */
class CompoundMetadataRegistry {
    registries;
    constructor(registries) {
        this.registries = registries;
    }
    registerDirectiveMetadata(meta) {
        for (const registry of this.registries) {
            registry.registerDirectiveMetadata(meta);
        }
    }
    registerNgModuleMetadata(meta) {
        for (const registry of this.registries) {
            registry.registerNgModuleMetadata(meta);
        }
    }
    registerPipeMetadata(meta) {
        for (const registry of this.registries) {
            registry.registerPipeMetadata(meta);
        }
    }
}

/**
 * Tracks the mapping between external resources and the directives(s) which use them.
 *
 * This information is produced during analysis of the program and is used mainly to support
 * external tooling, for which such a mapping is challenging to determine without compiler
 * assistance.
 */
class ResourceRegistry {
    externalTemplateToComponentsMap = new Map();
    componentToTemplateMap = new Map();
    componentToStylesMap = new Map();
    externalStyleToComponentsMap = new Map();
    getComponentsWithTemplate(template) {
        if (!this.externalTemplateToComponentsMap.has(template)) {
            return new Set();
        }
        return this.externalTemplateToComponentsMap.get(template);
    }
    registerResources(resources, directive) {
        if (resources.template !== null) {
            this.registerTemplate(resources.template, directive);
        }
        if (resources.styles !== null) {
            for (const style of resources.styles) {
                this.registerStyle(style, directive);
            }
        }
    }
    registerTemplate(templateResource, component) {
        const { path } = templateResource;
        if (path !== null) {
            if (!this.externalTemplateToComponentsMap.has(path)) {
                this.externalTemplateToComponentsMap.set(path, new Set());
            }
            this.externalTemplateToComponentsMap.get(path).add(component);
        }
        this.componentToTemplateMap.set(component, templateResource);
    }
    getTemplate(component) {
        if (!this.componentToTemplateMap.has(component)) {
            return null;
        }
        return this.componentToTemplateMap.get(component);
    }
    registerStyle(styleResource, component) {
        const { path } = styleResource;
        if (!this.componentToStylesMap.has(component)) {
            this.componentToStylesMap.set(component, new Set());
        }
        if (path !== null) {
            if (!this.externalStyleToComponentsMap.has(path)) {
                this.externalStyleToComponentsMap.set(path, new Set());
            }
            this.externalStyleToComponentsMap.get(path).add(component);
        }
        this.componentToStylesMap.get(component).add(styleResource);
    }
    getStyles(component) {
        if (!this.componentToStylesMap.has(component)) {
            return new Set();
        }
        return this.componentToStylesMap.get(component);
    }
    getComponentsWithStyle(styleUrl) {
        if (!this.externalStyleToComponentsMap.has(styleUrl)) {
            return new Set();
        }
        return this.externalStyleToComponentsMap.get(styleUrl);
    }
}

/**
 * Determines whether types may or may not export providers to NgModules, by transitively walking
 * the NgModule & standalone import graph.
 */
class ExportedProviderStatusResolver {
    metaReader;
    /**
     * `ClassDeclaration`s that we are in the process of determining the provider status for.
     *
     * This is used to detect cycles in the import graph and avoid getting stuck in them.
     */
    calculating = new Set();
    constructor(metaReader) {
        this.metaReader = metaReader;
    }
    /**
     * Determines whether `ref` may or may not export providers to NgModules which import it.
     *
     * NgModules export providers if any are declared, and standalone components export providers from
     * their `imports` array (if any).
     *
     * If `true`, then `ref` should be assumed to export providers. In practice, this could mean
     * either that `ref` is a local type that we _know_ exports providers, or it's imported from a
     * .d.ts library and is declared in a way where the compiler cannot prove that it doesn't.
     *
     * If `false`, then `ref` is guaranteed not to export providers.
     *
     * @param `ref` the class for which the provider status should be determined
     * @param `dependencyCallback` a callback that, if provided, will be called for every type
     *     which is used in the determination of provider status for `ref`
     * @returns `true` if `ref` should be assumed to export providers, or `false` if the compiler can
     *     prove that it does not
     */
    mayExportProviders(ref, dependencyCallback) {
        if (this.calculating.has(ref.node)) {
            // For cycles, we treat the cyclic edge as not having providers.
            return false;
        }
        this.calculating.add(ref.node);
        if (dependencyCallback !== undefined) {
            dependencyCallback(ref);
        }
        try {
            const dirMeta = this.metaReader.getDirectiveMetadata(ref);
            if (dirMeta !== null) {
                if (!dirMeta.isComponent || !dirMeta.isStandalone) {
                    return false;
                }
                if (dirMeta.assumedToExportProviders) {
                    return true;
                }
                // If one of the imports contains providers, then so does this component.
                return (dirMeta.imports ?? []).some((importRef) => this.mayExportProviders(importRef, dependencyCallback));
            }
            const pipeMeta = this.metaReader.getPipeMetadata(ref);
            if (pipeMeta !== null) {
                return false;
            }
            const ngModuleMeta = this.metaReader.getNgModuleMetadata(ref);
            if (ngModuleMeta !== null) {
                if (ngModuleMeta.mayDeclareProviders) {
                    return true;
                }
                // If one of the NgModule's imports may contain providers, then so does this NgModule.
                return ngModuleMeta.imports.some((importRef) => this.mayExportProviders(importRef, dependencyCallback));
            }
            return false;
        }
        finally {
            this.calculating.delete(ref.node);
        }
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
const EMPTY_ARRAY$1 = [];
/** Resolves the host directives of a directive to a flat array of matches. */
class HostDirectivesResolver {
    metaReader;
    cache = new Map();
    constructor(metaReader) {
        this.metaReader = metaReader;
    }
    /** Resolves all of the host directives that apply to a directive. */
    resolve(metadata) {
        if (this.cache.has(metadata.ref.node)) {
            return this.cache.get(metadata.ref.node);
        }
        const results = metadata.hostDirectives && metadata.hostDirectives.length > 0
            ? this.walkHostDirectives(metadata.hostDirectives, [])
            : EMPTY_ARRAY$1;
        this.cache.set(metadata.ref.node, results);
        return results;
    }
    /**
     * Traverses all of the host directive chains and produces a flat array of
     * directive metadata representing the host directives that apply to the host.
     */
    walkHostDirectives(directives, results) {
        for (const current of directives) {
            if (!checker.isHostDirectiveMetaForGlobalMode(current)) {
                throw new Error('Impossible state: resolving code path in local compilation mode');
            }
            const hostMeta = checker.flattenInheritedDirectiveMetadata(this.metaReader, current.directive);
            // This case has been checked for already and produces a diagnostic
            if (hostMeta === null) {
                continue;
            }
            if (hostMeta.hostDirectives) {
                this.walkHostDirectives(hostMeta.hostDirectives, results);
            }
            results.push({
                ...hostMeta,
                matchSource: checker.MatchSource.HostDirective,
                inputs: checker.ClassPropertyMapping.fromMappedObject(this.filterMappings(hostMeta.inputs, current.inputs, resolveInput)),
                outputs: checker.ClassPropertyMapping.fromMappedObject(this.filterMappings(hostMeta.outputs, current.outputs, resolveOutput)),
            });
        }
        return results;
    }
    /**
     * Filters the class property mappings so that only the allowed ones are present.
     * @param source Property mappings that should be filtered.
     * @param allowedProperties Property mappings that are allowed in the final results.
     * @param valueResolver Function used to resolve the value that is assigned to the final mapping.
     */
    filterMappings(source, allowedProperties, valueResolver) {
        const result = {};
        if (allowedProperties !== null) {
            for (const publicName in allowedProperties) {
                if (allowedProperties.hasOwnProperty(publicName)) {
                    const bindings = source.getByBindingPropertyName(publicName);
                    if (bindings !== null) {
                        for (const binding of bindings) {
                            result[binding.classPropertyName] = valueResolver(allowedProperties[publicName], binding);
                        }
                    }
                }
            }
        }
        return result;
    }
}
function resolveInput(bindingName, binding) {
    return {
        bindingPropertyName: bindingName,
        classPropertyName: binding.classPropertyName,
        required: binding.required,
        transform: binding.transform,
        isSignal: binding.isSignal,
    };
}
function resolveOutput(bindingName) {
    return bindingName;
}

class PartialEvaluator {
    host;
    checker;
    dependencyTracker;
    constructor(host, checker, dependencyTracker) {
        this.host = host;
        this.checker = checker;
        this.dependencyTracker = dependencyTracker;
    }
    evaluate(expr, foreignFunctionResolver) {
        const interpreter = new checker.StaticInterpreter(this.host, this.checker, this.dependencyTracker);
        const sourceFile = expr.getSourceFile();
        return interpreter.visit(expr, {
            originatingFile: sourceFile,
            absoluteModuleName: null,
            resolutionContext: sourceFile.fileName,
            scope: new Map(),
            foreignFunctionResolver,
        });
    }
}

function aliasTransformFactory(exportStatements) {
    return () => {
        return (file) => {
            if (ts.isBundle(file) || !exportStatements.has(file.fileName)) {
                return file;
            }
            const statements = [...file.statements];
            exportStatements.get(file.fileName).forEach(([moduleName, symbolName], aliasName) => {
                const stmt = ts.factory.createExportDeclaration(
                /* modifiers */ undefined, 
                /* isTypeOnly */ false, 
                /* exportClause */ ts.factory.createNamedExports([
                    ts.factory.createExportSpecifier(false, symbolName, aliasName),
                ]), 
                /* moduleSpecifier */ ts.factory.createStringLiteral(moduleName));
                statements.push(stmt);
            });
            return ts.factory.updateSourceFile(file, statements);
        };
    };
}

/// <reference types="node" />
function mark() {
    return process.hrtime();
}
function timeSinceInMicros(mark) {
    const delta = process.hrtime(mark);
    return delta[0] * 1000000 + Math.floor(delta[1] / 1000);
}

/// <reference types="node" />
/**
 * A `PerfRecorder` that actively tracks performance statistics.
 */
class ActivePerfRecorder {
    zeroTime;
    counters;
    phaseTime;
    bytes;
    currentPhase = checker.PerfPhase.Unaccounted;
    currentPhaseEntered;
    /**
     * Creates an `ActivePerfRecorder` with its zero point set to the current time.
     */
    static zeroedToNow() {
        return new ActivePerfRecorder(mark());
    }
    constructor(zeroTime) {
        this.zeroTime = zeroTime;
        this.currentPhaseEntered = this.zeroTime;
        this.counters = Array(checker.PerfEvent.LAST).fill(0);
        this.phaseTime = Array(checker.PerfPhase.LAST).fill(0);
        this.bytes = Array(checker.PerfCheckpoint.LAST).fill(0);
        // Take an initial memory snapshot before any other compilation work begins.
        this.memory(checker.PerfCheckpoint.Initial);
    }
    reset() {
        this.counters = Array(checker.PerfEvent.LAST).fill(0);
        this.phaseTime = Array(checker.PerfPhase.LAST).fill(0);
        this.bytes = Array(checker.PerfCheckpoint.LAST).fill(0);
        this.zeroTime = mark();
        this.currentPhase = checker.PerfPhase.Unaccounted;
        this.currentPhaseEntered = this.zeroTime;
    }
    memory(after) {
        this.bytes[after] = process.memoryUsage().heapUsed;
    }
    phase(phase) {
        const previous = this.currentPhase;
        this.phaseTime[this.currentPhase] += timeSinceInMicros(this.currentPhaseEntered);
        this.currentPhase = phase;
        this.currentPhaseEntered = mark();
        return previous;
    }
    inPhase(phase, fn) {
        const previousPhase = this.phase(phase);
        try {
            return fn();
        }
        finally {
            this.phase(previousPhase);
        }
    }
    eventCount(counter, incrementBy = 1) {
        this.counters[counter] += incrementBy;
    }
    /**
     * Return the current performance metrics as a serializable object.
     */
    finalize() {
        // Track the last segment of time spent in `this.currentPhase` in the time array.
        this.   phase(checker.PerfPhase.Unaccounted);
        const results = {
            events: {},
            phases: {},
            memory: {},
        };
        for (let i = 0; i < this.phaseTime.length; i++) {
            if (this.phaseTime[i] > 0) {
                results.phases[checker.PerfPhase[i]] = this.phaseTime[i];
            }
        }
        for (let i = 0; i < this.phaseTime.length; i++) {
            if (this.counters[i] > 0) {
                results.events[checker.PerfEvent[i]] = this.counters[i];
            }
        }
        for (let i = 0; i < this.bytes.length; i++) {
            if (this.bytes[i] > 0) {
                results.memory[checker.PerfCheckpoint[i]] = this.bytes[i];
            }
        }
        return results;
    }
}
/**
 * A `PerfRecorder` that delegates to a target `PerfRecorder` which can be updated later.
 *
 * `DelegatingPerfRecorder` is useful when a compiler class that needs a `PerfRecorder` can outlive
 * the current compilation. This is true for most compiler classes as resource-only changes reuse
 * the same `NgCompiler` for a new compilation.
 */
class DelegatingPerfRecorder {
    target;
    constructor(target) {
        this.target = target;
    }
    eventCount(counter, incrementBy) {
        this.target.eventCount(counter, incrementBy);
    }
    phase(phase) {
        return this.target.phase(phase);
    }
    inPhase(phase, fn) {
        // Note: this doesn't delegate to `this.target.inPhase` but instead is implemented manually here
        // to avoid adding an additional frame of noise to the stack when debugging.
        const previousPhase = this.target.phase(phase);
        try {
            return fn();
        }
        finally {
            this.target.phase(previousPhase);
        }
    }
    memory(after) {
        this.target.memory(after);
    }
    reset() {
        this.target.reset();
    }
}

/**
 * The heart of Angular compilation.
 *
 * The `TraitCompiler` is responsible for processing all classes in the program. Any time a
 * `DecoratorHandler` matches a class, a "trait" is created to represent that Angular aspect of the
 * class (such as the class having a component definition).
 *
 * The `TraitCompiler` transitions each trait through the various phases of compilation, culminating
 * in the production of `CompileResult`s instructing the compiler to apply various mutations to the
 * class (like adding fields or type declarations).
 */
class TraitCompiler {
    handlers;
    reflector;
    perf;
    incrementalBuild;
    compileNonExportedClasses;
    compilationMode;
    dtsTransforms;
    semanticDepGraphUpdater;
    sourceFileTypeIdentifier;
    /**
     * Maps class declarations to their `ClassRecord`, which tracks the Ivy traits being applied to
     * those classes.
     */
    classes = new Map();
    /**
     * Maps source files to any class declaration(s) within them which have been discovered to contain
     * Ivy traits.
     */
    fileToClasses = new Map();
    /**
     * Tracks which source files have been analyzed but did not contain any traits. This set allows
     * the compiler to skip analyzing these files in an incremental rebuild.
     */
    filesWithoutTraits = new Set();
    reexportMap = new Map();
    handlersByName = new Map();
    constructor(handlers, reflector, perf, incrementalBuild, compileNonExportedClasses, compilationMode, dtsTransforms, semanticDepGraphUpdater, sourceFileTypeIdentifier) {
        this.handlers = handlers;
        this.reflector = reflector;
        this.perf = perf;
        this.incrementalBuild = incrementalBuild;
        this.compileNonExportedClasses = compileNonExportedClasses;
        this.compilationMode = compilationMode;
        this.dtsTransforms = dtsTransforms;
        this.semanticDepGraphUpdater = semanticDepGraphUpdater;
        this.sourceFileTypeIdentifier = sourceFileTypeIdentifier;
        for (const handler of handlers) {
            this.handlersByName.set(handler.name, handler);
        }
    }
    analyzeSync(sf) {
        this.analyze(sf, false);
    }
    analyzeAsync(sf) {
        return this.analyze(sf, true);
    }
    analyze(sf, preanalyze) {
        // We shouldn't analyze declaration, shim, or resource files.
        if (sf.isDeclarationFile ||
            this.sourceFileTypeIdentifier.isShim(sf) ||
            this.sourceFileTypeIdentifier.isResource(sf)) {
            return undefined;
        }
        // analyze() really wants to return `Promise<void>|void`, but TypeScript cannot narrow a return
        // type of 'void', so `undefined` is used instead.
        const promises = [];
        // Local compilation does not support incremental build.
        const priorWork = this.compilationMode !== checker.CompilationMode.LOCAL
            ? this.incrementalBuild.priorAnalysisFor(sf)
            : null;
        if (priorWork !== null) {
            this.perf.eventCount(checker.PerfEvent.SourceFileReuseAnalysis);
            if (priorWork.length > 0) {
                for (const priorRecord of priorWork) {
                    this.adopt(priorRecord);
                }
                this.perf.eventCount(checker.PerfEvent.TraitReuseAnalysis, priorWork.length);
            }
            else {
                this.filesWithoutTraits.add(sf);
            }
            // Skip the rest of analysis, as this file's prior traits are being reused.
            return;
        }
        const visit = (node) => {
            if (this.reflector.isClass(node)) {
                this.analyzeClass(node, preanalyze ? promises : null);
            }
            ts.forEachChild(node, visit);
        };
        visit(sf);
        if (!this.fileToClasses.has(sf)) {
            // If no traits were detected in the source file we record the source file itself to not have
            // any traits, such that analysis of the source file can be skipped during incremental
            // rebuilds.
            this.filesWithoutTraits.add(sf);
        }
        if (preanalyze && promises.length > 0) {
            return Promise.all(promises).then(() => undefined);
        }
        else {
            return undefined;
        }
    }
    recordFor(clazz) {
        if (this.classes.has(clazz)) {
            return this.classes.get(clazz);
        }
        else {
            return null;
        }
    }
    getAnalyzedRecords() {
        const result = new Map();
        for (const [sf, classes] of this.fileToClasses) {
            const records = [];
            for (const clazz of classes) {
                records.push(this.classes.get(clazz));
            }
            result.set(sf, records);
        }
        for (const sf of this.filesWithoutTraits) {
            result.set(sf, []);
        }
        return result;
    }
    /**
     * Import a `ClassRecord` from a previous compilation (only to be used in global compilation
     * modes)
     *
     * Traits from the `ClassRecord` have accurate metadata, but the `handler` is from the old program
     * and needs to be updated (matching is done by name). A new pending trait is created and then
     * transitioned to analyzed using the previous analysis. If the trait is in the errored state,
     * instead the errors are copied over.
     */
    adopt(priorRecord) {
        const record = {
            hasPrimaryHandler: priorRecord.hasPrimaryHandler,
            hasWeakHandlers: priorRecord.hasWeakHandlers,
            metaDiagnostics: priorRecord.metaDiagnostics,
            node: priorRecord.node,
            traits: [],
        };
        for (const priorTrait of priorRecord.traits) {
            const handler = this.handlersByName.get(priorTrait.handler.name);
            let trait = checker.Trait.pending(handler, priorTrait.detected);
            if (priorTrait.state === checker.TraitState.Analyzed || priorTrait.state === checker.TraitState.Resolved) {
                const symbol = this.makeSymbolForTrait(handler, record.node, priorTrait.analysis);
                trait = trait.toAnalyzed(priorTrait.analysis, priorTrait.analysisDiagnostics, symbol);
                if (trait.analysis !== null && trait.handler.register !== undefined) {
                    trait.handler.register(record.node, trait.analysis);
                }
            }
            else if (priorTrait.state === checker.TraitState.Skipped) {
                trait = trait.toSkipped();
            }
            record.traits.push(trait);
        }
        this.classes.set(record.node, record);
        const sf = record.node.getSourceFile();
        if (!this.fileToClasses.has(sf)) {
            this.fileToClasses.set(sf, new Set());
        }
        this.fileToClasses.get(sf).add(record.node);
    }
    scanClassForTraits(clazz) {
        if (!this.compileNonExportedClasses && !this.reflector.isStaticallyExported(clazz)) {
            return null;
        }
        const decorators = this.reflector.getDecoratorsOfDeclaration(clazz);
        return this.detectTraits(clazz, decorators);
    }
    detectTraits(clazz, decorators) {
        let record = this.recordFor(clazz);
        let foundTraits = [];
        // A set to track the non-Angular decorators in local compilation mode. An error will be issued
        // if non-Angular decorators is found in local compilation mode.
        const nonNgDecoratorsInLocalMode = this.compilationMode === checker.CompilationMode.LOCAL ? new Set(decorators) : null;
        for (const handler of this.handlers) {
            const result = handler.detect(clazz, decorators);
            if (result === undefined) {
                continue;
            }
            if (nonNgDecoratorsInLocalMode !== null && result.decorator !== null) {
                nonNgDecoratorsInLocalMode.delete(result.decorator);
            }
            const isPrimaryHandler = handler.precedence === checker.HandlerPrecedence.PRIMARY;
            const isWeakHandler = handler.precedence === checker.HandlerPrecedence.WEAK;
            const trait = checker.Trait.pending(handler, result);
            foundTraits.push(trait);
            if (record === null) {
                // This is the first handler to match this class. This path is a fast path through which
                // most classes will flow.
                record = {
                    node: clazz,
                    traits: [trait],
                    metaDiagnostics: null,
                    hasPrimaryHandler: isPrimaryHandler,
                    hasWeakHandlers: isWeakHandler,
                };
                this.classes.set(clazz, record);
                const sf = clazz.getSourceFile();
                if (!this.fileToClasses.has(sf)) {
                    this.fileToClasses.set(sf, new Set());
                }
                this.fileToClasses.get(sf).add(clazz);
            }
            else {
                // This is at least the second handler to match this class. This is a slower path that some
                // classes will go through, which validates that the set of decorators applied to the class
                // is valid.
                // Validate according to rules as follows:
                //
                // * WEAK handlers are removed if a non-WEAK handler matches.
                // * Only one PRIMARY handler can match at a time. Any other PRIMARY handler matching a
                //   class with an existing PRIMARY handler is an error.
                if (!isWeakHandler && record.hasWeakHandlers) {
                    // The current handler is not a WEAK handler, but the class has other WEAK handlers.
                    // Remove them.
                    record.traits = record.traits.filter((field) => field.handler.precedence !== checker.HandlerPrecedence.WEAK);
                    record.hasWeakHandlers = false;
                }
                else if (isWeakHandler && !record.hasWeakHandlers) {
                    // The current handler is a WEAK handler, but the class has non-WEAK handlers already.
                    // Drop the current one.
                    continue;
                }
                if (isPrimaryHandler && record.hasPrimaryHandler) {
                    // The class already has a PRIMARY handler, and another one just matched.
                    record.metaDiagnostics = [
                        {
                            category: ts.DiagnosticCategory.Error,
                            code: Number('-99' + checker.ErrorCode.DECORATOR_COLLISION),
                            file: checker.getSourceFile(clazz),
                            start: clazz.getStart(undefined, false),
                            length: clazz.getWidth(),
                            messageText: 'Two incompatible decorators on class',
                        },
                    ];
                    record.traits = foundTraits = [];
                    break;
                }
                // Otherwise, it's safe to accept the multiple decorators here. Update some of the metadata
                // regarding this class.
                record.traits.push(trait);
                record.hasPrimaryHandler = record.hasPrimaryHandler || isPrimaryHandler;
            }
        }
        if (nonNgDecoratorsInLocalMode !== null &&
            nonNgDecoratorsInLocalMode.size > 0 &&
            record !== null &&
            record.metaDiagnostics === null) {
            // Custom decorators found in local compilation mode! In this mode we don't support custom
            // decorators yet. But will eventually do (b/320536434). For now a temporary error is thrown.
            record.metaDiagnostics = [...nonNgDecoratorsInLocalMode].map((decorator) => ({
                category: ts.DiagnosticCategory.Error,
                code: Number('-99' + checker.ErrorCode.DECORATOR_UNEXPECTED),
                file: checker.getSourceFile(clazz),
                start: decorator.node.getStart(),
                length: decorator.node.getWidth(),
                messageText: 'In local compilation mode, Angular does not support custom decorators. Ensure all class decorators are from Angular.',
            }));
            record.traits = foundTraits = [];
        }
        return foundTraits.length > 0 ? foundTraits : null;
    }
    makeSymbolForTrait(handler, decl, analysis) {
        if (analysis === null) {
            return null;
        }
        const symbol = handler.symbol(decl, analysis);
        if (symbol !== null && this.semanticDepGraphUpdater !== null) {
            const isPrimary = handler.precedence === checker.HandlerPrecedence.PRIMARY;
            if (!isPrimary) {
                throw new Error(`AssertionError: ${handler.name} returned a symbol but is not a primary handler.`);
            }
            this.semanticDepGraphUpdater.registerSymbol(symbol);
        }
        return symbol;
    }
    analyzeClass(clazz, preanalyzeQueue) {
        const traits = this.scanClassForTraits(clazz);
        if (traits === null) {
            // There are no Ivy traits on the class, so it can safely be skipped.
            return;
        }
        for (const trait of traits) {
            const analyze = () => this.analyzeTrait(clazz, trait);
            let preanalysis = null;
            if (preanalyzeQueue !== null && trait.handler.preanalyze !== undefined) {
                // Attempt to run preanalysis. This could fail with a `FatalDiagnosticError`; catch it if it
                // does.
                try {
                    preanalysis = trait.handler.preanalyze(clazz, trait.detected.metadata) || null;
                }
                catch (err) {
                    if (err instanceof checker.FatalDiagnosticError) {
                        trait.toAnalyzed(null, [err.toDiagnostic()], null);
                        return;
                    }
                    else {
                        throw err;
                    }
                }
            }
            if (preanalysis !== null) {
                preanalyzeQueue.push(preanalysis.then(analyze));
            }
            else {
                analyze();
            }
        }
    }
    analyzeTrait(clazz, trait) {
        if (trait.state !== checker.TraitState.Pending) {
            throw new Error(`Attempt to analyze trait of ${clazz.name.text} in state ${checker.TraitState[trait.state]} (expected DETECTED)`);
        }
        this.perf.eventCount(checker.PerfEvent.TraitAnalyze);
        // Attempt analysis. This could fail with a `FatalDiagnosticError`; catch it if it does.
        let result;
        try {
            result = trait.handler.analyze(clazz, trait.detected.metadata);
        }
        catch (err) {
            if (err instanceof checker.FatalDiagnosticError) {
                trait.toAnalyzed(null, [err.toDiagnostic()], null);
                return;
            }
            else {
                throw err;
            }
        }
        const symbol = this.makeSymbolForTrait(trait.handler, clazz, result.analysis ?? null);
        if (result.analysis !== undefined && trait.handler.register !== undefined) {
            trait.handler.register(clazz, result.analysis);
        }
        trait = trait.toAnalyzed(result.analysis ?? null, result.diagnostics ?? null, symbol);
    }
    resolve() {
        const classes = this.classes.keys();
        for (const clazz of classes) {
            const record = this.classes.get(clazz);
            for (let trait of record.traits) {
                const handler = trait.handler;
                switch (trait.state) {
                    case checker.TraitState.Skipped:
                        continue;
                    case checker.TraitState.Pending:
                        throw new Error(`Resolving a trait that hasn't been analyzed: ${clazz.name.text} / ${trait.handler.name}`);
                    case checker.TraitState.Resolved:
                        throw new Error(`Resolving an already resolved trait`);
                }
                if (trait.analysis === null) {
                    // No analysis results, cannot further process this trait.
                    continue;
                }
                if (handler.resolve === undefined) {
                    // No resolution of this trait needed - it's considered successful by default.
                    trait = trait.toResolved(null, null);
                    continue;
                }
                let result;
                try {
                    result = handler.resolve(clazz, trait.analysis, trait.symbol);
                }
                catch (err) {
                    if (err instanceof checker.FatalDiagnosticError) {
                        trait = trait.toResolved(null, [err.toDiagnostic()]);
                        continue;
                    }
                    else {
                        throw err;
                    }
                }
                trait = trait.toResolved(result.data ?? null, result.diagnostics ?? null);
                if (result.reexports !== undefined) {
                    const fileName = clazz.getSourceFile().fileName;
                    if (!this.reexportMap.has(fileName)) {
                        this.reexportMap.set(fileName, new Map());
                    }
                    const fileReexports = this.reexportMap.get(fileName);
                    for (const reexport of result.reexports) {
                        fileReexports.set(reexport.asAlias, [reexport.fromModule, reexport.symbolName]);
                    }
                }
            }
        }
    }
    /**
     * Generate type-checking code into the `TypeCheckContext` for any components within the given
     * `ts.SourceFile`.
     */
    typeCheck(sf, ctx) {
        if (!this.fileToClasses.has(sf) || this.compilationMode === checker.CompilationMode.LOCAL) {
            return;
        }
        for (const clazz of this.fileToClasses.get(sf)) {
            const record = this.classes.get(clazz);
            for (const trait of record.traits) {
                if (trait.state !== checker.TraitState.Resolved) {
                    continue;
                }
                else if (trait.handler.typeCheck === undefined) {
                    continue;
                }
                if (trait.resolution !== null) {
                    trait.handler.typeCheck(ctx, clazz, trait.analysis, trait.resolution);
                }
            }
        }
    }
    runAdditionalChecks(sf, check) {
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            return [];
        }
        const classes = this.fileToClasses.get(sf);
        if (classes === undefined) {
            return [];
        }
        const diagnostics = [];
        for (const clazz of classes) {
            if (!checker.isNamedClassDeclaration(clazz)) {
                continue;
            }
            const record = this.classes.get(clazz);
            for (const trait of record.traits) {
                const result = check(clazz, trait.handler);
                if (result !== null) {
                    diagnostics.push(...result);
                }
            }
        }
        return diagnostics;
    }
    index(ctx) {
        for (const clazz of this.classes.keys()) {
            const record = this.classes.get(clazz);
            for (const trait of record.traits) {
                if (trait.state !== checker.TraitState.Resolved) {
                    // Skip traits that haven't been resolved successfully.
                    continue;
                }
                else if (trait.handler.index === undefined) {
                    // Skip traits that don't affect indexing.
                    continue;
                }
                if (trait.resolution !== null) {
                    trait.handler.index(ctx, clazz, trait.analysis, trait.resolution);
                }
            }
        }
    }
    xi18n(bundle) {
        for (const clazz of this.classes.keys()) {
            const record = this.classes.get(clazz);
            for (const trait of record.traits) {
                if (trait.state !== checker.TraitState.Analyzed && trait.state !== checker.TraitState.Resolved) {
                    // Skip traits that haven't been analyzed successfully.
                    continue;
                }
                else if (trait.handler.xi18n === undefined) {
                    // Skip traits that don't support xi18n.
                    continue;
                }
                if (trait.analysis !== null) {
                    trait.handler.xi18n(bundle, clazz, trait.analysis);
                }
            }
        }
    }
    updateResources(clazz) {
        // Local compilation does not support incremental
        if (this.compilationMode === checker.CompilationMode.LOCAL ||
            !this.reflector.isClass(clazz) ||
            !this.classes.has(clazz)) {
            return;
        }
        const record = this.classes.get(clazz);
        for (const trait of record.traits) {
            if (trait.state !== checker.TraitState.Resolved || trait.handler.updateResources === undefined) {
                continue;
            }
            trait.handler.updateResources(clazz, trait.analysis, trait.resolution);
        }
    }
    compile(clazz, constantPool) {
        const original = ts.getOriginalNode(clazz);
        if (!this.reflector.isClass(clazz) ||
            !this.reflector.isClass(original) ||
            !this.classes.has(original)) {
            return null;
        }
        const record = this.classes.get(original);
        let res = [];
        for (const trait of record.traits) {
            let compileRes;
            if (trait.state !== checker.TraitState.Resolved ||
                containsErrors(trait.analysisDiagnostics) ||
                containsErrors(trait.resolveDiagnostics)) {
                // Cannot compile a trait that is not resolved, or had any errors in its declaration.
                continue;
            }
            if (this.compilationMode === checker.CompilationMode.LOCAL) {
                // `trait.analysis` is non-null asserted here because TypeScript does not recognize that
                // `Readonly<unknown>` is nullable (as `unknown` itself is nullable) due to the way that
                // `Readonly` works.
                compileRes = trait.handler.compileLocal(clazz, trait.analysis, trait.resolution, constantPool);
            }
            else {
                // `trait.resolution` is non-null asserted below because TypeScript does not recognize that
                // `Readonly<unknown>` is nullable (as `unknown` itself is nullable) due to the way that
                // `Readonly` works.
                if (this.compilationMode === checker.CompilationMode.PARTIAL &&
                    trait.handler.compilePartial !== undefined) {
                    compileRes = trait.handler.compilePartial(clazz, trait.analysis, trait.resolution);
                }
                else {
                    compileRes = trait.handler.compileFull(clazz, trait.analysis, trait.resolution, constantPool);
                }
            }
            const compileMatchRes = compileRes;
            if (Array.isArray(compileMatchRes)) {
                for (const result of compileMatchRes) {
                    if (!res.some((r) => r.name === result.name)) {
                        res.push(result);
                    }
                }
            }
            else if (!res.some((result) => result.name === compileMatchRes.name)) {
                res.push(compileMatchRes);
            }
        }
        // Look up the .d.ts transformer for the input file and record that at least one field was
        // generated, which will allow the .d.ts to be transformed later.
        this.dtsTransforms
            .getIvyDeclarationTransform(original.getSourceFile())
            .addFields(original, res);
        // Return the instruction to the transformer so the fields will be added.
        return res.length > 0 ? res : null;
    }
    compileHmrUpdateCallback(clazz) {
        const original = ts.getOriginalNode(clazz);
        if (!this.reflector.isClass(clazz) ||
            !this.reflector.isClass(original) ||
            !this.classes.has(original)) {
            return null;
        }
        const record = this.classes.get(original);
        for (const trait of record.traits) {
            // Cannot compile a trait that is not resolved, or had any errors in its declaration.
            if (trait.state === checker.TraitState.Resolved &&
                trait.handler.compileHmrUpdateDeclaration !== undefined &&
                !containsErrors(trait.analysisDiagnostics) &&
                !containsErrors(trait.resolveDiagnostics)) {
                return trait.handler.compileHmrUpdateDeclaration(clazz, trait.analysis, trait.resolution);
            }
        }
        return null;
    }
    decoratorsFor(node) {
        const original = ts.getOriginalNode(node);
        if (!this.reflector.isClass(original) || !this.classes.has(original)) {
            return [];
        }
        const record = this.classes.get(original);
        const decorators = [];
        for (const trait of record.traits) {
            // In global compilation mode skip the non-resolved traits.
            if (this.compilationMode !== checker.CompilationMode.LOCAL && trait.state !== checker.TraitState.Resolved) {
                continue;
            }
            if (trait.detected.trigger !== null && ts.isDecorator(trait.detected.trigger)) {
                decorators.push(trait.detected.trigger);
            }
        }
        return decorators;
    }
    get diagnostics() {
        const diagnostics = [];
        for (const clazz of this.classes.keys()) {
            const record = this.classes.get(clazz);
            if (record.metaDiagnostics !== null) {
                diagnostics.push(...record.metaDiagnostics);
            }
            for (const trait of record.traits) {
                if ((trait.state === checker.TraitState.Analyzed || trait.state === checker.TraitState.Resolved) &&
                    trait.analysisDiagnostics !== null) {
                    diagnostics.push(...trait.analysisDiagnostics);
                }
                if (trait.state === checker.TraitState.Resolved) {
                    diagnostics.push(...(trait.resolveDiagnostics ?? []));
                }
            }
        }
        return diagnostics;
    }
    get exportStatements() {
        return this.reexportMap;
    }
}
function containsErrors(diagnostics) {
    return (diagnostics !== null &&
        diagnostics.some((diag) => diag.category === ts.DiagnosticCategory.Error));
}

/**
 * Keeps track of `DtsTransform`s per source file, so that it is known which source files need to
 * have their declaration file transformed.
 */
class DtsTransformRegistry {
    ivyDeclarationTransforms = new Map();
    getIvyDeclarationTransform(sf) {
        if (!this.ivyDeclarationTransforms.has(sf)) {
            this.ivyDeclarationTransforms.set(sf, new IvyDeclarationDtsTransform());
        }
        return this.ivyDeclarationTransforms.get(sf);
    }
    /**
     * Gets the dts transforms to be applied for the given source file, or `null` if no transform is
     * necessary.
     */
    getAllTransforms(sf) {
        // No need to transform if it's not a declarations file, or if no changes have been requested
        // to the input file. Due to the way TypeScript afterDeclarations transformers work, the
        // `ts.SourceFile` path is the same as the original .ts. The only way we know it's actually a
        // declaration file is via the `isDeclarationFile` property.
        if (!sf.isDeclarationFile) {
            return null;
        }
        const originalSf = ts.getOriginalNode(sf);
        let transforms = null;
        if (this.ivyDeclarationTransforms.has(originalSf)) {
            transforms = [];
            transforms.push(this.ivyDeclarationTransforms.get(originalSf));
        }
        return transforms;
    }
}
function declarationTransformFactory(transformRegistry, reflector, refEmitter, importRewriter) {
    return (context) => {
        const transformer = new DtsTransformer(context, reflector, refEmitter, importRewriter);
        return (fileOrBundle) => {
            if (ts.isBundle(fileOrBundle)) {
                // Only attempt to transform source files.
                return fileOrBundle;
            }
            const transforms = transformRegistry.getAllTransforms(fileOrBundle);
            if (transforms === null) {
                return fileOrBundle;
            }
            return transformer.transform(fileOrBundle, transforms);
        };
    };
}
/**
 * Processes .d.ts file text and adds static field declarations, with types.
 */
class DtsTransformer {
    ctx;
    reflector;
    refEmitter;
    importRewriter;
    constructor(ctx, reflector, refEmitter, importRewriter) {
        this.ctx = ctx;
        this.reflector = reflector;
        this.refEmitter = refEmitter;
        this.importRewriter = importRewriter;
    }
    /**
     * Transform the declaration file and add any declarations which were recorded.
     */
    transform(sf, transforms) {
        const imports = new checker.ImportManager({
            ...checker.presetImportManagerForceNamespaceImports,
            rewriter: this.importRewriter,
        });
        const visitor = (node) => {
            if (ts.isClassDeclaration(node)) {
                return this.transformClassDeclaration(node, transforms, imports);
            }
            else if (ts.isFunctionDeclaration(node)) {
                return this.transformFunctionDeclaration(node, transforms, imports);
            }
            else {
                // Otherwise return node as is.
                return ts.visitEachChild(node, visitor, this.ctx);
            }
        };
        // Recursively scan through the AST and process all nodes as desired.
        sf = ts.visitNode(sf, visitor, ts.isSourceFile) || sf;
        // Update/insert needed imports.
        return imports.transformTsFile(this.ctx, sf);
    }
    transformClassDeclaration(clazz, transforms, imports) {
        let elements = clazz.members;
        let elementsChanged = false;
        for (const transform of transforms) {
            if (transform.transformClassElement !== undefined) {
                for (let i = 0; i < elements.length; i++) {
                    const res = transform.transformClassElement(elements[i], imports);
                    if (res !== elements[i]) {
                        if (!elementsChanged) {
                            elements = [...elements];
                            elementsChanged = true;
                        }
                        elements[i] = res;
                    }
                }
            }
        }
        let newClazz = clazz;
        for (const transform of transforms) {
            if (transform.transformClass !== undefined) {
                // If no DtsTransform has changed the class yet, then the (possibly mutated) elements have
                // not yet been incorporated. Otherwise, `newClazz.members` holds the latest class members.
                const inputMembers = clazz === newClazz ? elements : newClazz.members;
                newClazz = transform.transformClass(newClazz, inputMembers, this.reflector, this.refEmitter, imports);
            }
        }
        // If some elements have been transformed but the class itself has not been transformed, create
        // an updated class declaration with the updated elements.
        if (elementsChanged && clazz === newClazz) {
            newClazz = ts.factory.updateClassDeclaration(
            /* node */ clazz, 
            /* modifiers */ clazz.modifiers, 
            /* name */ clazz.name, 
            /* typeParameters */ clazz.typeParameters, 
            /* heritageClauses */ clazz.heritageClauses, 
            /* members */ elements);
        }
        return newClazz;
    }
    transformFunctionDeclaration(declaration, transforms, imports) {
        let newDecl = declaration;
        for (const transform of transforms) {
            if (transform.transformFunctionDeclaration !== undefined) {
                newDecl = transform.transformFunctionDeclaration(newDecl, imports);
            }
        }
        return newDecl;
    }
}
class IvyDeclarationDtsTransform {
    declarationFields = new Map();
    addFields(decl, fields) {
        this.declarationFields.set(decl, fields);
    }
    transformClass(clazz, members, reflector, refEmitter, imports) {
        const original = ts.getOriginalNode(clazz);
        if (!this.declarationFields.has(original)) {
            return clazz;
        }
        const fields = this.declarationFields.get(original);
        const newMembers = fields.map((decl) => {
            const modifiers = [ts.factory.createModifier(ts.SyntaxKind.StaticKeyword)];
            const typeRef = checker.translateType(decl.type, original.getSourceFile(), reflector, refEmitter, imports);
            markForEmitAsSingleLine(typeRef);
            return ts.factory.createPropertyDeclaration(
            /* modifiers */ modifiers, 
            /* name */ decl.name, 
            /* questionOrExclamationToken */ undefined, 
            /* type */ typeRef, 
            /* initializer */ undefined);
        });
        return ts.factory.updateClassDeclaration(
        /* node */ clazz, 
        /* modifiers */ clazz.modifiers, 
        /* name */ clazz.name, 
        /* typeParameters */ clazz.typeParameters, 
        /* heritageClauses */ clazz.heritageClauses, 
        /* members */ [...members, ...newMembers]);
    }
}
function markForEmitAsSingleLine(node) {
    ts.setEmitFlags(node, ts.EmitFlags.SingleLine);
    ts.forEachChild(node, markForEmitAsSingleLine);
}

/**
 * Visit a node with the given visitor and return a transformed copy.
 */
function visit(node, visitor, context) {
    return visitor._visit(node, context);
}
/**
 * Abstract base class for visitors, which processes certain nodes specially to allow insertion
 * of other nodes before them.
 */
class Visitor {
    /**
     * Maps statements to an array of statements that should be inserted before them.
     */
    _before = new Map();
    /**
     * Maps statements to an array of statements that should be inserted after them.
     */
    _after = new Map();
    _visitListEntryNode(node, visitor) {
        const result = visitor(node);
        if (result.before !== undefined) {
            // Record that some nodes should be inserted before the given declaration. The declaration's
            // parent's _visit call is responsible for performing this insertion.
            this._before.set(result.node, result.before);
        }
        if (result.after !== undefined) {
            // Same with nodes that should be inserted after.
            this._after.set(result.node, result.after);
        }
        return result.node;
    }
    /**
     * Visit types of nodes which don't have their own explicit visitor.
     */
    visitOtherNode(node) {
        return node;
    }
    /**
     * @internal
     */
    _visit(node, context) {
        // First, visit the node. visitedNode starts off as `null` but should be set after visiting
        // is completed.
        let visitedNode = null;
        node = ts.visitEachChild(node, (child) => child && this._visit(child, context), context);
        if (ts.isClassDeclaration(node)) {
            visitedNode = this._visitListEntryNode(node, (node) => this.visitClassDeclaration(node));
        }
        else {
            visitedNode = this.visitOtherNode(node);
        }
        // If the visited node has a `statements` array then process them, maybe replacing the visited
        // node and adding additional statements.
        if (visitedNode && (ts.isBlock(visitedNode) || ts.isSourceFile(visitedNode))) {
            visitedNode = this._maybeProcessStatements(visitedNode);
        }
        return visitedNode;
    }
    _maybeProcessStatements(node) {
        // Shortcut - if every statement doesn't require nodes to be prepended or appended,
        // this is a no-op.
        if (node.statements.every((stmt) => !this._before.has(stmt) && !this._after.has(stmt))) {
            return node;
        }
        // Build a new list of statements and patch it onto the clone.
        const newStatements = [];
        node.statements.forEach((stmt) => {
            if (this._before.has(stmt)) {
                newStatements.push(...this._before.get(stmt));
                this._before.delete(stmt);
            }
            newStatements.push(stmt);
            if (this._after.has(stmt)) {
                newStatements.push(...this._after.get(stmt));
                this._after.delete(stmt);
            }
        });
        const statementsArray = ts.factory.createNodeArray(newStatements, node.statements.hasTrailingComma);
        if (ts.isBlock(node)) {
            return ts.factory.updateBlock(node, statementsArray);
        }
        else {
            return ts.factory.updateSourceFile(node, statementsArray, node.isDeclarationFile, node.referencedFiles, node.typeReferenceDirectives, node.hasNoDefaultLib, node.libReferenceDirectives);
        }
    }
}

const NO_DECORATORS = new Set();
const CLOSURE_FILE_OVERVIEW_REGEXP = /\s+@fileoverview\s+/i;
function ivyTransformFactory(compilation, reflector, importRewriter, defaultImportTracker, localCompilationExtraImportsTracker, perf, isCore, isClosureCompilerEnabled) {
    const recordWrappedNode = createRecorderFn(defaultImportTracker);
    return (context) => {
        return (file) => {
            return perf.inPhase(checker.PerfPhase.Compile, () => transformIvySourceFile(compilation, context, reflector, importRewriter, localCompilationExtraImportsTracker, file, isCore, isClosureCompilerEnabled, recordWrappedNode));
        };
    };
}
/**
 * Visits all classes, performs Ivy compilation where Angular decorators are present and collects
 * result in a Map that associates a ts.ClassDeclaration with Ivy compilation results. This visitor
 * does NOT perform any TS transformations.
 */
class IvyCompilationVisitor extends Visitor {
    compilation;
    constantPool;
    classCompilationMap = new Map();
    deferrableImports = new Set();
    constructor(compilation, constantPool) {
        super();
        this.compilation = compilation;
        this.constantPool = constantPool;
    }
    visitClassDeclaration(node) {
        // Determine if this class has an Ivy field that needs to be added, and compile the field
        // to an expression if so.
        const result = this.compilation.compile(node, this.constantPool);
        if (result !== null) {
            this.classCompilationMap.set(node, result);
            // Collect all deferrable imports declarations into a single set,
            // so that we can pass it to the transform visitor that will drop
            // corresponding regular import declarations.
            for (const classResult of result) {
                if (classResult.deferrableImports !== null && classResult.deferrableImports.size > 0) {
                    classResult.deferrableImports.forEach((importDecl) => this.deferrableImports.add(importDecl));
                }
            }
        }
        return { node };
    }
}
/**
 * Visits all classes and performs transformation of corresponding TS nodes based on the Ivy
 * compilation results (provided as an argument).
 */
class IvyTransformationVisitor extends Visitor {
    compilation;
    classCompilationMap;
    reflector;
    importManager;
    recordWrappedNodeExpr;
    isClosureCompilerEnabled;
    isCore;
    deferrableImports;
    constructor(compilation, classCompilationMap, reflector, importManager, recordWrappedNodeExpr, isClosureCompilerEnabled, isCore, deferrableImports) {
        super();
        this.compilation = compilation;
        this.classCompilationMap = classCompilationMap;
        this.reflector = reflector;
        this.importManager = importManager;
        this.recordWrappedNodeExpr = recordWrappedNodeExpr;
        this.isClosureCompilerEnabled = isClosureCompilerEnabled;
        this.isCore = isCore;
        this.deferrableImports = deferrableImports;
    }
    visitClassDeclaration(node) {
        // If this class is not registered in the map, it means that it doesn't have Angular decorators,
        // thus no further processing is required.
        if (!this.classCompilationMap.has(node)) {
            return { node };
        }
        const translateOptions = {
            recordWrappedNode: this.recordWrappedNodeExpr,
            annotateForClosureCompiler: this.isClosureCompilerEnabled,
        };
        // There is at least one field to add.
        const statements = [];
        const members = [...node.members];
        // Note: Class may be already transformed by e.g. Tsickle and
        // not have a direct reference to the source file.
        const sourceFile = ts.getOriginalNode(node).getSourceFile();
        for (const field of this.classCompilationMap.get(node)) {
            // Type-only member.
            if (field.initializer === null) {
                continue;
            }
            // Translate the initializer for the field into TS nodes.
            const exprNode = checker.translateExpression(sourceFile, field.initializer, this.importManager, translateOptions);
            // Create a static property declaration for the new field.
            const property = ts.factory.createPropertyDeclaration([ts.factory.createToken(ts.SyntaxKind.StaticKeyword)], field.name, undefined, undefined, exprNode);
            if (this.isClosureCompilerEnabled) {
                // Closure compiler transforms the form `Service.ɵprov = X` into `Service$ɵprov = X`. To
                // prevent this transformation, such assignments need to be annotated with @nocollapse.
                // Note that tsickle is typically responsible for adding such annotations, however it
                // doesn't yet handle synthetic fields added during other transformations.
                ts.addSyntheticLeadingComment(property, ts.SyntaxKind.MultiLineCommentTrivia, '* @nocollapse ', 
                /* hasTrailingNewLine */ false);
            }
            field.statements
                .map((stmt) => checker.translateStatement(sourceFile, stmt, this.importManager, translateOptions))
                .forEach((stmt) => statements.push(stmt));
            members.push(property);
        }
        const filteredDecorators = 
        // Remove the decorator which triggered this compilation, leaving the others alone.
        maybeFilterDecorator(ts.getDecorators(node), this.compilation.decoratorsFor(node));
        const nodeModifiers = ts.getModifiers(node);
        let updatedModifiers;
        if (filteredDecorators?.length || nodeModifiers?.length) {
            updatedModifiers = [...(filteredDecorators || []), ...(nodeModifiers || [])];
        }
        // Replace the class declaration with an updated version.
        node = ts.factory.updateClassDeclaration(node, updatedModifiers, node.name, node.typeParameters, node.heritageClauses || [], 
        // Map over the class members and remove any Angular decorators from them.
        members.map((member) => this._stripAngularDecorators(member)));
        return { node, after: statements };
    }
    visitOtherNode(node) {
        if (ts.isImportDeclaration(node) && this.deferrableImports.has(node)) {
            // Return `null` as an indication that this node should not be present
            // in the final AST. Symbols from this import would be imported via
            // dynamic imports.
            return null;
        }
        return node;
    }
    /**
     * Return all decorators on a `Declaration` which are from @angular/core, or an empty set if none
     * are.
     */
    _angularCoreDecorators(decl) {
        const decorators = this.reflector.getDecoratorsOfDeclaration(decl);
        if (decorators === null) {
            return NO_DECORATORS;
        }
        const coreDecorators = decorators
            .filter((dec) => this.isCore || isFromAngularCore(dec))
            .map((dec) => dec.node);
        if (coreDecorators.length > 0) {
            return new Set(coreDecorators);
        }
        else {
            return NO_DECORATORS;
        }
    }
    _nonCoreDecoratorsOnly(node) {
        const decorators = ts.getDecorators(node);
        // Shortcut if the node has no decorators.
        if (decorators === undefined) {
            return undefined;
        }
        // Build a Set of the decorators on this node from @angular/core.
        const coreDecorators = this._angularCoreDecorators(node);
        if (coreDecorators.size === decorators.length) {
            // If all decorators are to be removed, return `undefined`.
            return undefined;
        }
        else if (coreDecorators.size === 0) {
            // If no decorators need to be removed, return the original decorators array.
            return nodeArrayFromDecoratorsArray(decorators);
        }
        // Filter out the core decorators.
        const filtered = decorators.filter((dec) => !coreDecorators.has(dec));
        // If no decorators survive, return `undefined`. This can only happen if a core decorator is
        // repeated on the node.
        if (filtered.length === 0) {
            return undefined;
        }
        // Create a new `NodeArray` with the filtered decorators that sourcemaps back to the original.
        return nodeArrayFromDecoratorsArray(filtered);
    }
    /**
     * Remove Angular decorators from a `ts.Node` in a shallow manner.
     *
     * This will remove decorators from class elements (getters, setters, properties, methods) as well
     * as parameters of constructors.
     */
    _stripAngularDecorators(node) {
        const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;
        const nonCoreDecorators = ts.canHaveDecorators(node)
            ? this._nonCoreDecoratorsOnly(node)
            : undefined;
        const combinedModifiers = [...(nonCoreDecorators || []), ...(modifiers || [])];
        if (ts.isParameter(node)) {
            // Strip decorators from parameters (probably of the constructor).
            node = ts.factory.updateParameterDeclaration(node, combinedModifiers, node.dotDotDotToken, node.name, node.questionToken, node.type, node.initializer);
        }
        else if (ts.isMethodDeclaration(node)) {
            // Strip decorators of methods.
            node = ts.factory.updateMethodDeclaration(node, combinedModifiers, node.asteriskToken, node.name, node.questionToken, node.typeParameters, node.parameters, node.type, node.body);
        }
        else if (ts.isPropertyDeclaration(node)) {
            // Strip decorators of properties.
            node = ts.factory.updatePropertyDeclaration(node, combinedModifiers, node.name, node.questionToken, node.type, node.initializer);
        }
        else if (ts.isGetAccessor(node)) {
            // Strip decorators of getters.
            node = ts.factory.updateGetAccessorDeclaration(node, combinedModifiers, node.name, node.parameters, node.type, node.body);
        }
        else if (ts.isSetAccessor(node)) {
            // Strip decorators of setters.
            node = ts.factory.updateSetAccessorDeclaration(node, combinedModifiers, node.name, node.parameters, node.body);
        }
        else if (ts.isConstructorDeclaration(node)) {
            // For constructors, strip decorators of the parameters.
            const parameters = node.parameters.map((param) => this._stripAngularDecorators(param));
            node = ts.factory.updateConstructorDeclaration(node, modifiers, parameters, node.body);
        }
        return node;
    }
}
/**
 * A transformer which operates on ts.SourceFiles and applies changes from an `IvyCompilation`.
 */
function transformIvySourceFile(compilation, context, reflector, importRewriter, localCompilationExtraImportsTracker, file, isCore, isClosureCompilerEnabled, recordWrappedNode) {
    const constantPool = new checker.ConstantPool(isClosureCompilerEnabled);
    const importManager = new checker.ImportManager({
        ...checker.presetImportManagerForceNamespaceImports,
        rewriter: importRewriter,
    });
    // The transformation process consists of 2 steps:
    //
    //  1. Visit all classes, perform compilation and collect the results.
    //  2. Perform actual transformation of required TS nodes using compilation results from the first
    //     step.
    //
    // This is needed to have all `o.Expression`s generated before any TS transforms happen. This
    // allows `ConstantPool` to properly identify expressions that can be shared across multiple
    // components declared in the same file.
    // Step 1. Go though all classes in AST, perform compilation and collect the results.
    const compilationVisitor = new IvyCompilationVisitor(compilation, constantPool);
    visit(file, compilationVisitor, context);
    // Step 2. Scan through the AST again and perform transformations based on Ivy compilation
    // results obtained at Step 1.
    const transformationVisitor = new IvyTransformationVisitor(compilation, compilationVisitor.classCompilationMap, reflector, importManager, recordWrappedNode, isClosureCompilerEnabled, isCore, compilationVisitor.deferrableImports);
    let sf = visit(file, transformationVisitor, context);
    // Generate the constant statements first, as they may involve adding additional imports
    // to the ImportManager.
    const downlevelTranslatedCode = getLocalizeCompileTarget(context) < ts.ScriptTarget.ES2015;
    const constants = constantPool.statements.map((stmt) => checker.translateStatement(file, stmt, importManager, {
        recordWrappedNode,
        downlevelTaggedTemplates: downlevelTranslatedCode,
        downlevelVariableDeclarations: downlevelTranslatedCode,
        annotateForClosureCompiler: isClosureCompilerEnabled,
    }));
    // Preserve @fileoverview comments required by Closure, since the location might change as a
    // result of adding extra imports and constant pool statements.
    const fileOverviewMeta = isClosureCompilerEnabled ? getFileOverviewComment(sf.statements) : null;
    // Add extra imports.
    if (localCompilationExtraImportsTracker !== null) {
        for (const moduleName of localCompilationExtraImportsTracker.getImportsForFile(sf)) {
            importManager.addSideEffectImport(sf, moduleName);
        }
    }
    // Add new imports for this file.
    sf = importManager.transformTsFile(context, sf, constants);
    if (fileOverviewMeta !== null) {
        sf = insertFileOverviewComment(sf, fileOverviewMeta);
    }
    return sf;
}
/**
 * Compute the correct target output for `$localize` messages generated by Angular
 *
 * In some versions of TypeScript, the transformation of synthetic `$localize` tagged template
 * literals is broken. See https://github.com/microsoft/TypeScript/issues/38485
 *
 * Here we compute what the expected final output target of the compilation will
 * be so that we can generate ES5 compliant `$localize` calls instead of relying upon TS to do the
 * downleveling for us.
 */
function getLocalizeCompileTarget(context) {
    const target = context.getCompilerOptions().target || ts.ScriptTarget.ES2015;
    return target !== ts.ScriptTarget.JSON ? target : ts.ScriptTarget.ES2015;
}
function getFileOverviewComment(statements) {
    if (statements.length > 0) {
        const host = statements[0];
        let trailing = false;
        let comments = ts.getSyntheticLeadingComments(host);
        // If @fileoverview tag is not found in source file, tsickle produces fake node with trailing
        // comment and inject it at the very beginning of the generated file. So we need to check for
        // leading as well as trailing comments.
        if (!comments || comments.length === 0) {
            trailing = true;
            comments = ts.getSyntheticTrailingComments(host);
        }
        if (comments && comments.length > 0 && CLOSURE_FILE_OVERVIEW_REGEXP.test(comments[0].text)) {
            return { comments, host, trailing };
        }
    }
    return null;
}
function insertFileOverviewComment(sf, fileoverview) {
    const { comments, host, trailing } = fileoverview;
    // If host statement is no longer the first one, it means that extra statements were added at the
    // very beginning, so we need to relocate @fileoverview comment and cleanup the original statement
    // that hosted it.
    if (sf.statements.length > 0 && host !== sf.statements[0]) {
        if (trailing) {
            ts.setSyntheticTrailingComments(host, undefined);
        }
        else {
            ts.setSyntheticLeadingComments(host, undefined);
        }
        // Note: Do not use the first statement as it may be elided at runtime.
        // E.g. an import declaration that is type only.
        const commentNode = ts.factory.createNotEmittedStatement(sf);
        ts.setSyntheticLeadingComments(commentNode, comments);
        return ts.factory.updateSourceFile(sf, [commentNode, ...sf.statements], sf.isDeclarationFile, sf.referencedFiles, sf.typeReferenceDirectives, sf.hasNoDefaultLib, sf.libReferenceDirectives);
    }
    return sf;
}
function maybeFilterDecorator(decorators, toRemove) {
    if (decorators === undefined) {
        return undefined;
    }
    const filtered = decorators.filter((dec) => toRemove.find((decToRemove) => ts.getOriginalNode(dec) === decToRemove) === undefined);
    if (filtered.length === 0) {
        return undefined;
    }
    return ts.factory.createNodeArray(filtered);
}
function isFromAngularCore(decorator) {
    return decorator.import !== null && decorator.import.from === '@angular/core';
}
function createRecorderFn(defaultImportTracker) {
    return (node) => {
        const importDecl = checker.getDefaultImportDeclaration(node);
        if (importDecl !== null) {
            defaultImportTracker.recordUsedImport(importDecl);
        }
    };
}
/** Creates a `NodeArray` with the correct offsets from an array of decorators. */
function nodeArrayFromDecoratorsArray(decorators) {
    const array = ts.factory.createNodeArray(decorators);
    if (array.length > 0) {
        array.pos = decorators[0].pos;
        array.end = decorators[decorators.length - 1].end;
    }
    return array;
}

function resolveEnumValue(evaluator, metadata, field, enumSymbolName, isCore) {
    let resolved = null;
    if (metadata.has(field)) {
        const expr = metadata.get(field);
        const value = evaluator.evaluate(expr);
        if (value instanceof checker.EnumValue &&
            checker.isAngularCoreReferenceWithPotentialAliasing(value.enumRef, enumSymbolName, isCore)) {
            resolved = value.resolved;
        }
        else {
            throw checker.createValueHasWrongTypeError(expr, value, `${field} must be a member of ${enumSymbolName} enum from @angular/core`);
        }
    }
    return resolved;
}
/**
 * Resolves a EncapsulationEnum expression locally on best effort without having to calculate the
 * reference. This suites local compilation mode where each file is compiled individually.
 *
 * The static analysis is still needed in local compilation mode since the value of this enum will
 * be used later to decide the generated code for styles.
 */
function resolveEncapsulationEnumValueLocally(expr) {
    if (!expr) {
        return null;
    }
    const exprText = expr.getText().trim();
    for (const key in checker.ViewEncapsulation) {
        if (!Number.isNaN(Number(key))) {
            continue;
        }
        const suffix = `ViewEncapsulation.${key}`;
        // Check whether the enum is imported by name or used by import namespace (e.g.,
        // core.ViewEncapsulation.None)
        if (exprText === suffix || exprText.endsWith(`.${suffix}`)) {
            const ans = Number(checker.ViewEncapsulation[key]);
            return ans;
        }
    }
    return null;
}
/** Determines if the result of an evaluation is a string array. */
function isStringArray(resolvedValue) {
    return Array.isArray(resolvedValue) && resolvedValue.every((elem) => typeof elem === 'string');
}
function resolveLiteral(decorator, literalCache) {
    if (literalCache.has(decorator)) {
        return literalCache.get(decorator);
    }
    if (decorator.args === null || decorator.args.length !== 1) {
        throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_ARITY_WRONG, decorator.node, `Incorrect number of arguments to @${decorator.name} decorator`);
    }
    const meta = checker.unwrapExpression(decorator.args[0]);
    if (!ts.isObjectLiteralExpression(meta)) {
        throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_ARG_NOT_LITERAL, meta, `Decorator argument must be literal.`);
    }
    literalCache.set(decorator, meta);
    return meta;
}

function compileNgFactoryDefField(metadata) {
    const res = checker.compileFactoryFunction(metadata);
    return {
        name: 'ɵfac',
        initializer: res.expression,
        statements: res.statements,
        type: res.type,
        deferrableImports: null,
    };
}
function compileDeclareFactory(metadata) {
    const res = compileDeclareFactoryFunction(metadata);
    return {
        name: 'ɵfac',
        initializer: res.expression,
        statements: res.statements,
        type: res.type,
        deferrableImports: null,
    };
}

/**
 * Registry that keeps track of classes that can be constructed via dependency injection (e.g.
 * injectables, directives, pipes).
 */
class InjectableClassRegistry {
    host;
    isCore;
    classes = new Map();
    constructor(host, isCore) {
        this.host = host;
        this.isCore = isCore;
    }
    registerInjectable(declaration, meta) {
        this.classes.set(declaration, meta);
    }
    getInjectableMeta(declaration) {
        // Figure out whether the class is injectable based on the registered classes, otherwise
        // fall back to looking at its members since we might not have been able to register the class
        // if it was compiled in another compilation unit.
        if (this.classes.has(declaration)) {
            return this.classes.get(declaration);
        }
        if (!checker.hasInjectableFields(declaration, this.host)) {
            return null;
        }
        const ctorDeps = checker.getConstructorDependencies(declaration, this.host, this.isCore);
        const meta = {
            ctorDeps: checker.unwrapConstructorDependencies(ctorDeps),
        };
        this.classes.set(declaration, meta);
        return meta;
    }
}

/**
 * Given a class declaration, generate a call to `setClassMetadata` with the Angular metadata
 * present on the class or its member fields. An ngDevMode guard is used to allow the call to be
 * tree-shaken away, as the `setClassMetadata` invocation is only needed for testing purposes.
 *
 * If no such metadata is present, this function returns `null`. Otherwise, the call is returned
 * as a `Statement` for inclusion along with the class.
 */
function extractClassMetadata(clazz, reflection, isCore, annotateForClosureCompiler, angularDecoratorTransform = (dec) => dec) {
    if (!reflection.isClass(clazz)) {
        return null;
    }
    const id = clazz.name;
    // Reflect over the class decorators. If none are present, or those that are aren't from
    // Angular, then return null. Otherwise, turn them into metadata.
    const classDecorators = reflection.getDecoratorsOfDeclaration(clazz);
    if (classDecorators === null) {
        return null;
    }
    const ngClassDecorators = classDecorators
        .filter((dec) => isAngularDecorator$1(dec, isCore))
        .map((decorator) => decoratorToMetadata(angularDecoratorTransform(decorator), annotateForClosureCompiler))
        // Since the `setClassMetadata` call is intended to be emitted after the class
        // declaration, we have to strip references to the existing identifiers or
        // TypeScript might generate invalid code when it emits to JS. In particular
        // this can break when emitting a class to ES5 which has a custom decorator
        // and is referenced inside of its own metadata (see #39509 for more information).
        .map((decorator) => removeIdentifierReferences(decorator, id.text));
    if (ngClassDecorators.length === 0) {
        return null;
    }
    const metaDecorators = new checker.WrappedNodeExpr(ts.factory.createArrayLiteralExpression(ngClassDecorators));
    // Convert the constructor parameters to metadata, passing null if none are present.
    let metaCtorParameters = null;
    const classCtorParameters = reflection.getConstructorParameters(clazz);
    if (classCtorParameters !== null) {
        const ctorParameters = classCtorParameters.map((param) => ctorParameterToMetadata(param, isCore));
        metaCtorParameters = new checker.ArrowFunctionExpr([], new checker.LiteralArrayExpr(ctorParameters));
    }
    // Do the same for property decorators.
    let metaPropDecorators = null;
    const classMembers = reflection.getMembersOfClass(clazz).filter((member) => !member.isStatic &&
        member.decorators !== null &&
        member.decorators.length > 0 &&
        // Private fields are not supported in the metadata emit
        member.accessLevel !== checker.ClassMemberAccessLevel.EcmaScriptPrivate);
    const duplicateDecoratedMembers = classMembers.filter((member, i, arr) => arr.findIndex((arrayMember) => arrayMember.name === member.name) < i);
    if (duplicateDecoratedMembers.length > 0) {
        // This should theoretically never happen, because the only way to have duplicate instance
        // member names is getter/setter pairs and decorators cannot appear in both a getter and the
        // corresponding setter.
        throw new checker.FatalDiagnosticError(checker.ErrorCode.DUPLICATE_DECORATED_PROPERTIES, duplicateDecoratedMembers[0].nameNode ?? clazz, `Duplicate decorated properties found on class '${clazz.name.text}': ` +
            duplicateDecoratedMembers.map((member) => member.name).join(', '));
    }
    const decoratedMembers = classMembers.map((member) => classMemberToMetadata(member.nameNode ?? member.name, member.decorators, isCore));
    if (decoratedMembers.length > 0) {
        metaPropDecorators = new checker.WrappedNodeExpr(ts.factory.createObjectLiteralExpression(decoratedMembers));
    }
    return {
        type: new checker.WrappedNodeExpr(id),
        decorators: metaDecorators,
        ctorParameters: metaCtorParameters,
        propDecorators: metaPropDecorators,
    };
}
/**
 * Convert a reflected constructor parameter to metadata.
 */
function ctorParameterToMetadata(param, isCore) {
    // Parameters sometimes have a type that can be referenced. If so, then use it, otherwise
    // its type is undefined.
    const type = param.typeValueReference.kind !== 2 /* TypeValueReferenceKind.UNAVAILABLE */
        ? checker.valueReferenceToExpression(param.typeValueReference)
        : new checker.LiteralExpr(undefined);
    const mapEntries = [
        { key: 'type', value: type, quoted: false },
    ];
    // If the parameter has decorators, include the ones from Angular.
    if (param.decorators !== null) {
        const ngDecorat   ors = param.decorators
            .filter((dec) => isAngularDecorator$1(dec, isCore))
            .map((decorator) => decoratorToMetadata(decorator));
        const value = new checker.WrappedNodeExpr(ts.factory.createArrayLiteralExpression(ngDecorators));
        mapEntries.push({ key: 'decorators', value, quoted: false });
    }
    return checker.literalMap(mapEntries);
}
/**
 * Convert a reflected class member to metadata.
 */
function classMemberToMetadata(name, decorators, isCore) {
    const ngDecorators = decorators
        .filter((dec) => isAngularDecorator$1(dec, isCore))
        .map((decorator) => decoratorToMetadata(decorator));
    const decoratorMeta = ts.factory.createArrayLiteralExpression(ngDecorators);
    return ts.factory.createPropertyAssignment(name, decoratorMeta);
}
/**
 * Convert a reflected decorator to metadata.
 */
function decoratorToMetadata(decorator, wrapFunctionsInParens) {
    if (decorator.identifier === null) {
        throw new Error('Illegal state: synthesized decorator cannot be emitted in class metadata.');
    }
    // Decorators have a type.
    const properties = [
        ts.factory.createPropertyAssignment('type', decorator.identifier),
    ];
    // Sometimes they have arguments.
    if (decorator.args !== null && decorator.args.length > 0) {
        const args = decorator.args.map((arg) => {
            return wrapFunctionsInParens ? checker.wrapFunctionExpressionsInParens(arg) : arg;
        });
        properties.push(ts.factory.createPropertyAssignment('args', ts.factory.createArrayLiteralExpression(args)));
    }
    return ts.factory.createObjectLiteralExpression(properties, true);
}
/**
 * Whether a given decorator should be treated as an Angular decorator.
 *
 * Either it's used in @angular/core, or it's imported from there.
 */
function isAngularDecorator$1(decorator, isCore) {
    return isCore || (decorator.import !== null && decorator.import.from === '@angular/core');
}
/**
 * Recursively recreates all of the `Identifier` descendant nodes with a particular name inside
 * of an AST node, thus removing any references to them. Useful if a particular node has to be
 * taken from one place any emitted to another one exactly as it has been written.
 */
function removeIdentifierReferences(node, names) {
    const result = ts.transform(node, [
        (context) => (root) => ts.visitNode(root, function walk(current) {
            return (ts.isIdentifier(current) &&
                (typeof names === 'string' ? current.text === names : names.has(current.text))
                ? ts.factory.createIdentifier(current.text)
                : ts.visitEachChild(current, walk, context));
        }),
    ]);
    return result.transformed[0];
}

function extractClassDebugInfo(clazz, reflection, compilerHost, rootDirs, forbidOrphanRendering) {
    if (!reflection.isClass(clazz)) {
        return null;
    }
    const srcFile = clazz.getSourceFile();
    const srcFileMaybeRelativePath = getProjectRelativePath(srcFile.fileName, rootDirs, compilerHost);
    return {
        type: new checker.WrappedNodeExpr(clazz.name),
        className: checker.literal(clazz.name.getText()),
        filePath: srcFileMaybeRelativePath ? checker.literal(srcFileMaybeRelativePath) : null,
        lineNumber: checker.literal(srcFile.getLineAndCharacterOfPosition(clazz.name.pos).line + 1),
        forbidOrphanRendering,
    };
}

/**
 * This registry does nothing.
 */
class NoopReferencesRegistry {
    add(source, ...references) { }
}

function extractSchemas(rawExpr, evaluator, context) {
    const schemas = [];
    const result = evaluator.evaluate(rawExpr);
    if (!Array.isArray(result)) {
        throw checker.createValueHasWrongTypeError(rawExpr, result, `${context}.schemas must be an array`);
    }
    for (const schemaRef of result) {
        if (!(schemaRef instanceof checker.Reference)) {
            throw checker.createValueHasWrongTypeError(rawExpr, result, `${context}.schemas must be an array of schemas`);
        }
        const id = schemaRef.getIdentityIn(schemaRef.node.getSourceFile());
        if (id === null || schemaRef.ownedByModuleGuess !== '@angular/core') {
            throw checker.createValueHasWrongTypeError(rawExpr, result, `${context}.schemas must be an array of schemas`);
        }
        // Since `id` is the `ts.Identifier` within the schema ref's declaration file, it's safe to
        // use `id.text` here to figure out which schema is in use. Even if the actual reference was
        // renamed when the user imported it, these names will match.
        switch (id.text) {
            case 'CUSTOM_ELEMENTS_SCHEMA':
                schemas.push(checker.CUSTOM_ELEMENTS_SCHEMA);
                break;
            case 'NO_ERRORS_SCHEMA':
                schemas.push(checker.NO_ERRORS_SCHEMA);
                break;
            default:
                throw checker.createValueHasWrongTypeError(rawExpr, schemaRef, `'${schemaRef.debugName}' is not a valid ${context} schema`);
        }
    }
    return schemas;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/** Generates additional fields to be added to a class that has inputs with transform functions. */
function compileInputTransformFields(inputs) {
    const extraFields = [];
    for (const input of inputs) {
        // Note: Signal inputs capture their transform `WriteT` as part of the `InputSignal`.
        // Such inputs will not have a `transform` captured and not generate coercion members.
        if (input.transform) {
            extraFields.push({
                name: `ngAcceptInputType_${input.classPropertyName}`,
                type: checker.transplantedType(input.transform.type),
                statements: [],
                initializer: null,
                deferrableImports: null,
            });
        }
    }
    return extraFields;
}

/**
 * Registry that keeps track of Angular declarations that are explicitly
 * marked for JIT compilation and are skipping compilation by trait handlers.
 */
class JitDeclarationRegistry {
    jitDeclarations = new Set();
}

/**
 * Represents a symbol that is recognizable across incremental rebuilds, which enables the captured
 * metadata to be compared to the prior compilation. This allows for semantic understanding of
 * the changes that have been made in a rebuild, which potentially enables more reuse of work
 * from the prior compilation.
 */
class SemanticSymbol {
    decl;
    /**
     * The path of the file that declares this symbol.
     */
    path;
    /**
     * The identifier of this symbol, or null if no identifier could be determined. It should
     * uniquely identify the symbol relative to `file`. This is typically just the name of a
     * top-level class declaration, as that uniquely identifies the class within the file.
     *
     * If the identifier is null, then this symbol cannot be recognized across rebuilds. In that
     * case, the symbol is always assumed to have semantically changed to guarantee a proper
     * rebuild.
     */
    identifier;
    constructor(
    /**
     * The declaration for this symbol.
     */
    decl) {
        this.decl = decl;
        this.path = checker.absoluteFromSourceFile(decl.getSourceFile());
        this.identifier = getSymbolIdentifier(decl);
    }
}
function getSymbolIdentifier(decl) {
    if (!ts.isSourceFile(decl.parent)) {
        return null;
    }
    // If this is a top-level class declaration, the class name is used as unique identifier.
    // Other scenarios are currently not supported and causes the symbol not to be identified
    // across rebuilds, unless the declaration node has not changed.
    return decl.name.text;
}

/**
 * Represents a declaration for which no semantic symbol has been registered. For example,
 * declarations from external dependencies have not been explicitly registered and are represented
 * by this symbol. This allows the unresolved symbol to still be compared to a symbol from a prior
 * compilation.
 */
class OpaqueSymbol extends SemanticSymbol {
    isPublicApiAffected() {
        return false;
    }
    isTypeCheckApiAffected() {
        return false;
    }
}
/**
 * The semantic dependency graph of a single compilation.
 */
class SemanticDepGraph {
    files = new Map();
    // Note: the explicit type annotation is used to work around a CI failure on Windows:
    // error TS2742: The inferred type of 'symbolByDecl' cannot be named without a reference to
    // '../../../../../../../external/npm/node_modules/typescript/lib/typescript'. This is likely
    // not portable. A type annotation is necessary.
    symbolByDecl = new Map();
    /**
     * Registers a symbol in the graph. The symbol is given a unique identifier if possible, such that
     * its equivalent symbol can be obtained from a prior graph even if its declaration node has
     * changed across rebuilds. Symbols without an identifier are only able to find themselves in a
     * prior graph if their declaration node is identical.
     */
    registerSymbol(symbol) {
        this.symbolByDecl.set(symbol.decl, symbol);
        if (symbol.identifier !== null) {
            // If the symbol has a unique identifier, record it in the file that declares it. This enables
            // the symbol to be requested by its unique name.
            if (!this.files.has(symbol.path)) {
                this.files.set(symbol.path, new Map());
            }
            this.files.get(symbol.path).set(symbol.identifier, symbol);
        }
    }
    /**
     * Attempts to resolve a symbol in this graph that represents the given symbol from another graph.
     * If no matching symbol could be found, null is returned.
     *
     * @param symbol The symbol from another graph for which its equivalent in this graph should be
     * found.
     */
    getEquivalentSymbol(symbol) {
        // First lookup the symbol by its declaration. It is typical for the declaration to not have
        // changed across rebuilds, so this is likely to find the symbol. Using the declaration also
        // allows to diff symbols for which no unique identifier could be determined.
        let previousSymbol = this.getSymbolByDecl(symbol.decl);
        if (previousSymbol === null && symbol.identifier !== null) {
            // The declaration could not be resolved to a symbol in a prior compilation, which may
            // happen because the file containing the declaration has changed. In that case we want to
            // lookup the symbol based on its unique identifier, as that allows us to still compare the
            // changed declaration to the prior compilation.
            previousSymbol = this.getSymbolByName(symbol.path, symbol.identifier);
        }
        return previousSymbol;
    }
    /**
     * Attempts to find the symbol by its identifier.
     */
    getSymbolByName(path, identifier) {
        if (!this.files.has(path)) {
            return null;
        }
        const file = this.files.get(path);
        if (!file.has(identifier)) {
            return null;
        }
        return file.get(identifier);
    }
    /**
     * Attempts to resolve the declaration to its semantic symbol.
     */
    getSymbolByDecl(decl) {
        if (!this.symbolByDecl.has(decl)) {
            return null;
        }
        return this.symbolByDecl.get(decl);
    }
}
/**
 * Implements the logic to go from a previous dependency graph to a new one, along with information
 * on which files have been affected.
 */
class SemanticDepGraphUpdater {
    priorGraph;
    newGraph = new SemanticDepGraph();
    /**
     * Contains opaque symbols that were created for declarations for which there was no symbol
     * registered, which happens for e.g. external declarations.
     */
    opaqueSymbols = new Map();
    constructor(
    /**
     * The semantic dependency graph of the most recently succeeded compilation, or null if this
     * is the initial build.
     */
    priorGraph) {
        this.priorGraph = priorGraph;
    }
    /**
     * Registers the symbol in the new graph that is being created.
     */
    registerSymbol(symbol) {
        this.newGraph.registerSymbol(symbol);
    }
    /**
     * Takes all facts that have been gathered to create a new semantic dependency graph. In this
     * process, the semantic impact of the changes is determined which results in a set of files that
     * need to be emitted and/or type-checked.
     */
    finalize() {
        if (this.priorGraph === null) {
            // If no prior dependency graph is available then this was the initial build, in which case
            // we don't need to determine the semantic impact as everything is already considered
            // logically changed.
            return {
                needsEmit: new Set(),
                needsTypeCheckEmit: new Set(),
                newGraph: this.newGraph,
            };
        }
        const needsEmit = this.determineInvalidatedFiles(this.priorGraph);
        const needsTypeCheckEmit = this.determineInvalidatedTypeCheckFiles(this.priorGraph);
        return {
            needsEmit,
            needsTypeCheckEmit,
            newGraph: this.newGraph,
        };
    }
    determineInvalidatedFiles(priorGraph) {
        const isPublicApiAffected = new Set();
        // The first phase is to collect all symbols which have their public API affected. Any symbols
        // that cannot be matched up with a symbol from the prior graph are considered affected.
        for (const symbol of this.newGraph.symbolByDecl.values()) {
            const previousSymbol = priorGraph.getEquivalentSymbol(symbol);
            if (previousSymbol === null || symbol.isPublicApiAffected(previousSymbol)) {
                isPublicApiAffected.add(symbol);
            }
        }
        // The second phase is to find all symbols for which the emit result is affected, either because
        // their used declarations have changed or any of those used declarations has had its public API
        // affected as determined in the first phase.
        const needsEmit = new Set();
        for (const symbol of this.newGraph.symbolByDecl.values()) {
            if (symbol.isEmitAffected === undefined) {
                continue;
            }
            const previousSymbol = priorGraph.getEquivalentSymbol(symbol);
            if (previousSymbol === null || symbol.isEmitAffected(previousSymbol, isPublicApiAffected)) {
                needsEmit.add(symbol.path);
            }
        }
        return needsEmit;
    }
    determineInvalidatedTypeCheckFiles(priorGraph) {
        const isTypeCheckApiAffected = new Set();
        // The first phase is to collect all symbols which have their public API affected. Any symbols
        // that cannot be matched up with a symbol from the prior graph are considered affected.
        for (const symbol of this.newGraph.symbolByDecl.values()) {
            const previousSymbol = priorGraph.getEquivalentSymbol(symbol);
            if (previousSymbol === null || symbol.isTypeCheckApiAffected(previousSymbol)) {
                isTypeCheckApiAffected.add(symbol);
            }
        }
        // The second phase is to find all symbols for which the emit result is affected, either because
        // their used declarations have changed or any of those used declarations has had its public API
        // affected as determined in the first phase.
        const needsTypeCheckEmit = new Set();
        for (const symbol of this.newGraph.symbolByDecl.values()) {
            if (symbol.isTypeCheckBlockAffected === undefined) {
                continue;
            }
            const previousSymbol = priorGraph.getEquivalentSymbol(symbol);
            if (previousSymbol === null ||
                symbol.isTypeCheckBlockAffected(previousSymbol, isTypeCheckApiAffected)) {
                needsTypeCheckEmit.add(symbol.path);
            }
        }
        return needsTypeCheckEmit;
    }
    /**
     * Creates a `SemanticReference` for the reference to `decl` using the expression `expr`. See
     * the documentation of `SemanticReference` for details.
     */
    getSemanticReference(decl, expr) {
        return {
            symbol: this.getSymbol(decl),
            importPath: getImportPath(expr),
        };
    }
    /**
     * Gets the `SemanticSymbol` that was registered for `decl` during the current compilation, or
     * returns an opaque symbol that represents `decl`.
     */
    getSymbol(decl) {
        const symbol = this.newGraph.getSymbolByDecl(decl);
        if (symbol === null) {
            // No symbol has been recorded for the provided declaration, which would be the case if the
            // declaration is external. Return an opaque symbol in that case, to allow the external
            // declaration to be compared to a prior compilation.
            return this.getOpaqueSymbol(decl);
        }
        return symbol;
    }
    /**
     * Gets or creates an `OpaqueSymbol` for the provided class declaration.
     */
    getOpaqueSymbol(decl) {
        if (this.opaqueSymbols.has(decl)) {
            return this.opaqueSymbols.get(decl);
        }
        const symbol = new OpaqueSymbol(decl);
        this.opaqueSymbols.set(decl, symbol);
        return symbol;
    }
}
function getImportPath(expr) {
    if (expr instanceof checker.ExternalExpr) {
        return `${expr.value.moduleName}\$${expr.value.name}`;
    }
    else {
        return null;
    }
}

/**
 * Determines whether the provided symbols represent the same declaration.
 */
function isSymbolEqual(a, b) {
    if (a.decl === b.decl) {
        // If the declaration is identical then it must represent the same symbol.
        return true;
    }
    if (a.identifier === null || b.identifier === null) {
        // Unidentifiable symbols are assumed to be different.
        return false;
    }
    return a.path === b.path && a.identifier === b.identifier;
}
/**
 * Determines whether the provided references to a semantic symbol are still equal, i.e. represent
 * the same symbol and are imported by the same path.
 */
function isReferenceEqual(a, b) {
    if (!isSymbolEqual(a.symbol, b.symbol)) {
        // If the reference's target symbols are different, the reference itself is different.
        return false;
    }
    // The reference still corresponds with the same symbol, now check that the path by which it is
    // imported has not changed.
    return a.importPath === b.importPath;
}
function referenceEquality(a, b) {
    return a === b;
}
/**
 * Determines if the provided arrays are equal to each other, using the provided equality tester
 * that is called for all entries in the array.
 */
function isArrayEqual(a, b, equalityTester = referenceEquality) {
    if (a === null || b === null) {
        return a === b;
    }
    if (a.length !== b.length) {
        return false;
    }
    return !a.some((item, index) => !equalityTester(item, b[index]));
}
/**
 * Determines if the provided sets are equal to each other, using the provided equality tester.
 * Sets that only differ in ordering are considered equal.
 */
function isSetEqual(a, b, equalityTester = referenceEquality) {
    if (a === null || b === null) {
        return a === b;
    }
    if (a.size !== b.size) {
        return false;
    }
    for (const itemA of a) {
        let found = false;
        for (const itemB of b) {
            if (equalityTester(itemA, itemB)) {
                found = true;
                break;
            }
        }
        if (!found) {
            return false;
        }
    }
    return true;
}

/**
 * Converts the type parameters of the given class into their semantic representation. If the class
 * does not have any type parameters, then `null` is returned.
 */
function extractSemanticTypeParameters(node) {
    if (!ts.isClassDeclaration(node) || node.typeParameters === undefined) {
        return null;
    }
    return node.typeParameters.map((typeParam) => ({
        hasGenericTypeBound: typeParam.constraint !== undefined,
    }));
}
/**
 * Compares the list of type parameters to determine if they can be considered equal.
 */
function areTypeParametersEqual(current, previous) {
    // First compare all type parameters one-to-one; any differences mean that the list of type
    // parameters has changed.
    if (!isArrayEqual(current, previous, isTypeParameterEqual)) {
        return false;
    }
    // If there is a current list of type parameters and if any of them has a generic type constraint,
    // then the meaning of that type parameter may have changed without us being aware; as such we
    // have to assume that the type parameters have in fact changed.
    if (current !== null && current.some((typeParam) => typeParam.hasGenericTypeBound)) {
        return false;
    }
    return true;
}
function isTypeParameterEqual(a, b) {
    return a.hasGenericTypeBound === b.hasGenericTypeBound;
}

/**
 * A `ComponentScopeReader` that reads from an ordered set of child readers until it obtains the
 * requested scope.
 *
 * This is used to combine `ComponentScopeReader`s that read from different sources (e.g. from a
 * registry and from the incremental state).
 */
class CompoundComponentScopeReader {
    readers;
    constructor(readers) {
        this.readers = readers;
    }
    getScopeForComponent(clazz) {
        for (const reader of this.readers) {
            const meta = reader.getScopeForComponent(clazz);
            if (meta !== null) {
                return meta;
            }
        }
        return null;
    }
    getRemoteScope(clazz) {
        for (const reader of this.readers) {
            const remoteScope = reader.getRemoteScope(clazz);
            if (remoteScope !== null) {
                return remoteScope;
            }
        }
        return null;
    }
}

/**
 * Reads Angular metadata from classes declared in .d.ts files and computes an `ExportScope`.
 *
 * Given an NgModule declared in a .d.ts file, this resolver can produce a transitive `ExportScope`
 * of all of the directives/pipes it exports. It does this by reading metadata off of Ivy static
 * fields on directives, components, pipes, and NgModules.
 */
class MetadataDtsModuleScopeResolver {
    dtsMetaReader;
    aliasingHost;
    /**
     * Cache which holds fully resolved scopes for NgModule classes from .d.ts files.
     */
    cache = new Map();
    /**
     * @param dtsMetaReader a `MetadataReader` which can read metadata from `.d.ts` files.
     */
    constructor(dtsMetaReader, aliasingHost) {
        this.dtsMetaReader = dtsMetaReader;
        this.aliasingHost = aliasingHost;
    }
    /**
     * Resolve a `Reference`'d NgModule from a .d.ts file and produce a transitive `ExportScope`
     * listing the directives and pipes which that NgModule exports to others.
     *
     * This operation relies on a `Reference` instead of a direct TypeScript node as the `Reference`s
     * produced depend on how the original NgModule was imported.
     */
    resolve(ref) {
        const clazz = ref.node;
        const sourceFile = clazz.getSourceFile();
        if (!sourceFile.isDeclarationFile) {
            throw new Error(`Debug error: DtsModuleScopeResolver.read(${ref.debugName} from ${sourceFile.fileName}), but not a .d.ts file`);
        }
        if (this.cache.has(clazz)) {
            return this.cache.get(clazz);
        }
        // Build up the export scope - those directives and pipes made visible by this module.
        const dependencies = [];
        const meta = this.dtsMetaReader.getNgModuleMetadata(ref);
        if (meta === null) {
            this.cache.set(clazz, null);
            return null;
        }
        const declarations = new Set();
        for (const declRef of meta.declarations) {
            declarations.add(declRef.node);
        }
        // Only the 'exports' field of the NgModule's metadata is important. Imports and declarations
        // don't affect the export scope.
        for (const exportRef of meta.exports) {
            // Attempt to process the export as a directive.
            const directive = this.dtsMetaReader.getDirectiveMetadata(exportRef);
            if (directive !== null) {
                const isReExport = !declarations.has(exportRef.node);
                dependencies.push(this.maybeAlias(directive, sourceFile, isReExport));
                continue;
            }
            // Attempt to process the export as a pipe.
            const pipe = this.dtsMetaReader.getPipeMetadata(exportRef);
            if (pipe !== null) {
                const isReExport = !declarations.has(exportRef.node);
                dependencies.push(this.maybeAlias(pipe, sourceFile, isReExport));
                continue;
            }
            // Attempt to process the export as a module.
            const exportScope = this.resolve(exportRef);
            if (exportScope !== null) {
                // It is a module. Add exported directives and pipes to the current scope. This might
                // involve rewriting the `Reference`s to those types to have an alias expression if one is
                // required.
                if (this.aliasingHost === null) {
                    // Fast path when aliases aren't required.
                    dependencies.push(...exportScope.exported.dependencies);
                }
                else {
                    // It's necessary to rewrite the `Reference`s to add alias expressions. This way, imports
                    // generated to these directives and pipes will use a shallow import to `sourceFile`
                    // instead of a deep import directly to the directive or pipe class.
                    //
                    // One important check here is whether the directive/pipe is declared in the same
                    // source file as the re-exporting NgModule. This can happen if both a directive, its
                    // NgModule, and the re-exporting NgModule are all in the same file. In this case,
                    // no import alias is needed as it would go to the same file anyway.
                    for (const dep of exportScope.exported.dependencies) {
                        dependencies.push(this.maybeAlias(dep, sourceFile, /* isReExport */ true));
                    }
                }
            }
            continue;
            // The export was not a directive, a pipe, or a module. This is an error.
            // TODO(alxhub): produce a ts.Diagnostic
        }
        const exportScope = {
            exported: {
                dependencies,
                isPoisoned: meta.isPoisoned,
            },
        };
        this.cache.set(clazz, exportScope);
        return exportScope;
    }
    maybeAlias(dirOrPipe, maybeAliasFrom, isReExport) {
        const ref = dirOrPipe.ref;
        if (this.aliasingHost === null || ref.node.getSourceFile() === maybeAliasFrom) {
            return dirOrPipe;
        }
        const alias = this.aliasingHost.getAliasIn(ref.node, maybeAliasFrom, isReExport);
        if (alias === null) {
            return dirOrPipe;
        }
        return {
            ...dirOrPipe,
            ref: ref.cloneWithAlias(alias),
        };
    }
}

function getDiagnosticNode(ref, rawExpr) {
    // Show the diagnostic on the node within `rawExpr` which references the declaration
    // in question. `rawExpr` represents the raw expression from which `ref` was partially evaluated,
    // so use that to find the right node. Note that by the type system, `rawExpr` might be `null`, so
    // fall back on the declaration identifier in that case (even though in practice this should never
    // happen since local NgModules always have associated expressions).
    return rawExpr !== null ? ref.getOriginForDiagnostics(rawExpr) : ref.node.name;
}
function makeNotStandaloneDiagnostic(scopeReader, ref, rawExpr, kind) {
    const scope = scopeReader.getScopeForComponent(ref.node);
    let message = `The ${kind} '${ref.node.name.text}' appears in 'imports', but is not standalone and cannot be imported directly.`;
    let relatedInformation = undefined;
    if (scope !== null && scope.kind === checker.ComponentScopeKind.NgModule) {
        // The directive/pipe in question is declared in an NgModule. Check if it's also exported.
        const isExported = scope.exported.dependencies.some((dep) => dep.ref.node === ref.node);
        const relatedInfoMessageText = isExported
            ? `It can be imported using its '${scope.ngModule.name.text}' NgModule instead.`
            : `It's declared in the '${scope.ngModule.name.text}' NgModule, but is not exported. ` +
                'Consider exporting it and importing the NgModule instead.';
        relatedInformation = [checker.makeRelatedInformation(scope.ngModule.name, relatedInfoMessageText)];
    }
    if (relatedInformation === undefined) {
        // If no contextual pointers can be provided to suggest a specific remedy, then at least tell
        // the user broadly what they need to do.
        message += ' It must be imported via an NgModule.';
    }
    return checker.makeDiagnostic(checker.ErrorCode.COMPONENT_IMPORT_NOT_STANDALONE, getDiagnosticNode(ref, rawExpr), message, relatedInformation);
}
function makeUnknownComponentImportDiagnostic(ref, rawExpr) {
    return checker.makeDiagnostic(checker.ErrorCode.COMPONENT_UNKNOWN_IMPORT, getDiagnosticNode(ref, rawExpr), `Component imports must be standalone components, directives, pipes, or must be NgModules.`);
}
function makeUnknownComponentDeferredImportDiagnostic(ref, rawExpr) {
    return checker.makeDiagnostic(checker.ErrorCode.COMPONENT_UNKNOWN_DEFERRED_IMPORT, getDiagnosticNode(ref, rawExpr), `Component deferred imports must be standalone components, directives or pipes.`);
}

/** Value used to mark a module whose scope is in the process of being resolved. */
const IN_PROGRESS_RESOLUTION = {};
/**
 * A registry which collects information about NgModules, Directives, Components, and Pipes which
 * are local (declared in the ts.Program being compiled), and can produce `LocalModuleScope`s
 * which summarize the compilation scope of a component.
 *
 * This class implements the logic of NgModule declarations, imports, and exports and can produce,
 * for a given component, the set of directives and pipes which are "visible" in that component's
 * template.
 *
 * The `LocalModuleScopeRegistry` has two "modes" of operation. During analysis, data for each
 * individual NgModule, Directive, Component, and Pipe is added to the registry. No attempt is made
 * to traverse or validate the NgModule graph (imports, exports, etc). After analysis, one of
 * `getScopeOfModule` or `getScopeForComponent` can be called, which traverses the NgModule graph
 * and applies the NgModule logic to generate a `LocalModuleScope`, the full scope for the given
 * module or component.
 *
 * The `LocalModuleScopeRegistry` is also capable of producing `ts.Diagnostic` errors when Angular
 * semantics are violated.
 */
class LocalModuleScopeRegistry {
    localReader;
    fullReader;
    dependencyScopeReader;
    refEmitter;
    aliasingHost;
    /**
     * Tracks whether the registry has been asked to produce scopes for a module or component. Once
     * this is true, the registry cannot accept registrations of new directives/pipes/modules as it
     * would invalidate the cached scope data.
     */
    sealed = false;
    /**
     * A map of components from the current compilation unit to the NgModule which declared them.
     *
     * As components and directives are not distinguished at the NgModule level, this map may also
     * contain directives. This doesn't cause any problems but isn't useful as there is no concept of
     * a directive's compilation scope.
     */
    declarationToModule = new Map();
    /**
     * This maps from the directive/pipe class to a map of data for each NgModule that declares the
     * directive/pipe. This data is needed to produce an error for the given class.
     */
    duplicateDeclarations = new Map();
    moduleToRef = new Map();
    /**
     * A cache of calculated `LocalModuleScope`s for each NgModule declared in the current program.
  
     */
    cache = new Map();
    /**
     * Tracks the `RemoteScope` for components requiring "remote scoping".
     *
     * Remote scoping is when the set of directives which apply to a given component is set in the
     * NgModule's file instead of directly on the component def (which is sometimes needed to get
     * around cyclic import issues). This is not used in calculation of `LocalModuleScope`s, but is
     * tracked here for convenience.
     */
    remoteScoping = new Map();
    /**
     * Tracks errors accumulated in the processing of scopes for each module declaration.
     */
    scopeErrors = new Map();
    /**
     * Tracks which NgModules have directives/pipes that are declared in more than one module.
     */
    modulesWithStructuralErrors = new Set();
    constructor(localReader, fullReader, dependencyScopeReader, refEmitter, aliasingHost) {
        this.localReader = localReader;
        this.fullReader = fullReader;
        this.dependencyScopeReader = dependencyScopeReader;
        this.refEmitter = refEmitter;
        this.aliasingHost = aliasingHost;
    }
    /**
     * Add an NgModule's data to the registry.
     */
    registerNgModuleMetadata(data) {
        this.assertCollecting();
        const ngModule = data.ref.node;
        this.moduleToRef.set(data.ref.node, data.ref);
        // Iterate over the module's declarations, and add them to declarationToModule. If duplicates
        // are found, they're instead tracked in duplicateDeclarations.
        for (const decl of data.declarations) {
            this.registerDeclarationOfModule(ngModule, decl, data.rawDeclarations);
        }
    }
    registerDirectiveMetadata(directive) { }
    registerPipeMetadata(pipe) { }
    getScopeForComponent(clazz) {
        const scope = !this.declarationToModule.has(clazz)
            ? null
            : this.getScopeOfModule(this.declarationToModule.get(clazz).ngModule);
        return scope;
    }
    /**
     * If `node` is declared in more than one NgModule (duplicate declaration), then get the
     * `DeclarationData` for each offending declaration.
     *
     * Ordinarily a class is only declared in one NgModule, in which case this function returns
     * `null`.
     */
    getDuplicateDeclarations(node) {
        if (!this.duplicateDeclarations.has(node)) {
            return null;
        }
        return Array.from(this.duplicateDeclarations.get(node).values());
    }
    /**
     * Collects registered data for a module and its directives/pipes and convert it into a full
     * `LocalModuleScope`.
     *
     * This method implements the logic of NgModule imports and exports. It returns the
     * `LocalModuleScope` for the given NgModule if one can be produced, `null` if no scope was ever
     * defined, or the string `'error'` if the scope contained errors.
     */
    getScopeOfModule(clazz) {
        return this.moduleToRef.has(clazz)
            ? this.getScopeOfModuleReference(this.moduleToRef.get(clazz))
            : null;
    }
    /**
     * Retrieves any `ts.Diagnostic`s produced during the calculation of the `LocalModuleScope` for
     * the given NgModule, or `null` if no errors were present.
     */
    getDiagnosticsOfModule(clazz) {
        // Required to ensure the errors are populated for the given class. If it has been processed
        // before, this will be a no-op due to the scope cache.
        this.getScopeOfModule(clazz);
        if (this.scopeErrors.has(clazz)) {
            return this.scopeErrors.get(clazz);
        }
        else {
            return null;
        }
    }
    registerDeclarationOfModule(ngModule, decl, rawDeclarations) {
        const declData = {
            ngModule,
            ref: decl,
            rawDeclarations,
        };
        // First, check for duplicate declarations of the same directive/pipe.
        if (this.duplicateDeclarations.has(decl.node)) {
            // This directive/pipe has already been identified as being duplicated. Add this module to the
            // map of modules for which a duplicate declaration exists.
            this.duplicateDeclarations.get(decl.node).set(ngModule, declData);
        }
        else if (this.declarationToModule.has(decl.node) &&
            this.declarationToModule.get(decl.node).ngModule !== ngModule) {
            // This directive/pipe is already registered as declared in another module. Mark it as a
            // duplicate instead.
            const duplicateDeclMap = new Map();
            const firstDeclData = this.declarationToModule.get(decl.node);
            // Mark both modules as having duplicate declarations.
            this.modulesWithStructuralErrors.add(firstDeclData.ngModule);
            this.modulesWithStructuralErrors.add(ngModule);
            // Being detected as a duplicate means there are two NgModules (for now) which declare this
            // directive/pipe. Add both of them to the duplicate tracking map.
            duplicateDeclMap.set(firstDeclData.ngModule, firstDeclData);
            duplicateDeclMap.set(ngModule, declData);
            this.duplicateDeclarations.set(decl.node, duplicateDeclMap);
            // Remove the directive/pipe from `declarationToModule` as it's a duplicate declaration, and
            // therefore not valid.
            this.declarationToModule.delete(decl.node);
        }
        else {
            // This is the first declaration of this directive/pipe, so map it.
            this.declarationToModule.set(decl.node, declData);
        }
    }
    /**
     * Implementation of `getScopeOfModule` which accepts a reference to a class.
     */
    getScopeOfModuleReference(ref) {
        if (this.cache.has(ref.node)) {
            const cachedValue = this.cache.get(ref.node);
            if (cachedValue !== IN_PROGRESS_RESOLUTION) {
                return cachedValue;
            }
        }
        this.cache.set(ref.node, IN_PROGRESS_RESOLUTION);
        // Seal the registry to protect the integrity of the `LocalModuleScope` cache.
        this.sealed = true;
        // `ref` should be an NgModule previously added to the registry. If not, a scope for it
        // cannot be produced.
        const ngModule = this.localReader.getNgModuleMetadata(ref);
        if (ngModule === null) {
            this.cache.set(ref.node, null);
            return null;
        }
        // Errors produced during computation of the scope are recorded here. At the end, if this array
        // isn't empty then `undefined` will be cached and returned to indicate this scope is invalid.
        const diagnostics = [];
        // At this point, the goal is to produce two distinct transitive sets:
        // - the directives and pipes which are visible to components declared in the NgModule.
        // - the directives and pipes which are exported to any NgModules which import this one.
        // Directives and pipes in the compilation scope.
        const compilationDirectives = new Map();
        const compilationPipes = new Map();
        const declared = new Set();
        // Directives and pipes exported to any importing NgModules.
        const exportDirectives = new Map();
        const exportPipes = new Map();
        // The algorithm is as follows:
        // 1) Add all of the directives/pipes from each NgModule imported into the current one to the
        //    compilation scope.
        // 2) Add directives/pipes declared in the NgModule to the compilation scope. At this point, the
        //    compilation scope is complete.
        // 3) For each entry in the NgModule's exports:
        //    a) Attempt to resolve it as an NgModule with its own exported directives/pipes. If it is
        //       one, add them to the export scope of this NgModule.
        //    b) Otherwise, it should be a class in the compilation scope of this NgModule. If it is,
        //       add it to the export scope.
        //    c) If it's neither an NgModule nor a directive/pipe in the compilation scope, then this
        //       is an error.
        //
        let isPoisoned = false;
        if (this.modulesWithStructuralErrors.has(ngModule.ref.node)) {
            // If the module contains declarations that are duplicates, then it's considered poisoned.
            isPoisoned = true;
        }
        // 1) process imports.
        for (const decl of ngModule.imports) {
            const importScope = this.getExportedScope(decl, diagnostics, ref.node, 'import');
            if (importScope !== null) {
                if (importScope === 'invalid' ||
                    importScope === 'cycle' ||
                    importScope.exported.isPoisoned) {
                    // An import was an NgModule but contained errors of its own. Record this as an error too,
                    // because this scope is always going to be incorrect if one of its imports could not be
                    // read.
                    isPoisoned = true;
                    // Prevent the module from reporting a diagnostic about itself when there's a cycle.
                    if (importScope !== 'cycle') {
                        diagnostics.push(invalidTransitiveNgModuleRef(decl, ngModule.rawImports, 'import'));
                    }
                    if (importScope === 'invalid' || importScope === 'cycle') {
                        continue;
                    }
                }
                for (const dep of importScope.exported.dependencies) {
                    if (dep.kind === checker.MetaKind.Directive) {
                        compilationDirectives.set(dep.ref.node, dep);
                    }
                    else if (dep.kind === checker.MetaKind.Pipe) {
                        compilationPipes.set(dep.ref.node, dep);
                    }
                }
                // Successfully processed the import as an NgModule (even if it had errors).
                continue;
            }
            // The import wasn't an NgModule. Maybe it's a standalone entity?
            const directive = this.fullReader.getDirectiveMetadata(decl);
            if (directive !== null) {
                if (directive.isStandalone) {
                    compilationDirectives.set(directive.ref.node, directive);
                }
                else {
                    // Error: can't import a non-standalone component/directive.
                    diagnostics.push(makeNotStandaloneDiagnostic(this, decl, ngModule.rawImports, directive.isComponent ? 'component' : 'directive'));
                    isPoisoned = true;
                }
                continue;
            }
            // It wasn't a directive (standalone or otherwise). Maybe a pipe?
            const pipe = this.fullReader.getPipeMetadata(decl);
            if (pipe !== null) {
                if (pipe.isStandalone) {
                    compilationPipes.set(pipe.ref.node, pipe);
                }
                else {
                    diagnostics.push(makeNotStandaloneDiagnostic(this, decl, ngModule.rawImports, 'pipe'));
                    isPoisoned = true;
                }
                continue;
            }
            // This reference was neither another NgModule nor a standalone entity. Report it as invalid.
            diagnostics.push(invalidRef(decl, ngModule.rawImports, 'import'));
            isPoisoned = true;
        }
        // 2) add declarations.
        for (const decl of ngModule.declarations) {
            const directive = this.localReader.getDirectiveMetadata(decl);
            const pipe = this.localReader.getPipeMetadata(decl);
            if (directive !== null) {
                if (directive.isStandalone) {
                    const refType = directive.isComponent ? 'Component' : 'Directive';
                    diagnostics.push(checker.makeDiagnostic(checker.ErrorCode.NGMODULE_DECLARATION_IS_STANDALONE, decl.getOriginForDiagnostics(ngModule.rawDeclarations), `${refType} ${decl.node.name.text} is standalone, and cannot be declared in an NgModule. Did you mean to import it instead?`));
                    isPoisoned = true;
                    continue;
                }
                compilationDirectives.set(decl.node, { ...directive, ref: decl });
                if (directive.isPoisoned) {
                    isPoisoned = true;
                }
            }
            else if (pipe !== null) {
                if (pipe.isStandalone) {
                    diagnostics.push(checker.makeDiagnostic(checker.ErrorCode.NGMODULE_DECLARATION_IS_STANDALONE, decl.getOriginForDiagnostics(ngModule.rawDeclarations), `Pipe ${decl.node.name.text} is standalone, and cannot be declared in an NgModule. Did you mean to import it instead?`));
                    isPoisoned = true;
                    continue;
                }
                compilationPipes.set(decl.node, { ...pipe, ref: decl });
            }
            else {
                const errorNode = decl.getOriginForDiagnostics(ngModule.rawDeclarations);
                diagnostics.push(checker.makeDiagnostic(checker.ErrorCode.NGMODULE_INVALID_DECLARATION, errorNode, `The class '${decl.node.name.text}' is listed in the declarations ` +
                    `of the NgModule '${ngModule.ref.node.name.text}', but is not a directive, a component, or a pipe. ` +
                    `Either remove it from the NgModule's declarations, or add an appropriate Angular decorator.`, [checker.makeRelatedInformation(decl.node.name, `'${decl.node.name.text}' is declared here.`)]));
                isPoisoned = true;
                continue;
            }
            declared.add(decl.node);
        }
        // 3) process exports.
        // Exports can contain modules, components, or directives. They're processed differently.
        // Modules are straightforward. Directives and pipes from exported modules are added to the
        // export maps. Directives/pipes are different - they might be exports of declared types or
        // imported types.
        for (const decl of ngModule.exports) {
            // Attempt to resolve decl as an NgModule.
            const exportScope = this.getExportedScope(decl, diagnostics, ref.node, 'export');
            if (exportScope === 'invalid' ||
                exportScope === 'cycle' ||
                (exportScope !== null && exportScope.exported.isPoisoned)) {
                // An export was an NgModule but contained errors of its own. Record this as an error too,
                // because this scope is always going to be incorrect if one of its exports could not be
                // read.
                isPoisoned = true;
                // Prevent the module from reporting a diagnostic about itself when there's a cycle.
                if (exportScope !== 'cycle') {
                    diagnostics.push(invalidTransitiveNgModuleRef(decl, ngModule.rawExports, 'export'));
                }
                if (exportScope === 'invalid' || exportScope === 'cycle') {
                    continue;
                }
            }
            else if (exportScope !== null) {
                // decl is an NgModule.
                for (const dep of exportScope.exported.dependencies) {
                    if (dep.kind == checker.MetaKind.Directive) {
                        exportDirectives.set(dep.ref.node, dep);
                    }
                    else if (dep.kind === checker.MetaKind.Pipe) {
                        exportPipes.set(dep.ref.node, dep);
                    }
                }
            }
            else if (compilationDirectives.has(decl.node)) {
                // decl is a directive or component in the compilation scope of this NgModule.
                const directive = compilationDirectives.get(decl.node);
                exportDirectives.set(decl.node, directive);
            }
            else if (compilationPipes.has(decl.node)) {
                // decl is a pipe in the compilation scope of this NgModule.
                const pipe = compilationPipes.get(decl.node);
                exportPipes.set(decl.node, pipe);
            }
            else {
                // decl is an unknown export.
                const dirMeta = this.fullReader.getDirectiveMetadata(decl);
                const pipeMeta = this.fullReader.getPipeMetadata(decl);
                if (dirMeta !== null || pipeMeta !== null) {
                    const isStandalone = dirMeta !== null ? dirMeta.isStandalone : pipeMeta.isStandalone;
                    diagnostics.push(invalidReexport(decl, ngModule.rawExports, isStandalone));
                }
                else {
                    diagnostics.push(invalidRef(decl, ngModule.rawExports, 'export'));
                }
                isPoisoned = true;
                continue;
            }
        }
        const exported = {
            dependencies: [...exportDirectives.values(), ...exportPipes.values()],
            isPoisoned,
        };
        const reexports = this.getReexports(ngModule, ref, declared, exported.dependencies, diagnostics);
        // Finally, produce the `LocalModuleScope` with both the compilation and export scopes.
        const scope = {
            kind: checker.ComponentScopeKind.NgModule,
            ngModule: ngModule.ref.node,
            compilation: {
                dependencies: [...compilationDirectives.values(), ...compilationPipes.values()],
                isPoisoned,
            },
            exported,
            reexports,
            schemas: ngModule.schemas,
        };
        // Check if this scope had any errors during production.
        if (diagnostics.length > 0) {
            // Save the errors for retrieval.
            this.scopeErrors.set(ref.node, diagnostics);
            // Mark this module as being tainted.
            this.modulesWithStructuralErrors.add(ref.node);
        }
        this.cache.set(ref.node, scope);
        return scope;
    }
    /**
     * Check whether a component requires remote scoping.
     */
    getRemoteScope(node) {
        return this.remoteScoping.has(node) ? this.remoteScoping.get(node) : null;
    }
    /**
     * Set a component as requiring remote scoping, with the given directives and pipes to be
     * registered remotely.
     */
    setComponentRemoteScope(node, directives, pipes) {
        this.remoteScoping.set(node, { directives, pipes });
    }
    /**
     * Look up the `ExportScope` of a given `Reference` to an NgModule.
     *
     * The NgModule in question may be declared locally in the current ts.Program, or it may be
     * declared in a .d.ts file.
     *
     * @returns `null` if no scope could be found, or `'invalid'` if the `Reference` is not a valid
     *     NgModule.
     *
     * May also contribute diagnostics of its own by adding to the given `diagnostics`
     * array parameter.
     */
    getExportedScope(ref, diagnostics, ownerForErrors, type) {
        if (ref.node.getSourceFile().isDeclarationFile) {
            // The NgModule is declared in a .d.ts file. Resolve it with the `DependencyScopeReader`.
            if (!ts.isClassDeclaration(ref.node)) {
                // The NgModule is in a .d.ts file but is not declared as a ts.ClassDeclaration. This is an
                // error in the .d.ts metadata.
                const code = type === 'import' ? checker.ErrorCode.NGMODULE_INVALID_IMPORT : checker.ErrorCode.NGMODULE_INVALID_EXPORT;
                diagnostics.push(checker.makeDiagnostic(code, checker.identifierOfNode(ref.node) || ref.node, `Appears in the NgModule.${type}s of ${checker.nodeNameForError(ownerForErrors)}, but could not be resolved to an NgModule`));
                return 'invalid';
            }
            return this.dependencyScopeReader.resolve(ref);
        }
        else {
            if (this.cache.get(ref.node) === IN_PROGRESS_RESOLUTION) {
                diagnostics.push(checker.makeDiagnostic(type === 'import'
                    ? checker.ErrorCode.NGMODULE_INVALID_IMPORT
                    : checker.ErrorCode.NGMODULE_INVALID_EXPORT, checker.identifierOfNode(ref.node) || ref.node, `NgModule "${type}" field contains a cycle`));
                return 'cycle';
            }
            // The NgModule is declared locally in the current program. Resolve it from the registry.
            return this.getScopeOfModuleReference(ref);
        }
    }
    getReexports(ngModule, ref, declared, exported, diagnostics) {
        let reexports = null;
        const sourceFile = ref.node.getSourceFile();
        if (this.aliasingHost === null) {
            return null;
        }
        reexports = [];
        // Track re-exports by symbol name, to produce diagnostics if two alias re-exports would share
        // the same name.
        const reexportMap = new Map();
        // Alias ngModuleRef added for readability below.
        const ngModuleRef = ref;
        const addReexport = (exportRef) => {
            if (exportRef.node.getSourceFile() === sourceFile) {
                return;
            }
            const isReExport = !declared.has(exportRef.node);
            const exportName = this.aliasingHost.maybeAliasSymbolAs(exportRef, sourceFile, ngModule.ref.node.name.text, isReExport);
            if (exportName === null) {
                return;
            }
            if (!reexportMap.has(exportName)) {
                if (exportRef.alias && exportRef.alias instanceof checker.ExternalExpr) {
                    reexports.push({
                        fromModule: exportRef.alias.value.moduleName,
                        symbolName: exportRef.alias.value.name,
                        asAlias: exportName,
                    });
                }
                else {
                    const emittedRef = this.refEmitter.emit(exportRef.cloneWithNoIdentifiers(), sourceFile);
                    checker.assertSuccessfulReferenceEmit(emittedRef, ngModuleRef.node.name, 'class');
                    const expr = emittedRef.expression;
                    if (!(expr instanceof checker.ExternalExpr) ||
                        expr.value.moduleName === null ||
                        expr.value.name === null) {
                        throw new Error('Expected ExternalExpr');
                    }
                    reexports.push({
                        fromModule: expr.value.moduleName,
                        symbolName: expr.value.name,
                        asAlias: exportName,
                    });
                }
                reexportMap.set(exportName, exportRef);
            }
            else {
                // Another re-export already used this name. Produce a diagnostic.
                const prevRef = reexportMap.get(exportName);
                diagnostics.push(reexportCollision(ngModuleRef.node, prevRef, exportRef));
            }
        };
        for (const { ref } of exported) {
            addReexport(ref);
        }
        return reexports;
    }
    assertCollecting() {
        if (this.sealed) {
            throw new Error(`Assertion: LocalModuleScopeRegistry is not COLLECTING`);
        }
    }
}
/**
 * Produce a `ts.Diagnostic` for an invalid import or export from an NgModule.
 */
function invalidRef(decl, rawExpr, type) {
    const code = type === 'import' ? checker.ErrorCode.NGMODULE_INVALID_IMPORT : checker.ErrorCode.NGMODULE_INVALID_EXPORT;
    const resolveTarget = type === 'import' ? 'NgModule' : 'NgModule, Component, Directive, or Pipe';
    const message = `'${decl.node.name.text}' does not appear to be an ${resolveTarget} class.`;
    const library = decl.ownedByModuleGuess !== null ? ` (${decl.ownedByModuleGuess})` : '';
    const sf = decl.node.getSourceFile();
    let relatedMessage;
    // Provide extra context to the error for the user.
    if (!sf.isDeclarationFile) {
        // This is a file in the user's program. Highlight the class as undecorated.
        const annotationType = type === 'import' ? '@NgModule' : 'Angular';
        relatedMessage = `Is it missing an ${annotationType} annotation?`;
    }
    else if (sf.fileName.indexOf('node_modules') !== -1) {
        // This file comes from a third-party library in node_modules.
        relatedMessage =
            `This likely means that the library${library} which declares ${decl.debugName} is not ` +
                'compatible with Angular Ivy. Check if a newer version of the library is available, ' +
                "and update if so. Also consider checking with the library's authors to see if the " +
                'library is expected to be compatible with Ivy.';
    }
    else {
        // This is a monorepo style local dependency. Unfortunately these are too different to really
        // offer much more advice than this.
        relatedMessage = `This likely means that the dependency${library} which declares ${decl.debugName} is not compatible with Angular Ivy.`;
    }
    return checker.makeDiagnostic(code, getDiagnosticNode(decl, rawExpr), message, [
        checker.makeRelatedInformation(decl.node.name, relatedMessage),
    ]);
}
/**
 * Produce a `ts.Diagnostic` for an import or export which itself has errors.
 */
function invalidTransitiveNgModuleRef(decl, rawExpr, type) {
    const code = type === 'import' ? checker.ErrorCode.NGMODULE_INVALID_IMPORT : checker.ErrorCode.NGMODULE_INVALID_EXPORT;
    return checker.makeDiagnostic(code, getDiagnosticNode(decl, rawExpr), `This ${type} contains errors, which may affect components that depend on this NgModule.`);
}
/**
 * Produce a `ts.Diagnostic` for an exported directive or pipe which was not declared or imported
 * by the NgModule in question.
 */
function invalidReexport(decl, rawExpr, isStandalone) {
    // The root error is the same here - this export is not valid. Give a helpful error message based
    // on the specific circumstance.
    let message = `Can't be exported from this NgModule, as `;
    if (isStandalone) {
        // Standalone types need to be imported into an NgModule before they can be re-exported.
        message += 'it must be imported first';
    }
    else if (decl.node.getSourceFile().isDeclarationFile) {
        // Non-standalone types can be re-exported, but need to be imported into the NgModule first.
        // This requires importing their own NgModule.
        message += 'it must be imported via its NgModule first';
    }
    else {
        // Local non-standalone types must either be declared directly by this NgModule, or imported as
        // above.
        message +=
            'it must be either declared by this NgModule, or imported here via its NgModule first';
    }
    return checker.makeDiagnostic(checker.ErrorCode.NGMODULE_INVALID_REEXPORT, getDiagnosticNode(decl, rawExpr), message);
}
/**
 * Produce a `ts.Diagnostic` for a collision in re-export names between two directives/pipes.
 */
function reexportCollision(module, refA, refB) {
    const childMessageText = `This directive/pipe is part of the exports of '${module.name.text}' and shares the same name as another exported directive/pipe.`;
    return checker.makeDiagnostic(checker.ErrorCode.NGMODULE_REEXPORT_NAME_COLLISION, module.name, `
    There was a name collision between two classes named '${refA.node.name.text}', which are both part of the exports of '${module.name.text}'.

    Angular generates re-exports of an NgModule's exported directives/pipes from the module's source file in certain cases, using the declared name of the class. If two classes of the same name are exported, this automatic naming does not work.

    To fix this problem please re-export one or both classes directly from this file.
  `.trim(), [
        checker.makeRelatedInformation(refA.node.name, childMessageText),
        checker.makeRelatedInformation(refB.node.name, childMessageText),
    ]);
}

/**
 * Computes scope information to be used in template type checking.
 */
class TypeCheckScopeRegistry {
    scopeReader;
    metaReader;
    hostDirectivesResolver;
    /**
     * Cache of flattened directive metadata. Because flattened metadata is scope-invariant it's
     * cached individually, such that all scopes refer to the same flattened metadata.
     */
    flattenedDirectiveMetaCache = new Map();
    /**
     * Cache of the computed type check scope per NgModule declaration.
     */
    scopeCache = new Map();
    constructor(scopeReader, metaReader, hostDirectivesResolver) {
        this.scopeReader = scopeReader;
        this.metaReader = metaReader;
        this.hostDirectivesResolver = hostDirectivesResolver;
    }
    /**
     * Computes the type-check scope information for the component declaration. If the NgModule
     * contains an error, then 'error' is returned. If the component is not declared in any NgModule,
     * an empty type-check scope is returned.
     */
    getTypeCheckScope(node) {
        const matcher = new checker.SelectorMatcher();
        const directives = [];
        const pipes = new Map();
        const scope = this.scopeReader.getScopeForComponent(node);
        if (scope === null) {
            return {
                matcher,
                directives,
                pipes,
                schemas: [],
                isPoisoned: false,
            };
        }
        const isNgModuleScope = scope.kind === checker.ComponentScopeKind.NgModule;
        const cacheKey = isNgModuleScope ? scope.ngModule : scope.component;
        const dependencies = isNgModuleScope ? scope.compilation.dependencies : scope.dependencies;
        if (this.scopeCache.has(cacheKey)) {
            return this.scopeCache.get(cacheKey);
        }
        let allDependencies = dependencies;
        if (!isNgModuleScope &&
            Array.isArray(scope.deferredDependencies) &&
            scope.deferredDependencies.length > 0) {
            allDependencies = [...allDependencies, ...scope.deferredDependencies];
        }
        for (const meta of allDependencies) {
            if (meta.kind === checker.MetaKind.Directive && meta.selector !== null) {
                const extMeta = this.getTypeCheckDirectiveMetadata(meta.ref);
                if (extMeta === null) {
                    continue;
                }
                // Carry over the `isExplicitlyDeferred` flag from the dependency info.
                const directiveMeta = this.applyExplicitlyDeferredFlag(extMeta, meta.isExplicitlyDeferred);
                matcher.addSelectables(checker.CssSelector.parse(meta.selector), [
                    ...this.hostDirectivesResolver.resolve(directiveMeta),
                    directiveMeta,
                ]);
                directives.push(directiveMeta);
            }
            else if (meta.kind === checker.MetaKind.Pipe) {
                if (!ts.isClassDeclaration(meta.ref.node)) {
                    throw new Error(`Unexpected non-class declaration ${ts.SyntaxKind[meta.ref.node.kind]} for pipe ${meta.ref.debugName}`);
                }
                pipes.set(meta.name, meta);
            }
        }
        const typeCheckScope = {
            matcher,
            directives,
            pipes,
            schemas: scope.schemas,
            isPoisoned: scope.kind === checker.ComponentScopeKind.NgModule
                ? scope.compilation.isPoisoned || scope.exported.isPoisoned
                : scope.isPoisoned,
        };
        this.scopeCache.set(cacheKey, typeCheckScope);
        return typeCheckScope;
    }
    getTypeCheckDirectiveMetadata(ref) {
        const clazz = ref.node;
        if (this.flattenedDirectiveMetaCache.has(clazz)) {
            return this.flattenedDirectiveMetaCache.get(clazz);
        }
        const meta = checker.flattenInheritedDirectiveMetadata(this.metaReader, ref);
        if (meta === null) {
            return null;
        }
        this.flattenedDirectiveMetaCache.set(clazz, meta);
        return meta;
    }
    applyExplicitlyDeferredFlag(meta, isExplicitlyDeferred) {
        return isExplicitlyDeferred === true ? { ...meta, isExplicitlyDeferred } : meta;
    }
}

/**
 * Represents an Angular directive. Components are represented by `ComponentSymbol`, which inherits
 * from this symbol.
 */
class DirectiveSymbol extends SemanticSymbol {
    selector;
    inputs;
    outputs;
    exportAs;
    typeCheckMeta;
    typeParameters;
    baseClass = null;
    constructor(decl, selector, inputs, outputs, exportAs, typeCheckMeta, typeParameters) {
        super(decl);
        this.selector = selector;
        this.inputs = inputs;
        this.outputs = outputs;
        this.exportAs = exportAs;
        this.typeCheckMeta = typeCheckMeta;
        this.typeParameters = typeParameters;
    }
    isPublicApiAffected(previousSymbol) {
        // Note: since components and directives have exactly the same items contributing to their
        // public API, it is okay for a directive to change into a component and vice versa without
        // the API being affected.
        if (!(previousSymbol instanceof DirectiveSymbol)) {
            return true;
        }
        // Directives and components have a public API of:
        //  1. Their selector.
        //  2. The bi   nding names of their inputs and outputs; a change in ordering is also considered
        //     to be a change in public API.
        //  3. The list of exportAs names and its ordering.
        return (this.selector !== previousSymbol.selector ||
            !isArrayEqual(this.inputs.propertyNames, previousSymbol.inputs.propertyNames) ||
            !isArrayEqual(this.outputs.propertyNames, previousSymbol.outputs.propertyNames) ||
            !isArrayEqual(this.exportAs, previousSymbol.exportAs));
    }
    isTypeCheckApiAffected(previousSymbol) {
        // If the public API of the directive has changed, then so has its type-check API.
        if (this.isPublicApiAffected(previousSymbol)) {
            return true;
        }
        if (!(previousSymbol instanceof DirectiveSymbol)) {
            return true;
        }
        // The type-check block also depends on the class property names, as writes property bindings
        // directly into the backing fields.
        if (!isArrayEqual(Array.from(this.inputs), Array.from(previousSymbol.inputs), isInputMappingEqual) ||
            !isArrayEqual(Array.from(this.outputs), Array.from(previousSymbol.outputs), isInputOrOutputEqual)) {
            return true;
        }
        // The type parameters of a directive are emitted into the type constructors in the type-check
        // block of a component, so if the type parameters are not considered equal then consider the
        // type-check API of this directive to be affected.
        if (!areTypeParametersEqual(this.typeParameters, previousSymbol.typeParameters)) {
            return true;
        }
        // The type-check metadata is used during TCB code generation, so any changes should invalidate
        // prior type-check files.
        if (!isTypeCheckMetaEqual(this.typeCheckMeta, previousSymbol.typeCheckMeta)) {
            return true;
        }
        // Changing the base class of a directive means that its inputs/outputs etc may have changed,
        // so the type-check block of components that use this directive needs to be regenerated.
        if (!isBaseClassEqual(this.baseClass, previousSymbol.baseClass)) {
            return true;
        }
        return false;
    }
}
function isInputMappingEqual(current, previous) {
    return isInputOrOutputEqual(current, previous) && current.required === previous.required;
}
function isInputOrOutputEqual(current, previous) {
    return (current.classPropertyName === previous.classPropertyName &&
        current.bindingPropertyName === previous.bindingPropertyName &&
        current.isSignal === previous.isSignal);
}
function isTypeCheckMetaEqual(current, previous) {
    if (current.hasNgTemplateContextGuard !== previous.hasNgTemplateContextGuard) {
        return false;
    }
    if (current.isGeneric !== previous.isGeneric) {
        // Note: changes in the number of type parameters is also considered in
        // `areTypeParametersEqual` so this check is technically not needed; it is done anyway for
        // completeness in terms of whether the `DirectiveTypeCheckMeta` struct itself compares
        // equal or not.
        return false;
    }
    if (!isArrayEqual(current.ngTemplateGuards, previous.ngTemplateGuards, isTemplateGuardEqual)) {
        return false;
    }
    if (!isSetEqual(current.coercedInputFields, previous.coercedInputFields)) {
        return false;
    }
    if (!isSetEqual(current.restrictedInputFields, previous.restrictedInputFields)) {
        return false;
    }
    if (!isSetEqual(current.stringLiteralInputFields, previous.stringLiteralInputFields)) {
        return false;
    }
    if (!isSetEqual(current.undeclaredInputFields, previous.undeclaredInputFields)) {
        return false;
    }
    return true;
}
function isTemplateGuardEqual(current, previous) {
    return current.inputName === previous.inputName && current.type === previous.type;
}
function isBaseClassEqual(current, previous) {
    if (current === null || previous === null) {
        return current === previous;
    }
    return isSymbolEqual(current, previous);
}

const FIELD_DECORATORS = [
    'Input',
    'Output',
    'ViewChild',
    'ViewChildren',
    'ContentChild',
    'ContentChildren',
    'HostBinding',
    'HostListener',
];
const LIFECYCLE_HOOKS = new Set([
    'ngOnChanges',
    'ngOnInit',
    'ngOnDestroy',
    'ngDoCheck',
    'ngAfterViewInit',
    'ngAfterViewChecked',
    'ngAfterContentInit',
    'ngAfterContentChecked',
]);
class DirectiveDecoratorHandler {
    reflector;
    evaluator;
    metaRegistry;
    scopeRegistry;
    metaReader;
    injectableRegistry;
    refEmitter;
    referencesRegistry;
    isCore;
    strictCtorDeps;
    semanticDepGraphUpdater;
    annotateForClosureCompiler;
    perf;
    importTracker;
    includeClassMetadata;
    compilationMode;
    jitDeclarationRegistry;
    strictStandalone;
    implicitStandaloneValue;
    constructor(reflector, evaluator, metaRegistry, scopeRegistry, metaReader, injectableRegistry, refEmitter, referencesRegistry, isCore, strictCtorDeps, semanticDepGraphUpdater, annotateForClosureCompiler, perf, importTracker, includeClassMetadata, compilationMode, jitDeclarationRegistry, strictStandalone, implicitStandaloneValue) {
        this.reflector = reflector;
        this.evaluator = evaluator;
        this.metaRegistry = metaRegistry;
        this.scopeRegistry = scopeRegistry;
        this.metaReader = metaReader;
        this.injectableRegistry = injectableRegistry;
        this.refEmitter = refEmitter;
        this.referencesRegistry = referencesRegistry;
        this.isCore = isCore;
        this.strictCtorDeps = strictCtorDeps;
        this.semanticDepGraphUpdater = semanticDepGraphUpdater;
        this.annotateForClosureCompiler = annotateForClosureCompiler;
        this.perf = perf;
        this.importTracker = importTracker;
        this.includeClassMetadata = includeClassMetadata;
        this.compilationMode = compilationMode;
        this.jitDeclarationRegistry = jitDeclarationRegistry;
        this.strictStandalone = strictStandalone;
        this.implicitStandaloneValue = implicitStandaloneValue;
    }
    precedence = checker.HandlerPrecedence.PRIMARY;
    name = 'DirectiveDecoratorHandler';
    detect(node, decorators) {
        // If a class is undecorated but uses Angular features, we detect it as an
        // abstract directive. This is an unsupported pattern as of v10, but we want
        // to still detect these patterns so that we can report diagnostics.
        if (!decorators) {
            const angularField = this.findClassFieldWithAngularFeatures(node);
            return angularField
                ? { trigger: angularField.node, decorator: null, metadata: null }
                : undefined;
        }
        else {
            const decorator = checker.findAngularDecorator(decorators, 'Directive', this.isCore);
            return decorator ? { trigger: decorator.node, decorator, metadata: decorator } : undefined;
        }
    }
    analyze(node, decorator) {
        // Skip processing of the class declaration if compilation of undecorated classes
        // with Angular features is disabled. Previously in ngtsc, such classes have always
        // been processed, but we want to enforce a consistent decorator mental model.
        // See: https://v9.angular.io/guide/migration-undecorated-classes.
        if (decorator === null) {
            // If compiling @angular/core, skip the diagnostic as core occasionally hand-writes
            // definitions.
            if (this.isCore) {
                return {};
            }
            return { diagnostics: [checker.getUndecoratedClassWithAngularFeaturesDiagnostic(node)] };
        }
        this.perf.eventCount(checker.PerfEvent.AnalyzeDirective);
        const directiveResult = checker.extractDirectiveMetadata(node, decorator, this.reflector, this.importTracker, this.evaluator, this.refEmitter, this.referencesRegistry, this.isCore, this.annotateForClosureCompiler, this.compilationMode, 
        /* defaultSelector */ null, this.strictStandalone, this.implicitStandaloneValue);
        // `extractDirectiveMetadata` returns `jitForced = true` when the `@Directive` has
        // set `jit: true`. In this case, compilation of the decorator is skipped. Returning
        // an empty object signifies that no analysis was produced.
        if (directiveResult.jitForced) {
            this.jitDeclarationRegistry.jitDeclarations.add(node);
            return {};
        }
        const analysis = directiveResult.metadata;
        let providersRequiringFactory = null;
        if (directiveResult !== undefined && directiveResult.decorator.has('providers')) {
            providersRequiringFactory = checker.resolveProvidersRequiringFactory(directiveResult.decorator.get('providers'), this.reflector, this.evaluator);
        }
        return {
            analysis: {
                inputs: directiveResult.inputs,
                inputFieldNamesFromMetadataArray: directiveResult.inputFieldNamesFromMetadataArray,
                outputs: directiveResult.outputs,
                meta: analysis,
                hostDirectives: directiveResult.hostDirectives,
                rawHostDirectives: directiveResult.rawHostDirectives,
                classMetadata: this.includeClassMetadata
                    ? extractClassMetadata(node, this.reflector, this.isCore, this.annotateForClosureCompiler)
                    : null,
                baseClass: checker.readBaseClass(node, this.reflector, this.evaluator),
                typeCheckMeta: checker.extractDirectiveTypeCheckMeta(node, directiveResult.inputs, this.reflector),
                providersRequiringFactory,
                isPoisoned: false,
                isStructural: directiveResult.isStructural,
                decorator: decorator?.node ?? null,
            },
        };
    }
    symbol(node, analysis) {
        const typeParameters = extractSemanticTypeParameters(node);
        return new DirectiveSymbol(node, analysis.meta.selector, analysis.inputs, analysis.outputs, analysis.meta.exportAs, analysis.typeCheckMeta, typeParameters);
    }
    register(node, analysis) {
        // Register this directive's information with the `MetadataRegistry`. This ensures that
        // the information about the directive is available during the compile() phase.
        const ref = new checker.Reference(node);
        this.metaRegistry.registerDirectiveMetadata({
            kind: checker.MetaKind.Directive,
            matchSource: checker.MatchSource.Selector,
            ref,
            name: node.name.text,
            selector: analysis.meta.selector,
            exportAs: analysis.meta.exportAs,
            inputs: analysis.inputs,
            inputFieldNamesFromMetadataArray: analysis.inputFieldNamesFromMetadataArray,
            outputs: analysis.outputs,
            queries: analysis.meta.queries.map((query) => query.propertyName),
            isComponent: false,
            baseClass: analysis.baseClass,
            hostDirectives: analysis.hostDirectives,
            ...analysis.typeCheckMeta,
            isPoisoned: analysis.isPoisoned,
            isStructural: analysis.isStructural,
            animationTriggerNames: null,
            isStandalone: analysis.meta.isStandalone,
            isSignal: analysis.meta.isSignal,
            imports: null,
            rawImports: null,
            deferredImports: null,
            schemas: null,
            ngContentSelectors: null,
            decorator: analysis.decorator,
            preserveWhitespaces: false,
            // Directives analyzed within our own compilation are not _assumed_ to export providers.
            // Instead, we statically analyze their imports to make a direct determination.
            assumedToExportProviders: false,
            isExplicitlyDeferred: false,
        });
        this.injectableRegistry.registerInjectable(node, {
            ctorDeps: analysis.meta.deps,
        });
    }
    resolve(node, analysis, symbol) {
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            return {};
        }
        if (this.semanticDepGraphUpdater !== null && analysis.baseClass instanceof checker.Reference) {
            symbol.baseClass = this.semanticDepGraphUpdater.getSymbol(analysis.baseClass.node);
        }
        const diagnostics = [];
        if (analysis.providersRequiringFactory !== null &&
            analysis.meta.providers instanceof checker.WrappedNodeExpr) {
            const providerDiagnostics = checker.getProviderDiagnostics(analysis.providersRequiringFactory, analysis.meta.providers.node, this.injectableRegistry);
            diagnostics.push(...providerDiagnostics);
        }
        const directiveDiagnostics = checker.getDirectiveDiagnostics(node, this.injectableRegistry, this.evaluator, this.reflector, this.scopeRegistry, this.strictCtorDeps, 'Directive');
        if (directiveDiagnostics !== null) {
            diagnostics.push(...directiveDiagnostics);
        }
        const hostDirectivesDiagnotics = analysis.hostDirectives && analysis.rawHostDirectives
            ? checker.validateHostDirectives(analysis.rawHostDirectives, analysis.hostDirectives, this.metaReader)
            : null;
        if (hostDirectivesDiagnotics !== null) {
            diagnostics.push(...hostDirectivesDiagnotics);
        }
        return { diagnostics: diagnostics.length > 0 ? diagnostics : undefined };
    }
    compileFull(node, analysis, resolution, pool) {
        const fac = compileNgFactoryDefField(checker.toFactoryMetadata(analysis.meta, checker.FactoryTarget.Directive));
        const def = checker.compileDirectiveFromMetadata(analysis.meta, pool, checker.makeBindingParser());
        const inputTransformFields = compileInputTransformFields(analysis.inputs);
        const classMetadata = analysis.classMetadata !== null
            ? compileClassMetadata(analysis.classMetadata).toStmt()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵdir', inputTransformFields, null /* deferrableImports */);
    }
    compilePartial(node, analysis, resolution) {
        const fac = compileDeclareFactory(checker.toFactoryMetadata(analysis.meta, checker.FactoryTarget.Directive));
        const def = compileDeclareDirectiveFromMetadata(analysis.meta);
        const inputTransformFields = compileInputTransformFields(analysis.inputs);
        const classMetadata = analysis.classMetadata !== null
            ? compileDeclareClassMetadata(analysis.classMetadata).toStmt()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵdir', inputTransformFields, null /* deferrableImports */);
    }
    compileLocal(node, analysis, resolution, pool) {
        const fac = compileNgFactoryDefField(checker.toFactoryMetadata(analysis.meta, checker.FactoryTarget.Directive));
        const def = checker.compileDirectiveFromMetadata(analysis.meta, pool, checker.makeBindingParser());
        const inputTransformFields = compileInputTransformFields(analysis.inputs);
        const classMetadata = analysis.classMetadata !== null
            ? compileClassMetadata(analysis.classMetadata).toStmt()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵdir', inputTransformFields, null /* deferrableImports */);
    }
    /**
     * Checks if a given class uses Angular features and returns the TypeScript node
     * that indicated the usage. Classes are considered using Angular features if they
     * contain class members that are either decorated with a known Angular decorator,
     * or if they correspond to a known Angular lifecycle hook.
     */
    findClassFieldWithAngularFeatures(node) {
        return this.reflector.getMembersOfClass(node).find((member) => {
            if (!member.isStatic &&
                member.kind === checker.ClassMemberKind.Method &&
                LIFECYCLE_HOOKS.has(member.name)) {
                return true;
            }
            if (member.decorators) {
                return member.decorators.some((decorator) => FIELD_DECORATORS.some((decoratorName) => checker.isAngularDecorator(decorator, decoratorName, this.isCore)));
            }
            return false;
        });
    }
}

/**
 * Creates a foreign function resolver to detect a `ModuleWithProviders<T>` type in a return type
 * position of a function or method declaration. A `SyntheticValue` is produced if such a return
 * type is recognized.
 *
 * @param reflector The reflection host to use for analyzing the syntax.
 * @param isCore Whether the @angular/core package is being compiled.
 */
function createModuleWithProvidersResolver(reflector, isCore) {
    /**
     * Retrieve an `NgModule` identifier (T) from the specified `type`, if it is of the form:
     * `ModuleWithProviders<T>`
     * @param type The type to reflect on.
     * @returns the identifier of the NgModule type if found, or null otherwise.
     */
    function _reflectModuleFromTypeParam(type, node) {
        // Examine the type of the function to see if it's a ModuleWithProviders reference.
        if (!ts.isTypeReferenceNode(type)) {
            return null;
        }
        const typeName = (type &&
            ((ts.isIdentifier(type.typeName) && type.typeName) ||
                (ts.isQualifiedName(type.typeName) && type.typeName.right))) ||
            null;
        if (typeName === null) {
            return null;
        }
        // Look at the type itself to see where it comes from.
        const id = reflector.getImportOfIdentifier(typeName);
        // If it's not named ModuleWithProviders, bail.
        if (id === null || id.name !== 'ModuleWithProviders') {
            return null;
        }
        // If it's not from @angular/core, bail.
        if (!isCore && id.from !== '@angular/core') {
            return null;
        }
        // If there's no type parameter specified, bail.
        if (type.typeArguments === undefined || type.typeArguments.length !== 1) {
            const parent = ts.isMethodDeclaration(node) && ts.isClassDeclaration(node.parent) ? node.parent : null;
            const symbolName = (parent && parent.name ? parent.name.getText() + '.' : '') +
                (node.name ? node.name.getText() : 'anonymous');
            throw new checker.FatalDiagnosticError(checker.ErrorCode.NGMODULE_MODULE_WITH_PROVIDERS_MISSING_GENERIC, type, `${symbolName} returns a ModuleWithProviders type without a generic type argument. ` +
                `Please add a generic type argument to the ModuleWithProviders type. If this ` +
                `occurrence is in library code you don't control, please contact the library authors.`);
        }
        const arg = type.typeArguments[0];
        return checker.typeNodeToValueExpr(arg);
    }
    /**
     * Retrieve an `NgModule` identifier (T) from the specified `type`, if it is of the form:
     * `A|B|{ngModule: T}|C`.
     * @param type The type to reflect on.
     * @returns the identifier of the NgModule type if found, or null otherwise.
     */
    function _reflectModuleFromLiteralType(type) {
        if (!ts.isIntersectionTypeNode(type)) {
            return null;
        }
        for (const t of type.types) {
            if (ts.isTypeLiteralNode(t)) {
                for (const m of t.members) {
                    const ngModuleType = (ts.isPropertySignature(m) &&
                        ts.isIdentifier(m.name) &&
                        m.name.text === 'ngModule' &&
                        m.type) ||
                        null;
                    let ngModuleExpression = null;
                    // Handle `: typeof X` or `: X` cases.
                    if (ngModuleType !== null && ts.isTypeQueryNode(ngModuleType)) {
                        ngModuleExpression = checker.entityNameToValue(ngModuleType.exprName);
                    }
                    else if (ngModuleType !== null) {
                        ngModuleExpression = checker.typeNodeToValueExpr(ngModuleType);
                    }
                    if (ngModuleExpression) {
                        return ngModuleExpression;
                    }
                }
            }
        }
        return null;
    }
    return (fn, callExpr, resolve, unresolvable) => {
        const rawType = fn.node.type;
        if (rawType === undefined) {
            return unresolvable;
        }
        const type = _reflectModuleFromTypeParam(rawType, fn.node) ?? _reflectModuleFromLiteralType(rawType);
        if (type === null) {
            return unresolvable;
        }
        const ngModule = resolve(type);
        if (!(ngModule instanceof checker.Reference) || !checker.isNamedClassDeclaration(ngModule.node)) {
            return unresolvable;
        }
        return new checker.SyntheticValue({
            ngModule: ngModule,
            mwpCall: callExpr,
        });
    };
}
function isResolvedModuleWithProviders(sv) {
    return (typeof sv.value === 'object' &&
        sv.value != null &&
        sv.value.hasOwnProperty('ngModule') &&
        sv.value.hasOwnProperty('mwpCall'));
}

/**
 * Represents an Angular NgModule.
 */
class NgModuleSymbol extends SemanticSymbol {
    hasProviders;
    remotelyScopedComponents = [];
    /**
     * `SemanticSymbol`s of the transitive imports of this NgModule which came from imported
     * standalone components.
     *
     * Standalone components are excluded/included in the `InjectorDef` emit output of the NgModule
     * based on whether the compiler can prove that their transitive imports may contain exported
     * providers, so a change in this set of symbols may affect the compilation output of this
     * NgModule.
     */
    transitiveImportsFromStandaloneComponents = new Set();
    constructor(decl, hasProviders) {
        super(decl);
        this.hasProviders = hasProviders;
    }
    isPublicApiAffected(previousSymbol) {
        if (!(previousSymbol instanceof NgModuleSymbol)) {
            return true;
        }
        // Changes in the provider status of this NgModule affect downstream dependencies, which may
        // consider provider status in their own emits.
        if (previousSymbol.hasProviders !== this.hasProviders) {
            return true;
        }
        return false;
    }
    isEmitAffected(previousSymbol) {
        if (!(previousSymbol instanceof NgModuleSymbol)) {
            return true;
        }
        // compare our remotelyScopedComponents to the previous symbol
        if (previousSymbol.remotelyScopedComponents.length !== this.remotelyScopedComponents.length) {
            return true;
        }
        for (const currEntry of this.remotelyScopedComponents) {
            const prevEntry = previousSymbol.remotelyScopedComponents.find((prevEntry) => {
                return isSymbolEqual(prevEntry.component, currEntry.component);
            });
            if (prevEntry === undefined) {
                // No previous entry was found, which means that this component became remotely scoped and
                // hence this NgModule needs to be re-emitted.
                return true;
            }
            if (!isArrayEqual(currEntry.usedDirectives, prevEntry.usedDirectives, isReferenceEqual)) {
                // The list of used directives or their order has changed. Since this NgModule emits
                // references to the list of used directives, it should be re-emitted to update this list.
                // Note: the NgModule does not have to be re-emitted when any of the directives has had
                // their public API changed, as the NgModule only emits a reference to the symbol by its
                // name. Therefore, testing for symbol equality is sufficient.
                return true;
            }
            if (!isArrayEqual(currEntry.usedPipes, prevEntry.usedPipes, isReferenceEqual)) {
                return true;
            }
        }
        if (previousSymbol.transitiveImportsFromStandaloneComponents.size !==
            this.transitiveImportsFromStandaloneComponents.size) {
            return true;
        }
        const previousImports = Array.from(previousSymbol.transitiveImportsFromStandaloneComponents);
        for (const transitiveImport of this.transitiveImportsFromStandaloneComponents) {
            const prevEntry = previousImports.find((prevEntry) => isSymbolEqual(prevEntry, transitiveImport));
            if (prevEntry === undefined) {
                return true;
            }
            if (transitiveImport.isPublicApiAffected(prevEntry)) {
                return true;
            }
        }
        return false;
    }
    isTypeCheckApiAffected(previousSymbol) {
        if (!(previousSymbol instanceof NgModuleSymbol)) {
            return true;
        }
        return false;
    }
    addRemotelyScopedComponent(component, usedDirectives, usedPipes) {
        this.remotelyScopedComponents.push({ component, usedDirectives, usedPipes });
    }
    addTransitiveImportFromStandaloneComponent(importedSymbol) {
        this.transitiveImportsFromStandaloneComponents.add(importedSymbol);
    }
}
/**
 * Compiles @NgModule annotations to ngModuleDef fields.
 */
class NgModuleDecoratorHandler {
    reflector;
    evaluator;
    metaReader;
    metaRegistry;
    scopeRegistry;
    referencesRegistry;
    exportedProviderStatusResolver;
    semanticDepGraphUpdater;
    isCore;
    refEmitter;
    annotateForClosureCompiler;
    onlyPublishPublicTypings;
    injectableRegistry;
    perf;
    includeClassMetadata;
    includeSelectorScope;
    compilationMode;
    localCompilationExtraImportsTracker;
    jitDeclarationRegistry;
    constructor(reflector, evaluator, metaReader, metaRegistry, scopeRegistry, referencesRegistry, exportedProviderStatusResolver, semanticDepGraphUpdater, isCore, refEmitter, annotateForClosureCompiler, onlyPublishPublicTypings, injectableRegistry, perf, includeClassMetadata, includeSelectorScope, compilationMode, localCompilationExtraImportsTracker, jitDeclarationRegistry) {
        this.reflector = reflector;
        this.evaluator = evaluator;
        this.metaReader = metaReader;
        this.metaRegistry = metaRegistry;
        this.scopeRegistry = scopeRegistry;
        this.referencesRegistry = referencesRegistry;
        this.exportedProviderStatusResolver = exportedProviderStatusResolver;
        this.semanticDepGraphUpdater = semanticDepGraphUpdater;
        this.isCore = isCore;
        this.refEmitter = refEmitter;
        this.annotateForClosureCompiler = annotateForClosureCompiler;
        this.onlyPublishPublicTypings = onlyPublishPublicTypings;
        this.injectableRegistry = injectableRegistry;
        this.perf = perf;
        this.includeClassMetadata = includeClassMetadata;
        this.includeSelectorScope = includeSelectorScope;
        this.compilationMode = compilationMode;
        this.localCompilationExtraImportsTracker = localCompilationExtraImportsTracker;
        this.jitDeclarationRegistry = jitDeclarationRegistry;
    }
    precedence = checker.HandlerPrecedence.PRIMARY;
    name = 'NgModuleDecoratorHandler';
    detect(node, decorators) {
        if (!decorators) {
            return undefined;
        }
        const decorator = checker.findAngularDecorator(decorators, 'NgModule', this.isCore);
        if (decorator !== undefined) {
            return {
                trigger: decorator.node,
                decorator: decorator,
                metadata: decorator,
            };
        }
        else {
            return undefined;
        }
    }
    analyze(node, decorator) {
        this.perf.eventCount(checker.PerfEvent.AnalyzeNgModule);
        const name = node.name.text;
        if (decorator.args === null || decorator.args.length > 1) {
            throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_ARITY_WRONG, decorator.node, `Incorrect number of arguments to @NgModule decorator`);
        }
        // @NgModule can be invoked without arguments. In case it is, pretend as if a blank object
        // literal was specified. This simplifies the code below.
        const meta = decorator.args.length === 1
            ? checker.unwrapExpression(decorator.args[0])
            : ts.factory.createObjectLiteralExpression([]);
        if (!ts.isObjectLiteralExpression(meta)) {
            throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_ARG_NOT_LITERAL, meta, '@NgModule argument must be an object literal');
        }
        const ngModule = checker.reflectObjectLiteral(meta);
        if (ngModule.has('jit')) {
            this.jitDeclarationRegistry.jitDeclarations.add(node);
            // The only allowed value is true, so there's no need to expand further.
            return {};
        }
        const forwardRefResolver = checker.createForwardRefResolver(this.isCore);
        const moduleResolvers = checker.combineResolvers([
            createModuleWithProvidersResolver(this.reflector, this.isCore),
            forwardRefResolver,
        ]);
        const diagnostics = [];
        // Resolving declarations
        let declarationRefs = [];
        const rawDeclarations = ngModule.get('declarations') ?? null;
        if (rawDeclarations !== null) {
            const declarationMeta = this.evaluator.evaluate(rawDeclarations, forwardRefResolver);
            declarationRefs = this.resolveTypeList(rawDeclarations, declarationMeta, name, 'declarations', 0, this.compilationMode === checker.CompilationMode.LOCAL).references;
            // Look through the declarations to make sure they're all a part of the current compilation.
            for (const ref of declarationRefs) {
                if (ref.node.getSourceFile().isDeclarationFile) {
                    const errorNode = ref.getOriginForDiagnostics(rawDeclarations);
                    diagnostics.push(checker.makeDiagnostic(checker.ErrorCode.NGMODULE_INVALID_DECLARATION, errorNode, `Cannot declare '${ref.node.name.text}' in an NgModule as it's not a part of the current compilation.`, [checker.makeRelatedInformation(ref.node.name, `'${ref.node.name.text}' is declared here.`)]));
                }
            }
        }
        if (diagnostics.length > 0) {
            return { diagnostics };
        }
        // Resolving imports
        let importRefs = [];
        let rawImports = ngModule.get('imports') ?? null;
        if (rawImports !== null) {
            const importsMeta = this.evaluator.evaluate(rawImports, moduleResolvers);
            const result = this.resolveTypeList(rawImports, importsMeta, name, 'imports', 0, this.compilationMode === checker.CompilationMode.LOCAL);
            if (this.compilationMode === checker.CompilationMode.LOCAL &&
                this.localCompilationExtraImportsTracker !== null) {
                // For generating extra imports in local mode, the NgModule imports that are from external
                // files (i.e., outside of the compilation unit) are to be added to all the files in the
                // compilation unit. This is because any external component that is a dependency of some
                // component in the compilation unit must be imported by one of these NgModule's external
                // imports (or the external component cannot be a dependency of that internal component).
                // This approach can be further optimized by adding these NgModule external imports to a
                // subset of files in the compilation unit and not all. See comments in {@link
                // LocalCompilationExtraImportsTracker} and {@link
                // LocalCompilationExtraImportsTracker#addGlobalImportFromIdentifier} for more details.
                for (const d of result.dynamicValues) {
                    this.localCompilationExtraImportsTracker.addGlobalImportFromIdentifier(d.node);
                }
            }
            importRefs = result.references;
        }
        // Resolving exports
        let exportRefs = [];
        const rawExports = ngModule.get('exports') ?? null;
        if (rawExports !== null) {
            const exportsMeta = this.evaluator.evaluate(rawExports, moduleResolvers);
            exportRefs = this.resolveTypeList(rawExports, exportsMeta, name, 'exports', 0, this.compilationMode === checker.CompilationMode.LOCAL).references;
            this.referencesRegistry.add(node, ...exportRefs);
        }
        // Resolving bootstrap
        let bootstrapRefs = [];
        const rawBootstrap = ngModule.get('bootstrap') ?? null;
        if (this.compilationMode !== checker.CompilationMode.LOCAL && rawBootstrap !== null) {
            const bootstrapMeta = this.evaluator.evaluate(rawBootstrap, forwardRefResolver);
            bootstrapRefs = this.resolveTypeList(rawBootstrap, bootstrapMeta, name, 'bootstrap', 0, 
            /* allowUnresolvedReferences */ false).references;
            // Verify that the `@NgModule.bootstrap` list doesn't have Standalone Components.
            for (const ref of bootstrapRefs) {
                const dirMeta = this.metaReader.getDirectiveMetadata(ref);
                if (dirMeta?.isStandalone) {
                    diagnostics.push(makeStandaloneBootstrapDiagnostic(node, ref, rawBootstrap));
                }
            }
        }
        const schemas = this.compilationMode !== checker.CompilationMode.LOCAL && ngModule.has('schemas')
            ? extractSchemas(ngModule.get('schemas'), this.evaluator, 'NgModule')
            : [];
        let id = null;
        if (ngModule.has('id')) {
            const idExpr = ngModule.get('id');
            if (!isModuleIdExpression(idExpr)) {
                id = new checker.WrappedNodeExpr(idExpr);
            }
            else {
                const diag = checker.makeDiagnostic(checker.ErrorCode.WARN_NGMODULE_ID_UNNECESSARY, idExpr, `Using 'module.id' for NgModule.id is a common anti-pattern that is ignored by the Angular compiler.`);
                diag.category = ts.DiagnosticCategory.Warning;
                diagnostics.push(diag);
            }
        }
        const valueContext = node.getSourceFile();
        const exportedNodes = new Set(exportRefs.map((ref) => ref.node));
        const declarations = [];
        const exportedDeclarations = [];
        const bootstrap = bootstrapRefs.map((bootstrap) => this._toR3Reference(bootstrap.getOriginForDiagnostics(meta, node.name), bootstrap, valueContext));
        for (const ref of declarationRefs) {
            const decl = this._toR3Reference(ref.getOriginForDiagnostics(meta, node.name), ref, valueContext);
            declarations.push(decl);
            if (exportedNodes.has(ref.node)) {
                exportedDeclarations.push(decl.type);
            }
        }
        const imports = importRefs.map((imp) => this._toR3Reference(imp.getOriginForDiagnostics(meta, node.name), imp, valueContext));
        const exports = exportRefs.map((exp) => this._toR3Reference(exp.getOriginForDiagnostics(meta, node.name), exp, valueContext));
        const isForwardReference = (ref) => checker.isExpressionForwardReference(ref.value, node.name, valueContext);
        const containsForwardDecls = bootstrap.some(isForwardReference) ||
            declarations.some(isForwardReference) ||
            imports.some(isForwardReference) ||
            exports.some(isForwardReference);
        const type = checker.wrapTypeReference(this.reflector, node);
        let ngModuleMetadata;
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            ngModuleMetadata = {
                kind: checker.R3NgModuleMetadataKind.Local,
                type,
                bootstrapExpression: rawBootstrap ? new checker.WrappedNodeExpr(rawBootstrap) : null,
                declarationsExpression: rawDeclarations ? new checker.WrappedNodeExpr(rawDeclarations) : null,
                exportsExpression: rawExports ? new checker.WrappedNodeExpr(rawExports) : null,
                importsExpression: rawImports ? new checker.WrappedNodeExpr(rawImports) : null,
                id,
                // Use `ɵɵsetNgModuleScope` to patch selector scopes onto the generated definition in a
                // tree-shakeable way.
                selectorScopeMode: checker.R3SelectorScopeMode.SideEffect,
                // TODO: to be implemented as a part of FW-1004.
                schemas: [],
            };
        }
        else {
            ngModuleMetadata = {
                kind: checker.R3NgModuleMetadataKind.Global,
                type,
                bootstrap,
                declarations,
                publicDeclarationTypes: this.onlyPublishPublicTypings ? exportedDeclarations : null,
                exports,
                imports,
                // Imported types are generally private, so include them unless restricting the .d.ts emit
                // to only public types.
                includeImportTypes: !this.onlyPublishPublicTypings,
                containsForwardDecls,
                id,
                // Use `ɵɵsetNgModuleScope` to patch selector scopes onto the generated definition in a
                // tree-shakeable way.
                selectorScopeMode: this.includeSelectorScope
                    ? checker.R3SelectorScopeMode.SideEffect
                    : checker.R3SelectorScopeMode.Omit,
                // TODO: to be implemented as a part of FW-1004.
                schemas: [],
            };
        }
        const rawProviders = ngModule.has('providers') ? ngModule.get('providers') : null;
        let wrappedProviders = null;
        // In most cases the providers will be an array literal. Check if it has any elements
        // and don't include the providers if it doesn't which saves us a few bytes.
        if (rawProviders !== null &&
            (!ts.isArrayLiteralExpression(rawProviders) || rawProviders.elements.length > 0)) {
            wrappedProviders = new checker.WrappedNodeExpr(this.annotateForClosureCompiler
                ? checker.wrapFunctionExpressionsInParens(rawProviders)
                : rawProviders);
        }
        const topLevelImports = [];
        if (this.compilationMode !== checker.CompilationMode.LOCAL && ngModule.has('imports')) {
            const rawImports = checker.unwrapExpression(ngModule.get('imports'));
            let topLevelExpressions = [];
            if (ts.isArrayLiteralExpression(rawImports)) {
                for (const element of rawImports.elements) {
                    if (ts.isSpreadElement(element)) {
                        // Because `imports` allows nested arrays anyway, a spread expression (`...foo`) can be
                        // treated the same as a direct reference to `foo`.
                        topLevelExpressions.push(element.expression);
                        continue;
                    }
                    topLevelExpressions.push(element);
                }
            }
            else {
                // Treat the whole `imports` expression as top-level.
                topLevelExpressions.push(rawImports);
            }
            let absoluteIndex = 0;
            for (const importExpr of topLevelExpressions) {
                const resolved = this.evaluator.evaluate(importExpr, moduleResolvers);
                const { references, hasModuleWithProviders } = this.resolveTypeList(importExpr, [resolved], node.name.text, 'imports', absoluteIndex, 
                /* allowUnresolvedReferences */ false);
                absoluteIndex += references.length;
                topLevelImports.push({
                    expression: importExpr,
                    resolvedReferences: references,
                    hasModuleWithProviders,
                });
            }
        }
        const injectorMetadata = {
            name,
            type,
            providers: wrappedProviders,
            imports: [],
        };
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            // Adding NgModule's raw imports/exports to the injector's imports field in local compilation
            // mode.
            for (const exp of [rawImports, rawExports]) {
                if (exp === null) {
                    continue;
                }
                if (ts.isArrayLiteralExpression(exp)) {
                    // If array expression then add it entry-by-entry to the injector imports
                    if (exp.elements) {
                        injectorMetadata.imports.push(...exp.elements.map((n) => new checker.WrappedNodeExpr(n)));
                    }
                }
                else {
                    // if not array expression then add it as is to the injector's imports field.
                    injectorMetadata.imports.push(new checker.WrappedNodeExpr(exp));
                }
            }
        }
        const factoryMetadata = {
            name,
            type,
            typeArgumentCount: 0,
            deps: checker.getValidConstructorDependencies(node, this.reflector, this.isCore),
            target: checker.FactoryTarget.NgModule,
        };
        // Remote scoping is used when adding imports to a component file would create a cycle. In such
        // circumstances the component scope is monkey-patched from the NgModule file instead.
        //
        // However, if the NgModule itself has a cycle with the desired component/directive
        // reference(s), then we need to be careful. This can happen for example if an NgModule imports
        // a standalone component and the component also imports the NgModule.
        //
        // In this case, it'd be tempting to rely on the compiler's cycle detector to automatically put
        // such circular references behind a function/closure. This requires global knowledge of the
        // import graph though, and we don't want to depend on such techniques for new APIs like
        // standalone components.
        //
        // Instead, we look for `forwardRef`s in the NgModule dependencies - an explicit signal from the
        // user that a reference may not be defined until a circular import is resolved. If an NgModule
        // contains forward-referenced declarations or imports, we assume that remotely scoped
        // components should also guard against cycles using a closure-wrapped scope.
        //
        // The actual detection here is done heuristically. The compiler doesn't actually know whether
        // any given `Reference` came from a `forwardRef`, but it does know when a `Reference` came from
        // a `ForeignFunctionResolver` _like_ the `forwardRef` resolver. So we know when it's safe to
        // not use a closure, and will use one just in case otherwise.
        const remoteScopesMayRequireCycleProtection = declarationRefs.some(isSyntheticReference) || importRefs.some(isSyntheticReference);
        return {
            diagnostics: diagnostics.length > 0 ? diagnostics : undefined,
            analysis: {
                id,
                schemas,
                mod: ngModuleMetadata,
                inj: injectorMetadata,
                fac: factoryMetadata,
                declarations: declarationRefs,
                rawDeclarations,
                imports: topLevelImports,
                rawImports,
                importRefs,
                exports: exportRefs,
                rawExports,
                providers: rawProviders,
                providersRequiringFactory: rawProviders
                    ? checker.resolveProvidersRequiringFactory(rawProviders, this.reflector, this.evaluator)
                    : null,
                classMetadata: this.includeClassMetadata
                    ? extractClassMetadata(node, this.reflector, this.isCore, this.annotateForClosureCompiler)
                    : null,
                factorySymbolName: node.name.text,
                remoteScopesMayRequireCycleProtection,
                decorator: decorator?.node ?? null,
            },
        };
    }
    symbol(node, analysis) {
        return new NgModuleSymbol(node, analysis.providers !== null);
    }
    register(node, analysis) {
        // Register this module's information with the LocalModuleScopeRegistry. This ensures that
        // during the compile() phase, the module's metadata is available for selector scope
        // computation.
        this.metaRegistry.registerNgModuleMetadata({
            kind: checker.MetaKind.NgModule,
            ref: new checker.Reference(node),
            schemas: analysis.schemas,
            declarations: analysis.declarations,
            imports: analysis.importRefs,
            exports: analysis.exports,
            rawDeclarations: analysis.rawDeclarations,
            rawImports: analysis.rawImports,
            rawExports: analysis.rawExports,
            decorator: analysis.decorator,
            mayDeclareProviders: analysis.providers !== null,
            isPoisoned: false,
        });
        this.injectableRegistry.registerInjectable(node, {
            ctorDeps: analysis.fac.deps,
        });
    }
    resolve(node, analysis) {
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            return {};
        }
        const scope = this.scopeRegistry.getScopeOfModule(node);
        const diagnostics = [];
        const scopeDiagnostics = this.scopeRegistry.getDiagnosticsOfModule(node);
        if (scopeDiagnostics !== null) {
            diagnostics.push(...scopeDiagnostics);
        }
        if (analysis.providersRequiringFactory !== null) {
            const providerDiagnostics = checker.getProviderDiagnostics(analysis.providersRequiringFactory, analysis.providers, this.injectableRegistry);
            diagnostics.push(...providerDiagnostics);
        }
        const data = {
            injectorImports: [],
        };
        // Add all top-level imports from the `imports` field to the injector imports.
        for (const topLevelImport of analysis.imports) {
            if (topLevelImport.hasModuleWithProviders) {
                // We have no choice but to emit expressions which contain MWPs, as we cannot filter on
                // individual references.
                data.injectorImports.push(new checker.WrappedNodeExpr(topLevelImport.expression));
                continue;
            }
            const refsToEmit = [];
            let symbol = null;
            if (this.semanticDepGraphUpdater !== null) {
                const sym = this.semanticDepGraphUpdater.getSymbol(node);
                if (sym instanceof NgModuleSymbol) {
                    symbol = sym;
                }
            }
            for (const ref of topLevelImport.resolvedReferences) {
                const dirMeta = this.metaReader.getDirectiveMetadata(ref);
                if (dirMeta !== null) {
                    if (!dirMeta.isComponent) {
                        // Skip emit of directives in imports - directives can't carry providers.
                        continue;
                    }
                    // Check whether this component has providers.
                    const mayExportProviders = this.exportedProviderStatusResolver.mayExportProviders(dirMeta.ref, (importRef) => {
                        // We need to keep track of which transitive imports were used to decide
                        // `mayExportProviders`, since if those change in a future compilation this
                        // NgModule will need to be re-emitted.
                        if (symbol !== null && this.semanticDepGraphUpdater !== null) {
                            const importSymbol = this.semanticDepGraphUpdater.getSymbol(importRef.node);
                            symbol.addTransitiveImportFromStandaloneComponent(importSymbol);
                        }
                    });
                    if (!mayExportProviders) {
                        // Skip emit of components that don't carry providers.
                        continue;
                    }
                }
                const pipeMeta = dirMeta === null ? this.metaReader.getPipeMetadata(ref) : null;
                if (pipeMeta !== null) {
                    // Skip emit of pipes in imports - pipes can't carry providers.
                    continue;
                }
                refsToEmit.push(ref);
            }
            if (refsToEmit.length === topLevelImport.resolvedReferences.length) {
                // All references within this top-level import should be emitted, so just use the user's
                // expression.
                data.injectorImports.push(new checker.WrappedNodeExpr(topLevelImport.expression));
            }
            else {
                // Some references have been filtered out. Emit references to individual classes.
                const context = node.getSourceFile();
                for (const ref of refsToEmit) {
                    const emittedRef = this.refEmitter.emit(ref, context);
                    checker.assertSuccessfulReferenceEmit(emittedRef, topLevelImport.expression, 'class');
                    data.injectorImports.push(emittedRef.expression);
                }
            }
        }
        if (scope !== null && !scope.compilation.isPoisoned) {
            // Using the scope information, extend the injector's imports using the modules that are
            // specified as module exports.
            const context = checker.getSourceFile(node);
            for (const exportRef of analysis.exports) {
                if (isNgModule(exportRef.node, scope.compilation)) {
                    const type = this.refEmitter.emit(exportRef, context);
                    checker.assertSuccessfulReferenceEmit(type, node, 'NgModule');
                    data.injectorImports.push(type.expression);
                }
            }
            for (const decl of analysis.declarations) {
                const dirMeta = this.metaReader.getDirectiveMetadata(decl);
                if (dirMeta !== null) {
                    const refType = dirMeta.isComponent ? 'Component' : 'Directive';
                    if (dirMeta.selector === null) {
                        throw new checker.FatalDiagnosticError(checker.ErrorCode.DIRECTIVE_MISSING_SELECTOR, decl.node, `${refType} ${decl.node.name.text} has no selector, please add it!`);
                    }
                    continue;
                }
            }
        }
        if (diagnostics.length > 0) {
            return { diagnostics };
        }
        if (scope === null ||
            scope.compilation.isPoisoned ||
            scope.exported.isPoisoned ||
            scope.reexports === null) {
            return { data };
        }
        else {
            return {
                data,
                reexports: scope.reexports,
            };
        }
    }
    compileFull(node, { inj, mod, fac, classMetadata, declarations, remoteScopesMayRequireCycleProtection, }, { injectorImports }) {
        const factoryFn = compileNgFactoryDefField(fac);
        const ngInjectorDef = checker.compileInjector({
            ...inj,
            imports: injectorImports,
        });
        const ngModuleDef = checker.compileNgModule(mod);
        const statements = ngModuleDef.statements;
        const metadata = classMetadata !== null ? compileClassMetadata(classMetadata) : null;
        this.insertMetadataStatement(statements, metadata);
        this.appendRemoteScopingStatements(statements, node, declarations, remoteScopesMayRequireCycleProtection);
        return this.compileNgModule(factoryFn, ngInjectorDef, ngModuleDef);
    }
    compilePartial(node, { inj, fac, mod, classMetadata }, { injectorImports }) {
        const factoryFn = compileDeclareFactory(fac);
        const injectorDef = compileDeclareInjectorFromMetadata({
            ...inj,
            imports: injectorImports,
        });
        const ngModuleDef = compileDeclareNgModuleFromMetadata(mod);
        const metadata = classMetadata !== null ? compileDeclareClassMetadata(classMetadata) : null;
        this.insertMetadataStatement(ngModuleDef.statements, metadata);
        // NOTE: no remote scoping required as this is banned in partial compilation.
        return this.compileNgModule(factoryFn, injectorDef, ngModuleDef);
    }
    compileLocal(node, { inj, mod, fac, classMetadata, declarations, remoteScopesMayRequireCycleProtection, }) {
        const factoryFn = compileNgFactoryDefField(fac);
        const ngInjectorDef = checker.compileInjector({
            ...inj,
        });
        const ngModuleDef = checker.compileNgModule(mod);
        const statements = ngModuleDef.statements;
        const metadata = classMetadata !== null ? compileClassMetadata(classMetadata) : null;
        this.insertMetadataStatement(statements, metadata);
        this.appendRemoteScopingStatements(statements, node, declarations, remoteScopesMayRequireCycleProtection);
        return this.compileNgModule(factoryFn, ngInjectorDef, ngModuleDef);
    }
    /**
     * Add class metadata statements, if provided, to the `ngModuleStatements`.
     */
    insertMetadataStatement(ngModuleStatements, metadata) {
        if (metadata !== null) {
            ngModuleStatements.unshift(metadata.toStmt());
        }
    }
    /**
     * Add remote scoping statements, as needed, to the `ngModuleStatements`.
     */
    appendRemoteScopingStatements(ngModuleStatements, node, declarations, remoteScopesMayRequireCycleProtection) {
        // Local compilation mode generates its own runtimes to compute the dependencies. So there no
        // need to add remote scope statements (which also conflicts with local compilation runtimes)
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            return;
        }
        const context = checker.getSourceFile(node);
        for (const decl of declarations) {
            const remoteScope = this.scopeRegistry.getRemoteScope(decl.node);
            if (remoteScope !== null) {
                const directives = remoteScope.directives.map((directive) => {
                    const type = this.refEmitter.emit(directive, context);
                    checker.assertSuccessfulReferenceEmit(type, node, 'directive');
                    return type.expression;
                });
                const pipes = remoteScope.pipes.map((pipe) => {
                    const type = this.refEmitter.emit(pipe, context);
                    checker.assertSuccessfulReferenceEmit(type, node, 'pipe');
                    return type.expression;
                });
                const directiveArray = new checker.LiteralArrayExpr(directives);
                const pipesArray = new checker.LiteralArrayExpr(pipes);
                const directiveExpr = remoteScopesMayRequireCycleProtection && directives.length > 0
                    ? new checker.FunctionExpr([], [new checker.ReturnStatement(directiveArray)])
                    : directiveArray;
                const pipesExpr = remoteScopesMayRequireCycleProtection && pipes.length > 0
                    ? new checker.FunctionExpr([], [new checker.ReturnStatement(pipesArray)])
                    : pipesArray;
                const componentType = this.refEmitter.emit(decl, context);
                checker.assertSuccessfulReferenceEmit(componentType, node, 'component');
                const declExpr = componentType.expression;
                const setComponentScope = new checker.ExternalExpr(checker.Identifiers.setComponentScope);
                const callExpr = new checker.InvokeFunctionExpr(setComponentScope, [
                    declExpr,
                    directiveExpr,
                    pipesExpr,
                ]);
                ngModuleStatements.push(callExpr.toStmt());
            }
        }
    }
    compileNgModule(factoryFn, injectorDef, ngModuleDef) {
        const res = [
            factoryFn,
            {
                name: 'ɵmod',
                initializer: ngModuleDef.expression,
                statements: ngModuleDef.statements,
                type: ngModuleDef.type,
                deferrableImports: null,
            },
            {
                name: 'ɵinj',
                initializer: injectorDef.expression,
                statements: injectorDef.statements,
                type: injectorDef.type,
                deferrableImports: null,
            },
        ];
        return res;
    }
    _toR3Reference(origin, valueRef, valueContext) {
        if (valueRef.hasOwningModuleGuess) {
            return checker.toR3Reference(origin, valueRef, valueContext, this.refEmitter);
        }
        else {
            return checker.toR3Reference(origin, valueRef, valueContext, this.refEmitter);
        }
    }
    // Verify that a "Declaration" reference is a `ClassDeclaration` reference.
    isClassDeclarationReference(ref) {
        return this.reflector.isClass(ref.node);
    }
    /**
     * Compute a list of `Reference`s from a resolved metadata value.
     */
    resolveTypeList(expr, resolvedList, className, arrayName, absoluteIndex, allowUnresolvedReferences) {
        let hasModuleWithProviders = false;
        const refList = [];
        const dynamicValueSet = new Set();
        if (!Array.isArray(resolvedList)) {
            if (allowUnresolvedReferences) {
                return {
                    references: [],
                    hasModuleWithProviders: false,
                    dynamicValues: [],
                };
            }
            throw checker.createValueHasWrongTypeError(expr, resolvedList, `Expected array when reading the NgModule.${arrayName} of ${className}`);
        }
        for (let idx = 0; idx < resolvedList.length; idx++) {
            let entry = resolvedList[idx];
            // Unwrap ModuleWithProviders for modules that are locally declared (and thus static
            // resolution was able to descend into the function and return an object literal, a Map).
            if (entry instanceof checker.SyntheticValue && isResolvedModuleWithProviders(entry)) {
                entry = entry.value.ngModule;
                hasModuleWithProviders = true;
            }
            else if (entry instanceof Map && entry.has('ngModule')) {
                entry = entry.get('ngModule');
                hasModuleWithProviders = true;
            }
            if (Array.isArray(entry)) {
                // Recurse into nested arrays.
                const recursiveResult = this.resolveTypeList(expr, entry, className, arrayName, absoluteIndex, allowUnresolvedReferences);
                refList.push(...recursiveResult.references);
                for (const d of recursiveResult.dynamicValues) {
                    dynamicValueSet.add(d);
                }
                absoluteIndex += recursiveResult.references.length;
                hasModuleWithProviders = hasModuleWithProviders || recursiveResult.hasModuleWithProviders;
            }
            else if (entry instanceof checker.Reference) {
                if (!this.isClassDeclarationReference(entry)) {
                    throw checker.createValueHasWrongTypeError(entry.node, entry, `Value at position ${absoluteIndex} in the NgModule.${arrayName} of ${className} is not a class`);
                }
                refList.push(entry);
                absoluteIndex += 1;
            }
            else if (entry instanceof checker.DynamicValue && allowUnresolvedReferences) {
                dynamicValueSet.add(entry);
                continue;
            }
            else {
                // TODO(alxhub): Produce a better diagnostic here - the array index may be an inner array.
                throw checker.createValueHasWrongTypeError(expr, entry, `Value at position ${absoluteIndex} in the NgModule.${arrayName} of ${className} is not a reference`);
            }
        }
        return {
            references: refList,
            hasModuleWithProviders,
            dynamicValues: [...dynamicValueSet],
        };
    }
}
function isNgModule(node, compilation) {
    return !compilation.dependencies.some((dep) => dep.ref.node === node);
}
/**
 * Checks whether the given `ts.Expression` is the expression `module.id`.
 */
function isModuleIdExpression(expr) {
    return (ts.isPropertyAccessExpression(expr) &&
        ts.isIdentifier(expr.expression) &&
        expr.expression.text === 'module' &&
        expr.name.text === 'id');
}
/**
 * Helper method to produce a diagnostics for a situation when a standalone component
 * is referenced in the `@NgModule.bootstrap` array.
 */
function makeStandaloneBootstrapDiagnostic(ngModuleClass, bootstrappedClassRef, rawBootstrapExpr) {
    const componentClassName = bootstrappedClassRef.node.name.text;
    // Note: this error message should be aligned with the one produced by JIT.
    const message = //
     `The \`${componentClassName}\` class is a standalone component, which can ` +
        `not be used in the \`@NgModule.bootstrap\` array. Use the \`bootstrapApplication\` ` +
        `function for bootstrap instead.`;
    const relatedInformation = [
        checker.makeRelatedInformation(ngModuleClass, `The 'bootstrap' array is present on this NgModule.`),
    ];
    return checker.makeDiagnostic(checker.ErrorCode.NGMODULE_BOOTSTRAP_IS_STANDALONE, getDiagnosticNode(bootstrappedClassRef, rawBootstrapExpr), message, relatedInformation);
}
function isSyntheticReference(ref) {
    return ref.synthetic;
}

/**
 * Generate a diagnostic related information object that describes a potential cyclic import path.
 */
function makeCyclicImportInfo(ref, type, cycle) {
    const name = ref.debugName || '(unknown)';
    const path = cycle
        .getPath()
        .map((sf) => sf.fileName)
        .join(' -> ');
    const message = `The ${type} '${name}' is used in the template but importing it would create a cycle: `;
    return checker.makeRelatedInformation(ref.node, message + path);
}
/**
 * Checks whether a selector is a valid custom element tag name.
 * Based loosely on https://github.com/sindresorhus/validate-element-name.
 */
function checkCustomElementSelectorForErrors(selector) {
    // Avoid flagging components with an attribute or class selector. This isn't bulletproof since it
    // won't catch cases like `foo[]bar`, but we don't need it to be. This is mainly to avoid flagging
    // something like `foo-bar[baz]` incorrectly.
    if (selector.includes('.') || (selector.includes('[') && selector.includes(']'))) {
        return null;
    }
    if (!/^[a-z]/.test(selector)) {
        return 'Selector of a ShadowDom-encapsulated component must start with a lower case letter.';
    }
    if (/[A-Z]/.test(selector)) {
        return 'Selector of a ShadowDom-encapsulated component must all be in lower case.';
    }
    if (!selector.includes('-')) {
        return 'Selector of a component that uses ViewEncapsulation.ShadowDom must contain a hyphen.';
    }
    return null;
}

/** Determines the node to use for debugging purposes for the given TemplateDeclaration. */
function getTemplateDeclarationNodeForError(declaration) {
    return declaration.isInline ? declaration.expression : declaration.templateUrlExpression;
}
function extractTemplate(node, template, evaluator, depTracker, resourceLoader, options, compilationMode) {
    if (template.isInline) {
        let sourceStr;
        let sourceParseRange = null;
        let templateContent;
        let sourceMapping;
        let escapedString = false;
        let sourceMapUrl;
        // We only support SourceMaps for inline templates that are simple string literals.
        if (ts.isStringLiteral(template.expression) ||
            ts.isNoSubstitutionTemplateLiteral(template.expression)) {
            // the start and end of the `templateExpr` node includes the quotation marks, which we must
            // strip
            sourceParseRange = getTemplateRange(template.expression);
            sourceStr = template.expression.getSourceFile().text;
            templateContent = template.expression.text;
            escapedString = true;
            sourceMapping = {
                type: 'direct',
                node: template.expression,
            };
            sourceMapUrl = template.resolvedTemplateUrl;
        }
        else {
            const resolvedTemplate = evaluator.evaluate(template.expression);
            // The identifier used for @Component.template cannot be resolved in local compilation mode. An error specific to this situation is generated.
            checker.assertLocalCompilationUnresolvedConst(compilationMode, resolvedTemplate, template.expression, 'Unresolved identifier found for @Component.template field! ' +
                'Did you import this identifier from a file outside of the compilation unit? ' +
                'This is not allowed when Angular compiler runs in local mode. ' +
                'Possible solutions: 1) Move the declaration into a file within the ' +
                'compilation unit, 2) Inline the template, 3) Move the template into ' +
                'a separate .html file and include it using @Component.templateUrl');
            if (typeof resolvedTemplate !== 'string') {
                throw checker.createValueHasWrongTypeError(template.expression, resolvedTemplate, 'template must be a string');
            }
            // We do not parse the template directly from the source    file using a lexer range, so
            // the template source and content are set to the statically resolved template.
            sourceStr = resolvedTemplate;
            templateContent = resolvedTemplate;
            sourceMapping = {
                type: 'indirect',
                node: template.expression,
                componentClass: node,
                template: templateContent,
            };
            // Indirect templates cannot be mapped to a particular byte range of any input file, since
            // they're computed by expressions that may span many files. Don't attempt to map them back
            // to a given file.
            sourceMapUrl = null;
        }
        return {
            ...parseExtractedTemplate(template, sourceStr, sourceParseRange, escapedString, sourceMapUrl, options),
            content: templateContent,
            sourceMapping,
            declaration: template,
        };
    }
    else {
        const templateContent = resourceLoader.load(template.resolvedTemplateUrl);
        if (depTracker !== null) {
            depTracker.addResourceDependency(node.getSourceFile(), checker.absoluteFrom(template.resolvedTemplateUrl));
        }
        return {
            ...parseExtractedTemplate(template, 
            /* sourceStr */ templateContent, 
            /* sourceParseRange */ null, 
            /* escapedString */ false, 
            /* sourceMapUrl */ template.resolvedTemplateUrl, options),
            content: templateContent,
            sourceMapping: {
                type: 'external',
                componentClass: node,
                node: template.templateUrlExpression,
                template: templateContent,
                templateUrl: template.resolvedTemplateUrl,
            },
            declaration: template,
        };
    }
}
function parseExtractedTemplate(template, sourceStr, sourceParseRange, escapedString, sourceMapUrl, options) {
    // We always normalize line endings if the template has been escaped (i.e. is inline).
    const i18nNormalizeLineEndingsInICUs = escapedString || options.i18nNormalizeLineEndingsInICUs;
    const commonParseOptions = {
        interpolationConfig: template.interpolationConfig,
        range: sourceParseRange ?? undefined,
        enableI18nLegacyMessageIdFormat: options.enableI18nLegacyMessageIdFormat,
        i18nNormalizeLineEndingsInICUs,
        alwaysAttemptHtmlToR3AstConversion: options.usePoisonedData,
        escapedString,
        enableBlockSyntax: options.enableBlockSyntax,
        enableLetSyntax: options.enableLetSyntax,
    };
    const parsedTemplate = checker.parseTemplate(sourceStr, sourceMapUrl ?? '', {
        ...commonParseOptions,
        preserveWhitespaces: template.preserveWhitespaces,
        preserveSignificantWhitespace: options.preserveSignificantWhitespace,
    });
    // Unfortunately, the primary parse of the template above may not contain accurate source map
    // information. If used directly, it would result in incorrect code locations in template
    // errors, etc. There are three main problems:
    //
    // 1. `preserveWhitespaces: false` or `preserveSignificantWhitespace: false` annihilates the
    //    correctness of template source mapping, as the whitespace transformation changes the
    //    contents of HTML text nodes before they're parsed into Angular expressions.
    // 2. `preserveLineEndings: false` causes growing misalignments in templates that use '\r\n'
    //    line endings, by normalizing them to '\n'.
    // 3. By default, the template parser strips leading trivia characters (like spaces, tabs, and
    //    newlines). This also destroys source mapping information.
    //
    // In order to guarantee the correctness of diagnostics, templates are parsed a second time
    // with the above options set to preserve source mappings.
    const { nodes: diagNodes } = checker.parseTemplate(sourceStr, sourceMapUrl ?? '', {
        ...commonParseOptions,
        preserveWhitespaces: true,
        preserveLineEndings: true,
        preserveSignificantWhitespace: true,
        leadingTriviaChars: [],
    });
    return {
        ...parsedTemplate,
        diagNodes,
        file: new checker.ParseSourceFile(sourceStr, sourceMapUrl ?? ''),
    };
}
function parseTemplateDeclaration(node, decorator, component, containingFile, evaluator, depTracker, resourceLoader, defaultPreserveWhitespaces) {
    let preserveWhitespaces = defaultPreserveWhitespaces;
    if (component.has('preserveWhitespaces')) {
        const expr = component.get('preserveWhitespaces');
        const value = evaluator.evaluate(expr);
        if (typeof value !== 'boolean') {
            throw checker.createValueHasWrongTypeError(expr, value, 'preserveWhitespaces must be a boolean');
        }
        preserveWhitespaces = value;
    }
    let interpolationConfig = checker.DEFAULT_INTERPOLATION_CONFIG;
    if (component.has('interpolation')) {
        const expr = component.get('interpolation');
        const value = evaluator.evaluate(expr);
        if (!Array.isArray(value) ||
            value.length !== 2 ||
            !value.every((element) => typeof element === 'string')) {
            throw checker.createValueHasWrongTypeError(expr, value, 'interpolation must be an array with 2 elements of string type');
        }
        interpolationConfig = checker.InterpolationConfig.fromArray(value);
    }
    if (component.has('templateUrl')) {
        const templateUrlExpr = component.get('templateUrl');
        const templateUrl = evaluator.evaluate(templateUrlExpr);
        if (typeof templateUrl !== 'string') {
            throw checker.createValueHasWrongTypeError(templateUrlExpr, templateUrl, 'templateUrl must be a string');
        }
        try {
            const resourceUrl = resourceLoader.resolve(templateUrl, containingFile);
            return {
                isInline: false,
                interpolationConfig,
                preserveWhitespaces,
                templateUrl,
                templateUrlExpression: templateUrlExpr,
                resolvedTemplateUrl: resourceUrl,
            };
        }
        catch (e) {
            if (depTracker !== null) {
                // The analysis of this file cannot be re-used if the template URL could
                // not be resolved. Future builds should re-analyze and re-attempt resolution.
                depTracker.recordDependencyAnalysisFailure(node.getSourceFile());
            }
            throw makeResourceNotFoundError(templateUrl, templateUrlExpr, 0 /* ResourceTypeForDiagnostics.Template */);
        }
    }
    else if (component.has('template')) {
        return {
            isInline: true,
            interpolationConfig,
            preserveWhitespaces,
            expression: component.get('template'),
            templateUrl: containingFile,
            resolvedTemplateUrl: containingFile,
        };
    }
    else {
        throw new checker.FatalDiagnosticError(checker.ErrorCode.COMPONENT_MISSING_TEMPLATE, decorator.node, 'component is missing a template');
    }
}
function preloadAndParseTemplate(evaluator, resourceLoader, depTracker, preanalyzeTemplateCache, node, decorator, component, containingFile, defaultPreserveWhitespaces, options, compilationMode) {
    if (component.has('templateUrl')) {
        // Extract the templateUrl and preload it.
        const templateUrlExpr = component.get('templateUrl');
        const templateUrl = evaluator.evaluate(templateUrlExpr);
        if (typeof templateUrl !== 'string') {
            throw checker.createValueHasWrongTypeError(templateUrlExpr, templateUrl, 'templateUrl must be a string');
        }
        try {
            const resourceUrl = resourceLoader.resolve(templateUrl, containingFile);
            const templatePromise = resourceLoader.preload(resourceUrl, {
                type: 'template',
                containingFile,
                className: node.name.text,
            });
            // If the preload worked, then actually load and parse the template, and wait for any
            // style URLs to resolve.
            if (templatePromise !== undefined) {
                return templatePromise.then(() => {
                    const templateDecl = parseTemplateDeclaration(node, decorator, component, containingFile, evaluator, depTracker, resourceLoader, defaultPreserveWhitespaces);
                    const template = extractTemplate(node, templateDecl, evaluator, depTracker, resourceLoader, options, compilationMode);
                    preanalyzeTemplateCache.set(node, template);
                    return template;
                });
            }
            else {
                return Promise.resolve(null);
            }
        }
        catch (e) {
            if (depTracker !== null) {
                // The analysis of this file cannot be re-used if the template URL could
                // not be resolved. Future builds should re-analyze and re-attempt resolution.
                depTracker.recordDependencyAnalysisFailure(node.getSourceFile());
            }
            throw makeResourceNotFoundError(templateUrl, templateUrlExpr, 0 /* ResourceTypeForDiagnostics.Template */);
        }
    }
    else {
        const templateDecl = parseTemplateDeclaration(node, decorator, component, containingFile, evaluator, depTracker, resourceLoader, defaultPreserveWhitespaces);
        const template = extractTemplate(node, templateDecl, evaluator, depTracker, resourceLoader, options, compilationMode);
        preanalyzeTemplateCache.set(node, template);
        return Promise.resolve(template);
    }
}
function getTemplateRange(templateExpr) {
    const startPos = templateExpr.getStart() + 1;
    const { line, character } = ts.getLineAndCharacterOfPosition(templateExpr.getSourceFile(), startPos);
    return {
        startPos,
        startLine: line,
        startCol: character,
        endPos: templateExpr.getEnd() - 1,
    };
}
function makeResourceNotFoundError(file, nodeForError, resourceType) {
    let errorText;
    switch (resourceType) {
        case 0 /* ResourceTypeForDiagnostics.Template */:
            errorText = `Could not find template file '${file}'.`;
            break;
        case 1 /* ResourceTypeForDiagnostics.StylesheetFromTemplate */:
            errorText = `Could not find stylesheet file '${file}' linked from the template.`;
            break;
        case 2 /* ResourceTypeForDiagnostics.StylesheetFromDecorator */:
            errorText = `Could not find stylesheet file '${file}'.`;
            break;
    }
    return new checker.FatalDiagnosticError(checker.ErrorCode.COMPONENT_RESOURCE_NOT_FOUND, nodeForError, errorText);
}
/**
 * Transforms the given decorator to inline external resources. i.e. if the decorator
 * resolves to `@Component`, the `templateUrl` and `styleUrls` metadata fields will be
 * transformed to their semantically-equivalent inline variants.
 *
 * This method is used for serializing decorators into the class metadata. The emitted
 * class metadata should not refer to external resources as this would be inconsistent
 * with the component definitions/declarations which already inline external resources.
 *
 * Additionally, the references to external resources would require libraries to ship
 * external resources exclusively for the class metadata.
 */
function transformDecoratorResources(dec, component, styles, template) {
    if (dec.name !== 'Component') {
        return dec;
    }
    // If no external resources are referenced, preserve the original decorator
    // for the best source map experience when the decorator is emitted in TS.
    if (!component.has('templateUrl') &&
        !component.has('styleUrls') &&
        !component.has('styleUrl') &&
        !component.has('styles')) {
        return dec;
    }
    const metadata = new Map(component);
    // Set the `template` property if the `templateUrl` property is set.
    if (metadata.has('templateUrl')) {
        metadata.delete('templateUrl');
        metadata.set('template', ts.factory.createStringLiteral(template.content));
    }
    if (metadata.has('styleUrls') || metadata.has('styleUrl') || metadata.has('styles')) {
        metadata.delete('styles');
        metadata.delete('styleUrls');
        metadata.delete('styleUrl');
        if (styles.length > 0) {
            const styleNodes = styles.reduce((result, style) => {
                if (style.trim().length > 0) {
                    result.push(ts.factory.createStringLiteral(style));
                }
                return result;
            }, []);
            if (styleNodes.length > 0) {
                metadata.set('styles', ts.factory.createArrayLiteralExpression(styleNodes));
            }
        }
    }
    // Convert the metadata to TypeScript AST object literal element nodes.
    const newMetadataFields = [];
    for (const [name, value] of metadata.entries()) {
        newMetadataFields.push(ts.factory.createPropertyAssignment(name, value));
    }
    // Return the original decorator with the overridden metadata argument.
    return { ...dec, args: [ts.factory.createObjectLiteralExpression(newMetadataFields)] };
}
function extractComponentStyleUrls(evaluator, component) {
    const styleUrlsExpr = component.get('styleUrls');
    const styleUrlExpr = component.get('styleUrl');
    if (styleUrlsExpr !== undefined && styleUrlExpr !== undefined) {
        throw new checker.FatalDiagnosticError(checker.ErrorCode.COMPONENT_INVALID_STYLE_URLS, styleUrlExpr, '@Component cannot define both `styleUrl` and `styleUrls`. ' +
            'Use `styleUrl` if the component has one stylesheet, or `styleUrls` if it has multiple');
    }
    if (styleUrlsExpr !== undefined) {
        return extractStyleUrlsFromExpression(evaluator, component.get('styleUrls'));
    }
    if (styleUrlExpr !== undefined) {
        const styleUrl = evaluator.evaluate(styleUrlExpr);
        if (typeof styleUrl !== 'string') {
            throw checker.createValueHasWrongTypeError(styleUrlExpr, styleUrl, 'styleUrl must be a string');
        }
        return [
            {
                url: styleUrl,
                source: 2 /* ResourceTypeForDiagnostics.StylesheetFromDecorator */,
                expression: styleUrlExpr,
            },
        ];
    }
    return [];
}
function extractStyleUrlsFromExpression(evaluator, styleUrlsExpr) {
    const styleUrls = [];
    if (ts.isArrayLiteralExpression(styleUrlsExpr)) {
        for (const styleUrlExpr of styleUrlsExpr.elements) {
            if (ts.isSpreadElement(styleUrlExpr)) {
                styleUrls.push(...extractStyleUrlsFromExpression(evaluator, styleUrlExpr.expression));
            }
            else {
                const styleUrl = evaluator.evaluate(styleUrlExpr);
                if (typeof styleUrl !== 'string') {
                    throw checker.createValueHasWrongTypeError(styleUrlExpr, styleUrl, 'styleUrl must be a string');
                }
                styleUrls.push({
                    url: styleUrl,
                    source: 2 /* ResourceTypeForDiagnostics.StylesheetFromDecorator */,
                    expression: styleUrlExpr,
                });
            }
        }
    }
    else {
        const evaluatedStyleUrls = evaluator.evaluate(styleUrlsExpr);
        if (!isStringArray(evaluatedStyleUrls)) {
            throw checker.createValueHasWrongTypeError(styleUrlsExpr, evaluatedStyleUrls, 'styleUrls must be an array of strings');
        }
        for (const styleUrl of evaluatedStyleUrls) {
            styleUrls.push({
                url: styleUrl,
                source: 2 /* ResourceTypeForDiagnostics.StylesheetFromDecorator */,
                expression: styleUrlsExpr,
            });
        }
    }
    return styleUrls;
}
function extractInlineStyleResources(component) {
    const styles = new Set();
    function stringLiteralElements(array) {
        return array.elements.filter((e) => ts.isStringLiteralLike(e));
    }
    const stylesExpr = component.get('styles');
    if (stylesExpr !== undefined) {
        if (ts.isArrayLiteralExpression(stylesExpr)) {
            for (const expression of stringLiteralElements(stylesExpr)) {
                styles.add({ path: null, expression });
            }
        }
        else if (ts.isStringLiteralLike(stylesExpr)) {
            styles.add({ path: null, expression: stylesExpr });
        }
    }
    return styles;
}
function _extractTemplateStyleUrls(template) {
    if (template.styleUrls === null) {
        return [];
    }
    const expression = getTemplateDeclarationNodeForError(template.declaration);
    return template.styleUrls.map((url) => ({
        url,
        source: 1 /* ResourceTypeForDiagnostics.StylesheetFromTemplate */,
        expression,
    }));
}

/**
 * Represents an Angular component.
 */
class ComponentSymbol extends DirectiveSymbol {
    usedDirectives = [];
    usedPipes = [];
    isRemotelyScoped = false;
    isEmitAffected(previousSymbol, publicApiAffected) {
        if (!(previousSymbol instanceof ComponentSymbol)) {
            return true;
        }
        // Create an equality function that considers symbols equal if they represent the same
        // declaration, but only if the symbol in the current compilation does not have its public API
        // affected.
        const isSymbolUnaffected = (current, previous) => isReferenceEqual(current, previous) && !publicApiAffected.has(current.symbol);
        // The emit of a component is affected if either of the following is true:
        //  1. The component used to be remotely scoped but no longer is, or vice versa.
        //  2. The list of used directives has changed or any of those directives have had their public
        //     API changed. If the used directives have been reordered but not otherwise affected then
        //     the component must still be re-emitted, as this may affect directive instantiation order.
        //  3. The list of used pipes has changed, or any of those pipes have had their public API
        //     changed.
        return (this.isRemotelyScoped !== previousSymbol.isRemotelyScoped ||
            !isArrayEqual(this.usedDirectives, previousSymbol.usedDirectives, isSymbolUnaffected) ||
            !isArrayEqual(this.usedPipes, previousSymbol.usedPipes, isSymbolUnaffected));
    }
    isTypeCheckBlockAffected(previousSymbol, typeCheckApiAffected) {
        if (!(previousSymbol instanceof ComponentSymbol)) {
            return true;
        }
        // To verify that a used directive is not affected we need to verify that its full inheritance
        // chain is not present in `typeCheckApiAffected`.
        const isInheritanceChainAffected = (symbol) => {
            let currentSymbol = symbol;
            while (currentSymbol instanceof DirectiveSymbol) {
                if (typeCheckApiAffected.has(currentSymbol)) {
                    return true;
                }
                currentSymbol = currentSymbol.baseClass;
            }
            return false;
        };
        // Create an equality function that considers directives equal if they represent the same
        // declaration and if the symbol and all symbols it inherits from in the current compilation
        // do not have their type-check API affected.
        const isDirectiveUnaffected = (current, previous) => isReferenceEqual(current, previous) && !isInheritanceChainAffected(current.symbol);
        // Create an equality function that considers pipes equal if they represent the same
        // declaration and if the symbol in the current compilation does not have its type-check
        // API affected.
        const isPipeUnaffected = (current, previous) => isReferenceEqual(current, previous) && !typeCheckApiAffected.has(current.symbol);
        // The emit of a type-check block of a component is affected if either of the following is true:
        //  1. The list of used directives has changed or any of those directives have had their
        //     type-check API changed.
        //  2. The list of used pipes has changed, or any of those pipes have had their type-check API
        //     changed.
        return (!isArrayEqual(this.usedDirectives, previousSymbol.usedDirectives, isDirectiveUnaffected) ||
            !isArrayEqual(this.usedPipes, previousSymbol.usedPipes, isPipeUnaffected));
    }
}

/**
 * Collect the animation names from the static evaluation result.
 * @param value the static evaluation result of the animations
 * @param animationTriggerNames the animation names collected and whether some names could not be
 *     statically evaluated.
 */
function collectAnimationNames(value, animationTriggerNames) {
    if (value instanceof Map) {
        const name = value.get('name');
        if (typeof name === 'string') {
            animationTriggerNames.staticTriggerNames.push(name);
        }
        else {
            animationTriggerNames.includesDynamicAnimations = true;
        }
    }
    else if (Array.isArray(value)) {
        for (const resolvedValue of value) {
            collectAnimationNames(resolvedValue, animationTriggerNames);
        }
    }
    else {
        animationTriggerNames.includesDynamicAnimations = true;
    }
}
function isAngularAnimationsReference(reference, symbolName) {
    return (reference.ownedByModuleGuess === '@angular/animations' && reference.debugName === symbolName);
}
const animationTriggerResolver = (fn, node, resolve, unresolvable) => {
    const animationTriggerMethodName = 'trigger';
    if (!isAngularAnimationsReference(fn, animationTriggerMethodName)) {
        return unresolvable;
    }
    const triggerNameExpression = node.arguments[0];
    if (!triggerNameExpression) {
        return unresolvable;
    }
    const res = new Map();
    res.set('name', resolve(triggerNameExpression));
    return res;
};
function validateAndFlattenComponentImports(imports, expr, isDeferred) {
    const flattened = [];
    const errorMessage = isDeferred
        ? `'deferredImports' must be an array of components, directives, or pipes.`
        : `'imports' must be an array of components, directives, pipes, or NgModules.`;
    if (!Array.isArray(imports)) {
        const error = checker.createValueHasWrongTypeError(expr, imports, errorMessage).toDiagnostic();
        return {
            imports: [],
            diagnostics: [error],
        };
    }
    const diagnostics = [];
    for (let i = 0; i < imports.length; i++) {
        const ref = imports[i];
        if (Array.isArray(ref)) {
            const { imports: childImports, diagnostics: childDiagnostics } = validateAndFlattenComponentImports(ref, expr, isDeferred);
            flattened.push(...childImports);
            diagnostics.push(...childDiagnostics);
        }
        else if (ref instanceof checker.Reference) {
            if (checker.isNamedClassDeclaration(ref.node)) {
                flattened.push(ref);
            }
            else {
                diagnostics.push(checker.createValueHasWrongTypeError(ref.getOriginForDiagnostics(expr), ref, errorMessage).toDiagnostic());
            }
        }
        else if (isLikelyModuleWithProviders(ref)) {
            let origin = expr;
            if (ref instanceof checker.SyntheticValue) {
                // The `ModuleWithProviders` type originated from a foreign function declaration, in which
                // case the original foreign call is available which is used to get a more accurate origin
                // node that points at the specific call expression.
                origin = checker.getOriginNodeForDiagnostics(ref.value.mwpCall, expr);
            }
            diagnostics.push(checker.makeDiagnostic(checker.ErrorCode.COMPONENT_UNKNOWN_IMPORT, origin, `Component imports contains a ModuleWithProviders value, likely the result of a 'Module.forRoot()'-style call. ` +
                `These calls are not used to configure components and are not valid in standalone component imports - ` +
                `consider importing them in the application bootstrap instead.`));
        }
        else {
            let diagnosticNode;
            let diagnosticValue;
            if (ref instanceof checker.DynamicValue) {
                diagnosticNode = ref.node;
                diagnosticValue = ref;
            }
            else if (ts.isArrayLiteralExpression(expr) &&
                expr.elements.length === imports.length &&
                !expr.elements.some(ts.isSpreadAssignment) &&
                !imports.some(Array.isArray)) {
                // Reporting a diagnostic on the entire array can be noisy, especially if the user has a
                // large array. The most common case is that the array will be static so we can reliably
                // trace back a `ResolvedValue` back to its node using its index. This allows us to report
                // the exact node that caused the issue.
                diagnosticNode = expr.elements[i];
                diagnosticValue = ref;
            }
            else {
                diagnosticNode = expr;
                diagnosticValue = imports;
            }
            diagnostics.push(checker.createValueHasWrongTypeError(diagnosticNode, diagnosticValue, errorMessage).toDiagnostic());
        }
    }
    return { imports: flattened, diagnostics };
}
/**
 * Inspects `value` to determine if it resembles a `ModuleWithProviders` value. This is an
 * approximation only suitable for error reporting as any resolved object with an `ngModule`
 * key is considered a `ModuleWithProviders`.
 */
function isLikelyModuleWithProviders(value) {
    if (value instanceof checker.SyntheticValue && isResolvedModuleWithProviders(value)) {
        // This is a `ModuleWithProviders` as extracted from a foreign function call.
        return true;
    }
    if (value instanceof Map && value.has('ngModule')) {
        // A resolved `Map` with `ngModule` property would have been extracted from locally declared
        // functions that return a `ModuleWithProviders` object.
        return true;
    }
    return false;
}

const TS_EXTENSIONS = /\.tsx?$/i;
/**
 * Replace the .ts or .tsx extension of a file with the shim filename suffix.
 */
function makeShimFileName(fileName, suffix) {
    return checker.absoluteFrom(fileName.replace(TS_EXTENSIONS, suffix));
}

/**
 * Generates and tracks shim files for each original `ts.SourceFile`.
 *
 * The `ShimAdapter` provides an API that's designed to be used by a `ts.CompilerHost`
 * implementation and allows it to include synthetic "shim" files in the program that's being
 * created. It works for both freshly created programs as well as with reuse of an older program
 * (which already may contain shim files and thus have a different creation flow).
 */
class ShimAdapter {
    delegate;
    /**
     * A map of shim file names to the `ts.SourceFile` generated for those shims.
     */
    shims = new Map();
    /**
     * A map of shim file names to existing shims which were part of a previous iteration of this
     * program.
     *
     * Not all of these shims will be inherited into this program.
     */
    priorShims = new Map();
    /**
     * File names which are already known to not be shims.
     *
     * This allows for short-circuit returns without the expense of running regular expressions
     * against the filename repeatedly.
     */
    notShims = new Set();
    /**
     * The shim generators supported by this adapter as well as extra precalculated data facilitating
     * their use.
     */
    generators = [];
    /**
     * A `Set` of shim `ts.SourceFile`s which should not be emitted.
     */
    ignoreForEmit = new Set();
    /**
     * A list of extra filenames which should be considered inputs to program creation.
     *
     * This includes any top-level shims generated for the program, as well as per-file shim names for
     * those files which are included in the root files of the program.
     */
    extraInputFiles;
    /**
     * Extension prefixes of all installed per-file shims.
     */
    extensionPrefixes = [];
    constructor(delegate, tsRootFiles, topLevelGenerators, perFileGenerators, oldProgram) {
        this.delegate = delegate;
        // Initialize `this.generators` with a regex that matches each generator's paths.
        for (const gen of perFileGenerators) {
            // This regex matches paths for shims from this generator. The first (and only) capture group
            // extracts the filename prefix, which can be used to find the original file that was used to
            // generate this shim.
            const pattern = `^(.*)\\.${gen.extensionPrefix}\\.ts$`;
            const regexp = new RegExp(pattern, 'i');
            this.generators.push({
                generator: gen,
                test: regexp,
                suffix: `.${gen.extensionPrefix}.ts`,
            });
            this.extensionPrefixes.push(gen.extensionPrefix);
        }
        // Process top-level generators and pre-generate their shims. Accumulate the list of filenames
        // as extra input files.
        const extraInputFiles = [];
        for (const gen of topLevelGenerators) {
            const sf = gen.makeTopLevelShim();
            checker.sfExtensionData(sf).isTopLevelShim = true;
            if (!gen.shouldEmit) {
                this.ignoreForEmit.add(sf);
            }
            const fileName = checker.absoluteFromSourceFile(sf);
            this.shims.set(fileName, sf);
            extraInputFiles.push(fileName);
        }
        // Add to that list the per-file shims associated with each root file. This is needed because
        // reference tagging alone may not work in TS compilations that have `noResolve` set. Such
        // compilations rely on the list of input files completely describing the program.
        for (const rootFile of tsRootFiles) {
            for (const gen of this.generators) {
                extraInputFiles.push(makeShimFileName(rootFile, gen.suffix));
            }
        }
        this.extraInputFiles = extraInputFiles;
        // If an old program is present, extract all per-file shims into a map, which will be used to
        // generate new versions of those shims.
        if (oldProgram !== null) {
            for (const oldSf of oldProgram.getSourceFiles()) {
                if (oldSf.isDeclarationFile || !checker.isFileShimSourceFile(oldSf)) {
                    continue;
                }
                this.priorShims.set(checker.absoluteFromSourceFile(oldSf), oldSf);
            }
        }
    }
    /**
     * Produce a shim `ts.SourceFile` if `fileName` refers to a shim file which should exist in the
     * program.
     *
     * If `fileName` does not refer to a potential shim file, `null` is returned. If a corresponding
     * base file could not be determined, `undefined` is returned instead.
     */
    maybeGenerate(fileName) {
        // Fast path: either this filename has been proven not to be a shim before, or it is a known
        // shim and no generation is required.
        if (this.notShims.has(fileName)) {
            return null;
        }
        else if (this.shims.has(fileName)) {
            return this.shims.get(fileName);
        }
        // .d.ts files can't be shims.
        if (checker.isDtsPath(fileName)) {
            this.notShims.add(fileName);
            return null;
        }
        // This is the first time seeing this path. Try to match it against a shim generator.
        for (const record of this.generators) {
            const match = record.test.exec(fileName);
            if (match === null) {
                continue;
            }
            // The path matched. Extract the filename prefix without the extension.
            const prefix = match[1];
            // This _might_ be a shim, if an underlying base file exists. The base file might be .ts or
            // .tsx.
            let baseFileName = checker.absoluteFrom(prefix + '.ts');
            // Retrieve the original file for which the shim will be generated.
            let inputFile = this.delegate.getSourceFile(baseFileName, ts.ScriptTarget.Latest);
            if (inputFile === undefined) {
                // No .ts file by that name - try .tsx.
                baseFileName = checker.absoluteFrom(prefix + '.tsx');
                inputFile = this.delegate.getSourceFile(baseFileName, ts.ScriptTarget.Latest);
            }
            if (inputFile === undefined || checker.isShim(inputFile)) {
                // This isn't a shim after all since there is no original file which would have triggered
                // its generation, even though the path is right. There are a few reasons why this could
                // occur:
                //
                // * when resolving an import to an .ngfactory.d.ts file, the module resolution algorithm
                //   will first look for an .ngfactory.ts file in its place, which will be requested here.
                // * when the user writes a bad import.
                // * when a file is present in one compilation and removed in the next incremental step.
                //
                // Note that this does not add the filename to `notShims`, so this path is not cached.
                // That's okay as these cases above are edge cases and do not occur regularly in normal
                // operations.
                return undefined;
            }
            // Actually generate and cache the shim.
            return this.generateSpecific(fileName, record.generator, inputFile);
        }
        // No generator matched.
        this.notShims.add(fileName);
        return null;
    }
    generateSpecific(fileName, generator, inputFile) {
        let priorShimSf = null;
        if (this.priorShims.has(fileName)) {
            // In the previous program a shim with this name already existed. It's passed to the shim
            // generator which may reuse it instead of generating a fresh shim.
            priorShimSf = this.priorShims.get(fileName);
            this.priorShims.delete(fileName);
        }
        const shimSf = generator.generateShimForFile(inputFile, fileName, priorShimSf);
        // Mark the new generated source file as a shim that originated from this generator.
        checker.sfExtensionData(shimSf).fileShim = {
            extension: generator.extensionPrefix,
            generatedFrom: checker.absoluteFromSourceFile(inputFile),
        };
        if (!generator.shouldEmit) {
            this.ignoreForEmit.add(shimSf);
        }
        this.shims.set(fileName, shimSf);
        return shimSf;
    }
}

/**
 * Manipulates the `referencedFiles` property of `ts.SourceFile`s to add references to shim files
 * for each original source file, causing the shims to be loaded into the program as well.
 *
 * `ShimReferenceTagger`s are intended to operate during program creation only.
 */
class ShimReferenceTagger {
    suffixes;
    /**
     * Tracks which original files have been processed and had shims generated if necessary.
     *
     * This is used to avoid generating shims twice for the same file.
     */
    tagged = new Set();
    /**
     * Whether shim tagging is currently being performed.
     */
    enabled = true;
    constructor(shimExtensions) {
        this.suffixes = shimExtensions.map((extension) => `.${extension}.ts`);
    }
    /**
     * Tag `sf` with any needed references if it's not a shim itself.
     */
    tag(sf) {
        if (!this.enabled ||
            sf.isDeclarationFile ||
            checker.isShim(sf) ||
            this.tagged.has(sf) ||
            !checker.isNonDeclarationTsPath(sf.fileName)) {
            return;
        }
        const ext = checker.sfExtensionData(sf);
        // If this file has never been tagged before, capture its `referencedFiles` in the extension
        // data.
        if (ext.originalReferencedFiles === null) {
            ext.originalReferencedFiles = sf.referencedFiles;
        }
        const referencedFiles = [...ext.originalReferencedFiles];
        const sfPath = checker.absoluteFromSourceFile(sf);
        for (const suffix of this.suffixes) {
            referencedFiles.push({
                fileName: makeShimFileName(sfPath, suffix),
                pos: 0,
                end: 0,
            });
        }
        ext.taggedReferenceFiles = referencedFiles;
        sf.referencedFiles = referencedFiles;
        this.tagged.add(sf);
    }
    /**
     * Disable the `ShimReferenceTagger` and free memory associated with tracking tagged files.
     */
    finalize() {
        this.enabled = false;
        this.tagged.clear();
    }
}

/**
 * Delegates all methods of `ts.CompilerHost` to a delegate, with the exception of
 * `getSourceFile`, `fileExists` and `writeFile` which are implemented in `TypeCheckProgramHost`.
 *
 * If a new method is added to `ts.CompilerHost` which is not delegated, a type error will be
 * generated for this class.
 */
let DelegatingCompilerHost$1 = class DelegatingCompilerHost {
    delegate;
    createHash;
    directoryExists;
    getCancellationToken;
    getCanonicalFileName;
    getCurrentDirectory;
    getDefaultLibFileName;
    getDefaultLibLocation;
    getDirectories;
    getEnvironmentVariable;
    getNewLine;
    getParsedCommandLine;
    getSourceFileByPath;
    readDirectory;
    readFile;
    realpath;
    resolveModuleNames;
    resolveTypeReferenceDirectives;
    trace;
    useCaseSensitiveFileNames;
    getModuleResolutionCache;
    hasInvalidatedResolutions;
    resolveModuleNameLiterals;
    resolveTypeReferenceDirectiveReferences;
    // jsDocParsingMode is not a method like the other elements above
    // TODO: ignore usage can be dropped once 5.2 support is dropped
    get jsDocParsingMode() {
        // @ts-ignore
        return this.delegate.jsDocParsingMode;
    }
    set jsDocParsingMode(mode) {
        // @ts-ignore
        this.delegate.jsDocParsingMode = mode;
    }
    constructor(delegate) {
        // Excluded are 'getSourceFile', 'fileExists' and 'writeFile', which are actually implemented by
        // `TypeCheckProgramHost` below.
        this.delegate = delegate;
        this.createHash = this.delegateMethod('createHash');
        this.directoryExists = this.delegateMethod('directoryExists');
        this.getCancellationToken = this.delegateMethod('getCancellationToken');
        this.getCanonicalFileName = this.delegateMethod('getCanonicalFileName');
        this.getCurrentDirectory = this.delegateMethod('getCurrentDirectory');
        this.getDefaultLibFileName = this.delegateMethod('getDefaultLibFileName');
        this.getDefaultLibLocation = this.delegateMethod('getDefaultLibLocation');
        this.getDirectories = this.delegateMethod('getDirectories');
        this.getEnvironmentVariable = this.delegateMethod('getEnvironmentVariable');
        this.getNewLine = this.delegateMethod('getNewLine');
        this.getParsedCommandLine = this.delegateMethod('getParsedCommandLine');
        this.getSourceFileByPath = this.delegateMethod('getSourceFileByPath');
        this.readDirectory = this.delegateMethod('readDirectory');
        this.readFile = this.delegateMethod('readFile');
        this.realpath = this.delegateMethod('realpath');
        this.resolveModuleNames = this.delegateMethod('resolveModuleNames');
        this.resolveTypeReferenceDirectives = this.delegateMethod('resolveTypeReferenceDirectives');
        this.trace = this.delegateMethod('trace');
        this.useCaseSensitiveFileNames = this.delegateMethod('useCaseSensitiveFileNames');
        this.getModuleResolutionCache = this.delegateMethod('getModuleResolutionCache');
        this.hasInvalidatedResolutions = this.delegateMethod('hasInvalidatedResolutions');
        this.resolveModuleNameLiterals = this.delegateMethod('resolveModuleNameLiterals');
        this.resolveTypeReferenceDirectiveReferences = this.delegateMethod('resolveTypeReferenceDirectiveReferences');
    }
    delegateMethod(name) {
        return this.delegate[name] !== undefined
            ? this.delegate[name].bind(this.delegate)
            : undefined;
    }
};
/**
 * A `ts.CompilerHost` which augments source files.
 */
class UpdatedProgramHost extends DelegatingCompilerHost$1 {
    originalProgram;
    shimExtensionPrefixes;
    /**
     * Map of source file names to `ts.SourceFile` instances.
     */
    sfMap;
    /**
     * The `ShimReferenceTagger` responsible for tagging `ts.SourceFile`s loaded via this host.
     *
     * The `UpdatedProgramHost` is used in the creation of a new `ts.Program`. Even though this new
     * program is based on a prior one, TypeScript will still start from the root files and enumerate
     * all source files to include in the new program.  This means that just like during the original
     * program's creation, these source files must be tagged with references to per-file shims in
     * order for those shims to be loaded, and then cleaned up afterwards. Thus the
     * `UpdatedProgramHost` has its own `ShimReferenceTagger` to perform this function.
     */
    shimTagger;
    constructor(sfMap, originalProgram, delegate, shimExtensionPrefixes) {
        super(delegate);
        this.originalProgram = originalProgram;
        this.shimExtensionPrefixes = shimExtensionPrefixes;
        this.shimTagger = new ShimReferenceTagger(this.shimExtensionPrefixes);
        this.sfMap = sfMap;
    }
    getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) {
        // Try to use the same `ts.SourceFile` as the original program, if possible. This guarantees
        // that program reuse will be as efficient as possible.
        let delegateSf = this.originalProgram.getSourceFile(fileName);
        if (delegateSf === undefined) {
            // Something went wrong and a source file is being requested that's not in the original
            // program. Just in case, try to retrieve it from the delegate.
            delegateSf = this.delegate.getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
        }
        if (delegateSf === undefined) {
            return undefined;
        }
        // Look for replacements.
        let sf;
        if (this.sfMap.has(fileName)) {
            sf = this.sfMap.get(fileName);
            checker.copyFileShimData(delegateSf, sf);
        }
        else {
            sf = delegateSf;
        }
        // TypeScript doesn't allow returning redirect source files. To avoid unforeseen errors we
        // return the original source file instead of the redirect target.
        sf = checker.toUnredirectedSourceFile(sf);
        this.shimTagger.tag(sf);
        return sf;
    }
    postProgramCreationCleanup() {
        this.shimTagger.finalize();
    }
    writeFile() {
        throw new Error(`TypeCheckProgramHost should never write files`);
    }
    fileExists(fileName) {
        return this.sfMap.has(fileName) || this.delegate.fileExists(fileName);
    }
}
/**
 * Updates a `ts.Program` instance with a new one that incorporates specific changes, using the
 * TypeScript compiler APIs for incremental program creation.
 */
class TsCreateProgramDriver {
    originalProgram;
    originalHost;
    options;
    shimExtensionPrefixes;
    /**
     * A map of source file paths to replacement `ts.SourceFile`s for those paths.
     *
     * Effectively, this tracks the delta between the user's program (represented by the
     * `originalHost`) and the template type-checking program being managed.
     */
    sfMap = new Map();
    program;
    constructor(originalProgram, originalHost, options, shimExtensionPrefixes) {
        this.originalProgram = originalProgram;
        this.originalHost = originalHost;
        this.options = options;
        this.shimExtensionPrefixes = shimExtensionPrefixes;
        this.program = this.originalProgram;
    }
    supportsInlineOperations = true;
    getProgram() {
        return this.program;
    }
    updateFiles(contents, updateMode) {
        if (contents.size === 0) {
            // No changes have been requested. Is it safe to skip updating entirely?
            // If UpdateMode is Incremental, then yes. If UpdateMode is Complete, then it's safe to skip
            // only if there are no active changes already (that would be cleared by the update).
            if (updateMode !== checker.UpdateMode.Complete || this.sfMap.size === 0) {
                // No changes would be made to the `ts.Program` anyway, so it's safe to do nothing here.
                return;
            }
        }
        if (updateMode === checker.UpdateMode.Complete) {
            this.sfMap.clear();
        }
        for (const [filePath, { newText, originalFile }] of contents.entries()) {
            const sf = ts.createSourceFile(filePath, newText, ts.ScriptTarget.Latest, true);
            if (originalFile !== null) {
                sf[checker.NgOriginalFile] = originalFile;
            }
            this.sfMap.set(filePath, sf);
        }
        const host = new UpdatedProgramHost(this.sfMap, this.originalProgram, this.originalHost, this.shimExtensionPrefixes);
        const oldProgram = this.program;
        // Retag the old program's `ts.SourceFile`s with shim tags, to allow TypeScript to reuse the
        // most data.
        checker.retagAllTsFiles(oldProgram);
        this.program = ts.createProgram({
            host,
            rootNames: this.program.getRootFileNames(),
            options: this.options,
            oldProgram,
        });
        host.postProgramCreationCleanup();
        // Only untag the old program. The new program needs to keep the tagged files, because as of
        // TS 5.5 not having the files tagged while producing diagnostics can lead to errors. See:
        // https://github.com/microsoft/TypeScript/pull/58398
        checker.untagAllTsFiles(oldProgram);
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Determines the file-level dependencies that the HMR initializer needs to capture and pass along.
 * @param sourceFile File in which the file is being compiled.
 * @param definition Compiled component definition.
 * @param factory Compiled component factory.
 * @param deferBlockMetadata Metadata about the defer blocks in the component.
 * @param classMetadata Compiled `setClassMetadata` expression, if any.
 * @param debugInfo Compiled `setClassDebugInfo` expression, if any.
 */
function extractHmrDependencies(node, definition, factory, deferBlockMetadata, classMetadata, debugInfo, reflection, evaluator) {
    const name = ts.isClassDeclaration(node) && node.name ? node.name.text : null;
    const visitor = new PotentialTopLevelReadsVisitor();
    const sourceFile = ts.getOriginalNode(node).getSourceFile();
    // Visit all of the compiled expressions to look for potential
    // local references that would have to be retained.
    definition.expression.visitExpression(visitor, null);
    definition.statements.forEach((statement) => statement.visitStatement(visitor, null));
    factory.initializer?.visitExpression(visitor, null);
    factory.statements.forEach((statement) => statement.visitStatement(visitor, null));
    classMetadata?.visitStatement(visitor, null);
    debugInfo?.visitStatement(visitor, null);
    if (deferBlockMetadata.mode === 0 /* DeferBlockDepsEmitMode.PerBlock */) {
        deferBlockMetadata.blocks.forEach((loader) => loader?.visitExpression(visitor, null));
    }
    else {
        deferBlockMetadata.dependenciesFn?.visitExpression(visitor, null);
    }
    // Filter out only the references to defined top-level symbols. This allows us to ignore local
    // variables inside of functions. Note that we filter out the class name since it is always
    // defined and it saves us having to repeat this logic wherever the locals are consumed.
    const availableTopLevel = getTopLevelDeclarationNames(sourceFile);
    const local = [];
    const seenLocals = new Set();
    for (const readNode of visitor.allReads) {
        const readName = readNode instanceof checker.ReadVarExpr ? readNode.name : readNode.text;
        if (readName !== name && !seenLocals.has(readName) && availableTopLevel.has(readName)) {
            const runtimeRepresentation = getRuntimeRepresentation(readNode, reflection, evaluator);
            if (runtimeRepresentation === null) {
                return null;
            }
            local.push({ name: readName, runtimeRepresentation });
            seenLocals.add(readName);
        }
    }
    return {
        local,
        external: Array.from(visitor.namespaceReads, (name, index) => ({
            moduleName: name,
            assignedName: `ɵhmr${index}`,
        })),
    };
}
/**
 * Gets a node that can be used to represent an identifier in the HMR replacement code at runtime.
 */
function getRuntimeRepresentation(node, reflection, evaluator) {
    if (node instanceof checker.ReadVarExpr) {
        return checker.variable(node.name);
    }
    // Const enums can't be passed by reference, because their values are inlined.
    // Pass in an object literal with all of the values instead.
    if (isConstEnumReference(node, reflection)) {
        const evaluated = evaluator.evaluate(node);
        if (evaluated instanceof Map) {
            const members = [];
            for (const [name, value] of evaluated.entries()) {
                if (value instanceof checker.EnumValue &&
                    (value.resolved == null ||
                        typeof value.resolved === 'string' ||
                        typeof value.resolved === 'boolean' ||
                        typeof value.resolved === 'number')) {
                    members.push({
                        key: name,
                        quoted: false,
                        value: checker.literal(value.resolved),
                    });
                }
                else {
                    // TS is pretty restrictive about what values can be in a const enum so our evaluator
                    // should be able to handle them, however if we happen to hit such a case, we return null
                    // so the HMR update can be invalidated.
                    return null;
                }
            }
            return checker.literalMap(members);
        }
    }
    return checker.variable(node.text);
}
/**
 * Gets the names of all top-level declarations within the file (imports, declared classes etc).
 * @param sourceFile File in which to search for locals.
 */
function getTopLevelDeclarationNames(sourceFile) {
    const results = new Set();
    // Only look through the top-level statements.
    for (const node of sourceFile.statements) {
        // Class, function and const enum declarations need to be captured since they correspond
        // to runtime code. Intentionally excludes interfaces and type declarations.
        if (ts.isClassDeclaration(node) ||
            ts.isFunctionDeclaration(node) ||
            ts.isEnumDeclaration(node)) {
            if (node.name) {
                results.add(node.name.text);
            }
            continue;
        }
        // Variable declarations.
        if (ts.isVariableStatement(node)) {
            for (const decl of node.declarationList.declarations) {
                trackBindingName(decl.name, results);
            }
            continue;
        }
        // Import declarations.
        if (ts.isImportDeclaration(node) && node.importClause) {
            const importClause = node.importClause;
            // Skip over type-only imports since they won't be emitted to JS.
            if (importClause.isTypeOnly) {
                continue;
            }
            // import foo from 'foo'
            if (importClause.name) {
                results.add(importClause.name.text);
            }
            if (importClause.namedBindings) {
                const namedBindings = importClause.namedBindings;
                if (ts.isNamespaceImport(namedBindings)) {
                    // import * as foo from 'foo';
                    results.add(namedBindings.name.text);
                }
                else {
                    // import {foo} from 'foo';
                    namedBindings.elements.forEach((el) => {
                        if (!el.isTypeOnly) {
                            results.add(el.name.text);
                        }
                    });
                }
            }
            continue;
        }
    }
    return results;
}
/**
 * Adds all the variables declared through a `ts.BindingName` to a set of results.
 * @param node Node from which to start searching for variables.
 * @param results Set to which to add the matches.
 */
function trackBindingName(node, results) {
    if (ts.isIdentifier(node)) {
        results.add(node.text);
    }
    else {
        for (const el of node.elements) {
            if (!ts.isOmittedExpression(el)) {
                trackBindingName(el.name, results);
            }
        }
    }
}
/**
 * Visitor that will traverse an AST looking for potential top-level variable reads.
 * The reads are "potential", because the visitor doesn't account for local variables
 * inside functions.
 */
class PotentialTopLevelReadsVisitor extends checker.RecursiveAstVisitor$1 {
    allReads = new Set();
    namespaceReads = new Set();
    visitExternalExpr(ast, context) {
        if (ast.value.moduleName !== null) {
            this.namespaceReads.add(ast.value.moduleName);
        }
        super.visitExternalExpr(ast, context);
    }
    visitReadVarExpr(ast, context) {
        this.allReads.add(ast);
        super.visitReadVarExpr(ast, context);
    }
    visitWrappedNodeExpr(ast, context) {
        if (this.isTypeScriptNode(ast.node)) {
            this.addAllTopLevelIdentifiers(ast.node);
        }
        super.visitWrappedNodeExpr(ast, context);
    }
    /**
     * Traverses a TypeScript AST and tracks all the top-level reads.
     * @param node Node from which to start the traversal.
     */
    addAllTopLevelIdentifiers = (node) => {
        if (ts.isIdentifier(node) && this.isTopLevelIdentifierReference(node)) {
            this.allReads.add(node);
        }
        else {
            ts.forEachChild(node, this.addAllTopLevelIdentifiers);
        }
    };
    /**
     * TypeScript identifiers are used both when referring to a variable (e.g. `console.log(foo)`)
     * and for names (e.g. `{foo: 123}`). This function determines if the identifier is a top-level
     * variable read, rather than a nested name.
     * @param identifier Identifier to check.
     */
    isTopLevelIdentifierReference(identifier) {
        let node = identifier;
        let parent = node.parent;
        // The parent might be undefined for a synthetic node or if `setParentNodes` is set to false
        // when the SourceFile was created. We can account for such cases using the type checker, at
        // the expense of performance. At the moment of writing, we're keeping it simple since the
        // compiler sets `setParentNodes: true`.
        if (!parent) {
            return false;
        }
        // Unwrap parenthesized identifiers, but use the closest parenthesized expression
        // as the reference node so that we can check cases like `{prop: ((value))}`.
        if (ts.isParenthesizedExpression(parent) && parent.expression === node) {
            while (parent && ts.isParenthesizedExpression(parent)) {
                node = parent;
                parent = parent.parent;
            }
        }
        // Identifier referenced at the top level. Unlikely.
        if (ts.isSourceFile(parent)) {
            return true;
        }
        // Identifier used inside a call is only top-level if it's an argument.
        // This also covers decorators since their expression is usually a call.
        if (ts.isCallExpression(parent)) {
            return parent.expression === node || parent.arguments.includes(node);
        }
        // Identifier used in a nested expression is only top-level if it's the actual expression.
        if (ts.isExpressionStatement(parent) ||
            ts.isPropertyAccessExpression(parent) ||
            ts.isComputedPropertyName(parent) ||
            ts.isTemplateSpan(parent) ||
            ts.isSpreadAssignment(parent) ||
            ts.isSpreadElement(parent) ||
            ts.isAwaitExpression(parent) ||
            ts.isNonNullExpression(parent) ||
            ts.isIfStatement(parent) ||
            ts.isDoStatement(parent) ||
            ts.isWhileStatement(parent) ||
            ts.isSwitchStatement(parent) ||
            ts.isCaseClause(parent) ||
            ts.isThrowStatement(parent) ||
            ts.isNewExpression(parent)) {
            return parent.expression === node;
        }
        // Identifier used in an array is only top-level if it's one of the elements.
        if (ts.isArrayLiteralExpression(parent)) {
            return parent.elements.includes(node);
        }
        // If the parent is an initialized node, the identifier is
        // at the top level if it's the initializer itself.
        if (ts.isPropertyAssignment(parent) ||
            ts.isParameter(parent) ||
            ts.isBindingElement(parent) ||
            ts.isPropertyDeclaration(parent) ||
            ts.isEnumMember(parent)) {
            return parent.initializer === node;
        }
        // Identifier in a function is top level if it's either the name or the initializer.
        if (ts.isVariableDeclaration(parent)) {
            return parent.name === node || parent.initializer === node;
        }
        // Identifier in a declaration is only top level if it's the name.
        // In shorthand assignments the name is also the value.
        if (ts.isClassDeclaration(parent) ||
            ts.isFunctionDeclaration(parent) ||
            ts.isShorthandPropertyAssignment(parent)) {
            return parent.name === node;
        }
        if (ts.isElementAccessExpression(parent)) {
            return parent.expression === node || parent.argumentExpression === node;
        }
        if (ts.isBinaryExpression(parent)) {
            return parent.left === node || parent.right === node;
        }
        if (ts.isForInStatement(parent) || ts.isForOfStatement(parent)) {
            return parent.expression === node || parent.initializer === node;
        }
        if (ts.isForStatement(parent)) {
            return (parent.condition === node || parent.initializer === node || parent.incrementor === node);
        }
        if (ts.isArrowFunction(parent)) {
            return parent.body === node;
        }
        // It's unlikely that we'll run into imports/exports in this use case.
        // We handle them since it's simple and for completeness' sake.
        if (ts.isImportSpecifier(parent) || ts.isExportSpecifier(parent)) {
            return (parent.propertyName || parent.name) === node;
        }
        if (ts.isConditionalExpression(parent)) {
            return parent.condition === node || parent.whenFalse === node || parent.whenTrue === node;
        }
        // Otherwise it's not top-level.
        return false;
    }
    /** Checks if a value is a TypeScript AST node. */
    isTypeScriptNode(value) {
        // If this is too permissive, we can also check for `getSourceFile`. This code runs
        // on a narrow set of use cases so checking for `kind` should be enough.
        return !!value && typeof value.kind === 'number';
    }
}
/** Checks whether a node is a reference to a const enum. */
function isConstEnumReference(node, reflection) {
    const parent = node.parent;
    // Only check identifiers that are in the form of `Foo.bar` where `Foo` is the node being checked.
    if (!parent ||
        !ts.isPropertyAccessExpression(parent) ||
        parent.expression !== node ||
        !ts.isIdentifier(parent.name)) {
        return false;
    }
    const declaration = reflection.getDeclarationOfIdentifier(node);
    return (declaration !== null &&
        ts.isEnumDeclaration(declaration.node) &&
        !!declaration.node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ConstKeyword));
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Extracts the HMR metadata for a class declaration.
 * @param clazz Class being analyzed.
 * @param reflection Reflection host.
 * @param compilerHost Compiler host to use when resolving file names.
 * @param rootDirs Root directories configured by the user.
 * @param definition Analyzed component definition.
 * @param factory Analyzed component factory.
 * @param deferBlockMetadata Metadata about the defer blocks in the component.
 * @param classMetadata Analyzed `setClassMetadata` expression, if any.
 * @param debugInfo Analyzed `setClassDebugInfo` expression, if any.
 */
function extractHmrMetatadata(clazz, reflection, evaluator, compilerHost, rootDirs, definition, factory, deferBlockMetadata, classMetadata, debugInfo) {
    if (!reflection.isClass(clazz)) {
        return null;
    }
    const sourceFile = ts.getOriginalNode(clazz).getSourceFile();
    const filePath = getProjectRelativePath(sourceFile.fileName, rootDirs, compilerHost) ||
        compilerHost.getCanonicalFileName(sourceFile.fileName);
    const dependencies = extractHmrDependencies(clazz, definition, factory, deferBlockMetadata, classMetadata, debugInfo, reflection, evaluator);
    if (dependencies === null) {
        return null;
    }
    const meta = {
        type: new checker.WrappedNodeExpr(clazz.name),
        className: clazz.name.text,
        filePath,
        localDependencies: dependencies.local,
        namespaceDependencies: dependencies.external,
    };
    return meta;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Gets the declaration for the function that replaces the metadata of a class during HMR.
 * @param compilationResults Code generated for the class during compilation.
 * @param meta HMR metadata about the class.
 * @param declaration Class for which the update declaration is being generated.
 */
function getHmrUpdateDeclaration(compilationResults, constantStatements, meta, declaration) {
    const namespaceSpecifiers = meta.namespaceDependencies.reduce((result, current) => {
        result.set(current.moduleName, current.assignedName);
        return result;
    }, new Map());
    const importRewriter = new HmrModuleImportRewriter(namespaceSpecifiers);
    const importManager = new checker.ImportManager({
        ...checker.presetImportManagerForceNamespaceImports,
        rewriter: importRewriter,
    });
    const callback = compileHmrUpdateCallback(compilationResults, constantStatements, meta);
    const sourceFile = ts.getOriginalNode(declaration).getSourceFile();
    const node = checker.translateStatement(sourceFile, callback, importManager);
    // The output AST doesn't support modifiers so we have to emit to
    // TS and then update the declaration to add `export default`.
    return ts.factory.updateFunctionDeclaration(node, [
        ts.factory.createToken(ts.SyntaxKind.ExportKeyword),
        ts.factory.createToken(ts.SyntaxKind.DefaultKeyword),
    ], node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, node.body);
}
class HmrModuleImportRewriter {
    lookup;
    constructor(lookup) {
        this.lookup = lookup;
    }
    rewriteNamespaceImportIdentifier(specifier, moduleName) {
        return this.lookup.has(moduleName) ? this.lookup.get(moduleName) : specifier;
    }
    rewriteSymbol(symbol) {
        return symbol;
    }
    rewriteSpecifier(specifier) {
        return specifier;
    }
}

const EMPTY_ARRAY = [];
const isUsedDirective = (decl) => decl.kind === checker.R3TemplateDependencyKind.Directive;
const isUsedPipe = (decl) => decl.kind === checker.R3TemplateDependencyKind.Pipe;
/**
 * `DecoratorHandler` which handles the `@Component` annotation.
 */
class ComponentDecoratorHandler {
    reflector;
    evaluator;
    metaRegistry;
    metaReader;
    scopeReader;
    compilerHost;
    scopeRegistry;
    typeCheckScopeRegistry;
    resourceRegistry;
    isCore;
    strictCtorDeps;
    resourceLoader;
    rootDirs;
    defaultPreserveWhitespaces;
    i18nUseExternalIds;
    enableI18nLegacyMessageIdFormat;
    usePoisonedData;
    i18nNormalizeLineEndingsInICUs;
    moduleResolver;
    cycleAnalyzer;
    cycleHandlingStrategy;
    refEmitter;
    referencesRegistry;
    depTracker;
    injectableRegistry;
    semanticDepGraphUpdater;
    annotateForClosureCompiler;
    perf;
    hostDirectivesResolver;
    importTracker;
    includeClassMetadata;
    compilationMode;
    deferredSymbolTracker;
    forbidOrphanRendering;
    enableBlockSyntax;
    enableLetSyntax;
    externalRuntimeStyles;
    localCompilationExtraImportsTracker;
    jitDeclarationRegistry;
    i18nPreserveSignificantWhitespace;
    strictStandalone;
    enableHmr;
    implicitStandaloneValue;
    constructor(reflector, e   valuator, metaRegistry, metaReader, scopeReader, compilerHost, scopeRegistry, typeCheckScopeRegistry, resourceRegistry, isCore, strictCtorDeps, resourceLoader, rootDirs, defaultPreserveWhitespaces, i18nUseExternalIds, enableI18nLegacyMessageIdFormat, usePoisonedData, i18nNormalizeLineEndingsInICUs, moduleResolver, cycleAnalyzer, cycleHandlingStrategy, refEmitter, referencesRegistry, depTracker, injectableRegistry, semanticDepGraphUpdater, annotateForClosureCompiler, perf, hostDirectivesResolver, importTracker, includeClassMetadata, compilationMode, deferredSymbolTracker, forbidOrphanRendering, enableBlockSyntax, enableLetSyntax, externalRuntimeStyles, localCompilationExtraImportsTracker, jitDeclarationRegistry, i18nPreserveSignificantWhitespace, strictStandalone, enableHmr, implicitStandaloneValue) {
        this.reflector = reflector;
        this.evaluator = evaluator;
        this.metaRegistry = metaRegistry;
        this.metaReader = metaReader;
        this.scopeReader = scopeReader;
        this.compilerHost = compilerHost;
        this.scopeRegistry = scopeRegistry;
        this.typeCheckScopeRegistry = typeCheckScopeRegistry;
        this.resourceRegistry = resourceRegistry;
        this.isCore = isCore;
        this.strictCtorDeps = strictCtorDeps;
        this.resourceLoader = resourceLoader;
        this.rootDirs = rootDirs;
        this.defaultPreserveWhitespaces = defaultPreserveWhitespaces;
        this.i18nUseExternalIds = i18nUseExternalIds;
        this.enableI18nLegacyMessageIdFormat = enableI18nLegacyMessageIdFormat;
        this.usePoisonedData = usePoisonedData;
        this.i18nNormalizeLineEndingsInICUs = i18nNormalizeLineEndingsInICUs;
        this.moduleResolver = moduleResolver;
        this.cycleAnalyzer = cycleAnalyzer;
        this.cycleHandlingStrategy = cycleHandlingStrategy;
        this.refEmitter = refEmitter;
        this.referencesRegistry = referencesRegistry;
        this.depTracker = depTracker;
        this.injectableRegistry = injectableRegistry;
        this.semanticDepGraphUpdater = semanticDepGraphUpdater;
        this.annotateForClosureCompiler = annotateForClosureCompiler;
        this.perf = perf;
        this.hostDirectivesResolver = hostDirectivesResolver;
        this.importTracker = importTracker;
        this.includeClassMetadata = includeClassMetadata;
        this.compilationMode = compilationMode;
        this.deferredSymbolTracker = deferredSymbolTracker;
        this.forbidOrphanRendering = forbidOrphanRendering;
        this.enableBlockSyntax = enableBlockSyntax;
        this.enableLetSyntax = enableLetSyntax;
        this.externalRuntimeStyles = externalRuntimeStyles;
        this.localCompilationExtraImportsTracker = localCompilationExtraImportsTracker;
        this.jitDeclarationRegistry = jitDeclarationRegistry;
        this.i18nPreserveSignificantWhitespace = i18nPreserveSignificantWhitespace;
        this.strictStandalone = strictStandalone;
        this.enableHmr = enableHmr;
        this.implicitStandaloneValue = implicitStandaloneValue;
        this.extractTemplateOptions = {
            enableI18nLegacyMessageIdFormat: this.enableI18nLegacyMessageIdFormat,
            i18nNormalizeLineEndingsInICUs: this.i18nNormalizeLineEndingsInICUs,
            usePoisonedData: this.usePoisonedData,
            enableBlockSyntax: this.enableBlockSyntax,
            enableLetSyntax: this.enableLetSyntax,
            preserveSignificantWhitespace: this.i18nPreserveSignificantWhitespace,
        };
        // Dependencies can't be deferred during HMR, because the HMR update module can't have
        // dynamic imports and its dependencies need to be passed in directly. If dependencies
        // are deferred, their imports will be deleted so we may lose the reference to them.
        this.canDeferDeps = !enableHmr;
    }
    literalCache = new Map();
    elementSchemaRegistry = new checker.DomElementSchemaRegistry();
    /**
     * During the asynchronous preanalyze phase, it's necessary to parse the template to extract
     * any potential <link> tags which might need to be loaded. This cache ensures that work is not
     * thrown away, and the parsed template is reused during the analyze phase.
     */
    preanalyzeTemplateCache = new Map();
    preanalyzeStylesCache = new Map();
    /** Whether generated code for a component can defer its dependencies. */
    canDeferDeps;
    extractTemplateOptions;
    precedence = checker.HandlerPrecedence.PRIMARY;
    name = 'ComponentDecoratorHandler';
    detect(node, decorators) {
        if (!decorators) {
            return undefined;
        }
        const decorator = checker.findAngularDecorator(decorators, 'Component', this.isCore);
        if (decorator !== undefined) {
            return {
                trigger: decorator.node,
                decorator,
                metadata: decorator,
            };
        }
        else {
            return undefined;
        }
    }
    preanalyze(node, decorator) {
        // In preanalyze, resource URLs associated with the component are asynchronously preloaded via
        // the resourceLoader. This is the only time async operations are allowed for a component.
        // These resources are:
        //
        // - the templateUrl, if there is one
        // - any styleUrls if present
        // - any stylesheets referenced from <link> tags in the template itself
        //
        // As a result of the last one, the template must be parsed as part of preanalysis to extract
        // <link> tags, which may involve waiting for the templateUrl to be resolved first.
        // If preloading isn't possible, then skip this step.
        if (!this.resourceLoader.canPreload) {
            return undefined;
        }
        const meta = resolveLiteral(decorator, this.literalCache);
        const component = checker.reflectObjectLiteral(meta);
        const containingFile = node.getSourceFile().fileName;
        const resolveStyleUrl = (styleUrl) => {
            try {
                const resourceUrl = this.resourceLoader.resolve(styleUrl, containingFile);
                return this.resourceLoader.preload(resourceUrl, {
                    type: 'style',
                    containingFile,
                    className: node.name.text,
                });
            }
            catch {
                // Don't worry about failures to preload. We can handle this problem during analysis by
                // producing a diagnostic.
                return undefined;
            }
        };
        // A Promise that waits for the template and all <link>ed styles within it to be preloaded.
        const templateAndTemplateStyleResources = preloadAndParseTemplate(this.evaluator, this.resourceLoader, this.depTracker, this.preanalyzeTemplateCache, node, decorator, component, containingFile, this.defaultPreserveWhitespaces, this.extractTemplateOptions, this.compilationMode).then((template) => {
            if (template === null) {
                return { templateStyles: [], templateStyleUrls: [] };
            }
            let templateUrl;
            if (template.sourceMapping.type === 'external') {
                templateUrl = template.sourceMapping.templateUrl;
            }
            return {
                templateUrl,
                templateStyles: template.styles,
                templateStyleUrls: template.styleUrls,
            };
        });
        // Extract all the styleUrls in the decorator.
        const componentStyleUrls = extractComponentStyleUrls(this.evaluator, component);
        return templateAndTemplateStyleResources.then(async (templateInfo) => {
            // Extract inline styles, process, and cache for use in synchronous analyze phase
            let styles = null;
            // Order plus className allows inline styles to be identified per component by a preprocessor
            let orderOffset = 0;
            const rawStyles = checker.parseDirectiveStyles(component, this.evaluator, this.compilationMode);
            if (rawStyles?.length) {
                styles = await Promise.all(rawStyles.map((style) => this.resourceLoader.preprocessInline(style, {
                    type: 'style',
                    containingFile,
                    order: orderOffset++,
                    className: node.name.text,
                })));
            }
            if (templateInfo.templateStyles) {
                styles ??= [];
                styles.push(...(await Promise.all(templateInfo.templateStyles.map((style) => this.resourceLoader.preprocessInline(style, {
                    type: 'style',
                    containingFile: templateInfo.templateUrl ?? containingFile,
                    order: orderOffset++,
                    className: node.name.text,
                })))));
            }
            this.preanalyzeStylesCache.set(node, styles);
            if (this.externalRuntimeStyles) {
                // No preanalysis required for style URLs with external runtime styles
                return;
            }
            // Wait for both the template and all styleUrl resources to resolve.
            await Promise.all([
                ...componentStyleUrls.map((styleUrl) => resolveStyleUrl(styleUrl.url)),
                ...templateInfo.templateStyleUrls.map((url) => resolveStyleUrl(url)),
            ]);
        });
    }
    analyze(node, decorator) {
        this.perf.eventCount(checker.PerfEvent.AnalyzeComponent);
        const containingFile = node.getSourceFile().fileName;
        this.literalCache.delete(decorator);
        let diagnostics;
        let isPoisoned = false;
        // @Component inherits @Directive, so begin by extracting the @Directive metadata and building
        // on it.
        const directiveResult = checker.extractDirectiveMetadata(node, decorator, this.reflector, this.importTracker, this.evaluator, this.refEmitter, this.referencesRegistry, this.isCore, this.annotateForClosureCompiler, this.compilationMode, this.elementSchemaRegistry.getDefaultComponentElementName(), this.strictStandalone, this.implicitStandaloneValue);
        // `extractDirectiveMetadata` returns `jitForced = true` when the `@Component` has
        // set `jit: true`. In this case, compilation of the decorator is skipped. Returning
        // an empty object signifies that no analysis was produced.
        if (directiveResult.jitForced) {
            this.jitDeclarationRegistry.jitDeclarations.add(node);
            return {};
        }
        // Next, read the `@Component`-specific fields.
        const { decorator: component, metadata, inputs, outputs, hostDirectives, rawHostDirectives, } = directiveResult;
        const encapsulation = (this.compilationMode !== checker.CompilationMode.LOCAL
            ? resolveEnumValue(this.evaluator, component, 'encapsulation', 'ViewEncapsulation', this.isCore)
            : resolveEncapsulationEnumValueLocally(component.get('encapsulation'))) ??
            checker.ViewEncapsulation.Emulated;
        let changeDetection = null;
        if (this.compilationMode !== checker.CompilationMode.LOCAL) {
            changeDetection = resolveEnumValue(this.evaluator, component, 'changeDetection', 'ChangeDetectionStrategy', this.isCore);
        }
        else if (component.has('changeDetection')) {
            changeDetection = new checker.WrappedNodeExpr(component.get('changeDetection'));
        }
        let animations = null;
        let animationTriggerNames = null;
        if (component.has('animations')) {
            const animationExpression = component.get('animations');
            animations = new checker.WrappedNodeExpr(animationExpression);
            const animationsValue = this.evaluator.evaluate(animationExpression, animationTriggerResolver);
            animationTriggerNames = { includesDynamicAnimations: false, staticTriggerNames: [] };
            collectAnimationNames(animationsValue, animationTriggerNames);
        }
        // Go through the root directories for this project, and select the one with the smallest
        // relative path representation.
        const relativeContextFilePath = this.rootDirs.reduce((previous, rootDir) => {
            const candidate = checker.relative(checker.absoluteFrom(rootDir), checker.absoluteFrom(containingFile));
            if (previous === undefined || candidate.length < previous.length) {
                return candidate;
            }
            else {
                return previous;
            }
        }, undefined);
        // Note that we could technically combine the `viewProvidersRequiringFactory` and
        // `providersRequiringFactory` into a single set, but we keep the separate so that
        // we can distinguish where an error is coming from when logging the diagnostics in `resolve`.
        let viewProvidersRequiringFactory = null;
        let providersRequiringFactory = null;
        let wrappedViewProviders = null;
        if (component.has('viewProviders')) {
            const viewProviders = component.get('viewProviders');
            viewProvidersRequiringFactory = checker.resolveProvidersRequiringFactory(viewProviders, this.reflector, this.evaluator);
            wrappedViewProviders = new checker.WrappedNodeExpr(this.annotateForClosureCompiler
                ? checker.wrapFunctionExpressionsInParens(viewProviders)
                : viewProviders);
        }
        if (component.has('providers')) {
            providersRequiringFactory = checker.resolveProvidersRequiringFactory(component.get('providers'), this.reflector, this.evaluator);
        }
        let resolvedImports = null;
        let resolvedDeferredImports = null;
        let rawImports = component.get('imports') ?? null;
        let rawDeferredImports = component.get('deferredImports') ?? null;
        if ((rawImports || rawDeferredImports) && !metadata.isStandalone) {
            if (diagnostics === undefined) {
                diagnostics = [];
            }
            const importsField = rawImports ? 'imports' : 'deferredImports';
            diagnostics.push(checker.makeDiagnostic(checker.ErrorCode.COMPONENT_NOT_STANDALONE, component.get(importsField), `'${importsField}' is only valid on a component that is standalone.`, [
                checker.makeRelatedInformation(node.name, `Did you forget to add 'standalone: true' to this @Component?`),
            ]));
            // Poison the component so that we don't spam further template type-checking errors that
            // result from misconfigured imports.
            isPoisoned = true;
        }
        else if (this.compilationMode !== checker.CompilationMode.LOCAL &&
            (rawImports || rawDeferredImports)) {
            const importResolvers = checker.combineResolvers([
                createModuleWithProvidersResolver(this.reflector, this.isCore),
                checker.createForwardRefResolver(this.isCore),
            ]);
            const importDiagnostics = [];
            if (rawImports) {
                const expr = rawImports;
                const imported = this.evaluator.evaluate(expr, importResolvers);
                const { imports: flattened, diagnostics } = validateAndFlattenComponentImports(imported, expr, false /* isDeferred */);
                importDiagnostics.push(...diagnostics);
                resolvedImports = flattened;
                rawImports = expr;
            }
            if (rawDeferredImports) {
                const expr = rawDeferredImports;
                const imported = this.evaluator.evaluate(expr, importResolvers);
                const { imports: flattened, diagnostics } = validateAndFlattenComponentImports(imported, expr, true /* isDeferred */);
                importDiagnostics.push(...diagnostics);
                resolvedDeferredImports = flattened;
                rawDeferredImports = expr;
            }
            if (importDiagnostics.length > 0) {
                isPoisoned = true;
                if (diagnostics === undefined) {
                    diagnostics = [];
                }
                diagnostics.push(...importDiagnostics);
            }
        }
        let schemas = null;
        if (component.has('schemas') && !metadata.isStandalone) {
            if (diagnostics === undefined) {
                diagnostics = [];
            }
            diagnostics.push(checker.makeDiagnostic(checker.ErrorCode.COMPONENT_NOT_STANDALONE, component.get('schemas'), `'schemas' is only valid on a component that is standalone.`));
        }
        else if (this.compilationMode !== checker.CompilationMode.LOCAL && component.has('schemas')) {
            schemas = extractSchemas(component.get('schemas'), this.evaluator, 'Component');
        }
        else if (metadata.isStandalone) {
            schemas = [];
        }
        // Parse the template.
        // If a preanalyze phase was executed, the template may already exist in parsed form, so check
        // the preanalyzeTemplateCache.
        // Extract a closure of the template parsing code so that it can be reparsed with different
        // options if needed, like in the indexing pipeline.
        let template;
        if (this.preanalyzeTemplateCache.has(node)) {
            // The template was parsed in preanalyze. Use it and delete it to save memory.
            const preanalyzed = this.preanalyzeTemplateCache.get(node);
            this.preanalyzeTemplateCache.delete(node);
            template = preanalyzed;
        }
        else {
            const templateDecl = parseTemplateDeclaration(node, decorator, component, containingFile, this.evaluator, this.depTracker, this.resourceLoader, this.defaultPreserveWhitespaces);
            template = extractTemplate(node, templateDecl, this.evaluator, this.depTracker, this.resourceLoader, {
                enableI18nLegacyMessageIdFormat: this.enableI18nLegacyMessageIdFormat,
                i18nNormalizeLineEndingsInICUs: this.i18nNormalizeLineEndingsInICUs,
                usePoisonedData: this.usePoisonedData,
                enableBlockSyntax: this.enableBlockSyntax,
                enableLetSyntax: this.enableLetSyntax,
                preserveSignificantWhitespace: this.i18nPreserveSignificantWhitespace,
            }, this.compilationMode);
            if (this.compilationMode === checker.CompilationMode.LOCAL &&
                template.errors &&
                template.errors.length > 0) {
                // Template errors are handled at the type check phase. But we skip this phase in local
                // compilation mode. As a result we need to handle the errors now and add them to the diagnostics.
                if (diagnostics === undefined) {
                    diagnostics = [];
                }
                diagnostics.push(...checker.getTemplateDiagnostics(template.errors, 
                // Type check ID is required as part of the ype check, mainly for mapping the
                // diagnostic back to its source. But here we are generating the diagnostic outside
                // of the type check context, and so we skip the template ID.
                '', template.sourceMapping));
            }
        }
        const templateResource = template.declaration.isInline
            ? { path: null, expression: component.get('template') }
            : {
                path: checker.absoluteFrom(template.declaration.resolvedTemplateUrl),
                expression: template.sourceMapping.node,
            };
        const relativeTemplatePath = getProjectRelativePath(templateResource.path ?? ts.getOriginalNode(node).getSourceFile().fileName, this.rootDirs, this.compilerHost);
        // Figure out the set of styles. The ordering here is important: external resources (styleUrls)
        // precede inline styles, and styles defined in the template override styles defined in the
        // component.
        let styles = [];
        const externalStyles = [];
        const styleResources = extractInlineStyleResources(component);
        const styleUrls = [
            ...extractComponentStyleUrls(this.evaluator, component),
            ..._extractTemplateStyleUrls(template),
        ];
        for (const styleUrl of styleUrls) {
            try {
                const resourceUrl = this.resourceLoader.resolve(styleUrl.url, containingFile);
                if (this.externalRuntimeStyles) {
                    // External runtime styles are not considered disk-based and may not actually exist on disk
                    externalStyles.push(resourceUrl);
                    continue;
                }
                if (styleUrl.source === 2 /* ResourceTypeForDiagnostics.StylesheetFromDecorator */ &&
                    ts.isStringLiteralLike(styleUrl.expression)) {
                    // Only string literal values from the decorator are considered style resources
                    styleResources.add({
                        path: checker.absoluteFrom(resourceUrl),
                        expression: styleUrl.expression,
                    });
                }
                const resourceStr = this.resourceLoader.load(resourceUrl);
                styles.push(resourceStr);
                if (this.depTracker !== null) {
                    this.depTracker.addResourceDependency(node.getSourceFile(), checker.absoluteFrom(resourceUrl));
                }
            }
            catch {
                if (this.depTracker !== null) {
                    // The analysis of this file cannot be re-used if one of the style URLs could
                    // not be resolved or loaded. Future builds should re-analyze and re-attempt
                    // resolution/loading.
                    this.depTracker.recordDependencyAnalysisFailure(node.getSourceFile());
                }
                if (diagnostics === undefined) {
                    diagnostics = [];
                }
                const resourceType = styleUrl.source === 2 /* ResourceTypeForDiagnostics.StylesheetFromDecorator */
                    ? 2 /* ResourceTypeForDiagnostics.StylesheetFromDecorator */
                    : 1 /* ResourceTypeForDiagnostics.StylesheetFromTemplate */;
                diagnostics.push(makeResourceNotFoundError(styleUrl.url, styleUrl.expression, resourceType).toDiagnostic());
            }
        }
        if (encapsulation === checker.ViewEncapsulation.ShadowDom && metadata.selector !== null) {
            const selectorError = checkCustomElementSelectorForErrors(metadata.selector);
            if (selectorError !== null) {
                if (diagnostics === undefined) {
                    diagnostics = [];
                }
                diagnostics.push(checker.makeDiagnostic(checker.ErrorCode.COMPONENT_INVALID_SHADOW_DOM_SELECTOR, component.get('selector'), selectorError));
            }
        }
        // If inline styles were preprocessed use those
        let inlineStyles = null;
        if (this.preanalyzeStylesCache.has(node)) {
            inlineStyles = this.preanalyzeStylesCache.get(node);
            this.preanalyzeStylesCache.delete(node);
            if (inlineStyles?.length) {
                if (this.externalRuntimeStyles) {
                    // When external runtime styles is enabled, a list of URLs is provided
                    externalStyles.push(...inlineStyles);
                }
                else {
                    styles.push(...inlineStyles);
                }
            }
        }
        else {
            // Preprocessing is only supported asynchronously
            // If no style cache entry is present asynchronous preanalyze was not executed.
            // This protects against accidental differences in resource contents when preanalysis
            // is not used with a provided transformResource hook on the ResourceHost.
            if (this.resourceLoader.canPreprocess) {
                throw new Error('Inline resource processing requires asynchronous preanalyze.');
            }
            if (component.has('styles')) {
                const litStyles = checker.parseDirectiveStyles(component, this.evaluator, this.compilationMode);
                if (litStyles !== null) {
                    inlineStyles = [...litStyles];
                    styles.push(...litStyles);
                }
            }
            if (template.styles.length > 0) {
                styles.push(...template.styles);
            }
        }
        // Collect all explicitly deferred symbols from the `@Component.deferredImports` field
        // (if it exists) and populate the `DeferredSymbolTracker` state. These operations are safe
        // for the local compilation mode, since they don't require accessing/resolving symbols
        // outside of the current source file.
        let explicitlyDeferredTypes = null;
        if (metadata.isStandalone && rawDeferredImports !== null) {
            const deferredTypes = this.collectExplicitlyDeferredSymbols(rawDeferredImports);
            for (const [deferredType, importDetails] of deferredTypes) {
                explicitlyDeferredTypes ??= [];
                explicitlyDeferredTypes.push({
                    symbolName: importDetails.name,
                    importPath: importDetails.from,
                    isDefaultImport: isDefaultImport(importDetails.node),
                });
                this.deferredSymbolTracker.markAsDeferrableCandidate(deferredType, importDetails.node, node, true /* isExplicitlyDeferred */);
            }
        }
        const output = {
            analysis: {
                baseClass: checker.readBaseClass(node, this.reflector, this.evaluator),
                inputs,
                inputFieldNamesFromMetadataArray: directiveResult.inputFieldNamesFromMetadataArray,
                outputs,
                hostDirectives,
                rawHostDirectives,
                meta: {
                    ...metadata,
                    template,
                    encapsulation,
                    changeDetection,
                    interpolation: template.interpolationConfig ?? checker.DEFAULT_INTERPOLATION_CONFIG,
                    styles,
                    externalStyles,
                    // These will be replaced during the compilation step, after all `NgModule`s have been
                    // analyzed and the full compilation scope for the component can be realized.
                    animations,
                    viewProviders: wrappedViewProviders,
                    i18nUseExternalIds: this.i18nUseExternalIds,
                    relativeContextFilePath,
                    rawImports: rawImports !== null ? new checker.WrappedNodeExpr(rawImports) : undefined,
                    relativeTemplatePath,
                },
                typeCheckMeta: checker.extractDirectiveTypeCheckMeta(node, inputs, this.reflector),
                classMetadata: this.includeClassMetadata
                    ? extractClassMetadata(node, this.reflector, this.isCore, this.annotateForClosureCompiler, (dec) => transformDecoratorResources(dec, component, styles, template))
                    : null,
                classDebugInfo: extractClassDebugInfo(node, this.reflector, this.compilerHost, this.rootDirs, 
                /* forbidOrphanRenderering */ this.forbidOrphanRendering),
                template,
                providersRequiringFactory,
                viewProvidersRequiringFactory,
                inlineStyles,
                styleUrls,
                resources: {
                    styles: styleResources,
                    template: templateResource,
                },
                isPoisoned,
                animationTriggerNames,
                rawImports,
                resolvedImports,
                rawDeferredImports,
                resolvedDeferredImports,
                explicitlyDeferredTypes,
                schemas,
                decorator: decorator?.node ?? null,
            },
            diagnostics,
        };
        return output;
    }
    symbol(node, analysis) {
        const typeParameters = extractSemanticTypeParameters(node);
        return new ComponentSymbol(node, analysis.meta.selector, analysis.inputs, analysis.outputs, analysis.meta.exportAs, analysis.typeCheckMeta, typeParameters);
    }
    register(node, analysis) {
        // Register this component's information with the `MetadataRegistry`. This ensures that
        // the information about the component is available during the compile() phase.
        const ref = new checker.Reference(node);
        this.metaRegistry.registerDirectiveMetadata({
            kind: checker.MetaKind.Directive,
            matchSource: checker.MatchSource.Selector,
            ref,
            name: node.name.text,
            selector: analysis.meta.selector,
            exportAs: analysis.meta.exportAs,
            inputs: analysis.inputs,
            inputFieldNamesFromMetadataArray: analysis.inputFieldNamesFromMetadataArray,
            outputs: analysis.outputs,
            queries: analysis.meta.queries.map((query) => query.propertyName),
            isComponent: true,
            baseClass: analysis.baseClass,
            hostDirectives: analysis.hostDirectives,
            ...analysis.typeCheckMeta,
            isPoisoned: analysis.isPoisoned,
            isStructural: false,
            isStandalone: analysis.meta.isStandalone,
            isSignal: analysis.meta.isSignal,
            imports: analysis.resolvedImports,
            rawImports: analysis.rawImports,
            deferredImports: analysis.resolvedDeferredImports,
            animationTriggerNames: analysis.animationTriggerNames,
            schemas: analysis.schemas,
            decorator: analysis.decorator,
            assumedToExportProviders: false,
            ngContentSelectors: analysis.template.ngContentSelectors,
            preserveWhitespaces: analysis.template.preserveWhitespaces ?? false,
            isExplicitlyDeferred: false,
        });
        this.resourceRegistry.registerResources(analysis.resources, node);
        this.injectableRegistry.registerInjectable(node, {
            ctorDeps: analysis.meta.deps,
        });
    }
    index(context, node, analysis) {
        if (analysis.isPoisoned && !this.usePoisonedData) {
            return null;
        }
        const scope = this.scopeReader.getScopeForComponent(node);
        const selector = analysis.meta.selector;
        const matcher = new checker.SelectorMatcher();
        if (scope !== null) {
            let { dependencies, isPoisoned } = scope.kind === checker.ComponentScopeKind.NgModule ? scope.compilation : scope;
            if ((isPoisoned || (scope.kind === checker.ComponentScopeKind.NgModule && scope.exported.isPoisoned)) &&
                !this.usePoisonedData) {
                // Don't bother indexing components which had erroneous scopes, unless specifically
                // requested.
                return null;
            }
            for (const dep of dependencies) {
                if (dep.kind === checker.MetaKind.Directive && dep.selector !== null) {
                    matcher.addSelectables(checker.CssSelector.parse(dep.selector), [
                        ...this.hostDirectivesResolver.resolve(dep),
                        dep,
                    ]);
                }
            }
        }
        const binder = new checker.R3TargetBinder(matcher);
        const boundTemplate = binder.bind({ template: analysis.template.diagNodes });
        context.addComponent({
            declaration: node,
            selector,
            boundTemplate,
            templateMeta: {
                isInline: analysis.template.declaration.isInline,
                file: analysis.template.file,
            },
        });
        return null;
    }
    typeCheck(ctx, node, meta) {
        if (this.typeCheckScopeRegistry === null || !ts.isClassDeclaration(node)) {
            return;
        }
        if (meta.isPoisoned && !this.usePoisonedData) {
            return;
        }
        const scope = this.typeCheckScopeRegistry.getTypeCheckScope(node);
        if (scope.isPoisoned && !this.usePoisonedData) {
            // Don't type-check components that had errors in their scopes, unless requested.
            return;
        }
        const binder = new checker.R3TargetBinder(scope.matcher);
        const templateContext = {
            nodes: meta.template.diagNodes,
            pipes: scope.pipes,
            sourceMapping: meta.template.sourceMapping,
            file: meta.template.file,
            parseErrors: meta.template.errors,
            preserveWhitespaces: meta.meta.template.preserveWhitespaces ?? false,
        };
        ctx.addDirective(new checker.Reference(node), binder, scope.schemas, templateContext, meta.meta.isStandalone);
    }
    extendedTemplateCheck(component, extendedTemplateChecker) {
        return extendedTemplateChecker.getDiagnosticsForComponent(component);
    }
    templateSemanticsCheck(component, templateSemanticsChecker) {
        return templateSemanticsChecker.getDiagnosticsForComponent(component);
    }
    resolve(node, analysis, symbol) {
        const metadata = analysis.meta;
        const diagnostics = [];
        const context = checker.getSourceFile(node);
        // Check if there are some import declarations that contain symbols used within
        // the `@Component.deferredImports` field, but those imports contain other symbols
        // and thus the declaration can not be removed. This diagnostics is shared between local and
        // global compilation modes.
        const nonRemovableImports = this.deferredSymbolTracker.getNonRemovableDeferredImports(context, node);
        if (nonRemovableImports.length > 0) {
            for (const importDecl of nonRemovableImports) {
                const diagnostic = checker.makeDiagnostic(checker.ErrorCode.DEFERRED_DEPENDENCY_IMPORTED_EAGERLY, importDecl, `This import contains symbols that are used both inside and outside of the ` +
                    `\`@Component.deferredImports\` fields in the file. This renders all these ` +
                    `defer imports useless as this import remains and its module is eagerly loaded. ` +
                    `To fix this, make sure that all symbols from the import are *only* used within ` +
                    `\`@Component.deferredImports\` arrays and there are no other references to those ` +
                    `symbols present in this file.`);
                diagnostics.push(diagnostic);
            }
            return { diagnostics };
        }
        let data;
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            // Initial value in local compilation mode.
            data = {
                declarations: EMPTY_ARRAY,
                declarationListEmitMode: !analysis.meta.isStandalone || analysis.rawImports !== null
                    ? 3 /* DeclarationListEmitMode.RuntimeResolved */
                    : 0 /* DeclarationListEmitMode.Direct */,
                deferPerBlockDependencies: this.locateDeferBlocksWithoutScope(analysis.template),
                deferBlockDepsEmitMode: 1 /* DeferBlockDepsEmitMode.PerComponent */,
                deferrableDeclToImportDecl: new Map(),
                deferPerComponentDependencies: analysis.explicitlyDeferredTypes ?? [],
            };
            if (this.localCompilationExtraImportsTracker === null) {
                // In local compilation mode the resolve phase is only needed for generating extra imports.
                // Otherwise we can skip it.
                return { data };
            }
        }
        else {
            // Initial value in global compilation mode.
            data = {
                declarations: EMPTY_ARRAY,
                declarationListEmitMode: 0 /* DeclarationListEmitMode.Direct */,
                deferPerBlockDependencies: new Map(),
                deferBlockDepsEmitMode: 0 /* DeferBlockDepsEmitMode.PerBlock */,
                deferrableDeclToImportDecl: new Map(),
                deferPerComponentDependencies: [],
            };
        }
        if (this.semanticDepGraphUpdater !== null && analysis.baseClass instanceof checker.Reference) {
            symbol.baseClass = this.semanticDepGraphUpdater.getSymbol(analysis.baseClass.node);
        }
        if (analysis.isPoisoned && !this.usePoisonedData) {
            return {};
        }
        const scope = this.scopeReader.getScopeForComponent(node);
        if (scope !== null) {
            // Replace the empty components and directives from the analyze() step with a fully expanded
            // scope. This is possible now because during resolve() the whole compilation unit has been
            // fully analyzed.
            //
            // First it needs to be determined if actually importing the directives/pipes used in the
            // template would create a cycle. Currently ngtsc refuses to generate cycles, so an option
            // known as "remote scoping" is used if a cycle would be created. In remote scoping, the
            // module file sets the directives/pipes on the ɵcmp of the component, without
            // requiring new imports (but also in a way that breaks tree shaking).
            //
            // Determining this is challenging, because the TemplateDefinitionBuilder is responsible for
            // matching directives and pipes in the template; however, that doesn't run until the actual
            // compile() step. It's not possible to run template compilation sooner as it requires the
            // ConstantPool for the overall file being compiled (which isn't available until the
            // transform step).
            //
            // Instead, directives/pipes are matched independently here, using the R3TargetBinder. This
            // is an alternative implementation of template matching which is used for template
            // type-checking and will eventually replace matching in the TemplateDefinitionBuilder.
            const isModuleScope = scope.kind === checker.ComponentScopeKind.NgModule;
            // Dependencies coming from the regular `imports` field.
            const dependencies = isModuleScope ? scope.compilation.dependencies : scope.dependencies;
            // Dependencies from the `@Component.deferredImports` field.
            const explicitlyDeferredDependencies = getExplicitlyDeferredDeps(scope);
            // Mark the component is an NgModule-based component with its NgModule in a different file
            // then mark this file for extra import generation
            if (isModuleScope && context.fileName !== checker.getSourceFile(scope.ngModule).fileName) {
                this.localCompilationExtraImportsTracker?.markFileForExtraImportGeneration(context);
            }
            // Make sure that `@Component.imports` and `@Component.deferredImports` do not have
            // the same dependencies.
            if (metadata.isStandalone &&
                analysis.rawDeferredImports !== null &&
                explicitlyDeferredDependencies.length > 0) {
                const diagnostic = validateNoImportOverlap(dependencies, explicitlyDeferredDependencies, analysis.rawDeferredImports);
                if (diagnostic !== null) {
                    diagnostics.push(diagnostic);
                }
            }
            // Set up the R3TargetBinder.
            const binder = createTargetBinder(dependencies);
            let allDependencies = dependencies;
            let deferBlockBinder = binder;
            // If there are any explicitly deferred dependencies (via `@Component.deferredImports`),
            // re-compute the list of dependencies and create a new binder for defer blocks. This
            // is because we have deferred dependencies that are not in the standard imports list
            // and need to be referenced later when determining what dependencies need to be in a
            // defer function / instruction call. Otherwise they end up treated as a standard
            // import, which is wrong.
            if (explicitlyDeferredDependencies.length > 0) {
                allDependencies = [...explicitlyDeferredDependencies, ...dependencies];
                deferBlockBinder = createTargetBinder(allDependencies);
            }
            // Set up the pipes map that is later used to determine which dependencies are used in
            // the template.
            const pipes = extractPipes(allDependencies);
            // Next, the component template AST is bound using the R3TargetBinder. This produces a
            // BoundTarget, which is similar to a ts.TypeChecker.
            const bound = binder.bind({ template: metadata.template.nodes });
            // Find all defer blocks used in the template and for each block
            // bind its own scope.
            const deferBlocks = new Map();
            for (const deferBlock of bound.getDeferBlocks()) {
                deferBlocks.set(deferBlock, deferBlockBinder.bind({ template: deferBlock.children }));
            }
            // Register all Directives and Pipes used at the top level (outside
            // of any defer blocks), which would be eagerly referenced.
            const eagerlyUsed = new Set();
            if (this.enableHmr) {
                // In HMR we need to preserve all the dependencies, because they have to remain consistent
                // with the initially-generated code no matter what the template looks like.
                for (const dep of dependencies) {
                    if (dep.ref.node !== node) {
                        eagerlyUsed.add(dep.ref.node);
                    }
                    else {
                        const used = bound.getEagerlyUsedDirectives();
                        if (used.some((current) => current.ref.node === node)) {
                            eagerlyUsed.add(node);
                        }
                    }
                }
            }
            else {
                for (const dir of bound.getEagerlyUsedDirectives()) {
                    eagerlyUsed.add(dir.ref.node);
                }
                for (const name of bound.getEagerlyUsedPipes()) {
                    if (!pipes.has(name)) {
                        continue;
                    }
                    eagerlyUsed.add(pipes.get(name).ref.node);
                }
            }
            // Set of Directives and Pipes used across the entire template,
            // including all defer blocks.
            const wholeTemplateUsed = new Set(eagerlyUsed);
            for (const bound of deferBlocks.values()) {
                for (const dir of bound.getUsedDirectives()) {
                    wholeTemplateUsed.add(dir.ref.node);
                }
                for (const name of bound.getUsedPipes()) {
                    if (!pipes.has(name)) {
                        continue;
                    }
                    wholeTemplateUsed.add(pipes.get(name).ref.node);
                }
            }
            const declarations = new Map();
            // Transform the dependencies list, filtering out unused dependencies.
            for (const dep of allDependencies) {
                // Only emit references to each dependency once.
                if (declarations.has(dep.ref.node)) {
                    continue;
                }
                switch (dep.kind) {
                    case checker.MetaKind.Directive:
                        if (!wholeTemplateUsed.has(dep.ref.node) || dep.matchSource !== checker.MatchSource.Selector) {
                            continue;
                        }
                        const dirType = this.refEmitter.emit(dep.ref, context);
                        checker.assertSuccessfulReferenceEmit(dirType, node.name, dep.isComponent ? 'component' : 'directive');
                        declarations.set(dep.ref.node, {
                            kind: checker.R3TemplateDependencyKind.Directive,
                            ref: dep.ref,
                            type: dirType.expression,
                            importedFile: dirType.importedFile,
                            selector: dep.selector,
                            inputs: dep.inputs.propertyNames,
                            outputs: dep.outputs.propertyNames,
                            exportAs: dep.exportAs,
                            isComponent: dep.isComponent,
                        });
                        break;
                    case checker.MetaKind.Pipe:
                        if (!wholeTemplateUsed.has(dep.ref.node)) {
                            continue;
                        }
                        const pipeType = this.refEmitter.emit(dep.ref, context);
                        checker.assertSuccessfulReferenceEmit(pipeType, node.name, 'pipe');
                        declarations.set(dep.ref.node, {
                            kind: checker.R3TemplateDependencyKind.Pipe,
                            type: pipeType.expression,
                            name: dep.name,
                            ref: dep.ref,
                            importedFile: pipeType.importedFile,
                        });
                        break;
                    case checker.MetaKind.NgModule:
                        const ngModuleType = this.refEmitter.emit(dep.ref, context);
                        checker.assertSuccessfulReferenceEmit(ngModuleType, node.name, 'NgModule');
                        declarations.set(dep.ref.node, {
                            kind: checker.R3TemplateDependencyKind.NgModule,
                            type: ngModuleType.expression,
                            importedFile: ngModuleType.importedFile,
                        });
                        break;
                }
            }
            const getSemanticReference = (decl) => this.semanticDepGraphUpdater.getSemanticReference(decl.ref.node, decl.type);
            if (this.semanticDepGraphUpdater !== null) {
                symbol.usedDirectives = Array.from(declarations.values())
                    .filter(isUsedDirective)
                    .map(getSemanticReference);
                symbol.usedPipes = Array.from(declarations.values())
                    .filter(isUsedPipe)
                    .map(getSemanticReference);
            }
            const eagerDeclarations = Array.from(declarations.values()).filter((decl) => decl.kind === checker.R3TemplateDependencyKind.NgModule || eagerlyUsed.has(decl.ref.node));
            // Process information related to defer blocks
            if (this.compilationMode !== checker.CompilationMode.LOCAL) {
                this.resolveDeferBlocks(node, deferBlocks, declarations, data, analysis, eagerlyUsed);
            }
            const cyclesFromDirectives = new Map();
            const cyclesFromPipes = new Map();
            // Scan through the directives/pipes actually used in the template and check whether any
            // import which needs to be generated would create a cycle. This check is skipped for
            // standalone components as the dependencies of a standalone component have already been
            // imported directly by the user, so Angular won't introduce any imports that aren't already
            // in the user's program.
            if (!metadata.isStandalone) {
                for (const usedDep of eagerDeclarations) {
                    const cycle = this._checkForCyclicImport(usedDep.importedFile, usedDep.type, context);
                    if (cycle !== null) {
                        switch (usedDep.kind) {
                            case checker.R3TemplateDependencyKind.Directive:
                                cyclesFromDirectives.set(usedDep, cycle);
                                break;
                            case checker.R3TemplateDependencyKind.Pipe:
                                cyclesFromPipes.set(usedDep, cycle);
                                break;
                        }
                    }
                }
            }
            // Check whether any usages of standalone components in imports requires the dependencies
            // array to be wrapped in a closure. This check is technically a heuristic as there's no
            // direct way to check whether a `Reference` came from a `forwardRef`. Instead, we check if
            // the reference is `synthetic`, implying it came from _any_ foreign function resolver,
            // including the `forwardRef` resolver.
            const standaloneImportMayBeForwardDeclared = analysis.resolvedImports !== null && analysis.resolvedImports.some((ref) => ref.synthetic);
            const cycleDetected = cyclesFromDirectives.size !== 0 || cyclesFromPipes.size !== 0;
            if (!cycleDetected) {
                // No cycle was detected. Record the imports that need to be created in the cycle detector
                // so that future cyclic import checks consider their production.
                for (const { type, importedFile } of eagerDeclarations) {
                    this.maybeRecordSyntheticImport(importedFile, type, context);
                }
                // Check whether the dependencies arrays in ɵcmp need to be wrapped in a closure.
                // This is required if any dependency reference is to a declaration in the same file
                // but declared after this component.
                const declarationIsForwardDeclared = eagerDeclarations.some((decl) => checker.isExpressionForwardReference(decl.type, node.name, context));
                if (this.compilationMode !== checker.CompilationMode.LOCAL &&
                    (declarationIsForwardDeclared || standaloneImportMayBeForwardDeclared)) {
                    data.declarationListEmitMode = 1 /* DeclarationListEmitMode.Closure */;
                }
                data.declarations = eagerDeclarations;
                // Register extra local imports.
                if (this.compilationMode === checker.CompilationMode.LOCAL &&
                    this.localCompilationExtraImportsTracker !== null) {
                    // In global compilation mode `eagerDeclarations` contains "all" the component
                    // dependencies, whose import statements will be added to the file. In local compilation
                    // mode `eagerDeclarations` only includes the "local" dependencies, meaning those that are
                    // declared inside this compilation unit.Here the import info of these local dependencies
                    // are added to the tracker so that we can generate extra imports representing these local
                    // dependencies. For non-local dependencies we use another technique of adding some
                    // best-guess extra imports globally to all files using
                    // `localCompilationExtraImportsTracker.addGlobalImportFromIdentifier`.
                    for (const { type } of eagerDeclarations) {
                        if (type instanceof checker.ExternalExpr && type.value.moduleName) {
                            this.localCompilationExtraImportsTracker.addImportForFile(context, type.value.moduleName);
                        }
                    }
                }
            }
            else {
                if (this.cycleHandlingStrategy === 0 /* CycleHandlingStrategy.UseRemoteScoping */) {
                    // Declaring the directiveDefs/pipeDefs arrays directly would require imports that would
                    // create a cycle. Instead, mark this component as requiring remote scoping, so that the
                    // NgModule file will take care of setting the directives for the component.
                    this.scopeRegistry.setComponentRemoteScope(node, eagerDeclarations.filter(isUsedDirective).map((dir) => dir.ref), eagerDeclarations.filter(isUsedPipe).map((pipe) => pipe.ref));
                    symbol.isRemotelyScoped = true;
                    // If a semantic graph is being tracked, record the fact that this component is remotely
                    // scoped with the declaring NgModule symbol as the NgModule's emit becomes dependent on
                    // the directive/pipe usages of this component.
                    if (this.semanticDepGraphUpdater !== null &&
                        scope.kind === checker.ComponentScopeKind.NgModule &&
                        scope.ngModule !== null) {
                        const moduleSymbol = this.semanticDepGraphUpdater.getSymbol(scope.ngModule);
                        if (!(moduleSymbol instanceof NgModuleSymbol)) {
                            throw new Error(`AssertionError: Expected ${scope.ngModule.name} to be an NgModuleSymbol.`);
                        }
                        moduleSymbol.addRemotelyScopedComponent(symbol, symbol.usedDirectives, symbol.usedPipes);
                    }
                }
                else {
                    // We are not able to handle this cycle so throw an error.
                    const relatedMessages = [];
                    for (const [dir, cycle] of cyclesFromDirectives) {
                        relatedMessages.push(makeCyclicImportInfo(dir.ref, dir.isComponent ? 'component' : 'directive', cycle));
                    }
                    for (const [pipe, cycle] of cyclesFromPipes) {
                        relatedMessages.push(makeCyclicImportInfo(pipe.ref, 'pipe', cycle));
                    }
                    throw new checker.FatalDiagnosticError(checker.ErrorCode.IMPORT_CYCLE_DETECTED, node, 'One or more import cycles would need to be created to compile this component, ' +
                        'which is not supported by the current compiler configuration.', relatedMessages);
                }
            }
        }
        else {
            // If there is no scope, we can still use the binder to retrieve *some* information about the
            // deferred blocks.
            data.deferPerBlockDependencies = this.locateDeferBlocksWithoutScope(metadata.template);
        }
        // Run diagnostics only in global mode.
        if (this.compilationMode !== checker.CompilationMode.LOCAL) {
            // Validate `@Component.imports` and `@Component.deferredImports` fields.
            if (analysis.resolvedImports !== null && analysis.rawImports !== null) {
                const importDiagnostics = validateStandaloneImports(analysis.resolvedImports, analysis.rawImports, this.metaReader, this.scopeReader, false /* isDeferredImport */);
                diagnostics.push(...importDiagnostics);
            }
            if (analysis.resolvedDeferredImports !== null && analysis.rawDeferredImports !== null) {
                const importDiagnostics = validateStandaloneImports(analysis.resolvedDeferredImports, analysis.rawDeferredImports, this.metaReader, this.scopeReader, true /* isDeferredImport */);
                diagnostics.push(...importDiagnostics);
            }
            if (analysis.providersRequiringFactory !== null &&
                analysis.meta.providers instanceof checker.WrappedNodeExpr) {
                const providerDiagnostics = checker.getProviderDiagnostics(analysis.providersRequiringFactory, analysis.meta.providers.node, this.injectableRegistry);
                diagnostics.push(...providerDiagnostics);
            }
            if (analysis.viewProvidersRequiringFactory !== null &&
                analysis.meta.viewProviders instanceof checker.WrappedNodeExpr) {
                const viewProviderDiagnostics = checker.getProviderDiagnostics(analysis.viewProvidersRequiringFactory, analysis.meta.viewProviders.node, this.injectableRegistry);
                diagnostics.push(...viewProviderDiagnostics);
            }
            const directiveDiagnostics = checker.getDirectiveDiagnostics(node, this.injectableRegistry, this.evaluator, this.reflector, this.scopeRegistry, this.strictCtorDeps, 'Component');
            if (directiveDiagnostics !== null) {
                diagnostics.push(...directiveDiagnostics);
            }
            const hostDirectivesDiagnostics = analysis.hostDirectives && analysis.rawHostDirectives
                ? checker.validateHostDirectives(analysis.rawHostDirectives, analysis.hostDirectives, this.metaReader)
                : null;
            if (hostDirectivesDiagnostics !== null) {
                diagnostics.push(...hostDirectivesDiagnostics);
            }
        }
        if (diagnostics.length > 0) {
            return { diagnostics };
        }
        return { data };
    }
    xi18n(ctx, node, analysis) {
        ctx.updateFromTemplate(analysis.template.content, analysis.template.declaration.resolvedTemplateUrl, analysis.template.interpolationConfig ?? checker.DEFAULT_INTERPOLATION_CONFIG);
    }
    updateResources(node, analysis) {
        const containingFile = node.getSourceFile().fileName;
        // If the template is external, re-parse it.
        const templateDecl = analysis.template.declaration;
        if (!templateDecl.isInline) {
            analysis.template = extractTemplate(node, templateDecl, this.evaluator, this.depTracker, this.resourceLoader, this.extractTemplateOptions, this.compilationMode);
        }
        // Update any external stylesheets and rebuild the combined 'styles' list.
        // TODO(alxhub): write tests for styles when the primary compiler uses the updateResources
        // path
        let styles = [];
        if (analysis.styleUrls !== null) {
            for (const styleUrl of analysis.styleUrls) {
                try {
                    const resolvedStyleUrl = this.resourceLoader.resolve(styleUrl.url, containingFile);
                    const styleText = this.resourceLoader.load(resolvedStyleUrl);
                    styles.push(styleText);
                }
                catch (e) {
                    // Resource resolve failures should already be in the diagnostics list from the analyze
                    // stage. We do not need to do anything with them when updating resources.
                }
            }
        }
        if (analysis.inlineStyles !== null) {
            for (const styleText of analysis.inlineStyles) {
                styles.push(styleText);
            }
        }
        for (const styleText of analysis.template.styles) {
            styles.push(styleText);
        }
        analysis.meta.styles = styles.filter((s) => s.trim().length > 0);
    }
    compileFull(node, analysis, resolution, pool) {
        if (analysis.template.errors !== null && analysis.template.errors.length > 0) {
            return [];
        }
        const perComponentDeferredDeps = this.canDeferDeps
            ? this.resolveAllDeferredDependencies(resolution)
            : null;
        const defer = this.compileDeferBlocks(resolution);
        const meta = {
            ...analysis.meta,
            ...resolution,
            defer,
        };
        const fac = compileNgFactoryDefField(checker.toFactoryMetadata(meta, checker.FactoryTarget.Component));
        if (perComponentDeferredDeps !== null) {
            removeDeferrableTypesFromComponentDecorator(analysis, perComponentDeferredDeps);
        }
        const def = checker.compileComponentFromMetadata(meta, pool, checker.makeBindingParser());
        const inputTransformFields = compileInputTransformFields(analysis.inputs);
        const classMetadata = analysis.classMetadata !== null
            ? compileComponentClassMetadata(analysis.classMetadata, perComponentDeferredDeps).toStmt()
            : null;
        const debugInfo = analysis.classDebugInfo !== null
            ? compileClassDebugInfo(analysis.classDebugInfo).toStmt()
            : null;
        const hmrMeta = this.enableHmr
            ? extractHmrMetatadata(node, this.reflector, this.evaluator, this.compilerHost, this.rootDirs, def, fac, defer, classMetadata, debugInfo)
            : null;
        const hmrInitializer = hmrMeta ? compileHmrInitializer(hmrMeta).toStmt() : null;
        const deferrableImports = this.canDeferDeps
            ? this.deferredSymbolTracker.getDeferrableImportDecls()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵcmp', inputTransformFields, deferrableImports, debugInfo, hmrInitializer);
    }
    compilePartial(node, analysis, resolution) {
        if (analysis.template.errors !== null && analysis.template.errors.length > 0) {
            return [];
        }
        const templateInfo = {
            content: analysis.template.content,
            sourceUrl: analysis.template.declaration.resolvedTemplateUrl,
            isInline: analysis.template.declaration.isInline,
            inlineTemplateLiteralExpression: analysis.template.sourceMapping.type === 'direct'
                ? new checker.WrappedNodeExpr(analysis.template.sourceMapping.node)
                : null,
        };
        const perComponentDeferredDeps = this.canDeferDeps
            ? this.resolveAllDeferredDependencies(resolution)
            : null;
        const defer = this.compileDeferBlocks(resolution);
        const meta = {
            ...analysis.meta,
            ...resolution,
            defer,
        };
        const fac = compileDeclareFactory(checker.toFactoryMetadata(meta, checker.FactoryTarget.Component));
        const inputTransformFields = compileInputTransformFields(analysis.inputs);
        const def = compileDeclareComponentFromMetadata(meta, analysis.template, templateInfo);
        const classMetadata = analysis.classMetadata !== null
            ? compileComponentDeclareClassMetadata(analysis.classMetadata, perComponentDeferredDeps).toStmt()
            : null;
        const hmrMeta = this.enableHmr
            ? extractHmrMetatadata(node, this.reflector, this.evaluator, this.compilerHost, this.rootDirs, def, fac, defer, classMetadata, null)
            : null;
        const hmrInitializer = hmrMeta ? compileHmrInitializer(hmrMeta).toStmt() : null;
        const deferrableImports = this.canDeferDeps
            ? this.deferredSymbolTracker.getDeferrableImportDecls()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵcmp', inputTransformFields, deferrableImports, null, hmrInitializer);
    }
    compileLocal(node, analysis, resolution, pool) {
        // In the local compilation mode we can only rely on the information available
        // within the `@Component.deferredImports` array, because in this mode compiler
        // doesn't have information on which dependencies belong to which defer blocks.
        const deferrableTypes = this.canDeferDeps ? analysis.explicitlyDeferredTypes : null;
        const defer = this.compileDeferBlocks(resolution);
        const meta = {
            ...analysis.meta,
            ...resolution,
            defer,
        };
        if (deferrableTypes !== null) {
            removeDeferrableTypesFromComponentDecorator(analysis, deferrableTypes);
        }
        const fac = compileNgFactoryDefField(checker.toFactoryMetadata(meta, checker.FactoryTarget.Component));
        const def = checker.compileComponentFromMetadata(meta, pool, checker.makeBindingParser());
        const inputTransformFields = compileInputTransformFields(analysis.inputs);
        const classMetadata = analysis.classMetadata !== null
            ? compileComponentClassMetadata(analysis.classMetadata, deferrableTypes).toStmt()
            : null;
        const debugInfo = analysis.classDebugInfo !== null
            ? compileClassDebugInfo(analysis.classDebugInfo).toStmt()
            : null;
        const hmrMeta = this.enableHmr
            ? extractHmrMetatadata(node, this.reflector, this.evaluator, this.compilerHost, this.rootDirs, def, fac, defer, classMetadata, debugInfo)
            : null;
        const hmrInitializer = hmrMeta ? compileHmrInitializer(hmrMeta).toStmt() : null;
        const deferrableImports = this.canDeferDeps
            ? this.deferredSymbolTracker.getDeferrableImportDecls()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵcmp', inputTransformFields, deferrableImports, debugInfo, hmrInitializer);
    }
    compileHmrUpdateDeclaration(node, analysis, resolution) {
        if (analysis.template.errors !== null && analysis.template.errors.length > 0) {
            return null;
        }
        // Create a brand-new constant pool since there shouldn't be any constant sharing.
        const pool = new checker.ConstantPool();
        const defer = this.compileDeferBlocks(resolution);
        const meta = {
            ...analysis.meta,
            ...resolution,
            defer,
        };
        const fac = compileNgFactoryDefField(checker.toFactoryMetadata(meta, checker.FactoryTarget.Component));
        const def = checker.compileComponentFromMetadata(meta, pool, checker.makeBindingParser());
        const classMetadata = analysis.classMetadata !== null
            ? compileComponentClassMetadata(analysis.classMetadata, null).toStmt()
            : null;
        const debugInfo = analysis.classDebugInfo !== null
            ? compileClassDebugInfo(analysis.classDebugInfo).toStmt()
            : null;
        const hmrMeta = this.enableHmr
            ? extractHmrMetatadata(node, this.reflector, this.evaluator, this.compilerHost, this.rootDirs, def, fac, defer, classMetadata, debugInfo)
               : null;
        const res = checker.compileResults(fac, def, classMetadata, 'ɵcmp', null, null, debugInfo, null);
        return hmrMeta === null || res.length === 0
            ? null
            : getHmrUpdateDeclaration(res, pool.statements, hmrMeta, node);
    }
    /**
     * Locates defer blocks in case scope information is not available.
     * For example, this happens in the local compilation mode.
     */
    locateDeferBlocksWithoutScope(template) {
        const deferBlocks = new Map();
        const directivelessBinder = new checker.R3TargetBinder(new checker.SelectorMatcher());
        const bound = directivelessBinder.bind({ template: template.nodes });
        const deferredBlocks = bound.getDeferBlocks();
        for (const block of deferredBlocks) {
            // We can't determine the dependencies without a scope so we leave them empty.
            deferBlocks.set(block, []);
        }
        return deferBlocks;
    }
    /**
     * Computes a list of deferrable symbols based on dependencies from
     * the `@Component.imports` field and their usage in `@defer` blocks.
     */
    resolveAllDeferredDependencies(resolution) {
        const seenDeps = new Set();
        const deferrableTypes = [];
        // Go over all dependencies of all defer blocks and update the value of
        // the `isDeferrable` flag and the `importPath` to reflect the current
        // state after visiting all components during the `resolve` phase.
        for (const [_, deps] of resolution.deferPerBlockDependencies) {
            for (const deferBlockDep of deps) {
                const node = deferBlockDep.declaration.node;
                const importDecl = resolution.deferrableDeclToImportDecl.get(node) ?? null;
                if (importDecl !== null && this.deferredSymbolTracker.canDefer(importDecl)) {
                    deferBlockDep.isDeferrable = true;
                    deferBlockDep.importPath = importDecl.moduleSpecifier.text;
                    deferBlockDep.isDefaultImport = isDefaultImport(importDecl);
                    // The same dependency may be used across multiple deferred blocks. De-duplicate it
                    // because it can throw off other logic further down the compilation pipeline.
                    // Note that the logic above needs to run even if the dependency is seen before,
                    // because the object literals are different between each block.
                    if (!seenDeps.has(node)) {
                        seenDeps.add(node);
                        deferrableTypes.push(deferBlockDep);
                    }
                }
            }
        }
        return deferrableTypes;
    }
    /**
     * Collects deferrable symbols from the `@Component.deferredImports` field.
     */
    collectExplicitlyDeferredSymbols(rawDeferredImports) {
        const deferredTypes = new Map();
        if (!ts.isArrayLiteralExpression(rawDeferredImports)) {
            return deferredTypes;
        }
        for (const element of rawDeferredImports.elements) {
            const node = checker.tryUnwrapForwardRef(element, this.reflector) || element;
            if (!ts.isIdentifier(node)) {
                // Can't defer-load non-literal references.
                continue;
            }
            const imp = this.reflector.getImportOfIdentifier(node);
            if (imp !== null) {
                deferredTypes.set(node, imp);
            }
        }
        return deferredTypes;
    }
    /**
     * Check whether adding an import from `origin` to the source-file corresponding to `expr` would
     * create a cyclic import.
     *
     * @returns a `Cycle` object if a cycle would be created, otherwise `null`.
     */
    _checkForCyclicImport(importedFile, expr, origin) {
        const imported = checker.resolveImportedFile(this.moduleResolver, importedFile, expr, origin);
        if (imported === null) {
            return null;
        }
        // Check whether the import is legal.
        return this.cycleAnalyzer.wouldCreateCycle(origin, imported);
    }
    maybeRecordSyntheticImport(importedFile, expr, origin) {
        const imported = checker.resolveImportedFile(this.moduleResolver, importedFile, expr, origin);
        if (imported === null) {
            return;
        }
        this.cycleAnalyzer.recordSyntheticImport(origin, imported);
    }
    /**
     * Resolves information about defer blocks dependencies to make it
     * available for the final `compile` step.
     */
    resolveDeferBlocks(componentClassDecl, deferBlocks, deferrableDecls, resolutionData, analysisData, eagerlyUsedDecls) {
        // Collect all deferred decls from all defer blocks from the entire template
        // to intersect with the information from the `imports` field of a particular
        // Component.
        const allDeferredDecls = new Set();
        for (const [deferBlock, bound] of deferBlocks) {
            const usedDirectives = new Set(bound.getEagerlyUsedDirectives().map((d) => d.ref.node));
            const usedPipes = new Set(bound.getEagerlyUsedPipes());
            let deps;
            if (resolutionData.deferPerBlockDependencies.has(deferBlock)) {
                deps = resolutionData.deferPerBlockDependencies.get(deferBlock);
            }
            else {
                deps = [];
                resolutionData.deferPerBlockDependencies.set(deferBlock, deps);
            }
            for (const decl of Array.from(deferrableDecls.values())) {
                if (decl.kind === checker.R3TemplateDependencyKind.NgModule) {
                    continue;
                }
                if (decl.kind === checker.R3TemplateDependencyKind.Directive &&
                    !usedDirectives.has(decl.ref.node)) {
                    continue;
                }
                if (decl.kind === checker.R3TemplateDependencyKind.Pipe && !usedPipes.has(decl.name)) {
                    continue;
                }
                // Collect initial information about this dependency.
                // `isDeferrable`, `importPath` and `isDefaultImport` will be
                // added later during the `compile` step.
                deps.push({
                    typeReference: decl.type,
                    symbolName: decl.ref.node.name.text,
                    isDeferrable: false,
                    importPath: null,
                    isDefaultImport: false,
                    declaration: decl.ref,
                });
                allDeferredDecls.add(decl.ref.node);
            }
        }
        // For standalone components with the `imports` and `deferredImports` fields -
        // inspect the list of referenced symbols and mark the ones used in defer blocks
        // as potential candidates for defer loading.
        if (analysisData.meta.isStandalone) {
            if (analysisData.rawImports !== null) {
                this.registerDeferrableCandidates(componentClassDecl, analysisData.rawImports, false /* isDeferredImport */, allDeferredDecls, eagerlyUsedDecls, resolutionData);
            }
            if (analysisData.rawDeferredImports !== null) {
                this.registerDeferrableCandidates(componentClassDecl, analysisData.rawDeferredImports, true /* isDeferredImport */, allDeferredDecls, eagerlyUsedDecls, resolutionData);
            }
        }
    }
    /**
     * Inspects provided imports expression (either `@Component.imports` or
     * `@Component.deferredImports`) and registers imported types as deferrable
     * candidates.
     */
    registerDeferrableCandidates(componentClassDecl, importsExpr, isDeferredImport, allDeferredDecls, eagerlyUsedDecls, resolutionData) {
        if (!ts.isArrayLiteralExpression(importsExpr)) {
            return;
        }
        for (const element of importsExpr.elements) {
            const node = checker.tryUnwrapForwardRef(element, this.reflector) || element;
            if (!ts.isIdentifier(node)) {
                // Can't defer-load non-literal references.
                continue;
            }
            const imp = this.reflector.getImportOfIdentifier(node);
            if (imp === null) {
                // Can't defer-load symbols which aren't imported.
                continue;
            }
            const decl = this.reflector.getDeclarationOfIdentifier(node);
            if (decl === null) {
                // Can't defer-load symbols which don't exist.
                continue;
            }
            if (!checker.isNamedClassDeclaration(decl.node)) {
                // Can't defer-load symbols which aren't classes.
                continue;
            }
            // Are we even trying to defer-load this symbol?
            if (!allDeferredDecls.has(decl.node)) {
                continue;
            }
            if (eagerlyUsedDecls.has(decl.node)) {
                // Can't defer-load symbols that are eagerly referenced as a dependency
                // in a template outside of a defer block.
                continue;
            }
            // Is it a standalone directive/component?
            const dirMeta = this.metaReader.getDirectiveMetadata(new checker.Reference(decl.node));
            if (dirMeta !== null && !dirMeta.isStandalone) {
                continue;
            }
            // Is it a standalone pipe?
            const pipeMeta = this.metaReader.getPipeMetadata(new checker.Reference(decl.node));
            if (pipeMeta !== null && !pipeMeta.isStandalone) {
                continue;
            }
            if (dirMeta === null && pipeMeta === null) {
                // This is not a directive or a pipe.
                continue;
            }
            // Keep track of how this class made it into the current source file
            // (which ts.ImportDeclaration was used for this symbol).
            resolutionData.deferrableDeclToImportDecl.set(decl.node, imp.node);
            this.deferredSymbolTracker.markAsDeferrableCandidate(node, imp.node, componentClassDecl, isDeferredImport);
        }
    }
    compileDeferBlocks(resolution) {
        const { deferBlockDepsEmitMode: mode, deferPerBlockDependencies: perBlockDeps, deferPerComponentDependencies: perComponentDeps, } = resolution;
        if (mode === 0 /* DeferBlockDepsEmitMode.PerBlock */) {
            if (!perBlockDeps) {
                throw new Error('Internal error: deferPerBlockDependencies must be present when compiling in PerBlock mode');
            }
            const blocks = new Map();
            for (const [block, dependencies] of perBlockDeps) {
                blocks.set(block, dependencies.length === 0 ? null : checker.compileDeferResolverFunction({ mode, dependencies }));
            }
            return { mode, blocks };
        }
        if (mode === 1 /* DeferBlockDepsEmitMode.PerComponent */) {
            if (!perComponentDeps) {
                throw new Error('Internal error: deferPerComponentDependencies must be present in PerComponent mode');
            }
            return {
                mode,
                dependenciesFn: perComponentDeps.length === 0
                    ? null
                    : checker.compileDeferResolverFunction({ mode, dependencies: perComponentDeps }),
            };
        }
        throw new Error(`Invalid deferBlockDepsEmitMode. Cannot compile deferred block metadata.`);
    }
}
/**
 * Creates an instance of a target binder based on provided dependencies.
 */
function createTargetBinder(dependencies) {
    const matcher = new checker.SelectorMatcher();
    for (const dep of dependencies) {
        if (dep.kind === checker.MetaKind.Directive && dep.selector !== null) {
            matcher.addSelectables(checker.CssSelector.parse(dep.selector), [dep]);
        }
    }
    return new checker.R3TargetBinder(matcher);
}
/**
 * Returns the list of dependencies from `@Component.deferredImports` if provided.
 */
function getExplicitlyDeferredDeps(scope) {
    return scope.kind === checker.ComponentScopeKind.NgModule
        ? []
        : scope.deferredDependencies;
}
function extractPipes(dependencies) {
    const pipes = new Map();
    for (const dep of dependencies) {
        if (dep.kind === checker.MetaKind.Pipe) {
            pipes.set(dep.name, dep);
        }
    }
    return pipes;
}
/**
 * Drop references to existing imports for deferrable symbols that should be present
 * in the `setClassMetadataAsync` call. Otherwise, an import declaration gets retained.
 */
function removeDeferrableTypesFromComponentDecorator(analysis, deferrableTypes) {
    if (analysis.classMetadata) {
        const deferrableSymbols = new Set(deferrableTypes.map((t) => t.symbolName));
        const rewrittenDecoratorsNode = removeIdentifierReferences(analysis.classMetadata.decorators.node, deferrableSymbols);
        analysis.classMetadata.decorators = new checker.WrappedNodeExpr(rewrittenDecoratorsNode);
    }
}
/**
 * Validates that `@Component.imports` and `@Component.deferredImports` do not have
 * overlapping dependencies.
 */
function validateNoImportOverlap(eagerDeps, deferredDeps, rawDeferredImports) {
    let diagnostic = null;
    const eagerDepsSet = new Set();
    for (const eagerDep of eagerDeps) {
        eagerDepsSet.add(eagerDep.ref.node);
    }
    for (const deferredDep of deferredDeps) {
        if (eagerDepsSet.has(deferredDep.ref.node)) {
            const classInfo = deferredDep.ref.debugName
                ? `The \`${deferredDep.ref.debugName}\``
                : 'One of the dependencies';
            diagnostic = checker.makeDiagnostic(checker.ErrorCode.DEFERRED_DEPENDENCY_IMPORTED_EAGERLY, getDiagnosticNode(deferredDep.ref, rawDeferredImports), `\`${classInfo}\` is imported via both \`@Component.imports\` and ` +
                `\`@Component.deferredImports\`. To fix this, make sure that ` +
                `dependencies are imported only once.`);
            break;
        }
    }
    return diagnostic;
}
function validateStandaloneImports(importRefs, importExpr, metaReader, scopeReader, isDeferredImport) {
    const diagnostics = [];
    for (const ref of importRefs) {
        const dirMeta = metaReader.getDirectiveMetadata(ref);
        if (dirMeta !== null) {
            if (!dirMeta.isStandalone) {
                // Directly importing a directive that's not standalone is an error.
                diagnostics.push(makeNotStandaloneDiagnostic(scopeReader, ref, importExpr, dirMeta.isComponent ? 'component' : 'directive'));
            }
            continue;
        }
        const pipeMeta = metaReader.getPipeMetadata(ref);
        if (pipeMeta !== null) {
            if (!pipeMeta.isStandalone) {
                diagnostics.push(makeNotStandaloneDiagnostic(scopeReader, ref, importExpr, 'pipe'));
            }
            continue;
        }
        const ngModuleMeta = metaReader.getNgModuleMetadata(ref);
        if (!isDeferredImport && ngModuleMeta !== null) {
            // Importing NgModules is always legal in `@Component.imports`,
            // but not supported in `@Component.deferredImports`.
            continue;
        }
        // Make an error?
        const error = isDeferredImport
            ? makeUnknownComponentDeferredImportDiagnostic(ref, importExpr)
            : makeUnknownComponentImportDiagnostic(ref, importExpr);
        diagnostics.push(error);
    }
    return diagnostics;
}
/** Returns whether an ImportDeclaration is a default import. */
function isDefaultImport(node) {
    return node.importClause !== undefined && node.importClause.namedBindings === undefined;
}

/**
 * Adapts the `compileInjectable` compiler for `@Injectable` decorators to the Ivy compiler.
 */
class InjectableDecoratorHandler {
    reflector;
    evaluator;
    isCore;
    strictCtorDeps;
    injectableRegistry;
    perf;
    includeClassMetadata;
    compilationMode;
    errorOnDuplicateProv;
    constructor(reflector, evaluator, isCore, strictCtorDeps, injectableRegistry, perf, includeClassMetadata, compilationMode, 
    /**
     * What to do if the injectable already contains a ɵprov property.
     *
     * If true then an error diagnostic is reported.
     * If false then there is no error and a new ɵprov property is not added.
     */
    errorOnDuplicateProv = true) {
        this.reflector = reflector;
        this.evaluator = evaluator;
        this.isCore = isCore;
        this.strictCtorDeps = strictCtorDeps;
        this.injectableRegistry = injectableRegistry;
        this.perf = perf;
        this.includeClassMetadata = includeClassMetadata;
        this.compilationMode = compilationMode;
        this.errorOnDuplicateProv = errorOnDuplicateProv;
    }
    precedence = checker.HandlerPrecedence.SHARED;
    name = 'InjectableDecoratorHandler';
    detect(node, decorators) {
        if (!decorators) {
            return undefined;
        }
        const decorator = checker.findAngularDecorator(decorators, 'Injectable', this.isCore);
        if (decorator !== undefined) {
            return {
                trigger: decorator.node,
                decorator: decorator,
                metadata: decorator,
            };
        }
        else {
            return undefined;
        }
    }
    analyze(node, decorator) {
        this.perf.eventCount(checker.PerfEvent.AnalyzeInjectable);
        const meta = extractInjectableMetadata(node, decorator, this.reflector);
        const decorators = this.reflector.getDecoratorsOfDeclaration(node);
        return {
            analysis: {
                meta,
                ctorDeps: extractInjectableCtorDeps(node, meta, decorator, this.reflector, this.isCore, this.strictCtorDeps),
                classMetadata: this.includeClassMetadata
                    ? extractClassMetadata(node, this.reflector, this.isCore)
                    : null,
                // Avoid generating multiple factories if a class has
                // more Angular decorators, apart from Injectable.
                needsFactory: !decorators ||
                    decorators.every((current) => !checker.isAngularCore(current) || current.name === 'Injectable'),
            },
        };
    }
    symbol() {
        return null;
    }
    register(node, analysis) {
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            return;
        }
        this.injectableRegistry.registerInjectable(node, {
            ctorDeps: analysis.ctorDeps,
        });
    }
    resolve(node, analysis) {
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            return {};
        }
        if (requiresValidCtor(analysis.meta)) {
            const diagnostic = checker.checkInheritanceOfInjectable(node, this.injectableRegistry, this.reflector, this.evaluator, this.strictCtorDeps, 'Injectable');
            if (diagnostic !== null) {
                return {
                    diagnostics: [diagnostic],
                };
            }
        }
        return {};
    }
    compileFull(node, analysis) {
        return this.compile(compileNgFactoryDefField, (meta) => checker.compileInjectable(meta, false), compileClassMetadata, node, analysis);
    }
    compilePartial(node, analysis) {
        return this.compile(compileDeclareFactory, compileDeclareInjectableFromMetadata, compileDeclareClassMetadata, node, analysis);
    }
    compileLocal(node, analysis) {
        return this.compile(compileNgFactoryDefField, (meta) => checker.compileInjectable(meta, false), compileClassMetadata, node, analysis);
    }
    compile(compileFactoryFn, compileInjectableFn, compileClassMetadataFn, node, analysis) {
        const results = [];
        if (analysis.needsFactory) {
            const meta = analysis.meta;
            const factoryRes = compileFactoryFn(checker.toFactoryMetadata({ ...meta, deps: analysis.ctorDeps }, checker.FactoryTarget.Injectable));
            if (analysis.classMetadata !== null) {
                factoryRes.statements.push(compileClassMetadataFn(analysis.classMetadata).toStmt());
            }
            results.push(factoryRes);
        }
        const ɵprov = this.reflector.getMembersOfClass(node).find((member) => member.name === 'ɵprov');
        if (ɵprov !== undefined && this.errorOnDuplicateProv) {
            throw new checker.FatalDiagnosticError(checker.ErrorCode.INJECTABLE_DUPLICATE_PROV, ɵprov.nameNode || ɵprov.node || node, 'Injectables cannot contain a static ɵprov property, because the compiler is going to generate one.');
        }
        if (ɵprov === undefined) {
            // Only add a new ɵprov if there is not one already
            const res = compileInjectableFn(analysis.meta);
            results.push({
                name: 'ɵprov',
                initializer: res.expression,
                statements: res.statements,
                type: res.type,
                deferrableImports: null,
            });
        }
        return results;
    }
}
/**
 * Read metadata from the `@Injectable` decorator and produce the `IvyInjectableMetadata`, the
 * input metadata needed to run `compileInjectable`.
 *
 * A `null` return value indicates this is @Injectable has invalid data.
 */
function extractInjectableMetadata(clazz, decorator, reflector) {
    const name = clazz.name.text;
    const type = checker.wrapTypeReference(reflector, clazz);
    const typeArgumentCount = reflector.getGenericArityOfClass(clazz) || 0;
    if (decorator.args === null) {
        throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_NOT_CALLED, decorator.node, '@Injectable must be called');
    }
    if (decorator.args.length === 0) {
        return {
            name,
            type,
            typeArgumentCount,
            providedIn: checker.createMayBeForwardRefExpression(new checker.LiteralExpr(null), 0 /* ForwardRefHandling.None */),
        };
    }
    else if (decorator.args.length === 1) {
        const metaNode = decorator.args[0];
        // Firstly make sure the decorator argument is an inline literal - if not, it's illegal to
        // transport references from one location to another. This is the problem that lowering
        // used to solve - if this restriction proves too undesirable we can re-implement lowering.
        if (!ts.isObjectLiteralExpression(metaNode)) {
            throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_ARG_NOT_LITERAL, metaNode, `@Injectable argument must be an object literal`);
        }
        // Resolve the fields of the literal into a map of field name to expression.
        const meta = checker.reflectObjectLiteral(metaNode);
        const providedIn = meta.has('providedIn')
            ? getProviderExpression(meta.get('providedIn'), reflector)
            : checker.createMayBeForwardRefExpression(new checker.LiteralExpr(null), 0 /* ForwardRefHandling.None */);
        let deps = undefined;
        if ((meta.has('useClass') || meta.has('useFactory')) && meta.has('deps')) {
            const depsExpr = meta.get('deps');
            if (!ts.isArrayLiteralExpression(depsExpr)) {
                throw new checker.FatalDiagnosticError(checker.ErrorCode.VALUE_NOT_LITERAL, depsExpr, `@Injectable deps metadata must be an inline array`);
            }
            deps = depsExpr.elements.map((dep) => getDep(dep, reflector));
        }
        const result = { name, type, typeArgumentCount, providedIn };
        if (meta.has('useValue')) {
            result.useValue = getProviderExpression(meta.get('useValue'), reflector);
        }
        else if (meta.has('useExisting')) {
            result.useExisting = getProviderExpression(meta.get('useExisting'), reflector);
        }
        else if (meta.has('useClass')) {
            result.useClass = getProviderExpression(meta.get('useClass'), reflector);
            result.deps = deps;
        }
        else if (meta.has('useFactory')) {
            result.useFactory = new checker.WrappedNodeExpr(meta.get('useFactory'));
            result.deps = deps;
        }
        return result;
    }
    else {
        throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_ARITY_WRONG, decorator.args[2], 'Too many arguments to @Injectable');
    }
}
/**
 * Get the `R3ProviderExpression` for this `expression`.
 *
 * The `useValue`, `useExisting` and `useClass` properties might be wrapped in a `ForwardRef`, which
 * needs to be unwrapped. This function will do that unwrapping and set a flag on the returned
 * object to indicate whether the value needed unwrapping.
 */
function getProviderExpression(expression, reflector) {
    const forwardRefValue = checker.tryUnwrapForwardRef(expression, reflector);
    return checker.createMayBeForwardRefExpression(new checker.WrappedNodeExpr(forwardRefValue ?? expression), forwardRefValue !== null ? 2 /* ForwardRefHandling.Unwrapped */ : 0 /* ForwardRefHandling.None */);
}
function extractInjectableCtorDeps(clazz, meta, decorator, reflector, isCore, strictCtorDeps) {
    if (decorator.args === null) {
        throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_NOT_CALLED, decorator.node, '@Injectable must be called');
    }
    let ctorDeps = null;
    if (decorator.args.length === 0) {
        // Ideally, using @Injectable() would have the same effect as using @Injectable({...}), and be
        // subject to the same validation. However, existing Angular code abuses @Injectable, applying
        // it to things like abstract classes with constructors that were never meant for use with
        // Angular's DI.
        //
        // To deal with this, @Injectable() without an argument is more lenient, and if the
        // constructor signature does not work for DI then a factory definition (ɵfac) that throws is
        // generated.
        if (strictCtorDeps && !checker.isAbstractClassDeclaration(clazz)) {
            ctorDeps = checker.getValidConstructorDependencies(clazz, reflector, isCore);
        }
        else {
            ctorDeps = checker.unwrapConstructorDependencies(checker.getConstructorDependencies(clazz, reflector, isCore));
        }
        return ctorDeps;
    }
    else if (decorator.args.length === 1) {
        const rawCtorDeps = checker.getConstructorDependencies(clazz, reflector, isCore);
        if (strictCtorDeps && !checker.isAbstractClassDeclaration(clazz) && requiresValidCtor(meta)) {
            // Since use* was not provided for a concrete class, validate the deps according to
            // strictCtorDeps.
            ctorDeps = checker.validateConstructorDependencies(clazz, rawCtorDeps);
        }
        else {
            ctorDeps = checker.unwrapConstructorDependencies(rawCtorDeps);
        }
    }
    return ctorDeps;
}
function requiresValidCtor(meta) {
    return (meta.useValue === undefined &&
        meta.useExisting === undefined &&
        meta.useClass === undefined &&
        meta.useFactory === undefined);
}
function getDep(dep, reflector) {
    const meta = {
        token: new checker.WrappedNodeExpr(dep),
        attributeNameType: null,
        host: false,
        optional: false,
        self: false,
        skipSelf: false,
    };
    function maybeUpdateDecorator(dec, reflector, token) {
        const source = reflector.getImportOfIdentifier(dec);
        if (source === null || source.from !== '@angular/core') {
            return false;
        }
        switch (source.name) {
            case 'Inject':
                if (token !== undefined) {
                    meta.token = new checker.WrappedNodeExpr(token);
                }
                break;
            case 'Optional':
                meta.optional = true;
                break;
            case 'SkipSelf':
                meta.skipSelf = true;
                break;
            case 'Self':
                meta.self = true;
                break;
            default:
                return false;
        }
        return true;
    }
    if (ts.isArrayLiteralExpression(dep)) {
        dep.elements.forEach((el) => {
            let isDecorator = false;
            if (ts.isIdentifier(el)) {
                isDecorator = maybeUpdateDecorator(el, reflector);
            }
            else if (ts.isNewExpression(el) && ts.isIdentifier(el.expression)) {
                const token = (el.arguments && el.arguments.length > 0 && el.arguments[0]) || undefined;
                isDecorator = maybeUpdateDecorator(el.expression, reflector, token);
            }
            if (!isDecorator) {
                meta.token = new checker.WrappedNodeExpr(el);
            }
        });
    }
    return meta;
}

/**
 * Represents an Angular pipe.
 */
class PipeSymbol extends SemanticSymbol {
    name;
    constructor(decl, name) {
        super(decl);
        this.name = name;
    }
    isPublicApiAffected(previousSymbol) {
        if (!(previousSymbol instanceof PipeSymbol)) {
            return true;
        }
        return this.name !== previousSymbol.name;
    }
    isTypeCheckApiAffected(previousSymbol) {
        return this.isPublicApiAffected(previousSymbol);
    }
}
class PipeDecoratorHandler {
    reflector;
    evaluator;
    metaRegistry;
    scopeRegistry;
    injectableRegistry;
    isCore;
    perf;
    includeClassMetadata;
    compilationMode;
    generateExtraImportsInLocalMode;
    strictStandalone;
    implicitStandaloneValue;
    constructor(reflector, evaluator, metaRegistry, scopeRegistry, injectableRegistry, isCore, perf, includeClassMetadata, compilationMode, generateExtraImportsInLocalMode, strictStandalone, implicitStandaloneValue) {
        this.reflector = reflector;
        this.evaluator = evaluator;
        this.metaRegistry = metaRegistry;
        this.scopeRegistry = scopeRegistry;
        this.injectableRegistry = injectableRegistry;
        this.isCore = isCore;
        this.perf = perf;
        this.includeClassMetadata = includeClassMetadata;
        this.compilationMode = compilationMode;
        this.generateExtraImportsInLocalMode = generateExtraImportsInLocalMode;
        this.strictStandalone = strictStandalone;
        this.implicitStandaloneValue = implicitStandaloneValue;
    }
    precedence = checker.HandlerPrecedence.PRIMARY;
    name = 'PipeDecoratorHandler';
    detect(node, decorators) {
        if (!decorators) {
            return undefined;
        }
        const decorator = checker.findAngularDecorator(decorators, 'Pipe', this.isCore);
        if (decorator !== undefined) {
            return {
                trigger: decorator.node,
                decorator: decorator,
                metadata: decorator,
            };
        }
        else {
            return undefined;
        }
    }
    analyze(clazz, decorator) {
        this.perf.eventCount(checker.PerfEvent.AnalyzePipe);
        const name = clazz.name.text;
        const type = checker.wrapTypeReference(this.reflector, clazz);
        if (decorator.args === null) {
            throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_NOT_CALLED, decorator.node, `@Pipe must be called`);
        }
        if (decorator.args.length !== 1) {
            throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_ARITY_WRONG, decorator.node, '@Pipe must have exactly one argument');
        }
        const meta = checker.unwrapExpression(decorator.args[0]);
        if (!ts.isObjectLiteralExpression(meta)) {
            throw new checker.FatalDiagnosticError(checker.ErrorCode.DECORATOR_ARG_NOT_LITERAL, meta, '@Pipe must have a literal argument');
        }
        const pipe = checker.reflectObjectLiteral(meta);
        if (!pipe.has('name')) {
            throw new checker.FatalDiagnosticError(checker.ErrorCode.PIPE_MISSING_NAME, meta, `@Pipe decorator is missing name field`);
        }
        const pipeNameExpr = pipe.get('name');
        const pipeName = this.evaluator.evaluate(pipeNameExpr);
        if (typeof pipeName !== 'string') {
            throw checker.createValueHasWrongTypeError(pipeNameExpr, pipeName, `@Pipe.name must be a string`);
        }
        let pure = true;
        if (pipe.has('pure')) {
            const expr = pipe.get('pure');
            const pureValue = this.evaluator.evaluate(expr);
            if (typeof pureValue !== 'boolean') {
                throw checker.createValueHasWrongTypeError(expr, pureValue, `@Pipe.pure must be a boolean`);
            }
            pure = pureValue;
        }
        let isStandalone = this.implicitStandaloneValue;
        if (pipe.has('standalone')) {
            const expr = pipe.get('standalone');
            const resolved = this.evaluator.evaluate(expr);
            if (typeof resolved !== 'boolean') {
                throw checker.createValueHasWrongTypeError(expr, resolved, `standalone flag must be a boolean`);
            }
            isStandalone = resolved;
            if (!isStandalone && this.strictStandalone) {
                throw new checker.FatalDiagnosticError(checker.ErrorCode.NON_STANDALONE_NOT_ALLOWED, expr, `Only standalone pipes are allowed when 'strictStandalone' is enabled.`);
            }
        }
        return {
            analysis: {
                meta: {
                    name,
                    type,
                    typeArgumentCount: this.reflector.getGenericArityOfClass(clazz) || 0,
                    pipeName,
                    deps: checker.getValidConstructorDependencies(clazz, this.reflector, this.isCore),
                    pure,
                    isStandalone,
                },
                classMetadata: this.includeClassMetadata
                    ? extractClassMetadata(clazz, this.reflector, this.isCore)
                    : null,
                pipeNameExpr,
                decorator: decorator?.node ?? null,
            },
        };
    }
    symbol(node, analysis) {
        return new PipeSymbol(node, analysis.meta.pipeName);
    }
    register(node, analysis) {
        const ref = new checker.Reference(node);
        this.metaRegistry.registerPipeMetadata({
            kind: checker.MetaKind.Pipe,
            ref,
            name: analysis.meta.pipeName,
            nameExpr: analysis.pipeNameExpr,
            isStandalone: analysis.meta.isStandalone,
            decorator: analysis.decorator,
            isExplicitlyDeferred: false,
            isPure: analysis.meta.pure,
        });
        this.injectableRegistry.registerInjectable(node, {
            ctorDeps: analysis.meta.deps,
        });
    }
    resolve(node) {
        if (this.compilationMode === checker.CompilationMode.LOCAL) {
            return {};
        }
        const duplicateDeclData = this.scopeRegistry.getDuplicateDeclarations(node);
        if (duplicateDeclData !== null) {
            // This pipe was declared twice (or more).
            return {
                diagnostics: [checker.makeDuplicateDeclarationError(node, duplicateDeclData, 'Pipe')],
            };
        }
        return {};
    }
    compileFull(node, analysis) {
        const fac = compileNgFactoryDefField(checker.toFactoryMetadata(analysis.meta, checker.FactoryTarget.Pipe));
        const def = checker.compilePipeFromMetadata(analysis.meta);
        const classMetadata = analysis.classMetadata !== null
            ? compileClassMetadata(analysis.classMetadata).toStmt()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵpipe', null, null /* deferrableImports */);
    }
    compilePartial(node, analysis) {
        const fac = compileDeclareFactory(checker.toFactoryMetadata(analysis.meta, checker.FactoryTarget.Pipe));
        const def = compileDeclarePipeFromMetadata(analysis.meta);
        const classMetadata = analysis.classMetadata !== null
            ? compileDeclareClassMetadata(analysis.classMetadata).toStmt()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵpipe', null, null /* deferrableImports */);
    }
    compileLocal(node, analysis) {
        const fac = compileNgFactoryDefField(checker.toFactoryMetadata(analysis.meta, checker.FactoryTarget.Pipe));
        const def = checker.compilePipeFromMetadata(analysis.meta);
        const classMetadata = analysis.classMetadata !== null
            ? compileClassMetadata(analysis.classMetadata).toStmt()
            : null;
        return checker.compileResults(fac, def, classMetadata, 'ɵpipe', null, null /* deferrableImports */);
    }
}

/**
 * @module
 * @description
 * Entry point for all public APIs of the compiler-cli package.
 */
new checker.Version('19.2.14');

/**
 * Whether a given decorator should be treated as an Angular decorator.
 * Either it's used in @angular/core, or it's imported from there.
 */
function isAngularDecorator(decorator, isCore) {
    return isCore || (decorator.import !== null && decorator.import.from === '@angular/core');
}
/**
 * Extracts the type of the decorator (the function or expression invoked), as well as all the
 * arguments passed to the decorator. Returns an AST with the form:
 *
 *     // For @decorator(arg1, arg2)
 *     { type: decorator, args: [arg1, arg2] }
 */
function extractMetadataFromSingleDecorator(decorator, diagnostics) {
    const metadataProperties = [];
    const expr = decorator.expression;
    switch (expr.kind) {
        case ts.SyntaxKind.Identifier:
            // The decorator was a plain @Foo.
            metadataProperties.push(ts.factory.createPropertyAssignment('type', expr));
            break;
        case ts.SyntaxKind.CallExpression:
            // The decorator was a call, like @Foo(bar).
            const call = expr;
            metadataProperties.push(ts.factory.createPropertyAssignment('type', call.expression));
            if (call.arguments.length) {
                const args = [];
                for (const arg of call.arguments) {
                    args.push(arg);
                }
                const argsArrayLiteral = ts.factory.createArrayLiteralExpression(ts.factory.createNodeArray(args, true));
                metadataProperties.push(ts.factory.createPropertyAssignment('args', argsArrayLiteral));
            }
            break;
        default:
            diagnostics.push({
                file: decorator.getSourceFile(),
                start: decorator.getStart(),
                length: decorator.getEnd() - decorator.getStart(),
                messageText: `${ts.SyntaxKind[decorator.kind]} not implemented in gathering decorator metadata.`,
                category: ts.DiagnosticCategory.Error,
                code: 0,
            });
            break;
    }
    return ts.factory.createObjectLiteralExpression(metadataProperties);
}
/**
 * createCtorParametersClassProperty creates a static 'ctorParameters' property containing
 * downleveled decorator information.
 *
 * The property contains an arrow function that returns an array of object literals of the shape:
 *     static ctorParameters = () => [{
 *       type: SomeClass|undefined,  // the type of the param that's decorated, if it's a value.
 *       decorators: [{
 *         type: DecoratorFn,  // the type of the decorator that's invoked.
 *         args: [ARGS],       // the arguments passed to the decorator.
 *       }]
 *     }];
 */
function createCtorParametersClassProperty(diagnostics, entityNameToExpression, ctorParameters, isClosureCompilerEnabled) {
    const params = [];
    for (const ctorParam of ctorParameters) {
        if (!ctorParam.type && ctorParam.decorators.length === 0) {
            params.push(ts.factory.createNull());
            continue;
        }
        const paramType = ctorParam.type
            ? typeReferenceToExpression(entityNameToExpression, ctorParam.type)
            : undefined;
        const members = [
            ts.factory.createPropertyAssignment('type', paramType || ts.factory.createIdentifier('undefined')),
        ];
        const decorators = [];
        for (const deco of ctorParam.decorators) {
            decorators.push(extractMetadataFromSingleDecorator(deco, diagnostics));
        }
        if (decorators.length) {
            members.push(ts.factory.createPropertyAssignment('decorators', ts.factory.createArrayLiteralExpression(decorators)));
        }
        params.push(ts.factory.createObjectLiteralExpression(members));
    }
    const initializer = ts.factory.createArrowFunction(undefined, undefined, [], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), ts.factory.createArrayLiteralExpression(params, true));
    const ctorProp = ts.factory.createPropertyDeclaration([ts.factory.createToken(ts.SyntaxKind.StaticKeyword)], 'ctorParameters', undefined, undefined, initializer);
    return ctorProp;
}
/**
 * Returns an expression representing the (potentially) value part for the given node.
 *
 * This is a partial re-implementation of TypeScript's serializeTypeReferenceNode. This is a
 * workaround for https://github.com/Microsoft/TypeScript/issues/17516 (serializeTypeReferenceNode
 * not being exposed). In practice this implementation is sufficient for Angular's use of type
 * metadata.
 */
function typeReferenceToExpression(entityNameToExpression, node) {
    let kind = node.kind;
    if (ts.isLiteralTypeNode(node)) {
        // Treat literal types like their base type (boolean, string, number).
        kind = node.literal.kind;
    }
    switch (kind) {
        case ts.SyntaxKind.FunctionType:
        case ts.SyntaxKind.ConstructorType:
            return ts.factory.createIdentifier('Function');
        case ts.SyntaxKind.ArrayType:
        case ts.SyntaxKind.TupleType:
            return ts.factory.createIdentifier('Array');
        case ts.SyntaxKind.TypePredicate:
        case ts.SyntaxKind.TrueKeyword:
        case ts.SyntaxKind.FalseKeyword:
        case ts.SyntaxKind.BooleanKeyword:
            return ts.factory.createIdentifier('Boolean');
        case ts.SyntaxKind.StringLiteral:
        case ts.SyntaxKind.StringKeyword:
            return ts.factory.createIdentifier('String');
        case ts.SyntaxKind.ObjectKeyword:
            return ts.factory.createIdentifier('Object');
        case ts.SyntaxKind.NumberKeyword:
        case ts.SyntaxKind.NumericLiteral:
            return ts.factory.createIdentifier('Number');
        case ts.SyntaxKind.TypeReference:
            const typeRef = node;
            // Ignore any generic types, just return the base type.
            return entityNameToExpression(typeRef.typeName);
        case ts.SyntaxKind.UnionType:
            const childTypeNodes = node.types.filter((t) => !(ts.isLiteralTypeNode(t) && t.literal.kind === ts.SyntaxKind.NullKeyword));
            return childTypeNodes.length === 1
                ? typeReferenceToExpression(entityNameToExpression, childTypeNodes[0])
                : undefined;
        default:
            return undefined;
    }
}
/**
 * Checks whether a given symbol refers to a value that exists at runtime (as distinct from a type).
 *
 * Expands aliases, which is important for the case where
 *   import * as x from 'some-module';
 * and x is now a value (the module object).
 */
function symbolIsRuntimeValue(typeChecker, symbol) {
    if (symbol.flags & ts.SymbolFlags.Alias) {
        symbol = typeChecker.getAliasedSymbol(symbol);
    }
    // Note that const enums are a special case, because
    // while they have a value, they don't exist at runtime.
    return (symbol.flags & ts.SymbolFlags.Value & ts.SymbolFlags.ConstEnumExcludes) !== 0;
}
/**
 * Gets a transformer for downleveling Angular constructor parameter and property decorators.
 *
 * Note that Angular class decorators are never processed as those rely on side effects that
 * would otherwise no longer be executed. i.e. the creation of a component definition.
 *
 * @param typeChecker Reference to the program's type checker.
 * @param host Reflection host that is used for determining decorators.
 * @param diagnostics List which will be populated with diagnostics if any.
 * @param isCore Whether the current TypeScript program is for the `@angular/core` package.
 * @param isClosureCompilerEnabled Whether closure annotations need to be added where needed.
 * @param shouldTransformClass Optional function to check if a given class should be transformed.
 */
function getDownlevelDecoratorsTransform(typeChecker, host, diagnostics, isCore, isClosureCompilerEnabled, shouldTransformClass) {
    /**
     * createPropDecoratorsClassProperty creates a static 'propDecorators'
     * property containing type information for every property that has a
     * decorator applied.
     *
     *     static propDecorators: {[key: string]: {type: Function, args?:
     * any[]}[]} = { propA: [{type: MyDecorator, args: [1, 2]}, ...],
     *       ...
     *     };
     */
    function createPropDecoratorsClassProperty(diagnostics, properties) {
        //  `static propDecorators: {[key: string]: ` + {type: Function, args?:
        //  any[]}[] + `} = {\n`);
        const entries = [];
        for (const [name, decorators] of properties.entries()) {
            entries.push(ts.factory.createPropertyAssignment(name, ts.factory.createArrayLiteralExpression(decorators.map((deco) => extractMetadataFromSingleDecorator(deco, diagnostics)))));
        }
        const initializer = ts.factory.createObjectLiteralExpression(entries, true);
        const prop = ts.factory.createPropertyDeclaration([ts.factory.createToken(ts.SyntaxKind.StaticKeyword)], 'propDecorators', undefined, undefined, initializer);
        return prop;
    }
    return (context) => {
        // Ensure that referenced type symbols are not elided by TypeScript. Imports for
        // such parameter type symbols previously could be type-only, but now might be also
        // used in the `ctorParameters` static property as a value. We want to make sure
        // that TypeScript does not elide imports for such type references. Read more
        // about this in the description for `loadIsReferencedAliasDeclarationPatch`.
        const referencedParameterTypes = checker.loadIsReferencedAliasDeclarationPatch(context);
        /**
         * Converts an EntityName (from a type annotation) to an expression (accessing a value).
         *
         * For a given qualified name, this walks depth first to find the leftmost identifier,
         * and then converts the path into a property access that can be used as expression.
         */
        function entityNameToExpression(name) {
            const symbol = typeChecker.getSymbolAtLocation(name);
            // Check if the entity name references a symbol that is an actual value. If it is not, it
            // cannot be referenced by an expression, so return undefined.
            if (!symbol ||
                !symbolIsRuntimeValue(typeChecker, symbol) ||
                !symbol.declarations ||
                symbol.declarations.length === 0) {
                return undefined;
            }
            // If we deal with a qualified name, build up a property access expression
            // that could be used in the JavaScript output.
            if (ts.isQualifiedName(name)) {
                const containerExpr = entityNameToExpression(name.left);
                if (containerExpr === undefined) {
                    return undefined;
                }
                return ts.factory.createPropertyAccessExpression(containerExpr, name.right);
            }
            const decl = symbol.declarations[0];
            // If the given entity name has been resolved to an alias import declaration,
            // ensure that the alias declaration is not elided by TypeScript, and use its
            // name identifier to reference it at runtime.
            if (checker.isAliasImportDeclaration(decl)) {
                referencedParameterTypes?.add(decl);
                // If the entity name resolves to an alias import declaration, we reference the
                // entity based on the alias import name. This ensures that TypeScript properly
                // resolves the link to the import. Cloning the original entity name identifier
                // could lead to an incorrect resolution at local scope. e.g. Consider the following
                // snippet: `constructor(Dep: Dep) {}`. In such a case, the local `Dep` identifier
                // would resolve to the actual parameter name, and not to the desired import.
                // This happens because the entity name identifier symbol is internally considered
                // as type-only and therefore TypeScript tries to resolve it as value manually.
                // We can help TypeScript and avoid this non-reliable resolution by using an identifier
                // that is not type-only and is directly linked to the import alias declaration.
                if (decl.name !== undefined) {
                    return ts.setOriginalNode(ts.factory.createIdentifier(decl.name.text), decl.name);
                }
            }
            // Clone the original entity name identifier so that it can be used to reference
            // its value at runtime. This is used when the identifier is resolving to a file
            // local declaration (otherwise it would resolve to an alias import declaration).
            return ts.setOriginalNode(ts.factory.createIdentifier(name.text), name);
        }
        /**
         * Transforms a class element. Returns a three tuple of name, transformed element, and
         * decorators found. Returns an undefined name if there are no decorators to lower on the
         * element, or the element has an exotic name.
         */
        function transformClassElement(element) {
            element = ts.visitEachChild(element, decoratorDownlevelVisitor, context);
            const decoratorsToKeep = [];
            const toLower = [];
            const decorators = host.getDecoratorsOfDeclaration(element) || [];
            for (const decorator of decorators) {
                // We only deal with concrete nodes in TypeScript sources, so we don't
                // need to handle synthetically created decorators.
                const decoratorNode = decorator.node;
                if (!isAngularDecorator(decorator, isCore)) {
                    decoratorsToKeep.push(decoratorNode);
                    continue;
                }
                toLower.push(decoratorNode);
            }
            if (!toLower.length)
                return [undefined, element, []];
            if (!element.name || !ts.isIdentifier(element.name)) {
                // Method has a weird name, e.g.
                //   [Symbol.foo]() {...}
                diagnostics.push({
                    file: element.getSourceFile(),
                    start: element.getStart(),
                    length: element.getEnd() - element.getStart(),
                    messageText: `Cannot process decorators for class element with non-analyzable name.`,
                    category: ts.DiagnosticCategory.Error,
                    code: 0,
                });
                return [undefined, element, []];
            }
            const elementModifiers = ts.canHaveModifiers(element) ? ts.getModifiers(element) : undefined;
            let modifiers;
            if (decoratorsToKeep.length || elementModifiers?.length) {
                modifiers = ts.setTextRange(ts.factory.createNodeArray([...decoratorsToKeep, ...(elementModifiers || [])]), element.modifiers);
            }
            return [element.name.text, cloneClassElementWithModifiers(element, modifiers), toLower];
        }
        /**
         * Transforms a constructor. Returns the transformed constructor and the list of parameter
         * information collected, consisting of decorators and optional type.
         */
        function transformConstructor(ctor) {
            ctor = ts.visitEachChild(ctor, decoratorDownlevelVisitor, context);
            const newParameters = [];
            const oldParameters = ctor.parameters;
            const parametersInfo = [];
            for (const param of oldParameters) {
                const decoratorsToKeep = [];
                const paramInfo = { decorators: [], type: null };
                const decorators = host.getDecoratorsOfDeclaration(param) || [];
                for (const decorator of decorators) {
                    // We only deal with concrete nodes in TypeScript sources, so we don't
                    // need to handle synthetically created decorators.
                    const decoratorNode = decorator.node;
                    if (!isAngularDecorator(decorator, isCore)) {
                        decoratorsToKeep.push(decoratorNode);
                        continue;
                    }
                    paramInfo.decorators.push(decoratorNode);
                }
                if (param.type) {
                    // param has a type provided, e.g. "foo: Bar".
                    // The type will be emitted as a value expression in entityNameToExpression, which takes
                    // care not to emit anything for types that cannot be expressed as a value (e.g.
                    // interfaces).
                    paramInfo.type = param.type;
                }
                parametersInfo.push(paramInfo);
                // Must pass 'undefined' to avoid emitting decorator metadata.
                let modifiers;
                const paramModifiers = ts.getModifiers(param);
                if (decoratorsToKeep.length || paramModifiers?.length) {
                    modifiers = [...decoratorsToKeep, ...(paramModifiers || [])];
                }
                const newParam = ts.factory.updateParameterDeclaration(param, modifiers, param.dotDotDotToken, param.name, param.questionToken, param.type, param.initializer);
                newParameters.push(newParam);
            }
            const updated = ts.factory.updateConstructorDeclaration(ctor, ts.getModifiers(ctor), newParameters, ctor.body);
            return [updated, parametersInfo];
        }
        /**
         * Transforms a single class declaration:
         * - dispatches to strip decorators on members
         * - converts decorators on the class to annotations
         * - creates a ctorParameters property
         * - creates a propDecorators property
         */
        function transformClassDeclaration(classDecl) {
            const newMembers = [];
            const decoratedProperties = new Map();
            let classParameters = null;
            for (const member of classDecl.members) {
                switch (member.kind) {
                    case ts.SyntaxKind.PropertyDeclaration:
                    case ts.SyntaxKind.GetAccessor:
                    case ts.SyntaxKind.SetAccessor:
                    case ts.SyntaxKind.MethodDeclaration: {
                        const [name, newMember, decorators] = transformClassElement(member);
                        newMembers.push(newMember);
                        if (name)
                            decoratedProperties.set(name, decorators);
                        continue;
                    }
                    case ts.SyntaxKind.Constructor: {
                        const ctor = member;
                        if (!ctor.body)
                            break;
                        const [newMember, parametersInfo] = transformConstructor(member);
                        classParameters = parametersInfo;
                        newMembers.push(newMember);
                        continue;
                    }
                }
                newMembers.push(ts.visitEachChild(member, decoratorDownlevelVisitor, context));
            }
            // Note: The `ReflectionHost.getDecoratorsOfDeclaration()` method will not
            // return all decorators, but only ones that could be possible Angular decorators.
            const possibleAngularDecorators = host.getDecoratorsOfDeclaration(classDecl) || [];
            // Keep track if we come across an Angular class decorator. This is used
            // to determine whether constructor parameters should be captured or not.
            const hasAngularDecorator = possibleAngularDecorators.some((d) => isAngularDecorator(d, isCore));
            if (classParameters) {
                if (hasAngularDecorator || classParameters.some((p) => !!p.decorators.length)) {
                    // Capture constructor parameters if the class has Angular decorator applied,
                    // or if any of the parameters has decorators applied directly.
                    newMembers.push(createCtorParametersClassProperty(diagnostics, entityNameToExpression, classParameters));
                }
            }
            if (decoratedProperties.size) {
                newMembers.push(createPropDecoratorsClassProperty(diagnostics, decoratedProperties));
            }
            const members = ts.setTextRange(ts.factory.createNodeArray(newMembers, classDecl.members.hasTrailingComma), classDecl.members);
            return ts.factory.updateClassDeclaration(classDecl, classDecl.modifiers, classDecl.name, classDecl.typeParameters, classDecl.heritageClauses, members);
        }
        /**
         * Transformer visitor that looks for Angular decorators and replaces them with
         * downleveled static properties. Also collects constructor type metadata for
         * class declaration that are decorated with an Angular decorator.
         */
        function decoratorDownlevelVisitor(node) {
            if (ts.isClassDeclaration(node) &&
                (shouldTransformClass === undefined || shouldTransformClass(node))) {
                return transformClassDeclaration(node);
            }
            return ts.visitEachChild(node, decoratorDownlevelVisitor, context);
        }
        return (sf) => {
            // Downlevel decorators and constructor parameter types. We will keep track of all
            // referenced constructor parameter types so that we can instruct TypeScript to
            // not elide their imports if they previously were only type-only.
            return ts.visitEachChild(sf, decoratorDownlevelVisitor, context);
        };
    };
}
function cloneClassElementWithModifiers(node, modifiers) {
    let clone;
    if (ts.isMethodDeclaration(node)) {
        clone = ts.factory.createMethodDeclaration(modifiers, node.asteriskToken, node.name, node.questionToken, node.typeParameters, node.parameters, node.type, node.body);
    }
    else if (ts.isPropertyDeclaration(node)) {
        clone = ts.factory.createPropertyDeclaration(modifiers, node.name, node.questionToken, node.type, node.initializer);
    }
    else if (ts.isGetAccessor(node)) {
        clone = ts.factory.createGetAccessorDeclaration(modifiers, node.name, node.parameters, node.type, node.body);
    }
    else if (ts.isSetAccessor(node)) {
        clone = ts.factory.createSetAccessorDeclaration(modifiers, node.name, node.parameters, node.body);
    }
    else {
        throw new Error(`Unsupported decorated member with kind ${ts.SyntaxKind[node.kind]}`);
    }
    return ts.setOriginalNode(clone, node);
}

/**
 * Creates an import and access for a given Angular core import while
 * ensuring the decorator symbol access can be traced back to an Angular core
 * import in order to make the synthetic decorator compatible with the JIT
 * decorator downlevel transform.
 */
function createSyntheticAngularCoreDecoratorAccess(factory, importManager, ngClassDecorator, sourceFile, decoratorName) {
    const classDecoratorIdentifier = ts.isIdentifier(ngClassDecorator.identifier)
        ? ngClassDecorator.identifier
        : ngClassDecorator.identifier.expression;
    return factory.createPropertyAccessExpression(importManager.addImport({
        exportModuleSpecifier: '@angular/core',
        exportSymbolName: null,
        requestedFile: sourceFile,
    }), 
    // The synthetic identifier may be checked later by the downlevel decorators
    // transform to resolve to an Angular import using `getSymbolAtLocation`. We trick
    // the transform to think it's not synthetic and comes from Angular core.
    ts.setOriginalNode(factory.createIdentifier(decoratorName), classDecoratorIdentifier));
}
/** Casts the given expression as `any`. */
function castAsAny(factory, expr) {
    return factory.createAsExpression(expr, factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
}

/**
 * Transform that will automatically add an `@Input` decorator for all signal
 * inputs in Angular classes. The decorator will capture metadata of the signal
 * input, derived from the `input()/input.required()` initializer.
 *
 * This transform is useful for JIT environments where signal inputs would like to be
 * used. e.g. for Angular CLI unit testing. In such environments, signal inputs are not
 * statically retrievable at runtime. JIT compilation needs to know about all possible inputs
 * before instantiating directives. A decorator exposes this information to the class without
 * the class needing to be instantiated.
 */
const signalInputsTransform = (member, sourceFile, host, factory, importTracker, importManager, classDecorator, isCore) => {
    // If the field already is decorated, we handle this gracefully and skip it.
    if (host
        .getDecoratorsOfDeclaration(member.node)
        ?.some((d) => checker.isAngularDecorator(d, 'Input', isCore))) {
        return member.node;
    }
    const inputMapping = checker.tryParseSignalInputMapping(member, host, importTracker);
    if (inputMapping === null) {
        return member.node;
    }
    const fields = {
        'isSignal': factory.createTrue(),
        'alias': factory.createStringLiteral(inputMapping.bindingPropertyName),
        'required': inputMapping.required ? factory.createTrue() : factory.createFalse(),
        // For signal inputs, transforms are captured by the input signal. The runtime will
        // determine whether a transform needs to be run via the input signal, so the `transform`
        // option is always `undefined`.
        'transform': factory.createIdentifier('undefined'),
    };
    const newDecorator = factory.createDecorator(factory.createCallExpression(createSyntheticAngularCoreDecoratorAccess(factory, importManager, classDecorator, sourceFile, 'Input'), undefined, [
        // Cast to `any` because `isSignal` will be private, and in case this
        // transform is used directly as a pre-compilation step, the decorator should
        // not fail. It is already validated now due to us parsing the input metadata.
        castAsAny(factory, factory.createObjectLiteralExpression(Object.entries(fields).map(([name, value]) => factory.createPropertyAssignment(name, value)))),
    ]));
    return factory.updatePropertyDeclaration(member.node, [newDecorator, ...(member.node.modifiers ?? [])], member.name, member.node.questionToken, member.node.type, member.node.initializer);
};

/**
 * Transform that automatically adds `@Input` and `@Output` to members initialized as `model()`.
 * It is useful for JIT environments where models can't be recognized based on the initializer.
 */
const signalModelTransform = (member, sourceFile, host, factory, importTracker, importManager, classDecorator, isCore) => {
    if (host.getDecoratorsOfDeclaration(member.node)?.some((d) => {
        return checker.isAngularDecorator(d, 'Input', isCore) || checker.isAngularDecorator(d, 'Output', isCore);
    })) {
        return member.node;
    }
    const modelMapping = checker.tryParseSignalModelMapping(member, host, importTracker);
    if (modelMapping === null) {
        return member.node;
    }
    const inputConfig = factory.createObjectLiteralExpression([
        factory.createPropertyAssignment('isSignal', modelMapping.input.isSignal ? factory.createTrue() : factory.createFalse()),
        factory.createPropertyAssignment('alias', factory.createStringLiteral(modelMapping.input.bindingPropertyName)),
        factory.createPropertyAssignment('required', modelMapping.input.required ? factory.createTrue() : factory.createFalse()),
    ]);
    const inputDecorator = createDecorator('Input', 
    // Config is cast to `any` because `isSignal` will be private, and in case this
    // transform is used directly as a pre-compilation step, the decorator should
    // not fail. It is already validated now due to us parsing the input metadata.
    factory.createAsExpression(inputConfig, factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)), classDecorator, factory, sourceFile, importManager);
    const outputDecorator = createDecorator('Output', factory.createStringLiteral(modelMapping.output.bindingPropertyName), classDecorator, factory, sourceFile, importManager);
    return factory.updatePropertyDeclaration(member.node, [inputDecorator, outputDecorator, ...(member.node.modifiers ?? [])], member.node.name, member.node.questionToken, member.node.type, member.node.initializer);
};
function createDecorator(name, config, classDecorator, factory, sourceFile, importManager) {
    const callTarget = createSyntheticAngularCoreDecoratorAccess(factory, importManager, classDecorator, sourceFile, name);
    return factory.createDecorator(factory.createCallExpression(callTarget, undefined, [config]));
}

/**
 * Transform that will automatically add an `@Output` decorator for all initializer API
 * outputs in Angular classes. The decorator will capture metadata of the output, such
 * as the alias.
 *
 * This transform is useful for JIT environments. In such envir   onments, such outputs are not
 * statically retrievable at runtime. JIT compilation needs to know about all possible outputs
 * before instantiating directives. A decorator exposes this information to the class without
 * the class needing to be instantiated.
 */
const initializerApiOutputTransform = (member, sourceFile, host, factory, importTracker, importManager, classDecorator, isCore) => {
    // If the field already is decorated, we handle this gracefully and skip it.
    if (host
        .getDecoratorsOfDeclaration(member.node)
        ?.some((d) => checker.isAngularDecorator(d, 'Output', isCore))) {
        return member.node;
    }
    const output = checker.tryParseInitializerBasedOutput(member, host, importTracker);
    if (output === null) {
        return member.node;
    }
    const newDecorator = factory.createDecorator(factory.createCallExpression(createSyntheticAngularCoreDecoratorAccess(factory, importManager, classDecorator, sourceFile, 'Output'), undefined, [factory.createStringLiteral(output.metadata.bindingPropertyName)]));
    return factory.updatePropertyDeclaration(member.node, [newDecorator, ...(member.node.modifiers ?? [])], member.node.name, member.node.questionToken, member.node.type, member.node.initializer);
};

/** Maps a query function to its decorator. */
const queryFunctionToDecorator = {
    viewChild: 'ViewChild',
    viewChildren: 'ViewChildren',
    contentChild: 'ContentChild',
    contentChildren: 'ContentChildren',
};
/**
 * Transform that will automatically add query decorators for all signal-based
 * queries in Angular classes. The decorator will capture metadata of the signal
 * query, derived from the initializer-based API call.
 *
 * This transform is useful for JIT environments where signal queries would like to be
 * used. e.g. for Angular CLI unit testing. In such environments, signal queries are not
 * statically retrievable at runtime. JIT compilation needs to know about all possible queries
 * before instantiating directives to construct the definition. A decorator exposes this
 * information to the class without the class needing to be instantiated.
 */
const queryFunctionsTransforms = (member, sourceFile, host, factory, importTracker, importManager, classDecorator, isCore) => {
    const decorators = host.getDecoratorsOfDeclaration(member.node);
    // If the field already is decorated, we handle this gracefully and skip it.
    const queryDecorators = decorators && checker.getAngularDecorators(decorators, checker.queryDecoratorNames, isCore);
    if (queryDecorators !== null && queryDecorators.length > 0) {
        return member.node;
    }
    const queryDefinition = checker.tryParseSignalQueryFromInitializer(member, host, importTracker);
    if (queryDefinition === null) {
        return member.node;
    }
    const callArgs = queryDefinition.call.arguments;
    const newDecorator = factory.createDecorator(factory.createCallExpression(createSyntheticAngularCoreDecoratorAccess(factory, importManager, classDecorator, sourceFile, queryFunctionToDecorator[queryDefinition.name]), undefined, 
    // All positional arguments of the query functions can be mostly re-used as is
    // for the decorator. i.e. predicate is always first argument. Options are second.
    [
        queryDefinition.call.arguments[0],
        // Note: Casting as `any` because `isSignal` is not publicly exposed and this
        // transform might pre-transform TS sources.
        castAsAny(factory, factory.createObjectLiteralExpression([
            ...(callArgs.length > 1 ? [factory.createSpreadAssignment(callArgs[1])] : []),
            factory.createPropertyAssignment('isSignal', factory.createTrue()),
        ])),
    ]));
    return factory.updatePropertyDeclaration(member.node, [newDecorator, ...(member.node.modifiers ?? [])], member.node.name, member.node.questionToken, member.node.type, member.node.initializer);
};

/** Decorators for classes that should be transformed. */
const decoratorsWithInputs = ['Directive', 'Component'];
/**
 * List of possible property transforms.
 * The first one matched on a class member will apply.
 */
const propertyTransforms = [
    signalInputsTransform,
    initializerApiOutputTransform,
    queryFunctionsTransforms,
    signalModelTransform,
];
/**
 * Creates an AST transform that looks for Angular classes and transforms
 * initializer-based declared members to work with JIT compilation.
 *
 * For example, an `input()` member may be transformed to add an `@Input`
 * decorator for JIT.
 *
 * @param host Reflection host
 * @param importTracker Import tracker for efficient import checking.
 * @param isCore Whether this transforms runs against `@angular/core`.
 * @param shouldTransformClass Optional function to check if a given class should be transformed.
 */
function getInitializerApiJitTransform(host, importTracker, isCore, shouldTransformClass) {
    return (ctx) => {
        return (sourceFile) => {
            const importManager = new checker.ImportManager();
            sourceFile = ts.visitNode(sourceFile, createTransformVisitor(ctx, host, importManager, importTracker, isCore, shouldTransformClass), ts.isSourceFile);
            return importManager.transformTsFile(ctx, sourceFile);
        };
    };
}
function createTransformVisitor(ctx, host, importManager, importTracker, isCore, shouldTransformClass) {
    const visitor = (node) => {
        if (ts.isClassDeclaration(node) && node.name !== undefined) {
            const originalNode = ts.getOriginalNode(node, ts.isClassDeclaration);
            // Note: Attempt to detect the `angularDecorator` on the original node of the class.
            // That is because e.g. Tsickle or other transforms might have transformed the node
            // already to transform decorators.
            const angularDecorator = host
                .getDecoratorsOfDeclaration(originalNode)
                ?.find((d) => decoratorsWithInputs.some((name) => checker.isAngularDecorator(d, name, isCore)));
            if (angularDecorator !== undefined &&
                (shouldTransformClass === undefined || shouldTransformClass(node))) {
                let hasChanged = false;
                const sourceFile = originalNode.getSourceFile();
                const members = node.members.map((memberNode) => {
                    if (!ts.isPropertyDeclaration(memberNode)) {
                        return memberNode;
                    }
                    const member = checker.reflectClassMember(memberNode);
                    if (member === null) {
                        return memberNode;
                    }
                    // Find the first matching transform and update the class member.
                    for (const transform of propertyTransforms) {
                        const newNode = transform({ ...member, node: memberNode }, sourceFile, host, ctx.factory, importTracker, importManager, angularDecorator, isCore);
                        if (newNode !== member.node) {
                            hasChanged = true;
                            return newNode;
                        }
                    }
                    return memberNode;
                });
                if (hasChanged) {
                    return ctx.factory.updateClassDeclaration(node, node.modifiers, node.name, node.typeParameters, node.heritageClauses, members);
                }
            }
        }
        return ts.visitEachChild(node, visitor, ctx);
    };
    return visitor;
}

/**
 * JIT transform for Angular applications. Used by the Angular CLI for unit tests and
 * explicit JIT applications.
 *
 * The transforms include:
 *
 *  - A transform for downleveling Angular decorators and Angular-decorated class constructor
 *    parameters for dependency injection. This transform can be used by the CLI for JIT-mode
 *    compilation where constructor parameters and associated Angular decorators should be
 *    downleveled so that apps are not exposed to the ES2015 temporal dead zone limitation
 *    in TypeScript. See https://github.com/angular/angular-cli/pull/14473 for more details.
 *
 *  - A transform for adding `@Input` to signal inputs. Signal inputs cannot be recognized
 *    at runtime using reflection. That is because the class would need to be instantiated-
 *    but is not possible before creation. To fix this for JIT, a decorator is automatically
 *    added that will declare the input as a signal input while also capturing the necessary
 *    metadata
 */
function angularJitApplicationTransform(program, isCore = false, shouldTransformClass) {
    const typeChecker = program.getTypeChecker();
    const reflectionHost = new checker.TypeScriptReflectionHost(typeChecker);
    const importTracker = new ImportedSymbolsTracker();
    const downlevelDecoratorTransform = getDownlevelDecoratorsTransform(typeChecker, reflectionHost, [], isCore, 
    /* enableClosureCompiler */ false, shouldTransformClass);
    const initializerApisJitTransform = getInitializerApiJitTransform(reflectionHost, importTracker, isCore, shouldTransformClass);
    return (ctx) => {
        return (sourceFile) => {
            sourceFile = initializerApisJitTransform(ctx)(sourceFile);
            sourceFile = downlevelDecoratorTransform(ctx)(sourceFile);
            return sourceFile;
        };
    };
}

const UNKNOWN_ERROR_CODE = 500;
exports.EmitFlags = void 0;
(function (EmitFlags) {
    EmitFlags[EmitFlags["DTS"] = 1] = "DTS";
    EmitFlags[EmitFlags["JS"] = 2] = "JS";
    EmitFlags[EmitFlags["Metadata"] = 4] = "Metadata";
    EmitFlags[EmitFlags["I18nBundle"] = 8] = "I18nBundle";
    EmitFlags[EmitFlags["Codegen"] = 16] = "Codegen";
    EmitFlags[EmitFlags["Default"] = 19] = "Default";
    EmitFlags[EmitFlags["All"] = 31] = "All";
})(exports.EmitFlags || (exports.EmitFlags = {}));

function i18nGetExtension(formatName) {
    const format = formatName.toLowerCase();
    switch (format) {
        case 'xmb':
            return 'xmb';
        case 'xlf':
        case 'xlif':
        case 'xliff':
        case 'xlf2':
        case 'xliff2':
            return 'xlf';
    }
    throw new Error(`Unsupported format "${formatName}"`);
}
function i18nExtract(formatName, outFile, host, options, bundle, pathResolve = p__namespace.resolve) {
    formatName = formatName || 'xlf';
    // Checks the format and returns the extension
    const ext = i18nGetExtension(formatName);
    const content = i18nSerialize(bundle, formatName, options);
    const dstFile = outFile || `messages.${ext}`;
    const dstPath = pathResolve(options.outDir || options.basePath, dstFile);
    host.writeFile(dstPath, content, false, undefined, []);
    return [dstPath];
}
function i18nSerialize(bundle, formatName, options) {
    const format = formatName.toLowerCase();
    let serializer;
    switch (format) {
        case 'xmb':
            serializer = new checker.Xmb();
            break;
        case 'xliff2':
        case 'xlf2':
            serializer = new Xliff2();
            break;
        case 'xlf':
        case 'xliff':
        default:
            serializer = new Xliff();
    }
    return bundle.write(serializer, getPathNormalizer(options.basePath));
}
function getPathNormalizer(basePath) {
    // normalize source paths by removing the base path and always using "/" as a separator
    return (sourcePath) => {
        sourcePath = basePath ? p__namespace.relative(basePath, sourcePath) : sourcePath;
        return sourcePath.split(p__namespace.sep).join('/');
    };
}

/**
 * Converts a `string` version into an array of numbers
 * @example
 * toNumbers('2.0.1'); // returns [2, 0, 1]
 */
function toNumbers(value) {
    // Drop any suffixes starting with `-` so that versions like `1.2.3-rc.5` are treated as `1.2.3`.
    const suffixIndex = value.lastIndexOf('-');
    return value
        .slice(0, suffixIndex === -1 ? value.length : suffixIndex)
        .split('.')
        .map((segment) => {
        const parsed = parseInt(segment, 10);
        if (isNaN(parsed)) {
            throw Error(`Unable to parse version string ${value}.`);
        }
        return parsed;
    });
}
/**
 * Compares two arrays of positive numbers with lexicographical order in mind.
 *
 * However - unlike lexicographical order - for arrays of different length we consider:
 * [1, 2, 3] = [1, 2, 3, 0] instead of [1, 2, 3] < [1, 2, 3, 0]
 *
 * @param a The 'left hand' array in the comparison test
 * @param b The 'right hand' in the comparison test
 * @returns {-1|0|1} The comparison result: 1 if a is greater, -1 if b is greater, 0 is the two
 * arrays are equals
 */
function compareNumbers(a, b) {
    const max = Math.max(a.length, b.length);
    const min = Math.min(a.length, b.length);
    for (let i = 0; i < min; i++) {
        if (a[i] > b[i])
            return 1;
        if (a[i] < b[i])
            return -1;
    }
    if (min !== max) {
        const longestArray = a.length === max ? a : b;
        // The result to return in case the to arrays are considered different (1 if a is greater,
        // -1 if b is greater)
        const comparisonResult = a.length === max ? 1 : -1;
        // Check that at least one of the remaining elements is greater than 0 to consider that the two
        // arrays are different (e.g. [1, 0] and [1] are considered the same but not [1, 0, 1] and [1])
        for (let i = min; i < max; i++) {
            if (longestArray[i] > 0) {
                return comparisonResult;
            }
        }
    }
    return 0;
}
/**
 * Compares two versions
 *
 * @param v1 The 'left hand' version in the comparison test
 * @param v2 The 'right hand' version in the comparison test
 * @returns {-1|0|1} The comparison result: 1 if v1 is greater, -1 if v2 is greater, 0 is the two
 * versions are equals
 */
function compareVersions(v1, v2) {
    return compareNumbers(toNumbers(v1), toNumbers(v2));
}

/**
 * Minimum supported TypeScript version
 * ∀ supported typescript version v, v >= MIN_TS_VERSION
 *
 * Note: this check is disabled in g3, search for
 * `angularCompilerOptions.disableTypeScriptVersionCheck` config param value in g3.
 */
const MIN_TS_VERSION = '5.5.0';
/**
 * Supremum of supported TypeScript versions
 * ∀ supported typescript version v, v < MAX_TS_VERSION
 * MAX_TS_VERSION is not considered as a supported TypeScript version
 *
 * Note: this check is disabled in g3, search for
 * `angularCompilerOptions.disableTypeScriptVersionCheck` config param value in g3.
 */
const MAX_TS_VERSION = '5.9.0';
/**
 * The currently used version of TypeScript, which can be adjusted for testing purposes using
 * `setTypeScriptVersionForTesting` and `restoreTypeScriptVersionForTesting` below.
 */
let tsVersion = ts.version;
/**
 * Checks whether a given version ∈ [minVersion, maxVersion[.
 * An error will be thrown when the given version ∉ [minVersion, maxVersion[.
 *
 * @param version The version on which the check will be performed
 * @param minVersion The lower bound version. A valid version needs to be greater than minVersion
 * @param maxVersion The upper bound version. A valid version needs to be strictly less than
 * maxVersion
 *
 * @throws Will throw an error if the given version ∉ [minVersion, maxVersion[
 */
function checkVersion(version, minVersion, maxVersion) {
    if (compareVersions(version, minVersion) < 0 || compareVersions(version, maxVersion) >= 0) {
        throw new Error(`The Angular Compiler requires TypeScript >=${minVersion} and <${maxVersion} but ${version} was found instead.`);
    }
}
function verifySupportedTypeScriptVersion() {
    checkVersion(tsVersion, MIN_TS_VERSION, MAX_TS_VERSION);
}

/**
 * Analyzes a `ts.Program` for cycles.
 */
class CycleAnalyzer {
    importGraph;
    /**
     * Cycle detection is requested with the same `from` source file for all used directives and pipes
     * within a component, which makes it beneficial to cache the results as long as the `from` source
     * file has not changed. This avoids visiting the import graph that is reachable from multiple
     * directives/pipes more than once.
     */
    cachedResults = null;
    constructor(importGraph) {
        this.importGraph = importGraph;
    }
    /**
     * Check for a cycle to be created in the `ts.Program` by adding an import between `from` and
     * `to`.
     *
     * @returns a `Cycle` object if an import between `from` and `to` would create a cycle; `null`
     *     otherwise.
     */
    wouldCreateCycle(from, to) {
        // Try to reuse the cached results as long as the `from` source file is the same.
        if (this.cachedResults === null || this.cachedResults.from !== from) {
            this.cachedResults = new CycleResults(from, this.importGraph);
        }
        // Import of 'from' -> 'to' is illegal if an edge 'to' -> 'from' already exists.
        return this.cachedResults.wouldBeCyclic(to) ? new Cycle(this.importGraph, from, to) : null;
    }
    /**
     * Record a synthetic import from `from` to `to`.
     *
     * This is an import that doesn't exist in the `ts.Program` but will be considered as part of the
     * import graph for cycle creation.
     */
    recordSyntheticImport(from, to) {
        this.cachedResults = null;
        this.importGraph.addSyntheticImport(from, to);
    }
}
const NgCyclicResult = Symbol('NgCyclicResult');
/**
 * Stores the results of cycle detection in a memory efficient manner. A symbol is attached to
 * source files that indicate what the cyclic analysis result is, as indicated by two markers that
 * are unique to this instance. This alleviates memory pressure in large import graphs, as each
 * execution is able to store its results in the same memory location (i.e. in the symbol
 * on the source file) as earlier executions.
 */
class CycleResults {
    from;
    importGraph;
    cyclic = {};
    acyclic = {};
    constructor(from, importGraph) {
        this.from = from;
        this.importGraph = importGraph;
    }
    wouldBeCyclic(sf) {
        const cached = this.getCachedResult(sf);
        if (cached !== null) {
            // The result for this source file has already been computed, so return its result.
            return cached;
        }
        if (sf === this.from) {
            // We have reached the source file that we want to create an import from, which means that
            // doing so would create a cycle.
            return true;
        }
        // Assume for now that the file will be acyclic; this prevents infinite recursion in the case
        // that `sf` is visited again as part of an existing cycle in the graph.
        this.markAcyclic(sf);
        const imports = this.importGraph.importsOf(sf);
        for (const imported of imports) {
            if (this.wouldBeCyclic(imported)) {
                this.markCyclic(sf);
                return true;
            }
        }
        return false;
    }
    /**
     * Returns whether the source file is already known to be cyclic, or `null` if the result is not
     * yet known.
     */
    getCachedResult(sf) {
        const result = sf[NgCyclicResult];
        if (result === this.cyclic) {
            return true;
        }
        else if (result === this.acyclic) {
            return false;
        }
        else {
            // Either the symbol is missing or its value does not correspond with one of the current
            // result markers. As such, the result is unknown.
            return null;
        }
    }
    markCyclic(sf) {
        sf[NgCyclicResult] = this.cyclic;
    }
    markAcyclic(sf) {
        sf[NgCyclicResult] = this.acyclic;
    }
}
/**
 * Represents an import cycle between `from` and `to` in the program.
 *
 * This class allows us to do the work to compute the cyclic path between `from` and `to` only if
 * needed.
 */
class Cycle {
    importGraph;
    from;
    to;
    constructor(importGraph, from, to) {
        this.importGraph = importGraph;
        this.from = from;
        this.to = to;
    }
    /**
     * Compute an array of source-files that illustrates the cyclic path between `from` and `to`.
     *
     * Note that a `Cycle` will not be created unless a path is available between `to` and `from`,
     * so `findPath()` will never return `null`.
     */
    getPath() {
        return [this.from, ...this.importGraph.findPath(this.to, this.from)];
    }
}

/**
 * A cached graph of imports in the `ts.Program`.
 *
 * The `ImportGraph` keeps track of dependencies (imports) of individual `ts.SourceFile`s. Only
 * dependencies within the same program are tracked; imports into packages on NPM are not.
 */
class ImportGraph {
    checker;
    perf;
    imports = new Map();
    constructor(checker, perf) {
        this.checker = checker;
        this.perf = perf;
    }
    /**
     * List the direct (not transitive) imports of a given `ts.SourceFile`.
     *
     * This operation is cached.
     */
    importsOf(sf) {
        if (!this.imports.has(sf)) {
            this.imports.set(sf, this.scanImports(sf));
        }
        return this.imports.get(sf);
    }
    /**
     * Find an import path from the `start` SourceFile to the `end` SourceFile.
     *
     * This function implements a breadth first search that results in finding the
     * shortest path between the `start` and `end` points.
     *
     * @param start the starting point of the path.
     * @param end the ending point of the path.
     * @returns an array of source files that connect the `start` and `end` source files, or `null` if
     *     no path could be found.
     */
    findPath(start, end) {
        if (start === end) {
            // Escape early for the case where `start` and `end` are the same.
            return [start];
        }
        const found = new Set([start]);
        const queue = [new Found(start, null)];
        while (queue.length > 0) {
            const current = queue.shift();
            const imports = this.importsOf(current.sourceFile);
            for (const importedFile of imports) {
                if (!found.has(importedFile)) {
                    const next = new Found(importedFile, current);
                    if (next.sourceFile === end) {
                        // We have hit the target `end` path so we can stop here.
                        return next.toPath();
                    }
                    found.add(importedFile);
                    queue.push(next);
                }
            }
        }
        return null;
    }
    /**
     * Add a record of an import from `sf` to `imported`, that's not present in the original
     * `ts.Program` but will be remembered by the `ImportGraph`.
     */
    addSyntheticImport(sf, imported) {
        if (isLocalFile(imported)) {
            this.importsOf(sf).add(imported);
        }
    }
    scanImports(sf) {
        return this.perf.inPhase(checker.PerfPhase.CycleDetection, () => {
            const imports = new Set();
            // Look through the source file for import and export statements.
            for (const stmt of sf.statements) {
                if ((!ts.isImportDeclaration(stmt) && !ts.isExportDeclaration(stmt)) ||
                    stmt.moduleSpecifier === undefined) {
                    continue;
                }
                if (ts.isImportDeclaration(stmt) &&
                    stmt.importClause !== undefined &&
                    isTypeOnlyImportClause(stmt.importClause)) {
                    // Exclude type-only imports as they are always elided, so they don't contribute to
                    // cycles.
                    continue;
                }
                const symbol = this.checker.getSymbolAtLocation(stmt.moduleSpecifier);
                if (symbol === undefined || symbol.valueDeclaration === undefined) {
                    // No symbol could be found to skip over this import/export.
                    continue;
                }
                const moduleFile = symbol.valueDeclaration;
                if (ts.isSourceFile(moduleFile) && isLocalFile(moduleFile)) {
                    // Record this local import.
                    imports.add(moduleFile);
                }
            }
            return imports;
        });
    }
}
function isLocalFile(sf) {
    return !sf.isDeclarationFile;
}
function isTypeOnlyImportClause(node) {
    // The clause itself is type-only (e.g. `import type {foo} from '...'`).
    if (node.isTypeOnly) {
        return true;
    }
    // All the specifiers in the cause are type-only (e.g. `import {type a, type b} from '...'`).
    if (node.namedBindings !== undefined &&
        ts.isNamedImports(node.namedBindings) &&
        node.namedBindings.elements.every((specifier) => specifier.isTypeOnly)) {
        return true;
    }
    return false;
}
/**
 * A helper class to track which SourceFiles are being processed when searching for a path in
 * `getPath()` above.
 */
class Found {
    sourceFile;
    parent;
    constructor(sourceFile, parent) {
        this.sourceFile = sourceFile;
        this.parent = parent;
    }
    /**
     * Back track through this found SourceFile and its ancestors to generate an array of
     * SourceFiles that form am import path between two SourceFiles.
     */
    toPath() {
        const array = [];
        let current = this;
        while (current !== null) {
            array.push(current.sourceFile);
            current = current.parent;
        }
        // Pushing and then reversing, O(n), rather than unshifting repeatedly, O(n^2), avoids
        // manipulating the array on every iteration: https://stackoverflow.com/a/26370620
        return array.reverse();
    }
}

/** Type of top-level documentation entry. */
var EntryType;
(function (EntryType) {
    EntryType["Block"] = "block";
    EntryType["Component"] = "component";
    EntryType["Constant"] = "constant";
    EntryType["Decorator"] = "decorator";
    EntryType["Directive"] = "directive";
    EntryType["Element"] = "element";
    EntryType["Enum"] = "enum";
    EntryType["Function"] = "function";
    EntryType["Interface"] = "interface";
    EntryType["NgModule"] = "ng_module";
    EntryType["Pipe"] = "pipe";
    EntryType["TypeAlias"] = "type_alias";
    EntryType["UndecoratedClass"] = "undecorated_class";
    EntryType["InitializerApiFunction"] = "initializer_api_function";
})(EntryType || (EntryType = {}));
/** Types of class members */
var MemberType;
(function (MemberType) {
    MemberType["Property"] = "property";
    MemberType["Method"] = "method";
    MemberType["Getter"] = "getter";
    MemberType["Setter"] = "setter";
    MemberType["EnumItem"] = "enum_item";
})(MemberType || (MemberType = {}));
var DecoratorType;
(function (DecoratorType) {
    DecoratorType["Class"] = "class";
    DecoratorType["Member"] = "member";
    DecoratorType["Parameter"] = "parameter";
})(DecoratorType || (DecoratorType = {}));
/** Informational tags applicable to class members. */
var MemberTags;
(function (MemberTags) {
    MemberTags["Abstract"] = "abstract";
    MemberTags["Static"] = "static";
    MemberTags["Readonly"] = "readonly";
    MemberTags["Protected"] = "protected";
    MemberTags["Optional"] = "optional";
    MemberTags["Input"] = "input";
    MemberTags["Output"] = "output";
    MemberTags["Inherited"] = "override";
})(MemberTags || (MemberTags = {}));

/** Gets whether a symbol's name indicates it is an Angular-private API. */
function isAngularPrivateName(name) {
    const firstChar = name[0] ?? '';
    return firstChar === 'ɵ' || firstChar === '_';
}

/** Gets a list of all the generic type parameters for a declaration. */
function extractGenerics(declaration) {
    return (declaration.typeParameters?.map((typeParam) => ({
        name: typeParam.name.getText(),
        constraint: typeParam.constraint?.getText(),
        default: typeParam.default?.getText(),
    })) ?? []);
}

/**
 * RegExp to match the `@` character follow by any Angular decorator, used to escape Angular
 * decorators in JsDoc blocks so that they're not parsed as JsDoc tags.
 */
const decoratorExpression = /@(?=(Injectable|Component|Directive|Pipe|NgModule|Input|Output|HostBinding|HostListener|Inject|Optional|Self|Host|SkipSelf|ViewChild|ViewChildren|ContentChild|ContentChildren))/g;
/** Gets the set of JsDoc tags applied to a node. */
function extractJsDocTags(node) {
    const escapedNode = getEscapedNode(node);
    return ts.getJSDocTags(escapedNode).map((t) => {
        return {
            name: t.tagName.getText(),
            comment: unescapeAngularDecorators(ts.getTextOfJSDocComment(t.comment) ?? ''),
        };
    });
}
/**
 * Gets the JsDoc description for a node. If the node does not have
 * a description, returns the empty string.
 */
function extractJsDocDescription(node) {
    const escapedNode = getEscapedNode(node);
    // If the node is a top-level statement (const, class, function, etc.), we will get
    // a `ts.JSDoc` here. If the node is a `ts.ParameterDeclaration`, we will get
    // a `ts.JSDocParameterTag`.
    const commentOrTag = ts.getJSDocCommentsAndTags(escapedNode).find((d) => {
        return ts.isJSDoc(d) || ts.isJSDocParameterTag(d);
    });
    const comment = commentOrTag?.comment ?? '';
    const description = typeof comment === 'string' ? comment : (ts.getTextOfJSDocComment(comment) ?? '');
    return unescapeAngularDecorators(description);
}
/**
 * Gets the raw JsDoc applied to a node.
 * If the node does not have a JsDoc block, returns the empty string.
 */
function extractRawJsDoc(node) {
    // Assume that any node has at most one JsDoc block.
    const comment = ts.getJSDocCommentsAndTags(node).find(ts.isJSDoc)?.getFullText() ?? '';
    return unescapeAngularDecorators(comment);
}
/**
 * Gets an "escaped" version of the node by copying its raw JsDoc into a new source file
 * on top of a dummy class declaration. For the purposes of JsDoc extraction, we don't actually
 * care about the node itself, only its JsDoc block.
 */
function getEscapedNode(node) {
    // TODO(jelbourn): It's unclear whether we need to escape @param JsDoc, since they're unlikely
    //    to have an Angular decorator on the beginning of a line. If we do need to escape them,
    //    it will require some more complicated copying below.
    if (ts.isParameter(node)) {
        return node;
    }
    const rawComment = extractRawJsDoc(node);
    const escaped = escapeAngularDecorators(rawComment);
    const file = ts.createSourceFile('x.ts', `${escaped}class X {}`, ts.ScriptTarget.ES2020, true);
    return file.statements.find((s) => ts.isClassDeclaration(s));
}
/** Escape the `@` character for Angular decorators. */
function escapeAngularDecorators(comment) {
    return comment.replace(decoratorExpression, '_NG_AT_');
}
/** Unescapes the `@` character for Angular decorators. */
function unescapeAngularDecorators(comment) {
    return comment.replace(/_NG_AT_/g, '@');
}

/** Gets the string representation of a node's resolved type. */
function extractResolvedTypeString(node, checker) {
    return checker.typeToString(checker.getTypeAtLocation(node), undefined, ts.TypeFormatFlags.NoTruncation);
}

class FunctionExtractor {
    name;
    exportDeclaration;
    typeChecker;
    constructor(name, exportDeclaration, typeChecker) {
        this.name = name;
        this.exportDeclaration = exportDeclaration;
        this.typeChecker = typeChecker;
    }
    extract() {
        // TODO: is there any real situation in which the signature would not be available here?
        //     Is void a better type?
        const signature = this.typeChecker.getSignatureFromDeclaration(this.exportDeclaration);
        const returnType = signature ? extractReturnType(signature, this.typeChecker) : 'unknown';
        const implementation = findImplementationOfFunction(this.exportDeclaration, this.typeChecker) ??
            this.exportDeclaration;
        const type = this.typeChecker.getTypeAtLocation(this.exportDeclaration);
        const overloads = ts.isConstructorDeclaration(this.exportDeclaration)
            ? constructorOverloads(this.exportDeclaration, this.typeChecker)
            : extractCallSignatures(this.name, this.typeChecker, type);
        const jsdocsTags = extractJsDocTags(implementation);
        const description = extractJsDocDescription(implementation);
        return {
            name: this.name,
            signatures: overloads,
            implementation: {
                params: extractAllParams(implementation.parameters, this.typeChecker),
                isNewType: ts.isConstructSignatureDeclaration(implementation),
                returnType,
                returnDescription: jsdocsTags.find((tag) => tag.name === 'returns')?.comment,
                generics: extractGenerics(implementation),
                name: this.name,
                description,
                entryType: EntryType.Function,
                jsdocTags: jsdocsTags,
                rawComment: extractRawJsDoc(implementation),
            },
            entryType: EntryType.Function,
            description,
            jsdocTags: jsdocsTags,
            rawComment: extractRawJsDoc(implementation),
        };
    }
}
function constructorOverloads(constructorDeclaration, typeChecker) {
    const classDeclaration = constructorDeclaration.parent;
    const constructorNode = classDeclaration.members.filter((member) => {
        return ts.isConstructorDeclaration(member) && !member.body;
    });
    return constructorNode.map((n) => {
        return {
            name: 'constructor',
            params: extractAllParams(n.parameters, typeChecker),
            returnType: typeChecker.getTypeAtLocation(classDeclaration)?.symbol.name,
            description: extractJsDocDescription(n),
            entryType: EntryType.Function,
            jsdocTags: extractJsDocTags(n),
            rawComment: extractRawJsDoc(n),
            generics: extractGenerics(n),
            isNewType: false,
        };
    });
}
/** Extracts parameters of the given parameter declaration AST nodes. */
function extractAllParams(params, typeChecker) {
    return params.map((param) => ({
        name: param.name.getText(),
        description: extractJsDocDescription(param),
        type: extractResolvedTypeString(param, typeChecker),
        isOptional: !!(param.questionToken || param.initializer),
        isRestParam: !!param.dotDotDotToken,
    }));
}
/** Filters the list signatures to valid function and initializer API signatures. */
function filterSignatureDeclarations(signatures) {
    const result = [];
    for (const signature of signatures) {
        const decl = signature.getDeclaration();
        if (ts.isFunctionDeclaration(decl) ||
            ts.isCallSignatureDeclaration(decl) ||
            ts.isMethodDeclaration(decl) ||
            ts.isConstructSignatureDeclaration(decl)) {
            result.push({ signature, decl });
        }
    }
    return result;
}
function extractCallSignatures(name, typeChecker, type) {
    return filterSignatureDeclarations(type.getCallSignatures()).map(({ decl, signature }) => ({
        name,
        entryType: EntryType.Function,
        description: extractJsDocDescription(decl),
        generics: extractGenerics(decl),
        isNewType: false,
        jsdocTags: extractJsDocTags(decl),
        params: extractAllParams(decl.parameters, typeChecker),
        rawComment: extractRawJsDoc(decl),
        returnType: extractReturnType(signature, typeChecker),
    }));
}
function extractReturnType(signature, typeChecker) {
    // Handling Type Predicates
    if (signature?.declaration?.type && ts.isTypePredicateNode(signature.declaration.type)) {
        return signature.declaration.type.getText();
    }
    return typeChecker.typeToString(typeChecker.getReturnTypeOfSignature(signature), undefined, 
    // This ensures that e.g. `T | undefined` is not reduced to `T`.
    ts.TypeFormatFlags.NoTypeReduction | ts.TypeFormatFlags.NoTruncation);
}
/** Finds the implementation of the given function declaration overload signature. */
function findImplementationOfFunction(node, typeChecker) {
    if (node.body !== undefined || node.name === undefined) {
        return node;
    }
    const symbol = typeChecker.getSymbolAtLocation(node.name);
    const implementation = symbol?.declarations?.find((s) => ts.isFunctionDeclaration(s) && s.body !== undefined);
    return implementation;
}

/**
 * Check if the member has a JSDoc @internal or a @internal is a normal comment
 */
function isInternal(member) {
    return (extractJsDocTags(member).some((tag) => tag.name === 'internal') ||
        hasLeadingInternalComment(member));
}
/*
 * Check if the member has a comment block with @internal
 */
function hasLeadingInternalComment(member) {
    const memberText = member.getSourceFile().text;
    return (ts.reduceEachLeadingCommentRange(memberText, member.getFullStart(), (pos, end, kind, hasTrailingNewLine, containsInternal) => {
        return containsInternal || memberText.slice(pos, end).includes('@internal');
    }, 
    /* state */ false, 
    /* initial */ false) ?? false);
}

/** Extractor to pull info for API reference documentation for a TypeScript class or interface. */
class ClassExtractor {
    declaration;
    typeChecker;
    constructor(declaration, typeChecker) {
        this.declaration = declaration;
        this.typeChecker = typeChecker;
    }
    /** Extract docs info specific to classes. */
    extract() {
        return {
            name: this.declaration.name.text,
            isAbstract: this.isAbstract(),
            entryType: ts.isInterfaceDeclaration(this.declaration)
                ? EntryType.Interface
                : EntryType.UndecoratedClass,
            members: this.extractSignatures().concat(this.extractAllClassMembers()),
            generics: extractGenerics(this.declaration),
            description: extractJsDocDescription(this.declaration),
            jsdocTags: extractJsDocTags(this.declaration),
            rawComment: extractRawJsDoc(this.declaration),
            extends: this.extractInheritance(this.declaration),
            implements: this.extractInterfaceConformance(this.declaration),
        };
    }
    /** Extracts doc info for a class's members. */
    extractAllClassMembers() {
        const members = [];
        for (const member of this.getMemberDeclarations()) {
            if (this.isMemberExcluded(member))
                continue;
            const memberEntry = this.extractClassMember(member);
            if (memberEntry) {
                members.push(memberEntry);
            }
        }
        return members;
    }
    /** Extract docs for a class's members (methods and properties).  */
    extractClassMember(memberDeclaration) {
        if (this.isMethod(memberDeclaration)) {
            return this.extractMethod(memberDeclaration);
        }
        else if (this.isProperty(memberDeclaration) &&
            !this.hasPrivateComputedProperty(memberDeclaration)) {
            return this.extractClassProperty(memberDeclaration);
        }
        else if (ts.isAccessor(memberDeclaration)) {
            return this.extractGetterSetter(memberDeclaration);
        }
        else if (ts.isConstructorDeclaration(memberDeclaration) &&
            memberDeclaration.parameters.length > 0) {
            return this.extractConstructor(memberDeclaration);
        }
        // We only expect methods, properties, and accessors. If we encounter something else,
        // return undefined and let the rest of the program filter it out.
        return undefined;
    }
    /** Extract docs for all call signatures in the current class/interface. */
    extractSignatures() {
        return this.computeAllSignatureDeclarations().map((s) => this.extractSignature(s));
    }
    /** Extracts docs for a class method. */
    extractMethod(methodDeclaration) {
        const functionExtractor = new FunctionExtractor(methodDeclaration.name.getText(), methodDeclaration, this.typeChecker);
        return {
            ...functionExtractor.extract(),
            memberType: MemberType.Method,
            memberTags: this.getMemberTags(methodDeclaration),
        };
    }
    /** Extracts docs for a signature element (usually inside an interface). */
    extractSignature(signature) {
        // No name for the function if we are dealing with call signatures.
        // For construct signatures we are using `new` as the name of the function for now.
        // TODO: Consider exposing a new entry type for signature types.
        const functionExtractor = new FunctionExtractor(ts.isConstructSignatureDeclaration(signature) ? 'new' : '', signature, this.typeChecker);
        return {
            ...functionExtractor.extract(),
            memberType: MemberType.Method,
            memberTags: [],
        };
    }
    /** Extracts doc info for a property declaration. */
    extractClassProperty(propertyDeclaration) {
        return {
            name: propertyDeclaration.name.getText(),
            type: extractResolvedTypeString(propertyDeclaration, this.typeChecker),
            memberType: MemberType.Property,
            memberTags: this.getMemberTags(propertyDeclaration),
            description: extractJsDocDescription(propertyDeclaration),
            jsdocTags: extractJsDocTags(propertyDeclaration),
        };
    }
    /** Extracts doc info for an accessor member (getter/setter). */
    extractGetterSetter(accessor) {
        return {
            ...this.extractClassProperty(accessor),
            memberType: ts.isGetAccessor(accessor) ? MemberType.Getter : MemberType.Setter,
        };
    }
    extractConstructor(constructorDeclaration) {
        const functionExtractor = new FunctionExtractor('constructor', constructorDeclaration, this.typeChecker);
        return {
            ...functionExtractor.extract(),
            memberType: MemberType.Method,
            memberTags: this.getMemberTags(constructorDeclaration),
        };
    }
    extractInheritance(declaration) {
        if (!declaration.heritageClauses) {
            return undefined;
        }
        for (const clause of declaration.heritageClauses) {
            if (clause.token === ts.SyntaxKind.ExtendsKeyword) {
                // We are assuming a single class can only extend one class.
                const types = clause.types;
                if (types.length > 0) {
                    const baseClass = types[0];
                    return baseClass.getText();
                }
            }
        }
        return undefined;
    }
    extractInterfaceConformance(declaration) {
        const implementClause = declaration.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ImplementsKeyword);
        return implementClause?.types.map((m) => m.getText()) ?? [];
    }
    /** Gets the tags for a member (protected, readonly, static, etc.) */
    getMemberTags(member) {
        const tags = this.getMemberTagsFromModifiers(member.modifiers ?? []);
        if (member.questionToken) {
            tags.push(MemberTags.Optional);
        }
        if (member.parent !== this.declaration) {
            tags.push(MemberTags.Inherited);
        }
        return tags;
    }
    /** Computes all signature declarations of the class/interface. */
    computeAllSignatureDeclarations() {
        const type = this.typeChecker.getTypeAtLocation(this.declaration);
        const signatures = [...type.getCallSignatures(), ...type.getConstructSignatures()];
        const result = [];
        for (const signature of signatures) {
            const decl = signature.getDeclaration();
            if (this.isDocumentableSignature(decl) && this.isDocumentableMember(decl)) {
                result.push(decl);
            }
        }
        return result;
    }
    /** Gets all member declarations, including inherited members. */
    getMemberDeclarations() {
        // We rely on TypeScript to resolve all the inherited members to their
        // ultimate form via `getProperties`. This is important because child
        // classes may narrow types or add method overloads.
        const type = this.typeChecker.getTypeAtLocation(this.declaration);
        const members = type.getProperties();
        const constructor = type.getSymbol()?.members?.get(ts.InternalSymbolName.Constructor);
        // While the properties of the declaration type represent the properties that exist
        // on a class *instance*, static members are properties on the class symbol itself.
        const typeOfConstructor = this.typeChecker.getTypeOfSymbol(type.symbol);
        const staticMembers = typeOfConstructor.getProperties();
        const result = [];
        for (const member of [...(constructor ? [constructor] : []), ...members, ...staticMembers]) {
            // A member may have multiple declarations in the case of function overloads.
            const memberDeclarations = this.filterMethodOverloads(member.getDeclarations() ?? []);
            for (const memberDeclaration of memberDeclarations) {
                if (this.isDocumentableMember(memberDeclaration)) {
                    result.push(memberDeclaration);
                }
            }
        }
        return result;
    }
    /** The result only contains properties, method implementations and abstracts */
    filterMethodOverloads(declarations) {
        return declarations.filter((declaration, index) => {
            // Check if the declaration is a function or method
            if (ts.isFunctionDeclaration(declaration) ||
                ts.isMethodDeclaration(declaration) ||
                ts.isConstructorDeclaration(declaration)) {
                // TypeScript ensures that all declarations for a given abstract method appear consecutively.
                const nextDeclaration = declarations[index + 1];
                const isNextMethodWithSameName = nextDeclaration &&
                    ((ts.isMethodDeclaration(nextDeclaration) &&
                        nextDeclaration.name.getText() === declaration.name?.getText()) ||
                        (ts.isConstructorDeclaration(nextDeclaration) &&
                            ts.isConstructorDeclaration(declaration)));
                // Return only the last occurrence of a method to avoid overload duplication.
                // Subsequent overloads or implementations are handled separately by the function extractor.
                return !isNextMethodWithSameName;
            }
            // Include non-method declarations, such as properties, without filtering.
            return true;
        });
    }
    /** Get the tags for a member that come from the declaration modifiers. */
    getMemberTagsFromModifiers(mods) {
        const tags = [];
        for (const mod of mods) {
            const tag = this.getTagForMemberModifier(mod);
            if (tag)
                tags.push(tag);
        }
        return tags;
    }
    /** Gets the doc tag corresponding to a class member modifier (readonly, protected, etc.). */
    getTagForMemberModifier(mod) {
        switch (mod.kind) {
            case ts.SyntaxKind.StaticKeyword:
                return MemberTags.Static;
            case ts.SyntaxKind.ReadonlyKeyword:
                return MemberTags.Readonly;
            case ts.SyntaxKind.ProtectedKeyword:
                return MemberTags.Protected;
            case ts.SyntaxKind.AbstractKeyword:
                return MemberTags.Abstract;
            default:
                return undefined;
        }
    }
    /**
     * Gets whether a given class member should be excluded from public API docs.
     * This is the case if:
     *  - The member does not have a name
     *  - The member is neither a method nor property
     *  - The member is private
     *  - The member has a name that marks it as Angular-internal.
     *  - The member is marked as internal via JSDoc.
     */
    isMemberExcluded(member) {
        if (ts.isConstructorDeclaration(member)) {
            // A constructor has no name
            return false;
        }
        return (!member.name ||
            !this.isDocumentableMember(member) ||
            (!ts.isCallSignatureDeclaration(member) &&
                member.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.PrivateKeyword)) ||
            member.name.getText() === 'prototype' ||
            isAngularPrivateName(member.name.getText()) ||
            isInternal(member));
    }
    /** Gets whether a class member is a method, property, or accessor. */
    isDocumentableMember(member) {
        return (this.isMethod(member) ||
            this.isProperty(member) ||
            ts.isAccessor(member) ||
            ts.isConstructorDeclaration(member) ||
            // Signatures are documentable if they are part of an interface.
            ts.isCallSignatureDeclaration(member));
    }
    /** Check if the parameter is a constructor parameter with a public modifier */
    isPublicConstructorParameterProperty(node) {
        if (ts.isParameterPropertyDeclaration(node, node.parent) && node.modifiers) {
            return node.modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.PublicKeyword);
        }
        return false;
    }
    /** Gets whether a member is a property. */
    isProperty(member) {
        // Classes have declarations, interface have signatures
        return (ts.isPropertyDeclaration(member) ||
            ts.isPropertySignature(member) ||
            this.isPublicConstructorParameterProperty(member));
    }
    /** Gets whether a member is a method. */
    isMethod(member) {
        // Classes have declarations, interface have signatures
        return ts.isMethodDeclaration(member) || ts.isMethodSignature(member);
    }
    /** Gets whether the given signature declaration is documentable. */
    isDocumentableSignature(signature) {
        return (ts.isConstructSignatureDeclaration(signature) || ts.isCallSignatureDeclaration(signature));
    }
    /** Gets whether the declaration for this extractor is abstract. */
    isAbstract() {
        const modifiers = this.declaration.modifiers ?? [];
        return modifiers.some((mod) => mod.kind === ts.SyntaxKind.AbstractKeyword);
    }
    /**
     * Check wether a member has a private computed property name like [ɵWRITABLE_SIGNAL]
     *
     * This will prevent exposing private computed properties in the docs.
     */
    hasPrivateComputedProperty(property) {
        return (ts.isComputedPropertyName(property.name) && property.name.expression.getText().startsWith('ɵ'));
    }
}
/** Extractor to pull info for API reference documentation for an Angular directive. */
class DirectiveExtractor extends ClassExtractor {
    reference;
    metadata;
    constructor(declaration, reference, metadata, checker) {
        super(declaration, checker);
        this.reference = reference;
        this.metadata = metadata;
    }
    /** Extract docs info for directives and components (including underlying class info). */
    extract() {
        return {
            ...super.extract(),
            isStandalone: this.metadata.isStandalone,
            selector: this.metadata.selector ?? '',
            exportAs: this.metadata.exportAs ?? [],
            entryType: this.metadata.isComponent ? EntryType.Component : EntryType.Directive,
        };
    }
    /** Extracts docs info for a directive property, including input/output metadata. */
    extractClassProperty(propertyDeclaration) {
        const entry = super.extractClassProperty(propertyDeclaration);
        const inputMetadata = this.getInputMetadata(propertyDeclaration);
        if (inputMetadata) {
            entry.memberTags.push(MemberTags.Input);
            entry.inputAlias = inputMetadata.bindingPropertyName;
            entry.isRequiredInput = inputMetadata.required;
        }
        const outputMetadata = this.getOutputMetadata(propertyDeclaration);
        if (outputMetadata) {
            entry.memberTags.push(MemberTags.Output);
            entry.outputAlias = outputMetadata.bindingPropertyName;
        }
        return entry;
    }
    /** Gets the input metadata for a directive property. */
    getInputMetadata(prop) {
        const propName = prop.name.getText();
        return this.metadata.inputs?.getByClassPropertyName(propName) ?? undefined;
    }
    /** Gets the output metadata for a directive property. */
    getOutputMetadata(prop) {
        const propName = prop.name.getText();
        return this.metadata?.outputs?.getByClassPropertyName(propName) ?? undefined;
    }
}
/** Extractor to pull info for API reference documentation for an Angular pipe. */
class PipeExtractor extends ClassExtractor {
    reference;
    metadata;
    constructor(declaration, reference, metadata, typeChecker) {
        super(declaration, typeChecker);
        this.reference = reference;
        this.metadata = metadata;
    }
    extract() {
        return {
            ...super.extract(),
            pipeName: this.metadata.name,
            entryType: EntryType.Pipe,
            isStandalone: this.metadata.isStandalone,
            usage: extractPipeSyntax(this.metadata, this.declaration),
            isPure: this.metadata.isPure,
        };
    }
}
/** Extractor to pull info for API reference documentation for an Angular pipe. */
class NgModuleExtractor extends ClassExtractor {
    reference;
    metadata;
    constructor(declaration, reference, metadata, typeChecker) {
        super(declaration, typeChecker);
        this.reference = reference;
        this.metadata = metadata;
    }
    extract() {
        return {
            ...super.extract(),
            entryType: EntryType.NgModule,
        };
    }
}
/** Extracts documentation info for a class, potentially including Angular-specific info.  */
function extractClass(classDeclaration, metadataReader, typeChecker) {
    const ref = new checker.Reference(classDeclaration);
    let extractor;
    let directiveMetadata = metadataReader.getDirectiveMetadata(ref);
    let pipeMetadata = metadataReader.getPipeMetadata(ref);
    let ngModuleMetadata = metadataReader.getNgModuleMetadata(ref);
    if (directiveMetadata) {
        extractor = new DirectiveExtractor(classDeclaration, ref, directiveMetadata, typeChecker);
    }
    else if (pipeMetadata) {
        extractor = new PipeExtractor(classDeclaration, ref, pipeMetadata, typeChecker);
    }
    else if (ngModuleMetadata) {
        extractor = new NgModuleExtractor(classDeclaration, ref, ngModuleMetadata, typeChecker);
    }
    else {
        extractor = new ClassExtractor(classDeclaration, typeChecker);
    }
    return extractor.extract();
}
/** Extracts documentation info for an interface. */
function extractInterface(declaration, typeChecker) {
    const extractor = new ClassExtractor(declaration, typeChecker);
    return extractor.extract();
}
function extractPipeSyntax(metadata, classDeclaration) {
    const transformParams = classDeclaration.members.find((member) => {
        return (ts.isMethodDeclaration(member) &&
            member.name &&
            ts.isIdentifier(member.name) &&
            member.name.getText() === 'transform');
    });
    let paramNames = transformParams.parameters
        // value is the first argument, it's already referenced before the pipe
        .slice(1)
        .map((param) => {
        return param.name.getText();
    });
    return `{{ value_expression | ${metadata.name}${paramNames.length ? ':' + paramNames.join(':') : ''} }}`;
}

/** Name of the tag indicating that an object literal should be shown as an enum in docs. */
const LITERAL_AS_ENUM_TAG = 'object-literal-as-enum';
/** Extracts documentation entry for a constant. */
function extractConstant(declaration, typeChecker) {
    // For constants specifically, we want to get the base type for any literal types.
    // For example, TypeScript by default extracts `const PI = 3.14` as PI having a type of the
    // literal `3.14`. We don't want this behavior for constants, since generally one wants the
    // _value_ of the constant to be able to change between releases without changing the type.
    // `VERSION` is a good example here; the version is always a `string`, but the actual value of
    // the version string shouldn't matter to the type system.
    const resolvedType = typeChecker.getBaseTypeOfLiteralType(typeChecker.getTypeAtLocation(declaration));
    // In the TS AST, the leading comment for a variable declaration is actually
    // on the ancestor `ts.VariableStatement` (since a single variable statement may
    // contain multiple variable declarations).
    const rawComment = extractRawJsDoc(declaration.parent.parent);
    const jsdocTags = extractJsDocTags(declaration);
    const description = extractJsDocDescription(declaration);
    const name = declaration.name.getText();
    // Some constants have to be treated as enums for documentation purposes.
    if (jsdocTags.some((tag) => tag.name === LITERAL_AS_ENUM_TAG)) {
        return {
            name,
            entryType: EntryType.Enum,
            members: extractLiteralPropertiesAsEnumMembers(declaration),
            rawComment,
            description,
            jsdocTags: jsdocTags.filter((tag) => tag.name !== LITERAL_AS_ENUM_TAG),
        };
    }
    return {
        name: name,
        type: typeChecker.typeToString(resolvedType),
        entryType: EntryType.Constant,
        rawComment,
        description,
        jsdocTags,
    };
}
/** Gets whether a given constant is an Angular-added const that should be ignored for docs. */
function isSyntheticAngularConstant(declaration) {
    return declaration.name.getText() === 'USED_FOR_NG_TYPE_CHECKING';
}
/**
 * Extracts the properties of a variable initialized as an object literal as if they were enum
 * members. Will throw for any variables that can't be statically analyzed easily.
 */
function extractLiteralPropertiesAsEnumMembers(declaration) {
    let initializer = declaration.initializer;
    // Unwrap `as` and parenthesized expressions.
    while (initializer &&
        (ts.isAsExpression(initializer) || ts.isParenthesizedExpression(initializer))) {
        initializer = initializer.expression;
    }
    if (initializer === undefined || !ts.isObjectLiteralExpression(initializer)) {
        throw new Error(`Declaration tagged with "${LITERAL_AS_ENUM_TAG}" must be initialized to an object literal, but received ${initializer ? ts.SyntaxKind[initializer.kind] : 'undefined'}`);
    }
    return initializer.properties.map((prop) => {
        if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name)) {
            throw new Error(`Property in declaration tagged with "${LITERAL_AS_ENUM_TAG}" must be a property assignment with a static name`);
        }
        if (!ts.isNumericLiteral(prop.initializer) && !ts.isStringLiteralLike(prop.initializer)) {
            throw new Error(`Property in declaration tagged with "${LITERAL_AS_ENUM_TAG}" must be initialized to a number or string literal`);
        }
        return {
            name: prop.name.text,
            type: `${declaration.name.getText()}.${prop.name.text}`,
            value: prop.initializer.getText(),
            memberType: MemberType.EnumItem,
            jsdocTags: extractJsDocTags(prop),
            description: extractJsDocDescription(prop),
            memberTags: [],
        };
    });
}

/** Extracts an API documentation entry for an Angular decorator. */
function extractorDecorator(declaration, typeChecker) {
    const documentedNode = getDecoratorJsDocNode(declaration);
    const decoratorType = getDecoratorType(declaration);
    if (!decoratorType) {
        throw new Error(`"${declaration.name.getText()} is not a decorator."`);
    }
    return {
        name: declaration.name.getText(),
        decoratorType: decoratorType,
        entryType: EntryType.Decorator,
        rawComment: extractRawJsDoc(documentedNode),
        description: extractJsDocDescription(documentedNode),
        jsdocTags: extractJsDocTags(documentedNode),
        members: getDecoratorOptions(declaration, typeChecker),
    };
}
/** Gets whether the given variable declaration is an Angular decorator declaration. */
function isDecoratorDeclaration(declaration) {
    return !!getDecoratorType(declaration);
}
/** Gets whether an interface is the options interface for a decorator in the same file. */
function isDecoratorOptionsInterface(declaration) {
    return declaration
        .getSourceFile()
        .statements.some((s) => ts.isVariableStatement(s) &&
        s.declarationList.declarations.some((d) => isDecoratorDeclaration(d) && d.name.getText() === declaration.name.getText()));
}
/** Gets the type of decorator, or undefined if the declaration is not a decorator. */
function getDecoratorType(declaration) {
    // All Angular decorators are initialized with one of `makeDecorator`, `makePropDecorator`,
    // or `makeParamDecorator`.
    const initializer = declaration.initializer?.getFullText() ?? '';
    if (initializer.includes('makeDecorator'))
        return DecoratorType.Class;
    if (initializer.includes('makePropDecorator'))
        return DecoratorType.Member;
    if (initializer.includes('makeParamDecorator'))
        return DecoratorType.Parameter;
    return undefined;
}
/** Gets the doc entry for the options object for an Angular decorator */
function getDecoratorOptions(declaration, typeChecker) {
    const name = declaration.name.getText();
    // Every decorator has an interface with its options in the same SourceFile.
    // Queries, however, are defined as a type alias pointing to an interface.
    const optionsDeclaration = declaration.getSourceFile().statements.find((node) => {
        return ((ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) &&
            node.name.getText() === name);
    });
    if (!optionsDeclaration) {
        throw new Error(`Decorator "${name}" has no corresponding options interface.`);
    }
    let optionsInterface;
    if (ts.isTypeAliasDeclaration(optionsDeclaration)) {
        // We hard-code the assumption that if the decorator's option type is a type alias,
        // it resolves to a single interface (this is true for all query decorators at time of
        // this writing).
        const aliasedType = typeChecker.getTypeAtLocation(optionsDeclaration.type);
        optionsInterface = (aliasedType.getSymbol()?.getDeclarations() ?? []).find((d) => ts.isInterfaceDeclaration(d));
    }
    else {
        optionsInterface = optionsDeclaration;
    }
    if (!optionsInterface || !ts.isInterfaceDeclaration(optionsInterface)) {
        throw new Error(`Options for decorator "${name}" is not an interface.`);
    }
    // Take advantage of the interface extractor to pull the appropriate member info.
    // Hard code the knowledge that decorator options only have properties, never methods.
    return extractInterface(optionsInterface, typeChecker).members;
}
/**
 * Gets the call signature node that has the decorator's public JsDoc block.
 *
 * Every decorator has three parts:
 * - A const that has the actual decorator.
 * - An interface with the same name as the const that documents the decorator's options.
 * - An interface suffixed with "Decorator" that has the decorator's call signature and JsDoc block.
 *
 * For the description and JsDoc tags, we need the interface suffixed with "Decorator".
 */
function getDecoratorJsDocNode(declaration) {
    const name = declaration.name.getText();
    // Assume the existence of an interface in the same file with the same name
    // suffixed with "Decorator".
    const decoratorInterface = declaration.getSourceFile().statements.find((s) => {
        return ts.isInterfaceDeclaration(s) && s.name.getText() === `${name}Decorator`;
    });
    if (!decoratorInterface || !ts.isInterfaceDeclaration(decoratorInterface)) {
        throw new Error(`No interface "${name}Decorator" found.`);
    }
    // The public-facing JsDoc for each decorator is on one of its interface's call signatures.
    const callSignature = decoratorInterface.members.find((node) => {
        // The description block lives on one of the call signatures for this interface.
        return ts.isCallSignatureDeclaration(node) && extractRawJsDoc(node);
    });
    if (!callSignature || !ts.isCallSignatureDeclaration(callSignature)) {
        throw new Error(`No call signature with JsDoc on "${name}Decorator"`);
    }
    return callSignature;
}

/** Extracts documentation entry for an enum. */
function extractEnum(declaration, typeChecker) {
    return {
        name: declaration.name.getText(),
        entryType: EntryType.Enum,
        members: extractEnumMembers(declaration, typeChecker),
        rawComment: extractRawJsDoc(declaration),
        description: extractJsDocDescription(declaration),
        jsdocTags: extractJsDocTags(declaration),
    };
}
/** Extracts doc info for an enum's members. */
function extractEnumMembers(declaration, checker) {
    return declaration.members.map((member) => ({
        name: member.name.getText(),
        type: extractResolvedTypeString(member, checker),
        value: getEnumMemberValue(member),
        memberType: MemberType.EnumItem,
        jsdocTags: extractJsDocTags(member),
        description: extractJsDocDescription(member),
        memberTags: [],
    }));
}
/** Gets the explicitly assigned value for an enum member, or an empty string if there is none. */
function getEnumMemberValue(memberNode) {   
    // If the enum member has a child number literal or string literal,
    // we use that literal as the "value" of the member.
    const literal = memberNode.getChildren().find((n) => {
        return (ts.isNumericLiteral(n) ||
            ts.isStringLiteral(n) ||
            (ts.isPrefixUnaryExpression(n) &&
                n.operator === ts.SyntaxKind.MinusToken &&
                ts.isNumericLiteral(n.operand)));
    });
    return literal?.getText() ?? '';
}

/** JSDoc used to recognize an initializer API function. */
const initializerApiTag = 'initializerApiFunction';
/**
 * Checks whether the given node corresponds to an initializer API function.
 *
 * An initializer API function is a function declaration or variable declaration
 * that is explicitly annotated with `@initializerApiFunction`.
 *
 * Note: The node may be a function overload signature that is automatically
 * resolved to its implementation to detect the JSDoc tag.
 */
function isInitializerApiFunction(node, typeChecker) {
    // If this is matching an overload signature, resolve to the implementation
    // as it would hold the `@initializerApiFunction` tag.
    if (ts.isFunctionDeclaration(node) && node.name !== undefined && node.body === undefined) {
        const implementation = findImplementationOfFunction(node, typeChecker);
        if (implementation !== undefined) {
            node = implementation;
        }
    }
    if (!ts.isFunctionDeclaration(node) && !ts.isVariableDeclaration(node)) {
        return false;
    }
    let tagContainer = ts.isFunctionDeclaration(node) ? node : getContainerVariableStatement(node);
    if (tagContainer === null) {
        return false;
    }
    const tags = ts.getJSDocTags(tagContainer);
    return tags.some((t) => t.tagName.text === initializerApiTag);
}
/**
 * Extracts the given node as initializer API function and returns
 * a docs entry that can be rendered to represent the API function.
 */
function extractInitializerApiFunction(node, typeChecker) {
    if (node.name === undefined || !ts.isIdentifier(node.name)) {
        throw new Error(`Initializer API: Expected literal variable name.`);
    }
    const container = ts.isFunctionDeclaration(node) ? node : getContainerVariableStatement(node);
    if (container === null) {
        throw new Error('Initializer API: Could not find container AST node of variable.');
    }
    const name = node.name.text;
    const type = typeChecker.getTypeAtLocation(node);
    // Top-level call signatures. E.g. `input()`, `input<ReadT>(initialValue: ReadT)`. etc.
    const callFunction = extractFunctionWithOverloads(name, type, typeChecker);
    // Sub-functions like `input.required()`.
    const subFunctions = [];
    for (const property of type.getProperties()) {
        const subName = property.getName();
        const subDecl = property.getDeclarations()?.[0];
        if (subDecl === undefined || !ts.isPropertySignature(subDecl)) {
            throw new Error(`Initializer API: Could not resolve declaration of sub-property: ${name}.${subName}`);
        }
        const subType = typeChecker.getTypeAtLocation(subDecl);
        subFunctions.push(extractFunctionWithOverloads(subName, subType, typeChecker));
    }
    let jsdocTags;
    let description;
    let rawComment;
    // Extract container API documentation.
    // The container description describes the overall function, while
    // we allow the individual top-level call signatures to represent
    // their individual overloads.
    if (ts.isFunctionDeclaration(node)) {
        const implementation = findImplementationOfFunction(node, typeChecker);
        if (implementation === undefined) {
            throw new Error(`Initializer API: Could not find implementation of function: ${name}`);
        }
        callFunction.implementation = {
            name,
            entryType: EntryType.Function,
            isNewType: false,
            description: extractJsDocDescription(implementation),
            generics: extractGenerics(implementation),
            jsdocTags: extractJsDocTags(implementation),
            params: extractAllParams(implementation.parameters, typeChecker),
            rawComment: extractRawJsDoc(implementation),
            returnType: typeChecker.typeToString(typeChecker.getReturnTypeOfSignature(typeChecker.getSignatureFromDeclaration(implementation))),
        };
        jsdocTags = callFunction.implementation.jsdocTags;
        description = callFunction.implementation.description;
        rawComment = callFunction.implementation.description;
    }
    else {
        jsdocTags = extractJsDocTags(container);
        description = extractJsDocDescription(container);
        rawComment = extractRawJsDoc(container);
    }
    // Extract additional docs metadata from the initializer API JSDoc tag.
    const metadataTag = jsdocTags.find((t) => t.name === initializerApiTag);
    if (metadataTag === undefined) {
        throw new Error('Initializer API: Detected initializer API function does ' +
            `not have "@initializerApiFunction" tag: ${name}`);
    }
    let parsedMetadata = undefined;
    if (metadataTag.comment.trim() !== '') {
        try {
            parsedMetadata = JSON.parse(metadataTag.comment);
        }
        catch (e) {
            throw new Error(`Could not parse initializer API function metadata: ${e}`);
        }
    }
    return {
        entryType: EntryType.InitializerApiFunction,
        name,
        description,
        jsdocTags,
        rawComment,
        callFunction,
        subFunctions,
        __docsMetadata__: parsedMetadata,
    };
}
/**
 * Gets the container node of the given variable declaration.
 *
 * A variable declaration may be annotated with e.g. `@initializerApiFunction`,
 * but the JSDoc tag is not attached to the node, but to the containing variable
 * statement.
 */
function getContainerVariableStatement(node) {
    if (!ts.isVariableDeclarationList(node.parent)) {
        return null;
    }
    if (!ts.isVariableStatement(node.parent.parent)) {
        return null;
    }
    return node.parent.parent;
}
/**
 * Extracts all given signatures and returns them as a function with
 * overloads.
 *
 * The implementation of the function may be attached later, or may
 * be non-existent. E.g. initializer APIs declared using an interface
 * with call signatures do not have an associated implementation function
 * that is statically retrievable. The constant holds the overall API description.
 */
function extractFunctionWithOverloads(name, type, typeChecker) {
    return {
        name,
        signatures: extractCallSignatures(name, typeChecker, type),
        // Implementation may be populated later.
        implementation: null,
    };
}

/** Extract the documentation entry for a type alias. */
function extractTypeAlias(declaration) {
    // TODO: this does not yet resolve type queries (`typeof`). We may want to
    //     fix this eventually, but for now it does not appear that any type aliases in
    //     Angular's public API rely on this.
    return {
        name: declaration.name.getText(),
        type: declaration.type.getText(),
        entryType: EntryType.TypeAlias,
        generics: extractGenerics(declaration),
        rawComment: extractRawJsDoc(declaration),
        description: extractJsDocDescription(declaration),
        jsdocTags: extractJsDocTags(declaration),
    };
}

/**
 * For a given SourceFile, it extracts all imported symbols from other Angular packages.
 *
 * @returns a map Symbol => Package, eg: ApplicationRef => @angular/core
 */
function getImportedSymbols(sourceFile) {
    const importSpecifiers = new Map();
    function visit(node) {
        if (ts.isImportDeclaration(node)) {
            let moduleSpecifier = node.moduleSpecifier.getText(sourceFile).replace(/['"]/g, '');
            if (moduleSpecifier.startsWith('@angular/')) {
                const namedBindings = node.importClause?.namedBindings;
                if (namedBindings && ts.isNamedImports(namedBindings)) {
                    namedBindings.elements.forEach((importSpecifier) => {
                        const importName = importSpecifier.name.text;
                        const importAlias = importSpecifier.propertyName
                            ? importSpecifier.propertyName.text
                            : undefined;
                        importSpecifiers.set(importAlias ?? importName, moduleSpecifier);
                    });
                }
            }
        }
        ts.forEachChild(node, visit);
    }
    visit(sourceFile);
    return importSpecifiers;
}

/**
 * Extracts all information from a source file that may be relevant for generating
 * public API documentation.
 */
class DocsExtractor {
    typeChecker;
    metadataReader;
    constructor(typeChecker, metadataReader) {
        this.typeChecker = typeChecker;
        this.metadataReader = metadataReader;
    }
    /**
     * Gets the set of all documentable entries from a source file, including
     * declarations that are re-exported from this file as an entry-point.
     *
     * @param sourceFile The file from which to extract documentable entries.
     */
    extractAll(sourceFile, rootDir, privateModules) {
        const entries = [];
        const symbols = new Map();
        const exportedDeclarations = this.getExportedDeclarations(sourceFile);
        for (const [exportName, node] of exportedDeclarations) {
            // Skip any symbols with an Angular-internal name.
            if (isAngularPrivateName(exportName)) {
                continue;
            }
            const entry = this.extractDeclaration(node);
            if (entry && !isIgnoredDocEntry(entry)) {
                // The source file parameter is the package entry: the index.ts
                // We want the real source file of the declaration.
                const realSourceFile = node.getSourceFile();
                /**
                 * The `sourceFile` from `extractAll` is the main entry-point file of a package.
                 * Usually following a format like `export * from './public_api';`, simply re-exporting.
                 * It is necessary to pick-up every import from the actual source files
                 * where declarations are living, so that we can determine what symbols
                 * are actually referenced in the context of that particular declaration
                 * By doing this, the generation remains independent from other packages
                 */
                const importedSymbols = getImportedSymbols(realSourceFile);
                importedSymbols.forEach((moduleName, symbolName) => {
                    if (symbolName.startsWith('ɵ') || privateModules.has(moduleName)) {
                        return;
                    }
                    if (symbols.has(symbolName) && symbols.get(symbolName) !== moduleName) {
                        // If this ever throws, we need to improve the symbol extraction strategy
                        throw new Error(`Ambigous symbol \`${symbolName}\` exported by both ${symbols.get(symbolName)} & ${moduleName}`);
                    }
                    symbols.set(symbolName, moduleName);
                });
                // Set the source code references for the extracted entry.
                entry.source = {
                    filePath: getRelativeFilePath(realSourceFile, rootDir),
                    // Start & End are off by 1
                    startLine: ts.getLineAndCharacterOfPosition(realSourceFile, node.getStart()).line + 1,
                    endLine: ts.getLineAndCharacterOfPosition(realSourceFile, node.getEnd()).line + 1,
                };
                // The exported name of an API may be different from its declaration name, so
                // use the declaration name.
                entries.push({ ...entry, name: exportName });
            }
        }
        return { entries, symbols };
    }
    /** Extract the doc entry for a single declaration. */
    extractDeclaration(node) {
        // Ignore anonymous classes.
        if (checker.isNamedClassDeclaration(node)) {
            return extractClass(node, this.metadataReader, this.typeChecker);
        }
        if (isInitializerApiFunction(node, this.typeChecker)) {
            return extractInitializerApiFunction(node, this.typeChecker);
        }
        if (ts.isInterfaceDeclaration(node) && !isIgnoredInterface(node)) {
            return extractInterface(node, this.typeChecker);
        }
        if (ts.isFunctionDeclaration(node)) {
            // Name is guaranteed to be set, because it's exported directly.
            const functionExtractor = new FunctionExtractor(node.name.getText(), node, this.typeChecker);
            return functionExtractor.extract();
        }
        if (ts.isVariableDeclaration(node) && !isSyntheticAngularConstant(node)) {
            return isDecoratorDeclaration(node)
                ? extractorDecorator(node, this.typeChecker)
                : extractConstant(node, this.typeChecker);
        }
        if (ts.isTypeAliasDeclaration(node)) {
            return extractTypeAlias(node);
        }
        if (ts.isEnumDeclaration(node)) {
            return extractEnum(node, this.typeChecker);
        }
        return null;
    }
    /** Gets the list of exported declarations for doc extraction. */
    getExportedDeclarations(sourceFile) {
        // Use the reflection host to get all the exported declarations from this
        // source file entry point.
        const reflector = new checker.TypeScriptReflectionHost(this.typeChecker, false, true);
        const exportedDeclarationMap = reflector.getExportsOfModule(sourceFile);
        // Augment each declaration with the exported name in the public API.
        let exportedDeclarations = Array.from(exportedDeclarationMap?.entries() ?? []).map(([exportName, declaration]) => [exportName, declaration.node]);
        // Sort the declaration nodes into declaration position because their order is lost in
        // reading from the export map. This is primarily useful for testing and debugging.
        return exportedDeclarations.sort(([a, declarationA], [b, declarationB]) => declarationA.pos - declarationB.pos);
    }
}
/** Gets whether an interface should be ignored for docs extraction. */
function isIgnoredInterface(node) {
    // We filter out all interfaces that end with "Decorator" because we capture their
    // types as part of the main decorator entry (which are declared as constants).
    // This approach to dealing with decorators is admittedly fuzzy, but this aspect of
    // the framework's source code is unlikely to change. We also filter out the interfaces
    // that contain the decorator options.
    return node.name.getText().endsWith('Decorator') || isDecoratorOptionsInterface(node);
}
/**
 * Whether the doc entry should be ignored.
 *
 * Note: We cannot check whether a node is marked as docs private
 * before extraction because the extractor may find the attached
 * JSDoc tags on different AST nodes. For example, a variable declaration
 * never has JSDoc tags attached, but rather the parent variable statement.
 */
function isIgnoredDocEntry(entry) {
    const isDocsPrivate = entry.jsdocTags.find((e) => e.name === 'docsPrivate');
    if (isDocsPrivate !== undefined && isDocsPrivate.comment === '') {
        throw new Error(`Docs extraction: Entry "${entry.name}" is marked as ` +
            `"@docsPrivate" but without reasoning.`);
    }
    return isDocsPrivate !== undefined;
}
function getRelativeFilePath(sourceFile, rootDir) {
    const fullPath = sourceFile.fileName;
    const relativePath = fullPath.replace(rootDir, '');
    return relativePath;
}

/// <reference types="node" />
class FlatIndexGenerator {
    entryPoint;
    moduleName;
    flatIndexPath;
    shouldEmit = true;
    constructor(entryPoint, relativeFlatIndexPath, moduleName) {
        this.entryPoint = entryPoint;
        this.moduleName = moduleName;
        this.flatIndexPath =
            checker.join(checker.dirname(entryPoint), relativeFlatIndexPath).replace(/\.js$/, '') + '.ts';
    }
    makeTopLevelShim() {
        const relativeEntryPoint = relativePathBetween(this.flatIndexPath, this.entryPoint);
        const contents = `/**
 * Generated bundle index. Do not edit.
 */

export * from '${relativeEntryPoint}';
`;
        const genFile = ts.createSourceFile(this.flatIndexPath, contents, ts.ScriptTarget.ES2015, true, ts.ScriptKind.TS);
        if (this.moduleName !== null) {
            genFile.moduleName = this.moduleName;
        }
        return genFile;
    }
}

function findFlatIndexEntryPoint(rootFiles) {
    // There are two ways for a file to be recognized as the flat module index:
    // 1) if it's the only file!!!!!!
    // 2) (deprecated) if it's named 'index.ts' and has the shortest path of all such files.
    const tsFiles = rootFiles.filter((file) => checker.isNonDeclarationTsPath(file));
    let resolvedEntryPoint = null;
    if (tsFiles.length === 1) {
        // There's only one file - this is the flat module index.
        resolvedEntryPoint = tsFiles[0];
    }
    else {
        // In the event there's more than one TS file, one of them can still be selected as the
        // flat module index if it's named 'index.ts'. If there's more than one 'index.ts', the one
        // with the shortest path wins.
        //
        // This behavior is DEPRECATED and only exists to support existing usages.
        for (const tsFile of tsFiles) {
            if (checker.getFileSystem().basename(tsFile) === 'index.ts' &&
                (resolvedEntryPoint === null || tsFile.length <= resolvedEntryPoint.length)) {
                resolvedEntryPoint = tsFile;
            }
        }
    }
    return resolvedEntryPoint;
}

/**
 * Produce `ts.Diagnostic`s for classes that are visible from exported types (e.g. directives
 * exposed by exported `NgModule`s) that are not themselves exported.
 *
 * This function reconciles two concepts:
 *
 * A class is Exported if it's exported from the main library `entryPoint` file.
 * A class is Visible if, via Angular semantics, a downstream consumer can import an Exported class
 * and be affected by the class in question. For example, an Exported NgModule may expose a
 * directive class to its consumers. Consumers that import the NgModule may have the directive
 * applied to elements in their templates. In this case, the directive is considered Visible.
 *
 * `checkForPrivateExports` attempts to verify that all Visible classes are Exported, and report
 * `ts.Diagnostic`s for those that aren't.
 *
 * @param entryPoint `ts.SourceFile` of the library's entrypoint, which should export the library's
 * public API.
 * @param checker `ts.TypeChecker` for the current program.
 * @param refGraph `ReferenceGraph` tracking the visibility of Angular types.
 * @returns an array of `ts.Diagnostic`s representing errors when visible classes are not exported
 * properly.
 */
function checkForPrivateExports(entryPoint, checker$1, refGraph) {
    const diagnostics = [];
    // Firstly, compute the exports of the entry point. These are all the Exported classes.
    const topLevelExports = new Set();
    // Do this via `ts.TypeChecker.getExportsOfModule`.
    const moduleSymbol = checker$1.getSymbolAtLocation(entryPoint);
    if (moduleSymbol === undefined) {
        throw new Error(`Internal error: failed to get symbol for entrypoint`);
    }
    const exportedSymbols = checker$1.getExportsOfModule(moduleSymbol);
    // Loop through the exported symbols, de-alias if needed, and add them to `topLevelExports`.
    // TODO(alxhub): use proper iteration when build.sh is removed. (#27762)
    exportedSymbols.forEach((symbol) => {
        if (symbol.flags & ts.SymbolFlags.Alias) {
            symbol = checker$1.getAliasedSymbol(symbol);
        }
        const decl = symbol.valueDeclaration;
        if (decl !== undefined) {
            topLevelExports.add(decl);
        }
    });
    // Next, go through each exported class and expand it to the set of classes it makes Visible,
    // using the `ReferenceGraph`. For each Visible class, verify that it's also Exported, and queue
    // an error if it isn't. `checkedSet` ensures only one error is queued per class.
    const checkedSet = new Set();
    // Loop through each Exported class.
    // TODO(alxhub): use proper iteration when the legacy build is removed. (#27762)
    topLevelExports.forEach((mainExport) => {
        // Loop through each class made Visible by the Exported class.
        refGraph.transitiveReferencesOf(mainExport).forEach((transitiveReference) => {
            // Skip classes which have already been checked.
            if (checkedSet.has(transitiveReference)) {
                return;
            }
            checkedSet.add(transitiveReference);
            // Verify that the Visible class is also Exported.
            if (!topLevelExports.has(transitiveReference)) {
                // This is an error, `mainExport` makes `transitiveReference` Visible, but
                // `transitiveReference` is not Exported from the entrypoint. Construct a diagnostic to
                // give to the user explaining the situation.
                const descriptor = getDescriptorOfDeclaration(transitiveReference);
                const name = getNameOfDeclaration(transitiveReference);
                // Construct the path of visibility, from `mainExport` to `transitiveReference`.
                let visibleVia = 'NgModule exports';
                const transitivePath = refGraph.pathFrom(mainExport, transitiveReference);
                if (transitivePath !== null) {
                    visibleVia = transitivePath.map((seg) => getNameOfDeclaration(seg)).join(' -> ');
                }
                const diagnostic = {
                    category: ts.DiagnosticCategory.Error,
                    code: checker.ngErrorCode(checker.ErrorCode.SYMBOL_NOT_EXPORTED),
                    file: transitiveReference.getSourceFile(),
                    ...getPosOfDeclaration(transitiveReference),
                    messageText: `Unsupported private ${descriptor} ${name}. This ${descriptor} is visible to consumers via ${visibleVia}, but is not exported from the top-level library entrypoint.`,
                };
                diagnostics.push(diagnostic);
            }
        });
    });
    return diagnostics;
}
function getPosOfDeclaration(decl) {
    const node = getIdentifierOfDeclaration(decl) || decl;
    return {
        start: node.getStart(),
        length: node.getEnd() + 1 - node.getStart(),
    };
}
function getIdentifierOfDeclaration(decl) {
    if ((ts.isClassDeclaration(decl) ||
        ts.isVariableDeclaration(decl) ||
        ts.isFunctionDeclaration(decl)) &&
        decl.name !== undefined &&
        ts.isIdentifier(decl.name)) {
        return decl.name;
    }
    else {
        return null;
    }
}
function getNameOfDeclaration(decl) {
    const id = getIdentifierOfDeclaration(decl);
    return id !== null ? id.text : '(unnamed)';
}
function getDescriptorOfDeclaration(decl) {
    switch (decl.kind) {
        case ts.SyntaxKind.ClassDeclaration:
            return 'class';
        case ts.SyntaxKind.FunctionDeclaration:
            return 'function';
        case ts.SyntaxKind.VariableDeclaration:
            return 'variable';
        case ts.SyntaxKind.EnumDeclaration:
            return 'enum';
        default:
            return 'declaration';
    }
}

class ReferenceGraph {
    references = new Map();
    add(from, to) {
        if (!this.references.has(from)) {
            this.references.set(from, new Set());
        }
        this.references.get(from).add(to);
    }
    transitiveReferencesOf(target) {
        const set = new Set();
        this.collectTransitiveReferences(set, target);
        return set;
    }
    pathFrom(source, target) {
        return this.collectPathFrom(source, target, new Set());
    }
    collectPathFrom(source, target, seen) {
        if (source === target) {
            // Looking for a path from the target to itself - that path is just the target. This is the
            // "base case" of the search.
            return [target];
        }
        else if (seen.has(source)) {
            // The search has already looked through this source before.
            return null;
        }
        // Consider outgoing edges from `source`.
        seen.add(source);
        if (!this.references.has(source)) {
            // There are no outgoing edges from `source`.
            return null;
        }
        else {
            // Look through the outgoing edges of `source`.
            // TODO(alxhub): use proper iteration when the legacy build is removed. (#27762)
            let candidatePath = null;
            this.references.get(source).forEach((edge) => {
                // Early exit if a path has already been found.
                if (candidatePath !== null) {
                    return;
                }
                // Look for a path from this outgoing edge to `target`.
                const partialPath = this.collectPathFrom(edge, target, seen);
                if (partialPath !== null) {
                    // A path exists from `edge` to `target`. Insert `source` at the beginning.
                    candidatePath = [source, ...partialPath];
                }
            });
            return candidatePath;
        }
    }
    collectTransitiveReferences(set, decl) {
        if (this.references.has(decl)) {
            // TODO(alxhub): use proper iteration when the legacy build is removed. (#27762)
            this.references.get(decl).forEach((ref) => {
                if (!set.has(ref)) {
                    set.add(ref);
                    this.collectTransitiveReferences(set, ref);
                }
            });
        }
    }
}

/**
 * An implementation of the `DependencyTracker` dependency graph API.
 *
 * The `FileDependencyGraph`'s primary job is to determine whether a given file has "logically"
 * changed, given the set of physical changes (direct changes to files on disk).
 *
 * A file is logically changed if at least one of three conditions is met:
 *
 * 1. The file itself has physically changed.
 * 2. One of its dependencies has physically changed.
 * 3. One of its resource dependencies has physically changed.
 */
class FileDependencyGraph {
    nodes = new Map();
    addDependency(from, on) {
        this.nodeFor(from).dependsOn.add(checker.absoluteFromSourceFile(on));
    }
    addResourceDependency(from, resource) {
        this.nodeFor(from).usesResources.add(resource);
    }
    recordDependencyAnalysisFailure(file) {
        this.nodeFor(file).failedAnalysis = true;
    }
    getResourceDependencies(from) {
        const node = this.nodes.get(from);
        return node ? [...node.usesResources] : [];
    }
    /**
     * Update the current dependency graph from a previous one, incorporating a set of physical
     * changes.
     *
     * This method performs two tasks:
     *
     * 1. For files which have not logically changed, their dependencies from `previous` are added to
     *    `this` graph.
     * 2. For files which have logically changed, they're added to a set of logically changed files
     *    which is eventually returned.
     *
     * In essence, for build `n`, this method performs:
     *
     * G(n) + L(n) = G(n - 1) + P(n)
     *
     * where:
     *
     * G(n) = the dependency graph of build `n`
     * L(n) = the logically changed files from build n - 1 to build n.
     * P(n) = the physically changed files from build n - 1 to build n.
     */
    updateWithPhysicalChanges(previous, changedTsPaths, deletedTsPaths, changedResources) {
        const logicallyChanged = new Set();
        for (const sf of previous.nodes.keys()) {
            const sfPath = checker.absoluteFromSourceFile(sf);
            const node = previous.nodeFor(sf);
            if (isLogicallyChanged(sf, node, changedTsPaths, deletedTsPaths, changedResources)) {
                logicallyChanged.add(sfPath);
            }
            else if (!deletedTsPaths.has(sfPath)) {
                this.nodes.set(sf, {
                    dependsOn: new Set(node.dependsOn),
                    usesResources: new Set(node.usesResources),
                    failedAnalysis: false,
                });
            }
        }
        return logicallyChanged;
    }
    nodeFor(sf) {
        if (!this.nodes.has(sf)) {
            this.nodes.set(sf, {
                dependsOn: new Set(),
                usesResources: new Set(),
                failedAnalysis: false,
            });
        }
        return this.nodes.get(sf);
    }
}
/**
 * Determine whether `sf` has logically changed, given its dependencies and the set of physically
 * changed files and resources.
 */
function isLogicallyChanged(sf, node, changedTsPaths, deletedTsPaths, changedResources) {
    // A file is assumed to have logically changed if its dependencies could not be determined
    // accurately.
    if (node.failedAnalysis) {
        return true;
    }
    const sfPath = checker.absoluteFromSourceFile(sf);
    // A file is logically changed if it has physically changed itself (including being deleted).
    if (changedTsPaths.has(sfPath) || deletedTsPaths.has(sfPath)) {
        return true;
    }
    // A file is logically changed if one of its dependencies has physically changed.
    for (const dep of node.dependsOn) {
        if (changedTsPaths.has(dep) || deletedTsPaths.has(dep)) {
            return true;
        }
    }
    // A file is logically changed if one of its resources has physically changed.
    for (const dep of node.usesResources) {
        if (changedResources.has(dep)) {
            return true;
        }
    }
    return false;
}

/**
 * Discriminant of the `IncrementalState` union.
 */
var IncrementalStateKind;
(function (IncrementalStateKind) {
    IncrementalStateKind[IncrementalStateKind["Fresh"] = 0] = "Fresh";
    IncrementalStateKind[IncrementalStateKind["Delta"] = 1] = "Delta";
    IncrementalStateKind[IncrementalStateKind["Analyzed"] = 2] = "Analyzed";
})(IncrementalStateKind || (IncrementalStateKind = {}));

/**
 * Discriminant of the `Phase` type union.
 */
var PhaseKind;
(function (PhaseKind) {
    PhaseKind[PhaseKind["Analysis"] = 0] = "Analysis";
    PhaseKind[PhaseKind["TypeCheckAndEmit"] = 1] = "TypeCheckAndEmit";
})(PhaseKind || (PhaseKind = {}));
/**
 * Manages the incremental portion of an Angular compilation, allowing for reuse of a prior
 * compilation if available, and producing an output state for reuse of the current compilation in a
 * future one.
 */
class IncrementalCompilation {
    depGraph;
    versions;
    step;
    phase;
    /**
     * `IncrementalState` of this compilation if it were to be reused in a subsequent incremental
     * compilation at the current moment.
     *
     * Exposed via the `state` read-only getter.
     */
    _state;
    constructor(state, depGraph, versions, step) {
        this.depGraph = depGraph;
        this.versions = versions;
        this.step = step;
        this._state = state;
        // The compilation begins in analysis phase.
        this.phase = {
            kind: PhaseKind.Analysis,
            semanticDepGraphUpdater: new SemanticDepGraphUpdater(step !== null ? step.priorState.semanticDepGraph : null),
        };
    }
    /**
     * Begin a fresh `IncrementalCompilation`.
     */
    static fresh(program, versions) {
        const state = {
            kind: IncrementalStateKind.Fresh,
        };
        return new IncrementalCompilation(state, new FileDependencyGraph(), versions, /* reuse */ null);
    }
    static incremental(program, newVersions, oldProgram, oldState, modifiedResourceFiles, perf) {
        return perf.inPhase(checker.PerfPhase.Reconciliation, () => {
            const physicallyChangedTsFiles = new Set();
            const changedResourceFiles = new Set(modifiedResourceFiles ?? []);
            let priorAnalysis;
            switch (oldState.kind) {
                case IncrementalStateKind.Fresh:
                    // Since this line of program has never been successfully analyzed to begin with, treat
                    // this as a fresh compilation.
                    return IncrementalCompilation.fresh(program, newVersions);
                case IncrementalStateKind.Analyzed:
                    // The most recent program was analyzed successfully, so we can use that as our prior
                    // state and don't need to consider any other deltas except changes in the most recent
                    // program.
                    priorAnalysis = oldState;
                    break;
                case IncrementalStateKind.Delta:
                    // There is an ancestor program which was analyzed successfully and can be used as a
                    // starting point, but we need to determine what's changed since that program.
                    priorAnalysis = oldState.lastAnalyzedState;
                    for (const sfPath of oldState.physicallyChangedTsFiles) {
                        physicallyChangedTsFiles.add(sfPath);
                    }
                    for (const resourcePath of oldState.changedResourceFiles) {
                        changedResourceFiles.add(resourcePath);
                    }
                    break;
            }
            const oldVersions = priorAnalysis.versions;
            const oldFilesArray = oldProgram.getSourceFiles().map(toOriginalSourceFile);
            const oldFiles = new Set(oldFilesArray);
            const deletedTsFiles = new Set(oldFilesArray.map((sf) => checker.absoluteFromSourceFile(sf)));
            for (const possiblyRedirectedNewFile of program.getSourceFiles()) {
                const sf = toOriginalSourceFile(possiblyRedirectedNewFile);
                const sfPath = checker.absoluteFromSourceFile(sf);
                // Since we're seeing a file in the incoming program with this name, it can't have been
                // deleted.
                deletedTsFiles.delete(sfPath);
                if (oldFiles.has(sf)) {
                    // This source file has the same object identity as in the previous program. We need to
                    // determine if it's really the same file, or if it might have changed versions since the
                    // last program without changing its identity.
                    // If there's no version information available, then this is the same file, and we can
                    // skip it.
                    if (oldVersions === null || newVersions === null) {
                        continue;
                    }
                    // If a version is available for the file from both the prior and the current program, and
                    // that version is the same, then this is the same file, and we can skip it.
                    if (oldVersions.has(sfPath) &&
                        newVersions.has(sfPath) &&
                        oldVersions.get(sfPath) === newVersions.get(sfPath)) {
                        continue;
                    }
                    // Otherwise, assume that the file has changed. Either its versions didn't match, or we
                    // were missing version information about it on one side for some reason.
                }
                // Bail out if a .d.ts file changes - the semantic dep graph is not able to process such
                // changes correctly yet.
                if (sf.isDeclarationFile) {
                    return IncrementalCompilation.fresh(program, newVersions);
                }
                // The file has changed physically, so record it.
                physicallyChangedTsFiles.add(sfPath);
            }
            // Remove any files that have been deleted from the list of physical changes.
            for (const deletedFileName of deletedTsFiles) {
                physicallyChangedTsFiles.delete(checker.resolve(deletedFileName));
            }
            // Use the prior dependency graph to project physical changes into a set of logically changed
            // files.
            const depGraph = new FileDependencyGraph();
            const logicallyChangedTsFiles = depGraph.updateWithPhysicalChanges(priorAnalysis.depGraph, physicallyChangedTsFiles, deletedTsFiles, changedResourceFiles);
            // Physically changed files aren't necessarily counted as logically changed by the dependency
            // graph (files do not have edges to themselves), so add them to the logical changes
            // explicitly.
            for (const sfPath of physicallyChangedTsFiles) {
                logicallyChangedTsFiles.add(sfPath);
            }
            // Start off in a `DeltaIncrementalState` as a delta against the previous successful analysis,
            // until this compilation completes its own analysis.
            const state = {
                kind: IncrementalStateKind.Delta,
                physicallyChangedTsFiles,
                changedResourceFiles,
                lastAnalyzedState: priorAnalysis,
            };
            return new IncrementalCompilation(state, depGraph, newVersions, {
                priorState: priorAnalysis,
                logicallyChangedTsFiles,
            });
        });
    }
    get state() {
        return this._state;
    }
    get semanticDepGraphUpdater() {
        if (this.phase.kind !== PhaseKind.Analysis) {
            throw new Error(`AssertionError: Cannot update the SemanticDepGraph after analysis completes`);
        }
        return this.phase.semanticDepGraphUpdater;
    }
    recordSuccessfulAnalysis(traitCompiler) {
        if (this.phase.kind !== PhaseKind.Analysis) {
            throw new Error(`AssertionError: Incremental compilation in phase ${PhaseKind[this.phase.kind]}, expected Analysis`);
        }
        const { needsEmit, needsTypeCheckEmit, newGraph } = this.phase.semanticDepGraphUpdater.finalize();
        // Determine the set of files which have already been emitted.
        let emitted;
        if (this.step === null) {
            // Since there is no prior compilation, no files have yet been emitted.
            emitted = new Set();
        }
        else {
            // Begin with the files emitted by the prior successful compilation, but remove those which we
            // know need to bee re-emitted.
            emitted = new Set(this.step.priorState.emitted);
            // Files need re-emitted if they've logically changed.
            for (const sfPath of this.step.logicallyChangedTsFiles) {
                emitted.delete(sfPath);
            }
            // Files need re-emitted if they've semantically changed.
            for (const sfPath of needsEmit) {
                emitted.delete(sfPath);
            }
        }
        // Transition to a successfully analyzed compilation. At this point, a subsequent compilation
        // could use this state as a starting point.
        this._state = {
            kind: IncrementalStateKind.Analyzed,
            versions: this.versions,
            depGraph: this.depGraph,
            semanticDepGraph: newGraph,
            priorAnalysis: traitCompiler.getAnalyzedRecords(),
            typeCheckResults: null,
            emitted,
        };
        // We now enter the type-check and emit phase of compilation.
        this.phase = {
            kind: PhaseKind.TypeCheckAndEmit,
            needsEmit,
            needsTypeCheckEmit,
        };
    }
    recordSuccessfulTypeCheck(results) {
        if (this._state.kind !== IncrementalStateKind.Analyzed) {
            throw new Error(`AssertionError: Expected successfully analyzed compilation.`);
        }
        else if (this.phase.kind !== PhaseKind.TypeCheckAndEmit) {
            throw new Error(`AssertionError: Incremental compilation in phase ${PhaseKind[this.phase.kind]}, expected TypeCheck`);
        }
        this._state.typeCheckResults = results;
    }
    recordSuccessfulEmit(sf) {
        if (this._state.kind !== IncrementalStateKind.Analyzed) {
            throw new Error(`AssertionError: Expected successfully analyzed compilation.`);
        }
        this._state.emitted.add(checker.absoluteFromSourceFile(sf));
    }
    priorAnalysisFor(sf) {
        if (this.step === null) {
            return null;
        }
        const sfPath = checker.absoluteFromSourceFile(sf);
        // If the file has logically changed, its previous analysis cannot be reused.
        if (this.step.logicallyChangedTsFiles.has(sfPath)) {
            return null;
        }
        const priorAnalysis = this.step.priorState.priorAnalysis;
        if (!priorAnalysis.has(sf)) {
            return null;
        }
        return priorAnalysis.get(sf);
    }
    priorTypeCheckingResultsFor(sf) {
        if (this.phase.kind !== PhaseKind.TypeCheckAndEmit) {
            throw new Error(`AssertionError: Expected successfully analyzed compilation.`);
        }
        if (this.step === null) {
            return null;
        }
        const sfPath = checker.absoluteFromSourceFile(sf);
        // If the file has logically changed, or its template type-checking results have semantically
        // changed, then past type-checking results cannot be reused.
        if (this.step.logicallyChangedTsFiles.has(sfPath) ||
            this.phase.needsTypeCheckEmit.has(sfPath)) {
            return null;
        }
        // Past results also cannot be reused if they're not available.
        if (this.step.priorState.typeCheckResults === null ||
            !this.step.priorState.typeCheckResults.has(sfPath)) {
            return null;
        }
        const priorResults = this.step.priorState.typeCheckResults.get(sfPath);
        // If the past results relied on inlining, they're not safe for reuse.
        if (priorResults.hasInlines) {
            return null;
        }
        return priorResults;
    }
    safeToSkipEmit(sf) {
        // If this is a fresh compilation, it's never safe to skip an emit.
        if (this.step === null) {
            return false;
        }
        const sfPath = checker.absoluteFromSourceFile(sf);
        // If the file has itself logically changed, it must be emitted.
        if (this.step.logicallyChangedTsFiles.has(sfPath)) {
            return false;
        }
        if (this.phase.kind !== PhaseKind.TypeCheckAndEmit) {
            throw new Error(`AssertionError: Expected successful analysis before attempting to emit files`);
        }
        // If during analysis it was determined that this file has semantically changed, it must be
        // emitted.
        if (this.phase.needsEmit.has(sfPath)) {
            return false;
        }
        // Generally it should be safe to assume here that the file was previously emitted by the last
        // successful compilation. However, as a defense-in-depth against incorrectness, we explicitly
        // check that the last emit included this file, and re-emit it otherwise.
        return this.step.priorState.emitted.has(sfPath);
    }
}
/**
 * To accurately detect whether a source file was affected during an incremental rebuild, the
 * "original" source file needs to be consistently used.
 *
 * First, TypeScript may have created source file redirects when declaration files of the same
 * version of a library are included multiple times. The non-redirected source file should be used
 * to detect changes, as otherwise the redirected source files cause a mismatch when compared to
 * a prior program.
 *
 * Second, the program that is used for template type checking may contain mutated source files, if
 * inline type constructors or inline template type-check blocks had to be used. Such source files
 * store their original, non-mutated source file from the original program in a symbol. For
 * computing the affected files in an incremental build this original source file should be used, as
 * the mutated source file would always be considered affected.
 */
function toOriginalSourceFile(sf) {
    const unredirectedSf = checker.toUnredirectedSourceFile(sf);
    const originalFile = unredirectedSf[checker.NgOriginalFile];
    if (originalFile !== undefined) {
        return originalFile;
    }
    else {
        return unredirectedSf;
    }
}

/**
 * A noop implementation of `IncrementalBuildStrategy` which neither returns nor tracks any
 * incremental data.
 */
/**
 * Tracks an `IncrementalState` within the strategy itself.
 */
class TrackedIncrementalBuildStrategy {
    state = null;
    isSet = false;
    getIncrementalState() {
        return this.state;
    }
    setIncrementalState(state) {
        this.state = state;
        this.isSet = true;
    }
    toNextBuildStrategy() {
        const strategy = new TrackedIncrementalBuildStrategy();
        // Only reuse state that was explicitly set via `setIncrementalState`.
        strategy.state = this.isSet ? this.state : null;
        return strategy;
    }
}

/**
 * Describes the kind of identifier found in a template.
 */
var IdentifierKind;
(function (IdentifierKind) {
    IdentifierKind[IdentifierKind["Property"] = 0] = "Property";
    IdentifierKind[IdentifierKind["Method"] = 1] = "Method";
    IdentifierKind[IdentifierKind["Element"] = 2] = "Element";
    IdentifierKind[IdentifierKind["Template"] = 3] = "Template";
    IdentifierKind[IdentifierKind["Attribute"] = 4] = "Attribute";
    IdentifierKind[IdentifierKind["Reference"] = 5] = "Reference";
    IdentifierKind[IdentifierKind["Variable"] = 6] = "Variable";
    IdentifierKind[IdentifierKind["LetDeclaration"] = 7] = "LetDeclaration";
})(IdentifierKind || (IdentifierKind = {}));
/**
 * Describes the absolute byte offsets of a text anchor in a source code.
 */
class AbsoluteSourceSpan {
    start;
    end;
    constructor(start, end) {
        this.start = start;
        this.end = end;
    }
}

/**
 * A context for storing indexing information about components of a program.
 *
 * An `IndexingContext` collects component and template analysis information from
 * `DecoratorHandler`s and exposes them to be indexed.
 */
class IndexingContext {
    components = new Set();
    /**
     * Adds a component to the context.
     */
    addComponent(info) {
        this.components.add(info);
    }
}

/**
 * Visits the AST of an Angular template syntax expression, finding interesting
 * entities (variable references, etc.). Creates an array of Entities found in
 * the expression, with the location of the Entities being relative to the
 * expression.
 *
 * Visiting `text {{prop}}` will return
 * `[TopLevelIdentifier {name: 'prop', span: {start: 7, end: 11}}]`.
 */
class ExpressionVisitor extends checker.RecursiveAstVisitor {
    expressionStr;
    absoluteOffset;
    boundTemplate;
    targetToIdentifier;
    identifiers = [];
    errors = [];
    constructor(expressionStr, absoluteOffset, boundTemplate, targetToIdentifier) {
        super();
        this.expressionStr = expressionStr;
        this.absoluteOffset = absoluteOffset;
        this.boundTemplate = boundTemplate;
        this.targetToIdentifier = targetToIdentifier;
    }
    /**
     * Returns identifiers discovered in an expression.
     *
     * @param ast expression AST to visit
     * @param source expression AST source code
     * @param absoluteOffset absolute byte offset from start of the file to the start of the AST
     * source code.
     * @param boundTemplate bound target of the entire template, which can be used to query for the
     * entities expressions target.
     * @param targetToIdentifier closure converting a template target node to its identifier.
     */
    static getIdentifiers(ast, source, absoluteOffset, boundTemplate, targetToIdentifier) {
        const visitor = new ExpressionVisitor(source, absoluteOffset, boundTemplate, targetToIdentifier);
        visitor.visit(ast);
        return { identifiers: visitor.identifiers, errors: visitor.errors };
    }
    visit(ast) {
        ast.visit(this);
    }
    visitPropertyRead(ast, context) {
        this.visitIdentifier(ast, IdentifierKind.Property);
        super.visitPropertyRead(ast, context);
    }
    visitPropertyWrite(ast, context) {
        this.visitIdentifier(ast, IdentifierKind.Property);
        super.visitPropertyWrite(ast, context);
    }
    /**
     * Visits an identifier, adding it to the identifier store if it is useful for indexing.
     *
     * @param ast expression AST the identifier is in
     * @param kind identifier kind
     */
    visitIdentifier(ast, kind) {
        // The definition of a non-top-level property such as `bar` in `{{foo.bar}}` is currently
        // impossible to determine by an indexer and unsupported by the indexing module.
        // The indexing module also does not currently support references to identifiers declared in the
        // template itself, which have a non-null expression target.
        if (!(ast.receiver instanceof checker.ImplicitReceiver)) {
            return;
        }
        // The source span of the requested AST starts at a location that is offset from the expression.
        let identifierStart = ast.sourceSpan.start - this.absoluteOffset;
        if (ast instanceof checker.PropertyRead || ast instanceof checker.PropertyWrite) {
            // For `PropertyRead` and `PropertyWrite`, the identifier starts at the `nameSpan`, not
            // necessarily the `sourceSpan`.
            identifierStart = ast.nameSpan.start - this.absoluteOffset;
        }
        if (!this.expressionStr.substring(identifierStart).startsWith(ast.name)) {
            this.errors.push(new Error(`Impossible state: "${ast.name}" not found in "${this.expressionStr}" at location ${identifierStart}`));
            return;
        }
        // Join the relative position of the expression within a node with the absolute position
        // of the node to get the absolute position of the expression in the source code.
        const absoluteStart = this.absoluteOffset + identifierStart;
        const span = new AbsoluteSourceSpan(absoluteStart, absoluteStart + ast.name.length);
        const targetAst = this.boundTemplate.getExpressionTarget(ast);
        const target = targetAst ? this.targetToIdentifier(targetAst) : null;
        const identifier = {
            name: ast.name,
            span,
            kind,
            target,
        };
        this.identifiers.push(identifier);
    }
}
/**
 * Visits the AST of a parsed Angular template. Discovers and stores
 * identifiers of interest, deferring to an `ExpressionVisitor` as needed.
 */
let TemplateVisitor$1 = class TemplateVisitor extends checker.RecursiveVisitor$1 {
    boundTemplate;
    // Identifiers of interest found in the template.
    identifiers = new Set();
    errors = [];
    // Map of targets in a template to their identifiers.
    targetIdentifierCache = new Map();
    // Map of elements and templates to their identifiers.
    elementAndTemplateIdentifierCache = new Map();
    /**
     * Creates a template visitor for a bound template target. The bound target can be used when
     * deferred to the expression visitor to get information about the target of an expression.
     *
     * @param boundTemplate bound template target
     */
    constructor(boundTemplate) {
        super();
        this.boundTemplate = boundTemplate;
    }
    /**
     * Visits a node in the template.
     *
     * @param node node to visit
     */
    visit(node) {
        node.visit(this);
    }
    visitAll(nodes) {
        nodes.forEach((node) => this.visit(node));
    }
    /**
     * Add an identifier for an HTML element and visit its children recursively.
     *
     * @param element
     */
    visitElement(element) {
        const elementIdentifier = this.elementOrTemplateToIdentifier(element);
        if (elementIdentifier !== null) {
            this.identifiers.add(elementIdentifier);
        }
        this.visitAll(element.references);
        this.visitAll(element.inputs);
        this.visitAll(element.attributes);
        this.visitAll(element.children);
        this.visitAll(element.outputs);
    }
    visitTemplate(template) {
        const templateIdentifier = this.elementOrTemplateToIdentifier(template);
        if (templateIdentifier !== null) {
            this.identifiers.add(templateIdentifier);
        }
        this.visitAll(template.variables);
        this.visitAll(template.attributes);
        this.visitAll(template.templateAttrs);
        this.visitAll(template.children);
        this.visitAll(template.references);
    }
    visitBoundAttribute(attribute) {
        // If the bound attribute has no value, it cannot have any identifiers in the value expression.
        if (attribute.valueSpan === undefined) {
            return;
        }
        const { identifiers, errors } = ExpressionVisitor.getIdentifiers(attribute.value, attribute.valueSpan.toString(), attribute.valueSpan.start.offset, this.boundTemplate, this.targetToIdentifier.bind(this));
        identifiers.forEach((id) => this.identifiers.add(id));
        this.errors.push(...errors);
    }
    visitBoundEvent(attribute) {
        this.visitExpression(attribute.handler);
    }
    visitBoundText(text) {
        this.visitExpression(text.value);
    }
    visitReference(reference) {
        const referenceIdentifier = this.targetToIdentifier(reference);
        if (referenceIdentifier === null) {
            return;
        }
        this.identifiers.add(referenceIdentifier);
    }
    visitVariable(variable) {
        const variableIdentifier = this.targetToIdentifier(variable);
        if (variableIdentifier === null) {
            return;
        }
        this.identifiers.add(variableIdentifier);
    }
    visitDeferredBlock(deferred) {
        deferred.visitAll(this);
    }
    visitDeferredBlockPlaceholder(block) {
        this.visitAll(block.children);
    }
    visitDeferredBlockError(block) {
        this.visitAll(block.children);
    }
    visitDeferredBlockLoading(block) {
        this.visitAll(block.children);
    }
    visitDeferredTrigger(trigger) {
        if (trigger instanceof checker.BoundDeferredTrigger) {
            this.visitExpression(trigger.value);
        }
    }
    visitSwitchBlock(block) {
        this.visitExpression(block.expression);
        this.visitAll(block.cases);
    }
    visitSwitchBlockCase(block) {
        block.expression && this.visitExpression(block.expression);
        this.visitAll(block.children);
    }
    visitForLoopBlock(block) {
        block.item.visit(this);
        this.visitAll(block.contextVariables);
        this.visitExpression(block.expression);
        this.visitAll(block.children);
        block.empty?.visit(this);
    }
    visitForLoopBlockEmpty(block) {
        this.visitAll(block.children);
    }
    visitIfBlock(block) {
        this.visitAll(block.branches);
    }
    visitIfBlockBranch(block) {
        block.expression && this.visitExpression(block.expression);
        block.expressionAlias?.visit(this);
        this.visitAll(block.children);
    }
    visitLetDeclaration(decl) {
        const identifier = this.targetToIdentifier(decl);
        if (identifier !== null) {
            this.identifiers.add(identifier);
        }
        this.visitExpression(decl.value);
    }
    /** Creates an identifier for a template element or template node. */
    elementOrTemplateToIdentifier(node) {
        // If this node has already been seen, return the cached result.
        if (this.elementAndTemplateIdentifierCache.has(node)) {
            return this.elementAndTemplateIdentifierCache.get(node);
        }
        let name;
        let kind;
        if (node instanceof checker.Template) {
            name = node.tagName ?? 'ng-template';
            kind = IdentifierKind.Template;
        }
        else {
            name = node.name;
            kind = IdentifierKind.Element;
        }
        // Namespaced elements have a particular format for `node.name` that needs to be handled.
        // For example, an `<svg>` element has a `node.name` of `':svg:svg'`.
        // TODO(alxhub): properly handle namespaced elements
        if (name.startsWith(':')) {
            name = name.split(':').pop();
        }
        const sourceSpan = node.startSourceSpan;
        // An element's or template's source span can be of the form `<element>`, `<element />`, or
        // `<element></element>`. Only the selector is interesting to the indexer, so the source is
        // searched for the first occurrence of the element (selector) name.
        const start = this.getStartLocation(name, sourceSpan);
        if (start === null) {
            return null;
        }
        const absoluteSpan = new AbsoluteSourceSpan(start, start + name.length);
        // Record the nodes's attributes, which an indexer can later traverse to see if any of them
        // specify a used directive on the node.
        const attributes = node.attributes.map(({ name, sourceSpan }) => {
            return {
                name,
                span: new AbsoluteSourceSpan(sourceSpan.start.offset, sourceSpan.end.offset),
                kind: IdentifierKind.Attribute,
            };
        });
        const usedDirectives = this.boundTemplate.getDirectivesOfNode(node) || [];
        const identifier = {
            name,
            span: absoluteSpan,
            kind,
            attributes: new Set(attributes),
            usedDirectives: new Set(usedDirectives.map((dir) => {
                return {
                    node: dir.ref.node,
                    selector: dir.selector,
                };
            })),
            // cast b/c pre-TypeScript 3.5 unions aren't well discriminated
        };
        this.elementAndTemplateIdentifierCache.set(node, identifier);
        return identifier;
    }
    /** Creates an identifier for a template reference or template variable target. */
    targetToIdentifier(node) {
        // If this node has already been seen, return the cached result.
        if (this.targetIdentifierCache.has(node)) {
            return this.targetIdentifierCache.get(node);
        }
        const { name, sourceSpan } = node;
        const start = this.getStartLocation(name, sourceSpan);
        if (start === null) {
            return null;
        }
        const span = new AbsoluteSourceSpan(start, start + name.length);
        let identifier;
        if (node instanceof checker.Reference$1) {
            // If the node is a reference, we care about its target. The target can be an element, a
            // template, a directive applied on a template or element (in which case the directive field
            // is non-null), or nothing at all.
            const refTarget = this.boundTemplate.getReferenceTarget(node);
            let target = null;
            if (refTarget) {
                let node = null;
                let directive = null;
                if (refTarget instanceof checker.Element$1 || refTarget instanceof checker.Template) {
                    node = this.elementOrTemplateToIdentifier(refTarget);
                }
                else {
                    node = this.elementOrTemplateToIdentifier(refTarget.node);
                    directive = refTarget.directive.ref.node;
                }
                if (node === null) {
                    return null;
                }
                target = {
                    node,
                    directive,
                };
            }
            identifier = {
                name,
                span,
                kind: IdentifierKind.Reference,
                target,
            };
        }
        else if (node instanceof checker.Variable) {
            identifier = {
                name,
                span,
                kind: IdentifierKind.Variable,
            };
        }
        else {
            identifier = {
                name,
                span,
                kind: IdentifierKind.LetDeclaration,
            };
        }
        this.targetIdentifierCache.set(node, identifier);
        return identifier;
    }
    /** Gets the start location of a string in a SourceSpan */
    getStartLocation(name, context) {
        const localStr = context.toString();
        if (!localStr.includes(name)) {
            this.errors.push(new Error(`Impossible state: "${name}" not found in "${localStr}"`));
            return null;
        }
        return context.start.offset + localStr.indexOf(name);
    }
    /**
     * Visits a node's expression and adds its identifiers, if any, to the visitor's state.
     * Only ASTs with information about the expression source and its location are visited.
     *
     * @param node node whose expression to visit
     */
    visitExpression(ast) {
        // Only include ASTs that have information about their source and absolute source spans.
        if (ast instanceof checker.ASTWithSource && ast.source !== null) {
            // Make target to identifier mapping closure stateful to this visitor instance.
            const targetToIdentifier = this.targetToIdentifier.bind(this);
            const absoluteOffset = ast.sourceSpan.start;
            const { identifiers, errors } = ExpressionVisitor.getIdentifiers(ast, ast.source, absoluteOffset, this.boundTemplate, targetToIdentifier);
            identifiers.forEach((id) => this.identifiers.add(id));
            this.errors.push(...errors);
        }
    }
};
/**
 * Traverses a template AST and builds identifiers discovered in it.
 *
 * @param boundTemplate bound template target, which can be used for querying expression targets.
 * @return identifiers in template
 */
function getTemplateIdentifiers(boundTemplate) {
    const visitor = new TemplateVisitor$1(boundTemplate);
    if (boundTemplate.target.template !== undefined) {
        visitor.visitAll(boundTemplate.target.template);
    }
    return { identifiers: visitor.identifiers, errors: visitor.errors };
}

/**
 * Generates `IndexedComponent` entries from a `IndexingContext`, which has information
 * about components discovered in the program registered in it.
 *
 * The context must be populated before `generateAnalysis` is called.
 */
function generateAnalysis(context) {
    const analysis = new Map();
    context.components.forEach(({ declaration, selector, boundTemplate, templateMeta }) => {
        const name = declaration.name.getText();
        const usedComponents = new Set();
        const usedDirs = boundTemplate.getUsedDirectives();
        usedDirs.forEach((dir) => {
            if (dir.isComponent) {
                usedComponents.add(dir.ref.node);
            }
        });
        // Get source files for the component and the template. If the template is inline, its source
        // file is the component's.
        const componentFile = new checker.ParseSourceFile(declaration.getSourceFile().getFullText(), declaration.getSourceFile().fileName);
        let templateFile;
        if (templateMeta.isInline) {
            templateFile = componentFile;
        }
        else {
            templateFile = templateMeta.file;
        }
        const { identifiers, errors } = getTemplateIdentifiers(boundTemplate);
        analysis.set(declaration, {
            name,
            selector,
            file: componentFile,
            template: {
                identifiers,
                usedComponents,
                isInline: templateMeta.isInline,
                file: templateFile,
            },
            errors,
        });
    });
    return analysis;
}

/**
 * An index of all NgModules that export or re-export a given trait.
 */
class NgModuleIndexImpl {
    metaReader;
    localReader;
    constructor(metaReader, localReader) {
        this.metaReader = metaReader;
        this.localReader = localReader;
    }
    // A map from an NgModule's Class Declaration to the "main" reference to that module, aka the one
    // present in the reader metadata object
    ngModuleAuthoritativeReference = new Map();
    // A map from a Directive/Pipe's class declaration to the class declarations of all re-exporting
    // NgModules
    typeToExportingModules = new Map();
    indexed = false;
    updateWith(cache, key, elem) {
        if (cache.has(key)) {
            cache.get(key).add(elem);
        }
        else {
            const set = new Set();
            set.add(elem);
            cache.set(key, set);
        }
    }
    index() {
        const seenTypesWithReexports = new Map();
        const locallyDeclaredDirsAndNgModules = [
            ...this.localReader.getKnown(checker.MetaKind.NgModule),
            ...this.localReader.getKnown(checker.MetaKind.Directive),
        ];
        for (const decl of locallyDeclaredDirsAndNgModules) {
            // Here it's safe to create a new Reference because these are known local types.
            this.indexTrait(new checker.Reference(decl), seenTypesWithReexports);
        }
        this.indexed = true;
    }
    indexTrait(ref, seenTypesWithReexports) {
        if (seenTypesWithReexports.has(ref.node)) {
            // We've processed this type before.
            return;
        }
        seenTypesWithReexports.set(ref.node, new Set());
        const meta = this.metaReader.getDirectiveMetadata(ref) ?? this.metaReader.getNgModuleMetadata(ref);
        if (meta === null) {
            return;
        }
           // Component + NgModule: recurse into imports
        if (meta.imports !== null) {
            for (const childRef of meta.imports) {
                this.indexTrait(childRef, seenTypesWithReexports);
            }
        }
        if (meta.kind === checker.MetaKind.NgModule) {
            if (!this.ngModuleAuthoritativeReference.has(ref.node)) {
                this.ngModuleAuthoritativeReference.set(ref.node, ref);
            }
            for (const childRef of meta.exports) {
                this.indexTrait(childRef, seenTypesWithReexports);
                const childMeta = this.metaReader.getDirectiveMetadata(childRef) ??
                    this.metaReader.getPipeMetadata(childRef) ??
                    this.metaReader.getNgModuleMetadata(childRef);
                if (childMeta === null) {
                    continue;
                }
                switch (childMeta.kind) {
                    case checker.MetaKind.Directive:
                    case checker.MetaKind.Pipe:
                        this.updateWith(this.typeToExportingModules, childRef.node, ref.node);
                        this.updateWith(seenTypesWithReexports, ref.node, childRef.node);
                        break;
                    case checker.MetaKind.NgModule:
                        if (seenTypesWithReexports.has(childRef.node)) {
                            for (const reexported of seenTypesWithReexports.get(childRef.node)) {
                                this.updateWith(this.typeToExportingModules, reexported, ref.node);
                                this.updateWith(seenTypesWithReexports, ref.node, reexported);
                            }
                        }
                        break;
                }
            }
        }
    }
    getNgModulesExporting(directiveOrPipe) {
        if (!this.indexed) {
            this.index();
        }
        if (!this.typeToExportingModules.has(directiveOrPipe)) {
            return [];
        }
        const refs = [];
        for (const ngModule of this.typeToExportingModules.get(directiveOrPipe)) {
            if (this.ngModuleAuthoritativeReference.has(ngModule)) {
                refs.push(this.ngModuleAuthoritativeReference.get(ngModule));
            }
        }
        return refs;
    }
}

const CSS_PREPROCESSOR_EXT = /(\.scss|\.sass|\.less|\.styl)$/;
const RESOURCE_MARKER = '.$ngresource$';
const RESOURCE_MARKER_TS = RESOURCE_MARKER + '.ts';
/**
 * `ResourceLoader` which delegates to an `NgCompilerAdapter`'s resource loading methods.
 */
class AdapterResourceLoader {
    adapter;
    options;
    cache = new Map();
    fetching = new Map();
    lookupResolutionHost;
    canPreload;
    canPreprocess;
    constructor(adapter, options) {
        this.adapter = adapter;
        this.options = options;
        this.lookupResolutionHost = createLookupResolutionHost(this.adapter);
        this.canPreload = !!this.adapter.readResource;
        this.canPreprocess = !!this.adapter.transformResource;
    }
    /**
     * Resolve the url of a resource relative to the file that contains the reference to it.
     * The return value of this method can be used in the `load()` and `preload()` methods.
     *
     * Uses the provided CompilerHost if it supports mapping resources to filenames.
     * Otherwise, uses a fallback mechanism that searches the module resolution candidates.
     *
     * @param url The, possibly relative, url of the resource.
     * @param fromFile The path to the file that contains the URL of the resource.
     * @returns A resolved url of resource.
     * @throws An error if the resource cannot be resolved.
     */
    resolve(url, fromFile) {
        let resolvedUrl = null;
        if (this.adapter.resourceNameToFileName) {
            resolvedUrl = this.adapter.resourceNameToFileName(url, fromFile, (url, fromFile) => this.fallbackResolve(url, fromFile));
        }
        else {
            resolvedUrl = this.fallbackResolve(url, fromFile);
        }
        if (resolvedUrl === null) {
            throw new Error(`HostResourceResolver: could not resolve ${url} in context of ${fromFile})`);
        }
        return resolvedUrl;
    }
    /**
     * Preload the specified resource, asynchronously.
     *
     * Once the resource is loaded, its value is cached so it can be accessed synchronously via the
     * `load()` method.
     *
     * @param resolvedUrl The url (resolved by a call to `resolve()`) of the resource to preload.
     * @param context Information about the resource such as the type and containing file.
     * @returns A Promise that is resolved once the resource has been loaded or `undefined` if the
     * file has already been loaded.
     * @throws An Error if pre-loading is not available.
     */
    preload(resolvedUrl, context) {
        if (!this.adapter.readResource) {
            throw new Error('HostResourceLoader: the CompilerHost provided does not support pre-loading resources.');
        }
        if (this.cache.has(resolvedUrl)) {
            return undefined;
        }
        else if (this.fetching.has(resolvedUrl)) {
            return this.fetching.get(resolvedUrl);
        }
        let result = this.adapter.readResource(resolvedUrl);
        if (this.adapter.transformResource && context.type === 'style') {
            const resourceContext = {
                type: 'style',
                containingFile: context.containingFile,
                resourceFile: resolvedUrl,
                className: context.className,
            };
            result = Promise.resolve(result).then(async (str) => {
                const transformResult = await this.adapter.transformResource(str, resourceContext);
                return transformResult === null ? str : transformResult.content;
            });
        }
        if (typeof result === 'string') {
            this.cache.set(resolvedUrl, result);
            return undefined;
        }
        else {
            const fetchCompletion = result.then((str) => {
                this.fetching.delete(resolvedUrl);
                this.cache.set(resolvedUrl, str);
            });
            this.fetching.set(resolvedUrl, fetchCompletion);
            return fetchCompletion;
        }
    }
    /**
     * Preprocess the content data of an inline resource, asynchronously.
     *
     * @param data The existing content data from the inline resource.
     * @param context Information regarding the resource such as the type and containing file.
     * @returns A Promise that resolves to the processed data. If no processing occurs, the
     * same data string that was passed to the function will be resolved.
     */
    async preprocessInline(data, context) {
        if (!this.adapter.transformResource || context.type !== 'style') {
            return data;
        }
        const transformResult = await this.adapter.transformResource(data, {
            type: 'style',
            containingFile: context.containingFile,
            resourceFile: null,
            order: context.order,
            className: context.className,
        });
        if (transformResult === null) {
            return data;
        }
        return transformResult.content;
    }
    /**
     * Load the resource at the given url, synchronously.
     *
     * The contents of the resource may have been cached by a previous call to `preload()`.
     *
     * @param resolvedUrl The url (resolved by a call to `resolve()`) of the resource to load.
     * @returns The contents of the resource.
     */
    load(resolvedUrl) {
        if (this.cache.has(resolvedUrl)) {
            return this.cache.get(resolvedUrl);
        }
        const result = this.adapter.readResource
            ? this.adapter.readResource(resolvedUrl)
            : this.adapter.readFile(resolvedUrl);
        if (typeof result !== 'string') {
            throw new Error(`HostResourceLoader: loader(${resolvedUrl}) returned a Promise`);
        }
        this.cache.set(resolvedUrl, result);
        return result;
    }
    /**
     * Invalidate the entire resource cache.
     */
    invalidate() {
        this.cache.clear();
    }
    /**
     * Attempt to resolve `url` in the context of `fromFile`, while respecting the rootDirs
     * option from the tsconfig. First, normalize the file name.
     */
    fallbackResolve(url, fromFile) {
        let candidateLocations;
        if (url.startsWith('/')) {
            // This path is not really an absolute path, but instead the leading '/' means that it's
            // rooted in the project rootDirs. So look for it according to the rootDirs.
            candidateLocations = this.getRootedCandidateLocations(url);
        }
        else {
            // This path is a "relative" path and can be resolved as such. To make this easier on the
            // downstream resolver, the './' prefix is added if missing to distinguish these paths from
            // absolute node_modules paths.
            if (!url.startsWith('.')) {
                url = `./${url}`;
            }
            candidateLocations = this.getResolvedCandidateLocations(url, fromFile);
        }
        for (const candidate of candidateLocations) {
            if (this.adapter.fileExists(candidate)) {
                return candidate;
            }
            else if (CSS_PREPROCESSOR_EXT.test(candidate)) {
                /**
                 * If the user specified styleUrl points to *.scss, but the Sass compiler was run before
                 * Angular, then the resource may have been generated as *.css. Simply try the resolution
                 * again.
                 */
                const cssFallbackUrl = candidate.replace(CSS_PREPROCESSOR_EXT, '.css');
                if (this.adapter.fileExists(cssFallbackUrl)) {
                    return cssFallbackUrl;
                }
            }
        }
        return null;
    }
    getRootedCandidateLocations(url) {
        // The path already starts with '/', so add a '.' to make it relative.
        const segment = ('.' + url);
        return this.adapter.rootDirs.map((rootDir) => checker.join(rootDir, segment));
    }
    /**
     * TypeScript provides utilities to resolve module names, but not resource files (which aren't
     * a part of the ts.Program). However, TypeScript's module resolution can be used creatively
     * to locate where resource files should be expected to exist. Since module resolution returns
     * a list of file names that were considered, the loader can enumerate the possible locations
     * for the file by setting up a module resolution for it that will fail.
     */
    getResolvedCandidateLocations(url, fromFile) {
        const failedLookup = ts.resolveModuleName(url + RESOURCE_MARKER, fromFile, this.options, this.lookupResolutionHost);
        if (failedLookup.failedLookupLocations === undefined) {
            throw new Error(`Internal error: expected to find failedLookupLocations during resolution of resource '${url}' in context of ${fromFile}`);
        }
        return failedLookup.failedLookupLocations
            .filter((candidate) => candidate.endsWith(RESOURCE_MARKER_TS))
            .map((candidate) => candidate.slice(0, -RESOURCE_MARKER_TS.length));
    }
}
/**
 * Derives a `ts.ModuleResolutionHost` from a compiler adapter that recognizes the special resource
 * marker and does not go to the filesystem for these requests, as they are known not to exist.
 */
function createLookupResolutionHost(adapter) {
    return {
        directoryExists(directoryName) {
            if (directoryName.includes(RESOURCE_MARKER)) {
                return false;
            }
            else if (adapter.directoryExists !== undefined) {
                return adapter.directoryExists(directoryName);
            }
            else {
                // TypeScript's module resolution logic assumes that the directory exists when no host
                // implementation is available.
                return true;
            }
        },
        fileExists(fileName) {
            if (fileName.includes(RESOURCE_MARKER)) {
                return false;
            }
            else {
                return adapter.fileExists(fileName);
            }
        },
        readFile: adapter.readFile.bind(adapter),
        getCurrentDirectory: adapter.getCurrentDirectory.bind(adapter),
        getDirectories: adapter.getDirectories?.bind(adapter),
        realpath: adapter.realpath?.bind(adapter),
        trace: adapter.trace?.bind(adapter),
        useCaseSensitiveFileNames: typeof adapter.useCaseSensitiveFileNames === 'function'
            ? adapter.useCaseSensitiveFileNames.bind(adapter)
            : adapter.useCaseSensitiveFileNames,
    };
}

/**
 * Computes scopes for standalone components based on their `imports`, expanding imported NgModule
 * scopes where necessary.
 */
class StandaloneComponentScopeReader {
    metaReader;
    localModuleReader;
    dtsModuleReader;
    cache = new Map();
    constructor(metaReader, localModuleReader, dtsModuleReader) {
        this.metaReader = metaReader;
        this.localModuleReader = localModuleReader;
        this.dtsModuleReader = dtsModuleReader;
    }
    getScopeForComponent(clazz) {
        if (!this.cache.has(clazz)) {
            const clazzRef = new checker.Reference(clazz);
            const clazzMeta = this.metaReader.getDirectiveMetadata(clazzRef);
            if (clazzMeta === null || !clazzMeta.isComponent || !clazzMeta.isStandalone) {
                this.cache.set(clazz, null);
                return null;
            }
            // A standalone component always has itself in scope, so add `clazzMeta` during
            // initialization.
            const dependencies = new Set([clazzMeta]);
            const deferredDependencies = new Set();
            const seen = new Set([clazz]);
            let isPoisoned = clazzMeta.isPoisoned;
            if (clazzMeta.imports !== null) {
                for (const ref of clazzMeta.imports) {
                    if (seen.has(ref.node)) {
                        continue;
                    }
                    seen.add(ref.node);
                    const dirMeta = this.metaReader.getDirectiveMetadata(ref);
                    if (dirMeta !== null) {
                        dependencies.add({ ...dirMeta, ref });
                        isPoisoned = isPoisoned || dirMeta.isPoisoned || !dirMeta.isStandalone;
                        continue;
                    }
                    const pipeMeta = this.metaReader.getPipeMetadata(ref);
                    if (pipeMeta !== null) {
                        dependencies.add({ ...pipeMeta, ref });
                        isPoisoned = isPoisoned || !pipeMeta.isStandalone;
                        continue;
                    }
                    const ngModuleMeta = this.metaReader.getNgModuleMetadata(ref);
                    if (ngModuleMeta !== null) {
                        dependencies.add({ ...ngModuleMeta, ref });
                        let ngModuleScope;
                        if (ref.node.getSourceFile().isDeclarationFile) {
                            ngModuleScope = this.dtsModuleReader.resolve(ref);
                        }
                        else {
                            ngModuleScope = this.localModuleReader.getScopeOfModule(ref.node);
                        }
                        if (ngModuleScope === null) {
                            // This technically shouldn't happen, but mark the scope as poisoned just in case.
                            isPoisoned = true;
                            continue;
                        }
                        isPoisoned = isPoisoned || ngModuleScope.exported.isPoisoned;
                        for (const dep of ngModuleScope.exported.dependencies) {
                            if (!seen.has(dep.ref.node)) {
                                seen.add(dep.ref.node);
                                dependencies.add(dep);
                            }
                        }
                        continue;
                    }
                    // Import was not a component/directive/pipe/NgModule, which is an error and poisons the
                    // scope.
                    isPoisoned = true;
                }
            }
            if (clazzMeta.deferredImports !== null) {
                for (const ref of clazzMeta.deferredImports) {
                    const dirMeta = this.metaReader.getDirectiveMetadata(ref);
                    if (dirMeta !== null) {
                        deferredDependencies.add({ ...dirMeta, ref, isExplicitlyDeferred: true });
                        isPoisoned = isPoisoned || dirMeta.isPoisoned || !dirMeta.isStandalone;
                        continue;
                    }
                    const pipeMeta = this.metaReader.getPipeMetadata(ref);
                    if (pipeMeta !== null) {
                        deferredDependencies.add({ ...pipeMeta, ref, isExplicitlyDeferred: true });
                        isPoisoned = isPoisoned || !pipeMeta.isStandalone;
                        continue;
                    }
                }
            }
            this.cache.set(clazz, {
                kind: checker.ComponentScopeKind.Standalone,
                component: clazz,
                dependencies: Array.from(dependencies),
                deferredDependencies: Array.from(deferredDependencies),
                isPoisoned,
                schemas: clazzMeta.schemas ?? [],
            });
        }
        return this.cache.get(clazz);
    }
    getRemoteScope() {
        return null;
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/** Names of known signal functions. */
const SIGNAL_FNS = new Set([
    'WritableSignal',
    'Signal',
    'InputSignal',
    'InputSignalWithTransform',
    'ModelSignal',
]);
/** Returns whether a symbol is a reference to a signal. */
function isSignalReference(symbol) {
    return ((symbol.kind === checker.SymbolKind.Expression ||
        symbol.kind === checker.SymbolKind.Variable ||
        symbol.kind === checker.SymbolKind.LetDeclaration) &&
        // Note that `tsType.symbol` isn't optional in the typings,
        // but it appears that it can be undefined at runtime.
        ((symbol.tsType.symbol !== undefined && isSignalSymbol(symbol.tsType.symbol)) ||
            (symbol.tsType.aliasSymbol !== undefined && isSignalSymbol(symbol.tsType.aliasSymbol))));
}
/** Checks whether a symbol points to a signal. */
function isSignalSymbol(symbol) {
    const declarations = symbol.getDeclarations();
    return (declarations !== undefined &&
        declarations.some((decl) => {
            const fileName = decl.getSourceFile().fileName;
            return ((ts.isInterfaceDeclaration(decl) || ts.isTypeAliasDeclaration(decl)) &&
                SIGNAL_FNS.has(decl.name.text) &&
                (fileName.includes('@angular/core') || fileName.includes('angular2/rc/packages/core')));
        }));
}

/**
 * This abstract class provides a base implementation for the run method.
 */
class TemplateCheckWithVisitor {
    /**
     * When extended diagnostics were first introduced, the visitor wasn't implemented correctly
     * which meant that it wasn't visiting the `templateAttrs` of structural directives (e.g.
     * the expression of `*ngIf`). Fixing the issue causes a lot of internal breakages and will likely
     * need to be done in a major version to avoid external breakages. This flag is used to opt out
     * pre-existing diagnostics from the correct behavior until the breakages have been fixed while
     * ensuring that newly-written diagnostics are correct from the beginning.
     * TODO(crisbeto): remove this flag and fix the internal brekages.
     */
    canVisitStructuralAttributes = true;
    /**
     * Base implementation for run function, visits all nodes in template and calls
     * `visitNode()` for each one.
     */
    run(ctx, component, template) {
        const visitor = new TemplateVisitor(ctx, component, this);
        return visitor.getDiagnostics(template);
    }
}
/**
 * Visits all nodes in a template (TmplAstNode and AST) and calls `visitNode` for each one.
 */
class TemplateVisitor extends checker.RecursiveAstVisitor {
    ctx;
    component;
    check;
    diagnostics = [];
    constructor(ctx, component, check) {
        super();
        this.ctx = ctx;
        this.component = component;
        this.check = check;
    }
    visit(node, context) {
        this.diagnostics.push(...this.check.visitNode(this.ctx, this.component, node));
        node.visit(this);
    }
    visitAllNodes(nodes) {
        for (const node of nodes) {
            this.visit(node);
        }
    }
    visitAst(ast) {
        if (ast instanceof checker.ASTWithSource) {
            ast = ast.ast;
        }
        this.visit(ast);
    }
    visitElement(element) {
        this.visitAllNodes(element.attributes);
        this.visitAllNodes(element.inputs);
        this.visitAllNodes(element.outputs);
        this.visitAllNodes(element.references);
        this.visitAllNodes(element.children);
    }
    visitTemplate(template) {
        const isInlineTemplate = template.tagName === 'ng-template';
        this.visitAllNodes(template.attributes);
        if (isInlineTemplate) {
            // Only visit input/outputs if this isn't an inline template node generated for a structural
            // directive (like `<div *ngIf></div>`). These nodes would be visited when the underlying
            // element of an inline template node is processed.
            this.visitAllNodes(template.inputs);
            this.visitAllNodes(template.outputs);
        }
        // TODO(crisbeto): remove this condition when deleting `canVisitStructuralAttributes`.
        if (this.check.canVisitStructuralAttributes || isInlineTemplate) {
            // `templateAttrs` aren't transferred over to the inner element so we always have to visit them.
            this.visitAllNodes(template.templateAttrs);
        }
        this.visitAllNodes(template.variables);
        this.visitAllNodes(template.references);
        this.visitAllNodes(template.children);
    }
    visitContent(content) {
        this.visitAllNodes(content.children);
    }
    visitVariable(variable) { }
    visitReference(reference) { }
    visitTextAttribute(attribute) { }
    visitUnknownBlock(block) { }
    visitBoundAttribute(attribute) {
        this.visitAst(attribute.value);
    }
    visitBoundEvent(attribute) {
        this.visitAst(attribute.handler);
    }
    visitText(text) { }
    visitBoundText(text) {
        this.visitAst(text.value);
    }
    visitIcu(icu) {
        Object.keys(icu.vars).forEach((key) => this.visit(icu.vars[key]));
        Object.keys(icu.placeholders).forEach((key) => this.visit(icu.placeholders[key]));
    }
    visitDeferredBlock(deferred) {
        deferred.visitAll(this);
    }
    visitDeferredTrigger(trigger) {
        if (trigger instanceof checker.BoundDeferredTrigger) {
            this.visitAst(trigger.value);
        }
    }
    visitDeferredBlockPlaceholder(block) {
        this.visitAllNodes(block.children);
    }
    visitDeferredBlockError(block) {
        this.visitAllNodes(block.children);
    }
    visitDeferredBlockLoading(block) {
        this.visitAllNodes(block.children);
    }
    visitSwitchBlock(block) {
        this.visitAst(block.expression);
        this.visitAllNodes(block.cases);
    }
    visitSwitchBlockCase(block) {
        block.expression && this.visitAst(block.expression);
        this.visitAllNodes(block.children);
    }
    visitForLoopBlock(block) {
        block.item.visit(this);
        this.visitAllNodes(block.contextVariables);
        this.visitAst(block.expression);
        this.visitAllNodes(block.children);
        block.empty?.visit(this);
    }
    visitForLoopBlockEmpty(block) {
        this.visitAllNodes(block.children);
    }
    visitIfBlock(block) {
        this.visitAllNodes(block.branches);
    }
    visitIfBlockBranch(block) {
        block.expression && this.visitAst(block.expression);
        block.expressionAlias?.visit(this);
        this.visitAllNodes(block.children);
    }
    visitLetDeclaration(decl) {
        this.visitAst(decl.value);
    }
    getDiagnostics(template) {
        this.diagnostics = [];
        this.visitAllNodes(template);
        return this.diagnostics;
    }
}

/** Names of known signal instance properties. */
const SIGNAL_INSTANCE_PROPERTIES = new Set(['set', 'update', 'asReadonly']);
/**
 * Names of known function instance properties.
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function#instance_properties
 */
const FUNCTION_INSTANCE_PROPERTIES = new Set(['name', 'length', 'prototype']);
/**
 * Ensures Signals are invoked when used in template interpolations.
 */
class InterpolatedSignalCheck extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.INTERPOLATED_SIGNAL_NOT_INVOKED;
    visitNode(ctx, component, node) {
        // interpolations like `{{ mySignal }}`
        if (node instanceof checker.Interpolation) {
            return node.expressions
                .filter((item) => item instanceof checker.PropertyRead)
                .flatMap((item) => buildDiagnosticForSignal(ctx, item, component));
        }
        // bound properties like `[prop]="mySignal"`
        else if (node instanceof checker.BoundAttribute) {
            // we skip the check if the node is an input binding
            const usedDirectives = ctx.templateTypeChecker.getUsedDirectives(component);
            if (usedDirectives !== null &&
                usedDirectives.some((dir) => dir.inputs.getByBindingPropertyName(node.name) !== null)) {
                return [];
            }
            // otherwise, we check if the node is
            if (
            // a bound property like `[prop]="mySignal"`
            (node.type === checker.BindingType.Property ||
                // or a class binding like `[class.myClass]="mySignal"`
                node.type === checker.BindingType.Class ||
                // or a style binding like `[style.width]="mySignal"`
                node.type === checker.BindingType.Style ||
                // or an attribute binding like `[attr.role]="mySignal"`
                node.type === checker.BindingType.Attribute ||
                // or an animation binding like `[@myAnimation]="mySignal"`
                node.type === checker.BindingType.Animation) &&
                node.value instanceof checker.ASTWithSource &&
                node.value.ast instanceof checker.PropertyRead) {
                return buildDiagnosticForSignal(ctx, node.value.ast, component);
            }
        }
        return [];
    }
}
function isFunctionInstanceProperty(name) {
    return FUNCTION_INSTANCE_PROPERTIES.has(name);
}
function isSignalInstanceProperty(name) {
    return SIGNAL_INSTANCE_PROPERTIES.has(name);
}
function buildDiagnosticForSignal(ctx, node, component) {
    // check for `{{ mySignal }}`
    const symbol = ctx.templateTypeChecker.getSymbolOfNode(node, component);
    if (symbol !== null && symbol.kind === checker.SymbolKind.Expression && isSignalReference(symbol)) {
        const templateMapping = ctx.templateTypeChecker.getSourceMappingAtTcbLocation(symbol.tcbLocation);
        const errorString = `${node.name} is a function and should be invoked: ${node.name}()`;
        const diagnostic = ctx.makeTemplateDiagnostic(templateMapping.span, errorString);
        return [diagnostic];
    }
    // check for `{{ mySignal.name }}` or `{{ mySignal.length }}` or `{{ mySignal.prototype }}`
    // as these are the names of instance properties of Function, the compiler does _not_ throw an
    // error.
    // We also check for `{{ mySignal.set }}` or `{{ mySignal.update }}` or
    // `{{ mySignal.asReadonly }}` as these are the names of instance properties of Signal
    const symbolOfReceiver = ctx.templateTypeChecker.getSymbolOfNode(node.receiver, component);
    if ((isFunctionInstanceProperty(node.name) || isSignalInstanceProperty(node.name)) &&
        symbolOfReceiver !== null &&
        symbolOfReceiver.kind === checker.SymbolKind.Expression &&
        isSignalReference(symbolOfReceiver)) {
        const templateMapping = ctx.templateTypeChecker.getSourceMappingAtTcbLocation(symbolOfReceiver.tcbLocation);
        const errorString = `${node.receiver.name} is a function and should be invoked: ${node.receiver.name}()`;
        const diagnostic = ctx.makeTemplateDiagnostic(templateMapping.span, errorString);
        return [diagnostic];
    }
    return [];
}
const factory$a = {
    code: checker.ErrorCode.INTERPOLATED_SIGNAL_NOT_INVOKED,
    name: checker.ExtendedTemplateDiagnosticName.INTERPOLATED_SIGNAL_NOT_INVOKED,
    create: () => new InterpolatedSignalCheck(),
};

/**
 * Ensures the two-way binding syntax is correct.
 * Parentheses should be inside the brackets "[()]".
 * Will return diagnostic information when "([])" is found.
 */
class InvalidBananaInBoxCheck extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.INVALID_BANANA_IN_BOX;
    visitNode(ctx, component, node) {
        if (!(node instanceof checker.BoundEvent))
            return [];
        const name = node.name;
        if (!name.startsWith('[') || !name.endsWith(']'))
            return [];
        const boundSyntax = node.sourceSpan.toString();
        const expectedBoundSyntax = boundSyntax.replace(`(${name})`, `[(${name.slice(1, -1)})]`);
        const diagnostic = ctx.makeTemplateDiagnostic(node.sourceSpan, `In the two-way binding syntax the parentheses should be inside the brackets, ex. '${expectedBoundSyntax}'.
        Find more at https://angular.dev/guide/templates/two-way-binding`);
        return [diagnostic];
    }
}
const factory$9 = {
    code: checker.ErrorCode.INVALID_BANANA_IN_BOX,
    name: checker.ExtendedTemplateDiagnosticName.INVALID_BANANA_IN_BOX,
    create: () => new InvalidBananaInBoxCheck(),
};

/**
 * The list of known control flow directives present in the `CommonModule`,
 * and their corresponding imports.
 *
 * Note: there is no `ngSwitch` here since it's typically used as a regular
 * binding (e.g. `[ngSwitch]`), however the `ngSwitchCase` and `ngSwitchDefault`
 * are used as structural directives and a warning would be generated. Once the
 * `CommonModule` is included, the `ngSwitch` would also be covered.
 */
const KNOWN_CONTROL_FLOW_DIRECTIVES = new Map([
    ['ngIf', { directive: 'NgIf', builtIn: '@if' }],
    ['ngFor', { directive: 'NgFor', builtIn: '@for' }],
    ['ngSwitchCase', { directive: 'NgSwitchCase', builtIn: '@switch with @case' }],
    ['ngSwitchDefault', { directive: 'NgSwitchDefault', builtIn: '@switch with @default' }],
]);
/**
 * Ensures that there are no known control flow directives (such as *ngIf and *ngFor)
 * used in a template of a *standalone* component without importing a `CommonModule`. Returns
 * diagnostics in case such a directive is detected.
 *
 * Note: this check only handles the cases when structural directive syntax is used (e.g. `*ngIf`).
 * Regular binding syntax (e.g. `[ngIf]`) is handled separately in type checker and treated as a
 * hard error instead of a warning.
 */
class MissingControlFlowDirectiveCheck extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.MISSING_CONTROL_FLOW_DIRECTIVE;
    run(ctx, component, template) {
        const componentMetadata = ctx.templateTypeChecker.getDirectiveMetadata(component);
        // Avoid running this check for non-standalone components.
        if (!componentMetadata || !componentMetadata.isStandalone) {
            return [];
        }
        return super.run(ctx, component, template);
    }
    visitNode(ctx, component, node) {
        if (!(node instanceof checker.Template))
            return [];
        const controlFlowAttr = node.templateAttrs.find((attr) => KNOWN_CONTROL_FLOW_DIRECTIVES.has(attr.name));
        if (!controlFlowAttr)
            return [];
        const symbol = ctx.templateTypeChecker.getSymbolOfNode(node, component);
        if (symbol === null || symbol.directives.length > 0) {
            return [];
        }
        const sourceSpan = controlFlowAttr.keySpan || controlFlowAttr.sourceSpan;
        const directiveAndBuiltIn = KNOWN_CONTROL_FLOW_DIRECTIVES.get(controlFlowAttr.name);
        const errorMessage = `The \`*${controlFlowAttr.name}\` directive was used in the template, ` +
            `but neither the \`${directiveAndBuiltIn?.directive}\` directive nor the \`CommonModule\` was imported. ` +
            `Use Angular's built-in control flow ${directiveAndBuiltIn?.builtIn} or ` +
            `make sure that either the \`${directiveAndBuiltIn?.directive}\` directive or the \`CommonModule\` ` +
            `is included in the \`@Component.imports\` array of this component.`;
        const diagnostic = ctx.makeTemplateDiagnostic(sourceSpan, errorMessage);
        return [diagnostic];
    }
}
const factory$8 = {
    code: checker.ErrorCode.MISSING_CONTROL_FLOW_DIRECTIVE,
    name: checker.ExtendedTemplateDiagnosticName.MISSING_CONTROL_FLOW_DIRECTIVE,
    create: (options) => {
        return new MissingControlFlowDirectiveCheck();
    },
};

/**
 * Ensures a user doesn't forget to omit `let` when using ngfor.
 * Will return diagnostic information when `let` is missing.
 */
class MissingNgForOfLetCheck extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.MISSING_NGFOROF_LET;
    visitNode(ctx, component, node) {
        if (!(node instanceof checker.Template)) {
            return [];
        }
        if (node.templateAttrs.length === 0) {
            return [];
        }
        const attr = node.templateAttrs.find((x) => x.name === 'ngFor');
        if (attr === undefined) {
            return [];
        }
        if (node.variables.length > 0) {
            return [];
        }
        const errorString = 'Your ngFor is missing a value. Did you forget to add the `let` keyword?';
        const diagnostic = ctx.makeTemplateDiagnostic(attr.sourceSpan, errorString);
        return [diagnostic];
    }
}
const factory$7 = {
    code: checker.ErrorCode.MISSING_NGFOROF_LET,
    name: checker.ExtendedTemplateDiagnosticName.MISSING_NGFOROF_LET,
    create: () => new MissingNgForOfLetCheck(),
};

/**
 * Ensures the left side of a nullish coalescing operation is nullable.
 * Returns diagnostics for the cases where the operator is useless.
 * This check should only be use if `strictNullChecks` is enabled,
 * otherwise it would produce inaccurate results.
 */
class NullishCoalescingNotNullableCheck extends TemplateCheckWithVisitor {
    canVisitStructuralAttributes = false;
    code = checker.ErrorCode.NULLISH_COALESCING_NOT_NULLABLE;
    visitNode(ctx, component, node) {
        if (!(node instanceof checker.Binary) || node.operation !== '??')
            return [];
        const symbolLeft = ctx.templateTypeChecker.getSymbolOfNode(node.left, component);
        if (symbolLeft === null || symbolLeft.kind !== checker.SymbolKind.Expression) {
            return [];
        }
        const typeLeft = symbolLeft.tsType;
        if (typeLeft.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
            // We should not make assumptions about the any and unknown types; using a nullish coalescing
            // operator is acceptable for those.
            return [];
        }
        // If the left operand's type is different from its non-nullable self, then it must
        // contain a null or undefined so this nullish coalescing operator is useful. No diagnostic to
        // report.
        if (typeLeft.getNonNullableType() !== typeLeft)
            return [];
        const symbol = ctx.templateTypeChecker.getSymbolOfNode(node, component);
        if (symbol.kind !== checker.SymbolKind.Expression) {
            return [];
        }
        const templateMapping = ctx.templateTypeChecker.getSourceMappingAtTcbLocation(symbol.tcbLocation);
        if (templateMapping === null) {
            return [];
        }
        const diagnostic = ctx.makeTemplateDiagnostic(templateMapping.span, `The left side of this nullish coalescing operation does not include 'null' or 'undefined' in its type, therefore the '??' operator can be safely removed.`);
        return [diagnostic];
    }
}
const factory$6 = {
    code: checker.ErrorCode.NULLISH_COALESCING_NOT_NULLABLE,
    name: checker.ExtendedTemplateDiagnosticName.NULLISH_COALESCING_NOT_NULLABLE,
    create: (options) => {
        // Require `strictNullChecks` to be enabled.
        const strictNullChecks = options.strictNullChecks === undefined ? !!options.strict : !!options.strictNullChecks;
        if (!strictNullChecks) {
            return null;
        }
        return new NullishCoalescingNotNullableCheck();
    },
};

/**
 * Ensures the left side of an optional chain operation is nullable.
 * Returns diagnostics for the cases where the operator is useless.
 * This check should only be use if `strictNullChecks` is enabled,
 * otherwise it would produce inaccurate results.
 */
class OptionalChainNotNullableCheck extends TemplateCheckWithVisitor {
    canVisitStructuralAttributes = false;
    code = checker.ErrorCode.OPTIONAL_CHAIN_NOT_NULLABLE;
    visitNode(ctx, component, node) {
        if (!(node instanceof checker.SafeCall) &&
            !(node instanceof checker.SafePropertyRead) &&
            !(node instanceof checker.SafeKeyedRead))
            return [];
        const symbolLeft = ctx.templateTypeChecker.getSymbolOfNode(node.receiver, component);
        if (symbolLeft === null || symbolLeft.kind !== checker.SymbolKind.Expression) {
            return [];
        }
        const typeLeft = symbolLeft.tsType;
        if (typeLeft.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
            // We should not make assumptions about the any and unknown types; using a nullish coalescing
            // operator is acceptable for those.
            return [];
        }
        // If the left operand's type is different from its non-nullable self, then it must
        // contain a null or undefined so this nullish coalescing operator is useful. No diagnostic to
        // report.
        if (typeLeft.getNonNullableType() !== typeLeft)
            return [];
        const symbol = ctx.templateTypeChecker.getSymbolOfNode(node, component);
        if (symbol.kind !== checker.SymbolKind.Expression) {
            return [];
        }
        const templateMapping = ctx.templateTypeChecker.getSourceMappingAtTcbLocation(symbol.tcbLocation);
        if (templateMapping === null) {
            return [];
        }
        const advice = node instanceof checker.SafePropertyRead
            ? `the '?.' operator can be replaced with the '.' operator`
            : `the '?.' operator can be safely removed`;
        const diagnostic = ctx.makeTemplateDiagnostic(templateMapping.span, `The left side of this optional chain operation does not include 'null' or 'undefined' in its type, therefore ${advice}.`);
        return [diagnostic];
    }
}
const factory$5 = {
    code: checker.ErrorCode.OPTIONAL_CHAIN_NOT_NULLABLE,
    name: checker.ExtendedTemplateDiagnosticName.OPTIONAL_CHAIN_NOT_NULLABLE,
    create: (options) => {
        // Require `strictNullChecks` to be enabled.
        const strictNullChecks = options.strictNullChecks === undefined ? !!options.strict : !!options.strictNullChecks;
        if (!strictNullChecks) {
            return null;
        }
        return new OptionalChainNotNullableCheck();
    },
};

const STYLE_SUFFIXES = ['px', '%', 'em'];
/**
 * A check which detects when the `.px`, `.%`, and `.em` suffixes are used with an attribute
 * binding. These suffixes are only available for style bindings.
 */
class SuffixNotSupportedCheck extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.SUFFIX_NOT_SUPPORTED;
    visitNode(ctx, component, node) {
        if (!(node instanceof checker.BoundAttribute))
            return [];
        if (!node.keySpan.toString().startsWith('attr.') ||
            !STYLE_SUFFIXES.some((suffix) => node.name.endsWith(`.${suffix}`))) {
            return [];
        }
        const diagnostic = ctx.makeTemplateDiagnostic(node.keySpan, `The ${STYLE_SUFFIXES.map((suffix) => `'.${suffix}'`).join(', ')} suffixes are only supported on style bindings.`);
        return [diagnostic];
    }
}
const factory$4 = {
    code: checker.ErrorCode.SUFFIX_NOT_SUPPORTED,
    name: checker.ExtendedTemplateDiagnosticName.SUFFIX_NOT_SUPPORTED,
    create: () => new SuffixNotSupportedCheck(),
};

/**
 * Ensures that attributes that have the "special" angular binding prefix (attr., style., and
 * class.) are interpreted as bindings. For example, `<div attr.id="my-id"></div>` will not
 * interpret this as an `AttributeBinding` to `id` but rather just a `TmplAstTextAttribute`. This
 * is likely not the intent of the developer. Instead, the intent is likely to have the `id` be set
 * to 'my-id'.
 */
class TextAttributeNotBindingSpec extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.TEXT_ATTRIBUTE_NOT_BINDING;
    visitNode(ctx, component, node) {
        if (!(node instanceof checker.TextAttribute))
            return [];
        const name = node.name;
        if (!name.startsWith('attr.') && !name.startsWith('style.') && !name.startsWith('class.')) {
            return [];
        }
        let errorString;
        if (name.startsWith('attr.')) {
            const staticAttr = name.replace('attr.', '');
            errorString = `Static attributes should be written without the 'attr.' prefix.`;
            if (node.value) {
                errorString += ` For example, ${staticAttr}="${node.value}".`;
            }
        }
        else {
            const expectedKey = `[${name}]`;
            const expectedValue = 
            // true/false are special cases because we don't want to convert them to strings but
            // rather maintain the logical true/false when bound.
            node.value === 'true' || node.value === 'false' ? node.value : `'${node.value}'`;
            errorString = 'Attribute, style, and class bindings should be enclosed with square braces.';
            if (node.value) {
                errorString += ` For example, '${expectedKey}="${expectedValue}"'.`;
            }
        }
        const diagnostic = ctx.makeTemplateDiagnostic(node.sourceSpan, errorString);
        return [diagnostic];
    }
}
const factory$3 = {
    code: checker.ErrorCode.TEXT_ATTRIBUTE_NOT_BINDING,
    name: checker.ExtendedTemplateDiagnosticName.TEXT_ATTRIBUTE_NOT_BINDING,
    create: () => new TextAttributeNotBindingSpec(),
};

/**
 * Ensures that function in event bindings are called. For example, `<button (click)="myFunc"></button>`
 * will not call `myFunc` when the button is clicked. Instead, it should be `<button (click)="myFunc()"></button>`.
 * This is likely not the intent of the developer. Instead, the intent is likely to call `myFunc`.
 */
class UninvokedFunctionInEventBindingSpec extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.UNINVOKED_FUNCTION_IN_EVENT_BINDING;
    visitNode(ctx, component, node) {
        // If the node is not a bound event, skip it.
        if (!(node instanceof checker.BoundEvent))
            return [];
        // If the node is not a regular or animation event, skip it.
        if (node.type !== checker.ParsedEventType.Regular && node.type !== checker.ParsedEventType.Animation)
            return [];
        if (!(node.handler instanceof checker.ASTWithSource))
            return [];
        const sourceExpressionText = node.handler.source || '';
        if (node.handler.ast instanceof checker.Chain) {
            // (click)="increment; decrement"
            return node.handler.ast.expressions.flatMap((expression) => assertExpressionInvoked(expression, component, node, sourceExpressionText, ctx));
        }
        if (node.handler.ast instanceof checker.Conditional) {
            // (click)="true ? increment : decrement"
            const { trueExp, falseExp } = node.handler.ast;
            return [trueExp, falseExp].flatMap((expression) => assertExpressionInvoked(expression, component, node, sourceExpressionText, ctx));
        }
        // (click)="increment"
        return assertExpressionInvoked(node.handler.ast, component, node, sourceExpressionText, ctx);
    }
}
/**
 * Asserts that the expression is invoked.
 * If the expression is a property read, and it has a call signature, a diagnostic is generated.
 */
function assertExpressionInvoked(expression, component, node, expressionText, ctx) {
    if (expression instanceof checker.Call || expression instanceof checker.SafeCall) {
        return []; // If the method is called, skip it.
    }
    if (!(expression instanceof checker.PropertyRead) && !(expression instanceof checker.SafePropertyRead)) {
        return []; // If the expression is not a property read, skip it.
    }
    const symbol = ctx.templateTypeChecker.getSymbolOfNode(expression, component);
    if (symbol !== null && symbol.kind === checker.SymbolKind.Expression) {
        if (symbol.tsType.getCallSignatures()?.length > 0) {
            const fullExpressionText = generateStringFromExpression(expression, expressionText);
            const errorString = `Function in event binding should be invoked: ${fullExpressionText}()`;
            return [ctx.makeTemplateDiagnostic(node.sourceSpan, errorString)];
        }
    }
    return [];
}
function generateStringFromExpression(expression, source) {
    return source.substring(expression.span.start, expression.span.end);
}
const factory$2 = {
    code: checker.ErrorCode.UNINVOKED_FUNCTION_IN_EVENT_BINDING,
    name: checker.ExtendedTemplateDiagnosticName.UNINVOKED_FUNCTION_IN_EVENT_BINDING,
    create: () => new UninvokedFunctionInEventBindingSpec(),
};

/**
 * Ensures that all `@let` declarations in a template are used.
 */
class UnusedLetDeclarationCheck extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.UNUSED_LET_DECLARATION;
    analysis = new Map();
    run(ctx, component, template) {
        super.run(ctx, component, template);
        const diagnostics = [];
        const { allLetDeclarations, usedLetDeclarations } = this.getAnalysis(component);
        for (const decl of allLetDeclarations) {
            if (!usedLetDeclarations.has(decl)) {
                diagnostics.push(ctx.makeTemplateDiagnostic(decl.sourceSpan, `@let ${decl.name} is declared but its value is never read.`));
            }
        }
        this.analysis.clear();
        return diagnostics;
    }
    visitNode(ctx, component, node) {
        if (node instanceof checker.LetDeclaration) {
            this.getAnalysis(component).allLetDeclarations.add(node);
        }
        else if (node instanceof checker.AST) {
            const unwrappedNode = node instanceof checker.ASTWithSource ? node.ast : node;
            const target = ctx.templateTypeChecker.getExpressionTarget(unwrappedNode, component);
            if (target !== null && target instanceof checker.LetDeclaration) {
                this.getAnalysis(component).usedLetDeclarations.add(target);
            }
        }
        return [];
    }
    getAnalysis(node) {
        if (!this.analysis.has(node)) {
            this.analysis.set(node, { allLetDeclarations: new Set(), usedLetDeclarations: new Set() });
        }
        return this.analysis.get(node);
    }
}
const factory$1 = {
    code: checker.ErrorCode.UNUSED_LET_DECLARATION,
    name: checker.ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION,
    create: () => new UnusedLetDeclarationCheck(),
};

const NG_SKIP_HYDRATION_ATTR_NAME = 'ngSkipHydration';
/**
 * Ensures that the special attribute `ngSkipHydration` is not a binding and has no other
 * value than `"true"` or an empty value.
 */
class NgSkipHydrationSpec extends TemplateCheckWithVisitor {
    code = checker.ErrorCode.SKIP_HYDRATION_NOT_STATIC;
    visitNode(ctx, component, node) {
        /** Binding should always error */
        if (node instanceof checker.BoundAttribute && node.name === NG_SKIP_HYDRATION_ATTR_NAME) {
            const errorString = `ngSkipHydration should not be used as a binding.`;
            const diagnostic = ctx.makeTemplateDiagnostic(node.sourceSpan, errorString);
            return [diagnostic];
        }
        /** No value, empty string or `"true"` are the only valid values */
        const acceptedValues = ['true', '' /* empty string */];
        if (node instanceof checker.TextAttribute &&
            node.name === NG_SKIP_HYDRATION_ATTR_NAME &&
            !acceptedValues.includes(node.value) &&
            node.value !== undefined) {
            const errorString = `ngSkipHydration only accepts "true" or "" as value or no value at all. For example 'ngSkipHydration="true"' or 'ngSkipHydration'`;
            const diagnostic = ctx.makeTemplateDiagnostic(node.sourceSpan, errorString);
            return [diagnostic];
        }
        return [];
    }
}
const factory = {
    code: checker.ErrorCode.SKIP_HYDRATION_NOT_STATIC,
    name: checker.ExtendedTemplateDiagnosticName.SKIP_HYDRATION_NOT_STATIC,
    create: () => new NgSkipHydrationSpec(),
};

/**
 * A label referring to a `ts.DiagnosticCategory` or `'suppress'`, meaning the associated diagnostic
 * should not be displayed at all.
 *
 * @publicApi
 */
exports.DiagnosticCategoryLabel = void 0;
(function (DiagnosticCategoryLabel) {
    /** Treat the diagnostic as a warning, don't fail the compilation. */
    DiagnosticCategoryLabel["Warning"] = "warning";
    /** Treat the diagnostic as a hard error, fail the compilation. */
    DiagnosticCategoryLabel["Error"] = "error";
    /** Ignore the diagnostic altogether. */
    DiagnosticCategoryLabel["Suppress"] = "suppress";
})(exports.DiagnosticCategoryLabel || (exports.DiagnosticCategoryLabel = {}));

class ExtendedTemplateCheckerImpl {
    partialCtx;
    templateChecks;
    constructor(templateTypeChecker, typeChecker, templateCheckFactories, options) {
        this.partialCtx = { templateTypeChecker, typeChecker };
        this.templateChecks = new Map();
        for (const factory of templateCheckFactories) {
            // Read the diagnostic category from compiler options.
            const category = diagnosticLabelToCategory(options?.extendedDiagnostics?.checks?.[factory.name] ??
                options?.extendedDiagnostics?.defaultCategory ??
                exports.DiagnosticCategoryLabel.Warning);
            // Skip the diagnostic if suppressed via compiler options.
            if (category === null) {
                continue;
            }
            // Try to create the check.
            const check = factory.create(options);
            // Skip the diagnostic if it was disabled due to unsupported options. For example, this can
            // happen if the check requires `strictNullChecks: true` but that flag is disabled in compiler
            // options.
            if (check === null) {
                continue;
            }
            // Use the check.
            this.templateChecks.set(check, category);
        }
    }
    getDiagnosticsForComponent(component) {
        const template = this.partialCtx.templateTypeChecker.getTemplate(component);
        // Skip checks if component has no template. This can happen if the user writes a
        // `@Component()` but doesn't add the template, could happen in the language service
        // when users are in the middle of typing code.
        if (template === null) {
            return [];
        }
        const diagnostics = [];
        for (const [check, category] of this.templateChecks.entries()) {
            const ctx = {
                ...this.partialCtx,
                // Wrap `templateTypeChecker.makeTemplateDiagnostic()` to implicitly provide all the known
                // options.
                makeTemplateDiagnostic: (span, message, relatedInformation) => {
                    return this.partialCtx.templateTypeChecker.makeTemplateDiagnostic(component, span, category, check.code, message, relatedInformation);
                },
            };
            diagnostics.push(...check.run(ctx, component, template));
        }
        return diagnostics;
    }
}
/**
 * Converts a `DiagnosticCategoryLabel` to its equivalent `ts.DiagnosticCategory` or `null` if
 * the label is `DiagnosticCategoryLabel.Suppress`.
 */
function diagnosticLabelToCategory(label) {
    switch (label) {
        case exports.DiagnosticCategoryLabel.Warning:
            return ts.DiagnosticCategory.Warning;
        case exports.DiagnosticCategoryLabel.Error:
            return ts.DiagnosticCategory.Error;
        case exports.DiagnosticCategoryLabel.Suppress:
            return null;
        default:
            return assertNever(label);
    }
}
function assertNever(value) {
    throw new Error(`Unexpected call to 'assertNever()' with value:\n${value}`);
}

const ALL_DIAGNOSTIC_FACTORIES = [
    factory$9,
    factory$6,
    factory$5,
    factory$8,
    factory$3,
    factory$7,
    factory$4,
    factory$a,
    factory$2,
    factory$1,
    factory,
];
const SUPPORTED_DIAGNOSTIC_NAMES = new Set([
    checker.ExtendedTemplateDiagnosticName.CONTROL_FLOW_PREVENTING_CONTENT_PROJECTION,
    checker.ExtendedTemplateDiagnosticName.UNUSED_STANDALONE_IMPORTS,
    ...ALL_DIAGNOSTIC_FACTORIES.map((factory) => factory.name),
]);

class TemplateSemanticsCheckerImpl {
    templateTypeChecker;
    constructor(templateTypeChecker) {
        this.templateTypeChecker = templateTypeChecker;
    }
    getDiagnosticsForComponent(component) {
        const template = this.templateTypeChecker.getTemplate(component);
        return template !== null
            ? TemplateSemanticsVisitor.visit(template, component, this.templateTypeChecker)
            : [];
    }
}
/** Visitor that verifies the semantics of a template. */
class TemplateSemanticsVisitor extends checker.RecursiveVisitor$1 {
    expressionVisitor;
    constructor(expressionVisitor) {
        super();
        this.expressionVisitor = expressionVisitor;
    }
    static visit(nodes, component, templateTypeChecker) {
        const diagnostics = [];
        const expressionVisitor = new ExpressionsSemanticsVisitor(templateTypeChecker, component, diagnostics);
        const templateVisitor = new TemplateSemanticsVisitor(expressionVisitor);
        nodes.forEach((node) => node.visit(templateVisitor));
        return diagnostics;
    }
    visitBoundEvent(event) {
        super.visitBoundEvent(event);
        event.handler.visit(this.expressionVisitor, event);
    }
}
/** Visitor that verifies the semantics of the expressions within a template. */
class ExpressionsSemanticsVisitor extends checker.RecursiveAstVisitor {
    templateTypeChecker;
    component;
    diagnostics;
    constructor(templateTypeChecker, component, diagnostics) {
        super();
        this.templateTypeChecker = templateTypeChecker;
        this.component = component;
        this.diagnostics = diagnostics;
    }
    visitPropertyWrite(ast, context) {
        super.visitPropertyWrite(ast, context);
        this.checkForIllegalWriteInEventBinding(ast, context);
    }
    visitPropertyRead(ast, context) {
        super.visitPropertyRead(ast, context);
        this.checkForIllegalWriteInTwoWayBinding(ast, context);
    }
    checkForIllegalWriteInEventBinding(ast, context) {
        if (!(context instanceof checker.BoundEvent) || !(ast.receiver instanceof checker.ImplicitReceiver)) {
            return;
        }
        const target = this.templateTypeChecker.getExpressionTarget(ast, this.component);
        if (target instanceof checker.Variable) {
            const errorMessage = `Cannot use variable '${target.name}' as the left-hand side of an assignment expression. Template variables are read-only.`;
            this.diagnostics.push(this.makeIllegalTemplateVarDiagnostic(target, context, errorMessage));
        }
    }
    checkForIllegalWriteInTwoWayBinding(ast, context) {
        // Only check top-level property reads inside two-way bindings for illegal assignments.
        if (!(context instanceof checker.BoundEvent) ||
            context.type !== checker.ParsedEventType.TwoWay ||
            !(ast.receiver instanceof checker.ImplicitReceiver) ||
            ast !== unwrapAstWithSource(context.handler)) {
            return;
        }
        const target = this.templateTypeChecker.getExpressionTarget(ast, this.component);
        const isVariable = target instanceof checker.Variable;
        const isLet = target instanceof checker.LetDeclaration;
        if (!isVariable && !isLet) {
            return;
        }
        // Two-way bindings to template variables are only allowed if the variables are signals.
        const symbol = this.templateTypeChecker.getSymbolOfNode(target, this.component);
        if (symbol !== null && !isSignalReference(symbol)) {
            let errorMessage;
            if (isVariable) {
                errorMessage = `Cannot use a non-signal variable '${target.name}' in a two-way binding expression. Template variables are read-only.`;
            }
            else {
                errorMessage = `Cannot use non-signal @let declaration '${target.name}' in a two-way binding expression. @let declarations are read-only.`;
            }
            this.diagnostics.push(this.makeIllegalTemplateVarDiagnostic(target, context, errorMessage));
        }
    }
    makeIllegalTemplateVarDiagnostic(target, expressionNode, errorMessage) {
        const span = target instanceof checker.Variable ? target.valueSpan || target.sourceSpan : target.sourceSpan;
        return this.templateTypeChecker.makeTemplateDiagnostic(this.component, expressionNode.handlerSpan, ts.DiagnosticCategory.Error, checker.ngErrorCode(checker.ErrorCode.WRITE_TO_READ_ONLY_VARIABLE), errorMessage, [
            {
                text: `'${target.name}' is declared here.`,
                start: span.start.offset,
                end: span.end.offset,
                sourceFile: this.component.getSourceFile(),
            },
        ]);
    }
}
function unwrapAstWithSource(ast) {
    return ast instanceof checker.ASTWithSource ? ast.ast : ast;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/** APIs whose usages should be checked by the rule. */
const APIS_TO_CHECK = [
    checker.INPUT_INITIALIZER_FN,
    checker.MODEL_INITIALIZER_FN,
    ...checker.OUTPUT_INITIALIZER_FNS,
    ...checker.QUERY_INITIALIZER_FNS,
];
/**
 * Rule that flags any initializer APIs that are used outside of an initializer.
 */
class InitializerApiUsageRule {
    reflector;
    importedSymbolsTracker;
    constructor(reflector, importedSymbolsTracker) {
        this.reflector = reflector;
        this.importedSymbolsTracker = importedSymbolsTracker;
    }
    shouldCheck(sourceFile) {
        // Skip the traversal if there are no imports of the initializer APIs.
        return APIS_TO_CHECK.some(({ functionName, owningModule }) => {
            return (this.importedSymbolsTracker.hasNamedImport(sourceFile, functionName, owningModule) ||
                this.importedSymbolsTracker.hasNamespaceImport(sourceFile, owningModule));
        });
    }
    checkNode(node) {
        // We only care about call expressions.
        if (!ts.isCallExpression(node)) {
            return null;
        }
        // Unwrap any parenthesized and `as` expressions since they don't affect the runtime behavior.
        while (node.parent &&
            (ts.isParenthesizedExpression(node.parent) || ts.isAsExpression(node.parent))) {
            node = node.parent;
        }
        if (!node.parent || !ts.isCallExpression(node)) {
            return null;
        }
        const identifiedInitializer = checker.tryParseInitializerApi(APIS_TO_CHECK, node, this.reflector, this.importedSymbolsTracker);
        if (identifiedInitializer === null) {
            return null;
        }
        const functionName = identifiedInitializer.api.functionName +
            (identifiedInitializer.isRequired ? '.required' : '');
        if (ts.isPropertyDeclaration(node.parent) && node.parent.initializer === node) {
            let closestClass = node.parent;
            while (closestClass && !ts.isClassDeclaration(closestClass)) {
                closestClass = closestClass.parent;
            }
            if (closestClass && ts.isClassDeclaration(closestClass)) {
                const decorators = this.reflector.getDecoratorsOfDeclaration(closestClass);
                const isComponentOrDirective = decorators !== null &&
                    decorators.some((decorator) => {
                        return (decorator.import?.from === '@angular/core' &&
                            (decorator.name === 'Component' || decorator.name === 'Directive'));
                    });
                return isComponentOrDirective
                    ? null
                    : checker.makeDiagnostic(checker.ErrorCode.UNSUPPORTED_INITIALIZER_API_USAGE, node, `Unsupported call to the ${functionName} function. This function can only be used as the initializer ` +
                        `of a property on a @Component or @Directive class.`);
            }
        }
        return checker.makeDiagnostic(checker.ErrorCode.UNSUPPORTED_INITIALIZER_API_USAGE, node, `Unsupported call to the ${functionName} function. This function can only be called in the initializer of a class member.`);
    }
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Rule that flags unused symbols inside of the `imports` array of a component.
 */
class UnusedStandaloneImportsRule {
    templateTypeChecker;
    typeCheckingConfig;
    importedSymbolsTracker;
    constructor(templateTypeChecker, typeCheckingConfig, importedSymbolsTracker) {
        this.templateTypeChecker = templateTypeChecker;
        this.typeCheckingConfig = typeCheckingConfig;
        this.importedSymbolsTracker = importedSymbolsTracker;
    }
    shouldCheck(sourceFile) {
        return (this.typeCheckingConfig.unusedStandaloneImports !== 'suppress' &&
            (this.importedSymbolsTracker.hasNamedImport(sourceFile, 'Component', '@angular/core') ||
                this.importedSymbolsTracker.hasNamespaceImport(sourceFile, '@angular/core')));
    }
    checkNode(node) {
        if (!ts.isClassDeclaration(node)) {
            return null;
        }
        const metadata = this.templateTypeChecker.getDirectiveMetadata(node);
        if (!metadata ||
            !metadata.isStandalone ||
            metadata.rawImports === null ||
            metadata.imports === null ||
            metadata.imports.length === 0) {
            return null;
        }
        const usedDirectives = this.templateTypeChecker.getUsedDirectives(node);
        const usedPipes = this.templateTypeChecker.getUsedPipes(node);
        // These will be null if the component is invalid for some reason.
        if (!usedDirectives || !usedPipes) {
            return null;
        }
        const unused = this.getUnusedSymbols(metadata, new Set(usedDirectives.map((dir) => dir.ref.node)), new Set(usedPipes));
        if (unused === null) {
            return null;
        }
        const propertyAssignment = closestNode(metadata.rawImports, ts.isPropertyAssignment);
        const category = this.typeCheckingConfig.unusedStandaloneImports === 'error'
            ? ts.DiagnosticCategory.Error
            : ts.DiagnosticCategory.Warning;
        if (unused.length === metadata.imports.length && propertyAssignment !== null) {
            return checker.makeDiagnostic(checker.ErrorCode.UNUSED_STANDALONE_IMPORTS, propertyAssignment.name, 'All imports are unused', undefined, category);
        }
        return unused.map((ref) => {
            const diagnosticNode = ref.getIdentityInExpression(metadata.rawImports) ||
                ref.getIdentityIn(node.getSourceFile()) ||
                metadata.rawImports;
            return checker.makeDiagnostic(checker.ErrorCode.UNUSED_STANDALONE_IMPORTS, diagnosticNode, `${ref.node.name.text} is not used within the template of ${metadata.name}`, undefined, category);
        });
    }
    getUnusedSymbols(metadata, usedDirectives, usedPipes) {
        const { imports, rawImports } = metadata;
        if (imports === null || rawImports === null) {
            return null;
        }
        let unused = null;
        for (const current of imports) {
            const currentNode = current.node;
            const dirMeta = this.templateTypeChecker.getDirectiveMetadata(currentNode);
            if (dirMeta !== null) {
                if (dirMeta.isStandalone &&
                    !usedDirectives.has(currentNode) &&
                    !this.isPotentialSharedReference(current, rawImports)) {
                    unused ??= [];
                    unused.push(current);
                }
                continue;
            }
            const pipeM   eta = this.templateTypeChecker.getPipeMetadata(currentNode);
            if (pipeMeta !== null &&
                pipeMeta.isStandalone &&
                !usedPipes.has(pipeMeta.name) &&
                !this.isPotentialSharedReference(current, rawImports)) {
                unused ??= [];
                unused.push(current);
            }
        }
        return unused;
    }
    /**
     * Determines if an import reference *might* be coming from a shared imports array.
     * @param reference Reference to be checked.
     * @param rawImports AST node that defines the `imports` array.
     */
    isPotentialSharedReference(reference, rawImports) {
        // If the reference is defined directly in the `imports` array, it cannot be shared.
        if (reference.getIdentityInExpression(rawImports) !== null) {
            return false;
        }
        // The reference might be shared if it comes from an exported array. If the variable is local
        /// to the file, then it likely isn't shared. Note that this has the potential for false
        // positives if a non-exported array of imports is shared between components in the same
        // file. This scenario is unlikely and even if we report the diagnostic for it, it would be
        // okay since the user only has to refactor components within the same file, rather than the
        // entire application.
        let current = reference.getIdentityIn(rawImports.getSourceFile());
        while (current !== null) {
            if (ts.isVariableStatement(current)) {
                return !!current.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
            }
            // `Node.parent` can be undefined, but the TS types don't reflect it.
            // Coerce to null so the value is consitent with the type.
            current = current.parent ?? null;
        }
        // Otherwise the reference likely comes from an imported
        // symbol like an array of shared common components.
        return true;
    }
}
/** Gets the closest parent node of a certain type. */
function closestNode(start, predicate) {
    let current = start.parent;
    while (current) {
        if (predicate(current)) {
            return current;
        }
        else {
            current = current.parent;
        }
    }
    return null;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Validates that TypeScript files match a specific set of rules set by the Angular compiler.
 */
class SourceFileValidator {
    rules;
    constructor(reflector, importedSymbolsTracker, templateTypeChecker, typeCheckingConfig) {
        this.rules = [new InitializerApiUsageRule(reflector, importedSymbolsTracker)];
        this.rules.push(new UnusedStandaloneImportsRule(templateTypeChecker, typeCheckingConfig, importedSymbolsTracker));
    }
    /**
     * Gets the diagnostics for a specific file, or null if the file is valid.
     * @param sourceFile File to be checked.
     */
    getDiagnosticsForFile(sourceFile) {
        if (sourceFile.isDeclarationFile || sourceFile.fileName.endsWith('.ngtypecheck.ts')) {
            return null;
        }
        let rulesToRun = null;
        for (const rule of this.rules) {
            if (rule.shouldCheck(sourceFile)) {
                rulesToRun ??= [];
                rulesToRun.push(rule);
            }
        }
        if (rulesToRun === null) {
            return null;
        }
        let fileDiagnostics = null;
        sourceFile.forEachChild(function walk(node) {
            // Note: non-null assertion is here because of g3.
            for (const rule of rulesToRun) {
                const nodeDiagnostics = rule.checkNode(node);
                if (nodeDiagnostics !== null) {
                    fileDiagnostics ??= [];
                    if (Array.isArray(nodeDiagnostics)) {
                        fileDiagnostics.push(...nodeDiagnostics);
                    }
                    else {
                        fileDiagnostics.push(nodeDiagnostics);
                    }
                }
            }
            node.forEachChild(walk);
        });
        return fileDiagnostics;
    }
}

function coreHasSymbol(program, symbol) {
    const checker = program.getTypeChecker();
    for (const sf of program.getSourceFiles().filter(isMaybeCore)) {
        const sym = checker.getSymbolAtLocation(sf);
        if (sym === undefined || sym.exports === undefined) {
            continue;
        }
        if (!sym.exports.has('ɵɵtemplate')) {
            // This is not @angular/core.
            continue;
        }
        return sym.exports.has(symbol.name);
    }
    // No @angular/core file found, so we have no information.
    return null;
}
function isMaybeCore(sf) {
    return (sf.isDeclarationFile &&
        sf.fileName.includes('@angular/core') &&
        sf.fileName.endsWith('index.d.ts'));
}

function getDefaultExportFromCjs (x) {
	return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}

var re = {exports: {}};

var constants;
var hasRequiredConstants;

function requireConstants () {
	if (hasRequiredConstants) return constants;
	hasRequiredConstants = 1;
	// Note: this is the semver.org version of the spec that it implements
	// Not necessarily the package version of this code.
	const SEMVER_SPEC_VERSION = '2.0.0';

	const MAX_LENGTH = 256;
	const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
	/* istanbul ignore next */ 9007199254740991;

	// Max safe segment length for coercion.
	const MAX_SAFE_COMPONENT_LENGTH = 16;

	// Max safe length for a build identifier. The max length minus 6 characters for
	// the shortest version with a build 0.0.0+BUILD.
	const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;

	const RELEASE_TYPES = [
	  'major',
	  'premajor',
	  'minor',
	  'preminor',
	  'patch',
	  'prepatch',
	  'prerelease',
	];

	constants = {
	  MAX_LENGTH,
	  MAX_SAFE_COMPONENT_LENGTH,
	  MAX_SAFE_BUILD_LENGTH,
	  MAX_SAFE_INTEGER,
	  RELEASE_TYPES,
	  SEMVER_SPEC_VERSION,
	  FLAG_INCLUDE_PRERELEASE: 0b001,
	  FLAG_LOOSE: 0b010,
	};
	return constants;
}

var debug_1;
var hasRequiredDebug;

function requireDebug () {
	if (hasRequiredDebug) return debug_1;
	hasRequiredDebug = 1;
	const debug = (
	  typeof process === 'object' &&
	  process.env &&
	  process.env.NODE_DEBUG &&
	  /\bsemver\b/i.test(process.env.NODE_DEBUG)
	) ? (...args) => console.error('SEMVER', ...args)
	  : () => {};

	debug_1 = debug;
	return debug_1;
}

var hasRequiredRe;

function requireRe () {
	if (hasRequiredRe) return re.exports;
	hasRequiredRe = 1;
	(function (module, exports) {
		const {
		  MAX_SAFE_COMPONENT_LENGTH,
		  MAX_SAFE_BUILD_LENGTH,
		  MAX_LENGTH,
		} = requireConstants();
		const debug = requireDebug();
		exports = module.exports = {};

		// The actual regexps go on exports.re
		const re = exports.re = [];
		const safeRe = exports.safeRe = [];
		const src = exports.src = [];
		const safeSrc = exports.safeSrc = [];
		const t = exports.t = {};
		let R = 0;

		const LETTERDASHNUMBER = '[a-zA-Z0-9-]';

		// Replace some greedy regex tokens to prevent regex dos issues. These regex are
		// used internally via the safeRe object since all inputs in this library get
		// normalized first to trim and collapse all extra whitespace. The original
		// regexes are exported for userland consumption and lower level usage. A
		// future breaking change could export the safer regex only with a note that
		// all input should have extra whitespace removed.
		const safeRegexReplacements = [
		  ['\\s', 1],
		  ['\\d', MAX_LENGTH],
		  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
		];

		const makeSafeRegex = (value) => {
		  for (const [token, max] of safeRegexReplacements) {
		    value = value
		      .split(`${token}*`).join(`${token}{0,${max}}`)
		      .split(`${token}+`).join(`${token}{1,${max}}`);
		  }
		  return value
		};

		const createToken = (name, value, isGlobal) => {
		  const safe = makeSafeRegex(value);
		  const index = R++;
		  debug(name, index, value);
		  t[name] = index;
		  src[index] = value;
		  safeSrc[index] = safe;
		  re[index] = new RegExp(value, isGlobal ? 'g' : undefined);
		  safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined);
		};

		// The following Regular Expressions can be used for tokenizing,
		// validating, and parsing SemVer version strings.

		// ## Numeric Identifier
		// A single `0`, or a non-zero digit followed by zero or more digits.

		createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*');
		createToken('NUMERICIDENTIFIERLOOSE', '\\d+');

		// ## Non-numeric Identifier
		// Zero or more digits, followed by a letter or hyphen, and then zero or
		// more letters, digits, or hyphens.

		createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);

		// ## Main Version
		// Three dot-separated numeric identifiers.

		createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
		                   `(${src[t.NUMERICIDENTIFIER]})\\.` +
		                   `(${src[t.NUMERICIDENTIFIER]})`);

		createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
		                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
		                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`);

		// ## Pre-release Version Identifier
		// A numeric identifier, or a non-numeric identifier.

		createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]
		}|${src[t.NONNUMERICIDENTIFIER]})`);

		createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]
		}|${src[t.NONNUMERICIDENTIFIER]})`);

		// ## Pre-release Version
		// Hyphen, followed by one or more dot-separated pre-release version
		// identifiers.

		createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
		}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);

		createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
		}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);

		// ## Build Metadata Identifier
		// Any combination of digits, letters, or hyphens.

		createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`);

		// ## Build Metadata
		// Plus sign, followed by one or more period-separated build metadata
		// identifiers.

		createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
		}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);

		// ## Full Version String
		// A main version, followed optionally by a pre-release version and
		// build metadata.

		// Note that the only major, minor, patch, and pre-release sections of
		// the version string are capturing groups.  The build metadata is not a
		// capturing group, because it should not ever be used in version
		// comparison.

		createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
		}${src[t.PRERELEASE]}?${
		  src[t.BUILD]}?`);

		createToken('FULL', `^${src[t.FULLPLAIN]}$`);

		// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
		// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
		// common in the npm registry.
		createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
		}${src[t.PRERELEASELOOSE]}?${
		  src[t.BUILD]}?`);

		createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`);

		createToken('GTLT', '((?:<|>)?=?)');

		// Something like "2.*" or "1.2.x".
		// Note that "x.x" is a valid xRange identifer, meaning "any version"
		// Only the first item is strictly required.
		createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
		createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);

		createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
		                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
		                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
		                   `(?:${src[t.PRERELEASE]})?${
		                     src[t.BUILD]}?` +
		                   `)?)?`);

		createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
		                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
		                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
		                        `(?:${src[t.PRERELEASELOOSE]})?${
		                          src[t.BUILD]}?` +
		                        `)?)?`);

		createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
		createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);

		// Coercion.
		// Extract anything that could conceivably be a part of a valid semver
		createToken('COERCEPLAIN', `${'(^|[^\\d])' +
		              '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
		              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
		              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
		createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
		createToken('COERCEFULL', src[t.COERCEPLAIN] +
		              `(?:${src[t.PRERELEASE]})?` +
		              `(?:${src[t.BUILD]})?` +
		              `(?:$|[^\\d])`);
		createToken('COERCERTL', src[t.COERCE], true);
		createToken('COERCERTLFULL', src[t.COERCEFULL], true);

		// Tilde ranges.
		// Meaning is "reasonably at or greater than"
		createToken('LONETILDE', '(?:~>?)');

		createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true);
		exports.tildeTrimReplace = '$1~';

		createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
		createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);

		// Caret ranges.
		// Meaning is "at least and backwards compatible with"
		createToken('LONECARET', '(?:\\^)');

		createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true);
		exports.caretTrimReplace = '$1^';

		createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
		createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);

		// A simple gt/lt/eq thing, or just "" to indicate "any version"
		createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
		createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);

		// An expression to strip any whitespace between the gtlt and the thing
		// it modifies, so that `> 1.2.3` ==> `>1.2.3`
		createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
		}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
		exports.comparatorTrimReplace = '$1$2$3';

		// Something like `1.2.3 - 1.2.4`
		// Note that these all use the loose form, because they'll be
		// checked against either the strict or loose comparator form
		// later.
		createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
		                   `\\s+-\\s+` +
		                   `(${src[t.XRANGEPLAIN]})` +
		                   `\\s*$`);

		createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
		                        `\\s+-\\s+` +
		                        `(${src[t.XRANGEPLAINLOOSE]})` +
		                        `\\s*$`);

		// Star ranges basically just allow anything at all.
		createToken('STAR', '(<|>)?=?\\s*\\*');
		// >=0.0.0 is like a star
		createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$');
		createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$'); 
	} (re, re.exports));
	return re.exports;
}

var parseOptions_1;
var hasRequiredParseOptions;

function requireParseOptions () {
	if (hasRequiredParseOptions) return parseOptions_1;
	hasRequiredParseOptions = 1;
	// parse out just the options we care about
	const looseOption = Object.freeze({ loose: true });
	const emptyOpts = Object.freeze({ });
	const parseOptions = options => {
	  if (!options) {
	    return emptyOpts
	  }

	  if (typeof options !== 'object') {
	    return looseOption
	  }

	  return options
	};
	parseOptions_1 = parseOptions;
	return parseOptions_1;
}

var identifiers;
var hasRequiredIdentifiers;

function requireIdentifiers () {
	if (hasRequiredIdentifiers) return identifiers;
	hasRequiredIdentifiers = 1;
	const numeric = /^[0-9]+$/;
	const compareIdentifiers = (a, b) => {
	  const anum = numeric.test(a);
	  const bnum = numeric.test(b);

	  if (anum && bnum) {
	    a = +a;
	    b = +b;
	  }

	  return a === b ? 0
	    : (anum && !bnum) ? -1
	    : (bnum && !anum) ? 1
	    : a < b ? -1
	    : 1
	};

	const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);

	identifiers = {
	  compareIdentifiers,
	  rcompareIdentifiers,
	};
	return identifiers;
}

var semver$2;
var hasRequiredSemver$1;

function requireSemver$1 () {
	if (hasRequiredSemver$1) return semver$2;
	hasRequiredSemver$1 = 1;
	const debug = requireDebug();
	const { MAX_LENGTH, MAX_SAFE_INTEGER } = requireConstants();
	const { safeRe: re, safeSrc: src, t } = requireRe();

	const parseOptions = requireParseOptions();
	const { compareIdentifiers } = requireIdentifiers();
	class SemVer {
	  constructor (version, options) {
	    options = parseOptions(options);

	    if (version instanceof SemVer) {
	      if (version.loose === !!options.loose &&
	        version.includePrerelease === !!options.includePrerelease) {
	        return version
	      } else {
	        version = version.version;
	      }
	    } else if (typeof version !== 'string') {
	      throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
	    }

	    if (version.length > MAX_LENGTH) {
	      throw new TypeError(
	        `version is longer than ${MAX_LENGTH} characters`
	      )
	    }

	    debug('SemVer', version, options);
	    this.options = options;
	    this.loose = !!options.loose;
	    // this isn't actually relevant for versions, but keep it so that we
	    // don't run into trouble passing this.options around.
	    this.includePrerelease = !!options.includePrerelease;

	    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);

	    if (!m) {
	      throw new TypeError(`Invalid Version: ${version}`)
	    }

	    this.raw = version;

	    // these are actually numbers
	    this.major = +m[1];
	    this.minor = +m[2];
	    this.patch = +m[3];

	    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
	      throw new TypeError('Invalid major version')
	    }

	    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
	      throw new TypeError('Invalid minor version')
	    }

	    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
	      throw new TypeError('Invalid patch version')
	    }

	    // numberify any prerelease numeric ids
	    if (!m[4]) {
	      this.prerelease = [];
	    } else {
	      this.prerelease = m[4].split('.').map((id) => {
	        if (/^[0-9]+$/.test(id)) {
	          const num = +id;
	          if (num >= 0 && num < MAX_SAFE_INTEGER) {
	            return num
	          }
	        }
	        return id
	      });
	    }

	    this.build = m[5] ? m[5].split('.') : [];
	    this.format();
	  }

	  format () {
	    this.version = `${this.major}.${this.minor}.${this.patch}`;
	    if (this.prerelease.length) {
	      this.version += `-${this.prerelease.join('.')}`;
	    }
	    return this.version
	  }

	  toString () {
	    return this.version
	  }

	  compare (other) {
	    debug('SemVer.compare', this.version, this.options, other);
	    if (!(other instanceof SemVer)) {
	      if (typeof other === 'string' && other === this.version) {
	        return 0
	      }
	      other = new SemVer(other, this.options);
	    }

	    if (other.version === this.version) {
	      return 0
	    }

	    return this.compareMain(other) || this.comparePre(other)
	  }

	  compareMain (other) {
	    if (!(other instanceof SemVer)) {
	      other = new SemVer(other, this.options);
	    }

	    return (
	      compareIdentifiers(this.major, other.major) ||
	      compareIdentifiers(this.minor, other.minor) ||
	      compareIdentifiers(this.patch, other.patch)
	    )
	  }

	  comparePre (other) {
	    if (!(other instanceof SemVer)) {
	      other = new SemVer(other, this.options);
	    }

	    // NOT having a prerelease is > having one
	    if (this.prerelease.length && !other.prerelease.length) {
	      return -1
	    } else if (!this.prerelease.length && other.prerelease.length) {
	      return 1
	    } else if (!this.prerelease.length && !other.prerelease.length) {
	      return 0
	    }

	    let i = 0;
	    do {
	      const a = this.prerelease[i];
	      const b = other.prerelease[i];
	      debug('prerelease compare', i, a, b);
	      if (a === undefined && b === undefined) {
	        return 0
	      } else if (b === undefined) {
	        return 1
	      } else if (a === undefined) {
	        return -1
	      } else if (a === b) {
	        continue
	      } else {
	        return compareIdentifiers(a, b)
	      }
	    } while (++i)
	  }

	  compareBuild (other) {
	    if (!(other instanceof SemVer)) {
	      other = new SemVer(other, this.options);
	    }

	    let i = 0;
	    do {
	      const a = this.build[i];
	      const b = other.build[i];
	      debug('build compare', i, a, b);
	      if (a === undefined && b === undefined) {
	        return 0
	      } else if (b === undefined) {
	        return 1
	      } else if (a === undefined) {
	        return -1
	      } else if (a === b) {
	        continue
	      } else {
	        return compareIdentifiers(a, b)
	      }
	    } while (++i)
	  }

	  // preminor will bump the version up to the next minor release, and immediately
	  // down to pre-release. premajor and prepatch work the same way.
	  inc (release, identifier, identifierBase) {
	    if (release.startsWith('pre')) {
	      if (!identifier && identifierBase === false) {
	        throw new Error('invalid increment argument: identifier is empty')
	      }
	      // Avoid an invalid semver results
	      if (identifier) {
	        const r = new RegExp(`^${this.options.loose ? src[t.PRERELEASELOOSE] : src[t.PRERELEASE]}$`);
	        const match = `-${identifier}`.match(r);
	        if (!match || match[1] !== identifier) {
	          throw new Error(`invalid identifier: ${identifier}`)
	        }
	      }
	    }

	    switch (release) {
	      case 'premajor':
	        this.prerelease.length = 0;
	        this.patch = 0;
	        this.minor = 0;
	        this.major++;
	        this.inc('pre', identifier, identifierBase);
	        break
	      case 'preminor':
	        this.prerelease.length = 0;
	        this.patch = 0;
	        this.minor++;
	        this.inc('pre', identifier, identifierBase);
	        break
	      case 'prepatch':
	        // If this is already a prerelease, it will bump to the next version
	        // drop any prereleases that might already exist, since they are not
	        // relevant at this point.
	        this.prerelease.length = 0;
	        this.inc('patch', identifier, identifierBase);
	        this.inc('pre', identifier, identifierBase);
	        break
	      // If the input is a non-prerelease version, this acts the same as
	      // prepatch.
	      case 'prerelease':
	        if (this.prerelease.length === 0) {
	          this.inc('patch', identifier, identifierBase);
	        }
	        this.inc('pre', identifier, identifierBase);
	        break
	      case 'release':
	        if (this.prerelease.length === 0) {
	          throw new Error(`version ${this.raw} is not a prerelease`)
	        }
	        this.prerelease.length = 0;
	        break

	      case 'major':
	        // If this is a pre-major version, bump up to the same major version.
	        // Otherwise increment major.
	        // 1.0.0-5 bumps to 1.0.0
	        // 1.1.0 bumps to 2.0.0
	        if (
	          this.minor !== 0 ||
	          this.patch !== 0 ||
	          this.prerelease.length === 0
	        ) {
	          this.major++;
	        }
	        this.minor = 0;
	        this.patch = 0;
	        this.prerelease = [];
	        break
	      case 'minor':
	        // If this is a pre-minor version, bump up to the same minor version.
	        // Otherwise increment minor.
	        // 1.2.0-5 bumps to 1.2.0
	        // 1.2.1 bumps to 1.3.0
	        if (this.patch !== 0 || this.prerelease.length === 0) {
	          this.minor++;
	        }
	        this.patch = 0;
	        this.prerelease = [];
	        break
	      case 'patch':
	        // If this is not a pre-release version, it will increment the patch.
	        // If it is a pre-release it will bump up to the same patch version.
	        // 1.2.0-5 patches to 1.2.0
	        // 1.2.0 patches to 1.2.1
	        if (this.prerelease.length === 0) {
	          this.patch++;
	        }
	        this.prerelease = [];
	        break
	      // This probably shouldn't be used publicly.
	      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
	      case 'pre': {
	        const base = Number(identifierBase) ? 1 : 0;

	        if (this.prerelease.length === 0) {
	          this.prerelease = [base];
	        } else {
	          let i = this.prerelease.length;
	          while (--i >= 0) {
	            if (typeof this.prerelease[i] === 'number') {
	              this.prerelease[i]++;
	              i = -2;
	            }
	          }
	          if (i === -1) {
	            // didn't increment anything
	            if (identifier === this.prerelease.join('.') && identifierBase === false) {
	              throw new Error('invalid increment argument: identifier already exists')
	            }
	            this.prerelease.push(base);
	          }
	        }
	        if (identifier) {
	          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
	          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
	          let prerelease = [identifier, base];
	          if (identifierBase === false) {
	            prerelease = [identifier];
	          }
	          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
	            if (isNaN(this.prerelease[1])) {
	              this.prerelease = prerelease;
	            }
	          } else {
	            this.prerelease = prerelease;
	          }
	        }
	        break
	      }
	      default:
	        throw new Error(`invalid increment argument: ${release}`)
	    }
	    this.raw = this.format();
	    if (this.build.length) {
	      this.raw += `+${this.build.join('.')}`;
	    }
	    return this
	  }
	}

	semver$2 = SemVer;
	return semver$2;
}

var parse_1;
var hasRequiredParse;

function requireParse () {
	if (hasRequiredParse) return parse_1;
	hasRequiredParse = 1;
	const SemVer = requireSemver$1();
	const parse = (version, options, throwErrors = false) => {
	  if (version instanceof SemVer) {
	    return version
	  }
	  try {
	    return new SemVer(version, options)
	  } catch (er) {
	    if (!throwErrors) {
	      return null
	    }
	    throw er
	  }
	};

	parse_1 = parse;
	return parse_1;
}

var valid_1;
var hasRequiredValid$1;

function requireValid$1 () {
	if (hasRequiredValid$1) return valid_1;
	hasRequiredValid$1 = 1;
	const parse = requireParse();
	const valid = (version, options) => {
	  const v = parse(version, options);
	  return v ? v.version : null
	};
	valid_1 = valid;
	return valid_1;
}

var clean_1;
var hasRequiredClean;

function requireClean () {
	if (hasRequiredClean) return clean_1;
	hasRequiredClean = 1;
	const parse = requireParse();
	const clean = (version, options) => {
	  const s = parse(version.trim().replace(/^[=v]+/, ''), options);
	  return s ? s.version : null
	};
	clean_1 = clean;
	return clean_1;
}

var inc_1;
var hasRequiredInc;

function requireInc () {
	if (hasRequiredInc) return inc_1;
	hasRequiredInc = 1;
	const SemVer = requireSemver$1();

	const inc = (version, release, options, identifier, identifierBase) => {
	  if (typeof (options) === 'string') {
	    identifierBase = identifier;
	    identifier = options;
	    options = undefined;
	  }

	  try {
	    return new SemVer(
	      version instanceof SemVer ? version.version : version,
	      options
	    ).inc(release, identifier, identifierBase).version
	  } catch (er) {
	    return null
	  }
	};
	inc_1 = inc;
	return inc_1;
}

var diff_1;
var hasRequiredDiff;

function requireDiff () {
	if (hasRequiredDiff) return diff_1;
	hasRequiredDiff = 1;
	const parse = requireParse();

	const diff = (version1, version2) => {
	  const v1 = parse(version1, null, true);
	  const v2 = parse(version2, null, true);
	  const comparison = v1.compare(v2);

	  if (comparison === 0) {
	    return null
	  }

	  const v1Higher = comparison > 0;
	  const highVersion = v1Higher ? v1 : v2;
	  const lowVersion = v1Higher ? v2 : v1;
	  const highHasPre = !!highVersion.prerelease.length;
	  const lowHasPre = !!lowVersion.prerelease.length;

	  if (lowHasPre && !highHasPre) {
	    // Going from prerelease -> no prerelease requires some special casing

	    // If the low version has only a major, then it will always be a major
	    // Some examples:
	    // 1.0.0-1 -> 1.0.0
	    // 1.0.0-1 -> 1.1.1
	    // 1.0.0-1 -> 2.0.0
	    if (!lowVersion.patch && !lowVersion.minor) {
	      return 'major'
	    }

	    // If the main part has no difference
	    if (lowVersion.compareMain(highVersion) === 0) {
	      if (lowVersion.minor && !lowVersion.patch) {
	        return 'minor'
	      }
	      return 'patch'
	    }
	  }

	  // add the `pre` prefix if we are going to a prerelease version
	  const prefix = highHasPre ? 'pre' : '';

	  if (v1.major !== v2.major) {
	    return prefix + 'major'
	  }

	  if (v1.minor !== v2.minor) {
	    return prefix + 'minor'
	  }

	  if (v1.patch !== v2.patch) {
	    return prefix + 'patch'
	  }

	  // high and low are preleases
	  return 'prerelease'
	};

	diff_1 = diff;
	return diff_1;
}

var major_1;
var hasRequiredMajor;

function requireMajor () {
	if (hasRequiredMajor) return major_1;
	hasRequiredMajor = 1;
	const SemVer = requireSemver$1();
	const major = (a, loose) => new SemVer(a, loose).major;
	major_1 = major;
	return major_1;
}

var minor_1;
var hasRequiredMinor;

function requireMinor () {
	if (hasRequiredMinor) return minor_1;
	hasRequiredMinor = 1;
	const SemVer = requireSemver$1();
	const minor = (a, loose) => new SemVer(a, loose).minor;
	minor_1 = minor;
	return minor_1;
}

var patch_1;
var hasRequiredPatch;

function requirePatch () {
	if (hasRequiredPatch) return patch_1;
	hasRequiredPatch = 1;
	const SemVer = requireSemver$1();
	const patch = (a, loose) => new SemVer(a, loose).patch;
	patch_1 = patch;
	return patch_1;
}

var prerelease_1;
var hasRequiredPrerelease;

function requirePrerelease () {
	if (hasRequiredPrerelease) return prerelease_1;
	hasRequiredPrerelease = 1;
	const parse = requireParse();
	const prerelease = (version, options) => {
	  const parsed = parse(version, options);
	  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
	};
	prerelease_1 = prerelease;
	return prerelease_1;
}

var compare_1;
var hasRequiredCompare;

function requireCompare () {
	if (hasRequiredCompare) return compare_1;
	hasRequiredCompare = 1;
	const SemVer = requireSemver$1();
	const compare = (a, b, loose) =>
	  new SemVer(a, loose).compare(new SemVer(b, loose));

	compare_1 = compare;
	return compare_1;
}

var rcompare_1;
var hasRequiredRcompare;

function requireRcompare () {
	if (hasRequiredRcompare) return rcompare_1;
	hasRequiredRcompare = 1;
	const compare = requireCompare();
	const rcompare = (a, b, loose) => compare(b, a, loose);
	rcompare_1 = rcompare;
	return rcompare_1;
}

var compareLoose_1;
var hasRequiredCompareLoose;

function requireCompareLoose () {
	if (hasRequiredCompareLoose) return compareLoose_1;
	hasRequiredCompareLoose = 1;
	const compare = requireCompare();
	const compareLoose = (a, b) => compare(a, b, true);
	compareLoose_1 = compareLoose;
	return compareLoose_1;
}

var compareBuild_1;
var hasRequiredCompareBuild;

function requireCompareBuild () {
	if (hasRequiredCompareBuild) return compareBuild_1;
	hasRequiredCompareBuild = 1;
	const SemVer = requireSemver$1();
	const compareBuild = (a, b, loose) => {
	  const versionA = new SemVer(a, loose);
	  const versionB = new SemVer(b, loose);
	  return versionA.compare(versionB) || versionA.compareBuild(versionB)
	};
	compareBuild_1 = compareBuild;
	return compareBuild_1;
}

var sort_1;
var hasRequiredSort;

function requireSort () {
	if (hasRequiredSort) return sort_1;
	hasRequiredSort = 1;
	const compareBuild = requireCompareBuild();
	const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
	sort_1 = sort;
	return sort_1;
}

var rsort_1;
var hasRequiredRsort;

function requireRsort () {
	if (hasRequiredRsort) return rsort_1;
	hasRequiredRsort = 1;
	const compareBuild = requireCompareBuild();
	const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
	rsort_1 = rsort;
	return rsort_1;
}

var gt_1;
var hasRequiredGt;

function requireGt () {
	if (hasRequiredGt) return gt_1;
	hasRequiredGt = 1;
	const compare = requireCompare();
	const gt = (a, b, loose) => compare(a, b, loose) > 0;
	gt_1 = gt;
	return gt_1;
}

var lt_1;
var hasRequiredLt;

function requireLt () {
	if (hasRequiredLt) return lt_1;
	hasRequiredLt = 1;
	const compare = requireCompare();
	const lt = (a, b, loose) => compare(a, b, loose) < 0;
	lt_1 = lt;
	return lt_1;
}

var eq_1;
var hasRequiredEq;

function requireEq () {
	if (hasRequiredEq) return eq_1;
	hasRequiredEq = 1;
	const compare = requireCompare();
	const eq = (a, b, loose) => compare(a, b, loose) === 0;
	eq_1 = eq;
	return eq_1;
}

var neq_1;
var hasRequiredNeq;

function requireNeq () {
	if (hasRequiredNeq) return neq_1;
	hasRequiredNeq = 1;
	const compare = requireCompare();
	const neq = (a, b, loose) => compare(a, b, loose) !== 0;
	neq_1 = neq;
	return neq_1;
}

var gte_1;
var hasRequiredGte;

function requireGte () {
	if (hasRequiredGte) return gte_1;
	hasRequiredGte = 1;
	const compare = requireCompare();
	const gte = (a, b, loose) => compare(a, b, loose) >= 0;
	gte_1 = gte;
	return gte_1;
}

var lte_1;
var hasRequiredLte;

function requireLte () {
	if (hasRequiredLte) return lte_1;
	hasRequiredLte = 1;
	const compare = requireCompare();
	const lte = (a, b, loose) => compare(a, b, loose) <= 0;
	lte_1 = lte;
	return lte_1;
}

var cmp_1;
var hasRequiredCmp;

function requireCmp () {
	if (hasRequiredCmp) return cmp_1;
	hasRequiredCmp = 1;
	const eq = requireEq();
	const neq = requireNeq();
	const gt = requireGt();
	const gte = requireGte();
	const lt = requireLt();
	const lte = requireLte();

	const cmp = (a, op, b, loose) => {
	  switch (op) {
	    case '===':
	      if (typeof a === 'object') {
	        a = a.version;
	      }
	      if (typeof b === 'object') {
	        b = b.version;
	      }
	      return a === b

	    case '!==':
	      if (typeof a === 'object') {
	        a = a.version;
	      }
	      if (typeof b === 'object') {
	        b = b.version;
	      }
	      return a !== b

	    case '':
	    case '=':
	    case '==':
	      return eq(a, b, loose)

	    case '!=':
	      return neq(a, b, loose)

	    case '>':
	      return gt(a, b, loose)

	    case '>=':
	      return gte(a, b, loose)

	    case '<':
	      return lt(a, b, loose)

	    case '<=':
	      return lte(a, b, loose)

	    default:
	      throw new TypeError(`Invalid operator: ${op}`)
	  }
	};
	cmp_1 = cmp;
	return cmp_1;
}

var coerce_1;
var hasRequiredCoerce;

function requireCoerce () {
	if (hasRequiredCoerce) return coerce_1;
	hasRequiredCoerce = 1;
	const SemVer = requireSemver$1();
	const parse = requireParse();
	const { safeRe: re, t } = requireRe();

	const coerce = (version, options) => {
	  if (version instanceof SemVer) {
	    return version
	  }

	  if (typeof version === 'number') {
	    version = String(version);
	  }

	  if (typeof version !== 'string') {
	    return null
	  }

	  options = options || {};

	  let match = null;
	  if (!options.rtl) {
	    match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
	  } else {
	    // Find the right-most coercible string that does not share
	    // a terminus with a more left-ward coercible string.
	    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
	    // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'
	    //
	    // Walk through the string checking with a /g regexp
	    // Manually set the index so as to pick up overlapping matches.
	    // Stop when we get a match that ends at the string end, since no
	    // coercible string can be more right-ward without the same terminus.
	    const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
	    let next;
	    while ((next = coerceRtlRegex.exec(version)) &&
	        (!match || match.index + match[0].length !== version.length)
	    ) {
	      if (!match ||
	            next.index + next[0].length !== match.index + match[0].length) {
	        match = next;
	      }
	      coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
	    }
	    // leave it in a clean state
	    coerceRtlRegex.lastIndex = -1;
	  }

	  if (match === null) {
	    return null
	  }

	  const major = match[2];
	  const minor = match[3] || '0';
	  const patch = match[4] || '0';
	  const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '';
	  const build = options.includePrerelease && match[6] ? `+${match[6]}` : '';

	  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)
	};
	coerce_1 = coerce;
	return coerce_1;
}

var lrucache;
var hasRequiredLrucache;

function requireLrucache () {
	if (hasRequiredLrucache) return lrucache;
	hasRequiredLrucache = 1;
	class LRUCache {
	  constructor () {
	    this.max = 1000;
	    this.map = new Map();
	  }

	  get (key) {
	    const value = this.map.get(key);
	    if (value === undefined) {
	      return undefined
	    } else {
	      // Remove the key from the map and add it to the end
	      this.map.delete(key);
	      this.map.set(key, value);
	      return value
	    }
	  }

	  delete (key) {
	    return this.map.delete(key)
	  }

	  set (key, value) {
	    const deleted = this.delete(key);

	    if (!deleted && value !== undefined) {
	      // If cache is full, delete the least recently used item
	      if (this.map.size >= this.max) {
	        const firstKey = this.map.keys().next().value;
	        this.delete(firstKey);
	      }

	      this.map.set(key, value);
	    }

	    return this
	  }
	}

	lrucache = LRUCache;
	return lrucache;
}

var range;
var hasRequiredRange;

function requireRange () {
	if (hasRequiredRange) return range;
	hasRequiredRange = 1;
	const SPACE_CHARACTERS = /\s+/g;

	// hoisted class for cyclic dependency
	class Range {
	  constructor (range, options) {
	    options = parseOptions(options);

	    if (range instanceof Range) {
	      if (
	        range.loose === !!options.loose &&
	        range.includePrerelease === !!options.includePrerelease
	      ) {
	        return range
	      } else {
	        return new Range(range.raw, options)
	      }
	    }

	    if (range instanceof Comparator) {
	      // just put it in the set and return
	      this.raw = range.value;
	      this.set = [[range]];
	      this.formatted = undefined;
	      return this
	    }

	    this.options = options;
	    this.loose = !!options.loose;
	    this.includePrerelease = !!options.includePrerelease;

	    // First reduce all whitespace as much as possible so we do not have to rely
	    // on potentially slow regexes like \s*. This is then stored and used for
	    // future error messages as well.
	    this.raw = range.trim().replace(SPACE_CHARACTERS, ' ');

	    // First, split on ||
	    this.set = this.raw
	      .split('||')
	      // map the range to a 2d array of comparators
	      .map(r => this.parseRange(r.trim()))
	      // throw out any comparator lists that are empty
	      // this generally means that it was not a valid range, which is allowed
	      // in loose mode, but will still throw if the WHOLE range is invalid.
	      .filter(c => c.length);

	    if (!this.set.length) {
	      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)
	    }

	    // if we have any that are not the null set, throw out null sets.
	    if (this.set.length > 1) {
	      // keep the first one, in case they're all null sets
	      const first = this.set[0];
	      this.set = this.set.filter(c => !isNullSet(c[0]));
	      if (this.set.length === 0) {
	        this.set = [first];
	      } else if (this.set.length > 1) {
	        // if we have any that are *, then the range is just *
	        for (const c of this.set) {
	          if (c.length === 1 && isAny(c[0])) {
	            this.set = [c];
	            break
	          }
	        }
	      }
	    }

	    this.formatted = undefined;
	  }

	  get range () {
	    if (this.formatted === undefined) {
	      this.formatted = '';
	      for (let i = 0; i < this.set.length; i++) {
	        if (i > 0) {
	          this.formatted += '||';
	        }
	        const comps = this.set[i];
	        for (let k = 0; k < comps.length; k++) {
	          if (k > 0) {
	            this.formatted += ' ';
	          }
	          this.formatted += comps[k].toString().trim();
	        }
	      }
	    }
	    return this.formatted
	  }

	  format () {
	    return this.range
	  }

	  toString () {
	    return this.range
	  }

	  parseRange (range) {
	    // memoize range parsing for performance.
	    // this is a very hot path, and fully deterministic.
	    const memoOpts =
	      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |
	      (this.options.loose && FLAG_LOOSE);
	    const memoKey = memoOpts + ':' + range;
	    const cached = cache.get(memoKey);
	    if (cached) {
	      return cached
	    }

	    const loose = this.options.loose;
	    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
	    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
	    range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
	    debug('hyphen replace', range);

	    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
	    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
	    debug('comparator trim', range);

	    // `~ 1.2.3` => `~1.2.3`
	    range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
	    debug('tilde trim', range);

	    // `^ 1.2.3` => `^1.2.3`
	    range = range.replace(re[t.CARETTRIM], caretTrimReplace);
	    debug('caret trim', range);

	    // At this point, the range is completely trimmed and
	    // ready to be split into comparators.

	    let rangeList = range
	      .split(' ')
	      .map(comp => parseComparator(comp, this.options))
	      .join(' ')
	      .split(/\s+/)
	      // >=0.0.0 is equivalent to *
	      .map(comp => replaceGTE0(comp, this.options));

	    if (loose) {
	      // in loose mode, throw out any that are not valid comparators
	      rangeList = rangeList.filter(comp => {
	        debug('loose invalid filter', comp, this.options);
	        return !!comp.match(re[t.COMPARATORLOOSE])
	      });
	    }
	    debug('range list', rangeList);

	    // if any comparators are the null set, then replace with JUST null set
	    // if more than one comparator, remove any * comparators
	    // also, don't include the same comparator more than once
	    const rangeMap = new Map();
	    const comparators = rangeList.map(comp => new Comparator(comp, this.options));
	    for (const comp of comparators) {
	      if (isNullSet(comp)) {
	        return [comp]
	      }
	      rangeMap.set(comp.value, comp);
	    }
	    if (rangeMap.size > 1 && rangeMap.has('')) {
	      rangeMap.delete('');
	    }

	    const result = [...rangeMap.values()];
	    cache.set(memoKey, result);
	    return result
	  }

	  intersects (range, options) {
	    if (!(range instanceof Range)) {
	      throw new TypeError('a Range is required')
	    }

	    return this.set.some((thisComparators) => {
	      return (
	        isSatisfiable(thisComparators, options) &&
	        range.set.some((rangeComparators) => {
	          return (
	            isSatisfiable(rangeComparators, options) &&
	            thisComparators.every((thisComparator) => {
	              return rangeComparators.every((rangeComparator) => {
	                return thisComparator.intersects(rangeComparator, options)
	              })
	            })
	          )
	        })
	      )
	    })
	  }

	  // if ANY of the sets match ALL of its comparators, then pass
	  test (version) {
	    if (!version) {
	      return false
	    }

	    if (typeof version === 'string') {
	      try {
	        version = new SemVer(version, this.options);
	      } catch (er) {
	        return false
	      }
	    }

	    for (let i = 0; i < this.set.length; i++) {
	      if (testSet(this.set[i], version, this.options)) {
	        return true
	      }
	    }
	    return false
	  }
	}

	range = Range;

	const LRU = requireLrucache();
	const cache = new LRU();

	const parseOptions = requireParseOptions();
	const Comparator = requireComparator();
	const debug = requireDebug();
	const SemVer = requireSemver$1();
	const {
	  safeRe: re,
	  t,
	  comparatorTrimReplace,
	  tildeTrimReplace,
	  caretTrimReplace,
	} = requireRe();
	const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = requireConstants();

	const isNullSet = c => c.value === '<0.0.0-0';
	const isAny = c => c.value === '';

	// take a set of comparators and determine whether there
	// exists a version which can satisfy it
	const isSatisfiable = (comparators, options) => {
	  let result = true;
	  const remainingComparators = comparators.slice();
	  let testComparator = remainingComparators.pop();

	  while (result && remainingComparators.length) {
	    result = remainingComparators.every((otherComparator) => {
	      return testComparator.intersects(otherComparator, options)
	    });

	    testComparator = remainingComparators.pop();
	  }

	  return result
	};

	// comprised of xranges, tildes, stars, and gtlt's at this point.
	// already replaced the hyphen ranges
	// turn into a set of JUST comparators.
	const parseComparator = (comp, options) => {
	  debug('comp', comp, options);
	  comp = replaceCarets(comp, options);
	  debug('caret', comp);
	  comp = replaceTildes(comp, options);
	  debug('tildes', comp);
	  comp = replaceXRanges(comp, options);
	  debug('xrange', comp);
	  comp = replaceStars(comp, options);
	  debug('stars', comp);
	  return comp
	};

	const isX = id => !id || id.toLowerCase() === 'x' || id === '*';

	// ~, ~> --> * (any, kinda silly)
	// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
	// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
	// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
	// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
	// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
	// ~0.0.1 --> >=0.0.1 <0.1.0-0
	const replaceTildes = (comp, options) => {
	  return comp
	    .trim()
	    .split(/\s+/)
	    .map((c) => replaceTilde(c, options))
	    .join(' ')
	};

	const replaceTilde = (comp, options) => {
	  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
	  return comp.replace(r, (_, M, m, p, pr) => {
	    debug('tilde', comp, _, M, m, p, pr);
	    let ret;

	    if (isX(M)) {
	      ret = '';
	    } else if (isX(m)) {
	      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
	    } else if (isX(p)) {
	      // ~1.2 == >=1.2.0 <1.3.0-0
	      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
	    } else if (pr) {
	      debug('replaceTilde pr', pr);
	      ret = `>=${M}.${m}.${p}-${pr
	      } <${M}.${+m + 1}.0-0`;
	    } else {
	      // ~1.2.3 == >=1.2.3 <1.3.0-0
	      ret = `>=${M}.${m}.${p
	      } <${M}.${+m + 1}.0-0`;
	    }

	    debug('tilde return', ret);
	    return ret
	  })
	};

	// ^ --> * (any, kinda silly)
	// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
	// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
	// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
	// ^1.2.3 --> >=1.2.3 <2.0.0-0
	// ^1.2.0 --> >=1.2.0 <2.0.0-0
	// ^0.0.1 --> >=0.0.1 <0.0.2-0
	// ^0.1.0 --> >=0.1.0 <0.2.0-0
	const replaceCarets = (comp, options) => {
	  return comp
	    .trim()
	    .split(/\s+/)
	    .map((c) => replaceCaret(c, options))
	    .join(' ')
	};

	const replaceCaret = (comp, options) => {
	  debug('caret', comp, options);
	  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
	  const z = options.includePrerelease ? '-0' : '';
	  return comp.replace(r, (_, M, m, p, pr) => {
	    debug('caret', comp, _, M, m, p, pr);
	    let ret;

	    if (isX(M)) {
	      ret = '';
	    } else if (isX(m)) {
	      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
	    } else if (isX(p)) {
	      if (M === '0') {
	        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
	      } else {
	        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
	      }
	    } else if (pr) {
	      debug('replaceCaret pr', pr);
	      if (M === '0') {
	        if (m === '0') {
	          ret = `>=${M}.${m}.${p}-${pr
	          } <${M}.${m}.${+p + 1}-0`;
	        } else {
	          ret = `>=${M}.${m}.${p}-${pr
	          } <${M}.${+m + 1}.0-0`;
	        }
	      } else {
	        ret = `>=${M}.${m}.${p}-${pr
	        } <${+M + 1}.0.0-0`;
	      }
	    } else {
	      debug('no pr');
	      if (M === '0') {
	        if (m === '0') {
	          ret = `>=${M}.${m}.${p
	          }${z} <${M}.${m}.${+p + 1}-0`;
	        } else {
	          ret = `>=${M}.${m}.${p
	          }${z} <${M}.${+m + 1}.0-0`;
	        }
	      } else {
	        ret = `>=${M}.${m}.${p
	        } <${+M + 1}.0.0-0`;
	      }
	    }

	    debug('caret return', ret);
	    return ret
	  })
	};

	const replaceXRanges = (comp, options) => {
	  debug('replaceXRanges', comp, options);
	  return comp
	    .split(/\s+/)
	    .map((c) => replaceXRange(c, options))
	    .join(' ')
	};

	const replaceXRange = (comp, options) => {
	  comp = comp.trim();
	  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
	  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
	    debug('xRange', comp, ret, gtlt, M, m, p, pr);
	    const xM = isX(M);
	    const xm = xM || isX(m);
	    const xp = xm || isX(p);
	    const anyX = xp;

	    if (gtlt === '=' && anyX) {
	      gtlt = '';
	    }

	    // if we're including prereleases in the match, then we need
	    // to fix this to -0, the lowest possible prerelease value
	    pr = options.includePrerelease ? '-0' : '';

	    if (xM) {
	      if (gtlt === '>' || gtlt === '<') {
	        // nothing is allowed
	        ret = '<0.0.0-0';
	      } else {
	        // nothing is forbidden
	        ret = '*';
	      }
	    } else if (gtlt && anyX) {
	      // we know patch is an x, because we have any x at all.
	      // replace X with 0
	      if (xm) {
	        m = 0;
	      }
	      p = 0;

	      if (gtlt === '>') {
	        // >1 => >=2.0.0
	        // >1.2 => >=1.3.0
	        gtlt = '>=';
	        if (xm) {
	          M = +M + 1;
	          m = 0;
	          p = 0;
	        } else {
	          m = +m + 1;
	          p = 0;
	        }
	      } else if (gtlt === '<=') {
	        // <=0.7.x is actually <0.8.0, since any 0.7.x should
	        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
	        gtlt = '<';
	        if (xm) {
	          M = +M + 1;
	        } else {
	          m = +m + 1;
	        }
	      }

	      if (gtlt === '<') {
	        pr = '-0';
	      }

	      ret = `${gtlt + M}.${m}.${p}${pr}`;
	    } else if (xm) {
	      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
	    } else if (xp) {
	      ret = `>=${M}.${m}.0${pr
	      } <${M}.${+m + 1}.0-0`;
	    }

	    debug('xRange return', ret);

	    return ret
	  })
	};

	// Because * is AND-ed with everything else in the comparator,
	// and '' means "any version", just remove the *s entirely.
	const replaceStars = (comp, options) => {
	  debug('replaceStars', comp, options);
	  // Looseness is ignored here.  star is always as loose as it gets!
	  return comp
	    .trim()
	    .replace(re[t.STAR], '')
	};

	const replaceGTE0 = (comp, options) => {
	  debug('replaceGTE0', comp, options);
	  return comp
	    .trim()
	    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')
	};

	// This function is passed to string.replace(re[t.HYPHENRANGE])
	// M, m, patch, prerelease, build
	// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
	// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
	// 1.2 - 3.4 => >=1.2.0 <3.5.0-0
	// TODO build?
	const hyphenReplace = incPr => ($0,
	  from, fM, fm, fp, fpr, fb,
	  to, tM, tm, tp, tpr) => {
	  if (isX(fM)) {
	    from = '';
	  } else if (isX(fm)) {
	    from = `>=${fM}.0.0${incPr ? '-0' : ''}`;
	  } else if (isX(fp)) {
	    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`;
	  } else if (fpr) {
	    from = `>=${from}`;
	  } else {
	    from = `>=${from}${incPr ? '-0' : ''}`;
	  }

	  if (isX(tM)) {
	    to = '';
	  } else if (isX(tm)) {
	    to = `<${+tM + 1}.0.0-0`;
	  } else if (isX(tp)) {
	    to = `<${tM}.${+tm + 1}.0-0`;
	  } else if (tpr) {
	    to = `<=${tM}.${tm}.${tp}-${tpr}`;
	  } else if (incPr) {
	    to = `<${tM}.${tm}.${+tp + 1}-0`;
	  } else {
	    to = `<=${to}`;
	  }

	  return `${from} ${to}`.trim()
	};

	const testSet = (set, version, options) => {
	  for (let i = 0; i < set.length; i++) {
	    if (!set[i].test(version)) {
	      return false
	    }
	  }

	  if (version.prerelease.length && !options.includePrerelease) {
	    // Find the set of versions that are allowed to have prereleases
	    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
	    // That should allow `1.2.3-pr.2` to pass.
	    // However, `1.2.4-alpha.notready` should NOT be allowed,
	    // even though it's within the range set by the comparators.
	    for (let i = 0; i < set.length; i++) {
	      debug(set[i].semver);
	      if (set[i].semver === Comparator.ANY) {
	        continue
	      }

	      if (set[i].semver.prerelease.length > 0) {
	        const allowed = set[i].semver;
	        if (allowed.major === version.major &&
	            allowed.minor === version.minor &&
	            allowed.patch === version.patch) {
	          return true
	        }
	      }
	    }

	    // Version has a -pre, but it's not one of the ones we like.
	    return false
	  }

	  return true
	};
	return range;
}

var comparator;
var hasRequiredComparator;

function requireComparator () {
	if (hasRequiredComparator) return comparator;
	hasRequiredComparator = 1;
	const ANY = Symbol('SemVer ANY');
	// hoisted class for cyclic dependency
	class Comparator {
	  static get ANY () {
	    return ANY
	  }

	  constructor (comp, options) {
	    options = parseOptions(options);

	    if (comp instanceof Comparator) {
	      if (comp.loose === !!options.loose) {
	        return comp
	      } else {
	        comp = comp.value;
	      }
	    }

	    comp = comp.trim().split(/\s+/).join(' ');
	    debug('comparator', comp, options);
	    this.options = options;
	    this.loose = !!options.loose;
	    this.parse(comp);

	    if (this.semver === ANY) {
	      this.value = '';
	    } else {
	      this.value = this.operator + this.semver.version;
	    }

	    debug('comp', this);
	  }

	  parse (comp) {
	    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
	    const m = comp.match(r);

	    if (!m) {
	      throw new TypeError(`Invalid comparator: ${comp}`)
	    }

	    this.operator = m[1] !== undefined ? m[1] : '';
	    if (this.operator === '=') {
	      this.operator = '';
	    }

	    // if it literally is just '>' or '' then allow anything.
	    if (!m[2]) {
	      this.semver = ANY;
	    } else {
	      this.semver = new SemVer(m[2], this.options.loose);
	    }
	  }

	  toString () {
	    return this.value
	  }

	  test (version) {
	    debug('Comparator.test', version, this.options.loose);

	    if (this.semver === ANY || version === ANY) {
	      return true
	    }

	    if (typeof version === 'string') {
	      try {
	        version = new SemVer(version, this.options);
	      } catch (er) {
	        return false
	      }
	    }

	    return cmp(version, this.operator, this.semver, this.options)
	  }

	  intersects (comp, options) {
	    if (!(comp instanceof Comparator)) {
	      throw new TypeError('a Comparator is required')
	    }

	    if (this.operator === '') {
	      if (this.value === '') {
	        return true
	      }
	      return new Range(comp.value, options).test(this.value)
	    } else if (comp.operator === '') {
	      if (comp.value === '') {
	        return true
	      }
	      return new Range(this.value, options).test(comp.semver)
	    }

	    options = parseOptions(options);

	    // Special cases where nothing can possibly be lower
	    if (options.includePrerelease &&
	      (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {
	      return false
	    }
	    if (!options.includePrerelease &&
	      (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {
	      return false
	    }

	    // Same direction increasing (> or >=)
	    if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {
	      return true
	    }
	    // Same direction decreasing (< or <=)
	    if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {
	      return true
	    }
	    // same SemVer and both sides are inclusive (<= or >=)
	    if (
	      (this.semver.version === comp.semver.version) &&
	      this.operator.includes('=') && comp.operator.includes('=')) {
	      return true
	    }
	    // opposite directions less than
	    if (cmp(this.semver, '<', comp.semver, options) &&
	      this.operator.startsWith('>') && comp.operator.startsWith('<')) {
	      return true
	    }
	    // opposite directions greater than
	    if (cmp(this.semver, '>', comp.semver, options) &&
	      this.operator.startsWith('<') && comp.operator.startsWith('>')) {
	      return true
	    }
	    return false
	  }
	}

	comparator = Comparator;

	const parseOptions = requireParseOptions();
	const { safeRe: re, t } = requireRe();
	const cmp = requireCmp();
	const debug = requireDebug();
	const SemVer = requireSemver$1();
	const Range = requireRange();
	return comparator;
}

var satisfies_1;
var hasRequiredSatisfies;

function requireSatisfies () {
	if (hasRequiredSatisfies) return satisfies_1;
	hasRequiredSatisfies = 1;
	const Range = requireRange();
	const satisfies = (version, range, options) => {
	  try {
	    range = new Range(range, options);
	  } catch (er) {
	    return false
	  }
	  return range.test(version)
	};
	satisfies_1 = satisfies;
	return satisfies_1;
}

var toComparators_1;
var hasRequiredToComparators;

function requireToComparators () {
	if (hasRequiredToComparators) return toComparators_1;
	hasRequiredToComparators = 1;
	const Range = requireRange();

	// Mostly just for testing and legacy API reasons
	const toComparators = (range, options) =>
	  new Range(range, options).set
	    .map(comp => comp.map(c => c.value).join(' ').trim().split(' '));

	toComparators_1 = toComparators;
	return toComparators_1;
}

var maxSatisfying_1;
var hasRequiredMaxSatisfying;

function requireMaxSatisfying () {
	if (hasRequiredMaxSatisfying) return maxSatisfying_1;
	hasRequiredMaxSatisfying = 1;
	const SemVer = requireSemver$1();
	const Range = requireRange();

	const maxSatisfying = (versions, range, options) => {
	  let max = null;
	  let maxSV = null;
	  let rangeObj = null;
	  try {
	    rangeObj = new Range(range, options);
	  } catch (er) {
	    return null
	  }
	  versions.forEach((v) => {
	    if (rangeObj.test(v)) {
	      // satisfies(v, range, options)
	      if (!max || maxSV.compare(v) === -1) {
	        // compare(max, v, true)
	        max = v;
	        maxSV = new SemVer(max, options);
	      }
	    }
	  });
	  return max
	};
	maxSatisfying_1 = maxSatisfying;
	return maxSatisfying_1;
}

var minSatisfying_1;
var hasRequiredMinSatisfying;

function requireMinSatisfying () {
	if (hasRequiredMinSatisfying) return minSatisfying_1;
	hasRequiredMinSatisfying = 1;
	const SemVer = requireSemver$1();
	const Range = requireRange();
	const minSatisfying = (versions, range, options) => {
	  let min = null;
	  let minSV = null;
	  let rangeObj = null;
	  try {
	    rangeObj = new Range(range, options);
	  } catch (er) {
	    return null
	  }
	  versions.forEach((v) => {
	    if (rangeObj.test(v)) {
	      // satisfies(v, range, options)
	      if (!min || minSV.compare(v) === 1) {
	        // compare(min, v, true)
	        min = v;
	        minSV = new SemVer(min, options);
	      }
	    }
	  });
	  return min
	};
	minSatisfying_1 = minSatisfying;
	return minSatisfying_1;
}

var minVersion_1;
var hasRequiredMinVersion;

function requireMinVersion () {
	if (hasRequiredMinVersion) return minVersion_1;
	hasRequiredMinVersion = 1;
	const SemVer = requireSemver$1();
	const Range = requireRange();
	const gt = requireGt();

	const minVersion = (range, loose) => {
	  range = new Range(range, loose);

	  let minver = new SemVer('0.0.0');
	  if (range.test(minver)) {
	    return minver
	  }

	  minver = new SemVer('0.0.0-0');
	  if (range.test(minver)) {
	    return minver
	  }

	  minver = null;
	  for (let i = 0; i < range.set.length; ++i) {
	    const comparators = range.set[i];

	    let setMin = null;
	    comparators.forEach((comparator) => {
	      // Clone to avoid manipulating the comparator's semver object.
	      const compver = new SemVer(comparator.semver.version);
	      switch (comparator.operator) {
	        case '>':
	          if (compver.prerelease.length === 0) {
	            compver.patch++;
	          } else {
	            compver.prerelease.push(0);
	          }
	          compver.raw = compver.format();
	          /* fallthrough */
	        case '':
	        case '>=':
	          if (!setMin || gt(compver, setMin)) {
	            setMin = compver;
	          }
	          break
	        case '<':
	        case '<=':
	          /* Ignore maximum versions */
	          break
	        /* istanbul ignore next */
	        default:
	          throw new Error(`Unexpected operation: ${comparator.operator}`)
	      }
	    });
	    if (setMin && (!minver || gt(minver, setMin))) {
	      minver = setMin;
	    }
	  }

	  if (minver && range.test(minver)) {
	    return minver
	  }

	  return null
	};
	minVersion_1 = minVersion;
	return minVersion_1;
}

var valid;
var hasRequiredValid;

function requireValid () {
	if (hasRequiredValid) return valid;
	hasRequiredValid = 1;
	const Range = requireRange();
	const validRange = (range, options) => {
	  try {
	    // Return '*' instead of '' so that truthiness works.
	    // This will throw if it's invalid anyway
	    return new Range(range, options).range || '*'
	  } catch (er) {
	    return null
	  }
	};
	valid = validRange;
	return valid;
}

var outside_1;
var hasRequiredOutside;

function requireOutside () {
	if (hasRequiredOutside) return outside_1;
	hasRequiredOutside = 1;
	const SemVer = requireSemver$1();
	const Comparator = requireComparator();
	const { ANY } = Comparator;
	const Range = requireRange();
	const satisfies = requireSatisfies();
	const gt = requireGt();
	const lt = requireLt();
	const lte = requireLte();
	const gte = requireGte();

	const outside = (version, range, hilo, options) => {
	  version = new SemVer(version, options);
	  range = new Range(range, options);

	  let gtfn, ltefn, ltfn, comp, ecomp;
	  switch (hilo) {
	    case '>':
	      gtfn = gt;
	      ltefn = lte;
	      ltfn = lt;
	      comp = '>';
	      ecomp = '>=';
	      break
	    case '<':
	      gtfn = lt;
	      ltefn = gte;
	      ltfn = gt;
	      comp = '<';
	      ecomp = '<=';
	      break
	    default:
	      throw new TypeError('Must provide a hilo val of "<" or ">"')
	  }

	  // If it satisfies the range it is not outside
	  if (satisfies(version, range, options)) {
	    return false
	  }

	  // From now on, variable terms are as if we're in "gtr" mode.
	  // but note that everything is flipped for the "ltr" function.

	  for (let i = 0; i < range.set.length; ++i) {
	    const comparators = range.set[i];

	    let high = null;
	    let low = null;

	    comparators.forEach((comparator) => {
	      if (comparator.semver === ANY) {
	        comparator = new Comparator('>=0.0.0');
	      }
	      high = high || comparator;
	      low = low || comparator;
	      if (gtfn(comparator.semver, high.semver, options)) {
	        high = comparator;
	      } else if (ltfn(comparator.semver, low.semver, options)) {
	        low = comparator;
	      }
	    });

	    // If the edge version comparator has a operator then our version
	    // isn't outside it
	    if (high.operator === comp || high.operator === ecomp) {
	      return false
	    }

	    // If the lowest version comparator has an operator and our version
	    // is less than it then it isn't higher than the range
	    if ((!low.operator || low.operator === comp) &&
	        ltefn(version, low.semver)) {
	      return false
	    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
	      return false
	    }
	  }
	  return true
	};

	outside_1 = outside;
	return outside_1;
}

var gtr_1;
var hasRequiredGtr;

function requireGtr () {
	if (hasRequiredGtr) return gtr_1;
	hasRequiredGtr = 1;
	// Determine if version is greater than all the versions possible in the range.
	const outside = requireOutside();
	const gtr = (version, range, options) => outside(version, range, '>', options);
	gtr_1 = gtr;
	return gtr_1;
}

var ltr_1;
var hasRequiredLtr;

function requireLtr () {
	if (hasRequiredLtr) return ltr_1;
	hasRequiredLtr = 1;
	const outside = requireOutside();
	// Determine if version is less than all the versions possible in the range
	const ltr = (version, range, options) => outside(version, range, '<', options);
	ltr_1 = ltr;
	return ltr_1;
}

var intersects_1;
var hasRequiredIntersects;

function requireIntersects () {
	if (hasRequiredIntersects) return intersects_1;
	hasRequiredIntersects = 1;
	const Range = requireRange();
	const intersects = (r1, r2, optio   ns) => {
	  r1 = new Range(r1, options);
	  r2 = new Range(r2, options);
	  return r1.intersects(r2, options)
	};
	intersects_1 = intersects;
	return intersects_1;
}

var simplify;
var hasRequiredSimplify;

function requireSimplify () {
	if (hasRequiredSimplify) return simplify;
	hasRequiredSimplify = 1;
	// given a set of versions and a range, create a "simplified" range
	// that includes the same versions that the original range does
	// If the original range is shorter than the simplified one, return that.
	const satisfies = requireSatisfies();
	const compare = requireCompare();
	simplify = (versions, range, options) => {
	  const set = [];
	  let first = null;
	  let prev = null;
	  const v = versions.sort((a, b) => compare(a, b, options));
	  for (const version of v) {
	    const included = satisfies(version, range, options);
	    if (included) {
	      prev = version;
	      if (!first) {
	        first = version;
	      }
	    } else {
	      if (prev) {
	        set.push([first, prev]);
	      }
	      prev = null;
	      first = null;
	    }
	  }
	  if (first) {
	    set.push([first, null]);
	  }

	  const ranges = [];
	  for (const [min, max] of set) {
	    if (min === max) {
	      ranges.push(min);
	    } else if (!max && min === v[0]) {
	      ranges.push('*');
	    } else if (!max) {
	      ranges.push(`>=${min}`);
	    } else if (min === v[0]) {
	      ranges.push(`<=${max}`);
	    } else {
	      ranges.push(`${min} - ${max}`);
	    }
	  }
	  const simplified = ranges.join(' || ');
	  const original = typeof range.raw === 'string' ? range.raw : String(range);
	  return simplified.length < original.length ? simplified : range
	};
	return simplify;
}

var subset_1;
var hasRequiredSubset;

function requireSubset () {
	if (hasRequiredSubset) return subset_1;
	hasRequiredSubset = 1;
	const Range = requireRange();
	const Comparator = requireComparator();
	const { ANY } = Comparator;
	const satisfies = requireSatisfies();
	const compare = requireCompare();

	// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:
	// - Every simple range `r1, r2, ...` is a null set, OR
	// - Every simple range `r1, r2, ...` which is not a null set is a subset of
	//   some `R1, R2, ...`
	//
	// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:
	// - If c is only the ANY comparator
	//   - If C is only the ANY comparator, return true
	//   - Else if in prerelease mode, return false
	//   - else replace c with `[>=0.0.0]`
	// - If C is only the ANY comparator
	//   - if in prerelease mode, return true
	//   - else replace C with `[>=0.0.0]`
	// - Let EQ be the set of = comparators in c
	// - If EQ is more than one, return true (null set)
	// - Let GT be the highest > or >= comparator in c
	// - Let LT be the lowest < or <= comparator in c
	// - If GT and LT, and GT.semver > LT.semver, return true (null set)
	// - If any C is a = range, and GT or LT are set, return false
	// - If EQ
	//   - If GT, and EQ does not satisfy GT, return true (null set)
	//   - If LT, and EQ does not satisfy LT, return true (null set)
	//   - If EQ satisfies every C, return true
	//   - Else return false
	// - If GT
	//   - If GT.semver is lower than any > or >= comp in C, return false
	//   - If GT is >=, and GT.semver does not satisfy every C, return false
	//   - If GT.semver has a prerelease, and not in prerelease mode
	//     - If no C has a prerelease and the GT.semver tuple, return false
	// - If LT
	//   - If LT.semver is greater than any < or <= comp in C, return false
	//   - If LT is <=, and LT.semver does not satisfy every C, return false
	//   - If GT.semver has a prerelease, and not in prerelease mode
	//     - If no C has a prerelease and the LT.semver tuple, return false
	// - Else return true

	const subset = (sub, dom, options = {}) => {
	  if (sub === dom) {
	    return true
	  }

	  sub = new Range(sub, options);
	  dom = new Range(dom, options);
	  let sawNonNull = false;

	  OUTER: for (const simpleSub of sub.set) {
	    for (const simpleDom of dom.set) {
	      const isSub = simpleSubset(simpleSub, simpleDom, options);
	      sawNonNull = sawNonNull || isSub !== null;
	      if (isSub) {
	        continue OUTER
	      }
	    }
	    // the null set is a subset of everything, but null simple ranges in
	    // a complex range should be ignored.  so if we saw a non-null range,
	    // then we know this isn't a subset, but if EVERY simple range was null,
	    // then it is a subset.
	    if (sawNonNull) {
	      return false
	    }
	  }
	  return true
	};

	const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')];
	const minimumVersion = [new Comparator('>=0.0.0')];

	const simpleSubset = (sub, dom, options) => {
	  if (sub === dom) {
	    return true
	  }

	  if (sub.length === 1 && sub[0].semver === ANY) {
	    if (dom.length === 1 && dom[0].semver === ANY) {
	      return true
	    } else if (options.includePrerelease) {
	      sub = minimumVersionWithPreRelease;
	    } else {
	      sub = minimumVersion;
	    }
	  }

	  if (dom.length === 1 && dom[0].semver === ANY) {
	    if (options.includePrerelease) {
	      return true
	    } else {
	      dom = minimumVersion;
	    }
	  }

	  const eqSet = new Set();
	  let gt, lt;
	  for (const c of sub) {
	    if (c.operator === '>' || c.operator === '>=') {
	      gt = higherGT(gt, c, options);
	    } else if (c.operator === '<' || c.operator === '<=') {
	      lt = lowerLT(lt, c, options);
	    } else {
	      eqSet.add(c.semver);
	    }
	  }

	  if (eqSet.size > 1) {
	    return null
	  }

	  let gtltComp;
	  if (gt && lt) {
	    gtltComp = compare(gt.semver, lt.semver, options);
	    if (gtltComp > 0) {
	      return null
	    } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {
	      return null
	    }
	  }

	  // will iterate one or zero times
	  for (const eq of eqSet) {
	    if (gt && !satisfies(eq, String(gt), options)) {
	      return null
	    }

	    if (lt && !satisfies(eq, String(lt), options)) {
	      return null
	    }

	    for (const c of dom) {
	      if (!satisfies(eq, String(c), options)) {
	        return false
	      }
	    }

	    return true
	  }

	  let higher, lower;
	  let hasDomLT, hasDomGT;
	  // if the subset has a prerelease, we need a comparator in the superset
	  // with the same tuple and a prerelease, or it's not a subset
	  let needDomLTPre = lt &&
	    !options.includePrerelease &&
	    lt.semver.prerelease.length ? lt.semver : false;
	  let needDomGTPre = gt &&
	    !options.includePrerelease &&
	    gt.semver.prerelease.length ? gt.semver : false;
	  // exception: <1.2.3-0 is the same as <1.2.3
	  if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&
	      lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {
	    needDomLTPre = false;
	  }

	  for (const c of dom) {
	    hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>=';
	    hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<=';
	    if (gt) {
	      if (needDomGTPre) {
	        if (c.semver.prerelease && c.semver.prerelease.length &&
	            c.semver.major === needDomGTPre.major &&
	            c.semver.minor === needDomGTPre.minor &&
	            c.semver.patch === needDomGTPre.patch) {
	          needDomGTPre = false;
	        }
	      }
	      if (c.operator === '>' || c.operator === '>=') {
	        higher = higherGT(gt, c, options);
	        if (higher === c && higher !== gt) {
	          return false
	        }
	      } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {
	        return false
	      }
	    }
	    if (lt) {
	      if (needDomLTPre) {
	        if (c.semver.prerelease && c.semver.prerelease.length &&
	            c.semver.major === needDomLTPre.major &&
	            c.semver.minor === needDomLTPre.minor &&
	            c.semver.patch === needDomLTPre.patch) {
	          needDomLTPre = false;
	        }
	      }
	      if (c.operator === '<' || c.operator === '<=') {
	        lower = lowerLT(lt, c, options);
	        if (lower === c && lower !== lt) {
	          return false
	        }
	      } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {
	        return false
	      }
	    }
	    if (!c.operator && (lt || gt) && gtltComp !== 0) {
	      return false
	    }
	  }

	  // if there was a < or >, and nothing in the dom, then must be false
	  // UNLESS it was limited by another range in the other direction.
	  // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0
	  if (gt && hasDomLT && !lt && gtltComp !== 0) {
	    return false
	  }

	  if (lt && hasDomGT && !gt && gtltComp !== 0) {
	    return false
	  }

	  // we needed a prerelease range in a specific tuple, but didn't get one
	  // then this isn't a subset.  eg >=1.2.3-pre is not a subset of >=1.0.0,
	  // because it includes prereleases in the 1.2.3 tuple
	  if (needDomGTPre || needDomLTPre) {
	    return false
	  }

	  return true
	};

	// >=1.2.3 is lower than >1.2.3
	const higherGT = (a, b, options) => {
	  if (!a) {
	    return b
	  }
	  const comp = compare(a.semver, b.semver, options);
	  return comp > 0 ? a
	    : comp < 0 ? b
	    : b.operator === '>' && a.operator === '>=' ? b
	    : a
	};

	// <=1.2.3 is higher than <1.2.3
	const lowerLT = (a, b, options) => {
	  if (!a) {
	    return b
	  }
	  const comp = compare(a.semver, b.semver, options);
	  return comp < 0 ? a
	    : comp > 0 ? b
	    : b.operator === '<' && a.operator === '<=' ? b
	    : a
	};

	subset_1 = subset;
	return subset_1;
}

var semver$1;
var hasRequiredSemver;

function requireSemver () {
	if (hasRequiredSemver) return semver$1;
	hasRequiredSemver = 1;
	// just pre-load all the stuff that index.js lazily exports
	const internalRe = requireRe();
	const constants = requireConstants();
	const SemVer = requireSemver$1();
	const identifiers = requireIdentifiers();
	const parse = requireParse();
	const valid = requireValid$1();
	const clean = requireClean();
	const inc = requireInc();
	const diff = requireDiff();
	const major = requireMajor();
	const minor = requireMinor();
	const patch = requirePatch();
	const prerelease = requirePrerelease();
	const compare = requireCompare();
	const rcompare = requireRcompare();
	const compareLoose = requireCompareLoose();
	const compareBuild = requireCompareBuild();
	const sort = requireSort();
	const rsort = requireRsort();
	const gt = requireGt();
	const lt = requireLt();
	const eq = requireEq();
	const neq = requireNeq();
	const gte = requireGte();
	const lte = requireLte();
	const cmp = requireCmp();
	const coerce = requireCoerce();
	const Comparator = requireComparator();
	const Range = requireRange();
	const satisfies = requireSatisfies();
	const toComparators = requireToComparators();
	const maxSatisfying = requireMaxSatisfying();
	const minSatisfying = requireMinSatisfying();
	const minVersion = requireMinVersion();
	const validRange = requireValid();
	const outside = requireOutside();
	const gtr = requireGtr();
	const ltr = requireLtr();
	const intersects = requireIntersects();
	const simplifyRange = requireSimplify();
	const subset = requireSubset();
	semver$1 = {
	  parse,
	  valid,
	  clean,
	  inc,
	  diff,
	  major,
	  minor,
	  patch,
	  prerelease,
	  compare,
	  rcompare,
	  compareLoose,
	  compareBuild,
	  sort,
	  rsort,
	  gt,
	  lt,
	  eq,
	  neq,
	  gte,
	  lte,
	  cmp,
	  coerce,
	  Comparator,
	  Range,
	  satisfies,
	  toComparators,
	  maxSatisfying,
	  minSatisfying,
	  minVersion,
	  validRange,
	  outside,
	  gtr,
	  ltr,
	  intersects,
	  simplifyRange,
	  subset,
	  SemVer,
	  re: internalRe.re,
	  src: internalRe.src,
	  tokens: internalRe.t,
	  SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
	  RELEASE_TYPES: constants.RELEASE_TYPES,
	  compareIdentifiers: identifiers.compareIdentifiers,
	  rcompareIdentifiers: identifiers.rcompareIdentifiers,
	};
	return semver$1;
}

var semverExports = requireSemver();
var semver = /*@__PURE__*/getDefaultExportFromCjs(semverExports);

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
// Note: semver isn't available internally so this import will be commented out.
// When adding more dependencies here, the caretaker may have to update a patch internally.
/**
 * Whether a version of `@angular/core` supports a specific feature.
 * @param coreVersion Current version of core.
 * @param minVersion Minimum required version for the feature.
 */
function coreVersionSupportsFeature(coreVersion, minVersion) {
    // A version of `19.2.14` usually means that core is at head so it supports
    // all features. Use string interpolation prevent the placeholder from being replaced
    // with the current version during build time.
    if (coreVersion === `0.0.0-${'PLACEHOLDER'}`) {
        return true;
    }
    return semver.satisfies(coreVersion, minVersion, { includePrerelease: true });
}

/**
 * Discriminant type for a `CompilationTicket`.
 */
var CompilationTicketKind;
(function (CompilationTicketKind) {
    CompilationTicketKind[CompilationTicketKind["Fresh"] = 0] = "Fresh";
    CompilationTicketKind[CompilationTicketKind["IncrementalTypeScript"] = 1] = "IncrementalTypeScript";
    CompilationTicketKind[CompilationTicketKind["IncrementalResource"] = 2] = "IncrementalResource";
})(CompilationTicketKind || (CompilationTicketKind = {}));
/**
 * Create a `CompilationTicket` for a brand new compilation, using no prior state.
 */
function freshCompilationTicket(tsProgram, options, incrementalBuildStrategy, programDriver, perfRecorder, enableTemplateTypeChecker, usePoisonedData) {
    return {
        kind: CompilationTicketKind.Fresh,
        tsProgram,
        options,
        incrementalBuildStrategy,
        programDriver,
        enableTemplateTypeChecker,
        usePoisonedData,
        perfRecorder: perfRecorder ?? ActivePerfRecorder.zeroedToNow(),
    };
}
/**
 * Create a `CompilationTicket` as efficiently as possible, based on a previous `NgCompiler`
 * instance and a new `ts.Program`.
 */
function incrementalFromCompilerTicket(oldCompiler, newProgram, incrementalBuildStrategy, programDriver, modifiedResourceFiles, perfRecorder) {
    const oldProgram = oldCompiler.getCurrentProgram();
    const oldState = oldCompiler.incrementalStrategy.getIncrementalState(oldProgram);
    if (oldState === null) {
        // No incremental step is possible here, since no IncrementalState was found for the old
        // program.
        return freshCompilationTicket(newProgram, oldCompiler.options, incrementalBuildStrategy, programDriver, perfRecorder, oldCompiler.enableTemplateTypeChecker, oldCompiler.usePoisonedData);
    }
    if (perfRecorder === null) {
        perfRecorder = ActivePerfRecorder.zeroedToNow();
    }
    const incrementalCompilation = IncrementalCompilation.incremental(newProgram, versionMapFromProgram(newProgram, programDriver), oldProgram, oldState, modifiedResourceFiles, perfRecorder);
    return {
        kind: CompilationTicketKind.IncrementalTypeScript,
        enableTemplateTypeChecker: oldCompiler.enableTemplateTypeChecker,
        usePoisonedData: oldCompiler.usePoisonedData,
        options: oldCompiler.options,
        incrementalBuildStrategy,
        incrementalCompilation,
        programDriver,
        newProgram,
        perfRecorder,
    };
}
/**
 * The heart of the Angular Ivy compiler.
 *
 * The `NgCompiler` provides an API for performing Angular compilation within a custom TypeScript
 * compiler. Each instance of `NgCompiler` supports a single compilation, which might be
 * incremental.
 *
 * `NgCompiler` is lazy, and does not perform any of the work of the compilation until one of its
 * output methods (e.g. `getDiagnostics`) is called.
 *
 * See the README.md for more information.
 */
class NgCompiler {
    adapter;
    options;
    inputProgram;
    programDriver;
    incrementalStrategy;
    incrementalCompilation;
    usePoisonedData;
    livePerfRecorder;
    /**
     * Lazily evaluated state of the compilation.
     *
     * This is created on demand by calling `ensureAnalyzed`.
     */
    compilation = null;
    /**
     * Any diagnostics related to the construction of the compilation.
     *
     * These are diagnostics which arose during setup of the host and/or program.
     */
    constructionDiagnostics = [];
    /**
     * Non-template diagnostics related to the program itself. Does not include template
     * diagnostics because the template type checker memoizes them itself.
     *
     * This is set by (and memoizes) `getNonTemplateDiagnostics`.
     */
    nonTemplateDiagnostics = null;
    closureCompilerEnabled;
    currentProgram;
    entryPoint;
    moduleResolver;
    resourceManager;
    cycleAnalyzer;
    ignoreForDiagnostics;
    ignoreForEmit;
    enableTemplateTypeChecker;
    enableBlockSyntax;
    enableLetSyntax;
    angularCoreVersion;
    enableHmr;
    implicitStandaloneValue;
    /**
     * `NgCompiler` can be reused for multiple compilations (for resource-only changes), and each
     * new compilation uses a fresh `PerfRecorder`. Thus, classes created with a lifespan of the
     * `NgCompiler` use a `DelegatingPerfRecorder` so the `PerfRecorder` they write to can be updated
     * with each fresh compilation.
     */
    delegatingPerfRecorder;
    /**
     * Convert a `CompilationTicket` into an `NgCompiler` instance for the requested compilation.
     *
     * Depending on the nature of the compilation request, the `NgCompiler` instance may be reused
     * from a previous compilation and updated with any changes, it may be a new instance which
     * incrementally reuses state from a previous compilation, or it may represent a fresh
     * compilation entirely.
     */
    static fromTicket(ticket, adapter) {
        switch (ticket.kind) {
            case CompilationTicketKind.Fresh:
                return new NgCompiler(adapter, ticket.options, ticket.tsProgram, ticket.programDriver, ticket.incrementalBuildStrategy, IncrementalCompilation.fresh(ticket.tsProgram, versionMapFromProgram(ticket.tsProgram, ticket.programDriver)), ticket.enableTemplateTypeChecker, ticket.usePoisonedData, ticket.perfRecorder);
            case CompilationTicketKind.IncrementalTypeScript:
                return new NgCompiler(adapter, ticket.options, ticket.newProgram, ticket.programDriver, ticket.incrementalBuildStrategy, ticket.incrementalCompilation, ticket.enableTemplateTypeChecker, ticket.usePoisonedData, ticket.perfRecorder);
            case CompilationTicketKind.IncrementalResource:
                const compiler = ticket.compiler;
                compiler.updateWithChangedResources(ticket.modifiedResourceFiles, ticket.perfRecorder);
                return compiler;
        }
    }
    constructor(adapter, options, inputProgram, programDriver, incrementalStrategy, incrementalCompilation, enableTemplateTypeChecker, usePoisonedData, livePerfRecorder) {
        this.adapter = adapter;
        this.options = options;
        this.inputProgram = inputProgram;
        this.programDriver = programDriver;
        this.incrementalStrategy = incrementalStrategy;
        this.incrementalCompilation = incrementalCompilation;
        this.usePoisonedData = usePoisonedData;
        this.livePerfRecorder = livePerfRecorder;
        this.angularCoreVersion = options['_angularCoreVersion'] ?? null;
        this.delegatingPerfRecorder = new DelegatingPerfRecorder(this.perfRecorder);
        this.usePoisonedData = usePoisonedData || !!options._compilePoisonedComponents;
        this.enableTemplateTypeChecker =
            enableTemplateTypeChecker || !!options._enableTemplateTypeChecker;
        // TODO(crisbeto): remove this flag and base `enableBlockSyntax` on the `angularCoreVersion`.
        this.enableBlockSyntax = options['_enableBlockSyntax'] ?? true;
        this.enableLetSyntax = options['_enableLetSyntax'] ?? true;
        // Standalone by default is enabled since v19. We need to toggle it here,
        // because the language service extension may be running with the latest
        // version of the compiler against an older version of Angular.
        this.implicitStandaloneValue =
            this.angularCoreVersion === null ||
                coreVersionSupportsFeature(this.angularCoreVersion, '>= 19.0.0');
        this.enableHmr = !!options['_enableHmr'];
        this.constructionDiagnostics.push(...this.adapter.constructionDiagnostics, ...verifyCompatibleTypeCheckOptions(this.options));
        this.currentProgram = inputProgram;
        this.closureCompilerEnabled = !!this.options.annotateForClosureCompiler;
        this.entryPoint =
            adapter.entryPoint !== null ? checker.getSourceFileOrNull(inputProgram, adapter.entryPoint) : null;
        const moduleResolutionCache = ts.createModuleResolutionCache(this.adapter.getCurrentDirectory(), 
        // doen't retain a reference to `this`, if other closures in the constructor here reference
        // `this` internally then a closure created here would retain them. This can cause major
        // memory leak issues since the `moduleResolutionCache` is a long-lived object and finds its
        // way into all kinds of places inside TS internal objects.
        this.adapter.getCanonicalFileName.bind(this.adapter));
        this.moduleResolver = new ModuleResolver(inputProgram, this.options, this.adapter, moduleResolutionCache);
        this.resourceManager = new AdapterResourceLoader(adapter, this.options);
        this.cycleAnalyzer = new CycleAnalyzer(new ImportGraph(inputProgram.getTypeChecker(), this.delegatingPerfRecorder));
        this.incrementalStrategy.setIncrementalState(this.incrementalCompilation.state, inputProgram);
        this.ignoreForDiagnostics = new Set(inputProgram.getSourceFiles().filter((sf) => this.adapter.isShim(sf)));
        this.ignoreForEmit = this.adapter.ignoreForEmit;
        let dtsFileCount = 0;
        let nonDtsFileCount = 0;
        for (const sf of inputProgram.getSourceFiles()) {
            if (sf.isDeclarationFile) {
                dtsFileCount++;
            }
            else {
                nonDtsFileCount++;
            }
        }
        livePerfRecorder.eventCount(checker.PerfEvent.InputDtsFile, dtsFileCount);
        livePerfRecorder.eventCount(checker.PerfEvent.InputTsFile, nonDtsFileCount);
    }
    get perfRecorder() {
        return this.livePerfRecorder;
    }
    updateWithChangedResources(changedResources, perfRecorder) {
        this.livePerfRecorder = perfRecorder;
        this.delegatingPerfRecorder.target = perfRecorder;
        perfRecorder.inPhase(checker.PerfPhase.ResourceUpdate, () => {
            if (this.compilation === null) {
                // Analysis hasn't happened yet, so no update is necessary - any changes to resources will
                // be captured by the initial analysis pass itself.
                return;
            }
            this.resourceManager.invalidate();
            const classesToUpdate = new Set();
            for (const resourceFile of changedResources) {
                for (const templateClass of this.getComponentsWithTemplateFile(resourceFile)) {
                    classesToUpdate.add(templateClass);
                }
                for (const styleClass of this.getComponentsWithStyleFile(resourceFile)) {
                    classesToUpdate.add(styleClass);
                }
            }
            for (const clazz of classesToUpdate) {
                this.compilation.traitCompiler.updateResources(clazz);
                if (!ts.isClassDeclaration(clazz)) {
                    continue;
                }
                this.compilation.templateTypeChecker.invalidateClass(clazz);
            }
        });
    }
    /**
     * Get the resource dependencies of a file.
     *
     * If the file is not part of the compilation, an empty array will be returned.
     */
    getResourceDependencies(file) {
        this.ensureAnalyzed();
        return this.incrementalCompilation.depGraph.getResourceDependencies(file);
    }
    /**
     * Get all Angular-related diagnostics for this compilation.
     */
    getDiagnostics() {
        const diagnostics = [...this.getNonTemplateDiagnostics()];
        // Type check code may throw fatal diagnostic errors if e.g. the type check
        // block cannot be generated. Gracefully return the associated diagnostic.
        // Note: If a fatal diagnostic is raised, do not repeat the same diagnostics
        // by running the extended template checking code, which will attempt to
        // generate the same TCB.
        try {
            diagnostics.push(...this.getTemplateDiagnostics(), ...this.runAdditionalChecks());
        }
        catch (err) {
            if (!checker.isFatalDiagnosticError(err)) {
                throw err;
            }
            diagnostics.push(err.toDiagnostic());
        }
        return this.addMessageTextDetails(diagnostics);
    }
    /**
     * Get all Angular-related diagnostics for this compilation.
     *
     * If a `ts.SourceFile` is passed, only diagnostics related to that file are returned.
     */
    getDiagnosticsForFile(file, optimizeFor) {
        const diagnostics = [
            ...this.getNonTemplateDiagnostics().filter((diag) => diag.file === file),
        ];
        // Type check code may throw fatal diagnostic errors if e.g. the type check
        // block cannot be generated. Gracefully return the associated diagnostic.
        // Note: If a fatal diagnostic is raised, do not repeat the same diagnostics
        // by running the extended template checking code, which will attempt to
        // generate the same TCB.
        try {
            diagnostics.push(...this.getTemplateDiagnosticsForFile(file, optimizeFor), ...this.runAdditionalChecks(file));
        }
        catch (err) {
            if (!checker.isFatalDiagnosticError(err)) {
                throw err;
            }
            diagnostics.push(err.toDiagnostic());
        }
        return this.addMessageTextDetails(diagnostics);
    }
    /**
     * Get all `ts.Diagnostic`s currently available that pertain to the given component.
     */
    getDiagnosticsForComponent(component) {
        const compilation = this.ensureAnalyzed();
        const ttc = compilation.templateTypeChecker;
        const diagnostics = [];
        // Type check code may throw fatal diagnostic errors if e.g. the type check
        // block cannot be generated. Gracefully return the associated diagnostic.
        // Note: If a fatal diagnostic is raised, do not repeat the same diagnostics
        // by running the extended template checking code, which will attempt to
        // generate the same TCB.
        try {
            diagnostics.push(...ttc.getDiagnosticsForComponent(component));
            const { extendedTemplateChecker, templateSemanticsChecker } = compilation;
            if (templateSemanticsChecker !== null) {
                diagnostics.push(...templateSemanticsChecker.getDiagnosticsForComponent(component));
            }
            if (this.options.strictTemplates && extendedTemplateChecker !== null) {
                diagnostics.push(...extendedTemplateChecker.getDiagnosticsForComponent(component));
            }
        }
        catch (err) {
            if (!checker.isFatalDiagnosticError(err)) {
                throw err;
            }
            diagnostics.push(err.toDiagnostic());
        }
        return this.addMessageTextDetails(diagnostics);
    }
    /**
     * Add Angular.io error guide links to diagnostics for this compilation.
     */
    addMessageTextDetails(diagnostics) {
        return diagnostics.map((diag) => {
            if (diag.code && checker.COMPILER_ERRORS_WITH_GUIDES.has(checker.ngErrorCode(diag.code))) {
                return {
                    ...diag,
                    messageText: diag.messageText +
                        `. Find more at ${ERROR_DETAILS_PAGE_BASE_URL}/NG${checker.ngErrorCode(diag.code)}`,
                };
            }
            return diag;
        });
    }
    /**
     * Get all setup-related diagnostics for this compilation.
     */
    getOptionDiagnostics() {
        return this.constructionDiagnostics;
    }
    /**
     * Get the current `ts.Program` known to this `NgCompiler`.
     *
     * Compilation begins with an input `ts.Program`, and during template type-checking operations new
     * `ts.Program`s may be produced using the `ProgramDriver`. The most recent such `ts.Program` to
     * be produced is available here.
     *
     * This `ts.Program` serves two key purposes:
     *
     * * As an incremental starting point for creating the next `ts.Program` based on files that the
     *   user has changed (for clients using the TS compiler program APIs).
     *
     * * As the "before" point for an incremental compilation invocation, to determine what's changed
     *   between the old and new programs (for all compilations).
     */
    getCurrentProgram() {
        return this.currentProgram;
    }
    getTemplateTypeChecker() {
        if (!this.enableTemplateTypeChecker) {
            throw new Error('The `TemplateTypeChecker` does not work without `enableTemplateTypeChecker`.');
        }
        return this.ensureAnalyzed().templateTypeChecker;
    }
    /**
     * Retrieves the `ts.Declaration`s for any component(s) which use the given template file.
     */
    getComponentsWithTemplateFile(templateFilePath) {
        const { resourceRegistry } = this.ensureAnalyzed();
        return resourceRegistry.getComponentsWithTemplate(checker.resolve(templateFilePath));
    }
    /**
     * Retrieves the `ts.Declaration`s for any component(s) which use the given template file.
     */
    getComponentsWithStyleFile(styleFilePath) {
        const { resourceRegistry } = this.ensureAnalyzed();
        return resourceRegistry.getComponentsWithStyle(checker.resolve(styleFilePath));
    }
    /**
     * Retrieves external resources for the given directive.
     */
    getDirectiveResources(classDecl) {
        if (!checker.isNamedClassDeclaration(classDecl)) {
            return null;
        }
        const { resourceRegistry } = this.ensureAnalyzed();
        const styles = resourceRegistry.getStyles(classDecl);
        const template = resourceRegistry.getTemplate(classDecl);
        return { styles, template };
    }
    getMeta(classDecl) {
        if (!checker.isNamedClassDeclaration(classDecl)) {
            return null;
        }
        const ref = new checker.Reference(classDecl);
        const { metaReader } = this.ensureAnalyzed();
        const meta = metaReader.getPipeMetadata(ref) ?? metaReader.getDirectiveMetadata(ref);
        if (meta === null) {
            return null;
        }
        return meta;
    }
    /**
     * Perform Angular's analysis step (as a precursor to `getDiagnostics` or `prepareEmit`)
     * asynchronously.
     *
     * Normally, this operation happens lazily whenever `getDiagnostics` or `prepareEmit` are called.
     * However, certain consumers may wish to allow for an asynchronous phase of analysis, where
     * resources such as `styleUrls` are resolved asynchronously. In these cases `analyzeAsync` must
     * be called first, and its `Promise` awaited prior to calling any other APIs of `NgCompiler`.
     */
    async analyzeAsync() {
        if (this.compilation !== null) {
            return;
        }
        await this.perfRecorder.inPhase(checker.PerfPhase.Analysis, async () => {
            this.compilation = this.makeCompilation();
            const promises = [];
            for (const sf of this.inputProgram.getSourceFiles()) {
                if (sf.isDeclarationFile) {
                    continue;
                }
                let analysisPromise = this.compilation.traitCompiler.analyzeAsync(sf);
                if (analysisPromise !== undefined) {
                    promises.push(analysisPromise);
                }
            }
            await Promise.all(promises);
            this.perfRecorder.memory(checker.PerfCheckpoint.Analysis);
            this.resolveCompilation(this.compilation.traitCompiler);
        });
    }
    /**
     * Fetch transformers and other information which is necessary for a consumer to `emit` the
     * program with Angular-added definitions.
     */
    prepareEmit() {
        const compilation = this.ensureAnalyzed();
        // Untag all the files, otherwise TS 5.4 may end up emitting
        // references to typecheck files (see #56945 and #57135).
        checker.untagAllTsFiles(this.inputProgram);
        const coreImportsFrom = compilation.isCore ? getR3SymbolsFile(this.inputProgram) : null;
        let importRewriter;
        if (coreImportsFrom !== null) {
            importRewriter = new R3SymbolsImportRewriter(coreImportsFrom.fileName);
        }
        else {
            importRewriter = new NoopImportRewriter();
        }
        const defaultImportTracker = new checker.DefaultImportTracker();
        const before = [
            ivyTransformFactory(compilation.traitCompiler, compilation.reflector, importRewriter, defaultImportTracker, compilation.localCompilationExtraImportsTracker, this.delegatingPerfRecorder, compilation.isCore, this.closureCompilerEnabled),
            aliasTransformFactory(compilation.traitCompiler.exportStatements),
            defaultImportTracker.importPreservingTransformer(),
        ];
        // If there are JIT declarations, wire up the JIT transform and efficiently
        // run it against the target declarations.
        if (compilation.supportJitMode && compilation.jitDeclarationRegistry.jitDeclarations.size > 0) {
            const { jitDeclarations } = compilation.jitDeclarationRegistry;
            const jitDeclarationsArray = Array.from(jitDeclarations);
            const jitDeclarationOriginalNodes = new Set(jitDeclarationsArray.map((d) => ts.getOriginalNode(d)));
            const sourceFilesWithJit = new Set(jitDeclarationsArray.map((d) => d.getSourceFile().fileName));
            before.push((ctx) => {
                const reflectionHost = new checker.TypeScriptReflectionHost(this.inputProgram.getTypeChecker());
                const jitTransform = angularJitApplicationTransform(this.inputProgram, compilation.isCore, (node) => {
                    // Class may be synthetic at this point due to Ivy transform.
                    node = ts.getOriginalNode(node, ts.isClassDeclaration);
                    return reflectionHost.isClass(node) && jitDeclarationOriginalNodes.has(node);
                })(ctx);
                return (sourceFile) => {
                    if (!sourceFilesWithJit.has(sourceFile.fileName)) {
                        return sourceFile;
                    }
                    return jitTransform(sourceFile);
                };
            });
        }
        const afterDeclarations = [];
        // In local compilation mode we don't make use of .d.ts files for Angular compilation, so their
        // transformation can be ditched.
        if (this.options.compilationMode !== 'experimental-local' &&
            compilation.dtsTransforms !== null) {
            afterDeclarations.push(declarationTransformFactory(compilation.dtsTransforms, compilation.reflector, compilation.refEmitter, importRewriter));
        }
        // Only add aliasing re-exports to the .d.ts output if the `AliasingHost` requests it.
        if (compilation.aliasingHost !== null && compilation.aliasingHost.aliasExportsInDts) {
            afterDeclarations.push(aliasTransformFactory(compilation.traitCompiler.exportStatements));
        }
        return { transformers: { before, afterDeclarations } };
    }
    /**
     * Run the indexing process and return a `Map` of all indexed components.
     *
     * See the `indexing` package for more details.
     */
    getIndexedComponents() {
        const compilation = this.ensureAnalyzed();
        const context = new IndexingContext();
        compilation.traitCompiler.index(context);
        return generateAnalysis(context);
    }
    /**
     * Gets information for the current program that may be used to generate API
     * reference documentation. This includes Angular-specific information, such
     * as component inputs and outputs.
     *
     * @param entryPoint Path to the entry point for the package for which API
     *     docs should be extracted.
     *
     * @returns A map of symbols with their associated module, eg: ApplicationRef => @angular/core
     */
    getApiDocumentation(entryPoint, privateModules) {
        const compilation = this.ensureAnalyzed();
        const checker = this.inputProgram.getTypeChecker();
        const docsExtractor = new DocsExtractor(checker, compilation.metaReader);
        const entryPointSourceFile = this.inputProgram.getSourceFiles().find((sourceFile) => {
            // TODO: this will need to be more specific than `.includes`, but the exact path comparison
            //     will be easier to figure out when the pipeline is running end-to-end.
            return sourceFile.fileName.includes(entryPoint);
        });
        if (!entryPointSourceFile) {
            throw new Error(`Entry point "${entryPoint}" not found in program sources.`);
        }
        // TODO: Technically the current directory is not the root dir.
        // Should probably be derived from the config.
        const rootDir = this.inputProgram.getCurrentDirectory();
        return docsExtractor.extractAll(entryPointSourceFile, rootDir, privateModules);
    }
    /**
     * Collect i18n messages into the `Xi18nContext`.
     */
    xi18n(ctx) {
        // Note that the 'resolve' phase is not strictly necessary for xi18n, but this is not currently
        // optimized.
        const compilation = this.ensureAnalyzed();
        compilation.traitCompiler.xi18n(ctx);
    }
    /**
     * Emits the JavaScript module that can be used to replace the metadata of a class during HMR.
     * @param node Class for which to generate the update module.
     */
    emitHmrUpdateModule(node) {
        const { traitCompiler, reflector } = this.ensureAnalyzed();
        if (!reflector.isClass(node)) {
            return null;
        }
        const callback = traitCompiler.compileHmrUpdateCallback(node);
        if (callback === null) {
            return null;
        }
        const sourceFile = node.getSourceFile();
        const printer = ts.createPrinter();
        const nodeText = printer.printNode(ts.EmitHint.Unspecified, callback, sourceFile);
        return ts.transpileModule(nodeText, {
            compilerOptions: {
                ...this.options,
                // Some module types can produce additional code (see #60795) whereas we need the
                // HMR update module to use a native `export`. Override the `target` and `module`
                // to ensure that it looks as expected.
                module: ts.ModuleKind.ES2022,
                target: ts.ScriptTarget.ES2022,
            },
            fileName: sourceFile.fileName,
            reportDiagnostics: false,
        }).outputText;
    }
    ensureAnalyzed() {
        if (this.compilation === null) {
            this.analyzeSync();
        }
        return this.compilation;
    }
    analyzeSync() {
        this.perfRecorder.inPhase(checker.PerfPhase.Analysis, () => {
            this.compilation = this.makeCompilation();
            for (const sf of this.inputProgram.getSourceFiles()) {
                if (sf.isDeclarationFile) {
                    continue;
                }
                this.compilation.traitCompiler.analyzeSync(sf);
            }
            this.perfRecorder.memory(checker.PerfCheckpoint.Analysis);
            this.resolveCompilation(this.compilation.traitCompiler);
        });
    }
    resolveCompilation(traitCompiler) {
        this.perfRecorder.inPhase(checker.PerfPhase.Resolve, () => {
            traitCompiler.resolve();
            // At this point, analysis is complete and the compiler can now calculate which files need to
            // be emitted, so do that.
            this.incrementalCompilation.recordSuccessfulAnalysis(traitCompiler);
            this.perfRecorder.memory(checker.PerfCheckpoint.Resolve);
        });
    }
    get fullTemplateTypeCheck() {
        // Determine the strictness level of type checking based on compiler options. As
        // `strictTemplates` is a superset of `fullTemplateTypeCheck`, the former implies the latter.
        // Also see `verifyCompatibleTypeCheckOptions` where it is verified that `fullTemplateTypeCheck`
        // is not disabled when `strictTemplates` is enabled.
        const strictTemplates = !!this.options.strictTemplates;
        return strictTemplates || !!this.options.fullTemplateTypeCheck;
    }
    getTypeCheckingConfig() {
        // Determine the strictness level of type checking based on compiler options. As
        // `strictTemplates` is a superset of `fullTemplateTypeCheck`, the former implies the latter.
        // Also see `verifyCompatibleTypeCheckOptions` where it is verified that `fullTemplateTypeCheck`
        // is not disabled when `strictTemplates` is enabled.
        const strictTemplates = !!this.options.strictTemplates;
        const useInlineTypeConstructors = this.programDriver.supportsInlineOperations;
        const checkTwoWayBoundEvents = this.options['_checkTwoWayBoundEvents'] ?? false;
        // Check whether the loaded version of `@angular/core` in the `ts.Program` supports unwrapping
        // writable signals for type-checking. If this check fails to find a suitable .d.ts file, fall
        // back to version detection. Only Angular versions greater than 17.2 have the necessary symbols
        // to type check signals in two-way bindings. We also allow version 0.0.0 in case somebody is
        // using Angular at head.
        let allowSignalsInTwoWayBindings = coreHasSymbol(this.inputProgram, checker.Identifiers.unwrapWritableSignal) ??
            (this.angularCoreVersion === null ||
                coreVersionSupportsFeature(this.angularCoreVersion, '>= 17.2.0'));
        // First select a type-checking configuration, based on whether full template type-checking is
        // requested.
        let typeCheckingConfig;
        if (this.fullTemplateTypeCheck) {
            typeCheckingConfig = {
                applyTemplateContextGuards: strictTemplates,
                checkQueries: false,
                checkTemplateBodies: true,
                alwaysCheckSchemaInTemplateBodies: true,
                checkTypeOfInputBindings: strictTemplates,
                honorAccessModifiersForInputBindings: false,
                checkControlFlowBodies: true,
                strictNullInputBindings: strictTemplates,
                checkTypeOfAttributes: strictTemplates,
                // Even in full template type-checking mode, DOM binding checks are not quite ready yet.
                checkTypeOfDomBindings: false,
                checkTypeOfOutputEvents: strictTemplates,
                checkTypeOfAnimationEvents: strictTemplates,
                // Checking of DOM events currently has an adverse effect on developer experience,
                // e.g. for `<input (blur)="update($event.target.value)">` enabling this check results in:
                // - error TS2531: Object is possibly 'null'.
                // - error TS2339: Property 'value' does not exist on type 'EventTarget'.
                checkTypeOfDomEvents: strictTemplates,
                checkTypeOfDomReferences: strictTemplates,
                // Non-DOM references have the correct type in View Engine so there is no strictness flag.
                checkTypeOfNonDomReferences: true,
                // Pipes are checked in View Engine so there is no strictness flag.
                checkTypeOfPipes: true,
                strictSafeNavigationTypes: strictTemplates,
                useContextGenericType: strictTemplates,
                strictLiteralTypes: true,
                enableTemplateTypeChecker: this.enableTemplateTypeChecker,
                useInlineTypeConstructors,
                // Warnings for suboptimal type inference are only enabled if in Language Service mode
                // (providing the full TemplateTypeChecker API) and if strict mode is not enabled. In strict
                // mode, the user is in full control of type inference.
                suggestionsForSuboptimalTypeInference: this.enableTemplateTypeChecker && !strictTemplates,
                controlFlowPreventingContentProjection: this.options.extendedDiagnostics?.defaultCategory || exports.DiagnosticCategoryLabel.Warning,
                unusedStandaloneImports: this.options.extendedDiagnostics?.defaultCategory || exports.DiagnosticCategoryLabel.Warning,
                allowSignalsInTwoWayBindings,
                checkTwoWayBoundEvents,
            };
        }
        else {
            typeCheckingConfig = {
                applyTemplateContextGuards: false,
                checkQueries: false,
                checkTemplateBodies: false,
                checkControlFlowBodies: false,
                // Enable deep schema checking in "basic" template type-checking mode only if Closure
                // compilation is requested, which is a good proxy for "only in google3".
                alwaysCheckSchemaInTemplateBodies: this.closureCompilerEnabled,
                checkTypeOfInputBindings: false,
                strictNullInputBindings: false,
                honorAccessModifiersForInputBindings: false,
                checkTypeOfAttributes: false,
                checkTypeOfDomBindings: false,
                checkTypeOfOutputEvents: false,
                checkTypeOfAnimationEvents: false,
                checkTypeOfDomEvents: false,
                checkTypeOfDomReferences: false,
                checkTypeOfNonDomReferences: false,
                checkTypeOfPipes: false,
                strictSafeNavigationTypes: false,
                useContextGenericType: false,
                strictLiteralTypes: false,
                enableTemplateTypeChecker: this.enableTemplateTypeChecker,
                useInlineTypeConstructors,
                // In "basic" template type-checking mode, no warnings are produced since most things are
                // not checked anyways.
                suggestionsForSuboptimalTypeInference: false,
                controlFlowPreventingContentProjection: this.options.extendedDiagnostics?.defaultCategory || exports.DiagnosticCategoryLabel.Warning,
                unusedStandaloneImports: this.options.extendedDiagnostics?.defaultCategory || exports.DiagnosticCategoryLabel.Warning,
                allowSignalsInTwoWayBindings,
                checkTwoWayBoundEvents,
            };
        }
        // Apply explicitly configured strictness flags on top of the default configuration
        // based on "fullTemplateTypeCheck".
        if (this.options.strictInputTypes !== undefined) {
            typeCheckingConfig.checkTypeOfInputBindings = this.options.strictInputTypes;
            typeCheckingConfig.applyTemplateContextGuards = this.options.strictInputTypes;
        }
        if (this.options.strictInputAccessModifiers !== undefined) {
            typeCheckingConfig.honorAccessModifiersForInputBindings =
                this.options.strictInputAccessModifiers;
        }
        if (this.options.strictNullInputTypes !== undefined) {
            typeCheckingConfig.strictNullInputBindings = this.options.strictNullInputTypes;
        }
        if (this.options.strictOutputEventTypes !== undefined) {
            typeCheckingConfig.checkTypeOfOutputEvents = this.options.strictOutputEventTypes;
            typeCheckingConfig.checkTypeOfAnimationEvents = this.options.strictOutputEventTypes;
        }
        if (this.options.strictDomEventTypes !== undefined) {
            typeCheckingConfig.checkTypeOfDomEvents = this.options.strictDomEventTypes;
        }
        if (this.options.strictSafeNavigationTypes !== undefined) {
            typeCheckingConfig.strictSafeNavigationTypes = this.options.strictSafeNavigationTypes;
        }
        if (this.options.strictDomLocalRefTypes !== undefined) {
            typeCheckingConfig.checkTypeOfDomReferences = this.options.strictDomLocalRefTypes;
        }
        if (this.options.strictAttributeTypes !== undefined) {
            typeCheckingConfig.checkTypeOfAttributes = this.options.strictAttributeTypes;
        }
        if (this.options.strictContextGenerics !== undefined) {
            typeCheckingConfig.useContextGenericType = this.options.strictContextGenerics;
        }
        if (this.options.strictLiteralTypes !== undefined) {
            typeCheckingConfig.strictLiteralTypes = this.options.strictLiteralTypes;
        }
        if (this.options.extendedDiagnostics?.checks?.controlFlowPreventingContentProjection !== undefined) {
            typeCheckingConfig.controlFlowPreventingContentProjection =
                this.options.extendedDiagnostics.checks.controlFlowPreventingContentProjection;
        }
        if (this.options.extendedDiagnostics?.checks?.unusedStandaloneImports !== undefined) {
            typeCheckingConfig.unusedStandaloneImports =
                this.options.extendedDiagnostics.checks.unusedStandaloneImports;
        }
        return typeCheckingConfig;
    }
    getTemplateDiagnostics() {
        const compilation = this.ensureAnalyzed();
        const diagnostics = [];
        // Get diagnostics for all files.
        for (const sf of this.inputProgram.getSourceFiles()) {
            if (sf.isDeclarationFile || this.adapter.isShim(sf)) {
                continue;
            }
            diagnostics.push(...compilation.templateTypeChecker.getDiagnosticsForFile(sf, checker.OptimizeFor.WholeProgram));
        }
        const program = this.programDriver.getProgram();
        this.incrementalStrategy.setIncrementalState(this.incrementalCompilation.state, program);
        this.currentProgram = program;
        return diagnostics;
    }
    getTemplateDiagnosticsForFile(sf, optimizeFor) {
        const compilation = this.ensureAnalyzed();
        // Get the diagnostics.
        const diagnostics = [];
        if (!sf.isDeclarationFile && !this.adapter.isShim(sf)) {
            diagnostics.push(...compilation.templateTypeChecker.getDiagnosticsForFile(sf, optimizeFor));
        }
        const program = this.programDriver.getProgram();
        this.incrementalStrategy.setIncrementalState(this.incrementalCompilation.state, program);
        this.currentProgram = program;
        return diagnostics;
    }
    getNonTemplateDiagnostics() {
        if (this.nonTemplateDiagnostics === null) {
            const compilation = this.ensureAnalyzed();
            this.nonTemplateDiagnostics = [...compilation.traitCompiler.diagnostics];
            if (this.entryPoint !== null && compilation.exportReferenceGraph !== null) {
                this.nonTemplateDiagnostics.push(...checkForPrivateExports(this.entryPoint, this.inputProgram.getTypeChecker(), compilation.exportReferenceGraph));
            }
        }
        return this.nonTemplateDiagnostics;
    }
    runAdditionalChecks(sf) {
        const diagnostics = [];
        const compilation = this.ensureAnalyzed();
        const { extendedTemplateChecker, templateSemanticsChecker, sourceFileValidator } = compilation;
        const files = sf ? [sf] : this.inputProgram.getSourceFiles();
        for (const sf of files) {
            if (sourceFileValidator !== null) {
                const sourceFileDiagnostics = sourceFileValidator.getDiagnosticsForFile(sf);
                if (sourceFileDiagnostics !== null) {
                    diagnostics.push(...sourceFileDiagnostics);
                }
            }
            if (templateSemanticsChecker !== null) {
                diagnostics.push(...compilation.traitCompiler.runAdditionalChecks(sf, (clazz, handler) => {
                    return handler.templateSemanticsCheck?.(clazz, templateSemanticsChecker) || null;
                }));
            }
            if (this.options.strictTemplates && extendedTemplateChecker !== null) {
                diagnostics.push(...compilation.traitCompiler.runAdditionalChecks(sf, (clazz, handler) => {
                    return handler.extendedTemplateCheck?.(clazz, extendedTemplateChecker) || null;
                }));
            }
        }
        return diagnostics;
    }
    makeCompilation() {
        const isCore = this.options._isAngularCoreCompilation ?? isAngularCorePackage(this.inputProgram);
        // Note: If this compilation builds `@angular/core`, we always build in full compilation
        // mode. Code inside the core package is always compatible with itself, so it does not
        // make sense to go through the indirection of partial compilation
        let compilationMode = checker.CompilationMode.FULL;
        if (!isCore) {
            switch (this.options.compilationMode) {
                case 'full':
                    compilationMode = checker.CompilationMode.FULL;
                    break;
                case 'partial':
                    compilationMode = checker.CompilationMode.PARTIAL;
                    break;
                case 'experimental-local':
                    compilationMode = checker.CompilationMode.LOCAL;
                    break;
            }
        }
        const checker$1 = this.inputProgram.getTypeChecker();
        const reflector = new checker.TypeScriptReflectionHost(checker$1, compilationMode === checker.CompilationMode.LOCAL);
        // Construct the ReferenceEmitter.
        let refEmitter;
        let aliasingHost = null;
        if (this.adapter.unifiedModulesHost === null ||
            (!this.options['_useHostForImportGeneration'] &&
                !this.options['_useHostForImportAndAliasGeneration'])) {
            let localImportStrategy;
            // The strategy used for local, in-project imports depends on whether TS has been configured
            // with rootDirs. If so, then multiple directories may be mapped in the same "module
            // namespace" and the logic of `LogicalProjectStrategy` is required to generate correct
            // imports which may cross these multiple directories. Otherwise, plain relative imports are
            // sufficient.
            if (this.options.rootDirs !== undefined && this.options.rootDirs.length > 0) {
                // rootDirs logic is in effect - use the `LogicalProjectStrategy` for in-project relative
                // imports.
                localImportStrategy = new checker.LogicalProjectStrategy(reflector, new checker.LogicalFileSystem([...this.adapter.rootDirs], this.adapter));
            }
            else {
                // Plain relative imports are all that's needed.
                localImportStrategy = new checker.RelativePathStrategy(reflector);
            }
            // The CompilerHost doesn't have fileNameToModuleName, so build an NPM-centric reference
            // resolution strategy.
            refEmitter = new checker.ReferenceEmitter([
                // First, try to use local identifiers if available.
                new checker.LocalIdentifierStrategy(),
                // Next, attempt to use an absolute import.
                new checker.AbsoluteModuleStrategy(this.inputProgram, checker$1, this.moduleResolver, reflector),
                // Finally, check if the reference is being written into a file within the project's .ts
                // sources, and use a relative import if so. If this fails, ReferenceEmitter will throw
                // an error.
                localImportStrategy,
            ]);
            // If an entrypoint is present, then all user imports should be directed through the
            // entrypoint and private exports are not needed. The compiler will validate that all
            // publicly visible directives/pipes are importable via this entrypoint.
            if (this.entryPoint === null && this.options.generateDeepReexports === true) {
                // No entrypoint is present and deep re-exports were requested, so configure the aliasing
                // system to generate them.
                aliasingHost = new PrivateExportAliasingHost(reflector);
            }
        }
        else {
            // The CompilerHost supports fileNameToModuleName, so use that to emit imports.
            refEmitter = new checker.ReferenceEmitter([
                // First, try to use local identifiers if available.
                new checker.LocalIdentifierStrategy(),
                // Then use aliased references (this is a workaround to StrictDeps checks).
                ...(this.options['_useHostForImportAndAliasGeneration'] ? [new AliasStrategy()] : []),
                // Then use fileNameToModuleName to emit imports.
                new checker.UnifiedModulesStrategy(reflector, this.adapter.unifiedModulesHost),
            ]);
            if (this.options['_useHostForImportAndAliasGeneration']) {
                aliasingHost = new UnifiedModulesAliasingHost(this.adapter.unifiedModulesHost);
            }
        }
        const evaluator = new PartialEvaluator(reflector, checker$1, this.incrementalCompilation.depGraph);
        const dtsReader = new DtsMetadataReader(checker$1, reflector);
        const localMetaRegistry = new LocalMetadataRegistry();
        const localMetaReader = localMetaRegistry;
        const depScopeReader = new MetadataDtsModuleScopeResolver(dtsReader, aliasingHost);
        const metaReader = new checker.CompoundMetadataReader([localMetaReader, dtsReader]);
        const ngModuleIndex = new NgModuleIndexImpl(metaReader, localMetaReader);
        const ngModuleScopeRegistry = new LocalModuleScopeRegistry(localMetaReader, metaReader, depScopeReader, refEmitter, aliasingHost);
        const standaloneScopeReader = new StandaloneComponentScopeReader(metaReader, ngModuleScopeRegistry, depScopeReader);
        const scopeReader = new CompoundComponentScopeReader([
            ngModuleScopeRegistry,
            standaloneScopeReader,
        ]);
        const semanticDepGraphUpdater = this.incrementalCompilation.semanticDepGraphUpdater;
        const metaRegistry = new CompoundMetadataRegistry([localMetaRegistry, ngModuleScopeRegistry]);
        const injectableRegistry = new InjectableClassRegistry(reflector, isCore);
        const hostDirectivesResolver = new HostDirectivesResolver(metaReader);
        const exportedProviderStatusResolver = new ExportedProviderStatusResolver(metaReader);
        const importTracker = new ImportedSymbolsTracker();
        const typeCheckScopeRegistry = new TypeCheckScopeRegistry(scopeReader, metaReader, hostDirectivesResolver);
        // If a flat module entrypoint was specified, then track references via a `ReferenceGraph` in
        // order to produce proper diagnostics for incorrectly exported directives/pipes/etc. If there
        // is no flat module entrypoint then don't pay the cost of tracking references.
        let referencesRegistry;
        let exportReferenceGraph = null;
        if (this.entryPoint !== null) {
            exportReferenceGraph = new ReferenceGraph();
            referencesRegistry = new ReferenceGraphAdapter(exportReferenceGraph);
        }
        else {
            referencesRegistry = new NoopReferencesRegistry();
        }
        const dtsTransforms = new DtsTransformRegistry();
        const resourceRegistry = new ResourceRegistry();
        const deferredSymbolsTracker = new DeferredSymbolTracker(this.inputProgram.getTypeChecker(), this.options.onlyExplicitDeferDependencyImports ?? false);
        let localCompilationExtraImportsTracker = null;
        if (compilationMode === checker.CompilationMode.LOCAL && this.options.generateExtraImportsInLocalMode) {
            localCompilationExtraImportsTracker = new LocalCompilationExtraImportsTracker(checker$1);
        }
        // Cycles are handled in full and local compilation modes by "remote scoping".
        // "Remote scoping" does not work well with tree shaking for libraries.
        // So in partial compilation mode, when building a library, a cycle will cause an error.
        const cycleHandlingStrategy = compilationMode === checker.CompilationMode.PARTIAL
            ? 1 /* CycleHandlingStrategy.Error */
            : 0 /* CycleHandlingStrategy.UseRemoteScoping */;
        const strictCtorDeps = this.options.strictInjectionParameters || false;
        const supportJitMode = this.options['supportJitMode'] ?? true;
        const supportTestBed = this.options['supportTestBed'] ?? true;
        const externalRuntimeStyles = this.options['externalRuntimeStyles'] ?? false;
        // Libraries compiled in partial mode could potentially be used with TestBed within an
        // application. Since this is not known at library compilation time, support is required to
        // prevent potential downstream application testing breakage.
        if (supportTestBed === false && compilationMode === checker.CompilationMode.PARTIAL) {
            throw new Error('TestBed support ("supportTestBed" option) cannot be disabled in partial compilation mode.');
        }
        if (supportJitMode === false && compilationMode === checker.CompilationMode.PARTIAL) {
            throw new Error('JIT mode support ("supportJitMode" option) cannot be disabled in partial compilation mode.');
        }
        // Currently forbidOrphanComponents depends on the code generated behind ngJitMode flag. Until
        // we come up with a better design for these flags, it is necessary to have the JIT mode in
        // order for forbidOrphanComponents to be able to work properly.
        if (supportJitMode === false && this.options.forbidOrphanComponents) {
            throw new Error('JIT mode support ("supportJitMode" option) cannot be disabled when forbidOrphanComponents is set to true');
        }
        const jitDeclarationRegistry = new JitDeclarationRegistry();
        // Set up the IvyCompilation, which manages state for the Ivy transformer.
        const handlers = [
            new ComponentDecoratorHandler(reflector, evaluator, metaRegistry, metaReader, scopeReader, this.adapter, ngModuleScopeRegistry, typeCheckScopeRegistry, resourceRegistry, isCore, strictCtorDeps, this.resourceManager, this.adapter.rootDirs, this.options.preserveWhitespaces || false, this.options.i18nUseExternalIds !== false, this.options.enableI18nLegacyMessageIdFormat !== false, this.usePoisonedData, this.options.i18nNormalizeLineEndingsInICUs === true, this.moduleResolver, this.cycleAnalyzer, cycleHandlingStrategy, refEmitter, referencesRegistry, this.incrementalCompilation.depGraph, injectableRegistry, semanticDepGraphUpdater, this.closureCompilerEnabled, this.delegatingPerfRecorder, hostDirectivesResolver, importTracker, supportTestBed, compilationMode, deferredSymbolsTracker, !!this.options.forbidOrphanComponents, this.enableBlockSyntax, this.enableLetSyntax, externalRuntimeStyles, localCompilationExtraImportsTracker, jitDeclarationRegistry, this.options.i18nPreserveWhitespaceForLegacyExtraction ?? true, !!this.options.strictStandalone, this.enableHmr, this.implicitStandaloneValue),
            // TODO(alxhub): understand why the cast here is necessary (something to do with `null`
            // not being assignable to `unknown` when wrapped in `Readonly`).
            new DirectiveDecoratorHandler(reflector, evaluator, metaRegistry, ngModuleScopeRegistry, metaReader, injectableRegistry, refEmitter, referencesRegistry, isCore, strictCtorDeps, semanticDepGraphUpdater, this.closureCompilerEnabled, this.delegatingPerfRecorder, importTracker, supportTestBed, compilationMode, jitDeclarationRegistry, !!this.options.strictStandalone, this.implicitStandaloneValue),
            // Pipe handler must be before injectable handler in list so pipe factories are printed
            // before injectable factories (so injectable factories can delegate to them)
            new PipeDecoratorHandler(reflector, evaluator, metaRegistry, ngModuleScopeRegistry, injectableRegistry, isCore, this.delegatingPerfRecorder, supportTestBed, compilationMode, !!this.options.generateExtraImportsInLocalMode, !!this.options.strictStandalone, this.implicitStandaloneValue),
            new InjectableDecoratorHandler(reflector, evaluator, isCore, strictCtorDeps, injectableRegistry, this.delegatingPerfRecorder, supportTestBed, compilationMode),
            new NgModuleDecoratorHandler(reflector, evaluator, metaReader, metaRegistry, ngModuleScopeRegistry, referencesRegistry, exportedProviderStatusResolver, semanticDepGraphUpdater, isCore, refEmitter, this.closureCompilerEnabled, this.options.onlyPublishPublicTypingsForNgModules ?? false, injectableRegistry, this.delegatingPerfRecorder, supportTestBed, supportJitMode, compilationMode, localCompilationExtraImportsTracker, jitDeclarationRegistry),
        ];
        const traitCompiler = new TraitCompiler(handlers, reflector, this.delegatingPerfRecorder, this.incrementalCompilation, this.options.compileNonExportedClasses !== false, compilationMode, dtsTransforms, semanticDepGraphUpdater, this.adapter);
        // Template type-checking may use the `ProgramDriver` to produce new `ts.Progra݆"ym`(s). If this
        // happens, they need to be tracked by the `NgCompiler`.
        const notifyingDriver = new NotifyingProgramDriverWrapper(this.programDriver, (program) => {
            this.incrementalStrategy.setIncrementalState(this.incrementalCompilation.state, program);
            this.currentProgram = program;
        });
        const typeCheckingConfig = this.getTypeCheckingConfig();
        const templateTypeChecker = new checker.TemplateTypeCheckerImpl(this.inputProgram, notifyingDriver, traitCompiler, typeCheckingConfig, refEmitter, reflector, this.adapter, this.incrementalCompilation, metaReader, localMetaReader, ngModuleIndex, scopeReader, typeCheckScopeRegistry, this.delegatingPerfRecorder);
        // Only construct the extended template checker if the configuration is valid and usable.
        const extendedTemplateChecker = this.constructionDiagnostics.length === 0
            ? new ExtendedTemplateCheckerImpl(templateTypeChecker, checker$1, ALL_DIAGNOSTIC_FACTORIES, this.options)
            : null;
        const templateSemanticsChecker = this.constructionDiagnostics.length === 0
            ? new TemplateSemanticsCheckerImpl(templateTypeChecker)
            : null;
        const sourceFileValidator = this.constructionDiagnostics.length === 0
            ? new SourceFileValidator(reflector, importTracker, templateTypeChecker, typeCheckingConfig)
            : null;
        return {
            isCore,
            traitCompiler,
            reflector,
            scopeRegistry: ngModuleScopeRegistry,
            dtsTransforms,
            exportReferenceGraph,
            metaReader,
            typeCheckScopeRegistry,
            aliasingHost,
            refEmitter,
            templateTypeChecker,
            resourceRegistry,
            extendedTemplateChecker,
            localCompilationExtraImportsTracker,
            jitDeclarationRegistry,
            templateSemanticsChecker,
            sourceFileValidator,
            supportJitMode,
        };
    }
}
/**
 * Determine if the given `Program` is @angular/core.
 */
function isAngularCorePackage(program) {
    // Look for its_just_angular.ts somewhere in the program.
    const r3Symbols = getR3SymbolsFile(program);
    if (r3Symbols === null) {
        return false;
    }
    // Look for the constant ITS_JUST_ANGULAR in that file.
    return r3Symbols.statements.some((stmt) => {
        // The statement must be a variable declaration statement.
        if (!ts.isVariableStatement(stmt)) {
            return false;
        }
        // It must be exported.
        const modifiers = ts.getModifiers(stmt);
        if (modifiers === undefined ||
            !modifiers.some((mod) => mod.kind === ts.SyntaxKind.ExportKeyword)) {
            return false;
        }
        // It must declare ITS_JUST_ANGULAR.
        return stmt.declarationList.declarations.some((decl) => {
            // The declaration must match the name.
            if (!ts.isIdentifier(decl.name) || decl.name.text !== 'ITS_JUST_ANGULAR') {
                return false;
            }
            // It must initialize the variable to true.
            if (decl.initializer === undefined || decl.initializer.kind !== ts.SyntaxKind.TrueKeyword) {
                return false;
            }
            // This definition matches.
            return true;
        });
    });
}
/**
 * Find the 'r3_symbols.ts' file in the given `Program`, or return `null` if it wasn't there.
 */
function getR3SymbolsFile(program) {
    return (program.getSourceFiles().find((file) => file.fileName.indexOf('r3_symbols.ts') >= 0) || null);
}
/**
 * Since "strictTemplates" is a true superset of type checking capabilities compared to
 * "fullTemplateTypeCheck", it is required that the latter is not explicitly disabled if the
 * former is enabled.
 */
function* verifyCompatibleTypeCheckOptions(options) {
    if (options.fullTemplateTypeCheck === false && options.strictTemplates === true) {
        yield makeConfigDiagnostic({
            category: ts.DiagnosticCategory.Error,
            code: checker.ErrorCode.CONFIG_STRICT_TEMPLATES_IMPLIES_FULL_TEMPLATE_TYPECHECK,
            messageText: `
Angular compiler option "strictTemplates" is enabled, however "fullTemplateTypeCheck" is disabled.

Having the "strictTemplates" flag enabled implies that "fullTemplateTypeCheck" is also enabled, so
the latter can not be explicitly disabled.

One of the following actions is required:
1. Remove the "fullTemplateTypeCheck" option.
2. Remove "strictTemplates" or set it to 'false'.

More information about the template type checking compiler options can be found in the documentation:
https://angular.dev/tools/cli/template-typecheck
      `.trim(),
        });
    }
    if (options.extendedDiagnostics && options.strictTemplates === false) {
        yield makeConfigDiagnostic({
            category: ts.DiagnosticCategory.Error,
            code: checker.ErrorCode.CONFIG_EXTENDED_DIAGNOSTICS_IMPLIES_STRICT_TEMPLATES,
            messageText: `
Angular compiler option "extendedDiagnostics" is configured, however "strictTemplates" is disabled.

Using "extendedDiagnostics" requires that "strictTemplates" is also enabled.

One of the following actions is required:
1. Remove "strictTemplates: false" to enable it.
2. Remove "extendedDiagnostics" configuration to disable them.
      `.trim(),
        });
    }
    const allowedCategoryLabels = Array.from(Object.values(exports.DiagnosticCategoryLabel));
    const defaultCategory = options.extendedDiagnostics?.defaultCategory;
    if (defaultCategory && !allowedCategoryLabels.includes(defaultCategory)) {
        yield makeConfigDiagnostic({
            category: ts.DiagnosticCategory.Error,
            code: checker.ErrorCode.CONFIG_EXTENDED_DIAGNOSTICS_UNKNOWN_CATEGORY_LABEL,
            messageText: `
Angular compiler option "extendedDiagnostics.defaultCategory" has an unknown diagnostic category: "${defaultCategory}".

Allowed diagnostic categories are:
${allowedCategoryLabels.join('\n')}
      `.trim(),
        });
    }
    for (const [checkName, category] of Object.entries(options.extendedDiagnostics?.checks ?? {})) {
        if (!SUPPORTED_DIAGNOSTIC_NAMES.has(checkName)) {
            yield makeConfigDiagnostic({
                category: ts.DiagnosticCategory.Error,
                code: checker.ErrorCode.CONFIG_EXTENDED_DIAGNOSTICS_UNKNOWN_CHECK,
                messageText: `
Angular compiler option "extendedDiagnostics.checks" has an unknown check: "${checkName}".

Allowed check names are:
${Array.from(SUPPORTED_DIAGNOSTIC_NAMES).join('\n')}
        `.trim(),
            });
        }
        if (!allowedCategoryLabels.includes(category)) {
            yield makeConfigDiagnostic({
                category: ts.DiagnosticCategory.Error,
                code: checker.ErrorCode.CONFIG_EXTENDED_DIAGNOSTICS_UNKNOWN_CATEGORY_LABEL,
                messageText: `
Angular compiler option "extendedDiagnostics.checks['${checkName}']" has an unknown diagnostic category: "${category}".

Allowed diagnostic categories are:
${allowedCategoryLabels.join('\n')}
        `.trim(),
            });
        }
    }
}
function makeConfigDiagnostic({ category, code, messageText, }) {
    return {
        category,
        code: checker.ngErrorCode(code),
        file: undefined,
        start: undefined,
        length: undefined,
        messageText,
    };
}
class ReferenceGraphAdapter {
    graph;
    constructor(graph) {
        this.graph = graph;
    }
    add(source, ...references) {
        for (const { node } of references) {
            let sourceFile = node.getSourceFile();
            if (sourceFile === undefined) {
                sourceFile = ts.getOriginalNode(node).getSourceFile();
            }
            // Only record local references (not references into .d.ts files).
            if (sourceFile === undefined || !checker.isDtsPath(sourceFile.fileName)) {
                this.graph.add(source, node);
            }
        }
    }
}
class NotifyingProgramDriverWrapper {
    delegate;
    notifyNewProgram;
    getSourceFileVersion;
    constructor(delegate, notifyNewProgram) {
        this.delegate = delegate;
        this.notifyNewProgram = notifyNewProgram;
        this.getSourceFileVersion = this.delegate.getSourceFileVersion?.bind(this);
    }
    get supportsInlineOperations() {
        return this.delegate.supportsInlineOperations;
    }
    getProgram() {
        return this.delegate.getProgram();
    }
    updateFiles(contents, updateMode) {
        this.delegate.updateFiles(contents, updateMode);
        this.notifyNewProgram(this.delegate.getProgram());
    }
}
function versionMapFromProgram(program, driver) {
    if (driver.getSourceFileVersion === undefined) {
        return null;
    }
    const versions = new Map();
    for (const possiblyRedirectedSourceFile of program.getSourceFiles()) {
        const sf = checker.toUnredirectedSourceFile(possiblyRedirectedSourceFile);
        versions.set(checker.absoluteFromSourceFile(sf), driver.getSourceFileVersion(sf));
    }
    return versions;
}

// A persistent source of bugs in CompilerHost delegation has been the addition by TS of new,
// optional methods on ts.CompilerHost. Since these methods are optional, it's not a type error that
// the delegating host doesn't implement or delegate them. This causes subtle runtime failures. No
// more. This infrastructure ensures that failing to delegate a method is a compile-time error.
/**
 * Delegates all methods of `ExtendedTsCompilerHost` to a delegate, with the exception of
 * `getSourceFile` and `fileExists` which are implemented in `NgCompilerHost`.
 *
 * If a new method is added to `ts.CompilerHost` which is not delegated, a type error will be
 * generated for this class.
 */
class DelegatingCompilerHost {
    delegate;
    createHash;
    directoryExists;
    fileNameToModuleName;
    getCancellationToken;
    getCanonicalFileName;
    getCurrentDirectory;
    getDefaultLibFileName;
    getDefaultLibLocation;
    getDirectories;
    getEnvironmentVariable;
    getModifiedResourceFiles;
    getNewLine;
    getParsedCommandLine;
    getSourceFileByPath;
    readDirectory;
    readFile;
    readResource;
    transformResource;
    realpath;
    resolveModuleNames;
    resolveTypeReferenceDirectives;
    resourceNameToFileName;
    trace;
    useCaseSensitiveFileNames;
    writeFile;
    getModuleResolutionCache;
    hasInvalidatedResolutions;
    resolveModuleNameLiterals;
    resolveTypeReferenceDirectiveReferences;
    // jsDocParsingMode is not a method like the other elements above
    // TODO: ignore usage can be dropped once 5.2 support is dropped
    get jsDocParsingMode() {
        // @ts-ignore
        return this.delegate.jsDocParsingMode;
    }
    set jsDocParsingMode(mode) {
        // @ts-ignore
        this.delegate.jsDocParsingMode = mode;
    }
    constructor(delegate) {
        this.delegate = delegate;
        // Excluded are 'getSourceFile' and 'fileExists', which are actually implemented by
        // NgCompilerHost
        // below.
        this.createHash = this.delegateMethod('createHash');
        this.directoryExists = this.delegateMethod('directoryExists');
        this.fileNameToModuleName = this.delegateMethod('fileNameToModuleName');
        this.getCancellationToken = this.delegateMethod('getCancellationToken');
        this.getCanonicalFileName = this.delegateMethod('getCanonicalFileName');
        this.getCurrentDirectory = this.delegateMethod('getCurrentDirectory');
        this.getDefaultLibFileName = this.delegateMethod('getDefaultLibFileName');
        this.getDefaultLibLocation = this.delegateMethod('getDefaultLibLocation');
        this.getDirectories = this.delegateMethod('getDirectories');
        this.getEnvironmentVariable = this.delegateMethod('getEnvironmentVariable');
        this.getModifiedResourceFiles = this.delegateMethod('getModifiedResourceFiles');
        this.getNewLine = this.delegateMethod('getNewLine');
        this.getParsedCommandLine = this.delegateMethod('getParsedCommandLine');
        this.getSourceFileByPath = this.delegateMethod('getSourceFileByPath');
        this.readDirectory = this.delegateMethod('readDirectory');
        this.readFile = this.delegateMethod('readFile');
        this.readResource = this.delegateMethod('readResource');
        this.transformResource = this.delegateMethod('transformResource');
        this.realpath = this.delegateMethod('realpath');
        this.resolveModuleNames = this.delegateMethod('resolveModuleNames');
        this.resolveTypeReferenceDirectives = this.delegateMethod('resolveTypeReferenceDirectives');
        this.resourceNameToFileName = this.delegateMethod('resourceNameToFileName');
        this.trace = this.delegateMethod('trace');
        this.useCaseSensitiveFileNames = this.delegateMethod('useCaseSensitiveFileNames');
        this.writeFile = this.delegateMethod('writeFile');
        this.getModuleResolutionCache = this.delegateMethod('getModuleResolutionCache');
        this.hasInvalidatedResolutions = this.delegateMethod('hasInvalidatedResolutions');
        this.resolveModuleNameLiterals = this.delegateMethod('resolveModuleNameLiterals');
        this.resolveTypeReferenceDirectiveReferences = this.delegateMethod('resolveTypeReferenceDirectiveReferences');
    }
    delegateMethod(name) {
        return this.delegate[name] !== undefined
            ? this.delegate[name].bind(this.delegate)
            : undefined;
    }
}
/**
 * A wrapper around `ts.CompilerHost` (plus any extension methods from `ExtendedTsCompilerHost`).
 *
 * In order for a consumer to include Angular compilation in their TypeScript compiler, the
 * `ts.Program` must be created with a host that adds Angular-specific files (e.g.
 * the template type-checking file, etc) to the compilation. `NgCompilerHost` is the
 * host implementation which supports this.
 *
 * The interface implementations here ensure that `NgCompilerHost` fully delegates to
 * `ExtendedTsCompilerHost` methods whenever present.
 */
class NgCompilerHost extends DelegatingCompilerHost {
    shimAdapter;
    shimTagger;
    entryPoint = null;
    constructionDiagnostics;
    inputFiles;
    rootDirs;
    constructor(delegate, inputFiles, rootDirs, shimAdapter, shimTagger, entryPoint, diagnostics) {
        super(delegate);
        this.shimAdapter = shimAdapter;
        this.shimTagger = shimTagger;
        this.entryPoint = entryPoint;
        this.constructionDiagnostics = diagnostics;
        this.inputFiles = [...inputFiles, ...shimAdapter.extraInputFiles];
        this.rootDirs = rootDirs;
        if (this.resolveModuleNames === undefined) {
            // In order to reuse the module resolution cache during the creation of the type-check
            // program, we'll need to provide `resolveModuleNames` if the delegate did not provide one.
            this.resolveModuleNames = this.createCachedResolveModuleNamesFunction();
        }
    }
    /**
     * Retrieves a set of `ts.SourceFile`s which should not be emitted as JS files.
     *
     * Available after this host is used to create a `ts.Program` (which causes all the files in the
     * program to be enumerated).
     */
    get ignoreForEmit() {
        return this.shimAdapter.ignoreForEmit;
    }
    /**
     * Retrieve the array of shim extension prefixes for which shims were created for each original
     * file.
     */
    get shimExtensionPrefixes() {
        return this.shimAdapter.extensionPrefixes;
    }
    /**
     * Performs cleanup that needs to happen after a `ts.Program` has been created using this host.
     */
    postProgramCreationCleanup() {
        this.shimTagger.finalize();
    }
    /**
     * Create an `NgCompilerHost` from a delegate host, an array of input filenames, and the full set
     * of TypeScript and Angular compiler options.
     */
    static wrap(delegate, inputFiles, options, oldProgram) {
        const topLevelShimGenerators = [];
        const perFileShimGenerators = [];
        const rootDirs = checker.getRootDirs(delegate, options);
        perFileShimGenerators.push(new checker.TypeCheckShimGenerator());
        let diagnostics = [];
        const normalizedTsInputFiles = [];
        for (const inputFile of inputFiles) {
            if (!checker.isNonDeclarationTsPath(inputFile)) {
                continue;
            }
            normalizedTsInputFiles.push(checker.resolve(inputFile));
        }
        let entryPoint = null;
        if (options.flatModuleOutFile != null && options.flatModuleOutFile !== '') {
            entryPoint = findFlatIndexEntryPoint(normalizedTsInputFiles);
            if (entryPoint === null) {
                // This error message talks specifically about having a single .ts file in "files". However
                // the actual logic is a bit more permissive. If a single file exists, that will be taken,
                // otherwise the highest level (shortest path) "index.ts" file will be used as the flat
                // module entry point instead. If neither of these conditions apply, the error below is
                // given.
                //
                // The user is not informed about the "index.ts" option as this behavior is deprecated -
                // an explicit entrypoint should always be specified.
                diagnostics.push({
                    category: ts.DiagnosticCategory.Error,
                    code: checker.ngErrorCode(checker.ErrorCode.CONFIG_FLAT_MODULE_NO_INDEX),
                    file: undefined,
                    start: undefined,
                    length: undefined,
                    messageText: 'Angular compiler option "flatModuleOutFile" requires one and only one .ts file in the "files" field.',
                });
            }
            else {
                const flatModuleId = options.flatModuleId || null;
                const flatModuleOutFile = normalizeSeparators(options.flatModuleOutFile);
                const flatIndexGenerator = new FlatIndexGenerator(entryPoint, flatModuleOutFile, flatModuleId);
                topLevelShimGenerators.push(flatIndexGenerator);
            }
        }
        const shimAdapter = new ShimAdapter(delegate, normalizedTsInputFiles, topLevelShimGenerators, perFileShimGenerators, oldProgram);
        const shimTagger = new ShimReferenceTagger(perFileShimGenerators.map((gen) => gen.extensionPrefix));
        return new NgCompilerHost(delegate, inputFiles, rootDirs, shimAdapter, shimTagger, entryPoint, diagnostics);
    }
    /**
     * Check whether the given `ts.SourceFile` is a shim file.
     *
     * If this returns false, the file is user-provided.
     */
    isShim(sf) {
        return checker.isShim(sf);
    }
    /**
     * Check whether the given `ts.SourceFile` is a resource file.
     *
     * This simply returns `false` for the compiler-cli since resource files are not added as root
     * files to the project.
     */
    isResource(sf) {
        return false;
    }
    getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) {
        // Is this a previously known shim?
        const shimSf = this.shimAdapter.maybeGenerate(checker.resolve(fileName));
        if (shimSf !== null) {
            // Yes, so return it.
            return shimSf;
        }
        // No, so it's a file which might need shims (or a file which doesn't exist).
        const sf = this.delegate.getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
        if (sf === undefined) {
            return undefined;
        }
        this.shimTagger.tag(sf);
        return sf;
    }
    fileExists(fileName) {
        // Consider the file as existing whenever
        //  1) it really does exist in the delegate host, or
        //  2) at least one of the shim generators recognizes it
        // Note that we can pass the file name as branded absolute fs path because TypeScript
        // internally only passes POSIX-like paths.
        //
        // Also note that the `maybeGenerate` check below checks for both `null` and `undefined`.
        return (this.delegate.fileExists(fileName) ||
            this.shimAdapter.maybeGenerate(checker.resolve(fileName)) != null);
    }
    get unifiedModulesHost() {
        return this.fileNameToModuleName !== undefined ? this : null;
    }
    createCachedResolveModuleNamesFunction() {
        const moduleResolutionCache = ts.createModuleResolutionCache(this.getCurrentDirectory(), this.getCanonicalFileName.bind(this));
        return (moduleNames, containingFile, reusedNames, redirectedReference, options) => {
            return moduleNames.map((moduleName) => {
                const module = ts.resolveModuleName(moduleName, containingFile, options, this, moduleResolutionCache, redirectedReference);
                return module.resolvedModule;
            });
        };
    }
}

/**
 * Entrypoint to the Angular Compiler (Ivy+) which sits behind the `api.Program` interface, allowing
 * it to be a drop-in replacement for the legacy View Engine compiler to tooling such as the
 * command-line main() function or the Angular CLI.
 */
class NgtscProgram {
    options;
    compiler;
    /**
     * The primary TypeScript program, which is used for analysis and emit.
     */
    tsProgram;
    host;
    incrementalStrategy;
    constructor(rootNames, options, delegateHost, oldProgram) {
        this.options = options;
        const perfRecorder = ActivePerfRecorder.zeroedToNow();
        perfRecorder.phase(checker.PerfPhase.Setup);
        // First, check whether the current TS version is supported.
        if (!options.disableTypeScriptVersionCheck) {
            verifySupportedTypeScriptVersion();
        }
        // In local compilation mode there are almost always (many) emit errors due to imports that
        // cannot be resolved. So we should emit regardless.
        if (options.compilationMode === 'experimental-local') {
            options.noEmitOnError = false;
        }
        const reuseProgram = oldProgram?.compiler.getCurrentProgram();
        this.host = NgCompilerHost.wrap(delegateHost, rootNames, options, reuseProgram ?? null);
        if (reuseProgram !== undefined) {
            // Prior to reusing the old program, restore shim tagging for all its `ts.SourceFile`s.
            // TypeScript checks the `referencedFiles` of `ts.SourceFile`s for changes when evaluating
            // incremental reuse of data from the old program, so it's important that these match in order
            // to get the most benefit out of reuse.
            checker.retagAllTsFiles(reuseProgram);
        }
        this.tsProgram = perfRecorder.inPhase(checker.PerfPhase.TypeScriptProgramCreate, () => ts.createProgram(this.host.inputFiles, options, this.host, reuseProgram));
        perfRecorder.phase(checker.PerfPhase.Unaccounted);
        perfRecorder.memory(checker.PerfCheckpoint.TypeScriptProgramCreate);
        this.host.postProgramCreationCleanup();
        const programDriver = new TsCreateProgramDriver(this.tsProgram, this.host, this.options, this.host.shimExtensionPrefixes);
        this.incrementalStrategy =
            oldProgram !== undefined
                ? oldProgram.incrementalStrategy.toNextBuildStrategy()
                : new TrackedIncrementalBuildStrategy();
        const modifiedResourceFiles = new Set();
        if (this.host.getModifiedResourceFiles !== undefined) {
            const strings = this.host.getModifiedResourceFiles();
            if (strings !== undefined) {
                for (const fileString of strings) {
                    modifiedResourceFiles.add(checker.absoluteFrom(fileString));
                }
            }
        }
        let ticket;
        if (oldProgram === undefined) {
            ticket = freshCompilationTicket(this.tsProgram, options, this.incrementalStrategy, programDriver, perfRecorder, 
            /* enableTemplateTypeChecker */ false, 
            /* usePoisonedData */ false);
        }
        else {
            ticket = incrementalFromCompilerTicket(oldProgram.compiler, this.tsProgram, this.incrementalStrategy, programDriver, modifiedResourceFiles, perfRecorder);
        }
        // Create the NgCompiler which will drive the rest of the compilation.
        this.compiler = NgCompiler.fromTicket(ticket, this.host);
    }
    getTsProgram() {
        return this.tsProgram;
    }
    getReuseTsProgram() {
        return this.compiler.getCurrentProgram();
    }
    getTsOptionDiagnostics(cancellationToken) {
        return this.compiler.perfRecorder.inPhase(checker.PerfPhase.TypeScriptDiagnostics, () => this.tsProgram.getOptionsDiagnostics(cancellationToken));
    }
    getTsSyntacticDiagnostics(sourceFile, cancellationToken) {
        return this.compiler.perfRecorder.inPhase(checker.PerfPhase.TypeScriptDiagnostics, () => {
            const ignoredFiles = this.compiler.ignoreForDiagnostics;
            let res;
            if (sourceFile !== undefined) {
                if (ignoredFiles.has(sourceFile)) {
                    return [];
                }
                res = this.tsProgram.getSyntacticDiagnostics(sourceFile, cancellationToken);
            }
            else {
                const diagnostics = [];
                for (const sf of this.tsProgram.getSourceFiles()) {
                    if (!ignoredFiles.has(sf)) {
                        diagnostics.push(...this.tsProgram.getSyntacticDiagnostics(sf, cancellationToken));
                    }
                }
                res = diagnostics;
            }
            return res;
        });
    }
    getTsSemanticDiagnostics(sourceFile, cancellationToken) {
        // No TS semantic check should be done in local compilation mode, as it is always full of errors
        // due to cross file imports.
        if (this.options.compilationMode === 'experimental-local') {
            return [];
        }
        return this.compiler.perfRecorder.inPhase(checker.PerfPhase.TypeScriptDiagnostics, () => {
            const ignoredFiles = this.compiler.ignoreForDiagnostics;
            let res;
            if (sourceFile !== undefined) {
                if (ignoredFiles.has(sourceFile)) {
                    return [];
                }
                res = this.tsProgram.getSemanticDiagnostics(sourceFile, cancellationToken);
            }
            else {
                const diagnostics = [];
                for (const sf of this.tsProgram.getSourceFiles()) {
                    if (!ignoredFiles.has(sf)) {
                        diagnostics.push(...this.tsProgram.getSemanticDiagnostics(sf, cancellationToken));
                    }
                }
                res = diagnostics;
            }
            return res;
        });
    }
    getNgOptionDiagnostics(cancellationToken) {
        return this.compiler.getOptionDiagnostics();
    }
    getNgStructuralDiagnostics(cancellationToken) {
        return [];
    }
    getNgSemanticDiagnostics(fileName, cancellationToken) {
        let sf = undefined;
        if (fileName !== undefined) {
            sf = this.tsProgram.getSourceFile(fileName);
            if (sf === undefined) {
                // There are no diagnostics for files which don't exist in the program - maybe the caller
                // has stale data?
                return [];
            }
        }
        if (sf === undefined) {
            return this.compiler.getDiagnostics();
        }
        else {
            return this.compiler.getDiagnosticsForFile(sf, checker.OptimizeFor.WholeProgram);
        }
    }
    /**
     * Ensure that the `NgCompiler` has properly analyzed the program, and allow for the asynchronous
     * loading of any resources during the process.
     *
     * This is used by the Angular CLI to allow for spawning (async) child compilations for things
     * like SASS files used in `styleUrls`.
     */
    loadNgStructureAsync() {
        return this.compiler.analyzeAsync();
    }
    listLazyRoutes(entryRoute) {
        return [];
    }
    emitXi18n() {
        const ctx = new MessageBundle(new checker.HtmlParser(), [], {}, this.options.i18nOutLocale ?? null, this.options.i18nPreserveWhitespaceForLegacyExtraction);
        this.compiler.xi18n(ctx);
        i18nExtract(this.options.i18nOutFormat ?? null, this.options.i18nOutFile ?? null, this.host, this.options, ctx, checker.resolve);
    }
    emit(opts) {
        // Check if emission of the i18n messages bundle was requested.
        if (opts !== undefined &&
            opts.emitFlags !== undefined &&
            opts.emitFlags & exports.EmitFlags.I18nBundle) {
            this.emitXi18n();
            // `api.EmitFlags` is a View Engine compiler concept. We only pay attention to the absence of
            // the other flags here if i18n emit was requested (since this is usually done in the xi18n
            // flow, where we don't want to emit JS at all).
            if (!(opts.emitFlags & exports.EmitFlags.JS)) {
                return {
                    diagnostics: [],
                    emitSkipped: true,
                    emittedFiles: [],
                };
            }
        }
        const forceEmit = opts?.forceEmit ?? false;
        this.compiler.perfRecorder.memory(checker.PerfCheckpoint.PreEmit);
        const res = this.compiler.perfRecorder.inPhase(checker.PerfPhase.TypeScriptEmit, () => {
            const { transformers } = this.compiler.prepareEmit();
            const ignoreFiles = this.compiler.ignoreForEmit;
            const emitCallback = (opts?.emitCallback ??
                defaultEmitCallback);
            const writeFile = (fileName, data, writeByteOrderMark, onError, sourceFiles) => {
                if (sourceFiles !== undefined) {
                    // Record successful writes for any `ts.SourceFile` (that's not a declaration file)
                    // that's an input to this write.
                    for (const writtenSf of sourceFiles) {
                        if (writtenSf.isDeclarationFile) {
                            continue;
                        }
                        this.compiler.incrementalCompilation.recordSuccessfulEmit(writtenSf);
                    }
                }
                this.host.writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles);
            };
            const customTransforms = opts && opts.customTransformers;
            const beforeTransforms = transformers.before || [];
            const afterDeclarationsTransforms = transformers.afterDeclarations;
            if (customTransforms !== undefined && customTransforms.beforeTs !== undefined) {
                beforeTransforms.push(...customTransforms.beforeTs);
            }
            const emitResults = [];
            for (const targetSourceFile of this.tsProgram.getSourceFiles()) {
                if (targetSourceFile.isDeclarationFile || ignoreFiles.has(targetSourceFile)) {
                    continue;
                }
                if (!forceEmit && this.compiler.incrementalCompilation.safeToSkipEmit(targetSourceFile)) {
                    this.compiler.perfRecorder.eventCount(checker.PerfEvent.EmitSkipSourceFile);
                    continue;
                }
                this.compiler.perfRecorder.eventCount(checker.PerfEvent.EmitSourceFile);
                emitResults.push(emitCallback({
                    targetSourceFile,
                    program: this.tsProgram,
                    host: this.host,
                    options: this.options,
                    emitOnlyDtsFiles: false,
                    writeFile,
                    customTransformers: {
                        before: beforeTransforms,
                        after: customTransforms && customTransforms.afterTs,
                        afterDeclarations: afterDeclarationsTransforms,
                    },
                }));
            }
            this.compiler.perfRecorder.memory(checker.PerfCheckpoint.Emit);
            // Run the emit, including a custom transformer that will downlevel the Ivy decorators in
            // code.
            return ((opts && opts.mergeEmitResultsCallback) || mergeEmitResults)(emitResults);
        });
        // Record performance analysis information to disk if we've been asked to do so.
        if (this.options.tracePerformance !== undefined) {
            const perf = this.compiler.perfRecorder.finalize();
            checker.getFileSystem().writeFile(checker.getFileSystem().resolve(this.options.tracePerformance), JSON.stringify(perf, null, 2));
        }
        return res;
    }
    getIndexedComponents() {
        return this.compiler.getIndexedComponents();
    }
    /**
     * Gets information for the current program that may be used to generate API
     * reference documentation. This includes Angular-specific information, such
     * as component inputs and outputs.
     *
     * @param entryPoint Path to the entry point for the package for which API
     *     docs should be extracted.
     */
    getApiDocumentation(entryPoint, privateModules) {
        return this.compiler.getApiDocumentation(entryPoint, privateModules);
    }
    getEmittedSourceFiles() {
        throw new Error('Method not implemented.');
    }
}
const defaultEmitCallback = ({ program, targetSourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers, }) => program.emit(targetSourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers);
function mergeEmitResults(emitResults) {
    const diagnostics = [];
    let emitSkipped = false;
    const emittedFiles = [];
    for (const er of emitResults) {
        diagnostics.push(...er.diagnostics);
        emitSkipped = emitSkipped || er.emitSkipped;
        emittedFiles.push(...(er.emittedFiles || []));
    }
    return { diagnostics, emitSkipped, emittedFiles };
}

var LogLevel;
(function (LogLevel) {
    LogLevel[LogLevel["debug"] = 0] = "debug";
    LogLevel[LogLevel["info"] = 1] = "info";
    LogLevel[LogLevel["warn"] = 2] = "warn";
    LogLevel[LogLevel["error"] = 3] = "error";
})(LogLevel || (LogLevel = {}));

checker.setFileSystem(new checker.NodeJSFileSystem());

exports.DtsMetadataReader = DtsMetadataReader;
exports.NgtscProgram = NgtscProgram;
exports.PartialEvaluator = PartialEvaluator;
exports.UNKNOWN_ERROR_CODE = UNKNOWN_ERROR_CODE;
exports.extractTemplate = extractTemplate;
G xj'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var schematics = require('@angular-devkit/schematics');
var p = require('path');
var compiler_host = require('./compiler_host-C55Cczah.cjs');
var ts = require('typescript');
var ng_decorators = require('./ng_decorators-B5HCqr20.cjs');
var imports = require('./imports-CIX-JgAN.cjs');
var nodes = require('./nodes-B16H9JUd.cjs');
var leading_space = require('./leading_space-D9nQ8UQC.cjs');
require('./checker-BwV9MjSQ.cjs');
require('os');
require('fs');
require('module');
require('url');

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/** Names of decorators that enable DI on a class declaration. */
const DECORATORS_SUPPORTING_DI = new Set([
    'Component',
    'Directive',
    'Pipe',
    'NgModule',
    'Injectable',
]);
/** Names of symbols used for DI on parameters. */
const DI_PARAM_SYMBOLS = new Set([
    'Inject',
    'Attribute',
    'Optional',
    'SkipSelf',
    'Self',
    'Host',
    'forwardRef',
]);
/** Kinds of nodes which aren't injectable when set as a type of a parameter. */
const UNINJECTABLE_TYPE_KINDS = new Set([
    ts.SyntaxKind.TrueKeyword,
    ts.SyntaxKind.FalseKeyword,
    ts.SyntaxKind.NumberKeyword,
    ts.SyntaxKind.StringKeyword,
    ts.SyntaxKind.NullKeyword,
    ts.SyntaxKind.VoidKeyword,
]);
/**
 * Finds the necessary information for the `inject` migration in a file.
 * @param sourceFile File which to analyze.
 * @param localTypeChecker Type checker scoped to the specific file.
 */
function analyzeFile(sourceFile, localTypeChecker, options) {
    const coreSpecifiers = imports.getNamedImports(sourceFile, '@angular/core');
    // Exit early if there are no Angular imports.
    if (coreSpecifiers === null || coreSpecifiers.elements.length === 0) {
        return null;
    }
    const classes = [];
    const nonDecoratorReferences = {};
    const importsToSpecifiers = coreSpecifiers.elements.reduce((map, specifier) => {
        const symbolName = (specifier.propertyName || specifier.name).text;
        if (DI_PARAM_SYMBOLS.has(symbolName)) {
            map.set(symbolName, specifier);
        }
        return map;
    }, new Map());
    sourceFile.forEachChild(function walk(node) {
        // Skip import declarations since they can throw off the identifier
        // could below and we don't care about them in this migration.
        if (ts.isImportDeclaration(node)) {
            return;
        }
        if (ts.isParameter(node)) {
            const closestConstructor = nodes.closestNode(node, ts.isConstructorDeclaration);
            // Visiting the same parameters that we're about to remove can throw off the reference
            // counting logic below. If we run into an initializer, we always visit its initializer
            // and optionally visit the modifiers/decorators if it's not due to be deleted. Note that
            // here we technically aren't dealing with the the full list of classes, but the parent class
            // will have been visited by the time we reach the parameters.
            if (node.initializer) {
                walk(node.initializer);
            }
            if (closestConstructor === null ||
                // This is meant to avoid the case where this is a
                // parameter inside a function placed in a constructor.
                !closestConstructor.parameters.includes(node) ||
                !classes.some((c) => c.constructor === closestConstructor)) {
                node.modifiers?.forEach(walk);
            }
            return;
        }
        if (ts.isIdentifier(node) && importsToSpecifiers.size > 0) {
            let symbol;
            for (const [name, specifier] of importsToSpecifiers) {
                const localName = (specifier.propertyName || specifier.name).text;
                // Quick exit if the two symbols don't match up.
                if (localName === node.text) {
                    if (!symbol) {
                        symbol = localTypeChecker.getSymbolAtLocation(node);
                        // If the symbol couldn't be resolved the first time, it won't be resolved the next
                        // time either. Stop the loop since we won't be able to get an accurate result.
                        if (!symbol || !symbol.declarations) {
                            break;
                        }
                        else if (symbol.declarations.some((decl) => decl === specifier)) {
                            nonDecoratorReferences[name] = (nonDecoratorReferences[name] || 0) + 1;
                        }
                    }
                }
            }
        }
        else if (ts.isClassDeclaration(node)) {
            const decorators = ng_decorators.getAngularDecorators(localTypeChecker, ts.getDecorators(node) || []);
            const isAbstract = !!node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AbstractKeyword);
            const supportsDI = decorators.some((dec) => DECORATORS_SUPPORTING_DI.has(dec.name));
            const constructorNode = node.members.find((member) => ts.isConstructorDeclaration(member) &&
                member.body != null &&
                member.parameters.length > 0);
            // Basic check to determine if all parameters are injectable. This isn't exhaustive, but it
            // should catch the majority of cases. An exhaustive check would require a full type checker
            // which we don't have in this migration.
            const allParamsInjectable = !!constructorNode?.parameters.every((param) => {
                if (!param.type || !UNINJECTABLE_TYPE_KINDS.has(param.type.kind)) {
                    return true;
                }
                return ng_decorators.getAngularDecorators(localTypeChecker, ts.getDecorators(param) || []).some((dec) => dec.name === 'Inject' || dec.name === 'Attribute');
            });
            // Don't migrate abstract classes by default, because
            // their parameters aren't guaranteed to be injectable.
            if (supportsDI &&
                constructorNode &&
                allParamsInjectable &&
                (!isAbstract || options.migrateAbstractClasses)) {
                classes.push({
                    node,
                    constructor: constructorNode,
                    superCall: node.heritageClauses ? findSuperCall(constructorNode) : null,
                });
            }
        }
        node.forEachChild(walk);
    });
    return { classes, nonDecoratorReferences };
}
/**
 * Returns the parameters of a function that aren't used within its body.
 * @param declaration Function in which to search for unused parameters.
 * @param localTypeChecker Type checker scoped to the file in which the function was declared.
 * @param removedStatements Statements that were already removed from the constructor.
 */
function getConstructorUnusedParameters(declaration, localTypeChecker, removedStatements) {
    const accessedTopLevelParameters = new Set();
    const topLevelParameters = new Set();
    const topLevelParameterNames = new Set();
    const unusedParams = new Set();
    // Prepare the parameters for quicker checks further down.
    for (const param of declaration.parameters) {
        if (ts.isIdentifier(param.name)) {
            topLevelParameters.add(param);
            topLevelParameterNames.add(param.name.text);
        }
    }
    if (!declaration.body) {
        return topLevelParameters;
    }
    const analyze = (node) => {
        // Don't descend into statements that were removed already.
        if (ts.isStatement(node) && removedStatements.has(node)) {
            return;
        }
        if (!ts.isIdentifier(node) || !topLevelParameterNames.has(node.text)) {
            node.forEachChild(analyze);
            return;
        }
        // Don't consider `this.<name>` accesses as being references to
        // parameters since they'll be moved to property declarations.
        if (isAccessedViaThis(node)) {
            return;
        }
        localTypeChecker.getSymbolAtLocation(node)?.declarations?.forEach((decl) => {
            if (ts.isParameter(decl) && topLevelParameters.has(decl)) {
                accessedTopLevelParameters.add(decl);
            }
            if (ts.isShorthandPropertyAssignment(decl)) {
                const symbol = localTypeChecker.getShorthandAssignmentValueSymbol(decl);
                if (symbol && symbol.valueDeclaration && ts.isParameter(symbol.valueDeclaration)) {
                    accessedTopLevelParameters.add(symbol.valueDeclaration);
                }
            }
        });
    };
    declaration.parameters.forEach((param) => {
        if (param.initializer) {
            analyze(param.initializer);
        }
    });
    declaration.body.forEachChild(analyze);
    for (const param of topLevelParameters) {
        if (!accessedTopLevelParameters.has(param)) {
            unusedParams.add(param);
        }
    }
    return unusedParams;
}
/**
 * Determines which parameters of a function declaration are used within its `super` call.
 * @param declaration Function whose parameters to search for.
 * @param superCall `super()` call within the function.
 * @param localTypeChecker Type checker scoped to the file in which the function is declared.
 */
function getSuperParameters(declaration, superCall, localTypeChecker) {
    const usedParams = new Set();
    const topLevelParameters = new Set();
    const topLevelParameterNames = new Set();
    // Prepare the parameters for quicker checks further down.
    for (const param of declaration.parameters) {
        if (ts.isIdentifier(param.name)) {
            topLevelParameters.add(param);
            topLevelParameterNames.add(param.name.text);
        }
    }
    superCall.forEachChild(function walk(node) {
        if (ts.isIdentifier(node) && topLevelParameterNames.has(node.text)) {
            localTypeChecker.getSymbolAtLocation(node)?.declarations?.forEach((decl) => {
                if (ts.isParameter(decl) && topLevelParameters.has(decl)) {
                    usedParams.add(decl);
                }
                else if (ts.isShorthandPropertyAssignment(decl) &&
                    topLevelParameterNames.has(decl.name.text)) {
                    for (const param of topLevelParameters) {
                        if (ts.isIdentifier(param.name) && decl.name.text === param.name.text) {
                            usedParams.add(param);
                            break;
                        }
                    }
                }
            });
            // Parameters referenced inside callbacks can be used directly
            // within `super` so don't descend into inline functions.
        }
        else if (!isInlineFunction(node)) {
            node.forEachChild(walk);
        }
    });
    return usedParams;
}
/**
 * Determines if a specific parameter has references to other parameters.
 * @param param Parameter to check.
 * @param allParameters All parameters of the containing function.
 * @param localTypeChecker Type checker scoped to the current file.
 */
function parameterReferencesOtherParameters(param, allParameters, localTypeChecker) {
    // A parameter can only reference other parameters through its initializer.
    if (!param.initializer || allParameters.length < 2) {
        return false;
    }
    const paramNames = new Set();
    for (const current of allParameters) {
        if (current !== param && ts.isIdentifier(current.name)) {
            paramNames.add(current.name.text);
        }
    }
    let result = false;
    const analyze = (node) => {
        if (ts.isIdentifier(node) && paramNames.has(node.text) && !isAccessedViaThis(node)) {
            const symbol = localTypeChecker.getSymbolAtLocation(node);
            const referencesOtherParam = symbol?.declarations?.some((decl) => {
                return allParameters.includes(decl);
            });
            if (referencesOtherParam) {
                result = true;
            }
        }
        if (!result) {
            node.forEachChild(analyze);
        }
    };
    analyze(param.initializer);
    return result;
}
/** Checks whether a parameter node declares a property on its class. */
function parameterDeclaresProperty(node) {
    return !!node.modifiers?.some(({ kind }) => kind === ts.SyntaxKind.PublicKeyword ||
        kind === ts.SyntaxKind.PrivateKeyword ||
        kind === ts.SyntaxKind.ProtectedKeyword ||
        kind === ts.SyntaxKind.ReadonlyKeyword);
}
/** Checks whether a type node is nullable. */
function isNullableType(node) {
    // Apparently `foo: null` is `Parameter<TypeNode<NullKeyword>>`,
    // while `foo: undefined` is `Parameter<UndefinedKeyword>`...
    if (node.kind === ts.SyntaxKind.UndefinedKeyword || node.kind === ts.SyntaxKind.VoidKeyword) {
        return true;
    }
    if (ts.isLiteralTypeNode(node)) {
        return node.literal.kind === ts.SyntaxKind.NullKeyword;
    }
    if (ts.isUnionTypeNode(node)) {
        return node.types.some(isNullableType);
    }
    return false;
}
/** Checks whether a type node has generic arguments. */
function hasGenerics(node) {
    if (ts.isTypeReferenceNode(node)) {
        return node.typeArguments != null && node.typeArguments.length > 0;
    }
    if (ts.isUnionTypeNode(node)) {
        return node.types.some(hasGenerics);
    }
    return false;
}
/** Checks whether an identifier is accessed through `this`, e.g. `this.<some identifier>`. */
function isAccessedViaThis(node) {
    return (ts.isPropertyAccessExpression(node.parent) &&
        node.parent.expression.kind === ts.SyntaxKind.ThisKeyword &&
        node.parent.name === node);
}
/** Finds a `super` call inside of a specific node. */
function findSuperCall(root) {
    let result = null;
    root.forEachChild(function find(node) {
        if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.SuperKeyword) {
            result = node;
        }
        else if (result === null) {
            node.forEachChild(find);
        }
    });
    return result;
}
/** Checks whether a node is an inline function. */
function isInlineFunction(node) {
    return (ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node) || ts.isArrowFunction(node));
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Finds class property declarations without initializers whose constructor-based initialization
 * can be inlined into the declaration spot after migrating to `inject`. For example:
 *
 * ```ts
 * private foo: number;
 *
 * constructor(private service: MyService) {
 *   this.foo = this.service.getFoo();
 * }
 * ```
 *
 * The initializer of `foo` can be inlined, because `service` will be initialized
 * before it after the `inject` migration has finished running.
 *
 * @param node Class declaration that is being migrated.
 * @param constructor Constructor declaration of the class being migrated.
 * @param localTypeChecker Type checker scoped to the current file.
 */
function findUninitializedPropertiesToCombine(node, constructor, localTypeChecker, options) {
    let toCombine = null;
    let toHoist = [];
    const membersToDeclarations = new Map();
    for (const member of node.members) {
        if (ts.isPropertyDeclaration(member) &&
            !member.initializer &&
            !ts.isComputedPropertyName(member.name)) {
            membersToDeclarations.set(member.name.text, member);
        }
    }
    if (membersToDeclarations.size === 0) {
        return null;
    }
    const memberInitializers = getMemberInitializers(constructor);
    if (memberInitializers === null) {
        return null;
    }
    const inlinableParameters = options._internalReplaceParameterReferencesInInitializers
        ? findInlinableParameterReferences(constructor, localTypeChecker)
        : new Set();
    for (const [name, decl] of membersToDeclarations.entries()) {
        if (memberInitializers.has(name)) {
            const initializer = memberInitializers.get(name);
            if (!hasLocalReferences(initializer, constructor, inlinableParameters, localTypeChecker)) {
                toCombine ??= [];
                toCombine.push({ declaration: membersToDeclarations.get(name), initializer });
            }
        }
        else {
            // Mark members that have no initializers and can't be combined to be hoisted above the
            // injected members. This is either a no-op or it allows us to avoid some patterns internally
            // like the following:
            // ```
            // class Foo {
            //   publicFoo: Foo;
            //   private privateFoo: Foo;
            //
            //   constructor() {
            //     this.initializePrivateFooSomehow();
            //     this.publicFoo = this.privateFoo;
            //   }
            // }
            // ```
            toHoist.push(decl);
        }
    }
    // If no members need to be combined, none need to be hoisted either.
    return toCombine === null ? null : { toCombine, toHoist };
}
/**
 * In some cases properties may be declared out of order, but initialized in the correct order.
 * The internal-specific migration will combine such properties which will result in a compilation
 * error, for example:
 *
 * ```ts
 * class MyClass {
 *   foo: Foo;
 *   bar: Bar;
 *
 *   constructor(bar: Bar) {
 *     this.bar = bar;
 *     this.foo = this.bar.getFoo();
 *   }
 * }
 * ```
 *
 * Will become:
 *
 * ```ts
 * class MyClass {
 *   foo: Foo = this.bar.getFoo();
 *   bar: Bar = inject(Bar);
 * }
 * ```
 *
 * This function determines if cases like this can be saved by reordering the properties so their
 * declaration order matches the order in which they're initialized.
 *
 * @param toCombine Properties that are candidates to be combined.
 * @param constructor
 */
function shouldCombineInInitializationOrder(toCombine, constructor) {
    let combinedMemberReferenceCount = 0;
    let otherMemberReferenceCount = 0;
    const injectedMemberNames = new Set();
    const combinedMemberNames = new Set();
    // Collect the name of constructor parameters that declare new properties.
    // These can be ignored since they'll be hoisted above other properties.
    constructor.parameters.forEach((param) => {
        if (parameterDeclaresProperty(param) && ts.isIdentifier(param.name)) {
            injectedMemberNames.add(param.name.text);
        }
    });
    // Collect the names of the properties being combined. We should only reorder
    // the properties if at least one of them refers to another one.
    toCombine.forEach(({ declaration: { name } }) => {
        if (ts.isStringLiteralLike(name) || ts.isIdentifier(name)) {
            combinedMemberNames.add(name.text);
        }
    });
    // Visit all the initializers and check all the property reads in the form of `this.<name>`.
    // Skip over the ones referring to injected parameters since they're going to be hoisted.
    const walkInitializer = (node) => {
        if (ts.isPropertyAccessExpression(node) && node.expression.kind === ts.SyntaxKind.ThisKeyword) {
            if (combinedMemberNames.has(node.name.text)) {
                combinedMemberReferenceCount++;
            }
            else if (!injectedMemberNames.has(node.name.text)) {
                otherMemberReferenceCount++;
            }
        }
        node.forEachChild(walkInitializer);
    };
    toCombine.forEach((candidate) => walkInitializer(candidate.initializer));
    // If at the end there is at least one reference between a combined member and another,
    // and there are no references to any other class members, we can safely reorder the
    // properties based on how they were initialized.
    return combinedMemberReferenceCount > 0 && otherMemberReferenceCount === 0;
}
/**
 * Finds the expressions from the constructor that initialize class members, for example:
 *
 * ```ts
 * private foo: number;
 *
 * constructor() {
 *   this.foo = 123;
 * }
 * ```
 *
 * @param constructor Constructor declaration being analyzed.
 */
function getMemberInitializers(constructor) {
    let memberInitializers = null;
    if (!constructor.body) {
        return memberInitializers;
    }
    // Only look at top-level constructor statements.
    for (const node of constructor.body.statements) {
        // Only look for statements in the form of `this.<name> = <expr>;` or `this[<name>] = <expr>;`.
        if (!ts.isExpressionStatement(node) ||
            !ts.isBinaryExpression(node.expression) ||
            node.expression.operatorToken.kind !== ts.SyntaxKind.EqualsToken ||
            (!ts.isPropertyAccessExpression(node.expression.left) &&
                !ts.isElementAccessExpression(node.expression.left)) ||
            node.expression.left.expression.kind !== ts.SyntaxKind.ThisKeyword) {
            continue;
        }
        let name;
        if (ts.isPropertyAccessExpression(node.expression.left)) {
            name = node.expression.left.name.text;
        }
        else if (ts.isElementAccessExpression(node.expression.left)) {
            name = ts.isStringLiteralLike(node.expression.left.argumentExpression)
                ? node.expression.left.argumentExpression.text
                : undefined;
        }
        // If the member is initialized multiple times, take the first one.
        if (name && (!memberInitializers || !memberInitializers.has(name))) {
            memberInitializers = memberInitializers || new Map();
            memberInitializers.set(name, node.expression.right);
        }
    }
    return memberInitializers;
}
/**
 * Checks if the node is an identifier that references a property from the given
 * list. Returns the property if it is.
 */
function getIdentifierReferencingProperty(node, localTypeChecker, propertyNames, properties) {
    if (!ts.isIdentifier(node) || !propertyNames.has(node.text)) {
        return undefined;
    }
    const declarations = localTypeChecker.getSymbolAtLocation(node)?.declarations;
    if (!declarations) {
        return undefined;
    }
    for (const decl of declarations) {
        if (properties.has(decl)) {
            return decl;
        }
    }
    return undefined;
}
/**
 * Returns true if the node introduces a new `this` scope (so we can't
 * reference the outer this).
 */
function introducesNewThisScope(node) {
    return (ts.isFunctionDeclaration(node) ||
        ts.isFunctionExpression(node) ||
        ts.isMethodDeclaration(node) ||
        ts.isClassDeclaration(node) ||
        ts.isClassExpression(node));
}
/**
 * Finds constructor parameter references which can be inlined as `this.prop`.
 * - prop must be a readonly property
 * - the reference can't be in a nested function where `this` might refer
 *   to something else
 */
function findInlinableParameterReferences(constructorDeclaration, localTypeChecker) {
    const eligibleProperties = constructorDeclaration.parameters.filter((p) => ts.isIdentifier(p.name) && p.modifiers?.some((s) => s.kind === ts.SyntaxKind.ReadonlyKeyword));
    const eligibleNames = new Set(eligibleProperties.map((p) => p.name.text));
    const eligiblePropertiesSet = new Set(eligibleProperties);
    function walk(node, canReferenceThis) {
        const property = getIdentifierReferencingProperty(node, localTypeChecker, eligibleNames, eligiblePropertiesSet);
        if (property && !canReferenceThis) {
            // The property is referenced in a nested context where
            // we can't use `this`, so we can't inline it.
            eligiblePropertiesSet.delete(property);
        }
        else if (introducesNewThisScope(node)) {
            canReferenceThis = false;
        }
        ts.forEachChild(node, (child) => {
            walk(child, canReferenceThis);
        });
    }
    walk(constructorDeclaration, true);
    return eligiblePropertiesSet;
}
/**
 * Determines if a node has references to local symbols defined in the constructor.
 * @param root Expression to check for local references.
 * @param constructor Constructor within which the expression is used.
 * @param localTypeChecker Type checker scoped to the current file.
 */
function hasLocalReferences(root, constructor, allowedParameters, localTypeChecker) {
    const sourceFile = root.getSourceFile();
    let hasLocalRefs = false;
    const walk = (node) => {
        // Stop searching if we know that it has local references.
        if (hasLocalRefs) {
            return;
        }
        // Skip identifiers that are accessed via `this` since they're accessing class members
        // that aren't local to the constructor. This is here primarily to catch cases like this
        // where `foo` is defined inside the constructor, but is a class member:
        // ```
        // constructor(private foo: Foo) {
        //   this.bar = this.foo.getFoo();
        // }
        // ```
        if (ts.isIdentifier(node) && !isAccessedViaThis(node)) {
            const declarations = localTypeChecker.getSymbolAtLocation(node)?.declarations;
            const isReferencingLocalSymbol = declarations?.some((decl) => 
            // The source file check is a bit redundant since the type checker
            // is local to the file, but it's inexpensive and it can prevent
            // bugs in the future if we decide to use a full type checker.
            !allowedParameters.has(decl) &&
                decl.getSourceFile() === sourceFile &&
                decl.getStart() >= constructor.getStart() &&
                decl.getEnd() <= constructor.getEnd() &&
                !isInsideInlineFunction(decl, constructor));
            if (isReferencingLocalSymbol) {
                hasLocalRefs = true;
            }
        }
        if (!hasLocalRefs) {
            node.forEachChild(walk);
        }
    };
    walk(root);
    return hasLocalRefs;
}
/**
 * Determines if a node is defined inside of an inline function.
 * @param startNode Node from which to start checking for inline functions.
 * @param boundary Node at which to stop searching.
 */
function isInsideInlineFunction(startNode, boundary) {
    let current = startNode;
    while (current) {
        if (current === boundary) {
            return false;
        }
        if (isInlineFunction(current)) {
            return true;
        }
        current = current.parent;
    }
    return false;
}

/**
 * Placeholder used to represent expressions inside the AST.
 * Includes Unicode characters to reduce the chance of collisions.
 */
const PLACEHOLDER = 'ɵɵngGeneratePlaceholderɵɵ';
/**
 * Migrates all of the classes in a `SourceFile` away from constructor injection.
 * @param sourceFile File to be migrated.
 * @param options Options that configure the migration.
 */
function migrateFile(sourceFile, options) {
    // Note: even though externally we have access to the full program with a proper type
    // checker, we create a new one that is local to the file for a couple of reasons:
    // 1. Not having to depend on a program makes running the migration internally faster and easier.
    // 2. All the necessary information for this migration is local so using a file-specific type
    //    checker should speed up the lookups.
    const localTypeChecker = getLocalTypeChecker(sourceFile);
    const analysis = analyzeFile(sourceFile, localTypeChecker, options);
    if (analysis === null || analysis.classes.length === 0) {
        return [];
    }
    const printer = ts.createPrinter();
    const tracker = new compiler_host.ChangeTracker(printer);
    analysis.classes.forEach(({ node, constructor, superCall }) => {
        const memberIndentation = leading_space.getLeadingLineWhitespaceOfNode(node.members[0]);
        const prependToClass = [];
        const afterInjectCalls = [];
        const removedStatements = new Set();
        const removedMembers = new Set();
        if (options._internalCombineMemberInitializers) {
            applyInternalOnlyChanges(node, constructor, localTypeChecker, tracker, printer, removedStatements, removedMembers, prependToClass, afterInjectCalls, memberIndentation, options);
        }
        migrateClass(node, constructor, superCall, options, memberIndentation, prependToClass, afterInjectCalls, removedStatements, removedMembers, localTypeChecker, printer, tracker);
    });
    DI_PARAM_SYMBOLS.forEach((name) => {
        // Both zero and undefined are fine here.
        if (!analysis.nonDecoratorReferences[name]) {
            tracker.removeImport(sourceFile, name, '@angular/core');
        }
    });
    return tracker.recordChanges().get(sourceFile) || [];
}
/**
 * Migrates a class away from constructor injection.
 * @param node Class to be migrated.
 * @param constructor Reference to the class' constructor node.
 * @param superCall Reference to the constructor's `super()` call, if any.
 * @param options Options used to configure the migration.
 * @param memberIndentation Indentation string of the members of the class.
 * @param prependToClass Text that should be prepended to the class.
 * @param afterInjectCalls Text that will be inserted after the newly-added `inject` calls.
 * @param removedStatements Statements that have been removed from the constructor already.
 * @param removedMembers Class members that have been removed by the migration.
 * @param localTypeChecker Type checker set up for the specific file.
 * @param printer Printer used to output AST nodes as strings.
 * @param tracker Object keeping track of the changes made to the file.
 */
function migrateClass(node, constructor, superCall, options, memberIndentation, prependToClass, afterInjectCalls, removedStatements, removedMembers, localTypeChecker, printer, tracker) {
    const sourceFile = node.getSourceFile();
    const unusedParameters = getConstructorUnusedParameters(constructor, localTypeChecker, removedStatements);
    const superParameters = superCall
        ? getSuperParameters(constructor, superCall, localTypeChecker)
        : null;
    const removedStatementCount = removedStatements.size;
    const firstConstructorStatement = constructor.body?.statements.find((statement) => !removedStatements.has(statement));
    const innerReference = superCall || firstConstructorStatement || constructor;
    const innerIndentation = leading_space.getLeadingLineWhitespaceOfNode(innerReference);
    const prependToConstructor = [];
    const afterSuper = [];
    for (const param of constructor.parameters) {
        const usedInSuper = superParameters !== null && superParameters.has(param);
        const usedInConstructor = !unusedParameters.has(param);
        const usesOtherParams = parameterReferencesOtherParameters(param, constructor.parameters, localTypeChecker);
        migrateParameter(param, options, localTypeChecker, printer, tracker, superCall, usedInSuper, usedInConstructor, usesOtherParams, memberIndentation, innerIndentation, prependToConstructor, prependToClass, afterSuper);
    }
    // Delete all of the constructor overloads since below we're either going to
    // remove the implementation, or we're going to delete all of the parameters.
    for (const member of node.members) {
        if (ts.isConstructorDeclaration(member) && member !== constructor) {
            removedMembers.add(member);
            tracker.removeNode(member, true);
        }
    }
    if (canRemoveConstructor(options, constructor, removedStatementCount, prependToConstructor, superCall)) {
        // Drop the constructor if it was empty.
        removedMembers.add(constructor);
        tracker.removeNode(constructor, true);
    }
    else {
        // If the constructor contains any statements, only remove the parameters.
        // We always do this no matter what is passed into `backwardsCompatibleConstructors`.
        stripConstructorParameters(constructor, tracker);
        if (prependToConstructor.length > 0) {
            if (firstConstructorStatement ||
                (innerReference !== constructor &&
                    innerReference.getStart() >= constructor.getStart() &&
                    innerReference.getEnd() <= constructor.getEnd())) {
                tracker.insertText(sourceFile, (firstConstructorStatement || innerReference).getFullStart(), `\n${prependToConstructor.join('\n')}\n`);
            }
            else {
                tracker.insertText(sourceFile, constructor.body.getStart() + 1, `\n${prependToConstructor.map((p) => innerIndentation + p).join('\n')}\n${innerIndentation}`);
            }
        }
    }
    if (afterSuper.length > 0 && superCall !== null) {
        // Note that if we can, we should insert before the next statement after the `super` call,
        // rather than after the end of it. Otherwise the string buffering implementation may drop
        // the text if the statement after the `super` call is being deleted. This appears to be because
        // the full start of the next statement appears to always be the end of the `super` call plus 1.
        const nextStatement = getNextPreservedStatement(superCall, removedStatements);
        tracker.insertText(sourceFile, nextStatement ? nextStatement.getFullStart() : constructor.getEnd() - 1, `\n${afterSuper.join('\n')}\n` + (nextStatement ? '' : memberIndentation));
    }
    // Need to resolve this once all constructor signatures have been removed.
    const memberReference = node.members.find((m) => !removedMembers.has(m)) || node.members[0];
    // If `backwardsCompatibleConstructors` is enabled, we maintain
    // backwards compatibility by adding a catch-all signature.
    if (options.backwardsCompatibleConstructors) {
        const extraSignature = `\n${memberIndentation}/** Inserted by Angular inject() migration for backwards compatibility */\n` +
            `${memberIndentation}constructor(...args: unknown[]);`;
        // The new signature always has to be right before the constructor implementation.
        if (memberReference === constructor) {
            prependToClass.push(extraSignature);
        }
        else {
            tracker.insertText(sourceFile, constructor.getFullStart(), '\n' + extraSignature);
        }
    }
    // Push the block of code that should appear after the `inject`
    // calls now once all the members have been generated.
    prependToClass.push(...afterInjectCalls);
    if (prependToClass.length > 0) {
        if (removedMembers.size === node.members.length) {
            tracker.insertText(sourceFile, 
            // If all members were deleted, insert after the last one.
            // This allows us to preserve the indentation.
            node.members.length > 0
                ? node.members[node.members.length - 1].getEnd() + 1
                : node.getEnd() - 1, `${prependToClass.join('\n')}\n`);
        }
        else {
            // Insert the new properties after the first member that hasn't been deleted.
            tracker.insertText(sourceFile, memberReference.getFullStart(), `\n${prependToClass.join('\n')}\n`);
        }
    }
}
/**
 * Migrates a single parameter to `inject()` DI.
 * @param node Parameter to be migrated.
 * @param options Options used to configure the migration.
 * @param localTypeChecker Type checker set up for the specific file.
 * @param printer Printer used to output AST nodes as strings.
 * @param tracker Object keeping track of the changes made to the file.
 * @param superCall Call to `super()` from the class' constructor.
 * @param usedInSuper Whether the parameter is referenced inside of `super`.
 * @param usedInConstructor Whether the parameter is referenced inside the body of the constructor.
 * @param memberIndentation Indentation string to use when inserting new class members.
 * @param innerIndentation Indentation string to use when inserting new constructor statements.
 * @param prependToConstructor Statements to be prepended to the constructor.
 * @param propsToAdd Properties to be added to the class.
 * @param afterSuper Statements to be added after the `super` call.
 */
function migrateParameter(node, options, localTypeChecker, printer, tracker, superCall, usedInSuper, usedInConstructor, usesOtherParams, memberIndentation, innerIndentation, prependToConstructor, propsToAdd, afterSuper) {
    if (!ts.isIdentifier(node.name)) {
        return;
    }
    const name = node.name.text;
    const replacementCall = createInjectReplacementCall(node, options, localTypeChecker, printer, tracker);
    const declaresProp = parameterDeclaresProperty(node);
    // If the parameter declares a property, we need to declare it (e.g. `private foo: Foo`).
    if (declaresProp) {
        // We can't initialize the property if it's referenced within a `super` call or  it references
        // other parameters. See the logic further below for the initialization.
        const canInitialize = !usedInSuper && !usesOtherParams;
        const prop = ts.factory.createPropertyDeclaration(cloneModifiers(node.modifiers?.filter((modifier) => {
            // Strip out the DI decorators, as well as `public` which is redundant.
            return !ts.isDecorator(modifier) && modifier.kind !== ts.SyntaxKind.PublicKeyword;
        })), name, 
        // Don't add the question token to private properties since it won't affect interface implementation.
        node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.PrivateKeyword)
            ? undefined
            : node.questionToken, canInitialize ? undefined : node.type, canInitialize ? ts.factory.createIdentifier(PLACEHOLDER) : undefined);
        propsToAdd.push(memberIndentation +
            replaceNodePlaceholder(node.getSourceFile(), prop, replacementCall, printer));
    }
    // If the parameter is referenced within the constructor, we need to declare it as a variable.
    if (usedInConstructor) {
        if (usedInSuper) {
            // Usages of `this` aren't allowed before `super` calls so we need to
            // create a variable which calls `inject()` directly instead...
            prependToConstructor.push(`${innerIndentation}const ${name} = ${replacementCall};`);
            // ...then we can initialize the property after the `super` call.
            if (declaresProp) {
                afterSuper.push(`${innerIndentation}this.${name} = ${name};`);
            }
        }
        else if (declaresProp) {
            // If the parameter declares a property (`private foo: foo`) and is used inside the class
            // at the same time, we need to ensure that it's initialized to the value from the variable
            // and that we only reference `this` after the `super` call.
            const initializer = `${innerIndentation}const ${name} = this.${name};`;
            if (superCall === null) {
                prependToConstructor.push(initializer);
            }
            else {
                afterSuper.push(initializer);
            }
        }
        else {
            // If the parameter is only referenced in the constructor, we
            // don't need to declare any new properties.
            prependToConstructor.push(`${innerIndentation}const ${name} = ${replacementCall};`);
        }
    }
    else if (usesOtherParams && declaresProp) {
        const toAdd = `${innerIndentation}this.${name} = ${replacementCall};`;
        if (superCall === null) {
            prependToConstructor.push(toAdd);
        }
        else {
            afterSuper.push(toAdd);
        }
    }
}
/**
 * Creates a replacement `inject` call from a function parameter.
 * @param param Parameter for which to generate the `inject` call.
 * @param options Options used to configure the migration.
 * @param localTypeChecker Type checker set up for the specific file.
 * @param printer Printer used to output AST nodes as strings.
 * @param tracker Object keeping track of the changes made to the file.
 */
function createInjectReplacementCall(param, options, localTypeChecker, printer, tracker) {
    const moduleName = '@angular/core';
    const sourceFile = param.getSourceFile();
    const decorators = ng_decorators.getAngularDecorators(localTypeChecker, ts.getDecorators(param) || []);
    const literalProps = [];
    const type = param.type;
    let injectedType = '';
    let typeArguments = type && hasGenerics(type) ? [type] : undefined;
    let hasOptionalDecorator = false;
    if (type) {
        // Remove the type arguments from generic type references, because
        // they'll be specified as type arguments to `inject()`.
        if (ts.isTypeReferenceNode(type) && type.typeArguments && type.typeArguments.length > 0) {
            injectedType = type.typeName.getText();
        }
        else if (ts.isUnionTypeNode(type)) {
            injectedType = (type.types.find((t) => !ts.isLiteralTypeNode(t)) || type.types[0]).getText();
        }
        else {
            injectedType = type.getText();
        }
    }
    for (const decorator of decorators) {
        if (decorator.moduleName !== moduleName) {
            continue;
        }
        const firstArg = decorator.node.expression.arguments[0];
        switch (decorator.name) {
            case 'Inject':
                if (firstArg) {
                    const injectResult = migrateInjectDecorator(firstArg, type, localTypeChecker);
                    injectedType = injectResult.injectedType;
                    if (injectResult.typeArguments) {
                        typeArguments = injectResult.typeArguments;
                    }
                }
                break;
            case 'Attribute':
                if (firstArg) {
                    const constructorRef = tracker.addImport(sourceFile, 'HostAttributeToken', moduleName);
                    const expression = ts.factory.createNewExpression(constructorRef, undefined, [firstArg]);
                    injectedType = printer.printNode(ts.EmitHint.Unspecified, expression, sourceFile);
                    typeArguments = undefined;
                }
                break;
            case 'Optional':
                hasOptionalDecorator = true;
                literalProps.push(ts.factory.createPropertyAssignment('optional', ts.factory.createTrue()));
                break;
            case 'SkipSelf':
                literalProps.push(ts.factory.createPropertyAssignment('skipSelf', ts.factory.createTrue()));
                break;
            case 'Self':
                literalProps.push(ts.factory.createPropertyAssignment('self', ts.factory.createTrue()));
                break;
            case 'Host':
                literalProps.push(ts.factory.createPropertyAssignment('host', ts.factory.createTrue()));
                break;
        }
    }
    // The injected type might be a `TypeNode` which we can't easily convert into an `Expression`.
    // Since the value gets passed through directly anyway, we generate the call using a placeholder
    // which we then replace with the raw text of the `TypeNode`.
    const injectRef = tracker.addImport(param.getSourceFile(), 'inject', moduleName);
    const args = [ts.factory.createIdentifier(PLACEHOLDER)];
    if (literalProps.length > 0) {
        args.push(ts.factory.createObjectLiteralExpression(literalProps));
    }
    let expression = ts.factory.createCallExpression(injectRef, typeArguments, args);
    if (hasOptionalDecorator && options.nonNullableOptional) {
        const hasNullableType = param.questionToken != null || (param.type != null && isNullableType(param.type));
        // Only wrap the expression if the type wasn't already nullable.
        // If it was, the app was likely accounting for it already.
        if (!hasNullableType) {
            expression = ts.factory.createNonNullExpression(expression);
        }
    }
    // If the parameter is initialized, add the initializer as a fallback.
    if (param.initializer) {
        expression = ts.factory.createBinaryExpression(expression, ts.SyntaxKind.QuestionQuestionToken, param.initializer);
    }
    return replaceNodePlaceholder(param.getSourceFile(), expression, injectedType, printer);
}
/**
 * Migrates a parameter based on its `@Inject()` decorator.
 * @param firstArg First argument to `@Inject()`.
 * @param type Type of the parameter.
 * @param localTypeChecker Type checker set up for the specific file.
 */
function migrateInjectDecorator(firstArg, type, localTypeChecker) {
    let injectedType = firstArg.getText();
    let typeArguments = null;
    // `inject` no longer officially supports string injection so we need
    // to cast to any. We maintain the type by passing it as a generic.
    if (ts.isStringLiteralLike(firstArg)) {
        typeArguments = [type || ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)];
        injectedType += ' as any';
    }
    else if (ts.isCallExpression(firstArg) &&
        ts.isIdentifier(firstArg.expression) &&
        firstArg.arguments.length === 1) {
        const callImport = imports.getImportOfIdentifier(localTypeChecker, firstArg.expression);
        const arrowFn = firstArg.arguments[0];
        // If the first parameter is a `forwardRef`, unwrap it for a more
        // accurate type and because it's no longer necessary.
        if (callImport !== null &&
            callImport.name === 'forwardRef' &&
            callImport.importModule === '@angular/core' &&
            ts.isArrowFunction(arrowFn)) {
            if (ts.isBlock(arrowFn.body)) {
                const returnStatement = arrowFn.body.statements.find((stmt) => ts.isReturnStatement(stmt));
                if (returnStatement && returnStatement.expression) {
                    injectedType = returnStatement.expression.getText();
                }
            }
            else {
                injectedType = arrowFn.body.getText();
            }
        }
    }
    else if (type &&
        (ts.isTypeReferenceNode(type) ||
            ts.isTypeLiteralNode(type) ||
            ts.isTupleTypeNode(type) ||
            (ts.isUnionTypeNode(type) && type.types.some(ts.isTypeReferenceNode)))) {
        typeArguments = [type];
    }
    return { injectedType, typeArguments };
}
/**
 * Removes the parameters from a constructor. This is a bit more complex than just replacing an AST
 * node, because `NodeArray.pos` includes any leading whitespace, but `NodeArray.end` does **not**
 * include trailing whitespace. Since we want to produce somewhat formatted code, we need to find
 * the end of the arguments ourselves. We do it by finding the next parenthesis after the last
 * parameter.
 * @param node Constructor from which to remove the parameters.
 * @param tracker Object keeping track of the changes made to the file.
 */
function stripConstructorParameters(node, tracker) {
    if (node.parameters.length === 0) {
        return;
    }
    const constructorText = node.getText();
    const lastParamText = node.parameters[node.parameters.length - 1].getText();
    const lastParamStart = constructorText.indexOf(lastParamText);
    // This shouldn't happen, but bail out just in case so we don't mangle the code.
    if (lastParamStart === -1) {
        return;
    }
    for (let i = lastParamStart + lastParamText.length; i < constructorText.length; i++) {
        const char = constructorText[i];
        if (char === ')') {
            tracker.replaceText(node.getSourceFile(), node.parameters.pos, node.getStart() + i - node.parameters.pos, '');
            break;
        }
    }
}
/**
 * Creates a type checker scoped to a specific file.
 * @param sourceFile File for which to create the type checker.
 */
function getLocalTypeChecker(sourceFile) {
    const options = { noEmit: true, skipLibCheck: true };
    const host = ts.createCompilerHost(options);
    host.getSourceFile = (fileName) => (fileName === sourceFile.fileName ? sourceFile : undefined);
    const program = ts.createProgram({
        rootNames: [sourceFile.fileName],
        options,
        host,
    });
    return program.getTypeChecker();
}
/**
 * Prints out an AST node and replaces the placeholder inside of it.
 * @param sourceFile File in which the node will be inserted.
 * @param node Node to be printed out.
 * @param replacement Replacement for the placeholder.
 * @param printer Printer used to output AST nodes as strings.
 */
function replaceNodePlaceholder(sourceFile, node, replacement, printer) {
    const result = printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
    return result.replace(PLACEHOLDER, replacement);
}
/**
 * Clones an optional array of modifiers. Can be useful to
 * strip the comments from a node with modifiers.
 */
function cloneModifiers(modifiers) {
    return modifiers?.map((modifier) => {
        return ts.isDecorator(modifier)
            ? ts.factory.createDecorator(modifier.expression)
            : ts.factory.createModifier(modifier.kind);
    });
}
/**
 * Clones the name of a property. Can be useful to strip away
 * the comments of a property without modifiers.
 */
function cloneName(node) {
    switch (node.kind) {
        case ts.SyntaxKind.Identifier:
            return ts.factory.createIdentifier(node.text);
        case ts.SyntaxKind.StringLiteral:
            return ts.factory.createStringLiteral(node.text, node.getText()[0] === `'`);
        case ts.SyntaxKind.NoSubstitutionTemplateLiteral:
            return ts.factory.createNoSubstitutionTemplateLiteral(node.text, node.rawText);
        case ts.SyntaxKind.NumericLiteral:
            return ts.factory.createNumericLiteral(node.text);
        case ts.SyntaxKind.ComputedPropertyName:
            return ts.factory.createComputedPropertyName(node.expression);
        case ts.SyntaxKind.PrivateIdentifier:
            return ts.factory.createPrivateIdentifier(node.text);
        default:
            return node;
    }
}
/**
 * Determines whether it's safe to delete a class constructor.
 * @param options Options used to configure the migration.
 * @param constructor Node representing the constructor.
 * @param removedStatementCount Number of statements that were removed by the migration.
 * @param prependToConstructor Statements that should be prepended to the constructor.
 * @param superCall Node representing the `super()` call within the constructor.
 */
function canRemoveConstructor(options, constructor, removedStatementCount, prependToConstructor, superCall) {
    if (options.backwardsCompatibleConstructors || prependToConstructor.length > 0) {
        return false;
    }
    const statementCount = constructor.body
        ? constructor.body.statements.length - removedStatementCount
        : 0;
    return (statementCount === 0 ||
        (statementCount === 1 && superCall !== null && superCall.arguments.length === 0));
}
/**
 * Gets the next statement after a node that *won't* be deleted by the migration.
 * @param startNode Node from which to start the search.
 * @param removedStatements Statements that have been removed by the migration.
 * @returns
 */
function getNextPreservedStatement(startNode, removedStatements) {
    const body = nodes.closestNode(startNode, ts.isBlock);
    const closestStatement = nodes.closestNode(startNode, ts.isStatement);
    if (body === null || closestStatement === null) {
        return null;
    }
    const index = body.statements.indexOf(closestStatement);
    if (index === -1) {
        return null;
    }
    for (let i = index + 1; i < body.statements.length; i++) {
        if (!removedStatements.has(body.statements[i])) {
            return body.statements[i];
        }
    }
    return null;
}
/**
 * Applies the internal-specific migrations to a class.
 * @param node Class being migrated.
 * @param constructor The migrated class' constructor.
 * @param localTypeChecker File-specific type checker.
 * @param tracker Object keeping track of the changes.
 * @param printer Printer used to output AST nodes as text.
 * @param removedStatements Statements that have been removed by the migration.
 * @param removedMembers Class members that have been removed by the migration.
 * @param prependToClass Text that will be prepended to a class.
 * @param afterInjectCalls Text that will be inserted after the newly-added `inject` calls.
 * @param memberIndentation Indentation string of the class' members.
 */
function applyInternalOnlyChanges(node, constructor, localTypeChecker, tracker, printer, removedStatements, removedMembers, prependToClass, afterInjectCalls, memberIndentation, options) {
    const result = findUninitializedPropertiesToCombine(node, constructor, localTypeChecker, options);
    if (result === null) {
        return;
    }
    const preserveInitOrder = shouldCombineInInitializationOrder(result.toCombine, constructor);
    // Sort the combined members based on the declaration order of their initializers, only if
    // we've determined that would be safe. Note that `Array.prototype.sort` is in-place so we
    // can just call it conditionally here.
    if (preserveInitOrder) {
        result.toCombine.sort((a, b) => a.initializer.getStart() - b.initializer.getStart());
    }
    result.toCombine.forEach(({ declaration, initializer }) => {
        const initializerStatement = nodes.closestNode(initializer, ts.isStatement);
        // Strip comments if we are just going modify the node in-place.
        const modifiers = preserveInitOrder
            ? declaration.modifiers
            : cloneModifiers(declaration.modifiers);
        const name = preserveInitOrder ? declaration.name : cloneName(declaration.name);
        const newProperty = ts.factory.createPropertyDeclaration(modifiers, name, declaration.questionToken, declaration.type, undefined);
        const propText = printer.printNode(ts.EmitHint.Unspecified, newProperty, declaration.getSourceFile());
        const initializerText = replaceParameterReferencesInInitializer(initializer, constructor, localTypeChecker);
        const withInitializer = `${propText.slice(0, -1)} = ${initializerText};`;
        // If the initialization order is being preserved, we have to remove the original
        // declaration and re-declare it. Otherwise we can do the replacement in-place.
        if (preserveInitOrder) {
            tracker.removeNode(declaration, true);
            removedMembers.add(declaration);
            afterInjectCalls.push(memberIndentation + withInitializer);
        }
        else {
            const sourceFile = declaration.getSourceFile();
            tracker.replaceText(sourceFile, declaration.getStart(), declaration.getWidth(), withInitializer);
        }
        // This should always be defined, but null check it just in case.
        if (initializerStatement) {
            tracker.removeNode(initializerStatement, true);
            removedStatements.add(initializerStatement);
        }
    });
    result.toHoist.forEach((decl) => {
        prependToClass.push(memberIndentation + printer.printNode(ts.EmitHint.Unspecified, decl, decl.getSourceFile()));
        tracker.removeNode(decl, true);
        removedMembers.add(decl);
    });
    // If we added any hoisted properties, separate them visually with a new line.
    if (prependToClass.length > 0) {
        prependToClass.push('');
    }
}
function replaceParameterReferencesInInitializer(initializer, constructor, localTypeChecker) {
    // 1. Collect the locations of identifier nodes that reference constructor parameters.
    // 2. Add `this.` to those locations.
    const insertLocations = [0];
    function walk(node) {
        if (ts.isIdentifier(node) &&
            !(ts.isPropertyAccessExpression(node.parent) && node === node.parent.name) &&
            localTypeChecker
                .getSymbolAtLocation(node)
                ?.declarations?.some((decl) => constructor.parameters.includes(decl))) {
            insertLocations.push(node.getStart() - initializer.getStart());
        }
        ts.forEachChild(node, walk);
    }
    walk(initializer);
    const initializerText = initializer.getText();
    insertLocations.push(initializerText.length);
    insertLocations.sort((a, b) => a - b);
    const result = [];
    for (let i = 0; i < insertLocations.length - 1; i++) {
        result.push(initializerText.slice(insertLocations[i], insertLocations[i + 1]));
    }
    return result.join('this.');
}

function migrate(options) {
    return async (tree) => {
        const basePath = process.cwd();
        const pathToMigrate = compiler_host.normalizePath(p.join(basePath, options.path));
        let allPaths = [];
        if (pathToMigrate.trim() !== '') {
            allPaths.push(pathToMigrate);
        }
        if (!allPaths.length) {
            throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the inject migration.');
        }
        for (const tsconfigPath of allPaths) {
            runInjectMigration(tree, tsconfigPath, basePath, pathToMigrate, options);
        }
    };
}
function runInjectMigration(tree, tsconfigPath, basePath, pathToMigrate, schematicOptions) {
    if (schematicOptions.path.startsWith('..')) {
        throw new schematics.SchematicsException('Cannot run inject migration outside of the current project.');
    }
    const program = compiler_host.createMigrationProgram(tree, tsconfigPath, basePath);
    const sourceFiles = program
        .getSourceFiles()
        .filter((sourceFile) => sourceFile.fileName.startsWith(pathToMigrate) &&
        compiler_host.canMigrateFile(basePath, sourceFile, program));
    if (sourceFiles.length === 0) {
        throw new schematics.SchematicsException(`Could not find any files to migrate under the path ${pathToMigrate}. Cannot run the inject migration.`);
    }
    for (const sourceFile of sourceFiles) {
        const changes = migrateFile(sourceFile, schematicOptions);
        if (changes.length > 0) {
            const update = tree.beginUpdate(p.relative(basePath, sourceFile.fileName));
            for (const change of changes) {
                if (change.removeLength != null) {
                    update.remove(change.start, change.removeLength);
                }
                update.insertRight(change.start, change.text);
            }
            tree.commitUpdate(update);
        }
    }
}

exports.migrate = migrate;
vۿ8xp'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

/**
 * Gets the leading line whitespace of a given node.
 *
 * Useful for inserting e.g. TODOs without breaking indentation.
 */
function getLeadingLineWhitespaceOfNode(node) {
    const fullText = node.getFullText().substring(0, node.getStart() - node.getFullStart());
    let result = '';
    for (let i = fullText.length - 1; i > -1; i--) {
        // Note: LF line endings are `\n` while CRLF are `\r\n`. This logic should cover both, because
        // we start from the beginning of the node and go backwards so will always hit `\n` first.
        if (fullText[i] !== '\n') {
            result = fullText[i] + result;
        }
        else {
            break;
        }
    }
    return result;
}

exports.getLeadingLineWhitespaceOfNode = getLeadingLineWhitespaceOfNode;
;wѶ)x   'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var checker = require('./checker-BwV9MjSQ.cjs');
var ts = require('typescript');
require('os');
var assert = require('assert');
var index = require('./index-B6p5mHIY.cjs');
var project_paths = require('./project_paths-DY3SIODd.cjs');
var leading_space = require('./leading_space-D9nQ8UQC.cjs');
require('./index-BnJH1Hc7.cjs');
require('path');

/**
 * Reasons why a field cannot be migrated.
 *
 * Higher values of incompatibility reasons indicate a more significant
 * incompatibility reason. Lower ones may be overridden by higher ones.
 * */
exports.FieldIncompatibilityReason = void 0;
(function (FieldIncompatibilityReason) {
    FieldIncompatibilityReason[FieldIncompatibilityReason["OverriddenByDerivedClass"] = 1] = "OverriddenByDerivedClass";
    FieldIncompatibilityReason[FieldIncompatibilityReason["RedeclaredViaDerivedClassInputsArray"] = 2] = "RedeclaredViaDerivedClassInputsArray";
    FieldIncompatibilityReason[FieldIncompatibilityReason["TypeConflictWithBaseClass"] = 3] = "TypeConflictWithBaseClass";
    FieldIncompatibilityReason[FieldIncompatibilityReason["ParentIsIncompatible"] = 4] = "ParentIsIncompatible";
    FieldIncompatibilityReason[FieldIncompatibilityReason["DerivedIsIncompatible"] = 5] = "DerivedIsIncompatible";
    FieldIncompatibilityReason[FieldIncompatibilityReason["SpyOnThatOverwritesField"] = 6] = "SpyOnThatOverwritesField";
    FieldIncompatibilityReason[FieldIncompatibilityReason["PotentiallyNarrowedInTemplateButNoSupportYet"] = 7] = "PotentiallyNarrowedInTemplateButNoSupportYet";
    FieldIncompatibilityReason[FieldIncompatibilityReason["SignalIncompatibleWithHostBinding"] = 8] = "SignalIncompatibleWithHostBinding";
    FieldIncompatibilityReason[FieldIncompatibilityReason["SignalInput__RequiredButNoGoodExplicitTypeExtractable"] = 9] = "SignalInput__RequiredButNoGoodExplicitTypeExtractable";
    FieldIncompatibilityReason[FieldIncompatibilityReason["SignalInput__QuestionMarkButNoGoodExplicitTypeExtractable"] = 10] = "SignalInput__QuestionMarkButNoGoodExplicitTypeExtractable";
    FieldIncompatibilityReason[FieldIncompatibilityReason["SignalQueries__QueryListProblematicFieldAccessed"] = 11] = "SignalQueries__QueryListProblematicFieldAccessed";
    FieldIncompatibilityReason[FieldIncompatibilityReason["SignalQueries__IncompatibleMultiUnionType"] = 12] = "SignalQueries__IncompatibleMultiUnionType";
    FieldIncompatibilityReason[FieldIncompatibilityReason["WriteAssignment"] = 13] = "WriteAssignment";
    FieldIncompatibilityReason[FieldIncompatibilityReason["Accessor"] = 14] = "Accessor";
    FieldIncompatibilityReason[FieldIncompatibilityReason["OutsideOfMigrationScope"] = 15] = "OutsideOfMigrationScope";
    FieldIncompatibilityReason[FieldIncompatibilityReason["SkippedViaConfigFilter"] = 16] = "SkippedViaConfigFilter";
})(exports.FieldIncompatibilityReason || (exports.FieldIncompatibilityReason = {}));
/** Field reasons that cannot be ignored. */
const nonIgnorableFieldIncompatibilities = [
    // Outside of scope fields should not be migrated. E.g. references to inputs in `node_modules/`.
    exports.FieldIncompatibilityReason.OutsideOfMigrationScope,
    // Explicitly filtered fields cannot be skipped via best effort mode.
    exports.FieldIncompatibilityReason.SkippedViaConfigFilter,
    // There is no good output for accessor fields.
    exports.FieldIncompatibilityReason.Accessor,
    // There is no good output for such inputs. We can't perform "conversion".
    exports.FieldIncompatibilityReason.SignalInput__RequiredButNoGoodExplicitTypeExtractable,
    exports.FieldIncompatibilityReason.SignalInput__QuestionMarkButNoGoodExplicitTypeExtractable,
];
/** Reasons why a whole class and its fields cannot be migrated. */
exports.ClassIncompatibilityReason = void 0;
(function (ClassIncompatibilityReason) {
    ClassIncompatibilityReason[ClassIncompatibilityReason["ClassManuallyInstantiated"] = 0] = "ClassManuallyInstantiated";
    ClassIncompatibilityReason[ClassIncompatibilityReason["OwningClassReferencedInClassProperty"] = 1] = "OwningClassReferencedInClassProperty";
})(exports.ClassIncompatibilityReason || (exports.ClassIncompatibilityReason = {}));
/** Whether the given value refers to an field incompatibility. */
function isFieldIncompatibility(value) {
    return (value.reason !== undefined &&
        value.context !== undefined &&
        exports.FieldIncompatibilityReason.hasOwnProperty(value.reason));
}
/** Picks the more significant field compatibility. */
function pickFieldIncompatibility(a, b) {
    if (b === null) {
        return a;
    }
    if (a.reason < b.reason) {
        return b;
    }
    return a;
}

/**
 * A lazily created TextEncoder instance for converting strings into UTF-8 bytes
 */
// Utils
var Endian;
(function (Endian) {
    Endian[Endian["Little"] = 0] = "Little";
    Endian[Endian["Big"] = 1] = "Big";
})(Endian || (Endian = {}));

//// Types
var TypeModifier;
(function (TypeModifier) {
    TypeModifier[TypeModifier["None"] = 0] = "None";
    TypeModifier[TypeModifier["Const"] = 1] = "Const";
})(TypeModifier || (TypeModifier = {}));
class Type {
    modifiers;
    constructor(modifiers = TypeModifier.None) {
        this.modifiers = modifiers;
    }
    hasModifier(modifier) {
        return (this.modifiers & modifier) !== 0;
    }
}
var BuiltinTypeName;
(function (BuiltinTypeName) {
    BuiltinTypeName[BuiltinTypeName["Dynamic"] = 0] = "Dynamic";
    BuiltinTypeName[BuiltinTypeName["Bool"] = 1] = "Bool";
    BuiltinTypeName[BuiltinTypeName["String"] = 2] = "String";
    BuiltinTypeName[BuiltinTypeName["Int"] = 3] = "Int";
    BuiltinTypeName[BuiltinTypeName["Number"] = 4] = "Number";
    BuiltinTypeName[BuiltinTypeName["Function"] = 5] = "Function";
    BuiltinTypeName[BuiltinTypeName["Inferred"] = 6] = "Inferred";
    BuiltinTypeName[BuiltinTypeName["None"] = 7] = "None";
})(BuiltinTypeName || (BuiltinTypeName = {}));
class BuiltinType extends Type {
    name;
    constructor(name, modifiers) {
        super(modifiers);
        this.name = name;
    }
    visitType(visitor, context) {
        return visitor.visitBuiltinType(this, context);
    }
}
new BuiltinType(BuiltinTypeName.Dynamic);
const INFERRED_TYPE = new BuiltinType(BuiltinTypeName.Inferred);
new BuiltinType(BuiltinTypeName.Bool);
new BuiltinType(BuiltinTypeName.Int);
new BuiltinType(BuiltinTypeName.Number);
new BuiltinType(BuiltinTypeName.String);
new BuiltinType(BuiltinTypeName.Function);
new BuiltinType(BuiltinTypeName.None);
///// Expressions
var UnaryOperator;
(function (UnaryOperator) {
    UnaryOperator[UnaryOperator["Minus"] = 0] = "Minus";
    UnaryOperator[UnaryOperator["Plus"] = 1] = "Plus";
})(UnaryOperator || (UnaryOperator = {}));
var BinaryOperator;
(function (BinaryOperator) {
    BinaryOperator[BinaryOperator["Equals"] = 0] = "Equals";
    BinaryOperator[BinaryOperator["NotEquals"] = 1] = "NotEquals";
    BinaryOperator[BinaryOperator["Identical"] = 2] = "Identical";
    BinaryOperator[BinaryOperator["NotIdentical"] = 3] = "NotIdentical";
    BinaryOperator[BinaryOperator["Minus"] = 4] = "Minus";
    BinaryOperator[BinaryOperator["Plus"] = 5] = "Plus";
    BinaryOperator[BinaryOperator["Divide"] = 6] = "Divide";
    BinaryOperator[BinaryOperator["Multiply"] = 7] = "Multiply";
    BinaryOperator[BinaryOperator["Modulo"] = 8] = "Modulo";
    BinaryOperator[BinaryOperator["And"] = 9] = "And";
    BinaryOperator[BinaryOperator["Or"] = 10] = "Or";
    BinaryOperator[BinaryOperator["BitwiseOr"] = 11] = "BitwiseOr";
    BinaryOperator[BinaryOperator["BitwiseAnd"] = 12] = "BitwiseAnd";
    BinaryOperator[BinaryOperator["Lower"] = 13] = "Lower";
    BinaryOperator[BinaryOperator["LowerEquals"] = 14] = "LowerEquals";
    BinaryOperator[BinaryOperator["Bigger"] = 15] = "Bigger";
    BinaryOperator[BinaryOperator["BiggerEquals"] = 16] = "BiggerEquals";
    BinaryOperator[BinaryOperator["NullishCoalesce"] = 17] = "NullishCoalesce";
})(BinaryOperator || (BinaryOperator = {}));
function nullSafeIsEquivalent(base, other) {
    if (base == null || other == null) {
        return base == other;
    }
    return base.isEquivalent(other);
}
function areAllEquivalentPredicate(base, other, equivalentPredicate) {
    const len = base.length;
    if (len !== other.length) {
        return false;
    }
    for (let i = 0; i < len; i++) {
        if (!equivalentPredicate(base[i], other[i])) {
            return false;
        }
    }
    return true;
}
function areAllEquivalent(base, other) {
    return areAllEquivalentPredicate(base, other, (baseElement, otherElement) => baseElement.isEquivalent(otherElement));
}
class Expression {
    type;
    sourceSpan;
    constructor(type, sourceSpan) {
        this.type = type || null;
        this.sourceSpan = sourceSpan || null;
    }
    prop(name, sourceSpan) {
        return new ReadPropExpr(this, name, null, sourceSpan);
    }
    key(index, type, sourceSpan) {
        return new ReadKeyExpr(this, index, type, sourceSpan);
    }
    callFn(params, sourceSpan, pure) {
        return new InvokeFunctionExpr(this, params, null, sourceSpan, pure);
    }
    instantiate(params, type, sourceSpan) {
        return new InstantiateExpr(this, params, type, sourceSpan);
    }
    conditional(trueCase, falseCase = null, sourceSpan) {
        return new ConditionalExpr(this, trueCase, falseCase, null, sourceSpan);
    }
    equals(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Equals, this, rhs, null, sourceSpan);
    }
    notEquals(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.NotEquals, this, rhs, null, sourceSpan);
    }
    identical(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Identical, this, rhs, null, sourceSpan);
    }
    notIdentical(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.NotIdentical, this, rhs, null, sourceSpan);
    }
    minus(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Minus, this, rhs, null, sourceSpan);
    }
    plus(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Plus, this, rhs, null, sourceSpan);
    }
    divide(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Divide, this, rhs, null, sourceSpan);
    }
    multiply(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Multiply, this, rhs, null, sourceSpan);
    }
    modulo(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Modulo, this, rhs, null, sourceSpan);
    }
    and(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.And, this, rhs, null, sourceSpan);
    }
    bitwiseOr(rhs, sourceSpan, parens = true) {
        return new BinaryOperatorExpr(BinaryOperator.BitwiseOr, this, rhs, null, sourceSpan, parens);
    }
    bitwiseAnd(rhs, sourceSpan, parens = true) {
        return new BinaryOperatorExpr(BinaryOperator.BitwiseAnd, this, rhs, null, sourceSpan, parens);
    }
    or(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Or, this, rhs, null, sourceSpan);
    }
    lower(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Lower, this, rhs, null, sourceSpan);
    }
    lowerEquals(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.LowerEquals, this, rhs, null, sourceSpan);
    }
    bigger(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.Bigger, this, rhs, null, sourceSpan);
    }
    biggerEquals(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.BiggerEquals, this, rhs, null, sourceSpan);
    }
    isBlank(sourceSpan) {
        // Note: We use equals by purpose here to compare to null and undefined in JS.
        // We use the typed null to allow strictNullChecks to narrow types.
        return this.equals(TYPED_NULL_EXPR, sourceSpan);
    }
    nullishCoalesce(rhs, sourceSpan) {
        return new BinaryOperatorExpr(BinaryOperator.NullishCoalesce, this, rhs, null, sourceSpan);
    }
    toStmt() {
        return new ExpressionStatement(this, null);
    }
}
class WriteKeyExpr extends Expression {
    receiver;
    index;
    value;
    constructor(receiver, index, value, type, sourceSpan) {
        super(type || value.type, sourceSpan);
        this.receiver = receiver;
        this.index = index;
        this.value = value;
    }
    isEquivalent(e) {
        return (e instanceof WriteKeyExpr &&
            this.receiver.isEquivalent(e.receiver) &&
            this.index.isEquivalent(e.index) &&
            this.value.isEquivalent(e.value));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitWriteKeyExpr(this, context);
    }
    clone() {
        return new WriteKeyExpr(this.receiver.clone(), this.index.clone(), this.value.clone(), this.type, this.sourceSpan);
    }
}
class WritePropExpr extends Expression {
    receiver;
    name;
    value;
    constructor(receiver, name, value, type, sourceSpan) {
        super(type || value.type, sourceSpan);
        this.receiver = receiver;
        this.name = name;
        this.value = value;
    }
    isEquivalent(e) {
        return (e instanceof WritePropExpr &&
            this.receiver.isEquivalent(e.receiver) &&
            this.name === e.name &&
            this.value.isEquivalent(e.value));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitWritePropExpr(this, context);
    }
    clone() {
        return new WritePropExpr(this.receiver.clone(), this.name, this.value.clone(), this.type, this.sourceSpan);
    }
}
class InvokeFunctionExpr extends Expression {
    fn;
    args;
    pure;
    constructor(fn, args, type, sourceSpan, pure = false) {
        super(type, sourceSpan);
        this.fn = fn;
        this.args = args;
        this.pure = pure;
    }
    // An alias for fn, which allows other logic to handle calls and property reads together.
    get receiver() {
        return this.fn;
    }
    isEquivalent(e) {
        return (e instanceof InvokeFunctionExpr &&
            this.fn.isEquivalent(e.fn) &&
            areAllEquivalent(this.args, e.args) &&
            this.pure === e.pure);
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitInvokeFunctionExpr(this, context);
    }
    clone() {
        return new InvokeFunctionExpr(this.fn.clone(), this.args.map((arg) => arg.clone()), this.type, this.sourceSpan, this.pure);
    }
}
class InstantiateExpr extends Expression {
    classExpr;
    args;
    constructor(classExpr, args, type, sourceSpan) {
        super(type, sourceSpan);
        this.classExpr = classExpr;
        this.args = args;
    }
    isEquivalent(e) {
        return (e instanceof InstantiateExpr &&
            this.classExpr.isEquivalent(e.classExpr) &&
            areAllEquivalent(this.args, e.args));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitInstantiateExpr(this, context);
    }
    clone() {
        return new InstantiateExpr(this.classExpr.clone(), this.args.map((arg) => arg.clone()), this.type, this.sourceSpan);
    }
}
class LiteralExpr extends Expression {
    value;
    constructor(value, type, sourceSpan) {
        super(type, sourceSpan);
        this.value = value;
    }
    isEquivalent(e) {
        return e instanceof LiteralExpr && this.value === e.value;
    }
    isConstant() {
        return true;
    }
    visitExpression(visitor, context) {
        return visitor.visitLiteralExpr(this, context);
    }
    clone() {
        return new LiteralExpr(this.value, this.type, this.sourceSpan);
    }
}
class ConditionalExpr extends Expression {
    condition;
    falseCase;
    trueCase;
    constructor(condition, trueCase, falseCase = null, type, sourceSpan) {
        super(type || trueCase.type, sourceSpan);
        this.condition = condition;
        this.falseCase = falseCase;
        this.trueCase = trueCase;
    }
    isEquivalent(e) {
        return (e instanceof ConditionalExpr &&
            this.condition.isEquivalent(e.condition) &&
            this.trueCase.isEquivalent(e.trueCase) &&
            nullSafeIsEquivalent(this.falseCase, e.falseCase));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitConditionalExpr(this, context);
    }
    clone() {
        return new ConditionalExpr(this.condition.clone(), this.trueCase.clone(), this.falseCase?.clone(), this.type, this.sourceSpan);
    }
}
class BinaryOperatorExpr extends Expression {
    operator;
    rhs;
    parens;
    lhs;
    constructor(operator, lhs, rhs, type, sourceSpan, parens = true) {
        super(type || lhs.type, sourceSpan);
        this.operator = operator;
        this.rhs = rhs;
        this.parens = parens;
        this.lhs = lhs;
    }
    isEquivalent(e) {
        return (e instanceof BinaryOperatorExpr &&
            this.operator === e.operator &&
            this.lhs.isEquivalent(e.lhs) &&
            this.rhs.isEquivalent(e.rhs));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitBinaryOperatorExpr(this, context);
    }
    clone() {
        return new BinaryOperatorExpr(this.operator, this.lhs.clone(), this.rhs.clone(), this.type, this.sourceSpan, this.parens);
    }
}
class ReadPropExpr extends Expression {
    receiver;
    name;
    constructor(receiver, name, type, sourceSpan) {
        super(type, sourceSpan);
        this.receiver = receiver;
        this.name = name;
    }
    // An alias for name, which allows other logic to handle property reads and keyed reads together.
    get index() {
        return this.name;
    }
    isEquivalent(e) {
        return (e instanceof ReadPropExpr && this.receiver.isEquivalent(e.receiver) && this.name === e.name);
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitReadPropExpr(this, context);
    }
    set(value) {
        return new WritePropExpr(this.receiver, this.name, value, null, this.sourceSpan);
    }
    clone() {
        return new ReadPropExpr(this.receiver.clone(), this.name, this.type, this.sourceSpan);
    }
}
class ReadKeyExpr extends Expression {
    receiver;
    index;
    constructor(receiver, index, type, sourceSpan) {
        super(type, sourceSpan);
        this.receiver = receiver;
        this.index = index;
    }
    isEquivalent(e) {
        return (e instanceof ReadKeyExpr &&
            this.receiver.isEquivalent(e.receiver) &&
            this.index.isEquivalent(e.index));
    }
    isConstant() {
        return false;
    }
    visitExpression(visitor, context) {
        return visitor.visitReadKeyExpr(this, context);
    }
    set(value) {
        return new WriteKeyExpr(this.receiver, this.index, value, null, this.sourceSpan);
    }
    clone() {
        return new ReadKeyExpr(this.receiver.clone(), this.index.clone(), this.type, this.sourceSpan);
    }
}
const NULL_EXPR = new LiteralExpr(null, null, null);
const TYPED_NULL_EXPR = new LiteralExpr(null, INFERRED_TYPE, null);
//// Statements
var StmtModifier;
(function (StmtModifier) {
    StmtModifier[StmtModifier["None"] = 0] = "None";
    StmtModifier[StmtModifier["Final"] = 1] = "Final";
    StmtModifier[StmtModifier["Private"] = 2] = "Private";
    StmtModifier[StmtModifier["Exported"] = 4] = "Exported";
    StmtModifier[StmtModifier["Static"] = 8] = "Static";
})(StmtModifier || (StmtModifier = {}));
class Statement {
    modifiers;
    sourceSpan;
    leadingComments;
    constructor(modifiers = StmtModifier.None, sourceSpan = null, leadingComments) {
        this.modifiers = modifiers;
        this.sourceSpan = sourceSpan;
        this.leadingComments = leadingComments;
    }
    hasModifier(modifier) {
        return (this.modifiers & modifier) !== 0;
    }
    addLeadingComment(leadingComment) {
        this.leadingComments = this.leadingComments ?? [];
        this.leadingComments.push(leadingComment);
    }
}
class ExpressionStatement extends Statement {
    expr;
    constructor(expr, sourceSpan, leadingComments) {
        super(StmtModifier.None, sourceSpan, leadingComments);
        this.expr = expr;
    }
    isEquivalent(stmt) {
        return stmt instanceof ExpressionStatement && this.expr.isEquivalent(stmt.expr);
    }
    visitStatement(visitor, context) {
        return visitor.visitExpressionStmt(this, context);
    }
}

/**
 * Detects `spyOn(dirInstance, 'myInput')` calls that likely modify
 * the input signal. There is no way to change the value inside the input signal,
 * and hence observing is not possible.
 */
class SpyOnFieldPattern {
    checker;
    fields;
    constructor(checker, fields) {
        this.checker = checker;
        this.fields = fields;
    }
    detect(node) {
        if (ts.isCallExpression(node) &&
            ts.isIdentifier(node.expression) &&
            node.expression.text === 'spyOn' &&
            node.arguments.length === 2 &&
            ts.isStringLiteralLike(node.arguments[1])) {
            const spyTargetType = this.checker.getTypeAtLocation(node.arguments[0]);
            const spyProperty = spyTargetType.getProperty(node.arguments[1].text);
            if (spyProperty === undefined) {
                return;
            }
            const fieldTarget = this.fields.attemptRetrieveDescriptorFromSymbol(spyProperty);
            if (fieldTarget === null) {
                return;
            }
            this.fields.markFieldIncompatible(fieldTarget, {
                reason: exports.FieldIncompatibilityReason.SpyOnThatOverwritesField,
                context: node,
            });
        }
    }
}

/**
 * Phase where problematic patterns are detected and advise
 * the migration to skip certain inputs.
 *
 * For example, detects classes that are instantiated manually. Those
 * cannot be migrated as `input()` requires an injection context.
 *
 * In addition, spying onto an input may be problematic- so we skip migrating
 * such.
 */
function checkIncompatiblePatterns(inheritanceGraph, checker$1, groupedTsAstVisitor, fields, getAllClassesWithKnownFields) {
    const inputClassSymbolsToClass = new Map();
    for (const knownFieldClass of getAllClassesWithKnownFields()) {
        const classSymbol = checker$1.getTypeAtLocation(knownFieldClass).symbol;
        assert(classSymbol != null, 'Expected a symbol to exist for the container of known field class.');
        assert(classSymbol.valueDeclaration !== undefined, 'Expected declaration to exist for known field class.');
        assert(ts.isClassDeclaration(classSymbol.valueDeclaration), 'Expected declaration to be a class.');
        // track class symbol for derived class checks.
        inputClassSymbolsToClass.set(classSymbol, classSymbol.valueDeclaration);
    }
    const spyOnPattern = new SpyOnFieldPattern(checker$1, fields);
    const visitor = (node) => {
        // Check for manual class instantiations.
        if (ts.isNewExpression(node) && ts.isIdentifier(checker.unwrapExpression(node.expression))) {
            let newTarget = checker$1.getSymbolAtLocation(checker.unwrapExpression(node.expression));
            // Plain identifier references can point to alias symbols (e.g. imports).
            if (newTarget !== undefined && newTarget.flags & ts.SymbolFlags.Alias) {
                newTarget = checker$1.getAliasedSymbol(newTarget);
            }
            if (newTarget && inputClassSymbolsToClass.has(newTarget)) {
                fields.markClassIncompatible(inputClassSymbolsToClass.get(newTarget), exports.ClassIncompatibilityReason.ClassManuallyInstantiated);
            }
        }
        // Detect `spyOn` problematic usages and record them.
        spyOnPattern.detect(node);
        const insidePropertyDeclaration = groupedTsAstVisitor.state.insidePropertyDeclaration;
        // Check for problematic class references inside property declarations.
        // These are likely problematic, causing type conflicts, if the containing
        // class inherits a non-input member with the same name.
        // Suddenly the derived class changes its signature, but the base class may not.
        problematicReferencesCheck: if (insidePropertyDeclaration !== null &&
            ts.isIdentifier(node) &&
            insidePropertyDeclaration.parent.heritageClauses !== undefined) {
            let newTarget = checker$1.getSymbolAtLocation(checker.unwrapExpression(node));
            // Plain identifier references can point to alias symbols (e.g. imports).
            if (newTarget !== undefined && newTarget.flags & ts.SymbolFlags.Alias) {
                newTarget = checker$1.getAliasedSymbol(newTarget);
            }
            if (newTarget && inputClassSymbolsToClass.has(newTarget)) {
                const memberName = index.getMemberName(insidePropertyDeclaration);
                if (memberName === null) {
                    break problematicReferencesCheck;
                }
                const { derivedMembers, inherited } = inheritanceGraph.checkOverlappingMembers(insidePropertyDeclaration.parent, insidePropertyDeclaration, memberName);
                // Member is not inherited, or derived.
                // Hence the reference is unproblematic and is expected to not
                // cause any type conflicts.
                if (derivedMembers.length === 0 && inherited === undefined) {
                    break problematicReferencesCheck;
                }
                fields.markClassIncompatible(inputClassSymbolsToClass.get(newTarget), exports.ClassIncompatibilityReason.OwningClassReferencedInClassProperty);
            }
        }
    };
    groupedTsAstVisitor.register(visitor);
}

/** Gets all types that are inherited (implemented or extended). */
function getInheritedTypes(node, checker) {
    if (node.heritageClauses === undefined) {
        return [];
    }
    const heritageTypes = [];
    for (const heritageClause of node.heritageClauses) {
        for (const typeNode of heritageClause.types) {
            heritageTypes.push(checker.getTypeFromTypeNode(typeNode));
        }
    }
    return heritageTypes;
}

/**
 * Inheritance graph tracks edges between classes that describe
 * heritage.
 *
 * This graph is helpful for efficient lookups whether e.g. an input
 * is overridden, or inherited etc. This is helpful when detecting
 * and propagating input incompatibility statuses.
 */
class InheritanceGraph {
    checker;
    /** Maps nodes to their parent nodes. */
    classToParents = new Map();
    /** Maps nodes to their derived nodes. */
    parentToChildren = new Map();
    /** All classes seen participating in inheritance chains. */
    allClassesInInheritance = new Set();
    constructor(checker) {
        this.checker = checker;
    }
    /** Registers a given class in the graph. */
    registerClass(clazz, parents) {
        this.classToParents.set(clazz, parents);
        this.allClassesInInheritance.add(clazz);
        for (const parent of parents) {
            this.allClassesInInheritance.add(parent);
            if (!this.parentToChildren.has(parent)) {
                this.parentToChildren.set(parent, []);
            }
            this.parentToChildren.get(parent).push(clazz);
        }
    }
    /**
     * Checks if the given class has overlapping members, either
     * inherited or derived.
     *
     * @returns Symbols of the inherited or derived members, if they exist.
     */
    checkOverlappingMembers(clazz, member, memberName) {
        const inheritedTypes = (this.classToParents.get(clazz) ?? []).map((c) => this.checker.getTypeAtLocation(c));
        const derivedLeafs = this._traceDerivedChainToLeafs(clazz).map((c) => this.checker.getTypeAtLocation(c));
        const inheritedMember = inheritedTypes
            .map((t) => t.getProperty(memberName))
            .find((m) => m !== undefined);
        const derivedMembers = derivedLeafs
            .map((t) => t.getProperty(memberName))
            // Skip members that point back to the current class element. The derived type
            // might look up back to our starting point— which we ignore.
            .filter((m) => m !== undefined && m.valueDeclaration !== member);
        return { inherited: inheritedMember, derivedMembers };
    }
    /** Gets all leaf derived classes that extend from the given class. */
    _traceDerivedChainToLeafs(clazz) {
        const queue = [clazz];
        const leafs = [];
        while (queue.length) {
            const node = queue.shift();
            if (!this.parentToChildren.has(node)) {
                if (node !== clazz) {
                    leafs.push(node);
                }
                continue;
            }
            queue.push(...this.parentToChildren.get(node));
        }
        return leafs;
    }
    /** Gets all derived classes of the given node. */
    traceDerivedClasses(clazz) {
        const queue = [clazz];
        const derived = [];
        while (queue.length) {
            const node = queue.shift();
            if (node !== clazz) {
                derived.push(node);
            }
            if (!this.parentToChildren.has(node)) {
                continue;
            }
            queue.push(...this.parentToChildren.get(node));
        }
        return derived;
    }
    /**
     * Populates the graph.
     *
     * NOTE: This is expensive and should be called with caution.
     */
    expensivePopulate(files) {
        for (const file of files) {
            const visitor = (node) => {
                if ((ts.isClassLike(node) || ts.isInterfaceDeclaration(node)) &&
                    node.heritageClauses !== undefined) {
                    const heritageTypes = getInheritedTypes(node, this.checker);
                    const parents = heritageTypes
                        // Interfaces participate in the graph and are not "value declarations".
                        // Also, symbol may be undefined for unresolvable nodes.
                        .map((t) => (t.symbol ? t.symbol.declarations?.[0] : undefined))
                        .filter((d) => d !== undefined && (ts.isClassLike(d) || ts.isInterfaceDeclaration(d)));
                    this.registerClass(node, parents);
                }
                ts.forEachChild(node, visitor);
            };
            ts.forEachChild(file, visitor);
        }
        return this;
    }
}

/**
 * Class that allows for efficient grouping of TypeScript node AST
 * traversal.
 *
 * Allows visitors to execute in a single pass when visiting all
 * children of source files.
 */
class GroupedTsAstVisitor {
    files;
    visitors = [];
    doneFns = [];
    constructor(files) {
        this.files = files;
    }
    state = {
        insidePropertyDeclaration: null,
    };
    register(visitor, done) {
        this.visitors.push(visitor);
        if (done !== undefined) {
            this.doneFns.push(done);
        }
    }
    execute() {
        const visitor = (node) => {
            for (const v of this.visitors) {
                v(node);
            }
            if (ts.isPropertyDeclaration(node)) {
                this.state.insidePropertyDeclaration = node;
                ts.forEachChild(node, visitor);
                this.state.insidePropertyDeclaration = null;
            }
            else {
                ts.forEachChild(node, visitor);
            }
        };
        for (const file of this.files) {
            ts.forEachChild(file, visitor);
        }
        for (const doneFn of this.doneFns) {
            doneFn();
        }
        this.visitors = [];
    }
}

/**
 * Phase that propagates incompatibilities to derived classes or
 * base classes. For example, consider:
 *
 * ```ts
 * class Base {
 *   bla = true;
 * }
 *
 * class Derived extends Base {
 *   @Input() bla = false;
 * }
 * ```
 *
 * Whenever we migrate `Derived`, the inheritance would fail
 * and result in a build breakage because `Base#bla` is not an Angular input.
 *
 * The logic here detects such cases and marks `bla` as incompatible. If `Derived`
 * would then have other derived classes as well, it would propagate the status.
 */
function checkInheritanceOfKnownFields(inheritanceGraph, metaRegistry, fields, opts) {
    const allInputClasses = Array.from(inheritanceGraph.allClassesInInheritance).filter((t) => ts.isClassDeclaration(t) && opts.isClassWithKnownFields(t));
    for (const inputClass of allInputClasses) {
        // Note: Class parents of `inputClass` were already checked by
        // the previous iterations (given the reverse topological sort)—
        // hence it's safe to assume that incompatibility of parent classes will
        // not change again, at a later time.
        assert(ts.isClassDeclaration(inputClass), 'Expected input graph node to be always a class.');
        const classFields = opts.getFieldsForClass(inputClass);
        const inputFieldNamesFromMetadataArray = new Set();
        // Iterate through derived class chains and determine all inputs that are overridden
        // via class metadata fields. e.g `@Component#inputs`. This is later used to mark a
        // potential similar class input as incompatible— because those cannot be migrated.
        if (metaRegistry !== null) {
            for (const derivedClasses of inheritanceGraph.traceDerivedClasses(inputClass)) {
                const derivedMeta = ts.isClassDeclaration(derivedClasses) && derivedClasses.name !== undefined
                    ? metaRegistry.getDirectiveMetadata(new checker.Reference(derivedClasses))
                    : null;
                if (derivedMeta !== null && derivedMeta.inputFieldNamesFromMetadataArray !== null) {
                    derivedMeta.inputFieldNamesFromMetadataArray.forEach((b) => inputFieldNamesFromMetadataArray.add(b));
                }
            }
        }
        // Check inheritance of every input in the given "directive class".
        inputCheck: for (const fieldDescr of classFields) {
            const inputNode = fieldDescr.node;
            const { derivedMembers, inherited } = inheritanceGraph.checkOverlappingMembers(inputClass, inputNode, index.getMemberName(inputNode));
            // If we discover a derived, input re-declared via class metadata, then it
            // will cause conflicts as we cannot migrate it/ nor mark it as signal-based.
            if (fieldDescr.node.name !== undefined &&
                (ts.isIdentifier(fieldDescr.node.name) || ts.isStringLiteralLike(fieldDescr.node.name)) &&
                inputFieldNamesFromMetadataArray.has(fieldDescr.node.name.text)) {
                fields.captureUnknownDerivedField(fieldDescr);
            }
            for (const derived of derivedMembers) {
                const derivedInput = fields.attemptRetrieveDescriptorFromSymbol(derived);
                if (derivedInput !== null) {
                    // Note: We always track dependencies from the child to the parent,
                    // so skip here for now.
                    continue;
                }
                // If we discover a derived, non-input member, then it will cause
                // conflicts, and we mark the current input as incompatible.
                fields.captureUnknownDerivedField(fieldDescr);
                continue inputCheck;
            }
            // If there is no parent, we are done. Otherwise, check the parent
            // to either inherit or check the incompatibility with the inheritance.
            if (inherited === undefined) {
                continue;
            }
            const inheritedMemberInput = fields.attemptRetrieveDescriptorFromSymbol(inherited);
            // Parent is not an input, and hence will conflict..
            if (inheritedMemberInput === null) {
                fields.captureUnknownParentField(fieldDescr);
                continue;
            }
            fields.captureKnownFieldInheritanceRelationship(fieldDescr, inheritedMemberInput);
        }
    }
}

function removeFromUnionIfPossible(union, filter) {
    const filtered = union.types.filter(filter);
    if (filtered.length === union.types.length) {
        return union;
    }
    // If there is only item at this point, avoid the union structure.
    if (filtered.length === 1) {
        return filtered[0];
    }
    return ts.factory.updateUnionTypeNode(union, ts.factory.createNodeArray(filtered));
}

/**
 * Inserts a leading string for the given node, respecting
 * indentation of the given anchor node.
 *
 * Useful for inserting TODOs.
 */
function insertPrecedingLine(node, info, text) {
    const leadingSpace = leading_space.getLeadingLineWhitespaceOfNode(node);
    return new project_paths.Replacement(project_paths.projectFile(node.getSourceFile(), info), new project_paths.TextUpdate({
        position: node.getStart(),
        end: node.getStart(),
        toInsert: `${text}\n${leadingSpace}`,
    }));
}

/**
 * Cuts the given string into lines basing around the specified
 * line length limit. This function breaks the string on a per-word basis.
 */
function cutStringToLineLimit(str, limit) {
    const words = str.split(' ');
    const chunks = [];
    let chunkIdx = 0;
    while (words.length) {
        // New line if we exceed limit.
        if (chunks[chunkIdx] !== undefined && chunks[chunkIdx].length > limit) {
            chunkIdx++;
        }
        // Ensure line is initialized for the given index.
        if (chunks[chunkIdx] === undefined) {
            chunks[chunkIdx] = '';
        }
        const word = words.shift();
        const needsSpace = chunks[chunkIdx].length > 0;
        // Insert word. Add space before, if the line already contains text.
        chunks[chunkIdx] += `${needsSpace ? ' ' : ''}${word}`;
    }
    return chunks;
}

/**
 * Gets human-readable message information for the given field incompatibility.
 * This text will be used by the language service, or CLI-based migration.
 */
function getMessageForFieldIncompatibility(reason, fieldName) {
    switch (reason) {
        case exports.FieldIncompatibilityReason.Accessor:
            return {
                short: `Accessor ${fieldName.plural} cannot be migrated as they are too complex.`,
                extra: 'The migration potentially requires usage of `effect` or `computed`, but ' +
                    'the intent is unclear. The migration cannot safely migrate.',
            };
        case exports.FieldIncompatibilityReason.OverriddenByDerivedClass:
            return {
                short: `The ${fieldName.single} cannot be migrated because the field is overridden by a subclass.`,
                extra: 'The field in the subclass is not a signal, so migrating would break your build.',
            };
        case exports.FieldIncompatibilityReason.ParentIsIncompatible:
            return {
                short: `This ${fieldName.single} is inherited from a superclass, but the parent cannot be migrated.`,
                extra: 'Migrating this field would cause your build to fail.',
            };
        case exports.FieldIncompatibilityReason.DerivedIsIncompatible:
            return {
                short: `This ${fieldName.single} cannot be migrated because the field is overridden by a subclass.`,
                extra: 'The field in the subclass is incompatible for migration, so migrating this field would ' +
                    'break your build.',
            };
        case exports.FieldIncompatibilityReason.SignalIncompatibleWithHostBinding:
            return {
                short: `This ${fieldName.single} is used in combination with \`@HostBinding\` and ` +
                    `migrating would break.`,
                extra: `\`@HostBinding\` does not invoke the signal automatically and your code would ` +
                    `break after migration. Use \`host\` of \`@Directive\`/\`@Component\`for host bindings.`,
            };
        case exports.FieldIncompatibilityReason.PotentiallyNarrowedInTemplateButNoSupportYet:
            return {
                short: `This ${fieldName.single} is used in a control flow expression (e.g. \`@if\` or \`*ngIf\`) and ` +
                    'migrating would break narrowing currently.',
                extra: `In the future, Angular intends to support narrowing of signals.`,
            };
        case exports.FieldIncompatibilityReason.RedeclaredViaDerivedClassInputsArray:
            return {
                short: `The ${fieldName.single} is overridden by a subclass that cannot be migrated.`,
                extra: `The subclass overrides this ${fieldName.single} via the \`inputs\` array in @Directive/@Component. ` +
                    'Migrating the field would break your build because the subclass field cannot be a signal.',
            };
        case exports.FieldIncompatibilityReason.SignalInput__RequiredButNoGoodExplicitTypeExtractable:
            return {
                short: `Input is required, but the migration cannot determine a good type for the input.`,
                extra: 'Consider adding an explicit type to make the migration possible.',
            };
        case exports.FieldIncompatibilityReason.SignalInput__QuestionMarkButNoGoodExplicitTypeExtractable:
            return {
                short: `Input is marked with a question mark. Migration could not determine a good type for the input.`,
                extra: 'The migration needs to be able to resolve a type, so that it can include `undefined` in your type. ' +
                    'Consider adding an explicit type to make the migration possible.',
            };
        case exports.FieldIncompatibilityReason.SignalQueries__QueryListProblematicFieldAccessed:
            return {
                short: `There are references to this query that cannot be migrated automatically.`,
                extra: "For example, it's not possible to migrate `.changes` or `.dirty` trivially.",
            };
        case exports.FieldIncompatibilityReason.SignalQueries__IncompatibleMultiUnionType:
            return {
                short: `Query type is too complex to automatically migrate.`,
                extra: "The new query API doesn't allow us to migrate safely without breaking your app.",
            };
        case exports.FieldIncompatibilityReason.SkippedViaConfigFilter:
            return {
                short: `This ${fieldName.single} is not part of the current migration scope.`,
                extra: 'Skipped via migration config.',
            };
        case exports.FieldIncompatibilityReason.SpyOnThatOverwritesField:
            return {
                short: 'A jasmine `spyOn` call spies on this field. This breaks with signals.',
                extra: `Migration cannot safely migrate as "spyOn" writes to the ${fieldName.single}. ` +
                    `Signal ${fieldName.plural} are readonly.`,
            };
        case exports.FieldIncompatibilityReason.TypeConflictWithBaseClass:
            return {
                short: `This ${fieldName.single} overrides a field from a superclass, while the superclass ` +
                    `field is not migrated.`,
                extra: 'Migrating the field would break your build because of a type conflict.',
            };
        case exports.FieldIncompatibilityReason.WriteAssignment:
            return {
                short: `Your application code writes to the ${fieldName.single}. This prevents migration.`,
                extra: `Signal ${fieldName.plural} are readonly, so migrating would break your build.`,
            };
        case exports.FieldIncompatibilityReason.OutsideOfMigrationScope:
            return {
                short: `This ${fieldName.single} is not part of any source files in your project.`,
                extra: `The migration excludes ${fieldName.plural} if no source file declaring them was seen.`,
            };
    }
}
/**
 * Gets human-readable message information for the given class incompatibility.
 * This text will be used by the language service, or CLI-based migration.
 */
function getMessageForClassIncompatibility(reason, fieldName) {
    switch (reason) {
        case exports.ClassIncompatibilityReason.OwningClassReferencedInClassProperty:
            return {
                short: `Class of this ${fieldName.single} is referenced in the signature of another class.`,
                extra: 'The other class is likely typed to expect a non-migrated field, so ' +
                    'migration is skipped to not break your build.',
            };
        case exports.ClassIncompatibilityReason.ClassManuallyInstantiated:
            return {
                short: `Class of this ${fieldName.single} is manually instantiated. ` +
                    'This is discouraged and prevents migration.',
                extra: `Signal ${fieldName.plural} require a DI injection context. Manually instantiating ` +
                    'breaks this requirement in some cases, so the migration is skipped.',
            };
    }
}

/**
 * Inserts a TODO for the incompatibility blocking the given node
 * from being migrated.
 */
function insertTodoForIncompatibility(node, programInfo, incompatibility, fieldName) {
    // If a field is skipped via config filter or outside migration scope, do not
    // insert TODOs, as this could results in lots of unnecessary comments.
    if (isFieldIncompatibility(incompatibility) &&
        (incompatibility.reason === exports.FieldIncompatibilityReason.SkippedViaConfigFilter ||
            incompatibility.reason === exports.FieldIncompatibilityReason.OutsideOfMigrationScope)) {
        return [];
    }
    const message = isFieldIncompatibility(incompatibility)
        ? getMessageForFieldIncompatibility(incompatibility.reason, fieldName).short
        : getMessageForClassIncompatibility(incompatibility, fieldName).short;
    const lines = cutStringToLineLimit(message, 70);
    return [
        insertPrecedingLine(node, programInfo, `// TODO: Skipped for migration because:`),
        ...lines.map((line) => insertPrecedingLine(node, programInfo, `//  ${line}`)),
    ];
}

/** Whether the given node is a descendant of the given ancestor. */
function isNodeDescendantOf(node, ancestor) {
    while (node) {
        if (node === ancestor)
            return true;
        node = node.parent;
    }
    return false;
}

/** Symbol that can be used to mark a variable as reserved, synthetically. */
const ReservedMarker = Symbol();
/**
 * Gets whether the given identifier name is free for use in the
 * given location, avoiding shadowed variable names.
 *
 */
function isIdentifierFreeInScope(name, location) {
    const startContainer = findClosestParentLocalsContainer(location);
    assert(startContainer !== undefined, 'Expecting a locals container.');
    // Traverse up and check for potential collisions.
    let container = startContainer;
    let firstNextContainer = undefined;
    while (container !== undefined) {
        if (!isIdentifierFreeInContainer(name, container)) {
            return null;
        }
        if (firstNextContainer === undefined && container.nextContainer !== undefined) {
            firstNextContainer = container.nextContainer;
        }
        container = findClosestParentLocalsContainer(container.parent);
    }
    // Check descendent local containers to avoid shadowing variables.
    // Note that this is not strictly needed, but it's helping avoid
    // some lint errors, like TSLint's no shadowed variables.
    container = firstNextContainer;
    while (container && isNodeDescendantOf(container, startContainer)) {
        if (!isIdentifierFreeInContainer(name, container)) {
            return null;
        }
        container = container.nextContainer;
    }
    return { container: startContainer };
}
/** Finds the closest parent locals container. */
function findClosestParentLocalsContainer(node) {
    return ts.findAncestor(node, isLocalsContainer);
}
/** Whether the given identifier is free in the given locals container. */
function isIdentifierFreeInContainer(name, container) {
    if (container.locals === undefined || !container.locals.has(name)) {
        return true;
    }
    // We consider alias symbols as locals conservatively.
    // Note: This check is similar to the check by the TypeScript emitter.
    // typescript/stable/src/compiler/emitter.ts;l=5436;rcl=651008033
    const local = container.locals.get(name);
    return (local !== ReservedMarker &&
        !(local.flags & (ts.SymbolFlags.Value | ts.SymbolFlags.ExportValue | ts.SymbolFlags.Alias)));
}
/**
 * Whether the given node can contain local variables.
 *
 * Note: This is similar to TypeScript's `canHaveLocals` internal helper.
 * typescript/stable/src/compiler/utilitiesPublic.ts;l=2265;rcl=651008033
 */
function isLocalsContainer(node) {
    switch (node.kind) {
        case ts.SyntaxKind.ArrowFunction:
        case ts.SyntaxKind.Block:
        case ts.SyntaxKind.CallSignature:
        case ts.SyntaxKind.CaseBlock:
        case ts.SyntaxKind.CatchClause:
        case ts.SyntaxKind.ClassStaticBlockDeclaration:
        case ts.SyntaxKind.ConditionalType:
        case ts.SyntaxKind.Constructor:
        case ts.SyntaxKind.ConstructorType:
        case ts.SyntaxKind.ConstructSignature:
        case ts.SyntaxKind.ForStatement:
        case ts.SyntaxKind.ForInStatement:
        case ts.SyntaxKind.ForOfStatement:
        case ts.SyntaxKind.FunctionDeclaration:
        case ts.SyntaxKind.FunctionExpression:
        case ts.SyntaxKind.FunctionType:
        case ts.SyntaxKind.GetAccessor:
        case ts.SyntaxKind.IndexSignature:
        case ts.SyntaxKind.JSDocCallbackTag:
        case ts.SyntaxKind.JSDocEnumTag:
        case ts.SyntaxKind.JSDocFunctionType:
        case ts.SyntaxKind.JSDocSignature:
        case ts.SyntaxKind.JSDocTypedefTag:
        case ts.SyntaxKind.MappedType:
        case ts.SyntaxKind.MethodDeclaration:
        case ts.SyntaxKind.MethodSignature:
        case ts.SyntaxKind.ModuleDeclaration:
        case ts.SyntaxKind.SetAccessor:
        case ts.SyntaxKind.SourceFile:
        case ts.SyntaxKind.TypeAliasDeclaration:
            return true;
        default:
            return false;
    }
}

/**
 * Helper that can generate unique identifier names at a
 * given location.
 *
 * Used for generating unique names to extract input reads
 * to support narrowing.
 */
class UniqueNamesGenerator {
    fallbackSuffixes;
    constructor(fallbackSuffixes) {
        this.fallbackSuffixes = fallbackSuffixes;
    }
    generate(base, location) {
        const checkNameAndClaimIfAvailable = (name) => {
            const freeInfo = isIdentifierFreeInScope(name, location);
            if (freeInfo === null) {
                return false;
            }
            // Claim the locals to avoid conflicts with future generations.
            freeInfo.container.locals ??= new Map();
            freeInfo.container.locals.set(name, ReservedMarker);
            return true;
        };
        // Check the base name. Ideally, we'd use this one.
        if (checkNameAndClaimIfAvailable(base)) {
            return base;
        }
        // Try any of the possible suffixes.
        for (const suffix of this.fallbackSuffixes) {
            const name = `${base}${suffix}`;
            if (checkNameAndClaimIfAvailable(name)) {
                return name;
            }
        }
        // Worst case, suffix the base name with a unique number until
        // we find an available name.
        let name = null;
        let counter = 1;
        do {
            name = `${base}_${counter++}`;
        } while (!checkNameAndClaimIfAvailable(name));
        return name;
    }
}

/**
 * Creates replacements to insert the given statement as
 * first statement into the arrow function.
 *
 * The arrow function is converted to a block-based arrow function
 * that can hold multiple statements. The original expression is
 * simply returned like before.
 */
function createNewBlockToInsertVariable(node, file, toInsert) {
    const sf = node.getSourceFile();
    // For indentation, we traverse up and find the earliest statement.
    // This node is most of the time a good candidate for acceptable
    // indentation of a new block.
    const spacingNode = ts.findAncestor(node, ts.isStatement) ?? node.parent;
    const { character } = ts.getLineAndCharacterOfPosition(sf, spacingNode.getStart());
    const blockSpace = ' '.repeat(character);
    const contentSpace = ' '.repeat(character + 2);
    return [
        // Delete leading whitespace of the concise body.
        new project_paths.Replacement(file, new project_paths.TextUpdate({
            position: node.body.getFullStart(),
            end: node.body.getStart(),
            toInsert: '',
        })),
        // Insert leading block braces, and `toInsert` content.
        // Wrap the previous expression in a return now.
        new project_paths.Replacement(file, new project_paths.TextUpdate({
            position: node.body.getStart(),
            end: node.body.getStart(),
            toInsert: ` {\n${contentSpace}${toInsert}\n${contentSpace}return `,
        })),
        // Add trailing brace.
        new project_paths.Replacement(file, new project_paths.TextUpdate({
            position: node.body.getEnd(),
            end: node.body.getEnd(),
            toInsert: `;\n${blockSpace}}`,
        })),
    ];
}

/**
 * Migrates a binding element that refers to an Angular input.
 *
 * E.g. `const {myInput} = this`.
 *
 * For references in binding elements, we extract the element into a variable
 * where we unwrap the input. This ensures narrowing naturally works in subsequent
 * places, and we also don't need to detect potential aliases.
 *
 * ```ts
 *   const {myInput} = this;
 *   // turns into
 *   const {myInput: myInputValue} = this;
 *   const myInput = myInputValue();
 * ```
 */
function migrateBindingElementInputReference(tsReferencesInBindingElements, info, replacements, printer) {
    const nameGenerator = new UniqueNamesGenerator(['Input', 'Signal', 'Ref']);
    for (const reference of tsReferencesInBindingElements) {
        const bindingElement = reference.parent;
        const bindingDecl = index.getBindingElementDeclaration(bindingElement);
        const sourceFile = bindingElement.getSourceFile();
        const file = project_paths.projectFile(sourceFile, info);
        const inputFieldName = bindingElement.propertyName ?? bindingElement.name;
        assert(!ts.isObjectBindingPattern(inputFieldName) && !ts.isArrayBindingPattern(inputFieldName), 'Property of binding element cannot be another pattern.');
        const tmpName = nameGenerator.generate(reference.text, bindingElement);
        // Only use the temporary name, if really needed. A temporary name is needed if
        // the input field simply aliased via the binding element, or if the exposed identifier
        // is a string-literal like.
        const useTmpNameForInputField = !ts.isObjectBindingPattern(bindingElement.name) || !ts.isIdentifier(inputFieldName);
        const propertyName = useTmpNameForInputField ? inputFieldName : undefined;
        const exposedName = useTmpNameForInputField
            ? ts.factory.createIdentifier(tmpName)
            : inputFieldName;
        const newBindingToAccessInputField = ts.factory.updateBindingElement(bindingElement, bindingElement.dotDotDotToken, propertyName, exposedName, bindingElement.initializer);
        const temporaryVariableReplacements = insertTemporaryVariableForBindingElement(bindingDecl, file, `const ${bindingElement.name.getText()} = ${exposedName.text}();`);
        if (temporaryVariableReplacements === null) {
            console.error(`Could not migrate reference ${reference.text} in ${file.rootRelativePath}`);
            continue;
        }
        replacements.push(new project_paths.Replacement(file, new project_paths.TextUpdate({
            position: bindingElement.getStart(),
            end: bindingElement.getEnd(),
            toInsert: printer.printNode(ts.EmitHint.Unspecified, newBindingToAccessInputField, sourceFile),
        })), ...temporaryVariableReplacements);
    }
}
/**
 * Inserts the given code snippet after the given variable or
 * parameter declaration.
 *
 * If this is a parameter of an arrow function, a block may be
 * added automatically.
 */
function insertTemporaryVariableForBindingElement(expansionDecl, file, toInsert) {
    const sf = expansionDecl.getSourceFile();
    const parent = expansionDecl.parent;
    // The snippet is simply inserted after the variable declaration.
    // The other case of a variable declaration inside a catch clause is handled
    // below.
    if (ts.isVariableDeclaration(expansionDecl) && ts.isVariableDeclarationList(parent)) {
        const leadingSpaceCount = ts.getLineAndCharacterOfPosition(sf, parent.getStart()).character;
        const leadingSpace = ' '.repeat(leadingSpaceCount);
        const statement = parent.parent;
        return [
            new project_paths.Replacement(file, new project_paths.TextUpdate({
                position: statement.getEnd(),
                end: statement.getEnd(),
                toInsert: `\n${leadingSpace}${toInsert}`,
            })),
        ];
    }
    // If we are dealing with a object expansion inside a parameter of
    // a function-like declaration w/ block, add the variable as the first
    // node inside the block.
    const bodyBlock = getBodyBlockOfNode(parent);
    if (bodyBlock !== null) {
        const firstElementInBlock = bodyBlock.statements[0];
        const spaceReferenceNode = firstElementInBlock ?? bodyBlock;
        const spaceOffset = firstElementInBlock !== undefined ? 0 : 2;
        const leadingSpaceCount = ts.getLineAndCharacterOfPosition(sf, spaceReferenceNode.getStart()).character + spaceOffset;
        const leadingSpace = ' '.repeat(leadingSpaceCount);
        return [
            new project_paths.Replacement(file, new project_paths.TextUpdate({
                position: bodyBlock.getStart() + 1,
                end: bodyBlock.getStart() + 1,
                toInsert: `\n${leadingSpace}${toInsert}`,
            })),
        ];
    }
    // Other cases where we see an arrow function without a block.
    // We need to create one now.
    if (ts.isArrowFunction(parent) && !ts.isBlock(parent.body)) {
        return createNewBlockToInsertVariable(parent, file, toInsert);
    }
    return null;
}
/** Gets the body block of a given node, if available. */
function getBodyBlockOfNode(node) {
    if ((ts.isMethodDeclaration(node) ||
        ts.isFunctionDeclaration(node) ||
        ts.isGetAccessorDeclaration(node) ||
        ts.isConstructorDeclaration(node) ||
        ts.isArrowFunction(node)) &&
        node.body !== undefined &&
        ts.isBlock(node.body)) {
        return node.body;
    }
    if (ts.isCatchClause(node.parent)) {
        return node.parent.block;
    }
    return null;
}

/**
 * Whether the given node represents a control flow container boundary.
 * E.g. variables cannot be narrowed when descending into children of `node`.
 */
function isControlFlowBoundary(node) {
    return ((ts.isFunctionLike(node) && !getImmediatelyInvokedFunctionExpression(node)) ||
        node.kind === ts.SyntaxKind.ModuleBlock ||
        node.kind === ts.SyntaxKind.SourceFile ||
        node.kind === ts.SyntaxKind.PropertyDeclaration);
}
/** Determines the current flow container of a given node. */
function getControlFlowContainer(node) {
    return ts.findAncestor(node.parent, (node) => isControlFlowBoundary(node));
}
/** Checks whether the given node refers to an IIFE declaration. */
function getImmediatelyInvokedFunctionExpression(func) {
    if (func.kind === ts.SyntaxKind.FunctionExpression || func.kind === ts.SyntaxKind.ArrowFunction) {
        let prev = func;
        let parent = func.parent;
        while (parent.kind === ts.SyntaxKind.ParenthesizedExpression) {
            prev = parent;
            parent = parent.parent;
        }
        if (parent.kind === ts.SyntaxKind.CallExpression &&
            parent.expression === prev) {
            return parent;
        }
    }
    return undefined;
}

/** @internal */
var FlowFlags;
(function (FlowFlags) {
    FlowFlags[FlowFlags["Unreachable"] = 1] = "Unreachable";
    FlowFlags[FlowFlags["Start"] = 2] = "Start";
    FlowFlags[FlowFlags["BranchLabel"] = 4] = "BranchLabel";
    FlowFlags[FlowFlags["LoopLabel"] = 8] = "LoopLabel";
    FlowFlags[FlowFlags["Assignment"] = 16] = "Assignment";
    FlowFlags[FlowFlags["TrueCondition"] = 32] = "TrueCondition";
    FlowFlags[FlowFlags["FalseCondition"] = 64] = "FalseCondition";
    FlowFlags[FlowFlags["SwitchClause"] = 128] = "SwitchClause";
    FlowFlags[FlowFlags["ArrayMutation"] = 256] = "ArrayMutation";
    FlowFlags[FlowFlags["Call"] = 512] = "Call";
    FlowFlags[FlowFlags["ReduceLabel"] = 1024] = "ReduceLabel";
    FlowFlags[FlowFlags["Referenced"] = 2048] = "Referenced";
    FlowFlags[FlowFlags["Shared"] = 4096] = "Shared";
    FlowFlags[FlowFlags["Label"] = 12] = "Label";
    FlowFlags[FlowFlags["Condition"] = 96] = "Condition";
})(FlowFlags || (FlowFlags = {}));

/**
 * Traverses the graph of the TypeScript flow nodes, exploring all possible branches
 * and keeps track of interesting nodes that may contribute to "narrowing".
 *
 * This allows us to figure out which nodes may be narrowed or not, and need
 * temporary variables in the migration to allowing narrowing to continue working.
 *
 * Some resources on flow nodes by TypeScript:
 * https://effectivetypescript.com/2024/03/24/flownodes/.
 */
function traverseFlowForInterestingNodes(flow) {
    let flowDepth = 0;
    let interestingNodes = [];
    const queue = new Set([flow]);
    // Queue is evolved during iteration, and new items will be added
    // to the end of the iteration. Effectively implementing a queue
    // with deduping out of the box.
    for (const flow of queue) {
        if (++flowDepth === 2000) {
            // We have made 2000 recursive invocations. To avoid overflowing the call stack we report an
            // error and disable further control flow analysis in the containing function or module body.
            return interestingNodes;
        }
        const flags = flow.flags;
        if (flags & FlowFlags.Assignment) {
            const assignment = flow;
            queue.add(assignment.antecedent);
            if (ts.isVariableDeclaration(assignment.node)) {
                interestingNodes.push(assignment.node.name);
            }
            else if (ts.isBindingElement(assignment.node)) {
                interestingNodes.push(assignment.node.name);
            }
            else {
                interestingNodes.push(assignment.node);
            }
        }
        else if (flags & FlowFlags.Call) {
            queue.add(flow.antecedent);
            // Arguments can be narrowed using `FlowCall`s.
            // See: node_modules/typescript/stable/src/compiler/checker.ts;l=28786-28810
            interestingNodes.push(...flow.node.arguments);
        }
        else if (flags & FlowFlags.Condition) {
            queue.add(flow.antecedent);
            interestingNodes.push(flow.node);
        }
        else if (flags & FlowFlags.SwitchClause) {
            queue.add(flow.antecedent);
            // The switch expression can be narrowed, so it's an interesting node.
            interestingNodes.push(flow.node.switchStatement.expression);
        }
        else if (flags & FlowFlags.Label) {
            // simple label, a single ancestor.
            if (flow.antecedent?.length === 1) {
                queue.add(flow.antecedent[0]);
                continue;
            }
            if (flags & FlowFlags.BranchLabel) {
                // Normal branches. e.g. switch.
                for (const f of flow.antecedent ?? []) {
                    queue.add(f);
                }
            }
            else {
                // Branch for loops.
                // The first antecedent always points to the flow node before the loop
                // was entered. All other narrowing expressions, if present, are direct
                // antecedents of the starting flow node, so we only need to look at the first.
                // See: node_modules/typescript/stable/src/compiler/checker.ts;l=28108-28109
                queue.add(flow.antecedent[0]);
            }
        }
        else if (flags & FlowFlags.ArrayMutation) {
            queue.add(flow.antecedent);
            // Array mutations are never interesting for inputs, as we cannot migrate
            // assignments to inputs.
        }
        else if (flags & FlowFlags.ReduceLabel) {
            // reduce label is a try/catch re-routing.
            // visit all possible branches.
            // TODO: explore this more.
            // See: node_modules/typescript/stable/src/compiler/binder.ts;l=1636-1649.
            queue.add(flow.antecedent);
            for (const f of flow.node.antecedents) {
                queue.add(f);
            }
        }
        else if (flags & FlowFlags.Start) {
            // Note: TS itself only ever continues with parent control flows, if the pre-determined `flowContaGMiner`
            // of the referenced is different. E.g. narrowing might decide to choose a higher flow container if we
            // reference a constant. In which case, TS allows escaping the flow container for narrowing. See:
            // http://google3/third_party/javascript/node_modules/typescript/stable/src/compiler/checker.ts;l=29399-29414;rcl=623599846.
            // and TypeScript's `narrowedConstInMethod` baseline test.
            // --> We don't need this as an input cannot be a constant!
            return interestingNodes;
        }
        else {
            break;
        }
    }
    return null;
}
/** Gets the flow node for the given node. */
function getFlowNode(node) {
    return node.flowNode ?? null;
}

/**
 * Analyzes the control flow of a list of references and returns
 * information about which nodes can be shared via a temporary variable
 * to enable narrowing.
 *
 * E.g. consider the following snippet:
 *
 * ```ts
 * someMethod() {
 *   if (this.bla) {
 *     this.bla.charAt(0);
 *   }
 * }
 * ```
 *
 * The analysis would inform the caller that `this.bla.charAt` can
 * be shared with the `this.bla` of the `if` condition.
 *
 * This is useful for the signal migration as it allows us to efficiently,
 * and minimally transform references into shared variables where needed.
 * Needed because signals are not narrowable by default, as they are functions.
 */
function analyzeControlFlow(entries, checker) {
    const result = [];
    const referenceToMetadata = new Map();
    // Prepare easy lookups for reference nodes to flow info.
    for (const [idx, entry] of entries.entries()) {
        const flowContainer = getControlFlowContainer(entry);
        referenceToMetadata.set(entry, {
            flowContainer,
            resultIndex: idx,
        });
        result.push({
            flowContainer,
            id: idx,
            originalNode: entry,
            recommendedNode: 'preserve',
        });
    }
    for (const entry of entries) {
        const { flowContainer, resultIndex } = referenceToMetadata.get(entry);
        const flowPathInterestingNodes = traverseFlowForInterestingNodes(getFlowNode(entry));
        assert(flowContainer !== null && flowPathInterestingNodes !== null, 'Expected a flow container to exist.');
        const narrowPartners = getAllMatchingReferencesInFlowPath(flowPathInterestingNodes, entry, referenceToMetadata, flowContainer, checker);
        if (narrowPartners.length !== 0) {
            connectSharedReferences(result, narrowPartners, resultIndex);
        }
    }
    return result;
}
/**
 * Iterates through all partner flow nodes and connects them so that
 * the first node will act as the share partner, while all subsequent
 * nodes will point to the share node.
 */
function connectSharedReferences(result, flowPartners, refId) {
    const refFlowContainer = result[refId].flowContainer;
    // Inside the list of flow partners (i.e. references to the same target),
    // find the node that is the first one in the flow container (via its start pos).
    let earliestPartner = null;
    let earliestPartnerId = null;
    for (const partnerId of flowPartners) {
        if (earliestPartner === null ||
            result[partnerId].originalNode.getStart() < earliestPartner.getStart()) {
            earliestPartner = result[partnerId].originalNode;
            earliestPartnerId = partnerId;
        }
    }
    assert(earliestPartner !== null, 'Expected an earliest partner to be found.');
    assert(earliestPartnerId !== null, 'Expected an earliest partner to be found.');
    // Earliest partner ID could be higher than `refId` in cyclic
    // situations like `loop` flow nodes. We need to find the minimum
    // and maximum to iterate through partners in between.
    const min = Math.min(earliestPartnerId, refId);
    const max = Math.max(earliestPartnerId, refId);
    // Then, incorporate all similar references (or flow nodes) in between
    // the reference and the earliest partner. References in between can also
    // use the shared flow node and not preserve their original reference— as
    // this would be rather unreadable and inefficient.
    const seenBlocks = new Set();
    let highestBlock = null;
    for (let i = min; i <= max; i++) {
        // Different flow container captured sequentially in result. Ignore.
        if (result[i].flowContainer !== refFlowContainer) {
            continue;
        }
        // Iterate up the block, find the highest block within the flow container.
        let current = result[i].originalNode.parent;
        while (current !== undefined) {
            if (isPotentialInsertionAncestor(current)) {
                // If we saw this block already, it is a common ancestor from another
                // partner. Check if it would be higher than the current highest block;
                // and choose it accordingly.
                if (seenBlocks.has(current)) {
                    if (highestBlock === null || current.getStart() < highestBlock.getStart()) {
                        highestBlock = current;
                    }
                    break;
                }
                seenBlocks.add(current);
            }
            current = current.parent;
        }
        if (i !== earliestPartnerId) {
            result[i].recommendedNode = earliestPartnerId;
        }
    }
    if (!highestBlock) {
        console.error(earliestPartnerId, refId, refFlowContainer.getText(), seenBlocks);
    }
    assert(highestBlock, 'Expected a block anchor to be found');
    result[earliestPartnerId].recommendedNode = highestBlock;
}
function isPotentialInsertionAncestor(node) {
    // Note: Arrow functions may not have a block, but instead use an expression
    // directly. This still signifies a "block" as we can convert the concise body
    // to a block.
    return (ts.isSourceFile(node) || ts.isBlock(node) || ts.isArrowFunction(node) || ts.isClassLike(node));
}
/**
 * Looks through the flow path and interesting nodes to determine which
 * of the potential "interesting" nodes point to the same reference.
 *
 * These nodes are then considered "partners" and will be returned via
 * their IDs (or practically their result indices).
 */
function getAllMatchingReferencesInFlowPath(flowPathInterestingNodes, reference, referenceToMetadata, restrainingFlowContainer, checker) {
    const partners = [];
    for (const flowNode of flowPathInterestingNodes) {
        // quick naive perf-optimized check to see if the flow node has a potential
        // similar reference.
        if (!flowNode.getText().includes(reference.getText())) {
            continue;
        }
        const similarRefNodeId = findSimilarReferenceNode(flowNode, reference, referenceToMetadata, restrainingFlowContainer, checker);
        if (similarRefNodeId !== null) {
            partners.push(similarRefNodeId);
        }
    }
    return partners;
}
/**
 * Checks if the given node contains an identifier that
 * matches the given reference. If so, returns its flow ID.
 */
function findSimilarReferenceNode(start, reference, referenceToMetadata, restrainingFlowContainer, checker) {
    return (ts.forEachChild(start, function visitChild(node) {
        // do not descend into control flow boundaries.
        // only references sharing the same container are relevant.
        // This is a performance optimization.
        if (isControlFlowBoundary(node)) {
            return;
        }
        // If this is not a potential matching identifier, check its children.
        if (!ts.isIdentifier(node) ||
            referenceToMetadata.get(node)?.flowContainer !== restrainingFlowContainer) {
            return ts.forEachChild(node, visitChild);
        }
        // If this refers to a different instantiation of the input reference,
        // continue looking.
        if (!isLexicalSameReference(checker, node, reference)) {
            return;
        }
        return { idx: referenceToMetadata.get(node).resultIndex };
    })?.idx ?? null);
}
/**
 * Checks whether a given identifier is lexically equivalent.
 * e.g. checks that they have similar property receiver accesses.
 */
function isLexicalSameReference(checker, sharePartner, reference) {
    const aParent = index.unwrapParent(reference.parent);
    // If the reference is not part a property access, return true. The references
    // are guaranteed symbol matches.
    if (!ts.isPropertyAccessExpression(aParent) && !ts.isElementAccessExpression(aParent)) {
        return sharePartner.text === reference.text;
    }
    // If reference parent is part of a property expression, but the share
    // partner not, then this cannot be shared.
    const bParent = index.unwrapParent(sharePartner.parent);
    if (aParent.kind !== bParent.kind) {
        return false;
    }
    const aParentExprSymbol = checker.getSymbolAtLocation(aParent.expression);
    const bParentExprSymbol = checker.getSymbolAtLocation(bParent.expression);
    return aParentExprSymbol === bParentExprSymbol;
}

function migrateStandardTsReference(tsReferencesWithNarrowing, checker, info, replacements) {
    const nameGenerator = new UniqueNamesGenerator(['Value', 'Val', 'Input']);
    // TODO: Consider checking/properly handling optional chaining and narrowing.
    for (const reference of tsReferencesWithNarrowing.values()) {
        const controlFlowResult = analyzeControlFlow(reference.accesses, checker);
        const idToSharedField = new Map();
        const isSharePartnerRef = (val) => {
            return val !== 'preserve' && typeof val !== 'number';
        };
        // Ensure we generate shared fields before reference entries.
        // This allows us to safely make use of `idToSharedField` whenever we come
        // across a referenced pointing to a share partner.
        controlFlowResult.sort((a, b) => {
            const aPriority = isSharePartnerRef(a.recommendedNode) ? 1 : 0;
            const bPriority = isSharePartnerRef(b.recommendedNode) ? 1 : 0;
            return bPriority - aPriority;
        });
        for (const { id, originalNode, recommendedNode } of controlFlowResult) {
            const sf = originalNode.getSourceFile();
            // Original node is preserved. No narrowing, and hence not shared.
            // Unwrap the signal directly.
            if (recommendedNode === 'preserve') {
                // Append `()` to unwrap the signal.
                replacements.push(new project_paths.Replacement(project_paths.projectFile(sf, info), new project_paths.TextUpdate({
                    position: originalNode.getEnd(),
                    end: originalNode.getEnd(),
                    toInsert: '()',
                })));
                continue;
            }
            // This reference is shared with a previous reference. Replace the access
            // with the temporary variable.
            if (typeof recommendedNode === 'number') {
                // Extract the shared field name.
                const toInsert = idToSharedField.get(recommendedNode);
                const replaceNode = index.traverseAccess(originalNode);
                assert(toInsert, 'no shared variable yet available');
                replacements.push(new project_paths.Replacement(project_paths.projectFile(sf, info), new project_paths.TextUpdate({
                    position: replaceNode.getStart(),
                    end: replaceNode.getEnd(),
                    toInsert,
                })));
                continue;
            }
            // Otherwise, we are creating a "shared reference" at the given node and
            // block.
            // Iterate up the original node, until we hit the "recommended block" level.
            // We then use the previous child as anchor for inserting. This allows us
            // to insert right before the first reference in the container, at the proper
            // block level— instead of always inserting at the beginning of the container.
            let parent = originalNode.parent;
            let referenceNodeInBlock = originalNode;
            while (parent !== recommendedNode) {
                referenceNodeInBlock = parent;
                parent = parent.parent;
            }
            const replaceNode = index.traverseAccess(originalNode);
            const filePath = project_paths.projectFile(sf, info);
            const initializer = `${replaceNode.getText()}()`;
            const fieldName = nameGenerator.generate(originalNode.text, referenceNodeInBlock);
            let sharedValueAccessExpr;
            let temporaryVariableStr;
            if (ts.isClassLike(recommendedNode)) {
                sharedValueAccessExpr = `this.${fieldName}`;
                temporaryVariableStr = `private readonly ${fieldName} = ${initializer};`;
            }
            else {
                sharedValueAccessExpr = fieldName;
                temporaryVariableStr = `const ${fieldName} = ${initializer};`;
            }
            idToSharedField.set(id, sharedValueAccessExpr);
            // If the common ancestor block of all shared references is an arrow function
            // without a block, convert the arrow function to a block and insert the temporary
            // variable at the beginning.
            if (ts.isArrowFunction(parent) && !ts.isBlock(parent.body)) {
                replacements.push(...createNewBlockToInsertVariable(parent, filePath, temporaryVariableStr));
            }
            else {
                const leadingSpace = ts.getLineAndCharacterOfPosition(sf, referenceNodeInBlock.getStart());
                replacements.push(new project_paths.Replacement(filePath, new project_paths.TextUpdate({
                    position: referenceNodeInBlock.getStart(),
                    end: referenceNodeInBlock.getStart(),
                    toInsert: `${temporaryVariableStr}\n${' '.repeat(leadingSpace.character)}`,
                })));
            }
            replacements.push(new project_paths.Replacement(project_paths.projectFile(sf, info), new project_paths.TextUpdate({
                position: replaceNode.getStart(),
                end: replaceNode.getEnd(),
                toInsert: sharedValueAccessExpr,
            })));
        }
    }
}

/**
 * Migrates TypeScript input references to be signal compatible.
 *
 * The phase takes care of control flow analysis and generates temporary variables
 * where needed to ensure narrowing continues to work. E.g.
 *
 * ```ts
 * someMethod() {
 *   if (this.input) {
 *     this.input.charAt(0);
 *   }
 * }
 * ```
 *
 * will be transformed into:
 *
 * ```ts
 * someMethod() {
 *   const input_1 = this.input();
 *   if (input_1) {
 *     input_1.charAt(0);
 *   }
 * }
 * ```
 */
function migrateTypeScriptReferences(host, references, checker, info) {
    const tsReferencesWithNarrowing = new Map();
    const tsReferencesInBindingElements = new Set();
    const seenIdentifiers = new WeakSet();
    for (const reference of references) {
        // This pass only deals with TS references.
        if (!index.isTsReference(reference)) {
            continue;
        }
        // Skip references to incompatible inputs.
        if (!host.shouldMigrateReferencesToField(reference.target)) {
            continue;
        }
        // Never attempt to migrate write references.
        // Those usually invalidate the target input most of the time, but in
        // best-effort mode they are not.
        if (reference.from.isWrite) {
            continue;
        }
        // Skip duplicate references. E.g. in batching.
        if (seenIdentifiers.has(reference.from.node)) {
            continue;
        }
        seenIdentifiers.add(reference.from.node);
        const targetKey = reference.target.key;
        if (reference.from.isPartOfElementBinding) {
            tsReferencesInBindingElements.add(reference.from.node);
        }
        else {
            if (!tsReferencesWithNarrowing.has(targetKey)) {
                tsReferencesWithNarrowing.set(targetKey, { accesses: [] });
            }
            tsReferencesWithNarrowing.get(targetKey).accesses.push(reference.from.node);
        }
    }
    migrateBindingElementInputReference(tsReferencesInBindingElements, info, host.replacements, host.printer);
    migrateStandardTsReference(tsReferencesWithNarrowing, checker, info, host.replacements);
}

/**
 * Migrates TypeScript "ts.Type" references. E.g.

 *  - `Partial<MyComp>` will be converted to `UnwrapSignalInputs<Partial<MyComp>>`.
      in Catalyst test files.
 */
function migrateTypeScriptTypeReferences(host, references, importManager, info) {
    const seenTypeNodes = new WeakSet();
    for (const reference of references) {
        // This pass only deals with TS input class type references.
        if (!index.isTsClassTypeReference(reference)) {
            continue;
        }
        // Skip references to classes that are not fully migrated.
        if (!host.shouldMigrateReferencesToClass(reference.target)) {
            continue;
        }
        // Skip duplicate references. E.g. in batching.
        if (seenTypeNodes.has(reference.from.node)) {
            continue;
        }
        seenTypeNodes.add(reference.from.node);
        if (reference.isPartialReference && reference.isPartOfCatalystFile) {
            assert(reference.from.node.typeArguments, 'Expected type arguments for partial reference.');
            assert(reference.from.node.typeArguments.length === 1, 'Expected an argument for reference.');
            const firstArg = reference.from.node.typeArguments[0];
            const sf = firstArg.getSourceFile();
            // Naive detection of the import. Sufficient for this test file migration.
            const catalystImport = sf.text.includes('google3/javascript/angular2/testing/catalyst/fake_async')
                ? 'google3/javascript/angular2/testing/catalyst/fake_async'
                : 'google3/javascript/angular2/testing/catalyst/async';
            const unwrapImportExpr = importManager.addImport({
                exportModuleSpecifier: catalystImport,
                exportSymbolName: 'UnwrapSignalInputs',
                requestedFile: sf,
            });
            host.replacements.push(new project_paths.Replacement(project_paths.projectFile(sf, info), new project_paths.TextUpdate({
                position: firstArg.getStart(),
                end: firstArg.getStart(),
                toInsert: `${host.printer.printNode(ts.EmitHint.Unspecified, unwrapImportExpr, sf)}<`,
            })));
            host.replacements.push(new project_paths.Replacement(project_paths.projectFile(sf, info), new project_paths.TextUpdate({ position: firstArg.getEnd(), end: firstArg.getEnd(), toInsert: '>' })));
        }
    }
}

exports.GroupedTsAstVisitor = GroupedTsAstVisitor;
exports.InheritanceGraph = InheritanceGraph;
exports.NULL_EXPR = NULL_EXPR;
exports.checkIncompatiblePatterns = checkIncompatiblePatterns;
exports.checkInheritanceOfKnownFields = checkInheritanceOfKnownFields;
exports.cutStringToLineLimit = cutStringToLineLimit;
exports.getMessageForClassIncompatibility = getMessageForClassIncompatibility;
exports.getMessageForFieldIncompatibility = getMessageForFieldIncompatibility;
exports.insertPrecedingLine = insertPrecedingLine;
exports.insertTodoForIncompatibility = insertTodoForIncompatibility;
exports.isFieldIncompatibility = isFieldIncompatibility;
exports.migrateTypeScriptReferences = migrateTypeScriptReferences;
exports.migrateTypeScriptTypeReferences = migrateTypeScriptTypeReferences;
exports.nonIgnorableFieldIncompatibilities = nonIgnorableFieldIncompatibilities;
exports.pickFieldIncompatibility = pickFieldIncompatibility;
exports.removeFromUnionIfPossible = removeFromUnionIfPossible;
3TxD'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');
var imports = require('./imports-CIX-JgAN.cjs');

function getCallDecoratorImport(typeChecker, decorator) {
    // Note that this does not cover the edge case where decorators are called from
    // a namespace import: e.g. "@core.Component()". This is not handled by Ngtsc either.
    if (!ts.isCallExpression(decorator.expression) ||
        !ts.isIdentifier(decorator.expression.expression)) {
        return null;
    }
    const identifier = decorator.expression.expression;
    return imports.getImportOfIdentifier(typeChecker, identifier);
}

/**
 * Gets all decorators which are imported from an Angular package (e.g. "@angular/core")
 * from a list of decorators.
 */
function getAngularDecorators(typeChecker, decorators) {
    return decorators
        .map((node) => ({ node, importData: getCallDecoratorImport(typeChecker, node) }))
        .filter(({ importData }) => importData && importData.importModule.startsWith('@angular/'))
        .map(({ node, importData }) => ({
        node: node,
        name: importData.name,
        moduleName: importData.importModule,
        importNode: importData.node,
    }));
}

exports.getAngularDecorators = getAngularDecorators;
ox 'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');

/** Find the closest parent node of a particular kind. */
function closestNode(node, predicate) {
    let current = node.parent;
    while (current && !ts.isSourceFile(current)) {
        if (predicate(current)) {
            return current;
        }
        current = current.parent;
    }
    return null;
}

exports.closestNode = closestNode;
uxop'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');
require('os');
var checker = require('./checker-BwV9MjSQ.cjs');
var index$1 = require('./index-BnJH1Hc7.cjs');
require('path');
var project_paths = require('./project_paths-DY3SIODd.cjs');
var apply_import_manager = require('./apply_import_manager-DF0BUe6N.cjs');
var index = require('./index-B6p5mHIY.cjs');
require('@angular-devkit/core');
require('node:path/posix');
require('fs');
require('module');
require('url');
require('@angular-devkit/schematics');
require('./project_tsconfig_paths-CDVxT6Ov.cjs');

function isOutputDeclarationEligibleForMigration(node) {
    return (node.initializer !== undefined &&
        ts.isNewExpression(node.initializer) &&
        ts.isIdentifier(node.initializer.expression) &&
        node.initializer.expression.text === 'EventEmitter');
}
function isPotentialOutputCallUsage(node, name) {
    if (ts.isCallExpression(node) &&
        ts.isPropertyAccessExpression(node.expression) &&
        ts.isIdentifier(node.expression.name)) {
        return node.expression?.name.text === name;
    }
    else {
        return false;
    }
}
function isPotentialPipeCallUsage(node) {
    return isPotentialOutputCallUsage(node, 'pipe');
}
function isPotentialNextCallUsage(node) {
    return isPotentialOutputCallUsage(node, 'next');
}
function isPotentialCompleteCallUsage(node) {
    return isPotentialOutputCallUsage(node, 'complete');
}
function isTargetOutputDeclaration(node, checker, reflector, dtsReader) {
    const targetSymbol = checker.getSymbolAtLocation(node);
    if (targetSymbol !== undefined) {
        const propertyDeclaration = getTargetPropertyDeclaration(targetSymbol);
        if (propertyDeclaration !== null &&
            isOutputDeclaration(propertyDeclaration, reflector, dtsReader)) {
            return propertyDeclaration;
        }
    }
    return null;
}
/** Gets whether the given property is an Angular `@Output`. */
function isOutputDeclaration(node, reflector, dtsReader) {
    // `.d.ts` file, so we check the `static ecmp` metadata on the `declare class`.
    if (node.getSourceFile().isDeclarationFile) {
        if (!ts.isIdentifier(node.name) ||
            !ts.isClassDeclaration(node.parent) ||
            node.parent.name === undefined) {
            return false;
        }
        const ref = new checker.Reference(node.parent);
        const directiveMeta = dtsReader.getDirectiveMetadata(ref);
        return !!directiveMeta?.outputs.getByClassPropertyName(node.name.text);
    }
    // `.ts` file, so we check for the `@Output()` decorator.
    return getOutputDecorator(node, reflector) !== null;
}
function getTargetPropertyDeclaration(targetSymbol) {
    const valDeclaration = targetSymbol.valueDeclaration;
    if (valDeclaration !== undefined && ts.isPropertyDeclaration(valDeclaration)) {
        return valDeclaration;
    }
    return null;
}
/** Returns Angular `@Output` decorator or null when a given property declaration is not an @Output */
function getOutputDecorator(node, reflector) {
    const decorators = reflector.getDecoratorsOfDeclaration(node);
    const ngDecorators = decorators !== null ? checker.getAngularDecorators(decorators, ['Output'], /* isCore */ false) : [];
    return ngDecorators.length > 0 ? ngDecorators[0] : null;
}
// THINK: this utility + type is not specific to @Output, really, maybe move it to tsurge?
/** Computes an unique ID for a given Angular `@Output` property. */
function getUniqueIdForProperty(info, prop) {
    const { id } = project_paths.projectFile(prop.getSourceFile(), info);
    id.replace(/\.d\.ts$/, '.ts');
    return `${id}@@${prop.parent.name ?? 'unknown-class'}@@${prop.name.getText()}`;
}
function isTestRunnerImport(node) {
    if (ts.isImportDeclaration(node)) {
        const moduleSpecifier = node.moduleSpecifier.getText();
        return moduleSpecifier.includes('jasmine') || moduleSpecifier.includes('catalyst');
    }
    return false;
}
// TODO: code duplication with signals migration - sort it out
/**
 * Gets whether the given read is used to access
 * the specified field.
 *
 * E.g. whether `<my-read>.toArray` is detected.
 */
function checkNonTsReferenceAccessesField(ref, fieldName) {
    const readFromPath = ref.from.readAstPath.at(-1);
    const parentRead = ref.from.readAstPath.at(-2);
    if (ref.from.read !== readFromPath) {
        return null;
    }
    if (!(parentRead instanceof checker.PropertyRead) || parentRead.name !== fieldName) {
        return null;
    }
    return parentRead;
}
/**
 * Gets whether the given reference is accessed to call the
 * specified function on it.
 *
 * E.g. whether `<my-read>.toArray()` is detected.
 */
function checkNonTsReferenceCallsField(ref, fieldName) {
    const propertyAccess = checkNonTsReferenceAccessesField(ref, fieldName);
    if (propertyAccess === null) {
        return null;
    }
    const accessIdx = ref.from.readAstPath.indexOf(propertyAccess);
    if (accessIdx === -1) {
        return null;
    }
    const potentialRead = ref.from.readAstPath[accessIdx];
    if (potentialRead === undefined) {
        return null;
    }
    return potentialRead;
}

const printer = ts.createPrinter();
function calculateDeclarationReplacement(info, node, aliasParam) {
    const sf = node.getSourceFile();
    let payloadTypes;
    if (node.initializer && ts.isNewExpression(node.initializer) && node.initializer.typeArguments) {
        payloadTypes = node.initializer.typeArguments;
    }
    else if (node.type && ts.isTypeReferenceNode(node.type) && node.type.typeArguments) {
        payloadTypes = ts.factory.createNodeArray(node.type.typeArguments);
    }
    const outputCall = ts.factory.createCallExpression(ts.factory.createIdentifier('output'), payloadTypes, aliasParam !== undefined
        ? [
            ts.factory.createObjectLiteralExpression([
                ts.factory.createPropertyAssignment('alias', ts.factory.createStringLiteral(aliasParam, true)),
            ], false),
        ]
        : []);
    const existingModifiers = (node.modifiers ?? []).filter((modifier) => !ts.isDecorator(modifier) && modifier.kind !== ts.SyntaxKind.ReadonlyKeyword);
    const updatedOutputDeclaration = ts.factory.createPropertyDeclaration(
    // Think: this logic of dealing with modifiers is applicable to all signal-based migrations
    ts.factory.createNodeArray([
        ...existingModifiers,
        ts.factory.createModifier(ts.SyntaxKind.ReadonlyKeyword),
    ]), node.name, undefined, undefined, outputCall);
    return prepareTextReplacementForNode(info, node, printer.printNode(ts.EmitHint.Unspecified, updatedOutputDeclaration, sf));
}
function calculateImportReplacements(info, sourceFiles) {
    const importReplacements = {};
    for (const sf of sourceFiles) {
        const importManager = new checker.ImportManager();
        const addOnly = [];
        const addRemove = [];
        const file = project_paths.projectFile(sf, info);
        importManager.addImport({
            requestedFile: sf,
            exportModuleSpecifier: '@angular/core',
            exportSymbolName: 'output',
        });
        apply_import_manager.applyImportManagerChanges(importManager, addOnly, [sf], info);
        importManager.removeImport(sf, 'Output', '@angular/core');
        importManager.removeImport(sf, 'EventEmitter', '@angular/core');
        apply_import_manager.applyImportManagerChanges(importManager, addRemove, [sf], info);
        importReplacements[file.id] = {
            add: addOnly,
            addAndRemove: addRemove,
        };
    }
    return importReplacements;
}
function calculateNextFnReplacement(info, node) {
    return prepareTextReplacementForNode(info, node, 'emit');
}
function calculateNextFnReplacementInTemplate(file, span) {
    return prepareTextReplacement(file, 'emit', span.start, span.end);
}
function calculateNextFnReplacementInHostBinding(file, offset, span) {
    return prepareTextReplacement(file, 'emit', offset + span.start, offset + span.end);
}
function calculateCompleteCallReplacement(info, node) {
    return prepareTextReplacementForNode(info, node, '', node.getFullStart());
}
function calculatePipeCallReplacement(info, node) {
    if (ts.isPropertyAccessExpression(node.expression)) {
        const sf = node.getSourceFile();
        const importManager = new checker.ImportManager();
        const outputToObservableIdent = importManager.addImport({
            requestedFile: sf,
            exportModuleSpecifier: '@angular/core/rxjs-interop',
            exportSymbolName: 'outputToObservable',
        });
        const toObsCallExp = ts.factory.createCallExpression(outputToObservableIdent, undefined, [
            node.expression.expression,
        ]);
        const pipePropAccessExp = ts.factory.updatePropertyAccessExpression(node.expression, toObsCallExp, node.expression.name);
        const pipeCallExp = ts.factory.updateCallExpression(node, pipePropAccessExp, [], node.arguments);
        const replacements = [
            prepareTextReplacementForNode(info, node, printer.printNode(ts.EmitHint.Unspecified, pipeCallExp, sf)),
        ];
        apply_import_manager.applyImportManagerChanges(importManager, replacements, [sf], info);
        return replacements;
    }
    else {
        // TODO: assert instead?
        throw new Error(`Unexpected call expression for .pipe - expected a property access but got "${node.getText()}"`);
    }
}
function prepareTextReplacementForNode(info, node, replacement, start) {
    const sf = node.getSourceFile();
    return new project_paths.Replacement(project_paths.projectFile(sf, info), new project_paths.TextUpdate({
        position: start ?? node.getStart(),
        end: node.getEnd(),
        toInsert: replacement,
    }));
}
function prepareTextReplacement(file, replacement, start, end) {
    return new project_paths.Replacement(file, new project_paths.TextUpdate({
        position: start,
        end: end,
        toInsert: replacement,
    }));
}

class OutputMigration extends project_paths.TsurgeFunnelMigration {
    config;
    constructor(config = {}) {
        super();
        this.config = config;
    }
    async analyze(info) {
        const { sourceFiles, program } = info;
        const outputFieldReplacements = {};
        const problematicUsages = {};
        let problematicDeclarationCount = 0;
        const filesWithOutputDeclarations = new Set();
        const checker$1 = program.getTypeChecker();
        const reflector = new checker.TypeScriptReflectionHost(checker$1);
        const dtsReader = new index$1.DtsMetadataReader(checker$1, reflector);
        const evaluator = new index$1.PartialEvaluator(reflector, checker$1, null);
        const resourceLoader = info.ngCompiler?.['resourceManager'] ?? null;
        // Pre-analyze the program and get access to the template type checker.
        // If we are processing a non-Angular target, there is no template info.
        const { templateTypeChecker } = info.ngCompiler?.['ensureAnalyzed']() ?? {
            templateTypeChecker: null,
        };
        const knownFields = {
            // Note: We don't support cross-target migration of `Partial<T>` usages.
            // This is an acceptable limitation for performance reasons.
            shouldTrackClassReference: () => false,
            attemptRetrieveDescriptorFromSymbol: (s) => {
                const propDeclaration = getTargetPropertyDeclaration(s);
                if (propDeclaration !== null) {
                    const classFieldID = getUniqueIdForProperty(info, propDeclaration);
                    if (classFieldID !== null) {
                        return {
                            node: propDeclaration,
                            key: classFieldID,
                        };
                    }
                }
                return null;
            },
        };
        let isTestFile = false;
        const outputMigrationVisitor = (node) => {
            // detect output declarations
            if (ts.isPropertyDeclaration(node)) {
                const outputDecorator = getOutputDecorator(node, reflector);
                if (outputDecorator !== null) {
                    if (isOutputDeclarationEligibleForMigration(node)) {
                        const outputDef = {
                            id: getUniqueIdForProperty(info, node),
                            aliasParam: outputDecorator.args?.at(0),
                        };
                        const outputFile = project_paths.projectFile(node.getSourceFile(), info);
                        if (this.config.shouldMigrate === undefined ||
                            this.config.shouldMigrate({
                                key: outputDef.id,
                                node: node,
                            }, outputFile)) {
                            const aliasParam = outputDef.aliasParam;
                            const aliasOptionValue = aliasParam ? evaluator.evaluate(aliasParam) : undefined;
                            if (aliasOptionValue == undefined || typeof aliasOptionValue === 'string') {
                                filesWithOutputDeclarations.add(node.getSourceFile());
                                addOutputReplacement(outputFieldReplacements, outputDef.id, outputFile, calculateDeclarationReplacement(info, node, aliasOptionValue?.toString()));
                            }
                            else {
                                problematicUsages[outputDef.id] = true;
                                problematicDeclarationCount++;
                            }
                        }
                    }
                    else {
                        problematicDeclarationCount++;
                    }
                }
            }
            // detect .next usages that should be migrated to .emit
            if (isPotentialNextCallUsage(node) && ts.isPropertyAccessExpression(node.expression)) {
                const propertyDeclaration = isTargetOutputDeclaration(node.expression.expression, checker$1, reflector, dtsReader);
                if (propertyDeclaration !== null) {
                    const id = getUniqueIdForProperty(info, propertyDeclaration);
                    const outputFile = project_paths.projectFile(node.getSourceFile(), info);
                    addOutputReplacement(outputFieldReplacements, id, outputFile, calculateNextFnReplacement(info, node.expression.name));
                }
            }
            // detect .complete usages that should be removed
            if (isPotentialCompleteCallUsage(node) && ts.isPropertyAccessExpression(node.expression)) {
                const propertyDeclaration = isTargetOutputDeclaration(node.expression.expression, checker$1, reflector, dtsReader);
                if (propertyDeclaration !== null) {
                    const id = getUniqueIdForProperty(info, propertyDeclaration);
                    const outputFile = project_paths.projectFile(node.getSourceFile(), info);
                    if (ts.isExpressionStatement(node.parent)) {
                        addOutputReplacement(outputFieldReplacements, id, outputFile, calculateCompleteCallReplacement(info, node.parent));
                    }
                    else {
                        problematicUsages[id] = true;
                    }
                }
            }
            addCommentForEmptyEmit(node, info, checker$1, reflector, dtsReader, outputFieldReplacements);
            // detect imports of test runners
            if (isTestRunnerImport(node)) {
                isTestFile = true;
            }
            // detect unsafe access of the output property
            if (isPotentialPipeCallUsage(node) && ts.isPropertyAccessExpression(node.expression)) {
                const propertyDeclaration = isTargetOutputDeclaration(node.expression.expression, checker$1, reflector, dtsReader);
                if (propertyDeclaration !== null) {
                    const id = getUniqueIdForProperty(info, propertyDeclaration);
                    if (isTestFile) {
                        const outputFile = project_paths.projectFile(node.getSourceFile(), info);
                        addOutputReplacement(outputFieldReplacements, id, outputFile, ...calculatePipeCallReplacement(info, node));
                    }
                    else {
                        problematicUsages[id] = true;
                    }
                }
            }
            ts.forEachChild(node, outputMigrationVisitor);
        };
        // calculate output migration replacements
        for (const sf of sourceFiles) {
            isTestFile = false;
            ts.forEachChild(sf, outputMigrationVisitor);
        }
        // take care of the references in templates and host bindings
        const referenceResult = { references: [] };
        const { visitor: templateHostRefVisitor } = index.createFindAllSourceFileReferencesVisitor(info, checker$1, reflector, resourceLoader, evaluator, templateTypeChecker, knownFields, null, // TODO: capture known output names as an optimization
        referenceResult);
        // calculate template / host binding replacements
        for (const sf of sourceFiles) {
            ts.forEachChild(sf, templateHostRefVisitor);
        }
        for (const ref of referenceResult.references) {
            // detect .next usages that should be migrated to .emit in template and host binding expressions
            if (ref.kind === index.ReferenceKind.InTemplate) {
                const callExpr = checkNonTsReferenceCallsField(ref, 'next');
                // TODO: here and below for host bindings, we should ideally filter in the global meta stage
                // (instead of using the `outputFieldReplacements` map)
                //  as technically, the call expression could refer to an output
                //  from a whole different compilation unit (e.g. tsconfig.json).
                if (callExpr !== null && outputFieldReplacements[ref.target.key] !== undefined) {
                    addOutputReplacement(outputFieldReplacements, ref.target.key, ref.from.templateFile, calculateNextFnReplacementInTemplate(ref.from.templateFile, callExpr.nameSpan));
                }
            }
            else if (ref.kind === index.ReferenceKind.InHostBinding) {
                const callExpr = checkNonTsReferenceCallsField(ref, 'next');
                if (callExpr !== null && outputFieldReplacements[ref.target.key] !== undefined) {
                    addOutputReplacement(outputFieldReplacements, ref.target.key, ref.from.file, calculateNextFnReplacementInHostBinding(ref.from.file, ref.from.hostPropertyNode.getStart() + 1, callExpr.nameSpan));
                }
            }
        }
        // calculate import replacements but do so only for files that have output declarations
        const importReplacements = calculateImportReplacements(info, filesWithOutputDeclarations);
        return project_paths.confirmAsSerializable({
            problematicDeclarationCount,
            outputFields: outputFieldReplacements,
            importReplacements,
            problematicUsages,
        });
    }
    async combine(unitA, unitB) {
        const outputFields = {};
        const importReplacements = {};
        const problematicUsages = {};
        let problematicDeclarationCount = 0;
        for (const unit of [unitA, unitB]) {
            for (const declIdStr of Object.keys(unit.outputFields)) {
                const declId = declIdStr;
                // THINK: detect clash? Should we have an utility to merge data based on unique IDs?
                outputFields[declId] = unit.outputFields[declId];
            }
            for (const fileIDStr of Object.keys(unit.importReplacements)) {
                const fileID = fileIDStr;
                importReplacements[fileID] = unit.importReplacements[fileID];
            }
            problematicDeclarationCount += unit.problematicDeclarationCount;
        }
        for (const unit of [unitA, unitB]) {
            for (const declIdStr of Object.keys(unit.problematicUsages)) {
                const declId = declIdStr;
                problematicUsages[declId] = unit.problematicUsages[declId];
            }
        }
        return project_paths.confirmAsSerializable({
            problematicDeclarationCount,
            outputFields,
            importReplacements,
            problematicUsages,
        });
    }
    async globalMeta(combinedData) {
        const globalMeta = {
            importReplacements: combinedData.importReplacements,
            outputFields: combinedData.outputFields,
            problematicDeclarationCount: combinedData.problematicDeclarationCount,
            problematicUsages: {},
        };
        for (const keyStr of Object.keys(combinedData.problematicUsages)) {
            const key = keyStr;
            // it might happen that a problematic usage is detected but we didn't see the declaration - skipping those
            if (globalMeta.outputFields[key] !== undefined) {
                globalMeta.problematicUsages[key] = true;
            }
        }
        // Noop here as we don't have any form of special global metadata.
        return project_paths.confirmAsSerializable(combinedData);
    }
    async stats(globalMetadata) {
        const detectedOutputs = new Set(Object.keys(globalMetadata.outputFields)).size +
            globalMetadata.problematicDeclarationCount;
        const problematicOutputs = new Set(Object.keys(globalMetadata.problematicUsages)).size +
            globalMetadata.problematicDeclarationCount;
        const successRate = detectedOutputs > 0 ? (detectedOutputs - problematicOutputs) / detectedOutputs : 1;
        return {
            counters: {
                detectedOutputs,
                problematicOutputs,
                successRate,
            },
        };
    }
    async migrate(globalData) {
        const migratedFiles = new Set();
        const problematicFiles = new Set();
        const replacements = [];
        for (const declIdStr of Object.keys(globalData.outputFields)) {
            const declId = declIdStr;
            const outputField = globalData.outputFields[declId];
            if (!globalData.problematicUsages[declId]) {
                replacements.push(...outputField.replacements);
                migratedFiles.add(outputField.file.id);
            }
            else {
                problematicFiles.add(outputField.file.id);
            }
        }
        for (const fileIDStr of Object.keys(globalData.importReplacements)) {
            const fileID = fileIDStr;
            if (migratedFiles.has(fileID)) {
                const importReplacements = globalData.importReplacements[fileID];
                if (problematicFiles.has(fileID)) {
                    replacements.push(...importReplacements.add);
                }
                else {
                    replacements.push(...importReplacements.addAndRemove);
                }
            }
        }
        return { replacements };
    }
}
function addOutputReplacement(outputFieldReplacements, outputId, file, ...replacements) {
    let existingReplacements = outputFieldReplacements[outputId];
    if (existingReplacements === undefined) {
        outputFieldReplacements[outputId] = existingReplacements = {
            file: file,
            replacements: [],
        };
    }
    existingReplacements.replacements.push(...replacements);
}
function addCommentForEmptyEmit(node, info, checker, reflector, dtsReader, outputFieldReplacements) {
    if (!isEmptyEmitCall(node))
        return;
    const propertyAccess = getPropertyAccess(node);
    if (!propertyAccess)
        return;
    const symbol = checker.getSymbolAtLocation(propertyAccess.name);
    if (!symbol || !symbol.declarations?.length)
        return;
    const propertyDeclaration = isTargetOutputDeclaration(propertyAccess, checker, reflector, dtsReader);
    if (!propertyDeclaration)
        return;
    const eventEmitterType = getEventEmitterArgumentType(propertyDeclaration);
    if (!eventEmitterType)
        return;
    const id = getUniqueIdForProperty(info, propertyDeclaration);
    const file = project_paths.projectFile(node.getSourceFile(), info);
    const formatter = getFormatterText(node);
    const todoReplacement = new project_paths.TextUpdate({
        toInsert: `${formatter.indent}// TODO: The 'emit' function requires a mandatory ${eventEmitterType} argument\n`,
        end: formatter.lineStartPos,
        position: formatter.lineStartPos,
    });
    addOutputReplacement(outputFieldReplacements, id, file, new project_paths.Replacement(file, todoReplacement));
}
function isEmptyEmitCall(node) {
    return (ts.isCallExpression(node) &&
        ts.isPropertyAccessExpression(node.expression) &&
        node.expression.name.text === 'emit' &&
        node.arguments.length === 0);
}
function getPropertyAccess(node) {
    const propertyAccessExpression = node.expression.expression;
    return ts.isPropertyAccessExpression(propertyAccessExpression) ? propertyAccessExpression : null;
}
function getEventEmitterArgumentType(propertyDeclaration) {
    const initializer = propertyDeclaration.initializer;
    if (!initializer || !ts.isNewExpression(initializer))
        return null;
    const isEventEmitter = ts.isIdentifier(initializer.expression) && initializer.expression.getText() === 'EventEmitter';
    if (!isEventEmitter)
        return null;
    const [typeArg] = initializer.typeArguments ?? [];
    return typeArg ? typeArg.getText() : null;
}
function getFormatterText(node) {
    const sourceFile = node.getSourceFile();
    const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
    const lineStartPos = sourceFile.getPositionOfLineAndCharacter(line, 0);
    const indent = sourceFile.text.slice(lineStartPos, node.getStart());
    return { indent, lineStartPos };
}

function migrate(options) {
    return async (tree, context) => {
        await project_paths.runMigrationInDevkit({
            tree,
            getMigration: (fs) => new OutputMigration({
                shouldMigrate: (_, file) => {
                    return (file.rootRelativePath.startsWith(fs.normalize(options.path)) &&
                        !/(^|\/)node_modules\//.test(file.rootRelativePath));
                },
            }),
            beforeProgramCreation: (tsconfigPath, stage) => {
                if (stage === project_paths.MigrationStage.Analysis) {
                    context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
                }
                else {
                    context.logger.info(`Running migration for: ${tsconfigPath}...`);
                }
            },
            afterProgramCreation: (info, fs) => {
                const analysisPath = fs.resolve(options.analysisDir);
                // Support restricting the analysis to subfolders for larger projects.
                if (analysisPath !== '/') {
                    info.sourceFiles = info.sourceFiles.filter((sf) => sf.fileName.startsWith(analysisPath));
                    info.fullProgramSourceFiles = info.fullProgramSourceFiles.filter((sf) => sf.fileName.startsWith(analysisPath));
                }
            },
            beforeUnitAnalysis: (tsconfigPath) => {
                context.logger.info(`Scanning for outputs: ${tsconfigPath}...`);
            },
            afterAllAnalyzed: () => {
                context.logger.info(``);
                context.logger.info(`Processing analysis data between targets...`);
                context.logger.info(``);
            },
            afterAnalysisFailure: () => {
                context.logger.error('Migration failed unexpectedly with no analysis data');
            },
            whenDone: ({ counters }) => {
                const { detectedOutputs, problematicOutputs, successRate } = counters;
                const migratedOutputs = detectedOutputs - problematicOutputs;
                const successRatePercent = (successRate * 100).toFixed(2);
                context.logger.info('');
                context.logger.info(`Successfully migrated to outputs as functions 🎉`);
                context.logger.info(`  -> Migrated ${migratedOutputs} out of ${detectedOutputs} detected outputs (${successRatePercent} %).`);
            },
        });
    };
}

exports.migrate = migrate;
6+|x:'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var schematics = require('@angular-devkit/schematics');
var p = require('path');
var project_tsconfig_paths = require('./project_tsconfig_paths-CDVxT6Ov.cjs');
var compiler_host = require('./compiler_host-C55Cczah.cjs');
var ts = require('typescript');
var imports = require('./imports-CIX-JgAN.cjs');
require('@angular-devkit/core');
require('./checker-BwV9MjSQ.cjs');
require('os');
require('fs');
require('module');
require('url');

const CORE = '@angular/core';
const EXPERIMENTAL_PENDING_TASKS = 'ExperimentalPendingTasks';
function migrateFile(sourceFile, typeChecker, rewriteFn) {
    const changeTracker = new compiler_host.ChangeTracker(ts.createPrinter());
    // Check if there are any imports of the `AfterRenderPhase` enum.
    const coreImports = imports.getNamedImports(sourceFile, CORE);
    if (!coreImports) {
        return;
    }
    const importSpecifier = imports.getImportSpecifier(sourceFile, CORE, EXPERIMENTAL_PENDING_TASKS);
    if (!importSpecifier) {
        return;
    }
    const nodeToReplace = importSpecifier.propertyName ?? importSpecifier.name;
    if (!ts.isIdentifier(nodeToReplace)) {
        return;
    }
    changeTracker.replaceNode(nodeToReplace, ts.factory.createIdentifier('PendingTasks'));
    ts.forEachChild(sourceFile, function visit(node) {
        // import handled above
        if (ts.isImportDeclaration(node)) {
            return;
        }
        if (ts.isIdentifier(node) &&
            node.text === EXPERIMENTAL_PENDING_TASKS &&
            imports.getImportOfIdentifier(typeChecker, node)?.name === EXPERIMENTAL_PENDING_TASKS) {
            changeTracker.replaceNode(node, ts.factory.createIdentifier('PendingTasks'));
        }
        ts.forEachChild(node, visit);
    });
    // Write the changes.
    for (const changesInFile of changeTracker.recordChanges().values()) {
        for (const change of changesInFile) {
            rewriteFn(change.start, change.removeLength ?? 0, change.text);
        }
    }
}

function migrate() {
    return async (tree) => {
        const { buildPaths, testPaths } = await project_tsconfig_paths.getProjectTsConfigPaths(tree);
        const basePath = process.cwd();
        const allPaths = [...buildPaths, ...testPaths];
        if (!allPaths.length) {
            throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the afterRender phase migration.');
        }
        for (const tsconfigPath of allPaths) {
            runMigration(tree, tsconfigPath, basePath);
        }
    };
}
function runMigration(tree, tsconfigPath, basePath) {
    const program = compiler_host.createMigrationProgram(tree, tsconfigPath, basePath);
    const sourceFiles = program
        .getSourceFiles()
        .filter((sourceFile) => compiler_host.canMigrateFile(basePath, sourceFile, program));
    for (const sourceFile of sourceFiles) {
        let update = null;
        const rewriter = (startPos, width, text) => {
            if (update === null) {
                // Lazily initialize update, because most files will not require migration.
                update = tree.beginUpdate(p.relative(basePath, sourceFile.fileName));
            }
            update.remove(startPos, width);
            if (text !== null) {
                update.insertLeft(startPos, text);
            }
        };
        migrateFile(sourceFile, program.getTypeChecker(), rewriter);
        if (update !== null) {
            tree.commitUpdate(update);
        }
    }
}

exports.migrate = migrate;
@xBw'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var index = require('./index-BnJH1Hc7.cjs');
var schematics = require('@angular-devkit/schematics');
var core = require('@angular-devkit/core');
var posixPath = require('node:path/posix');
var os = require('os');
var ts = require('typescript');
var checker = require('./checker-BwV9MjSQ.cjs');
require('path');
var project_tsconfig_paths = require('./project_tsconfig_paths-CDVxT6Ov.cjs');

function _interopNamespaceDefault(e) {
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n.default = e;
    return Object.freeze(n);
}

var posixPath__namespace = /*#__PURE__*/_interopNamespaceDefault(posixPath);
var os__namespace = /*#__PURE__*/_interopNamespaceDefault(os);

/// <reference types="node" />
class NgtscCompilerHost {
    fs;
    options;
    constructor(fs, options = {}) {
        this.fs = fs;
        this.options = options;
    }
    getSourceFile(fileName, languageVersion) {
        const text = this.readFile(fileName);
        return text !== undefined
            ? ts.createSourceFile(fileName, text, languageVersion, true)
            : undefined;
    }
    getDefaultLibFileName(options) {
        return this.fs.join(this.getDefaultLibLocation(), ts.getDefaultLibFileName(options));
    }
    getDefaultLibLocation() {
        return this.fs.getDefaultLibLocation();
    }
    writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles) {
        const path = checker.absoluteFrom(fileName);
        this.fs.ensureDir(this.fs.dirname(path));
        this.fs.writeFile(path, data);
    }
    getCurrentDirectory() {
        return this.fs.pwd();
    }
    getCanonicalFileName(fileName) {
        return this.useCaseSensitiveFileNames() ? fileName : fileName.toLowerCase();
    }
    useCaseSensitiveFileNames() {
        return this.fs.isCaseSensitive();
    }
    getNewLine() {
        switch (this.options.newLine) {
            case ts.NewLineKind.CarriageReturnLineFeed:
                return '\r\n';
            case ts.NewLineKind.LineFeed:
                return '\n';
            default:
                return os__namespace.EOL;
        }
    }
    fileExists(fileName) {
        const absPath = this.fs.resolve(fileName);
        return this.fs.exists(absPath) && this.fs.stat(absPath).isFile();
    }
    readFile(fileName) {
        const absPath = this.fs.resolve(fileName);
        if (!this.fileExists(absPath)) {
            return undefined;
        }
        return this.fs.readFile(absPath);
    }
    realpath(path) {
        return this.fs.realpath(this.fs.resolve(path));
    }
}

// We use TypeScript's native `ts.matchFiles` utility for the virtual file systems
// and their TypeScript compiler host `readDirectory` implementation. TypeScript's
// function implements complex logic for matching files with respect to root
// directory, extensions, excludes, includes etc. The function is currently
// internal but we can use it as the API most likely will not change any time soon,
// nor does it seem like this is being made public any time soon.
// Related issue for tracking: https://github.com/microsoft/TypeScript/issues/13793.
/**
 * Creates a {@link ts.CompilerHost#readDirectory} implementation function,
 * that leverages the specified file system (that may be e.g. virtual).
 */
function createFileSystemTsReadDirectoryFn(fs) {
    if (ts.matchFiles === undefined) {
        throw Error('Unable to read directory in configured file system. This means that ' +
            'TypeScript changed its file matching internals.\n\nPlease consider downgrading your ' +
            'TypeScript version, and report an issue in the Angular framework repository.');
    }
    const matchFilesFn = ts.matchFiles.bind(ts);
    return (rootDir, extensions, excludes, includes, depth) => {
        const directoryExists = (p) => {
            const resolvedPath = fs.resolve(p);
            return fs.exists(resolvedPath) && fs.stat(resolvedPath).isDirectory();
        };
        return matchFilesFn(rootDir, extensions, excludes, includes, fs.isCaseSensitive(), fs.pwd(), depth, (p) => {
            const resolvedPath = fs.resolve(p);
            // TS also gracefully returns an empty file set.
            if (!directoryExists(resolvedPath)) {
                return { directories: [], files: [] };
            }
            const children = fs.readdir(resolvedPath);
            const files = [];
            const directories = [];
            for (const child of children) {
                if (fs.stat(fs.join(resolvedPath, child))?.isDirectory()) {
                    directories.push(child);
                }
                else {
                    files.push(child);
                }
            }
            return { files, directories };
        }, (p) => fs.resolve(p), (p) => directoryExists(p));
    };
}

function calcProjectFileAndBasePath(project, host = checker.getFileSystem()) {
    const absProject = host.resolve(project);
    const projectIsDir = host.lstat(absProject).isDirectory();
    const projectFile = projectIsDir ? host.join(absProject, 'tsconfig.json') : absProject;
    const projectDir = projectIsDir ? absProject : host.dirname(absProject);
    const basePath = host.resolve(projectDir);
    return { projectFile, basePath };
}
function readConfiguration(project, existingOptions, host = checker.getFileSystem()) {
    try {
        const fs = checker.getFileSystem();
        const readConfigFile = (configFile) => ts.readConfigFile(configFile, (file) => host.readFile(host.resolve(file)));
        const readAngularCompilerOptions = (configFile, parentOptions = {}) => {
            const { config, error } = readConfigFile(configFile);
            if (error) {
                // Errors are handled later on by 'parseJsonConfigFileContent'
                return parentOptions;
            }
            // Note: In Google, `angularCompilerOptions` are stored in `bazelOptions`.
            // This function typically doesn't run for actual Angular compilations, but
            // tooling like Tsurge, or schematics may leverage this helper, so we account
            // for this here.
            const angularCompilerOptions = config.angularCompilerOptions ?? config.bazelOptions?.angularCompilerOptions;
            // we are only interested into merging 'angularCompilerOptions' as
            // other options like 'compilerOptions' are merged by TS
            let existingNgCompilerOptions = { ...angularCompilerOptions, ...parentOptions };
            if (!config.extends) {
                return existingNgCompilerOptions;
            }
            const extendsPaths = typeof config.extends === 'string' ? [config.extends] : config.extends;
            // Call readAngularCompilerOptions recursively to merge NG Compiler options
            // Reverse the array so the overrides happen from right to left.
            return [...extendsPaths].reverse().reduce((prevOptions, extendsPath) => {
                const extendedConfigPath = getExtendedConfigPath(configFile, extendsPath, host, fs);
                return extendedConfigPath === null
                    ? prevOptions
                    : readAngularCompilerOptions(extendedConfigPath, prevOptions);
            }, existingNgCompilerOptions);
        };
        const { projectFile, basePath } = calcProjectFileAndBasePath(project, host);
        const configFileName = host.resolve(host.pwd(), projectFile);
        const { config, error } = readConfigFile(projectFile);
        if (error) {
            return {
                project,
                errors: [error],
                rootNames: [],
                options: {},
                emitFlags: index.EmitFlags.Default,
            };
        }
        const existingCompilerOptions = {
            genDir: basePath,
            basePath,
            ...readAngularCompilerOptions(configFileName),
            ...existingOptions,
        };
        const parseConfigHost = createParseConfigHost(host, fs);
        const { options, errors, fileNames: rootNames, projectReferences, } = ts.parseJsonConfigFileContent(config, parseConfigHost, basePath, existingCompilerOptions, configFileName);
        let emitFlags = index.EmitFlags.Default;
        if (!(options['skipMetadataEmit'] || options['flatModuleOutFile'])) {
            emitFlags |= index.EmitFlags.Metadata;
        }
        if (options['skipTemplateCodegen']) {
            emitFlags = emitFlags & ~index.EmitFlags.Codegen;
        }
        return { project: projectFile, rootNames, projectReferences, options, errors, emitFlags };
    }
    catch (e) {
        const errors = [
            {
                category: ts.DiagnosticCategory.Error,
                messageText: e.stack ?? e.message,
                file: undefined,
                start: undefined,
                length: undefined,
                source: 'angular',
                code: index.UNKNOWN_ERROR_CODE,
            },
        ];
        return { project: '', errors, rootNames: [], options: {}, emitFlags: index.EmitFlags.Default };
    }
}
function createParseConfigHost(host, fs = checker.getFileSystem()) {
    return {
        fileExists: host.exists.bind(host),
        readDirectory: createFileSystemTsReadDirectoryFn(fs),
        readFile: host.readFile.bind(host),
        useCaseSensitiveFileNames: fs.isCaseSensitive(),
    };
}
function getExtendedConfigPath(configFile, extendsValue, host, fs) {
    const result = getExtendedConfigPathWorker(configFile, extendsValue, host, fs);
    if (result !== null) {
        return result;
    }
    // Try to resolve the paths with a json extension append a json extension to the file in case if
    // it is missing and the resolution failed. This is to replicate TypeScript behaviour, see:
    // https://github.com/microsoft/TypeScript/blob/294a5a7d784a5a95a8048ee990400979a6bc3a1c/src/compiler/commandLineParser.ts#L2806
    return getExtendedConfigPathWorker(configFile, `${extendsValue}.json`, host, fs);
}
function getExtendedConfigPathWorker(configFile, extendsValue, host, fs) {
    if (extendsValue.startsWith('.') || fs.isRooted(extendsValue)) {
        const extendedConfigPath = host.resolve(host.dirname(configFile), extendsValue);
        if (host.exists(extendedConfigPath)) {
            return extendedConfigPath;
        }
    }
    else {
        const parseConfigHost = createParseConfigHost(host, fs);
        // Path isn't a rooted or relative path, resolve like a module.
        const { resolvedModule } = ts.nodeModuleNameResolver(extendsValue, configFile, { moduleResolution: ts.ModuleResolutionKind.Node10, resolveJsonModule: true }, parseConfigHost);
        if (resolvedModule) {
            return checker.absoluteFrom(resolvedModule.resolvedFileName);
        }
    }
    return null;
}

/**
 * Angular compiler file system implementation that leverages an
 * CLI schematic virtual file tree.
 */
class DevkitMigrationFilesystem {
    tree;
    constructor(tree) {
        this.tree = tree;
    }
    extname(path) {
        return core.extname(path);
    }
    isRoot(path) {
        return path === core.normalize('/');
    }
    isRooted(path) {
        return this.normalize(path).startsWith('/');
    }
    dirname(file) {
        return this.normalize(core.dirname(file));
    }
    join(basePath, ...paths) {
        return this.normalize(core.join(basePath, ...paths));
    }
    relative(from, to) {
        return this.normalize(core.relative(from, to));
    }
    basename(filePath, extension) {
        return posixPath__namespace.basename(filePath, extension);
    }
    normalize(path) {
        return core.normalize(path);
    }
    resolve(...paths) {
        const normalizedPaths = paths.map((p) => core.normalize(p));
        // In dev-kit, the NodeJS working directory should never be
        // considered, so `/` is the last resort over `cwd`.
        return this.normalize(posixPath__namespace.resolve(core.normalize('/'), ...normalizedPaths));
    }
    pwd() {
        return '/';
    }
    isCaseSensitive() {
        return true;
    }
    exists(path) {
        return statPath(this.tree, path) !== null;
    }
    readFile(path) {
        return this.tree.readText(path);
    }
    readFileBuffer(path) {
        const buffer = this.tree.read(path);
        if (buffer === null) {
            throw new Error(`File does not exist: ${path}`);
        }
        return buffer;
    }
    readdir(path) {
        const dir = this.tree.getDir(path);
        return [
            ...dir.subdirs,
            ...dir.subfiles,
        ];
    }
    lstat(path) {
        const stat = statPath(this.tree, path);
        if (stat === null) {
            throw new Error(`File does not exist for "lstat": ${path}`);
        }
        return stat;
    }
    stat(path) {
        const stat = statPath(this.tree, path);
        if (stat === null) {
            throw new Error(`File does not exist for "stat": ${path}`);
        }
        return stat;
    }
    realpath(filePath) {
        return filePath;
    }
    getDefaultLibLocation() {
        return 'node_modules/typescript/lib';
    }
    ensureDir(path) {
        // Migrations should compute replacements and not write directly.
        throw new Error('DevkitFilesystem#ensureDir is not supported.');
    }
    writeFile(path, data) {
        // Migrations should compute replacements and not write directly.
        throw new Error('DevkitFilesystem#writeFile is not supported.');
    }
    removeFile(path) {
        // Migrations should compute replacements and not write directly.
        throw new Error('DevkitFilesystem#removeFile is not supported.');
    }
    copyFile(from, to) {
        // Migrations should compute replacements and not write directly.
        throw new Error('DevkitFilesystem#copyFile is not supported.');
    }
    moveFile(from, to) {
        // Migrations should compute replacements and not write directly.
        throw new Error('DevkitFilesystem#moveFile is not supported.');
    }
    removeDeep(path) {
        // Migrations should compute replacements and not write directly.
        throw new Error('DevkitFilesystem#removeDeep is not supported.');
    }
    chdir(_path) {
        throw new Error('FileSystem#chdir is not supported.');
    }
    symlink() {
        throw new Error('FileSystem#symlink is not supported.');
    }
}
/** Stats the given path in the virtual tree. */
function statPath(tree, path) {
    let fileInfo = null;
    let dirInfo = null;
    try {
        fileInfo = tree.get(path);
    }
    catch (e) {
        if (e.constructor.name === 'PathIsDirectoryException') {
            dirInfo = tree.getDir(path);
        }
        else {
            throw e;
        }
    }
    if (fileInfo !== null || dirInfo !== null) {
        return {
            isDirectory: () => dirInfo !== null,
            isFile: () => fileInfo !== null,
            isSymbolicLink: () => false,
        };
    }
    return null;
}

/**
 * Groups the given replacements per project relative
 * file path.
 *
 * This allows for simple execution of the replacements
 * against a given file. E.g. via {@link applyTextUpdates}.
 */
function groupReplacementsByFile(replacements) {
    const result = new Map();
    for (const { projectFile, update } of replacements) {
        if (!result.has(projectFile.rootRelativePath)) {
            result.set(projectFile.rootRelativePath, []);
        }
        result.get(projectFile.rootRelativePath).push(update);
    }
    return result;
}

/**
 * Synchronously combines unit data for the given migration.
 *
 * Note: This helper is useful for testing and execution of
 * Tsurge migrations in non-batchable environments. In general,
 * prefer parallel execution of combining via e.g. Beam combiners.
 */
async function synchronouslyCombineUnitData(migration, unitDatas) {
    if (unitDatas.length === 0) {
        return null;
    }
    if (unitDatas.length === 1) {
        return unitDatas[0];
    }
    let combined = unitDatas[0];
    for (let i = 1; i < unitDatas.length; i++) {
        const other = unitDatas[i];
        combined = await migration.combine(combined, other);
    }
    return combined;
}

/**
 * By default, Tsurge will always create an Angular compiler program
 * for projects analyzed and migrated. This works perfectly fine in
 * third-party where Tsurge migrations run in Angular CLI projects.
 *
 * In first party, when running against full Google3, creating an Angular
 * program for e.g. plain `ts_library` targets is overly expensive and
 * can result in out of memory issues for large TS targets. In 1P we can
 * reliably distinguish between TS and Angular targets via the `angularCompilerOptions`.
 */
function google3UsePlainTsProgramIfNoKnownAngularOption() {
    return process.env['GOOGLE3_TSURGE'] === '1';
}

/** Options that are good defaults for Tsurge migrations. */
const defaultMigrationTsOptions = {
    // Avoid checking libraries to speed up migrations.
    skipLibCheck: true,
    skipDefaultLibCheck: true,
    noEmit: true,
    // Does not apply to g3 and externally is enforced when the app is built by the compiler.
    disableTypeScriptVersionCheck: true,
};
/**
 * Creates an instance of a TypeScript program for the given project.
 */
function createPlainTsProgram(tsHost, tsconfig, optionOverrides) {
    const program = ts.createProgram({
        rootNames: tsconfig.rootNames,
        options: {
            ...tsconfig.options,
            ...defaultMigrationTsOptions,
            ...optionOverrides,
        },
    });
    return {
        ngCompiler: null,
        program,
        userOptions: tsconfig.options,
        __programAbsoluteRootFileNames: tsconfig.rootNames,
        host: tsHost,
    };
}

/**
 * Parses the configuration of the given TypeScript project and creates
 * an instance of the Angular compiler for the project.
 */
function createNgtscProgram(tsHost, tsconfig, optionOverrides) {
    const ngtscProgram = new index.NgtscProgram(tsconfig.rootNames, {
        ...tsconfig.options,
        ...defaultMigrationTsOptions,
        ...optionOverrides,
    }, tsHost);
    // Expose an easy way to debug-print ng semantic diagnostics.
    if (process.env['DEBUG_NG_SEMANTIC_DIAGNOSTICS'] === '1') {
        console.error(ts.formatDiagnosticsWithColorAndContext(ngtscProgram.getNgSemanticDiagnostics(), tsHost));
    }
    return {
        ngCompiler: ngtscProgram.compiler,
        program: ngtscProgram.getTsProgram(),
        userOptions: tsconfig.options,
        __programAbsoluteRootFileNames: tsconfig.rootNames,
        host: tsHost,
    };
}

/** Code of the error raised by TypeScript when a tsconfig doesn't match any files. */
const NO_INPUTS_ERROR_CODE = 18003;
/** Parses the given tsconfig file, supporting Angular compiler options. */
function parseTsconfigOrDie(absoluteTsconfigPath, fs) {
    const tsconfig = readConfiguration(absoluteTsconfigPath, {}, fs);
    // Skip the "No inputs found..." error since we don't want to interrupt the migration if a
    // tsconfig doesn't match a file. This will result in an empty `Program` which is still valid.
    const errors = tsconfig.errors.filter((diag) => diag.code !== NO_INPUTS_ERROR_CODE);
    if (errors.length) {
        throw new Error(`Tsconfig could not be parsed or is invalid:\n\n` + `${errors.map((e) => e.messageText)}`);
    }
    return tsconfig;
}

/** Creates the base program info for the given tsconfig path. */
function createBaseProgramInfo(absoluteTsconfigPath, fs, optionOverrides = {}) {
    if (fs === undefined) {
        fs = new checker.NodeJSFileSystem();
        checker.setFileSystem(fs);
    }
    const tsconfig = parseTsconfigOrDie(absoluteTsconfigPath, fs);
    const tsHost = new NgtscCompilerHost(fs, tsconfig.options);
    // When enabled, use a plain TS program if we are sure it's not
    // an Angular project based on the `tsconfig.json`.
    if (google3UsePlainTsProgramIfNoKnownAngularOption() &&
        tsconfig.options['_useHostForImportGeneration'] === undefined) {
        return createPlainTsProgram(tsHost, tsconfig, optionOverrides);
    }
    return createNgtscProgram(tsHost, tsconfig, optionOverrides);
}
/**
 * Creates the {@link ProgramInfo} from the given base information.
 *
 * This function purely exists to support custom programs that are
 * intended to be injected into Tsurge migrations. e.g. for language
 * service refactorings.
 */
function getProgramInfoFromBaseInfo(baseInfo) {
    const fullProgramSourceFiles = [...baseInfo.program.getSourceFiles()];
    const sourceFiles = fullProgramSourceFiles.filter((f) => !f.isDeclarationFile &&
        // Note `isShim` will work for the initial program, but for TCB programs, the shims are no longer annotated.
        !checker.isShim(f) &&
        !f.fileName.endsWith('.ngtypecheck.ts'));
    // Sort it by length in reverse order (longest first). This speeds up lookups,
    // since there's no need to keep going through the array once a match is found.
    const sortedRootDirs = checker.getRootDirs(baseInfo.host, baseInfo.userOptions).sort((a, b) => b.length - a.length);
    // TODO: Consider also following TS's logic here, finding the common source root.
    // See: Program#getCommonSourceDirectory.
    const primaryRoot = checker.absoluteFrom(baseInfo.userOptions.rootDir ?? sortedRootDirs.at(-1) ?? baseInfo.program.getCurrentDirectory());
    return {
        ...baseInfo,
        sourceFiles,
        fullProgramSourceFiles,
        sortedRootDirs,
        projectRoot: primaryRoot,
    };
}

/**
 * @private
 *
 * Base class for the possible Tsurge migration variants.
 *
 * For example, this class exposes methods to conveniently create
 * TypeScript programs, while also allowing migration authors to override.
 */
class TsurgeBaseMigration {
    /**
     * Creates the TypeScript program for a given compilation unit.
     *
     * By default:
     *  - In 3P: Ngtsc programs are being created.
     *  - In 1P: Ngtsc or TS programs are created based on the Blaze target.
     */
    createProgram(tsconfigAbsPath, fs, optionsOverride) {
        return getProgramInfoFromBaseInfo(createBaseProgramInfo(tsconfigAbsPath, fs, optionsOverride));
    }
}

/**
 * A simpler variant of a {@link TsurgeComplexMigration} that does not
 * fan-out into multiple workers per compilation unit to compute
 * the final migration replacements.
 *
 * This is faster and less resource intensive as workers and TS programs
 * are only ever created once.
 *
 * This is commonly the case when migrations are refactored to eagerly
 * compute replacements in the analyze stage, and then leverage the
 * global unit data to filter replacements that turned out to be "invalid".
 */
class TsurgeFunnelMigration extends TsurgeBaseMigration {
}
/**
 * Complex variant of a `Tsurge` migration.
 *
 * For example, every analyze worker may contribute to a list of TS
 * references that are later combined. The migrate phase can then compute actual
 * file updates for all individual compilation units, leveraging the global metadata
 * to e.g. see if there are any references from other compilation units that may be
 * problematic and prevent migration of a given file.
 */
class TsurgeComplexMigration extends TsurgeBaseMigration {
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
exports.MigrationStage = void 0;
(function (MigrationStage) {
    /** The migration is analyzing an entrypoint */
    MigrationStage[MigrationStage["Analysis"] = 0] = "Analysis";
    /** The migration is about to migrate an entrypoint */
    MigrationStage[MigrationStage["Migrate"] = 1] = "Migrate";
})(exports.MigrationStage || (exports.MigrationStage = {}));
/** Runs a Tsurge within an Angular Devkit context. */
async function runMigrationInDevkit(config) {
    const { buildPaths, testPaths } = await project_tsconfig_paths.getProjectTsConfigPaths(config.tree);
    if (!buildPaths.length && !testPaths.length) {
        throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the migration.');
    }
    const tsconfigPaths = [...buildPaths, ...testPaths];
    const fs = new DevkitMigrationFilesystem(config.tree);
    checker.setFileSystem(fs);
    const migration = config.getMigration(fs);
    const unitResults = [];
    const isFunnelMigration = migration instanceof TsurgeFunnelMigration;
    const compilationUnitAssignments = new Map();
    for (const tsconfigPath of tsconfigPaths) {
        config.beforeProgramCreation?.(tsconfigPath, exports.MigrationStage.Analysis);
        const info = migration.createProgram(tsconfigPath, fs);
        modifyProgramInfoToEnsureNonOverlappingFiles(tsconfigPath, info, compilationUnitAssignments);
        config.afterProgramCreation?.(info, fs, exports.MigrationStage.Analysis);
        config.beforeUnitAnalysis?.(tsconfigPath);
        unitResults.push(await migration.analyze(info));
    }
    config.afterAllAnalyzed?.();
    const combined = await synchronouslyCombineUnitData(migration, unitResults);
    if (combined === null) {
        config.afterAnalysisFailure?.();
        return;
    }
    const globalMeta = await migration.globalMeta(combined);
    let replacements;
    if (isFunnelMigration) {
        replacements = (await migration.migrate(globalMeta)).replacements;
    }
    else {
        replacements = [];
        for (const tsconfigPath of tsconfigPaths) {
            config.beforeProgramCreation?.(tsconfigPath, exports.MigrationStage.Migrate);
            const info = migration.createProgram(tsconfigPath, fs);
            modifyProgramInfoToEnsureNonOverlappingFiles(tsconfigPath, info, compilationUnitAssignments);
            config.afterProgramCreation?.(info, fs, exports.MigrationStage.Migrate);
            const result = await migration.migrate(globalMeta, info);
            replacements.push(...result.replacements);
        }
    }
    const replacementsPerFile = new Map();
    const changesPerFile = groupReplacementsByFile(replacements);
    for (const [file, changes] of changesPerFile) {
        if (!replacementsPerFile.has(file)) {
            replacementsPerFile.set(file, changes);
        }
    }
    for (const [file, changes] of replacementsPerFile) {
        const recorder = config.tree.beginUpdate(file);
        for (const c of changes) {
            recorder
                .remove(c.data.position, c.data.end - c.data.position)
                .insertRight(c.data.position, c.data.toInsert);
        }
        config.tree.commitUpdate(recorder);
    }
    config.whenDone?.(await migration.stats(globalMeta));
}
/**
 * Special logic for devkit migrations. In the Angular CLI, or in 3P precisely,
 * projects can have tsconfigs with overlapping source files. i.e. two tsconfigs
 * like e.g. build or test include the same `ts.SourceFile` (`.ts`). Migrations
 * should never have 2+ compilation units with overlapping source files as this
 * can result in duplicated replacements or analysis— hence we only ever assign a
 * source file to a compilation unit *once*.
 *
 * Note that this is fine as we expect Tsurge migrations to work together as
 * isolated compilation units— so it shouldn't matter if worst case a `.ts`
 * file ends up in the e.g. test program.
 */
function modifyProgramInfoToEnsureNonOverlappingFiles(tsconfigPath, info, compilationUnitAssignments) {
    const sourceFiles = [];
    for (const sf of info.sourceFiles) {
        const assignment = compilationUnitAssignments.get(sf.fileName);
        // File is already assigned to a different compilation unit.
        if (assignment !== undefined && assignment !== tsconfigPath) {
            continue;
        }
        compilationUnitAssignments.set(sf.fileName, tsconfigPath);
        sourceFiles.push(sf);
    }
    info.sourceFiles = sourceFiles;
}

/** A text replacement for the given file. */
class Replacement {
    projectFile;
    update;
    constructor(projectFile, update) {
        this.projectFile = projectFile;
        this.update = update;
    }
}
/** An isolated text update that may be applied to a file. */
class TextUpdate {
    data;
    constructor(data) {
        this.data = data;
    }
}

/** Confirms that the given data `T` is serializable. */
function confirmAsSerializable(data) {
    return data;
}

/**
 * Gets a project file instance for the given file.
 *
 * Use this helper for dealing with project paths throughout your
 * migration. The return type is serializable.
 *
 * See {@link ProjectFile}.
 */
function projectFile(file, { sortedRootDirs, projectRoot }) {
    const fs = checker.getFileSystem();
    const filePath = fs.resolve(typeof file === 'string' ? file : file.fileName);
    // Sorted root directories are sorted longest to shortest. First match
    // is the appropriate root directory for ID computation.
    for (const rootDir of sortedRootDirs) {
        if (!isWithinBasePath(fs, rootDir, filePath)) {
            continue;
        }
        return {
            id: fs.relative(rootDir, filePath),
            rootRelativePath: fs.relative(projectRoot, filePath),
        };
    }
    // E.g. project directory may be `src/`, but files may be looked up
    // from `node_modules/`. This is fine, but in those cases, no root
    // directory matches.
    const rootRelativePath = fs.relative(projectRoot, filePath);
    return {
        id: rootRelativePath,
        rootRelativePath: rootRelativePath,
    };
}
/**
 * Whether `path` is a descendant of the `base`?
 * E.g. `a/b/c` is within `a/b` but not within `a/x`.
 */
function isWithinBasePath(fs, base, path) {
    return checker.isLocalRelativePath(fs.relative(base, path));
}

exports.Replacement = Replacement;
exports.TextUpdate = TextUpdate;
exports.TsurgeComplexMigration = TsurgeComplexMigration;
exports.TsurgeFunnelMigration = TsurgeFunnelMigration;
exports.confirmAsSerializable = confirmAsSerializable;
exports.projectFile = projectFile;
exports.runMigrationInDevkit = runMigrationInDevkit;
+szx&'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var core = require('@angular-devkit/core');

/**
 * Gets all tsconfig paths from a CLI project by reading the workspace configuration
 * and looking for common tsconfig locations.
 */
async function getProjectTsConfigPaths(tree) {
    // Start with some tsconfig paths that are generally used within CLI projects. Note
    // that we are not interested in IDE-specific tsconfig files (e.g. /tsconfig.json)
    const buildPaths = new Set();
    const testPaths = new Set();
    const workspace = await getWorkspace(tree);
    for (const [, project] of workspace.projects) {
        for (const [name, target] of project.targets) {
            if (name !== 'build' && name !== 'test') {
                continue;
            }
            for (const [, options] of allTargetOptions(target)) {
                const tsConfig = options['tsConfig'];
                // Filter out tsconfig files that don't exist in the CLI project.
                if (typeof tsConfig !== 'string' || !tree.exists(tsConfig)) {
                    continue;
                }
                if (name === 'build') {
                    buildPaths.add(core.normalize(tsConfig));
                }
                else {
                    testPaths.add(core.normalize(tsConfig));
                }
            }
        }
    }
    return {
        buildPaths: [...buildPaths],
        testPaths: [...testPaths],
    };
}
/** Get options for all configurations for the passed builder target. */
function* allTargetOptions(target) {
    if (target.options) {
        yield [undefined, target.options];
    }
    if (!target.configurations) {
        return;
    }
    for (const [name, options] of Object.entries(target.configurations)) {
        if (options) {
            yield [name, options];
        }
    }
}
function createHost(tree) {
    return {
        async readFile(path) {
            const data = tree.read(path);
            if (!data) {
                throw new Error('File not found.');
            }
            return core.virtualFs.fileBufferToString(data);
        },
        async writeFile(path, data) {
            return tree.overwrite(path, data);
        },
        async isDirectory(path) {
            // Approximate a directory check.
            // We don't need to consider empty directories and hence this is a good enough approach.
            // This is also per documentation, see:
            // https://angular.dev/tools/cli/schematics-for-libraries#get-the-project-configuration
            return !tree.exists(path) && tree.getDir(path).subfiles.length > 0;
        },
        async isFile(path) {
            return tree.exists(path);
        },
    };
}
async function getWorkspace(tree) {
    const host = createHost(tree);
    const { workspace } = await core.workspaces.readWorkspace('/', host);
    return workspace;
}

exports.getProjectTsConfigPaths = getProjectTsConfigPaths;
i1x'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');

/**
 * Gets the text of the given property name. Returns null if the property
 * name couldn't be determined statically.
 */
function getPropertyNameText(node) {
    if (ts.isIdentifier(node) || ts.isStringLiteralLike(node)) {
        return node.text;
    }
    return null;
}
/** Finds a property with a specific name in an object literal expression. */
function findLiteralProperty(literal, name) {
    return literal.properties.find((prop) => prop.name && ts.isIdentifier(prop.name) && prop.name.text === name);
}

exports.findLiteralProperty = findLiteralProperty;
exports.getPropertyNameText = getPropertyNameText;
Hcx8'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var schematics = require('@angular-devkit/schematics');
var p = require('path');
var project_tsconfig_paths = require('./project_tsconfig_paths-CDVxT6Ov.cjs');
var compiler_host = require('./compiler_host-C55Cczah.cjs');
var ts = require('typescript');
var imports = require('./imports-CIX-JgAN.cjs');
require('@angular-devkit/core');
require('./checker-BwV9MjSQ.cjs');
require('os');
require('fs');
require('module');
require('url');

function migrateFile(sourceFile, rewriteFn) {
    const changeTracker = new compiler_host.ChangeTracker(ts.createPrinter());
    const visitNode = (node) => {
        const provider = tryParseProviderExpression(node);
        if (provider) {
            replaceProviderWithNewApi({
                sourceFile,
                node,
                provider,
                changeTracker,
            });
            return;
        }
        ts.forEachChild(node, visitNode);
    };
    ts.forEachChild(sourceFile, visitNode);
    for (const change of changeTracker.recordChanges().get(sourceFile)?.values() ?? []) {
        rewriteFn(change.start, change.removeLength ?? 0, change.text);
    }
}
function replaceProviderWithNewApi({ sourceFile, node, provider, changeTracker, }) {
    const { initializerCode, importInject, provideInitializerFunctionName, initializerToken } = provider;
    const initializerTokenSpecifier = imports.getImportSpecifier(sourceFile, angularCoreModule, initializerToken);
    // The token doesn't come from `@angular/core`.
    if (!initializerTokenSpecifier) {
        return;
    }
    // Replace the provider with the new provide function.
    changeTracker.replaceText(sourceFile, node.getStart(), node.getWidth(), `${provideInitializerFunctionName}(${initializerCode})`);
    // Remove the `*_INITIALIZER` token from imports.
    changeTracker.removeImport(sourceFile, initializerToken, angularCoreModule);
    // Add the `inject` function to imports if needed.
    if (importInject) {
        changeTracker.addImport(sourceFile, 'inject', angularCoreModule);
    }
    // Add the `provide*Initializer` function to imports.
    changeTracker.addImport(sourceFile, provideInitializerFunctionName, angularCoreModule);
}
function tryParseProviderExpression(node) {
    if (!ts.isObjectLiteralExpression(node)) {
        return;
    }
    let deps = [];
    let initializerToken;
    let useExisting;
    let useFactoryCode;
    let useValue;
    let multi = false;
    for (const property of node.properties) {
        if (ts.isPropertyAssignment(property) && ts.isIdentifier(property.name)) {
            switch (property.name.text) {
                case 'deps':
                    if (ts.isArrayLiteralExpression(property.initializer)) {
                        deps = property.initializer.elements.map((el) => el.getText());
                    }
                    break;
                case 'provide':
                    initializerToken = property.initializer.getText();
                    break;
                case 'useExisting':
                    useExisting = property.initializer;
                    break;
                case 'useFactory':
                    useFactoryCode = property.initializer.getText();
                    break;
                case 'useValue':
                    useValue = property.initializer;
                    break;
                case 'multi':
                    multi = property.initializer.kind === ts.SyntaxKind.TrueKeyword;
                    break;
            }
        }
        // Handle the `useFactory() {}` shorthand case.
        if (ts.isMethodDeclaration(property) && property.name.getText() === 'useFactory') {
            const params = property.parameters.map((param) => param.getText()).join(', ');
            useFactoryCode = `(${params}) => ${property.body?.getText()}`;
        }
    }
    if (!initializerToken || !multi) {
        return;
    }
    const provideInitializerFunctionName = initializerTokenToFunctionMap.get(initializerToken);
    if (!provideInitializerFunctionName) {
        return;
    }
    const info = {
        initializerToken,
        provideInitializerFunctionName,
        importInject: false,
    };
    if (useExisting) {
        return {
            ...info,
            importInject: true,
            initializerCode: `() => inject(${useExisting.getText()})()`,
        };
    }
    if (useFactoryCode) {
        const args = deps.map((dep) => `inject(${dep})`);
        return {
            ...info,
            importInject: deps.length > 0,
            initializerCode: `() => {
        const initializerFn = (${useFactoryCode})(${args.join(', ')});
        return initializerFn();
      }`,
        };
    }
    if (useValue) {
        return { ...info, initializerCode: useValue.getText() };
    }
    return;
}
const angularCoreModule = '@angular/core';
const initializerTokenToFunctionMap = new Map([
    ['APP_INITIALIZER', 'provideAppInitializer'],
    ['ENVIRONMENT_INITIALIZER', 'provideEnvironmentInitializer'],
    ['PLATFORM_INITIALIZER', 'providePlatformInitializer'],
]);

function migrate() {
    return async (tree) => {
        const { buildPaths, testPaths } = await project_tsconfig_paths.getProjectTsConfigPaths(tree);
        const basePath = process.cwd();
        const allPaths = [...buildPaths, ...testPaths];
        if (!allPaths.length) {
            throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the provide initializer migration.');
        }
        for (const tsconfigPath of allPaths) {
            runMigration(tree, tsconfigPath, basePath);
        }
    };
}
function runMigration(tree, tsconfigPath, basePath) {
    const program = compiler_host.createMigrationProgram(tree, tsconfigPath, basePath);
    const sourceFiles = program
        .getSourceFiles()
        .filter((sourceFile) => compiler_host.canMigrateFile(basePath, sourceFile, program));
    for (const sourceFile of sourceFiles) {
        let update = null;
        const rewriter = (startPos, width, text) => {
            if (update === null) {
                // Lazily initialize update, because most files will not require migration.
                update = tree.beginUpdate(p.relative(basePath, sourceFile.fileName));
            }
            update.remove(startPos, width);
            if (text !== null) {
                update.insertLeft(startPos, text);
            }
        };
        migrateFile(sourceFile, rewriter);
        if (update !== null) {
            tree.commitUpdate(update);
        }
    }
}

exports.migrate = migrate;
	xmK'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var schematics = require('@angular-devkit/schematics');
var fs = require('fs');
var p = require('path');
var compiler_host = require('./compiler_host-C55Cczah.cjs');
var project_tsconfig_paths = require('./project_tsconfig_paths-CDVxT6Ov.cjs');
var ts = require('typescript');
var checker = require('./checker-BwV9MjSQ.cjs');
var property_name = require('./property_name-BBwFuqMe.cjs');
require('os');
require('@angular-devkit/core');
require('module');
require('url');

/**
 * Finds the class declaration that is being referred to by a node.
 * @param reference Node referring to a class declaration.
 * @param typeChecker
 */
function findClassDeclaration(reference, typeChecker) {
    return (typeChecker
        .getTypeAtLocation(reference)
        .getSymbol()
        ?.declarations?.find(ts.isClassDeclaration) || null);
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Checks whether a component is standalone.
 * @param node Class being checked.
 * @param reflector The reflection host to use.
 */
function isStandaloneComponent(node, reflector) {
    const decorators = reflector.getDecoratorsOfDeclaration(node);
    if (decorators === null) {
        return false;
    }
    const decorator = checker.findAngularDecorator(decorators, 'Component', false);
    if (decorator === undefined || decorator.args === null || decorator.args.length !== 1) {
        return false;
    }
    const arg = decorator.args[0];
    if (ts.isObjectLiteralExpression(arg)) {
        const property = property_name.findLiteralProperty(arg, 'standalone');
        if (property) {
            return property.initializer.getText() === 'true';
        }
        else {
            return true; // standalone is true by default in v19
        }
    }
    return false;
}
/**
 * Checks whether a node is variable declaration of type Routes or Route[] and comes from @angular/router
 * @param node Variable declaration being checked.
 * @param typeChecker
 */
function isAngularRoutesArray(node, typeChecker) {
    if (ts.isVariableDeclaration(node)) {
        const type = typeChecker.getTypeAtLocation(node);
        if (type && typeChecker.isArrayType(type)) {
            // Route[] is an array type
            const typeArguments = typeChecker.getTypeArguments(type);
            const symbol = typeArguments[0]?.getSymbol();
            return (symbol?.name === 'Route' &&
                symbol?.declarations?.some((decl) => {
                    return decl.getSourceFile().fileName.includes('@angular/router');
                }));
        }
    }
    return false;
}
/**
 * Checks whether a node is a call expression to a router module method.
 * Examples:
 * - RouterModule.forRoot(routes)
 * - RouterModule.forChild(routes)
 */
function isRouterModuleCallExpression(node, typeChecker) {
    if (ts.isPropertyAccessExpression(node.expression)) {
        const propAccess = node.expression;
        const moduleSymbol = typeChecker.getSymbolAtLocation(propAccess.expression);
        return (moduleSymbol?.name === 'RouterModule' &&
            (propAccess.name.text === 'forRoot' || propAccess.name.text === 'forChild'));
    }
    return false;
}
/**
 * Checks whether a node is a call expression to a router method.
 * Example: this.router.resetConfig(routes)
 */
function isRouterCallExpression(node, typeChecker) {
    if (ts.isCallExpression(node) &&
        ts.isPropertyAccessExpression(node.expression) &&
        node.expression.name.text === 'resetConfig') {
        const calleeExpression = node.expression.expression;
        const symbol = typeChecker.getSymbolAtLocation(calleeExpression);
        if (symbol) {
            const type = typeChecker.getTypeOfSymbolAtLocation(symbol, calleeExpression);
            // if type of router is Router, then it is a router call expression
            return type.aliasSymbol?.escapedName === 'Router';
        }
    }
    return false;
}
/**
 * Checks whether a node is a call expression to router provide function.
 * Example: provideRoutes(routes)
 */
function isRouterProviderCallExpression(node, typeChecker) {
    if (ts.isIdentifier(node.expression)) {
        const moduleSymbol = typeChecker.getSymbolAtLocation(node.expression);
        return moduleSymbol && moduleSymbol.name === 'provideRoutes';
    }
    return false;
}
/**
 * Checks whether a node is a call expression to provideRouter function.
 * Example: provideRouter(routes)
 */
function isProvideRoutesCallExpression(node, typeChecker) {
    if (ts.isIdentifier(node.expression)) {
        const moduleSymbol = typeChecker.getSymbolAtLocation(node.expression);
        return moduleSymbol && moduleSymbol.name === 'provideRouter';
    }
    return false;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Converts all application routes that are using standalone components to be lazy loaded.
 * @param sourceFile File that should be migrated.
 * @param program
 */
function migrateFileToLazyRoutes(sourceFile, program) {
    const typeChecker = program.getTypeChecker();
    const reflector = new checker.TypeScriptReflectionHost(typeChecker);
    const printer = ts.createPrinter();
    const tracker = new compiler_host.ChangeTracker(printer);
    const routeArraysToMigrate = findRoutesArrayToMigrate(sourceFile, typeChecker);
    if (routeArraysToMigrate.length === 0) {
        return { pendingChanges: [], skippedRoutes: [], migratedRoutes: [] };
    }
    const { skippedRoutes, migratedRoutes } = migrateRoutesArray(routeArraysToMigrate, typeChecker, reflector, tracker);
    return {
        pendingChanges: tracker.recordChanges().get(sourceFile) || [],
        skippedRoutes,
        migratedRoutes,
    };
}
/** Finds route object that can be migrated */
function findRoutesArrayToMigrate(sourceFile, typeChecker) {
    const routesArrays = [];
    sourceFile.forEachChild(function walk(node) {
        if (ts.isCallExpression(node)) {
            if (isRouterModuleCallExpression(node, typeChecker) ||
                isRouterProviderCallExpression(node, typeChecker) ||
                isRouterCallExpression(node, typeChecker) ||
                isProvideRoutesCallExpression(node, typeChecker)) {
                const arg = node.arguments[0]; // ex: RouterModule.forRoot(routes) or provideRouter(routes)
                const routeFileImports = sourceFile.statements.filter(ts.isImportDeclaration);
                if (ts.isArrayLiteralExpression(arg) && arg.elements.length > 0) {
                    // ex: inline routes array: RouterModule.forRoot([{ path: 'test', component: TestComponent }])
                    routesArrays.push({
                        routeFilePath: sourceFile.fileName,
                        array: arg,
                        routeFileImports,
                    });
                }
                else if (ts.isIdentifier(arg)) {
                    // ex: reference to routes array: RouterModule.forRoot(routes)
                    // RouterModule.forRoot(routes), provideRouter(routes), provideRoutes(routes)
                    const symbol = typeChecker.getSymbolAtLocation(arg);
                    if (!symbol?.declarations)
                        return;
                    for (const declaration of symbol.declarations) {
                        if (ts.isVariableDeclaration(declaration)) {
                            const initializer = declaration.initializer;
                            if (initializer && ts.isArrayLiteralExpression(initializer)) {
                                // ex: const routes = [{ path: 'test', component: TestComponent }];
                                routesArrays.push({
                                    routeFilePath: sourceFile.fileName,
                                    array: initializer,
                                    routeFileImports,
                                });
                            }
                        }
                    }
                }
            }
        }
        if (ts.isVariableDeclaration(node)) {
            if (isAngularRoutesArray(node, typeChecker)) {
                const initializer = node.initializer;
                if (initializer &&
                    ts.isArrayLiteralExpression(initializer) &&
                    initializer.elements.length > 0) {
                    // ex: const routes: Routes = [{ path: 'test', component: TestComponent }];
                    if (routesArrays.find((x) => x.array === initializer)) {
                        // already exists
                        return;
                    }
                    routesArrays.push({
                        routeFilePath: sourceFile.fileName,
                        array: initializer,
                        routeFileImports: sourceFile.statements.filter(ts.isImportDeclaration),
                    });
                }
            }
        }
        node.forEachChild(walk);
    });
    return routesArrays;
}
/** Migrate a routes object standalone components to be lazy loaded. */
function migrateRoutesArray(routesArray, typeChecker, reflector, tracker) {
    const migratedRoutes = [];
    const skippedRoutes = [];
    const importsToRemove = [];
    for (const route of routesArray) {
        route.array.elements.forEach((element) => {
            if (ts.isObjectLiteralExpression(element)) {
                const { migratedRoutes: migrated, skippedRoutes: toBeSkipped, importsToRemove: toBeRemoved, } = migrateRoute(element, route, typeChecker, reflector, tracker);
                migratedRoutes.push(...migrated);
                skippedRoutes.push(...toBeSkipped);
                importsToRemove.push(...toBeRemoved);
            }
        });
    }
    for (const importToRemove of importsToRemove) {
        tracker.removeNode(importToRemove);
    }
    return { migratedRoutes, skippedRoutes };
}
/**
 * Migrates a single route object and returns the results of the migration
 * It recursively migrates the children routes if they exist
 */
function migrateRoute(element, route, typeChecker, reflector, tracker) {
    const skippedRoutes = [];
    const migratedRoutes = [];
    const importsToRemove = [];
    const component = property_name.findLiteralProperty(element, 'component');
    // this can be empty string or a variable that is not a string, or not present at all
    const routePath = property_name.findLiteralProperty(element, 'path')?.getText() ?? '';
    const children = property_name.findLiteralProperty(element, 'children');
    // recursively migrate children routes first if they exist
    if (children && ts.isArrayLiteralExpression(children.initializer)) {
        for (const childRoute of children.initializer.elements) {
            if (ts.isObjectLiteralExpression(childRoute)) {
                const { migratedRoutes: migrated, skippedRoutes: toBeSkipped, importsToRemove: toBeRemoved, } = migrateRoute(childRoute, route, typeChecker, reflector, tracker);
                migratedRoutes.push(...migrated);
                skippedRoutes.push(...toBeSkipped);
                importsToRemove.push(...toBeRemoved);
            }
        }
    }
    const routeMigrationResults = { migratedRoutes, skippedRoutes, importsToRemove };
    if (!component) {
        return routeMigrationResults;
    }
    const componentDeclaration = findClassDeclaration(component, typeChecker);
    if (!componentDeclaration) {
        return routeMigrationResults;
    }
    // if component is not a standalone component, skip it
    if (!isStandaloneComponent(componentDeclaration, reflector)) {
        skippedRoutes.push({ path: routePath, file: route.routeFilePath });
        return routeMigrationResults;
    }
    const componentClassName = componentDeclaration.name && ts.isIdentifier(componentDeclaration.name)
        ? componentDeclaration.name.text
        : null;
    if (!componentClassName) {
        return routeMigrationResults;
    }
    // if component is in the same file as the routes array, skip it
    if (componentDeclaration.getSourceFile().fileName === route.routeFilePath) {
        return routeMigrationResults;
    }
    const componentImport = route.routeFileImports.find((importDecl) => importDecl.importClause?.getText().includes(componentClassName));
    // remove single and double quotes from the import path
    let componentImportPath = ts.isStringLiteral(componentImport?.moduleSpecifier)
        ? componentImport.moduleSpecifier.text
        : null;
    // if the import path is not a string literal, skip it
    if (!componentImportPath) {
        skippedRoutes.push({ path: routePath, file: route.routeFilePath });
        return routeMigrationResults;
    }
    const isDefaultExport = componentDeclaration.modifiers?.some((x) => x.kind === ts.SyntaxKind.DefaultKeyword) ?? false;
    const loadComponent = createLoadComponentPropertyAssignment(componentImportPath, componentClassName, isDefaultExport);
    tracker.replaceNode(component, loadComponent);
    // Add the import statement for the standalone component
    if (!importsToRemove.includes(componentImport)) {
        importsToRemove.push(componentImport);
    }
    migratedRoutes.push({ path: routePath, file: route.routeFilePath });
    // the component was migrated, so we return the results
    return routeMigrationResults;
}
/**
 * Generates the loadComponent property assignment for a given component.
 *
 * Example:
 * loadComponent: () => import('./path').then(m => m.componentName)
 * or
 * loadComponent: () => import('./path') // when isDefaultExport is true
 */
function createLoadComponentPropertyAssignment(componentImportPath, componentDeclarationName, isDefaultExport) {
    return ts.factory.createPropertyAssignment('loadComponent', ts.factory.createArrowFunction(undefined, undefined, [], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), isDefaultExport
        ? createImportCallExpression(componentImportPath) // will generate import('./path) and will skip the then() call
        : ts.factory.createCallExpression(
        // will generate import('./path).then(m => m.componentName)
        ts.factory.createPropertyAccessExpression(createImportCallExpression(componentImportPath), 'then'), undefined, [createImportThenCallExpression(componentDeclarationName)])));
}
// import('./path)
const createImportCallExpression = (componentImportPath) => ts.factory.createCallExpression(ts.factory.createIdentifier('import'), undefined, [
    ts.factory.createStringLiteral(componentImportPath, true),
]);
// m => m.componentName
const createImportThenCallExpression = (componentDeclarationName) => ts.factory.createArrowFunction(undefined, undefined, [ts.factory.createParameterDeclaration(undefined, undefined, 'm', undefined, undefined)], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('m'), componentDeclarationName));

function migrate(options) {
    return async (tree, context) => {
        const { buildPaths } = await project_tsconfig_paths.getProjectTsConfigPaths(tree);
        const basePath = process.cwd();
        // TS and Schematic use paths in POSIX format even on Windows. This is needed as otherwise
        // string matching such as `sourceFile.fileName.startsWith(pathToMigrate)` might not work.
        const pathToMigrate = compiler_host.normalizePath(p.join(basePath, options.path));
        if (!buildPaths.length) {
            throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the route lazy loading migration.');
        }
        let migratedRoutes = [];
        let skippedRoutes = [];
        for (const tsconfigPath of buildPaths) {
            const { migratedRoutes: migrated, skippedRoutes: skipped } = standaloneRoutesMigration(tree, tsconfigPath, basePath, pathToMigrate, options);
            migratedRoutes.push(...migrated);
            skippedRoutes.push(...skipped);
        }
        if (migratedRoutes.length === 0 && skippedRoutes.length === 0) {
            throw new schematics.SchematicsException(`Could not find any files to migrate under the path ${pathToMigrate}.`);
        }
        context.logger.info('🎉 Automated migration step has finished! 🎉');
        context.logger.info(`Number of updated routes: ${migratedRoutes.length}`);
        context.logger.info(`Number of skipped routes: ${skippedRoutes.length}`);
        if (skippedRoutes.length > 0) {
            context.logger.info(`Note: this migration was unable to optimize the following routes, since they use components declared in NgModules:`);
            for (const route of skippedRoutes) {
                context.logger.info(`- \`${route.path}\` path at \`${route.file}\``);
            }
            context.logger.info(`Consider making those components standalone and run this migration again. More information about standalone migration can be found at https://angular.dev/reference/migrations/standalone`);
        }
        context.logger.info('IMPORTANT! Please verify manually that your application builds and behaves as expected.');
        context.logger.info(`See https://angular.dev/reference/migrations/route-lazy-loading for more information.`);
    };
}
function standaloneRoutesMigration(tree, tsconfigPath, basePath, pathToMigrate, schematicOptions) {
    if (schematicOptions.path.startsWith('..')) {
        throw new schematics.SchematicsException('Cannot run route lazy loading migration outside of the current project.');
    }
    if (fs.existsSync(pathToMigrate) && !fs.statSync(pathToMigrate).isDirectory()) {
        throw new schematics.SchematicsException(`Migration path ${pathToMigrate} has to be a directory. Cannot run the route lazy loading migration.`);
    }
    const program = compiler_host.createMigrationProgram(tree, tsconfigPath, basePath);
    const sourceFiles = program
        .getSourceFiles()
        .filter((sourceFile) => sourceFile.fileName.startsWith(pathToMigrate) &&
        compiler_host.canMigrateFile(basePath, sourceFile, program));
    const migratedRoutes = [];
    const skippedRoutes = [];
    if (sourceFiles.length === 0) {
        return { migratedRoutes, skippedRoutes };
    }
    for (const sourceFile of sourceFiles) {
        const { pendingChanges, skippedRoutes: skipped, migratedRoutes: migrated, } = migrateFileToLazyRoutes(sourceFile, program);
        skippedRoutes.push(...skipped);
        migratedRoutes.push(...migrated);
        const update = tree.beginUpdate(p.relative(basePath, sourceFile.fileName));
        pendingChanges.forEach((change) => {
            if (change.removeLength != null) {
                update.remove(change.start, change.removeLength);
            }
            update.insertRight(change.start, change.text);
        });
        tree.commitUpdate(update);
    }
    return { migratedRoutes, skippedRoutes };
}

exports.migrate = migrate;
hxD'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var ts = require('typescript');
require('os');
var checker = require('./checker-BwV9MjSQ.cjs');
require('./index-BnJH1Hc7.cjs');
require('path');
var project_paths = require('./project_paths-DY3SIODd.cjs');
var ng_decorators = require('./ng_decorators-B5HCqr20.cjs');
var property_name = require('./property_name-BBwFuqMe.cjs');
require('@angular-devkit/core');
require('node:path/posix');
require('fs');
require('module');
require('url');
require('@angular-devkit/schematics');
require('./project_tsconfig_paths-CDVxT6Ov.cjs');
require('./imports-CIX-JgAN.cjs');

/**
 * Unwraps a given expression TypeScript node. Expressions can be wrapped within multiple
 * parentheses or as expression. e.g. "(((({exp}))))()". The function should return the
 * TypeScript node referring to the inner expression. e.g "exp".
 */
function unwrapExpression(node) {
    if (ts.isParenthesizedExpression(node) || ts.isAsExpression(node)) {
        return unwrapExpression(node.expression);
    }
    else {
        return node;
    }
}

/** Extracts `@Directive` or `@Component` metadata from the given class. */
function extractAngularClassMetadata(typeChecker, node) {
    const decorators = ts.getDecorators(node);
    if (!decorators || !decorators.length) {
        return null;
    }
    const ngDecorators = ng_decorators.getAngularDecorators(typeChecker, decorators);
    const componentDecorator = ngDecorators.find((dec) => dec.name === 'Component');
    const directiveDecorator = ngDecorators.find((dec) => dec.name === 'Directive');
    const decorator = componentDecorator ?? directiveDecorator;
    // In case no decorator could be found on the current class, skip.
    if (!decorator) {
        return null;
    }
    const decoratorCall = decorator.node.expression;
    // In case the decorator call is not valid, skip this class declaration.
    if (decoratorCall.arguments.length !== 1) {
        return null;
    }
    const metadata = unwrapExpression(decoratorCall.arguments[0]);
    // Ensure that the metadata is an object literal expression.
    if (!ts.isObjectLiteralExpression(metadata)) {
        return null;
    }
    return {
        type: componentDecorator ? 'component' : 'directive',
        node: metadata,
    };
}

const LF_CHAR = 10;
const CR_CHAR = 13;
const LINE_SEP_CHAR = 8232;
const PARAGRAPH_CHAR = 8233;
/** Gets the line and character for the given position from the line starts map. */
function getLineAndCharacterFromPosition(lineStartsMap, position) {
    const lineIndex = findClosestLineStartPosition(lineStartsMap, position);
    return { character: position - lineStartsMap[lineIndex], line: lineIndex };
}
/**
 * Computes the line start map of the given text. This can be used in order to
 * retrieve the line and character of a given text position index.
 */
function computeLineStartsMap(text) {
    const result = [0];
    let pos = 0;
    while (pos < text.length) {
        const char = text.charCodeAt(pos++);
        // Handles the "CRLF" line break. In that case we peek the character
        // after the "CR" and check if it is a line feed.
        if (char === CR_CHAR) {
            if (text.charCodeAt(pos) === LF_CHAR) {
                pos++;
            }
            result.push(pos);
        }
        else if (char === LF_CHAR || char === LINE_SEP_CHAR || char === PARAGRAPH_CHAR) {
            result.push(pos);
        }
    }
    result.push(pos);
    return result;
}
/** Finds the closest line start for the given position. */
function findClosestLineStartPosition(linesMap, position, low = 0, high = linesMap.length - 1) {
    while (low <= high) {
        const pivotIdx = Math.floor((low + high) / 2);
        const pivotEl = linesMap[pivotIdx];
        if (pivotEl === position) {
            return pivotIdx;
        }
        else if (position > pivotEl) {
            low = pivotIdx + 1;
        }
        else {
            high = pivotIdx - 1;
        }
    }
    // In case there was no exact match, return the closest "lower" line index. We also
    // subtract the index by one because want the index of the previous line start.
    return low - 1;
}

/**
 * Visitor that can be used to determine Angular templates referenced within given
 * TypeScript source files (inline templates or external referenced templates)
 */
class NgComponentTemplateVisitor {
    typeChecker;
    resolvedTemplates = [];
    fs = checker.getFileSystem();
    constructor(typeChecker) {
        this.typeChecker = typeChecker;
    }
    visitNode(node) {
        if (node.kind === ts.SyntaxKind.ClassDeclaration) {
            this.visitClassDeclaration(node);
        }
        ts.forEachChild(node, (n) => this.visitNode(n));
    }
    visitClassDeclaration(node) {
        const metadata = extractAngularClassMetadata(this.typeChecker, node);
        if (metadata === null || metadata.type !== 'component') {
            return;
        }
        const sourceFile = node.getSourceFile();
        const sourceFileName = sourceFile.fileName;
        // Walk through all component metadata properties and determine the referenced
        // HTML templates (either external or inline)
        metadata.node.properties.forEach((property) => {
            if (!ts.isPropertyAssignment(property)) {
                return;
            }
            const propertyName = property_name.getPropertyNameText(property.name);
            // In case there is an inline template specified, ensure that the value is statically
            // analyzable by checking if the initializer is a string literal-like node.
            if (propertyName === 'template' && ts.isStringLiteralLike(property.initializer)) {
                // Need to add an offset of one to the start because the template quotes are
                // not part of the template content.
                // The `getText()` method gives us the original raw text.
                // We could have used the `text` property, but if the template is defined as a backtick
                // string then the `text` property contains a "cooked" version of the string. Such cooked
                // strings will have converted CRLF characters to only LF. This messes up string
                // replacements in template migrations.
                // The raw text returned by `getText()` includes the enclosing quotes so we change the
                // `content` and `start` values accordingly.
                const content = property.initializer.getText().slice(1, -1);
                const start = property.initializer.getStart() + 1;
                this.resolvedTemplates.push({
                    filePath: sourceFileName,
                    container: node,
                    content,
                    inline: true,
                    start: start,
                    getCharacterAndLineOfPosition: (pos) => ts.getLineAndCharacterOfPosition(sourceFile, pos + start),
                });
            }
            if (propertyName === 'templateUrl' && ts.isStringLiteralLike(property.initializer)) {
                const absolutePath = this.fs.resolve(this.fs.dirname(sourceFileName), property.initializer.text);
                if (!this.fs.exists(absolutePath)) {
                    return;
                }
                const fileContent = this.fs.readFile(absolutePath);
                const lineStartsMap = computeLineStartsMap(fileContent);
                this.resolvedTemplates.push({
                    filePath: absolutePath,
                    container: node,
                    content: fileContent,
                    inline: false,
                    start: 0,
                    getCharacterAndLineOfPosition: (pos) => getLineAndCharacterFromPosition(lineStartsMap, pos),
                });
            }
        });
    }
}

function parseTemplate(template) {
    let parsed;
    try {
        // Note: we use the HtmlParser here, instead of the `parseTemplate` function, because the
        // latter returns an Ivy AST, not an HTML AST. The HTML AST has the advantage of preserving
        // interpolated text as text nodes containing a mixture of interpolation tokens and text tokens,
        // rather than turning them into `BoundText` nodes like the Ivy AST does. This allows us to
        // easily get the text-only ranges without having to reconstruct the original text.
        parsed = new checker.HtmlParser().parse(template, '', {
            // Allows for ICUs to be parsed.
            tokenizeExpansionForms: true,
            // Explicitly disable blocks so that their characters are treated as plain text.
            tokenizeBlocks: true,
            preserveLineEndings: true,
        });
        // Don't migrate invalid templates.
        if (parsed.errors && parsed.errors.length > 0) {
            const errors = parsed.errors.map((e) => ({ type: 'parse', error: e }));
            return { tree: undefined, errors };
        }
    }
    catch (e) {
        return { tree: undefined, errors: [{ type: 'parse', error: e }] };
    }
    return { tree: parsed, errors: [] };
}

function migrateTemplateToSelfClosingTags(template) {
    let parsed = parseTemplate(template);
    if (parsed.tree === undefined) {
        return { migrated: template, changed: false, replacementCount: 0 };
    }
    const visitor = new AngularElementCollector();
    checker.visitAll(visitor, parsed.tree.rootNodes);
    let newTemplate = template;
    let changedOffset = 0;
    let replacementCount = 0;
    for (let element of visitor.elements) {
        const { start, end, tagName } = element;
        const currentLength = newTemplate.length;
        const templatePart = newTemplate.slice(start + changedOffset, end + changedOffset);
        const convertedTemplate = replaceWithSelfClosingTag(templatePart, tagName);
        // if the template has changed, replace the original template with the new one
        if (convertedTemplate.length !== templatePart.length) {
            newTemplate = replaceTemplate(newTemplate, convertedTemplate, start, end, changedOffset);
            changedOffset += newTemplate.length - currentLength;
            replacementCount++;
        }
    }
    return { migrated: newTemplate, changed: changedOffset !== 0, replacementCount };
}
function replaceWithSelfClosingTag(html, tagName) {
    const pattern = new RegExp(`<\\s*${tagName}\\s*([^>]*?(?:"[^"]*"|'[^']*'|[^'">])*)\\s*>([\\s\\S]*?)<\\s*/\\s*${tagName}\\s*>`, 'gi');
    return html.replace(pattern, (_, content) => `<${tagName}${content ? ` ${content}` : ''} />`);
}
/**
 * Replace the value in the template with the new value based on the start and end position + offset
 */
function replaceTemplate(template, replaceValue, start, end, offset) {
    return template.slice(0, start + offset) + replaceValue + template.slice(end + offset);
}
const ALL_HTML_TAGS = new checker.DomElementSchemaRegistry().allKnownElementNames();
class AngularElementCollector extends checker.RecursiveVisitor {
    elements = [];
    constructor() {
        super();
    }
    visitElement(element) {
        const isHtmlTag = ALL_HTML_TAGS.includes(element.name);
        if (isHtmlTag) {
            return;
        }
        const hasNoContent = this.elementHasNoContent(element);
        const hasNoClosingTag = this.elementHasNoClosingTag(element);
        if (hasNoContent && !hasNoClosingTag) {
            this.elements.push({
                tagName: element.name,
                start: element.sourceSpan.start.offset,
                end: element.sourceSpan.end.offset,
            });
        }
        return super.visitElement(element, null);
    }
    elementHasNoContent(element) {
        if (!element.children?.length) {
            return true;
        }
        if (element.children.length === 1) {
            const child = element.children[0];
            return child instanceof checker.Text && /^\s*$/.test(child.value);
        }
        return false;
    }
    elementHasNoClosingTag(element) {
        const { startSourceSpan, endSourceSpan } = element;
        if (!endSourceSpan) {
            return true;
        }
        return (startSourceSpan.start.offset === endSourceSpan.start.offset &&
            startSourceSpan.end.offset === endSourceSpan.end.offset);
    }
}

class SelfClosingTagsMigration extends project_paths.TsurgeFunnelMigration {
    config;
    constructor(config = {}) {
        super();
        this.config = config;
    }
    async analyze(info) {
        const { sourceFiles, program } = info;
        const typeChecker = program.getTypeChecker();
        const tagReplacements = [];
        for (const sf of sourceFiles) {
            ts.forEachChild(sf, (node) => {
                // Skipping any non component declarations
                if (!ts.isClassDeclaration(node)) {
                    return;
                }
                const file = project_paths.projectFile(node.getSourceFile(), info);
                if (this.config.shouldMigrate && this.config.shouldMigrate(file) === false) {
                    return;
                }
                const templateVisitor = new NgComponentTemplateVisitor(typeChecker);
                templateVisitor.visitNode(node);
                templateVisitor.resolvedTemplates.forEach((template) => {
                    const { migrated, changed, replacementCount } = migrateTemplateToSelfClosingTags(template.content);
                    if (!changed) {
                        return;
                    }
                    const fileToMigrate = template.inline
                        ? file
                        : project_paths.projectFile(template.filePath, info);
                    const end = template.start + template.content.length;
                    const replacements = [
                        prepareTextReplacement(fileToMigrate, migrated, template.start, end),
                    ];
                    const fileReplacements = tagReplacements.find((tagReplacement) => tagReplacement.file === file);
                    if (fileReplacements) {
                        fileReplacements.replacements.push(...replacements);
                        fileReplacements.replacementCount += replacementCount;
                    }
                    else {
                        tagReplacements.push({ file, replacements, replacementCount });
                    }
                });
            });
        }
        return project_paths.confirmAsSerializable({ tagReplacements });
    }
    async combine(unitA, unitB) {
        return project_paths.confirmAsSerializable({
            tagReplacements: [...unitA.tagReplacements, ...unitB.tagReplacements],
        });
    }
    async globalMeta(combinedData) {
        const globalMeta = {
            tagReplacements: combinedData.tagReplacements,
        };
        return project_paths.confirmAsSerializable(globalMeta);
    }
    async stats(globalMetadata) {
        const touchedFilesCount = globalMetadata.tagReplacements.length;
        const replacementCount = globalMetadata.tagReplacements.reduce((acc, cur) => acc + cur.replacementCount, 0);
        return {
            counters: {
                touchedFilesCount,
                replacementCount,
            },
        };
    }
    async migrate(globalData) {
        return { replacements: globalData.tagReplacements.flatMap(({ replacements }) => replacements) };
    }
}
function prepareTextReplacement(file, replacement, start, end) {
    return new project_paths.Replacement(file, new project_paths.TextUpdate({
        position: start,
        end: end,
        toInsert: replacement,
    }));
}

function migrate(options) {
    return async (tree, context) => {
        await project_paths.runMigrationInDevkit({
            tree,
            getMigration: (fs) => new SelfClosingTagsMigration({
                shouldMigrate: (file) => {
                    return (file.rootRelativePath.startsWith(fs.normalize(options.path)) &&
                        !/(^|\/)node_modules\//.test(file.rootRelativePath));
                },
            }),
            beforeProgramCreation: (tsconfigPath, stage) => {
                if (stage === project_paths.MigrationStage.Analysis) {
                    context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
                }
                else {
                    context.logger.info(`Running migration for: ${tsconfigPath}...`);
                }
            },
            beforeUnitAnalysis: (tsconfigPath) => {
                context.logger.info(`Scanning for component tags: ${tsconfigPath}...`);
            },
            afterAllAnalyzed: () => {
                context.logger.info(``);
                context.logger.info(`Processing analysis data between targets...`);
                context.logger.info(``);
            },
            afterAnalysisFailure: () => {
                context.logger.error('Migration failed unexpectedly with no analysis data');
            },
            whenDone: ({ counters }) => {
                const { touchedFilesCount, replacementCount } = counters;
                context.logger.info('');
                context.logger.info(`Successfully migrated to self-closing tags 🎉`);
                context.logger.info(`  -> Migrated ${replacementCount} components to self-closing tags in ${touchedFilesCount} component files.`);
            },
        });
    };
}

exports.migrate = migrate;
"!x   'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var migrate_ts_type_references = require('./migrate_ts_type_references-DQe6JtwN.cjs');
var ts = require('typescript');
require('os');
var checker = require('./checker-BwV9MjSQ.cjs');
var index$1 = require('./index-BnJH1Hc7.cjs');
require('path');
var project_paths = require('./project_paths-DY3SIODd.cjs');
var index = require('./index-B6p5mHIY.cjs');
var assert = require('assert');
var apply_import_manager = require('./apply_import_manager-DF0BUe6N.cjs');
require('@angular-devkit/core');
require('node:path/posix');
require('./leading_space-D9nQ8UQC.cjs');
require('fs');
require('module');
require('url');
require('@angular-devkit/schematics');
require('./project_tsconfig_paths-CDVxT6Ov.cjs');

/**
 * Class that holds information about a given directive and its input fields.
 */
class DirectiveInfo {
    clazz;
    /**
     * Map of inputs detected in the given class.
     * Maps string-based input ids to the detailed input metadata.
     */
    inputFields = new Map();
    /** Map of input IDs and their incompatibilities. */
    memberIncompatibility = new Map();
    /**
     * Whether the whole class is incompatible.
     *
     * Class incompatibility precedes individual member incompatibility.
     * All members in the class are considered incompatible.
     */
    incompatible = null;
    constructor(clazz) {
        this.clazz = clazz;
    }
    /**
     * Checks whether there are any migrated inputs for the
     * given class.
     *
     * Returns `false` if all inputs are incompatible.
     */
    hasMigratedFields() {
        return Array.from(this.inputFields.values()).some(({ descriptor }) => !this.isInputMemberIncompatible(descriptor));
    }
    /**
     * Whether the given input member is incompatible. If the class is incompatible,
     * then the member is as well.
     */
    isInputMemberIncompatible(input) {
        return this.getInputMemberIncompatibility(input) !== null;
    }
    /** Get incompatibility of the given member, if it's incompatible for migration. */
    getInputMemberIncompatibility(input) {
        return this.memberIncompatibility.get(input.key) ?? this.incompatible ?? null;
    }
}

/**
 * A migration host is in practice a container object that
 * exposes commonly accessed contextual helpers throughout
 * the whole migration.
 */
class MigrationHost {
    isMigratingCore;
    programInfo;
    config;
    _sourceFiles;
    compilerOptions;
    constructor(isMigratingCore, programInfo, config, sourceFiles) {
        this.isMigratingCore = isMigratingCore;
        this.programInfo = programInfo;
        this.config = config;
        this._sourceFiles = new WeakSet(sourceFiles);
        this.compilerOptions = programInfo.userOptions;
    }
    /** Whether the given file is a source file to be migrated. */
    isSourceFileForCurrentMigration(file) {
        return this._sourceFiles.has(file);
    }
}

function getInputDescriptor(hostOrInfo, node) {
    let className;
    if (ts.isAccessor(node)) {
        className = node.parent.name?.text || '<anonymous>';
    }
    else {
        className = node.parent.name?.text ?? '<anonymous>';
    }
    const info = hostOrInfo instanceof MigrationHost ? hostOrInfo.programInfo : hostOrInfo;
    const file = project_paths.projectFile(node.getSourceFile(), info);
    // Inputs may be detected in `.d.ts` files. Ensure that if the file IDs
    // match regardless of extension. E.g. `/google3/blaze-out/bin/my_file.ts` should
    // have the same ID as `/google3/my_file.ts`.
    const id = file.id.replace(/\.d\.ts$/, '.ts');
    return {
        key: `${id}@@${className}@@${node.name.text}`,
        node,
    };
}

/**
 * Attempts to resolve the known `@Input` metadata for the given
 * type checking symbol. Returns `null` if it's not for an input.
 */
function attemptRetrieveInputFromSymbol(programInfo, memberSymbol, knownInputs) {
    // Even for declared classes from `.d.ts`, the value declaration
    // should exist and point to the property declaration.
    if (memberSymbol.valueDeclaration !== undefined &&
        index.isInputContainerNode(memberSymbol.valueDeclaration)) {
        const member = memberSymbol.valueDeclaration;
        // If the member itself is an input that is being migrated, we
        // do not need to check, as overriding would be fine then— like before.
        const memberInputDescr = index.isInputContainerNode(member)
            ? getInputDescriptor(programInfo, member)
            : null;
        return memberInputDescr !== null ? (knownInputs.get(memberInputDescr) ?? null) : null;
    }
    return null;
}

/**
 * Registry keeping track of all known `@Input()`s in the compilation.
 *
 *  A known `@Input()` may be defined in sources, or inside some `d.ts` files
 * loaded into the program.
 */
class KnownInputs {
    programInfo;
    config;
    /**
     * Known inputs from the whole program.
     */
    knownInputIds = new Map();
    /** Known container classes of inputs. */
    _allClasses = new Set();
    /** Maps classes to their directive info. */
    _classToDirectiveInfo = new Map();
    constructor(programInfo, config) {
        this.programInfo = programInfo;
        this.config = config;
    }
    /** Whether the given input exists. */
    has(descr) {
        return this.knownInputIds.has(descr.key);
    }
    /** Whether the given class contains `@Input`s. */
    isInputContainingClass(clazz) {
        return this._classToDirectiveInfo.has(clazz);
    }
    /** Gets precise `@Input()` information for the given class. */
    getDirectiveInfoForClass(clazz) {
        return this._classToDirectiveInfo.get(clazz);
    }
    /** Gets known input information for the given `@Input()`. */
    get(descr) {
        return this.knownInputIds.get(descr.key);
    }
    /** Gets all classes containing `@Input`s in the compilation. */
    getAllInputContainingClasses() {
        return Array.from(this._allClasses.values());
    }
    /** Registers an `@Input()` in the registry. */
    register(data) {
        if (!this._classToDirectiveInfo.has(data.node.parent)) {
            this._classToDirectiveInfo.set(data.node.parent, new DirectiveInfo(data.node.parent));
        }
        const directiveInfo = this._classToDirectiveInfo.get(data.node.parent);
        const inputInfo = {
            file: project_paths.projectFile(data.node.getSourceFile(), this.programInfo),
            metadata: data.metadata,
            descriptor: data.descriptor,
            container: directiveInfo,
            extendsFrom: null,
            isIncompatible: () => directiveInfo.isInputMemberIncompatible(data.descriptor),
        };
        directiveInfo.inputFields.set(data.descriptor.key, {
            descriptor: data.descriptor,
            metadata: data.metadata,
        });
        this.knownInputIds.set(data.descriptor.key, inputInfo);
        this._allClasses.add(data.node.parent);
    }
    /** Whether the given input is incompatible for migration. */
    isFieldIncompatible(descriptor) {
        return !!this.get(descriptor)?.isIncompatible();
    }
    /** Marks the given input as incompatible for migration. */
    markFieldIncompatible(input, incompatibility) {
        if (!this.knownInputIds.has(input.key)) {
            throw new Error(`Input cannot be marked as incompatible because it's not registered.`);
        }
        const inputInfo = this.knownInputIds.get(input.key);
        const existingIncompatibility = inputInfo.container.getInputMemberIncompatibility(input);
        // Ensure an existing more significant incompatibility is not overridden.
        if (existingIncompatibility !== null && migrate_ts_type_references.isFieldIncompatibility(existingIncompatibility)) {
            incompatibility = migrate_ts_type_references.pickFieldIncompatibility(existingIncompatibility, incompatibility);
        }
        this.knownInputIds
            .get(input.key)
            .container.memberIncompatibility.set(input.key, incompatibility);
    }
    /** Marks the given class as incompatible for migration. */
    markClassIncompatible(clazz, incompatibility) {
        if (!this._classToDirectiveInfo.has(clazz)) {
            throw new Error(`Class cannot be marked as incompatible because it's not known.`);
        }
        this._classToDirectiveInfo.get(clazz).incompatible = incompatibility;
    }
    attemptRetrieveDescriptorFromSymbol(symbol) {
        return attemptRetrieveInputFromSymbol(this.programInfo, symbol, this)?.descriptor ?? null;
    }
    shouldTrackClassReference(clazz) {
        return this.isInputContainingClass(clazz);
    }
    captureKnownFieldInheritanceRelationship(derived, parent) {
        if (!this.has(derived)) {
            throw new Error(`Expected input to exist in registry: ${derived.key}`);
        }
        this.get(derived).extendsFrom = parent;
    }
    captureUnknownDerivedField(field) {
        this.markFieldIncompatible(field, {
            context: null,
            reason: migrate_ts_type_references.FieldIncompatibilityReason.OverriddenByDerivedClass,
        });
    }
    captureUnknownParentField(field) {
        this.markFieldIncompatible(field, {
            context: null,
            reason: migrate_ts_type_references.FieldIncompatibilityReason.TypeConflictWithBaseClass,
        });
    }
}

/**
 * Prepares migration analysis for the given program.
 *
 * Unlike {@link createAndPrepareAnalysisProgram} this does not create the program,
 * and can be used for integrations with e.g. the language service.
 */
function prepareAnalysisInfo(userProgram, compiler, programAbsoluteRootPaths) {
    let refEmitter = null;
    let metaReader = null;
    let templateTypeChecker = null;
    let resourceLoader = null;
    if (compiler !== null) {
        // Analyze sync and retrieve necessary dependencies.
        // Note: `getTemplateTypeChecker` requires the `enableTemplateTypeChecker` flag, but
        // this has negative effects as it causes optional TCB operations to execute, which may
        // error with unsuccessful reference emits that previously were ignored outside of the migration.
        // The migration is resilient to TCB information missing, so this is fine, and all the information
        // we need is part of required TCB operations anyway.
        const state = compiler['ensureAnalyzed']();
        resourceLoader = compiler['resourceManager'];
        refEmitter = state.refEmitter;
        metaReader = state.metaReader;
        templateTypeChecker = state.templateTypeChecker;
        // Generate all type check blocks.
        state.templateTypeChecker.generateAllTypeCheckBlocks();
    }
    const typeChecker = userProgram.getTypeChecker();
    const reflector = new checker.TypeScriptReflectionHost(typeChecker);
    const evaluator = new index$1.PartialEvaluator(reflector, typeChecker, null);
    const dtsMetadataReader = new index$1.DtsMetadataReader(typeChecker, reflector);
    return {
        metaRegistry: metaReader,
        dtsMetadataReader,
        evaluator,
        reflector,
        typeChecker,
        refEmitter,
        templateTypeChecker,
        resourceLoader,
    };
}

/**
 * State of the migration that is passed between
 * the individual phases.
 *
 * The state/phase captures information like:
 *    - list of inputs that are defined in `.ts` and need migration.
 *    - list of references.
 *    - keeps track of computed replacements.
 *    - imports that may need to be updated.
 */
class MigrationResult {
    printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
    // May be `null` if the input cannot be converted. This is also
    // signified by an incompatibility- but the input is tracked here as it
    // still is a "source input".
    sourceInputs = new Map();
    references = [];
    // Execution data
    replacements = [];
    inputDecoratorSpecifiers = new Map();
}

/** Attempts to extract metadata of a potential TypeScript `@Input()` declaration. */
function extractDecoratorInput(node, host, reflector, metadataReader, evaluator) {
    return (extractSourceCodeInput(node, host, reflector, evaluator) ??
        extractDtsInput(node, metadataReader));
}
/**
 * Attempts to extract `@Input()` information for the given node, assuming it's
 * part of a `.d.ts` file.
 */
function extractDtsInput(node, metadataReader) {
    if (!index.isInputContainerNode(node) ||
        !ts.isIdentifier(node.name) ||
        !node.getSourceFile().isDeclarationFile) {
        return null;
    }
    // If the potential node is not part of a valid input class, skip.
    if (!ts.isClassDeclaration(node.parent) ||
        node.parent.name === undefined ||
        !ts.isIdentifier(node.parent.name)) {
        return null;
    }
    let directiveMetadata = null;
    // Getting directive metadata can throw errors when e.g. types referenced
    // in the `.d.ts` aren't resolvable. This seems to be unexpected and shouldn't
    // result in the entire migration to be failing.
    try {
        directiveMetadata = metadataReader.getDirectiveMetadata(new checker.Reference(node.parent));
    }
    catch (e) {
        console.error('Unexpected error. Gracefully ignoring.');
        console.error('Could not parse directive metadata:', e);
        return null;
    }
    const inputMapping = directiveMetadata?.inputs.getByClassPropertyName(node.name.text);
    // Signal inputs are never tracked and migrated.
    if (inputMapping?.isSignal) {
        return null;
    }
    return inputMapping == null
        ? null
        : {
            ...inputMapping,
            inputDecorator: null,
            inSourceFile: false,
            // Inputs from `.d.ts` cannot have any field decorators applied.
            fieldDecorators: [],
        };
}
/**
 * Attempts to extract `@Input()` information for the given node, assuming it's
 * directly defined inside a source file (`.ts`).
 */
function extractSourceCodeInput(node, host, reflector, evaluator) {
    if (!index.isInputContainerNode(node) ||
        !ts.isIdentifier(node.name) ||
        node.getSourceFile().isDeclarationFile) {
        return null;
    }
    const decorators = reflector.getDecoratorsOfDeclaration(node);
    if (decorators === null) {
        return null;
    }
    const ngDecorators = checker.getAngularDecorators(decorators, ['Input'], host.isMigratingCore);
    if (ngDecorators.length === 0) {
        return null;
    }
    const inputDecorator = ngDecorators[0];
    let publicName = node.name.text;
    let isRequired = false;
    let transformResult = null;
    // Check options object from `@Input()`.
    if (inputDecorator.args?.length === 1) {
        const evaluatedInputOpts = evaluator.evaluate(inputDecorator.args[0]);
        if (typeof evaluatedInputOpts === 'string') {
            publicName = evaluatedInputOpts;
        }
        else if (evaluatedInputOpts instanceof Map) {
            if (evaluatedInputOpts.has('alias') && typeof evaluatedInputOpts.get('alias') === 'string') {
                publicName = evaluatedInputOpts.get('alias');
            }
            if (evaluatedInputOpts.has('required') &&
                typeof evaluatedInputOpts.get('required') === 'boolean') {
                isRequired = !!evaluatedInputOpts.get('required');
            }
            if (evaluatedInputOpts.has('transform') && evaluatedInputOpts.get('transform') != null) {
                transformResult = parseTransformOfInput(evaluatedInputOpts, node, reflector);
            }
        }
    }
    return {
        bindingPropertyName: publicName,
        classPropertyName: node.name.text,
        required: isRequired,
        isSignal: false,
        inSourceFile: true,
        transform: transformResult,
        inputDecorator,
        fieldDecorators: decorators,
    };
}
/**
 * Gracefully attempts to parse the `transform` option of an `@Input()`
 * and extracts its metadata.
 */
function parseTransformOfInput(evaluatedInputOpts, node, reflector) {
    const transformValue = evaluatedInputOpts.get('transform');
    if (!(transformValue instanceof checker.DynamicValue) && !(transformValue instanceof checker.Reference)) {
        return null;
    }
    // For parsing the transform, we don't need a real reference emitter, as
    // the emitter is only used for verifying that the transform type could be
    // copied into e.g. an `ngInputAccept` class member.
    const noopRefEmitter = new checker.ReferenceEmitter([
        {
            emit: () => ({
                kind: checker.ReferenceEmitKind.Success,
                expression: migrate_ts_type_references.NULL_EXPR,
                importedFile: null,
            }),
        },
    ]);
    try {
        return checker.parseDecoratorInputTransformFunction(node.parent, node.name.text, transformValue, reflector, noopRefEmitter, checker.CompilationMode.FULL);
    }
    catch (e) {
        if (!(e instanceof checker.FatalDiagnosticError)) {
            throw e;
        }
        // TODO: implement error handling.
        // See failing case: e.g. inherit_definition_feature_spec.ts
        console.error(`${e.node.getSourceFile().fileName}: ${e.toString()}`);
        return null;
    }
}

/**
 * Prepares a potential migration of the given node by performing
 * initial analysis and checking whether it an be migrated.
 *
 * For example, required inputs that don't have an explicit type may not
 * be migrated as we don't have a good type for `input.required<T>`.
 *   (Note: `typeof Bla` may be usable— but isn't necessarily a good practice
 *    for complex expressions)
 */
function prepareAndCheckForConversion(node, metadata, checker, options) {
    // Accessor inputs cannot be migrated right now.
    if (ts.isAccessor(node)) {
        return {
            context: node,
            reason: migrate_ts_type_references.FieldIncompatibilityReason.Accessor,
        };
    }
    assert(metadata.inputDecorator !== null, 'Expected an input decorator for inputs that are being migrated.');
    let initialValue = node.initializer;
    let isUndefinedInitialValue = node.initializer === undefined ||
        (ts.isIdentifier(node.initializer) && node.initializer.text === 'undefined');
    const strictNullChecksEnabled = options.strict === true || options.strictNullChecks === true;
    const strictPropertyInitialization = options.strict === true || options.strictPropertyInitialization === true;
    // Shorthand should never be used, as would expand the type of `T` to be `T|undefined`.
    // This wouldn't matter with strict null checks disabled, but it can break if this is
    // a library that is later consumed with strict null checks enabled.
    const avoidTypeExpansion = !strictNullChecksEnabled;
    // If an input can be required, due to the non-null assertion on the property,
    // make it required if there is no initializer.
    if (node.exclamationToken !== undefined && initialValue === undefined) {
        metadata.required = true;
    }
    let typeToAdd = node.type;
    let preferShorthandIfPossible = null;
    // If there is no initial value, or it's `undefined`, we can prefer the `input()`
    // shorthand which automatically uses `undefined` as initial value, and includes it
    // in the input type.
    if (!metadata.required &&
        node.type !== undefined &&
        isUndefinedInitialValue &&
        !avoidTypeExpansion) {
        preferShorthandIfPossible = { originalType: node.type };
    }
    // If the input is using `@Input() bla?: string;` with the "optional question mark",
    // then we try to explicitly add `undefined` as type, if it's not part of the type already.
    // This is ensuring correctness, as `bla?` automatically includes `undefined` currently.
    if (node.questionToken !== undefined) {
        // If there is no type, but we have an initial value, try inferring
        // it from the initializer.
        if (typeToAdd === undefined && initialValue !== undefined) {
            const inferredType = inferImportableTypeForInput(checker, node, initialValue);
            if (inferredType !== null) {
                typeToAdd = inferredType;
            }
        }
        if (typeToAdd === undefined) {
            return {
                context: node,
                reason: migrate_ts_type_references.FieldIncompatibilityReason.SignalInput__QuestionMarkButNoGoodExplicitTypeExtractable,
            };
        }
        if (!checker.isTypeAssignableTo(checker.getUndefinedType(), checker.getTypeFromTypeNode(typeToAdd))) {
            typeToAdd = ts.factory.createUnionTypeNode([
                typeToAdd,
                ts.factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword),
            ]);
        }
    }
    let leadingTodoText = null;
    // If the input does not have an initial value, and strict property initialization
    // is disabled, while strict null checks are enabled; then we know that `undefined`
    // cannot be used as initial value, nor do we want to expand the input's type magically.
    // Instead, we detect this case and migrate to `undefined!` which leaves the behavior unchanged.
    if (strictNullChecksEnabled &&
        !strictPropertyInitialization &&
        node.initializer === undefined &&
        node.type !== undefined &&
        node.questionToken === undefined &&
        node.exclamationToken === undefined &&
        metadata.required === false &&
        !checker.isTypeAssignableTo(checker.getUndefinedType(), checker.getTypeFromTypeNode(node.type))) {
        leadingTodoText =
            'Input is initialized to `undefined` but type does not allow this value. ' +
                'This worked with `@Input` because your project uses `--strictPropertyInitialization=false`.';
        isUndefinedInitialValue = false;
        initialValue = ts.factory.createNonNullExpression(ts.factory.createIdentifier('undefined'));
    }
    // Attempt to extract type from input initial value. No explicit type, but input is required.
    // Hence we need an explicit type, or fall back to `typeof`.
    if (typeToAdd === undefined && initialValue !== undefined && metadata.required) {
        const inferredType = inferImportableTypeForInput(checker, node, initialValue);
        if (inferredType !== null) {
            typeToAdd = inferredType;
        }
        else {
            // Note that we could use `typeToTypeNode` here but it's likely breaking because
            // the generated type might depend on imports that we cannot add here (nor want).
            return {
                context: node,
                reason: migrate_ts_type_references.FieldIncompatibilityReason.SignalInput__RequiredButNoGoodExplicitTypeExtractable,
            };
        }
    }
    return {
        requiredButIncludedUndefinedPreviously: metadata.required && node.questionToken !== undefined,
        resolvedMetadata: metadata,
        resolvedType: typeToAdd,
        preferShorthandIfPossible,
        originalInputDecorator: metadata.inputDecorator,
        initialValue: isUndefinedInitialValue ? undefined : initialValue,
        leadingTodoText,
    };
}
function inferImportableTypeForInput(checker, node, initialValue) {
    const propertyType = checker.getTypeAtLocation(node);
    // If the resolved type is a primitive, or union of primitive types,
    // return a type node fully derived from the resolved type.
    if (isPrimitiveImportableTypeNode(propertyType) ||
        (propertyType.isUnion() && propertyType.types.every(isPrimitiveImportableTypeNode))) {
        return checker.typeToTypeNode(propertyType, node, ts.NodeBuilderFlags.NoTypeReduction) ?? null;
    }
    // Alternatively, try to infer a simple importable type from\
    // the initializer.
    if (ts.isIdentifier(initialValue)) {
        // @Input({required: true}) bla = SOME_DEFAULT;
        return ts.factory.createTypeQueryNode(initialValue);
    }
    else if (ts.isPropertyAccessExpression(initialValue) &&
        ts.isIdentifier(initialValue.name) &&
        ts.isIdentifier(initialValue.expression)) {
        // @Input({required: true}) bla = prop.SOME_DEFAULT;
        return ts.factory.createTypeQueryNode(ts.factory.createQualifiedName(initialValue.name, initialValue.expression));
    }
    return null;
}
function isPrimitiveImportableTypeNode(type) {
    return !!(type.flags & ts.TypeFlags.BooleanLike ||
        type.flags & ts.TypeFlags.StringLike ||
        type.flags & ts.TypeFlags.NumberLike ||
        type.flags & ts.TypeFlags.Undefined ||
        type.flags & ts.TypeFlags.Null);
}

/**
 * Phase where we iterate through all source files of the program (including `.d.ts`)
 * and keep track of all `@Input`'s we discover.
 */
function pass1__IdentifySourceFileAndDeclarationInputs(sf, host, checker, reflector, dtsMetadataReader, evaluator, knownDecoratorInputs, result) {
    const visitor = (node) => {
        const decoratorInput = extractDecoratorInput(node, host, reflector, dtsMetadataReader, evaluator);
        if (decoratorInput !== null) {
            assert(index.isInputContainerNode(node), 'Expected input to be declared on accessor or property.');
            const inputDescr = getInputDescriptor(host, node);
            // track all inputs, even from declarations for reference resolution.
            knownDecoratorInputs.register({ descriptor: inputDescr, metadata: decoratorInput, node });
            // track source file inputs in the result of this target.
            // these are then later migrated in the migration phase.
            if (decoratorInput.inSourceFile && host.isSourceFileForCurrentMigration(sf)) {
                const conversionPreparation = prepareAndCheckForConversion(node, decoratorInput, checker, host.compilerOptions);
                if (migrate_ts_type_references.isFieldIncompatibility(conversionPreparation)) {
                    knownDecoratorInputs.markFieldIncompatible(inputDescr, conversionPreparation);
                    result.sourceInputs.set(inputDescr, null);
                }
                else {
                    result.sourceInputs.set(inputDescr, conversionPreparation);
                }
            }
        }
        // track all imports to `Input` or `input`.
        let importName = null;
        if (ts.isImportSpecifier(node) &&
            ((importName = (node.propertyName ?? node.name).text) === 'Input' ||
                importName === 'input') &&
            ts.isStringLiteral(node.parent.parent.parent.moduleSpecifier) &&
            (host.isMigratingCore || node.parent.parent.parent.moduleSpecifier.text === '@angular/core')) {
            if (!result.inputDecoratorSpecifiers.has(sf)) {
                result.inputDecoratorSpecifiers.set(sf, []);
            }
            result.inputDecoratorSpecifiers.get(sf).push({
                kind: importName === 'input' ? 'signal-input-import' : 'decorator-input-import',
                node,
            });
        }
        ts.forEachChild(node, visitor);
    };
    ts.forEachChild(sf, visitor);
}

/**
 * Phase where problematic patterns are detected and advise
 * the migration to skip certain inputs.
 *
 * For example, detects classes that are instantiated manually. Those
 * cannot be migrated as `input()` requires an injection context.
 *
 * In addition, spying onto an input may be problematic- so we skip migrating
 * such.
 */
function pass3__checkIncompatiblePatterns(host, inheritanceGraph, checker$1, groupedTsAstVisitor, knownInputs) {
    migrate_ts_type_references.checkIncompatiblePatterns(inheritanceGraph, checker$1, groupedTsAstVisitor, knownInputs, () => knownInputs.getAllInputContainingClasses());
    for (const input of knownInputs.knownInputIds.values()) {
        const hostBindingDecorators = checker.getAngularDecorators(input.metadata.fieldDecorators, ['HostBinding'], host.isMigratingCore);
        if (hostBindingDecorators.length > 0) {
            knownInputs.markFieldIncompatible(input.descriptor, {
                context: hostBindingDecorators[0].node,
                reason: migrate_ts_type_references.FieldIncompatibilityReason.SignalIncompatibleWithHostBinding,
            });
        }
    }
}

/**
 * Phase where problematic patterns are detected and advise
 * the migration to skip certain inputs.
 *
 * For example, detects classes that are instantiated manually. Those
 * cannot be migrated as `input()` requires an injection context.
 *
 * In addition, spying onto an input may be problematic- so we skip migrating
 * such.
 */
function pass2_IdentifySourceFileReferences(programInfo, checker, reflector, resourceLoader, evaluator, templateTypeChecker, groupedTsAstVisitor, knownInputs, result, fieldNamesToConsiderForReferenceLookup) {
    groupedTsAstVisitor.register(index.createFindAllSourceFileReferencesVisitor(programInfo, checker, reflector, resourceLoader, evaluator, templateTypeChecker, knownInputs, fieldNamesToConsiderForReferenceLookup, result).visitor);
}

/**
 * Executes the analysis phase of the migration.
 *
 * This includes:
 *   - finding all inputs
 *   - finding all references
 *   - determining incompatible inputs
 *   - checking inheritance
 */
function executeAnalysisPhase(host, knownInputs, result, { sourceFiles, fullProgramSourceFiles, reflector, dtsMetadataReader, typeChecker, templateTypeChecker, resourceLoader, evaluator, }) {
    // Pass 1
    fullProgramSourceFiles.forEach((sf) => 
    // Shim shim files. Those are unnecessary and might cause unexpected slowness.
    // e.g. `ngtypecheck` files.
    !checker.isShim(sf) &&
        pass1__IdentifySourceFileAndDeclarationInputs(sf, host, typeChecker, reflector, dtsMetadataReader, evaluator, knownInputs, result));
    const fieldNamesToConsiderForReferenceLookup = new Set();
    for (const input of knownInputs.knownInputIds.values()) {
        if (host.config.shouldMigrateInput?.(input) === false) {
            continue;
        }
        fieldNamesToConsiderForReferenceLookup.add(input.descriptor.node.name.text);
    }
    // A graph starting with source files is sufficient. We will resolve into
    // declaration files if a source file depends on such.
    const inheritanceGraph = new migrate_ts_type_references.InheritanceGraph(typeChecker).expensivePopulate(sourceFiles);
    const pass2And3SourceFileVisitor = new migrate_ts_type_references.GroupedTsAstVisitor(sourceFiles);
    // Register pass 2. Find all source file references.
    pass2_IdentifySourceFileReferences(host.programInfo, typeChecker, reflector, resourceLoader, evaluator, templateTypeChecker, pass2And3SourceFileVisitor, knownInputs, result, fieldNamesToConsiderForReferenceLookup);
    // Register pass 3. Check incompatible patterns pass.
    pass3__checkIncompatiblePatterns(host, inheritanceGraph, typeChecker, pass2And3SourceFileVisitor, knownInputs);
    // Perform Pass 2 and Pass 3, efficiently in one pass.
    pass2And3SourceFileVisitor.execute();
    // Determine incompatible inputs based on resolved references.
    for (const reference of result.references) {
        if (index.isTsReference(reference) && reference.from.isWrite) {
            knownInputs.markFieldIncompatible(reference.target, {
                reason: migrate_ts_type_references.FieldIncompatibilityReason.WriteAssignment,
                context: reference.from.node,
            });
        }
        if (index.isTemplateReference(reference) || index.isHostBindingReference(reference)) {
            if (reference.from.isWrite) {
                knownInputs.markFieldIncompatible(reference.target, {
                    reason: migrate_ts_type_references.FieldIncompatibilityReason.WriteAssignment,
                    // No TS node context available for template or host bindings.
                    context: null,
                });
            }
        }
        // TODO: Remove this when we support signal narrowing in templates.
        // https://github.com/angular/angular/pull/55456.
        if (index.isTemplateReference(reference)) {
            if (reference.from.isLikelyPartOfNarrowing) {
                knownInputs.markFieldIncompatible(reference.target, {
                    reason: migrate_ts_type_references.FieldIncompatibilityReason.PotentiallyNarrowedInTemplateButNoSupportYet,
                    context: null,
                });
            }
        }
    }
    return { inheritanceGraph };
}

/**
 * Phase that propagates incompatibilities to derived classes or
 * base classes. For example, consider:
 *
 * ```ts
 * class Base {
 *   bla = true;
 * }
 *
 * class Derived extends Base {
 *   @Input() bla = false;
 * }
 * ```
 *
 * Whenever we migrate `Derived`, the inheritance would fail
 * and result in a build breakage because `Base#bla` is not an Angular input.
 *
 * The logic here detects such cases and marks `bla` as incompatible. If `Derived`
 * would then have other derived classes as well, it would propagate the status.
 */
function pass4__checkInheritanceOfInputs(inheritanceGraph, metaRegistry, knownInputs) {
    migrate_ts_type_references.checkInheritanceOfKnownFields(inheritanceGraph, metaRegistry, knownInputs, {
        isClassWithKnownFields: (clazz) => knownInputs.isInputContainingClass(clazz),
        getFieldsForClass: (clazz) => {
            const directiveInfo = knownInputs.getDirectiveInfoForClass(clazz);
            assert(directiveInfo !== undefined, 'Expected directive info to exist for input.');
            return Array.from(directiveInfo.inputFields.values()).map((i) => i.descriptor);
        },
    });
}

function getCompilationUnitMetadata(knownInputs) {
    const struct = {
        knownInputs: Array.from(knownInputs.knownInputIds.entries()).reduce((res, [inputClassFieldIdStr, info]) => {
            const classIncompatibility = info.container.incompatible !== null ? info.container.incompatible : null;
            const memberIncompatibility = info.container.memberIncompatibility.has(inputClassFieldIdStr)
                ? info.container.memberIncompatibility.get(inputClassFieldIdStr).reason
                : null;
            // Note: Trim off the `context` as it cannot be serialized with e.g. TS nodes.
            return {
                ...res,
                [inputClassFieldIdStr]: {
                    owningClassIncompatibility: classIncompatibility,
                    memberIncompatibility,
                    seenAsSourceInput: info.metadata.inSourceFile,
                    extendsFrom: info.extendsFrom?.key ?? null,
                },
            };
        }, {}),
    };
    return struct;
}

/**
 * Sorts the inheritance graph topologically, so that
 * nodes without incoming edges are returned first.
 *
 * I.e. The returned list is sorted, so that dependencies
 * of a given class are guaranteed to be included at
 * an earlier position than the inspected class.
 *
 * This sort is helpful for detecting inheritance problems
 * for the migration in simpler ways, without having to
 * check in both directions (base classes, and derived classes).
 */
function topologicalSort(graph) {
    // All nodes without incoming edges.
    const S = graph.filter((n) => n.incoming.size === 0);
    const result = [];
    const invalidatedEdges = new WeakMap();
    const invalidateEdge = (from, to) => {
        if (!invalidatedEdges.has(from)) {
            invalidatedEdges.set(from, new Set());
        }
        invalidatedEdges.get(from).add(to);
    };
    const filterEdges = (from, edges) => {
        return Array.from(edges).filter((e) => !invalidatedEdges.has(from) || !invalidatedEdges.get(from).has(e));
    };
    while (S.length) {
        const node = S.pop();
        result.push(node);
        for (const next of filterEdges(node, node.outgoing)) {
            // Remove edge from "node -> next".
            invalidateEdge(node, next);
            // Remove edge from "next -> node".
            invalidateEdge(next, node);
            // if there are no incoming edges for `next`. add it to `S`.
            if (filterEdges(next, next.incoming).length === 0) {
                S.push(next);
            }
        }
    }
    return result;
}

/** Merges a list of compilation units into a combined unit. */
function combineCompilationUnitData(unitA, unitB) {
    const result = {
        knownInputs: {},
    };
    for (const file of [unitA, unitB]) {
        for (const [key, info] of Object.entries(file.knownInputs)) {
            const existing = result.knownInputs[key];
            if (existing === undefined) {
                result.knownInputs[key] = info;
                continue;
            }
            // Merge metadata.
            if (existing.extendsFrom === null && info.extendsFrom !== null) {
                existing.extendsFrom = info.extendsFrom;
            }
            if (!existing.seenAsSourceInput && info.seenAsSourceInput) {
                existing.seenAsSourceInput = true;
            }
            // Merge member incompatibility.
            if (info.memberIncompatibility !== null) {
                if (existing.memberIncompatibility === null) {
                    existing.memberIncompatibility = info.memberIncompatibility;
                }
                else {
                    // Input might not be incompatible in one target, but others might invalidate it.
                    // merge the incompatibility state.
                    existing.memberIncompatibility = migrate_ts_type_references.pickFieldIncompatibility({ reason: info.memberIncompatibility, context: null }, { reason: existing.memberIncompatibility, context: null }).reason;
                }
            }
            // Merge incompatibility of the class owning the input.
            // Note: This metadata is stored per field for simplicity currently,
            // but in practice it could be a separate field in the compilation data.
            if (info.owningClassIncompatibility !== null &&
                existing.owningClassIncompatibility === null) {
                existing.owningClassIncompatibility = info.owningClassIncompatibility;
            }
        }
    }
    return result;
}
function convertToGlobalMeta(combinedData) {
    const globalMeta = {
        knownInputs: {},
    };
    const idToGraphNode = new Map();
    const inheritanceGraph = [];
    const isNodeIncompatible = (node) => node.info.memberIncompatibility !== null || node.info.owningClassIncompatibility !== null;
    for (const [key, info] of Object.entries(combinedData.knownInputs)) {
        const existing = globalMeta.knownInputs[key];
        if (existing !== undefined) {
            continue;
        }
        const node = {
            incoming: new Set(),
            outgoing: new Set(),
            data: { info, key },
        };
        inheritanceGraph.push(node);
        idToGraphNode.set(key, node);
        globalMeta.knownInputs[key] = info;
    }
    for (const [key, info] of Object.entries(globalMeta.knownInputs)) {
        if (info.extendsFrom !== null) {
            const from = idToGraphNode.get(key);
            const target = idToGraphNode.get(info.extendsFrom);
            from.outgoing.add(target);
            target.incoming.add(from);
        }
    }
    // Sort topologically and iterate super classes first, so that we can trivially
    // propagate incompatibility statuses (and other checks) without having to check
    // in both directions (derived classes, or base classes). This simplifies the
    // propagation.
    for (const node of topologicalSort(inheritanceGraph).reverse()) {
        const existingMemberIncompatibility = node.data.info.memberIncompatibility !== null
            ? { reason: node.data.info.memberIncompatibility, context: null }
            : null;
        for (const parent of node.outgoing) {
            // If parent is incompatible and not migrated, then this input
            // cannot be migrated either. Try propagating parent incompatibility then.
            if (isNodeIncompatible(parent.data)) {
                node.data.info.memberIncompatibility = migrate_ts_type_references.pickFieldIncompatibility({ reason: migrate_ts_type_references.FieldIncompatibilityReason.ParentIsIncompatible, context: null }, existingMemberIncompatibility).reason;
                break;
            }
        }
    }
    for (const info of Object.values(combinedData.knownInputs)) {
        // We never saw a source file for this input, globally. Try marking it as incompatible,
        // so that all references and inheritance checks can propagate accordingly.
        if (!info.seenAsSourceInput) {
            const existingMemberIncompatibility = info.memberIncompatibility !== null
                ? { reason: info.memberIncompatibility, context: null }
                : null;
            info.memberIncompatibility = migrate_ts_type_references.pickFieldIncompatibility({ reason: migrate_ts_type_references.FieldIncompatibilityReason.OutsideOfMigrationScope, context: null }, existingMemberIncompatibility).reason;
        }
    }
    return globalMeta;
}

function populateKnownInputsFromGlobalData(knownInputs, globalData) {
    // Populate from batch metadata.
    for (const [_key, info] of Object.entries(globalData.knownInputs)) {
        const key = _key;
        // irrelevant for this compilation unit.
        if (!knownInputs.has({ key })) {
            continue;
        }
        const inputMetadata = knownInputs.get({ key });
        if (info.memberIncompatibility !== null) {
            knownInputs.markFieldIncompatible(inputMetadata.descriptor, {
                context: null, // No context serializable.
                reason: info.memberIncompatibility,
            });
        }
        if (info.owningClassIncompatibility !== null) {
            knownInputs.markClassIncompatible(inputMetadata.container.clazz, info.owningClassIncompatibility);
        }
    }
}

// TODO: Consider initializations inside the constructor. Those are not migrated right now
// though, as they are writes.
/**
 * Converts an `@Input()` property declaration to a signal input.
 *
 * @returns Replacements for converting the input.
 */
function convertToSignalInput(node, { resolvedMetadata: metadata, resolvedType, preferShorthandIfPossible, originalInputDecorator, initialValue, leadingTodoText, }, info, checker, importManager, result) {
    let optionsLiteral = null;
    // We need an options array for the input because:
    //   - the input is either aliased,
    //   - or we have a transform.
    if (metadata.bindingPropertyName !== metadata.classPropertyName || metadata.transform !== null) {
        const properties = [];
        if (metadata.bindingPropertyName !== metadata.classPropertyName) {
            properties.push(ts.factory.createPropertyAssignment('alias', ts.factory.createStringLiteral(metadata.bindingPropertyName)));
        }
        if (metadata.transform !== null) {
            const transformRes = extractTransformOfInput(metadata.transform, resolvedType, checker);
            properties.push(transformRes.node);
            // Propagate TODO if one was requested from the transform extraction/validation.
            if (transformRes.leadingTodoText !== null) {
                leadingTodoText =
                    (leadingTodoText ? `${leadingTodoText} ` : '') + transformRes.leadingTodoText;
            }
        }
        optionsLiteral = ts.factory.createObjectLiteralExpression(properties);
    }
    // The initial value is `undefined` or none is present:
    //    - We may be able to use the `input()` shorthand
    //    - or we use an explicit `undefined` initial value.
    if (initialValue === undefined) {
        // Shorthand not possible, so explicitly add `undefined`.
        if (preferShorthandIfPossible === null) {
            initialValue = ts.factory.createIdentifier('undefined');
        }
        else {
            resolvedType = preferShorthandIfPossible.originalType;
            // When using the `input()` shorthand, try cutting of `undefined` from potential
            // union types. `undefined` will be automatically included in the type.
            if (ts.isUnionTypeNode(resolvedType)) {
                resolvedType = migrate_ts_type_references.removeFromUnionIfPossible(resolvedType, (t) => t.kind !== ts.SyntaxKind.UndefinedKeyword);
            }
        }
    }
    const inputArgs = [];
    const typeArguments = [];
    if (resolvedType !== undefined) {
        typeArguments.push(resolvedType);
        if (metadata.transform !== null) {
            // Note: The TCB code generation may use the same type node and attach
            // synthetic comments for error reporting. We remove those explicitly here.
            typeArguments.push(ts.setSyntheticTrailingComments(metadata.transform.type.node, undefined));
        }
    }
    // Always add an initial value when the input is optional, and we have one, or we need one
    // to be able to pass options as the second argument.
    if (!metadata.required && (initialValue !== undefined || optionsLiteral !== null)) {
        inputArgs.push(initialValue ?? ts.factory.createIdentifier('undefined'));
    }
    if (optionsLiteral !== null) {
        inputArgs.push(optionsLiteral);
    }
    const inputFnRef = importManager.addImport({
        exportModuleSpecifier: '@angular/core',
        exportSymbolName: 'input',
        requestedFile: node.getSourceFile(),
    });
    const inputInitializerFn = metadata.required
        ? ts.factory.createPropertyAccessExpression(inputFnRef, 'required')
        : inputFnRef;
    const inputInitializer = ts.factory.createCallExpression(inputInitializerFn, typeArguments, inputArgs);
    let modifiersWithoutInputDecorator = node.modifiers?.filter((m) => m !== originalInputDecorator.node) ?? [];
    // Add `readonly` to all new signal input declarations.
    if (!modifiersWithoutInputDecorator?.some((s) => s.kind === ts.SyntaxKind.ReadonlyKeyword)) {
        modifiersWithoutInputDecorator.push(ts.factory.createModifier(ts.SyntaxKind.ReadonlyKeyword));
    }
    const newNode = ts.factory.createPropertyDeclaration(modifiersWithoutInputDecorator, node.name, undefined, undefined, inputInitializer);
    const newPropertyText = result.printer.printNode(ts.EmitHint.Unspecified, newNode, node.getSourceFile());
    const replacements = [];
    if (leadingTodoText !== null) {
        replacements.push(migrate_ts_type_references.insertPrecedingLine(node, info, '// TODO: Notes from signal input migration:'), ...migrate_ts_type_references.cutStringToLineLimit(leadingTodoText, 70).map((line) => migrate_ts_type_references.insertPrecedingLine(node, info, `//  ${line}`)));
    }
    replacements.push(new project_paths.Replacement(project_paths.projectFile(node.getSourceFile(), info), new project_paths.TextUpdate({
        position: node.getStart(),
        end: node.getEnd(),
        toInsert: newPropertyText,
    })));
    return replacements;
}
/**
 * Extracts the transform for the given input and returns a property assignment
 * that works for the new signal `input()` API.
 */
function extractTransformOfInput(transform, resolvedType, checker) {
    assert(ts.isExpression(transform.node), `Expected transform to be an expression.`);
    let transformFn = transform.node;
    let leadingTodoText = null;
    // If there is an explicit type, check if the transform return type actually works.
    // In some cases, the transform function is not compatible because with decorator inputs,
    // those were not checked. We cast the transform to `any` and add a TODO.
    // TODO: Capture this in the design doc.
    if (resolvedType !== undefined && !ts.isSyntheticExpression(resolvedType)) {
        // Note: If the type is synthetic, we cannot check, and we accept that in the worst case
        // we will create code that is not necessarily compiling. This is unlikely, but notably
        // the errors would be correct and valuable.
        const transformType = checker.getTypeAtLocation(transform.node);
        const transformSignature = transformType.getCallSignatures()[0];
        assert(transformSignature !== undefined, 'Expected transform to be an invoke-able.');
        if (!checker.isTypeAssignableTo(checker.getReturnTypeOfSignature(transformSignature), checker.getTypeFromTypeNode(resolvedType))) {
            leadingTodoText =
                'Input type is incompatible with transform. The migration added an `any` cast. ' +
                    'This worked previously because Angular was unable to check transforms.';
            transformFn = ts.factory.createAsExpression(ts.factory.createParenthesizedExpression(transformFn), ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
        }
    }
    return {
        node: ts.factory.createPropertyAssignment('transform', transformFn),
        leadingTodoText,
    };
}

/**
 * Phase that migrates `@Input()` declarations to signal inputs and
 * manages imports within the given file.
 */
function pass6__migrateInputDeclarations(host, checker, result, knownInputs, importManager, info) {
    let filesWithMigratedInputs = new Set();
    let filesWithIncompatibleInputs = new WeakSet();
    for (const [input, metadata] of result.sourceInputs) {
        const sf = input.node.getSourceFile();
        const inputInfo = knownInputs.get(input);
        // Do not migrate incompatible inputs.
        if (inputInfo.isIncompatible()) {
            const incompatibilityReason = inputInfo.container.getInputMemberIncompatibility(input);
            // Add a TODO for the incompatible input, if desired.
            if (incompatibilityReason !== null && host.config.insertTodosForSkippedFields) {
                result.replacements.push(...migrate_ts_type_references.insertTodoForIncompatibility(input.node, info, incompatibilityReason, {
                    single: 'input',
                    plural: 'inputs',
                }));
            }
            filesWithIncompatibleInputs.add(sf);
            continue;
        }
        assert(metadata !== null, `Expected metadata to exist for input isn't marked incompatible.`);
        assert(!ts.isAccessor(input.node), 'Accessor inputs are incompatible.');
        filesWithMigratedInputs.add(sf);
        result.replacements.push(...convertToSignalInput(input.node, metadata, info, checker, importManager, result));
    }
    for (const file of filesWithMigratedInputs) {
        // All inputs were migrated, so we can safely remove the `Input` symbol.
        if (!filesWithIncompatibleInputs.has(file)) {
            importManager.removeImport(file, 'Input', '@angular/core');
        }
    }
}

/**
 * Phase that applies all changes recorded by the import manager in
 * previous migrate phases.
 */
function pass10_applyImportManager(importManager, result, sourceFiles, info) {
    apply_import_manager.applyImportManagerChanges(importManager, result.replacements, sourceFiles, info);
}

/**
 * Phase that migrates TypeScript input references to be signal compatible.
 *
 * The phase takes care of control flow analysis and generates temporary variables
 * where needed to ensure narrowing continues to work. E.g.
 */
function pass5__migrateTypeScriptReferences(host, references, checker, info) {
    migrate_ts_type_references.migrateTypeScriptReferences(host, references, checker, info);
}

/**
 * Phase that migrates Angular template references to
 * unwrap signals.
 */
function pass7__migrateTemplateReferences(host, references) {
    const seenFileReferences = new Set();
    for (const reference of references) {
        // This pass only deals with HTML template references.
        if (!index.isTemplateReference(reference)) {
            continue;
        }
        // Skip references to incompatible inputs.
        if (!host.shouldMigrateReferencesToField(reference.target)) {
            continue;
        }
        // Skip duplicate references. E.g. if a template is shared.
        const fileReferenceId = `${reference.from.templateFile.id}:${reference.from.read.sourceSpan.end}`;
        if (seenFileReferences.has(fileReferenceId)) {
            continue;
        }
        seenFileReferences.add(fileReferenceId);
        // Expand shorthands like `{bla}` to `{bla: bla()}`.
        const appendText = reference.from.isObjectShorthandExpression
            ? `: ${reference.from.read.name}()`
            : `()`;
        host.replacements.push(new project_paths.Replacement(reference.from.templateFile, new project_paths.TextUpdate({
            position: reference.from.read.sourceSpan.end,
            end: reference.from.read.sourceSpan.end,
            toInsert: appendText,
        })));
    }
}

/**
 * Phase that migrates Angular host binding references to
 * unwrap signals.
 */
function pass8__migrateHostBindings(host, references, info) {
    const seenReferences = new WeakMap();
    for (const reference of references) {
        // This pass only deals with host binding references.
        if (!index.isHostBindingReference(reference)) {
            continue;
        }
        // Skip references to incompatible inputs.
        if (!host.shouldMigrateReferencesToField(reference.target)) {
            continue;
        }
        const bindingField = reference.from.hostPropertyNode;
        const expressionOffset = bindingField.getStart() + 1; // account for quotes.
        const readEndPos = expressionOffset + reference.from.read.sourceSpan.end;
        // Skip duplicate references. Can happen if the host object is shared.
        if (seenReferences.get(bindingField)?.has(readEndPos)) {
            continue;
        }
        if (seenReferences.has(bindingField)) {
            seenReferences.get(bindingField).add(readEndPos);
        }
        else {
            seenReferences.set(bindingField, new Set([readEndPos]));
        }
        // Expand shorthands like `{bla}` to `{bla: bla()}`.
        const appendText = reference.from.isObjectShorthandExpression
            ? `: ${reference.from.read.name}()`
            : `()`;
        host.replacements.push(new project_paths.Replacement(project_paths.projectFile(bindingField.getSourceFile(), info), new project_paths.TextUpdate({ position: readEndPos, end: readEndPos, toInsert: appendText })));
    }
}

/**
 * Migrates TypeScript "ts.Type" references. E.g.

 *  - `Partial<MyComp>` will be converted to `UnwrapSignalInputs<Partial<MyComp>>`.
      in Catalyst test files.
 */
function pass9__migrateTypeScriptTypeReferences(host, references, importManager, info) {
    migrate_ts_type_references.migrateTypeScriptTypeReferences(host, references, importManager, info);
}

/**
 * Executes the migration phase.
 *
 * This involves:
 *   - migrating TS references.
 *   - migrating `@Input()` declarations.
 *   - migrating template references.
 *   - migrating host binding references.
 */
function executeMigrationPhase(host, knownInputs, result, info) {
    const { typeChecker, sourceFiles } = info;
    const importManager = new checker.ImportManager({
        // For the purpose of this migration, we always use `input` and don't alias
        // it to e.g. `input_1`.
        generateUniqueIdentifier: () => null,
    });
    const referenceMigrationHost = {
        printer: result.printer,
        replacements: result.replacements,
        shouldMigrateReferencesToField: (inputDescr) => knownInputs.has(inputDescr) && knownInputs.get(inputDescr).isIncompatible() === false,
        shouldMigrateReferencesToClass: (clazz) => knownInputs.getDirectiveInfoForClass(clazz) !== undefined &&
            knownInputs.getDirectiveInfoForClass(clazz).hasMigratedFields(),
    };
    // Migrate passes.
    pass5__migrateTypeScriptReferences(referenceMigrationHost, result.references, typeChecker, info);
    pass6__migrateInputDeclarations(host, typeChecker, result, knownInputs, importManager, info);
    pass7__migrateTemplateReferences(referenceMigrationHost, result.references);
    pass8__migrateHostBindings(referenceMigrationHost, result.references, info);
    pass9__migrateTypeScriptTypeReferences(referenceMigrationHost, result.references, importManager, info);
    pass10_applyImportManager(importManager, result, sourceFiles, info);
}

/** Filters ignorable input incompatibilities when best effort mode is enabled. */
function filterIncompatibilitiesForBestEffortMode(knownInputs) {
    knownInputs.knownInputIds.forEach(({ container: c }) => {
        // All class incompatibilities are "filterable" right now.
        c.incompatible = null;
        for (const [key, i] of c.memberIncompatibility.entries()) {
            if (!migrate_ts_type_references.nonIgnorableFieldIncompatibilities.includes(i.reason)) {
                c.memberIncompatibility.delete(key);
            }
        }
    });
}

/**
 * Tsurge migration for migrating Angular `@Input()` declarations to
 * signal inputs, with support for batch execution.
 */
class SignalInputMigration extends project_paths.TsurgeComplexMigration {
    config;
    upgradedAnalysisPhaseResults = null;
    constructor(config = {}) {
        super();
        this.config = config;
    }
    createProgram(tsconfigAbsPath, fs) {
        return super.createProgram(tsconfigAbsPath, fs, {
            _compilePoisonedComponents: true,
            // We want to migrate non-exported classes too.
            compileNonExportedClasses: true,
            // Always generate as much TCB code as possible.
            // This allows us to check references in templates as much as possible.
            // Note that this may yield more diagnostics, but we are not collecting these anyway.
            strictTemplates: true,
        });
    }
    /**
     * Prepares the program for this migration with additional custom
     * fields to allow for batch-mode testing.
     */
    _prepareProgram(info) {
        // Optional filter for testing. Allows for simulation of parallel execution
        // even if some tsconfig's have overlap due to sharing of TS sources.
        // (this is commonly not the case in g3 where deps are `.d.ts` files).
        const limitToRootNamesOnly = process.env['LIMIT_TO_ROOT_NAMES_ONLY'] === '1';
        const filteredSourceFiles = info.sourceFiles.filter((f) => 
        // Optional replacement filter. Allows parallel execution in case
        // some tsconfig's have overlap due to sharing of TS sources.
        // (this is commonly not the case in g3 where deps are `.d.ts` files).
        !limitToRootNamesOnly || info.__programAbsoluteRootFileNames.includes(f.fileName));
        return {
            ...info,
            sourceFiles: filteredSourceFiles,
        };
    }
    // Extend the program info with the analysis information we need in every phase.
    prepareAnalysisDeps(info) {
        const analysisInfo = {
            ...info,
            ...prepareAnalysisInfo(info.program, info.ngCompiler, info.__programAbsoluteRootFileNames),
        };
        return analysisInfo;
    }
    async analyze(info) {
        info = this._prepareProgram(info);
        const analysisDeps = this.prepareAnalysisDeps(info);
        const knownInputs = new KnownInputs(info, this.config);
        const result = new MigrationResult();
        const host = createMigrationHost(info, this.config);
        this.config.reportProgressFn?.(10, 'Analyzing project (input usages)..');
        const { inheritanceGraph } = executeAnalysisPhase(host, knownInputs, result, analysisDeps);
        // Mark filtered inputs before checking inheritance. This ensures filtered
        // inputs properly influence e.g. inherited or derived inputs that now wouldn't
        // be safe either (BUT can still be skipped via best effort mode later).
        filterInputsViaConfig(result, knownInputs, this.config);
        // Analyze inheritance, track edges etc. and later propagate incompatibilities in
        // the merge stage.
        this.config.reportProgressFn?.(40, 'Checking inheritance..');
        pass4__checkInheritanceOfInputs(inheritanceGraph, analysisDeps.metaRegistry, knownInputs);
        // Filter best effort incompatibilities, so that the new filtered ones can
        // be accordingly respected in the merge phase.
        if (this.config.bestEffortMode) {
            filterIncompatibilitiesForBestEffortMode(knownInputs);
        }
        const unitData = getCompilationUnitMetadata(knownInputs);
        // Non-batch mode!
        if (this.config.upgradeAnalysisPhaseToAvoidBatch) {
            const globalMeta = await this.globalMeta(unitData);
            const { replacements } = await this.migrate(globalMeta, info, {
                knownInputs,
                result,
                host,
                analysisDeps,
            });
            this.config.reportProgressFn?.(100, 'Completed migration.');
            // Expose the upgraded analysis stage results.
            this.upgradedAnalysisPhaseResults = {
                replacements,
                projectRoot: info.projectRoot,
                knownInputs,
            };
        }
        return project_paths.confirmAsSerializable(unitData);
    }
    async combine(unitA, unitB) {
        return project_paths.confirmAsSerializable(combineCompilationUnitData(unitA, unitB));
    }
    async globalMeta(combinedData) {
        return project_paths.confirmAsSerializable(convertToGlobalMeta(combinedData));
    }
    async migrate(globalMetadata, info, nonBatchData) {
        info = this._prepareProgram(info);
        const knownInputs = nonBatchData?.knownInputs ?? new KnownInputs(info, this.config);
        const result = nonBatchData?.result ?? new MigrationResult();
        const host = nonBatchData?.host ?? createMigrationHost(info, this.config);
        const analysisDeps = nonBatchData?.analysisDeps ?? this.prepareAnalysisDeps(info);
        // Can't re-use analysis structures, so re-build them.
        if (nonBatchData === undefined) {
            executeAnalysisPhase(host, knownInputs, result, analysisDeps);
        }
        // Incorporate global metadata into known inputs.
        populateKnownInputsFromGlobalData(knownInputs, globalMetadata);
        if (this.config.bestEffortMode) {
            filterIncompatibilitiesForBestEffortMode(knownInputs);
        }
        this.config.reportProgressFn?.(60, 'Collecting migration changes..');
        executeMigrationPhase(host, knownInputs, result, analysisDeps);
        return { replacements: result.replacements };
    }
    async stats(globalMetadata) {
        let fullCompilationInputs = 0;
        let sourceInputs = 0;
        let incompatibleInputs = 0;
        const fieldIncompatibleCounts = {};
        const classIncompatibleCounts = {};
        for (const [id, input] of Object.entries(globalMetadata.knownInputs)) {
            fullCompilationInputs++;
            const isConsideredSourceInput = input.seenAsSourceInput &&
                input.memberIncompatibility !== migrate_ts_type_references.FieldIncompatibilityReason.OutsideOfMigrationScope &&
                input.memberIncompatibility !== migrate_ts_type_references.FieldIncompatibilityReason.SkippedViaConfigFilter;
            // We won't track incompatibilities to inputs that aren't considered source inputs.
            // Tracking their statistics wouldn't provide any value.
            if (!isConsideredSourceInput) {
                continue;
            }
            sourceInputs++;
            if (input.memberIncompatibility !== null || input.owningClassIncompatibility !== null) {
                incompatibleInputs++;
            }
            if (input.memberIncompatibility !== null) {
                const reasonName = migrate_ts_type_references.FieldIncompatibilityReason[input.memberIncompatibility];
                const key = `input-field-incompatibility-${reasonName}`;
                fieldIncompatibleCounts[key] ??= 0;
                fieldIncompatibleCounts[key]++;
            }
            if (input.owningClassIncompatibility !== null) {
                const reasonName = migrate_ts_type_references.ClassIncompatibilityReason[input.owningClassIncompatibility];
                const key = `input-owning-class-incompatibility-${reasonName}`;
                classIncompatibleCounts[key] ??= 0;
                classIncompatibleCounts[key]++;
            }
        }
        return {
            counters: {
                fullCompilationInputs,
                sourceInputs,
                incompatibleInputs,
                ...fieldIncompatibleCounts,
                ...classIncompatibleCounts,
            },
        };
    }
}
/**
 * Updates the migration state to filter inputs based on a filter
 * method defined in the migration config.
 */
function filterInputsViaConfig(result, knownInputs, config) {
    if (config.shouldMigrateInput === undefined) {
        return;
    }
    const skippedInputs = new Set();
    // Mark all skipped inputs as incompatible for migration.
    for (const input of knownInputs.knownInputIds.values()) {
        if (!config.shouldMigrateInput(input)) {
            skippedInputs.add(input.descriptor.key);
            knownInputs.markFieldIncompatible(input.descriptor, {
                context: null,
                reason: migrate_ts_type_references.FieldIncompatibilityReason.SkippedViaConfigFilter,
            });
        }
    }
}
function createMigrationHost(info, config) {
    return new MigrationHost(/* isMigratingCore */ false, info, config, info.sourceFiles);
}

function migrate(options) {
    return async (tree, context) => {
        await project_paths.runMigraetionInDevkit({
            tree,
            getMigration: (fs) => new SignalInputMigration({
                bestEffortMode: options.bestEffortMode,
                insertTodosForSkippedFields: options.insertTodos,
                shouldMigrateInput: (input) => {
                    return (input.file.rootRelativePath.startsWith(fs.normalize(options.path)) &&
                        !/(^|\/)node_modules\//.test(input.file.rootRelativePath));
                },
            }),
            beforeProgramCreation: (tsconfigPath, stage) => {
                if (stage === project_paths.MigrationStage.Analysis) {
                    context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
                }
                else {
                    context.logger.info(`Running migration for: ${tsconfigPath}...`);
                }
            },
            afterProgramCreation: (info, fs) => {
                const analysisPath = fs.resolve(options.analysisDir);
                // Support restricting the analysis to subfolders for larger projects.
                if (analysisPath !== '/') {
                    info.sourceFiles = info.sourceFiles.filter((sf) => sf.fileName.startsWith(analysisPath));
                    info.fullProgramSourceFiles = info.fullProgramSourceFiles.filter((sf) => sf.fileName.startsWith(analysisPath));
                }
            },
            beforeUnitAnalysis: (tsconfigPath) => {
                context.logger.info(`Scanning for inputs: ${tsconfigPath}...`);
            },
            afterAllAnalyzed: () => {
                context.logger.info(``);
                context.logger.info(`Processing analysis data between targets...`);
                context.logger.info(``);
            },
            afterAnalysisFailure: () => {
                context.logger.error('Migration failed unexpectedly with no analysis data');
            },
            whenDone: ({ counters }) => {
                const { sourceInputs, incompatibleInputs } = counters;
                const migratedInputs = sourceInputs - incompatibleInputs;
                context.logger.info('');
                context.logger.info(`Successfully migrated to signal inputs 🎉`);
                context.logger.info(`  -> Migrated ${migratedInputs}/${sourceInputs} inputs.`);
                if (incompatibleInputs > 0 && !options.insertTodos) {
                    context.logger.warn(`To see why ${incompatibleInputs} inputs couldn't be migrated`);
                    context.logger.warn(`consider re-running with "--insert-todos" or "--best-effort-mode".`);
                }
                if (options.bestEffortMode) {
                    context.logger.warn(`You ran with best effort mode. Manually verify all code ` +
                        `works as intended, and fix where necessary.`);
                }
            },
        });
    };
}

exports.migrate = migrate;
Eix`џ.'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var checker = require('./checker-BwV9MjSQ.cjs');
var ts = require('typescript');
require('os');
var index$1 = require('./index-BnJH1Hc7.cjs');
require('path');
var project_paths = require('./project_paths-DY3SIODd.cjs');
var apply_import_manager = require('./apply_import_manager-DF0BUe6N.cjs');
var migrate_ts_type_references = require('./migrate_ts_type_references-DQe6JtwN.cjs');
var assert = require('assert');
var index = require('./index-B6p5mHIY.cjs');
require('@angular-devkit/core');
require('node:path/posix');
require('fs');
require('module');
require('url');
require('@angular-devkit/schematics');
require('./project_tsconfig_paths-CDVxT6Ov.cjs');
require('./leading_space-D9nQ8UQC.cjs');

/**
 * Phase that migrates Angular host binding references to
 * unwrap signals.
 */
function migrateHostBindings(host, references, info) {
    const seenReferences = new WeakMap();
    for (const reference of references) {
        // This pass only deals with host binding references.
        if (!index.isHostBindingReference(reference)) {
            continue;
        }
        // Skip references to incompatible inputs.
        if (!host.shouldMigrateReferencesToField(reference.target)) {
            continue;
        }
        const bindingField = reference.from.hostPropertyNode;
        const expressionOffset = bindingField.getStart() + 1; // account for quotes.
        const readEndPos = expressionOffset + reference.from.read.sourceSpan.end;
        // Skip duplicate references. Can happen if the host object is shared.
        if (seenReferences.get(bindingField)?.has(readEndPos)) {
            continue;
        }
        if (seenReferences.has(bindingField)) {
            seenReferences.get(bindingField).add(readEndPos);
        }
        else {
            seenReferences.set(bindingField, new Set([readEndPos]));
        }
        // Expand shorthands like `{bla}` to `{bla: bla()}`.
        const appendText = reference.from.isObjectShorthandExpression
            ? `: ${reference.from.read.name}()`
            : `()`;
        host.replacements.push(new project_paths.Replacement(project_paths.projectFile(bindingField.getSourceFile(), info), new project_paths.TextUpdate({ position: readEndPos, end: readEndPos, toInsert: appendText })));
    }
}

/**
 * Phase that migrates Angular template references to
 * unwrap signals.
 */
function migrateTemplateReferences(host, references) {
    const seenFileReferences = new Set();
    for (const reference of references) {
        // This pass only deals with HTML template references.
        if (!index.isTemplateReference(reference)) {
            continue;
        }
        // Skip references to incompatible inputs.
        if (!host.shouldMigrateReferencesToField(reference.target)) {
            continue;
        }
        // Skip duplicate references. E.g. if a template is shared.
        const fileReferenceId = `${reference.from.templateFile.id}:${reference.from.read.sourceSpan.end}`;
        if (seenFileReferences.has(fileReferenceId)) {
            continue;
        }
        seenFileReferences.add(fileReferenceId);
        // Expand shorthands like `{bla}` to `{bla: bla()}`.
        const appendText = reference.from.isObjectShorthandExpression
            ? `: ${reference.from.read.name}()`
            : `()`;
        host.replacements.push(new project_paths.Replacement(reference.from.templateFile, new project_paths.TextUpdate({
            position: reference.from.read.sourceSpan.end,
            end: reference.from.read.sourceSpan.end,
            toInsert: appendText,
        })));
    }
}

/**
 * Extracts the type `T` of expressions referencing `QueryList<T>`.
 */
function extractQueryListType(node) {
    // Initializer variant of `new QueryList<T>()`.
    if (ts.isNewExpression(node) &&
        ts.isIdentifier(node.expression) &&
        node.expression.text === 'QueryList') {
        return node.typeArguments?.[0];
    }
    // Type variant of `: QueryList<T>`.
    if (ts.isTypeReferenceNode(node) &&
        ts.isIdentifier(node.typeName) &&
        node.typeName.text === 'QueryList') {
        return node.typeArguments?.[0];
    }
    return undefined;
}

/**
 *  A few notes on changes:
 *
 *    @ViewChild()
 *       --> static is gone!
 *       --> read stays
 *
 *    @ViewChildren()
 *       --> emitDistinctChangesOnly is gone!
 *       --> read stays
 *
 *    @ContentChild()
 *       --> descendants stays
 *       --> read stays
 *       --> static is gone!
 *
 *    @ContentChildren()
 *       --> descendants stays
 *       --> read stays
 *       --> emitDistinctChangesOnly is gone!
 */
function computeReplacementsToMigrateQuery(node, metadata, importManager, info, printer, options, checker$1) {
    const sf = node.getSourceFile();
    let newQueryFn = importManager.addImport({
        requestedFile: sf,
        exportModuleSpecifier: '@angular/core',
        exportSymbolName: metadata.kind,
    });
    // The default value for descendants is `true`, except for `ContentChildren`.
    const defaultDescendants = metadata.kind !== 'contentChildren';
    const optionProperties = [];
    const args = [
        metadata.args[0], // Locator.
    ];
    let type = node.type;
    // For multi queries, attempt to unwrap `QueryList` types, or infer the
    // type from the initializer, if possible.
    if (!metadata.queryInfo.first) {
        if (type === undefined && node.initializer !== undefined) {
            type = extractQueryListType(node.initializer);
        }
        else if (type !== undefined) {
            type = extractQueryListType(type);
        }
    }
    if (metadata.queryInfo.read !== null) {
        assert(metadata.queryInfo.read instanceof checker.WrappedNodeExpr);
        optionProperties.push(ts.factory.createPropertyAssignment('read', metadata.queryInfo.read.node));
    }
    if (metadata.queryInfo.descendants !== defaultDescendants) {
        optionProperties.push(ts.factory.createPropertyAssignment('descendants', metadata.queryInfo.descendants ? ts.factory.createTrue() : ts.factory.createFalse()));
    }
    if (optionProperties.length > 0) {
        args.push(ts.factory.createObjectLiteralExpression(optionProperties));
    }
    const strictNullChecksEnabled = options.strict === true || options.strictNullChecks === true;
    const strictPropertyInitialization = options.strict === true || options.strictPropertyInitialization === true;
    let isRequired = node.exclamationToken !== undefined;
    // If we come across an application with strict null checks enabled, but strict
    // property initialization is disabled, there are two options:
    //   - Either the query is already typed to include `undefined` explicitly,
    //     in which case an option query makes sense.
    //   - OR, the query is not typed to include `undefined`. In which case, the query
    //     should be marked as required to not break the app. The user-code throughout
    //     the application (given strict null checks) already assumes non-nullable!
    if (strictNullChecksEnabled &&
        !strictPropertyInitialization &&
        node.initializer === undefined &&
        node.questionToken === undefined &&
        type !== undefined &&
        !checker$1.isTypeAssignableTo(checker$1.getUndefinedType(), checker$1.getTypeFromTypeNode(type))) {
        isRequired = true;
    }
    if (isRequired && metadata.queryInfo.first) {
        // If the query is required already via some indicators, and this is a "single"
        // query, use the available `.required` method.
        newQueryFn = ts.factory.createPropertyAccessExpression(newQueryFn, 'required');
    }
    // If this query is still nullable (i.e. not required), attempt to remove
    // explicit `undefined` types if possible.
    if (!isRequired && type !== undefined && ts.isUnionTypeNode(type)) {
        type = migrate_ts_type_references.removeFromUnionIfPossible(type, (v) => v.kind !== ts.SyntaxKind.UndefinedKeyword);
    }
    let locatorType = Array.isArray(metadata.queryInfo.predicate)
        ? null
        : metadata.queryInfo.predicate.expression;
    let resolvedReadType = metadata.queryInfo.read ?? locatorType;
    // If the original property type and the read type are matching, we can rely
    // on the TS inference, instead of repeating types, like in `viewChild<Button>(Button)`.
    if (type !== undefined &&
        resolvedReadType instanceof checker.WrappedNodeExpr &&
        ts.isIdentifier(resolvedReadType.node) &&
        ts.isTypeReferenceNode(type) &&
        ts.isIdentifier(type.typeName) &&
        type.typeName.text === resolvedReadType.node.text) {
        locatorType = null;
    }
    const call = ts.factory.createCallExpression(newQueryFn, 
    // If there is no resolved `ReadT` (e.g. string predicate), we use the
    // original type explicitly as generic. Otherwise, query API is smart
    // enough to always infer.
    resolvedReadType === null && type !== undefined ? [type] : undefined, args);
    const accessibilityModifier = getAccessibilityModifier(node);
    let modifiers = [
        ts.factory.createModifier(ts.SyntaxKind.ReadonlyKeyword),
    ];
    if (accessibilityModifier) {
        modifiers = [accessibilityModifier, ...modifiers];
    }
    const updated = ts.factory.createPropertyDeclaration(modifiers, node.name, undefined, undefined, call);
    return [
        new project_paths.Replacement(project_paths.projectFile(node.getSourceFile(), info), new project_paths.TextUpdate({
            position: node.getStart(),
            end: node.getEnd(),
            toInsert: printer.printNode(ts.EmitHint.Unspecified, updated, sf),
        })),
    ];
}
function getAccessibilityModifier(node) {
    return node.modifiers?.find((mod) => mod.kind === ts.SyntaxKind.PublicKeyword ||
        mod.kind === ts.SyntaxKind.PrivateKeyword ||
        mod.kind === ts.SyntaxKind.ProtectedKeyword);
}

/**
 * Attempts to get a class field descriptor if the given symbol
 * points to a class field.
 */
function getClassFieldDescriptorForSymbol(symbol, info) {
    if (symbol?.valueDeclaration === undefined ||
        !ts.isPropertyDeclaration(symbol.valueDeclaration)) {
        return null;
    }
    const key = getUniqueIDForClassProperty(symbol.valueDeclaration, info);
    if (key === null) {
        return null;
    }
    return {
        key,
        node: symbol.valueDeclaration,
    };
}
/**
 * Gets a unique ID for the given class property.
 *
 * This is useful for matching class fields across compilation units.
 * E.g. a reference may point to the field via `.d.ts`, while the other
 * may reference it via actual `.ts` sources. IDs for the same fields
 * would then match identity.
 */
function getUniqueIDForClassProperty(property, info) {
    if (!ts.isClassDeclaration(property.parent) || property.parent.name === undefined) {
        return null;
    }
    if (property.name === undefined) {
        return null;
    }
    const id = project_paths.projectFile(property.getSourceFile(), info).id.replace(/\.d\.ts$/, '.ts');
    // Note: If a class is nested, there could be an ID clash.
    // This is highly unlikely though, and this is not a problem because
    // in such cases, there is even less chance there are any references to
    // a non-exported classes; in which case, cross-compilation unit references
    // likely can't exist anyway.
    return `${id}-${property.parent.name.text}-${property.name.getText()}`;
}

/**
 * Determines if the given node refers to a decorator-based query, and
 * returns its resolved metadata if possible.
 */
function extractSourceQueryDefinition(node, reflector, evaluator, info) {
    if ((!ts.isPropertyDeclaration(node) && !ts.isAccessor(node)) ||
        !ts.isClassDeclaration(node.parent) ||
        node.parent.name === undefined ||
        !ts.isIdentifier(node.name)) {
        return null;
    }
    const decorators = reflector.getDecoratorsOfDeclaration(node) ?? [];
    const ngDecorators = checker.getAngularDecorators(decorators, checker.queryDecoratorNames, /* isCore */ false);
    if (ngDecorators.length === 0) {
        return null;
    }
    const decorator = ngDecorators[0];
    const id = getUniqueIDForClassProperty(node, info);
    if (id === null) {
        return null;
    }
    let kind;
    if (decorator.name === 'ViewChild') {
        kind = 'viewChild';
    }
    else if (decorator.name === 'ViewChildren') {
        kind = 'viewChildren';
    }
    else if (decorator.name === 'ContentChild') {
        kind = 'contentChild';
    }
    else if (decorator.name === 'ContentChildren') {
        kind = 'contentChildren';
    }
    else {
        throw new Error('Unexpected query decorator detected.');
    }
    let queryInfo = null;
    try {
        queryInfo = checker.extractDecoratorQueryMetadata(node, decorator.name, decorator.args ?? [], node.name.text, reflector, evaluator);
    }
    catch (e) {
        if (!(e instanceof checker.FatalDiagnosticError)) {
            throw e;
        }
        console.error(`Skipping query: ${e.node.getSourceFile().fileName}: ${e.toString()}`);
        return null;
    }
    return {
        id,
        kind,
        args: decorator.args ?? [],
        queryInfo,
        node: node,
        fieldDecorators: decorators,
    };
}

function markFieldIncompatibleInMetadata(data, id, reason) {
    const existing = data[id];
    if (existing === undefined) {
        data[id] = {
            fieldReason: reason,
            classReason: null,
        };
    }
    else if (existing.fieldReason === null) {
        existing.fieldReason = reason;
    }
    else {
        existing.fieldReason = migrate_ts_type_references.pickFieldIncompatibility({ reason, context: null }, { reason: existing.fieldReason, context: null }).reason;
    }
}
function filterBestEffortIncompatibilities(knownQueries) {
    for (const query of Object.values(knownQueries.globalMetadata.problematicQueries)) {
        if (query.fieldReason !== null &&
            !migrate_ts_type_references.nonIgnorableFieldIncompatibilities.includes(query.fieldReason)) {
            query.fieldReason = null;
        }
    }
}

class KnownQueries {
    info;
    config;
    globalMetadata;
    classToQueryFields = new Map();
    knownQueryIDs = new Map();
    constructor(info, config, globalMetadata) {
        this.info = info;
        this.config = config;
        this.globalMetadata = globalMetadata;
    }
    isFieldIncompatible(descriptor) {
        return this.getIncompatibilityForField(descriptor) !== null;
    }
    markFieldIncompatible(field, incompatibility) {
        markFieldIncompatibleInMetadata(this.globalMetadata.problematicQueries, field.key, incompatibility.reason);
    }
    markClassIncompatible(node, reason) {
        this.classToQueryFields.get(node)?.forEach((f) => {
            this.globalMetadata.problematicQueries[f.key] ??= { classReason: null, fieldReason: null };
            this.globalMetadata.problematicQueries[f.key].classReason = reason;
        });
    }
    registerQueryField(queryField, id) {
        if (!this.classToQueryFields.has(queryField.parent)) {
            this.classToQueryFields.set(queryField.parent, []);
        }
        this.classToQueryFields.get(queryField.parent).push({
            key: id,
            node: queryField,
        });
        this.knownQueryIDs.set(id, { key: id, node: queryField });
        const descriptor = { key: id, node: queryField };
        const file = project_paths.projectFile(queryField.getSourceFile(), this.info);
        if (this.config.shouldMigrateQuery !== undefined &&
            !this.config.shouldMigrateQuery(descriptor, file)) {
            this.markFieldIncompatible(descriptor, {
                context: null,
                reason: migrate_ts_type_references.FieldIncompatibilityReason.SkippedViaConfigFilter,
            });
        }
    }
    attemptRetrieveDescriptorFromSymbol(symbol) {
        const descriptor = getClassFieldDescriptorForSymbol(symbol, this.info);
        if (descriptor !== null && this.knownQueryIDs.has(descriptor.key)) {
            return descriptor;
        }
        return null;
    }
    shouldTrackClassReference(clazz) {
        return this.classToQueryFields.has(clazz);
    }
    getQueryFieldsOfClass(clazz) {
        return this.classToQueryFields.get(clazz);
    }
    getAllClassesWithQueries() {
        return Array.from(this.classToQueryFields.keys()).filter((c) => ts.isClassDeclaration(c));
    }
    captureKnownFieldInheritanceRelationship(derived, parent) {
        // Note: The edge problematic pattern recognition is not as good as the one
        // we have in the signal input migration. That is because we couldn't trivially
        // build up an inheritance graph during analyze phase where we DON'T know what
        // fields refer to queries. Usually we'd use the graph to smartly propagate
        // incompatibilities using topological sort. This doesn't work here and is
        // unnecessarily complex, so we try our best at detecting direct edge
        // incompatibilities (which are quite order dependent).
        if (this.isFieldIncompatible(parent) && !this.isFieldIncompatible(derived)) {
            this.markFieldIncompatible(derived, {
                context: null,
                reason: migrate_ts_type_references.FieldIncompatibilityReason.ParentIsIncompatible,
            });
            return;
        }
        if (this.isFieldIncompatible(derived) && !this.isFieldIncompatible(parent)) {
            this.markFieldIncompatible(parent, {
                context: null,
                reason: migrate_ts_type_references.FieldIncompatibilityReason.DerivedIsIncompatible,
            });
        }
    }
    captureUnknownDerivedField(field) {
        this.markFieldIncompatible(field, {
            context: null,
            reason: migrate_ts_type_references.FieldIncompatibilityReason.OverriddenByDerivedClass,
        });
    }
    captureUnknownParentField(field) {
        this.markFieldIncompatible(field, {
            context: null,
            reason: migrate_ts_type_references.FieldIncompatibilityReason.TypeConflictWithBaseClass,
        });
    }
    getIncompatibilityForField(descriptor) {
        const problematicInfo = this.globalMetadata.problematicQueries[descriptor.key];
        if (problematicInfo === undefined) {
            return null;
        }
        if (problematicInfo.fieldReason !== null) {
            return { context: null, reason: problematicInfo.fieldReason };
        }
        if (problematicInfo.classReason !== null) {
            return problematicInfo.classReason;
        }
        return null;
    }
    getIncompatibilityTextForField(field) {
        const incompatibilityInfo = this.globalMetadata.problematicQueries[field.key];
        if (incompatibilityInfo.fieldReason !== null) {
            return migrate_ts_type_references.getMessageForFieldIncompatibility(incompatibilityInfo.fieldReason, {
                single: 'query',
                plural: 'queries',
            });
        }
        if (incompatibilityInfo.classReason !== null) {
            return migrate_ts_type_references.getMessageForClassIncompatibility(incompatibilityInfo.classReason, {
                single: 'query',
                plural: 'queries',
            });
        }
        return null;
    }
}

/** Converts an initializer query API name to its decorator-equivalent. */
function queryFunctionNameToDecorator(name) {
    if (name === 'viewChild') {
        return 'ViewChild';
    }
    else if (name === 'viewChildren') {
        return 'ViewChildren';
    }
    else if (name === 'contentChild') {
        return 'ContentChild';
    }
    else if (name === 'contentChildren') {
        return 'ContentChildren';
    }
    throw new Error(`Unexpected query function name: ${name}`);
}

/**
 * Gets whether the given field is accessed via the
 * given reference.
 *
 * E.g. whether `<my-read>.toArray` is detected.
 */
function checkTsReferenceAccessesField(ref, fieldName) {
    const accessNode = index.traverseAccess(ref.from.node);
    // Check if the reference is part of a property access.
    if (!ts.isPropertyAccessExpression(accessNode.parent) ||
        !ts.isIdentifier(accessNode.parent.name)) {
        return null;
    }
    // Check if the reference is refers to the given field name.
    if (accessNode.parent.name.text !== fieldName) {
        return null;
    }
    return accessNode.parent;
}
/**
 * Gets whether the given read is used to access
 * the specified field.
 *
 * E.g. whether `<my-read>.toArray` is detected.
 */
function checkNonTsReferenceAccessesField(ref, fieldName) {
    const readFromPath = ref.from.readAstPath.at(-1);
    const parentRead = ref.from.readAstPath.at(-2);
    if (ref.from.read !== readFromPath) {
        return null;
    }
    if (!(parentRead instanceof checker.PropertyRead) || parentRead.name !== fieldName) {
        return null;
    }
    return parentRead;
}
/**
 * Gets whether the given reference is accessed to call the
 * specified function on it.
 *
 * E.g. whether `<my-read>.toArray()` is detected.
 */
function checkTsReferenceCallsField(ref, fieldName) {
    const propertyAccess = checkTsReferenceAccessesField(ref, fieldName);
    if (propertyAccess === null) {
        return null;
    }
    if (ts.isCallExpression(propertyAccess.parent) &&
        propertyAccess.parent.expression === propertyAccess) {
        return propertyAccess.parent;
    }
    return null;
}
/**
 * Gets whether the given reference is accessed to call the
 * specified function on it.
 *
 * E.g. whether `<my-read>.toArray()` is detected.
 */
function checkNonTsReferenceCallsField(ref, fieldName) {
    const propertyAccess = checkNonTsReferenceAccessesField(ref, fieldName);
    if (propertyAccess === null) {
        return null;
    }
    const accessIdx = ref.from.readAstPath.indexOf(propertyAccess);
    if (accessIdx === -1) {
        return null;
    }
    const potentialCall = ref.from.readAstPath[accessIdx - 1];
    if (potentialCall === undefined || !(potentialCall instanceof checker.Call)) {
        return null;
    }
    return potentialCall;
}

function removeQueryListToArrayCall(ref, info, globalMetadata, knownQueries, replacements) {
    if (!index.isHostBindingReference(ref) && !index.isTemplateReference(ref) && !index.isTsReference(ref)) {
        return;
    }
    if (knownQueries.isFieldIncompatible(ref.target)) {
        return;
    }
    if (!globalMetadata.knownQueryFields[ref.target.key]?.isMulti) {
        return;
    }
    // TS references.
    if (index.isTsReference(ref)) {
        const toArrayCallExpr = checkTsReferenceCallsField(ref, 'toArray');
        if (toArrayCallExpr === null) {
            return;
        }
        const toArrayExpr = toArrayCallExpr.expression;
        replacements.push(new project_paths.Replacement(project_paths.projectFile(toArrayExpr.getSourceFile(), info), new project_paths.TextUpdate({
            // Delete from expression end to call end. E.g. `.toArray(<..>)`.
            position: toArrayExpr.expression.getEnd(),
            end: toArrayCallExpr.getEnd(),
            toInsert: '',
        })));
        return;
    }
    // Template and host binding references.
    const callExpr = checkNonTsReferenceCallsField(ref, 'toArray');
    if (callExpr === null) {
        return;
    }
    const file = index.isHostBindingReference(ref) ? ref.from.file : ref.from.templateFile;
    const offset = index.isHostBindingReference(ref) ? ref.from.hostPropertyNode.getStart() + 1 : 0;
    replacements.push(new project_paths.Replacement(file, new project_paths.TextUpdate({
        // Delete from expression end to call end. E.g. `.toArray(<..>)`.
        position: offset + callExpr.receiver.receiver.sourceSpan.end,
        end: offset + callExpr.sourceSpan.end,
        toInsert: '',
    })));
}

function replaceQueryListGetCall(ref, info, globalMetadata, knownQueries, replacements) {
    if (!index.isHostBindingReference(ref) && !index.isTemplateReference(ref) && !index.isTsReference(ref)) {
        return;
    }
    if (knownQueries.isFieldIncompatible(ref.target)) {
        return;
    }
    if (!globalMetadata.knownQueryFields[ref.target.key]?.isMulti) {
        return;
    }
    if (index.isTsReference(ref)) {
        const getCallExpr = checkTsReferenceCallsField(ref, 'get');
        if (getCallExpr === null) {
            return;
        }
        const getExpr = getCallExpr.expression;
        replacements.push(new project_paths.Replacement(project_paths.projectFile(getExpr.getSourceFile(), info), new project_paths.TextUpdate({
            position: getExpr.name.getStart(),
            end: getExpr.name.getEnd(),
            toInsert: 'at',
        })));
        return;
    }
    // Template and host binding references.
    const callExpr = checkNonTsReferenceCallsField(ref, 'get');
    if (callExpr === null) {
        return;
    }
    const file = index.isHostBindingReference(ref) ? ref.from.file : ref.from.templateFile;
    const offset = index.isHostBindingReference(ref) ? ref.from.hostPropertyNode.getStart() + 1 : 0;
    replacements.push(new project_paths.Replacement(file, new project_paths.TextUpdate({
        position: offset + callExpr.receiver.nameSpan.start,
        end: offset + callExpr.receiver.nameSpan.end,
        toInsert: 'at',
    })));
}

const problematicQueryListMethods = [
    'dirty',
    'changes',
    'setDirty',
    'reset',
    'notifyOnChanges',
    'destroy',
];
function checkForIncompatibleQueryListAccesses(ref, result) {
    if (index.isTsReference(ref)) {
        for (const problematicFn of problematicQueryListMethods) {
            const access = checkTsReferenceAccessesField(ref, problematicFn);
            if (access !== null) {
                result.potentialProblematicReferenceForMultiQueries[ref.target.key] = true;
                return;
            }
        }
    }
    if (index.isHostBindingReference(ref) || index.isTemplateReference(ref)) {
        for (const problematicFn of problematicQueryListMethods) {
            const access = checkNonTsReferenceAccessesField(ref, problematicFn);
            if (access !== null) {
                result.potentialProblematicReferenceForMultiQueries[ref.target.key] = true;
                return;
            }
        }
    }
}

const mapping = new Map([
    ['first', 'at(0)!'],
    ['last', 'at(-1)!'],
]);
function replaceQueryListFirstAndLastReferences(ref, info, globalMetadata, knownQueries, replacements) {
    if (!index.isHostBindingReference(ref) && !index.isTemplateReference(ref) && !index.isTsReference(ref)) {
        return;
    }
    if (knownQueries.isFieldIncompatible(ref.target)) {
        return;
    }
    if (!globalMetadata.knownQueryFields[ref.target.key]?.isMulti) {
        return;
    }
    if (index.isTsReference(ref)) {
        const expr = checkTsReferenceAccessesField(ref, 'first') ?? checkTsReferenceAccessesField(ref, 'last');
        if (expr === null) {
            return;
        }
        replacements.push(new project_paths.Replacement(project_paths.projectFile(expr.getSourceFile(), info), new project_paths.TextUpdate({
            position: expr.name.getStart(),
            end: expr.name.getEnd(),
            toInsert: mapping.get(expr.name.text),
        })));
        return;
    }
    // Template and host binding references.
    const expr = checkNonTsReferenceAccessesField(ref, 'first') ?? checkNonTsReferenceAccessesField(ref, 'last');
    if (expr === null) {
        return;
    }
    const file = index.isHostBindingReference(ref) ? ref.from.file : ref.from.templateFile;
    const offset = index.isHostBindingReference(ref) ? ref.from.hostPropertyNode.getStart() + 1 : 0;
    replacements.push(new project_paths.Replacement(file, new project_paths.TextUpdate({
        position: offset + expr.nameSpan.start,
        end: offset + expr.nameSpan.end,
        toInsert: mapping.get(expr.name),
    })));
}

class SignalQueriesMigration extends project_paths.TsurgeComplexMigration {
    config;
    constructor(config = {}) {
        super();
        this.config = config;
    }
    async analyze(info) {
        // Pre-Analyze the program and get access to the template type checker.
        const { templateTypeChecker } = info.ngCompiler?.['ensureAnalyzed']() ?? {
            templateTypeChecker: null,
        };
        const resourceLoader = info.ngCompiler?.['resourceManager'] ?? null;
        // Generate all type check blocks, if we have Angular template information.
        if (templateTypeChecker !== null) {
            templateTypeChecker.generateAllTypeCheckBlocks();
        }
        const { sourceFiles, program } = info;
        const checker$1 = program.getTypeChecker();
        const reflector = new checker.TypeScriptReflectionHost(checker$1);
        const evaluator = new index$1.PartialEvaluator(reflector, checker$1, null);
        const res = {
            knownQueryFields: {},
            potentialProblematicQueries: {},
            potentialProblematicReferenceForMultiQueries: {},
            reusableAnalysisReferences: null,
        };
        const groupedAstVisitor = new migrate_ts_type_references.GroupedTsAstVisitor(sourceFiles);
        const referenceResult = { references: [] };
        const classesWithFilteredQueries = new Set();
        const filteredQueriesForCompilationUnit = new Map();
        const findQueryDefinitionsVisitor = (node) => {
            const extractedQuery = extractSourceQueryDefinition(node, reflector, evaluator, info);
            if (extractedQuery !== null) {
                const queryNode = extractedQuery.node;
                const descriptor = {
                    key: extractedQuery.id,
                    node: queryNode,
                };
                const containingFile = project_paths.projectFile(queryNode.getSourceFile(), info);
                // If we have a config filter function, use it here for later
                // perf-boosted reference lookups. Useful in non-batch mode.
                if (this.config.shouldMigrateQuery === undefined ||
                    this.config.shouldMigrateQuery(descriptor, containingFile)) {
                    classesWithFilteredQueries.add(queryNode.parent);
                    filteredQueriesForCompilationUnit.set(extractedQuery.id, {
                        fieldName: extractedQuery.queryInfo.propertyName,
                    });
                }
                res.knownQueryFields[extractedQuery.id] = {
                    fieldName: extractedQuery.queryInfo.propertyName,
                    isMulti: extractedQuery.queryInfo.first === false,
                };
                if (ts.isAccessor(queryNode)) {
                    markFieldIncompatibleInMetadata(res.potentialProblematicQueries, extractedQuery.id, migrate_ts_type_references.FieldIncompatibilityReason.Accessor);
                }
                // Detect queries with union types that are uncommon to be
                // automatically migrate-able. E.g. `refs: ElementRef|null`,
                // or `ElementRef|SomeOtherType`.
                if (queryNode.type !== undefined &&
                    ts.isUnionTypeNode(queryNode.type) &&
                    // Either too large union, or doesn't match `T|undefined`.
                    (queryNode.type.types.length > 2 ||
                        !queryNode.type.types.some((t) => t.kind === ts.SyntaxKind.UndefinedKeyword))) {
                    markFieldIncompatibleInMetadata(res.potentialProblematicQueries, extractedQuery.id, migrate_ts_type_references.FieldIncompatibilityReason.SignalQueries__IncompatibleMultiUnionType);
                }
                // Migrating fields with `@HostBinding` is incompatible as
                // the host binding decorator does not invoke the signal.
                const hostBindingDecorators = checker.getAngularDecorators(extractedQuery.fieldDecorators, ['HostBinding'], 
                /* isCore */ false);
                if (hostBindingDecorators.length > 0) {
                    markFieldIncompatibleInMetadata(res.potentialProblematicQueries, extractedQuery.id, migrate_ts_type_references.FieldIncompatibilityReason.SignalIncompatibleWithHostBinding);
                }
            }
        };
        this.config.reportProgressFn?.(20, 'Scanning for queries..');
        groupedAstVisitor.register(findQueryDefinitionsVisitor);
        groupedAstVisitor.execute();
        const allFieldsOrKnownQueries = {
            // Note: We don't support cross-target migration of `Partial<T>` usages.
            // This is an acceptable limitation for performance reasons.
            shouldTrackClassReference: (node) => classesWithFilteredQueries.has(node),
            attemptRetrieveDescriptorFromSymbol: (s) => {
                const descriptor = getClassFieldDescriptorForSymbol(s, info);
                // If we are executing in upgraded analysis phase mode, we know all
                // of the queries since there aren't any other compilation units.
                // Ignore references to non-query class fields.
                if (this.config.assumeNonBatch &&
                    (descriptor === null || !filteredQueriesForCompilationUnit.has(descriptor.key))) {
                    return null;
                }
                // In batch mode, we eagerly, rather expensively, track all references.
                // We don't know yet if something refers to a different query or not, so we
                // eagerly detect such and later filter those problematic references that
                // turned out to refer to queries (once we have the global metadata).
                return descriptor;
            },
        };
        groupedAstVisitor.register(index.createFindAllSourceFileReferencesVisitor(info, checker$1, reflector, resourceLoader, evaluator, templateTypeChecker, allFieldsOrKnownQueries, 
        // In non-batch mode, we know what inputs exist and can optimize the reference
        // resolution significantly (for e.g. VSCode integration)— as we know what
        // field names may be used to reference potential queries.
        this.config.assumeNonBatch
            ? new Set(Array.from(filteredQueriesForCompilationUnit.values()).map((f) => f.fieldName))
            : null, referenceResult).visitor);
        const inheritanceGraph = new migrate_ts_type_references.InheritanceGraph(checker$1).expensivePopulate(info.sourceFiles);
        migrate_ts_type_references.checkIncompatiblePatterns(inheritanceGraph, checker$1, groupedAstVisitor, {
            ...allFieldsOrKnownQueries,
            isFieldIncompatible: (f) => res.potentialProblematicQueries[f.key]?.fieldReason !== null ||
                res.potentialProblematicQueries[f.key]?.classReason !== null,
            markClassIncompatible: (clazz, reason) => {
                for (const field of clazz.members) {
                    const key = getUniqueIDForClassProperty(field, info);
                    if (key !== null) {
                        res.potentialProblematicQueries[key] ??= { classReason: null, fieldReason: null };
                        res.potentialProblematicQueries[key].classReason = reason;
                    }
                }
            },
            markFieldIncompatible: (f, incompatibility) => markFieldIncompatibleInMetadata(res.potentialProblematicQueries, f.key, incompatibility.reason),
        }, () => Array.from(classesWithFilteredQueries));
        this.config.reportProgressFn?.(60, 'Scanning for references and problematic patterns..');
        groupedAstVisitor.execute();
        // Determine incompatible queries based on problematic references
        // we saw in TS code, templates or host bindings.
        for (const ref of referenceResult.references) {
            if (index.isTsReference(ref) && ref.from.isWrite) {
                markFieldIncompatibleInMetadata(res.potentialProblematicQueries, ref.target.key, migrate_ts_type_references.FieldIncompatibilityReason.WriteAssignment);
            }
            if ((index.isTemplateReference(ref) || index.isHostBindingReference(ref)) && ref.from.isWrite) {
                markFieldIncompatibleInMetadata(res.potentialProblematicQueries, ref.target.key, migrate_ts_type_references.FieldIncompatibilityReason.WriteAssignment);
            }
            // TODO: Remove this when we support signal narrowing in templates.
            // https://github.com/angular/angular/pull/55456.
            if (index.isTemplateReference(ref) && ref.from.isLikelyPartOfNarrowing) {
                markFieldIncompatibleInMetadata(res.potentialProblematicQueries, ref.target.key, migrate_ts_type_references.FieldIncompatibilityReason.PotentiallyNarrowedInTemplateButNoSupportYet);
            }
            // Check for other incompatible query list accesses.
            checkForIncompatibleQueryListAccesses(ref, res);
        }
        if (this.config.assumeNonBatch) {
            res.reusableAnalysisReferences = referenceResult.references;
        }
        return project_paths.confirmAsSerializable(res);
    }
    async combine(unitA, unitB) {
        const combined = {
            knownQueryFields: {},
            potentialProblematicQueries: {},
            potentialProblematicReferenceForMultiQueries: {},
            reusableAnalysisReferences: null,
        };
        for (const unit of [unitA, unitB]) {
            for (const [id, value] of Object.entries(unit.knownQueryFields)) {
                combined.knownQueryFields[id] = value;
            }
            for (const [id, info] of Object.entries(unit.potentialProblematicQueries)) {
                if (info.fieldReason !== null) {
                    markFieldIncompatibleInMetadata(combined.potentialProblematicQueries, id, info.fieldReason);
                }
                if (info.classReason !== null) {
                    combined.potentialProblematicQueries[id] ??= {
                        classReason: null,
                        fieldReason: null,
                    };
                    combined.potentialProblematicQueries[id].classReason =
                        info.classReason;
                }
            }
            for (const id of Object.keys(unit.potentialProblematicReferenceForMultiQueries)) {
                combined.potentialProblematicReferenceForMultiQueries[id] = true;
            }
            if (unit.reusableAnalysisReferences !== null) {
                combined.reusableAnalysisReferences = unit.reusableAnalysisReferences;
            }
        }
        for (const unit of [unitA, unitB]) {
            for (const id of Object.keys(unit.potentialProblematicReferenceForMultiQueries)) {
                if (combined.knownQueryFields[id]?.isMulti) {
                    markFieldIncompatibleInMetadata(combined.potentialProblematicQueries, id, migrate_ts_type_references.FieldIncompatibilityReason.SignalQueries__QueryListProblematicFieldAccessed);
                }
            }
        }
        return project_paths.confirmAsSerializable(combined);
    }
    async globalMeta(combinedData) {
        const globalUnitData = {
            knownQueryFields: combinedData.knownQueryFields,
            problematicQueries: combinedData.potentialProblematicQueries,
            reusableAnalysisReferences: combinedData.reusableAnalysisReferences,
        };
        for (const id of Object.keys(combinedData.potentialProblematicReferenceForMultiQueries)) {
            if (combinedData.knownQueryFields[id]?.isMulti) {
                markFieldIncompatibleInMetadata(globalUnitData.problematicQueries, id, migrate_ts_type_references.FieldIncompatibilityReason.SignalQueries__QueryListProblematicFieldAccessed);
            }
        }
        return project_paths.confirmAsSerializable(globalUnitData);
    }
    async migrate(globalMetadata, info) {
        // Pre-Analyze the program and get access to the template type checker.
        const { templateTypeChecker, metaReader } = info.ngCompiler?.['ensureAnalyzed']() ?? {
            templateTypeChecker: null,
            metaReader: null,
        };
        const resourceLoader = info.ngCompiler?.['resourceManager'] ?? null;
        const { program, sourceFiles } = info;
        const checker$1 = program.getTypeChecker();
        const reflector = new checker.TypeScriptReflectionHost(checker$1);
        const evaluator = new index$1.PartialEvaluator(reflector, checker$1, null);
        const replacements = [];
        const importManager = new checker.ImportManager();
        const printer = ts.createPrinter();
        const filesWithSourceQueries = new Map();
        const filesWithIncompleteMigration = new Map();
        const filesWithQueryListOutsideOfDeclarations = new WeakSet();
        const knownQueries = new KnownQueries(info, this.config, globalMetadata);
        const referenceResult = { references: [] };
        const sourceQueries = [];
        // Detect all queries in this unit.
        const queryWholeProgramVisitor = (node) => {
            // Detect all SOURCE queries and migrate them, if possible.
            const extractedQuery = extractSourceQueryDefinition(node, reflector, evaluator, info);
            if (extractedQuery !== null) {
                knownQueries.registerQueryField(extractedQuery.node, extractedQuery.id);
                sourceQueries.push(extractedQuery);
                return;
            }
            // Detect OTHER queries, inside `.d.ts`. Needed for reference resolution below.
            if (ts.isPropertyDeclaration(node) ||
                (ts.isAccessor(node) && ts.isClassDeclaration(node.parent))) {
                const classFieldID = getUniqueIDForClassProperty(node, info);
                if (classFieldID !== null && globalMetadata.knownQueryFields[classFieldID] !== undefined) {
                    knownQueries.registerQueryField(node, classFieldID);
                    return;
                }
            }
            // Detect potential usages of `QueryList` outside of queries or imports.
            // Those prevent us from removing the import later.
            if (ts.isIdentifier(node) &&
                node.text === 'QueryList' &&
                ts.findAncestor(node, ts.isImportDeclaration) === undefined) {
                filesWithQueryListOutsideOfDeclarations.add(node.getSourceFile());
            }
            ts.forEachChild(node, queryWholeProgramVisitor);
        };
        for (const sf of info.fullProgramSourceFiles) {
            ts.forEachChild(sf, queryWholeProgramVisitor);
        }
        // Set of all queries in the program. Useful for speeding up reference
        // lookups below.
        const fieldNamesToConsiderForReferenceLookup = new Set(Object.values(globalMetadata.knownQueryFields).map((f) => f.fieldName));
        // Find all references.
        const groupedAstVisitor = new migrate_ts_type_references.GroupedTsAstVisitor(sourceFiles);
        // Re-use previous reference result if available, instead of
        // looking for references which is quite expensive.
        if (globalMetadata.reusableAnalysisReferences !== null) {
            referenceResult.references = globalMetadata.reusableAnalysisReferences;
        }
        else {
            groupedAstVisitor.register(index.createFindAllSourceFileReferencesVisitor(info, checker$1, reflector, resourceLoader, evaluator, templateTypeChecker, knownQueries, fieldNamesToConsiderForReferenceLookup, referenceResult).visitor);
        }
        // Check inheritance.
        // NOTE: Inheritance is only checked in the migrate stage as we cannot reliably
        // check during analyze— where we don't know what fields from foreign `.d.ts`
        // files refer to queries or not.
        const inheritanceGraph = new migrate_ts_type_references.InheritanceGraph(checker$1).expensivePopulate(info.sourceFiles);
        migrate_ts_type_references.checkInheritanceOfKnownFields(inheritanceGraph, metaReader, knownQueries, {
            getFieldsForClass: (n) => knownQueries.getQueryFieldsOfClass(n) ?? [],
            isClassWithKnownFields: (clazz) => knownQueries.getQueryFieldsOfClass(clazz) !== undefined,
        });
        this.config.reportProgressFn?.(80, 'Checking inheritance..');
        groupedAstVisitor.execute();
        if (this.config.bestEffortMode) {
            filterBestEffortIncompatibilities(knownQueries);
        }
        this.config.reportProgressFn?.(90, 'Migrating queries..');
        // Migrate declarations.
        for (const extractedQuery of sourceQueries) {
            const node = extractedQuery.node;
            const sf = node.getSourceFile();
            const descriptor = { key: extractedQuery.id, node: extractedQuery.node };
            const incompatibility = knownQueries.getIncompatibilityForField(descriptor);
            updateFileState(filesWithSourceQueries, sf, extractedQuery.kind);
            if (incompatibility !== null) {
                // Add a TODO for the incompatible query, if desired.
                if (this.config.insertTodosForSkippedFields) {
                    replacements.push(...migrate_ts_type_references.insertTodoForIncompatibility(node, info, incompatibility, {
                        single: 'query',
                        plural: 'queries',
                    }));
                }
                updateFileState(filesWithIncompleteMigration, sf, extractedQuery.kind);
                continue;
            }
            replacements.push(...computeReplacementsToMigrateQuery(node, extractedQuery, importManager, info, printer, info.userOptions, checker$1));
        }
        // Migrate references.
        const referenceMigrationHost = {
            printer,
            replacements,
            shouldMigrateReferencesToField: (field) => !knownQueries.isFieldIncompatible(field),
            shouldMigrateReferencesToClass: (clazz) => !!knownQueries
                .getQueryFieldsOfClass(clazz)
                ?.some((q) => !knownQueries.isFieldIncompatible(q)),
        };
        migrate_ts_type_references.migrateTypeScriptReferences(referenceMigrationHost, referenceResult.references, checker$1, info);
        migrateTemplateReferences(referenceMigrationHost, referenceResult.references);
        migrateHostBindings(referenceMigrationHost, referenceResult.references, info);
        migrate_ts_type_references.migrateTypeScriptTypeReferences(referenceMigrationHost, referenceResult.references, importManager, info);
        // Fix problematic calls, like `QueryList#toArray`, or `QueryList#get`.
        for (const ref of referenceResult.references) {
            removeQueryListToArrayCall(ref, info, globalMetadata, knownQueries, replacements);
            replaceQueryListGetCall(ref, info, globalMetadata, knownQueries, replacements);
            replaceQueryListFirstAndLastReferences(ref, info, globalMetadata, knownQueries, replacements);
        }
        // Remove imports if possible.
        for (const [file, types] of filesWithSourceQueries) {
            let seenIncompatibleMultiQuery = false;
            for (const type of types) {
                const incompatibleQueryTypesForFile = filesWithIncompleteMigration.get(file);
                // Query type is fully migrated. No incompatible queries in file.
                if (!incompatibleQueryTypesForFile?.has(type)) {
                    importManager.removeImport(file, queryFunctionNameToDecorator(type), '@angular/core');
                }
                else if (type === 'viewChildren' || type === 'contentChildren') {
                    seenIncompatibleMultiQuery = true;
                }
            }
            if (!seenIncompatibleMultiQuery && !filesWithQueryListOutsideOfDeclarations.has(file)) {
                importManager.removeImport(file, 'QueryList', '@angular/core');
            }
        }
        apply_import_manager.applyImportManagerChanges(importManager, replacements, sourceFiles, info);
        return { replacements, knownQueries };
    }
    async stats(globalMetadata) {
        let queriesCount = 0;
        let multiQueries = 0;
        let incompatibleQueries = 0;
        const fieldIncompatibleCounts = {};
        const classIncompatibleCounts = {};
        for (const query of Object.values(globalMetadata.knownQueryFields)) {
            queriesCount++;
            if (query.isMulti) {
                multiQueries++;
            }
        }
        for (const [id, info] of Object.entries(globalMetadata.problematicQueries)) {
            if (globalMetadata.knownQueryFields[id] === undefined) {
                continue;
            }
            // Do not count queries that were forcibly ignored via best effort mode.
            if (this.config.bestEffortMode &&
                (info.fieldReason === null ||
                    !migrate_ts_type_references.nonIgnorableFieldIncompatibilities.includes(info.fieldReason))) {
                continue;
            }
            incompatibleQueries++;
            if (info.classReason !== null) {
                const reasonName = migrate_ts_type_references.ClassIncompatibilityReason[info.classReason];
                const key = `incompat-class-${reasonName}`;
                classIncompatibleCounts[key] ??= 0;
                classIncompatibleCounts[key]++;
            }
            if (info.fieldReason !== null) {
                const reasonName = migrate_ts_type_references.FieldIncompatibilityReason[info.fieldReason];
                const key = `incompat-field-${reasonName}`;
                fieldIncompatibleCounts[key] ??= 0;
                fieldIncompatibleCounts[key]++;
            }
        }
        return {
            counters: {
                queriesCount,
                multiQueries,
                incompatibleQueries,
                ...fieldIncompatibleCounts,
                ...classIncompatibleCounts,
            },
        };
    }
}
/**
 * Updates the given map to capture the given query type.
 * The map may track migrated queries in a file, or query types
 * that couldn't be migrated.
 */
function updateFileState(stateMap, node, queryType) {
    const file = node.getSourceFile();
    if (!stateMap.has(file)) {
        stateMap.set(file, new Set());
    }
    stateMap.get(file).add(queryType);
}

function migrate(options) {
    return async (tree, context) => {
        await project_paths.runMigrationInDevkit({
            tree,
            getMigration: (fs) => new SignalQueriesMigration({
                bestEffortMode: options.bestEffortMode,
                insertTodosForSkippedFields: options.insertTodos,
                shouldMigrateQuery: (_query, file) => {
                    return (file.rootRelativePath.startsWith(fs.normalize(options.path)) &&
                        !/(^|\/)node_modules\//.test(file.rootRelativePath));
                },
            }),
            beforeProgramCreation: (tsconfigPath, stage) => {
                if (stage === project_paths.MigrationStage.Analysis) {
                    context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
                }
                else {
                    context.logger.info(`Running migration for: ${tsconfigPath}...`);
                }
            },
            afterProgramCreation: (info, fs) => {
                const analysisPath = fs.resolve(options.analysisDir);
                // Support restricting the analysis to subfolders for larger projects.
                if (analysisPath !== '/') {
                    info.sourceFiles = info.sourceFiles.filter((sf) => sf.fileName.startsWith(analysisPath));
                    info.fullProgramSourceFiles = info.fullProgramSourceFiles.filter((sf) => sf.fileName.startsWith(analysisPath));
                }
            },
            beforeUnitAnalysis: (tsconfigPath) => {
                context.logger.info(`Scanning for queries: ${tsconfigPath}...`);
            },
            afterAnalysisFailure: () => {
                context.logger.error('Migration failed unexpectedly with no analysis data');
            },
            afterAllAnalyzed: () => {
                context.logger.info(``);
                context.logger.info(`Processing analysis data between targets...`);
                context.logger.info(``);
            },
            whenDone: ({ counters }) => {
                context.logger.info('');
                context.logger.info(`Successfully migrated to signal queries 🎉`);
                const { queriesCount, incompatibleQueries } = counters;
                const migratedQueries = queriesCount - incompatibleQueries;
                context.logger.info('');
                context.logger.info(`Successfully migrated to signal queries 🎉`);
                context.logger.info(`  -> Migrated ${migratedQueries}/${queriesCount} queries.`);
                if (incompatibleQueries > 0 && !options.insertTodos) {
                    context.logger.warn(`To see why ${incompatibleQueries} queries couldn't be migrated`);
                    context.logger.warn(`consider re-running with "--insert-todos" or "--best-effort-mode".`);
                }
                if (options.bestEffortMode) {
                    context.logger.warn(`You ran with best effort mode. Manually verify all code ` +
                        `works as intended, and fix where necessary.`);
                }
            },
        });
    };
}

exports.migrate = migrate;
H@wx|'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var schematics = require('@angular-devkit/schematics');
var signalQueriesMigration = require('./signal-queries-migration.cjs');
var signalInputMigration = require('./signal-input-migration.cjs');
var outputMigration = require('./output-migration.cjs');
require('./checker-BwV9MjSQ.cjs');
require('typescript');
require('os');
require('fs');
require('module');
require('path');
require('url');
require('./index-BnJH1Hc7.cjs');
require('./project_paths-DY3SIODd.cjs');
require('@angular-devkit/core');
require('node:path/posix');
require('./project_tsconfig_paths-CDVxT6Ov.cjs');
require('./apply_import_manager-DF0BUe6N.cjs');
require('./migrate_ts_type_references-DQe6JtwN.cjs');
require('assert');
require('./index-B6p5mHIY.cjs');
require('./leading_space-D9nQ8UQC.cjs');

function migrate(options) {
    // The migrations are independent so we can run them in any order, but we sort them here
    // alphabetically so we get a consistent execution order in case of issue reports.
    const migrations = options.migrations.slice().sort();
    const rules = [];
    for (const migration of migrations) {
        switch (migration) {
            case "inputs" /* SupportedMigrations.inputs */:
                rules.push(signalInputMigration.migrate(options));
                break;
            case "outputs" /* SupportedMigrations.outputs */:
                rules.push(outputMigration.migrate(options));
                break;
            case "queries" /* SupportedMigrations.queries */:
                rules.push(signalQueriesMigration.migrate(options));
                break;
            default:
                throw new schematics.SchematicsException(`Unsupported migration "${migration}"`);
        }
    }
    return schematics.chain(rules);
}

exports.migrate = migrate;
|l0x   'use strict';
/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
'use strict';

var schematics = require('@angular-devkit/schematics');
var index = require('./index-BnJH1Hc7.cjs');
var fs = require('fs');
var p = require('path');
var ts = require('typescript');
var compiler_host = require('./compiler_host-C55Cczah.cjs');
var project_tsconfig_paths = require('./project_tsconfig_paths-CDVxT6Ov.cjs');
var ng_decorators = require('./ng_decorators-B5HCqr20.cjs');
var nodes = require('./nodes-B16H9JUd.cjs');
var imports = require('./imports-CIX-JgAN.cjs');
var checker = require('./checker-BwV9MjSQ.cjs');
require('os');
require('@angular-devkit/core');
require('module');
require('url');

function createProgram({ rootNames, options, host, oldProgram, }) {
    return new index.NgtscProgram(rootNames, options, host, oldProgram);
}

/** Checks whether a node is referring to a specific import specifier. */
function isReferenceToImport(typeChecker, node, importSpecifier) {
    // If this function is called on an identifier (should be most cases), we can quickly rule out
    // non-matches by comparing the identifier's string and the local name of the import specifier
    // which saves us some calls to the type checker.
    if (ts.isIdentifier(node) && node.text !== importSpecifier.name.text) {
        return false;
    }
    const nodeSymbol = typeChecker.getTypeAtLocation(node).getSymbol();
    const importSymbol = typeChecker.getTypeAtLocation(importSpecifier).getSymbol();
    return (!!(nodeSymbol?.declarations?.[0] && importSymbol?.declarations?.[0]) &&
        nodeSymbol.declarations[0] === importSymbol.declarations[0]);
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/** Utility class used to track a one-to-many relationship where all the items are unique. */
class UniqueItemTracker {
    _nodes = new Map();
    track(key, item) {
        const set = this._nodes.get(key);
        if (set) {
            set.add(item);
        }
        else {
            this._nodes.set(key, new Set([item]));
        }
    }
    get(key) {
        return this._nodes.get(key);
    }
    getEntries() {
        return this._nodes.entries();
    }
    isEmpty() {
        return this._nodes.size === 0;
    }
}
/** Resolves references to nodes. */
class ReferenceResolver {
    _program;
    _host;
    _rootFileNames;
    _basePath;
    _excludedFiles;
    _languageService;
    /**
     * If set, allows the language service to *only* read a specific file.
     * Used to speed up single-file lookups.
     */
    _tempOnlyFile = null;
    constructor(_program, _host, _rootFileNames, _basePath, _excludedFiles) {
        this._program = _program;
        this._host = _host;
        this._rootFileNames = _rootFileNames;
        this._basePath = _basePath;
        this._excludedFiles = _excludedFiles;
    }
    /** Finds all references to a node within the entire project. */
    findReferencesInProject(node) {
        const languageService = this._getLanguageService();
        const fileName = node.getSourceFile().fileName;
        const start = node.getStart();
        let referencedSymbols;
        // The language service can throw if it fails to read a file.
        // Silently continue since we're making the lookup on a best effort basis.
        try {
            referencedSymbols = languageService.findReferences(fileName, start) || [];
        }
        catch (e) {
            console.error('Failed reference lookup for node ' + node.getText(), e.message);
            referencedSymbols = [];
        }
        const results = new Map();
        for (const symbol of referencedSymbols) {
            for (const ref of symbol.references) {
                if (!ref.isDefinition || symbol.definition.kind === ts.ScriptElementKind.alias) {
                    if (!results.has(ref.fileName)) {
                        results.set(ref.fileName, []);
                    }
                    results
                        .get(ref.fileName)
                        .push([ref.textSpan.start, ref.textSpan.start + ref.textSpan.length]);
                }
            }
        }
        return results;
    }
    /** Finds all references to a node within a single file. */
    findSameFileReferences(node, fileName) {
        // Even though we're only passing in a single file into `getDocumentHighlights`, the language
        // service ends up traversing the entire project. Prevent it from reading any files aside from
        // the one we're interested in by intercepting it at the compiler host level.
        // This is an order of magnitude faster on a large project.
        this._tempOnlyFile = fileName;
        const nodeStart = node.getStart();
        const results = [];
        let highlights;
        // The language service can throw if it fails to read a file.
        // Silently continue since we're making the lookup on a best effort basis.
        try {
            highlights = this._getLanguageService().getDocumentHighlights(fileName, nodeStart, [
                fileName,
            ]);
        }
        catch (e) {
            console.error('Failed reference lookup for node ' + node.getText(), e.message);
        }
        if (highlights) {
            for (const file of highlights) {
                // We are pretty much guaranteed to only have one match from the current file since it is
                // the only one being passed in `getDocumentHighlight`, but we check here just in case.
                if (file.fileName === fileName) {
                    for (const { textSpan: { start, length }, kind, } of file.highlightSpans) {
                        if (kind !== ts.HighlightSpanKind.none) {
                            results.push([start, start + length]);
                        }
                    }
                }
            }
        }
        // Restore full project access to the language service.
        this._tempOnlyFile = null;
        return results;
    }
    /** Used by the language service  */
    _readFile(path) {
        if ((this._tempOnlyFile !== null && path !== this._tempOnlyFile) ||
            this._excludedFiles?.test(path)) {
            return '';
        }
        return this._host.readFile(path);
    }
    /** Gets a language service that can be used to perform lookups. */
    _getLanguageService() {
        if (!this._languageService) {
            const rootFileNames = this._rootFileNames.slice();
            this._program
                .getTsProgram()
                .getSourceFiles()
                .forEach(({ fileName }) => {
                if (!this._excludedFiles?.test(fileName) && !rootFileNames.includes(fileName)) {
                    rootFileNames.push(fileName);
                }
            });
            this._languageService = ts.createLanguageService({
                getCompilationSettings: () => this._program.getTsProgram().getCompilerOptions(),
                getScriptFileNames: () => rootFileNames,
                // The files won't change so we can return the same version.
                getScriptVersion: () => '0',
                getScriptSnapshot: (path) => {
                    const content = this._readFile(path);
                    return content ? ts.ScriptSnapshot.fromString(content) : undefined;
                },
                getCurrentDirectory: () => this._basePath,
                getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options),
                readFile: (path) => this._readFile(path),
                fileExists: (path) => this._host.fileExists(path),
            }, ts.createDocumentRegistry(), ts.LanguageServiceMode.PartialSemantic);
        }
        return this._languageService;
    }
}
/** Creates a NodeLookup object from a source file. */
function getNodeLookup(sourceFile) {
    const lookup = new Map();
    sourceFile.forEachChild(function walk(node) {
        const nodesAtStart = lookup.get(node.getStart());
        if (nodesAtStart) {
            nodesAtStart.push(node);
        }
        else {
            lookup.set(node.getStart(), [node]);
        }
        node.forEachChild(walk);
    });
    return lookup;
}
/**
 * Converts node offsets to the nodes they correspond to.
 * @param lookup Data structure used to look up nodes at particular positions.
 * @param offsets Offsets of the nodes.
 * @param results Set in which to store the results.
 */
function offsetsToNodes(lookup, offsets, results) {
    for (const [start, end] of offsets) {
        const match = lookup.get(start)?.find((node) => node.getEnd() === end);
        if (match) {
            results.add(match);
        }
    }
    return results;
}
/**
 * Finds the class declaration that is being referred to by a node.
 * @param reference Node referring to a class declaration.
 * @param typeChecker
 */
function findClassDeclaration(reference, typeChecker) {
    return (typeChecker
        .getTypeAtLocation(reference)
        .getSymbol()
        ?.declarations?.find(ts.isClassDeclaration) || null);
}
/** Finds a property with a specific name in an object literal expression. */
function findLiteralProperty(literal, name) {
    return literal.properties.find((prop) => prop.name && ts.isIdentifier(prop.name) && prop.name.text === name);
}
/** Gets a relative path between two files that can be used inside a TypeScript import. */
function getRelativeImportPath(fromFile, toFile) {
    let path = p.relative(p.dirname(fromFile), toFile).replace(/\.ts$/, '');
    // `relative` returns paths inside the same directory without `./`
    if (!path.startsWith('.')) {
        path = './' + path;
    }
    // Using the Node utilities can yield paths with forward slashes on Windows.
    return compiler_host.normalizePath(path);
}
/** Function used to remap the generated `imports` for a component to known shorter aliases. */
function knownInternalAliasRemapper(imports) {
    return imports.map((current) => current.moduleSpecifier === '@angular/common' && current.symbolName === 'NgForOf'
        ? { ...current, symbolName: 'NgFor' }
        : current);
}
/**
 * Gets the closest node that matches a predicate, including the node that the search started from.
 * @param node Node from which to start the search.
 * @param predicate Predicate that the result needs to pass.
 */
function closestOrSelf(node, predicate) {
    return predicate(node) ? node : nodes.closestNode(node, predicate);
}
/**
 * Checks whether a node is referring to a specific class declaration.
 * @param node Node that is being checked.
 * @param className Name of the class that the node might be referring to.
 * @param moduleName Name of the Angular module that should contain the class.
 * @param typeChecker
 */
function isClassReferenceInAngularModule(node, className, moduleName, typeChecker) {
    const symbol = typeChecker.getTypeAtLocation(node).getSymbol();
    const externalName = `@angular/${moduleName}`;
    const internalName = `angular2/rc/packages/${moduleName}`;
    return !!symbol?.declarations?.some((decl) => {
        const closestClass = closestOrSelf(decl, ts.isClassDeclaration);
        const closestClassFileName = closestClass?.getSourceFile().fileName;
        if (!closestClass ||
            !closestClassFileName ||
            !closestClass.name ||
            !ts.isIdentifier(closestClass.name) ||
            (!closestClassFileName.includes(externalName) && !closestClassFileName.includes(internalName))) {
            return false;
        }
        return typeof className === 'string'
            ? closestClass.name.text === className
            : className.test(closestClass.name.text);
    });
}
/**
 * Finds the imports of testing libraries in a file.
 */
function getTestingImports(sourceFile) {
    return {
        testBed: imports.getImportSpecifier(sourceFile, '@angular/core/testing', 'TestBed'),
        catalyst: imports.getImportSpecifier(sourceFile, /testing\/catalyst(\/(fake_)?async)?$/, 'setupModule'),
    };
}
/**
 * Determines if a node is a call to a testing API.
 * @param typeChecker Type checker to use when resolving references.
 * @param node Node to check.
 * @param testBedImport Import of TestBed within the file.
 * @param catalystImport Import of Catalyst within the file.
 */
function isTestCall(typeChecker, node, testBedImport, catalystImport) {
    const isObjectLiteralCall = ts.isCallExpression(node) &&
        node.arguments.length > 0 &&
        // `arguments[0]` is the testing module config.
        ts.isObjectLiteralExpression(node.arguments[0]);
    const isTestBedCall = isObjectLiteralCall &&
        testBedImport &&
        ts.isPropertyAccessExpression(node.expression) &&
        node.expression.name.text === 'configureTestingModule' &&
        isReferenceToImport(typeChecker, node.expression.expression, testBedImport);
    const isCatalystCall = isObjectLiteralCall &&
        catalystImport &&
        ts.isIdentifier(node.expression) &&
        isReferenceToImport(typeChecker, node.expression, catalystImport);
    return !!(isTestBedCall || isCatalystCall);
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Converts all declarations in the specified files to standalone.
 * @param sourceFiles Files that should be migrated.
 * @param program
 * @param printer
 * @param fileImportRemapper Optional function that can be used to remap file-level imports.
 * @param declarationImportRemapper Optional function that can be used to remap declaration-level
 * imports.
 */
function toStandalone(sourceFiles, program, printer, fileImportRemapper, declarationImportRemapper) {
    const templateTypeChecker = program.compiler.getTemplateTypeChecker();
    const typeChecker = program.getTsProgram().getTypeChecker();
    const modulesToMigrate = new Set();
    const testObjectsToMigrate = new Set();
    const declarations = new Set();
    const tracker = new compiler_host.ChangeTracker(printer, fileImportRemapper);
    for (const sourceFile of sourceFiles) {
        const modules = findNgModuleClassesToMigrate(sourceFile, typeChecker);
        const testObjects = findTestObjectsToMigrate(sourceFile, typeChecker);
        for (const module of modules) {
            const allModuleDeclarations = extractDeclarationsFromModule(module, templateTypeChecker);
            const unbootstrappedDeclarations = filterNonBootstrappedDeclarations(allModuleDeclarations, module, templateTypeChecker, typeChecker);
            if (unbootstrappedDeclarations.length > 0) {
                modulesToMigrate.add(module);
                unbootstrappedDeclarations.forEach((decl) => declarations.add(decl));
            }
        }
        testObjects.forEach((obj) => testObjectsToMigrate.add(obj));
    }
    for (const declaration of declarations) {
        convertNgModuleDeclarationToStandalone(declaration, declarations, tracker, templateTypeChecker, declarationImportRemapper);
    }
    for (const node of modulesToMigrate) {
        migrateNgModuleClass(node, declarations, tracker, typeChecker, templateTypeChecker);
    }
    migrateTestDeclarations(testObjectsToMigrate, declarations, tracker, templateTypeChecker, typeChecker);
    return tracker.recordChanges();
}
/**
 * Converts a single declaration defined through an NgModule to standalone.
 * @param decl Declaration being converted.
 * @param tracker Tracker used to track the file changes.
 * @param allDeclarations All the declarations that are being converted as a part of this migration.
 * @param typeChecker
 * @param importRemapper
 */
function convertNgModuleDeclarationToStandalone(decl, allDeclarations, tracker, typeChecker, importRemapper) {
    const directiveMeta = typeChecker.getDirectiveMetadata(decl);
    if (directiveMeta && directiveMeta.decorator && !directiveMeta.isStandalone) {
        let decorator = markDecoratorAsStandalone(directiveMeta.decorator);
        if (directiveMeta.isComponent) {
            const importsToAdd = getComponentImportExpressions(decl, allDeclarations, tracker, typeChecker, importRemapper);
            if (importsToAdd.length > 0) {
                const hasTrailingComma = importsToAdd.length > 2 &&
                    !!extractMetadataLiteral(directiveMeta.decorator)?.properties.hasTrailingComma;
                decorator = setPropertyOnAngularDecorator(decorator, 'imports', ts.factory.createArrayLiteralExpression(
                // Create a multi-line array when it has a trailing comma.
                ts.factory.createNodeArray(importsToAdd, hasTrailingComma), hasTrailingComma));
            }
        }
        tracker.replaceNode(directiveMeta.decorator, decorator);
    }
    else {
        const pipeMeta = typeChecker.getPipeMetadata(decl);
        if (pipeMeta && pipeMeta.decorator && !pipeMeta.isStandalone) {
            tracker.replaceNode(pipeMeta.decorator, markDecoratorAsStandalone(pipeMeta.decorator));
        }
    }
}
/**
 * Gets the expressions that should be added to a component's
 * `imports` array based on its template dependencies.
 * @param decl Component class declaration.
 * @param allDeclarations All the declarations that are being converted as a part of this migration.
 * @param tracker
 * @param typeChecker
 * @param importRemapper
 */
function getComponentImportExpressions(decl, allDeclarations, tracker, typeChecker, importRemapper) {
    const templateDependencies = findTemplateDependencies(decl, typeChecker);
    const usedDependenciesInMigration = new Set(templateDependencies.filter((dep) => allDeclarations.has(dep.node)));
    const seenImports = new Set();
    const resolvedDependencies = [];
    for (const dep of templateDependencies) {
        const importLocation = findImportLocation(dep, decl, usedDependenciesInMigration.has(dep)
            ? checker.PotentialImportMode.ForceDirect
            : checker.PotentialImportMode.Normal, typeChecker);
        if (importLocation && !seenImports.has(importLocation.symbolName)) {
            seenImports.add(importLocation.symbolName);
            resolvedDependencies.push(importLocation);
        }
    }
    return potentialImportsToExpressions(resolvedDependencies, decl.getSourceFile(), tracker, importRemapper);
}
/**
 * Converts an array of potential imports to an array of expressions that can be
 * added to the `imports` array.
 * @param potentialImports Imports to be converted.
 * @param component Component class to which the imports will be added.
 * @param tracker
 * @param importRemapper
 */
function potentialImportsToExpressions(potentialImports, toFile, tracker, importRemapper) {
    const processedDependencies = importRemapper
        ? importRemapper(potentialImports)
        : potentialImports;
    return processedDependencies.map((importLocation) => {
        if (importLocation.moduleSpecifier) {
            return tracker.addImport(toFile, importLocation.symbolName, importLocation.moduleSpecifier);
        }
        const identifier = ts.factory.createIdentifier(importLocation.symbolName);
        if (!importLocation.isForwardReference) {
            return identifier;
        }
        const forwardRefExpression = tracker.addImport(toFile, 'forwardRef', '@angular/core');
        const arrowFunction = ts.factory.createArrowFunction(undefined, undefined, [], undefined, undefined, identifier);
        return ts.factory.createCallExpression(forwardRefExpression, undefined, [arrowFunction]);
    });
}
/**
 * Moves all of the declarations of a class decorated with `@NgModule` to its imports.
 * @param node Class being migrated.
 * @param allDeclarations All the declarations that are being converted as a part of this migration.
 * @param tracker
 * @param typeChecker
 * @param templateTypeChecker
 */
function migrateNgModuleClass(node, allDeclarations, tracker, typeChecker, templateTypeChecker) {
    const decorator = templateTypeChecker.getNgModuleMetadata(node)?.decorator;
    const metadata = decorator ? extractMetadataLiteral(decorator) : null;
    if (metadata) {
        moveDeclarationsToImports(metadata, allDeclarations, typeChecker, templateTypeChecker, tracker);
    }
}
/**
 * Moves all the symbol references from the `declarations` array to the `imports`
 * array of an `NgModule` class and removes the `declarations`.
 * @param literal Object literal used to configure the module that should be migrated.
 * @param allDeclarations All the declarations that are being converted as a part of this migration.
 * @param typeChecker
 * @param tracker
 */
function moveDeclarationsToImports(literal, allDeclarations, typeChecker, templateTypeChecker, tracker) {
    const declarationsProp = findLiteralProperty(literal, 'declarations');
    if (!declarationsProp) {
        return;
    }
    const declarationsToPreserve = [];
    const declarationsToCopy = [];
    const properties = [];
    const importsProp = findLiteralProperty(literal, 'imports');
    const hasAnyArrayTrailingComma = literal.properties.some((prop) => ts.isPropertyAssignment(prop) &&
        ts.isArrayLiteralExpression(prop.initializer) &&
        prop.initializer.elements.hasTrailingComma);
    // Separate the declarations that we want to keep and ones we need to copy into the `imports`.
    if (ts.isPropertyAssignment(declarationsProp)) {
        // If the declarations are an array, we can analyze it to
        // find any classes from the current migration.
        if (ts.isArrayLiteralExpression(declarationsProp.initializer)) {
            for (const el of declarationsProp.initializer.elements) {
                if (ts.isIdentifier(el)) {
                    const correspondingClass = findClassDeclaration(el, typeChecker);
                    if (!correspondingClass ||
                        // Check whether the declaration is either standalone already or is being converted
                        // in this migration. We need to check if it's standalone already, in order to correct
                        // some cases where the main app and the test files are being migrated in separate
                        // programs.
                        isStandaloneDeclaration(correspondingClass, allDeclarations, templateTypeChecker)) {
                        declarationsToCopy.push(el);
                    }
                    else {
                        declarationsToPreserve.push(el);
                    }
                }
                else {
                    declarationsToCopy.push(el);
                }
            }
        }
        else {
            // Otherwise create a spread that will be copied into the `imports`.
            declarationsToCopy.push(ts.factory.createSpreadElement(declarationsProp.initializer));
        }
    }
    // If there are no `imports`, create them with the declarations we want to copy.
    if (!importsProp && declarationsToCopy.length > 0) {
        properties.push(ts.factory.createPropertyAssignment('imports', ts.factory.createArrayLiteralExpression(ts.factory.createNodeArray(declarationsToCopy, hasAnyArrayTrailingComma && declarationsToCopy.length > 2))));
    }
    for (const prop of literal.properties) {
        if (!isNamedPropertyAssignment(prop)) {
            properties.push(prop);
            continue;
        }
        // If we have declarations to preserve, update the existing property, otherwise drop it.
        if (prop === declarationsProp) {
            if (declarationsToPreserve.length > 0) {
                const hasTrailingComma = ts.isArrayLiteralExpression(prop.initializer)
                    ? prop.initializer.elements.hasTrailingComma
                    : hasAnyArrayTrailingComma;
                properties.push(ts.factory.updatePropertyAssignment(prop, prop.name, ts.factory.createArrayLiteralExpression(ts.factory.createNodeArray(declarationsToPreserve, hasTrailingComma && declarationsToPreserve.length > 2))));
            }
            continue;
        }
        // If we have an `imports` array and declarations
        // that should be copied, we merge the two arrays.
        if (prop === importsProp && declarationsToCopy.length > 0) {
            let initializer;
            if (ts.isArrayLiteralExpression(prop.initializer)) {
                initializer = ts.factory.updateArrayLiteralExpression(prop.initializer, ts.factory.createNodeArray([...prop.initializer.elements, ...declarationsToCopy], prop.initializer.elements.hasTrailingComma));
            }
            else {
                initializer = ts.factory.createArrayLiteralExpression(ts.factory.createNodeArray([ts.factory.createSpreadElement(prop.initializer), ...declarationsToCopy], 
                // Expect the declarations to be greater than 1 since
                // we have the pre-existing initializer already.
                hasAnyArrayTrailingComma && declarationsToCopy.length > 1));
            }
            properties.push(ts.factory.updatePropertyAssignment(prop, prop.name, initializer));
            continue;
        }
        // Retain any remaining properties.
        properties.push(prop);
    }
    tracker.replaceNode(literal, ts.factory.updateObjectLiteralExpression(literal, ts.factory.createNodeArray(properties, literal.properties.hasTrailingComma)), ts.EmitHint.Expression);
}
/** Sets a decorator node to be standalone. */
function markDecoratorAsStandalone(node) {
    const metadata = extractMetadataLiteral(node);
    if (metadata === null || !ts.isCallExpression(node.expression)) {
        return node;
    }
    const standaloneProp = metadata.properties.find((prop) => {
        return isNamedPropertyAssignment(prop) && prop.name.text === 'standalone';
    });
    // In v19 standalone is the default so don't do anything if there's no `standalone`
    // property or it's initialized to anything other than `false`.
    if (!standaloneProp || standaloneProp.initializer.kind !== ts.SyntaxKind.FalseKeyword) {
        return node;
    }
    const newProperties = metadata.properties.filter((element) => element !== standaloneProp);
    // Use `createDecorator` instead of `updateDecorator`, because
    // the latter ends up duplicating the node's leading comment.
    return ts.factory.createDecorator(ts.factory.createCallExpression(node.expression.expression, node.expression.typeArguments, [
        ts.factory.createObjectLiteralExpression(ts.factory.createNodeArray(newProperties, metadata.properties.hasTrailingComma), newProperties.length > 1),
    ]));
}
/**
 * Sets a property on an Angular decorator node. If the property
 * already exists, its initializer will be replaced.
 * @param node Decorator to which to add the property.
 * @param name Name of the property to be added.
 * @param initializer Initializer for the new property.
 */
function setPropertyOnAngularDecorator(node, name, initializer) {
    // Invalid decorator.
    if (!ts.isCallExpression(node.expression) || node.expression.arguments.length > 1) {
        return node;
    }
    let literalProperties;
    let hasTrailingComma = false;
    if (node.expression.arguments.length === 0) {
        literalProperties = [ts.factory.createPropertyAssignment(name, initializer)];
    }
    else if (ts.isObjectLiteralExpression(node.expression.arguments[0])) {
        const literal = node.expression.arguments[0];
        const existingProperty = findLiteralProperty(literal, name);
        hasTrailingComma = literal.properties.hasTrailingComma;
        if (existingProperty && ts.isPropertyAssignment(existingProperty)) {
            literalProperties = literal.properties.slice();
            literalProperties[literalProperties.indexOf(existingProperty)] =
                ts.factory.updatePropertyAssignment(existingProperty, existingProperty.name, initializer);
        }
        else {
            literalProperties = [
                ...literal.properties,
                ts.factory.createPropertyAssignment(name, initializer),
            ];
        }
    }
    else {
        // Unsupported case (e.g. `@Component(SOME_CONST)`). Return the original node.
        return node;
    }
    // Use `createDecorator` instead of `updateDecorator`, because
    // the latter ends up duplicating the node's leading comment.
    return ts.factory.createDecorator(ts.factory.createCallExpression(node.expression.expression, node.expression.typeArguments, [
        ts.factory.createObjectLiteralExpression(ts.factory.createNodeArray(literalProperties, hasTrailingComma), literalProperties.length > 1),
    ]));
}
/** Checks if a node is a `PropertyAssignment` with a name. */
function isNamedPropertyAssignment(node) {
    return ts.isPropertyAssignment(node) && node.name && ts.isIdentifier(node.name);
}
/**
 * Finds the import from which to bring in a template dependency of a component.
 * @param target Dependency that we're searching for.
 * @param inContext Component in which the dependency is used.
 * @param importMode Mode in which to resolve the import target.
 * @param typeChecker
 */
function findImportLocation(target, inContext, importMode, typeChecker) {
    const importLocations = typeChecker.getPotentialImportsFor(target, inContext, importMode);
    let firstSameFileImport = null;
    let firstModuleImport = null;
    for (const location of importLocations) {
        // Prefer a standalone import, if we can find one.
        // Otherwise fall back to the first module-based import.
        if (location.kind === checker.PotentialImportKind.Standalone) {
            return location;
        }
        if (!location.moduleSpecifier && !firstSameFileImport) {
            firstSameFileImport = location;
        }
        if (location.kind === checker.PotentialImportKind.NgModule &&
            !firstModuleImport &&
            // ɵ is used for some internal Angular modules that we want to skip over.
            !location.symbolName.startsWith('ɵ')) {
            firstModuleImport = location;
        }
    }
    return firstSameFileImport || firstModuleImport || importLocations[0] || null;
}
/**
 * Checks whether a node is an `NgModule` metadata element with at least one element.
 * E.g. `declarations: [Foo]` or `declarations: SOME_VAR` would match this description,
 * but not `declarations: []`.
 */
function hasNgModuleMetadataElements(node) {
    return (ts.isPropertyAssignment(node) &&
        (!ts.isArrayLiteralExpression(node.initializer) || node.initializer.elements.length > 0));
}
/** Finds all modules whose declarations can be migrated. */
function findNgModuleClassesToMigrate(sourceFile, typeChecker) {
    const modules = [];
    if (imports.getImportSpecifier(sourceFile, '@angular/core', 'NgModule')) {
        sourceFile.forEachChild(function walk(node) {
            if (ts.isClassDeclaration(node)) {
                const decorator = ng_decorators.getAngularDecorators(typeChecker, ts.getDecorators(node) || []).find((current) => current.name === 'NgModule');
                const metadata = decorator ? extractMetadataLiteral(decorator.node) : null;
                if (metadata) {
                    const declarations = findLiteralProperty(metadata, 'declarations');
                    if (declarations != null && hasNgModuleMetadataElements(declarations)) {
                        modules.push(node);
                    }
                }
            }
            node.forEachChild(walk);
        });
    }
    return modules;
}
/** Finds all testing object literals that need to be migrated. */
function findTestObjectsToMigrate(sourceFile, typeChecker) {
    const testObjects = [];
    const { testBed, catalyst } = getTestingImports(sourceFile);
    if (testBed || catalyst) {
        sourceFile.forEachChild(function walk(node) {
            if (isTestCall(typeChecker, node, testBed, catalyst)) {
                const config = node.arguments[0];
                const declarations = findLiteralProperty(config, 'declarations');
                if (declarations &&
                    ts.isPropertyAssignment(declarations) &&
                    ts.isArrayLiteralExpression(declarations.initializer) &&
                    declarations.initializer.elements.length > 0) {
                    testObjects.push(config);
                }
            }
            node.forEachChild(walk);
        });
    }
    return testObjects;
}
/**
 * Finds the classes corresponding to dependencies used in a component's template.
 * @param decl Component in whose template we're looking for dependencies.
 * @param typeChecker
 */
function findTemplateDependencies(decl, typeChecker) {
    const results = [];
    const usedDirectives = typeChecker.getUsedDirectives(decl);
    const usedPipes = typeChecker.getUsedPipes(decl);
    if (usedDirectives !== null) {
        for (const dir of usedDirectives) {
            if (ts.isClassDeclaration(dir.ref.node)) {
                results.push(dir.ref);
            }
        }
    }
    if (usedPipes !== null) {
        const potentialPipes = typeChecker.getPotentialPipes(decl);
        for (const pipe of potentialPipes) {
            if (ts.isClassDeclaration(pipe.ref.node) &&
                usedPipes.some((current) => pipe.name === current)) {
                results.push(pipe.ref);
            }
        }
    }
    return results;
}
/**
 * Removes any declarations that are a part of a module's `bootstrap`
 * array from an array of declarations.
 * @param declarations Anaalyzed declarations of the module.
 * @param ngModule Module whote declarations are being filtered.
 * @param templateTypeChecker
 * @param typeChecker
 */
function filterNonBootstrappedDeclarations(declarations, ngModule, templateTypeChecker, typeChecker) {
    const metadata = templateTypeChecker.getNgModuleMetadata(ngModule);
    const metaLiteral = metadata && metadata.decorator ? extractMetadataLiteral(metadata.decorator) : null;
    const bootstrapProp = metaLiteral ? findLiteralProperty(metaLiteral, 'bootstrap') : null;
    // If there's no `bootstrap`, we can't filter.
    if (!bootstrapProp) {
        return declarations;
    }
    // If we can't analyze the `bootstrap` property, we can't safely determine which
    // declarations aren't bootstrapped so we assume that all of them are.
    if (!ts.isPropertyAssignment(bootstrapProp) ||
        !ts.isArrayLiteralExpression(bootstrapProp.initializer)) {
        return [];
    }
    const bootstrappedClasses = new Set();
    for (const el of bootstrapProp.initializer.elements) {
        const referencedClass = ts.isIdentifier(el) ? findClassDeclaration(el, typeChecker) : null;
        // If we can resolve an element to a class, we can filter it out,
        // otherwise assume that the array isn't static.
        if (referencedClass) {
            bootstrappedClasses.add(referencedClass);
        }
        else {
            return [];
        }
    }
    return declarations.filter((ref) => !bootstrappedClasses.has(ref));
}
/**
 * Extracts all classes that are referenced in a module's `declarations` array.
 * @param ngModule Module whose declarations are being extraced.
 * @param templateTypeChecker
 */
function extractDeclarationsFromModule(ngModule, templateTypeChecker) {
    const metadata = templateTypeChecker.getNgModuleMetadata(ngModule);
    return metadata
        ? metadata.declarations
            .filter((decl) => ts.isClassDeclaration(decl.node))
            .map((decl) => decl.node)
        : [];
}
/**
 * Migrates the `declarations` from a unit test file to standalone.
 * @param testObjects Object literals used to configure the testing modules.
 * @param declarationsOutsideOfTestFiles Non-testing declarations that are part of this migration.
 * @param tracker
 * @param templateTypeChecker
 * @param typeChecker
 */
function migrateTestDeclarations(testObjects, declarationsOutsideOfTestFiles, tracker, templateTypeChecker, typeChecker) {
    const { decorators, componentImports } = analyzeTestingModules(testObjects, typeChecker);
    const allDeclarations = new Set(declarationsOutsideOfTestFiles);
    for (const decorator of decorators) {
        const closestClass = nodes.closestNode(decorator.node, ts.isClassDeclaration);
        if (decorator.name === 'Pipe' || decorator.name === 'Directive') {
            tracker.replaceNode(decorator.node, markDecoratorAsStandalone(decorator.node));
            if (closestClass) {
                allDeclarations.add(closestClass);
            }
        }
        else if (decorator.name === 'Component') {
            const newDecorator = markDecoratorAsStandalone(decorator.node);
            const importsToAdd = componentImports.get(decorator.node);
            if (closestClass) {
                allDeclarations.add(closestClass);
            }
            if (importsToAdd && importsToAdd.size > 0) {
                const hasTrailingComma = importsToAdd.size > 2 &&
                    !!extractMetadataLiteral(decorator.node)?.properties.hasTrailingComma;
                const importsArray = ts.factory.createNodeArray(Array.from(importsToAdd), hasTrailingComma);
                tracker.replaceNode(decorator.node, setPropertyOnAngularDecorator(newDecorator, 'imports', ts.factory.createArrayLiteralExpression(importsArray)));
            }
            else {
                tracker.replaceNode(decorator.node, newDecorator);
            }
        }
    }
    for (const obj of testObjects) {
        moveDeclarationsToImports(obj, allDeclarations, typeChecker, templateTypeChecker, tracker);
    }
}
/**
 * Analyzes a set of objects used to configure testing modules and returns the AST
 * nodes that need to be migrated and the imports that should be added to the imports
 * of any declared components.
 * @param testObjects Object literals that should be analyzed.
 */
function analyzeTestingModules(testObjects, typeChecker) {
    const seenDeclarations = new Set();
    const decorators = [];
    const componentImports = new Map();
    for (const obj of testObjects) {
        const declarations = extractDeclarationsFromTestObject(obj, typeChecker);
        if (declarations.length === 0) {
            continue;
        }
        const importsProp = findLiteralProperty(obj, 'imports');
        const importElements = importsProp &&
            hasNgModuleMetadataElements(importsProp) &&
            ts.isArrayLiteralExpression(importsProp.initializer)
            ? importsProp.initializer.elements.filter((el) => {
                // Filter out calls since they may be a `ModuleWithProviders`.
                return (!ts.isCallExpression(el) &&
                    // Also filter out the animations modules since they throw errors if they're imported
                    // multiple times and it's common for apps to use the `NoopAnimationsModule` to
                    // disable animations in screenshot tests.
                    !isClassReferenceInAngularModule(el, /^BrowserAnimationsModule|NoopAnimationsModule$/, 'platform-browser/animations', typeChecker));
            })
            : null;
        for (const decl of declarations) {
            if (seenDeclarations.has(decl)) {
                continue;
            }
            const [decorator] = ng_decorators.getAngularDecorators(typeChecker, ts.getDecorators(decl) || []);
            if (decorator) {
                seenDeclarations.add(decl);
                decorators.push(decorator);
                if (decorator.name === 'Component' && importElements) {
                    // We try to de-duplicate the imports being added to a component, because it may be
                    // declared in different testing modules with a different set of imports.
                    let imports = componentImports.get(decorator.node);
                    if (!imports) {
                        imports = new Set();
                        componentImports.set(decorator.node, imports);
                    }
                    importElements.forEach((imp) => imports.add(imp));
                }
            }
        }
    }
    return { decorators, componentImports };
}
/**
 * Finds the class declarations that are being referred
 * to in the `declarations` of an object literal.
 * @param obj Object literal that may contain the declarations.
 * @param typeChecker
 */
function extractDeclarationsFromTestObject(obj, typeChecker) {
    const results = [];
    const declarations = findLiteralProperty(obj, 'declarations');
    if (declarations &&
        hasNgModuleMetadataElements(declarations) &&
        ts.isArrayLiteralExpression(declarations.initializer)) {
        for (const element of declarations.initializer.elements) {
            const declaration = findClassDeclaration(element, typeChecker);
            // Note that we only migrate classes that are in the same file as the testing module,
            // because external fixture components are somewhat rare and handling them is going
            // to involve a lot of assumptions that are likely to be incorrect.
            if (declaration && declaration.getSourceFile().fileName === obj.getSourceFile().fileName) {
                results.push(declaration);
            }
        }
    }
    return results;
}
/** Extracts the metadata object literal from an Angular decorator. */
function extractMetadataLiteral(decorator) {
    // `arguments[0]` is the metadata object literal.
    return ts.isCallExpression(decorator.expression) &&
        decorator.expression.arguments.length === 1 &&
        ts.isObjectLiteralExpression(decorator.expression.arguments[0])
        ? decorator.expression.arguments[0]
        : null;
}
/**
 * Checks whether a class is a standalone declaration.
 * @param node Class being checked.
 * @param declarationsInMigration Classes that are being converted to standalone in this migration.
 * @param templateTypeChecker
 */
function isStandaloneDeclaration(node, declarationsInMigration, templateTypeChecker) {
    if (declarationsInMigration.has(node)) {
        return true;
    }
    const metadata = templateTypeChecker.getDirectiveMetadata(node) || templateTypeChecker.getPipeMetadata(node);
    return metadata != null && metadata.isStandalone;
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
function pruneNgModules(program, host, basePath, rootFileNames, sourceFiles, printer, importRemapper, referenceLookupExcludedFiles, declarationImportRemapper) {
    const filesToRemove = new Set();
    const tracker = new compiler_host.ChangeTracker(printer, importRemapper);
    const tsProgram = program.getTsProgram();
    const typeChecker = tsProgram.getTypeChecker();
    const templateTypeChecker = program.compiler.getTemplateTypeChecker();
    const referenceResolver = new ReferenceResolver(program, host, rootFileNames, basePath, referenceLookupExcludedFiles);
    const removalLocations = {
        arrays: new UniqueItemTracker(),
        imports: new UniqueItemTracker(),
        exports: new UniqueItemTracker(),
        unknown: new Set(),
    };
    const classesToRemove = new Set();
    const barrelExports = new UniqueItemTracker();
    const componentImportArrays = new UniqueItemTracker();
    const testArrays = new UniqueItemTracker();
    const nodesToRemove = new Set();
    sourceFiles.forEach(function walk(node) {
        if (ts.isClassDeclaration(node) && canRemoveClass(node, typeChecker)) {
            collectChangeLocations(node, removalLocations, componentImportArrays, testArrays, templateTypeChecker, referenceResolver, program);
            classesToRemove.add(node);
        }
        else if (ts.isExportDeclaration(node) &&
            !node.exportClause &&
            node.moduleSpecifier &&
            ts.isStringLiteralLike(node.moduleSpecifier) &&
            node.moduleSpecifier.text.startsWith('.')) {
            const exportedSourceFile = typeChecker
                .getSymbolAtLocation(node.moduleSpecifier)
                ?.valueDeclaration?.getSourceFile();
            if (exportedSourceFile) {
                barrelExports.track(exportedSourceFile, node);
            }
        }
        node.forEachChild(walk);
    });
    replaceInComponentImportsArray(componentImportArrays, classesToRemove, tracker, typeChecker, templateTypeChecker, declarationImportRemapper);
    replaceInTestImportsArray(testArrays, removalLocations, classesToRemove, tracker, typeChecker, templateTypeChecker, declarationImportRemapper);
    // We collect all the places where we need to remove references first before generating the
    // removal instructions since we may have to remove multiple references from one node.
    removeArrayReferences(removalLocations.arrays, tracker);
    removeImportReferences(removalLocations.imports, tracker);
    removeExportReferences(removalLocations.exports, tracker);
    addRemovalTodos(removalLocations.unknown, tracker);
    // Collect all the nodes to be removed before determining which files to delete since we need
    // to know it ahead of time when deleting barrel files that export other barrel files.
    (function trackNodesToRemove(nodes) {
        for (const node of nodes) {
            const sourceFile = node.getSourceFile();
            if (!filesToRemove.has(sourceFile) && canRemoveFile(sourceFile, nodes)) {
                const barrelExportsForFile = barrelExports.get(sourceFile);
                nodesToRemove.add(node);
                filesToRemove.add(sourceFile);
                barrelExportsForFile && trackNodesToRemove(barrelExportsForFile);
            }
            else {
                nodesToRemove.add(node);
            }
        }
    })(classesToRemove);
    for (const node of nodesToRemove) {
        const sourceFile = node.getSourceFile();
        if (!filesToRemove.has(sourceFile) && canRemoveFile(sourceFile, nodesToRemove)) {
            filesToRemove.add(sourceFile);
        }
        else {
            tracker.removeNode(node);
        }
    }
    return { pendingChanges: tracker.recordChanges(), filesToRemove };
}
/**
 * Collects all the nodes that a module needs to be removed from.
 * @param ngModule Module being removed.
 * @param removalLocations Tracks the different places from which the class should be removed.
 * @param componentImportArrays Set of `imports` arrays of components that need to be adjusted.
 * @param testImportArrays Set of `imports` arrays of tests that need to be adjusted.
 * @param referenceResolver
 * @param program
 */
function collectChangeLocations(ngModule, removalLocations, componentImportArrays, testImportArrays, templateTypeChecker, referenceResolver, program) {
    const refsByFile = referenceResolver.findReferencesInProject(ngModule.name);
    const tsProgram = program.getTsProgram();
    const typeChecker = tsProgram.getTypeChecker();
    const nodes$1 = new Set();
    for (const [fileName, refs] of refsByFile) {
        const sourceFile = tsProgram.getSourceFile(fileName);
        if (sourceFile) {
            offsetsToNodes(getNodeLookup(sourceFile), refs, nodes$1);
        }
    }
    for (const node of nodes$1) {
        const closestArray = nodes.closestNode(node, ts.isArrayLiteralExpression);
        if (closestArray) {
            const closestAssignment = nodes.closestNode(closestArray, ts.isPropertyAssignment);
            if (closestAssignment && isInImportsArray(closestAssignment, closestArray)) {
                const closestCall = nodes.closestNode(closestAssignment, ts.isCallExpression);
                if (closestCall) {
                    const closestDecorator = nodes.closestNode(closestCall, ts.isDecorator);
                    const closestClass = closestDecorator
                        ? nodes.closestNode(closestDecorator, ts.isClassDeclaration)
                        : null;
                    const directiveMeta = closestClass
                        ? templateTypeChecker.getDirectiveMetadata(closestClass)
                        : null;
                    // If the module was flagged as being removable, but it's still being used in a
                    // standalone component's `imports` array, it means that it was likely changed
                    // outside of the  migration and deleting it now will be breaking. Track it
                    // separately so it can be handled properly.
                    if (directiveMeta && directiveMeta.isComponent && directiveMeta.isStandalone) {
                        componentImportArrays.track(closestArray, node);
                        continue;
                    }
                    // If the module is removable and used inside a test's `imports`,
                    // we track it separately so it can be replaced with its `exports`.
                    const { testBed, catalyst } = getTestingImports(node.getSourceFile());
                    if (isTestCall(typeChecker, closestCall, testBed, catalyst)) {
                        testImportArrays.track(closestArray, node);
                        continue;
                    }
                }
            }
            removalLocations.arrays.track(closestArray, node);
            continue;
        }
        const closestImport = nodes.closestNode(node, ts.isNamedImports);
        if (closestImport) {
            removalLocations.imports.track(closestImport, node);
            continue;
        }
        const closestExport = nodes.closestNode(node, ts.isNamedExports);
        if (closestExport) {
            removalLocations.exports.track(closestExport, node);
            continue;
        }
        removalLocations.unknown.add(node);
    }
}
/**
 * Replaces all the leftover modules in component `imports` arrays with their exports.
 * @param componentImportArrays All the imports arrays and their nodes that represent NgModules.
 * @param classesToRemove Set of classes that were marked for removal.
 * @param tracker
 * @param typeChecker
 * @param templateTypeChecker
 * @param importRemapper
 */
function replaceInComponentImportsArray(componentImportArrays, classesToRemove, tracker, typeChecker, templateTypeChecker, importRemapper) {
    for (const [array, toReplace] of componentImportArrays.getEntries()) {
        const closestClass = nodes.closestNode(array, ts.isClassDeclaration);
        if (!closestClass) {
            continue;
        }
        const replacements = new UniqueItemTracker();
        const usedImports = new Set(findTemplateDependencies(closestClass, templateTypeChecker).map((ref) => ref.node));
        for (const node of toReplace) {
            const moduleDecl = findClassDeclaration(node, typeChecker);
            if (moduleDecl) {
                const moduleMeta = templateTypeChecker.getNgModuleMetadata(moduleDecl);
                if (moduleMeta) {
                    moduleMeta.exports.forEach((exp) => {
                        if (usedImports.has(exp.node)) {
                            replacements.track(node, exp);
                        }
                    });
                }
                else {
                    // It's unlikely not to have module metadata at this point, but just in
                    // case unmark the class for removal to reduce the chance of breakages.
                    classesToRemove.delete(moduleDecl);
                }
            }
        }
        replaceModulesInImportsArray(array, replacements, tracker, templateTypeChecker, importRemapper);
    }
}
/**
 * Replaces all the leftover modules in testing `imports` arrays with their exports.
 * @param testImportArrays All test `imports` arrays and their nodes that represent modules.
 * @param classesToRemove Classes marked for removal by the migration.
 * @param tracker
 * @param typeChecker
 * @param templateTypeChecker
 * @param importRemapper
 */
function replaceInTestImportsArray(testImportArrays, removalLocations, classesToRemove, tracker, typeChecker, templateTypeChecker, importRemapper) {
    for (const [array, toReplace] of testImportArrays.getEntries()) {
        const replacements = new UniqueItemTracker();
        for (const node of toReplace) {
            const moduleDecl = findClassDeclaration(node, typeChecker);
            if (moduleDecl) {
                const moduleMeta = templateTypeChecker.getNgModuleMetadata(moduleDecl);
                if (moduleMeta) {
                    // Since we don't have access to the template type checker in tests,
                    // we copy over all the `exports` that aren't flagged for removal.
                    const exports = moduleMeta.exports.filter((exp) => !classesToRemove.has(exp.node));
                    if (exports.length > 0) {
                        exports.forEach((exp) => replacements.track(node, exp));
                    }
                    else {
                        removalLocations.arrays.track(array, node);
                    }
                }
                else {
                    // It's unlikely not to have module metadata at this point, but just in
                    // case unmark the class for removal to reduce the chance of breakages.
                    classesToRemove.delete(moduleDecl);
                }
            }
        }
        replaceModulesInImportsArray(array, replacements, tracker, templateTypeChecker, importRemapper);
    }
}
/**
 * Replaces any leftover modules in an `imports` arrays with a set of specified exports
 * @param array Imports array which is being migrated.
 * @param replacements Map of NgModule references to their exports.
 * @param tracker
 * @param templateTypeChecker
 * @param importRemapper
 */
function replaceModulesInImportsArray(array, replacements, tracker, templateTypeChecker, importRemapper) {
    if (replacements.isEmpty()) {
        return;
    }
    const newElements = [];
    const identifiers = new Set();
    for (const element of array.elements) {
        if (ts.isIdentifier(element)) {
            identifiers.add(element.text);
        }
    }
    for (const element of array.elements) {
        const replacementRefs = replacements.get(element);
        if (!replacementRefs) {
            newElements.push(element);
            continue;
        }
        const potentialImports = [];
        for (const ref of replacementRefs) {
            const importLocation = findImportLocation(ref, array, checker.PotentialImportMode.Normal, templateTypeChecker);
            if (importLocation) {
                potentialImports.push(importLocation);
            }
        }
        potentialImportsToExpressions(potentialImports, array.getSourceFile(), tracker, importRemapper).forEach((expr) => {
            if (!ts.isIdentifier(expr) || !identifiers.has(expr.text)) {
                newElements.push(expr);
            }
        });
    }
    tracker.replaceNode(array, ts.factory.updateArrayLiteralExpression(array, newElements));
}
/**
 * Removes all tracked array references.
 * @param locations Locations from which to remove the references.
 * @param tracker Tracker in which to register the changes.
 */
function removeArrayReferences(locations, tracker) {
    for (const [array, toRemove] of locations.getEntries()) {
        const newElements = filterRemovedElements(array.elements, toRemove);
        tracker.replaceNode(array, ts.factory.updateArrayLiteralExpression(array, ts.factory.createNodeArray(newElements, array.elements.hasTrailingComma)));
    }
}
/**
 * Removes all tracked import references.
 * @param locations Locations from which to remove the references.
 * @param tracker Tracker in which to register the changes.
 */
function removeImportReferences(locations, tracker) {
    for (const [namedImports, toRemove] of locations.getEntries()) {
        const newElements = filterRemovedElements(namedImports.elements, toRemove);
        // If no imports are left, we can try to drop the entire import.
        if (newElements.length === 0) {
            const importClause = nodes.closestNode(namedImports, ts.isImportClause);
            // If the import clause has a name we can only drop then named imports.
            // e.g. `import Foo, {ModuleToRemove} from './foo';` becomes `import Foo from './foo';`.
            if (importClause && importClause.name) {
                tracker.replaceNode(importClause, ts.factory.updateImportClause(importClause, importClause.isTypeOnly, importClause.name, undefined));
            }
            else {
                // Otherwise we can drop the entire declaration.
                const declaration = nodes.closestNode(namedImports, ts.isImportDeclaration);
                if (declaration) {
                    tracker.removeNode(declaration);
                }
            }
        }
        else {
            // Otherwise we just drop the imported symbols and keep the declaration intact.
            tracker.replaceNode(namedImports, ts.factory.updateNamedImports(namedImports, newElements));
        }
    }
}
/**
 * Removes all tracked export references.
 * @param locations Locations from which to remove the references.
 * @param tracker Tracker in which to register the changes.
 */
function removeExportReferences(locations, tracker) {
    for (const [namedExports, toRemove] of locations.getEntries()) {
        const newElements = filterRemovedElements(namedExports.elements, toRemove);
        // If no exports are left, we can drop the entire declaration.
        if (newElements.length === 0) {
            const declaration = nodes.closestNode(namedExports, ts.isExportDeclaration);
            if (declaration) {
                tracker.removeNode(declaration);
            }
        }
        else {
            // Otherwise we just drop the exported symbols and keep the declaration intact.
            tracker.replaceNode(namedExports, ts.factory.updateNamedExports(namedExports, newElements));
        }
    }
}
/**
 * Determines whether an `@NgModule` class is safe to remove. A module is safe to remove if:
 * 1. It has no `declarations`.
 * 2. It has no `providers`.
 * 3. It has no `bootstrap` components.
 * 4. It has no `ModuleWithProviders` in its `imports`.
 * 5. It has no class members. Empty construstors are ignored.
 * @param node Class that is being checked.
 * @param typeChecker
 */
function canRemoveClass(node, typeChecker) {
    const decorator = findNgModuleDecorator(node, typeChecker)?.node;
    // We can't remove a declaration if it's not a valid `NgModule`.
    if (!decorator || !ts.isCallExpression(decorator.expression)) {
        return false;
    }
    // Unsupported case, e.g. `@NgModule(SOME_VALUE)`.
    if (decorator.expression.arguments.length > 0 &&
        !ts.isObjectLiteralExpression(decorator.expression.arguments[0])) {
        return false;
    }
    // We can't remove modules that have class members. We make an exception for an
    // empty constructor which may have been generated by a tool and forgotten.
    if (node.members.length > 0 && node.members.some((member) => !isEmptyConstructor(member))) {
        return false;
    }
    // An empty `NgModule` call can be removed.
    if (decorator.expression.arguments.length === 0) {
        return true;
    }
    const literal = decorator.expression.arguments[0];
    const imports = findLiteralProperty(literal, 'imports');
    if (imports && isNonEmptyNgModuleProperty(imports)) {
        // We can't remove the class if at least one import isn't identifier, because it may be a
        // `ModuleWithProviders` which is the equivalent of having something in the `providers` array.
        for (const dep of imports.initializer.elements) {
            if (!ts.isIdentifier(dep)) {
                return false;
            }
            const depDeclaration = findClassDeclaration(dep, typeChecker);
            const depNgModule = depDeclaration
                ? findNgModuleDecorator(depDeclaration, typeChecker)
                : null;
            // If any of the dependencies of the class is an `NgModule` that can't be removed, the class
            // itself can't be removed either, because it may be part of a transitive dependency chain.
            if (depDeclaration !== null &&
                depNgModule !== null &&
                !canRemoveClass(depDeclaration, typeChecker)) {
                return false;
            }
        }
    }
    // We can't remove classes that have any `declarations`, `providers` or `bootstrap` elements.
    // Also err on the side of caution and don't remove modules where any of the aforementioned
    // properties aren't initialized to an array literal.
    for (const prop of literal.properties) {
        if (isNonEmptyNgModuleProperty(prop) &&
            (prop.name.text === 'declarations' ||
                prop.name.text === 'providers' ||
                prop.name.text === 'bootstrap')) {
            return false;
        }
    }
    return true;
}
/**
 * Checks whether a node is a non-empty property from an NgModule's metadata. This is defined as a
 * property assignment with a static name, initialized to an array literal with more than one
 * element.
 * @param node Node to be checked.
 */
function isNonEmptyNgModuleProperty(node) {
    return (ts.isPropertyAssignment(node) &&
        ts.isIdentifier(node.name) &&
        ts.isArrayLiteralExpression(node.initializer) &&
        node.initializer.elements.length > 0);
}
/**
 * Determines if a file is safe to delete. A file is safe to delete if all it contains are
 * import statements, class declarations that are about to be deleted and non-exported code.
 * @param sourceFile File that is being checked.
 * @param nodesToBeRemoved Nodes that are being removed as a part of the migration.
 */
function canRemoveFile(sourceFile, nodesToBeRemoved) {
    for (const node of sourceFile.statements) {
        if (ts.isImportDeclaration(node) || nodesToBeRemoved.has(node)) {
            continue;
        }
        if (ts.isExportDeclaration(node) ||
            (ts.canHaveModifiers(node) &&
                ts.getModifiers(node)?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword))) {
            return false;
        }
    }
    return true;
}
/**
 * Gets whether an AST node contains another AST node.
 * @param parent Parent node that may contain the child.
 * @param child Child node that is being checked.
 */
function contains(parent, child) {
    return (parent === child ||
        (parent.getSourceFile().fileName === child.getSourceFile().fileName &&
            child.getStart() >= parent.getStart() &&
            child.getStart() <= parent.getEnd()));
}
/**
 * Removes AST nodes from a node array.
 * @param elements Array from which to remove the nodes.
 * @param toRemove Nodes that should be removed.
 */
function filterRemovedElements(elements, toRemove) {
    return elements.filter((el) => {
        for (const node of toRemove) {
            // Check that the element contains the node, despite knowing with relative certainty that it
            // does, because this allows us to unwrap some nodes. E.g. if we have `[((toRemove))]`, we
            // want to remove the entire parenthesized expression, rather than just `toRemove`.
            if (contains(el, node)) {
                return false;
            }
        }
        return true;
    });
}
/** Returns whether a node as an empty constructor. */
function isEmptyConstructor(node) {
    return (ts.isConstructorDeclaration(node) &&
        node.parameters.length === 0 &&
        (node.body == null || node.body.statements.length === 0));
}
/**
 * Adds TODO comments to nodes that couldn't be removed manually.
 * @param nodes Nodes to which to add the TODO.
 * @param tracker Tracker in which to register the changes.
 */
function addRemovalTodos(nodes, tracker) {
    for (const node of nodes) {
        // Note: the comment is inserted using string manipulation, instead of going through the AST,
        // because this way we preserve more of the app's original formatting.
        // Note: in theory this can duplicate comments if the module pruning runs multiple times on
        // the same node. In practice it is unlikely, because the second time the node won't be picked
        // up by the language service as a reference, because the class won't exist anymore.
        tracker.insertText(node.getSourceFile(), node.getFullStart(), ` /* TODO(standalone-migration): clean up removed NgModule reference manually. */ `);
    }
}
/** Finds the `NgModule` decorator in a class, if it exists. */
function findNgModuleDecorator(node, typeChecker) {
    const decorators = ng_decorators.getAngularDecorators(typeChecker, ts.getDecorators(node) || []);
    return decorators.find((decorator) => decorator.name === 'NgModule') || null;
}
/**
 * Checks whether a node is used inside of an `imports` array.
 * @param closestAssignment The closest property assignment to the node.
 * @param closestArray The closest array to the node.
 */
function isInImportsArray(closestAssignment, closestArray) {
    return (closestAssignment.initializer === closestArray &&
        (ts.isIdentifier(closestAssignment.name) || ts.isStringLiteralLike(closestAssignment.name)) &&
        closestAssignment.name.text === 'imports');
}

/*!
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSlxE file at https://angular.dev/license
 */
function toStandaloneBootstrap(program, host, basePath, rootFileNames, sourceFiles, printer, importRemapper, referenceLookupExcludedFiles, declarationImportRemapper) {
    const tracker = new compiler_host.ChangeTracker(printer, importRemapper);
    const typeChecker = program.getTsProgram().getTypeChecker();
    const templateTypeChecker = program.compiler.getTemplateTypeChecker();
    const referenceResolver = new ReferenceResolver(program, host, rootFileNames, basePath, referenceLookupExcludedFiles);
    const bootstrapCalls = [];
    const testObjects = new Set();
    const allDeclarations = new Set();
    // `bootstrapApplication` doesn't include Protractor support by default
    // anymore so we have to opt the app in, if we detect it being used.
    const additionalProviders = hasImport(program, rootFileNames, 'protractor')
        ? new Map([['provideProtractorTestingSupport', '@angular/platform-browser']])
        : null;
    for (const sourceFile of sourceFiles) {
        sourceFile.forEachChild(function walk(node) {
            if (ts.isCallExpression(node) &&
                ts.isPropertyAccessExpression(node.expression) &&
                node.expression.name.text === 'bootstrapModule' &&
                isClassReferenceInAngularModule(node.expression, 'PlatformRef', 'core', typeChecker)) {
                const call = analyzeBootstrapCall(node, typeChecker, templateTypeChecker);
                if (call) {
                    bootstrapCalls.push(call);
                }
            }
            node.forEachChild(walk);
        });
        findTestObjectsToMigrate(sourceFile, typeChecker).forEach((obj) => testObjects.add(obj));
    }
    for (const call of bootstrapCalls) {
        call.declarations.forEach((decl) => allDeclarations.add(decl));
        migrateBootstrapCall(call, tracker, additionalProviders, referenceResolver, typeChecker, printer);
    }
    // The previous migrations explicitly skip over bootstrapped
    // declarations so we have to migrate them now.
    for (const declaration of allDeclarations) {
        convertNgModuleDeclarationToStandalone(declaration, allDeclarations, tracker, templateTypeChecker, declarationImportRemapper);
    }
    migrateTestDeclarations(testObjects, allDeclarations, tracker, templateTypeChecker, typeChecker);
    return tracker.recordChanges();
}
/**
 * Extracts all of the information from a `bootstrapModule` call
 * necessary to convert it to `bootstrapApplication`.
 * @param call Call to be analyzed.
 * @param typeChecker
 * @param templateTypeChecker
 */
function analyzeBootstrapCall(call, typeChecker, templateTypeChecker) {
    if (call.arguments.length === 0 || !ts.isIdentifier(call.arguments[0])) {
        return null;
    }
    const declaration = findClassDeclaration(call.arguments[0], typeChecker);
    if (!declaration) {
        return null;
    }
    const decorator = ng_decorators.getAngularDecorators(typeChecker, ts.getDecorators(declaration) || []).find((decorator) => decorator.name === 'NgModule');
    if (!decorator ||
        decorator.node.expression.arguments.length === 0 ||
        !ts.isObjectLiteralExpression(decorator.node.expression.arguments[0])) {
        return null;
    }
    const metadata = decorator.node.expression.arguments[0];
    const bootstrapProp = findLiteralProperty(metadata, 'bootstrap');
    if (!bootstrapProp ||
        !ts.isPropertyAssignment(bootstrapProp) ||
        !ts.isArrayLiteralExpression(bootstrapProp.initializer) ||
        bootstrapProp.initializer.elements.length === 0 ||
        !ts.isIdentifier(bootstrapProp.initializer.elements[0])) {
        return null;
    }
    const component = findClassDeclaration(bootstrapProp.initializer.elements[0], typeChecker);
    if (component && component.name && ts.isIdentifier(component.name)) {
        return {
            module: declaration,
            metadata,
            component: component,
            call,
            declarations: extractDeclarationsFromModule(declaration, templateTypeChecker),
        };
    }
    return null;
}
/**
 * Converts a `bootstrapModule` call to `bootstrapApplication`.
 * @param analysis Analysis result of the call.
 * @param tracker Tracker in which to register the changes.
 * @param additionalFeatures Additional providers, apart from the auto-detected ones, that should
 * be added to the bootstrap call.
 * @param referenceResolver
 * @param typeChecker
 * @param printer
 */
function migrateBootstrapCall(analysis, tracker, additionalProviders, referenceResolver, typeChecker, printer) {
    const sourceFile = analysis.call.getSourceFile();
    const moduleSourceFile = analysis.metadata.getSourceFile();
    const providers = findLiteralProperty(analysis.metadata, 'providers');
    const imports = findLiteralProperty(analysis.metadata, 'imports');
    const nodesToCopy = new Set();
    const providersInNewCall = [];
    const moduleImportsInNewCall = [];
    let nodeLookup = null;
    // Comment out the metadata so that it'll be removed when we run the module pruning afterwards.
    // If the pruning is left for some reason, the user will still have an actionable TODO.
    tracker.insertText(moduleSourceFile, analysis.metadata.getStart(), '/* TODO(standalone-migration): clean up removed NgModule class manually. \n');
    tracker.insertText(moduleSourceFile, analysis.metadata.getEnd(), ' */');
    if (providers && ts.isPropertyAssignment(providers)) {
        nodeLookup = nodeLookup || getNodeLookup(moduleSourceFile);
        if (ts.isArrayLiteralExpression(providers.initializer)) {
            providersInNewCall.push(...providers.initializer.elements);
        }
        else {
            providersInNewCall.push(ts.factory.createSpreadElement(providers.initializer));
        }
        addNodesToCopy(sourceFile, providers, nodeLookup, tracker, nodesToCopy, referenceResolver);
    }
    if (imports && ts.isPropertyAssignment(imports)) {
        nodeLookup = nodeLookup || getNodeLookup(moduleSourceFile);
        migrateImportsForBootstrapCall(sourceFile, imports, nodeLookup, moduleImportsInNewCall, providersInNewCall, tracker, nodesToCopy, referenceResolver, typeChecker);
    }
    if (additionalProviders) {
        additionalProviders.forEach((moduleSpecifier, name) => {
            providersInNewCall.push(ts.factory.createCallExpression(tracker.addImport(sourceFile, name, moduleSpecifier), undefined, undefined));
        });
    }
    if (nodesToCopy.size > 0) {
        let text = '\n\n';
        nodesToCopy.forEach((node) => {
            const transformedNode = remapDynamicImports(sourceFile.fileName, node);
            // Use `getText` to try an preserve the original formatting. This only works if the node
            // hasn't been transformed. If it has, we have to fall back to the printer.
            if (transformedNode === node) {
                text += transformedNode.getText() + '\n';
            }
            else {
                text += printer.printNode(ts.EmitHint.Unspecified, transformedNode, node.getSourceFile());
            }
        });
        text += '\n';
        tracker.insertText(sourceFile, getLastImportEnd(sourceFile), text);
    }
    replaceBootstrapCallExpression(analysis, providersInNewCall, moduleImportsInNewCall, tracker);
}
/**
 * Replaces a `bootstrapModule` call with `bootstrapApplication`.
 * @param analysis Analysis result of the `bootstrapModule` call.
 * @param providers Providers that should be added to the new call.
 * @param modules Modules that are being imported into the new call.
 * @param tracker Object keeping track of the changes to the different files.
 */
function replaceBootstrapCallExpression(analysis, providers, modules, tracker) {
    const sourceFile = analysis.call.getSourceFile();
    const componentPath = getRelativeImportPath(sourceFile.fileName, analysis.component.getSourceFile().fileName);
    const args = [tracker.addImport(sourceFile, analysis.component.name.text, componentPath)];
    const bootstrapExpression = tracker.addImport(sourceFile, 'bootstrapApplication', '@angular/platform-browser');
    if (providers.length > 0 || modules.length > 0) {
        const combinedProviders = [];
        if (modules.length > 0) {
            const importProvidersExpression = tracker.addImport(sourceFile, 'importProvidersFrom', '@angular/core');
            combinedProviders.push(ts.factory.createCallExpression(importProvidersExpression, [], modules));
        }
        // Push the providers after `importProvidersFrom` call for better readability.
        combinedProviders.push(...providers);
        const providersArray = ts.factory.createNodeArray(combinedProviders, analysis.metadata.properties.hasTrailingComma && combinedProviders.length > 2);
        const initializer = remapDynamicImports(sourceFile.fileName, ts.factory.createArrayLiteralExpression(providersArray, combinedProviders.length > 1));
        args.push(ts.factory.createObjectLiteralExpression([ts.factory.createPropertyAssignment('providers', initializer)], true));
    }
    tracker.replaceNode(analysis.call, ts.factory.createCallExpression(bootstrapExpression, [], args), 
    // Note: it's important to pass in the source file that the nodes originated from!
    // Otherwise TS won't print out literals inside of the providers that we're copying
    // over from the module file.
    undefined, analysis.metadata.getSourceFile());
}
/**
 * Processes the `imports` of an NgModule so that they can be used in the `bootstrapApplication`
 * call inside of a different file.
 * @param sourceFile File to which the imports will be moved.
 * @param imports Node declaring the imports.
 * @param nodeLookup Map used to look up nodes based on their positions in a file.
 * @param importsForNewCall Array keeping track of the imports that are being added to the new call.
 * @param providersInNewCall Array keeping track of the providers in the new call.
 * @param tracker Tracker in which changes to files are being stored.
 * @param nodesToCopy Nodes that should be copied to the new file.
 * @param referenceResolver
 * @param typeChecker
 */
function migrateImportsForBootstrapCall(sourceFile, imports, nodeLookup, importsForNewCall, providersInNewCall, tracker, nodesToCopy, referenceResolver, typeChecker) {
    if (!ts.isArrayLiteralExpression(imports.initializer)) {
        importsForNewCall.push(imports.initializer);
        return;
    }
    for (const element of imports.initializer.elements) {
        // If the reference is to a `RouterModule.forRoot` call, we can try to migrate it.
        if (ts.isCallExpression(element) &&
            ts.isPropertyAccessExpression(element.expression) &&
            element.arguments.length > 0 &&
            element.expression.name.text === 'forRoot' &&
            isClassReferenceInAngularModule(element.expression.expression, 'RouterModule', 'router', typeChecker)) {
            const options = element.arguments[1];
            const features = options ? getRouterModuleForRootFeatures(sourceFile, options, tracker) : [];
            // If the features come back as null, it means that the router
            // has a configuration that can't be migrated automatically.
            if (features !== null) {
                providersInNewCall.push(ts.factory.createCallExpression(tracker.addImport(sourceFile, 'provideRouter', '@angular/router'), [], [element.arguments[0], ...features]));
                addNodesToCopy(sourceFile, element.arguments[0], nodeLookup, tracker, nodesToCopy, referenceResolver);
                if (options) {
                    addNodesToCopy(sourceFile, options, nodeLookup, tracker, nodesToCopy, referenceResolver);
                }
                continue;
            }
        }
        if (ts.isIdentifier(element)) {
            // `BrowserAnimationsModule` can be replaced with `provideAnimations`.
            const animationsModule = 'platform-browser/animations';
            const animationsImport = `@angular/${animationsModule}`;
            if (isClassReferenceInAngularModule(element, 'BrowserAnimationsModule', animationsModule, typeChecker)) {
                providersInNewCall.push(ts.factory.createCallExpression(tracker.addImport(sourceFile, 'provideAnimations', animationsImport), [], []));
                continue;
            }
            // `NoopAnimationsModule` can be replaced with `provideNoopAnimations`.
            if (isClassReferenceInAngularModule(element, 'NoopAnimationsModule', animationsModule, typeChecker)) {
                providersInNewCall.push(ts.factory.createCallExpression(tracker.addImport(sourceFile, 'provideNoopAnimations', animationsImport), [], []));
                continue;
            }
            // `HttpClientModule` can be replaced with `provideHttpClient()`.
            const httpClientModule = 'common/http';
            const httpClientImport = `@angular/${httpClientModule}`;
            if (isClassReferenceInAngularModule(element, 'HttpClientModule', httpClientModule, typeChecker)) {
                const callArgs = [
                    // we add `withInterceptorsFromDi()` to the call to ensure that class-based interceptors
                    // still work
                    ts.factory.createCallExpression(tracker.addImport(sourceFile, 'withInterceptorsFromDi', httpClientImport), [], []),
                ];
                providersInNewCall.push(ts.factory.createCallExpression(tracker.addImport(sourceFile, 'provideHttpClient', httpClientImport), [], callArgs));
                continue;
            }
        }
        const target = 
        // If it's a call, it'll likely be a `ModuleWithProviders`
        // expression so the target is going to be call's expression.
        ts.isCallExpression(element) && ts.isPropertyAccessExpression(element.expression)
            ? element.expression.expression
            : element;
        const classDeclaration = findClassDeclaration(target, typeChecker);
        const decorators = classDeclaration
            ? ng_decorators.getAngularDecorators(typeChecker, ts.getDecorators(classDeclaration) || [])
            : undefined;
        if (!decorators ||
            decorators.length === 0 ||
            decorators.every(({ name }) => name !== 'Directive' && name !== 'Component' && name !== 'Pipe')) {
            importsForNewCall.push(element);
            addNodesToCopy(sourceFile, element, nodeLookup, tracker, nodesToCopy, referenceResolver);
        }
    }
}
/**
 * Generates the call expressions that can be used to replace the options
 * object that is passed into a `RouterModule.forRoot` call.
 * @param sourceFile File that the `forRoot` call is coming from.
 * @param options Node that is passed as the second argument to the `forRoot` call.
 * @param tracker Tracker in which to track imports that need to be inserted.
 * @returns Null if the options can't be migrated, otherwise an array of call expressions.
 */
function getRouterModuleForRootFeatures(sourceFile, options, tracker) {
    // Options that aren't a static object literal can't be migrated.
    if (!ts.isObjectLiteralExpression(options)) {
        return null;
    }
    const featureExpressions = [];
    const configOptions = [];
    const inMemoryScrollingOptions = [];
    const features = new UniqueItemTracker();
    for (const prop of options.properties) {
        // We can't migrate options that we can't easily analyze.
        if (!ts.isPropertyAssignment(prop) ||
            (!ts.isIdentifier(prop.name) && !ts.isStringLiteralLike(prop.name))) {
            return null;
        }
        switch (prop.name.text) {
            // `preloadingStrategy` maps to the `withPreloading` function.
            case 'preloadingStrategy':
                features.track('withPreloading', prop.initializer);
                break;
            // `enableTracing: true` maps to the `withDebugTracing` feature.
            case 'enableTracing':
                if (prop.initializer.kind === ts.SyntaxKind.TrueKeyword) {
                    features.track('withDebugTracing', null);
                }
                break;
            // `initialNavigation: 'enabled'` and `initialNavigation: 'enabledBlocking'` map to the
            // `withEnabledBlockingInitialNavigation` feature, while `initialNavigation: 'disabled'` maps
            // to the `withDisabledInitialNavigation` feature.
            case 'initialNavigation':
                if (!ts.isStringLiteralLike(prop.initializer)) {
                    return null;
                }
                if (prop.initializer.text === 'enabledBlocking' || prop.initializer.text === 'enabled') {
                    features.track('withEnabledBlockingInitialNavigation', null);
                }
                else if (prop.initializer.text === 'disabled') {
                    features.track('withDisabledInitialNavigation', null);
                }
                break;
            // `useHash: true` maps to the `withHashLocation` feature.
            case 'useHash':
                if (prop.initializer.kind === ts.SyntaxKind.TrueKeyword) {
                    features.track('withHashLocation', null);
                }
                break;
            // `errorHandler` maps to the `withNavigationErrorHandler` feature.
            case 'errorHandler':
                features.track('withNavigationErrorHandler', prop.initializer);
                break;
            // `anchorScrolling` and `scrollPositionRestoration` arguments have to be combined into an
            // object literal that is passed into the `withInMemoryScrolling` feature.
            case 'anchorScrolling':
            case 'scrollPositionRestoration':
                inMemoryScrollingOptions.push(prop);
                break;
            // All remaining properties can be passed through the `withRouterConfig` feature.
            default:
                configOptions.push(prop);
                break;
        }
    }
    if (inMemoryScrollingOptions.length > 0) {
        features.track('withInMemoryScrolling', ts.factory.createObjectLiteralExpression(inMemoryScrollingOptions));
    }
    if (configOptions.length > 0) {
        features.track('withRouterConfig', ts.factory.createObjectLiteralExpression(configOptions));
    }
    for (const [feature, featureArgs] of features.getEntries()) {
        const callArgs = [];
        featureArgs.forEach((arg) => {
            if (arg !== null) {
                callArgs.push(arg);
            }
        });
        featureExpressions.push(ts.factory.createCallExpression(tracker.addImport(sourceFile, feature, '@angular/router'), [], callArgs));
    }
    return featureExpressions;
}
/**
 * Finds all the nodes that are referenced inside a root node and would need to be copied into a
 * new file in order for the node to compile, and tracks them.
 * @param targetFile File to which the nodes will be copied.
 * @param rootNode Node within which to look for references.
 * @param nodeLookup Map used to look up nodes based on their positions in a file.
 * @param tracker Tracker in which changes to files are stored.
 * @param nodesToCopy Set that keeps track of the nodes being copied.
 * @param referenceResolver
 */
function addNodesToCopy(targetFile, rootNode, nodeLookup, tracker, nodesToCopy, referenceResolver) {
    const refs = findAllSameFileReferences(rootNode, nodeLookup, referenceResolver);
    for (const ref of refs) {
        const importSpecifier = closestOrSelf(ref, ts.isImportSpecifier);
        const importDeclaration = importSpecifier
            ? nodes.closestNode(importSpecifier, ts.isImportDeclaration)
            : null;
        // If the reference is in an import, we need to add an import to the main file.
        if (importDeclaration &&
            importSpecifier &&
            ts.isStringLiteralLike(importDeclaration.moduleSpecifier)) {
            const moduleName = importDeclaration.moduleSpecifier.text.startsWith('.')
                ? remapRelativeImport(targetFile.fileName, importDeclaration.moduleSpecifier)
                : importDeclaration.moduleSpecifier.text;
            const symbolName = importSpecifier.propertyName
                ? importSpecifier.propertyName.text
                : importSpecifier.name.text;
            const alias = importSpecifier.propertyName ? importSpecifier.name.text : undefined;
            tracker.addImport(targetFile, symbolName, moduleName, alias);
            continue;
        }
        const variableDeclaration = closestOrSelf(ref, ts.isVariableDeclaration);
        const variableStatement = variableDeclaration
            ? nodes.closestNode(variableDeclaration, ts.isVariableStatement)
            : null;
        // If the reference is a variable, we can attempt to import it or copy it over.
        if (variableDeclaration && variableStatement && ts.isIdentifier(variableDeclaration.name)) {
            if (isExported(variableStatement)) {
                tracker.addImport(targetFile, variableDeclaration.name.text, getRelativeImportPath(targetFile.fileName, ref.getSourceFile().fileName));
            }
            else {
                nodesToCopy.add(variableStatement);
            }
            continue;
        }
        // Otherwise check if the reference is inside of an exportable declaration, e.g. a function.
        // This code that is safe to copy over into the new file or import it, if it's exported.
        const closestExportable = closestOrSelf(ref, isExportableDeclaration);
        if (closestExportable) {
            if (isExported(closestExportable) && closestExportable.name) {
                tracker.addImport(targetFile, closestExportable.name.text, getRelativeImportPath(targetFile.fileName, ref.getSourceFile().fileName));
            }
            else {
                nodesToCopy.add(closestExportable);
            }
        }
    }
}
/**
 * Finds all the nodes referenced within the root node in the same file.
 * @param rootNode Node from which to start looking for references.
 * @param nodeLookup Map used to look up nodes based on their positions in a file.
 * @param referenceResolver
 */
function findAllSameFileReferences(rootNode, nodeLookup, referenceResolver) {
    const results = new Set();
    const traversedTopLevelNodes = new Set();
    const excludeStart = rootNode.getStart();
    const excludeEnd = rootNode.getEnd();
    (function walk(node) {
        if (!isReferenceIdentifier(node)) {
            node.forEachChild(walk);
            return;
        }
        const refs = referencesToNodeWithinSameFile(node, nodeLookup, excludeStart, excludeEnd, referenceResolver);
        if (refs === null) {
            return;
        }
        for (const ref of refs) {
            if (results.has(ref)) {
                continue;
            }
            results.add(ref);
            const closestTopLevel = nodes.closestNode(ref, isTopLevelStatement);
            // Avoid re-traversing the same top-level nodes since we know what the result will be.
            if (!closestTopLevel || traversedTopLevelNodes.has(closestTopLevel)) {
                continue;
            }
            // Keep searching, starting from the closest top-level node. We skip import declarations,
            // because we already know about them and they may put the search into an infinite loop.
            if (!ts.isImportDeclaration(closestTopLevel) &&
                isOutsideRange(excludeStart, excludeEnd, closestTopLevel.getStart(), closestTopLevel.getEnd())) {
                traversedTopLevelNodes.add(closestTopLevel);
                walk(closestTopLevel);
            }
        }
    })(rootNode);
    return results;
}
/**
 * Finds all the nodes referring to a specific node within the same file.
 * @param node Node whose references we're lookip for.
 * @param nodeLookup Map used to look up nodes based on their positions in a file.
 * @param excludeStart Start of a range that should be excluded from the results.
 * @param excludeEnd End of a range that should be excluded from the results.
 * @param referenceResolver
 */
function referencesToNodeWithinSameFile(node, nodeLookup, excludeStart, excludeEnd, referenceResolver) {
    const offsets = referenceResolver
        .findSameFileReferences(node, node.getSourceFile().fileName)
        .filter(([start, end]) => isOutsideRange(excludeStart, excludeEnd, start, end));
    if (offsets.length > 0) {
        const nodes = offsetsToNodes(nodeLookup, offsets, new Set());
        if (nodes.size > 0) {
            return nodes;
        }
    }
    return null;
}
/**
 * Transforms a node so that any dynamic imports with relative file paths it contains are remapped
 * as if they were specified in a different file. If no transformations have occurred, the original
 * node will be returned.
 * @param targetFileName File name to which to remap the imports.
 * @param rootNode Node being transformed.
 */
function remapDynamicImports(targetFileName, rootNode) {
    let hasChanged = false;
    const transformer = (context) => {
        return (sourceFile) => ts.visitNode(sourceFile, function walk(node) {
            if (ts.isCallExpression(node) &&
                node.expression.kind === ts.SyntaxKind.ImportKeyword &&
                node.arguments.length > 0 &&
                ts.isStringLiteralLike(node.arguments[0]) &&
                node.arguments[0].text.startsWith('.')) {
                hasChanged = true;
                return context.factory.updateCallExpression(node, node.expression, node.typeArguments, [
                    context.factory.createStringLiteral(remapRelativeImport(targetFileName, node.arguments[0])),
                    ...node.arguments.slice(1),
                ]);
            }
            return ts.visitEachChild(node, walk, context);
        });
    };
    const result = ts.transform(rootNode, [transformer]).transformed[0];
    return hasChanged ? result : rootNode;
}
/**
 * Checks whether a node is a statement at the top level of a file.
 * @param node Node to be checked.
 */
function isTopLevelStatement(node) {
    return node.parent != null && ts.isSourceFile(node.parent);
}
/**
 * Asserts that a node is an identifier that might be referring to a symbol. This excludes
 * identifiers of named nodes like property assignments.
 * @param node Node to be checked.
 */
function isReferenceIdentifier(node) {
    return (ts.isIdentifier(node) &&
        ((!ts.isPropertyAssignment(node.parent) && !ts.isParameter(node.parent)) ||
            node.parent.name !== node));
}
/**
 * Checks whether a range is completely outside of another range.
 * @param excludeStart Start of the exclusion range.
 * @param excludeEnd End of the exclusion range.
 * @param start Start of the range that is being checked.
 * @param end End of the range that is being checked.
 */
function isOutsideRange(excludeStart, excludeEnd, start, end) {
    return (start < excludeStart && end < excludeStart) || start > excludeEnd;
}
/**
 * Remaps the specifier of a relative import from its original location to a new one.
 * @param targetFileName Name of the file that the specifier will be moved to.
 * @param specifier Specifier whose path is being remapped.
 */
function remapRelativeImport(targetFileName, specifier) {
    return getRelativeImportPath(targetFileName, p.join(p.dirname(specifier.getSourceFile().fileName), specifier.text));
}
/**
 * Whether a node is exported.
 * @param node Node to be checked.
 */
function isExported(node) {
    return ts.canHaveModifiers(node) && node.modifiers
        ? node.modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)
        : false;
}
/**
 * Asserts that a node is an exportable declaration, which means that it can either be exported or
 * it can be safely copied into another file.
 * @param node Node to be checked.
 */
function isExportableDeclaration(node) {
    return (ts.isEnumDeclaration(node) ||
        ts.isClassDeclaration(node) ||
        ts.isFunctionDeclaration(node) ||
        ts.isInterfaceDeclaration(node) ||
        ts.isTypeAliasDeclaration(node));
}
/**
 * Gets the index after the last import in a file. Can be used to insert new code into the file.
 * @param sourceFile File in which to search for imports.
 */
function getLastImportEnd(sourceFile) {
    let index = 0;
    for (const statement of sourceFile.statements) {
        if (ts.isImportDeclaration(statement)) {
            index = Math.max(index, statement.getEnd());
        }
        else {
            break;
        }
    }
    return index;
}
/** Checks if any of the program's files has an import of a specific module. */
function hasImport(program, rootFileNames, moduleName) {
    const tsProgram = program.getTsProgram();
    const deepImportStart = moduleName + '/';
    for (const fileName of rootFileNames) {
        const sourceFile = tsProgram.getSourceFile(fileName);
        if (!sourceFile) {
            continue;
        }
        for (const statement of sourceFile.statements) {
            if (ts.isImportDeclaration(statement) &&
                ts.isStringLiteralLike(statement.moduleSpecifier) &&
                (statement.moduleSpecifier.text === moduleName ||
                    statement.moduleSpecifier.text.startsWith(deepImportStart))) {
                return true;
            }
        }
    }
    return false;
}

var MigrationMode;
(function (MigrationMode) {
    MigrationMode["toStandalone"] = "convert-to-standalone";
    MigrationMode["pruneModules"] = "prune-ng-modules";
    MigrationMode["standaloneBootstrap"] = "standalone-bootstrap";
})(MigrationMode || (MigrationMode = {}));
function migrate(options) {
    return async (tree, context) => {
        const { buildPaths, testPaths } = await project_tsconfig_paths.getProjectTsConfigPaths(tree);
        const basePath = process.cwd();
        const allPaths = [...buildPaths, ...testPaths];
        // TS and Schematic use paths in POSIX format even on Windows. This is needed as otherwise
        // string matching such as `sourceFile.fileName.startsWith(pathToMigrate)` might not work.
        const pathToMigrate = compiler_host.normalizePath(p.join(basePath, options.path));
        let migratedFiles = 0;
        if (!allPaths.length) {
            throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the standalone migration.');
        }
        for (const tsconfigPath of allPaths) {
            migratedFiles += standaloneMigration(tree, tsconfigPath, basePath, pathToMigrate, options);
        }
        if (migratedFiles === 0) {
            throw new schematics.SchematicsException(`Could not find any files to migrate under the path ${pathToMigrate}. Cannot run the standalone migration.`);
        }
        context.logger.info('🎉 Automated migration step has finished! 🎉');
        context.logger.info('IMPORTANT! Please verify manually that your application builds and behaves as expected.');
        context.logger.info(`See https://angular.dev/reference/migrations/standalone for more information.`);
    };
}
function standaloneMigration(tree, tsconfigPath, basePath, pathToMigrate, schematicOptions, oldProgram) {
    if (schematicOptions.path.startsWith('..')) {
        throw new schematics.SchematicsException('Cannot run standalone migration outside of the current project.');
    }
    const { host, options, rootNames } = compiler_host.createProgramOptions(tree, tsconfigPath, basePath, undefined, undefined, {
        _enableTemplateTypeChecker: true, // Required for the template type checker to work.
        compileNonExportedClasses: true, // We want to migrate non-exported classes too.
        // Avoid checking libraries to speed up the migration.
        skipLibCheck: true,
        skipDefaultLibCheck: true,
    });
    const referenceLookupExcludedFiles = /node_modules|\.ngtypecheck\.ts/;
    const program = createProgram({ rootNames, host, options, oldProgram });
    const printer = ts.createPrinter();
    if (fs.existsSync(pathToMigrate) && !fs.statSync(pathToMigrate).isDirectory()) {
        throw new schematics.SchematicsException(`Migration path ${pathToMigrate} has to be a directory. Cannot run the standalone migration.`);
    }
    const sourceFiles = program
        .getTsProgram()
        .getSourceFiles()
        .filter((sourceFile) => sourceFile.fileName.startsWith(pathToMigrate) &&
        compiler_host.canMigrateFile(basePath, sourceFile, program.getTsProgram()));
    if (sourceFiles.length === 0) {
        return 0;
    }
    let pendingChanges;
    let filesToRemove = null;
    if (schematicOptions.mode === MigrationMode.pruneModules) {
        const result = pruneNgModules(program, host, basePath, rootNames, sourceFiles, printer, undefined, referenceLookupExcludedFiles, knownInternalAliasRemapper);
        pendingChanges = result.pendingChanges;
        filesToRemove = result.filesToRemove;
    }
    else if (schematicOptions.mode === MigrationMode.standaloneBootstrap) {
        pendingChanges = toStandaloneBootstrap(program, host, basePath, rootNames, sourceFiles, printer, undefined, referenceLookupExcludedFiles, knownInternalAliasRemapper);
    }
    else {
        // This shouldn't happen, but default to `MigrationMode.toStandalone` just in case.
        pendingChanges = toStandalone(sourceFiles, program, printer, undefined, knownInternalAliasRemapper);
    }
    for (const [file, changes] of pendingChanges.entries()) {
        // Don't attempt to edit a file if it's going to be deleted.
        if (filesToRemove?.has(file)) {
            continue;
        }
        const update = tree.beginUpdate(p.relative(basePath, file.fileName));
        changes.forEach((change) => {
            if (change.removeLength != null) {
                update.remove(change.start, change.removeLength);
            }
            update.insertRight(change.start, change.text);
        });
        tree.commitUpdate(update);
    }
    if (filesToRemove) {
        for (const file of filesToRemove) {
            tree.delete(p.relative(basePath, file.fileName));
        }
    }
    // Run the module pruning after the standalone bootstrap to automatically remove the root module.
    // Note that we can't run the module pruning internally without propagating the changes to disk,
    // because there may be conflicting AST node changes.
    if (schematicOptions.mode === MigrationMode.standaloneBootstrap) {
        return (standaloneMigration(tree, tsconfigPath, basePath, pathToMigrate, { ...schematicOptions, mode: MigrationMode.pruneModules }, program) + sourceFiles.length);
    }
    return sourceFiles.length;
}

exports.migrate = migrate;
Ix8{
  "schematics": {
    "standalone-migration": {
      "description": "Converts the entire application or a part of it to standalone",
      "factory": "./bundles/standalone-migration.cjs#migrate",
      "schema": "./ng-generate/standalone-migration/schema.json",
      "aliases": ["standalone"]
    },
    "control-flow-migration": {
      "description": "Converts the entire application to block control flow syntax",
      "factory": "./bundles/control-flow-migration.cjs#migrate",
      "schema": "./ng-generate/control-flow-migration/schema.json",
      "aliases": ["control-flow"]
    },
    "inject-migration": {
      "description": "Converts usages of constructor-based injection to the inject() function",
      "factory": "./bundles/inject-migration.cjs#migrate",
      "schema": "./ng-generate/inject-migration/schema.json",
      "aliases": ["inject"]
    },
    "route-lazy-loading-migration": {
      "description": "Updates route definitions to use lazy-loading of components instead of eagerly referencing them",
      "factory": "./bundles/route-lazy-loading.cjs#migrate",
      "schema": "./ng-generate/route-lazy-loading/schema.json",
      "aliases": ["route-lazy-loading"]
    },
    "signal-input-migration": {
      "description": "Updates `@Input` declarations to signal inputs, while also migrating all relevant references.",
      "factory": "./bundles/signal-input-migration.cjs#migrate",
      "schema": "./ng-generate/signal-input-migration/schema.json",
      "aliases": ["signal-inputs", "signal-input"]
    },
    "signal-queries-migration": {
      "description": "Updates query declarations to signal queries, while also migrating all relevant references.",
      "factory": "./bundles/signal-queries-migration.cjs#migrate",
      "schema": "./ng-generate/signal-queries-migration/schema.json",
      "aliases": ["signal-queries", "signal-query", "signal-query-migration"]
    },
    "output-migration": {
      "description": "Updates @output declarations to the functional equivalent, while also migrating all relevant references.",
      "factory": "./bundles/output-migration.cjs#migrate",
      "schema": "./ng-generate/output-migration/schema.json",
      "aliases": ["outputs"]
    },
    "signals": {
      "description": "Combines all signals-related migrations into a single migration",
      "factory": "./bundles/signals.cjs#migrate",
      "schema": "./ng-generate/signals/schema.json"
    },
    "cleanup-unused-imports": {
      "description": "Removes unused imports from standalone components.",
      "factory": "./bundles/cleanup-unused-imports.cjs#migrate",
      "schema": "./ng-generate/cleanup-unused-imports/schema.json"
    },
    "self-closing-tags-migration": {
      "description": "Updates the components templates to use self-closing tags where possible",
      "factory": "./bundles/self-closing-tags-migration.cjs#migrate",
      "schema": "./ng-generate/self-closing-tags-migration/schema.json",
      "aliases": ["self-closing-tag"]
    }
  }
}
}A5x_{
  "schematics": {
    "explicit-standalone-flag": {
      "version": "19.0.0",
      "description": "Updates non-standalone Directives, Component and Pipes to 'standalone:false' and removes 'standalone:true' from those who are standalone",
      "factory": "./bundles/explicit-standalone-flag.cjs#migrate"
    },
    "pending-tasks": {
      "version": "19.0.0",
      "description": "Updates ExperimentalPendingTasks to PendingTasks",
      "factory": "./bundles/pending-tasks.cjs#migrate"
    },
    "provide-initializer": {
      "version": "19.0.0",
      "description": "Replaces `APP_INITIALIZER`, `ENVIRONMENT_INITIALIZER` & `PLATFORM_INITIALIZER` respectively with `provideAppInitializer`, `provideEnvironmentInitializer` & `providePlatformInitializer`.",
      "factory": "./bundles/provide-initializer.cjs#migrate",
      "optional": true
    }
  }
}
x6x 8{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "AngularCleanupUnusedImportsMigration",
  "title": "Angular Cleanup Unused Imports Schema",
  "type": "object",
  "properties": {}
}
4&@xbx){
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "AngularInjectMigration",
  "title": "Angular Inject Migration Schema",
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Path relative to the project root which should be migrated",
      "x-prompt": "Which path in your project should be migrated?",
      "default": "./"
    },
    "migrateAbstractClasses": {
      "type": "boolean",
      "description": "Whether abstract classes should be migrated",
      "x-prompt": "Do you want to migrate abstract classes? Abstract classes are not migrated by default, because their parameters aren't guaranteed to be injectable",
      "default": false
    },
    "backwardsCompatibleConstructors": {
      "type": "boolean",
      "description": "Whether to clean up constructors or keep their signatures backwards compatible",
      "x-prompt": "Do you want to clean up all constructors or keep them backwards compatible? Enabling this option will include an additional signature of `constructor(...args: unknown[]);` that will avoid errors for sub-classes, but will increase the amount of generated code by the migration",
      "default": false
    },
    "nonNullableOptional": {
      "type": "boolean",
      "description": "Whether to cast the optional inject sites to be non-nullable",
      "x-prompt": "Do you want optional inject calls to be non-nullable? Enable this option if you want the return type to be identical to @Optional(), at the expense of worse type safety",
      "default": false
    }
  }
}
$6x <JControlFlowP Control Flowvformat4Enables reformatting of your templates",
      "x-prompt": "Should the migration reformat your templates?",
      "default": "true"
    }
  }
}
@ﲄxB{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "AngularSignalMigration",
  "title": "Angular Signals migration",
  "type": "object",
  "properties": {
    "migrations": {
      "type": "array",
      "default": [
        "inputs",
        "outputs",
        "queries"
      ],
      "items": {
        "type": "string",
        "enum": [
          "inputs",
          "outputs",
          "queries"
        ]
      },
      "description": "Signals-related migrations that should be run",
      "x-prompt": {
        "message": "Which migrations do you want to run?",
        "type": "list",
        "multiselect": true,
        "items": [
          {
            "value": "inputs",
            "label": "Convert `@Input` to the signal-based `input`"
          },
          {
            "value": "outputs",
            "label": "Convert `@Output` to the new `output` function"
          },
          {
            "value": "queries",
            "label": "Convert `@ViewChild`/`@ViewChildren` and `@ContentChild`/`@ContentChildren` to the signal-based `viewChild`/`viewChildren` and `contentChild`/`contentChildren`"
          }
        ]
      }
    },
    "path": {
      "type": "string",
      "description": "Path to the directory that should be migrated.",
      "x-prompt": "Which directory do you want to migrate?",
      "default": "./"
    },
    "analysisDir": {
      "type": "string",
      "description": "Path to the directory that should be analyzed. Useful for larger projects if the analysis takes too long and the analysis scope can be narrowed.",
      "default": "./"
    },
    "bestEffortMode": {
      "type": "boolean",
      "description": "Whether to eagerly migrate as much as possible, ignoring problematic patterns that would otherwise prevent migration.",
      "x-prompt": "Do you want to migrate as much as possible, even if it may break your build?",
      "default": false
    },
    "insertTodos": {
      "type": "boolean",
      "description": "Whether the migration should add TODOs for code that could not be migrated",
      "default": false
    }
  }
}
ֿkPx w	PQueriesP& Queriev9Mwhere all queries@References to migrated queries are migrated based on this folder1queriesA2ux8 	JOutputW Outputoutputoutput
  }
}
\^xO 	KelfClosingTagW! elf Closing Tag Migration Schematemplatq
  }
}
rQ<x7 		PInputW'InputinputinputTinputuB:KxJ{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "AngularStandaloneMigration",
  "title": "Angular Standalone Migration Schema",
  "type": "object",
  "properties": {
    "mode": {
      "description": "Operation that should be performed by the migrator",
      "type": "string",
      "enum": ["convert-to-standalone", "prune-ng-modules", "standalone-bootstrap"],
      "default": "convert-to-standalone",
      "x-prompt": {
        "message": "Choose the type of migration:",
        "type": "list",
        "items": [
          {
            "value": "convert-to-standalone",
            "label": "Convert all components, directives and pipes to standalone"
          },
          {
            "value": "prune-ng-modules",
            "label": "Remove unnecessary NgModule classes"
          },
          {
            "value": "standalone-bootstrap",
            "label": "Bootstrap the application using standalone APIs"
          }
        ]
      }
    },
    "path": {
      "type": "string",
      "description": "Path relative to the project root which should be migrated",
      "x-prompt": "Which path in your project should be migrated?",
      "default": "./"
    }
  }
}
	_/Bx 	TRoutesT+Routes~?ڬxc'/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

import * as _angular_core from '@angular/core';
import { ɵDeferBlockDetails as _DeferBlockDetails, ɵDeferBlockState as _DeferBlockState, ComponentRef, DebugElement, ElementRef, ChangeDetectorRef, NgZone, SchemaMetadata, ɵDeferBlockBehavior as _DeferBlockBehavior, InjectionToken, PlatformRef, Type, ProviderToken, InjectOptions, InjectFlags, NgModule, Component, Directive, Pipe } from '@angular/core';
export { ɵDeferBlockBehavior as DeferBlockBehavior, ɵDeferBlockState as DeferBlockState } from '@angular/core';
import { Navigation, NavigationHistoryEntry, NavigationNavigateOptions, NavigationResult, NavigationOptions, NavigateEvent, NavigationCurrentEntryChangeEvent, NavigationTransition, NavigationUpdateCurrentEntryOptions, NavigationReloadOptions } from '../navigation_types.d-fAxd92YV.js';

/**
 * Wraps a test function in an asynchronous test zone. The test will automatically
 * complete when all asynchronous calls within this zone are done. Can be used
 * to wrap an {@link inject} call.
 *
 * Example:
 *
 * ```ts
 * it('...', waitForAsync(inject([AClass], (object) => {
 *   object.doSomething.then(() => {
 *     expect(...);
 *   })
 * })));
 * ```
 *
 * @publicApi
 */
declare function waitForAsync(fn: Function): (done: any) => any;

/**
 * Represents an individual defer block for testing purposes.
 *
 * @publicApi
 */
declare class DeferBlockFixture {
    private block;
    private componentFixture;
    /** @docs-private */
    constructor(block: _DeferBlockDetails, componentFixture: ComponentFixture<unknown>);
    /**
     * Renders the specified state of the defer fixture.
     * @param state the defer state to render
     */
    render(state: _DeferBlockState): Promise<void>;
    /**
     * Retrieves all nested child defer block fixtures
     * in a given defer block.
     */
    getDeferBlocks(): Promise<DeferBlockFixture[]>;
}

/**
 * Fixture for debugging and testing a component.
 *
 * @publicApi
 */
declare class ComponentFixture<T> {
    componentRef: ComponentRef<T>;
    /**
     * The DebugElement associated with the root element of this component.
     */
    debugElement: DebugElement;
    /**
     * The instance of the root component class.
     */
    componentInstance: T;
    /**
     * The native element at the root of the component.
     */
    nativeElement: any;
    /**
     * The ElementRef for the element at the root of the component.
     */
    elementRef: ElementRef;
    /**
     * The ChangeDetectorRef for the component
     */
    changeDetectorRef: ChangeDetectorRef;
    private _renderer;
    private _isDestroyed;
    private readonly _testAppRef;
    private readonly pendingTasks;
    private readonly appErrorHandler;
    private readonly zonelessEnabled;
    private readonly scheduler;
    private readonly rootEffectScheduler;
    private readonly microtaskEffectScheduler;
    private readonly autoDetectDefault;
    private autoDetect;
    private subscriptions;
    ngZone: NgZone | null;
    /** @docs-private */
    constructor(componentRef: ComponentRef<T>);
    /**
     * Trigger a change detection cycle for the component.
     */
    detectChanges(checkNoChanges?: boolean): void;
    /**
     * Do a change detection run to make sure there were no changes.
     */
    checkNoChanges(): void;
    /**
     * Set whether the fixture should autodetect changes.
     *
     * Also runs detectChanges once so that any existing change is detected.
     *
     * @param autoDetect Whether to autodetect changes. By default, `true`.
     */
    autoDetectChanges(autoDetect?: boolean): void;
    /**
     * Return whether the fixture is currently stable or has async tasks that have not been completed
     * yet.
     */
    isStable(): boolean;
    /**
     * Get a promise that resolves when the fixture is stable.
     *
     * This can be used to resume testing after events have triggered asynchronous activity or
     * asynchronous change detection.
     */
    whenStable(): Promise<any>;
    /**
     * Retrieves all defer block fixtures in the component fixture.
     */
    getDeferBlocks(): Promise<DeferBlockFixture[]>;
    private _getRenderer;
    /**
     * Get a promise that resolves when the ui state is stable following animations.
     */
    whenRenderingDone(): Promise<any>;
    /**
     * Trigger component destruction.
     */
    destroy(): void;
}

/**
 * Clears out the shared fake async zone for a test.
 * To be called in a global `beforeEach`.
 *
 * @publicApi
 */
declare function resetFakeAsyncZone(): void;
/**
 * Wraps a function to be executed in the `fakeAsync` zone:
 * - Microtasks are manually executed by calling `flushMicrotasks()`.
 * - Timers are synchronous; `tick()` simulates the asynchronous passage of time.
 *
 * Can be used to wrap `inject()` calls.
 *
 * @param fn The function that you want to wrap in the `fakeAsync` zone.
 * @param options
 *   - flush: When true, will drain the macrotask queue after the test function completes.
 *     When false, will throw an exception at the end of the function if there are pending timers.
 *
 * @usageNotes
 * ### Example
 *
 * {@example core/testing/ts/fake_async.ts region='basic'}
 *
 *
 * @returns The function wrapped to be executed in the `fakeAsync` zone.
 * Any arguments passed when calling this returned function will be passed through to the `fn`
 * function in the parameters when it is called.
 *
 * @publicApi
 */
declare function fakeAsync(fn: Function, options?: {
    flush?: boolean;
}): (...args: any[]) => any;
/**
 * Simulates the asynchronous passage of time for the timers in the `fakeAsync` zone.
 *
 * The microtasks queue is drained at the very start of this function and after any timer callback
 * has been executed.
 *
 * @param millis The number of milliseconds to advance the virtual timer.
 * @param tickOptions The options to pass to the `tick()` function.
 *
 * @usageNotes
 *
 * The `tick()` option is a flag called `processNewMacroTasksSynchronously`,
 * which determines whether or not to invoke new macroTasks.
 *
 * If you provide a `tickOptions` object, but do not specify a
 * `processNewMacroTasksSynchronously` property (`tick(100, {})`),
 * then `processNewMacroTasksSynchronously` defaults to true.
 *
 * If you omit the `tickOptions` parameter (`tick(100))`), then
 * `tickOptions` defaults to `{processNewMacroTasksSynchronously: true}`.
 *
 * ### Example
 *
 * {@example core/testing/ts/fake_async.ts region='basic'}
 *
 * The following example includes a nested timeout (new macroTask), and
 * the `tickOptions` parameter is allowed to default. In this case,
 * `processNewMacroTasksSynchronously` defaults to true, and the nested
 * function is executed on each tick.
 *
 * ```ts
 * it ('test with nested setTimeout', fakeAsync(() => {
 *   let nestedTimeoutInvoked = false;
 *   function funcWithNestedTimeout() {
 *     setTimeout(() => {
 *       nestedTimeoutInvoked = true;
 *     });
 *   };
 *   setTimeout(funcWithNestedTimeout);
 *   tick();
 *   expect(nestedTimeoutInvoked).toBe(true);
 * }));
 * ```
 *
 * In the following case, `processNewMacroTasksSynchronously` is explicitly
 * set to false, so the nested timeout function is not invoked.
 *
 * ```ts
 * it ('test with nested setTimeout', fakeAsync(() => {
 *   let nestedTimeoutInvoked = false;
 *   function funcWithNestedTimeout() {
 *     setTimeout(() => {
 *       nestedTimeoutInvoked = true;
 *     });
 *   };
 *   setTimeout(funcWithNestedTimeout);
 *   tick(0, {processNewMacroTasksSynchronously: false});
 *   expect(nestedTimeoutInvoked).toBe(false);
 * }));
 * ```
 *
 *
 * @publicApi
 */
declare function tick(millis?: number, tickOptions?: {
    processNewMacroTasksSynchronously: boolean;
}): void;
/**
 * Flushes any pending microtasks and simulates the asynchronous passage of time for the timers in
 * the `fakeAsync` zone by
 * draining the macrotask queue until it is empty.
 *
 * @param maxTurns The maximum number of times the scheduler attempts to clear its queue before
 *     throwing an error.
 * @returns The simulated time elapsed, in milliseconds.
 *
 * @publicApi
 */
declare function flush(maxTurns?: number): number;
/**
 * Discard all remaining periodic tasks.
 *
 * @publicApi
 */
declare function discardPeriodicTasks(): void;
/**
 * Flush any pending microtasks.
 *
 * @publicApi
 */
declare function flushMicrotasks(): void;

/**
 * Type used for modifications to metadata
 *
 * @publicApi
 */
type MetadataOverride<T> = {
    add?: Partial<T>;
    remove?: Partial<T>;
    set?: Partial<T>;
};

/**
 * An abstract class for inserting the root test component element in a platform independent way.
 *
 * @publicApi
 */
declare class TestComponentRenderer {
    insertRootElement(rootElementId: string): void;
    removeAllRootElements?(): void;
}
/**
 * @publicApi
 */
declare const ComponentFixtureAutoDetect: InjectionToken<boolean>;
/**
 * @publicApi
 */
declare const ComponentFixtureNoNgZone: InjectionToken<boolean>;
/**
 * @publicApi
 */
interface TestModuleMetadata {
    providers?: any[];
    declarations?: any[];
    imports?: any[];
    schemas?: Array<SchemaMetadata | any[]>;
    teardown?: ModuleTeardownOptions;
    /**
     * Whether NG0304 runtime errors should be thrown when unknown elements are present in component's
     * template. Defaults to `false`, where the error is simply logged. If set to `true`, the error is
     * thrown.
     * @see [NG8001](/errors/NG8001) for the description of the problem and how to fix it
     */
    errorOnUnknownElements?: boolean;
    /**
     * Whether errors should be thrown when unknown properties are present in component's template.
     * Defaults to `false`, where the error is simply logged.
     * If set to `true`, the error is thrown.
     * @see [NG8002](/errors/NG8002) for the description of the error and how to fix it
     */
    errorOnUnknownProperties?: boolean;
    /**
     * Whether errors that happen during application change detection should be rethrown.
     *
     * When `true`, errors that are caught during application change detection will
     * be reported to the `ErrorHandler` and rethrown to prevent them from going
     * unnoticed in tests.
     *
     * When `false`, errors are only forwarded to the `ErrorHandler`, which by default
     * simply logs them to the console.
     *
     * Defaults to `true`.
     */
    rethrowApplicationErrors?: boolean;
    /**
     * Whether defer blocks should behave with manual triggering or play through normally.
     * Defaults to `manual`.
     */
    deferBlockBehavior?: _DeferBlockBehavior;
}
/**
 * @publicApi
 */
interface TestEnvironmentOptions {
    /**
     * Configures the test module teardown behavior in `TestBed`.
     */
    teardown?: ModuleTeardownOptions;
    /**
     * Whether errors should be thrown when unknown elements are present in component's template.
     * Defaults to `false`, where the error is simply logged.
     * If set to `true`, the error is thrown.
     * @see [NG8001](/errors/NG8001) for the description of the error and how to fix it
     */
    errorOnUnknownElements?: boolean;
    /**
     * Whether errors should be thrown when unknown properties are present in component's template.
     * Defaults to `false`, where the error is simply logged.
     * If set to `true`, the error is thrown.
     * @see [NG8002](/errors/NG8002) for the description of the error and how to fix it
     */
    errorOnUnknownProperties?: boolean;
}
/**
 * Configures the test module teardown behavior in `TestBed`.
 * @publicApi
 */
interface ModuleTeardownOptions {
    /** Whether the test module should be destroyed after every test. Defaults to `true`. */
    destroyAfterEach: boolean;
    /** Whether errors during test module destruction should be re-thrown. Defaults to `true`. */
    rethrowErrors?: boolean;
}

/**
 * Static methods implemented by the `TestBed`.
 *
 * @publicApi
 */
interface TestBedStatic extends TestBed {
    new (...args: any[]): TestBed;
}
/**
 * Returns a singleton of the `TestBed` class.
 *
 * @publicApi
 */
declare function getTestBed(): TestBed;
/**
 * @publicApi
 */
interface TestBed {
    get platform(): PlatformRef;
    get ngModule(): Type<any> | Type<any>[];
    /**
     * Initialize the environment for testing with a compiler factory, a PlatformRef, and an
     * angular module. These are common to every test in the suite.
     *
     * This may only be called once, to set up the common providers for the current test
     * suite on the current platform. If you absolutely need to change the providers,
     * first use `resetTestEnvironment`.
     *
     * Test modules and platforms for individual platforms are available from
     * '@angular/<platform_name>/testing'.
     */
    initTestEnvironment(ngModule: Type<any> | Type<any>[], platform: PlatformRef, options?: TestEnvironmentOptions): void;
    /**
     * Reset the providers for the test injector.
     */
    resetTestEnvironment(): void;
    resetTestingModule(): TestBed;
    configureCompiler(config: {
        providers?: any[];
        useJit?: boolean;
    }): void;
    configureTestingModule(moduleDef: TestModuleMetadata): TestBed;
    compileComponents(): Promise<any>;
    inject<T>(token: ProviderToken<T>, notFoundValue: undefined, options: InjectOptions & {
        optional?: false;
    }): T;
    inject<T>(token: ProviderToken<T>, notFoundValue: null | undefined, options: InjectOptions): T | null;
    inject<T>(token: ProviderToken<T>, notFoundValue?: T, options?: InjectOptions): T;
    /** @deprecated use object-based flags (`InjectOptions`) instead. */
    inject<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): T;
    /** @deprecated use object-based flags (`InjectOptions`) instead. */
    inject<T>(token: ProviderToken<T>, notFoundValue: null, flags?: InjectFlags): T | null;
    /** @deprecated from v9.0.0 use TestBed.inject */
    get<T>(token: ProviderToken<T>, notFoundValue?: T, flags?: InjectFlags): any;
    /** @deprecated from v9.0.0 use TestBed.inject */
    get(token: any, notFoundValue?: any): any;
    /**
     * Runs the given function in the `EnvironmentInjector` context of `TestBed`.
     *
     * @see {@link EnvironmentInjector#runInContext}
     */
    runInInjectionContext<T>(fn: () => T): T;
    execute(tokens: any[], fn: Function, context?: any): any;
    overrideModule(ngModule: Type<any>, override: MetadataOverride<NgModule>): TestBed;
    overrideComponent(component: Type<any>, override: MetadataOverride<Component>): TestBed;
    overrideDirective(directive: Type<any>, override: MetadataOverride<Directive>): TestBed;
    overridePipe(pipe: Type<any>, override: MetadataOverride<Pipe>): TestBed;
    overrideTemplate(component: Type<any>, template: string): TestBed;
    /**
     * Overwrites all providers for the given token with the given provider definition.
     */
    overrideProvider(token: any, provider: {
        useFactory: Function;
        deps: any[];
        multi?: boolean;
    }): TestBed;
    overrideProvider(token: any, provider: {
        useValue: any;
        multi?: boolean;
    }): TestBed;
    overrideProvider(token: any, provider: {
        useFactory?: Function;
        useValue?: any;
        deps?: any[];
        multi?: boolean;
    }): TestBed;
    overrideTemplateUsingTestingModule(component: Type<any>, template: string): TestBed;
    createComponent<T>(component: Type<T>): ComponentFixture<T>;
    /**
     * Execute any pending effects.
     *
     * @developerPreview
     */
    flushEffects(): void;
}
/**
 * @description
 * Configures and initializes environment for unit testing and provides methods for
 * creating components and services in unit tests.
 *
 * `TestBed` is the primary api for writing unit tests for Angular applications and libraries.
 *
 * @publicApi
 */
declare const TestBed: TestBedStatic;
/**
 * Allows injecting dependencies in `beforeEach()` and `it()`. Note: this function
 * (imported from the `@angular/core/testing` package) can **only** be used to inject dependencies
 * in tests. To inject dependencies in your application code, use the [`inject`](api/core/inject)
 * function from the `@angular/core` package instead.
 *
 * Example:
 *
 * ```ts
 * beforeEach(inject([Dependency, AClass], (dep, object) => {
 *   // some code that uses `dep` and `object`
 *   // ...
 * }));
 *
 * it('...', inject([AClass], (object) => {
 *   object.doSomething();
 *   expect(...);
 * })
 * ```
 *
 * @publicApi
 */
declare function inject(tokens: any[], fn: Function): () => any;
/**
 * @publicApi
 */
declare class InjectSetupWrapper {
    private _moduleDef;
    constructor(_moduleDef: () => TestModuleMetadata);
    private _addModule;
    inject(tokens: any[], fn: Function): () => any;
}
/**
 * @publicApi
 */
declare function withModule(moduleDef: TestModuleMetadata): InjectSetupWrapper;
declare function withModule(moduleDef: TestModuleMetadata, fn: Function): () => any;

/**
 * This API should be removed. But doing so seems to break `google3` and so it requires a bit of
 * investigation.
 *
 * A work around is to mark it as `@codeGenApi` for now and investigate later.
 *
 * @codeGenApi
 */
declare const __core_private_testing_placeholder__ = "";

declare class MetadataOverrider {
    private _references;
    /**
     * Creates a new instance for the given metadata class
     * based on an old instance and overrides.
     */
    overrideMetadata<C extends T, T>(metadataClass: {
        new (options: T): C;
    }, oldMetadata: C, override: MetadataOverride<T>): C;
}

/**
 * Fake implementation of user agent history and navigation behavior. This is a
 * high-fidelity implementation of browser behavior that attempts to emulate
 * things like traversal delay.
 */
declare class FakeNavigation implements Navigation {
    /**
     * The fake implementation of an entries array. Only same-document entries
     * allowed.
     */
    private readonly entriesArr;
    /**
     * The current active entry index into `entriesArr`.
     */
    private currentEntryIndex;
    /**
     * A Map of pending traversals, so that traversals to the same entry can be
     * re-used.
     */
    private readonly traversalQueue;
    /**
     * A Promise that resolves when the previous traversals have finished. Used to
     * simulate the cross-process communication necessary for traversals.
     */
    private nextTraversal;
    /**
     * A prospective current active entry index, which includes unresolved
     * traversals. Used by `go` to determine where navigations are intended to go.
     */
    private prospectiveEntryIndex;
    /**
     * A test-only option to make traversals synchronous, rather than emulate
     * cross-process communication.
     */
    private synchronousTraversals;
    /** Whether to allow a call to setInitialEntryForTesting. */
    private canSetInitialEntry;
    /** The next unique id for created entries. Replace recreates this id. */
    private nextId;
    /** The next unique key for created entries. Replace inherits this id. */
    private nextKey;
    /** Whether this fake is disposed. */
    private disposed;
    /** Equivalent to `navigation.currentEntry`. */
    get currentEntry(): FakeNavigationHistoryEntry;
    get canGoBack(): boolean;
    get canGoForward(): boolean;
    private readonly createEventTarget;
    private readonly _window;
    get window(): Pick<Window, 'addEventListener' | 'removeEventListener'>;
    constructor(doc: Document, startURL: `http${string}`);
    /**
     * Sets the initial entry.
     */
    setInitialEntryForTesting(url: `http${string}`, options?: {
        historyState: unknown;
        state?: unknown;
    }): void;
    /** Returns whether the initial entry is still eligible to be set. */
    canSetInitialEntryForTesting(): boolean;
    /**
     * Sets whether to emulate traversals as synchronous rather than
     * asynchronous.
     */
    setSynchronousTraversalsForTesting(synchronousTraversals: boolean): void;
    /** Equivalent to `navigation.entries()`. */
    entries(): FakeNavigationHistoryEntry[];
    /** Equivalent to `navigation.navigate()`. */
    navigate(url: string, options?: NavigationNavigateOptions): FakeNavigationResult;
    /** Equivalent to `history.pushState()`. */
    pushState(data: unknown, title: string, url?: string): void;
    /** Equivalent to `history.replaceState()`. */
    replaceState(data: unknown, title: string, url?: string): void;
    private pushOrReplaceState;
    /** Equivalent to `navigation.traverseTo()`. */
    traverseTo(key: string, options?: NavigationOptions): FakeNavigationResult;
    /** Equivalent to `navigation.back()`. */
    back(options?: NavigationOptions): FakeNavigationResult;
    /** Equivalent to `navigation.forward()`. */
    forward(options?: NavigationOptions): FakeNavigationResult;
    /**
     * Equivalent to `history.go()`.
     * Note that this method does not actually work precisely to how Chrome
     * does, instead choosing a simpler model with less unexpected behavior.
     * Chrome has a few edge case optimizations, for instance with repeated
     * `back(); forward()` chains it collapses certain traversals.
     */
    go(direction: number): void;
    /** Runs a traversal synchronously or asynchronously */
    private runTraversal;
    /** Equivalent to `navigation.addEventListener()`. */
    addEventListener(type: string, callback: EventListenerOrEventListenerObject, options?: AddEventListenerOptions | boolean): void;
    /** Equivalent to `navigation.removeEventListener()`. */
    removeEventListener(type: string, callback: EventListenerOrEventListenerObject, options?: EventListenerOptions | boolean): void;
    /** Equivalent to `navigation.dispatchEvent()` */
    dispatchEvent(event: Event): boolean;
    /** Cleans up resources. */
    dispose(): void;
    /** Returns whether this fake is disposed. */
    isDisposed(): boolean;
    /**
     * Implementation for all navigations and traversals.
     * @returns true if the event was intercepted, otherwise false
     */
    private userAgentNavigate;
    /** Utility method for finding entries with the given `key`. */
    private findEntry;
    set onnavigate(_handler: ((this: Navigation, ev: NavigateEvent) => any) | null);
    get onnavigate(): ((this: Navigation, ev: NavigateEvent) => any) | null;
    set oncurrententrychange(_handler: // tslint:disable-next-line:no-any
    ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null);
    get oncurrententrychange(): // tslint:disable-next-line:no-any
    ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null;
    set onnavigatesuccess(_handler: ((this: Navigation, ev: Event) => any) | null);
    get onnavigatesuccess(): ((this: Navigation, ev: Event) => any) | null;
    set onnavigateerror(_handler: ((this: Navigation, ev: ErrorEvent) => any) | null);
    get onnavigateerror(): ((this: Navigation, ev: ErrorEvent) => any) | null;
    private _transition;
    get transition(): NavigationTransition | null;
    updateCurrentEntry(_options: NavigationUpdateCurrentEntryOptions): void;
    reload(_options?: NavigationReloadOptions): NavigationResult;
}
/**
 * Fake equivalent of the `NavigationResult` interface with
 * `FakeNavigationHistoryEntry`.
 */
interface FakeNavigationResult extends NavigationResult {
    readonly committed: Promise<FakeNavigationHistoryEntry>;
    readonly finished: Promise<FakeNavigationHistoryEntry>;
}
/**
 * Fake equivalent of `NavigationHistoryEntry`.
 */
declare class FakeNavigationHistoryEntry implements NavigationHistoryEntry {
    private eventTarget;
    readonly url: string | null;
    readonly sameDocument: boolean;
    readonly id: string;
    readonly key: string;
    readonly index: number;
    private readonly state;
    private readonly historyState;
    ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null;
    constructor(eventTarget: EventTarget, url: string | null, { id, key, index, sameDocument, state, historyState, }: {
        id: string;
        key: string;
        index: number;
        sameDocument: boolean;
        historyState: unknown;
        state?: unknown;
    });
    getState(): unknown;
    getHistoryState(): unknown;
    addEventListener(type: string, callback: EventListenerOrEventListenerObject, options?: AddEventListenerOptions | boolean): void;
    removeEventListener(type: string, callback: EventListenerOrEventListenerObject, options?: EventListenerOptions | boolean): void;
    dispatchEvent(event: Event): boolean;
    /** internal */
    dispose(): void;
}

declare class Log<T = string> {
    logItems: T[];
    constructor();
    add(value: T): void;
    fn(value: T): () => void;
    clear(): void;
    result(): string;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<Log<any>, never>;
    static ɵprov: _angular_core.ɵɵInjectableDeclaration<Log<any>>;
}

export { ComponentFixture, ComponentFixtureAutoDetect, ComponentFixtureNoNgZone, DeferBlockFixture, InjectSetupWrapper, TestBed, TestComponentRenderer, __core_private_testing_placeholder__, discardPeriodicTasks, fakeAsync, flush, flushMicrotasks, getTestBed, inject, resetFakeAsyncZone, tick, waitForAsync, withModule, FakeNavigation as ɵFakeNavigation, Log as ɵLog, MetadataOverrider as ɵMetadataOverrider };
export type { MetadataOverride, ModuleTeardownOptions, TestBedStatic, TestEnvironmentOptions, TestModuleMetadata };
(x!3/**
 * @license Angular v19.2.14
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */

/**
 * A comparison function which can determine if two values are equal.
 */
type ValueEqualityFn<T> = (a: T, b: T) => boolean;
/**
 * The default equality function used for `signal` and `computed`, which uses referential equality.
 */
declare function defaultEquals<T>(a: T, b: T): boolean;

type Version = number & {
    __brand: 'Version';
};
/**
 * Symbol used to tell `Signal`s apart from other functions.
 *
 * This can be used to auto-unwrap signals in various cases, or to auto-wrap non-signal values.
 */
declare const SIGNAL: unique symbol;
declare function setActiveConsumer(consumer: ReactiveNode | null): ReactiveNode | null;
declare function getActiveConsumer(): ReactiveNode | null;
declare function isInNotificationPhase(): boolean;
interface Reactive {
    [SIGNAL]: ReactiveNode;
}
declare function isReactive(value: unknown): value is Reactive;
declare const REACTIVE_NODE: ReactiveNode;
/**
 * A producer and/or consumer which participates in the reactive graph.
 *
 * Producer `ReactiveNode`s which are accessed when a consumer `ReactiveNode` is the
 * `activeConsumer` are tracked as dependencies of that consumer.
 *
 * Certain consumers are also tracked as "live" consumers and create edges in the other direction,
 * from producer to consumer. These edges are used to propagate change notifications when a
 * producer's value is updated.
 *
 * A `ReactiveNode` may be both a producer and consumer.
 */
interface ReactiveNode {
    /**
     * Version of the value that this node produces.
     *
     * This is incremented whenever a new value is produced by this node which is not equal to the
     * previous value (by whatever definition of equality is in use).
     */
    version: Version;
    /**
     * Epoch at which this node is verified to be clean.
     *
     * This allows skipping of some polling operations in the case where no signals have been set
     * since this node was last read.
     */
    lastCleanEpoch: Version;
    /**
     * Whether this node (in its consumer capacity) is dirty.
     *
     * Only live consumers become dirty, when receiving a change notification from a dependency
     * producer.
     */
    dirty: boolean;
    /**
     * Producers which are dependencies of this consumer.
     *
     * Uses the same indices as the `producerLastReadVersion` and `producerIndexOfThis` arrays.
     */
    producerNode: ReactiveNode[] | undefined;
    /**
     * `Version` of the value last read by a given producer.
     *
     * Uses the same indices as the `producerNode` and `producerIndexOfThis` arrays.
     */
    producerLastReadVersion: Version[] | undefined;
    /**
     * Index of `this` (consumer) in each producer's `liveConsumers` array.
     *
     * This value is only meaningful if this node is live (`liveConsumers.length > 0`). Otherwise
     * these indices are stale.
     *
     * Uses the same indices as the `producerNode` and `producerLastReadVersion` arrays.
     */
    producerIndexOfThis: number[] | undefined;
    /**
     * Index into the producer arrays that the next dependency of this node as a consumer will use.
     *
     * This index is zeroed before this node as a consumer begins executing. When a producer is read,
     * it gets inserted into the producers arrays at this index. There may be an existing dependency
     * in this location which may or may not match the incoming producer, depending on whether the
     * same producers were read in the same order as the last computation.
     */
    nextProducerIndex: number;
    /**
     * Array of consumers of this producer that are "live" (they require push notifications).
     *
     * `liveConsumerNode.length` is effectively our reference count for this node.
     */
    liveConsumerNode: ReactiveNode[] | undefined;
    /**
     * Index of `this` (producer) in each consumer's `producerNode` array.
     *
     * Uses the same indices as the `liveConsumerNode` array.
     */
    liveConsumerIndexOfThis: number[] | undefined;
    /**
     * Whether writes to signals are allowed when this consumer is the `activeConsumer`.
     *
     * This is used to enforce guardrails such as preventing writes to writable signals in the
     * computation function of computed signals, which is supposed to be pure.
     */
    consumerAllowSignalWrites: boolean;
    readonly consumerIsAlwaysLive: boolean;
    /**
     * Tracks whether producers need to recompute their value independently of the reactive graph (for
     * example, if no initial value has been computed).
     */
    producerMustRecompute(node: unknown): boolean;
    producerRecomputeValue(node: unknown): void;
    consumerMarkedDirty(node: unknown): void;
    /**
     * Called when a signal is read within this consumer.
     */
    consumerOnSignalRead(node: unknown): void;
    /**
     * A debug name for the reactive node. Used in Angular DevTools to identify the node.
     */
    debugName?: string;
    /**
     * Kind of node. Example: 'signal', 'computed', 'input', 'effect'.
     *
     * ReactiveNode has this as 'unknown' by default, but derived node types should override this to
     * make available the kind of signal that particular instance of a ReactiveNode represents.
     *
     * Used in Angular DevTools to identify the kind of signal.
     */
    kind: string;
}
/**
 * Called by implementations when a producer's signal is read.
 */
declare function producerAccessed(node: ReactiveNode): void;
/**
 * Increment the global epoch counter.
 *
 * Called by source producers (that is, not computeds) whenever their values change.
 */
declare function producerIncrementEpoch(): void;
/**
 * Ensure this producer's `version` is up-to-date.
 */
declare function producerUpdateValueVersion(node: ReactiveNode): void;
/**
 * Propagate a dirty notification to live consumers of this producer.
 */
declare function producerNotifyConsumers(node: ReactiveNode): void;
/**
 * Whether this `ReactiveNode` in its producer capacity is currently allowed to initiate updates,
 * based on the current consumer context.
 */
declare function producerUpdatesAllowed(): boolean;
declare function consumerMarkDirty(node: ReactiveNode): void;
declare function producerMarkClean(node: ReactiveNode): void;
/**
 * Prepare this consumer to run a computation in its reactive context.
 *
 * Must be called by subclasses which represent reactive computations, before those computations
 * begin.
 */
declare function consumerBeforeComputation(node: ReactiveNode | null): ReactiveNode | null;
/**
 * Finalize this consumer's state after a reactive computation has run.
 *
 * Must be called by subclasses which represent reactive computations, after those computations
 * have finished.
 */
declare function consumerAfterComputation(node: ReactiveNode | null, prevConsumer: ReactiveNode | null): void;
/**
 * Determine whether this consumer has any dependencies which have changed since the last time
 * they were read.
 */
declare function consumerPollProducersForChange(node: ReactiveNode): boolean;
/**
 * Disconnect this consumer from the graph.
 */
declare function consumerDestroy(node: ReactiveNode): void;

interface SignalNode<T> extends ReactiveNode {
    value: T;
    equal: ValueEqualityFn<T>;
}
type SignalBaseGetter<T> = (() => T) & {
    readonly [SIGNAL]: unknown;
};
interface SignalGetter<T> extends SignalBaseGetter<T> {
    readonly [SIGNAL]: SignalNode<T>;
}
/**
 * Create a `Signal` that can be set or updated directly.
 */
declare function createSignal<T>(initialValue: T, equal?: ValueEqualityFn<T>): SignalGetter<T>;
declare function setPostSignalSetFn(fn: (() => void) | null): (() => void) | null;
declare function signalSetFn<T>(node: SignalNode<T>, newValue: T): void;
declare function signalUpdateFn<T>(node: SignalNode<T>, updater: (value: T) => T): void;
declare function runPostSignalSetFn(): void;
declare const SIGNAL_NODE: SignalNode<unknown>;

declare function setAlternateWeakRefImpl(impl: unknown): void;

export { REACTIVE_NODE, SIGNAL, SIGNAL_NODE, consumerAfterComputation, consumerBeforeComputation, consumerDestroy, consumerMarkDirty, consumerPollProducersForChange, createSignal, defaultEquals, getActiveConsumer, isInNotificationPhase, isReactive, producerAccessed, producerIncrementEpoch, producerMarkClean, producerNotifyConsumers, producerUpdateValueVersion, producerUpdatesAllowed, runPostSignalSetFn, setActiveConsumer, setAlternateWeakRefImpl, setPostSignalSetFn, signalSetFn, signalUpdateFn };
export type { Reactive, ReactiveNode, SignalGetter, SignalNode, ValueEqualityFn };
di(xr# Installation
> `npm install --save @types/prismjs`

# Summary
This package contains type definitions for prismjs (http://prismjs.com/).

# Details
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/prismjs.

### Additional Details
 * Last updated: Wed, 23 Oct 2024 03:36:41 GMT
 * Dependencies: none

# Credits
These definitions were written by [Michael Schmidt](https://github.com/RunDevelopment), [ExE Boss](https://github.com/ExE-Boss), [Erik Lieben](https://github.com/eriklieben), [Andre Wiggins](https://github.com/andrewiggins), and [Michał Miszczyszyn](https://github.com/typeofweb).
Ⱥ
x Uexport const core: Record<string, any>;
export const languages: Record<string, any>;
export const plugins: Record<string, any>;
export const themes: Record<string, any>;
!=x/interface LoadLanguages {
    /**
     * Set this to `true` to prevent all warning messages `loadLanguages` logs.
     *
     * @default false
     */
    silent: boolean;

    /**
     * Loads the given languages and adds them to the current Prism instance.
     *
     * If no languages are provided, _all_ Prism languages will be loaded.
     */
    (languages?: string | string[]): void;
}

declare const loadLanguages: LoadLanguages;

export = loadLanguages;
⏒x<Kexport as namespace Prism;
export const languages: Languages;
export const plugins: Record<string, any>;

/**
 * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses
 * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your
 * own worker, you don't want it to do this.
 *
 * By setting this value to `true`, Prism will not add its own listeners to the worker.
 *
 * You obviously have to change this value before Prism executes. To do this, you can add an
 * empty Prism object into the global scope before loading the Prism script like this:
 *
 * @default false
 */
export let disableWorkerMessageHandler: boolean | undefined;

/**
 * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
 * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
 * additional languages or plugins yourself.
 *
 * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.
 *
 * You obviously have to change this value before the automatic highlighting started. To do this, you can add an
 * empty Prism object into the global scope before loading the Prism script like this:
 *
 * @default false
 */
export let manual: boolean | undefined;

/**
 * A function which will be invoked after an element was successfully highlighted.
 *
 * @param element The element successfully highlighted.
 */
export type HighlightCallback = (element: Element) => void;

/**
 * This is the most high-level function in Prism’s API.
 * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on
 * each one of them.
 *
 * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.
 *
 * @param [async=false] Same as in {@link Prism.highlightAllUnder}.
 * @param [callback] Same as in {@link Prism.highlightAllUnder}.
 */
export function highlightAll(async?: boolean, callback?: HighlightCallback): void;

/**
 * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls
 * {@link Prism.highlightElement} on each one of them.
 *
 * The following hooks will be run:
 * 1. `before-highlightall`
 * 2. All hooks of {@link Prism.highlightElement} for each element.
 *
 * @param container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.
 * @param [async=false] Whether each element is to be highlighted asynchronously using Web Workers.
 * @param [callback] An optional callback to be invoked on each element after its highlighting is done.
 */
export function highlightAllUnder(container: ParentNode, async?: boolean, callback?: HighlightCallback): void;

/**
 * Highlights the code inside a single element.
 *
 * The following hooks will be run:
 * 1. `before-sanity-check`
 * 2. `before-highlight`
 * 3. All hooks of {@link Prism.highlightElement}. These hooks will only be run by the current worker if `async` is `true`.
 * 4. `before-insert`
 * 5. `after-highlight`
 * 6. `complete`
 *
 * @param element The element containing the code.
 * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.
 * @param [async=false] Whether the element is to be highlighted asynchronously using Web Workers
 * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is
 * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).
 *
 * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for
 * asynchronous highlighting to work. You can build your own bundle on the
 * [Download page](https://prismjs.com/download.html).
 * @param [callback] An optional callback to be invoked after the highlighting is done.
 * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.
 */
export function highlightElement(element: Element, async?: boolean, callback?: HighlightCallback): void;

/**
 * Low-level function, only use if you know what you’re doing. It accepts a string of text as input
 * and the language definitions to use, and returns a string with the HTML produced.
 *
 * The following hooks will be run:
 * 1. `before-tokenize`
 * 2. `after-tokenize`
 * 3. `wrap`: On each {@link Prism.Token}.
 *
 * @param text A string with the code to be highlighted.
 * @param grammar An object containing the tokens to use.
 *
 * Usually a language definition like `Prism.languages.markup`.
 * @param language The name of the language definition passed to `grammar`.
 * @returns The highlighted HTML.
 *
 * @example
 * Prism.highlight('var foo = true;', Prism.languages.js, 'js');
 */
export function highlight(text: string, grammar: Grammar, language: string): string;

/**
 * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input
 * and the language definitions to use, and returns an array with the tokenized code.
 *
 * When the language definition includes nested tokens, the function is called recursively on each of these tokens.
 *
 * This method could be useful in other contexts as well, as a very crude parser.
 *
 * @param text A string with the code to be highlighted.
 * @param grammar An object containing the tokens to use.
 *
 * Usually a language definition like `Prism.languages.markup`.
 * @returns An array of strings, tokens and other arrays.
 */
export function tokenize(text: string, grammar: Grammar): Array<string | Token>;

export interface Environment extends Record<string, any> {
    selector?: string | undefined;
    element?: Element | undefined;
    language?: string | undefined;
    grammar?: Grammar | undefined;
    code?: string | undefined;
    highlightedCode?: string | undefined;
    type?: string | undefined;
    content?: string | undefined;
    tag?: string | undefined;
    classes?: string[] | undefined;
    attributes?: Record<string, string> | undefined;
    parent?: Array<string | Token> | undefined;
}

export namespace util {
    interface Identifier {
        value: number;
    }

    /** Encode raw strings in tokens in preparation to display as HTML */
    function encode(tokens: TokenStream): TokenStream;

    /** Determine the type of the object */
    function type(o: null): "Null";
    function type(o: undefined): "Undefined";
    function type(o: boolean | Boolean): "Boolean"; // eslint-disable-line @typescript-eslint/no-wrapper-object-types
    function type(o: number | Number): "Number"; // eslint-disable-line @typescript-eslint/no-wrapper-object-types
    function type(o: string | String): "String"; // eslint-disable-line @typescript-eslint/no-wrapper-object-types
    function type(o: Function): "Function"; // eslint-disable-line @typescript-eslint/no-wrapper-object-types
    function type(o: RegExp): "RegExp";
    function type(o: any[]): "Array";
    function type(o: any): string;

    /** Get the unique id of this object or give it one if it does not have one */
    function objId(obj: any): Identifier;

    /** Deep clone a language definition (e.g. to extend it) */
    function clone<T>(o: T): T;
}

export type GrammarValue = RegExp | TokenObject | Array<RegExp | TokenObject>;
export type Grammar = GrammarRest | Record<string, GrammarValue>;
export interface GrammarRest {
    keyword?: GrammarValue | undefined;
    number?: GrammarValue | undefined;
    function?: GrammarValue | undefined;
    string?: GrammarValue | undefined;
    boolean?: GrammarValue | undefined;
    operator?: GrammarValue | undefined;
    punctuation?: GrammarValue | undefined;
    atrule?: GrammarValue | undefined;
    url?: GrammarValue | undefined;
    selector?: GrammarValue | undefined;
    property?: GrammarValue | undefined;
    important?: GrammarValue | undefined;
    style?: GrammarValue | undefined;
    comment?: GrammarValue | undefined;
    "class-name"?: GrammarValue | undefined;

    /**
     * An optional grammar object that will appended to this grammar.
     */
    rest?: Grammar | undefined;
}

/**
 * The expansion of a simple `RegExp` literal to support additional properties.
 */
export interface TokenObject {
    /**
     * The regular expression of the token.
     */
    pattern: RegExp;

    /**
     * If `true`, then the first capturing group of `pattern` will (effectively) behave as a lookbehind
     * group meaning that the captured text will not be part of the matched text of the new token.
     */
    lookbehind?: boolean | undefined;

    /**
     * Whether the token is greedy.
     *
     * @default false
     */
    greedy?: boolean | undefined;

    /**
     * An optional alias or list of aliases.
     */
    alias?: string | string[] | undefined;

    /**
     * The nested tokens of this token.
     *
     * This can be used for recursive language definitions.
     *
     * Note that this can cause infinite recursion.
     */
    inside?: Grammar | undefined;
}
export type Languages = LanguageMapProtocol & LanguageMap;
export interface LanguageMap {
    /**
     * Get a defined language's definition.
     */
    [language: string]: Grammar;
}
export interface LanguageMapProtocol {
    /**
     * Creates a deep copy of the language with the given id and appends the given tokens.
     *
     * If a token in `redef` also appears in the copied language, then the existing token in the copied language
     * will be overwritten at its original position.
     *
     * @param id The id of the language to extend. This has to be a key in `Prism.languages`.
     * @param redef The new tokens to append.
     * @returns The new language created.
     * @example
     * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {
     *     'color': /\b(?:red|green|blue)\b/
     * });
     */
    extend(id: string, redef: Grammar): Grammar;

    /**
     * Inserts tokens _before_ another token in a language definition or any other grammar.
     *
     * As this needs to recreate the object (we cannot actually insert before keys in object literals),
     * we cannot just provide an object, we need an object and a key.
     *
     * If the grammar of `inside` and `insert` have tokens with the same name, the tokens in `inside` will be ignored.
     *
     * All references of the old object accessible from `Prism.languages` or `insert` will be replace with the new one.
     *
     * @param inside The property of `root` that contains the object to be modified.
     *
     * This is usually a language id.
     * @param before The key to insert before.
     * @param insert An object containing the key-value pairs to be inserted.
     * @param [root] The object containing `inside`, i.e. the object that contains the object that will be modified.
     *
     * Defaults to `Prism.languages`.
     * @returns The new grammar created.
     * @example
     * Prism.languages.insertBefore('markup', 'cdata', {
     *     'style': { ... }
     * });
     */
    insertBefore(inside: string, before: string, insert: Grammar, root?: LanguageMap): Grammar;
}

export namespace hooks {
    /**
     * @param env The environment variables of the hook.
     */
    type HookCallback = (env: Environment) => void;
    type HookTypes = keyof HookEnvironmentMap;

    interface HookEnvironmentMap {
        "before-highlightall": RequiredEnvironment<"selector">;

        "before-sanity-check": ElementEnvironment;
        "before-highlight": ElementEnvironment;

        "before-insert": ElementHighlightedEnvironment;
        "after-highlight": ElementHighlightedEnvironment;
        complete: ElementHighlightedEnvironment;

        "before-tokenize": TokenizeEnvironment;
        "after-tokenize": TokenizeEnvironment;

        wrap: RequiredEnvironment<"type" | "content" | "tag" | "classes" | "attributes" | "language">;
    }

    type RequiredEnvironment<T extends keyof Environment, U extends Environment = Environment> =
        & U
        & Required<Pick<U, T>>;
    type ElementEnvironment = RequiredEnvironment<"element" | "language" | "grammar" | "code">;
    type ElementHighlightedEnvironment = RequiredEnvironment<"highlightedCode", ElementEnvironment>;
    type TokenizeEnvironment = RequiredEnvironment<"code" | "grammar" | "language">;

    interface RegisteredHooks {
        [hook: string]: HookCallback[];
    }

    const all: RegisteredHooks;

    /**
     * Adds the given callback to the list of callbacks for the given hook.
     *
     * The callback will be invoked when the hook it is registered for is run.
     * Hooks are usually directly run by a highlight function but you can also run hooks yourself.
     *
     * One callback function can be registered to multiple hooks and the same hook multiple times.
     *
     * @param name The name of the hook.
     * @param callback The callback function which is given environment variables.
     */
    function add<K extends keyof HookEnvironmentMap>(name: K, callback: (env: HookEnvironmentMap[K]) => void): void;
    function add(name: string, callback: HookCallback): void;

    /**
     * Runs a hook invoking all registered callbacks with the given environment variables.
     *
     * Callbacks will be invoked synchronously and in the order in which they were registered.
     *
     * @param name The name of the hook.
     * @param env The environment variables of the hook passed to all callbacks registered.
     */
    function run<K extends keyof HookEnvironmentMap>(name: K, env: HookEnvironmentMap[K]): void;
    function run(name: string, env: Environment): void;
}

export type TokenStream = string | Token | Array<string | Token>;

export class Token {
    /**
     * Creates a new token.
     *
     * @param type See {@link Prism.Token#type type}
     * @param content See {@link Prism.Token#content content}
     * @param [alias] The alias(es) of the token.
     * @param [matchedStr=""] A copy of the full string this token was created from.
     * @param [greedy=false] See {@link Prism.Token#greedy greedy}
     */
    constructor(type: string, content: TokenStream, alias?: string | string[], matchedStr?: string, greedy?: boolean);

    /**
     * The type of the token.
     *
     * This is usually the key of a pattern in a {@link Grammar}.
     */
    type: string;

    /**
     * The strings or tokens contained by this token.
     *
     * This will be a token stream if the pattern matched also defined an `inside` grammar.
     */
    content: TokenStream;

    /**
     * The alias(es) of the token.
     *
     * @see TokenObject
     */
    alias: string | string[];

    /**
     * The length of the matched string or 0.
     */
    length: number;

    /**
     * Whether the pattern that created this token is greedy or not.
     *
     * @see TokenObject
     */
    greedy: boolean;

    /**
     * Converts the given token or token stream to an HTML representation.
     *
     * The following hooks will be run:
     * 1. `wrap`: On each {@link Prism.Token}.
     *
     * @param token The token or token stream to be converted.
     * @param language The name of current language.
     * @param [parent] The parent token stream, if any.
     * @return The HTML representation of the token or token stream.
     */
    static stringify(token: TokenStream, language: string, parent?: Array<string | Token>): string;
}
15Yx`{
    "name": "@types/prismjs",
    "version": "1.26.5",
    "description": "TypeScript definitions for prismjs",
    "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/prismjs",
    "license": "MIT",
    "contributors": [
        {
            "name": "Michael Schmidt",
            "githubUsername": "RunDevelopment",
            "url": "https://github.com/RunDevelopment"
        },
        {
            "name": "ExE Boss",
            "githubUsername": "ExE-Boss",
            "url": "https://github.com/ExE-Boss"
        },
        {
            "name": "Erik Lieben",
            "githubUsername": "eriklieben",
            "url": "https://github.com/eriklieben"
        },
        {
            "name": "Andre Wiggins",
            "githubUsername": "andrewiggins",
            "url": "https://github.com/andrewiggins"
        },
        {
            "name": "Michał Miszczyszyn",
            "githubUsername": "typeofweb",
            "url": "https://github.com/typeofweb"
        }
    ],
    "main": "",
    "types": "index.d.ts",
    "repository": {
        "type": "git",
        "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
        "directory": "types/prismjs"
    },
    "scripts": {},
    "dependencies": {},
    "peerDependencies": {},
    "typesPublisherContentHash": "cd00995a4fa9467c1dafb0979cd9ea5f3a8e2f89ea83fba6e1b0623b67c0135f",
    "typeScriptVersion": "4.8"
}rx   # Prism Changelog

## 1.29.0 (2022-08-23)

### New components

* __BBj__ ([#3511](https://github.com/PrismJS/prism/issues/3511)) [`1134bdfc`](https://github.com/PrismJS/prism/commit/1134bdfc)
* __BQN__ ([#3515](https://github.com/PrismJS/prism/issues/3515)) [`859f99a0`](https://github.com/PrismJS/prism/commit/859f99a0)
* __Cilk/C__ & __Cilk/C++__ ([#3522](https://github.com/PrismJS/prism/issues/3522)) [`c8462a29`](https://github.com/PrismJS/prism/commit/c8462a29)
* __Gradle__ ([#3443](https://github.com/PrismJS/prism/issues/3443)) [`32119823`](https://github.com/PrismJS/prism/commit/32119823)
* __METAFONT__ ([#3465](https://github.com/PrismJS/prism/issues/3465)) [`2815f699`](https://github.com/PrismJS/prism/commit/2815f699)
* __WGSL__ ([#3455](https://github.com/PrismJS/prism/issues/3455)) [`4c87d418`](https://github.com/PrismJS/prism/commit/4c87d418)

### Updated components

* __AsciiDoc__
    * Some regexes are too greedy ([#3481](https://github.com/PrismJS/prism/issues/3481)) [`c4cbeeaa`](https://github.com/PrismJS/prism/commit/c4cbeeaa)
* __Bash__
    * Added "sh" alias ([#3509](https://github.com/PrismJS/prism/issues/3509)) [`6b824d47`](https://github.com/PrismJS/prism/commit/6b824d47)
    * Added support for parameters and the `java` and `sysctl` commands. ([#3505](https://github.com/PrismJS/prism/issues/3505)) [`b9512b22`](https://github.com/PrismJS/prism/commit/b9512b22)
    * Added `cargo` command ([#3488](https://github.com/PrismJS/prism/issues/3488)) [`3e937137`](https://github.com/PrismJS/prism/commit/3e937137)
* __BBj__
    * Improve regexes ([#3512](https://github.com/PrismJS/prism/issues/3512)) [`0cad9ae5`](https://github.com/PrismJS/prism/commit/0cad9ae5)
* __CSS__
    * Fixed @-rules not accounting for strings ([#3438](https://github.com/PrismJS/prism/issues/3438)) [`0d4b6cb6`](https://github.com/PrismJS/prism/commit/0d4b6cb6)
* __CSS Extras__
    * Added support for `RebeccaPurple` color ([#3448](https://github.com/PrismJS/prism/issues/3448)) [`646b2e0a`](https://github.com/PrismJS/prism/commit/646b2e0a)
* __Hoon__
    * Fixed escaped strings ([#3473](https://github.com/PrismJS/prism/issues/3473)) [`64642716`](https://github.com/PrismJS/prism/commit/64642716)
* __Java__
    * Added support for constants ([#3507](https://github.com/PrismJS/prism/issues/3507)) [`342a0039`](https://github.com/PrismJS/prism/commit/342a0039)
* __Markup__
    * Fixed quotes in HTML attribute values ([#3442](https://github.com/PrismJS/prism/issues/3442)) [`ca8eaeee`](https://github.com/PrismJS/prism/commit/ca8eaeee)
* __NSIS__
    * Added missing commands ([#3504](https://github.com/PrismJS/prism/issues/3504)) [`b0c2a9b4`](https://github.com/PrismJS/prism/commit/b0c2a9b4)
* __Scala__
    * Updated keywords to support Scala 3 ([#3506](https://github.com/PrismJS/prism/issues/3506)) [`a090d063`](https://github.com/PrismJS/prism/commit/a090d063)
* __SCSS__
    * Fix casing in title of the `scss` lang ([#3501](https://github.com/PrismJS/prism/issues/3501)) [`2aed9ce7`](https://github.com/PrismJS/prism/commit/2aed9ce7)

### Updated plugins

* __Line Highlight__
    * Account for offset when clamping ranges ([#3518](https://github.com/PrismJS/prism/issues/3518)) [`098e3000`](https://github.com/PrismJS/prism/commit/098e3000)
    * Ignore ranges outside of actual lines ([#3475](https://github.com/PrismJS/prism/issues/3475)) [`9a4e725b`](https://github.com/PrismJS/prism/commit/9a4e725b)
* __Normalize Whitespace__
    * Add configuration via attributes ([#3467](https://github.com/PrismJS/prism/issues/3467)) [`91dea0c8`](https://github.com/PrismJS/prism/commit/91dea0c8)

### Other

* Added security policy ([#3070](https://github.com/PrismJS/prism/issues/3070)) [`05ee042a`](https://github.com/PrismJS/prism/commit/05ee042a)
* Added list of maintainers ([#3410](https://github.com/PrismJS/prism/issues/3410)) [`866b302e`](https://github.com/PrismJS/prism/commit/866b302e)
* Included githubactions in the dependabot config ([#3470](https://github.com/PrismJS/prism/issues/3470)) [`9561a9ab`](https://github.com/PrismJS/prism/commit/9561a9ab)
* Set permissions for GitHub actions ([#3468](https://github.com/PrismJS/prism/issues/3468)) [`b85e1ada`](https://github.com/PrismJS/prism/commit/b85e1ada)
* __Website__
    * Website: Added third-party tutorial for Pug template ([#3459](https://github.com/PrismJS/prism/issues/3459)) [`15272f76`](https://github.com/PrismJS/prism/commit/15272f76)
    * Docs: Add missing word ([#3489](https://github.com/PrismJS/prism/issues/3489)) [`9d603ef4`](https://github.com/PrismJS/prism/commit/9d603ef4)

## 1.28.0 (2022-04-17)

### New components

* __Ado__ & __Mata__ (Stata) ([#3383](https://github.com/PrismJS/prism/issues/3383)) [`63806d57`](https://github.com/PrismJS/prism/commit/63806d57)
* __ARM Assembly__ ([#3376](https://github.com/PrismJS/prism/issues/3376)) [`554ff324`](https://github.com/PrismJS/prism/commit/554ff324)
* __Arturo__ ([#3403](https://github.com/PrismJS/prism/issues/3403)) [`e2fe1f79`](https://github.com/PrismJS/prism/commit/e2fe1f79)
* __AWK__ & __GAWK__ ([#3374](https://github.com/PrismJS/prism/issues/3374)) [`ea8a0f40`](https://github.com/PrismJS/prism/commit/ea8a0f40)
* __Cooklang__ ([#3337](https://github.com/PrismJS/prism/issues/3337)) [`4eb928c3`](https://github.com/PrismJS/prism/commit/4eb928c3)
* __CUE__ ([#3375](https://github.com/PrismJS/prism/issues/3375)) [`a1340666`](https://github.com/PrismJS/prism/commit/a1340666)
* __gettext__ ([#3369](https://github.com/PrismJS/prism/issues/3369)) [`dfef9b61`](https://github.com/PrismJS/prism/commit/dfef9b61)
* __GNU Linker Script__ ([#3373](https://github.com/PrismJS/prism/issues/3373)) [`33f2cf95`](https://github.com/PrismJS/prism/commit/33f2cf95)
* __Odin__ ([#3424](https://github.com/PrismJS/prism/issues/3424)) [`8a3fef6d`](https://github.com/PrismJS/prism/commit/8a3fef6d)
* __PlantUML__ ([#3372](https://github.com/PrismJS/prism/issues/3372)) [`0d49553c`](https://github.com/PrismJS/prism/commit/0d49553c)
* __ReScript__ ([#3435](https://github.com/PrismJS/prism/issues/3435)) [`cbef9af7`](https://github.com/PrismJS/prism/commit/cbef9af7)
* __SuperCollider__ ([#3371](https://github.com/PrismJS/prism/issues/3371)) [`1b1d6731`](https://github.com/PrismJS/prism/commit/1b1d6731)

### Updated components

* __.properties__
    * Use `key`, `value` for token names; `attr-name`, `attr-value` as aliases ([#3377](https://github.com/PrismJS/prism/issues/3377)) [`b94a664d`](https://github.com/PrismJS/prism/commit/b94a664d)
* __ABAP__
    * Sorted keyword list ([#3368](https://github.com/PrismJS/prism/issues/3368)) [`7bda2bf1`](https://github.com/PrismJS/prism/commit/7bda2bf1)
* __Ada__
    * Changed `attr-name` to `attribute`; Use `attr-name` as alias ([#3381](https://github.com/PrismJS/prism/issues/3381)) [`cde0b5b2`](https://github.com/PrismJS/prism/commit/cde0b5b2)
    * Added `or` keyword ([#3380](https://github.com/PrismJS/prism/issues/3380)) [`c30b736f`](https://github.com/PrismJS/prism/commit/c30b736f)
* __Atmel AVR Assembly__
    * Fixed `&=` and `|=` operators ([#3395](https://github.com/PrismJS/prism/issues/3395)) [`8c4ae5a5`](https://github.com/PrismJS/prism/commit/8c4ae5a5)
* __AutoHotkey__
    * Use standard tokens ([#3385](https://github.com/PrismJS/prism/issues/3385)) [`61c460e8`](https://github.com/PrismJS/prism/commit/61c460e8)
    * Use general pattern instead of name list for directives ([#3384](https://github.com/PrismJS/prism/issues/3384)) [`7ac84dda`](https://github.com/PrismJS/prism/commit/7ac84dda)
* __CFScript__
    * Simplified operator regex ([#3396](https://github.com/PrismJS/prism/issues/3396)) [`6a215fe0`](https://github.com/PrismJS/prism/commit/6a215fe0)
* __CMake__
    * Simplified `variable` and `operator` regexes ([#3398](https://github.com/PrismJS/prism/issues/3398)) [`8e59744b`](https://github.com/PrismJS/prism/commit/8e59744b)
* __Erlang__
    * Added `begin` keyword ([#3387](https://github.com/PrismJS/prism/issues/3387)) [`cf38d059`](https://github.com/PrismJS/prism/commit/cf38d059)
* __Excel Formula__
    * Use more fitting aliases for `function-name`, `range`, and `cell` ([#3391](https://github.com/PrismJS/prism/issues/3391)) [`ef0ec02a`](https://github.com/PrismJS/prism/commit/ef0ec02a)
* __Flow__
    * Changed alias of `type` to `class-name` ([#3390](https://github.com/PrismJS/prism/issues/3390)) [`ce41434d`](https://github.com/PrismJS/prism/commit/ce41434d)
    * Recognise `[Ss]ymbol` as a type ([#3388](https://github.com/PrismJS/prism/issues/3388)) [`3916883a`](https://github.com/PrismJS/prism/commit/3916883a)
* __GEDCOM__
    * Update `tag` to `record` ([#3386](https://github.com/PrismJS/prism/issues/3386)) [`f8f95340`](https://github.com/PrismJS/prism/commit/f8f95340)
* __Groovy__
    * Added string interpolation without hook ([#3366](https://github.com/PrismJS/prism/issues/3366)) [`5617765f`](https://github.com/PrismJS/prism/commit/5617765f)
* __Handlebars__
    * Added Mustache alias ([#3422](https://github.com/PrismJS/prism/issues/3422)) [`cb5229af`](https://github.com/PrismJS/prism/commit/cb5229af)
* __Java__
    * Improved class name detection ([#3351](https://github.com/PrismJS/prism/issues/3351)) [`4cb3d038`](https://github.com/PrismJS/prism/commit/4cb3d038)
    * Fixed `record` false positives ([#3348](https://github.com/PrismJS/prism/issues/3348)) [`3bd8fdb1`](https://github.com/PrismJS/prism/commit/3bd8fdb1)
* __JavaScript__
    * Added support for new regex syntax ([#3399](https://github.com/PrismJS/prism/issues/3399)) [`ca78cde6`](https://github.com/PrismJS/prism/commit/ca78cde6)
* __Keyman__
    * Added new keywords ([#3401](https://github.com/PrismJS/prism/issues/3401)) [`bac36827`](https://github.com/PrismJS/prism/commit/bac36827)
* __MEL__
    * Improved functions, code, and comments ([#3393](https://github.com/PrismJS/prism/issues/3393)) [`8e648dab`](https://github.com/PrismJS/prism/commit/8e648dab)
* __NEON__
    * Change alias of `key` to `property` ([#3394](https://github.com/PrismJS/prism/issues/3394)) [`1c533f4a`](https://github.com/PrismJS/prism/commit/1c533f4a)
* __PHP__
    * Added `never` return type + minor fix of named arguments ([#3421](https://github.com/PrismJS/prism/issues/3421)) [`4ffab525`](https://github.com/PrismJS/prism/commit/4ffab525)
    * Added `readonly` keyword ([#3349](https://github.com/PrismJS/prism/issues/3349)) [`4c3f1969`](https://github.com/PrismJS/prism/commit/4c3f1969)
* __PureBasic__
    * Added support for pointer to string operator ([#3362](https://github.com/PrismJS/prism/issues/3362)) [`499b1fa0`](https://github.com/PrismJS/prism/commit/499b1fa0)
* __Razor C#__
    * Added support for `@helper` and inline C# inside attribute values ([#3355](https://github.com/PrismJS/prism/issues/3355)) [`31a38d0c`](https://github.com/PrismJS/prism/commit/31a38d0c)
* __VHDL__
    * Add `private`, `view` keywords; Distinguish `attribute` from `keyword` ([#3389](https://github.com/PrismJS/prism/issues/3389)) [`d1a5ce30`](https://github.com/PrismJS/prism/commit/d1a5ce30)
* __Wolfram language__
    * Simplified `operator` regex ([#3397](https://github.com/PrismJS/prism/issues/3397)) [`10ae6da3`](https://github.com/PrismJS/prism/commit/10ae6da3)

### Updated plugins

* __Autolinker__
    * Fixed URL regex to match more valid URLs ([#3358](https://github.com/PrismJS/prism/issues/3358)) [`17ed9160`](https://github.com/PrismJS/prism/commit/17ed9160)
* __Command Line__
    * Add support for command continuation prefix ([#3344](https://github.com/PrismJS/prism/issues/3344)) [`b53832cd`](https://github.com/PrismJS/prism/commit/b53832cd)
    * Increased prompt opacity ([#3352](https://github.com/PrismJS/prism/issues/3352)) [`f95dd190`](https://github.com/PrismJS/prism/commit/f95dd190)
* __Keep Markup__
    * Use original nodes instead of clones ([#3365](https://github.com/PrismJS/prism/issues/3365)) [`8a843a17`](https://github.com/PrismJS/prism/commit/8a843a17)

### Other

* __Infrastructure__
    * Use terser ([#3407](https://github.com/PrismJS/prism/issues/3407)) [`11c54624`](https://github.com/PrismJS/prism/commit/11c54624)
    * Tests: Cache results for exp backtracking check ([#3356](https://github.com/PrismJS/prism/issues/3356)) [`ead22e1e`](https://github.com/PrismJS/prism/commit/ead22e1e)
* __Website__
    * More documentation for language definitons ([#3427](https://github.com/PrismJS/prism/issues/3427)) [`333bd590`](https://github.com/PrismJS/prism/commit/333bd590)

## 1.27.0 (2022-02-17)

### New components

* __UO Razor Script__ ([#3309](https://github.com/PrismJS/prism/issues/3309)) [`3f8cc5a0`](https://github.com/PrismJS/prism/commit/3f8cc5a0)

### Updated components

* __AutoIt__
    * Allow hyphen in directive ([#3308](https://github.com/PrismJS/prism/issues/3308)) [`bcb2e2c8`](https://github.com/PrismJS/prism/commit/bcb2e2c8)
* __EditorConfig__
    * Change alias of `section` from `keyword` to `selector` ([#3305](https://github.com/PrismJS/prism/issues/3305)) [`e46501b9`](https://github.com/PrismJS/prism/commit/e46501b9)
* __Ini__
    * Swap out `header` for `section` ([#3304](https://github.com/PrismJS/prism/issues/3304)) [`deb3a97f`](https://github.com/PrismJS/prism/commit/deb3a97f)
* __MongoDB__
    * Added v5 support ([#3297](https://github.com/PrismJS/prism/issues/3297)) [`8458c41f`](https://github.com/PrismJS/prism/commit/8458c41f)
* __PureBasic__
    * Added missing keyword and fixed constants ending with `$` ([#3320](https://github.com/PrismJS/prism/issues/3320)) [`d6c53726`](https://github.com/PrismJS/prism/commit/d6c53726)
* __Scala__
    * Added support for interpolated strings ([#3293](https://github.com/PrismJS/prism/issues/3293)) [`441a1422`](https://github.com/PrismJS/prism/commit/441a1422)
* __Systemd configuration file__
    * Swap out `operator` for `punctuation` ([#3306](https://github.com/PrismJS/prism/issues/3306)) [`2eb89e15`](https://github.com/PrismJS/prism/commit/2eb89e15)

### Updated plugins

* __Command Line__
    * Escape markup in command line output ([#3341](https://github.com/PrismJS/prism/issues/3341)) [`e002e78c`](https://github.com/PrismJS/prism/commit/e002e78c)
    * Add support for line continuation and improved colors ([#3326](https://github.com/PrismJS/prism/issues/3326)) [`1784b175`](https://github.com/PrismJS/prism/commit/1784b175)
    * Added span around command and output ([#3312](https://github.com/PrismJS/prism/issues/3312)) [`82d0ca15`](https://github.com/PrismJS/prism/commit/82d0ca15)

### Other

* __Core__
    * Added better error message for missing grammars ([#3311](https://github.com/PrismJS/prism/issues/3311)) [`2cc4660b`](https://github.com/PrismJS/prism/commit/2cc4660b)

## 1.26.0 (2022-01-06)

### New components

* __Atmel AVR Assembly__ ([#2078](https://github.com/PrismJS/prism/issues/2078)) [`b5a70e4c`](https://github.com/PrismJS/prism/commit/b5a70e4c)
* __Go module__ ([#3209](https://github.com/PrismJS/prism/issues/3209)) [`8476a9ab`](https://github.com/PrismJS/prism/commit/8476a9ab)
* __Keepalived Configure__ ([#2417](https://github.com/PrismJS/prism/issues/2417)) [`d908e457`](https://github.com/PrismJS/prism/commit/d908e457)
* __Tremor__ & __Trickle__ & __Troy__ ([#3087](https://github.com/PrismJS/prism/issues/3087)) [`ec25ba65`](https://github.com/PrismJS/prism/commit/ec25ba65)
* __Web IDL__ ([#3107](https://github.com/PrismJS/prism/issues/3107)) [`ef53f021`](https://github.com/PrismJS/prism/commit/ef53f021)

### Updated components

* Use `\d` for `[0-9]` ([#3097](https://github.com/PrismJS/prism/issues/3097)) [`9fe2f93e`](https://github.com/PrismJS/prism/commit/9fe2f93e)
* __6502 Assembly__
    * Use standard tokens and minor improvements ([#3184](https://github.com/PrismJS/prism/issues/3184)) [`929c33e0`](https://github.com/PrismJS/prism/commit/929c33e0)
* __AppleScript__
    * Use `class-name` standard token ([#3182](https://github.com/PrismJS/prism/issues/3182)) [`9f5e511d`](https://github.com/PrismJS/prism/commit/9f5e511d)
* __AQL__
    * Differentiate between strings and identifiers ([#3183](https://github.com/PrismJS/prism/issues/3183)) [`fa540ab7`](https://github.com/PrismJS/prism/commit/fa540ab7)
* __Arduino__
    * Added `ino` alias ([#2990](https://github.com/PrismJS/prism/issues/2990)) [`5b7ce5e4`](https://github.com/PrismJS/prism/commit/5b7ce5e4)
* __Avro IDL__
    * Removed char syntax ([#3185](https://github.com/PrismJS/prism/issues/3185)) [`c7809285`](https://github.com/PrismJS/prism/commit/c7809285)
* __Bash__
    * Added `node` to known commands ([#3291](https://github.com/PrismJS/prism/issues/3291)) [`4b19b502`](https://github.com/PrismJS/prism/commit/4b19b502)
    * Added `vcpkg` command ([#3282](https://github.com/PrismJS/prism/issues/3282)) [`b351bc69`](https://github.com/PrismJS/prism/commit/b351bc69)
    * Added `docker` and `podman` commands ([#3237](https://github.com/PrismJS/prism/issues/3237)) [`8c5ed251`](https://github.com/PrismJS/prism/commit/8c5ed251)
* __Birb__
    * Fixed class name false positives ([#3111](https://github.com/PrismJS/prism/issues/3111)) [`d7017beb`](https://github.com/PrismJS/prism/commit/d7017beb)
* __Bro__
    * Removed `variable` and minor improvements ([#3186](https://github.com/PrismJS/prism/issues/3186)) [`4cebf34c`](https://github.com/PrismJS/prism/commit/4cebf34c)
* __BSL (1C:Enterprise)__
    * Made `directive` greedy ([#3112](https://github.com/PrismJS/prism/issues/3112)) [`5c412cbb`](https://github.com/PrismJS/prism/commit/5c412cbb)
* __C__
    * Added `char` token ([#3207](https://github.com/PrismJS/prism/issues/3207)) [`d85a64ae`](https://github.com/PrismJS/prism/commit/d85a64ae)
* __C#__
    * Added `char` token ([#3270](https://github.com/PrismJS/prism/issues/3270)) [`220bc40f`](https://github.com/PrismJS/prism/commit/220bc40f)
    * Move everything into the IIFE ([#3077](https://github.com/PrismJS/prism/issues/3077)) [`9ed4cf6e`](https://github.com/PrismJS/prism/commit/9ed4cf6e)
* __Clojure__
    * Added `char` token ([#3188](https://github.com/PrismJS/prism/issues/3188)) [`1c88c7da`](https://github.com/PrismJS/prism/commit/1c88c7da)
* __Concurnas__
    * Improved tokenization ([#3189](https://github.com/PrismJS/prism/issues/3189)) [`7b34e65d`](https://github.com/PrismJS/prism/commit/7b34e65d)
* __Content-Security-Policy__
    * Improved tokenization ([#3276](https://github.com/PrismJS/prism/issues/3276)) [`a943f2bb`](https://github.com/PrismJS/prism/commit/a943f2bb)
* __Coq__
    * Improved attribute pattern performance ([#3085](https://github.com/PrismJS/prism/issues/3085)) [`2f9672aa`](https://github.com/PrismJS/prism/commit/2f9672aa)
* __Crystal__
    * Improved tokenization ([#3194](https://github.com/PrismJS/prism/issues/3194)) [`51e3ecc0`](https://github.com/PrismJS/prism/commit/51e3ecc0)
* __Cypher__
    * Removed non-standard use of `symbol` token name ([#3195](https://github.com/PrismJS/prism/issues/3195)) [`6af8a644`](https://github.com/PrismJS/prism/commit/6af8a644)
* __D__
    * Added standard char token ([#3196](https://github.com/PrismJS/prism/issues/3196)) [`dafdbdec`](https://github.com/PrismJS/prism/commit/dafdbdec)
* __Dart__
    * Added string interpolation and improved metadata ([#3197](https://github.com/PrismJS/prism/issues/3197)) [`e1370357`](https://github.com/PrismJS/prism/commit/e1370357)
* __DataWeave__
    * Fixed keywords being highlighted as functions ([#3113](https://github.com/PrismJS/prism/issues/3113)) [`532212b2`](https://github.com/PrismJS/prism/commit/532212b2)
* __EditorConfig__
    * Swap out `property` for `key`; alias with `attr-name` ([#3272](https://github.com/PrismJS/prism/issues/3272)) [`bee6ad56`](https://github.com/PrismJS/prism/commit/bee6ad56)
* __Eiffel__
    * Removed non-standard use of `builtin` name ([#3198](https://github.com/PrismJS/prism/issues/3198)) [`6add768b`](https://github.com/PrismJS/prism/commit/6add768b)
* __Elm__
    * Recognize unicode escapes as valid Char ([#3105](https://github.com/PrismJS/prism/issues/3105)) [`736c581d`](https://github.com/PrismJS/prism/commit/736c581d)
* __ERB__
    * Better embedding of Ruby ([#3192](https://github.com/PrismJS/prism/issues/3192)) [`336edeea`](https://github.com/PrismJS/prism/commit/336edeea)
* __F#__
    * Added `char` token ([#3271](https://github.com/PrismJS/prism/issues/3271)) [`b58cd722`](https://github.com/PrismJS/prism/commit/b58cd722)
* __G-code__
    * Use standard-conforming alias for checksum ([#3205](https://github.com/PrismJS/prism/issues/3205)) [`ee7ab563`](https://github.com/PrismJS/prism/commit/ee7ab563)
* __GameMaker Language__
    * Fixed `operator` token and added tests ([#3114](https://github.com/PrismJS/prism/issues/3114)) [`d359eeae`](https://github.com/PrismJS/prism/commit/d359eeae)
* __Go__
    * Added `char` token and improved `string` and `number` tokens ([#3208](https://github.com/PrismJS/prism/issues/3208)) [`f11b86e2`](https://github.com/PrismJS/prism/commit/f11b86e2)
* __GraphQL__
    * Optimized regexes ([#3136](https://github.com/PrismJS/prism/issues/3136)) [`8494519e`](https://github.com/PrismJS/prism/commit/8494519e)
* __Haml__
    * Use `symbol` alias for filter names ([#3210](https://github.com/PrismJS/prism/issues/3210)) [`3d410670`](https://github.com/PrismJS/prism/commit/3d410670)
    * Improved filter and interpolation tokenization ([#3191](https://github.com/PrismJS/prism/issues/3191)) [`005ba469`](https://github.com/PrismJS/prism/commit/005ba469)
* __Haxe__
    * Improved tokenization ([#3211](https://github.com/PrismJS/prism/issues/3211)) [`f41bcf23`](https://github.com/PrismJS/prism/commit/f41bcf23)
* __Hoon__
    * Simplified the language definition a little ([#3212](https://github.com/PrismJS/prism/issues/3212)) [`81920b62`](https://github.com/PrismJS/prism/commit/81920b62)
* __HTTP__
    * Added support for special header value tokenization ([#3275](https://github.com/PrismJS/prism/issues/3275)) [`3362fc79`](https://github.com/PrismJS/prism/commit/3362fc79)
    * Relax pattern for body ([#3169](https://github.com/PrismJS/prism/issues/3169)) [`22d0c6ba`](https://github.com/PrismJS/prism/commit/22d0c6ba)
* __HTTP Public-Key-Pins__
    * Improved tokenization ([#3278](https://github.com/PrismJS/prism/issues/3278)) [`0f1b5810`](https://github.com/PrismJS/prism/commit/0f1b5810)
* __HTTP Strict-Transport-Security__
    * Improved tokenization ([#3277](https://github.com/PrismJS/prism/issues/3277)) [`3d708b97`](https://github.com/PrismJS/prism/commit/3d708b97)
* __Idris__
    * Fixed import statements ([#3115](https://github.com/PrismJS/prism/issues/3115)) [`15cb3b78`](https://github.com/PrismJS/prism/commit/15cb3b78)
* __Io__
    * Simplified comment token ([#3214](https://github.com/PrismJS/prism/issues/3214)) [`c2afa59b`](https://github.com/PrismJS/prism/commit/c2afa59b)
* __J__
    * Made comments greedy ([#3215](https://github.com/PrismJS/prism/issues/3215)) [`5af16014`](https://github.com/PrismJS/prism/commit/5af16014)
* __Java__
    * Added `char` token ([#3217](https://github.com/PrismJS/prism/issues/3217)) [`0a9f909c`](https://github.com/PrismJS/prism/commit/0a9f909c)
* __Java stack trace__
    * Removed unreachable parts of regexes ([#3219](https://github.com/PrismJS/prism/issues/3219)) [`fa55492b`](https://github.com/PrismJS/prism/commit/fa55492b)
    * Added missing lookbehinds ([#3116](https://github.com/PrismJS/prism/issues/3116)) [`cfb2e782`](https://github.com/PrismJS/prism/commit/cfb2e782)
* __JavaScript__
    * Improved `number` pattern ([#3149](https://github.com/PrismJS/prism/issues/3149)) [`5a24cbff`](https://github.com/PrismJS/prism/commit/5a24cbff)
    * Added properties ([#3099](https://github.com/PrismJS/prism/issues/3099)) [`3b2238fa`](https://github.com/PrismJS/prism/commit/3b2238fa)
* __Jolie__
    * Improved tokenization ([#3221](https://github.com/PrismJS/prism/issues/3221)) [`dfbb2020`](https://github.com/PrismJS/prism/commit/dfbb2020)
* __JQ__
    * Improved performance of strings ([#3084](https://github.com/PrismJS/prism/issues/3084)) [`233415b8`](https://github.com/PrismJS/prism/commit/233415b8)
* __JS stack trace__
    * Added missing boundary assertion ([#3117](https://github.com/PrismJS/prism/issues/3117)) [`23d9aec1`](https://github.com/PrismJS/prism/commit/23d9aec1)
* __Julia__
    * Added `char` token ([#3223](https://github.com/PrismJS/prism/issues/3223)) [`3a876df0`](https://github.com/PrismJS/prism/commit/3a876df0)
* __Keyman__
    * Improved tokenization ([#3224](https://github.com/PrismJS/prism/issues/3224)) [`baa95cab`](https://github.com/PrismJS/prism/commit/baa95cab)
* __Kotlin__
    * Added `char` token and improved string interpolation ([#3225](https://github.com/PrismJS/prism/issues/3225)) [`563cd73e`](https://github.com/PrismJS/prism/commit/563cd73e)
* __Latte__
    * Use standard token names and combined delimiter tokens ([#3226](https://github.com/PrismJS/prism/issues/3226)) [`6b168a3b`](https://github.com/PrismJS/prism/commit/6b168a3b)
* __Liquid__
    * Removed unmatchable object variants ([#3135](https://github.com/PrismJS/prism/issues/3135)) [`05e7ab04`](https://github.com/PrismJS/prism/commit/05e7ab04)
* __Lisp__
    * Improved `defun` ([#3130](https://github.com/PrismJS/prism/issues/3130)) [`e8f84a6c`](https://github.com/PrismJS/prism/commit/e8f84a6c)
* __Makefile__
    * Use standard token names correctly ([#3227](https://github.com/PrismJS/prism/issues/3227)) [`21a3c2d7`](https://github.com/PrismJS/prism/commit/21a3c2d7)
* __Markdown__
    * Fixed typo in token name ([#3101](https://github.com/PrismJS/prism/issues/3101)) [`00f77a2c`](https://github.com/PrismJS/prism/commit/00f77a2c)
* __MAXScript__
    * Various improvements ([#3181](https://github.com/PrismJS/prism/issues/3181)) [`e9b856c8`](https://github.com/PrismJS/prism/commit/e9b856c8)
    * Fixed booleans not being highlighted ([#3134](https://github.com/PrismJS/prism/issues/3134)) [`c6574e6b`](https://github.com/PrismJS/prism/commit/c6574e6b)
* __Monkey__
    * Use standard tokens correctly ([#3228](https://github.com/PrismJS/prism/issues/3228)) [`c1025aa6`](https://github.com/PrismJS/prism/commit/c1025aa6)
* __N1QL__
    * Updated keywords + minor improvements ([#3229](https://github.com/PrismJS/prism/issues/3229)) [`642d93ec`](https://github.com/PrismJS/prism/commit/642d93ec)
* __nginx__
    * Made some patterns greedy ([#3230](https://github.com/PrismJS/prism/issues/3230)) [`7b72e0ad`](https://github.com/PrismJS/prism/commit/7b72e0ad)
* __Nim__
    * Added `char` token and made some tokens greedy ([#3231](https://github.com/PrismJS/prism/issues/3231)) [`2334b4b6`](https://github.com/PrismJS/prism/commit/2334b4b6)
    * Fixed backtick identifier ([#3118](https://github.com/PrismJS/prism/issues/3118)) [`75331bea`](https://github.com/PrismJS/prism/commit/75331bea)
* __Nix__
    * Use standard token name correctly ([#3232](https://github.com/PrismJS/prism/issues/3232)) [`5bf6e35f`](https://github.com/PrismJS/prism/commit/5bf6e35f)
    * Removed unmatchable token ([#3119](https://github.com/PrismJS/prism/issues/3119)) [`dc1e808f`](https://github.com/PrismJS/prism/commit/dc1e808f)
* __NSIS__
    * Made `comment` greedy ([#3234](https://github.com/PrismJS/prism/issues/3234)) [`969f152a`](https://github.com/PrismJS/prism/commit/969f152a)
    * Update regex pattern for variables ([#3266](https://github.com/PrismJS/prism/issues/3266)) [`adcc8784`](https://github.com/PrismJS/prism/commit/adcc8784)
    * Update regex for constants pattern ([#3267](https://github.com/PrismJS/prism/issues/3267)) [`55583fb2`](https://github.com/PrismJS/prism/commit/55583fb2)
* __Objective-C__
    * Improved `string` token ([#3235](https://github.com/PrismJS/prism/issues/3235)) [`8e0e95f3`](https://github.com/PrismJS/prism/commit/8e0e95f3)
* __OCaml__
    * Improved tokenization ([#3269](https://github.com/PrismJS/prism/issues/3269)) [`7bcc5da0`](https://github.com/PrismJS/prism/commit/7bcc5da0)
    * Removed unmatchable punctuation variant ([#3120](https://github.com/PrismJS/prism/issues/3120)) [`314d6994`](https://github.com/PrismJS/prism/commit/314d6994)
* __Oz__
    * Improved tokenization ([#3240](https://github.com/PrismJS/prism/issues/3240)) [`a3905c04`](https://github.com/PrismJS/prism/commit/a3905c04)
* __Pascal__
    * Added support for asm and directives ([#2653](https://github.com/PrismJS/prism/issues/2653)) [`f053af13`](https://github.com/PrismJS/prism/commit/f053af13)
* __PATROL Scripting Language__
    * Added `boolean` token ([#3248](https://github.com/PrismJS/prism/issues/3248)) [`a5b6c5eb`](https://github.com/PrismJS/prism/commit/a5b6c5eb)
* __Perl__
    * Improved tokenization ([#3241](https://github.com/PrismJS/prism/issues/3241)) [`f22ea9f9`](https://github.com/PrismJS/prism/commit/f22ea9f9)
* __PHP__
    * Removed useless keyword tokens ([#3121](https://github.com/PrismJS/prism/issues/3121)) [`ee62a080`](https://github.com/PrismJS/prism/commit/ee62a080)
* __PHP Extras__
    * Improved `scope` and `this` ([#3243](https://github.com/PrismJS/prism/issues/3243)) [`59ef51db`](https://github.com/PrismJS/prism/commit/59ef51db)
* __PL/SQL__
    * Updated keywords + other improvements ([#3109](https://github.com/PrismJS/prism/issues/3109)) [`e7ba877b`](https://github.com/PrismJS/prism/commit/e7ba877b)
* __PowerQuery__
    * Improved tokenization and use standard tokens correctly ([#3244](https://github.com/PrismJS/prism/issues/3244)) [`5688f487`](https://github.com/PrismJS/prism/commit/5688f487)
    * Removed useless `data-type` alternative ([#3122](https://github.com/PrismJS/prism/issues/3122)) [`eeb13996`](https://github.com/PrismJS/prism/commit/eeb13996)
* __PowerShell__
    * Fixed lookbehind + refactoring ([#3245](https://github.com/PrismJS/prism/issues/3245)) [`d30a2da6`](https://github.com/PrismJS/prism/commit/d30a2da6)
* __Processing__
    * Use standard tokens correctly ([#3246](https://github.com/PrismJS/prism/issues/3246)) [`5ee8c557`](https://github.com/PrismJS/prism/commit/5ee8c557)
* __Prolog__
    * Removed variable token + minor improvements ([#3247](https://github.com/PrismJS/prism/issues/3247)) [`bacf9ae3`](https://github.com/PrismJS/prism/commit/bacf9ae3)
* __Pug__
    * Improved filter tokenization ([#3258](https://github.com/PrismJS/prism/issues/3258)) [`0390e644`](https://github.com/PrismJS/prism/commit/0390e644)
* __PureBasic__
    * Fixed token order inside `asm` token ([#3123](https://github.com/PrismJS/prism/issues/3123)) [`f3b25786`](https://github.com/PrismJS/prism/commit/f3b25786)
* __Python__
    * Made `comment` greedy ([#3249](https://github.com/PrismJS/prism/issues/3249)) [`8ecef306`](https://github.com/PrismJS/prism/commit/8ecef306)
    * Add `match` and `case` (soft) keywords ([#3142](https://github.com/PrismJS/prism/issues/3142)) [`3f24dc72`](https://github.com/PrismJS/prism/commit/3f24dc72)
    * Recognize walrus operator ([#3126](https://github.com/PrismJS/prism/issues/3126)) [`18bd101c`](https://github.com/PrismJS/prism/commit/18bd101c)
    * Fixed numbers ending with a dot ([#3106](https://github.com/PrismJS/prism/issues/3106)) [`2c63efa6`](https://github.com/PrismJS/prism/commit/2c63efa6)
* __QML__
    * Made `string` greedy ([#3250](https://github.com/PrismJS/prism/issues/3250)) [`1e6dcb51`](https://github.com/PrismJS/prism/commit/1e6dcb51)
* __React JSX__
    * Move alias property ([#3222](https://github.com/PrismJS/prism/issues/3222)) [`18c92048`](https://github.com/PrismJS/prism/commit/18c92048)
* __React TSX__
    * Removed `parameter` token ([#3090](https://github.com/PrismJS/prism/issues/3090)) [`0a313f4f`](https://github.com/PrismJS/prism/commit/0a313f4f)
* __Reason__
    * Use standard tokens correctly ([#3251](https://github.com/PrismJS/prism/issues/3251)) [`809af0d9`](https://github.com/PrismJS/prism/commit/809af0d9)
* __Regex__
    * Fixed char-class/char-set confusion ([#3124](https://github.com/PrismJS/prism/issues/3124)) [`4dde2e20`](https://github.com/PrismJS/prism/commit/4dde2e20)
* __Ren'py__
    * Improved language + added tests ([#3125](https://github.com/PrismJS/prism/issues/3125)) [`ede55b2c`](https://github.com/PrismJS/prism/commit/ede55b2c)
* __Rip__
    * Use standard `char` token ([#3252](https://github.com/PrismJS/prism/issues/3252)) [`2069ab0c`](https://github.com/PrismJS/prism/commit/2069ab0c)
* __Ruby__
    * Improved tokenization ([#3193](https://github.com/PrismJS/prism/issues/3193)) [`86028adb`](https://github.com/PrismJS/prism/commit/86028adb)
* __Rust__
    * Improved `type-definition` and use standard tokens correctly ([#3253](https://github.com/PrismJS/prism/issues/3253)) [`4049e5c6`](https://github.com/PrismJS/prism/commit/4049e5c6)
* __Scheme__
    * Use standard `char` token ([#3254](https://github.com/PrismJS/prism/issues/3254)) [`7d740c45`](https://github.com/PrismJS/prism/commit/7d740c45)
    * Updates syntax for reals ([#3159](https://github.com/PrismJS/prism/issues/3159)) [`4eb81fa1`](https://github.com/PrismJS/prism/commit/4eb81fa1)
* __Smalltalk__
    * Use standard `char` token ([#3255](https://github.com/PrismJS/prism/issues/3255)) [`a7bb3001`](https://github.com/PrismJS/prism/commit/a7bb3001)
    * Added `boolean` token ([#3100](https://github.com/PrismJS/prism/issues/3100)) [`51382524`](https://github.com/PrismJS/prism/commit/51382524)
* __Smarty__
    * Improved tokenization ([#3268](https://github.com/PrismJS/prism/issues/3268)) [`acc0bc09`](https://github.com/PrismJS/prism/commit/acc0bc09)
* __SQL__
    * Added identifier token ([#3141](https://github.com/PrismJS/prism/issues/3141)) [`4e00cddd`](https://github.com/PrismJS/prism/commit/4e00cddd)
* __Squirrel__
    * Use standard `char` token ([#3256](https://github.com/PrismJS/prism/issues/3256)) [`58a65bfd`](https://github.com/PrismJS/prism/commit/58a65bfd)
* __Stan__
    * Added missing keywords and HOFs ([#3238](https://github.com/PrismJS/prism/issues/3238)) [`afd77ed1`](https://github.com/PrismJS/prism/commit/afd77ed1)
* __Structured Text (IEC 61131-3)__
    * Structured text: Improved tokenization ([#3213](https://github.com/PrismJS/prism/issues/3213)) [`d04d166d`](https://github.com/PrismJS/prism/commit/d04d166d)
* __Swift__
    * Added support for `isolated` keyword ([#3174](https://github.com/PrismJS/prism/issues/3174)) [`18c828a6`](https://github.com/PrismJS/prism/commit/18c828a6)
* __TAP__
    * Conform to quoted-properties style ([#3127](https://github.com/PrismJS/prism/issues/3127)) [`3ef71533`](https://github.com/PrismJS/prism/commit/3ef71533)
* __Tremor__
    * Use standard `regex` token ([#3257](https://github.com/PrismJS/prism/issues/3257)) [`c56e4bf5`](https://github.com/PrismJS/prism/commit/c56e4bf5)
* __Twig__
    * Improved tokenization ([#3259](https://github.com/PrismJS/prism/issues/3259)) [`e03a7c24`](https://github.com/PrismJS/prism/commit/e03a7c24)
* __TypeScript__
    * Removed duplicate keywords ([#3132](https://github.com/PrismJS/prism/issues/3132)) [`91060fd6`](https://github.com/PrismJS/prism/commit/91060fd6)
* __URI__
    * Fixed IPv4 regex ([#3128](https://github.com/PrismJS/prism/issues/3128)) [`599e30ee`](https://github.com/PrismJS/prism/commit/599e30ee)
* __V__
    * Use standard `char` token ([#3260](https://github.com/PrismJS/prism/issues/3260)) [`e4373256`](https://github.com/PrismJS/prism/commit/e4373256)
* __Verilog__
    * Use standard tokens correctly ([#3261](https://github.com/PrismJS/prism/issues/3261)) [`43124129`](https://github.com/PrismJS/prism/commit/43124129)
* __Visual Basic__
    * Simplify regexes and use more common aliases ([#3262](https://github.com/PrismJS/prism/issues/3262)) [`aa73d448`](https://github.com/PrismJS/prism/commit/aa73d448)
* __Wolfram language__
    * Removed unmatchable punctuation variant ([#3133](https://github.com/PrismJS/prism/issues/3133)) [`a28a86ad`](https://github.com/PrismJS/prism/commit/a28a86ad)
* __Xojo (REALbasic)__
    * Proper token name for directives ([#3263](https://github.com/PrismJS/prism/issues/3263)) [`ffd8343f`](https://github.com/PrismJS/prism/commit/ffd8343f)
* __Zig__
    * Added missing keywords ([#3279](https://github.com/PrismJS/prism/issues/3279)) [`deed35e3`](https://github.com/PrismJS/prism/commit/deed35e3)
    * Use standard `char` token ([#3264](https://github.com/PrismJS/prism/issues/3264)) [`c3f9fb70`](https://github.com/PrismJS/prism/commit/c3f9fb70)
    * Fixed module comments and astral chars ([#3129](https://github.com/PrismJS/prism/issues/3129)) [`09a0e2ba`](https://github.com/PrismJS/prism/commit/09a0e2ba)

### Updated plugins

* __File Highlight__
    * File highlight+data range ([#1813](https://github.com/PrismJS/prism/issues/1813)) [`d38592c5`](https://github.com/PrismJS/prism/commit/d38592c5)
* __Keep Markup__
    * Added `drop-tokens` option class ([#3166](https://github.com/PrismJS/prism/issues/3166)) [`b679cfe6`](https://github.com/PrismJS/prism/commit/b679cfe6)
* __Line Highlight__
    * Expose `highlightLines` function as `Prism.plugins.highlightLines` ([#3086](https://github.com/PrismJS/prism/issues/3086)) [`9f4c0e74`](https://github.com/PrismJS/prism/commit/9f4c0e74)
* __Toolbar__
    * Set `z-index` of `.toolbar` to 10 ([#3163](https://github.com/PrismJS/prism/issues/3163)) [`1cac3559`](https://github.com/PrismJS/prism/commit/1cac3559)

### Updated themes

* Coy: Set `z-index` to make shadows visible in colored table cells ([#3161](https://github.com/PrismJS/prism/issues/3161)) [`79f250f3`](https://github.com/PrismJS/prism/commit/79f250f3)
* Coy: Added padding to account for box shadow ([#3143](https://github.com/PrismJS/prism/issues/3143)) [`a6a4ce7e`](https://github.com/PrismJS/prism/commit/a6a4ce7e)

### Other

* __Core__
    * Added `setLanguage` util function ([#3167](https://github.com/PrismJS/prism/issues/3167)) [`b631949a`](https://github.com/PrismJS/prism/commit/b631949a)
    * Fixed type error on null ([#3057](https://github.com/PrismJS/prism/issues/3057)) [`a80a68ba`](https://github.com/PrismJS/prism/commit/a80a68ba)
    * Document `disableWorkerMessageHandler` ([#3088](https://github.com/PrismJS/prism/issues/3088)) [`213cf7be`](https://github.com/PrismJS/prism/commit/213cf7be)
* __Infrastructure__
    * Tests: Added `.html.test` files for replace `.js` language tests ([#3148](https://github.com/PrismJS/prism/issues/3148)) [`2e834c8c`](https://github.com/PrismJS/prism/commit/2e834c8c)
    * Added regex coverage ([#3138](https://github.com/PrismJS/prism/issues/3138)) [`5333e281`](https://github.com/PrismJS/prism/commit/5333e281)
    * Tests: Added `TestCaseFile` class and generalized `runTestCase` ([#3147](https://github.com/PrismJS/prism/issues/3147)) [`ae8888a0`](https://github.com/PrismJS/prism/commit/ae8888a0)
    * Added even more language tests ([#3137](https://github.com/PrismJS/prism/issues/3137)) [`344d0b27`](https://github.com/PrismJS/prism/commit/344d0b27)
    * Added more plugin tests ([#1969](https://github.com/PrismJS/prism/issues/1969)) [`a394a14d`](https://github.com/PrismJS/prism/commit/a394a14d)
    * Added more language tests ([#3131](https://github.com/PrismJS/prism/issues/3131)) [`2f7f7364`](https://github.com/PrismJS/prism/commit/2f7f7364)
    * `package.json`: Added `engines.node` field ([#3108](https://github.com/PrismJS/prism/issues/3108)) [`798ee4f6`](https://github.com/PrismJS/prism/commit/798ee4f6)
    * Use tabs in `package(-lock).json` ([#3098](https://github.com/PrismJS/prism/issues/3098)) [`8daebb4a`](https://github.com/PrismJS/prism/commit/8daebb4a)
    * Update `eslint-plugin-regexp@1.2.0` ([#3091](https://github.com/PrismJS/prism/issues/3091)) [`e6e1d5ae`](https://github.com/PrismJS/prism/commit/e6e1d5ae)
    * Added minified CSS ([#3073](https://github.com/PrismJS/prism/issues/3073)) [`d63d6c0e`](https://github.com/PrismJS/prism/commit/d63d6c0e)
* __Website__
    * Readme: Clarify usage of our build system ([#3239](https://github.com/PrismJS/prism/issues/3239)) [`6f1d904a`](https://github.com/PrismJS/prism/commit/6f1d904a)
    * Improved CDN usage URLs ([#3285](https://github.com/PrismJS/prism/issues/3285)) [`6c21b2f7`](https://github.com/PrismJS/prism/commit/6c21b2f7)
    * Update download.html [`9d5424b6`](https://github.com/PrismJS/prism/commit/9d5424b6)
    * Autoloader: Mention how to load grammars from URLs ([#3218](https://github.com/PrismJS/prism/issues/3218)) [`cefccdd1`](https://github.com/PrismJS/prism/commit/cefccdd1)
    * Added PrismJS React and HTML tutorial link ([#3190](https://github.com/PrismJS/prism/issues/3190)) [`0ecdbdce`](https://github.com/PrismJS/prism/commit/0ecdbdce)
    * Improved readability ([#3177](https://github.com/PrismJS/prism/issues/3177)) [`4433d7fe`](https://github.com/PrismJS/prism/commit/4433d7fe)
    * Fixed red highlighting in Firefox ([#3178](https://github.com/PrismJS/prism/issues/3178)) [`746da79b`](https://github.com/PrismJS/prism/commit/746da79b)
    * Use Keep markup to highlight code section ([#3164](https://github.com/PrismJS/prism/issues/3164)) [`ebd59e32`](https://github.com/PrismJS/prism/commit/ebd59e32)
    * Document standard tokens and provide examples ([#3104](https://github.com/PrismJS/prism/issues/3104)) [`37551200`](https://github.com/PrismJS/prism/commit/37551200)
    * Fixed dead link to third-party tutorial [#3155](https://github.com/PrismJS/prism/issues/3155) ([#3156](https://github.com/PrismJS/prism/issues/3156)) [`31b4c1b8`](https://github.com/PrismJS/prism/commit/31b4c1b8)
    * Repositioned theme selector ([#3146](https://github.com/PrismJS/prism/issues/3146)) [`ea361e5a`](https://github.com/PrismJS/prism/commit/ea361e5a)
    * Adjusted TOC's line height for better readability ([#3145](https://github.com/PrismJS/prism/issues/3145)) [`c5629706`](https://github.com/PrismJS/prism/commit/c5629706)
    * Updated plugin header template ([#3144](https://github.com/PrismJS/prism/issues/3144)) [`faedfe85`](https://github.com/PrismJS/prism/commit/faedfe85)
    * Update test and example pages to use Autoloader ([#1936](https://github.com/PrismJS/prism/issues/1936)) [`3d96eedc`](https://github.com/PrismJS/prism/commit/3d96eedc)

## 1.25.0 (2021-09-16)

### New components

* __AviSynth__ ([#3071](https://github.com/PrismJS/prism/issues/3071)) [`746a4b1a`](https://github.com/PrismJS/prism/commit/746a4b1a)
* __Avro IDL__ ([#3051](https://github.com/PrismJS/prism/issues/3051)) [`87e5a376`](https://github.com/PrismJS/prism/commit/87e5a376)
* __Bicep__ ([#3027](https://github.com/PrismJS/prism/issues/3027)) [`c1dce998`](https://github.com/PrismJS/prism/commit/c1dce998)
* __GAP (CAS)__ ([#3054](https://github.com/PrismJS/prism/issues/3054)) [`23cd9b65`](https://github.com/PrismJS/prism/commit/23cd9b65)
* __GN__ ([#3062](https://github.com/PrismJS/prism/issues/3062)) [`4f97b82b`](https://github.com/PrismJS/prism/commit/4f97b82b)
* __Hoon__ ([#2978](https://github.com/PrismJS/prism/issues/2978)) [`ea776756`](https://github.com/PrismJS/prism/commit/ea776756)
* __Kusto__ ([#3068](https://github.com/PrismJS/prism/issues/3068)) [`e008ea05`](https://github.com/PrismJS/prism/commit/e008ea05)
* __Magma (CAS)__ ([#3055](https://github.com/PrismJS/prism/issues/3055)) [`a1b67ce3`](https://github.com/PrismJS/prism/commit/a1b67ce3)
* __MAXScript__ ([#3060](https://github.com/PrismJS/prism/issues/3060)) [`4fbdd2f8`](https://github.com/PrismJS/prism/commit/4fbdd2f8)
* __Mermaid__ ([#3050](https://github.com/PrismJS/prism/issues/3050)) [`148c1eca`](https://github.com/PrismJS/prism/commit/148c1eca)
* __Razor C#__ ([#3064](https://github.com/PrismJS/prism/issues/3064)) [`4433ccfc`](https://github.com/PrismJS/prism/commit/4433ccfc)
* __Systemd configuration file__ ([#3053](https://github.com/PrismJS/prism/issues/3053)) [`8df825e0`](https://github.com/PrismJS/prism/commit/8df825e0)
* __Wren__ ([#3063](https://github.com/PrismJS/prism/issues/3063)) [`6a356d25`](https://github.com/PrismJS/prism/commit/6a356d25)

### Updated components

* __Bicep__
    * Added support for multiline and interpolated strings and other improvements ([#3028](https://github.com/PrismJS/prism/issues/3028)) [`748bb9ac`](https://github.com/PrismJS/prism/commit/748bb9ac)
* __C#__
    * Added `with` keyword & improved record support ([#2993](https://github.com/PrismJS/prism/issues/2993)) [`fdd291c0`](https://github.com/PrismJS/prism/commit/fdd291c0)
    * Added `record`, `init`, and `nullable` keyword ([#2991](https://github.com/PrismJS/prism/issues/2991)) [`9b561565`](https://github.com/PrismJS/prism/commit/9b561565)
    * Added context check for `from` keyword ([#2970](https://github.com/PrismJS/prism/issues/2970)) [`158f25d4`](https://github.com/PrismJS/prism/commit/158f25d4)
* __C++__
    * Fixed generic function false positive ([#3043](https://github.com/PrismJS/prism/issues/3043)) [`5de8947f`](https://github.com/PrismJS/prism/commit/5de8947f)
* __Clojure__
    * Improved tokenization ([#3056](https://github.com/PrismJS/prism/issues/3056)) [`8d0b74b5`](https://github.com/PrismJS/prism/commit/8d0b74b5)
* __Hoon__
    * Fixed mixed-case aura tokenization ([#3002](https://github.com/PrismJS/prism/issues/3002)) [`9c8911bd`](https://github.com/PrismJS/prism/commit/9c8911bd)
* __Liquid__
    * Added all objects from Shopify reference ([#2998](https://github.com/PrismJS/prism/issues/2998)) [`693b7433`](https://github.com/PrismJS/prism/commit/693b7433)
    * Added `empty` keyword ([#2997](https://github.com/PrismJS/prism/issues/2997)) [`fe3bc526`](https://github.com/PrismJS/prism/commit/fe3bc526)
* __Log file__
    * Added support for Java stack traces ([#3003](https://github.com/PrismJS/prism/issues/3003)) [`b0365e70`](https://github.com/PrismJS/prism/commit/b0365e70)
* __Markup__
    * Made most patterns greedy ([#3065](https://github.com/PrismJS/prism/issues/3065)) [`52e8cee9`](https://github.com/PrismJS/prism/commit/52e8cee9)
    * Fixed ReDoS ([#3078](https://github.com/PrismJS/prism/issues/3078)) [`0ff371bb`](https://github.com/PrismJS/prism/commit/0ff371bb)
* __PureScript__
    * Made `∀` a keyword (alias for `forall`) ([#3005](https://github.com/PrismJS/prism/issues/3005)) [`b38fc89a`](https://github.com/PrismJS/prism/commit/b38fc89a)
    * Improved Haskell and PureScript ([#3020](https://github.com/PrismJS/prism/issues/3020)) [`679539ec`](https://github.com/PrismJS/prism/commit/679539ec)
* __Python__
    * Support for underscores in numbers ([#3039](https://github.com/PrismJS/prism/issues/3039)) [`6f5d68f7`](https://github.com/PrismJS/prism/commit/6f5d68f7)
* __Sass__
    * Fixed issues with CSS Extras ([#2994](https://github.com/PrismJS/prism/issues/2994)) [`14fdfe32`](https://github.com/PrismJS/prism/commit/14fdfe32)
* __Shell session__
    * Fixed command false positives ([#3048](https://github.com/PrismJS/prism/issues/3048)) [`35b88fcf`](https://github.com/PrismJS/prism/commit/35b88fcf)
    * Added support for the percent sign as shell symbol ([#3010](https://github.com/PrismJS/prism/issues/3010)) [`4492b62b`](https://github.com/PrismJS/prism/commit/4492b62b)
* __Swift__
    * Major improvements ([#3022](https://github.com/PrismJS/prism/issues/3022)) [`8541db2e`](https://github.com/PrismJS/prism/commit/8541db2e)
    * Added support for `@propertyWrapper`, `@MainActor`, and `@globalActor` ([#3009](https://github.com/PrismJS/prism/issues/3009)) [`ce5e0f01`](https://github.com/PrismJS/prism/commit/ce5e0f01)
    * Added support for new Swift 5.5 keywords ([#2988](https://github.com/PrismJS/prism/issues/2988)) [`bb93fac0`](https://github.com/PrismJS/prism/commit/bb93fac0)
* __TypeScript__
    * Fixed keyword false positives ([#3001](https://github.com/PrismJS/prism/issues/3001)) [`212e0ef2`](https://github.com/PrismJS/prism/commit/212e0ef2)

### Updated plugins

* __JSONP Highlight__
    * Refactored JSONP logic ([#3018](https://github.com/PrismJS/prism/issues/3018)) [`5126d1e1`](https://github.com/PrismJS/prism/commit/5126d1e1)
* __Line Highlight__
    * Extend highlight to full line width inside scroll container ([#3011](https://github.com/PrismJS/prism/issues/3011)) [`e289ec60`](https://github.com/PrismJS/prism/commit/e289ec60)
* __Normalize Whitespace__
    * Removed unnecessary checks ([#3017](https://github.com/PrismJS/prism/issues/3017)) [`63edf14c`](https://github.com/PrismJS/prism/commit/63edf14c)
* __Previewers__
    * Ensure popup is visible across themes ([#3080](https://github.com/PrismJS/prism/issues/3080)) [`c7b6a7f6`](https://github.com/PrismJS/prism/commit/c7b6a7f6)

### Updated themes

* __Twilight__
    * Increase selector specificities of plugin overrides ([#3081](https://github.com/PrismJS/prism/issues/3081)) [`ffb20439`](https://github.com/PrismJS/prism/commit/ffb20439)

### Other

* __Infrastructure__
    * Added benchmark suite ([#2153](https://github.com/PrismJS/prism/issues/2153)) [`44456b21`](https://github.com/PrismJS/prism/commit/44456b21)
    * Tests: Insert expected JSON by Default ([#2960](https://github.com/PrismJS/prism/issues/2960)) [`e997dd35`](https://github.com/PrismJS/prism/commit/e997dd35)
    * Tests: Improved dection of empty patterns ([#3058](https://github.com/PrismJS/prism/issues/3058)) [`d216e602`](https://github.com/PrismJS/prism/commit/d216e602)
* __Website__
    * Highlight Keywords: More documentation ([#3049](https://github.com/PrismJS/prism/issues/3049)) [`247fd9a3`](https://github.com/PrismJS/prism/commit/247fd9a3)


## 1.24.1 (2021-07-03)

### Updated components

* __Markdown__
    * Fixed Markdown not working in NodeJS ([#2977](https://github.com/PrismJS/prism/issues/2977)) [`151121cd`](https://github.com/PrismJS/prism/commit/151121cd)

### Updated plugins

* __Toolbar__
    * Fixed styles being applies to nested elements ([#2980](https://github.com/PrismJS/prism/issues/2980)) [`748ecddc`](https://github.com/PrismJS/prism/commit/748ecddc)


## 1.24.0 (2021-06-27)

### New components

* __CFScript__ ([#2771](https://github.com/PrismJS/prism/issues/2771)) [`b0a6ec85`](https://github.com/PrismJS/prism/commit/b0a6ec85)
* __ChaiScript__ ([#2706](https://github.com/PrismJS/prism/issues/2706)) [`3f7d7453`](https://github.com/PrismJS/prism/commit/3f7d7453)
* __COBOL__ ([#2800](https://github.com/PrismJS/prism/issues/2800)) [`7e5f78ff`](https://github.com/PrismJS/prism/commit/7e5f78ff)
* __Coq__ ([#2803](https://github.com/PrismJS/prism/issues/2803)) [`41e25d3c`](https://github.com/PrismJS/prism/commit/41e25d3c)
* __CSV__ ([#2794](https://github.com/PrismJS/prism/issues/2794)) [`f9b69528`](https://github.com/PrismJS/prism/commit/f9b69528)
* __DOT (Graphviz)__ ([#2690](https://github.com/PrismJS/prism/issues/2690)) [`1f91868e`](https://github.com/PrismJS/prism/commit/1f91868e)
* __False__ ([#2802](https://github.com/PrismJS/prism/issues/2802)) [`99a21dc5`](https://github.com/PrismJS/prism/commit/99a21dc5)
* __ICU Message Format__ ([#2745](https://github.com/PrismJS/prism/issues/2745)) [`bf4e7ba9`](https://github.com/PrismJS/prism/commit/bf4e7ba9)
* __Idris__ ([#2755](https://github.com/PrismJS/prism/issues/2755)) [`e9314415`](https://github.com/PrismJS/prism/commit/e9314415)
* __Jexl__ ([#2764](https://github.com/PrismJS/prism/issues/2764)) [`7e51b99c`](https://github.com/PrismJS/prism/commit/7e51b99c)
* __KuMir (КуМир)__ ([#2760](https://github.com/PrismJS/prism/issues/2760)) [`3419fb77`](https://github.com/PrismJS/prism/commit/3419fb77)
* __Log file__ ([#2796](https://github.com/PrismJS/prism/issues/2796)) [`2bc6475b`](https://github.com/PrismJS/prism/commit/2bc6475b)
* __Nevod__ ([#2798](https://github.com/PrismJS/prism/issues/2798)) [`f84c49c5`](https://github.com/PrismJS/prism/commit/f84c49c5)
* __OpenQasm__ ([#2797](https://github.com/PrismJS/prism/issues/2797)) [`1a2347a3`](https://github.com/PrismJS/prism/commit/1a2347a3)
* __PATROL Scripting Language__ ([#2739](https://github.com/PrismJS/prism/issues/2739)) [`18c67b49`](https://github.com/PrismJS/prism/commit/18c67b49)
* __Q#__ ([#2804](https://github.com/PrismJS/prism/issues/2804)) [`1b63cd01`](https://github.com/PrismJS/prism/commit/1b63cd01)
* __Rego__ ([#2624](https://github.com/PrismJS/prism/issues/2624)) [`e38986f9`](https://github.com/PrismJS/prism/commit/e38986f9)
* __Squirrel__ ([#2721](https://github.com/PrismJS/prism/issues/2721)) [`fd1081d2`](https://github.com/PrismJS/prism/commit/fd1081d2)
* __URI__ ([#2708](https://github.com/PrismJS/prism/issues/2708)) [`bbc77d19`](https://github.com/PrismJS/prism/commit/bbc77d19)
* __V__ ([#2687](https://github.com/PrismJS/prism/issues/2687)) [`72962701`](https://github.com/PrismJS/prism/commit/72962701)
* __Wolfram language__ & __Mathematica__ & __Mathematica Notebook__ ([#2921](https://github.com/PrismJS/prism/issues/2921)) [`c4f6b2cc`](https://github.com/PrismJS/prism/commit/c4f6b2cc)

### Updated components

* Fixed problems reported by `regexp/no-dupe-disjunctions` ([#2952](https://github.com/PrismJS/prism/issues/2952)) [`f471d2d7`](https://github.com/PrismJS/prism/commit/f471d2d7)
* Fixed some cases of quadratic worst-case runtime ([#2922](https://github.com/PrismJS/prism/issues/2922)) [`79d22182`](https://github.com/PrismJS/prism/commit/79d22182)
* Fixed 2 cases of exponential backtracking ([#2774](https://github.com/PrismJS/prism/issues/2774)) [`d85e30da`](https://github.com/PrismJS/prism/commit/d85e30da)
* __AQL__
    * Update for ArangoDB 3.8 ([#2842](https://github.com/PrismJS/prism/issues/2842)) [`ea82478d`](https://github.com/PrismJS/prism/commit/ea82478d)
* __AutoHotkey__
    * Improved tag pattern ([#2920](https://github.com/PrismJS/prism/issues/2920)) [`fc2a3334`](https://github.com/PrismJS/prism/commit/fc2a3334)
* __Bash__
    * Accept hyphens in function names ([#2832](https://github.com/PrismJS/prism/issues/2832)) [`e4ad22ad`](https://github.com/PrismJS/prism/commit/e4ad22ad)
    * Fixed single-quoted strings ([#2792](https://github.com/PrismJS/prism/issues/2792)) [`e5cfdb4a`](https://github.com/PrismJS/prism/commit/e5cfdb4a)
* __C++__
    * Added support for generic functions and made `::` punctuation ([#2814](https://github.com/PrismJS/prism/issues/2814)) [`3df62fd0`](https://github.com/PrismJS/prism/commit/3df62fd0)
    * Added missing keywords and modules ([#2763](https://github.com/PrismJS/prism/issues/2763)) [`88fa72cf`](https://github.com/PrismJS/prism/commit/88fa72cf)
* __Dart__
    * Improved support for classes & generics ([#2810](https://github.com/PrismJS/prism/issues/2810)) [`d0bcd074`](https://github.com/PrismJS/prism/commit/d0bcd074)
* __Docker__
    * Improvements ([#2720](https://github.com/PrismJS/prism/issues/2720)) [`93dd83c2`](https://github.com/PrismJS/prism/commit/93dd83c2)
* __Elixir__
    * Added missing keywords ([#2958](https://github.com/PrismJS/prism/issues/2958)) [`114e4626`](https://github.com/PrismJS/prism/commit/114e4626)
    * Added missing keyword and other improvements ([#2773](https://github.com/PrismJS/prism/issues/2773)) [`e6c0d298`](https://github.com/PrismJS/prism/commit/e6c0d298)
    * Added `defdelagate` keyword and highlighting for function/module names ([#2709](https://github.com/PrismJS/prism/issues/2709)) [`59f725d7`](https://github.com/PrismJS/prism/commit/59f725d7)
* __F#__
    * Fixed comment false positive ([#2703](https://github.com/PrismJS/prism/issues/2703)) [`a5d7178c`](https://github.com/PrismJS/prism/commit/a5d7178c)
* __GraphQL__
    * Fixed `definition-query` and `definition-mutation` tokens ([#2964](https://github.com/PrismJS/prism/issues/2964)) [`bfd7fded`](https://github.com/PrismJS/prism/commit/bfd7fded)
    * Added more detailed tokens ([#2939](https://github.com/PrismJS/prism/issues/2939)) [`34f24ac9`](https://github.com/PrismJS/prism/commit/34f24ac9)
* __Handlebars__
    * Added `hbs` alias ([#2874](https://github.com/PrismJS/prism/issues/2874)) [`43976351`](https://github.com/PrismJS/prism/commit/43976351)
* __HTTP__
    * Fixed body not being highlighted ([#2734](https://github.com/PrismJS/prism/issues/2734)) [`1dfc8271`](https://github.com/PrismJS/prism/commit/1dfc8271)
    * More granular tokenization ([#2722](https://github.com/PrismJS/prism/issues/2722)) [`6183fd9b`](https://github.com/PrismJS/prism/commit/6183fd9b)
    * Allow root path in request line ([#2711](https://github.com/PrismJS/prism/issues/2711)) [`4e7b2a82`](https://github.com/PrismJS/prism/commit/4e7b2a82)
* __Ini__
    * Consistently mimic Win32 INI parsing ([#2779](https://github.com/PrismJS/prism/issues/2779)) [`42d24fa2`](https://github.com/PrismJS/prism/commit/42d24fa2)
* __Java__
    * Improved generics ([#2812](https://github.com/PrismJS/prism/issues/2812)) [`4ec7535c`](https://github.com/PrismJS/prism/commit/4ec7535c)
* __JavaScript__
    * Added support for import assertions ([#2953](https://github.com/PrismJS/prism/issues/2953)) [`ab7c9953`](https://github.com/PrismJS/prism/commit/ab7c9953)
    * Added support for RegExp Match Indices ([#2900](https://github.com/PrismJS/prism/issues/2900)) [`415651a0`](https://github.com/PrismJS/prism/commit/415651a0)
    * Added hashbang and private getters/setters ([#2815](https://github.com/PrismJS/prism/issues/2815)) [`9c610ae6`](https://github.com/PrismJS/prism/commit/9c610ae6)
    * Improved contextual keywords ([#2713](https://github.com/PrismJS/prism/issues/2713)) [`022f90a0`](https://github.com/PrismJS/prism/commit/022f90a0)
* __JS Templates__
    * Added SQL templates ([#2945](https://github.com/PrismJS/prism/issues/2945)) [`abab9104`](https://github.com/PrismJS/prism/commit/abab9104)
* __JSON__
    * Fixed backtracking issue in Safari ([#2691](https://github.com/PrismJS/prism/issues/2691)) [`cf28d1b2`](https://github.com/PrismJS/prism/commit/cf28d1b2)
* __Liquid__
    * Added Markup support, missing tokens, and other improvements ([#2950](https://github.com/PrismJS/prism/issues/2950)) [`ac1d12f9`](https://github.com/PrismJS/prism/commit/ac1d12f9)
* __Log file__
    * Minor improvements ([#2851](https://github.com/PrismJS/prism/issues/2851)) [`45ec4a88`](https://github.com/PrismJS/prism/commit/45ec4a88)
* __Markdown__
    * Improved code snippets ([#2967](https://github.com/PrismJS/prism/issues/2967)) [`e9477d83`](https://github.com/PrismJS/prism/commit/e9477d83)
    * Workaround for incorrect highlighting due to double `wrap` hook ([#2719](https://github.com/PrismJS/prism/issues/2719)) [`2b355c98`](https://github.com/PrismJS/prism/commit/2b355c98)
* __Markup__
    * Added support for DOM event attributes ([#2702](https://github.com/PrismJS/prism/issues/2702)) [`8dbbbb35`](https://github.com/PrismJS/prism/commit/8dbbbb35)
* __nginx__
    * Complete rewrite ([#2793](https://github.com/PrismJS/prism/issues/2793)) [`5943f4cb`](https://github.com/PrismJS/prism/commit/5943f4cb)
* __PHP__
    * Fixed functions with namespaces ([#2889](https://github.com/PrismJS/prism/issues/2889)) [`87d79390`](https://github.com/PrismJS/prism/commit/87d79390)
    * Fixed string interpolation ([#2864](https://github.com/PrismJS/prism/issues/2864)) [`cf3755cb`](https://github.com/PrismJS/prism/commit/cf3755cb)
    * Added missing PHP 7.4 `fn` keyword ([#2858](https://github.com/PrismJS/prism/issues/2858)) [`e0ee93f1`](https://github.com/PrismJS/prism/commit/e0ee93f1)
    * Fixed methods with keyword names + minor improvements ([#2818](https://github.com/PrismJS/prism/issues/2818)) [`7e8cd40d`](https://github.com/PrismJS/prism/commit/7e8cd40d)
    * Improved constant support for PHP 8.1 enums ([#2770](https://github.com/PrismJS/prism/issues/2770)) [`8019e2f6`](https://github.com/PrismJS/prism/commit/8019e2f6)
    * Added support for PHP 8.1 enums ([#2752](https://github.com/PrismJS/prism/issues/2752)) [`f79b0eef`](https://github.com/PrismJS/prism/commit/f79b0eef)
    * Class names at the start of a string are now highlighted correctly ([#2731](https://github.com/PrismJS/prism/issues/2731)) [`04ef309c`](https://github.com/PrismJS/prism/commit/04ef309c)
    * Numeral syntax improvements ([#2701](https://github.com/PrismJS/prism/issues/2701)) [`01af04ed`](https://github.com/PrismJS/prism/commit/01af04ed)
* __React JSX__
    * Added support for general spread expressions ([#2754](https://github.com/PrismJS/prism/issues/2754)) [`9f59f52d`](https://github.com/PrismJS/prism/commit/9f59f52d)
    * Added support for comments inside tags ([#2728](https://github.com/PrismJS/prism/issues/2728)) [`30b0444f`](https://github.com/PrismJS/prism/commit/30b0444f)
* __reST (reStructuredText)__
    * Fixed `inline` pattern ([#2946](https://github.com/PrismJS/prism/issues/2946)) [`a7656de6`](https://github.com/PrismJS/prism/commit/a7656de6)
* __Ruby__
    * Added heredoc literals ([#2885](https://github.com/PrismJS/prism/issues/2885)) [`20b77bff`](https://github.com/PrismJS/prism/commit/20b77bff)
    * Added missing regex flags ([#2845](https://github.com/PrismJS/prism/issues/2845)) [`3786f396`](https://github.com/PrismJS/prism/commit/3786f396)
    * Added missing regex interpolation ([#2841](https://github.com/PrismJS/prism/issues/2841)) [`f08c2f7f`](https://github.com/PrismJS/prism/commit/f08c2f7f)
* __Scheme__
    * Added support for high Unicode characters ([#2693](https://github.com/PrismJS/prism/issues/2693)) [`0e61a7e1`](https://github.com/PrismJS/prism/commit/0e61a7e1)
    * Added bracket support ([#2813](https://github.com/PrismJS/prism/issues/2813)) [`1c6c0bf3`](https://github.com/PrismJS/prism/commit/1c6c0bf3)
* __Shell session__
    * Fixed multi-line commands ([#2872](https://github.com/PrismJS/prism/issues/2872)) [`cda976b1`](https://github.com/PrismJS/prism/commit/cda976b1)
    * Commands prefixed with a path are now detected ([#2686](https://github.com/PrismJS/prism/issues/2686)) [`c83fd0b8`](https://github.com/PrismJS/prism/commit/c83fd0b8)
* __SQL__
    * Added `ILIKE` operator ([#2704](https://github.com/PrismJS/prism/issues/2704)) [`6e34771f`](https://github.com/PrismJS/prism/commit/6e34771f)
* __Swift__
    * Added `some` keyword ([#2756](https://github.com/PrismJS/prism/issues/2756)) [`cf354ef5`](https://github.com/PrismJS/prism/commit/cf354ef5)
* __TypeScript__
    * Updated keywords ([#2861](https://github.com/PrismJS/prism/issues/2861)) [`fe98d536`](https://github.com/PrismJS/prism/commit/fe98d536)
    * Added support for decorators ([#2820](https://github.com/PrismJS/prism/issues/2820)) [`31cc2142`](https://github.com/PrismJS/prism/commit/31cc2142)
* __VB.Net__
    * Improved strings, comments, and punctuation ([#2782](https://github.com/PrismJS/prism/issues/2782)) [`a68f1fb6`](https://github.com/PrismJS/prism/commit/a68f1fb6)
* __Xojo (REALbasic)__
    * `REM` is no longer highlighted as a keyword in comments ([#2823](https://github.com/PrismJS/prism/issues/2823)) [`ebbbfd47`](https://github.com/PrismJS/prism/commit/ebbbfd47)
    * Added last missing Keyword "Selector" ([#2807](https://github.com/PrismJS/prism/issues/2807)) [`e32e043b`](https://github.com/PrismJS/prism/commit/e32e043b)
    * Added missing keywords ([#2805](https://github.com/PrismJS/prism/issues/2805)) [`459365ec`](https://github.com/PrismJS/prism/commit/459365ec)

### Updated plugins

* Made Match Braces and Custom Class compatible ([#2947](https://github.com/PrismJS/prism/issues/2947)) [`4b55bd6a`](https://github.com/PrismJS/prism/commit/4b55bd6a)
* Consistent Prism check ([#2788](https://github.com/PrismJS/prism/issues/2788)) [`96335642`](https://github.com/PrismJS/prism/commit/96335642)
* __Command Line__
    * Don't modify empty code blocks ([#2896](https://github.com/PrismJS/prism/issues/2896)) [`c81c3319`](https://github.com/PrismJS/prism/commit/c81c3319)
* __Copy to Clipboard__
    * Removed ClipboardJS dependency ([#2784](https://github.com/PrismJS/prism/issues/2784)) [`d5e14e1a`](https://github.com/PrismJS/prism/commit/d5e14e1a)
    * Fixed `clipboard.writeText` not working inside iFrames ([#2826](https://github.com/PrismJS/prism/issues/2826)) [`01b7b6f7`](https://github.com/PrismJS/prism/commit/01b7b6f7)
    * Added support for custom styles ([#2789](https://github.com/PrismJS/prism/issues/2789)) [`4d7f75b0`](https://github.com/PrismJS/prism/commit/4d7f75b0)
    * Make copy-to-clipboard configurable with multiple attributes ([#2723](https://github.com/PrismJS/prism/issues/2723)) [`2cb909e1`](https://github.com/PrismJS/prism/commit/2cb909e1)
* __File Highlight__
    * Fixed Prism check ([#2827](https://github.com/PrismJS/prism/issues/2827)) [`53d34b22`](https://github.com/PrismJS/prism/commit/53d34b22)
* __Line Highlight__
    * Fixed linkable line numbers not being initialized ([#2732](https://github.com/PrismJS/prism/issues/2732)) [`ccc73ab7`](https://github.com/PrismJS/prism/commit/ccc73ab7)
* __Previewers__
    * Use `classList` instead of `className` ([#2787](https://github.com/PrismJS/prism/issues/2787)) [`d298d46e`](https://github.com/PrismJS/prism/commit/d298d46e)

### Other

* __Core__
    * Add `tabindex` to code blocks to enable keyboard navigation ([#2799](https://github.com/PrismJS/prism/issues/2799)) [`dbf70515`](https://github.com/PrismJS/prism/commit/dbf70515)
    * Fixed greedy rematching reach bug ([#2705](https://github.com/PrismJS/prism/issues/2705)) [`b37987d3`](https://github.com/PrismJS/prism/commit/b37987d3)
    * Added support for plaintext ([#2738](https://github.com/PrismJS/prism/issues/2738)) [`970674cf`](https://github.com/PrismJS/prism/commit/970674cf)
* __Infrastructure__
    * Added ESLint
    * Added `npm-run-all` to clean up test command ([#2938](https://github.com/PrismJS/prism/issues/2938)) [`5d3d8088`](https://github.com/PrismJS/prism/commit/5d3d8088)
    * Added link to Q&A to issue templates ([#2834](https://github.com/PrismJS/prism/issues/2834)) [`7cd9e794`](https://github.com/PrismJS/prism/commit/7cd9e794)
    * CI: Run tests with NodeJS 16.x ([#2888](https://github.com/PrismJS/prism/issues/2888)) [`b77317c5`](https://github.com/PrismJS/prism/commit/b7731   7c5)
    * Dangerfile: Trim merge base ([#2761](https://github.com/PrismJS/prism/issues/2761)) [`45b0e82a`](https://github.com/PrismJS/prism/commit/45b0e82a)
    * Dangerfile: Fixed how changed files are determined ([#2757](https://github.com/PrismJS/prism/issues/2757)) [`0feb266f`](https://github.com/PrismJS/prism/commit/0feb266f)
    * Deps: Updated regex tooling ([#2923](https://github.com/PrismJS/prism/issues/2923)) [`ad9878ad`](https://github.com/PrismJS/prism/commit/ad9878ad)
    * Tests: Added `--language` for patterns tests ([#2929](https://github.com/PrismJS/prism/issues/2929)) [`a62ef796`](https://github.com/PrismJS/prism/commit/a62ef796)
    * Tests: Fixed polynomial backtracking test ([#2891](https://github.com/PrismJS/prism/issues/2891)) [`8dbf1217`](https://github.com/PrismJS/prism/commit/8dbf1217)
    * Tests: Fixed languages test discovery [`a9a199b6`](https://github.com/PrismJS/prism/commit/a9a199b6)
    * Tests: Test discovery should ignore unsupported file extensions ([#2886](https://github.com/PrismJS/prism/issues/2886)) [`4492c5ce`](https://github.com/PrismJS/prism/commit/4492c5ce)
    * Tests: Exhaustive pattern tests ([#2688](https://github.com/PrismJS/prism/issues/2688)) [`53151404`](https://github.com/PrismJS/prism/commit/53151404)
    * Tests: Fixed pretty print incorrectly calculating print width ([#2821](https://github.com/PrismJS/prism/issues/2821)) [`5bc405e7`](https://github.com/PrismJS/prism/commit/5bc405e7)
    * Tests: Automatically normalize line ends ([#2934](https://github.com/PrismJS/prism/issues/2934)) [`99f3ddcd`](https://github.com/PrismJS/prism/commit/99f3ddcd)
    * Tests: Added `--insert` and `--update` parameters to language test ([#2809](https://github.com/PrismJS/prism/issues/2809)) [`4c8b855d`](https://github.com/PrismJS/prism/commit/4c8b855d)
    * Tests: Stricter `components.json` tests ([#2758](https://github.com/PrismJS/prism/issues/2758)) [`933af805`](https://github.com/PrismJS/prism/commit/933af805)
* __Website__
    * Copy to clipboard: Fixed highlighting ([#2725](https://github.com/PrismJS/prism/issues/2725)) [`7a790bf9`](https://github.com/PrismJS/prism/commit/7a790bf9)
    * Readme: Mention `npm ci` ([#2899](https://github.com/PrismJS/prism/issues/2899)) [`91f3aaed`](https://github.com/PrismJS/prism/commit/91f3aaed)
    * Readme: Added Node and npm version requirements ([#2790](https://github.com/PrismJS/prism/issues/2790)) [`cb220168`](https://github.com/PrismJS/prism/commit/cb220168)
    * Readme: Update link to Chinese translation ([#2749](https://github.com/PrismJS/prism/issues/2749)) [`266cc700`](https://github.com/PrismJS/prism/commit/266cc700)
    * Replace `my.cdn` in code sample with Handlebars-like placeholder ([#2906](https://github.com/PrismJS/prism/issues/2906)) [`80471181`](https://github.com/PrismJS/prism/commit/80471181)
    * Set dummy domain for CDN ([#2905](https://github.com/PrismJS/prism/issues/2905)) [`38f1d289`](https://github.com/PrismJS/prism/commit/38f1d289)
    * Added MySQL to "Used by" section ([#2785](https://github.com/PrismJS/prism/issues/2785)) [`9b784ebf`](https://github.com/PrismJS/prism/commit/9b784ebf)
    * Improved basic usage section ([#2777](https://github.com/PrismJS/prism/issues/2777)) [`a1209930`](https://github.com/PrismJS/prism/commit/a1209930)
    * Updated URL in Autolinker example ([#2751](https://github.com/PrismJS/prism/issues/2751)) [`ec9767d6`](https://github.com/PrismJS/prism/commit/ec9767d6)
    * Added React native tutorial ([#2683](https://github.com/PrismJS/prism/issues/2683)) [`1506f345`](https://github.com/PrismJS/prism/commit/1506f345)


## 1.23.0 (2020-12-31)

### New components

* __Apex__ ([#2622](https://github.com/PrismJS/prism/issues/2622)) [`f0e2b70e`](https://github.com/PrismJS/prism/commit/f0e2b70e)
* __DataWeave__ ([#2659](https://github.com/PrismJS/prism/issues/2659)) [`0803525b`](https://github.com/PrismJS/prism/commit/0803525b)
* __PromQL__ ([#2628](https://github.com/PrismJS/prism/issues/2628)) [`8831c706`](https://github.com/PrismJS/prism/commit/8831c706)

### Updated components

* Fixed multiple vulnerable regexes ([#2584](https://github.com/PrismJS/prism/issues/2584)) [`c2f6a644`](https://github.com/PrismJS/prism/commit/c2f6a644)
* __Apache Configuration__
    * Update directive-flag to match `=` ([#2612](https://github.com/PrismJS/prism/issues/2612)) [`00bf00e3`](https://github.com/PrismJS/prism/commit/00bf00e3)
* __C-like__
    * Made all comments greedy ([#2680](https://github.com/PrismJS/prism/issues/2680)) [`0a3932fe`](https://github.com/PrismJS/prism/commit/0a3932fe)
* __C__
    * Better class name and macro name detection ([#2585](https://github.com/PrismJS/prism/issues/2585)) [`129faf5c`](https://github.com/PrismJS/prism/commit/129faf5c)
* __Content-Security-Policy__
    * Added missing directives and keywords ([#2664](https://github.com/PrismJS/prism/issues/2664)) [`f1541342`](https://github.com/PrismJS/prism/commit/f1541342)
    * Do not highlight directive names with adjacent hyphens ([#2662](https://github.com/PrismJS/prism/issues/2662)) [`a7ccc16d`](https://github.com/PrismJS/prism/commit/a7ccc16d)
* __CSS__
    * Better HTML `style` attribute tokenization ([#2569](https://github.com/PrismJS/prism/issues/2569)) [`b04cbafe`](https://github.com/PrismJS/prism/commit/b04cbafe)
* __Java__
    * Improved package and class name detection ([#2599](https://github.com/PrismJS/prism/issues/2599)) [`0889bc7c`](https://github.com/PrismJS/prism/commit/0889bc7c)
    * Added Java 15 keywords ([#2567](https://github.com/PrismJS/prism/issues/2567)) [`73f81c89`](https://github.com/PrismJS/prism/commit/73f81c89)
* __Java stack trace__
    * Added support stack frame element class loaders and modules ([#2658](https://github.com/PrismJS/prism/issues/2658)) [`0bb4f096`](https://github.com/PrismJS/prism/commit/0bb4f096)
* __Julia__
    * Removed constants that are not exported by default ([#2601](https://github.com/PrismJS/prism/issues/2601)) [`093c8175`](https://github.com/PrismJS/prism/commit/093c8175)
* __Kotlin__
    * Added support for backticks in function names ([#2489](https://github.com/PrismJS/prism/issues/2489)) [`a5107d5c`](https://github.com/PrismJS/prism/commit/a5107d5c)
* __Latte__
    * Fixed exponential backtracking ([#2682](https://github.com/PrismJS/prism/issues/2682)) [`89f1e182`](https://github.com/PrismJS/prism/commit/89f1e182)
* __Markdown__
    * Improved URL tokenization ([#2678](https://github.com/PrismJS/prism/issues/2678)) [`2af3e2c2`](https://github.com/PrismJS/prism/commit/2af3e2c2)
    * Added support for YAML front matter ([#2634](https://github.com/PrismJS/prism/issues/2634)) [`5cf9cfbc`](https://github.com/PrismJS/prism/commit/5cf9cfbc)
* __PHP__
    * Added support for PHP 7.4 + other major improvements ([#2566](https://github.com/PrismJS/prism/issues/2566)) [`38808e64`](https://github.com/PrismJS/prism/commit/38808e64)
    * Added support for PHP 8.0 features ([#2591](https://github.com/PrismJS/prism/issues/2591)) [`df922d90`](https://github.com/PrismJS/prism/commit/df922d90)
    * Removed C-like dependency ([#2619](https://github.com/PrismJS/prism/issues/2619)) [`89ebb0b7`](https://github.com/PrismJS/prism/commit/89ebb0b7)
    * Fixed exponential backtracking ([#2684](https://github.com/PrismJS/prism/issues/2684)) [`37b9c9a1`](https://github.com/PrismJS/prism/commit/37b9c9a1)
* __Sass (Scss)__
    * Added support for Sass modules ([#2643](https://github.com/PrismJS/prism/issues/2643)) [`deb238a6`](https://github.com/PrismJS/prism/commit/deb238a6)
* __Scheme__
    * Fixed number pattern ([#2648](https://github.com/PrismJS/prism/issues/2648)) [`e01ecd00`](https://github.com/PrismJS/prism/commit/e01ecd00)
    * Fixed function and function-like false positives ([#2611](https://github.com/PrismJS/prism/issues/2611)) [`7951ca24`](https://github.com/PrismJS/prism/commit/7951ca24)
* __Shell session__
    * Fixed false positives because of links in command output ([#2649](https://github.com/PrismJS/prism/issues/2649)) [`8e76a978`](https://github.com/PrismJS/prism/commit/8e76a978)
* __TSX__
    * Temporary fix for the collisions of JSX tags and TS generics ([#2596](https://github.com/PrismJS/prism/issues/2596)) [`25bdb494`](https://github.com/PrismJS/prism/commit/25bdb494)

### Updated plugins

* Made Autoloader and Diff Highlight compatible ([#2580](https://github.com/PrismJS/prism/issues/2580)) [`7a74497a`](https://github.com/PrismJS/prism/commit/7a74497a)
* __Copy to Clipboard Button__
    * Set `type="button"` attribute for copy to clipboard plugin ([#2593](https://github.com/PrismJS/prism/issues/2593)) [`f59a85f1`](https://github.com/PrismJS/prism/commit/f59a85f1)
* __File Highlight__
    * Fixed IE compatibility problem ([#2656](https://github.com/PrismJS/prism/issues/2656)) [`3f4ae00d`](https://github.com/PrismJS/prism/commit/3f4ae00d)
* __Line Highlight__
    * Fixed top offset in combination with Line numbers ([#2237](https://github.com/PrismJS/prism/issues/2237)) [`b40f8f4b`](https://github.com/PrismJS/prism/commit/b40f8f4b)
    * Fixed print background color ([#2668](https://github.com/PrismJS/prism/issues/2668)) [`cdb24abe`](https://github.com/PrismJS/prism/commit/cdb24abe)
* __Line Numbers__
    * Fixed null reference ([#2605](https://github.com/PrismJS/prism/issues/2605)) [`7cdfe556`](https://github.com/PrismJS/prism/commit/7cdfe556)
* __Treeview__
    * Fixed icons on dark themes ([#2631](https://github.com/PrismJS/prism/issues/2631)) [`7266e32f`](https://github.com/PrismJS/prism/commit/7266e32f)
* __Unescaped Markup__
    * Refactoring ([#2445](https://github.com/PrismJS/prism/issues/2445)) [`fc602822`](https://github.com/PrismJS/prism/commit/fc602822)

### Other

* Readme: Added alternative link for Chinese translation [`071232b4`](https://github.com/PrismJS/prism/commit/071232b4)
* Readme: Removed broken icon for Chinese translation ([#2670](https://github.com/PrismJS/prism/issues/2670)) [`2ea202b9`](https://github.com/PrismJS/prism/commit/2ea202b9)
* Readme: Grammar adjustments ([#2629](https://github.com/PrismJS/prism/issues/2629)) [`f217ab75`](https://github.com/PrismJS/prism/commit/f217ab75)
* __Core__
    * Moved pattern matching + lookbehind logic into function ([#2633](https://github.com/PrismJS/prism/issues/2633)) [`24574406`](https://github.com/PrismJS/prism/commit/24574406)
    * Fixed bug with greedy matching ([#2632](https://github.com/PrismJS/prism/issues/2632)) [`8fa8dd24`](https://github.com/PrismJS/prism/commit/8fa8dd24)
* __Infrastructure__
    * Migrate from TravisCI -> GitHub Actions ([#2606](https://github.com/PrismJS/prism/issues/2606)) [`69132045`](https://github.com/PrismJS/prism/commit/69132045)
    * Added Dangerfile and provide bundle size info ([#2608](https://github.com/PrismJS/prism/issues/2608)) [`9df20c5e`](https://github.com/PrismJS/prism/commit/9df20c5e)
    * New `start` script to start local server ([#2491](https://github.com/PrismJS/prism/issues/2491)) [`0604793c`](https://github.com/PrismJS/prism/commit/0604793c)
    * Added test for exponential backtracking ([#2590](https://github.com/PrismJS/prism/issues/2590)) [`05afbb10`](https://github.com/PrismJS/prism/commit/05afbb10)
    * Added test for polynomial backtracking ([#2597](https://github.com/PrismJS/prism/issues/2597)) [`e644178b`](https://github.com/PrismJS/prism/commit/e644178b)
    * Tests: Better pretty print ([#2600](https://github.com/PrismJS/prism/issues/2600)) [`8bfcc819`](https://github.com/PrismJS/prism/commit/8bfcc819)
    * Tests: Fixed sorted language list test ([#2623](https://github.com/PrismJS/prism/issues/2623)) [`2d3a1267`](https://github.com/PrismJS/prism/commit/2d3a1267)
    * Tests: Stricter pattern for nice-token-names test ([#2588](https://github.com/PrismJS/prism/issues/2588)) [`0df60be1`](https://github.com/PrismJS/prism/commit/0df60be1)
    * Tests: Added strict checks for `Prism.languages.extend` ([#2572](https://github.com/PrismJS/prism/issues/2572)) [`8828500e`](https://github.com/PrismJS/prism/commit/8828500e)
* __Website__
    * Test page: Added "Share" option ([#2575](https://github.com/PrismJS/prism/issues/2575)) [`b5f4f10e`](https://github.com/PrismJS/prism/commit/b5f4f10e)
    * Test page: Don't trigger ad-blockers with class ([#2677](https://github.com/PrismJS/prism/issues/2677)) [`df0738e9`](https://github.com/PrismJS/prism/commit/df0738e9)
    * Thousands -> millions [`9f82de50`](https://github.com/PrismJS/prism/commit/9f82de50)
    * Unescaped Markup: More doc regarding comments ([#2652](https://github.com/PrismJS/prism/issues/2652)) [`add3736a`](https://github.com/PrismJS/prism/commit/add3736a)
    * Website: Added and updated documentation ([#2654](https://github.com/PrismJS/prism/issues/2654)) [`8e660495`](https://github.com/PrismJS/prism/commit/8e660495)
    * Website: Updated and improved guide on "Extending Prism" page ([#2586](https://github.com/PrismJS/prism/issues/2586)) [`8e1f38ff`](https://github.com/PrismJS/prism/commit/8e1f38ff)

## 1.22.0 (2020-10-10)

### New components

* __Birb__ ([#2542](https://github.com/PrismJS/prism/issues/2542)) [`4d31e22a`](https://github.com/PrismJS/prism/commit/4d31e22a)
* __BSL (1C:Enterprise)__ & __OneScript__ ([#2520](https://github.com/PrismJS/prism/issues/2520)) [`5c33f0bb`](https://github.com/PrismJS/prism/commit/5c33f0bb)
* __MongoDB__ ([#2518](https://github.com/PrismJS/prism/issues/2518)) [`004eaa74`](https://github.com/PrismJS/prism/commit/004eaa74)
* __Naninovel Script__ ([#2494](https://github.com/PrismJS/prism/issues/2494)) [`388ad996`](https://github.com/PrismJS/prism/commit/388ad996)
* __PureScript__ ([#2526](https://github.com/PrismJS/prism/issues/2526)) [`ad748a00`](https://github.com/PrismJS/prism/commit/ad748a00)
* __SML__ & __SML/NJ__ ([#2537](https://github.com/PrismJS/prism/issues/2537)) [`cb75d9e2`](https://github.com/PrismJS/prism/commit/cb75d9e2)
* __Stan__ ([#2490](https://github.com/PrismJS/prism/issues/2490)) [`2da2beba`](https://github.com/PrismJS/prism/commit/2da2beba)
* __TypoScript__ & __TSConfig__ ([#2505](https://github.com/PrismJS/prism/issues/2505)) [`bf115f47`](https://github.com/PrismJS/prism/commit/bf115f47)

### Updated components

* Removed duplicate alternatives in various languages ([#2524](https://github.com/PrismJS/prism/issues/2524)) [`fa2225ff`](https://github.com/PrismJS/prism/commit/fa2225ff)
* __Haskell__
    * Improvements ([#2535](https://github.com/PrismJS/prism/issues/2535)) [`e023044c`](https://github.com/PrismJS/prism/commit/e023044c)
* __JS Extras__
    * Highlight import and export bindings ([#2533](https://github.com/PrismJS/prism/issues/2533)) [`c51ababb`](https://github.com/PrismJS/prism/commit/c51ababb)
    * Added control-flow keywords ([#2529](https://github.com/PrismJS/prism/issues/2529)) [`bcef22af`](https://github.com/PrismJS/prism/commit/bcef22af)
* __PHP__
    * Added `match` keyword (PHP 8.0) ([#2574](https://github.com/PrismJS/prism/issues/2574)) [`1761513e`](https://github.com/PrismJS/prism/commit/1761513e)
* __Processing__
    * Fixed function pattern ([#2564](https://github.com/PrismJS/prism/issues/2564)) [`35cbc02f`](https://github.com/PrismJS/prism/commit/35cbc02f)
* __Regex__
    * Changed how languages embed regexes ([#2532](https://github.com/PrismJS/prism/issues/2532)) [`f62ca787`](https://github.com/PrismJS/prism/commit/f62ca787)
* __Rust__
    * Fixed Unicode char literals ([#2550](https://github.com/PrismJS/prism/issues/2550)) [`3b4f14ca`](https://github.com/PrismJS/prism/commit/3b4f14ca)
* __Scheme__
    * Added support for R7RS syntax ([#2525](https://github.com/PrismJS/prism/issues/2525)) [`e4f6ccac`](https://github.com/PrismJS/prism/commit/e4f6ccac)
* __Shell session__
    * Added aliases ([#2548](https://github.com/PrismJS/prism/issues/2548)) [`bfb36748`](https://github.com/PrismJS/prism/commit/bfb36748)
    * Highlight all commands after the start of any Heredoc string ([#2509](https://github.com/PrismJS/prism/issues/2509)) [`6c921801`](https://github.com/PrismJS/prism/commit/6c921801)
* __YAML__
    * Improved key pattern ([#2561](https://github.com/PrismJS/prism/issues/2561)) [`59853a52`](https://github.com/PrismJS/prism/commit/59853a52)

### Updated plugins

* __Autoloader__
    * Fixed file detection regexes ([#2549](https://github.com/PrismJS/prism/issues/2549)) [`d36ea993`](https://github.com/PrismJS/prism/commit/d36ea993)
* __Match braces__
    * Fixed JS interpolation punctuation ([#2541](https://github.com/PrismJS/prism/issues/2541)) [`6b47133d`](https://github.com/PrismJS/prism/commit/6b47133d)
* __Show Language__
    * Added title for plain text ([#2555](https://github.com/PrismJS/prism/issues/2555)) [`a409245e`](https://github.com/PrismJS/prism/commit/a409245e)

### Other

* Tests: Added an option to accept the actual token stream ([#2515](https://github.com/PrismJS/prism/issues/2515)) [`bafab634`](https://github.com/PrismJS/prism/commit/bafab634)
* __Core__
    * Docs: Minor improvement ([#2513](https://github.com/PrismJS/prism/issues/2513)) [`206dc80f`](https://github.com/PrismJS/prism/commit/206dc80f)
* __Infrastructure__
    * JSDoc: Fixed line ends ([#2523](https://github.com/PrismJS/prism/issues/2523)) [`bf169e5f`](https://github.com/PrismJS/prism/commit/bf169e5f)
* __Website__
    * Website: Added new SB101 tutorial replacing the Crambler one ([#2576](https://github.com/PrismJS/prism/issues/2576)) [`655f985c`](https://github.com/PrismJS/prism/commit/655f985c)
    * Website: Fix typo on homepage by adding missing word add ([#2570](https://github.com/PrismJS/prism/issues/2570)) [`8ae6a4ba`](https://github.com/PrismJS/prism/commit/8ae6a4ba)
    * Custom class: Improved doc ([#2512](https://github.com/PrismJS/prism/issues/2512)) [`5ad6cb23`](https://github.com/PrismJS/prism/commit/5ad6cb23)

## 1.21.0 (2020-08-06)

### New components

* __.ignore__ & __.gitignore__ & __.hgignore__ & __.npmignore__ ([#2481](https://github.com/PrismJS/prism/issues/2481)) [`3fcce6fe`](https://github.com/PrismJS/prism/commit/3fcce6fe)
* __Agda__ ([#2430](https://github.com/PrismJS/prism/issues/2430)) [`3a127c7d`](https://github.com/PrismJS/prism/commit/3a127c7d)
* __AL__ ([#2300](https://github.com/PrismJS/prism/issues/2300)) [`de21eb64`](https://github.com/PrismJS/prism/commit/de21eb64)
* __Cypher__ ([#2459](https://github.com/PrismJS/prism/issues/2459)) [`398e2943`](https://github.com/PrismJS/prism/commit/398e2943)
* __Dhall__ ([#2473](https://github.com/PrismJS/prism/issues/2473)) [`649e51e5`](https://github.com/PrismJS/prism/commit/649e51e5)
* __EditorConfig__ ([#2471](https://github.com/PrismJS/prism/issues/2471)) [`ed8fff91`](https://github.com/PrismJS/prism/commit/ed8fff91)
* __HLSL__ ([#2318](https://github.com/PrismJS/prism/issues/2318)) [`87a5c7ae`](https://github.com/PrismJS/prism/commit/87a5c7ae)
* __JS stack trace__ ([#2418](https://github.com/PrismJS/prism/issues/2418)) [`ae0327b3`](https://github.com/PrismJS/prism/commit/ae0327b3)
* __PeopleCode__ ([#2302](https://github.com/PrismJS/prism/issues/2302)) [`bd4d8165`](https://github.com/PrismJS/prism/commit/bd4d8165)
* __PureBasic__ ([#2369](https://github.com/PrismJS/prism/issues/2369)) [`d0c1c70d`](https://github.com/PrismJS/prism/commit/d0c1c70d)
* __Racket__ ([#2315](https://github.com/PrismJS/prism/issues/2315)) [`053016ef`](https://github.com/PrismJS/prism/commit/053016ef)
* __Smali__ ([#2419](https://github.com/PrismJS/prism/issues/2419)) [`22eb5cad`](https://github.com/PrismJS/prism/commit/22eb5cad)
* __Structured Text (IEC 61131-3)__ ([#2311](https://github.com/PrismJS/prism/issues/2311)) [`8704cdfb`](https://github.com/PrismJS/prism/commit/8704cdfb)
* __UnrealScript__ ([#2305](https://github.com/PrismJS/prism/issues/2305)) [`1093ceb3`](https://github.com/PrismJS/prism/commit/1093ceb3)
* __WarpScript__ ([#2307](https://github.com/PrismJS/prism/issues/2307)) [`cde5b0fa`](https://github.com/PrismJS/prism/commit/cde5b0fa)
* __XML doc (.net)__ ([#2340](https://github.com/PrismJS/prism/issues/2340)) [`caec5e30`](https://github.com/PrismJS/prism/commit/caec5e30)
* __YANG__ ([#2467](https://github.com/PrismJS/prism/issues/2467)) [`ed1df1e1`](https://github.com/PrismJS/prism/commit/ed1df1e1)

### Updated components

* Markup & JSON: Added new aliases ([#2390](https://github.com/PrismJS/prism/issues/2390)) [`9782cfe6`](https://github.com/PrismJS/prism/commit/9782cfe6)
* Fixed several cases of exponential backtracking ([#2268](https://github.com/PrismJS/prism/issues/2268)) [`7a554b5f`](https://github.com/PrismJS/prism/commit/7a554b5f)
* __APL__
    * Added `⍥` ([#2409](https://github.com/PrismJS/prism/issues/2409)) [`0255cb6a`](https://github.com/PrismJS/prism/commit/0255cb6a)
* __AutoHotkey__
    * Added missing `format` built-in ([#2450](https://github.com/PrismJS/prism/issues/2450)) [`7c66cfc4`](https://github.com/PrismJS/prism/commit/7c66cfc4)
    * Improved comments and other improvements ([#2412](https://github.com/PrismJS/prism/issues/2412)) [`ddf3cc62`](https://github.com/PrismJS/prism/commit/ddf3cc62)
    * Added missing definitions ([#2400](https://github.com/PrismJS/prism/issues/2400)) [`4fe03676`](https://github.com/PrismJS/prism/commit/4fe03676)
* __Bash__
    * Added `composer` command ([#2298](https://github.com/PrismJS/prism/issues/2298)) [`044dd271`](https://github.com/PrismJS/prism/commit/044dd271)
* __Batch__
    * Fix escaped double quote ([#2485](https://github.com/PrismJS/prism/issues/2485)) [`f0f8210c`](https://github.com/PrismJS/prism/commit/f0f8210c)
* __C__
    * Improved macros and expressions ([#2440](https://github.com/PrismJS/prism/issues/2440)) [`8a72fa6f`](https://github.com/PrismJS/prism/commit/8a72fa6f)
    * Improved macros ([#2320](https://github.com/PrismJS/prism/issues/2320)) [`fdcf7ed2`](https://github.com/PrismJS/prism/commit/fdcf7ed2)
* __C#__
    * Improved pattern matching ([#2411](https://github.com/PrismJS/prism/issues/2411)) [`7f341fc1`](https://github.com/PrismJS/prism/commit/7f341fc1)
    * Fixed adjacent string interpolations ([#2402](https://github.com/PrismJS/prism/issues/2402)) [`2a2e79ed`](https://github.com/PrismJS/prism/commit/2a2e79ed)
* __C++__
    * Added support for default comparison operator ([#2426](https://github.com/PrismJS/prism/issues/2426)) [`8e9d161c`](https://github.com/PrismJS/prism/commit/8e9d161c)
    * Improved class name detection ([#2348](https://github.com/PrismJS/prism/issues/2348)) [`e3fe9040`](https://github.com/PrismJS/prism/commit/e3fe9040)
    * Fixed `enum class` class names ([#2342](https://github.com/PrismJS/prism/issues/2342)) [`30b4e254`](https://github.com/PrismJS/prism/commit/30b4e254)
* __Content-Security-Policy__
    * Fixed directives ([#2461](https://github.com/PrismJS/prism/issues/2461)) [`537a9e80`](https://github.com/PrismJS/prism/commit/537a9e80)
* __CSS__
    * Improved url and added keywords ([#2432](https://github.com/PrismJS/prism/issues/2432)) [`964de5a1`](https://github.com/PrismJS/prism/commit/964de5a1)
* __CSS Extras__
    * Optimized `class` and `id` patterns ([#2359](https://github.com/PrismJS/prism/issues/2359)) [`fdbc4473`](https://github.com/PrismJS/prism/commit/fdbc4473)
    * Renamed `attr-{name,value}` tokens and added tokens for combinators and selector lists ([#2373](https://github.com/PrismJS/prism/issues/2373)) [`e523f5d0`](https://github.com/PrismJS/prism/commit/e523f5d0)
* __Dart__
    * Added missing keywords ([#2355](https://github.com/PrismJS/prism/issues/2355)) [`4172ab6f`](https://github.com/PrismJS/prism/commit/4172ab6f)
* __Diff__
    * Added `prefix` token ([#2281](https://github.com/PrismJS/prism/issues/2281)) [`fd432a5b`](https://github.com/PrismJS/prism/commit/fd432a5b)
* __Docker__
    * Fixed strings inside comments ([#2428](https://github.com/PrismJS/prism/issues/2428)) [`37273a6f`](https://github.com/PrismJS/prism/commit/37273a6f)
* __EditorConfig__
    * Trim spaces before key and section title ([#2482](https://github.com/PrismJS/prism/issues/2482)) [`0c30c582`](https://github.com/PrismJS/prism/commit/0c30c582)
* __EJS__
    * Added `eta` alias ([#2282](https://github.com/PrismJS/prism/issues/2282)) [`0cfb6c5f`](https://github.com/PrismJS/prism/commit/0cfb6c5f)
* __GLSL__
    * Improvements ([#2321](https://github.com/PrismJS/prism/issues/2321)) [`33e49956`](https://github.com/PrismJS/prism/commit/33e49956)
* __GraphQL__
    * Added missing keywords ([#2407](https://github.com/PrismJS/prism/issues/2407)) [`de8ed16d`](https://github.com/PrismJS/prism/commit/de8ed16d)
    * Added support for multi-line strings and descriptions ([#2406](https://github.com/PrismJS/prism/issues/2406)) [`9e64c62e`](https://github.com/PrismJS/prism/commit/9e64c62e)
* __Io__
    * Fixed operator pattern ([#2365](https://github.com/PrismJS/prism/issues/2365)) [`d6055771`](https://github.com/PrismJS/prism/commit/d6055771)
* __Java__
    * Fixed `namespace` token ([#2295](https://github.com/PrismJS/prism/issues/2295)) [`62e184bb`](https://github.com/PrismJS/prism/commit/62e184bb)
* __JavaDoc__
    * Improvements ([#2324](https://github.com/PrismJS/prism/issues/2324)) [`032910ba`](https://github.com/PrismJS/prism/commit/032910ba)
* __JavaScript__
    * Improved regex detection ([#2465](https://github.com/PrismJS/prism/issues/2465)) [`4f55052f`](https://github.com/PrismJS/prism/commit/4f55052f)
    * Improved `get`/`set` and parameter detection ([#2387](https://github.com/PrismJS/prism/issues/2387)) [`ed715158`](https://github.com/PrismJS/prism/commit/ed715158)
    * Added support for logical assignment operators ([#2378](https://github.com/PrismJS/prism/issues/2378)) [`b28f21b7`](https://github.com/PrismJS/prism/commit/b28f21b7)
* __JSDoc__
    * Improvements ([#2466](https://github.com/PrismJS/prism/issues/2466)) [`2805ae35`](https://github.com/PrismJS/prism/commit/2805ae35)
* __JSON__
    * Greedy comments ([#2479](https://github.com/PrismJS/prism/issues/2479)) [`158caf52`](https://github.com/PrismJS/prism/commit/158caf52)
* __Julia__
    * Improved strings, comments, and other patterns ([#2363](https://github.com/PrismJS/prism/issues/2363)) [`81cf2344`](https://github.com/PrismJS/prism/commit/81cf2344)
* __Kotlin__
    * Added `kt` and `kts` aliases ([#2474](https://github.com/PrismJS/prism/issues/2474)) [`67f97e2e`](https://github.com/PrismJS/prism/commit/67f97e2e)
* __Markup__
    * Added tokens inside DOCTYPE ([#2349](https://github.com/PrismJS/prism/issues/2349)) [`9c7bc820`](https://github.com/PrismJS/prism/commit/9c7bc820)
    * Added `attr-equals` alias for the attribute `=` sign ([#2350](https://github.com/PrismJS/prism/issues/2350)) [`96a0116e`](https://github.com/PrismJS/prism/commit/96a0116e)
    * Added alias for named entities ([#2351](https://github.com/PrismJS/prism/issues/2351)) [`ab1e34ae`](https://github.com/PrismJS/prism/commit/ab1e34ae)
    * Added support for SSML ([#2306](https://github.com/PrismJS/prism/issues/2306)) [`eb70070d`](https://github.com/PrismJS/prism/commit/eb70070d)
* __Objective-C__
    * Added `objc` alias ([#2331](https://github.com/PrismJS/prism/issues/2331)) [`67c6b7af`](https://github.com/PrismJS/prism/commit/67c6b7af)
* __PowerShell__
    * New functions pattern bases on naming conventions ([#2301](https://github.com/PrismJS/prism/issues/2301)) [`fec39bcf`](https://github.com/PrismJS/prism/commit/fec39bcf)
* __Protocol Buffers__
    * Added support for RPC syntax ([#2414](https://github.com/PrismJS/prism/issues/2414)) [`939a17c4`](https://github.com/PrismJS/prism/commit/939a17c4)
* __Pug__
    * Improved class and id detection in tags ([#2358](https://github.com/PrismJS/prism/issues/2358)) [`7f948ecb`](https://github.com/PrismJS/prism/commit/7f948ecb)
* __Python__
    * Fixed empty multiline strings ([#2344](https://github.com/PrismJS/prism/issues/2344)) [`c9324476`](https://github.com/PrismJS/prism/commit/c9324476)
* __Regex__
    * Added aliases and minor improvements ([#2325](https://github.com/PrismJS/prism/issues/2325)) [`8a72830a`](https://github.com/PrismJS/prism/commit/8a72830a)
* __Ren'py__
    * Added `rpy` alias ([#2385](https://github.com/PrismJS/prism/issues/2385)) [`4935b5ca`](https://github.com/PrismJS/prism/commit/4935b5ca)
* __Ruby__
    * Optimized `regex` and `string` patterns ([#2354](https://github.com/PrismJS/prism/issues/2354)) [`b526e8c0`](https://github.com/PrismJS/prism/commit/b526e8c0)
* __Rust__
    * Improvements ([#2464](https://github.com/PrismJS/prism/issues/2464)) [`2ff40fe0`](https://github.com/PrismJS/prism/commit/2ff40fe0)
    * Improvements ([#2332](https://github.com/PrismJS/prism/issues/2332)) [`194c5429`](https://github.com/PrismJS/prism/commit/194c5429)
* __SAS__
    * Improved macro string functions ([#2463](https://github.com/PrismJS/prism/issues/2463)) [`278316ca`](https://github.com/PrismJS/prism/commit/278316ca)
    * Handle edge case of string macro functions ([#2451](https://github.com/PrismJS/prism/issues/2451)) [`a0a9f1ef`](https://github.com/PrismJS/prism/commit/a0a9f1ef)
    * Improved comments in `proc groovy` and `proc lua` ([#2392](https://github.com/PrismJS/prism/issues/2392)) [`475a5903`](https://github.com/PrismJS/prism/commit/475a5903)
* __Scheme__
    * Adjusted lookbehind for literals ([#2396](https://github.com/PrismJS/prism/issues/2396)) [`1e3f542b`](https://github.com/PrismJS/prism/commit/1e3f542b)
    * Improved lambda parameter ([#2346](https://github.com/PrismJS/prism/issues/2346)) [`1946918a`](https://github.com/PrismJS/prism/commit/1946918a)
    * Consistent lookaheads ([#2322](https://github.com/PrismJS/prism/issues/2322)) [`d2541d54`](https://github.com/PrismJS/prism/commit/d2541d54)
    * Improved boolean ([#2316](https://github.com/PrismJS/prism/issues/2316)) [`e27e65af`](https://github.com/PrismJS/prism/commit/e27e65af)
    * Added missing special keywords ([#2304](https://github.com/PrismJS/prism/issues/2304)) [`ac297ba5`](https://github.com/PrismJS/prism/commit/ac297ba5)
    * Improvements ([#2263](https://github.com/PrismJS/prism/issues/2263)) [`9a49f78f`](https://github.com/PrismJS/prism/commit/9a49f78f)
* __Solidity (Ethereum)__
    * Added `sol` alias ([#2382](https://github.com/PrismJS/prism/issues/2382)) [`6352213a`](https://github.com/PrismJS/prism/commit/6352213a)
* __SQL__
    * Added PostgreSQL `RETURNING` keyword ([#2476](https://github.com/PrismJS/prism/issues/2476)) [`bea7a585`](https://github.com/PrismJS/prism/commit/bea7a585)
* __Stylus__
    * Fixed comments breaking declarations + minor improvements ([#2372](https://github.com/PrismJS/prism/issues/2372)) [`6d663b6e`](https://github.com/PrismJS/prism/commit/6d663b6e)
    * New tokens and other improvements ([#2368](https://github.com/PrismJS/prism/issues/2368)) [`2c10ef8a`](https://github.com/PrismJS/prism/commit/2c10ef8a)
    * Fixed comments breaking strings and URLs ([#2361](https://github.com/PrismJS/prism/issues/2361)) [`0d65d6c9`](https://github.com/PrismJS/prism/commit/0d65d6c9)
* __T4 Text Templates (VB)__
    * Use the correct VB variant ([#2341](https://github.com/PrismJS/prism/issues/2341)) [`b6093339`](https://github.com/PrismJS/prism/commit/b6093339)
* __TypeScript__
    * Added `asserts` keyword and other improvements ([#2280](https://github.com/PrismJS/prism/issues/2280)) [`a197cfcd`](https://github.com/PrismJS/prism/commit/a197cfcd)
* __Visual Basic__
    * Added VBA alias ([#2469](https://github.com/PrismJS/prism/issues/2469)) [`78161d60`](https://github.com/PrismJS/prism/commit/78161d60)
    * Added `until` keyword ([#2423](https://github.com/PrismJS/prism/issues/2423)) [`a13ee8d9`](https://github.com/PrismJS/prism/commit/a13ee8d9)
    * Added missing keywords ([#2376](https://github.com/PrismJS/prism/issues/2376)) [`ba5ac1da`](https://github.com/PrismJS/prism/commit/ba5ac1da)

### Updated plugins

* File Highlight & JSONP Highlight update ([#1974](https://github.com/PrismJS/prism/issues/1974)) [`afea17d9`](https://github.com/PrismJS/prism/commit/afea17d9)
* Added general de/activation mechanism for plugins ([#2434](https://github.com/PrismJS/prism/issues/2434)) [`a36e96ab`](https://github.com/PrismJS/prism/commit/a36e96ab)
* __Autoloader__
    * Fixed bug breaking Autoloader ([#2449](https://github.com/PrismJS/prism/issues/2449)) [`a3416bf3`](https://github.com/PrismJS/prism/commit/a3416bf3)
    * Fixed `data-dependencies` and extensions ([#2326](https://github.com/PrismJS/prism/issues/2326)) [`1654b25f`](https://github.com/PrismJS/prism/commit/1654b25f)
    * Improved path detection and other minor improvements ([#2245](https://github.com/PrismJS/prism/issues/2245)) [`5cdc3251`](https://github.com/PrismJS/prism/commit/5cdc3251)
* __Command Line__
    * Some refactoring ([#2290](https://github.com/PrismJS/prism/issues/2290)) [`8c9c2896`](https://github.com/PrismJS/prism/commit/8c9c2896)
    * Correctly rehighlight elements ([#2291](https://github.com/PrismJS/prism/issues/2291)) [`e6b2c6fc`](https://github.com/PrismJS/prism/commit/e6b2c6fc)
* __Line Highlight__
    * Added linkable line numbers ([#2328](https://github.com/PrismJS/prism/issues/2328)) [`eb82e804`](https://github.com/PrismJS/prism/commit/eb82e804)
* __Line Numbers__
    * Improved resize performance ([#2125](https://github.com/PrismJS/prism/issues/2125)) [`b96ed225`](https://github.com/PrismJS/prism/commit/b96ed225)
    * Fixed TypeError when `lineNumberWrapper` is null ([#2337](https://github.com/PrismJS/prism/issues/2337)) [`4b61661d`](https://github.com/PrismJS/prism/commit/4b61661d)
    * Exposed `_resizeElement` function ([#2288](https://github.com/PrismJS/prism/issues/2288)) [`893f2a79`](https://github.com/PrismJS/prism/commit/893f2a79)
* __Previewers__
    * Fixed XSS ([#2506](https://github.com/PrismJS/prism/issues/2506)) [`8bba4880`](https://github.com/PrismJS/prism/commit/8bba4880)
* __Unescaped Markup__
    * No longer requires `Prism.languages.markup` ([#2444](https://github.com/PrismJS/prism/issues/2444)) [`af132dd3`](https://github.com/PrismJS/prism/commit/af132dd3)

### Updated themes

* __Coy__
    * Minor improvements ([#2176](https://github.com/PrismJS/prism/issues/2176)) [`7109c18c`](https://github.com/PrismJS/prism/commit/7109c18c)
* __Default__
    * Added a comment that declares the background color of `operator` tokens as intentional ([#2309](https://github.com/PrismJS/prism/issues/2309)) [`937e2691`](https://github.com/PrismJS/prism/commit/937e2691)
* __Okaidia__
    * Update comment text color to meet WCAG contrast recommendations to AA level ([#2292](https://github.com/PrismJS/prism/issues/2292)) [`06495f90`](https://github.com/PrismJS/prism/commit/06495f90)

### Other

* Changelog: Fixed v1.20.0 release date [`cb6349e2`](https://github.com/PrismJS/prism/commit/cb6349e2)
* __Core__
    * Fixed greedy matching bug ([#2032](https://github.com/PrismJS/prism/issues/2032)) [`40285203`](https://github.com/PrismJS/prism/commit/40285203)
    * Added JSDoc ([#1782](https://github.com/PrismJS/prism/issues/1782)) [`4ff555be`](https://github.com/PrismJS/prism/commit/4ff555be)
* __Infrastructure__
    * Update Git repo URL in package.json ([#2334](https://github.com/PrismJS/prism/issues/2334)) [`10f43275`](https://github.com/PrismJS/prism/commit/10f43275)
    * Added docs to ignore files ([#2437](https://github.com/PrismJS/prism/issues/2437)) [`05c9f20b`](https://github.com/PrismJS/prism/commit/05c9f20b)
    * Added `npm run build` command ([#2356](https://github.com/PrismJS/prism/issues/2356)) [`ff74a610`](https://github.com/PrismJS/prism/commit/ff74a610)
    * gulp: Improved `inlineRegexSource` ([#2296](https://github.com/PrismJS/prism/issues/2296)) [`abb800dd`](https://github.com/PrismJS/prism/commit/abb800dd)
    * gulp: Fixed language map ([#2283](https://github.com/PrismJS/prism/issues/2283)) [`11053193`](https://github.com/PrismJS/prism/commit/11053193)
    * gulp: Removed `premerge` task ([#2357](https://github.com/PrismJS/prism/issues/2357)) [`5ff7932b`](https://github.com/PrismJS/prism/commit/5ff7932b)
    * Tests are now faster ([#2165](https://github.com/PrismJS/prism/issues/2165)) [`e756be3f`](https://github.com/PrismJS/prism/commit/e756be3f)
    * Tests: Added extra newlines in pretty token streams ([#2070](https://github.com/PrismJS/prism/issues/2070)) [`681adeef`](https://github.com/PrismJS/prism/commit/681adeef)
    * Tests: Added test for identifier support across all languages ([#2371](https://github.com/PrismJS/prism/issues/2371)) [`48fac3b2`](https://github.com/PrismJS/prism/commit/48fac3b2)
    * Tests: Added test to sort the language list ([#2222](https://github.com/PrismJS/prism/issues/2222)) [`a3758728`](https://github.com/PrismJS/prism/commit/a3758728)
    * Tests: Always pretty-print token streams ([#2421](https://github.com/PrismJS/prism/issues/2421)) [`583e7eb5`](https://github.com/PrismJS/prism/commit/583e7eb5)
    * Tests: Always use `components.json` ([#2370](https://github.com/PrismJS/prism/issues/2370)) [`e416341f`](https://github.com/PrismJS/prism/commit/e416341f)
    * Tests: Better error messages for pattern tests ([#2364](https://github.com/PrismJS/prism/issues/2364)) [`10ca6433`](https://github.com/PrismJS/prism/commit/10ca6433)
    * Tests: Included `console` in VM context ([#2353](https://github.com/PrismJS/prism/issues/2353)) [`b4ed5ded`](https://github.com/PrismJS/prism/commit/b4ed5ded)
* __Website__
    * Fixed typos "Prims" ([#2455](https://github.com/PrismJS/prism/issues/2455)) [`dfa5498a`](https://github.com/PrismJS/prism/commit/dfa5498a)
    * New assets directory for all web-only files ([#2180](https://github.com/PrismJS/prism/issues/2180)) [`91fdd0b1`](https://github.com/PrismJS/prism/commit/91fdd0b1)
    * Improvements ([#2053](https://github.com/PrismJS/prism/issues/2053)) [`ce0fa227`](https://github.com/PrismJS/prism/commit/ce0fa227)
    * Fixed Treeview page ([#2484](https://github.com/PrismJS/prism/issues/2484)) [`a0efa40b`](https://github.com/PrismJS/prism/commit/a0efa40b)
    * Line Numbers: Fixed class name on website [`453079bf`](https://github.com/PrismJS/prism/commit/453079bf)
    * Line Numbers: Improved documentation ([#2456](https://github.com/PrismJS/prism/issues/2456)) [`447429f0`](https://github.com/PrismJS/prism/commit/447429f0)
    * Line Numbers: Style inline code on website ([#2435](https://github.com/PrismJS/prism/issues/2435)) [`ad9c13e2`](https://github.com/PrismJS/prism/commit/ad9c13e2)
    * Filter highlightAll: Fixed typo ([#2391](https://github.com/PrismJS/prism/issues/2391)) [`55bf7ec1`](https://github.com/PrismJS/prism/commit/55bf7ec1)

## 1.20.0 (2020-04-04)

### New components

* __Concurnas__ ([#2206](https://github.com/PrismJS/prism/issues/2206)) [`b24f7348`](https://github.com/PrismJS/prism/commit/b24f7348)
* __DAX__ ([#2248](https://github.com/PrismJS/prism/issues/2248)) [`9227853f`](https://github.com/PrismJS/prism/commit/9227853f)
* __Excel Formula__ ([#2219](https://github.com/PrismJS/prism/issues/2219)) [`bf4f7bfa`](https://github.com/PrismJS/prism/commit/bf4f7bfa)
* __Factor__ ([#2203](https://github.com/PrismJS/prism/issues/2203)) [`f941102e`](https://github.com/PrismJS/prism/commit/f941102e)
* __LLVM IR__ ([#2221](https://github.com/PrismJS/prism/issues/2221)) [`43efde2e`](https://github.com/PrismJS/prism/commit/43efde2e)
* __PowerQuery__ ([#2250](https://github.com/PrismJS/prism/issues/2250)) [`8119e57b`](https://github.com/PrismJS/prism/commit/8119e57b)
* __Solution file__ ([#2213](https://github.com/PrismJS/prism/issues/2213)) [`15983d52`](https://github.com/PrismJS/prism/commit/15983d52)

### Updated components

* __Bash__
    * Added support for escaped quotes ([#2256](https://github.com/PrismJS/prism/issues/2256)) [`328d0e0e`](https://github.com/PrismJS/prism/commit/328d0e0e)
* __BBcode__
    * Added "shortcode" alias ([#2273](https://github.com/PrismJS/prism/issues/2273)) [`57eebced`](https://github.com/PrismJS/prism/commit/57eebced)
* __C/C++/OpenCL C__
    * Improvements ([#2196](https://github.com/PrismJS/prism/issues/2196)) [`674f4b35`](https://github.com/PrismJS/prism/commit/674f4b35)
* __C__
    * Improvemed `comment` pattern ([#2229](https://github.com/PrismJS/prism/issues/2229)) [`fa630726`](https://github.com/PrismJS/prism/commit/fa630726)
* __C#__
    * Fixed keywords in type lists blocking type names ([#2277](https://github.com/PrismJS/prism/issues/2277)) [`947a55bd`](https://github.com/PrismJS/prism/commit/947a55bd)
    * C# improvements ([#1444](https://github.com/PrismJS/prism/issues/1444)) [`42b15463`](https://github.com/PrismJS/prism/commit/42b15463)
* __C++__
    * Added C++20 keywords ([#2236](https://github.com/PrismJS/prism/issues/2236)) [`462ad57e`](https://github.com/PrismJS/prism/commit/462ad57e)
* __CSS__
    * Fixed `url()` containing "@" ([#2272](https://github.com/PrismJS/prism/issues/2272)) [`504a63ba`](https://github.com/PrismJS/prism/commit/504a63ba)
* __CSS Extras__
    * Added support for the selector function ([#2201](https://github.com/PrismJS/prism/issues/2201)) [`2e0eff76`](https://github.com/PrismJS/prism/commit/2e0eff76)
* __Elixir__
    * Added support for attributes names ending with `?` ([#2182](https://github.com/PrismJS/prism/issues/2182)) [`5450e24c`](https://github.com/PrismJS/prism/commit/5450e24c)
* __Java__
    * Added `record` keyword ([#2185](https://github.com/PrismJS/prism/issues/2185)) [`47910b5c`](https://github.com/PrismJS/prism/commit/47910b5c)
* __Markdown__
    * Added support for nested lists ([#2228](https://github.com/PrismJS/prism/issues/2228)) [`73c8a376`](https://github.com/PrismJS/prism/commit/73c8a376)
* __OpenCL__
    * Require C ([#2231](https://github.com/PrismJS/prism/issues/2231)) [`26626ded`](https://github.com/PrismJS/prism/commit/26626ded)
* __PHPDoc__
    * Fixed exponential backtracking ([#2198](https://github.com/PrismJS/prism/issues/2198)) [`3b42536e`](https://github.com/PrismJS/prism/commit/3b42536e)
* __Ruby__
    * Fixed exponential backtracking ([#2225](https://github.com/PrismJS/prism/issues/2225)) [`c5de5aa8`](https://github.com/PrismJS/prism/commit/c5de5aa8)
* __SAS__
    * Fixed SAS' "peerDependencies" ([#2230](https://github.com/PrismJS/prism/issues/2230)) [`7d8ff7ea`](https://github.com/PrismJS/prism/commit/7d8ff7ea)
* __Shell session__
    * Improvements ([#2208](https://github.com/PrismJS/prism/issues/2208)) [`bd16bd57`](https://github.com/PrismJS/prism/commit/bd16bd57)
* __Visual Basic__
    * Added support for comments with line continuations ([#2195](https://github.com/PrismJS/prism/issues/2195)) [`a7d67ca3`](https://github.com/PrismJS/prism/commit/a7d67ca3)
* __YAML__
    * Improvements ([#2226](https://github.com/PrismJS/prism/issues/2226)) [`5362ba16`](https://github.com/PrismJS/prism/commit/5362ba16)
    * Fixed highlighting of anchors and aliases ([#2217](https://github.com/PrismJS/prism/issues/2217)) [`6124c974`](https://github.com/PrismJS/prism/commit/6124c974)

### New plugins

* __Treeview__ ([#2265](https://github.com/PrismJS/prism/issues/2265)) [`be909b18`](https://github.com/PrismJS/prism/commit/be909b18)

### Updated plugins

* __Inline Color__
    * Support for (semi-)transparent colors and minor improvements ([#2223](https://github.com/PrismJS/prism/issues/2223)) [`8d2c5a3e`](https://github.com/PrismJS/prism/commit/8d2c5a3e)
* __Keep Markup__
    * Remove self & document from IIFE arguments ([#2258](https://github.com/PrismJS/prism/issues/2258)) [`3c043338`](https://github.com/PrismJS/prism/commit/3c043338)
* __Toolbar__
    * `data-toolbar-order` is now inherited ([#2205](https://github.com/PrismJS/prism/issues/2205)) [`238f1163`](https://github.com/PrismJS/prism/commit/238f1163)

### Other

* Updated all `String.propotype.replace` calls for literal strings [`5d7aab56`](https://github.com/PrismJS/prism/commit/5d7aab56)
* __Core__
    * Linked list implementation for `matchGrammar` ([#1909](https://github.com/PrismJS/prism/issues/1909)) [`2d4c94cd`](https://github.com/PrismJS/prism/commit/2d4c94cd)
    * Faster `Token.stringify` ([#2171](https://github.com/PrismJS/prism/issues/2171)) [`f683972e`](https://github.com/PrismJS/prism/commit/f683972e)
    * Fixed scope problem in script mode ([#2184](https://github.com/PrismJS/prism/issues/2184)) [`984e5d2e`](https://github.com/PrismJS/prism/commit/984e5d2e)
* __Infrastructure__
    * Travis: Updated NodeJS versions ([#2246](https://github.com/PrismJS/prism/issues/2246)) [`e635260b`](https://github.com/PrismJS/prism/commit/e635260b)
    * gulp: Inline regex source improvement ([#2227](https://github.com/PrismJS/prism/issues/2227)) [`67afc5ad`](https://github.com/PrismJS/prism/commit/67afc5ad)
    * Tests: Added new pattern check for octal escapes ([#2189](https://github.com/PrismJS/prism/issues/2189)) [`81e1c3dd`](https://github.com/PrismJS/prism/commit/81e1c3dd)
    * Tests: Fixed optional dependencies in pattern tests ([#2242](https://github.com/PrismJS/prism/issues/2242)) [`1e3070a2`](https://github.com/PrismJS/prism/commit/1e3070a2)
    * Tests: Added test for zero-width lookbehinds ([#2220](https://github.com/PrismJS/prism/issues/2220)) [`7d03ece4`](https://github.com/PrismJS/prism/commit/7d03ece4)
    * Added tests for examples ([#2216](https://github.com/PrismJS/prism/issues/2216)) [`1f7a245c`](https://github.com/PrismJS/prism/commit/1f7a245c)
* __Website__
    * Removed invalid strings from C# example ([#2266](https://github.com/PrismJS/prism/issues/2266)) [`c917a8ca`](https://github.com/PrismJS/prism/commit/c917a8ca)
    * Fixed Diff highlight plugin page title ([#2233](https://github.com/PrismJS/prism/issues/2233)) [`a82770f8`](https://github.com/PrismJS/prism/commit/a82770f8)
    * Added link to `prism-liquibase` Bash language extension. ([#2191](https://github.com/PrismJS/prism/issues/2191)) [`0bf73dc7`](https://github.com/PrismJS/prism/commit/0bf73dc7)
    * Examples: Updated content header ([#2232](https://github.com/PrismJS/prism/issues/2232)) [`6232878b`](https://github.com/PrismJS/prism/commit/6232878b)
    * Website: Added Coy bug to the known failures page. ([#2170](https://github.com/PrismJS/prism/issues/2170)) [`e9dab85e`](https://github.com/PrismJS/prism/commit/e9dab85e)

## 1.19.0 (2020-01-13)

### New components

* __Latte__ ([#2140](https://github.com/PrismJS/prism/issues/2140)) [`694a81b8`](https://github.com/PrismJS/prism/commit/694a81b8)
* __Neon__ ([#2140](https://github.com/PrismJS/prism/issues/2140)) [`694a81b8`](https://github.com/PrismJS/prism/commit/694a81b8)
* __QML__ ([#2139](https://github.com/PrismJS/prism/issues/2139)) [`c40d96c6`](https://github.com/PrismJS/prism/commit/c40d96c6)

### Updated components

* __Handlebars__
    * Added support for `:` and improved the `variable` pattern ([#2172](https://github.com/PrismJS/prism/issues/2172)) [`ef4d29d9`](https://github.com/PrismJS/prism/commit/ef4d29d9)
* __JavaScript__
    * Added support for keywords after a spread operator ([#2148](https://github.com/PrismJS/prism/issues/2148)) [`1f3f8929`](https://github.com/PrismJS/prism/commit/1f3f8929)
    * Better regex detection ([#2158](https://github.com/PrismJS/prism/issues/2158)) [`a23d8f84`](https://github.com/PrismJS/prism/commit/a23d8f84)
* __Markdown__
    * Better language detection for code blocks ([#2114](https://github.com/PrismJS/prism/issues/2114)) [`d7ad48f9`](https://github.com/PrismJS/prism/commit/d7ad48f9)
* __OCaml__
    * Improvements ([#2179](https://github.com/PrismJS/prism/issues/2179)) [`2a570fd4`](https://github.com/PrismJS/prism/commit/2a570fd4)
* __PHP__
    * Fixed exponential runtime of a pattern ([#2157](https://github.com/PrismJS/prism/issues/2157)) [`24c8f833`](https://github.com/PrismJS/prism/commit/24c8f833)
* __React JSX__
    * Improved spread operator in tag attributes ([#2159](https://github.com/PrismJS/prism/issues/2159)) [`fd857e7b`](https://github.com/PrismJS/prism/commit/fd857e7b)
    * Made `$` a valid character for attribute names ([#2144](https://github.com/PrismJS/prism/issues/2144)) [`f018cf04`](https://github.com/PrismJS/prism/commit/f018cf04)
* __Reason__
    * Added support for single line comments ([#2150](https://github.com/PrismJS/prism/issues/2150)) [`7f1c55b7`](https://github.com/PrismJS/prism/commit/7f1c55b7)
* __Ruby__
    * Override 'class-name' definition ([#2135](https://github.com/PrismJS/prism/issues/2135)) [`401d4b02`](https://github.com/PrismJS/prism/commit/401d4b02)
* __SAS__
    * Added CASL support ([#2112](https://github.com/PrismJS/prism/issues/2112)) [`99d979a0`](https://github.com/PrismJS/prism/commit/99d979a0)

### Updated plugins

* __Custom Class__
    * Fixed TypeError when mapper is undefined ([#2167](https://github.com/PrismJS/prism/issues/2167)) [`543f04d7`](https://github.com/PrismJS/prism/commit/543f04d7)

### Updated themes

* Added missing `.token` selector ([#2161](https://github.com/PrismJS/prism/issues/2161)) [`86780457`](https://github.com/PrismJS/prism/commit/86780457)

### Other

* Added a check for redundant dependency declarations ([#2142](https://github.com/PrismJS/prism/issues/2142)) [`a06aca06`](https://github.com/PrismJS/prism/commit/a06aca06)
* Added a check for examples ([#2128](https://github.com/PrismJS/prism/issues/2128)) [`0b539136`](https://github.com/PrismJS/prism/commit/0b539136)
* Added silent option to `loadLanguages` ([#2147](https://github.com/PrismJS/prism/issues/2147)) [`191b4116`](https://github.com/PrismJS/prism/commit/191b4116)
* __Infrastructure__
    * Dependencies: Improved `getLoader` ([#2151](https://github.com/PrismJS/prism/issues/2151)) [`199bdcae`](https://github.com/PrismJS/prism/commit/199bdcae)
    * Updated gulp to v4.0.2 ([#2178](https://github.com/PrismJS/prism/issues/2178)) [`e5678a00`](https://github.com/PrismJS/prism/commit/e5678a00)
* __Website__
    * Custom Class: Fixed examples ([#2160](https://github.com/PrismJS/prism/issues/2160)) [`0c2fe405`](https://github.com/PrismJS/prism/commit/0c2fe405)
    * Added documentation for new dependency API ([#2141](https://github.com/PrismJS/prism/issues/2141)) [`59068d67`](https://github.com/PrismJS/prism/commit/59068d67)

## 1.18.0 (2020-01-04)

### New components

* __ANTLR4__ ([#2063](https://github.com/PrismJS/prism/issues/2063)) [`aaaa29a8`](https://github.com/PrismJS/prism/commit/aaaa29a8)
* __AQL__ ([#2025](https://github.com/PrismJS/prism/issues/2025)) [`3fdb7d55`](https://github.com/PrismJS/prism/commit/3fdb7d55)
* __BBcode__ ([#2095](https://github.com/PrismJS/prism/issues/2095)) [`aaf13aa6`](https://github.com/PrismJS/prism/commit/aaf13aa6)
* __BrightScript__ ([#2096](https://github.com/PrismJS/prism/issues/2096)) [`631f1e34`](https://github.com/PrismJS/prism/commit/631f1e34)
* __Embedded Lua templating__ ([#2050](https://github.com/PrismJS/prism/issues/2050)) [`0b771c90`](https://github.com/PrismJS/prism/commit/0b771c90)
* __Firestore security rules__ ([#2010](https://github.com/PrismJS/prism/issues/2010)) [`9f722586`](https://github.com/PrismJS/prism/commit/9f722586)
* __FreeMarker Template Language__ ([#2080](https://github.com/PrismJS/prism/issues/2080)) [`2f3da7e8`](https://github.com/PrismJS/prism/commit/2f3da7e8)
* __GDScript__ ([#2006](https://github.com/PrismJS/prism/issues/2006)) [`e2b99f40`](https://github.com/PrismJS/prism/commit/e2b99f40)
* __MoonScript__ ([#2100](https://github.com/PrismJS/prism/issues/2100)) [`f31946b3`](https://github.com/PrismJS/prism/commit/f31946b3)
* __Robot Framework__ (only the plain text format) ([#2034](https://github.com/PrismJS/prism/issues/2034)) [`f7eaa618`](https://github.com/PrismJS/prism/commit/f7eaa618)
* __Solidity (Ethereum)__ ([#2031](https://github.com/PrismJS/prism/issues/2031)) [`cc2cf3f7`](https://github.com/PrismJS/prism/commit/cc2cf3f7)
* __SPARQL__ ([#2033](https://github.com/PrismJS/prism/issues/2033)) [`c42f877d`](https://github.com/PrismJS/prism/commit/c42f877d)
* __SQF: Status Quo Function (Arma 3)__ ([#2079](https://github.com/PrismJS/prism/issues/2079)) [`cfac94ec`](https://github.com/PrismJS/prism/commit/cfac94ec)
* __Turtle__ & __TriG__ ([#2012](https://github.com/PrismJS/prism/issues/2012)) [`508d57ac`](https://github.com/PrismJS/prism/commit/508d57ac)
* __Zig__ ([#2019](https://github.com/PrismJS/prism/issues/2019)) [`a7cf56b7`](https://github.com/PrismJS/prism/commit/a7cf56b7)

### Updated components

* Minor improvements for C-like and Clojure ([#2064](https://github.com/PrismJS/prism/issues/2064)) [`7db0cab3`](https://github.com/PrismJS/prism/commit/7db0cab3)
* Inlined some unnecessary rest properties ([#2082](https://github.com/PrismJS/prism/issues/2082)) [`ad3fa443`](https://github.com/PrismJS/prism/commit/ad3fa443)
* __AQL__
    * Disallow unclosed multiline comments again ([#2089](https://github.com/PrismJS/prism/issues/2089)) [`717ace02`](https://github.com/PrismJS/prism/commit/717ace02)
    * Allow unclosed multi-line comments ([#2058](https://github.com/PrismJS/prism/issues/2058)) [`f3c6ba59`](https://github.com/PrismJS/prism/commit/f3c6ba59)
    * More pseudo keywords ([#2055](https://github.com/PrismJS/prism/issues/2055)) [`899574eb`](https://github.com/PrismJS/prism/commit/899574eb)
    * Added missing keyword + minor improvements ([#2047](https://github.com/PrismJS/prism/issues/2047)) [`32a4c422`](https://github.com/PrismJS/prism/commit/32a4c422)
* __Clojure__
    * Added multiline strings (lisp style) ([#2061](https://github.com/PrismJS/prism/issues/2061)) [`8ea685b8`](https://github.com/PrismJS/prism/commit/8ea685b8)
* __CSS Extras__
    * CSS Extras & PHP: Fixed too greedy number token ([#2009](https://github.com/PrismJS/prism/issues/2009)) [`ebe363f4`](https://github.com/PrismJS/prism/commit/ebe363f4)
* __D__
    * Fixed strings ([#2029](https://github.com/PrismJS/prism/issues/2029)) [`010a0157`](https://github.com/PrismJS/prism/commit/010a0157)
* __Groovy__
    * Minor improvements ([#2036](https://github.com/PrismJS/prism/issues/2036)) [`fb618331`](https://github.com/PrismJS/prism/commit/fb618331)
* __Java__
    * Added missing `::` operator ([#2101](https://github.com/PrismJS/prism/issues/2101)) [`ee7fdbee`](https://github.com/PrismJS/prism/commit/ee7fdbee)
    * Added support for new Java 13 syntax ([#2060](https://github.com/PrismJS/prism/issues/2060)) [`a7b95dd3`](https://github.com/PrismJS/prism/commit/a7b95dd3)
* __JavaScript__
    * Added Optional Chaining and Nullish Coalescing ([#2084](https://github.com/PrismJS/prism/issues/2084)) [`fdb7de0d`](https://github.com/PrismJS/prism/commit/fdb7de0d)
    * Tokenize `:` as an operator ([#2073](https://github.com/PrismJS/prism/issues/2073)) [`0e5c48d1`](https://github.com/PrismJS/prism/commit/0e5c48d1)
* __Less__
    * Fixed exponential backtracking ([#2016](https://github.com/PrismJS/prism/issues/2016)) [`d03d19b4`](https://github.com/PrismJS/prism/commit/d03d19b4)
* __Markup__
    * Improved doctype pattern ([#2094](https://github.com/PrismJS/prism/issues/2094)) [`99994c58`](https://github.com/PrismJS/prism/commit/99994c58)
* __Python__
    * Fixed decorators ([#2018](https://github.com/PrismJS/prism/issues/2018)) [`5b8a16d9`](https://github.com/PrismJS/prism/commit/5b8a16d9)
* __Robot Framework__
    * Rename "robot-framework" to "robotframework" ([#2113](https://github.com/PrismJS/prism/issues/2113)) [`baa78774`](https://github.com/PrismJS/prism/commit/baa78774)
* __Ruby__
    * Made `true` and `false` booleans ([#2098](https://github.com/PrismJS/prism/issues/2098)) [`68d1c472`](https://github.com/PrismJS/prism/commit/68d1c472)
    * Added missing keywords ([#2097](https://github.com/PrismJS/prism/issues/2097)) [`f460eafc`](https://github.com/PrismJS/prism/commit/f460eafc)
* __SAS__
    * Added support for embedded Groovy and Lua code ([#2091](https://github.com/PrismJS/prism/issues/2091)) [`3640b3f2`](https://github.com/PrismJS/prism/commit/3640b3f2)
    * Minor improvements ([#2085](https://github.com/PrismJS/prism/issues/2085)) [`07020c7a`](https://github.com/PrismJS/prism/commit/07020c7a)
    * Fixed `proc-args` token by removing backreferences from string pattern ([#2013](https://github.com/PrismJS/prism/issues/2013)) [`af5a36ae`](https://github.com/PrismJS/prism/commit/af5a36ae)
    * Major improvements ([#1981](https://github.com/PrismJS/prism/issues/1981)) [`076f6155`](https://github.com/PrismJS/prism/commit/076f6155)
* __Smalltalk__
    * Fixed single quote character literal ([#2041](https://github.com/PrismJS/prism/issues/2041)) [`1aabcd17`](https://github.com/PrismJS/prism/commit/1aabcd17)
* __Turtle__
    * Minor improvements ([#2038](https://github.com/PrismJS/prism/issues/2038)) [`8ccd258b`](https://github.com/PrismJS/prism/commit/8ccd258b)
* __TypeScript__
    * Added missing keyword `undefined` ([#2088](https://github.com/PrismJS/prism/issues/2088)) [`c8b48b9f`](https://github.com/PrismJS/prism/commit/c8b48b9f)

### Updated plugins

* New Match Braces plugin ([#1944](https://github.com/PrismJS/prism/issues/1944)) [`365faade`](https://github.com/PrismJS/prism/commit/365faade)
* New Inline color plugin ([#2007](https://github.com/PrismJS/prism/issues/2007)) [`8403e453`](https://github.com/PrismJS/prism/commit/8403e453)
* New Filter highlightAll plugin ([#2074](https://github.com/PrismJS/prism/issues/2074)) [`a7f70090`](https://github.com/PrismJS/prism/commit/a7f70090)
* __Custom Class__
    * New class adder feature ([#2075](https://github.com/PrismJS/prism/issues/2075)) [`dab7998e`](https://github.com/PrismJS/prism/commit/dab7998e)
* __File Highlight__
    * Made the download button its own plugin ([#1840](https://github.com/PrismJS/prism/issues/1840)) [`c6c62a69`](https://github.com/PrismJS/prism/commit/c6c62a69)

### Other

* Issue template improvements ([#2069](https://github.com/PrismJS/prism/issues/2069)) [`53f07b1b`](https://github.com/PrismJS/prism/commit/53f07b1b)
* Readme: Links now use HTTPS if available ([#2045](https://github.com/PrismJS/prism/issues/2045)) [`6cd0738a`](https://github.com/PrismJS/prism/commit/6cd0738a)
* __Core__
    * Fixed null reference ([#2106](https://github.com/PrismJS/prism/issues/2106)) [`0fd062d5`](https://github.com/PrismJS/prism/commit/0fd062d5)
    * Fixed race condition caused by deferring the script ([#2103](https://github.com/PrismJS/prism/issues/2103)) [`a3785ec9`](https://github.com/PrismJS/prism/commit/a3785ec9)
    * Minor improvements ([#1973](https://github.com/PrismJS/prism/issues/1973)) [`2d858e0a`](https://github.com/PrismJS/prism/commit/2d858e0a)
    * Fixed greedy partial lookbehinds not working ([#2030](https://github.com/PrismJS/prism/issues/2030)) [`174ed103`](https://github.com/PrismJS/prism/commit/174ed103)
    * Fixed greedy targeting bug ([#1932](https://github.com/PrismJS/prism/issues/1932)) [`e864d518`](https://github.com/PrismJS/prism/commit/e864d518)
    * Doubly check the `manual` flag ([#1957](https://github.com/PrismJS/prism/issues/1957)) [`d49f0f26`](https://github.com/PrismJS/prism/commit/d49f0f26)
    * IE11 workaround for `currentScript` ([#2104](https://github.com/PrismJS/prism/issues/2104)) [`2108c60f`](https://github.com/PrismJS/prism/commit/2108c60f)
* __Infrastructure__
    * gulp: Fixed changes task [`2f495905`](https://github.com/PrismJS/prism/commit/2f495905)
    * npm: Added `.github` folder to npm ignore ([#2052](https://github.com/PrismJS/prism/issues/2052)) [`1af89e06`](https://github.com/PrismJS/prism/commit/1af89e06)
    * npm: Updated dependencies to fix 122 vulnerabilities ([#1997](https://github.com/PrismJS/prism/issues/1997)) [`3af5d744`](https://github.com/PrismJS/prism/commit/3af5d744)
    * Tests: New test for unused capturing groups ([#1996](https://github.com/PrismJS/prism/issues/1996)) [`c187e229`](https://github.com/PrismJS/prism/commit/c187e229)
    * Tests: Simplified error message format ([#2056](https://github.com/PrismJS/prism/issues/2056)) [`007c9af4`](https://github.com/PrismJS/prism/commit/007c9af4)
    * Tests: New test for nice names ([#1911](https://github.com/PrismJS/prism/issues/1911)) [`3fda5c95`](https://github.com/PrismJS/prism/commit/3fda5c95)
    * Standardized dependency logic implementation ([#1998](https://github.com/PrismJS/prism/issues/1998)) [`7a4a0c7c`](https://github.com/PrismJS/prism/commit/7a4a0c7c)
* __Website__
    * Added @mAAdhaTTah and @RunDevelopment to credits and footer [`5d07aa7c`](https://github.com/PrismJS/prism/commit/5d07aa7c)
    * Added plugin descriptions to plugin list ([#2076](https://github.com/PrismJS/prism/issues/2076)) [`cdfa60ac`](https://github.com/PrismJS/prism/commit/cdfa60ac)
    * Use HTTPS link to alistapart.com ([#2044](https://github.com/PrismJS/prism/issues/2044)) [`8bcc1b85`](https://github.com/PrismJS/prism/commit/8bcc1b85)
    * Fixed the Toolbar plugin's overflow issue ([#1966](https://github.com/PrismJS/prism/issues/1966)) [`56a8711c`](https://github.com/PrismJS/prism/commit/56a8711c)
    * FAQ update ([#1977](https://github.com/PrismJS/prism/issues/1977)) [`8a572af5`](https://github.com/PrismJS/prism/commit/8a572af5)
    * Use modern JavaScript in the NodeJS usage section ([#1942](https://github.com/PrismJS/prism/issues/1942)) [`5c68a556`](https://github.com/PrismJS/prism/commit/5c68a556)
    * Improved test page performance for Chromium ([#2020](https://github.com/PrismJS/prism/issues/2020)) [`3509f3e5`](https://github.com/PrismJS/prism/commit/3509f3e5)
    * Fixed alias example in extending page ([#2011](https://github.com/PrismJS/prism/issues/2011)) [`7cb65eec`](https://github.com/PrismJS/prism/commit/7cb65eec)
    * Robot Framework: Renamed example file ([#2126](https://github.com/PrismJS/prism/issues/2126)) [`9908ca69`](https://github.com/PrismJS/prism/commit/9908ca69)

## 1.17.1 (2019-07-21)

### Other

* __Infrastructure__
    * Add .DS_Store to npmignore [`c2229ec2`](https://github.com/PrismJS/prism/commit/c2229ec2)

## 1.17.0 (2019-07-21)

### New components

* __DNS zone file__ ([#1961](https://github.com/PrismJS/prism/issues/1961)) [`bb84f98c`](https://github.com/PrismJS/prism/commit/bb84f98c)
* __JQ__ ([#1896](https://github.com/PrismJS/prism/issues/1896)) [`73d964be`](https://github.com/PrismJS/prism/commit/73d964be)
* __JS Templates__: Syntax highlighting inside tagged template literals ([#1931](https://github.com/PrismJS/prism/issues/1931)) [`c8844286`](https://github.com/PrismJS/prism/commit/c8844286)
* __LilyPond__ ([#1967](https://github.com/PrismJS/prism/issues/1967)) [`5d992fc5`](https://github.com/PrismJS/prism/commit/5d992fc5)
* __PascaLIGO__ ([#1947](https://github.com/PrismJS/prism/issues/1947)) [`858201c7`](https://github.com/PrismJS/prism/commit/858201c7)
* __PC-Axis__ ([#1940](https://github.com/PrismJS/prism/issues/1940)) [`473f7fbd`](https://github.com/PrismJS/prism/commit/473f7fbd)
* __Shell session__ ([#1892](https://github.com/PrismJS/prism/issues/1892)) [`96044979`](https://github.com/PrismJS/prism/commit/96044979)
* __Splunk SPL__ ([#1962](https://github.com/PrismJS/prism/issues/1962)) [`c93c066b`](https://github.com/PrismJS/prism/commit/c93c066b)

### New plugins

* __Diff Highlight__: Syntax highlighting inside diff blocks ([#1889](https://github.com/PrismJS/prism/issues/1889)) [`e7702ae1`](https://github.com/PrismJS/prism/commit/e7702ae1)

### Updated components

* __Bash__
    * Major improvements ([#1443](https://github.com/PrismJS/prism/issues/1443)) [`363281b3`](https://github.com/PrismJS/prism/commit/363281b3)
* __C#__
    * Added `cs` alias ([#1899](https://github.com/PrismJS/prism/issues/1899)) [`a8164559`](https://github.com/PrismJS/prism/commit/a8164559)
* __C++__
    * Fixed number pattern ([#1887](https://github.com/PrismJS/prism/issues/1887)) [`3de29e72`](https://github.com/PrismJS/prism/commit/3de29e72)
* __CSS__
    * Extended `url` inside ([#1874](https://github.com/PrismJS/prism/issues/1874)) [`f0a10669`](https://github.com/PrismJS/prism/commit/f0a10669)
    * Removed unnecessary flag and modifier ([#1875](https://github.com/PrismJS/prism/issues/1875)) [`74050c68`](https://github.com/PrismJS/prism/commit/74050c68)
* __CSS Extras__
    * Added `even` & `odd` keywords to `n-th` pattern ([#1872](https://github.com/PrismJS/prism/issues/1872)) [`5e5a3e00`](https://github.com/PrismJS/prism/commit/5e5a3e00)
* __F#__
    * Improved character literals ([#1956](https://github.com/PrismJS/prism/issues/1956)) [`d58d2aeb`](https://github.com/PrismJS/prism/commit/d58d2aeb)
* __JavaScript__
    * Fixed escaped template interpolation ([#1931](https://github.com/PrismJS/prism/issues/1931)) [`c8844286`](https://github.com/PrismJS/prism/commit/c8844286)
    * Added support for private fields ([#1950](https://github.com/PrismJS/prism/issues/1950)) [`7bd08327`](https://github.com/PrismJS/prism/commit/7bd08327)
    * Added support for numeric separators ([#1895](https://github.com/PrismJS/prism/issues/1895)) [`6068bf18`](https://github.com/PrismJS/prism/commit/6068bf18)
    * Increased bracket count of interpolation expressions in template strings ([#1845](https://github.com/PrismJS/prism/issues/1845)) [`c13d6e7d`](https://github.com/PrismJS/prism/commit/c13d6e7d)
    * Added support for the `s` regex flag ([#1846](https://github.com/PrismJS/prism/issues/1846)) [`9e164935`](https://github.com/PrismJS/prism/commit/9e164935)
    * Formatting: Added missing semicolon ([#1856](https://github.com/PrismJS/prism/issues/1856)) [`e2683959`](https://github.com/PrismJS/prism/commit/e2683959)
* __JSON__
    * Kinda fixed comment issue ([#1853](https://github.com/PrismJS/prism/issues/1853)) [`cbe05ec3`](https://github.com/PrismJS/prism/commit/cbe05ec3)
* __Julia__
    * Added `struct` keyword ([#1941](https://github.com/PrismJS/prism/issues/1941)) [`feb1b6f5`](https://github.com/PrismJS/prism/commit/feb1b6f5)
    * Highlight `Inf` and `NaN` as constants ([#1921](https://github.com/PrismJS/prism/issue   s/1921)) [`2141129f`](https://github.com/PrismJS/prism/commit/2141129f)
    * Added `in` keyword ([#1918](https://github.com/PrismJS/prism/issues/1918)) [`feb3187f`](https://github.com/PrismJS/prism/commit/feb3187f)
* __LaTeX__
    * Added TeX and ConTeXt alias ([#1915](https://github.com/PrismJS/prism/issues/1915)) [`5ad58a75`](https://github.com/PrismJS/prism/commit/5ad58a75)
    * Added support for $$ equations [`6f53f749`](https://github.com/PrismJS/prism/commit/6f53f749)
* __Markdown__
    * Markdown: Added support for auto-loading code block languages ([#1898](https://github.com/PrismJS/prism/issues/1898)) [`05823e88`](https://github.com/PrismJS/prism/commit/05823e88)
    * Improved URLs ([#1955](https://github.com/PrismJS/prism/issues/1955)) [`b9ec6fd8`](https://github.com/PrismJS/prism/commit/b9ec6fd8)
    * Added support for nested bold and italic expressions ([#1897](https://github.com/PrismJS/prism/issues/1897)) [`11903721`](https://github.com/PrismJS/prism/commit/11903721)
    * Added support for tables ([#1848](https://github.com/PrismJS/prism/issues/1848)) [`cedb8e84`](https://github.com/PrismJS/prism/commit/cedb8e84)
* __Perl__
    * Added `return` keyword ([#1943](https://github.com/PrismJS/prism/issues/1943)) [`2f39de97`](https://github.com/PrismJS/prism/commit/2f39de97)
* __Protocol Buffers__
    * Full support for PB2 and PB3 syntax + numerous other improvements ([#1948](https://github.com/PrismJS/prism/issues/1948)) [`de10bd1d`](https://github.com/PrismJS/prism/commit/de10bd1d)
* __reST (reStructuredText)__
    * Fixed exponentially backtracking pattern ([#1986](https://github.com/PrismJS/prism/issues/1986)) [`8b5d67a3`](https://github.com/PrismJS/prism/commit/8b5d67a3)
* __Rust__
    * Added `async` and `await` keywords. ([#1882](https://github.com/PrismJS/prism/issues/1882)) [`4faa3314`](https://github.com/PrismJS/prism/commit/4faa3314)
    * Improved punctuation and operators ([#1839](https://github.com/PrismJS/prism/issues/1839)) [`a42b1557`](https://github.com/PrismJS/prism/commit/a42b1557)
* __Sass (Scss)__
    * Fixed exponential url pattern ([#1938](https://github.com/PrismJS/prism/issues/1938)) [`4b6b6e8b`](https://github.com/PrismJS/prism/commit/4b6b6e8b)
* __Scheme__
    * Added support for rational number literals ([#1964](https://github.com/PrismJS/prism/issues/1964)) [`e8811d22`](https://github.com/PrismJS/prism/commit/e8811d22)
* __TOML__
    * Minor improvements ([#1917](https://github.com/PrismJS/prism/issues/1917)) [`3e181241`](https://github.com/PrismJS/prism/commit/3e181241)
* __Visual Basic__
    * Added support for interpolation strings ([#1971](https://github.com/PrismJS/prism/issues/1971)) [`4a2c90c1`](https://github.com/PrismJS/prism/commit/4a2c90c1)

### Updated plugins

* __Autolinker__
    * Improved component path guessing ([#1928](https://github.com/PrismJS/prism/issues/1928)) [`452d5c7d`](https://github.com/PrismJS/prism/commit/452d5c7d)
    * Improved URL regex ([#1842](https://github.com/PrismJS/prism/issues/1842)) [`eb28b62b`](https://github.com/PrismJS/prism/commit/eb28b62b)
* __Autoloader__
    * Fixed and improved callbacks ([#1935](https://github.com/PrismJS/prism/issues/1935)) [`b19f512f`](https://github.com/PrismJS/prism/commit/b19f512f)
* __Command Line__
    * Fix for uncaught errors for empty 'commandLine' object. ([#1862](https://github.com/PrismJS/prism/issues/1862)) [`c24831b5`](https://github.com/PrismJS/prism/commit/c24831b5)
* __Copy to Clipboard Button__
    * Switch anchor to button ([#1926](https://github.com/PrismJS/prism/issues/1926)) [`79880197`](https://github.com/PrismJS/prism/commit/79880197)
* __Custom Class__
    * Added mapper functions for language specific transformations ([#1873](https://github.com/PrismJS/prism/issues/1873)) [`acceb3b5`](https://github.com/PrismJS/prism/commit/acceb3b5)
* __Line Highlight__
    * Batching DOM read/writes to avoid reflows ([#1865](https://github.com/PrismJS/prism/issues/1865)) [`632ce00c`](https://github.com/PrismJS/prism/commit/632ce00c)
* __Toolbar__
    * Added `className` option for toolbar items ([#1951](https://github.com/PrismJS/prism/issues/1951)) [`5ab28bbe`](https://github.com/PrismJS/prism/commit/5ab28bbe)
    * Set opacity to 1 when focus is within ([#1927](https://github.com/PrismJS/prism/issues/1927)) [`0b1662dd`](https://github.com/PrismJS/prism/commit/0b1662dd)

### Updated themes

* __Funky__
    * Fixed typo ([#1960](https://github.com/PrismJS/prism/issues/1960)) [`7d056591`](https://github.com/PrismJS/prism/commit/7d056591)

### Other

* README: Added npm downloads badge ([#1934](https://github.com/PrismJS/prism/issues/1934)) [`d673d701`](https://github.com/PrismJS/prism/commit/d673d701)
* README: Minor changes ([#1857](https://github.com/PrismJS/prism/issues/1857)) [`77e403cb`](https://github.com/PrismJS/prism/commit/77e403cb)
* Clearer description for the highlighting bug report template ([#1850](https://github.com/PrismJS/prism/issues/1850)) [`2f9c9261`](https://github.com/PrismJS/prism/commit/2f9c9261)
* More language examples ([#1917](https://github.com/PrismJS/prism/issues/1917)) [`3e181241`](https://github.com/PrismJS/prism/commit/3e181241)
* __Core__
    * Removed `env.elements` from `before-highlightall` hook ([#1968](https://github.com/PrismJS/prism/issues/1968)) [`9d9e2ca4`](https://github.com/PrismJS/prism/commit/9d9e2ca4)
    * Made `language-none` the default language ([#1858](https://github.com/PrismJS/prism/issues/1858)) [`fd691c52`](https://github.com/PrismJS/prism/commit/fd691c52)
    * Removed `parent` from the `wrap` hook's environment ([#1837](https://github.com/PrismJS/prism/issues/1837)) [`65a4e894`](https://github.com/PrismJS/prism/commit/65a4e894)
* __Infrastructure__
    * gulp: Split `gulpfile.js` and expanded `changes` task ([#1835](https://github.com/PrismJS/prism/issues/1835)) [`033c5ad8`](https://github.com/PrismJS/prism/commit/033c5ad8)
    * gulp: JSON formatting for partly generated files ([#1933](https://github.com/PrismJS/prism/issues/1933)) [`d4373f3a`](https://github.com/PrismJS/prism/commit/d4373f3a)
    * gulp: Use `async` functions & drop testing on Node v6 ([#1783](https://github.com/PrismJS/prism/issues/1783)) [`0dd44d53`](https://github.com/PrismJS/prism/commit/0dd44d53)
    * Tests: `lookbehind` test for patterns ([#1890](https://github.com/PrismJS/prism/issues/1890)) [`3ba786cd`](https://github.com/PrismJS/prism/commit/3ba786cd)
    * Tests: Added test for empty regexes ([#1847](https://github.com/PrismJS/prism/issues/1847)) [`c1e6a7fd`](https://github.com/PrismJS/prism/commit/c1e6a7fd)
* __Website__
    * Added tutorial for using PrismJS with React ([#1979](https://github.com/PrismJS/prism/issues/1979)) [`f1e16c7b`](https://github.com/PrismJS/prism/commit/f1e16c7b)
    * Update footer's GitHub repository URL and capitalisation of "GitHub" ([#1983](https://github.com/PrismJS/prism/issues/1983)) [`bab744a6`](https://github.com/PrismJS/prism/commit/bab744a6)
    * Added known failures page ([#1876](https://github.com/PrismJS/prism/issues/1876)) [`36a5fa0e`](https://github.com/PrismJS/prism/commit/36a5fa0e)
    * Added basic usage for CDNs ([#1924](https://github.com/PrismJS/prism/issues/1924)) [`922ec555`](https://github.com/PrismJS/prism/commit/922ec555)
    * New tutorial for Drupal ([#1859](https://github.com/PrismJS/prism/issues/1859)) [`d2089d83`](https://github.com/PrismJS/prism/commit/d2089d83)
    * Updated website page styles to not interfere with themes ([#1952](https://github.com/PrismJS/prism/issues/1952)) [`b6543853`](https://github.com/PrismJS/prism/commit/b6543853)
    * Download page: Improved performance for Chromium-based browsers ([#1907](https://github.com/PrismJS/prism/issues/1907)) [`11f18e36`](https://github.com/PrismJS/prism/commit/11f18e36)
    * Download page: Fixed Edge's word wrap ([#1920](https://github.com/PrismJS/prism/issues/1920)) [`5d191b92`](https://github.com/PrismJS/prism/commit/5d191b92)
    * Examples page: Minor improvements ([#1919](https://github.com/PrismJS/prism/issues/1919)) [`a16d4a25`](https://github.com/PrismJS/prism/commit/a16d4a25)
    * Extending page: Fixed typo + new alias section ([#1949](https://github.com/PrismJS/prism/issues/1949)) [`24c8e717`](https://github.com/PrismJS/prism/commit/24c8e717)
    * Extending page: Added "Creating a new language definition" section ([#1925](https://github.com/PrismJS/prism/issues/1925)) [`ddf81233`](https://github.com/PrismJS/prism/commit/ddf81233)
    * Test page: Use `prism-core.js` instead of `prism.js` ([#1908](https://github.com/PrismJS/prism/issues/1908)) [`0853e694`](https://github.com/PrismJS/prism/commit/0853e694)
    * Copy to clipboard: Fixed typo ([#1869](https://github.com/PrismJS/prism/issues/1869)) [`59d4323f`](https://github.com/PrismJS/prism/commit/59d4323f)
    * JSONP Highlight: Fixed examples ([#1877](https://github.com/PrismJS/prism/issues/1877)) [`f8ae465d`](https://github.com/PrismJS/prism/commit/f8ae465d)
    * Line numbers: Fixed typo on webpage ([#1838](https://github.com/PrismJS/prism/issues/1838)) [`0f16eb87`](https://github.com/PrismJS/prism/commit/0f16eb87)

## 1.16.0 (2019-03-24)

### New components

* __ANBF__ ([#1753](https://github.com/PrismJS/prism/issues/1753)) [`6d98f0e7`](https://github.com/PrismJS/prism/commit/6d98f0e7)
* __BNF__ & __RBNF__ ([#1754](https://github.com/PrismJS/prism/issues/1754)) [`1df96c55`](https://github.com/PrismJS/prism/commit/1df96c55)
* __CIL__ ([#1593](https://github.com/PrismJS/prism/issues/1593)) [`38def334`](https://github.com/PrismJS/prism/commit/38def334)
* __CMake__ ([#1820](https://github.com/PrismJS/prism/issues/1820)) [`30779976`](https://github.com/PrismJS/prism/commit/30779976)
* __Doc comment__ ([#1541](https://github.com/PrismJS/prism/issues/1541)) [`493d19ef`](https://github.com/PrismJS/prism/commit/493d19ef)
* __EBNF__ ([#1756](https://github.com/PrismJS/prism/issues/1756)) [`13e1c97d`](https://github.com/PrismJS/prism/commit/13e1c97d)
* __EJS__ ([#1769](https://github.com/PrismJS/prism/issues/1769)) [`c37c90df`](https://github.com/PrismJS/prism/commit/c37c90df)
* __G-code__ ([#1572](https://github.com/PrismJS/prism/issues/1572)) [`2288c25e`](https://github.com/PrismJS/prism/commit/2288c25e)
* __GameMaker Language__ ([#1551](https://github.com/PrismJS/prism/issues/1551)) [`e529edd8`](https://github.com/PrismJS/prism/commit/e529edd8)
* __HCL__ ([#1594](https://github.com/PrismJS/prism/issues/1594)) [`c939df8e`](https://github.com/PrismJS/prism/commit/c939df8e)
* __Java stack trace__ ([#1520](https://github.com/PrismJS/prism/issues/1520)) [`4a8219a4`](https://github.com/PrismJS/prism/commit/4a8219a4)
* __JavaScript Extras__ ([#1743](https://github.com/PrismJS/prism/issues/1743)) [`bb628606`](https://github.com/PrismJS/prism/commit/bb628606)
* __JSON5__ ([#1744](https://github.com/PrismJS/prism/issues/1744)) [`64dc049d`](https://github.com/PrismJS/prism/commit/64dc049d)
* __N1QL__ ([#1620](https://github.com/PrismJS/prism/issues/1620)) [`7def8f5c`](https://github.com/PrismJS/prism/commit/7def8f5c)
* __Nand To Tetris HDL__ ([#1710](https://github.com/PrismJS/prism/issues/1710)) [`b94b56c1`](https://github.com/PrismJS/prism/commit/b94b56c1)
* __Regex__ ([#1682](https://github.com/PrismJS/prism/issues/1682)) [`571704cb`](https://github.com/PrismJS/prism/commit/571704cb)
* __T4__ ([#1699](https://github.com/PrismJS/prism/issues/1699)) [`16f2ad06`](https://github.com/PrismJS/prism/commit/16f2ad06)
* __TOML__ ([#1488](https://github.com/PrismJS/prism/issues/1488)) [`5b6ad70d`](https://github.com/PrismJS/prism/commit/5b6ad70d)
* __Vala__ ([#1658](https://github.com/PrismJS/prism/issues/1658)) [`b48c012c`](https://github.com/PrismJS/prism/commit/b48c012c)

### Updated components

* Fixed dependencies of Pug and Pure ([#1759](https://github.com/PrismJS/prism/issues/1759)) [`c9a32674`](https://github.com/PrismJS/prism/commit/c9a32674)
* Add file extensions support for major languages ([#1478](https://github.com/PrismJS/prism/issues/1478)) [`0c8f6504`](https://github.com/PrismJS/prism/commit/0c8f6504)
* Fixed patterns which can match the empty string ([#1775](https://github.com/PrismJS/prism/issues/1775)) [`86dd3e42`](https://github.com/PrismJS/prism/commit/86dd3e42)
* More variables for better code compression ([#1489](https://github.com/PrismJS/prism/issues/1489)) [`bc53e093`](https://github.com/PrismJS/prism/commit/bc53e093)
* Added missing aliases ([#1830](https://github.com/PrismJS/prism/issues/1830)) [`8d28c74c`](https://github.com/PrismJS/prism/commit/8d28c74c)
* Replaced all occurrences of `new RegExp` with `RegExp` ([#1493](https://github.com/PrismJS/prism/issues/1493)) [`44fed4d3`](https://github.com/PrismJS/prism/commit/44fed4d3)
* Added missing aliases to components.json ([#1503](https://github.com/PrismJS/prism/issues/1503)) [`2fb66e04`](https://github.com/PrismJS/prism/commit/2fb66e04)
* __Apacheconf__
	* Apache config: Minor improvements + new keyword ([#1823](https://github.com/PrismJS/prism/issues/1823)) [`a91be7b2`](https://github.com/PrismJS/prism/commit/a91be7b2)
* __AsciiDoc__
	* Added `adoc` alias for AsciiDoc ([#1685](https://github.com/PrismJS/prism/issues/1685)) [`88434f7a`](https://github.com/PrismJS/prism/commit/88434f7a)
* __Bash__
	* Add additional commands to bash ([#1577](https://github.com/PrismJS/prism/issues/1577)) [`a2230c38`](https://github.com/PrismJS/prism/commit/a2230c38)
	* Added `yarn add` to bash functions ([#1731](https://github.com/PrismJS/prism/issues/1731)) [`3a32cb75`](https://github.com/PrismJS/prism/commit/3a32cb75)
	* Added `pnpm` function to Bash ([#1734](https://github.com/PrismJS/prism/issues/1734)) [`fccfb98d`](https://github.com/PrismJS/prism/commit/fccfb98d)
* __Batch__
	* Remove batch's shell alias ([#1543](https://github.com/PrismJS/prism/issues/1543)) [`7155e60f`](https://github.com/PrismJS/prism/commit/7155e60f)
* __C__
	* Improve C language ([#1697](https://github.com/PrismJS/prism/issues/1697)) [`7eccea5c`](https://github.com/PrismJS/prism/commit/7eccea5c)
* __C-like__
	* Simplify function pattern of C-like language ([#1552](https://github.com/PrismJS/prism/issues/1552)) [`b520e1b6`](https://github.com/PrismJS/prism/commit/b520e1b6)
* __C/C++/Java__
	* Operator fixes ([#1528](https://github.com/PrismJS/prism/issues/1528)) [`7af8f8be`](https://github.com/PrismJS/prism/commit/7af8f8be)
* __C#__
	* Improvements to C# operator and punctuation ([#1532](https://github.com/PrismJS/prism/issues/1532)) [`3b1e0916`](https://github.com/PrismJS/prism/commit/3b1e0916)
* __CSS__
	* Fix tokenizing !important ([#1585](https://github.com/PrismJS/prism/issues/1585)) [`c1d6cb85`](https://github.com/PrismJS/prism/commit/c1d6cb85)
	* Added the comma to the list of CSS punctuation [`7ea2ff28`](https://github.com/PrismJS/prism/commit/7ea2ff28)
	* CSS: Comma punctuation ([#1632](https://github.com/PrismJS/prism/issues/1632)) [`1b812386`](https://github.com/PrismJS/prism/commit/1b812386)
	* Reuse CSS selector pattern in CSS Extras ([#1637](https://github.com/PrismJS/prism/issues/1637)) [`e2f2fd19`](https://github.com/PrismJS/prism/commit/e2f2fd19)
	* Fixed CSS extra variable ([#1649](https://github.com/PrismJS/prism/issues/1649)) [`9de47d3a`](https://github.com/PrismJS/prism/commit/9de47d3a)
	* Identify CSS units and variables ([#1450](https://github.com/PrismJS/prism/issues/1450)) [`5fcee966`](https://github.com/PrismJS/prism/commit/5fcee966)
	* Allow multiline CSS at-rules ([#1676](https://github.com/PrismJS/prism/issues/1676)) [`4f6f3c7d`](https://github.com/PrismJS/prism/commit/4f6f3c7d)
	* CSS: Highlight attribute selector ([#1671](https://github.com/PrismJS/prism/issues/1671)) [`245b59d4`](https://github.com/PrismJS/prism/commit/245b59d4)
	* CSS: Selectors can contain any string ([#1638](https://github.com/PrismJS/prism/issues/1638)) [`a2d445d0`](https://github.com/PrismJS/prism/commit/a2d445d0)
	* CSS extras: Highlighting for pseudo class arguments ([#1650](https://github.com/PrismJS/prism/issues/1650)) [`70a40414`](https://github.com/PrismJS/prism/commit/70a40414)
* __Django__
	* Django/Jinja2 improvements ([#1800](https://github.com/PrismJS/prism/issues/1800)) [`f2467488`](https://github.com/PrismJS/prism/commit/f2467488)
* __F#__
	* Chars can only contain one character ([#1570](https://github.com/PrismJS/prism/issues/1570)) [`f96b083a`](https://github.com/PrismJS/prism/commit/f96b083a)
	* Improve F# ([#1573](https://github.com/PrismJS/prism/issues/1573)) [`00bfc969`](https://github.com/PrismJS/prism/commit/00bfc969)
* __GraphQL__
	* Improved field highlighting for GraphQL ([#1711](https://github.com/PrismJS/prism/issues/1711)) [`44aeffb9`](https://github.com/PrismJS/prism/commit/44aeffb9)
	* Added GraphQL improvements and tests ([#1788](https://github.com/PrismJS/prism/issues/1788)) [`b2298b12`](https://github.com/PrismJS/prism/commit/b2298b12)
* __Haskell__
	* Added `hs` alias for Haskell ([#1831](https://github.com/PrismJS/prism/issues/1831)) [`64baec3c`](https://github.com/PrismJS/prism/commit/64baec3c)
* __HTTP__
	* Improved HTTP content highlighting ([#1598](https://github.com/PrismJS/prism/issues/1598)) [`1b75da90`](https://github.com/PrismJS/prism/commit/1b75da90)
* __Ini__
	* Add support for # comments to INI language ([#1730](https://github.com/PrismJS/prism/issues/1730)) [`baf6bb0c`](https://github.com/PrismJS/prism/commit/baf6bb0c)
* __Java__
	* Add Java 10 support ([#1549](https://github.com/PrismJS/prism/issues/1549)) [`8c981a22`](https://github.com/PrismJS/prism/commit/8c981a22)
	* Added module keywords to Java. ([#1655](https://github.com/PrismJS/prism/issues/1655)) [`6e250a5f`](https://github.com/PrismJS/prism/commit/6e250a5f)
	* Improve Java ([#1474](https://github.com/PrismJS/prism/issues/1474)) [`81bd8f0b`](https://github.com/PrismJS/prism/commit/81bd8f0b)
* __JavaScript__
	* Fix regex for `catch` and `finally` ([#1527](https://github.com/PrismJS/prism/issues/1527)) [`ebd1b9a6`](https://github.com/PrismJS/prism/commit/ebd1b9a6)
	* Highlighting of supposed classes and functions ([#1482](https://github.com/PrismJS/prism/issues/1482)) [`c40f6047`](https://github.com/PrismJS/prism/commit/c40f6047)
	* Added support for JS BigInt literals ([#1542](https://github.com/PrismJS/prism/issues/1542)) [`2b62e57b`](https://github.com/PrismJS/prism/commit/2b62e57b)
	* Fixed lowercase supposed class names ([#1544](https://github.com/PrismJS/prism/issues/1544)) [`a47c05ad`](https://github.com/PrismJS/prism/commit/a47c05ad)
	* Fixes regex for JS examples ([#1591](https://github.com/PrismJS/prism/issues/1591)) [`b41fb8f1`](https://github.com/PrismJS/prism/commit/b41fb8f1)
	* Improve regex detection in JS ([#1473](https://github.com/PrismJS/prism/issues/1473)) [`2a4758ab`](https://github.com/PrismJS/prism/commit/2a4758ab)
	* Identify JavaScript function parameters ([#1446](https://github.com/PrismJS/prism/issues/1446)) [`0cc8c56a`](https://github.com/PrismJS/prism/commit/0cc8c56a)
	* Improved JavaScript parameter recognization ([#1722](https://github.com/PrismJS/prism/issues/1722)) [`57a92035`](https://github.com/PrismJS/prism/commit/57a92035)
	* Make `undefined` a keyword in JS ([#1740](https://github.com/PrismJS/prism/issues/1740)) [`d9fa29a8`](https://github.com/PrismJS/prism/commit/d9fa29a8)
	* Fix `function-variable` in JS ([#1739](https://github.com/PrismJS/prism/issues/1739)) [`bfbea4d6`](https://github.com/PrismJS/prism/commit/bfbea4d6)
	* Improved JS constant pattern ([#1737](https://github.com/PrismJS/prism/issues/1737)) [`7bcec584`](https://github.com/PrismJS/prism/commit/7bcec584)
	* Improved JS function pattern ([#1736](https://github.com/PrismJS/prism/issues/1736)) [`8378ac83`](https://github.com/PrismJS/prism/commit/8378ac83)
	* JS: Fixed variables named "async" ([#1738](https://github.com/PrismJS/prism/issues/1738)) [`3560c643`](https://github.com/PrismJS/prism/commit/3560c643)
	* JS: Keyword fix ([#1808](https://github.com/PrismJS/prism/issues/1808)) [`f2d8e1c7`](https://github.com/PrismJS/prism/commit/f2d8e1c7)
* __JSON__ / __JSONP__
	* Fix bugs in JSON language ([#1479](https://github.com/PrismJS/prism/issues/1479)) [`74fe81c6`](https://github.com/PrismJS/prism/commit/74fe81c6)
	* Adds support for comments in JSON ([#1595](https://github.com/PrismJS/prism/issues/1595)) [`8720b3e6`](https://github.com/PrismJS/prism/commit/8720b3e6)
	* Cleaned up JSON ([#1596](https://github.com/PrismJS/prism/issues/1596)) [`da474c77`](https://github.com/PrismJS/prism/commit/da474c77)
	* Added `keyword` alias to JSON's `null` ([#1733](https://github.com/PrismJS/prism/issues/1733)) [`eee06649`](https://github.com/PrismJS/prism/commit/eee06649)
	* Fix JSONP support ([#1745](https://github.com/PrismJS/prism/issues/1745)) [`b5041cf9`](https://github.com/PrismJS/prism/commit/b5041cf9)
	* Fixed JSON/JSONP examples ([#1765](https://github.com/PrismJS/prism/issues/1765)) [`ae4842db`](https://github.com/PrismJS/prism/commit/ae4842db)
* __JSX__
	* React component tags are styled as classes in JSX ([#1519](https://github.com/PrismJS/prism/issues/1519)) [`3e1a9a3d`](https://github.com/PrismJS/prism/commit/3e1a9a3d)
	* Support JSX/TSX class-name with dot ([#1725](https://github.com/PrismJS/prism/issues/1725)) [`4362e42c`](https://github.com/PrismJS/prism/commit/4362e42c)
* __Less__
	* Remove useless insertBefore in LESS ([#1629](https://github.com/PrismJS/prism/issues/1629)) [`86d31793`](https://github.com/PrismJS/prism/commit/86d31793)
* __Lisp__
	* Fix Lisp exponential string pattern ([#1763](https://github.com/PrismJS/prism/issues/1763)) [`5bd182c0`](https://github.com/PrismJS/prism/commit/5bd182c0))
* __Markdown__
	* Added strike support to markdown ([#1563](https://github.com/PrismJS/prism/issues/1563)) [`9d2fddc2`](https://github.com/PrismJS/prism/commit/9d2fddc2)
	* Fixed Markdown headers ([#1557](https://github.com/PrismJS/prism/issues/1557)) [`c6584290`](https://github.com/PrismJS/prism/commit/c6584290)
	* Add support for code blocks in Markdown ([#1562](https://github.com/PrismJS/prism/issues/1562)) [`b0717e70`](https://github.com/PrismJS/prism/commit/b0717e70)
	* Markdown: The 'md' alias is now recognized by hooks ([#1771](https://github.com/PrismJS/prism/issues/1771)) [`8ca3d65b`](https://github.com/PrismJS/prism/commit/8ca3d65b)
* __Markup__
	* Decouple XML from Markup ([#1603](https://github.com/PrismJS/prism/issues/1603)) [`0030a4ef`](https://github.com/PrismJS/prism/commit/0030a4ef)
	* Fix for markup attributes ([#1752](https://github.com/PrismJS/prism/issues/1752)) [`c3862a24`](https://github.com/PrismJS/prism/commit/c3862a24)
	* Markup: Added support for CSS and JS inside of CDATAs ([#1660](https://github.com/PrismJS/prism/issues/1660)) [`57127701`](https://github.com/PrismJS/prism/commit/57127701)
	* Markup `addInline` improvements ([#1798](https://github.com/PrismJS/prism/issues/1798)) [`af67c32e`](https://github.com/PrismJS/prism/commit/af67c32e)
* __Markup Templating__
	* Markup-templating improvements ([#1653](https://github.com/PrismJS/prism/issues/1653)) [`b62e282b`](https://github.com/PrismJS/prism/commit/b62e282b)
* __nginx__
	* Add new keywords to nginx ([#1587](https://github.com/PrismJS/prism/issues/1587)) [`0d73f7f5`](https://github.com/PrismJS/prism/commit/0d73f7f5)
* __PHP__
	* Update PHP keywords ([#1690](https://github.com/PrismJS/prism/issues/1690)) [`55fb0f8e`](https://github.com/PrismJS/prism/commit/55fb0f8e)
	* Improve recognition of constants in PHP ([#1688](https://github.com/PrismJS/prism/issues/1688)) [`f1026b4b`](https://github.com/PrismJS/prism/commit/f1026b4b)
	* Made false, true, and null constants in PHP ([#1694](https://github.com/PrismJS/prism/issues/1694)) [`439e3bd7`](https://github.com/PrismJS/prism/commit/439e3bd7)
	* PHP: Fixed closing tag issue ([#1652](https://github.com/PrismJS/prism/issues/1652)) [`289ddd9b`](https://github.com/PrismJS/prism/commit/289ddd9b)
* __Python__
	* Operator keywords are now keywords ([#1617](https://github.com/PrismJS/prism/issues/1617)) [`1d1fb800`](https://github.com/PrismJS/prism/commit/1d1fb800)
	* Add decorator support to Python ([#1639](https://github.com/PrismJS/prism/issues/1639)) [`2577b6e6`](https://github.com/PrismJS/prism/commit/2577b6e6)
	* Improvements to Python F-strings and string prefixes ([#1642](https://github.com/PrismJS/prism/issues/1642)) [`a69c2b62`](https://github.com/PrismJS/prism/commit/a69c2b62)
* __Reason__
	* Added additional operators to Reason ([#1648](https://github.com/PrismJS/prism/issues/1648)) [`8b1bb469`](https://github.com/PrismJS/prism/commit/8b1bb469)
* __Ruby__
	* Consistent Ruby method highlighting ([#1523](https://github.com/PrismJS/prism/issues/1523)) [`72775919`](https://github.com/PrismJS/prism/commit/72775919)
	* Ruby/ERB: Fixed block comments ([#1768](https://github.com/PrismJS/prism/issues/1768)) [`c805f859`](https://github.com/PrismJS/prism/commit/c805f859)
* __Rust__
	* Add missing keywords ([#1634](https://github.com/PrismJS/prism/issues/1634)) [`3590edde`](https://github.com/PrismJS/prism/commit/3590edde)
* __SAS__
	* Added new SAS keywords ([#1784](https://github.com/PrismJS/prism/issues/1784)) [`3b396ef5`](https://github.com/PrismJS/prism/commit/3b396ef5)
* __Scheme__
	* Fix function without arguments in scheme language ([#1463](https://github.com/PrismJS/prism/issues/1463)) [`12a827e7`](https://github.com/PrismJS/prism/commit/12a827e7)
	* Scheme improvements ([#1556](https://github.com/PrismJS/prism/issues/1556)) [`225dd3f7`](https://github.com/PrismJS/prism/commit/225dd3f7)
	* Fixed operator-like functions in Scheme ([#1467](https://github.com/PrismJS/prism/issues/1467)) [`f8c8add2`](https://github.com/PrismJS/prism/commit/f8c8add2)
	* Scheme: Minor improvements ([#1814](https://github.com/PrismJS/prism/issues/1814)) [`191830f2`](https://github.com/PrismJS/prism/commit/191830f2)
* __SCSS__
	* Fixed that selector pattern can take exponential time ([#1499](https://github.com/PrismJS/prism/issues/1499)) [`0f75d9d4`](https://github.com/PrismJS/prism/commit/0f75d9d4)
	* Move SCSS `property` definition ([#1633](https://github.com/PrismJS/prism/issues/1633)) [`0536fb14`](https://github.com/PrismJS/prism/commit/0536fb14)
	* Add `keyword` alias for SCSS' `null` ([#1735](https://github.com/PrismJS/prism/issues/1735)) [`bd0378f0`](https://github.com/PrismJS/prism/commit/bd0378f0)
* __Smalltalk__
	* Allowed empty strings and comments ([#1747](https://github.com/PrismJS/prism/issues/1747)) [`5fd7577a`](https://github.com/PrismJS/prism/commit/5fd7577a)
* __Smarty__
	* Removed useless `insertBefore` call in Smarty ([#1677](https://github.com/PrismJS/prism/issues/1677)) [`bc49c361`](https://github.com/PrismJS/prism/commit/bc49c361)
* __SQL__
	* Added support for quote escapes to SQL strings ([#1500](https://github.com/PrismJS/prism/issues/1500)) [`a59a7926`](https://github.com/PrismJS/prism/commit/a59a7926)
	* SQL Quoted variables are now greedy ([#1510](https://github.com/PrismJS/prism/issues/1510)) [`42d119a2`](https://github.com/PrismJS/prism/commit/42d119a2)
* __TypeScript__
	* Enhance definitions in TypeScript component ([#1522](https://github.com/PrismJS/prism/issues/1522)) [`11695629`](https://github.com/PrismJS/prism/commit/11695629)
* __YAML__
	* Allow YAML strings to have trailing comments ([#1602](https://github.com/PrismJS/prism/issues/1602)) [`1c5f28a9`](https://github.com/PrismJS/prism/commit/1c5f28a9)

### Updated plugins

* Better class name detection for plugins ([#1772](https://github.com/PrismJS/prism/issues/1772)) [`c9762c6f`](https://github.com/PrismJS/prism/commit/c9762c6f)
* __Autolinker__
	* Fix Autolinker url-decoding all tokens ([#1723](https://github.com/PrismJS/prism/issues/1723)) [`8cf20d49`](https://github.com/PrismJS/prism/commit/8cf20d49)
* __Autoloader__
	* Resolved variable name clash ([#1568](https://github.com/PrismJS/prism/issues/1568)) [`bfa5a8d9`](https://github.com/PrismJS/prism/commit/bfa5a8d9)
	* Autoloader: Fixed the directory of scripts ([#1828](https://github.com/PrismJS/prism/issues/1828)) [`fd4c764f`](https://github.com/PrismJS/prism/commit/fd4c764f)
	* Autoloader: Added support for aliases ([#1829](https://github.com/PrismJS/prism/issues/1829)) [`52889b5b`](https://github.com/PrismJS/prism/commit/52889b5b)
* __Command Line__
	* Fixed class regex for Command Line plugin ([#1566](https://github.com/PrismJS/prism/issues/1566)) [`9f6e5026`](https://github.com/PrismJS/prism/commit/9f6e5026)
* __File Highlight__
	* Prevent double-loading & add scope to File Highlight ([#1586](https://github.com/PrismJS/prism/issues/1586)) [`10239c14`](https://github.com/PrismJS/prism/commit/10239c14)
* __JSONP Highlight__
	* Cleanup JSONP highlight code ([#1674](https://github.com/PrismJS/prism/issues/1674)) [`28489698`](https://github.com/PrismJS/prism/commit/28489698)
	* Fix typos & other issues in JSONP docs ([#1672](https://github.com/PrismJS/prism/issues/1672)) [`cd058a91`](https://github.com/PrismJS/prism/commit/cd058a91)
	* JSONP highlight: Fixed minified adapter names ([#1793](https://github.com/PrismJS/prism/issues/1793)) [`5dd8f916`](https://github.com/PrismJS/prism/commit/5dd8f916)
* __Keep Markup__
	* Add unit tests to the Keep Markup plugin ([#1646](https://github.com/PrismJS/prism/issues/1646)) [`a944c418`](https://github.com/PrismJS/prism/commit/a944c418)
* __Line Numbers__
	* Added inheritance for the `line-numbers` class ([#1799](https://github.com/PrismJS/prism/issues/1799)) [`14be7489`](https://github.com/PrismJS/prism/commit/14be7489)
* __Previewers__
	* Fixed Previewers bug [#1496](https://github.com/PrismJS/prism/issues/1496) ([#1497](https://github.com/PrismJS/prism/issues/1497)) [`4b56f3c1`](https://github.com/PrismJS/prism/commit/4b56f3c1)
* __Show Invisibles__
	* Updated styles of show invisibles ([#1607](https://github.com/PrismJS/prism/issues/1607)) [`2ba62268`](https://github.com/PrismJS/prism/commit/2ba62268)
	* Corrected load order of Show Invisibles ([#1612](https://github.com/PrismJS/prism/issues/1612)) [`6e0c6e86`](https://github.com/PrismJS/prism/commit/6e0c6e86)
	* Show invisibles inside tokens ([#1610](https://github.com/PrismJS/prism/issues/1610)) [`1090b253`](https://github.com/PrismJS/prism/commit/1090b253)
* __Show Language__
	* Show Language plugin alias support and improvements ([#1683](https://github.com/PrismJS/prism/issues/1683)) [`4c66d72c`](https://github.com/PrismJS/prism/commit/4c66d72c)
* __Toolbar__
	* Toolbar: Minor improvements ([#1818](https://github.com/PrismJS/prism/issues/1818)) [`3ad47047`](https://github.com/PrismJS/prism/commit/3ad47047)

### Updated themes

* Normalized the font-size of pre and code ([#1791](https://github.com/PrismJS/prism/issues/1791)) [`878ef295`](https://github.com/PrismJS/prism/commit/878ef295)
* __Coy__
	* Correct typo ([#1508](https://github.com/PrismJS/prism/issues/1508)) [`c322fc80`](https://github.com/PrismJS/prism/commit/c322fc80)

### Other changes

* __Core__
	* `insertBefore` now correctly updates references ([#1531](https://github.com/PrismJS/prism/issues/1531)) [`9dfec340`](https://github.com/PrismJS/prism/commit/9dfec340)
	* Invoke `callback` after `after-highlight` hook ([#1588](https://github.com/PrismJS/prism/issues/1588)) [`bfbe4464`](https://github.com/PrismJS/prism/commit/bfbe4464)
	* Improve `Prism.util.type` performance ([#1545](https://github.com/PrismJS/prism/issues/1545)) [`2864fe24`](https://github.com/PrismJS/prism/commit/2864fe24)
	* Remove unused `insertBefore` overload ([#1631](https://github.com/PrismJS/prism/issues/1631)) [`39686e12`](https://github.com/PrismJS/prism/commit/39686e12)
	* Ignore duplicates in insertBefore ([#1628](https://github.com/PrismJS/prism/issues/1628)) [`d33d259c`](https://github.com/PrismJS/prism/commit/d33d259c)
	* Remove the Prism.tokenize language parameter ([#1654](https://github.com/PrismJS/prism/issues/1654)) [`fbf0b094`](https://github.com/PrismJS/prism/commit/fbf0b094)
	* Call `insert-before` hook properly ([#1709](https://github.com/PrismJS/prism/issues/1709)) [`393ab164`](https://github.com/PrismJS/prism/commit/393ab164)
	* Improved languages.DFS and util.clone ([#1506](https://github.com/PrismJS/prism/issues/1506)) [`152a68ef`](https://github.com/PrismJS/prism/commit/152a68ef)
	* Core: Avoid redeclaring variables in util.clone ([#1778](https://github.com/PrismJS/prism/issues/1778)) [`b06f532f`](https://github.com/PrismJS/prism/commit/b06f532f)
	* Made prism-core a little more editor friendly ([#1776](https://github.com/PrismJS/prism/issues/1776)) [`bac09f0a`](https://github.com/PrismJS/prism/commit/bac09f0a)
	* Applied Array.isArray ([#1804](https://github.com/PrismJS/prism/issues/1804)) [`11d0f75e`](https://github.com/PrismJS/prism/commit/11d0f75e)
* __Infrastructure__
	* Linkify changelog more + add missing PR references [`2a100db7`](https://github.com/PrismJS/prism/commit/2a100db7)
	* Set default indentation size ([#1516](https://github.com/PrismJS/prism/issues/1516)) [`e63d1597`](https://github.com/PrismJS/prism/commit/e63d1597)
	* Add travis repo badge to readme ([#1561](https://github.com/PrismJS/prism/issues/1561)) [`716923f4`](https://github.com/PrismJS/prism/commit/716923f4)
	* Update README.md ([#1553](https://github.com/PrismJS/prism/issues/1553)) [`6d1a2c61`](https://github.com/PrismJS/prism/commit/6d1a2c61)
	* Mention Prism Themes in README ([#1625](https://github.com/PrismJS/prism/issues/1625)) [`5db04656`](https://github.com/PrismJS/prism/commit/5db04656)
	* Fixed CHANGELOG.md ([#1707](https://github.com/PrismJS/prism/issues/1707)) [`b1f8a65d`](https://github.com/PrismJS/prism/commit/b1f8a65d) ([#1704](https://github.com/PrismJS/prism/issues/1704)) [`66d2104a`](https://github.com/PrismJS/prism/commit/66d2104a)
	* Change tested NodeJS versions ([#1651](https://github.com/PrismJS/prism/issues/1651)) [`6ec71e0b`](https://github.com/PrismJS/prism/commit/6ec71e0b)
	* Inline regex source with gulp ([#1537](https://github.com/PrismJS/prism/issues/1537)) [`e894fc89`](https://github.com/PrismJS/prism/commit/e894fc89) ([#1716](https://github.com/PrismJS/prism/issues/1716)) [`217a6ea4`](https://github.com/PrismJS/prism/commit/217a6ea4)
	* Improve gulp error messages with pump ([#1741](https://github.com/PrismJS/prism/issues/1741)) [`671f4ca0`](https://github.com/PrismJS/prism/commit/671f4ca0)
	* Update gulp to version 4.0.0 ([#1779](https://github.com/PrismJS/prism/issues/1779)) [`06627f6a`](https://github.com/PrismJS/prism/commit/06627f6a)
	* gulp: Refactoring ([#1780](https://github.com/PrismJS/prism/issues/1780)) [`6c9fe257`](https://github.com/PrismJS/prism/commit/6c9fe257)
	* npm: Updated all dependencies ([#1742](https://github.com/PrismJS/prism/issues/1742)) [`9d908d5a`](https://github.com/PrismJS/prism/commit/9d908d5a)
	* Tests: Pretty-printed token stream ([#1801](https://github.com/PrismJS/prism/issues/1801)) [`9ea6d600`](https://github.com/PrismJS/prism/commit/9ea6d600)
	* Refactored tests ([#1795](https://github.com/PrismJS/prism/issues/1795)) [`832a9643`](https://github.com/PrismJS/prism/commit/832a9643)
	* Added issue templates ([#1805](https://github.com/PrismJS/prism/issues/1805)) [`dedb475f`](https://github.com/PrismJS/prism/commit/dedb475f)
	* npm: Fixed `test` script ([#1809](https://github.com/PrismJS/prism/issues/1809)) [`bc649dfa`](https://github.com/PrismJS/prism/commit/bc649dfa)
	* Add command to generate CHANGELOG [`212666d3`](https://github.com/PrismJS/prism/commit/212666d3)
	* Name in composer.json set to lowercase ([#1824](https://github.com/PrismJS/prism/issues/1824)) [`4f78f1d6`](https://github.com/PrismJS/prism/commit/4f78f1d6)
	* Added alias tests ([#1832](https://github.com/PrismJS/prism/issues/1832)) [`5c1a6fb2`](https://github.com/PrismJS/prism/commit/5c1a6fb2)
	* Travis: Fail when changed files are detected ([#1819](https://github.com/PrismJS/prism/issues/1819)) [`66b44e3b`](https://github.com/PrismJS/prism/commit/66b44e3b)
	* Tests: Additional checks for Prism functions ([#1803](https://github.com/PrismJS/prism/issues/1803)) [`c3e74ea3`](https://github.com/PrismJS/prism/commit/c3e74ea3)
	* Adjusted .npmignore ([#1834](https://github.com/PrismJS/prism/issues/1834)) [`29a30c62`](https://github.com/PrismJS/prism/commit/29a30c62)
* __Website__
	* Add Python triple-quoted strings "known failure" ([#1449](https://github.com/PrismJS/prism/issues/1449)) [`334c7bca`](https://github.com/PrismJS/prism/commit/334c7bca)
	* Updated index.html to fix broken instructions ([#1462](https://github.com/PrismJS/prism/issues/1462)) [`7418dfdd`](https://github.com/PrismJS/prism/commit/7418dfdd)
	* Improve download page typography ([#1484](https://github.com/PrismJS/prism/issues/1484)) [`b1c2f4df`](https://github.com/PrismJS/prism/commit/b1c2f4df)
	* Fixed peer dependencies in download page ([#1491](https://github.com/PrismJS/prism/issues/1491)) [`9d15ff6e`](https://github.com/PrismJS/prism/commit/9d15ff6e)
	* Fixed empty link in extending ([#1507](https://github.com/PrismJS/prism/issues/1507)) [`74916d48`](https://github.com/PrismJS/prism/commit/74916d48)
	* Display language aliases ([#1626](https://github.com/PrismJS/prism/issues/1626)) [`654b527b`](https://github.com/PrismJS/prism/commit/654b527b)
	* Clean up Previewers' page ([#1630](https://github.com/PrismJS/prism/issues/1630)) [`b0d1823c`](https://github.com/PrismJS/prism/commit/b0d1823c)
	* Updated website table of contents styles ([#1681](https://github.com/PrismJS/prism/issues/1681)) [`efdd96c3`](https://github.com/PrismJS/prism/commit/efdd96c3)
	* Added new third-party tutorial for using Prism in Gutenberg ([#1701](https://github.com/PrismJS/prism/issues/1701)) [`ff9ccbe5`](https://github.com/PrismJS/prism/commit/ff9ccbe5)
	* Remove dead tutorial ([#1702](https://github.com/PrismJS/prism/issues/1702)) [`e2d3bc7e`](https://github.com/PrismJS/prism/commit/e2d3bc7e)
	* Fix downloads page fetching from GitHub([#1684](https://github.com/PrismJS/prism/issues/1684)) [`dbd3555e`](https://github.com/PrismJS/prism/commit/dbd3555e)
	* Remove parentheses from download page ([#1627](https://github.com/PrismJS/prism/issues/1627)) [`2ce0666d`](https://github.com/PrismJS/prism/commit/2ce0666d)
	* Line Numbers plugin instructions clarifications ([#1719](https://github.com/PrismJS/prism/issues/1719)) [`00f4f04f`](https://github.com/PrismJS/prism/commit/00f4f04f)
	* Fixed Toolbar plugin example ([#1726](https://github.com/PrismJS/prism/issues/1726)) [`5311ca32`](https://github.com/PrismJS/prism/commit/5311ca32)
	* Test page: Show tokens option ([#1757](https://github.com/PrismJS/prism/issues/1757)) [`729cb28b`](https://github.com/PrismJS/prism/commit/729cb28b)
	* Some encouragement for visitors of PrismJS.com to request new languages ([#1760](https://github.com/PrismJS/prism/issues/1760)) [`ea769e0b`](https://github.com/PrismJS/prism/commit/ea769e0b)
	* Docs: Added missing parameter ([#1774](https://github.com/PrismJS/prism/issues/1774)) [`18f2921d`](https://github.com/PrismJS/prism/commit/18f2921d)
	* More persistent test page ([#1529](https://github.com/PrismJS/prism/issues/1529)) [`3100fa31`](https://github.com/PrismJS/prism/commit/3100fa31)
	* Added scripts directory ([#1781](https://github.com/PrismJS/prism/issues/1781)) [`439ea1ee`](https://github.com/PrismJS/prism/commit/439ea1ee)
	* Fixed download page ([#1811](https://github.com/PrismJS/prism/issues/1811)) [`77c57446`](https://github.com/PrismJS/prism/commit/77c57446)

## 1.15.0 (2018-06-16)

### New components

* __Template Tookit 2__ ([#1418](https://github.com/PrismJS/prism/issues/1418)) [[`e063992`](https://github.com/PrismJS/prism/commit/e063992)]
* __XQuery__ ([#1411](https://github.com/PrismJS/prism/issues/1411)) [[`e326cb0`](https://github.com/PrismJS/prism/commit/e326cb0)]
* __TAP__ ([#1430](https://github.com/PrismJS/prism/issues/1430)) [[`8c2b71f`](https://github.com/PrismJS/prism/commit/8c2b71f)]

### Updated components

* __HTTP__
	* Absolute path is a valid request uri ([#1388](https://github.com/PrismJS/prism/issues/1388)) [[`f6e81cb`](https://github.com/PrismJS/prism/commit/f6e81cb)]
* __Kotlin__
	* Add keywords of Kotlin and modify it's number pattern. ([#1389](https://github.com/PrismJS/prism/issues/1389)) [[`1bf73b0`](https://github.com/PrismJS/prism/commit/1bf73b0)]
	* Add `typealias` keyword ([#1437](https://github.com/PrismJS/prism/issues/1437)) [[`a21fdee`](https://github.com/PrismJS/prism/commit/a21fdee)]
* __JavaScript__
	* Improve Regexp pattern [[`5b043cf`](https://github.com/PrismJS/prism/commit/5b043cf)]
	* Add support for one level of nesting inside template strings. Fix [#1397](https://github.com/PrismJS/prism/issues/1397) [[`db2d0eb`](https://github.com/PrismJS/prism/commit/db2d0eb)]
* __Elixir__
	* Elixir: Fix attributes consuming punctuation. Fix [#1392](https://github.com/PrismJS/prism/issues/1392) [[`dac0485`](https://github.com/PrismJS/prism/commit/dac0485)]
* __Bash__
	* Change reserved keyword reference ([#1396](https://github.com/PrismJS/prism/issues/1396)) [[`b94f01f`](https://github.com/PrismJS/prism/commit/b94f01f)]
* __PowerShell__
	* Allow for one level of nesting in expressions inside strings. Fix [#1407](https://github.com/PrismJS/prism/issues/1407) [[`9272d6f`](https://github.com/PrismJS/prism/commit/9272d6f)]
* __JSX__
	* Allow for two levels of nesting inside JSX tags. Fix [#1408](https://github.com/PrismJS/prism/issues/1408) [[`f1cd7c5`](https://github.com/PrismJS/prism/commit/f1cd7c5)]
	* Add support for fragments short syntax. Fix [#1421](https://github.com/PrismJS/prism/issues/1421) [[`38ce121`](https://github.com/PrismJS/prism/commit/38ce121)]
* __Pascal__
	* Add `objectpascal` as an alias to `pascal` ([#1426](https://github.com/PrismJS/prism/issues/1426)) [[`a0bfc84`](https://github.com/PrismJS/prism/commit/a0bfc84)]
* __Swift__
	* Fix Swift 'protocol' keyword ([#1440](https://github.com/PrismJS/prism/issues/1440)) [[`081e318`](https://github.com/PrismJS/prism/commit/081e318)]

### Updated plugins

* __File Highlight__
	* Fix issue causing the Download button to show up on every code blocks. [[`cd22499`](https://github.com/PrismJS/prism/commit/cd22499)]
	* Simplify lang regex on File Highlight plugin ([#1399](https://github.com/PrismJS/prism/issues/1399)) [[`7bc9a4a`](https://github.com/PrismJS/prism/commit/7bc9a4a)]
* __Show Language__
	* Don't process language if block language not set ([#1410](https://github.com/PrismJS/prism/issues/1410)) [[`c111869`](https://github.com/PrismJS/prism/commit/c111869)]
* __Autoloader__
	* ASP.NET should require C# [[`fa328bb`](https://github.com/PrismJS/prism/commit/fa328bb)]
* __Line Numbers__
	* Make line-numbers styles more specific ([#1434](https://github.com/PrismJS/prism/issues/1434), [#1435](https://github.com/PrismJS/prism/issues/1435)) [[`9ee4f54`](https://github.com/PrismJS/prism/commit/9ee4f54)]

### Updated themes

* Add .token.class-name to rest of themes ([#1360](https://github.com/PrismJS/prism/issues/1360)) [[`f356dfe`](https://github.com/PrismJS/prism/commit/f356dfe)]

### Other changes

* __Website__
	* Site now loads over HTTPS!
	* Use HTTPS / canonical URLs ([#1390](https://github.com/PrismJS/prism/issues/1390)) [[`95146c8`](https://github.com/PrismJS/prism/commit/95146c8)]
	* Added Angular tutorial link [[`c436a7c`](https://github.com/PrismJS/prism/commit/c436a7c)]
	* Use rel="icon" instead of rel="shortcut icon" ([#1398](https://github.com/PrismJS/prism/issues/1398)) [[`d95f8fb`](https://github.com/PrismJS/prism/commit/d95f8fb)]
	* Fix Download page not handling multiple dependencies when from Redownload URL [[`c2ff248`](https://github.com/PrismJS/prism/commit/c2ff248)]
	* Update documentation for node & webpack usage [[`1e99e96`](https://github.com/PrismJS/prism/commit/1e99e96)]
* Handle optional dependencies in `loadLanguages()` ([#1417](https://github.com/PrismJS/prism/issues/1417)) [[`84935ac`](https://github.com/PrismJS/prism/commit/84935ac)]
* Add Chinese translation [[`f2b1964`](https://github.com/PrismJS/prism/commit/f2b1964)]

## 1.14.0 (2018-04-11)

### New components
* __GEDCOM__ ([#1385](https://github.com/PrismJS/prism/issues/1385)) [[`6e0b20a`](https://github.com/PrismJS/prism/commit/6e0b20a)]
* __Lisp__ ([#1297](https://github.com/PrismJS/prism/issues/1297)) [[`46468f8`](https://github.com/PrismJS/prism/commit/46468f8)]
* __Markup Templating__ ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)]
* __Soy__ ([#1387](https://github.com/PrismJS/prism/issues/1387)) [[`b4509bf`](https://github.com/PrismJS/prism/commit/b4509bf)]
* __Velocity__ ([#1378](https://github.com/PrismJS/prism/issues/1378)) [[`5a524f7`](https://github.com/PrismJS/prism/commit/5a524f7)]
* __Visual Basic__ ([#1382](https://github.com/PrismJS/prism/issues/1382)) [[`c673ec2`](https://github.com/PrismJS/prism/commit/c673ec2)]
* __WebAssembly__ ([#1386](https://github.com/PrismJS/prism/issues/1386)) [[`c28d8c5`](https://github.com/PrismJS/prism/commit/c28d8c5)]

### Updated components
* __Bash__:
	* Add curl to the list of common functions. Close [#1160](https://github.com/PrismJS/prism/issues/1160) [[`1bfc084`](https://github.com/PrismJS/prism/commit/1bfc084)]
* __C-like__:
	* Make single-line comments greedy. Fix [#1337](https://github.com/PrismJS/prism/issues/1337). Make sure [#1340](https://github.com/PrismJS/prism/issues/1340) stays fixed. [[`571f2c5`](https://github.com/PrismJS/prism/commit/571f2c5)]
* __C#__:
	* More generic class-name highlighting. Fix [#1365](https://github.com/PrismJS/prism/issues/1365) [[`a6837d2`](https://github.com/PrismJS/prism/commit/a6837d2)]
	* More specific class-name highlighting. Fix [#1371](https://github.com/PrismJS/prism/issues/1371) [[`0a95f69`](https://github.com/PrismJS/prism/commit/0a95f69)]
* __Eiffel__:
	* Fix verbatim strings. Fix [#1379](https://github.com/PrismJS/prism/issues/1379) [[`04df41b`](https://github.com/PrismJS/prism/commit/04df41b)]
* __Elixir__
	* Make regexps greedy, remove comment hacks. Update known failures and tests. [[`e93d61f`](https://github.com/PrismJS/prism/commit/e93d61f)]
* __ERB__:
	* Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)]
* __Fortran__:
	* Make single-line comments greedy. Update known failures and tests. [[`c083b78`](https://github.com/PrismJS/prism/commit/c083b78)]
* __Handlebars__:
	* Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)]
* __Java__:
	* Add support for generics. Fix [#1351](https://github.com/PrismJS/prism/issues/1351) [[`a5cf302`](https://github.com/PrismJS/prism/commit/a5cf302)]
* __JavaScript__:
	* Add support for constants. Fix [#1348](https://github.com/PrismJS/prism/issues/1348) [[`9084481`](https://github.com/PrismJS/prism/commit/9084481)]
	* Improve Regex matching [[`172d351`](https://github.com/PrismJS/prism/commit/172d351)]
* __JSX__:
	* Fix highlighting of empty objects. Fix [#1364](https://github.com/PrismJS/prism/issues/1364) [[`b26bbb8`](https://github.com/PrismJS/prism/commit/b26bbb8)]
* __Monkey__:
	* Make comments greedy. Update known failures and tests. [[`d7b2b43`](https://github.com/PrismJS/prism/commit/d7b2b43)]
* __PHP__:
	* Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)]
* __Puppet__:
	* Make heredoc, comments, regexps and strings greedy. Update known failures and tests. [[`0c139d1`](https://github.com/PrismJS/prism/commit/0c139d1)]
* __Q__:
	* Make comments greedy. Update known failures and tests. [[`a0f5081`](https://github.com/PrismJS/prism/commit/a0f5081)]
* __Ruby__:
	* Make multi-line comments greedy, remove single-line comment hack. Update known failures and tests. [[`b0e34fb`](https://github.com/PrismJS/prism/commit/b0e34fb)]
* __SQL__:
	* Add missing keywords. Fix [#1374](https://github.com/PrismJS/prism/issues/1374) [[`238b195`](https://github.com/PrismJS/prism/commit/238b195)]

### Updated plugins
* __Command Line__:
	* Command Line: Allow specifying output prefix using data-filter-output attribute. ([#856](https://github.com/PrismJS/prism/issues/856)) [[`094d546`](https://github.com/PrismJS/prism/commit/094d546)]
* __File Highlight__:
	* Add option to provide a download button, when used with the Toolbar plugin. Fix [#1030](https://github.com/PrismJS/prism/issues/1030) [[`9f22952`](https://github.com/PrismJS/prism/commit/9f22952)]

### Updated themes
* __Default__:
	* Reach AA contrast ratio level ([#1296](https://github.com/PrismJS/prism/issues/1296)) [[`8aea939`](https://github.com/PrismJS/prism/commit/8aea939)]

### Other changes
* Website: Remove broken third-party tutorials from homepage [[`0efd6e1`](https://github.com/PrismJS/prism/commit/0efd6e1)]
* Docs: Mention `loadLanguages()` function on homepage in the nodeJS section. Close [#972](https://github.com/PrismJS/prism/issues/972), close [#593](https://github.com/PrismJS/prism/issues/593) [[`4a14d20`](https://github.com/PrismJS/prism/commit/4a14d20)]
* Core: Greedy patterns should always be matched against the full string. Fix [#1355](https://github.com/PrismJS/prism/issues/1355) [[`294efaa`](https://github.com/PrismJS/prism/commit/294efaa)]
* Crystal: Update known failures. [[`e1d2d42`](https://github.com/PrismJS/prism/commit/e1d2d42)]
* D: Update known failures and tests. [[`13d9991`](https://github.com/PrismJS/prism/commit/13d9991)]
* Markdown: Update known failures. [[`5b6c76d`](https://github.com/PrismJS/prism/commit/5b6c76d)]
* Matlab: Update known failures. [[`259b6fc`](https://github.com/PrismJS/prism/commit/259b6fc)]
* Website: Remove non-existent anchor to failures. Reword on homepage to make is less misleading. [[`8c0911a`](https://github.com/PrismJS/prism/commit/8c0911a)]
* Website: Add link to Keep Markup plugin in FAQ [[`e8cb6d4`](https://github.com/PrismJS/prism/commit/e8cb6d4)]
* Test suite: Memory leak in vm.runInNewContext() seems fixed. Revert [[`9a4b6fa`](https://github.com/PrismJS/prism/commit/9a4b6fa)] to drastically improve tests execution time. [[`9bceece`](https://github.com/PrismJS/prism/commit/9bceece), [`7c7602b`](https://github.com/PrismJS/prism/commit/7c7602b)]
* Gulp: Don't minify `components/index.js` [[`689227b`](https://github.com/PrismJS/prism/commit/689227b)]
* Website: Fix theme selection on Download page, when theme is in query string or hash. [[`b4d3063`](https://github.com/PrismJS/prism/commit/b4d3063)]
* Update JSPM config to also include unminified components. Close [#995](https://github.com/PrismJS/prism/issues/995) [[`218f160`](https://github.com/PrismJS/prism/commit/218f160)]
* Core: Fix support for language alias containing dash `-` [[`659ea31`](https://github.com/PrismJS/prism/commit/659ea31)]

## 1.13.0 (2018-03-21)

### New components
* __ERB__ [[`e6213ac`](https://github.com/PrismJS/prism/commit/e6213ac)]
* __PL/SQL__ ([#1338](https://github.com/PrismJS/prism/issues/1338)) [[`3599e6a`](https://github.com/PrismJS/prism/commit/3599e6a)]

### Updated components
* __JSX__:
	* Add support for plain text inside tags ([#1357](https://github.com/PrismJS/prism/issues/1357)) [[`2b8321d`](https://github.com/PrismJS/prism/commit/2b8321d)]
* __Markup__:
	* Make tags greedy. Fix [#1356](https://github.com/PrismJS/prism/issues/1356) [[`af834be`](https://github.com/PrismJS/prism/commit/af834be)]
* __Powershell__:
	* Add lookbehind to fix function interpolation inside strings. Fix [#1361](https://github.com/PrismJS/prism/issues/1361) [[`d2c026e`](https://github.com/PrismJS/prism/commit/d2c026e)]
* __Rust__:
	* Improve char pattern so that lifetime annotations are matched better. Fix [#1353](https://github.com/PrismJS/prism/issues/1353) [[`efdccbf`](https://github.com/PrismJS/prism/commit/efdccbf)]

### Updated themes
* __Default__:
	* Add color for class names [[`8572474`](https://github.com/PrismJS/prism/commit/8572474)]
* __Coy__:
	* Inherit pre's height on code, so it does not break on Download page. [[`c6c7fd1`](https://github.com/PrismJS/prism/commit/c6c7fd1)]

### Other changes
* Website: Auto-generate example headers [[`c3ed5b5`](https://github.com/PrismJS/prism/commit/c3ed5b5)]
* Core: Allow cloning of circular structures. ([#1345](https://github.com/PrismJS/prism/issues/1345)) [[`f90d555`](https://github.com/PrismJS/prism/commit/f90d555)]
* Core: Generate components.js from components.json and make it exportable to nodeJS. ([#1354](https://github.com/PrismJS/prism/issues/1354)) [[`ba60df0`](https://github.com/PrismJS/prism/commit/ba60df0)]
* Website: Improve appearance of theme selector [[`0460cad`](https://github.com/PrismJS/prism/commit/0460cad)]
* Website: Check stored theme by default + link both theme selectors together. Close [#1038](https://github.com/PrismJS/prism/issues/1038) [[`212dd4e`](https://github.com/PrismJS/prism/commit/212dd4e)]
* Tests: Use the new components.js file directly [[`0e1a8b7`](https://github.com/PrismJS/prism/commit/0e1a8b7)]
* Update .npmignore Close [#1274](https://github.com/PrismJS/prism/issues/1274) [[`a52319a`](https://github.com/PrismJS/prism/commit/a52319a)]
* Add a loadLanguages() function for easy component loading on NodeJS ([#1359](https://github.com/PrismJS/prism/issues/1359)) [[`a5331a6`](https://github.com/PrismJS/prism/commit/a5331a6)]

## 1.12.2 (2018-03-08)

### Other changes
* Test against NodeJS 4, 6, 8 and 9 ([#1329](https://github.com/PrismJS/prism/issues/1329)) [[`97b7d0a`](https://github.com/PrismJS/prism/commit/97b7d0a)]
* Stop testing against NodeJS 0.10 and 0.12 [[`df01b1b`](https://github.com/PrismJS/prism/commit/df01b1b)]

## 1.12.1 (2018-03-08)

### Updated components
* __C-like__:
	* Revert [[`b98e5b9`](https://github.com/PrismJS/prism/commit/b98e5b9)] to fix [#1340](https://github.com/PrismJS/prism/issues/1340). Reopened [#1337](https://github.com/PrismJS/prism/issues/1337). [[`cebacdf`](https://github.com/PrismJS/prism/commit/cebacdf)]
* __JSX__:
	* Allow for one level of nested curly braces inside tag attribute value. Fix [#1335](https://github.com/PrismJS/prism/issues/1335) [[`05bf67d`](https://github.com/PrismJS/prism/commit/05bf67d)]
* __Ruby__:
	*  Ensure module syntax is not confused with symbols. Fix [#1336](https://github.com/PrismJS/prism/issues/1336) [[`31a2a69`](https://github.com/PrismJS/prism/commit/31a2a69)]

## 1.12.0 (2018-03-07)

### New components
* __ARFF__ ([#1327](https://github.com/PrismJS/prism/issues/1327)) [[`0bc98ac`](https://github.com/PrismJS/prism/commit/0bc98ac)]
* __Clojure__ ([#1311](https://github.com/PrismJS/prism/issues/1311)) [[`8b4d3bd`](https://github.com/PrismJS/prism/commit/8b4d3bd)]
* __Liquid__ ([#1326](https://github.com/PrismJS/prism/issues/1326)) [[`f0b2c9e`](https://github.com/PrismJS/prism/commit/f0b2c9e)]

### Updated components
* __Bash__:
	* Add shell as an alias ([#1321](https://github.com/PrismJS/prism/issues/1321)) [[`67e16a2`](https://github.com/PrismJS/prism/commit/67e16a2)]
	* Add support for quoted command substitution. Fix [#1287](https://github.com/PrismJS/prism/issues/1287) [[`63fc215`](https://github.com/PrismJS/prism/commit/63fc215)]
* __C#__:
	* Add "dotnet" alias. [[`405867c`](https://github.com/PrismJS/prism/commit/405867c)]
* __C-like__:
	* Change order of comment patterns and make multi-line one greedy. Fix [#1337](https://github.com/PrismJS/prism/issues/1337) [[`b98e5b9`](https://github.com/PrismJS/prism/commit/b98e5b9)]
* __NSIS__:
	* Add support for NSIS 3.03 ([#1288](https://github.com/PrismJS/prism/issues/1288)) [[`bd1e98b`](https://github.com/PrismJS/prism/commit/bd1e98b)]
	* Add missing NSIS commands ([#1289](https://github.com/PrismJS/prism/issues/1289)) [[`ad2948f`](https://github.com/PrismJS/prism/commit/ad2948f)]
* __PHP__:
	* Add support for string interpolation inside double-quoted strings. Fix [#1146](https://github.com/PrismJS/prism/issues/1146) [[`9f1f8d6`](https://github.com/PrismJS/prism/commit/9f1f8d6)]
	* Add support for Heredoc and Nowdoc strings [[`5d7223c`](https://github.com/PrismJS/prism/commit/5d7223c)]
	* Fix shell-comment failure now that strings are greedy [[`ad25d22`](https://github.com/PrismJS/prism/commit/ad25d22)]
* __PowerShell__:
	* Add support for two levels of nested brackets inside namespace pattern. Fixes [#1317](https://github.com/PrismJS/prism/issues/1317) [[`3bc3e9c`](https://github.com/PrismJS/prism/commit/3bc3e9c)]
* __Ruby__:
	* Add keywords "protected", "private" and "public" [[`4593837`](https://github.com/PrismJS/prism/commit/4593837)]
* __Rust__:
	* Add support for lifetime-annotation and => operator. Fix [#1339](https://github.com/PrismJS/prism/issues/1339) [[`926f6f8`](https://github.com/PrismJS/prism/commit/926f6f8)]
* __Scheme__:
	* Don't highlight first number of a list as a function. Fix [#1331](https://github.com/PrismJS/prism/issues/1331) [[`51bff80`](https://github.com/PrismJS/prism/commit/51bff80)]
* __SQL__:
	* Add missing keywords and functions, fix numbers [[`de29d4a`](https://github.com/PrismJS/prism/commit/de29d4a)]

### Updated plugins
* __Autolinker__:
	* Allow more chars in query string and hash to match more URLs. Fix [#1142](https://github.com/PrismJS/prism/issues/1142) [[`109bd6f`](https://github.com/PrismJS/prism/commit/109bd6f)]
* __Copy to Clipboard__:
	* Bump ClipboardJS to 2.0.0 and remove hack ([#1314](https://github.com/PrismJS/prism/issues/1314)) [[`e9f410e`](https://github.com/PrismJS/prism/commit/e9f410e)]
* __Toolbar__:
	* Prevent scrolling toolbar with content ([#1305](https://github.com/PrismJS/prism/issues/1305), [#1314](https://github.com/PrismJS/prism/issues/1314)) [[`84eeb89`](https://github.com/PrismJS/prism/commit/84eeb89)]
* __Unescaped Markup__:
	* Use msMatchesSelector for IE11 and below. Fix [#1302](https://github.com/PrismJS/prism/issues/1302) [[`c246c1a`](https://github.com/PrismJS/prism/commit/c246c1a)]
* __WebPlatform Docs__:
	* WebPlatform Docs plugin: Fix links. Fixes [#1290](https://github.com/PrismJS/prism/issues/1290) [[`7a9dbe0`](https://github.com/PrismJS/prism/commit/7a9dbe0)]

### Other changes
* Fix Autoloader's demo page [[`3dddac9`](https://github.com/PrismJS/prism/commit/3dddac9)]
* Download page: Use hash instead of query-string for redownload URL. Fix [#1263](https://github.com/PrismJS/prism/issues/1263) [[`b03c02a`](https://github.com/PrismJS/prism/commit/b03c02a)]
* Core: Don't thow an error if lookbehing is used without anything matching. [[`e0cd47f`](https://github.com/PrismJS/prism/commit/e0cd47f)]
* Docs: Fix link to the `<code>` element specification in HTML5 [[`a84263f`](https://github.com/PrismJS/prism/commit/a84263f)]
* Docs: Mention support for `lang-xxxx` class. Close [#1312](https://github.com/PrismJS/prism/issues/1312) [[`a9e76db`](https://github.com/PrismJS/prism/commit/a9e76db)]
* Docs: Add note on `async` parameter to clarify the requirement of using a single bundled file. Closes [#1249](https://github.com/PrismJS/prism/issues/1249) [[`eba0235`](https://github.com/PrismJS/prism/commit/eba0235)]

## 1.11.0 (2018-02-05)

### New components
* __Content-Security-Policy (CSP)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)]
* __HTTP Public-Key-Pins (HPKP)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)]
* __HTTP String-Transport-Security (HSTS)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)]
* __React TSX__ ([#1280](https://github.com/PrismJS/prism/issues/1280)) [[`fbe82b8`](https://github.com/PrismJS/prism/commit/fbe82b8)]

### Updated components
* __C++__:
	* Add C++ platform-independent types ([#1271](https://github.com/PrismJS/prism/issues/1271)) [[`3da238f`](https://github.com/PrismJS/prism/commit/3da238f)]
* __TypeScript__:
	* Improve typescript with builtins ([#1277](https://github.com/PrismJS/prism/issues/1277)) [[`5de1b1f`](https://github.com/PrismJS/prism/commit/5de1b1f)]

### Other changes
* Fix passing of non-enumerable Error properties from the child test runner ([#1276](https://github.com/PrismJS/prism/issues/1276)) [[`38df653`](https://github.com/PrismJS/prism/commit/38df653)]

## 1.10.0 (2018-01-17)

### New components
* __6502 Assembly__ ([#1245](https://github.com/PrismJS/prism/issues/1245)) [[`2ece18b`](https://github.com/PrismJS/prism/commit/2ece18b)]
* __Elm__ ([#1174](https://github.com/PrismJS/prism/issues/1174)) [[`d6da70e`](https://github.com/PrismJS/prism/commit/d6da70e)]
* __IchigoJam BASIC__ ([#1246](https://github.com/PrismJS/prism/issues/1246)) [[`cf840be`](https://github.com/PrismJS/prism/commit/cf840be)]
* __Io__ ([#1251](https://github.com/PrismJS/prism/issues/1251)) [[`84ed3ed`](https://github.com/PrismJS/prism/commit/84ed3ed)]

### Updated components
* __BASIC__:
	* Make strings greedy [[`60114d0`](https://github.com/PrismJS/prism/commit/60114d0)]
* __C++__:
	* Add C++11 raw string feature ([#1254](https://github.com/PrismJS/prism/issues/1254)) [[`71595be`](https://github.com/PrismJS/prism/commit/71595be)]

### Updated plugins
* __Autoloader__:
	* Add support for `data-autoloader-path` ([#1242](https://github.com/PrismJS/prism/issues/1242)) [[`39360d6`](https://github.com/PrismJS/prism/commit/39360d6)]
* __Previewers__:
	* New plugin combining previous plugins Previewer: Base, Previewer: Angle, Previewer: Color, Previewer: Easing, Previewer: Gradient and Previewer: Time. ([#1244](https://github.com/PrismJS/prism/issues/1244)) [[`28e4b4c`](https://github.com/PrismJS/prism/commit/28e4b4c)]
* __Unescaped Markup__:
	* Make it work with any language ([#1265](https://github.com/PrismJS/prism/issues/1265)) [[`7bcdae7`](https://github.com/PrismJS/prism/commit/7bcdae7)]

### Other changes
* Add attribute `style` in `package.json` ([#1256](https://github.com/PrismJS/prism/issues/1256)) [[`a9b6785`](https://github.com/PrismJS/prism/commit/a9b6785)]

## 1.9.0 (2017-12-06)

### New components
* __Flow__ [[`d27b70d`](https://github.com/PrismJS/prism/commit/d27b70d)]

### Updated components
* __CSS__:
	* Unicode characters in CSS properties ([#1227](https://github.com/PrismJS/prism/issues/1227)) [[`f234ea4`](https://github.com/PrismJS/prism/commit/f234ea4)]
* __JSX__:
	* JSX: Improve highlighting support. Fix [#1235](https://github.com/PrismJS/prism/issues/1235) and [#1236](https://github.com/PrismJS/prism/issues/1236) [[`f41c5cd`](https://github.com/PrismJS/prism/commit/f41c5cd)]
* __Markup__:
	* Make CSS and JS inclusions in Markup greedy. Fix [#1240](https://github.com/PrismJS/prism/issues/1240) [[`7dc1e45`](https://github.com/PrismJS/prism/commit/7dc1e45)]
* __PHP__:
	* Add support for multi-line strings. Fix [#1233](https://github.com/PrismJS/prism/issues/1233) [[`9a542a0`](https://github.com/PrismJS/prism/commit/9a542a0)]

### Updated plugins
* __Copy to clipboard__:
	* Fix test for native Clipboard. Fix [#1241](https://github.com/PrismJS/prism/issues/1241) [[`e7b5e82`](https://github.com/PrismJS/prism/commit/e7b5e82)]
	* Copy to clipboard: Update to v1.7.1. Fix [#1220](https://github.com/PrismJS/prism/issues/1220) [[`a1b85e3`](https://github.com/PrismJS/prism/commit/a1b85e3), [`af50e44`](https://github.com/PrismJS/prism/commit/af50e44)]
* __Line highlight__:
	* Fixes to compatibility of line number and line higlight plugins ([#1194](https://github.com/PrismJS/prism/issues/1194)) [[`e63058f`](https://github.com/PrismJS/prism/commit/e63058f), [`3842a91`](https://github.com/PrismJS/prism/commit/3842a91)]
* __Unescaped Markup__:
	* Fix ambiguity in documentation by improving examples. Fix [#1197](https://github.com/PrismJS/prism/issues/1197) [[`924784a`](https://github.com/PrismJS/prism/commit/924784a)]

### Other changes
* Allow any element being root instead of document. ([#1230](https://github.com/PrismJS/prism/issues/1230)) [[`69f2e2c`](https://github.com/PrismJS/prism/commit/69f2e2c), [`6e50d44`](https://github.com/PrismJS/prism/commit/6e50d44)]
* Coy Theme: The 'height' element makes code blocks the height of the browser canvas. ([#1224](https://github.com/PrismJS/prism/issues/1224)) [[`ac219d7`](https://github.com/PrismJS/prism/commit/ac219d7)]
* Download page: Fix implicitly declared variable [[`f986551`](https://github.com/PrismJS/prism/commit/f986551)]
* Download page: Add version number at the beginning of the generated files. Fix [#788](https://github.com/PrismJS/prism/issues/788) [[`928790d`](https://github.com/PrismJS/prism/commit/928790d)]

## 1.8.4 (2017-11-05)

### Updated components

* __ABAP__:
	* Regexp optimisation [[`e7b411e`](https://github.com/PrismJS/prism/commit/e7b411e)]
* __ActionScript__:
	* Fix XML regex + optimise [[`75d00d7`](https://github.com/PrismJS/prism/commit/75d00d7)]
* __Ada__:
	* Regexp simplification [[`e881fe3`](https://github.com/PrismJS/prism/commit/e881fe3)]
* __Apacheconf__:
	* Regexp optimisation [[`a065e61`](https://github.com/PrismJS/prism/commit/a065e61)]
* __APL__:
	* Regexp simplification [[`33297c4`](https://github.com/PrismJS/prism/commit/33297c4)]
* __AppleScript__:
	* Regexp optimisation [[`d879f36`](https://github.com/PrismJS/prism/commit/d879f36)]
* __Arduino__:
	* Don't use captures if not needed [[`16b338f`](https://github.com/PrismJS/prism/commit/16b338f)]
* __ASP.NET__:
	* Regexp optimisation [[`438926c`](https://github.com/PrismJS/prism/commit/438926c)]
* __AutoHotkey__:
	* Regexp simplification + don't use captures if not needed [[`5edfd2f`](https://github.com/PrismJS/prism/commit/5edfd2f)]
* __Bash__:
	* Regexp opti   misation and simplification [[`75b9b29`](https://github.com/PrismJS/prism/commit/75b9b29)]
* __Bro__:
	* Regexp simplification + don't use captures if not needed [[`d4b9003`](https://github.com/PrismJS/prism/commit/d4b9003)]
* __C__:
	* Regexp optimisation + don't use captures if not needed [[`f61d487`](https://github.com/PrismJS/prism/commit/f61d487)]
* __C++__:
	* Fix operator regexp + regexp simplification + don't use captures if not needed [[`ffeb26e`](https://github.com/PrismJS/prism/commit/ffeb26e)]
* __C#__:
	* Remove duplicates in keywords + regexp optimisation + don't use captures if not needed [[`d28d178`](https://github.com/PrismJS/prism/commit/d28d178)]
* __C-like__:
	* Regexp simplification + don't use captures if not needed [[`918e0ff`](https://github.com/PrismJS/prism/commit/918e0ff)]
* __CoffeeScript__:
	* Regexp optimisation + don't use captures if not needed [[`5895978`](https://github.com/PrismJS/prism/commit/5895978)]
* __Crystal__:
	* Remove trailing comma [[`16979a3`](https://github.com/PrismJS/prism/commit/16979a3)]
* __CSS__:
	* Regexp simplification + don't use captures if not needed + handle multi-line style attributes [[`43d9f36`](https://github.com/PrismJS/prism/commit/43d9f36)]
* __CSS Extras__:
	* Regexp simplification [[`134ed70`](https://github.com/PrismJS/prism/commit/134ed70)]
* __D__:
	* Regexp optimisation [[`fbe39c9`](https://github.com/PrismJS/prism/commit/fbe39c9)]
* __Dart__:
	* Regexp optimisation [[`f24e919`](https://github.com/PrismJS/prism/commit/f24e919)]
* __Django__:
	* Regexp optimisation [[`a95c51d`](https://github.com/PrismJS/prism/commit/a95c51d)]
* __Docker__:
	* Regexp optimisation [[`27f99ff`](https://github.com/PrismJS/prism/commit/27f99ff)]
* __Eiffel__:
	* Regexp optimisation [[`b7cdea2`](https://github.com/PrismJS/prism/commit/b7cdea2)]
* __Elixir__:
	* Regexp optimisation + uniform behavior between ~r and ~s [[`5d12e80`](https://github.com/PrismJS/prism/commit/5d12e80)]
* __Erlang__:
	* Regexp optimisation [[`7547f83`](https://github.com/PrismJS/prism/commit/7547f83)]
* __F#__:
	* Regexp optimisation + don't use captures if not needed [[`7753fc4`](https://github.com/PrismJS/prism/commit/7753fc4)]
* __Gherkin__:
	* Regexp optimisation + don't use captures if not needed + added explanation comment on table-body regexp [[`f26197a`](https://github.com/PrismJS/prism/commit/f26197a)]
* __Git__:
	* Regexp optimisation [[`b9483b9`](https://github.com/PrismJS/prism/commit/b9483b9)]
* __GLSL__:
	* Regexp optimisation [[`e66d21b`](https://github.com/PrismJS/prism/commit/e66d21b)]
* __Go__:
	* Regexp optimisation + don't use captures if not needed [[`88caabb`](https://github.com/PrismJS/prism/commit/88caabb)]
* __GraphQL__:
	* Regexp optimisation and simplification [[`2474f06`](https://github.com/PrismJS/prism/commit/2474f06)]
* __Groovy__:
	* Regexp optimisation + don't use captures if not needed [[`e74e00c`](https://github.com/PrismJS/prism/commit/e74e00c)]
* __Haml__:
	* Regexp optimisation + don't use captures if not needed + fix typo in comment [[`23e3b43`](https://github.com/PrismJS/prism/commit/23e3b43)]
* __Handlebars__:
	* Regexp optimisation + don't use captures if not needed [[`09dbfce`](https://github.com/PrismJS/prism/commit/09dbfce)]
* __Haskell__:
	* Regexp simplification + don't use captures if not needed [[`f11390a`](https://github.com/PrismJS/prism/commit/f11390a)]
* __HTTP__:
	* Regexp simplification + don't use captures if not needed [[`37ef24e`](https://github.com/PrismJS/prism/commit/37ef24e)]
* __Icon__:
	* Regexp optimisation [[`9cf64a0`](https://github.com/PrismJS/prism/commit/9cf64a0)]
* __J__:
	* Regexp simplification [[`de15150`](https://github.com/PrismJS/prism/commit/de15150)]
* __Java__:
	* Don't use captures if not needed [[`96b35c8`](https://github.com/PrismJS/prism/commit/96b35c8)]
* __JavaScript__:
	* Regexp optimisation + don't use captures if not needed [[`93d4002`](https://github.com/PrismJS/prism/commit/93d4002)]
* __Jolie__:
	* Regexp optimisation + don't use captures if not needed + remove duplicates in keywords [[`a491f9e`](https://github.com/PrismJS/prism/commit/a491f9e)]
* __JSON__:
	* Make strings greedy, remove negative look-ahead for ":". Fix [#1204](https://github.com/PrismJS/prism/issues/1204) [[`98acd2d`](https://github.com/PrismJS/prism/commit/98acd2d)]
	* Regexp optimisation + don't use captures if not needed [[`8fc1b03`](https://github.com/PrismJS/prism/commit/8fc1b03)]
* __JSX__:
	* Regexp optimisation + handle spread operator as a whole [[`28de4e2`](https://github.com/PrismJS/prism/commit/28de4e2)]
* __Julia__:
	* Regexp optimisation and simplification [[`12684c0`](https://github.com/PrismJS/prism/commit/12684c0)]
* __Keyman__:
	* Regexp optimisation + don't use captures if not needed [[`9726087`](https://github.com/PrismJS/prism/commit/9726087)]
* __Kotlin__:
	* Regexp simplification [[`12ff8dc`](https://github.com/PrismJS/prism/commit/12ff8dc)]
* __LaTeX__:
	* Regexp optimisation and simplification [[`aa426b0`](https://github.com/PrismJS/prism/commit/aa426b0)]
* __LiveScript__:
	* Make interpolated strings greedy + fix variable and identifier regexps [[`c581049`](https://github.com/PrismJS/prism/commit/c581049)]
* __LOLCODE__:
	* Don't use captures if not needed [[`52903af`](https://github.com/PrismJS/prism/commit/52903af)]
* __Makefile__:
	* Regexp optimisation [[`20ae2e5`](https://github.com/PrismJS/prism/commit/20ae2e5)]
* __Markdown__:
	* Don't use captures if not needed [[`f489a1e`](https://github.com/PrismJS/prism/commit/f489a1e)]
* __Markup__:
	* Regexp optimisation + fix punctuation inside attr-value [[`ea380c6`](https://github.com/PrismJS/prism/commit/ea380c6)]
* __MATLAB__:
	* Make strings greedy + handle line feeds better [[`4cd4f01`](https://github.com/PrismJS/prism/commit/4cd4f01)]
* __Monkey__:
	* Don't use captures if not needed [[`7f47140`](https://github.com/PrismJS/prism/commit/7f47140)]
* __N4JS__:
	* Don't use captures if not needed [[`2d3f9df`](https://github.com/PrismJS/prism/commit/2d3f9df)]
* __NASM__:
	* Regexp optimisation and simplification + don't use captures if not needed [[`9937428`](https://github.com/PrismJS/prism/commit/9937428)]
* __nginx__:
	* Remove trailing comma + remove duplicates in keywords [[`c6e7195`](https://github.com/PrismJS/prism/commit/c6e7195)]
* __NSIS__:
	* Regexp optimisation + don't use captures if not needed [[`beeb107`](https://github.com/PrismJS/prism/commit/beeb107)]
* __Objective-C__:
	* Don't use captures if not needed [[`9be0f88`](https://github.com/PrismJS/prism/commit/9be0f88)]
* __OCaml__:
	* Regexp simplification [[`5f5f38c`](https://github.com/PrismJS/prism/commit/5f5f38c)]
* __OpenCL__:
	* Don't use captures if not needed [[`5e70f1d`](https://github.com/PrismJS/prism/commit/5e70f1d)]
* __Oz__:
	* Fix atom regexp [[`9320e92`](https://github.com/PrismJS/prism/commit/9320e92)]
* __PARI/GP__:
	* Regexp optimisation [[`2c7b59b`](https://github.com/PrismJS/prism/commit/2c7b59b)]
* __Parser__:
	* Regexp simplification [[`569d511`](https://github.com/PrismJS/prism/commit/569d511)]
* __Perl__:
	* Regexp optimisation and simplification + don't use captures if not needed [[`0fe4cf6`](https://github.com/PrismJS/prism/commit/0fe4cf6)]
* __PHP__:
	* Don't use captures if not needed Golmote [[`5235f18`](https://github.com/PrismJS/prism/commit/5235f18)]
* __PHP Extras__:
	* Add word boundary after global keywords + don't use captures if not needed [[`9049a2a`](https://github.com/PrismJS/prism/commit/9049a2a)]
* __PowerShell__:
	* Regexp optimisation + don't use captures if not needed [[`0d05957`](https://github.com/PrismJS/prism/commit/0d05957)]
* __Processing__:
	* Regexp simplification [[`8110d38`](https://github.com/PrismJS/prism/commit/8110d38)]
* __.properties__:
	* Regexp optimisation [[`678b621`](https://github.com/PrismJS/prism/commit/678b621)]
* __Protocol Buffers__:
	* Don't use captures if not needed [[`3e256d8`](https://github.com/PrismJS/prism/commit/3e256d8)]
* __Pug__:
	* Don't use captures if not needed [[`76dc925`](https://github.com/PrismJS/prism/commit/76dc925)]
* __Pure__:
	* Make inline-lang greedy [[`92318b0`](https://github.com/PrismJS/prism/commit/92318b0)]
* __Python__:
	* Add Python builtin function highlighting ([#1205](https://github.com/PrismJS/prism/issues/1205)) [[`2169c99`](https://github.com/PrismJS/prism/commit/2169c99)]
	* Python: Add highlighting to functions with space between name and parentheses ([#1207](https://github.com/PrismJS/prism/issues/1207)) [[`3badd8a`](https://github.com/PrismJS/prism/commit/3badd8a)]
	* Make triple-quoted strings greedy + regexp optimisation and simplification [[`f09f9f5`](https://github.com/PrismJS/prism/commit/f09f9f5)]
* __Qore__:
	* Regexp simplification [[`69459f0`](https://github.com/PrismJS/prism/commit/69459f0)]
* __R__:
	* Regexp optimisation [[`06a9da4`](https://github.com/PrismJS/prism/commit/06a9da4)]
* __Reason__:
	* Regexp optimisation + don't use capture if not needed [[`19d79b4`](https://github.com/PrismJS/prism/commit/19d79b4)]
* __Ren'py__:
	* Make strings greedy + don't use captures if not needed [[`91d84d9`](https://github.com/PrismJS/prism/commit/91d84d9)]
* __reST__:
	* Regexp simplification + don't use captures if not needed [[`1a8b3e9`](https://github.com/PrismJS/prism/commit/1a8b3e9)]
* __Rip__:
	* Regexp optimisation [[`d7f0ee8`](https://github.com/PrismJS/prism/commit/d7f0ee8)]
* __Ruby__:
	* Regexp optimisation and simplification + don't use captures if not needed [[`4902ed4`](https://github.com/PrismJS/prism/commit/4902ed4)]
* __Rust__:
	* Regexp optimisation and simplification + don't use captures if not needed [[`cc9d874`](https://github.com/PrismJS/prism/commit/cc9d874)]
* __Sass__:
	* Regexp simplification Golmote [[`165d957`](https://github.com/PrismJS/prism/commit/165d957)]
* __Scala__:
	* Regexp optimisation Golmote [[`5f50c12`](https://github.com/PrismJS/prism/commit/5f50c12)]
* __Scheme__:
	* Regexp optimisation [[`bd19b04`](https://github.com/PrismJS/prism/commit/bd19b04)]
* __SCSS__:
	* Regexp simplification [[`c60b7d4`](https://github.com/PrismJS/prism/commit/c60b7d4)]
* __Smalltalk__:
	* Regexp simplification [[`41a2c76`](https://github.com/PrismJS/prism/commit/41a2c76)]
* __Smarty__:
	* Regexp optimisation and simplification [[`e169be9`](https://github.com/PrismJS/prism/commit/e169be9)]
* __SQL__:
	* Regexp optimisation [[`a6244a4`](https://github.com/PrismJS/prism/commit/a6244a4)]
* __Stylus__:
	* Regexp optimisation [[`df9506c`](https://github.com/PrismJS/prism/commit/df9506c)]
* __Swift__:
	* Don't use captures if not needed [[`a2d737a`](https://github.com/PrismJS/prism/commit/a2d737a)]
* __Tcl__:
	* Regexp simplification + don't use captures if not needed [[`f0b8a33`](https://github.com/PrismJS/prism/commit/f0b8a33)]
* __Textile__:
	* Regexp optimisation + don't use captures if not needed [[`08139ad`](https://github.com/PrismJS/prism/commit/08139ad)]
* __Twig__:
	* Regexp optimisation and simplification + don't use captures if not needed [[`0b10fd0`](https://github.com/PrismJS/prism/commit/0b10fd0)]
* __TypeScript__:
	* Don't use captures if not needed [[`e296caf`](https://github.com/PrismJS/prism/commit/e296caf)]
* __Verilog__:
	* Regexp simplification [[`1b24b34`](https://github.com/PrismJS/prism/commit/1b24b34)]
* __VHDL__:
	* Regexp optimisation and simplification [[`7af36df`](https://github.com/PrismJS/prism/commit/7af36df)]
* __vim__:
	* Remove duplicates in keywords [[`700505e`](https://github.com/PrismJS/prism/commit/700505e)]
* __Wiki markup__:
	* Fix escaping consistency [[`1fd690d`](https://github.com/PrismJS/prism/commit/1fd690d)]
* __YAML__:
	* Regexp optimisation + don't use captures if not needed [[`1fd690d`](https://github.com/PrismJS/prism/commit/1fd690d)]

### Other changes
* Remove comments spellcheck for AMP validation ([#1106](https://github.com/PrismJS/prism/issues/1106)) [[`de996d7`](https://github.com/PrismJS/prism/commit/de996d7)]
* Prevent error from throwing when element does not have a parentNode in highlightElement. [[`c33be19`](https://github.com/PrismJS/prism/commit/c33be19)]
* Provide a way to load Prism from inside a Worker without listening to messages. ([#1188](https://github.com/PrismJS/prism/issues/1188)) [[`d09982d`](https://github.com/PrismJS/prism/commit/d09982d)]

## 1.8.3 (2017-10-19)

### Other changes

* Fix inclusion tests for Pug [[`955c2ab`](https://github.com/PrismJS/prism/commit/955c2ab)]

## 1.8.2 (2017-10-19)

### Updated components
* __Jade__:
	* Jade has been renamed to __Pug__ ([#1201](https://github.com/PrismJS/prism/issues/1201)) [[`bcfef7c`](https://github.com/PrismJS/prism/commit/bcfef7c)]
* __JavaScript__:
	* Better highlighting of functions ([#1190](https://github.com/PrismJS/prism/issues/1190)) [[`8ee2cd3`](https://github.com/PrismJS/prism/commit/8ee2cd3)]

### Update plugins
* __Copy to clipboard__:
	* Fix error occurring when using in Chrome 61+ ([#1206](https://github.com/PrismJS/prism/issues/1206)) [[`b41d571`](https://github.com/PrismJS/prism/commit/b41d571)]
* __Show invisibles__:
	* Prevent error when using with Autoloader plugin ([#1195](https://github.com/PrismJS/prism/issues/1195)) [[`ed8bdb5`](https://github.com/PrismJS/prism/commit/ed8bdb5)]

## 1.8.1 (2017-09-16)

### Other changes

* Add Arduino to components.js [[`290a3c6`](https://github.com/PrismJS/prism/commit/290a3c6)]

## 1.8.0 (2017-09-16)

### New components

* __Arduino__ ([#1184](https://github.com/PrismJS/prism/issues/1184)) [[`edf2454`](https://github.com/PrismJS/prism/commit/edf2454)]
* __OpenCL__ ([#1175](https://github.com/PrismJS/prism/issues/1175)) [[`131e8fa`](https://github.com/PrismJS/prism/commit/131e8fa)]

### Updated plugins

* __Autolinker__:
	* Silently catch any error thrown by decodeURIComponent. Fixes [#1186](https://github.com/PrismJS/prism/issues/1186) [[`2e43fcf`](https://github.com/PrismJS/prism/commit/2e43fcf)]

## 1.7.0 (2017-09-09)

### New components

* __Django/Jinja2__ ([#1085](https://github.com/PrismJS/prism/issues/1085)) [[`345b1b2`](https://github.com/PrismJS/prism/commit/345b1b2)]
* __N4JS__ ([#1141](https://github.com/PrismJS/prism/issues/1141)) [[`eaa8ebb`](https://github.com/PrismJS/prism/commit/eaa8ebb)]
* __Ren'py__ ([#658](https://github.com/PrismJS/prism/issues/658)) [[`7ab4013`](https://github.com/PrismJS/prism/commit/7ab4013)]
* __VB.Net__ ([#1122](https://github.com/PrismJS/prism/issues/1122)) [[`5400651`](https://github.com/PrismJS/prism/commit/5400651)]

### Updated components

* __APL__:
	* Add left shoe underbar and right shoe underbar ([#1072](https://github.com/PrismJS/prism/issues/1072)) [[`12238c5`](https://github.com/PrismJS/prism/commit/12238c5)]
	* Update prism-apl.js ([#1126](https://github.com/PrismJS/prism/issues/1126)) [[`a5f3cdb`](https://github.com/PrismJS/prism/commit/a5f3cdb)]
* __C__:
	* Add more keywords and constants for C. ([#1029](https://github.com/PrismJS/prism/issues/1029)) [[`43a388e`](https://github.com/PrismJS/prism/commit/43a388e)]
* __C#__:
	* Fix wrong highlighting when three slashes appear inside string. Fix [#1091](https://github.com/PrismJS/prism/issues/1091) [[`dfb6f17`](https://github.com/PrismJS/prism/commit/dfb6f17)]
* __C-like__:
	* Add support for unclosed block comments. Close [#828](https://github.com/PrismJS/prism/issues/828) [[`3426ed1`](https://github.com/PrismJS/prism/commit/3426ed1)]
* __Crystal__:
	* Update Crystal keywords ([#1092](https://github.com/PrismJS/prism/issues/1092)) [[`125bff1`](https://github.com/PrismJS/prism/commit/125bff1)]
* __CSS Extras__:
	* Support CSS #RRGGBBAA ([#1139](https://github.com/PrismJS/prism/issues/1139)) [[`07a6806`](https://github.com/PrismJS/prism/commit/07a6806)]
* __Docker__:
	* Add dockerfile alias for docker language ([#1164](https://github.com/PrismJS/prism/issues/1164)) [[`601c47f`](https://github.com/PrismJS/prism/commit/601c47f)]
	* Update the list of keywords for dockerfiles ([#1180](https://github.com/PrismJS/prism/issues/1180)) [[`f0d73e0`](https://github.com/PrismJS/prism/commit/f0d73e0)]
* __Eiffel__:
	* Add class-name highlighting for Eiffel ([#471](https://github.com/PrismJS/prism/issues/471)) [[`cd03587`](https://github.com/PrismJS/prism/commit/cd03587)]
* __Handlebars__:
	* Check for possible pre-existing marker strings in Handlebars [[`7a1a404`](https://github.com/PrismJS/prism/commit/7a1a404)]
* __JavaScript__:
	* Properly match every operator as a whole token. Fix [#1133](https://github.com/PrismJS/prism/issues/1133) [[`9f649fb`](https://github.com/PrismJS/prism/commit/9f649fb)]
	* Allows uppercase prefixes in JS number literals ([#1151](https://github.com/PrismJS/prism/issues/1151)) [[`d4ee904`](https://github.com/PrismJS/prism/commit/d4ee904)]
	* Reduced backtracking in regex pattern. Fix [#1159](https://github.com/PrismJS/prism/issues/1159) [[`ac09e97`](https://github.com/PrismJS/prism/commit/ac09e97)]
* __JSON__:
	* Fix property and string patterns performance. Fix [#1080](https://github.com/PrismJS/prism/issues/1080) [[`0ca1353`](https://github.com/PrismJS/prism/commit/0ca1353)]
* __JSX__:
	* JSX spread operator break. Fixes [#1061](https://github.com/PrismJS/prism/issues/1061) ([#1094](https://github.com/PrismJS/prism/issues/1094)) [[`561bceb`](https://github.com/PrismJS/prism/commit/561bceb)]
	* Fix highlighting of attributes containing spaces [[`867ea42`](https://github.com/PrismJS/prism/commit/867ea42)]
	* Improved performance for tags (when not matching) Fix [#1152](https://github.com/PrismJS/prism/issues/1152) [[`b0fe103`](https://github.com/PrismJS/prism/commit/b0fe103)]
* __LOLCODE__:
	* Make strings greedy Golmote [[`1a5e7a4`](https://github.com/PrismJS/prism/commit/1a5e7a4)]
* __Markup__:
	* Support HTML entities in attribute values ([#1143](https://github.com/PrismJS/prism/issues/1143)) [[`1d5047d`](https://github.com/PrismJS/prism/commit/1d5047d)]
* __NSIS__:
	* Update patterns ([#1033](https://github.com/PrismJS/prism/issues/1033)) [[`01a59d8`](https://github.com/PrismJS/prism/commit/01a59d8)]
	* Add support for NSIS 3.02 ([#1169](https://github.com/PrismJS/prism/issues/1169)) [[`393b5f7`](https://github.com/PrismJS/prism/commit/393b5f7)]
* __PHP__:
	* Fix the PHP language ([#1100](https://github.com/PrismJS/prism/issues/1100)) [[`1453fa7`](https://github.com/PrismJS/prism/commit/1453fa7)]
	* Check for possible pre-existing marker strings in PHP [[`36bc560`](https://github.com/PrismJS/prism/commit/36bc560)]
* __Ruby__:
	* Fix slash regex performance. Fix [#1083](https://github.com/PrismJS/prism/issues/1083) [[`a708730`](https://github.com/PrismJS/prism/commit/a708730)]
	* Add support for =begin =end comments. Manual merge of [#1121](https://github.com/PrismJS/prism/issues/1121). [[`62cdaf8`](https://github.com/PrismJS/prism/commit/62cdaf8)]
* __Smarty__:
	* Check for possible pre-existing marker strings in Smarty [[`5df26e2`](https://github.com/PrismJS/prism/commit/5df26e2)]
* __TypeScript__:
	* Update typescript keywords ([#1064](https://github.com/PrismJS/prism/issues/1064)) [[`52020a0`](https://github.com/PrismJS/prism/commit/52020a0)]
	* Chmod -x prism-typescript component ([#1145](https://github.com/PrismJS/prism/issues/1145)) [[`afe0542`](https://github.com/PrismJS/prism/commit/afe0542)]
* __YAML__:
	* Make strings greedy (partial fix for [#1075](https://github.com/PrismJS/prism/issues/1075)) [[`565a2cc`](https://github.com/PrismJS/prism/commit/565a2cc)]

### Updated plugins

* __Autolinker__:
	* Fixed an rendering issue for encoded urls ([#1173](https://github.com/PrismJS/prism/issues/1173)) [[`abc007f`](https://github.com/PrismJS/prism/commit/abc007f)]
* __Custom Class__:
	* Add missing noCSS property for the Custom Class plugin [[`ba64f8d`](https://github.com/PrismJS/prism/commit/ba64f8d)]
	* Added a default for classMap. Fixes [#1137](https://github.com/PrismJS/prism/issues/1137). ([#1157](https://github.com/PrismJS/prism/issues/1157)) [[`5400af9`](https://github.com/PrismJS/prism/commit/5400af9)]
* __Keep Markup__:
	* Store highlightedCode after reinserting markup. Fix [#1127](https://github.com/PrismJS/prism/issues/1127) [[`6df2ceb`](https://github.com/PrismJS/prism/commit/6df2ceb)]
* __Line Highlight__:
	* Cleanup left-over line-highlight tags before other plugins run [[`79b723d`](https://github.com/PrismJS/prism/commit/79b723d)]
	* Avoid conflict between line-highlight and other plugins [[`224fdb8`](https://github.com/PrismJS/prism/commit/224fdb8)]
* __Line Numbers__:
	* Support soft wrap for line numbers plugin ([#584](https://github.com/PrismJS/prism/issues/584)) [[`849f1d6`](https://github.com/PrismJS/prism/commit/849f1d6)]
	* Plugins fixes (unescaped-markup, line-numbers) ([#1012](https://github.com/PrismJS/prism/issues/1012)) [[`3fb7cf8`](https://github.com/PrismJS/prism/commit/3fb7cf8)]
* __Normalize Whitespace__:
	* Add Node.js support for the normalize-whitespace plugin [[`6c7dae2`](https://github.com/PrismJS/prism/commit/6c7dae2)]
* __Unescaped Markup__:
	* Plugins fixes (unescaped-markup, line-numbers) ([#1012](https://github.com/PrismJS/prism/issues/1012)) [[`3fb7cf8`](https://github.com/PrismJS/prism/commit/3fb7cf8)]

### Updated themes
* __Coy__:
	* Scroll 'Coy' background with contents ([#1163](https://github.com/PrismJS/prism/issues/1163)) [[`310990b`](https://github.com/PrismJS/prism/commit/310990b)]

### Other changes

* Initial implementation of manual highlighting ([#1087](https://github.com/PrismJS/prism/issues/1087)) [[`bafc4cb`](https://github.com/PrismJS/prism/commit/bafc4cb)]
* Remove dead link in Third-party tutorials section. Fixes [#1028](https://github.com/PrismJS/prism/issues/1028) [[`dffadc6`](https://github.com/PrismJS/prism/commit/dffadc6)]
* Most languages now use the greedy flag for better highlighting [[`7549ecc`](https://github.com/PrismJS/prism/commit/7549ecc)]
* .npmignore: Unignore components.js ([#1108](https://github.com/PrismJS/prism/issues/1108)) [[`1f699e7`](https://github.com/PrismJS/prism/commit/1f699e7)]
* Run before-highlight and after-highlight hooks even when no grammar is found. Fix [#1134](https://github.com/PrismJS/prism/issues/1134) [[`70cb472`](https://github.com/PrismJS/prism/commit/70cb472)]
* Replace [\w\W] with [\s\S] and [0-9] with \d in regexes ([#1107](https://github.com/PrismJS/prism/issues/1107)) [[`8aa2cc4`](https://github.com/PrismJS/prism/commit/8aa2cc4)]
* Fix corner cases for the greedy flag ([#1095](https://github.com/PrismJS/prism/issues/1095)) [[`6530709`](https://github.com/PrismJS/prism/commit/6530709)]
* Add Third Party Tutorial ([#1156](https://github.com/PrismJS/prism/issues/1156)) [[`c34e57b`](https://github.com/PrismJS/prism/commit/c34e57b)]
* Add Composer support ([#648](https://github.com/PrismJS/prism/issues/648)) [[`2989633`](https://github.com/PrismJS/prism/commit/2989633)]
* Remove IE8 plugin ([#992](https://github.com/PrismJS/prism/issues/992)) [[`25788eb`](https://github.com/PrismJS/prism/commit/25788eb)]
* Website: remove width and height on logo.svg, so it becomes scalable. Close [#1005](https://github.com/PrismJS/prism/issues/1005) [[`0621ff7`](https://github.com/PrismJS/prism/commit/0621ff7)]
* Remove yarn.lock ([#1098](https://github.com/PrismJS/prism/issues/1098)) [[`11eed25`](https://github.com/PrismJS/prism/commit/11eed25)]

## 1.6.0 (2016-12-03)

### New components

* __.properties__ ([#980](https://github.com/PrismJS/prism/issues/980)) [[`be6219a`](https://github.com/PrismJS/prism/commit/be6219a)]
* __Ada__ ([#949](https://github.com/PrismJS/prism/issues/949)) [[`65619f7`](https://github.com/PrismJS/prism/commit/65619f7)]
* __GraphQL__ ([#971](https://github.com/PrismJS/prism/issues/971)) [[`e018087`](https://github.com/PrismJS/prism/commit/e018087)]
* __Jolie__ ([#1014](https://github.com/PrismJS/prism/issues/1014)) [[`dfc1941`](https://github.com/PrismJS/prism/commit/dfc1941)]
* __LiveScript__ ([#982](https://github.com/PrismJS/prism/issues/982)) [[`62e258c`](https://github.com/PrismJS/prism/commit/62e258c)]
* __Reason__ (Fixes [#1046](https://github.com/PrismJS/prism/issues/1046)) [[`3cae6ce`](https://github.com/PrismJS/prism/commit/3cae6ce)]
* __Xojo__ ([#994](https://github.com/PrismJS/prism/issues/994)) [[`0224b7c`](https://github.com/PrismJS/prism/commit/0224b7c)]

### Updated components

* __APL__:
	* Add iota underbar ([#1024](https://github.com/PrismJS/prism/issues/1024)) [[`3c5c89a`](https://github.com/PrismJS/prism/commit/3c5c89a), [`ac21d33`](https://github.com/PrismJS/prism/commit/ac21d33)]
* __AsciiDoc__:
	* Optimized block regexps to prevent struggling on large files. Fixes [#1001](https://github.com/PrismJS/prism/issues/1001). [[`1a86d34`](https://github.com/PrismJS/prism/commit/1a86d34)]
* __Bash__:
	* Add `npm` to function list ([#969](https://github.com/PrismJS/prism/issues/969)) [[`912bdfe`](https://github.com/PrismJS/prism/commit/912bdfe)]
* __CSS__:
	* Make CSS strings greedy. Fix [#1013](https://github.com/PrismJS/prism/issues/1013). [[`e57e26d`](https://github.com/PrismJS/prism/commit/e57e26d)]
* __CSS Extras__:
	* Match attribute inside selectors [[`13fed76`](https://github.com/PrismJS/prism/commit/13fed76)]
* __Groovy__:
	* Fix order of decoding entities in groovy. Fixes [#1049](https://github.com/PrismJS/prism/issues/1049) ([#1050](https://github.com/PrismJS/prism/issues/1050)) [[`d75da8e`](https://github.com/PrismJS/prism/commit/d75da8e)]
* __Ini__:
	* Remove important token in ini definition ([#1047](https://github.com/PrismJS/prism/issues/1047)) [[`fe8ad8b`](https://github.com/PrismJS/prism/commit/fe8ad8b)]
* __JavaScript__:
	* Add exponentiation & spread/rest operator ([#991](https://github.com/PrismJS/prism/issues/991)) [[`b2de65a`](https://github.com/PrismJS/prism/commit/b2de65a), [`268d01e`](https://github.com/PrismJS/prism/commit/268d01e)]
* __JSON__:
	* JSON: Fixed issues with properties and strings + added tests. Fix [#1025](https://github.com/PrismJS/prism/issues/1025) [[`25a541d`](https://github.com/PrismJS/prism/commit/25a541d)]
* __Markup__:
	* Allow for dots in Markup tag names, but not in HTML tags included in Textile. Fixes [#888](https://github.com/PrismJS/prism/issues/888). [[`31ea66b`](https://github.com/PrismJS/prism/commit/31ea66b)]
	* Make doctype case-insensitive ([#1009](https://github.com/PrismJS/prism/issues/1009)) [[`3dd7219`](https://github.com/PrismJS/prism/commit/3dd7219)]
* __NSIS__:
	* Updated patterns ([#1032](https://github.com/PrismJS/prism/issues/1032)) [[`76ba1b8`](https://github.com/PrismJS/prism/commit/76ba1b8)]
* __PHP__:
	* Make comments greedy. Fix [#197](https://github.com/PrismJS/prism/issues/197) [[`318aab3`](https://github.com/PrismJS/prism/commit/318aab3)]
* __PowerShell__:
	* Fix highlighting of empty comments ([#977](https://github.com/PrismJS/prism/issues/977)) [[`4fda477`](https://github.com/PrismJS/prism/commit/4fda477)]
* __Puppet__:
	* Fix over-greedy regexp detection ([#978](https://github.com/PrismJS/prism/issues/978)) [[`105be25`](https://github.com/PrismJS/prism/commit/105be25)]
* __Ruby__:
	* Fix typo `Fload` to `Float` in prism-ruby.js ([#1023](https://github.com/PrismJS/prism/issues/1023)) [[`22cb018`](https://github.com/PrismJS/prism/commit/22cb018)]
	* Make strings greedy. Fixes [#1048](https://github.com/PrismJS/prism/issues/1048) [[`8b0520a`](https://github.com/PrismJS/prism/commit/8b0520a)]
* __SCSS__:
	* Alias statement as keyword. Fix [#246](https://github.com/PrismJS/prism/issues/246) [[`fd09391`](https://github.com/PrismJS/prism/commit/fd09391)]
	* Highlight variables inside selectors and properties. [[`d6b5c2f`](https://github.com/PrismJS/prism/commit/d6b5c2f)]
	* Highlight parent selector [[`8f5f1fa`](https://github.com/PrismJS/prism/commit/8f5f1fa)]
* __TypeScript__:
	* Add missing `from` keyword to typescript & set `ts` as alias. ([#1042](https://github.com/PrismJS/prism/issues/1042)) [[`cba78f3`](https://github.com/PrismJS/prism/commit/cba78f3)]

### New plugins

* __Copy to Clipboard__ ([#891](https://github.com/PrismJS/prism/issues/891)) [[`07b81ac`](https://github.com/PrismJS/prism/commit/07b81ac)]
* __Custom Class__ ([#950](https://github.com/PrismJS/prism/issues/950)) [[`a0bd686`](https://github.com/PrismJS/prism/commit/a0bd686)]
* __Data-URI Highlight__ ([#996](https://github.com/PrismJS/prism/issues/996)) [[`bdca61b`](https://github.com/PrismJS/prism/commit/bdca61b)]
* __Toolbar__ ([#891](https://github.com/PrismJS/prism/issues/891)) [[`07b81ac`](https://github.com/PrismJS/prism/commit/07b81ac)]

### Updated plugins

* __Autoloader__:
	* Updated documentation for Autoloader plugin [[`b4f3423`](https://github.com/PrismJS/prism/commit/b4f3423)]
    * Download all grammars as a zip from Autoloader plugin page ([#981](https://github.com/PrismJS/prism/issues/981)) [[`0d0a007`](https://github.com/PrismJS/prism/commit/0d0a007), [`5c815d3`](https://github.com/PrismJS/prism/commit/5c815d3)]
    * Removed duplicated script on Autoloader plugin page [[`9671996`](https://github.com/PrismJS/prism/commit/9671996)]
    * Don't try to load "none" component. Fix [#1000](https://github.com/PrismJS/prism/issues/1000) [[`f89b0b9`](https://github.com/PrismJS/prism/commit/f89b0b9)]
* __WPD__:
	* Fix at-rule detection + don't process if language is not handled [[`2626728`](https://github.com/PrismJS/prism/commit/2626728)]

### Other changes

* Improvement to greedy-flag ([#967](https://github.com/PrismJS/prism/issues/967)) [[`500121b`](https://github.com/PrismJS/prism/commit/500121b), [`9893489`](https://github.com/PrismJS/prism/commit/9893489)]
* Add setTimeout fallback for requestAnimationFrame. Fixes [#987](https://github.com/PrismJS/prism/issues/987). ([#988](https://github.com/PrismJS/prism/issues/988)) [[`c9bdcd3`](https://github.com/PrismJS/prism/commit/c9bdcd3)]
* Added aria-hidden attributes on elements created by the Line Highlight and Line Numbers plugins. Fixes [#574](https://github.com/PrismJS/prism/issues/574). [[`e5587a7`](https://github.com/PrismJS/prism/commit/e5587a7)]
* Don't insert space before ">" when there is no attributes [[`3dc8c9e`](https://github.com/PrismJS/prism/commit/3dc8c9e)]
* Added missing hooks-related tests for AsciiDoc, Groovy, Handlebars, Markup, PHP and Smarty [[`c1a0c1b`](https://github.com/PrismJS/prism/commit/c1a0c1b)]
* Fix issue when using Line numbers plugin and Normalise whitespace plugin together with Handlebars, PHP or Smarty. Fix [#1018](https://github.com/PrismJS/prism/issues/1018), [#997](https://github.com/PrismJS/prism/issues/997), [#935](https://github.com/PrismJS/prism/issues/935). Revert [#998](https://github.com/PrismJS/prism/issues/998). [[`86aa3d2`](https://github.com/PrismJS/prism/commit/86aa3d2)]
* Optimized logo ([#990](https://github.com/PrismJS/prism/issues/990)) ([#1002](https://github.com/PrismJS/prism/issues/1002)) [[`f69e570`](https://github.com/PrismJS/prism/commit/f69e570), [`218fd25`](https://github.com/PrismJS/prism/commit/218fd25)]
* Remove unneeded prefixed CSS ([#989](https://github.com/PrismJS/prism/issues/989)) [[`5e56833`](https://github.com/PrismJS/prism/commit/5e56833)]
* Optimize images ([#1007](https://github.com/PrismJS/prism/issues/1007)) [[`b2fa6d5`](https://github.com/PrismJS/prism/commit/b2fa6d5)]
* Add yarn.lock to .gitignore ([#1035](https://github.com/PrismJS/prism/issues/1035)) [[`03ecf74`](https://github.com/PrismJS/prism/commit/03ecf74)]
* Fix greedy flag bug. Fixes [#1039](https://github.com/PrismJS/prism/issues/1039) [[`32cd99f`](https://github.com/PrismJS/prism/commit/32cd99f)]
* Ruby: Fix test after [#1023](https://github.com/PrismJS/prism/issues/1023) [[`b15d43b`](https://github.com/PrismJS/prism/commit/b15d43b)]
* Ini: Fix test after [#1047](https://github.com/PrismJS/prism/issues/1047) [[`25cdd3f`](https://github.com/PrismJS/prism/commit/25cdd3f)]
* Reduce risk of XSS ([#1051](https://github.com/PrismJS/prism/issues/1051)) [[`17e33bc`](https://github.com/PrismJS/prism/commit/17e33bc)]
* env.code can be modified by before-sanity-check hook even when using language-none. Fix [#1066](https://github.com/PrismJS/prism/issues/1066) [[`83bafbd`](https://github.com/PrismJS/prism/commit/83bafbd)]


## 1.5.1 (2016-06-05)

### Updated components

* __Normalize Whitespace__:
	* Add class that disables the normalize whitespace plugin [[`9385c54`](https://github.com/PrismJS/prism/commit/9385c54)]
* __JavaScript Language__:
	* Rearrange the `string` and `template-string` token in JavaScript [[`1158e46`](https://github.com/PrismJS/prism/commit/1158e46)]
* __SQL Language__:
	* add delimeter and delimeters keywords to sql ([#958](https://github.com/PrismJS/prism/pull/958)) [[`a9ef24e`](https://github.com/PrismJS/prism/commit/a9ef24e)]
	* add AUTO_INCREMENT and DATE keywords to sql ([#954](https://github.com/PrismJS/prism/pull/954)) [[`caea2af`](https://github.com/PrismJS/prism/commit/caea2af)]
* __Diff Language__:
	* Highlight diff lines with only + or - ([#952](https://github.com/PrismJS/prism/pull/952)) [[`4d0526f`](https://github.com/PrismJS/prism/commit/4d0526f)]

### Other changes

* Allow for asynchronous loading of prism.js ([#959](https://github.com/PrismJS/prism/pull/959))
* Use toLowerCase on language names ([#957](https://github.com/PrismJS/prism/pull/957)) [[`acd9508`](https://github.com/PrismJS/prism/commit/acd9508)]
* link to index for basic usage - fixes [#945](https://github.com/PrismJS/prism/issues/945) ([#946](https://github.com/PrismJS/prism/pull/946)) [[`6c772d8`](https://github.com/PrismJS/prism/commit/6c772d8)]
* Fixed monospace typo ([#953](https://github.com/PrismJS/prism/pull/953)) [[`e6c3498`](https://github.com/PrismJS/prism/commit/e6c3498)]

## 1.5.0 (2016-05-01)

### New components

* __Bro Language__ ([#925](https://github.com/PrismJS/prism/pull/925))
* __Protocol Buffers Language__ ([#938](https://github.com/PrismJS/prism/pull/938)) [[`ae4a4f2`](https://github.com/PrismJS/prism/commit/ae4a4f2)]

### Updated components

* __Keep Markup__:
	* Fix Keep Markup plugin incorrect highlighting ([#880](https://github.com/PrismJS/prism/pull/880)) [[`24841ef`](https://github.com/PrismJS/prism/commit/24841ef)]
* __Groovy Language__:
	* Fix double HTML-encoding bug in Groovy language [[`24a0936`](https://github.com/PrismJS/prism/commit/24a0936)]
* __Java Language__:
	* Adding annotation token for Java ([#905](https://github.com/PrismJS/prism/pull/905)) [[`367ace6`](https://github.com/PrismJS/prism/commit/367ace6)]
* __SAS Language__:
	* Add missing keywords for SAS ([#922](https://github.com/PrismJS/prism/pull/922))
* __YAML Language__:
	* fix hilighting of YAML keys on first line of code block ([#943](https://github.com/PrismJS/prism/pull/943)) [[`f19db81`](https://github.com/PrismJS/prism/commit/f19db81)]
* __C# Language__:
	* Support for generic methods in csharp [[`6f75735`](https://github.com/PrismJS/prism/commit/6f75735)]

### New plugins

* __Unescaped Markup__ [[`07d77e5`](https://github.com/PrismJS/prism/commit/07d77e5)]
* __Normalize Whitespace__ ([#847](https://github.com/PrismJS/prism/pull/847)) [[`e86ec01`](https://github.com/PrismJS/prism/commit/e86ec01)]

### Other changes

* Add JSPM support [[`ad048ab`](https://github.com/PrismJS/prism/commit/ad048ab)]
* update linear-gradient syntax from `left` to `to right` [[`cd234dc`](https://github.com/PrismJS/prism/commit/cd234dc)]
* Add after-property to allow ordering of plugins [[`224b7a1`](https://github.com/PrismJS/prism/commit/224b7a1)]
* Partial solution for the "Comment-like substrings"-problem [[`2705c50`](https://github.com/PrismJS/prism/commit/2705c50)]
* Add property 'aliasTitles' to components.js [[`54400fb`](https://github.com/PrismJS/prism/commit/54400fb)]
* Add before-highlightall hook [[`70a8602`](https://github.com/PrismJS/prism/commit/70a8602)]
* Fix catastrophic backtracking regex issues in JavaScript [[`ab65be2`](https://github.com/PrismJS/prism/commit/ab65be2)]

## 1.4.1 (2016-02-03)

### Other changes

* Fix DFS bug in Prism core [[`b86c727`](https://github.com/PrismJS/prism/commit/b86c727)]

## 1.4.0 (2016-02-03)

### New components

* __Solarized Light__ ([#855](https://github.com/PrismJS/prism/pull/855)) [[`70846ba`](https://github.com/PrismJS/prism/commit/70846ba)]
* __JSON__ ([#370](https://github.com/PrismJS/prism/pull/370)) [[`ad2fcd0`](https://github.com/PrismJS/prism/commit/ad2fcd0)]

### Updated components

* __Show Language__:
	* Remove data-language attribute ([#840](https://github.com/PrismJS/prism/pull/840)) [[`eb9a83c`](https://github.com/PrismJS/prism/commit/eb9a83c)]
	* Allow custom label without a language mapping ([#837](https://github.com/PrismJS/prism/pull/837)) [[`7e74aef`](https://github.com/PrismJS/prism/commit/7e74aef)]
* __JSX__:
	* Better Nesting in JSX attributes ([#842](https://github.com/PrismJS/prism/pull/842)) [[`971dda7`](https://github.com/PrismJS/prism/commit/971dda7)]
* __File Highlight__:
	* Defer File Highlight until the full DOM has loaded. ([#844](https://github.com/PrismJS/prism/pull/844)) [[`6f995ef`](https://github.com/PrismJS/prism/commit/6f995ef)]
* __Coy Theme__:
	* Fix coy theme shadows ([#865](https://github.com/PrismJS/prism/pull/865)) [[`58d2337`](https://github.com/PrismJS/prism/commit/58d2337)]
* __Show Invisibles__:
	* Ensure show-invisibles compat with autoloader ([#874](https://github.com/PrismJS/prism/pull/874)) [[`c3cfb1f`](https://github.com/PrismJS/prism/commit/c3cfb1f)]
	* Add support for the space character for the show-invisibles plugin ([#876](https://github.com/PrismJS/prism/pull/876)) [[`05442d3`](https://github.com/PrismJS/prism/commit/05442d3)]

### New plugins

* __Command Line__ ([#831](https://github.com/PrismJS/prism/pull/831)) [[`8378906`](https://github.com/PrismJS/prism/commit/8378906)]

### Other changes

* Use document.currentScript instead of document.getElementsByTagName() [[`fa98743`](https://github.com/PrismJS/prism/commit/fa98743)]
* Add prefix for Firefox selection and move prefixed rule first [[`6d54717`](https://github.com/PrismJS/prism/commit/6d54717)]
* No background for `<code>` in `<pre>` [[`8c310bc`](https://github.com/PrismJS/prism/commit/8c310bc)]
* Fixing to initial copyright year [[`69cbf7a`](https://github.com/PrismJS/prism/commit/69cbf7a)]
* Simplify the “lang” regex [[`417f54a`](https://github.com/PrismJS/prism/commit/417f54a)]
* Fix broken heading links [[`a7f9e62`](https://github.com/PrismJS/prism/commit/a7f9e62)]
* Prevent infinite recursion in DFS [[`02894e1`](https://github.com/PrismJS/prism/commit/02894e1)]
* Fix incorrect page title [[`544b56f`](https://github.com/PrismJS/prism/commit/544b56f)]
* Link scss to webplatform wiki [[`08d979a`](https://github.com/PrismJS/prism/commit/08d979a)]
* Revert white-space to normal when code is inline instead of in a pre [[`1a971b5`](https://github.com/PrismJS/prism/commit/1a971b5)]

## 1.3.0 (2015-10-26)

### New components

* __AsciiDoc__ ([#800](https://github.com/PrismJS/prism/issues/800)) [[`6803ca0`](https://github.com/PrismJS/prism/commit/6803ca0)]
* __Haxe__ ([#811](https://github.com/PrismJS/prism/issues/811)) [[`bd44341`](https://github.com/PrismJS/prism/commit/bd44341)]
* __Icon__ ([#803](https://github.com/PrismJS/prism/issues/803)) [[`b43c5f3`](https://github.com/PrismJS/prism/commit/b43c5f3)]
* __Kotlin__ ([#814](https://github.com/PrismJS/prism/issues/814)) [[`e8a31a5`](https://github.com/PrismJS/prism/commit/e8a31a5)]
* __Lua__ ([#804](https://github.com/PrismJS/prism/issues/804)) [[`a36bc4a`](https://github.com/PrismJS/prism/commit/a36bc4a)]
* __Nix__ ([#795](https://github.com/PrismJS/prism/issues/795)) [[`9b275c8`](https://github.com/PrismJS/prism/commit/9b275c8)]
* __Oz__ ([#805](https://github.com/PrismJS/prism/issues/805)) [[`388c53f`](https://github.com/PrismJS/prism/commit/388c53f)]
* __PARI/GP__ ([#802](https://github.com/PrismJS/prism/issues/802)) [[`253c035`](https://github.com/PrismJS/prism/commit/253c035)]
* __Parser__ ([#808](https://github.com/PrismJS/prism/issues/808)) [[`a953b3a`](https://github.com/PrismJS/prism/commit/a953b3a)]
* __Puppet__ ([#813](https://github.com/PrismJS/prism/issues/813)) [[`81933ee`](https://github.com/PrismJS/prism/commit/81933ee)]
* __Roboconf__ ([#812](https://github.com/PrismJS/prism/issues/812)) [[`f5db346`](https://github.com/PrismJS/prism/commit/f5db346)]

### Updated components

* __C__:
	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
* __C#__:
	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
	* Fix detection of float numbers ([#806](https://github.com/PrismJS/prism/issues/806)) [[`1dae72b`](https://github.com/PrismJS/prism/commit/1dae72b)]
* __F#__:
	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
* __JavaScript__:
	* Highlight true and false as booleans ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
* __Python__:
	* Highlight triple-quoted strings before comments. Fix [#815](https://github.com/PrismJS/prism/issues/815) [[`90fbf0b`](https://github.com/PrismJS/prism/commit/90fbf0b)]

### New plugins

* __Previewer: Time__ ([#790](https://github.com/PrismJS/prism/issues/790)) [[`88173de`](https://github.com/PrismJS/prism/commit/88173de)]
* __Previewer: Angle__ ([#791](https://github.com/PrismJS/prism/issues/791)) [[`a434c86`](https://github.com/PrismJS/prism/commit/a434c86)]

### Other changes

* Increase mocha's timeout [[`f1c41db`](https://github.com/PrismJS/prism/commit/f1c41db)]
* Prevent most errors in IE8. Fix [#9](https://github.com/PrismJS/prism/issues/9) [[`9652d75`](https://github.com/PrismJS/prism/commit/9652d75)]
* Add U.S. Web Design Standards on homepage. Fix [#785](https://github.com/PrismJS/prism/issues/785) [[`e10d48b`](https://github.com/PrismJS/prism/commit/e10d48b), [`79ebbf8`](https://github.com/PrismJS/prism/commit/79ebbf8), [`2f7088d`](https://github.com/PrismJS/prism/commit/2f7088d)]
* Added gulp task to autolink PRs and commits in changelog [[`5ec4e4d`](https://github.com/PrismJS/prism/commit/5ec4e4d)]
* Use child processes to run each set of tests, in order to deal with the memory leak in vm.runInNewContext() [[`9a4b6fa`](https://github.com/PrismJS/prism/commit/9a4b6fa)]

## 1.2.0 (2015-10-07)

### New components

* __Batch__ ([#781](https://github.com/PrismJS/prism/issues/781)) [[`eab5b06`](https://github.com/PrismJS/prism/commit/eab5b06)]

### Updated components

* __ASP.NET__:
	* Simplified pattern for `<script>` [[`29643f4`](https://github.com/PrismJS/prism/issues/29643f4)]
* __Bash__:
	* Fix regression in strings ([#792](https://github.com/PrismJS/prism/issues/792)) [[`bd275c2`](https://github.com/PrismJS/prism/commit/bd275c2)]
	* Substantially reduce wrongly highlighted stuff ([#793](https://github.com/PrismJS/prism/issues/793)) [[`ac6fe2e`](https://github.com/PrismJS/prism/commit/ac6fe2e)]
* __CSS__:
	* Simplified pattern for `<style>` [[`29643f4`](https://github.com/PrismJS/prism/issues/29643f4)]
* __JavaScript__:
	* Simplified pattern for `<script>` [[`29643f4`](https://github.com/PrismJS/prism/issues/29643f4)]

### New plugins

* __Previewer: Gradient__ ([#783](https://github.com/PrismJS/prism/issues/783)) [[`9a63483`](https://github.com/PrismJS/prism/commit/9a63483)]

### Updated plugins

* __Previewer: Color__
	* Add support for Sass variables [[`3a1fb04`](https://github.com/PrismJS/prism/commit/3a1fb04)]

* __Previewer: Easing__
	* Add support for Sass variables [[`7c7ab4e`](https://github.com/PrismJS/prism/commit/7c7ab4e)]

### Other changes

* Test runner: Allow to run tests for only some languages [[`5ade8a5`](https://github.com/PrismJS/prism/issues/5ade8a5)]
* Download page: Fixed wrong components order raising error in generated file ([#797](https://github.com/PrismJS/prism/issues/787)) [[`7a6aed8`](https://github.com/PrismJS/prism/commit/7a6aed8)]

## 1.1.0 (2015-10-04)

### New components

* __ABAP__ ([#636](https://github.com/PrismJS/prism/issues/636)) [[`75b0328`](https://github.com/PrismJS/prism/commit/75b0328), [`0749129`](https://github.com/PrismJS/prism/commit/0749129)]
* __APL__ ([#308](https://github.com/PrismJS/prism/issues/308)) [[`1f45942`](https://github.com/PrismJS/prism/commit/1f45942), [`33a295f`](https://github.com/PrismJS/prism/commit/33a295f)]
* __AutoIt__ ([#771](https://github.com/PrismJS/prism/issues/771)) [[`211a41c`](https://github.com/PrismJS/prism/commit/211a41c)]
* __BASIC__ ([#620](https://github.com/PrismJS/prism/issues/620)) [[`805a0ce`](https://github.com/PrismJS/prism/commit/805a0ce)]
* __Bison__ ([#764](https://github.com/PrismJS/prism/issues/764)) [[`7feb135`](https://github.com/PrismJS/prism/commit/7feb135)]
* __Crystal__ ([#780](https://github.com/PrismJS/prism/issues/780)) [[`5b473de`](https://github.com/PrismJS/prism/commit/5b473de), [`414848d`](https://github.com/PrismJS/prism/commit/414848d)]
* __D__ ([#613](https://github.com/PrismJS/prism/issues/613)) [[`b5e741c`](https://github.com/PrismJS/prism/commit/b5e741c)]
* __Diff__ ([#450](https://github.com/PrismJS/prism/issues/450)) [[`ef41c74`](https://github.com/PrismJS/prism/commit/ef41c74)]
* __Docker__ ([#576](https://github.com/PrismJS/prism/issues/576)) [[`e808352`](https://github.com/PrismJS/prism/commit/e808352)]
* __Elixir__ ([#614](https://github.com/PrismJS/prism/issues/614)) [[`a1c028c`](https://github.com/PrismJS/prism/commit/a1c028c), [`c451611`](https://github.com/PrismJS/prism/commit/c451611), [`2e637f0`](https://github.com/PrismJS/prism/commit/2e637f0), [`ccb6566`](https://github.com/PrismJS/prism/commit/ccb6566)]
* __GLSL__ ([#615](https://github.com/PrismJS/prism/issues/615)) [[`247da05`](https://github.com/PrismJS/prism/commit/247da05)]
* __Inform 7__ ([#616](https://github.com/PrismJS/prism/issues/616)) [[`d2595b4`](https://github.com/PrismJS/prism/commit/d2595b4)]
* __J__ ([#623](https://github.com/PrismJS/prism/issues/623)) [[`0cc50b2`](https://github.com/PrismJS/prism/commit/0cc50b2)]
* __MEL__ ([#618](https://github.com/PrismJS/prism/issues/618)) [[`8496c14`](https://github.com/PrismJS/prism/commit/8496c14)]
* __Mizar__ ([#619](https://github.com/PrismJS/prism/issues/619)) [[`efde61d`](https://github.com/PrismJS/prism/commit/efde61d)]
* __Monkey__ ([#621](https://github.com/PrismJS/prism/issues/621)) [[`fdd4a3c`](https://github.com/PrismJS/prism/commit/fdd4a3c)]
* __nginx__ ([#776](https://github.com/PrismJS/prism/issues/776)) [[`dc4fc19`](https://github.com/PrismJS/prism/commit/dc4fc19), [`e62c88e`](https://github.com/PrismJS/prism/commit/e62c88e)]
* __Nim__ ([#622](https://github.com/PrismJS/prism/issues/622)) [[`af9c49a`](https://github.com/PrismJS/prism/commit/af9c49a)]
* __OCaml__ ([#628](https://github.com/PrismJS/prism/issues/628)) [[`556c04d`](https://github.com/PrismJS/prism/commit/556c04d)]
* __Processing__ ([#629](https://github.com/PrismJS/prism/issues/629)) [[`e47087b`](https://github.com/PrismJS/prism/commit/e47087b)]
* __Prolog__ ([#630](https://github.com/PrismJS/prism/issues/630)) [[`dd04c32`](https://github.com/PrismJS/prism/commit/dd04c32)]
* __Pure__ ([#626](https://github.com/PrismJS/prism/issues/626)) [[`9c276ab`](https://github.com/PrismJS/prism/commit/9c276ab)]
* __Q__ ([#624](https://github.com/PrismJS/prism/issues/624)) [[`c053c9e`](https://github.com/PrismJS/prism/commit/c053c9e)]
* __Qore__ [[`125e91f`](https://github.com/PrismJS/prism/commit/125e91f)]
* __Tcl__ [[`a3e751a`](https://github.com/PrismJS/prism/commit/a3e751a), [`11ff829`](https://github.com/PrismJS/prism/commit/11ff829)]
* __Textile__ ([#544](https://github.com/PrismJS/prism/issues/544)) [[`d0c6764`](https://github.com/PrismJS/prism/commit/d0c6764)]
* __Verilog__ ([#640](https://github.com/PrismJS/prism/issues/640)) [[`44a11c2`](https://github.com/PrismJS/prism/commit/44a11c2), [`795eb99`](https://github.com/PrismJS/prism/commit/795eb99)]
* __Vim__ [[`69ea994`](https://github.com/PrismJS/prism/commit/69ea994)]

### Updated components

* __Bash__:
	* Add support for Here-Documents ([#787](https://github.com/PrismJS/prism/issues/787)) [[`b57a096`](https://github.com/PrismJS/prism/commit/b57a096)]
	* Remove C-like dependency ([#789](https://github.com/PrismJS/prism/issues/789)) [[`1ab4619`](https://github.com/PrismJS/prism/commit/1ab4619)]
* __C__:
	* Fixed numbers [[`4d64d07`](https://github.com/PrismJS/prism/commit/4d64d07), [`071c3dd`](https://github.com/PrismJS/prism/commit/071c3dd)]
* __C-like__:
	* Add word boundary before class-name prefixes [[`aa757f6`](https://github.com/PrismJS/prism/commit/aa757f6)]
	* Improved operator regex + add != and !== [[`135ee9d`](https://github.com/PrismJS/prism/commit/135ee9d)]
	* Optimized string regexp [[`792e35c`](https://github.com/PrismJS/prism/commit/792e35c)]
* __F#__:
	* Fixed keywords containing exclamation mark [[`09f2005`](https://github.com/PrismJS/prism/commit/09f2005)]
	* Improved string pattern [[`0101c89`](https://github.com/PrismJS/prism/commit/0101c89)]
	* Insert preprocessor before keyword + don't allow line feeds before # [[`fdc9477`](https://github.com/PrismJS/prism/commit/fdc9477)]
	* Fixed numbers [[`0aa0791`](https://github.com/PrismJS/prism/commit/0aa0791)]
* __Gherkin__:
	* Don't allow spaces in tags [[`48ff8b7`](https://github.com/PrismJS/prism/commit/48ff8b7)]
	* Handle \r\n and \r + allow feature alone + don't match blank td/th [[`ce1ec3b`](https://github.com/PrismJS/prism/commit/ce1ec3b)]
* __Git__:
	* Added more examples ([#652](https://github.com/PrismJS/prism/issues/652)) [[`95dc102`](https://github.com/PrismJS/prism/commit/95dc102)]
	* Add support for unified diff. Fixes [#769](https://github.com/PrismJS/prism/issues/769), fixes [#357](https://github.com/PrismJS/prism/issues/357), closes [#401](https://github.com/PrismJS/prism/issues/401) [[`3aadd5d`](https://github.com/PrismJS/prism/commit/3aadd5d)]
* __Go__:
	* Improved operator regexp + removed punctuation from it [[`776ab90`](https://github.com/PrismJS/prism/commit/776ab90)]
* __Haml__:
	* Combine both multiline-comment regexps + handle \r\n and \r [[`f77b40b`](https://github.com/PrismJS/prism/commit/f77b40b)]
	* Handle \r\n and \r in filter regex [[`bbe68ac`](https://github.com/PrismJS/prism/commit/bbe68ac)]
* __Handlebars__:
	* Fix empty strings, add plus sign in exponential notation, improve block pattern and variable pattern [[`c477f9a`](https://github.com/PrismJS/prism/commit/c477f9a)]
	* Properly escape special replacement patterns ($) in Handlebars, PHP and Smarty. Fix [#772](https://github.com/PrismJS/prism/issues/772) [[`895bf46`](https://github.com/PrismJS/prism/commit/895bf46)]
* __Haskell__:
	* Removed useless backslashes and parentheses + handle \r\n and \r + simplify number regexp + fix operator regexp [[`1cc8d8e`](https://github.com/PrismJS/prism/commit/1cc8d8e)]
* __HTTP__:
	* Fix indentation + Add multiline flag for more flexibility + Fix response status + Handle \r\n and \r [[`aaa90f1`](https://github.com/PrismJS/prism/commit/aaa90f1)]
* __Ini__:
	* Fix some regexps + remove unused flags [[`53d5839`](https://github.com/PrismJS/prism/commit/53d5839)]
* __Jade__:
	* Add todo list + remove single-line comment pattern + simplified most patterns with m flag + handle \r\n and \r [[`a79e838`](https://github.com/PrismJS/prism/commit/a79e838)]
* __Java__:
	* Fix number regexp + simplified number regexp and optimized operator regexp [[`21e20b9`](https://github.com/PrismJS/prism/commit/21e20b9)]
* __JavaScript__:
	* JavaScript: Allow for all non-ASCII characters in function names. Fix [#400](https://github.com/PrismJS/prism/issues/400) [[`29e26dc`](https://github.com/PrismJS/prism/commit/29e26dc)]
* __JSX__:
	* Allow for one level of nesting in scripts (Fix [#717](https://github.com/PrismJS/prism/issues/717)) [[`90c75d5`](https://github.com/PrismJS/prism/commit/90c75d5)]
* __Julia__:
	* Simplify comment regexp + improved number regexp + improved operator regexp [[`bcac7d4`](https://github.com/PrismJS/prism/commit/bcac7d4)]
* __Keyman__:
	* Move header statements above keywords [[`23a444c`](https://github.com/PrismJS/prism/commit/23a444c)]
* __LaTeX__:
	* Simplify comment regexp [[`132b41a`](https://github.com/PrismJS/prism/commit/132b41a)]
	* Extend support [[`942a6ec`](https://github.com/PrismJS/prism/commit/942a6ec)]
* __Less__:
	* Remove useless part in property regexp [[`80d8260`](https://github.com/PrismJS/prism/commit/80d8260)]
* __LOLCODE__:
	* Removed useless parentheses [[`8147c9b`](https://github.com/PrismJS/prism/commit/8147c9b)]
* __Makefile__:
	* Add known failures in example [[`e0f8984`](https://github.com/PrismJS/prism/commit/e0f8984)]
	* Handle \r\n in comments and strings + fix "-include" keyword
* __Markup__:
	* Simplify patterns + handle \r\n and \r [[`4c551e8`](https://github.com/PrismJS/prism/commit/4c551e8)]
	* Don't allow = to appear in tag name [[`85d8a55`](https://github.com/PrismJS/prism/commit/85d8a55)]
	* Don't allow dot inside tag name [[`283691e`](https://github.com/PrismJS/prism/commit/283691e)]
* __MATLAB__:
	* Simplify string pattern to remove lookbehind [[`a3cbecc`](https://github.com/PrismJS/prism/commit/a3cbecc)]
* __NASM__:
	* Converted indents to tabs, removed uneeded escapes, added lookbehinds [[`a92e4bd`](https://github.com/PrismJS/prism/commit/a92e4bd)]
* __NSIS__:
	* Simplified patterns [[`bbd83d4`](https://github.com/PrismJS/prism/commit/bbd83d4)]
	* Fix operator regexp [[`44ad8dc`](https://github.com/PrismJS/prism/commit/44ad8dc)]
* __Objective-C__:
	* Simplified regexps + fix strings + handle \r [[`1d33147`](https://github.com/PrismJS/prism/commit/1d33147)]
	* Fix operator regexp [[`e9d382e`](https://github.com/PrismJS/prism/commit/e9d382e)]
* __Pascal__:
	* Simplified regexps [[`c03c8a4`](https://github.com/PrismJS/prism/commit/c03c8a4)]
* __Perl__:
	* Simplified regexps + Made most string and regexp patterns multi-line + Added support for regexp's n flag + Added missing operators [[`71b00cc`](https://github.com/PrismJS/prism/commit/71b00cc)]
* __PHP__:
	* Simplified patterns [[`f9d9452`](https://github.com/PrismJS/prism/commit/f9d9452)]
	* Properly escape special replacement patterns ($) in Handlebars, PHP and Smarty. Fix [#772](https://github.com/PrismJS/prism/issues/772) [[`895bf46`](https://github.com/PrismJS/prism/commit/895bf46)]
* __PHP Extras__:
	* Fix $this regexp + improve global regexp [[`781fdad`](https://github.com/PrismJS/prism/commit/781fdad)]
* __PowerShell__:
	* Update definitions for command/alias/operators [[`14da55c`](https://github.com/PrismJS/prism/commit/14da55c)]
* __Python__:
	* Added async/await and @ operator ([#656](https://github.com/PrismJS/prism/issues/656)) [[`7f1ae75`](https://github.com/PrismJS/prism/commit/7f1ae75)]
	* Added 'self' keyword and support for class names ([#677](https://github.com/PrismJS/prism/issues/677)) [[`d9d4ab2`](https://github.com/PrismJS/prism/commit/d9d4ab2)]
	* Simplified regexps + don't capture where unneeded + fixed operators [[`530f5f0`](https://github.com/PrismJS/prism/commit/530f5f0)]
* __R__:
	* Fixed and simplified patterns [[`c20c3ec`](https://github.com/PrismJS/prism/commit/c20c3ec)]
* __reST__:
	* Simplified some patterns, fixed others, prevented blank comments to match, moved list-bullet down to prevent breaking quotes [[`e6c6b85`](https://github.com/PrismJS/prism/commit/e6c6b85)]
* __Rip__:
	* Fixed some regexp + moved down numbers [[`1093f7d`](https://github.com/PrismJS/prism/commit/1093f7d)]
* __Ruby__:
	* Code cleaning, handle \r\n and \r, fix some regexps [[`dd4989f`](https://github.com/PrismJS/prism/commit/dd4989f)]
	* Add % notations for strings and regexps. Fix [#590](https://github.com/PrismJS/prism/issues/590) [[`2d37800`](https://github.com/PrismJS/prism/commit/2d37800)]
* __Rust__:
	* Simplified patterns and fixed operators [[`6c8494f`](https://github.com/PrismJS/prism/commit/6c8494f)]
* __SAS__:
	* Simplified datalines and optimized operator patterns [[`6ebb96f`](https://github.com/PrismJS/prism/commit/6ebb96f)]
* __Sass__:
	* Add missing require in components [[`35b8c50`](https://github.com/PrismJS/prism/commit/35b8c50)]
	* Fix comments, operators and selectors and simplified patterns [[`28759d0`](https://github.com/PrismJS/prism/commit/28759d0)]
	* Highlight "-" as operator only if surrounded by spaces, in order to not break hyphenated values (e.g. "ease-in-out") [[`b2763e7`](https://github.com/PrismJS/prism/commit/b2763e7)]
* __Scala__:
	* Simplified patterns [[`daf2597`](https://github.com/PrismJS/prism/commit/daf2597)]
* __Scheme__:
	* Add missing lookbehind on number pattern. Fix [#702](https://github.com/PrismJS/prism/issues/702) [[`3120ff7`](https://github.com/PrismJS/prism/commit/3120ff7)]
	* Fixes and simplifications [[`068704a`](https://github.com/PrismJS/prism/commit/068704a)]
	* Don't match content of symbols starting with a parenthesis [[`fa7df08`](https://github.com/PrismJS/prism/commit/fa7df08)]
* __Scss__:
	* Simplified patterns + fixed operators + don't match empty selectors [[`672c167`](https://github.com/PrismJS/prism/commit/672c167)]
* __Smalltalk__:
	* Simplified patterns [[`d896622`](https://github.com/PrismJS/prism/commit/d896622)]
* __Smarty__:
	* Optimized regexps + fixed punctuation and operators [[`1446700`](https://github.com/PrismJS/prism/commit/1446700)]
	* Properly escape special replacement patterns ($) in Handlebars, PHP and Smarty. Fix [#772](https://github.com/PrismJS/prism/issues/772) [[`895bf46`](https://github.com/PrismJS/prism/commit/895bf46)]
* __SQL__:
	* Simplified regexp + fixed keywords and operators + add CHARSET keyword [[`d49fec0`](https://github.com/PrismJS/prism/commit/d49fec0)]
* __Stylus__:
	* Rewrote the component entirely [[`7729728`](https://github.com/PrismJS/prism/commit/7729728)]
* __Swift__:
	* Optimized keywords lists and removed duplicates [[`936e429`](https://github.com/PrismJS/prism/commit/936e429)]
	* Add support for string interpolation. Fix [#448](https://github.com/PrismJS/prism/issues/448) [[`89cd5d0`](https://github.com/PrismJS/prism/commit/89cd5d0)]
* __Twig__:
	* Prevent "other" pattern from matching blank strings [[`cae2cef`](https://github.com/PrismJS/prism/commit/cae2cef)]
	* Optimized regexps + fixed operators + added missing operators/keywords [[`2d8271f`](https://github.com/PrismJS/prism/commit/2d8271f)]
* __VHDL__:
	* Move operator overloading before strings, don't capture if not needed, handle \r\n and \r, fix numbers [[`4533f17`](https://github.com/PrismJS/prism/commit/4533f17)]
* __Wiki markup__:
	* Fixed emphasis + merged some url patterns + added TODOs [[`8cf9e6a`](https://github.com/PrismJS/prism/commit/8cf9e6a)]
* __YAML__:
	* Handled \r\n and \r, simplified some patterns, fixed "---" [[`9e33e0a`](https://github.com/PrismJS/prism/commit/9e33e0a)]

### New plugins

* __Autoloader__ ([#766](https://github.com/PrismJS/prism/issues/766)) [[`ed4ccfe`](https://github.com/PrismJS/prism/commit/ed4ccfe)]
* __JSONP Highlight__ [[`b2f14d9`](https://github.com/PrismJS/prism/commit/b2f14d9)]
* __Keep Markup__ ([#770](https://github.com/PrismJS/prism/issues/770)) [[`bd3e9ea`](https://github.com/PrismJS/prism/commit/bd3e9ea)]
* __Previewer: Base__ ([#767](https://github.com/PrismJS/prism/issues/767)) [[`cf764c0`](https://github.com/PrismJS/prism/commit/cf764c0)]
* __Previewer: Color__ ([#767](https://github.com/PrismJS/prism/issues/767)) [[`cf764c0`](https://github.com/PrismJS/prism/commit/cf764c0)]
* __Previewer: Easing__ ([#773](https://github.com/PrismJS/prism/issues/773)) [[`513137c`](https://github.com/PrismJS/prism/commit/513137c), [`9207258`](https://github.com/PrismJS/prism/commit/9207258), [`4303c94`](https://github.com/PrismJS/prism/commit/4303c94)]
* __Remove initial line feed__ [[`ed9f2b2`](https://github.com/PrismJS/prism/commit/ed9f2b2), [`b8d098e`](https://github.com/PrismJS/prism/commit/b8d098e)]

### Updated plugins

* __Autolinker__:
	* Don't process all grammars on load, process each one in before-highlight. Should fix [#760](https://github.com/PrismJS/prism/issues/760) [[`a572495`](https://github.com/PrismJS/prism/commit/a572495)]
* __Line Highlight__:
	* Run in `complete` hook [[`f237e67`](https://github.com/PrismJS/prism/commit/f237e67)]
	* Fixed position when font-size is odd ([#668](https://github.com/PrismJS/prism/issues/668)) [[`86bbd4c`](https://github.com/PrismJS/prism/commit/86bbd4c), [`8ed7ce3`](https://github.com/PrismJS/prism/commit/8ed7ce3)]
* __Line Numbers__:
	* Run in `complete` hook [[`3f4d918`](https://github.com/PrismJS/prism/commit/3f4d918)]
	* Don't run if already exists [[`c89bbdb`](https://github.com/PrismJS/prism/commit/c89bbdb)]
	* Don't run if block is empty. Fix [#669](https://github.com/PrismJS/prism/issues/669) [[`ee463e8`](https://github.com/PrismJS/prism/commit/ee463e8)]
	* Correct calculation for number of lines (fix [#385](https://github.com/PrismJS/prism/issues/385)) [[`14f3f80`](https://github.com/PrismJS/prism/commit/14f3f80)]
	* Fix computation of line numbers for single-line code blocks. Fix [#721](https://github.com/PrismJS/prism/issues/721) [[`02b220e`](https://github.com/PrismJS/prism/commit/02b220e)]
	* Fixing word wrap on long code lines [[`56b3d29`](https://github.com/PrismJS/prism/commit/56b3d29)]
	* Fixing coy theme + line numbers plugin overflowing on long blocks of text ([#762](https://github.com/PrismJS/prism/issues/762)) [[`a0127eb`](https://github.com/PrismJS/prism/commit/a0127eb)]
* __Show Language__:
	* Add gulp task to build languages map in Show language plugin (Fix [#671](https://github.com/PrismJS/prism/issues/671)) [[`39bd827`](https://github.com/PrismJS/prism/commit/39bd827)]
	* Add reset styles to prevent bug in Coy theme ([#703](https://github.com/PrismJS/prism/issues/703)) [[`08dd500`](https://github.com/PrismJS/prism/commit/08dd500)]

### Other changes

* Fixed link to David Peach article ([#647](https://github.com/PrismJS/prism/issues/647)) [[`3f679f8`](https://github.com/PrismJS/prism/commit/3f679f8)]
* Added `complete` hook, which runs even when no grammar is found [[`e58b6c0`](https://github.com/PrismJS/prism/commit/e58b6c0), [`fd54995`](https://github.com/PrismJS/prism/commit/fd54995)]
* Added test suite runner ([#588](https://github.com/PrismJS/prism/issues/588)) [[`956cd85`](https://github.com/PrismJS/prism/commit/956cd85)]
* Added tests for every components
* Added `.gitattributes` to prevent line ending changes in test files [[`45ca8c8`](https://github.com/PrismJS/prism/commit/45ca8c8)]
* Split plugins into 3 columns on Download page [[`a88936a`](https://github.com/PrismJS/prism/commit/a88936a)]
* Removed comment in components.js to make it easier to parse as JSON ([#679](https://github.com/PrismJS/prism/issues/679)) [[`2cb1326`](https://github.com/PrismJS/prism/commit/2cb1326)]
* Updated README.md [[`1388256`](https://github.com/PrismJS/prism/commit/1388256)]
* Updated documentation since the example was not relevant any more [[`80aedb2`](https://github.com/PrismJS/prism/commit/80aedb2)]
* Fixed inline style for Coy theme [[`52829b3`](https://github.com/PrismJS/prism/commit/52829b3)]
* Prevent errors in nodeJS ([#754](https://github.com/PrismJS/prism/issues/754)) [[`9f5c93c`](https://github.com/PrismJS/prism/commit/9f5c93c), [`0356c58`](https://github.com/PrismJS/prism/commit/0356c58)]
* Explicitly make the Worker close itself after highlighting, so that users have control on this behaviour when directly using Prism inside a Worker. Fix [#492](https://github.com/PrismJS/prism/issues/492) [[`e42a228`](https://github.com/PrismJS/prism/commit/e42a228)]
* Added some language aliases: js for javascript, xml, html, mathml and svg for markup [[`2f9fe1e`](https://github.com/PrismJS/prism/commit/2f9fe1e)]
* Download page: Add a "Select all" checkbox ([#561](https://github.com/PrismJS/prism/issues/561)) [[`9a9020b`](https://github.com/PrismJS/prism/commit/9a9020b)]
* Download page: Don't add semicolon unless needed in generated code. Fix [#273](https://github.com/PrismJS/prism/issues/273) [[`5a5eec5`](https://github.com/PrismJS/prism/commit/5a5eec5)]
* Add language counter on homepage [[`889cda5`](https://github.com/PrismJS/prism/commit/889cda5)]
* Improve performance by doing more work in the worker [[`1316abc`](https://github.com/PrismJS/prism/commit/1316abc)]
* Replace Typeplate with SitePoint on homepage. Fix [#774](https://github.com/PrismJS/prism/issues/774) [[`0c54308`](https://github.com/PrismJS/prism/commit/0c54308)]
* Added basic `.editorconfig` [[`c48f55d`](https://github.com/PrismJS/prism/commit/c48f55d)]

---

## 1.0.1 (2015-07-26)

### New components

* __Brainfuck__ ([#611](https://github.com/PrismJS/prism/issues/611)) [[`3ede718`](https://github.com/PrismJS/prism/commit/3ede718)]
* __Keyman__ ([#609](https://github.com/PrismJS/prism/issues/609)) [[`2698f82`](https://github.com/PrismJS/prism/commit/2698f82), [`e9936c6`](https://github.com/PrismJS/prism/commit/e9936c6)]
* __Makefile__ ([#610](https://github.com/PrismJS/prism/issues/610)) [[`3baa61c`](https://github.com/PrismJS/prism/commit/3baa61c)]
* __Sass (Sass)__ (fix [#199](https://github.com/PrismJS/prism/issues/199)) [[`b081804`](https://github.com/PrismJS/prism/commit/b081804)]
* __VHDL__ ([#595](https://github.com/PrismJS/prism/issues/595)) [[`43e6157`](https://github.com/PrismJS/prism/commit/43e6157)]

### Updated components

* __ActionScript__:
	* Fix ! operator and add ++ and -- as whole operators [[`6bf0794`](https://github.com/PrismJS/prism/commit/6bf0794)]
	* Fix XML highlighting [[ `90257b0`](https://github.com/PrismJS/prism/commit/90257b0)]
	* Update examples to add inline XML [[`2c1626a`](https://github.com/PrismJS/prism/commit/2c1626a), [`3987711`](https://github.com/PrismJS/prism/commit/3987711)]
* __Apache Configuration__:
	* Don't include the spaces in directive-inline [[`e87efd8`](https://github.com/PrismJS/prism/commit/e87efd8)]
* __AppleScript__:
	* Allow one level of nesting in block comments [[`65894c5`](https://github.com/PrismJS/prism/commit/65894c5)]
	* Removed duplicates between operators and keywords [[`1ec5a81`](https://github.com/PrismJS/prism/commit/1ec5a81)]
	* Removed duplicates between keywords and classes [[`e8d09f6`](https://github.com/PrismJS/prism/commit/e8d09f6)]
	* Move numbers up so they are not broken by operator pattern [[`66dac31`](https://github.com/PrismJS/prism/commit/66dac31)]
* __ASP.NET__:
	* Prevent Markup tags from breaking ASP tags + fix MasterType directive [[`1f0a336`](https://github.com/PrismJS/prism/commit/1f0a336)]
* __AutoHotkey__:
	* Allow tags (labels) to be highlighted at the end of the code [[`0a1fc4b`](https://github.com/PrismJS/prism/commit/0a1fc4b)]
	* Match all operators + add comma to punctuation [[`f0ccb1b`](https://github.com/PrismJS/prism/commit/f0ccb1b)]
	* Removed duplicates in keywords lists [[`fe0a068`](https://github.com/PrismJS/prism/commit/fe0a068)]
* __Bash__:
	* Simplify comment regex [[`2700981`](https://github.com/PrismJS/prism/commit/2700981)]
	* Removed duplicates in keywords + removed unneeded parentheses [[`903b8a4`](https://github.com/PrismJS/prism/commit/903b8a4)]
* __C__:
	* Removed string pattern (inherited from C-like) [[`dcce1a7`](https://github.com/PrismJS/prism/commit/dcce1a7)]
	* Better support for macro statements [[`4868635`](https://github.com/PrismJS/prism/commit/4868635)]
* __C#__:
	* Fix preprocessor pattern [[`86311f5`](https://github.com/PrismJS/prism/commit/86311f5)]
* __C++__:
	* Removed delete[] and new[] broken keywords [[`42fbeef`](https://github.com/PrismJS/prism/commit/42fbeef)]
* __C-like__:
	* Removed unused 'ignore' pattern [[`b6535dd`](https://github.com/PrismJS/prism/commit/b6535dd)]
	* Use look-ahead instead of inside to match functions [[`d4194c9`](https://github.com/PrismJS/prism/commit/d4194c9)]
* __CoffeeScript__:
	* Prevent strings from ending with a backslash [[`cb6b824`](https://github.com/PrismJS/prism/commit/cb6b824)]
* __CSS__:
	* Highlight parentheses as punctuation [[`cd0273e`](https://github.com/PrismJS/prism/commit/cd0273e)]
	* Improved highlighting of at-rules [[`e254088`](https://github.com/PrismJS/prism/commit/e254088)]
	* Improved URL and strings [[`901812c`](https://github.com/PrismJS/prism/commit/901812c)]
	* Selector regexp should not include last spaces before brace [[`f2e2718`](https://github.com/PrismJS/prism/commit/f2e2718)]
	* Handle \r\n [[`15760e1`](https://github.com/PrismJS/prism/commit/15760e1)]
* __Eiffel__:
	* Fix string patterns order + fix /= operator [[`7d1b8d7`](https://github.com/PrismJS/prism/commit/7d1b8d7)]
* __Erlang__:
	* Fixed quoted functions, quoted atoms, variables and <= operator [[`fa286aa`](https://github.com/PrismJS/prism/commit/fa286aa)]
* __Fortran__:
	* Improved pattern for comments inside strings [[`40ae215`](https://github.com/PrismJS/prism/commit/40ae215)]
	* Fixed order in keyword pattern [[`8a6d32d`](https://github.com/PrismJS/prism/commit/8a6d32d)]
* __Handlebars__:
	* Support blocks with dashes ([#587](https://github.com/PrismJS/prism/issues/587)) [[`f409b13`](https://github.com/PrismJS/prism/commit/f409b13)]
* __JavaScript__:
	* Added support for 'y' and 'u' ES6 JavaScript regex flags ([#596](https://github.com/PrismJS/prism/issues/596)) [[`5d99957`](https://github.com/PrismJS/prism/commit/5d99957)]
	* Added support for missing ES6 keywords in JavaScript ([#596](https://github.com/PrismJS/prism/issues/596)) [[`ca68b87`](https://github.com/PrismJS/prism/commit/ca68b87)]
	* Added `async` and `await` keywords ([#575](https://github.com/PrismJS/prism/issues/575)) [[`5458cec`](https://github.com/PrismJS/prism/commit/5458cec)]
	* Added support for Template strings + interpolation [[`04f72b1`](https://github.com/PrismJS/prism/commit/04f72b1)]
	* Added support for octal and binary numbers ([#597](https://github.com/PrismJS/prism/issues/597)) [[`a8aa058`](https://github.com/PrismJS/prism/commit/a8aa058)]
	* Improve regex performance of C-like strings and JS regexps [[`476cbf4`](https://github.com/PrismJS/prism/commit/476cbf4)]
* __Markup__:
	* Allow non-ASCII chars in tag names and attributes (fix [#585](https://github.com/PrismJS/prism/issues/585)) [[`52fd55e`](https://github.com/PrismJS/prism/commit/52fd55e)]
	* Optimized tag's regexp so that it stops crashing on large unclosed tags [[`75452ba`](https://github.com/PrismJS/prism/commit/75452ba)]
	* Highlight single quotes in attr-value as punctuation [[`1ebcb8e`](https://github.com/PrismJS/prism/commit/1ebcb8e)]
	* Doctype and prolog can be multi-line [[`c19a238`](https://github.com/PrismJS/prism/commit/c19a238)]
* __Python__:
	* Added highlighting for function declaration ([#601](https://github.com/PrismJS/prism/issues/601)) [[`a88aae8`](https://github.com/PrismJS/prism/commit/a88aae8)]
	* Fixed wrong highlighting of variables named a, b, c... f ([#601](https://github.com/PrismJS/prism/issues/601)) [[`a88aae8`](https://github.com/PrismJS/prism/commit/a88aae8)]
* __Ruby__:
	* Added support for string interpolation [[`c36b123`](https://github.com/PrismJS/prism/commit/c36b123)]
* __Scss__:
	* Fixed media queries highlighting [[`bf8e032`](https://github.com/PrismJS/prism/commit/bf8e032)]
	* Improved highlighting inside at-rules [[`eef4248`](https://github.com/PrismJS/prism/commit/eef4248)]
	* Match placeholders inside selectors (fix [#238](https://github.com/PrismJS/prism/issues/238)) [[`4e42e26`](https://github.com/PrismJS/prism/commit/4e42e26)]
* __Swift__:
	* Update keywords list (fix [#625](https://github.com/PrismJS/prism/issues/625)) [[`88f44a7`](https://github.com/PrismJS/prism/commit/88f44a7)]

### Updated plugins

* __File Highlight__:
	* Allow to specify the highlighting language. Fix [#607](https://github.com/PrismJS/prism/issues/607) [[`8030db9`](https://github.com/PrismJS/prism/commit/8030db9)]
* __Line Highlight__:
	* Fixed incorrect height in IE9 ([#604](https://github.com/PrismJS/prism/issues/604)) [[`f1705eb`](https://github.com/PrismJS/prism/commit/f1705eb)]
	* Prevent errors in IE8 [[`5f133c8`](https://github.com/PrismJS/prism/commit/5f133c8)]

### Other changes

* Removed moot `version` property from `bower.json` ([#594](https://github.com/PrismJS/prism/issues/594)) [[`4693499`](https://github.com/PrismJS/prism/commit/4693499)]
* Added repository to `bower.json` ([#600](https://github.com/PrismJS/prism/issues/600)) [[`8e5ebcc`](https://github.com/PrismJS/prism/commit/8e5ebcc)]
* Added `.DS_Store` to `.gitignore` [[`1707e4e`](https://github.com/PrismJS/prism/commit/1707e4e)]
* Improve test drive page usability. Fix [#591](https://github.com/PrismJS/prism/issues/591) [[`fe60858`](https://github.com/PrismJS/prism/commit/fe60858)]
* Fixed prism-core and prism-file-highlight to prevent errors in IE8 [[`5f133c8`](https://github.com/PrismJS/prism/commit/5f133c8)]
* Add Ubuntu Mono font to font stack [[`ed9d7e3`](https://github.com/PrismJS/prism/commit/ed9d7e3)]

---

## 1.0.0 (2015-05-23)

* First release
* Supported languages:
	* ActionScript
	* Apache Configuration
	* AppleScript
	* ASP.NET (C#)
	* AutoHotkey
	* Bash
	* C
	* C#
	* C++
	* C-like
	* CoffeeScript
	* CSS
	* CSS Extras
	* Dart
	* Eiffel
	* Erlang
	* F#
	* Fortran
	* Gherkin
	* Git
	* Go
	* Groovy
	* Haml
	* Handlebars
	* Haskell
	* HTTP
	* Ini
	* Jade
	* Java
	* JavaScript
	* Julia
	* LaTeX
	* Less
	* LOLCODE
	* Markdown
	* Markup
	* MATLAB
	* NASM
	* NSIS
	* Objective-C
	* Pascal
	* Perl
	* PHP
	* PHP Extras
	* PowerShell
	* Python
	* R
	* React JSX
	* reST
	* Rip
	* Ruby
	* Rust
	* SAS
	* Sass (Scss)
	* Scala
	* Scheme
	* Smalltalk
	* Smarty
	* SQL
	* Stylus
	* Swift
	* Twig
	* TypeScript
	* Wiki markup
	* YAML
* Plugins:
	* Autolinker
	* File Highlight
	* Highlight Keywords
	* Line Highlight
	* Line Numbers
	* Show Invisibles
	* Show Language
	* WebPlatform Docs
_ x3# [Prism](https://prismjs.com/)

[![Build Status](https://github.com/PrismJS/prism/workflows/CI/badge.svg)](https://github.com/PrismJS/prism/actions)
[![npm](https://img.shields.io/npm/dw/prismjs.svg)](https://www.npmjs.com/package/prismjs)

Prism is a lightweight, robust, and elegant syntax highlighting library. It's a spin-off project from [Dabblet](https://dabblet.com/).

You can learn more on [prismjs.com](https://prismjs.com/).

[Why another syntax highlighter?](https://lea.verou.me/2012/07/introducing-prism-an-awesome-new-syntax-highlighter/#more-1841)

[More themes for Prism!](https://github.com/PrismJS/prism-themes)

## Contribute to Prism!

### **Important Notice**

We are currently working on [Prism v2](https://github.com/PrismJS/prism/discussions/3531) and will only accept security-relevant PRs for the time being.

Once work on Prism v2 is sufficiently advanced, we will accept PRs again. This will be announced on our [Discussion](https://github.com/PrismJS/prism/discussions) page and mentioned in the [roadmap discussion](https://github.com/PrismJS/prism/discussions/3531).

<details>
<summary>Prism v1 contributing notes</summary>

Prism depends on community contributions to expand and cover a wider array of use cases. If you like it, consider giving back by sending a pull request. Here are a few tips:

- Read the [documentation](https://prismjs.com/extending.html). Prism was designed to be extensible.
- Do not edit `prism.js`, it’s just the version of Prism used by the Prism website and is built automatically. Limit your changes to the unminified files in the `components/` folder. `prism.js` and all minified files are generated by our build system (see below).
- Use `npm ci` to install Prism's dependencies. Do not use `npm install` because it will cause non-deterministic builds.
- The build system uses [gulp](https://github.com/gulpjs/gulp) to minify the files and build `prism.js`. With all of Prism's dependencies installed, you just need to run the command `npm run build`.
- Please follow the code conventions used in the files already. For example, I use [tabs for indentation and spaces for alignment](http://lea.verou.me/2012/01/why-tabs-are-clearly-superior/). Opening braces are on the same line, closing braces on their own line regardless of construct. There is a space before the opening brace. etc etc.
- Please try to err towards more smaller PRs rather than a few huge PRs. If a PR includes changes that I want to merge and also changes that I don't, handling it becomes difficult.
- My time is very limited these days, so it might take a long time to review bigger PRs (small ones are usually merged very quickly), especially those modifying the Prism Core. This doesn't mean your PR is rejected.
- If you contribute a new language definition, you will be responsible for handling bug reports about that language definition.
- If you [add a new language definition](https://prismjs.com/extending.html#creating-a-new-language-definition) or plugin, you need to add it to `components.json` as well and rebuild Prism by running `npm run build`, so that it becomes available to the download build page. For new languages, please also add a few [tests](https://prismjs.com/test-suite.html) and an example in the `examples/` folder.
- Go to [prism-themes](https://github.com/PrismJS/prism-themes) if you want to add a new theme.

Thank you so much for contributing!!

### Software requirements

Prism will run on [almost any browser](https://prismjs.com/#features-full) and Node.js version but you need the following software to contribute:

- Node.js >= 10.x
- npm >= 6.x

</details>

## Translations

* [简体中文](https://www.awesomes.cn/repo/PrismJS/prism) (if unavailable, see [here](https://deepmind.t-salon.cc/article/113))
`Ex# /*
	Access-Control-Allow-Origin: *
Vx[fvar components = {"core":{"meta":{"path":"components/prism-core.js","option":"mandatory"},"core":"Core"},"themes":{"meta":{"path":"themes/{id}.css","link":"index.html?theme={id}","exclusive":true},"prism":{"title":"Default","option":"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{"title":"Okaidia","owner":"ocodia"},"prism-twilight":{"title":"Twilight","owner":"remybach"},"prism-coy":{"title":"Coy","owner":"tshedor"},"prism-solarizedlight":{"title":"Solarized Light","owner":"hectormatos2011 "},"prism-tomorrow":{"title":"Tomorrow Night","owner":"Rosey"}},"languages":{"meta":{"path":"components/prism-{id}","noCSS":true,"examplesPath":"examples/prism-{id}","addCheckAll":true},"markup":{"title":"Markup","alias":["html","xml","svg","mathml","ssml","atom","rss"],"aliasTitles":{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","ssml":"SSML","atom":"Atom","rss":"RSS"},"option":"default"},"css":{"title":"CSS","option":"default","modify":"markup"},"clike":{"title":"C-like","option":"default"},"javascript":{"title":"JavaScript","require":"clike","modify":"markup","optional":"regex","alias":"js","option":"default"},"abap":{"title":"ABAP","owner":"dellagustin"},"abnf":{"title":"ABNF","owner":"RunDevelopment"},"actionscript":{"title":"ActionScript","require":"javascript","modify":"markup","owner":"Golmote"},"ada":{"title":"Ada","owner":"Lucretia"},"agda":{"title":"Agda","owner":"xy-ren"},"al":{"title":"AL","owner":"RunDevelopment"},"antlr4":{"title":"ANTLR4","alias":"g4","owner":"RunDevelopment"},"apacheconf":{"title":"Apache Configuration","owner":"GuiTeK"},"apex":{"title":"Apex","require":["clike","sql"],"owner":"RunDevelopment"},"apl":{"title":"APL","owner":"ngn"},"applescript":{"title":"AppleScript","owner":"Golmote"},"aql":{"title":"AQL","owner":"RunDevelopment"},"arduino":{"title":"Arduino","require":"cpp","alias":"ino","owner":"dkern"},"arff":{"title":"ARFF","owner":"Golmote"},"armasm":{"title":"ARM Assembly","alias":"arm-asm","owner":"RunDevelopment"},"arturo":{"title":"Arturo","alias":"art","optional":["bash","css","javascript","markup","markdown","sql"],"owner":"drkameleon"},"asciidoc":{"alias":"adoc","title":"AsciiDoc","owner":"Golmote"},"aspnet":{"title":"ASP.NET (C#)","require":["markup","csharp"],"owner":"nauzilus"},"asm6502":{"title":"6502 Assembly","owner":"kzurawel"},"asmatmel":{"title":"Atmel AVR Assembly","owner":"cerkit"},"autohotkey":{"title":"AutoHotkey","owner":"aviaryan"},"autoit":{"title":"AutoIt","owner":"Golmote"},"avisynth":{"title":"AviSynth","alias":"avs","owner":"Zinfidel"},"avro-idl":{"title":"Avro IDL","alias":"avdl","owner":"RunDevelopment"},"awk":{"title":"AWK","alias":"gawk","aliasTitles":{"gawk":"GAWK"},"owner":"RunDevelopment"},"bash":{"title":"Bash","alias":["sh","shell"],"aliasTitles":{"sh":"Shell","shell":"Shell"},"owner":"zeitgeist87"},"basic":{"title":"BASIC","owner":"Golmote"},"batch":{"title":"Batch","owner":"Golmote"},"bbcode":{"title":"BBcode","alias":"shortcode","aliasTitles":{"shortcode":"Shortcode"},"owner":"RunDevelopment"},"bbj":{"title":"BBj","owner":"hyyan"},"bicep":{"title":"Bicep","owner":"johnnyreilly"},"birb":{"title":"Birb","require":"clike","owner":"Calamity210"},"bison":{"title":"Bison","require":"c","owner":"Golmote"},"bnf":{"title":"BNF","alias":"rbnf","aliasTitles":{"rbnf":"RBNF"},"owner":"RunDevelopment"},"bqn":{"title":"BQN","owner":"yewscion"},"brainfuck":{"title":"Brainfuck","owner":"Golmote"},"brightscript":{"title":"BrightScript","owner":"RunDevelopment"},"bro":{"title":"Bro","owner":"wayward710"},"bsl":{"title":"BSL (1C:Enterprise)","alias":"oscript","aliasTitles":{"oscript":"OneScript"},"owner":"Diversus23"},"c":{"title":"C","require":"clike","owner":"zeitgeist87"},"csharp":{"title":"C#","require":"clike","alias":["cs","dotnet"],"owner":"mvalipour"},"cpp":{"title":"C++","require":"c","owner":"zeitgeist87"},"cfscript":{"title":"CFScript","require":"clike","alias":"cfc","owner":"mjclemente"},"chaiscript":{"title":"ChaiScript","require":["clike","cpp"],"owner":"RunDevelopment"},"cil":{"title":"CIL","owner":"sbrl"},"cilkc":{"title":"Cilk/C","require":"c","alias":"cilk-c","owner":"OpenCilk"},"cilkcpp":{"title":"Cilk/C++","require":"cpp","alias":["cilk-cpp","cilk"],"owner":"OpenCilk"},"clojure":{"title":"Clojure","owner":"troglotit"},"cmake":{"title":"CMake","owner":"mjrogozinski"},"cobol":{"title":"COBOL","owner":"RunDevelopment"},"coffeescript":{"title":"CoffeeScript","require":"javascript","alias":"coffee","owner":"R-osey"},"concurnas":{"title":"Concurnas","alias":"conc","owner":"jasontatton"},"csp":{"title":"Content-Security-Policy","owner":"ScottHelme"},"cooklang":{"title":"Cooklang","owner":"ahue"},"coq":{"title":"Coq","owner":"RunDevelopment"},"crystal":{"title":"Crystal","require":"ruby","owner":"MakeNowJust"},"css-extras":{"title":"CSS Extras","require":"css","modify":"css","owner":"milesj"},"csv":{"title":"CSV","owner":"RunDevelopment"},"cue":{"title":"CUE","owner":"RunDevelopment"},"cypher":{"title":"Cypher","owner":"RunDevelopment"},"d":{"title":"D","require":"clike","owner":"Golmote"},"dart":{"title":"Dart","require":"clike","owner":"Golmote"},"dataweave":{"title":"DataWeave","owner":"machaval"},"dax":{"title":"DAX","owner":"peterbud"},"dhall":{"title":"Dhall","owner":"RunDevelopment"},"diff":{"title":"Diff","owner":"uranusjr"},"django":{"title":"Django/Jinja2","require":"markup-templating","alias":"jinja2","owner":"romanvm"},"dns-zone-file":{"title":"DNS zone file","owner":"RunDevelopment","alias":"dns-zone"},"docker":{"title":"Docker","alias":"dockerfile","owner":"JustinBeckwith"},"dot":{"title":"DOT (Graphviz)","alias":"gv","optional":"markup","owner":"RunDevelopment"},"ebnf":{"title":"EBNF","owner":"RunDevelopment"},"editorconfig":{"title":"EditorConfig","owner":"osipxd"},"eiffel":{"title":"Eiffel","owner":"Conaclos"},"ejs":{"title":"EJS","require":["javascript","markup-templating"],"owner":"RunDevelopment","alias":"eta","aliasTitles":{"eta":"Eta"}},"elixir":{"title":"Elixir","owner":"Golmote"},"elm":{"title":"Elm","owner":"zwilias"},"etlua":{"title":"Embedded Lua templating","require":["lua","markup-templating"],"owner":"RunDevelopment"},"erb":{"title":"ERB","require":["ruby","markup-templating"],"owner":"Golmote"},"erlang":{"title":"Erlang","owner":"Golmote"},"excel-formula":{"title":"Excel Formula","alias":["xlsx","xls"],"owner":"RunDevelopment"},"fsharp":{"title":"F#","require":"clike","owner":"simonreynolds7"},"factor":{"title":"Factor","owner":"catb0t"},"false":{"title":"False","owner":"edukisto"},"firestore-security-rules":{"title":"Firestore security rules","require":"clike","owner":"RunDevelopment"},"flow":{"title":"Flow","require":"javascript","owner":"Golmote"},"fortran":{"title":"Fortran","owner":"Golmote"},"ftl":{"title":"FreeMarker Template Language","require":"markup-templating","owner":"RunDevelopment"},"gml":{"title":"GameMaker Language","alias":"gamemakerlanguage","require":"clike","owner":"LiarOnce"},"gap":{"title":"GAP (CAS)","owner":"RunDevelopment"},"gcode":{"title":"G-code","owner":"RunDevelopment"},"gdscript":{"title":"GDScript","owner":"RunDevelopment"},"gedcom":{"title":"GEDCOM","owner":"Golmote"},"gettext":{"title":"gettext","alias":"po","owner":"RunDevelopment"},"gherkin":{"title":"Gherkin","owner":"hason"},"git":{"title":"Git","owner":"lgiraudel"},"glsl":{"title":"GLSL","require":"c","owner":"Golmote"},"gn":{"title":"GN","alias":"gni","owner":"RunDevelopment"},"linker-script":{"title":"GNU Linker Script","alias":"ld","owner":"RunDevelopment"},"go":{"title":"Go","require":"clike","owner":"arnehormann"},"go-module":{"title":"Go module","alias":"go-mod","owner":"RunDevelopment"},"gradle":{"title":"Gradle","require":"clike","owner":"zeabdelkhalek-badido18"},"graphql":{"title":"GraphQL","optional":"markdown","owner":"Golmote"},"groovy":{"title":"Groovy","require":"clike","owner":"robfletcher"},"haml":{"title":"Haml","require":"ruby","optional":["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],"owner":"Golmote"},"handlebars":{"title":"Handlebars","require":"markup-templating","alias":["hbs","mustache"],"aliasTitles":{"mustache":"Mustache"},"owner":"Golmote"},"haskell":{"title":"Haskell","alias":"hs","owner":"bholst"},"haxe":{"title":"Haxe","require":"clike","optional":"regex","owner":"Golmote"},"hcl":{"title":"HCL","owner":"outsideris"},"hlsl":{"title":"HLSL","require":"c","owner":"RunDevelopment"},"hoon":{"title":"Hoon","owner":"matildepark"},"http":{"title":"HTTP","optional":["csp","css","hpkp","hsts","javascript","json","markup","uri"],"owner":"danielgtaylor"},"hpkp":{"title":"HTTP Public-Key-Pins","owner":"ScottHelme"},"hsts":{"title":"HTTP Strict-Transport-Security","owner":"ScottHelme"},"ichigojam":{"title":"IchigoJam","owner":"BlueCocoa"},"icon":{"title":"Icon","owner":"Golmote"},"icu-message-format":{"title":"ICU Message Format","owner":"RunDevelopment"},"idris":{"title":"Idris","alias":"idr","owner":"KeenS","require":"haskell"},"ignore":{"title":".ignore","owner":"osipxd","alias":["gitignore","hgignore","npmignore"],"aliasTitles":{"gitignore":".gitignore","hgignore":".hgignore","npmignore":".npmignore"}},"inform7":{"title":"Inform 7","owner":"Golmote"},"ini":{"title":"Ini","owner":"aviaryan"},"io":{"title":"Io","owner":"AlesTsurko"},"j":{"title":"J","owner":"Golmote"},"java":{"title":"Java","require":"clike","owner":"sherblot"},"javadoc":{"title":"JavaDoc","require":["markup","java","javadoclike"],"modify":"java","optional":"scala","owner":"RunDevelopment"},"javadoclike":{"title":"JavaDoc-like","modify":["java","javascript","php"],"owner":"RunDevelopment"},"javastacktrace":{"title":"Java stack trace","owner":"RunDevelopment"},"jexl":{"title":"Jexl","owner":"czosel"},"jolie":{"title":"Jolie","require":"clike","owner":"thesave"},"jq":{"title":"JQ","owner":"RunDevelopment"},"jsdoc":{"title":"JSDoc","require":["javascript","javadoclike","typescript"],"modify":"javascript","optional":["actionscript","coffeescript"],"owner":"RunDevelopment"},"js-extras":{"title":"JS Extras","require":"javascript","modify":"javascript","optional":["actionscript","coffeescript","flow","n4js","typescript"],"owner":"RunDevelopment"},"json":{"title":"JSON","alias":"webmanifest","aliasTitles":{"webmanifest":"Web App Manifest"},"owner":"CupOfTea696"},"json5":{"title":"JSON5","require":"json","owner":"RunDevelopment"},"jsonp":{"title":"JSONP","require":"json","owner":"RunDevelopment"},"jsstacktrace":{"title":"JS stack trace","owner":"sbrl"},"js-templates":{"title":"JS Templates","require":"javascript","modify":"javascript","optional":["css","css-extras","graphql","markdown","markup","sql"],"owner":"RunDevelopment"},"julia":{"title":"Julia","owner":"cdagnino"},"keepalived":{"title":"Keepalived Configure","owner":"dev-itsheng"},"keyman":{"title":"Keyman","owner":"mcdurdin"},"kotlin":{"title":"Kotlin","alias":["kt","kts"],"aliasTitles":{"kts":"Kotlin Script"},"require":"clike","owner":"Golmote"},"kumir":{"title":"KuMir (КуМир)","alias":"kum","owner":"edukisto"},"kusto":{"title":"Kusto","owner":"RunDevelopment"},"latex":{"title":"LaTeX","alias":["tex","context"],"aliasTitles":{"tex":"TeX","context":"ConTeXt"},"owner":"japborst"},"latte":{"title":"Latte","require":["clike","markup-templating","php"],"owner":"nette"},"less":{"title":"Less","require":"css","optional":"css-extras","owner":"Golmote"},"lilypond":{"title":"LilyPond","require":"scheme","alias":"ly","owner":"RunDevelopment"},"liquid":{"title":"Liquid","require":"markup-templating","owner":"cinhtau"},"lisp":{"title":"Lisp","alias":["emacs","elisp","emacs-lisp"],"owner":"JuanCaicedo"},"livescript":{"title":"LiveScript","owner":"Golmote"},"llvm":{"title":"LLVM IR","owner":"porglezomp"},"log":{"title":"Log file","optional":"javastacktrace","owner":"RunDevelopment"},"lolcode":{"title":"LOLCODE","owner":"Golmote"},"lua":{"title":"Lua","owner":"Golmote"},"magma":{"title":"Magma (CAS)","owner":"RunDevelopment"},"makefile":{"title":"Makefile","owner":"Golmote"},"markdown":{"title":"Markdown","require":"markup","optional":"yaml","alias":"md","owner":"Golmote"},"markup-templating":{"title":"Markup templating","require":"markup","owner":"Golmote"},"mata":{"title":"Mata","owner":"RunDevelopment"},"matlab":{"title":"MATLAB","owner":"Golmote"},"maxscript":{"title":"MAXScript","owner":"RunDevelopment"},"mel":{"title":"MEL","owner":"Golmote"},"mermaid":{"title":"Mermaid","owner":"RunDevelopment"},"metafont":{"title":"METAFONT","owner":"LaeriExNihilo"},"mizar":{"title":"Mizar","owner":"Golmote"},"mongodb":{"title":"MongoDB","owner":"airs0urce","require":"javascript"},"monkey":{"title":"Monkey","owner":"Golmote"},"moonscript":{"title":"MoonScript","alias":"moon","owner":"RunDevelopment"},"n1ql":{"title":"N1QL","owner":"TMWilds"},"n4js":{"title":"N4JS","require":"javascript","optional":"jsdoc","alias":"n4jsd","owner":"bsmith-n4"},"nand2tetris-hdl":{"title":"Nand To Tetris HDL","owner":"stephanmax"},"naniscript":{"title":"Naninovel Script","owner":"Elringus","alias":"nani"},"nasm":{"title":"NASM","owner":"rbmj"},"neon":{"title":"NEON","owner":"nette"},"nevod":{"title":"Nevod","owner":"nezaboodka"},"nginx":{"title":"nginx","owner":"volado"},"nim":{"title":"Nim","owner":"Golmote"},"nix":{"title":"Nix","owner":"Golmote"},"nsis":{"title":"NSIS","owner":"idleberg"},"objectivec":{"title":"Objective-C","require":"c","alias":"objc","owner":"uranusjr"},"ocaml":{"title":"OCaml","owner":"Golmote"},"odin":{"title":"Odin","owner":"edukisto"},"opencl":{"title":"OpenCL","require":"c","modify":["c","cpp"],"owner":"Milania1"},"openqasm":{"title":"OpenQasm","alias":"qasm","owner":"RunDevelopment"},"oz":{"title":"Oz","owner":"Golmote"},"parigp":{"title":"PARI/GP","owner":"Golmote"},"parser":{"title":"Parser","require":"markup","owner":"Golmote"},"pascal":{"title":"Pascal","alias":"objectpascal","aliasTitles":{"objectpascal":"Object Pascal"},"owner":"Golmote"},"pascaligo":{"title":"Pascaligo","owner":"DefinitelyNotAGoat"},"psl":{"title":"PATROL Scripting Language","owner":"bertysentry"},"pcaxis":{"title":"PC-Axis","alias":"px","owner":"RunDevelopment"},"peoplecode":{"title":"PeopleCode","alias":"pcode","owner":"RunDevelopment"},"perl":{"title":"Perl","owner":"Golmote"},"php":{"title":"PHP","require":"markup-templating","owner":"milesj"},"phpdoc":{"title":"PHPDoc","require":["php","javadoclike"],"modify":"php","owner":"RunDevelopment"},"php-extras":{"title":"PHP Extras","require":"php","modify":"php","owner":"milesj"},"plant-uml":{"title":"PlantUML","alias":"plantuml","owner":"RunDevelopment"},"plsql":{"title":"PL/SQL","require":"sql","owner":"Golmote"},"powerquery":{"title":"PowerQuery","alias":["pq","mscript"],"owner":"peterbud"},"powershell":{"title":"PowerShell","owner":"nauzilus"},"processing":{"title":"Processing","require":"clike","owner":"Golmote"},"prolog":{"title":"Prolog","owner":"Golmote"},"promql":{"title":"PromQL","owner":"arendjr"},"properties":{"title":".properties","owner":"Golmote"},"protobuf":{"title":"Protocol Buffers","require":"clike","owner":"just-boris"},"pug":{"title":"Pug","require":["markup","javascript"],"optional":["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],"owner":"Golmote"},"puppet":{"title":"Puppet","owner":"Golmote"},"pure":{"title":"Pure","optional":["c","cpp","fortran"],"owner":"Golmote"},"purebasic":{"title":"PureBasic","require":"clike","alias":"pbfasm","owner":"HeX0R101"},"purescript":{"title":"PureScript","require":"haskell","alias":"purs","owner":"sriharshachilakapati"},"python":{"title":"Python","alias":"py","owner":"multipetros"},"qsharp":{"title":"Q#","require":"clike","alias":"qs","owner":"fedonman"},"q":{"title":"Q (kdb+ database)","owner":"Golmote"},"qml":{"title":"QML","require":"javascript","owner":"RunDevelopment"},"qore":{"title":"Qore","require":"clike","owner":"temnroegg"},"r":{"title":"R","owner":"Golmote"},"racket":{"title":"Racket","require":"scheme","alias":"rkt","owner":"RunDevelopment"},"cshtml":{"title":"Razor C#","alias":"razor","require":["markup","csharp"],"optional":["css","css-extras","javascript","js-extras"],"owner":"RunDevelopment"},"jsx":{"title":"React JSX","require":["markup","javascript"],"optional":["jsdoc","js-extras","js-templates"],"owner":"vkbansal"},"tsx":{"title":"React TSX","require":["jsx","typescript"]},"reason":{"title":"Reason","require":"clike","owner":"Golmote"},"regex":{"title":"Regex","owner":"RunDevelopment"},"rego":{"title":"Rego","owner":"JordanSh"},"renpy":{"title":"Ren'py","alias":"rpy","owner":"HyuchiaDiego"},"rescript":{"title":"ReScript","alias":"res","owner":"vmarcosp"},"rest":{"title":"reST (reStructuredText)","owner":"Golmote"},"rip":{"title":"Rip","owner":"ravinggenius"},"roboconf":{"title":"Roboconf","owner":"Golmote"},"robotframework":{"title":"Robot Framework","alias":"robot","owner":"RunDevelopment"},"ruby":{"title":"Ruby","require":"clike","alias":"rb","owner":"samflores"},"rust":{"title":"Rust","owner":"Golmote"},"sas":{"title":"SAS","optional":["groovy","lua","sql"],"owner":"Golmote"},"sass":{"title":"Sass (Sass)","require":"css","optional":"css-extras","owner":"Golmote"},"scss":{"title":"Sass (SCSS)","require":"css","optional":"css-extras","owner":"MoOx"},"scala":{"title":"Scala","require":"java","owner":"jozic"},"scheme":{"title":"Scheme","owner":"bacchus123"},"shell-session":{"title":"Shell session","require":"bash","alias":["sh-session","shellsession"],"owner":"RunDevelopment"},"smali":{"title":"Smali","owner":"RunDevelopment"},"smalltalk":{"title":"Smalltalk","owner":"Golmote"},"smarty":{"title":"Smarty","require":"markup-templating","optional":"php","owner":"Golmote"},"sml":{"title":"SML","alias":"smlnj","aliasTitles":{"smlnj":"SML/NJ"},"owner":"RunDevelopment"},"solidity":{"title":"Solidity (Ethereum)","alias":"sol","require":"clike","owner":"glachaud"},"solution-file":{"title":"Solution file","alias":"sln","owner":"RunDevelopment"},"soy":{"title":"Soy (Closure Template)","require":"markup-templating","owner":"Golmote"},"sparql":{"title":"SPARQL","require":"turtle","owner":"Triply-Dev","alias":"rq"},"splunk-spl":{"title":"Splunk SPL","owner":"RunDevelopment"},"sqf":{"title":"SQF: Status Quo Function (Arma 3)","require":"clike","owner":"RunDevelopment"},"sql":{"title":"SQL","owner":"multipetros"},"squirrel":{"title":"Squirrel","require":"clike","owner":"RunDevelopment"},"stan":{"title":"Stan","owner":"RunDevelopment"},"stata":{"title":"Stata Ado","require":["mata","java","python"],"owner":"RunDevelopment"},"iecst":{"title":"Structured Text (IEC 61131-3)","owner":"serhioromano"},"stylus":{"title":"Stylus","owner":"vkbansal"},"supercollider":{"title":"SuperCollider","alias":"sclang","owner":"RunDevelopment"},"swift":{"title":"Swift","owner":"chrischares"},"systemd":{"title":"Systemd configuration file","owner":"RunDevelopment"},"t4-templating":{"title":"T4 templating","owner":"RunDevelopment"},"t4-cs":{"title":"T4 Text Templates (C#)","require":["t4-templating","csharp"],"alias":"t4","owner":"RunDevelopment"},"t4-vb":{"title":"T4 Text Templates (VB)","require":["t4-templating","vbnet"],"owner":"RunDevelopment"},"tap":{"title":"TAP","owner":"isaacs","require":"yaml"},"tcl":{"title":"Tcl","owner":"PeterChaplin"},"tt2":{"title":"Template Toolkit 2","require":["clike","markup-templating"],"owner":"gflohr"},"textile":{"title":"Textile","require":"markup","optional":"css","owner":"Golmote"},"toml":{"title":"TOML","owner":"RunDevelopment"},"tremor":{"title":"Tremor","alias":["trickle","troy"],"owner":"darach","aliasTitles":{"trickle":"trickle","troy":"troy"}},"turtle":{"title":"Turtle","alias":"trig","aliasTitles":{"trig":"TriG"},"owner":"jakubklimek"},"twig":{"title":"Twig","require":"markup-templating","owner":"brandonkelly"},"typescript":{"title":"TypeScript","require":"javascript","optional":"js-templates","alias":"ts","owner":"vkbansal"},"typoscript":{"title":"TypoScript","alias":"tsconfig","aliasTitles":{"tsconfig":"TSConfig"},"owner":"dkern"},"unrealscript":{"title":"UnrealScript","alias":["uscript","uc"],"owner":"RunDevelopment"},"uorazor":{"title":"UO Razor Script","owner":"jaseowns"},"uri":{"title":"URI","alias":"url","aliasTitles":{"url":"URL"},"owner":"RunDevelopment"},"v":{"title":"V","require":"clike","owner":"taggon"},"vala":{"title":"Vala","require":"clike","optional":"regex","owner":"TemplarVolk"},"vbnet":{"title":"VB.Net","require":"basic","owner":"Bigsby"},"velocity":{"title":"Velocity","require":"markup","owner":"Golmote"},"verilog":{"title":"Verilog","owner":"a-rey"},"vhdl":{"title":"VHDL","owner":"a-rey"},"vim":{"title":"vim","owner":"westonganger"},"visual-basic":{"title":"Visual Basic","alias":["vb","vba"],"aliasTitles":{"vba":"VBA"},"owner":"Golmote"},"warpscript":{"title":"WarpScript","owner":"RunDevelopment"},"wasm":{"title":"WebAssembly","owner":"Golmote"},"web-idl":{"title":"Web IDL","alias":"webidl","owner":"RunDevelopment"},"wgsl":{"title":"WGSL","owner":"Dr4gonthree"},"wiki":{"title":"Wiki markup","require":"markup","owner":"Golmote"},"wolfram":{"title":"Wolfram language","alias":["mathematica","nb","wl"],"aliasTitles":{"mathematica":"Mathematica","nb":"Mathematica Notebook"},"owner":"msollami"},"wren":{"title":"Wren","owner":"clsource"},"xeora":{"title":"Xeora","require":"markup","alias":"xeoracube","aliasTitles":{"xeoracube":"XeoraCube"},"owner":"freakmaxi"},"xml-doc":{"title":"XML doc (.net)","require":"markup","modify":["csharp","fsharp","vbnet"],"owner":"RunDevelopment"},"xojo":{"title":"Xojo (REALbasic)","owner":"Golmote"},"xquery":{"title":"XQuery","require":"markup","owner":"Golmote"},"yaml":{"title":"YAML","alias":"yml","owner":"hason"},"yang":{"title":"YANG","owner":"RunDevelopment"},"zig":{"title":"Zig","owner":"RunDevelopment"}},"plugins":{"meta":{"path":"plugins/{id}/prism-{id}","link":"plugins/{id}/"},"line-highlight":{"title":"Line Highlight","description":"Highlights specific lines and/or line ranges."},"line-numbers":{"title":"Line Numbers","description":"Line number at the beginning of code lines.","owner":"kuba-kubula"},"show-invisibles":{"title":"Show Invisibles","description":"Show hidden characters such as tabs and line breaks.","optional":["autolinker","data-uri-highlight"]},"autolinker":{"title":"Autolinker","description":"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},"wpd":{"title":"WebPlatform Docs","description":"Makes tokens link to <a href=\"https://webplatform.github.io/docs/\">WebPlatform.org documentation</a>. The links open in a new tab."},"custom-class":{"title":"Custom Class","description":"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.","owner":"dvkndn","noCSS":true},"file-highlight":{"title":"File Highlight","description":"Fetch external files and highlight them with Prism. Used on the Prism website itself.","noCSS":true},"show-language":{"title":"Show Language","description":"Display the highlighted language in code blocks (inline code does not show the label).","owner":"nauzilus","noCSS":true,"require":"toolbar"},"jsonp-highlight":{"title":"JSONP Highlight","description":"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).","noCSS":true,"owner":"nauzilus"},"highlight-keywords":{"title":"Highlight Keywords","description":"Adds special CSS classes for each keyword for fine-grained highlighting.","owner":"vkbansal","noCSS":true},"remove-initial-line-feed":{"title":"Remove initial line feed","description":"Removes the initial line feed in code blocks.","owner":"Golmote","noCSS":true},"inline-color":{"title":"Inline color","description":"Adds a small inline preview for colors in style sheets.","require":"css-extras","owner":"RunDevelopment"},"previewers":{"title":"Previewers","description":"Previewers for angles, colors, gradients, easing and time.","require":"css-extras","owner":"Golmote"},"autoloader":{"title":"Autoloader","description":"Automatically loads the needed languages to highlight the code blocks.","owner":"Golmote","noCSS":true},"keep-markup":{"title":"Keep Markup","description":"Prevents custom markup from being dropped out during highlighting.","owner":"Golmote","optional":"normalize-whitespace","noCSS":true},"command-line":{"title":"Command Line","description":"Display a command line with a prompt and, optionally, the output/response from the commands.","owner":"chriswells0"},"unescaped-markup":{"title":"Unescaped Markup","description":"Write markup without having to escape anything."},"normalize-whitespace":{"title":"Normalize Whitespace","description":"Supports multiple operations to normalize whitespace in code blocks.","owner":"zeitgeist87","optional":"unescaped-markup","noCSS":true},"data-uri-highlight":{"title":"Data-URI Highlight","description":"Highlights data-URI contents.","owner":"Golmote","noCSS":true},"toolbar":{"title":"Toolbar","description":"Attach a toolbar for plugins to easily register buttons on the top of a code block.","owner":"mAAdhaTTah"},"copy-to-clipboard":{"title":"Copy to Clipboard Button","description":"Add a button that copies the code block to the clipboard when clicked.","owner":"mAAdhaTTah","require":"toolbar","noCSS":true},"download-button":{"title":"Download Button","description":"A button in the toolbar of a code block adding a convenient way to download a code file.","owner":"Golmote","require":"toolbar","noCSS":true},"match-braces":{"title":"Match braces","description":"Highlights matching braces.","owner":"RunDevelopment"},"diff-highlight":{"title":"Diff Highlight","description":"Highlights the code inside diff blocks.","owner":"RunDevelopment","require":"diff"},"filter-highlight-all":{"title":"Filter highlightAll","description":"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.","owner":"RunDevelopment","noCSS":true},"treeview":{"title":"Treeview","description":"A language with special styles to highlight file system tree structures.","owner":"Golmote"}}};
if (typeof module !== 'undefined' && module.exports) { module.exports = components; }՗ϵxj{{
	"core": {
		"meta": {
			"path": "components/prism-core.js",
			"option": "mandatory"
		},
		"core": "Core"
	},
	"themes": {
		"meta": {
			"path": "themes/{id}.css",
			"link": "index.html?theme={id}",
			"exclusive": true
		},
		"prism": {
			"title": "Default",
			"option": "default"
		},
		"prism-dark": "Dark",
		"prism-funky": "Funky",
		"prism-okaidia": {
			"title": "Okaidia",
			"owner": "ocodia"
		},
		"prism-twilight": {
			"title": "Twilight",
			"owner": "remybach"
		},
		"prism-coy": {
			"title": "Coy",
			"owner": "tshedor"
		},
		"prism-solarizedlight": {
			"title": "Solarized Light",
			"owner": "hectormatos2011 "
		},
		"prism-tomorrow": {
			"title": "Tomorrow Night",
			"owner": "Rosey"
		}
	},
	"languages": {
		"meta": {
			"path": "components/prism-{id}",
			"noCSS": true,
			"examplesPath": "examples/prism-{id}",
			"addCheckAll": true
		},
		"markup": {
			"title": "Markup",
			"alias": ["html", "xml", "svg", "mathml", "ssml", "atom", "rss"],
			"aliasTitles": {
				"html": "HTML",
				"xml": "XML",
				"svg": "SVG",
				"mathml": "MathML",
				"ssml": "SSML",
				"atom": "Atom",
				"rss": "RSS"
			},
			"option": "default"
		},
		"css": {
			"title": "CSS",
			"option": "default",
			"modify": "markup"
		},
		"clike": {
			"title": "C-like",
			"option": "default"
		},
		"javascript": {
			"title": "JavaScript",
			"require": "clike",
			"modify": "markup",
			"optional": "regex",
			"alias": "js",
			"option": "default"
		},
		"abap": {
			"title": "ABAP",
			"owner": "dellagustin"
		},
		"abnf": {
			"title": "ABNF",
			"owner": "RunDevelopment"
		},
		"actionscript": {
			"title": "ActionScript",
			"require": "javascript",
			"modify": "markup",
			"owner": "Golmote"
		},
		"ada": {
			"title": "Ada",
			"owner": "Lucretia"
		},
		"agda": {
			"title": "Agda",
			"owner": "xy-ren"
		},
		"al": {
			"title": "AL",
			"owner": "RunDevelopment"
		},
		"antlr4": {
			"title": "ANTLR4",
			"alias": "g4",
			"owner": "RunDevelopment"
		},
		"apacheconf": {
			"title": "Apache Configuration",
			"owner": "GuiTeK"
		},
		"apex": {
			"title": "Apex",
			"require": ["clike", "sql"],
			"owner": "RunDevelopment"
		},
		"apl": {
			"title": "APL",
			"owner": "ngn"
		},
		"applescript": {
			"title": "AppleScript",
			"owner": "Golmote"
		},
		"aql": {
			"title": "AQL",
			"owner": "RunDevelopment"
		},
		"arduino": {
			"title": "Arduino",
			"require": "cpp",
			"alias": "ino",
			"owner": "dkern"
		},
		"arff": {
			"title": "ARFF",
			"owner": "Golmote"
		},
		"armasm": {
			"title": "ARM Assembly",
			"alias": "arm-asm",
			"owner": "RunDevelopment"
		},
		"arturo": {
			"title": "Arturo",
			"alias": "art",
			"optional": [
				"bash",
				"css",
				"javascript",
				"markup",
				"markdown",
				"sql"
			],
			"owner": "drkameleon"
		},
		"asciidoc": {
			"alias": "adoc",
			"title": "AsciiDoc",
			"owner": "Golmote"
		},
		"aspnet": {
			"title": "ASP.NET (C#)",
			"require": ["markup", "csharp"],
			"owner": "nauzilus"
		},
		"asm6502": {
			"title": "6502 Assembly",
			"owner": "kzurawel"
		},
		"asmatmel": {
			"title": "Atmel AVR Assembly",
			"owner": "cerkit"
		},
		"autohotkey": {
			"title": "AutoHotkey",
			"owner": "aviaryan"
		},
		"autoit": {
			"title": "AutoIt",
			"owner": "Golmote"
		},
		"avisynth": {
			"title": "AviSynth",
			"alias": "avs",
			"owner": "Zinfidel"
		},
		"avro-idl": {
			"title":"Avro IDL",
			"alias": "avdl",
			"owner": "RunDevelopment"
		},
		"awk": {
			"title": "AWK",
			"alias": "gawk",
			"aliasTitles": {
				"gawk": "GAWK"
			},
			"owner": "RunDevelopment"
		},
		"bash": {
			"title": "Bash",
			"alias": ["sh", "shell"],
			"aliasTitles": {
				"sh": "Shell",
				"shell": "Shell"
			},
			"owner": "zeitgeist87"
		},
		"basic": {
			"title": "BASIC",
			"owner": "Golmote"
		},
		"batch": {
			"title": "Batch",
			"owner": "Golmote"
		},
		"bbcode": {
			"title": "BBcode",
			"alias": "shortcode",
			"aliasTitles": {
				"shortcode": "Shortcode"
			},
			"owner": "RunDevelopment"
		},
		"bbj": {
			"title": "BBj",
			"owner": "hyyan"
		},
		"bicep": {
			"title": "Bicep",
			"owner": "johnnyreilly"
		},
		"birb": {
			"title": "Birb",
			"require": "clike",
			"owner": "Calamity210"
		},
		"bison": {
			"title": "Bison",
			"require": "c",
			"owner": "Golmote"
		},
		"bnf": {
			"title": "BNF",
			"alias": "rbnf",
			"aliasTitles": {
				"rbnf": "RBNF"
			},
			"owner": "RunDevelopment"
		},
		"bqn": {
			"title": "BQN",
			"owner": "yewscion"
		},
		"brainfuck": {
			"title": "Brainfuck",
			"owner": "Golmote"
		},
		"brightscript": {
			"title": "BrightScript",
			"owner": "RunDevelopment"
		},
		"bro": {
			"title": "Bro",
			"owner": "wayward710"
		},
		"bsl": {
			"title": "BSL (1C:Enterprise)",
			"alias": "oscript",
			"aliasTitles": {
				"oscript": "OneScript"
			},
			"owner": "Diversus23"
		},
		"c": {
			"title": "C",
			"require": "clike",
			"owner": "zeitgeist87"
		},
		"csharp": {
			"title": "C#",
			"require": "clike",
			"alias": ["cs", "dotnet"],
			"owner": "mvalipour"
		},
		"cpp": {
			"title": "C++",
			"require": "c",
			"owner": "zeitgeist87"
		},
		"cfscript": {
			"title": "CFScript",
			"require": "clike",
			"alias": "cfc",
			"owner": "mjclemente"
		},
		"chaiscript": {
			"title": "ChaiScript",
			"require": ["clike", "cpp"],
			"owner": "RunDevelopment"
		},
		"cil": {
			"title": "CIL",
			"owner": "sbrl"
		},
		"cilkc": {
			"title": "Cilk/C",
			"require": "c",
			"alias": "cilk-c",
			"owner": "OpenCilk"
		},
		"cilkcpp": {
			"title": "Cilk/C++",
			"require": "cpp",
			"alias": ["cilk-cpp", "cilk"],
			"owner": "OpenCilk"
		},
		"clojure": {
			"title": "Clojure",
			"owner": "troglotit"
		},
		"cmake": {
			"title": "CMake",
			"owner": "mjrogozinski"
		},
		"cobol": {
			"title": "COBOL",
			"owner": "RunDevelopment"
		},
		"coffeescript": {
			"title": "CoffeeScript",
			"require": "javascript",
			"alias": "coffee",
			"owner": "R-osey"
		},
		"concurnas": {
			"title": "Concurnas",
			"alias": "conc",
			"owner": "jasontatton"
		},
		"csp": {
			"title": "Content-Security-Policy",
			"owner": "ScottHelme"
		},
		"cooklang": {
			"title": "Cooklang",
			"owner": "ahue"
		},
		"coq": {
			"title": "Coq",
			"owner": "RunDevelopment"
		},
		"crystal": {
			"title": "Crystal",
			"require": "ruby",
			"owner": "MakeNowJust"
		},
		"css-extras": {
			"title": "CSS Extras",
			"require": "css",
			"modify": "css",
			"owner": "milesj"
		},
		"csv": {
			"title": "CSV",
			"owner": "RunDevelopment"
		},
		"cue": {
			"title": "CUE",
			"owner": "RunDevelopment"
		},
		"cypher": {
			"title": "Cypher",
			"owner": "RunDevelopment"
		},
		"d": {
			"title": "D",
			"require": "clike",
			"owner": "Golmote"
		},
		"dart": {
			"title": "Dart",
			"require": "clike",
			"owner": "Golmote"
		},
		"dataweave": {
			"title": "DataWeave",
			"owner": "machaval"
		},
		"dax": {
			"title": "DAX",
			"owner": "peterbud"
		},
		"dhall": {
			"title": "Dhall",
			"owner": "RunDevelopment"
		},
		"diff": {
			"title": "Diff",
			"owner": "uranusjr"
		},
		"django": {
			"title": "Django/Jinja2",
			"require": "markup-templating",
			"alias": "jinja2",
			"owner": "romanvm"
		},
		"dns-zone-file": {
			"title": "DNS zone file",
			"owner": "RunDevelopment",
			"alias": "dns-zone"
		},
		"docker": {
			"title": "Docker",
			"alias": "dockerfile",
			"owner": "JustinBeckwith"
		},
		"dot": {
			"title": "DOT (Graphviz)",
			"alias": "gv",
			"optional": "markup",
			"owner": "RunDevelopment"
		},
		"ebnf": {
			"title": "EBNF",
			"owner": "RunDevelopment"
		},
		"editorconfig": {
			"title": "EditorConfig",
			"owner": "osipxd"
		},
		"eiffel": {
			"title": "Eiffel",
			"owner": "Conaclos"
		},
		"ejs": {
			"title": "EJS",
			"require": ["javascript", "markup-templating"],
			"owner": "RunDevelopment",
			"alias": "eta",
			"aliasTitles": {
				"eta": "Eta"
			}
		},
		"elixir": {
			"title": "Elixir",
			"owner": "Golmote"
		},
		"elm": {
			"title": "Elm",
			"owner": "zwilias"
		},
		"etlua": {
			"title": "Embedded Lua templating",
			"require": ["lua", "markup-templating"],
			"owner": "RunDevelopment"
		},
		"erb": {
			"title": "ERB",
			"require": ["ruby", "markup-templating"],
			"owner": "Golmote"
		},
		"erlang": {
			"title": "Erlang",
			"owner": "Golmote"
		},
		"excel-formula": {
			"title": "Excel Formula",
			"alias": ["xlsx", "xls"],
			"owner": "RunDevelopment"
		},
		"fsharp": {
			"title": "F#",
			"require": "clike",
			"owner": "simonreynolds7"
		},
		"factor": {
			"title": "Factor",
			"owner": "catb0t"
		},
		"false": {
			"title": "False",
			"owner": "edukisto"
		},
		"firestore-security-rules": {
			"title": "Firestore security rules",
			"require": "clike",
			"owner": "RunDevelopment"
		},
		"flow": {
			"title": "Flow",
			"require": "javascript",
			"owner": "Golmote"
		},
		"fortran": {
			"title": "Fortran",
			"owner": "Golmote"
		},
		"ftl": {
			"title": "FreeMarker Template Language",
			"require": "markup-templating",
			"owner": "RunDevelopment"
		},
		"gml": {
			"title": "GameMaker Language",
			"alias": "gamemakerlanguage",
			"require": "clike",
			"owner": "LiarOnce"
		},
		"gap": {
			"title": "GAP (CAS)",
			"owner": "RunDevelopment"
		},
		"gcode": {
			"title": "G-code",
			"owner": "RunDevelopment"
		},
		"gdscript": {
			"title": "GDScript",
			"owner": "RunDevelopment"
		},
		"gedcom": {
			"title": "GEDCOM",
			"owner": "Golmote"
		},
		"gettext": {
			"title": "gettext",
			"alias": "po",
			"owner": "RunDevelopment"
		},
		"gherkin": {
			"title": "Gherkin",
			"owner": "hason"
		},
		"git": {
			"title": "Git",
			"owner": "lgiraudel"
		},
		"glsl": {
			"title": "GLSL",
			"require": "c",
			"owner": "Golmote"
		},
		"gn": {
			"title": "GN",
			"alias": "gni",
			"owner": "RunDevelopment"
		},
		"linker-script": {
			"title": "GNU Linker Script",
			"alias": "ld",
			"owner": "RunDevelopment"
		},
		"go": {
			"title": "Go",
			"require": "clike",
			"owner": "arnehormann"
		},
		"go-module": {
			"title": "Go module",
			"alias": "go-mod",
			"owner": "RunDevelopment"
		},
		"gradle": {
			"title": "Gradle",
			"require": "clike",
			"owner": "zeabdelkhalek-badido18"
		},
		"graphql": {
			"title": "GraphQL",
			"optional": "markdown",
			"owner": "Golmote"
		},
		"groovy": {
			"title": "Groovy",
			"require": "clike",
			"owner": "robfletcher"
		},
		"haml": {
			"title": "Haml",
			"require": "ruby",
			"optional": [
				"css",
				"css-extras",
				"coffeescript",
				"erb",
				"javascript",
				"less",
				"markdown",
				"scss",
				"textile"
			],
			"owner": "Golmote"
		},
		"handlebars": {
			"title": "Handlebars",
			"require": "markup-templating",
			"alias": ["hbs", "mustache"],
			"aliasTitles": {
				"mustache": "Mustache"
			},
			"owner": "Golmote"
		},
		"haskell": {
			"title": "Haskell",
			"alias": "hs",
			"owner": "bholst"
		},
		"haxe": {
			"title": "Haxe",
			"require": "clike",
			"optional": "regex",
			"owner": "Golmote"
		},
		"hcl": {
			"title": "HCL",
			"owner": "outsideris"
		},
		"hlsl": {
			"title": "HLSL",
			"require": "c",
			"owner": "RunDevelopment"
		},
		"hoon": {
			"title": "Hoon",
			"owner": "matildepark"
		},
		"http": {
			"title": "HTTP",
			"optional": [
				"csp",
				"css",
				"hpkp",
				"hsts",
				"javascript",
				"json",
				"markup",
				"uri"
			],
			"owner": "danielgtaylor"
		},
		"hpkp": {
			"title": "HTTP Public-Key-Pins",
			"owner": "ScottHelme"
		},
		"hsts": {
			"title": "HTTP Strict-Transport-Security",
			"owner": "ScottHelme"
		},
		"ichigojam": {
			"title": "IchigoJam",
			"owner": "BlueCocoa"
		},
		"icon": {
			"title": "Icon",
			"owner": "Golmote"
		},
		"icu-message-format": {
			"title": "ICU Message Format",
			"owner": "RunDevelopment"
		},
		"idris": {
			"title": "Idris",
			"alias": "idr",
			"owner": "KeenS",
			"require": "haskell"
		},
		"ignore": {
			"title": ".ignore",
			"owner": "osipxd",
			"alias": [
				"gitignore",
				"hgignore",
				"npmignore"
			],
			"aliasTitles": {
				"gitignore": ".gitignore",
				"hgignore": ".hgignore",
				"npmignore": ".npmignore"
			}
		},
		"inform7": {
			"title": "Inform 7",
			"owner": "Golmote"
		},
		"ini": {
			"title": "Ini",
			"owner": "aviaryan"
		},
		"io": {
			"title": "Io",
			"owner": "AlesTsurko"
		},
		"j": {
			"title": "J",
			"owner": "Golmote"
		},
		"java": {
			"title": "Java",
			"require": "clike",
			"owner": "sherblot"
		},
		"javadoc": {
			"title": "JavaDoc",
			"require": ["markup", "java", "javadoclike"],
			"modify": "java",
			"optional": "scala",
			"owner": "RunDevelopment"
		},
		"javadoclike": {
			"title": "JavaDoc-like",
			"modify": [
				"java",
				"javascript",
				"php"
			],
			"owner": "RunDevelopment"
		},
		"javastacktrace": {
			"title": "Java stack trace",
			"owner": "RunDevelopment"
		},
		"jexl": {
			"title": "Jexl",
			"owner": "czosel"
		},
		"jolie": {
			"title": "Jolie",
			"require": "clike",
			"owner": "thesave"
		},
		"jq": {
			"title": "JQ",
			"owner": "RunDevelopment"
		},
		"jsdoc": {
			"title": "JSDoc",
			"require": ["javascript", "javadoclike", "typescript"],
			"modify": "javascript",
			"optional": [
				"actionscript",
				"coffeescript"
			],
			"owner": "RunDevelopment"
		},
		"js-extras": {
			"title": "JS Extras",
			"require": "javascript",
			"modify": "javascript",
			"optional": [
				"actionscript",
				"coffeescript",
				"flow",
				"n4js",
				"typescript"
			],
			"owner": "RunDevelopment"
		},
		"json": {
			"title": "JSON",
			"alias": "webmanifest",
			"aliasTitles": {
				"webmanifest": "Web App Manifest"
			},
			"owner": "CupOfTea696"
		},
		"json5": {
			"title": "JSON5",
			"require": "json",
			"owner": "RunDevelopment"
		},
		"jsonp": {
			"title": "JSONP",
			"require": "json",
			"owner": "RunDevelopment"
		},
		"jsstacktrace": {
			"title": "JS stack trace",
			"owner": "sbrl"
		},
		"js-templates": {
			"title": "JS Templates",
			"require": "javascript",
			"modify": "javascript",
			"optional": [
				"css",
				"css-extras",
				"graphql",
				"markdown",
				"markup",
				"sql"
			],
			"owner": "RunDevelopment"
		},
		"julia": {
			"title": "Julia",
			"owner": "cdagnino"
		},
		"keepalived": {
			"title": "Keepalived Configure",
			"owner": "dev-itsheng"
		},
		"keyman": {
			"title": "Keyman",
			"owner": "mcdurdin"
		},
		"kotlin": {
			"title": "Kotlin",
			"alias": ["kt", "kts"],
			"aliasTitles": {
				"kts": "Kotlin Script"
			},
			"require": "clike",
			"owner": "Golmote"
		},
		"kumir": {
			"title": "KuMir (КуМир)",
			"alias": "kum",
			"owner": "edukisto"
		},
		"kusto": {
			"title": "Kusto",
			"owner": "RunDevelopment"
		},
		"latex": {
			"title": "LaTeX",
			"alias": ["tex", "context"],
			"aliasTitles": {
				"tex": "TeX",
				"context": "ConTeXt"
			},
			"owner": "japborst"
		},
		"latte": {
			"title": "Latte",
			"require": ["clike", "markup-templating", "php"],
			"owner": "nette"
		},
		"less": {
			"title": "Less",
			"require": "css",
			"optional": "css-extras",
			"owner": "Golmote"
		},
		"lilypond": {
			"title": "LilyPond",
			"require": "scheme",
			"alias": "ly",
			"owner": "RunDevelopment"
		},
		"liquid": {
			"title": "Liquid",
			"require": "markup-templating",
			"owner": "cinhtau"
		},
		"lisp": {
			"title": "Lisp",
			"alias": ["emacs", "elisp", "emacs-lisp"],
			"owner": "JuanCaicedo"
		},
		"livescript": {
			"title": "LiveScript",
			"owner": "Golmote"
		},
		"llvm": {
			"title": "LLVM IR",
			"owner": "porglezomp"
		},
		"log": {
			"title": "Log file",
			"optional": "javastacktrace",
			"owner": "RunDevelopment"
		},
		"lolcode": {
			"title": "LOLCODE",
			"owner": "Golmote"
		},
		"lua": {
			"title": "Lua",
			"owner": "Golmote"
		},
		"magma": {
			"title": "Magma (CAS)",
			"owner": "RunDevelopment"
		},
		"makefile": {
			"title": "Makefile",
			"owner": "Golmote"
		},
		"markdown": {
			"title": "Markdown",
			"require": "markup",
			"optional": "yaml",
			"alias": "md",
			"owner": "Golmote"
		},
		"markup-templating": {
			"title": "Markup templating",
			"require": "markup",
			"owner": "Golmote"
		},
		"mata": {
			"title": "Mata",
			"owner": "RunDevelopment"
		},
		"matlab": {
			"title": "MATLAB",
			"owner": "Golmote"
		},
		"maxscript": {
			"title": "MAXScript",
			"owner": "RunDevelopment"
		},
		"mel": {
			"title": "MEL",
			"owner": "Golmote"
		},
		"mermaid": {
			"title": "Mermaid",
			"owner": "RunDevelopment"
		},
		"metafont": {
			"title": "METAFONT",
			"owner": "LaeriExNihilo"
		},
		"mizar": {
			"title": "Mizar",
			"owner": "Golmote"
		},
		"mongodb": {
			"title": "MongoDB",
			"owner": "airs0urce",
			"require": "javascript"
		},
		"monkey": {
			"title": "Monkey",
			"owner": "Golmote"
		},
		"moonscript": {
			"title": "MoonScript",
			"alias": "moon",
			"owner": "RunDevelopment"
		},
		"n1ql": {
			"title": "N1QL",
			"owner": "TMWilds"
		},
		"n4js": {
			"title": "N4JS",
			"require": "javascript",
			"optional": "jsdoc",
			"alias": "n4jsd",
			"owner": "bsmith-n4"
		},
		"nand2tetris-hdl": {
			"title": "Nand To Tetris HDL",
			"owner": "stephanmax"
		},
		"naniscript": {
			"title": "Naninovel Script",
			"owner": "Elringus",
			"alias": "nani"
		},
		"nasm": {
			"title": "NASM",
			"owner": "rbmj"
		},
		"neon": {
			"title": "NEON",
			"owner": "nette"
		},
		"nevod": {
			"title": "Nevod",
			"owner": "nezaboodka"
		},
		"nginx": {
			"title": "nginx",
			"owner": "volado"
		},
		"nim": {
			"title": "Nim",
			"owner": "Golmote"
		},
		"nix": {
			"title": "Nix",
			"owner": "Golmote"
		},
		"nsis": {
			"title": "NSIS",
			"owner": "idleberg"
		},
		"objectivec": {
			"title": "Objective-C",
			"require": "c",
			"alias": "objc",
			"owner": "uranusjr"
		},
		"ocaml": {
			"title": "OCaml",
			"owner": "Golmote"
		},
		"odin": {
			"title": "Odin",
			"owner": "edukisto"
		},
		"opencl": {
			"title": "OpenCL",
			"require": "c",
			"modify": [
				"c",
				"cpp"
			],
			"owner": "Milania1"
		},
		"openqasm": {
			"title": "OpenQasm",
			"alias": "qasm",
			"owner": "RunDevelopment"
		},
		"oz": {
			"title": "Oz",
			"owner": "Golmote"
		},
		"parigp": {
			"title": "PARI/GP",
			"owner": "Golmote"
		},
		"parser": {
			"title": "Parser",
			"require": "markup",
			"owner": "Golmote"
		},
		"pascal": {
			"title": "Pascal",
			"alias": "objectpascal",
			"aliasTitles": {
				"objectpascal": "Object Pascal"
			},
			"owner": "Golmote"
		},
		"pascaligo": {
			"title": "Pascaligo",
			"owner": "DefinitelyNotAGoat"
		},
		"psl": {
			"title": "PATROL Scripting Language",
			"owner": "bertysentry"
		},
		"pcaxis": {
			"title": "PC-Axis",
			"alias": "px",
			"owner": "RunDevelopment"
		},
		"peoplecode": {
			"title": "PeopleCode",
			"alias": "pcode",
			"owner": "RunDevelopment"
		},
		"perl": {
			"title": "Perl",
			"owner": "Golmote"
		},
		"php": {
			"title": "PHP",
			"require": "markup-templating",
			"owner": "milesj"
		},
		"phpdoc": {
			"title": "PHPDoc",
			"require": ["php", "javadoclike"],
			"modify": "php",
			"owner": "RunDevelopment"
		},
		"php-extras": {
			"title": "PHP Extras",
			"require": "php",
			"modify": "php",
			"owner": "milesj"
		},
		"plant-uml": {
			"title": "PlantUML",
			"alias": "plantuml",
			"owner": "RunDevelopment"
		},
		"plsql": {
			"title": "PL/SQL",
			"require": "sql",
			"owner": "Golmote"
		},
		"powerquery": {
			"title": "PowerQuery",
			"alias": ["pq", "mscript"],
			"owner": "peterbud"
		},
		"powershell": {
			"title": "PowerShell",
			"owner": "nauzilus"
		},
		"processing": {
			"title": "Processing",
			"require": "clike",
			"owner": "Golmote"
		},
		"prolog": {
			"title": "Prolog",
			"owner": "Golmote"
		},
		"promql": {
			"title": "PromQL",
			"owner": "arendjr"
		},
		"properties": {
			"title": ".properties",
			"owner": "Golmote"
		},
		"protobuf": {
			"title": "Protocol Buffers",
			"require": "clike",
			"owner": "just-boris"
		},
		"pug": {
			"title": "Pug",
			"require": ["markup", "javascript"],
			"optional": [
				"coffeescript",
				"ejs",
				"handlebars",
				"less",
				"livescript",
				"markdown",
				"scss",
				"stylus",
				"twig"
			],
			"owner": "Golmote"
		},
		"puppet": {
			"title": "Puppet",
			"owner": "Golmote"
		},
		"pure": {
			"title": "Pure",
			"optional": [
				"c",
				"cpp",
				"fortran"
			],
			"owner": "Golmote"
		},
		"purebasic": {
			"title": "PureBasic",
			"require": "clike",
			"alias": "pbfasm",
			"owner": "HeX0R101"
		},
		"purescript": {
			"title": "PureScript",
			"require": "haskell",
			"alias": "purs",
			"owner": "sriharshachilakapati"
		},
		"python": {
			"title": "Python",
			"alias": "py",
			"owner": "multipetros"
		},
		"qsharp": {
			"title": "Q#",
			"require": "clike",
			"alias": "qs",
			"owner": "fedonman"
		},
		"q": {
			"title": "Q (kdb+ database)",
			"owner": "Golmote"
		},
		"qml": {
			"title": "QML",
			"require": "javascript",
			"owner": "RunDevelopment"
		},
		"qore": {
			"title": "Qore",
			"require": "clike",
			"owner": "temnroegg"
		},
		"r": {
			"title": "R",
			"owner": "Golmote"
		},
		"racket": {
			"title": "Racket",
			"require": "scheme",
			"alias": "rkt",
			"owner": "RunDevelopment"
		},
		"cshtml": {
			"title": "Razor C#",
			"alias": "razor",
			"require": ["markup", "csharp"],
			"optional":[
				"css",
				"css-extras",
				"javascript",
				"js-extras"
			],
			"owner": "RunDevelopment"
		},
		"jsx": {
			"title": "React JSX",
			"require": ["markup", "javascript"],
			"optional": [
				"jsdoc",
				"js-extras",
				"js-templates"
			],
			"owner": "vkbansal"
		},
		"tsx": {
			"title": "React TSX",
			"require": ["jsx", "typescript"]
		},
		"reason": {
			"title": "Reason",
			"require": "clike",
			"owner": "Golmote"
		},
		"regex": {
			"title": "Regex",
			"owner": "RunDevelopment"
		},
		"rego": {
			"title": "Rego",
			"owner": "JordanSh"
		},
		"renpy": {
			"title": "Ren'py",
			"alias": "rpy",
			"owner": "HyuchiaDiego"
		},
		"rescript": {
			"title": "ReScript",
			"alias": "res",
			"owner": "vmarcosp"
		},
		"rest": {
			"title": "reST (reStructuredText)",
			"owner": "Golmote"
		},
		"rip": {
			"title": "Rip",
			"owner": "ravinggenius"
		},
		"roboconf": {
			"title": "Roboconf",
			"owner": "Golmote"
		},
		"robotframework": {
			"title": "Robot Framework",
			"alias": "robot",
			"owner": "RunDevelopment"
		},
		"ruby": {
			"title": "Ruby",
			"require": "clike",
			"alias": "rb",
			"owner": "samflores"
		},
		"rust": {
			"title": "Rust",
			"owner": "Golmote"
		},
		"sas": {
			"title": "SAS",
			"optional": ["groovy", "lua", "sql"],
			"owner": "Golmote"
		},
		"sass": {
			"title": "Sass (Sass)",
			"require": "css",
			"optional": "css-extras",
			"owner": "Golmote"
		},
		"scss": {
			"title": "Sass (SCSS)",
			"require": "css",
			"optional": "css-extras",
			"owner": "MoOx"
		},
		"scala": {
			"title": "Scala",
			"require": "java",
			"owner": "jozic"
		},
		"scheme": {
			"title": "Scheme",
			"owner": "bacchus123"
		},
		"shell-session": {
			"title": "Shell session",
			"require": "bash",
			"alias": ["sh-session", "shellsession"],
			"owner": "RunDevelopment"
		},
		"smali": {
			"title": "Smali",
			"owner": "RunDevelopment"
		},
		"smalltalk": {
			"title": "Smalltalk",
			"owner": "Golmote"
		},
		"smarty": {
			"title": "Smarty",
			"require": "markup-templating",
			"optional": "php",
			"owner": "Golmote"
		},
		"sml": {
			"title": "SML",
			"alias": "smlnj",
			"aliasTitles": {
				"smlnj": "SML/NJ"
			},
			"owner": "RunDevelopment"
		},
		"solidity": {
			"title": "Solidity (Ethereum)",
			"alias": "sol",
			"require": "clike",
			"owner": "glachaud"
		},
		"solution-file": {
			"title": "Solution file",
			"alias": "sln",
			"owner": "RunDevelopment"
		},
		"soy": {
			"title": "Soy (Closure Template)",
			"require": "markup-templating",
			"owner": "Golmote"
		},
		"sparql": {
			"title": "SPARQL",
			"require": "turtle",
			"owner": "Triply-Dev",
			"alias": "rq"
		},
		"splunk-spl": {
			"title": "Splunk SPL",
			"owner": "RunDevelopment"
		},
		"sqf": {
			"title": "SQF: Status Quo Function (Arma 3)",
			"require": "clike",
			"owner": "RunDevelopment"
		},
		"sql": {
			"title": "SQL",
			"owner": "multipetros"
		},
		"squirrel": {
			"title": "Squirrel",
			"require": "clike",
			"owner": "RunDevelopment"
		},
		"stan": {
			"title": "Stan",
			"owner": "RunDevelopment"
		},
		"stata": {
			"title": "Stata Ado",
			"require": ["mata", "java", "python"],
			"owner": "RunDevelopment"
		},
		"iecst": {
			"title": "Structured Text (IEC 61131-3)",
			"owner": "serhioromano"
		},
		"stylus": {
			"title": "Stylus",
			"owner": "vkbansal"
		},
		"supercollider": {
			"title": "SuperCollider",
			"alias": "sclang",
			"owner": "RunDevelopment"
		},
		"swift": {
			"title": "Swift",
			"owner": "chrischares"
		},
		"systemd": {
			"title": "Systemd configuration file",
			"owner": "RunDevelopment"
		},
		"t4-templating": {
			"title": "T4 templating",
			"owner": "RunDevelopment"
		},
		"t4-cs": {
			"title": "T4 Text Templates (C#)",
			"require": ["t4-templating", "csharp"],
			"alias": "t4",
			"owner": "RunDevelopment"
		},
		"t4-vb": {
			"title": "T4 Text Templates (VB)",
			"require": ["t4-templating", "vbnet"],
			"owner": "RunDevelopment"
		},
		"tap": {
			"title": "TAP",
			"owner": "isaacs",
			"require": "yaml"
		},
		"tcl": {
			"title": "Tcl",
			"owner": "PeterChaplin"
		},
		"tt2": {
			"title": "Template Toolkit 2",
			"require": ["clike", "markup-templating"],
			"owner": "gflohr"
		},
		"textile": {
			"title": "Textile",
			"require": "markup",
			"optional": "css",
			"owner": "Golmote"
		},
		"toml": {
			"title": "TOML",
			"owner": "RunDevelopment"
		},
		"tremor": {
			"title": "Tremor",
			"alias": [
				"trickle",
				"troy"
			],
			"owner": "darach",
			"aliasTitles": {
				"trickle": "trickle",
				"troy": "troy"
			}
		},
		"turtle": {
			"title": "Turtle",
			"alias": "trig",
			"aliasTitles": {
				"trig": "TriG"
			},
			"owner": "jakubklimek"
		},
		"twig": {
			"title": "Twig",
			"require": "markup-templating",
			"owner": "brandonkelly"
		},
		"typescript": {
			"title": "TypeScript",
			"require": "javascript",
			"optional": "js-templates",
			"alias": "ts",
			"owner": "vkbansal"
		},
		"typoscript": {
			"title": "TypoScript",
			"alias": "tsconfig",
			"aliasTitles": {
				"tsconfig": "TSConfig"
			},
			"owner": "dkern"
		},
		"unrealscript": {
			"title": "UnrealScript",
			"alias": ["uscript", "uc"],
			"owner": "RunDevelopment"
		},
		"uorazor": {
			"title": "UO Razor Script",
			"owner": "jaseowns"
		},
		"uri": {
			"title": "URI",
			"alias": "url",
			"aliasTitles": {
				"url": "URL"
			},
			"owner": "RunDevelopment"
		},
		"v": {
			"title": "V",
			"require": "clike",
			"owner": "taggon"
		},
		"vala": {
			"title": "Vala",
			"require": "clike",
			"optional": "regex",
			"owner": "TemplarVolk"
		},
		"vbnet": {
			"title": "VB.Net",
			"require": "basic",
			"owner": "Bigsby"
		},
		"velocity": {
			"title": "Velocity",
			"require": "markup",
			"owner": "Golmote"
		},
		"verilog": {
			"title": "Verilog",
			"owner": "a-rey"
		},
		"vhdl": {
			"title": "VHDL",
			"owner": "a-rey"
		},
		"vim": {
			"title": "vim",
			"owner": "westonganger"
		},
		"visual-basic": {
			"title": "Visual Basic",
			"alias": ["vb", "vba"],
			"aliasTitles": {
				"vba": "VBA"
			},
			"owner": "Golmote"
		},
		"warpscript": {
			"title": "WarpScript",
			"owner": "RunDevelopment"
		},
		"wasm": {
			"title": "WebAssembly",
			"owner": "Golmote"
		},
		"web-idl": {
			"title": "Web IDL",
			"alias": "webidl",
			"owner": "RunDevelopment"
		},
		"wgsl": {
			"title": "WGSL",
			"owner": "Dr4gonthree"
		},
		"wiki": {
			"title": "Wiki markup",
			"require": "markup",
			"owner": "Golmote"
		},
		"wolfram": {
			"title": "Wolfram language",
			"alias": ["mathematica", "nb", "wl"],
			"aliasTitles": {
				"mathematica": "Mathematica",
				"nb": "Mathematica Notebook"
			},
			"owner": "msollami"
		},
		"wren": {
			"title": "Wren",
			"owner": "clsource"
		},
		"xeora": {
			"title": "Xeora",
			"require": "markup",
			"alias": "xeoracube",
			"aliasTitles": {
				"xeoracube": "XeoraCube"
			},
			"owner": "freakmaxi"
		},
		"xml-doc": {
			"title": "XML doc (.net)",
			"require": "markup",
			"modify": ["csharp", "fsharp", "vbnet"],
			"owner": "RunDevelopment"
		},
		"xojo": {
			"title": "Xojo (REALbasic)",
			"owner": "Golmote"
		},
		"xquery": {
			"title": "XQuery",
			"require": "markup",
			"owner": "Golmote"
		},
		"yaml": {
			"title": "YAML",
			"alias": "yml",
			"owner": "hason"
		},
		"yang": {
			"title": "YANG",
			"owner": "RunDevelopment"
		},
		"zig": {
			"title": "Zig",
			"owner": "RunDevelopment"
		}
	},
	"plugins": {
		"meta": {
			"path": "plugins/{id}/prism-{id}",
			"link": "plugins/{id}/"
		},
		"line-highlight": {
			"title": "Line Highlight",
			"description": "Highlights specific lines and/or line ranges."
		},
		"line-numbers": {
			"title": "Line Numbers",
			"description": "Line number at the beginning of code lines.",
			"owner": "kuba-kubula"
		},
		"show-invisibles": {
			"title": "Show Invisibles",
			"description": "Show hidden characters such as tabs and line breaks.",
			"optional": [
				"autolinker",
				"data-uri-highlight"
			]
		},
		"autolinker": {
			"title": "Autolinker",
			"description": "Converts URLs and emails in code to clickable links. Parses Markdown links in comments."
		},
		"wpd": {
			"title": "WebPlatform Docs",
			"description": "Makes tokens link to <a href=\"https://webplatform.github.io/docs/\">WebPlatform.org documentation</a>. The links open in a new tab."
		},
		"custom-class": {
			"title": "Custom Class",
			"description": "This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",
			"owner": "dvkndn",
			"noCSS": true
		},
		"file-highlight": {
			"title": "File Highlight",
			"description": "Fetch external files and highlight them with Prism. Used on the Prism website itself.",
			"noCSS": true
		},
		"show-language": {
			"title": "Show Language",
			"description": "Display the highlighted language in code blocks (inline code does not show the label).",
			"owner": "nauzilus",
			"noCSS": true,
			"require": "toolbar"
		},
		"jsonp-highlight": {
			"title": "JSONP Highlight",
			"description": "Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",
			"noCSS": true,
			"owner": "nauzilus"
		},
		"highlight-keywords": {
			"title": "Highlight Keywords",
			"description": "Adds special CSS classes for each keyword for fine-grained highlighting.",
			"owner": "vkbansal",
			"noCSS": true
		},
		"remove-initial-line-feed": {
			"title": "Remove initial line feed",
			"description": "Removes the initial line feed in code blocks.",
			"owner": "Golmote",
			"noCSS": true
		},
		"inline-color": {
			"title": "Inline color",
			"description": "Adds a small inline preview for colors in style sheets.",
			"require": "css-extras",
			"owner": "RunDevelopment"
		},
		"previewers": {
			"title": "Previewers",
			"description": "Previewers for angles, colors, gradients, easing and time.",
			"require": "css-extras",
			"owner": "Golmote"
		},
		"autoloader": {
			"title": "Autoloader",
			"description": "Automatically loads the needed languages to highlight the code blocks.",
			"owner": "Golmote",
			"noCSS": true
		},
		"keep-markup": {
			"title": "Keep Markup",
			"description": "Prevents custom markup from being dropped out during highlighting.",
			"owner": "Golmote",
			"optional": "normalize-whitespace",
			"noCSS": true
		},
		"command-line": {
			"title": "Command Line",
			"description": "Display a command line with a prompt and, optionally, the output/response from the commands.",
			"owner": "chriswells0"
		},
		"unescaped-markup": {
			"title": "Unescaped Markup",
			"description": "Write markup without having to escape anything."
		},
		"normalize-whitespace": {
			"title": "Normalize Whitespace",
			"description": "Supports multiple operations to normalize whitespace in code blocks.",
			"owner": "zeitgeist87",
			"optional": "unescaped-markup",
			"noCSS": true
		},
		"data-uri-highlight": {
			"title": "Data-URI Highlight",
			"description": "Highlights data-URI contents.",
			"owner": "Golmote",
			"noCSS": true
		},
		"toolbar": {
			"title": "Toolbar",
			"description": "Attach a toolbar for plugins to easily register buttons on the top of a code block.",
			"owner": "mAAdhaTTah"
		},
		"copy-to-clipboard": {
			"title": "Copy to Clipboard Button",
			"description": "Add a button that copies the code block to the clipboard when clicked.",
			"owner": "mAAdhaTTah",
			"require": "toolbar",
			"noCSS": true
		},
		"download-button": {
			"title": "Download Button",
			"description": "A button in the toolbar of a code block adding a convenient way to download a code file.",
			"owner": "Golmote",
			"require": "toolbar",
			"noCSS": true
		},
		"match-braces": {
			"title": "Match braces",
			"description": "Highlights matching braces.",
			"owner": "RunDevelopment"
		},
		"diff-highlight": {
			"title": "Diff Highlight",
			"description": "Highlights the code inside diff blocks.",
			"owner": "RunDevelopment",
			"require": "diff"
		},
		"filter-highlight-all": {
			"title": "Filter highlightAll",
			"description": "Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",
			"owner": "RunDevelopment",
			"noCSS": true
		},
		"treeview": {
			"title": "Treeview",
			"description": "A language with special styles to highlight file system tree structures.",
			"owner": "Golmote"
		}
	}
}
D	G`xconst components = require('../components.js');
const getLoader = require('../dependencies');


/**
 * The set of all languages which have been loaded using the below function.
 *
 * @type {Set<string>}
 */
const loadedLanguages = new Set();

/**
 * Loads the given languages and adds them to the current Prism instance.
 *
 * If no languages are provided, __all__ Prism languages will be loaded.
 *
 * @param {string|string[]} [languages]
 * @returns {void}
 */
function loadLanguages(languages) {
	if (languages === undefined) {
		languages = Object.keys(components.languages).filter(l => l != 'meta');
	} else if (!Array.isArray(languages)) {
		languages = [languages];
	}

	// the user might have loaded languages via some other way or used `prism.js` which already includes some
	// we don't need to validate the ids because `getLoader` will ignore invalid ones
	const loaded = [...loadedLanguages, ...Object.keys(Prism.languages)];

	getLoader(components, languages, loaded).load(lang => {
		if (!(lang in components.languages)) {
			if (!loadLanguages.silent) {
				console.warn('Language does not exist: ' + lang);
			}
			return;
		}

		const pathToLanguage = './prism-' + lang;

		// remove from require cache and from Prism
		delete require.cache[require.resolve(pathToLanguage)];
		delete Prism.languages[lang];

		require(pathToLanguage);

		loadedLanguages.add(lang);
	});
}

/**
 * Set this to `true` to prevent all warning messages `loadLanguages` logs.
 */
loadLanguages.silent = false;

module.exports = loadLanguages;
x!APrism.languages.abap = {
	'comment': /^\*.*/m,
	'string': /(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
	'string-template': {
		pattern: /([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,
		lookbehind: true,
		alias: 'string'
	},
	/* End Of Line comments should not interfere with strings when the
	quote character occurs within them. We assume a string being highlighted
	inside an EOL comment is more acceptable than the opposite.
	*/
	'eol-comment': {
		pattern: /(^|\s)".*/m,
		lookbehind: true,
		alias: 'comment'
	},
	'keyword': {
		pattern: /(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,
		lookbehind: true
	},
	/* Numbers can be only integers. Decimal or Hex appear only as strings */
	'number': /\b\d+\b/,
	/* Operators must always be surrounded by whitespace, they cannot be put
	adjacent to operands.
	*/
	'operator': {
		pattern: /(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,
		lookbehind: true
	},
	'string-operator': {
		pattern: /(\s)&&?(?=\s)/,
		lookbehind: true,
		/* The official editor highlights */
		alias: 'keyword'
	},
	'token-operator': [{
		/* Special operators used to access structure components, class methods/attributes, etc. */
		pattern: /(\w)(?:->?|=>|[~|{}])(?=\w)/,
		lookbehind: true,
		alias: 'punctuation'
	}, {
		/* Special tokens used do delimit string templates */
		pattern: /[|{}]/,
		alias: 'punctuation'
	}],
	'punctuation': /[,.:()]/
};
߱xPrism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/};JxQ(function (Prism) {

	var coreRules = '(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)';

	Prism.languages.abnf = {
		'comment': /;.*/,
		'string': {
			pattern: /(?:%[is])?"[^"\n\r]*"/,
			greedy: true,
			inside: {
				'punctuation': /^%[is]/
			}
		},
		'range': {
			pattern: /%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,
			alias: 'number'
		},
		'terminal': {
			pattern: /%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,
			alias: 'number'
		},
		'repetition': {
			pattern: /(^|[^\w-])(?:\d*\*\d*|\d+)/,
			lookbehind: true,
			alias: 'operator'
		},
		'definition': {
			pattern: /(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,
			lookbehind: true,
			alias: 'keyword',
			inside: {
				'punctuation': /<|>/
			}
		},
		'core-rule': {
			pattern: RegExp('(?:(^|[^<\\w-])' + coreRules + '|<' + coreRules + '>)(?![\\w-])', 'i'),
			lookbehind: true,
			alias: ['rule', 'constant'],
			inside: {
				'punctuation': /<|>/
			}
		},
		'rule': {
			pattern: /(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,
			lookbehind: true,
			inside: {
				'punctuation': /<|>/
			}
		},
		'operator': /=\/?|\//,
		'punctuation': /[()\[\]]/
	};

}(Prism));
2P!7x!function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(Prism);#*<x<Prism.languages.actionscript = Prism.languages.extend('javascript', {
	'keyword': /\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,
	'operator': /\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/
});
Prism.languages.actionscript['class-name'].alias = 'function';

// doesn't work with AS because AS is too complex
delete Prism.languages.actionscript['parameter'];
delete Prism.languages.actionscript['literal-property'];

if (Prism.languages.markup) {
	Prism.languages.insertBefore('actionscript', 'string', {
		'xml': {
			pattern: /(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,
			lookbehind: true,
			inside: Prism.languages.markup
		}
	});
}
f]5xPPrism.languages.actionscript=Prism.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript["class-name"].alias="function",delete Prism.languages.actionscript.parameter,delete Prism.languages.actionscript["literal-property"],Prism.languages.markup&&Prism.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:Prism.languages.markup}});8D<>xPrism.languages.ada = {
	'comment': /--.*/,
	'string': /"(?:""|[^"\r\f\n])*"/,
	'number': [
		{
			pattern: /\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i
		},
		{
			pattern: /\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i
		}
	],
	'attribute': {
		pattern: /\b'\w+/,
		alias: 'attr-name'
	},
	'keyword': /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,
	'boolean': /\b(?:false|true)\b/i,
	'operator': /<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,
	'punctuation': /\.\.?|[,;():]/,
	'char': /'.'/,
	'variable': /\b[a-z](?:\w)*\b/i
};
X8xsPrism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i};Q5x\(function (Prism) {

	Prism.languages.agda = {
		'comment': /\{-[\s\S]*?(?:-\}|$)|--.*/,
		'string': {
			pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
			greedy: true,
		},
		'punctuation': /[(){}⦃⦄.;@]/,
		'class-name': {
			pattern: /((?:data|record) +)\S+/,
			lookbehind: true,
		},
		'function': {
			pattern: /(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,
			lookbehind: true,
		},
		'operator': {
			pattern: /(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,
			lookbehind: true,
		},
		'keyword': /\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/,
	};
}(Prism));
x+/-x!!function(t){t.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}}(Prism); x'// based on https://github.com/microsoft/AL/blob/master/grammar/alsyntax.tmlanguage

Prism.languages.al = {
	'comment': /\/\/.*|\/\*[\s\S]*?\*\//,
	'string': {
		pattern: /'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,
		greedy: true
	},
	'function': {
		pattern: /(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,
		lookbehind: true
	},
	'keyword': [
		// keywords
		/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,
		// objects and metadata that are used like keywords
		/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i
	],
	'number': /\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,
	'boolean': /\b(?:false|true)\b/i,
	'variable': /\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,
	'class-name': /\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,
	'operator': /\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,
	'punctuation': /[()\[\]{}:.;,]/
};
dȺx:
Prism.languages.al={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},function:{pattern:/(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,lookbehind:!0},keyword:[/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i],number:/\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,boolean:/\b(?:false|true)\b/i,variable:/\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,"class-name":/\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,operator:/\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,punctuation:/[()\[\]{}:.;,]/};&bx,Prism.languages.antlr4 = {
	'comment': /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
	'string': {
		pattern: /'(?:\\.|[^\\'\r\n])*'/,
		greedy: true
	},
	'character-class': {
		pattern: /\[(?:\\.|[^\\\]\r\n])*\]/,
		greedy: true,
		alias: 'regex',
		inside: {
			'range': {
				pattern: /([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,
				lookbehind: true,
				alias: 'punctuation'
			},
			'escape': /\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,
			'punctuation': /[\[\]]/
		}
	},
	'action': {
		pattern: /\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,
		greedy: true,
		inside: {
			'content': {
				// this might be C, C++, Python, Java, C#, or any other language ANTLR4 compiles to
				pattern: /(\{)[\s\S]+(?=\})/,
				lookbehind: true
			},
			'punctuation': /[{}]/
		}
	},
	'command': {
		pattern: /(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,
		lookbehind: true,
		inside: {
			'function': /\b\w+(?=\s*(?:[,(]|$))/,
			'punctuation': /[,()]/
		}
	},
	'annotation': {
		pattern: /@\w+(?:::\w+)*/,
		alias: 'keyword'
	},
	'label': {
		pattern: /#[ \t]*\w+/,
		alias: 'punctuation'
	},
	'keyword': /\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,
	'definition': [
		{
			pattern: /\b[a-z]\w*(?=\s*:)/,
			alias: ['rule', 'class-name']
		},
		{
			pattern: /\b[A-Z]\w*(?=\s*:)/,
			alias: ['token', 'constant']
		},
	],
	'constant': /\b[A-Z][A-Z_]*\b/,
	'operator': /\.\.|->|[|~]|[*+?]\??/,
	'punctuation': /[;:()=]/
};

Prism.languages.g4 = Prism.languages.antlr4;
׳KxJPrism.languages.antlr4={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,string:{pattern:/'(?:\\.|[^\\'\r\n])*'/,greedy:!0},"character-class":{pattern:/\[(?:\\.|[^\\\]\r\n])*\]/,greedy:!0,alias:"regex",inside:{range:{pattern:/([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,lookbehind:!0,alias:"punctuation"},escape:/\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,punctuation:/[\[\]]/}},action:{pattern:/\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,greedy:!0,inside:{content:{pattern:/(\{)[\s\S]+(?=\})/,lookbehind:!0},punctuation:/[{}]/}},command:{pattern:/(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,lookbehind:!0,inside:{function:/\b\w+(?=\s*(?:[,(]|$))/,punctuation:/[,()]/}},annotation:{pattern:/@\w+(?:::\w+)*/,alias:"keyword"},label:{pattern:/#[ \t]*\w+/,alias:"punctuation"},keyword:/\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,definition:[{pattern:/\b[a-z]\w*(?=\s*:)/,alias:["rule","class-name"]},{pattern:/\b[A-Z]\w*(?=\s*:)/,alias:["token","constant"]}],constant:/\b[A-Z][A-Z_]*\b/,operator:/\.\.|->|[|~]|[*+?]\??/,punctuation:/[;:()=]/},Prism.languages.g4=Prism.languages.antlr4;СCx  Prism.languages.apacheconf = {
	'comment': /#.*/,
	'directive-inline': {
		pattern: /(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,
		lookbehind: true,
		alias: 'property'
	},
	'directive-block': {
		pattern: /<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,
		inside: {
			'directive-block': {
				pattern: /^<\/?\w+/,
				inside: {
					'punctuation': /^<\/?/
				},
				alias: 'tag'
			},
			'directive-block-parameter': {
				pattern: /.*[^>]/,
				inside: {
					'punctuation': /:/,
					'string': {
						pattern: /("|').*\1/,
						inside: {
							'variable': /[$%]\{?(?:\w\.?[-+:]?)+\}?/
						}
					}
				},
				alias: 'attr-value'
			},
			'punctuation': />/
		},
		alias: 'tag'
	},
	'directive-flags': {
		pattern: /\[(?:[\w=],?)+\]/,
		alias: 'keyword'
	},
	'string': {
		pattern: /("|').*\1/,
		inside: {
			'variable': /[$%]\{?(?:\w\.?[-+:]?)+\}?/
		}
	},
	'variable': /[$%]\{?(?:\w\.?[-+:]?)+\}?/,
	'regex': /\^?.*\$|\^.*\$?/
};
Px
Prism.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/};F~x[
(function (Prism) {

	var keywords = /\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i;

	var className = /\b(?:(?=[a-z_]\w*\s*[<\[])|(?!<keyword>))[A-Z_]\w*(?:\s*\.\s*[A-Z_]\w*)*\b(?:\s*(?:\[\s*\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*/.source
		.replace(/<keyword>/g, function () { return keywords.source; });
	/** @param {string} pattern */
	function insertClassName(pattern) {
		return RegExp(pattern.replace(/<CLASS-NAME>/g, function () { return className; }), 'i');
	}

	var classNameInside = {
		'keyword': keywords,
		'punctuation': /[()\[\]{};,:.<>]/
	};

	Prism.languages.apex = {
		'comment': Prism.languages.clike.comment,
		'string': Prism.languages.clike.string,
		'sql': {
			pattern: /((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,
			lookbehind: true,
			greedy: true,
			alias: 'language-sql',
			inside: Prism.languages.sql
		},

		'annotation': {
			pattern: /@\w+\b/,
			alias: 'punctuation'
		},
		'class-name': [
			{
				pattern: insertClassName(/(\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\s+\w+\s+on)\s+)<CLASS-NAME>/.source),
				lookbehind: true,
				inside: classNameInside
			},
			{
				// cast
				pattern: insertClassName(/(\(\s*)<CLASS-NAME>(?=\s*\)\s*[\w(])/.source),
				lookbehind: true,
				inside: classNameInside
			},
			{
				// variable/parameter declaration and return types
				pattern: insertClassName(/<CLASS-NAME>(?=\s*\w+\s*[;=,(){:])/.source),
				inside: classNameInside
			}
		],
		'trigger': {
			pattern: /(\btrigger\s+)\w+\b/i,
			lookbehind: true,
			alias: 'class-name'
		},
		'keyword': keywords,
		'function': /\b[a-z_]\w*(?=\s*\()/i,

		'boolean': /\b(?:false|true)\b/i,

		'number': /(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,
		'operator': /[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<<?=?|>{1,3}=?/,
		'punctuation': /[()\[\]{};,.]/
	};

}(Prism));
x!function(e){var t=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,n="\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!<keyword>))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*".replace(/<keyword>/g,(function(){return t.source}));function i(e){return RegExp(e.replace(/<CLASS-NAME>/g,(function(){return n})),"i")}var a={keyword:t,punctuation:/[()\[\]{};,:.<>]/};e.languages.apex={comment:e.languages.clike.comment,string:e.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:e.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i("(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)<CLASS-NAME>"),lookbehind:!0,inside:a},{pattern:i("(\\(\\s*)<CLASS-NAME>(?=\\s*\\)\\s*[\\w(])"),lookbehind:!0,inside:a},{pattern:i("<CLASS-NAME>(?=\\s*\\w+\\s*[;=,(){:])"),inside:a}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:t,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<<?=?|>{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(Prism);ƅ
7x~Prism.languages.apl = {
	'comment': /(?:⍝|#[! ]).*$/m,
	'string': {
		pattern: /'(?:[^'\r\n]|'')*'/,
		greedy: true
	},
	'number': /¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,
	'statement': /:[A-Z][a-z][A-Za-z]*\b/,
	'system-function': {
		pattern: /⎕[A-Z]+/i,
		alias: 'function'
	},
	'constant': /[⍬⌾#⎕⍞]/,
	'function': /[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,
	'monadic-operator': {
		pattern: /[\\\/⌿⍀¨⍨⌶&∥]/,
		alias: 'operator'
	},
	'dyadic-operator': {
		pattern: /[.⍣⍠⍤∘⌸@⌺⍥]/,
		alias: 'operator'
	},
	'assignment': {
		pattern: /←/,
		alias: 'keyword'
	},
	'punctuation': /[\[;\]()◇⋄]/,
	'dfn': {
		pattern: /[{}⍺⍵⍶⍹∇⍫:]/,
		alias: 'builtin'
	}
};
Kd0xPrism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,function:/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺⍥]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}};Z!txBPrism.languages.applescript = {
	'comment': [
		// Allow one level of nesting
		/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,
		/--.+/,
		/#.+/
	],
	'string': /"(?:\\.|[^"\\\r\n])*"/,
	'number': /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,
	'operator': [
		/[&=≠≤≥*+\-\/÷^]|[<>]=?/,
		/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/
	],
	'keyword': /\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,
	'class-name': /\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,
	'punctuation': /[{}():,¬«»《》]/
};
PPDnxPrism.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class-name":/\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,punctuation:/[{}():,¬«»《》]/};屻QxPrism.languages.aql = {
	'comment': /\/\/.*|\/\*[\s\S]*?\*\//,
	'property': {
		pattern: /([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,
		lookbehind: true,
		greedy: true
	},
	'string': {
		pattern: /(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,
		greedy: true
	},
	'identifier': {
		pattern: /([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,
		greedy: true
	},
	'variable': /@@?\w+/,
	'keyword': [
		{
			pattern: /(\bWITH\s+)COUNT(?=\s+INTO\b)/i,
			lookbehind: true
		},
		/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,
		// pseudo keywords get a lookbehind to avoid false positives
		{
			pattern: /(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,
			lookbehind: true
		},
		{
			pattern: /(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,
			lookbehind: true
		},
		{
			pattern: /\bOPTIONS(?=\s*\{)/i
		}
	],
	'function': /\b(?!\d)\w+(?=\s*\()/,
	'boolean': /\b(?:false|true)\b/i,
	'range': {
		pattern: /\.\./,
		alias: 'operator'
	},
	'number': [
		/\b0b[01]+/i,
		/\b0x[0-9a-f]+/i,
		/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i
	],
	'operator': /\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,
	'punctuation': /::|[?.:,;()[\]{}]/
};
k9AxPrism.languages.aql={comment:/\/\/.*|\/\*[\s\S]*?\*\//,property:{pattern:/([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},identifier:{pattern:/([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},variable:/@@?\w+/,keyword:[{pattern:/(\bWITH\s+)COUNT(?=\s+INTO\b)/i,lookbehind:!0},/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,{pattern:/(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,lookbehind:!0},{pattern:/(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,lookbehind:!0},{pattern:/\bOPTIONS(?=\s*\{)/i}],function:/\b(?!\d)\w+(?=\s*\()/,boolean:/\b(?:false|true)\b/i,range:{pattern:/\.\./,alias:"operator"},number:[/\b0b[01]+/i,/\b0x[0-9a-f]+/i,/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i],operator:/\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,punctuation:/::|[?.:,;()[\]{}]/};SxlPrism.languages.arduino = Prism.languages.extend('cpp', {
	'keyword': /\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,
	'constant': /\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,
	'builtin': /\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/
});

Prism.languages.ino = Prism.languages.arduino;
A92xTPrism.languages.arduino=Prism.languages.extend("cpp",{keyword:/\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,constant:/\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,builtin:/\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/}),Prism.languages.ino=Prism.languages.arduino;q6ιx Prism.languages.arff = {
	'comment': /%.*/,
	'string': {
		pattern: /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},
	'keyword': /@(?:attribute|data|end|relation)\b/i,
	'number': /\b\d+(?:\.\d+)?\b/,
	'punctuation': /[{},]/
};
.@Fx ?Prism.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/};Aζ[xIPrism.languages.armasm = {
	'comment': {
		pattern: /;.*/,
		greedy: true
	},
	'string': {
		pattern: /"(?:[^"\r\n]|"")*"/,
		greedy: true,
		inside: {
			'variable': {
				pattern: /((?:^|[^$])(?:\${2})*)\$\w+/,
				lookbehind: true
			}
		}
	},
	'char': {
		pattern: /'(?:[^'\r\n]{0,4}|'')'/,
		greedy: true
	},
	'version-symbol': {
		pattern: /\|[\w@]+\|/,
		greedy: true,
		alias: 'property'
	},

	'boolean': /\b(?:FALSE|TRUE)\b/,
	'directive': {
		pattern: /\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,
		alias: 'property'
	},
	'instruction': {
		pattern: /((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,
		lookbehind: true,
		alias: 'keyword'
	},
	'variable': /\$\w+/,

	'number': /(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,

	'register': {
		pattern: /\b(?:r\d|lr)\b/,
		alias: 'symbol'
	},

	'operator': /<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,
	'punctuation': /[()[\],]/
};

Prism.languages['arm-asm'] = Prism.languages.armasm;
`޸OxPrism.languages.armasm={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"/,greedy:!0,inside:{variable:{pattern:/((?:^|[^$])(?:\${2})*)\$\w+/,lookbehind:!0}}},char:{pattern:/'(?:[^'\r\n]{0,4}|'')'/,greedy:!0},"version-symbol":{pattern:/\|[\w@]+\|/,greedy:!0,alias:"property"},boolean:/\b(?:FALSE|TRUE)\b/,directive:{pattern:/\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,alias:"property"},instruction:{pattern:/((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,lookbehind:!0,alias:"keyword"},variable:/\$\w+/,number:/(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,register:{pattern:/\b(?:r\d|lr)\b/,alias:"symbol"},operator:/<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,punctuation:/[()[\],]/},Prism.languages["arm-asm"]=Prism.languages.armasm;zx
(function (Prism) {
	/**
	 * @param {string} lang
	 * @param {string} pattern
	 */
	var createLanguageString = function (lang, pattern) {
		return {
			pattern: RegExp(/\{!/.source + '(?:' + (pattern || lang) + ')' + /$[\s\S]*\}/.source, 'm'),
			greedy: true,
			inside: {
				'embedded': {
					pattern: /(^\{!\w+\b)[\s\S]+(?=\}$)/,
					lookbehind: true,
					alias: 'language-' + lang,
					inside: Prism.languages[lang]
				},
				'string': /[\s\S]+/
			}
		};
	};

	Prism.languages.arturo = {
		'comment': {
			pattern: /;.*/,
			greedy: true
		},

		'character': {
			pattern: /`.`/,
			alias: 'char',
			greedy: true
		},

		'number': {
			pattern: /\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/,
		},

		'string': {
			pattern: /"(?:[^"\\\r\n]|\\.)*"/,
			greedy: true
		},

		'regex': {
			pattern: /\{\/.*?\/\}/,
			greedy: true
		},

		'html-string': createLanguageString('html'),
		'css-string': createLanguageString('css'),
		'js-string': createLanguageString('js'),
		'md-string': createLanguageString('md'),
		'sql-string': createLanguageString('sql'),
		'sh-string': createLanguageString('shell', 'sh'),

		'multistring': {
			pattern: /».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,
			alias: 'string',
			greedy: true
		},

		'label': {
			pattern: /\w+\b\??:/,
			alias: 'property'
		},

		'literal': {
			pattern: /'(?:\w+\b\??:?)/,
			alias: 'constant'
		},

		'type': {
			pattern: /:(?:\w+\b\??:?)/,
			alias: 'class-name'
		},

		'color': /#\w+/,

		'predicate': {
			pattern: /\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,
			alias: 'keyword'
		},

		'builtin-function': {
			pattern: /\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,
			alias: 'keyword'
		},

		'sugar': {
			pattern: /->|=>|\||::/,
			alias: 'operator'
		},

		'punctuation': /[()[\],]/,

		'symbol': {
			pattern: /<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/
		},

		'boolean': {
			pattern: /\b(?:false|maybe|true)\b/
		}
	};

	Prism.languages.art = Prism.languages['arturo'];
}(Prism));
b=x2!function(e){var a=function(a,t){return{pattern:RegExp("\\{!(?:"+(t||a)+")$[^]*\\}","m"),greedy:!0,inside:{embedded:{pattern:/(^\{!\w+\b)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-"+a,inside:e.languages[a]},string:/[\s\S]+/}}};e.languages.arturo={comment:{pattern:/;.*/,greedy:!0},character:{pattern:/`.`/,alias:"char",greedy:!0},number:{pattern:/\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/},string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},regex:{pattern:/\{\/.*?\/\}/,greedy:!0},"html-string":a("html"),"css-string":a("css"),"js-string":a("js"),"md-string":a("md"),"sql-string":a("sql"),"sh-string":a("shell","sh"),multistring:{pattern:/».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,alias:"string",greedy:!0},label:{pattern:/\w+\b\??:/,alias:"property"},literal:{pattern:/'(?:\w+\b\??:?)/,alias:"constant"},type:{pattern:/:(?:\w+\b\??:?)/,alias:"class-name"},color:/#\w+/,predicate:{pattern:/\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,alias:"keyword"},"builtin-function":{pattern:/\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,alias:"keyword"},sugar:{pattern:/->|=>|\||::/,alias:"operator"},punctuation:/[()[\],]/,symbol:{pattern:/<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/},boolean:{pattern:/\b(?:false|maybe|true)\b/}},e.languages.art=e.languages.arturo}(Prism);A{~x(function (Prism) {

	var attributes = {
		pattern: /(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,
		lookbehind: true,
		inside: {
			'quoted': {
				pattern: /([$`])(?:(?!\1)[^\\]|\\.)*\1/,
				inside: {
					'punctuation': /^[$`]|[$`]$/
				}
			},
			'interpreted': {
				pattern: /'(?:[^'\\]|\\.)*'/,
				inside: {
					'punctuation': /^'|'$/
					// See rest below
				}
			},
			'string': /"(?:[^"\\]|\\.)*"/,
			'variable': /\w+(?==)/,
			'punctuation': /^\[|\]$|,/,
			'operator': /=/,
			// The negative look-ahead prevents blank matches
			'attr-value': /(?!^\s+$).+/
		}
	};

	var asciidoc = Prism.languages.asciidoc = {
		'comment-block': {
			pattern: /^(\/{4,})$[\s\S]*?^\1/m,
			alias: 'comment'
		},
		'table': {
			pattern: /^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,
			inside: {
				'specifiers': {
					pattern: /(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,
					alias: 'attr-value'
				},
				'punctuation': {
					pattern: /(^|[^\\])[|!]=*/,
					lookbehind: true
				}
				// See rest below
			}
		},

		'passthrough-block': {
			pattern: /^(\+{4,})$[\s\S]*?^\1$/m,
			inside: {
				'punctuation': /^\++|\++$/
				// See rest below
			}
		},
		// Literal blocks and listing blocks
		'literal-block': {
			pattern: /^(-{4,}|\.{4,})$[\s\S]*?^\1$/m,
			inside: {
				'punctuation': /^(?:-+|\.+)|(?:-+|\.+)$/
				// See rest below
			}
		},
		// Sidebar blocks, quote blocks, example blocks and open blocks
		'other-block': {
			pattern: /^(--|\*{4,}|_{4,}|={4,})$[\s\S]*?^\1$/m,
			inside: {
				'punctuation': /^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/
				// See rest below
			}
		},

		// list-punctuation and list-label must appear before indented-block
		'list-punctuation': {
			pattern: /(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,
			lookbehind: true,
			alias: 'punctuation'
		},
		'list-label': {
			pattern: /(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,
			lookbehind: true,
			alias: 'symbol'
		},
		'indented-block': {
			pattern: /((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,
			lookbehind: true
		},

		'comment': /^\/\/.*/m,
		'title': {
			pattern: /^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,
			alias: 'important',
			inside: {
				'punctuation': /^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/
				// See rest below
			}
		},
		'attribute-entry': {
			pattern: /^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,
			alias: 'tag'
		},
		'attributes': attributes,
		'hr': {
			pattern: /^'{3,}$/m,
			alias: 'punctuation'
		},
		'page-break': {
			pattern: /^<{3,}$/m,
			alias: 'punctuation'
		},
		'admonition': {
			pattern: /^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,
			alias: 'keyword'
		},
		'callout': [
			{
				pattern: /(^[ \t]*)<?\d*>/m,
				lookbehind: true,
				alias: 'symbol'
			},
			{
				pattern: /<\d+>/,
				alias: 'symbol'
			}
		],
		'macro': {
			pattern: /\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
			inside: {
				'function': /^[a-z\d-]+(?=:)/,
				'punctuation': /^::?/,
				'attributes': {
					pattern: /(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
					inside: attributes.inside
				}
			}
		},
		'inline': {
			/*
			The initial look-behind prevents the highlighting of escaped quoted text.

			Quoted text can be multi-line but cannot span an empty line.
			All quoted text can have attributes before [foobar, 'foobar', baz="bar"].

			First, we handle the constrained quotes.
			Those must be bounded by non-word chars and cannot have spaces between the delimiter and the first char.
			They are, in order: _emphasis_, ``double quotes'', `single quotes', `monospace`, 'emphasis', *strong*, +monospace+ and #unquoted#

			Then we handle the unconstrained quotes.
			Those do not have the restrictions of the constrained quotes.
			They are, in order: __emphasis__, **strong**, ++monospace++, +++passthrough+++, ##unquoted##, $$passthrough$$, ~subscript~, ^superscript^, {attribute-reference}, [[anchor]], [[[bibliography anchor]]], <<xref>>, (((indexes))) and ((indexes))
			 */
			pattern: /(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,
			lookbehind: true,
			inside: {
				'attributes': attributes,
				'url': {
					pattern: /^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,
					inside: {
						'punctuation': /^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/
					}
				},
				'attribute-ref': {
					pattern: /^\{.+\}$/,
					inside: {
						'variable': {
							pattern: /(^\{)[a-z\d,+_-]+/,
							lookbehind: true
						},
						'operator': /^[=?!#%@$]|!(?=[:}])/,
						'punctuation': /^\{|\}$|::?/
					}
				},
				'italic': {
					pattern: /^(['_])[\s\S]+\1$/,
					inside: {
						'punctuation': /^(?:''?|__?)|(?:''?|__?)$/
					}
				},
				'bold': {
					pattern: /^\*[\s\S]+\*$/,
					inside: {
						punctuation: /^\*\*?|\*\*?$/
					}
				},
				'punctuation': /^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/
			}
		},
		'replacement': {
			pattern: /\((?:C|R|TM)\)/,
			alias: 'builtin'
		},
		'entity': /&#?[\da-z]{1,8};/i,
		'line-continuation': {
			pattern: /(^| )\+$/m,
			lookbehind: true,
			alias: 'punctuation'
		}
	};


	// Allow some nesting. There is no recursion though, so cloning should not be needed.

	function copyFromAsciiDoc(keys) {
		keys = keys.split(' ');

		var o = {};
		for (var i = 0, l = keys.length; i < l; i++) {
			o[keys[i]] = asciidoc[keys[i]];
		}
		return o;
	}

	attributes.inside['interpreted'].inside.rest = copyFromAsciiDoc('macro inline replacement entity');

	asciidoc['passthrough-block'].inside.rest = copyFromAsciiDoc('macro');

	asciidoc['literal-block'].inside.rest = copyFromAsciiDoc('callout');

	asciidoc['table'].inside.rest = copyFromAsciiDoc('comment-block passthrough-block literal-block other-block list-punctuation indented-block comment title attribute-entry attributes hr page-break admonition list-label callout macro inline replacement entity line-continuation');

	asciidoc['other-block'].inside.rest = copyFromAsciiDoc('table list-punctuation indented-block comment attribute-entry attributes hr page-break admonition list-label macro inline replacement entity line-continuation');

	asciidoc['title'].inside.rest = copyFromAsciiDoc('macro inline replacement entity');


	// Plugin to make entity title show the real entity, idea by Roman Komarov
	Prism.hooks.add('wrap', function (env) {
		if (env.type === 'entity') {
			env.attributes['title'] = env.content.replace(/&amp;/, '&');
		}
	});

	Prism.languages.adoc = Prism.languages.asciidoc;
}(Prism));
AM&xW!function(t){var n={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},i=t.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})$[\s\S]*?^\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)<?\d*>/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function e(t){for(var n={},e=0,a=(t=t.split(" ")).length;e<a;e++)n[t[e]]=i[t[e]];return n}n.inside.interpreted.inside.rest=e("macro inline replacement entity"),i["passthrough-block"].inside.rest=e("macro"),i["literal-block"].inside.rest=e("callout"),i.table.inside.rest=e("comment-block passthrough-block literal-block other-block list-punctuation indented-block comment title attribute-entry attributes hr page-break admonition list-label callout macro inline replacement entity line-continuation"),i["other-block"].inside.rest=e("table list-punctuation indented-block comment attribute-entry attributes hr page-break admonition list-label macro inline replacement entity line-continuation"),i.title.inside.rest=e("macro inline replacement entity"),t.hooks.add("wrap",(function(t){"entity"===t.type&&(t.attributes.title=t.content.replace(/&amp;/,"&"))})),t.languages.adoc=t.languages.asciidoc}(Prism);IͶ<x9Prism.languages.asm6502 = {
	'comment': /;.*/,
	'directive': {
		pattern: /\.\w+(?= )/,
		alias: 'property'
	},
	'string': /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
	'op-code': {
		pattern: /\b(?:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA|adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya)\b/,
		alias: 'keyword'
	},
	'hex-number': {
		pattern: /#?\$[\da-f]{1,4}\b/i,
		alias: 'number'
	},
	'binary-number': {
		pattern: /#?%[01]+\b/,
		alias: 'number'
	},
	'decimal-number': {
		pattern: /#?\b\d+\b/,
		alias: 'number'
	},
	'register': {
		pattern: /\b[xya]\b/i,
		alias: 'variable'
	},
	'punctuation': /[(),:]/
};
D6xaPrism.languages.asm6502={comment:/;.*/,directive:{pattern:/\.\w+(?= )/,alias:"property"},string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,"op-code":{pattern:/\b(?:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA|adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{1,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[xya]\b/i,alias:"variable"},punctuation:/[(),:]/};u)<ux\Prism.languages.asmatmel = {
	'comment': {
		pattern: /;.*/,
		greedy: true
	},
	'string': {
		pattern: /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},

	'constant': /\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,

	'directive': {
		pattern: /\.\w+(?= )/,
		alias: 'property'
	},
	'r-register': {
		pattern: /\br(?:\d|[12]\d|3[01])\b/,
		alias: 'variable'
	},
	'op-code': {
		pattern: /\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,
		alias: 'keyword'
	},
	'hex-number': {
		pattern: /#?\$[\da-f]{2,4}\b/i,
		alias: 'number'
	},
	'binary-number': {
		pattern: /#?%[01]+\b/,
		alias: 'number'
	},
	'decimal-number': {
		pattern: /#?\b\d+\b/,
		alias: 'number'
	},
	'register': {
		pattern: /\b[acznvshtixy]\b/i,
		alias: 'variable'
	},
	'operator': />>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,
	'punctuation': /[(),:]/
};
'lx9Prism.languages.asmatmel={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},constant:/\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,directive:{pattern:/\.\w+(?= )/,alias:"property"},"r-register":{pattern:/\br(?:\d|[12]\d|3[01])\b/,alias:"variable"},"op-code":{pattern:/\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{2,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[acznvshtixy]\b/i,alias:"variable"},operator:/>>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,punctuation:/[(),:]/};xZxVPrism.languages.aspnet = Prism.languages.extend('markup', {
	'page-directive': {
		pattern: /<%\s*@.*%>/,
		alias: 'tag',
		inside: {
			'page-directive': {
				pattern: /<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,
				alias: 'tag'
			},
			rest: Prism.languages.markup.tag.inside
		}
	},
	'directive': {
		pattern: /<%.*%>/,
		alias: 'tag',
		inside: {
			'directive': {
				pattern: /<%\s*?[$=%#:]{0,2}|%>/,
				alias: 'tag'
			},
			rest: Prism.languages.csharp
		}
	}
});
// Regexp copied from prism-markup, with a negative look-ahead added
Prism.languages.aspnet.tag.pattern = /<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/;

// match directives of attribute value foo="<% Bar %>"
Prism.languages.insertBefore('inside', 'punctuation', {
	'directive': Prism.languages.aspnet['directive']
}, Prism.languages.aspnet.tag.inside['attr-value']);

Prism.languages.insertBefore('aspnet', 'comment', {
	'asp-comment': {
		pattern: /<%--[\s\S]*?--%>/,
		alias: ['asp', 'comment']
	}
});

// script runat="server" contains csharp, not javascript
Prism.languages.insertBefore('aspnet', Prism.languages.javascript ? 'script' : 'tag', {
	'asp-script': {
		pattern: /(<script(?=.*runat=['"]?server\b)[^>]*>)[\s\S]*?(?=<\/script>)/i,
		lookbehind: true,
		alias: ['asp', 'script'],
		inside: Prism.languages.csharp || {}
	}
});
"%DxHPrism.languages.aspnet=Prism.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:Prism.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,Prism.languages.insertBefore("inside","punctuation",{directive:Prism.languages.aspnet.directive},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp-script":{pattern:/(<script(?=.*runat=['"]?server\b)[^>]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:Prism.languages.csharp||{}}});.ݶxF#// NOTES - follows first-first highlight method, block is locked after highlight, different from SyntaxHl
Prism.languages.autohotkey = {
	'comment': [
		{
			pattern: /(^|\s);.*/,
			lookbehind: true
		},
		{
			pattern: /(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,
			lookbehind: true,
			greedy: true
		}
	],
	'tag': {
		// labels
		pattern: /^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,
		lookbehind: true
	},
	'string': /"(?:[^"\n\r]|"")*"/,
	'variable': /%\w+%/,
	'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
	'operator': /\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,
	'boolean': /\b(?:false|true)\b/,

	'command': {
		pattern: /\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,
		alias: 'selector'
	},

	'constant': /\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,

	'builtin': /\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,

	'symbol': /\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,

	'directive': {
		pattern: /#[a-z]+\b/i,
		alias: 'important'
	},

	'keyword': /\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,
	'function': /[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,
	'punctuation': /[{}[\]():,]/
};
+x."Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,command:{pattern:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,alias:"selector"},constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,directive:{pattern:/#[a-z]+\b/i,alias:"important"},keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/};Bx/Prism.languages.autoit = {
	'comment': [
		/;.*/,
		{
			// The multi-line comments delimiters can actually be commented out with ";"
			pattern: /(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,
			lookbehind: true
		}
	],
	'url': {
		pattern: /(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,
		lookbehind: true
	},
	'string': {
		pattern: /(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,
		greedy: true,
		inside: {
			'variable': /([%$@])\w+\1/
		}
	},
	'directive': {
		pattern: /(^[\t ]*)#[\w-]+/m,
		lookbehind: true,
		alias: 'keyword'
	},
	'function': /\b\w+(?=\()/,
	// Variables and macros
	'variable': /[$@]\w+/,
	'keyword': /\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,
	'number': /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,
	'boolean': /\b(?:False|True)\b/i,
	'operator': /<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,
	'punctuation': /[\[\]().,:]/
};
ڃR43x>Prism.languages.autoit={comment:[/;.*/,{pattern:/(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,lookbehind:!0}],url:{pattern:/(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^[\t ]*)#[\w-]+/m,lookbehind:!0,alias:"keyword"},function:/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,boolean:/\b(?:False|True)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,punctuation:/[\[\]().,:]/};qx?// http://avisynth.nl/index.php/The_full_AviSynth_grammar
(function (Prism) {

	function replace(pattern, replacements) {
		return pattern.replace(/<<(\d+)>>/g, function (m, index) {
			return replacements[+index];
		});
	}

	function re(pattern, replacements, flags) {
		return RegExp(replace(pattern, replacements), flags || '');
	}

	var types = /bool|clip|float|int|string|val/.source;
	var internals = [
		// bools
		/is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?/.source,
		// control
		/apply|assert|default|eval|import|nop|select|undefined/.source,
		// global
		/opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)/.source,
		// conv
		/hex(?:value)?|value/.source,
		// numeric
		/abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt/.source,
		// trig
		/a?sinh?|a?cosh?|a?tan[2h]?/.source,
		// bit
		/(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/.source,
		// runtime
		/average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/.source,
		// script
		/getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams/.source,
		// string
		/chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)/.source,
		// version
		/isversionorgreater|version(?:number|string)/.source,
		// helper
		/buildpixeltype|colorspacenametopixeltype/.source,
		// avsplus
		/addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode/.source
	].join('|');
	var properties = [
		// content
		/has(?:audio|video)/.source,
		// resolution
		/height|width/.source,
		// framerate
		/frame(?:count|rate)|framerate(?:denominator|numerator)/.source,
		// interlacing
		/getparity|is(?:field|frame)based/.source,
		// color format
		/bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype/.source,
		// audio
		/audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)/.source
	].join('|');
	var filters = [
		// source
		/avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource/.source,
		// color
		/coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv/.source,
		// overlay
		/(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract/.source,
		// geometry
		/addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)/.source,
		// pixel
		/blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen/.source,
		// timeline
		/trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/.source,
		// interlace
		/assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?/.source,
		// audio
		/amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch/.source,
		// conditional
		/animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?/.source,
		// export
		/imagewriter/.source,
		// debug
		/blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version/.source
	].join('|');
	var allinternals = [internals, properties, filters].join('|');

	Prism.languages.avisynth = {
		'comment': [
			{
				// Matches [* *] nestable block comments, but only supports 1 level of nested comments
				// /\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|<self>)*\*\]/
				pattern: /(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,
				lookbehind: true,
				greedy: true
			},
			{
				// Matches /* */ block comments
				pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
				lookbehind: true,
				greedy: true
			},
			{
				// Matches # comments
				pattern: /(^|[^\\$])#.*/,
				lookbehind: true,
				greedy: true
			}
		],

		// Handle before strings because optional arguments are surrounded by double quotes
		'argument': {
			pattern: re(/\b(?:<<0>>)\s+("?)\w+\1/.source, [types], 'i'),
			inside: {
				'keyword': /^\w+/
			}
		},

		// Optional argument assignment
		'argument-label': {
			pattern: /([,(][\s\\]*)\w+\s*=(?!=)/,
			lookbehind: true,
			inside: {
				'argument-name': {
					pattern: /^\w+/,
					alias: 'punctuation'
				},
				'punctuation': /=$/
			}
		},

		'string': [
			{
				// triple double-quoted
				pattern: /"""[\s\S]*?"""/,
				greedy: true,
			},
			{
				// single double-quoted
				pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
				greedy: true,
				inside: {
					'constant': {
						// These *are* case-sensitive!
						pattern: /\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/
					}
				}
			}
		],

		// The special "last" variable that takes the value of the last implicitly returned clip
		'variable': /\b(?:last)\b/i,

		'boolean': /\b(?:false|no|true|yes)\b/i,

		'keyword': /\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,

		'constant': /\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,

		// AviSynth's internal functions, filters, and properties
		'builtin-function': {
			pattern: re(/\b(?:<<0>>)\b/.source, [allinternals], 'i'),
			alias: 'function'
		},

		'type-cast': {
			pattern: re(/\b(?:<<0>>)(?=\s*\()/.source, [types], 'i'),
			alias: 'keyword'
		},

		// External/user-defined filters
		'function': {
			pattern: /\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,
			lookbehind: true
		},

		// Matches a \ as the first or last character on a line
		'line-continuation': {
			pattern: /(^[ \t]*)\\|\\(?=[ \t]*$)/m,
			lookbehind: true,
			alias: 'punctuation'
		},

		'number': /\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,

		'operator': /\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,

		'punctuation': /[{}\[\]();,.]/
	};

	Prism.languages.avs = Prism.languages.avisynth;

}(Prism));
jֲx-!function(e){function a(e,a,r){return RegExp(function(e,a){return e.replace(/<<(\d+)>>/g,(function(e,r){return a[+r]}))}(e,a),r||"")}var r="bool|clip|float|int|string|val",t=[["is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?","apply|assert|default|eval|import|nop|select|undefined","opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)","hex(?:value)?|value","abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt","a?sinh?|a?cosh?|a?tan[2h]?","(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))","average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)","getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams","chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)","isversionorgreater|version(?:number|string)","buildpixeltype|colorspacenametopixeltype","addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode"].join("|"),["has(?:audio|video)","height|width","frame(?:count|rate)|framerate(?:denominator|numerator)","getparity|is(?:field|frame)based","bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype","audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)"].join("|"),["avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource","coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv","(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract","addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)","blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen","trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)","assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?","amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch","animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?","imagewriter","blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version"].join("|")].join("|");e.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a('\\b(?:<<0>>)\\s+("?)\\w+\\1',[r],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a("\\b(?:<<0>>)\\b",[t],"i"),alias:"function"},"type-cast":{pattern:a("\\b(?:<<0>>)(?=\\s*\\()",[r],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},e.languages.avs=e.languages.avisynth}(Prism);SpOx// GitHub: https://github.com/apache/avro
// Docs: https://avro.apache.org/docs/current/idl.html

Prism.languages['avro-idl'] = {
	'comment': {
		pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
		greedy: true
	},
	'string': {
		pattern: /(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,
		lookbehind: true,
		greedy: true
	},

	'annotation': {
		pattern: /@(?:[$\w.-]|`[^\r\n`]+`)+/,
		greedy: true,
		alias: 'function'
	},
	'function-identifier': {
		pattern: /`[^\r\n`]+`(?=\s*\()/,
		greedy: true,
		alias: 'function'
	},
	'identifier': {
		pattern: /`[^\r\n`]+`/,
		greedy: true
	},

	'class-name': {
		pattern: /(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,
		lookbehind: true,
		greedy: true
	},
	'keyword': /\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,
	'function': /\b[a-z_]\w*(?=\s*\()/i,

	'number': [
		{
			pattern: /(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,
			lookbehind: true
		},
		/-?\b(?:Infinity|NaN)\b/
	],

	'operator': /=/,
	'punctuation': /[()\[\]{}<>.:,;-]/
};

Prism.languages.avdl = Prism.languages['avro-idl'];
*Ɯ#>xPrism.languages["avro-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0},annotation:{pattern:/@(?:[$\w.-]|`[^\r\n`]+`)+/,greedy:!0,alias:"function"},"function-identifier":{pattern:/`[^\r\n`]+`(?=\s*\()/,greedy:!0,alias:"function"},identifier:{pattern:/`[^\r\n`]+`/,greedy:!0},"class-name":{pattern:/(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,lookbehind:!0,greedy:!0},keyword:/\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:[{pattern:/(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,lookbehind:!0},/-?\b(?:Infinity|NaN)\b/],operator:/=/,punctuation:/[()\[\]{}<>.:,;-]/},Prism.languages.avdl=Prism.languages["avro-idl"];bd3x:Prism.languages.awk = {
	'hashbang': {
		pattern: /^#!.*/,
		greedy: true,
		alias: 'comment'
	},
	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	'string': {
		pattern: /(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,
		lookbehind: true,
		greedy: true
	},
	'regex': {
		pattern: /((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,
		lookbehind: true,
		greedy: true
	},

	'variable': /\$\w+/,
	'keyword': /\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,

	'function': /\b[a-z_]\w*(?=\s*\()/i,
	'number': /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,

	'operator': /--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,
	'punctuation': /[()[\]{},;]/
};

Prism.languages.gawk = Prism.languages.awk;
+xBPrism.languages.awk={hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},regex:{pattern:/((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,lookbehind:!0,greedy:!0},variable:/\$\w+/,keyword:/\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,operator:/--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,punctuation:/[()[\]{},;]/},Prism.languages.gawk=Prism.languages.awk;^zx#-(function (Prism) {
	// $ set | grep '^[A-Z][^[:space:]]*=' | cut -d= -f1 | tr '\n' '|'
	// + LC_ALL, RANDOM, REPLY, SECONDS.
	// + make sure PS1..4 are here as they are not always set,
	// - some useless things.
	var envVars = '\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b';

	var commandAfterHeredoc = {
		pattern: /(^(["']?)\w+\2)[ \t]+\S.*/,
		lookbehind: true,
		alias: 'punctuation', // this looks reasonably well in all themes
		inside: null // see below
	};

	var insideString = {
		'bash': commandAfterHeredoc,
		'environment': {
			pattern: RegExp('\\$' + envVars),
			alias: 'constant'
		},
		'variable': [
			// [0]: Arithmetic Environment
			{
				pattern: /\$?\(\([\s\S]+?\)\)/,
				greedy: true,
				inside: {
					// If there is a $ sign at the beginning highlight $(( and )) as variable
					'variable': [
						{
							pattern: /(^\$\(\([\s\S]+)\)\)/,
							lookbehind: true
						},
						/^\$\(\(/
					],
					'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
					// Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
					'operator': /--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,
					// If there is no $ sign at the beginning highlight (( and )) as punctuation
					'punctuation': /\(\(?|\)\)?|,|;/
				}
			},
			// [1]: Command Substitution
			{
				pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,
				greedy: true,
				inside: {
					'variable': /^\$\(|^`|\)$|`$/
				}
			},
			// [2]: Brace expansion
			{
				pattern: /\$\{[^}]+\}/,
				greedy: true,
				inside: {
					'operator': /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,
					'punctuation': /[\[\]]/,
					'environment': {
						pattern: RegExp('(\\{)' + envVars),
						lookbehind: true,
						alias: 'constant'
					}
				}
			},
			/\$(?:\w+|[#?*!@$])/
		],
		// Escape sequences from echo and printf's manuals, and escaped quotes.
		'entity': /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/
	};

	Prism.languages.bash = {
		'shebang': {
			pattern: /^#!\s*\/.*/,
			alias: 'important'
		},
		'comment': {
			pattern: /(^|[^"{\\$])#.*/,
			lookbehind: true
		},
		'function-name': [
			// a) function foo {
			// b) foo() {
			// c) function foo() {
			// but not “foo {”
			{
				// a) and c)
				pattern: /(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,
				lookbehind: true,
				alias: 'function'
			},
			{
				// b)
				pattern: /\b[\w-]+(?=\s*\(\s*\)\s*\{)/,
				alias: 'function'
			}
		],
		// Highlight variable names as variables in for and select beginnings.
		'for-or-select': {
			pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/,
			alias: 'variable',
			lookbehind: true
		},
		// Highlight variable names as variables in the left-hand part
		// of assignments (“=” and “+=”).
		'assign-left': {
			pattern: /(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,
			inside: {
				'environment': {
					pattern: RegExp('(^|[\\s;|&]|[<>]\\()' + envVars),
					lookbehind: true,
					alias: 'constant'
				}
			},
			alias: 'variable',
			lookbehind: true
		},
		// Highlight parameter names as variables
		'parameter': {
			pattern: /(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,
			alias: 'variable',
			lookbehind: true
		},
		'string': [
			// Support for Here-documents https://en.wikipedia.org/wiki/Here_document
			{
				pattern: /((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,
				lookbehind: true,
				greedy: true,
				inside: insideString
			},
			// Here-document with quotes around the tag
			// → No expansion (so no “inside”).
			{
				pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,
				lookbehind: true,
				greedy: true,
				inside: {
					'bash': commandAfterHeredoc
				}
			},
			// “Normal” string
			{
				// https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html
				pattern: /(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,
				lookbehind: true,
				greedy: true,
				inside: insideString
			},
			{
				// https://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html
				pattern: /(^|[^$\\])'[^']*'/,
				lookbehind: true,
				greedy: true
			},
			{
				// https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
				pattern: /\$'(?:[^'\\]|\\[\s\S])*'/,
				greedy: true,
				inside: {
					'entity': insideString.entity
				}
			}
		],
		'environment': {
			pattern: RegExp('\\$?' + envVars),
			alias: 'constant'
		},
		'variable': insideString.variable,
		'function': {
			pattern: /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,
			lookbehind: true
		},
		'keyword': {
			pattern: /(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,
			lookbehind: true
		},
		// https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
		'builtin': {
			pattern: /(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,
			lookbehind: true,
			// Alias added to make those easier to distinguish from strings.
			alias: 'class-name'
		},
		'boolean': {
			pattern: /(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,
			lookbehind: true
		},
		'file-descriptor': {
			pattern: /\B&\d\b/,
			alias: 'important'
		},
		'operator': {
			// Lots of redirections here, but not just that.
			pattern: /\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,
			inside: {
				'file-descriptor': {
					pattern: /^\d/,
					alias: 'important'
				}
			}
		},
		'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,
		'number': {
			pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,
			lookbehind: true
		}
	};

	commandAfterHeredoc.inside = Prism.languages.bash;

	/* Patterns in command substitution. */
	var toBeCopied = [
		'comment',
		'function-name',
		'for-or-select',
		'assign-left',
		'parameter',
		'string',
		'environment',
		'function',
		'keyword',
		'builtin',
		'boolean',
		'file-descriptor',
		'operator',
		'punctuation',
		'number'
	];
	var inside = insideString.variable[1].inside;
	for (var i = 0; i < toBeCopied.length; i++) {
		inside[toBeCopied[i]] = Prism.languages.bash[toBeCopied[i]];
	}

	Prism.languages.sh = Prism.languages.bash;
	Prism.languages.shell = Prism.languages.bash;
}(Prism));
OSx !function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i<s.length;i++)o[s[i]]=e.languages.bash[s[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism);UvxnPrism.languages.basic = {
	'comment': {
		pattern: /(?:!|REM\b).+/i,
		inside: {
			'keyword': /^REM/i
		}
	},
	'string': {
		pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,
		greedy: true
	},
	'number': /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
	'keyword': /\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,
	'function': /\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,
	'operator': /<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,
	'punctuation': /[,;:()]/
};
:WIrx'Prism.languages.basic={comment:{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/};8P:x	5(function (Prism) {
	var variable = /%%?[~:\w]+%?|!\S+!/;
	var parameter = {
		pattern: /\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,
		alias: 'attr-name',
		inside: {
			'punctuation': /:/
		}
	};
	var string = /"(?:[\\"]"|[^"])*"(?!")/;
	var number = /(?:\b|-)\d+\b/;

	Prism.languages.batch = {
		'comment': [
			/^::.*/m,
			{
				pattern: /((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
				lookbehind: true
			}
		],
		'label': {
			pattern: /^:.*/m,
			alias: 'property'
		},
		'command': [
			{
				// FOR command
				pattern: /((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,
				lookbehind: true,
				inside: {
					'keyword': /\b(?:do|in)\b|^for\b/i,
					'string': string,
					'parameter': parameter,
					'variable': variable,
					'number': number,
					'punctuation': /[()',]/
				}
			},
			{
				// IF command
				pattern: /((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,
				lookbehind: true,
				inside: {
					'keyword': /\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,
					'string': string,
					'parameter': parameter,
					'variable': variable,
					'number': number,
					'operator': /\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i
				}
			},
			{
				// ELSE command
				pattern: /((?:^|[&()])[ \t]*)else\b/im,
				lookbehind: true,
				inside: {
					'keyword': /^else\b/i
				}
			},
			{
				// SET command
				pattern: /((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
				lookbehind: true,
				inside: {
					'keyword': /^set\b/i,
					'string': string,
					'parameter': parameter,
					'variable': [
						variable,
						/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/
					],
					'number': number,
					'operator': /[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,
					'punctuation': /[()',]/
				}
			},
			{
				// Other commands
				pattern: /((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,
				lookbehind: true,
				inside: {
					'keyword': /^\w+\b/,
					'string': string,
					'parameter': parameter,
					'label': {
						pattern: /(^\s*):\S+/m,
						lookbehind: true,
						alias: 'property'
					},
					'variable': variable,
					'number': number,
					'operator': /\^/
				}
			}
		],
		'operator': /[&@]/,
		'punctuation': /[()']/
	};
}(Prism));
ګhxt!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism);P*|&xaPrism.languages.bbcode = {
	'tag': {
		pattern: /\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,
		inside: {
			'tag': {
				pattern: /^\[\/?[^\s=\]]+/,
				inside: {
					'punctuation': /^\[\/?/
				}
			},
			'attr-value': {
				pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,
				inside: {
					'punctuation': [
						/^=/,
						{
							pattern: /^(\s*)["']|["']$/,
							lookbehind: true
						}
					]
				}
			},
			'punctuation': /\]/,
			'attr-name': /[^\s=\]]+/
		}
	}
};

Prism.languages.shortcode = Prism.languages.bbcode;
&x;Prism.languages.bbcode={tag:{pattern:/\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,inside:{tag:{pattern:/^\[\/?[^\s=\]]+/,inside:{punctuation:/^\[\/?/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\]/,"attr-name":/[^\s=\]]+/}}},Prism.languages.shortcode=Prism.languages.bbcode;=x-(function (Prism) {
	Prism.languages.bbj = {
		'comment': {
			pattern: /(^|[^\\:])rem\s+.*/i,
			lookbehind: true,
			greedy: true
		},
		'string': {
			pattern: /(['"])(?:(?!\1|\\).|\\.)*\1/,
			greedy: true
		},
		'number': /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
		'keyword': /\b(?:abstract|all|argc|begin|bye|callback|case|chn|class|classend|ctl|day|declare|delete|dim|dom|dread|dsz|else|end|endif|err|exitto|extends|fi|field|for|from|gosub|goto|if|implements|interface|interfaceend|iol|iolist|let|list|load|method|methodend|methodret|on|opts|pfx|print|private|process_events|protected|psz|public|read|read_resource|release|remove_callback|repeat|restore|return|rev|seterr|setesc|sqlchn|sqlunt|ssn|start|static|swend|switch|sys|then|tim|unt|until|use|void|wend|where|while)\b/i,
		'function': /\b\w+(?=\()/,
		'boolean': /\b(?:BBjAPI\.TRUE|BBjAPI\.FALSE)\b/i,
		'operator': /<[=>]?|>=?|[+\-*\/^=&]|\b(?:and|not|or|xor)\b/i,
		'punctuation': /[.,;:()]/
	};
}(Prism));
r]6xi!function(e){e.languages.bbj={comment:{pattern:/(^|[^\\:])rem\s+.*/i,lookbehind:!0,greedy:!0},string:{pattern:/(['"])(?:(?!\1|\\).|\\.)*\1/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:abstract|all|argc|begin|bye|callback|case|chn|class|classend|ctl|day|declare|delete|dim|dom|dread|dsz|else|end|endif|err|exitto|extends|fi|field|for|from|gosub|goto|if|implements|interface|interfaceend|iol|iolist|let|list|load|method|methodend|methodret|on|opts|pfx|print|private|process_events|protected|psz|public|read|read_resource|release|remove_callback|repeat|restore|return|rev|seterr|setesc|sqlchn|sqlunt|ssn|start|static|swend|switch|sys|then|tim|unt|until|use|void|wend|where|while)\b/i,function:/\b\w+(?=\()/,boolean:/\b(?:BBjAPI\.TRUE|BBjAPI\.FALSE)\b/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:and|not|or|xor)\b/i,punctuation:/[.,;:()]/}}(Prism);}Owx}// based loosely upon: https://github.com/Azure/bicep/blob/main/src/textmate/bicep.tmlanguage
Prism.languages.bicep = {
	'comment': [
		{
			// multiline comments eg /* ASDF */
			pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
			lookbehind: true,
			greedy: true
		},
		{
			// singleline comments eg // ASDF
			pattern: /(^|[^\\:])\/\/.*/,
			lookbehind: true,
			greedy: true
		}
	],

	'property': [
		{
			pattern: /([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,
			lookbehind: true
		},
		{
			pattern: /([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,
			lookbehind: true,
			greedy: true
		}
	],
	'string': [
		{
			pattern: /'''[^'][\s\S]*?'''/,
			greedy: true
		},
		{
			pattern: /(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,
			lookbehind: true,
			greedy: true,
		}
	],
	'interpolated-string': {
		pattern: /(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,
		lookbehind: true,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /\$\{[^{}\r\n]*\}/,
				inside: {
					'expression': {
						pattern: /(^\$\{)[\s\S]+(?=\}$)/,
						lookbehind: true
					},
					'punctuation': /^\$\{|\}$/,
				}
			},
			'string': /[\s\S]+/
		}
	},

	'datatype': {
		pattern: /(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,
		lookbehind: true,
		alias: 'class-name'
	},

	'boolean': /\b(?:false|true)\b/,
	// https://github.com/Azure/bicep/blob/114a3251b4e6e30082a58729f19a8cc4e374ffa6/src/textmate/bicep.tmlanguage#L184
	'keyword': /\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,

	'decorator': /@\w+\b/,
	'function': /\b[a-z_]\w*(?=[ \t]*\()/i,

	'number': /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
	'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,
	'punctuation': /[{}[\];(),.:]/,
};

Prism.languages.bicep['interpolated-string'].inside['interpolation'].inside['expression'].inside = Prism.languages.bicep;
@PxPrism.languages.bicep={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],property:[{pattern:/([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,lookbehind:!0},{pattern:/([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,lookbehind:!0,greedy:!0}],string:[{pattern:/'''[^'][\s\S]*?'''/,greedy:!0},{pattern:/(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0}],"interpolated-string":{pattern:/(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}\r\n]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0},punctuation:/^\$\{|\}$/}},string:/[\s\S]+/}},datatype:{pattern:/(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,lookbehind:!0,alias:"class-name"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,decorator:/@\w+\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,punctuation:/[{}[\];(),.:]/},Prism.languages.bicep["interpolated-string"].inside.interpolation.inside.expression.inside=Prism.languages.bicep;]12-x(Prism.languages.birb = Prism.languages.extend('clike', {
	'string': {
		pattern: /r?("|')(?:\\.|(?!\1)[^\\])*\1/,
		greedy: true
	},
	'class-name': [
		/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,

		// matches variable and function return types (parameters as well).
		/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/
	],
	'keyword': /\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,
	'operator': /\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,
	'variable': /\b[a-z_]\w*\b/,
});

Prism.languages.insertBefore('birb', 'function', {
	'metadata': {
		pattern: /<\w+>/,
		greedy: true,
		alias: 'symbol'
	}
});
'G틵$xEPrism.languages.birb=Prism.languages.extend("clike",{string:{pattern:/r?("|')(?:\\.|(?!\1)[^\\])*\1/,greedy:!0},"class-name":[/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/],keyword:/\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,operator:/\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,variable:/\b[a-z_]\w*\b/}),Prism.languages.insertBefore("birb","function",{metadata:{pattern:/<\w+>/,greedy:!0,alias:"symbol"}});(̡=x)Prism.languages.bison = Prism.languages.extend('c', {});

Prism.languages.insertBefore('bison', 'comment', {
	'bison': {
		// This should match all the beginning of the file
		// including the prologue(s), the bison declarations and
		// the grammar rules.
		pattern: /^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,
		inside: {
			'c': {
				// Allow for one level of nested braces
				pattern: /%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,
				inside: {
					'delimiter': {
						pattern: /^%?\{|%?\}$/,
						alias: 'punctuation'
					},
					'bison-variable': {
						pattern: /[$@](?:<[^\s>]+>)?[\w$]+/,
						alias: 'variable',
						inside: {
							'punctuation': /<|>/
						}
					},
					rest: Prism.languages.c
				}
			},
			'comment': Prism.languages.c.comment,
			'string': Prism.languages.c.string,
			'property': /\S+(?=:)/,
			'keyword': /%\w+/,
			'number': {
				pattern: /(^|[^@])\b(?:0x[\da-f]+|\d+)/i,
				lookbehind: true
			},
			'punctuation': /%[%?]|[|:;\[\]<>]/
		}
	}
});
%xRPrism.languages.bison=Prism.languages.extend("c",{}),Prism.languages.insertBefore("bison","comment",{bison:{pattern:/^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}});̿xPrism.languages.bnf = {
	'string': {
		pattern: /"[^\r\n"]*"|'[^\r\n']*'/
	},
	'definition': {
		pattern: /<[^<>\r\n\t]+>(?=\s*::=)/,
		alias: ['rule', 'keyword'],
		inside: {
			'punctuation': /^<|>$/
		}
	},
	'rule': {
		pattern: /<[^<>\r\n\t]+>/,
		inside: {
			'punctuation': /^<|>$/
		}
	},
	'operator': /::=|[|()[\]{}*+?]|\.{3}/
};

Prism.languages.rbnf = Prism.languages.bnf;

qx0Prism.languages.bnf={string:{pattern:/"[^\r\n"]*"|'[^\r\n']*'/},definition:{pattern:/<[^<>\r\n\t]+>(?=\s*::=)/,alias:["rule","keyword"],inside:{punctuation:/^<|>$/}},rule:{pattern:/<[^<>\r\n\t]+>/,inside:{punctuation:/^<|>$/}},operator:/::=|[|()[\]{}*+?]|\.{3}/},Prism.languages.rbnf=Prism.languages.bnf;k`xPrism.languages.bqn = {
	'shebang': {
		pattern: /^#![ \t]*\/.*/,
		alias: 'important',
		greedy: true
	},
	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	'string-literal': {
		pattern: /"(?:[^"]|"")*"/,
		greedy: true,
		alias: 'string'
	},
	'character-literal': {
		pattern: /'(?:[\s\S]|[\uD800-\uDBFF][\uDC00-\uDFFF])'/,
		greedy: true,
		alias: 'char'
	},
	'function': /•[\w¯.∞π]+[\w¯.∞π]*/,
	'dot-notation-on-brackets': {
		pattern: /\{(?=.*\}\.)|\}\./,
		alias: 'namespace'
	},
	'special-name': {
		pattern: /(?:𝕨|𝕩|𝕗|𝕘|𝕤|𝕣|𝕎|𝕏|𝔽|𝔾|𝕊|_𝕣_|_𝕣)/,
		alias: 'keyword'
	},
	'dot-notation-on-name': {
		pattern: /[A-Za-z_][\w¯∞π]*\./,
		alias: 'namespace'
	},
	'word-number-scientific': {
		pattern: /\d+(?:\.\d+)?[eE]¯?\d+/,
		alias: 'number'
	},
	'word-name': {
		pattern: /[A-Za-z_][\w¯∞π]*/,
		alias: 'symbol'
	},
	'word-number': {
		pattern: /[¯∞π]?(?:\d*\.?\b\d+(?:e[+¯]?\d+|E[+¯]?\d+)?|¯|∞|π)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+|E[+¯]?\d+)?|¯|∞|π))?/,
		alias: 'number'
	},
	'null-literal': {
		pattern: /@/,
		alias: 'char'
	},
	'primitive-functions': {
		pattern: /[-+×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!]/,
		alias: 'operator'
	},
	'primitive-1-operators': {
		pattern: /[`˜˘¨⁼⌜´˝˙]/,
		alias: 'operator'
	},
	'primitive-2-operators': {
		pattern: /[∘⊸⟜○⌾⎉⚇⍟⊘◶⎊]/,
		alias: 'operator'
	},
	'punctuation': /[←⇐↩(){}⟨⟩[\]‿·⋄,.;:?]/
};
>=Sx1Prism.languages.bqn={shebang:{pattern:/^#![ \t]*\/.*/,alias:"important",greedy:!0},comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/"(?:[^"]|"")*"/,greedy:!0,alias:"string"},"character-literal":{pattern:/'(?:[\s\S]|[\uD800-\uDBFF][\uDC00-\uDFFF])'/,greedy:!0,alias:"char"},function:/•[\w¯.∞π]+[\w¯.∞π]*/,"dot-notation-on-brackets":{pattern:/\{(?=.*\}\.)|\}\./,alias:"namespace"},"special-name":{pattern:/(?:𝕨|𝕩|𝕗|𝕘|𝕤|𝕣|𝕎|𝕏|𝔽|𝔾|𝕊|_𝕣_|_𝕣)/,alias:"keyword"},"dot-notation-on-name":{pattern:/[A-Za-z_][\w¯∞π]*\./,alias:"namespace"},"word-number-scientific":{pattern:/\d+(?:\.\d+)?[eE]¯?\d+/,alias:"number"},"word-name":{pattern:/[A-Za-z_][\w¯∞π]*/,alias:"symbol"},"word-number":{pattern:/[¯∞π]?(?:\d*\.?\b\d+(?:e[+¯]?\d+|E[+¯]?\d+)?|¯|∞|π)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+|E[+¯]?\d+)?|¯|∞|π))?/,alias:"number"},"null-literal":{pattern:/@/,alias:"char"},"primitive-functions":{pattern:/[-+×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!]/,alias:"operator"},"primitive-1-operators":{pattern:/[`˜˘¨⁼⌜´˝˙]/,alias:"operator"},"primitive-2-operators":{pattern:/[∘⊸⟜○⌾⎉⚇⍟⊘◶⎊]/,alias:"operator"},punctuation:/[←⇐↩(){}⟨⟩[\]‿·⋄,.;:?]/};W*1x,Prism.languages.brainfuck = {
	'pointer': {
		pattern: /<|>/,
		alias: 'keyword'
	},
	'increment': {
		pattern: /\+/,
		alias: 'inserted'
	},
	'decrement': {
		pattern: /-/,
		alias: 'deleted'
	},
	'branching': {
		pattern: /\[|\]/,
		alias: 'important'
	},
	'operator': /[.,]/,
	'comment': /\S+/
};
ZXx Prism.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/};RRbPxPrism.languages.brightscript = {
	'comment': /(?:\brem|').*/i,
	'directive-statement': {
		pattern: /(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,
		lookbehind: true,
		alias: 'property',
		inside: {
			'error-message': {
				pattern: /(^#error).+/,
				lookbehind: true
			},
			'directive': {
				pattern: /^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,
				alias: 'keyword'
			},
			'expression': {
				pattern: /[\s\S]+/,
				inside: null // see below
			}
		}
	},
	'property': {
		pattern: /([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,
		lookbehind: true,
		greedy: true
	},
	'string': {
		pattern: /"(?:[^"\r\n]|"")*"(?!")/,
		greedy: true
	},
	'class-name': {
		pattern: /(\bAs[\t ]+)\w+/i,
		lookbehind: true
	},
	'keyword': /\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,
	'boolean': /\b(?:false|true)\b/i,
	'function': /\b(?!\d)\w+(?=[\t ]*\()/,
	'number': /(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,
	'operator': /--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,
	'punctuation': /[.,;()[\]{}]/,
	'constant': /\b(?:LINE_NUM)\b/i
};

Prism.languages.brightscript['directive-statement'].inside.expression.inside = Prism.languages.brightscript;
HۼCx<Prism.languages.brightscript={comment:/(?:\brem|').*/i,"directive-statement":{pattern:/(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,lookbehind:!0,alias:"property",inside:{"error-message":{pattern:/(^#error).+/,lookbehind:!0},directive:{pattern:/^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,alias:"keyword"},expression:{pattern:/[\s\S]+/,inside:null}}},property:{pattern:/([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},"class-name":{pattern:/(\bAs[\t ]+)\w+/i,lookbehind:!0},keyword:/\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?!\d)\w+(?=[\t ]*\()/,number:/(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,operator:/--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,punctuation:/[.,;()[\]{}]/,constant:/\b(?:LINE_NUM)\b/i},Prism.languages.brightscript["directive-statement"].inside.expression.inside=Prism.languages.brightscript;x Mx(Prism.languages.bro = {

	'comment': {
		pattern: /(^|[^\\$])#.*/,
		lookbehind: true,
		inside: {
			'italic': /\b(?:FIXME|TODO|XXX)\b/
		}
	},

	'string': {
		pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},

	'boolean': /\b[TF]\b/,

	'function': {
		pattern: /(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,
		lookbehind: true
	},

	'builtin': /(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,

	'constant': {
		pattern: /(\bconst[ \t]+)\w+/i,
		lookbehind: true
	},

	'keyword': /\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,

	'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,

	'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,

	'punctuation': /[{}[\];(),.:]/
};
EIKExYPrism.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:FIXME|TODO|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},boolean:/\b[TF]\b/,function:{pattern:/(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,lookbehind:!0},builtin:/(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,constant:{pattern:/(\bconst[ \t]+)\w+/i,lookbehind:!0},keyword:/\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/};x	Q/* eslint-disable no-misleading-character-class */

// 1C:Enterprise
// https://github.com/Diversus23/
//
Prism.languages.bsl = {
	'comment': /\/\/.*/,
	'string': [
		// Строки
		// Strings
		{
			pattern: /"(?:[^"]|"")*"(?!")/,
			greedy: true
		},
		// Дата и время
		// Date & time
		{
			pattern: /'(?:[^'\r\n\\]|\\.)*'/
		}
	],
	'keyword': [
		{
			// RU
			pattern: /(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,
			lookbehind: true
		},
		{
			// EN
			pattern: /\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i
		}
	],
	'number': {
		pattern: /(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,
		lookbehind: true
	},
	'operator': [
		/[<>+\-*/]=?|[%=]/,
		// RU
		{
			pattern: /(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,
			lookbehind: true
		},
		// EN
		{
			pattern: /\b(?:and|not|or)\b/i
		}
	],
	'punctuation': /\(\.|\.\)|[()\[\]:;,.]/,
	'directive': [
		// Теги препроцессора вида &Клиент, &Сервер, ...
		// Preprocessor tags of the type &Client, &Server, ...
		{
			pattern: /^([ \t]*)&.*/m,
			lookbehind: true,
			greedy: true,
			alias: 'important'
		},
		// Инструкции препроцессора вида:
		// #Если Сервер Тогда
		// ...
		// #КонецЕсли
		// Preprocessor instructions of the form:
		// #If Server Then
		// ...
		// #EndIf
		{
			pattern: /^([ \t]*)#.*/gm,
			lookbehind: true,
			greedy: true,
			alias: 'important'
		}
	]
};

Prism.languages.oscript = Prism.languages['bsl'];
ixlPrism.languages.bsl={comment:/\/\/.*/,string:[{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},{pattern:/'(?:[^'\r\n\\]|\\.)*'/}],keyword:[{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i}],number:{pattern:/(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,lookbehind:!0},operator:[/[<>+\-*/]=?|[%=]/,{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:and|not|or)\b/i}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/,directive:[{pattern:/^([ \t]*)&.*/m,lookbehind:!0,greedy:!0,alias:"important"},{pattern:/^([ \t]*)#.*/gm,lookbehind:!0,greedy:!0,alias:"important"}]},Prism.languages.oscript=Prism.languages.bsl;d(Ex=
Prism.languages.c = Prism.languages.extend('clike', {
	'comment': {
		pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,
		greedy: true
	},
	'string': {
		// https://en.cppreference.com/w/c/language/string_literal
		pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
		greedy: true
	},
	'class-name': {
		pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,
		lookbehind: true
	},
	'keyword': /\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,
	'function': /\b[a-z_]\w*(?=\s*\()/i,
	'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,
	'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/
});

Prism.languages.insertBefore('c', 'string', {
	'char': {
		// https://en.cppreference.com/w/c/language/character_constant
		pattern: /'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,
		greedy: true
	}
});

Prism.languages.insertBefore('c', 'string', {
	'macro': {
		// allow for multiline macro definitions
		// spaces after the # character compile fine with gcc
		pattern: /(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,
		lookbehind: true,
		greedy: true,
		alias: 'property',
		inside: {
			'string': [
				{
					// highlight the path of the include statement as a string
					pattern: /^(#\s*include\s*)<[^>]+>/,
					lookbehind: true
				},
				Prism.languages.c['string']
			],
			'char': Prism.languages.c['char'],
			'comment': Prism.languages.c['comment'],
			'macro-name': [
				{
					pattern: /(^#\s*define\s+)\w+\b(?!\()/i,
					lookbehind: true
				},
				{
					pattern: /(^#\s*define\s+)\w+\b(?=\()/i,
					lookbehind: true,
					alias: 'function'
				}
			],
			// highlight macro directives as keywords
			'directive': {
				pattern: /^(#\s*)[a-z]+/,
				lookbehind: true,
				alias: 'keyword'
			},
			'directive-hash': /^#/,
			'punctuation': /##|\\(?=[\r\n])/,
			'expression': {
				pattern: /\S[\s\S]*/,
				inside: Prism.languages.c
			}
		}
	}
});

Prism.languages.insertBefore('c', 'function', {
	// highlight predefined macros as constants
	'constant': /\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/
});

delete Prism.languages.c['boolean'];
OEvxePrism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean;C^x// https://cfdocs.org/script
Prism.languages.cfscript = Prism.languages.extend('clike', {
	'comment': [
		{
			pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
			lookbehind: true,
			inside: {
				'annotation': {
					pattern: /(?:^|[^.])@[\w\.]+/,
					alias: 'punctuation'
				}
			}
		},
		{
			pattern: /(^|[^\\:])\/\/.*/,
			lookbehind: true,
			greedy: true
		}
	],
	'keyword': /\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,
	'operator': [
		/\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,
		/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/
	],
	'scope': {
		pattern: /\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,
		alias: 'global'
	},
	'type': {
		pattern: /\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,
		alias: 'builtin'
	}
});

Prism.languages.insertBefore('cfscript', 'keyword', {
	// This must be declared before keyword because we use "function" inside the lookahead
	'function-variable': {
		pattern: /[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
		alias: 'function'
	}
});

delete Prism.languages.cfscript['class-name'];
Prism.languages.cfc = Prism.languages['cfscript'];
SLx7Prism.languages.cfscript=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),Prism.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete Prism.languages.cfscript["class-name"],Prism.languages.cfc=Prism.languages.cfscript;hcx7Prism.languages.chaiscript = Prism.languages.extend('clike', {
	'string': {
		pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,
		lookbehind: true,
		greedy: true
	},
	'class-name': [
		{
			// e.g. class Rectangle { ... }
			pattern: /(\bclass\s+)\w+/,
			lookbehind: true
		},
		{
			// e.g. attr Rectangle::height, def Rectangle::area() { ... }
			pattern: /(\b(?:attr|def)\s+)\w+(?=\s*::)/,
			lookbehind: true
		}
	],
	'keyword': /\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,
	'number': [
		Prism.languages.cpp.number,
		/\b(?:Infinity|NaN)\b/
	],
	'operator': />>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/,
});

Prism.languages.insertBefore('chaiscript', 'operator', {
	'parameter-type': {
		// e.g. def foo(int x, Vector y) {...}
		pattern: /([,(]\s*)\w+(?=\s+\w)/,
		lookbehind: true,
		alias: 'class-name'
	},
});

Prism.languages.insertBefore('chaiscript', 'string', {
	'string-interpolation': {
		pattern: /(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,
		lookbehind: true,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,
				lookbehind: true,
				inside: {
					'interpolation-expression': {
						pattern: /(^\$\{)[\s\S]+(?=\}$)/,
						lookbehind: true,
						inside: Prism.languages.chaiscript
					},
					'interpolation-punctuation': {
						pattern: /^\$\{|\}$/,
						alias: 'punctuation'
					}
				}
			},
			'string': /[\s\S]+/
		}
	},
});
킳Jx\Prism.languages.chaiscript=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,lookbehind:!0,greedy:!0},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},{pattern:/(\b(?:attr|def)\s+)\w+(?=\s*::)/,lookbehind:!0}],keyword:/\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,number:[Prism.languages.cpp.number,/\b(?:Infinity|NaN)\b/],operator:/>>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/}),Prism.languages.insertBefore("chaiscript","operator",{"parameter-type":{pattern:/([,(]\s*)\w+(?=\s+\w)/,lookbehind:!0,alias:"class-name"}}),Prism.languages.insertBefore("chaiscript","string",{"string-interpolation":{pattern:/(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,lookbehind:!0,inside:{"interpolation-expression":{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:Prism.languages.chaiscript},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"}}},string:/[\s\S]+/}}});ܨӸxGPrism.languages.cil = {
	'comment': /\/\/.*/,

	'string': {
		pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},

	'directive': {
		pattern: /(^|\W)\.[a-z]+(?=\s)/,
		lookbehind: true,
		alias: 'class-name'
	},

	// Actually an assembly reference
	'variable': /\[[\w\.]+\]/,


	'keyword': /\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,

	'function': /\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,

	'boolean': /\b(?:false|true)\b/,
	'number': /\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,

	'punctuation': /[{}[\];(),:=]|IL_[0-9A-Za-z]+/
};
B!2x@Prism.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,function:/\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,boolean:/\b(?:false|true)\b/,number:/\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/};x Prism.languages.cilkc = Prism.languages.insertBefore('c', 'function', {
	'parallel-keyword': {
		pattern: /\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\b/,
		alias: 'keyword'
	}
});

Prism.languages['cilk-c'] = Prism.languages['cilkc'];
/Ox /Prism.languages.cilkc=Prism.languages.insertBefore("c","function",{"parallel-keyword":{pattern:/\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\b/,alias:"keyword"}}),Prism.languages["cilk-c"]=Prism.languages.cilkc;NLҸx(Prism.languages.cilkcpp = Prism.languages.insertBefore('cpp', 'function', {
	'parallel-keyword': {
		pattern: /\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\b/,
		alias: 'keyword'
	}
});

Prism.languages['cilk-cpp'] = Prism.languages['cilkcpp'];
Prism.languages['cilk'] = Prism.languages['cilkcpp'];
fHxPrism.languages.cilkcpp=Prism.languages.insertBefore("cpp","function",{"parallel-keyword":{pattern:/\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\b/,alias:"keyword"}}),Prism.languages["cilk-cpp"]=Prism.languages.cilkcpp,Prism.languages.cilk=Prism.languages.cilkcpp;+a4xMPrism.languages.clike = {
	'comment': [
		{
			pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
			lookbehind: true,
			greedy: true
		},
		{
			pattern: /(^|[^\\:])\/\/.*/,
			lookbehind: true,
			greedy: true
		}
	],
	'string': {
		pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},
	'class-name': {
		pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
		lookbehind: true,
		inside: {
			'punctuation': /[.\\]/
		}
	},
	'keyword': /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
	'boolean': /\b(?:false|true)\b/,
	'function': /\b\w+(?=\()/,
	'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
	'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
	'punctuation': /[{}[\];(),.:]/
};
5
/,x;Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};˻xd// Copied from https://github.com/jeluard/prism-clojure
Prism.languages.clojure = {
	'comment': {
		pattern: /;.*/,
		greedy: true
	},
	'string': {
		pattern: /"(?:[^"\\]|\\.)*"/,
		greedy: true
	},
	'char': /\\\w+/,
	'symbol': {
		pattern: /(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,
		lookbehind: true
	},
	'keyword': {
		pattern: /(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,
		lookbehind: true
	},
	'boolean': /\b(?:false|nil|true)\b/,
	'number': {
		pattern: /(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,
		lookbehind: true
	},
	'function': {
		pattern: /((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,
		lookbehind: true
	},
	'operator': /[#@^`~]/,
	'punctuation': /[{}\[\](),]/
};
뵾xPrism.languages.clojure={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},char:/\\\w+/,symbol:{pattern:/(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,lookbehind:!0},keyword:{pattern:/(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,lookbehind:!0},boolean:/\b(?:false|nil|true)\b/,number:{pattern:/(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,lookbehind:!0},function:{pattern:/((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,lookbehind:!0},operator:/[#@^`~]/,punctuation:/[{}\[\](),]/};*xu)Prism.languages.cmake = {
	'comment': /#.*/,
	'string': {
		pattern: /"(?:[^\\"]|\\.)*"/,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,
				inside: {
					'punctuation': /\$\{|\}/,
					'variable': /\w+/
				}
			}
		}
	},
	'variable': /\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,
	'property': /\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,
	'keyword': /\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,
	'boolean': /\b(?:FALSE|OFF|ON|TRUE)\b/,
	'namespace': /\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,
	'operator': /\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,
	'inserted': {
		pattern: /\b\w+::\w+\b/,
		alias: 'class-name'
	},
	'number': /\b\d+(?:\.\d+)*\b/,
	'function': /\b[a-z_]\w*(?=\s*\()\b/i,
	'punctuation': /[()>}]|\$[<{]/
};
lf^x(Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/};aKx)Prism.languages.cobol = {
	'comment': {
		pattern: /\*>.*|(^[ \t]*)\*.*/m,
		lookbehind: true,
		greedy: true
	},
	'string': {
		pattern: /[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,
		greedy: true
	},

	'level': {
		pattern: /(^[ \t]*)\d+\b/m,
		lookbehind: true,
		greedy: true,
		alias: 'number'
	},

	'class-name': {
		// https://github.com/antlr/grammars-v4/blob/42edd5b687d183b5fa679e858a82297bd27141e7/cobol85/Cobol85.g4#L1015
		pattern: /(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,
		lookbehind: true,
		inside: {
			'number': {
				pattern: /(\()\d+/,
				lookbehind: true
			},
			'punctuation': /[()]/
		}
	},

	'keyword': {
		pattern: /(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,
		lookbehind: true
	},

	'boolean': {
		pattern: /(^|[^\w-])(?:false|true)(?![\w-])/i,
		lookbehind: true
	},
	'number': {
		pattern: /(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,
		lookbehind: true
	},
	'operator': [
		/<>|[<>]=?|[=+*/&]/,
		{
			pattern: /(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,
			lookbehind: true
		}
	],
	'punctuation': /[.:,()]/
};
}O xPrism.languages.cobol={comment:{pattern:/\*>.*|(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},string:{pattern:/[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,greedy:!0},level:{pattern:/(^[ \t]*)\d+\b/m,lookbehind:!0,greedy:!0,alias:"number"},"class-name":{pattern:/(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,lookbehind:!0,inside:{number:{pattern:/(\()\d+/,lookbehind:!0},punctuation:/[()]/}},keyword:{pattern:/(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,lookbehind:!0},boolean:{pattern:/(^|[^\w-])(?:false|true)(?![\w-])/i,lookbehind:!0},number:{pattern:/(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,lookbehind:!0},operator:[/<>|[<>]=?|[=+*/&]/,{pattern:/(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,lookbehind:!0}],punctuation:/[.:,()]/};{Hxt(function (Prism) {

	// Ignore comments starting with { to privilege string interpolation highlighting
	var comment = /#(?!\{).+/;
	var interpolation = {
		pattern: /#\{[^}]+\}/,
		alias: 'variable'
	};

	Prism.languages.coffeescript = Prism.languages.extend('javascript', {
		'comment': comment,
		'string': [

			// Strings are multiline
			{
				pattern: /'(?:\\[\s\S]|[^\\'])*'/,
				greedy: true
			},

			{
				// Strings are multiline
				pattern: /"(?:\\[\s\S]|[^\\"])*"/,
				greedy: true,
				inside: {
					'interpolation': interpolation
				}
			}
		],
		'keyword': /\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,
		'class-member': {
			pattern: /@(?!\d)\w+/,
			alias: 'variable'
		}
	});

	Prism.languages.insertBefore('coffeescript', 'comment', {
		'multiline-comment': {
			pattern: /###[\s\S]+?###/,
			alias: 'comment'
		},

		// Block regexp can contain comments and interpolation
		'block-regex': {
			pattern: /\/{3}[\s\S]*?\/{3}/,
			alias: 'regex',
			inside: {
				'comment': comment,
				'interpolation': interpolation
			}
		}
	});

	Prism.languages.insertBefore('coffeescript', 'string', {
		'inline-javascript': {
			pattern: /`(?:\\[\s\S]|[^\\`])*`/,
			inside: {
				'delimiter': {
					pattern: /^`|`$/,
					alias: 'punctuation'
				},
				'script': {
					pattern: /[\s\S]+/,
					alias: 'language-javascript',
					inside: Prism.languages.javascript
				}
			}
		},

		// Block strings
		'multiline-string': [
			{
				pattern: /'''[\s\S]*?'''/,
				greedy: true,
				alias: 'string'
			},
			{
				pattern: /"""[\s\S]*?"""/,
				greedy: true,
				alias: 'string',
				inside: {
					interpolation: interpolation
				}
			}
		]

	});

	Prism.languages.insertBefore('coffeescript', 'keyword', {
		// Object property
		'property': /(?!\d)\w+(?=\s*:(?!:))/
	});

	delete Prism.languages.coffeescript['template-string'];

	Prism.languages.coffee = Prism.languages.coffeescript;
}(Prism));
b֩rXxs!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism);xxPrism.languages.concurnas = {
	'comment': {
		pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,
		lookbehind: true,
		greedy: true
	},
	'langext': {
		pattern: /\b\w+\s*\|\|[\s\S]+?\|\|/,
		greedy: true,
		inside: {
			'class-name': /^\w+/,
			'string': {
				pattern: /(^\s*\|\|)[\s\S]+(?=\|\|$)/,
				lookbehind: true
			},
			'punctuation': /\|\|/
		}
	},
	'function': {
		pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,
		lookbehind: true
	},
	'keyword': /\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,
	'boolean': /\b(?:false|true)\b/,
	'number': /\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,
	'punctuation': /[{}[\];(),.:]/,
	'operator': /<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,
	'annotation': {
		pattern: /@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,
		alias: 'builtin'
	}
};

Prism.languages.insertBefore('concurnas', 'langext', {
	'regex-literal': {
		pattern: /\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
				lookbehind: true,
				inside: Prism.languages.concurnas
			},
			'regex': /[\s\S]+/
		}
	},
	'string-literal': {
		pattern: /(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
				lookbehind: true,
				inside: Prism.languages.concurnas
			},
			'string': /[\s\S]+/
		}
	}
});

Prism.languages.conc = Prism.languages.concurnas;
B1vxfPrism.languages.concurnas={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,lookbehind:!0,greedy:!0},langext:{pattern:/\b\w+\s*\|\|[\s\S]+?\|\|/,greedy:!0,inside:{"class-name":/^\w+/,string:{pattern:/(^\s*\|\|)[\s\S]+(?=\|\|$)/,lookbehind:!0},punctuation:/\|\|/}},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,lookbehind:!0},keyword:/\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,boolean:/\b(?:false|true)\b/,number:/\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,punctuation:/[{}[\];(),.:]/,operator:/<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,annotation:{pattern:/@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,alias:"builtin"}},Prism.languages.insertBefore("concurnas","langext",{"regex-literal":{pattern:/\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:Prism.languages.concurnas},regex:/[\s\S]+/}},"string-literal":{pattern:/(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:Prism.languages.concurnas},string:/[\s\S]+/}}}),Prism.languages.conc=Prism.languages.concurnas;X	߻x4(function (Prism) {

	// see https://github.com/cooklang/spec/blob/main/EBNF.md

	var single_token_suffix = /(?:(?!\s)[\d$+<=a-zA-Z\x80-\uFFFF])+/.source;
	var multi_token_infix = /[^{}@#]+/.source;
	var multi_token_suffix = /\{[^}#@]*\}/.source;

	var multi_token = multi_token_infix + multi_token_suffix;

	var timer_units = /(?:h|hours|hrs|m|min|minutes)/.source;

	var amount_group_impl = {
		pattern: /\{[^{}]*\}/,
		inside: {
			'amount': {
				pattern: /([\{|])[^{}|*%]+/,
				lookbehind: true,
				alias: 'number',
			},
			'unit': {
				pattern: /(%)[^}]+/,
				lookbehind: true,
				alias: 'symbol',
			},
			'servings-scaler': {
				pattern: /\*/,
				alias: 'operator',
			},
			'servings-alternative-separator': {
				pattern: /\|/,
				alias: 'operator',
			},
			'unit-separator': {
				pattern: /(?:%|(\*)%)/,
				lookbehind: true,
				alias: 'operator',
			},
			'punctuation': /[{}]/,
		}
	};


	Prism.languages.cooklang = {
		'comment': {
			// [- comment -]
			// -- comment
			pattern: /\[-[\s\S]*?-\]|--.*/,
			greedy: true,
		},
		'meta': { // >> key: value
			pattern: />>.*:.*/,
			inside: {
				'property': { // key:
					pattern: /(>>\s*)[^\s:](?:[^:]*[^\s:])?/,
					lookbehind: true,
				}
			}
		},
		'cookware-group': { // #...{...}, #...
			pattern: new RegExp('#(?:'
				+ multi_token
				+ '|'
				+ single_token_suffix
				+ ')'
			),
			inside: {
				'cookware': {
					pattern: new RegExp('(^#)(?:'
						+ multi_token_infix
						+ ')'
					),
					lookbehind: true,
					alias: 'variable',
				},
				'cookware-keyword': {
					pattern: /^#/,
					alias: 'keyword',
				},
				'quantity-group': {
					pattern: new RegExp(/\{[^{}@#]*\}/),
					inside: {
						'quantity': {
							pattern: new RegExp(/(^\{)/.source + multi_token_infix),
							lookbehind: true,
							alias: 'number',
						},
						'punctuation': /[{}]/,
					}
				}
			},
		},
		'ingredient-group': { // @...{...}, @...
			pattern: new RegExp('@(?:'
				+ multi_token
				+ '|'
				+ single_token_suffix
				+ ')'),
			inside: {
				'ingredient': {
					pattern: new RegExp('(^@)(?:'
						+ multi_token_infix
						+ ')'),
					lookbehind: true,
					alias: 'variable',
				},
				'ingredient-keyword': {
					pattern: /^@/,
					alias: 'keyword',
				},
				'amount-group': amount_group_impl,
			}
		},
		'timer-group': { // ~timer{...}
			// eslint-disable-next-line regexp/sort-alternatives
			pattern: /~(?!\s)[^@#~{}]*\{[^{}]*\}/,
			inside: {
				'timer': {
					pattern: /(^~)[^{]+/,
					lookbehind: true,
					alias: 'variable',
				},
				'duration-group': { // {...}
					pattern: /\{[^{}]*\}/,
					inside: {
						'punctuation': /[{}]/,
						'unit': {
							pattern: new RegExp(/(%\s*)/.source + timer_units + /\b/.source),
							lookbehind: true,
							alias: 'symbol',
						},
						'operator': /%/,
						'duration': {
							pattern: /\d+/,
							alias: 'number',
						},
					}
				},
				'timer-keyword': {
					pattern: /^~/,
					alias: 'keyword',
				},
			}
		}
	};
}(Prism));
9&cx5!function(e){var a="(?:(?!\\s)[\\d$+<=a-zA-Z\\x80-\\uFFFF])+",t="[^{}@#]+\\{[^}#@]*\\}";e.languages.cooklang={comment:{pattern:/\[-[\s\S]*?-\]|--.*/,greedy:!0},meta:{pattern:/>>.*:.*/,inside:{property:{pattern:/(>>\s*)[^\s:](?:[^:]*[^\s:])?/,lookbehind:!0}}},"cookware-group":{pattern:new RegExp("#(?:"+t+"|"+a+")"),inside:{cookware:{pattern:new RegExp("(^#)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"cookware-keyword":{pattern:/^#/,alias:"keyword"},"quantity-group":{pattern:new RegExp(/\{[^{}@#]*\}/),inside:{quantity:{pattern:new RegExp("(^\\{)[^{}@#]+"),lookbehind:!0,alias:"number"},punctuation:/[{}]/}}}},"ingredient-group":{pattern:new RegExp("@(?:"+t+"|"+a+")"),inside:{ingredient:{pattern:new RegExp("(^@)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"ingredient-keyword":{pattern:/^@/,alias:"keyword"},"amount-group":{pattern:/\{[^{}]*\}/,inside:{amount:{pattern:/([\{|])[^{}|*%]+/,lookbehind:!0,alias:"number"},unit:{pattern:/(%)[^}]+/,lookbehind:!0,alias:"symbol"},"servings-scaler":{pattern:/\*/,alias:"operator"},"servings-alternative-separator":{pattern:/\|/,alias:"operator"},"unit-separator":{pattern:/(?:%|(\*)%)/,lookbehind:!0,alias:"operator"},punctuation:/[{}]/}}}},"timer-group":{pattern:/~(?!\s)[^@#~{}]*\{[^{}]*\}/,inside:{timer:{pattern:/(^~)[^{]+/,lookbehind:!0,alias:"variable"},"duration-group":{pattern:/\{[^{}]*\}/,inside:{punctuation:/[{}]/,unit:{pattern:new RegExp("(%\\s*)(?:h|hours|hrs|m|min|minutes)\\b"),lookbehind:!0,alias:"symbol"},operator:/%/,duration:{pattern:/\d+/,alias:"number"}}},"timer-keyword":{pattern:/^~/,alias:"keyword"}}}}}(Prism);D-dxw(function (Prism) {

	// https://github.com/coq/coq

	var commentSource = /\(\*(?:[^(*]|\((?!\*)|\*(?!\))|<self>)*\*\)/.source;
	for (var i = 0; i < 2; i++) {
		commentSource = commentSource.replace(/<self>/g, function () { return commentSource; });
	}
	commentSource = commentSource.replace(/<self>/g, '[]');

	Prism.languages.coq = {
		'comment': RegExp(commentSource),
		'string': {
			pattern: /"(?:[^"]|"")*"(?!")/,
			greedy: true
		},
		'attribute': [
			{
				pattern: RegExp(
					/#\[(?:[^\[\]("]|"(?:[^"]|"")*"(?!")|\((?!\*)|<comment>)*\]/.source
						.replace(/<comment>/g, function () { return commentSource; })
				),
				greedy: true,
				alias: 'attr-name',
				inside: {
					'comment': RegExp(commentSource),
					'string': {
						pattern: /"(?:[^"]|"")*"(?!")/,
						greedy: true
					},

					'operator': /=/,
					'punctuation': /^#\[|\]$|[,()]/
				}
			},
			{
				pattern: /\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,
				alias: 'attr-name'
			}
		],

		'keyword': /\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,

		'number': /\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,

		'punct': {
			pattern: /@\{|\{\||\[=|:>/,
			alias: 'punctuation'
		},
		'operator': /\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,
		'punctuation': /\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/
	};

}(Prism));
nHֱx!function(e){for(var t="\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|<self>)*\\*\\)",i=0;i<2;i++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,"[]"),e.languages.coq={comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp('#\\[(?:[^\\[\\]("]|"(?:[^"]|"")*"(?!")|\\((?!\\*)|<comment>)*\\]'.replace(/<comment>/g,(function(){return t}))),greedy:!0,alias:"attr-name",inside:{comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}}(Prism);x3i/// <reference lib="WebWorker"/>

var _self = (typeof window !== 'undefined')
	? window   // if in browser
	: (
		(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
			? self // if in worker
			: {}   // if in node js
	);

/**
 * Prism: Lightweight, robust, elegant syntax highlighting
 *
 * @license MIT <https://opensource.org/licenses/MIT>
 * @author Lea Verou <https://lea.verou.me>
 * @namespace
 * @public
 */
var Prism = (function (_self) {

	// Private helper vars
	var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
	var uniqueId = 0;

	// The grammar object for plaintext
	var plainTextGrammar = {};


	var _ = {
		/**
		 * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
		 * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
		 * additional languages or plugins yourself.
		 *
		 * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.
		 *
		 * You obviously have to change this value before the automatic highlighting started. To do this, you can add an
		 * empty Prism object into the global scope before loading the Prism script like this:
		 *
		 * ```js
		 * window.Prism = window.Prism || {};
		 * Prism.manual = true;
		 * // add a new <script> to load Prism's script
		 * ```
		 *
		 * @default false
		 * @type {boolean}
		 * @memberof Prism
		 * @public
		 */
		manual: _self.Prism && _self.Prism.manual,
		/**
		 * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses
		 * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your
		 * own worker, you don't want it to do this.
		 *
		 * By setting this value to `true`, Prism will not add its own listeners to the worker.
		 *
		 * You obviously have to change this value before Prism executes. To do this, you can add an
		 * empty Prism object into the global scope before loading the Prism script like this:
		 *
		 * ```js
		 * window.Prism = window.Prism || {};
		 * Prism.disableWorkerMessageHandler = true;
		 * // Load Prism's script
		 * ```
		 *
		 * @default false
		 * @type {boolean}
		 * @memberof Prism
		 * @public
		 */
		disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,

		/**
		 * A namespace for utility methods.
		 *
		 * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may
		 * change or disappear at any time.
		 *
		 * @namespace
		 * @memberof Prism
		 */
		util: {
			encode: function encode(tokens) {
				if (tokens instanceof Token) {
					return new Token(tokens.type, encode(tokens.content), tokens.alias);
				} else if (Array.isArray(tokens)) {
					return tokens.map(encode);
				} else {
					return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
				}
			},

			/**
			 * Returns the name of the type of the given value.
			 *
			 * @param {any} o
			 * @returns {string}
			 * @example
			 * type(null)      === 'Null'
			 * type(undefined) === 'Undefined'
			 * type(123)       === 'Number'
			 * type('foo')     === 'String'
			 * type(true)      === 'Boolean'
			 * type([1, 2])    === 'Array'
			 * type({})        === 'Object'
			 * type(String)    === 'Function'
			 * type(/abc+/)    === 'RegExp'
			 */
			type: function (o) {
				return Object.prototype.toString.call(o).slice(8, -1);
			},

			/**
			 * Returns a unique number for the given object. Later calls will still return the same number.
			 *
			 * @param {Object} obj
			 * @returns {number}
			 */
			objId: function (obj) {
				if (!obj['__id']) {
					Object.defineProperty(obj, '__id', { value: ++uniqueId });
				}
				return obj['__id'];
			},

			/**
			 * Creates a deep clone of the given object.
			 *
			 * The main intended use of this function is to clone language definitions.
			 *
			 * @param {T} o
			 * @param {Record<number, any>} [visited]
			 * @returns {T}
			 * @template T
			 */
			clone: function deepClone(o, visited) {
				visited = visited || {};

				var clone; var id;
				switch (_.util.type(o)) {
					case 'Object':
						id = _.util.objId(o);
						if (visited[id]) {
							return visited[id];
						}
						clone = /** @type {Record<string, any>} */ ({});
						visited[id] = clone;

						for (var key in o) {
							if (o.hasOwnProperty(key)) {
								clone[key] = deepClone(o[key], visited);
							}
						}

						return /** @type {any} */ (clone);

					case 'Array':
						id = _.util.objId(o);
						if (visited[id]) {
							return visited[id];
						}
						clone = [];
						visited[id] = clone;

						(/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) {
							clone[i] = deepClone(v, visited);
						});

						return /** @type {any} */ (clone);

					default:
						return o;
				}
			},

			/**
			 * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.
			 *
			 * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.
			 *
			 * @param {Element} element
			 * @returns {string}
			 */
			getLanguage: function (element) {
				while (element) {
					var m = lang.exec(element.className);
					if (m) {
						return m[1].toLowerCase();
					}
					element = element.parentElement;
				}
				return 'none';
			},

			/**
			 * Sets the Prism `language-xxxx` class of the given element.
			 *
			 * @param {Element} element
			 * @param {string} language
			 * @returns {void}
			 */
			setLanguage: function (element, language) {
				// remove all `language-xxxx` classes
				// (this might leave behind a leading space)
				element.className = element.className.replace(RegExp(lang, 'gi'), '');

				// add the new `language-xxxx` class
				// (using `classList` will automatically clean up spaces for us)
				element.classList.add('language-' + language);
			},

			/**
			 * Returns the script element that is currently executing.
			 *
			 * This does __not__ work for line script element.
			 *
			 * @returns {HTMLScriptElement | null}
			 */
			currentScript: function () {
				if (typeof document === 'undefined') {
					return null;
				}
				if (document.currentScript && document.currentScript.tagName === 'SCRIPT' && 1 < 2 /* hack to trip TS' flow analysis */) {
					return /** @type {any} */ (document.currentScript);
				}

				// IE11 workaround
				// we'll get the src of the current script by parsing IE11's error stack trace
				// this will not work for inline scripts

				try {
					throw new Error();
				} catch (err) {
					// Get file src url from stack. Specifically works with the format of stack traces in IE.
					// A stack will look like this:
					//
					// Error
					//    at _.util.currentScript (http://localhost/components/prism-core.js:119:5)
					//    at Global code (http://localhost/components/prism-core.js:606:1)

					var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
					if (src) {
						var scripts = document.getElementsByTagName('script');
						for (var i in scripts) {
							if (scripts[i].src == src) {
								return scripts[i];
							}
						}
					}
					return null;
				}
			},

			/**
			 * Returns whether a given class is active for `element`.
			 *
			 * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated
			 * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the
			 * given class is just the given class with a `no-` prefix.
			 *
			 * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is
			 * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its
			 * ancestors have the given class or the negated version of it, then the default activation will be returned.
			 *
			 * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated
			 * version of it, the class is considered active.
			 *
			 * @param {Element} element
			 * @param {string} className
			 * @param {boolean} [defaultActivation=false]
			 * @returns {boolean}
			 */
			isActive: function (element, className, defaultActivation) {
				var no = 'no-' + className;

				while (element) {
					var classList = element.classList;
					if (classList.contains(className)) {
						return true;
					}
					if (classList.contains(no)) {
						return false;
					}
					element = element.parentElement;
				}
				return !!defaultActivation;
			}
		},

		/**
		 * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.
		 *
		 * @namespace
		 * @memberof Prism
		 * @public
		 */
		languages: {
			/**
			 * The grammar for plain, unformatted text.
			 */
			plain: plainTextGrammar,
			plaintext: plainTextGrammar,
			text: plainTextGrammar,
			txt: plainTextGrammar,

			/**
			 * Creates a deep copy of the language with the given id and appends the given tokens.
			 *
			 * If a token in `redef` also appears in the copied language, then the existing token in the copied language
			 * will be overwritten at its original position.
			 *
			 * ## Best practices
			 *
			 * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)
			 * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to
			 * understand the language definition because, normally, the order of tokens matters in Prism grammars.
			 *
			 * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.
			 * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.
			 *
			 * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.
			 * @param {Grammar} redef The new tokens to append.
			 * @returns {Grammar} The new language created.
			 * @public
			 * @example
			 * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {
			 *     // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token
			 *     // at its original position
			 *     'comment': { ... },
			 *     // CSS doesn't have a 'color' token, so this token will be appended
			 *     'color': /\b(?:red|green|blue)\b/
			 * });
			 */
			extend: function (id, redef) {
				var lang = _.util.clone(_.languages[id]);

				for (var key in redef) {
					lang[key] = redef[key];
				}

				return lang;
			},

			/**
			 * Inserts tokens _before_ another token in a language definition or any other grammar.
			 *
			 * ## Usage
			 *
			 * This helper method makes it easy to modify existing languages. For example, the CSS language definition
			 * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded
			 * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the
			 * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do
			 * this:
			 *
			 * ```js
			 * Prism.languages.markup.style = {
			 *     // token
			 * };
			 * ```
			 *
			 * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens
			 * before existing tokens. For the CSS example above, you would use it like this:
			 *
			 * ```js
			 * Prism.languages.insertBefore('markup', 'cdata', {
			 *     'style': {
			 *         // token
			 *     }
			 * });
			 * ```
			 *
			 * ## Special cases
			 *
			 * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar
			 * will be ignored.
			 *
			 * This behavior can be used to insert tokens after `before`:
			 *
			 * ```js
			 * Prism.languages.insertBefore('markup', 'comment', {
			 *     'comment': Prism.languages.markup.comment,
			 *     // tokens after 'comment'
			 * });
			 * ```
			 *
			 * ## Limitations
			 *
			 * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object
			 * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave
			 * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily
			 * deleting properties which is necessary to insert at arbitrary positions.
			 *
			 * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.
			 * Instead, it will create a new object and replace all references to the target object with the new one. This
			 * can be done without temporarily deleting properties, so the iteration order is well-defined.
			 *
			 * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if
			 * you hold the target object in a variable, then the value of the variable will not change.
			 *
			 * ```js
			 * var oldMarkup = Prism.languages.markup;
			 * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });
			 *
			 * assert(oldMarkup !== Prism.languages.markup);
			 * assert(newMarkup === Prism.languages.markup);
			 * ```
			 *
			 * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the
			 * object to be modified.
			 * @param {string} before The key to insert before.
			 * @param {Grammar} insert An object containing the key-value pairs to be inserted.
			 * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the
			 * object to be modified.
			 *
			 * Defaults to `Prism.languages`.
			 * @returns {Grammar} The new grammar object.
			 * @public
			 */
			insertBefore: function (inside, before, insert, root) {
				root = root || /** @type {any} */ (_.languages);
				var grammar = root[inside];
				/** @type {Grammar} */
				var ret = {};

				for (var token in grammar) {
					if (grammar.hasOwnProperty(token)) {

						if (token == before) {
							for (var newToken in insert) {
								if (insert.hasOwnProperty(newToken)) {
									ret[newToken] = insert[newToken];
								}
							}
						}

						// Do not insert token which also occur in insert. See #1525
						if (!insert.hasOwnProperty(token)) {
							ret[token] = grammar[token];
						}
					}
				}

				var old = root[inside];
				root[inside] = ret;

				// Update references in other language definitions
				_.languages.DFS(_.languages, function (key, value) {
					if (value === old && key != inside) {
						this[key] = ret;
					}
				});

				return ret;
			},

			// Traverse a language definition with Depth First Search
			DFS: function DFS(o, callback, type, visited) {
				visited = visited || {};

				var objId = _.util.objId;

				for (var i in o) {
					if (o.hasOwnProperty(i)) {
						callback.call(o, i, o[i], type || i);

						var property = o[i];
						var propertyType = _.util.type(property);

						if (propertyType === 'Object' && !visited[objId(property)]) {
							visited[objId(property)] = true;
							DFS(property, callback, null, visited);
						} else if (propertyType === 'Array' && !visited[objId(property)]) {
							visited[objId(property)] = true;
							DFS(property, callback, i, visited);
						}
					}
				}
			}
		},

		plugins: {},

		/**
		 * This is the most high-level function in Prism’s API.
		 * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on
		 * each one of them.
		 *
		 * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.
		 *
		 * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.
		 * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.
		 * @memberof Prism
		 * @public
		 */
		highlightAll: function (async, callback) {
			_.highlightAllUnder(document, async, callback);
		},

		/**
		 * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls
		 * {@link Prism.highlightElement} on each one of them.
		 *
		 * The following hooks will be run:
		 * 1. `before-highlightall`
		 * 2. `before-all-elements-highlight`
		 * 3. All hooks of {@link Prism.highlightElement} for each element.
		 *
		 * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.
		 * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.
		 * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.
		 * @memberof Prism
		 * @public
		 */
		highlightAllUnder: function (container, async, callback) {
			var env = {
				callback: callback,
				container: container,
				selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
			};

			_.hooks.run('before-highlightall', env);

			env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));

			_.hooks.run('before-all-elements-highlight', env);

			for (var i = 0, element; (element = env.elements[i++]);) {
				_.highlightElement(element, async === true, env.callback);
			}
		},

		/**
		 * Highlights the code inside a single element.
		 *
		 * The following hooks will be run:
		 * 1. `before-sanity-check`
		 * 2. `before-highlight`
		 * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.
		 * 4. `before-insert`
		 * 5. `after-highlight`
		 * 6. `complete`
		 *
		 * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for
		 * the element's language.
		 *
		 * @param {Element} element The element containing the code.
		 * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.
		 * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers
		 * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is
		 * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).
		 *
		 * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for
		 * asynchronous highlighting to work. You can build your own bundle on the
		 * [Download page](https://prismjs.com/download.html).
		 * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.
		 * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.
		 * @memberof Prism
		 * @public
		 */
		highlightElement: function (element, async, callback) {
			// Find language
			var language = _.util.getLanguage(element);
			var grammar = _.languages[language];

			// Set language on the element, if not present
			_.util.setLanguage(element, language);

			// Set language on the parent, for styling
			var parent = element.parentElement;
			if (parent && parent.nodeName.toLowerCase() === 'pre') {
				_.util.setLanguage(parent, language);
			}

			var code = element.textContent;

			var env = {
				element: element,
				language: language,
				grammar: grammar,
				code: code
			};

			function insertHighlightedCode(highlightedCode) {
				env.highlightedCode = highlightedCode;

				_.hooks.run('before-insert', env);

				env.element.innerHTML = env.highlightedCode;

				_.hooks.run('after-highlight', env);
				_.hooks.run('complete', env);
				callback && callback.call(env.element);
			}

			_.hooks.run('before-sanity-check', env);

			// plugins may change/add the parent/element
			parent = env.element.parentElement;
			if (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {
				parent.setAttribute('tabindex', '0');
			}

			if (!env.code) {
				_.hooks.run('complete', env);
				callback && callback.call(env.element);
				return;
			}

			_.hooks.run('before-highlight', env);

			if (!env.grammar) {
				insertHighlightedCode(_.util.encode(env.code));
				return;
			}

			if (async && _self.Worker) {
				var worker = new Worker(_.filename);

				worker.onmessage = function (evt) {
					insertHighlightedCode(evt.data);
				};

				worker.postMessage(JSON.stringify({
					language: env.language,
					code: env.code,
					immediateClose: true
				}));
			} else {
				insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
			}
		},

		/**
		 * Low-level function, only use if you know what you’re doing. It accepts a string of text as input
		 * and the language definitions to use, and returns a string with the HTML produced.
		 *
		 * The following hooks will be run:
		 * 1. `before-tokenize`
		 * 2. `after-tokenize`
		 * 3. `wrap`: On each {@link Token}.
		 *
		 * @param {string} text A string with the code to be highlighted.
		 * @param {Grammar} grammar An object containing the tokens to use.
		 *
		 * Usually a language definition like `Prism.languages.markup`.
		 * @param {string} language The name of the language definition passed to `grammar`.
		 * @returns {string} The highlighted HTML.
		 * @memberof Prism
		 * @public
		 * @example
		 * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');
		 */
		highlight: function (text, grammar, language) {
			var env = {
				code: text,
				grammar: grammar,
				language: language
			};
			_.hooks.run('before-tokenize', env);
			if (!env.grammar) {
				throw new Error('The language "' + env.language + '" has no grammar.');
			}
			env.tokens = _.tokenize(env.code, env.grammar);
			_.hooks.run('after-tokenize', env);
			return Token.stringify(_.util.encode(env.tokens), env.language);
		},

		/**
		 * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input
		 * and the language definitions to use, and returns an array with the tokenized code.
		 *
		 * When the language definition includes nested tokens, the function is called recursively on each of these tokens.
		 *
		 * This method could be useful in other contexts as well, as a very crude parser.
		 *
		 * @param {string} text A string with the code to be highlighted.
		 * @param {Grammar} grammar An object containing the tokens to use.
		 *
		 * Usually a language definition like `Prism.languages.markup`.
		 * @returns {TokenStream} An array of strings and tokens, a token stream.
		 * @memberof Prism
		 * @public
		 * @example
		 * let code = `var foo = 0;`;
		 * let tokens = Prism.tokenize(code, Prism.languages.javascript);
		 * tokens.forEach(token => {
		 *     if (token instanceof Prism.Token && token.type === 'number') {
		 *         console.log(`Found numeric literal: ${token.content}`);
		 *     }
		 * });
		 */
		tokenize: function (text, grammar) {
			var rest = grammar.rest;
			if (rest) {
				for (var token in rest) {
					grammar[token] = rest[token];
				}

				delete grammar.rest;
			}

			var tokenList = new LinkedList();
			addAfter(tokenList, tokenList.head, text);

			matchGrammar(text, tokenList, grammar, tokenList.head, 0);

			return toArray(tokenList);
		},

		/**
		 * @namespace
		 * @memberof Prism
		 * @public
		 */
		hooks: {
			all: {},

			/**
			 * Adds the given callback to the list of callbacks for the given hook.
			 *
			 * The callback will be invoked when the hook it is registered for is run.
			 * Hooks are usually directly run by a highlight function but you can also run hooks yourself.
			 *
			 * One callback function can be registered to multiple hooks and the same hook multiple times.
			 *
			 * @param {string} name The name of the hook.
			 * @param {HookCallback} callback The callback function which is given environment variables.
			 * @public
			 */
			add: function (name, callback) {
				var hooks = _.hooks.all;

				hooks[name] = hooks[name] || [];

				hooks[name].push(callback);
			},

			/**
			 * Runs a hook invoking all registered callbacks with the given environment variables.
			 *
			 * Callbacks will be invoked synchronously and in the order in which they were registered.
			 *
			 * @param {string} name The name of the hook.
			 * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.
			 * @public
			 */
			run: function (name, env) {
				var callbacks = _.hooks.all[name];

				if (!callbacks || !callbacks.length) {
					return;
				}

				for (var i = 0, callback; (callback = callbacks[i++]);) {
					callback(env);
				}
			}
		},

		Token: Token
	};
	_self.Prism = _;


	// Typescript note:
	// The following can be used to import the Token type in JSDoc:
	//
	//   @typedef {InstanceType<import("./prism-core")["Token"]>} Token

	/**
	 * Creates a new token.
	 *
	 * @param {string} type See {@link Token#type type}
	 * @param {string | TokenStream} content See {@link Token#content content}
	 * @param {string|string[]} [alias] The alias(es) of the token.
	 * @param {string} [matchedStr=""] A copy of the full string this token was created from.
	 * @class
	 * @global
	 * @public
	 */
	function Token(type, content, alias, matchedStr) {
		/**
		 * The type of the token.
		 *
		 * This is usually the key of a pattern in a {@link Grammar}.
		 *
		 * @type {string}
		 * @see GrammarToken
		 * @public
		 */
		this.type = type;
		/**
		 * The strings or tokens contained by this token.
		 *
		 * This will be a token stream if the pattern matched also defined an `inside` grammar.
		 *
		 * @type {string | TokenStream}
		 * @public
		 */
		this.content = content;
		/**
		 * The alias(es) of the token.
		 *
		 * @type {string|string[]}
		 * @see GrammarToken
		 * @public
		 */
		this.alias = alias;
		// Copy of the full string this token was created from
		this.length = (matchedStr || '').length | 0;
	}

	/**
	 * A token stream is an array of strings and {@link Token Token} objects.
	 *
	 * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process
	 * them.
	 *
	 * 1. No adjacent strings.
	 * 2. No empty strings.
	 *
	 *    The only exception here is the token stream that only contains the empty string and nothing else.
	 *
	 * @typedef {Array<string | Token>} TokenStream
	 * @global
	 * @public
	 */

	/**
	 * Converts the given token or token stream to an HTML representation.
	 *
	 * The following hooks will be run:
	 * 1. `wrap`: On each {@link Token}.
	 *
	 * @param {string | Token | TokenStream} o The token or token stream to be converted.
	 * @param {string} language The name of current language.
	 * @returns {string} The HTML representation of the token or token stream.
	 * @memberof Token
	 * @static
	 */
	Token.stringify = function stringify(o, language) {
		if (typeof o == 'string') {
			return o;
		}
		if (Array.isArray(o)) {
			var s = '';
			o.forEach(function (e) {
				s += stringify(e, language);
			});
			return s;
		}

		var env = {
			type: o.type,
			content: stringify(o.content, language),
			tag: 'span',
			classes: ['token', o.type],
			attributes: {},
			language: language
		};

		var aliases = o.alias;
		if (aliases) {
			if (Array.isArray(aliases)) {
				Array.prototype.push.apply(env.classes, aliases);
			} else {
				env.classes.push(aliases);
			}
		}

		_.hooks.run('wrap', env);

		var attributes = '';
		for (var name in env.attributes) {
			attributes += ' ' + name + '="' + (env.attributes[name] || '').replace(/"/g, '&quot;') + '"';
		}

		return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + attributes + '>' + env.content + '</' + env.tag + '>';
	};

	/**
	 * @param {RegExp} pattern
	 * @param {number} pos
	 * @param {string} text
	 * @param {boolean} lookbehind
	 * @returns {RegExpExecArray | null}
	 */
	function matchPattern(pattern, pos, text, lookbehind) {
		pattern.lastIndex = pos;
		var match = pattern.exec(text);
		if (match && lookbehind && match[1]) {
			// change the match to remove the text matched by the Prism lookbehind group
			var lookbehindLength = match[1].length;
			match.index += lookbehindLength;
			match[0] = match[0].slice(lookbehindLength);
		}
		return match;
	}

	/**
	 * @param {string} text
	 * @param {LinkedList<string | Token>} tokenList
	 * @param {any} grammar
	 * @param {LinkedListNode<string | Token>} startNode
	 * @param {number} startPos
	 * @param {RematchOptions} [rematch]
	 * @returns {void}
	 * @private
	 *
	 * @typedef RematchOptions
	 * @property {string} cause
	 * @property {number} reach
	 */
	function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
		for (var token in grammar) {
			if (!grammar.hasOwnProperty(token) || !grammar[token]) {
				continue;
			}

			var patterns = grammar[token];
			patterns = Array.isArray(patterns) ? patterns : [patterns];

			for (var j = 0; j < patterns.length; ++j) {
				if (rematch && rematch.cause == token + ',' + j) {
					return;
				}

				var patternObj = patterns[j];
				var inside = patternObj.inside;
				var lookbehind = !!patternObj.lookbehind;
				var greedy = !!patternObj.greedy;
				var alias = patternObj.alias;

				if (greedy && !patternObj.pattern.global) {
					// Without the global flag, lastIndex won't work
					var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
					patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');
				}

				/** @type {RegExp} */
				var pattern = patternObj.pattern || patternObj;

				for ( // iterate the token list and keep track of the current token/string position
					var currentNode = startNode.next, pos = startPos;
					currentNode !== tokenList.tail;
					pos += currentNode.value.length, currentNode = currentNode.next
				) {

					if (rematch && pos >= rematch.reach) {
						break;
					}

					var str = currentNode.value;

					if (tokenList.length > text.length) {
						// Something went terribly wrong, ABORT, ABORT!
						return;
					}

					if (str instanceof Token) {
						continue;
					}

					var removeCount = 1; // this is the to parameter of removeBetween
					var match;

					if (greedy) {
						match = matchPattern(pattern, pos, text, lookbehind);
						if (!match || match.index >= text.length) {
							break;
						}

						var from = match.index;
						var to = match.index + match[0].length;
						var p = pos;

						// find the node that contains the match
						p += currentNode.value.length;
						while (from >= p) {
							currentNode = currentNode.next;
							p += currentNode.value.length;
						}
						// adjust pos (and p)
						p -= currentNode.value.length;
						pos = p;

						// the current node is a Token, then the match starts inside another Token, which is invalid
						if (currentNode.value instanceof Token) {
							continue;
						}

						// find the last node which is affected by this match
						for (
							var k = currentNode;
							k !== tokenList.tail && (p < to || typeof k.value === 'string');
							k = k.next
						) {
							removeCount++;
							p += k.value.length;
						}
						removeCount--;

						// replace with the new match
						str = text.slice(pos, p);
						match.index -= pos;
					} else {
						match = matchPattern(pattern, 0, str, lookbehind);
						if (!match) {
							continue;
						}
					}

					// eslint-disable-next-line no-redeclare
					var from = match.index;
					var matchStr = match[0];
					var before = str.slice(0, from);
					var after = str.slice(from + matchStr.length);

					var reach = pos + str.length;
					if (rematch && reach > rematch.reach) {
						rematch.reach = reach;
					}

					var removeFrom = currentNode.prev;

					if (before) {
						removeFrom = addAfter(tokenList, removeFrom, before);
						pos += before.length;
					}

					removeRange(tokenList, removeFrom, removeCount);

					var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
					currentNode = addAfter(tokenList, removeFrom, wrapped);

					if (after) {
						addAfter(tokenList, currentNode, after);
					}

					if (removeCount > 1) {
						// at least one Token object was removed, so we have to do some rematching
						// this can only happen if the current pattern is greedy

						/** @type {RematchOptions} */
						var nestedRematch = {
							cause: token + ',' + j,
							reach: reach
						};
						matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);

						// the reach might have been extended because of the rematching
						if (rematch && nestedRematch.reach > rematch.reach) {
							rematch.reach = nestedRematch.reach;
						}
					}
				}
			}
		}
	}

	/**
	 * @typedef LinkedListNode
	 * @property {T} value
	 * @property {LinkedListNode<T> | null} prev The previous node.
	 * @property {LinkedListNode<T> | null} next The next node.
	 * @template T
	 * @private
	 */

	/**
	 * @template T
	 * @private
	 */
	function LinkedList() {
		/** @type {LinkedListNode<T>} */
		var head = { value: null, prev: null, next: null };
		/** @type {LinkedListNode<T>} */
		var tail = { value: null, prev: head, next: null };
		head.next = tail;

		/** @type {LinkedListNode<T>} */
		this.head = head;
		/** @type {LinkedListNode<T>} */
		this.tail = tail;
		this.length = 0;
	}

	/**
	 * Adds a new node with the given value to the list.
	 *
	 * @param {LinkedList<T>} list
	 * @param {LinkedListNode<T>} node
	 * @param {T} value
	 * @returns {LinkedListNode<T>} The added node.
	 * @template T
	 */
	function addAfter(list, node, value) {
		// assumes that node != list.tail && values.length >= 0
		var next = node.next;

		var newNode = { value: value, prev: node, next: next };
		node.next = newNode;
		next.prev = newNode;
		list.length++;

		return newNode;
	}
	/**
	 * Removes `count` nodes after the given node. The given node will not be removed.
	 *
	 * @param {LinkedList<T>} list
	 * @param {LinkedListNode<T>} node
	 * @param {number} count
	 * @template T
	 */
	function removeRange(list, node, count) {
		var next = node.next;
		for (var i = 0; i < count && next !== list.tail; i++) {
			next = next.next;
		}
		node.next = next;
		next.prev = node;
		list.length -= i;
	}
	/**
	 * @param {LinkedList<T>} list
	 * @returns {T[]}
	 * @template T
	 */
	function toArray(list) {
		var array = [];
		var node = list.head.next;
		while (node !== list.tail) {
			array.push(node.value);
			node = node.next;
		}
		return array;
	}


	if (!_self.document) {
		if (!_self.addEventListener) {
			// in Node.js
			return _;
		}

		if (!_.disableWorkerMessageHandler) {
			// In worker
			_self.addEventListener('message', function (evt) {
				var message = JSON.parse(evt.data);
				var lang = message.language;
				var code = message.code;
				var immediateClose = message.immediateClose;

				_self.postMessage(_.highlight(code, _.languages[lang], lang));
				if (immediateClose) {
					_self.close();
				}
			}, false);
		}

		return _;
	}

	// Get current script and highlight
	var script = _.util.currentScript();

	if (script) {
		_.filename = script.src;

		if (script.hasAttribute('data-manual')) {
			_.manual = true;
		}
	}

	function highlightAutomaticallyCallback() {
		if (!_.manual) {
			_.highlightAll();
		}
	}

	if (!_.manual) {
		// If the document state is "loading", then we'll use DOMContentLoaded.
		// If the document state is "interactive" and the prism.js script is deferred, then we'll also use the
		// DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they
		// might take longer one animation frame to execute which can create a race condition where only some plugins have
		// been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.
		// See https://github.com/PrismJS/prism/issues/2102
		var readyState = document.readyState;
		if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {
			document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);
		} else {
			if (window.requestAnimationFrame) {
				window.requestAnimationFrame(highlightAutomaticallyCallback);
			} else {
				window.setTimeout(highlightAutomaticallyCallback, 16);
			}
		}
	}

	return _;

}(_self));

if (typeof module !== 'undefined' && module.exports) {
	module.exports = Prism;
}

// hack for components to work correctly in node.js
if (typeof global !== 'undefined') {
	global.Prism = Prism;
}

// some additional documentation/types

/**
 * The expansion of a simple `RegExp` literal to support additional properties.
 *
 * @typedef GrammarToken
 * @property {RegExp} pattern The regular expression of the token.
 * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively)
 * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.
 * @property {boolean} [greedy=false] Whether the token is greedy.
 * @property {string|string[]} [alias] An optional alias or list of aliases.
 * @property {Grammar} [inside] The nested grammar of this token.
 *
 * The `inside` grammar will be used to tokenize the text value of each token of this kind.
 *
 * This can be used to make nested and even recursive language definitions.
 *
 * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into
 * each another.
 * @global
 * @public
 */

/**
 * @typedef Grammar
 * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>}
 * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar.
 * @global
 * @public
 */

/**
 * A function which will invoked after an element was successfully highlighted.
 *
 * @callback HighlightCallback
 * @param {Element} element The element successfully highlighted.
 * @returns {void}
 * @global
 * @public
 */

/**
 * @callback HookCallback
 * @param {Object<string, any>} env The environment variables of the hook.
 * @returns {void}
 * @global
 * @public
 */
|Ƶx%var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(n,t){var r,i;switch(t=t||{},a.util.type(n)){case"Object":if(i=a.util.objId(n),t[i])return t[i];for(var l in r={},t[i]=r,n)n.hasOwnProperty(l)&&(r[l]=e(n[l],t));return r;case"Array":return i=a.util.objId(n),t[i]?t[i]:(r=[],t[i]=r,n.forEach((function(n,a){r[a]=e(n,t)})),r);default:return n}},getLanguage:function(e){for(;e;){var t=n.exec(e.className);if(t)return t[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,t){e.className=e.className.replace(RegExp(n,"gi"),""),e.classList.add("language-"+t)},currentScript:function(){if("undefined"==typeof document)return null;if(document.currentScript&&"SCRIPT"===document.currentScript.tagName)return document.currentScript;try{throw new Error}catch(r){var e=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(r.stack)||[])[1];if(e){var n=document.getElementsByTagName("script");for(var t in n)if(n[t].src==e)return n[t]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:r,plaintext:r,text:r,txt:r,extend:function(e,n){var t=a.util.clone(a.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(e,n,t,r){var i=(r=r||a.languages)[e],l={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var s in t)t.hasOwnProperty(s)&&(l[s]=t[s]);t.hasOwnProperty(o)||(l[o]=i[o])}var u=r[e];return r[e]=l,a.languages.DFS(a.languages,(function(n,t){t===u&&n!=e&&(this[n]=l)})),l},DFS:function e(n,t,r,i){i=i||{};var l=a.util.objId;for(var o in n)if(n.hasOwnProperty(o)){t.call(n,o,n[o],r||o);var s=n[o],u=a.util.type(s);"Object"!==u||i[l(s)]?"Array"!==u||i[l(s)]||(i[l(s)]=!0,e(s,t,o,i)):(i[l(s)]=!0,e(s,t,null,i))}}},plugins:{},highlightAll:function(e,n){a.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};a.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),a.hooks.run("before-all-elements-highlight",r);for(var i,l=0;i=r.elements[l++];)a.highlightElement(i,!0===n,r.callback)},highlightElement:function(n,t,r){var i=a.util.getLanguage(n),l=a.languages[i];a.util.setLanguage(n,i);var o=n.parentElement;o&&"pre"===o.nodeName.toLowerCase()&&a.util.setLanguage(o,i);var s={element:n,language:i,grammar:l,code:n.textContent};function u(e){s.highlightedCode=e,a.hooks.run("before-insert",s),s.element.innerHTML=s.highlightedCode,a.hooks.run("after-highlight",s),a.hooks.run("complete",s),r&&r.call(s.element)}if(a.hooks.run("before-sanity-check",s),(o=s.element.parentElement)&&"pre"===o.nodeName.toLowerCase()&&!o.hasAttribute("tabindex")&&o.setAttribute("tabindex","0"),!s.code)return a.hooks.run("complete",s),void(r&&r.call(s.element));if(a.hooks.run("before-highlight",s),s.grammar)if(t&&e.Worker){var c=new Worker(a.filename);c.onmessage=function(e){u(e.data)},c.postMessage(JSON.stringify({language:s.language,code:s.code,immediateClose:!0}))}else u(a.highlight(s.code,s.grammar,s.language));else u(a.util.encode(s.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};if(a.hooks.run("before-tokenize",r),!r.grammar)throw new Error('The language "'+r.language+'" has no grammar.');return r.tokens=a.tokenize(r.code,r.grammar),a.hooks.run("after-tokenize",r),i.stringify(a.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new s;return u(a,a.head,e),o(e,a,n,a.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=a.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=a.hooks.all[e];if(t&&t.length)for(var r,i=0;r=t[i++];)r(n)}},Token:i};function i(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function l(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function o(e,n,t,r,s,g){for(var f in t)if(t.hasOwnProperty(f)&&t[f]){var h=t[f];h=Array.isArray(h)?h:[h];for(var d=0;d<h.length;++d){if(g&&g.cause==f+","+d)return;var v=h[d],p=v.inside,m=!!v.lookbehind,y=!!v.greedy,k=v.alias;if(y&&!v.pattern.global){var x=v.pattern.toString().match(/[imsuy]*$/)[0];v.pattern=RegExp(v.pattern.source,x+"g")}for(var b=v.pattern||v,w=r.next,A=s;w!==n.tail&&!(g&&A>=g.reach);A+=w.value.length,w=w.next){var P=w.value;if(n.length>e.length)return;if(!(P instanceof i)){var E,S=1;if(y){if(!(E=l(b,A,e,m))||E.index>=e.length)break;var L=E.index,O=E.index+E[0].length,C=A;for(C+=w.value.length;L>=C;)C+=(w=w.next).value.length;if(A=C-=w.value.length,w.value instanceof i)continue;for(var j=w;j!==n.tail&&(C<O||"string"==typeof j.value);j=j.next)S++,C+=j.value.length;S--,P=e.slice(A,C),E.index-=A}else if(!(E=l(b,0,P,m)))continue;L=E.index;var N=E[0],_=P.slice(0,L),M=P.slice(L+N.length),W=A+P.length;g&&W>g.reach&&(g.reach=W);var I=w.prev;if(_&&(I=u(n,I,_),A+=_.length),c(n,I,S),w=u(n,I,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),S>1){var T={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,T),g&&T.reach>g.reach&&(g.reach=T.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;n.next=r,r.prev=n,e.length-=a}if(e.Prism=a,i.stringify=function e(n,t){if("string"==typeof n)return n;if(Array.isArray(n)){var r="";return n.forEach((function(n){r+=e(n,t)})),r}var i={type:n.type,content:e(n.content,t),tag:"span",classes:["token",n.type],attributes:{},language:t},l=n.alias;l&&(Array.isArray(l)?Array.prototype.push.apply(i.classes,l):i.classes.push(l)),a.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=" "+s+'="'+(i.attributes[s]||"").replace(/"/g,"&quot;")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'"'+o+">"+i.content+"</"+i.tag+">"},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);J2xa(function (Prism) {

	var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/;
	var modName = /\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g, function () { return keyword.source; });

	Prism.languages.cpp = Prism.languages.extend('c', {
		'class-name': [
			{
				pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source
					.replace(/<keyword>/g, function () { return keyword.source; })),
				lookbehind: true
			},
			// This is intended to capture the class name of method implementations like:
			//   void foo::bar() const {}
			// However! The `foo` in the above example could also be a namespace, so we only capture the class name if
			// it starts with an uppercase letter. This approximation should give decent results.
			/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,
			// This will capture the class name before destructors like:
			//   Foo::~Foo() {}
			/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,
			// This also intends to capture the class name of method implementations but here the class has template
			// parameters, so it can't be a namespace (until C++ adds generic namespaces).
			/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/
		],
		'keyword': keyword,
		'number': {
			pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,
			greedy: true
		},
		'operator': />>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,
		'boolean': /\b(?:false|true)\b/
	});

	Prism.languages.insertBefore('cpp', 'string', {
		'module': {
			// https://en.cppreference.com/w/cpp/language/modules
			pattern: RegExp(
				/(\b(?:import|module)\s+)/.source +
				'(?:' +
				// header-name
				/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source +
				'|' +
				// module name or partition or both
				/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g, function () { return modName; }) +
				')'
			),
			lookbehind: true,
			greedy: true,
			inside: {
				'string': /^[<"][\s\S]+/,
				'operator': /:/,
				'punctuation': /\./
			}
		},
		'raw-string': {
			pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,
			alias: 'string',
			greedy: true
		}
	});

	Prism.languages.insertBefore('cpp', 'keyword', {
		'generic-function': {
			pattern: /\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,
			inside: {
				'function': /^\w+/,
				'generic': {
					pattern: /<[\s\S]+/,
					alias: 'class-name',
					inside: Prism.languages.cpp
				}
			}
		}
	});

	Prism.languages.insertBefore('cpp', 'operator', {
		'double-colon': {
			pattern: /::/,
			alias: 'punctuation'
		}
	});

	Prism.languages.insertBefore('cpp', 'class-name', {
		// the base clause is an optional list of parent classes
		// https://en.cppreference.com/w/cpp/language/class
		'base-clause': {
			pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,
			lookbehind: true,
			greedy: true,
			inside: Prism.languages.extend('cpp', {})
		}
	});

	Prism.languages.insertBefore('inside', 'double-colon', {
		// All untokenized words that are not namespaces should be class names
		'class-name': /\b[a-z_]\w*\b(?!\s*::)/i
	}, Prism.languages.cpp['base-clause']);

}(Prism));
)!鴢x$
!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!<keyword>)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!<keyword>)\\w+".replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"<mod-name>(?:\\s*:\\s*<mod-name>)?|:\\s*<mod-name>".replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism);-릃fxl(function (Prism) {
	Prism.languages.crystal = Prism.languages.extend('ruby', {
		'keyword': [
			/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,
			{
				pattern: /(\.\s*)(?:is_a|responds_to)\?/,
				lookbehind: true
			}
		],
		'number': /\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,
		'operator': [
			/->/,
			Prism.languages.ruby.operator,
		],
		'punctuation': /[(){}[\].,;\\]/,
	});

	Prism.languages.insertBefore('crystal', 'string-literal', {
		'attribute': {
			pattern: /@\[.*?\]/,
			inside: {
				'delimiter': {
					pattern: /^@\[|\]$/,
					alias: 'punctuation'
				},
				'attribute': {
					pattern: /^(\s*)\w+/,
					lookbehind: true,
					alias: 'class-name'
				},
				'args': {
					pattern: /\S(?:[\s\S]*\S)?/,
					inside: Prism.languages.crystal
				},
			}
		},
		'expansion': {
			pattern: /\{(?:\{.*?\}|%.*?%)\}/,
			inside: {
				'content': {
					pattern: /^(\{.)[\s\S]+(?=.\}$)/,
					lookbehind: true,
					inside: Prism.languages.crystal
				},
				'delimiter': {
					pattern: /^\{[\{%]|[\}%]\}$/,
					alias: 'operator'
				}
			}
		},
		'char': {
			pattern: /'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,
			greedy: true
		}
	});

}(Prism));
 cQx!function(e){e.languages.crystal=e.languages.extend("ruby",{keyword:[/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,operator:[/->/,e.languages.ruby.operator],punctuation:/[(){}[\].,;\\]/}),e.languages.insertBefore("crystal","string-literal",{attribute:{pattern:/@\[.*?\]/,inside:{delimiter:{pattern:/^@\[|\]$/,alias:"punctuation"},attribute:{pattern:/^(\s*)\w+/,lookbehind:!0,alias:"class-name"},args:{pattern:/\S(?:[\s\S]*\S)?/,inside:e.languages.crystal}}},expansion:{pattern:/\{(?:\{.*?\}|%.*?%)\}/,inside:{content:{pattern:/^(\{.)[\s\S]+(?=.\}$)/,lookbehind:!0,inside:e.languages.crystal},delimiter:{pattern:/^\{[\{%]|[\}%]\}$/,alias:"operator"}}},char:{pattern:/'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,greedy:!0}})}(Prism);*x4 (function (Prism) {

	/**
	 * Replaces all placeholders "<<n>>" of given pattern with the n-th replacement (zero based).
	 *
	 * Note: This is a simple text based replacement. Be careful when using backreferences!
	 *
	 * @param {string} pattern the given pattern.
	 * @param {string[]} replacements a list of replacement which can be inserted into the given pattern.
	 * @returns {string} the pattern with all placeholders replaced with their corresponding replacements.
	 * @example replace(/a<<0>>a/.source, [/b+/.source]) === /a(?:b+)a/.source
	 */
	function replace(pattern, replacements) {
		return pattern.replace(/<<(\d+)>>/g, function (m, index) {
			return '(?:' + replacements[+index] + ')';
		});
	}
	/**
	 * @param {string} pattern
	 * @param {string[]} replacements
	 * @param {string} [flags]
	 * @returns {RegExp}
	 */
	function re(pattern, replacements, flags) {
		return RegExp(replace(pattern, replacements), flags || '');
	}

	/**
	 * Creates a nested pattern where all occurrences of the string `<<self>>` are replaced with the pattern itself.
	 *
	 * @param {string} pattern
	 * @param {number} depthLog2
	 * @returns {string}
	 */
	function nested(pattern, depthLog2) {
		for (var i = 0; i < depthLog2; i++) {
			pattern = pattern.replace(/<<self>>/g, function () { return '(?:' + pattern + ')'; });
		}
		return pattern.replace(/<<self>>/g, '[^\\s\\S]');
	}

	// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/
	var keywordKinds = {
		// keywords which represent a return or variable type
		type: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void',
		// keywords which are used to declare a type
		typeDeclaration: 'class enum interface record struct',
		// contextual keywords
		// ("var" and "dynamic" are missing because they are used like types)
		contextual: 'add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)',
		// all other keywords
		other: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield'
	};

	// keywords
	function keywordsToPattern(words) {
		return '\\b(?:' + words.trim().replace(/ /g, '|') + ')\\b';
	}
	var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration);
	var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other));
	var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other);
	var nonContextualKeywords = keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other);

	// types
	var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source, 2); // the idea behind the other forbidden characters is to prevent false positives. Same for tupleElement.
	var nestedRound = nested(/\((?:[^()]|<<self>>)*\)/.source, 2);
	var name = /@?\b[A-Za-z_]\w*\b/.source;
	var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [name, generic]);
	var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [nonTypeKeywords, genericName]);
	var array = /\[\s*(?:,\s*)*\]/.source;
	var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [identifier, array]);
	var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [generic, nestedRound, array]);
	var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]);
	var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [tuple, identifier, array]);

	var typeInside = {
		'keyword': keywords,
		'punctuation': /[<>()?,.:[\]]/
	};

	// strings & characters
	// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#character-literals
	// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#string-literals
	var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source; // simplified pattern
	var regularString = /"(?:\\.|[^\\"\r\n])*"/.source;
	var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;


	Prism.languages.csharp = Prism.languages.extend('clike', {
		'string': [
			{
				pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]),
				lookbehind: true,
				greedy: true
			},
			{
				pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]),
				lookbehind: true,
				greedy: true
			}
		],
		'class-name': [
			{
				// Using static
				// using static System.Math;
				pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]),
				lookbehind: true,
				inside: typeInside
			},
			{
				// Using alias (type)
				// using Project = PC.MyCompany.Project;
				pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [name, typeExpression]),
				lookbehind: true,
				inside: typeInside
			},
			{
				// Using alias (alias)
				// using Project = PC.MyCompany.Project;
				pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]),
				lookbehind: true
			},
			{
				// Type declarations
				// class Foo<A, B>
				// interface Foo<out A, B>
				pattern: re(/(\b<<0>>\s+)<<1>>/.source, [typeDeclarationKeywords, genericName]),
				lookbehind: true,
				inside: typeInside
			},
			{
				// Single catch exception declaration
				// catch(Foo)
				// (things like catch(Foo e) is covered by variable declaration)
				pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]),
				lookbehind: true,
				inside: typeInside
			},
			{
				// Name of the type parameter of generic constraints
				// where Foo : class
				pattern: re(/(\bwhere\s+)<<0>>/.source, [name]),
				lookbehind: true
			},
			{
				// Casts and checks via as and is.
				// as Foo<A>, is Bar<B>
				// (things like if(a is Foo b) is covered by variable declaration)
				pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]),
				lookbehind: true,
				inside: typeInside
			},
			{
				// Variable, field and parameter declaration
				// (Foo bar, Bar baz, Foo[,,] bay, Foo<Bar, FooBar<Bar>> bax)
				pattern: re(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [typeExpression, nonContextualKeywords, name]),
				inside: typeInside
			}
		],
		'keyword': keywords,
		// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#literals
		'number': /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,
		'operator': />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,
		'punctuation': /\?\.?|::|[{}[\];(),.:]/
	});

	Prism.languages.insertBefore('csharp', 'number', {
		'range': {
			pattern: /\.\./,
			alias: 'operator'
		}
	});

	Prism.languages.insertBefore('csharp', 'punctuation', {
		'named-parameter': {
			pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]),
			lookbehind: true,
			alias: 'punctuation'
		}
	});

	Prism.languages.insertBefore('csharp', 'class-name', {
		'namespace': {
			// namespace Foo.Bar {}
			// using Foo.Bar;
			pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]),
			lookbehind: true,
			inside: {
				'punctuation': /\./
			}
		},
		'type-expression': {
			// default(Foo), typeof(Foo<Bar>), sizeof(int)
			pattern: re(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source, [nestedRound]),
			lookbehind: true,
			alias: 'class-name',
			inside: typeInside
		},
		'return-type': {
			// Foo<Bar> ForBar(); Foo IFoo.Bar() => 0
			// int this[int index] => 0; T IReadOnlyList<T>.this[int index] => this[index];
			// int Foo => 0; int Foo { get; set } = 0;
			pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [typeExpression, identifier]),
			inside: typeInside,
			alias: 'class-name'
		},
		'constructor-invocation': {
			// new List<Foo<Bar[]>> { }
			pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]),
			lookbehind: true,
			inside: typeInside,
			alias: 'class-name'
		},
		/*'explicit-implementation': {
			// int IFoo<Foo>.Bar => 0; void IFoo<Foo<Foo>>.Foo<T>();
			pattern: replace(/\b<<0>>(?=\.<<1>>)/, className, methodOrPropertyDeclaration),
			inside: classNameInside,
			alias: 'class-name'
		},*/
		'generic-method': {
			// foo<Bar>()
			pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [name, generic]),
			inside: {
				'function': re(/^<<0>>/.source, [name]),
				'generic': {
					pattern: RegExp(generic),
					alias: 'class-name',
					inside: typeInside
				}
			}
		},
		'type-list': {
			// The list of types inherited or of generic constraints
			// class Foo<F> : Bar, IList<FooBar>
			// where F : Bar, IList<int>
			pattern: re(
				/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,
				[typeDeclarationKeywords, genericName, name, typeExpression, keywords.source, nestedRound, /\bnew\s*\(\s*\)/.source]
			),
			lookbehind: true,
			inside: {
				'record-arguments': {
					pattern: re(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source, [genericName, nestedRound]),
					lookbehind: true,
					greedy: true,
					inside: Prism.languages.csharp
				},
				'keyword': keywords,
				'class-name': {
					pattern: RegExp(typeExpression),
					greedy: true,
					inside: typeInside
				},
				'punctuation': /[,()]/
			}
		},
		'preprocessor': {
			pattern: /(^[\t ]*)#.*/m,
			lookbehind: true,
			alias: 'property',
			inside: {
				// highlight preprocessor directives as keywords
				'directive': {
					pattern: /(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,
					lookbehind: true,
					alias: 'keyword'
				}
			}
		}
	});

	// attributes
	var regularStringOrCharacter = regularString + '|' + character;
	var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]);
	var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2);

	// https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/#attribute-targets
	var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source;
	var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [identifier, roundExpression]);

	Prism.languages.insertBefore('csharp', 'class-name', {
		'attribute': {
			// Attributes
			// [Foo], [Foo(1), Bar(2, Prop = "foo")], [return: Foo(1), Bar(2)], [assembly: Foo(Bar)]
			pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [attrTarget, attr]),
			lookbehind: true,
			greedy: true,
			inside: {
				'target': {
					pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]),
					alias: 'keyword'
				},
				'attribute-arguments': {
					pattern: re(/\(<<0>>*\)/.source, [roundExpression]),
					inside: Prism.languages.csharp
				},
				'class-name': {
					pattern: RegExp(identifier),
					inside: {
						'punctuation': /\./
					}
				},
				'punctuation': /[:,]/
			}
		}
	});


	// string interpolation
	var formatString = /:[^}\r\n]+/.source;
	// multi line
	var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2);
	var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [mInterpolationRound, formatString]);
	// single line
	var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source, [regularStringOrCharacter]), 2);
	var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [sInterpolationRound, formatString]);

	function createInterpolationInside(interpolation, interpolationRound) {
		return {
			'interpolation': {
				pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]),
				lookbehind: true,
				inside: {
					'format-string': {
						pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [interpolationRound, formatString]),
						lookbehind: true,
						inside: {
							'punctuation': /^:/
						}
					},
					'punctuation': /^\{|\}$/,
					'expression': {
						pattern: /[\s\S]+/,
						alias: 'language-csharp',
						inside: Prism.languages.csharp
					}
				}
			},
			'string': /[\s\S]+/
		};
	}

	Prism.languages.insertBefore('csharp', 'string', {
		'interpolation-string': [
			{
				pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]),
				lookbehind: true,
				greedy: true,
				inside: createInterpolationInside(mInterpolation, mInterpolationRound),
			},
			{
				pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]),
				lookbehind: true,
				greedy: true,
				inside: createInterpolationInside(sInterpolation, sInterpolationRound),
			}
		],
		'char': {
			pattern: RegExp(character),
			greedy: true
		}
	});

	Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp;

}(Prism));
Zlx#!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s<n;s++)e=e.replace(/<<self>>/g,(function(){return"(?:"+e+")"}));return e.replace(/<<self>>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<<self>>)*>",2),b=a("\\((?:[^()]|<<self>>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<<self>>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<<self>>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<<self>>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism);\bx// Docs:
// https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-5.0&tabs=visual-studio
// https://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-5.0

(function (Prism) {

	var commentLike = /\/(?![/*])|\/\/.*[\r\n]|\/\*[^*]*(?:\*(?!\/)[^*]*)*\*\//.source;
	var stringLike =
		/@(?!")|"(?:[^\r\n\\"]|\\.)*"|@"(?:[^\\"]|""|\\[\s\S])*"(?!")/.source +
		'|' +
		/'(?:(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'|(?=[^\\](?!')))/.source;

	/**
	 * Creates a nested pattern where all occurrences of the string `<<self>>` are replaced with the pattern itself.
	 *
	 * @param {string} pattern
	 * @param {number} depthLog2
	 * @returns {string}
	 */
	function nested(pattern, depthLog2) {
		for (var i = 0; i < depthLog2; i++) {
			pattern = pattern.replace(/<self>/g, function () { return '(?:' + pattern + ')'; });
		}
		return pattern
			.replace(/<self>/g, '[^\\s\\S]')
			.replace(/<str>/g, '(?:' + stringLike + ')')
			.replace(/<comment>/g, '(?:' + commentLike + ')');
	}

	var round = nested(/\((?:[^()'"@/]|<str>|<comment>|<self>)*\)/.source, 2);
	var square = nested(/\[(?:[^\[\]'"@/]|<str>|<comment>|<self>)*\]/.source, 1);
	var curly = nested(/\{(?:[^{}'"@/]|<str>|<comment>|<self>)*\}/.source, 2);
	var angle = nested(/<(?:[^<>'"@/]|<comment>|<self>)*>/.source, 1);

	var inlineCs = /@/.source +
		/(?:await\b\s*)?/.source +
		'(?:' + /(?!await\b)\w+\b/.source + '|' + round + ')' +
		'(?:' + /[?!]?\.\w+\b/.source + '|' + '(?:' + angle + ')?' + round + '|' + square + ')*' +
		/(?![?!\.(\[]|<(?!\/))/.source;

	// Note about the above bracket patterns:
	// They all ignore HTML expressions that might be in the C# code. This is a problem because HTML (like strings and
	// comments) is parsed differently. This is a huge problem because HTML might contain brackets and quotes which
	// messes up the bracket and string counting implemented by the above patterns.
	//
	// This problem is not fixable because 1) HTML expression are highly context sensitive and very difficult to detect
	// and 2) they require one capturing group at every nested level. See the `tagRegion` pattern to admire the
	// complexity of an HTML expression.
	//
	// To somewhat alleviate the problem a bit, the patterns for characters (e.g. 'a') is very permissive, it also
	// allows invalid characters to support HTML expressions like this: <p>That's it!</p>.

	var tagAttrInlineCs = /@(?![\w()])/.source + '|' + inlineCs;
	var tagAttrValue = '(?:' +
		/"[^"@]*"|'[^'@]*'|[^\s'"@>=]+(?=[\s>])/.source +
		'|' +
		'["\'][^"\'@]*(?:(?:' + tagAttrInlineCs + ')[^"\'@]*)+["\']' +
		')';

	var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*<tagAttrValue>|(?=[\s/>])))+)?/.source.replace(/<tagAttrValue>/, tagAttrValue);
	var tagContent = /(?!\d)[^\s>\/=$<%]+/.source + tagAttrs + /\s*\/?>/.source;
	var tagRegion =
		/\B@?/.source +
		'(?:' +
		/<([a-zA-Z][\w:]*)/.source + tagAttrs + /\s*>/.source +
		'(?:' +
		(
			/[^<]/.source +
			'|' +
			// all tags that are not the start tag
			// eslint-disable-next-line regexp/strict
			/<\/?(?!\1\b)/.source + tagContent +
			'|' +
			// nested start tag
			nested(
				// eslint-disable-next-line regexp/strict
				/<\1/.source + tagAttrs + /\s*>/.source +
				'(?:' +
				(
					/[^<]/.source +
					'|' +
					// all tags that are not the start tag
					// eslint-disable-next-line regexp/strict
					/<\/?(?!\1\b)/.source + tagContent +
					'|' +
					'<self>'
				) +
				')*' +
				// eslint-disable-next-line regexp/strict
				/<\/\1\s*>/.source,
				2
			)
		) +
		')*' +
		// eslint-disable-next-line regexp/strict
		/<\/\1\s*>/.source +
		'|' +
		/</.source + tagContent +
		')';

	// Now for the actual language definition(s):
	//
	// Razor as a language has 2 parts:
	//  1) CSHTML: A markup-like language that has been extended with inline C# code expressions and blocks.
	//  2) C#+HTML: A variant of C# that can contain CSHTML tags as expressions.
	//
	// In the below code, both CSHTML and C#+HTML will be create as separate language definitions that reference each
	// other. However, only CSHTML will be exported via `Prism.languages`.

	Prism.languages.cshtml = Prism.languages.extend('markup', {});

	var csharpWithHtml = Prism.languages.insertBefore('csharp', 'string', {
		'html': {
			pattern: RegExp(tagRegion),
			greedy: true,
			inside: Prism.languages.cshtml
		},
	}, { csharp: Prism.languages.extend('csharp', {}) });

	var cs = {
		pattern: /\S[\s\S]*/,
		alias: 'language-csharp',
		inside: csharpWithHtml
	};

	var inlineValue = {
		pattern: RegExp(/(^|[^@])/.source + inlineCs),
		lookbehind: true,
		greedy: true,
		alias: 'variable',
		inside: {
			'keyword': /^@/,
			'csharp': cs
		}
	};

	Prism.languages.cshtml.tag.pattern = RegExp(/<\/?/.source + tagContent);
	Prism.languages.cshtml.tag.inside['attr-value'].pattern = RegExp(/=\s*/.source + tagAttrValue);
	Prism.languages.insertBefore('inside', 'punctuation', { 'value': inlineValue }, Prism.languages.cshtml.tag.inside['attr-value']);

	Prism.languages.insertBefore('cshtml', 'prolog', {
		'razor-comment': {
			pattern: /@\*[\s\S]*?\*@/,
			greedy: true,
			alias: 'comment'
		},

		'block': {
			pattern: RegExp(
				/(^|[^@])@/.source +
				'(?:' +
				[
					// @{ ... }
					curly,
					// @code{ ... }
					/(?:code|functions)\s*/.source + curly,
					// @for (...) { ... }
					/(?:for|foreach|lock|switch|using|while)\s*/.source + round + /\s*/.source + curly,
					// @do { ... } while (...);
					/do\s*/.source + curly + /\s*while\s*/.source + round + /(?:\s*;)?/.source,
					// @try { ... } catch (...) { ... } finally { ... }
					/try\s*/.source + curly + /\s*catch\s*/.source + round + /\s*/.source + curly + /\s*finally\s*/.source + curly,
					// @if (...) {...} else if (...) {...} else {...}
					/if\s*/.source + round + /\s*/.source + curly + '(?:' + /\s*else/.source + '(?:' + /\s+if\s*/.source + round + ')?' + /\s*/.source + curly + ')*',
					// @helper Ident(params) { ... }
					/helper\s+\w+\s*/.source + round + /\s*/.source + curly,
				].join('|') +
				')'
			),
			lookbehind: true,
			greedy: true,
			inside: {
				'keyword': /^@\w*/,
				'csharp': cs
			}
		},

		'directive': {
			pattern: /^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,
			lookbehind: true,
			greedy: true,
			inside: {
				'keyword': /^@\w+/,
				'csharp': cs
			}
		},

		'value': inlineValue,

		'delegate-operator': {
			pattern: /(^|[^@])@(?=<)/,
			lookbehind: true,
			alias: 'operator'
		}
	});

	Prism.languages.razor = Prism.languages.cshtml;

}(Prism));
v坾x
!function(e){function s(e,s){for(var a=0;a<s;a++)e=e.replace(/<self>/g,(function(){return"(?:"+e+")"}));return e.replace(/<self>/g,"[^\\s\\S]").replace(/<str>/g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|\'(?:(?:[^\r\n\'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})\'|(?=[^\\\\](?!\'))))').replace(/<comment>/g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|<str>|<comment>|<self>)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|<str>|<comment>|<self>)*\\]",1),r=s("\\{(?:[^{}'\"@/]|<str>|<comment>|<self>)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]|<comment>|<self>)*>",1)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="(?:\"[^\"@]*\"|'[^'@]*'|[^\\s'\"@>=]+(?=[\\s>])|[\"'][^\"'@]*(?:(?:@(?![\\w()])|"+n+")[^\"'@]*)+[\"'])",i="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*<tagAttrValue>|(?=[\\s/>])))+)?".replace(/<tagAttrValue>/,l),g="(?!\\d)[^\\s>/=$<%]+"+i+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+i+"\\s*>(?:[^<]|</?(?!\\1\\b)"+g+"|"+s("<\\1"+i+"\\s*>(?:[^<]|</?(?!\\1\\b)"+g+"|<self>)*</\\1\\s*>",2)+")*</\\1\\s*>|<"+g+")";e.languages.cshtml=e.languages.extend("markup",{});var c={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},p={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:c}};e.languages.cshtml.tag.pattern=RegExp("</?"+g),e.languages.cshtml.tag.inside["attr-value"].pattern=RegExp("=\\s*"+l),e.languages.insertBefore("inside","punctuation",{value:p},e.languages.cshtml.tag.inside["attr-value"]),e.languages.insertBefore("cshtml","prolog",{"razor-comment":{pattern:/@\*[\s\S]*?\*@/,greedy:!0,alias:"comment"},block:{pattern:RegExp("(^|[^@])@(?:"+[r,"(?:code|functions)\\s*"+r,"(?:for|foreach|lock|switch|using|while)\\s*"+a+"\\s*"+r,"do\\s*"+r+"\\s*while\\s*"+a+"(?:\\s*;)?","try\\s*"+r+"\\s*catch\\s*"+a+"\\s*"+r+"\\s*finally\\s*"+r,"if\\s*"+a+"\\s*"+r+"(?:\\s*else(?:\\s+if\\s*"+a+")?\\s*"+r+")*","helper\\s+\\w+\\s*"+a+"\\s*"+r].join("|")+")"),lookbehind:!0,greedy:!0,inside:{keyword:/^@\w*/,csharp:c}},directive:{pattern:/^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,lookbehind:!0,greedy:!0,inside:{keyword:/^@\w+/,csharp:c}},value:p,"delegate-operator":{pattern:/(^|[^@])@(?=<)/,lookbehind:!0,alias:"operator"}}),e.languages.razor=e.languages.cshtml}(Prism);LuxQ/**
 * Original by Scott Helme.
 *
 * Reference: https://scotthelme.co.uk/csp-cheat-sheet/
 *
 * Supports the following:
 *  - https://www.w3.org/TR/CSP1/
 *  - https://www.w3.org/TR/CSP2/
 *  - https://www.w3.org/TR/CSP3/
 */

(function (Prism) {

	/**
	 * @param {string} source
	 * @returns {RegExp}
	 */
	function value(source) {
		return RegExp(/([ \t])/.source + '(?:' + source + ')' + /(?=[\s;]|$)/.source, 'i');
	}

	Prism.languages.csp = {
		'directive': {
			pattern: /(^|[\s;])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[\s;]|$)/i,
			lookbehind: true,
			alias: 'property'
		},
		'scheme': {
			pattern: value(/[a-z][a-z0-9.+-]*:/.source),
			lookbehind: true
		},
		'none': {
			pattern: value(/'none'/.source),
			lookbehind: true,
			alias: 'keyword'
		},
		'nonce': {
			pattern: value(/'nonce-[-+/\w=]+'/.source),
			lookbehind: true,
			alias: 'number'
		},
		'hash': {
			pattern: value(/'sha(?:256|384|512)-[-+/\w=]+'/.source),
			lookbehind: true,
			alias: 'number'
		},
		'host': {
			pattern: value(
				/[a-z][a-z0-9.+-]*:\/\/[^\s;,']*/.source +
				'|' +
				/\*[^\s;,']*/.source +
				'|' +
				/[a-z0-9-]+(?:\.[a-z0-9-]+)+(?::[\d*]+)?(?:\/[^\s;,']*)?/.source
			),
			lookbehind: true,
			alias: 'url',
			inside: {
				'important': /\*/
			}
		},
		'keyword': [
			{
				pattern: value(/'unsafe-[a-z-]+'/.source),
				lookbehind: true,
				alias: 'unsafe'
			},
			{
				pattern: value(/'[a-z-]+'/.source),
				lookbehind: true,
				alias: 'safe'
			},
		],
		'punctuation': /;/
	};

}(Prism));
;]9Gxu!function(e){function n(e){return RegExp("([ \t])(?:"+e+")(?=[\\s;]|$)","i")}e.languages.csp={directive:{pattern:/(^|[\s;])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[\s;]|$)/i,lookbehind:!0,alias:"property"},scheme:{pattern:n("[a-z][a-z0-9.+-]*:"),lookbehind:!0},none:{pattern:n("'none'"),lookbehind:!0,alias:"keyword"},nonce:{pattern:n("'nonce-[-+/\\w=]+'"),lookbehind:!0,alias:"number"},hash:{pattern:n("'sha(?:256|384|512)-[-+/\\w=]+'"),lookbehind:!0,alias:"number"},host:{pattern:n("[a-z][a-z0-9.+-]*://[^\\s;,']*|\\*[^\\s;,']*|[a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::[\\d*]+)?(?:/[^\\s;,']*)?"),lookbehind:!0,alias:"url",inside:{important:/\*/}},keyword:[{pattern:n("'unsafe-[a-z-]+'"),lookbehind:!0,alias:"unsafe"},{pattern:n("'[a-z-]+'"),lookbehind:!0,alias:"safe"}],punctuation:/;/}}(Prism);F/ƽx-(function (Prism) {

	var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
	var selectorInside;

	Prism.languages.css.selector = {
		pattern: Prism.languages.css.selector.pattern,
		lookbehind: true,
		inside: selectorInside = {
			'pseudo-element': /:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,
			'pseudo-class': /:[-\w]+/,
			'class': /\.[-\w]+/,
			'id': /#[-\w]+/,
			'attribute': {
				pattern: RegExp('\\[(?:[^[\\]"\']|' + string.source + ')*\\]'),
				greedy: true,
				inside: {
					'punctuation': /^\[|\]$/,
					'case-sensitivity': {
						pattern: /(\s)[si]$/i,
						lookbehind: true,
						alias: 'keyword'
					},
					'namespace': {
						pattern: /^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,
						lookbehind: true,
						inside: {
							'punctuation': /\|$/
						}
					},
					'attr-name': {
						pattern: /^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,
						lookbehind: true
					},
					'attr-value': [
						string,
						{
							pattern: /(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,
							lookbehind: true
						}
					],
					'operator': /[|~*^$]?=/
				}
			},
			'n-th': [
				{
					pattern: /(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,
					lookbehind: true,
					inside: {
						'number': /[\dn]+/,
						'operator': /[+-]/
					}
				},
				{
					pattern: /(\(\s*)(?:even|odd)(?=\s*\))/i,
					lookbehind: true
				}
			],
			'combinator': />|\+|~|\|\|/,

			// the `tag` token has been existed and removed.
			// because we can't find a perfect tokenize to match it.
			// if you want to add it, please read https://github.com/PrismJS/prism/pull/2373 first.

			'punctuation': /[(),]/,
		}
	};

	Prism.languages.css['atrule'].inside['selector-function-argument'].inside = selectorInside;

	Prism.languages.insertBefore('css', 'property', {
		'variable': {
			pattern: /(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,
			lookbehind: true
		}
	});

	var unit = {
		pattern: /(\b\d+)(?:%|[a-z]+(?![\w-]))/,
		lookbehind: true
	};
	// 123 -123 .123 -.123 12.3 -12.3
	var number = {
		pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,
		lookbehind: true
	};

	Prism.languages.insertBefore('css', 'function', {
		'operator': {
			pattern: /(\s)[+\-*\/](?=\s)/,
			lookbehind: true
		},
		// CAREFUL!
		// Previewers and Inline color use hexcode and color.
		'hexcode': {
			pattern: /\B#[\da-f]{3,8}\b/i,
			alias: 'color'
		},
		'color': [
			{
				pattern: /(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,
				lookbehind: true
			},
			{
				pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,
				inside: {
					'unit': unit,
					'number': number,
					'function': /[\w-]+(?=\()/,
					'punctuation': /[(),]/
				}
			}
		],
		// it's important that there is no boundary assertion after the hex digits
		'entity': /\\[\da-f]{1,8}/i,
		'unit': unit,
		'number': number
	});

}(Prism));
(HxC!function(e){var a,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:a={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(Prism);ԥmx-(function (Prism) {

	var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;

	Prism.languages.css = {
		'comment': /\/\*[\s\S]*?\*\//,
		'atrule': {
			pattern: RegExp('@[\\w-](?:' + /[^;{\s"']|\s+(?!\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\s*\{))/.source),
			inside: {
				'rule': /^@[\w-]+/,
				'selector-function-argument': {
					pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
					lookbehind: true,
					alias: 'selector'
				},
				'keyword': {
					pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/,
					lookbehind: true
				}
				// See rest below
			}
		},
		'url': {
			// https://drafts.csswg.org/css-values-3/#urls
			pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'),
			greedy: true,
			inside: {
				'function': /^url/i,
				'punctuation': /^\(|\)$/,
				'string': {
					pattern: RegExp('^' + string.source + '$'),
					alias: 'url'
				}
			}
		},
		'selector': {
			pattern: RegExp('(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + string.source + ')*(?=\\s*\\{)'),
			lookbehind: true
		},
		'string': {
			pattern: string,
			greedy: true
		},
		'property': {
			pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
			lookbehind: true
		},
		'important': /!important\b/i,
		'function': {
			pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,
			lookbehind: true
		},
		'punctuation': /[(){};:,]/
	};

	Prism.languages.css['atrule'].inside.rest = Prism.languages.css;

	var markup = Prism.languages.markup;
	if (markup) {
		markup.tag.addInlined('style', 'css');
		markup.tag.addAttribute('style', 'css');
	}

}(Prism));
Mx/!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);뜛x |// https://tools.ietf.org/html/rfc4180

Prism.languages.csv = {
	'value': /[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,
	'punctuation': /,/
};
S'+xM Prism.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/};༤xL
(function (Prism) {

	// https://cuelang.org/docs/references/spec/

	// eslint-disable-next-line regexp/strict
	var stringEscape = /\\(?:(?!\2)|\2(?:[^()\r\n]|\([^()]*\)))/.source;
	// eslint-disable-next-line regexp/strict
	var stringTypes = /"""(?:[^\\"]|"(?!""\2)|<esc>)*"""/.source +
		// eslint-disable-next-line regexp/strict
		'|' + /'''(?:[^\\']|'(?!''\2)|<esc>)*'''/.source +
		// eslint-disable-next-line regexp/strict
		'|' + /"(?:[^\\\r\n"]|"(?!\2)|<esc>)*"/.source +
		// eslint-disable-next-line regexp/strict
		'|' + /'(?:[^\\\r\n']|'(?!\2)|<esc>)*'/.source;
	var stringLiteral = '(?:' + stringTypes.replace(/<esc>/g, stringEscape) + ')';

	Prism.languages.cue = {
		'comment': {
			pattern: /\/\/.*/,
			greedy: true
		},
		'string-literal': {
			// eslint-disable-next-line regexp/strict
			pattern: RegExp(/(^|[^#"'\\])(#*)/.source + stringLiteral + /(?!["'])\2/.source),
			lookbehind: true,
			greedy: true,
			inside: {
				// I'm using dirty hack here. We have to know the number hashes at the start of the string somehow,
				// but we can't look back. So instead, we will use a lookahead, go to the end of the string, and
				// capture the hashes at the end of the string.
				'escape': {
					pattern: /(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,
					greedy: true,
					alias: 'string'
				},
				'interpolation': {
					pattern: /(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,
					greedy: true,
					inside: {
						'punctuation': /^\\#*\(|\)$/,
						'expression': {
							pattern: /[\s\S]+/,
							inside: null
						}
					}
				},
				'string': /[\s\S]+/
			}
		},

		'keyword': {
			pattern: /(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,
			lookbehind: true
		},
		'boolean': {
			pattern: /(^|[^\w$])(?:false|true)(?![\w$])/,
			lookbehind: true
		},
		'builtin': {
			pattern: /(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,
			lookbehind: true
		},

		'attribute': {
			pattern: /@[\w$]+(?=\s*\()/,
			alias: 'function'
		},
		'function': {
			pattern: /(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,
			lookbehind: true
		},

		'number': {
			pattern: /(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,
			lookbehind: true
		},

		'operator': /\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,
		'punctuation': /[()[\]{},.:]/
	};

	Prism.languages.cue['string-literal'].inside.interpolation.inside.expression.inside = Prism.languages.cue;

}(Prism));
ǳax!function(e){var n="(?:"+"\"\"\"(?:[^\\\\\"]|\"(?!\"\"\\2)|<esc>)*\"\"\"|'''(?:[^\\\\']|'(?!''\\2)|<esc>)*'''|\"(?:[^\\\\\r\n\"]|\"(?!\\2)|<esc>)*\"|'(?:[^\\\\\r\n']|'(?!\\2)|<esc>)*'".replace(/<esc>/g,"\\\\(?:(?!\\2)|\\2(?:[^()\r\n]|\\([^()]*\\)))")+")";e.languages.cue={comment:{pattern:/\/\/.*/,greedy:!0},"string-literal":{pattern:RegExp("(^|[^#\"'\\\\])(#*)"+n+"(?![\"'])\\2"),lookbehind:!0,greedy:!0,inside:{escape:{pattern:/(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,greedy:!0,alias:"string"},interpolation:{pattern:/(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,greedy:!0,inside:{punctuation:/^\\#*\(|\)$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:{pattern:/(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,lookbehind:!0},boolean:{pattern:/(^|[^\w$])(?:false|true)(?![\w$])/,lookbehind:!0},builtin:{pattern:/(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,lookbehind:!0},attribute:{pattern:/@[\w$]+(?=\s*\()/,alias:"function"},function:{pattern:/(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,lookbehind:!0},number:{pattern:/(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,lookbehind:!0},operator:/\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,punctuation:/[()[\]{},.:]/},e.languages.cue["string-literal"].inside.interpolation.inside.expression.inside=e.languages.cue}(Prism);UxRPrism.languages.cypher = {
	// https://neo4j.com/docs/cypher-manual/current/syntax/comments/
	'comment': /\/\/.*/,
	'string': {
		pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,
		greedy: true
	},
	'class-name': {
		pattern: /(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,
		lookbehind: true,
		greedy: true
	},
	'relationship': {
		pattern: /(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,
		lookbehind: true,
		greedy: true,
		alias: 'property'
	},
	'identifier': {
		pattern: /`(?:[^`\\\r\n])*`/,
		greedy: true
	},

	'variable': /\$\w+/,

	// https://neo4j.com/docs/cypher-manual/current/syntax/reserved/
	'keyword': /\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,

	'function': /\b\w+\b(?=\s*\()/,

	'boolean': /\b(?:false|null|true)\b/i,
	'number': /\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,
	// https://neo4j.com/docs/cypher-manual/current/syntax/operators/
	'operator': /:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,
	'punctuation': /[()[\]{},;.]/
};
ҫ~@x	Prism.languages.cypher={comment:/\/\/.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,greedy:!0},"class-name":{pattern:/(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,lookbehind:!0,greedy:!0},relationship:{pattern:/(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,lookbehind:!0,greedy:!0,alias:"property"},identifier:{pattern:/`(?:[^`\\\r\n])*`/,greedy:!0},variable:/\$\w+/,keyword:/\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,function:/\b\w+\b(?=\s*\()/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,operator:/:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,punctuation:/[()[\]{},;.]/};4R-x]Prism.languages.d = Prism.languages.extend('clike', {
	'comment': [
		{
			// Shebang
			pattern: /^\s*#!.+/,
			greedy: true
		},
		{
			pattern: RegExp(/(^|[^\\])/.source + '(?:' + [
				// /+ comment +/
				// Allow one level of nesting
				/\/\+(?:\/\+(?:[^+]|\+(?!\/))*\+\/|(?!\/\+)[\s\S])*?\+\//.source,
				// // comment
				/\/\/.*/.source,
				// /* comment */
				/\/\*[\s\S]*?\*\//.source
			].join('|') + ')'),
			lookbehind: true,
			greedy: true
		}
	],
	'string': [
		{
			pattern: RegExp([
				// r"", x""
				/\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/.source,

				// q"[]", q"()", q"<>", q"{}"
				/\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/.source,

				// q"IDENT
				// ...
				// IDENT"
				/\bq"((?!\d)\w+)$[\s\S]*?^\1"/.source,

				// q"//", q"||", etc.
				// eslint-disable-next-line regexp/strict
				/\bq"(.)[\s\S]*?\2"/.source,

				// eslint-disable-next-line regexp/strict
				/(["`])(?:\\[\s\S]|(?!\3)[^\\])*\3[cwd]?/.source
			].join('|'), 'm'),
			greedy: true
		},
		{
			pattern: /\bq\{(?:\{[^{}]*\}|[^{}])*\}/,
			greedy: true,
			alias: 'token-string'
		}
	],

	// In order: $, keywords and special tokens, globally defined symbols
	'keyword': /\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,

	'number': [
		// The lookbehind and the negative look-ahead try to prevent bad highlighting of the .. operator
		// Hexadecimal numbers must be handled separately to avoid problems with exponent "e"
		/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,
		{
			pattern: /((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,
			lookbehind: true
		}
	],

	'operator': /\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/
});

Prism.languages.insertBefore('d', 'string', {
	// Characters
	// 'a', '\\', '\n', '\xFF', '\377', '\uFFFF', '\U0010FFFF', '\quot'
	'char': /'(?:\\(?:\W|\w+)|[^\\])'/
});

Prism.languages.insertBefore('d', 'keyword', {
	'property': /\B@\w*/
});

Prism.languages.insertBefore('d', 'function', {
	'register': {
		// Iasm registers
		pattern: /\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,
		alias: 'variable'
	}
});
ʼx|Prism.languages.d=Prism.languages.extend("clike",{comment:[{pattern:/^\s*#!.+/,greedy:!0},{pattern:RegExp("(^|[^\\\\])(?:"+["/\\+(?:/\\+(?:[^+]|\\+(?!/))*\\+/|(?!/\\+)[^])*?\\+/","//.*","/\\*[^]*?\\*/"].join("|")+")"),lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(['\\b[rx]"(?:\\\\[^]|[^\\\\"])*"[cwd]?','\\bq"(?:\\[[^]*?\\]|\\([^]*?\\)|<[^]*?>|\\{[^]*?\\})"','\\bq"((?!\\d)\\w+)$[^]*?^\\1"','\\bq"(.)[^]*?\\2"','(["`])(?:\\\\[^]|(?!\\3)[^\\\\])*\\3[cwd]?'].join("|"),"m"),greedy:!0},{pattern:/\bq\{(?:\{[^{}]*\}|[^{}])*\}/,greedy:!0,alias:"token-string"}],keyword:/\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,lookbehind:!0}],operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),Prism.languages.insertBefore("d","string",{char:/'(?:\\(?:\W|\w+)|[^\\])'/}),Prism.languages.insertBefore("d","keyword",{property:/\B@\w*/}),Prism.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}});3x	(function (Prism) {
	var keywords = [
		/\b(?:async|sync|yield)\*/,
		/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/
	];

	// Handles named imports, such as http.Client
	var packagePrefix = /(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source;

	// based on the dart naming conventions
	var className = {
		pattern: RegExp(packagePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
		lookbehind: true,
		inside: {
			'namespace': {
				pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
				inside: {
					'punctuation': /\./
				}
			},
		}
	};

	Prism.languages.dart = Prism.languages.extend('clike', {
		'class-name': [
			className,
			{
				// variables and parameters
				// this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)
				pattern: RegExp(packagePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),
				lookbehind: true,
				inside: className.inside
			}
		],
		'keyword': keywords,
		'operator': /\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/
	});

	Prism.languages.insertBefore('dart', 'string', {
		'string-literal': {
			pattern: /r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,
			greedy: true,
			inside: {
				'interpolation': {
					pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
					lookbehind: true,
					inside: {
						'punctuation': /^\$\{?|\}$/,
						'expression': {
							pattern: /[\s\S]+/,
							inside: Prism.languages.dart
						}
					}
				},
				'string': /[\s\S]+/
			}
		},
		'string': undefined
	});

	Prism.languages.insertBefore('dart', 'class-name', {
		'metadata': {
			pattern: /@\w+/,
			alias: 'function'
		}
	});

	Prism.languages.insertBefore('dart', 'class-name', {
		'generics': {
			pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,
			inside: {
				'class-name': className,
				'keyword': keywords,
				'punctuation': /[<>(),.:]/,
				'operator': /[?&|]/
			}
		},
	});
}(Prism));
Fcx0!function(e){var a=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};e.languages.dart=e.languages.extend("clike",{"class-name":[s,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:s.inside}],keyword:a,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),e.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.dart}}},string:/[\s\S]+/}},string:void 0}),e.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),e.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism);Z 6Bx.(function (Prism) {
	Prism.languages.dataweave = {
		'url': /\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,
		'property': {
			pattern: /(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,
			greedy: true
		},
		'string': {
			pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
			greedy: true
		},
		'mime-type': /\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,
		'date': {
			pattern: /\|[\w:+-]+\|/,
			greedy: true
		},
		'comment': [
			{
				pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
				lookbehind: true,
				greedy: true
			},
			{
				pattern: /(^|[^\\:])\/\/.*/,
				lookbehind: true,
				greedy: true
			}
		],
		'regex': {
			pattern: /\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,
			greedy: true
		},
		'keyword': /\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,
		'function': /\b[A-Z_]\w*(?=\s*\()/i,
		'number': /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
		'punctuation': /[{}[\];(),.:@]/,
		'operator': /<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,
		'boolean': /\b(?:false|true)\b/,
	};

}(Prism));
>o5xQ!function(e){e.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}}(Prism);H"vx+Prism.languages.dax = {
	'comment': {
		pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,
		lookbehind: true
	},
	'data-field': {
		pattern: /'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,
		alias: 'symbol'
	},
	'measure': {
		pattern: /\[[ \w\xA0-\uFFFF]+\]/,
		alias: 'constant'
	},
	'string': {
		pattern: /"(?:[^"]|"")*"(?!")/,
		greedy: true
	},
	'function': /\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,
	'keyword': /\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,
	'boolean': {
		pattern: /\b(?:FALSE|NULL|TRUE)\b/i,
		alias: 'constant'
	},
	'number': /\b\d+(?:\.\d*)?|\B\.\d+\b/,
	'operator': /:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,
	'punctuation': /[;\[\](){}`,.]/
};
'JxjPrism.languages.dax={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,lookbehind:!0},"data-field":{pattern:/'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,alias:"symbol"},measure:{pattern:/\[[ \w\xA0-\uFFFF]+\]/,alias:"constant"},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},function:/\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,keyword:/\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,boolean:{pattern:/\b(?:FALSE|NULL|TRUE)\b/i,alias:"constant"},number:/\b\d+(?:\.\d*)?|\B\.\d+\b/,operator:/:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,punctuation:/[;\[\](){}`,.]/};+3?x	// ABNF grammar:
// https://github.com/dhall-lang/dhall-lang/blob/master/standard/dhall.abnf

Prism.languages.dhall = {
	// Multi-line comments can be nested. E.g. {- foo {- bar -} -}
	// The multi-line pattern is essentially this:
	//   \{-(?:[^-{]|-(?!\})|\{(?!-)|<SELF>)*-\}
	'comment': /--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,
	'string': {
		pattern: /"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /\$\{[^{}]*\}/,
				inside: {
					'expression': {
						pattern: /(^\$\{)[\s\S]+(?=\}$)/,
						lookbehind: true,
						alias: 'language-dhall',
						inside: null // see blow
					},
					'punctuation': /\$\{|\}/
				}
			}
		}
	},
	'label': {
		pattern: /`[^`]*`/,
		greedy: true
	},
	'url': {
		// https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L596
		pattern: /\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,
		greedy: true
	},
	'env': {
		// https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L661
		pattern: /\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,
		greedy: true,
		inside: {
			'function': /^env/,
			'operator': /^:/,
			'variable': /[\s\S]+/
		}
	},
	'hash': {
		// https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L725
		pattern: /\bsha256:[\da-fA-F]{64}\b/,
		inside: {
			'function': /sha256/,
			'operator': /:/,
			'number': /[\da-fA-F]{64}/
		}
	},

	// https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L359
	'keyword': /\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,
	'builtin': /\b(?:None|Some)\b/,

	'boolean': /\b(?:False|True)\b/,
	'number': /\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,
	'operator': /\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,
	'punctuation': /\.\.|[{}\[\](),./]/,

	// we'll just assume that every capital word left is a type name
	'class-name': /\b[A-Z]\w*\b/
};

Prism.languages.dhall.string.inside.interpolation.inside.expression.inside = Prism.languages.dhall;
NxPrism.languages.dhall={comment:/--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,string:{pattern:/"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-dhall",inside:null},punctuation:/\$\{|\}/}}}},label:{pattern:/`[^`]*`/,greedy:!0},url:{pattern:/\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,greedy:!0},env:{pattern:/\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,greedy:!0,inside:{function:/^env/,operator:/^:/,variable:/[\s\S]+/}},hash:{pattern:/\bsha256:[\da-fA-F]{64}\b/,inside:{function:/sha256/,operator:/:/,number:/[\da-fA-F]{64}/}},keyword:/\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,builtin:/\b(?:None|Some)\b/,boolean:/\b(?:False|True)\b/,number:/\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,operator:/\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,punctuation:/\.\.|[{}\[\](),./]/,"class-name":/\b[A-Z]\w*\b/},Prism.languages.dhall.string.inside.interpolation.inside.expression.inside=Prism.languages.dhall;hUxU(function (Prism) {

	Prism.languages.diff = {
		'coord': [
			// Match all kinds of coord lines (prefixed by "+++", "---" or "***").
			/^(?:\*{3}|-{3}|\+{3}).*$/m,
			// Match "@@ ... @@" coord lines in unified diff.
			/^@@.*@@$/m,
			// Match coord lines in normal diff (starts with a number).
			/^\d.*$/m
		]

		// deleted, inserted, unchanged, diff
	};

	/**
	 * A map from the name of a block to its line prefix.
	 *
	 * @type {Object<string, string>}
	 */
	var PREFIXES = {
		'deleted-sign': '-',
		'deleted-arrow': '<',
		'inserted-sign': '+',
		'inserted-arrow': '>',
		'unchanged': ' ',
		'diff': '!',
	};

	// add a token for each prefix
	Object.keys(PREFIXES).forEach(function (name) {
		var prefix = PREFIXES[name];

		var alias = [];
		if (!/^\w+$/.test(name)) { // "deleted-sign" -> "deleted"
			alias.push(/\w+/.exec(name)[0]);
		}
		if (name === 'diff') {
			alias.push('bold');
		}

		Prism.languages.diff[name] = {
			pattern: RegExp('^(?:[' + prefix + '].*(?:\r\n?|\n|(?![\\s\\S])))+', 'm'),
			alias: alias,
			inside: {
				'line': {
					pattern: /(.)(?=[\s\S]).*(?:\r\n?|\n)?/,
					lookbehind: true
				},
				'prefix': {
					pattern: /[\s\S]/,
					alias: /\w+/.exec(name)[0]
				}
			}
		};

	});

	// make prefixes available to Diff plugin
	Object.defineProperty(Prism.languages.diff, 'PREFIXES', {
		value: PREFIXES
	});

}(Prism));
7)%x]!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var n={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(n).forEach((function(a){var i=n[a],r=[];/^\w+$/.test(a)||r.push(/\w+/.exec(a)[0]),"diff"===a&&r.push("bold"),e.languages.diff[a]={pattern:RegExp("^(?:["+i+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(a)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:n})}(Prism);Ɲlx5// Django/Jinja2 syntax definition for Prism.js <http://prismjs.com> syntax highlighter.
// Mostly it works OK but can paint code incorrectly on complex html/template tag combinations.

(function (Prism) {

	Prism.languages.django = {
		'comment': /^\{#[\s\S]*?#\}$/,
		'tag': {
			pattern: /(^\{%[+-]?\s*)\w+/,
			lookbehind: true,
			alias: 'keyword'
		},
		'delimiter': {
			pattern: /^\{[{%][+-]?|[+-]?[}%]\}$/,
			alias: 'punctuation'
		},
		'string': {
			pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
			greedy: true
		},
		'filter': {
			pattern: /(\|)\w+/,
			lookbehind: true,
			alias: 'function'
		},
		'test': {
			pattern: /(\bis\s+(?:not\s+)?)(?!not\b)\w+/,
			lookbehind: true,
			alias: 'function'
		},
		'function': /\b[a-z_]\w+(?=\s*\()/i,
		'keyword': /\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,
		'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
		'number': /\b\d+(?:\.\d+)?\b/,
		'boolean': /[Ff]alse|[Nn]one|[Tt]rue/,
		'variable': /\b\w+\b/,
		'punctuation': /[{}[\](),.:;]/
	};


	var pattern = /\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g;
	var markupTemplating = Prism.languages['markup-templating'];

	Prism.hooks.add('before-tokenize', function (env) {
		markupTemplating.buildPlaceholders(env, 'django', pattern);
	});
	Prism.hooks.add('after-tokenize', function (env) {
		markupTemplating.tokenizePlaceholders(env, 'django');
	});

	// Add an Jinja2 alias
	Prism.languages.jinja2 = Prism.languages.django;
	Prism.hooks.add('before-tokenize', function (env) {
		markupTemplating.buildPlaceholders(env, 'jinja2', pattern);
	});
	Prism.hooks.add('after-tokenize', function (env) {
		markupTemplating.tokenizePlaceholders(env, 'jinja2');
	});

}(Prism));
X.Gxu!function(e){e.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"django",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"django")})),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"jinja2",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"jinja2")}))}(Prism);EBx(Prism.languages['dns-zone-file'] = {
	'comment': /;.*/,
	'string': {
		pattern: /"(?:\\.|[^"\\\r\n])*"/,
		greedy: true
	},
	'variable': [
		{
			pattern: /(^\$ORIGIN[ \t]+)\S+/m,
			lookbehind: true,
		},
		{
			pattern: /(^|\s)@(?=\s|$)/,
			lookbehind: true,
		}
	],
	'keyword': /^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,
	'class': {
		// https://tools.ietf.org/html/rfc1035#page-13
		pattern: /(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,
		lookbehind: true,
		alias: 'keyword'
	},
	'type': {
		// https://en.wikipedia.org/wiki/List_of_DNS_record_types
		pattern: /(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,
		lookbehind: true,
		alias: 'keyword'
	},
	'punctuation': /[()]/
};

Prism.languages['dns-zone'] = Prism.languages['dns-zone-file'];
7J3x<Prism.languages["dns-zone-file"]={comment:/;.*/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},variable:[{pattern:/(^\$ORIGIN[ \t]+)\S+/m,lookbehind:!0},{pattern:/(^|\s)@(?=\s|$)/,lookbehind:!0}],keyword:/^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,class:{pattern:/(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,lookbehind:!0,alias:"keyword"},punctuation:/[()]/},Prism.languages["dns-zone"]=Prism.languages["dns-zone-file"];nx)(function (Prism) {

	// Many of the following regexes will contain negated lookaheads like `[ \t]+(?![ \t])`. This is a trick to ensure
	// that quantifiers behave *atomically*. Atomic quantifiers are necessary to prevent exponential backtracking.

	var spaceAfterBackSlash = /\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source;
	// At least one space, comment, or line break
	var space = /(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)/.source
		.replace(/<SP_BS>/g, function () { return spaceAfterBackSlash; });

	var string = /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source;
	var option = /--[\w-]+=(?:<STR>|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(/<STR>/g, function () { return string; });

	var stringRule = {
		pattern: RegExp(string),
		greedy: true
	};
	var commentRule = {
		pattern: /(^[ \t]*)#.*/m,
		lookbehind: true,
		greedy: true
	};

	/**
	 * @param {string} source
	 * @param {string} flags
	 * @returns {RegExp}
	 */
	function re(source, flags) {
		source = source
			.replace(/<OPT>/g, function () { return option; })
			.replace(/<SP>/g, function () { return space; });

		return RegExp(source, flags);
	}

	Prism.languages.docker = {
		'instruction': {
			pattern: /(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,
			lookbehind: true,
			greedy: true,
			inside: {
				'options': {
					pattern: re(/(^(?:ONBUILD<SP>)?\w+<SP>)<OPT>(?:<SP><OPT>)*/.source, 'i'),
					lookbehind: true,
					greedy: true,
					inside: {
						'property': {
							pattern: /(^|\s)--[\w-]+/,
							lookbehind: true
						},
						'string': [
							stringRule,
							{
								pattern: /(=)(?!["'])(?:[^\s\\]|\\.)+/,
								lookbehind: true
							}
						],
						'operator': /\\$/m,
						'punctuation': /=/
					}
				},
				'keyword': [
					{
						// https://docs.docker.com/engine/reference/builder/#healthcheck
						pattern: re(/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\b/.source, 'i'),
						lookbehind: true,
						greedy: true
					},
					{
						// https://docs.docker.com/engine/reference/builder/#from
						pattern: re(/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\]+<SP>)AS/.source, 'i'),
						lookbehind: true,
						greedy: true
					},
					{
						// https://docs.docker.com/engine/reference/builder/#onbuild
						pattern: re(/(^ONBUILD<SP>)\w+/.source, 'i'),
						lookbehind: true,
						greedy: true
					},
					{
						pattern: /^\w+/,
						greedy: true
					}
				],
				'comment': commentRule,
				'string': stringRule,
				'variable': /\$(?:\w+|\{[^{}"'\\]*\})/,
				'operator': /\\$/m
			}
		},
		'comment': commentRule
	};

	Prism.languages.dockerfile = Prism.languages.docker;

}(Prism));
i=ʹ_x!function(e){var n="(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)".replace(/<SP_BS>/g,(function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"})),r="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:<STR>|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(/<STR>/g,(function(){return r})),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,r){return e=e.replace(/<OPT>/g,(function(){return t})).replace(/<SP>/g,(function(){return n})),RegExp(e,r)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD<SP>)?\\w+<SP>)<OPT>(?:<SP><OPT>)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\\\]+<SP>)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD<SP>)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism);$mqx// https://www.graphviz.org/doc/info/lang.html

(function (Prism) {

	var ID = '(?:' + [
		// an identifier
		/[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,
		// a number
		/-?(?:\.\d+|\d+(?:\.\d*)?)/.source,
		// a double-quoted string
		/"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,
		// HTML-like string
		/<(?:[^<>]|(?!<!--)<(?:[^<>"']|"[^"]*"|'[^']*')+>|<!--(?:[^-]|-(?!->))*-->)*>/.source
	].join('|') + ')';

	var IDInside = {
		'markup': {
			pattern: /(^<)[\s\S]+(?=>$)/,
			lookbehind: true,
			alias: ['language-markup', 'language-html', 'language-xml'],
			inside: Prism.languages.markup
		}
	};

	/**
	 * @param {string} source
	 * @param {string} flags
	 * @returns {RegExp}
	 */
	function withID(source, flags) {
		return RegExp(source.replace(/<ID>/g, function () { return ID; }), flags);
	}

	Prism.languages.dot = {
		'comment': {
			pattern: /\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,
			greedy: true
		},
		'graph-name': {
			pattern: withID(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)<ID>/.source, 'i'),
			lookbehind: true,
			greedy: true,
			alias: 'class-name',
			inside: IDInside
		},
		'attr-value': {
			pattern: withID(/(=[ \t\r\n]*)<ID>/.source),
			lookbehind: true,
			greedy: true,
			inside: IDInside
		},
		'attr-name': {
			pattern: withID(/([\[;, \t\r\n])<ID>(?=[ \t\r\n]*=)/.source),
			lookbehind: true,
			greedy: true,
			inside: IDInside
		},
		'keyword': /\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,
		'compass-point': {
			pattern: /(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,
			lookbehind: true,
			alias: 'builtin'
		},
		'node': {
			pattern: withID(/(^|[^-.\w\x80-\uFFFF\\])<ID>/.source),
			lookbehind: true,
			greedy: true,
			inside: IDInside
		},
		'operator': /[=:]|-[->]/,
		'punctuation': /[\[\]{};,]/
	};

	Prism.languages.gv = Prism.languages.dot;

}(Prism));
&VJx_!function(e){var a="(?:"+["[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*","-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)",'"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*"',"<(?:[^<>]|(?!\x3c!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|\x3c!--(?:[^-]|-(?!->))*--\x3e)*>"].join("|")+")",n={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,n){return RegExp(e.replace(/<ID>/g,(function(){return a})),n)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r("(\\b(?:digraph|graph|subgraph)[ \t\r\n]+)<ID>","i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:n},"attr-value":{pattern:r("(=[ \t\r\n]*)<ID>"),lookbehind:!0,greedy:!0,inside:n},"attr-name":{pattern:r("([\\[;, \t\r\n])<ID>(?=[ \t\r\n]*=)"),lookbehind:!0,greedy:!0,inside:n},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r("(^|[^-.\\w\\x80-\\uFFFF\\\\])<ID>"),lookbehind:!0,greedy:!0,inside:n},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism);bDx1Prism.languages.ebnf = {
	'comment': /\(\*[\s\S]*?\*\)/,
	'string': {
		pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
		greedy: true
	},
	'special': {
		pattern: /\?[^?\r\n]*\?/,
		greedy: true,
		alias: 'class-name'
	},

	'definition': {
		pattern: /^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,
		lookbehind: true,
		alias: ['rule', 'keyword']
	},
	'rule': /\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,

	'punctuation': /\([:/]|[:/]\)|[.,;()[\]{}]/,
	'operator': /[-=|*/!]/
};
32xxPrism.languages.ebnf={comment:/\(\*[\s\S]*?\*\)/,string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},special:{pattern:/\?[^?\r\n]*\?/,greedy:!0,alias:"class-name"},definition:{pattern:/^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,lookbehind:!0,alias:["rule","keyword"]},rule:/\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,punctuation:/\([:/]|[:/]\)|[.,;()[\]{}]/,operator:/[-=|*/!]/};L}"x%Prism.languages.editorconfig = {
	// https://editorconfig-specification.readthedocs.io
	'comment': /[;#].*/,
	'section': {
		pattern: /(^[ \t]*)\[.+\]/m,
		lookbehind: true,
		alias: 'selector',
		inside: {
			'regex': /\\\\[\[\]{},!?.*]/, // Escape special characters with '\\'
			'operator': /[!?]|\.\.|\*{1,2}/,
			'punctuation': /[\[\]{},]/
		}
	},
	'key': {
		pattern: /(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,
		lookbehind: true,
		alias: 'attr-name'
	},
	'value': {
		pattern: /=.*/,
		alias: 'attr-value',
		inside: {
			'punctuation': /^=/
		}
	}
};
%x\Prism.languages.editorconfig={comment:/[;#].*/,section:{pattern:/(^[ \t]*)\[.+\]/m,lookbehind:!0,alias:"selector",inside:{regex:/\\\\[\[\]{},!?.*]/,operator:/[!?]|\.\.|\*{1,2}/,punctuation:/[\[\]{},]/}},key:{pattern:/(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/=.*/,alias:"attr-value",inside:{punctuation:/^=/}}};xɹPx	Prism.languages.eiffel = {
	'comment': /--.*/,
	'string': [
		// Aligned-verbatim-strings
		{
			pattern: /"([^[]*)\[[\s\S]*?\]\1"/,
			greedy: true
		},
		// Non-aligned-verbatim-strings
		{
			pattern: /"([^{]*)\{[\s\S]*?\}\1"/,
			greedy: true
		},
		// Single-line string
		{
			pattern: /"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,
			greedy: true
		}
	],
	// normal char | special char | char code
	'char': /'(?:%.|[^%'\r\n])+'/,
	'keyword': /\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,
	'boolean': /\b(?:False|True)\b/i,
	// Convention: class-names are always all upper-case characters
	'class-name': /\b[A-Z][\dA-Z_]*\b/,
	'number': [
		// hexa | octal | bin
		/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,
		// Decimal
		/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i
	],
	'punctuation': /:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,
	'operator': /\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/
};
ɱ;xNPrism.languages.eiffel={comment:/--.*/,string:[{pattern:/"([^[]*)\[[\s\S]*?\]\1"/,greedy:!0},{pattern:/"([^{]*)\{[\s\S]*?\}\1"/,greedy:!0},{pattern:/"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,greedy:!0}],char:/'(?:%.|[^%'\r\n])+'/,keyword:/\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,boolean:/\b(?:False|True)\b/i,"class-name":/\b[A-Z][\dA-Z_]*\b/,number:[/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i],punctuation:/:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,operator:/\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/};nVv&xj(function (Prism) {

	Prism.languages.ejs = {
		'delimiter': {
			pattern: /^<%[-_=]?|[-_]?%>$/,
			alias: 'punctuation'
		},
		'comment': /^#[\s\S]*/,
		'language-javascript': {
			pattern: /[\s\S]+/,
			inside: Prism.languages.javascript
		}
	};

	Prism.hooks.add('before-tokenize', function (env) {
		var ejsPattern = /<%(?!%)[\s\S]+?%>/g;
		Prism.languages['markup-templating'].buildPlaceholders(env, 'ejs', ejsPattern);
	});

	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'ejs');
	});

	Prism.languages.eta = Prism.languages.ejs;

}(Prism));
px4!function(a){a.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:a.languages.javascript}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"ejs",/<%(?!%)[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"ejs")})),a.languages.eta=a.languages.ejs}(Prism);ߣ.x<Prism.languages.elixir = {
	'doc': {
		pattern: /@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,
		inside: {
			'attribute': /^@\w+/,
			'string': /['"][\s\S]+/
		}
	},
	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	// ~r"""foo""" (multi-line), ~r'''foo''' (multi-line), ~r/foo/, ~r|foo|, ~r"foo", ~r'foo', ~r(foo), ~r[foo], ~r{foo}, ~r<foo>
	'regex': {
		pattern: /~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,
		greedy: true
	},
	'string': [
		{
			// ~s"""foo""" (multi-line), ~s'''foo''' (multi-line), ~s/foo/, ~s|foo|, ~s"foo", ~s'foo', ~s(foo), ~s[foo], ~s{foo} (with interpolation care), ~s<foo>
			pattern: /~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,
			greedy: true,
			inside: {
				// See interpolation below
			}
		},
		{
			pattern: /("""|''')[\s\S]*?\1/,
			greedy: true,
			inside: {
				// See interpolation below
			}
		},
		{
			// Multi-line strings are allowed
			pattern: /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
			greedy: true,
			inside: {
				// See interpolation below
			}
		}
	],
	'atom': {
		// Look-behind prevents bad highlighting of the :: operator
		pattern: /(^|[^:]):\w+/,
		lookbehind: true,
		alias: 'symbol'
	},
	'module': {
		pattern: /\b[A-Z]\w*\b/,
		alias: 'class-name'
	},
	// Look-ahead prevents bad highlighting of the :: operator
	'attr-name': /\b\w+\??:(?!:)/,
	'argument': {
		// Look-behind prevents bad highlighting of the && operator
		pattern: /(^|[^&])&\d+/,
		lookbehind: true,
		alias: 'variable'
	},
	'attribute': {
		pattern: /@\w+/,
		alias: 'variable'
	},
	'function': /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,
	'number': /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,
	'keyword': /\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,
	'boolean': /\b(?:false|nil|true)\b/,
	'operator': [
		/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,
		{
			// We don't want to match <<
			pattern: /([^<])<(?!<)/,
			lookbehind: true
		},
		{
			// We don't want to match >>
			pattern: /([^>])>(?!>)/,
			lookbehind: true
		}
	],
	'punctuation': /<<|>>|[.,%\[\]{}()]/
};

Prism.languages.elixir.string.forEach(function (o) {
	o.inside = {
		'interpolation': {
			pattern: /#\{[^}]+\}/,
			inside: {
				'delimiter': {
					pattern: /^#\{|\}$/,
					alias: 'punctuation'
				},
				rest: Prism.languages.elixir
			}
		}
	};
});
n/sx6Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}));CvxPrism.languages.elm = {
	'comment': /--.*|\{-[\s\S]*?-\}/,
	'char': {
		pattern: /'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,
		greedy: true
	},
	'string': [
		{
			// Multiline strings are wrapped in triple ". Quotes may appear unescaped.
			pattern: /"""[\s\S]*?"""/,
			greedy: true
		},
		{
			pattern: /"(?:[^\\"\r\n]|\\.)*"/,
			greedy: true
		}
	],
	'import-statement': {
		// The imported or hidden names are not included in this import
		// statement. This is because we want to highlight those exactly like
		// we do for the names in the program.
		pattern: /(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,
		lookbehind: true,
		inside: {
			'keyword': /\b(?:as|exposing|import)\b/
		}
	},
	'keyword': /\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,
	// These are builtin variables only. Constructors are highlighted later as a constant.
	'builtin': /\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,
	// decimal integers and floating point numbers | hexadecimal integers
	'number': /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,
	// Most of this is needed because of the meaning of a single '.'.
	// If it stands alone freely, it is the function composition.
	// It may also be a separator between a module name and an identifier => no
	// operator. If it comes together with other special characters it is an
	// operator too.
	// Valid operator characters in 0.18: +-/*=.$<>:&|^?%#@~!
	// Ref: https://groups.google.com/forum/#!msg/elm-dev/0AHSnDdkSkQ/E0SVU70JEQAJ
	'operator': /\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,
	// In Elm, nearly everything is a variable, do not highlight these.
	'hvariable': /\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,
	'constant': /\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,
	'punctuation': /[{}[\]|(),.:]/
};
E%?x	Prism.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|exposing|import)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/};gd(xr(function (Prism) {

	Prism.languages.erb = {
		'delimiter': {
			pattern: /^(\s*)<%=?|%>(?=\s*$)/,
			lookbehind: true,
			alias: 'punctuation'
		},
		'ruby': {
			pattern: /\s*\S[\s\S]*/,
			alias: 'language-ruby',
			inside: Prism.languages.ruby
		}
	};

	Prism.hooks.add('before-tokenize', function (env) {
		var erbPattern = /<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g;
		Prism.languages['markup-templating'].buildPlaceholders(env, 'erb', erbPattern);
	});

	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'erb');
	});

}(Prism));
ĳx!function(e){e.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:e.languages.ruby}},e.hooks.add("before-tokenize",(function(n){e.languages["markup-templating"].buildPlaceholders(n,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"erb")}))}(Prism);F׺Bx*Prism.languages.erlang = {
	'comment': /%.+/,
	'string': {
		pattern: /"(?:\\.|[^\\"\r\n])*"/,
		greedy: true
	},
	'quoted-function': {
		pattern: /'(?:\\.|[^\\'\r\n])+'(?=\()/,
		alias: 'function'
	},
	'quoted-atom': {
		pattern: /'(?:\\.|[^\\'\r\n])+'/,
		alias: 'atom'
	},
	'boolean': /\b(?:false|true)\b/,
	'keyword': /\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,
	'number': [
		/\$\\?./,
		/\b\d+#[a-z0-9]+/i,
		/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i
	],
	'function': /\b[a-z][\w@]*(?=\()/,
	'variable': {
		// Look-behind is used to prevent wrong highlighting of atoms containing "@"
		pattern: /(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,
		lookbehind: true
	},
	'operator': [
		/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,
		{
			// We don't want to match <<
			pattern: /(^|[^<])<(?!<)/,
			lookbehind: true
		},
		{
			// We don't want to match >>
			pattern: /(^|[^>])>(?!>)/,
			lookbehind: true
		}
	],
	'atom': /\b[a-z][\w@]*/,
	'punctuation': /[()[\]{}:;,.#|]|<<|>>/

};
3B/xPrism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/};)޼ x(function (Prism) {

	Prism.languages.etlua = {
		'delimiter': {
			pattern: /^<%[-=]?|-?%>$/,
			alias: 'punctuation'
		},
		'language-lua': {
			pattern: /[\s\S]+/,
			inside: Prism.languages.lua
		}
	};

	Prism.hooks.add('before-tokenize', function (env) {
		var pattern = /<%[\s\S]+?%>/g;
		Prism.languages['markup-templating'].buildPlaceholders(env, 'etlua', pattern);
	});

	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'etlua');
	});

}(Prism));
Ҷxy!function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"etlua",/<%[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"etlua")}))}(Prism);lx1Prism.languages['excel-formula'] = {
	'comment': {
		pattern: /(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,
		lookbehind: true,
		greedy: true
	},
	'string': {
		pattern: /"(?:[^"]|"")*"(?!")/,
		greedy: true
	},
	'reference': {
		// https://www.ablebits.com/office-addins-blog/2015/12/08/excel-reference-another-sheet-workbook/

		// Sales!B2
		// 'Winter sales'!B2
		// [Sales.xlsx]Jan!B2:B5
		// D:\Reports\[Sales.xlsx]Jan!B2:B5
		// '[Sales.xlsx]Jan sales'!B2:B5
		// 'D:\Reports\[Sales.xlsx]Jan sales'!B2:B5

		pattern: /(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,
		greedy: true,
		alias: 'string',
		inside: {
			'operator': /!$/,
			'punctuation': /'/,
			'sheet': {
				pattern: /[^[\]]+$/,
				alias: 'function'
			},
			'file': {
				pattern: /\[[^[\]]+\]$/,
				inside: {
					'punctuation': /[[\]]/
				}
			},
			'path': /[\s\S]+/
		}
	},
	'function-name': {
		pattern: /\b[A-Z]\w*(?=\()/i,
		alias: 'builtin'
	},
	'range': {
		pattern: /\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,
		alias: 'selector',
		inside: {
			'operator': /:/,
			'cell': /\$?[A-Z]+\$?\d+/i,
			'column': /\$?[A-Z]+/i,
			'row': /\$?\d+/
		}
	},
	'cell': {
		// Excel is case insensitive, so the string "foo1" could be either a variable or a cell.
		// To combat this, we match cells case insensitive, if the contain at least one "$", and case sensitive otherwise.
		pattern: /\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,
		alias: 'selector'
	},
	'number': /(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,
	'boolean': /\b(?:FALSE|TRUE)\b/i,
	'operator': /[-+*/^%=&,]|<[=>]?|>=?/,
	'punctuation': /[[\]();{}|]/
};

Prism.languages['xlsx'] = Prism.languages['xls'] = Prism.languages['excel-formula'];
e1=x%Prism.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"builtin"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"selector",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"selector"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},Prism.languages.xlsx=Prism.languages.xls=Prism.languages["excel-formula"];E1D:xA(function (Prism) {

	var comment_inside = {
		'function': /\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/
	};
	var string_inside = {
		'number': /\\[^\s']|%\w/
	};

	var factor = {
		'comment': [
			{
				// ! single-line exclamation point comments with whitespace after/around the !
				pattern: /(^|\s)(?:! .*|!$)/,
				lookbehind: true,
				inside: comment_inside
			},

			/* from basis/multiline: */
			{
				// /* comment */, /* comment*/
				pattern: /(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,
				lookbehind: true,
				greedy: true,
				inside: comment_inside
			},
			{
				// ![[ comment ]] , ![===[ comment]===]
				pattern: /(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,
				lookbehind: true,
				greedy: true,
				inside: comment_inside
			}
		],

		'number': [
			{
				// basic base 10 integers 9, -9
				pattern: /(^|\s)[+-]?\d+(?=\s|$)/,
				lookbehind: true
			},
			{
				// base prefix integers 0b010 0o70 0xad 0d10 0XAD -0xa9
				pattern: /(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,
				lookbehind: true
			},
			{
				// fractional ratios 1/5 -1/5 and the literal float approximations 1/5. -1/5.
				pattern: /(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,
				lookbehind: true
			},
			{
				// positive mixed numbers 23+1/5 +23+1/5
				pattern: /(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,
				lookbehind: true
			},
			{
				// negative mixed numbers -23-1/5
				pattern: /(^|\s)-\d+-\d+\/\d+(?=\s|$)/,
				lookbehind: true
			},
			{
				// basic decimal floats -0.01 0. .0 .1 -.1 -1. -12.13 +12.13
				// and scientific notation with base 10 exponents 3e4 3e-4 .3e-4
				pattern: /(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,
				lookbehind: true
			},
			{
				// NAN literal syntax NAN: 80000deadbeef, NAN: a
				pattern: /(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,
				lookbehind: true
			},
			{
				/*
					base prefix floats 0x1.0p3 (8.0) 0b1.010p2 (5.0) 0x1.p1 0b1.11111111p11111...
					"The normalized hex form ±0x1.MMMMMMMMMMMMM[pP]±EEEE allows any floating-point number to be specified precisely.
					The values of MMMMMMMMMMMMM and EEEE map directly to the mantissa and exponent fields of the binary IEEE 754 representation."
					<https://docs.factorcode.org/content/article-syntax-floats.html>
				*/
				pattern: /(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,
				lookbehind: true
			}
		],

		// R/ regexp?\/\\/
		'regexp': {
			pattern: /(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,
			lookbehind: true,
			alias: 'number',
			inside: {
				'variable': /\\\S/,
				'keyword': /[+?*\[\]^$(){}.|]/,
				'operator': {
					pattern: /(\/)[idmsr]+(?:-[idmsr]+)?/,
					lookbehind: true
				}
			}
		},

		'boolean': {
			pattern: /(^|\s)[tf](?=\s|$)/,
			lookbehind: true
		},

		// SBUF" asd", URL" ://...", P" /etc/"
		'custom-string': {
			pattern: /(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,
			lookbehind: true,
			greedy: true,
			alias: 'string',
			inside: {
				'number': /\\\S|%\w|\//
			}
		},

		'multiline-string': [
			{
				// STRING: name \n content \n ; -> CONSTANT: name "content" (symbol)
				pattern: /(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,
				lookbehind: true,
				greedy: true,
				alias: 'string',
				inside: {
					'number': string_inside.number,
					// trailing semicolon on its own line
					'semicolon-or-setlocal': {
						pattern: /([\r\n][ \t]*);(?=\s|$)/,
						lookbehind: true,
						alias: 'function'
					}
				}
			},
			{
				// HEREDOC: marker \n content \n marker ; -> "content" (immediate)
				pattern: /(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,
				lookbehind: true,
				greedy: true,
				alias: 'string',
				inside: string_inside
			},
			{
				// [[ string ]], [==[ string]==]
				pattern: /(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,
				lookbehind: true,
				greedy: true,
				alias: 'string',
				inside: string_inside
			}
		],

		'special-using': {
			pattern: /(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,
			lookbehind: true,
			alias: 'function',
			inside: {
				// this is essentially a regex for vocab names, which i don't want to specify
				// but the USING: gets picked up as a vocab name
				'string': {
					pattern: /(\s)[^:\s]+/,
					lookbehind: true
				}
			}
		},

		/* this description of stack effect literal syntax is not complete and not as specific as theoretically possible
			trying to do better is more work and regex-computation-time than it's worth though.
			- we'd like to have the "delimiter" parts of the stack effect [ (, --, and ) ] be a different (less-important or comment-like) colour to the stack effect contents
			- we'd like if nested stack effects were treated as such rather than just appearing flat (with `inside`)
			- we'd like if the following variable name conventions were recognised specifically:
				special row variables = ..a b..
				type and stack effect annotations end with a colon = ( quot: ( a: ( -- ) -- b ) -- x ), ( x: number -- )
				word throws unconditional error = *
				any other word-like variable name = a ? q' etc

			https://docs.factorcode.org/content/article-effects.html

			these are pretty complicated to highlight properly without a real parser, and therefore out of scope
			the old pattern, which may be later useful, was: (^|\s)(?:call|execute|eval)?\((?:\s+[^"\r\n\t ]\S*)*?\s+--(?:\s+[^"\n\t ]\S*)*?\s+\)(?=\s|$)
		*/

		// current solution is not great
		'stack-effect-delimiter': [
			{
				// opening parenthesis
				pattern: /(^|\s)(?:call|eval|execute)?\((?=\s)/,
				lookbehind: true,
				alias: 'operator'
			},
			{
				// middle --
				pattern: /(\s)--(?=\s)/,
				lookbehind: true,
				alias: 'operator'
			},
			{
				// closing parenthesis
				pattern: /(\s)\)(?=\s|$)/,
				lookbehind: true,
				alias: 'operator'
			}
		],

		'combinators': {
			pattern: null,
			lookbehind: true,
			alias: 'keyword'
		},

		'kernel-builtin': {
			pattern: null,
			lookbehind: true,
			alias: 'variable'
		},

		'sequences-builtin': {
			pattern: null,
			lookbehind: true,
			alias: 'variable'
		},

		'math-builtin': {
			pattern: null,
			lookbehind: true,
			alias: 'variable'
		},

		'constructor-word': {
			// <array> but not <=>
			pattern: /(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,
			lookbehind: true,
			alias: 'keyword'
		},

		'other-builtin-syntax': {
			pattern: null,
			lookbehind: true,
			alias: 'operator'
		},

		/*
			full list of supported word naming conventions: (the convention appears outside of the [brackets])
				set-[x]
				change-[x]
				with-[x]
				new-[x]
				>[string]
				[base]>
				[string]>[number]
				+[symbol]+
				[boolean-word]?
				?[of]
				[slot-reader]>>
				>>[slot-setter]
				[slot-writer]<<
				([implementation-detail])
				[mutater]!
				[variant]*
				[prettyprint].
				$[help-markup]

			<constructors>, SYNTAX:, etc are supported by their own patterns.

			`with` and `new` from `kernel` are their own builtins.

			see <https://docs.factorcode.org/content/article-conventions.html>
		*/
		'conventionally-named-word': {
			pattern: /(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,
			lookbehind: true,
			alias: 'keyword'
		},

		'colon-syntax': {
			pattern: /(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,
			lookbehind: true,
			greedy: true,
			alias: 'function'
		},

		'semicolon-or-setlocal': {
			pattern: /(\s)(?:;|:>)(?=\s|$)/,
			lookbehind: true,
			alias: 'function'
		},

		// do not highlight leading } or trailing X{ at the begin/end of the file as it's invalid syntax
		'curly-brace-literal-delimiter': [
			{
				// opening
				pattern: /(^|\s)[a-z]*\{(?=\s)/i,
				lookbehind: true,
				alias: 'operator'
			},
			{
				// closing
				pattern: /(\s)\}(?=\s|$)/,
				lookbehind: true,
				alias: 'operator'
			},

		],

		// do not highlight leading ] or trailing [ at the begin/end of the file as it's invalid syntax
		'quotation-delimiter': [
			{
				// opening
				pattern: /(^|\s)\[(?=\s)/,
				lookbehind: true,
				alias: 'operator'
			},
			{
				// closing
				pattern: /(\s)\](?=\s|$)/,
				lookbehind: true,
				alias: 'operator'
			},
		],

		'normal-word': {
			pattern: /(^|\s)[^"\s]\S*(?=\s|$)/,
			lookbehind: true
		},

		/*
			basic first-class string "a"
				with escaped double-quote "a\""
				escaped backslash "\\"
				and general escapes since Factor has so many "\N"

			syntax that works in the reference implementation that isn't fully
			supported because it's an implementation detail:
				"string 1""string 2" -> 2 strings (works anyway)
				"string"5 -> string, 5
				"string"[ ] -> string, quotation
				{ "a"} -> array<string>

			the rest of those examples all properly recognise the string, but not
				the other object (number, quotation, etc)
			this is fine for a regex-only implementation.
		*/
		'string': {
			pattern: /"(?:\\\S|[^"\\])*"/,
			greedy: true,
			inside: string_inside
		}
	};

	var escape = function (str) {
		return (str + '').replace(/([.?*+\^$\[\]\\(){}|\-])/g, '\\$1');
	};

	var arrToWordsRegExp = function (arr) {
		return new RegExp(
			'(^|\\s)(?:' + arr.map(escape).join('|') + ')(?=\\s|$)'
		);
	};

	var builtins = {
		'kernel-builtin': [
			'or', '2nipd', '4drop', 'tuck', 'wrapper', 'nip', 'wrapper?', 'callstack>array', 'die', 'dupd', 'callstack', 'callstack?', '3dup', 'hashcode', 'pick', '4nip', 'build', '>boolean', 'nipd', 'clone', '5nip', 'eq?', '?', '=', 'swapd', '2over', 'clear', '2dup', 'get-retainstack', 'not', 'tuple?', 'dup', '3nipd', 'call', '-rotd', 'object', 'drop', 'assert=', 'assert?', '-rot', 'execute', 'boa', 'get-callstack', 'curried?', '3drop', 'pickd', 'overd', 'over', 'roll', '3nip', 'swap', 'and', '2nip', 'rotd', 'throw', '(clone)', 'hashcode*', 'spin', 'reach', '4dup', 'equal?', 'get-datastack', 'assert', '2drop', '<wrapper>', 'boolean?', 'identity-hashcode', 'identity-tuple?', 'null', 'composed?', 'new', '5drop', 'rot', '-roll', 'xor', 'identity-tuple', 'boolean'
		],
		'other-builtin-syntax': [
			// syntax
			'=======', 'recursive', 'flushable', '>>', '<<<<<<', 'M\\', 'B', 'PRIVATE>', '\\', '======', 'final', 'inline', 'delimiter', 'deprecated', '<PRIVATE', '>>>>>>', '<<<<<<<', 'parse-complex', 'malformed-complex', 'read-only', '>>>>>>>', 'call-next-method', '<<', 'foldable',
			// literals
			'$', '$[', '${'
		],
		'sequences-builtin': [
			'member-eq?', 'mismatch', 'append', 'assert-sequence=', 'longer', 'repetition', 'clone-like', '3sequence', 'assert-sequence?', 'last-index-from', 'reversed', 'index-from', 'cut*', 'pad-tail', 'join-as', 'remove-eq!', 'concat-as', 'but-last', 'snip', 'nths', 'nth', 'sequence', 'longest', 'slice?', '<slice>', 'remove-nth', 'tail-slice', 'empty?', 'tail*', 'member?', 'virtual-sequence?', 'set-length', 'drop-prefix', 'iota', 'unclip', 'bounds-error?', 'unclip-last-slice', 'non-negative-integer-expected', 'non-negative-integer-expected?', 'midpoint@', 'longer?', '?set-nth', '?first', 'rest-slice', 'prepend-as', 'prepend', 'fourth', 'sift', 'subseq-start', 'new-sequence', '?last', 'like', 'first4', '1sequence', 'reverse', 'slice', 'virtual@', 'repetition?', 'set-last', 'index', '4sequence', 'max-length', 'set-second', 'immutable-sequence', 'first2', 'first3', 'supremum', 'unclip-slice', 'suffix!', 'insert-nth', 'tail', '3append', 'short', 'suffix', 'concat', 'flip', 'immutable?', 'reverse!', '2sequence', 'sum', 'delete-all', 'indices', 'snip-slice', '<iota>', 'check-slice', 'sequence?', 'head', 'append-as', 'halves', 'sequence=', 'collapse-slice', '?second', 'slice-error?', 'product', 'bounds-check?', 'bounds-check', 'immutable', 'virtual-exemplar', 'harvest', 'remove', 'pad-head', 'last', 'set-fourth', 'cartesian-product', 'remove-eq', 'shorten', 'shorter', 'reversed?', 'shorter?', 'shortest', 'head-slice', 'pop*', 'tail-slice*', 'but-last-slice', 'iota?', 'append!', 'cut-slice', 'new-resizable', 'head-slice*', 'sequence-hashcode', 'pop', 'set-nth', '?nth', 'second', 'join', 'immutable-sequence?', '<reversed>', '3append-as', 'virtual-sequence', 'subseq?', 'remove-nth!', 'length', 'last-index', 'lengthen', 'assert-sequence', 'copy', 'move', 'third', 'first', 'tail?', 'set-first', 'prefix', 'bounds-error', '<repetition>', 'exchange', 'surround', 'cut', 'min-length', 'set-third', 'push-all', 'head?', 'subseq-start-from', 'delete-slice', 'rest', 'sum-lengths', 'head*', 'infimum', 'remove!', 'glue', 'slice-error', 'subseq', 'push', 'replace-slice', 'subseq-as', 'unclip-last'
		],
		'math-builtin': [
			'number=', 'next-power-of-2', '?1+', 'fp-special?', 'imaginary-part', 'float>bits', 'number?', 'fp-infinity?', 'bignum?', 'fp-snan?', 'denominator', 'gcd', '*', '+', 'fp-bitwise=', '-', 'u>=', '/', '>=', 'bitand', 'power-of-2?', 'log2-expects-positive', 'neg?', '<', 'log2', '>', 'integer?', 'number', 'bits>double', '2/', 'zero?', 'bits>float', 'float?', 'shift', 'ratio?', 'rect>', 'even?', 'ratio', 'fp-sign', 'bitnot', '>fixnum', 'complex?', '/i', 'integer>fixnum', '/f', 'sgn', '>bignum', 'next-float', 'u<', 'u>', 'mod', 'recip', 'rational', '>float', '2^', 'integer', 'fixnum?', 'neg', 'fixnum', 'sq', 'bignum', '>rect', 'bit?', 'fp-qnan?', 'simple-gcd', 'complex', '<fp-nan>', 'real', '>fraction', 'double>bits', 'bitor', 'rem', 'fp-nan-payload', 'real-part', 'log2-expects-positive?', 'prev-float', 'align', 'unordered?', 'float', 'fp-nan?', 'abs', 'bitxor', 'integer>fixnum-strict', 'u<=', 'odd?', '<=', '/mod', '>integer', 'real?', 'rational?', 'numerator'
		]
		// that's all for now
	};

	Object.keys(builtins).forEach(function (k) {
		factor[k].pattern = arrToWordsRegExp(builtins[k]);
	});

	var combinators = [
		// kernel
		'2bi', 'while', '2tri', 'bi*', '4dip', 'both?', 'same?', 'tri@', 'curry', 'prepose', '3bi', '?if', 'tri*', '2keep', '3keep', 'curried', '2keepd', 'when', '2bi*', '2tri*', '4keep', 'bi@', 'keepdd', 'do', 'unless*', 'tri-curry', 'if*', 'loop', 'bi-curry*', 'when*', '2bi@', '2tri@', 'with', '2with', 'either?', 'bi', 'until', '3dip', '3curry', 'tri-curry*', 'tri-curry@', 'bi-curry', 'keepd', 'compose', '2dip', 'if', '3tri', 'unless', 'tuple', 'keep', '2curry', 'tri', 'most', 'while*', 'dip', 'composed', 'bi-curry@',
		// sequences
		'find-last-from', 'trim-head-slice', 'map-as', 'each-from', 'none?', 'trim-tail', 'partition', 'if-empty', 'accumulate*', 'reject!', 'find-from', 'accumulate-as', 'collector-for-as', 'reject', 'map', 'map-sum', 'accumulate!', '2each-from', 'follow', 'supremum-by', 'map!', 'unless-empty', 'collector', 'padding', 'reduce-index', 'replicate-as', 'infimum-by', 'trim-tail-slice', 'count', 'find-index', 'filter', 'accumulate*!', 'reject-as', 'map-integers', 'map-find', 'reduce', 'selector', 'interleave', '2map', 'filter-as', 'binary-reduce', 'map-index-as', 'find', 'produce', 'filter!', 'replicate', 'cartesian-map', 'cartesian-each', 'find-index-from', 'map-find-last', '3map-as', '3map', 'find-last', 'selector-as', '2map-as', '2map-reduce', 'accumulate', 'each', 'each-index', 'accumulate*-as', 'when-empty', 'all?', 'collector-as', 'push-either', 'new-like', 'collector-for', '2selector', 'push-if', '2all?', 'map-reduce', '3each', 'any?', 'trim-slice', '2reduce', 'change-nth', 'produce-as', '2each', 'trim', 'trim-head', 'cartesian-find', 'map-index',
		// math
		'if-zero', 'each-integer', 'unless-zero', '(find-integer)', 'when-zero', 'find-last-integer', '(all-integers?)', 'times', '(each-integer)', 'find-integer', 'all-integers?',
		// math.combinators
		'unless-negative', 'if-positive', 'when-positive', 'when-negative', 'unless-positive', 'if-negative',
		// combinators
		'case', '2cleave', 'cond>quot', 'case>quot', '3cleave', 'wrong-values', 'to-fixed-point', 'alist>quot', 'cond', 'cleave', 'call-effect', 'recursive-hashcode', 'spread', 'deep-spread>quot',
		// combinators.short-circuit
		'2||', '0||', 'n||', '0&&', '2&&', '3||', '1||', '1&&', 'n&&', '3&&',
		// combinators.smart
		'smart-unless*', 'keep-inputs', 'reduce-outputs', 'smart-when*', 'cleave>array', 'smart-with', 'smart-apply', 'smart-if', 'inputs/outputs', 'output>sequence-n', 'map-outputs', 'map-reduce-outputs', 'dropping', 'output>array', 'smart-map-reduce', 'smart-2map-reduce', 'output>array-n', 'nullary', 'input<sequence', 'append-outputs', 'drop-inputs', 'inputs', 'smart-2reduce', 'drop-outputs', 'smart-reduce', 'preserving', 'smart-when', 'outputs', 'append-outputs-as', 'smart-unless', 'smart-if*', 'sum-outputs', 'input<sequence-unsafe', 'output>sequence',
		// tafn
	];

	factor.combinators.pattern = arrToWordsRegExp(combinators);

	Prism.languages.factor = factor;

}(Prism));
WxH'!function(e){var t={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},s={number:/\\[^\s']|%\w/},i={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:t},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:t}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:s.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:s}},n=function(e){return(e+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},r=function(e){return new RegExp("(^|\\s)(?:"+e.map(n).join("|")+")(?=\\s|$)")},a={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","<wrapper>","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated","<PRIVATE",">>>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","<slice>","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","<iota>","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","<reversed>","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","<repetition>","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","<fp-nan>","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(a).forEach((function(e){i[e].pattern=r(a[e])})),i.combinators.pattern=r(["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","input<sequence","append-outputs","drop-inputs","inputs","smart-2reduce","drop-outputs","smart-reduce","preserving","smart-when","outputs","append-outputs-as","smart-unless","smart-if*","sum-outputs","input<sequence-unsafe","output>sequence"]),e.languages.factor=i}(Prism);_t(x~(function (Prism) {
	/**
	 * Based on the manual by Wouter van Oortmerssen.
	 *
	 * @see {@link https://github.com/PrismJS/prism/issues/2801#issue-829717504}
	 */
	Prism.languages['false'] = {
		'comment': {
			pattern: /\{[^}]*\}/
		},
		'string': {
			pattern: /"[^"]*"/,
			greedy: true
		},
		'character-code': {
			pattern: /'(?:[^\r]|\r\n?)/,
			alias: 'number'
		},
		'assembler-code': {
			pattern: /\d+`/,
			alias: 'important'
		},
		'number': /\d+/,
		'operator': /[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,
		'punctuation': /\[|\]/,
		'variable': /[a-z]/,
		'non-standard': {
			pattern: /[()<BDO®]/,
			alias: 'bold'
		}
	};
}(Prism));
Z>Ľxm!function(a){a.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()<BDO®]/,alias:"bold"}}}(Prism);T.>xPrism.languages['firestore-security-rules'] = Prism.languages.extend('clike', {
	'comment': /\/\/.*/,
	'keyword': /\b(?:allow|function|if|match|null|return|rules_version|service)\b/,
	'operator': /&&|\|\||[<>!=]=?|[-+*/%]|\b(?:in|is)\b/,
});

delete Prism.languages['firestore-security-rules']['class-name'];

Prism.languages.insertBefore('firestore-security-rules', 'keyword', {
	'path': {
		pattern: /(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,
		lookbehind: true,
		greedy: true,
		inside: {
			'variable': {
				pattern: /\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,
				inside: {
					'operator': /=/,
					'keyword': /\*\*/,
					'punctuation': /[.$(){}]/
				}
			},
			'punctuation': /\//
		}
	},
	'method': {
		// to make the pattern shorter, the actual method names are omitted
		pattern: /(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,
		lookbehind: true,
		alias: 'builtin',
		inside: {
			'punctuation': /,/
		}
	},
});
r~5׶0xPrism.languages["firestore-security-rules"]=Prism.languages.extend("clike",{comment:/\/\/.*/,keyword:/\b(?:allow|function|if|match|null|return|rules_version|service)\b/,operator:/&&|\|\||[<>!=]=?|[-+*/%]|\b(?:in|is)\b/}),delete Prism.languages["firestore-security-rules"]["class-name"],Prism.languages.insertBefore("firestore-security-rules","keyword",{path:{pattern:/(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,inside:{operator:/=/,keyword:/\*\*/,punctuation:/[.$(){}]/}},punctuation:/\//}},method:{pattern:/(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,lookbehind:!0,alias:"builtin",inside:{punctuation:/,/}}});CDxK(function (Prism) {
	Prism.languages.flow = Prism.languages.extend('javascript', {});

	Prism.languages.insertBefore('flow', 'keyword', {
		'type': [
			{
				pattern: /\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,
				alias: 'class-name'
			}
		]
	});
	Prism.languages.flow['function-variable'].pattern = /(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i;
	delete Prism.languages.flow['parameter'];

	Prism.languages.insertBefore('flow', 'operator', {
		'flow-punctuation': {
			pattern: /\{\||\|\}/,
			alias: 'punctuation'
		}
	});

	if (!Array.isArray(Prism.languages.flow.keyword)) {
		Prism.languages.flow.keyword = [Prism.languages.flow.keyword];
	}
	Prism.languages.flow.keyword.unshift(
		{
			pattern: /(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,
			lookbehind: true
		},
		{
			pattern: /(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,
			lookbehind: true
		}
	);
}(Prism));
Eg۸9xg!function(a){a.languages.flow=a.languages.extend("javascript",{}),a.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),a.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(Prism);H׺^xPrism.languages.fortran = {
	'quoted-number': {
		pattern: /[BOZ](['"])[A-F0-9]+\1/i,
		alias: 'number'
	},
	'string': {
		pattern: /(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,
		inside: {
			'comment': {
				pattern: /(&(?:\r\n?|\n)\s*)!.*/,
				lookbehind: true
			}
		}
	},
	'comment': {
		pattern: /!.*/,
		greedy: true
	},
	'boolean': /\.(?:FALSE|TRUE)\.(?:_\w+)?/i,
	'number': /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,
	'keyword': [
		// Types
		/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,
		// END statements
		/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,
		// Statements
		/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,
		// Others
		/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i
	],
	'operator': [
		/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,
		{
			// Use lookbehind to prevent confusion with (/ /)
			pattern: /(^|(?!\().)\/(?!\))/,
			lookbehind: true
		}
	],
	'punctuation': /\(\/|\/\)|[(),;:&]/
};
)ؿNxPrism.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:FALSE|TRUE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/};x	yPrism.languages.fsharp = Prism.languages.extend('clike', {
	'comment': [
		{
			pattern: /(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,
			lookbehind: true,
			greedy: true
		},
		{
			pattern: /(^|[^\\:])\/\/.*/,
			lookbehind: true,
			greedy: true
		}
	],
	'string': {
		pattern: /(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,
		greedy: true
	},
	'class-name': {
		pattern: /(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,
		lookbehind: true,
		inside: {
			'operator': /->|\*/,
			'punctuation': /\./
		}
	},
	'keyword': /\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,
	'number': [
		/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,
		/\b0b[01]+(?:uy|y)?\b/,
		/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,
		/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/
	],
	'operator': /([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|<?\|{1,3}>?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/
});
Prism.languages.insertBefore('fsharp', 'keyword', {
	'preprocessor': {
		pattern: /(^[\t ]*)#.*/m,
		lookbehind: true,
		alias: 'property',
		inside: {
			'directive': {
				pattern: /(^#)\b(?:else|endif|if|light|line|nowarn)\b/,
				lookbehind: true,
				alias: 'keyword'
			}
		}
	}
});
Prism.languages.insertBefore('fsharp', 'punctuation', {
	'computation-expression': {
		pattern: /\b[_a-z]\w*(?=\s*\{)/i,
		alias: 'keyword'
	}
});
Prism.languages.insertBefore('fsharp', 'string', {
	'annotation': {
		pattern: /\[<.+?>\]/,
		greedy: true,
		inside: {
			'punctuation': /^\[<|>\]$/,
			'class-name': {
				pattern: /^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,
				lookbehind: true
			},
			'annotation-content': {
				pattern: /[\s\S]+/,
				inside: Prism.languages.fsharp
			}
		}
	},
	'char': {
		pattern: /'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,
		greedy: true
	}
});
;)xFPrism.languages.fsharp=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,number:[/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,/\b0b[01]+(?:uy|y)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|<?\|{1,3}>?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),Prism.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),Prism.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,greedy:!0,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:Prism.languages.fsharp}}},char:{pattern:/'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0}}); x}
(function (Prism) {

	// https://freemarker.apache.org/docs/dgui_template_exp.html

	// FTL expression with 4 levels of nesting supported
	var FTL_EXPR = /[^<()"']|\((?:<expr>)*\)|<(?!#--)|<#--(?:[^-]|-(?!->))*-->|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'/.source;
	for (var i = 0; i < 2; i++) {
		FTL_EXPR = FTL_EXPR.replace(/<expr>/g, function () { return FTL_EXPR; });
	}
	FTL_EXPR = FTL_EXPR.replace(/<expr>/g, /[^\s\S]/.source);

	var ftl = {
		'comment': /<#--[\s\S]*?-->/,
		'string': [
			{
				// raw string
				pattern: /\br("|')(?:(?!\1)[^\\]|\\.)*\1/,
				greedy: true
			},
			{
				pattern: RegExp(/("|')(?:(?!\1|\$\{)[^\\]|\\.|\$\{(?:(?!\})(?:<expr>))*\})*\1/.source.replace(/<expr>/g, function () { return FTL_EXPR; })),
				greedy: true,
				inside: {
					'interpolation': {
						pattern: RegExp(/((?:^|[^\\])(?:\\\\)*)\$\{(?:(?!\})(?:<expr>))*\}/.source.replace(/<expr>/g, function () { return FTL_EXPR; })),
						lookbehind: true,
						inside: {
							'interpolation-punctuation': {
								pattern: /^\$\{|\}$/,
								alias: 'punctuation'
							},
							rest: null
						}
					}
				}
			}
		],
		'keyword': /\b(?:as)\b/,
		'boolean': /\b(?:false|true)\b/,
		'builtin-function': {
			pattern: /((?:^|[^?])\?\s*)\w+/,
			lookbehind: true,
			alias: 'function'
		},
		'function': /\b\w+(?=\s*\()/,
		'number': /\b\d+(?:\.\d+)?\b/,
		'operator': /\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,
		'punctuation': /[,;.:()[\]{}]/
	};

	ftl.string[1].inside.interpolation.inside.rest = ftl;

	Prism.languages.ftl = {
		'ftl-comment': {
			// the pattern is shortened to be more efficient
			pattern: /^<#--[\s\S]*/,
			alias: 'comment'
		},
		'ftl-directive': {
			pattern: /^<[\s\S]+>$/,
			inside: {
				'directive': {
					pattern: /(^<\/?)[#@][a-z]\w*/i,
					lookbehind: true,
					alias: 'keyword'
				},
				'punctuation': /^<\/?|\/?>$/,
				'content': {
					pattern: /\s*\S[\s\S]*/,
					alias: 'ftl',
					inside: ftl
				}
			}
		},
		'ftl-interpolation': {
			pattern: /^\$\{[\s\S]*\}$/,
			inside: {
				'punctuation': /^\$\{|\}$/,
				'content': {
					pattern: /\s*\S[\s\S]*/,
					alias: 'ftl',
					inside: ftl
				}
			}
		}
	};

	Prism.hooks.add('before-tokenize', function (env) {
		// eslint-disable-next-line regexp/no-useless-lazy
		var pattern = RegExp(/<#--[\s\S]*?-->|<\/?[#@][a-zA-Z](?:<expr>)*?>|\$\{(?:<expr>)*?\}/.source.replace(/<expr>/g, function () { return FTL_EXPR; }), 'gi');
		Prism.languages['markup-templating'].buildPlaceholders(env, 'ftl', pattern);
	});

	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'ftl');
	});

}(Prism));
F.rx&!function(e){for(var t="[^<()\"']|\\((?:<expr>)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",n=0;n<2;n++)t=t.replace(/<expr>/g,(function(){return t}));t=t.replace(/<expr>/g,"[^\\s\\S]");var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:<expr>))*\\})*\\1".replace(/<expr>/g,(function(){return t}))),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:<expr>))*\\}".replace(/<expr>/g,(function(){return t}))),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,e.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},e.hooks.add("before-tokenize",(function(n){var i=RegExp("<#--[^]*?--\x3e|</?[#@][a-zA-Z](?:<expr>)*?>|\\$\\{(?:<expr>)*?\\}".replace(/<expr>/g,(function(){return t})),"gi");e.languages["markup-templating"].buildPlaceholders(n,"ftl",i)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"ftl")}))}(Prism);@&j2Ux]// https://www.gap-system.org/Manuals/doc/ref/chap4.html
// https://www.gap-system.org/Manuals/doc/ref/chap27.html

Prism.languages.gap = {
	'shell': {
		pattern: /^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,
		greedy: true,
		inside: {
			'gap': {
				pattern: /^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,
				lookbehind: true,
				inside: null // see below
			},
			'punctuation': /^gap>/
		}
	},

	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	'string': {
		pattern: /(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,
		lookbehind: true,
		greedy: true,
		inside: {
			'continuation': {
				pattern: /([\r\n])>/,
				lookbehind: true,
				alias: 'punctuation'
			}
		}
	},

	'keyword': /\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,
	'boolean': /\b(?:false|true)\b/,

	'function': /\b[a-z_]\w*(?=\s*\()/i,

	'number': {
		pattern: /(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,
		lookbehind: true
	},

	'continuation': {
		pattern: /([\r\n])>/,
		lookbehind: true,
		alias: 'punctuation'
	},
	'operator': /->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,
	'punctuation': /[()[\]{},;.:]/
};

Prism.languages.gap.shell.inside.gap.inside = Prism.languages.gap;
vb@xPrism.languages.gap={shell:{pattern:/^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,greedy:!0,inside:{gap:{pattern:/^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,lookbehind:!0,inside:null},punctuation:/^gap>/}},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,lookbehind:!0,greedy:!0,inside:{continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"}}},keyword:/\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"},operator:/->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,punctuation:/[()[\]{},;.:]/},Prism.languages.gap.shell.inside.gap.inside=Prism.languages.gap;GiƷx'Prism.languages.gcode = {
	'comment': /;.*|\B\(.*?\)\B/,
	'string': {
		pattern: /"(?:""|[^"])*"/,
		greedy: true
	},
	'keyword': /\b[GM]\d+(?:\.\d+)?\b/,
	'property': /\b[A-Z]/,
	'checksum': {
		pattern: /(\*)\d+/,
		lookbehind: true,
		alias: 'number'
	},
	// T0:0:0
	'punctuation': /[:*]/
};
YLSx !Prism.languages.gcode={comment:/;.*|\B\(.*?\)\B/,string:{pattern:/"(?:""|[^"])*"/,greedy:!0},keyword:/\b[GM]\d+(?:\.\d+)?\b/,property:/\b[A-Z]/,checksum:{pattern:/(\*)\d+/,lookbehind:!0,alias:"number"},punctuation:/[:*]/};KJ0Lx?Prism.languages.gdscript = {
	'comment': /#.*/,
	'string': {
		pattern: /@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,
		greedy: true
	},
	'class-name': {
		// class_name Foo, extends Bar, class InnerClass
		// export(int) var baz, export(int, 0) var i
		// as Node
		// const FOO: int = 9, var bar: bool = true
		// func add(reference: Item, amount: int) -> Item:
		pattern: /(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,
		lookbehind: true
	},
	'keyword': /\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,
	'function': /\b[a-z_]\w*(?=[ \t]*\()/i,
	'variable': /\$\w+/,
	'number': [
		/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,
		/\b(?:INF|NAN|PI|TAU)\b/
	],
	'constant': /\b[A-Z][A-Z_\d]*\b/,
	'boolean': /\b(?:false|true)\b/,
	'operator': /->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,
	'punctuation': /[.:,;()[\]{}]/
};
h?D9xjPrism.languages.gdscript={comment:/#.*/,string:{pattern:/@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,greedy:!0},"class-name":{pattern:/(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,lookbehind:!0},keyword:/\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,variable:/\$\w+/,number:[/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,/\b(?:INF|NAN|PI|TAU)\b/],constant:/\b[A-Z][A-Z_\d]*\b/,boolean:/\b(?:false|true)\b/,operator:/->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,punctuation:/[.:,;()[\]{}]/};I4F-x/Prism.languages.gedcom = {
	'line-value': {
		// Preceded by level, optional pointer, and tag
		pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,
		lookbehind: true,
		inside: {
			'pointer': {
				pattern: /^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,
				alias: 'variable'
			}
		}
	},
	'record': {
		// Preceded by level and optional pointer
		pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,
		lookbehind: true,
		alias: 'tag'
	},
	'level': {
		pattern: /(^[\t ]*)\d+/m,
		lookbehind: true,
		alias: 'number'
	},
	'pointer': {
		pattern: /@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,
		alias: 'variable'
	}
};
!_ xPrism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},record:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"tag"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}};6-x/Prism.languages.gettext = {
	'comment': [
		{
			pattern: /# .*/,
			greedy: true,
			alias: 'translator-comment'
		},
		{
			pattern: /#\..*/,
			greedy: true,
			alias: 'extracted-comment'
		},
		{
			pattern: /#:.*/,
			greedy: true,
			alias: 'reference-comment'
		},
		{
			pattern: /#,.*/,
			greedy: true,
			alias: 'flag-comment'
		},
		{
			pattern: /#\|.*/,
			greedy: true,
			alias: 'previously-untranslated-comment'
		},
		{
			pattern: /#.*/,
			greedy: true
		},
	],
	'string': {
		pattern: /(^|[^\\])"(?:[^"\\]|\\.)*"/,
		lookbehind: true,
		greedy: true
	},
	'keyword': /^msg(?:ctxt|id|id_plural|str)\b/m,
	'number': /\b\d+\b/,
	'punctuation': /[\[\]]/
};

Prism.languages.po = Prism.languages.gettext;
UU'!xPrism.languages.gettext={comment:[{pattern:/# .*/,greedy:!0,alias:"translator-comment"},{pattern:/#\..*/,greedy:!0,alias:"extracted-comment"},{pattern:/#:.*/,greedy:!0,alias:"reference-comment"},{pattern:/#,.*/,greedy:!0,alias:"flag-comment"},{pattern:/#\|.*/,greedy:!0,alias:"previously-untranslated-comment"},{pattern:/#.*/,greedy:!0}],string:{pattern:/(^|[^\\])"(?:[^"\\]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/^msg(?:ctxt|id|id_plural|str)\b/m,number:/\b\d+\b/,punctuation:/[\[\]]/},Prism.languages.po=Prism.languages.gettext;bEVx(T(function (Prism) {

	var tableRow = /(?:\r?\n|\r)[ \t]*\|.+\|(?:(?!\|).)*/.source;

	Prism.languages.gherkin = {
		'pystring': {
			pattern: /("""|''')[\s\S]+?\1/,
			alias: 'string'
		},
		'comment': {
			pattern: /(^[ \t]*)#.*/m,
			lookbehind: true
		},
		'tag': {
			pattern: /(^[ \t]*)@\S*/m,
			lookbehind: true
		},
		'feature': {
			pattern: /((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,
			lookbehind: true,
			inside: {
				'important': {
					pattern: /(:)[^\r\n]+/,
					lookbehind: true
				},
				'keyword': /[^:\r\n]+:/
			}
		},
		'scenario': {
			pattern: /(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,
			lookbehind: true,
			inside: {
				'important': {
					pattern: /(:)[^\r\n]*/,
					lookbehind: true
				},
				'keyword': /[^:\r\n]+:/
			}
		},
		'table-body': {
			// Look-behind is used to skip the table head, which has the same format as any table row
			pattern: RegExp('(' + tableRow + ')(?:' + tableRow + ')+'),
			lookbehind: true,
			inside: {
				'outline': {
					pattern: /<[^>]+>/,
					alias: 'variable'
				},
				'td': {
					pattern: /\s*[^\s|][^|]*/,
					alias: 'string'
				},
				'punctuation': /\|/
			}
		},
		'table-head': {
			pattern: RegExp(tableRow),
			inside: {
				'th': {
					pattern: /\s*[^\s|][^|]*/,
					alias: 'variable'
				},
				'punctuation': /\|/
			}
		},
		'atrule': {
			pattern: /(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,
			lookbehind: true
		},
		'string': {
			pattern: /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,
			inside: {
				'outline': {
					pattern: /<[^>]+>/,
					alias: 'variable'
				}
			}
		},
		'outline': {
			pattern: /<[^>]+>/,
			alias: 'variable'
		}
	};

}(Prism));
Hpyx\&!function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";a.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(Prism);XfxkPrism.languages.git = {
	/*
	 * A simple one line comment like in a git status command
	 * For instance:
	 * $ git status
	 * # On branch infinite-scroll
	 * # Your branch and 'origin/sharedBranches/frontendTeam/infinite-scroll' have diverged,
	 * # and have 1 and 2 different commits each, respectively.
	 * nothing to commit (working directory clean)
	 */
	'comment': /^#.*/m,

	/*
	 * Regexp to match the changed lines in a git diff output. Check the example below.
	 */
	'deleted': /^[-–].*/m,
	'inserted': /^\+.*/m,

	/*
	 * a string (double and simple quote)
	 */
	'string': /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,

	/*
	 * a git command. It starts with a random prompt finishing by a $, then "git" then some other parameters
	 * For instance:
	 * $ git add file.txt
	 */
	'command': {
		pattern: /^.*\$ git .*$/m,
		inside: {
			/*
			 * A git command can contain a parameter starting by a single or a double dash followed by a string
			 * For instance:
			 * $ git diff --cached
			 * $ git log -p
			 */
			'parameter': /\s--?\w+/
		}
	},

	/*
	 * Coordinates displayed in a git diff command
	 * For instance:
	 * $ git diff
	 * diff --git file.txt file.txt
	 * index 6214953..1d54a52 100644
	 * --- file.txt
	 * +++ file.txt
	 * @@ -1 +1,2 @@
	 * -Here's my tetx file
	 * +Here's my text file
	 * +And this is the second line
	 */
	'coord': /^@@.*@@$/m,

	/*
	 * Match a "commit [SHA1]" line in a git log output.
	 * For instance:
	 * $ git log
	 * commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09
	 * Author: lgiraudel
	 * Date:   Mon Feb 17 11:18:34 2014 +0100
	 *
	 *     Add of a new line
	 */
	'commit-sha1': /^commit \w{40}$/m
};
Rߺx Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m};M#ExSPrism.languages.glsl = Prism.languages.extend('c', {
	'keyword': /\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/
});
Y4DxIPrism.languages.glsl=Prism.languages.extend("c",{keyword:/\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/});%x Prism.languages.gamemakerlanguage = Prism.languages.gml = Prism.languages.extend('clike', {
	'keyword': /\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,
	'number': /(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,
	'operator': /--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,
	'constant': /\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,
	'variable': /\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/
});
1xPrism.languages.gamemakerlanguage=Prism.languages.gml=Prism.languages.extend("clike",{keyword:/\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,number:/(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,operator:/--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,constant:/\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,variable:/\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/});33[xL// https://gn.googlesource.com/gn/+/refs/heads/main/docs/reference.md#grammar

Prism.languages.gn = {
	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	'string-literal': {
		pattern: /(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,
		lookbehind: true,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,
				lookbehind: true,
				inside: {
					'number': /^\$0x[\s\S]{2}$/,
					'variable': /^\$\w+$/,
					'interpolation-punctuation': {
						pattern: /^\$\{|\}$/,
						alias: 'punctuation'
					},
					'expression': {
						pattern: /[\s\S]+/,
						inside: null // see below
					}
				}
			},
			'string': /[\s\S]+/
		}
	},

	'keyword': /\b(?:else|if)\b/,
	'boolean': /\b(?:false|true)\b/,
	'builtin-function': {
		// a few functions get special highlighting to improve readability
		pattern: /\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,
		alias: 'keyword'
	},
	'function': /\b[a-z_]\w*(?=\s*\()/i,
	'constant': /\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,

	'number': /-?\b\d+\b/,

	'operator': /[-+!=<>]=?|&&|\|\|/,
	'punctuation': /[(){}[\],.]/
};

Prism.languages.gn['string-literal'].inside['interpolation'].inside['expression'].inside = Prism.languages.gn;

Prism.languages.gni = Prism.languages.gn;
.8ԧBx'Prism.languages.gn={comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,lookbehind:!0,inside:{number:/^\$0x[\s\S]{2}$/,variable:/^\$\w+$/,"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:/\b(?:else|if)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,alias:"keyword"},function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,number:/-?\b\d+\b/,operator:/[-+!=<>]=?|&&|\|\|/,punctuation:/[(){}[\],.]/},Prism.languages.gn["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.gn,Prism.languages.gni=Prism.languages.gn;c"x,// https://go.dev/ref/mod#go-mod-file-module

Prism.languages['go-mod'] = Prism.languages['go-module'] = {
	'comment': {
		pattern: /\/\/.*/,
		greedy: true
	},
	'version': {
		pattern: /(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,
		lookbehind: true,
		alias: 'number'
	},
	'go-version': {
		pattern: /((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,
		lookbehind: true,
		alias: 'number'
	},
	'keyword': {
		pattern: /^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,
		lookbehind: true
	},
	'operator': /=>/,
	'punctuation': /[()[\],]/
};
״x[Prism.languages["go-mod"]=Prism.languages["go-module"]={comment:{pattern:/\/\/.*/,greedy:!0},version:{pattern:/(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,lookbehind:!0,alias:"number"},"go-version":{pattern:/((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,lookbehind:!0,alias:"number"},keyword:{pattern:/^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,lookbehind:!0},operator:/=>/,punctuation:/[()[\],]/};8HxxPrism.languages.go = Prism.languages.extend('clike', {
	'string': {
		pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,
		lookbehind: true,
		greedy: true
	},
	'keyword': /\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,
	'boolean': /\b(?:_|false|iota|nil|true)\b/,
	'number': [
		// binary and octal integers
		/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,
		// hexadecimal integers and floats
		/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
		// decimal integers and floats
		/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i
	],
	'operator': /[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,
	'builtin': /\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/
});

Prism.languages.insertBefore('go', 'string', {
	'char': {
		pattern: /'(?:\\.|[^'\\\r\n]){0,10}'/,
		greedy: true
	}
});

delete Prism.languages.go['class-name'];
H<x5Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"];>Tlx:(function (Prism) {
	var interpolation = {
		pattern: /((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,
		lookbehind: true,
		inside: {
			'interpolation-punctuation': {
				pattern: /^\$\{?|\}$/,
				alias: 'punctuation',
			},
			'expression': {
				pattern: /[\s\S]+/,
				inside: null,
			},
		},
	};

	Prism.languages.gradle = Prism.languages.extend('clike', {
		'string': {
			pattern: /'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,
			greedy: true,
		},
		'keyword':
			/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,
		'number': /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,
		'operator': {
			pattern:
				/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
			lookbehind: true,
		},
		'punctuation': /\.+|[{}[\];(),:$]/,
	});

	Prism.languages.insertBefore('gradle', 'string', {
		'shebang': {
			pattern: /#!.+/,
			alias: 'comment',
			greedy: true,
		},
		'interpolation-string': {
			pattern:
				/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,
			greedy: true,
			inside: {
				'interpolation': interpolation,
				'string': /[\s\S]+/,
			},
		},
	});

	Prism.languages.insertBefore('gradle', 'punctuation', {
		'spock-block': /\b(?:and|cleanup|expect|given|setup|then|when|where):/,
	});

	Prism.languages.insertBefore('gradle', 'function', {
		'annotation': {
			pattern: /(^|[^.])@\w+/,
			lookbehind: true,
			alias: 'punctuation',
		},
	});

	interpolation.inside.expression.inside = Prism.languages.gradle;
}(Prism));
ĲVxa!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.gradle=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("gradle","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("gradle","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("gradle","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.gradle}(Prism);ܨxPrism.languages.graphql = {
	'comment': /#.*/,
	'description': {
		pattern: /(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,
		greedy: true,
		alias: 'string',
		inside: {
			'language-markdown': {
				pattern: /(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,
				lookbehind: true,
				inside: Prism.languages.markdown
			}
		}
	},
	'string': {
		pattern: /"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,
		greedy: true
	},
	'number': /(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
	'boolean': /\b(?:false|true)\b/,
	'variable': /\$[a-z_]\w*/i,
	'directive': {
		pattern: /@[a-z_]\w*/i,
		alias: 'function'
	},
	'attr-name': {
		pattern: /\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,
		greedy: true
	},
	'atom-input': {
		pattern: /\b[A-Z]\w*Input\b/,
		alias: 'class-name'
	},
	'scalar': /\b(?:Boolean|Float|ID|Int|String)\b/,
	'constant': /\b[A-Z][A-Z_\d]*\b/,
	'class-name': {
		pattern: /(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,
		lookbehind: true
	},
	'fragment': {
		pattern: /(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,
		lookbehind: true,
		alias: 'function'
	},
	'definition-mutation': {
		pattern: /(\bmutation\s+)[a-zA-Z_]\w*/,
		lookbehind: true,
		alias: 'function'
	},
	'definition-query': {
		pattern: /(\bquery\s+)[a-zA-Z_]\w*/,
		lookbehind: true,
		alias: 'function'
	},
	'keyword': /\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,
	'operator': /[!=|&]|\.{3}/,
	'property-query': /\w+(?=\s*\()/,
	'object': /\w+(?=\s*\{)/,
	'punctuation': /[!(){}\[\]:=,]/,
	'property': /\w+/
};

Prism.hooks.add('after-tokenize', function afterTokenizeGraphql(env) {
	if (env.language !== 'graphql') {
		return;
	}

	/**
	 * get the graphql token stream that we want to customize
	 *
	 * @typedef {InstanceType<import("./prism-core")["Token"]>} Token
	 * @type {Token[]}
	 */
	var validTokens = env.tokens.filter(function (token) {
		return typeof token !== 'string' && token.type !== 'comment' && token.type !== 'scalar';
	});

	var currentIndex = 0;

	/**
	 * Returns whether the token relative to the current index has the given type.
	 *
	 * @param {number} offset
	 * @returns {Token | undefined}
	 */
	function getToken(offset) {
		return validTokens[currentIndex + offset];
	}

	/**
	 * Returns whether the token relative to the current index has the given type.
	 *
	 * @param {readonly string[]} types
	 * @param {number} [offset=0]
	 * @returns {boolean}
	 */
	function isTokenType(types, offset) {
		offset = offset || 0;
		for (var i = 0; i < types.length; i++) {
			var token = getToken(i + offset);
			if (!token || token.type !== types[i]) {
				return false;
			}
		}
		return true;
	}

	/**
	 * Returns the index of the closing bracket to an opening bracket.
	 *
	 * It is assumed that `token[currentIndex - 1]` is an opening bracket.
	 *
	 * If no closing bracket could be found, `-1` will be returned.
	 *
	 * @param {RegExp} open
	 * @param {RegExp} close
	 * @returns {number}
	 */
	function findClosingBracket(open, close) {
		var stackHeight = 1;

		for (var i = currentIndex; i < validTokens.length; i++) {
			var token = validTokens[i];
			var content = token.content;

			if (token.type === 'punctuation' && typeof content === 'string') {
				if (open.test(content)) {
					stackHeight++;
				} else if (close.test(content)) {
					stackHeight--;

					if (stackHeight === 0) {
						return i;
					}
				}
			}
		}

		return -1;
	}

	/**
	 * Adds an alias to the given token.
	 *
	 * @param {Token} token
	 * @param {string} alias
	 * @returns {void}
	 */
	function addAlias(token, alias) {
		var aliases = token.alias;
		if (!aliases) {
			token.alias = aliases = [];
		} else if (!Array.isArray(aliases)) {
			token.alias = aliases = [aliases];
		}
		aliases.push(alias);
	}

	for (; currentIndex < validTokens.length;) {
		var startToken = validTokens[currentIndex++];

		// add special aliases for mutation tokens
		if (startToken.type === 'keyword' && startToken.content === 'mutation') {
			// any array of the names of all input variables (if any)
			var inputVariables = [];

			if (isTokenType(['definition-mutation', 'punctuation']) && getToken(1).content === '(') {
				// definition

				currentIndex += 2; // skip 'definition-mutation' and 'punctuation'

				var definitionEnd = findClosingBracket(/^\($/, /^\)$/);
				if (definitionEnd === -1) {
					continue;
				}

				// find all input variables
				for (; currentIndex < definitionEnd; currentIndex++) {
					var t = getToken(0);
					if (t.type === 'variable') {
						addAlias(t, 'variable-input');
						inputVariables.push(t.content);
					}
				}

				currentIndex = definitionEnd + 1;
			}

			if (isTokenType(['punctuation', 'property-query']) && getToken(0).content === '{') {
				currentIndex++; // skip opening bracket

				addAlias(getToken(0), 'property-mutation');

				if (inputVariables.length > 0) {
					var mutationEnd = findClosingBracket(/^\{$/, /^\}$/);
					if (mutationEnd === -1) {
						continue;
					}

					// give references to input variables a special alias
					for (var i = currentIndex; i < mutationEnd; i++) {
						var varToken = validTokens[i];
						if (varToken.type === 'variable' && inputVariables.indexOf(varToken.content) >= 0) {
							addAlias(varToken, 'variable-input');
						}
					}
				}
			}
		}
	}
});
77]x	&Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},Prism.hooks.add("after-tokenize",(function(n){if("graphql"===n.language)for(var t=n.tokens.filter((function(n){return"string"!=typeof n&&"comment"!==n.type&&"scalar"!==n.type})),e=0;e<t.length;){var a=t[e++];if("keyword"===a.type&&"mutation"===a.content){var r=[];if(c(["definition-mutation","punctuation"])&&"("===l(1).content){e+=2;var i=f(/^\($/,/^\)$/);if(-1===i)continue;for(;e<i;e++){var o=l(0);"variable"===o.type&&(b(o,"variable-input"),r.push(o.content))}e=i+1}if(c(["punctuation","property-query"])&&"{"===l(0).content&&(e++,b(l(0),"property-mutation"),r.length>0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var u=e;u<s;u++){var p=t[u];"variable"===p.type&&r.indexOf(p.content)>=0&&b(p,"variable-input")}}}}function l(n){return t[e+n]}function c(n,t){t=t||0;for(var e=0;e<n.length;e++){var a=l(e+t);if(!a||a.type!==n[e])return!1}return!0}function f(n,a){for(var r=1,i=e;i<t.length;i++){var o=t[i],s=o.content;if("punctuation"===o.type&&"string"==typeof s)if(n.test(s))r++;else if(a.test(s)&&0==--r)return i}return-1}function b(n,t){var e=n.alias;e?Array.isArray(e)||(n.alias=e=[e]):n.alias=e=[],e.push(t)}}));ƹ] xv(function (Prism) {

	var interpolation = {
		pattern: /((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,
		lookbehind: true,
		inside: {
			'interpolation-punctuation': {
				pattern: /^\$\{?|\}$/,
				alias: 'punctuation'
			},
			'expression': {
				pattern: /[\s\S]+/,
				inside: null // see below
			}
		}
	};

	Prism.languages.groovy = Prism.languages.extend('clike', {
		'string': {
			// https://groovy-lang.org/syntax.html#_dollar_slashy_string
			pattern: /'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,
			greedy: true
		},
		'keyword': /\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,
		'number': /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,
		'operator': {
			pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
			lookbehind: true
		},
		'punctuation': /\.+|[{}[\];(),:$]/
	});

	Prism.languages.insertBefore('groovy', 'string', {
		'shebang': {
			pattern: /#!.+/,
			alias: 'comment',
			greedy: true
		},
		'interpolation-string': {
			// TODO: Slash strings (e.g. /foo/) can contain line breaks but this will cause a lot of trouble with
			// simple division (see JS regex), so find a fix maybe?
			pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,
			greedy: true,
			inside: {
				'interpolation': interpolation,
				'string': /[\s\S]+/
			}
		}
	});

	Prism.languages.insertBefore('groovy', 'punctuation', {
		'spock-block': /\b(?:and|cleanup|expect|given|setup|then|when|where):/
	});

	Prism.languages.insertBefore('groovy', 'function', {
		'annotation': {
			pattern: /(^|[^.])@\w+/,
			lookbehind: true,
			alias: 'punctuation'
		}
	});

	interpolation.inside.expression.inside = Prism.languages.groovy;

}(Prism));
ǁdxK!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.groovy}(Prism);.B÷x7/* TODO
	Handle multiline code after tag
	    %foo= some |
			multiline |
			code |
*/

(function (Prism) {

	Prism.languages.haml = {
		// Multiline stuff should appear before the rest

		'multiline-comment': {
			pattern: /((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,
			lookbehind: true,
			alias: 'comment'
		},

		'multiline-code': [
			{
				pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,
				lookbehind: true,
				inside: Prism.languages.ruby
			},
			{
				pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,
				lookbehind: true,
				inside: Prism.languages.ruby
			}
		],

		// See at the end of the file for known filters
		'filter': {
			pattern: /((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,
			lookbehind: true,
			inside: {
				'filter-name': {
					pattern: /^:[\w-]+/,
					alias: 'symbol'
				}
			}
		},

		'markup': {
			pattern: /((?:^|\r?\n|\r)[\t ]*)<.+/,
			lookbehind: true,
			inside: Prism.languages.markup
		},
		'doctype': {
			pattern: /((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,
			lookbehind: true
		},
		'tag': {
			// Allows for one nested group of braces
			pattern: /((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,
			lookbehind: true,
			inside: {
				'attributes': [
					{
						// Lookbehind tries to prevent interpolations from breaking it all
						// Allows for one nested group of braces
						pattern: /(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,
						lookbehind: true,
						inside: Prism.languages.ruby
					},
					{
						pattern: /\([^)]+\)/,
						inside: {
							'attr-value': {
								pattern: /(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,
								lookbehind: true
							},
							'attr-name': /[\w:-]+(?=\s*!?=|\s*[,)])/,
							'punctuation': /[=(),]/
						}
					},
					{
						pattern: /\[[^\]]+\]/,
						inside: Prism.languages.ruby
					}
				],
				'punctuation': /[<>]/
			}
		},
		'code': {
			pattern: /((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,
			lookbehind: true,
			inside: Prism.languages.ruby
		},
		// Interpolations in plain text
		'interpolation': {
			pattern: /#\{[^}]+\}/,
			inside: {
				'delimiter': {
					pattern: /^#\{|\}$/,
					alias: 'punctuation'
				},
				'ruby': {
					pattern: /[\s\S]+/,
					inside: Prism.languages.ruby
				}
			}
		},
		'punctuation': {
			pattern: /((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,
			lookbehind: true
		}
	};

	var filter_pattern = '((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+';

	// Non exhaustive list of available filters and associated languages
	var filters = [
		'css',
		{ filter: 'coffee', language: 'coffeescript' },
		'erb',
		'javascript',
		'less',
		'markdown',
		'ruby',
		'scss',
		'textile'
	];
	var all_filters = {};
	for (var i = 0, l = filters.length; i < l; i++) {
		var filter = filters[i];
		filter = typeof filter === 'string' ? { filter: filter, language: filter } : filter;
		if (Prism.languages[filter.language]) {
			all_filters['filter-' + filter.filter] = {
				pattern: RegExp(filter_pattern.replace('{{filter_name}}', function () { return filter.filter; })),
				lookbehind: true,
				inside: {
					'filter-name': {
						pattern: /^:[\w-]+/,
						alias: 'symbol'
					},
					'text': {
						pattern: /[\s\S]+/,
						alias: [filter.language, 'language-' + filter.language],
						inside: Prism.languages[filter.language]
					}
				}
			};
		}
	}

	Prism.languages.insertBefore('haml', 'filter', all_filters);

}(Prism));
1fxJ!function(n){n.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:n.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:n.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:n.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:n.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:n.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:n.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var e=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=e.length;r<a;r++){var i=e[r];i="string"==typeof i?{filter:i,language:i}:i,n.languages[i.language]&&(t["filter-"+i.filter]={pattern:RegExp("((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+".replace("{{filter_name}}",(function(){return i.filter}))),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"},text:{pattern:/[\s\S]+/,alias:[i.language,"language-"+i.language],inside:n.languages[i.language]}}})}n.languages.insertBefore("haml","filter",t)}(Prism);PHx}(function (Prism) {

	Prism.languages.handlebars = {
		'comment': /\{\{![\s\S]*?\}\}/,
		'delimiter': {
			pattern: /^\{\{\{?|\}\}\}?$/,
			alias: 'punctuation'
		},
		'string': /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
		'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,
		'boolean': /\b(?:false|true)\b/,
		'block': {
			pattern: /^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,
			lookbehind: true,
			alias: 'keyword'
		},
		'brackets': {
			pattern: /\[[^\]]+\]/,
			inside: {
				punctuation: /\[|\]/,
				variable: /[\s\S]+/
			}
		},
		'punctuation': /[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,
		'variable': /[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/
	};

	Prism.hooks.add('before-tokenize', function (env) {
		var handlebarsPattern = /\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g;
		Prism.languages['markup-templating'].buildPlaceholders(env, 'handlebars', handlebarsPattern);
	});

	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'handlebars');
	});

	Prism.languages.hbs = Prism.languages.handlebars;
	Prism.languages.mustache = Prism.languages.handlebars;

}(Prism));
_2hٳ8x|!function(a){a.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"handlebars")})),a.languages.hbs=a.languages.handlebars,a.languages.mustache=a.languages.handlebars}(Prism);7Bx<Prism.languages.haskell = {
	'comment': {
		pattern: /(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,
		lookbehind: true
	},
	'char': {
		pattern: /'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,
		alias: 'string'
	},
	'string': {
		pattern: /"(?:[^\\"]|\\(?:\S|\s+\\))*"/,
		greedy: true
	},
	'keyword': /\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,
	'import-statement': {
		// The imported or hidden names are not included in this import
		// statement. This is because we want to highlight those exactly like
		// we do for the names in the program.
		pattern: /(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,
		lookbehind: true,
		inside: {
			'keyword': /\b(?:as|hiding|import|qualified)\b/,
			'punctuation': /\./
		}
	},
	// These are builtin variables only. Constructors are highlighted later as a constant.
	'builtin': /\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,
	// decimal integers and floating point numbers | octal integers | hexadecimal integers
	'number': /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,
	'operator': [
		{
			// infix operator
			pattern: /`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,
			greedy: true
		},
		{
			// function composition
			pattern: /(\s)\.(?=\s)/,
			lookbehind: true
		},
		// Most of this is needed because of the meaning of a single '.'.
		// If it stands alone freely, it is the function composition.
		// It may also be a separator between a module name and an identifier => no
		// operator. If it comes together with other special characters it is an
		// operator too.
		//
		// This regex means: /[-!#$%*+=?&@|~.:<>^\\\/]+/ without /\./.
		/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/,
	],
	// In Haskell, nearly everything is a variable, do not highlight these.
	'hvariable': {
		pattern: /\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,
		inside: {
			'punctuation': /\./
		}
	},
	'constant': {
		pattern: /\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,
		inside: {
			'punctuation': /\./
		}
	},
	'punctuation': /[{}[\];(),.:]/
};

Prism.languages.hs = Prism.languages.haskell;
ax`Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell;o|xPrism.languages.haxe = Prism.languages.extend('clike', {
	'string': {
		// Strings can be multi-line
		pattern: /"(?:[^"\\]|\\[\s\S])*"/,
		greedy: true
	},
	'class-name': [
		{
			pattern: /(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,
			lookbehind: true,
		},
		// based on naming convention
		/\b[A-Z]\w*/
	],
	// The final look-ahead prevents highlighting of keywords if expressions such as "haxe.macro.Expr"
	'keyword': /\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,
	'function': {
		pattern: /\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,
		greedy: true
	},
	'operator': /\.{3}|\+\+|--|&&|\|\||->|=>|(?:<<?|>{1,3}|[-+*/%!=&|^])=?|[?:~]/
});

Prism.languages.insertBefore('haxe', 'string', {
	'string-interpolation': {
		pattern: /'(?:[^'\\]|\\[\s\S])*'/,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /(^|[^\\])\$(?:\w+|\{[^{}]+\})/,
				lookbehind: true,
				inside: {
					'interpolation-punctuation': {
						pattern: /^\$\{?|\}$/,
						alias: 'punctuation'
					},
					'expression': {
						pattern: /[\s\S]+/,
						inside: Prism.languages.haxe
					},
				}
			},
			'string': /[\s\S]+/
		}
	}
});

Prism.languages.insertBefore('haxe', 'class-name', {
	'regex': {
		pattern: /~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,
		greedy: true,
		inside: {
			'regex-flags': /\b[a-z]+$/,
			'regex-source': {
				pattern: /^(~\/)[\s\S]+(?=\/$)/,
				lookbehind: true,
				alias: 'language-regex',
				inside: Prism.languages.regex
			},
			'regex-delimiter': /^~\/|\/$/,
		}
	}
});

Prism.languages.insertBefore('haxe', 'keyword', {
	'preprocessor': {
		pattern: /#(?:else|elseif|end|if)\b.*/,
		alias: 'property'
	},
	'metadata': {
		pattern: /@:?[\w.]+/,
		alias: 'symbol'
	},
	'reification': {
		pattern: /\$(?:\w+|(?=\{))/,
		alias: 'important'
	}
});
ʣƻbx+Prism.languages.haxe=Prism.languages.extend("clike",{string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},"class-name":[{pattern:/(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,function:{pattern:/\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,greedy:!0},operator:/\.{3}|\+\+|--|&&|\|\||->|=>|(?:<<?|>{1,3}|[-+*/%!=&|^])=?|[?:~]/}),Prism.languages.insertBefore("haxe","string",{"string-interpolation":{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{interpolation:{pattern:/(^|[^\\])\$(?:\w+|\{[^{}]+\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:Prism.languages.haxe}}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("haxe","class-name",{regex:{pattern:/~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,greedy:!0,inside:{"regex-flags":/\b[a-z]+$/,"regex-source":{pattern:/^(~\/)[\s\S]+(?=\/$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^~\/|\/$/}}}),Prism.languages.insertBefore("haxe","keyword",{preprocessor:{pattern:/#(?:else|elseif|end|if)\b.*/,alias:"property"},metadata:{pattern:/@:?[\w.]+/,alias:"symbol"},reification:{pattern:/\$(?:\w+|(?=\{))/,alias:"important"}});ZCJmx,Prism.languages.hcl = {
	'comment': /(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,
	'heredoc': {
		pattern: /<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,
		greedy: true,
		alias: 'string'
	},
	'keyword': [
		{
			pattern: /(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,
			inside: {
				'type': {
					pattern: /(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,
					lookbehind: true,
					alias: 'variable'
				}
			}
		},
		{
			pattern: /(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,
			inside: {
				'type': {
					pattern: /(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,
					lookbehind: true,
					alias: 'variable'
				}
			}
		},
		/[\w-]+(?=\s+\{)/
	],
	'property': [
		/[-\w\.]+(?=\s*=(?!=))/,
		/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/,
	],
	'string': {
		pattern: /"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,
				lookbehind: true,
				inside: {
					'type': {
						pattern: /(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,
						lookbehind: true,
						alias: 'variable'
					},
					'keyword': /\b(?:count|data|local|module|path|self|terraform|var)\b/i,
					'function': /\w+(?=\()/,
					'string': {
						pattern: /"(?:\\[\s\S]|[^\\"])*"/,
						greedy: true,
					},
					'number': /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
					'punctuation': /[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/,
				}
			},
		}
	},
	'number': /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
	'boolean': /\b(?:false|true)\b/i,
	'punctuation': /[=\[\]{}]/,
};
8WxpPrism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/};k#xGPrism.languages.hlsl = Prism.languages.extend('c', {

	// Regarding keywords and class names:
	// The list of all keywords was split into 'keyword' and 'class-name' tokens based on whether they are capitalized.
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-reserved-words
	'class-name': [
		Prism.languages.c['class-name'],
		/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/
	],
	'keyword': [
		// HLSL keyword
		/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,
		// scalar, vector, and matrix types
		/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/
	],
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-grammar#floating-point-numbers
	'number': /(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,
	'boolean': /\b(?:false|true)\b/
});
GtTgxvPrism.languages.hlsl=Prism.languages.extend("c",{"class-name":[Prism.languages.c["class-name"],/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/],keyword:[/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/],number:/(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,boolean:/\b(?:false|true)\b/});>!xPrism.languages.hoon = {
	'comment': {
		pattern: /::.*/,
		greedy: true
	},
	'string': {
		pattern: /"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/,
		greedy: true
	},
	'constant': /%(?:\.[ny]|[\w-]+)/,
	'class-name': /@(?:[a-z0-9-]*[a-z0-9])?|\*/i,
	'function': /(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,
	'keyword': /\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/
};
LӷxPrism.languages.hoon={comment:{pattern:/::.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/,greedy:!0},constant:/%(?:\.[ny]|[\w-]+)/,"class-name":/@(?:[a-z0-9-]*[a-z0-9])?|\*/i,function:/(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,keyword:/\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/};@ɵx5/**
 * Original by Scott Helme.
 *
 * Reference: https://scotthelme.co.uk/hpkp-cheat-sheet/
 */

Prism.languages.hpkp = {
	'directive': {
		pattern: /\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,
		alias: 'property'
	},
	'operator': /=/,
	'punctuation': /;/
};
1eSx HPrism.languages.hpkp={directive:{pattern:/\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/};%Dxx/**
 * Original by Scott Helme.
 *
 * Reference: https://scotthelme.co.uk/hsts-cheat-sheet/
 */

Prism.languages.hsts = {
	'directive': {
		pattern: /\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,
		alias: 'property'
	},
	'operator': /=/,
	'punctuation': /;/
};
Uְ	x oPrism.languages.hsts={directive:{pattern:/\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/};`4x(function (Prism) {

	/**
	 * @param {string} name
	 * @returns {RegExp}
	 */
	function headerValueOf(name) {
		return RegExp('(^(?:' + name + '):[ \t]*(?![ \t]))[^]+', 'i');
	}

	Prism.languages.http = {
		'request-line': {
			pattern: /^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,
			inside: {
				// HTTP Method
				'method': {
					pattern: /^[A-Z]+\b/,
					alias: 'property'
				},
				// Request Target e.g. http://example.com, /path/to/file
				'request-target': {
					pattern: /^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,
					lookbehind: true,
					alias: 'url',
					inside: Prism.languages.uri
				},
				// HTTP Version
				'http-version': {
					pattern: /^(\s)HTTP\/[\d.]+/,
					lookbehind: true,
					alias: 'property'
				},
			}
		},
		'response-status': {
			pattern: /^HTTP\/[\d.]+ \d+ .+/m,
			inside: {
				// HTTP Version
				'http-version': {
					pattern: /^HTTP\/[\d.]+/,
					alias: 'property'
				},
				// Status Code
				'status-code': {
					pattern: /^(\s)\d+(?=\s)/,
					lookbehind: true,
					alias: 'number'
				},
				// Reason Phrase
				'reason-phrase': {
					pattern: /^(\s).+/,
					lookbehind: true,
					alias: 'string'
				}
			}
		},
		'header': {
			pattern: /^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,
			inside: {
				'header-value': [
					{
						pattern: headerValueOf(/Content-Security-Policy/.source),
						lookbehind: true,
						alias: ['csp', 'languages-csp'],
						inside: Prism.languages.csp
					},
					{
						pattern: headerValueOf(/Public-Key-Pins(?:-Report-Only)?/.source),
						lookbehind: true,
						alias: ['hpkp', 'languages-hpkp'],
						inside: Prism.languages.hpkp
					},
					{
						pattern: headerValueOf(/Strict-Transport-Security/.source),
						lookbehind: true,
						alias: ['hsts', 'languages-hsts'],
						inside: Prism.languages.hsts
					},
					{
						pattern: headerValueOf(/[^:]+/.source),
						lookbehind: true
					}
				],
				'header-name': {
					pattern: /^[^:]+/,
					alias: 'keyword'
				},
				'punctuation': /^:/
			}
		}
	};

	// Create a mapping of Content-Type headers to language definitions
	var langs = Prism.languages;
	var httpLanguages = {
		'application/javascript': langs.javascript,
		'application/json': langs.json || langs.javascript,
		'application/xml': langs.xml,
		'text/xml': langs.xml,
		'text/html': langs.html,
		'text/css': langs.css,
		'text/plain': langs.plain
	};

	// Declare which types can also be suffixes
	var suffixTypes = {
		'application/json': true,
		'application/xml': true
	};

	/**
	 * Returns a pattern for the given content type which matches it and any type which has it as a suffix.
	 *
	 * @param {string} contentType
	 * @returns {string}
	 */
	function getSuffixPattern(contentType) {
		var suffix = contentType.replace(/^[a-z]+\//, '');
		var suffixPattern = '\\w+/(?:[\\w.-]+\\+)+' + suffix + '(?![+\\w.-])';
		return '(?:' + contentType + '|' + suffixPattern + ')';
	}

	// Insert each content type parser that has its associated language
	// currently loaded.
	var options;
	for (var contentType in httpLanguages) {
		if (httpLanguages[contentType]) {
			options = options || {};

			var pattern = suffixTypes[contentType] ? getSuffixPattern(contentType) : contentType;
			options[contentType.replace(/\//g, '-')] = {
				pattern: RegExp(
					'(' + /content-type:\s*/.source + pattern + /(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source + ')' +
					// This is a little interesting:
					// The HTTP format spec required 1 empty line before the body to make everything unambiguous.
					// However, when writing code by hand (e.g. to display on a website) people can forget about this,
					// so we want to be liberal here. We will allow the empty line to be omitted if the first line of
					// the body does not start with a [\w-] character (as headers do).
					/[^ \t\w-][\s\S]*/.source,
					'i'
				),
				lookbehind: true,
				inside: httpLanguages[contentType]
			};
		}
	}
	if (options) {
		Prism.languages.insertBefore('http', 'header', options);
	}

}(Prism));
 őtxF!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n=t.languages,s={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css,"text/plain":n.plain},i={"application/json":!0,"application/xml":!0};function r(t){var a=t.replace(/^[a-z]+\//,"");return"(?:"+t+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"}for(var p in s)if(s[p]){e=e||{};var l=i[p]?r(p):p;e[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+l+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:s[p]}}e&&t.languages.insertBefore("http","header",e)}(Prism);}\8x|// according to the offical reference (EN)
// https://ichigojam.net/IchigoJam-en.html
Prism.languages.ichigojam = {
	'comment': /(?:\B'|REM)(?:[^\n\r]*)/i,
	'string': {
		pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,
		greedy: true
	},
	'number': /\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
	'keyword': /\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,
	'function': /\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,
	'label': /(?:\B@\S+)/,
	'operator': /<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,
	'punctuation': /[\[,;:()\]]/
};
1/x
Prism.languages.ichigojam={comment:/(?:\B'|REM)(?:[^\n\r]*)/i,string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,greedy:!0},number:/\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,function:/\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,label:/(?:\B@\S+)/,operator:/<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,punctuation:/[\[,;:()\]]/};x\?xPrism.languages.icon = {
	'comment': /#.*/,
	'string': {
		pattern: /(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,
		greedy: true
	},
	'number': /\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,
	'builtin-keyword': {
		pattern: /&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,
		alias: 'variable'
	},
	'directive': {
		pattern: /\$\w+/,
		alias: 'builtin'
	},
	'keyword': /\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,
	'function': /\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,
	'operator': /[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|<?=?)|>>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,
	'punctuation': /[\[\](){},;]/
};
_:x]Prism.languages.icon={comment:/#.*/,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,greedy:!0},number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,function:/\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|<?=?)|>>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/};W߱xn// https://unicode-org.github.io/icu/userguide/format_parse/messages/
// https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/MessageFormat.html

(function (Prism) {

	/**
	 * @param {string} source
	 * @param {number} level
	 * @returns {string}
	 */
	function nested(source, level) {
		if (level <= 0) {
			return /[]/.source;
		} else {
			return source.replace(/<SELF>/g, function () { return nested(source, level - 1); });
		}
	}

	var stringPattern = /'[{}:=,](?:[^']|'')*'(?!')/;

	var escape = {
		pattern: /''/,
		greedy: true,
		alias: 'operator'
	};
	var string = {
		pattern: stringPattern,
		greedy: true,
		inside: {
			'escape': escape
		}
	};

	var argumentSource = nested(
		/\{(?:[^{}']|'(?![{},'])|''|<STR>|<SELF>)*\}/.source
			.replace(/<STR>/g, function () { return stringPattern.source; }),
		8
	);

	var nestedMessage = {
		pattern: RegExp(argumentSource),
		inside: {
			'message': {
				pattern: /^(\{)[\s\S]+(?=\}$)/,
				lookbehind: true,
				inside: null // see below
			},
			'message-delimiter': {
				pattern: /./,
				alias: 'punctuation'
			}
		}
	};

	Prism.languages['icu-message-format'] = {
		'argument': {
			pattern: RegExp(argumentSource),
			greedy: true,
			inside: {
				'content': {
					pattern: /^(\{)[\s\S]+(?=\}$)/,
					lookbehind: true,
					inside: {
						'argument-name': {
							pattern: /^(\s*)[^{}:=,\s]+/,
							lookbehind: true
						},
						'choice-style': {
							// https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1ChoiceFormat.html#details
							pattern: /^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,
							lookbehind: true,
							inside: {
								'punctuation': /\|/,
								'range': {
									pattern: /^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,
									lookbehind: true,
									inside: {
										'operator': /[<#\u2264]/,
										'number': /\S+/
									}
								},
								rest: null // see below
							}
						},
						'plural-style': {
							// https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/PluralFormat.html#:~:text=Patterns%20and%20Their%20Interpretation
							pattern: /^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,
							lookbehind: true,
							inside: {
								'offset': /^offset:\s*\d+/,
								'nested-message': nestedMessage,
								'selector': {
									pattern: /=\d+|[^{}:=,\s]+/,
									inside: {
										'keyword': /^(?:few|many|one|other|two|zero)$/
									}
								}
							}
						},
						'select-style': {
							// https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/SelectFormat.html#:~:text=Patterns%20and%20Their%20Interpretation
							pattern: /^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,
							lookbehind: true,
							inside: {
								'nested-message': nestedMessage,
								'selector': {
									pattern: /[^{}:=,\s]+/,
									inside: {
										'keyword': /^other$/
									}
								}
							}
						},
						'keyword': /\b(?:choice|plural|select|selectordinal)\b/,
						'arg-type': {
							pattern: /\b(?:date|duration|number|ordinal|spellout|time)\b/,
							alias: 'keyword'
						},
						'arg-skeleton': {
							pattern: /(,\s*)::[^{}:=,\s]+/,
							lookbehind: true
						},
						'arg-style': {
							pattern: /(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,
							lookbehind: true
						},
						'arg-style-text': {
							pattern: RegExp(/(^\s*,\s*(?=\S))/.source + nested(/(?:[^{}']|'[^']*'|\{(?:<SELF>)?\})+/.source, 8) + '$'),
							lookbehind: true,
							alias: 'string'
						},
						'punctuation': /,/
					}
				},
				'argument-delimiter': {
					pattern: /./,
					alias: 'operator'
				}
			}
		},
		'escape': escape,
		'string': string
	};

	nestedMessage.inside.message.inside = Prism.languages['icu-message-format'];
	Prism.languages['icu-message-format'].argument.inside.content.inside['choice-style'].inside.rest = Prism.languages['icu-message-format'];

}(Prism));
?rx!function(e){function t(e,s){return s<=0?"[]":e.replace(/<SELF>/g,(function(){return t(e,s-1)}))}var s=/'[{}:=,](?:[^']|'')*'(?!')/,n={pattern:/''/,greedy:!0,alias:"operator"},r={pattern:s,greedy:!0,inside:{escape:n}},a=t("\\{(?:[^{}']|'(?![{},'])|''|<STR>|<SELF>)*\\}".replace(/<STR>/g,(function(){return s.source})),8),i={pattern:RegExp(a),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};e.languages["icu-message-format"]={argument:{pattern:RegExp(a),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":i,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":i,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp("(^\\s*,\\s*(?=\\S))"+t("(?:[^{}']|'[^']*'|\\{(?:<SELF>)?\\})+",8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:n,string:r},i.inside.message.inside=e.languages["icu-message-format"],e.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=e.languages["icu-message-format"]}(Prism);-x*Prism.languages.idris = Prism.languages.extend('haskell', {
	'comment': {
		pattern: /(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m,
	},
	'keyword': /\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,
	'builtin': undefined
});

Prism.languages.insertBefore('idris', 'keyword', {
	'import-statement': {
		pattern: /(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,
		lookbehind: true,
		inside: {
			'punctuation': /\./
		}
	}
});

Prism.languages.idr = Prism.languages.idris;

)xnPrism.languages.idris=Prism.languages.extend("haskell",{comment:{pattern:/(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m},keyword:/\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,builtin:void 0}),Prism.languages.insertBefore("idris","keyword",{"import-statement":{pattern:/(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,lookbehind:!0,inside:{punctuation:/\./}}}),Prism.languages.idr=Prism.languages.idris;SL[xLPrism.languages.iecst = {
	'comment': [
		{
			pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,
			lookbehind: true,
			greedy: true,
		},
		{
			pattern: /(^|[^\\:])\/\/.*/,
			lookbehind: true,
			greedy: true,
		},
	],
	'string': {
		pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
		greedy: true,
	},
	'keyword': [
		/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,
		/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/
	],
	'class-name': /\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,
	'address': {
		pattern: /%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,
		alias: 'symbol'
	},
	'number': /\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
	'boolean': /\b(?:FALSE|NULL|TRUE)\b/,
	'operator': /S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,
	'function': /\b[a-z_]\w*(?=\s*\()/i,
	'punctuation': /[()[\].,;]/,
};
"{Rx(Prism.languages.iecst={comment:[{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:[/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/],"class-name":/\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,address:{pattern:/%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,alias:"symbol"},number:/\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/,operator:/S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,punctuation:/[()[\].,;]/};ε x(function (Prism) {
	Prism.languages.ignore = {
		// https://git-scm.com/docs/gitignore
		'comment': /^#.*/m,
		'entry': {
			pattern: /\S(?:.*(?:(?:\\ )|\S))?/,
			alias: 'string',
			inside: {
				'operator': /^!|\*\*?|\?/,
				'regex': {
					pattern: /(^|[^\\])\[[^\[\]]*\]/,
					lookbehind: true
				},
				'punctuation': /\//
			}
		}
	};

	Prism.languages.gitignore = Prism.languages.ignore;
	Prism.languages.hgignore = Prism.languages.ignore;
	Prism.languages.npmignore = Prism.languages.ignore;

}(Prism));
/۴xT!function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore}(Prism);PxyxvPrism.languages.inform7 = {
	'string': {
		pattern: /"[^"]*"/,
		inside: {
			'substitution': {
				pattern: /\[[^\[\]]+\]/,
				inside: {
					'delimiter': {
						pattern: /\[|\]/,
						alias: 'punctuation'
					}
					// See rest below
				}
			}
		}
	},
	'comment': {
		pattern: /\[[^\[\]]+\]/,
		greedy: true
	},
	'title': {
		pattern: /^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,
		alias: 'important'
	},
	'number': {
		pattern: /(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,
		lookbehind: true
	},
	'verb': {
		pattern: /(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,
		lookbehind: true,
		alias: 'operator'
	},
	'keyword': {
		pattern: /(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,
		lookbehind: true
	},
	'property': {
		pattern: /(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,
		lookbehind: true,
		alias: 'symbol'
	},
	'position': {
		pattern: /(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,
		lookbehind: true,
		alias: 'keyword'
	},
	'type': {
		pattern: /(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,
		lookbehind: true,
		alias: 'variable'
	},
	'punctuation': /[.,:;(){}]/
};

Prism.languages.inform7['string'].inside['substitution'].inside.rest = Prism.languages.inform7;
// We don't want the remaining text in the substitution to be highlighted as the string.
Prism.languages.inform7['string'].inside['substitution'].inside.rest.text = {
	pattern: /\S(?:\s*\S)*/,
	alias: 'comment'
};
HWxPrism.languages.inform7={string:{pattern:/"[^"]*"/,inside:{substitution:{pattern:/\[[^\[\]]+\]/,inside:{delimiter:{pattern:/\[|\]/,alias:"punctuation"}}}}},comment:{pattern:/\[[^\[\]]+\]/,greedy:!0},title:{pattern:/^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,alias:"important"},number:{pattern:/(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,lookbehind:!0,alias:"symbol"},position:{pattern:/(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,lookbehind:!0,alias:"variable"},punctuation:/[.,:;(){}]/},Prism.languages.inform7.string.inside.substitution.inside.rest=Prism.languages.inform7,Prism.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\S(?:\s*\S)*/,alias:"comment"};(K۱:x^Prism.languages.ini = {

	/**
	 * The component mimics the behavior of the Win32 API parser.
	 *
	 * @see {@link https://github.com/PrismJS/prism/issues/2775#issuecomment-787477723}
	 */

	'comment': {
		pattern: /(^[ \f\t\v]*)[#;][^\n\r]*/m,
		lookbehind: true
	},
	'section': {
		pattern: /(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,
		lookbehind: true,
		inside: {
			'section-name': {
				pattern: /(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,
				lookbehind: true,
				alias: 'selector'
			},
			'punctuation': /\[|\]/
		}
	},
	'key': {
		pattern: /(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,
		lookbehind: true,
		alias: 'attr-name'
	},
	'value': {
		pattern: /(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,
		lookbehind: true,
		alias: 'attr-value',
		inside: {
			'inner-value': {
				pattern: /^("|').+(?=\1$)/,
				lookbehind: true
			}
		}
	},
	'punctuation': /=/
};
X%x_Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/};SopxPrism.languages.io = {
	'comment': {
		pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,
		lookbehind: true,
		greedy: true
	},
	'triple-quoted-string': {
		pattern: /"""(?:\\[\s\S]|(?!""")[^\\])*"""/,
		greedy: true,
		alias: 'string'
	},
	'string': {
		pattern: /"(?:\\.|[^\\\r\n"])*"/,
		greedy: true
	},
	'keyword': /\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,
	'builtin': /\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,
	'boolean': /\b(?:false|nil|true)\b/,
	'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,
	'operator': /[=!*/%+\-^&|]=|>>?=?|<<?=?|:?:?=|\+\+?|--?|\*\*?|\/\/?|%|\|\|?|&&?|\b(?:and|not|or|return)\b|@@?|\?\??|\.\./,
	'punctuation': /[{}[\];(),.:]/
};
kxMPrism.languages.io={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,lookbehind:!0,greedy:!0},"triple-quoted-string":{pattern:/"""(?:\\[\s\S]|(?!""")[^\\])*"""/,greedy:!0,alias:"string"},string:{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},keyword:/\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,builtin:/\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,boolean:/\b(?:false|nil|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,operator:/[=!*/%+\-^&|]=|>>?=?|<<?=?|:?:?=|\+\+?|--?|\*\*?|\/\/?|%|\|\|?|&&?|\b(?:and|not|or|return)\b|@@?|\?\??|\.\./,punctuation:/[{}[\];(),.:]/};9ȏu>xPrism.languages.j = {
	'comment': {
		pattern: /\bNB\..*/,
		greedy: true
	},
	'string': {
		pattern: /'(?:''|[^'\r\n])*'/,
		greedy: true
	},
	'keyword': /\b(?:(?:CR|LF|adverb|conjunction|def|define|dyad|monad|noun|verb)\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\w+|goto_\w+|if|label_\w+|return|select|throw|try|while|whilst)\.)/,
	'verb': {
		// Negative look-ahead prevents bad highlighting
		// of ^: ;. =. =: !. !:
		pattern: /(?!\^:|;\.|[=!][.:])(?:\{(?:\.|::?)?|p(?:\.\.?|:)|[=!\]]|[<>+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,
		alias: 'keyword'
	},
	'number': /\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,
	'adverb': {
		pattern: /[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,
		alias: 'builtin'
	},
	'operator': /[=a][.:]|_\./,
	'conjunction': {
		pattern: /&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,
		alias: 'variable'
	},
	'punctuation': /[()]/
};
%;%3x2Prism.languages.j={comment:{pattern:/\bNB\..*/,greedy:!0},string:{pattern:/'(?:''|[^'\r\n])*'/,greedy:!0},keyword:/\b(?:(?:CR|LF|adverb|conjunction|def|define|dyad|monad|noun|verb)\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\w+|goto_\w+|if|label_\w+|return|select|throw|try|while|whilst)\.)/,verb:{pattern:/(?!\^:|;\.|[=!][.:])(?:\{(?:\.|::?)?|p(?:\.\.?|:)|[=!\]]|[<>+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,alias:"keyword"},number:/\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,adverb:{pattern:/[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,alias:"builtin"},operator:/[=a][.:]|_\./,conjunction:{pattern:/&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,alias:"variable"},punctuation:/[()]/};#x"(function (Prism) {

	var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/;

	// full package (optional) + parent classes (optional)
	var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source;

	// based on the java naming conventions
	var className = {
		pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
		lookbehind: true,
		inside: {
			'namespace': {
				pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
				inside: {
					'punctuation': /\./
				}
			},
			'punctuation': /\./
		}
	};

	Prism.languages.java = Prism.languages.extend('clike', {
		'string': {
			pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,
			lookbehind: true,
			greedy: true
		},
		'class-name': [
			className,
			{
				// variables, parameters, and constructor references
				// this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)
				pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),
				lookbehind: true,
				inside: className.inside
			},
			{
				// class names based on keyword
				// this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)
				pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source),
				lookbehind: true,
				inside: className.inside
			}
		],
		'keyword': keywords,
		'function': [
			Prism.languages.clike.function,
			{
				pattern: /(::\s*)[a-z_]\w*/,
				lookbehind: true
			}
		],
		'number': /\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,
		'operator': {
			pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,
			lookbehind: true
		},
		'constant': /\b[A-Z][A-Z_\d]+\b/
	});

	Prism.languages.insertBefore('java', 'string', {
		'triple-quoted-string': {
			// http://openjdk.java.net/jeps/355#Description
			pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,
			greedy: true,
			alias: 'string'
		},
		'char': {
			pattern: /'(?:\\.|[^'\\\r\n]){1,6}'/,
			greedy: true
		}
	});

	Prism.languages.insertBefore('java', 'class-name', {
		'annotation': {
			pattern: /(^|[^.])@\w+(?:\s*\.\s*\w+)*/,
			lookbehind: true,
			alias: 'punctuation'
		},
		'generics': {
			pattern: /<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,
			inside: {
				'class-name': className,
				'keyword': keywords,
				'punctuation': /[<>(),.:]/,
				'operator': /[?&|]/
			}
		},
		'import': [
			{
				pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source),
				lookbehind: true,
				inside: {
					'namespace': className.inside.namespace,
					'punctuation': /\./,
					'operator': /\*/,
					'class-name': /\w+/
				}
			},
			{
				pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source),
				lookbehind: true,
				alias: 'static',
				inside: {
					'namespace': className.inside.namespace,
					'static': /\b\w+$/,
					'punctuation': /\./,
					'operator': /\*/,
					'class-name': /\w+/
				}
			}
		],
		'namespace': {
			pattern: RegExp(
				/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/
					.source.replace(/<keyword>/g, function () { return keywords.source; })),
			lookbehind: true,
			inside: {
				'punctuation': /\./,
			}
		}
	});
}(Prism));
㲭x
-!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!<keyword>)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(/<keyword>/g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism);UЎxD(function (Prism) {

	var codeLinePattern = /(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m;

	var memberReference = /#\s*\w+(?:\s*\([^()]*\))?/.source;
	var reference = /(?:\b[a-zA-Z]\w+\s*\.\s*)*\b[A-Z]\w*(?:\s*<mem>)?|<mem>/.source.replace(/<mem>/g, function () { return memberReference; });

	Prism.languages.javadoc = Prism.languages.extend('javadoclike', {});
	Prism.languages.insertBefore('javadoc', 'keyword', {
		'reference': {
			pattern: RegExp(/(@(?:exception|link|linkplain|see|throws|value)\s+(?:\*\s*)?)/.source + '(?:' + reference + ')'),
			lookbehind: true,
			inside: {
				'function': {
					pattern: /(#\s*)\w+(?=\s*\()/,
					lookbehind: true
				},
				'field': {
					pattern: /(#\s*)\w+/,
					lookbehind: true
				},
				'namespace': {
					pattern: /\b(?:[a-z]\w*\s*\.\s*)+/,
					inside: {
						'punctuation': /\./
					}
				},
				'class-name': /\b[A-Z]\w*/,
				'keyword': Prism.languages.java.keyword,
				'punctuation': /[#()[\],.]/
			}
		},
		'class-name': {
			// @param <T> the first generic type parameter
			pattern: /(@param\s+)<[A-Z]\w*>/,
			lookbehind: true,
			inside: {
				'punctuation': /[.<>]/
			}
		},
		'code-section': [
			{
				pattern: /(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,
				lookbehind: true,
				inside: {
					'code': {
						// there can't be any HTML inside of {@code} tags
						pattern: codeLinePattern,
						lookbehind: true,
						inside: Prism.languages.java,
						alias: 'language-java'
					}
				}
			},
			{
				pattern: /(<(code|pre|tt)>(?!<code>)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,
				lookbehind: true,
				inside: {
					'line': {
						pattern: codeLinePattern,
						lookbehind: true,
						inside: {
							// highlight HTML tags and entities
							'tag': Prism.languages.markup.tag,
							'entity': Prism.languages.markup.entity,
							'code': {
								// everything else is Java code
								pattern: /.+/,
								inside: Prism.languages.java,
								alias: 'language-java'
							}
						}
					}
				}
			}
		],
		'tag': Prism.languages.markup.tag,
		'entity': Prism.languages.markup.entity,
	});

	Prism.languages.javadoclike.addSupport('java', Prism.languages.javadoc);
}(Prism));
ĄֶWxv!function(a){var e=/(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m,n="(?:\\b[a-zA-Z]\\w+\\s*\\.\\s*)*\\b[A-Z]\\w*(?:\\s*<mem>)?|<mem>".replace(/<mem>/g,(function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"}));a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!<code>)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism);x((function (Prism) {

	var javaDocLike = Prism.languages.javadoclike = {
		'parameter': {
			pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,
			lookbehind: true
		},
		'keyword': {
			// keywords are the first word in a line preceded be an `@` or surrounded by curly braces.
			// @word, {@word}
			pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,
			lookbehind: true
		},
		'punctuation': /[{}]/
	};


	/**
	 * Adds doc comment support to the given language and calls a given callback on each doc comment pattern.
	 *
	 * @param {string} lang the language add doc comment support to.
	 * @param {(pattern: {inside: {rest: undefined}}) => void} callback the function called with each doc comment pattern as argument.
	 */
	function docCommentSupport(lang, callback) {
		var tokenName = 'doc-comment';

		var grammar = Prism.languages[lang];
		if (!grammar) {
			return;
		}
		var token = grammar[tokenName];

		if (!token) {
			// add doc comment: /** */
			var definition = {};
			definition[tokenName] = {
				pattern: /(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,
				lookbehind: true,
				alias: 'comment'
			};

			grammar = Prism.languages.insertBefore(lang, 'comment', definition);
			token = grammar[tokenName];
		}

		if (token instanceof RegExp) { // convert regex to object
			token = grammar[tokenName] = { pattern: token };
		}

		if (Array.isArray(token)) {
			for (var i = 0, l = token.length; i < l; i++) {
				if (token[i] instanceof RegExp) {
					token[i] = { pattern: token[i] };
				}
				callback(token[i]);
			}
		} else {
			callback(token);
		}
	}

	/**
	 * Adds doc-comment support to the given languages for the given documentation language.
	 *
	 * @param {string[]|string} languages
	 * @param {Object} docLanguage
	 */
	function addSupport(languages, docLanguage) {
		if (typeof languages === 'string') {
			languages = [languages];
		}

		languages.forEach(function (lang) {
			docCommentSupport(lang, function (pattern) {
				if (!pattern.inside) {
					pattern.inside = {};
				}
				pattern.inside.rest = docLanguage;
			});
		});
	}

	Object.defineProperty(javaDocLike, 'addSupport', { value: addSupport });

	javaDocLike.addSupport(['java', 'javascript', 'php'], javaDocLike);

}(Prism));
ͮ5xS!function(a){var e=a.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,n){"string"==typeof e&&(e=[e]),e.forEach((function(e){!function(e,n){var t="doc-comment",r=a.languages[e];if(r){var o=r[t];if(o||(o=(r=a.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[t]),o instanceof RegExp&&(o=r[t]={pattern:o}),Array.isArray(o))for(var i=0,s=o.length;i<s;i++)o[i]instanceof RegExp&&(o[i]={pattern:o[i]}),n(o[i]);else n(o)}}(e,(function(a){a.inside||(a.inside={}),a.inside.rest=n}))}))}}),e.addSupport(["java","javascript","php"],e)}(Prism);:(~xJPrism.languages.javascript = Prism.languages.extend('clike', {
	'class-name': [
		Prism.languages.clike['class-name'],
		{
			pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
			lookbehind: true
		}
	],
	'keyword': [
		{
			pattern: /((?:^|\})\s*)catch\b/,
			lookbehind: true
		},
		{
			pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
			lookbehind: true
		},
	],
	// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
	'function': /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
	'number': {
		pattern: RegExp(
			/(^|[^\w$])/.source +
			'(?:' +
			(
				// constant
				/NaN|Infinity/.source +
				'|' +
				// binary integer
				/0[bB][01]+(?:_[01]+)*n?/.source +
				'|' +
				// octal integer
				/0[oO][0-7]+(?:_[0-7]+)*n?/.source +
				'|' +
				// hexadecimal integer
				/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source +
				'|' +
				// decimal bigint
				/\d+(?:_\d+)*n/.source +
				'|' +
				// decimal number (integer or float) but no bigint
				/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source
			) +
			')' +
			/(?![\w$])/.source
		),
		lookbehind: true
	},
	'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
});

Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;

Prism.languages.insertBefore('javascript', 'keyword', {
	'regex': {
		pattern: RegExp(
			// lookbehind
			// eslint-disable-next-line regexp/no-dupe-characters-character-class
			/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source +
			// Regex pattern:
			// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character
			// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible
			// with the only syntax, so we have to define 2 different regex patterns.
			/\//.source +
			'(?:' +
			/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source +
			'|' +
			// `v` flag syntax. This supports 3 levels of nested character classes.
			/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source +
			')' +
			// lookahead
			/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source
		),
		lookbehind: true,
		greedy: true,
		inside: {
			'regex-source': {
				pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
				lookbehind: true,
				alias: 'language-regex',
				inside: Prism.languages.regex
			},
			'regex-delimiter': /^\/|\/$/,
			'regex-flags': /^[a-z]+$/,
		}
	},
	// This must be declared before keyword because we use "function" inside the look-forward
	'function-variable': {
		pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
		alias: 'function'
	},
	'parameter': [
		{
			pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
			lookbehind: true,
			inside: Prism.languages.javascript
		},
		{
			pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
			lookbehind: true,
			inside: Prism.languages.javascript
		},
		{
			pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
			lookbehind: true,
			inside: Prism.languages.javascript
		},
		{
			pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
			lookbehind: true,
			inside: Prism.languages.javascript
		}
	],
	'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/
});

Prism.languages.insertBefore('javascript', 'string', {
	'hashbang': {
		pattern: /^#!.*/,
		greedy: true,
		alias: 'comment'
	},
	'template-string': {
		pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
		greedy: true,
		inside: {
			'template-punctuation': {
				pattern: /^`|`$/,
				alias: 'string'
			},
			'interpolation': {
				pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
				lookbehind: true,
				inside: {
					'interpolation-punctuation': {
						pattern: /^\$\{|\}$/,
						alias: 'punctuation'
					},
					rest: Prism.languages.javascript
				}
			},
			'string': /[\s\S]+/
		}
	},
	'string-property': {
		pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
		lookbehind: true,
		greedy: true,
		alias: 'property'
	}
});

Prism.languages.insertBefore('javascript', 'operator', {
	'literal-property': {
		pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
		lookbehind: true,
		alias: 'property'
	},
});

if (Prism.languages.markup) {
	Prism.languages.markup.tag.addInlined('script', 'javascript');

	// add attribute support for all DOM events.
	// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events
	Prism.languages.markup.tag.addAttribute(
		/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,
		'javascript'
	);
}

Prism.languages.js = Prism.languages.javascript;
AxPrism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;5BƺxU// Specification:
// https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/Throwable.html#printStackTrace()

Prism.languages.javastacktrace = {

	// java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
	// Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
	// Caused by: com.example.myproject.MyProjectServletException
	// Caused by: MidLevelException: LowLevelException
	// Suppressed: Resource$CloseFailException: Resource ID = 0
	'summary': {
		pattern: /^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,
		lookbehind: true,
		inside: {
			'keyword': {
				pattern: /^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,
				lookbehind: true
			},

			// the current thread if the summary starts with 'Exception in thread'
			'string': {
				pattern: /^(\s*)"[^"]*"/,
				lookbehind: true
			},
			'exceptions': {
				pattern: /^(:?\s*)[\w$.]+(?=:|$)/,
				lookbehind: true,
				inside: {
					'class-name': /[\w$]+$/,
					'namespace': /\b[a-z]\w*\b/,
					'punctuation': /\./
				}
			},
			'message': {
				pattern: /(:\s*)\S.*/,
				lookbehind: true,
				alias: 'string'
			},
			'punctuation': /:/
		}
	},

	// at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
	// at org.hsqldb.jdbc.Util.throwError(Unknown Source) here could be some notes
	// at java.base/java.lang.Class.forName0(Native Method)
	// at Util.<init>(Unknown Source)
	// at com.foo.loader/foo@9.0/com.foo.Main.run(Main.java:101)
	// at com.foo.loader//com.foo.bar.App.run(App.java:12)
	// at acme@2.1/org.acme.Lib.test(Lib.java:80)
	// at MyClass.mash(MyClass.java:9)
	//
	// More information:
	// https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/StackTraceElement.html#toString()
	//
	// A valid Java module name is defined as:
	//   "A module name consists of one or more Java identifiers (§3.8) separated by "." tokens."
	// https://docs.oracle.com/javase/specs/jls/se9/html/jls-6.html#jls-ModuleName
	//
	// A Java module version is defined by this class:
	// https://docs.oracle.com/javase/9/docs/api/java/lang/module/ModuleDescriptor.Version.html
	// This is the implementation of the `parse` method in JDK13:
	// https://github.com/matcdac/jdk/blob/2305df71d1b7710266ae0956d73927a225132c0f/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java#L1108
	// However, to keep this simple, a version will be matched by the pattern /@[\w$.+-]*/.
	'stack-frame': {
		pattern: /^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:<init>)?\([^()]*\)/m,
		lookbehind: true,
		inside: {
			'keyword': {
				pattern: /^(\s*)at(?= )/,
				lookbehind: true
			},
			'source': [
				// (Main.java:15)
				// (Main.scala:15)
				{
					pattern: /(\()\w+\.\w+:\d+(?=\))/,
					lookbehind: true,
					inside: {
						'file': /^\w+\.\w+/,
						'punctuation': /:/,
						'line-number': {
							pattern: /\b\d+\b/,
							alias: 'number'
						}
					}
				},
				// (Unknown Source)
				// (Native Method)
				// (...something...)
				{
					pattern: /(\()[^()]*(?=\))/,
					lookbehind: true,
					inside: {
						'keyword': /^(?:Native Method|Unknown Source)$/
					}
				}
			],
			'class-name': /[\w$]+(?=\.(?:<init>|[\w$]+)\()/,
			'function': /(?:<init>|[\w$]+)(?=\()/,
			'class-loader': {
				pattern: /(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,
				lookbehind: true,
				alias: 'namespace',
				inside: {
					'punctuation': /\./
				}
			},
			'module': {
				pattern: /([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,
				lookbehind: true,
				inside: {
					'version': {
						pattern: /(@)[\s\S]+/,
						lookbehind: true,
						alias: 'number'
					},
					'punctuation': /[@.]/
				}
			},
			'namespace': {
				pattern: /(?:\b[a-z]\w*\.)+/,
				inside: {
					'punctuation': /\./
				}
			},
			'punctuation': /[()/.]/
		}
	},

	// ... 32 more
	// ... 32 common frames omitted
	'more': {
		pattern: /^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,
		lookbehind: true,
		inside: {
			'punctuation': /\.{3}/,
			'number': /\d+/,
			'keyword': /\b[a-z]+(?: [a-z]+)*\b/
		}
	}

};
/`xPrism.languages.javastacktrace={summary:{pattern:/^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,lookbehind:!0,inside:{keyword:{pattern:/^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+$/,namespace:/\b[a-z]\w*\b/,punctuation:/\./}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/:/}},"stack-frame":{pattern:/^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:<init>)?\([^()]*\)/m,lookbehind:!0,inside:{keyword:{pattern:/^(\s*)at(?= )/,lookbehind:!0},source:[{pattern:/(\()\w+\.\w+:\d+(?=\))/,lookbehind:!0,inside:{file:/^\w+\.\w+/,punctuation:/:/,"line-number":{pattern:/\b\d+\b/,alias:"number"}}},{pattern:/(\()[^()]*(?=\))/,lookbehind:!0,inside:{keyword:/^(?:Native Method|Unknown Source)$/}}],"class-name":/[\w$]+(?=\.(?:<init>|[\w$]+)\()/,function:/(?:<init>|[\w$]+)(?=\()/,"class-loader":{pattern:/(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,lookbehind:!0,alias:"namespace",inside:{punctuation:/\./}},module:{pattern:/([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,lookbehind:!0,inside:{version:{pattern:/(@)[\s\S]+/,lookbehind:!0,alias:"number"},punctuation:/[@.]/}},namespace:{pattern:/(?:\b[a-z]\w*\.)+/,inside:{punctuation:/\./}},punctuation:/[()/.]/}},more:{pattern:/^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,lookbehind:!0,inside:{punctuation:/\.{3}/,number:/\d+/,keyword:/\b[a-z]+(?: [a-z]+)*\b/}}};o%xTPrism.languages.jexl = {
	'string': /(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
	'transform': {
		pattern: /(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,
		alias: 'function',
		lookbehind: true
	},
	'function': /[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,
	'number': /\b\d+(?:\.\d+)?\b|\B\.\d+\b/,
	'operator': /[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,
	'boolean': /\b(?:false|true)\b/,
	'keyword': /\bin\b/,
	'punctuation': /[{}[\](),.]/,
};
,!xPrism.languages.jexl={string:/(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,transform:{pattern:/(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,alias:"function",lookbehind:!0},function:/[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+\b/,operator:/[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,boolean:/\b(?:false|true)\b/,keyword:/\bin\b/,punctuation:/[{}[\](),.]/};qdfxkPrism.languages.jolie = Prism.languages.extend('clike', {
	'string': {
		pattern: /(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,
		lookbehind: true,
		greedy: true
	},
	'class-name': {
		pattern: /((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,
		lookbehind: true
	},
	'keyword': /\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,
	'function': /\b[a-z_]\w*(?=[ \t]*[@(])/i,
	'number': /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,
	'operator': /-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,
	'punctuation': /[()[\]{},;.:]/,
	'builtin': /\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/
});

Prism.languages.insertBefore('jolie', 'keyword', {
	'aggregates': {
		pattern: /(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,
		lookbehind: true,
		inside: {
			'keyword': /\bwith\b/,
			'class-name': /\w+/,
			'punctuation': /,/
		}
	},
	'redirects': {
		pattern: /(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,
		lookbehind: true,
		inside: {
			'punctuation': /,/,
			'class-name': /\w+/,
			'operator': /=>/
		}
	},
	'property': {
		pattern: /\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/
	}
});
p6[xCPrism.languages.jolie=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,lookbehind:!0,greedy:!0},"class-name":{pattern:/((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,lookbehind:!0},keyword:/\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,function:/\b[a-z_]\w*(?=[ \t]*[@(])/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,operator:/-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,punctuation:/[()[\]{},;.:]/,builtin:/\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/}),Prism.languages.insertBefore("jolie","keyword",{aggregates:{pattern:/(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,lookbehind:!0,inside:{keyword:/\bwith\b/,"class-name":/\w+/,punctuation:/,/}},redirects:{pattern:/(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,lookbehind:!0,inside:{punctuation:/,/,"class-name":/\w+/,operator:/=>/}},property:{pattern:/\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/}});P"hxx(function (Prism) {

	var interpolation = /\\\((?:[^()]|\([^()]*\))*\)/.source;
	var string = RegExp(/(^|[^\\])"(?:[^"\r\n\\]|\\[^\r\n(]|__)*"/.source.replace(/__/g, function () { return interpolation; }));
	var stringInterpolation = {
		'interpolation': {
			pattern: RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + interpolation),
			lookbehind: true,
			inside: {
				'content': {
					pattern: /^(\\\()[\s\S]+(?=\)$)/,
					lookbehind: true,
					inside: null // see below
				},
				'punctuation': /^\\\(|\)$/
			}
		}
	};

	var jq = Prism.languages.jq = {
		'comment': /#.*/,
		'property': {
			pattern: RegExp(string.source + /(?=\s*:(?!:))/.source),
			lookbehind: true,
			greedy: true,
			inside: stringInterpolation
		},
		'string': {
			pattern: string,
			lookbehind: true,
			greedy: true,
			inside: stringInterpolation
		},

		'function': {
			pattern: /(\bdef\s+)[a-z_]\w+/i,
			lookbehind: true
		},

		'variable': /\B\$\w+/,
		'property-literal': {
			pattern: /\b[a-z_]\w*(?=\s*:(?!:))/i,
			alias: 'property'
		},
		'keyword': /\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,
		'boolean': /\b(?:false|true)\b/,
		'number': /(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,

		'operator': [
			{
				pattern: /\|=?/,
				alias: 'pipe'
			},
			/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/
		],
		'c-style-function': {
			pattern: /\b[a-z_]\w*(?=\s*\()/i,
			alias: 'function'
		},
		'punctuation': /::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,
		'dot': {
			pattern: /\./,
			alias: 'important'
		}
	};

	stringInterpolation.interpolation.inside.content.inside = jq;

}(Prism));
Ixk!function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('(^|[^\\\\])"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,(function(){return n}))),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),lookbehind:!0,greedy:!0,inside:i},string:{pattern:t,lookbehind:!0,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism);Ѱx?(function (Prism) {

	Prism.languages.insertBefore('javascript', 'function-variable', {
		'method-variable': {
			pattern: RegExp('(\\.\\s*)' + Prism.languages.javascript['function-variable'].pattern.source),
			lookbehind: true,
			alias: ['function-variable', 'method', 'function', 'property-access']
		}
	});

	Prism.languages.insertBefore('javascript', 'function', {
		'method': {
			pattern: RegExp('(\\.\\s*)' + Prism.languages.javascript['function'].source),
			lookbehind: true,
			alias: ['function', 'property-access']
		}
	});

	Prism.languages.insertBefore('javascript', 'constant', {
		'known-class-name': [
			{
				// standard built-ins
				// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
				pattern: /\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,
				alias: 'class-name'
			},
			{
				// errors
				pattern: /\b(?:[A-Z]\w*)Error\b/,
				alias: 'class-name'
			}
		]
	});

	/**
	 * Replaces the `<ID>` placeholder in the given pattern with a pattern for general JS identifiers.
	 *
	 * @param {string} source
	 * @param {string} [flags]
	 * @returns {RegExp}
	 */
	function withId(source, flags) {
		return RegExp(
			source.replace(/<ID>/g, function () { return /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source; }),
			flags);
	}
	Prism.languages.insertBefore('javascript', 'keyword', {
		'imports': {
			// https://tc39.es/ecma262/#sec-imports
			pattern: withId(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),
			lookbehind: true,
			inside: Prism.languages.javascript
		},
		'exports': {
			// https://tc39.es/ecma262/#sec-exports
			pattern: withId(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),
			lookbehind: true,
			inside: Prism.languages.javascript
		}
	});

	Prism.languages.javascript['keyword'].unshift(
		{
			pattern: /\b(?:as|default|export|from|import)\b/,
			alias: 'module'
		},
		{
			pattern: /\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,
			alias: 'control-flow'
		},
		{
			pattern: /\bnull\b/,
			alias: ['null', 'nil']
		},
		{
			pattern: /\bundefined\b/,
			alias: 'nil'
		}
	);

	Prism.languages.insertBefore('javascript', 'operator', {
		'spread': {
			pattern: /\.{3}/,
			alias: 'operator'
		},
		'arrow': {
			pattern: /=>/,
			alias: 'operator'
		}
	});

	Prism.languages.insertBefore('javascript', 'punctuation', {
		'property-access': {
			pattern: withId(/(\.\s*)#?<ID>/.source),
			lookbehind: true
		},
		'maybe-class-name': {
			pattern: /(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,
			lookbehind: true
		},
		'dom': {
			// this contains only a few commonly used DOM variables
			pattern: /\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,
			alias: 'variable'
		},
		'console': {
			pattern: /\bconsole(?=\s*\.)/,
			alias: 'class-name'
		}
	});


	// add 'maybe-class-name' to tokens which might be a class name
	var maybeClassNameTokens = ['function', 'function-variable', 'method', 'method-variable', 'property-access'];

	for (var i = 0; i < maybeClassNameTokens.length; i++) {
		var token = maybeClassNameTokens[i];
		var value = Prism.languages.javascript[token];

		// convert regex to object
		if (Prism.util.type(value) === 'RegExp') {
			value = Prism.languages.javascript[token] = {
				pattern: value
			};
		}

		// keep in mind that we don't support arrays

		var inside = value.inside || {};
		value.inside = inside;

		inside['maybe-class-name'] = /^[A-Z][\s\S]*/;
	}

}(Prism));
x	_!function(a){function e(a,e){return RegExp(a.replace(/<ID>/g,(function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"})),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:<ID>(?:\\s*,\\s*(?:\\*\\s*as\\s+<ID>|\\{[^{}]*\\}))?|\\*\\s*as\\s+<ID>|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+<ID>)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?<ID>"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r<t.length;r++){var n=t[r],s=a.languages.javascript[n];"RegExp"===a.util.type(s)&&(s=a.languages.javascript[n]={pattern:s});var o=s.inside||{};s.inside=o,o["maybe-class-name"]=/^[A-Z][\s\S]*/}}(Prism);{vQx]&(function (Prism) {

	var templateString = Prism.languages.javascript['template-string'];

	// see the pattern in prism-javascript.js
	var templateLiteralPattern = templateString.pattern.source;
	var interpolationObject = templateString.inside['interpolation'];
	var interpolationPunctuationObject = interpolationObject.inside['interpolation-punctuation'];
	var interpolationPattern = interpolationObject.pattern.source;


	/**
	 * Creates a new pattern to match a template string with a special tag.
	 *
	 * This will return `undefined` if there is no grammar with the given language id.
	 *
	 * @param {string} language The language id of the embedded language. E.g. `markdown`.
	 * @param {string} tag The regex pattern to match the tag.
	 * @returns {object | undefined}
	 * @example
	 * createTemplate('css', /\bcss/.source);
	 */
	function createTemplate(language, tag) {
		if (!Prism.languages[language]) {
			return undefined;
		}

		return {
			pattern: RegExp('((?:' + tag + ')\\s*)' + templateLiteralPattern),
			lookbehind: true,
			greedy: true,
			inside: {
				'template-punctuation': {
					pattern: /^`|`$/,
					alias: 'string'
				},
				'embedded-code': {
					pattern: /[\s\S]+/,
					alias: language
				}
			}
		};
	}


	Prism.languages.javascript['template-string'] = [
		// styled-jsx:
		//   css`a { color: #25F; }`
		// styled-components:
		//   styled.h1`color: red;`
		createTemplate('css', /\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),

		// html`<p></p>`
		// div.innerHTML = `<p></p>`
		createTemplate('html', /\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),

		// svg`<path fill="#fff" d="M55.37 ..."/>`
		createTemplate('svg', /\bsvg/.source),

		// md`# h1`, markdown`## h2`
		createTemplate('markdown', /\b(?:markdown|md)/.source),

		// gql`...`, graphql`...`, graphql.experimental`...`
		createTemplate('graphql', /\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),

		// sql`...`
		createTemplate('sql', /\bsql/.source),

		// vanilla template string
		templateString
	].filter(Boolean);


	/**
	 * Returns a specific placeholder literal for the given language.
	 *
	 * @param {number} counter
	 * @param {string} language
	 * @returns {string}
	 */
	function getPlaceholder(counter, language) {
		return '___' + language.toUpperCase() + '_' + counter + '___';
	}

	/**
	 * Returns the tokens of `Prism.tokenize` but also runs the `before-tokenize` and `after-tokenize` hooks.
	 *
	 * @param {string} code
	 * @param {any} grammar
	 * @param {string} language
	 * @returns {(string|Token)[]}
	 */
	function tokenizeWithHooks(code, grammar, language) {
		var env = {
			code: code,
			grammar: grammar,
			language: language
		};
		Prism.hooks.run('before-tokenize', env);
		env.tokens = Prism.tokenize(env.code, env.grammar);
		Prism.hooks.run('after-tokenize', env);
		return env.tokens;
	}

	/**
	 * Returns the token of the given JavaScript interpolation expression.
	 *
	 * @param {string} expression The code of the expression. E.g. `"${42}"`
	 * @returns {Token}
	 */
	function tokenizeInterpolationExpression(expression) {
		var tempGrammar = {};
		tempGrammar['interpolation-punctuation'] = interpolationPunctuationObject;

		/** @type {Array} */
		var tokens = Prism.tokenize(expression, tempGrammar);
		if (tokens.length === 3) {
			/**
			 * The token array will look like this
			 * [
			 *     ["interpolation-punctuation", "${"]
			 *     "..." // JavaScript expression of the interpolation
			 *     ["interpolation-punctuation", "}"]
			 * ]
			 */

			var args = [1, 1];
			args.push.apply(args, tokenizeWithHooks(tokens[1], Prism.languages.javascript, 'javascript'));

			tokens.splice.apply(tokens, args);
		}

		return new Prism.Token('interpolation', tokens, interpolationObject.alias, expression);
	}

	/**
	 * Tokenizes the given code with support for JavaScript interpolation expressions mixed in.
	 *
	 * This function has 3 phases:
	 *
	 * 1. Replace all JavaScript interpolation expression with a placeholder.
	 *    The placeholder will have the syntax of a identify of the target language.
	 * 2. Tokenize the code with placeholders.
	 * 3. Tokenize the interpolation expressions and re-insert them into the tokenize code.
	 *    The insertion only works if a placeholder hasn't been "ripped apart" meaning that the placeholder has been
	 *    tokenized as two tokens by the grammar of the embedded language.
	 *
	 * @param {string} code
	 * @param {object} grammar
	 * @param {string} language
	 * @returns {Token}
	 */
	function tokenizeEmbedded(code, grammar, language) {
		// 1. First filter out all interpolations

		// because they might be escaped, we need a lookbehind, so we use Prism
		/** @type {(Token|string)[]} */
		var _tokens = Prism.tokenize(code, {
			'interpolation': {
				pattern: RegExp(interpolationPattern),
				lookbehind: true
			}
		});

		// replace all interpolations with a placeholder which is not in the code already
		var placeholderCounter = 0;
		/** @type {Object<string, string>} */
		var placeholderMap = {};
		var embeddedCode = _tokens.map(function (token) {
			if (typeof token === 'string') {
				return token;
			} else {
				var interpolationExpression = token.content;

				var placeholder;
				while (code.indexOf(placeholder = getPlaceholder(placeholderCounter++, language)) !== -1) { /* noop */ }
				placeholderMap[placeholder] = interpolationExpression;
				return placeholder;
			}
		}).join('');


		// 2. Tokenize the embedded code

		var embeddedTokens = tokenizeWithHooks(embeddedCode, grammar, language);


		// 3. Re-insert the interpolation

		var placeholders = Object.keys(placeholderMap);
		placeholderCounter = 0;

		/**
		 *
		 * @param {(Token|string)[]} tokens
		 * @returns {void}
		 */
		function walkTokens(tokens) {
			for (var i = 0; i < tokens.length; i++) {
				if (placeholderCounter >= placeholders.length) {
					return;
				}

				var token = tokens[i];

				if (typeof token === 'string' || typeof token.content === 'string') {
					var placeholder = placeholders[placeholderCounter];
					var s = typeof token === 'string' ? token : /** @type {string} */ (token.content);

					var index = s.indexOf(placeholder);
					if (index !== -1) {
						++placeholderCounter;

						var before = s.substring(0, index);
						var middle = tokenizeInterpolationExpression(placeholderMap[placeholder]);
						var after = s.substring(index + placeholder.length);

						var replacement = [];
						if (before) {
							replacement.push(before);
						}
						replacement.push(middle);
						if (after) {
							var afterTokens = [after];
							walkTokens(afterTokens);
							replacement.push.apply(replacement, afterTokens);
						}

						if (typeof token === 'string') {
							tokens.splice.apply(tokens, [i, 1].concat(replacement));
							i += replacement.length - 1;
						} else {
							token.content = replacement;
						}
					}
				} else {
					var content = token.content;
					if (Array.isArray(content)) {
						walkTokens(content);
					} else {
						walkTokens([content]);
					}
				}
			}
		}
		walkTokens(embeddedTokens);

		return new Prism.Token(language, embeddedTokens, 'language-' + language, code);
	}

	/**
	 * The languages for which JS templating will handle tagged template literals.
	 *
	 * JS templating isn't active for only JavaScript but also related languages like TypeScript, JSX, and TSX.
	 */
	var supportedLanguages = {
		'javascript': true,
		'js': true,
		'typescript': true,
		'ts': true,
		'jsx': true,
		'tsx': true,
	};
	Prism.hooks.add('after-tokenize', function (env) {
		if (!(env.language in supportedLanguages)) {
			return;
		}

		/**
		 * Finds and tokenizes all template strings with an embedded languages.
		 *
		 * @param {(Token | string)[]} tokens
		 * @returns {void}
		 */
		function findTemplateStrings(tokens) {
			for (var i = 0, l = tokens.length; i < l; i++) {
				var token = tokens[i];

				if (typeof token === 'string') {
					continue;
				}

				var content = token.content;
				if (!Array.isArray(content)) {
					if (typeof content !== 'string') {
						findTemplateStrings([content]);
					}
					continue;
				}

				if (token.type === 'template-string') {
					/**
					 * A JavaScript template-string token will look like this:
					 *
					 * ["template-string", [
					 *     ["template-punctuation", "`"],
					 *     (
					 *         An array of "string" and "interpolation" tokens. This is the simple string case.
					 *         or
					 *         ["embedded-code", "..."] This is the token containing the embedded code.
					 *                                  It also has an alias which is the language of the embedded code.
					 *     ),
					 *     ["template-punctuation", "`"]
					 * ]]
					 */

					var embedded = content[1];
					if (content.length === 3 && typeof embedded !== 'string' && embedded.type === 'embedded-code') {
						// get string content
						var code = stringContent(embedded);

						var alias = embedded.alias;
						var language = Array.isArray(alias) ? alias[0] : alias;

						var grammar = Prism.languages[language];
						if (!grammar) {
							// the embedded language isn't registered.
							continue;
						}

						content[1] = tokenizeEmbedded(code, grammar, language);
					}
				} else {
					findTemplateStrings(content);
				}
			}
		}

		findTemplateStrings(env.tokens);
	});


	/**
	 * Returns the string content of a token or token stream.
	 *
	 * @param {string | Token | (string | Token)[]} value
	 * @returns {string}
	 */
	function stringContent(value) {
		if (typeof value === 'string') {
			return value;
		} else if (Array.isArray(value)) {
			return value.map(stringContent).join('');
		} else {
			return stringContent(value.content);
		}
	}

}(Prism));
Ax
!function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],i=r.pattern.source;function o(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function p(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function l(t){var n={};n["interpolation-punctuation"]=a;var i=e.tokenize(t,n);if(3===i.length){var o=[1,1];o.push.apply(o,p(i[1],e.languages.javascript,"javascript")),i.splice.apply(i,o)}return new e.Token("interpolation",i,r.alias,t)}function g(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(i),lookbehind:!0}}),o=0,g={},u=p(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(o++,r)););return g[n]=a,n})).join(""),n,r),c=Object.keys(g);return o=0,function e(t){for(var n=0;n<t.length;n++){if(o>=c.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=c[o],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++o;var p=i.substring(0,s),u=l(g[a]),f=i.substring(s+a.length),y=[];if(p&&y.push(p),y.push(u),f){var v=[f];e(v),y.push.apply(y,v)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(y)),n+=y.length-1):r.content=y}}else{var d=r.content;Array.isArray(d)?e(d):e([d])}}}(u),new e.Token(r,u,"language-"+r,t)}e.languages.javascript["template-string"]=[o("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),o("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),o("svg","\\bsvg"),o("markdown","\\b(?:markdown|md)"),o("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),o("sql","\\bsql"),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function c(e){return"string"==typeof e?e:Array.isArray(e)?e.map(c).join(""):c(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var r=0,a=n.length;r<a;r++){var i=n[r];if("string"!=typeof i){var o=i.content;if(Array.isArray(o))if("template-string"===i.type){var s=o[1];if(3===o.length&&"string"!=typeof s&&"embedded-code"===s.type){var p=c(s),l=s.alias,u=Array.isArray(l)?l[0]:l,f=e.languages[u];if(!f)continue;o[1]=g(p,f,u)}}else t(o);else"string"!=typeof o&&t([o])}}}(t.tokens)}))}(Prism);U\x(function (Prism) {

	var javascript = Prism.languages.javascript;

	var type = /\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source;
	var parameterPrefix = '(@(?:arg|argument|param|property)\\s+(?:' + type + '\\s+)?)';

	Prism.languages.jsdoc = Prism.languages.extend('javadoclike', {
		'parameter': {
			// @param {string} foo - foo bar
			pattern: RegExp(parameterPrefix + /(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),
			lookbehind: true,
			inside: {
				'punctuation': /\./
			}
		}
	});

	Prism.languages.insertBefore('jsdoc', 'keyword', {
		'optional-parameter': {
			// @param {string} [baz.foo="bar"] foo bar
			pattern: RegExp(parameterPrefix + /\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),
			lookbehind: true,
			inside: {
				'parameter': {
					pattern: /(^\[)[$\w\xA0-\uFFFF\.]+/,
					lookbehind: true,
					inside: {
						'punctuation': /\./
					}
				},
				'code': {
					pattern: /(=)[\s\S]*(?=\]$)/,
					lookbehind: true,
					inside: javascript,
					alias: 'language-javascript'
				},
				'punctuation': /[=[\]]/
			}
		},
		'class-name': [
			{
				pattern: RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g, function () { return type; })),
				lookbehind: true,
				inside: {
					'punctuation': /\./
				}
			},
			{
				pattern: RegExp('(@[a-z]+\\s+)' + type),
				lookbehind: true,
				inside: {
					'string': javascript.string,
					'number': javascript.number,
					'boolean': javascript.boolean,
					'keyword': Prism.languages.typescript.keyword,
					'operator': /=>|\.\.\.|[&|?:*]/,
					'punctuation': /[.,;=<>{}()[\]]/
				}
			}
		],
		'example': {
			pattern: /(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,
			lookbehind: true,
			inside: {
				'code': {
					pattern: /^([\t ]*(?:\*\s*)?)\S.*$/m,
					lookbehind: true,
					inside: javascript,
					alias: 'language-javascript'
				}
			}
		}
	});

	Prism.languages.javadoclike.addSupport('javascript', Prism.languages.jsdoc);

}(Prism));
x<gXx|!function(e){var a=e.languages.javascript,n="\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}",t="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(t+"(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?=\\s|$)"),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(t+"\\[(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?:=[^[\\]]+)?\\](?=\\s|$)"),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\\s+(?:<TYPE>\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism);r茰%xP// https://www.json.org/json-en.html
Prism.languages.json = {
	'property': {
		pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,
		lookbehind: true,
		greedy: true
	},
	'string': {
		pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,
		lookbehind: true,
		greedy: true
	},
	'comment': {
		pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
		greedy: true
	},
	'number': /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
	'punctuation': /[{}[\],]/,
	'operator': /:/,
	'boolean': /\b(?:false|true)\b/,
	'null': {
		pattern: /\bnull\b/,
		alias: 'keyword'
	}
};

Prism.languages.webmanifest = Prism.languages.json;
Mx>Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json;NӲ!x(function (Prism) {

	var string = /("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;

	Prism.languages.json5 = Prism.languages.extend('json', {
		'property': [
			{
				pattern: RegExp(string.source + '(?=\\s*:)'),
				greedy: true
			},
			{
				pattern: /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,
				alias: 'unquoted'
			}
		],
		'string': {
			pattern: string,
			greedy: true
		},
		'number': /[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/
	});

}(Prism));
^hxl!function(n){var e=/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;n.languages.json5=n.languages.extend("json",{property:[{pattern:RegExp(e.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:e,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})}(Prism);wݷx Prism.languages.jsonp = Prism.languages.extend('json', {
	'punctuation': /[{}[\]();,.]/
});

Prism.languages.insertBefore('jsonp', 'punctuation', {
	'function': /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/
});
iI³x ,Prism.languages.jsonp=Prism.languages.extend("json",{punctuation:/[{}[\]();,.]/}),Prism.languages.insertBefore("jsonp","punctuation",{function:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/});G=x)Prism.languages.jsstacktrace = {
	'error-message': {
		pattern: /^\S.*/m,
		alias: 'string'
	},

	'stack-frame': {
		pattern: /(^[ \t]+)at[ \t].*/m,
		lookbehind: true,
		inside: {
			'not-my-code': {
				pattern: /^at[ \t]+(?!\s)(?:node\.js|<unknown>|.*(?:node_modules|\(<anonymous>\)|\(<unknown>|<anonymous>$|\(internal\/|\(node\.js)).*/m,
				alias: 'comment'
			},

			'filename': {
				pattern: /(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,
				lookbehind: true,
				alias: 'url'
			},

			'function': {
				pattern: /(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,
				lookbehind: true,
				inside: {
					'punctuation': /\./
				}
			},

			'punctuation': /[()]/,

			'keyword': /\b(?:at|new)\b/,

			'alias': {
				pattern: /\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,
				alias: 'variable'
			},

			'line-number': {
				pattern: /:\d+(?::\d+)?\b/,
				alias: 'number',
				inside: {
					'punctuation': /:/
				}
			},

		}
	}
};
.Q/xPrism.languages.jsstacktrace={"error-message":{pattern:/^\S.*/m,alias:"string"},"stack-frame":{pattern:/(^[ \t]+)at[ \t].*/m,lookbehind:!0,inside:{"not-my-code":{pattern:/^at[ \t]+(?!\s)(?:node\.js|<unknown>|.*(?:node_modules|\(<anonymous>\)|\(<unknown>|<anonymous>$|\(internal\/|\(node\.js)).*/m,alias:"comment"},filename:{pattern:/(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,lookbehind:!0,alias:"url"},function:{pattern:/(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,lookbehind:!0,inside:{punctuation:/\./}},punctuation:/[()]/,keyword:/\b(?:at|new)\b/,alias:{pattern:/\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,alias:"variable"},"line-number":{pattern:/:\d+(?::\d+)?\b/,alias:"number",inside:{punctuation:/:/}}}}};x"(function (Prism) {

	Prism.languages.xquery = Prism.languages.extend('markup', {
		'xquery-comment': {
			pattern: /\(:[\s\S]*?:\)/,
			greedy: true,
			alias: 'comment'
		},
		'string': {
			pattern: /(["'])(?:\1\1|(?!\1)[\s\S])*\1/,
			greedy: true
		},
		'extension': {
			pattern: /\(#.+?#\)/,
			alias: 'symbol'
		},
		'variable': /\$[-\w:]+/,
		'axis': {
			pattern: /(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,
			lookbehind: true,
			alias: 'operator'
		},
		'keyword-operator': {
			pattern: /(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,
			lookbehind: true,
			alias: 'operator'
		},
		'keyword': {
			pattern: /(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,
			lookbehind: true
		},
		'function': /[\w-]+(?::[\w-]+)*(?=\s*\()/,
		'xquery-element': {
			pattern: /(element\s+)[\w-]+(?::[\w-]+)*/,
			lookbehind: true,
			alias: 'tag'
		},
		'xquery-attribute': {
			pattern: /(attribute\s+)[\w-]+(?::[\w-]+)*/,
			lookbehind: true,
			alias: 'attr-name'
		},
		'builtin': {
			pattern: /(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,
			lookbehind: true
		},
		'number': /\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,
		'operator': [
			/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,
			{
				pattern: /(\s)-(?=\s)/,
				lookbehind: true
			}
		],
		'punctuation': /[[\](){},;:/]/
	});

	Prism.languages.xquery.tag.pattern = /<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/;
	Prism.languages.xquery['tag'].inside['attr-value'].pattern = /=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/;
	Prism.languages.xquery['tag'].inside['attr-value'].inside['punctuation'] = /^="|"$/;
	Prism.languages.xquery['tag'].inside['attr-value'].inside['expression'] = {
		// Allow for two levels of nesting
		pattern: /\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,
		inside: Prism.languages.xquery,
		alias: 'language-xquery'
	};

	// The following will handle plain text inside tags
	var stringifyToken = function (token) {
		if (typeof token === 'string') {
			return token;
		}
		if (typeof token.content === 'string') {
			return token.content;
		}
		return token.content.map(stringifyToken).join('');
	};

	var walkTokens = function (tokens) {
		var openedTags = [];
		for (var i = 0; i < tokens.length; i++) {
			var token = tokens[i];
			var notTagNorBrace = false;

			if (typeof token !== 'string') {
				if (token.type === 'tag' && token.content[0] && token.content[0].type === 'tag') {
					// We found a tag, now find its kind

					if (token.content[0].content[0].content === '</') {
						// Closing tag
						if (openedTags.length > 0 && openedTags[openedTags.length - 1].tagName === stringifyToken(token.content[0].content[1])) {
							// Pop matching opening tag
							openedTags.pop();
						}
					} else {
						if (token.content[token.content.length - 1].content === '/>') {
							// Autoclosed tag, ignore
						} else {
							// Opening tag
							openedTags.push({
								tagName: stringifyToken(token.content[0].content[1]),
								openedBraces: 0
							});
						}
					}
				} else if (
					openedTags.length > 0 && token.type === 'punctuation' && token.content === '{' &&
					// Ignore `{{`
					(!tokens[i + 1] || tokens[i + 1].type !== 'punctuation' || tokens[i + 1].content !== '{') &&
					(!tokens[i - 1] || tokens[i - 1].type !== 'plain-text' || tokens[i - 1].content !== '{')
				) {
					// Here we might have entered an XQuery expression inside a tag
					openedTags[openedTags.length - 1].openedBraces++;

				} else if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces > 0 && token.type === 'punctuation' && token.content === '}') {

					// Here we might have left an XQuery expression inside a tag
					openedTags[openedTags.length - 1].openedBraces--;

				} else if (token.type !== 'comment') {
					notTagNorBrace = true;
				}
			}
			if (notTagNorBrace || typeof token === 'string') {
				if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {
					// Here we are inside a tag, and not inside an XQuery expression.
					// That's plain text: drop any tokens matched.
					var plainText = stringifyToken(token);

					// And merge text with adjacent text
					if (i < tokens.length - 1 && (typeof tokens[i + 1] === 'string' || tokens[i + 1].type === 'plain-text')) {
						plainText += stringifyToken(tokens[i + 1]);
						tokens.splice(i + 1, 1);
					}
					if (i > 0 && (typeof tokens[i - 1] === 'string' || tokens[i - 1].type === 'plain-text')) {
						plainText = stringifyToken(tokens[i - 1]) + plainText;
						tokens.splice(i - 1, 1);
						i--;
					}

					if (/^\s+$/.test(plainText)) {
						tokens[i] = plainText;
					} else {
						tokens[i] = new Prism.Token('plain-text', plainText, null, plainText);
					}
				}
			}

			if (token.content && typeof token.content !== 'string') {
				walkTokens(token.content);
			}
		}
	};

	Prism.hooks.add('after-tokenize', function (env) {
		if (env.language !== 'xquery') {
			return;
		}
		walkTokens(env.tokens);
	});

}(Prism));
 ˬuo0x0$var javascript = Prism.util.clone(Prism.languages.javascript);

	var space = /(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source;
	var braces = /(?:\{	#*\})/.source;
	var spread = /(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;

	/**
	 * @param {string} source
	 * @param {string} [flags]
	 */
	function re(source, flags) {
		source = source
			.replace(/<S>/g, function () { return space; })
			.replace(/<BRACES>/g, function () { return braces; })
			.replace(/<SPREAD>/g, function () { return spread; });
		return RegExp(source, fl=ags);
	}

	spread = re(spread).source;


	Prism.languages.jsx,$javascript);
	Prism.languages.jsx.tag.pattern = re(
		/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source
	);

	Prism.languages.jsx.tag.inside['tag'].pattern = /^<'\/?[^\s>\/]*/;
	Prism.languages.jsx.tag	$!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/;
	Prism.languages.jsx.tag.inside['tag'].inside['class-name'] = /^[A-Z]\w*(?:\.[A-Z]\w*)*
jsx.tag.inside['comment'] = javascript['comment'];

	Prism.languages.insertBefore('inside', 'attr-name', {
		'spread': {
			pattern: re(/<SPREAD>/.source),
			inside: Prism.languages.jsx
		}
	}, Prism.languages.jsx.tag);

	Prism.languages.insertBefore('i)nside', 'special-attr', {
		'script': {
	"'	pattern: re(/=<BRACES>/.source),
			alias: 'language-javascript',
			inside: {
				'script-punctuation': {
					pattern: /^=(?=\{)/,
					alias: 'punctuation'
				},
				rest: Prism.languages.jsx
			},
		}
	}, Prism.languages.jsx.tag);

	// The followinT!token) {
			return '';
		}#H+5 entered a JSX contextA JSX contextQW JSX contextT)Kjsx' && env.language !== 'tsx?ن2xT	!function(t){var n=t.util.clone(t.languages.javascript),e="(?:\\{<S>*\\.{3}(?:[^{}]|<BRACES>)*\\})";function a(t,n){return t=t.replace(/<S>/g,(function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"})).replace(/<BRACES>/g,(function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"})).replace(/<SPREAD>/g,(function(){return e})),RegExp(t,n)}e=a(e).source,t.languages.jsx=t.languages.extend("markup",n),t.languages.jsx.tag.pattern=a("</?(?:[\\w.:-]+(?:<S>+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|<BRACES>))?|<SPREAD>))*<S>*/?)?>"),t.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,t.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,t.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,t.languages.jsx.tag.inside.comment=n.comment,t.languages.insertBefore("inside","attr-name",{spread:{pattern:a("<SPREAD>"),inside:t.languages.jsx}},t.languages.jsx.tag),t.languages.insertBefore("inside","special-attr",{script:{pattern:a("=<BRACES>"),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:t.languages.jsx}}},t.languages.jsx.tag);var s=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(s).join(""):""},g=function(n){for(var e=[],a=0;a<n.length;a++){var o=n[a],i=!1;if("string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?e.length>0&&e[e.length-1].tagName===s(o.content[0].content[1])&&e.pop():"/>"===o.content[o.content.length-1].content||e.push({tagName:s(o.content[0].content[1]),openedBraces:0}):e.length>0&&"punctuation"===o.type&&"{"===o.content?e[e.length-1].openedBraces++:e.length>0&&e[e.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?e[e.length-1].openedBraces--:i=!0),(i||"string"==typeof o)&&e.length>0&&0===e[e.length-1].openedBraces){var r=s(o);a<n.length-1&&("string"==typeof n[a+1]||"plain-text"===n[a+1].type)&&(r+=s(n[a+1]),n.splice(a+1,1)),a>0&&("string"==typeof n[a-1]||"plain-text"===n[a-1].type)&&(r=s(n[a-1])+r,n.splice(a-1,1),a--),n[a]=new t.Token("plain-text",r,null,r)}o.content&&"string"!=typeof o.content&&g(o.content)}};t.hooks.add("after-tokenize",(function(t){"jsx"!==t.language&&"tsx"!==t.language||g(t.tokens)}))}(Prism);%=sx<Prism.languages.julia = {
	'comment': {
		// support one level of nested comments
		// https://github.com/JuliaLang/julia/pull/6128
		pattern: /(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,
		lookbehind: true
	},
	'regex': {
		// https://docs.julialang.org/en/v1/manual/strings/#Regular-Expressions-1
		pattern: /r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,
		greedy: true
	},
	'string': {
		// https://docs.julialang.org/en/v1/manual/strings/#String-Basics-1
		// https://docs.julialang.org/en/v1/manual/strings/#non-standard-string-literals-1
		// https://docs.julialang.org/en/v1/manual/running-external-programs/#Running-External-Programs-1
		pattern: /"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,
		greedy: true
	},
	'char': {
		// https://docs.julialang.org/en/v1/manual/strings/#man-characters-1
		pattern: /(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,
		lookbehind: true,
		greedy: true
	},
	'keyword': /\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,
	'boolean': /\b(?:false|true)\b/,
	'number': /(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,
	// https://docs.julialang.org/en/v1/manual/mathematical-operations/
	// https://docs.julialang.org/en/v1/manual/mathematical-operations/#Operator-Precedence-and-Associativity-1
	'operator': /&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,
	'punctuation': /::?|[{}[\]();,.?]/,
	// https://docs.julialang.org/en/v1/base/numbers/#Base.im
	'constant': /\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/
};
*o?x
Prism.languages.julia={comment:{pattern:/(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,lookbehind:!0},regex:{pattern:/r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,greedy:!0},string:{pattern:/"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,greedy:!0},char:{pattern:/(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,lookbehind:!0,greedy:!0},keyword:/\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,operator:/&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\]();,.?]/,constant:/\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/};^a|xPrism.languages.keepalived = {
	'comment': {
		pattern: /[#!].*/,
		greedy: true
	},
	'string': {
		pattern: /(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,
		lookbehind: true,
		greedy: true
	},

	// support IPv4, IPv6, subnet mask
	'ip': {
		pattern: RegExp(
			/\b(?:(?:(?:[\da-f]{1,4}:){7}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}:[\da-f]{1,4}|(?:[\da-f]{1,4}:){5}:(?:[\da-f]{1,4}:)?[\da-f]{1,4}|(?:[\da-f]{1,4}:){4}:(?:[\da-f]{1,4}:){0,2}[\da-f]{1,4}|(?:[\da-f]{1,4}:){3}:(?:[\da-f]{1,4}:){0,3}[\da-f]{1,4}|(?:[\da-f]{1,4}:){2}:(?:[\da-f]{1,4}:){0,4}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}<ipv4>|(?:[\da-f]{1,4}:){0,5}:<ipv4>|::(?:[\da-f]{1,4}:){0,5}<ipv4>|[\da-f]{1,4}::(?:[\da-f]{1,4}:){0,5}[\da-f]{1,4}|::(?:[\da-f]{1,4}:){0,6}[\da-f]{1,4}|(?:[\da-f]{1,4}:){1,7}:)(?:\/\d{1,3})?|<ipv4>(?:\/\d{1,2})?)\b/.source
				.replace(/<ipv4>/g, function () { return /(?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))/.source; }),
			'i'
		),
		alias: 'number'
	},

	// support *nix / Windows, directory / file
	'path': {
		pattern: /(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,
		lookbehind: true,
		alias: 'string',
	},
	'variable': /\$\{?\w+\}?/,
	'email': {
		pattern: /[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,
		alias: 'string',
	},
	'conditional-configuration': {
		pattern: /@\^?[\w-]+/,
		alias: 'variable'
	},
	'operator': /=/,

	'property': /\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,

	'constant': /\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,

	'number': {
		pattern: /(^|[^\w.-])-?\d+(?:\.\d+)?/,
		lookbehind: true
	},

	'boolean': /\b(?:false|no|off|on|true|yes)\b/,

	'punctuation': /[\{\}]/
};
ox&Prism.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp("\\b(?:(?:(?:[\\da-f]{1,4}:){7}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}:[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){5}:(?:[\\da-f]{1,4}:)?[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){4}:(?:[\\da-f]{1,4}:){0,2}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){3}:(?:[\\da-f]{1,4}:){0,3}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){2}:(?:[\\da-f]{1,4}:){0,4}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}<ipv4>|(?:[\\da-f]{1,4}:){0,5}:<ipv4>|::(?:[\\da-f]{1,4}:){0,5}<ipv4>|[\\da-f]{1,4}::(?:[\\da-f]{1,4}:){0,5}[\\da-f]{1,4}|::(?:[\\da-f]{1,4}:){0,6}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){1,7}:)(?:/\\d{1,3})?|<ipv4>(?:/\\d{1,2})?)\\b".replace(/<ipv4>/g,(function(){return"(?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))"})),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/};.Rx Prism.languages.keyman = {
	'comment': {
		pattern: /\bc .*/i,
		greedy: true
	},
	'string': {
		pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
		greedy: true
	},
	'virtual-key': {
		pattern: /\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,
		greedy: true,
		alias: 'function' // alias for styles
	},

	// https://help.keyman.com/developer/language/guide/headers
	'header-keyword': {
		pattern: /&\w+/,
		alias: 'bold' // alias for styles
	},
	'header-statement': {
		pattern: /\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,
		alias: 'bold' // alias for styles
	},

	'rule-keyword': {
		pattern: /\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,
		alias: 'keyword'
	},
	'structural-keyword': {
		pattern: /\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,
		alias: 'keyword'
	},

	'compile-target': {
		pattern: /\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,
		alias: 'property'
	},

	// U+####, x###, d### characters and numbers
	'number': /\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,
	'operator': /[+>\\$]|\.\./,
	'punctuation': /[()=,]/
};
%w>xPrism.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/};sxj
(function (Prism) {
	Prism.languages.kotlin = Prism.languages.extend('clike', {
		'keyword': {
			// The lookbehind prevents wrong highlighting of e.g. kotlin.properties.get
			pattern: /(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,
			lookbehind: true
		},
		'function': [
			{
				pattern: /(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,
				greedy: true
			},
			{
				pattern: /(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,
				lookbehind: true,
				greedy: true
			}
		],
		'number': /\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,
		'operator': /\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/
	});

	delete Prism.languages.kotlin['class-name'];

	var interpolationInside = {
		'interpolation-punctuation': {
			pattern: /^\$\{?|\}$/,
			alias: 'punctuation'
		},
		'expression': {
			pattern: /[\s\S]+/,
			inside: Prism.languages.kotlin
		}
	};

	Prism.languages.insertBefore('kotlin', 'string', {
		// https://kotlinlang.org/spec/expressions.html#string-interpolation-expressions
		'string-literal': [
			{
				pattern: /"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,
				alias: 'multiline',
				inside: {
					'interpolation': {
						pattern: /\$(?:[a-z_]\w*|\{[^{}]*\})/i,
						inside: interpolationInside
					},
					'string': /[\s\S]+/
				}
			},
			{
				pattern: /"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,
				alias: 'singleline',
				inside: {
					'interpolation': {
						pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,
						lookbehind: true,
						inside: interpolationInside
					},
					'string': /[\s\S]+/
				}
			}
		],
		'char': {
			// https://kotlinlang.org/spec/expressions.html#character-literals
			pattern: /'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,
			greedy: true
		}
	});

	delete Prism.languages.kotlin['string'];

	Prism.languages.insertBefore('kotlin', 'keyword', {
		'annotation': {
			pattern: /\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,
			alias: 'builtin'
		}
	});

	Prism.languages.insertBefore('kotlin', 'function', {
		'label': {
			pattern: /\b\w+@|@\w+\b/,
			alias: 'symbol'
		}
	});

	Prism.languages.kt = Prism.languages.kotlin;
	Prism.languages.kts = Prism.languages.kotlin;
}(Prism));
Yxx~!function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism);Efxr/* eslint-disable regexp/no-dupe-characters-character-class */
(function (Prism) {

	/**
	 * Regular expression for characters that are not allowed in identifiers.
	 *
	 * @type {string}
	 */
	var nonId = /\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source;

	/**
	 * Surround a regular expression for IDs with patterns for non-ID sequences.
	 *
	 * @param {string} pattern A regular expression for identifiers.
	 * @param {string} [flags] The regular expression flags.
	 * @returns {RegExp} A wrapped regular expression for identifiers.
	 */
	function wrapId(pattern, flags) {
		return RegExp(pattern.replace(/<nonId>/g, nonId), flags);
	}

	Prism.languages.kumir = {
		'comment': {
			pattern: /\|.*/
		},

		'prolog': {
			pattern: /#.*/,
			greedy: true
		},

		'string': {
			pattern: /"[^\n\r"]*"|'[^\n\r']*'/,
			greedy: true
		},

		'boolean': {
			pattern: wrapId(/(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)/.source),
			lookbehind: true
		},

		'operator-word': {
			pattern: wrapId(/(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)/.source),
			lookbehind: true,
			alias: 'keyword'
		},

		'system-variable': {
			pattern: wrapId(/(^|[<nonId>])знач(?=[<nonId>]|$)/.source),
			lookbehind: true,
			alias: 'keyword'
		},

		'type': [
			{
				pattern: wrapId(/(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[<nonId>]|$)/.source),
				lookbehind: true,
				alias: 'builtin'
			},
			{
				pattern: wrapId(/(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)/.source),
				lookbehind: true,
				alias: 'important'
			}
		],

		/**
		 * Should be performed after searching for type names because of "таб".
		 * "таб" is a reserved word, but never used without a preceding type name.
		 * "НАЗНАЧИТЬ", "Фввод", and "Фвывод" are not reserved words.
		 */
		'keyword': {
			pattern: wrapId(/(^|[<nonId>])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)/.source),
			lookbehind: true
		},

		/** Should be performed after searching for reserved words. */
		'name': {
			// eslint-disable-next-line regexp/no-super-linear-backtracking
			pattern: wrapId(/(^|[<nonId>])[^\d<nonId>][^<nonId>]*(?:\x20+[^<nonId>]+)*(?=[<nonId>]|$)/.source),
			lookbehind: true
		},

		/** Should be performed after searching for names. */
		'number': {
			pattern: wrapId(/(^|[<nonId>])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[<nonId>]|$)/.source, 'i'),
			lookbehind: true
		},

		/** Should be performed after searching for words. */
		'punctuation': /:=|[(),:;\[\]]/,

		/**
		 * Should be performed after searching for
		 * - numeric constants (because of "+" and "-");
		 * - punctuation marks (because of ":=" and "=").
		 */
		'operator-char': {
			pattern: /\*\*?|<[=>]?|>=?|[-+/=]/,
			alias: 'operator'
		}
	};

	Prism.languages.kum = Prism.languages.kumir;

}(Prism));
*_гexS!function(n){function o(n,o){return RegExp(n.replace(/<nonId>/g,"\\s\\x00-\\x1f\\x22-\\x2f\\x3a-\\x3f\\x5b-\\x5e\\x60\\x7b-\\x7e"),o)}n.languages.kumir={comment:{pattern:/\|.*/},prolog:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^\n\r"]*"|'[^\n\r']*'/,greedy:!0},boolean:{pattern:o("(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)"),lookbehind:!0},"operator-word":{pattern:o("(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)"),lookbehind:!0,alias:"keyword"},"system-variable":{pattern:o("(^|[<nonId>])знач(?=[<nonId>]|$)"),lookbehind:!0,alias:"keyword"},type:[{pattern:o("(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\\x20*таб)?(?=[<nonId>]|$)"),lookbehind:!0,alias:"builtin"},{pattern:o("(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)"),lookbehind:!0,alias:"important"}],keyword:{pattern:o("(^|[<nonId>])(?:алг|арг(?:\\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\\x20+|_)исп)?|кц(?:(?:\\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)"),lookbehind:!0},name:{pattern:o("(^|[<nonId>])[^\\d<nonId>][^<nonId>]*(?:\\x20+[^<nonId>]+)*(?=[<nonId>]|$)"),lookbehind:!0},number:{pattern:o("(^|[<nonId>])(?:\\B\\$[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)(?=[<nonId>]|$)","i"),lookbehind:!0},punctuation:/:=|[(),:;\[\]]/,"operator-char":{pattern:/\*\*?|<[=>]?|>=?|[-+/=]/,alias:"operator"}},n.languages.kum=n.languages.kumir}(Prism);uGƾkxAPrism.languages.kusto = {
	'comment': {
		pattern: /\/\/.*/,
		greedy: true
	},
	'string': {
		pattern: /```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,
		greedy: true
	},

	'verb': {
		pattern: /(\|\s*)[a-z][\w-]*/i,
		lookbehind: true,
		alias: 'keyword'
	},

	'command': {
		pattern: /\.[a-z][a-z\d-]*\b/,
		alias: 'keyword'
	},

	'class-name': /\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,
	'keyword': /\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,
	'boolean': /\b(?:false|null|true)\b/,

	'function': /\b[a-z_]\w*(?=\s*\()/,

	'datetime': [
		{
			// RFC 822 + RFC 850
			pattern: /\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,
			alias: 'number'
		},
		{
			// ISO 8601
			pattern: /[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,
			alias: 'number'
		}
	],
	'number': /\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,

	'operator': /=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,
	'punctuation': /[()\[\]{},;.:]/
};
I>_x Prism.languages.kusto={comment:{pattern:/\/\/.*/,greedy:!0},string:{pattern:/```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,greedy:!0},verb:{pattern:/(\|\s*)[a-z][\w-]*/i,lookbehind:!0,alias:"keyword"},command:{pattern:/\.[a-z][a-z\d-]*\b/,alias:"keyword"},"class-name":/\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,keyword:/\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,boolean:/\b(?:false|null|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/,datetime:[{pattern:/\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,alias:"number"},{pattern:/[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,alias:"number"}],number:/\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,operator:/=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,punctuation:/[()\[\]{},;.:]/};))jx](function (Prism) {
	var funcPattern = /\\(?:[^a-z()[\]]|[a-z*]+)/i;
	var insideEqu = {
		'equation-command': {
			pattern: funcPattern,
			alias: 'regex'
		}
	};

	Prism.languages.latex = {
		'comment': /%.*/,
		// the verbatim environment prints whitespace to the document
		'cdata': {
			pattern: /(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
			lookbehind: true
		},
		/*
		 * equations can be between $$ $$ or $ $ or \( \) or \[ \]
		 * (all are multiline)
		 */
		'equation': [
			{
				pattern: /\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,
				inside: insideEqu,
				alias: 'string'
			},
			{
				pattern: /(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
				lookbehind: true,
				inside: insideEqu,
				alias: 'string'
			}
		],
		/*
		 * arguments which are keywords or references are highlighted
		 * as keywords
		 */
		'keyword': {
			pattern: /(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
			lookbehind: true
		},
		'url': {
			pattern: /(\\url\{)[^}]+(?=\})/,
			lookbehind: true
		},
		/*
		 * section or chapter headlines are highlighted as bold so that
		 * they stand out more
		 */
		'headline': {
			pattern: /(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
			lookbehind: true,
			alias: 'class-name'
		},
		'function': {
			pattern: funcPattern,
			alias: 'selector'
		},
		'punctuation': /[[\]{}&]/
	};

	Prism.languages.tex = Prism.languages.latex;
	Prism.languages.context = Prism.languages.latex;
}(Prism));
5*?x !function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};a.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/},a.languages.tex=a.languages.latex,a.languages.context=a.languages.latex}(Prism);Er`x(function (Prism) {
	Prism.languages.latte = {
		'comment': /^\{\*[\s\S]*/,
		'latte-tag': {
			// https://latte.nette.org/en/tags
			pattern: /(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,
			lookbehind: true,
			alias: 'important'
		},
		'delimiter': {
			pattern: /^\{\/?|\}$/,
			alias: 'punctuation'
		},
		'php': {
			pattern: /\S(?:[\s\S]*\S)?/,
			alias: 'language-php',
			inside: Prism.languages.php
		}
	};

	var markupLatte = Prism.languages.extend('markup', {});
	Prism.languages.insertBefore('inside', 'attr-value', {
		'n-attr': {
			pattern: /n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,
			inside: {
				'attr-name': {
					pattern: /^[^\s=]+/,
					alias: 'important'
				},
				'attr-value': {
					pattern: /=[\s\S]+/,
					inside: {
						'punctuation': [
							/^=/,
							{
								pattern: /^(\s*)["']|["']$/,
								lookbehind: true
							}
						],
						'php': {
							pattern: /\S(?:[\s\S]*\S)?/,
							inside: Prism.languages.php
						}
					}
				},
			}
		},
	}, markupLatte.tag);

	Prism.hooks.add('before-tokenize', function (env) {
		if (env.language !== 'latte') {
			return;
		}
		var lattePattern = /\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g;
		Prism.languages['markup-templating'].buildPlaceholders(env, 'latte', lattePattern);
		env.grammar = markupLatte;
	});

	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'latte');
	});

}(Prism));
kBx"!function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var t=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},t.tag),a.hooks.add("before-tokenize",(function(e){"latte"===e.language&&(a.languages["markup-templating"].buildPlaceholders(e,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g),e.grammar=t)})),a.hooks.add("after-tokenize",(function(t){a.languages["markup-templating"].tokenizePlaceholders(t,"latte")}))}(Prism);]iURx'/* FIXME :
 :extend() is not handled specifically : its highlighting is buggy.
 Mixin usage must be inside a ruleset to be highlighted.
 At-rules (e.g. import) containing interpolations are buggy.
 Detached rulesets are highlighted as at-rules.
 A comment before a mixin usage prevents the latter to be properly highlighted.
 */

Prism.languages.less = Prism.languages.extend('css', {
	'comment': [
		/\/\*[\s\S]*?\*\//,
		{
			pattern: /(^|[^\\])\/\/.*/,
			lookbehind: true
		}
	],
	'atrule': {
		pattern: /@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,
		inside: {
			'punctuation': /[:()]/
		}
	},
	// selectors and mixins are considered the same
	'selector': {
		pattern: /(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,
		inside: {
			// mixin parameters
			'variable': /@+[\w-]+/
		}
	},

	'property': /(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,
	'operator': /[+\-*\/]/
});

Prism.languages.insertBefore('less', 'property', {
	'variable': [
		// Variable declaration (the colon must be consumed!)
		{
			pattern: /@[\w-]+\s*:/,
			inside: {
				'punctuation': /:/
			}
		},

		// Variable usage
		/@@?[\w-]+/
	],
	'mixin-usage': {
		pattern: /([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,
		lookbehind: true,
		alias: 'function'
	}
});
!*xSPrism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}});_zx\(function (Prism) {

	var schemeExpression = /\((?:[^();"#\\]|\\[\s\S]|;.*(?!.)|"(?:[^"\\]|\\.)*"|#(?:\{(?:(?!#\})[\s\S])*#\}|[^{])|<expr>)*\)/.source;
	// allow for up to pow(2, recursivenessLog2) many levels of recursive brace expressions
	// For some reason, this can't be 4
	var recursivenessLog2 = 5;
	for (var i = 0; i < recursivenessLog2; i++) {
		schemeExpression = schemeExpression.replace(/<expr>/g, function () { return schemeExpression; });
	}
	schemeExpression = schemeExpression.replace(/<expr>/g, /[^\s\S]/.source);


	var lilypond = Prism.languages.lilypond = {
		'comment': /%(?:(?!\{).*|\{[\s\S]*?%\})/,
		'embedded-scheme': {
			pattern: RegExp(/(^|[=\s])#(?:"(?:[^"\\]|\\.)*"|[^\s()"]*(?:[^\s()]|<expr>))/.source.replace(/<expr>/g, function () { return schemeExpression; }), 'm'),
			lookbehind: true,
			greedy: true,
			inside: {
				'scheme': {
					pattern: /^(#)[\s\S]+$/,
					lookbehind: true,
					alias: 'language-scheme',
					inside: {
						'embedded-lilypond': {
							pattern: /#\{[\s\S]*?#\}/,
							greedy: true,
							inside: {
								'punctuation': /^#\{|#\}$/,
								'lilypond': {
									pattern: /[\s\S]+/,
									alias: 'language-lilypond',
									inside: null // see below
								}
							}
						},
						rest: Prism.languages.scheme
					}
				},
				'punctuation': /#/
			}
		},
		'string': {
			pattern: /"(?:[^"\\]|\\.)*"/,
			greedy: true
		},
		'class-name': {
			pattern: /(\\new\s+)[\w-]+/,
			lookbehind: true
		},
		'keyword': {
			pattern: /\\[a-z][-\w]*/i,
			inside: {
				'punctuation': /^\\/
			}
		},
		'operator': /[=|]|<<|>>/,
		'punctuation': {
			pattern: /(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,
			lookbehind: true
		},
		'number': /\b\d+(?:\/\d+)?\b/
	};

	lilypond['embedded-scheme'].inside['scheme'].inside['embedded-lilypond'].inside['lilypond'].inside = lilypond;

	Prism.languages.ly = lilypond;

}(Prism));
oAKx@!function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|<expr>)*\\)',i=0;i<5;i++)n=n.replace(/<expr>/g,(function(){return n}));n=n.replace(/<expr>/g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|<expr>))'.replace(/<expr>/g,(function(){return n})),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism);%x^Prism.languages['linker-script'] = {
	'comment': {
		pattern: /(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,
		lookbehind: true,
		greedy: true
	},
	'identifier': {
		pattern: /"[^"\r\n]*"/,
		greedy: true
	},

	'location-counter': {
		pattern: /\B\.\B/,
		alias: 'important'
	},

	'section': {
		pattern: /(^|[^\w*])\.\w+\b/,
		lookbehind: true,
		alias: 'keyword'
	},
	'function': /\b[A-Z][A-Z_]*(?=\s*\()/,

	'number': /\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,

	'operator': />>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,
	'punctuation': /[(){},;]/
};

Prism.languages['ld'] = Prism.languages['linker-script'];
	xPrism.languages["linker-script"]={comment:{pattern:/(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,lookbehind:!0,greedy:!0},identifier:{pattern:/"[^"\r\n]*"/,greedy:!0},"location-counter":{pattern:/\B\.\B/,alias:"important"},section:{pattern:/(^|[^\w*])\.\w+\b/,lookbehind:!0,alias:"keyword"},function:/\b[A-Z][A-Z_]*(?=\s*\()/,number:/\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,operator:/>>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,punctuation:/[(){},;]/},Prism.languages.ld=Prism.languages["linker-script"];gnxA
Prism.languages.liquid = {
	'comment': {
		pattern: /(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,
		lookbehind: true
	},
	'delimiter': {
		pattern: /^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,
		alias: 'punctuation'
	},
	'string': {
		pattern: /"[^"]*"|'[^']*'/,
		greedy: true
	},
	'keyword': /\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,
	'object': /\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,
	'function': [
		{
			pattern: /(\|\s*)\w+/,
			lookbehind: true,
			alias: 'filter'
		},
		{
			// array functions
			pattern: /(\.\s*)(?:first|last|size)/,
			lookbehind: true
		}
	],
	'boolean': /\b(?:false|nil|true)\b/,
	'range': {
		pattern: /\.\./,
		alias: 'operator'
	},
	// https://github.com/Shopify/liquid/blob/698f5e0d967423e013f6169d9111bd969bd78337/lib/liquid/lexer.rb#L21
	'number': /\b\d+(?:\.\d+)?\b/,
	'operator': /[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,
	'punctuation': /[.,\[\]()]/,
	'empty': {
		pattern: /\bempty\b/,
		alias: 'keyword'
	},
};

Prism.hooks.add('before-tokenize', function (env) {
	var liquidPattern = /\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g;
	var insideRaw = false;

	Prism.languages['markup-templating'].buildPlaceholders(env, 'liquid', liquidPattern, function (match) {
		var tagMatch = /^\{%-?\s*(\w+)/.exec(match);
		if (tagMatch) {
			var tag = tagMatch[1];
			if (tag === 'raw' && !insideRaw) {
				insideRaw = true;
				return true;
			} else if (tag === 'endraw') {
				insideRaw = false;
				return true;
			}
		}

		return !insideRaw;
	});
});

Prism.hooks.add('after-tokenize', function (env) {
	Prism.languages['markup-templating'].tokenizePlaceholders(env, 'liquid');
});
>x/Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",(function(e){var t=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,(function(e){var n=/^\{%-?\s*(\w+)/.exec(e);if(n){var i=n[1];if("raw"===i&&!t)return t=!0,!0;if("endraw"===i)return t=!1,!0}return!t}))})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")}));"x>(function (Prism) {
	/**
	 * Functions to construct regular expressions
	 * e.g. (interactive ... or (interactive)
	 *
	 * @param {string} name
	 * @returns {RegExp}
	 */
	function simple_form(name) {
		return RegExp(/(\()/.source + '(?:' + name + ')' + /(?=[\s\)])/.source);
	}
	/**
	 * booleans and numbers
	 *
	 * @param {string} pattern
	 * @returns {RegExp}
	 */
	function primitive(pattern) {
		return RegExp(/([\s([])/.source + '(?:' + pattern + ')' + /(?=[\s)])/.source);
	}

	// Patterns in regular expressions

	// Symbol name. See https://www.gnu.org/software/emacs/manual/html_node/elisp/Symbol-Type.html
	// & and : are excluded as they are usually used for special purposes
	var symbol = /(?!\d)[-+*/~!@$%^=<>{}\w]+/.source;
	// symbol starting with & used in function arguments
	var marker = '&' + symbol;
	// Open parenthesis for look-behind
	var par = '(\\()';
	var endpar = '(?=\\))';
	// End the pattern with look-ahead space
	var space = '(?=\\s)';
	var nestedPar = /(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/.source;

	var language = {
		// Three or four semicolons are considered a heading.
		// See https://www.gnu.org/software/emacs/manual/html_node/elisp/Comment-Tips.html
		heading: {
			pattern: /;;;.*/,
			alias: ['comment', 'title']
		},
		comment: /;.*/,
		string: {
			pattern: /"(?:[^"\\]|\\.)*"/,
			greedy: true,
			inside: {
				argument: /[-A-Z]+(?=[.,\s])/,
				symbol: RegExp('`' + symbol + "'")
			}
		},
		'quoted-symbol': {
			pattern: RegExp("#?'" + symbol),
			alias: ['variable', 'symbol']
		},
		'lisp-property': {
			pattern: RegExp(':' + symbol),
			alias: 'property'
		},
		splice: {
			pattern: RegExp(',@?' + symbol),
			alias: ['symbol', 'variable']
		},
		keyword: [
			{
				pattern: RegExp(
					par +
						'(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)' +
						space
				),
				lookbehind: true
			},
			{
				pattern: RegExp(
					par + '(?:append|by|collect|concat|do|finally|for|in|return)' + space
				),
				lookbehind: true
			},
		],
		declare: {
			pattern: simple_form(/declare/.source),
			lookbehind: true,
			alias: 'keyword'
		},
		interactive: {
			pattern: simple_form(/interactive/.source),
			lookbehind: true,
			alias: 'keyword'
		},
		boolean: {
			pattern: primitive(/nil|t/.source),
			lookbehind: true
		},
		number: {
			pattern: primitive(/[-+]?\d+(?:\.\d*)?/.source),
			lookbehind: true
		},
		defvar: {
			pattern: RegExp(par + 'def(?:const|custom|group|var)\\s+' + symbol),
			lookbehind: true,
			inside: {
				keyword: /^def[a-z]+/,
				variable: RegExp(symbol)
			}
		},
		defun: {
			pattern: RegExp(par + /(?:cl-)?(?:defmacro|defun\*?)\s+/.source + symbol + /\s+\(/.source + nestedPar + /\)/.source),
			lookbehind: true,
			greedy: true,
			inside: {
				keyword: /^(?:cl-)?def\S+/,
				// See below, this property needs to be defined later so that it can
				// reference the language object.
				arguments: null,
				function: {
					pattern: RegExp('(^\\s)' + symbol),
					lookbehind: true
				},
				punctuation: /[()]/
			}
		},
		lambda: {
			pattern: RegExp(par + 'lambda\\s+\\(\\s*(?:&?' + symbol + '(?:\\s+&?' + symbol + ')*\\s*)?\\)'),
			lookbehind: true,
			greedy: true,
			inside: {
				keyword: /^lambda/,
				// See below, this property needs to be defined later so that it can
				// reference the language object.
				arguments: null,
				punctuation: /[()]/
			}
		},
		car: {
			pattern: RegExp(par + symbol),
			lookbehind: true
		},
		punctuation: [
			// open paren, brackets, and close paren
			/(?:['`,]?\(|[)\[\]])/,
			// cons
			{
				pattern: /(\s)\.(?=\s)/,
				lookbehind: true
			},
		]
	};

	var arg = {
		'lisp-marker': RegExp(marker),
		'varform': {
			pattern: RegExp(/\(/.source + symbol + /\s+(?=\S)/.source + nestedPar + /\)/.source),
			inside: language
		},
		'argument': {
			pattern: RegExp(/(^|[\s(])/.source + symbol),
			lookbehind: true,
			alias: 'variable'
		},
		rest: language
	};

	var forms = '\\S+(?:\\s+\\S+)*';

	var arglist = {
		pattern: RegExp(par + nestedPar + endpar),
		lookbehind: true,
		inside: {
			'rest-vars': {
				pattern: RegExp('&(?:body|rest)\\s+' + forms),
				inside: arg
			},
			'other-marker-vars': {
				pattern: RegExp('&(?:aux|optional)\\s+' + forms),
				inside: arg
			},
			keys: {
				pattern: RegExp('&key\\s+' + forms + '(?:\\s+&allow-other-keys)?'),
				inside: arg
			},
			argument: {
				pattern: RegExp(symbol),
				alias: 'variable'
			},
			punctuation: /[()]/
		}
	};

	language['lambda'].inside.arguments = arglist;
	language['defun'].inside.arguments = Prism.util.clone(arglist);
	language['defun'].inside.arguments.inside.sublist = arglist;

	Prism.languages.lisp = language;
	Prism.languages.elisp = language;
	Prism.languages.emacs = language;
	Prism.languages['emacs-lisp'] = language;
}(Prism));
_x
!function(e){function n(e){return RegExp("(\\()(?:"+e+")(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])(?:"+e+")(?=[\\s)])")}var t="(?!\\d)[-+*/~!@$%^=<>{}\\w]+",r="(\\()",i="(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*",s={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp("(\\()(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)(?=\\s)"),lookbehind:!0},{pattern:RegExp("(\\()(?:append|by|collect|concat|do|finally|for|in|return)(?=\\s)"),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("nil|t"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp("(\\()def(?:const|custom|group|var)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp("(\\()(?:cl-)?(?:defmacro|defun\\*?)\\s+"+t+"\\s+\\("+i+"\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp("(\\()lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},l={"lisp-marker":RegExp("&(?!\\d)[-+*/~!@$%^=<>{}\\w]+"),varform:{pattern:RegExp("\\("+t+"\\s+(?=\\S)"+i+"\\)"),inside:s},argument:{pattern:RegExp("(^|[\\s(])"+t),lookbehind:!0,alias:"variable"},rest:s},o="\\S+(?:\\s+\\S+)*",p={pattern:RegExp(r+i+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+o),inside:l},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+o),inside:l},keys:{pattern:RegExp("&key\\s+"+o+"(?:\\s+&allow-other-keys)?"),inside:l},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};s.lambda.inside.arguments=p,s.defun.inside.arguments=e.util.clone(p),s.defun.inside.arguments.inside.sublist=p,e.languages.lisp=s,e.languages.elisp=s,e.languages.emacs=s,e.languages["emacs-lisp"]=s}(Prism);p;xoPrism.languages.livescript = {
	'comment': [
		{
			pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
			lookbehind: true
		},
		{
			pattern: /(^|[^\\])#.*/,
			lookbehind: true
		}
	],
	'interpolated-string': {
		/* Look-behind and look-ahead prevents wrong behavior of the greedy pattern
		* forcing it to match """-quoted string when it would otherwise match "-quoted first. */
		pattern: /(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,
		lookbehind: true,
		greedy: true,
		inside: {
			'variable': {
				pattern: /(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,
				lookbehind: true
			},
			'interpolation': {
				pattern: /(^|[^\\])#\{[^}]+\}/m,
				lookbehind: true,
				inside: {
					'interpolation-punctuation': {
						pattern: /^#\{|\}$/,
						alias: 'variable'
					}
					// See rest below
				}
			},
			'string': /[\s\S]+/
		}
	},
	'string': [
		{
			pattern: /('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,
			greedy: true
		},
		{
			pattern: /<\[[\s\S]*?\]>/,
			greedy: true
		},
		/\\[^\s,;\])}]+/
	],
	'regex': [
		{
			pattern: /\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,
			greedy: true,
			inside: {
				'comment': {
					pattern: /(^|[^\\])#.*/,
					lookbehind: true
				}
			}
		},
		{
			pattern: /\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,
			greedy: true
		}
	],
	'keyword': {
		pattern: /(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,
		lookbehind: true
	},
	'keyword-operator': {
		pattern: /(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,
		lookbehind: true,
		alias: 'operator'
	},
	'boolean': {
		pattern: /(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,
		lookbehind: true
	},
	'argument': {
		// Don't match .&. nor &&
		pattern: /(^|(?!\.&\.)[^&])&(?!&)\d*/m,
		lookbehind: true,
		alias: 'variable'
	},
	'number': /\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,
	'identifier': /[a-z_](?:-?[a-z]|[\d_])*/i,
	'operator': [
		// Spaced .
		{
			pattern: /( )\.(?= )/,
			lookbehind: true
		},
		// Full list, in order:
		// .= .~ .. ...
		// .&. .^. .<<. .>>. .>>>.
		// := :: ::=
		// &&
		// || |>
		// < << <<< <<<<
		// <- <-- <-! <--!
		// <~ <~~ <~! <~~!
		// <| <= <?
		// > >> >= >?
		// - -- -> -->
		// + ++
		// @ @@
		// % %%
		// * **
		// ! != !~=
		// !~> !~~>
		// !-> !-->
		// ~ ~> ~~> ~=
		// = ==
		// ^ ^^
		// / ?
		/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<<?<?|--?!?|~~?!?|[|=?])?|>[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/
	],
	'punctuation': /[(){}\[\]|.,:;`]/
};

Prism.languages.livescript['interpolated-string'].inside['interpolation'].inside.rest = Prism.languages.livescript;
hzxWPrism.languages.livescript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"interpolated-string":{pattern:/(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,lookbehind:!0},interpolation:{pattern:/(^|[^\\])#\{[^}]+\}/m,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^#\{|\}$/,alias:"variable"}}},string:/[\s\S]+/}},string:[{pattern:/('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/<\[[\s\S]*?\]>/,greedy:!0},/\\[^\s,;\])}]+/],regex:[{pattern:/\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,greedy:!0,inside:{comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0}}},{pattern:/\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,greedy:!0}],keyword:{pattern:/(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,lookbehind:!0},"keyword-operator":{pattern:/(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,lookbehind:!0,alias:"operator"},boolean:{pattern:/(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,lookbehind:!0},argument:{pattern:/(^|(?!\.&\.)[^&])&(?!&)\d*/m,lookbehind:!0,alias:"variable"},number:/\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,identifier:/[a-z_](?:-?[a-z]|[\d_])*/i,operator:[{pattern:/( )\.(?= )/,lookbehind:!0},/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<<?<?|--?!?|~~?!?|[|=?])?|>[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/],punctuation:/[(){}\[\]|.,:;`]/},Prism.languages.livescript["interpolated-string"].inside.interpolation.inside.rest=Prism.languages.livescript;=\@(xq(function (Prism) {
	Prism.languages.llvm = {
		'comment': /;.*/,
		'string': {
			pattern: /"[^"]*"/,
			greedy: true,
		},
		'boolean': /\b(?:false|true)\b/,
		'variable': /[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,
		'label': /(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,
		'type': {
			pattern: /\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,
			alias: 'class-name',
		},
		'keyword': /\b[a-z_][a-z_0-9]*\b/,
		'number': /[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,
		'punctuation': /[{}[\];(),.!*=<>]/,
	};
}(Prism));
RM"x%!function(a){a.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}}(Prism);Gx'// This is a language definition for generic log files.
// Since there is no one log format, this language definition has to support all formats to some degree.
//
// Based on https://github.com/MTDL9/vim-log-highlighting

Prism.languages.log = {
	'string': {
		// Single-quoted strings must not be confused with plain text. E.g. Can't isn't Susan's Chris' toy
		pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,
		greedy: true,
	},

	'exception': {
		pattern: /(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,
		lookbehind: true,
		greedy: true,
		alias: ['javastacktrace', 'language-javastacktrace'],
		inside: Prism.languages['javastacktrace'] || {
			'keyword': /\bat\b/,
			'function': /[a-z_][\w$]*(?=\()/,
			'punctuation': /[.:()]/
		}
	},

	'level': [
		{
			pattern: /\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,
			alias: ['error', 'important']
		},
		{
			pattern: /\b(?:WARN|WARNING|WRN)\b/,
			alias: ['warning', 'important']
		},
		{
			pattern: /\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,
			alias: ['info', 'keyword']
		},
		{
			pattern: /\b(?:DBG|DEBUG|FINE)\b/,
			alias: ['debug', 'keyword']
		},
		{
			pattern: /\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,
			alias: ['trace', 'comment']
		}
	],

	'property': {
		pattern: /((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,
		lookbehind: true
	},

	'separator': {
		pattern: /(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,
		lookbehind: true,
		alias: 'comment'
	},

	'url': /\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,
	'email': {
		pattern: /(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,
		lookbehind: true,
		alias: 'url'
	},

	'ip-address': {
		pattern: /\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,
		alias: 'constant'
	},
	'mac-address': {
		pattern: /\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,
		alias: 'constant'
	},
	'domain': {
		pattern: /(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,
		lookbehind: true,
		alias: 'constant'
	},

	'uuid': {
		pattern: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
		alias: 'constant'
	},
	'hash': {
		pattern: /\b(?:[a-f0-9]{32}){1,2}\b/i,
		alias: 'constant'
	},

	'file-path': {
		pattern: /\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,
		lookbehind: true,
		greedy: true,
		alias: 'string'
	},

	'date': {
		pattern: RegExp(
			/\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source +
			'|' +
			/\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source +
			'|' +
			/\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source,
			'i'
		),
		alias: 'number'
	},
	'time': {
		pattern: /\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,
		alias: 'number'
	},

	'boolean': /\b(?:false|null|true)\b/i,
	'number': {
		pattern: /(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,
		lookbehind: true
	},

	'operator': /[;:?<=>~/@!$%&+\-|^(){}*#]/,
	'punctuation': /[\[\].,]/
};
Iwᇷx	8Prism.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},exception:{pattern:/(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,lookbehind:!0,greedy:!0,alias:["javastacktrace","language-javastacktrace"],inside:Prism.languages.javastacktrace||{keyword:/\bat\b/,function:/[a-z_][\w$]*(?=\()/,punctuation:/[.:()]/}},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp("\\b\\d{4}[-/]\\d{2}[-/]\\d{2}(?:T(?=\\d{1,2}:)|(?=\\s\\d{1,2}:))|\\b\\d{1,4}[-/ ](?:\\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\\d{2,4}T?\\b|\\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\\s{1,2}\\d{1,2}\\b","i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/};eBlWxtPrism.languages.lolcode = {
	'comment': [
		/\bOBTW\s[\s\S]*?\sTLDR\b/,
		/\bBTW.+/
	],
	'string': {
		pattern: /"(?::.|[^":])*"/,
		inside: {
			'variable': /:\{[^}]+\}/,
			'symbol': [
				/:\([a-f\d]+\)/i,
				/:\[[^\]]+\]/,
				/:[)>o":]/
			]
		},
		greedy: true
	},
	'number': /(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,
	'symbol': {
		pattern: /(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,
		lookbehind: true,
		inside: {
			'keyword': /A(?=\s)/
		}
	},
	'label': {
		pattern: /((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,
		lookbehind: true,
		alias: 'string'
	},
	'function': {
		pattern: /((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,
		lookbehind: true
	},
	'keyword': [
		{
			pattern: /(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,
			lookbehind: true
		},
		/'Z(?=\s|,|$)/
	],
	'boolean': {
		pattern: /(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,
		lookbehind: true
	},
	'variable': {
		pattern: /(^|\s)IT(?=\s|,|$)/,
		lookbehind: true
	},
	'operator': {
		pattern: /(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,
		lookbehind: true
	},
	'punctuation': /\.{3}|…|,|!/
};
fHxsPrism.languages.lolcode={comment:[/\bOBTW\s[\s\S]*?\sTLDR\b/,/\bBTW.+/],string:{pattern:/"(?::.|[^":])*"/,inside:{variable:/:\{[^}]+\}/,symbol:[/:\([a-f\d]+\)/i,/:\[[^\]]+\]/,/:[)>o":]/]},greedy:!0},number:/(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,symbol:{pattern:/(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\s)/}},label:{pattern:/((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,lookbehind:!0,alias:"string"},function:{pattern:/((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,lookbehind:!0},keyword:[{pattern:/(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,lookbehind:!0},/'Z(?=\s|,|$)/],boolean:{pattern:/(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\s)IT(?=\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,lookbehind:!0},punctuation:/\.{3}|…|,|!/};5v/x	Prism.languages.lua = {
	'comment': /^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,
	// \z may be used to skip the following space
	'string': {
		pattern: /(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,
		greedy: true
	},
	'number': /\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,
	'keyword': /\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,
	'function': /(?!\d)\w+(?=\s*(?:[({]))/,
	'operator': [
		/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,
		{
			// Match ".." but don't break "..."
			pattern: /(^|[^.])\.\.(?!\.)/,
			lookbehind: true
		}
	],
	'punctuation': /[\[\](){},;]|\.+|:+/
};
F%xVPrism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/};iRx#Prism.languages.magma = {
	'output': {
		pattern: /^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,
		lookbehind: true,
		greedy: true
	},

	'comment': {
		pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
		greedy: true
	},
	'string': {
		pattern: /(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,
		lookbehind: true,
		greedy: true
	},

	// http://magma.maths.usyd.edu.au/magma/handbook/text/82
	'keyword': /\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,
	'boolean': /\b(?:false|true)\b/,

	'generator': {
		pattern: /\b[a-z_]\w*(?=\s*<)/i,
		alias: 'class-name'
	},
	'function': /\b[a-z_]\w*(?=\s*\()/i,

	'number': {
		pattern: /(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,
		lookbehind: true
	},

	'operator': /->|[-+*/^~!|#=]|:=|\.\./,
	'punctuation': /[()[\]{}<>,;.:]/
};
btFxhPrism.languages.magma={output:{pattern:/^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,boolean:/\b(?:false|true)\b/,generator:{pattern:/\b[a-z_]\w*(?=\s*<)/i,alias:"class-name"},function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},operator:/->|[-+*/^~!|#=]|:=|\.\./,punctuation:/[()[\]{}<>,;.:]/};(CCx3Prism.languages.makefile = {
	'comment': {
		pattern: /(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,
		lookbehind: true
	},
	'string': {
		pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},

	'builtin-target': {
		pattern: /\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,
		alias: 'builtin'
	},

	'target': {
		pattern: /^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,
		alias: 'symbol',
		inside: {
			'variable': /\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/
		}
	},
	'variable': /\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,

	// Directives
	'keyword': /-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,

	'function': {
		pattern: /(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,
		lookbehind: true
	},
	'operator': /(?:::|[?:+!])?=|[|@]/,
	'punctuation': /[:;(){}]/
};
b:xTPrism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/};QSx)H(function (Prism) {

	// Allow only one line break
	var inner = /(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;

	/**
	 * This function is intended for the creation of the bold or italic pattern.
	 *
	 * This also adds a lookbehind group to the given pattern to ensure that the pattern is not backslash-escaped.
	 *
	 * _Note:_ Keep in mind that this adds a capturing group.
	 *
	 * @param {string} pattern
	 * @returns {RegExp}
	 */
	function createInline(pattern) {
		pattern = pattern.replace(/<inner>/g, function () { return inner; });
		return RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + '(?:' + pattern + ')');
	}


	var tableCell = /(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source;
	var tableRow = /\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g, function () { return tableCell; });
	var tableLine = /\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;


	Prism.languages.markdown = Prism.languages.extend('markup', {});
	Prism.languages.insertBefore('markdown', 'prolog', {
		'front-matter-block': {
			pattern: /(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,
			lookbehind: true,
			greedy: true,
			inside: {
				'punctuation': /^---|---$/,
				'front-matter': {
					pattern: /\S+(?:\s+\S+)*/,
					alias: ['yaml', 'language-yaml'],
					inside: Prism.languages.yaml
				}
			}
		},
		'blockquote': {
			// > ...
			pattern: /^>(?:[\t ]*>)*/m,
			alias: 'punctuation'
		},
		'table': {
			pattern: RegExp('^' + tableRow + tableLine + '(?:' + tableRow + ')*', 'm'),
			inside: {
				'table-data-rows': {
					pattern: RegExp('^(' + tableRow + tableLine + ')(?:' + tableRow + ')*$'),
					lookbehind: true,
					inside: {
						'table-data': {
							pattern: RegExp(tableCell),
							inside: Prism.languages.markdown
						},
						'punctuation': /\|/
					}
				},
				'table-line': {
					pattern: RegExp('^(' + tableRow + ')' + tableLine + '$'),
					lookbehind: true,
					inside: {
						'punctuation': /\||:?-{3,}:?/
					}
				},
				'table-header-row': {
					pattern: RegExp('^' + tableRow + '$'),
					inside: {
						'table-header': {
							pattern: RegExp(tableCell),
							alias: 'important',
							inside: Prism.languages.markdown
						},
						'punctuation': /\|/
					}
				}
			}
		},
		'code': [
			{
				// Prefixed by 4 spaces or 1 tab and preceded by an empty line
				pattern: /((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,
				lookbehind: true,
				alias: 'keyword'
			},
			{
				// ```optional language
				// code block
				// ```
				pattern: /^```[\s\S]*?^```$/m,
				greedy: true,
				inside: {
					'code-block': {
						pattern: /^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,
						lookbehind: true
					},
					'code-language': {
						pattern: /^(```).+/,
						lookbehind: true
					},
					'punctuation': /```/
				}
			}
		],
		'title': [
			{
				// title 1
				// =======

				// title 2
				// -------
				pattern: /\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,
				alias: 'important',
				inside: {
					punctuation: /==+$|--+$/
				}
			},
			{
				// # title 1
				// ###### title 6
				pattern: /(^\s*)#.+/m,
				lookbehind: true,
				alias: 'important',
				inside: {
					punctuation: /^#+|#+$/
				}
			}
		],
		'hr': {
			// ***
			// ---
			// * * *
			// -----------
			pattern: /(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,
			lookbehind: true,
			alias: 'punctuation'
		},
		'list': {
			// * item
			// + item
			// - item
			// 1. item
			pattern: /(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,
			lookbehind: true,
			alias: 'punctuation'
		},
		'url-reference': {
			// [id]: http://example.com "Optional title"
			// [id]: http://example.com 'Optional title'
			// [id]: http://example.com (Optional title)
			// [id]: <http://example.com> "Optional title"
			pattern: /!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,
			inside: {
				'variable': {
					pattern: /^(!?\[)[^\]]+/,
					lookbehind: true
				},
				'string': /(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,
				'punctuation': /^[\[\]!:]|[<>]/
			},
			alias: 'url'
		},
		'bold': {
			// **strong**
			// __strong__

			// allow one nested instance of italic text using the same delimiter
			pattern: createInline(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),
			lookbehind: true,
			greedy: true,
			inside: {
				'content': {
					pattern: /(^..)[\s\S]+(?=..$)/,
					lookbehind: true,
					inside: {} // see below
				},
				'punctuation': /\*\*|__/
			}
		},
		'italic': {
			// *em*
			// _em_

			// allow one nested instance of bold text using the same delimiter
			pattern: createInline(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),
			lookbehind: true,
			greedy: true,
			inside: {
				'content': {
					pattern: /(^.)[\s\S]+(?=.$)/,
					lookbehind: true,
					inside: {} // see below
				},
				'punctuation': /[*_]/
			}
		},
		'strike': {
			// ~~strike through~~
			// ~strike~
			// eslint-disable-next-line regexp/strict
			pattern: createInline(/(~~?)(?:(?!~)<inner>)+\2/.source),
			lookbehind: true,
			greedy: true,
			inside: {
				'content': {
					pattern: /(^~~?)[\s\S]+(?=\1$)/,
					lookbehind: true,
					inside: {} // see below
				},
				'punctuation': /~~?/
			}
		},
		'code-snippet': {
			// `code`
			// ``code``
			pattern: /(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,
			lookbehind: true,
			greedy: true,
			alias: ['code', 'keyword']
		},
		'url': {
			// [example](http://example.com "Optional title")
			// [example][id]
			// [example] [id]
			pattern: createInline(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),
			lookbehind: true,
			greedy: true,
			inside: {
				'operator': /^!/,
				'content': {
					pattern: /(^\[)[^\]]+(?=\])/,
					lookbehind: true,
					inside: {} // see below
				},
				'variable': {
					pattern: /(^\][ \t]?\[)[^\]]+(?=\]$)/,
					lookbehind: true
				},
				'url': {
					pattern: /(^\]\()[^\s)]+/,
					lookbehind: true
				},
				'string': {
					pattern: /(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,
					lookbehind: true
				}
			}
		}
	});

	['url', 'bold', 'italic', 'strike'].forEach(function (token) {
		['url', 'bold', 'italic', 'strike', 'code-snippet'].forEach(function (inside) {
			if (token !== inside) {
				Prism.languages.markdown[token].inside.content.inside[inside] = Prism.languages.markdown[inside];
			}
		});
	});

	Prism.hooks.add('after-tokenize', function (env) {
		if (env.language !== 'markdown' && env.language !== 'md') {
			return;
		}

		function walkTokens(tokens) {
			if (!tokens || typeof tokens === 'string') {
				return;
			}

			for (var i = 0, l = tokens.length; i < l; i++) {
				var token = tokens[i];

				if (token.type !== 'code') {
					walkTokens(token.content);
					continue;
				}

				/*
				 * Add the correct `language-xxxx` class to this code block. Keep in mind that the `code-language` token
				 * is optional. But the grammar is defined so that there is only one case we have to handle:
				 *
				 * token.content = [
				 *     <span class="punctuation">```</span>,
				 *     <span class="code-language">xxxx</span>,
				 *     '\n', // exactly one new lines (\r or \n or \r\n)
				 *     <span class="code-block">...</span>,
				 *     '\n', // exactly one new lines again
				 *     <span class="punctuation">```</span>
				 * ];
				 */

				var codeLang = token.content[1];
				var codeBlock = token.content[3];

				if (codeLang && codeBlock &&
					codeLang.type === 'code-language' && codeBlock.type === 'code-block' &&
					typeof codeLang.content === 'string') {

					// this might be a language that Prism does not support

					// do some replacements to support C++, C#, and F#
					var lang = codeLang.content.replace(/\b#/g, 'sharp').replace(/\b\+\+/g, 'pp');
					// only use the first word
					lang = (/[a-z][\w-]*/i.exec(lang) || [''])[0].toLowerCase();
					var alias = 'language-' + lang;

					// add alias
					if (!codeBlock.alias) {
						codeBlock.alias = [alias];
					} else if (typeof codeBlock.alias === 'string') {
						codeBlock.alias = [codeBlock.alias, alias];
					} else {
						codeBlock.alias.push(alias);
					}
				}
			}
		}

		walkTokens(env.tokens);
	});

	Prism.hooks.add('wrap', function (env) {
		if (env.type !== 'code-block') {
			return;
		}

		var codeLang = '';
		for (var i = 0, l = env.classes.length; i < l; i++) {
			var cls = env.classes[i];
			var match = /language-(.+)/.exec(cls);
			if (match) {
				codeLang = match[1];
				break;
			}
		}

		var grammar = Prism.languages[codeLang];

		if (!grammar) {
			if (codeLang && codeLang !== 'none' && Prism.plugins.autoloader) {
				var id = 'md-' + new Date().valueOf() + '-' + Math.floor(Math.random() * 1e16);
				env.attributes['id'] = id;

				Prism.plugins.autoloader.loadLanguages(codeLang, function () {
					var ele = document.getElementById(id);
					if (ele) {
						ele.innerHTML = Prism.highlight(ele.textContent, Prism.languages[codeLang], codeLang);
					}
				});
			}
		} else {
			env.content = Prism.highlight(textContent(env.content), grammar, codeLang);
		}
	});

	var tagPattern = RegExp(Prism.languages.markup.tag.pattern.source, 'gi');

	/**
	 * A list of known entity names.
	 *
	 * This will always be incomplete to save space. The current list is the one used by lowdash's unescape function.
	 *
	 * @see {@link https://github.com/lodash/lodash/blob/2da024c3b4f9947a48517639de7560457cd4ec6c/unescape.js#L2}
	 */
	var KNOWN_ENTITY_NAMES = {
		'amp': '&',
		'lt': '<',
		'gt': '>',
		'quot': '"',
	};

	// IE 11 doesn't support `String.fromCodePoint`
	var fromCodePoint = String.fromCodePoint || String.fromCharCode;

	/**
	 * Returns the text content of a given HTML source code string.
	 *
	 * @param {string} html
	 * @returns {string}
	 */
	function textContent(html) {
		// remove all tags
		var text = html.replace(tagPattern, '');

		// decode known entities
		text = text.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi, function (m, code) {
			code = code.toLowerCase();

			if (code[0] === '#') {
				var value;
				if (code[1] === 'x') {
					value = parseInt(code.slice(2), 16);
				} else {
					value = Number(code.slice(1));
				}

				return fromCodePoint(value);
			} else {
				var known = KNOWN_ENTITY_NAMES[code];
				if (known) {
					return known;
				}

				// unable to decode
				return m;
			}
		});

		return text;
	}

	Prism.languages.md = Prism.languages.markdown;

}(Prism));
D쾲x!function(n){function e(n){return n=n.replace(/<inner>/g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\\b|\\*\\*(?:(?!\\*)<inner>|\\*(?:(?!\\*)<inner>)+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\\b|\\*(?:(?!\\*)<inner>|\\*\\*(?:(?!\\*)<inner>)+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~)<inner>)+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\])<inner>)+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\])<inner>)+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t<a;t++){var i=e[t];if("code"===i.type){var r=i.content[1],o=i.content[3];if(r&&o&&"code-language"===r.type&&"code-block"===o.type&&"string"==typeof r.content){var l=r.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),s="language-"+(l=(/[a-z][\w-]*/i.exec(l)||[""])[0].toLowerCase());o.alias?"string"==typeof o.alias?o.alias=[o.alias,s]:o.alias.push(s):o.alias=[s]}}else n(i.content)}}(n.tokens)})),n.hooks.add("wrap",(function(e){if("code-block"===e.type){for(var t="",a=0,i=e.classes.length;a<i;a++){var s=e.classes[a],d=/language-(.+)/.exec(s);if(d){t=d[1];break}}var p=n.languages[t];if(p)e.content=n.highlight(e.content.replace(r,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(n,e){var t;return"#"===(e=e.toLowerCase())[0]?(t="x"===e[1]?parseInt(e.slice(2),16):Number(e.slice(1)),l(t)):o[e]||n})),p,t);else if(t&&"none"!==t&&n.plugins.autoloader){var u="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());e.attributes.id=u,n.plugins.autoloader.loadLanguages(t,(function(){var e=document.getElementById(u);e&&(e.innerHTML=n.highlight(e.textContent,n.languages[t],t))}))}}}));var r=RegExp(n.languages.markup.tag.pattern.source,"gi"),o={amp:"&",lt:"<",gt:">",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism);o]x/(function (Prism) {

	/**
	 * Returns the placeholder for the given language id and index.
	 *
	 * @param {string} language
	 * @param {string|number} index
	 * @returns {string}
	 */
	function getPlaceholder(language, index) {
		return '___' + language.toUpperCase() + index + '___';
	}

	Object.defineProperties(Prism.languages['markup-templating'] = {}, {
		buildPlaceholders: {
			/**
			 * Tokenize all inline templating expressions matching `placeholderPattern`.
			 *
			 * If `replaceFilter` is provided, only matches of `placeholderPattern` for which `replaceFilter` returns
			 * `true` will be replaced.
			 *
			 * @param {object} env The environment of the `before-tokenize` hook.
			 * @param {string} language The language id.
			 * @param {RegExp} placeholderPattern The matches of this pattern will be replaced by placeholders.
			 * @param {(match: string) => boolean} [replaceFilter]
			 */
			value: function (env, language, placeholderPattern, replaceFilter) {
				if (env.language !== language) {
					return;
				}

				var tokenStack = env.tokenStack = [];

				env.code = env.code.replace(placeholderPattern, function (match) {
					if (typeof replaceFilter === 'function' && !replaceFilter(match)) {
						return match;
					}
					var i = tokenStack.length;
					var placeholder;

					// Check for existing strings
					while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) {
						++i;
					}

					// Create a sparse array
					tokenStack[i] = match;

					return placeholder;
				});

				// Switch the grammar to markup
				env.grammar = Prism.languages.markup;
			}
		},
		tokenizePlaceholders: {
			/**
			 * Replace placeholders with proper tokens after tokenizing.
			 *
			 * @param {object} env The environment of the `after-tokenize` hook.
			 * @param {string} language The language id.
			 */
			value: function (env, language) {
				if (env.language !== language || !env.tokenStack) {
					return;
				}

				// Switch the grammar back
				env.grammar = Prism.languages[language];

				var j = 0;
				var keys = Object.keys(env.tokenStack);

				function walkTokens(tokens) {
					for (var i = 0; i < tokens.length; i++) {
						// all placeholders are replaced already
						if (j >= keys.length) {
							break;
						}

						var token = tokens[i];
						if (typeof token === 'string' || (token.content && typeof token.content === 'string')) {
							var k = keys[j];
							var t = env.tokenStack[k];
							var s = typeof token === 'string' ? token : token.content;
							var placeholder = getPlaceholder(language, k);

							var index = s.indexOf(placeholder);
							if (index > -1) {
								++j;

								var before = s.substring(0, index);
								var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t);
								var after = s.substring(index + placeholder.length);

								var replacement = [];
								if (before) {
									replacement.push.apply(replacement, walkTokens([before]));
								}
								replacement.push(middle);
								if (after) {
									replacement.push.apply(replacement, walkTokens([after]));
								}

								if (typeof token === 'string') {
									tokens.splice.apply(tokens, [i, 1].concat(replacement));
								} else {
									token.content = replacement;
								}
							}
						} else if (token.content /* && typeof token.content !== 'string' */) {
							walkTokens(token.content);
						}
					}

					return tokens;
				}

				walkTokens(env.tokens);
			}
		}
	});

}(Prism));
)'Bx&!function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,a,r,o){if(t.language===a){var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,a){if(t.language===a&&t.tokenStack){t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){for(var u=0;u<i.length&&!(r>=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism);5&u¿xpPrism.languages.markup = {
	'comment': {
		pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
		greedy: true
	},
	'prolog': {
		pattern: /<\?[\s\S]+?\?>/,
		greedy: true
	},
	'doctype': {
		// https://www.w3.org/TR/xml/#NT-doctypedecl
		pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
		greedy: true,
		inside: {
			'internal-subset': {
				pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
				lookbehind: true,
				greedy: true,
				inside: null // see below
			},
			'string': {
				pattern: /"[^"]*"|'[^']*'/,
				greedy: true
			},
			'punctuation': /^<!|>$|[[\]]/,
			'doctype-tag': /^DOCTYPE/i,
			'name': /[^\s<>'"]+/
		}
	},
	'cdata': {
		pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
		greedy: true
	},
	'tag': {
		pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
		greedy: true,
		inside: {
			'tag': {
				pattern: /^<\/?[^\s>\/]+/,
				inside: {
					'punctuation': /^<\/?/,
					'namespace': /^[^\s>\/:]+:/
				}
			},
			'special-attr': [],
			'attr-value': {
				pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
				inside: {
					'punctuation': [
						{
							pattern: /^=/,
							alias: 'attr-equals'
						},
						{
							pattern: /^(\s*)["']|["']$/,
							lookbehind: true
						}
					]
				}
			},
			'punctuation': /\/?>/,
			'attr-name': {
				pattern: /[^\s>\/]+/,
				inside: {
					'namespace': /^[^\s>\/:]+:/
				}
			}

		}
	},
	'entity': [
		{
			pattern: /&[\da-z]{1,8};/i,
			alias: 'named-entity'
		},
		/&#x?[\da-f]{1,8};/i
	]
};

Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] =
	Prism.languages.markup['entity'];
Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;

// Plugin to make entity title show the real entity, idea by Roman Komarov
Prism.hooks.add('wrap', function (env) {

	if (env.type === 'entity') {
		env.attributes['title'] = env.content.replace(/&amp;/, '&');
	}
});

Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {
	/**
	 * Adds an inlined language to markup.
	 *
	 * An example of an inlined language is CSS with `<style>` tags.
	 *
	 * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as
	 * case insensitive.
	 * @param {string} lang The language key.
	 * @example
	 * addInlined('style', 'css');
	 */
	value: function addInlined(tagName, lang) {
		var includedCdataInside = {};
		includedCdataInside['language-' + lang] = {
			pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
			lookbehind: true,
			inside: Prism.languages[lang]
		};
		includedCdataInside['cdata'] = /^<!\[CDATA\[|\]\]>$/i;

		var inside = {
			'included-cdata': {
				pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
				inside: includedCdataInside
			}
		};
		inside['language-' + lang] = {
			pattern: /[\s\S]+/,
			inside: Prism.languages[lang]
		};

		var def = {};
		def[tagName] = {
			pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),
			lookbehind: true,
			greedy: true,
			inside: inside
		};

		Prism.languages.insertBefore('markup', 'cdata', def);
	}
});
Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', {
	/**
	 * Adds an pattern to highlight languages embedded in HTML attributes.
	 *
	 * An example of an inlined language is CSS with `style` attributes.
	 *
	 * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as
	 * case insensitive.
	 * @param {string} lang The language key.
	 * @example
	 * addAttribute('style', 'css');
	 */
	value: function (attrName, lang) {
		Prism.languages.markup.tag.inside['special-attr'].push({
			pattern: RegExp(
				/(^|["'\s])/.source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,
				'i'
			),
			lookbehind: true,
			inside: {
				'attr-name': /^[^\s=]+/,
				'attr-value': {
					pattern: /=[\s\S]+/,
					inside: {
						'value': {
							pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
							lookbehind: true,
							alias: [lang, 'language-' + lang],
							inside: Prism.languages[lang]
						},
						'punctuation': [
							{
								pattern: /^=/,
								alias: 'attr-equals'
							},
							/"|'/
						]
					}
				}
			}
		});
	}
});

Prism.languages.html = Prism.languages.markup;
Prism.languages.mathml = Prism.languages.markup;
Prism.languages.svg = Prism.languages.markup;

Prism.languages.xml = Prism.languages.extend('markup', {});
Prism.languages.ssml = Prism.languages.xml;
Prism.languages.atom = Prism.languages.xml;
Prism.languages.rss = Prism.languages.xml;
Syx"Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;mZxQ// https://www.stata.com/manuals/m.pdf

(function (Prism) {

	var orgType = /\b(?:(?:col|row)?vector|matrix|scalar)\b/.source;
	var type = /\bvoid\b|<org>|\b(?:complex|numeric|pointer(?:\s*\([^()]*\))?|real|string|(?:class|struct)\s+\w+|transmorphic)(?:\s*<org>)?/.source
		.replace(/<org>/g, orgType);

	Prism.languages.mata = {
		'comment': {
			pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,
			greedy: true
		},
		'string': {
			pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
			greedy: true
		},

		'class-name': {
			pattern: /(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,
			lookbehind: true
		},
		'type': {
			pattern: RegExp(type),
			alias: 'class-name',
			inside: {
				'punctuation': /[()]/,
				'keyword': /\b(?:class|function|struct|void)\b/
			}
		},
		'keyword': /\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,
		'constant': /\bNULL\b/,

		'number': {
			pattern: /(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,
			lookbehind: true
		},
		'missing': {
			pattern: /(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,
			lookbehind: true,
			alias: 'symbol'
		},

		'function': /\b[a-z_]\w*(?=\s*\()/i,

		'operator': /\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,
		'punctuation': /[()[\]{},;.]/
	};

}(Prism));
΂IHxs!function(t){var e="\\bvoid\\b|<org>|\\b(?:complex|numeric|pointer(?:\\s*\\([^()]*\\))?|real|string|(?:class|struct)\\s+\\w+|transmorphic)(?:\\s*<org>)?".replace(/<org>/g,"\\b(?:(?:col|row)?vector|matrix|scalar)\\b");t.languages.mata={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,lookbehind:!0},type:{pattern:RegExp(e),alias:"class-name",inside:{punctuation:/[()]/,keyword:/\b(?:class|function|struct|void)\b/}},keyword:/\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,constant:/\bNULL\b/,number:{pattern:/(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,lookbehind:!0},missing:{pattern:/(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,lookbehind:!0,alias:"symbol"},function:/\b[a-z_]\w*(?=\s*\()/i,operator:/\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,punctuation:/[()[\]{},;.]/}}(Prism);j"O"x"Prism.languages.matlab = {
	'comment': [
		/%\{[\s\S]*?\}%/,
		/%.+/
	],
	'string': {
		pattern: /\B'(?:''|[^'\r\n])*'/,
		greedy: true
	},
	// FIXME We could handle imaginary numbers as a whole
	'number': /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,
	'keyword': /\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,
	'function': /\b(?!\d)\w+(?=\s*\()/,
	'operator': /\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,
	'punctuation': /\.{3}|[.,;\[\](){}!]/
};
>8YxOPrism.languages.matlab={comment:[/%\{[\s\S]*?\}%/,/%.+/],string:{pattern:/\B'(?:''|[^'\r\n])*'/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,keyword:/\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,function:/\b(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/};p߹x(function (Prism) {

	var keywords = /\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;


	Prism.languages.maxscript = {
		'comment': {
			pattern: /\/\*[\s\S]*?(?:\*\/|$)|--.*/,
			greedy: true
		},
		'string': {
			pattern: /(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,
			lookbehind: true,
			greedy: true
		},
		'path': {
			pattern: /\$(?:[\w/\\.*?]|'[^']*')*/,
			greedy: true,
			alias: 'string'
		},

		'function-call': {
			pattern: RegExp(
				'((?:' + (
					// start of line
					/^/.source +
					'|' +
					// operators and other language constructs
					/[;=<>+\-*/^({\[]/.source +
					'|' +
					// keywords as part of statements
					/\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\b/.source
				) + ')[ \t]*)' +

				'(?!' + keywords.source + ')' + /[a-z_]\w*\b/.source +

				'(?=[ \t]*(?:' + (
					// variable
					'(?!' + keywords.source + ')' + /[a-z_]/.source +
					'|' +
					// number
					/\d|-\.?\d/.source +
					'|' +
					// other expressions or literals
					/[({'"$@#?]/.source
				) + '))',
				'im'
			),
			lookbehind: true,
			greedy: true,
			alias: 'function'
		},

		'function-definition': {
			pattern: /(\b(?:fn|function)\s+)\w+\b/i,
			lookbehind: true,
			alias: 'function'
		},

		'argument': {
			pattern: /\b[a-z_]\w*(?=:)/i,
			alias: 'attr-name'
		},

		'keyword': keywords,
		'boolean': /\b(?:false|true)\b/,

		'time': {
			pattern: /(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,
			lookbehind: true,
			alias: 'number'
		},
		'number': [
			{
				pattern: /(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,
				lookbehind: true
			},
			/\b(?:e|pi)\b/
		],

		'constant': /\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,
		'color': {
			pattern: /\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,
			alias: 'constant'
		},

		'operator': /[-+*/<>=!]=?|[&^?]|#(?!\()/,
		'punctuation': /[()\[\]{}.:,;]|#(?=\()|\\$/m
	};

}(Prism));
)U-bx+!function(t){var e=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;t.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:^|[;=<>+\\-*/^({\\[]|\\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\\b)[ \t]*)(?!"+e.source+")[a-z_]\\w*\\b(?=[ \t]*(?:(?!"+e.source+")[a-z_]|\\d|-\\.?\\d|[({'\"$@#?]))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:e,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}}(Prism);h1Cx7Prism.languages.mel = {
	'comment': {
		pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
		greedy: true
	},
	'code': {
		pattern: /`(?:\\.|[^\\`])*`/,
		greedy: true,
		alias: 'italic',
		inside: {
			'delimiter': {
				pattern: /^`|`$/,
				alias: 'punctuation'
			},
			'statement': {
				pattern: /[\s\S]+/,
				inside: null // see below
			}
		}
	},
	'string': {
		pattern: /"(?:\\.|[^\\"\r\n])*"/,
		greedy: true
	},
	'variable': /\$\w+/,
	'number': /\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,
	'flag': {
		pattern: /-[^\d\W]\w*/,
		alias: 'operator'
	},
	'keyword': /\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,
	'function': {
		pattern: /((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,
		lookbehind: true,
		greedy: true
	},

	'tensor-punctuation': {
		pattern: /<<|>>/,
		alias: 'punctuation'
	},
	'operator': /\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,
	'punctuation': /[.,:;?\[\](){}]/
};

Prism.languages.mel['code'].inside['statement'].inside = Prism.languages.mel;
M6xcPrism.languages.mel={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},code:{pattern:/`(?:\\.|[^\\`])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},statement:{pattern:/[\s\S]+/,inside:null}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:{pattern:/((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,lookbehind:!0,greedy:!0},"tensor-punctuation":{pattern:/<<|>>/,alias:"punctuation"},operator:/\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,punctuation:/[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.statement.inside=Prism.languages.mel; 39x"Prism.languages.mermaid = {
	'comment': {
		pattern: /%%.*/,
		greedy: true
	},

	'style': {
		pattern: /^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,
		lookbehind: true,
		inside: {
			'property': /\b\w[\w-]*(?=[ \t]*:)/,
			'operator': /:/,
			'punctuation': /,/
		}
	},

	'inter-arrow-label': {
		pattern: /([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,
		lookbehind: true,
		greedy: true,
		inside: {
			'arrow': {
				pattern: /(?:\.+->?|--+[->]|==+[=>])$/,
				alias: 'operator'
			},
			'label': {
				pattern: /^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,
				lookbehind: true,
				alias: 'property'
			},
			'arrow-head': {
				pattern: /^\S+/,
				alias: ['arrow', 'operator']
			}
		}
	},

	'arrow': [
		// This might look complex but it really isn't.
		// There are many possible arrows (see tests) and it's impossible to fit all of them into one pattern. The
		// problem is that we only have one lookbehind per pattern. However, we cannot disallow too many arrow
		// characters in the one lookbehind because that would create too many false negatives. So we have to split the
		// arrows into different patterns.
		{
			// ER diagram
			pattern: /(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,
			lookbehind: true,
			alias: 'operator'
		},
		{
			// flow chart
			// (?:==+|--+|-\.*-)
			pattern: /(^|[^<>ox.=-])(?:[<ox](?:==+|--+|-\.*-)[>ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,
			lookbehind: true,
			alias: 'operator'
		},
		{
			// sequence diagram
			pattern: /(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,
			lookbehind: true,
			alias: 'operator'
		},
		{
			// class diagram
			pattern: /(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,
			lookbehind: true,
			alias: 'operator'
		},
	],

	'label': {
		pattern: /(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,
		lookbehind: true,
		greedy: true,
		alias: 'property'
	},

	'text': {
		pattern: /(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,
		alias: 'string'
	},
	'string': {
		pattern: /"[^"\r\n]*"/,
		greedy: true
	},

	'annotation': {
		pattern: /<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,
		alias: 'important'
	},

	'keyword': [
		// This language has both case-sensitive and case-insensitive keywords
		{
			pattern: /(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,
			lookbehind: true,
			greedy: true
		},
		{
			pattern: /(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,
			lookbehind: true,
			greedy: true
		}
	],

	'entity': /#[a-z0-9]+;/,

	'operator': {
		pattern: /(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,
		lookbehind: true
	},
	'punctuation': /[(){};]/
};
x Prism.languages.mermaid={comment:{pattern:/%%.*/,greedy:!0},style:{pattern:/^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,lookbehind:!0,inside:{property:/\b\w[\w-]*(?=[ \t]*:)/,operator:/:/,punctuation:/,/}},"inter-arrow-label":{pattern:/([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,lookbehind:!0,greedy:!0,inside:{arrow:{pattern:/(?:\.+->?|--+[->]|==+[=>])$/,alias:"operator"},label:{pattern:/^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,lookbehind:!0,alias:"property"},"arrow-head":{pattern:/^\S+/,alias:["arrow","operator"]}}},arrow:[{pattern:/(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>ox.=-])(?:[<ox](?:==+|--+|-\.*-)[>ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,lookbehind:!0,alias:"operator"}],label:{pattern:/(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,lookbehind:!0,greedy:!0,alias:"property"},text:{pattern:/(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,alias:"string"},string:{pattern:/"[^"\r\n]*"/,greedy:!0},annotation:{pattern:/<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,alias:"important"},keyword:[{pattern:/(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,lookbehind:!0,greedy:!0},{pattern:/(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,lookbehind:!0,greedy:!0}],entity:/#[a-z0-9]+;/,operator:{pattern:/(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,lookbehind:!0},punctuation:/[(){};]/};-x/Prism.languages.metafont = {
	// Syntax of METAFONT with the added (public) elements of PlainMETAFONT. Except for internal quantities they are expected to be rarely redefined. Freely inspired by the syntax of Christophe Grandsire for the Crimson Editor.
	'comment': {
		pattern: /%.*/,
		greedy: true
	},
	'string': {
		pattern: /"[^\r\n"]*"/,
		greedy: true
	},
	'number': /\d*\.?\d+/,
	'boolean': /\b(?:false|true)\b/,
	'punctuation': [
		/[,;()]/,
		{
			pattern: /(^|[^{}])(?:\{|\})(?![{}])/,
			lookbehind: true
		},
		{
			pattern: /(^|[^[])\[(?!\[)/,
			lookbehind: true
		},
		{
			pattern: /(^|[^\]])\](?!\])/,
			lookbehind: true
		}
	],
	'constant': [
		{
			pattern: /(^|[^!?])\?\?\?(?![!?])/,
			lookbehind: true
		},
		{
			pattern: /(^|[^/*\\])(?:\\|\\\\)(?![/*\\])/,
			lookbehind: true
		},
		/\b(?:_|blankpicture|bp|cc|cm|dd|ditto|down|eps|epsilon|fullcircle|halfcircle|identity|in|infinity|left|mm|nullpen|nullpicture|origin|pc|penrazor|penspeck|pensquare|penstroke|proof|pt|quartercircle|relax|right|smoke|unitpixel|unitsquare|up)\b/
	],
	'quantity': {
		pattern: /\b(?:autorounding|blacker|boundarychar|charcode|chardp|chardx|chardy|charext|charht|charic|charwd|currentwindow|day|designsize|displaying|fillin|fontmaking|granularity|hppp|join_radius|month|o_correction|pausing|pen_(?:bot|lft|rt|top)|pixels_per_inch|proofing|showstopping|smoothing|time|tolerance|tracingcapsules|tracingchoices|tracingcommands|tracingedges|tracingequations|tracingmacros|tracingonline|tracingoutput|tracingpens|tracingrestores|tracingspecs|tracingstats|tracingtitles|turningcheck|vppp|warningcheck|xoffset|year|yoffset)\b/,
		alias: 'keyword'
	},
	'command': {
		pattern: /\b(?:addto|batchmode|charlist|cull|display|errhelp|errmessage|errorstopmode|everyjob|extensible|fontdimen|headerbyte|inner|interim|let|ligtable|message|newinternal|nonstopmode|numspecial|openwindow|outer|randomseed|save|scrollmode|shipout|show|showdependencies|showstats|showtoken|showvariable|special)\b/,
		alias: 'builtin'
	},
	'operator': [
		{
			pattern: /(^|[^>=<:|])(?:<|<=|=|=:|\|=:|\|=:>|=:\|>|=:\||\|=:\||\|=:\|>|\|=:\|>>|>|>=|:|:=|<>|::|\|\|:)(?![>=<:|])/,
			lookbehind: true
		},
		{
			pattern: /(^|[^+-])(?:\+|\+\+|-{1,3}|\+-\+)(?![+-])/,
			lookbehind: true
		},
		{
			pattern: /(^|[^/*\\])(?:\*|\*\*|\/)(?![/*\\])/,
			lookbehind: true
		},
		{
			pattern: /(^|[^.])(?:\.{2,3})(?!\.)/,
			lookbehind: true
		},
		{
			pattern: /(^|[^@#&$])&(?![@#&$])/,
			lookbehind: true
		},
		/\b(?:and|not|or)\b/
	],
	'macro': {
		pattern: /\b(?:abs|beginchar|bot|byte|capsule_def|ceiling|change_width|clear_pen_memory|clearit|clearpen|clearxy|counterclockwise|cullit|cutdraw|cutoff|decr|define_blacker_pixels|define_corrected_pixels|define_good_x_pixels|define_good_y_pixels|define_horizontal_corrected_pixels|define_pixels|define_whole_blacker_pixels|define_whole_pixels|define_whole_vertical_blacker_pixels|define_whole_vertical_pixels|dir|direction|directionpoint|div|dotprod|downto|draw|drawdot|endchar|erase|fill|filldraw|fix_units|flex|font_coding_scheme|font_extra_space|font_identifier|font_normal_shrink|font_normal_space|font_normal_stretch|font_quad|font_size|font_slant|font_x_height|gfcorners|gobble|gobbled|good\.(?:bot|lft|rt|top|x|y)|grayfont|hide|hround|imagerules|incr|interact|interpath|intersectionpoint|inverse|italcorr|killtext|labelfont|labels|lft|loggingall|lowres_fix|makegrid|makelabel(?:\.(?:bot|lft|rt|top)(?:\.nodot)?)?|max|min|mod|mode_def|mode_setup|nodisplays|notransforms|numtok|openit|penlabels|penpos|pickup|proofoffset|proofrule|proofrulethickness|range|reflectedabout|rotatedabout|rotatedaround|round|rt|savepen|screenchars|screenrule|screenstrokes|shipit|showit|slantfont|softjoin|solve|stop|superellipse|tensepath|thru|titlefont|top|tracingall|tracingnone|undraw|undrawdot|unfill|unfilldraw|upto|vround)\b/,
		alias: 'function'
	},
	'builtin': /\b(?:ASCII|angle|char|cosd|decimal|directiontime|floor|hex|intersectiontimes|jobname|known|length|makepath|makepen|mexp|mlog|normaldeviate|oct|odd|pencircle|penoffset|point|postcontrol|precontrol|reverse|rotated|sind|sqrt|str|subpath|substring|totalweight|turningnumber|uniformdeviate|unknown|xpart|xxpart|xypart|ypart|yxpart|yypart)\b/,
	'keyword': /\b(?:also|at|atleast|begingroup|charexists|contour|controls|curl|cycle|def|delimiters|doublepath|dropping|dump|else|elseif|end|enddef|endfor|endgroup|endinput|exitif|exitunless|expandafter|fi|for|forever|forsuffixes|from|if|input|inwindow|keeping|kern|of|primarydef|quote|readstring|scaled|scantokens|secondarydef|shifted|skipto|slanted|step|tension|tertiarydef|to|transformed|until|vardef|withpen|withweight|xscaled|yscaled|zscaled)\b/,
	'type': {
		pattern: /\b(?:boolean|expr|numeric|pair|path|pen|picture|primary|secondary|string|suffix|tertiary|text|transform)\b/,
		alias: 'property'
	},
	'variable': {
		pattern: /(^|[^@#&$])(?:@#|#@|#|@)(?![@#&$])|\b(?:aspect_ratio|currentpen|currentpicture|currenttransform|d|extra_beginchar|extra_endchar|extra_setup|h|localfont|mag|mode|screen_cols|screen_rows|w|whatever|x|y|z)\b/,
		lookbehind: true
	}
};
zxiPrism.languages.metafont={comment:{pattern:/%.*/,greedy:!0},string:{pattern:/"[^\r\n"]*"/,greedy:!0},number:/\d*\.?\d+/,boolean:/\b(?:false|true)\b/,punctuation:[/[,;()]/,{pattern:/(^|[^{}])(?:\{|\})(?![{}])/,lookbehind:!0},{pattern:/(^|[^[])\[(?!\[)/,lookbehind:!0},{pattern:/(^|[^\]])\](?!\])/,lookbehind:!0}],constant:[{pattern:/(^|[^!?])\?\?\?(?![!?])/,lookbehind:!0},{pattern:/(^|[^/*\\])(?:\\|\\\\)(?![/*\\])/,lookbehind:!0},/\b(?:_|blankpicture|bp|cc|cm|dd|ditto|down|eps|epsilon|fullcircle|halfcircle|identity|in|infinity|left|mm|nullpen|nullpicture|origin|pc|penrazor|penspeck|pensquare|penstroke|proof|pt|quartercircle|relax|right|smoke|unitpixel|unitsquare|up)\b/],quantity:{pattern:/\b(?:autorounding|blacker|boundarychar|charcode|chardp|chardx|chardy|charext|charht|charic|charwd|currentwindow|day|designsize|displaying|fillin|fontmaking|granularity|hppp|join_radius|month|o_correction|pausing|pen_(?:bot|lft|rt|top)|pixels_per_inch|proofing|showstopping|smoothing|time|tolerance|tracingcapsules|tracingchoices|tracingcommands|tracingedges|tracingequations|tracingmacros|tracingonline|tracingoutput|tracingpens|tracingrestores|tracingspecs|tracingstats|tracingtitles|turningcheck|vppp|warningcheck|xoffset|year|yoffset)\b/,alias:"keyword"},command:{pattern:/\b(?:addto|batchmode|charlist|cull|display|errhelp|errmessage|errorstopmode|everyjob|extensible|fontdimen|headerbyte|inner|interim|let|ligtable|message|newinternal|nonstopmode|numspecial|openwindow|outer|randomseed|save|scrollmode|shipout|show|showdependencies|showstats|showtoken|showvariable|special)\b/,alias:"builtin"},operator:[{pattern:/(^|[^>=<:|])(?:<|<=|=|=:|\|=:|\|=:>|=:\|>|=:\||\|=:\||\|=:\|>|\|=:\|>>|>|>=|:|:=|<>|::|\|\|:)(?![>=<:|])/,lookbehind:!0},{pattern:/(^|[^+-])(?:\+|\+\+|-{1,3}|\+-\+)(?![+-])/,lookbehind:!0},{pattern:/(^|[^/*\\])(?:\*|\*\*|\/)(?![/*\\])/,lookbehind:!0},{pattern:/(^|[^.])(?:\.{2,3})(?!\.)/,lookbehind:!0},{pattern:/(^|[^@#&$])&(?![@#&$])/,lookbehind:!0},/\b(?:and|not|or)\b/],macro:{pattern:/\b(?:abs|beginchar|bot|byte|capsule_def|ceiling|change_width|clear_pen_memory|clearit|clearpen|clearxy|counterclockwise|cullit|cutdraw|cutoff|decr|define_blacker_pixels|define_corrected_pixels|define_good_x_pixels|define_good_y_pixels|define_horizontal_corrected_pixels|define_pixels|define_whole_blacker_pixels|define_whole_pixels|define_whole_vertical_blacker_pixels|define_whole_vertical_pixels|dir|direction|directionpoint|div|dotprod|downto|draw|drawdot|endchar|erase|fill|filldraw|fix_units|flex|font_coding_scheme|font_extra_space|font_identifier|font_normal_shrink|font_normal_space|font_normal_stretch|font_quad|font_size|font_slant|font_x_height|gfcorners|gobble|gobbled|good\.(?:bot|lft|rt|top|x|y)|grayfont|hide|hround|imagerules|incr|interact|interpath|intersectionpoint|inverse|italcorr|killtext|labelfont|labels|lft|loggingall|lowres_fix|makegrid|makelabel(?:\.(?:bot|lft|rt|top)(?:\.nodot)?)?|max|min|mod|mode_def|mode_setup|nodisplays|notransforms|numtok|openit|penlabels|penpos|pickup|proofoffset|proofrule|proofrulethickness|range|reflectedabout|rotatedabout|rotatedaround|round|rt|savepen|screenchars|screenrule|screenstrokes|shipit|showit|slantfont|softjoin|solve|stop|superellipse|tensepath|thru|titlefont|top|tracingall|tracingnone|undraw|undrawdot|unfill|unfilldraw|upto|vround)\b/,alias:"function"},builtin:/\b(?:ASCII|angle|char|cosd|decimal|directiontime|floor|hex|intersectiontimes|jobname|known|length|makepath|makepen|mexp|mlog|normaldeviate|oct|odd|pencircle|penoffset|point|postcontrol|precontrol|reverse|rotated|sind|sqrt|str|subpath|substring|totalweight|turningnumber|uniformdeviate|unknown|xpart|xxpart|xypart|ypart|yxpart|yypart)\b/,keyword:/\b(?:also|at|atleast|begingroup|charexists|contour|controls|curl|cycle|def|delimiters|doublepath|dropping|dump|else|elseif|end|enddef|endfor|endgroup|endinput|exitif|exitunless|expandafter|fi|for|forever|forsuffixes|from|if|input|inwindow|keeping|kern|of|primarydef|quote|readstring|scaled|scantokens|secondarydef|shifted|skipto|slanted|step|tension|tertiarydef|to|transformed|until|vardef|withpen|withweight|xscaled|yscaled|zscaled)\b/,type:{pattern:/\b(?:boolean|expr|numeric|pair|path|pen|picture|primary|secondary|string|suffix|tertiary|text|transform)\b/,alias:"property"},variable:{pattern:/(^|[^@#&$])(?:@#|#@|#|@)(?![@#&$])|\b(?:aspect_ratio|currentpen|currentpicture|currenttransform|d|extra_beginchar|extra_endchar|extra_setup|h|localfont|mag|mode|screen_cols|screen_rows|w|whatever|x|y|z)\b/,lookbehind:!0}};p0DxFPrism.languages.mizar = {
	'comment': /::.+/,
	'keyword': /@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,
	'parameter': {
		pattern: /\$(?:10|\d)/,
		alias: 'variable'
	},
	'variable': /\b\w+(?=:)/,
	'number': /(?:\b|-)\d+\b/,
	'operator': /\.\.\.|->|&|\.?=/,
	'punctuation': /\(#|#\)|[,:;\[\](){}]/
};
NAxPrism.languages.mizar={comment:/::.+/,keyword:/@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,parameter:{pattern:/\$(?:10|\d)/,alias:"variable"},variable:/\b\w+(?=:)/,number:/(?:\b|-)\d+\b/,operator:/\.\.\.|->|&|\.?=/,punctuation:/\(#|#\)|[,:;\[\](){}]/};vxi(function (Prism) {

	var operators = [
		// query and projection
		'$eq', '$gt', '$gte', '$in', '$lt', '$lte', '$ne', '$nin', '$and', '$not', '$nor', '$or',
		'$exists', '$type', '$expr', '$jsonSchema', '$mod', '$regex', '$text', '$where', '$geoIntersects',
		'$geoWithin', '$near', '$nearSphere', '$all', '$elemMatch', '$size', '$bitsAllClear', '$bitsAllSet',
		'$bitsAnyClear', '$bitsAnySet', '$comment', '$elemMatch', '$meta', '$slice',

		// update
		'$currentDate', '$inc', '$min', '$max', '$mul', '$rename', '$set', '$setOnInsert', '$unset',
		'$addToSet', '$pop', '$pull', '$push', '$pullAll', '$each', '$position', '$slice', '$sort', '$bit',

		// aggregation pipeline stages
		'$addFields', '$bucket', '$bucketAuto', '$collStats', '$count', '$currentOp', '$facet', '$geoNear',
		'$graphLookup', '$group', '$indexStats', '$limit', '$listLocalSessions', '$listSessions', '$lookup',
		'$match', '$merge', '$out', '$planCacheStats', '$project', '$redact', '$replaceRoot', '$replaceWith',
		'$sample', '$set', '$skip', '$sort', '$sortByCount', '$unionWith', '$unset', '$unwind', '$setWindowFields',

		// aggregation pipeline operators
		'$abs', '$accumulator', '$acos', '$acosh', '$add', '$addToSet', '$allElementsTrue', '$and',
		'$anyElementTrue', '$arrayElemAt', '$arrayToObject', '$asin', '$asinh', '$atan', '$atan2',
		'$atanh', '$avg', '$binarySize', '$bsonSize', '$ceil', '$cmp', '$concat', '$concatArrays', '$cond',
		'$convert', '$cos', '$dateFromParts', '$dateToParts', '$dateFromString', '$dateToString', '$dayOfMonth',
		'$dayOfWeek', '$dayOfYear', '$degreesToRadians', '$divide', '$eq', '$exp', '$filter', '$first',
		'$floor', '$function', '$gt', '$gte', '$hour', '$ifNull', '$in', '$indexOfArray', '$indexOfBytes',
		'$indexOfCP', '$isArray', '$isNumber', '$isoDayOfWeek', '$isoWeek', '$isoWeekYear', '$last',
		'$last', '$let', '$literal', '$ln', '$log', '$log10', '$lt', '$lte', '$ltrim', '$map', '$max',
		'$mergeObjects', '$meta', '$min', '$millisecond', '$minute', '$mod', '$month', '$multiply', '$ne',
		'$not', '$objectToArray', '$or', '$pow', '$push', '$radiansToDegrees', '$range', '$reduce',
		'$regexFind', '$regexFindAll', '$regexMatch', '$replaceOne', '$replaceAll', '$reverseArray', '$round',
		'$rtrim', '$second', '$setDifference', '$setEquals', '$setIntersection', '$setIsSubset', '$setUnion',
		'$size', '$sin', '$slice', '$split', '$sqrt', '$stdDevPop', '$stdDevSamp', '$strcasecmp', '$strLenBytes',
		'$strLenCP', '$substr', '$substrBytes', '$substrCP', '$subtract', '$sum', '$switch', '$tan',
		'$toBool', '$toDate', '$toDecimal', '$toDouble', '$toInt', '$toLong', '$toObjectId', '$toString',
		'$toLower', '$toUpper', '$trim', '$trunc', '$type', '$week', '$year', '$zip', '$count', '$dateAdd',
		'$dateDiff', '$dateSubtract', '$dateTrunc', '$getField', '$rand', '$sampleRate', '$setField', '$unsetField',

		// aggregation pipeline query modifiers
		'$comment', '$explain', '$hint', '$max', '$maxTimeMS', '$min', '$orderby', '$query',
		'$returnKey', '$showDiskLoc', '$natural',
	];

	var builtinFunctions = [
		'ObjectId',
		'Code',
		'BinData',
		'DBRef',
		'Timestamp',
		'NumberLong',
		'NumberDecimal',
		'MaxKey',
		'MinKey',
		'RegExp',
		'ISODate',
		'UUID',
	];

	operators = operators.map(function (operator) {
		return operator.replace('$', '\\$');
	});

	var operatorsSource = '(?:' + operators.join('|') + ')\\b';

	Prism.languages.mongodb = Prism.languages.extend('javascript', {});

	Prism.languages.insertBefore('mongodb', 'string', {
		'property': {
			pattern: /(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,
			greedy: true,
			inside: {
				'keyword': RegExp('^([\'"])?' + operatorsSource + '(?:\\1)?$')
			}
		}
	});

	Prism.languages.mongodb.string.inside = {
		url: {
			// url pattern
			pattern: /https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,
			greedy: true
		},
		entity: {
			// ipv4
			pattern: /\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,
			greedy: true
		}
	};

	Prism.languages.insertBefore('mongodb', 'constant', {
		'builtin': {
			pattern: RegExp('\\b(?:' + builtinFunctions.join('|') + ')\\b'),
			alias: 'keyword'
		}
	});

}(Prism));
Cx[!function($){var e=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],t="(?:"+(e=e.map((function($){return $.replace("$","\\$")}))).join("|")+")\\b";$.languages.mongodb=$.languages.extend("javascript",{}),$.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp("^(['\"])?"+t+"(?:\\1)?$")}}}),$.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},$.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"].join("|")+")\\b"),alias:"keyword"}})}(Prism);/>xPrism.languages.monkey = {
	'comment': {
		pattern: /^#Rem\s[\s\S]*?^#End|'.+/im,
		greedy: true
	},
	'string': {
		pattern: /"[^"\r\n]*"/,
		greedy: true,
	},
	'preprocessor': {
		pattern: /(^[ \t]*)#.+/m,
		lookbehind: true,
		greedy: true,
		alias: 'property'
	},

	'function': /\b\w+(?=\()/,
	'type-char': {
		pattern: /\b[?%#$]/,
		alias: 'class-name'
	},
	'number': {
		pattern: /((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,
		lookbehind: true
	},
	'keyword': /\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,
	'operator': /\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,
	'punctuation': /[.,:;()\[\]]/
};
GNѽ6xmPrism.languages.monkey={comment:{pattern:/^#Rem\s[\s\S]*?^#End|'.+/im,greedy:!0},string:{pattern:/"[^"\r\n]*"/,greedy:!0},preprocessor:{pattern:/(^[ \t]*)#.+/m,lookbehind:!0,greedy:!0,alias:"property"},function:/\b\w+(?=\()/,"type-char":{pattern:/\b[?%#$]/,alias:"class-name"},number:{pattern:/((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,lookbehind:!0},keyword:/\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,operator:/\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,punctuation:/[.,:;()\[\]]/};gB?xV	Prism.languages.moonscript = {
	'comment': /--.*/,
	'string': [
		{
			pattern: /'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,
			greedy: true
		},
		{
			pattern: /"[^"]*"/,
			greedy: true,
			inside: {
				'interpolation': {
					pattern: /#\{[^{}]*\}/,
					inside: {
						'moonscript': {
							pattern: /(^#\{)[\s\S]+(?=\})/,
							lookbehind: true,
							inside: null // see beow
						},
						'interpolation-punctuation': {
							pattern: /#\{|\}/,
							alias: 'punctuation'
						}
					}
				}
			}
		}
	],
	'class-name': [
		{
			pattern: /(\b(?:class|extends)[ \t]+)\w+/,
			lookbehind: true
		},
		// class-like names start with a capital letter
		/\b[A-Z]\w*/
	],
	'keyword': /\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,
	'variable': /@@?\w*/,
	'property': {
		pattern: /\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,
		lookbehind: true
	},
	'function': {
		pattern: /\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,
		inside: {
			'punctuation': /\./
		}
	},
	'boolean': /\b(?:false|true)\b/,
	'number': /(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,
	'operator': /\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,
	'punctuation': /[.,()[\]{}\\]/
};

Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside = Prism.languages.moonscript;

Prism.languages.moon = Prism.languages.moonscript;
;+B[xPrism.languages.moonscript={comment:/--.*/,string:[{pattern:/'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,greedy:!0},{pattern:/"[^"]*"/,greedy:!0,inside:{interpolation:{pattern:/#\{[^{}]*\}/,inside:{moonscript:{pattern:/(^#\{)[\s\S]+(?=\})/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/#\{|\}/,alias:"punctuation"}}}}}],"class-name":[{pattern:/(\b(?:class|extends)[ \t]+)\w+/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,variable:/@@?\w*/,property:{pattern:/\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,lookbehind:!0},function:{pattern:/\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,inside:{punctuation:/\./}},boolean:/\b(?:false|true)\b/,number:/(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,operator:/\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,punctuation:/[.,()[\]{}\\]/},Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside=Prism.languages.moonscript,Prism.languages.moon=Prism.languages.moonscript;x+// https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/index.html

Prism.languages.n1ql = {
	'comment': {
		pattern: /\/\*[\s\S]*?(?:$|\*\/)|--.*/,
		greedy: true,
	},
	'string': {
		pattern: /(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,
		greedy: true,
	},
	'identifier': {
		pattern: /`(?:\\[\s\S]|[^\\`]|``)*`/,
		greedy: true,
	},
	'parameter': /\$[\w.]+/,
	// https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/reservedwords.html#n1ql-reserved-words
	'keyword': /\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,
	'function': /\b[a-z_]\w*(?=\s*\()/i,
	'boolean': /\b(?:FALSE|TRUE)\b/i,
	'number': /(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,
	'operator': /[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,
	'punctuation': /[;[\](),.{}:]/
};
̝۶pxPrism.languages.n1ql={comment:{pattern:/\/\*[\s\S]*?(?:$|\*\/)|--.*/,greedy:!0},string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},parameter:/\$[\w.]+/,keyword:/\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:FALSE|TRUE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/};H1xPrism.languages.n4js = Prism.languages.extend('javascript', {
	// Keywords from N4JS language spec: https://numberfour.github.io/n4js/spec/N4JSSpec.html
	'keyword': /\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/
});

Prism.languages.insertBefore('n4js', 'constant', {
	// Annotations in N4JS spec: https://numberfour.github.io/n4js/spec/N4JSSpec.html#_annotations
	'annotation': {
		pattern: /@+\w+/,
		alias: 'operator'
	}
});

Prism.languages.n4jsd = Prism.languages.n4js;
\.x$xAPrism.languages.n4js=Prism.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),Prism.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),Prism.languages.n4jsd=Prism.languages.n4js; +x+Prism.languages['nand2tetris-hdl'] = {
	'comment': /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
	'keyword': /\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,
	'boolean': /\b(?:false|true)\b/,
	'function': /\b[A-Za-z][A-Za-z0-9]*(?=\()/,
	'number': /\b\d+\b/,
	'operator': /=|\.\./,
	'punctuation': /[{}[\];(),:]/
};
sYxPrism.languages["nand2tetris-hdl"]={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,keyword:/\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,boolean:/\b(?:false|true)\b/,function:/\b[A-Za-z][A-Za-z0-9]*(?=\()/,number:/\b\d+\b/,operator:/=|\.\./,punctuation:/[{}[\];(),:]/};?Uxk(function (Prism) {

	var expressionDef = /\{[^\r\n\[\]{}]*\}/;

	var params = {
		'quoted-string': {
			pattern: /"(?:[^"\\]|\\.)*"/,
			alias: 'operator'
		},
		'command-param-id': {
			pattern: /(\s)\w+:/,
			lookbehind: true,
			alias: 'property'
		},
		'command-param-value': [
			{
				pattern: expressionDef,
				alias: 'selector',
			},
			{
				pattern: /([\t ])\S+/,
				lookbehind: true,
				greedy: true,
				alias: 'operator',
			},
			{
				pattern: /\S(?:.*\S)?/,
				alias: 'operator',
			}
		]
	};

	Prism.languages.naniscript = {
		// ; ...
		'comment': {
			pattern: /^([\t ]*);.*/m,
			lookbehind: true,
		},
		// > ...
		// Define is a control line starting with '>' followed by a word, a space and a text.
		'define': {
			pattern: /^>.+/m,
			alias: 'tag',
			inside: {
				'value': {
					pattern: /(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,
					lookbehind: true,
					alias: 'operator'
				},
				'key': {
					pattern: /(^>)\w+/,
					lookbehind: true,
				}
			}
		},
		// # ...
		'label': {
			pattern: /^([\t ]*)#[\t ]*\w+[\t ]*$/m,
			lookbehind: true,
			alias: 'regex'
		},
		'command': {
			pattern: /^([\t ]*)@\w+(?=[\t ]|$).*/m,
			lookbehind: true,
			alias: 'function',
			inside: {
				'command-name': /^@\w+/,
				'expression': {
					pattern: expressionDef,
					greedy: true,
					alias: 'selector'
				},
				'command-params': {
					pattern: /\s*\S[\s\S]*/,
					inside: params
				},
			}
		},
		// Generic is any line that doesn't start with operators: ;>#@
		'generic-text': {
			pattern: /(^[ \t]*)[^#@>;\s].*/m,
			lookbehind: true,
			alias: 'punctuation',
			inside: {
				// \{ ... \} ... \[ ... \] ... \"
				'escaped-char': /\\[{}\[\]"]/,
				'expression': {
					pattern: expressionDef,
					greedy: true,
					alias: 'selector'
				},
				'inline-command': {
					pattern: /\[[\t ]*\w[^\r\n\[\]]*\]/,
					greedy: true,
					alias: 'function',
					inside: {
						'command-params': {
							pattern: /(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,
							lookbehind: true,
							inside: params
						},
						'command-param-name': {
							pattern: /^(\[[\t ]*)\w+/,
							lookbehind: true,
							alias: 'name',
						},
						'start-stop-char': /[\[\]]/,
					}
				},
			}
		}
	};
	Prism.languages.nani = Prism.languages['naniscript'];

	/** @typedef {InstanceType<import("./prism-core")["Token"]>} Token */

	/**
	 * This hook is used to validate generic-text tokens for balanced brackets.
	 * Mark token as bad-line when contains not balanced brackets: {},[]
	 */
	Prism.hooks.add('after-tokenize', function (env) {
		/** @type {(Token | string)[]} */
		var tokens = env.tokens;
		tokens.forEach(function (token) {
			if (typeof token !== 'string' && token.type === 'generic-text') {
				var content = getTextContent(token);
				if (!isBracketsBalanced(content)) {
					token.type = 'bad-line';
					token.content = content;
				}
			}
		});
	});

	/**
	 * @param {string} input
	 * @returns {boolean}
	 */
	function isBracketsBalanced(input) {
		var brackets = '[]{}';
		var stack = [];
		for (var i = 0; i < input.length; i++) {
			var bracket = input[i];
			var bracketsIndex = brackets.indexOf(bracket);
			if (bracketsIndex !== -1) {
				if (bracketsIndex % 2 === 0) {
					stack.push(bracketsIndex + 1);
				} else if (stack.pop() !== bracketsIndex) {
					return false;
				}
			}
		}
		return stack.length === 0;
	}

	/**
	 * @param {string | Token | (string | Token)[]} token
	 * @returns {string}
	 */
	function getTextContent(token) {
		if (typeof token === 'string') {
			return token;
		} else if (Array.isArray(token)) {
			return token.map(getTextContent).join('');
		} else {
			return getTextContent(token.content);
		}
	}

}(Prism));
N!nx!function(e){var a=/\{[^\r\n\[\]{}]*\}/,n={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:a,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};function t(e){return"string"==typeof e?e:Array.isArray(e)?e.map(t).join(""):t(e.content)}e.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:a,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:n}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:a,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:n},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},e.languages.nani=e.languages.naniscript,e.hooks.add("after-tokenize",(function(e){e.tokens.forEach((function(e){if("string"!=typeof e&&"generic-text"===e.type){var a=t(e);(function(e){for(var a=[],n=0;n<e.length;n++){var t=e[n],r="[]{}".indexOf(t);if(-1!==r)if(r%2==0)a.push(r+1);else if(a.pop()!==r)return!1}return 0===a.length})(a)||(e.type="bad-line",e.content=a)}}))}))}(Prism);se1xPrism.languages.nasm = {
	'comment': /;.*$/m,
	'string': /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
	'label': {
		pattern: /(^\s*)[A-Za-z._?$][\w.?$@~#]*:/m,
		lookbehind: true,
		alias: 'function'
	},
	'keyword': [
		/\[?BITS (?:16|32|64)\]?/,
		{
			pattern: /(^\s*)section\s*[a-z.]+:?/im,
			lookbehind: true
		},
		/(?:extern|global)[^;\r\n]*/i,
		/(?:CPU|DEFAULT|FLOAT).*$/m
	],
	'register': {
		pattern: /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s)\b/i,
		alias: 'variable'
	},
	'number': /(?:\b|(?=\$))(?:0[hx](?:\.[\da-f]+|[\da-f]+(?:\.[\da-f]+)?)(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,
	'operator': /[\[\]*+\-\/%<>=&|$!]/
};
+xDPrism.languages.nasm={comment:/;.*$/m,string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,label:{pattern:/(^\s*)[A-Za-z._?$][\w.?$@~#]*:/m,lookbehind:!0,alias:"function"},keyword:[/\[?BITS (?:16|32|64)\]?/,{pattern:/(^\s*)section\s*[a-z.]+:?/im,lookbehind:!0},/(?:extern|global)[^;\r\n]*/i,/(?:CPU|DEFAULT|FLOAT).*$/m],register:{pattern:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s)\b/i,alias:"variable"},number:/(?:\b|(?=\$))(?:0[hx](?:\.[\da-f]+|[\da-f]+(?:\.[\da-f]+)?)(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-\/%<>=&|$!]/};0ŷIxhPrism.languages.neon = {
	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	'datetime': {
		pattern: /(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,
		lookbehind: true,
		alias: 'number'
	},
	'key': {
		pattern: /(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,
		lookbehind: true,
		alias: 'property'
	},
	'number': {
		pattern: /(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,
		lookbehind: true
	},
	'boolean': {
		pattern: /(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,
		lookbehind: true
	},
	'null': {
		pattern: /(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,
		lookbehind: true,
		alias: 'keyword'
	},
	'string': {
		pattern: /(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,
		lookbehind: true,
		greedy: true
	},
	'literal': {
		pattern: /(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,
		lookbehind: true,
		alias: 'string',
	},
	'punctuation': /[,:=[\]{}()-]/,
};
З[x>xPrism.languages.neon={comment:{pattern:/#.*/,greedy:!0},datetime:{pattern:/(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,lookbehind:!0,alias:"number"},key:{pattern:/(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,lookbehind:!0,alias:"property"},number:{pattern:/(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,lookbehind:!0},boolean:{pattern:/(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,lookbehind:!0},null:{pattern:/(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,lookbehind:!0,alias:"keyword"},string:{pattern:/(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,lookbehind:!0,greedy:!0},literal:{pattern:/(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,lookbehind:!0,alias:"string"},punctuation:/[,:=[\]{}()-]/};^Cx
Prism.languages.nevod = {
	'comment': /\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,
	'string': {
		pattern: /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,
		greedy: true,
		inside: {
			'string-attrs': /!$|!\*$|\*$/,
		},
	},
	'namespace': {
		pattern: /(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,
		lookbehind: true,
	},
	'pattern': {
		pattern: /(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,
		lookbehind: true,
		inside: {
			'pattern-name': {
				pattern: /^#?[a-zA-Z0-9\-.]+/,
				alias: 'class-name',
			},
			'fields': {
				pattern: /\(.*\)/,
				inside: {
					'field-name': {
						pattern: /[a-zA-Z0-9\-.]+/,
						alias: 'variable',
					},
					'punctuation': /[,()]/,
					'operator': {
						pattern: /~/,
						alias: 'field-hidden-mark',
					},
				},
			},
		},
	},
	'search': {
		pattern: /(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,
		alias: 'function',
		lookbehind: true,
	},
	'keyword': /@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,
	'standard-pattern': {
		pattern: /\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,
		inside: {
			'standard-pattern-name': {
				pattern: /^[a-zA-Z0-9\-.]+/,
				alias: 'builtin',
			},
			'quantifier': {
				pattern: /\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,
				alias: 'number',
			},
			'standard-pattern-attr': {
				pattern: /[a-zA-Z0-9\-.]+/,
				alias: 'builtin',
			},
			'punctuation': /[,()]/,
		},
	},
	'quantifier': {
		pattern: /\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,
		alias: 'number',
	},
	'operator': [
		{
			pattern: /=/,
			alias: 'pattern-def',
		},
		{
			pattern: /&/,
			alias: 'conjunction',
		},
		{
			pattern: /~/,
			alias: 'exception',
		},
		{
			pattern: /\?/,
			alias: 'optionality',
		},
		{
			pattern: /[[\]]/,
			alias: 'repetition',
		},
		{
			pattern: /[{}]/,
			alias: 'variation',
		},
		{
			pattern: /[+_]/,
			alias: 'sequence',
		},
		{
			pattern: /\.{2,3}/,
			alias: 'span',
		},
	],
	'field-capture': [
		{
			pattern: /([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,
			lookbehind: true,
			inside: {
				'field-name': {
					pattern: /[a-zA-Z0-9\-.]+/,
					alias: 'variable',
				},
				'colon': /:/,
			},
		},
		{
			pattern: /[a-zA-Z0-9\-.]+\s*:/,
			inside: {
				'field-name': {
					pattern: /[a-zA-Z0-9\-.]+/,
					alias: 'variable',
				},
				'colon': /:/,
			},
		},
	],
	'punctuation': /[:;,()]/,
	'name': /[a-zA-Z0-9\-.]+/
};
狿h{xOPrism.languages.nevod={comment:/\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,string:{pattern:/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,greedy:!0,inside:{"string-attrs":/!$|!\*$|\*$/}},namespace:{pattern:/(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,lookbehind:!0},pattern:{pattern:/(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,lookbehind:!0,inside:{"pattern-name":{pattern:/^#?[a-zA-Z0-9\-.]+/,alias:"class-name"},fields:{pattern:/\(.*\)/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},punctuation:/[,()]/,operator:{pattern:/~/,alias:"field-hidden-mark"}}}}},search:{pattern:/(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,alias:"function",lookbehind:!0},keyword:/@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,"standard-pattern":{pattern:/\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,inside:{"standard-pattern-name":{pattern:/^[a-zA-Z0-9\-.]+/,alias:"builtin"},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},"standard-pattern-attr":{pattern:/[a-zA-Z0-9\-.]+/,alias:"builtin"},punctuation:/[,()]/}},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},operator:[{pattern:/=/,alias:"pattern-def"},{pattern:/&/,alias:"conjunction"},{pattern:/~/,alias:"exception"},{pattern:/\?/,alias:"optionality"},{pattern:/[[\]]/,alias:"repetition"},{pattern:/[{}]/,alias:"variation"},{pattern:/[+_]/,alias:"sequence"},{pattern:/\.{2,3}/,alias:"span"}],"field-capture":[{pattern:/([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,lookbehind:!0,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}},{pattern:/[a-zA-Z0-9\-.]+\s*:/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}}],punctuation:/[:;,()]/,name:/[a-zA-Z0-9\-.]+/};QDxK(function (Prism) {

	var variable = /\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;

	Prism.languages.nginx = {
		'comment': {
			pattern: /(^|[\s{};])#.*/,
			lookbehind: true,
			greedy: true
		},
		'directive': {
			pattern: /(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,
			lookbehind: true,
			greedy: true,
			inside: {
				'string': {
					pattern: /((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,
					lookbehind: true,
					greedy: true,
					inside: {
						'escape': {
							pattern: /\\["'\\nrt]/,
							alias: 'entity'
						},
						'variable': variable
					}
				},
				'comment': {
					pattern: /(\s)#.*/,
					lookbehind: true,
					greedy: true
				},
				'keyword': {
					pattern: /^\S+/,
					greedy: true
				},

				// other patterns

				'boolean': {
					pattern: /(\s)(?:off|on)(?!\S)/,
					lookbehind: true
				},
				'number': {
					pattern: /(\s)\d+[a-z]*(?!\S)/i,
					lookbehind: true
				},
				'variable': variable
			}
		},
		'punctuation': /[{};]/
	};

}(Prism));
$T-x(!function(e){var n=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:n}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:n}},punctuation:/[{};]/}}(Prism);vxePrism.languages.nim = {
	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	'string': {
		// Double-quoted strings can be prefixed by an identifier (Generalized raw string literals)
		pattern: /(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,
		greedy: true
	},
	'char': {
		// Character literals are handled specifically to prevent issues with numeric type suffixes
		pattern: /'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,
		greedy: true
	},

	'function': {
		pattern: /(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,
		greedy: true,
		inside: {
			'operator': /\*$/
		}
	},
	// We don't want to highlight operators (and anything really) inside backticks
	'identifier': {
		pattern: /`[^`\r\n]+`/,
		greedy: true,
		inside: {
			'punctuation': /`/
		}
	},

	// The negative look ahead prevents wrong highlighting of the .. operator
	'number': /\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,
	'keyword': /\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,
	'operator': {
		// Look behind and look ahead prevent wrong highlighting of punctuations [. .] {. .} (. .)
		// but allow the slice operator .. to take precedence over them
		// One can define his own operators in Nim so all combination of operators might be an operator.
		pattern: /(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,
		lookbehind: true
	},
	'punctuation': /[({\[]\.|\.[)}\]]|[`(){}\[\],:]/
};
	h{GxuPrism.languages.nim={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,greedy:!0},char:{pattern:/'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,greedy:!0},function:{pattern:/(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,greedy:!0,inside:{operator:/\*$/}},identifier:{pattern:/`[^`\r\n]+`/,greedy:!0,inside:{punctuation:/`/}},number:/\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,keyword:/\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,operator:{pattern:/(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,lookbehind:!0},punctuation:/[({\[]\.|\.[)}\]]|[`(){}\[\],:]/};5|^xPrism.languages.nix = {
	'comment': {
		pattern: /\/\*[\s\S]*?\*\/|#.*/,
		greedy: true
	},
	'string': {
		pattern: /"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,
		greedy: true,
		inside: {
			'interpolation': {
				// The lookbehind ensures the ${} is not preceded by \ or ''
				pattern: /(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,
				lookbehind: true,
				inside: null // see below
			}
		}
	},
	'url': [
		/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,
		{
			pattern: /([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,
			lookbehind: true
		}
	],
	'antiquotation': {
		pattern: /\$(?=\{)/,
		alias: 'important'
	},
	'number': /\b\d+\b/,
	'keyword': /\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,
	'function': /\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,
	'boolean': /\b(?:false|true)\b/,
	'operator': /[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,
	'punctuation': /[{}()[\].,:;]/
};

Prism.languages.nix.string.inside.interpolation.inside = Prism.languages.nix;
wOxPrism.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside=Prism.languages.nix;txU/**
 * Original by Jan T. Sott (http://github.com/idleberg)
 *
 * Includes all commands and plug-ins shipped with NSIS 3.08
 */
Prism.languages.nsis = {
	'comment': {
		pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,
		lookbehind: true,
		greedy: true
	},
	'string': {
		pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},
	'keyword': {
		pattern: /(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|KnownFolderPath|LabelAddress|TempFileName|WinVer)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|RtlLanguage|ShellVarContextAll|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|Target|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,
		lookbehind: true
	},
	'property': /\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,
	'constant': /\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,
	'variable': /\$\w[\w\.]*/,
	'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
	'operator': /--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,
	'punctuation': /[{}[\];(),.:]/,
	'important': {
		pattern: /(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,
		lookbehind: true
	}
};
V"AxAPrism.languages.nsis={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,lookbehind:!0,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:{pattern:/(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|KnownFolderPath|LabelAddress|TempFileName|WinVer)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|RtlLanguage|ShellVarContextAll|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|Target|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,lookbehind:!0},property:/\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,constant:/\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,variable:/\$\w[\w\.]*/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,punctuation:/[{}[\];(),.:]/,important:{pattern:/(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,lookbehind:!0}};u6-x,Prism.languages.objectivec = Prism.languages.extend('c', {
	'string': {
		pattern: /@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
		greedy: true
	},
	'keyword': /\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,
	'operator': /-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/
});

delete Prism.languages.objectivec['class-name'];

Prism.languages.objc = Prism.languages.objectivec;
+2*xRPrism.languages.objectivec=Prism.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete Prism.languages.objectivec["class-name"],Prism.languages.objc=Prism.languages.objectivec;r
cx;// https://ocaml.org/manual/lex.html

Prism.languages.ocaml = {
	'comment': {
		pattern: /\(\*[\s\S]*?\*\)/,
		greedy: true
	},
	'char': {
		pattern: /'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,
		greedy: true
	},
	'string': [
		{
			pattern: /"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,
			greedy: true
		},
		{
			pattern: /\{([a-z_]*)\|[\s\S]*?\|\1\}/,
			greedy: true
		}
	],
	'number': [
		// binary and octal
		/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,
		// hexadecimal
		/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,
		// decimal
		/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i,
	],
	'directive': {
		pattern: /\B#\w+/,
		alias: 'property'
	},
	'label': {
		pattern: /\B~\w+/,
		alias: 'property'
	},
	'type-variable': {
		pattern: /\B'\w+/,
		alias: 'function'
	},
	'variant': {
		pattern: /`\w+/,
		alias: 'symbol'
	},
	// For the list of keywords and operators,
	// see: http://caml.inria.fr/pub/docs/manual-ocaml/lex.html#sec84
	'keyword': /\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,
	'boolean': /\b(?:false|true)\b/,

	'operator-like-punctuation': {
		pattern: /\[[<>|]|[>|]\]|\{<|>\}/,
		alias: 'punctuation'
	},
	// Custom operators are allowed
	'operator': /\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,
	'punctuation': /;;|::|[(){}\[\].,:;#]|\b_\b/
};
HڳIxlPrism.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/};#Wxo(function (Prism) {
	var escapes = /\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;

	Prism.languages.odin = {
		/**
		 * The current implementation supports only 1 level of nesting.
		 *
		 * @author Michael Schmidt
		 * @author edukisto
		 */
		'comment': [
			{
				pattern: /\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,
				greedy: true
			},
			{
				pattern: /#![^\n\r]*/,
				greedy: true
			},
			{
				pattern: /\/\/[^\n\r]*/,
				greedy: true
			}
		],

		/**
		 * Should be found before strings because of '"'"- and '`'`-like sequences.
		 */
		'char': {
			pattern: /'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,
			greedy: true,
			inside: {
				'symbol': escapes
			}
		},

		'string': [
			{
				pattern: /`[^`]*`/,
				greedy: true
			},
			{
				pattern: /"(?:\\.|[^\n\r"\\])*"/,
				greedy: true,
				inside: {
					'symbol': escapes
				}
			}
		],

		'directive': {
			pattern: /#\w+/,
			alias: 'property'
		},

		'number': /\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,

		'discard': {
			pattern: /\b_\b/,
			alias: 'keyword'
		},

		'procedure-definition': {
			pattern: /\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,
			alias: 'function'
		},

		'keyword': /\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,

		/**
		 * false, nil, true can be used as procedure names. "_" and keywords can't.
		 */
		'procedure-name': {
			pattern: /\b\w+(?=[ \t]*\()/,
			alias: 'function'
		},

		'boolean': /\b(?:false|nil|true)\b/,

		'constant-parameter-sign': {
			pattern: /\$/,
			alias: 'important'
		},

		'undefined': {
			pattern: /---/,
			alias: 'operator'
		},

		'arrow': {
			pattern: /->/,
			alias: 'punctuation'
		},

		'operator': /\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,

		'punctuation': /[(),.:;@\[\]{}]/
	};
}(Prism));
}ZxZ!function(e){var t=/\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:/'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,greedy:!0,inside:{symbol:t}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:/"(?:\\.|[^\n\r"\\])*"/,greedy:!0,inside:{symbol:t}}],directive:{pattern:/#\w+/,alias:"property"},number:/\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,discard:{pattern:/\b_\b/,alias:"keyword"},"procedure-definition":{pattern:/\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,alias:"function"},keyword:/\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,"procedure-name":{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},boolean:/\b(?:false|nil|true)\b/,"constant-parameter-sign":{pattern:/\$/,alias:"important"},undefined:{pattern:/---/,alias:"operator"},arrow:{pattern:/->/,alias:"punctuation"},operator:/\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,punctuation:/[(),.:;@\[\]{}]/}}(Prism);Px,j(function (Prism) {
	/* OpenCL kernel language */
	Prism.languages.opencl = Prism.languages.extend('c', {
		// Extracted from the official specs (2.0) and http://streamcomputing.eu/downloads/?opencl.lang (opencl-keywords, opencl-types) and http://sourceforge.net/tracker/?func=detail&aid=2957794&group_id=95717&atid=612384 (Words2, partly Words3)
		'keyword': /\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,
		// Extracted from http://streamcomputing.eu/downloads/?opencl.lang (opencl-const)
		// Math Constants: https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/mathConstants.html
		// Macros and Limits: https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/macroLimits.html
		'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,
		'boolean': /\b(?:false|true)\b/,
		'constant-opencl-kernel': {
			pattern: /\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,
			alias: 'constant'
		}
	});

	Prism.languages.insertBefore('opencl', 'class-name', {
		// https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/scalarDataTypes.html
		// https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/otherDataTypes.html
		'builtin-type': {
			pattern: /\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,
			alias: 'keyword'
		}
	});

	var attributes = {
		// Extracted from http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-types and opencl-host)
		'type-opencl-host': {
			pattern: /\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,
			alias: 'keyword'
		},
		'boolean-opencl-host': {
			pattern: /\bCL_(?:FALSE|TRUE)\b/,
			alias: 'boolean'
		},
		// Extracted from cl.h (2.0) and http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-const)
		'constant-opencl-host': {
			pattern: /\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,
			alias: 'constant'
		},
		// Extracted from cl.h (2.0) and http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-host)
		'function-opencl-host': {
			pattern: /\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,
			alias: 'function'
		}
	};

	/* OpenCL host API */
	Prism.languages.insertBefore('c', 'keyword', attributes);

	// C++ includes everything from the OpenCL C host API plus the classes defined in cl2.h
	if (Prism.languages.cpp) {
		// Extracted from doxygen class list http://github.khronos.org/OpenCL-CLHPP/annotated.html
		attributes['type-opencl-host-cpp'] = {
			pattern: /\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,
			alias: 'keyword'
		};

		Prism.languages.insertBefore('cpp', 'keyword', attributes);
	}
}(Prism));
x&K!function(E){E.languages.opencl=E.languages.extend("c",{keyword:/\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,boolean:/\b(?:false|true)\b/,"constant-opencl-kernel":{pattern:/\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,alias:"constant"}}),E.languages.insertBefore("opencl","class-name",{"builtin-type":{pattern:/\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,alias:"keyword"}});var _={"type-opencl-host":{pattern:/\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,alias:"keyword"},"boolean-opencl-host":{pattern:/\bCL_(?:FALSE|TRUE)\b/,alias:"boolean"},"constant-opencl-host":{pattern:/\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,alias:"constant"},"function-opencl-host":{pattern:/\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,alias:"function"}};E.languages.insertBefore("c","keyword",_),E.languages.cpp&&(_["type-opencl-host-cpp"]={pattern:/\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,alias:"keyword"},E.languages.insertBefore("cpp","keyword",_))}(Prism);Qp:x^// https://qiskit.github.io/openqasm/grammar/index.html

Prism.languages.openqasm = {
	'comment': /\/\*[\s\S]*?\*\/|\/\/.*/,
	'string': {
		pattern: /"[^"\r\n\t]*"|'[^'\r\n\t]*'/,
		greedy: true
	},

	'keyword': /\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,
	'class-name': /\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,
	'function': /\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,

	'constant': /\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,
	'number': {
		pattern: /(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,
		lookbehind: true
	},
	'operator': /->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,
	'punctuation': /[(){}\[\];,:.]/
};

Prism.languages.qasm = Prism.languages.openqasm;
1H1xPrism.languages.openqasm={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"[^"\r\n\t]*"|'[^'\r\n\t]*'/,greedy:!0},keyword:/\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,"class-name":/\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,function:/\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,constant:/\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,number:{pattern:/(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,lookbehind:!0},operator:/->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,punctuation:/[(){}\[\];,:.]/},Prism.languages.qasm=Prism.languages.openqasm;ْ+s:xTPrism.languages.oz = {
	'comment': {
		pattern: /\/\*[\s\S]*?\*\/|%.*/,
		greedy: true
	},
	'string': {
		pattern: /"(?:[^"\\]|\\[\s\S])*"/,
		greedy: true
	},
	'atom': {
		pattern: /'(?:[^'\\]|\\[\s\S])*'/,
		greedy: true,
		alias: 'builtin'
	},
	'keyword': /\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,
	'function': [
		/\b[a-z][A-Za-z\d]*(?=\()/,
		{
			pattern: /(\{)[A-Z][A-Za-z\d]*\b/,
			lookbehind: true
		}
	],
	'number': /\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,
	'variable': /`(?:[^`\\]|\\.)+`/,
	'attr-name': /\b\w+(?=[ \t]*:(?![:=]))/,
	'operator': /:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,
	'punctuation': /[\[\](){}.:;?]/
};
W1x3x8Prism.languages.oz={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=[ \t]*:(?![:=]))/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/};~#ʸNxPrism.languages.parigp = {
	'comment': /\/\*[\s\S]*?\*\/|\\\\.*/,
	'string': {
		pattern: /"(?:[^"\\\r\n]|\\.)*"/,
		greedy: true
	},
	// PARI/GP does not care about white spaces at all
	// so let's process the keywords to build an appropriate regexp
	// (e.g. "b *r *e *a *k", etc.)
	'keyword': (function () {
		var keywords = [
			'breakpoint', 'break', 'dbg_down', 'dbg_err', 'dbg_up', 'dbg_x',
			'forcomposite', 'fordiv', 'forell', 'forpart', 'forprime',
			'forstep', 'forsubgroup', 'forvec', 'for', 'iferr', 'if',
			'local', 'my', 'next', 'return', 'until', 'while'
		];
		keywords = keywords.map(function (keyword) {
			return keyword.split('').join(' *');
		}).join('|');
		return RegExp('\\b(?:' + keywords + ')\\b');
	}()),
	'function': /\b\w(?:[\w ]*\w)?(?= *\()/,
	'number': {
		// The lookbehind and the negative lookahead prevent from breaking the .. operator
		pattern: /((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,
		lookbehind: true
	},
	'operator': /\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,
	'punctuation': /[\[\]{}().,:;|]/
};
iְ5xPPrism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map((function(r){return r.split("").join(" *")})).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/};6yxe(function (Prism) {

	var parser = Prism.languages.parser = Prism.languages.extend('markup', {
		'keyword': {
			pattern: /(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,
			lookbehind: true
		},
		'variable': {
			pattern: /(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,
			lookbehind: true,
			inside: {
				'punctuation': /\.|:+/
			}
		},
		'function': {
			pattern: /(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,
			lookbehind: true,
			inside: {
				'keyword': {
					pattern: /(^@)(?:GET_|SET_)/,
					lookbehind: true
				},
				'punctuation': /\.|:+/
			}
		},
		'escape': {
			pattern: /\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,
			alias: 'builtin'
		},
		'punctuation': /[\[\](){};]/
	});

	parser = Prism.languages.insertBefore('parser', 'keyword', {
		'parser-comment': {
			pattern: /(\s)#.*/,
			lookbehind: true,
			alias: 'comment'
		},
		'expression': {
			// Allow for 3 levels of depth
			pattern: /(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,
			greedy: true,
			lookbehind: true,
			inside: {
				'string': {
					pattern: /(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,
					lookbehind: true
				},
				'keyword': parser.keyword,
				'variable': parser.variable,
				'function': parser.function,
				'boolean': /\b(?:false|true)\b/,
				'number': /\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,
				'escape': parser.escape,
				'operator': /[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,
				'punctuation': parser.punctuation
			}
		}
	});

	Prism.languages.insertBefore('inside', 'punctuation', {
		'expression': parser.expression,
		'keyword': parser.keyword,
		'variable': parser.variable,
		'function': parser.function,
		'escape': parser.escape,
		'parser-punctuation': {
			pattern: parser.punctuation,
			alias: 'punctuation'
		}
	}, parser['tag'].inside['attr-value']);

}(Prism));
A@F$Yxf!function(e){var n=e.languages.parser=e.languages.extend("markup",{keyword:{pattern:/(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{punctuation:/\.|:+/}},function:{pattern:/(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\.|:+/}},escape:{pattern:/\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,alias:"builtin"},punctuation:/[\[\](){};]/});n=e.languages.insertBefore("parser","keyword",{"parser-comment":{pattern:/(\s)#.*/,lookbehind:!0,alias:"comment"},expression:{pattern:/(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,greedy:!0,lookbehind:!0,inside:{string:{pattern:/(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,lookbehind:!0},keyword:n.keyword,variable:n.variable,function:n.function,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,escape:n.escape,operator:/[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,punctuation:n.punctuation}}}),e.languages.insertBefore("inside","punctuation",{expression:n.expression,keyword:n.keyword,variable:n.variable,function:n.function,escape:n.escape,"parser-punctuation":{pattern:n.punctuation,alias:"punctuation"}},n.tag.inside["attr-value"])}(Prism);9x/	// Based on Free Pascal

/* TODO
	Support inline asm ?
*/

Prism.languages.pascal = {
	'directive': {
		pattern: /\{\$[\s\S]*?\}/,
		greedy: true,
		alias: ['marco', 'property']
	},
	'comment': {
		pattern: /\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,
		greedy: true
	},
	'string': {
		pattern: /(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,
		greedy: true
	},
	'asm': {
		pattern: /(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,
		lookbehind: true,
		greedy: true,
		inside: null // see below
	},
	'keyword': [
		{
			// Turbo Pascal
			pattern: /(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,
			lookbehind: true
		},
		{
			// Free Pascal
			pattern: /(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,
			lookbehind: true
		},
		{
			// Object Pascal
			pattern: /(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,
			lookbehind: true
		},
		{
			// Modifiers
			pattern: /(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,
			lookbehind: true
		}
	],
	'number': [
		// Hexadecimal, octal and binary
		/(?:[&%]\d+|\$[a-f\d]+)/i,
		// Decimal
		/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i
	],
	'operator': [
		/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,
		{
			pattern: /(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,
			lookbehind: true
		}
	],
	'punctuation': /\(\.|\.\)|[()\[\]:;,.]/
};

Prism.languages.pascal.asm.inside = Prism.languages.extend('pascal', {
	'asm': undefined,
	'keyword': undefined,
	'operator': undefined
});

Prism.languages.objectpascal = Prism.languages.pascal;
;kwxxPrism.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},Prism.languages.pascal.asm.inside=Prism.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),Prism.languages.objectpascal=Prism.languages.pascal;⇽wx}(function (Prism) {

	// Pascaligo is a layer 2 smart contract language for the tezos blockchain

	var braces = /\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)/.source;
	var type = /(?:\b\w+(?:<braces>)?|<braces>)/.source.replace(/<braces>/g, function () { return braces; });

	var pascaligo = Prism.languages.pascaligo = {
		'comment': /\(\*[\s\S]+?\*\)|\/\/.*/,
		'string': {
			pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,
			greedy: true
		},
		'class-name': [
			{
				pattern: RegExp(/(\btype\s+\w+\s+is\s+)<type>/.source.replace(/<type>/g, function () { return type; }), 'i'),
				lookbehind: true,
				inside: null // see below
			},
			{
				pattern: RegExp(/<type>(?=\s+is\b)/.source.replace(/<type>/g, function () { return type; }), 'i'),
				inside: null // see below
			},
			{
				pattern: RegExp(/(:\s*)<type>/.source.replace(/<type>/g, function () { return type; })),
				lookbehind: true,
				inside: null // see below
			}
		],
		'keyword': {
			pattern: /(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,
			lookbehind: true
		},
		'boolean': {
			pattern: /(^|[^&])\b(?:False|True)\b/i,
			lookbehind: true
		},
		'builtin': {
			pattern: /(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,
			lookbehind: true
		},
		'function': /\b\w+(?=\s*\()/,
		'number': [
			// Hexadecimal, octal and binary
			/%[01]+|&[0-7]+|\$[a-f\d]+/i,
			// Decimal
			/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i
		],
		'operator': /->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,
		'punctuation': /\(\.|\.\)|[()\[\]:;,.{}]/
	};

	var classNameInside = ['comment', 'keyword', 'builtin', 'operator', 'punctuation'].reduce(function (accum, key) {
		accum[key] = pascaligo[key];
		return accum;
	}, {});

	pascaligo['class-name'].forEach(function (p) {
		p.inside = classNameInside;
	});

}(Prism));
|USx3!function(e){var n="(?:\\b\\w+(?:<braces>)?|<braces>)".replace(/<braces>/g,(function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"})),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)<type>".replace(/<type>/g,(function(){return n})),"i"),lookbehind:!0,inside:null},{pattern:RegExp("<type>(?=\\s+is\\b)".replace(/<type>/g,(function(){return n})),"i"),inside:null},{pattern:RegExp("(:\\s*)<type>".replace(/<type>/g,(function(){return n}))),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce((function(e,n){return e[n]=t[n],e}),{});t["class-name"].forEach((function(e){e.inside=i}))}(Prism);L`$DxFPrism.languages.pcaxis = {
	'string': /"[^"]*"/,
	'keyword': {
		pattern: /((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,
		lookbehind: true,
		greedy: true,
		inside: {
			'keyword': /^[-A-Z\d]+/,
			'language': {
				pattern: /^(\s*)\[[-\w]+\]/,
				lookbehind: true,
				inside: {
					'punctuation': /^\[|\]$/,
					'property': /[-\w]+/
				}
			},
			'sub-key': {
				pattern: /^(\s*)\S[\s\S]*/,
				lookbehind: true,
				inside: {
					'parameter': {
						pattern: /"[^"]*"/,
						alias: 'property'
					},
					'punctuation': /^\(|\)$|,/
				}
			}
		}
	},
	'operator': /=/,
	'tlist': {
		pattern: /TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,
		greedy: true,
		inside: {
			'function': /^TLIST/,
			'property': {
				pattern: /^(\s*\(\s*)\w+/,
				lookbehind: true
			},
			'string': /"[^"]*"/,
			'punctuation': /[(),]/,
			'operator': /-/
		}
	},
	'punctuation': /[;,]/,
	'number': {
		pattern: /(^|\s)\d+(?:\.\d+)?(?!\S)/,
		lookbehind: true
	},
	'boolean': /NO|YES/,
};

Prism.languages.px = Prism.languages.pcaxis;
(2x&Prism.languages.pcaxis={string:/"[^"]*"/,keyword:{pattern:/((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,lookbehind:!0,greedy:!0,inside:{keyword:/^[-A-Z\d]+/,language:{pattern:/^(\s*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/^\[|\]$/,property:/[-\w]+/}},"sub-key":{pattern:/^(\s*)\S[\s\S]*/,lookbehind:!0,inside:{parameter:{pattern:/"[^"]*"/,alias:"property"},punctuation:/^\(|\)$|,/}}}},operator:/=/,tlist:{pattern:/TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,greedy:!0,inside:{function:/^TLIST/,property:{pattern:/^(\s*\(\s*)\w+/,lookbehind:!0},string:/"[^"]*"/,punctuation:/[(),]/,operator:/-/}},punctuation:/[;,]/,number:{pattern:/(^|\s)\d+(?:\.\d+)?(?!\S)/,lookbehind:!0},boolean:/NO|YES/},Prism.languages.px=Prism.languages.pcaxis;lk]x/Prism.languages.peoplecode = {
	'comment': RegExp([
		// C-style multiline comments
		/\/\*[\s\S]*?\*\//.source,
		// REM comments
		/\bREM[^;]*;/.source,
		// Nested <* *> comments
		/<\*(?:[^<*]|\*(?!>)|<(?!\*)|<\*(?:(?!\*>)[\s\S])*\*>)*\*>/.source,
		// /+ +/ comments
		/\/\+[\s\S]*?\+\//.source,
	].join('|')),
	'string': {
		pattern: /'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,
		greedy: true
	},
	'variable': /%\w+/,
	'function-definition': {
		pattern: /((?:^|[^\w-])(?:function|method)\s+)\w+/i,
		lookbehind: true,
		alias: 'function'
	},
	'class-name': {
		pattern: /((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,
		lookbehind: true,
		inside: {
			'punctuation': /:/
		}
	},
	'keyword': /\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,
	'operator-keyword': {
		pattern: /\b(?:and|not|or)\b/i,
		alias: 'operator'
	},
	'function': /[_a-z]\w*(?=\s*\()/i,

	'boolean': /\b(?:false|true)\b/i,
	'number': /\b\d+(?:\.\d+)?\b/,
	'operator': /<>|[<>]=?|!=|\*\*|[-+*/|=@]/,
	'punctuation': /[:.;,()[\]]/
};

Prism.languages.pcode = Prism.languages.peoplecode;
Lx;Prism.languages.peoplecode={comment:RegExp(["/\\*[^]*?\\*/","\\bREM[^;]*;","<\\*(?:[^<*]|\\*(?!>)|<(?!\\*)|<\\*(?:(?!\\*>)[^])*\\*>)*\\*>","/\\+[^]*?\\+/"].join("|")),string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},variable:/%\w+/,"function-definition":{pattern:/((?:^|[^\w-])(?:function|method)\s+)\w+/i,lookbehind:!0,alias:"function"},"class-name":{pattern:/((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,lookbehind:!0,inside:{punctuation:/:/}},keyword:/\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,"operator-keyword":{pattern:/\b(?:and|not|or)\b/i,alias:"operator"},function:/[_a-z]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/\b\d+(?:\.\d+)?\b/,operator:/<>|[<>]=?|!=|\*\*|[-+*/|=@]/,punctuation:/[:.;,()[\]]/},Prism.languages.pcode=Prism.languages.peoplecode;++xF(function (Prism) {

	var brackets = /(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;

	Prism.languages.perl = {
		'comment': [
			{
				// POD
				pattern: /(^\s*)=\w[\s\S]*?=cut.*/m,
				lookbehind: true,
				greedy: true
			},
			{
				pattern: /(^|[^\\$])#.*/,
				lookbehind: true,
				greedy: true
			}
		],
		// TODO Could be nice to handle Heredoc too.
		'string': [
			{
				pattern: RegExp(
					/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source +
					'(?:' +
					[
						// q/.../
						/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,

						// q a...a
						// eslint-disable-next-line regexp/strict
						/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,

						// q(...)
						// q{...}
						// q[...]
						// q<...>
						brackets,
					].join('|') +
					')'
				),
				greedy: true
			},

			// "...", `...`
			{
				pattern: /("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,
				greedy: true
			},

			// '...'
			// FIXME Multi-line single-quoted strings are not supported as they would break variables containing '
			{
				pattern: /'(?:[^'\\\r\n]|\\.)*'/,
				greedy: true
			}
		],
		'regex': [
			{
				pattern: RegExp(
					/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source +
					'(?:' +
					[
						// m/.../
						/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,

						// m a...a
						// eslint-disable-next-line regexp/strict
						/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,

						// m(...)
						// m{...}
						// m[...]
						// m<...>
						brackets,
					].join('|') +
					')' +
					/[msixpodualngc]*/.source
				),
				greedy: true
			},

			// The lookbehinds prevent -s from breaking
			{
				pattern: RegExp(
					/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source +
					'(?:' +
					[
						// s/.../.../
						// eslint-disable-next-line regexp/strict
						/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,

						// s a...a...a
						// eslint-disable-next-line regexp/strict
						/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,

						// s(...)(...)
						// s{...}{...}
						// s[...][...]
						// s<...><...>
						// s(...)[...]
						brackets + /\s*/.source + brackets,
					].join('|') +
					')' +
					/[msixpodualngcer]*/.source
				),
				lookbehind: true,
				greedy: true
			},

			// /.../
			// The look-ahead tries to prevent two divisions on
			// the same line from being highlighted as regex.
			// This does not support multi-line regex.
			{
				pattern: /\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,
				greedy: true
			}
		],

		// FIXME Not sure about the handling of ::, ', and #
		'variable': [
			// ${^POSTMATCH}
			/[&*$@%]\{\^[A-Z]+\}/,
			// $^V
			/[&*$@%]\^[A-Z_]/,
			// ${...}
			/[&*$@%]#?(?=\{)/,
			// $foo
			/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,
			// $1
			/[&*$@%]\d+/,
			// $_, @_, %!
			// The negative lookahead prevents from breaking the %= operator
			/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/
		],
		'filehandle': {
			// <>, <FOO>, _
			pattern: /<(?![<=])\S*?>|\b_\b/,
			alias: 'symbol'
		},
		'v-string': {
			// v1.2, 1.2.3
			pattern: /v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,
			alias: 'string'
		},
		'function': {
			pattern: /(\bsub[ \t]+)\w+/,
			lookbehind: true
		},
		'keyword': /\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,
		'number': /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,
		'operator': /-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,
		'punctuation': /[{}[\];(),:]/
	};

}(Prism));
C˿x!function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism);/Jx~Prism.languages.insertBefore('php', 'variable', {
	'this': {
		pattern: /\$this\b/,
		alias: 'keyword'
	},
	'global': /\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,
	'scope': {
		pattern: /\b[\w\\]+::/,
		inside: {
			'keyword': /\b(?:parent|self|static)\b/,
			'punctuation': /::|\\/
		}
	}
});
z2xIPrism.languages.insertBefore("php","variable",{this:{pattern:/\$this\b/,alias:"keyword"},global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/\b(?:parent|self|static)\b/,punctuation:/::|\\/}}});>u忯x" /**
 * Original by Aaron Harun: http://aahacreative.com/2012/07/31/php-syntax-highlighting-prism/
 * Modified by Miles Johnson: http://milesj.me
 * Rewritten by Tom Pavelec
 *
 * Supports PHP 5.3 - 8.0
 */
(function (Prism) {
	var comment = /\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/;
	var constant = [
		{
			pattern: /\b(?:false|true)\b/i,
			alias: 'boolean'
		},
		{
			pattern: /(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,
			greedy: true,
			lookbehind: true,
		},
		{
			pattern: /(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,
			greedy: true,
			lookbehind: true,
		},
		/\b(?:null)\b/i,
		/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/,
	];
	var number = /\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i;
	var operator = /<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/;
	var punctuation = /[{}\[\](),:;]/;

	Prism.languages.php = {
		'delimiter': {
			pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i,
			alias: 'important'
		},
		'comment': comment,
		'variable': /\$+(?:\w+\b|(?=\{))/,
		'package': {
			pattern: /(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
			lookbehind: true,
			inside: {
				'punctuation': /\\/
			}
		},
		'class-name-definition': {
			pattern: /(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,
			lookbehind: true,
			alias: 'class-name'
		},
		'function-definition': {
			pattern: /(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,
			lookbehind: true,
			alias: 'function'
		},
		'keyword': [
			{
				pattern: /(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,
				alias: 'type-casting',
				greedy: true,
				lookbehind: true
			},
			{
				pattern: /([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,
				alias: 'type-hint',
				greedy: true,
				lookbehind: true
			},
			{
				pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,
				alias: 'return-type',
				greedy: true,
				lookbehind: true
			},
			{
				pattern: /\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,
				alias: 'type-declaration',
				greedy: true
			},
			{
				pattern: /(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,
				alias: 'type-declaration',
				greedy: true,
				lookbehind: true
			},
			{
				pattern: /\b(?:parent|self|static)(?=\s*::)/i,
				alias: 'static-context',
				greedy: true
			},
			{
				// yield from
				pattern: /(\byield\s+)from\b/i,
				lookbehind: true
			},
			// `class` is always a keyword unlike other keywords
			/\bclass\b/i,
			{
				// https://www.php.net/manual/en/reserved.keywords.php
				//
				// keywords cannot be preceded by "->"
				// the complex lookbehind means `(?<!(?:->|::)\s*)`
				pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,
				lookbehind: true
			}
		],
		'argument-name': {
			pattern: /([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,
			lookbehind: true
		},
		'class-name': [
			{
				pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,
				greedy: true,
				lookbehind: true
			},
			{
				pattern: /(\|\s*)\b[a-z_]\w*(?!\\)\b/i,
				greedy: true,
				lookbehind: true
			},
			{
				pattern: /\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,
				greedy: true
			},
			{
				pattern: /(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,
				alias: 'class-name-fully-qualified',
				greedy: true,
				lookbehind: true,
				inside: {
					'punctuation': /\\/
				}
			},
			{
				pattern: /(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,
				alias: 'class-name-fully-qualified',
				greedy: true,
				inside: {
					'punctuation': /\\/
				}
			},
			{
				pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
				alias: 'class-name-fully-qualified',
				greedy: true,
				lookbehind: true,
				inside: {
					'punctuation': /\\/
				}
			},
			{
				pattern: /\b[a-z_]\w*(?=\s*\$)/i,
				alias: 'type-declaration',
				greedy: true
			},
			{
				pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,
				alias: ['class-name-fully-qualified', 'type-declaration'],
				greedy: true,
				inside: {
					'punctuation': /\\/
				}
			},
			{
				pattern: /\b[a-z_]\w*(?=\s*::)/i,
				alias: 'static-context',
				greedy: true
			},
			{
				pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,
				alias: ['class-name-fully-qualified', 'static-context'],
				greedy: true,
				inside: {
					'punctuation': /\\/
				}
			},
			{
				pattern: /([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,
				alias: 'type-hint',
				greedy: true,
				lookbehind: true
			},
			{
				pattern: /([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,
				alias: ['class-name-fully-qualified', 'type-hint'],
				greedy: true,
				lookbehind: true,
				inside: {
					'punctuation': /\\/
				}
			},
			{
				pattern: /(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,
				alias: 'return-type',
				greedy: true,
				lookbehind: true
			},
			{
				pattern: /(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
				alias: ['class-name-fully-qualified', 'return-type'],
				greedy: true,
				lookbehind: true,
				inside: {
					'punctuation': /\\/
				}
			}
		],
		'constant': constant,
		'function': {
			pattern: /(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,
			lookbehind: true,
			inside: {
				'punctuation': /\\/
			}
		},
		'property': {
			pattern: /(->\s*)\w+/,
			lookbehind: true
		},
		'number': number,
		'operator': operator,
		'punctuation': punctuation
	};

	var string_interpolation = {
		pattern: /\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,
		lookbehind: true,
		inside: Prism.languages.php
	};

	var string = [
		{
			pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,
			alias: 'nowdoc-string',
			greedy: true,
			inside: {
				'delimiter': {
					pattern: /^<<<'[^']+'|[a-z_]\w*;$/i,
					alias: 'symbol',
					inside: {
						'punctuation': /^<<<'?|[';]$/
					}
				}
			}
		},
		{
			pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,
			alias: 'heredoc-string',
			greedy: true,
			inside: {
				'delimiter': {
					pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,
					alias: 'symbol',
					inside: {
						'punctuation': /^<<<"?|[";]$/
					}
				},
				'interpolation': string_interpolation
			}
		},
		{
			pattern: /`(?:\\[\s\S]|[^\\`])*`/,
			alias: 'backtick-quoted-string',
			greedy: true
		},
		{
			pattern: /'(?:\\[\s\S]|[^\\'])*'/,
			alias: 'single-quoted-string',
			greedy: true
		},
		{
			pattern: /"(?:\\[\s\S]|[^\\"])*"/,
			alias: 'double-quoted-string',
			greedy: true,
			inside: {
				'interpolation': string_interpolation
			}
		}
	];

	Prism.languages.insertBefore('php', 'variable', {
		'string': string,
		'attribute': {
			pattern: /#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,
			greedy: true,
			inside: {
				'attribute-content': {
					pattern: /^(#\[)[\s\S]+(?=\]$)/,
					lookbehind: true,
					// inside can appear subset of php
					inside: {
						'comment': comment,
						'string': string,
						'attribute-class-name': [
							{
								pattern: /([^:]|^)\b[a-z_]\w*(?!\\)\b/i,
								alias: 'class-name',
								greedy: true,
								lookbehind: true
							},
							{
								pattern: /([^:]|^)(?:\\?\b[a-z_]\w*)+/i,
								alias: [
									'class-name',
									'class-name-fully-qualified'
								],
								greedy: true,
								lookbehind: true,
								inside: {
									'punctuation': /\\/
								}
							}
						],
						'constant': constant,
						'number': number,
						'operator': operator,
						'punctuation': punctuation
					}
				},
				'delimiter': {
					pattern: /^#\[|\]$/,
					alias: 'punctuation'
				}
			}
		},
	});

	Prism.hooks.add('before-tokenize', function (env) {
		if (!/<\?/.test(env.code)) {
			return;
		}

		var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;
		Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern);
	});

	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php');
	});

}(Prism));
fSyxH!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism);k3x8(function (Prism) {

	var typeExpression = /(?:\b[a-zA-Z]\w*|[|\\[\]])+/.source;

	Prism.languages.phpdoc = Prism.languages.extend('javadoclike', {
		'parameter': {
			pattern: RegExp('(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:' + typeExpression + '\\s+)?)\\$\\w+'),
			lookbehind: true
		}
	});

	Prism.languages.insertBefore('phpdoc', 'keyword', {
		'class-name': [
			{
				pattern: RegExp('(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)' + typeExpression),
				lookbehind: true,
				inside: {
					'keyword': /\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,
					'punctuation': /[|\\[\]()]/
				}
			}
		],
	});

	Prism.languages.javadoclike.addSupport('php', Prism.languages.phpdoc);

}(Prism));
Uy(x}!function(a){var e="(?:\\b[a-zA-Z]\\w*|[|\\\\[\\]])+";a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+e+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+e),lookbehind:!0,inside:{keyword:/\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(Prism);l셾x.(function (Prism) {
	var variable = /\$\w+|%[a-z]+%/;

	var arrowAttr = /\[[^[\]]*\]/.source;
	var arrowDirection = /(?:[drlu]|do|down|le|left|ri|right|up)/.source;
	var arrowBody = '(?:-+' + arrowDirection + '-+|\\.+' + arrowDirection + '\\.+|-+(?:' + arrowAttr + '-*)?|' + arrowAttr + '-+|\\.+(?:' + arrowAttr + '\\.*)?|' + arrowAttr + '\\.+)';
	var arrowLeft = /(?:<{1,2}|\/{1,2}|\\{1,2}|<\||[#*^+}xo])/.source;
	var arrowRight = /(?:>{1,2}|\/{1,2}|\\{1,2}|\|>|[#*^+{xo])/.source;
	var arrowPrefix = /[[?]?[ox]?/.source;
	var arrowSuffix = /[ox]?[\]?]?/.source;
	var arrow =
		arrowPrefix +
		'(?:' +
		arrowBody + arrowRight +
		'|' +
		arrowLeft + arrowBody + '(?:' + arrowRight + ')?' +
		')' +
		arrowSuffix;

	Prism.languages['plant-uml'] = {
		'comment': {
			pattern: /(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,
			lookbehind: true,
			greedy: true
		},
		'preprocessor': {
			pattern: /(^[ \t]*)!.*/m,
			lookbehind: true,
			greedy: true,
			alias: 'property',
			inside: {
				'variable': variable
			}
		},
		'delimiter': {
			pattern: /(^[ \t]*)@(?:end|start)uml\b/m,
			lookbehind: true,
			greedy: true,
			alias: 'punctuation'
		},

		'arrow': {
			pattern: RegExp(/(^|[^-.<>?|\\[\]ox])/.source + arrow + /(?![-.<>?|\\\]ox])/.source),
			lookbehind: true,
			greedy: true,
			alias: 'operator',
			inside: {
				'expression': {
					pattern: /(\[)[^[\]]+(?=\])/,
					lookbehind: true,
					inside: null // see below
				},
				'punctuation': /\[(?=$|\])|^\]/
			}
		},

		'string': {
			pattern: /"[^"]*"/,
			greedy: true
		},
		'text': {
			pattern: /(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,
			lookbehind: true,
			greedy: true,
			alias: 'string'
		},

		'keyword': [
			{
				pattern: /^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,
				lookbehind: true,
				greedy: true
			},
			/\b(?:elseif|equals|not|while)(?=\s*\()/,
			/\b(?:as|is|then)\b/
		],

		'divider': {
			pattern: /^==.+==$/m,
			greedy: true,
			alias: 'important'
		},

		'time': {
			pattern: /@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,
			greedy: true,
			alias: 'number'
		},

		'color': {
			pattern: /#(?:[a-z_]+|[a-fA-F0-9]+)\b/,
			alias: 'symbol'
		},
		'variable': variable,

		'punctuation': /[:,;()[\]{}]|\.{3}/
	};

	Prism.languages['plant-uml'].arrow.inside.expression.inside = Prism.languages['plant-uml'];

	Prism.languages['plantuml'] = Prism.languages['plant-uml'];

}(Prism));
b%x	Q!function(e){var t=/\$\w+|%[a-z]+%/;e.languages["plant-uml"]={comment:{pattern:/(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,lookbehind:!0,greedy:!0},preprocessor:{pattern:/(^[ \t]*)!.*/m,lookbehind:!0,greedy:!0,alias:"property",inside:{variable:t}},delimiter:{pattern:/(^[ \t]*)@(?:end|start)uml\b/m,lookbehind:!0,greedy:!0,alias:"punctuation"},arrow:{pattern:RegExp("(^|[^-.<>?|\\\\[\\]ox])[[?]?[ox]?(?:(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo])|(?:<{1,2}|/{1,2}|\\\\{1,2}|<\\||[#*^+}xo])(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo]))?)[ox]?[\\]?]?(?![-.<>?|\\\\\\]ox])"),lookbehind:!0,greedy:!0,alias:"operator",inside:{expression:{pattern:/(\[)[^[\]]+(?=\])/,lookbehind:!0,inside:null},punctuation:/\[(?=$|\])|^\]/}},string:{pattern:/"[^"]*"/,greedy:!0},text:{pattern:/(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,lookbehind:!0,greedy:!0,alias:"string"},keyword:[{pattern:/^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,lookbehind:!0,greedy:!0},/\b(?:elseif|equals|not|while)(?=\s*\()/,/\b(?:as|is|then)\b/],divider:{pattern:/^==.+==$/m,greedy:!0,alias:"important"},time:{pattern:/@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,greedy:!0,alias:"number"},color:{pattern:/#(?:[a-z_]+|[a-fA-F0-9]+)\b/,alias:"symbol"},variable:t,punctuation:/[:,;()[\]{}]|\.{3}/},e.languages["plant-uml"].arrow.inside.expression.inside=e.languages["plant-uml"],e.languages.plantuml=e.languages["plant-uml"]}(Prism);YxPrism.languages.plsql = Prism.languages.extend('sql', {
	'comment': {
		pattern: /\/\*[\s\S]*?\*\/|--.*/,
		greedy: true
	},
	// https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-reserved-words-keywords.html
	'keyword': /\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,
	// https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-language-fundamentals.html#GUID-96A42F7C-7A71-4B90-8255-CA9C8BD9722E
	'operator': /:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/
});

Prism.languages.insertBefore('plsql', 'operator', {
	'label': {
		pattern: /<<\s*\w+\s*>>/,
		alias: 'symbol'
	},
});
"Mx
NPrism.languages.plsql=Prism.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),Prism.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}});'uTxB// https://docs.microsoft.com/en-us/powerquery-m/power-query-m-language-specification

Prism.languages.powerquery = {
	'comment': {
		pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
		lookbehind: true,
		greedy: true
	},
	'quoted-identifier': {
		pattern: /#"(?:[^"\r\n]|"")*"(?!")/,
		greedy: true
	},
	'string': {
		pattern: /(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,
		greedy: true
	},
	'constant': [
		/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,
		/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,
		/\bOccurrence\.(?:All|First|Last)\b/,
		/\bOrder\.(?:Ascending|Descending)\b/,
		/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,
		/\bMissingField\.(?:Error|Ignore|UseNull)\b/,
		/\bQuoteStyle\.(?:Csv|None)\b/,
		/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,
		/\bGroupKind\.(?:Global|Local)\b/,
		/\bExtraValues\.(?:Error|Ignore|List)\b/,
		/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,
		/\bJoinSide\.(?:Left|Right)\b/,
		/\bPrecision\.(?:Decimal|Double)\b/,
		/\bRelativePosition\.From(?:End|Start)\b/,
		/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,
		/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,
		/\bnull\b/
	],
	'boolean': /\b(?:false|true)\b/,
	'keyword': /\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,
	'function': {
		pattern: /(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,
		lookbehind: true
	},
	'data-type': {
		pattern: /\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,
		alias: 'class-name'
	},
	'number': {
		pattern: /\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,
		lookbehind: true
	},
	'operator': /[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,
	'punctuation': /[,;\[\](){}]/
};

Prism.languages.pq = Prism.languages['powerquery'];
Prism.languages.mscript = Prism.languages['powerquery'];
g [zx^Prism.languages.powerquery={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},"quoted-identifier":{pattern:/#"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},string:{pattern:/(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},constant:[/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,/\bOccurrence\.(?:All|First|Last)\b/,/\bOrder\.(?:Ascending|Descending)\b/,/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,/\bMissingField\.(?:Error|Ignore|UseNull)\b/,/\bQuoteStyle\.(?:Csv|None)\b/,/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,/\bGroupKind\.(?:Global|Local)\b/,/\bExtraValues\.(?:Error|Ignore|List)\b/,/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,/\bJoinSide\.(?:Left|Right)\b/,/\bPrecision\.(?:Decimal|Double)\b/,/\bRelativePosition\.From(?:End|Start)\b/,/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,/\bnull\b/],boolean:/\b(?:false|true)\b/,keyword:/\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,function:{pattern:/(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,lookbehind:!0},"data-type":{pattern:/\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,alias:"class-name"},number:{pattern:/\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,lookbehind:!0},operator:/[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,punctuation:/[,;\[\](){}]/},Prism.languages.pq=Prism.languages.powerquery,Prism.languages.mscript=Prism.languages.powerquery;j,fx[(function (Prism) {

	var powershell = Prism.languages.powershell = {
		'comment': [
			{
				pattern: /(^|[^`])<#[\s\S]*?#>/,
				lookbehind: true
			},
			{
				pattern: /(^|[^`])#.*/,
				lookbehind: true
			}
		],
		'string': [
			{
				pattern: /"(?:`[\s\S]|[^`"])*"/,
				greedy: true,
				inside: null // see below
			},
			{
				pattern: /'(?:[^']|'')*'/,
				greedy: true
			}
		],
		// Matches name spaces as well as casts, attribute decorators. Force starting with letter to avoid matching array indices
		// Supports two levels of nested brackets (e.g. `[OutputType([System.Collections.Generic.List[int]])]`)
		'namespace': /\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,
		'boolean': /\$(?:false|true)\b/i,
		'variable': /\$\w+\b/,
		// Cmdlets and aliases. Aliases should come last, otherwise "write" gets preferred over "write-host" for example
		// Get-Command | ?{ $_.ModuleName -match "Microsoft.PowerShell.(Util|Core|Management)" }
		// Get-Alias | ?{ $_.ReferencedCommand.Module.Name -match "Microsoft.PowerShell.(Util|Core|Management)" }
		'function': [
			/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,
			/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i
		],
		// per http://technet.microsoft.com/en-us/library/hh847744.aspx
		'keyword': /\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,
		'operator': {
			pattern: /(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,
			lookbehind: true
		},
		'punctuation': /[|{}[\];(),.]/
	};

	// Variable interpolation inside strings, and nested expressions
	powershell.string[0].inside = {
		'function': {
			// Allow for one level of nesting
			pattern: /(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,
			lookbehind: true,
			inside: powershell
		},
		'boolean': powershell.boolean,
		'variable': powershell.variable,
	};

}(Prism));
pHx^!function(e){var i=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(Prism);zF'x~Prism.languages.processing = Prism.languages.extend('clike', {
	'keyword': /\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,
	// Spaces are allowed between function name and parenthesis
	'function': /\b\w+(?=\s*\()/,
	'operator': /<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/
});

Prism.languages.insertBefore('processing', 'number', {
	// Special case: XML is a type
	'constant': /\b(?!XML\b)[A-Z][A-Z\d_]+\b/,
	'type': {
		pattern: /\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,
		alias: 'class-name'
	}
});
q0شxPrism.languages.processing=Prism.languages.extend("clike",{keyword:/\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,function:/\b\w+(?=\s*\()/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/}),Prism.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"class-name"}});nM*xXPrism.languages.prolog = {
	// Syntax depends on the implementation
	'comment': {
		pattern: /\/\*[\s\S]*?\*\/|%.*/,
		greedy: true
	},
	// Depending on the implementation, strings may allow escaped newlines and quote-escape
	'string': {
		pattern: /(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,
		greedy: true
	},
	'builtin': /\b(?:fx|fy|xf[xy]?|yfx?)\b/,
	// FIXME: Should we list all null-ary predicates (not followed by a parenthesis) like halt, trace, etc.?
	'function': /\b[a-z]\w*(?:(?=\()|\/\d+)/,
	'number': /\b\d+(?:\.\d*)?/,
	// Custom operators are allowed
	'operator': /[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,
	'punctuation': /[(){}\[\],]/
};
%x[Prism.languages.prolog={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,greedy:!0},builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,function:/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+(?:\.\d*)?/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/};Isx	k// Thanks to: https://github.com/prometheus-community/monaco-promql/blob/master/src/promql/promql.ts
// As well as: https://kausal.co/blog/slate-prism-add-new-syntax-promql/

(function (Prism) {
	// PromQL Aggregation Operators
	// (https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators)
	var aggregations = [
		'sum',
		'min',
		'max',
		'avg',
		'group',
		'stddev',
		'stdvar',
		'count',
		'count_values',
		'bottomk',
		'topk',
		'quantile'
	];

	// PromQL vector matching + the by and without clauses
	// (https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching)
	var vectorMatching = [
		'on',
		'ignoring',
		'group_right',
		'group_left',
		'by',
		'without',
	];

	// PromQL offset modifier
	// (https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier)
	var offsetModifier = ['offset'];

	var keywords = aggregations.concat(vectorMatching, offsetModifier);

	Prism.languages.promql = {
		'comment': {
			pattern: /(^[ \t]*)#.*/m,
			lookbehind: true
		},
		'vector-match': {
			// Match the comma-separated label lists inside vector matching:
			pattern: new RegExp('((?:' + vectorMatching.join('|') + ')\\s*)\\([^)]*\\)'),
			lookbehind: true,
			inside: {
				'label-key': {
					pattern: /\b[^,]+\b/,
					alias: 'attr-name',
				},
				'punctuation': /[(),]/
			},
		},
		'context-labels': {
			pattern: /\{[^{}]*\}/,
			inside: {
				'label-key': {
					pattern: /\b[a-z_]\w*(?=\s*(?:=|![=~]))/,
					alias: 'attr-name',
				},
				'label-value': {
					pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
					greedy: true,
					alias: 'attr-value',
				},
				'punctuation': /\{|\}|=~?|![=~]|,/,
			},
		},
		'context-range': [
			{
				pattern: /\[[\w\s:]+\]/, // [1m]
				inside: {
					'punctuation': /\[|\]|:/,
					'range-duration': {
						pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
						alias: 'number',
					},
				},
			},
			{
				pattern: /(\boffset\s+)\w+/, // offset 1m
				lookbehind: true,
				inside: {
					'range-duration': {
						pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
						alias: 'number',
					},
				},
			},
		],
		'keyword': new RegExp('\\b(?:' + keywords.join('|') + ')\\b', 'i'),
		'function': /\b[a-z_]\w*(?=\s*\()/i,
		'number': /[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,
		'operator': /[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,
		'punctuation': /[{};()`,.[\]]/,
	};
}(Prism));
šMx/!function(t){var n=["on","ignoring","group_right","group_left","by","without"],a=["sum","min","max","avg","group","stddev","stdvar","count","count_values","bottomk","topk","quantile"].concat(n,["offset"]);t.languages.promql={comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},"vector-match":{pattern:new RegExp("((?:"+n.join("|")+")\\s*)\\([^)]*\\)"),lookbehind:!0,inside:{"label-key":{pattern:/\b[^,]+\b/,alias:"attr-name"},punctuation:/[(),]/}},"context-labels":{pattern:/\{[^{}]*\}/,inside:{"label-key":{pattern:/\b[a-z_]\w*(?=\s*(?:=|![=~]))/,alias:"attr-name"},"label-value":{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0,alias:"attr-value"},punctuation:/\{|\}|=~?|![=~]|,/}},"context-range":[{pattern:/\[[\w\s:]+\]/,inside:{punctuation:/\[|\]|:/,"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}},{pattern:/(\boffset\s+)\w+/,lookbehind:!0,inside:{"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}}],keyword:new RegExp("\\b(?:"+a.join("|")+")\\b","i"),function:/\b[a-z_]\w*(?=\s*\()/i,number:/[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,operator:/[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,punctuation:/[{};()`,.[\]]/}}(Prism);ؿxdPrism.languages.properties = {
	'comment': /^[ \t]*[#!].*$/m,
	'value': {
		pattern: /(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,
		lookbehind: true,
		alias: 'attr-value'
	},
	'key': {
		pattern: /^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,
		alias: 'attr-name'
	},
	'punctuation': /[=:]/
};
[jx2Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/};dLx6(function (Prism) {

	var builtinTypes = /\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;

	Prism.languages.protobuf = Prism.languages.extend('clike', {
		'class-name': [
			{
				pattern: /(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,
				lookbehind: true
			},
			{
				pattern: /(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,
				lookbehind: true
			}
		],
		'keyword': /\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,
		'function': /\b[a-z_]\w*(?=\s*\()/i
	});

	Prism.languages.insertBefore('protobuf', 'operator', {
		'map': {
			pattern: /\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,
			alias: 'class-name',
			inside: {
				'punctuation': /[<>.,]/,
				'builtin': builtinTypes
			}
		},
		'builtin': builtinTypes,
		'positional-class-name': {
			pattern: /(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,
			alias: 'class-name',
			inside: {
				'punctuation': /\./
			}
		},
		'annotation': {
			pattern: /(\[\s*)[a-z_]\w*(?=\s*=)/i,
			lookbehind: true
		}
	});

}(Prism));
=x*!function(e){var s=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:s}},builtin:s,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism);D\:xPrism.languages.psl = {
	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	'string': {
		pattern: /"(?:\\.|[^\\"])*"/,
		greedy: true,
		inside: {
			'symbol': /\\[ntrbA-Z"\\]/
		}
	},
	'heredoc-string': {
		pattern: /<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,
		alias: 'string',
		greedy: true
	},
	'keyword': /\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,
	'constant': /\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,
	'boolean': /\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,
	'variable': /\b(?:PslDebug|errno|exit_status)\b/,
	'builtin': {
		pattern: /\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,
		alias: 'builtin-function'
	},
	'foreach-variable': {
		pattern: /(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,
		lookbehind: true,
		greedy: true
	},
	'function': /\b[_a-z]\w*\b(?=\s*\()/i,
	'number': /\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,
	'operator': /--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,
	'punctuation': /[(){}\[\];,]/
};
S1xkPrism.languages.psl={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0,inside:{symbol:/\\[ntrbA-Z"\\]/}},"heredoc-string":{pattern:/<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,alias:"string",greedy:!0},keyword:/\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,constant:/\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,boolean:/\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,variable:/\b(?:PslDebug|errno|exit_status)\b/,builtin:{pattern:/\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,alias:"builtin-function"},"foreach-variable":{pattern:/(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,lookbehind:!0,greedy:!0},function:/\b[_a-z]\w*\b(?=\s*\()/i,number:/\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,operator:/--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,punctuation:/[(){}\[\];,]/};Pxm(function (Prism) {
	// TODO:
	// - Add CSS highlighting inside <style> tags
	// - Add support for multi-line code blocks
	// - Add support for interpolation #{} and !{}
	// - Add support for tag interpolation #[]
	// - Add explicit support for plain text using |
	// - Add support for markup embedded in plain text

	Prism.languages.pug = {

		// Multiline stuff should appear before the rest

		// This handles both single-line and multi-line comments
		'comment': {
			pattern: /(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,
			lookbehind: true
		},

		// All the tag-related part is in lookbehind
		// so that it can be highlighted by the "tag" pattern
		'multiline-script': {
			pattern: /(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
			lookbehind: true,
			inside: Prism.languages.javascript
		},

		// See at the end of the file for known filters
		'filter': {
			pattern: /(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
			lookbehind: true,
			inside: {
				'filter-name': {
					pattern: /^:[\w-]+/,
					alias: 'variable'
				},
				'text': /\S[\s\S]*/,
			}
		},

		'multiline-plain-text': {
			pattern: /(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
			lookbehind: true
		},
		'markup': {
			pattern: /(^[\t ]*)<.+/m,
			lookbehind: true,
			inside: Prism.languages.markup
		},
		'doctype': {
			pattern: /((?:^|\n)[\t ]*)doctype(?: .+)?/,
			lookbehind: true
		},

		// This handle all conditional and loop keywords
		'flow-control': {
			pattern: /(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,
			lookbehind: true,
			inside: {
				'each': {
					pattern: /^each .+? in\b/,
					inside: {
						'keyword': /\b(?:each|in)\b/,
						'punctuation': /,/
					}
				},
				'branch': {
					pattern: /^(?:case|default|else|if|unless|when|while)\b/,
					alias: 'keyword'
				},
				rest: Prism.languages.javascript
			}
		},
		'keyword': {
			pattern: /(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,
			lookbehind: true
		},
		'mixin': [
			// Declaration
			{
				pattern: /(^[\t ]*)mixin .+/m,
				lookbehind: true,
				inside: {
					'keyword': /^mixin/,
					'function': /\w+(?=\s*\(|\s*$)/,
					'punctuation': /[(),.]/
				}
			},
			// Usage
			{
				pattern: /(^[\t ]*)\+.+/m,
				lookbehind: true,
				inside: {
					'name': {
						pattern: /^\+\w+/,
						alias: 'function'
					},
					rest: Prism.languages.javascript
				}
			}
		],
		'script': {
			pattern: /(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,
			lookbehind: true,
			inside: Prism.languages.javascript
		},

		'plain-text': {
			pattern: /(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,
			lookbehind: true
		},
		'tag': {
			pattern: /(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,
			lookbehind: true,
			inside: {
				'attributes': [
					{
						pattern: /&[^(]+\([^)]+\)/,
						inside: Prism.languages.javascript
					},
					{
						pattern: /\([^)]+\)/,
						inside: {
							'attr-value': {
								pattern: /(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,
								lookbehind: true,
								inside: Prism.languages.javascript
							},
							'attr-name': /[\w-]+(?=\s*!?=|\s*[,)])/,
							'punctuation': /[!=(),]+/
						}
					}
				],
				'punctuation': /:/,
				'attr-id': /#[\w\-]+/,
				'attr-class': /\.[\w\-]+/
			}
		},
		'code': [
			{
				pattern: /(^[\t ]*(?:-|!?=)).+/m,
				lookbehind: true,
				inside: Prism.languages.javascript
			}
		],
		'punctuation': /[.\-!=|]+/
	};

	var filter_pattern = /(^([\t ]*)):<filter_name>(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/.source;

	// Non exhaustive list of available filters and associated languages
	var filters = [
		{ filter: 'atpl', language: 'twig' },
		{ filter: 'coffee', language: 'coffeescript' },
		'ejs',
		'handlebars',
		'less',
		'livescript',
		'markdown',
		{ filter: 'sass', language: 'scss' },
		'stylus'
	];
	var all_filters = {};
	for (var i = 0, l = filters.length; i < l; i++) {
		var filter = filters[i];
		filter = typeof filter === 'string' ? { filter: filter, language: filter } : filter;
		if (Prism.languages[filter.language]) {
			all_filters['filter-' + filter.filter] = {
				pattern: RegExp(filter_pattern.replace('<filter_name>', function () { return filter.filter; }), 'm'),
				lookbehind: true,
				inside: {
					'filter-name': {
						pattern: /^:[\w-]+/,
						alias: 'variable'
					},
					'text': {
						pattern: /\S[\s\S]*/,
						alias: [filter.language, 'language-' + filter.language],
						inside: Prism.languages[filter.language]
					}
				}
			};
		}
	}

	Prism.languages.insertBefore('pug', 'filter', all_filters);

}(Prism));
5S x!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a<i;a++){var r=t[a];r="string"==typeof r?{filter:r,language:r}:r,e.languages[r.language]&&(n["filter-"+r.filter]={pattern:RegExp("(^([\t ]*)):<filter_name>(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("<filter_name>",(function(){return r.filter})),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[r.language,"language-"+r.language],inside:e.languages[r.language]}}})}e.languages.insertBefore("pug","filter",n)}(Prism);o]x`(function (Prism) {
	Prism.languages.puppet = {
		'heredoc': [
			// Matches the content of a quoted heredoc string (subject to interpolation)
			{
				pattern: /(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,
				lookbehind: true,
				alias: 'string',
				inside: {
					// Matches the end tag
					'punctuation': /(?=\S).*\S(?= *$)/
					// See interpolation below
				}
			},
			// Matches the content of an unquoted heredoc string (no interpolation)
			{
				pattern: /(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,
				lookbehind: true,
				greedy: true,
				alias: 'string',
				inside: {
					// Matches the end tag
					'punctuation': /(?=\S).*\S(?= *$)/
				}
			},
			// Matches the start tag of heredoc strings
			{
				pattern: /@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,
				alias: 'string',
				inside: {
					'punctuation': {
						pattern: /(\().+?(?=\))/,
						lookbehind: true
					}
				}
			}
		],
		'multiline-comment': {
			pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
			lookbehind: true,
			greedy: true,
			alias: 'comment'
		},
		'regex': {
			// Must be prefixed with the keyword "node" or a non-word char
			pattern: /((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,
			lookbehind: true,
			greedy: true,
			inside: {
				// Extended regexes must have the x flag. They can contain single-line comments.
				'extended-regex': {
					pattern: /^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,
					inside: {
						'comment': /#.*/
					}
				}
			}
		},
		'comment': {
			pattern: /(^|[^\\])#.*/,
			lookbehind: true,
			greedy: true,
		},
		'string': {
			// Allow for one nested level of double quotes inside interpolation
			pattern: /(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,
			greedy: true,
			inside: {
				'double-quoted': {
					pattern: /^"[\s\S]*"$/,
					inside: {
						// See interpolation below
					}
				}
			}
		},
		'variable': {
			pattern: /\$(?:::)?\w+(?:::\w+)*/,
			inside: {
				'punctuation': /::/
			}
		},
		'attr-name': /(?:\b\w+|\*)(?=\s*=>)/,
		'function': [
			{
				pattern: /(\.)(?!\d)\w+/,
				lookbehind: true
			},
			/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/
		],
		'number': /\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,
		'boolean': /\b(?:false|true)\b/,
		// Includes words reserved for future use
		'keyword': /\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,
		'datatype': {
			pattern: /\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,
			alias: 'symbol'
		},
		'operator': /=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,
		'punctuation': /[\[\]{}().,;]|:+/
	};

	var interpolation = [
		{
			// Allow for one nested level of braces inside interpolation
			pattern: /(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,
			lookbehind: true,
			inside: {
				'short-variable': {
					// Negative look-ahead prevent wrong highlighting of functions
					pattern: /(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,
					lookbehind: true,
					alias: 'variable',
					inside: {
						'punctuation': /::/
					}
				},
				'delimiter': {
					pattern: /^\$/,
					alias: 'variable'
				},
				rest: Prism.languages.puppet
			}
		},
		{
			pattern: /(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,
			lookbehind: true,
			alias: 'variable',
			inside: {
				'punctuation': /::/
			}
		}
	];
	Prism.languages.puppet['heredoc'][0].inside.interpolation = interpolation;
	Prism.languages.puppet['string'].inside['double-quoted'].inside.interpolation = interpolation;
}(Prism));
F諠x	!function(e){e.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\b\w+|\*)(?=\s*=>)/,function:[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,boolean:/\b(?:false|true)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:e.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside["double-quoted"].inside.interpolation=n}(Prism);:h6x(function (Prism) {
	// https://agraef.github.io/pure-docs/pure.html#lexical-matters

	Prism.languages.pure = {
		'comment': [
			{
				pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
				lookbehind: true
			},
			{
				pattern: /(^|[^\\:])\/\/.*/,
				lookbehind: true
			},
			/#!.+/
		],
		'inline-lang': {
			pattern: /%<[\s\S]+?%>/,
			greedy: true,
			inside: {
				'lang': {
					pattern: /(^%< *)-\*-.+?-\*-/,
					lookbehind: true,
					alias: 'comment'
				},
				'delimiter': {
					pattern: /^%<.*|%>$/,
					alias: 'punctuation'
				}
			}
		},
		'string': {
			pattern: /"(?:\\.|[^"\\\r\n])*"/,
			greedy: true
		},
		'number': {
			// The look-behind prevents wrong highlighting of the .. operator
			pattern: /((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,
			lookbehind: true
		},
		'keyword': /\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,
		'function': /\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,
		'special': {
			pattern: /\b__[a-z]+__\b/i,
			alias: 'builtin'
		},
		// Any combination of operator chars can be an operator
		// eslint-disable-next-line no-misleading-character-class
		'operator': /(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,
		// FIXME: How can we prevent | and , to be highlighted as operator when they are used alone?
		'punctuation': /[(){}\[\];,|]/
	};

	var inlineLanguages = [
		'c',
		{ lang: 'c++', alias: 'cpp' },
		'fortran'
	];
	var inlineLanguageRe = /%< *-\*- *<lang>\d* *-\*-[\s\S]+?%>/.source;

	inlineLanguages.forEach(function (lang) {
		var alias = lang;
		if (typeof lang !== 'string') {
			alias = lang.alias;
			lang = lang.lang;
		}
		if (Prism.languages[alias]) {
			var o = {};
			o['inline-lang-' + alias] = {
				pattern: RegExp(inlineLanguageRe.replace('<lang>', lang.replace(/([.+*?\/\\(){}\[\]])/g, '\\$1')), 'i'),
				inside: Prism.util.clone(Prism.languages.pure['inline-lang'].inside)
			};
			o['inline-lang-' + alias].inside.rest = Prism.util.clone(Prism.languages[alias]);
			Prism.languages.insertBefore('pure', 'inline-lang', o);
		}
	});

	// C is the default inline language
	if (Prism.languages.c) {
		Prism.languages.pure['inline-lang'].inside.rest = Prism.util.clone(Prism.languages.c);
	}

}(Prism));
@xf!function(e){e.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/},["c",{lang:"c++",alias:"cpp"},"fortran"].forEach((function(t){var a=t;if("string"!=typeof t&&(a=t.alias,t=t.lang),e.languages[a]){var r={};r["inline-lang-"+a]={pattern:RegExp("%< *-\\*- *<lang>\\d* *-\\*-[^]+?%>".replace("<lang>",t.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:e.util.clone(e.languages.pure["inline-lang"].inside)},r["inline-lang-"+a].inside.rest=e.util.clone(e.languages[a]),e.languages.insertBefore("pure","inline-lang",r)}})),e.languages.c&&(e.languages.pure["inline-lang"].inside.rest=e.util.clone(e.languages.c))}(Prism);|x8/*
Original Code by Bas Groothedde
!!MANY THANKS!! I never would have made this, regex and me will never be best friends ;)
==> https://codepen.io/ImagineProgramming/details/JYydBy/
slightly changed to pass all tests
*/


// PureBasic support, steal stuff from ansi-c
Prism.languages.purebasic = Prism.languages.extend('clike', {
	'comment': /;.*/,
	'keyword': /\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,
	'function': /\b\w+(?:\.\w+)?\s*(?=\()/,
	'number': /(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,
	'operator': /(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*/@]/
});

Prism.languages.insertBefore('purebasic', 'keyword', {
	'tag': /#\w+\$?/,
	'asm': {
		pattern: /(^[\t ]*)!.*/m,
		lookbehind: true,
		alias: 'tag',
		inside: {
			'comment': /;.*/,
			'string': {
				pattern: /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
				greedy: true
			},
			// Anonymous label references, i.e.: jmp @b
			'label-reference-anonymous': {
				pattern: /(!\s*j[a-z]+\s+)@[fb]/i,
				lookbehind: true,
				alias: 'fasm-label'
			},
			// Named label reference, i.e.: jne label1
			'label-reference-addressed': {
				pattern: /(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,
				lookbehind: true,
				alias: 'fasm-label'
			},
			'keyword': [
				/\b(?:extern|global)\b[^;\r\n]*/i,
				/\b(?:CPU|DEFAULT|FLOAT)\b.*/
			],
			'function': {
				pattern: /^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,
				lookbehind: true
			},
			'function-inline': {
				pattern: /(:\s*)[\da-z]+(?=\s)/i,
				lookbehind: true,
				alias: 'function'
			},
			'label': {
				pattern: /^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,
				lookbehind: true,
				alias: 'fasm-label'
			},
			'register': /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,
			'number': /(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,
			'operator': /[\[\]*+\-/%<>=&|$!,.:]/
		}
	}
});

delete Prism.languages.purebasic['class-name'];
delete Prism.languages.purebasic['boolean'];

Prism.languages.pbfasm = Prism.languages['purebasic'];
#x	ZPrism.languages.purebasic=Prism.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*/@]/}),Prism.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete Prism.languages.purebasic["class-name"],delete Prism.languages.purebasic.boolean,Prism.languages.pbfasm=Prism.languages.purebasic;"dxtPrism.languages.purescript = Prism.languages.extend('haskell', {
	'keyword': /\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,

	'import-statement': {
		// The imported or hidden names are not included in this import
		// statement. This is because we want to highlight those exactly like
		// we do for the names in the program.
		pattern: /(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,
		lookbehind: true,
		inside: {
			'keyword': /\b(?:as|hiding|import)\b/,
			'punctuation': /\./
		}
	},

	// These are builtin functions only. Constructors are highlighted later as a constant.
	'builtin': /\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,

	'operator': [
		// Infix operators
		Prism.languages.haskell.operator[0],
		// ASCII operators
		Prism.languages.haskell.operator[2],
		// All UTF16 Unicode operator symbols
		// This regex is equivalent to /(?=[\x80-\uFFFF])[\p{gc=Math_Symbol}\p{gc=Currency_Symbol}\p{Modifier_Symbol}\p{Other_Symbol}]/u
		// See https://github.com/PrismJS/prism/issues/3006 for more details.
		/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/
	]
});

Prism.languages.purs = Prism.languages.purescript;
%x	Prism.languages.purescript=Prism.languages.extend("haskell",{keyword:/\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import)\b/,punctuation:/\./}},builtin:/\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,operator:[Prism.languages.haskell.operator[0],Prism.languages.haskell.operator[2],/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/]}),Prism.languages.purs=Prism.languages.purescript;tex	3Prism.languages.python = {
	'comment': {
		pattern: /(^|[^\\])#.*/,
		lookbehind: true,
		greedy: true
	},
	'string-interpolation': {
		pattern: /(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,
		greedy: true,
		inside: {
			'interpolation': {
				// "{" <expression> <optional "!s", "!r", or "!a"> <optional ":" format specifier> "}"
				pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,
				lookbehind: true,
				inside: {
					'format-spec': {
						pattern: /(:)[^:(){}]+(?=\}$)/,
						lookbehind: true
					},
					'conversion-option': {
						pattern: /![sra](?=[:}]$)/,
						alias: 'punctuation'
					},
					rest: null
				}
			},
			'string': /[\s\S]+/
		}
	},
	'triple-quoted-string': {
		pattern: /(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,
		greedy: true,
		alias: 'string'
	},
	'string': {
		pattern: /(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,
		greedy: true
	},
	'function': {
		pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,
		lookbehind: true
	},
	'class-name': {
		pattern: /(\bclass\s+)\w+/i,
		lookbehind: true
	},
	'decorator': {
		pattern: /(^[\t ]*)@\w+(?:\.\w+)*/m,
		lookbehind: true,
		alias: ['annotation', 'punctuation'],
		inside: {
			'punctuation': /\./
		}
	},
	'keyword': /\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,
	'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,
	'boolean': /\b(?:False|None|True)\b/,
	'number': /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,
	'operator': /[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
	'punctuation': /[{}[\];(),.:]/
};

Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python;

Prism.languages.py = Prism.languages.python;
KD}xAPrism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python;ox
Prism.languages.q = {
	'string': /"(?:\\.|[^"\\\r\n])*"/,
	'comment': [
		// From http://code.kx.com/wiki/Reference/Slash:
		// When / is following a space (or a right parenthesis, bracket, or brace), it is ignored with the rest of the line.
		{

			pattern: /([\t )\]}])\/.*/,
			lookbehind: true,
			greedy: true
		},
		// From http://code.kx.com/wiki/Reference/Slash:
		// A line which has / as its first character and contains at least one other non-whitespace character is a whole-line comment and is ignored entirely.
		// A / on a line by itself begins a multiline comment which is terminated by the next \ on a line by itself.
		// If a / is not matched by a \, the multiline comment is unterminated and continues to end of file.
		// The / and \ must be the first char on the line, but may be followed by any amount of whitespace.
		{
			pattern: /(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,
			lookbehind: true,
			greedy: true
		},
		// From http://code.kx.com/wiki/Reference/Slash:
		// A \ on a line by itself with no preceding matching / will comment to end of file.
		{
			pattern: /^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,
			greedy: true
		},
		{
			pattern: /^#!.+/m,
			greedy: true
		}
	],
	'symbol': /`(?::\S+|[\w.]*)/,
	'datetime': {
		pattern: /0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,
		alias: 'number'
	},
	// The negative look-ahead prevents bad highlighting
	// of verbs 0: and 1:
	'number': /\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,
	'keyword': /\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,
	'adverb': {
		pattern: /['\/\\]:?|\beach\b/,
		alias: 'function'
	},
	'verb': {
		pattern: /(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,
		alias: 'operator'
	},
	'punctuation': /[(){}\[\];.]/
};
%NkxNPrism.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/};݊wxp(function (Prism) {

	var jsString = /"(?:\\.|[^\\"\r\n])*"|'(?:\\.|[^\\'\r\n])*'/.source;
	var jsComment = /\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))*\*\//.source;

	var jsExpr = /(?:[^\\()[\]{}"'/]|<string>|\/(?![*/])|<comment>|\(<expr>*\)|\[<expr>*\]|\{<expr>*\}|\\[\s\S])/
		.source.replace(/<string>/g, function () { return jsString; }).replace(/<comment>/g, function () { return jsComment; });

	// the pattern will blow up, so only a few iterations
	for (var i = 0; i < 2; i++) {
		jsExpr = jsExpr.replace(/<expr>/g, function () { return jsExpr; });
	}
	jsExpr = jsExpr.replace(/<expr>/g, '[^\\s\\S]');


	Prism.languages.qml = {
		'comment': {
			pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
			greedy: true
		},
		'javascript-function': {
			pattern: RegExp(/((?:^|;)[ \t]*)function\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*\(<js>*\)\s*\{<js>*\}/.source.replace(/<js>/g, function () { return jsExpr; }), 'm'),
			lookbehind: true,
			greedy: true,
			alias: 'language-javascript',
			inside: Prism.languages.javascript
		},
		'class-name': {
			pattern: /((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,
			lookbehind: true
		},
		'property': [
			{
				pattern: /((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,
				lookbehind: true
			},
			{
				pattern: /((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,
				lookbehind: true,
				inside: {
					'keyword': /^property/,
					'property': /\w+(?:\.\w+)*/
				}
			}
		],
		'javascript-expression': {
			pattern: RegExp(/(:[ \t]*)(?![\s;}[])(?:(?!$|[;}])<js>)+/.source.replace(/<js>/g, function () { return jsExpr; }), 'm'),
			lookbehind: true,
			greedy: true,
			alias: 'language-javascript',
			inside: Prism.languages.javascript
		},
		'string': {
			pattern: /"(?:\\.|[^\\"\r\n])*"/,
			greedy: true
		},
		'keyword': /\b(?:as|import|on)\b/,
		'punctuation': /[{}[\]:;,]/
	};

}(Prism));
<HYxg!function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]|<string>|/(?![*/])|<comment>|\\(<expr>*\\)|\\[<expr>*\\]|\\{<expr>*\\}|\\\\[^])".replace(/<string>/g,(function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"})).replace(/<comment>/g,(function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"})),t=0;t<2;t++)r=r.replace(/<expr>/g,(function(){return r}));r=r.replace(/<expr>/g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(<js>*\\)\\s*\\{<js>*\\}".replace(/<js>/g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}])<js>)+".replace(/<js>/g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism);CڦGxqPrism.languages.qore = Prism.languages.extend('clike', {
	'comment': {
		pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,
		lookbehind: true
	},
	// Overridden to allow unescaped multi-line strings
	'string': {
		pattern: /("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,
		greedy: true
	},
	'keyword': /\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,
	'boolean': /\b(?:false|true)\b/i,
	'function': /\$?\b(?!\d)\w+(?=\()/,
	'number': /\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,
	'operator': {
		pattern: /(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,
		lookbehind: true
	},
	'variable': /\$(?!\d)\w+\b/
});
Ïл>xPrism.languages.qore=Prism.languages.extend("clike",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,lookbehind:!0},string:{pattern:/("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,boolean:/\b(?:false|true)\b/i,function:/\$?\b(?!\d)\w+(?=\()/,number:/\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,lookbehind:!0},variable:/\$(?!\d)\w+\b/});rUxM(function (Prism) {

	/**
	 * Replaces all placeholders "<<n>>" of given pattern with the n-th replacement (zero based).
	 *
	 * Note: This is a simple text based replacement. Be careful when using backreferences!
	 *
	 * @param {string} pattern the given pattern.
	 * @param {string[]} replacements a list of replacement which can be inserted into the given pattern.
	 * @returns {string} the pattern with all placeholders replaced with their corresponding replacements.
	 * @example replace(/a<<0>>a/.source, [/b+/.source]) === /a(?:b+)a/.source
	 */
	function replace(pattern, replacements) {
		return pattern.replace(/<<(\d+)>>/g, function (m, index) {
			return '(?:' + replacements[+index] + ')';
		});
	}
	/**
	 * @param {string} pattern
	 * @param {string[]} replacements
	 * @param {string} [flags]
	 * @returns {RegExp}
	 */
	function re(pattern, replacements, flags) {
		return RegExp(replace(pattern, replacements), flags || '');
	}

	/**
	 * Creates a nested pattern where all occurrences of the string `<<self>>` are replaced with the pattern itself.
	 *
	 * @param {string} pattern
	 * @param {number} depthLog2
	 * @returns {string}
	 */
	function nested(pattern, depthLog2) {
		for (var i = 0; i < depthLog2; i++) {
			pattern = pattern.replace(/<<self>>/g, function () { return '(?:' + pattern + ')'; });
		}
		return pattern.replace(/<<self>>/g, '[^\\s\\S]');
	}

	// https://docs.microsoft.com/en-us/azure/quantum/user-guide/language/typesystem/
	// https://github.com/microsoft/qsharp-language/tree/main/Specifications/Language/5_Grammar
	var keywordKinds = {
		// keywords which represent a return or variable type
		type: 'Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero',
		// all other keywords
		other: 'Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within'
	};
	// keywords
	function keywordsToPattern(words) {
		return '\\b(?:' + words.trim().replace(/ /g, '|') + ')\\b';
	}
	var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.other));

	// types
	var identifier = /\b[A-Za-z_]\w*\b/.source;
	var qualifiedName = replace(/<<0>>(?:\s*\.\s*<<0>>)*/.source, [identifier]);

	var typeInside = {
		'keyword': keywords,
		'punctuation': /[<>()?,.:[\]]/
	};

	// strings
	var regularString = /"(?:\\.|[^\\"])*"/.source;

	Prism.languages.qsharp = Prism.languages.extend('clike', {
		'comment': /\/\/.*/,
		'string': [
			{
				pattern: re(/(^|[^$\\])<<0>>/.source, [regularString]),
				lookbehind: true,
				greedy: true
			}
		],
		'class-name': [
			{
				// open Microsoft.Quantum.Canon;
				// open Microsoft.Quantum.Canon as CN;
				pattern: re(/(\b(?:as|open)\s+)<<0>>(?=\s*(?:;|as\b))/.source, [qualifiedName]),
				lookbehind: true,
				inside: typeInside
			},
			{
				// namespace Quantum.App1;
				pattern: re(/(\bnamespace\s+)<<0>>(?=\s*\{)/.source, [qualifiedName]),
				lookbehind: true,
				inside: typeInside
			},
		],
		'keyword': keywords,
		'number': /(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,
		'operator': /\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,
		'punctuation': /::|[{}[\];(),.:]/
	});

	Prism.languages.insertBefore('qsharp', 'number', {
		'range': {
			pattern: /\.\./,
			alias: 'operator'
		}
	});

	// single line
	var interpolationExpr = nested(replace(/\{(?:[^"{}]|<<0>>|<<self>>)*\}/.source, [regularString]), 2);

	Prism.languages.insertBefore('qsharp', 'string', {
		'interpolation-string': {
			pattern: re(/\$"(?:\\.|<<0>>|[^\\"{])*"/.source, [interpolationExpr]),
			greedy: true,
			inside: {
				'interpolation': {
					pattern: re(/((?:^|[^\\])(?:\\\\)*)<<0>>/.source, [interpolationExpr]),
					lookbehind: true,
					inside: {
						'punctuation': /^\{|\}$/,
						'expression': {
							pattern: /[\s\S]+/,
							alias: 'language-qsharp',
							inside: Prism.languages.qsharp
						}
					}
				},
				'string': /[\s\S]+/
			}
		}
	});

}(Prism));

Prism.languages.qs = Prism.languages.qsharp;
USgxxp!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,r){return"(?:"+n[+r]+")"}))}function r(e,r,a){return RegExp(n(e,r),a||"")}var a=RegExp("\\b(?:"+"Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within".trim().replace(/ /g,"|")+")\\b"),t=n("<<0>>(?:\\s*\\.\\s*<<0>>)*",["\\b[A-Za-z_]\\w*\\b"]),i={keyword:a,punctuation:/[<>()?,.:[\]]/},s='"(?:\\\\.|[^\\\\"])*"';e.languages.qsharp=e.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:r("(^|[^$\\\\])<<0>>",[s]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:r("(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))",[t]),lookbehind:!0,inside:i},{pattern:r("(\\bnamespace\\s+)<<0>>(?=\\s*\\{)",[t]),lookbehind:!0,inside:i}],keyword:a,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),e.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var o=function(e,n){for(var r=0;r<2;r++)e=e.replace(/<<self>>/g,(function(){return"(?:"+e+")"}));return e.replace(/<<self>>/g,"[^\\s\\S]")}(n('\\{(?:[^"{}]|<<0>>|<<self>>)*\\}',[s]));e.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:r('\\$"(?:\\\\.|<<0>>|[^\\\\"{])*"',[o]),greedy:!0,inside:{interpolation:{pattern:r("((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>",[o]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:e.languages.qsharp}}},string:/[\s\S]+/}}})}(Prism),Prism.languages.qs=Prism.languages.qsharp;TO*xYPrism.languages.r = {
	'comment': /#.*/,
	'string': {
		pattern: /(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},
	'percent-operator': {
		// Includes user-defined operators
		// and %%, %*%, %/%, %in%, %o%, %x%
		pattern: /%[^%\s]*%/,
		alias: 'operator'
	},
	'boolean': /\b(?:FALSE|TRUE)\b/,
	'ellipsis': /\.\.(?:\.|\d+)/,
	'number': [
		/\b(?:Inf|NaN)\b/,
		/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/
	],
	'keyword': /\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,
	'operator': /->?>?|<(?:=|<?-)?|[>=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,
	'punctuation': /[(){}\[\],;]/
};
}ˀ xPrism.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:FALSE|TRUE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:Inf|NaN)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,operator:/->?>?|<(?:=|<?-)?|[>=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/};e&xPrism.languages.racket = Prism.languages.extend('scheme', {
	'lambda-parameter': {
		// the racket lambda syntax is a lot more complex, so we won't even attempt to capture it.
		// this will just prevent false positives of the `function` pattern
		pattern: /([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,
		lookbehind: true
	}
});

Prism.languages.insertBefore('racket', 'string', {
	'lang': {
		pattern: /^#lang.+/m,
		greedy: true,
		alias: 'keyword'
	}
});

Prism.languages.rkt = Prism.languages.racket;
J?|xPrism.languages.racket=Prism.languages.extend("scheme",{"lambda-parameter":{pattern:/([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,lookbehind:!0}}),Prism.languages.insertBefore("racket","string",{lang:{pattern:/^#lang.+/m,greedy:!0,alias:"keyword"}}),Prism.languages.rkt=Prism.languages.racket;fExPPrism.languages.reason = Prism.languages.extend('clike', {
	'string': {
		pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
		greedy: true
	},
	// 'class-name' must be matched *after* 'constructor' defined below
	'class-name': /\b[A-Z]\w*/,
	'keyword': /\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,
	'operator': /\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/
});
Prism.languages.insertBefore('reason', 'class-name', {
	'char': {
		pattern: /'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,
		greedy: true
	},
	// Negative look-ahead prevents from matching things like String.capitalize
	'constructor': /\b[A-Z]\w*\b(?!\s*\.)/,
	'label': {
		pattern: /\b[a-z]\w*(?=::)/,
		alias: 'symbol'
	}
});

// We can't match functions property, so let's not even try.
delete Prism.languages.reason.function;
Gc3x3Prism.languages.reason=Prism.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),Prism.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete Prism.languages.reason.function;y&3xR	(function (Prism) {

	var specialEscape = {
		pattern: /\\[\\(){}[\]^$+*?|.]/,
		alias: 'escape'
	};
	var escape = /\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/;
	var charSet = {
		pattern: /\.|\\[wsd]|\\p\{[^{}]+\}/i,
		alias: 'class-name'
	};
	var charSetWithoutDot = {
		pattern: /\\[wsd]|\\p\{[^{}]+\}/i,
		alias: 'class-name'
	};

	var rangeChar = '(?:[^\\\\-]|' + escape.source + ')';
	var range = RegExp(rangeChar + '-' + rangeChar);

	// the name of a capturing group
	var groupName = {
		pattern: /(<|')[^<>']+(?=[>']$)/,
		lookbehind: true,
		alias: 'variable'
	};

	Prism.languages.regex = {
		'char-class': {
			pattern: /((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,
			lookbehind: true,
			inside: {
				'char-class-negation': {
					pattern: /(^\[)\^/,
					lookbehind: true,
					alias: 'operator'
				},
				'char-class-punctuation': {
					pattern: /^\[|\]$/,
					alias: 'punctuation'
				},
				'range': {
					pattern: range,
					inside: {
						'escape': escape,
						'range-punctuation': {
							pattern: /-/,
							alias: 'operator'
						}
					}
				},
				'special-escape': specialEscape,
				'char-set': charSetWithoutDot,
				'escape': escape
			}
		},
		'special-escape': specialEscape,
		'char-set': charSet,
		'backreference': [
			{
				// a backreference which is not an octal escape
				pattern: /\\(?![123][0-7]{2})[1-9]/,
				alias: 'keyword'
			},
			{
				pattern: /\\k<[^<>']+>/,
				alias: 'keyword',
				inside: {
					'group-name': groupName
				}
			}
		],
		'anchor': {
			pattern: /[$^]|\\[ABbGZz]/,
			alias: 'function'
		},
		'escape': escape,
		'group': [
			{
				// https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html
				// https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference?view=netframework-4.7.2#grouping-constructs

				// (), (?<name>), (?'name'), (?>), (?:), (?=), (?!), (?<=), (?<!), (?is-m), (?i-m:)
				pattern: /\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,
				alias: 'punctuation',
				inside: {
					'group-name': groupName
				}
			},
			{
				pattern: /\)/,
				alias: 'punctuation'
			}
		],
		'quantifier': {
			pattern: /(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,
			alias: 'number'
		},
		'alternation': {
			pattern: /\|/,
			alias: 'keyword'
		}
	};

}(Prism));
\Px	!function(a){var e={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,t="(?:[^\\\\-]|"+n.source+")",s=RegExp(t+"-"+t),i={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":e,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":e,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":i}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":i}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(Prism);I/x// https://www.openpolicyagent.org/docs/latest/policy-reference/

Prism.languages.rego = {
	'comment': /#.*/,
	'property': {
		pattern: /(^|[^\\.])(?:"(?:\\.|[^\\"\r\n])*"|`[^`]*`|\b[a-z_]\w*\b)(?=\s*:(?!=))/i,
		lookbehind: true,
		greedy: true
	},
	'string': {
		pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"|`[^`]*`/,
		lookbehind: true,
		greedy: true
	},

	'keyword': /\b(?:as|default|else|import|not|null|package|set(?=\s*\()|some|with)\b/,
	'boolean': /\b(?:false|true)\b/,

	'function': {
		pattern: /\b[a-z_]\w*\b(?:\s*\.\s*\b[a-z_]\w*\b)*(?=\s*\()/i,
		inside: {
			'namespace': /\b\w+\b(?=\s*\.)/,
			'punctuation': /\./
		}
	},

	'number': /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
	'operator': /[-+*/%|&]|[<>:=]=?|!=|\b_\b/,
	'punctuation': /[,;.\[\]{}()]/
};
R$xGPrism.languages.rego={comment:/#.*/,property:{pattern:/(^|[^\\.])(?:"(?:\\.|[^\\"\r\n])*"|`[^`]*`|\b[a-z_]\w*\b)(?=\s*:(?!=))/i,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:as|default|else|import|not|null|package|set(?=\s*\()|some|with)\b/,boolean:/\b(?:false|true)\b/,function:{pattern:/\b[a-z_]\w*\b(?:\s*\.\s*\b[a-z_]\w*\b)*(?=\s*\()/i,inside:{namespace:/\b\w+\b(?=\s*\.)/,punctuation:/\./}},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,operator:/[-+*/%|&]|[<>:=]=?|!=|\b_\b/,punctuation:/[,;.\[\]{}()]/};+xPrism.languages.renpy = {
	'comment': {
		pattern: /(^|[^\\])#.+/,
		lookbehind: true
	},

	'string': {
		pattern: /("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,
		greedy: true
	},

	'function': /\b[a-z_]\w*(?=\()/i,

	'property': /\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,

	'tag': /\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,

	'keyword': /\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,

	'boolean': /\b(?:[Ff]alse|[Tt]rue)\b/,

	'number': /(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,

	'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,

	'punctuation': /[{}[\];(),.:]/
};

Prism.languages.rpy = Prism.languages.renpy;
Awx=Prism.languages.renpy={comment:{pattern:/(^|[^\\])#.+/,lookbehind:!0},string:{pattern:/("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,greedy:!0},function:/\b[a-z_]\w*(?=\()/i,property:/\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,tag:/\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,keyword:/\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,boolean:/\b(?:[Ff]alse|[Tt]rue)\b/,number:/(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,punctuation:/[{}[\];(),.:]/},Prism.languages.rpy=Prism.languages.renpy;>hsx:Prism.languages.rescript = {
	'comment': {
		pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
		greedy: true
	},
	'char': { pattern: /'(?:[^\r\n\\]|\\(?:.|\w+))'/, greedy: true },
	'string': {
		pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
		greedy: true
	},
	'class-name': /\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,
	'function': {
		pattern: /[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,
		lookbehind: true,
	},
	'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,
	'boolean': /\b(?:false|true)\b/,
	'attr-value': /[A-Za-z]\w*(?==)/,
	'constant': {
		pattern: /(\btype\s+)[a-z]\w*/,
		lookbehind: true
	},
	'tag': {
		pattern: /(<)[a-z]\w*|(?:<\/)[a-z]\w*/,
		lookbehind: true,
		inside: {
			'operator': /<|>|\//,
		},
	},
	'keyword': /\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,
	'operator': /\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,
	'punctuation': /[(){}[\],;.]/
};

Prism.languages.insertBefore('rescript', 'string', {
	'template-string': {
		pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
		greedy: true,
		inside: {
			'template-punctuation': {
				pattern: /^`|`$/,
				alias: 'string'
			},
			'interpolation': {
				pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
				lookbehind: true,
				inside: {
					'interpolation-punctuation': {
						pattern: /^\$\{|\}$/,
						alias: 'tag'
					},
					rest: Prism.languages.rescript
				}
			},
			'string': /[\s\S]+/
		}
	},
});

Prism.languages.res = Prism.languages.rescript;
dNjbx!Prism.languages.rescript={comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},char:{pattern:/'(?:[^\r\n\\]|\\(?:.|\w+))'/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,function:{pattern:/[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,lookbehind:!0},number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,boolean:/\b(?:false|true)\b/,"attr-value":/[A-Za-z]\w*(?==)/,constant:{pattern:/(\btype\s+)[a-z]\w*/,lookbehind:!0},tag:{pattern:/(<)[a-z]\w*|(?:<\/)[a-z]\w*/,lookbehind:!0,inside:{operator:/<|>|\//}},keyword:/\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,operator:/\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,punctuation:/[(){}[\],;.]/},Prism.languages.insertBefore("rescript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"tag"},rest:Prism.languages.rescript}},string:/[\s\S]+/}}}),Prism.languages.res=Prism.languages.rescript;#0mx`Prism.languages.rest = {
	'table': [
		{
			pattern: /(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,
			lookbehind: true,
			inside: {
				'punctuation': /\||(?:\+[=-]+)+\+/
			}
		},
		{
			pattern: /(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,
			lookbehind: true,
			inside: {
				'punctuation': /[=-]+/
			}
		}
	],

	// Directive-like patterns

	'substitution-def': {
		pattern: /(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,
		lookbehind: true,
		inside: {
			'substitution': {
				pattern: /^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,
				alias: 'attr-value',
				inside: {
					'punctuation': /^\||\|$/
				}
			},
			'directive': {
				pattern: /( )(?! )[^:]+::/,
				lookbehind: true,
				alias: 'function',
				inside: {
					'punctuation': /::$/
				}
			}
		}
	},
	'link-target': [
		{
			pattern: /(^[\t ]*\.\. )\[[^\]]+\]/m,
			lookbehind: true,
			alias: 'string',
			inside: {
				'punctuation': /^\[|\]$/
			}
		},
		{
			pattern: /(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,
			lookbehind: true,
			alias: 'string',
			inside: {
				'punctuation': /^_|:$/
			}
		}
	],
	'directive': {
		pattern: /(^[\t ]*\.\. )[^:]+::/m,
		lookbehind: true,
		alias: 'function',
		inside: {
			'punctuation': /::$/
		}
	},
	'comment': {
		// The two alternatives try to prevent highlighting of blank comments
		pattern: /(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,
		lookbehind: true
	},

	'title': [
		// Overlined and underlined
		{
			pattern: /^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,
			inside: {
				'punctuation': /^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,
				'important': /.+/
			}
		},

		// Underlined only
		{
			pattern: /(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,
			lookbehind: true,
			inside: {
				'punctuation': /[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,
				'important': /.+/
			}
		}
	],
	'hr': {
		pattern: /((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,
		lookbehind: true,
		alias: 'punctuation'
	},
	'field': {
		pattern: /(^[\t ]*):[^:\r\n]+:(?= )/m,
		lookbehind: true,
		alias: 'attr-name'
	},
	'command-line-option': {
		pattern: /(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,
		lookbehind: true,
		alias: 'symbol'
	},
	'literal-block': {
		pattern: /::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,
		inside: {
			'literal-block-punctuation': {
				pattern: /^::/,
				alias: 'punctuation'
			}
		}
	},
	'quoted-literal-block': {
		pattern: /::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,
		inside: {
			'literal-block-punctuation': {
				pattern: /^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,
				alias: 'punctuation'
			}
		}
	},
	'list-bullet': {
		pattern: /(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,
		lookbehind: true,
		alias: 'punctuation'
	},
	'doctest-block': {
		pattern: /(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,
		lookbehind: true,
		inside: {
			'punctuation': /^>>>/
		}
	},

	'inline': [
		{
			pattern: /(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,
			lookbehind: true,
			inside: {
				'bold': {
					pattern: /(^\*\*).+(?=\*\*$)/,
					lookbehind: true
				},
				'italic': {
					pattern: /(^\*).+(?=\*$)/,
					lookbehind: true
				},
				'inline-literal': {
					pattern: /(^``).+(?=``$)/,
					lookbehind: true,
					alias: 'symbol'
				},
				'role': {
					pattern: /^:[^:]+:|:[^:]+:$/,
					alias: 'function',
					inside: {
						'punctuation': /^:|:$/
					}
				},
				'interpreted-text': {
					pattern: /(^`).+(?=`$)/,
					lookbehind: true,
					alias: 'attr-value'
				},
				'substitution': {
					pattern: /(^\|).+(?=\|$)/,
					lookbehind: true,
					alias: 'attr-value'
				},
				'punctuation': /\*\*?|``?|\|/
			}
		}
	],

	'link': [
		{
			pattern: /\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,
			alias: 'string',
			inside: {
				'punctuation': /^\[|\]_$/
			}
		},
		{
			pattern: /(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,
			alias: 'string',
			inside: {
				'punctuation': /^_?`|`$|`?_?_$/
			}
		}
	],

	// Line block start,
	// quote attribution,
	// explicit markup start,
	// and anonymous hyperlink target shortcut (__)
	'punctuation': {
		pattern: /(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,
		lookbehind: true
	}
};
mm2x*Prism.languages.rest={table:[{pattern:/(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,lookbehind:!0,inside:{punctuation:/\||(?:\+[=-]+)+\+/}},{pattern:/(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,lookbehind:!0,inside:{punctuation:/[=-]+/}}],"substitution-def":{pattern:/(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,alias:"attr-value",inside:{punctuation:/^\||\|$/}},directive:{pattern:/( )(?! )[^:]+::/,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}}}},"link-target":[{pattern:/(^[\t ]*\.\. )\[[^\]]+\]/m,lookbehind:!0,alias:"string",inside:{punctuation:/^\[|\]$/}},{pattern:/(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,lookbehind:!0,alias:"string",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^[\t ]*\.\. )[^:]+::/m,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}},comment:{pattern:/(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,inside:{punctuation:/^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,lookbehind:!0,inside:{punctuation:/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,lookbehind:!0,alias:"punctuation"},field:{pattern:/(^[\t ]*):[^:\r\n]+:(?= )/m,lookbehind:!0,alias:"attr-name"},"command-line-option":{pattern:/(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,lookbehind:!0,alias:"symbol"},"literal-block":{pattern:/::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,inside:{"literal-block-punctuation":{pattern:/^::/,alias:"punctuation"}}},"quoted-literal-block":{pattern:/::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,inside:{"literal-block-punctuation":{pattern:/^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,alias:"punctuation"}}},"list-bullet":{pattern:/(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,lookbehind:!0,alias:"punctuation"},"doctest-block":{pattern:/(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\*\*).+(?=\*\*$)/,lookbehind:!0},italic:{pattern:/(^\*).+(?=\*$)/,lookbehind:!0},"inline-literal":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:"symbol"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:"function",inside:{punctuation:/^:|:$/}},"interpreted-text":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:"attr-value"},substitution:{pattern:/(^\|).+(?=\|$)/,lookbehind:!0,alias:"attr-value"},punctuation:/\*\*?|``?|\|/}}],link:[{pattern:/\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,alias:"string",inside:{punctuation:/^\[|\]_$/}},{pattern:/(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,alias:"string",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,lookbehind:!0}};8xsPrism.languages.rip = {
	'comment': {
		pattern: /#.*/,
		greedy: true
	},

	'char': {
		pattern: /\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,
		greedy: true
	},
	'string': {
		pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},

	'regex': {
		pattern: /(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,
		lookbehind: true,
		greedy: true
	},

	'keyword': /(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,

	'builtin': /@|\bSystem\b/,

	'boolean': /\b(?:false|true)\b/,

	'date': /\b\d{4}-\d{2}-\d{2}\b/,
	'time': /\b\d{2}:\d{2}:\d{2}\b/,
	'datetime': /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,

	'symbol': /:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,
	'number': /[+-]?\b(?:\d+\.\d+|\d+)\b/,

	'punctuation': /(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,

	'reference': /[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/
};
%0xPrism.languages.rip={comment:{pattern:/#.*/,greedy:!0},char:{pattern:/\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},regex:{pattern:/(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},keyword:/(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,builtin:/@|\bSystem\b/,boolean:/\b(?:false|true)\b/,date:/\b\d{4}-\d{2}-\d{2}\b/,time:/\b\d{2}:\d{2}:\d{2}\b/,datetime:/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,symbol:/:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,number:/[+-]?\b(?:\d+\.\d+|\d+)\b/,punctuation:/(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,reference:/[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/};4#x0Prism.languages.roboconf = {
	'comment': /#.*/,
	'keyword': {
		'pattern': /(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,
		lookbehind: true
	},
	'component': {
		pattern: /[\w-]+(?=[ \t]*\{)/,
		alias: 'variable'
	},
	'property': /[\w.-]+(?=[ \t]*:)/,
	'value': {
		pattern: /(=[ \t]*(?![ \t]))[^,;]+/,
		lookbehind: true,
		alias: 'attr-value'
	},
	'optional': {
		pattern: /\(optional\)/,
		alias: 'builtin'
	},
	'wildcard': {
		pattern: /(\.)\*/,
		lookbehind: true,
		alias: 'operator'
	},
	'punctuation': /[{},.;:=]/
};
x=Prism.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*(?![ \t]))[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/};NxC	(function (Prism) {

	var comment = {
		pattern: /(^[ \t]*| {2}|\t)#.*/m,
		lookbehind: true,
		greedy: true
	};

	var variable = {
		pattern: /((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,
		lookbehind: true,
		inside: {
			'punctuation': /^[$@&%]\{|\}$/
		}
	};

	function createSection(name, inside) {
		var extendecInside = {};

		extendecInside['section-header'] = {
			pattern: /^ ?\*{3}.+?\*{3}/,
			alias: 'keyword'
		};

		// copy inside tokens
		for (var token in inside) {
			extendecInside[token] = inside[token];
		}

		extendecInside['tag'] = {
			pattern: /([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,
			lookbehind: true,
			inside: {
				'punctuation': /\[|\]/
			}
		};
		extendecInside['variable'] = variable;
		extendecInside['comment'] = comment;

		return {
			pattern: RegExp(/^ ?\*{3}[ \t]*<name>[ \t]*\*{3}(?:.|[\r\n](?!\*{3}))*/.source.replace(/<name>/g, function () { return name; }), 'im'),
			alias: 'section',
			inside: extendecInside
		};
	}


	var docTag = {
		pattern: /(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,
		lookbehind: true,
		alias: 'string'
	};

	var testNameLike = {
		pattern: /([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,
		lookbehind: true,
		alias: 'function',
		inside: {
			'variable': variable
		}
	};

	var testPropertyLike = {
		pattern: /([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,
		lookbehind: true,
		inside: {
			'variable': variable
		}
	};

	Prism.languages['robotframework'] = {
		'settings': createSection('Settings', {
			'documentation': {
				pattern: /([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,
				lookbehind: true,
				alias: 'string'
			},
			'property': {
				pattern: /([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,
				lookbehind: true
			}
		}),
		'variables': createSection('Variables'),
		'test-cases': createSection('Test Cases', {
			'test-name': testNameLike,
			'documentation': docTag,
			'property': testPropertyLike
		}),
		'keywords': createSection('Keywords', {
			'keyword-name': testNameLike,
			'documentation': docTag,
			'property': testPropertyLike
		}),
		'tasks': createSection('Tasks', {
			'task-name': testNameLike,
			'documentation': docTag,
			'property': testPropertyLike
		}),
		'comment': comment
	};

	Prism.languages.robot = Prism.languages['robotframework'];

}(Prism));
ש\x5!function(t){var n={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},e={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function a(t,a){var r={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var o in a)r[o]=a[o];return r.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},r.variable=e,r.comment=n,{pattern:RegExp("^ ?\\*{3}[ \t]*<name>[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(/<name>/g,(function(){return t})),"im"),alias:"section",inside:r}}var r={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},o={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:e}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:e}};t.languages.robotframework={settings:a("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:a("Variables"),"test-cases":a("Test Cases",{"test-name":o,documentation:r,property:i}),keywords:a("Keywords",{"keyword-name":o,documentation:r,property:i}),tasks:a("Tasks",{"task-name":o,documentation:r,property:i}),comment:n},t.languages.robot=t.languages.robotframework}(Prism);'&xZ/**
 * Original by Samuel Flores
 *
 * Adds the following new token classes:
 *     constant, builtin, variable, symbol, regex
 */
(function (Prism) {
	Prism.languages.ruby = Prism.languages.extend('clike', {
		'comment': {
			pattern: /#.*|^=begin\s[\s\S]*?^=end/m,
			greedy: true
		},
		'class-name': {
			pattern: /(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,
			lookbehind: true,
			inside: {
				'punctuation': /[.\\]/
			}
		},
		'keyword': /\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,
		'operator': /\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,
		'punctuation': /[(){}[\].,;]/,
	});

	Prism.languages.insertBefore('ruby', 'operator', {
		'double-colon': {
			pattern: /::/,
			alias: 'punctuation'
		},
	});

	var interpolation = {
		pattern: /((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,
		lookbehind: true,
		inside: {
			'content': {
				pattern: /^(#\{)[\s\S]+(?=\}$)/,
				lookbehind: true,
				inside: Prism.languages.ruby
			},
			'delimiter': {
				pattern: /^#\{|\}$/,
				alias: 'punctuation'
			}
		}
	};

	delete Prism.languages.ruby.function;

	var percentExpression = '(?:' + [
		/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
		/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,
		/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,
		/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,
		/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source
	].join('|') + ')';

	var symbolName = /(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;

	Prism.languages.insertBefore('ruby', 'keyword', {
		'regex-literal': [
			{
				pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{0,6}/.source),
				greedy: true,
				inside: {
					'interpolation': interpolation,
					'regex': /[\s\S]+/
				}
			},
			{
				pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,
				lookbehind: true,
				greedy: true,
				inside: {
					'interpolation': interpolation,
					'regex': /[\s\S]+/
				}
			}
		],
		'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,
		'symbol': [
			{
				pattern: RegExp(/(^|[^:]):/.source + symbolName),
				lookbehind: true,
				greedy: true
			},
			{
				pattern: RegExp(/([\r\n{(,][ \t]*)/.source + symbolName + /(?=:(?!:))/.source),
				lookbehind: true,
				greedy: true
			},
		],
		'method-definition': {
			pattern: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,
			lookbehind: true,
			inside: {
				'function': /\b\w+$/,
				'keyword': /^self\b/,
				'class-name': /^\w+/,
				'punctuation': /\./
			}
		}
	});

	Prism.languages.insertBefore('ruby', 'string', {
		'string-literal': [
			{
				pattern: RegExp(/%[qQiIwWs]?/.source + percentExpression),
				greedy: true,
				inside: {
					'interpolation': interpolation,
					'string': /[\s\S]+/
				}
			},
			{
				pattern: /("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,
				greedy: true,
				inside: {
					'interpolation': interpolation,
					'string': /[\s\S]+/
				}
			},
			{
				pattern: /<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,
				alias: 'heredoc-string',
				greedy: true,
				inside: {
					'delimiter': {
						pattern: /^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,
						inside: {
							'symbol': /\b\w+/,
							'punctuation': /^<<[-~]?/
						}
					},
					'interpolation': interpolation,
					'string': /[\s\S]+/
				}
			},
			{
				pattern: /<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,
				alias: 'heredoc-string',
				greedy: true,
				inside: {
					'delimiter': {
						pattern: /^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,
						inside: {
							'symbol': /\b\w+/,
							'punctuation': /^<<[-~]?'|'$/,
						}
					},
					'string': /[\s\S]+/
				}
			}
		],
		'command-literal': [
			{
				pattern: RegExp(/%x/.source + percentExpression),
				greedy: true,
				inside: {
					'interpolation': interpolation,
					'command': {
						pattern: /[\s\S]+/,
						alias: 'string'
					}
				}
			},
			{
				pattern: /`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,
				greedy: true,
				inside: {
					'interpolation': interpolation,
					'command': {
						pattern: /[\s\S]+/,
						alias: 'string'
					}
				}
			}
		]
	});

	delete Prism.languages.ruby.string;

	Prism.languages.insertBefore('ruby', 'number', {
		'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,
		'constant': /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/
	});

	Prism.languages.rb = Prism.languages.ruby;
}(Prism));
ȘxH!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var n={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var t="(?:"+["([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^]|\\((?:[^()\\\\]|\\\\[^])*\\))*\\)","\\{(?:[^{}\\\\]|\\\\[^]|\\{(?:[^{}\\\\]|\\\\[^])*\\})*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^]|\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\])*\\]","<(?:[^<>\\\\]|\\\\[^]|<(?:[^<>\\\\]|\\\\[^])*>)*>"].join("|")+")",i='(?:"(?:\\\\.|[^"\\\\\r\n])*"|(?:\\b[a-zA-Z_]\\w*|[^\\s\0-\\x7F]+)[?!]?|\\$.)';e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp("%r"+t+"[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp("(^|[^:]):"+i),lookbehind:!0,greedy:!0},{pattern:RegExp("([\r\n{(,][ \t]*)"+i+"(?=:(?!:))"),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp("%[qQiIwWs]?"+t),greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp("%x"+t),greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism);D0x(function (Prism) {

	var multilineComment = /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source;
	for (var i = 0; i < 2; i++) {
		// support 4 levels of nested comments
		multilineComment = multilineComment.replace(/<self>/g, function () { return multilineComment; });
	}
	multilineComment = multilineComment.replace(/<self>/g, function () { return /[^\s\S]/.source; });


	Prism.languages.rust = {
		'comment': [
			{
				pattern: RegExp(/(^|[^\\])/.source + multilineComment),
				lookbehind: true,
				greedy: true
			},
			{
				pattern: /(^|[^\\:])\/\/.*/,
				lookbehind: true,
				greedy: true
			}
		],
		'string': {
			pattern: /b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,
			greedy: true
		},
		'char': {
			pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,
			greedy: true
		},
		'attribute': {
			pattern: /#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,
			greedy: true,
			alias: 'attr-name',
			inside: {
				'string': null // see below
			}
		},

		// Closure params should not be confused with bitwise OR |
		'closure-params': {
			pattern: /([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,
			lookbehind: true,
			greedy: true,
			inside: {
				'closure-punctuation': {
					pattern: /^\||\|$/,
					alias: 'punctuation'
				},
				rest: null // see below
			}
		},

		'lifetime-annotation': {
			pattern: /'\w+/,
			alias: 'symbol'
		},

		'fragment-specifier': {
			pattern: /(\$\w+:)[a-z]+/,
			lookbehind: true,
			alias: 'punctuation'
		},
		'variable': /\$\w+/,

		'function-definition': {
			pattern: /(\bfn\s+)\w+/,
			lookbehind: true,
			alias: 'function'
		},
		'type-definition': {
			pattern: /(\b(?:enum|struct|trait|type|union)\s+)\w+/,
			lookbehind: true,
			alias: 'class-name'
		},
		'module-declaration': [
			{
				pattern: /(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,
				lookbehind: true,
				alias: 'namespace'
			},
			{
				pattern: /(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,
				lookbehind: true,
				alias: 'namespace',
				inside: {
					'punctuation': /::/
				}
			}
		],
		'keyword': [
			// https://github.com/rust-lang/reference/blob/master/src/keywords.md
			/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,
			// primitives and str
			// https://doc.rust-lang.org/stable/rust-by-example/primitives.html
			/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/
		],

		// functions can technically start with an upper-case letter, but this will introduce a lot of false positives
		// and Rust's naming conventions recommend snake_case anyway.
		// https://doc.rust-lang.org/1.0.0/style/style/naming/README.html
		'function': /\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,
		'macro': {
			pattern: /\b\w+!/,
			alias: 'property'
		},
		'constant': /\b[A-Z_][A-Z_\d]+\b/,
		'class-name': /\b[A-Z]\w*\b/,

		'namespace': {
			pattern: /(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,
			inside: {
				'punctuation': /::/
			}
		},

		// Hex, oct, bin, dec numbers with visual separators and type suffix
		'number': /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,
		'boolean': /\b(?:false|true)\b/,
		'punctuation': /->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,
		'operator': /[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/
	};

	Prism.languages.rust['closure-params'].inside.rest = Prism.languages.rust;
	Prism.languages.rust['attribute'].inside['string'] = Prism.languages.rust['string'];

}(Prism));
6x	W!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|<self>)*\\*/",t=0;t<2;t++)a=a.replace(/<self>/g,(function(){return a}));a=a.replace(/<self>/g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism);qYx(f(function (Prism) {

	var stringPattern = /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))/.source;

	var number = /\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i;
	var numericConstant = {
		pattern: RegExp(stringPattern + '[bx]'),
		alias: 'number'
	};

	var macroVariable = {
		pattern: /&[a-z_]\w*/i
	};

	var macroKeyword = {
		pattern: /((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,
		lookbehind: true,
		alias: 'keyword'
	};

	var step = {
		pattern: /(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,
		alias: 'keyword',
		lookbehind: true
	};

	var comment = [
		/\/\*[\s\S]*?\*\//,
		{
			pattern: /(^[ \t]*|;\s*)\*[^;]*;/m,
			lookbehind: true
		}
	];

	var string = {
		pattern: RegExp(stringPattern),
		greedy: true
	};

	var punctuation = /[$%@.(){}\[\];,\\]/;

	var func = {
		pattern: /%?\b\w+(?=\()/,
		alias: 'keyword'
	};

	var args = {
		'function': func,
		'arg-value': {
			pattern: /(=\s*)[A-Z\.]+/i,
			lookbehind: true
		},
		'operator': /=/,
		'macro-variable': macroVariable,
		'arg': {
			pattern: /[A-Z]+/i,
			alias: 'keyword'
		},
		'number': number,
		'numeric-constant': numericConstant,
		'punctuation': punctuation,
		'string': string
	};

	var format = {
		pattern: /\b(?:format|put)\b=?[\w'$.]+/i,
		inside: {
			'keyword': /^(?:format|put)(?==)/i,
			'equals': /=/,
			'format': {
				pattern: /(?:\w|\$\d)+\.\d?/,
				alias: 'number'
			}
		}
	};

	var altformat = {
		pattern: /\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,
		inside: {
			'keyword': /^(?:format|put)/i,
			'format': {
				pattern: /[\w$]+\.\d?/,
				alias: 'number'
			}
		}
	};

	var globalStatements = {
		pattern: /((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,
		lookbehind: true,
		alias: 'keyword'
	};

	var submitStatement = {
		pattern: /(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,
		lookbehind: true,
		alias: 'keyword'
	};

	var actionSets = /aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce/.source;

	var casActions = {
		pattern: RegExp(/(^|\s)(?:action\s+)?(?:<act>)\.[a-z]+\b[^;]+/.source.replace(/<act>/g, function () { return actionSets; }), 'i'),
		lookbehind: true,
		inside: {
			'keyword': RegExp(/(?:<act>)\.[a-z]+\b/.source.replace(/<act>/g, function () { return actionSets; }), 'i'),
			'action': {
				pattern: /(?:action)/i,
				alias: 'keyword'
			},
			'comment': comment,
			'function': func,
			'arg-value': args['arg-value'],
			'operator': args.operator,
			'argument': args.arg,
			'number': number,
			'numeric-constant': numericConstant,
			'punctuation': punctuation,
			'string': string
		}
	};

	var keywords = {
		pattern: /((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,
		lookbehind: true,
	};

	Prism.languages.sas = {
		'datalines': {
			pattern: /^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,
			lookbehind: true,
			alias: 'string',
			inside: {
				'keyword': {
					pattern: /^(?:cards|(?:data)?lines)/i
				},
				'punctuation': /;/
			}
		},

		'proc-sql': {
			pattern: /(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
			lookbehind: true,
			inside: {
				'sql': {
					pattern: RegExp(/^[ \t]*(?:select|alter\s+table|(?:create|describe|drop)\s+(?:index|table(?:\s+constraints)?|view)|create\s+unique\s+index|insert\s+into|update)(?:<str>|[^;"'])+;/.source.replace(/<str>/g, function () { return stringPattern; }), 'im'),
					alias: 'language-sql',
					inside: Prism.languages.sql
				},
				'global-statements': globalStatements,
				'sql-statements': {
					pattern: /(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,
					lookbehind: true,
					alias: 'keyword'
				},
				'number': number,
				'numeric-constant': numericConstant,
				'punctuation': punctuation,
				'string': string
			}
		},

		'proc-groovy': {
			pattern: /(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
			lookbehind: true,
			inside: {
				'comment': comment,
				'groovy': {
					pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function () { return stringPattern; }), 'im'),
					lookbehind: true,
					alias: 'language-groovy',
					inside: Prism.languages.groovy
				},
				'keyword': keywords,
				'submit-statement': submitStatement,
				'global-statements': globalStatements,
				'number': number,
				'numeric-constant': numericConstant,
				'punctuation': punctuation,
				'string': string
			}
		},

		'proc-lua': {
			pattern: /(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
			lookbehind: true,
			inside: {
				'comment': comment,
				'lua': {
					pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function () { return stringPattern; }), 'im'),
					lookbehind: true,
					alias: 'language-lua',
					inside: Prism.languages.lua
				},
				'keyword': keywords,
				'submit-statement': submitStatement,
				'global-statements': globalStatements,
				'number': number,
				'numeric-constant': numericConstant,
				'punctuation': punctuation,
				'string': string
			}
		},

		'proc-cas': {
			pattern: /(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,
			lookbehind: true,
			inside: {
				'comment': comment,
				'statement-var': {
					pattern: /((?:^|\s)=?)saveresult\s[^;]+/im,
					lookbehind: true,
					inside: {

						'statement': {
							pattern: /^saveresult\s+\S+/i,
							inside: {
								keyword: /^(?:saveresult)/i
							}
						},
						rest: args
					}
				},
				'cas-actions': casActions,
				'statement': {
					pattern: /((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,
					lookbehind: true,
					inside: args
				},
				'step': step,
				'keyword': keywords,
				'function': func,
				'format': format,
				'altformat': altformat,
				'global-statements': globalStatements,
				'number': number,
				'numeric-constant': numericConstant,
				'punctuation': punctuation,
				'string': string
			}
		},

		'proc-args': {
			pattern: RegExp(/(^proc\s+\w+\s+)(?!\s)(?:[^;"']|<str>)+;/.source.replace(/<str>/g, function () { return stringPattern; }), 'im'),
			lookbehind: true,
			inside: args
		},
		/*Special keywords within macros*/
		'macro-keyword': macroKeyword,
		'macro-variable': macroVariable,
		'macro-string-functions': {
			pattern: /((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,
			lookbehind: true,
			inside: {
				'function': {
					pattern: /%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,
					alias: 'keyword'
				},
				'macro-keyword': macroKeyword,
				'macro-variable': macroVariable,
				'escaped-char': {
					pattern: /%['"()<>=¬^~;,#]/,
				},
				'punctuation': punctuation
			}
		},
		'macro-declaration': {
			pattern: /^%macro[^;]+(?=;)/im,
			inside: {
				'keyword': /%macro/i,
			}
		},
		'macro-end': {
			pattern: /^%mend[^;]+(?=;)/im,
			inside: {
				'keyword': /%mend/i,
			}
		},
		/*%_zscore(headcir, _lhc, _mhc, _shc, headcz, headcpct, _Fheadcz); */
		'macro': {
			pattern: /%_\w+(?=\()/,
			alias: 'keyword'
		},
		'input': {
			pattern: /\binput\s[-\w\s/*.$&]+;/i,
			inside: {
				'input': {
					alias: 'keyword',
					pattern: /^input/i,
				},
				'comment': comment,
				'number': number,
				'numeric-constant': numericConstant
			}
		},
		'options-args': {
			pattern: /(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,
			lookbehind: true,
			inside: args
		},
		'cas-actions': casActions,
		'comment': comment,
		'function': func,
		'format': format,
		'altformat': altformat,
		'numeric-constant': numericConstant,
		'datetime': {
			// '1jan2013'd, '9:25:19pm't, '18jan2003:9:27:05am'dt
			pattern: RegExp(stringPattern + '(?:dt?|t)'),
			alias: 'number'
		},
		'string': string,
		'step': step,
		'keyword': keywords,
		// In SAS Studio syntax highlighting, these operators are styled like keywords
		'operator-keyword': {
			pattern: /\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,
			alias: 'operator'
		},
		// Decimal (1.2e23), hexadecimal (0c1x)
		'number': number,
		'operator': /\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,
		'punctuation': punctuation
	};

}(Prism));
)̽xM!function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:<act>)\\.[a-z]+\\b[^;]+".replace(/<act>/g,(function(){return k})),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:<act>)\\.[a-z]+\\b".replace(/<act>/g,(function(){return k})),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:<str>|[^;\"'])+;".replace(/<str>/g,(function(){return t})),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:<str>|[^\"'])+?(?=endsubmit;)".replace(/<str>/g,(function(){return t})),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:<str>|[^\"'])+?(?=endsubmit;)".replace(/<str>/g,(function(){return t})),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|<str>)+;".replace(/<str>/g,(function(){return t})),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:c}}(Prism);GŴqx(function (Prism) {
	Prism.languages.sass = Prism.languages.extend('css', {
		// Sass comments don't need to be closed, only indented
		'comment': {
			pattern: /^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,
			lookbehind: true,
			greedy: true
		}
	});

	Prism.languages.insertBefore('sass', 'atrule', {
		// We want to consume the whole line
		'atrule-line': {
			// Includes support for = and + shortcuts
			pattern: /^(?:[ \t]*)[@+=].+/m,
			greedy: true,
			inside: {
				'atrule': /(?:@[\w-]+|[+=])/
			}
		}
	});
	delete Prism.languages.sass.atrule;


	var variable = /\$[-\w]+|#\{\$[-\w]+\}/;
	var operator = [
		/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,
		{
			pattern: /(\s)-(?=\s)/,
			lookbehind: true
		}
	];

	Prism.languages.insertBefore('sass', 'property', {
		// We want to consume the whole line
		'variable-line': {
			pattern: /^[ \t]*\$.+/m,
			greedy: true,
			inside: {
				'punctuation': /:/,
				'variable': variable,
				'operator': operator
			}
		},
		// We want to consume the whole line
		'property-line': {
			pattern: /^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,
			greedy: true,
			inside: {
				'property': [
					/[^:\s]+(?=\s*:)/,
					{
						pattern: /(:)[^:\s]+/,
						lookbehind: true
					}
				],
				'punctuation': /:/,
				'variable': variable,
				'operator': operator,
				'important': Prism.languages.sass.important
			}
		}
	});
	delete Prism.languages.sass.property;
	delete Prism.languages.sass.important;

	// Now that whole lines for other patterns are consumed,
	// what's left should be selectors
	Prism.languages.insertBefore('sass', 'punctuation', {
		'selector': {
			pattern: /^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,
			lookbehind: true,
			greedy: true
		}
	});

}(Prism));
%Cx=!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(Prism);/sdxKPrism.languages.scala = Prism.languages.extend('java', {
	'triple-quoted-string': {
		pattern: /"""[\s\S]*?"""/,
		greedy: true,
		alias: 'string'
	},
	'string': {
		pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},
	'keyword': /<-|=>|\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\b/,
	'number': /\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,
	'builtin': /\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,
	'symbol': /'[^\d\s\\]\w*/
});

Prism.languages.insertBefore('scala', 'triple-quoted-string', {
	'string-interpolation': {
		pattern: /\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,
		greedy: true,
		inside: {
			'id': {
				pattern: /^\w+/,
				greedy: true,
				alias: 'function'
			},
			'escape': {
				pattern: /\\\$"|\$[$"]/,
				greedy: true,
				alias: 'symbol'
			},
			'interpolation': {
				pattern: /\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
				greedy: true,
				inside: {
					'punctuation': /^\$\{?|\}$/,
					'expression': {
						pattern: /[\s\S]+/,
						inside: Prism.languages.scala
					}
				}
			},
			'string': /[\s\S]+/
		}
	}
});

delete Prism.languages.scala['class-name'];
delete Prism.languages.scala['function'];
delete Prism.languages.scala['constant'];
:iUxXPrism.languages.scala=Prism.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),Prism.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:Prism.languages.scala}}},string:/[\s\S]+/}}}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function,delete Prism.languages.scala.constant;)xx+(function (Prism) {
	Prism.languages.scheme = {
		// this supports "normal" single-line comments:
		//   ; comment
		// and (potentially nested) multiline comments:
		//   #| comment #| nested |# still comment |#
		// (only 1 level of nesting is supported)
		'comment': /;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,
		'string': {
			pattern: /"(?:[^"\\]|\\.)*"/,
			greedy: true
		},
		'symbol': {
			pattern: /'[^()\[\]#'\s]+/,
			greedy: true
		},
		'char': {
			pattern: /#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,
			greedy: true
		},
		'lambda-parameter': [
			// https://www.cs.cmu.edu/Groups/AI/html/r4rs/r4rs_6.html#SEC30
			{
				pattern: /((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,
				lookbehind: true
			},
			{
				pattern: /((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,
				lookbehind: true
			}
		],
		'keyword': {
			pattern: /((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,
			lookbehind: true
		},
		'builtin': {
			// all functions of the base library of R7RS plus some of built-ins of R5Rs
			pattern: /((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,
			lookbehind: true
		},
		'operator': {
			pattern: /((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,
			lookbehind: true
		},
		'number': {
			// The number pattern from [the R7RS spec](https://small.r7rs.org/attachment/r7rs.pdf).
			//
			// <number>      := <num 2>|<num 8>|<num 10>|<num 16>
			// <num R>       := <prefix R><complex R>
			// <complex R>   := <real R>(?:@<real R>|<imaginary R>)?|<imaginary R>
			// <imaginary R> := [+-](?:<ureal R>|(?:inf|nan)\.0)?i
			// <real R>      := [+-]?<ureal R>|[+-](?:inf|nan)\.0
			// <ureal R>     := <uint R>(?:\/<uint R>)?
			//                | <decimal R>
			//
			// <decimal 10>  := (?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?
			// <uint R>      := <digit R>+
			// <prefix R>    := <radix R>(?:#[ei])?|(?:#[ei])?<radix R>
			// <radix 2>     := #b
			// <radix 8>     := #o
			// <radix 10>    := (?:#d)?
			// <radix 16>    := #x
			// <digit 2>     := [01]
			// <digit 8>     := [0-7]
			// <digit 10>    := \d
			// <digit 16>    := [0-9a-f]
			//
			// The problem with this grammar is that the resulting regex is way to complex, so we simplify by grouping all
			// non-decimal bases together. This results in a decimal (dec) and combined binary, octal, and hexadecimal (box)
			// pattern:
			pattern: RegExp(SortedBNF({
				'<ureal dec>': /\d+(?:\/\d+)|(?:\d+(?:\.\d*)?|\.\d+)(?:[esfdl][+-]?\d+)?/.source,
				'<real dec>': /[+-]?<ureal dec>|[+-](?:inf|nan)\.0/.source,
				'<imaginary dec>': /[+-](?:<ureal dec>|(?:inf|nan)\.0)?i/.source,
				'<complex dec>': /<real dec>(?:@<real dec>|<imaginary dec>)?|<imaginary dec>/.source,
				'<num dec>': /(?:#d(?:#[ei])?|#[ei](?:#d)?)?<complex dec>/.source,

				'<ureal box>': /[0-9a-f]+(?:\/[0-9a-f]+)?/.source,
				'<real box>': /[+-]?<ureal box>|[+-](?:inf|nan)\.0/.source,
				'<imaginary box>': /[+-](?:<ureal box>|(?:inf|nan)\.0)?i/.source,
				'<complex box>': /<real box>(?:@<real box>|<imaginary box>)?|<imaginary box>/.source,
				'<num box>': /#[box](?:#[ei])?|(?:#[ei])?#[box]<complex box>/.source,

				'<number>': /(^|[()\[\]\s])(?:<num dec>|<num box>)(?=[()\[\]\s]|$)/.source,
			}), 'i'),
			lookbehind: true
		},
		'boolean': {
			pattern: /(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,
			lookbehind: true
		},
		'function': {
			pattern: /((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,
			lookbehind: true
		},
		'identifier': {
			pattern: /(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,
			lookbehind: true,
			greedy: true
		},
		'punctuation': /[()\[\]']/
	};

	/**
	 * Given a topologically sorted BNF grammar, this will return the RegExp source of last rule of the grammar.
	 *
	 * @param {Record<string, string>} grammar
	 * @returns {string}
	 */
	function SortedBNF(grammar) {
		for (var key in grammar) {
			grammar[key] = grammar[key].replace(/<[\w\s]+>/g, function (key) {
				return '(?:' + grammar[key].trim() + ')';
			});
		}
		// return the last item
		return grammar[key];
	}

}(Prism));

^xz!function(e){e.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(e){for(var r in e)e[r]=e[r].replace(/<[\w\s]+>/g,(function(r){return"(?:"+e[r].trim()+")"}));return e[r]}({"<ureal dec>":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?","<real dec>":"[+-]?<ureal dec>|[+-](?:inf|nan)\\.0","<imaginary dec>":"[+-](?:<ureal dec>|(?:inf|nan)\\.0)?i","<complex dec>":"<real dec>(?:@<real dec>|<imaginary dec>)?|<imaginary dec>","<num dec>":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?<complex dec>","<ureal box>":"[0-9a-f]+(?:/[0-9a-f]+)?","<real box>":"[+-]?<ureal box>|[+-](?:inf|nan)\\.0","<imaginary box>":"[+-](?:<ureal box>|(?:inf|nan)\\.0)?i","<complex box>":"<real box>(?:@<real box>|<imaginary box>)?|<imaginary box>","<num box>":"#[box](?:#[ei])?|(?:#[ei])?#[box]<complex box>","<number>":"(^|[()\\[\\]\\s])(?:<num dec>|<num box>)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}}(Prism);M{ݺx:	Prism.languages.scss = Prism.languages.extend('css', {
	'comment': {
		pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
		lookbehind: true
	},
	'atrule': {
		pattern: /@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,
		inside: {
			'rule': /@[\w-]+/
			// See rest below
		}
	},
	// url, compassified
	'url': /(?:[-a-z]+-)?url(?=\()/i,
	// CSS selector regex is not appropriate for Sass
	// since there can be lot more things (var, @ directive, nesting..)
	// a selector must start at the end of a property or after a brace (end of other rules or nesting)
	// it can contain some characters that aren't used for defining rules or end of selector, & (parent selector), or interpolated variable
	// the end of a selector is found when there is no rules in it ( {} or {\s}) or if there is a property (because an interpolated var
	// can "pass" as a selector- e.g: proper#{$erty})
	// this one was hard to do, so please be careful if you edit this one :)
	'selector': {
		// Initial look-ahead is used to prevent matching of blank selectors
		pattern: /(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,
		inside: {
			'parent': {
				pattern: /&/,
				alias: 'important'
			},
			'placeholder': /%[-\w]+/,
			'variable': /\$[-\w]+|#\{\$[-\w]+\}/
		}
	},
	'property': {
		pattern: /(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,
		inside: {
			'variable': /\$[-\w]+|#\{\$[-\w]+\}/
		}
	}
});

Prism.languages.insertBefore('scss', 'atrule', {
	'keyword': [
		/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,
		{
			pattern: /( )(?:from|through)(?= )/,
			lookbehind: true
		}
	]
});

Prism.languages.insertBefore('scss', 'important', {
	// var and interpolated vars
	'variable': /\$[-\w]+|#\{\$[-\w]+\}/
});

Prism.languages.insertBefore('scss', 'function', {
	'module-modifier': {
		pattern: /\b(?:as|hide|show|with)\b/i,
		alias: 'keyword'
	},
	'placeholder': {
		pattern: /%[-\w]+/,
		alias: 'selector'
	},
	'statement': {
		pattern: /\B!(?:default|optional)\b/i,
		alias: 'keyword'
	},
	'boolean': /\b(?:false|true)\b/,
	'null': {
		pattern: /\bnull\b/,
		alias: 'keyword'
	},
	'operator': {
		pattern: /(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,
		lookbehind: true
	}
});

Prism.languages.scss['atrule'].inside.rest = Prism.languages.scss;
H4Sx8Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss;uvox(function (Prism) {

	// CAREFUL!
	// The following patterns are concatenated, so the group referenced by a back reference is non-obvious!

	var strings = [
		// normal string
		/"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/.source,
		/'[^']*'/.source,
		/\$'(?:[^'\\]|\\[\s\S])*'/.source,

		// here doc
		// 2 capturing groups
		/<<-?\s*(["']?)(\w+)\1\s[\s\S]*?[\r\n]\2/.source
	].join('|');

	Prism.languages['shell-session'] = {
		'command': {
			pattern: RegExp(
				// user info
				/^/.source +
				'(?:' +
				(
					// <user> ":" ( <path> )?
					/[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+(?::[^\0-\x1F$#%*?"<>:;|]+)?/.source +
					'|' +
					// <path>
					// Since the path pattern is quite general, we will require it to start with a special character to
					// prevent false positives.
					/[/~.][^\0-\x1F$#%*?"<>@:;|]*/.source
				) +
				')?' +
				// shell symbol
				/[$#%](?=\s)/.source +
				// bash command
				/(?:[^\\\r\n \t'"<$]|[ \t](?:(?!#)|#.*$)|\\(?:[^\r]|\r\n?)|\$(?!')|<(?!<)|<<str>>)+/.source.replace(/<<str>>/g, function () { return strings; }),
				'm'
			),
			greedy: true,
			inside: {
				'info': {
					// foo@bar:~/files$ exit
					// foo@bar$ exit
					// ~/files$ exit
					pattern: /^[^#$%]+/,
					alias: 'punctuation',
					inside: {
						'user': /^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,
						'punctuation': /:/,
						'path': /[\s\S]+/
					}
				},
				'bash': {
					pattern: /(^[$#%]\s*)\S[\s\S]*/,
					lookbehind: true,
					alias: 'language-bash',
					inside: Prism.languages.bash
				},
				'shell-symbol': {
					pattern: /^[$#%]/,
					alias: 'important'
				}
			}
		},
		'output': /.(?:.*(?:[\r\n]|.$))*/
	};

	Prism.languages['sh-session'] = Prism.languages['shellsession'] = Prism.languages['shell-session'];

}(Prism));
l'8xq!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[/~.][^\0-\\x1F$#%*?"<>@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<<str>>)+".replace(/<<str>>/g,(function(){return n})),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism);3q"ӿyx`// Test files for the parser itself:
// https://github.com/JesusFreke/smali/tree/master/smali/src/test/resources/LexerTest

Prism.languages.smali = {
	'comment': /#.*/,
	'string': {
		pattern: /"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,
		greedy: true
	},

	'class-name': {
		pattern: /(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,
		lookbehind: true,
		inside: {
			'class-name': {
				pattern: /(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,
				lookbehind: true
			},
			'namespace': {
				pattern: /^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,
				lookbehind: true,
				inside: {
					'punctuation': /\//
				}
			},
			'builtin': /^L/
		}
	},
	'builtin': [
		{
			// Reference: https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields#types
			pattern: /([();\[])[BCDFIJSVZ]+/,
			lookbehind: true
		},
		{
			// e.g. .field mWifiOnUid:I
			pattern: /([\w$>]:)[BCDFIJSVZ]/,
			lookbehind: true
		}
	],
	'keyword': [
		{
			pattern: /(\.end\s+)[\w-]+/,
			lookbehind: true
		},
		{
			pattern: /(^|[^\w.-])\.(?!\d)[\w-]+/,
			lookbehind: true
		},
		{
			pattern: /(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,
			lookbehind: true
		}
	],
	'function': {
		pattern: /(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,
		lookbehind: true
	},

	'field': {
		pattern: /[\w$]+(?=:)/,
		alias: 'variable'
	},
	'register': {
		pattern: /(^|[^\w.-])[vp]\d(?![\w.-])/,
		lookbehind: true,
		alias: 'variable'
	},

	'boolean': {
		pattern: /(^|[^\w.-])(?:false|true)(?![\w.-])/,
		lookbehind: true
	},
	'number': {
		pattern: /(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,
		lookbehind: true
	},

	'label': {
		pattern: /(:)\w+/,
		lookbehind: true,
		alias: 'property'
	},

	'operator': /->|\.\.|[\[=]/,
	'punctuation': /[{}(),;:]/
};
8H	UxPPrism.languages.smali={comment:/#.*/,string:{pattern:/"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,greedy:!0},"class-name":{pattern:/(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,lookbehind:!0,inside:{"class-name":{pattern:/(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,lookbehind:!0},namespace:{pattern:/^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,lookbehind:!0,inside:{punctuation:/\//}},builtin:/^L/}},builtin:[{pattern:/([();\[])[BCDFIJSVZ]+/,lookbehind:!0},{pattern:/([\w$>]:)[BCDFIJSVZ]/,lookbehind:!0}],keyword:[{pattern:/(\.end\s+)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])\.(?!\d)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,lookbehind:!0}],function:{pattern:/(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,lookbehind:!0},field:{pattern:/[\w$]+(?=:)/,alias:"variable"},register:{pattern:/(^|[^\w.-])[vp]\d(?![\w.-])/,lookbehind:!0,alias:"variable"},boolean:{pattern:/(^|[^\w.-])(?:false|true)(?![\w.-])/,lookbehind:!0},number:{pattern:/(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,lookbehind:!0},label:{pattern:/(:)\w+/,lookbehind:!0,alias:"property"},operator:/->|\.\.|[\[=]/,punctuation:/[{}(),;:]/};:2x!Prism.languages.smalltalk = {
	'comment': {
		pattern: /"(?:""|[^"])*"/,
		greedy: true
	},
	'char': {
		pattern: /\$./,
		greedy: true
	},
	'string': {
		pattern: /'(?:''|[^'])*'/,
		greedy: true
	},
	'symbol': /#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,
	'block-arguments': {
		pattern: /(\[\s*):[^\[|]*\|/,
		lookbehind: true,
		inside: {
			'variable': /:[\da-z]+/i,
			'punctuation': /\|/
		}
	},
	'temporary-variables': {
		pattern: /\|[^|]+\|/,
		inside: {
			'variable': /[\da-z]+/i,
			'punctuation': /\|/
		}
	},
	'keyword': /\b(?:new|nil|self|super)\b/,
	'boolean': /\b(?:false|true)\b/,
	'number': [
		/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,
		/\b\d+(?:\.\d+)?(?:e-?\d+)?/
	],
	'operator': /[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,
	'punctuation': /[.;:?\[\](){}]/
};
mP(x}Prism.languages.smalltalk={comment:{pattern:/"(?:""|[^"])*"/,greedy:!0},char:{pattern:/\$./,greedy:!0},string:{pattern:/'(?:''|[^'])*'/,greedy:!0},symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:new|nil|self|super)\b/,boolean:/\b(?:false|true)\b/,number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/\b\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/};UDx0(function (Prism) {

	Prism.languages.smarty = {
		'comment': {
			pattern: /^\{\*[\s\S]*?\*\}/,
			greedy: true
		},
		'embedded-php': {
			pattern: /^\{php\}[\s\S]*?\{\/php\}/,
			greedy: true,
			inside: {
				'smarty': {
					pattern: /^\{php\}|\{\/php\}$/,
					inside: null // see below
				},
				'php': {
					pattern: /[\s\S]+/,
					alias: 'language-php',
					inside: Prism.languages.php
				}
			}
		},
		'string': [
			{
				pattern: /"(?:\\.|[^"\\\r\n])*"/,
				greedy: true,
				inside: {
					'interpolation': {
						pattern: /\{[^{}]*\}|`[^`]*`/,
						inside: {
							'interpolation-punctuation': {
								pattern: /^[{`]|[`}]$/,
								alias: 'punctuation'
							},
							'expression': {
								pattern: /[\s\S]+/,
								inside: null // see below
							}
						}
					},
					'variable': /\$\w+/
				}
			},
			{
				pattern: /'(?:\\.|[^'\\\r\n])*'/,
				greedy: true
			},
		],
		'keyword': {
			pattern: /(^\{\/?)[a-z_]\w*\b(?!\()/i,
			lookbehind: true,
			greedy: true
		},
		'delimiter': {
			pattern: /^\{\/?|\}$/,
			greedy: true,
			alias: 'punctuation'
		},
		'number': /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
		'variable': [
			/\$(?!\d)\w+/,
			/#(?!\d)\w+#/,
			{
				pattern: /(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,
				lookbehind: true
			},
			{
				pattern: /(\[)(?!\d)\w+(?=\])/,
				lookbehind: true
			}
		],
		'function': {
			pattern: /(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,
			lookbehind: true
		},
		'attr-name': /\b[a-z_]\w*(?=\s*=)/i,
		'boolean': /\b(?:false|no|off|on|true|yes)\b/,
		'punctuation': /[\[\](){}.,:`]|->/,
		'operator': [
			/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,
			/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,
			/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/
		]
	};

	Prism.languages.smarty['embedded-php'].inside.smarty.inside = Prism.languages.smarty;
	Prism.languages.smarty.string[0].inside.interpolation.inside.expression.inside = Prism.languages.smarty;

	var string = /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/;
	var smartyPattern = RegExp(
		// comments
		/\{\*[\s\S]*?\*\}/.source +
		'|' +
		// php tags
		/\{php\}[\s\S]*?\{\/php\}/.source +
		'|' +
		// smarty blocks
		/\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>)*\})*\})*\}/.source
			.replace(/<str>/g, function () { return string.source; }),
		'g'
	);

	// Tokenize all inline Smarty expressions
	Prism.hooks.add('before-tokenize', function (env) {
		var smartyLiteralStart = '{literal}';
		var smartyLiteralEnd = '{/literal}';
		var smartyLiteralMode = false;

		Prism.languages['markup-templating'].buildPlaceholders(env, 'smarty', smartyPattern, function (match) {
			// Smarty tags inside {literal} block are ignored
			if (match === smartyLiteralEnd) {
				smartyLiteralMode = false;
			}

			if (!smartyLiteralMode) {
				if (match === smartyLiteralStart) {
					smartyLiteralMode = true;
				}

				return true;
			}
			return false;
		});
	});

	// Re-insert the tokens after tokenizing
	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'smarty');
	});

}(Prism));
ўʾzxQ!function(e){e.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:e.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},e.languages.smarty["embedded-php"].inside.smarty.inside=e.languages.smarty,e.languages.smarty.string[0].inside.interpolation.inside.expression.inside=e.languages.smarty;var n=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,t=RegExp("\\{\\*[^]*?\\*\\}|\\{php\\}[^]*?\\{/php\\}|"+"\\{(?:[^{}\"']|<str>|\\{(?:[^{}\"']|<str>|\\{(?:[^{}\"']|<str>)*\\})*\\})*\\}".replace(/<str>/g,(function(){return n.source})),"g");e.hooks.add("before-tokenize",(function(n){var a=!1;e.languages["markup-templating"].buildPlaceholders(n,"smarty",t,(function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)}))})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"smarty")}))}(Prism);<x\	// https://smlfamily.github.io/sml97-defn.pdf
// https://people.mpi-sws.org/~rossberg/sml.html
(function (Prism) {

	var keywords = /\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;

	Prism.languages.sml = {
		// allow one level of nesting
		'comment': /\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,
		'string': {
			pattern: /#?"(?:[^"\\]|\\.)*"/,
			greedy: true
		},

		'class-name': [
			{
				// This is only an approximation since the real grammar is context-free
				//
				// Why the main loop so complex?
				// The main loop is approximately the same as /(?:\s*(?:[*,]|->)\s*<TERMINAL>)*/ which is, obviously, a lot
				// simpler. The difference is that if a comma is the last iteration of the loop, then the terminal must be
				// followed by a long identifier.
				pattern: RegExp(
					/((?:^|[^:]):\s*)<TERMINAL>(?:\s*(?:(?:\*|->)\s*<TERMINAL>|,\s*<TERMINAL>(?:(?=<NOT-LAST>)|(?!<NOT-LAST>)\s+<LONG-ID>)))*/.source
						.replace(/<NOT-LAST>/g, function () { return /\s*(?:[*,]|->)/.source; })
						.replace(/<TERMINAL>/g, function () {
							return /(?:'[\w']*|<LONG-ID>|\((?:[^()]|\([^()]*\))*\)|\{(?:[^{}]|\{[^{}]*\})*\})(?:\s+<LONG-ID>)*/.source;
						})
						.replace(/<LONG-ID>/g, function () { return /(?!<KEYWORD>)[a-z\d_][\w'.]*/.source; })
						.replace(/<KEYWORD>/g, function () { return keywords.source; }),
					'i'
				),
				lookbehind: true,
				greedy: true,
				inside: null // see below
			},
			{
				pattern: /((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,
				lookbehind: true
			}
		],
		'function': {
			pattern: /((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,
			lookbehind: true
		},

		'keyword': keywords,
		'variable': {
			pattern: /(^|[^\w'])'[\w']*/,
			lookbehind: true,
		},

		'number': /~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,
		'word': {
			pattern: /\b0w(?:\d+|x[\da-f]+)\b/i,
			alias: 'constant'
		},

		'boolean': /\b(?:false|true)\b/i,
		'operator': /\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,
		'punctuation': /[(){}\[\].:,;]/
	};

	Prism.languages.sml['class-name'][0].inside = Prism.languages.sml;

	Prism.languages.smlnj = Prism.languages.sml;

}(Prism));
ga_x!function(e){var n=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;e.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp("((?:^|[^:]):\\s*)<TERMINAL>(?:\\s*(?:(?:\\*|->)\\s*<TERMINAL>|,\\s*<TERMINAL>(?:(?=<NOT-LAST>)|(?!<NOT-LAST>)\\s+<LONG-ID>)))*".replace(/<NOT-LAST>/g,(function(){return"\\s*(?:[*,]|->)"})).replace(/<TERMINAL>/g,(function(){return"(?:'[\\w']*|<LONG-ID>|\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+<LONG-ID>)*"})).replace(/<LONG-ID>/g,(function(){return"(?!<KEYWORD>)[a-z\\d_][\\w'.]*"})).replace(/<KEYWORD>/g,(function(){return n.source})),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:n,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},e.languages.sml["class-name"][0].inside=e.languages.sml,e.languages.smlnj=e.languages.sml}(Prism);;
Gx|Prism.languages.solidity = Prism.languages.extend('clike', {
	'class-name': {
		pattern: /(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,
		lookbehind: true
	},
	'keyword': /\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,
	'operator': /=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/
});

Prism.languages.insertBefore('solidity', 'keyword', {
	'builtin': /\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/
});

Prism.languages.insertBefore('solidity', 'number', {
	'version': {
		pattern: /([<>]=?|\^)\d+\.\d+\.\d+\b/,
		lookbehind: true,
		alias: 'number',
	}
});

Prism.languages.sol = Prism.languages.solidity;
4Cx5Prism.languages.solidity=Prism.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),Prism.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),Prism.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),Prism.languages.sol=Prism.languages.solidity;<Cx:(function (Prism) {

	var guid = {
		// https://en.wikipedia.org/wiki/Universally_unique_identifier#Format
		pattern: /\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,
		alias: 'constant',
		inside: {
			'punctuation': /[{}]/
		}
	};

	Prism.languages['solution-file'] = {
		'comment': {
			pattern: /#.*/,
			greedy: true
		},
		'string': {
			pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
			greedy: true,
			inside: {
				'guid': guid
			}
		},
		'object': {
			// Foo
			//   Bar("abs") = 9
			//   EndBar
			//   Prop = TRUE
			// EndFoo
			pattern: /^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,
			lookbehind: true,
			greedy: true,
			alias: 'keyword'
		},
		'property': {
			pattern: /^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,
			lookbehind: true,
			inside: {
				'guid': guid
			}
		},
		'guid': guid,
		'number': /\b\d+(?:\.\d+)*\b/,
		'boolean': /\b(?:FALSE|TRUE)\b/,
		'operator': /=/,
		'punctuation': /[(),]/
	};

	Prism.languages['sln'] = Prism.languages['solution-file'];

}(Prism));
V\4=+xM!function(n){var t={pattern:/\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,alias:"constant",inside:{punctuation:/[{}]/}};n.languages["solution-file"]={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0,inside:{guid:t}},object:{pattern:/^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,lookbehind:!0,greedy:!0,alias:"keyword"},property:{pattern:/^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,lookbehind:!0,inside:{guid:t}},guid:t,number:/\b\d+(?:\.\d+)*\b/,boolean:/\b(?:FALSE|TRUE)\b/,operator:/=/,punctuation:/[(),]/},n.languages.sln=n.languages["solution-file"]}(Prism);.膴x	K(function (Prism) {
	var stringPattern = /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
	var numberPattern = /\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;

	Prism.languages.soy = {
		'comment': [
			/\/\*[\s\S]*?\*\//,
			{
				pattern: /(\s)\/\/.*/,
				lookbehind: true,
				greedy: true
			}
		],
		'command-arg': {
			pattern: /(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,
			lookbehind: true,
			alias: 'string',
			inside: {
				'punctuation': /\./
			}
		},
		'parameter': {
			pattern: /(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,
			lookbehind: true,
			alias: 'variable'
		},
		'keyword': [
			{
				pattern: /(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,
				lookbehind: true
			},
			/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/
		],
		'delimiter': {
			pattern: /^\{+\/?|\/?\}+$/,
			alias: 'punctuation'
		},
		'property': /\w+(?==)/,
		'variable': {
			pattern: /\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,
			inside: {
				'string': {
					pattern: stringPattern,
					greedy: true
				},
				'number': numberPattern,
				'punctuation': /[\[\].?]/
			}
		},
		'string': {
			pattern: stringPattern,
			greedy: true
		},
		'function': [
			/\w+(?=\()/,
			{
				pattern: /(\|[^\S\r\n]*)\w+/,
				lookbehind: true
			}
		],
		'boolean': /\b(?:false|true)\b/,
		'number': numberPattern,
		'operator': /\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,
		'punctuation': /[{}()\[\]|.,:]/
	};

	// Tokenize all inline Soy expressions
	Prism.hooks.add('before-tokenize', function (env) {
		var soyPattern = /\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g;
		var soyLitteralStart = '{literal}';
		var soyLitteralEnd = '{/literal}';
		var soyLitteralMode = false;

		Prism.languages['markup-templating'].buildPlaceholders(env, 'soy', soyPattern, function (match) {
			// Soy tags inside {literal} block are ignored
			if (match === soyLitteralEnd) {
				soyLitteralMode = false;
			}

			if (!soyLitteralMode) {
				if (match === soyLitteralStart) {
					soyLitteralMode = true;
				}

				return true;
			}
			return false;
		});
	});

	// Re-insert the tokens after tokenizing
	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'soy');
	});

}(Prism));
0cx=!function(e){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,t=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;e.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:t,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:t,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},e.hooks.add("before-tokenize",(function(a){var t=!1;e.languages["markup-templating"].buildPlaceholders(a,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,(function(e){return"{/literal}"===e&&(t=!1),!t&&("{literal}"===e&&(t=!0),!0)}))})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"soy")}))}(Prism);3c?x
Prism.languages.sparql = Prism.languages.extend('turtle', {
	'boolean': /\b(?:false|true)\b/i,
	'variable': {
		pattern: /[?$]\w+/,
		greedy: true
	},
}
);

Prism.languages.insertBefore('sparql', 'punctuation', {
	'keyword': [
		/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,
		/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,
		/\b(?:BASE|GRAPH|PREFIX)\b/i
	]
});

Prism.languages.rq = Prism.languages.sparql;
'FT;x@Prism.languages.sparql=Prism.languages.extend("turtle",{boolean:/\b(?:false|true)\b/i,variable:{pattern:/[?$]\w+/,greedy:!0}}),Prism.languages.insertBefore("sparql","punctuation",{keyword:[/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,/\b(?:BASE|GRAPH|PREFIX)\b/i]}),Prism.languages.rq=Prism.languages.sparql;@شwxtPrism.languages['splunk-spl'] = {
	'comment': /`comment\("(?:\\.|[^\\"])*"\)`/,
	'string': {
		pattern: /"(?:\\.|[^\\"])*"/,
		greedy: true
	},
	// https://docs.splunk.com/Documentation/Splunk/7.3.0/SearchReference/ListOfSearchCommands
	'keyword': /\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,
	'operator-word': {
		pattern: /\b(?:and|as|by|not|or|xor)\b/i,
		alias: 'operator'
	},
	'function': /\b\w+(?=\s*\()/,
	'property': /\b\w+(?=\s*=(?!=))/,
	'date': {
		// MM/DD/YYYY(:HH:MM:SS)?
		pattern: /\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,
		alias: 'number'
	},
	'number': /\b\d+(?:\.\d+)?\b/,
	'boolean': /\b(?:f|false|t|true)\b/i,
	'operator': /[<>=]=?|[-+*/%|]/,
	'punctuation': /[()[\],]/
};
ݑjx\Prism.languages["splunk-spl"]={comment:/`comment\("(?:\\.|[^\\"])*"\)`/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},keyword:/\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,"operator-word":{pattern:/\b(?:and|as|by|not|or|xor)\b/i,alias:"operator"},function:/\b\w+(?=\s*\()/,property:/\b\w+(?=\s*=(?!=))/,date:{pattern:/\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,alias:"number"},number:/\b\d+(?:\.\d+)?\b/,boolean:/\b(?:f|false|t|true)\b/i,operator:/[<>=]=?|[-+*/%|]/,punctuation:/[()[\],]/};G\x}Prism.languages.sqf = Prism.languages.extend('clike', {
	'string': {
		pattern: /"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,
		greedy: true
	},
	'keyword': /\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,
	'boolean': /\b(?:false|true)\b/i,
	'function': /\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,
	'number': /(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,
	'operator': /##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,
	'magic-variable': {
		pattern: /\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,
		alias: 'keyword'
	},
	'constant': /\bDIK(?:_[a-z\d]+)+\b/i
});

Prism.languages.insertBefore('sqf', 'string', {
	'macro': {
		pattern: /(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,
		lookbehind: true,
		greedy: true,
		alias: 'property',
		inside: {
			'directive': {
				pattern: /#[a-z]+\b/i,
				alias: 'keyword'
			},
			'comment': Prism.languages.sqf.comment
		}
	}
});

delete Prism.languages.sqf['class-name'];
xxl}Prism.languages.sqf=Prism.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),Prism.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:Prism.languages.sqf.comment}}}),delete Prism.languages.sqf["class-name"];p{
Dx{Prism.languages.sql = {
	'comment': {
		pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
		lookbehind: true
	},
	'variable': [
		{
			pattern: /@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,
			greedy: true
		},
		/@[\w.$]+/
	],
	'string': {
		pattern: /(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,
		greedy: true,
		lookbehind: true
	},
	'identifier': {
		pattern: /(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,
		greedy: true,
		lookbehind: true,
		inside: {
			'punctuation': /^`|`$/
		}
	},
	'function': /\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i, // Should we highlight user defined functions too?
	'keyword': /\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,
	'boolean': /\b(?:FALSE|NULL|TRUE)\b/i,
	'number': /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,
	'operator': /[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,
	'punctuation': /[;[\]()`,.]/
};
_)xBPrism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/};̷OxPrism.languages.squirrel = Prism.languages.extend('clike', {
	'comment': [
		Prism.languages.clike['comment'][0],
		{
			pattern: /(^|[^\\:])(?:\/\/|#).*/,
			lookbehind: true,
			greedy: true
		}
	],
	'string': {
		pattern: /(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,
		lookbehind: true,
		greedy: true
	},

	'class-name': {
		pattern: /(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,
		lookbehind: true,
		inside: {
			'punctuation': /\./
		}
	},
	'keyword': /\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,

	'number': /\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,
	'operator': /\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,
	'punctuation': /[(){}\[\],;.]/
});

Prism.languages.insertBefore('squirrel', 'string', {
	'char': {
		pattern: /(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,
		lookbehind: true,
		greedy: true
	}
});

Prism.languages.insertBefore('squirrel', 'operator', {
	'attribute-punctuation': {
		pattern: /<\/|\/>/,
		alias: 'important'
	},
	'lambda': {
		pattern: /@(?=\()/,
		alias: 'operator'
	}
});
4YDxEPrism.languages.squirrel=Prism.languages.extend("clike",{comment:[Prism.languages.clike.comment[0],{pattern:/(^|[^\\:])(?:\/\/|#).*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,lookbehind:!0,greedy:!0},"class-name":{pattern:/(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,lookbehind:!0,inside:{punctuation:/\./}},keyword:/\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,number:/\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,operator:/\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,punctuation:/[(){}\[\],;.]/}),Prism.languages.insertBefore("squirrel","string",{char:{pattern:/(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("squirrel","operator",{"attribute-punctuation":{pattern:/<\/|\/>/,alias:"important"},lambda:{pattern:/@(?=\()/,alias:"operator"}});[x*(function (Prism) {

	// https://mc-stan.org/docs/2_28/reference-manual/bnf-grammars.html

	var higherOrderFunctions = /\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;

	Prism.languages.stan = {
		'comment': /\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,
		'string': {
			// String literals can contain spaces and any printable ASCII characters except for " and \
			// https://mc-stan.org/docs/2_24/reference-manual/print-statements-section.html#string-literals
			pattern: /"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,
			greedy: true
		},
		'directive': {
			pattern: /^([ \t]*)#include\b.*/m,
			lookbehind: true,
			alias: 'property'
		},

		'function-arg': {
			pattern: RegExp(
				'(' +
				higherOrderFunctions.source +
				/\s*\(\s*/.source +
				')' +
				/[a-zA-Z]\w*/.source
			),
			lookbehind: true,
			alias: 'function'
		},
		'constraint': {
			pattern: /(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,
			lookbehind: true,
			inside: {
				'expression': {
					pattern: /(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,
					lookbehind: true,
					inside: null // see below
				},
				'property': /\b[a-z]\w*(?=\s*=)/i,
				'operator': /=/,
				'punctuation': /^<|>$|,/
			}
		},
		'keyword': [
			{
				pattern: /\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,
				alias: 'program-block'
			},
			/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,
			// these are functions that are known to take another function as their first argument.
			higherOrderFunctions
		],
		'function': /\b[a-z]\w*(?=\s*\()/i,
		'number': /(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
		'boolean': /\b(?:false|true)\b/,

		'operator': /<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,
		'punctuation': /[()\[\]{},;]/
	};

	Prism.languages.stan.constraint.inside.expression.inside = Prism.languages.stan;

}(Prism));
;^x!function(e){var r=/\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;e.languages.stan={comment:/\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,string:{pattern:/"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,greedy:!0},directive:{pattern:/^([ \t]*)#include\b.*/m,lookbehind:!0,alias:"property"},"function-arg":{pattern:RegExp("("+r.source+"\\s*\\(\\s*)[a-zA-Z]\\w*"),lookbehind:!0,alias:"function"},constraint:{pattern:/(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,lookbehind:!0,inside:{expression:{pattern:/(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,lookbehind:!0,inside:null},property:/\b[a-z]\w*(?=\s*=)/i,operator:/=/,punctuation:/^<|>$|,/}},keyword:[{pattern:/\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,alias:"program-block"},/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,r],function:/\b[a-z]\w*(?=\s*\()/i,number:/(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,boolean:/\b(?:false|true)\b/,operator:/<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,punctuation:/[()\[\]{},;]/},e.languages.stan.constraint.inside.expression.inside=e.languages.stan}(Prism);"x// https://www.stata.com/manuals/u.pdf
// https://www.stata.com/manuals/p.pdf

Prism.languages.stata = {
	'comment': [
		{
			pattern: /(^[ \t]*)\*.*/m,
			lookbehind: true,
			greedy: true
		},
		{
			pattern: /(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,
			lookbehind: true,
			greedy: true
		}
	],
	'string-literal': {
		pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,
				inside: {
					'punctuation': /^\$\{|\}$/,
					'expression': {
						pattern: /[\s\S]+/,
						inside: null // see below
					}
				}
			},
			'string': /[\s\S]+/
		}
	},

	'mata': {
		pattern: /(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,
		lookbehind: true,
		greedy: true,
		alias: 'language-mata',
		inside: Prism.languages.mata
	},
	'java': {
		pattern: /(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,
		lookbehind: true,
		greedy: true,
		alias: 'language-java',
		inside: Prism.languages.java
	},
	'python': {
		pattern: /(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,
		lookbehind: true,
		greedy: true,
		alias: 'language-python',
		inside: Prism.languages.python
	},


	'command': {
		pattern: /(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,
		lookbehind: true,
		greedy: true,
		alias: 'keyword'
	},
	'variable': /\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,
	'keyword': /\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,


	'boolean': /\b(?:off|on)\b/,
	'number': /\b\d+(?:\.\d+)?\b|\B\.\d+/,
	'function': /\b[a-z_]\w*(?=\()/i,

	'operator': /\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,
	'punctuation': /[(){}[\],:]/
};

Prism.languages.stata['string-literal'].inside.interpolation.inside.expression.inside = Prism.languages.stata;
=QfxfPrism.languages.stata={comment:[{pattern:/(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0}],"string-literal":{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,inside:{punctuation:/^\$\{|\}$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},mata:{pattern:/(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-mata",inside:Prism.languages.mata},java:{pattern:/(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-java",inside:Prism.languages.java},python:{pattern:/(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-python",inside:Prism.languages.python},command:{pattern:/(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,lookbehind:!0,greedy:!0,alias:"keyword"},variable:/\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,keyword:/\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,boolean:/\b(?:off|on)\b/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+/,function:/\b[a-z_]\w*(?=\()/i,operator:/\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,punctuation:/[(){}[\],:]/},Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.stata;]շxw(function (Prism) {
	var unit = {
		pattern: /(\b\d+)(?:%|[a-z]+)/,
		lookbehind: true
	};
	// 123 -123 .123 -.123 12.3 -12.3
	var number = {
		pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,
		lookbehind: true
	};

	var inside = {
		'comment': {
			pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
			lookbehind: true
		},
		'url': {
			pattern: /\burl\((["']?).*?\1\)/i,
			greedy: true
		},
		'string': {
			pattern: /("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,
			greedy: true
		},
		'interpolation': null, // See below
		'func': null, // See below
		'important': /\B!(?:important|optional)\b/i,
		'keyword': {
			pattern: /(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,
			lookbehind: true
		},
		'hexcode': /#[\da-f]{3,6}/i,
		'color': [
			/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,
			{
				pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,
				inside: {
					'unit': unit,
					'number': number,
					'function': /[\w-]+(?=\()/,
					'punctuation': /[(),]/
				}
			}
		],
		'entity': /\\[\da-f]{1,8}/i,
		'unit': unit,
		'boolean': /\b(?:false|true)\b/,
		'operator': [
			// We want non-word chars around "-" because it is
			// accepted in property names.
			/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/
		],
		'number': number,
		'punctuation': /[{}()\[\];:,]/
	};

	inside['interpolation'] = {
		pattern: /\{[^\r\n}:]+\}/,
		alias: 'variable',
		inside: {
			'delimiter': {
				pattern: /^\{|\}$/,
				alias: 'punctuation'
			},
			rest: inside
		}
	};
	inside['func'] = {
		pattern: /[\w-]+\([^)]*\).*/,
		inside: {
			'function': /^[^(]+/,
			rest: inside
		}
	};

	Prism.languages.stylus = {
		'atrule-declaration': {
			pattern: /(^[ \t]*)@.+/m,
			lookbehind: true,
			inside: {
				'atrule': /^@[\w-]+/,
				rest: inside
			}
		},
		'variable-declaration': {
			pattern: /(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,
			lookbehind: true,
			inside: {
				'variable': /^\S+/,
				rest: inside
			}
		},

		'statement': {
			pattern: /(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,
			lookbehind: true,
			inside: {
				'keyword': /^\S+/,
				rest: inside
			}
		},

		// A property/value pair cannot end with a comma or a brace
		// It cannot have indented content unless it ended with a semicolon
		'property-declaration': {
			pattern: /((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,
			lookbehind: true,
			inside: {
				'property': {
					pattern: /^[^\s:]+/,
					inside: {
						'interpolation': inside.interpolation
					}
				},
				rest: inside
			}
		},


		// A selector can contain parentheses only as part of a pseudo-element
		// It can span multiple lines.
		// It must end with a comma or an accolade or have indented content.
		'selector': {
			pattern: /(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,
			lookbehind: true,
			inside: {
				'interpolation': inside.interpolation,
				'comment': inside.comment,
				'punctuation': /[{},]/
			}
		},

		'func': inside.func,
		'string': inside.string,
		'comment': {
			pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
			lookbehind: true,
			greedy: true
		},
		'interpolation': inside.interpolation,
		'punctuation': /[{}()\[\];:.]/
	};
}(Prism));
Pxk!function(e){var n={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},t={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:n,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:n,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:r,punctuation:/[{}()\[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:t.interpolation,comment:t.comment,punctuation:/[{},]/}},func:t.func,string:t.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:t.interpolation,punctuation:/[{}()\[\];:.]/}}(Prism);	Q=x"Prism.languages.supercollider = {
	'comment': {
		pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,
		greedy: true
	},
	'string': {
		pattern: /(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,
		lookbehind: true,
		greedy: true
	},
	'char': {
		pattern: /\$(?:[^\\\r\n]|\\.)/,
		greedy: true
	},
	'symbol': {
		pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,
		lookbehind: true,
		greedy: true
	},

	'keyword': /\b(?:_|arg|classvar|const|nil|var|while)\b/,
	'boolean': /\b(?:false|true)\b/,

	'label': {
		pattern: /\b[a-z_]\w*(?=\s*:)/,
		alias: 'property'
	},

	'number': /\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,
	'class-name': /\b[A-Z]\w*\b/,

	'operator': /\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,
	'punctuation': /[{}()[\].:,;]|#[[{]/
};

Prism.languages.sclang = Prism.languages.supercollider;
}+5xVPrism.languages.supercollider={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,lookbehind:!0,greedy:!0},char:{pattern:/\$(?:[^\\\r\n]|\\.)/,greedy:!0},symbol:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|arg|classvar|const|nil|var|while)\b/,boolean:/\b(?:false|true)\b/,label:{pattern:/\b[a-z_]\w*(?=\s*:)/,alias:"property"},number:/\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,"class-name":/\b[A-Z]\w*\b/,operator:/\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,punctuation:/[{}()[\].:,;]|#[[{]/},Prism.languages.sclang=Prism.languages.supercollider;x+Prism.languages.swift = {
	'comment': {
		// Nested comments are supported up to 2 levels
		pattern: /(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,
		lookbehind: true,
		greedy: true
	},
	'string-literal': [
		// https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html
		{
			pattern: RegExp(
				/(^|[^"#])/.source
				+ '(?:'
				// single-line string
				+ /"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source
				+ '|'
				// multi-line string
				+ /"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source
				+ ')'
				+ /(?!["#])/.source
			),
			lookbehind: true,
			greedy: true,
			inside: {
				'interpolation': {
					pattern: /(\\\()(?:[^()]|\([^()]*\))*(?=\))/,
					lookbehind: true,
					inside: null // see below
				},
				'interpolation-punctuation': {
					pattern: /^\)|\\\($/,
					alias: 'punctuation'
				},
				'punctuation': /\\(?=[\r\n])/,
				'string': /[\s\S]+/
			}
		},
		{
			pattern: RegExp(
				/(^|[^"#])(#+)/.source
				+ '(?:'
				// single-line string
				+ /"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source
				+ '|'
				// multi-line string
				+ /"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source
				+ ')'
				+ '\\2'
			),
			lookbehind: true,
			greedy: true,
			inside: {
				'interpolation': {
					pattern: /(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,
					lookbehind: true,
					inside: null // see below
				},
				'interpolation-punctuation': {
					pattern: /^\)|\\#+\($/,
					alias: 'punctuation'
				},
				'string': /[\s\S]+/
			}
		},
	],

	'directive': {
		// directives with conditions
		pattern: RegExp(
			/#/.source
			+ '(?:'
			+ (
				/(?:elseif|if)\b/.source
				+ '(?:[ \t]*'
				// This regex is a little complex. It's equivalent to this:
				//   (?:![ \t]*)?(?:\b\w+\b(?:[ \t]*<round>)?|<round>)(?:[ \t]*(?:&&|\|\|))?
				// where <round> is a general parentheses expression.
				+ /(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source
				+ ')+'
			)
			+ '|'
			+ /(?:else|endif)\b/.source
			+ ')'
		),
		alias: 'property',
		inside: {
			'directive-name': /^#\w+/,
			'boolean': /\b(?:false|true)\b/,
			'number': /\b\d+(?:\.\d+)*\b/,
			'operator': /!|&&|\|\||[<>]=?/,
			'punctuation': /[(),]/
		}
	},
	'literal': {
		pattern: /#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,
		alias: 'constant'
	},
	'other-directive': {
		pattern: /#\w+\b/,
		alias: 'property'
	},

	'attribute': {
		pattern: /@\w+/,
		alias: 'atrule'
	},

	'function-definition': {
		pattern: /(\bfunc\s+)\w+/,
		lookbehind: true,
		alias: 'function'
	},
	'label': {
		// https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html#ID141
		pattern: /\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,
		lookbehind: true,
		alias: 'important'
	},

	'keyword': /\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,
	'boolean': /\b(?:false|true)\b/,
	'nil': {
		pattern: /\bnil\b/,
		alias: 'constant'
	},

	'short-argument': /\$\d+\b/,
	'omit': {
		pattern: /\b_\b/,
		alias: 'keyword'
	},
	'number': /\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,

	// A class name must start with an upper-case letter and be either 1 letter long or contain a lower-case letter.
	'class-name': /\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,
	'function': /\b[a-z_]\w*(?=\s*\()/i,
	'constant': /\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,

	// Operators are generic in Swift. Developers can even create new operators (e.g. +++).
	// https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html#ID481
	// This regex only supports ASCII operators.
	'operator': /[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,
	'punctuation': /[{}[\]();,.:\\]/
};

Prism.languages.swift['string-literal'].forEach(function (rule) {
	rule.inside['interpolation'].inside = Prism.languages.swift;
});
Bɻx{Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}));hox// https://www.freedesktop.org/software/systemd/man/systemd.syntax.html

(function (Prism) {

	var comment = {
		pattern: /^[;#].*/m,
		greedy: true
	};

	var quotesSource = /"(?:[^\r\n"\\]|\\(?:[^\r]|\r\n?))*"(?!\S)/.source;

	Prism.languages.systemd = {
		'comment': comment,

		'section': {
			pattern: /^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,
			greedy: true,
			inside: {
				'punctuation': /^\[|\]$/,
				'section-name': {
					pattern: /[\s\S]+/,
					alias: 'selector'
				},
			}
		},

		'key': {
			pattern: /^[^\s=]+(?=[ \t]*=)/m,
			greedy: true,
			alias: 'attr-name'
		},
		'value': {
			// This pattern is quite complex because of two properties:
			//  1) Quotes (strings) must be preceded by a space. Since we can't use lookbehinds, we have to "resolve"
			//     the lookbehind. You will see this in the main loop where spaces are handled separately.
			//  2) Line continuations.
			//     After line continuations, empty lines and comments are ignored so we have to consume them.
			pattern: RegExp(
				/(=[ \t]*(?!\s))/.source +
				// the value either starts with quotes or not
				'(?:' + quotesSource + '|(?=[^"\r\n]))' +
				// main loop
				'(?:' + (
					/[^\s\\]/.source +
					// handle spaces separately because of quotes
					'|' + '[ \t]+(?:(?![ \t"])|' + quotesSource + ')' +
					// line continuation
					'|' + /\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source
				) +
				')*'
			),
			lookbehind: true,
			greedy: true,
			alias: 'attr-value',
			inside: {
				'comment': comment,
				'quoted': {
					pattern: RegExp(/(^|\s)/.source + quotesSource),
					lookbehind: true,
					greedy: true,
				},
				'punctuation': /\\$/m,

				'boolean': {
					pattern: /^(?:false|no|off|on|true|yes)$/,
					greedy: true
				}
			}
		},

		'punctuation': /=/
	};

}(Prism));
+
,x6!function(e){var t={pattern:/^[;#].*/m,greedy:!0},n='"(?:[^\r\n"\\\\]|\\\\(?:[^\r]|\r\n?))*"(?!\\S)';e.languages.systemd={comment:t,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp("(=[ \t]*(?!\\s))(?:"+n+'|(?=[^"\r\n]))(?:[^\\s\\\\]|[ \t]+(?:(?![ \t"])|'+n+")|\\\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;]))*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:t,quoted:{pattern:RegExp("(^|\\s)"+n),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}}(Prism);xe Prism.languages.t4 = Prism.languages['t4-cs'] = Prism.languages['t4-templating'].createT4('csharp');
"x` Prism.languages.t4=Prism.languages["t4-cs"]=Prism.languages["t4-templating"].createT4("csharp");"IGxp(function (Prism) {

	function createBlock(prefix, inside, contentAlias) {
		return {
			pattern: RegExp('<#' + prefix + '[\\s\\S]*?#>'),
			alias: 'block',
			inside: {
				'delimiter': {
					pattern: RegExp('^<#' + prefix + '|#>$'),
					alias: 'important'
				},
				'content': {
					pattern: /[\s\S]+/,
					inside: inside,
					alias: contentAlias
				}
			}
		};
	}

	function createT4(insideLang) {
		var grammar = Prism.languages[insideLang];
		var className = 'language-' + insideLang;

		return {
			'block': {
				pattern: /<#[\s\S]+?#>/,
				inside: {
					'directive': createBlock('@', {
						'attr-value': {
							pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,
							inside: {
								'punctuation': /^=|^["']|["']$/
							}
						},
						'keyword': /\b\w+(?=\s)/,
						'attr-name': /\b\w+/
					}),
					'expression': createBlock('=', grammar, className),
					'class-feature': createBlock('\\+', grammar, className),
					'standard': createBlock('', grammar, className)
				}
			}
		};
	}

	Prism.languages['t4-templating'] = Object.defineProperty({}, 'createT4', { value: createT4 });

}(Prism));
L?5'xu!function(e){function t(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}e.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(a){var n=e.languages[a],i="language-"+a;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:t("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:t("=",n,i),"class-feature":t("\\+",n,i),standard:t("",n,i)}}}}})}(Prism);r`xO Prism.languages['t4-vb'] = Prism.languages['t4-templating'].createT4('vbnet');
fNxL Prism.languages["t4-vb"]=Prism.languages["t4-templating"].createT4("vbnet");(x x// https://en.wikipedia.org/wiki/Test_Anything_Protocol

Prism.languages.tap = {
	'fail': /not ok[^#{\n\r]*/,
	'pass': /ok[^#{\n\r]*/,
	'pragma': /pragma [+-][a-z]+/,
	'bailout': /bail out!.*/i,
	'version': /TAP version \d+/i,
	'plan': /\b\d+\.\.\d+(?: +#.*)?/,
	'subtest': {
		pattern: /# Subtest(?:: .*)?/,
		greedy: true
	},
	'punctuation': /[{}]/,
	'directive': /#.*/,
	'yamlish': {
		pattern: /(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,
		lookbehind: true,
		inside: Prism.languages.yaml,
		alias: 'language-yaml'
	}
};
(x~Prism.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:Prism.languages.yaml,alias:"language-yaml"}};<Ŵjx[Prism.languages.tcl = {
	'comment': {
		pattern: /(^|[^\\])#.*/,
		lookbehind: true
	},
	'string': {
		pattern: /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,
		greedy: true
	},
	'variable': [
		{
			pattern: /(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,
			lookbehind: true
		},
		{
			pattern: /(\$)\{[^}]+\}/,
			lookbehind: true
		},
		{
			pattern: /(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,
			lookbehind: true
		}
	],
	'function': {
		pattern: /(^[\t ]*proc[ \t]+)\S+/m,
		lookbehind: true
	},
	'builtin': [
		{
			pattern: /(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,
			lookbehind: true
		},
		/\b(?:else|elseif)\b/
	],
	'scope': {
		pattern: /(^[\t ]*)(?:global|upvar|variable)\b/m,
		lookbehind: true,
		alias: 'constant'
	},
	'keyword': {
		pattern: /(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,
		lookbehind: true
	},
	'operator': /!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,
	'punctuation': /[{}()\[\]]/
};
sWܴ^xPrism.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,lookbehind:!0},/\b(?:else|elseif)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,punctuation:/[{}()\[\]]/};L?Ѽx|(function (Prism) {
	// We don't allow for pipes inside parentheses
	// to not break table pattern |(. foo |). bar |
	var modifierRegex = /\([^|()\n]+\)|\[[^\]\n]+\]|\{[^}\n]+\}/.source;
	// Opening and closing parentheses which are not a modifier
	// This pattern is necessary to prevent exponential backtracking
	var parenthesesRegex = /\)|\((?![^|()\n]+\))/.source;
	/**
	 * @param {string} source
	 * @param {string} [flags]
	 */
	function withModifier(source, flags) {
		return RegExp(
			source
				.replace(/<MOD>/g, function () { return '(?:' + modifierRegex + ')'; })
				.replace(/<PAR>/g, function () { return '(?:' + parenthesesRegex + ')'; }),
			flags || '');
	}

	var modifierTokens = {
		'css': {
			pattern: /\{[^{}]+\}/,
			inside: {
				rest: Prism.languages.css
			}
		},
		'class-id': {
			pattern: /(\()[^()]+(?=\))/,
			lookbehind: true,
			alias: 'attr-value'
		},
		'lang': {
			pattern: /(\[)[^\[\]]+(?=\])/,
			lookbehind: true,
			alias: 'attr-value'
		},
		// Anything else is punctuation (the first pattern is for row/col spans inside tables)
		'punctuation': /[\\\/]\d+|\S/
	};


	var textile = Prism.languages.textile = Prism.languages.extend('markup', {
		'phrase': {
			pattern: /(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,
			lookbehind: true,
			inside: {

				// h1. Header 1
				'block-tag': {
					pattern: withModifier(/^[a-z]\w*(?:<MOD>|<PAR>|[<>=])*\./.source),
					inside: {
						'modifier': {
							pattern: withModifier(/(^[a-z]\w*)(?:<MOD>|<PAR>|[<>=])+(?=\.)/.source),
							lookbehind: true,
							inside: modifierTokens
						},
						'tag': /^[a-z]\w*/,
						'punctuation': /\.$/
					}
				},

				// # List item
				// * List item
				'list': {
					pattern: withModifier(/^[*#]+<MOD>*\s+\S.*/.source, 'm'),
					inside: {
						'modifier': {
							pattern: withModifier(/(^[*#]+)<MOD>+/.source),
							lookbehind: true,
							inside: modifierTokens
						},
						'punctuation': /^[*#]+/
					}
				},

				// | cell | cell | cell |
				'table': {
					// Modifiers can be applied to the row: {color:red}.|1|2|3|
					// or the cell: |{color:red}.1|2|3|
					pattern: withModifier(/^(?:(?:<MOD>|<PAR>|[<>=^~])+\.\s*)?(?:\|(?:(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+\.|(?!(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+\.))[^|]*)+\|/.source, 'm'),
					inside: {
						'modifier': {
							// Modifiers for rows after the first one are
							// preceded by a pipe and a line feed
							pattern: withModifier(/(^|\|(?:\r?\n|\r)?)(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+(?=\.)/.source),
							lookbehind: true,
							inside: modifierTokens
						},
						'punctuation': /\||^\./
					}
				},

				'inline': {
					// eslint-disable-next-line regexp/no-super-linear-backtracking
					pattern: withModifier(/(^|[^a-zA-Z\d])(\*\*|__|\?\?|[*_%@+\-^~])<MOD>*.+?\2(?![a-zA-Z\d])/.source),
					lookbehind: true,
					inside: {
						// Note: superscripts and subscripts are not handled specifically

						// *bold*, **bold**
						'bold': {
							// eslint-disable-next-line regexp/no-super-linear-backtracking
							pattern: withModifier(/(^(\*\*?)<MOD>*).+?(?=\2)/.source),
							lookbehind: true
						},

						// _italic_, __italic__
						'italic': {
							// eslint-disable-next-line regexp/no-super-linear-backtracking
							pattern: withModifier(/(^(__?)<MOD>*).+?(?=\2)/.source),
							lookbehind: true
						},

						// ??cite??
						'cite': {
							// eslint-disable-next-line regexp/no-super-linear-backtracking
							pattern: withModifier(/(^\?\?<MOD>*).+?(?=\?\?)/.source),
							lookbehind: true,
							alias: 'string'
						},

						// @code@
						'code': {
							// eslint-disable-next-line regexp/no-super-linear-backtracking
							pattern: withModifier(/(^@<MOD>*).+?(?=@)/.source),
							lookbehind: true,
							alias: 'keyword'
						},

						// +inserted+
						'inserted': {
							// eslint-disable-next-line regexp/no-super-linear-backtracking
							pattern: withModifier(/(^\+<MOD>*).+?(?=\+)/.source),
							lookbehind: true
						},

						// -deleted-
						'deleted': {
							// eslint-disable-next-line regexp/no-super-linear-backtracking
							pattern: withModifier(/(^-<MOD>*).+?(?=-)/.source),
							lookbehind: true
						},

						// %span%
						'span': {
							// eslint-disable-next-line regexp/no-super-linear-backtracking
							pattern: withModifier(/(^%<MOD>*).+?(?=%)/.source),
							lookbehind: true
						},

						'modifier': {
							pattern: withModifier(/(^\*\*|__|\?\?|[*_%@+\-^~])<MOD>+/.source),
							lookbehind: true,
							inside: modifierTokens
						},
						'punctuation': /[*_%?@+\-^~]+/
					}
				},

				// [alias]http://example.com
				'link-ref': {
					pattern: /^\[[^\]]+\]\S+$/m,
					inside: {
						'string': {
							pattern: /(^\[)[^\]]+(?=\])/,
							lookbehind: true
						},
						'url': {
							pattern: /(^\])\S+$/,
							lookbehind: true
						},
						'punctuation': /[\[\]]/
					}
				},

				// "text":http://example.com
				// "text":link-ref
				'link': {
					// eslint-disable-next-line regexp/no-super-linear-backtracking
					pattern: withModifier(/"<MOD>*[^"]+":.+?(?=[^\w/]?(?:\s|$))/.source),
					inside: {
						'text': {
							// eslint-disable-next-line regexp/no-super-linear-backtracking
							pattern: withModifier(/(^"<MOD>*)[^"]+(?=")/.source),
							lookbehind: true
						},
						'modifier': {
							pattern: withModifier(/(^")<MOD>+/.source),
							lookbehind: true,
							inside: modifierTokens
						},
						'url': {
							pattern: /(:).+/,
							lookbehind: true
						},
						'punctuation': /[":]/
					}
				},

				// !image.jpg!
				// !image.jpg(Title)!:http://example.com
				'image': {
					pattern: withModifier(/!(?:<MOD>|<PAR>|[<>=])*(?![<>=])[^!\s()]+(?:\([^)]+\))?!(?::.+?(?=[^\w/]?(?:\s|$)))?/.source),
					inside: {
						'source': {
							pattern: withModifier(/(^!(?:<MOD>|<PAR>|[<>=])*)(?![<>=])[^!\s()]+(?:\([^)]+\))?(?=!)/.source),
							lookbehind: true,
							alias: 'url'
						},
						'modifier': {
							pattern: withModifier(/(^!)(?:<MOD>|<PAR>|[<>=])+/.source),
							lookbehind: true,
							inside: modifierTokens
						},
						'url': {
							pattern: /(:).+/,
							lookbehind: true
						},
						'punctuation': /[!:]/
					}
				},

				// Footnote[1]
				'footnote': {
					pattern: /\b\[\d+\]/,
					alias: 'comment',
					inside: {
						'punctuation': /\[|\]/
					}
				},

				// CSS(Cascading Style Sheet)
				'acronym': {
					pattern: /\b[A-Z\d]+\([^)]+\)/,
					inside: {
						'comment': {
							pattern: /(\()[^()]+(?=\))/,
							lookbehind: true
						},
						'punctuation': /[()]/
					}
				},

				// Prism(C)
				'mark': {
					pattern: /\b\((?:C|R|TM)\)/,
					alias: 'comment',
					inside: {
						'punctuation': /[()]/
					}
				}
			}
		}
	});

	var phraseInside = textile['phrase'].inside;
	var nestedPatterns = {
		'inline': phraseInside['inline'],
		'link': phraseInside['link'],
		'image': phraseInside['image'],
		'footnote': phraseInside['footnote'],
		'acronym': phraseInside['acronym'],
		'mark': phraseInside['mark']
	};

	// Only allow alpha-numeric HTML tags, not XML tags
	textile.tag.pattern = /<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;

	// Allow some nesting
	var phraseInlineInside = phraseInside['inline'].inside;
	phraseInlineInside['bold'].inside = nestedPatterns;
	phraseInlineInside['italic'].inside = nestedPatterns;
	phraseInlineInside['inserted'].inside = nestedPatterns;
	phraseInlineInside['deleted'].inside = nestedPatterns;
	phraseInlineInside['span'].inside = nestedPatterns;

	// Allow some styles inside table cells
	var phraseTableInside = phraseInside['table'].inside;
	phraseTableInside['inline'] = nestedPatterns['inline'];
	phraseTableInside['link'] = nestedPatterns['link'];
	phraseTableInside['image'] = nestedPatterns['image'];
	phraseTableInside['footnote'] = nestedPatterns['footnote'];
	phraseTableInside['acronym'] = nestedPatterns['acronym'];
	phraseTableInside['mark'] = nestedPatterns['mark'];

}(Prism));
0xM!function(n){function e(n,e){return RegExp(n.replace(/<MOD>/g,(function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"})).replace(/<PAR>/g,(function(){return"(?:\\)|\\((?![^|()\n]+\\)))"})),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:<MOD>|<PAR>|[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:<MOD>|<PAR>|[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+<MOD>*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)<MOD>+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:<MOD>|<PAR>|[<>=^~])+\\.\\s*)?(?:\\|(?:(?:<MOD>|<PAR>|[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:<MOD>|<PAR>|[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:<MOD>|<PAR>|[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])<MOD>*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)<MOD>*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)<MOD>*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?<MOD>*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@<MOD>*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+<MOD>*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-<MOD>*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%<MOD>*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])<MOD>+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"<MOD>*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"<MOD>*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")<MOD>+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:<MOD>|<PAR>|[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:<MOD>|<PAR>|[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:<MOD>|<PAR>|[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); cSx1(function (Prism) {

	var key = /(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;

	/**
	 * @param {string} pattern
	 */
	function insertKey(pattern) {
		return pattern.replace(/__/g, function () { return key; });
	}

	Prism.languages.toml = {
		'comment': {
			pattern: /#.*/,
			greedy: true
		},
		'table': {
			pattern: RegExp(insertKey(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source), 'm'),
			lookbehind: true,
			greedy: true,
			alias: 'class-name'
		},
		'key': {
			pattern: RegExp(insertKey(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source), 'm'),
			lookbehind: true,
			greedy: true,
			alias: 'property'
		},
		'string': {
			pattern: /"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,
			greedy: true
		},
		'date': [
			{
				// Offset Date-Time, Local Date-Time, Local Date
				pattern: /\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,
				alias: 'number'
			},
			{
				// Local Time
				pattern: /\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,
				alias: 'number'
			}
		],
		'number': /(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,
		'boolean': /\b(?:false|true)\b/,
		'punctuation': /[.,=[\]{}]/
	};
}(Prism));
]o;xD!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism);3>x-(function (Prism) {

	Prism.languages.tremor = {
		'comment': {
			pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
			lookbehind: true
		},
		'interpolated-string': null, // see below
		'extractor': {
			pattern: /\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,
			greedy: true,
			inside: {
				'regex': {
					pattern: /(^re)\|[\s\S]+/,
					lookbehind: true
				},
				'function': /^\w+/,
				'value': /\|[\s\S]+/
			}
		},
		'identifier': {
			pattern: /`[^`]*`/,
			greedy: true
		},

		'function': /\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,

		'keyword': /\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,
		'boolean': /\b(?:false|null|true)\b/i,

		'number': /\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,

		'pattern-punctuation': {
			pattern: /%(?=[({[])/,
			alias: 'punctuation'
		},
		'operator': /[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?>?=?|(?:absent|and|not|or|present|xor)\b/,
		'punctuation': /::|[;\[\]()\{\},.:]/,
	};

	var interpolationPattern = /#\{(?:[^"{}]|\{[^{}]*\}|"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*")*\}/.source;

	Prism.languages.tremor['interpolated-string'] = {
		pattern: RegExp(
			/(^|[^\\])/.source +
			'(?:' +
			'"""(?:' + /[^"\\#]|\\[\s\S]|"(?!"")|#(?!\{)/.source + '|' + interpolationPattern + ')*"""' +
			'|' +
			'"(?:' + /[^"\\\r\n#]|\\(?:\r\n|[\s\S])|#(?!\{)/.source + '|' + interpolationPattern + ')*"' +
			')'
		),
		lookbehind: true,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: RegExp(interpolationPattern),
				inside: {
					'punctuation': /^#\{|\}$/,
					'expression': {
						pattern: /[\s\S]+/,
						inside: Prism.languages.tremor
					}
				}
			},
			'string': /[\s\S]+/
		}
	};

	Prism.languages.troy = Prism.languages['tremor'];
	Prism.languages.trickle = Prism.languages['tremor'];

}(Prism));
	Ӓax!function(e){e.languages.tremor={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},"interpolated-string":null,extractor:{pattern:/\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,greedy:!0,inside:{regex:{pattern:/(^re)\|[\s\S]+/,lookbehind:!0},function:/^\w+/,value:/\|[\s\S]+/}},identifier:{pattern:/`[^`]*`/,greedy:!0},function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,keyword:/\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,"pattern-punctuation":{pattern:/%(?=[({[])/,alias:"punctuation"},operator:/[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?>?=?|(?:absent|and|not|or|present|xor)\b/,punctuation:/::|[;\[\]()\{\},.:]/};var n='#\\{(?:[^"{}]|\\{[^{}]*\\}|"(?:[^"\\\\\r\n]|\\\\(?:\r\n|[^]))*")*\\}';e.languages.tremor["interpolated-string"]={pattern:RegExp('(^|[^\\\\])(?:"""(?:[^"\\\\#]|\\\\[^]|"(?!"")|#(?!\\{)|'+n+')*"""|"(?:[^"\\\\\r\n#]|\\\\(?:\r\n|[^])|#(?!\\{)|'+n+')*")'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:RegExp(n),inside:{punctuation:/^#\{|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.tremor}}},string:/[\s\S]+/}},e.languages.troy=e.languages.tremor,e.languages.trickle=e.languages.tremor}(Prism);z_3)xc(function (Prism) {
	var typescript = Prism.util.clone(Prism.languages.typescript);
	Prism.languages.tsx = Prism.languages.extend('jsx', typescript);

	// doesn't work with TS because TS is too complex
	delete Prism.languages.tsx['parameter'];
	delete Prism.languages.tsx['literal-property'];

	// This will prevent collisions between TSX tags and TS generic types.
	// Idea by https://github.com/karlhorky
	// Discussion: https://github.com/PrismJS/prism/issues/2594#issuecomment-710666928
	var tag = Prism.languages.tsx.tag;
	tag.pattern = RegExp(/(^|[^\w$]|(?=<\/))/.source + '(?:' + tag.pattern.source + ')', tag.pattern.flags);
	tag.lookbehind = true;
}(Prism));
	㳱x1!function(e){var a=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",a),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var t=e.languages.tsx.tag;t.pattern=RegExp("(^|[^\\w$]|(?=</))(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(Prism);m_x (function (Prism) {

	Prism.languages.tt2 = Prism.languages.extend('clike', {
		'comment': /#.*|\[%#[\s\S]*?%\]/,
		'keyword': /\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,
		'punctuation': /[[\]{},()]/
	});

	Prism.languages.insertBefore('tt2', 'number', {
		'operator': /=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,
		'variable': {
			pattern: /\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i
		}
	});

	Prism.languages.insertBefore('tt2', 'keyword', {
		'delimiter': {
			pattern: /^(?:\[%|%%)-?|-?%\]$/,
			alias: 'punctuation'
		}
	});

	Prism.languages.insertBefore('tt2', 'string', {
		'single-quoted-string': {
			pattern: /'[^\\']*(?:\\[\s\S][^\\']*)*'/,
			greedy: true,
			alias: 'string'
		},
		'double-quoted-string': {
			pattern: /"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,
			greedy: true,
			alias: 'string',
			inside: {
				'variable': {
					pattern: /\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i
				}
			}
		}
	});

	// The different types of TT2 strings "replace" the C-like standard string
	delete Prism.languages.tt2.string;

	Prism.hooks.add('before-tokenize', function (env) {
		var tt2Pattern = /\[%[\s\S]+?%\]/g;
		Prism.languages['markup-templating'].buildPlaceholders(env, 'tt2', tt2Pattern);
	});

	Prism.hooks.add('after-tokenize', function (env) {
		Prism.languages['markup-templating'].tokenizePlaceholders(env, 'tt2');
	});

}(Prism));
0Ixc!function(e){e.languages.tt2=e.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),e.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),e.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),e.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete e.languages.tt2.string,e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"tt2",/\[%[\s\S]+?%\]/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"tt2")}))}(Prism);D>HxPrism.languages.turtle = {
	'comment': {
		pattern: /#.*/,
		greedy: true
	},
	'multiline-string': {
		pattern: /"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,
		greedy: true,
		alias: 'string',
		inside: {
			'comment': /#.*/
		}
	},
	'string': {
		pattern: /"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,
		greedy: true
	},
	'url': {
		pattern: /<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,
		greedy: true,
		inside: {
			'punctuation': /[<>]/
		}
	},
	'function': {
		pattern: /(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,
		inside: {
			'local-name': {
				pattern: /([^:]*:)[\s\S]+/,
				lookbehind: true
			},
			'prefix': {
				pattern: /[\s\S]+/,
				inside: {
					'punctuation': /:/
				}
			}
		}
	},
	'number': /[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
	'punctuation': /[{}.,;()[\]]|\^\^/,
	'boolean': /\b(?:false|true)\b/,
	'keyword': [
		/(?:\ba|@prefix|@base)\b|=/,
		/\b(?:base|graph|prefix)\b/i
	],
	'tag': {
		pattern: /@[a-z]+(?:-[a-z\d]+)*/i,
		inside: {
			'punctuation': /@/
		}
	}
};
Prism.languages.trig = Prism.languages['turtle'];
IF9xnPrism.languages.turtle={comment:{pattern:/#.*/,greedy:!0},"multiline-string":{pattern:/"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,greedy:!0,alias:"string",inside:{comment:/#.*/}},string:{pattern:/"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,greedy:!0},url:{pattern:/<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,greedy:!0,inside:{punctuation:/[<>]/}},function:{pattern:/(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,inside:{"local-name":{pattern:/([^:]*:)[\s\S]+/,lookbehind:!0},prefix:{pattern:/[\s\S]+/,inside:{punctuation:/:/}}}},number:/[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[{}.,;()[\]]|\^\^/,boolean:/\b(?:false|true)\b/,keyword:[/(?:\ba|@prefix|@base)\b|=/,/\b(?:base|graph|prefix)\b/i],tag:{pattern:/@[a-z]+(?:-[a-z\d]+)*/i,inside:{punctuation:/@/}}},Prism.languages.trig=Prism.languages.turtle;D.Cx8Prism.languages.twig = {
	'comment': /^\{#[\s\S]*?#\}$/,

	'tag-name': {
		pattern: /(^\{%-?\s*)\w+/,
		lookbehind: true,
		alias: 'keyword'
	},
	'delimiter': {
		pattern: /^\{[{%]-?|-?[%}]\}$/,
		alias: 'punctuation'
	},

	'string': {
		pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
		inside: {
			'punctuation': /^['"]|['"]$/
		}
	},
	'keyword': /\b(?:even|if|odd)\b/,
	'boolean': /\b(?:false|null|true)\b/,
	'number': /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
	'operator': [
		{
			pattern: /(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,
			lookbehind: true
		},
		/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/
	],
	'punctuation': /[()\[\]{}:.,]/
};

Prism.hooks.add('before-tokenize', function (env) {
	if (env.language !== 'twig') {
		return;
	}

	var pattern = /\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g;
	Prism.languages['markup-templating'].buildPlaceholders(env, 'twig', pattern);
});

Prism.hooks.add('after-tokenize', function (env) {
	Prism.languages['markup-templating'].tokenizePlaceholders(env, 'twig');
});
jbSO7xxPrism.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},Prism.hooks.add("before-tokenize",(function(e){"twig"===e.language&&Prism.languages["markup-templating"].buildPlaceholders(e,"twig",/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g)})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"twig")}));;4~yxd(function (Prism) {

	Prism.languages.typescript = Prism.languages.extend('javascript', {
		'class-name': {
			pattern: /(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,
			lookbehind: true,
			greedy: true,
			inside: null // see below
		},
		'builtin': /\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/,
	});

	// The keywords TypeScript adds to JavaScript
	Prism.languages.typescript.keyword.push(
		/\b(?:abstract|declare|is|keyof|readonly|require)\b/,
		// keywords that have to be followed by an identifier
		/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,
		// This is for `import type *, {}`
		/\btype\b(?=\s*(?:[\{*]|$))/
	);

	// doesn't work with TS because TS is too complex
	delete Prism.languages.typescript['parameter'];
	delete Prism.languages.typescript['literal-property'];

	// a version of typescript specifically for highlighting types
	var typeInside = Prism.languages.extend('typescript', {});
	delete typeInside['class-name'];

	Prism.languages.typescript['class-name'].inside = typeInside;

	Prism.languages.insertBefore('typescript', 'function', {
		'decorator': {
			pattern: /@[$\w\xA0-\uFFFF]+/,
			inside: {
				'at': {
					pattern: /^@/,
					alias: 'operator'
				},
				'function': /^[\s\S]+/
			}
		},
		'generic-function': {
			// e.g. foo<T extends "bar" | "baz">( ...
			pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,
			greedy: true,
			inside: {
				'function': /^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,
				'generic': {
					pattern: /<[\s\S]+/, // everything after the first <
					alias: 'class-name',
					inside: typeInside
				}
			}
		}
	});

	Prism.languages.ts = Prism.languages.typescript;

}(Prism));
fnmPx!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism);8x!(function (Prism) {

	var keywords = /\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;

	Prism.languages.typoscript = {
		'comment': [
			{
				// multiline comments /* */
				pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
				lookbehind: true
			},
			{
				// double-slash comments - ignored when backslashes or colon is found in front
				// also ignored whenever directly after an equal-sign, because it would probably be an url without protocol
				pattern: /(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,
				lookbehind: true,
				greedy: true
			},
			{
				// hash comments - ignored when leading quote is found for hex colors in strings
				pattern: /(^|[^"'])#.*/,
				lookbehind: true,
				greedy: true
			}
		],
		'function': [
			{
				// old include style
				pattern: /<INCLUDE_TYPOSCRIPT:\s*source\s*=\s*(?:"[^"\r\n]*"|'[^'\r\n]*')\s*>/,
				inside: {
					'string': {
						pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
						inside: {
							'keyword': keywords,
						},
					},
					'keyword': {
						pattern: /INCLUDE_TYPOSCRIPT/,
					},
				},
			},
			{
				// new include style
				pattern: /@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,
				inside: {
					'string': /"[^"\r\n]*"|'[^'\r\n]*'/,
				},
			}
		],
		'string': {
			pattern: /^([^=]*=[< ]?)(?:(?!\]\n).)*/,
			lookbehind: true,
			inside: {
				'function': /\{\$.*\}/, // constants include
				'keyword': keywords,
				'number': /^\d+$/,
				'punctuation': /[,|:]/,
			}
		},
		'keyword': keywords,
		'number': {
			// special highlighting for indexes of arrays in tags
			pattern: /\b\d+\s*[.{=]/,
			inside: {
				'operator': /[.{=]/,
			}
		},
		'tag': {
			pattern: /\.?[-\w\\]+\.?/,
			inside: {
				'punctuation': /\./,
			}
		},
		'punctuation': /[{}[\];(),.:|]/,
		'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
	};

	Prism.languages.tsconfig = Prism.languages.typoscript;

}(Prism));
zVxb!function(E){var n=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;E.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern:/<INCLUDE_TYPOSCRIPT:\s*source\s*=\s*(?:"[^"\r\n]*"|'[^'\r\n]*')\s*>/,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:n}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:n,number:/^\d+$/,punctuation:/[,|:]/}},keyword:n,number:{pattern:/\b\d+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},E.languages.tsconfig=E.languages.typoscript}(Prism);x	Prism.languages.unrealscript = {
	'comment': /\/\/.*|\/\*[\s\S]*?\*\//,
	'string': {
		pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},
	'category': {
		pattern: /(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,
		lookbehind: true,
		greedy: true,
		alias: 'property'
	},
	'metadata': {
		pattern: /(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,
		lookbehind: true,
		greedy: true,
		inside: {
			'property': /\b\w+(?=\s*=)/,
			'operator': /=/,
			'punctuation': /[<>|]/
		}
	},
	'macro': {
		pattern: /`\w+/,
		alias: 'property'
	},
	'class-name': {
		pattern: /(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,
		lookbehind: true
	},

	'keyword': /\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,
	'function': /\b[a-z_]\w*(?=\s*\()/i,

	'boolean': /\b(?:false|true)\b/,
	'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
	// https://docs.unrealengine.com/udk/Three/UnrealScriptExpressions.html
	'operator': />>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,
	'punctuation': /[()[\]{};,.]/
};

Prism.languages.uc = Prism.languages.uscript = Prism.languages.unrealscript;
pxPrism.languages.unrealscript={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},category:{pattern:/(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,lookbehind:!0,greedy:!0,alias:"property"},metadata:{pattern:/(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,lookbehind:!0,greedy:!0,inside:{property:/\b\w+(?=\s*=)/,operator:/=/,punctuation:/[<>|]/}},macro:{pattern:/`\w+/,alias:"property"},"class-name":{pattern:/(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,lookbehind:!0},keyword:/\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/>>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,punctuation:/[()[\]{};,.]/},Prism.languages.uc=Prism.languages.uscript=Prism.languages.unrealscript;f@x
Prism.languages.uorazor = {
	'comment-hash': {
		pattern: /#.*/,
		alias: 'comment',
		greedy: true
	},
	'comment-slash': {
		pattern: /\/\/.*/,
		alias: 'comment',
		greedy: true
	},
	'string': {
		pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
		inside: {
			'punctuation': /^['"]|['"]$/
		},
		greedy: true
	},
	'source-layers': {
		pattern: /\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,
		alias: 'function'
	},
	'source-commands': {
		pattern: /\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,
		alias: 'function'
	},
	'tag-name': {
		pattern: /(^\{%-?\s*)\w+/,
		lookbehind: true,
		alias: 'keyword'
	},
	'delimiter': {
		pattern: /^\{[{%]-?|-?[%}]\}$/,
		alias: 'punctuation'
	},
	'function': /\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,
	'keyword': /\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,
	'boolean': /\b(?:false|null|true)\b/,
	'number': /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
	'operator': [
		{
			pattern: /(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,
			lookbehind: true
		},
		/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/
	],
	'punctuation': /[()\[\]{}:.,]/
};
鷕xW	Prism.languages.uorazor={"comment-hash":{pattern:/#.*/,alias:"comment",greedy:!0},"comment-slash":{pattern:/\/\/.*/,alias:"comment",greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/},greedy:!0},"source-layers":{pattern:/\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,alias:"function"},"source-commands":{pattern:/\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,alias:"function"},"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},function:/\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,keyword:/\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/};UtxC// https://tools.ietf.org/html/rfc3986#appendix-A

Prism.languages.uri = {
	'scheme': {
		pattern: /^[a-z][a-z0-9+.-]*:/im,
		greedy: true,
		inside: {
			'scheme-delimiter': /:$/
		}
	},
	'fragment': {
		pattern: /#[\w\-.~!$&'()*+,;=%:@/?]*/,
		inside: {
			'fragment-delimiter': /^#/
		}
	},
	'query': {
		pattern: /\?[\w\-.~!$&'()*+,;=%:@/?]*/,
		inside: {
			'query-delimiter': {
				pattern: /^\?/,
				greedy: true
			},
			'pair-delimiter': /[&;]/,
			'pair': {
				pattern: /^[^=][\s\S]*/,
				inside: {
					'key': /^[^=]+/,
					'value': {
						pattern: /(^=)[\s\S]+/,
						lookbehind: true
					}
				}
			}
		}
	},
	'authority': {
		pattern: RegExp(
			/^\/\//.source
			// [ userinfo "@" ]
			+ /(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source
			// host
			+ (
				'(?:'
				// IP-literal
				+ /\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/.source
				+ '|'
				// IPv4address or registered name
				+ /[\w\-.~!$&'()*+,;=%]*/.source
				+ ')'
			)
			// [ ":" port ]
			+ /(?::\d*)?/.source,
			'm'
		),
		inside: {
			'authority-delimiter': /^\/\//,
			'user-info-segment': {
				pattern: /^[\w\-.~!$&'()*+,;=%:]*@/,
				inside: {
					'user-info-delimiter': /@$/,
					'user-info': /^[\w\-.~!$&'()*+,;=%:]+/
				}
			},
			'port-segment': {
				pattern: /:\d*$/,
				inside: {
					'port-delimiter': /^:/,
					'port': /^\d+/
				}
			},
			'host': {
				pattern: /[\s\S]+/,
				inside: {
					'ip-literal': {
						pattern: /^\[[\s\S]+\]$/,
						inside: {
							'ip-literal-delimiter': /^\[|\]$/,
							'ipv-future': /^v[\s\S]+/,
							'ipv6-address': /^[\s\S]+/
						}
					},
					'ipv4-address': /^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/
				}
			}
		}
	},
	'path': {
		pattern: /^[\w\-.~!$&'()*+,;=%:@/]+/m,
		inside: {
			'path-separator': /\//
		}
	}
};

Prism.languages.url = Prism.languages.uri;
Jx[Prism.languages.uri={scheme:{pattern:/^[a-z][a-z0-9+.-]*:/im,greedy:!0,inside:{"scheme-delimiter":/:$/}},fragment:{pattern:/#[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"fragment-delimiter":/^#/}},query:{pattern:/\?[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"query-delimiter":{pattern:/^\?/,greedy:!0},"pair-delimiter":/[&;]/,pair:{pattern:/^[^=][\s\S]*/,inside:{key:/^[^=]+/,value:{pattern:/(^=)[\s\S]+/,lookbehind:!0}}}}},authority:{pattern:RegExp("^//(?:[\\w\\-.~!$&'()*+,;=%:]*@)?(?:\\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\\.[\\w\\-.~!$&'()*+,;=]+)\\]|[\\w\\-.~!$&'()*+,;=%]*)(?::\\d*)?","m"),inside:{"authority-delimiter":/^\/\//,"user-info-segment":{pattern:/^[\w\-.~!$&'()*+,;=%:]*@/,inside:{"user-info-delimiter":/@$/,"user-info":/^[\w\-.~!$&'()*+,;=%:]+/}},"port-segment":{pattern:/:\d*$/,inside:{"port-delimiter":/^:/,port:/^\d+/}},host:{pattern:/[\s\S]+/,inside:{"ip-literal":{pattern:/^\[[\s\S]+\]$/,inside:{"ip-literal-delimiter":/^\[|\]$/,"ipv-future":/^v[\s\S]+/,"ipv6-address":/^[\s\S]+/}},"ipv4-address":/^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/}}}},path:{pattern:/^[\w\-.~!$&'()*+,;=%:@/]+/m,inside:{"path-separator":/\//}}},Prism.languages.url=Prism.languages.uri;oVx	q(function (Prism) {
	var interpolationExpr = {
		pattern: /[\s\S]+/,
		inside: null
	};

	Prism.languages.v = Prism.languages.extend('clike', {
		'string': {
			pattern: /r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
			alias: 'quoted-string',
			greedy: true,
			inside: {
				'interpolation': {
					pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,
					lookbehind: true,
					inside: {
						'interpolation-variable': {
							pattern: /^\$\w[\s\S]*$/,
							alias: 'variable'
						},
						'interpolation-punctuation': {
							pattern: /^\$\{|\}$/,
							alias: 'punctuation'
						},
						'interpolation-expression': interpolationExpr
					}
				}
			}
		},
		'class-name': {
			pattern: /(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,
			lookbehind: true
		},
		'keyword': /(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,
		'number': /\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,
		'operator': /~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,
		'builtin': /\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/
	});

	interpolationExpr.inside = Prism.languages.v;

	Prism.languages.insertBefore('v', 'string', {
		'char': {
			pattern: /`(?:\\`|\\?[^`]{1,2})`/, // using {1,2} instead of `u` flag for compatibility
			alias: 'rune'
		}
	});

	Prism.languages.insertBefore('v', 'operator', {
		'attribute': {
			pattern: /(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,
			lookbehind: true,
			alias: 'annotation',
			inside: {
				'punctuation': /[\[\]]/,
				'keyword': /\w+/
			}
		},
		'generic': {
			pattern: /<\w+>(?=\s*[\)\{])/,
			inside: {
				'punctuation': /[<>]/,
				'class-name': /\w+/
			}
		}
	});

	Prism.languages.insertBefore('v', 'function', {
		'generic-function': {
			// e.g. foo<T>( ...
			pattern: /\b\w+\s*<\w+>(?=\()/,
			inside: {
				'function': /^\w+/,
				'generic': {
					pattern: /<\w+>/,
					inside: Prism.languages.v.generic.inside
				}
			}
		}
	});
}(Prism));
<uxW!function(e){var n={pattern:/[\s\S]+/,inside:null};e.languages.v=e.languages.extend("clike",{string:{pattern:/r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,alias:"quoted-string",greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,lookbehind:!0,inside:{"interpolation-variable":{pattern:/^\$\w[\s\S]*$/,alias:"variable"},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},"interpolation-expression":n}}}},"class-name":{pattern:/(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,lookbehind:!0},keyword:/(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,number:/\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,operator:/~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,builtin:/\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/}),n.inside=e.languages.v,e.languages.insertBefore("v","string",{char:{pattern:/`(?:\\`|\\?[^`]{1,2})`/,alias:"rune"}}),e.languages.insertBefore("v","operator",{attribute:{pattern:/(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,lookbehind:!0,alias:"annotation",inside:{punctuation:/[\[\]]/,keyword:/\w+/}},generic:{pattern:/<\w+>(?=\s*[\)\{])/,inside:{punctuation:/[<>]/,"class-name":/\w+/}}}),e.languages.insertBefore("v","function",{"generic-function":{pattern:/\b\w+\s*<\w+>(?=\()/,inside:{function:/^\w+/,generic:{pattern:/<\w+>/,inside:e.languages.v.generic.inside}}}})}(Prism);N!x	WPrism.languages.vala = Prism.languages.extend('clike', {
	// Classes copied from prism-csharp
	'class-name': [
		{
			// (Foo bar, Bar baz)
			pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,
			inside: {
				punctuation: /\./
			}
		},
		{
			// [Foo]
			pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/,
			lookbehind: true,
			inside: {
				punctuation: /\./
			}
		},
		{
			// class Foo : Bar
			pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,
			lookbehind: true,
			inside: {
				punctuation: /\./
			}
		},
		{
			// class Foo
			pattern: /((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,
			lookbehind: true,
			inside: {
				punctuation: /\./
			}
		}
	],
	'keyword': /\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,
	'function': /\b\w+(?=\s*\()/,
	'number': /(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,
	'operator': /\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,
	'punctuation': /[{}[\];(),.:]/,
	'constant': /\b[A-Z0-9_]+\b/
});

Prism.languages.insertBefore('vala', 'string', {
	'raw-string': {
		pattern: /"""[\s\S]*?"""/,
		greedy: true,
		alias: 'string'
	},
	'template-string': {
		pattern: /@"[\s\S]*?"/,
		greedy: true,
		inside: {
			'interpolation': {
				pattern: /\$(?:\([^)]*\)|[a-zA-Z]\w*)/,
				inside: {
					'delimiter': {
						pattern: /^\$\(?|\)$/,
						alias: 'punctuation'
					},
					rest: Prism.languages.vala
				}
			},
			'string': /[\s\S]+/
		}
	}
});

Prism.languages.insertBefore('vala', 'keyword', {
	'regex': {
		pattern: /\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,
		greedy: true,
		inside: {
			'regex-source': {
				pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
				lookbehind: true,
				alias: 'language-regex',
				inside: Prism.languages.regex
			},
			'regex-delimiter': /^\//,
			'regex-flags': /^[a-z]+$/,
		}
	}
});
?}}x.Prism.languages.vala=Prism.languages.extend("clike",{"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],keyword:/\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,function:/\b\w+(?=\s*\()/,number:/(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,operator:/\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,punctuation:/[{}[\];(),.:]/,constant:/\b[A-Z0-9_]+\b/}),Prism.languages.insertBefore("vala","string",{"raw-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"template-string":{pattern:/@"[\s\S]*?"/,greedy:!0,inside:{interpolation:{pattern:/\$(?:\([^)]*\)|[a-zA-Z]\w*)/,inside:{delimiter:{pattern:/^\$\(?|\)$/,alias:"punctuation"},rest:Prism.languages.vala}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("vala","keyword",{regex:{pattern:/\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\//,"regex-flags":/^[a-z]+$/}}});!տqxPrism.languages.vbnet = Prism.languages.extend('basic', {
	'comment': [
		{
			pattern: /(?:!|REM\b).+/i,
			inside: {
				'keyword': /^REM/i
			}
		},
		{
			pattern: /(^|[^\\:])'.*/,
			lookbehind: true,
			greedy: true
		}
	],
	'string': {
		pattern: /(^|[^"])"(?:""|[^"])*"(?!")/,
		lookbehind: true,
		greedy: true
	},
	'keyword': /(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,
	'punctuation': /[,;:(){}]/
});
h71kxBPrism.languages.vbnet=Prism.languages.extend("basic",{comment:[{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},{pattern:/(^|[^\\:])'.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^"])"(?:""|[^"])*"(?!")/,lookbehind:!0,greedy:!0},keyword:/(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,punctuation:/[,;:(){}]/});+jxT(function (Prism) {
	Prism.languages.velocity = Prism.languages.extend('markup', {});

	var velocity = {
		'variable': {
			pattern: /(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,
			lookbehind: true,
			inside: {} // See below
		},
		'string': {
			pattern: /"[^"]*"|'[^']*'/,
			greedy: true
		},
		'number': /\b\d+\b/,
		'boolean': /\b(?:false|true)\b/,
		'operator': /[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,
		'punctuation': /[(){}[\]:,.]/
	};

	velocity.variable.inside = {
		'string': velocity['string'],
		'function': {
			pattern: /([^\w-])[a-z][\w-]*(?=\()/,
			lookbehind: true
		},
		'number': velocity['number'],
		'boolean': velocity['boolean'],
		'punctuation': velocity['punctuation']
	};

	Prism.languages.insertBefore('velocity', 'comment', {
		'unparsed': {
			pattern: /(^|[^\\])#\[\[[\s\S]*?\]\]#/,
			lookbehind: true,
			greedy: true,
			inside: {
				'punctuation': /^#\[\[|\]\]#$/
			}
		},
		'velocity-comment': [
			{
				pattern: /(^|[^\\])#\*[\s\S]*?\*#/,
				lookbehind: true,
				greedy: true,
				alias: 'comment'
			},
			{
				pattern: /(^|[^\\])##.*/,
				lookbehind: true,
				greedy: true,
				alias: 'comment'
			}
		],
		'directive': {
			pattern: /(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,
			lookbehind: true,
			inside: {
				'keyword': {
					pattern: /^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,
					inside: {
						'punctuation': /[{}]/
					}
				},
				rest: velocity
			}
		},
		'variable': velocity['variable']
	});

	Prism.languages.velocity['tag'].inside['attr-value'].inside.rest = Prism.languages.velocity;

}(Prism));
s^Mx.!function(e){e.languages.velocity=e.languages.extend("markup",{});var n={variable:{pattern:/(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,lookbehind:!0,inside:{}},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},number:/\b\d+\b/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,punctuation:/[(){}[\]:,.]/};n.variable.inside={string:n.string,function:{pattern:/([^\w-])[a-z][\w-]*(?=\()/,lookbehind:!0},number:n.number,boolean:n.boolean,punctuation:n.punctuation},e.languages.insertBefore("velocity","comment",{unparsed:{pattern:/(^|[^\\])#\[\[[\s\S]*?\]\]#/,lookbehind:!0,greedy:!0,inside:{punctuation:/^#\[\[|\]\]#$/}},"velocity-comment":[{pattern:/(^|[^\\])#\*[\s\S]*?\*#/,lookbehind:!0,greedy:!0,alias:"comment"},{pattern:/(^|[^\\])##.*/,lookbehind:!0,greedy:!0,alias:"comment"}],directive:{pattern:/(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,lookbehind:!0,inside:{keyword:{pattern:/^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,inside:{punctuation:/[{}]/}},rest:n}},variable:n.variable}),e.languages.velocity.tag.inside["attr-value"].inside.rest=e.languages.velocity}(Prism);;x	^Prism.languages.verilog = {
	'comment': {
		pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
		greedy: true
	},
	'string': {
		pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
		greedy: true
	},
	'kernel-function': {
		// support for any kernel function (ex: $display())
		pattern: /\B\$\w+\b/,
		alias: 'property'
	},
	// support for user defined constants (ex: `define)
	'constant': /\B`\w+\b/,
	'function': /\b\w+(?=\()/,
	// support for verilog and system verilog keywords
	'keyword': /\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,
	// bold highlighting for all verilog and system verilog logic blocks
	'important': /\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,
	// support for time ticks, vectors, and real numbers
	'number': /\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,
	'operator': /[-+{}^~%*\/?=!<>&|]+/,
	'punctuation': /[[\];(),.:]/
};
;7찃x0Prism.languages.verilog={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"kernel-function":{pattern:/\B\$\w+\b/,alias:"property"},constant:/\B`\w+\b/,function:/\b\w+(?=\()/,keyword:/\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,important:/\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,number:/\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,operator:/[-+{}^~%*\/?=!<>&|]+/,punctuation:/[[\];(),.:]/};RRUxTPrism.languages.vhdl = {
	'comment': /--.+/,
	// support for all logic vectors
	'vhdl-vectors': {
		'pattern': /\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,
		'alias': 'number'
	},
	// support for operator overloading included
	'quoted-function': {
		pattern: /"\S+?"(?=\()/,
		alias: 'function'
	},
	'string': /"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,
	'attribute': {
		pattern: /\b'\w+/,
		alias: 'attr-name'
	},
	// support for predefined attributes included
	'keyword': /\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,
	'boolean': /\b(?:false|true)\b/i,
	'function': /\w+(?=\()/,
	// decimal, based, physical, and exponential numbers supported
	'number': /'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,
	'operator': /[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,
	'punctuation': /[{}[\];(),.:]/
};
7Cx<Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}; x7SPrism.languages.vim = {
	'string': /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,
	'comment': /".*/,
	'function': /\b\w+(?=\()/,
	'keyword': /\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,
	'builtin': /\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,
	'number': /\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,
	'operator': /\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,
	'punctuation': /[{}[\](),;:]/
};
(;x7Prism.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/};a}x!Prism.languages['visual-basic'] = {
	'comment': {
		pattern: /(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,
		inside: {
			'keyword': /^REM/i
		}
	},
	'directive': {
		pattern: /#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,
		alias: 'property',
		greedy: true
	},
	'string': {
		pattern: /\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,
		greedy: true
	},
	'date': {
		pattern: /#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,
		alias: 'number'
	},
	'number': /(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,
	'boolean': /\b(?:False|Nothing|True)\b/i,
	'keyword': /\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,
	'operator': /[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,
	'punctuation': /[{}().,:?]/
};

Prism.languages.vb = Prism.languages['visual-basic'];
Prism.languages.vba = Prism.languages['visual-basic'];
BxvxlPrism.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,alias:"property",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,alias:"number"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,boolean:/\b(?:False|Nothing|True)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,operator:/[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,punctuation:/[{}().,:?]/},Prism.languages.vb=Prism.languages["visual-basic"],Prism.languages.vba=Prism.languages["visual-basic"]; 9xnPrism.languages.warpscript = {
	'comment': /#.*|\/\/.*|\/\*[\s\S]*?\*\//,
	'string': {
		pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,
		greedy: true
	},
	'variable': /\$\S+/,
	'macro': {
		pattern: /@\S+/,
		alias: 'property'
	},
	// WarpScript doesn't have any keywords, these are all functions under the control category
	// https://www.warp10.io/tags/control
	'keyword': /\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,
	'number': /[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,
	'boolean': /\b(?:F|T|false|true)\b/,
	'punctuation': /<%|%>|[{}[\]()]/,
	// Some operators from the "operators" category
	// https://www.warp10.io/tags/operators
	'operator': /==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/
};
61&xlPrism.languages.warpscript={comment:/#.*|\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,greedy:!0},variable:/\$\S+/,macro:{pattern:/@\S+/,alias:"property"},keyword:/\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,number:/[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,boolean:/\b(?:F|T|false|true)\b/,punctuation:/<%|%>|[{}[\]()]/,operator:/==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/};ȮSx:Prism.languages.wasm = {
	'comment': [
		/\(;[\s\S]*?;\)/,
		{
			pattern: /;;.*/,
			greedy: true
		}
	],
	'string': {
		pattern: /"(?:\\[\s\S]|[^"\\])*"/,
		greedy: true
	},
	'keyword': [
		{
			pattern: /\b(?:align|offset)=/,
			inside: {
				'operator': /=/
			}
		},
		{
			pattern: /\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,
			inside: {
				'punctuation': /\./
			}
		},
		/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/
	],
	'variable': /\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,
	'number': /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,
	'punctuation': /[()]/
};
fOKxGPrism.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};fx@(function (Prism) {

	var id = /(?:\B-|\b_|\b)[A-Za-z][\w-]*(?![\w-])/.source;
	var type =
		'(?:' +
		/\b(?:unsigned\s+)?long\s+long(?![\w-])/.source +
		'|' +
		/\b(?:unrestricted|unsigned)\s+[a-z]+(?![\w-])/.source +
		'|' +
		/(?!(?:unrestricted|unsigned)\b)/.source + id + /(?:\s*<(?:[^<>]|<[^<>]*>)*>)?/.source +
		')' + /(?:\s*\?)?/.source;

	var typeInside = {};

	Prism.languages['web-idl'] = {
		'comment': {
			pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
			greedy: true
		},
		'string': {
			pattern: /"[^"]*"/,
			greedy: true
		},

		'namespace': {
			pattern: RegExp(/(\bnamespace\s+)/.source + id),
			lookbehind: true,
		},
		'class-name': [
			{
				pattern: /(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,
				lookbehind: true,
				inside: typeInside
			},
			{
				pattern: RegExp(/(\b(?:attribute|const|deleter|getter|optional|setter)\s+)/.source + type),
				lookbehind: true,
				inside: typeInside
			},
			{
				// callback return type
				pattern: RegExp('(' + /\bcallback\s+/.source + id + /\s*=\s*/.source + ')' + type),
				lookbehind: true,
				inside: typeInside
			},
			{
				// typedef
				pattern: RegExp(/(\btypedef\b\s*)/.source + type),
				lookbehind: true,
				inside: typeInside
			},

			{
				pattern: RegExp(/(\b(?:callback|dictionary|enum|interface(?:\s+mixin)?)\s+)(?!(?:interface|mixin)\b)/.source + id),
				lookbehind: true,
			},
			{
				// inheritance
				pattern: RegExp(/(:\s*)/.source + id),
				lookbehind: true,
			},

			// includes and implements
			RegExp(id + /(?=\s+(?:implements|includes)\b)/.source),
			{
				pattern: RegExp(/(\b(?:implements|includes)\s+)/.source + id),
				lookbehind: true,
			},

			{
				// function return type, parameter types, and dictionary members
				pattern: RegExp(type + '(?=' + /\s*(?:\.{3}\s*)?/.source + id + /\s*[(),;=]/.source + ')'),
				inside: typeInside
			},
		],

		'builtin': /\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,
		'keyword': [
			/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,
			// type keywords
			/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/
		],
		'boolean': /\b(?:false|true)\b/,

		'number': {
			pattern: /(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,
			lookbehind: true
		},
		'operator': /\.{3}|[=:?<>-]/,
		'punctuation': /[(){}[\].,;]/
	};

	for (var key in Prism.languages['web-idl']) {
		if (key !== 'class-name') {
			typeInside[key] = Prism.languages['web-idl'][key];
		}
	}

	Prism.languages['webidl'] = Prism.languages['web-idl'];

}(Prism));

SxA!function(e){var n="(?:\\B-|\\b_|\\b)[A-Za-z][\\w-]*(?![\\w-])",t="(?:\\b(?:unsigned\\s+)?long\\s+long(?![\\w-])|\\b(?:unrestricted|unsigned)\\s+[a-z]+(?![\\w-])|(?!(?:unrestricted|unsigned)\\b)"+n+"(?:\\s*<(?:[^<>]|<[^<>]*>)*>)?)(?:\\s*\\?)?",i={};for(var r in e.languages["web-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"[^"]*"/,greedy:!0},namespace:{pattern:RegExp("(\\bnamespace\\s+)"+n),lookbehind:!0},"class-name":[{pattern:/(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,lookbehind:!0,inside:i},{pattern:RegExp("(\\b(?:attribute|const|deleter|getter|optional|setter)\\s+)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\bcallback\\s+"+n+"\\s*=\\s*)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\btypedef\\b\\s*)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\b(?:callback|dictionary|enum|interface(?:\\s+mixin)?)\\s+)(?!(?:interface|mixin)\\b)"+n),lookbehind:!0},{pattern:RegExp("(:\\s*)"+n),lookbehind:!0},RegExp(n+"(?=\\s+(?:implements|includes)\\b)"),{pattern:RegExp("(\\b(?:implements|includes)\\s+)"+n),lookbehind:!0},{pattern:RegExp(t+"(?=\\s*(?:\\.{3}\\s*)?"+n+"\\s*[(),;=])"),inside:i}],builtin:/\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,keyword:[/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/],boolean:/\b(?:false|true)\b/,number:{pattern:/(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,lookbehind:!0},operator:/\.{3}|[=:?<>-]/,punctuation:/[(){}[\].,;]/},e.languages["web-idl"])"class-name"!==r&&(i[r]=e.languages["web-idl"][r]);e.languages.webidl=e.languages["web-idl"]}(Prism);лxDPrism.languages.wgsl = {
	'comment': {
		pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
		greedy: true,
	},
	'builtin-attribute': {
		pattern: /(@)builtin\(.*?\)/,
		lookbehind: true,
		inside: {
			'attribute': {
				pattern: /^builtin/,
				alias: 'attr-name',
			},
			'punctuation': /[(),]/,
			'built-in-values': {
				pattern: /\b(?:frag_depth|front_facing|global_invocation_id|instance_index|local_invocation_id|local_invocation_index|num_workgroups|position|sample_index|sample_mask|vertex_index|workgroup_id)\b/,
				alias: 'attr-value',
			},
		},
	},
	'attributes': {
		pattern: /(@)(?:align|binding|compute|const|fragment|group|id|interpolate|invariant|location|size|vertex|workgroup_size)/i,
		lookbehind: true,
		alias: 'attr-name',
	},
	'functions': {
		pattern: /\b(fn\s+)[_a-zA-Z]\w*(?=[(<])/,
		lookbehind: true,
		alias: 'function',
	},
	'keyword': /\b(?:bitcast|break|case|const|continue|continuing|default|discard|else|enable|fallthrough|fn|for|function|if|let|loop|private|return|storage|struct|switch|type|uniform|var|while|workgroup)\b/,
	'builtin': /\b(?:abs|acos|acosh|all|any|array|asin|asinh|atan|atan2|atanh|atomic|atomicAdd|atomicAnd|atomicCompareExchangeWeak|atomicExchange|atomicLoad|atomicMax|atomicMin|atomicOr|atomicStore|atomicSub|atomicXor|bool|ceil|clamp|cos|cosh|countLeadingZeros|countOneBits|countTrailingZeros|cross|degrees|determinant|distance|dot|dpdx|dpdxCoarse|dpdxFine|dpdy|dpdyCoarse|dpdyFine|exp|exp2|extractBits|f32|f64|faceForward|firstLeadingBit|floor|fma|fract|frexp|fwidth|fwidthCoarse|fwidthFine|i32|i64|insertBits|inverseSqrt|ldexp|length|log|log2|mat[2-4]x[2-4]|max|min|mix|modf|normalize|override|pack2x16float|pack2x16snorm|pack2x16unorm|pack4x8snorm|pack4x8unorm|pow|ptr|quantizeToF16|radians|reflect|refract|reverseBits|round|sampler|sampler_comparison|select|shiftLeft|shiftRight|sign|sin|sinh|smoothstep|sqrt|staticAssert|step|storageBarrier|tan|tanh|textureDimensions|textureGather|textureGatherCompare|textureLoad|textureNumLayers|textureNumLevels|textureNumSamples|textureSample|textureSampleBias|textureSampleCompare|textureSampleCompareLevel|textureSampleGrad|textureSampleLevel|textureStore|texture_1d|texture_2d|texture_2d_array|texture_3d|texture_cube|texture_cube_array|texture_depth_2d|texture_depth_2d_array|texture_depth_cube|texture_depth_cube_array|texture_depth_multisampled_2d|texture_multisampled_2d|texture_storage_1d|texture_storage_2d|texture_storage_2d_array|texture_storage_3d|transpose|trunc|u32|u64|unpack2x16float|unpack2x16snorm|unpack2x16unorm|unpack4x8snorm|unpack4x8unorm|vec[2-4]|workgroupBarrier)\b/,
	'function-calls': {
		pattern: /\b[_a-z]\w*(?=\()/i,
		alias: 'function',
	},
	'class-name': /\b(?:[A-Z][A-Za-z0-9]*)\b/,
	'bool-literal': {
		pattern: /\b(?:false|true)\b/,
		alias: 'boolean',
	},
	'hex-int-literal': {
		pattern: /\b0[xX][0-9a-fA-F]+[iu]?\b(?![.pP])/,
		alias: 'number',
	},
	'hex-float-literal': {
		pattern: /\b0[xX][0-9a-fA-F]*(?:\.[0-9a-fA-F]*)?(?:[pP][+-]?\d+[fh]?)?/, alias: 'number'
	},
	'decimal-float-literal': [
		{ pattern: /\d*\.\d+(?:[eE](?:\+|-)?\d+)?[fh]?/, alias: 'number' },
		{ pattern: /\d+\.\d*(?:[eE](?:\+|-)?\d+)?[fh]?/, alias: 'number' },
		{ pattern: /\d+[eE](?:\+|-)?\d+[fh]?/, alias: 'number' },
		{ pattern: /\b\d+[fh]\b/, alias: 'number' },
	],
	'int-literal': {
		pattern: /\b\d+[iu]?\b/,
		alias: 'number',
	},
	'operator': [
		{ pattern: /(?:\^|~|\|(?!\|)|\|\||&&|<<|>>|!)(?!=)/ },
		{ pattern: /&(?![&=])/ },
		{ pattern: /(?:\+=|-=|\*=|\/=|%=|\^=|&=|\|=|<<=|>>=)/ },
		{ pattern: /(^|[^<>=!])=(?![=>])/, lookbehind: true },
		{ pattern: /(?:==|!=|<=|\+\+|--|(^|[^=])>=)/, lookbehind: true },
		{ pattern: /(?:(?:[+%]|(?:\*(?!\w)))(?!=))|(?:-(?!>))|(?:\/(?!\/))/ },
		{ pattern: /->/ },
	],
	'punctuation': /[@(){}[\],;<>:.]/,
};
*=xvPrism.languages.wgsl={comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"builtin-attribute":{pattern:/(@)builtin\(.*?\)/,lookbehind:!0,inside:{attribute:{pattern:/^builtin/,alias:"attr-name"},punctuation:/[(),]/,"built-in-values":{pattern:/\b(?:frag_depth|front_facing|global_invocation_id|instance_index|local_invocation_id|local_invocation_index|num_workgroups|position|sample_index|sample_mask|vertex_index|workgroup_id)\b/,alias:"attr-value"}}},attributes:{pattern:/(@)(?:align|binding|compute|const|fragment|group|id|interpolate|invariant|location|size|vertex|workgroup_size)/i,lookbehind:!0,alias:"attr-name"},functions:{pattern:/\b(fn\s+)[_a-zA-Z]\w*(?=[(<])/,lookbehind:!0,alias:"function"},keyword:/\b(?:bitcast|break|case|const|continue|continuing|default|discard|else|enable|fallthrough|fn|for|function|if|let|loop|private|return|storage|struct|switch|type|uniform|var|while|workgroup)\b/,builtin:/\b(?:abs|acos|acosh|all|any|array|asin|asinh|atan|atan2|atanh|atomic|atomicAdd|atomicAnd|atomicCompareExchangeWeak|atomicExchange|atomicLoad|atomicMax|atomicMin|atomicOr|atomicStore|atomicSub|atomicXor|bool|ceil|clamp|cos|cosh|countLeadingZeros|countOneBits|countTrailingZeros|cross|degrees|determinant|distance|dot|dpdx|dpdxCoarse|dpdxFine|dpdy|dpdyCoarse|dpdyFine|exp|exp2|extractBits|f32|f64|faceForward|firstLeadingBit|floor|fma|fract|frexp|fwidth|fwidthCoarse|fwidthFine|i32|i64|insertBits|inverseSqrt|ldexp|length|log|log2|mat[2-4]x[2-4]|max|min|mix|modf|normalize|override|pack2x16float|pack2x16snorm|pack2x16unorm|pack4x8snorm|pack4x8unorm|pow|ptr|quantizeToF16|radians|reflect|refract|reverseBits|round|sampler|sampler_comparison|select|shiftLeft|shiftRight|sign|sin|sinh|smoothstep|sqrt|staticAssert|step|storageBarrier|tan|tanh|textureDimensions|textureGather|textureGatherCompare|textureLoad|textureNumLayers|textureNumLevels|textureNumSamples|textureSample|textureSampleBias|textureSampleCompare|textureSampleCompareLevel|textureSampleGrad|textureSampleLevel|textureStore|texture_1d|texture_2d|texture_2d_array|texture_3d|texture_cube|texture_cube_array|texture_depth_2d|texture_depth_2d_array|texture_depth_cube|texture_depth_cube_array|texture_depth_multisampled_2d|texture_multisampled_2d|texture_storage_1d|texture_storage_2d|texture_storage_2d_array|texture_storage_3d|transpose|trunc|u32|u64|unpack2x16float|unpack2x16snorm|unpack2x16unorm|unpack4x8snorm|unpack4x8unorm|vec[2-4]|workgroupBarrier)\b/,"function-calls":{pattern:/\b[_a-z]\w*(?=\()/i,alias:"function"},"class-name":/\b(?:[A-Z][A-Za-z0-9]*)\b/,"bool-literal":{pattern:/\b(?:false|true)\b/,alias:"boolean"},"hex-int-literal":{pattern:/\b0[xX][0-9a-fA-F]+[iu]?\b(?![.pP])/,alias:"number"},"hex-float-literal":{pattern:/\b0[xX][0-9a-fA-F]*(?:\.[0-9a-fA-F]*)?(?:[pP][+-]?\d+[fh]?)?/,alias:"number"},"decimal-float-literal":[{pattern:/\d*\.\d+(?:[eE](?:\+|-)?\d+)?[fh]?/,alias:"number"},{pattern:/\d+\.\d*(?:[eE](?:\+|-)?\d+)?[fh]?/,alias:"number"},{pattern:/\d+[eE](?:\+|-)?\d+[fh]?/,alias:"number"},{pattern:/\b\d+[fh]\b/,alias:"number"}],"int-literal":{pattern:/\b\d+[iu]?\b/,alias:"number"},operator:[{pattern:/(?:\^|~|\|(?!\|)|\|\||&&|<<|>>|!)(?!=)/},{pattern:/&(?![&=])/},{pattern:/(?:\+=|-=|\*=|\/=|%=|\^=|&=|\|=|<<=|>>=)/},{pattern:/(^|[^<>=!])=(?![=>])/,lookbehind:!0},{pattern:/(?:==|!=|<=|\+\+|--|(^|[^=])>=)/,lookbehind:!0},{pattern:/(?:(?:[+%]|(?:\*(?!\w)))(?!=))|(?:-(?!>))|(?:\/(?!\/))/},{pattern:/->/}],punctuation:/[@(){}[\],;<>:.]/};Xlx5Prism.languages.wiki = Prism.languages.extend('markup', {
	'block-comment': {
		pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
		lookbehind: true,
		alias: 'comment'
	},
	'heading': {
		pattern: /^(=+)[^=\r\n].*?\1/m,
		inside: {
			'punctuation': /^=+|=+$/,
			'important': /.+/
		}
	},
	'emphasis': {
		// TODO Multi-line
		pattern: /('{2,5}).+?\1/,
		inside: {
			'bold-italic': {
				pattern: /(''''').+?(?=\1)/,
				lookbehind: true,
				alias: ['bold', 'italic']
			},
			'bold': {
				pattern: /(''')[^'](?:.*?[^'])?(?=\1)/,
				lookbehind: true
			},
			'italic': {
				pattern: /('')[^'](?:.*?[^'])?(?=\1)/,
				lookbehind: true
			},
			'punctuation': /^''+|''+$/
		}
	},
	'hr': {
		pattern: /^-{4,}/m,
		alias: 'punctuation'
	},
	'url': [
		/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,
		/\[\[.+?\]\]|\[.+?\]/
	],
	'variable': [
		/__[A-Z]+__/,
		// FIXME Nested structures should be handled
		// {{formatnum:{{#expr:{{{3}}}}}}}
		/\{{3}.+?\}{3}/,
		/\{\{.+?\}\}/
	],
	'symbol': [
		/^#redirect/im,
		/~{3,5}/
	],
	// Handle table attrs:
	// {|
	// ! style="text-align:left;"| Item
	// |}
	'table-tag': {
		pattern: /((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,
		lookbehind: true,
		inside: {
			'table-bar': {
				pattern: /\|$/,
				alias: 'punctuation'
			},
			rest: Prism.languages.markup['tag'].inside
		}
	},
	'punctuation': /^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m
});

Prism.languages.insertBefore('wiki', 'tag', {
	// Prevent highlighting inside <nowiki>, <source> and <pre> tags
	'nowiki': {
		pattern: /<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,
		inside: {
			'tag': {
				pattern: /<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,
				inside: Prism.languages.markup['tag'].inside
			}
		}
	}
});
uIxnPrism.languages.wiki=Prism.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+)[^=\r\n].*?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold-italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0,alias:["bold","italic"]},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?\}\}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:Prism.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),Prism.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,inside:Prism.languages.markup.tag.inside}}}});{@xPrism.languages.wolfram = {
	'comment': // Allow one level of nesting - note: regex taken from applescipt
		/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,
	'string': {
		pattern: /"(?:\\.|[^"\\\r\n])*"/,
		greedy: true
	},
	'keyword': /\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,
	'context': {
		pattern: /\b\w+`+\w*/,
		alias: 'class-name'
	},
	'blank': {
		pattern: /\b\w+_\b/,
		alias: 'regex'
	},
	'global-variable': {
		pattern: /\$\w+/,
		alias: 'variable'
	},
	'boolean': /\b(?:False|True)\b/,
	'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,
	'operator': /\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
	'punctuation': /[{}[\];(),.:]/
};

Prism.languages.mathematica = Prism.languages.wolfram;
Prism.languages.wl = Prism.languages.wolfram;
Prism.languages.nb = Prism.languages.wolfram;
bJ6xaPrism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram;w)ļx,
// https://wren.io/

Prism.languages.wren = {
	// Multiline comments in Wren can have nested multiline comments
	// Comments: // and /* */
	'comment': [
		{
			// support 3 levels of nesting
			// regex: \/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\/
			pattern: /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,
			greedy: true
		},
		{
			pattern: /(^|[^\\:])\/\/.*/,
			lookbehind: true,
			greedy: true
		}
	],

	// Triple quoted strings are multiline but cannot have interpolation (raw strings)
	// Based on prism-python.js
	'triple-quoted-string': {
		pattern: /"""[\s\S]*?"""/,
		greedy: true,
		alias: 'string'
	},

	// see below
	'string-literal': null,

	// #!/usr/bin/env wren on the first line
	'hashbang': {
		pattern: /^#!\/.+/,
		greedy: true,
		alias: 'comment'
	},

	// Attributes are special keywords to add meta data to classes
	'attribute': {
		// #! attributes are stored in class properties
		// #!myvar = true
		// #attributes are not stored and dismissed at compilation
		pattern: /#!?[ \t\u3000]*\w+/,
		alias: 'keyword'
	},
	'class-name': [
		{
			// class definition
			// class Meta {}
			pattern: /(\bclass\s+)\w+/,
			lookbehind: true
		},
		// A class must always start with an uppercase.
		// File.read
		/\b[A-Z][a-z\d_]*\b/,
	],

	// A constant can be a variable, class, property or method. Just named in all uppercase letters
	'constant': /\b[A-Z][A-Z\d_]*\b/,

	'null': {
		pattern: /\bnull\b/,
		alias: 'keyword'
	},
	'keyword': /\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,
	'boolean': /\b(?:false|true)\b/,
	'number': /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,

	// Functions can be Class.method()
	'function': /\b[a-z_]\w*(?=\s*[({])/i,

	'operator': /<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,
	'punctuation': /[\[\](){}.,;]/,
};

Prism.languages.wren['string-literal'] = {
	// A single quote string is multiline and can have interpolation (similar to JS backticks ``)
	pattern: /(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,
	lookbehind: true,
	greedy: true,
	inside: {
		'interpolation': {
			// "%(interpolation)"
			pattern: /((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,
			lookbehind: true,
			inside: {
				'expression': {
					pattern: /^(%\()[\s\S]+(?=\)$)/,
					lookbehind: true,
					inside: Prism.languages.wren
				},
				'interpolation-punctuation': {
					pattern: /^%\(|\)$/,
					alias: 'punctuation'
				},
			}
		},
		'string': /[\s\S]+/
	}
};
/GŻTxKPrism.languages.wren={comment:[{pattern:/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"string-literal":null,hashbang:{pattern:/^#!\/.+/,greedy:!0,alias:"comment"},attribute:{pattern:/#!?[ \t\u3000]*\w+/,alias:"keyword"},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},/\b[A-Z][a-z\d_]*\b/],constant:/\b[A-Z][A-Z\d_]*\b/,null:{pattern:/\bnull\b/,alias:"keyword"},keyword:/\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,function:/\b[a-z_]\w*(?=\s*[({])/i,operator:/<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,punctuation:/[\[\](){}.,;]/},Prism.languages.wren["string-literal"]={pattern:/(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,lookbehind:!0,inside:{expression:{pattern:/^(%\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:Prism.languages.wren},"interpolation-punctuation":{pattern:/^%\(|\)$/,alias:"punctuation"}}},string:/[\s\S]+/}};⹠x	
(function (Prism) {
	Prism.languages.xeora = Prism.languages.extend('markup', {
		'constant': {
			pattern: /\$(?:DomainContents|PageRenderDuration)\$/,
			inside: {
				'punctuation': {
					pattern: /\$/
				}
			}
		},
		'variable': {
			pattern: /\$@?(?:#+|[-+*~=^])?[\w.]+\$/,
			inside: {
				'punctuation': {
					pattern: /[$.]/
				},
				'operator': {
					pattern: /#+|[-+*~=^@]/
				}
			}
		},
		'function-inline': {
			pattern: /\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,
			inside: {
				'variable': {
					pattern: /(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,
					inside: {
						'punctuation': {
							pattern: /[,.|]/
						},
						'operator': {
							pattern: /#+|[-+*~=^@]/
						}
					}
				},
				'punctuation': {
					pattern: /\$\w:|[$:?.,|]/
				}
			},
			alias: 'function'
		},
		'function-block': {
			pattern: /\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,
			inside: {
				'punctuation': {
					pattern: /[$:{}?.,|]/
				}
			},
			alias: 'function'
		},
		'directive-inline': {
			pattern: /\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,
			inside: {
				'punctuation': {
					pattern: /\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,
					inside: {
						'tag': {
							pattern: /#\d/
						}
					}
				}
			},
			alias: 'function'
		},
		'directive-block-open': {
			pattern: /\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,
			inside: {
				'punctuation': {
					pattern: /\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,
					inside: {
						'tag': {
							pattern: /#\d/
						}
					}
				},
				'attribute': {
					pattern: /![A-Z]+$/,
					inside: {
						'punctuation': {
							pattern: /!/
						}
					},
					alias: 'keyword'
				}
			},
			alias: 'function'
		},
		'directive-block-separator': {
			pattern: /\}:[-\w.]+:\{/,
			inside: {
				'punctuation': {
					pattern: /[:{}]/
				}
			},
			alias: 'function'
		},
		'directive-block-close': {
			pattern: /\}:[-\w.]+\$/,
			inside: {
				'punctuation': {
					pattern: /[:{}$]/
				}
			},
			alias: 'function'
		}
	});

	Prism.languages.insertBefore('inside', 'punctuation', {
		'variable': Prism.languages.xeora['function-inline'].inside['variable']
	}, Prism.languages.xeora['function-block']);

	Prism.languages.xeoracube = Prism.languages.xeora;

}(Prism));
X)vxb!function(n){n.languages.xeora=n.languages.extend("markup",{constant:{pattern:/\$(?:DomainContents|PageRenderDuration)\$/,inside:{punctuation:{pattern:/\$/}}},variable:{pattern:/\$@?(?:#+|[-+*~=^])?[\w.]+\$/,inside:{punctuation:{pattern:/[$.]/},operator:{pattern:/#+|[-+*~=^@]/}}},"function-inline":{pattern:/\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,inside:{variable:{pattern:/(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,inside:{punctuation:{pattern:/[,.|]/},operator:{pattern:/#+|[-+*~=^@]/}}},punctuation:{pattern:/\$\w:|[$:?.,|]/}},alias:"function"},"function-block":{pattern:/\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,inside:{punctuation:{pattern:/[$:{}?.,|]/}},alias:"function"},"directive-inline":{pattern:/\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}}},alias:"function"},"directive-block-open":{pattern:/\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}},attribute:{pattern:/![A-Z]+$/,inside:{punctuation:{pattern:/!/}},alias:"keyword"}},alias:"function"},"directive-block-separator":{pattern:/\}:[-\w.]+:\{/,inside:{punctuation:{pattern:/[:{}]/}},alias:"function"},"directive-block-close":{pattern:/\}:[-\w.]+\$/,inside:{punctuation:{pattern:/[:{}$]/}},alias:"function"}}),n.languages.insertBefore("inside","punctuation",{variable:n.languages.xeora["function-inline"].inside.variable},n.languages.xeora["function-block"]),n.languages.xeoracube=n.languages.xeora}(Prism);hz0x(function (Prism) {

	/**
	 * If the given language is present, it will insert the given doc comment grammar token into it.
	 *
	 * @param {string} lang
	 * @param {any} docComment
	 */
	function insertDocComment(lang, docComment) {
		if (Prism.languages[lang]) {
			Prism.languages.insertBefore(lang, 'comment', {
				'doc-comment': docComment
			});
		}
	}

	var tag = Prism.languages.markup.tag;

	var slashDocComment = {
		pattern: /\/\/\/.*/,
		greedy: true,
		alias: 'comment',
		inside: {
			'tag': tag
		}
	};
	var tickDocComment = {
		pattern: /'''.*/,
		greedy: true,
		alias: 'comment',
		inside: {
			'tag': tag
		}
	};

	insertDocComment('csharp', slashDocComment);
	insertDocComment('fsharp', slashDocComment);
	insertDocComment('vbnet', tickDocComment);

}(Prism));
]x0!function(a){function e(e,n){a.languages[e]&&a.languages.insertBefore(e,"comment",{"doc-comment":n})}var n=a.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:n}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:n}};e("csharp",t),e("fsharp",t),e("vbnet",g)}(Prism);2iGKxMPrism.languages.xojo = {
	'comment': {
		pattern: /(?:'|\/\/|Rem\b).+/i,
		greedy: true
	},
	'string': {
		pattern: /"(?:""|[^"])*"/,
		greedy: true
	},
	'number': [
		/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
		/&[bchou][a-z\d]+/i
	],
	'directive': {
		pattern: /#(?:Else|ElseIf|Endif|If|Pragma)\b/i,
		alias: 'property'
	},
	'keyword': /\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,
	'operator': /<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,
	'punctuation': /[.,;:()]/
};
⩫EFxaPrism.languages.xojo={comment:{pattern:/(?:'|\/\/|Rem\b).+/i,greedy:!0},string:{pattern:/"(?:""|[^"])*"/,greedy:!0},number:[/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,/&[bchou][a-z\d]+/i],directive:{pattern:/#(?:Else|ElseIf|Endif|If|Pragma)\b/i,alias:"property"},keyword:/\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,operator:/<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,punctuation:/[.,;:()]/};ԢxJ!function(e){e.languages.xquery=e.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),e.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,e.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,e.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,e.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:e.languages.xquery,alias:"language-xquery"};var t=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join("")},n=function(a){for(var o=[],i=0;i<a.length;i++){var r=a[i],s=!1;if("string"!=typeof r&&("tag"===r.type&&r.content[0]&&"tag"===r.content[0].type?"</"===r.content[0].content[0].content?o.length>0&&o[o.length-1].tagName===t(r.content[0].content[1])&&o.pop():"/>"===r.content[r.content.length-1].content||o.push({tagName:t(r.content[0].content[1]),openedBraces:0}):!(o.length>0&&"punctuation"===r.type&&"{"===r.content)||a[i+1]&&"punctuation"===a[i+1].type&&"{"===a[i+1].content||a[i-1]&&"plain-text"===a[i-1].type&&"{"===a[i-1].content?o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?o[o.length-1].openedBraces--:"comment"!==r.type&&(s=!0):o[o.length-1].openedBraces++),(s||"string"==typeof r)&&o.length>0&&0===o[o.length-1].openedBraces){var l=t(r);i<a.length-1&&("string"==typeof a[i+1]||"plain-text"===a[i+1].type)&&(l+=t(a[i+1]),a.splice(i+1,1)),i>0&&("string"==typeof a[i-1]||"plain-text"===a[i-1].type)&&(l=t(a[i-1])+l,a.splice(i-1,1),i--),/^\s+$/.test(l)?a[i]=l:a[i]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&n(r.content)}};e.hooks.add("after-tokenize",(function(e){"xquery"===e.language&&n(e.tokens)}))}(Prism);?pxp(function (Prism) {

	// https://yaml.org/spec/1.2/spec.html#c-ns-anchor-property
	// https://yaml.org/spec/1.2/spec.html#c-ns-alias-node
	var anchorOrAlias = /[*&][^\s[\]{},]+/;
	// https://yaml.org/spec/1.2/spec.html#c-ns-tag-property
	var tag = /!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/;
	// https://yaml.org/spec/1.2/spec.html#c-ns-properties(n,c)
	var properties = '(?:' + tag.source + '(?:[ \t]+' + anchorOrAlias.source + ')?|'
		+ anchorOrAlias.source + '(?:[ \t]+' + tag.source + ')?)';
	// https://yaml.org/spec/1.2/spec.html#ns-plain(n,c)
	// This is a simplified version that doesn't support "#" and multiline keys
	// All these long scarry character classes are simplified versions of YAML's characters
	var plainKey = /(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source
		.replace(/<PLAIN>/g, function () { return /[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source; });
	var string = /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;

	/**
	 *
	 * @param {string} value
	 * @param {string} [flags]
	 * @returns {RegExp}
	 */
	function createValuePattern(value, flags) {
		flags = (flags || '').replace(/m/g, '') + 'm'; // add m flag
		var pattern = /([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source
			.replace(/<<prop>>/g, function () { return properties; }).replace(/<<value>>/g, function () { return value; });
		return RegExp(pattern, flags);
	}

	Prism.languages.yaml = {
		'scalar': {
			pattern: RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source
				.replace(/<<prop>>/g, function () { return properties; })),
			lookbehind: true,
			alias: 'string'
		},
		'comment': /#.*/,
		'key': {
			pattern: RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source
				.replace(/<<prop>>/g, function () { return properties; })
				.replace(/<<key>>/g, function () { return '(?:' + plainKey + '|' + string + ')'; })),
			lookbehind: true,
			greedy: true,
			alias: 'atrule'
		},
		'directive': {
			pattern: /(^[ \t]*)%.+/m,
			lookbehind: true,
			alias: 'important'
		},
		'datetime': {
			pattern: createValuePattern(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),
			lookbehind: true,
			alias: 'number'
		},
		'boolean': {
			pattern: createValuePattern(/false|true/.source, 'i'),
			lookbehind: true,
			alias: 'important'
		},
		'null': {
			pattern: createValuePattern(/null|~/.source, 'i'),
			lookbehind: true,
			alias: 'important'
		},
		'string': {
			pattern: createValuePattern(string),
			lookbehind: true,
			greedy: true
		},
		'number': {
			pattern: createValuePattern(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source, 'i'),
			lookbehind: true
		},
		'tag': tag,
		'important': anchorOrAlias,
		'punctuation': /---|[:[\]{}\-,|>?]|\.\.\./
	};

	Prism.languages.yml = Prism.languages.yaml;

}(Prism));
vҲ{xM!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*".replace(/<PLAIN>/g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<<prop>>/g,(function(){return t})).replace(/<<value>>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<<prop>>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\\s*:\\s)".replace(/<<prop>>/g,(function(){return t})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism);Z|lxPrism.languages.yang = {
	// https://tools.ietf.org/html/rfc6020#page-34
	// http://www.yang-central.org/twiki/bin/view/Main/YangExamples
	'comment': /\/\*[\s\S]*?\*\/|\/\/.*/,
	'string': {
		pattern: /"(?:[^\\"]|\\.)*"|'[^']*'/,
		greedy: true
	},
	'keyword': {
		pattern: /(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,
		lookbehind: true
	},
	'namespace': {
		pattern: /(\s)[a-z_][\w.-]*(?=:)/i,
		lookbehind: true
	},
	'boolean': /\b(?:false|true)\b/,
	'operator': /\+/,
	'punctuation': /[{};:]/
};
x0Prism.languages.yang={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"(?:[^\\"]|\\.)*"|'[^']*'/,greedy:!0},keyword:{pattern:/(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,lookbehind:!0},namespace:{pattern:/(\s)[a-z_][\w.-]*(?=:)/i,lookbehind:!0},boolean:/\b(?:false|true)\b/,operator:/\+/,punctuation:/[{};:]/};0gxa(function (Prism) {

	function literal(str) {
		return function () { return str; };
	}

	var keyword = /\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/;

	var IDENTIFIER = '\\b(?!' + keyword.source + ')(?!\\d)\\w+\\b';
	var ALIGN = /align\s*\((?:[^()]|\([^()]*\))*\)/.source;
	var PREFIX_TYPE_OP = /(?:\?|\bpromise->|(?:\[[^[\]]*\]|\*(?!\*)|\*\*)(?:\s*<ALIGN>|\s*const\b|\s*volatile\b|\s*allowzero\b)*)/.source.replace(/<ALIGN>/g, literal(ALIGN));
	var SUFFIX_EXPR = /(?:\bpromise\b|(?:\berror\.)?<ID>(?:\.<ID>)*(?!\s+<ID>))/.source.replace(/<ID>/g, literal(IDENTIFIER));
	var TYPE = '(?!\\s)(?:!?\\s*(?:' + PREFIX_TYPE_OP + '\\s*)*' + SUFFIX_EXPR + ')+';

	/*
	 * A simplified grammar for Zig compile time type literals:
	 *
	 * TypeExpr = ( "!"? PREFIX_TYPE_OP* SUFFIX_EXPR )+
	 *
	 * SUFFIX_EXPR = ( \b "promise" \b | ( \b "error" "." )? IDENTIFIER ( "." IDENTIFIER )* (?! \s+ IDENTIFIER ) )
	 *
	 * PREFIX_TYPE_OP = "?"
	 *                | \b "promise" "->"
	 *                | ( "[" [^\[\]]* "]" | "*" | "**" ) ( ALIGN | "const" \b | "volatile" \b | "allowzero" \b )*
	 *
	 * ALIGN = "align" "(" ( [^()] | "(" [^()]* ")" )* ")"
	 *
	 * IDENTIFIER = \b (?! KEYWORD ) [a-zA-Z_] \w* \b
	 *
	*/

	Prism.languages.zig = {
		'comment': [
			{
				pattern: /\/\/[/!].*/,
				alias: 'doc-comment'
			},
			/\/{2}.*/
		],
		'string': [
			{
				// "string" and c"string"
				pattern: /(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,
				lookbehind: true,
				greedy: true
			},
			{
				// multiline strings and c-strings
				pattern: /([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,
				lookbehind: true,
				greedy: true
			}
		],
		'char': {
			// characters 'a', '\n', '\xFF', '\u{10FFFF}'
			pattern: /(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,
			lookbehind: true,
			greedy: true
		},
		'builtin': /\B@(?!\d)\w+(?=\s*\()/,
		'label': {
			pattern: /(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,
			lookbehind: true
		},
		'class-name': [
			// const Foo = struct {};
			/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,
			{
				// const x: i32 = 9;
				// var x: Bar;
				// fn foo(x: bool, y: f32) void {}
				pattern: RegExp(/(:\s*)<TYPE>(?=\s*(?:<ALIGN>\s*)?[=;,)])|<TYPE>(?=\s*(?:<ALIGN>\s*)?\{)/.source.replace(/<TYPE>/g, literal(TYPE)).replace(/<ALIGN>/g, literal(ALIGN))),
				lookbehind: true,
				inside: null // see below
			},
			{
				// extern fn foo(x: f64) f64; (optional alignment)
				pattern: RegExp(/(\)\s*)<TYPE>(?=\s*(?:<ALIGN>\s*)?;)/.source.replace(/<TYPE>/g, literal(TYPE)).replace(/<ALIGN>/g, literal(ALIGN))),
				lookbehind: true,
				inside: null // see below
			}
		],
		'builtin-type': {
			pattern: /\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,
			alias: 'keyword'
		},
		'keyword': keyword,
		'function': /\b(?!\d)\w+(?=\s*\()/,
		'number': /\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,
		'boolean': /\b(?:false|true)\b/,
		'operator': /\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,
		'punctuation': /[.:,;(){}[\]]/
	};

	Prism.languages.zig['class-name'].forEach(function (obj) {
		if (obj.inside === null) {
			obj.inside = Prism.languages.zig;
		}
	});

}(Prism));
'\mx
	!function(e){function n(e){return function(){return e}}var r=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,a="\\b(?!"+r.source+")(?!\\d)\\w+\\b",o="align\\s*\\((?:[^()]|\\([^()]*\\))*\\)",s="(?!\\s)(?:!?\\s*(?:"+"(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*<ALIGN>|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(/<ALIGN>/g,n(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?<ID>(?:\\.<ID>)*(?!\\s+<ID>))".replace(/<ID>/g,n(a))+")+";e.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)<TYPE>(?=\\s*(?:<ALIGN>\\s*)?[=;,)])|<TYPE>(?=\\s*(?:<ALIGN>\\s*)?\\{)".replace(/<TYPE>/g,n(s)).replace(/<ALIGN>/g,n(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)<TYPE>(?=\\s*(?:<ALIGN>\\s*)?;)".replace(/<TYPE>/g,n(s)).replace(/<ALIGN>/g,n(o))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},e.languages.zig["class-name"].forEach((function(n){null===n.inside&&(n.inside=e.languages.zig)}))}(Prism);Px3.'use strict';

/**
 * @typedef {Object<string, ComponentCategory>} Components
 * @typedef {Object<string, ComponentEntry | string>} ComponentCategory
 *
 * @typedef ComponentEntry
 * @property {string} [title] The title of the component.
 * @property {string} [owner] The GitHub user name of the owner.
 * @property {boolean} [noCSS=false] Whether the component doesn't have style sheets which should also be loaded.
 * @property {string | string[]} [alias] An optional list of aliases for the id of the component.
 * @property {Object<string, string>} [aliasTitles] An optional map from an alias to its title.
 *
 * Aliases which are not in this map will the get title of the component.
 * @property {string | string[]} [optional]
 * @property {string | string[]} [require]
 * @property {string | string[]} [modify]
 */

var getLoader = (function () {

	/**
	 * A function which does absolutely nothing.
	 *
	 * @type {any}
	 */
	var noop = function () { };

	/**
	 * Invokes the given callback for all elements of the given value.
	 *
	 * If the given value is an array, the callback will be invokes for all elements. If the given value is `null` or
	 * `undefined`, the callback will not be invoked. In all other cases, the callback will be invoked with the given
	 * value as parameter.
	 *
	 * @param {null | undefined | T | T[]} value
	 * @param {(value: T, index: number) => void} callbackFn
	 * @returns {void}
	 * @template T
	 */
	function forEach(value, callbackFn) {
		if (Array.isArray(value)) {
			value.forEach(callbackFn);
		} else if (value != null) {
			callbackFn(value, 0);
		}
	}

	/**
	 * Returns a new set for the given string array.
	 *
	 * @param {string[]} array
	 * @returns {StringSet}
	 *
	 * @typedef {Object<string, true>} StringSet
	 */
	function toSet(array) {
		/** @type {StringSet} */
		var set = {};
		for (var i = 0, l = array.length; i < l; i++) {
			set[array[i]] = true;
		}
		return set;
	}

	/**
	 * Creates a map of every components id to its entry.
	 *
	 * @param {Components} components
	 * @returns {EntryMap}
	 *
	 * @typedef {{ readonly [id: string]: Readonly<ComponentEntry> | undefined }} EntryMap
	 */
	function createEntryMap(components) {
		/** @type {Object<string, Readonly<ComponentEntry>>} */
		var map = {};

		for (var categoryName in components) {
			var category = components[categoryName];
			for (var id in category) {
				if (id != 'meta') {
					/** @type {ComponentEntry | string} */
					var entry = category[id];
					map[id] = typeof entry == 'string' ? { title: entry } : entry;
				}
			}
		}

		return map;
	}

	/**
	 * Creates a full dependencies map which includes all types of dependencies and their transitive dependencies.
	 *
	 * @param {EntryMap} entryMap
	 * @returns {DependencyResolver}
	 *
	 * @typedef {(id: string) => StringSet} DependencyResolver
	 */
	function createDependencyResolver(entryMap) {
		/** @type {Object<string, StringSet>} */
		var map = {};
		var _stackArray = [];

		/**
		 * Adds the dependencies of the given component to the dependency map.
		 *
		 * @param {string} id
		 * @param {string[]} stack
		 */
		function addToMap(id, stack) {
			if (id in map) {
				return;
			}

			stack.push(id);

			// check for circular dependencies
			var firstIndex = stack.indexOf(id);
			if (firstIndex < stack.length - 1) {
				throw new Error('Circular dependency: ' + stack.slice(firstIndex).join(' -> '));
			}

			/** @type {StringSet} */
			var dependencies = {};

			var entry = entryMap[id];
			if (entry) {
				/**
				 * This will add the direct dependency and all of its transitive dependencies to the set of
				 * dependencies of `entry`.
				 *
				 * @param {string} depId
				 * @returns {void}
				 */
				function handleDirectDependency(depId) {
					if (!(depId in entryMap)) {
						throw new Error(id + ' depends on an unknown component ' + depId);
					}
					if (depId in dependencies) {
						// if the given dependency is already in the set of deps, then so are its transitive deps
						return;
					}

					addToMap(depId, stack);
					dependencies[depId] = true;
					for (var transitiveDepId in map[depId]) {
						dependencies[transitiveDepId] = true;
					}
				}

				forEach(entry.require, handleDirectDependency);
				forEach(entry.optional, handleDirectDependency);
				forEach(entry.modify, handleDirectDependency);
			}

			map[id] = dependencies;

			stack.pop();
		}

		return function (id) {
			var deps = map[id];
			if (!deps) {
				addToMap(id, _stackArray);
				deps = map[id];
			}
			return deps;
		};
	}

	/**
	 * Returns a function which resolves the aliases of its given id of alias.
	 *
	 * @param {EntryMap} entryMap
	 * @returns {(idOrAlias: string) => string}
	 */
	function createAliasResolver(entryMap) {
		/** @type {Object<string, string> | undefined} */
		var map;

		return function (idOrAlias) {
			if (idOrAlias in entryMap) {
				return idOrAlias;
			} else {
				// only create the alias map if necessary
				if (!map) {
					map = {};

					for (var id in entryMap) {
						var entry = entryMap[id];
						forEach(entry && entry.alias, function (alias) {
							if (alias in map) {
								throw new Error(alias + ' cannot be alias for both ' + id + ' and ' + map[alias]);
							}
							if (alias in entryMap) {
								throw new Error(alias + ' cannot be alias of ' + id + ' because it is a component.');
							}
							map[alias] = id;
						});
					}
				}
				return map[idOrAlias] || idOrAlias;
			}
		};
	}

	/**
	 * @typedef LoadChainer
	 * @property {(before: T, after: () => T) => T} series
	 * @property {(values: T[]) => T} parallel
	 * @template T
	 */

	/**
	 * Creates an implicit DAG from the given components and dependencies and call the given `loadComponent` for each
	 * component in topological order.
	 *
	 * @param {DependencyResolver} dependencyResolver
	 * @param {StringSet} ids
	 * @param {(id: string) => T} loadComponent
	 * @param {LoadChainer<T>} [chainer]
	 * @returns {T}
	 * @template T
	 */
	function loadComponentsInOrder(dependencyResolver, ids, loadComponent, chainer) {
		var series = chainer ? chainer.series : undefined;
		var parallel = chainer ? chainer.parallel : noop;

		/** @type {Object<string, T>} */
		var cache = {};

		/**
		 * A set of ids of nodes which are not depended upon by any other node in the graph.
		 *
		 * @type {StringSet}
		 */
		var ends = {};

		/**
		 * Loads the given component and its dependencies or returns the cached value.
		 *
		 * @param {string} id
		 * @returns {T}
		 */
		function handleId(id) {
			if (id in cache) {
				return cache[id];
			}

			// assume that it's an end
			// if it isn't, it will be removed later
			ends[id] = true;

			// all dependencies of the component in the given ids
			var dependsOn = [];
			for (var depId in dependencyResolver(id)) {
				if (depId in ids) {
					dependsOn.push(depId);
				}
			}

			/**
			 * The value to be returned.
			 *
			 * @type {T}
			 */
			var value;

			if (dependsOn.length === 0) {
				value = loadComponent(id);
			} else {
				var depsValue = parallel(dependsOn.map(function (depId) {
					var value = handleId(depId);
					// none of the dependencies can be ends
					delete ends[depId];
					return value;
				}));
				if (series) {
					// the chainer will be responsibly for calling the function calling loadComponent
					value = series(depsValue, function () { return loadComponent(id); });
				} else {
					// we don't have a chainer, so we call loadComponent ourselves
					loadComponent(id);
				}
			}

			// cache and return
			return cache[id] = value;
		}

		for (var id in ids) {
			handleId(id);
		}

		/** @type {T[]} */
		var endValues = [];
		for (var endId in ends) {
			endValues.push(cache[endId]);
		}
		return parallel(endValues);
	}

	/**
	 * Returns whether the given object has any keys.
	 *
	 * @param {object} obj
	 */
	function hasKeys(obj) {
		for (var key in obj) {
			return true;
		}
		return false;
	}

	/**
	 * Returns an object which provides methods to get the ids of the components which have to be loaded (`getIds`) and
	 * a way to efficiently load them in synchronously and asynchronous contexts (`load`).
	 *
	 * The set of ids to be loaded is a superset of `load`. If some of these ids are in `loaded`, the corresponding
	 * components will have to reloaded.
	 *
	 * The ids in `load` and `loaded` may be in any order and can contain duplicates.
	 *
	 * @param {Components} components
	 * @param {string[]} load
	 * @param {string[]} [loaded=[]] A list of already loaded components.
	 *
	 * If a component is in this list, then all of its requirements will also be assumed to be in the list.
	 * @returns {Loader}
	 *
	 * @typedef Loader
	 * @property {() => string[]} getIds A function to get all ids of the components to load.
	 *
	 * The returned ids will be duplicate-free, alias-free and in load order.
	 * @property {LoadFunction} load A functional interface to load components.
	 *
	 * @typedef {<T> (loadComponent: (id: string) => T, chainer?: LoadChainer<T>) => T} LoadFunction
	 * A functional interface to load components.
	 *
	 * The `loadComponent` function will be called for every component in the order in which they have to be loaded.
	 *
	 * The `chainer` is useful for asynchronous loading and its `series` and `parallel` functions can be thought of as
	 * `Promise#then` and `Promise.all`.
	 *
	 * @example
	 * load(id => { loadComponent(id); }); // returns undefined
	 *
	 * await load(
	 *     id => loadComponentAsync(id), // returns a Promise for each id
	 *     {
	 *         series: async (before, after) => {
	 *             await before;
	 *             await after();
	 *         },
	 *         parallel: async (values) => {
	 *             await Promise.all(values);
	 *         }
	 *     }
	 * );
	 */
	function getLoader(components, load, loaded) {
		var entryMap = createEntryMap(components);
		var resolveAlias = createAliasResolver(entryMap);

		load = load.map(resolveAlias);
		loaded = (loaded || []).map(resolveAlias);

		var loadSet = toSet(load);
		var loadedSet = toSet(loaded);

		// add requirements

		load.forEach(addRequirements);
		function addRequirements(id) {
			var entry = entryMap[id];
			forEach(entry && entry.require, function (reqId) {
				if (!(reqId in loadedSet)) {
					loadSet[reqId] = true;
					addRequirements(reqId);
				}
			});
		}

		// add components to reload

		// A component x in `loaded` has to be reloaded if
		//  1) a component in `load` modifies x.
		//  2) x depends on a component in `load`.
		// The above two condition have to be applied until nothing changes anymore.

		var dependencyResolver = createDependencyResolver(entryMap);

		/** @type {StringSet} */
		var loadAdditions = loadSet;
		/** @type {StringSet} */
		var newIds;
		while (hasKeys(loadAdditions)) {
			newIds = {};

			// condition 1)
			for (var loadId in loadAdditions) {
				var entry = entryMap[loadId];
				forEach(entry && entry.modify, function (modId) {
					if (modId in loadedSet) {
						newIds[modId] = true;
					}
				});
			}

			// condition 2)
			for (var loadedId in loadedSet) {
				if (!(loadedId in loadSet)) {
					for (var depId in dependencyResolver(loadedId)) {
						if (depId in loadSet) {
							newIds[loadedId] = true;
							break;
						}
					}
				}
			}

			loadAdditions = newIds;
			for (var newId in loadAdditions) {
				loadSet[newId] = true;
			}
		}

		/** @type {Loader} */
		var loader = {
			getIds: function () {
				var ids = [];
				loader.load(function (id) {
					ids.push(id);
				});
				return ids;
			},
			load: function (loadComponent, chainer) {
				return loadComponentsInOrder(dependencyResolver, loadSet, loadComponent, chainer);
			}
		};

		return loader;
	}

	return getLoader;

}());

if (typeof module !== 'undefined') {
	module.exports = getLoader;
}
&ex	{
	"name": "prismjs",
	"version": "1.30.0",
	"description": "Lightweight, robust, elegant syntax highlighting. A spin-off project from Dabblet.",
	"main": "prism.js",
	"style": "themes/prism.css",
	"engines": {
		"node": ">=6"
	},
	"scripts": {
		"benchmark": "node benchmark/benchmark.js",
		"build": "gulp",
		"start": "http-server -c-1",
		"lint": "eslint . --cache",
		"lint:fix": "npm run lint -- --fix",
		"lint:ci": "eslint . --max-warnings 0",
		"regex-coverage": "mocha tests/coverage.js",
		"test:aliases": "mocha tests/aliases-test.js",
		"test:core": "mocha tests/core/**/*.js",
		"test:dependencies": "mocha tests/dependencies-test.js",
		"test:examples": "mocha tests/examples-test.js",
		"test:identifiers": "mocha tests/identifier-test.js",
		"test:languages": "mocha tests/run.js",
		"test:patterns": "mocha tests/pattern-tests.js",
		"test:plugins": "mocha tests/plugins/**/*.js",
		"test:runner": "mocha tests/testrunner-tests.js",
		"test": "npm-run-all test:*",
		"release": "release-it"
	},
	"repository": {
		"type": "git",
		"url": "git+https://github.com/PrismJS/prism.git"
	},
	"keywords": [
		"prism",
		"highlight"
	],
	"author": "Lea Verou",
	"license": "MIT",
	"readmeFilename": "README.md",
	"devDependencies": {
		"@types/node-fetch": "^2.5.5",
		"benchmark": "^2.1.4",
		"chai": "^4.2.0",
		"danger": "^10.5.0",
		"del": "^4.1.1",
		"docdash": "^1.2.0",
		"eslint": "^7.22.0",
		"eslint-plugin-jsdoc": "^32.3.0",
		"eslint-plugin-regexp": "^1.6.0",
		"gulp": "^4.0.2",
		"gulp-clean-css": "^4.3.0",
		"gulp-concat": "^2.3.4",
		"gulp-header": "^2.0.7",
		"gulp-jsdoc3": "^3.0.0",
		"gulp-rename": "^1.2.0",
		"gulp-replace": "^1.0.0",
		"gulp-terser": "^2.1.0",
		"gzip-size": "^5.1.1",
		"htmlparser2": "^4.0.0",
		"http-server": "^0.12.3",
		"jsdom": "^16.7.0",
		"mocha": "^9.2.2",
		"node-fetch": "^3.1.1",
		"npm-run-all": "^4.1.5",
		"prettier": "^2.4.1",
		"pump": "^3.0.0",
		"refa": "^0.9.1",
		"regexp-ast-analysis": "^0.2.4",
		"regexpp": "^3.2.0",
		"release-it": "^18.1.2",
		"scslre": "^0.1.6",
		"simple-git": "^3.3.0",
		"webfont": "^9.0.0",
		"yargs": "^13.2.2"
	},
	"jspm": {
		"main": "prism",
		"registry": "jspm",
		"jspmPackage": true,
		"format": "global",
		"files": [
			"components/**/*.js",
			"plugins/**/*",
			"themes/*.css",
			"prism.js"
		]
	}
}
v x .token a {
	color: inherit;
}&	uxW(function () {

	if (typeof Prism === 'undefined') {
		return;
	}

	var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&!$'()*,;@]+(?:\?[\w\-+%~/.:=?&!$'()*,;@]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;@]*)?/;
	var email = /\b\S+@[\w.]+[a-z]{2}/;
	var linkMd = /\[([^\]]+)\]\(([^)]+)\)/;

	// Tokens that may contain URLs and emails
	var candidates = ['comment', 'url', 'attr-value', 'string'];

	Prism.plugins.autolinker = {
		processGrammar: function (grammar) {
			// Abort if grammar has already been processed
			if (!grammar || grammar['url-link']) {
				return;
			}
			Prism.languages.DFS(grammar, function (key, def, type) {
				if (candidates.indexOf(type) > -1 && !Array.isArray(def)) {
					if (!def.pattern) {
						def = this[key] = {
							pattern: def
						};
					}

					def.inside = def.inside || {};

					if (type == 'comment') {
						def.inside['md-link'] = linkMd;
					}
					if (type == 'attr-value') {
						Prism.languages.insertBefore('inside', 'punctuation', { 'url-link': url }, def);
					} else {
						def.inside['url-link'] = url;
					}

					def.inside['email-link'] = email;
				}
			});
			grammar['url-link'] = url;
			grammar['email-link'] = email;
		}
	};

	Prism.hooks.add('before-highlight', function (env) {
		Prism.plugins.autolinker.processGrammar(env.grammar);
	});

	Prism.hooks.add('wrap', function (env) {
		if (/-link$/.test(env.type)) {
			env.tag = 'a';

			var href = env.content;

			if (env.type == 'email-link' && href.indexOf('mailto:') != 0) {
				href = 'mailto:' + href;
			} else if (env.type == 'md-link') {
				// Markdown
				var match = env.content.match(linkMd);

				href = match[2];
				env.content = match[1];
			}

			env.attributes.href = href;

			// Silently catch any error thrown by decodeURIComponent (#1186)
			try {
				env.content = decodeURIComponent(env.content);
			} catch (e) { /* noop */ }
		}
	});

}());
L5'Bx .token a{color:inherit}h	Cx?!function(){if("undefined"!=typeof Prism){var i=/\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&!$'()*,;@]+(?:\?[\w\-+%~/.:=?&!$'()*,;@]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;@]*)?/,n=/\b\S+@[\w.]+[a-z]{2}/,t=/\[([^\]]+)\]\(([^)]+)\)/,e=["comment","url","attr-value","string"];Prism.plugins.autolinker={processGrammar:function(r){r&&!r["url-link"]&&(Prism.languages.DFS(r,(function(r,a,l){e.indexOf(l)>-1&&!Array.isArray(a)&&(a.pattern||(a=this[r]={pattern:a}),a.inside=a.inside||{},"comment"==l&&(a.inside["md-link"]=t),"attr-value"==l?Prism.languages.insertBefore("inside","punctuation",{"url-link":i},a):a.inside["url-link"]=i,a.inside["email-link"]=n)})),r["url-link"]=i,r["email-link"]=n)}},Prism.hooks.add("before-highlight",(function(i){Prism.plugins.autolinker.processGrammar(i.grammar)})),Prism.hooks.add("wrap",(function(i){if(/-link$/.test(i.type)){i.tag="a";var n=i.content;if("email-link"==i.type&&0!=n.indexOf("mailto:"))n="mailto:"+n;else if("md-link"==i.type){var e=i.content.match(t);n=e[2],i.content=e[1]}i.attributes.href=n;try{i.content=decodeURIComponent(i.content)}catch(i){}}}))}}();`Wodx.(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	/* eslint-disable */

	/**
	 * The dependencies map is built automatically with gulp.
	 *
	 * @type {Object<string, string | string[]>}
	 */
	var lang_dependencies = /*dependencies_placeholder[*/{
		"javascript": "clike",
		"actionscript": "javascript",
		"apex": [
			"clike",
			"sql"
		],
		"arduino": "cpp",
		"aspnet": [
			"markup",
			"csharp"
		],
		"birb": "clike",
		"bison": "c",
		"c": "clike",
		"csharp": "clike",
		"cpp": "c",
		"cfscript": "clike",
		"chaiscript": [
			"clike",
			"cpp"
		],
		"cilkc": "c",
		"cilkcpp": "cpp",
		"coffeescript": "javascript",
		"crystal": "ruby",
		"css-extras": "css",
		"d": "clike",
		"dart": "clike",
		"django": "markup-templating",
		"ejs": [
			"javascript",
			"markup-templating"
		],
		"etlua": [
			"lua",
			"markup-templating"
		],
		"erb": [
			"ruby",
			"markup-templating"
		],
		"fsharp": "clike",
		"firestore-security-rules": "clike",
		"flow": "javascript",
		"ftl": "markup-templating",
		"gml": "clike",
		"glsl": "c",
		"go": "clike",
		"gradle": "clike",
		"groovy": "clike",
		"haml": "ruby",
		"handlebars": "markup-templating",
		"haxe": "clike",
		"hlsl": "c",
		"idris": "haskell",
		"java": "clike",
		"javadoc": [
			"markup",
			"java",
			"javadoclike"
		],
		"jolie": "clike",
		"jsdoc": [
			"javascript",
			"javadoclike",
			"typescript"
		],
		"js-extras": "javascript",
		"json5": "json",
		"jsonp": "json",
		"js-templates": "javascript",
		"kotlin": "clike",
		"latte": [
			"clike",
			"markup-templating",
			"php"
		],
		"less": "css",
		"lilypond": "scheme",
		"liquid": "markup-templating",
		"markdown": "markup",
		"markup-templating": "markup",
		"mongodb": "javascript",
		"n4js": "javascript",
		"objectivec": "c",
		"opencl": "c",
		"parser": "markup",
		"php": "markup-templating",
		"phpdoc": [
			"php",
			"javadoclike"
		],
		"php-extras": "php",
		"plsql": "sql",
		"processing": "clike",
		"protobuf": "clike",
		"pug": [
			"markup",
			"javascript"
		],
		"purebasic": "clike",
		"purescript": "haskell",
		"qsharp": "clike",
		"qml": "javascript",
		"qore": "clike",
		"racket": "scheme",
		"cshtml": [
			"markup",
			"csharp"
		],
		"jsx": [
			"markup",
			"javascript"
		],
		"tsx": [
			"jsx",
			"typescript"
		],
		"reason": "clike",
		"ruby": "clike",
		"sass": "css",
		"scss": "css",
		"scala": "java",
		"shell-session": "bash",
		"smarty": "markup-templating",
		"solidity": "clike",
		"soy": "markup-templating",
		"sparql": "turtle",
		"sqf": "clike",
		"squirrel": "clike",
		"stata": [
			"mata",
			"java",
			"python"
		],
		"t4-cs": [
			"t4-templating",
			"csharp"
		],
		"t4-vb": [
			"t4-templating",
			"vbnet"
		],
		"tap": "yaml",
		"tt2": [
			"clike",
			"markup-templating"
		],
		"textile": "markup",
		"twig": "markup-templating",
		"typescript": "javascript",
		"v": "clike",
		"vala": "clike",
		"vbnet": "basic",
		"velocity": "markup",
		"wiki": "markup",
		"xeora": "markup",
		"xml-doc": "markup",
		"xquery": "markup"
	}/*]*/;

	var lang_aliases = /*aliases_placeholder[*/{
		"html": "markup",
		"xml": "markup",
		"svg": "markup",
		"mathml": "markup",
		"ssml": "markup",
		"atom": "markup",
		"rss": "markup",
		"js": "javascript",
		"g4": "antlr4",
		"ino": "arduino",
		"arm-asm": "armasm",
		"art": "arturo",
		"adoc": "asciidoc",
		"avs": "avisynth",
		"avdl": "avro-idl",
		"gawk": "awk",
		"sh": "bash",
		"shell": "bash",
		"shortcode": "bbcode",
		"rbnf": "bnf",
		"oscript": "bsl",
		"cs": "csharp",
		"dotnet": "csharp",
		"cfc": "cfscript",
		"cilk-c": "cilkc",
		"cilk-cpp": "cilkcpp",
		"cilk": "cilkcpp",
		"coffee": "coffeescript",
		"conc": "concurnas",
		"jinja2": "django",
		"dns-zone": "dns-zone-file",
		"dockerfile": "docker",
		"gv": "dot",
		"eta": "ejs",
		"xlsx": "excel-formula",
		"xls": "excel-formula",
		"gamemakerlanguage": "gml",
		"po": "gettext",
		"gni": "gn",
		"ld": "linker-script",
		"go-mod": "go-module",
		"hbs": "handlebars",
		"mustache": "handlebars",
		"hs": "haskell",
		"idr": "idris",
		"gitignore": "ignore",
		"hgignore": "ignore",
		"npmignore": "ignore",
		"webmanifest": "json",
		"kt": "kotlin",
		"kts": "kotlin",
		"kum": "kumir",
		"tex": "latex",
		"context": "latex",
		"ly": "lilypond",
		"emacs": "lisp",
		"elisp": "lisp",
		"emacs-lisp": "lisp",
		"md": "markdown",
		"moon": "moonscript",
		"n4jsd": "n4js",
		"nani": "naniscript",
		"objc": "objectivec",
		"qasm": "openqasm",
		"objectpascal": "pascal",
		"px": "pcaxis",
		"pcode": "peoplecode",
		"plantuml": "plant-uml",
		"pq": "powerquery",
		"mscript": "powerquery",
		"pbfasm": "purebasic",
		"purs": "purescript",
		"py": "python",
		"qs": "qsharp",
		"rkt": "racket",
		"razor": "cshtml",
		"rpy": "renpy",
		"res": "rescript",
		"robot": "robotframework",
		"rb": "ruby",
		"sh-session": "shell-session",
		"shellsession": "shell-session",
		"smlnj": "sml",
		"sol": "solidity",
		"sln": "solution-file",
		"rq": "sparql",
		"sclang": "supercollider",
		"t4": "t4-cs",
		"trickle": "tremor",
		"troy": "tremor",
		"trig": "turtle",
		"ts": "typescript",
		"tsconfig": "typoscript",
		"uscript": "unrealscript",
		"uc": "unrealscript",
		"url": "uri",
		"vb": "visual-basic",
		"vba": "visual-basic",
		"webidl": "web-idl",
		"mathematica": "wolfram",
		"nb": "wolfram",
		"wl": "wolfram",
		"xeoracube": "xeora",
		"yml": "yaml"
	}/*]*/;

	/* eslint-enable */

	/**
	 * @typedef LangDataItem
	 * @property {{ success?: () => void, error?: () => void }[]} callbacks
	 * @property {boolean} [error]
	 * @property {boolean} [loading]
	 */
	/** @type {Object<string, LangDataItem>} */
	var lang_data = {};

	var ignored_language = 'none';
	var languages_path = 'components/';

	var script = Prism.util.currentScript();
	if (script) {
		var autoloaderFile = /\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i;
		var prismFile = /(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i;

		var autoloaderPath = script.getAttribute('data-autoloader-path');
		if (autoloaderPath != null) {
			// data-autoloader-path is set, so just use it
			languages_path = autoloaderPath.trim().replace(/\/?$/, '/');
		} else {
			var src = script.src;
			if (autoloaderFile.test(src)) {
				// the script is the original autoloader script in the usual Prism project structure
				languages_path = src.replace(autoloaderFile, 'components/');
			} else if (prismFile.test(src)) {
				// the script is part of a bundle like a custom prism.js from the download page
				languages_path = src.replace(prismFile, '$1components/');
			}
		}
	}

	var config = Prism.plugins.autoloader = {
		languages_path: languages_path,
		use_minified: true,
		loadLanguages: loadLanguages
	};


	/**
	 * Lazily loads an external script.
	 *
	 * @param {string} src
	 * @param {() => void} [success]
	 * @param {() => void} [error]
	 */
	function addScript(src, success, error) {
		var s = document.createElement('script');
		s.src = src;
		s.async = true;
		s.onload = function () {
			document.body.removeChild(s);
			success && success();
		};
		s.onerror = function () {
			document.body.removeChild(s);
			error && error();
		};
		document.body.appendChild(s);
	}

	/**
	 * Returns all additional dependencies of the given element defined by the `data-dependencies` attribute.
	 *
	 * @param {Element} element
	 * @returns {string[]}
	 */
	function getDependencies(element) {
		var deps = (element.getAttribute('data-dependencies') || '').trim();
		if (!deps) {
			var parent = element.parentElement;
			if (parent && parent.tagName.toLowerCase() === 'pre') {
				deps = (parent.getAttribute('data-dependencies') || '').trim();
			}
		}
		return deps ? deps.split(/\s*,\s*/g) : [];
	}

	/**
	 * Returns whether the given language is currently loaded.
	 *
	 * @param {string} lang
	 * @returns {boolean}
	 */
	function isLoaded(lang) {
		if (lang.indexOf('!') >= 0) {
			// forced reload
			return false;
		}

		lang = lang_aliases[lang] || lang; // resolve alias

		if (lang in Prism.languages) {
			// the given language is already loaded
			return true;
		}

		// this will catch extensions like CSS extras that don't add a grammar to Prism.languages
		var data = lang_data[lang];
		return data && !data.error && data.loading === false;
	}

	/**
	 * Returns the path to a grammar, using the language_path and use_minified config keys.
	 *
	 * @param {string} lang
	 * @returns {string}
	 */
	function getLanguagePath(lang) {
		return config.languages_path + 'prism-' + lang + (config.use_minified ? '.min' : '') + '.js';
	}

	/**
	 * Loads all given grammars concurrently.
	 *
	 * @param {string[]|string} languages
	 * @param {(languages: string[]) => void} [success]
	 * @param {(language: string) => void} [error] This callback will be invoked on the first language to fail.
	 */
	function loadLanguages(languages, success, error) {
		if (typeof languages === 'string') {
			languages = [languages];
		}

		var total = languages.length;
		var completed = 0;
		var failed = false;

		if (total === 0) {
			if (success) {
				setTimeout(success, 0);
			}
			return;
		}

		function successCallback() {
			if (failed) {
				return;
			}
			completed++;
			if (completed === total) {
				success && success(languages);
			}
		}

		languages.forEach(function (lang) {
			loadLanguage(lang, successCallback, function () {
				if (failed) {
					return;
				}
				failed = true;
				error && error(lang);
			});
		});
	}

	/**
	 * Loads a grammar with its dependencies.
	 *
	 * @param {string} lang
	 * @param {() => void} [success]
	 * @param {() => void} [error]
	 */
	function loadLanguage(lang, success, error) {
		var force = lang.indexOf('!') >= 0;

		lang = lang.replace('!', '');
		lang = lang_aliases[lang] || lang;

		function load() {
			var data = lang_data[lang];
			if (!data) {
				data = lang_data[lang] = {
					callbacks: []
				};
			}
			data.callbacks.push({
				success: success,
				error: error
			});

			if (!force && isLoaded(lang)) {
				// the language is already loaded and we aren't forced to reload
				languageCallback(lang, 'success');
			} else if (!force && data.error) {
				// the language failed to load before and we don't reload
				languageCallback(lang, 'error');
			} else if (force || !data.loading) {
				// the language isn't currently loading and/or we are forced to reload
				data.loading = true;
				data.error = false;

				addScript(getLanguagePath(lang), function () {
					data.loading = false;
					languageCallback(lang, 'success');

				}, function () {
					data.loading = false;
					data.error = true;
					languageCallback(lang, 'error');
				});
			}
		}

		var dependencies = lang_dependencies[lang];
		if (dependencies && dependencies.length) {
			loadLanguages(dependencies, load, error);
		} else {
			load();
		}
	}

	/**
	 * Runs all callbacks of the given type for the given language.
	 *
	 * @param {string} lang
	 * @param {"success" | "error"} type
	 */
	function languageCallback(lang, type) {
		if (lang_data[lang]) {
			var callbacks = lang_data[lang].callbacks;
			for (var i = 0, l = callbacks.length; i < l; i++) {
				var callback = callbacks[i][type];
				if (callback) {
					setTimeout(callback, 0);
				}
			}
			callbacks.length = 0;
		}
	}

	Prism.hooks.add('complete', function (env) {
		var element = env.element;
		var language = env.language;
		if (!element || !language || language === ignored_language) {
			return;
		}

		var deps = getDependencies(element);
		if (/^diff-./i.test(language)) {
			// the "diff-xxxx" format is used by the Diff Highlight plugin
			deps.push('diff');
			deps.push(language.substr('diff-'.length));
		} else {
			deps.push(language);
		}

		if (!deps.every(isLoaded)) {
			// the language or some dependencies aren't loaded
			loadLanguages(deps, function () {
				Prism.highlightElement(element);
			});
		}
	});

}());
jxt!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e={javascript:"clike",actionscript:"javascript",apex:["clike","sql"],arduino:"cpp",aspnet:["markup","csharp"],birb:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",cfscript:"clike",chaiscript:["clike","cpp"],cilkc:"c",cilkcpp:"cpp",coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup-templating",ejs:["javascript","markup-templating"],etlua:["lua","markup-templating"],erb:["ruby","markup-templating"],fsharp:"clike","firestore-security-rules":"clike",flow:"javascript",ftl:"markup-templating",gml:"clike",glsl:"c",go:"clike",gradle:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",hlsl:"c",idris:"haskell",java:"clike",javadoc:["markup","java","javadoclike"],jolie:"clike",jsdoc:["javascript","javadoclike","typescript"],"js-extras":"javascript",json5:"json",jsonp:"json","js-templates":"javascript",kotlin:"clike",latte:["clike","markup-templating","php"],less:"css",lilypond:"scheme",liquid:"markup-templating",markdown:"markup","markup-templating":"markup",mongodb:"javascript",n4js:"javascript",objectivec:"c",opencl:"c",parser:"markup",php:"markup-templating",phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","javascript"],purebasic:"clike",purescript:"haskell",qsharp:"clike",qml:"javascript",qore:"clike",racket:"scheme",cshtml:["markup","csharp"],jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java","shell-session":"bash",smarty:"markup-templating",solidity:"clike",soy:"markup-templating",sparql:"turtle",sqf:"clike",squirrel:"clike",stata:["mata","java","python"],"t4-cs":["t4-templating","csharp"],"t4-vb":["t4-templating","vbnet"],tap:"yaml",tt2:["clike","markup-templating"],textile:"markup",twig:"markup-templating",typescript:"javascript",v:"clike",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup","xml-doc":"markup",xquery:"markup"},a={html:"markup",xml:"markup",svg:"markup",mathml:"markup",ssml:"markup",atom:"markup",rss:"markup",js:"javascript",g4:"antlr4",ino:"arduino","arm-asm":"armasm",art:"arturo",adoc:"asciidoc",avs:"avisynth",avdl:"avro-idl",gawk:"awk",sh:"bash",shell:"bash",shortcode:"bbcode",rbnf:"bnf",oscript:"bsl",cs:"csharp",dotnet:"csharp",cfc:"cfscript","cilk-c":"cilkc","cilk-cpp":"cilkcpp",cilk:"cilkcpp",coffee:"coffeescript",conc:"concurnas",jinja2:"django","dns-zone":"dns-zone-file",dockerfile:"docker",gv:"dot",eta:"ejs",xlsx:"excel-formula",xls:"excel-formula",gamemakerlanguage:"gml",po:"gettext",gni:"gn",ld:"linker-script","go-mod":"go-module",hbs:"handlebars",mustache:"handlebars",hs:"haskell",idr:"idris",gitignore:"ignore",hgignore:"ignore",npmignore:"ignore",webmanifest:"json",kt:"kotlin",kts:"kotlin",kum:"kumir",tex:"latex",context:"latex",ly:"lilypond",emacs:"lisp",elisp:"lisp","emacs-lisp":"lisp",md:"markdown",moon:"moonscript",n4jsd:"n4js",nani:"naniscript",objc:"objectivec",qasm:"openqasm",objectpascal:"pascal",px:"pcaxis",pcode:"peoplecode",plantuml:"plant-uml",pq:"powerquery",mscript:"powerquery",pbfasm:"purebasic",purs:"purescript",py:"python",qs:"qsharp",rkt:"racket",razor:"cshtml",rpy:"renpy",res:"rescript",robot:"robotframework",rb:"ruby","sh-session":"shell-session",shellsession:"shell-session",smlnj:"sml",sol:"solidity",sln:"solution-file",rq:"sparql",sclang:"supercollider",t4:"t4-cs",trickle:"tremor",troy:"tremor",trig:"turtle",ts:"typescript",tsconfig:"typoscript",uscript:"unrealscript",uc:"unrealscript",url:"uri",vb:"visual-basic",vba:"visual-basic",webidl:"web-idl",mathematica:"wolfram",nb:"wolfram",wl:"wolfram",xeoracube:"xeora",yml:"yaml"},r={},s="components/",i=Prism.util.currentScript();if(i){var t=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,c=/(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,l=i.getAttribute("data-autoloader-path");if(null!=l)s=l.trim().replace(/\/?$/,"/");else{var p=i.src;t.test(p)?s=p.replace(t,"components/"):c.test(p)&&(s=p.replace(c,"$1components/"))}}var n=Prism.plugins.autoloader={languages_path:s,use_minified:!0,loadLanguages:m};Prism.hooks.add("complete",(function(e){var a=e.element,r=e.language;if(a&&r&&"none"!==r){var s=function(e){var a=(e.getAttribute("data-dependencies")||"").trim();if(!a){var r=e.parentElement;r&&"pre"===r.tagName.toLowerCase()&&(a=(r.getAttribute("data-dependencies")||"").trim())}return a?a.split(/\s*,\s*/g):[]}(a);/^diff-./i.test(r)?(s.push("diff"),s.push(r.substr("diff-".length))):s.push(r),s.every(o)||m(s,(function(){Prism.highlightElement(a)}))}}))}function o(e){if(e.indexOf("!")>=0)return!1;if((e=a[e]||e)in Prism.languages)return!0;var s=r[e];return s&&!s.error&&!1===s.loading}function m(s,i,t){"string"==typeof s&&(s=[s]);var c=s.length,l=0,p=!1;function k(){p||++l===c&&i&&i(s)}0!==c?s.forEach((function(s){!function(s,i,t){var c=s.indexOf("!")>=0;function l(){var e=r[s];e||(e=r[s]={callbacks:[]}),e.callbacks.push({success:i,error:t}),!c&&o(s)?u(s,"success"):!c&&e.error?u(s,"error"):!c&&e.loading||(e.loading=!0,e.error=!1,function(e,a,r){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),a&&a()},s.onerror=function(){document.body.removeChild(s),r&&r()},document.body.appendChild(s)}(function(e){return n.languages_path+"prism-"+e+(n.use_minified?".min":"")+".js"}(s),(function(){e.loading=!1,u(s,"success")}),(function(){e.loading=!1,e.error=!0,u(s,"error")})))}s=s.replace("!","");var p=e[s=a[s]||s];p&&p.length?m(p,l,t):l()}(s,k,(function(){p||(p=!0,t&&t(s))}))})):i&&setTimeout(i,0)}function u(e,a){if(r[e]){for(var s=r[e].callbacks,i=0,t=s.length;i<t;i++){var c=s[i][a];c&&setTimeout(c,0)}s.length=0}}}();;F;xJ.command-line-prompt {
	border-right: 1px solid #999;
	display: block;
	float: left;
	font-size: 100%;
	letter-spacing: -1px;
	margin-right: 1em;
	pointer-events: none;
	text-align: right;

	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}

.command-line-prompt > span:before {
	opacity: 0.7;
	content: ' ';
	display: block;
	padding-right: 0.8em;
}

.command-line-prompt > span[data-user]:before {
	content: "[" attr(data-user) "@" attr(data-host) "] $";
}

.command-line-prompt > span[data-user="root"]:before {
	content: "[" attr(data-user) "@" attr(data-host) "] #";
}

.command-line-prompt > span[data-prompt]:before {
	content: attr(data-prompt);
}

.command-line-prompt > span[data-continuation-prompt]:before {
	content: attr(data-continuation-prompt);
}

.command-line span.token.output {
	/* Make shell output lines a bit lighter to distinguish them from shell commands */
	opacity: 0.7;
}
 >x(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	var CLASS_PATTERN = /(?:^|\s)command-line(?:\s|$)/;
	var PROMPT_CLASS = 'command-line-prompt';

	/** @type {(str: string, prefix: string) => boolean} */
	var startsWith = ''.startsWith
		? function (s, p) { return s.startsWith(p); }
		: function (s, p) { return s.indexOf(p) === 0; };

	// Support for IE11 that has no endsWith()
	/** @type {(str: string, suffix: string) => boolean} */
	var endsWith = ''.endsWith
		? function (str, suffix) {
			return str.endsWith(suffix);
		}
		: function (str, suffix) {
			var len = str.length;
			return str.substring(len - suffix.length, len) === suffix;
		};

	/**
	 * Returns whether the given hook environment has a command line info object.
	 *
	 * @param {any} env
	 * @returns {boolean}
	 */
	function hasCommandLineInfo(env) {
		var vars = env.vars = env.vars || {};
		return 'command-line' in vars;
	}
	/**
	 * Returns the command line info object from the given hook environment.
	 *
	 * @param {any} env
	 * @returns {CommandLineInfo}
	 *
	 * @typedef CommandLineInfo
	 * @property {boolean} [complete]
	 * @property {number} [numberOfLines]
	 * @property {string[]} [outputLines]
	 */
	function getCommandLineInfo(env) {
		var vars = env.vars = env.vars || {};
		return vars['command-line'] = vars['command-line'] || {};
	}


	Prism.hooks.add('before-highlight', function (env) {
		var commandLine = getCommandLineInfo(env);

		if (commandLine.complete || !env.code) {
			commandLine.complete = true;
			return;
		}

		// Works only for <code> wrapped inside <pre> (not inline).
		var pre = env.element.parentElement;
		if (!pre || !/pre/i.test(pre.nodeName) || // Abort only if neither the <pre> nor the <code> have the class
			(!CLASS_PATTERN.test(pre.className) && !CLASS_PATTERN.test(env.element.className))) {
			commandLine.complete = true;
			return;
		}

		// The element might be highlighted multiple times, so we just remove the previous prompt
		var existingPrompt = env.element.querySelector('.' + PROMPT_CLASS);
		if (existingPrompt) {
			existingPrompt.remove();
		}

		var codeLines = env.code.split('\n');

		commandLine.numberOfLines = codeLines.length;
		/** @type {string[]} */
		var outputLines = commandLine.outputLines = [];

		var outputSections = pre.getAttribute('data-output');
		var outputFilter = pre.getAttribute('data-filter-output');
		if (outputSections !== null) { // The user specified the output lines. -- cwells
			outputSections.split(',').forEach(function (section) {
				var range = section.split('-');
				var outputStart = parseInt(range[0], 10);
				var outputEnd = range.length === 2 ? parseInt(range[1], 10) : outputStart;

				if (!isNaN(outputStart) && !isNaN(outputEnd)) {
					if (outputStart < 1) {
						outputStart = 1;
					}
					if (outputEnd > codeLines.length) {
						outputEnd = codeLines.length;
					}
					// Convert start and end to 0-based to simplify the arrays. -- cwells
					outputStart--;
					outputEnd--;
					// Save the output line in an array and clear it in the code so it's not highlighted. -- cwells
					for (var j = outputStart; j <= outputEnd; j++) {
						outputLines[j] = codeLines[j];
						codeLines[j] = '';
					}
				}
			});
		} else if (outputFilter) { // Treat lines beginning with this string as output. -- cwells
			for (var i = 0; i < codeLines.length; i++) {
				if (startsWith(codeLines[i], outputFilter)) { // This line is output. -- cwells
					outputLines[i] = codeLines[i].slice(outputFilter.length);
					codeLines[i] = '';
				}
			}
		}

		var continuationLineIndicies = commandLine.continuationLineIndicies = new Set();
		var lineContinuationStr = pre.getAttribute('data-continuation-str');
		var continuationFilter = pre.getAttribute('data-filter-continuation');

		// Identify code lines where the command has continued onto subsequent
		// lines and thus need a different prompt. Need to do this after the output
		// lines have been removed to ensure we don't pick up a continuation string
		// in an output line.
		for (var j = 0; j < codeLines.length; j++) {
			var line = codeLines[j];
			if (!line) {
				continue;
			}

			// Record the next line as a continuation if this one ends in a continuation str.
			if (lineContinuationStr && endsWith(line, lineContinuationStr)) {
				continuationLineIndicies.add(j + 1);
			}
			// Record this line as a continuation if marked with a continuation prefix
			// (that we will remove).
			if (j > 0 && continuationFilter && startsWith(line, continuationFilter)) {
				codeLines[j] = line.slice(continuationFilter.length);
				continuationLineIndicies.add(j);
			}
		}

		env.code = codeLines.join('\n');
	});

	Prism.hooks.add('before-insert', function (env) {
		var commandLine = getCommandLineInfo(env);

		if (commandLine.complete) {
			return;
		}

		// Reinsert the output lines into the highlighted code. -- cwells
		var codeLines = env.highlightedCode.split('\n');
		var outputLines = commandLine.outputLines || [];
		for (var i = 0, l = codeLines.length; i < l; i++) {
			// Add spans to allow distinction of input/output text for styling
			if (outputLines.hasOwnProperty(i)) {
				// outputLines were removed from codeLines so missed out on escaping
				// of markup so do it here.
				codeLines[i] = '<span class="token output">'
					+ Prism.util.encode(outputLines[i]) + '</span>';
			} else {
				codeLines[i] = '<span class="token command">'
					+ codeLines[i] + '</span>';
			}
		}
		env.highlightedCode = codeLines.join('\n');
	});

	Prism.hooks.add('complete', function (env) {
		if (!hasCommandLineInfo(env)) {
			// the previous hooks never ran
			return;
		}

		var commandLine = getCommandLineInfo(env);

		if (commandLine.complete) {
			return;
		}

		var pre = env.element.parentElement;
		if (CLASS_PATTERN.test(env.element.className)) { // Remove the class "command-line" from the <code>
			env.element.className = env.element.className.replace(CLASS_PATTERN, ' ');
		}
		if (!CLASS_PATTERN.test(pre.className)) { // Add the class "command-line" to the <pre>
			pre.className += ' command-line';
		}

		function getAttribute(key, defaultValue) {
			return (pre.getAttribute(key) || defaultValue).replace(/"/g, '&quot');
		}

		// Create the "rows" that will become the command-line prompts. -- cwells
		var promptLines = '';
		var rowCount = commandLine.numberOfLines || 0;
		var promptText = getAttribute('data-prompt', '');
		var promptLine;
		if (promptText !== '') {
			promptLine = '<span data-prompt="' + promptText + '"></span>';
		} else {
			var user = getAttribute('data-user', 'user');
			var host = getAttribute('data-host', 'localhost');
			promptLine = '<span data-user="' + user + '" data-host="' + host + '"></span>';
		}

		var continuationLineIndicies = commandLine.continuationLineIndicies || new Set();
		var continuationPromptText = getAttribute('data-continuation-prompt', '>');
		var continuationPromptLine = '<span data-continuation-prompt="' + continuationPromptText + '"></span>';

		// Assemble all the appropriate prompt/continuation lines
		for (var j = 0; j < rowCount; j++) {
			if (continuationLineIndicies.has(j)) {
				promptLines += continuationPromptLine;
			} else {
				promptLines += promptLine;
			}
		}

		// Create the wrapper element. -- cwells
		var prompt = document.createElement('span');
		prompt.className = PROMPT_CLASS;
		prompt.innerHTML = promptLines;

		// Remove the prompt from the output lines. -- cwells
		var outputLines = commandLine.outputLines || [];
		for (var i = 0, l = outputLines.length; i < l; i++) {
			if (outputLines.hasOwnProperty(i)) {
				var node = prompt.children[i];
				node.removeAttribute('data-user');
				node.removeAttribute('data-host');
				node.removeAttribute('data-prompt');
			}
		}

		env.element.insertBefore(prompt, env.element.firstChild);
		commandLine.complete = true;
	});

}());
n.x.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.command-line-prompt>span:before{opacity:.7;content:' ';display:block;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7}x
!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e=/(?:^|\s)command-line(?:\s|$)/,t="command-line-prompt",n="".startsWith?function(e,t){return e.startsWith(t)}:function(e,t){return 0===e.indexOf(t)},a="".endsWith?function(e,t){return e.endsWith(t)}:function(e,t){var n=e.length;return e.substring(n-t.length,n)===t};Prism.hooks.add("before-highlight",(function(i){var o=r(i);if(!o.complete&&i.code){var s=i.element.parentElement;if(s&&/pre/i.test(s.nodeName)&&(e.test(s.className)||e.test(i.element.className))){var l=i.element.querySelector("."+t);l&&l.remove();var m=i.code.split("\n");o.numberOfLines=m.length;var u=o.outputLines=[],c=s.getAttribute("data-output"),d=s.getAttribute("data-filter-output");if(null!==c)c.split(",").forEach((function(e){var t=e.split("-"),n=parseInt(t[0],10),a=2===t.length?parseInt(t[1],10):n;if(!isNaN(n)&&!isNaN(a)){n<1&&(n=1),a>m.length&&(a=m.length),a--;for(var r=--n;r<=a;r++)u[r]=m[r],m[r]=""}}));else if(d)for(var p=0;p<m.length;p++)n(m[p],d)&&(u[p]=m[p].slice(d.length),m[p]="");for(var f=o.continuationLineIndicies=new Set,h=s.getAttribute("data-continuation-str"),v=s.getAttribute("data-filter-continuation"),g=0;g<m.length;g++){var b=m[g];b&&(h&&a(b,h)&&f.add(g+1),g>0&&v&&n(b,v)&&(m[g]=b.slice(v.length),f.add(g)))}i.code=m.join("\n")}else o.complete=!0}else o.complete=!0})),Prism.hooks.add("before-insert",(function(e){var t=r(e);if(!t.complete){for(var n=e.highlightedCode.split("\n"),a=t.outputLines||[],i=0,o=n.length;i<o;i++)a.hasOwnProperty(i)?n[i]='<span class="token output">'+Prism.util.encode(a[i])+"</span>":n[i]='<span class="token command">'+n[i]+"</span>";e.highlightedCode=n.join("\n")}})),Prism.hooks.add("complete",(function(n){if(function(e){return"command-line"in(e.vars=e.vars||{})}(n)){var a=r(n);if(!a.complete){var i=n.element.parentElement;e.test(n.element.className)&&(n.element.className=n.element.className.replace(e," ")),e.test(i.className)||(i.className+=" command-line");var o,s="",l=a.numberOfLines||0,m=b("data-prompt","");o=""!==m?'<span data-prompt="'+m+'"></span>':'<span data-user="'+b("data-user","user")+'" data-host="'+b("data-host","localhost")+'"></span>';for(var u=a.continuationLineIndicies||new Set,c='<span data-continuation-prompt="'+b("data-continuation-prompt",">")+'"></span>',d=0;d<l;d++)u.has(d)?s+=c:s+=o;var p=document.createElement("span");p.className=t,p.innerHTML=s;for(var f=a.outputLines||[],h=0,v=f.length;h<v;h++)if(f.hasOwnProperty(h)){var g=p.children[h];g.removeAttribute("data-user"),g.removeAttribute("data-host"),g.removeAttribute("data-prompt")}n.element.insertBefore(p,n.element.firstChild),a.complete=!0}}function b(e,t){return(i.getAttribute(e)||t).replace(/"/g,"&quot")}}))}function r(e){var t=e.vars=e.vars||{};return t["command-line"]=t["command-line"]||{}}}();xX(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	if (!Prism.plugins.toolbar) {
		console.warn('Copy to Clipboard plugin loaded before Toolbar plugin.');

		return;
	}

	/**
	 * When the given elements is clicked by the user, the given text will be copied to clipboard.
	 *
	 * @param {HTMLElement} element
	 * @param {CopyInfo} copyInfo
	 *
	 * @typedef CopyInfo
	 * @property {() => string} getText
	 * @property {() => void} success
	 * @property {(reason: unknown) => void} error
	 */
	function registerClipboard(element, copyInfo) {
		element.addEventListener('click', function () {
			copyTextToClipboard(copyInfo);
		});
	}

	// https://stackoverflow.com/a/30810322/7595472

	/** @param {CopyInfo} copyInfo */
	function fallbackCopyTextToClipboard(copyInfo) {
		var textArea = document.createElement('textarea');
		textArea.value = copyInfo.getText();

		// Avoid scrolling to bottom
		textArea.style.top = '0';
		textArea.style.left = '0';
		textArea.style.position = 'fixed';

		document.body.appendChild(textArea);
		textArea.focus();
		textArea.select();

		try {
			var successful = document.execCommand('copy');
			setTimeout(function () {
				if (successful) {
					copyInfo.success();
				} else {
					copyInfo.error();
				}
			}, 1);
		} catch (err) {
			setTimeout(function () {
				copyInfo.error(err);
			}, 1);
		}

		document.body.removeChild(textArea);
	}
	/** @param {CopyInfo} copyInfo */
	function copyTextToClipboard(copyInfo) {
		if (navigator.clipboard) {
			navigator.clipboard.writeText(copyInfo.getText()).then(copyInfo.success, function () {
				// try the fallback in case `writeText` didn't work
				fallbackCopyTextToClipboard(copyInfo);
			});
		} else {
			fallbackCopyTextToClipboard(copyInfo);
		}
	}

	/**
	 * Selects the text content of the given element.
	 *
	 * @param {Element} element
	 */
	function selectElementText(element) {
		// https://stackoverflow.com/a/20079910/7595472
		window.getSelection().selectAllChildren(element);
	}

	/**
	 * Traverses up the DOM tree to find data attributes that override the default plugin settings.
	 *
	 * @param {Element} startElement An element to start from.
	 * @returns {Settings} The plugin settings.
	 * @typedef {Record<"copy" | "copy-error" | "copy-success" | "copy-timeout", string | number>} Settings
	 */
	function getSettings(startElement) {
		/** @type {Settings} */
		var settings = {
			'copy': 'Copy',
			'copy-error': 'Press Ctrl+C to copy',
			'copy-success': 'Copied!',
			'copy-timeout': 5000
		};

		var prefix = 'data-prismjs-';
		for (var key in settings) {
			var attr = prefix + key;
			var element = startElement;
			while (element && !element.hasAttribute(attr)) {
				element = element.parentElement;
			}
			if (element) {
				settings[key] = element.getAttribute(attr);
			}
		}
		return settings;
	}

	Prism.plugins.toolbar.registerButton('copy-to-clipboard', function (env) {
		var element = env.element;

		var settings = getSettings(element);

		var linkCopy = document.createElement('button');
		linkCopy.className = 'copy-to-clipboard-button';
		linkCopy.setAttribute('type', 'button');
		var linkSpan = document.createElement('span');
		linkCopy.appendChild(linkSpan);

		setState('copy');

		registerClipboard(linkCopy, {
			getText: function () {
				return element.textContent;
			},
			success: function () {
				setState('copy-success');

				resetText();
			},
			error: function () {
				setState('copy-error');

				setTimeout(function () {
					selectElementText(element);
				}, 1);

				resetText();
			}
		});

		return linkCopy;

		function resetText() {
			setTimeout(function () { setState('copy'); }, settings['copy-timeout']);
		}

		/** @param {"copy" | "copy-error" | "copy-success"} state */
		function setState(state) {
			linkSpan.textContent = settings[state];
			linkCopy.setAttribute('data-copy-state', state);
		}
	});
}());
B꒶ax!function(){function t(t){var e=document.createElement("textarea");e.value=t.getText(),e.style.top="0",e.style.left="0",e.style.position="fixed",document.body.appendChild(e),e.focus(),e.select();try{var o=document.execCommand("copy");setTimeout((function(){o?t.success():t.error()}),1)}catch(e){setTimeout((function(){t.error(e)}),1)}document.body.removeChild(e)}"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Prism.plugins.toolbar?Prism.plugins.toolbar.registerButton("copy-to-clipboard",(function(e){var o=e.element,n=function(t){var e={copy:"Copy","copy-error":"Press Ctrl+C to copy","copy-success":"Copied!","copy-timeout":5e3};for(var o in e){for(var n="data-prismjs-"+o,c=t;c&&!c.hasAttribute(n);)c=c.parentElement;c&&(e[o]=c.getAttribute(n))}return e}(o),c=document.createElement("button");c.className="copy-to-clipboard-button",c.setAttribute("type","button");var r=document.createElement("span");return c.appendChild(r),u("copy"),function(e,o){e.addEventListener("click",(function(){!function(e){navigator.clipboard?navigator.clipboard.writeText(e.getText()).then(e.success,(function(){t(e)})):t(e)}(o)}))}(c,{getText:function(){return o.textContent},success:function(){u("copy-success"),i()},error:function(){u("copy-error"),setTimeout((function(){!function(t){window.getSelection().selectAllChildren(t)}(o)}),1),i()}}),c;function i(){setTimeout((function(){u("copy")}),n["copy-timeout"])}function u(t){r.textContent=n[t],c.setAttribute("data-copy-state",t)}})):console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."))}();j,x	(function () {

	if (typeof Prism === 'undefined') {
		return;
	}

	/**
	 * @callback ClassMapper
	 * @param {string} className
	 * @param {string} language
	 * @returns {string}
	 *
	 * @callback ClassAdder
	 * @param {ClassAdderEnvironment} env
	 * @returns {undefined | string | string[]}
	 *
	 * @typedef ClassAdderEnvironment
	 * @property {string} language
	 * @property {string} type
	 * @property {string} content
	 */

	// options

	/** @type {ClassAdder | undefined} */
	var adder;
	/** @type {ClassMapper | undefined} */
	var mapper;
	/** @type {string} */
	var prefixString = '';


	/**
	 * @param {string} className
	 * @param {string} language
	 */
	function apply(className, language) {
		return prefixString + (mapper ? mapper(className, language) : className);
	}


	Prism.plugins.customClass = {
		/**
		 * Sets the function which can be used to add custom aliases to any token.
		 *
		 * @param {ClassAdder} classAdder
		 */
		add: function (classAdder) {
			adder = classAdder;
		},
		/**
		 * Maps all class names using the given object or map function.
		 *
		 * This does not affect the prefix.
		 *
		 * @param {Object<string, string> | ClassMapper} classMapper
		 */
		map: function map(classMapper) {
			if (typeof classMapper === 'function') {
				mapper = classMapper;
			} else {
				mapper = function (className) {
					return classMapper[className] || className;
				};
			}
		},
		/**
		 * Adds the given prefix to all class names.
		 *
		 * @param {string} string
		 */
		prefix: function prefix(string) {
			prefixString = string || '';
		},
		/**
		 * Applies the current mapping and prefix to the given class name.
		 *
		 * @param {string} className A single class name.
		 * @param {string} language The language of the code that contains this class name.
		 *
		 * If the language is unknown, pass `"none"`.
		 */
		apply: apply
	};

	Prism.hooks.add('wrap', function (env) {
		if (adder) {
			var result = adder({
				content: env.content,
				type: env.type,
				language: env.language
			});

			if (Array.isArray(result)) {
				env.classes.push.apply(env.classes, result);
			} else if (result) {
				env.classes.push(result);
			}
		}

		if (!mapper && !prefixString) {
			return;
		}

		env.classes = env.classes.map(function (c) {
			return apply(c, env.language);
		});
	});

}());
JIx!function(){if("undefined"!=typeof Prism){var n,s,a="";Prism.plugins.customClass={add:function(s){n=s},map:function(n){s="function"==typeof n?n:function(s){return n[s]||s}},prefix:function(n){a=n||""},apply:t},Prism.hooks.add("wrap",(function(e){if(n){var u=n({content:e.content,type:e.type,language:e.language});Array.isArray(u)?e.classes.push.apply(e.classes,u):u&&e.classes.push(u)}(s||a)&&(e.classes=e.classes.map((function(n){return t(n,e.language)})))}))}function t(n,t){return a+(s?s(n,t):n)}}();4x<	(function () {

	if (typeof Prism === 'undefined') {
		return;
	}

	var autoLinkerProcess = function (grammar) {
		if (Prism.plugins.autolinker) {
			Prism.plugins.autolinker.processGrammar(grammar);
		}
		return grammar;
	};
	var dataURI = {
		pattern: /(.)\bdata:[^\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)/,
		lookbehind: true,
		inside: {
			'language-css': {
				pattern: /(data:[^\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/,
				lookbehind: true
			},
			'language-javascript': {
				pattern: /(data:[^\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/,
				lookbehind: true
			},
			'language-json': {
				pattern: /(data:[^\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/,
				lookbehind: true
			},
			'language-markup': {
				pattern: /(data:[^\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/,
				lookbehind: true
			}
		}
	};

	// Tokens that may contain URLs
	var candidates = ['url', 'attr-value', 'string'];

	Prism.plugins.dataURIHighlight = {
		processGrammar: function (grammar) {
			// Abort if grammar has already been processed
			if (!grammar || grammar['data-uri']) {
				return;
			}

			Prism.languages.DFS(grammar, function (key, def, type) {
				if (candidates.indexOf(type) > -1 && !Array.isArray(def)) {
					if (!def.pattern) {
						def = this[key] = {
							pattern: def
						};
					}

					def.inside = def.inside || {};

					if (type == 'attr-value') {
						Prism.languages.insertBefore('inside', def.inside['url-link'] ? 'url-link' : 'punctuation', {
							'data-uri': dataURI
						}, def);
					} else {
						if (def.inside['url-link']) {
							Prism.languages.insertBefore('inside', 'url-link', {
								'data-uri': dataURI
							}, def);
						} else {
							def.inside['data-uri'] = dataURI;
						}
					}
				}
			});
			grammar['data-uri'] = dataURI;
		}
	};

	Prism.hooks.add('before-highlight', function (env) {
		// Prepare the needed grammars for this code block
		if (dataURI.pattern.test(env.code)) {
			for (var p in dataURI.inside) {
				if (dataURI.inside.hasOwnProperty(p)) {
					if (!dataURI.inside[p].inside && dataURI.inside[p].pattern.test(env.code)) {
						var lang = p.match(/^language-(.+)/)[1];
						if (Prism.languages[lang]) {
							dataURI.inside[p].inside = {
								rest: autoLinkerProcess(Prism.languages[lang])
							};
						}
					}
				}
			}
		}

		Prism.plugins.dataURIHighlight.processGrammar(env.grammar);
	});
}());
NڵXxz!function(){if("undefined"!=typeof Prism){var i={pattern:/(.)\bdata:[^\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)/,lookbehind:!0,inside:{"language-css":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/,lookbehind:!0},"language-javascript":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/,lookbehind:!0},"language-json":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/,lookbehind:!0},"language-markup":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/,lookbehind:!0}}},a=["url","attr-value","string"];Prism.plugins.dataURIHighlight={processGrammar:function(n){n&&!n["data-uri"]&&(Prism.languages.DFS(n,(function(n,r,e){a.indexOf(e)>-1&&!Array.isArray(r)&&(r.pattern||(r=this[n]={pattern:r}),r.inside=r.inside||{},"attr-value"==e?Prism.languages.insertBefore("inside",r.inside["url-link"]?"url-link":"punctuation",{"data-uri":i},r):r.inside["url-link"]?Prism.languages.insertBefore("inside","url-link",{"data-uri":i},r):r.inside["data-uri"]=i)})),n["data-uri"]=i)}},Prism.hooks.add("before-highlight",(function(a){if(i.pattern.test(a.code))for(var n in i.inside)if(i.inside.hasOwnProperty(n)&&!i.inside[n].inside&&i.inside[n].pattern.test(a.code)){var r=n.match(/^language-(.+)/)[1];Prism.languages[r]&&(i.inside[n].inside={rest:(e=Prism.languages[r],Prism.plugins.autolinker&&Prism.plugins.autolinker.processGrammar(e),e)})}var e;Prism.plugins.dataURIHighlight.processGrammar(a.grammar)}))}}();Կx	@/**
 * prism.js Funky theme
 * Based on “Polyfilling the gaps” talk slides http://lea.verou.me/polyfilling-the-gaps/
 * @author Lea Verou
 */

code[class*="language-"],
pre[class*="language-"] {
	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
	font-size: 1em;
	text-align: left;
	white-space: pre;
	word-spacing: normal;
	word-break: normal;
	word-wrap: normal;
	line-height: 1.5;

	-moz-tab-size: 4;
	-o-tab-size: 4;
	tab-size: 4;

	-webkit-hyphens: none;
	-moz-hyphens: none;
	-ms-hyphens: none;
	hyphens: none;
}

/* Code blocks */
pre[class*="language-"] {
	padding: .4em .8em;
	margin: .5em 0;
	overflow: auto;
	background: url('data:image/svg+xml;charset=utf-8,<svg%20version%3D"1.1"%20xmlns%3D"http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg"%20width%3D"100"%20height%3D"100"%20fill%3D"rgba(0%2C0%2C0%2C.2)">%0D%0A<polygon%20points%3D"0%2C50%2050%2C0%200%2C0"%20%2F>%0D%0A<polygon%20points%3D"0%2C100%2050%2C100%20100%2C50%20100%2C0"%20%2F>%0D%0A<%2Fsvg>');
	background-size: 1em 1em;
}

code[class*="language-"] {
	background: black;
	color: white;
	box-shadow: -.3em 0 0 .3em black, .3em 0 0 .3em black;
}

/* Inline code */
:not(pre) > code[class*="language-"] {
	padding: .2em;
	border-radius: .3em;
	box-shadow: none;
	white-space: normal;
}

.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
	color: #aaa;
}

.token.punctuation {
	color: #999;
}

.token.namespace {
	opacity: .7;
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol {
	color: #0cf;
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin {
	color: yellow;
}

.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.token.variable,
.token.inserted {
	color: yellowgreen;
}

.token.atrule,
.token.attr-value,
.token.keyword {
	color: deeppink;
}

.token.regex,
.token.important {
	color: orange;
}

.token.important,
.token.bold {
	font-weight: bold;
}
.token.italic {
	font-style: italic;
}

.token.entity {
	cursor: help;
}

.token.deleted {
	color: red;
}

/* Plugin styles: Diff Highlight */
pre.diff-highlight.diff-highlight > code .token.deleted:not(.prefix),
pre > code.diff-highlight.diff-highlight .token.deleted:not(.prefix) {
	background-color: rgba(255, 0, 0, .3);
	display: inline;
}

pre.diff-highlight.diff-highlight > code .token.inserted:not(.prefix),
pre > code.diff-highlight.diff-highlight .token.inserted:not(.prefix) {
	background-color: rgba(0, 255, 128, .3);
	display: inline;
}
c%Mxr pre:MC$1);
	color: inherit;
	display: blockIi	la	F(1);
	color: inherit;
	display: block;
}
D$S'Nxp/**
 * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
 * Based on https://github.com/chriskempson/(tomorrow-theme
 * @author Rose Pritchard;color: #ccc;
	background: none;Y:1_&}
%background: #2d2d2diI1em;
	border-radius: .3em2block-@fOccc;
}

.token.tagZnamespace,
.token.deleted {
	color: #e2777a;
}

.token.function-name {
	color: #6196cc;
}
'function {
	color: #f08d49
class-name,f8c555(important,
.token.atrule,
.token.keyword=#cc99cd;
}
"$attr-value,.variable {
	color: #7ec699^/ {
	color: #67cdcc^	green;
}
ux6(function () {

	if (typeof Prism === 'undefined') {
		return;
	}


	var LANGUAGE_REGEX = /^diff-([\w-]+)/i;
	var HTML_TAG = /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g;
	//this will match a line plus the line break while ignoring the line breaks HTML tags may contain.
	var HTML_LINE = RegExp(/(?:__|[^\r\n<])*(?:\r\n?|\n|(?:__|[^\r\n<])(?![^\r\n]))/.source.replace(/__/g, function () { return HTML_TAG.source; }), 'gi');

	var warningLogged = false;

	Prism.hooks.add('before-sanity-check', function (env) {
		var lang = env.language;
		if (LANGUAGE_REGEX.test(lang) && !env.grammar) {
			env.grammar = Prism.languages[lang] = Prism.languages.diff;
		}
	});
	Prism.hooks.add('before-tokenize', function (env) {
		if (!warningLogged && !Prism.languages.diff && !Prism.plugins.autoloader) {
			warningLogged = true;
			console.warn("Prism's Diff Highlight plugin requires the Diff language definition (prism-diff.js)." +
				"Make sure the language definition is loaded or use Prism's Autoloader plugin.");
		}

		var lang = env.language;
		if (LANGUAGE_REGEX.test(lang) && !Prism.languages[lang]) {
			Prism.languages[lang] = Prism.languages.diff;
		}
	});

	Prism.hooks.add('wrap', function (env) {
		var diffLanguage; var diffGrammar;

		if (env.language !== 'diff') {
			var langMatch = LANGUAGE_REGEX.exec(env.language);
			if (!langMatch) {
				return; // not a language specific diff
			}

			diffLanguage = langMatch[1];
			diffGrammar = Prism.languages[diffLanguage];
		}

		var PREFIXES = Prism.languages.diff && Prism.languages.diff.PREFIXES;

		// one of the diff tokens without any nested tokens
		if (PREFIXES && env.type in PREFIXES) {
			/** @type {string} */
			var content = env.content.replace(HTML_TAG, ''); // remove all HTML tags

			/** @type {string} */
			var decoded = content.replace(/&lt;/g, '<').replace(/&amp;/g, '&');

			// remove any one-character prefix
			var code = decoded.replace(/(^|[\r\n])./g, '$1');

			// highlight, if possible
			var highlighted;
			if (diffGrammar) {
				highlighted = Prism.highlight(code, diffGrammar, diffLanguage);
			} else {
				highlighted = Prism.util.encode(code);
			}

			// get the HTML source of the prefix token
			var prefixToken = new Prism.Token('prefix', PREFIXES[env.type], [/\w+/.exec(env.type)[0]]);
			var prefix = Prism.Token.stringify(prefixToken, env.language);

			// add prefix
			var lines = []; var m;
			HTML_LINE.lastIndex = 0;
			while ((m = HTML_LINE.exec(highlighted))) {
				lines.push(prefix + m[0]);
			}
			if (/(?:^|[\r\n]).$/.test(decoded)) {
				// because both "+a\n+" and "+a\n" will map to "a\n" after the line prefixes are removed
				lines.push(prefix);
			}
			env.content = lines.join('');

			if (diffGrammar) {
				env.classes.push('language-' + diffLanguage);
			}
		}
	});

}());
4z|x9code[class*=language-],pre[class*=language-]{font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:.4em .8em;margin:.5em 0;overflow:auto;background:url('data:image/svg+xml;charset=utf-8,<svg%20version%3D"1.1"%20xmlns%3D"http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg"%20width%3D"100"%20height%3D"100"%20fill%3D"rgba(0%2C0%2C0%2C.2)">%0D%0A<polygon%20points%3D"0%2C50%2050%2C0%200%2C0"%20%2F>%0D%0A<polygon%20points%3D"0%2C100%2050%2C100%20100%2C50%20100%2C0"%20%2F>%0D%0A<%2Fsvg>');background-size:1em 1em}code[class*=language-]{background:#000;color:#fff;box-shadow:-.3em 0 0 .3em #000,.3em 0 0 .3em #000}:not(pre)>code[class*=language-]{padding:.2em;border-radius:.3em;box-shadow:none;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#aaa}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.number,.token.property,.token.symbol,.token.tag{color:#0cf}.token.attr-name,.token.builtin,.token.char,.token.selector,.token.string{color:#ff0}.language-css .token.string,.token.entity,.token.inserted,.token.operator,.token.url,.token.variable{color:#9acd32}.token.atrule,.token.attr-value,.token.keyword{color:#ff1493}.token.important,.token.regex{color:orange}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.deleted{color:red}pre.diff-highlight.diff-highlight>code .token.deleted:not(.prefix),pre>code.diff-highlight.diff-highlight .token.deleted:not(.prefix){background-color:rgba(255,0,0,.3);display:inline}pre.diff-highlight.diff-highlight>code .token.inserted:not(.prefix),pre>code.diff-highlight.diff-highlight .token.inserted:not(.prefix){background-color:rgba(0,255,128,.3);display:inline}[Sxg preN<"1);color:inherit;display:block}preI}71);color:inherit;display:block}8$%Ix\
-color:#ccc;background:0 0;-C1w`!background:#2d2d2d`+1em;border-radius:.3emblock-comment,@999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-nam\e{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-nameQw{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.to#ken.char,.token.regex,.token.stringM=7ec699}.token.entity,.token.operator,.token.url{color:#67cdccoinserted{color:green},[xO!function(){if("undefined"!=typeof Prism){var e=/^diff-([\w-]+)/i,i=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,a=RegExp("(?:__|[^\r\n<])*(?:\r\n?|\n|(?:__|[^\r\n<])(?![^\r\n]))".replace(/__/g,(function(){return i.source})),"gi"),s=!1;Prism.hooks.add("before-sanity-check",(function(i){var a=i.language;e.test(a)&&!i.grammar&&(i.grammar=Prism.languages[a]=Prism.languages.diff)})),Prism.hooks.add("before-tokenize",(function(i){s||Prism.languages.diff||Prism.plugins.autoloader||(s=!0,console.warn("Prism's Diff Highlight plugin requires the Diff language definition (prism-diff.js).Make sure the language definition is loaded or use Prism's Autoloader plugin."));var a=i.language;e.test(a)&&!Prism.languages[a]&&(Prism.languages[a]=Prism.languages.diff)})),Prism.hooks.add("wrap",(function(s){var r,n;if("diff"!==s.language){var g=e.exec(s.language);if(!g)return;r=g[1],n=Prism.languages[r]}var f=Prism.languages.diff&&Prism.languages.diff.PREFIXES;if(f&&s.type in f){var u,l=s.content.replace(i,"").replace(/&lt;/g,"<").replace(/&amp;/g,"&"),t=l.replace(/(^|[\r\n])./g,"$1");u=n?Prism.highlight(t,n,r):Prism.util.encode(t);var o,m=new Prism.Token("prefix",f[s.type],[/\w+/.exec(s.type)[0]]),d=Prism.Token.stringify(m,s.language),c=[];for(a.lastIndex=0;o=a.exec(u);)c.push(d+o[0]);/(?:^|[\r\n]).$/.test(l)&&c.push(d),s.content=c.join(""),n&&s.classes.push("language-"+r)}}))}}();%x](function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined' || !document.querySelector) {
		return;
	}

	Prism.plugins.toolbar.registerButton('download-file', function (env) {
		var pre = env.element.parentNode;
		if (!pre || !/pre/i.test(pre.nodeName) || !pre.hasAttribute('data-src') || !pre.hasAttribute('data-download-link')) {
			return;
		}
		var src = pre.getAttribute('data-src');
		var a = document.createElement('a');
		a.textContent = pre.getAttribute('data-download-link-label') || 'Download';
		a.setAttribute('download', '');
		a.href = src;
		return a;
	});

}());
W7x8"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector&&Prism.plugins.toolbar.registerButton("download-file",(function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-src")&&e.hasAttribute("data-download-link")){var n=e.getAttribute("data-src"),a=document.createElement("a");return a.textContent=e.getAttribute("data-download-link-label")||"Download",a.setAttribute("download",""),a.href=n,a}}));עx&(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill
	if (!Element.prototype.matches) {
		Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
	}

	var LOADING_MESSAGE = 'Loading…';
	var FAILURE_MESSAGE = function (status, message) {
		return '✖ Error ' + status + ' while fetching file: ' + message;
	};
	var FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty';

	var EXTENSIONS = {
		'js': 'javascript',
		'py': 'python',
		'rb': 'ruby',
		'ps1': 'powershell',
		'psm1': 'powershell',
		'sh': 'bash',
		'bat': 'batch',
		'h': 'c',
		'tex': 'latex'
	};

	var STATUS_ATTR = 'data-src-status';
	var STATUS_LOADING = 'loading';
	var STATUS_LOADED = 'loaded';
	var STATUS_FAILED = 'failed';

	var SELECTOR = 'pre[data-src]:not([' + STATUS_ATTR + '="' + STATUS_LOADED + '"])'
		+ ':not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])';

	/**
	 * Loads the given file.
	 *
	 * @param {string} src The URL or path of the source file to load.
	 * @param {(result: string) => void} success
	 * @param {(reason: string) => void} error
	 */
	function loadFile(src, success, error) {
		var xhr = new XMLHttpRequest();
		xhr.open('GET', src, true);
		xhr.onreadystatechange = function () {
			if (xhr.readyState == 4) {
				if (xhr.status < 400 && xhr.responseText) {
					success(xhr.responseText);
				} else {
					if (xhr.status >= 400) {
						error(FAILURE_MESSAGE(xhr.status, xhr.statusText));
					} else {
						error(FAILURE_EMPTY_MESSAGE);
					}
				}
			}
		};
		xhr.send(null);
	}

	/**
	 * Parses the given range.
	 *
	 * This returns a range with inclusive ends.
	 *
	 * @param {string | null | undefined} range
	 * @returns {[number, number | undefined] | undefined}
	 */
	function parseRange(range) {
		var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range || '');
		if (m) {
			var start = Number(m[1]);
			var comma = m[2];
			var end = m[3];

			if (!comma) {
				return [start, start];
			}
			if (!end) {
				return [start, undefined];
			}
			return [start, Number(end)];
		}
		return undefined;
	}

	Prism.hooks.add('before-highlightall', function (env) {
		env.selector += ', ' + SELECTOR;
	});

	Prism.hooks.add('before-sanity-check', function (env) {
		var pre = /** @type {HTMLPreElement} */ (env.element);
		if (pre.matches(SELECTOR)) {
			env.code = ''; // fast-path the whole thing and go to complete

			pre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading

			// add code element with loading message
			var code = pre.appendChild(document.createElement('CODE'));
			code.textContent = LOADING_MESSAGE;

			var src = pre.getAttribute('data-src');

			var language = env.language;
			if (language === 'none') {
				// the language might be 'none' because there is no language set;
				// in this case, we want to use the extension as the language
				var extension = (/\.(\w+)$/.exec(src) || [, 'none'])[1];
				language = EXTENSIONS[extension] || extension;
			}

			// set language classes
			Prism.util.setLanguage(code, language);
			Prism.util.setLanguage(pre, language);

			// preload the language
			var autoloader = Prism.plugins.autoloader;
			if (autoloader) {
				autoloader.loadLanguages(language);
			}

			// load file
			loadFile(
				src,
				function (text) {
					// mark as loaded
					pre.setAttribute(STATUS_ATTR, STATUS_LOADED);

					// handle data-range
					var range = parseRange(pre.getAttribute('data-range'));
					if (range) {
						var lines = text.split(/\r\n?|\n/g);

						// the range is one-based and inclusive on both ends
						var start = range[0];
						var end = range[1] == null ? lines.length : range[1];

						if (start < 0) { start += lines.length; }
						start = Math.max(0, Math.min(start - 1, lines.length));
						if (end < 0) { end += lines.length; }
						end = Math.max(0, Math.min(end, lines.length));

						text = lines.slice(start, end).join('\n');

						// add data-start for line numbers
						if (!pre.hasAttribute('data-start')) {
							pre.setAttribute('data-start', String(start + 1));
						}
					}

					// highlight code
					code.textContent = text;
					Prism.highlightElement(code);
				},
				function (error) {
					// mark as failed
					pre.setAttribute(STATUS_ATTR, STATUS_FAILED);

					code.textContent = error;
				}
			);
		}
	});

	Prism.plugins.fileHighlight = {
		/**
		 * Executes the File Highlight plugin for all matching `pre` elements under the given container.
		 *
		 * Note: Elements which are already loaded or currently loading will not be touched by this method.
		 *
		 * @param {ParentNode} [container=document]
		 */
		highlight: function highlight(container) {
			var elements = (container || document).querySelectorAll(SELECTOR);

			for (var i = 0, element; (element = elements[i++]);) {
				Prism.highlightElement(element);
			}
		}
	};

	var logged = false;
	/** @deprecated Use `Prism.plugins.fileHighlight.highlight` instead. */
	Prism.fileHighlight = function () {
		if (!logged) {
			console.warn('Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.');
			logged = true;
		}
		Prism.plugins.fileHighlight.highlight.apply(this, arguments);
	};

}());
Yxr!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var t={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},e="data-src-status",i='pre[data-src]:not([data-src-status="loaded"]):not([data-src-status="loading"])';Prism.hooks.add("before-highlightall",(function(t){t.selector+=", "+i})),Prism.hooks.add("before-sanity-check",(function(a){var n=a.element;if(n.matches(i)){a.code="",n.setAttribute(e,"loading");var s=n.appendChild(document.createElement("CODE"));s.textContent="Loading…";var r=n.getAttribute("data-src"),l=a.language;if("none"===l){var o=(/\.(\w+)$/.exec(r)||[,"none"])[1];l=t[o]||o}Prism.util.setLanguage(s,l),Prism.util.setLanguage(n,l);var h=Prism.plugins.autoloader;h&&h.loadLanguages(l),function(t,i,a){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status<400&&r.responseText?function(t){n.setAttribute(e,"loaded");var i=function(t){var e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(t||"");if(e){var i=Number(e[1]),a=e[2],n=e[3];return a?n?[i,Number(n)]:[i,void 0]:[i,i]}}(n.getAttribute("data-range"));if(i){var a=t.split(/\r\n?|\n/g),r=i[0],l=null==i[1]?a.length:i[1];r<0&&(r+=a.length),r=Math.max(0,Math.min(r-1,a.length)),l<0&&(l+=a.length),l=Math.max(0,Math.min(l,a.length)),t=a.slice(r,l).join("\n"),n.hasAttribute("data-start")||n.setAttribute("data-start",String(r+1))}s.textContent=t,Prism.highlightElement(s)}(r.responseText):r.status>=400?a("✖ Error "+r.status+" while fetching file: "+r.statusText):a("✖ Error: File does not exist or is empty"))},r.send(null)}(r,0,(function(t){n.setAttribute(e,"failed"),s.textContent=t}))}})),Prism.plugins.fileHighlight={highlight:function(t){for(var e,a=(t||document).querySelectorAll(i),n=0;e=a[n++];)Prism.highlightElement(e)}};var a=!1;Prism.fileHighlight=function(){a||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),a=!0),Prism.plugins.fileHighlight.highlight.apply(this,arguments)}}}();YxY(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill
	if (!Element.prototype.matches) {
		Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
	}

	var script = Prism.util.currentScript();


	/**
	 * @type {Array<(element: HTMLElement) => boolean>}
	 */
	var filters = [];

	var config = Prism.plugins.filterHighlightAll = {

		/**
		 * Adds a new filter for the elements of `highlightAll` and `highlightAllUnder` such that only elements for
		 * which the given function returns `true` will be highlighted.
		 *
		 * @param {(value: { element: HTMLElement, language: string }) => boolean} condition
		 */
		add: function (condition) {
			filters.push(function (element) {
				return condition({
					element: element,
					language: Prism.util.getLanguage(element)
				});
			});
		},

		/**
		 * Adds a new filter for the elements of `highlightAll` and `highlightAllUnder` such that only elements that
		 * match the given CSS selection will be highlighted.
		 *
		 * @param {string} selector
		 */
		addSelector: function (selector) {
			filters.push(function (element) {
				return element.matches(selector);
			});
		},

		reject: {

			/**
			 * Adds a new filter for the elements of `highlightAll` and `highlightAllUnder` such that only elements for
			 * which the given function returns `false` will be highlighted.
			 *
			 * @param {(value: { element: HTMLElement, language: string }) => boolean} condition
			 */
			add: function (condition) {
				filters.push(function (element) {
					return !condition({
						element: element,
						language: Prism.util.getLanguage(element)
					});
				});
			},

			/**
			 * Adds a new filter for the elements of `highlightAll` and `highlightAllUnder` such that only elements that do
			 * not match the given CSS selection will be highlighted.
			 *
			 * @param {string} selector
			 */
			addSelector: function (selector) {
				filters.push(function (element) {
					return !element.matches(selector);
				});
			},

		},

		/**
		 * Filters the elements of `highlightAll` and `highlightAllUnder` such that only elements with a known language
		 * will be highlighted. All elements with an unset or unknown language will be ignored.
		 *
		 * __Note:__ This will effectively disable the AutoLoader plugin.
		 *
		 * @type {boolean}
		 */
		filterKnown: !!script && script.hasAttribute('data-filter-known')
	};

	config.add(function filterKnown(env) {
		return !config.filterKnown || typeof Prism.languages[env.language] === 'object';
	});

	if (script) {
		var attr;
		attr = script.getAttribute('data-filter-selector');
		if (attr) {
			config.addSelector(attr);
		}
		attr = script.getAttribute('data-reject-selector');
		if (attr) {
			config.reject.addSelector(attr);
		}
	}

	/**
	 * Applies all filters to the given element and returns true if and only if every filter returned true on the
	 * given element.
	 *
	 * @param {HTMLElement} element
	 * @returns {boolean}
	 */
	function combinedFilter(element) {
		for (var i = 0, l = filters.length; i < l; i++) {
			if (!filters[i](element)) {
				return false;
			}
		}
		return true;
	}

	Prism.hooks.add('before-all-elements-highlight', function (env) {
		env.elements = env.elements.filter(combinedFilter);
	});

}());
`SNBx/!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e,t=Prism.util.currentScript(),n=[],r=Prism.plugins.filterHighlightAll={add:function(e){n.push((function(t){return e({element:t,language:Prism.util.getLanguage(t)})}))},addSelector:function(e){n.push((function(t){return t.matches(e)}))},reject:{add:function(e){n.push((function(t){return!e({element:t,language:Prism.util.getLanguage(t)})}))},addSelector:function(e){n.push((function(t){return!t.matches(e)}))}},filterKnown:!!t&&t.hasAttribute("data-filter-known")};r.add((function(e){return!r.filterKnown||"object"==typeof Prism.languages[e.language]})),t&&((e=t.getAttribute("data-filter-selector"))&&r.addSelector(e),(e=t.getAttribute("data-reject-selector"))&&r.reject.addSelector(e)),Prism.hooks.add("before-all-elements-highlight",(function(e){e.elements=e.elements.filter(i)}))}function i(e){for(var t=0,r=n.length;t<r;t++)if(!n[t](e))return!1;return!0}}(); x )(function () {

	if (typeof Prism === 'undefined') {
		return;
	}

	Prism.hooks.add('wrap', function (env) {
		if (env.type !== 'keyword') {
			return;
		}
		env.classes.push('keyword-' + env.content);
	});

}());
@nx{ "undefined"!=typeof Prism&&Prism.hooks.add("wrap",(function(e){"keyword"===e.type&&e.classes.push("keyword-"+e.content)}));u*¿Axspan.inline-color-wrapper {
	/*
	 * The background image is the following SVG inline in base 64:
	 *
	 * <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2">
	 *     <path fill="gray" d="M0 0h2v2H0z"/>
	 *     <path fill="white" d="M0 0h1v1H0zM1 1h1v1H1z"/>
	 * </svg>
	 *
	 * SVG-inlining explained:
	 * https://stackoverflow.com/a/21626701/7595472
	 */
	background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyIDIiPjxwYXRoIGZpbGw9ImdyYXkiIGQ9Ik0wIDBoMnYySDB6Ii8+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0wIDBoMXYxSDB6TTEgMWgxdjFIMXoiLz48L3N2Zz4=");
	/* This is to prevent visual glitches where one pixel from the repeating pattern could be seen. */
	background-position: center;
	background-size: 110%;

	display: inline-block;
	height: 1.333ch;
	width: 1.333ch;
	margin: 0 .333ch;
	box-sizing: border-box;
	border: 1px solid white;
	outline: 1px solid rgba(0,0,0,.5);
	overflow: hidden;
}

span.inline-color {
	display: block;
	/* To prevent visual glitches again */
	height: 120%;
	width: 120%;
}
^JѾxA(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	// Copied from the markup language definition
	var HTML_TAG = /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g;

	// a regex to validate hexadecimal colors
	var HEX_COLOR = /^#?((?:[\da-f]){3,4}|(?:[\da-f]{2}){3,4})$/i;

	/**
	 * Parses the given hexadecimal representation and returns the parsed RGBA color.
	 *
	 * If the format of the given string is invalid, `undefined` will be returned.
	 * Valid formats are: `RGB`, `RGBA`, `RRGGBB`, and `RRGGBBAA`.
	 *
	 * Hexadecimal colors are parsed because they are not fully supported by older browsers, so converting them to
	 * `rgba` functions improves browser compatibility.
	 *
	 * @param {string} hex
	 * @returns {string | undefined}
	 */
	function parseHexColor(hex) {
		var match = HEX_COLOR.exec(hex);
		if (!match) {
			return undefined;
		}
		hex = match[1]; // removes the leading "#"

		// the width and number of channels
		var channelWidth = hex.length >= 6 ? 2 : 1;
		var channelCount = hex.length / channelWidth;

		// the scale used to normalize 4bit and 8bit values
		var scale = channelWidth == 1 ? 1 / 15 : 1 / 255;

		// normalized RGBA channels
		var channels = [];
		for (var i = 0; i < channelCount; i++) {
			var int = parseInt(hex.substr(i * channelWidth, channelWidth), 16);
			channels.push(int * scale);
		}
		if (channelCount == 3) {
			channels.push(1); // add alpha of 100%
		}

		// output
		var rgb = channels.slice(0, 3).map(function (x) {
			return String(Math.round(x * 255));
		}).join(',');
		var alpha = String(Number(channels[3].toFixed(3))); // easy way to round 3 decimal places

		return 'rgba(' + rgb + ',' + alpha + ')';
	}

	/**
	 * Validates the given Color using the current browser's internal implementation.
	 *
	 * @param {string} color
	 * @returns {string | undefined}
	 */
	function validateColor(color) {
		var s = new Option().style;
		s.color = color;
		return s.color ? color : undefined;
	}

	/**
	 * An array of function which parse a given string representation of a color.
	 *
	 * These parser serve as validators and as a layer of compatibility to support color formats which the browser
	 * might not support natively.
	 *
	 * @type {((value: string) => (string|undefined))[]}
	 */
	var parsers = [
		parseHexColor,
		validateColor
	];


	Prism.hooks.add('wrap', function (env) {
		if (env.type === 'color' || env.classes.indexOf('color') >= 0) {
			var content = env.content;

			// remove all HTML tags inside
			var rawText = content.split(HTML_TAG).join('');

			var color;
			for (var i = 0, l = parsers.length; i < l && !color; i++) {
				color = parsers[i](rawText);
			}

			if (!color) {
				return;
			}

			var previewElement = '<span class="inline-color-wrapper"><span class="inline-color" style="background-color:' + color + ';"></span></span>';
			env.content = previewElement + content;
		}
	});

}());
2! xspan.inline-color-wrapper{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyIDIiPjxwYXRoIGZpbGw9ImdyYXkiIGQ9Ik0wIDBoMnYySDB6Ii8+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0wIDBoMXYxSDB6TTEgMWgxdjFIMXoiLz48L3N2Zz4=);background-position:center;background-size:110%;display:inline-block;height:1.333ch;width:1.333ch;margin:0 .333ch;box-sizing:border-box;border:1px solid #fff;outline:1px solid rgba(0,0,0,.5);overflow:hidden}span.inline-color{display:block;height:120%;width:120%}k;xD!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var n=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,r=/^#?((?:[\da-f]){3,4}|(?:[\da-f]{2}){3,4})$/i,o=[function(n){var o=r.exec(n);if(o){for(var s=(n=o[1]).length>=6?2:1,e=n.length/s,t=1==s?1/15:1/255,i=[],a=0;a<e;a++){var c=parseInt(n.substr(a*s,s),16);i.push(c*t)}return 3==e&&i.push(1),"rgba("+i.slice(0,3).map((function(n){return String(Math.round(255*n))})).join(",")+","+String(Number(i[3].toFixed(3)))+")"}},function(n){var r=(new Option).style;return r.color=n,r.color?n:void 0}];Prism.hooks.add("wrap",(function(r){if("color"===r.type||r.classes.indexOf("color")>=0){for(var s,e=r.content,t=e.split(n).join(""),i=0,a=o.length;i<a&&!s;i++)s=o[i](t);if(!s)return;var c='<span class="inline-color-wrapper"><span class="inline-color" style="background-color:'+s+';"></span></span>';r.content=c+e}}))}}();5x!(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	/**
	 * @callback Adapter
	 * @param {any} response
	 * @param {HTMLPreElement} [pre]
	 * @returns {string | null}
	 */

	/**
	 * The list of adapter which will be used if `data-adapter` is not specified.
	 *
	 * @type {Array<{adapter: Adapter, name: string}>}
	 */
	var adapters = [];

	/**
	 * Adds a new function to the list of adapters.
	 *
	 * If the given adapter is already registered or not a function or there is an adapter with the given name already,
	 * nothing will happen.
	 *
	 * @param {Adapter} adapter The adapter to be registered.
	 * @param {string} [name] The name of the adapter. Defaults to the function name of `adapter`.
	 */
	function registerAdapter(adapter, name) {
		name = name || adapter.name;
		if (typeof adapter === 'function' && !getAdapter(adapter) && !getAdapter(name)) {
			adapters.push({ adapter: adapter, name: name });
		}
	}
	/**
	 * Returns the given adapter itself, if registered, or a registered adapter with the given name.
	 *
	 * If no fitting adapter is registered, `null` will be returned.
	 *
	 * @param {string|Function} adapter The adapter itself or the name of an adapter.
	 * @returns {Adapter} A registered adapter or `null`.
	 */
	function getAdapter(adapter) {
		if (typeof adapter === 'function') {
			for (var i = 0, item; (item = adapters[i++]);) {
				if (item.adapter.valueOf() === adapter.valueOf()) {
					return item.adapter;
				}
			}
		} else if (typeof adapter === 'string') {
			// eslint-disable-next-line no-redeclare
			for (var i = 0, item; (item = adapters[i++]);) {
				if (item.name === adapter) {
					return item.adapter;
				}
			}
		}
		return null;
	}
	/**
	 * Remove the given adapter or the first registered adapter with the given name from the list of
	 * registered adapters.
	 *
	 * @param {string|Function} adapter The adapter itself or the name of an adapter.
	 */
	function removeAdapter(adapter) {
		if (typeof adapter === 'string') {
			adapter = getAdapter(adapter);
		}
		if (typeof adapter === 'function') {
			var index = adapters.findIndex(function (item) {
				return item.adapter === adapter;
			});
			if (index >= 0) {
				adapters.splice(index, 1);
			}
		}
	}

	registerAdapter(function github(rsp) {
		if (rsp && rsp.meta && rsp.data) {
			if (rsp.meta.status && rsp.meta.status >= 400) {
				return 'Error: ' + (rsp.data.message || rsp.meta.status);
			} else if (typeof (rsp.data.content) === 'string') {
				return typeof (atob) === 'function'
					? atob(rsp.data.content.replace(/\s/g, ''))
					: 'Your browser cannot decode base64';
			}
		}
		return null;
	}, 'github');
	registerAdapter(function gist(rsp, el) {
		if (rsp && rsp.meta && rsp.data && rsp.data.files) {
			if (rsp.meta.status && rsp.meta.status >= 400) {
				return 'Error: ' + (rsp.data.message || rsp.meta.status);
			}

			var files = rsp.data.files;
			var filename = el.getAttribute('data-filename');
			if (filename == null) {
				// Maybe in the future we can somehow render all files
				// But the standard <script> include for gists does that nicely already,
				// so that might be getting beyond the scope of this plugin
				for (var key in files) {
					if (files.hasOwnProperty(key)) {
						filename = key;
						break;
					}
				}
			}

			if (files[filename] !== undefined) {
				return files[filename].content;
			}
			return 'Error: unknown or missing gist file ' + filename;
		}
		return null;
	}, 'gist');
	registerAdapter(function bitbucket(rsp) {
		if (rsp && rsp.node && typeof (rsp.data) === 'string') {
			return rsp.data;
		}
		return null;
	}, 'bitbucket');


	var jsonpCallbackCounter = 0;
	/**
	 * Makes a JSONP request.
	 *
	 * @param {string} src The URL of the resource to request.
	 * @param {string | undefined | null} callbackParameter The name of the callback parameter. If falsy, `"callback"`
	 * will be used.
	 * @param {(data: unknown) => void} onSuccess
	 * @param {(reason: "timeout" | "network") => void} onError
	 * @returns {void}
	 */
	function jsonp(src, callbackParameter, onSuccess, onError) {
		var callbackName = 'prismjsonp' + jsonpCallbackCounter++;

		var uri = document.createElement('a');
		uri.href = src;
		uri.href += (uri.search ? '&' : '?') + (callbackParameter || 'callback') + '=' + callbackName;

		var script = document.createElement('script');
		script.src = uri.href;
		script.onerror = function () {
			cleanup();
			onError('network');
		};

		var timeoutId = setTimeout(function () {
			cleanup();
			onError('timeout');
		}, Prism.plugins.jsonphighlight.timeout);

		function cleanup() {
			clearTimeout(timeoutId);
			document.head.removeChild(script);
			delete window[callbackName];
		}

		// the JSONP callback function
		window[callbackName] = function (response) {
			cleanup();
			onSuccess(response);
		};

		document.head.appendChild(script);
	}

	var LOADING_MESSAGE = 'Loading…';
	var MISSING_ADAPTER_MESSAGE = function (name) {
		return '✖ Error: JSONP adapter function "' + name + '" doesn\'t exist';
	};
	var TIMEOUT_MESSAGE = function (url) {
		return '✖ Error: Timeout loading ' + url;
	};
	var UNKNOWN_FAILURE_MESSAGE = '✖ Error: Cannot parse response (perhaps you need an adapter function?)';

	var STATUS_ATTR = 'data-jsonp-status';
	var STATUS_LOADING = 'loading';
	var STATUS_LOADED = 'loaded';
	var STATUS_FAILED = 'failed';

	var SELECTOR = 'pre[data-jsonp]:not([' + STATUS_ATTR + '="' + STATUS_LOADED + '"])'
		+ ':not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])';


	Prism.hooks.add('before-highlightall', function (env) {
		env.selector += ', ' + SELECTOR;
	});

	Prism.hooks.add('before-sanity-check', function (env) {
		var pre = /** @type {HTMLPreElement} */ (env.element);
		if (pre.matches(SELECTOR)) {
			env.code = ''; // fast-path the whole thing and go to complete

			// mark as loading
			pre.setAttribute(STATUS_ATTR, STATUS_LOADING);

			// add code element with loading message
			var code = pre.appendChild(document.createElement('CODE'));
			code.textContent = LOADING_MESSAGE;

			// set language
			var language = env.language;
			code.className = 'language-' + language;

			// preload the language
			var autoloader = Prism.plugins.autoloader;
			if (autoloader) {
				autoloader.loadLanguages(language);
			}

			var adapterName = pre.getAttribute('data-adapter');
			var adapter = null;
			if (adapterName) {
				if (typeof window[adapterName] === 'function') {
					adapter = window[adapterName];
				} else {
					// mark as failed
					pre.setAttribute(STATUS_ATTR, STATUS_FAILED);

					code.textContent = MISSING_ADAPTER_MESSAGE(adapterName);
					return;
				}
			}

			var src = pre.getAttribute('data-jsonp');

			jsonp(
				src,
				pre.getAttribute('data-callback'),
				function (response) {
					// interpret the received data using the adapter(s)
					var data = null;
					if (adapter) {
						data = adapter(response, pre);
					} else {
						for (var i = 0, l = adapters.length; i < l; i++) {
							data = adapters[i].adapter(response, pre);
							if (data !== null) {
								break;
							}
						}
					}

					if (data === null) {
						// mark as failed
						pre.setAttribute(STATUS_ATTR, STATUS_FAILED);

						code.textContent = UNKNOWN_FAILURE_MESSAGE;
					} else {
						// mark as loaded
						pre.setAttribute(STATUS_ATTR, STATUS_LOADED);

						code.textContent = data;
						Prism.highlightElement(code);
					}
				},
				function () {
					// mark as failed
					pre.setAttribute(STATUS_ATTR, STATUS_FAILED);

					code.textContent = TIMEOUT_MESSAGE(src);
				}
			);
		}
	});


	Prism.plugins.jsonphighlight = {
		/**
		 * The timeout after which an error message will be displayed.
		 *
		 * __Note:__ If the request succeeds after the timeout, it will still be processed and will override any
		 * displayed error messages.
		 */
		timeout: 5000,
		registerAdapter: registerAdapter,
		removeAdapter: removeAdapter,

		/**
		 * Highlights all `pre` elements under the given container with a `data-jsonp` attribute by requesting the
		 * specified JSON and using the specified adapter or a registered adapter to extract the code to highlight
		 * from the response. The highlighted code will be inserted into the `pre` element.
		 *
		 * Note: Elements which are already loaded or currently loading will not be touched by this method.
		 *
		 * @param {Element | Document} [container=document]
		 */
		highlight: function (container) {
			var elements = (container || document).querySelectorAll(SELECTOR);

			for (var i = 0, element; (element = elements[i++]);) {
				Prism.highlightElement(element);
			}
		}
	};

}());
Bx:!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var t=[];o((function(t){if(t&&t.meta&&t.data){if(t.meta.status&&t.meta.status>=400)return"Error: "+(t.data.message||t.meta.status);if("string"==typeof t.data.content)return"function"==typeof atob?atob(t.data.content.replace(/\s/g,"")):"Your browser cannot decode base64"}return null}),"github"),o((function(t,e){if(t&&t.meta&&t.data&&t.data.files){if(t.meta.status&&t.meta.status>=400)return"Error: "+(t.data.message||t.meta.status);var n=t.data.files,a=e.getAttribute("data-filename");if(null==a)for(var r in n)if(n.hasOwnProperty(r)){a=r;break}return void 0!==n[a]?n[a].content:"Error: unknown or missing gist file "+a}return null}),"gist"),o((function(t){return t&&t.node&&"string"==typeof t.data?t.data:null}),"bitbucket");var e=0,n="data-jsonp-status",a="failed",r='pre[data-jsonp]:not([data-jsonp-status="loaded"]):not([data-jsonp-status="loading"])';Prism.hooks.add("before-highlightall",(function(t){t.selector+=", "+r})),Prism.hooks.add("before-sanity-check",(function(o){var i,u=o.element;if(u.matches(r)){o.code="",u.setAttribute(n,"loading");var s=u.appendChild(document.createElement("CODE"));s.textContent="Loading…";var d=o.language;s.className="language-"+d;var f=Prism.plugins.autoloader;f&&f.loadLanguages(d);var l=u.getAttribute("data-adapter"),c=null;if(l){if("function"!=typeof window[l])return u.setAttribute(n,a),void(s.textContent=(i=l,'✖ Error: JSONP adapter function "'+i+"\" doesn't exist"));c=window[l]}var p=u.getAttribute("data-jsonp");!function(r,o,i,d){var f="prismjsonp"+e++,l=document.createElement("a");l.href=r,l.href+=(l.search?"&":"?")+(o||"callback")+"="+f;var p=document.createElement("script");p.src=l.href,p.onerror=function(){g(),d()};var m=setTimeout((function(){g(),d()}),Prism.plugins.jsonphighlight.timeout);function g(){clearTimeout(m),document.head.removeChild(p),delete window[f]}window[f]=function(e){g(),function(e){var r=null;if(c)r=c(e,u);else for(var o=0,i=t.length;o<i&&null===(r=t[o].adapter(e,u));o++);null===r?(u.setAttribute(n,a),s.textContent="✖ Error: Cannot parse response (perhaps you need an adapter function?)"):(u.setAttribute(n,"loaded"),s.textContent=r,Prism.highlightElement(s))}(e)},document.head.appendChild(p)}(p,u.getAttribute("data-callback"),0,(function(){u.setAttribute(n,a),s.textContent="✖ Error: Timeout loading "+p}))}})),Prism.plugins.jsonphighlight={timeout:5e3,registerAdapter:o,removeAdapter:function(e){if("string"==typeof e&&(e=i(e)),"function"==typeof e){var n=t.findIndex((function(t){return t.adapter===e}));n>=0&&t.splice(n,1)}},highlight:function(t){for(var e,n=(t||document).querySelectorAll(r),a=0;e=n[a++];)Prism.highlightElement(e)}}}function o(e,n){n=n||e.name,"function"!=typeof e||i(e)||i(n)||t.push({adapter:e,name:n})}function i(e){if("function"==typeof e){for(var n=0;a=t[n++];)if(a.adapter.valueOf()===e.valueOf())return a.adapter}else if("string"==typeof e){var a;for(n=0;a=t[n++];)if(a.name===e)return a.adapter}return null}}();O*Zx(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined' || !document.createRange) {
		return;
	}

	Prism.plugins.KeepMarkup = true;

	Prism.hooks.add('before-highlight', function (env) {
		if (!env.element.children.length) {
			return;
		}

		if (!Prism.util.isActive(env.element, 'keep-markup', true)) {
			return;
		}

		var dropTokens = Prism.util.isActive(env.element, 'drop-tokens', false);
		/**
		 * Returns whether the given element should be kept.
		 *
		 * @param {HTMLElement} element
		 * @returns {boolean}
		 */
		function shouldKeep(element) {
			if (dropTokens && element.nodeName.toLowerCase() === 'span' && element.classList.contains('token')) {
				return false;
			}
			return true;
		}

		var pos = 0;
		var data = [];
		function processElement(element) {
			if (!shouldKeep(element)) {
				// don't keep this element and just process its children
				processChildren(element);
				return;
			}

			var o = {
				// Store original element so we can restore it after highlighting
				element: element,
				posOpen: pos
			};
			data.push(o);

			processChildren(element);

			o.posClose = pos;
		}
		function processChildren(element) {
			for (var i = 0, l = element.childNodes.length; i < l; i++) {
				var child = element.childNodes[i];
				if (child.nodeType === 1) { // element
					processElement(child);
				} else if (child.nodeType === 3) { // text
					pos += child.data.length;
				}
			}
		}
		processChildren(env.element);

		if (data.length) {
			// data is an array of all existing tags
			env.keepMarkup = data;
		}
	});

	Prism.hooks.add('after-highlight', function (env) {
		if (env.keepMarkup && env.keepMarkup.length) {

			var walk = function (elt, nodeState) {
				for (var i = 0, l = elt.childNodes.length; i < l; i++) {

					var child = elt.childNodes[i];

					if (child.nodeType === 1) { // element
						if (!walk(child, nodeState)) {
							return false;
						}

					} else if (child.nodeType === 3) { // text
						if (!nodeState.nodeStart && nodeState.pos + child.data.length > nodeState.node.posOpen) {
							// We found the start position
							nodeState.nodeStart = child;
							nodeState.nodeStartPos = nodeState.node.posOpen - nodeState.pos;
						}
						if (nodeState.nodeStart && nodeState.pos + child.data.length >= nodeState.node.posClose) {
							// We found the end position
							nodeState.nodeEnd = child;
							nodeState.nodeEndPos = nodeState.node.posClose - nodeState.pos;
						}

						nodeState.pos += child.data.length;
					}

					if (nodeState.nodeStart && nodeState.nodeEnd) {
						// Select the range and wrap it with the element
						var range = document.createRange();
						range.setStart(nodeState.nodeStart, nodeState.nodeStartPos);
						range.setEnd(nodeState.nodeEnd, nodeState.nodeEndPos);
						nodeState.node.element.innerHTML = '';
						nodeState.node.element.appendChild(range.extractContents());
						range.insertNode(nodeState.node.element);
						range.detach();

						// Process is over
						return false;
					}
				}
				return true;
			};

			// For each tag, we walk the DOM to reinsert it
			env.keepMarkup.forEach(function (node) {
				walk(env.element, {
					node: node,
					pos: 0
				});
			});
			// Store new highlightedCode for later hooks calls
			env.highlightedCode = env.element.innerHTML;
		}
	});
}());
\x6"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",(function(e){if(e.element.children.length&&Prism.util.isActive(e.element,"keep-markup",!0)){var n=Prism.util.isActive(e.element,"drop-tokens",!1),t=0,o=[];r(e.element),o.length&&(e.keepMarkup=o)}function d(e){if(function(e){return!n||"span"!==e.nodeName.toLowerCase()||!e.classList.contains("token")}(e)){var d={element:e,posOpen:t};o.push(d),r(e),d.posClose=t}else r(e)}function r(e){for(var n=0,o=e.childNodes.length;n<o;n++){var r=e.childNodes[n];1===r.nodeType?d(r):3===r.nodeType&&(t+=r.data.length)}}})),Prism.hooks.add("after-highlight",(function(e){if(e.keepMarkup&&e.keepMarkup.length){var n=function(e,t){for(var o=0,d=e.childNodes.length;o<d;o++){var r=e.childNodes[o];if(1===r.nodeType){if(!n(r,t))return!1}else 3===r.nodeType&&(!t.nodeStart&&t.pos+r.data.length>t.node.posOpen&&(t.nodeStart=r,t.nodeStartPos=t.node.posOpen-t.pos),t.nodeStart&&t.pos+r.data.length>=t.node.posClose&&(t.nodeEnd=r,t.nodeEndPos=t.node.posClose-t.pos),t.pos+=r.data.length);if(t.nodeStart&&t.nodeEnd){var s=document.createRange();return s.setStart(t.nodeStart,t.nodeStartPos),s.setEnd(t.nodeEnd,t.nodeEndPos),t.node.element.innerHTML="",t.node.element.appendChild(s.extractContents()),s.insertNode(t.node.element),s.detach(),!1}}return!0};e.keepMarkup.forEach((function(t){n(e.element,{node:t,pos:0})})),e.highlightedCode=e.element.innerHTML}})));ɿ`xpre[data-line] {
	position: relative;
	padding: 1em 0 1em 3em;
}

.line-highlight {
	position: absolute;
	left: 0;
	right: 0;
	padding: inherit 0;
	margin-top: 1em; /* Same as .prism’s padding-top */

	background: hsla(24, 20%, 50%,.08);
	background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));

	pointer-events: none;

	line-height: inherit;
	white-space: pre;
}

@media print {
	.line-highlight {
		/*
		 * This will prevent browsers from replacing the background color with white.
		 * It's necessary because the element is layered on top of the displayed code.
		 */
		-webkit-print-color-adjust: exact;
		color-adjust: exact;
	}
}

	.line-highlight:before,
	.line-highlight[data-end]:after {
		content: attr(data-start);
		position: absolute;
		top: .4em;
		left: .6em;
		min-width: 1em;
		padding: 0 .5em;
		background-color: hsla(24, 20%, 50%,.4);
		color: hsl(24, 20%, 95%);
		font: bold 65%/1.5 sans-serif;
		text-align: center;
		vertical-align: .3em;
		border-radius: 999px;
		text-shadow: none;
		box-shadow: 0 1px white;
	}

	.line-highlight[data-end]:after {
		content: attr(data-end);
		top: auto;
		bottom: .4em;
	}

.line-numbers .line-highlight:before,
.line-numbers .line-highlight:after {
	content: none;
}

pre[id].linkable-line-numbers span.line-numbers-rows {
	pointer-events: all;
}
pre[id].linkable-line-numbers span.line-numbers-rows > span:before {
	cursor: pointer;
}
pre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before {
	background-color: rgba(128, 128, 128, .2);
}
zx(f(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined' || !document.querySelector) {
		return;
	}

	var LINE_NUMBERS_CLASS = 'line-numbers';
	var LINKABLE_LINE_NUMBERS_CLASS = 'linkable-line-numbers';
	var NEW_LINE_EXP = /\n(?!$)/g;

	/**
	 * @param {string} selector
	 * @param {ParentNode} [container]
	 * @returns {HTMLElement[]}
	 */
	function $$(selector, container) {
		return Array.prototype.slice.call((container || document).querySelectorAll(selector));
	}

	/**
	 * Returns whether the given element has the given class.
	 *
	 * @param {Element} element
	 * @param {string} className
	 * @returns {boolean}
	 */
	function hasClass(element, className) {
		return element.classList.contains(className);
	}

	/**
	 * Calls the given function.
	 *
	 * @param {() => any} func
	 * @returns {void}
	 */
	function callFunction(func) {
		func();
	}

	// Some browsers round the line-height, others don't.
	// We need to test for it to position the elements properly.
	var isLineHeightRounded = (function () {
		var res;
		return function () {
			if (typeof res === 'undefined') {
				var d = document.createElement('div');
				d.style.fontSize = '13px';
				d.style.lineHeight = '1.5';
				d.style.padding = '0';
				d.style.border = '0';
				d.innerHTML = '&nbsp;<br />&nbsp;';
				document.body.appendChild(d);
				// Browsers that round the line-height should have offsetHeight === 38
				// The others should have 39.
				res = d.offsetHeight === 38;
				document.body.removeChild(d);
			}
			return res;
		};
	}());

	/**
	 * Returns the top offset of the content box of the given parent and the content box of one of its children.
	 *
	 * @param {HTMLElement} parent
	 * @param {HTMLElement} child
	 */
	function getContentBoxTopOffset(parent, child) {
		var parentStyle = getComputedStyle(parent);
		var childStyle = getComputedStyle(child);

		/**
		 * Returns the numeric value of the given pixel value.
		 *
		 * @param {string} px
		 */
		function pxToNumber(px) {
			return +px.substr(0, px.length - 2);
		}

		return child.offsetTop
			+ pxToNumber(childStyle.borderTopWidth)
			+ pxToNumber(childStyle.paddingTop)
			- pxToNumber(parentStyle.paddingTop);
	}

	/**
	 * Returns whether the Line Highlight plugin is active for the given element.
	 *
	 * If this function returns `false`, do not call `highlightLines` for the given element.
	 *
	 * @param {HTMLElement | null | undefined} pre
	 * @returns {boolean}
	 */
	function isActiveFor(pre) {
		if (!pre || !/pre/i.test(pre.nodeName)) {
			return false;
		}

		if (pre.hasAttribute('data-line')) {
			return true;
		}

		if (pre.id && Prism.util.isActive(pre, LINKABLE_LINE_NUMBERS_CLASS)) {
			// Technically, the line numbers plugin is also necessary but this plugin doesn't control the classes of
			// the line numbers plugin, so we can't assume that they are present.
			return true;
		}

		return false;
	}

	var scrollIntoView = true;

	Prism.plugins.lineHighlight = {
		/**
		 * Highlights the lines of the given pre.
		 *
		 * This function is split into a DOM measuring and mutate phase to improve performance.
		 * The returned function mutates the DOM when called.
		 *
		 * @param {HTMLElement} pre
		 * @param {string | null} [lines]
		 * @param {string} [classes='']
		 * @returns {() => void}
		 */
		highlightLines: function highlightLines(pre, lines, classes) {
			lines = typeof lines === 'string' ? lines : (pre.getAttribute('data-line') || '');

			var ranges = lines.replace(/\s+/g, '').split(',').filter(Boolean);
			var offset = +pre.getAttribute('data-line-offset') || 0;

			var parseMethod = isLineHeightRounded() ? parseInt : parseFloat;
			var lineHeight = parseMethod(getComputedStyle(pre).lineHeight);
			var hasLineNumbers = Prism.util.isActive(pre, LINE_NUMBERS_CLASS);
			var codeElement = pre.querySelector('code');
			var parentElement = hasLineNumbers ? pre : codeElement || pre;
			var mutateActions = /** @type {(() => void)[]} */ ([]);
			var lineBreakMatch = codeElement.textContent.match(NEW_LINE_EXP);
			var numberOfLines = lineBreakMatch ? lineBreakMatch.length + 1 : 1;
			/**
			 * The top offset between the content box of the <code> element and the content box of the parent element of
			 * the line highlight element (either `<pre>` or `<code>`).
			 *
			 * This offset might not be zero for some themes where the <code> element has a top margin. Some plugins
			 * (or users) might also add element above the <code> element. Because the line highlight is aligned relative
			 * to the <pre> element, we have to take this into account.
			 *
			 * This offset will be 0 if the parent element of the line highlight element is the `<code>` element.
			 */
			var codePreOffset = !codeElement || parentElement == codeElement ? 0 : getContentBoxTopOffset(pre, codeElement);

			ranges.forEach(function (currentRange) {
				var range = currentRange.split('-');

				var start = +range[0];
				var end = +range[1] || start;
				end = Math.min(numberOfLines + offset, end);

				if (end < start) {
					return;
				}

				/** @type {HTMLElement} */
				var line = pre.querySelector('.line-highlight[data-range="' + currentRange + '"]') || document.createElement('div');

				mutateActions.push(function () {
					line.setAttribute('aria-hidden', 'true');
					line.setAttribute('data-range', currentRange);
					line.className = (classes || '') + ' line-highlight';
				});

				// if the line-numbers plugin is enabled, then there is no reason for this plugin to display the line numbers
				if (hasLineNumbers && Prism.plugins.lineNumbers) {
					var startNode = Prism.plugins.lineNumbers.getLine(pre, start);
					var endNode = Prism.plugins.lineNumbers.getLine(pre, end);

					if (startNode) {
						var top = startNode.offsetTop + codePreOffset + 'px';
						mutateActions.push(function () {
							line.style.top = top;
						});
					}

					if (endNode) {
						var height = (endNode.offsetTop - startNode.offsetTop) + endNode.offsetHeight + 'px';
						mutateActions.push(function () {
							line.style.height = height;
						});
					}
				} else {
					mutateActions.push(function () {
						line.setAttribute('data-start', String(start));

						if (end > start) {
							line.setAttribute('data-end', String(end));
						}

						line.style.top = (start - offset - 1) * lineHeight + codePreOffset + 'px';

						line.textContent = new Array(end - start + 2).join(' \n');
					});
				}

				mutateActions.push(function () {
					line.style.width = pre.scrollWidth + 'px';
				});

				mutateActions.push(function () {
					// allow this to play nicely with the line-numbers plugin
					// need to attack to pre as when line-numbers is enabled, the code tag is relatively which screws up the positioning
					parentElement.appendChild(line);
				});
			});

			var id = pre.id;
			if (hasLineNumbers && Prism.util.isActive(pre, LINKABLE_LINE_NUMBERS_CLASS) && id) {
				// This implements linkable line numbers. Linkable line numbers use Line Highlight to create a link to a
				// specific line. For this to work, the pre element has to:
				//  1) have line numbers,
				//  2) have the `linkable-line-numbers` class or an ascendant that has that class, and
				//  3) have an id.

				if (!hasClass(pre, LINKABLE_LINE_NUMBERS_CLASS)) {
					// add class to pre
					mutateActions.push(function () {
						pre.classList.add(LINKABLE_LINE_NUMBERS_CLASS);
					});
				}

				var start = parseInt(pre.getAttribute('data-start') || '1');

				// iterate all line number spans
				$$('.line-numbers-rows > span', pre).forEach(function (lineSpan, i) {
					var lineNumber = i + start;
					lineSpan.onclick = function () {
						var hash = id + '.' + lineNumber;

						// this will prevent scrolling since the span is obviously in view
						scrollIntoView = false;
						location.hash = hash;
						setTimeout(function () {
							scrollIntoView = true;
						}, 1);
					};
				});
			}

			return function () {
				mutateActions.forEach(callFunction);
			};
		}
	};


	function applyHash() {
		var hash = location.hash.slice(1);

		// Remove pre-existing temporary lines
		$$('.temporary.line-highlight').forEach(function (line) {
			line.parentNode.removeChild(line);
		});

		var range = (hash.match(/\.([\d,-]+)$/) || [, ''])[1];

		if (!range || document.getElementById(hash)) {
			return;
		}

		var id = hash.slice(0, hash.lastIndexOf('.'));
		var pre = document.getElementById(id);

		if (!pre) {
			return;
		}

		if (!pre.hasAttribute('data-line')) {
			pre.setAttribute('data-line', '');
		}

		var mutateDom = Prism.plugins.lineHighlight.highlightLines(pre, range, 'temporary ');
		mutateDom();

		if (scrollIntoView) {
			document.querySelector('.temporary.line-highlight').scrollIntoView();
		}
	}

	var fakeTimer = 0; // Hack to limit the number of times applyHash() runs

	Prism.hooks.add('before-sanity-check', function (env) {
		var pre = env.element.parentElement;
		if (!isActiveFor(pre)) {
			return;
		}

		/*
		 * Cleanup for other plugins (e.g. autoloader).
		 *
		 * Sometimes <code> blocks are highlighted multiple times. It is necessary
		 * to cleanup any left-over tags, because the whitespace inside of the <div>
		 * tags change the content of the <code> tag.
		 */
		var num = 0;
		$$('.line-highlight', pre).forEach(function (line) {
			num += line.textContent.length;
			line.parentNode.removeChild(line);
		});
		// Remove extra whitespace
		if (num && /^(?: \n)+$/.test(env.code.slice(-num))) {
			env.code = env.code.slice(0, -num);
		}
	});

	Prism.hooks.add('complete', function completeHook(env) {
		var pre = env.element.parentElement;
		if (!isActiveFor(pre)) {
			return;
		}

		clearTimeout(fakeTimer);

		var hasLineNumbers = Prism.plugins.lineNumbers;
		var isLineNumbersLoaded = env.plugins && env.plugins.lineNumbers;

		if (hasClass(pre, LINE_NUMBERS_CLASS) && hasLineNumbers && !isLineNumbersLoaded) {
			Prism.hooks.add('line-numbers', completeHook);
		} else {
			var mutateDom = Prism.plugins.lineHighlight.highlightLines(pre);
			mutateDom();
			fakeTimer = setTimeout(applyHash, 1);
		}
	});

	window.addEventListener('hashchange', applyHash);
	window.addEventListener('resize', function () {
		var actions = $$('pre')
			.filter(isActiveFor)
			.map(function (pre) {
				return Prism.plugins.lineHighlight.highlightLines(pre);
			});
		actions.forEach(callFunction);
	});

}());
xFxmpre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:hsla(24,20%,50%,.08);background:linear-gradient(to right,hsla(24,20%,50%,.1) 70%,hsla(24,20%,50%,0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:hsla(24,20%,50%,.4);color:#f4f1ef;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px #fff}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:after,.line-numbers .line-highlight:before{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,.2)}E[xz!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector){var e,t="line-numbers",i="linkable-line-numbers",n=/\n(?!$)/g,r=!0;Prism.plugins.lineHighlight={highlightLines:function(o,u,c){var h=(u="string"==typeof u?u:o.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),d=+o.getAttribute("data-line-offset")||0,f=(function(){if(void 0===e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding="0",t.style.border="0",t.innerHTML="&nbsp;<br />&nbsp;",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}()?parseInt:parseFloat)(getComputedStyle(o).lineHeight),p=Prism.util.isActive(o,t),g=o.querySelector("code"),m=p?o:g||o,v=[],y=g.textContent.match(n),b=y?y.length+1:1,A=g&&m!=g?function(e,t){var i=getComputedStyle(e),n=getComputedStyle(t);function r(e){return+e.substr(0,e.length-2)}return t.offsetTop+r(n.borderTopWidth)+r(n.paddingTop)-r(i.paddingTop)}(o,g):0;h.forEach((function(e){var t=e.split("-"),i=+t[0],n=+t[1]||i;if(!((n=Math.min(b+d,n))<i)){var r=o.querySelector('.line-highlight[data-range="'+e+'"]')||document.createElement("div");if(v.push((function(){r.setAttribute("aria-hidden","true"),r.setAttribute("data-range",e),r.className=(c||"")+" line-highlight"})),p&&Prism.plugins.lineNumbers){var s=Prism.plugins.lineNumbers.getLine(o,i),l=Prism.plugins.lineNumbers.getLine(o,n);if(s){var a=s.offsetTop+A+"px";v.push((function(){r.style.top=a}))}if(l){var u=l.offsetTop-s.offsetTop+l.offsetHeight+"px";v.push((function(){r.style.height=u}))}}else v.push((function(){r.setAttribute("data-start",String(i)),n>i&&r.setAttribute("data-end",String(n)),r.style.top=(i-d-1)*f+A+"px",r.textContent=new Array(n-i+2).join(" \n")}));v.push((function(){r.style.width=o.scrollWidth+"px"})),v.push((function(){m.appendChild(r)}))}}));var P=o.id;if(p&&Prism.util.isActive(o,i)&&P){l(o,i)||v.push((function(){o.classList.add(i)}));var E=parseInt(o.getAttribute("data-start")||"1");s(".line-numbers-rows > span",o).forEach((function(e,t){var i=t+E;e.onclick=function(){var e=P+"."+i;r=!1,location.hash=e,setTimeout((function(){r=!0}),1)}}))}return function(){v.forEach(a)}}};var o=0;Prism.hooks.add("before-sanity-check",(function(e){var t=e.element.parentElement;if(u(t)){var i=0;s(".line-highlight",t).forEach((function(e){i+=e.textContent.length,e.parentNode.removeChild(e)})),i&&/^(?: \n)+$/.test(e.code.slice(-i))&&(e.code=e.code.slice(0,-i))}})),Prism.hooks.add("complete",(function e(i){var n=i.element.parentElement;if(u(n)){clearTimeout(o);var r=Prism.plugins.lineNumbers,s=i.plugins&&i.plugins.lineNumbers;l(n,t)&&r&&!s?Prism.hooks.add("line-numbers",e):(Prism.plugins.lineHighlight.highlightLines(n)(),o=setTimeout(c,1))}})),window.addEventListener("hashchange",c),window.addEventListener("resize",(function(){s("pre").filter(u).map((function(e){return Prism.plugins.lineHighlight.highlightLines(e)})).forEach(a)}))}function s(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function l(e,t){return e.classList.contains(t)}function a(e){e()}function u(e){return!!(e&&/pre/i.test(e.nodeName)&&(e.hasAttribute("data-line")||e.id&&Prism.util.isActive(e,i)))}function c(){var e=location.hash.slice(1);s(".temporary.line-highlight").forEach((function(e){e.parentNode.removeChild(e)}));var t=(e.match(/\.([\d,-]+)$/)||[,""])[1];if(t&&!document.getElementById(e)){var i=e.slice(0,e.lastIndexOf(".")),n=document.getElementById(i);n&&(n.hasAttribute("data-line")||n.setAttribute("data-line",""),Prism.plugins.lineHighlight.highlightLines(n,t,"temporary ")(),r&&document.querySelector(".temporary.line-highlight").scrollIntoView())}}}();5}0xpre[class*="language-"].line-numbers {
	position: relative;
	padding-left: 3.8em;
	counter-reset: linenumber;
}

pre[class*="language-"].line-numbers > code {
	position: relative;
	white-space: inherit;
}

.line-numbers .line-numbers-rows {
	position: absolute;
	pointer-events: none;
	top: 0;
	font-size: 100%;
	left: -3.8em;
	width: 3em; /* works for line-numbers below 1000 lines */
	letter-spacing: -1px;
	border-right: 1px solid #999;

	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;

}

	.line-numbers-rows > span {
		display: block;
		counter-increment: linenumber;
	}

		.line-numbers-rows > span:before {
			content: counter(linenumber);
			color: #999;
			display: block;
			padding-right: 0.8em;
			text-align: right;
		}
ilx(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	/**
	 * Plugin name which is used as a class name for <pre> which is activating the plugin
	 *
	 * @type {string}
	 */
	var PLUGIN_NAME = 'line-numbers';

	/**
	 * Regular expression used for determining line breaks
	 *
	 * @type {RegExp}
	 */
	var NEW_LINE_EXP = /\n(?!$)/g;


	/**
	 * Global exports
	 */
	var config = Prism.plugins.lineNumbers = {
		/**
		 * Get node for provided line number
		 *
		 * @param {Element} element pre element
		 * @param {number} number line number
		 * @returns {Element|undefined}
		 */
		getLine: function (element, number) {
			if (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {
				return;
			}

			var lineNumberRows = element.querySelector('.line-numbers-rows');
			if (!lineNumberRows) {
				return;
			}
			var lineNumberStart = parseInt(element.getAttribute('data-start'), 10) || 1;
			var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);

			if (number < lineNumberStart) {
				number = lineNumberStart;
			}
			if (number > lineNumberEnd) {
				number = lineNumberEnd;
			}

			var lineIndex = number - lineNumberStart;

			return lineNumberRows.children[lineIndex];
		},

		/**
		 * Resizes the line numbers of the given element.
		 *
		 * This function will not add line numbers. It will only resize existing ones.
		 *
		 * @param {HTMLElement} element A `<pre>` element with line numbers.
		 * @returns {void}
		 */
		resize: function (element) {
			resizeElements([element]);
		},

		/**
		 * Whether the plugin can assume that the units font sizes and margins are not depended on the size of
		 * the current viewport.
		 *
		 * Setting this to `true` will allow the plugin to do certain optimizations for better performance.
		 *
		 * Set this to `false` if you use any of the following CSS units: `vh`, `vw`, `vmin`, `vmax`.
		 *
		 * @type {boolean}
		 */
		assumeViewportIndependence: true
	};

	/**
	 * Resizes the given elements.
	 *
	 * @param {HTMLElement[]} elements
	 */
	function resizeElements(elements) {
		elements = elements.filter(function (e) {
			var codeStyles = getStyles(e);
			var whiteSpace = codeStyles['white-space'];
			return whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line';
		});

		if (elements.length == 0) {
			return;
		}

		var infos = elements.map(function (element) {
			var codeElement = element.querySelector('code');
			var lineNumbersWrapper = element.querySelector('.line-numbers-rows');
			if (!codeElement || !lineNumbersWrapper) {
				return undefined;
			}

			/** @type {HTMLElement} */
			var lineNumberSizer = element.querySelector('.line-numbers-sizer');
			var codeLines = codeElement.textContent.split(NEW_LINE_EXP);

			if (!lineNumberSizer) {
				lineNumberSizer = document.createElement('span');
				lineNumberSizer.className = 'line-numbers-sizer';

				codeElement.appendChild(lineNumberSizer);
			}

			lineNumberSizer.innerHTML = '0';
			lineNumberSizer.style.display = 'block';

			var oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;
			lineNumberSizer.innerHTML = '';

			return {
				element: element,
				lines: codeLines,
				lineHeights: [],
				oneLinerHeight: oneLinerHeight,
				sizer: lineNumberSizer,
			};
		}).filter(Boolean);

		infos.forEach(function (info) {
			var lineNumberSizer = info.sizer;
			var lines = info.lines;
			var lineHeights = info.lineHeights;
			var oneLinerHeight = info.oneLinerHeight;

			lineHeights[lines.length - 1] = undefined;
			lines.forEach(function (line, index) {
				if (line && line.length > 1) {
					var e = lineNumberSizer.appendChild(document.createElement('span'));
					e.style.display = 'block';
					e.textContent = line;
				} else {
					lineHeights[index] = oneLinerHeight;
				}
			});
		});

		infos.forEach(function (info) {
			var lineNumberSizer = info.sizer;
			var lineHeights = info.lineHeights;

			var childIndex = 0;
			for (var i = 0; i < lineHeights.length; i++) {
				if (lineHeights[i] === undefined) {
					lineHeights[i] = lineNumberSizer.children[childIndex++].getBoundingClientRect().height;
				}
			}
		});

		infos.forEach(function (info) {
			var lineNumberSizer = info.sizer;
			var wrapper = info.element.querySelector('.line-numbers-rows');

			lineNumberSizer.style.display = 'none';
			lineNumberSizer.innerHTML = '';

			info.lineHeights.forEach(function (height, lineNumber) {
				wrapper.children[lineNumber].style.height = height + 'px';
			});
		});
	}

	/**
	 * Returns style declarations for the element
	 *
	 * @param {Element} element
	 */
	function getStyles(element) {
		if (!element) {
			return null;
		}

		return window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null);
	}

	var lastWidth = undefined;
	window.addEventListener('resize', function () {
		if (config.assumeViewportIndependence && lastWidth === window.innerWidth) {
			return;
		}
		lastWidth = window.innerWidth;

		resizeElements(Array.prototype.slice.call(document.querySelectorAll('pre.' + PLUGIN_NAME)));
	});

	Prism.hooks.add('complete', function (env) {
		if (!env.code) {
			return;
		}

		var code = /** @type {Element} */ (env.element);
		var pre = /** @type {HTMLElement} */ (code.parentNode);

		// works only for <code> wrapped inside <pre> (not inline)
		if (!pre || !/pre/i.test(pre.nodeName)) {
			return;
		}

		// Abort if line numbers already exists
		if (code.querySelector('.line-numbers-rows')) {
			return;
		}

		// only add line numbers if <code> or one of its ancestors has the `line-numbers` class
		if (!Prism.util.isActive(code, PLUGIN_NAME)) {
			return;
		}

		// Remove the class 'line-numbers' from the <code>
		code.classList.remove(PLUGIN_NAME);
		// Add the class 'line-numbers' to the <pre>
		pre.classList.add(PLUGIN_NAME);

		var match = env.code.match(NEW_LINE_EXP);
		var linesNum = match ? match.length + 1 : 1;
		var lineNumbersWrapper;

		var lines = new Array(linesNum + 1).join('<span></span>');

		lineNumbersWrapper = document.createElement('span');
		lineNumbersWrapper.setAttribute('aria-hidden', 'true');
		lineNumbersWrapper.className = 'line-numbers-rows';
		lineNumbersWrapper.innerHTML = lines;

		if (pre.hasAttribute('data-start')) {
			pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);
		}

		env.element.appendChild(lineNumbersWrapper);

		resizeElements([pre]);

		Prism.hooks.run('line-numbers', env);
	});

	Prism.hooks.add('line-numbers', function (env) {
		env.plugins = env.plugins || {};
		env.plugins.lineNumbers = true;
	});

}());
Hm&xapre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}R.x)
!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e="line-numbers",n=/\n(?!$)/g,t=Prism.plugins.lineNumbers={getLine:function(n,t){if("PRE"===n.tagName&&n.classList.contains(e)){var i=n.querySelector(".line-numbers-rows");if(i){var r=parseInt(n.getAttribute("data-start"),10)||1,s=r+(i.children.length-1);t<r&&(t=r),t>s&&(t=s);var l=t-r;return i.children[l]}}},resize:function(e){r([e])},assumeViewportIndependence:!0},i=void 0;window.addEventListener("resize",(function(){t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll("pre.line-numbers"))))})),Prism.hooks.add("complete",(function(t){if(t.code){var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector(".line-numbers-rows")&&Prism.util.isActive(i,e)){i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join("<span></span>");(l=document.createElement("span")).setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=u,s.hasAttribute("data-start")&&(s.style.counterReset="linenumber "+(parseInt(s.getAttribute("data-start"),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run("line-numbers",t)}}})),Prism.hooks.add("line-numbers",(function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}))}function r(e){if(0!=(e=e.filter((function(e){var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)["white-space"];return"pre-wrap"===t||"pre-line"===t}))).length){var t=e.map((function(e){var t=e.querySelector("code"),i=e.querySelector(".line-numbers-rows");if(t&&i){var r=e.querySelector(".line-numbers-sizer"),s=t.textContent.split(n);r||((r=document.createElement("span")).className="line-numbers-sizer",t.appendChild(r)),r.innerHTML="0",r.style.display="block";var l=r.getBoundingClientRect().height;return r.innerHTML="",{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}}})).filter(Boolean);t.forEach((function(e){var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){if(e&&e.length>1){var s=n.appendChild(document.createElement("span"));s.style.display="block",s.textContent=e}else i[t]=r}))})),t.forEach((function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;r<t.length;r++)void 0===t[r]&&(t[r]=n.children[i++].getBoundingClientRect().height)})),t.forEach((function(e){var n=e.sizer,t=e.element.querySelector(".line-numbers-rows");n.style.display="none",n.innerHTML="",e.lineHeights.forEach((function(e,n){t.children[n].style.height=e+"px"}))}))}}}();޿2x/.token.punctuation.brace-hover,
.token.punctuation.brace-selected {
	outline: solid 1px;
}

.rainbow-braces .token.punctuation.brace-level-1,
.rainbow-braces .token.punctuation.brace-level-5,
.rainbow-braces .token.punctuation.brace-level-9 {
	color: #E50;
	opacity: 1;
}
.rainbow-braces .token.punctuation.brace-level-2,
.rainbow-braces .token.punctuation.brace-level-6,
.rainbow-braces .token.punctuation.brace-level-10 {
	color: #0B3;
	opacity: 1;
}
.rainbow-braces .token.punctuation.brace-level-3,
.rainbow-braces .token.punctuation.brace-level-7,
.rainbow-braces .token.punctuation.brace-level-11 {
	color: #26F;
	opacity: 1;
}
.rainbow-braces .token.punctuation.brace-level-4,
.rainbow-braces .token.punctuation.brace-level-8,
.rainbow-braces .token.punctuation.brace-level-12 {
	color: #E0E;
	opacity: 1;
}
sYx((function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	function mapClassName(name) {
		var customClass = Prism.plugins.customClass;
		if (customClass) {
			return customClass.apply(name, 'none');
		} else {
			return name;
		}
	}

	var PARTNER = {
		'(': ')',
		'[': ']',
		'{': '}',
	};

	// The names for brace types.
	// These names have two purposes: 1) they can be used for styling and 2) they are used to pair braces. Only braces
	// of the same type are paired.
	var NAMES = {
		'(': 'brace-round',
		'[': 'brace-square',
		'{': 'brace-curly',
	};

	// A map for brace aliases.
	// This is useful for when some braces have a prefix/suffix as part of the punctuation token.
	var BRACE_ALIAS_MAP = {
		'${': '{', // JS template punctuation (e.g. `foo ${bar + 1}`)
	};

	var LEVEL_WARP = 12;

	var pairIdCounter = 0;

	var BRACE_ID_PATTERN = /^(pair-\d+-)(close|open)$/;

	/**
	 * Returns the brace partner given one brace of a brace pair.
	 *
	 * @param {HTMLElement} brace
	 * @returns {HTMLElement}
	 */
	function getPartnerBrace(brace) {
		var match = BRACE_ID_PATTERN.exec(brace.id);
		return document.querySelector('#' + match[1] + (match[2] == 'open' ? 'close' : 'open'));
	}

	/**
	 * @this {HTMLElement}
	 */
	function hoverBrace() {
		if (!Prism.util.isActive(this, 'brace-hover', true)) {
			return;
		}

		[this, getPartnerBrace(this)].forEach(function (e) {
			e.classList.add(mapClassName('brace-hover'));
		});
	}
	/**
	 * @this {HTMLElement}
	 */
	function leaveBrace() {
		[this, getPartnerBrace(this)].forEach(function (e) {
			e.classList.remove(mapClassName('brace-hover'));
		});
	}
	/**
	 * @this {HTMLElement}
	 */
	function clickBrace() {
		if (!Prism.util.isActive(this, 'brace-select', true)) {
			return;
		}

		[this, getPartnerBrace(this)].forEach(function (e) {
			e.classList.add(mapClassName('brace-selected'));
		});
	}

	Prism.hooks.add('complete', function (env) {

		/** @type {HTMLElement} */
		var code = env.element;
		var pre = code.parentElement;

		if (!pre || pre.tagName != 'PRE') {
			return;
		}

		// find the braces to match
		/** @type {string[]} */
		var toMatch = [];
		if (Prism.util.isActive(code, 'match-braces')) {
			toMatch.push('(', '[', '{');
		}

		if (toMatch.length == 0) {
			// nothing to match
			return;
		}

		if (!pre.__listenerAdded) {
			// code blocks might be highlighted more than once
			pre.addEventListener('mousedown', function removeBraceSelected() {
				// the code element might have been replaced
				var code = pre.querySelector('code');
				var className = mapClassName('brace-selected');
				Array.prototype.slice.call(code.querySelectorAll('.' + className)).forEach(function (e) {
					e.classList.remove(className);
				});
			});
			Object.defineProperty(pre, '__listenerAdded', { value: true });
		}

		/** @type {HTMLSpanElement[]} */
		var punctuation = Array.prototype.slice.call(
			code.querySelectorAll('span.' + mapClassName('token') + '.' + mapClassName('punctuation'))
		);

		/** @type {{ index: number, open: boolean, element: HTMLElement }[]} */
		var allBraces = [];

		toMatch.forEach(function (open) {
			var close = PARTNER[open];
			var name = mapClassName(NAMES[open]);

			/** @type {[number, number][]} */
			var pairs = [];
			/** @type {number[]} */
			var openStack = [];

			for (var i = 0; i < punctuation.length; i++) {
				var element = punctuation[i];
				if (element.childElementCount == 0) {
					var text = element.textContent;
					text = BRACE_ALIAS_MAP[text] || text;
					if (text === open) {
						allBraces.push({ index: i, open: true, element: element });
						element.classList.add(name);
						element.classList.add(mapClassName('brace-open'));
						openStack.push(i);
					} else if (text === close) {
						allBraces.push({ index: i, open: false, element: element });
						element.classList.add(name);
						element.classList.add(mapClassName('brace-close'));
						if (openStack.length) {
							pairs.push([i, openStack.pop()]);
						}
					}
				}
			}

			pairs.forEach(function (pair) {
				var pairId = 'pair-' + (pairIdCounter++) + '-';

				var opening = punctuation[pair[0]];
				var closing = punctuation[pair[1]];

				opening.id = pairId + 'open';
				closing.id = pairId + 'close';

				[opening, closing].forEach(function (e) {
					e.addEventListener('mouseenter', hoverBrace);
					e.addEventListener('mouseleave', leaveBrace);
					e.addEventListener('click', clickBrace);
				});
			});
		});

		var level = 0;
		allBraces.sort(function (a, b) { return a.index - b.index; });
		allBraces.forEach(function (brace) {
			if (brace.open) {
				brace.element.classList.add(mapClassName('brace-level-' + (level % LEVEL_WARP + 1)));
				level++;
			} else {
				level = Math.max(0, level - 1);
				brace.element.classList.add(mapClassName('brace-level-' + (level % LEVEL_WARP + 1)));
			}
		});
	});

}());
vh/x	.token.punctuation.brace-hover,.token.punctuation.brace-selected{outline:solid 1px}.rainbow-braces .token.punctuation.brace-level-1,.rainbow-braces .token.punctuation.brace-level-5,.rainbow-braces .token.punctuation.brace-level-9{color:#e50;opacity:1}.rainbow-braces .token.punctuation.brace-level-10,.rainbow-braces .token.punctuation.brace-level-2,.rainbow-braces .token.punctuation.brace-level-6{color:#0b3;opacity:1}.rainbow-braces .token.punctuation.brace-level-11,.rainbow-braces .token.punctuation.brace-level-3,.rainbow-braces .token.punctuation.brace-level-7{color:#26f;opacity:1}.rainbow-braces .token.punctuation.brace-level-12,.rainbow-braces .token.punctuation.brace-level-4,.rainbow-braces .token.punctuation.brace-level-8{color:#e0e;opacity:1}xV!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e={"(":")","[":"]","{":"}"},t={"(":"brace-round","[":"brace-square","{":"brace-curly"},n={"${":"{"},r=0,c=/^(pair-\d+-)(close|open)$/;Prism.hooks.add("complete",(function(c){var i=c.element,d=i.parentElement;if(d&&"PRE"==d.tagName){var u=[];if(Prism.util.isActive(i,"match-braces")&&u.push("(","[","{"),0!=u.length){d.__listenerAdded||(d.addEventListener("mousedown",(function(){var e=d.querySelector("code"),t=s("brace-selected");Array.prototype.slice.call(e.querySelectorAll("."+t)).forEach((function(e){e.classList.remove(t)}))})),Object.defineProperty(d,"__listenerAdded",{value:!0}));var f=Array.prototype.slice.call(i.querySelectorAll("span."+s("token")+"."+s("punctuation"))),h=[];u.forEach((function(c){for(var i=e[c],d=s(t[c]),u=[],p=[],v=0;v<f.length;v++){var m=f[v];if(0==m.childElementCount){var b=m.textContent;(b=n[b]||b)===c?(h.push({index:v,open:!0,element:m}),m.classList.add(d),m.classList.add(s("brace-open")),p.push(v)):b===i&&(h.push({index:v,open:!1,element:m}),m.classList.add(d),m.classList.add(s("brace-close")),p.length&&u.push([v,p.pop()]))}}u.forEach((function(e){var t="pair-"+r+++"-",n=f[e[0]],c=f[e[1]];n.id=t+"open",c.id=t+"close",[n,c].forEach((function(e){e.addEventListener("mouseenter",a),e.addEventListener("mouseleave",o),e.addEventListener("click",l)}))}))}));var p=0;h.sort((function(e,t){return e.index-t.index})),h.forEach((function(e){e.open?(e.element.classList.add(s("brace-level-"+(p%12+1))),p++):(p=Math.max(0,p-1),e.element.classList.add(s("brace-level-"+(p%12+1))))}))}}}))}function s(e){var t=Prism.plugins.customClass;return t?t.apply(e,"none"):e}function i(e){var t=c.exec(e.id);return document.querySelector("#"+t[1]+("open"==t[2]?"close":"open"))}function a(){Prism.util.isActive(this,"brace-hover",!0)&&[this,i(this)].forEach((function(e){e.classList.add(s("brace-hover"))}))}function o(){[this,i(this)].forEach((function(e){e.classList.remove(s("brace-hover"))}))}function l(){Prism.util.isActive(this,"brace-select",!0)&&[this,i(this)].forEach((function(e){e.classList.add(s("brace-selected"))}))}}();KDx(function () {

	if (typeof Prism === 'undefined') {
		return;
	}

	var assign = Object.assign || function (obj1, obj2) {
		for (var name in obj2) {
			if (obj2.hasOwnProperty(name)) {
				obj1[name] = obj2[name];
			}
		}
		return obj1;
	};

	function NormalizeWhitespace(defaults) {
		this.defaults = assign({}, defaults);
	}

	function toCamelCase(value) {
		return value.replace(/-(\w)/g, function (match, firstChar) {
			return firstChar.toUpperCase();
		});
	}

	function tabLen(str) {
		var res = 0;
		for (var i = 0; i < str.length; ++i) {
			if (str.charCodeAt(i) == '\t'.charCodeAt(0)) {
				res += 3;
			}
		}
		return str.length + res;
	}

	var settingsConfig = {
		'remove-trailing': 'boolean',
		'remove-indent': 'boolean',
		'left-trim': 'boolean',
		'right-trim': 'boolean',
		'break-lines': 'number',
		'indent': 'number',
		'remove-initial-line-feed': 'boolean',
		'tabs-to-spaces': 'number',
		'spaces-to-tabs': 'number',
	};

	NormalizeWhitespace.prototype = {
		setDefaults: function (defaults) {
			this.defaults = assign(this.defaults, defaults);
		},
		normalize: function (input, settings) {
			settings = assign(this.defaults, settings);

			for (var name in settings) {
				var methodName = toCamelCase(name);
				if (name !== 'normalize' && methodName !== 'setDefaults' &&
					settings[name] && this[methodName]) {
					input = this[methodName].call(this, input, settings[name]);
				}
			}

			return input;
		},

		/*
		 * Normalization methods
		 */
		leftTrim: function (input) {
			return input.replace(/^\s+/, '');
		},
		rightTrim: function (input) {
			return input.replace(/\s+$/, '');
		},
		tabsToSpaces: function (input, spaces) {
			spaces = spaces|0 || 4;
			return input.replace(/\t/g, new Array(++spaces).join(' '));
		},
		spacesToTabs: function (input, spaces) {
			spaces = spaces|0 || 4;
			return input.replace(RegExp(' {' + spaces + '}', 'g'), '\t');
		},
		removeTrailing: function (input) {
			return input.replace(/\s*?$/gm, '');
		},
		// Support for deprecated plugin remove-initial-line-feed
		removeInitialLineFeed: function (input) {
			return input.replace(/^(?:\r?\n|\r)/, '');
		},
		removeIndent: function (input) {
			var indents = input.match(/^[^\S\n\r]*(?=\S)/gm);

			if (!indents || !indents[0].length) {
				return input;
			}

			indents.sort(function (a, b) { return a.length - b.length; });

			if (!indents[0].length) {
				return input;
			}

			return input.replace(RegExp('^' + indents[0], 'gm'), '');
		},
		indent: function (input, tabs) {
			return input.replace(/^[^\S\n\r]*(?=\S)/gm, new Array(++tabs).join('\t') + '$&');
		},
		breakLines: function (input, characters) {
			characters = (characters === true) ? 80 : characters|0 || 80;

			var lines = input.split('\n');
			for (var i = 0; i < lines.length; ++i) {
				if (tabLen(lines[i]) <= characters) {
					continue;
				}

				var line = lines[i].split(/(\s+)/g);
				var len = 0;

				for (var j = 0; j < line.length; ++j) {
					var tl = tabLen(line[j]);
					len += tl;
					if (len > characters) {
						line[j] = '\n' + line[j];
						len = tl;
					}
				}
				lines[i] = line.join('');
			}
			return lines.join('\n');
		}
	};

	// Support node modules
	if (typeof module !== 'undefined' && module.exports) {
		module.exports = NormalizeWhitespace;
	}

	Prism.plugins.NormalizeWhitespace = new NormalizeWhitespace({
		'remove-trailing': true,
		'remove-indent': true,
		'left-trim': true,
		'right-trim': true,
		/*'break-lines': 80,
		'indent': 2,
		'remove-initial-line-feed': false,
		'tabs-to-spaces': 4,
		'spaces-to-tabs': 4*/
	});

	Prism.hooks.add('before-sanity-check', function (env) {
		var Normalizer = Prism.plugins.NormalizeWhitespace;

		// Check settings
		if (env.settings && env.settings['whitespace-normalization'] === false) {
			return;
		}

		// Check classes
		if (!Prism.util.isActive(env.element, 'whitespace-normalization', true)) {
			return;
		}

		// Simple mode if there is no env.element
		if ((!env.element || !env.element.parentNode) && env.code) {
			env.code = Normalizer.normalize(env.code, env.settings);
			return;
		}

		// Normal mode
		var pre = env.element.parentNode;
		if (!env.code || !pre || pre.nodeName.toLowerCase() !== 'pre') {
			return;
		}

		if (env.settings == null) { env.settings = {}; }

		// Read settings from 'data-' attributes
		for (var key in settingsConfig) {
			if (Object.hasOwnProperty.call(settingsConfig, key)) {
				var settingType = settingsConfig[key];
				if (pre.hasAttribute('data-' + key)) {
					try {
						var value = JSON.parse(pre.getAttribute('data-' + key) || 'true');
						if (typeof value === settingType) {
							env.settings[key] = value;
						}
					} catch (_error) {
						// ignore error
					}
				}
			}
		}

		var children = pre.childNodes;
		var before = '';
		var after = '';
		var codeFound = false;

		// Move surrounding whitespace from the <pre> tag into the <code> tag
		for (var i = 0; i < children.length; ++i) {
			var node = children[i];

			if (node == env.element) {
				codeFound = true;
			} else if (node.nodeName === '#text') {
				if (codeFound) {
					after += node.nodeValue;
				} else {
					before += node.nodeValue;
				}

				pre.removeChild(node);
				--i;
			}
		}

		if (!env.element.children.length || !Prism.plugins.KeepMarkup) {
			env.code = before + env.code + after;
			env.code = Normalizer.normalize(env.code, env.settings);
		} else {
			// Preserve markup for keep-markup plugin
			var html = before + env.element.innerHTML + after;
			env.element.innerHTML = Normalizer.normalize(html, env.settings);
			env.code = env.element.textContent;
		}
	});

}());
 %xP!function(){if("undefined"!=typeof Prism){var e=Object.assign||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},t={"remove-trailing":"boolean","remove-indent":"boolean","left-trim":"boolean","right-trim":"boolean","break-lines":"number",indent:"number","remove-initial-line-feed":"boolean","tabs-to-spaces":"number","spaces-to-tabs":"number"};n.prototype={setDefaults:function(t){this.defaults=e(this.defaults,t)},normalize:function(t,n){for(var r in n=e(this.defaults,n)){var i=r.replace(/-(\w)/g,(function(e,t){return t.toUpperCase()}));"normalize"!==r&&"setDefaults"!==i&&n[r]&&this[i]&&(t=this[i].call(this,t,n[r]))}return t},leftTrim:function(e){return e.replace(/^\s+/,"")},rightTrim:function(e){return e.replace(/\s+$/,"")},tabsToSpaces:function(e,t){return t=0|t||4,e.replace(/\t/g,new Array(++t).join(" "))},spacesToTabs:function(e,t){return t=0|t||4,e.replace(RegExp(" {"+t+"}","g"),"\t")},removeTrailing:function(e){return e.replace(/\s*?$/gm,"")},removeInitialLineFeed:function(e){return e.replace(/^(?:\r?\n|\r)/,"")},removeIndent:function(e){var t=e.match(/^[^\S\n\r]*(?=\S)/gm);return t&&t[0].length?(t.sort((function(e,t){return e.length-t.length})),t[0].length?e.replace(RegExp("^"+t[0],"gm"),""):e):e},indent:function(e,t){return e.replace(/^[^\S\n\r]*(?=\S)/gm,new Array(++t).join("\t")+"$&")},breakLines:function(e,t){t=!0===t?80:0|t||80;for(var n=e.split("\n"),i=0;i<n.length;++i)if(!(r(n[i])<=t)){for(var o=n[i].split(/(\s+)/g),a=0,l=0;l<o.length;++l){var s=r(o[l]);(a+=s)>t&&(o[l]="\n"+o[l],a=s)}n[i]=o.join("")}return n.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=n),Prism.plugins.NormalizeWhitespace=new n({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",(function(e){var n=Prism.plugins.NormalizeWhitespace;if((!e.settings||!1!==e.settings["whitespace-normalization"])&&Prism.util.isActive(e.element,"whitespace-normalization",!0))if(e.element&&e.element.parentNode||!e.code){var r=e.element.parentNode;if(e.code&&r&&"pre"===r.nodeName.toLowerCase()){for(var i in null==e.settings&&(e.settings={}),t)if(Object.hasOwnProperty.call(t,i)){var o=t[i];if(r.hasAttribute("data-"+i))try{var a=JSON.parse(r.getAttribute("data-"+i)||"true");typeof a===o&&(e.settings[i]=a)}catch(e){}}for(var l=r.childNodes,s="",c="",u=!1,m=0;m<l.length;++m){var f=l[m];f==e.element?u=!0:"#text"===f.nodeName&&(u?c+=f.nodeValue:s+=f.nodeValue,r.removeChild(f),--m)}if(e.element.children.length&&Prism.plugins.KeepMarkup){var d=s+e.element.innerHTML+c;e.element.innerHTML=n.normalize(d,e.settings),e.code=e.element.textContent}else e.code=s+e.code+c,e.code=n.normalize(e.code,e.settings)}}else e.code=n.normalize(e.code,e.settings)}))}function n(t){this.defaults=e({},t)}function r(e){for(var t=0,n=0;n<e.length;++n)e.charCodeAt(n)=="\t".charCodeAt(0)&&(t+=3);return e.length+t}}();xP.prism-previewer,
.prism-previewer:before,
.prism-previewer:after {
	position: absolute;
	pointer-events: none;
}
.prism-previewer,
.prism-previewer:after {
	left: 50%;
}
.prism-previewer {
	margin-top: -48px;
	width: 32px;
	height: 32px;
	margin-left: -16px;
	z-index: 10;

	opacity: 0;
	-webkit-transition: opacity .25s;
	-o-transition: opacity .25s;
	transition: opacity .25s;
}
.prism-previewer.flipped {
	margin-top: 0;
	margin-bottom: -48px;
}
.prism-previewer:before,
.prism-previewer:after {
	content: '';
	position: absolute;
	pointer-events: none;
}
.prism-previewer:before {
	top: -5px;
	right: -5px;
	left: -5px;
	bottom: -5px;
	border-radius: 10px;
	border: 5px solid #fff;
	box-shadow: 0 0 3px rgba(0, 0, 0, 0.5) inset, 0 0 10px rgba(0, 0, 0, 0.75);
}
.prism-previewer:after {
	top: 100%;
	width: 0;
	height: 0;
	margin: 5px 0 0 -7px;
	border: 7px solid transparent;
	border-color: rgba(255, 0, 0, 0);
	border-top-color: #fff;
}
.prism-previewer.flipped:after {
	top: auto;
	bottom: 100%;
	margin-top: 0;
	margin-bottom: 5px;
	border-top-color: rgba(255, 0, 0, 0);
	border-bottom-color: #fff;
}
.prism-previewer.active {
	opacity: 1;
}

.prism-previewer-angle:before {
	border-radius: 50%;
	background: #fff;
}
.prism-previewer-angle:after {
	margin-top: 4px;
}
.prism-previewer-angle svg {
	width: 32px;
	height: 32px;
	-webkit-transform: rotate(-90deg);
	-moz-transform: rotate(-90deg);
	-ms-transform: rotate(-90deg);
	-o-transform: rotate(-90deg);
	transform: rotate(-90deg);
}
.prism-previewer-angle[data-negative] svg {
	-webkit-transform: scaleX(-1) rotate(-90deg);
	-moz-transform: scaleX(-1) rotate(-90deg);
	-ms-transform: scaleX(-1) rotate(-90deg);
	-o-transform: scaleX(-1) rotate(-90deg);
	transform: scaleX(-1) rotate(-90deg);
}
.prism-previewer-angle circle {
	fill: transparent;
	stroke: hsl(200, 10%, 20%);
	stroke-opacity: 0.9;
	stroke-width: 32;
	stroke-dasharray: 0, 500;
}

.prism-previewer-gradient {
	background-image: linear-gradient(45deg, #bbb 25%, transparent 25%, transparent 75%, #bbb 75%, #bbb), linear-gradient(45deg, #bbb 25%, #eee 25%, #eee 75%, #bbb 75%, #bbb);
	background-size: 10px 10px;
	background-position: 0 0, 5px 5px;

	width: 64px;
	margin-left: -32px;
}
.prism-previewer-gradient:before {
	content: none;
}
.prism-previewer-gradient div {
	position: absolute;
	top: -5px;
	left: -5px;
	right: -5px;
	bottom: -5px;
	border-radius: 10px;
	border: 5px solid #fff;
	box-shadow: 0 0 3px rgba(0, 0, 0, 0.5) inset, 0 0 10px rgba(0, 0, 0, 0.75);
}

.prism-previewer-color {
	background-image: linear-gradient(45deg, #bbb 25%, transparent 25%, transparent 75%, #bbb 75%, #bbb), linear-gradient(45deg, #bbb 25%, #eee 25%, #eee 75%, #bbb 75%, #bbb);
	background-size: 10px 10px;
	background-position: 0 0, 5px 5px;
}
.prism-previewer-color:before {
	background-color: inherit;
	background-clip: padding-box;
}

.prism-previewer-easing {
	margin-top: -76px;
	margin-left: -30px;
	width: 60px;
	height: 60px;
	background: #333;
}
.prism-previewer-easing.flipped {
	margin-bottom: -116px;
}
.prism-previewer-easing svg {
	width: 60px;
	height: 60px;
}
.prism-previewer-easing circle {
	fill: hsl(200, 10%, 20%);
	stroke: white;
}
.prism-previewer-easing path {
	fill: none;
	stroke: white;
	stroke-linecap: round;
	stroke-width: 4;
}
.prism-previewer-easing line {
	stroke: white;
	stroke-opacity: 0.5;
	stroke-width: 2;
}

@-webkit-keyframes prism-previewer-time {
	0% {
		stroke-dasharray: 0, 500;
		stroke-dashoffset: 0;
	}
	50% {
		stroke-dasharray: 100, 500;
		stroke-dashoffset: 0;
	}
	100% {
		stroke-dasharray: 0, 500;
		stroke-dashoffset: -100;
	}
}

@-o-keyframes prism-previewer-time {
	0% {
		stroke-dasharray: 0, 500;
		stroke-dashoffset: 0;
	}
	50% {
		stroke-dasharray: 100, 500;
		stroke-dashoffset: 0;
	}
	100% {
		stroke-dasharray: 0, 500;
		stroke-dashoffset: -100;
	}
}

@-moz-keyframes prism-previewer-time {
	0% {
		stroke-dasharray: 0, 500;
		stroke-dashoffset: 0;
	}
	50% {
		stroke-dasharray: 100, 500;
		stroke-dashoffset: 0;
	}
	100% {
		stroke-dasharray: 0, 500;
		stroke-dashoffset: -100;
	}
}

@keyframes prism-previewer-time {
	0% {
		stroke-dasharray: 0, 500;
		stroke-dashoffset: 0;
	}
	50% {
		stroke-dasharray: 100, 500;
		stroke-dashoffset: 0;
	}
	100% {
		stroke-dasharray: 0, 500;
		stroke-dashoffset: -100;
	}
}

.prism-previewer-time:before {
	border-radius: 50%;
	background: #fff;
}
.prism-previewer-time:after {
	margin-top: 4px;
}
.prism-previewer-time svg {
	width: 32px;
	height: 32px;
	-webkit-transform: rotate(-90deg);
	-moz-transform: rotate(-90deg);
	-ms-transform: rotate(-90deg);
	-o-transform: rotate(-90deg);
	transform: rotate(-90deg);
}
.prism-previewer-time circle {
	fill: transparent;
	stroke: hsl(200, 10%, 20%);
	stroke-opacity: 0.9;
	stroke-width: 32;
	stroke-dasharray: 0, 500;
	stroke-dashoffset: 0;
	-webkit-animation: prism-previewer-time linear infinite 3s;
	-moz-animation: prism-previewer-time linear infinite 3s;
	-o-animation: prism-previewer-time linear infinite 3s;
	animation: prism-previewer-time linear infinite 3s;
}`L;	xN@(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined' || !Function.prototype.bind) {
		return;
	}

	var previewers = {
		// gradient must be defined before color and angle
		'gradient': {
			create: (function () {

				// Stores already processed gradients so that we don't
				// make the conversion every time the previewer is shown
				var cache = {};

				/**
				 * Returns a W3C-valid linear gradient
				 *
				 * @param {string} prefix Vendor prefix if any ("-moz-", "-webkit-", etc.)
				 * @param {string} func Gradient function name ("linear-gradient")
				 * @param {string[]} values Array of the gradient function parameters (["0deg", "red 0%", "blue 100%"])
				 */
				var convertToW3CLinearGradient = function (prefix, func, values) {
					// Default value for angle
					var angle = '180deg';

					if (/^(?:-?(?:\d+(?:\.\d+)?|\.\d+)(?:deg|rad)|to\b|top|right|bottom|left)/.test(values[0])) {
						angle = values.shift();
						if (angle.indexOf('to ') < 0) {
							// Angle uses old keywords
							// W3C syntax uses "to" + opposite keywords
							if (angle.indexOf('top') >= 0) {
								if (angle.indexOf('left') >= 0) {
									angle = 'to bottom right';
								} else if (angle.indexOf('right') >= 0) {
									angle = 'to bottom left';
								} else {
									angle = 'to bottom';
								}
							} else if (angle.indexOf('bottom') >= 0) {
								if (angle.indexOf('left') >= 0) {
									angle = 'to top right';
								} else if (angle.indexOf('right') >= 0) {
									angle = 'to top left';
								} else {
									angle = 'to top';
								}
							} else if (angle.indexOf('left') >= 0) {
								angle = 'to right';
							} else if (angle.indexOf('right') >= 0) {
								angle = 'to left';
							} else if (prefix) {
								// Angle is shifted by 90deg in prefixed gradients
								if (angle.indexOf('deg') >= 0) {
									angle = (90 - parseFloat(angle)) + 'deg';
								} else if (angle.indexOf('rad') >= 0) {
									angle = (Math.PI / 2 - parseFloat(angle)) + 'rad';
								}
							}
						}
					}

					return func + '(' + angle + ',' + values.join(',') + ')';
				};

				/**
				 * Returns a W3C-valid radial gradient
				 *
				 * @param {string} prefix Vendor prefix if any ("-moz-", "-webkit-", etc.)
				 * @param {string} func Gradient function name ("linear-gradient")
				 * @param {string[]} values Array of the gradient function parameters (["0deg", "red 0%", "blue 100%"])
				 */
				var convertToW3CRadialGradient = function (prefix, func, values) {
					if (values[0].indexOf('at') < 0) {
						// Looks like old syntax

						// Default values
						var position = 'center';
						var shape = 'ellipse';
						var size = 'farthest-corner';

						if (/\b(?:bottom|center|left|right|top)\b|^\d+/.test(values[0])) {
							// Found a position
							// Remove angle value, if any
							position = values.shift().replace(/\s*-?\d+(?:deg|rad)\s*/, '');
						}
						if (/\b(?:circle|closest|contain|cover|ellipse|farthest)\b/.test(values[0])) {
							// Found a shape and/or size
							var shapeSizeParts = values.shift().split(/\s+/);
							if (shapeSizeParts[0] && (shapeSizeParts[0] === 'circle' || shapeSizeParts[0] === 'ellipse')) {
								shape = shapeSizeParts.shift();
							}
							if (shapeSizeParts[0]) {
								size = shapeSizeParts.shift();
							}

							// Old keywords are converted to their synonyms
							if (size === 'cover') {
								size = 'farthest-corner';
							} else if (size === 'contain') {
								size = 'clothest-side';
							}
						}

						return func + '(' + shape + ' ' + size + ' at ' + position + ',' + values.join(',') + ')';
					}
					return func + '(' + values.join(',') + ')';
				};

				/**
				 * Converts a gradient to a W3C-valid one
				 * Does not support old webkit syntax (-webkit-gradient(linear...) and -webkit-gradient(radial...))
				 *
				 * @param {string} gradient The CSS gradient
				 */
				var convertToW3CGradient = function (gradient) {
					if (cache[gradient]) {
						return cache[gradient];
					}
					var parts = gradient.match(/^(\b|\B-[a-z]{1,10}-)((?:repeating-)?(?:linear|radial)-gradient)/);
					// "", "-moz-", etc.
					var prefix = parts && parts[1];
					// "linear-gradient", "radial-gradient", etc.
					var func = parts && parts[2];

					var values = gradient.replace(/^(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\(|\)$/g, '').split(/\s*,\s*/);

					if (func.indexOf('linear') >= 0) {
						return cache[gradient] = convertToW3CLinearGradient(prefix, func, values);
					} else if (func.indexOf('radial') >= 0) {
						return cache[gradient] = convertToW3CRadialGradient(prefix, func, values);
					}
					return cache[gradient] = func + '(' + values.join(',') + ')';
				};

				return function () {
					new Prism.plugins.Previewer('gradient', function (value) {
						this.firstChild.style.backgroundImage = '';
						this.firstChild.style.backgroundImage = convertToW3CGradient(value);
						return !!this.firstChild.style.backgroundImage;
					}, '*', function () {
						this._elt.innerHTML = '<div></div>';
					});
				};
			}()),
			tokens: {
				'gradient': {
					pattern: /(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:hsl|rgb)a?\(.+?\)|[^\)])+\)/gi,
					inside: {
						'function': /[\w-]+(?=\()/,
						'punctuation': /[(),]/
					}
				}
			},
			languages: {
				'css': true,
				'less': true,
				'sass': [
					{
						lang: 'sass',
						before: 'punctuation',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['variable-line']
					},
					{
						lang: 'sass',
						before: 'punctuation',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['property-line']
					}
				],
				'scss': true,
				'stylus': [
					{
						lang: 'stylus',
						before: 'func',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside
					},
					{
						lang: 'stylus',
						before: 'func',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside
					}
				]
			}
		},
		'angle': {
			create: function () {
				new Prism.plugins.Previewer('angle', function (value) {
					var num = parseFloat(value);
					var unit = value.match(/[a-z]+$/i);
					var max; var percentage;
					if (!num || !unit) {
						return false;
					}
					unit = unit[0];

					switch (unit) {
						case 'deg':
							max = 360;
							break;
						case 'grad':
							max = 400;
							break;
						case 'rad':
							max = 2 * Math.PI;
							break;
						case 'turn':
							max = 1;
					}

					percentage = 100 * num / max;
					percentage %= 100;

					this[(num < 0 ? 'set' : 'remove') + 'Attribute']('data-negative', '');
					this.querySelector('circle').style.strokeDasharray = Math.abs(percentage) + ',500';
					return true;
				}, '*', function () {
					this._elt.innerHTML = '<svg viewBox="0 0 64 64">' +
						'<circle r="16" cy="32" cx="32"></circle>' +
						'</svg>';
				});
			},
			tokens: {
				'angle': /(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)(?:deg|g?rad|turn)\b/i
			},
			languages: {
				'css': true,
				'less': true,
				'markup': {
					lang: 'markup',
					before: 'punctuation',
					inside: 'inside',
					root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value']
				},
				'sass': [
					{
						lang: 'sass',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['property-line']
					},
					{
						lang: 'sass',
						before: 'operator',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['variable-line']
					}
				],
				'scss': true,
				'stylus': [
					{
						lang: 'stylus',
						before: 'func',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside
					},
					{
						lang: 'stylus',
						before: 'func',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside
					}
				]
			}
		},
		'color': {
			create: function () {
				new Prism.plugins.Previewer('color', function (value) {
					this.style.backgroundColor = '';
					this.style.backgroundColor = value;
					return !!this.style.backgroundColor;
				});
			},
			tokens: {
				'color': [Prism.languages.css['hexcode']].concat(Prism.languages.css['color'])
			},
			languages: {
				// CSS extras is required, so css and scss are not necessary
				'css': false,
				'less': true,
				'markup': {
					lang: 'markup',
					before: 'punctuation',
					inside: 'inside',
					root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value']
				},
				'sass': [
					{
						lang: 'sass',
						before: 'punctuation',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['variable-line']
					},
					{
						lang: 'sass',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['property-line']
					}
				],
				'scss': false,
				'stylus': [
					{
						lang: 'stylus',
						before: 'hexcode',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside
					},
					{
						lang: 'stylus',
						before: 'hexcode',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside
					}
				]
			}
		},
		'easing': {
			create: function () {
				new Prism.plugins.Previewer('easing', function (value) {

					value = {
						'linear': '0,0,1,1',
						'ease': '.25,.1,.25,1',
						'ease-in': '.42,0,1,1',
						'ease-out': '0,0,.58,1',
						'ease-in-out': '.42,0,.58,1'
					}[value] || value;

					var p = value.match(/-?(?:\d+(?:\.\d+)?|\.\d+)/g);

					if (p.length === 4) {
						p = p.map(function (p, i) { return (i % 2 ? 1 - p : p) * 100; });

						this.querySelector('path').setAttribute('d', 'M0,100 C' + p[0] + ',' + p[1] + ', ' + p[2] + ',' + p[3] + ', 100,0');

						var lines = this.querySelectorAll('line');
						lines[0].setAttribute('x2', p[0]);
						lines[0].setAttribute('y2', p[1]);
						lines[1].setAttribute('x2', p[2]);
						lines[1].setAttribute('y2', p[3]);

						return true;
					}

					return false;
				}, '*', function () {
					this._elt.innerHTML = '<svg viewBox="-20 -20 140 140" width="100" height="100">' +
						'<defs>' +
						'<marker id="prism-previewer-easing-marker" viewBox="0 0 4 4" refX="2" refY="2" markerUnits="strokeWidth">' +
						'<circle cx="2" cy="2" r="1.5" />' +
						'</marker>' +
						'</defs>' +
						'<path d="M0,100 C20,50, 40,30, 100,0" />' +
						'<line x1="0" y1="100" x2="20" y2="50" marker-start="url(#prism-previewer-easing-marker)" marker-end="url(#prism-previewer-easing-marker)" />' +
						'<line x1="100" y1="0" x2="40" y2="30" marker-start="url(#prism-previewer-easing-marker)" marker-end="url(#prism-previewer-easing-marker)" />' +
						'</svg>';
				});
			},
			tokens: {
				'easing': {
					pattern: /\bcubic-bezier\((?:-?(?:\d+(?:\.\d+)?|\.\d+),\s*){3}-?(?:\d+(?:\.\d+)?|\.\d+)\)\B|\b(?:ease(?:-in)?(?:-out)?|linear)(?=\s|[;}]|$)/i,
					inside: {
						'function': /[\w-]+(?=\()/,
						'punctuation': /[(),]/
					}
				}
			},
			languages: {
				'css': true,
				'less': true,
				'sass': [
					{
						lang: 'sass',
						inside: 'inside',
						before: 'punctuation',
						root: Prism.languages.sass && Prism.languages.sass['variable-line']
					},
					{
						lang: 'sass',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['property-line']
					}
				],
				'scss': true,
				'stylus': [
					{
						lang: 'stylus',
						before: 'hexcode',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside
					},
					{
						lang: 'stylus',
						before: 'hexcode',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside
					}
				]
			}
		},

		'time': {
			create: function () {
				new Prism.plugins.Previewer('time', function (value) {
					var num = parseFloat(value);
					var unit = value.match(/[a-z]+$/i);
					if (!num || !unit) {
						return false;
					}
					unit = unit[0];
					this.querySelector('circle').style.animationDuration = 2 * num + unit;
					return true;
				}, '*', function () {
					this._elt.innerHTML = '<svg viewBox="0 0 64 64">' +
						'<circle r="16" cy="32" cx="32"></circle>' +
						'</svg>';
				});
			},
			tokens: {
				'time': /(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)m?s\b/i
			},
			languages: {
				'css': true,
				'less': true,
				'markup': {
					lang: 'markup',
					before: 'punctuation',
					inside: 'inside',
					root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value']
				},
				'sass': [
					{
						lang: 'sass',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['property-line']
					},
					{
						lang: 'sass',
						before: 'operator',
						inside: 'inside',
						root: Prism.languages.sass && Prism.languages.sass['variable-line']
					}
				],
				'scss': true,
				'stylus': [
					{
						lang: 'stylus',
						before: 'hexcode',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside
					},
					{
						lang: 'stylus',
						before: 'hexcode',
						inside: 'rest',
						root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside
					}
				]
			}
		}
	};

	/**
	 * Returns the absolute X, Y offsets for an element
	 *
	 * @param {HTMLElement} element
	 * @returns {{top: number, right: number, bottom: number, left: number, width: number, height: number}}
	 */
	var getOffset = function (element) {
		var elementBounds = element.getBoundingClientRect();
		var left = elementBounds.left;
		var top = elementBounds.top;
		var documentBounds = document.documentElement.getBoundingClientRect();
		left -= documentBounds.left;
		top -= documentBounds.top;

		return {
			top: top,
			right: innerWidth - left - elementBounds.width,
			bottom: innerHeight - top - elementBounds.height,
			left: left,
			width: elementBounds.width,
			height: elementBounds.height
		};
	};

	var TOKEN_CLASS = 'token';
	var ACTIVE_CLASS = 'active';
	var FLIPPED_CLASS = 'flipped';

	/**
	 * Previewer constructor
	 *
	 * @param {string} type Unique previewer type
	 * @param {Function} updater Function that will be called on mouseover.
	 * @param {string[]|string} [supportedLanguages] Aliases of the languages this previewer must be enabled for. Defaults to "*", all languages.
	 * @param {Function} [initializer] Function that will be called on initialization.
	 * @class
	 */
	var Previewer = function (type, updater, supportedLanguages, initializer) {
		this._elt = null;
		this._type = type;
		this._token = null;
		this.updater = updater;
		this._mouseout = this.mouseout.bind(this);
		this.initializer = initializer;

		var self = this;

		if (!supportedLanguages) {
			supportedLanguages = ['*'];
		}
		if (!Array.isArray(supportedLanguages)) {
			supportedLanguages = [supportedLanguages];
		}
		supportedLanguages.forEach(function (lang) {
			if (typeof lang !== 'string') {
				lang = lang.lang;
			}
			if (!Previewer.byLanguages[lang]) {
				Previewer.byLanguages[lang] = [];
			}
			if (Previewer.byLanguages[lang].indexOf(self) < 0) {
				Previewer.byLanguages[lang].push(self);
			}
		});
		Previewer.byType[type] = this;
	};

	/**
	 * Creates the HTML element for the previewer.
	 */
	Previewer.prototype.init = function () {
		if (this._elt) {
			return;
		}
		this._elt = document.createElement('div');
		this._elt.className = 'prism-previewer prism-previewer-' + this._type;
		document.body.appendChild(this._elt);
		if (this.initializer) {
			this.initializer();
		}
	};

	/**
	 * @param {Element} token
	 * @returns {boolean}
	 */
	Previewer.prototype.isDisabled = function (token) {
		do {
			if (token.hasAttribute && token.hasAttribute('data-previewers')) {
				var previewers = token.getAttribute('data-previewers');
				return (previewers || '').split(/\s+/).indexOf(this._type) === -1;
			}
		} while ((token = token.parentNode));
		return false;
	};

	/**
	 * Checks the class name of each hovered element
	 *
	 * @param {Element} token
	 */
	Previewer.prototype.check = function (token) {
		if (token.classList.contains(TOKEN_CLASS) && this.isDisabled(token)) {
			return;
		}
		do {
			if (token.classList && token.classList.contains(TOKEN_CLASS) && token.classList.contains(this._type)) {
				break;
			}
		} while ((token = token.parentNode));

		if (token && token !== this._token) {
			this._token = token;
			this.show();
		}
	};

	/**
	 * Called on mouseout
	 */
	Previewer.prototype.mouseout = function () {
		this._token.removeEventListener('mouseout', this._mouseout, false);
		this._token = null;
		this.hide();
	};

	/**
	 * Shows the previewer positioned properly for the current token.
	 */
	Previewer.prototype.show = function () {
		if (!this._elt) {
			this.init();
		}
		if (!this._token) {
			return;
		}

		if (this.updater.call(this._elt, this._token.textContent)) {
			this._token.addEventListener('mouseout', this._mouseout, false);

			var offset = getOffset(this._token);
			this._elt.classList.add(ACTIVE_CLASS);

			if (offset.top - this._elt.offsetHeight > 0) {
				this._elt.classList.remove(FLIPPED_CLASS);
				this._elt.style.top = offset.top + 'px';
				this._elt.style.bottom = '';
			} else {
				this._elt.classList.add(FLIPPED_CLASS);
				this._elt.style.bottom = offset.bottom + 'px';
				this._elt.style.top = '';
			}

			this._elt.style.left = offset.left + Math.min(200, offset.width / 2) + 'px';
		} else {
			this.hide();
		}
	};

	/**
	 * Hides the previewer.
	 */
	Previewer.prototype.hide = function () {
		this._elt.classList.remove(ACTIVE_CLASS);
	};

	/**
	 * Map of all registered previewers by language
	 *
	 * @type {{}}
	 */
	Previewer.byLanguages = {};

	/**
	 * Map of all registered previewers by type
	 *
	 * @type {{}}
	 */
	Previewer.byType = {};

	/**
	 * Initializes the mouseover event on the code block.
	 *
	 * @param {HTMLElement} elt The code block (env.element)
	 * @param {string} lang The language (env.language)
	 */
	Previewer.initEvents = function (elt, lang) {
		var previewers = [];
		if (Previewer.byLanguages[lang]) {
			previewers = previewers.concat(Previewer.byLanguages[lang]);
		}
		if (Previewer.byLanguages['*']) {
			previewers = previewers.concat(Previewer.byLanguages['*']);
		}
		elt.addEventListener('mouseover', function (e) {
			var target = e.target;
			previewers.forEach(function (previewer) {
				previewer.check(target);
			});
		}, false);
	};
	Prism.plugins.Previewer = Previewer;

	Prism.hooks.add('before-highlight', function (env) {
		for (var previewer in previewers) {
			var languages = previewers[previewer].languages;
			if (env.language && languages[env.language] && !languages[env.language].initialized) {
				var lang = languages[env.language];
				if (!Array.isArray(lang)) {
					lang = [lang];
				}
				lang.forEach(function (lang) {
					var before; var inside; var root; var skip;
					if (lang === true) {
						before = 'important';
						inside = env.language;
						lang = env.language;
					} else {
						before = lang.before || 'important';
						inside = lang.inside || lang.lang;
						root = lang.root || Prism.languages;
						skip = lang.skip;
						lang = env.language;
					}

					if (!skip && Prism.languages[lang]) {
						Prism.languages.insertBefore(inside, before, previewers[previewer].tokens, root);
						env.grammar = Prism.languages[lang];

						languages[env.language] = { initialized: true };
					}
				});
			}
		}
	});

	// Initialize the previewers only when needed
	Prism.hooks.add('after-highlight', function (env) {
		if (Previewer.byLanguages['*'] || Previewer.byLanguages[env.language]) {
			Previewer.initEvents(env.element, env.language);
		}
	});

	for (var previewer in previewers) {
		previewers[previewer].create();
	}

}());
/xA.prism-previewer,.prism-previewer:after,.prism-previewer:before{position:absolute;pointer-events:none}.prism-previewer,.prism-previewer:after{left:50%}.prism-previewer{margin-top:-48px;width:32px;height:32px;margin-left:-16px;z-index:10;opacity:0;-webkit-transition:opacity .25s;-o-transition:opacity .25s;transition:opacity .25s}.prism-previewer.flipped{margin-top:0;margin-bottom:-48px}.prism-previewer:after,.prism-previewer:before{content:'';position:absolute;pointer-events:none}.prism-previewer:before{top:-5px;right:-5px;left:-5px;bottom:-5px;border-radius:10px;border:5px solid #fff;box-shadow:0 0 3px rgba(0,0,0,.5) inset,0 0 10px rgba(0,0,0,.75)}.prism-previewer:after{top:100%;width:0;height:0;margin:5px 0 0 -7px;border:7px solid transparent;border-color:rgba(255,0,0,0);border-top-color:#fff}.prism-previewer.flipped:after{top:auto;bottom:100%;margin-top:0;margin-bottom:5px;border-top-color:rgba(255,0,0,0);border-bottom-color:#fff}.prism-previewer.active{opacity:1}.prism-previewer-angle:before{border-radius:50%;background:#fff}.prism-previewer-angle:after{margin-top:4px}.prism-previewer-angle svg{width:32px;height:32px;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.prism-previewer-angle[data-negative] svg{-webkit-transform:scaleX(-1) rotate(-90deg);-moz-transform:scaleX(-1) rotate(-90deg);-ms-transform:scaleX(-1) rotate(-90deg);-o-transform:scaleX(-1) rotate(-90deg);transform:scaleX(-1) rotate(-90deg)}.prism-previewer-angle circle{fill:transparent;stroke:#2d3438;stroke-opacity:.9;stroke-width:32;stroke-dasharray:0,500}.prism-previewer-gradient{background-image:linear-gradient(45deg,#bbb 25%,transparent 25%,transparent 75%,#bbb 75%,#bbb),linear-gradient(45deg,#bbb 25%,#eee 25%,#eee 75%,#bbb 75%,#bbb);background-size:10px 10px;background-position:0 0,5px 5px;width:64px;margin-left:-32px}.prism-previewer-gradient:before{content:none}.prism-previewer-gradient div{position:absolute;top:-5px;left:-5px;right:-5px;bottom:-5px;border-radius:10px;border:5px solid #fff;box-shadow:0 0 3px rgba(0,0,0,.5) inset,0 0 10px rgba(0,0,0,.75)}.prism-previewer-color{background-image:linear-gradient(45deg,#bbb 25%,transparent 25%,transparent 75%,#bbb 75%,#bbb),linear-gradient(45deg,#bbb 25%,#eee 25%,#eee 75%,#bbb 75%,#bbb);background-size:10px 10px;background-position:0 0,5px 5px}.prism-previewer-color:before{background-color:inherit;background-clip:padding-box}.prism-previewer-easing{margin-top:-76px;margin-left:-30px;width:60px;height:60px;background:#333}.prism-previewer-easing.flipped{margin-bottom:-116px}.prism-previewer-easing svg{width:60px;height:60px}.prism-previewer-easing circle{fill:#2d3438;stroke:#fff}.prism-previewer-easing path{fill:none;stroke:#fff;stroke-linecap:round;stroke-width:4}.prism-previewer-easing line{stroke:#fff;stroke-opacity:.5;stroke-width:2}@-webkit-keyframes prism-previewer-time{0%{stroke-dasharray:0,500;stroke-dashoffset:0}50%{stroke-dasharray:100,500;stroke-dashoffset:0}100%{stroke-dasharray:0,500;stroke-dashoffset:-100}}@-o-keyframes prism-previewer-time{0%{stroke-dasharray:0,500;stroke-dashoffset:0}50%{stroke-dasharray:100,500;stroke-dashoffset:0}100%{stroke-dasharray:0,500;stroke-dashoffset:-100}}@-moz-keyframes prism-previewer-time{0%{stroke-dasharray:0,500;stroke-dashoffset:0}50%{stroke-dasharray:100,500;stroke-dashoffset:0}100%{stroke-dasharray:0,500;stroke-dashoffset:-100}}@keyframes prism-previewer-time{0%{stroke-dasharray:0,500;stroke-dashoffset:0}50%{stroke-dasharray:100,500;stroke-dashoffset:0}100%{stroke-dasharray:0,500;stroke-dashoffset:-100}}.prism-previewer-time:before{border-radius:50%;background:#fff}.prism-previewer-time:after{margin-top:4px}.prism-previewer-time svg{width:32px;height:32px;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.prism-previewer-time circle{fill:transparent;stroke:#2d3438;stroke-opacity:.9;stroke-width:32;stroke-dasharray:0,500;stroke-dashoffset:0;-webkit-animation:prism-previewer-time linear infinite 3s;-moz-animation:prism-previewer-time linear infinite 3s;-o-animation:prism-previewer-time linear infinite 3s;animation:prism-previewer-time linear infinite 3s}i
*x\)!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document&&Function.prototype.bind){var e,s,t={gradient:{create:(e={},s=function(s){if(e[s])return e[s];var t=s.match(/^(\b|\B-[a-z]{1,10}-)((?:repeating-)?(?:linear|radial)-gradient)/),i=t&&t[1],a=t&&t[2],n=s.replace(/^(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\(|\)$/g,"").split(/\s*,\s*/);return a.indexOf("linear")>=0?e[s]=function(e,s,t){var i="180deg";return/^(?:-?(?:\d+(?:\.\d+)?|\.\d+)(?:deg|rad)|to\b|top|right|bottom|left)/.test(t[0])&&(i=t.shift()).indexOf("to ")<0&&(i.indexOf("top")>=0?i=i.indexOf("left")>=0?"to bottom right":i.indexOf("right")>=0?"to bottom left":"to bottom":i.indexOf("bottom")>=0?i=i.indexOf("left")>=0?"to top right":i.indexOf("right")>=0?"to top left":"to top":i.indexOf("left")>=0?i="to right":i.indexOf("right")>=0?i="to left":e&&(i.indexOf("deg")>=0?i=90-parseFloat(i)+"deg":i.indexOf("rad")>=0&&(i=Math.PI/2-parseFloat(i)+"rad"))),s+"("+i+","+t.join(",")+")"}(i,a,n):a.indexOf("radial")>=0?e[s]=function(e,s,t){if(t[0].indexOf("at")<0){var i="center",a="ellipse",n="farthest-corner";if(/\b(?:bottom|center|left|right|top)\b|^\d+/.test(t[0])&&(i=t.shift().replace(/\s*-?\d+(?:deg|rad)\s*/,"")),/\b(?:circle|closest|contain|cover|ellipse|farthest)\b/.test(t[0])){var r=t.shift().split(/\s+/);!r[0]||"circle"!==r[0]&&"ellipse"!==r[0]||(a=r.shift()),r[0]&&(n=r.shift()),"cover"===n?n="farthest-corner":"contain"===n&&(n="clothest-side")}return s+"("+a+" "+n+" at "+i+","+t.join(",")+")"}return s+"("+t.join(",")+")"}(0,a,n):e[s]=a+"("+n.join(",")+")"},function(){new Prism.plugins.Previewer("gradient",(function(e){return this.firstChild.style.backgroundImage="",this.firstChild.style.backgroundImage=s(e),!!this.firstChild.style.backgroundImage}),"*",(function(){this._elt.innerHTML="<div></div>"}))}),tokens:{gradient:{pattern:/(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:hsl|rgb)a?\(.+?\)|[^\)])+\)/gi,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},angle:{create:function(){new Prism.plugins.Previewer("angle",(function(e){var s,t,i=parseFloat(e),a=e.match(/[a-z]+$/i);if(!i||!a)return!1;switch(a=a[0]){case"deg":s=360;break;case"grad":s=400;break;case"rad":s=2*Math.PI;break;case"turn":s=1}return t=100*i/s,t%=100,this[(i<0?"set":"remove")+"Attribute"]("data-negative",""),this.querySelector("circle").style.strokeDasharray=Math.abs(t)+",500",!0}),"*",(function(){this._elt.innerHTML='<svg viewBox="0 0 64 64"><circle r="16" cy="32" cx="32"></circle></svg>'}))},tokens:{angle:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)(?:deg|g?rad|turn)\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},color:{create:function(){new Prism.plugins.Previewer("color",(function(e){return this.style.backgroundColor="",this.style.backgroundColor=e,!!this.style.backgroundColor}))},tokens:{color:[Prism.languages.css.hexcode].concat(Prism.languages.css.color)},languages:{css:!1,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!1,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},easing:{create:function(){new Prism.plugins.Previewer("easing",(function(e){var s=(e={linear:"0,0,1,1",ease:".25,.1,.25,1","ease-in":".42,0,1,1","ease-out":"0,0,.58,1","ease-in-out":".42,0,.58,1"}[e]||e).match(/-?(?:\d+(?:\.\d+)?|\.\d+)/g);if(4===s.length){s=s.map((function(e,s){return 100*(s%2?1-e:e)})),this.querySelector("path").setAttribute("d","M0,100 C"+s[0]+","+s[1]+", "+s[2]+","+s[3]+", 100,0");var t=this.querySelectorAll("line");return t[0].setAttribute("x2",s[0]),t[0].setAttribute("y2",s[1]),t[1].setAttribute("x2",s[2]),t[1].setAttribute("y2",s[3]),!0}return!1}),"*",(function(){this._elt.innerHTML='<svg viewBox="-20 -20 140 140" width="100" height="100"><defs><marker id="prism-previewer-easing-marker" viewBox="0 0 4 4" refX="2" refY="2" markerUnits="strokeWidth"><circle cx="2" cy="2" r="1.5" /></marker></defs><path d="M0,100 C20,50, 40,30, 100,0" /><line x1="0" y1="100" x2="20" y2="50" marker-start="url(#prism-previewer-easing-marker)" marker-end="url(#prism-previewer-easing-marker)" /><line x1="100" y1="0" x2="40" y2="30" marker-start="url(#prism-previewer-easing-marker)" marker-end="url(#prism-previewer-easing-marker)" /></svg>'}))},tokens:{easing:{pattern:/\bcubic-bezier\((?:-?(?:\d+(?:\.\d+)?|\.\d+),\s*){3}-?(?:\d+(?:\.\d+)?|\.\d+)\)\B|\b(?:ease(?:-in)?(?:-out)?|linear)(?=\s|[;}]|$)/i,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",inside:"inside",before:"punctuation",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},time:{create:function(){new Prism.plugins.Previewer("time",(function(e){var s=parseFloat(e),t=e.match(/[a-z]+$/i);return!(!s||!t||(t=t[0],this.querySelector("circle").style.animationDuration=2*s+t,0))}),"*",(function(){this._elt.innerHTML='<svg viewBox="0 0 64 64"><circle r="16" cy="32" cx="32"></circle></svg>'}))},tokens:{time:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)m?s\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}}},i="token",a="active",n="flipped",r=function(e,s,t,i){this._elt=null,this._type=e,this._token=null,this.updater=s,this._mouseout=this.mouseout.bind(this),this.initializer=i;var a=this;t||(t=["*"]),Array.isArray(t)||(t=[t]),t.forEach((function(e){"string"!=typeof e&&(e=e.lang),r.byLanguages[e]||(r.byLanguages[e]=[]),r.byLanguages[e].indexOf(a)<0&&r.byLanguages[e].push(a)})),r.byType[e]=this};for(var o in r.prototype.init=function(){this._elt||(this._elt=document.createElement("div"),this._elt.className="prism-previewer prism-previewer-"+this._type,document.body.appendChild(this._elt),this.initializer&&this.initializer())},r.prototype.isDisabled=function(e){do{if(e.hasAttribute&&e.hasAttribute("data-previewers"))return-1===(e.getAttribute("data-previewers")||"").split(/\s+/).indexOf(this._type)}while(e=e.parentNode);return!1},r.prototype.check=function(e){if(!e.classList.contains(i)||!this.isDisabled(e)){do{if(e.classList&&e.classList.contains(i)&&e.classList.contains(this._type))break}while(e=e.parentNode);e&&e!==this._token&&(this._token=e,this.show())}},r.prototype.mouseout=function(){this._token.removeEventListener("mouseout",this._mouseout,!1),this._token=null,this.hide()},r.prototype.show=function(){var e,s,t,i;if(this._elt||this.init(),this._token)if(this.updater.call(this._elt,this._token.textContent)){this._token.addEventListener("mouseout",this._mouseout,!1);var r=(s=(e=this._token.getBoundingClientRect()).left,t=e.top,s-=(i=document.documentElement.getBoundingClientRect()).left,{top:t-=i.top,right:innerWidth-s-e.width,bottom:innerHeight-t-e.height,left:s,width:e.width,height:e.height});this._elt.classList.add(a),r.top-this._elt.offsetHeight>0?(this._elt.classList.remove(n),this._elt.style.top=r.top+"px",this._elt.style.bottom=""):(this._elt.classList.add(n),this._elt.style.bottom=r.bottom+"px",this._elt.style.top=""),this._elt.style.left=r.left+Math.min(200,r.width/2)+"px"}else this.hide()},r.prototype.hide=function(){this._elt.classList.remove(a)},r.byLanguages={},r.byType={},r.initEvents=function(e,s){var t=[];r.byLanguages[s]&&(t=t.concat(r.byLanguages[s])),r.byLanguages["*"]&&(t=t.concat(r.byLanguages["*"])),e.addEventListener("mouseover",(function(e){var s=e.target;t.forEach((function(e){e.check(s)}))}),!1)},Prism.plugins.Previewer=r,Prism.hooks.add("before-highlight",(function(e){for(var s in t){var i=t[s].languages;if(e.language&&i[e.language]&&!i[e.language].initialized){var a=i[e.language];Array.isArray(a)||(a=[a]),a.forEach((function(a){var n,r,o,l;!0===a?(n="important",r=e.language,a=e.language):(n=a.before||"important",r=a.inside||a.lang,o=a.root||Prism.languages,l=a.skip,a=e.language),!l&&Prism.languages[a]&&(Prism.languages.insertBefore(r,n,t[s].tokens,o),e.grammar=Prism.languages[a],i[e.language]={initialized:!0})}))}}})),Prism.hooks.add("after-highlight",(function(e){(r.byLanguages["*"]||r.byLanguages[e.language])&&r.initEvents(e.element,e.language)})),t)t[o].create()}}();<pn"x&(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	Prism.hooks.add('before-sanity-check', function (env) {
		if (env.code) {
			var pre = env.element.parentNode;
			var clsReg = /(?:^|\s)keep-initial-line-feed(?:\s|$)/;
			if (
				pre && pre.nodeName.toLowerCase() === 'pre' &&
				// Apply only if nor the <pre> or the <code> have the class
				(!clsReg.test(pre.className) && !clsReg.test(env.element.className))
			) {
				env.code = env.code.replace(/^(?:\r?\n|\r)/, '');
			}
		}
	});

}());
@ЦxE"undefined"!=typeof Prism&&"undefined"!=typeof document&&Prism.hooks.add("before-sanity-check",(function(e){if(e.code){var n=e.element.parentNode,o=/(?:^|\s)keep-initial-line-feed(?:\s|$)/;!n||"pre"!==n.nodeName.toLowerCase()||o.test(n.className)||o.test(e.element.className)||(e.code=e.code.replace(/^(?:\r?\n|\r)/,""))}}));Fqx7.token.tab:not(:empty),
.token.cr,
.token.lf,
.token.space {
	position: relative;
}

.token.tab:not(:empty):before,
.token.cr:before,
.token.lf:before,
.token.space:before {
	color: #808080;
	opacity: 0.6;
	position: absolute;
}

.token.tab:not(:empty):before {
	content: '\21E5';
}

.token.cr:before {
	content: '\240D';
}

.token.crlf:before {
	content: '\240D\240A';
}
.token.lf:before {
	content: '\240A';
}

.token.space:before {
	content: '\00B7';
}
mx'(function () {

	if (typeof Prism === 'undefined') {
		return;
	}


	var invisibles = {
		'tab': /\t/,
		'crlf': /\r\n/,
		'lf': /\n/,
		'cr': /\r/,
		'space': / /
	};


	/**
	 * Handles the recursive calling of `addInvisibles` for one token.
	 *
	 * @param {Object|Array} tokens The grammar or array which contains the token.
	 * @param {string|number} name The name or index of the token in `tokens`.
	 */
	function handleToken(tokens, name) {
		var value = tokens[name];

		var type = Prism.util.type(value);
		switch (type) {
			case 'RegExp':
				var inside = {};
				tokens[name] = {
					pattern: value,
					inside: inside
				};
				addInvisibles(inside);
				break;

			case 'Array':
				for (var i = 0, l = value.length; i < l; i++) {
					handleToken(value, i);
				}
				break;

			default: // 'Object'
				// eslint-disable-next-line no-redeclare
				var inside = value.inside || (value.inside = {});
				addInvisibles(inside);
				break;
		}
	}

	/**
	 * Recursively adds patterns to match invisible characters to the given grammar (if not added already).
	 *
	 * @param {Object} grammar
	 */
	function addInvisibles(grammar) {
		if (!grammar || grammar['tab']) {
			return;
		}

		// assign invisibles here to "mark" the grammar in case of self references
		for (var name in invisibles) {
			if (invisibles.hasOwnProperty(name)) {
				grammar[name] = invisibles[name];
			}
		}

		// eslint-disable-next-line no-redeclare
		for (var name in grammar) {
			if (grammar.hasOwnProperty(name) && !invisibles[name]) {
				if (name === 'rest') {
					addInvisibles(grammar['rest']);
				} else {
					handleToken(grammar, name);
				}
			}
		}
	}

	Prism.hooks.add('before-highlight', function (env) {
		addInvisibles(env.grammar);
	});
}());
hx}.token.cr,.token.lf,.token.space,.token.tab:not(:empty){position:relative}.token.cr:before,.token.lf:before,.token.space:before,.token.tab:not(:empty):before{color:grey;opacity:.6;position:absolute}.token.tab:not(:empty):before{content:'\21E5'}.token.cr:before{content:'\240D'}.token.crlf:before{content:'\240D\240A'}.token.lf:before{content:'\240A'}.token.space:before{content:'\00B7'}vx x
!function(){if("undefined"!=typeof Prism){var r={tab:/\t/,crlf:/\r\n/,lf:/\n/,cr:/\r/,space:/ /};Prism.hooks.add("before-highlight",(function(r){i(r.grammar)}))}function e(r,a){var n=r[a];switch(Prism.util.type(n)){case"RegExp":var t={};r[a]={pattern:n,inside:t},i(t);break;case"Array":for(var f=0,s=n.length;f<s;f++)e(n,f);break;default:i(t=n.inside||(n.inside={}))}}function i(a){if(a&&!a.tab){for(var n in r)r.hasOwnProperty(n)&&(a[n]=r[n]);for(var n in a)a.hasOwnProperty(n)&&!r[n]&&("rest"===n?i(a.rest):e(a,n))}}}();px(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	if (!Prism.plugins.toolbar) {
		console.warn('Show Languages plugin loaded before Toolbar plugin.');

		return;
	}

	/* eslint-disable */

	// The languages map is built automatically with gulp
	var Languages = /*languages_placeholder[*/{
		"none": "Plain text",
		"plain": "Plain text",
		"plaintext": "Plain text",
		"text": "Plain text",
		"txt": "Plain text",
		"html": "HTML",
		"xml": "XML",
		"svg": "SVG",
		"mathml": "MathML",
		"ssml": "SSML",
		"rss": "RSS",
		"css": "CSS",
		"clike": "C-like",
		"js": "JavaScript",
		"abap": "ABAP",
		"abnf": "ABNF",
		"al": "AL",
		"antlr4": "ANTLR4",
		"g4": "ANTLR4",
		"apacheconf": "Apache Configuration",
		"apl": "APL",
		"aql": "AQL",
		"ino": "Arduino",
		"arff": "ARFF",
		"armasm": "ARM Assembly",
		"arm-asm": "ARM Assembly",
		"art": "Arturo",
		"asciidoc": "AsciiDoc",
		"adoc": "AsciiDoc",
		"aspnet": "ASP.NET (C#)",
		"asm6502": "6502 Assembly",
		"asmatmel": "Atmel AVR Assembly",
		"autohotkey": "AutoHotkey",
		"autoit": "AutoIt",
		"avisynth": "AviSynth",
		"avs": "AviSynth",
		"avro-idl": "Avro IDL",
		"avdl": "Avro IDL",
		"awk": "AWK",
		"gawk": "GAWK",
		"sh": "Shell",
		"basic": "BASIC",
		"bbcode": "BBcode",
		"bbj": "BBj",
		"bnf": "BNF",
		"rbnf": "RBNF",
		"bqn": "BQN",
		"bsl": "BSL (1C:Enterprise)",
		"oscript": "OneScript",
		"csharp": "C#",
		"cs": "C#",
		"dotnet": "C#",
		"cpp": "C++",
		"cfscript": "CFScript",
		"cfc": "CFScript",
		"cil": "CIL",
		"cilkc": "Cilk/C",
		"cilk-c": "Cilk/C",
		"cilkcpp": "Cilk/C++",
		"cilk-cpp": "Cilk/C++",
		"cilk": "Cilk/C++",
		"cmake": "CMake",
		"cobol": "COBOL",
		"coffee": "CoffeeScript",
		"conc": "Concurnas",
		"csp": "Content-Security-Policy",
		"css-extras": "CSS Extras",
		"csv": "CSV",
		"cue": "CUE",
		"dataweave": "DataWeave",
		"dax": "DAX",
		"django": "Django/Jinja2",
		"jinja2": "Django/Jinja2",
		"dns-zone-file": "DNS zone file",
		"dns-zone": "DNS zone file",
		"dockerfile": "Docker",
		"dot": "DOT (Graphviz)",
		"gv": "DOT (Graphviz)",
		"ebnf": "EBNF",
		"editorconfig": "EditorConfig",
		"ejs": "EJS",
		"etlua": "Embedded Lua templating",
		"erb": "ERB",
		"excel-formula": "Excel Formula",
		"xlsx": "Excel Formula",
		"xls": "Excel Formula",
		"fsharp": "F#",
		"firestore-security-rules": "Firestore security rules",
		"ftl": "FreeMarker Template Language",
		"gml": "GameMaker Language",
		"gamemakerlanguage": "GameMaker Language",
		"gap": "GAP (CAS)",
		"gcode": "G-code",
		"gdscript": "GDScript",
		"gedcom": "GEDCOM",
		"gettext": "gettext",
		"po": "gettext",
		"glsl": "GLSL",
		"gn": "GN",
		"gni": "GN",
		"linker-script": "GNU Linker Script",
		"ld": "GNU Linker Script",
		"go-module": "Go module",
		"go-mod": "Go module",
		"graphql": "GraphQL",
		"hbs": "Handlebars",
		"hs": "Haskell",
		"hcl": "HCL",
		"hlsl": "HLSL",
		"http": "HTTP",
		"hpkp": "HTTP Public-Key-Pins",
		"hsts": "HTTP Strict-Transport-Security",
		"ichigojam": "IchigoJam",
		"icu-message-format": "ICU Message Format",
		"idr": "Idris",
		"ignore": ".ignore",
		"gitignore": ".gitignore",
		"hgignore": ".hgignore",
		"npmignore": ".npmignore",
		"inform7": "Inform 7",
		"javadoc": "JavaDoc",
		"javadoclike": "JavaDoc-like",
		"javastacktrace": "Java stack trace",
		"jq": "JQ",
		"jsdoc": "JSDoc",
		"js-extras": "JS Extras",
		"json": "JSON",
		"webmanifest": "Web App Manifest",
		"json5": "JSON5",
		"jsonp": "JSONP",
		"jsstacktrace": "JS stack trace",
		"js-templates": "JS Templates",
		"keepalived": "Keepalived Configure",
		"kts": "Kotlin Script",
		"kt": "Kotlin",
		"kumir": "KuMir (КуМир)",
		"kum": "KuMir (КуМир)",
		"latex": "LaTeX",
		"tex": "TeX",
		"context": "ConTeXt",
		"lilypond": "LilyPond",
		"ly": "LilyPond",
		"emacs": "Lisp",
		"elisp": "Lisp",
		"emacs-lisp": "Lisp",
		"llvm": "LLVM IR",
		"log": "Log file",
		"lolcode": "LOLCODE",
		"magma": "Magma (CAS)",
		"md": "Markdown",
		"markup-templating": "Markup templating",
		"matlab": "MATLAB",
		"maxscript": "MAXScript",
		"mel": "MEL",
		"metafont": "METAFONT",
		"mongodb": "MongoDB",
		"moon": "MoonScript",
		"n1ql": "N1QL",
		"n4js": "N4JS",
		"n4jsd": "N4JS",
		"nand2tetris-hdl": "Nand To Tetris HDL",
		"naniscript": "Naninovel Script",
		"nani": "Naninovel Script",
		"nasm": "NASM",
		"neon": "NEON",
		"nginx": "nginx",
		"nsis": "NSIS",
		"objectivec": "Objective-C",
		"objc": "Objective-C",
		"ocaml": "OCaml",
		"opencl": "OpenCL",
		"openqasm": "OpenQasm",
		"qasm": "OpenQasm",
		"parigp": "PARI/GP",
		"objectpascal": "Object Pascal",
		"psl": "PATROL Scripting Language",
		"pcaxis": "PC-Axis",
		"px": "PC-Axis",
		"peoplecode": "PeopleCode",
		"pcode": "PeopleCode",
		"php": "PHP",
		"phpdoc": "PHPDoc",
		"php-extras": "PHP Extras",
		"plant-uml": "PlantUML",
		"plantuml": "PlantUML",
		"plsql": "PL/SQL",
		"powerquery": "PowerQuery",
		"pq": "PowerQuery",
		"mscript": "PowerQuery",
		"powershell": "PowerShell",
		"promql": "PromQL",
		"properties": ".properties",
		"protobuf": "Protocol Buffers",
		"purebasic": "PureBasic",
		"pbfasm": "PureBasic",
		"purs": "PureScript",
		"py": "Python",
		"qsharp": "Q#",
		"qs": "Q#",
		"q": "Q (kdb+ database)",
		"qml": "QML",
		"rkt": "Racket",
		"cshtml": "Razor C#",
		"razor": "Razor C#",
		"jsx": "React JSX",
		"tsx": "React TSX",
		"renpy": "Ren'py",
		"rpy": "Ren'py",
		"res": "ReScript",
		"rest": "reST (reStructuredText)",
		"robotframework": "Robot Framework",
		"robot": "Robot Framework",
		"rb": "Ruby",
		"sas": "SAS",
		"sass": "Sass (Sass)",
		"scss": "Sass (SCSS)",
		"shell-session": "Shell session",
		"sh-session": "Shell session",
		"shellsession": "Shell session",
		"sml": "SML",
		"smlnj": "SML/NJ",
		"solidity": "Solidity (Ethereum)",
		"sol": "Solidity (Ethereum)",
		"solution-file": "Solution file",
		"sln": "Solution file",
		"soy": "Soy (Closure Template)",
		"sparql": "SPARQL",
		"rq": "SPARQL",
		"splunk-spl": "Splunk SPL",
		"sqf": "SQF: Status Quo Function (Arma 3)",
		"sql": "SQL",
		"stata": "Stata Ado",
		"iecst": "Structured Text (IEC 61131-3)",
		"supercollider": "SuperCollider",
		"sclang": "SuperCollider",
		"systemd": "Systemd configuration file",
		"t4-templating": "T4 templating",
		"t4-cs": "T4 Text Templates (C#)",
		"t4": "T4 Text Templates (C#)",
		"t4-vb": "T4 Text Templates (VB)",
		"tap": "TAP",
		"tt2": "Template Toolkit 2",
		"toml": "TOML",
		"trickle": "trickle",
		"troy": "troy",
		"trig": "TriG",
		"ts": "TypeScript",
		"tsconfig": "TSConfig",
		"uscript": "UnrealScript",
		"uc": "UnrealScript",
		"uorazor": "UO Razor Script",
		"uri": "URI",
		"url": "URL",
		"vbnet": "VB.Net",
		"vhdl": "VHDL",
		"vim": "vim",
		"visual-basic": "Visual Basic",
		"vba": "VBA",
		"vb": "Visual Basic",
		"wasm": "WebAssembly",
		"web-idl": "Web IDL",
		"webidl": "Web IDL",
		"wgsl": "WGSL",
		"wiki": "Wiki markup",
		"wolfram": "Wolfram language",
		"nb": "Mathematica Notebook",
		"wl": "Wolfram language",
		"xeoracube": "XeoraCube",
		"xml-doc": "XML doc (.net)",
		"xojo": "Xojo (REALbasic)",
		"xquery": "XQuery",
		"yaml": "YAML",
		"yml": "YAML",
		"yang": "YANG"
	}/*]*/;

	/* eslint-enable */

	Prism.plugins.toolbar.registerButton('show-language', function (env) {
		var pre = env.element.parentNode;
		if (!pre || !/pre/i.test(pre.nodeName)) {
			return;
		}

		/**
		 * Tries to guess the name of a language given its id.
		 *
		 * @param {string} id The language id.
		 * @returns {string}
		 */
		function guessTitle(id) {
			if (!id) {
				return id;
			}
			return (id.substring(0, 1).toUpperCase() + id.substring(1)).replace(/s(?=cript)/, 'S');
		}

		var language = pre.getAttribute('data-language') || Languages[env.language] || guessTitle(env.language);

		if (!language) {
			return;
		}
		var element = document.createElement('span');
		element.textContent = language;

		return element;
	});

}());
MBxx|!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document)if(Prism.plugins.toolbar){var e={none:"Plain text",plain:"Plain text",plaintext:"Plain text",text:"Plain text",txt:"Plain text",html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",rss:"RSS",css:"CSS",clike:"C-like",js:"JavaScript",abap:"ABAP",abnf:"ABNF",al:"AL",antlr4:"ANTLR4",g4:"ANTLR4",apacheconf:"Apache Configuration",apl:"APL",aql:"AQL",ino:"Arduino",arff:"ARFF",armasm:"ARM Assembly","arm-asm":"ARM Assembly",art:"Arturo",asciidoc:"AsciiDoc",adoc:"AsciiDoc",aspnet:"ASP.NET (C#)",asm6502:"6502 Assembly",asmatmel:"Atmel AVR Assembly",autohotkey:"AutoHotkey",autoit:"AutoIt",avisynth:"AviSynth",avs:"AviSynth","avro-idl":"Avro IDL",avdl:"Avro IDL",awk:"AWK",gawk:"GAWK",sh:"Shell",basic:"BASIC",bbcode:"BBcode",bbj:"BBj",bnf:"BNF",rbnf:"RBNF",bqn:"BQN",bsl:"BSL (1C:Enterprise)",oscript:"OneScript",csharp:"C#",cs:"C#",dotnet:"C#",cpp:"C++",cfscript:"CFScript",cfc:"CFScript",cil:"CIL",cilkc:"Cilk/C","cilk-c":"Cilk/C",cilkcpp:"Cilk/C++","cilk-cpp":"Cilk/C++",cilk:"Cilk/C++",cmake:"CMake",cobol:"COBOL",coffee:"CoffeeScript",conc:"Concurnas",csp:"Content-Security-Policy","css-extras":"CSS Extras",csv:"CSV",cue:"CUE",dataweave:"DataWeave",dax:"DAX",django:"Django/Jinja2",jinja2:"Django/Jinja2","dns-zone-file":"DNS zone file","dns-zone":"DNS zone file",dockerfile:"Docker",dot:"DOT (Graphviz)",gv:"DOT (Graphviz)",ebnf:"EBNF",editorconfig:"EditorConfig",ejs:"EJS",etlua:"Embedded Lua templating",erb:"ERB","excel-formula":"Excel Formula",xlsx:"Excel Formula",xls:"Excel Formula",fsharp:"F#","firestore-security-rules":"Firestore security rules",ftl:"FreeMarker Template Language",gml:"GameMaker Language",gamemakerlanguage:"GameMaker Language",gap:"GAP (CAS)",gcode:"G-code",gdscript:"GDScript",gedcom:"GEDCOM",gettext:"gettext",po:"gettext",glsl:"GLSL",gn:"GN",gni:"GN","linker-script":"GNU Linker Script",ld:"GNU Linker Script","go-module":"Go module","go-mod":"Go module",graphql:"GraphQL",hbs:"Handlebars",hs:"Haskell",hcl:"HCL",hlsl:"HLSL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam","icu-message-format":"ICU Message Format",idr:"Idris",ignore:".ignore",gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore",inform7:"Inform 7",javadoc:"JavaDoc",javadoclike:"JavaDoc-like",javastacktrace:"Java stack trace",jq:"JQ",jsdoc:"JSDoc","js-extras":"JS Extras",json:"JSON",webmanifest:"Web App Manifest",json5:"JSON5",jsonp:"JSONP",jsstacktrace:"JS stack trace","js-templates":"JS Templates",keepalived:"Keepalived Configure",kts:"Kotlin Script",kt:"Kotlin",kumir:"KuMir (КуМир)",kum:"KuMir (КуМир)",latex:"LaTeX",tex:"TeX",context:"ConTeXt",lilypond:"LilyPond",ly:"LilyPond",emacs:"Lisp",elisp:"Lisp","emacs-lisp":"Lisp",llvm:"LLVM IR",log:"Log file",lolcode:"LOLCODE",magma:"Magma (CAS)",md:"Markdown","markup-templating":"Markup templating",matlab:"MATLAB",maxscript:"MAXScript",mel:"MEL",metafont:"METAFONT",mongodb:"MongoDB",moon:"MoonScript",n1ql:"N1QL",n4js:"N4JS",n4jsd:"N4JS","nand2tetris-hdl":"Nand To Tetris HDL",naniscript:"Naninovel Script",nani:"Naninovel Script",nasm:"NASM",neon:"NEON",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",objc:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",openqasm:"OpenQasm",qasm:"OpenQasm",parigp:"PARI/GP",objectpascal:"Object Pascal",psl:"PATROL Scripting Language",pcaxis:"PC-Axis",px:"PC-Axis",peoplecode:"PeopleCode",pcode:"PeopleCode",php:"PHP",phpdoc:"PHPDoc","php-extras":"PHP Extras","plant-uml":"PlantUML",plantuml:"PlantUML",plsql:"PL/SQL",powerquery:"PowerQuery",pq:"PowerQuery",mscript:"PowerQuery",powershell:"PowerShell",promql:"PromQL",properties:".properties",protobuf:"Protocol Buffers",purebasic:"PureBasic",pbfasm:"PureBasic",purs:"PureScript",py:"Python",qsharp:"Q#",qs:"Q#",q:"Q (kdb+ database)",qml:"QML",rkt:"Racket",cshtml:"Razor C#",razor:"Razor C#",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rpy:"Ren'py",res:"ReScript",rest:"reST (reStructuredText)",robotframework:"Robot Framework",robot:"Robot Framework",rb:"Ruby",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (SCSS)","shell-session":"Shell session","sh-session":"Shell session",shellsession:"Shell session",sml:"SML",smlnj:"SML/NJ",solidity:"Solidity (Ethereum)",sol:"Solidity (Ethereum)","solution-file":"Solution file",sln:"Solution file",soy:"Soy (Closure Template)",sparql:"SPARQL",rq:"SPARQL","splunk-spl":"Splunk SPL",sqf:"SQF: Status Quo Function (Arma 3)",sql:"SQL",stata:"Stata Ado",iecst:"Structured Text (IEC 61131-3)",supercollider:"SuperCollider",sclang:"SuperCollider",systemd:"Systemd configuration file","t4-templating":"T4 templating","t4-cs":"T4 Text Templates (C#)",t4:"T4 Text Templates (C#)","t4-vb":"T4 Text Templates (VB)",tap:"TAP",tt2:"Template Toolkit 2",toml:"TOML",trickle:"trickle",troy:"troy",trig:"TriG",ts:"TypeScript",tsconfig:"TSConfig",uscript:"UnrealScript",uc:"UnrealScript",uorazor:"UO Razor Script",uri:"URI",url:"URL",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",vba:"VBA",vb:"Visual Basic",wasm:"WebAssembly","web-idl":"Web IDL",webidl:"Web IDL",wgsl:"WGSL",wiki:"Wiki markup",wolfram:"Wolfram language",nb:"Mathematica Notebook",wl:"Wolfram language",xeoracube:"XeoraCube","xml-doc":"XML doc (.net)",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML",yml:"YAML",yang:"YANG"};Prism.plugins.toolbar.registerButton("show-language",(function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var o,i=t.getAttribute("data-language")||e[a.language]||((o=a.language)?(o.substring(0,1).toUpperCase()+o.substring(1)).replace(/s(?=cript)/,"S"):o);if(i){var s=document.createElement("span");return s.textContent=i,s}}}))}else console.warn("Show Languages plugin loaded before Toolbar plugin.")}();tyaxdiv.code-toolbar {
	position: relative;
}

div.code-toolbar > .toolbar {
	position: absolute;
	z-index: 10;
	top: .3em;
	right: .2em;
	transition: opacity 0.3s ease-in-out;
	opacity: 0;
}

div.code-toolbar:hover > .toolbar {
	opacity: 1;
}

/* Separate line b/c rules are thrown out if selector is invalid.
   IE11 and old Edge versions don't support :focus-within. */
div.code-toolbar:focus-within > .toolbar {
	opacity: 1;
}

div.code-toolbar > .toolbar > .toolbar-item {
	display: inline-block;
}

div.code-toolbar > .toolbar > .toolbar-item > a {
	cursor: pointer;
}

div.code-toolbar > .toolbar > .toolbar-item > button {
	background: none;
	border: 0;
	color: inherit;
	font: inherit;
	line-height: normal;
	overflow: visible;
	padding: 0;
	-webkit-user-select: none; /* for button */
	-moz-user-select: none;
	-ms-user-select: none;
}

div.code-toolbar > .toolbar > .toolbar-item > a,
div.code-toolbar > .toolbar > .toolbar-item > button,
div.code-toolbar > .toolbar > .toolbar-item > span {
	color: #bbb;
	font-size: .8em;
	padding: 0 .5em;
	background: #f5f2f0;
	background: rgba(224, 224, 224, 0.2);
	box-shadow: 0 2px 0 0 rgba(0,0,0,0.2);
	border-radius: .5em;
}

div.code-toolbar > .toolbar > .toolbar-item > a:hover,
div.code-toolbar > .toolbar > .toolbar-item > a:focus,
div.code-toolbar > .toolbar > .toolbar-item > button:hover,
div.code-toolbar > .toolbar > .toolbar-item > button:focus,
div.code-toolbar > .toolbar > .toolbar-item > span:hover,
div.code-toolbar > .toolbar > .toolbar-item > span:focus {
	color: inherit;
	text-decoration: none;
}
uxg(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	var callbacks = [];
	var map = {};
	var noop = function () {};

	Prism.plugins.toolbar = {};

	/**
	 * @typedef ButtonOptions
	 * @property {string} text The text displayed.
	 * @property {string} [url] The URL of the link which will be created.
	 * @property {Function} [onClick] The event listener for the `click` event of the created button.
	 * @property {string} [className] The class attribute to include with element.
	 */

	/**
	 * Register a button callback with the toolbar.
	 *
	 * @param {string} key
	 * @param {ButtonOptions|Function} opts
	 */
	var registerButton = Prism.plugins.toolbar.registerButton = function (key, opts) {
		var callback;

		if (typeof opts === 'function') {
			callback = opts;
		} else {
			callback = function (env) {
				var element;

				if (typeof opts.onClick === 'function') {
					element = document.createElement('button');
					element.type = 'button';
					element.addEventListener('click', function () {
						opts.onClick.call(this, env);
					});
				} else if (typeof opts.url === 'string') {
					element = document.createElement('a');
					element.href = opts.url;
				} else {
					element = document.createElement('span');
				}

				if (opts.className) {
					element.classList.add(opts.className);
				}

				element.textContent = opts.text;

				return element;
			};
		}

		if (key in map) {
			console.warn('There is a button with the key "' + key + '" registered already.');
			return;
		}

		callbacks.push(map[key] = callback);
	};

	/**
	 * Returns the callback order of the given element.
	 *
	 * @param {HTMLElement} element
	 * @returns {string[] | undefined}
	 */
	function getOrder(element) {
		while (element) {
			var order = element.getAttribute('data-toolbar-order');
			if (order != null) {
				order = order.trim();
				if (order.length) {
					return order.split(/\s*,\s*/g);
				} else {
					return [];
				}
			}
			element = element.parentElement;
		}
	}

	/**
	 * Post-highlight Prism hook callback.
	 *
	 * @param env
	 */
	var hook = Prism.plugins.toolbar.hook = function (env) {
		// Check if inline or actual code block (credit to line-numbers plugin)
		var pre = env.element.parentNode;
		if (!pre || !/pre/i.test(pre.nodeName)) {
			return;
		}

		// Autoloader rehighlights, so only do this once.
		if (pre.parentNode.classList.contains('code-toolbar')) {
			return;
		}

		// Create wrapper for <pre> to prevent scrolling toolbar with content
		var wrapper = document.createElement('div');
		wrapper.classList.add('code-toolbar');
		pre.parentNode.insertBefore(wrapper, pre);
		wrapper.appendChild(pre);

		// Setup the toolbar
		var toolbar = document.createElement('div');
		toolbar.classList.add('toolbar');

		// order callbacks
		var elementCallbacks = callbacks;
		var order = getOrder(env.element);
		if (order) {
			elementCallbacks = order.map(function (key) {
				return map[key] || noop;
			});
		}

		elementCallbacks.forEach(function (callback) {
			var element = callback(env);

			if (!element) {
				return;
			}

			var item = document.createElement('div');
			item.classList.add('toolbar-item');

			item.appendChild(element);
			toolbar.appendChild(item);
		});

		// Add our toolbar to the currently created wrapper of <pre> tag
		wrapper.appendChild(toolbar);
	};

	registerButton('label', function (env) {
		var pre = env.element.parentNode;
		if (!pre || !/pre/i.test(pre.nodeName)) {
			return;
		}

		if (!pre.hasAttribute('data-label')) {
			return;
		}

		var element; var template;
		var text = pre.getAttribute('data-label');
		try {
			// Any normal text will blow up this selector.
			template = document.querySelector('template#' + text);
		} catch (e) { /* noop */ }

		if (template) {
			element = template.content;
		} else {
			if (pre.hasAttribute('data-url')) {
				element = document.createElement('a');
				element.href = pre.getAttribute('data-url');
			} else {
				element = document.createElement('span');
			}

			element.textContent = text;
		}

		return element;
	});

	/**
	 * Register the toolbar with Prism.
	 */
	Prism.hooks.add('complete', hook);
}());
{.-JxSdiv.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none}߾~mx"!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e=[],t={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var r;r="function"==typeof a?a:function(e){var t;return"function"==typeof a.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",(function(){a.onClick.call(this,e)}))):"string"==typeof a.url?(t=document.createElement("a")).href=a.url:t=document.createElement("span"),a.className&&t.classList.add(a.className),t.textContent=a.text,t},n in t?console.warn('There is a button with the key "'+n+'" registered already.'):e.push(t[n]=r)},r=Prism.plugins.toolbar.hook=function(a){var r=a.element.parentNode;if(r&&/pre/i.test(r.nodeName)&&!r.parentNode.classList.contains("code-toolbar")){var o=document.createElement("div");o.classList.add("code-toolbar"),r.parentNode.insertBefore(o,r),o.appendChild(r);var i=document.createElement("div");i.classList.add("toolbar");var l=e,d=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);d&&(l=d.map((function(e){return t[e]||n}))),l.forEach((function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),i.appendChild(n)}})),o.appendChild(i)}};a("label",(function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}})),Prism.hooks.add("complete",r)}}();npGxN.token.treeview-part .entry-line {
	position: relative;
	text-indent: -99em;
	display: inline-block;
	vertical-align: top;
	width: 1.2em;
}
.token.treeview-part .entry-line:before,
.token.treeview-part .line-h:after {
	content: "";
	position: absolute;
	top: 0;
	left: 50%;
	width: 50%;
	height: 100%;
}
.token.treeview-part .line-h:before,
.token.treeview-part .line-v:before {
	border-left: 1px solid #ccc;
}
.token.treeview-part .line-v-last:before {
	height: 50%;
	border-left: 1px solid #ccc;
	border-bottom: 1px solid #ccc;
}
.token.treeview-part .line-h:after {
	height: 50%;
	border-bottom: 1px solid #ccc;
}
.token.treeview-part .entry-name {
	position: relative;
	display: inline-block;
	vertical-align: top;
}
.token.treeview-part .entry-name.dotfile {
	opacity: 0.5;
}

/* @GENERATED-FONT */
@font-face {
	font-family: "PrismTreeview";
	/**
	 * This font is generated from the .svg files in the `icons` folder. See the `treeviewIconFont` function in
	 * `gulpfile.js/index.js` for more information.
	 *
	 * Use the following escape sequences to refer to a specific icon:
	 *
	 * - \ea01 file
	 * - \ea02 folder
	 * - \ea03 image
	 * - \ea04 audio
	 * - \ea05 video
	 * - \ea06 text
	 * - \ea07 code
	 * - \ea08 archive
	 * - \ea09 pdf
	 * - \ea0a excel
	 * - \ea0b powerpoint
	 * - \ea0c word
	 */
	src: url("data:application/font-woff;base64,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")
		format("woff");
}

.token.treeview-part .entry-name:before {
	content: "\ea01";
	font-family: "PrismTreeview";
	font-size: inherit;
	font-style: normal;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	width: 2.5ex;
	display: inline-block;
}

.token.treeview-part .entry-name.dir:before {
	content: "\ea02";
}
.token.treeview-part .entry-name.ext-bmp:before,
.token.treeview-part .entry-name.ext-eps:before,
.token.treeview-part .entry-name.ext-gif:before,
.token.treeview-part .entry-name.ext-jpe:before,
.token.treeview-part .entry-name.ext-jpg:before,
.token.treeview-part .entry-name.ext-jpeg:before,
.token.treeview-part .entry-name.ext-png:before,
.token.treeview-part .entry-name.ext-svg:before,
.token.treeview-part .entry-name.ext-tiff:before {
	content: "\ea03";
}
.token.treeview-part .entry-name.ext-cfg:before,
.token.treeview-part .entry-name.ext-conf:before,
.token.treeview-part .entry-name.ext-config:before,
.token.treeview-part .entry-name.ext-csv:before,
.token.treeview-part .entry-name.ext-ini:before,
.token.treeview-part .entry-name.ext-log:before,
.token.treeview-part .entry-name.ext-md:before,
.token.treeview-part .entry-name.ext-nfo:before,
.token.treeview-part .entry-name.ext-txt:before {
	content: "\ea06";
}
.token.treeview-part .entry-name.ext-asp:before,
.token.treeview-part .entry-name.ext-aspx:before,
.token.treeview-part .entry-name.ext-c:before,
.token.treeview-part .entry-name.ext-cc:before,
.token.treeview-part .entry-name.ext-cpp:before,
.token.treeview-part .entry-name.ext-cs:before,
.token.treeview-part .entry-name.ext-css:before,
.token.treeview-part .entry-name.ext-h:before,
.token.treeview-part .entry-name.ext-hh:before,
.token.treeview-part .entry-name.ext-htm:before,
.token.treeview-part .entry-name.ext-html:before,
.token.treeview-part .entry-name.ext-jav:before,
.token.treeview-part .entry-name.ext-java:before,
.token.treeview-part .entry-name.ext-js:before,
.token.treeview-part .entry-name.ext-php:before,
.token.treeview-part .entry-name.ext-rb:before,
.token.treeview-part .entry-name.ext-xml:before {
	content: "\ea07";
}
.token.treeview-part .entry-name.ext-7z:before,
.token.treeview-part .entry-name.ext-bz:before,
.token.treeview-part .entry-name.ext-bz2:before,
.token.treeview-part .entry-name.ext-gz:before,
.token.treeview-part .entry-name.ext-rar:before,
.token.treeview-part .entry-name.ext-tar:before,
.token.treeview-part .entry-name.ext-tgz:before,
.token.treeview-part .entry-name.ext-zip:before {
	content: "\ea08";
}
.token.treeview-part .entry-name.ext-aac:before,
.token.treeview-part .entry-name.ext-au:before,
.token.treeview-part .entry-name.ext-cda:before,
.token.treeview-part .entry-name.ext-flac:before,
.token.treeview-part .entry-name.ext-mp3:before,
.token.treeview-part .entry-name.ext-oga:before,
.token.treeview-part .entry-name.ext-ogg:before,
.token.treeview-part .entry-name.ext-wav:before,
.token.treeview-part .entry-name.ext-wma:before {
	content: "\ea04";
}
.token.treeview-part .entry-name.ext-avi:before,
.token.treeview-part .entry-name.ext-flv:before,
.token.treeview-part .entry-name.ext-mkv:before,
.token.treeview-part .entry-name.ext-mov:before,
.token.treeview-part .entry-name.ext-mp4:before,
.token.treeview-part .entry-name.ext-mpeg:before,
.token.treeview-part .entry-name.ext-mpg:before,
.token.treeview-part .entry-name.ext-ogv:before,
.token.treeview-part .entry-name.ext-webm:before {
	content: "\ea05";
}
.token.treeview-part .entry-name.ext-pdf:before {
	content: "\ea09";
}
.token.treeview-part .entry-name.ext-xls:before,
.token.treeview-part .entry-name.ext-xlsx:before {
	content: "\ea0a";
}
.token.treeview-part .entry-name.ext-doc:before,
.token.treeview-part .entry-name.ext-docm:before,
.token.treeview-part .entry-name.ext-docx:before {
	content: "\ea0c";
}
.token.treeview-part .entry-name.ext-pps:before,
.token.treeview-part .entry-name.ext-ppt:before,
.token.treeview-part .entry-name.ext-pptx:before {
	content: "\ea0b";
}
YYxg(function () {

	if (typeof Prism === 'undefined') {
		return;
	}

	Prism.languages.treeview = {
		'treeview-part': {
			pattern: /^.+/m,
			inside: {
				'entry-line': [
					{
						pattern: /\|-- |├── /,
						alias: 'line-h'
					},
					{
						pattern: /\| {3}|│ {3}/,
						alias: 'line-v'
					},
					{
						pattern: /`-- |└── /,
						alias: 'line-v-last'
					},
					{
						pattern: / {4}/,
						alias: 'line-v-gap'
					}
				],
				'entry-name': {
					pattern: /.*\S.*/,
					inside: {
						// symlink
						'operator': / -> /,
					}
				}
			}
		}
	};

	Prism.hooks.add('wrap', function (env) {
		if (env.language === 'treeview' && env.type === 'entry-name') {
			var classes = env.classes;

			var folderPattern = /(^|[^\\])\/\s*$/;
			if (folderPattern.test(env.content)) {
				// folder

				// remove trailing /
				env.content = env.content.replace(folderPattern, '$1');
				classes.push('dir');
			} else {
				// file

				// remove trailing file marker
				env.content = env.content.replace(/(^|[^\\])[=*|]\s*$/, '$1');

				var parts = env.content.toLowerCase().replace(/\s+/g, '').split('.');
				while (parts.length > 1) {
					parts.shift();
					// Ex. 'foo.min.js' would become '<span class="token keyword ext-min-js ext-js">foo.min.js</span>'
					classes.push('ext-' + parts.join('-'));
				}
			}

			if (env.content[0] === '.') {
				classes.push('dotfile');
			}
		}
	});
}());
wjxJ.token.treeview-part .entry-line{position:relative;text-indent:-99em;display:inline-block;vertical-align:top;width:1.2em}.token.treeview-part .entry-line:before,.token.treeview-part .line-h:after{content:"";position:absolute;top:0;left:50%;width:50%;height:100%}.token.treeview-part .line-h:before,.token.treeview-part .line-v:before{border-left:1px solid #ccc}.token.treeview-part .line-v-last:before{height:50%;border-left:1px solid #ccc;border-bottom:1px solid #ccc}.token.treeview-part .line-h:after{height:50%;border-bottom:1px solid #ccc}.token.treeview-part .entry-name{position:relative;display:inline-block;vertical-align:top}.token.treeview-part .entry-name.dotfile{opacity:.5}@font-face{font-family:PrismTreeview;src:url(data:application/font-woff;base64,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) format("woff")}.token.treeview-part .entry-name:before{content:"\ea01";font-family:PrismTreeview;font-size:inherit;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:2.5ex;display:inline-block}.token.treeview-part .entry-name.dir:before{content:"\ea02"}.token.treeview-part .entry-name.ext-bmp:before,.token.treeview-part .entry-name.ext-eps:before,.token.treeview-part .entry-name.ext-gif:before,.token.treeview-part .entry-name.ext-jpe:before,.token.treeview-part .entry-name.ext-jpeg:before,.token.treeview-part .entry-name.ext-jpg:before,.token.treeview-part .entry-name.ext-png:before,.token.treeview-part .entry-name.ext-svg:before,.token.treeview-part .entry-name.ext-tiff:before{content:"\ea03"}.token.treeview-part .entry-name.ext-cfg:before,.token.treeview-part .entry-name.ext-conf:before,.token.treeview-part .entry-name.ext-config:before,.token.treeview-part .entry-name.ext-csv:before,.token.treeview-part .entry-name.ext-ini:before,.token.treeview-part .entry-name.ext-log:before,.token.treeview-part .entry-name.ext-md:before,.token.treeview-part .entry-name.ext-nfo:before,.token.treeview-part .entry-name.ext-txt:before{content:"\ea06"}.token.treeview-part .entry-name.ext-asp:before,.token.treeview-part .entry-name.ext-aspx:before,.token.treeview-part .entry-name.ext-c:before,.token.treeview-part .entry-name.ext-cc:before,.token.treeview-part .entry-name.ext-cpp:before,.token.treeview-part .entry-name.ext-cs:before,.token.treeview-part .entry-name.ext-css:before,.token.treeview-part .entry-name.ext-h:before,.token.treeview-part .entry-name.ext-hh:before,.token.treeview-part .entry-name.ext-htm:before,.token.treeview-part .entry-name.ext-html:before,.token.treeview-part .entry-name.ext-jav:before,.token.treeview-part .entry-name.ext-java:before,.token.treeview-part .entry-name.ext-js:before,.token.treeview-part .entry-name.ext-php:before,.token.treeview-part .entry-name.ext-rb:before,.token.treeview-part .entry-name.ext-xml:before{content:"\ea07"}.token.treeview-part .entry-name.ext-7z:before,.token.treeview-part .entry-name.ext-bz2:before,.token.treeview-part .entry-name.ext-bz:before,.token.treeview-part .entry-name.ext-gz:before,.token.treeview-part .entry-name.ext-rar:before,.token.treeview-part .entry-name.ext-tar:before,.token.treeview-part .entry-name.ext-tgz:before,.token.treeview-part .entry-name.ext-zip:before{content:"\ea08"}.token.treeview-part .entry-name.ext-aac:before,.token.treeview-part .entry-name.ext-au:before,.token.treeview-part .entry-name.ext-cda:before,.token.treeview-part .entry-name.ext-flac:before,.token.treeview-part .entry-name.ext-mp3:before,.token.treeview-part .entry-name.ext-oga:before,.token.treeview-part .entry-name.ext-ogg:before,.token.treeview-part .entry-name.ext-wav:before,.token.treeview-part .entry-name.ext-wma:before{content:"\ea04"}.token.treeview-part .entry-name.ext-avi:before,.token.treeview-part .entry-name.ext-flv:before,.token.treeview-part .entry-name.ext-mkv:before,.token.treeview-part .entry-name.ext-mov:before,.token.treeview-part .entry-name.ext-mp4:before,.token.treeview-part .entry-name.ext-mpeg:before,.token.treeview-part .entry-name.ext-mpg:before,.token.treeview-part .entry-name.ext-ogv:before,.token.treeview-part .entry-name.ext-webm:before{content:"\ea05"}.token.treeview-part .entry-name.ext-pdf:before{content:"\ea09"}.token.treeview-part .entry-name.ext-xls:before,.token.treeview-part .entry-name.ext-xlsx:before{content:"\ea0a"}.token.treeview-part .entry-name.ext-doc:before,.token.treeview-part .entry-name.ext-docm:before,.token.treeview-part .entry-name.ext-docx:before{content:"\ea0c"}.token.treeview-part .entry-name.ext-pps:before,.token.treeview-part .entry-name.ext-ppt:before,.token.treeview-part .entry-name.ext-pptx:before{content:"\ea0b"}kn2|.x"undefined"!=typeof Prism&&(Prism.languages.treeview={"treeview-part":{pattern:/^.+/m,inside:{"entry-line":[{pattern:/\|-- |├── /,alias:"line-h"},{pattern:/\| {3}|│ {3}/,alias:"line-v"},{pattern:/`-- |└── /,alias:"line-v-last"},{pattern:/ {4}/,alias:"line-v-gap"}],"entry-name":{pattern:/.*\S.*/,inside:{operator:/ -> /}}}}},Prism.hooks.add("wrap",(function(e){if("treeview"===e.language&&"entry-name"===e.type){var t=e.classes,n=/(^|[^\\])\/\s*$/;if(n.test(e.content))e.content=e.content.replace(n,"$1"),t.push("dir");else{e.content=e.content.replace(/(^|[^\\])[=*|]\s*$/,"$1");for(var a=e.content.toLowerCase().replace(/\s+/g,"").split(".");a.length>1;)a.shift(),t.push("ext-"+a.join("-"))}"."===e.content[0]&&t.push("dotfile")}})));1ͷxg/* Fallback, in case JS does not run, to ensure the code is at least visible */
[class*='lang-'] script[type='text/plain'],
[class*='language-'] script[type='text/plain'],
script[type='text/plain'][class*='lang-'],
script[type='text/plain'][class*='language-'] {
	display: block;
	font: 100% Consolas, Monaco, monospace;
	white-space: pre;
	overflow: auto;
}
zuxW(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill
	if (!Element.prototype.matches) {
		Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
	}


	Prism.plugins.UnescapedMarkup = true;

	Prism.hooks.add('before-highlightall', function (env) {
		env.selector += ', [class*="lang-"] script[type="text/plain"]'
			+ ', [class*="language-"] script[type="text/plain"]'
			+ ', script[type="text/plain"][class*="lang-"]'
			+ ', script[type="text/plain"][class*="language-"]';
	});

	Prism.hooks.add('before-sanity-check', function (env) {
		/** @type {HTMLElement} */
		var element = env.element;

		if (element.matches('script[type="text/plain"]')) {
			// found a <script type="text/plain" ...> element
			// we convert this element to a regular <pre><code> code block

			var code = document.createElement('code');
			var pre = document.createElement('pre');

			// copy class name
			pre.className = code.className = element.className;

			// copy all "data-" attributes
			var dataset = element.dataset;
			Object.keys(dataset || {}).forEach(function (key) {
				if (Object.prototype.hasOwnProperty.call(dataset, key)) {
					pre.dataset[key] = dataset[key];
				}
			});

			code.textContent = env.code = env.code.replace(/&lt;\/script(?:>|&gt;)/gi, '</scri' + 'pt>');

			// change DOM
			pre.appendChild(code);
			element.parentNode.replaceChild(pre, element);
			env.element = code;
			return;
		}

		if (!env.code) {
			// no code
			var childNodes = element.childNodes;
			if (childNodes.length === 1 && childNodes[0].nodeName == '#comment') {
				// the only child is a comment -> use the comment's text
				element.textContent = env.code = childNodes[0].textContent;
			}
		}
	});
}());
[x [class*=lang-] script[type='text/plain'],[class*=language-] script[type='text/plain'],script[type='text/plain'][class*=lang-],script[type='text/plain'][class*=language-]{display:block;font:100% Consolas,Monaco,monospace;white-space:pre;overflow:auto}j]JCx6"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",(function(e){e.selector+=', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"], script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]'})),Prism.hooks.add("before-sanity-check",(function(e){var t=e.element;if(t.matches('script[type="text/plain"]')){var a=document.createElement("code"),c=document.createElement("pre");c.className=a.className=t.className;var n=t.dataset;return Object.keys(n||{}).forEach((function(e){Object.prototype.hasOwnProperty.call(n,e)&&(c.dataset[e]=n[e])})),a.textContent=e.code=e.code.replace(/&lt;\/script(?:>|&gt;)/gi,"<\/script>"),c.appendChild(a),t.parentNode.replaceChild(c,t),void(e.element=a)}if(!e.code){var o=t.childNodes;1===o.length&&"#comment"==o[0].nodeName&&(t.textContent=e.code=o[0].textContent)}})));x code[class*="language-"] a[href],
pre[class*="language-"] a[href] {
	cursor: help;
	text-decoration: none;
}

code[class*="language-"] a[href]:hover,
pre[class*="language-"] a[href]:hover {
	cursor: help;
	text-decoration: underline;
}GQ=x(function () {

	if (typeof Prism === 'undefined') {
		return;
	}

	if (Prism.languages.css) {
		// check whether the selector is an advanced pattern before extending it
		if (Prism.languages.css.selector.pattern) {
			Prism.languages.css.selector.inside['pseudo-class'] = /:[\w-]+/;
			Prism.languages.css.selector.inside['pseudo-element'] = /::[\w-]+/;
		} else {
			Prism.languages.css.selector = {
				pattern: Prism.languages.css.selector,
				inside: {
					'pseudo-class': /:[\w-]+/,
					'pseudo-element': /::[\w-]+/
				}
			};
		}
	}

	if (Prism.languages.markup) {
		Prism.languages.markup.tag.inside.tag.inside['tag-id'] = /[\w-]+/;

		var Tags = {
			HTML: {
				'a': 1, 'abbr': 1, 'acronym': 1, 'b': 1, 'basefont': 1, 'bdo': 1, 'big': 1, 'blink': 1, 'cite': 1, 'code': 1, 'dfn': 1, 'em': 1, 'kbd': 1, 'i': 1,
				'rp': 1, 'rt': 1, 'ruby': 1, 's': 1, 'samp': 1, 'small': 1, 'spacer': 1, 'strike': 1, 'strong': 1, 'sub': 1, 'sup': 1, 'time': 1, 'tt': 1, 'u': 1,
				'var': 1, 'wbr': 1, 'noframes': 1, 'summary': 1, 'command': 1, 'dt': 1, 'dd': 1, 'figure': 1, 'figcaption': 1, 'center': 1, 'section': 1, 'nav': 1,
				'article': 1, 'aside': 1, 'hgroup': 1, 'header': 1, 'footer': 1, 'address': 1, 'noscript': 1, 'isIndex': 1, 'main': 1, 'mark': 1, 'marquee': 1,
				'meter': 1, 'menu': 1
			},
			SVG: {
				'animateColor': 1, 'animateMotion': 1, 'animateTransform': 1, 'glyph': 1, 'feBlend': 1, 'feColorMatrix': 1, 'feComponentTransfer': 1,
				'feFuncR': 1, 'feFuncG': 1, 'feFuncB': 1, 'feFuncA': 1, 'feComposite': 1, 'feConvolveMatrix': 1, 'feDiffuseLighting': 1, 'feDisplacementMap': 1,
				'feFlood': 1, 'feGaussianBlur': 1, 'feImage': 1, 'feMerge': 1, 'feMergeNode': 1, 'feMorphology': 1, 'feOffset': 1, 'feSpecularLighting': 1,
				'feTile': 1, 'feTurbulence': 1, 'feDistantLight': 1, 'fePointLight': 1, 'feSpotLight': 1, 'linearGradient': 1, 'radialGradient': 1, 'altGlyph': 1,
				'textPath': 1, 'tref': 1, 'altglyph': 1, 'textpath': 1, 'altglyphdef': 1, 'altglyphitem': 1, 'clipPath': 1, 'color-profile': 1, 'cursor': 1,
				'font-face': 1, 'font-face-format': 1, 'font-face-name': 1, 'font-face-src': 1, 'font-face-uri': 1, 'foreignObject': 1, 'glyphRef': 1,
				'hkern': 1, 'vkern': 1
			},
			MathML: {}
		};
	}

	var language;

	Prism.hooks.add('wrap', function (env) {
		if ((env.type == 'tag-id'
			|| (env.type == 'property' && env.content.indexOf('-') != 0)
			|| (env.type == 'rule' && env.content.indexOf('@-') != 0)
			|| (env.type == 'pseudo-class' && env.content.indexOf(':-') != 0)
			|| (env.type == 'pseudo-element' && env.content.indexOf('::-') != 0)
			|| (env.type == 'attr-name' && env.content.indexOf('data-') != 0)
		) && env.content.indexOf('<') === -1
		) {
			if (env.language == 'css'
				|| env.language == 'scss'
				|| env.language == 'markup'
			) {
				var href = 'https://webplatform.github.io/docs/';
				var content = env.content;

				if (env.language == 'css' || env.language == 'scss') {
					href += 'css/';

					if (env.type == 'property') {
						href += 'properties/';
					} else if (env.type == 'rule') {
						href += 'atrules/';
						content = content.substring(1);
					} else if (env.type == 'pseudo-class') {
						href += 'selectors/pseudo-classes/';
						content = content.substring(1);
					} else if (env.type == 'pseudo-element') {
						href += 'selectors/pseudo-elements/';
						content = content.substring(2);
					}
				} else if (env.language == 'markup') {
					if (env.type == 'tag-id') {
						// Check language
						language = getLanguage(env.content) || language;

						if (language) {
							href += language + '/elements/';
						} else {
							return; // Abort
						}
					} else if (env.type == 'attr-name') {
						if (language) {
							href += language + '/attributes/';
						} else {
							return; // Abort
						}
					}
				}

				href += content;
				env.tag = 'a';
				env.attributes.href = href;
				env.attributes.target = '_blank';
			}
		}
	});

	function getLanguage(tag) {
		var tagL = tag.toLowerCase();

		if (Tags.HTML[tagL]) {
			return 'html';
		} else if (Tags.SVG[tag]) {
			return 'svg';
		} else if (Tags.MathML[tag]) {
			return 'mathml';
		}

		// Not in dictionary, perform check
		if (Tags.HTML[tagL] !== 0 && typeof document !== 'undefined') {
			var htmlInterface = (document.createElement(tag).toString().match(/\[object HTML(.+)Element\]/) || [])[1];

			if (htmlInterface && htmlInterface != 'Unknown') {
				Tags.HTML[tagL] = 1;
				return 'html';
			}
		}

		Tags.HTML[tagL] = 0;

		if (Tags.SVG[tag] !== 0 && typeof document !== 'undefined') {
			var svgInterface = (document.createElementNS('http://www.w3.org/2000/svg', tag).toString().match(/\[object SVG(.+)Element\]/) || [])[1];

			if (svgInterface && svgInterface != 'Unknown') {
				Tags.SVG[tag] = 1;
				return 'svg';
			}
		}

		Tags.SVG[tag] = 0;

		// Lame way to detect MathML, but browsers don’t expose interface names there :(
		if (Tags.MathML[tag] !== 0) {
			if (tag.indexOf('m') === 0) {
				Tags.MathML[tag] = 1;
				return 'mathml';
			}
		}

		Tags.MathML[tag] = 0;

		return null;
	}

}());
xx 2code[class*=language-] a[href],pre[class*=language-] a[href]{cursor:help;text-decoration:none}code[class*=language-] a[href]:hover,pre[class*=language-] a[href]:hover{cursor:help;text-decoration:underline}3PNoxU!function(){if("undefined"!=typeof Prism){if(Prism.languages.css&&(Prism.languages.css.selector.pattern?(Prism.languages.css.selector.inside["pseudo-class"]=/:[\w-]+/,Prism.languages.css.selector.inside["pseudo-element"]=/::[\w-]+/):Prism.languages.css.selector={pattern:Prism.languages.css.selector,inside:{"pseudo-class":/:[\w-]+/,"pseudo-element":/::[\w-]+/}}),Prism.languages.markup){Prism.languages.markup.tag.inside.tag.inside["tag-id"]=/[\w-]+/;var e={HTML:{a:1,abbr:1,acronym:1,b:1,basefont:1,bdo:1,big:1,blink:1,cite:1,code:1,dfn:1,em:1,kbd:1,i:1,rp:1,rt:1,ruby:1,s:1,samp:1,small:1,spacer:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,var:1,wbr:1,noframes:1,summary:1,command:1,dt:1,dd:1,figure:1,figcaption:1,center:1,section:1,nav:1,article:1,aside:1,hgroup:1,header:1,footer:1,address:1,noscript:1,isIndex:1,main:1,mark:1,marquee:1,meter:1,menu:1},SVG:{animateColor:1,animateMotion:1,animateTransform:1,glyph:1,feBlend:1,feColorMatrix:1,feComponentTransfer:1,feFuncR:1,feFuncG:1,feFuncB:1,feFuncA:1,feComposite:1,feConvolveMatrix:1,feDiffuseLighting:1,feDisplacementMap:1,feFlood:1,feGaussianBlur:1,feImage:1,feMerge:1,feMergeNode:1,feMorphology:1,feOffset:1,feSpecularLighting:1,feTile:1,feTurbulence:1,feDistantLight:1,fePointLight:1,feSpotLight:1,linearGradient:1,radialGradient:1,altGlyph:1,textPath:1,tref:1,altglyph:1,textpath:1,altglyphdef:1,altglyphitem:1,clipPath:1,"color-profile":1,cursor:1,"font-face":1,"font-face-format":1,"font-face-name":1,"font-face-src":1,"font-face-uri":1,foreignObject:1,glyphRef:1,hkern:1,vkern:1},MathML:{}}}var t;Prism.hooks.add("wrap",(function(n){if(("tag-id"==n.type||"property"==n.type&&0!=n.content.indexOf("-")||"rule"==n.type&&0!=n.content.indexOf("@-")||"pseudo-class"==n.type&&0!=n.content.indexOf(":-")||"pseudo-element"==n.type&&0!=n.content.indexOf("::-")||"attr-name"==n.type&&0!=n.content.indexOf("data-"))&&-1===n.content.indexOf("<")&&("css"==n.language||"scss"==n.language||"markup"==n.language)){var a="https://webplatform.github.io/docs/",s=n.content;if("css"==n.language||"scss"==n.language)a+="css/","property"==n.type?a+="properties/":"rule"==n.type?(a+="atrules/",s=s.substring(1)):"pseudo-class"==n.type?(a+="selectors/pseudo-classes/",s=s.substring(1)):"pseudo-element"==n.type&&(a+="selectors/pseudo-elements/",s=s.substring(2));else if("markup"==n.language)if("tag-id"==n.type){if(!(t=function(t){var n=t.toLowerCase();if(e.HTML[n])return"html";if(e.SVG[t])return"svg";if(e.MathML[t])return"mathml";if(0!==e.HTML[n]&&"undefined"!=typeof document){var a=(document.createElement(t).toString().match(/\[object HTML(.+)Element\]/)||[])[1];if(a&&"Unknown"!=a)return e.HTML[n]=1,"html"}if(e.HTML[n]=0,0!==e.SVG[t]&&"undefined"!=typeof document){var s=(document.createElementNS("http://www.w3.org/2000/svg",t).toString().match(/\[object SVG(.+)Element\]/)||[])[1];if(s&&"Unknown"!=s)return e.SVG[t]=1,"svg"}return e.SVG[t]=0,0!==e.MathML[t]&&0===t.indexOf("m")?(e.MathML[t]=1,"mathml"):(e.MathML[t]=0,null)}(n.content)||t))return;a+=t+"/elements/"}else if("attr-name"==n.type){if(!t)return;a+=t+"/attributes/"}a+=s,n.tag="a",n.attributes.href=a,n.attributes.target="_blank"}}))}}();G=Mx
/* **********************************************
     Begin prism-core.js
********************************************** */

/// <reference lib="WebWorker"/>

var _self = (typeof window !== 'undefined')
	? window   // if in browser
	: (
		(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
			? self // if in worker
			: {}   // if in node js
	);

/**
 * Prism: Lightweight, robust, elegant syntax highlighting
 *
 * @license MIT <https://opensource.org/licenses/MIT>
 * @author Lea Verou <https://lea.verou.me>
 * @namespace
 * @public
 */
var Prism = (function (_self) {

	// Private helper vars
	var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
	var uniqueId = 0;

	// The grammar object for plaintext
	var plainTextGrammar = {};


	var _ = {
		/**
		 * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
		 * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
		 * additional languages or plugins yourself.
		 *
		 * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.
		 *
		 * You obviously have to change this value before the automatic highlighting started. To do this, you can add an
		 * empty Prism object into the global scope before loading the Prism script like this:
		 *
		 * ```js
		 * window.Prism = window.Prism || {};
		 * Prism.manual = true;
		 * // add a new <script> to load Prism's script
		 * ```
		 *
		 * @default false
		 * @type {boolean}
		 * @memberof Prism
		 * @public
		 */
		manual: _self.Prism && _self.Prism.manual,
		/**
		 * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses
		 * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your
		 * own worker, you don't want it to do this.
		 *
		 * By setting this value to `true`, Prism will not add its own listeners to the worker.
		 *
		 * You obviously have to change this value before Prism executes. To do this, you can add an
		 * empty Prism object into the global scope before loading the Prism script like this:
		 *
		 * ```js
		 * window.Prism = window.Prism || {};
		 * Prism.disableWorkerMessageHandler = true;
		 * // Load Prism's script
		 * ```
		 *
		 * @default false
		 * @type {boolean}
		 * @memberof Prism
		 * @public
		 */
		disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,

		/**
		 * A namespace for utility methods.
		 *
		 * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may
		 * change or disappear at any time.
		 *
		 * @namespace
		 * @memberof Prism
		 */
		util: {
			encode: function encode(tokens) {
				if (tokens instanceof Token) {
					return new Token(tokens.type, encode(tokens.content), tokens.alias);
				} else if (Array.isArray(tokens)) {
					return tokens.map(encode);
				} else {
					return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
				}
			},

			/**
			 * Returns the name of the type of the given value.
			 *
			 * @param {any} o
			 * @returns {string}
			 * @example
			 * type(null)      === 'Null'
			 * type(undefined) === 'Undefined'
			 * type(123)       === 'Number'
			 * type('foo')     === 'String'
			 * type(true)      === 'Boolean'
			 * type([1, 2])    === 'Array'
			 * type({})        === 'Object'
			 * type(String)    === 'Function'
			 * type(/abc+/)    === 'RegExp'
			 */
			type: function (o) {
				return Object.prototype.toString.call(o).slice(8, -1);
			},

			/**
			 * Returns a unique number for the given object. Later calls will still return the same number.
			 *
			 * @param {Object} obj
			 * @returns {number}
			 */
			objId: function (obj) {
				if (!obj['__id']) {
					Object.defineProperty(obj, '__id', { value: ++uniqueId });
				}
				return obj['__id'];
			},

			/**
			 * Creates a deep clone of the given object.
			 *
			 * The main intended use of this function is to clone language definitions.
			 *
			 * @param {T} o
			 * @param {Record<number, any>} [visited]
			 * @returns {T}
			 * @template T
			 */
			clone: function deepClone(o, visited) {
				visited = visited || {};

				var clone; var id;
				switch (_.util.type(o)) {
					case 'Object':
						id = _.util.objId(o);
						if (visited[id]) {
							return visited[id];
						}
						clone = /** @type {Record<string, any>} */ ({});
						visited[id] = clone;

						for (var key in o) {
							if (o.hasOwnProperty(key)) {
								clone[key] = deepClone(o[key], visited);
							}
						}

						return /** @type {any} */ (clone);

					case 'Array':
						id = _.util.objId(o);
						if (visited[id]) {
							return visited[id];
						}
						clone = [];
						visited[id] = clone;

						(/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) {
							clone[i] = deepClone(v, visited);
						});

						return /** @type {any} */ (clone);

					default:
						return o;
				}
			},

			/**
			 * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.
			 *
			 * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.
			 *
			 * @param {Element} element
			 * @returns {string}
			 */
			getLanguage: function (element) {
				while (element) {
					var m = lang.exec(element.className);
					if (m) {
						return m[1].toLowerCase();
					}
					element = element.parentElement;
				}
				return 'none';
			},

			/**
			 * Sets the Prism `language-xxxx` class of the given element.
			 *
			 * @param {Element} element
			 * @param {string} language
			 * @returns {void}
			 */
			setLanguage: function (element, language) {
				// remove all `language-xxxx` classes
				// (this might leave behind a leading space)
				element.className = element.className.replace(RegExp(lang, 'gi'), '');

				// add the new `language-xxxx` class
				// (using `classList` will automatically clean up spaces for us)
				element.classList.add('language-' + language);
			},

			/**
			 * Returns the script element that is currently executing.
			 *
			 * This does __not__ work for line script element.
			 *
			 * @returns {HTMLScriptElement | null}
			 */
			currentScript: function () {
				if (typeof document === 'undefined') {
					return null;
				}
				if (document.currentScript && document.currentScript.tagName === 'SCRIPT' && 1 < 2 /* hack to trip TS' flow analysis */) {
					return /** @type {any} */ (document.currentScript);
				}

				// IE11 workaround
				// we'll get the src of the current script by parsing IE11's error stack trace
				// this will not work for inline scripts

				try {
					throw new Error();
				} catch (err) {
					// Get file src url from stack. Specifically works with the format of stack traces in IE.
					// A stack will look like this:
					//
					// Error
					//    at _.util.currentScript (http://localhost/components/prism-core.js:119:5)
					//    at Global code (http://localhost/components/prism-core.js:606:1)

					var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
					if (src) {
						var scripts = document.getElementsByTagName('script');
						for (var i in scripts) {
							if (scripts[i].src == src) {
								return scripts[i];
							}
						}
					}
					return null;
				}
			},

			/**
			 * Returns whether a given class is active for `element`.
			 *
			 * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated
			 * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the
			 * given class is just the given class with a `no-` prefix.
			 *
			 * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is
			 * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its
			 * ancestors have the given class or the negated version of it, then the default activation will be returned.
			 *
			 * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated
			 * version of it, the class is considered active.
			 *
			 * @param {Element} element
			 * @param {string} className
			 * @param {boolean} [defaultActivation=false]
			 * @returns {boolean}
			 */
			isActive: function (element, className, defaultActivation) {
				var no = 'no-' + className;

				while (element) {
					var classList = element.classList;
					if (classList.contains(className)) {
						return true;
					}
					if (classList.contains(no)) {
						return false;
					}
					element = element.parentElement;
				}
				return !!defaultActivation;
			}
		},

		/**
		 * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.
		 *
		 * @namespace
		 * @memberof Prism
		 * @public
		 */
		languages: {
			/**
			 * The grammar for plain, unformatted text.
			 */
			plain: plainTextGrammar,
			plaintext: plainTextGrammar,
			text: plainTextGrammar,
			txt: plainTextGrammar,

			/**
			 * Creates a deep copy of the language with the given id and appends the given tokens.
			 *
			 * If a token in `redef` also appears in the copied language, then the existing token in the copied language
			 * will be overwritten at its original position.
			 *
			 * ## Best practices
			 *
			 * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)
			 * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to
			 * understand the language definition because, normally, the order of tokens matters in Prism grammars.
			 *
			 * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.
			 * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.
			 *
			 * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.
			 * @param {Grammar} redef The new tokens to append.
			 * @returns {Grammar} The new language created.
			 * @public
			 * @example
			 * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {
			 *     // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token
			 *     // at its original position
			 *     'comment': { ... },
			 *     // CSS doesn't have a 'color' token, so this token will be appended
			 *     'color': /\b(?:red|green|blue)\b/
			 * });
			 */
			extend: function (id, redef) {
				var lang = _.util.clone(_.languages[id]);

				for (var key in redef) {
					lang[key] = redef[key];
				}

				return lang;
			},

			/**
			 * Inserts tokens _before_ another token in a language definition or any other grammar.
			 *
			 * ## Usage
			 *
			 * This helper method makes it easy to modify existing languages. For example, the CSS language definition
			 * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded
			 * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the
			 * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do
			 * this:
			 *
			 * ```js
			 * Prism.languages.markup.style = {
			 *     // token
			 * };
			 * ```
			 *
			 * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens
			 * before existing tokens. For the CSS example above, you would use it like this:
			 *
			 * ```js
			 * Prism.languages.insertBefore('markup', 'cdata', {
			 *     'style': {
			 *         // token
			 *     }
			 * });
			 * ```
			 *
			 * ## Special cases
			 *
			 * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar
			 * will be ignored.
			 *
			 * This behavior can be used to insert tokens after `before`:
			 *
			 * ```js
			 * Prism.languages.insertBefore('markup', 'comment', {
			 *     'comment': Prism.languages.markup.comment,
			 *     // tokens after 'comment'
			 * });
			 * ```
			 *
			 * ## Limitations
			 *
			 * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object
			 * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave
			 * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily
			 * deleting properties which is necessary to insert at arbitrary positions.
			 *
			 * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.
			 * Instead, it will create a new object and replace all references to the target object with the new one. This
			 * can be done without temporarily deleting properties, so the iteration order is well-defined.
			 *
			 * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if
			 * you hold the target object in a variable, then the value of the variable will not change.
			 *
			 * ```js
			 * var oldMarkup = Prism.languages.markup;
			 * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });
			 *
			 * assert(oldMarkup !== Prism.languages.markup);
			 * assert(newMarkup === Prism.languages.markup);
			 * ```
			 *
			 * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the
			 * object to be modified.
			 * @param {string} before The key to insert before.
			 * @param {Grammar} insert An object containing the key-value pairs to be inserted.
			 * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the
			 * object to be modified.
			 *
			 * Defaults to `Prism.languages`.
			 * @returns {Grammar} The new grammar object.
			 * @public
			 */
			insertBefore: function (inside, before, insert, root) {
				root = root || /** @type {any} */ (_.languages);
				var grammar = root[inside];
				/** @type {Grammar} */
				var ret = {};

				for (var token in grammar) {
					if (grammar.hasOwnProperty(token)) {

						if (token == before) {
							for (var newToken in insert) {
								if (insert.hasOwnProperty(newToken)) {
									ret[newToken] = insert[newToken];
								}
							}
						}

						// Do not insert token which also occur in insert. See #1525
						if (!insert.hasOwnProperty(token)) {
							ret[token] = grammar[token];
						}
					}
				}

				var old = root[inside];
				root[inside] = ret;

				// Update references in other language definitions
				_.languages.DFS(_.languages, function (key, value) {
					if (value === old && key != inside) {
						this[key] = ret;
					}
				});

				return ret;
			},

			// Traverse a language definition with Depth First Search
			DFS: function DFS(o, callback, type, visited) {
				visited = visited || {};

				var objId = _.util.objId;

				for (var i in o) {
					if (o.hasOwnProperty(i)) {
						callback.call(o, i, o[i], type || i);

						var property = o[i];
						var propertyType = _.util.type(property);

						if (propertyType === 'Object' && !visited[objId(property)]) {
							visited[objId(property)] = true;
							DFS(property, callback, null, visited);
						} else if (propertyType === 'Array' && !visited[objId(property)]) {
							visited[objId(property)] = true;
							DFS(property, callback, i, visited);
						}
					}
				}
			}
		},

		plugins: {},

		/**
		 * This is the most high-level function in Prism’s API.
		 * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on
		 * each one of them.
		 *
		 * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.
		 *
		 * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.
		 * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.
		 * @memberof Prism
		 * @public
		 */
		highlightAll: function (async, callback) {
			_.highlightAllUnder(document, async, callback);
		},

		/**
		 * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls
		 * {@link Prism.highlightElement} on each one of them.
		 *
		 * The following hooks will be run:
		 * 1. `before-highlightall`
		 * 2. `before-all-elements-highlight`
		 * 3. All hooks of {@link Prism.highlightElement} for each element.
		 *
		 * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.
		 * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.
		 * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.
		 * @memberof Prism
		 * @public
		 */
		highlightAllUnder: function (container, async, callback) {
			var env = {
				callback: callback,
				container: container,
				selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
			};

			_.hooks.run('before-highlightall', env);

			env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));

			_.hooks.run('before-all-elements-highlight', env);

			for (var i = 0, element; (element = env.elements[i++]);) {
				_.highlightElement(element, async === true, env.callback);
			}
		},

		/**
		 * Highlights the code inside a single element.
		 *
		 * The following hooks will be run:
		 * 1. `before-sanity-check`
		 * 2. `before-highlight`
		 * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.
		 * 4. `before-insert`
		 * 5. `after-highlight`
		 * 6. `complete`
		 *
		 * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for
		 * the element's language.
		 *
		 * @param {Element} element The element containing the code.
		 * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.
		 * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers
		 * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is
		 * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).
		 *
		 * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for
		 * asynchronous highlighting to work. You can build your own bundle on the
		 * [Download page](https://prismjs.com/download.html).
		 * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.
		 * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.
		 * @memberof Prism
		 * @public
		 */
		highlightElement: function (element, async, callback) {
			// Find language
			var language = _.util.getLanguage(element);
			var grammar = _.languages[language];

			// Set language on the element, if not present
			_.util.setLanguage(element, language);

			// Set language on the parent, for styling
			var parent = element.parentElement;
			if (parent && parent.nodeName.toLowerCase() === 'pre') {
				_.util.setLanguage(parent, language);
			}

			var code = element.textContent;

			var env = {
				element: element,
				language: language,
				grammar: grammar,
				code: code
			};

			function insertHighlightedCode(highlightedCode) {
				env.highlightedCode = highlightedCode;

				_.hooks.run('before-insert', env);

				env.element.innerHTML = env.highlightedCode;

				_.hooks.run('after-highlight', env);
				_.hooks.run('complete', env);
				callback && callback.call(env.element);
			}

			_.hooks.run('before-sanity-check', env);

			// plugins may change/add the parent/element
			parent = env.element.parentElement;
			if (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {
				parent.setAttribute('tabindex', '0');
			}

			if (!env.code) {
				_.hooks.run('complete', env);
				callback && callback.call(env.element);
				return;
			}

			_.hooks.run('before-highlight', env);

			if (!env.grammar) {
				insertHighlightedCode(_.util.encode(env.code));
				return;
			}

			if (async && _self.Worker) {
				var worker = new Worker(_.filename);

				worker.onmessage = function (evt) {
					insertHighlightedCode(evt.data);
				};

				worker.postMessage(JSON.stringify({
					language: env.language,
					code: env.code,
					immediateClose: true
				}));
			} else {
				insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
			}
		},

		/**
		 * Low-level function, only use if you know what you’re doing. It accepts a string of text as input
		 * and the language definitions to use, and returns a string with the HTML produced.
		 *
		 * The following hooks will be run:
		 * 1. `before-tokenize`
		 * 2. `after-tokenize`
		 * 3. `wrap`: On each {@link Token}.
		 *
		 * @param {string} text A string with the code to be highlighted.
		 * @param {Grammar} grammar An object containing the tokens to use.
		 *
		 * Usually a language definition like `Prism.languages.markup`.
		 * @param {string} language The name of the language definition passed to `grammar`.
		 * @returns {string} The highlighted HTML.
		 * @memberof Prism
		 * @public
		 * @example
		 * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');
		 */
		highlight: function (text, grammar, language) {
			var env = {
				code: text,
				grammar: grammar,
				language: language
			};
			_.hooks.run('before-tokenize', env);
			if (!env.grammar) {
				throw new Error('The language "' + env.language + '" has no grammar.');
			}
			env.tokens = _.tokenize(env.code, env.grammar);
			_.hooks.run('after-tokenize', env);
			return Token.stringify(_.util.encode(env.tokens), env.language);
		},

		/**
		 * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input
		 * and the language definitions to use, and returns an array with the tokenized code.
		 *
		 * When the language definition includes nested tokens, the function is called recursively on each of these tokens.
		 *
		 * This method could be useful in other contexts as well, as a very crude parser.
		 *
		 * @param {string} text A string with the code to be highlighted.
		 * @param {Grammar} grammar An object containing the tokens to use.
		 *
		 * Usually a language definition like `Prism.languages.markup`.
		 * @returns {TokenStream} An array of strings and tokens, a token stream.
		 * @memberof Prism
		 * @public
		 * @example
		 * let code = `var foo = 0;`;
		 * let tokens = Prism.tokenize(code, Prism.languages.javascript);
		 * tokens.forEach(token => {
		 *     if (token instanceof Prism.Token && token.type === 'number') {
		 *         console.log(`Found numeric literal: ${token.content}`);
		 *     }
		 * });
		 */
		tokenize: function (text, grammar) {
			var rest = grammar.rest;
			if (rest) {
				for (var token in rest) {
					grammar[token] = rest[token];
				}

				delete grammar.rest;
			}

			var tokenList = new LinkedList();
			addAfter(tokenList, tokenList.head, text);

			matchGrammar(text, tokenList, grammar, tokenList.head, 0);

			return toArray(tokenList);
		},

		/**
		 * @namespace
		 * @memberof Prism
		 * @public
		 */
		hooks: {
			all: {},

			/**
			 * Adds the given callback to the list of callbacks for the given hook.
			 *
			 * The callback will be invoked when the hook it is registered for is run.
			 * Hooks are usually directly run by a highlight function but you can also run hooks yourself.
			 *
			 * One callback function can be registered to multiple hooks and the same hook multiple times.
			 *
			 * @param {string} name The name of the hook.
			 * @param {HookCallback} callback The callback function which is given environment variables.
			 * @public
			 */
			add: function (name, callback) {
				var hooks = _.hooks.all;

				hooks[name] = hooks[name] || [];

				hooks[name].push(callback);
			},

			/**
			 * Runs a hook invoking all registered callbacks with the given environment variables.
			 *
			 * Callbacks will be invoked synchronously and in the order in which they were registered.
			 *
			 * @param {string} name The name of the hook.
			 * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.
			 * @public
			 */
			run: function (name, env) {
				var callbacks = _.hooks.all[name];

				if (!callbacks || !callbacks.length) {
					return;
				}

				for (var i = 0, callback; (callback = callbacks[i++]);) {
					callback(env);
				}
			}
		},

		Token: Token
	};
	_self.Prism = _;


	// Typescript note:
	// The following can be used to import the Token type in JSDoc:
	//
	//   @typedef {InstanceType<import("./prism-core")["Token"]>} Token

	/**
	 * Creates a new token.
	 *
	 * @param {string} type See {@link Token#type type}
	 * @param {string | TokenStream} content See {@link Token#content content}
	 * @param {string|string[]} [alias] The alias(es) of the token.
	 * @param {string} [matchedStr=""] A copy of the full string this token was created from.
	 * @class
	 * @global
	 * @public
	 */
	function Token(type, content, alias, matchedStr) {
		/**
		 * The type of the token.
		 *
		 * This is usually the key of a pattern in a {@link Grammar}.
		 *
		 * @type {string}
		 * @see GrammarToken
		 * @public
		 */
		this.type = type;
		/**
		 * The strings or tokens contained by this token.
		 *
		 * This will be a token stream if the pattern matched also defined an `inside` grammar.
		 *
		 * @type {string | TokenStream}
		 * @public
		 */
		this.content = content;
		/**
		 * The alias(es) of the token.
		 *
		 * @type {string|string[]}
		 * @see GrammarToken
		 * @public
		 */
		this.alias = alias;
		// Copy of the full string this token was created from
		this.length = (matchedStr || '').length | 0;
	}

	/**
	 * A token stream is an array of strings and {@link Token Token} objects.
	 *
	 * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process
	 * them.
	 *
	 * 1. No adjacent strings.
	 * 2. No empty strings.
	 *
	 *    The only exception here is the token stream that only contains the empty string and nothing else.
	 *
	 * @typedef {Array<string | Token>} TokenStream
	 * @global
	 * @public
	 */

	/**
	 * Converts the given token or token stream to an HTML representation.
	 *
	 * The following hooks will be run:
	 * 1. `wrap`: On each {@link Token}.
	 *
	 * @param {string | Token | TokenStream} o The token or token stream to be converted.
	 * @param {string} language The name of current language.
	 * @returns {string} The HTML representation of the token or token stream.
	 * @memberof Token
	 * @static
	 */
	Token.stringify = function stringify(o, language) {
		if (typeof o == 'string') {
			return o;
		}
		if (Array.isArray(o)) {
			var s = '';
			o.forEach(function (e) {
				s += stringify(e, language);
			});
			return s;
		}

		var env = {
			type: o.type,
			content: stringify(o.content, language),
			tag: 'span',
			classes: ['token', o.type],
			attributes: {},
			language: language
		};

		var aliases = o.alias;
		if (aliases) {
			if (Array.isArray(aliases)) {
				Array.prototype.push.apply(env.classes, aliases);
			} else {
				env.classes.push(aliases);
			}
		}

		_.hooks.run('wrap', env);

		var attributes = '';
		for (var name in env.attributes) {
			attributes += ' ' + name + '="' + (env.attributes[name] || '').replace(/"/g, '&quot;') + '"';
		}

		return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + attributes + '>' + env.content + '</' + env.tag + '>';
	};

	/**
	 * @param {RegExp} pattern
	 * @param {number} pos
	 * @param {string} text
	 * @param {boolean} lookbehind
	 * @returns {RegExpExecArray | null}
	 */
	function matchPattern(pattern, pos, text, lookbehind) {
		pattern.lastIndex = pos;
		var match = pattern.exec(text);
		if (match && lookbehind && match[1]) {
			// change the match to remove the text matched by the Prism lookbehind group
			var lookbehindLength = match[1].length;
			match.index += lookbehindLength;
			match[0] = match[0].slice(lookbehindLength);
		}
		return match;
	}

	/**
	 * @param {string} text
	 * @param {LinkedList<string | Token>} tokenList
	 * @param {any} grammar
	 * @param {LinkedListNode<string | Token>} startNode
	 * @param {number} startPos
	 * @param {RematchOptions} [rematch]
	 * @returns {void}
	 * @private
	 *
	 * @typedef RematchOptions
	 * @property {string} cause
	 * @property {number} reach
	 */
	function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
		for (var token in grammar) {
			if (!grammar.hasOwnProperty(token) || !grammar[token]) {
				continue;
			}

			var patterns = grammar[token];
			patterns = Array.isArray(patterns) ? patterns : [patterns];

			for (var j = 0; j < patterns.length; ++j) {
				if (rematch && rematch.cause == token + ',' + j) {
					return;
				}

				var patternObj = patterns[j];
				var inside = patternObj.inside;
				var lookbehind = !!patternObj.lookbehind;
				var greedy = !!patternObj.greedy;
				var alias = patternObj.alias;

				if (greedy && !patternObj.pattern.global) {
					// Without the global flag, lastIndex won't work
					var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
					patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');
				}

				/** @type {RegExp} */
				var pattern = patternObj.pattern || patternObj;

				for ( // iterate the token list and keep track of the current token/string position
					var currentNode = startNode.next, pos = startPos;
					currentNode !== tokenList.tail;
					pos += currentNode.value.length, currentNode = currentNode.next
				) {

					if (rematch && pos >= rematch.reach) {
						break;
					}

					var str = currentNode.value;

					if (tokenList.length > text.length) {
						// Something went terribly wrong, ABORT, ABORT!
						return;
					}

					if (str instanceof Token) {
						continue;
					}

					var removeCount = 1; // this is the to parameter of removeBetween
					var match;

					if (greedy) {
						match = matchPattern(pattern, pos, text, lookbehind);
						if (!match || match.index >= text.length) {
							break;
						}

						var from = match.index;
						var to = match.index + match[0].length;
						var p = pos;

						// find the node that contains the match
						p += currentNode.value.length;
						while (from >= p) {
							currentNode = currentNode.next;
							p += currentNode.value.length;
						}
						// adjust pos (and p)
						p -= currentNode.value.length;
						pos = p;

						// the current node is a Token, then the match starts inside another Token, which is invalid
						if (currentNode.value instanceof Token) {
							continue;
						}

						// find the last node which is affected by this match
						for (
							var k = currentNode;
							k !== tokenList.tail && (p < to || typeof k.value === 'string');
							k = k.next
						) {
							removeCount++;
							p += k.value.length;
						}
						removeCount--;

						// replace with the new match
						str = text.slice(pos, p);
						match.index -= pos;
					} else {
						match = matchPattern(pattern, 0, str, lookbehind);
						if (!match) {
							continue;
						}
					}

					// eslint-disable-next-line no-redeclare
					var from = match.index;
					var matchStr = match[0];
					var before = str.slice(0, from);
					var after = str.slice(from + matchStr.length);

					var reach = pos + str.length;
					if (rematch && reach > rematch.reach) {
						rematch.reach = reach;
					}

					var removeFrom = currentNode.prev;

					if (before) {
						removeFrom = addAfter(tokenList, removeFrom, before);
						pos += before.length;
					}

					removeRange(tokenList, removeFrom, removeCount);

					var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
					currentNode = addAfter(tokenList, removeFrom, wrapped);

					if (after) {
						addAfter(tokenList, currentNode, after);
					}

					if (removeCount > 1) {
						// at least one Token object was removed, so we have to do some rematching
						// this can only happen if the current pattern is greedy

						/** @type {RematchOptions} */
						var nestedRematch = {
							cause: token + ',' + j,
							reach: reach
						};
						matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);

						// the reach might have been extended because of the rematching
						if (rematch && nestedRematch.reach > rematch.reach) {
							rematch.reach = nestedRematch.reach;
						}
					}
				}
			}
		}
	}

	/**
	 * @typedef LinkedListNode
	 * @property {T} value
	 * @property {LinkedListNode<T> | null} prev The previous node.
	 * @property {LinkedListNode<T> | null} next The next node.
	 * @template T
	 * @private
	 */

	/**
	 * @template T
	 * @private
	 */
	function LinkedList() {
		/** @type {LinkedListNode<T>} */
		var head = { value: null, prev: null, next: null };
		/** @type {LinkedListNode<T>} */
		var tail = { value: null, prev: head, next: null };
		head.next = tail;

		/** @type {LinkedListNode<T>} */
		this.head = head;
		/** @type {LinkedListNode<T>} */
		this.tail = tail;
		this.length = 0;
	}

	/**
	 * Adds a new node with the given value to the list.
	 *
	 * @param {LinkedList<T>} list
	 * @param {LinkedListNode<T>} node
	 * @param {T} value
	 * @returns {LinkedListNode<T>} The added node.
	 * @template T
	 */
	function addAfter(list, node, value) {
		// assumes that node != list.tail && values.length >= 0
		var next = node.next;

		var newNode = { value: value, prev: node, next: next };
		node.next = newNode;
		next.prev = newNode;
		list.length++;

		return newNode;
	}
	/**
	 * Removes `count` nodes after the given node. The given node will not be removed.
	 *
	 * @param {LinkedList<T>} list
	 * @param {LinkedListNode<T>} node
	 * @param {number} count
	 * @template T
	 */
	function removeRange(list, node, count) {
		var next = node.next;
		for (var i = 0; i < count && next !== list.tail; i++) {
			next = next.next;
		}
		node.next = next;
		next.prev = node;
		list.length -= i;
	}
	/**
	 * @param {LinkedList<T>} list
	 * @returns {T[]}
	 * @template T
	 */
	function toArray(list) {
		var array = [];
		var node = list.head.next;
		while (node !== list.tail) {
			array.push(node.value);
			node = node.next;
		}
		return array;
	}


	if (!_self.document) {
		if (!_self.addEventListener) {
			// in Node.js
			return _;
		}

		if (!_.disableWorkerMessageHandler) {
			// In worker
			_self.addEventListener('message', function (evt) {
				var message = JSON.parse(evt.data);
				var lang = message.language;
				var code = message.code;
				var immediateClose = message.immediateClose;

				_self.postMessage(_.highlight(code, _.languages[lang], lang));
				if (immediateClose) {
					_self.close();
				}
			}, false);
		}

		return _;
	}

	// Get current script and highlight
	var script = _.util.currentScript();

	if (script) {
		_.filename = script.src;

		if (script.hasAttribute('data-manual')) {
			_.manual = true;
		}
	}

	function highlightAutomaticallyCallback() {
		if (!_.manual) {
			_.highlightAll();
		}
	}

	if (!_.manual) {
		// If the document state is "loading", then we'll use DOMContentLoaded.
		// If the document state is "interactive" and the prism.js script is deferred, then we'll also use the
		// DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they
		// might take longer one animation frame to execute which can create a race condition where only some plugins have
		// been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.
		// See https://github.com/PrismJS/prism/issues/2102
		var readyState = document.readyState;
		if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {
			document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);
		} else {
			if (window.requestAnimationFrame) {
				window.requestAnimationFrame(highlightAutomaticallyCallback);
			} else {
				window.setTimeout(highlightAutomaticallyCallback, 16);
			}
		}
	}

	return _;

}(_self));

if (typeof module !== 'undefined' && module.exports) {
	module.exports = Prism;
}

// hack for components to work correctly in node.js
if (typeof global !== 'undefined') {
	global.Prism = Prism;
}

// some additional documentation/types

/**
 * The expansion of a simple `RegExp` literal to support additional properties.
 *
 * @typedef GrammarToken
 * @property {RegExp} pattern The regular expression of the token.
 * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively)
 * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.
 * @property {boolean} [greedy=false] Whether the token is greedy.
 * @property {string|string[]} [alias] An optional alias or list of aliases.
 * @property {Grammar} [inside] The nested grammar of this token.
 *
 * The `inside` grammar will be used to tokenize the text value of each token of this kind.
 *
 * This can be used to make nested and even recursive language definitions.
 *
 * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into
 * each another.
 * @global
 * @public
 */

/**
 * @typedef Grammar
 * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>}
 * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar.
 * @global
 * @public
 */

/**
 * A function which will invoked after an element was successfully highlighted.
 *
 * @callback HighlightCallback
 * @param {Element} element The element successfully highlighted.
 * @returns {void}
 * @global
 * @public
 */

/**
 * @callback HookCallback
 * @param {Object<string, any>} env The environment variables of the hook.
 * @returns {void}
 * @global
 * @public
 */


/* **********************************************
     Begin prism-markup.js
********************************************** */

Prism.languages.markup = {
	'comment': {
		pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
		greedy: true
	},
	'prolog': {
		pattern: /<\?[\s\S]+?\?>/,
		greedy: true
	},
	'doctype': {
		// https://www.w3.org/TR/xml/#NT-doctypedecl
		pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
		greedy: true,
		inside: {
			'internal-subset': {
				pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
				lookbehind: true,
				greedy: true,
				inside: null // see below
			},
			'string': {
				pattern: /"[^"]*"|'[^']*'/,
				greedy: true
			},
			'punctuation': /^<!|>$|[[\]]/,
			'doctype-tag': /^DOCTYPE/i,
			'name': /[^\s<>'"]+/
		}
	},
	'cdata': {
		pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
		greedy: true
	},
	'tag': {
		pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
		greedy: true,
		inside: {
			'tag': {
				pattern: /^<\/?[^\s>\/]+/,
				inside: {
					'punctuation': /^<\/?/,
					'namespace': /^[^\s>\/:]+:/
				}
			},
			'special-attr': [],
			'attr-value': {
				pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
				inside: {
					'punctuation': [
						{
							pattern: /^=/,
							alias: 'attr-equals'
						},
						{
							pattern: /^(\s*)["']|["']$/,
							lookbehind: true
						}
					]
				}
			},
			'punctuation': /\/?>/,
			'attr-name': {
				pattern: /[^\s>\/]+/,
				inside: {
					'namespace': /^[^\s>\/:]+:/
				}
			}

		}
	},
	'entity': [
		{
			pattern: /&[\da-z]{1,8};/i,
			alias: 'named-entity'
		},
		/&#x?[\da-f]{1,8};/i
	]
};

Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] =
	Prism.languages.markup['entity'];
Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;

// Plugin to make entity title show the real entity, idea by Roman Komarov
Prism.hooks.add('wrap', function (env) {

	if (env.type === 'entity') {
		env.attributes['title'] = env.content.replace(/&amp;/, '&');
	}
});

Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {
	/**
	 * Adds an inlined language to markup.
	 *
	 * An example of an inlined language is CSS with `<style>` tags.
	 *
	 * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as
	 * case insensitive.
	 * @param {string} lang The language key.
	 * @example
	 * addInlined('style', 'css');
	 */
	value: function addInlined(tagName, lang) {
		var includedCdataInside = {};
		includedCdataInside['language-' + lang] = {
			pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
			lookbehind: true,
			inside: Prism.languages[lang]
		};
		includedCdataInside['cdata'] = /^<!\[CDATA\[|\]\]>$/i;

		var inside = {
			'included-cdata': {
				pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
				inside: includedCdataInside
			}
		};
		inside['language-' + lang] = {
			pattern: /[\s\S]+/,
			inside: Prism.languages[lang]
		};

		var def = {};
		def[tagName] = {
			pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),
			lookbehind: true,
			greedy: true,
			inside: inside
		};

		Prism.languages.insertBefore('markup', 'cdata', def);
	}
});
Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', {
	/**
	 * Adds an pattern to highlight languages embedded in HTML attributes.
	 *
	 * An example of an inlined language is CSS with `style` attributes.
	 *
	 * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as
	 * case insensitive.
	 * @param {string} lang The language key.
	 * @example
	 * addAttribute('style', 'css');
	 */
	value: function (attrName, lang) {
		Prism.languages.markup.tag.inside['special-attr'].push({
			pattern: RegExp(
				/(^|["'\s])/.source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,
				'i'
			),
			lookbehind: true,
			inside: {
				'attr-name': /^[^\s=]+/,
				'attr-value': {
					pattern: /=[\s\S]+/,
					inside: {
						'value': {
							pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
							lookbehind: true,
							alias: [lang, 'language-' + lang],
							inside: Prism.languages[lang]
						},
						'punctuation': [
							{
								pattern: /^=/,
								alias: 'attr-equals'
							},
							/"|'/
						]
					}
				}
			}
		});
	}
});

Prism.languages.html = Prism.languages.markup;
Prism.languages.mathml = Prism.languages.markup;
Prism.languages.svg = Prism.languages.markup;

Prism.languages.xml = Prism.languages.extend('markup', {});
Prism.languages.ssml = Prism.languages.xml;
Prism.languages.atom = Prism.languages.xml;
Prism.languages.rss = Prism.languages.xml;


/* **********************************************
     Begin prism-css.js
********************************************** */

(function (Prism) {

	var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;

	Prism.languages.css = {
		'comment': /\/\*[\s\S]*?\*\//,
		'atrule': {
			pattern: RegExp('@[\\w-](?:' + /[^;{\s"']|\s+(?!\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\s*\{))/.source),
			inside: {
				'rule': /^@[\w-]+/,
				'selector-function-argument': {
					pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
					lookbehind: true,
					alias: 'selector'
				},
				'keyword': {
					pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/,
					lookbehind: true
				}
				// See rest below
			}
		},
		'url': {
			// https://drafts.csswg.org/css-values-3/#urls
			pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'),
			greedy: true,
			inside: {
				'function': /^url/i,
				'punctuation': /^\(|\)$/,
				'string': {
					pattern: RegExp('^' + string.source + '$'),
					alias: 'url'
				}
			}
		},
		'selector': {
			pattern: RegExp('(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + string.source + ')*(?=\\s*\\{)'),
			lookbehind: true
		},
		'string': {
			pattern: string,
			greedy: true
		},
		'property': {
			pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
			lookbehind: true
		},
		'important': /!important\b/i,
		'function': {
			pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,
			lookbehind: true
		},
		'punctuation': /[(){};:,]/
	};

	Prism.languages.css['atrule'].inside.rest = Prism.languages.css;

	var markup = Prism.languages.markup;
	if (markup) {
		markup.tag.addInlined('style', 'css');
		markup.tag.addAttribute('style', 'css');
	}

}(Prism));


/* **********************************************
     Begin prism-clike.js
********************************************** */

Prism.languages.clike = {
	'comment': [
		{
			pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
			lookbehind: true,
			greedy: true
		},
		{
			pattern: /(^|[^\\:])\/\/.*/,
			lookbehind: true,
			greedy: true
		}
	],
	'string': {
		pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
		greedy: true
	},
	'class-name': {
		pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
		lookbehind: true,
		inside: {
			'punctuation': /[.\\]/
		}
	},
	'keyword': /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
	'boolean': /\b(?:false|true)\b/,
	'function': /\b\w+(?=\()/,
	'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
	'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
	'punctuation': /[{}[\];(),.:]/
};


/* **********************************************
     Begin prism-javascript.js
********************************************** */

Prism.languages.javascript = Prism.languages.extend('clike', {
	'class-name': [
		Prism.languages.clike['class-name'],
		{
			pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
			lookbehind: true
		}
	],
	'keyword': [
		{
			pattern: /((?:^|\})\s*)catch\b/,
			lookbehind: true
		},
		{
			pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
			lookbehind: true
		},
	],
	// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
	'function': /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
	'number': {
		pattern: RegExp(
			/(^|[^\w$])/.source +
			'(?:' +
			(
				// constant
				/NaN|Infinity/.source +
				'|' +
				// binary integer
				/0[bB][01]+(?:_[01]+)*n?/.source +
				'|' +
				// octal integer
				/0[oO][0-7]+(?:_[0-7]+)*n?/.source +
				'|' +
				// hexadecimal integer
				/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source +
				'|' +
				// decimal bigint
				/\d+(?:_\d+)*n/.source +
				'|' +
				// decimal number (integer or float) but no bigint
				/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source
			) +
			')' +
			/(?![\w$])/.source
		),
		lookbehind: true
	},
	'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
});

Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;

Prism.languages.insertBefore('javascript', 'keyword', {
	'regex': {
		pattern: RegExp(
			// lookbehind
			// eslint-disable-next-line regexp/no-dupe-characters-character-class
			/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source +
			// Regex pattern:
			// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character
			// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible
			// with the only syntax, so we have to define 2 different regex patterns.
			/\//.source +
			'(?:' +
			/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source +
			'|' +
			// `v` flag syntax. This supports 3 levels of nested character classes.
			/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source +
			')' +
			// lookahead
			/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source
		),
		lookbehind: true,
		greedy: true,
		inside: {
			'regex-source': {
				pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
				lookbehind: true,
				alias: 'language-regex',
				inside: Prism.languages.regex
			},
			'regex-delimiter': /^\/|\/$/,
			'regex-flags': /^[a-z]+$/,
		}
	},
	// This must be declared before keyword because we use "function" inside the look-forward
	'function-variable': {
		pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
		alias: 'function'
	},
	'parameter': [
		{
			pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
			lookbehind: true,
			inside: Prism.languages.javascript
		},
		{
			pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
			lookbehind: true,
			inside: Prism.languages.javascript
		},
		{
			pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
			lookbehind: true,
			inside: Prism.languages.javascript
		},
		{
			pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
			lookbehind: true,
			inside: Prism.languages.javascript
		}
	],
	'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/
});

Prism.languages.insertBefore('javascript', 'string', {
	'hashbang': {
		pattern: /^#!.*/,
		greedy: true,
		alias: 'comment'
	},
	'template-string': {
		pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
		greedy: true,
		inside: {
			'template-punctuation': {
				pattern: /^`|`$/,
				alias: 'string'
			},
			'interpolation': {
				pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
				lookbehind: true,
				inside: {
					'interpolation-punctuation': {
						pattern: /^\$\{|\}$/,
						alias: 'punctuation'
					},
					rest: Prism.languages.javascript
				}
			},
			'string': /[\s\S]+/
		}
	},
	'string-property': {
		pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
		lookbehind: true,
		greedy: true,
		alias: 'property'
	}
});

Prism.languages.insertBefore('javascript', 'operator', {
	'literal-property': {
		pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
		lookbehind: true,
		alias: 'property'
	},
});

if (Prism.languages.markup) {
	Prism.languages.markup.tag.addInlined('script', 'javascript');

	// add attribute support for all DOM events.
	// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events
	Prism.languages.markup.tag.addAttribute(
		/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,
		'javascript'
	);
}

Prism.languages.js = Prism.languages.javascript;


/* **********************************************
     Begin prism-file-highlight.js
********************************************** */

(function () {

	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
		return;
	}

	// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill
	if (!Element.prototype.matches) {
		Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
	}

	var LOADING_MESSAGE = 'Loading…';
	var FAILURE_MESSAGE = function (status, message) {
		return '✖ Error ' + status + ' while fetching file: ' + message;
	};
	var FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty';

	var EXTENSIONS = {
		'js': 'javascript',
		'py': 'python',
		'rb': 'ruby',
		'ps1': 'powershell',
		'psm1': 'powershell',
		'sh': 'bash',
		'bat': 'batch',
		'h': 'c',
		'tex': 'latex'
	};

	var STATUS_ATTR = 'data-src-status';
	var STATUS_LOADING = 'loading';
	var STATUS_LOADED = 'loaded';
	var STATUS_FAILED = 'failed';

	var SELECTOR = 'pre[data-src]:not([' + STATUS_ATTR + '="' + STATUS_LOADED + '"])'
		+ ':not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])';

	/**
	 * Loads the given file.
	 *
	 * @param {string} src The URL or path of the source file to load.
	 * @param {(result: string) => void} success
	 * @param {(reason: string) => void} error
	 */
	function loadFile(src, success, error) {
		var xhr = new XMLHttpRequest();
		xhr.open('GET', src, true);
		xhr.onreadystatechange = function () {
			if (xhr.readyState == 4) {
				if (xhr.status < 400 && xhr.responseText) {
					success(xhr.responseText);
				} else {
					if (xhr.status >= 400) {
						error(FAILURE_MESSAGE(xhr.status, xhr.statusText));
					} else {
						error(FAILURE_EMPTY_MESSAGE);
					}
				}
			}
		};
		xhr.send(null);
	}

	/**
	 * Parses the given range.
	 *
	 * This returns a range with inclusive ends.
	 *
	 * @param {string | null | undefined} range
	 * @returns {[number, number | undefined] | undefined}
	 */
	function parseRange(range) {
		var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range || '');
		if (m) {
			var start = Number(m[1]);
			var comma = m[2];
			var end = m[3];

			if (!comma) {
				return [start, start];
			}
			if (!end) {
				return [start, undefined];
			}
			return [start, Number(end)];
		}
		return undefined;
	}

	Prism.hooks.add('before-highlightall', function (env) {
		env.selector += ', ' + SELECTOR;
	});

	Prism.hooks.add('before-sanity-check', function (env) {
		var pre = /** @type {HTMLPreElement} */ (env.element);
		if (pre.matches(SELECTOR)) {
			env.code = ''; // fast-path the whole thing and go to complete

			pre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading

			// add code element with loading message
			var code = pre.appendChild(document.createElement('CODE'));
			code.textContent = LOADING_MESSAGE;

			var src = pre.getAttribute('data-src');

			var language = env.language;
			if (language === 'none') {
				// the language might be 'none' because there is no language set;
				// in this case, we want to use the extension as the language
				var extension = (/\.(\w+)$/.exec(src) || [, 'none'])[1];
				language = EXTENSIONS[extension] || extension;
			}

			// set language classes
			Prism.util.setLanguage(code, language);
			Prism.util.setLanguage(pre, language);

			// preload the language
			var autoloader = Prism.plugins.autoloader;
			if (autoloader) {
				autoloader.loadLanguages(language);
			}

			// load file
			loadFile(
				src,
				function (text) {
					// mark as loaded
					pre.setAttribute(STATUS_ATTR, STATUS_LOADED);

					// handle data-range
					var range = parseRange(pre.getAttribute('data-range'));
					if (range) {
						var lines = text.split(/\r\n?|\n/g);

						// the range is one-based and inclusive on both ends
						var start = range[0];
						var end = range[1] == null ? lines.length : range[1];

						if (start < 0) { start += lines.length; }
						start = Math.max(0, Math.min(start - 1, lines.length));
						if (end < 0) { end += lines.length; }
						end = Math.max(0, Math.min(end, lines.length));

						text = lines.slice(start, end).join('\n');

						// add data-start for line numbers
						if (!pre.hasAttribute('data-start')) {
							pre.setAttribute('data-start', String(start + 1));
						}
					}

					// highlight code
					code.textContent = text;
					Prism.highlightElement(code);
				},
				function (error) {
					// mark as failed
					pre.setAttribute(STATUS_ATTR, STATUS_FAILED);

					code.textContent = error;
				}
			);
		}
	});

	Prism.plugins.fileHighlight = {
		/**
		 * Executes the File Highlight plugin for all matching `pre` elements under the given container.
		 *
		 * Note: Elements which are already loaded or currently loading will not be touched by this method.
		 *
		 * @param {ParentNode} [container=document]
		 */
		highlight: function highlight(container) {
			var elements = (container || document).querySelectorAll(SELECTOR);

			for (var i = 0, element; (element = elements[i++]);) {
				Prism.highlightElement(element);
			}
		}
	};

	var logged = false;
	/** @deprecated Use `Prism.plugins.fileHighlight.highlight` instead. */
	Prism.fileHighlight = function () {
		if (!logged) {
			console.warn('Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.');
			logged = true;
		}
		Prism.plugins.fileHighlight.highlight.apply(this, arguments);
	};

}());
ܟA8x@/**
 * prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML
 * Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics);
 * @author Tim  Shedor
 */

code[class*="language-"],
pre[class*="language-"] {
	color: black;
	background: none;
	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
	font-size: 1em;
	text-align: left;
	white-space: pre;
	word-spacing: normal;
	word-break: normal;
	word-wrap: normal;
	line-height: 1.5;

	-moz-tab-size: 4;
	-o-tab-size: 4;
	tab-size: 4;

	-webkit-hyphens: none;
	-moz-hyphens: none;
	-ms-hyphens: none;
	hyphens: none;
}

/* Code blocks */
pre[class*="language-"] {
	position: relative;
	margin: .5em 0;
	overflow: visible;
	padding: 1px;
}

pre[class*="language-"] > code {
	position: relative;
	z-index: 1;
	border-left: 10px solid #358ccb;
	box-shadow: -1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf;
	background-color: #fdfdfd;
	background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%);
	background-size: 3em 3em;
	background-origin: content-box;
	background-attachment: local;
}

code[class*="language-"] {
	max-height: inherit;
	height: inherit;
	padding: 0 1em;
	display: block;
	overflow: auto;
}

/* Margin bottom to accommodate shadow */
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
	background-color: #fdfdfd;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
	margin-bottom: 1em;
}

/* Inline code */
:not(pre) > code[class*="language-"] {
	position: relative;
	padding: .2em;
	border-radius: 0.3em;
	color: #c92c2c;
	border: 1px solid rgba(0, 0, 0, 0.1);
	display: inline;
	white-space: normal;
}

pre[class*="language-"]:before,
pre[class*="language-"]:after {
	content: '';
	display: block;
	position: absolute;
	bottom: 0.75em;
	left: 0.18em;
	width: 40%;
	height: 20%;
	max-height: 13em;
	box-shadow: 0px 13px 8px #979797;
	-webkit-transform: rotate(-2deg);
	-moz-transform: rotate(-2deg);
	-ms-transform: rotate(-2deg);
	-o-transform: rotate(-2deg);
	transform: rotate(-2deg);
}

pre[class*="language-"]:after {
	right: 0.75em;
	left: auto;
	-webkit-transform: rotate(2deg);
	-moz-transform: rotate(2deg);
	-ms-transform: rotate(2deg);
	-o-transform: rotate(2deg);
	transform: rotate(2deg);
}

.token.comment,
.token.block-comment,
.token.prolog,
.token.doctype,
.token.cdata {
	color: #7D8B99;
}

.token.punctuation {
	color: #5F6364;
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.function-name,
.token.constant,
.token.symbol,
.token.deleted {
	color: #c92c2c;
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.function,
.token.builtin,
.token.inserted {
	color: #2f9c0a;
}

.token.operator,
.token.entity,
.token.url,
.token.variable {
	color: #a67f59;
	background: rgba(255, 255, 255, 0.5);
}

.token.atrule,
.token.attr-value,
.token.keyword,
.token.class-name {
	color: #1990b8;
}

.token.regex,
.token.important {
	color: #e90;
}

.language-css .token.string,
.style .token.string {
	color: #a67f59;
	background: rgba(255, 255, 255, 0.5);
}

.token.important {
	font-weight: normal;
}

.token.bold {
	font-weight: bold;
}
.token.italic {
	font-style: italic;
}

.token.entity {
	cursor: help;
}

.token.namespace {
	opacity: .7;
}

@media screen and (max-width: 767px) {
	pre[class*="language-"]:before,
	pre[class*="language-"]:after {
		bottom: 14px;
		box-shadow: none;
	}

}

/* Plugin styles: Line Numbers */
pre[class*="language-"].line-numbers.line-numbers {
	padding-left: 0;
}

pre[class*="language-"].line-numbers.line-numbers code {
	padding-left: 3.8em;
}

pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows {
	left: 0;
}

/* Plugin styles: Line Highlight */
pre[class*="language-"][data-line] {
	padding-top: 0;
	padding-bottom: 0;
	padding-left: 0;
}
pre[data-line] code {
	position: relative;
	padding-left: 4em;
}
pre .line-highlight {
	margin-top: 0;
}
&"x	code[class*=language-],pre[class*=language-]{color:#000;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{position:relative;margin:.5em 0;overflow:visible;padding:1px}pre[class*=language-]>code{position:relative;z-index:1;border-left:10px solid #358ccb;box-shadow:-1px 0 0 0 #358ccb,0 0 0 1px #dfdfdf;background-color:#fdfdfd;background-image:linear-gradient(transparent 50%,rgba(69,142,209,.04) 50%);background-size:3em 3em;background-origin:content-box;background-attachment:local}code[class*=language-]{max-height:inherit;height:inherit;padding:0 1em;display:block;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:#fdfdfd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-bottom:1em}:not(pre)>code[class*=language-]{position:relative;padding:.2em;border-radius:.3em;color:#c92c2c;border:1px solid rgba(0,0,0,.1);display:inline;white-space:normal}pre[class*=language-]:after,pre[class*=language-]:before{content:'';display:block;position:absolute;bottom:.75em;left:.18em;width:40%;height:20%;max-height:13em;box-shadow:0 13px 8px #979797;-webkit-transform:rotate(-2deg);-moz-transform:rotate(-2deg);-ms-transform:rotate(-2deg);-o-transform:rotate(-2deg);transform:rotate(-2deg)}pre[class*=language-]:after{right:.75em;left:auto;-webkit-transform:rotate(2deg);-moz-transform:rotate(2deg);-ms-transform:rotate(2deg);-o-transform:rotate(2deg);transform:rotate(2deg)}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#7d8b99}.token.punctuation{color:#5f6364}.token.boolean,.token.constant,.token.deleted,.token.function-name,.token.number,.token.property,.token.symbol,.token.tag{color:#c92c2c}.token.attr-name,.token.builtin,.token.char,.token.function,.token.inserted,.token.selector,.token.string{color:#2f9c0a}.token.entity,.token.operator,.token.url,.token.variable{color:#a67f59;background:rgba(255,255,255,.5)}.token.atrule,.token.attr-value,.token.class-name,.token.keyword{color:#1990b8}.token.important,.token.regex{color:#e90}.language-css .token.string,.style .token.string{color:#a67f59;background:rgba(255,255,255,.5)}.token.important{font-weight:400}.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.namespace{opacity:.7}@media screen and (max-width:767px){pre[class*=language-]:after,pre[class*=language-]:before{bottom:14px;box-shadow:none}}pre[class*=language-].line-numbers.line-numbers{padding-left:0}pre[class*=language-].line-numbers.line-numbers code{padding-left:3.8em}pre[class*=language-].line-numbers.line-numbers .line-numbers-rows{left:0}pre[class*=language-][data-line]{padding-top:0;padding-bottom:0;padding-left:0}pre[data-line] code{position:relative;padding-left:4em}pre .line-highlight{margin-top:0}A`x/**
 * prism.js Dark theme for JavaScript, CSS and HTML
 * Based on the slides of the talk “/Reg(exp){2}lained/”
 * @author Lea Verou
 */

code[class*="language-"],
pre[class*="language-"] {
	color: white;
	background: none;
	text-shadow: 0 -.1em .2em black;
	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
	font-size: 1em;
	text-align: left;
	white-space: pre;
	word-spacing: normal;
	word-break: normal;
	word-wrap: normal;
	line-height: 1.5;

	-moz-tab-size: 4;
	-o-tab-size: 4;
	tab-size: 4;

	-webkit-hyphens: none;
	-moz-hyphens: none;
	-ms-hyphens: none;
	hyphens: none;
}

@media print {
	code[class*="language-"],
	pre[class*="language-"] {
		text-shadow: none;
	}
}

pre[class*="language-"],
:not(pre) > code[class*="language-"] {
	background: hsl(30, 20%, 25%);
}

/* Code blocks */
pre[class*="language-"] {
	padding: 1em;
	margin: .5em 0;
	overflow: auto;
	border: .3em solid hsl(30, 20%, 40%);
	border-radius: .5em;
	box-shadow: 1px 1px .5em black inset;
}

/* Inline code */
:not(pre) > code[class*="language-"] {
	padding: .15em .2em .05em;
	border-radius: .3em;
	border: .13em solid hsl(30, 20%, 40%);
	box-shadow: 1px 1px .3em -.1em black inset;
	white-space: normal;
}

.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
	color: hsl(30, 20%, 50%);
}

.token.punctuation {
	opacity: .7;
}

.token.namespace {
	opacity: .7;
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol {
	color: hsl(350, 40%, 70%);
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
	color: hsl(75, 70%, 60%);
}

.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string,
.token.variable {
	color: hsl(40, 90%, 60%);
}

.token.atrule,
.token.attr-value,
.token.keyword {
	color: hsl(350, 40%, 70%);
}

.token.regex,
.token.important {
	color: #e90;
}

.token.important,
.token.bold {
	font-weight: bold;
}
.token.italic {
	font-style: italic;
}

.token.entity {
	cursor: help;
}

.token.deleted {
	color: red;
}
$x"/**
 * okaidia'SLoosely based on Monokai textmate theme by http://www.monokai.nl/
 * @author ocodiaB#f8f8f2%1px rgba(0, 0, 0, 0.3)]%d-radius: 0.3em;
}
%background: #272822J:^#8292a2color: #f8f8f2?Mmconstant,
.token.symbol,
.token.deleted {
	color: #f92672;
}

.token.boolean,
.token.number {
	color: #ae81ffn#a6e22e^~#f8f8f2.Rfunction,
.token.class-name {
	color: #e6db74;
}

.token.keyword {
	color: #66d9ef?/fd971fq|x	wcode[class*=language-],pre[class*=language-]{color:#fff;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em #000;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}:not(pre)>code[class*=language-],pre[class*=language-]{background:#141414}pre[class*=language-]{border-radius:.5em;border:.3em solid #545454;box-shadow:1px 1px .5em #000 inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*=language-]::-moz-selection{background:#27292a}pre[class*=language-]::selection{background:#27292a}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:hsla(0,0%,93%,.15)}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:hsla(0,0%,93%,.15)}:not(pre)>code[class*=language-]{border-radius:.3em;border:.13em solid #545454;box-shadow:1px 1px .3em -.1em #000 inset;padding:.15em .2em .05em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#777}.token.punctuation{opacity:.7}.token.namespace{opacity:.7}.token.boolean,.token.deleted,.token.number,.token.tag{color:#ce6849}.token.builtin,.token.constant,.token.keyword,.token.property,.token.selector,.token.symbol{color:#f9ed99}.language-css .token.string,.style .token.string,.token.attr-name,.token.attr-value,.token.char,.token.entity,.token.inserted,.token.operator,.token.string,.token.url,.token.variable{color:#909e6a}.token.atrule{color:#7385a5}.token.important,.token.regex{color:#e8c062}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.language-markup .token.attr-name,.language-markup .token.punctuation,.language-markup .token.tag{color:#ac885c}.token{position:relative;z-index:1}.line-highlight.line-highlight{background:hsla(0,0%,33%,.25);background:linear-gradient(to right,hsla(0,0%,33%,.1) 70%,hsla(0,0%,33%,0));border-bottom:1px dashed #545454;border-top:1px dashed #545454;margin-top:.75em;z-index:0}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background-color:#8693a6;color:#f4f1ef}mS"x,4657b83FaŐ073642}r073642a{padding:1em9border-radius:.3emP!!-color:#fdf6e3P"padding:.1em;border-radius:.3emA'93a1a1}.token.punctuation{color:#586e75V3constant%[property,.token.symbol,.token.tag{color:#268bd2}.token.attr-name,.token.builtin,.token.charselec{color:#2aa198}.token.entity{color:#657b83;background:#eee8d5}.token.atrule,.token.attr-value,.token.keyword{color:#859900}.tokgen.class-name,.token.function{color:#b58900}.token.important,.token.regex,.token.variable{color:#cb4b16.hm1;xE4)000;background:0 0;text-shadow:0 1px #fff:#text-shadow:none;background:#b3d4fc_l
	i.1text-shadow:none;background:#b3d4fc}@media print{-text-shadow:none}}(B:#f5f2f0JA;white-space:normalA$708090}.token.punctuation{color:#999905Z/{color:#690}.language-css .token.string,.style Mentity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)$707aa*dd4a686e90hPTIx~4fff7-.1em .2em #000]&LyC	4c3f33}prYP;border:.3em solid #7a6651;border-radius:.5em;box-shadow:1px 1px .5em #000 insetx!P	.15em .2em .05Cborder:.13em solid #7a6651;box-shadow:1px 1px .3em -.1em #000 insetT$997f66}.token.punctuation{opacity:.7{C7d1939ebbce051lZ,.token.variable{color:#f4b73d7d1939e\s.token.deleted{color:red}'zVx
4f8f8f27"rgba(0,0,0,.3)]&prY;border-radius:.3emxD272822x!P	k8292a2]f8f8f2{$)1f92672}.token.boolean,.token.number{color:#ae81ffba6e22elZ,.token.variable{color:#f8f8f2(4"#e6db74}.token.keyword{color:#66d9ef\{color:#fd971fh[(x$/**
 * prism.js Twilight theme
 * Based (more or less) on the Twilight theme originally of Textmate fame.
 * @author Remy Bach
 */
code[class*="language-"],
pre[class*="language-"] {
	color: white;
	background: none;
	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
	font-size: 1em;
	text-align: left;
	text-shadow: 0 -.1em .2em black;
	white-space: pre;
	word-spacing: normal;
	word-break: normal;
	word-wrap: normal;
	line-height: 1.5;

	-moz-tab-size: 4;
	-o-tab-size: 4;
	tab-size: 4;

	-webkit-hyphens: none;
	-moz-hyphens: none;
	-ms-hyphens: none;
	hyphens: none;
}

pre[class*="language-"],
:not(pre) > code[class*="language-"] {
	background: hsl(0, 0%, 8%); /* #141414 */
}

/* Code blocks */
pre[class*="language-"] {
	border-radius: .5em;
	border: .3em solid hsl(0, 0%, 33%); /* #282A2B */
	box-shadow: 1px 1px .5em black inset;
	margin: .5em 0;
	overflow: auto;
	padding: 1em;
}

pre[class*="language-"]::-moz-selection {
	/* Firefox */
	background: hsl(200, 4%, 16%); /* #282A2B */
}

pre[class*="language-"]::selection {
	/* Safari */
	background: hsl(200, 4%, 16%); /* #282A2B */
}

/* Text Selection colour */
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
	text-shadow: none;
	background: hsla(0, 0%, 93%, 0.15); /* #EDEDED */
}

pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
code[class*="language-"]::selection, code[class*="language-"] ::selection {
	text-shadow: none;
	background: hsla(0, 0%, 93%, 0.15); /* #EDEDED */
}

/* Inline code */
:not(pre) > code[class*="language-"] {
	border-radius: .3em;
	border: .13em solid hsl(0, 0%, 33%); /* #545454 */
	box-shadow: 1px 1px .3em -.1em black inset;
	padding: .15em .2em .05em;
	white-space: normal;
}

.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
	color: hsl(0, 0%, 47%); /* #777777 */
}

.token.punctuation {
	opacity: .7;
}

.token.namespace {
	opacity: .7;
}

.token.tag,
.token.boolean,
.token.number,
.token.deleted {
	color: hsl(14, 58%, 55%); /* #CF6A4C */
}

.token.keyword,
.token.property,
.token.selector,
.token.constant,
.token.symbol,
.token.builtin {
	color: hsl(53, 89%, 79%); /* #F9EE98 */
}

.token.attr-name,
.token.attr-value,
.token.string,
.token.char,
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string,
.token.variable,
.token.inserted {
	color: hsl(76, 21%, 52%); /* #8F9D6A */
}

.token.atrule {
	color: hsl(218, 22%, 55%); /* #7587A6 */
}

.token.regex,
.token.important {
	color: hsl(42, 75%, 65%); /* #E9C062 */
}

.token.important,
.token.bold {
	font-weight: bold;
}
.token.italic {
	font-style: italic;
}

.token.entity {
	cursor: help;
}

/* Markup */
.language-markup .token.tag,
.language-markup .token.attr-name,
.language-markup .token.punctuation {
	color: hsl(33, 33%, 52%); /* #AC885B */
}

/* Make the tokens sit above the line highlight so the colours don't look faded. */
.token {
	position: relative;
	z-index: 1;
}

.line-highlight.line-highlight {
	background: hsla(0, 0%, 33%, 0.25); /* #545454 */
	background: linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0)); /* #545454 */
	border-bottom: 1px dashed hsl(0, 0%, 33%); /* #545454 */
	border-top: 1px dashed hsl(0, 0%, 33%); /* #545454 */
	margin-top: 0.75em; /* Same as .prism’s padding-top */
	z-index: 0;
}

.line-highlight.line-highlight:before,
.line-highlight.line-highlight[data-end]:after {
	background-color: hsl(215, 15%, 59%); /* #8794A6 */
	color: hsl(24, 20%, 95%); /* #F5F2F0 */
}
YM2x(/*
 Solarized Color Schemes originally by Ethan Schoonover
 http://ethanschoonover.com/solarized

 Ported for PrismJS by Hector Matos
 Website: https://krakendev.io
 Twitter Handle: https://twitter.com/allonsykraken)
*/

/*
SOLARIZED HEX
--------- -------
base03    #002b36
base02    #073642
base01    #586e75
base00    #657b83
base0     #839496
base1     #93a1a1
base2     #eee8d5
base3     #fdf6e3
yellow    #b58900
orange    #cb4b16
red       #dc322f
magenta   #d33682
violet    #6c71c4
blue      #268bd2
'cyan      #2aa198
green     #859900
*/
$#657b83; /* base00 */oiR!background: #073642; /* base02 */}background: #073642; /* base024padding: 1em^%border-radius: 0.3em;
}
a%#fdf6e3; /* base3IA#padding: .1em;
	border-radius: .3em0KJ#93a1a1; /* base1 */
}

.token.punctuation {
	color: #586e75; /* base01 *//f+ #268bd2; /* blue */
}
o
	builtin,
.token.url	#2aa198; /* cyan */
Molor: #657b83; /* base00 */
	background: #eee8d5; /* base2 */
}

.token.atrulkeyword {
	color: #859900; /* green */
}

.token.function,
.token.class-name {
	color: #b58900; /* yellow */
}

.token.regex,
.
.,
.token.variable {
	color: #cb4b16; /* orangeP
Mj=+fxK/**
 * prism.js default theme for JavaScript, CSS and HTML
 * Based on dabblet (http://dabblet.com)
 * @author Lea Verou
 */

c%;4black;
	background: none;
	text-shadow: 0 1px white;u7E'text-shadow: none;
	background: #b3d4fc}<text-shadow: none;
	background: #b3d4fc;
}

@media print {
			text-shadow: none;
	}XaN
: #f5f2f0;:c	white-space: normalK
slategray;"999;0905;ZF690;
}

.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
	color: #9a6e3a;
	/* Thdis background color was intended by the author of this theme. */
	background: hsla(0, 0%, 100%, .5);@07a;	2DD4A68;X	?e90;	3ϼx   ## [7.8.2](https://github.com/reactivex/rxjs/compare/7.8.1...7.8.2) (2025-02-22)

### Bug Fixes

- **animationFrameScheduler:** some tasks are never flushed and sometimes it breaks completely ([#7444](https://github.com/reactivex/rxjs/issues/7444)) ([8bbfa4e](https://github.com/reactivex/rxjs/commit/8bbfa4efd15f6572316d5b2b05b2f49ded69a3ca))
- **mergeWith:** works correctly with an Array ([#7281](https://github.com/reactivex/rxjs/issues/7281)) ([27855c6](https://github.com/reactivex/rxjs/commit/27855c635ca74107352ae3336944433a328c0b41))
- **subscriber:** strict type signature for next method ([#7172](https://github.com/reactivex/rxjs/issues/7172)) ([0e2ef5e](https://github.com/reactivex/rxjs/commit/0e2ef5e1142699b028bc3624aae9b24c3e3aaccf))

## [7.8.1](https://github.com/reactivex/rxjs/compare/7.8.0...7.8.1) (2023-04-26)

### Bug Fixes

- **asapScheduler:** No longer stops after scheduling twice during flush ([#7198](https://github.com/reactivex/rxjs/issues/7198)) ([1b52405](https://github.com/reactivex/rxjs/commit/1b524057b4db157814bfd04ad7d10c999afdccfa)), closes [ReactiveX#7196](https://github.com/ReactiveX/issues/7196)
- **throttle:** properly handle default ThrottleConfig values ([#7176](https://github.com/reactivex/rxjs/issues/7176)) ([ceb821c](https://github.com/reactivex/rxjs/commit/ceb821cfd81ca29b0d764b86a03f1e9f1eaa0999))

# [7.8.0](https://github.com/reactivex/rxjs/compare/7.7.0...7.8.0) (2022-12-15)

### Features

- **buffer:** `closingNotifier` now supports any `ObservableInput` ([#7073](https://github.com/reactivex/rxjs/issues/7073)) ([61b877a](https://github.com/reactivex/rxjs/commit/61b877a50c2557196a45e12622305c5a84fc3f0a))
- **delayWhen:** `delayWhen`'s `delayDurationSelector` now supports any `ObservableInput` ([#7049](https://github.com/reactivex/rxjs/issues/7049)) ([dfd95db](https://github.com/reactivex/rxjs/commit/dfd95db952a6772d35d11bdd1974f2c4b4d68b25))
- **sequenceEqual:** `compareTo` now supports any `ObservableInput` ([#7102](https://github.com/reactivex/rxjs/issues/7102)) ([d501961](https://github.com/reactivex/rxjs/commit/d50196187710c7a0cad50703b2071fc3f2cabd3c))
- **share:** `ShareConfig` factory properties now supports any `ObservableInput` ([#7093](https://github.com/reactivex/rxjs/issues/7093)) ([cc3995a](https://github.com/reactivex/rxjs/commit/cc3995a6f6baf9456ec11f749fe89bf61b9e2d62))
- **skipUntil:** `notifier` now supports any `ObservableInput` ([#7091](https://github.com/reactivex/rxjs/issues/7091)) ([60d6c40](https://github.com/reactivex/rxjs/commit/60d6c40fb484903286feca2bbfa9fcb2cde720e2))
- **window:** `windowBoundaries` now supports any `ObservableInput` ([#7088](https://github.com/reactivex/rxjs/issues/7088)) ([8c4347c](https://github.com/reactivex/rxjs/commit/8c4347c48f2432d7399c911d329fa74e0d6c6e8d))

# [7.7.0](https://github.com/reactivex/rxjs/compare/7.6.0...7.7.0) (2022-12-15)

### Features

- **distinct:** `flush` argument now supports any `ObservableInput` ([#7081](https://github.com/reactivex/rxjs/issues/7081)) ([74c9ebd](https://github.com/reactivex/rxjs/commit/74c9ebd818113f9f25f1fb2b9fee4a0eac121ae0))
- **repeatWhen:** `notifier` supports `ObservableInput` ([#7103](https://github.com/reactivex/rxjs/issues/7103)) ([8f1b976](https://github.com/reactivex/rxjs/commit/8f1b976125c55a5e884317c2b463fd019662e6af))
- **retryWhen:** `notifier` now supports any `ObservableInput` ([#7105](https://github.com/reactivex/rxjs/issues/7105)) ([794f806](https://github.com/reactivex/rxjs/commit/794f8064cf8fe754e9dfebeee0ffef0ac1562252))
- **sample:** `notifier` now supports any `ObservableInput` ([#7104](https://github.com/reactivex/rxjs/issues/7104)) ([b18c2eb](https://github.com/reactivex/rxjs/commit/b18c2eb2bc8dc1a717c927f998028316eec83937))

# [7.6.0](https://github.com/reactivex/rxjs/compare/7.5.7...7.6.0) (2022-12-03)

### Bug Fixes

- **schedulers:** no longer cause TypeScript build failures when Node types aren't included ([c1a07b7](https://github.com/reactivex/rxjs/commit/c1a07b71ac050ab36b371ff7f18dc9a924fffc9f))
- **types:** Improved subscribe and tap type overloads ([#6718](https://github.com/reactivex/rxjs/issues/6718)) ([af1a9f4](https://github.com/reactivex/rxjs/commit/af1a9f446a860883abaa36ace21345dc923e7e53)), closes [#6717](https://github.com/reactivex/rxjs/issues/6717)

### Features

- **onErrorResumeNextWith:** renamed `onErrorResumeNext` and exported from the top level. (`onErrorResumeNext` operator is stil available, but deprecated) ([#6755](https://github.com/reactivex/rxjs/issues/6755)) ([51e3b2c](https://github.com/reactivex/rxjs/commit/51e3b2c8ec28b5d30bca4c63ad69ce6942c2cdcc))

## [7.5.7](https://github.com/reactivex/rxjs/compare/7.5.6...7.5.7) (2022-09-25)

### Bug Fixes

- **schedulers:** improve performance of animationFrameScheduler and asapScheduler ([#7059](https://github.com/reactivex/rxjs/issues/7059)) ([c93aa60](https://github.com/reactivex/rxjs/commit/c93aa60e9f073297d959fa1fff9323e48872d47e)), closes [#7017](https://github.com/reactivex/rxjs/issues/7017), related to [#7018](https://github.com/reactivex/rxjs/issues/7018) and [#6674](https://github.com/reactivex/rxjs/issues/6674)

### Performance Improvements

- **animationFrames:** uses fewer Subscription instances ([#7060](https://github.com/reactivex/rxjs/issues/7060)) ([2d57b38](https://github.com/reactivex/rxjs/commit/2d57b38ec9f7ada838ee130ab75cd795b156c182)), closes [#7018](https://github.com/reactivex/rxjs/issues/7018)

## [7.5.6](https://github.com/reactivex/rxjs/compare/7.5.5...7.5.6) (2022-07-11)

### Bug Fixes

- **share:** No longer results in a bad-state observable in an edge case where a synchronous source was shared and refCounted, and the result is subscribed to twice in a row synchronously. ([#7005](https://github.com/reactivex/rxjs/issues/7005)) ([5d4c1d9](https://github.com/reactivex/rxjs/commit/5d4c1d9a37b1347217223adb0d9e166fd85f67a9))
- **share & connect:** `share` and `connect` no longer bundle scheduling code by default ([#6873](https://github.com/reactivex/rxjs/issues/6873)) ([9948dc2](https://github.com/reactivex/rxjs/commit/9948dc2f5577eaa4013de234f3552508918518c7)), closes [#6872](https://github.com/reactivex/rxjs/issues/6872)
- **exhaustAll:** Result will now complete properly when flattening all synchronous observables. ([#6911](https://github.com/reactivex/rxjs/issues/6911)) ([3c1c6b8](https://github.com/reactivex/rxjs/commit/3c1c6b8303028eebc7af31cfc5e5bad42a5b2da4)), closes [#6910](https://github.com/reactivex/rxjs/issues/6910)
- **TypeScript:** Now compatible with TypeScript 4.6 type checks ([#6895](https://github.com/reactivex/rxjs/issues/6895)) ([fce9aa1](https://github.com/reactivex/rxjs/commit/fce9aa12931796892673581761bba1f7ceafabff))

## [7.5.5](https://github.com/reactivex/rxjs/compare/7.5.4...7.5.5) (2022-03-08)

### Bug Fixes

- **package:** add types to exports ([#6802](https://github.com/reactivex/rxjs/issues/6802)) ([3750f75](https://github.com/reactivex/rxjs/commit/3750f75104bb82d870c53c0605c942e41245d79c))
- **package:** add `require` export condition ([#6821](https://github.com/reactivex/rxjs/issues/6821)) ([c8955e4](https://github.com/reactivex/rxjs/commit/c8955e4c6a972135030fdfddc18a7a48337ae9c7))
- **timeout:** no longer will timeout when receiving the first value synchronously ([#6865](https://github.com/reactivex/rxjs/issues/6865)) ([2330c96](https://github.com/reactivex/rxjs/commit/2330c9660b20f2e0cda0c4eeb36bb582b4a85186)), closes [#6862](https://github.com/reactivex/rxjs/issues/6862)

### Performance Improvements

- Don't clone observers unless you have to ([#6842](https://github.com/reactivex/rxjs/issues/6842)) ([3289d20](https://github.com/reactivex/rxjs/commit/3289d20ddc3a84d2aede8e3ab9962a8ef5d43c83))

## [7.5.4](https://github.com/reactivex/rxjs/compare/7.5.3...7.5.4) (2022-02-09)

### Performance Improvements

- removed code that would `bind` functions passed with observers to `subscribe`. ([#6815](https://github.com/reactivex/rxjs/issues/6815)) ([fb375a0](https://github.com/reactivex/rxjs/commit/fb375a0c5befd6852cd63d3c310448e42fa9580e)), closes [#6783](https://github.com/reactivex/rxjs/issues/6783)

## [7.5.3](https://github.com/reactivex/rxjs/compare/7.5.2...7.5.3) (2022-02-08)

### Bug Fixes

- **subscribe:** allow interop with Monio and other libraries that patch function bind ([0ab91eb](https://github.com/reactivex/rxjs/commit/0ab91eb4c1da914efbf03a2732629914cd3398dc)), closes [#6783](https://github.com/reactivex/rxjs/issues/6783)

## [7.5.2](https://github.com/reactivex/rxjs/compare/7.5.1...7.5.2) (2022-01-11)

### Bug Fixes

- operators that ignore input values now use `unknown` rather than `any`, which should resolve issues with eslint no-unsafe-argument ([#6738](https://github.com/reactivex/rxjs/issues/6738)) ([67cb317](https://github.com/reactivex/rxjs/commit/67cb317a7a6b9fdbd3d2e8fdbc2ac9ac7e57179c)), closes [#6536](https://github.com/reactivex/rxjs/issues/6536)
- **ajax:** crossDomain flag deprecated and properly reported to consumers ([#6710](https://github.com/reactivex/rxjs/issues/6710)) ([7fd0575](https://github.com/reactivex/rxjs/commit/7fd05756c595dddb288b732b00a90fcfb2a9080a)), closes [#6663](https://github.com/reactivex/rxjs/issues/6663)

## [7.5.1](https://github.com/reactivex/rxjs/compare/7.5.0...7.5.1) (2021-12-28)

### Bug Fixes

- export supporting interfaces from top-level `rxjs` site. ([#6733](https://github.com/reactivex/rxjs/issues/6733)) ([299a1e1](https://github.com/reactivex/rxjs/commit/299a1e16f725edfc2e333c430e3a7dfc75dd94e7))

# [7.5.0](https://github.com/reactivex/rxjs/compare/7.4.0...7.5.0) (2021-12-27)

### Bug Fixes

- **takeWhile:** Now returns proper types when passed a `Boolean` constructor. ([#6633](https://github.com/reactivex/rxjs/issues/6633)) ([081ca2b](https://github.com/reactivex/rxjs/commit/081ca2ba7290aa3084c1477a6d4bcc573bf478f6))
- **forEach:** properly unsubs after error in next handler ([#6677](https://github.com/reactivex/rxjs/issues/6677)) ([b9ab67d](https://github.com/reactivex/rxjs/commit/b9ab67d21ca9d227fcd1123bf80ab87ca9296af9)), closes [#6676](https://github.com/reactivex/rxjs/issues/6676)
- **WebSocketSubject:** handle slow WebSocket close ([#6708](https://github.com/reactivex/rxjs/issues/6708)) ([8cb201c](https://github.com/reactivex/rxjs/commit/8cb201cd42dd751b4185b94fe2d36c6bfda02fe2)), closes [#4650](https://github.com/reactivex/rxjs/issues/4650) [#3935](https://github.com/reactivex/rxjs/issues/3935)
- RxJS now supports tslib 2.x, rather than just 2.1.x ([#6692](https://github.com/reactivex/rxjs/issues/6692)) ([0b2495f](https://github.com/reactivex/rxjs/commit/0b2495f72e76627fdd19dd7a670dd74847d6449c)), closes [#6689](https://github.com/reactivex/rxjs/issues/6689)
- schedulers will no longer error while rescheduling and unsubscribing during flushes ([e35f589](https://github.com/reactivex/rxjs/commit/e35f589e2ca10ab2d2d69f7e9fe60727edc4c53d)), closes [#6672](https://github.com/reactivex/rxjs/issues/6672)

### Features

- **repeat:** now has configurable delay ([#6640](https://github.com/reactivex/rxjs/issues/6640)) ([6b7a534](https://github.com/reactivex/rxjs/commit/6b7a534f579f95f97f47eff74bdea9991ee85712))

# [7.4.0](https://github.com/reactivex/rxjs/compare/7.3.1...7.4.0) (2021-10-06)

### Features

- Add es2015 entries to the exports declaration to support Angular ([#6614](https://github.com/reactivex/rxjs/issues/6614)) ([268777b](https://github.com/reactivex/rxjs/commit/268777bc3a4fd0cf76882683b51809771741ddc3)), closes [/github.com/ReactiveX/rxjs/pull/6613#discussion_r716958551](https://github.com//github.com/ReactiveX/rxjs/pull/6613/issues/discussion_r716958551)

## [7.3.1](https://github.com/reactivex/rxjs/compare/7.3.0...7.3.1) (2021-10-01)

### Bug Fixes

- **Schedulers:** Throwing a falsy error in a scheduled function no longer results in strange error objects. ([#6594](https://github.com/reactivex/rxjs/issues/6594)) ([c70fcc0](https://github.com/reactivex/rxjs/commit/c70fcc02b4b737709aba559bf36b030a47902ee4))
- scheduling with Rx-provided schedulers will no longer leak action references ([#6562](https://github.com/reactivex/rxjs/issues/6562)) ([ff5a748](https://github.com/reactivex/rxjs/commit/ff5a748b31ee73a6517e2f4220c920c73fbdd1fc)), closes [#6561](https://github.com/reactivex/rxjs/issues/6561)
- **forkJoin:** now finalizes sources before emitting ([#6546](https://github.com/reactivex/rxjs/issues/6546)) ([c52ff2e](https://github.com/reactivex/rxjs/commit/c52ff2e3aae19cd0877adb63182c03b79427de96)), closes [#4914](https://github.com/reactivex/rxjs/issues/4914)
- **observeOn:** release action references on teardown ([321d205](https://github.com/reactivex/rxjs/commit/321d2052696a7c366786c1ef3be7ad2a98a55f62))
- **types:** update schedule signature overload ([c61e57c](https://github.com/reactivex/rxjs/commit/c61e57c9c64a1525d034aea641f1b846737e1eee))

# [7.3.0](https://github.com/reactivex/rxjs/compare/7.2.0...7.3.0) (2021-07-28)

### Bug Fixes

- Expose `Connectable`, the return type of `connectable` ([#6531](https://github.com/reactivex/rxjs/issues/6531)) ([69f5bfa](https://github.com/reactivex/rxjs/commit/69f5bfae0eb2880a3d5cfb34db3a182182b325de)), closes [#6529](https://github.com/reactivex/rxjs/issues/6529)
- **AsyncSubject:** properly emits values during reentrant subscriptions ([#6522](https://github.com/reactivex/rxjs/issues/6522)) ([dd8bdf3](https://github.com/reactivex/rxjs/commit/dd8bdf3b18b596155b66029ef16ebabf989360c5)), closes [#6520](https://github.com/reactivex/rxjs/issues/6520)

### Features

- **retry:** Now supports configurable delay as a named argument ([#6421](https://github.com/reactivex/rxjs/issues/6421)) ([5f69795](https://github.com/reactivex/rxjs/commit/5f69795f4be035499cf223bf9a3d7352c4975291))
- **tap:** Now supports subscribe, unsubscribe, and finalize handlers ([#6527](https://github.com/reactivex/rxjs/issues/6527)) ([eb26cbc](https://github.com/reactivex/rxjs/commit/eb26cbc4488c9953cdde565b598b1dbdeeeee9ea))

# [7.2.0](https://github.com/reactivex/rxjs/compare/7.1.0...7.2.0) (2021-07-05)

### Bug Fixes

- **debounceTime:** unschedule dangling task on unsubscribe before complete ([#6464](https://github.com/reactivex/rxjs/issues/6464)) ([7ab0a4c](https://github.com/reactivex/rxjs/commit/7ab0a4c649b1b54e763a726c4ffdc183b0b45b23))
- **fromEvent:** Types now properly infer when resultSelector is provided ([#6447](https://github.com/reactivex/rxjs/issues/6447)) ([39b9d81](https://github.com/reactivex/rxjs/commit/39b9d818ef6ea033dc8e53800e3a220d56c76b4a))

### Features

- Operators are all exported at the top level, from "rxjs". From here on out, we encourage top-level imports with RxJS. Importing from `rxjs/operators` will be deprecated soon. ([#6488](https://github.com/reactivex/rxjs/issues/6488)) ([512adc2](https://github.com/reactivex/rxjs/commit/512adc25f350660113275d8277d16b7f3eec1d49)), closes [#6242](https://github.com/reactivex/rxjs/issues/6242)

# [7.1.0](https://github.com/reactivex/rxjs/compare/7.0.1...7.1.0) (2021-05-21)

### Bug Fixes

- returned operator functions from multicast operators `share`, `publish`, `publishReplay` are now referentially transparent. Meaning if you take the result of calling `publishReplay(3)` and pass it to more than one observable's `pipe` method, it will behave the same in each case, rather than having a cumulative effect, which was a regression introduced sometime in version 6. If you required this broken behavior, there is a workaround posted [here](https://github.com/ReactiveX/rxjs/pull/6410#issuecomment-846087374) ([#6410](https://github.com/reactivex/rxjs/issues/6410)) ([e2f2e51](https://github.com/reactivex/rxjs/commit/e2f2e516514bdeb76229e69c639f10f21bccafad)), closes [/github.com/ReactiveX/rxjs/pull/6410#issuecomment-846087374](https://github.com//github.com/ReactiveX/rxjs/pull/6410/issues/issuecomment-846087374) [#5411](https://github.com/reactivex/rxjs/issues/5411)

### Features

- All subjects now have an `observed` property. This will allow users to check whether a subject has current subscribers without us allowing access to the `observers` array, which is going to be made private in future versions. ([#6405](https://github.com/reactivex/rxjs/issues/6405)) ([f47425d](https://github.com/reactivex/rxjs/commit/f47425d349475231c0f3542bb6ecef16a63e933a))
- **groupBy:** Support named arguments, support ObservableInputs for duration selector ([#5679](https://github.com/reactivex/rxjs/issues/5679)) ([7a99397](https://github.com/reactivex/rxjs/commit/7a9939773802c4f7948c6d868a8f75facdea9f37))
- **share:** use another observable to control resets ([#6169](https://github.com/reactivex/rxjs/issues/6169)) ([12c3716](https://github.com/reactivex/rxjs/commit/12c3716cecbf01f353c980488bf18845177b37b6))

## [7.0.1](https://github.com/reactivex/rxjs/compare/7.0.0...7.0.1) (2021-05-12)

### Bug Fixes

- **bindCallback:** resulting function now recreated underlying Subject and is reusable once again. ([#6369](https://github.com/reactivex/rxjs/issues/6369)) ([abf2bc1](https://github.com/reactivex/rxjs/commit/abf2bc13e38406717127159c8c373b910223b562))
- **retry:** properly handles retry counts smaller than `1`. ([#6359](https://github.com/reactivex/rxjs/issues/6359)) ([e797bd7](https://github.com/reactivex/rxjs/commit/e797bd70b1368e189df00d697504304a3a5ef1a8))
- **share:** properly closes synchronous "firehose" sources. ([#6370](https://github.com/reactivex/rxjs/issues/6370)) ([2271a91](https://github.com/reactivex/rxjs/commit/2271a9180131a0becdbf789c1429ef741ace4b2f))
- Observable teardowns now properly called if `useDeprecatedSynchronousErrorHandling` is `true`. ([#6365](https://github.com/reactivex/rxjs/issues/6365)) ([e19e104](https://github.com/reactivex/rxjs/commit/e19e104d011233d83bc10c37f1ee0b3ac6e15612)), closes [#6364](https://github.com/reactivex/rxjs/issues/6364)
- **Subscription:** properly release parent subscriptions when unsubscribed. ([#6352](https://github.com/reactivex/rxjs/issues/6352)) ([88331d2](https://github.com/reactivex/rxjs/commit/88331d2ecdcf0f81a0712b315ed810d4da7d4b97)), closes [#6351](https://github.com/reactivex/rxjs/issues/6351) [#6351](https://github.com/reactivex/rxjs/issues/6351)
- **node**: do not reference DOM-related imports to assist in node usage. ([#6305](https://github.com/reactivex/rxjs/issues/6305)) ([b24818e](https://github.com/reactivex/rxjs/commit/b24818e96775045c7485932bf33349471e8f1363)), closes [#6297](https://github.com/reactivex/rxjs/issues/6297)

# [7.0.0](https://github.com/reactivex/rxjs/compare/7.0.0-rc.3...7.0.0) (2021-04-29)

### Bug Fixes

- VS code will now properly auto-import operators, et al ([#6276](https://github.com/reactivex/rxjs/issues/6276)) ([f43c728](https://github.com/reactivex/rxjs/commit/f43c72815f9ebe5ee3a8ed11513be0f541c9517d)), closes [#6067](https://github.com/reactivex/rxjs/issues/6067)
- **AjaxResponse:** add stricter `type` (`AjaxResponseType`) ([#6279](https://github.com/reactivex/rxjs/issues/6279)) ([839e192](https://github.com/reactivex/rxjs/commit/839e192b7d826d833d7ce941be97c3735bd19c0a))

# [7.0.0-rc.3](https://github.com/reactivex/rxjs/compare/7.0.0-rc.2...7.0.0-rc.3) (2021-04-28)

### Bug Fixes

- finalize behaves well with useDeprecatedSynchronousErrorHandling ([#6251](https://github.com/reactivex/rxjs/issues/6251)) ([e4bed2a](https://github.com/reactivex/rxjs/commit/e4bed2a2bad994f05a39246707d4f203412cebbd)), closes [#6250](https://github.com/reactivex/rxjs/issues/6250)
- resolve run-time errors when using deprecated sync error handling ([#6272](https://github.com/reactivex/rxjs/issues/6272)) ([35daaf7](https://github.com/reactivex/rxjs/commit/35daaf77d3a9a909a7ec22c362c97ac42a597f79)), closes [#6271](https://github.com/reactivex/rxjs/issues/6271)
- resolve issue that made users unable to assert `instanceof AjaxError`. ([#6275](https://github.com/reactivex/rxjs/issues/6275)) ([a7c2d29](https://github.com/reactivex/rxjs/commit/a7c2d297ad6b2f405ac312b38f6360e9a645d890))

### Features

- add config object to connectable ([#6267](https://github.com/reactivex/rxjs/issues/6267)) ([4d98b40](https://github.com/reactivex/rxjs/commit/4d98b40f969d5f55381f9a178ef3c18e6850cf47))

### BREAKING CHANGES

- Our very new creation function, `connectable`, now takes a configuration object instead of just the `Subject` instance. This was necessary to make sure it covered all use cases for what we were trying to replace in the deprecated multicasting operators. Apologies for the late-in-the-game change, but we know it's not widely used yet (it's new in v7), and we want to get it right.

# [7.0.0-rc.2](https://github.com/reactivex/rxjs/compare/7.0.0-rc.1...7.0.0-rc.2) (2021-04-20)

### Bug Fixes

- **webSocket:** return the correct type for `WebSocketSubject` `multiplex` method([#6232](https://github.com/reactivex/rxjs/issues/6232)) ([33383b8](https://github.com/reactivex/rxjs/commit/33383b884d895fa77866362b8b00fd2e2c3597e6))

### Reverts

- Revert "chore: Add typesVersions to package.json (#6229)" (#6241) ([304f3a7](https://github.com/reactivex/rxjs/commit/304f3a73e67871f9b37f39675e503174d3dcc23a)), closes [#6229](https://github.com/reactivex/rxjs/issues/6229) [#6241](https://github.com/reactivex/rxjs/issues/6241)

# [7.0.0-rc.1](https://github.com/reactivex/rxjs/compare/7.0.0-rc.0...7.0.0-rc.1) (2021-04-19)

### Bug Fixes

- **TypeScript:** Add typesVersions definition to package.json in order to help VS Code find automatic imports. ([#6067](https://github.com/reactivex/rxjs/issues/6067)) ([659a623](https://github.com/reactivex/rxjs/commit/659a623c94bd6b210e9beb6bb6061be540b05538))

# [7.0.0-rc.0](https://github.com/reactivex/rxjs/compare/7.0.0-beta.15...7.0.0-rc.0) (2021-04-19)

### Bug Fixes

- **symbol:** revert unique symbol in [#5874](https://github.com/reactivex/rxjs/issues/5874) ([#6224](https://github.com/reactivex/rxjs/issues/6224)) ([3c49429](https://github.com/reactivex/rxjs/commit/3c49429fadc31ebaddd143d4412907edc50e32be)), closes [#5919](https://github.com/reactivex/rxjs/issues/5919) [#6178](https://github.com/reactivex/rxjs/issues/6178) [#6175](https://github.com/reactivex/rxjs/issues/6175)
- forkJoin/combineLatest return Observable<unknown> if passed any ([#6227](https://github.com/reactivex/rxjs/issues/6227)) ([ce0a2fa](https://github.com/reactivex/rxjs/commit/ce0a2fa975e7c08de2bbf893010f2c25c090b1ca)), closes [#6226](https://github.com/reactivex/rxjs/issues/6226)
- **fromEvent:** match targets properly; fix result selector type ([#6208](https://github.com/reactivex/rxjs/issues/6208)) ([8412c73](https://github.com/reactivex/rxjs/commit/8412c739bb47cc45ec3f38327115301b4fcc0118))
- **merge:** single array is not an array of sources ([#6211](https://github.com/reactivex/rxjs/issues/6211)) ([4e900dc](https://github.com/reactivex/rxjs/commit/4e900dc745b5fbd7659b104c49fb0fce4ae84707))
- **pipe:** Ensure that `unknown` is inferred for 9+ arguments. ([#6212](https://github.com/reactivex/rxjs/issues/6212)) ([6fa819b](https://github.com/reactivex/rxjs/commit/6fa819beb91ba99dadd6262d6c13f7ddfd9470c5))

### Features

- add (optional) defaultValue configuration to firstValueFrom and lastValueFrom ([#6204](https://github.com/reactivex/rxjs/issues/6204)) ([df51b04](https://github.com/reactivex/rxjs/commit/df51b04d7ec68a72b3a4b0d69c3bb29264c72611))

# [7.0.0-beta.15](https://github.com/reactivex/rxjs/compare/7.0.0-beta.14...7.0.0-beta.15) (2021-03-31)

### Bug Fixes

- **esm:** duplicate directory in export path ([#6194](https://github.com/reactivex/rxjs/issues/6194)) ([aa41462](https://github.com/reactivex/rxjs/commit/aa4146288ec6542754f41ffd260fa4d6936a4d22))

# [7.0.0-beta.14](https://github.com/reactivex/rxjs/compare/7.0.0-beta.13...7.0.0-beta.14) (2021-03-30)

### Bug Fixes

- **share:** No longer throws errors for reentrant observables ([#6151](https://github.com/reactivex/rxjs/issues/6151)) ([fc728cd](https://github.com/reactivex/rxjs/commit/fc728cdf2f395620cca347602e66f3d173c057b5)), closes [#6144](https://github.com/reactivex/rxjs/issues/6144)

### Features

- **ajax:** Now allows configuration of query string parameters, via a `params` option in the request configuration ([#6174](https://github.com/reactivex/rxjs/issues/6174)) ([980f4d4](https://github.com/reactivex/rxjs/commit/980f4d4bb6a3bc1513a4335ed124f4d11b93d251))
- **esm:** Added exports within package.json to enable scoped package loading. ([#6192](https://github.com/reactivex/rxjs/issues/6192)) ([33a9f06](https://github.com/reactivex/rxjs/commit/33a9f06f2c59c8aef3bb583bdb7d61d08ab597a0)), closes [sveltejs/kit#612](https://github.com/sveltejs/kit/issues/612) [nodejs/node#27408](https://github.com/nodejs/node/issues/27408)
- **ReadableStreams:** RxJS now supports conversions for ReadableStreams e.g. `from(readableStream)`. ([#6163](https://github.com/reactivex/rxjs/issues/6163)) ([19d6502](https://github.com/reactivex/rxjs/commit/19d650223cf0e1964e893baca19f264154422a7d))

# [7.0.0-beta.13](https://github.com/reactivex/rxjs/compare/7.0.0-beta.12...7.0.0-beta.13) (2021-03-15)

### Bug Fixes

- **fromEvent:** throw if passed invalid target ([#6136](https://github.com/reactivex/rxjs/issues/6136)) ([317ba0c](https://github.com/reactivex/rxjs/commit/317ba0c9254e447385414e2c57e1d81760f88aa6)), closes [#5823](https://github.com/reactivex/rxjs/issues/5823)
- remove misused type parameter from static pipe ([#6119](https://github.com/reactivex/rxjs/issues/6119)) ([8dc7d17](https://github.com/reactivex/rxjs/commit/8dc7d1793b4067d9eedc42b28d49ace8296672f5)), closes [#5557](https://github.com/reactivex/rxjs/issues/5557)
- **Subscriber:** don't leak destination ([#6116](https://github.com/reactivex/rxjs/issues/6116)) ([5bba36c](https://github.com/reactivex/rxjs/commit/5bba36c6dde5b1b4b7e434104e716b233e5f402c))
- **combineLatest:** POJO signature should match only ObservableInput values ([#6103](https://github.com/reactivex/rxjs/issues/6103)) ([d633494](https://github.com/reactivex/rxjs/commit/d633494dcdcabecda2c64ee84b8b6ceeaa2cb3d8))
- **forkJoin:** POJO signature should match only ObservableInput values ([#6095](https://github.com/reactivex/rxjs/issues/6095)) ([566427e](https://github.com/reactivex/rxjs/commit/566427e88e597589f21b8cfb057dd13d5c61e0f2))
- predicates that return `any` will now behave property with findIndex ([#6097](https://github.com/reactivex/rxjs/issues/6097)) ([c6f73d6](https://github.com/reactivex/rxjs/commit/c6f73d687e6b2142da4cab2a66047cc6dd123bf9))
- remove misused type parameter from isObservable ([#6083](https://github.com/reactivex/rxjs/issues/6083)) ([f16b634](https://github.com/reactivex/rxjs/commit/f16b6341eef85009fc16de13623dc860d8d87778))
- unhandled errors in observers correctly scheduled ([#6118](https://github.com/reactivex/rxjs/issues/6118)) ([c02ceb7](https://github.com/reactivex/rxjs/commit/c02ceb75e3de12fedbe270d5d323f508171f9cfd))
- **defaultIfEmpty:** Allow `undefined` as an argument, require an argument ([4983760](https://github.com/reactivex/rxjs/commit/4983760b9179da27ddfcbf419ac5975cff9447c9)), closes [#6064](https://github.com/reactivex/rxjs/issues/6064)
- **elementAt:** Allow `defaultValue` of `undefined`. ([5bc1b3e](https://github.com/reactivex/rxjs/commit/5bc1b3e22deceb5ea5f1882c0f92f061c1c4792d))
- **first:** Allow `defaultValue` of `undefined`. ([62a6bbe](https://github.com/reactivex/rxjs/commit/62a6bbe1c3c51468c57e4e8f754c1c09da2db51b))
- **last:** Allow `defaultValue` of `undefined`. ([ef3e721](https://github.com/reactivex/rxjs/commit/ef3e721f440132cf199f662b6a987349a0a70418))

### Features

- rename and alias `combineLatest` as `combineLatestAll` for consistency ([#6079](https://github.com/reactivex/rxjs/issues/6079)) ([42cee80](https://github.com/reactivex/rxjs/commit/42cee8045594779e8802b370c7244e6bbeeccaa3)), closes [#4590](https://github.com/reactivex/rxjs/issues/4590)

### BREAKING CHANGES

- **defaultIfEmpty:** `defaultIfEmpty` requires a value be passed. Will no longer convert `undefined` to `null` for no good reason.

# [7.0.0-beta.12](https://github.com/reactivex/rxjs/compare/7.0.0-beta.11...7.0.0-beta.12) (2021-02-27)

5bc8e3361 Fix/6052 ajax responseType should default to "json" (#6056)

### Bug Fixes

- **ajax**: `responseType` is now properly defaulted to `"json"` again. ([#6056](https://github.com/reactivex/rxjs/issues/6056)) ([5bc8e3361](https://github.com/reactivex/rxjs/commit/5bc8e3361))
- Corner case resolved where an error thrown in a completion handler might delay teardown if it happened to be after a completing operator like `take`. ([#6062](https://github.com/reactivex/rxjs/issues/6062)) ([a2b9563](https://github.com/reactivex/rxjs/commit/a2b95631be882d2cf0fd87f43804d1ed699591d7))
- **AsyncGenerator support**: consumed async generators are now properly finalized. ([#6062](https://github.com/reactivex/rxjs/issues/6062)) ([a2b9563](https://github.com/reactivex/rxjs/commit/a2b95631be882d2cf0fd87f43804d1ed699591d7)), closes [#5998](https://github.com/reactivex/rxjs/issues/5998)
- **throttle:** no longer emits more than necessary in sync/sync trailing case ([#6059](https://github.com/reactivex/rxjs/issues/6059)) ([9da638a](https://github.com/reactivex/rxjs/commit/9da638a70d5abb862439ab4ee6a55368228811b0)), closes [#6058](https://github.com/reactivex/rxjs/issues/6058)

# [7.0.0-beta.11](https://github.com/reactivex/rxjs/compare/7.0.0-beta.10...7.0.0-beta.11) (2021-02-24)

### Bug Fixes

- **ajax:** now errors on forced abort ([#6041](https://github.com/reactivex/rxjs/issues/6041)) ([d950921](https://github.com/reactivex/rxjs/commit/d95092143c1860eef054d27f2a1e50cb98b0ef58)), closes [#4251](https://github.com/reactivex/rxjs/issues/4251)
- **buffer:** closingNotifier completion does not complete resulting observable ([358ae84](https://github.com/reactivex/rxjs/commit/358ae84cb9d59170216e7e0845c192eb3e1dcb51))
- **buffer:** Remaining buffer will correctly be emitted on source close. ([0c667d5](https://github.com/reactivex/rxjs/commit/0c667d596d4a14002ffe9d4db319ed7cd7442ada)), closes [#3990](https://github.com/reactivex/rxjs/issues/3990) [#6035](https://github.com/reactivex/rxjs/issues/6035)
- **debounceTime:** improves performance on quick succession of emits ([#6049](https://github.com/reactivex/rxjs/issues/6049)) ([9b70861](https://github.com/reactivex/rxjs/commit/9b708613cb7687647dc43c5e15b821e17ccc23ef))
- **distinctUntilChanged:** Ensure reentrant code is compared properly ([#6014](https://github.com/reactivex/rxjs/issues/6014)) ([0ebcf17](https://github.com/reactivex/rxjs/commit/0ebcf1751a5359072b137ff197789570be4d7ead))
- **share:** Ensure proper memory clean up ([1aa400a](https://github.com/reactivex/rxjs/commit/1aa400a5214325bc843a74602022a7912da20166))
- **window:** final window stays open until source complete ([e8b05ef](https://github.com/reactivex/rxjs/commit/e8b05ef090d33af5b883e8020b8b7a3c4c8fa30e))
- **concat/merge:** operators will finalize inners before moving to the next ([#6010](https://github.com/reactivex/rxjs/issues/6010)) ([5249a23](https://github.com/reactivex/rxjs/commit/5249a23b38bdda4639e9d669afd62a624172f89c)), closes [#3338](https://github.com/reactivex/rxjs/issues/3338)
- predicates that return `any` will now behave property in TS ([#5987](https://github.com/reactivex/rxjs/issues/5987)) ([f5ae97d](https://github.com/reactivex/rxjs/commit/f5ae97d49a35b9f99ac59f79dd244a6d8d6c8a7b)), closes [#5986](https://github.com/reactivex/rxjs/issues/5986)
- `publish` variants returning `ConnectableObservable` not properly utilizing lift ([#6003](https://github.com/reactivex/rxjs/issues/6003)) ([9acb950](https://github.com/reactivex/rxjs/commit/9acb950aec9efda95eb7492bfc47a33b71ef2e55))
- Resolve issues with deprecated synchronous error handling and chained operators ([#5980](https://github.com/reactivex/rxjs/issues/5980)) ([0ad2802](https://github.com/reactivex/rxjs/commit/0ad2802a5aa9cd19875dc05c1cfb33f0b2f2c153)), closes [#5979](https://github.com/reactivex/rxjs/issues/5979)
- `useDeprecatedSynchronousErrorThrowing` honored for flattened sync sources ([#5984](https://github.com/reactivex/rxjs/issues/5984)) ([abd95ce](https://github.com/reactivex/rxjs/commit/abd95ce1aa81a64de81c074a72570a8f0949cd0d)), closes [#5983](https://github.com/reactivex/rxjs/issues/5983)

### Features

- **ajax:** Add option for streaming progress ([#6001](https://github.com/reactivex/rxjs/issues/6001)) ([873e52d](https://github.com/reactivex/rxjs/commit/873e52d0d67b0f8470e6290c6fbc35c571464aaf))
- **exhaustAll:** renamed `exhaust` to `exhaustAll` ([#5639](https://github.com/reactivex/rxjs/issues/5639)) ([701c7d4](https://github.com/reactivex/rxjs/commit/701c7d48cf1c3e60941692010254d6a27fc70980))

### BREAKING CHANGES

- **window:** The `windowBoundaries` observable no longer completes the result. It was only ever meant to notify of the window boundary. To get the same behavior as the old behavior, you would need to add an `endWith` and a `skipLast(1)` like so: `source$.pipe(window(notifier$.pipe(endWith(true))), skipLast(1))`.
- **buffer:** Final buffered values will now always be emitted. To get the same behavior as the previous release, you can use `endWith` and `skipLast(1)`, like so: `source$.pipe(buffer(notifier$.pipe(endWith(true))), skipLast(1))`
- **buffer:** `closingNotifier` completion no longer completes the result of `buffer`. If that is truly a desired behavior, then you should use `takeUntil`. Something like: `source$.pipe(buffer(notifier$), takeUntil(notifier$.pipe(ignoreElements(), endWith(true))))`, where `notifier$` is multicast, although there are many ways to compose this behavior.

# [7.0.0-beta.10](https://github.com/reactivex/rxjs/compare/7.0.0-beta.9...7.0.0-beta.10) (2021-01-18)

### Bug Fixes

- **combineLatest:** Ensure `EMPTY` is returned if no observables are passed. ([#5963](https://github.com/reactivex/rxjs/issues/5963)) ([157c7e8](https://github.com/reactivex/rxjs/commit/157c7e8068befdfb26a9ba6ca770d38a66966ab5)), closes [#5962](https://github.com/reactivex/rxjs/issues/5962)
- **fromEvent:** fixed HasEventTargetAddRemove to support EventTarget types ([#5945](https://github.com/reactivex/rxjs/issues/5945)) ([5f022d7](https://github.com/reactivex/rxjs/commit/5f022d784570684632e6fd5ae247fc259ee34c4b))

### Features

- **connect:** Adds new `connect` operator. ([9d53af0](https://github.com/reactivex/rxjs/commit/9d53af04103dbbb3bae40a4c511e2eebf117be09))
- **connectable:** Adds `connectable` creation method ([f968a79](https://github.com/reactivex/rxjs/commit/f968a791c1b48f3100e925d700e8a0ecd69cc7e5))
- **share:** Make `share` completely configurable. Also adds `SubjectLike`. ([2d600c7](https://github.com/reactivex/rxjs/commit/2d600c75c1065d862a2089dc1cd26007996b1c9d))
- **TestScheduler:** add `expectObservable(a$).toEqual(b$)`. ([3372c72](https://github.com/reactivex/rxjs/commit/3372c72ed77a96e29a613a620e85f93bcf447920))

### Performance Improvements

- ensure same hidden class for OperatorSubscriber ([#5878](https://github.com/reactivex/rxjs/issues/5878)) ([246b449](https://github.com/reactivex/rxjs/commit/246b44902acde3a80e659f362969e6e2f8b19ef2))

### BREAKING CHANGES

- **share:** The TypeScript type `Subscribable` now only supports what is a valid return for `[Symbol.observable]()`.
- **share:** The TypeScript type `Observer` no longer incorrectly has an optional `closed` property.

# [7.0.0-beta.9](https://github.com/reactivex/rxjs/compare/7.0.0-beta.8...7.0.0-beta.9) (2020-12-07)

### Bug Fixes

- **audit:** don't signal on complete ([54cb428](https://github.com/reactivex/rxjs/commit/54cb42823ceec4db469f6155de67993b67ec85be))
- **bufferToggle:** don't signal on complete ([65686ff](https://github.com/reactivex/rxjs/commit/65686ffd23f2d5a5145f2b7c33ea739e9bb808cd))
- **bufferWhen:** don't signal on complete ([a2ba364](https://github.com/reactivex/rxjs/commit/a2ba364ede3c69c7703795a744f57122b49eac40))
- **debounce:** don't signal on complete ([c919c68](https://github.com/reactivex/rxjs/commit/c919c684ad63724f0b55ccc4561f847773d945c8))
- **delayWhen:** no longer emits if duration selector is empty ([#5769](https://github.com/reactivex/rxjs/issues/5769)) ([0872341](https://github.com/reactivex/rxjs/commit/087234146760ab2c67a04f9f0b5494a93affadb7)), closes [#3665](https://github.com/reactivex/rxjs/issues/3665)
- **forkJoin:** ensure readonly array argument `forkJoin([a$, b$, c$] as const)` result is correct ([6baec53](https://github.com/reactivex/rxjs/commit/6baec536015253ac96827f2136ede17a324c634e))
- **iif:** No longer allow accidental undefined arguments ([#5829](https://github.com/reactivex/rxjs/issues/5829)) ([23b98b4](https://github.com/reactivex/rxjs/commit/23b98b4e61c3284c81c07a8d810e8c3ec99ddfec))
- **sample:** don't signal on complete ([95e0b70](https://github.com/reactivex/rxjs/commit/95e0b703caaf288657c7d722b9823458280be88b))
- **Symbol.observable:** properly defined as a `unique symbol`. ([#5874](https://github.com/reactivex/rxjs/issues/5874)) ([374138e](https://github.com/reactivex/rxjs/commit/374138e09eb7ceb6f8da556c6c11dea1ba8cdbee)), closes [#5861](https://github.com/reactivex/rxjs/issues/5861) [#4415](https://github.com/reactivex/rxjs/issues/4415)
- **throttle:** don't signal on complete ([4af0227](https://github.com/reactivex/rxjs/commit/4af022753d6dd4e94bcfcf0cc6082bb2312a3f02))
- **windowToggle:** don't signal on complete ([9cb56c4](https://github.com/reactivex/rxjs/commit/9cb56c45de289ef5b062f33971996bdb8414cf99)), closes [#5838](https://github.com/reactivex/rxjs/issues/5838)
- use empty object type in combineLatest/forkJoin sigs ([#5832](https://github.com/reactivex/rxjs/issues/5832)) ([22aaaa2](https://github.com/reactivex/rxjs/commit/22aaaa2f03dc721f850d9836243773c5310e85e8))
- **withLatestFrom:** allow synchronous source ([#5828](https://github.com/reactivex/rxjs/issues/5828)) ([adbe65e](https://github.com/reactivex/rxjs/commit/adbe65e659bbf17f6ab20a9b30fcca0e4d76af9a))

### Features

- stopped notification handler ([#5750](https://github.com/reactivex/rxjs/issues/5750)) ([cfa267b](https://github.com/reactivex/rxjs/commit/cfa267bc0916ede09c8b14aedcdb69a791055fb6))
- support emoji in marble diagrams ([#5907](https://github.com/reactivex/rxjs/issues/5907)) ([1b4608c](https://github.com/reactivex/rxjs/commit/1b4608cea3a9db96d7a629ad5de0e100145c180e))
- **filter:** improve type inference for filter(Boolean) ([#5831](https://github.com/reactivex/rxjs/issues/5831)) ([d2658fa](https://github.com/reactivex/rxjs/commit/d2658fa32d7a86ac1e0796c452df258fc5470f67))

### BREAKING CHANGES

- **windowToggle:** the observable returned by the windowToggle operator's
  closing selector must emit a next notification to close the window.
  Complete notifications no longer close the window.
- **bufferToggle:** the observable returned by the bufferToggle operator's
  closing selector must emit a next notification to close the buffer.
  Complete notifications no longer close the buffer.
- **bufferWhen:** the observable returned by the bufferWhen operator's
  closing selector must emit a next notification to close the buffer.
  Complete notifications no longer close the buffer.
- **debounce:** the observable returned by the debounce operator's
  duration selector must emit a next notification to end the duration.
  Complete notifications no longer end the duration.
- **throttle:** the observable returned by the throttle operator's
  duration selector must emit a next notification to end the duration.
  Complete notifications no longer end the duration.
- **sample:** the sample operator's notifier observable must emit a next notification to effect a sample. Complete notifications no longer effect a sample.
- **audit:** the observable returned by the audit operator's duration selector must emit a next notification to end the duration. Complete notifications no longer end the duration.
- **Symbol.observable:** `rxjs@7` is only compatible with `@types/node@14.14.3` or higher and `symbol-observable@3.0.0` and higher. Older versions of `@types/node` incorrectly defined `Symbol.observable` and will be in conflict with `rxjs` and `symbol-observable@3.0.0`.
- **delayWhen:** `delayWhen` will no longer emit if the duration selector simply completes without a value. Notifiers must notify with a value, not a completion.
- **iif:** `iif` will no longer allow result arguments that are `undefined`. This was a bad call pattern that was likely an error in most cases. If for some reason you are relying on this behavior, simply substitute `EMPTY` in place of the `undefined` argument. This ensures that the behavior was intentional and desired, rather than the result of an accidental `undefined` argument.

# [7.0.0-beta.8](https://github.com/reactivex/rxjs/compare/7.0.0-beta.7...7.0.0-beta.8) (2020-10-15)

### Bug Fixes

- **audit, auditTime:** audit and auditTime emit last value after source completes ([#5799](https://github.com/reactivex/rxjs/issues/5799)) ([643bc85](https://github.com/reactivex/rxjs/commit/643bc85ab17a15a5d96f8bef8f08c3987d16eb40)), closes [#5730](https://github.com/reactivex/rxjs/issues/5730)
- No longer allow invalid "Subscribable" type as valid observable source in `from` and others. ([258dddd](https://github.com/reactivex/rxjs/commit/258dddd8a392456e7d0b5ed9a7e294044f7c2518)), closes [#4532](https://github.com/reactivex/rxjs/issues/4532)
- **bindNodeCallback:** ensure underlying function is not called twice during subscription ([#5780](https://github.com/reactivex/rxjs/issues/5780)) ([74aa4b2](https://github.com/reactivex/rxjs/commit/74aa4b2ea6685f475329a8b8ecbcebed9adae547))
- **delay:** Now properly handles Date and negative numbers ([#5719](https://github.com/reactivex/rxjs/issues/5719)) ([868c02b](https://github.com/reactivex/rxjs/commit/868c02b47bb6f4ec4cd1d68b5b474731c470f27e)), closes [#5232](https://github.com/reactivex/rxjs/issues/5232)
- **delayWhen:** only deprecates when subscriptionDelay presents ([#5797](https://github.com/reactivex/rxjs/issues/5797)) ([43d1731](https://github.com/reactivex/rxjs/commit/43d17311a521234375146029aa5c4709cb221344))
- **every:** index properly increments in predicate ([5686f83](https://github.com/reactivex/rxjs/commit/5686f838fdc3da710d3f1eed1a6381791e3cc644))
- **firstValueFrom:** now unsubscribes from source after first value is received ([#5813](https://github.com/reactivex/rxjs/issues/5813)) ([a321516](https://github.com/reactivex/rxjs/commit/a321516908aa036fb658395a372668a986af2504)), closes [#5811](https://github.com/reactivex/rxjs/issues/5811)
- **from:** objects that are thennable that happen to have a subscribe method will no longer error. ([789d6e3](https://github.com/reactivex/rxjs/commit/789d6e3d851d57ab3b4488381f702120fd079737))
- **fromEvent:** now properly types JQuery event targets ([b5aa15a](https://github.com/reactivex/rxjs/commit/b5aa15a7f58377310438aa5957e1516749d36219))
- **mergeScan:** no longer emits state again upon completion. ([#5805](https://github.com/reactivex/rxjs/issues/5805)) ([68c2894](https://github.com/reactivex/rxjs/commit/68c28943b4d2c51068fecbc359a68ca6982307bf)), closes [#5372](https://github.com/reactivex/rxjs/issues/5372)
- **throttle:** now supports synchronous duration selectors ([55e953e](https://github.com/reactivex/rxjs/commit/55e953e1f7b915e6c9072bf14a2febd5b8431393)), closes [#5658](https://github.com/reactivex/rxjs/issues/5658)
- **throttle:** trailing values will now emit after source completes ([d5fd69c](https://github.com/reactivex/rxjs/commit/d5fd69c123d2232335563eea95c69c07576d079d))
- **timeout:** allows synchronous observable as a source ([84c5c0b](https://github.com/reactivex/rxjs/commit/84c5c0b9d9e0d1791ac2f066c26e462e822d73e1)), closes [#5746](https://github.com/reactivex/rxjs/issues/5746)
- **zip:** zip now accepts an array of arguments like its counterparts ([3123b67](https://github.com/reactivex/rxjs/commit/3123b670cca9b77919845333952ef70275ed6e90))

### Code Refactoring

- **count:** Base off of `reduce`. ([98a6d09](https://github.com/reactivex/rxjs/commit/98a6d0991df2a28366ab8f34098109a67257c235))
- **pairs:** Based off of `from` and `Object.entries` ([#5775](https://github.com/reactivex/rxjs/issues/5775)) ([d39f830](https://github.com/reactivex/rxjs/commit/d39f8309c33917cb7070c7432fcd382395e4211e))

### Features

- **ajax:** now supports passing custom XSRF cookies in a custom header ([#5702](https://github.com/reactivex/rxjs/issues/5702)) ([1a2c2e4](https://github.com/reactivex/rxjs/commit/1a2c2e49482a460778ea92c7f6a92e58cc3e87bb)), closes [#4003](https://github.com/reactivex/rxjs/issues/4003)
- **switchScan:** add switchScan() operator ([#4442](https://github.com/reactivex/rxjs/issues/4442)) ([73fa910](https://github.com/reactivex/rxjs/commit/73fa910cb62eccbccc4b4249f9b2606095704328)), closes [#2931](https://github.com/reactivex/rxjs/issues/2931)

### BREAKING CHANGES

- **mergeScan:** `mergeScan` will no longer emit its inner state again upon completion.
- **pairs:** `pairs` will no longer function in IE without a polyfill for `Object.entries`. `pairs` itself is also deprecated in favor of users just using `from(Object.entries(obj))`.
- **zip:** Zipping a single array will now have a different result. This is an extreme corner-case, because it is very unlikely that anyone would want to zip an array with nothing at all. The workaround would be to wrap the array in another array `zip([[1,2,3]])`. But again, that's pretty weird.
- **count:** No longer passes `source` observable as a third argument to the predicate. That feature was rarely used, and of limited value. The workaround is to simply close over the source inside of the function if you need to access it in there.

# [7.0.0-beta.7](https://github.com/reactivex/rxjs/compare/7.0.0-beta.5...7.0.0-beta.7) (2020-09-23)

### Bug Fixes

- **multicast:** and other publish variants will handle errors thrown in a selector appropriately ([bde8eda](https://github.com/reactivex/rxjs/commit/bde8eda09310463b05c5ec7d8a1dd1bafe9dba6f))

### Code Refactoring

- **tap:** reduce the size of the implementation ([1222d5a](https://github.com/reactivex/rxjs/commit/1222d5a68faa9d3f3c9ad8f8d5db1440971502bd))
- **Subscriber:** Massively untangle Subscriber and SafeSubscriber ([07902ca](https://github.com/reactivex/rxjs/commit/07902ca99ee828521ce238826f10b55e25fbf554))

### BREAKING CHANGES

- **Subscriber:** `new Subscriber` no longer takes 0-3 arguments. To create a `Subscriber` with 0-3 arguments, use `Subscriber.create`. However, please note that there is little to no reason that you should be creating `Subscriber` references directly, and `Subscriber.create` and `new Subscriber` are both deprecated.

# [7.0.0-beta.6](https://github.com/reactivex/rxjs/compare/7.0.0-beta.5...7.0.0-beta.6) (2020-09-23)

### Bug Fixes

- **AsyncSubject:** fixed reentrancy issue in complete ([9e00f11](https://github.com/reactivex/rxjs/commit/9e00f11e992d223edf1013d0a44c7cad41b72470)), closes [/github.com/ReactiveX/rxjs/pull/5729/files/30d429cf1b791db15c04a61f6a683e189b53fb3e#r492314703](https://github.com//github.com/ReactiveX/rxjs/pull/5729/files/30d429cf1b791db15c04a61f6a683e189b53fb3e/issues/r492314703)
- **delay:** proper handling of absolute time (`Date`) passed as an argument ([8ae89b1](https://github.com/reactivex/rxjs/commit/8ae89b19a095541eb3dfe6e6d9f26367486c435e))
- **fromEvent:** properly teardown for ArrayLike targets ([066de74](https://github.com/reactivex/rxjs/commit/066de7408810864891b9fd16e05c6c8b4ca88087))
- **ReplaySubject:** no longer buffers additional values after it's already stopped ([#5696](https://github.com/reactivex/rxjs/issues/5696)) ([a08232b](https://github.com/reactivex/rxjs/commit/a08232be6dcab74e94cfbb17cc5138050bcd6ddb))
- **scan:** proper indexes when seed is not supplied ([f93fb9c](https://github.com/reactivex/rxjs/commit/f93fb9c1fb7434c97e1d156370756159c5f2b077)), closes [#4348](https://github.com/reactivex/rxjs/issues/4348) [#3879](https://github.com/reactivex/rxjs/issues/3879)
- **windowTime:** Passing no creation interval will now properly open new window when old one closes ([cbd0ac0](https://github.com/reactivex/rxjs/commit/cbd0ac0478730ec10172b57210e7d269d1ce62a2))

### Code Refactoring

- **Massive Size Reduction:** reduced the size of all operator implementations as well as other utilities and types ([#5729](https://github.com/reactivex/rxjs/issues/5729)) ([4d3fc23](https://github.com/reactivex/rxjs/commit/fc41e13a1b9a05fc242c1369b4f597c931bd28b5))

### Features

- **onUnhandledError:** configuration point added for unhandled errors ([#5681](https://github.com/reactivex/rxjs/issues/5681)) ([3485dd5](https://github.com/reactivex/rxjs/commit/3485dd5149b731e1103d2d070e3892735cbacef1))
- **skipLast:** counts zero or less will mirror the source ([02e113b](https://github.com/reactivex/rxjs/commit/02e113b3345a9efe8f7c29f8b9c1c0d088aaf726))

### BREAKING CHANGES

- **skipLast:** `skipLast` will no longer error when passed a negative number, rather it will simply return the source, as though `0` was passed.
- **map:** `thisArg` will now default to `undefined`. The previous default of `MapSubscriber` never made any sense. This will only affect code that calls map with a `function` and references `this` like so: `source.pipe(map(function () { console.log(this); }))`. There wasn't anything useful about doing this, so the breakage is expected to be very minimal. If anything we're no longer leaking an implementation detail.
- **onUnhandledError:** Errors that occur during setup of an observable subscription after the subscription has emitted an error or completed will now throw in their own call stack. Before it would call `console.warn`. This is potentially breaking in edge cases for node applications, which may be configured to terminate for unhandled exceptions. In the unlikely event this affects you, you can configure the behavior to `console.warn` in the new configuration setting like so: `import { config } from 'rxjs'; config.onUnhandledError = (err) => console.warn(err);`

# [7.0.0-beta.5](https://github.com/reactivex/rxjs/compare/7.0.0-beta.4...7.0.0-beta.5) (2020-09-03)

### Bug Fixes

- **ajax:** Allow XHR to perform body serialization and set content-type where possible ([d8657ed](https://github.com/reactivex/rxjs/commit/d8657ede8d9620ac2a7d61557e1f1d0e89b0b52a)), closes [#2837](https://github.com/reactivex/rxjs/issues/2837)
- **ajax:** Do not mutate headers passed as arguments ([0d66ba4](https://github.com/reactivex/rxjs/commit/0d66ba458f07fba51cfc73440d01ef453c24cda7)), closes [#2801](https://github.com/reactivex/rxjs/issues/2801)
- **bindCallback:** now emits errors that happen after callback ([2bddd31](https://github.com/reactivex/rxjs/commit/2bddd317fad962ad375de4a04dd528b02479ec5b))
- **bindNodeCallback:** now emits errors that happen after callback ([edc28cf](https://github.com/reactivex/rxjs/commit/edc28cfd13ba3d7fadc24ea3c20ec8ca5a19064d))
- **buffer:** Ensure notifier is subscribed after source ([#5654](https://github.com/reactivex/rxjs/issues/5654)) ([c088b0e](https://github.com/reactivex/rxjs/commit/c088b0eca904ab835b23df629d472003d6a82561)), closes [#2195](https://github.com/reactivex/rxjs/issues/2195) [#1754](https://github.com/reactivex/rxjs/issues/1754)
- **catchError:** ensure proper handling of async return for synchronous source error handling ([#5627](https://github.com/reactivex/rxjs/issues/5627)) ([1b29d4b](https://github.com/reactivex/rxjs/commit/1b29d4b6d42e3d6b649f9f2c4bb718f343233d83)), closes [#5115](https://github.com/reactivex/rxjs/issues/5115)
- **catchError:** inner synchronous observables will properly terminate ([#5655](https://github.com/reactivex/rxjs/issues/5655)) ([d3fd2fb](https://github.com/reactivex/rxjs/commit/d3fd2fb2bd619b79d0c4afebc3c10299afbca262))
- **errors:** Custom RxJS errors now all have a call stack ([#5686](https://github.com/reactivex/rxjs/issues/5686)) ([9bb046c](https://github.com/reactivex/rxjs/commit/9bb046c744cc1f9438a805849b655946e5793936)), closes [#4250](https://github.com/reactivex/rxjs/issues/4250)
- **onErrorResumeNext:** observables always finalized before moving to next source ([#5650](https://github.com/reactivex/rxjs/issues/5650)) ([ff68ad2](https://github.com/reactivex/rxjs/commit/ff68ad2caa3d275a23416984fab5570d3fed9458))
- **package.json:** change homepage setting to official docs site. ([#5669](https://github.com/reactivex/rxjs/issues/5669)) ([e57c402](https://github.com/reactivex/rxjs/commit/e57c402b29288f61fe886b00e51817730bcb320b))
- **repeat:** Ensure teardown happens between repeated synchronous obs… ([#5620](https://github.com/reactivex/rxjs/issues/5620)) ([0ca8a65](https://github.com/reactivex/rxjs/commit/0ca8a65b73aea93172366ca67207b53e3e3e77a8))
- **repeatWhen:** Ensure teardown happens between repeat subscriptions ([#5625](https://github.com/reactivex/rxjs/issues/5625)) ([98356f4](https://github.com/reactivex/rxjs/commit/98356f4ebefdba1f5a14edbd96de1592694a01a8))
- **retry:** Ensure teardown happens before resubscription with synchronous observables ([6f90597](https://github.com/reactivex/rxjs/commit/6f90597e51e038dabd8397b9f066ab4e3d344a5b)), closes [#5620](https://github.com/reactivex/rxjs/issues/5620)
- **retryWhen:** Ensure subscription tears down between retries ([#5623](https://github.com/reactivex/rxjs/issues/5623)) ([6752af7](https://github.com/reactivex/rxjs/commit/6752af7c1839baf3cd7ed9d024499de61a2477e9))
- **throttleTime:** ensure the spacing between throttles is always at least the throttled amount ([#5687](https://github.com/reactivex/rxjs/issues/5687)) ([ea84fc4](https://github.com/reactivex/rxjs/commit/ea84fc4dce84e32598701f79d9449be00a05352c)), closes [#3712](https://github.com/reactivex/rxjs/issues/3712) [#4864](https://github.com/reactivex/rxjs/issues/4864) [#2727](https://github.com/reactivex/rxjs/issues/2727) [#4727](https://github.com/reactivex/rxjs/issues/4727) [#4429](https://github.com/reactivex/rxjs/issues/4429)
- **zip:** zip operators and functions are now able to zip all iterable sources ([#5688](https://github.com/reactivex/rxjs/issues/5688)) ([02c3a1b](https://github.com/reactivex/rxjs/commit/02c3a1b70c0e96b784a3c5c214c0f89c5ebdd696)), closes [#4304](https://github.com/reactivex/rxjs/issues/4304)
- `switchMap` and `exhaustMap` behave correctly with re-entrant code. ([c289688](https://github.com/reactivex/rxjs/commit/c289688f5e1f33ec21306b4d2f5539dd19f963f2))
- **webSocket:** close websocket connection attempt on unsubscribe ([e1a671c](https://github.com/reactivex/rxjs/commit/e1a671cbd7f5a6ce547ed9ee6ce98c22264500f4)), closes [#4446](https://github.com/reactivex/rxjs/issues/4446)

### Code Refactoring

- **ajax:** Use simple Observable ([17b9add](https://github.com/reactivex/rxjs/commit/17b9add03a90aec6e708a87c0fc387745f0b9df6))
- **Subscriber:** remove \_unsubscribeAndRecycle ([d879c3f](https://github.com/reactivex/rxjs/commit/d879c3f3ae4b1de5660d1613bb8b300e7194d581))
- **VirtualTimeScheduler:** remove sortActions from public API ([#5657](https://github.com/reactivex/rxjs/issues/5657)) ([a468f88](https://github.com/reactivex/rxjs/commit/a468f881c8c02195b089889486d1a94fab2771e0))

### Features

- **combineLatest:** add N-args signature for observable inputs ([#5488](https://github.com/reactivex/rxjs/issues/5488)) ([fcc47e7](https://github.com/reactivex/rxjs/commit/fcc47e75a4c811199c5071144172f4d06ffc7c70))
- **Subscription:** `add` no longer returns unnecessary Subscription reference ([#5656](https://github.com/reactivex/rxjs/issues/5656)) ([4de604e](https://github.com/reactivex/rxjs/commit/4de604ea66261f597af11918aec53cd94590b30f))
- **Subscription:** `remove` will now remove any teardown by reference ([#5659](https://github.com/reactivex/rxjs/issues/5659)) ([1531152](https://github.com/reactivex/rxjs/commit/15311529fa1b880ed469b6c253cd0be7ff2f98a1))
- **throwError:** now accepts a factory to create the error ([#5647](https://github.com/reactivex/rxjs/issues/5647)) ([dad270a](https://github.com/reactivex/rxjs/commit/dad270afcf496de74b4392024191715d7dbef4f5)), closes [#5617](https://github.com/reactivex/rxjs/issues/5617)
- **useDeprecatedNextContext:** Puts deprecated next context behavior behind a flag ([dfdef5d](https://github.com/reactivex/rxjs/commit/dfdef5dcaf52363be59359786aef8bc733197b43))
- support schedulers within run ([#5619](https://github.com/reactivex/rxjs/issues/5619)) ([c63de0d](https://github.com/reactivex/rxjs/commit/c63de0d380a923987aab587720473fad1d205d71))

### Performance Improvements

- **SafeSubscriber:** avoid using `Object.create` ([40a9e77](https://github.com/reactivex/rxjs/commit/40a9e77fe3d75df9161ad0093f54750b70f57245))

### BREAKING CHANGES

- **ajax:**
  - `ajax` body serialization will now use default XHR behavior in all cases. If the body is a `Blob`, `ArrayBuffer`, any array buffer view (like a byte sequence, e.g. `Uint8Array`, etc), `FormData`, `URLSearchParams`, `string`, or `ReadableStream`, default handling is use. If the `body` is otherwise `typeof` `"object"`, then it will be converted to JSON via `JSON.stringify`, and the `Content-Type` header will be set to `application/json;charset=utf-8`. All other types will emit an error.
  - The `Content-Type` header passed to `ajax` configuration no longer has any effect on the serialization behavior of the AJAX request.
  - For TypeScript users, `AjaxRequest` is no longer the type that should be explicitly used to create an `ajax`. It is now `AjaxConfig`, although the two types are compatible, only `AjaxConfig` has `progressSubscriber` and `createXHR`.

* **zip:** `zip` operators will no longer iterate provided iterables "as needed", instead the iterables will be treated as push-streams just like they would be everywhere else in RxJS. This means that passing an endless iterable will result in the thread locking up, as it will endlessly try to read from that iterable. This puts us in-line with all other Rx implementations. To work around this, it is probably best to use `map` or some combination of `map` and `zip`. For example, `zip(source$, iterator)` could be `source$.pipe(map(value => [value, iterator.next().value]))`.

* **Subscription:** `add` no longer returns an unnecessary Subscription reference. This was done to prevent confusion caused by a legacy behavior. You can now add and remove functions and Subscriptions as teardowns to and from a `Subscription` using `add` and `remove` directly. Before this, `remove` only accepted subscriptions.

* **RxJS Error types** Tests that are written with naive expectations against errors may fail now that errors have a proper `stack` property. In some testing frameworks, a deep equality check on two error instances will check the values in `stack`, which could be different.

* **Undocumented Behaviors/APIs Removed**:

  - `unsubscribe` no longer available via the `this` context of observer functions. To reenable, set `config.useDeprecatedNextContext = true` on the rxjs `config` found at `import { config } from 'rxjs';`. Note that enabling this will result in a performance penalty for all consumer subscriptions.
  - Leaked implementation detail `_unsubscribeAndRecycle` of `Subscriber` has been removed. Just use new `Subscription` objects
  - Removed an undocumented behavior where passing a negative count argument to `retry` would result in an observable that repeats forever.
  - An undocumented behavior where passing a negative count argument to `repeat` would result in an observable that repeats forever.
  - The static `sortActions` method on `VirtualTimeScheduler` is no longer publicly exposed by our TS types.

* **throwError:** In an extreme corner case for usage, `throwError` is no longer able to emit a function as an error directly. If you need to push a function as an error, you will have to use the factory function to return the function like so: `throwError(() => functionToEmit)`, in other words `throwError(() => () => console.log('called later'))`.

# [7.0.0-beta.4](https://github.com/reactivex/rxjs/compare/7.0.0-beta.1...7.0.0-beta.4) (2020-08-02)

### Bug Fixes

- **ajax:** Partial observers passed to `progressSubscriber` will no longer error ([25d279f](https://github.com/reactivex/rxjs/commit/25d279f0b45d07f39bfb87b19bc7e2279df8b542))
- **ajax:** Unparsable responses will no longer prevent full AjaxError from being thrown ([605ee55](https://github.com/reactivex/rxjs/commit/605ee550e5efc266b5dc5d3a9756c7c3b3968a61))
- **animationFrames:** emit the timestamp from the rAF's callback ([#5438](https://github.com/reactivex/rxjs/issues/5438)) ([c980ae6](https://github.com/reactivex/rxjs/commit/c980ae65ee1b585e8ed66a366eb534ac3e50c205))
- Ensure unsubscriptions/teardowns on internal subscribers are idempotent ([#5465](https://github.com/reactivex/rxjs/issues/5465)) ([3e39749](https://github.com/reactivex/rxjs/commit/3e39749a58ca663c17f5f0354b0f27532fb6d319)), closes [#5464](https://github.com/reactivex/rxjs/issues/5464)
- **timeout:** defer error creation until timeout occurs ([#5497](https://github.com/reactivex/rxjs/issues/5497)) ([3be9840](https://github.com/reactivex/rxjs/commit/3be98404fafd5a8de758deb4e0d103a7b60aa31e)), closes [#5491](https://github.com/reactivex/rxjs/issues/5491)

### Code Refactoring

- **ajax:** Drop support for IE10 and lower ([0eaadd6](https://github.com/reactivex/rxjs/commit/0eaadd60c716050f5e3701d513a028a9cd49085a))
- **Observable:** Update property and method types ([#5572](https://github.com/reactivex/rxjs/issues/5572)) ([144b626](https://github.com/reactivex/rxjs/commit/144b626c3905640b4adeb2b97e722912eff1b264))

### Features

- **combineLatest:** support for observable dictionaries ([#5022](https://github.com/reactivex/rxjs/issues/5022)) ([#5363](https://github.com/reactivex/rxjs/issues/5363)) ([f5278aa](https://github.com/reactivex/rxjs/commit/f5278aa89ea164caf5cf10e77d7bd00eff26fc0f))
- **TestScheduler:** add an animate "run mode" helper ([#5607](https://github.com/reactivex/rxjs/issues/5607)) ([edd6731](https://github.com/reactivex/rxjs/commit/edd67313814bfc32e8a5129d8049e4d4678cd35d))
- **timeout:** One timeout to rule them all ([def1d34](https://github.com/reactivex/rxjs/commit/def1d346b43008bc413a3ac985e1611bbbf62003))

### BREAKING CHANGES

- **ajax:** In an extreme corner-case... If an error occurs, the responseType is `"json"`, we're in IE, and the `responseType` is not valid JSON, the `ajax` observable will no longer emit a syntax error, rather it will emit a full `AjaxError` with more details.
- **ajax:** Ajax implementation drops support for IE10 and lower. This puts us in-line with other implementations and helps clean up code in this area
- **Observable:** `lift` no longer exposed. It was _NEVER_ documented that end users of the library should be creating operators using `lift`. Lift has a [variety of issues](https://github.com/ReactiveX/rxjs/issues/5431) and was always an internal implementation detail of rxjs that might have been used by a few power users in the early days when it had the most value. The value of `lift`, originally, was that subclassed `Observable`s would compose through all operators that implemented lift. The reality is that feature is not widely known, used, or supported, and it was never documented as it was very experimental when it was first added. Until the end of v7, `lift` will remain on Observable. Standard JavaScript users will notice no difference. However, TypeScript users might see complaints about `lift` not being a member of observable. To workaround this issue there are two things you can do: 1. Rewrite your operators as [outlined in the documentation](https://rxjs.dev/guide/operators), such that they return `new Observable`. or 2. cast your observable as `any` and access `lift` that way. Method 1 is recommended if you do not want things to break when we move to version 8.

# [7.0.0-beta.3](https://github.com/reactivex/rxjs/compare/7.0.0-beta.1...7.0.0-beta.3) (2020-07-30)

### Bug Fixes

- **perf:** Ensure unsubscriptions/teardowns on internal subscribers are idempotent ([#5465](https://github.com/reactivex/rxjs/issues/5465)) ([3e39749](https://github.com/reactivex/rxjs/commit/3e39749a58ca663c17f5f0354b0f27532fb6d319)), closes [#5464](https://github.com/reactivex/rxjs/issues/5464)
- **timeout:** defer error creation until timeout occurs ([#5497](https://github.com/reactivex/rxjs/issues/5497)) ([3be9840](https://github.com/reactivex/rxjs/commit/3be98404fafd5a8de758deb4e0d103a7b60aa31e)), closes [#5491](https://github.com/reactivex/rxjs/issues/5491)

### Code Refactoring

- **perf:** Reduce memory pressure by no longer retaining outer values across the majority of operators. ([#5610](https://github.com/reactivex/rxjs/pull/5610)) ([bff1827](https://github.com/ReactiveX/rxjs/commit/bff18272dca23938a5f5b57cec6eb8d8be5bfddf))
- **Observable:** Update property and method types ([#5572](https://github.com/reactivex/rxjs/issues/5572)) ([144b626](https://github.com/reactivex/rxjs/commit/144b626c3905640b4adeb2b97e722912eff1b264))

### Features

- **combineLatest:** support for observable dictionaries ([#5022](https://github.com/reactivex/rxjs/issues/5022)) ([#5363](https://github.com/reactivex/rxjs/issues/5363)) ([f5278aa](https://github.com/reactivex/rxjs/commit/f5278aa89ea164caf5cf10e77d7bd00eff26fc0f))

### BREAKING CHANGES

- **Observable:** `lift` no longer exposed. It was _never_ documented that end users of the library should be creating operators using `lift`. Lift has a [variety of issues](https://github.com/ReactiveX/rxjs/issues/5431) and was always an internal implementation detail of rxjs that might have been used by a few power users i   n the early days when it had the most value. The value of `lift`, originally, was that subclassed `Observable`s would compose through all operators that implemented lift. The reality is that feature is not widely known, used, or supported, and it was never documented as it was very experimental when it was first added. Until the end of v7, `lift` will remain on Observable. Standard JavaScript users will notice no difference. However, TypeScript users might see complaints about `lift` not being a member of observable. To workaround this issue there are two things you can do: 1. Rewrite your operators as [outlined in the documentation](https://rxjs.dev/guide/operators), such that they return `new Observable`. or 2. cast your observable as `any` and access `lift` that way. It is recommended that operators be implemented in terms of functions that return `(source: Observable<T>) => new Observable<R>(...)`, per the documentation/guide.

# [7.0.0-beta.2](https://github.com/reactivex/rxjs/compare/7.0.0-beta.1...7.0.0-beta.2) (2020-07-03)

### Bug Fixes

- **dependencies:** Move accidental dependency on `typedoc` to dev-dependencies. ([#5566](https://github.com/reactivex/rxjs/issues/5566)) ([45702bf](https://github.com/ReactiveX/rxjs/commit/45702bf6cd1b4a150f47b2a1d273f1ee31ca2482))

# [7.0.0-beta.1](https://github.com/reactivex/rxjs/compare/7.0.0-beta.0...7.0.0-beta.1) (2020-07-02)

### Bug Fixes

- **pluck:** operator breaks with null/undefined inputs. ([#5524](https://github.com/reactivex/rxjs/issues/5524)) ([c5f6550](https://github.com/reactivex/rxjs/commit/c5f65508505cf1f90560e6be76425e09c455bec3))
- **shareReplay:** no longer misses synchronous values from source ([92452cc](https://github.com/reactivex/rxjs/commit/92452cc20021141aa0f047c7e5af569a413143e5))
- **interop:** chain interop/safe subscriber unsubscriptions correctly ([#5472](https://github.com/reactivex/rxjs/issues/5472)) ([98ad0eb](https://github.com/reactivex/rxjs/commit/98ad0eba6bc079851b44951f3963e8aae0abf861)), closes [#5469](https://github.com/reactivex/rxjs/issues/5469) [#5311](https://github.com/reactivex/rxjs/issues/5311) [#2675](https://github.com/reactivex/rxjs/issues/2675)
- **finalize:** chain subscriptions for interop with finalize ([#5239](https://github.com/reactivex/rxjs/issues/5239)) ([04ba662](https://github.com/reactivex/rxjs/commit/04ba6621fe9e09238e1796217d04107e52dd36d5)), closes [#5237](https://github.com/reactivex/rxjs/issues/5237) [#5237](https://github.com/reactivex/rxjs/issues/5237)
- **animationFrameScheduler:** don't execute rescheduled animation frame and asap actions in flush ([#5399](https://github.com/reactivex/rxjs/issues/5399)) ([33c9c8c](https://github.com/reactivex/rxjs/commit/33c9c8cf7e247d4ad4d7318bfd02e8e5bedb0f40)), closes [#4972](https://github.com/reactivex/rxjs/issues/4972) [#5397](https://github.com/reactivex/rxjs/issues/5397)
- **iterables:** errors thrown from iterables now properly propagated ([#5444](https://github.com/reactivex/rxjs/issues/5444)) ([75d4c2f](https://github.com/reactivex/rxjs/commit/75d4c2f33d2e2121b2a316849044ad17ab28dbaf))
- **finalize:** callback will be called after the source observable is torn down. ([0d7b7c1](https://github.com/reactivex/rxjs/commit/0d7b7c14e34eed43fb2ad1386281800fa3ae8aec)), closes [#5357](https://github.com/reactivex/rxjs/issues/5357)
- **Notification:** typing improvements ([#5478](https://github.com/reactivex/rxjs/issues/5478)) ([96868ac](https://github.com/reactivex/rxjs/commit/96868ac754c0147a9aa61182185f27224eb7f11a))
- **TestScheduler:** support empty subscription marbles ([#5502](https://github.com/reactivex/rxjs/issues/5502)) ([e65696e](https://github.com/reactivex/rxjs/commit/e65696e2f7f7338659a873f6653026b33b9011a9)), closes [#5499](https://github.com/reactivex/rxjs/issues/5499)
- **expand:** now works properly with asynchronous schedulers ([294b27e](https://github.com/reactivex/rxjs/commit/294b27eb6a96e8edee3af35e6aaaef50628376e4))
- **subscribeOn:** allow Infinity as valid delay ([#5500](https://github.com/reactivex/rxjs/issues/5500)) ([cd7d649](https://github.com/reactivex/rxjs/commit/cd7d64901e82fd7fb5e8407f1f30828906fac420))
- **Subject:** resolve issue where Subject constructor errantly allowed an argument ([#5476](https://github.com/reactivex/rxjs/issues/5476)) ([e1d35dc](https://github.com/reactivex/rxjs/commit/e1d35dc258edea0237ef49a31f7b34c058755969))
- **Subject:** no default generic ([e678e81](https://github.com/reactivex/rxjs/commit/e678e81ba80f5bcc27b0e956295ce2fc8dfe4576))
- **defer:** No longer allows `() => undefined` to observableFactory (#5449) ([1ae937a](https://github.com/reactivex/rxjs/commit/1ae937a8e594aef96b93313bb3c68ea910e6f528)), closes [#5449](https://github.com/reactivex/rxjs/issues/5449)
- **single:** Corrected behavior for `single(() => false)` on empty observables. (#5325) ([27931bc](https://github.com/reactivex/rxjs/commit/27931bcfd2aa864e277d3e72128c57e807b28bb0)), closes [#5325](https://github.com/reactivex/rxjs/issues/5325)
- **take/takeLast**: Properly assert number types at runtime (#5326) ([5efc474](https://github.com/reactivex/rxjs/commit/5efc474161c9196dbdf4803a9cc444a547067549)), closes [#5326](https://github.com/reactivex/rxjs/issues/5326)

### Features

- **Observable:** Remove async iteration ([#5492](https://github.com/reactivex/rxjs/issues/5492)) ([8f43e71](https://github.com/reactivex/rxjs/commit/8f43e71f5692119e57a7acc5817c146d0b288e8c))
- **groupBy:** Add typeguards support for groupBy ([#5441](https://github.com/reactivex/rxjs/issues/5441)) ([da382da](https://github.com/reactivex/rxjs/commit/da382da4cdcc6e7ab1ffc6a499f4f7f5ea7de130))
- **raceWith:** add raceWith, the renamed `race` operator ([#5303](https://github.com/reactivex/rxjs/issues/5303)) ([ca7f370](https://github.com/reactivex/rxjs/commit/ca7f370d8379f22526cfb17d40deff53e1358742))
- **fetch:** add selector ([#5306](https://github.com/reactivex/rxjs/issues/5306)) ([99b5af1](https://github.com/reactivex/rxjs/commit/99b5af1af5d169d55d454ff8e27d88105cee4b6f)), closes [#4744](https://github.com/reactivex/rxjs/issues/4744)
- **TimestampProvider:** Reduced scheduler footprint for default usage of shareReplay, timeInterval, and timestamp ([#4973](https://github.com/reactivex/rxjs/issues/4973)) ([b2e67e3](https://github.com/reactivex/rxjs/commit/b2e67e3139f0be1fb000ba42bb42c5ba60cc803a))

### BREAKING CHANGES

- `Notification.createNext(undefined)` will no longer return the exact same reference every time.
- Type signatures tightened up around `Notification` and `dematerialize`, may uncover issues with invalid types passed to those operators.
- Experimental support for `for await` as been removed. Use https://github.com/benlesh/rxjs-for-await instead.
- `defer` no longer allows factories to return `void` or `undefined`. All factories passed to defer must return a proper `ObservableInput`, such as `Observable`, `Promise`, et al. To get the same behavior as you may have relied on previously, `return EMPTY` or `return of()` from the factory.
- `single` operator will now throw for scenarios where values coming in are either not present, or do not match the provided predicate. Error types have thrown have also been updated, please check documentation for changes.
- `take` and will now throw runtime error for arguments that are negative or NaN, this includes non-TS calls like `take()`.

- `takeLast` now has runtime assertions that throw `TypeError`s for invalid arguments. Calling takeLast without arguments or with an argument that is `NaN` will throw a `TypeError`
- `ReplaySubject` no longer schedules emissions when a scheduler is provided. If you need that behavior,
  please compose in `observeOn` using `pipe`, for example: `new ReplaySubject(2, 3000).pipe(observeOn(asap))`

- `timestamp` operator accepts a `TimestampProvider`, which is any object with a `now` method
  that returns a number. This means pulling in less code for the use of the `timestamp` operator. This may cause
  issues with `TestScheduler` run mode. (Issue here: https://github.com/ReactiveX/rxjs/issues/5553)

# [7.0.0-beta.0](https://github.com/reactivex/rxjs/compare/7.0.0-alpha.1...7.0.0-beta.0) (2020-04-03)

### Bug Fixes

- **mergeMapTo:** remove redundant/unused generic ([#5299](https://github.com/reactivex/rxjs/issues/5299)) ([d67b7da](https://github.com/reactivex/rxjs/commit/d67b7dafbacb3aac8f4dd7f215fe2d2c602f0d36))
- **ajax:** AjaxTimeoutErrorImpl extends AjaxError ([#5226](https://github.com/reactivex/rxjs/issues/5226)) ([a8da8dc](https://github.com/reactivex/rxjs/commit/a8da8dcc899342d3bb6d2d913247d9e734095287))
- **delay:** emit complete notification as soon as possible ([63b8797](https://github.com/reactivex/rxjs/commit/63b8797fbeed09eb675ea64b0b83607cef1367a9)), closes [#4249](https://github.com/reactivex/rxjs/issues/4249)
- **endWith:** will properly type N arguments ([#5246](https://github.com/reactivex/rxjs/issues/5246)) ([81ee1f7](https://github.com/reactivex/rxjs/commit/81ee1f72408854f4017615fe7949edf5dd50533b))
- **fetch:** don't leak event listeners added to passed-in signals ([#5305](https://github.com/reactivex/rxjs/issues/5305)) ([d4d6c47](https://github.com/reactivex/rxjs/commit/d4d6c47d8abccc8cbe17e46192fc1eaa42d2d023))
- **TestScheduler:** Subclassing TestScheduler needs RunHelpers ([#5138](https://github.com/reactivex/rxjs/issues/5138)) ([927d5d9](https://github.com/reactivex/rxjs/commit/927d5d90ab5f12a79cd50f7290b4f8df1e83ecfc))
- **pipe:** Special handling for 0-arg case. ([#4936](https://github.com/reactivex/rxjs/issues/4936)) ([290fa51](https://github.com/reactivex/rxjs/commit/290fa51c44881f25f2fe4cf9885028396c7fd74c))
- **pluck:** fix pluck's catch-all signature for better type safety ([#5192](https://github.com/reactivex/rxjs/issues/5192)) ([e0c5b7c](https://github.com/reactivex/rxjs/commit/e0c5b7c790bb9d99fa8bee26c805b5e70c1e456b))
- **pluck:** param type now accepts number and symbol ([9697b69](https://github.com/reactivex/rxjs/commit/9697b695c23c3dcb614e6a70be63a94ffcd86ed9))
- **startWith:** accepts N arguments and returns correct type ([#5247](https://github.com/reactivex/rxjs/issues/5247)) ([150ed8b](https://github.com/reactivex/rxjs/commit/150ed8b75909b0e0bb9dc8928287ebdc47e19c51))
- **combineLatestWith:** and zipWith infer types from n-arguments ([#5257](https://github.com/reactivex/rxjs/issues/5257)) ([3e282a5](https://github.com/reactivex/rxjs/commit/3e282a58b1baf7aa03b17142f858bca09a542adf))
- **race:** support N args in static race and ensure observable returned ([#5286](https://github.com/reactivex/rxjs/issues/5286)) ([6d901cb](https://github.com/reactivex/rxjs/commit/6d901cbb0c0f2aa3fc5a02ef895cc9e9a7a09243))
- **toPromise:** correct toPromise return type ([#5072](https://github.com/reactivex/rxjs/issues/5072)) ([b1c3573](https://github.com/reactivex/rxjs/commit/b1c35738204b5b1a5d325a16e70cdbf25b523976))
- **fromFetch:** don't reassign closed-over parameter in fromFetch ([#5234](https://github.com/reactivex/rxjs/issues/5234)) ([37d2d99](https://github.com/reactivex/rxjs/commit/37d2d99762264ef5faabc0ce4f56d7aab51806dc)), closes [#5233](https://github.com/reactivex/rxjs/issues/5233) [#5233](https://github.com/reactivex/rxjs/issues/5233)

### Features

- add `lastValueFrom` and `firstValueFrom` methods ([#5295](https://github.com/reactivex/rxjs/issues/5295)) ([e69b765](https://github.com/reactivex/rxjs/commit/e69b76584d6872b3c55aa1bdf39c8984e9d9b00e))
- RxJS now supports first-class interop with AsyncIterables ([4fa9d01](https://github.com/reactivex/rxjs/commit/4fa9d016a83049d014d77b89c56301e42db16b4d))
- **combineLatestWith:** adds `combineLatestWith` - renamed legacy `combineLatest` operator ([#5251](https://github.com/reactivex/rxjs/issues/5251)) ([6d7b146](https://github.com/reactivex/rxjs/commit/6d7b1469110b405405549c9b6c311d2621738353))
- **retry:** add config to reset error count on successful emission ([#5280](https://github.com/reactivex/rxjs/issues/5280)) ([ab6e9fc](https://github.com/reactivex/rxjs/commit/ab6e9fc32c19c1f14f8f59459db75312e75b9351))
- **zipWith:** add `zipWith` which is just a rename of legacy `zip` operator ([#5249](https://github.com/reactivex/rxjs/issues/5249)) ([86b6a27](https://github.com/reactivex/rxjs/commit/86b6a272fd48c4712adba78963e05bb759ecf4f9))

### BREAKING CHANGES

- **startWith:** `startWith` will return incorrect types when called with more than 7 arguments and a scheduler. Passing scheduler to startWith is deprecated
- **toPromise:** toPromise return type now returns `T | undefined` in TypeScript, which is correct, but may break builds.

# [7.0.0-alpha.1](https://github.com/reactivex/rxjs/compare/7.0.0-alpha.0...7.0.0-alpha.1) (2019-12-27)

### Bug Fixes

- chain subscriptions from observables that belong to other instances of RxJS (e.g. in node_modules) ([#5059](https://github.com/reactivex/rxjs/issues/5059)) ([d7f7078](https://github.com/reactivex/rxjs/commit/d7f7078))
- clear subscription on `shareReplay` completion ([#5044](https://github.com/reactivex/rxjs/issues/5044)) ([35e600f](https://github.com/reactivex/rxjs/commit/35e600f)), closes [#5034](https://github.com/reactivex/rxjs/issues/5034)
- **closure:** Annotate next() for ReplaySubject ([#5088](https://github.com/reactivex/rxjs/issues/5088)) ([8687fbd](https://github.com/reactivex/rxjs/commit/8687fbd))
- **closure:** static prop frameTimeFactor being collapsed when compiled with closure. ([39872c9](https://github.com/reactivex/rxjs/commit/39872c9))
- **docs:** remove repetitive op3() in example ([#5043](https://github.com/reactivex/rxjs/issues/5043)) ([e17df33](https://github.com/reactivex/rxjs/commit/e17df33))
- **filter:** Fix overload order for filter to support inferring the generic type ([#5024](https://github.com/reactivex/rxjs/issues/5024)) ([8255365](https://github.com/reactivex/rxjs/commit/8255365))
- **fromFetch:** passing already aborted signal to init aborts fetch ([0e4849a](https://github.com/reactivex/rxjs/commit/0e4849a))

### Features

- **concatWith:** adds concatWith ([#4988](https://github.com/reactivex/rxjs/issues/4988)) ([dc89736](https://github.com/reactivex/rxjs/commit/dc89736))

# [7.0.0-alpha.0](https://github.com/reactivex/rxjs/compare/6.5.2...7.0.0-alpha.0) (2019-09-18)

### Bug Fixes

- missing package.json in rxjs/fetch ([#5001](https://github.com/reactivex/rxjs/issues/5001)) ([f4bee07](https://github.com/reactivex/rxjs/commit/f4bee07))
- **filter:** Resolve TS build failures for certain situations where Boolean is the predicate ([77c7dfd](https://github.com/reactivex/rxjs/commit/77c7dfd))
- **pluck:** key union type strictness ([#4585](https://github.com/reactivex/rxjs/issues/4585)) ([bd5ec2d](https://github.com/reactivex/rxjs/commit/bd5ec2d))
- **race:** ignore latter sources after first complete or error ([#4809](https://github.com/reactivex/rxjs/issues/4809)) ([f31c3df](https://github.com/reactivex/rxjs/commit/f31c3df)), closes [#4808](https://github.com/reactivex/rxjs/issues/4808)
- **scan/reduce:** Typings correct for mixed seed/value types ([#4858](https://github.com/reactivex/rxjs/issues/4858)) ([b89ebe5](https://github.com/reactivex/rxjs/commit/b89ebe5))
- **scheduled:** import from relative paths ([#4832](https://github.com/reactivex/rxjs/issues/4832)) ([1d37a87](https://github.com/reactivex/rxjs/commit/1d37a87))
- **TS:** Error impls now properly type `this` ([#4978](https://github.com/reactivex/rxjs/issues/4978)) ([7606dc7](https://github.com/reactivex/rxjs/commit/7606dc7))
- **TS:** fix type inference for defaultIfEmpty. ([#4833](https://github.com/reactivex/rxjs/issues/4833)) ([9b5ce2f](https://github.com/reactivex/rxjs/commit/9b5ce2f))
- **types:** add Boolean signature to filter ([#4961](https://github.com/reactivex/rxjs/issues/4961)) ([259853e](https://github.com/reactivex/rxjs/commit/259853e)), closes [#4959](https://github.com/reactivex/rxjs/issues/4959) [/github.com/ReactiveX/rxjs/issues/4959#issuecomment-520629091](https://github.com//github.com/ReactiveX/rxjs/issues/4959/issues/issuecomment-520629091)

### Features

- **animationFrames:** Adds an observable of animationFrames ([#5021](https://github.com/reactivex/rxjs/issues/5021)) ([6a4cd68](https://github.com/reactivex/rxjs/commit/6a4cd68))
- **concat:** can infer N types ([6c0cbc4](https://github.com/reactivex/rxjs/commit/6c0cbc4))
- **of:** Update of typings ([e8adbb5](https://github.com/reactivex/rxjs/commit/e8adbb5))
- **rxjs-compat:** removed for v7 ([#4839](https://github.com/reactivex/rxjs/issues/4839)) ([79b1b95](https://github.com/reactivex/rxjs/commit/79b1b95))
- **TestScheduler:** expose `frameTimeFactor` property ([#4977](https://github.com/reactivex/rxjs/issues/4977)) ([8c32ed0](https://github.com/reactivex/rxjs/commit/8c32ed0))
- **TS:** Update to TypeScript 3.5.3 ([741a136](https://github.com/reactivex/rxjs/commit/741a136))

### BREAKING CHANGES

- **concat:** Generic signature changed. Recommend not explicitly passing generics, just let inference do its job. If you must, cast with `as`.
- **of:** Generic signature changed, do not specify generics, allow them to be inferred or use `as`
- **of:** Use with more than 9 arguments, where the last argument is a `SchedulerLike` may result in the wrong type which includes the `SchedulerLike`, even though the run time implementation does not support that. Developers should be using `scheduled` instead
- **TS:** RxJS requires TS 3.5
- **rxjs-compat:** `rxjs/Rx` is no longer a valid import site.
- **rxjs-compat:** `rxjs-compat` is not published for v7 (yet)
- **race:** `race()` will no longer subscribe to subsequent observables if a provided source synchronously errors or completes. This means side effects that might have occurred during subscription in those rare cases will no longer occur.

## [6.5.3](https://github.com/reactivex/rxjs/compare/6.5.2...6.5.3) (2019-09-03)

### Bug Fixes

- **general:** Refactor modules so they don't show side effects in some tools ([#4769](https://github.com/reactivex/rxjs/issues/4769)) ([9829c5e0](https://github.com/reactivex/rxjs/commit/9829c5e0))
- **defer:** restrict allowed factory types ([#4835](https://github.com/reactivex/rxjs/issues/4835)) ([40a22096](https://github.com/reactivex/rxjs/commit/40a22096))

## [6.5.2](https://github.com/reactivex/rxjs/compare/6.5.0...6.5.2) (2019-05-10)

### Bug Fixes

- **endWith:** wrap args - they are not observables - in of before concatenating ([#4735](https://github.com/reactivex/rxjs/issues/4735)) ([986be2f](https://github.com/reactivex/rxjs/commit/986be2f))
- **forkJoin:** test for object literal ([#4741](https://github.com/reactivex/rxjs/issues/4741)) ([c11e1b3](https://github.com/reactivex/rxjs/commit/c11e1b3)), closes [#4737](https://github.com/reactivex/rxjs/issues/4737) [#4737](https://github.com/reactivex/rxjs/issues/4737)
- **Notification:** replace const enum ([#4556](https://github.com/reactivex/rxjs/issues/4556)) ([e460eec](https://github.com/reactivex/rxjs/commit/e460eec)), closes [#4538](https://github.com/reactivex/rxjs/issues/4538)
- **of:** remove deprecation comment to prevent false positive warning ([#4724](https://github.com/reactivex/rxjs/issues/4724)) ([da69c16](https://github.com/reactivex/rxjs/commit/da69c16))
- **pairwise:** make it recursion-proof ([#4743](https://github.com/reactivex/rxjs/issues/4743)) ([21ab261](https://github.com/reactivex/rxjs/commit/21ab261))
- **scan:** fixed declarations to properly support different return types ([#4598](https://github.com/reactivex/rxjs/issues/4598)) ([126d2b6](https://github.com/reactivex/rxjs/commit/126d2b6))
- **Subscription:** Return Empty when teardown === null ([#4575](https://github.com/reactivex/rxjs/issues/4575)) ([ffc4e68](https://github.com/reactivex/rxjs/commit/ffc4e68))
- **throttleTime:** emit single value with trailing enabled ([#4564](https://github.com/reactivex/rxjs/issues/4564)) ([fd690a6](https://github.com/reactivex/rxjs/commit/fd690a6)), closes [#2859](https://github.com/reactivex/rxjs/issues/2859) [#4491](https://github.com/reactivex/rxjs/issues/4491)
- **umd:** export fetch namespace ([#4738](https://github.com/reactivex/rxjs/issues/4738)) ([7926122](https://github.com/reactivex/rxjs/commit/7926122))
- **fromFetch:** don't abort if fetch resolves ([#4742](https://github.com/reactivex/rxjs/issues/4742) ([ed8d771](https://github.com/reactivex/rxjs/commit/ed8d771))

## [6.5.1](https://github.com/reactivex/rxjs/compare/6.5.0...6.5.1) (2019-04-23)

### Bug Fixes

- **Notification:** replace const enum ([#4556](https://github.com/reactivex/rxjs/issues/4556)) ([e460eec](https://github.com/reactivex/rxjs/commit/e460eec)), closes [#4538](https://github.com/reactivex/rxjs/issues/4538)
- **throttleTime:** emit single value with trailing enabled ([#4564](https://github.com/reactivex/rxjs/issues/4564)) ([fd690a6](https://github.com/reactivex/rxjs/commit/fd690a6)), closes [#2859](https://github.com/reactivex/rxjs/issues/2859) [#4491](https://github.com/reactivex/rxjs/issues/4491)

# [6.5.0](https://github.com/reactivex/rxjs/compare/6.4.0...6.5.0) (2019-04-23)

### Bug Fixes

- **docs-app:** remove stopWordFilter from lunr pipeline ([#4536](https://github.com/reactivex/rxjs/issues/4536)) ([9eaebd4](https://github.com/reactivex/rxjs/commit/9eaebd4))
- **dtslint:** disable tests that break in TS@next ([#4705](https://github.com/reactivex/rxjs/issues/4705)) ([ecc73d2](https://github.com/reactivex/rxjs/commit/ecc73d2))
- **index:** export NotificationKind ([#4514](https://github.com/reactivex/rxjs/issues/4514)) ([7125355](https://github.com/reactivex/rxjs/commit/7125355)), closes [#4513](https://github.com/reactivex/rxjs/issues/4513)
- **race:** better typings ([#4643](https://github.com/reactivex/rxjs/issues/4643)) ([fb9bc48](https://github.com/reactivex/rxjs/commit/fb9bc48)), closes [#4390](https://github.com/reactivex/rxjs/issues/4390) [#4642](https://github.com/reactivex/rxjs/issues/4642)
- **throwIfEmpty:** ensure result is retry-able ([c4f44b9](https://github.com/reactivex/rxjs/commit/c4f44b9))
- **types:** Fixed signature for onErrorResumeNext ([#4603](https://github.com/reactivex/rxjs/issues/4603)) ([4dd0be0](https://github.com/reactivex/rxjs/commit/4dd0be0))

### Features

- **combineLatest:** deprecated rest argument and scheduler signatures ([#4641](https://github.com/reactivex/rxjs/issues/4641)) ([6661c79](https://github.com/reactivex/rxjs/commit/6661c79)), closes [#4640](https://github.com/reactivex/rxjs/issues/4640)
- **fromFetch:** We now export a `fromFetch` static observable creation method from `rxjs/fetch`. Mirrors native `fetch` only it's lazy and cancellable via `Observable` interface. ([#4702](https://github.com/reactivex/rxjs/issues/4702)) ([5a1ef86](https://github.com/reactivex/rxjs/commit/5a1ef86))
- **forkJoin:** accepts a dictionary of sources ([#4640](https://github.com/reactivex/rxjs/issues/4640)) ([b5a2ac9](https://github.com/reactivex/rxjs/commit/b5a2ac9))
- **partition:** new `partition` observable creation function. Old `partition` operator is deprecated ([#4419](https://github.com/reactivex/rxjs/issues/4419)) ([#4685](https://github.com/reactivex/rxjs/issues/4685)) ([d5d6980](https://github.com/reactivex/rxjs/commit/d5d6980))
- **scheduled:** Add `scheduled` creation function to use to create scheduled observable of values. Deprecate scheduled versions of `from`, `range`, et al. ([#4595](https://github.com/reactivex/rxjs/issues/4595)) ([f57e1fc](https://github.com/reactivex/rxjs/commit/f57e1fc))

### Performance Improvements

- **Subscription:** improve parent management ([#4526](https://github.com/reactivex/rxjs/issues/4526)) ([06f1a25](https://github.com/reactivex/rxjs/commit/06f1a25))

# [6.4.0](https://github.com/reactivex/rxjs/compare/6.3.3...6.4.0) (2019-01-30)

### Bug Fixes

- **ajax:** Fix case-insensitive headers in HTTP request ([#4453](https://github.com/reactivex/rxjs/issues/4453)) ([673bf47](https://github.com/reactivex/rxjs/commit/673bf47))
- **bundle:** closure to not rewrite polyfills for minification ([#4487](https://github.com/reactivex/rxjs/issues/4487)) ([a1fedb9](https://github.com/reactivex/rxjs/commit/a1fedb9))
- **bundle:** don't export `operators` twice ([#4310](https://github.com/reactivex/rxjs/issues/4310)) ([2399f6e](https://github.com/reactivex/rxjs/commit/2399f6e))
- **combineLatest:** improve typings for combineLatest ([#4470](https://github.com/reactivex/rxjs/issues/4470)) ([40c3d9f](https://github.com/reactivex/rxjs/commit/40c3d9f))
- **compat:** remove internal from import locations ([#4498](https://github.com/reactivex/rxjs/issues/4498)) ([a6c0017](https://github.com/reactivex/rxjs/commit/a6c0017)), closes [#4070](https://github.com/reactivex/rxjs/issues/4070)
- **endWith:** ability to endWith different types ([#4183](https://github.com/reactivex/rxjs/issues/4183)) ([#4185](https://github.com/reactivex/rxjs/issues/4185)) ([83533d1](https://github.com/reactivex/rxjs/commit/83533d1))
- **fromEventPattern:** improve typings for fromEventPattern ([#4496](https://github.com/reactivex/rxjs/issues/4496)) ([037f53d](https://github.com/reactivex/rxjs/commit/037f53d))
- **Observable:** Fix Observable.subscribe to add operator TeardownLogic to returned Subscription. ([#4434](https://github.com/reactivex/rxjs/issues/4434)) ([f28955f](https://github.com/reactivex/rxjs/commit/f28955f))
- **subscribe:** Deprecate null starting parameter signatures for subscribe ([#4202](https://github.com/reactivex/rxjs/issues/4202)) ([c85ddf6](https://github.com/reactivex/rxjs/commit/c85ddf6))
- **combineLatest:** support passing union types ([ffda319](https://github.com/reactivex/rxjs/commit/ffda319))
- **from:** support passing union types ([eb1d596](https://github.com/reactivex/rxjs/commit/eb1d596))
- **withLatestFrom:** support passing union types ([1e19a24](https://github.com/reactivex/rxjs/commit/1e19a24))
- **zip:** support passing union types ([0d87f52](https://github.com/reactivex/rxjs/commit/0d87f52))
- **multicast:** support returning union types from projection ([e9e9041](https://github.com/reactivex/rxjs/commit/e9e9041))
- **exhaustMap:** support returning union types from projection ([ff1f5dc](https://github.com/reactivex/rxjs/commit/ff1f5dc))
- **merge:** support union type inference for merge operators ([c2ac39c](https://github.com/reactivex/rxjs/commit/c2ac39c))
- **catchError:** support union type returns ([8350622](https://github.com/reactivex/rxjs/commit/8350622))
- **switchMap:** support union type returns ([32d35fd](https://github.com/reactivex/rxjs/commit/32d35fd))
- **defer:** support union types passed ([5aea50e](https://github.com/reactivex/rxjs/commit/5aea50e))
- **race:** Update typings to support proper return types ([#4465](https://github.com/reactivex/rxjs/issues/4465)) ([0042846](https://github.com/reactivex/rxjs/commit/0042846))
- **VirtualTimeScheduler:** rework flush so it won't lose actions ([#4433](https://github.com/reactivex/rxjs/issues/4433)) ([d068bc9](https://github.com/reactivex/rxjs/commit/d068bc9))
- **WebSocketSubject:** fix subject failing to close socket ([#4446](https://github.com/reactivex/rxjs/issues/4446)) ([dcfa52b](https://github.com/reactivex/rxjs/commit/dcfa52b))

### Features

- **shareReplay:** Add configuration object for named arguments, and add argument to support unsubscribing from source observable by `refCount` when all resulting subscriptions have unsubscribed. The default behavior is to leave the source subscription running.
- **mergeScan:** Add index to the accumulator function ([#4458](https://github.com/reactivex/rxjs/issues/4458)) ([f5e143d](https://github.com/reactivex/rxjs/commit/f5e143d)), closes [#4441](https://github.com/reactivex/rxjs/issues/4441)
- **range:** accept one argument ([#4360](https://github.com/reactivex/rxjs/issues/4360)) ([a388578](https://github.com/reactivex/rxjs/commit/a388578))
- **takeWhile:** add an `inclusive` option to the operator which causes to emit final value ([#4115](https://github.com/reactivex/rxjs/issues/4115)) ([6e7f407](https://github.com/reactivex/rxjs/commit/6e7f407))

### Performance Improvements

- **internal:** optimize Subscription#add() for the common case ([#4489](https://github.com/reactivex/rxjs/issues/4489)) ([bdd201c](https://github.com/reactivex/rxjs/commit/bdd201c))
- **internal:** use strict equality for isObject() ([#4493](https://github.com/reactivex/rxjs/issues/4493)) ([fc84a00](https://github.com/reactivex/rxjs/commit/fc84a00))
- **Subscription:** use `instanceof` to avoid megamorphic LoadIC ([#4499](https://github.com/reactivex/rxjs/issues/4499)) ([065b4e3](https://github.com/reactivex/rxjs/commit/065b4e3))

<a name="6.3.3"></a>

## [6.3.3](https://github.com/reactivex/rxjs/compare/6.3.2...6.3.3) (2018-09-25)

### Bug Fixes

- **pipe:** align static pipe to Observable pipe rest parameters overl… ([#4112](https://github.com/reactivex/rxjs/issues/4112)) ([8c607e9](https://github.com/reactivex/rxjs/commit/8c607e9)), closes [#4109](https://github.com/reactivex/rxjs/issues/4109) [#4109](https://github.com/reactivex/rxjs/issues/4109)
- **RxJS:** each instance of RxJS now has a unique Subscriber symbol ([0972c56](https://github.com/reactivex/rxjs/commit/0972c56))
- **subscribe:** report errors that occur in subscribe after the initial error ([#4089](https://github.com/reactivex/rxjs/issues/4089)) ([9b4b2bc](https://github.com/reactivex/rxjs/commit/9b4b2bc)), closes [#3803](https://github.com/reactivex/rxjs/issues/3803)
- **Subscriber:** Can no longer subscribe to itself in a circular manner ([#4106](https://github.com/reactivex/rxjs/issues/4106)) ([e623ec6](https://github.com/reactivex/rxjs/commit/e623ec6)), closes [#4095](https://github.com/reactivex/rxjs/issues/4095)
- **Subscriber:** use only local Subscriber instances ([50ee0a7](https://github.com/reactivex/rxjs/commit/50ee0a7))
- **TypeScript:** ensure RxJS builds with TS@next as well ([f03e790](https://github.com/reactivex/rxjs/commit/f03e790))

<a name="6.3.2"></a>

## [6.3.2](https://github.com/reactivex/rxjs/compare/6.3.1...6.3.2) (2018-09-04)

### Bug Fixes

- **node:** will no longer error mixing RxJS 6.3 and 6.2 ([#4078](https://github.com/reactivex/rxjs/issues/4078)) ([69d9ccf](https://github.com/reactivex/rxjs/commit/69d9ccf)), closes [#4077](https://github.com/reactivex/rxjs/issues/4077)

<a name="6.3.1"></a>

## [6.3.1](https://github.com/reactivex/rxjs/compare/6.3.0...6.3.1) (2018-08-31)

### Bug Fixes

- **mergeMap:** fix nested mergeMaps ([#4072](https://github.com/reactivex/rxjs/issues/4072)) ([0ab701b](https://github.com/reactivex/rxjs/commit/0ab701b)), closes [#4071](https://github.com/reactivex/rxjs/issues/4071)

<a name="6.3.0"></a>

# [6.3.0](https://github.com/reactivex/rxjs/compare/6.2.2...6.3.0) (2018-08-30)

### Bug Fixes

- **find:** unsubscribe from source when found ([#3968](https://github.com/reactivex/rxjs/issues/3968)) ([fd01f7b](https://github.com/reactivex/rxjs/commit/fd01f7b))
- convert [@internal](https://github.com/internal) comment to JSDoc ([#3932](https://github.com/reactivex/rxjs/issues/3932)) ([f8a9d6e](https://github.com/reactivex/rxjs/commit/f8a9d6e))
- **AjaxObservable:** notify with error if fails to parse json response ([#3139](https://github.com/reactivex/rxjs/issues/3139)) ([d8231e2](https://github.com/reactivex/rxjs/commit/d8231e2)), closes [#3138](https://github.com/reactivex/rxjs/issues/3138)
- **catchError:** stop listening to a synchronous inner-observable when unsubscribed ([456ef33](https://github.com/reactivex/rxjs/commit/456ef33))
- **distinctUntilKeyChanged:** improved key typing with keyof T ([#3988](https://github.com/reactivex/rxjs/issues/3988)) ([4ec4ff1](https://github.com/reactivex/rxjs/commit/4ec4ff1))
- **exhaustMap:** stop listening to a synchronous inner-observable when unsubscribed ([ee1a339](https://github.com/reactivex/rxjs/commit/ee1a339))
- **find:** add undefined to return type ([#3970](https://github.com/reactivex/rxjs/issues/3970)) ([5a6c90f](https://github.com/reactivex/rxjs/commit/5a6c90f)), closes [#3969](https://github.com/reactivex/rxjs/issues/3969)
- **IE10:** Remove dependency on Object.setPrototypeOf ([#3967](https://github.com/reactivex/rxjs/issues/3967)) ([5c52a73](https://github.com/reactivex/rxjs/commit/5c52a73)), closes [#3966](https://github.com/reactivex/rxjs/issues/3966)
- **mergeAll:** add source subscription to composite before actually subscribing ([#2479](https://github.com/reactivex/rxjs/issues/2479)) ([40852ff](https://github.com/reactivex/rxjs/commit/40852ff)), closes [#2476](https://github.com/reactivex/rxjs/issues/2476)
- **mergeScan:** stop listening to a synchronous inner-observable when unsubscribed ([c4002f3](https://github.com/reactivex/rxjs/commit/c4002f3))
- **Observable:** forEach will no longer next values after an error ([b4bad1f](https://github.com/reactivex/rxjs/commit/b4bad1f))
- **Observable:** use more granular Observable exports in compat mode ([#3974](https://github.com/reactivex/rxjs/issues/3974)) ([3f75564](https://github.com/reactivex/rxjs/commit/3f75564))
- **onErrorResumeNext:** stop listening to a synchronous inner-observable when unsubscribed ([1d14277](https://github.com/reactivex/rxjs/commit/1d14277))
- **pipe:** replace rest parameters overload ([#3945](https://github.com/reactivex/rxjs/issues/3945)) ([872b0ec](https://github.com/reactivex/rxjs/commit/872b0ec)), closes [#3841](https://github.com/reactivex/rxjs/issues/3841)
- **skipUntil:** stop listening to a synchronous notifier after its first nexted value ([1c257db](https://github.com/reactivex/rxjs/commit/1c257db))
- **startWith:** allow empty type signature and passing a different type ([b7866a0](https://github.com/reactivex/rxjs/commit/b7866a0))
- **subscribable:** make subscribe() signature match Observable ([#4050](https://github.com/reactivex/rxjs/issues/4050)) ([865d8d7](https://github.com/reactivex/rxjs/commit/865d8d7)), closes [#3891](https://github.com/reactivex/rxjs/issues/3891)
- **subscriber:** unsubscribe parents on error/complete ([ad8131b](https://github.com/reactivex/rxjs/commit/ad8131b))
- **switchMap:** stop listening to a synchronous inner-observable when unsubscribed ([260d52a](https://github.com/reactivex/rxjs/commit/260d52a))
- **takeUntil:** takeUntil should subscribe to the source if notifier sync completes without emitting ([#4039](https://github.com/reactivex/rxjs/issues/4039)) ([21fd0b4](https://github.com/reactivex/rxjs/commit/21fd0b4)), closes [#3504](https://github.com/reactivex/rxjs/issues/3504)
- **testscheduler:** type arguments to Observable creation functions ([#3928](https://github.com/reactivex/rxjs/issues/3928)) ([0e30ef1](https://github.com/reactivex/rxjs/commit/0e30ef1))

### Features

- **delayWhen:** add index to the selector function ([#2473](https://github.com/reactivex/rxjs/issues/2473)) ([0979d31](https://github.com/reactivex/rxjs/commit/0979d31))
- **forEach:** deprecating passing promise constructor ([5178ab9](https://github.com/reactivex/rxjs/commit/5178ab9))
- **TestScheduler:** Add subscription schedule to expectObservable ([#3997](https://github.com/reactivex/rxjs/issues/3997)) ([0d20255](https://github.com/reactivex/rxjs/commit/0d20255))

<a name="6.2.2"></a>

## [6.2.2](https://github.com/reactivex/rxjs/compare/6.2.1...6.2.2) (2018-07-13)

### Bug Fixes

- **first:** improved type guards for TypeScript ([3e12f7a](https://github.com/reactivex/rxjs/commit/3e12f7a))
- **last:** improved type guards for TypeScript ([3e12f7a](https://github.com/reactivex/rxjs/commit/3e12f7a))

<a name="6.2.1"></a>

## [6.2.1](https://github.com/reactivex/rxjs/compare/6.2.0...6.2.1) (2018-06-12)

### Bug Fixes

- **ci:** do not trigger postbuild script on PR ([f82c085](https://github.com/reactivex/rxjs/commit/f82c085))
- **delayWhen:** Emit source value if duration selector completes synchronously ([#3664](https://github.com/reactivex/rxjs/issues/3664)) ([2c43af7](https://github.com/reactivex/rxjs/commit/2c43af7)), closes [#3663](https://github.com/reactivex/rxjs/issues/3663)
- **docs:** fix broken github links ([#3802](https://github.com/reactivex/rxjs/issues/3802)) ([9f9bf9b](https://github.com/reactivex/rxjs/commit/9f9bf9b))
- **docs:** fix code examples ([#3784](https://github.com/reactivex/rxjs/issues/3784)) ([a95441b](https://github.com/reactivex/rxjs/commit/a95441b))
- **from:** Objects implementing Symbol.observable take precedence over other types ([80ceea0](https://github.com/reactivex/rxjs/commit/80ceea0))
- **fromEvent:** Support React Native and node-compatible event sources. ([#3821](https://github.com/reactivex/rxjs/issues/3821)) ([1969f18](https://github.com/reactivex/rxjs/commit/1969f18))
- **Observable.prototype.pipe:** TS typings now more correct for >8 parameters ([#3789](https://github.com/reactivex/rxjs/issues/3789)) ([ad010ea](https://github.com/reactivex/rxjs/commit/ad010ea))
- **subscribe:** ignore syncError when deprecated ([#3749](https://github.com/reactivex/rxjs/issues/3749)) ([f94560c](https://github.com/reactivex/rxjs/commit/f94560c))
- **Symbol.observable:** make observable declaration readonly ([#3697](https://github.com/reactivex/rxjs/issues/3697)) ([#3773](https://github.com/reactivex/rxjs/issues/3773)) ([e1c203f](https://github.com/reactivex/rxjs/commit/e1c203f))
- **TypeScript:** resolved typings issue for TS 3.0 ([bf2cdeb](https://github.com/reactivex/rxjs/commit/bf2cdeb))
- **typings:** allow bufferCreationInterval null for bufferTime ([#3734](https://github.com/reactivex/rxjs/issues/3734)) ([0bda9cd](https://github.com/reactivex/rxjs/commit/0bda9cd)), closes [#3728](https://github.com/reactivex/rxjs/issues/3728)

### Performance Improvements

- remove comments from js-files ([#3760](https://github.com/reactivex/rxjs/issues/3760)) ([bb2c334](https://github.com/reactivex/rxjs/commit/bb2c334))

<a name="6.2.0"></a>

# [6.2.0](https://github.com/ReactiveX/RxJS/compare/6.1.0...6.2.0) (2018-05-22)

### Bug Fixes

- **ajax:** Handle timeouts as errors ([#3653](https://github.com/ReactiveX/RxJS/issues/3653)) ([e4128ea](https://github.com/ReactiveX/RxJS/commit/e4128ea))
- **ajax:** RxJS v6 TimeoutError is missing name property ([576d943](https://github.com/ReactiveX/RxJS/commit/576d943))
- **isObservable:** Fix throwing error when testing isObservable(null) ([#3688](https://github.com/ReactiveX/RxJS/issues/3688)) ([c9acc61](https://github.com/ReactiveX/RxJS/commit/c9acc61))
- **range:** Range should be same for every subscriber ([#3707](https://github.com/ReactiveX/RxJS/issues/3707)) ([9642133](https://github.com/ReactiveX/RxJS/commit/9642133))
- **skipUntil:** fix skipUntil when innerSubscription is null ([#3686](https://github.com/ReactiveX/RxJS/issues/3686)) ([4226432](https://github.com/ReactiveX/RxJS/commit/4226432))
- **TestScheduler:** restore run changes upon error ([27cb9b6](https://github.com/ReactiveX/RxJS/commit/27cb9b6))
- **TimeoutError:** Add name to TimeoutError ([44042d0](https://github.com/ReactiveX/RxJS/commit/44042d0))
- **WebSocketSubject:** Check to see if WebSocket exists in global scope ([#3694](https://github.com/ReactiveX/RxJS/issues/3694)) ([2db0788](https://github.com/ReactiveX/RxJS/commit/2db0788))

### Features

- **endWith:** add new operator endWith ([#3679](https://github.com/ReactiveX/RxJS/issues/3679)) ([537fe7d](https://github.com/ReactiveX/RxJS/commit/537fe7d))

<a name="6.1.0"></a>

# [6.1.0](https://github.com/ReactiveX/RxJS/compare/6.0.0...6.1.0) (2018-05-03)

### Bug Fixes

- **audit:** will not crash if duration is synchronous ([#3608](https://github.com/ReactiveX/RxJS/issues/3608)) ([76b7e27](https://github.com/ReactiveX/RxJS/commit/76b7e27)), closes [#2743](https://github.com/ReactiveX/RxJS/issues/2743)
- **delay:** fix memory leak ([#3605](https://github.com/ReactiveX/RxJS/issues/3605)) ([96f05b0](https://github.com/ReactiveX/RxJS/commit/96f05b0))

### Features

- **isObservable:** a new method for checking to see if an object is an RxJS Observable ([edb33e5](https://github.com/ReactiveX/RxJS/commit/edb33e5))

<a name="6.0.0"></a>

# [6.0.0](https://github.com/ReactiveX/RxJS/compare/6.0.0-uncanny-rc.7...v6.0.0) (2018-04-24)

### Bug Fixes

- **websocket:** no longer throws errors in operators applied to it ([#3577](https://github.com/ReactiveX/RxJS/issues/3577)) ([cb38ddf](https://github.com/ReactiveX/RxJS/commit/cb38ddf))

### Code Refactoring

- **webSocket:** rename back to webSocket ala 5.0 ([#3590](https://github.com/ReactiveX/RxJS/issues/3590)) ([d5658fe](https://github.com/ReactiveX/RxJS/commit/d5658fe))

### Features

- **testing:** Add testScheduler.run() helper ([2d5b3b2](https://github.com/ReactiveX/RxJS/commit/2d5b3b2))
- **testing:** testScheduler.run() supports time progression syntax ([9322b7d](https://github.com/ReactiveX/RxJS/commit/9322b7d))

### BREAKING CHANGES

- **webSocket:** UNBREAKING websocket to be named `webSocket` again, just like it was in 5.0. Now you should import from `rxjs/webSocket`

<a name="6.0.0-uncanny-rc.7"></a>

# [6.0.0-uncanny-rc.7](https://github.com/ReactiveX/RxJS/compare/6.0.0-ucandoit-rc.6...v6.0.0-uncanny-rc.7) (2018-04-13)

### Bug Fixes

- **interop:** functions with `[Symbol.observable]` on them will now be accepted in operators like `mergeMap`, `from`, etc ([#3562](https://github.com/ReactiveX/RxJS/issues/3562)) ([c9570df](https://github.com/ReactiveX/RxJS/commit/c9570df))
- **migrations:** change the version the migration applies to ([#3564](https://github.com/ReactiveX/RxJS/issues/3564)) ([9217a03](https://github.com/ReactiveX/RxJS/commit/9217a03))
- **rxjs:** no longer requires `dom` lib ([#3566](https://github.com/ReactiveX/RxJS/issues/3566)) ([8b33ee2](https://github.com/ReactiveX/RxJS/commit/8b33ee2))
- **throttleTime:** emit throttled values when complete if trailing=true ([#3559](https://github.com/ReactiveX/RxJS/issues/3559)) ([3e846f2](https://github.com/ReactiveX/RxJS/commit/3e846f2)), closes [#3351](https://github.com/ReactiveX/RxJS/issues/3351)
- **websocket:** export WebSocketSubject, WebSocketSubjectConfig from rxjs/websocket ([#3557](https://github.com/ReactiveX/RxJS/issues/3557)) ([c365405](https://github.com/ReactiveX/RxJS/commit/c365405))

<a name="6.0.0-ucandoit-rc.6"></a>

# [6.0.0-ucandoit-rc.6](https://github.com/ReactiveX/RxJS/compare/6.0.0-uber-rc.5...v6.0.0-ucandoit-rc.6) (2018-04-13)

### Bug Fixes

- **migrations:** make sure collection.json is present ([63e10a8](https://github.com/ReactiveX/RxJS/commit/63e10a8))

<a name="6.0.0-uber-rc.5"></a>

# [6.0.0-uber-rc.5](https://github.com/ReactiveX/RxJS/compare/6.0.0-turbo-rc.4...6.0.0-uber-rc.5) (2018-04-13)

### Bug Fixes

- **migrations:** deploy compiled JS rather than just the TS files. ([9aed72f](https://github.com/ReactiveX/RxJS/commit/9aed72f))

<a name="6.0.0-turbo-rc.4"></a>

# [6.0.0-turbo-rc.4](https://github.com/ReactiveX/RxJS/compare/6.0.0-terrific-rc.3...6.0.0-turbo-rc.4) (2018-04-12)

### Bug Fixes

- **groupBy:** reexporting the GroupedObservable type ([#3556](https://github.com/ReactiveX/RxJS/issues/3556)) ([12d4933](https://github.com/ReactiveX/RxJS/commit/12d4933)), closes [#3551](https://github.com/ReactiveX/RxJS/issues/3551)
- **migrations:** build now properly copies migration into package ([#3555](https://github.com/ReactiveX/RxJS/issues/3555)) ([329a145](https://github.com/ReactiveX/RxJS/commit/329a145))

<a name="6.0.0-terrific-rc.3"></a>

# [6.0.0-terrific-rc.3](https://github.com/ReactiveX/RxJS/compare/6.0.0-tenacious-rc.2...v6.0.0-terrific-rc.3) (2018-04-11)

### Features

- **schematics:** add migration schematics for schematics users ([20a2f07](https://github.com/ReactiveX/RxJS/commit/20a2f07))

<a name="6.0.0-tenacious-rc.2"></a>

# [6.0.0-tenacious-rc.2](https://github.com/ReactiveX/RxJS/compare/6.0.0-tactical-rc.1...v6.0.0-tenacious-rc.2) (2018-04-11)

### Bug Fixes

- **compat:** fix first & last operators so undefined arguments won't create empty values ([#3542](https://github.com/ReactiveX/RxJS/issues/3542)) ([a327db2](https://github.com/ReactiveX/RxJS/commit/a327db2))
- **node/TS:** eliminate incompatible types to protected properties ([#3544](https://github.com/ReactiveX/RxJS/issues/3544)) ([21dd3bd](https://github.com/ReactiveX/RxJS/commit/21dd3bd))

### BREAKING CHANGES

- **NodeJS** Dropping support for non-LTS versions of Node.

<a name="6.0.0-tactical-rc.1"></a>

# [6.0.0-tactical-rc.1](https://github.com/ReactiveX/RxJS/compare/6.0.0-rc.0...6.0.0-tactical-rc.1) (2018-04-07)

Why "tactical"? Because I _TOTALLY MEANT_ to ruin the release names by publishing an amazingly funny April Fool's joke about smooshMap. So this was "tactical". Super tactical. So very tactical.

### Bug Fixes

- **closure-compiler:** adds nocollapse to static members ([#3519](https://github.com/ReactiveX/RxJS/issues/3519)) ([8758a5d](https://github.com/ReactiveX/RxJS/commit/8758a5d))
- **closure-compiler:** remove internal flag from \_isScalar ([#3520](https://github.com/ReactiveX/RxJS/issues/3520)) ([b3a657d](https://github.com/ReactiveX/RxJS/commit/b3a657d))
- **closure-compiler:** remove top level throws ([#3518](https://github.com/ReactiveX/RxJS/issues/3518)) ([b069473](https://github.com/ReactiveX/RxJS/commit/b069473))
- **closure-compiler:** removes bad \[@params](https://github.com/params) comments that caused issues ([#3521](https://github.com/ReactiveX/RxJS/issues/3521)) ([09c874c](https://github.com/ReactiveX/RxJS/commit/09c874c))
- **compat:** deprecate Observable.if/throw ([#3527](https://github.com/ReactiveX/RxJS/issues/3527)) ([3116275](https://github.com/ReactiveX/RxJS/commit/3116275))
- **compat:** export TeardownLogic ([#3532](https://github.com/ReactiveX/RxJS/issues/3532)) ([0c76e64](https://github.com/ReactiveX/RxJS/commit/0c76e64)), closes [#3531](https://github.com/ReactiveX/RxJS/issues/3531)
- **compat:** remove observable/scalar deep import as it wasn't previously available ([4566001](https://github.com/ReactiveX/RxJS/commit/4566001))
- **Scheduler:** export but deprecate ([#3522](https://github.com/ReactiveX/RxJS/issues/3522)) ([a3e1fb8](https://github.com/ReactiveX/RxJS/commit/a3e1fb8))
- **skipUntil:** properly manages notifier subscription ([889f84a](https://github.com/ReactiveX/RxJS/commit/889f84a)), closes [#1886](https://github.com/ReactiveX/RxJS/issues/1886)
- fix type mismatch in NodeStyleEventEmitter ([#3530](https://github.com/ReactiveX/RxJS/issues/3530)) ([3f51ddd](https://github.com/ReactiveX/RxJS/commit/3f51ddd))
- **sourcemaps:** fix mappings for source maps so they will work ([#3523](https://github.com/ReactiveX/RxJS/issues/3523)) ([32e7f75](https://github.com/ReactiveX/RxJS/commit/32e7f75)), closes [#3479](https://github.com/ReactiveX/RxJS/issues/3479)

### Features

- **compat:** add Observable extension classes with static create() ([ecd7f68](https://github.com/ReactiveX/RxJS/commit/ecd7f68))
- **compat:** add rxjs/interfaces exports ([ba5c266](https://github.com/ReactiveX/RxJS/commit/ba5c266))

<a name="6.0.0-rc.0"></a>

# [6.0.0-rc.0](https://github.com/ReactiveX/RxJS/compare/6.0.0-beta.4...6.0.0-rc.0) (2018-03-31)

### Bug Fixes

- **ajax:** properly encode body with form data that includes URLs ([#3502](https://github.com/ReactiveX/RxJS/issues/3502)) ([4455d21](https://github.com/ReactiveX/RxJS/commit/4455d21)), closes [#2399](https://github.com/ReactiveX/RxJS/issues/2399)
- **bindNodeCallback:** better type inference ([932bb7a](https://github.com/ReactiveX/RxJS/commit/932bb7a))
- **elementAt:** now allows falsy defaultValues ([13706e7](https://github.com/ReactiveX/RxJS/commit/13706e7))
- **lint_perf:** fix lint issues with newer perf tests ([1013754](https://github.com/ReactiveX/RxJS/commit/1013754))
- **throttle:** now properly trailing throttles for individual values ([#3505](https://github.com/ReactiveX/RxJS/issues/3505)) ([3db18d1](https://github.com/ReactiveX/RxJS/commit/3db18d1)), closes [#2864](https://github.com/ReactiveX/RxJS/issues/2864)

### Features

- **takeUntil:** no longer subscribes to source if notifier synchronously emits ([#3504](https://github.com/ReactiveX/RxJS/issues/3504)) ([7b8a3e3](https://github.com/ReactiveX/RxJS/commit/7b8a3e3)), closes [#2189](https://github.com/ReactiveX/RxJS/issues/2189)

### Performance Improvements

- **pluck,bufferTime,asObservable:** add performance tests for pluck(), bufferTime() and asObservable() operators ([#2491](https://github.com/ReactiveX/RxJS/issues/2491)) ([24506b3](https://github.com/ReactiveX/RxJS/commit/24506b3))
- **ReplaySubject:** slightly improved performance ([#2677](https://github.com/ReactiveX/RxJS/issues/2677)) ([9fea36d](https://github.com/ReactiveX/RxJS/commit/9fea36d))

### BREAKING CHANGES

- **throttle:** This changes the behavior of throttle, in particular
  throttling with both leading and trailing behaviors set to true, to more
  closely match the throttling behavior of lodash and other libraries.
  Throttling now starts immediately after any emission from the
  observable, and values will not be double emitted for both leading and
  trailing values

<a name="6.0.0-beta.4"></a>

# [6.0.0-beta.4](https://github.com/ReactiveX/RxJS/compare/6.0.0-beta.3...v6.0.0-beta.4) (2018-03-29)

### Bug Fixes

- **bindCallback:** add better type overloads ([#3480](https://github.com/ReactiveX/RxJS/issues/3480)) ([037cf34](https://github.com/ReactiveX/RxJS/commit/037cf34))
- **compat:** add IScheduler to compat/Scheduler ([0a67df6](https://github.com/ReactiveX/RxJS/commit/0a67df6))

### Features

- **compat:** add all utilities to internal-compatibility ([a9ecfe7](https://github.com/ReactiveX/RxJS/commit/a9ecfe7))
- **websocket:** Add serializer/deserializer config settings ([#3489](https://github.com/ReactiveX/RxJS/issues/3489)) ([8d44124](https://github.com/ReactiveX/RxJS/commit/8d44124))

### BREAKING CHANGES

- **websocket:** WebSocketSubject will now JSON serialize all messages sent over it by default, to return to the old behavior, pass a config setting of `serializer: x => x` like so: `websocket({ url, serializer: x => x })`

<a name="6.0.0-beta.3"></a>

# [6.0.0-beta.3](https://github.com/ReactiveX/RxJS/compare/6.0.0-beta.1...6.0.0-beta.3) (2018-03-27)

### Bug Fixes

- **build:** update build-optimizer and point to correct sources ([6717a01](https://github.com/ReactiveX/RxJS/commit/6717a01))
- **node:** Subscriber no longer trampled if from another copy of rxjs ([371b658](https://github.com/ReactiveX/RxJS/commit/371b658))
- **Observable:** empty ctor returns valid Observable ([#3464](https://github.com/ReactiveX/RxJS/issues/3464)) ([58b8ebc](https://github.com/ReactiveX/RxJS/commit/58b8ebc))
- **subscribeOn:** add subscribeOn back to the distribution ([d6556f2](https://github.com/ReactiveX/RxJS/commit/d6556f2))

<a name="6.0.0-beta.2"></a>

# [6.0.0-beta.2](https://github.com/ReactiveX/RxJS/compare/6.0.0-beta.1...6.0.0-beta.2) (2018-03-24)

### Bug Fixes

- **build:** update build-optimizer and point to correct sources ([6717a01](https://github.com/ReactiveX/RxJS/commit/6717a01))
- **Observable:** empty ctor returns valid Observable ([#3464](https://github.com/ReactiveX/RxJS/issues/3464)) ([58b8ebc](https://github.com/ReactiveX/RxJS/commit/58b8ebc))
- **subscribeOn:** add subscribeOn back to the distribution ([d6556f2](https://github.com/ReactiveX/RxJS/commit/d6556f2))

<a name="6.0.0-beta.1"></a>

# [6.0.0-beta.1](https://github.com/ReactiveX/RxJS/compare/6.0.0-beta.0...v6.0.0-beta.1) (2018-03-21)

### Bug Fixes

- remove duplicate Subscribable<T> interface declaration ([#3450](https://github.com/ReactiveX/RxJS/issues/3450)) ([ac78d89](https://github.com/ReactiveX/RxJS/commit/ac78d89))
- **compat:** add package.json for internal-compatibility package ([#3455](https://github.com/ReactiveX/RxJS/issues/3455)) ([3b306ed](https://github.com/ReactiveX/RxJS/commit/3b306ed))
- **config.useDeprecatedSynchronousErrorThrowing:** reentrant error throwing no longer trapped ([#3449](https://github.com/ReactiveX/RxJS/issues/3449)) ([0892a2d](https://github.com/ReactiveX/RxJS/commit/0892a2d)), closes [#3161](https://github.com/ReactiveX/RxJS/issues/3161)

### Features

- **compat:** add interfaces export ([d8f8122](https://github.com/ReactiveX/RxJS/commit/d8f8122))
- **compat:** add rxjs/observable/dom/\* APIs to compatibility package ([d9a618f](https://github.com/ReactiveX/RxJS/commit/d9a618f))

<a name="6.0.0-beta.0"></a>

# [6.0.0-beta.0](https://github.com/ReactiveX/RxJS/compare/6.0.0-alpha.3...6.0.0-beta.0) (2018-03-16)

### Bug Fixes

- **AjaxObservable:** 1xx,2xx,3xx requests shouldn't error, only 4xx,5xx ([#3438](https://github.com/ReactiveX/RxJS/issues/3438)) ([2128932](https://github.com/ReactiveX/RxJS/commit/2128932))
- **compat:** adjustments to get rxjs-compat to build correctly ([dea6964](https://github.com/ReactiveX/RxJS/commit/dea6964))
- **config:** expose configuration via rxjs exports ([#3441](https://github.com/ReactiveX/RxJS/issues/3441)) ([4287424](https://github.com/ReactiveX/RxJS/commit/4287424))
- **config:** make sure that Promise config is undefined initially ([#3440](https://github.com/ReactiveX/RxJS/issues/3440)) ([469afe8](https://github.com/ReactiveX/RxJS/commit/469afe8))
- **ESM:** Add [operators|ajax|websocket|testing]/package.json for ESM support, fixes [#3227](https://github.com/ReactiveX/RxJS/issues/3227) ([#3356](https://github.com/ReactiveX/RxJS/issues/3356)) ([725dcb4](https://github.com/ReactiveX/RxJS/commit/725dcb4))
- **forkJoin:** fix forkJoin typings for forkJoin(Observable<any>[]) ([#3436](https://github.com/ReactiveX/RxJS/issues/3436)) ([17c7f8f](https://github.com/ReactiveX/RxJS/commit/17c7f8f))
- **fromEvent:** Defines toString to fix Closure compilations ([#3417](https://github.com/ReactiveX/RxJS/issues/3417)) ([1558b43](https://github.com/ReactiveX/RxJS/commit/1558b43))
- **fromEvent:** pass options in unsubscribe ([f1872b0](https://github.com/ReactiveX/RxJS/commit/f1872b0)), closes [#3349](https://github.com/ReactiveX/RxJS/issues/3349)
- **publishReplay:** type inference improved ([#3437](https://github.com/ReactiveX/RxJS/issues/3437)) ([dd7c9f1](https://github.com/ReactiveX/RxJS/commit/dd7c9f1)), closes [#3260](https://github.com/ReactiveX/RxJS/issues/3260)
- **rxjs:** add exports for symbols/interfaces that were missing ([#3380](https://github.com/ReactiveX/RxJS/issues/3380)) ([1622ee0](https://github.com/ReactiveX/RxJS/commit/1622ee0))
- **rxjs:** make sure esm imports from index.js by default, not Rx.js ([#3316](https://github.com/ReactiveX/RxJS/issues/3316)) ([c2b00f4](https://github.com/ReactiveX/RxJS/commit/c2b00f4)), closes [#3315](https://github.com/ReactiveX/RxJS/issues/3315)
- **rxjs:** once again exports custom error types ([#3371](https://github.com/ReactiveX/RxJS/issues/3371)) ([4465a9f](https://github.com/ReactiveX/RxJS/commit/4465a9f))
- **rxjs:** remove types.ts importing from itself. ([#3383](https://github.com/ReactiveX/RxJS/issues/3383)) ([8fd50ad](https://github.com/ReactiveX/RxJS/commit/8fd50ad))
- **spec:** get tests running using compatibility package ([916e968](https://github.com/ReactiveX/RxJS/commit/916e968))
- correct internal module paths to be systemjs compatible ([#3412](https://github.com/ReactiveX/RxJS/issues/3412)) ([35abc9d](https://github.com/ReactiveX/RxJS/commit/35abc9d))
- **Symbol.iterator:** correctly handle case where Symbol constructor itself is not defined ([#3394](https://github.com/ReactiveX/RxJS/issues/3394)) ([6725be1](https://github.com/ReactiveX/RxJS/commit/6725be1))
- **typings:** fixed some cases where multicast and publish would not return a ConnectableObservable ([#3320](https://github.com/ReactiveX/RxJS/issues/3320)) ([ddffecc](https://github.com/ReactiveX/RxJS/commit/ddffecc))
- reexport Symbol.observable typings patch ([4c4d7b0](https://github.com/ReactiveX/RxJS/commit/4c4d7b0))
- remove the root operators.ts because it overshadows operators/package.json ([184b6d4](https://github.com/ReactiveX/RxJS/commit/184b6d4))

### Code Refactoring

- **Observable.if:** remove ts hacks from Observable ([f46f261](https://github.com/ReactiveX/RxJS/commit/f46f261))
- **Rx.ts:** move Rx.ts to internal ([#3400](https://github.com/ReactiveX/RxJS/issues/3400)) ([7ad2119](https://github.com/ReactiveX/RxJS/commit/7ad2119))

### Features

- **ajax:** default to opting into CORS ([#3442](https://github.com/ReactiveX/RxJS/issues/3442)) ([aa3bf57](https://github.com/ReactiveX/RxJS/commit/aa3bf57)), closes [#3273](https://github.com/ReactiveX/RxJS/issues/3273)
- **bindCallback:** remove result selector ([2535641](https://github.com/ReactiveX/RxJS/commit/2535641))
- **bindNodeCallback:** remove resultSelector ([26e6e5c](https://github.com/ReactiveX/RxJS/commit/26e6e5c))
- **compat:** add compatability package definition ([40aca82](https://github.com/ReactiveX/RxJS/commit/40aca82))
- **compat:** add concat operator to compatibility layer ([6e84e78](https://github.com/ReactiveX/RxJS/commit/6e84e78))
- **compat:** add legacy reexport compat layer for 'rxjs/Observable' and other top-level symbols ([70e562b](https://github.com/ReactiveX/RxJS/commit/70e562b))
- **compat:** add Rx.ts to rxjs-compat ([df25de1](https://github.com/ReactiveX/RxJS/commit/df25de1))
- **compat:** compatibility mode for combineLatest ([fd86df5](https://github.com/ReactiveX/RxJS/commit/fd86df5))
- **compat:** compatibility mode for merge operator ([ffce980](https://github.com/ReactiveX/RxJS/commit/ffce980))
- **compat:** compatibility mode for zip operator ([9f131d0](https://github.com/ReactiveX/RxJS/commit/9f131d0))
- **compat:** make Rx.ts for compatability layer work as the default for rxjs-compat ([d43a4c2](https://github.com/ReactiveX/RxJS/commit/d43a4c2))
- **compat:** set up correct imports & get build working for rxjs-comapt ([1a0dc97](https://github.com/ReactiveX/RxJS/commit/1a0dc97))
- **deprecated-error-handling-warning:** add console warning when code sets the flag to bad mode ([49be56a](https://github.com/ReactiveX/RxJS/commit/49be56a))
- **error-handling:** add deprecated sync error handling behind a flag ([583cd1d](https://github.com/ReactiveX/RxJS/commit/583cd1d))
- **exhaustMap:** simplify interface ([42589d0](https://github.com/ReactiveX/RxJS/commit/42589d0))
- **first:** simplify interface ([a011338](https://github.com/ReactiveX/RxJS/commit/a011338))
- **forkJoin:** simplify interface ([4d2338b](https://github.com/ReactiveX/RxJS/commit/4d2338b))
- **fromEvent:** remove resultSelector ([197f449](https://github.com/ReactiveX/RxJS/commit/197f449))
- **fromEvent:** will now emit an array when event emits multiple arguments ([51b37fd](https://github.com/ReactiveX/RxJS/commit/51b37fd))
- **fromEventPattern:** removed resultSelector ([6b34f9f](https://github.com/ReactiveX/RxJS/commit/6b34f9f))
- **last:** simplify interface ([3240419](https://github.com/ReactiveX/RxJS/commit/3240419))
- **mergeMap|concatMap|concatMapTo:** simplified the signatures ([d293245](https://github.com/ReactiveX/RxJS/commit/d293245))
- **mergeMapTo:** simplify interface ([582c7be](https://github.com/ReactiveX/RxJS/commit/582c7be))
- **never:** no longer export `never` function ([#3386](https://github.com/ReactiveX/RxJS/issues/3386)) ([53debc8](https://github.com/ReactiveX/RxJS/commit/53debc8))
- **switchMap|switchMapTo:** simplify interface ([959fb6a](https://github.com/ReactiveX/RxJS/commit/959fb6a))
- **Symbol.iterator:** no longer polyfilled ([#3389](https://github.com/ReactiveX/RxJS/issues/3389)) ([6319f3c](https://github.com/ReactiveX/RxJS/commit/6319f3c))
- **Symbol.observable:** is no longer polyfilled ([#3387](https://github.com/ReactiveX/RxJS/issues/3387)) ([4a5aaaf](https://github.com/ReactiveX/RxJS/commit/4a5aaaf))
- **throwIfEmpty:** adds throwIfEmpty operator ([#3368](https://github.com/ReactiveX/RxJS/issues/3368)) ([9b21458](https://github.com/ReactiveX/RxJS/commit/9b21458))
- **typings:** updated typings for combineAll, mergeAll, concatAll, switch, exhaust, zipAll ([#3321](https://github.com/ReactiveX/RxJS/issues/3321)) ([f7e4c02](https://github.com/ReactiveX/RxJS/commit/f7e4c02))
- **umd:** UMD now mirrors export schema for ESM and CJS ([#3426](https://github.com/ReactiveX/RxJS/issues/3426)) ([556c904](https://github.com/ReactiveX/RxJS/commit/556c904))

### BREAKING CHANGES

- **ajax:** will no longer execute a CORS request by default, you must opt-in with the `crossDomain` flag in the config.
- **mergeMap|concatMap|concatMapTo:** mergeMap, concatMap and concatMapTo no longer support a result selector, if you need to use a result selector, use the following pattern: `source.mergeMap(x => of(x + x).pipe(map(y => y + x))` (the pattern would be the same for `concatMap`).
- **never:** no longer exported. Use the `NEVER` constant instead.
- **bindCallback:** removes result selector, use `map` instead: `bindCallback(fn1, fn2)()` becomes `bindCallback(fn1)().pipe(map(fn2))`
- **Rx.ts:** importing from `rxjs/Rx` is no longer available. Upcoming backwards compat solution will allow that
- **Symbol.iterator:** We are no longer polyfilling `Symbol.iterator`. That would be done by a proper polyfilling library
- **Observable.if:** TypeScript users using `Observable.if` will have to cast `Observable` as any to get to `if`. It is a better idea to just use `iif` directly via `import { iif } from 'rxjs';`
- **bindNodeCallback:** resultSelector removed, use `map` instead: `bindNodeCallback(fn1, fn2)()` becomes `bindNodeCallback(fn1)().pipe(map(fn2))`
- **Symbol.observable:** RxJS will no longer be polyfilling Symbol.observable. That should be done by an actual polyfill library. This is to prevent duplication of code, and also to prevent having modules with side-effects in rxjs.
- **fromEvent:** result selector removed, use `map` instead: `fromEvent(target, 'click', fn)` becomes `fromEvent(target, 'click').pipe(map(fn))`
- **last:** no longer accepts `resultSelector` argument. To get this same functionality, use `map`.
- **first:** no longer supports `resultSelector` argument. The same functionality can be achieved by simply mapping either before or after `first` depending on your use case.
- **exhaustMap:** `resultSelector` no longer supported, to get this functionality use: `source.pipe(exhaustMap(x => of(x + x).pipe(map(y => x + y))))`
- **switchMap|switchMapTo:** `switchMap` and `switchMapTo` no longer take `resultSelector` arguments, to get the same functionality use `switchMap` and `map` in combination: `source.pipe(switchMap(x => of(x + x).pipe(y => x + y)))`.
- **mergeMapTo:** `mergeMapTo` no longer accepts a resultSelector, to get this functionality, you'll want to use `mergeMap` and `map` together: `source.pipe(mergeMap(() => inner).pipe(map(y => x + y)))`
- **fromEventPattern:** no longer supports a result selector, use `map` instead: `fromEventPattern(fn1, fn2, fn3)` becomes `fromEventPattern(fn1, fn2).pipe(map(fn3))`

<a name="6.0.0-alpha.4"></a>

# [6.0.0-alpha.4](https://github.com/ReactiveX/RxJS/compare/6.0.0-alpha.3...v6.0.0-alpha.4) (2018-03-13)

### Bug Fixes

- **ESM:** Add [operators|ajax|websocket|testing]/package.json for ESM support, fixes [#3227](https://github.com/ReactiveX/RxJS/issues/3227) ([#3356](https://github.com/ReactiveX/RxJS/issues/3356)) ([725dcb4](https://github.com/ReactiveX/RxJS/commit/725dcb4))
- **fromEvent:** Defines toString to fix Closure compilations ([#3417](https://github.com/ReactiveX/RxJS/issues/3417)) ([1558b43](https://github.com/ReactiveX/RxJS/commit/1558b43))
- **fromEvent:** pass options in unsubscribe ([f1872b0](https://github.com/ReactiveX/RxJS/commit/f1872b0)), closes [#3349](https://github.com/ReactiveX/RxJS/issues/3349)
- **rxjs:** add exports for symbols/interfaces that were missing ([#3380](https://github.com/ReactiveX/RxJS/issues/3380)) ([1622ee0](https://github.com/ReactiveX/RxJS/commit/1622ee0))
- **rxjs:** make sure esm imports from index.js by default, not Rx.js ([#3316](https://github.com/ReactiveX/RxJS/issues/3316)) ([c2b00f4](https://github.com/ReactiveX/RxJS/commit/c2b00f4)), closes [#3315](https://github.com/ReactiveX/RxJS/issues/3315)
- **rxjs:** once again exports custom error types ([#3371](https://github.com/ReactiveX/RxJS/issues/3371)) ([4465a9f](https://github.com/ReactiveX/RxJS/commit/4465a9f))
- **rxjs:** remove types.ts importing from itself. ([#3383](https://github.com/ReactiveX/RxJS/issues/3383)) ([8fd50ad](https://github.com/ReactiveX/RxJS/commit/8fd50ad))
- correct internal module paths to be systemjs compatible ([#3412](https://github.com/ReactiveX/RxJS/issues/3412)) ([35abc9d](https://github.com/ReactiveX/RxJS/commit/35abc9d))
- **Symbol.iterator:** correctly handle case where Symbol constructor itself is not defined ([#3394](https://github.com/ReactiveX/RxJS/issues/3394)) ([6725be1](https://github.com/ReactiveX/RxJS/commit/6725be1))
- **typings:** fixed some cases where multicast and publish would not return a ConnectableObservable ([#3320](https://github.com/ReactiveX/RxJS/issues/3320)) ([ddffecc](https://github.com/ReactiveX/RxJS/commit/ddffecc))
- reexport Symbol.observable typings patch ([4c4d7b0](https://github.com/ReactiveX/RxJS/commit/4c4d7b0))
- remove the root operators.ts because it overshadows operators/package.json ([184b6d4](https://github.com/ReactiveX/RxJS/commit/184b6d4))

### Code Refactoring

- **Observable.if:** remove ts hacks from Observable ([f46f261](https://github.com/ReactiveX/RxJS/commit/f46f261))
- **Rx.ts:** move Rx.ts to internal ([#3400](https://github.com/ReactiveX/RxJS/issues/3400)) ([7ad2119](https://github.com/ReactiveX/RxJS/commit/7ad2119))

### Features

- **bindCallback:** remove result selector ([2535641](https://github.com/ReactiveX/RxJS/commit/2535641))
- **bindNodeCallback:** remove re   sultSelector ([26e6e5c](https://github.com/ReactiveX/RxJS/commit/26e6e5c))
- **exhaustMap:** simplify interface ([42589d0](https://github.com/ReactiveX/RxJS/commit/42589d0))
- **first:** simplify interface ([a011338](https://github.com/ReactiveX/RxJS/commit/a011338))
- **forkJoin:** simplify interface ([4d2338b](https://github.com/ReactiveX/RxJS/commit/4d2338b))
- **fromEvent:** remove resultSelector ([197f449](https://github.com/ReactiveX/RxJS/commit/197f449))
- **fromEvent:** will now emit an array when event emits multiple arguments ([51b37fd](https://github.com/ReactiveX/RxJS/commit/51b37fd))
- **fromEventPattern:** removed resultSelector ([6b34f9f](https://github.com/ReactiveX/RxJS/commit/6b34f9f))
- **last:** simplify interface ([3240419](https://github.com/ReactiveX/RxJS/commit/3240419))
- **mergeMap|concatMap|concatMapTo:** simplified the signatures ([d293245](https://github.com/ReactiveX/RxJS/commit/d293245))
- **mergeMapTo:** simplify interface ([582c7be](https://github.com/ReactiveX/RxJS/commit/582c7be))
- **never:** no longer export `never` function ([#3386](https://github.com/ReactiveX/RxJS/issues/3386)) ([53debc8](https://github.com/ReactiveX/RxJS/commit/53debc8))
- **switchMap|switchMapTo:** simplify interface ([959fb6a](https://github.com/ReactiveX/RxJS/commit/959fb6a))
- **Symbol.iterator:** no longer polyfilled ([#3389](https://github.com/ReactiveX/RxJS/issues/3389)) ([6319f3c](https://github.com/ReactiveX/RxJS/commit/6319f3c))
- **Symbol.observable:** is no longer polyfilled ([#3387](https://github.com/ReactiveX/RxJS/issues/3387)) ([4a5aaaf](https://github.com/ReactiveX/RxJS/commit/4a5aaaf))
- **throwIfEmpty:** adds throwIfEmpty operator ([#3368](https://github.com/ReactiveX/RxJS/issues/3368)) ([9b21458](https://github.com/ReactiveX/RxJS/commit/9b21458))
- **typings:** updated typings for combineAll, mergeAll, concatAll, switch, exhaust, zipAll ([#3321](https://github.com/ReactiveX/RxJS/issues/3321)) ([f7e4c02](https://github.com/ReactiveX/RxJS/commit/f7e4c02))
- **umd:** UMD now mirrors export schema for ESM and CJS ([#3426](https://github.com/ReactiveX/RxJS/issues/3426)) ([556c904](https://github.com/ReactiveX/RxJS/commit/556c904))

### BREAKING CHANGES

- **Symbol.observable:** RxJS will no longer be polyfilling Symbol.observable. That should be done by an actual polyfill library. This is to prevent duplication of code, and also to prevent having modules with side-effects in rxjs.
- **mergeMap|concatMap|concatMapTo:** mergeMap, concatMap and concatMapTo no longer support a result selector, if you need to use a result selector, use the following pattern: `source.mergeMap(x => of(x + x).pipe(map(y => y + x))` (the pattern would be the same for `concatMap`).
- **bindCallback:** removes result selector, use `map` instead: `bindCallback(fn1, fn2)()` becomes `bindCallback(fn1)().pipe(map(fn2))`
- **Rx.ts:** importing from `rxjs/Rx` is no longer available. Upcoming backwards compat solution will allow that
- **Symbol.iterator:** We are no longer polyfilling `Symbol.iterator`. That would be done by a proper polyfilling library
- **Observable.if:** TypeScript users using `Observable.if` will have to cast `Observable` as any to get to `if`. It is a better idea to just use `iif` directly via `import { iif } from 'rxjs';`
- **bindNodeCallback:** resultSelector removed, use `map` instead: `bindNodeCallback(fn1, fn2)()` becomes `bindNodeCallback(fn1)().pipe(map(fn2))`
- **never:** no longer exported. Use the `NEVER` constant instead.
- **fromEvent:** result selector removed, use `map` instead: `fromEvent(target, 'click', fn)` becomes `fromEvent(target, 'click').pipe(map(fn))`
- **last:** no longer accepts `resultSelector` argument. To get this same functionality, use `map`.
- **first:** no longer supports `resultSelector` argument. The same functionality can be achieved by simply mapping either before or after `first` depending on your use case.
- **exhaustMap:** `resultSelector` no longer supported, to get this functionality use: `source.pipe(exhaustMap(x => of(x + x).pipe(map(y => x + y))))`
- **switchMap|switchMapTo:** `switchMap` and `switchMapTo` no longer take `resultSelector` arguments, to get the same functionality use `switchMap` and `map` in combination: `source.pipe(switchMap(x => of(x + x).pipe(y => x + y)))`.
- **mergeMapTo:** `mergeMapTo` no longer accepts a resultSelector, to get this functionality, you'll want to use `mergeMap` and `map` together: `source.pipe(mergeMap(() => inner).pipe(map(y => x + y)))`
- **fromEventPattern:** no longer supports a result selector, use `map` instead: `fromEventPattern(fn1, fn2, fn3)` becomes `fromEventPattern(fn1, fn2).pipe(map(fn3))`

<a name="6.0.0-alpha.3"></a>

# [6.0.0-alpha.3](https://github.com/ReactiveX/RxJS/compare/6.0.0-alpha.2...v6.0.0-alpha.3) (2018-02-06)

### Bug Fixes

- **animationFrame.spec:** spec description fix ([#3140](https://github.com/ReactiveX/RxJS/issues/3140)) ([ab6c325](https://github.com/ReactiveX/RxJS/commit/ab6c325))
- **debounce:** support scalar selectors ([#3236](https://github.com/ReactiveX/RxJS/issues/3236)) ([1548393](https://github.com/ReactiveX/RxJS/commit/1548393)), closes [#3232](https://github.com/ReactiveX/RxJS/issues/3232)
- **forkJoin:** catch and forward selector errors ([#3261](https://github.com/ReactiveX/RxJS/issues/3261)) ([e57bbb7](https://github.com/ReactiveX/RxJS/commit/e57bbb7)), closes [#3216](https://github.com/ReactiveX/RxJS/issues/3216)
- **Observable:** expose pipe rest parameter overload ([#3292](https://github.com/ReactiveX/RxJS/issues/3292)) ([7ff5bc3](https://github.com/ReactiveX/RxJS/commit/7ff5bc3))
- **onErrorResumeNext:** no longer holds onto subscriptions too long ([abbbdad](https://github.com/ReactiveX/RxJS/commit/abbbdad)), closes [#3178](https://github.com/ReactiveX/RxJS/issues/3178)
- **scheduler:** prevent unwanted clearInterval ([#3226](https://github.com/ReactiveX/RxJS/issues/3226)) ([d7cfb42](https://github.com/ReactiveX/RxJS/commit/d7cfb42)), closes [#3042](https://github.com/ReactiveX/RxJS/issues/3042)
- **timer:** multiple subscriptions to timer(Date) behaves correctly ([aafa7ff](https://github.com/ReactiveX/RxJS/commit/aafa7ff)), closes [#3252](https://github.com/ReactiveX/RxJS/issues/3252)
- **typings:** correct compilation warnings from missing types in tests ([3aad6bc](https://github.com/ReactiveX/RxJS/commit/3aad6bc))
- **typings:** relax debounce selector type ([c419ab4](https://github.com/ReactiveX/RxJS/commit/c419ab4)), closes [#3164](https://github.com/ReactiveX/RxJS/issues/3164)
- **typings:** relax throttle selector type ([#3205](https://github.com/ReactiveX/RxJS/issues/3205)) ([e83fda7](https://github.com/ReactiveX/RxJS/commit/e83fda7)), closes [#3204](https://github.com/ReactiveX/RxJS/issues/3204)
- **typings:** the return type of factory of defer should be ObservableInput<T> ([#3211](https://github.com/ReactiveX/RxJS/issues/3211)) ([dc41a5e](https://github.com/ReactiveX/RxJS/commit/dc41a5e))

### Features

- **empty:** empty() returns the same instance ([5c7c749](https://github.com/ReactiveX/RxJS/commit/5c7c749))
- **EMPTY:** observable constant EMPTY now exported ([08fb074](https://github.com/ReactiveX/RxJS/commit/08fb074))
- **never:** always return the same instance ([#3249](https://github.com/ReactiveX/RxJS/issues/3249)) ([d57fa52](https://github.com/ReactiveX/RxJS/commit/d57fa52))
- **rxjs:** move rxjs/create into rxjs ([#3299](https://github.com/ReactiveX/RxJS/issues/3299)) ([6711fe2](https://github.com/ReactiveX/RxJS/commit/6711fe2))
- **throwError:** functional version of throwError ([639236e](https://github.com/ReactiveX/RxJS/commit/639236e))

### BREAKING CHANGES

- **rxjs:** `rxjs/create` items are now exported from `rxjs`
- **throwError:** Observable.throw no longer available in TypeScript without a cast
- **empty:** `empty()` without a scheduler will return the same
  instance every time.
- **empty:** In TypeScript, `empty()` no longer accepts a generic
  argument, as it returns `Observable<never>`
- **never:** `never()` always returns the same instance
- **never:** TypeScript typing for `never()` is now `Observable<never>` and the function no longer requires a generic type.

<a name="6.0.0-alpha.2"></a>

# [6.0.0-alpha.2](https://github.com/ReactiveX/RxJS/compare/6.0.0-alpha.1...6.0.0-alpha.2) (2018-01-14)

### Bug Fixes

- **build:** properly outputs subdirectories like `rxjs/operators` ([34fe560](https://github.com/ReactiveX/RxJS/commit/34fe560))

<a name="6.0.0-alpha.1"></a>

# [6.0.0-alpha.1](https://github.com/ReactiveX/RxJS/compare/5.5.3...v6.0.0-alpha.1) (2018-01-12)

### Bug Fixes

- Revert "fix(scheduler): prevent unwanted clearInterval ([#3044](https://github.com/ReactiveX/RxJS/issues/3044))" ([ad5c7c6](https://github.com/ReactiveX/RxJS/commit/ad5c7c6))
- Revert "fix(scheduler): prevent unwanted clearInterval ([#3044](https://github.com/ReactiveX/RxJS/issues/3044))" ([64f9285](https://github.com/ReactiveX/RxJS/commit/64f9285))
- **debounceTime:** synchronous reentrancy of debounceTime no longer swallows the second value ([#3218](https://github.com/ReactiveX/RxJS/issues/3218)) ([598e9ce](https://github.com/ReactiveX/RxJS/commit/598e9ce)), closes [#2748](https://github.com/ReactiveX/RxJS/issues/2748)
- **dependency:** move symbol-observable into devdependency ([4400628](https://github.com/ReactiveX/RxJS/commit/4400628))
- **IteratorObservable:** get new iterator for each subscription ([#2497](https://github.com/ReactiveX/RxJS/issues/2497)) ([1bd0a58](https://github.com/ReactiveX/RxJS/commit/1bd0a58)), closes [#2496](https://github.com/ReactiveX/RxJS/issues/2496)
- **Observable.toArray:** Fix toArray with multiple subscriptions. ([#3134](https://github.com/ReactiveX/RxJS/issues/3134)) ([3390926](https://github.com/ReactiveX/RxJS/commit/3390926))
- **SystemJS:** avoid node module resolution of pipeable operators ([#3025](https://github.com/ReactiveX/RxJS/issues/3025)) ([0f3cf71](https://github.com/ReactiveX/RxJS/commit/0f3cf71)), closes [#2971](https://github.com/ReactiveX/RxJS/issues/2971) [#2996](https://github.com/ReactiveX/RxJS/issues/2996) [#3011](https://github.com/ReactiveX/RxJS/issues/3011)
- **tap:** make next optional ([#3073](https://github.com/ReactiveX/RxJS/issues/3073)) ([e659f0c](https://github.com/ReactiveX/RxJS/commit/e659f0c)), closes [#2534](https://github.com/ReactiveX/RxJS/issues/2534)
- **TSC:** Fixing TSC errors. Fixes [#3020](https://github.com/ReactiveX/RxJS/issues/3020) ([01d1575](https://github.com/ReactiveX/RxJS/commit/01d1575))
- **typings:** the return type of project of mergeScan should be ObservableInput<R> ([23fe17d](https://github.com/ReactiveX/RxJS/commit/23fe17d))

### Chores

- **TypeScript:** Bump up typescript to latest ([#3009](https://github.com/ReactiveX/RxJS/issues/3009)) ([2f395da](https://github.com/ReactiveX/RxJS/commit/2f395da))

### Code Refactoring

- **asap:** Remove setImmediate polyfill ([5eb6af7](https://github.com/ReactiveX/RxJS/commit/5eb6af7))
- **distinct:** Remove Set polyfill ([68ee499](https://github.com/ReactiveX/RxJS/commit/68ee499))
- **groupBy:** Remove Map polyfill ([74b5b1a](https://github.com/ReactiveX/RxJS/commit/74b5b1a))

### Features

- **Observable:** unhandled errors are now reported to HostReportErrors ([#3062](https://github.com/ReactiveX/RxJS/issues/3062)) ([cd9626a](https://github.com/ReactiveX/RxJS/commit/cd9626a))
- **reorganize:** move ./interfaces.ts to internal/types.ts ([cfbfaac](https://github.com/ReactiveX/RxJS/commit/cfbfaac))
- **reorganize:** internal utils hidden ([70058cd](https://github.com/ReactiveX/RxJS/commit/70058cd))
- **reorganize:** add `rxjs/create` exports ([c9963bd](https://github.com/ReactiveX/RxJS/commit/c9963bd))
- **reorganize:** ajax observable creator now exported from `rxjs/ajax` ([e971c93](https://github.com/ReactiveX/RxJS/commit/e971c93))
- **reorganize:** all patch operators moved to `internal` directory ([7342401](https://github.com/ReactiveX/RxJS/commit/7342401))
- **reorganize:** export `noop` and `identity` from `rxjs` ([810c4d0](https://github.com/ReactiveX/RxJS/commit/810c4d0))
- **reorganize:** export `Notification` from `rxjs` ([8809b48](https://github.com/ReactiveX/RxJS/commit/8809b48))
- **reorganize:** export schedulers from `rxjs` ([abd3b61](https://github.com/ReactiveX/RxJS/commit/abd3b61))
- **reorganize:** export Subject, ReplaySubject, BehaviorSubject from rxjs ([bd683ca](https://github.com/ReactiveX/RxJS/commit/bd683ca))
- **reorganize:** export the `pipe` utility function from `rxjs` ([4574310](https://github.com/ReactiveX/RxJS/commit/4574310))
- **reorganize:** hid testing implementation details ([b981666](https://github.com/ReactiveX/RxJS/commit/b981666))
- **reorganize:** move observable implementations under internal directory ([2d5c3f8](https://github.com/ReactiveX/RxJS/commit/2d5c3f8))
- **reorganize:** move operator impls under internal directory ([207976f](https://github.com/ReactiveX/RxJS/commit/207976f))
- **reorganize:** move top-level impls under internal directory ([c3bb705](https://github.com/ReactiveX/RxJS/commit/c3bb705))
- **reorganize:** moved symbols to be internal ([80783ab](https://github.com/ReactiveX/RxJS/commit/80783ab))
- **reorganize:** operators all exported from `rxjs/operators` ([b1f8bfe](https://github.com/ReactiveX/RxJS/commit/b1f8bfe))
- **reorganize:** websocket subject creator now exported from `rxjs/websocket` ([5ac62c0](https://github.com/ReactiveX/RxJS/commit/5ac62c0))

### BREAKING CHANGES

- **webSocket:** `webSocket` creator function now exported from `rxjs/websocket` as `websocket`.
- **IteratorObservable:** IteratorObservable no longer share iterator between
  subscription
- **utils:** Many internal use utilities like `isArray` are now hidden under `rxjs/internal`, they are implementation details and should not be used.
- **testing observables:** `HotObservable` and `ColdObservable`, and other testing support types are no longer exported directly.
- **creation functions:** All create functions such as `of`, `from`, `combineLatest` and `fromEvent` should now be imported from `rxjs/create`.
- **types and interfaces:** Can no longer explicitly import types from `rxjs/interfaces`, import them from `rxjs` instead
- **symbols:** Symbols are no longer exported directly from modules such as `rxjs/symbol/observable` please use `Symbol.observable` and `Symbol.iterator` (polyfills may be required)
- **deep imports:** Can no longer deep import top-level types such as `rxjs/Observable`, `rxjs/Subject`, `rxjs/ReplaySubject`, et al. All imports should be done directly from `rxjs`, for example: `import \{ Observable, Subject \} from 'rxjs';`
- **schedulers:** Scheduler instances have changed names to be suffixed with `Scheduler`, (e.g. `asap` -> `asapScheduler`)
- **operators:** Pipeable operators must now be imported from `rxjs`
  like so: `import { map, filter, switchMap } from 'rxjs/operators';`. No deep imports.
- **ajax:** Ajax observable should be imported from `rxjs/ajax`.
- **Observable:** You should no longer deep import custom Observable
  implementations such as `ArrayObservable` or `ForkJoinObservable`.
- **\_throw:** `_throw` is now exported as `throwError`
- **if:** `if` is now exported as `iif`
- **operators:** Deep imports to `rxjs/operator/*` will no longer work. Again, pipe operators are still where they were.
- **error handling:** Unhandled errors are no longer caught and rethrown, rather they are caught and scheduled to be thrown, which causes them to be reported to window.onerror or process.on('error'), depending on the environment. Consequently, teardown after a synchronous, unhandled, error will no longer occur, as the teardown would not exist, and producer interference cannot occur
- **distinct:** Using `distinct` requires a `Set` implementation and must be polyfilled in older runtimes
- **asap:** Old runtimes must polyfill Promise in order to use ASAP scheduling.
- **groupBy:** Older runtimes will require Map to be polyfilled to use
  `groupBy`
- **TypeScript:** IE10 and lower will need to polyfill `Object.setPrototypeOf`
- **operators removed:** Operator versions of static observable creators such as
  `merge`, `concat`, `zip`, `onErrorResumeNext`, and `race` have been
  removed. Please use the static versions of those operations. e.g.
  `a.pipe(concat(b, c))` becomes `concat(a, b, c)`.

<a name="5.5.6"></a>

## [5.5.6](https://github.com/ReactiveX/RxJS/compare/5.5.5...v5.5.6) (2017-12-21)

### Bug Fixes

- **Observable:** rethrow errors when syncErrorThrowable and inherit it from destination. Fixes [#2813](https://github.com/ReactiveX/RxJS/issues/2813) ([541b49d](https://github.com/ReactiveX/RxJS/commit/541b49d))

<a name="5.5.5"></a>

## [5.5.5](https://github.com/ReactiveX/RxJS/compare/5.5.4...v5.5.5) (2017-12-06)

### Support Added

- **Bazel:** Add files to support users that want Bazel builds with RxJS ([12dac3b](https://github.com/ReactiveX/rxjs/commit/12dac3b))

<a name="5.5.4"></a>

## [5.5.4](https://github.com/ReactiveX/RxJS/compare/5.5.3...v5.5.4) (2017-12-05)

### Bug Fixes

- **scheduler:** resolve regression on angular router with zones ([#3158](https://github.com/ReactiveX/RxJS/issues/3158)) ([520b06a](https://github.com/ReactiveX/RxJS/commit/520b06a))
- **publish:** re-publish after having built with proper version of TypeScript. ([f0ff5bc](https://github.com/ReactiveX/RxJS/commit/f0ff5bc), closes[#3155](https://github.com/ReactiveX/rxjs/issues/3155))

<a name="5.5.3"></a>

## [5.5.3](https://github.com/ReactiveX/RxJS/compare/5.5.2...v5.5.3) (2017-12-01)

### Bug Fixes

- **concatStatic:** missing exports for mergeStatic and concatStatic ([#2999](https://github.com/ReactiveX/RxJS/issues/2999)) ([cae5f9b](https://github.com/ReactiveX/RxJS/commit/cae5f9b))
- **scheduler:** prevent unwanted clearInterval ([#3044](https://github.com/ReactiveX/RxJS/issues/3044)) ([7d722d4](https://github.com/ReactiveX/RxJS/commit/7d722d4)), closes [#3042](https://github.com/ReactiveX/RxJS/issues/3042)
- **SystemJS:** avoid node module resolution of pipeable operators ([#3025](https://github.com/ReactiveX/RxJS/issues/3025)) ([d77e3d7](https://github.com/ReactiveX/RxJS/commit/d77e3d7)), closes [#2971](https://github.com/ReactiveX/RxJS/issues/2971) [#2996](https://github.com/ReactiveX/RxJS/issues/2996) [#3011](https://github.com/ReactiveX/RxJS/issues/3011)
- **typings:** fix subscribe overloads ([#3053](https://github.com/ReactiveX/RxJS/issues/3053)) ([1a9fd42](https://github.com/ReactiveX/RxJS/commit/1a9fd42)), closes [#3052](https://github.com/ReactiveX/RxJS/issues/3052)

<a name="5.5.2"></a>

## [5.5.2](https://github.com/ReactiveX/RxJS/compare/5.5.1...v5.5.2) (2017-10-25)

### Bug Fixes

- **package:** fixed import failures in Webpack ([#2987](https://github.com/ReactiveX/RxJS/issues/2987)) ([e16202d](https://github.com/ReactiveX/RxJS/commit/e16202d))
- **typings:** improved type inference for arguments to publishReplay ([#2992](https://github.com/ReactiveX/RxJS/issues/2992)) ([0753ff7](https://github.com/ReactiveX/RxJS/commit/0753ff7)), closes [#2991](https://github.com/ReactiveX/RxJS/issues/2991)
- **typings:** ensure TS types for `zip` and `combineLatest` are properly inferred. ([b8e6cf8](https://github.com/ReactiveX/RxJS/commit/b8e6cf8))
- **typings:** publish variants will properly return ConnectableObservable([#2983](https://github.com/ReactiveX/RxJS/issues/2983)) ([d563bfa](https://github.com/ReactiveX/RxJS/commit/d563bfa))

<a name="5.5.1"></a>

## [5.5.1](https://github.com/ReactiveX/RxJS/compare/5.5.0...v5.5.1) (2017-10-24)

### Bug Fixes

- **build:** Remove `module` and `es2015` keys to avoid resolution conflicts ([5073139](https:/github.com/ReactiveX/RxJS/commit/5073139))
- **ajaxobservable:** fix operator import path ([d9b62ed](https://github.com/ReactiveX/RxJS/commit/d9b62ed))

<a name="5.5.0"></a>

# [5.5.0](https://github.com/ReactiveX/RxJS/compare/5.5.0-beta.7...v5.5.0) (2017-10-18)

### Bug Fixes

- **build:** CJS sourceMaps now inlined into sourcesContent ([39b4af5](https://github.com/ReactiveX/RxJS/commit/39b4af5)), closes [#2934](https://github.com/ReactiveX/RxJS/issues/2934)

### Features

- **publishReplay:** add selector function to publishReplay ([#2885](https://github.com/ReactiveX/RxJS/issues/2885)) ([e0efd13](https://github.com/ReactiveX/RxJS/commit/e0efd13))

<a name="5.5.0-beta.7"></a>

# [5.5.0-beta.7](https://github.com/ReactiveX/RxJS/compare/5.5.0-beta.5...5.5.0-beta.7) (2017-10-13)

(Due to a publish snafu, there is no 5.5.0-beta.6) (womp womp 👎)

### Bug Fixes

- **build:** sourceMaps updated to support CJS properly again ([75f7f11](https://github.com/ReactiveX/RxJS/commit/75f7f11)), closes [#2934](https://github.com/ReactiveX/RxJS/issues/2934)
- **flatMap:** reexport flatMap as alias of mergeMap ([#2920](https://github.com/ReactiveX/RxJS/issues/2920)) ([9922c02](https://github.com/ReactiveX/RxJS/commit/9922c02))
- **publish:** correct the name and republish to sync packages ([464b115](https://github.com/ReactiveX/RxJS/commit/464b115))
- **shareReplay:** no longer exporting function unnecessarily ([#2928](https://github.com/ReactiveX/RxJS/issues/2928)) ([e159578](https://github.com/ReactiveX/RxJS/commit/e159578))
- **shareReplay:** properly uses `lift` ([#2924](https://github.com/ReactiveX/RxJS/issues/2924)) ([3d9cf87](https://github.com/ReactiveX/RxJS/commit/3d9cf87)), closes [#2921](https://github.com/ReactiveX/RxJS/issues/2921)
- **toPromise:** include toPromise in build output ([#2923](https://github.com/ReactiveX/RxJS/issues/2923)) ([f55bfa5](https://github.com/ReactiveX/RxJS/commit/f55bfa5)), closes [#2922](https://github.com/ReactiveX/RxJS/issues/2922)

<a name="5.5.0-beta.5"></a>

# [5.5.0-beta.5](https://github.com/ReactiveX/RxJS/compare/5.5.0-beta.4...v5.5.0-beta.5) (2017-10-06)

### Bug Fixes

- **toPromise:** remove lettable version of toPromise ([031edca](https://github.com/ReactiveX/RxJS/commit/031edca)), closes [#2868](https://github.com/ReactiveX/RxJS/issues/2868)

### Features

- **toPromise:** now exists as a permanent method on Observable ([2e49a5c](https://github.com/ReactiveX/RxJS/commit/2e49a5c))

<a name="5.5.0-beta.4"></a>

# [5.5.0-beta.4](https://github.com/ReactiveX/RxJS/compare/5.5.0-beta.3...v5.5.0-beta.4) (2017-10-06)

### Bug Fixes

- **publish:** fix selector typings ([#2891](https://github.com/ReactiveX/RxJS/issues/2891)) ([9ee234d](https://github.com/ReactiveX/RxJS/commit/9ee234d)), closes [#2889](https://github.com/ReactiveX/RxJS/issues/2889)
- **shareReplay:** properly retains history on subscribe ([#2910](https://github.com/ReactiveX/RxJS/issues/2910)) ([accbcd0](https://github.com/ReactiveX/RxJS/commit/accbcd0)), closes [#2908](https://github.com/ReactiveX/RxJS/issues/2908)
- **subscribeOn:** remove subscribeOn from reexport to support treesha… ([#2899](https://github.com/ReactiveX/RxJS/issues/2899)) ([fb51a02](https://github.com/ReactiveX/RxJS/commit/fb51a02))

<a name="5.5.0-beta.3"></a>

# [5.5.0-beta.3](https://github.com/ReactiveX/RxJS/compare/5.5.0-beta.2...v5.5.0-beta.3) (2017-10-03)

### Bug Fixes

- **build:** revert to 5.4.x build output for CJS & add configurable support for ESM ([#2878](https://github.com/ReactiveX/RxJS/issues/2878)) ([167456a](https://github.com/ReactiveX/RxJS/commit/167456a))
- **concatAll:** use higher-order lettable version of concatAll ([60c96ab](https://github.com/ReactiveX/RxJS/commit/60c96ab))
- **mergeAll:** use higher-order lettable version of mergeAll ([f0b703b](https://github.com/ReactiveX/RxJS/commit/f0b703b))

<a name="5.5.0-beta.2"></a>

# [5.5.0-beta.2](https://github.com/ReactiveX/RxJS/compare/5.5.0-beta.1...v5.5.0-beta.2) (2017-09-27)

### Bug Fixes

- **build:** make CJS references to import X from '../operators' work correctly with SystemJS ([#2874](https://github.com/ReactiveX/RxJS/issues/2874)) ([3dd4cc4](https://github.com/ReactiveX/RxJS/commit/3dd4cc4))

<a name="5.5.0-beta.1"></a>

# [5.5.0-beta.1](https://github.com/ReactiveX/RxJS/compare/5.5.0-beta.0...v5.5.0-beta.1) (2017-09-27)

### Bug Fixes

- **package:** published from a Linux machine to prevent a strange issue where
  the Observable directory was not showing up when installed on some Linux
  environments.
- **build:** fix source maps by adding back sources and fixing path ([#2872](https://github.com/ReactiveX/RxJS/issues/2872)) ([daaf424](https://github.com/ReactiveX/RxJS/commit/daaf424))
- **package:** remove src directory and fix typings location ([#2866](https://github.com/ReactiveX/RxJS/issues/2866)) ([c57eea7](https://github.com/ReactiveX/RxJS/commit/c57eea7))

### Features

- **global:** export lettables as Rx.operators ([#2862](https://github.com/ReactiveX/RxJS/issues/2862)) ([ba2f586](https://github.com/ReactiveX/RxJS/commit/ba2f586)), closes [#2861](https://github.com/ReactiveX/RxJS/issues/2861)

<a name="5.5.0-beta.0"></a>

# [5.5.0-beta.0](https://github.com/ReactiveX/RxJS/compare/5.4.3...5.5.0-beta.0) (2017-09-22)

**Important! Checkout the explanation of the new [lettable operators features here](doc/lettable-operators.md)**

### Bug Fixes

- **package:** correct errors generated during rollup for UMD generation ([#2839](https://github.com/ReactiveX/RxJS/issues/2839)) ([124cc93](https://github.com/ReactiveX/RxJS/commit/124cc93))
- **partition:** update TypeScript signature to match docs and filter operator ([#2819](https://github.com/ReactiveX/RxJS/issues/2819)) ([755df9b](https://github.com/ReactiveX/RxJS/commit/755df9b))
- **subscribeToResult:** throw error in subscriber with inner observable ([d7bffa9](https://github.com/ReactiveX/RxJS/commit/d7bffa9)), closes [#2618](https://github.com/ReactiveX/RxJS/issues/2618)

### Features

- **ajax:** Include the response on instances of AjaxError ([3f6553c](https://github.com/ReactiveX/RxJS/commit/3f6553c))
- **audit:** add higher-order lettable version of audit ([e2daefe](https://github.com/ReactiveX/RxJS/commit/e2daefe))
- **auditTime:** add higher-order lettable version of auditTime ([9e963aa](https://github.com/ReactiveX/RxJS/commit/9e963aa))
- **buffer:** add higher-order lettable version of buffer ([d8ca9de](https://github.com/ReactiveX/RxJS/commit/d8ca9de))
- **bufferCount:** add higher-order lettable version of bufferCount ([0ae2ed5](https://github.com/ReactiveX/RxJS/commit/0ae2ed5))
- **bufferTime:** add higher-order lettable version of bufferTime operator ([0377ca6](https://github.com/ReactiveX/RxJS/commit/0377ca6))
- **bufferToggle:** add higher-order lettable version of bufferToggle ([ea1c3ee](https://github.com/ReactiveX/RxJS/commit/ea1c3ee))
- **bufferWhen:** add higher-order lettable version of bufferWhen ([ec3eceb](https://github.com/ReactiveX/RxJS/commit/ec3eceb))
- **catchError:** add higher-order lettable version of `catch` ([408a2af](https://github.com/ReactiveX/RxJS/commit/408a2af))
- **combineAll:** add higher-order lettable version of combineAll ([97704b3](https://github.com/ReactiveX/RxJS/commit/97704b3))
- **combineLatest:** add higher-order lettable version of combineLatest ([b7154f2](https://github.com/ReactiveX/RxJS/commit/b7154f2))
- **concatMap:** add higher-order lettable version of concatMap ([c4125ff](https://github.com/ReactiveX/RxJS/commit/c4125ff))
- **concatMapTo:** add higher-order lettable version of concatMapTo ([0a6672e](https://github.com/ReactiveX/RxJS/commit/0a6672e))
- **count:** add higher-order lettable version of count ([caf713e](https://github.com/ReactiveX/RxJS/commit/caf713e))
- **debounce:** add higher-order lettable version of debounce ([cb8ce46](https://github.com/ReactiveX/RxJS/commit/cb8ce46))
- **debounceTime:** add higher-order lettable version of debounceTime ([df0d439](https://github.com/ReactiveX/RxJS/commit/df0d439))
- **delay:** add higher-order lettable version of delay ([7efb803](https://github.com/ReactiveX/RxJS/commit/7efb803))
- **delayWhen:** add higher-order lettable version of delayWhen ([cb91c3f](https://github.com/ReactiveX/RxJS/commit/cb91c3f))
- **dematerialize:** add higher-order lettable version of dematerialize ([b5948f9](https://github.com/ReactiveX/RxJS/commit/b5948f9))
- **distinct:** add higher-order lettable version of distinct ([0429a69](https://github.com/ReactiveX/RxJS/commit/0429a69))
- **distinctUntilChanged:** add higher-order lettable version of distinctUntilChanged ([b2725e7](https://github.com/ReactiveX/RxJS/commit/b2725e7))
- **distinctUntilKeyChanged:** add higher-order lettable version of distinctUntilKeyChanged ([9db141c](https://github.com/ReactiveX/RxJS/commit/9db141c))
- **elementAt:** add higher-order lettable version of elementAt ([b8e956b](https://github.com/ReactiveX/RxJS/commit/b8e956b))
- **every:** add higher-order lettable version of every ([13f3503](https://github.com/ReactiveX/RxJS/commit/13f3503))
- **exhaust:** add higher-order lettable version of exhaust ([b145dca](https://github.com/ReactiveX/RxJS/commit/b145dca))
- **exhaustMap:** add higher-order lettable exhaustMap ([b134e0c](https://github.com/ReactiveX/RxJS/commit/b134e0c))
- **expand:** add higher-order lettable expand ([6ec8a19](https://github.com/ReactiveX/RxJS/commit/6ec8a19))
- **filter:** add higher-order lettable version of filter ([2848556](https://github.com/ReactiveX/RxJS/commit/2848556))
- **finalize:** add higher-order lettable version of finally, called finalize ([cfeae9f](https://github.com/ReactiveX/RxJS/commit/cfeae9f))
- **find:** add higher-order lettable version of find ([ff6d5af](https://github.com/ReactiveX/RxJS/commit/ff6d5af))
- **findIndex:** add higher-order lettable findIndex ([40e680e](https://github.com/ReactiveX/RxJS/commit/40e680e))
- **first:** add higher-order lettable first ([33eac1e](https://github.com/ReactiveX/RxJS/commit/33eac1e))
- **groupBy:** add higher-order lettable groupBy ([5281229](https://github.com/ReactiveX/RxJS/commit/5281229))
- **ignoreElements:** add higher-order lettable version of ignoreElements ([68286d4](https://github.com/ReactiveX/RxJS/commit/68286d4))
- **isEmpty:** add higher-order lettable version of isEmpty ([aad1833](https://github.com/ReactiveX/RxJS/commit/aad1833))
- **last:** add higher-order lettable version of last ([bf33b97](https://github.com/ReactiveX/RxJS/commit/bf33b97))
- **lettables:** add higher-order lettable versions of concat, concatAll, mergeAll ([d7e8be7](https://github.com/ReactiveX/RxJS/commit/d7e8be7))
- **map:** add higher-order lettable map operator ([ce40b2d](https://github.com/ReactiveX/RxJS/commit/ce40b2d))
- **mapTo:** add higher-order lettable version of mapTo ([e97530f](https://github.com/ReactiveX/RxJS/commit/e97530f))
- **materialize:** add higher-order lettable materialize operator ([ce42477](https://github.com/ReactiveX/RxJS/commit/ce42477))
- **merge:** add higher-order lettable version of merge ([#2809](https://github.com/ReactiveX/RxJS/issues/2809)) ([3136403](https://github.com/ReactiveX/RxJS/commit/3136403))
- **mergeMap:** add higher-order lettable version of mergeMap ([417efde](https://github.com/ReactiveX/RxJS/commit/417efde))
- **mergeMapTo:** add higher-order lettable version of mergeMapTo ([653b47a](https://github.com/ReactiveX/RxJS/commit/653b47a))
- **mergeScan:** add higher-order lettable version of mergeScan ([fde7205](https://github.com/ReactiveX/RxJS/commit/fde7205))
- **multicast:** add higher-order lettable variant of multicast ([fb6014d](https://github.com/ReactiveX/RxJS/commit/fb6014d))
- **observeOn:** add higher-order lettable version of observeOn ([feb0f5a](https://github.com/ReactiveX/RxJS/commit/feb0f5a))
- **onErrorResumeNext:** add higher-order lettable version of onErrorResumeNext ([badec6a](https://github.com/ReactiveX/RxJS/commit/badec6a))
- **operators:** higher-order lettables of reduce, min, max and defaultIfEmpty added ([9974fc2](https://github.com/ReactiveX/RxJS/commit/9974fc2))
- **package:** rxjs distribution now supports main, module and es2015 keys in package.json ([988e1af](https://github.com/ReactiveX/RxJS/commit/988e1af))
- **pairwise:** add higher-order lettable version of pairwise ([bb21a44](https://github.com/ReactiveX/RxJS/commit/bb21a44))
- **partition:** add higher-order lettable version of partition ([595e588](https://github.com/ReactiveX/RxJS/commit/595e588))
- **pipe:** add pipe method ot Observable ([9f6312d](https://github.com/ReactiveX/RxJS/commit/9f6312d))
- **pipe:** add pipe utility function([42f9daf](https://github.com/ReactiveX/RxJS/commit/42f9daf))
- **pluck:** add higher-order lettable version of pluck ([8ab0914](https://github.com/ReactiveX/RxJS/commit/8ab0914))
- **publish:** add higher-order lettable variant of publish ([4ccf794](https://github.com/ReactiveX/RxJS/commit/4ccf794))
- **publishBehavior:** add higher-order lettable version of publishBehavior ([e911aef](https://github.com/ReactiveX/RxJS/commit/e911aef))
- **publishLast:** add higher-order lettable version of publishLast ([684728c](https://github.com/ReactiveX/RxJS/commit/684728c))
- **publishReplay:** add higher-order lettable version of publishReplay ([2958917](https://github.com/ReactiveX/RxJS/commit/2958917))
- **race:** add higher-order lettable version of race ([e646851](https://github.com/ReactiveX/RxJS/commit/e646851))
- **refCount:** add higher-order lettable version of refCount ([21fba63](https://github.com/ReactiveX/RxJS/commit/21fba63))
- **repeat:** add higher-order lettable version of repeat ([8473fe5](https://github.com/ReactiveX/RxJS/commit/8473fe5))
- **repeatWhen:** add higher-order lettable version of repeatWhen ([1d1cecd](https://github.com/ReactiveX/RxJS/commit/1d1cecd))
- **retry:** add higher-order lettable version of retry ([28e9b13](https://github.com/ReactiveX/RxJS/commit/28e9b13))
- **retryWhen:** add higher-order lettable version of retryWhen ([1290e3c](https://github.com/ReactiveX/RxJS/commit/1290e3c))
- **sample:** add higher-order lettable version of sample ([8c73e6e](https://github.com/ReactiveX/RxJS/commit/8c73e6e))
- **sampleTime:** add higher-order lettable version of sampleTime ([ba6a9ce](https://github.com/ReactiveX/RxJS/commit/ba6a9ce))
- **scan:** add higher-order lettable version of scan ([2cc5d75](https://github.com/ReactiveX/RxJS/commit/2cc5d75))
- **sequenceEqual:** add higher-order lettable version of sequenceEqual ([7cd3165](https://github.com/ReactiveX/RxJS/commit/7cd3165))
- **share:** add higher-order lettable version of share ([f10c42e](https://github.com/ReactiveX/RxJS/commit/f10c42e))
- **shareReplay:** add higher-order lettable version of shareReplay ([e8be197](https://github.com/ReactiveX/RxJS/commit/e8be197))
- **single:** add higher-order lettable version of single ([3bc050a](https://github.com/ReactiveX/RxJS/commit/3bc050a))
- **skip:** add higher-order lettable version of skip ([baed383](https://github.com/ReactiveX/RxJS/commit/baed383))
- **skipLast:** add higher-order lettable version of skipLast ([6e1ff3c](https://github.com/ReactiveX/RxJS/commit/6e1ff3c))
- **skipUntil:** add higher-order lettable version of skipUntil ([6cc2cd6](https://github.com/ReactiveX/RxJS/commit/6cc2cd6))
- **skipWhile:** add higher-order lettable version of skipWhile ([76d8ffa](https://github.com/ReactiveX/RxJS/commit/76d8ffa))
- **subscribeOn:** add higher-order lettable version of subscribeOn ([866af37](https://github.com/ReactiveX/RxJS/commit/866af37))
- **switchAll:** add higher-order lettable version of switch ([2f12572](https://github.com/ReactiveX/RxJS/commit/2f12572))
- **switchMap:** add higher-order lettable version of switchMap ([b6e5b56](https://github.com/ReactiveX/RxJS/commit/b6e5b56))
- **switchMapTo:** add higher-order lettable version of switchMapTo ([2640184](https://github.com/ReactiveX/RxJS/commit/2640184))
- **take:** add higher-order lettable version of take ([089a5a6](https://github.com/ReactiveX/RxJS/commit/089a5a6))
- **takeLast:** add higher-order lettable version of takeLast ([cd7e7dd](https://github.com/ReactiveX/RxJS/commit/cd7e7dd))
- **takeUntil:** add higher-order lettable version of takeUntil ([bb2ddaa](https://github.com/ReactiveX/RxJS/commit/bb2ddaa))
- **takeWhile:** add higher-order lettable version of takeWhile ([f86c862](https://github.com/ReactiveX/RxJS/commit/f86c862))
- **tap:** add higher-order lettable version of do ([f85c60e](https://github.com/ReactiveX/RxJS/commit/f85c60e))
- **throttle:** add higher-order lettable version of throttle ([e4dd1fd](https://github.com/ReactiveX/RxJS/commit/e4dd1fd))
- **throttleTime:** add higher-order lettable version of throttleTime ([34a592d](https://github.com/ReactiveX/RxJS/commit/34a592d))
- **timeInterval:** add higher-order lettable version of timeInterval ([fcad034](https://github.com/ReactiveX/RxJS/commit/fcad034))
- **timeout:** add higher-order lettable version of timeout ([2546750](https://github.com/ReactiveX/RxJS/commit/2546750))
- **timeoutWith:** add higher-order lettable version of timeoutWith ([bd7f5ed](https://github.com/ReactiveX/RxJS/commit/bd7f5ed))
- **timestamp:** add higher-order lettable version of timestamp ([a780bf2](https://github.com/ReactiveX/RxJS/commit/a780bf2))
- **toArray:** add higher-order lettable version of toArray ([82480cf](https://github.com/ReactiveX/RxJS/commit/82480cf))
- **toArray:** add higher-order lettable version of toArray ([a03a50c](https://github.com/ReactiveX/RxJS/commit/a03a50c))
- **toPromise:** add higher-order lettable version of toPromise ([1627da2](https://github.com/ReactiveX/RxJS/commit/1627da2))
- **window:** add higher-order lettable version of window ([9f6373e](https://github.com/ReactiveX/RxJS/commit/9f6373e))
- **windowCount:** add higher-order lettable version of windowCount ([2a9e54c](https://github.com/ReactiveX/RxJS/commit/2a9e54c))
- **windowTime:** add higher-order lettable version of windowTime ([29ffa1b](https://github.com/ReactiveX/RxJS/commit/29ffa1b))
- **windowToggle:** add higher-order lettable version of windowToggle ([81ec389](https://github.com/ReactiveX/RxJS/commit/81ec389))
- **windowWhen:** add higher-order lettable version of windowWhen ([0b73208](https://github.com/ReactiveX/RxJS/commit/0b73208))
- **withLatestFrom:** add higher-order lettable version of withLatestFrom ([509c97c](https://github.com/ReactiveX/RxJS/commit/509c97c))
- **zip:** add higher-order lettable version of zip ([8a9b9b2](https://github.com/ReactiveX/RxJS/commit/8a9b9b2))
- **zipAll:** add higher-order lettable version of zipAll ([f6bd51f](https://github.com/ReactiveX/RxJS/commit/f6bd51f))

<a name="5.4.3"></a>

## [5.4.3](https://github.com/ReactiveX/RxJS/compare/5.4.2...v5.4.3) (2017-08-10)

### Bug Fixes

- **compilation:** compiles under typescript 2.4.2 ([#2780](https://github.com/ReactiveX/RxJS/issues/2780)) ([d2a32f9](https://github.com/ReactiveX/RxJS/commit/d2a32f9))
- **exports:** add exports for missing static operators: generate, ([08c4196](https://github.com/ReactiveX/RxJS/commit/08c4196))

<a name="5.4.2"></a>

## [5.4.2](https://github.com/ReactiveX/RxJS/compare/5.4.1...v5.4.2) (2017-07-05)

### Bug Fixes

- **Notification:** Don't reference `this` from static methods. ([9f8e375](https://github.com/ReactiveX/RxJS/commit/9f8e375))
- **Subject:** lift signature is now appropriate for stricter TypeScript 2.4 checks ([#2722](https://github.com/ReactiveX/RxJS/issues/2722)) ([9804de7](https://github.com/ReactiveX/RxJS/commit/9804de7))

<a name="5.4.1"></a>

## [5.4.1](https://github.com/ReactiveX/RxJS/compare/5.4.0...v5.4.1) (2017-06-14)

### Bug Fixes

- **ajax:** Only set timeout & responseType if request is asynchronous ([#2486](https://github.com/ReactiveX/RxJS/issues/2486)) ([380fbcf](https://github.com/ReactiveX/RxJS/commit/380fbcf))
- **audit:** will now properly mirror source if durations are Observable.empty() ([#2595](https://github.com/ReactiveX/RxJS/issues/2595)) ([6ded82e](https://github.com/ReactiveX/RxJS/commit/6ded82e))
- **elementAt:** will now properly unsubscribe when it completes or errors ([#2501](https://github.com/ReactiveX/RxJS/issues/2501)) ([a400cab](https://github.com/ReactiveX/RxJS/commit/a400cab))
- **ErrorObservable:** will now propagate errors properly when used in a `catch` after `fromPromise`. ([#2552](https://github.com/ReactiveX/RxJS/issues/2552)) ([cf88a20](https://github.com/ReactiveX/RxJS/commit/cf88a20))
- **groupBy:** group duration notifiers will now properly unsubscribe and clean up ([#2662](https://github.com/ReactiveX/RxJS/issues/2662)) ([ab92083](https://github.com/ReactiveX/RxJS/commit/ab92083)), closes [#2660](https://github.com/ReactiveX/RxJS/issues/2660) [#2661](https://github.com/ReactiveX/RxJS/issues/2661)
- **Observable:** errors thrown in observer/handlers without an operator applied will no longer be swallowed ([#2626](https://github.com/ReactiveX/RxJS/issues/2626)) ([c250afc](https://github.com/ReactiveX/RxJS/commit/c250afc)), closes [#2565](https://github.com/ReactiveX/RxJS/issues/2565)
- **reduce:** type definitions overloads for TypeScript are now in proper order ([#2523](https://github.com/ReactiveX/RxJS/issues/2523)) ([ccc0647](https://github.com/ReactiveX/RxJS/commit/ccc0647))
- **Schedulers:** Fix issue where canceling an asap or animationFrame action early could throw ([#2638](https://github.com/ReactiveX/RxJS/issues/2638)) ([fc39043](https://github.com/ReactiveX/RxJS/commit/fc39043))

<a name="5.4.0"></a>

# [5.4.0](https://github.com/ReactiveX/RxJS/) (2017-05-09)

### Features

- **shareReplay:** adds `shareReplay` variant of `publishReplay` ([#2443](https://github.com/ReactiveX/RxJS/issues/2443)) ([5a2266a](https://github.com/ReactiveX/RxJS/commit/5a2266a))
- **skipLast:** add skipLast operator ([#2316](https://github.com/ReactiveX/RxJS/issues/2316)) ([4ffbbe5](https://github.com/ReactiveX/RxJS/commit/4ffbbe5)), closes [#1404](https://github.com/ReactiveX/RxJS/issues/1404)
- **TypeScript:** fromPromise accepts PromiseLike object ([#2505](https://github.com/ReactiveX/RxJS/issues/2505)) ([ade1fd5](https://github.com/ReactiveX/RxJS/commit/ade1fd5))

<a name="5.3.3"></a>

## [5.3.3](https://github.com/ReactiveX/RxJS/compare/5.3.1...5.3.3) (2017-05-09)

### Bug Fixes

- **delayWhen:** correctly handle synchronous duration observable ([#2589](https://github.com/ReactiveX/RxJS/issues/2589)) ([695f280](https://github.com/ReactiveX/RxJS/commit/695f280)), closes [#2587](https://github.com/ReactiveX/RxJS/issues/2587)
- **race:** allow TypeScript support for array of observables other than rest param ([#2548](https://github.com/ReactiveX/RxJS/issues/2548)) ([ace553c](https://github.com/ReactiveX/RxJS/commit/ace553c))
- **Subscriber:** do not call complete with undefined value param ([#2559](https://github.com/ReactiveX/RxJS/issues/2559)) ([3d63de2](https://github.com/ReactiveX/RxJS/commit/3d63de2))

**(NOTE: 5.3.2 was a broken release and was removed)**

<a name="5.3.1"></a>

## [5.3.1](https://github.com/ReactiveX/RxJS/compare/5.3.0...v5.3.1) (2017-05-02)

### Bug Fixes

- **AsyncAction:** rescheduling an action with the same delay before it has executed will now schedule appropriately. ([#2580](https://github.com/ReactiveX/RxJS/issues/2580)) ([281760e](https://github.com/ReactiveX/RxJS/commit/281760e))
- **closure:** make root.ts work with closure ([#2546](https://github.com/ReactiveX/RxJS/issues/2546)) ([0ecf55d](https://github.com/ReactiveX/RxJS/commit/0ecf55d))
- **tests:** add missing babel-polyfill to package.json ([b277ce9](https://github.com/ReactiveX/RxJS/commit/b277ce9)), closes [#2261](https://github.com/ReactiveX/RxJS/issues/2261)
- **withLatestFrom:** change from hot to cold observable in marble test ([0c65446](https://github.com/ReactiveX/RxJS/commit/0c65446)), closes [#2526](https://github.com/ReactiveX/RxJS/issues/2526)

<a name="5.3.0"></a>

# [5.3.0](https://github.com/ReactiveX/RxJS/compare/5.2.0...v5.3.0) (2017-04-03)

### Bug Fixes

- **catch:** return type is now the union of input types ([#2478](https://github.com/ReactiveX/RxJS/issues/2478)) ([840def0](https://github.com/ReactiveX/RxJS/commit/840def0))
- **forEach:** fix a temporal dead zone issue in forEach. ([#2474](https://github.com/ReactiveX/RxJS/issues/2474)) ([e9e9801](https://github.com/ReactiveX/RxJS/commit/e9e9801))
- **multicast:** Ensure ConnectableObservables returned by multicast are state-isolated. ([aaa9e6b](https://github.com/ReactiveX/RxJS/commit/aaa9e6b))
- **reduce:** proper TypeScript signature overload ordering ([#2382](https://github.com/ReactiveX/RxJS/issues/2382)) ([f6a4951](https://github.com/ReactiveX/RxJS/commit/f6a4951)), closes [#2338](https://github.com/ReactiveX/RxJS/issues/2338)
- **SafeSubscriber:** SafeSubscriber shouldn't mutate incoming Observers. ([a1778e0](https://github.com/ReactiveX/RxJS/commit/a1778e0))
- **timeout:** Cancels scheduled timeout, if no longer needed ([3e9d529](https://github.com/ReactiveX/RxJS/commit/3e9d529)), closes [#2134](https://github.com/ReactiveX/RxJS/issues/2134) [#2244](https://github.com/ReactiveX/RxJS/issues/2244) [#2355](https://github.com/ReactiveX/RxJS/issues/2355) [#2347](https://github.com/ReactiveX/RxJS/issues/2347) [#2353](https://github.com/ReactiveX/RxJS/issues/2353) [#2254](https://github.com/ReactiveX/RxJS/issues/2254) [#2372](https://github.com/ReactiveX/RxJS/issues/2372) [#1301](https://github.com/ReactiveX/RxJS/issues/1301)
- **zipAll:** complete when the source is empty ([712fece](https://github.com/ReactiveX/RxJS/commit/712fece))

### Features

- **delayWhen:** add index to the selector function ([5d6291e](https://github.com/ReactiveX/RxJS/commit/5d6291e))
- **symbol exports:** symbols now also exported without `$$` prefix to work with Babel UMD exporting ([#2435](https://github.com/ReactiveX/RxJS/issues/2435)) ([747bef6](https://github.com/ReactiveX/RxJS/commit/747bef6)), closes [#2415](https://github.com/ReactiveX/RxJS/issues/2415)

### Performance Improvements

- **bufferCount:** optimize bufferCount operator ([#2359](https://github.com/ReactiveX/RxJS/issues/2359)) ([28d0883](https://github.com/ReactiveX/RxJS/commit/28d0883))

### April Fools

- **smooth:** `smooth()` was never really a thing. Sorry, folks. :D

<a name="5.2.0"></a>

# [5.2.0](https://github.com/ReactiveX/RxJS/compare/5.1.1...v5.2.0) (2017-02-21)

### Bug Fixes

- **ajax:** will set `withCredentials` after `open` on XHR for IE10 ([#2332](https://github.com/ReactiveX/RxJS/issues/2332)) ([0ab1d3b](https://github.com/ReactiveX/RxJS/commit/0ab1d3b))
- **bindCallback:** emit undefined when callback is without arguments ([915a2a8](https://github.com/ReactiveX/RxJS/commit/915a2a8))
- **bindNodeCallback:** emit undefined when callback has no success arguments ([8b81fc6](https://github.com/ReactiveX/RxJS/commit/8b81fc6)), closes [#2254](https://github.com/ReactiveX/RxJS/issues/2254)
- **bindNodeCallback:** errors thrown in callback will be scheduled if a scheduler is provided ([#2344](https://github.com/ReactiveX/RxJS/issues/2344)) ([82ec4f1](https://github.com/ReactiveX/RxJS/commit/82ec4f1))
- **concat:** will now return Observable when given a single object implementing Symbol.observable ([#2387](https://github.com/ReactiveX/RxJS/issues/2387)) ([f5d035a](https://github.com/ReactiveX/RxJS/commit/f5d035a))
- **ErrorObservable:** remove type constraint to error value ([2f951cd](https://github.com/ReactiveX/RxJS/commit/2f951cd)), closes [#2395](https://github.com/ReactiveX/RxJS/issues/2395)
- **forkJoin:** add type signature for single observable with selector ([7983b91](https://github.com/ReactiveX/RxJS/commit/7983b91)), closes [#2347](https://github.com/ReactiveX/RxJS/issues/2347)
- **merge:** return Observable when called with single lowerCaseO ([85752eb](https://github.com/ReactiveX/RxJS/commit/85752eb))
- **mergeAll:** introduce variant support <T, R> for mergeMap ([656f2b3](https://github.com/ReactiveX/RxJS/commit/656f2b3)), closes [#2372](https://github.com/ReactiveX/RxJS/issues/2372)
- **single:** predicate function receives indices starting at 0 ([#2396](https://github.com/ReactiveX/RxJS/issues/2396)) ([c81882f](https://github.com/ReactiveX/RxJS/commit/c81882f))
- **subscribeToResult:** accept array-like as result ([14685ba](https://github.com/ReactiveX/RxJS/commit/14685ba))

### Features

- **webSocket:** Add binaryType to config object ([86acbd1](https://github.com/ReactiveX/RxJS/commit/86acbd1)), closes [#2353](https://github.com/ReactiveX/RxJS/issues/2353)
- **windowTime:** maxWindowSize parameter in windowTime operator ([381be3f](https://github.com/ReactiveX/RxJS/commit/381be3f)), closes [#1301](https://github.com/ReactiveX/RxJS/issues/1301)

<a name="5.1.1"></a>

## [5.1.1](https://github.com/ReactiveX/RxJS/compare/5.1.0...v5.1.1) (2017-02-13)

### Bug Fixes

- **bindCallback:** input function context can now be properly set via output function ([#2319](https://github.com/ReactiveX/RxJS/issues/2319)) ([cb91c76](https://github.com/ReactiveX/RxJS/commit/cb91c76))
- **bindNodeCallback:** input function context can now be properly set via output function ([#2320](https://github.com/ReactiveX/RxJS/issues/2320)) ([3ec315d](https://github.com/ReactiveX/RxJS/commit/3ec315d))
- **Subscription:** fold ChildSubscription logic into Subscriber to prevent operators from leaking ChildSubscriptions. ([#2360](https://github.com/ReactiveX/RxJS/issues/2360)) ([22e4c17](https://github.com/ReactiveX/RxJS/commit/22e4c17)), closes [#2244](https://github.com/ReactiveX/RxJS/issues/2244) [#2355](https://github.com/ReactiveX/RxJS/issues/2355)

<a name="5.1.0"></a>

# [5.1.0](https://github.com/ReactiveX/RxJS/compare/5.0.3...v5.1.0) (2017-02-01)

### Bug Fixes

- **catch:** update the catch operator to dispose inner subscriptions if the catch subscription is di ([#2271](https://github.com/ReactiveX/RxJS/issues/2271)) ([8a1e089](https://github.com/ReactiveX/RxJS/commit/8a1e089))
- **combineLatest:** Don't mutate array of observables passed to ([#2276](https://github.com/ReactiveX/RxJS/issues/2276)) ([9b73c46](https://github.com/ReactiveX/RxJS/commit/9b73c46))
- **ISubscription:** update type definition of ISubscription::closed ([#2249](https://github.com/ReactiveX/RxJS/issues/2249)) ([0c304a2](https://github.com/ReactiveX/RxJS/commit/0c304a2))
- **Observable:** Ensure the generic type of the Observer passed to Observable's initializer function is the same. ([51a0bc1](https://github.com/ReactiveX/RxJS/commit/51a0bc1)), closes [#2166](https://github.com/ReactiveX/RxJS/issues/2166)
- **Observable:** errors thrown during subscription are now properly sent down error channel ([#2313](https://github.com/ReactiveX/RxJS/issues/2313)) ([d4a9aac](https://github.com/ReactiveX/RxJS/commit/d4a9aac)), closes [#1833](https://github.com/ReactiveX/RxJS/issues/1833)
- **reduce:** index will properly start at 1 if no seed is provided, to match native Array reduce behavior ([30a4ca4](https://github.com/ReactiveX/RxJS/commit/30a4ca4)), closes [#2290](https://github.com/ReactiveX/RxJS/issues/2290)
- **repeatWhen:** resulting observable will wait for the source to complete, even if a hot notifier completes first. ([#2209](https://github.com/ReactiveX/RxJS/issues/2209)) ([c65a098](https://github.com/ReactiveX/RxJS/commit/c65a098)), closes [#2054](https://github.com/ReactiveX/RxJS/issues/2054)
- **Subject:** ensure subject properly throws ObjectUnsubscribedError when unsubscribed then resubscribed to ([#2318](https://github.com/ReactiveX/RxJS/issues/2318)) ([41489eb](https://github.com/ReactiveX/RxJS/commit/41489eb))
- **TestScheduler:** helper methods return proper types, `HotObservable` and `ColdObservable` instead of Observable ([#2305](https://github.com/ReactiveX/RxJS/issues/2305)) ([758aae9](https://github.com/ReactiveX/RxJS/commit/758aae9))
- **windowTime:** ensure windows created when only a timespan is passed are closed and cleaned up properly. ([#2278](https://github.com/ReactiveX/RxJS/issues/2278)) ([d4533c4](https://github.com/ReactiveX/RxJS/commit/d4533c4))

### Features

- **fromEventPattern:** support optional removeHandler ([86960c2](https://github.com/ReactiveX/RxJS/commit/86960c2))
- **fromEventPattern:** support pass signal from addHandler to removeHandler ([01d0622](https://github.com/ReactiveX/RxJS/commit/01d0622))

<a name="5.0.3"></a>

## [5.0.3](https://github.com/ReactiveX/RxJS/compare/5.0.2...v5.0.3) (2017-01-05)

### Bug Fixes

- **observeOn:** seal memory leak involving old notifications ([9664a38](https://github.com/ReactiveX/RxJS/commit/9664a38)), closes [#2244](https://github.com/ReactiveX/RxJS/issues/2244)
- **Subscription:** `add` will return Subscription that `remove`s itself when unsubscribed ([375d4a5](https://github.com/ReactiveX/RxJS/commit/375d4a5))
- **TypeScript:** interfaces that accepted `Scheduler` now accept `IScheduler` interface ([a0d28a8](https://github.com/ReactiveX/RxJS/commit/a0d28a8))

<a name="5.0.2"></a>

## [5.0.2](https://github.com/ReactiveX/RxJS/compare/5.0.1...v5.0.2) (2016-12-23)

### Bug Fixes

- **ajax:** upload progress is now set correctly ([#2200](https://github.com/ReactiveX/RxJS/issues/2200)) ([1a83041](https://github.com/ReactiveX/RxJS/commit/1a83041))
- **groupBy:** Fix groupBy to dispose of outer subscription. ([#2201](https://github.com/ReactiveX/RxJS/issues/2201)) ([2269618](https://github.com/ReactiveX/RxJS/commit/2269618))

<a name="5.0.1"></a>

## [5.0.1](https://github.com/ReactiveX/RxJS/compare/5.0.0...v5.0.1) (2016-12-13)

### Bug Fixes

- **TypeScript:** pin to TypeScript 2.0.x, fix errors with Error subclassing ([300504c](https://github.com/ReactiveX/RxJS/commit/300504c))

<a name="5.0.0"></a>

# [5.0.0](https://github.com/ReactiveX/RxJS/compare/5.0.0-rc.5...v5.0.0) (2016-12-13)

### Bug Fixes

- **race:** unsubscribe raced observables with immediate scheduler ([#2158](https://github.com/ReactiveX/RxJS/issues/2158)) ([7dd533b](https://github.com/ReactiveX/RxJS/commit/7dd533b))
- **SubscribeOnObservable:** Add the source subscription to the action disposable so the source will ([64e3815](https://github.com/ReactiveX/RxJS/commit/64e3815))

<a name="5.0.0-rc.5"></a>

# [5.0.0-rc.5](https://github.com/ReactiveX/RxJS/compare/5.0.0-rc.4...v5.0.0-rc.5) (2016-12-07)

### Bug Fixes

- **AjaxObservable:** catch XHR send failures to observer ([#2159](https://github.com/ReactiveX/RxJS/issues/2159)) ([128fb9c](https://github.com/ReactiveX/RxJS/commit/128fb9c))
- **distinctKey:** Removed accidental leftover reference of `distinctKey` ([9fd8096](https://github.com/ReactiveX/RxJS/commit/9fd8096)), closes [#2161](https://github.com/ReactiveX/RxJS/issues/2161)
- **errors:** Better error message when you return non-observable things, ([#2152](https://github.com/ReactiveX/RxJS/issues/2152)) ([86a909c](https://github.com/ReactiveX/RxJS/commit/86a909c)), closes [#215](https://github.com/ReactiveX/RxJS/issues/215)
- **event:** uses `Object.prototype.toString.call` on objects ([#2143](https://github.com/ReactiveX/RxJS/issues/2143)) ([e036e79](https://github.com/ReactiveX/RxJS/commit/e036e79))
- **typings:** type guard support for `last`, `first`, `find` and `filter`. ([5f2e849](https://github.com/ReactiveX/RxJS/commit/5f2e849))

### Features

- **timeout:** remove `errorToSend` argument, always throw TimeoutError ([#2172](https://github.com/ReactiveX/RxJS/issues/2172)) ([98ea3d2](https://github.com/ReactiveX/RxJS/commit/98ea3d2))

### BREAKING CHANGES

- timeout: `timeout` no longer accepts the `errorToSend` argument

related #2141

<a name="5.0.0-rc.4"></a>

# [5.0.0-rc.4](https://github.com/ReactiveX/RxJS/compare/5.0.0-rc.3...v5.0.0-rc.4) (2016-11-19)

### Bug Fixes

- **partition:** handles `thisArg` as expected ([#2138](https://github.com/ReactiveX/RxJS/issues/2138)) ([6cf7296](https://github.com/ReactiveX/RxJS/commit/6cf7296))
- **timeout:** throw traceable TimeoutError ([#2132](https://github.com/ReactiveX/RxJS/issues/2132)) ([9ebc46b](https://github.com/ReactiveX/RxJS/commit/9ebc46b))

<a name="5.0.0-rc.3"></a>

# [5.0.0-rc.3](https://github.com/ReactiveX/RxJS/compare/5.0.0-rc.2...v5.0.0-rc.3) (2016-11-15)

### Bug Fixes

- **typings:** You no longer have to install the type definition for chai ([#2112](https://github.com/ReactiveX/rxjs/issues/2112))

### Features

- **filter:** support type guards without casting ([68b7922](https://github.com/ReactiveX/RxJS/commit/68b7922))
- **find:** support type guards without casting ([9058bf6](https://github.com/ReactiveX/RxJS/commit/9058bf6))
- **first:** support type guards without casting ([3aa1988](https://github.com/ReactiveX/RxJS/commit/3aa1988))
- **last:** support type guards without casting ([07ecd5e](https://github.com/ReactiveX/RxJS/commit/07ecd5e))

<a name="5.0.0-rc.2"></a>

# [5.0.0-rc.2](https://github.com/ReactiveX/RxJS/compare/5.0.0-rc.1...v5.0.0-rc.2) (2016-11-05)

### Bug Fixes

- **AjaxObservable:** remove needless type param R from AjaxObservable.getJSON() ([#2069](https://github.com/ReactiveX/RxJS/issues/2069)) ([0c3d4a4](https://github.com/ReactiveX/RxJS/commit/0c3d4a4))
- **bufferCount:** will behave as expected when `startBufferEvery` is less than `bufferSize` ([#2076](https://github.com/ReactiveX/RxJS/issues/2076)) ([d13dbb4](https://github.com/ReactiveX/RxJS/commit/d13dbb4)), closes [#2062](https://github.com/ReactiveX/RxJS/issues/2062)
- **build_docs:** fix doc building ([#1974](https://github.com/ReactiveX/RxJS/issues/1974)) ([1bbbe8b](https://github.com/ReactiveX/RxJS/commit/1bbbe8b))
- **ErrorObservable:** Add generic error type for ErrorObservable. ([#2071](https://github.com/ReactiveX/RxJS/issues/2071)) ([9df86ba](https://github.com/ReactiveX/RxJS/commit/9df86ba))
- **first:** will now only emit one value in recursive cases ([#2100](https://github.com/ReactiveX/RxJS/issues/2100)) ([a047e7a](https://github.com/ReactiveX/RxJS/commit/a047e7a)), closes [#2098](https://github.com/ReactiveX/RxJS/issues/2098)
- **fromEvent:** Throw if event target is invalid ([#2107](https://github.com/ReactiveX/RxJS/issues/2107)) ([147ce3e](https://github.com/ReactiveX/RxJS/commit/147ce3e))
- **IteratorObservable:** clarify the return type of IteratorObservable.create() ([#2070](https://github.com/ReactiveX/RxJS/issues/2070)) ([4f0f865](https://github.com/ReactiveX/RxJS/commit/4f0f865))
- **IteratorObservable:** Observables `from` generators will now finalize when subscription ends ([22d286a](https://github.com/ReactiveX/RxJS/commit/22d286a)), closes [#1938](https://github.com/ReactiveX/RxJS/issues/1938)
- **multicast:** fix a bug that caused multicast to omit messages after termination ([#2021](https://github.com/ReactiveX/RxJS/issues/2021)) ([44fbc14](https://github.com/ReactiveX/RxJS/commit/44fbc14))
- **Notification:** `materialize` output will now match Rx4 ([#2106](https://github.com/ReactiveX/RxJS/issues/2106)) ([c83bab9](https://github.com/ReactiveX/RxJS/commit/c83bab9)), closes [#2105](https://github.com/ReactiveX/RxJS/issues/2105)
- **Object.assign:** stop polyfilling Object assign ([#2080](https://github.com/ReactiveX/RxJS/issues/2080)) ([b5f8ab3](https://github.com/ReactiveX/RxJS/commit/b5f8ab3))
- **Observable/Ajax:** mount properties to origin readystatechange fn ([#2025](https://github.com/ReactiveX/RxJS/issues/2025)) ([76a9abb](https://github.com/ReactiveX/RxJS/commit/76a9abb))
- **operator/do:** fix typings ([9a40297](https://github.com/ReactiveX/RxJS/commit/9a40297))
- **reduce/scan:** both scan/reduce operators now accepts `undefined` itself as a valid seed ([#2050](https://github.com/ReactiveX/RxJS/issues/2050)) ([fee7585](https://github.com/ReactiveX/RxJS/commit/fee7585)), closes [#2047](https://github.com/ReactiveX/RxJS/issues/2047)
- **ReplaySubject:** observer now subscribed prior to running subscription function ([#2046](https://github.com/ReactiveX/RxJS/issues/2046)) ([fea08e9](https://github.com/ReactiveX/RxJS/commit/fea08e9)), closes [#2044](https://github.com/ReactiveX/RxJS/issues/2044)
- **sample:** source is now subscribed to before the notifier ([ffe99e8](https://github.com/ReactiveX/RxJS/commit/ffe99e8)), closes [#2075](https://github.com/ReactiveX/RxJS/issues/2075)
- **Symbol.iterator:** will not polyfill Symbol iterator unless Symbol exists ([#2082](https://github.com/ReactiveX/RxJS/issues/2082)) ([1138c99](https://github.com/ReactiveX/RxJS/commit/1138c99))
- **typings:** fixed Subject<T>.lift to have the same shape as Observable<T>.lift ([b07f597](https://github.com/ReactiveX/RxJS/commit/b07f597))
- **WebSocketSubject.prototype.multiplex:** no longer nulls out socket after first unsubscribe ([#2039](https://github.com/ReactiveX/RxJS/issues/2039)) ([a5e9cfe](https://github.com/ReactiveX/RxJS/commit/a5e9cfe)), closes [#2037](https://github.com/ReactiveX/RxJS/issues/2037)

### Features

- **distinct:** remove `distinctKey`, `distinct` signature change and perf improvements ([#2049](https://github.com/ReactiveX/RxJS/issues/2049)) ([89612b2](https://github.com/ReactiveX/RxJS/commit/89612b2)), closes [#2009](https://github.com/ReactiveX/RxJS/issues/2009)
- **groupBy:** Adds subjectSelector argument to groupBy ([#2023](https://github.com/ReactiveX/RxJS/issues/2023)) ([f94ceb9](https://github.com/ReactiveX/RxJS/commit/f94ceb9))
- **typescript:** remove dependency to 3rd party es2015 definition ([#2027](https://github.com/ReactiveX/RxJS/issues/2027)) ([4c31974](https://github.com/ReactiveX/RxJS/commit/4c31974)), closes [#2016](https://github.com/ReactiveX/RxJS/issues/2016)

### BREAKING CHANGES

- Notification: `Notification.prototype.exception` is now `Notification.prototype.error` to match Rx4 semantics
- Symbol.iterator: RxJS will no longer polyfill `Symbol.iterator` if `Symbol` does not exist. This may break code that inadvertently relies on this behavior
- Object.assign: RxJS will no longer polyfill `Object.assign`. It does
  not require `Object.assign` to function, however, your code may be
  inadvertently relying on this polyfill.
- AjaxObservable: Observable.ajax.getJSON() now only supports a single type parameter,
  `getJSON<T>(url: string, headers?: Object): Observable<T>`.
  The extra type parameter it accepted previously was superfluous.
- distinct: `distinctKey` has been removed. Use `distinct`
- distinct: `distinct` operator has changed, first argument is an
  optional `keySelector`. The custom `compare` function is no longer
  supported.

<a name="5.0.0-rc.1"></a>

# [5.0.0-rc.1](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.12...v5.0.0-rc.1) (2016-10-11)

### Bug Fixes

- **AjaxObservable:** Fix for [#1921](https://github.com/ReactiveX/RxJS/issues/1921) exposed AjaxObservable unsubscription error calling xhr.abort(). ([4d23f87](https://github.com/ReactiveX/RxJS/commit/4d23f87))
- **AnonymousSubject:** is now exposed on Rx namespace ([0a6f049](https://github.com/ReactiveX/RxJS/commit/0a6f049)), closes [#2002](https://github.com/ReactiveX/RxJS/issues/2002)
- **bufferTime:** no errors with take after bufferTime with maxBufferSize ([ecec640](https://github.com/ReactiveX/RxJS/commit/ecec640)), closes [#1944](https://github.com/ReactiveX/RxJS/issues/1944)
- **docs:** Fix esdoc for Observable.merge spread argument ([b794e9b](https://github.com/ReactiveX/RxJS/commit/b794e9b))
- **Observer:** fix Observable#subscribe() signature to suggest correct usable ([459d2a2](https://github.com/ReactiveX/RxJS/commit/459d2a2))
- **operator:** Fix take to complete when the source is re-entrant. ([86615cb](https://github.com/ReactiveX/RxJS/commit/86615cb))
- **root:** find global context (window/self/global) in a more safe way ([a098132](https://github.com/ReactiveX/RxJS/commit/a098132)), closes [#1930](https://github.com/ReactiveX/RxJS/issues/1930)
- **schedulers:** Queue, Asap, and AnimationFrame Schedulers should be Async if delay > 0 ([d5c682c](https://github.com/ReactiveX/RxJS/commit/d5c682c))
- **util/toSubscriber:** Supplies the Subscriber constructor with emptyObserver as destination if no ([8e7e4e3](https://github.com/ReactiveX/RxJS/commit/8e7e4e3))
- **WebSocketSubject:** ensure all internal state properly reset when socket is nulled out ([62d242e](https://github.com/ReactiveX/RxJS/commit/62d242e)), closes [#1863](https://github.com/ReactiveX/RxJS/issues/1863)

### Features

- **cache:** remove `cache` operator ([1b23ace](https://github.com/ReactiveX/RxJS/commit/1b23ace))
- **ES2015:** stop publishing `rxjs-es`, ES2015 output no longer included in `@reactivex/rxjs` package under `/dist/es6` ([6be9968](https://github.com/ReactiveX/RxJS/commit/6be9968)), closes [#1671](https://github.com/ReactiveX/RxJS/issues/1671)
- **filter:** Observable<T>.filter() can take type guard as the predicate function ([d62fbf0](https://github.com/ReactiveX/RxJS/commit/d62fbf0))
- **find:** Observable<T>.find() can take type guard as the predicate function ([b952718](https://github.com/ReactiveX/RxJS/commit/b952718))
- **first:** Observable<T>.first() can take type guard as the predicate function ([f99ca49](https://github.com/ReactiveX/RxJS/commit/f99ca49))
- **last:** Observable<T>.last() can take type guard as the predicate function ([76a8a57](https://github.com/ReactiveX/RxJS/commit/76a8a57))
- **operators:** Use lift in the operators that don't currently use lift. ([68af9ef](https://github.com/ReactiveX/RxJS/commit/68af9ef))
- **TypeScript:** update TypeScript to v2.0 ([3478b0b](https://github.com/ReactiveX/RxJS/commit/3478b0b))

### BREAKING CHANGES

- **cache:** The .cache() operator has been removed, pending further discussion ([1b23ace](https://github.com/ReactiveX/RxJS/commit/1b23ace))
- ES2015: `rxjs-es` is no longer being published
- ES2015: `@reactivex/rxjs` no longer has `/dist/es6` output

related #2016
related #1992

- package.json: TypeScript definitions are now for TS 2.0 and higher

Even if we use getter for class, they are marked with `   readonly` properties
in d.ts.

- operators: Removes MulticastObservable subclass in favor of a MulticastOperator.

<a name="5.0.0-beta.12"></a>

# [5.0.0-beta.12](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.11...v5.0.0-beta.12) (2016-09-09)

### Bug Fixes

- **ajaxObservable:** remove implicit dependency to map operator patch ([1744ae9](https://github.com/ReactiveX/RxJS/commit/1744ae9)), closes [#1874](https://github.com/ReactiveX/RxJS/issues/1874)
- **AjaxObservable:** return null value from JSON.Parse (#1904) ([6ba374e](https://github.com/ReactiveX/RxJS/commit/6ba374e))
- **catch:** removed unneeded overload for catch ([dd0e586](https://github.com/ReactiveX/RxJS/commit/dd0e586))
- **max:** do not return comparer values ([f454e93](https://github.com/ReactiveX/RxJS/commit/f454e93)), closes [#1892](https://github.com/ReactiveX/RxJS/issues/1892)
- **min:** do not return comparer values ([222fd17](https://github.com/ReactiveX/RxJS/commit/222fd17)), closes [#1892](https://github.com/ReactiveX/RxJS/issues/1892)
- **operators:** export reserved name operators on prototype ([34c39dd](https://github.com/ReactiveX/RxJS/commit/34c39dd)), closes [#1924](https://github.com/ReactiveX/RxJS/issues/1924)
- **VirtualTimeScheduler:** remove default maxFrame limit ([1de86f1](https://github.com/ReactiveX/RxJS/commit/1de86f1)), closes [#1889](https://github.com/ReactiveX/RxJS/issues/1889)
- **WebSocketSubject:** pass constructor errors onto observable ([49c7d67](https://github.com/ReactiveX/RxJS/commit/49c7d67))

### Features

- **operator:** Add repeatWhen operator ([c288d88](https://github.com/ReactiveX/RxJS/commit/c288d88))
- **sequenceEqual:** adds sequenceEqual operator ([3c30293](https://github.com/ReactiveX/RxJS/commit/3c30293)), closes [#1882](https://github.com/ReactiveX/RxJS/issues/1882)

<a name="5.0.0-beta.11"></a>

# [5.0.0-beta.11](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.10...v5.0.0-beta.11) (2016-08-09)

### Bug Fixes

- **ajaxObservable:** only set default Content-Type header when no body is sent (#1830) ([5a895e8](https://github.com/ReactiveX/RxJS/commit/5a895e8))
- **AjaxObservable:** drop resultSelector support in ajax method ([7a77437](https://github.com/ReactiveX/RxJS/commit/7a77437)), closes [#1783](https://github.com/ReactiveX/RxJS/issues/1783)
- **AsyncSubject:** do not allow change value after complete ([801f282](https://github.com/ReactiveX/RxJS/commit/801f282)), closes [#1800](https://github.com/ReactiveX/RxJS/issues/1800)
- **BoundNodeCallbackObservable:** cast to `any` to access to private field in `source` ([54f342f](https://github.com/ReactiveX/RxJS/commit/54f342f))
- **catch:** accept selector returns ObservableInput ([e55c62d](https://github.com/ReactiveX/RxJS/commit/e55c62d)), closes [#1857](https://github.com/ReactiveX/RxJS/issues/1857)
- **combineLatest:** emit unique array instances with the default projection ([2e30fd1](https://github.com/ReactiveX/RxJS/commit/2e30fd1))
- **Observable.from:** standardise arguments (remove map/context) ([aa30af2](https://github.com/ReactiveX/RxJS/commit/aa30af2))
- **schedulers:** fix asap and animationFrame schedulers to execute across async boundaries. (#182 ([548ec2a](https://github.com/ReactiveX/RxJS/commit/548ec2a)), closes [(#1820](https://github.com/(/issues/1820) [#1814](https://github.com/ReactiveX/RxJS/issues/1814)
- **subscribeToResult:** update subscription to iterables ([5d6339a](https://github.com/ReactiveX/RxJS/commit/5d6339a))
- **WebSocketSubject:** prevent early close (#1831) ([848a527](https://github.com/ReactiveX/RxJS/commit/848a527)), closes [(#1831](https://github.com/(/issues/1831)

### Features

- **fromEvent:** Pass through event listener options (#1845) ([8f0dc01](https://github.com/ReactiveX/RxJS/commit/8f0dc01))
- **PairsObservable:** add PairsObservable creation method ([26bafff](https://github.com/ReactiveX/RxJS/commit/26bafff)), closes [#1804](https://github.com/ReactiveX/RxJS/issues/1804)

### BREAKING CHANGES

- Observable.from: - Observable.from no longer supports the optional map function and associated context argument.
  This change has been reflected in the related constructors and their properties have been standardised.
- AjaxObservable: ajax.\*() method no longer support resultSelector, encourage to use `map` instead

<a name="5.0.0-beta.10"></a>

# [5.0.0-beta.10](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.9...v5.0.0-beta.10) (2016-07-06)

### Bug Fixes

- **AjaxObservable:** ignore content-type for formdata (#1746) ([43d05e7](https://github.com/ReactiveX/RxJS/commit/43d05e7))
- **AjaxObservable:** support withCredentials for CORS request ([8084572](https://github.com/ReactiveX/RxJS/commit/8084572)), closes [#1732](https://github.com/ReactiveX/RxJS/issues/1732) [#1711](https://github.com/ReactiveX/RxJS/issues/1711)
- **babel:** fix an issue where babel could not compile `Scheduler.async` (#1807) ([12c5c74](https://github.com/ReactiveX/RxJS/commit/12c5c74)), closes [(#1807](https://github.com/(/issues/1807) [#1806](https://github.com/ReactiveX/RxJS/issues/1806)
- **bufferTime:** handle closing context when synchronously unsubscribed ([4ce4433](https://github.com/ReactiveX/RxJS/commit/4ce4433)), closes [#1763](https://github.com/ReactiveX/RxJS/issues/1763)
- **multicast:** Fixes multicast with selector to create a new source connection per subscriber. ([c3ac852](https://github.com/ReactiveX/RxJS/commit/c3ac852)), closes [(#1774](https://github.com/(/issues/1774)
- **Subject:** allow optional next value in type definition ([3e0c6d9](https://github.com/ReactiveX/RxJS/commit/3e0c6d9)), closes [#1728](https://github.com/ReactiveX/RxJS/issues/1728)
- **WebSocketSubject:** respect WebSocketCtor, support source/destination arguments in constructor. (#179 ([cd8cdd0](https://github.com/ReactiveX/RxJS/commit/cd8cdd0)), closes [#1745](https://github.com/ReactiveX/RxJS/issues/1745) [#1784](https://github.com/ReactiveX/RxJS/issues/1784)

<a name="5.0.0-beta.9"></a>

# [5.0.0-beta.9](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.8...v5.0.0-beta.9) (2016-06-14)

### Bug Fixes

- **cache:** get correct caching behavior (#1765) ([cb0b806](https://github.com/ReactiveX/RxJS/commit/cb0b806)), closes [#1628](https://github.com/ReactiveX/RxJS/issues/1628)
- **ConnectableObservable:** fix ConnectableObservable connection handling issue ([41ce80c](https://github.com/ReactiveX/RxJS/commit/41ce80c))
- **typings:** make HotObservable.\_subscribe protected ([1c3d6ea](https://github.com/ReactiveX/RxJS/commit/1c3d6ea))
- **WebSocketSubject:** WebSocketSubject will now chain operators properly (#1752) ([bf54db4](https://github.com/ReactiveX/RxJS/commit/bf54db4)), closes [#1745](https://github.com/ReactiveX/RxJS/issues/1745)
- **window:** don't track internal window subjects as subscriptions. ([f3357b9](https://github.com/ReactiveX/RxJS/commit/f3357b9))

### Performance Improvements

- **fromEventPattern:** ~3x improvement in speed ([3dc1c00](https://github.com/ReactiveX/RxJS/commit/3dc1c00))

<a name="5.0.0-beta.8"></a>

# [5.0.0-beta.8](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.7...v5.0.0-beta.8) (2016-05-22)

### Bug Fixes

- **AnonymousSubject:** allow anonymous observers as destination ([0e2c28b](https://github.com/ReactiveX/RxJS/commit/0e2c28b))
- **combineLatest:** rxjs/observable/combineLatest is now properly exported ([21fab73](https://github.com/ReactiveX/RxJS/commit/21fab73)), closes [#1722](https://github.com/ReactiveX/RxJS/issues/1722)
- **ConnectableObservable:** fix race conditions in ConnectableObservable and refCount. ([d1412bc](https://github.com/ReactiveX/RxJS/commit/d1412bc))
- **Rx:** remove kitchenSink and DOM, let Rx export all ([f5090b4](https://github.com/ReactiveX/RxJS/commit/f5090b4)), closes [#1650](https://github.com/ReactiveX/RxJS/issues/1650)
- **ScalarObservable:** set \_isScalar to false when initialized with a scheduler ([5037b3a](https://github.com/ReactiveX/RxJS/commit/5037b3a))
- **Subject:** correct Subject behaviors to be more like Rx4 ([ba9ef2b](https://github.com/ReactiveX/RxJS/commit/ba9ef2b))
- **subscriptions:** fixes bug that tracked subscriber subscriptions twice. ([29ff794](https://github.com/ReactiveX/RxJS/commit/29ff794))

### Features

- **bufferTime:** add `maxBufferSize` optional argument ([cf45540](https://github.com/ReactiveX/RxJS/commit/cf45540)), closes [#1295](https://github.com/ReactiveX/RxJS/issues/1295)
- **multicast:** subjectfactory allows selectors ([32fa3a4](https://github.com/ReactiveX/RxJS/commit/32fa3a4))
- **onErrorResumeNext:** add onErrorResumeNext operator ([51e022b](https://github.com/ReactiveX/RxJS/commit/51e022b)), closes [#1665](https://github.com/ReactiveX/RxJS/issues/1665)
- **publish:** support optional selectors ([0e5991d](https://github.com/ReactiveX/RxJS/commit/0e5991d)), closes [#1629](https://github.com/ReactiveX/RxJS/issues/1629)

### Performance Improvements

- **combineLatest:** avoid splice and indexOf ([33599cd](https://github.com/ReactiveX/RxJS/commit/33599cd))

### BREAKING CHANGES

- Subject: Subjects no longer duck-type as Subscriptions
- Subject: Subjects will no longer throw when re-subscribed to if they are not unsubscribed
- Subject: Subjects no longer automatically unsubscribe when completed or errored
  BREAKING CHANGE: Minor scheduling changes to groupBy to ensure proper emission ordering
- Rx: `Rx.kitchenSink` and `Rx.DOM` are removed, `Rx`
  export everything.

<a name="5.0.0-beta.7"></a>

# [5.0.0-beta.7](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.6...v5.0.0-beta.7) (2016-04-27)

### Bug Fixes

- **race:** handle observables completes immediately ([abac3d1](https://github.com/ReactiveX/RxJS/commit/abac3d1)), closes [#1615](https://github.com/ReactiveX/RxJS/issues/1615)
- **scan:** accumulator passes current index ([a3ec896](https://github.com/ReactiveX/RxJS/commit/a3ec896)), closes [#1614](https://github.com/ReactiveX/RxJS/issues/1614)

### Features

- **Observable.generate:** add generate static creation method ([c03434c](https://github.com/ReactiveX/RxJS/commit/c03434c))

<a name="5.0.0-beta.6"></a>

# [5.0.0-beta.6](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.5...v5.0.0-beta.6) (2016-04-12)

### Bug Fixes

- **AjaxObservable:** support json responseType on IE ([bba13d8](https://github.com/ReactiveX/RxJS/commit/bba13d8)), closes [#1381](https://github.com/ReactiveX/RxJS/issues/1381)
- **bufferToggle:** accepts closing selector returns promise ([b1c575c](https://github.com/ReactiveX/RxJS/commit/b1c575c))
- **bufferToggle:** accepts promise as openings ([3d22c7a](https://github.com/ReactiveX/RxJS/commit/3d22c7a))
- **bufferToggle:** handle closingSelector completes immediately ([02239fb](https://github.com/ReactiveX/RxJS/commit/02239fb))
- **typings:** explicitly export typings for arguments to functions that destructure configuration objects ([ef305af](https://github.com/ReactiveX/RxJS/commit/ef305af))

### Features

- **UnsubscriptionError:** add messages from inner errors to output message ([dd01279](https://github.com/ReactiveX/RxJS/commit/dd01279)), closes [#1590](https://github.com/ReactiveX/RxJS/issues/1590)

### Performance Improvements

- **DeferSubscriber:** split up 'tryDefer()' into a method to call a factory function. ([566f46b](https://github.com/ReactiveX/RxJS/commit/566f46b))

<a name="5.0.0-beta.5"></a>

# [5.0.0-beta.5](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.4...v5.0.0-beta.5) (2016-04-05)

### Bug Fixes

- **take:** make 'take' unsubscribe when it reaches the total ([9858aa3](https://github.com/ReactiveX/RxJS/commit/9858aa3))

### BREAKING CHANGES

- Operator: `Operator.prototype.call` has been refactored to include both the destination Subscriber, and the source Observable
  the Operator is now responsible for describing it's own subscription process. ([26423f4](https://github.com/ReactiveX/rxjs/pull/1570/commits/26423f4))

<a name="5.0.0-beta.4"></a>

# [5.0.0-beta.4](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.3...v5.0.0-beta.4) (2016-03-29)

### Bug Fixes

- **AjaxObservable:** enhance compatibility ([0ac7e1e](https://github.com/ReactiveX/RxJS/commit/0ac7e1e))
- **Observable.if:** accept promise as source ([147166e](https://github.com/ReactiveX/RxJS/commit/147166e))
- **mergeMap:** allow concurrent to be set as the second argument for mergeMap and mergeMapTo ([c003468](https://github.com/ReactiveX/RxJS/commit/c003468))
- **observable:** ensure the subscriber chain is complete before calling this.\_subscribe ([1631224](https://github.com/ReactiveX/RxJS/commit/1631224))
- **Symbol:** fixed issue where \$\$observable is not defined ([e66b2d8](https://github.com/ReactiveX/RxJS/commit/e66b2d8))
- **Observable.using:** accepts factory returns promise ([f8d7d1b](https://github.com/ReactiveX/RxJS/commit/f8d7d1b))
- **windowToggle:** handle closingSelector completes immediately ([c755587](https://github.com/ReactiveX/RxJS/commit/c755587)), closes [#1487](https://github.com/ReactiveX/RxJS/issues/1487)

### Features

- **ajax:** add FormData support in AjaxObservable and add percent encoding for parameters ([1f6119c](https://github.com/ReactiveX/RxJS/commit/1f6119c))
- **Subscription:** `add()` now returns a Subscription reference ([a3f4552](https://github.com/ReactiveX/RxJS/commit/a3f4552))
- **timestamp:** add timestamp operator ([80b1646](https://github.com/ReactiveX/RxJS/commit/80b1646)), closes [#1515](https://github.com/ReactiveX/RxJS/issues/1515)

### Performance Improvements

- **forkJoin:** improve forkJoin perf slightly by removing unnecessary context tracking ([280b985](https://github.com/ReactiveX/RxJS/commit/280b985))

### BREAKING CHANGES

- Observable: `Observable.fromArray` was removed since it's deprecated on RxJS 4. You should use `Observable.from` instead.

<a name="5.0.0-beta.3"></a>

# [5.0.0-beta.3](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.2...v5.0.0-beta.3) (2016-03-21)

### Bug Fixes

- **AjaxObservable:** update type definition for AjaxObservable ([3f5c269](https://github.com/ReactiveX/RxJS/commit/3f5c269)), closes [#1382](https://github.com/ReactiveX/RxJS/issues/1382)
- **deferObservable:** accepts factory returns promise ([0cb44e1](https://github.com/ReactiveX/RxJS/commit/0cb44e1))
- **do:** fix do operator to invoke observer message handlers in the right context. ([67a2f25](https://github.com/ReactiveX/RxJS/commit/67a2f25))
- **exhaustMap:** remove innersubscription when it completes ([7ca0859](https://github.com/ReactiveX/RxJS/commit/7ca0859))
- **forEach:** ensure that teardown logic is called when nextHandler throws ([c50f528](https://github.com/ReactiveX/RxJS/commit/c50f528)), closes [#1411](https://github.com/ReactiveX/RxJS/issues/1411)
- **forkJoin:** accepts observables emitting null or undefined ([6279d6b](https://github.com/ReactiveX/RxJS/commit/6279d6b)), closes [#1362](https://github.com/ReactiveX/RxJS/issues/1362)
- **forkJoin:** dispose the inner subscriptions when the outer subscription is disposed ([c7bf30c](https://github.com/ReactiveX/RxJS/commit/c7bf30c))
- **FutureAction:** add support for periodic scheduling with setInterval instead of setTimeout ([c4f5408](https://github.com/ReactiveX/RxJS/commit/c4f5408))
- **Observable:** introduce Subscribable interface that will be used instead of Observable in input ([2256e7b](https://github.com/ReactiveX/RxJS/commit/2256e7b))
- **Observable.prototype.forEach:** removed thisArg to match es-observable spec ([d5f1bcd](https://github.com/ReactiveX/RxJS/commit/d5f1bcd))
- **package.json:** install typings only after packages are installed ([a48d796](https://github.com/ReactiveX/RxJS/commit/a48d796))
- **Schedulers:** ensure schedulers can be reused after error in execution ([202b79a](https://github.com/ReactiveX/RxJS/commit/202b79a))
- **takeLast:** fix takeLast behavior to emit correct order ([73eb658](https://github.com/ReactiveX/RxJS/commit/73eb658)), closes [#1407](https://github.com/ReactiveX/RxJS/issues/1407)
- **typings:** set map function parameter for Observable.from as optional ([efa4dc3](https://github.com/ReactiveX/RxJS/commit/efa4dc3))

### Features

- **AsyncScheduler:** add AsyncScheduler implementation ([4486c1f](https://github.com/ReactiveX/RxJS/commit/4486c1f))
- **if:** add static Observable.if creation operator. ([f7ff7ec](https://github.com/ReactiveX/RxJS/commit/f7ff7ec))
- **let:** adds the let operator to Rx.KitchenSink ([dca6504](https://github.com/ReactiveX/RxJS/commit/dca6504))
- **using:** add static Observable.using creation operator. ([6c76593](https://github.com/ReactiveX/RxJS/commit/6c76593))

### BREAKING CHANGES

- Observable.prototype.forEach: thisArg removed to match es-observable spec

<a name="5.0.0-beta.2"></a>

# [5.0.0-beta.2](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.1...v5.0.0-beta.2) (2016-02-10)

### Bug Fixes

- **ajax:** fixes error in Chrome accessing responseText when responseType isn't text. ([f3e2f73](https://github.com/ReactiveX/RxJS/commit/f3e2f73))
- **benchpress:** fix issues with benchmarks ([16894bb](https://github.com/ReactiveX/RxJS/commit/16894bb))
- **every:** remove eager predicate calls ([74c2c44](https://github.com/ReactiveX/RxJS/commit/74c2c44))
- **forkJoin:** fix forkJoin to complete if sources Array is empty. ([412b13b](https://github.com/ReactiveX/RxJS/commit/412b13b))
- **groupBy:** does not emit on unsubscribed group ([6d08705](https://github.com/ReactiveX/RxJS/commit/6d08705))
- **groupBy:** fix groupBy to use lift(), supports composability ([815cfae](https://github.com/ReactiveX/RxJS/commit/815cfae)), closes [#1085](https://github.com/ReactiveX/RxJS/issues/1085)
- **merge/concat:** passed scalar observables will now complete properly ([c01b92f](https://github.com/ReactiveX/RxJS/commit/c01b92f)), closes [#1150](https://github.com/ReactiveX/RxJS/issues/1150)
- **MergeMapSubscriber:** clarify type definitions for MergeMapSubscriber's members ([4ee5f02](https://github.com/ReactiveX/RxJS/commit/4ee5f02))
- **Observable.forEach:** errors thrown in nextHandler reject returned promise ([c5ead88](https://github.com/ReactiveX/RxJS/commit/c5ead88)), closes [#1184](https://github.com/ReactiveX/RxJS/issues/1184)
- **Observer:** fix typing to allow observation via partial observables with PartialObservable<T ([7b6da90](https://github.com/ReactiveX/RxJS/commit/7b6da90))
- **Subject:** align parameter order to match with RxJS4 ([44dfa07](https://github.com/ReactiveX/RxJS/commit/44dfa07)), closes [#1285](https://github.com/ReactiveX/RxJS/issues/1285)
- **Subject:** throw ObjectUnsubscribedError when unsubscribed ([29b630b](https://github.com/ReactiveX/RxJS/commit/29b630b)), closes [#859](https://github.com/ReactiveX/RxJS/issues/859)
- **Subscriber:** adds unsubscription when errors are thrown from user-land handlers. ([dc67d21](https://github.com/ReactiveX/RxJS/commit/dc67d21))
- **Subscription:** fix leaks caused by unsubscribe functions that throw ([9e88c2e](https://github.com/ReactiveX/RxJS/commit/9e88c2e))
- **subscriptions:** unsubscribe correctly when a Subscriber throws during synchronous dispatch. ([b1698fe](https://github.com/ReactiveX/RxJS/commit/b1698fe))
- **typings:** don't expose PromiseConstructor dependency ([f59225b](https://github.com/ReactiveX/RxJS/commit/f59225b)), closes [#1270](https://github.com/ReactiveX/RxJS/issues/1270)
- **typings:** remove R from Operator.call, update operators accordingly ([f27902d](https://github.com/ReactiveX/RxJS/commit/f27902d))
- **typings:** remove redundant generics from call<T, R> and lift<T, R> ([603c9eb](https://github.com/ReactiveX/RxJS/commit/603c9eb))
- **windowTime:** does not emit on unsubscribed window ([595f4ef](https://github.com/ReactiveX/RxJS/commit/595f4ef))

### Features

- **cache:** add cache operator ([4308a04](https://github.com/ReactiveX/RxJS/commit/4308a04))
- **delayWhen:** add delayWhen operator ([17122f9](https://github.com/ReactiveX/RxJS/commit/17122f9))
- **distinct:** add distinct operator ([94a034d](https://github.com/ReactiveX/RxJS/commit/94a034d))
- **distinctKey:** add distinctKey operator ([fe4d57f](https://github.com/ReactiveX/RxJS/commit/fe4d57f))
- **from:** allow Observable.from to handle array-like objects ([7245005](https://github.com/ReactiveX/RxJS/commit/7245005))
- **MapPolyfill:** implement clear interface ([e3fbd05](https://github.com/ReactiveX/RxJS/commit/e3fbd05))
- **operator:** adds inspect and inspectTime operators ([54f957b](https://github.com/ReactiveX/RxJS/commit/54f957b))
- **OuterSubscriber:** notifyNext passes innersubscriber when next emits ([1df8928](https://github.com/ReactiveX/RxJS/commit/1df8928)), closes [#1250](https://github.com/ReactiveX/RxJS/issues/1250)
- **Subject:** implement asObservable ([aca3dd0](https://github.com/ReactiveX/RxJS/commit/aca3dd0)), closes [#1108](https://github.com/ReactiveX/RxJS/issues/1108)
- **takeLast:** adds takeLast operator. ([3583cd3](https://github.com/ReactiveX/RxJS/commit/3583cd3))

### Performance Improvements

- **catch:** remove tryCatch/errorObject for custom tryCatching, 1.3M -> 1.5M ops/sec ([35caf74](https://github.com/ReactiveX/RxJS/commit/35caf74))
- **combineLatest:** remove tryCatch/errorObject, 156k -> 221k ops/sec ([1c7d639](https://github.com/ReactiveX/RxJS/commit/1c7d639))
- **count:** remove tryCatch/errorObject for custom tryCatching, 1.84M -> 1.97M ops/sec ([869718d](https://github.com/ReactiveX/RxJS/commit/869718d))
- **debounce:** remove tryCatch/errorObject for custom tryCatching ([90bf3f1](https://github.com/ReactiveX/RxJS/commit/90bf3f1))
- **distinct:** increase perf from 60% of Rx4 to 1000% Rx4 ([d026c41](https://github.com/ReactiveX/RxJS/commit/d026c41))
- **do:** remove tryCatch/errorObject use, 104k -> 263k ops/sec improvement ([ccba39d](https://github.com/ReactiveX/RxJS/commit/ccba39d))
- **every:** remove tryCatch/errorObject (~1.8x improvement) ([14afeb6](https://github.com/ReactiveX/RxJS/commit/14afeb6))
- **exhaustMap:** remove tryCatch/errorObject (~10% improvement) ([a55f459](https://github.com/ReactiveX/RxJS/commit/a55f459))
- **filter:** remove tryCatch/errorObject for 2x perf improvement ([086c4bf](https://github.com/ReactiveX/RxJS/commit/086c4bf))
- **find:** remove tryCatch/errorObject (~2x improvement) ([aa35b2a](https://github.com/ReactiveX/RxJS/commit/aa35b2a))
- **first:** remove tryCatch/errorObject for custom tryCatching, 970k ops -> 1.27M ops/sec ([d8c835a](https://github.com/ReactiveX/RxJS/commit/d8c835a))
- **groupBy:** remove tryCatch/errorObject for custom tryCatching, 38% faster. ([40c43f7](https://github.com/ReactiveX/RxJS/commit/40c43f7))
- **last:** remove tryCatch/errorObject for custom tryCatching, 960k -> 1.38M ops/sec ([243ace3](https://github.com/ReactiveX/RxJS/commit/243ace3))
- **map:** 2x increase from removing tryCatch/errorObject ([231f729](https://github.com/ReactiveX/RxJS/commit/231f729))
- **mergeMap:** extra 1x factor gains from custom tryCatch member function ([c4ce2fb](https://github.com/ReactiveX/RxJS/commit/c4ce2fb))
- **mergeMapTo:** remove tryCatch/errorObject (~2x improvement) ([42bcced](https://github.com/ReactiveX/RxJS/commit/42bcced))
- **reduce:** remove tryCatch/errorObject, optimize calls, 2-3x perf improvement ([6186d46](https://github.com/ReactiveX/RxJS/commit/6186d46))
- **scan:** remove tryCatch/errorObject for custom tryCatcher 1.75x improvement ([338135d](https://github.com/ReactiveX/RxJS/commit/338135d))
- **single:** remove tryCatch/errorObject (~2.5x improvement) ([2515cfb](https://github.com/ReactiveX/RxJS/commit/2515cfb))
- **skipWhile:** remove tryCatch/errorObject (~1.6x improvement) ([cf002db](https://github.com/ReactiveX/RxJS/commit/cf002db))
- **Subscriber:** double performance adding tryOrUnsub to Subscriber ([4e75466](https://github.com/ReactiveX/RxJS/commit/4e75466))
- **switchMap:** remove tryCatch/errorObject ~20% improvement ([ec0199f](https://github.com/ReactiveX/RxJS/commit/ec0199f))
- **switchMapTo:** remove tryCatch/errorObject (~2x improvement) ([c8cf72a](https://github.com/ReactiveX/RxJS/commit/c8cf72a))
- **takeWhile:** remove tryCatch/errorObject (~6x improvement) ([ef6c3c3](https://github.com/ReactiveX/RxJS/commit/ef6c3c3))
- **withLatestFrom:** remove tryCatch/errorObject, 92k -> 107k (16% improvement) ([e4ccb44](https://github.com/ReactiveX/RxJS/commit/e4ccb44))
- **zip:** extra 1x-2x factor gains from custom tryCatch member function ([a1b0e52](https://github.com/ReactiveX/RxJS/commit/a1b0e52))

### BREAKING CHANGES

- Subject: Subject.create arguments have been swapped to match Rx 4 signature. `Subject.create(observable, observer)` is now `Subject.create(observer, observable)`
- Observable patching: Patch files for static observable methods such as `of` and `from` can now be found in `rxjs/add/observable/of`, `rxjs/add/observable/from`, etc.
- Observable modules: Observable modules for subclassed Observables like `PromiseObservable`, `ArrayObservable` are now in appropriately named files like `rxjs/observable/PromiseObservable` and `rxjs/observable/ArrayObservable`
  as opposed to `rxjs/observable/fromPromise` and `rxjs/observable/fromArray`, since they're not patching, they simply house the Observable implementations.

<a name="5.0.0-beta.1"></a>

# [5.0.0-beta.1](https://github.com/ReactiveX/RxJS/compare/5.0.0-beta.0...v5.0.0-beta.1) (2016-01-13)

### Bug Fixes

- **ajax:** ensure post sending values ([7aae0a3](https://github.com/ReactiveX/RxJS/commit/7aae0a3))
- **ajax:** ensure that headers are set properly ([1100bdd](https://github.com/ReactiveX/RxJS/commit/1100bdd))
- **ajax:** ensure XHR props are set after open ([4a6a579](https://github.com/ReactiveX/RxJS/commit/4a6a579))
- **ajax:** ensure XHR send is being called ([c569e3e](https://github.com/ReactiveX/RxJS/commit/c569e3e))
- **ajax:** remove unnecessary onAbort handling ([ed8240e](https://github.com/ReactiveX/RxJS/commit/ed8240e))
- **ajax:** response properly based off responseType ([b2a27a2](https://github.com/ReactiveX/RxJS/commit/b2a27a2))
- **ajax:** should no longer succeed on 300 status ([4d4fa32](https://github.com/ReactiveX/RxJS/commit/4d4fa32))
- **animationFrame:** req/cancel animationFrame has to be called within the context of root. ([30a11ee](https://github.com/ReactiveX/RxJS/commit/30a11ee))
- **debounceTime:** align value emit behavior as same as RxJS4 ([5ee11e0](https://github.com/ReactiveX/RxJS/commit/5ee11e0)), closes [#1081](https://github.com/ReactiveX/RxJS/issues/1081)
- **distinctUntilChanged:** implement optional keySelector ([f6a897c](https://github.com/ReactiveX/RxJS/commit/f6a897c))
- **fromEvent:** added spread operator for emitters that pass multiple arguments ([3f8eabb](https://github.com/ReactiveX/RxJS/commit/3f8eabb))
- **fromObservable:** expand compatibility for iterating string source ([8f7924f](https://github.com/ReactiveX/RxJS/commit/8f7924f)), closes [#1147](https://github.com/ReactiveX/RxJS/issues/1147)
- **Immediate:** update setImmediate compatibility on IE ([39e6c0e](https://github.com/ReactiveX/RxJS/commit/39e6c0e)), closes [#1163](https://github.com/ReactiveX/RxJS/issues/1163)
- **inspect:** remove inspect and inspectTime operators ([17341a4](https://github.com/ReactiveX/RxJS/commit/17341a4))
- **Readme:** update link to bundle on npmcdn ([44a8ca7](https://github.com/ReactiveX/RxJS/commit/44a8ca7))
- **ReplaySubject:** Fix case-sensitive import. ([de31f32](https://github.com/ReactiveX/RxJS/commit/de31f32))
- **ScalarObservable:** fix issue where scalar map fired twice ([c18c42e](https://github.com/ReactiveX/RxJS/commit/c18c42e)), closes [#1142](https://github.com/ReactiveX/RxJS/issues/1142) [#1140](https://github.com/ReactiveX/RxJS/issues/1140)
- **scheduling:** Fixes bugs in scheduled actions. ([e050f01](https://github.com/ReactiveX/RxJS/commit/e050f01))
- **Subscriber:** errors in nextHandler no longer propagate to errorHandler ([f42eed2](https://github.com/ReactiveX/RxJS/commit/f42eed2)), closes [#1135](https://github.com/ReactiveX/RxJS/issues/1135)
- **WebSocketSubject:** ensure error codes passed to WebSocket close method ([3b1655e](https://github.com/ReactiveX/RxJS/commit/3b1655e))
- **WebSocketSubject:** ensure WebSocketSubject can be resubscribed ([861a0c1](https://github.com/ReactiveX/RxJS/commit/861a0c1))
- **WebSocketSubject:** resultSelector and protocols specifications work properly ([580f69a](https://github.com/ReactiveX/RxJS/commit/580f69a))

### Features

- **ajax:** add resultSelector and improve perf ([6df755f](https://github.com/ReactiveX/RxJS/commit/6df755f))
- **ajax:** adds ajax methods from rx-dom. ([2ca4236](https://github.com/ReactiveX/RxJS/commit/2ca4236))
- **bindNodeCallback:** add Observable.bindNodeCallback ([497bb0d](https://github.com/ReactiveX/RxJS/commit/497bb0d)), closes [#736](https://github.com/ReactiveX/RxJS/issues/736)
- **Observable:** add let to allow fluent style query building ([5a2014c](https://github.com/ReactiveX/RxJS/commit/5a2014c))
- **Observable:** add pairwise operator ([1432e59](https://github.com/ReactiveX/RxJS/commit/1432e59))
- **Operator:** Expose the Operator interface to library consumers ([29aa3af](https://github.com/ReactiveX/RxJS/commit/29aa3af))
- **pluck:** add pluck operator ([8026906](https://github.com/ReactiveX/RxJS/commit/8026906)), closes [#1134](https://github.com/ReactiveX/RxJS/issues/1134)
- **race:** add race operator ([ee3b593](https://github.com/ReactiveX/RxJS/commit/ee3b593))
- **scheduler:** adds animationFrame scheduler. ([e637b78](https://github.com/ReactiveX/RxJS/commit/e637b78))
- **WebSocketSubject:** add basic WebSocketSubject implementation ([58cd806](https://github.com/ReactiveX/RxJS/commit/58cd806))
- **WebSocketSubject.multiplex:** add multiplex operator to WebSocketSubject ([904d617](https://github.com/ReactiveX/RxJS/commit/904d617))

### BREAKING CHANGES

- inspect: `inspect` and `inspectTime` were removed. Use `withLatestFrom` instead.
- Subscriber/Observable: errors thrown in nextHandlers by consumer code will no longer propagate to the errorHandler.

<a name="5.0.0-beta.0"></a>

# [5.0.0-beta.0](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.14...v5.0.0-beta.0) (2015-12-15)

### Bug Fixes

- **micro-perf:** rename immediate to queue scheduler ([fe56b28](https://github.com/ReactiveX/RxJS/commit/fe56b28)), closes [#1040](https://github.com/ReactiveX/RxJS/issues/1040)
- **micro-perf:** use the current scheduler on current-thread tests ([3dff5eb](https://github.com/ReactiveX/RxJS/commit/3dff5eb))
- **operators:** emit declarations for patch modules ([676f82d](https://github.com/ReactiveX/RxJS/commit/676f82d))
- **test:** make explicit unsubscription for observable ([7f67b09](https://github.com/ReactiveX/RxJS/commit/7f67b09))
- **test:** make explicit unsubscription for observable ([65e65e2](https://github.com/ReactiveX/RxJS/commit/65e65e2))
- **window:** fix window() to dispose window Subjects ([5168f73](https://github.com/ReactiveX/RxJS/commit/5168f73))
- **windowCount:** fix windowCount to dispose window Subjects ([f29ee29](https://github.com/ReactiveX/RxJS/commit/f29ee29))
- **windowTime:** fix windowTime to dispose window Subjects ([b73e260](https://github.com/ReactiveX/RxJS/commit/b73e260))
- **windowToggle:** fix windowToggle to dispose window Subjects ([15ff3f7](https://github.com/ReactiveX/RxJS/commit/15ff3f7))
- **windowWhen:** fix windowWhen to dispose window Subjects ([91c1941](https://github.com/ReactiveX/RxJS/commit/91c1941))

### Features

- **inspect:** added inspect operator ([f9944ae](https://github.com/ReactiveX/RxJS/commit/f9944ae))
- **inspectTime:** add inspectTime operator ([6835dcd](https://github.com/ReactiveX/RxJS/commit/6835dcd))
- **sample:** readd `sample` operator ([e93bffc](https://github.com/ReactiveX/RxJS/commit/e93bffc))
- **sampleTime:** reimplement `sampleTime` with RxJS 4 behavior ([6b77e69](https://github.com/ReactiveX/RxJS/commit/6b77e69))
- **TestScheduler:** add createTime() parser to return number ([cb8cf6b](https://github.com/ReactiveX/RxJS/commit/cb8cf6b))

### BREAKING CHANGES

- sampleTime: `sampleTime` now has the same behavior `sample(number, scheduler)` did in RxJS 4
- sample: `sample` behavior returned to RxJS 4 behavior
- inspectTime: `sampleTime` is now `inspectTime`
- inspect: RxJS 5 `sample` behavior is now `inspect`
- extended operators: All extended operators are now under the same operator directory as all others. This means that
  `import "rxjs/add/operator/extended/min"` is now `import "rxjs/add/operator/min"`

<a name="5.0.0-alpha.14"></a>

# [5.0.0-alpha.14](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.13...v5.0.0-alpha.14) (2015-12-09)

### Bug Fixes

- **every:** handle thisArg for scalar and array observables ([eae4b00](https://github.com/ReactiveX/RxJS/commit/eae4b00))
- **SymbolShim:** ensure for function even if Symbol already exists ([e942776](https://github.com/ReactiveX/RxJS/commit/e942776)), closes [#999](https://github.com/ReactiveX/RxJS/issues/999)
- **SymbolShim:** Symbol polyfill is a function ([1f57157](https://github.com/ReactiveX/RxJS/commit/1f57157)), closes [#988](https://github.com/ReactiveX/RxJS/issues/988)
- **timeoutWith:** fix to avoid unnecessary inner subscription ([6e63752](https://github.com/ReactiveX/RxJS/commit/6e63752))

### Features

- **count:** remove thisArg ([878a1fd](https://github.com/ReactiveX/RxJS/commit/878a1fd))
- **distinctUntilChanged:** remove thisArg ([bfc52d6](https://github.com/ReactiveX/RxJS/commit/bfc52d6))
- **exhaust:** rename switchFirst operators to exhaust ([9b565c9](https://github.com/ReactiveX/RxJS/commit/9b565c9)), closes [#915](https://github.com/ReactiveX/RxJS/issues/915)
- **finally:** remove thisArg ([d4b02fc](https://github.com/ReactiveX/RxJS/commit/d4b02fc))
- **forEach:** add thisArg ([14ffce6](https://github.com/ReactiveX/RxJS/commit/14ffce6)), closes [#878](https://github.com/ReactiveX/RxJS/issues/878)
- **single:** remove thisArg ([43af805](https://github.com/ReactiveX/RxJS/commit/43af805))

### BREAKING CHANGES

- exhaust: switchFirst is now exhaust
- exhaust: switchFirstMap is now exhaustMap
- forEach: Observable.prototype.forEach argument order changed to accommodate thisArg. Optional PromiseCtor argument moved to third arg from second

<a name="5.0.0-alpha.13"></a>

# [5.0.0-alpha.13](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.12...v5.0.0-alpha.13) (2015-12-08)

### Bug Fixes

- **Observable:** fix circular dependency issue. ([b7672f4](https://github.com/ReactiveX/RxJS/commit/b7672f4))
- **bufferToggle:** fix unsubscriptions of closing Observable ([439b641](https://github.com/ReactiveX/RxJS/commit/439b641))
- **expand:** accept scheduler parameter ([79e9084](https://github.com/ReactiveX/RxJS/commit/79e9084)), closes [#841](https://github.com/ReactiveX/RxJS/issues/841)
- **publish:** make script generate correct package names ([10563d3](https://github.com/ReactiveX/RxJS/commit/10563d3))
- **repeat:** preserve Subscriber chain in repeat() ([d9a7328](https://github.com/ReactiveX/RxJS/commit/d9a7328))
- **retry:** preserve Subscriber chain in retry() ([b429dac](https://github.com/ReactiveX/RxJS/commit/b429dac))
- **retryWhen:** preserve Subscriber chain in retryWhen() ([c9cb958](https://github.com/ReactiveX/RxJS/commit/c9cb958))

### Features

- **AsapScheduler:** rename NextTickScheduler to AsapScheduler ([3255fb3](https://github.com/ReactiveX/RxJS/commit/3255fb3)), closes [#838](https://github.com/ReactiveX/RxJS/issues/838)
- **BehaviorSubject:** add getValue method to access value ([33b387b](https://github.com/ReactiveX/RxJS/commit/33b387b)), closes [#758](https://github.com/ReactiveX/RxJS/issues/758)
- **BehaviorSubject:** now throws when getValue is called after unsubscription ([1ddf116](https://github.com/ReactiveX/RxJS/commit/1ddf116))
- **ObjectUnsubscribedError:** add ObjectUnsubscribed error class ([39836af](https://github.com/ReactiveX/RxJS/commit/39836af))
- **Observable:** subscribe accepts objects with rxSubscriber symbol ([b7672f4](https://github.com/ReactiveX/RxJS/commit/b7672f4))
- **QueueScheduler:** rename ImmediateScheduler to QueueScheduler ([66eb537](https://github.com/ReactiveX/RxJS/commit/66eb537))
- **Rx.Symbol.rxSubscriber:** add rxSubscriber symbol ([d4f1670](https://github.com/ReactiveX/RxJS/commit/d4f1670))
- **Subject:** add rxSubscriber symbol ([d2e4257](https://github.com/ReactiveX/RxJS/commit/d2e4257))
- **Subscriber:** add rxSubscriber symbol ([7bda360](https://github.com/ReactiveX/RxJS/commit/7bda360))
- **switchFirstMap:** rename switchMapFirst to switchFirstMap ([eddd4dc](https://github.com/ReactiveX/RxJS/commit/eddd4dc))

### BREAKING CHANGES

- AsapScheduler: `Rx.Scheduler.nextTick` (Rx 4's "default" scheduler) is now `Rx.Scheduler.asap`
- QueueScheduler: `Rx.Scheduler.immediate` (Rx 4's "currentThread" scheduler) is now `Rx.Scheduler.queue`
  related #838
- switchFirstMap: `switchMapFirst` is now `switchFirstMap`

<a name="5.0.0-alpha.12"></a>

# [5.0.0-alpha.12](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.10...v5.0.0-alpha.12) (2015-12-04)

### Bug Fixes

- **AsyncSubject:** emit value when it's subscribed after complete ([ed0eaf6](https://github.com/ReactiveX/RxJS/commit/ed0eaf6))
- **bindCallback:** only call function once even while scheduled ([8637d47](https://github.com/ReactiveX/RxJS/commit/8637d47)), closes [#881](https://github.com/ReactiveX/RxJS/issues/881)
- **bufferToggle:** fix disposal of subscriptions when errors occur ([a20325c](https://github.com/ReactiveX/RxJS/commit/a20325c))
- **catch:** fix catch to dispose old subscriptions ([280f7ed](https://github.com/ReactiveX/RxJS/commit/280f7ed)), closes [#763](https://github.com/ReactiveX/RxJS/issues/763)
- **catch:** fix catch() to preserve Subscriber chain ([e1447ac](https://github.com/ReactiveX/RxJS/commit/e1447ac))
- **concat:** accept scheduler parameter ([8859702](https://github.com/ReactiveX/RxJS/commit/8859702))
- **ConnectableObservable:** fix ConnectableObservable connectability and refCounting ([aef9578](https://github.com/ReactiveX/RxJS/commit/aef9578)), closes [#678](https://github.com/ReactiveX/RxJS/issues/678)
- **debounce:** Fix debounce to unsubscribe duration Observables ([dea7847](https://github.com/ReactiveX/RxJS/commit/dea7847))
- **expand:** fix expand's concurrency behavior ([01f86e5](https://github.com/ReactiveX/RxJS/commit/01f86e5))
- **expand:** terminate recursive call when destination completes ([3b8cf94](https://github.com/ReactiveX/RxJS/commit/3b8cf94))
- **Observable:** Subjects no longer wrapped in Subscriber ([5cb0f2b](https://github.com/ReactiveX/RxJS/commit/5cb0f2b)), closes [#825](https://github.com/ReactiveX/RxJS/issues/825) [#748](https://github.com/ReactiveX/RxJS/issues/748)
- **Observer:** anonymous observers now allow missing handlers ([a11c763](https://github.com/ReactiveX/RxJS/commit/a11c763)), closes [#723](https://github.com/ReactiveX/RxJS/issues/723)
- **operators:** Remove shareReplay and shareBehavior ([536a6a6](https://github.com/ReactiveX/RxJS/commit/536a6a6)), closes [#710](https://github.com/ReactiveX/RxJS/issues/710)
- **publish:** copy readme and license, remove scripts ([439a2f3](https://github.com/ReactiveX/RxJS/commit/439a2f3)), closes [#845](https://github.com/ReactiveX/RxJS/issues/845)
- **throttleTime:** fix and rename throttleTime operator ([3b0c1f3](https://github.com/ReactiveX/RxJS/commit/3b0c1f3))
- **TimerObservable:** accepts absolute date for dueTime ([e284fb8](https://github.com/ReactiveX/RxJS/commit/e284fb8)), closes [#648](https://github.com/ReactiveX/RxJS/issues/648)

### Features

- **AsyncSubject:** add AsyncSubject ([34c05fe](https://github.com/ReactiveX/RxJS/commit/34c05fe))
- **bindCallback:** remove thisArg ([feea9a1](https://github.com/ReactiveX/RxJS/commit/feea9a1))
- **bindCallback:** rename fromCallback to bindCallback ([305d66d](https://github.com/ReactiveX/RxJS/commit/305d66d)), closes [#876](https://github.com/ReactiveX/RxJS/issues/876)
- **callback:** Add Observable.fromCallback ([9f751e7](https://github.com/ReactiveX/RxJS/commit/9f751e7))
- **combineLatest:** accept array of observable as parameter ([2edd92c](https://github.com/ReactiveX/RxJS/commit/2edd92c)), closes [#594](https://github.com/ReactiveX/RxJS/issues/594)
- **forkJoin:** accept array of observable as parameter ([d45f672](https://github.com/ReactiveX/RxJS/commit/d45f672))
- **mergeScan:** support concurrency parameter for mergeScan ([fe0eb37](https://github.com/ReactiveX/RxJS/commit/fe0eb37)), closes [#868](https://github.com/ReactiveX/RxJS/issues/868)
- **usage:** add auto-patching operators ([1ab3508](https://github.com/ReactiveX/RxJS/commit/1ab3508)), closes [#860](https://github.com/ReactiveX/RxJS/issues/860)
- **skipWhile:** add skipWhile operator ([a2244e0](https://github.com/ReactiveX/RxJS/commit/a2244e0))
- **switchFirst:** add switchFirst and switchMapFirst ([71e3dd1](https://github.com/ReactiveX/RxJS/commit/71e3dd1))
- **publishLast:** add publishLast operator ([9bef228](https://github.com/ReactiveX/RxJS/commit/9bef228)), closes [#883](https://github.com/ReactiveX/RxJS/issues/883)
- **takeWhile:** add takeWhile operator ([48e53ea](https://github.com/ReactiveX/RxJS/commit/48e53ea)), closes [#695](https://github.com/ReactiveX/RxJS/issues/695)
- **takeWhile:** remove thisArg ([b5219a4](https://github.com/ReactiveX/RxJS/commit/b5219a4))
- **throttle:** add throttle operator with durationSelector ([c3bf3e7](https://github.com/ReactiveX/RxJS/commit/c3bf3e7)), closes [#496](https://github.com/ReactiveX/RxJS/issues/496)

### Performance Improvements

- **ReplaySubject:** fix memory leak of growing buffer ([0a73b4d](https://github.com/ReactiveX/RxJS/commit/0a73b4d)), closes [#578](https://github.com/ReactiveX/RxJS/issues/578)

<a name="5.0.0-alpha.11"></a>

# [5.0.0-alpha.11](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.10...v5.0.0-alpha.11) (2015-12-01)

### Bug Fixes

- **catch:** fix catch to dispose old subscriptions ([280f7ed](https://github.com/ReactiveX/RxJS/commit/280f7ed)), closes [#763](https://github.com/ReactiveX/RxJS/issues/763)
- **concat:** accept scheduler parameter ([8859702](https://github.com/ReactiveX/RxJS/commit/8859702))
- **ConnectableObservable:** fix ConnectableObservable connectability and refCounting ([aef9578](https://github.com/ReactiveX/RxJS/commit/aef9578)), closes [#678](https://github.com/ReactiveX/RxJS/issues/678)
- **debounce:** Fix debounce to unsubscribe duration Observables ([dea7847](https://github.com/ReactiveX/RxJS/commit/dea7847))
- **expand:** fix expand's concurrency behavior ([01f86e5](https://github.com/ReactiveX/RxJS/commit/01f86e5))
- **expand:** terminate recursive call when destination completes ([3b8cf94](https://github.com/ReactiveX/RxJS/commit/3b8cf94))
- **Observer:** anonymous observers now allow missing handlers ([a11c763](https://github.com/ReactiveX/RxJS/commit/a11c763)), closes [#723](https://github.com/ReactiveX/RxJS/issues/723)
- **operators:** Remove shareReplay and shareBehavior ([536a6a6](https://github.com/ReactiveX/RxJS/commit/536a6a6)), closes [#710](https://github.com/ReactiveX/RxJS/issues/710)
- **test:** make explicit unsubscription for observable ([505f5b7](https://github.com/ReactiveX/RxJS/commit/505f5b7))
- **throttleTime:** fix and rename throttleTime operator ([3b0c1f3](https://github.com/ReactiveX/RxJS/commit/3b0c1f3))
- **TimerObservable:** accepts absolute date for dueTime ([e284fb8](https://github.com/ReactiveX/RxJS/commit/e284fb8)), closes [#648](https://github.com/ReactiveX/RxJS/issues/648)

### Features

- **callback:** Add Observable.fromCallback ([9f751e7](https://github.com/ReactiveX/RxJS/commit/9f751e7))
- **combineLatest:** accept array of observable as parameter ([2edd92c](https://github.com/ReactiveX/RxJS/commit/2edd92c)), closes [#594](https://github.com/ReactiveX/RxJS/issues/594)
- **forkJoin:** accept array of observable as parameter ([d45f672](https://github.com/ReactiveX/RxJS/commit/d45f672))
- **operator:** add skipWhile operator ([a2244e0](https://github.com/ReactiveX/RxJS/commit/a2244e0))
- **operator:** add switchFirst and switchMapFirst ([71e3dd1](https://github.com/ReactiveX/RxJS/commit/71e3dd1))
- **takeWhile:** add takeWhile operator ([48e53ea](https://github.com/ReactiveX/RxJS/commit/48e53ea)), closes [#695](https://github.com/ReactiveX/RxJS/issues/695)
- **throttle:** add throttle operator with durationSelector ([c3bf3e7](https://github.com/ReactiveX/RxJS/commit/c3bf3e7)), closes [#496](https://github.com/ReactiveX/RxJS/issues/496)

### Performance Improvements

- **ReplaySubject:** fix memory leak of growing buffer ([0a73b4d](https://github.com/ReactiveX/RxJS/commit/0a73b4d)), closes [#578](https://github.com/ReactiveX/RxJS/issues/578)

<a name="5.0.0-alpha.10"></a>

# [5.0.0-alpha.10](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.9...v5.0.0-alpha.10) (2015-11-10)

### Bug Fixes

- **Immediate:** set immediate should no longer throw in Chrome ([a3de7d9](https://github.com/ReactiveX/RxJS/commit/a3de7d9)), closes [#690](https://github.com/ReactiveX/RxJS/issues/690)

<a name="5.0.0-alpha.9"></a>

# [5.0.0-alpha.9](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.8...v5.0.0-alpha.9) (2015-11-10)

### Bug Fixes

- **util:** incorrect Symbol.iterator for es6-shim ([15bf32c](https://github.com/ReactiveX/RxJS/commit/15bf32c))

### Features

- **forkJoin:** accept promise, resultselector as parameter of forkJoin ([190f349](https://github.com/ReactiveX/RxJS/commit/190f349)), closes [#507](https://github.com/ReactiveX/RxJS/issues/507)

<a name="5.0.0-alpha.8"></a>

# [5.0.0-alpha.8](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.7...v5.0.0-alpha.8) (2015-11-06)

### Bug Fixes

- **concat:** handle a given scheduler correctly ([8745216](https://github.com/ReactiveX/RxJS/commit/8745216))
- **package.json:** loosen the engines/npm semver range to prevent false warnings ([df791c6](https://github.com/ReactiveX/RxJS/commit/df791c6))
- **skipUntil:** unsubscribe source when it completes ([8a4162b](https://github.com/ReactiveX/RxJS/commit/8a4162b)), closes [#577](https://github.com/ReactiveX/RxJS/issues/577)
- **take:** deal with total <= 0 and add tests ([c5cc06f](https://github.com/ReactiveX/RxJS/commit/c5cc06f))
- **windowWhen:** fix windowWhen with regard to unsubscriptions ([8174947](https://github.com/ReactiveX/RxJS/commit/8174947))

### Features

- **mergeScan:** add new mergeScan operator. ([0ebb5bd](https://github.com/ReactiveX/RxJS/commit/0ebb5bd))
- **multicast:** support both Subject and subjectFactory arguments ([f779027](https://github.com/ReactiveX/RxJS/commit/f779027))

### BREAKING CHANGES

- **publish:** reverted to RxJS 4 behavior
- **publishBehavior:** reverted to RxJS 4 behavior
- **publishReplay:** reverted to RxJS 4 behavior
- **shareBehavior:** removed
- **shareReplay:** removed

<a name="5.0.0-alpha.7"></a>

# [5.0.0-alpha.7](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.6...v5.0.0-alpha.7) (2015-10-27)

### Bug Fixes

- **NextTickAction:** fix unsubscription behavior ([3d8264c](https://github.com/ReactiveX/RxJS/commit/3d8264c)), closes [#582](https://github.com/ReactiveX/RxJS/issues/582)
- **buffer:** cleanup notifier subscription when unsubscribed ([1b30aa9](https://github.com/ReactiveX/RxJS/commit/1b30aa9))
- **delay:** accepts absolute time delay ([b109100](https://github.com/ReactiveX/RxJS/commit/b109100))
- **mergeMapTo:** mergeMapTo result should complete ([6f9859e](https://github.com/ReactiveX/RxJS/commit/6f9859e))
- **operator:** update type definitions for union types ([9d90c75](https://github.com/ReactiveX/RxJS/commit/9d90c75)), closes [#581](https://github.com/ReactiveX/RxJS/issues/581)
- **repeat:** fix inner subscription semantics for repeat ([f67a596](https://github.com/ReactiveX/RxJS/commit/f67a596)), closes [#554](https://github.com/ReactiveX/RxJS/issues/554)
- **switchMapTo:** reimplement switchMapTo to pass tests ([d4789cd](https://github.com/ReactiveX/RxJS/commit/d4789cd))
- **takeUntil:** unsubscribe notifier when it completes ([9415196](https://github.com/ReactiveX/RxJS/commit/9415196))

### Features

- **operator:** add max operator ([7fda036](https://github.com/ReactiveX/RxJS/commit/7fda036))
- **operator:** add min operator ([79cb6cf](https://github.com/ReactiveX/RxJS/commit/79cb6cf))
- **shareBehavior:** add shareBehavior and its tests ([97ff1ec](https://github.com/ReactiveX/RxJS/commit/97ff1ec))

<a name="5.0.0-alpha.6"></a>

# [5.0.0-alpha.6](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.5...v5.0.0-alpha.6) (2015-10-17)

### Bug Fixes

- **retryWhen:** fix internal unsubscriptions ([5aff5e8](https://github.com/ReactiveX/RxJS/commit/5aff5e8))
- **scan:** scan now behaves like RxJS 4 scan ([27f9c09](https://github.com/ReactiveX/RxJS/commit/27f9c09))

<a name="5.0.0-alpha.5"></a>

# [5.0.0-alpha.5](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.4...v5.0.0-alpha.5) (2015-10-16)

### Bug Fixes

- **bufferToggle:** fix bugs in order to pass tests ([949fa31](https://github.com/ReactiveX/RxJS/commit/949fa31))
- **mergeAll:** fix mergeAll micro performance tests to use mapTo instead of map. ([616e86e](https://github.com/ReactiveX/RxJS/commit/616e86e))
- **package:** correct typings path ([a501b06](https://github.com/ReactiveX/RxJS/commit/a501b06))
- **repeat:** add additional resubscription behavior ([4f9f33b](https://github.com/ReactiveX/RxJS/commit/4f9f33b)), closes [#516](https://github.com/ReactiveX/RxJS/issues/516)
- **retry:** fix internal unsubscriptions for retry ([cc92f45](https://github.com/ReactiveX/RxJS/commit/cc92f45)), closes [#546](https://github.com/ReactiveX/RxJS/issues/546)
- **windowToggle:** fix window closing and unsubscription semantics ([0cb21e6](https://github.com/ReactiveX/RxJS/commit/0cb21e6))

<a name="5.0.0-alpha.4"></a>

# [5.0.0-alpha.4](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.3...5.0.0-alpha.4) (2015-10-15)

### Bug Fixes

- **Subject:** fix missing unsubscribe call ([9dd27d6](https://github.com/ReactiveX/RxJS/commit/9dd27d6))
- **Subscriber:** avoid implicit any ([08faaa9](https://github.com/ReactiveX/RxJS/commit/08faaa9))
- **bufferWhen:** onComplete of closings determine buffers ([5d28a38](https://github.com/ReactiveX/RxJS/commit/5d28a38))
- **fromEvent:** make selector argument optional in fromEvent static method ([71d90b4](https://github.com/ReactiveX/RxJS/commit/71d90b4))
- **skipUntil:** update skipUntil behavior with error, completion ([6f0d98f](https://github.com/ReactiveX/RxJS/commit/6f0d98f)), closes [#518](https://github.com/ReactiveX/RxJS/issues/518)
- **windowCount:** fix windowCount window opening times ([908ae56](https://github.com/ReactiveX/RxJS/commit/908ae56)), closes [#273](https://github.com/ReactiveX/RxJS/issues/273)

### Features

- **operator:** add debounce operator ([a1e652f](https://github.com/ReactiveX/RxJS/commit/a1e652f)), closes [#493](https://github.com/ReactiveX/RxJS/issues/493)
- **operator:** add debounceTime operator ([dd2ba40](https://github.com/ReactiveX/RxJS/commit/dd2ba40))

### Performance Improvements

- **ScalarObservable:** add fast-path for mapping scalar observables ([7b0d3dc](https://github.com/ReactiveX/RxJS/commit/7b0d3dc))
- **count:** fast-path for counting over scalars ([c35a120](https://github.com/ReactiveX/RxJS/commit/c35a120))
- **filter:** add fast-path for filtering scalar observables ([e2e8954](https://github.com/ReactiveX/RxJS/commit/e2e8954))
- **reduce:** add fast-path for reducing over scalar observables ([4c65136](https://github.com/ReactiveX/RxJS/commit/4c65136))
- **scan:** fast-path for scanning scalars ([0201b92](https://github.com/ReactiveX/RxJS/commit/0201b92))
- **skip:** fast-path for skip over scalar observable ([9b49936](https://github.com/ReactiveX/RxJS/commit/9b49936))
- **take:** add fast-path for take over scalars ([33053b1](https://github.com/ReactiveX/RxJS/commit/33053b1))

<a name="5.0.0-alpha.3"></a>

# [5.0.0-alpha.3](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.2...5.0.0-alpha.3) (2015-10-13)

### Bug Fixes

- **Observable:** fix type signature of some static operators ([e5364de](https://github.com/ReactiveX/RxJS/commit/e5364de))
- **Subject.create:** ensure operator property not required for Observable subscription ([2259de2](https://github.com/ReactiveX/RxJS/commit/2259de2)), closes [#483](https://github.com/ReactiveX/RxJS/issues/483)
- **TestScheduler:** stop sorting actual results ([51db0b8](https://github.com/ReactiveX/RxJS/commit/51db0b8)), closes [#422](https://github.com/ReactiveX/RxJS/issues/422)
- **benchpress:** update benchpress dependencies and config ([8513eaa](https://github.com/ReactiveX/RxJS/commit/8513eaa)), closes [#348](https://github.com/ReactiveX/RxJS/issues/348)
- **buffer:** change behavior of buffer to more closely match RxJS 4 ([b66592d](https://github.com/ReactiveX/RxJS/commit/b66592d))
- **combineLatest:** fix type signature ([a3e6deb](https://github.com/ReactiveX/RxJS/commit/a3e6deb))
- **defer:** fix type signature ([11327b9](https://github.com/ReactiveX/RxJS/commit/11327b9))
- **empty:** fix type signature ([893cb7e](https://github.com/ReactiveX/RxJS/commit/893cb7e))
- **fromPromise:** fix type signature ([17415fa](https://github.com/ReactiveX/RxJS/commit/17415fa))
- **groupBy:** durationSelector cannot keep source alive ([57e4207](https://github.com/ReactiveX/RxJS/commit/57e4207))
- **groupBy:** fix bugs related to group resets ([23a7574](https://github.com/ReactiveX/RxJS/commit/23a7574))
- **groupBy:** fix bugs with groupBy ([86992c6](https://github.com/ReactiveX/RxJS/commit/86992c6))
- **interval:** fix signature type ([9c238c0](https://github.com/ReactiveX/RxJS/commit/9c238c0))
- **operator:** startWith operator accepts scheduler, multiple values ([d1d339a](https://github.com/ReactiveX/RxJS/commit/d1d339a))
- **operators:** reorder signature of resultSelectors ([fc1724d](https://github.com/ReactiveX/RxJS/commit/fc1724d))
- **range:** fix type signature ([9237d0b](https://github.com/ReactiveX/RxJS/commit/9237d0b))
- **timeout:** fix absolute timeout behavior ([8ec06cf](https://github.com/ReactiveX/RxJS/commit/8ec06cf))
- **timeout:** update behavior of timeout, timeoutWith ([16bd691](https://github.com/ReactiveX/RxJS/commit/16bd691))
- **timer:** fix type signature ([fffb96c](https://github.com/ReactiveX/RxJS/commit/fffb96c))
- **window:** handle closingNotifier errors/completes ([42beff1](https://github.com/ReactiveX/RxJS/commit/42beff1))

### Features

- **TestScheduler:** support unsubscription marbles ([ffb0bb9](https://github.com/ReactiveX/RxJS/commit/ffb0bb9))
- **count:** add predicate support in count() ([42d1add](https://github.com/ReactiveX/RxJS/commit/42d1add)), closes [#425](https://github.com/ReactiveX/RxJS/issues/425)
- **dematerialize:** add dematerialize operator ([0a8b074](https://github.com/ReactiveX/RxJS/commit/0a8b074)), closes [#475](https://github.com/ReactiveX/RxJS/issues/475)
- **do:** do will now handle an observer as an argument ([c1a4994](https://github.com/ReactiveX/RxJS/commit/c1a4994)), closes [#476](https://github.com/ReactiveX/RxJS/issues/476)
- **first:** add resultSelector ([3c20fcc](https://github.com/ReactiveX/RxJS/commit/3c20fcc)), closes [#417](https://github.com/ReactiveX/RxJS/issues/417)
- **last:** add resultSelector argument ([5a4896c](https://github.com/ReactiveX/RxJS/commit/5a4896c)), closes [#418](https://github.com/ReactiveX/RxJS/issues/418)
- **operator:** add every operator ([d11f32e](https://github.com/ReactiveX/RxJS/commit/d11f32e))
- **operator:** add timeInterval operator ([6cc0615](https://github.com/ReactiveX/RxJS/commit/6cc0615))
- **share:** add the share operator ([c36f2be](https://github.com/ReactiveX/RxJS/commit/c36f2be)), closes [#439](https://github.com/ReactiveX/RxJS/issues/439)
- **shareReplay:** add the shareReplay() operator ([65c84ea](https://github.com/ReactiveX/RxJS/commit/65c84ea))

### Performance Improvements

- **ReplaySubject:** remove unnecessary computation ([488ac2e](https://github.com/ReactiveX/RxJS/commit/488ac2e))

### BREAKING CHANGES

- **operators with resultSelectors** (mergeMap, concatMap, switchMap, etc):
  The function signature of resultSelectors used to be (innerValue,
  outerValue, innerIndex, outerIndex) but this commits changes it to
  be (outerValue, innerValue, outerIndex, innerIndex), to match
  signatures in RxJS 4.

<a name="5.0.0-alpha.2"></a>

# [5.0.0-alpha.2](https://github.com/ReactiveX/RxJS/compare/5.0.0-alpha.1...5.0.0-alpha.2) (2015-09-30)

### Bug Fixes

- **concat:** let observable concat instead of merge ([c17e832](https://github.com/ReactiveX/RxJS/commit/c17e832))

### Features

- **operator:** add find, findIndex operator ([7c6cc9d](https://github.com/ReactiveX/RxJS/commit/7c6cc9d))
- **operator:** add first operator ([274c233](https://github.com/ReactiveX/RxJS/commit/274c233))
- **operator:** add ignoreElements operator ([fe1a952](https://github.com/ReactiveX/RxJS/commit/fe1a952))
- **zip:** zip now supports never-ending iterables ([a5684ba](https://github.com/ReactiveX/RxJS/commit/a5684ba)), closes [#397](https://github.com/ReactiveX/RxJS/issues/397)

<a name="5.0.0-alpha.1"></a>

# [5.0.0-alpha.1](https://github.com/ReactiveX/RxJS/compare/0.0.0-prealpha.3...5.0.0-alpha.1) (2015-09-23)

### Bug Fixes

- **Promises:** escape promise error trap ([c69088a](https://github.com/ReactiveX/RxJS/commit/c69088a))
- **TestScheduler:** ensure TestScheduler subscribes to expectations before hot subjects ([b9b2ba5](https://github.com/ReactiveX/RxJS/commit/b9b2ba5))
- **TestScheduler:** properly schedule actions added dynamically ([069ede4](https://github.com/ReactiveX/RxJS/commit/069ede4))
- **buffer:** do not emit empty buffer when completes ([252fccb](https://github.com/ReactiveX/RxJS/commit/252fccb))
- **bufferTime:** inner intervals will now clean up properly ([4ef41b0](https://github.com/ReactiveX/RxJS/commit/4ef41b0))
- **expand:** Fix expand to stay open until the source Observable completes. ([20ef785](https://github.com/ReactiveX/RxJS/commit/20ef785))
- **expand:** fix expand operator to match Rx3 ([67f9623](https://github.com/ReactiveX/RxJS/commit/67f9623))
- **last:** emit value matches with predicate instead of result of predicate ([0f635ee](https://github.com/ReactiveX/RxJS/commit/0f635ee))
- **merge:** fix issues with async in merge ([7a15304](https://github.com/ReactiveX/RxJS/commit/7a15304))
- **mergeAll:** merge all will properly handle async observables ([43b63cc](https://github.com/ReactiveX/RxJS/commit/43b63cc))
- **package:** specify supported npm version ([f72e622](https://github.com/ReactiveX/RxJS/commit/f72e622))
- **switchAll:** switch all will properly handle async observables ([c2e2d29](https://github.com/ReactiveX/RxJS/commit/c2e2d29))
- **switchAll/switchLatest:** inner subscriptions should now properly unsub ([38a45f8](https://github.com/ReactiveX/RxJS/commit/38a45f8)), closes [#302](https://github.com/ReactiveX/RxJS/issues/302)

### Features

- **combineLatest:** supports promises, iterables, lowercase-o observables and Observables ([ce76e4e](https://github.com/ReactiveX/RxJS/commit/ce76e4e))
- **config:** add global configuration of Promise capability ([e7eb5d7](https://github.com/ReactiveX/RxJS/commit/e7eb5d7)), closes [#115](https://github.com/ReactiveX/RxJS/issues/115)
- **expand:** now handles promises, iterables and lowercase-o observables ([c5239e9](https://github.com/ReactiveX/RxJS/commit/c5239e9))
- **mergeAll:** now supports promises, iterables and lowercase-o observables ([4c16aa6](https://github.com/ReactiveX/RxJS/commit/4c16aa6))
- **operator:** add elementAt operator ([cd562c4](https://github.com/ReactiveX/RxJS/commit/cd562c4))
- **operator:** add isEmpty operator ([80f72c5](https://github.com/ReactiveX/RxJS/commit/80f72c5))
- **operator:** add last operator ([d841b11](https://github.com/ReactiveX/RxJS/commit/d841b11)), closes [#304](https://github.com/ReactiveX/RxJS/issues/304) [#306](https://github.com/ReactiveX/RxJS/issues/306)
- **operator:** add single operator ([49484a2](https://github.com/ReactiveX/RxJS/commit/49484a2))
- **switch:** add promise, iterable and array support ([24fdd34](https://github.com/ReactiveX/RxJS/commit/24fdd34))
- **withLatestFrom:** default array output, handle other types ([cb393dc](https://github.com/ReactiveX/RxJS/commit/cb393dc))
- **zip:** supports promises, iterables and lowercase-o observables ([d332a0e](https://github.com/ReactiveX/RxJS/commit/d332a0e))

<a name="0.0.0-prealpha.3"></a>

# [0.0.0-prealpha.3](https://github.com/ReactiveX/RxJS/compare/0.0.0-prealpha.2...0.0.0-prealpha.3) (2015-09-11)

### Bug Fixes

- **root:** use self as the root object when available ([0428a85](https://github.com/ReactiveX/RxJS/commit/0428a85))

<a name="0.0.0-prealpha.2"></a>

# [0.0.0-prealpha.2](https://github.com/ReactiveX/RxJS/compare/0.0.0-prealpha.1...0.0.0-prealpha.2) (2015-09-11)

### Bug Fixes

- **bufferCount:** set default value for skip argument, do not emit empty buffer at the end ([2c1a9dc](https://github.com/ReactiveX/RxJS/commit/2c1a9dc))
- **windowCount:** set default value for skip argument, do not emit empty buffer at the end ([a513dbb](https://github.com/ReactiveX/RxJS/commit/a513dbb))

### Features

- **Observable:** add static create method ([e0d27ba](https://github.com/ReactiveX/RxJS/commit/e0d27ba)), closes [#255](https://github.com/ReactiveX/RxJS/issues/255)
- **TestScheduler:** add TestScheduler ([b23daf1](https://github.com/ReactiveX/RxJS/commit/b23daf1)), closes [#270](https://github.com/ReactiveX/RxJS/issues/270)
- **VirtualTimeScheduler:** add VirtualTimeScheduler ([96f9386](https://github.com/ReactiveX/RxJS/commit/96f9386)), closes [#269](https://github.com/ReactiveX/RxJS/issues/269)
- **operator:** add sample and sampleTime ([9e62789](https://github.com/ReactiveX/RxJS/commit/9e62789)), closes [#178](https://github.com/ReactiveX/RxJS/issues/178)

<a name="0.0.0-prealpha.1"></a>

# [0.0.0-prealpha.1](https://github.com/ReactiveX/RxJS/compare/0441dea...0.0.0-prealpha.1) (2015-09-02)

### Bug Fixes

- **combineLatest:** check for limits higher than total observable count ([81e5dfb](https://github.com/ReactiveX/RxJS/commit/81e5dfb))
- **rx:** add hack to export global until better global build exists ([1a543b0](https://github.com/ReactiveX/RxJS/commit/1a543b0))
- **subscription-ref:** add setter for isDisposed ([6fe5427](https://github.com/ReactiveX/RxJS/commit/6fe5427))
- **take:** complete on limit reached ([801a711](https://github.com/ReactiveX/RxJS/commit/801a711))

### Features

- **benchpress:** add benchpress config and flatmap spec ([0441dea](https://github.com/ReactiveX/RxJS/commit/0441dea))
- **catch:** add catch operator, related to #141, closes #130 ([94b4c01](https://github.com/ReactiveX/RxJS/commit/94b4c01)), closes [#130](https://github.com/ReactiveX/RxJS/issues/130)
- **from:** let from handle any "observablesque" ([526d4c3](https://github.com/ReactiveX/RxJS/commit/526d4c3)), closes [#156](https://github.com/ReactiveX/RxJS/issues/156) [#236](https://github.com/ReactiveX/RxJS/issues/236)
- **index:** add index module which requires commonjs build ([379d2d1](https://github.com/ReactiveX/RxJS/commit/379d2d1)), closes [#117](https://github.com/ReactiveX/RxJS/issues/117)
- **observable:** add Observable.all (forkJoin) ([44a4ee1](https://github.com/ReactiveX/RxJS/commit/44a4ee1))
- **operator:** Add count operator. ([30dd894](https://github.com/ReactiveX/RxJS/commit/30dd894))
- **operator:** Add distinctUntilChanged and distinctUntilKeyChanged ([f9ba4da](https://github.com/ReactiveX/RxJS/commit/f9ba4da))
- **operator:** Add do operator. ([7d9b52b](https://github.com/ReactiveX/RxJS/commit/7d9b52b))
- **operator:** Add expand operator. ([47b178b](https://github.com/ReactiveX/RxJS/commit/47b178b))
- **operator:** Add minimal delay operator. ([7851885](https://github.com/ReactiveX/RxJS/commit/7851885))
- **operator:** add buffer operators: buffer, bufferWhen, bufferTime, bufferCount, and bufferTog ([9f8347f](https://github.com/ReactiveX/RxJS/commit/9f8347f)), closes [#207](https://github.com/ReactiveX/RxJS/issues/207)
- **operator:** add debounce ([f03adaf](https://github.com/ReactiveX/RxJS/commit/f03adaf)), closes [#193](https://github.com/ReactiveX/RxJS/issues/193)
- **operator:** add defaultIfEmpty ([c80688b](https://github.com/ReactiveX/RxJS/commit/c80688b))
- **operator:** add finally ([526e4c9](https://github.com/ReactiveX/RxJS/commit/526e4c9))
- **operator:** add fromEventPattern creator function ([1095d4c](https://github.com/ReactiveX/RxJS/commit/1095d4c))
- **operator:** add groupBy ([1e13aea](https://github.com/ReactiveX/RxJS/commit/1e13aea)), closes [#165](https://github.com/ReactiveX/RxJS/issues/165)
- **operator:** add materialize. closes #132 ([6d9f6ae](https://github.com/ReactiveX/RxJS/commit/6d9f6ae)), closes [#132](https://github.com/ReactiveX/RxJS/issues/132)
- **operator:** add publishBehavior operator and spec ([249ab8d](https://github.com/ReactiveX/RxJS/commit/249ab8d))
- **operator:** add publishReplay operator and spec ([a0c47d6](https://github.com/ReactiveX/RxJS/commit/a0c47d6))
- **operator:** add retry ([4451db5](https://github.com/ReactiveX/RxJS/commit/4451db5))
- **operator:** add retryWhen operator. closes #129 ([65eb50e](https://github.com/ReactiveX/RxJS/commit/65eb50e)), closes [#129](https://github.com/ReactiveX/RxJS/issues/129)
- **operator:** add skipUntil ([ef2620e](https://github.com/ReactiveX/RxJS/commit/ef2620e)), closes [#180](https://github.com/ReactiveX/RxJS/issues/180)
- **operator:** add throttleO ([1d735b9](https://github.com/ReactiveX/RxJS/commit/1d735b9)), closes [#191](https://github.com/ReactiveX/RxJS/issues/191)
- **operator:** add timeout and timeoutWith ([bb440ad](https://github.com/ReactiveX/RxJS/commit/bb440ad)), closes [#244](https://github.com/ReactiveX/RxJS/issues/244)
- **operator:** add toPromise operator. closes #159 ([361a53b](https://github.com/ReactiveX/RxJS/commit/361a53b)), closes [#159](https://github.com/ReactiveX/RxJS/issues/159)
- **operator:** add window operators: window, windowWhen, windowTime, windowCount, windowToggle ([9f5d510](https://github.com/ReactiveX/RxJS/commit/9f5d510)), closes [#195](https://github.com/ReactiveX/RxJS/issues/195)
- **operator:** add withLatestFrom ([322218a](https://github.com/ReactiveX/RxJS/commit/322218a)), closes [#209](https://github.com/ReactiveX/RxJS/issues/209)
- **operator:** implement startWith(). ([1f36d99](https://github.com/ReactiveX/RxJS/commit/1f36d99))
rܤx/# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance, race,
religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
  advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
  address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting Ben Lesh (ben@benlesh.com), Tracy Lee (tracy@thisdot.co) or OJ Kwon (kwon.ohjoong@gmail.com). All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org
,ݬx8+                               Apache License
                         Version 2.0, January 2004
                      http://www.apache.org/licenses/

 TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

 1. Definitions.

    "License" shall mean the terms and conditions for use, reproduction,
    and distribution as defined by Sections 1 through 9 of this document.

    "Licensor" shall mean the copyright owner or entity authorized by
    the copyright owner that is granting the License.

    "Legal Entity" shall mean the union of the acting entity and all
    other entities that control, are controlled by, or are under common
    control with that entity. For the purposes of this definition,
    "control" means (i) the power, direct or indirect, to cause the
    direction or management of such entity, whether by contract or
    otherwise, or (ii) ownership of fifty percent (50%) or more of the
    outstanding shares, or (iii) beneficial ownership of such entity.

    "You" (or "Your") shall mean an individual or Legal Entity
    exercising permissions granted by this License.

    "Source" form shall mean the preferred form for making modifications,
    including but not limited to software source code, documentation
    source, and configuration files.

    "Object" form shall mean any form resulting from mechanical
    transformation or translation of a Source form, including but
    not limited to compiled object code, generated documentation,
    and conversions to other media types.

    "Work" shall mean the work of authorship, whether in Source or
    Object form, made available under the License, as indicated by a
    copyright notice that is included in or attached to the work
    (an example is provided in the Appendix below).

    "Derivative Works" shall mean any work, whether in Source or Object
    form, that is based on (or derived from) the Work and for which the
    editorial revisions, annotations, elaborations, or other modifications
    represent, as a whole, an original work of authorship. For the purposes
    of this License, Derivative Works shall not include works that remain
    separable from, or merely link (or bind by name) to the interfaces of,
    the Work and Derivative Works thereof.

    "Contribution" shall mean any work of authorship, including
    the original version of the Work and any modifications or additions
    to that Work or Derivative Works thereof, that is intentionally
    submitted to Licensor for inclusion in the Work by the copyright owner
    or by an individual or Legal Entity authorized to submit on behalf of
    the copyright owner. For the purposes of this definition, "submitted"
    means any form of electronic, verbal, or written communication sent
    to the Licensor or its representatives, including but not limited to
    communication on electronic mailing lists, source code control systems,
    and issue tracking systems that are managed by, or on behalf of, the
    Licensor for the purpose of discussing and improving the Work, but
    excluding communication that is conspicuously marked or otherwise
    designated in writing by the copyright owner as "Not a Contribution."

    "Contributor" shall mean Licensor and any individual or Legal Entity
    on behalf of whom a Contribution has been received by Licensor and
    subsequently incorporated within the Work.

 2. Grant of Copyright License. Subject to the terms and conditions of
    this License, each Contributor hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    copyright license to reproduce, prepare Derivative Works of,
    publicly display, publicly perform, sublicense, and distribute the
    Work and such Derivative Works in Source or Object form.

 3. Grant of Patent License. Subject to the terms and conditions of
    this License, each Contributor hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    (except as stated in this section) patent license to make, have made,
    use, offer to sell, sell, import, and otherwise transfer the Work,
    where such license applies only to those patent claims licensable
    by such Contributor that are necessarily infringed by their
    Contribution(s) alone or by combination of their Contribution(s)
    with the Work to which such Contribution(s) was submitted. If You
    institute patent litigation against any entity (including a
    cross-claim or counterclaim in a lawsuit) alleging that the Work
    or a Contribution incorporated within the Work constitutes direct
    or contributory patent infringement, then any patent licenses
    granted to You under this License for that Work shall terminate
    as of the date such litigation is filed.

 4. Redistribution. You may reproduce and distribute copies of the
    Work or Derivative Works thereof in any medium, with or without
    modifications, and in Source or Object form, provided that You
    meet the following conditions:

    (a) You must give any other recipients of the Work or
        Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices
        stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works
        that You distribute, all copyright, patent, trademark, and
        attribution notices from the Source form of the Work,
        excluding those notices that do not pertain to any part of
        the Derivative Works; and

    (d) If the Work includes a "NOTICE" text file as part of its
        distribution, then any Derivative Works that You distribute must
        include a readable copy of the attribution notices contained
        within such NOTICE file, excluding those notices that do not
        pertain to any part of the Derivative Works, in at least one
        of the following places: within a NOTICE text file distributed
        as part of the Derivative Works; within the Source form or
        documentation, if provided along with the Derivative Works; or,
        within a display generated by the Derivative Works, if and
        wherever such third-party notices normally appear. The contents
        of the NOTICE file are for informational purposes only and
        do not modify the License. You may add Your own attribution
        notices within Derivative Works that You distribute, alongside
        or as an addendum to the NOTICE text from the Work, provided
        that such additional attribution notices cannot be construed
        as modifying the License.

    You may add Your own copyright statement to Your modifications and
    may provide additional or different license terms and conditions
    for use, reproduction, or distribution of Your modifications, or
    for any such Derivative Works as a whole, provided Your use,
    reproduction, and distribution of the Work otherwise complies with
    the conditions stated in this License.

 5. Submission of Contributions. Unless You explicitly state otherwise,
    any Contribution intentionally submitted for inclusion in the Work
    by You to the Licensor shall be under the terms and conditions of
    this License, without any additional terms or conditions.
    Notwithstanding the above, nothing herein shall supersede or modify
    the terms of any separate license agreement you may have executed
    with Licensor regarding such Contributions.

 6. Trademarks. This License does not grant permission to use the trade
    names, trademarks, service marks, or product names of the Licensor,
    except as required for reasonable and customary use in describing the
    origin of the Work and reproducing the content of the NOTICE file.

 7. Disclaimer of Warranty. Unless required by applicable law or
    agreed to in writing, Licensor provides the Work (and each
    Contributor provides its Contributions) on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    implied, including, without limitation, any warranties or conditions
    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    PARTICULAR PURPOSE. You are solely responsible for determining the
    appropriateness of using or redistributing the Work and assume any
    risks associated with Your exercise of permissions under this License.

 8. Limitation of Liability. In no event and under no legal theory,
    whether in tort (including negligence), contract, or otherwise,
    unless required by applicable law (such as deliberate and grossly
    negligent acts) or agreed to in writing, shall any Contributor be
    liable to You for damages, including any direct, indirect, special,
    incidental, or consequential damages of any character arising as a
    result of this License or out of the use or inability to use the
    Work (including but not limited to damages for loss of goodwill,
    work stoppage, computer failure or malfunction, or any and all
    other commercial damages or losses), even if such Contributor
    has been advised of the possibility of such damages.

 9. Accepting Warranty or Additional Liability. While redistributing
    the Work or Derivative Works thereof, You may choose to offer,
    and charge a fee for, acceptance of support, warranty, indemnity,
    or other liability obligations and/or rights consistent with this
    License. However, in accepting such obligations, You may act only
    on Your own behalf and on Your sole responsibility, not on behalf
    of any other Contributor, and only if You agree to indemnify,
    defend, and hold each Contributor harmless for any liability
    incurred by, or claims asserted against, such Contributor by reason
    of your accepting any such warranty or additional liability.

 END OF TERMS AND CONDITIONS

 APPENDIX: How to apply the Apache License to your work.

    To apply the Apache License to your work, attach the following
    boilerplate notice, with the fields enclosed by brackets "[]"
    replaced with your own identifying information. (Don't include
    the brackets!)  The text should be enclosed in the appropriate
    comment syntax for the file format. We also recommend that a
    file or class name and description of purpose be included on the
    same "printed page" as the copyright notice for easier
    identification within third-party archives.

 Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
Vx# <img src="docs_app/src/assets/images/logos/Rx_Logo_S.png" alt="RxJS Logo" width="86" height="86"> RxJS: Reactive Extensions For JavaScript

![CI](https://github.com/reactivex/rxjs/workflows/CI/badge.svg)
[![npm version](https://badge.fury.io/js/rxjs.svg)](http://badge.fury.io/js/rxjs)
[![Join the chat at https://gitter.im/Reactive-Extensions/RxJS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Reactive-Extensions/RxJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

# The Roadmap from RxJS 7 to 8

Curious what's next for RxJS? Follow along with [Issue 6367](https://github.com/ReactiveX/rxjs/issues/6367).

# RxJS 7

### FOR 6.X PLEASE GO TO [THE 6.x BRANCH](https://github.com/ReactiveX/rxjs/tree/6.x)

Reactive Extensions Library for JavaScript. This is a rewrite of [Reactive-Extensions/RxJS](https://github.com/Reactive-Extensions/RxJS) and is the latest production-ready version of RxJS. This rewrite is meant to have better performance, better modularity, better debuggable call stacks, while staying mostly backwards compatible, with some breaking changes that reduce the API surface.

[Apache 2.0 License](LICENSE.txt)

- [Code of Conduct](CODE_OF_CONDUCT.md)
- [Contribution Guidelines](CONTRIBUTING.md)
- [Maintainer Guidelines](docs_app/content/maintainer-guidelines.md)
- [API Documentation](https://rxjs.dev/)

## Versions In This Repository

- [master](https://github.com/ReactiveX/rxjs/commits/master) - This is all of the current work, which is against v7 of RxJS right now
- [6.x](https://github.com/ReactiveX/rxjs/tree/6.x) - This is the branch for version 6.X

Most PRs should be made to **master**.

## Important

By contributing or commenting on issues in this repository, whether you've read them or not, you're agreeing to the [Contributor Code of Conduct](CODE_OF_CONDUCT.md). Much like traffic laws, ignorance doesn't grant you immunity.

## Installation and Usage

### ES6 via npm

```shell
npm install rxjs
```

It's recommended to pull in the Observable creation methods you need directly from `'rxjs'` as shown below with `range`.
If you're using RxJS version 7.2 or above, you can pull in any operator you need from the same spot, `'rxjs'`.

```ts
import { range, filter, map } from 'rxjs';

range(1, 200)
  .pipe(
    filter(x => x % 2 === 1),
    map(x => x + x)
  )
  .subscribe(x => console.log(x));
```

If you're using RxJS version below 7.2, you can pull in any operator you need from one spot, under `'rxjs/operators'`.

```ts
import { range } from 'rxjs';
import { filter, map } from 'rxjs/operators';

range(1, 200)
  .pipe(
    filter(x => x % 2 === 1),
    map(x => x + x)
  )
  .subscribe(x => console.log(x));
```

### CDN

For CDN, you can use [unpkg](https://unpkg.com/):

[https://unpkg.com/rxjs@^7/dist/bundles/rxjs.umd.min.js](https://unpkg.com/rxjs@%5E7/dist/bundles/rxjs.umd.min.js)

The global namespace for rxjs is `rxjs`:

```js
const { range } = rxjs;
const { filter, map } = rxjs.operators;

range(1, 200)
  .pipe(
    filter(x => x % 2 === 1),
    map(x => x + x)
  )
  .subscribe(x => console.log(x));
```

## Goals

- Smaller overall bundles sizes
- Provide better performance than preceding versions of RxJS
- To model/follow the [Observable Spec Proposal](https://github.com/zenparsing/es-observable) to the observable
- Provide more modular file structure in a variety of formats
- Provide more debuggable call stacks than preceding versions of RxJS

## Building/Testing

- `npm run compile` build everything
- `npm test` run tests
- `npm run dtslint` run dtslint tests

## Adding documentation

We appreciate all contributions to the documentation of any type. All of the information needed to get the docs app up and running locally as well as how to contribute can be found in the [documentation directory](./docs_app).
ХƱx {
  "name": "rxjs/operators",
  "types": "../dist/types/operators/index.d.ts",
  "main": "../dist/cjs/operators/index.js",
  "module": "../dist/esm5/operators/index.js",
  "es2015": "../dist/esm/operators/index.js",
  "sideEffects": false
}
-.L~x> {
  "name": "rxjs/ajaxajaxA%ajaxo&ajax%ajax%rx "{
  "name": "rxjs/fetch",
  "types": "../dist/types/fetch/index.d.ts",
  "main": "../dist/cjs/fetch/index.js",
  "module": "../dist/esm5/fetch/index.js",
  "es2015": "../dist/esm/fetch/index.js",
  "sideEffects": false
}
CrxK{
  "name": "rxjs",
  "version": "7.8.2",
  "description": "Reactive Extensions for modern JavaScript",
  "main": "./dist/cjs/index.js",
  "module": "./dist/esm5/index.js",
  "es2015": "./dist/esm/index.js",
  "types": "index.d.ts",
  "typesVersions": {
    ">=4.2": {
      "*": [
        "dist/types/*"
      ]
    }
  },
  "sideEffects": false,
  "exports": {
    ".": {
      "types": "./dist/types/index.d.ts",
      "node": "./dist/cjs/index.js",
      "require": "./dist/cjs/index.js",
      "es2015": "./dist/esm/index.js",
      "default": "./dist/esm5/index.js"
    },
    "./ajax": {
      "types": "./dist/types/ajax/index.d.ts",
      "node": "./dist/cjs/ajax/index.js",
      "require": "./dist/cjs/ajax/index.js",
      "es2015": "./dist/esm/ajax/index.js",
      "default": "./dist/esm5/ajax/index.js"
    },
    "./fetch": {
      "types": "./dist/types/fetch/index.d.ts",
      "node": "./dist/cjs/fetch/index.js",
      "require": "./dist/cjs/fetch/index.js",
      "es2015": "./dist/esm/fetch/index.js",
      "default": "./dist/esm5/fetch/index.js"
    },
    "./operators": {
      "types": "./dist/types/operators/index.d.ts",
      "node": "./dist/cjs/operators/index.js",
      "require": "./dist/cjs/operators/index.js",
      "es2015": "./dist/esm/operators/index.js",
      "default": "./dist/esm5/operators/index.js"
    },
    "./testing": {
      "types": "./dist/types/testing/index.d.ts",
      "node": "./dist/cjs/testing/index.js",
      "require": "./dist/cjs/testing/index.js",
      "es2015": "./dist/esm/testing/index.js",
      "default": "./dist/esm5/testing/index.js"
    },
    "./webSocket": {
      "types": "./dist/types/webSocket/index.d.ts",
      "node": "./dist/cjs/webSocket/index.js",
      "require": "./dist/cjs/webSocket/index.js",
      "es2015": "./dist/esm/webSocket/index.js",
      "default": "./dist/esm5/webSocket/index.js"
    },
    "./internal/*": {
      "types": "./dist/types/internal/*.d.ts",
      "node": "./dist/cjs/internal/*.js",
      "require": "./dist/cjs/internal/*.js",
      "es2015": "./dist/esm/internal/*.js",
      "default": "./dist/esm5/internal/*.js"
    },
    "./package.json": "./package.json"
  },
  "config": {
    "commitizen": {
      "path": "cz-conventional-changelog"
    }
  },
  "lint-staged": {
    "*.js": "eslint --cache --fix",
    "(src|spec)/**/*.ts": [
      "tslint --fix",
      "prettier --write"
    ],
    "*.{js,css,md}": "prettier --write"
  },
  "scripts": {
    "changelog": "npx conventional-changelog-cli -p angular -i CHANGELOG.md -s",
    "build:spec:browser": "echo \"Browser test is not working currently\" && exit -1 && webpack --config spec/support/webpack.mocha.config.js",
    "lint_spec": "tslint -c spec/tslint.json -p spec/tsconfig.json \"spec/**/*.ts\"",
    "lint_src": "tslint -c tslint.json -p src/tsconfig.base.json \"src/**/*.ts\"",
    "lint": "npm-run-all --parallel lint_*",
    "dtslint": "tsc -b ./src/tsconfig.types.json && tslint -c spec-dtslint/tslint.json -p spec-dtslint/tsconfig.json \"spec-dtslint/**/*.ts\"",
    "prepublishOnly": "npm run build:package && npm run lint && npm run test && npm run test:circular && npm run dtslint && npm run test:side-effects",
    "publish_docs": "./publish_docs.sh",
    "test": "cross-env TS_NODE_PROJECT=tsconfig.mocha.json mocha --config spec/support/.mocharc.js \"spec/**/*-spec.ts\"",
    "test:esm": "node spec/module-test-spec.mjs",
    "test:browser": "echo \"Browser test is not working currently\" && exit -1 && npm-run-all build:spec:browser && opn spec/support/mocha-browser-runner.html",
    "test:circular": "dependency-cruiser --validate .dependency-cruiser.json -x \"^node_modules\" dist/esm5",
    "test:systemjs": "node integration/systemjs/systemjs-compatibility-spec.js",
    "test:side-effects": "check-side-effects --test integration/side-effects/side-effects.json",
    "test:side-effects:update": "npm run test:side-effects -- --update",
    "test:import": "ts-node ./integration/import/runner.ts",
    "compile": "tsc -b ./src/tsconfig.cjs.json ./src/tsconfig.cjs.spec.json ./src/tsconfig.esm.json ./src/tsconfig.esm5.json ./src/tsconfig.esm5.rollup.json ./src/tsconfig.types.json ./src/tsconfig.types.spec.json ./spec/tsconfig.json",
    "build:clean": "shx rm -rf ./dist",
    "build:global": "node ./tools/make-umd-bundle.js && node ./tools/make-closure-core.js",
    "build:package": "npm-run-all build:clean compile build:global && node ./tools/prepare-package.js && node ./tools/generate-alias.js",
    "watch": "nodemon -w \"src/\" -w \"spec/\" -e ts -x npm test",
    "watch:dtslint": "nodemon -w \"src/\" -w \"spec-dtslint/\" -e ts -x npm run dtslint"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/reactivex/rxjs.git"
  },
  "keywords": [
    "Rx",
    "RxJS",
    "ReactiveX",
    "ReactiveExtensions",
    "Streams",
    "Observables",
    "Observable",
    "Stream",
    "ES6",
    "ES2015"
  ],
  "author": "Ben Lesh <ben@benlesh.com>",
  "contributors": [
    {
      "name": "Ben Lesh",
      "email": "ben@benlesh.com"
    },
    {
      "name": "Paul Taylor",
      "email": "paul.e.taylor@me.com"
    },
    {
      "name": "Jeff Cross",
      "email": "crossj@google.com"
    },
    {
      "name": "Matthew Podwysocki",
      "email": "matthewp@microsoft.com"
    },
    {
      "name": "OJ Kwon",
      "email": "kwon.ohjoong@gmail.com"
    },
    {
      "name": "Andre Staltz",
      "email": "andre@staltz.com"
    }
  ],
  "license": "Apache-2.0",
  "bugs": {
    "url": "https://github.com/ReactiveX/RxJS/issues"
  },
  "homepage": "https://rxjs.dev",
  "dependencies": {
    "tslib": "^2.1.0"
  },
  "devDependencies": {
    "@angular-devkit/build-optimizer": "0.4.6",
    "@angular-devkit/schematics": "^11.0.7",
    "@swc/core": "^1.2.128",
    "@swc/helpers": "^0.3.2",
    "@types/chai": "^4.2.11",
    "@types/lodash": "4.14.102",
    "@types/mocha": "^7.0.2",
    "@types/node": "^14.14.6",
    "@types/shelljs": "^0.8.8",
    "@types/sinon": "4.1.3",
    "@types/sinon-chai": "2.7.29",
    "@types/source-map": "^0.5.2",
    "@typescript-eslint/eslint-plugin": "^4.29.1",
    "@typescript-eslint/parser": "^4.29.1",
    "babel-polyfill": "6.26.0",
    "chai": "^4.2.0",
    "check-side-effects": "0.0.23",
    "color": "3.0.0",
    "colors": "1.1.2",
    "cross-env": "5.1.3",
    "cz-conventional-changelog": "1.2.0",
    "dependency-cruiser": "^9.12.0",
    "escape-string-regexp": "1.0.5",
    "eslint": "^7.8.1",
    "eslint-plugin-jasmine": "^2.10.1",
    "form-data": "^3.0.0",
    "fs-extra": "^8.1.0",
    "glob": "7.1.2",
    "google-closure-compiler-js": "20170218.0.0",
    "husky": "^4.2.5",
    "klaw-sync": "3.0.2",
    "lint-staged": "^10.2.11",
    "lodash": "^4.17.15",
    "minimist": "^1.2.5",
    "mocha": "^8.1.3",
    "nodemon": "^1.9.2",
    "npm-run-all": "4.1.2",
    "opn-cli": "3.1.0",
    "platform": "1.3.5",
    "prettier": "^2.5.1",
    "promise": "8.0.1",
    "rollup": "0.66.6",
    "rollup-plugin-alias": "1.4.0",
    "rollup-plugin-inject": "2.0.0",
    "rollup-plugin-node-resolve": "2.0.0",
    "shelljs": "^0.8.4",
    "shx": "^0.3.2",
    "sinon": "4.3.0",
    "sinon-chai": "2.14.0",
    "source-map-support": "0.5.3",
    "systemjs": "^0.21.0",
    "ts-node": "^9.1.1",
    "tslint": "^5.20.1",
    "tslint-config-prettier": "^1.18.0",
    "tslint-etc": "1.13.10",
    "tslint-no-toplevel-property-access": "0.0.2",
    "tslint-no-unused-expression-chai": "0.0.3",
    "typescript": "~4.2.0",
    "validate-commit-msg": "2.14.0",
    "web-streams-polyfill": "^3.0.2",
    "webpack": "^4.31.0"
  },
  "files": [
    "dist/bundles",
    "dist/cjs/**/!(*.tsbuildinfo)",
    "dist/esm/**/!(*.tsbuildinfo)",
    "dist/esm5/**/!(*.tsbuildinfo)",
    "dist/types/**/!(*.tsbuildinfo)",
    "ajax",
    "fetch",
    "operators",
    "testing",
    "webSocket",
    "src",
    "CHANGELOG.md",
    "CODE_OF_CONDUCT.md",
    "LICENSE.txt",
    "package.json",
    "README.md",
    "tsconfig.json"
  ],
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "commit-msg": "validate-commit-msg"
    }
  }
}
9:Ϲx v(function (root, factory) {
  root.Rx = factory();
})(window || global || this, function () {
  return require('../dist/package/Rx');
});u-pxexport { ajax } from '../internal/ajax/ajax';
export { AjaxError, AjaxTimeoutError } from '../internal/ajax/errors';
export { AjaxResponse } from '../internal/ajax/AjaxResponse';
export { AjaxRequest, AjaxConfig, AjaxDirection } from '../internal/ajax/types';
[x> export { fromFetch } from '../internal/observable/dom/fetch';
2x+//////////////////////////////////////////////////////////
// Here we need to reference our other deep imports
// so VS code will figure out where they are
// see conversation here:
// https://github.com/microsoft/TypeScript/issues/43034
//////////////////////////////////////////////////////////

// tslint:disable: no-reference
// It's tempting to add references to all of the deep-import locations, but
// adding references to those that require DOM types breaks Node projects.
/// <reference path="./operators/index.ts" />
/// <reference path="./testing/index.ts" />
// tslint:enable: no-reference

/* Observable */
export { Observable } from './internal/Observable';
export { ConnectableObservable } from './internal/observable/ConnectableObservable';
export { GroupedObservable } from './internal/operators/groupBy';
export { Operator } from './internal/Operator';
export { observable } from './internal/symbol/observable';
export { animationFrames } from './internal/observable/dom/animationFrames';

/* Subjects */
export { Subject } from './internal/Subject';
export { BehaviorSubject } from './internal/BehaviorSubject';
export { ReplaySubject } from './internal/ReplaySubject';
export { AsyncSubject } from './internal/AsyncSubject';

/* Schedulers */
export { asap, asapScheduler } from './internal/scheduler/asap';
export { async, asyncScheduler } from './internal/scheduler/async';
export { queue, queueScheduler } from './internal/scheduler/queue';
export { animationFrame, animationFrameScheduler } from './internal/scheduler/animationFrame';
export { VirtualTimeScheduler, VirtualAction } from './internal/scheduler/VirtualTimeScheduler';
export { Scheduler } from './internal/Scheduler';

/* Subscription */
export { Subscription } from './internal/Subscription';
export { Subscriber } from './internal/Subscriber';

/* Notification */
export { Notification, NotificationKind } from './internal/Notification';

/* Utils */
export { pipe } from './internal/util/pipe';
export { noop } from './internal/util/noop';
export { identity } from './internal/util/identity';
export { isObservable } from './internal/util/isObservable';

/* Promise Conversion */
export { lastValueFrom } from './internal/lastValueFrom';
export { firstValueFrom } from './internal/firstValueFrom';

/* Error types */
export { ArgumentOutOfRangeError } from './internal/util/ArgumentOutOfRangeError';
export { EmptyError } from './internal/util/EmptyError';
export { NotFoundError } from './internal/util/NotFoundError';
export { ObjectUnsubscribedError } from './internal/util/ObjectUnsubscribedError';
export { SequenceError } from './internal/util/SequenceError';
export { TimeoutError } from './internal/operators/timeout';
export { UnsubscriptionError } from './internal/util/UnsubscriptionError';

/* Static observable creation exports */
export { bindCallback } from './internal/observable/bindCallback';
export { bindNodeCallback } from './internal/observable/bindNodeCallback';
export { combineLatest } from './internal/observable/combineLatest';
export { concat } from './internal/observable/concat';
export { connectable } from './internal/observable/connectable';
export { defer } from './internal/observable/defer';
export { empty } from './internal/observable/empty';
export { forkJoin } from './internal/observable/forkJoin';
export { from } from './internal/observable/from';
export { fromEvent } from './internal/observable/fromEvent';
export { fromEventPattern } from './internal/observable/fromEventPattern';
export { generate } from './internal/observable/generate';
export { iif } from './internal/observable/iif';
export { interval } from './internal/observable/interval';
export { merge } from './internal/observable/merge';
export { never } from './internal/observable/never';
export { of } from './internal/observable/of';
export { onErrorResumeNext } from './internal/observable/onErrorResumeNext';
export { pairs } from './internal/observable/pairs';
export { partition } from './internal/observable/partition';
export { race } from './internal/observable/race';
export { range } from './internal/observable/range';
export { throwError } from './internal/observable/throwError';
export { timer } from './internal/observable/timer';
export { using } from './internal/observable/using';
export { zip } from './internal/observable/zip';
export { scheduled } from './internal/scheduled/scheduled';

/* Constants */
export { EMPTY } from './internal/observable/empty';
export { NEVER } from './internal/observable/never';

/* Types */
export * from './internal/types';

/* Config */
export { config, GlobalConfig } from './internal/config';

/* Operators */
export { audit } from './internal/operators/audit';
export { auditTime } from './internal/operators/auditTime';
export { buffer } from './internal/operators/buffer';
export { bufferCount } from './internal/operators/bufferCount';
export { bufferTime } from './internal/operators/bufferTime';
export { bufferToggle } from './internal/operators/bufferToggle';
export { bufferWhen } from './internal/operators/bufferWhen';
export { catchError } from './internal/operators/catchError';
export { combineAll } from './internal/operators/combineAll';
export { combineLatestAll } from './internal/operators/combineLatestAll';
export { combineLatestWith } from './internal/operators/combineLatestWith';
export { concatAll } from './internal/operators/concatAll';
export { concatMap } from './internal/operators/concatMap';
export { concatMapTo } from './internal/operators/concatMapTo';
export { concatWith } from './internal/operators/concatWith';
export { connect, ConnectConfig } from './internal/operators/connect';
export { count } from './internal/operators/count';
export { debounce } from './internal/operators/debounce';
export { debounceTime } from './internal/operators/debounceTime';
export { defaultIfEmpty } from './internal/operators/defaultIfEmpty';
export { delay } from './internal/operators/delay';
export { delayWhen } from './internal/operators/delayWhen';
export { dematerialize } from './internal/operators/dematerialize';
export { distinct } from './internal/operators/distinct';
export { distinctUntilChanged } from './internal/operators/distinctUntilChanged';
export { distinctUntilKeyChanged } from './internal/operators/distinctUntilKeyChanged';
export { elementAt } from './internal/operators/elementAt';
export { endWith } from './internal/operators/endWith';
export { every } from './internal/operators/every';
export { exhaust } from './internal/operators/exhaust';
export { exhaustAll } from './internal/operators/exhaustAll';
export { exhaustMap } from './internal/operators/exhaustMap';
export { expand } from './internal/operators/expand';
export { filter } from './internal/operators/filter';
export { finalize } from './internal/operators/finalize';
export { find } from './internal/operators/find';
export { findIndex } from './internal/operators/findIndex';
export { first } from './internal/operators/first';
export { groupBy, BasicGroupByOptions, GroupByOptionsWithElement } from './internal/operators/groupBy';
export { ignoreElements } from './internal/operators/ignoreElements';
export { isEmpty } from './internal/operators/isEmpty';
export { last } from './internal/operators/last';
export { map } from './internal/operators/map';
export { mapTo } from './internal/operators/mapTo';
export { materialize } from './internal/operators/materialize';
export { max } from './internal/operators/max';
export { mergeAll } from './internal/operators/mergeAll';
export { flatMap } from './internal/operators/flatMap';
export { mergeMap } from './internal/operators/mergeMap';
export { mergeMapTo } from './internal/operators/mergeMapTo';
export { mergeScan } from './internal/operators/mergeScan';
export { mergeWith } from './internal/operators/mergeWith';
export { min } from './internal/operators/min';
export { multicast } from './internal/operators/multicast';
export { observeOn } from './internal/operators/observeOn';
export { onErrorResumeNextWith } from './internal/operators/onErrorResumeNextWith';
export { pairwise } from './internal/operators/pairwise';
export { pluck } from './internal/operators/pluck';
export { publish } from './internal/operators/publish';
export { publishBehavior } from './internal/operators/publishBehavior';
export { publishLast } from './internal/operators/publishLast';
export { publishReplay } from './internal/operators/publishReplay';
export { raceWith } from './internal/operators/raceWith';
export { reduce } from './internal/operators/reduce';
export { repeat, RepeatConfig } from './internal/operators/repeat';
export { repeatWhen } from './internal/operators/repeatWhen';
export { retry, RetryConfig } from './internal/operators/retry';
export { retryWhen } from './internal/operators/retryWhen';
export { refCount } from './internal/operators/refCount';
export { sample } from './internal/operators/sample';
export { sampleTime } from './internal/operators/sampleTime';
export { scan } from './internal/operators/scan';
export { sequenceEqual } from './internal/operators/sequenceEqual';
export { share, ShareConfig } from './internal/operators/share';
export { shareReplay, ShareReplayConfig } from './internal/operators/shareReplay';
export { single } from './internal/operators/single';
export { skip } from './internal/operators/skip';
export { skipLast } from './internal/operators/skipLast';
export { skipUntil } from './internal/operators/skipUntil';
export { skipWhile } from './internal/operators/skipWhile';
export { startWith } from './internal/operators/startWith';
export { subscribeOn } from './internal/operators/subscribeOn';
export { switchAll } from './internal/operators/switchAll';
export { switchMap } from './internal/operators/switchMap';
export { switchMapTo } from './internal/operators/switchMapTo';
export { switchScan } from './internal/operators/switchScan';
export { take } from './internal/operators/take';
export { takeLast } from './internal/operators/takeLast';
export { takeUntil } from './internal/operators/takeUntil';
export { takeWhile } from './internal/operators/takeWhile';
export { tap, TapObserver } from './internal/operators/tap';
export { throttle, ThrottleConfig } from './internal/operators/throttle';
export { throttleTime } from './internal/operators/throttleTime';
export { throwIfEmpty } from './internal/operators/throwIfEmpty';
export { timeInterval } from './internal/operators/timeInterval';
export { timeout, TimeoutConfig, TimeoutInfo } from './internal/operators/timeout';
export { timeoutWith } from './internal/operators/timeoutWith';
export { timestamp } from './internal/operators/timestamp';
export { toArray } from './internal/operators/toArray';
export { window } from './internal/operators/window';
export { windowCount } from './internal/operators/windowCount';
export { windowTime } from './internal/operators/windowTime';
export { windowToggle } from './internal/operators/windowToggle';
export { windowWhen } from './internal/operators/windowWhen';
export { withLatestFrom } from './internal/operators/withLatestFrom';
export { zipAll } from './internal/operators/zipAll';
export { zipWith } from './internal/operators/zipWith';
\?&xe/*
 * Note that we cannot apply the `internal` tag here because the declaration
 * needs to survive the `stripInternal` option. Otherwise, `AnyCatcher` will
 * be `any` in the `.d.ts` files.
 */
declare const anyCatcherSymbol: unique symbol;

/**
 * This is just a type that we're using to identify `any` being passed to
 * function overloads. This is used because of situations like {@link forkJoin},
 * where it could return an `Observable<T[]>` or an `Observable<{ [key: K]: T }>`,
 * so `forkJoin(any)` would mean we need to return `Observable<unknown>`.
 */
export type AnyCatcher = typeof anyCatcherSymbol;
:<CAximport { Subject } from './Subject';
import { Subscriber } from './Subscriber';

/**
 * A variant of Subject that only emits a value when it completes. It will emit
 * its latest value to all its observers on completion.
 */
export class AsyncSubject<T> extends Subject<T> {
  private _value: T | null = null;
  private _hasValue = false;
  private _isComplete = false;

  /** @internal */
  protected _checkFinalizedStatuses(subscriber: Subscriber<T>) {
    const { hasError, _hasValue, _value, thrownError, isStopped, _isComplete } = this;
    if (hasError) {
      subscriber.error(thrownError);
    } else if (isStopped || _isComplete) {
      _hasValue && subscriber.next(_value!);
      subscriber.complete();
    }
  }

  next(value: T): void {
    if (!this.isStopped) {
      this._value = value;
      this._hasValue = true;
    }
  }

  complete(): void {
    const { _hasValue, _value, _isComplete } = this;
    if (!_isComplete) {
      this._isComplete = true;
      _hasValue && super.next(_value!);
      super.complete();
    }
  }
}
VSܰ7xpimport { Subject } from './Subject';
import { Subscriber } from './Subscriber';
import { Subscription } from './Subscription';

/**
 * A variant of Subject that requires an initial value and emits its current
 * value whenever it is subscribed to.
 */
export class BehaviorSubject<T> extends Subject<T> {
  constructor(private _value: T) {
    super();
  }

  get value(): T {
    return this.getValue();
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    const subscription = super._subscribe(subscriber);
    !subscription.closed && subscriber.next(this._value);
    return subscription;
  }

  getValue(): T {
    const { hasError, thrownError, _value } = this;
    if (hasError) {
      throw thrownError;
    }
    this._throwIfClosed();
    return _value;
  }

  next(value: T): void {
    super.next((this._value = value));
  }
}
ʐ!氫x*Oimport { PartialObserver, ObservableNotification, CompleteNotification, NextNotification, ErrorNotification } from './types';
import { Observable } from './Observable';
import { EMPTY } from './observable/empty';
import { of } from './observable/of';
import { throwError } from './observable/throwError';
import { isFunction } from './util/isFunction';

// TODO: When this enum is removed, replace it with a type alias. See #4556.
/**
 * @deprecated Use a string literal instead. `NotificationKind` will be replaced with a type alias in v8.
 * It will not be replaced with a const enum as those are not compatible with isolated modules.
 */
export enum NotificationKind {
  NEXT = 'N',
  ERROR = 'E',
  COMPLETE = 'C',
}

/**
 * Represents a push-based event or value that an {@link Observable} can emit.
 * This class is particularly useful for operators that manage notifications,
 * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and
 * others. Besides wrapping the actual delivered value, it also annotates it
 * with metadata of, for instance, what type of push message it is (`next`,
 * `error`, or `complete`).
 *
 * @see {@link materialize}
 * @see {@link dematerialize}
 * @see {@link observeOn}
 * @deprecated It is NOT recommended to create instances of `Notification` directly.
 * Rather, try to create POJOs matching the signature outlined in {@link ObservableNotification}.
 * For example: `{ kind: 'N', value: 1 }`, `{ kind: 'E', error: new Error('bad') }`, or `{ kind: 'C' }`.
 * Will be removed in v8.
 */
export class Notification<T> {
  /**
   * A value signifying that the notification will "next" if observed. In truth,
   * This is really synonymous with just checking `kind === "N"`.
   * @deprecated Will be removed in v8. Instead, just check to see if the value of `kind` is `"N"`.
   */
  readonly hasValue: boolean;

  /**
   * Creates a "Next" notification object.
   * @param kind Always `'N'`
   * @param value The value to notify with if observed.
   * @deprecated Internal implementation detail. Use {@link Notification#createNext createNext} instead.
   */
  constructor(kind: 'N', value?: T);
  /**
   * Creates an "Error" notification object.
   * @param kind Always `'E'`
   * @param value Always `undefined`
   * @param error The error to notify with if observed.
   * @deprecated Internal implementation detail. Use {@link Notification#createError createError} instead.
   */
  constructor(kind: 'E', value: undefined, error: any);
  /**
   * Creates a "completion" notification object.
   * @param kind Always `'C'`
   * @deprecated Internal implementation detail. Use {@link Notification#createComplete createComplete} instead.
   */
  constructor(kind: 'C');
  constructor(public readonly kind: 'N' | 'E' | 'C', public readonly value?: T, public readonly error?: any) {
    this.hasValue = kind === 'N';
  }

  /**
   * Executes the appropriate handler on a passed `observer` given the `kind` of notification.
   * If the handler is missing it will do nothing. Even if the notification is an error, if
   * there is no error handler on the observer, an error will not be thrown, it will noop.
   * @param observer The observer to notify.
   */
  observe(observer: PartialObserver<T>): void {
    return observeNotification(this as ObservableNotification<T>, observer);
  }

  /**
   * Executes a notification on the appropriate handler from a list provided.
   * If a handler is missing for the kind of notification, nothing is called
   * and no error is thrown, it will be a noop.
   * @param next A next handler
   * @param error An error handler
   * @param complete A complete handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  do(next: (value: T) => void, error: (err: any) => void, complete: () => void): void;
  /**
   * Executes a notification on the appropriate handler from a list provided.
   * If a handler is missing for the kind of notification, nothing is called
   * and no error is thrown, it will be a noop.
   * @param next A next handler
   * @param error An error handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  do(next: (value: T) => void, error: (err: any) => void): void;
  /**
   * Executes the next handler if the Notification is of `kind` `"N"`. Otherwise
   * this will not error, and it will be a noop.
   * @param next The next handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  do(next: (value: T) => void): void;
  do(nextHandler: (value: T) => void, errorHandler?: (err: any) => void, completeHandler?: () => void): void {
    const { kind, value, error } = this;
    return kind === 'N' ? nextHandler?.(value!) : kind === 'E' ? errorHandler?.(error) : completeHandler?.();
  }

  /**
   * Executes a notification on the appropriate handler from a list provided.
   * If a handler is missing for the kind of notification, nothing is called
   * and no error is thrown, it will be a noop.
   * @param next A next handler
   * @param error An error handler
   * @param complete A complete handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  accept(next: (value: T) => void, error: (err: any) => void, complete: () => void): void;
  /**
   * Executes a notification on the appropriate handler from a list provided.
   * If a handler is missing for the kind of notification, nothing is called
   * and no error is thrown, it will be a noop.
   * @param next A next handler
   * @param error An error handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  accept(next: (value: T) => void, error: (err: any) => void): void;
  /**
   * Executes the next handler if the Notification is of `kind` `"N"`. Otherwise
   * this will not error, and it will be a noop.
   * @param next The next handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  accept(next: (value: T) => void): void;

  /**
   * Executes the appropriate handler on a passed `observer` given the `kind` of notification.
   * If the handler is missing it will do nothing. Even if the notification is an error, if
   * there is no error handler on the observer, an error will not be thrown, it will noop.
   * @param observer The observer to notify.
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  accept(observer: PartialObserver<T>): void;
  accept(nextOrObserver: PartialObserver<T> | ((value: T) => void), error?: (err: any) => void, complete?: () => void) {
    return isFunction((nextOrObserver as any)?.next)
      ? this.observe(nextOrObserver as PartialObserver<T>)
      : this.do(nextOrObserver as (value: T) => void, error as any, complete as any);
  }

  /**
   * Returns a simple Observable that just delivers the notification represented
   * by this Notification instance.
   *
   * @deprecated Will be removed in v8. To convert a `Notification` to an {@link Observable},
   * use {@link of} and {@link dematerialize}: `of(notification).pipe(dematerialize())`.
   */
  toObservable(): Observable<T> {
    const { kind, value, error } = this;
    // Select the observable to return by `kind`
    const result =
      kind === 'N'
        ? // Next kind. Return an observable of that value.
          of(value!)
        : //
        kind === 'E'
        ? // Error kind. Return an observable that emits the error.
          throwError(() => error)
        : //
        kind === 'C'
        ? // Completion kind. Kind is "C", return an observable that just completes.
          EMPTY
        : // Unknown kind, return falsy, so we error below.
          0;
    if (!result) {
      // TODO: consider removing this check. The only way to cause this would be to
      // use the Notification constructor directly in a way that is not type-safe.
      // and direct use of the Notification constructor is deprecated.
      throw new TypeError(`Unexpected notification kind ${kind}`);
    }
    return result;
  }

  private static completeNotification = new Notification('C') as Notification<never> & CompleteNotification;
  /**
   * A shortcut to create a Notification instance of the type `next` from a
   * given value.
   * @param value The `next` value.
   * @return The "next" Notification representing the argument.
   * @deprecated It is NOT recommended to create instances of `Notification` directly.
   * Rather, try to create POJOs matching the signature outlined in {@link ObservableNotification}.
   * For example: `{ kind: 'N', value: 1 }`, `{ kind: 'E', error: new Error('bad') }`, or `{ kind: 'C' }`.
   * Will be removed in v8.
   */
  static createNext<T>(value: T) {
    return new Notification('N', value) as Notification<T> & NextNotification<T>;
  }

  /**
   * A shortcut to create a Notification instance of the type `error` from a
   * given error.
   * @param err The `error` error.
   * @return The "error" Notification representing the argument.
   * @deprecated It is NOT recommended to create instances of `Notification` directly.
   * Rather, try to create POJOs matching the signature outlined in {@link ObservableNotification}.
   * For example: `{ kind: 'N', value: 1 }`, `{ kind: 'E', error: new Error('bad') }`, or `{ kind: 'C' }`.
   * Will be removed in v8.
   */
  static createError(err?: any) {
    return new Notification('E', undefined, err) as Notification<never> & ErrorNotification;
  }

  /**
   * A shortcut to create a Notification instance of the type `complete`.
   * @return The valueless "complete" Notification.
   * @deprecated It is NOT recommended to create instances of `Notification` directly.
   * Rather, try to create POJOs matching the signature outlined in {@link ObservableNotification}.
   * For example: `{ kind: 'N', value: 1 }`, `{ kind: 'E', error: new Error('bad') }`, or `{ kind: 'C' }`.
   * Will be removed in v8.
   */
  static createComplete(): Notification<never> & CompleteNotification {
    return Notification.completeNotification;
  }
}

/**
 * Executes the appropriate handler on a passed `observer` given the `kind` of notification.
 * If the handler is missing it will do nothing. Even if the notification is an error, if
 * there is no error handler on the observer, an error will not be thrown, it will noop.
 * @param notification The notification object to observe.
 * @param observer The observer to notify.
 */
export function observeNotification<T>(notification: ObservableNotification<T>, observer: PartialObserver<T>) {
  const { kind, value, error } = notification as any;
  if (typeof kind !== 'string') {
    throw new TypeError('Invalid notification, missing "kind"');
  }
  kind === 'N' ? observer.next?.(value!) : kind === 'E' ? observer.error?.(error) : observer.complete?.();
}
!Ixaimport { CompleteNotification, NextNotification, ErrorNotification } from './types';

/**
 * A completion object optimized for memory use and created to be the
 * same "shape" as other notifications in v8.
 * @internal
 */
export const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();

/**
 * Internal use only. Creates an optimized error notification that is the same "shape"
 * as other notifications.
 * @internal
 */
export function errorNotification(error: any): ErrorNotification {
  return createNotification('E', undefined, error) as any;
}

/**
 * Internal use only. Creates an optimized next notification that is the same "shape"
 * as other notifications.
 * @internal
 */
export function nextNotification<T>(value: T) {
  return createNotification('N', value, undefined) as NextNotification<T>;
}

/**
 * Ensures that all notifications created internally have the same "shape" in v8.
 *
 * TODO: This is only exported to support a crazy legacy test in `groupBy`.
 * @internal
 */
export function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {
  return {
    kind,
    value,
    error,
  };
}
vLL	xJMimport { Operator } from './Operator';
import { SafeSubscriber, Subscriber } from './Subscriber';
import { isSubscription, Subscription } from './Subscription';
import { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';
import { observable as Symbol_observable } from './symbol/observable';
import { pipeFromArray } from './util/pipe';
import { config } from './config';
import { isFunction } from './util/isFunction';
import { errorContext } from './util/errorContext';

/**
 * A representation of any set of values over any amount of time. This is the most basic building block
 * of RxJS.
 */
export class Observable<T> implements Subscribable<T> {
  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  source: Observable<any> | undefined;

  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  operator: Operator<any, T> | undefined;

  /**
   * @param subscribe The function that is called when the Observable is
   * initially subscribed to. This function is given a Subscriber, to which new values
   * can be `next`ed, or an `error` method can be called to raise an error, or
   * `complete` can be called to notify of a successful completion.
   */
  constructor(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic) {
    if (subscribe) {
      this._subscribe = subscribe;
    }
  }

  // HACK: Since TypeScript inherits static properties too, we have to
  // fight against TypeScript here so Subject can have a different static create signature
  /**
   * Creates a new Observable by calling the Observable constructor
   * @param subscribe the subscriber function to be passed to the Observable constructor
   * @return A new observable.
   * @deprecated Use `new Observable()` instead. Will be removed in v8.
   */
  static create: (...args: any[]) => any = <T>(subscribe?: (subscriber: Subscriber<T>) => TeardownLogic) => {
    return new Observable<T>(subscribe);
  };

  /**
   * Creates a new Observable, with this Observable instance as the source, and the passed
   * operator defined as the new observable's operator.
   * @param operator the operator defining the operation to take on the observable
   * @return A new observable with the Operator applied.
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   * If you have implemented an operator using `lift`, it is recommended that you create an
   * operator by simply returning `new Observable()` directly. See "Creating new operators from
   * scratch" section here: https://rxjs.dev/guide/operators
   */
  lift<R>(operator?: Operator<T, R>): Observable<R> {
    const observable = new Observable<R>();
    observable.source = this;
    observable.operator = operator;
    return observable;
  }

  subscribe(observerOrNext?: Partial<Observer<T>> | ((value: T) => void)): Subscription;
  /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */
  subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;
  /**
   * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.
   *
   * <span class="informal">Use it when you have all these Observables, but still nothing is happening.</span>
   *
   * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It
   * might be for example a function that you passed to Observable's constructor, but most of the time it is
   * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means
   * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often
   * the thought.
   *
   * Apart from starting the execution of an Observable, this method allows you to listen for values
   * that an Observable emits, as well as for when it completes or errors. You can achieve this in two
   * of the following ways.
   *
   * The first way is creating an object that implements {@link Observer} interface. It should have methods
   * defined by that interface, but note that it should be just a regular JavaScript object, which you can create
   * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do
   * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also
   * that your object does not have to implement all methods. If you find yourself creating a method that doesn't
   * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,
   * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,
   * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or
   * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide
   * an `error` method to avoid missing thrown errors.
   *
   * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.
   * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent
   * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,
   * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,
   * since `subscribe` recognizes these functions by where they were placed in function call. When it comes
   * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.
   *
   * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events
   * and you also handled emissions internally by using operators (e.g. using `tap`).
   *
   * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.
   * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean
   * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback
   * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.
   *
   * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.
   * It is an Observable itself that decides when these functions will be called. For example {@link of}
   * by default emits all its values synchronously. Always check documentation for how given Observable
   * will behave when subscribed and if its default behavior can be modified with a `scheduler`.
   *
   * #### Examples
   *
   * Subscribe with an {@link guide/observer Observer}
   *
   * ```ts
   * import { of } from 'rxjs';
   *
   * const sumObserver = {
   *   sum: 0,
   *   next(value) {
   *     console.log('Adding: ' + value);
   *     this.sum = this.sum + value;
   *   },
   *   error() {
   *     // We actually could just remove this method,
   *     // since we do not really care about errors right now.
   *   },
   *   complete() {
   *     console.log('Sum equals: ' + this.sum);
   *   }
   * };
   *
   * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.
   *   .subscribe(sumObserver);
   *
   * // Logs:
   * // 'Adding: 1'
   * // 'Adding: 2'
   * // 'Adding: 3'
   * // 'Sum equals: 6'
   * ```
   *
   * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})
   *
   * ```ts
   * import { of } from 'rxjs'
   *
   * let sum = 0;
   *
   * of(1, 2, 3).subscribe(
   *   value => {
   *     console.log('Adding: ' + value);
   *     sum = sum + value;
   *   },
   *   undefined,
   *   () => console.log('Sum equals: ' + sum)
   * );
   *
   * // Logs:
   * // 'Adding: 1'
   * // 'Adding: 2'
   * // 'Adding: 3'
   * // 'Sum equals: 6'
   * ```
   *
   * Cancel a subscription
   *
   * ```ts
   * import { interval } from 'rxjs';
   *
   * const subscription = interval(1000).subscribe({
   *   next(num) {
   *     console.log(num)
   *   },
   *   complete() {
   *     // Will not be called, even when cancelling subscription.
   *     console.log('completed!');
   *   }
   * });
   *
   * setTimeout(() => {
   *   subscription.unsubscribe();
   *   console.log('unsubscribed!');
   * }, 2500);
   *
   * // Logs:
   * // 0 after 1s
   * // 1 after 2s
   * // 'unsubscribed!' after 2.5s
   * ```
   *
   * @param observerOrNext Either an {@link Observer} with some or all callback methods,
   * or the `next` handler that is called for each value emitted from the subscribed Observable.
   * @param error A handler for a terminal event resulting from an error. If no error handler is provided,
   * the error will be thrown asynchronously as unhandled.
   * @param complete A handler for a terminal event resulting from successful completion.
   * @return A subscription reference to the registered handlers.
   */
  subscribe(
    observerOrNext?: Partial<Observer<T>> | ((value: T) => void) | null,
    error?: ((error: any) => void) | null,
    complete?: (() => void) | null
  ): Subscription {
    const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);

    errorContext(() => {
      const { operator, source } = this;
      subscriber.add(
        operator
          ? // We're dealing with a subscription in the
            // operator chain to one of our lifted operators.
            operator.call(subscriber, source)
          : source
          ? // If `source` has a value, but `operator` does not, something that
            // had intimate knowledge of our API, like our `Subject`, must have
            // set it. We're going to just call `_subscribe` directly.
            this._subscribe(subscriber)
          : // In all other cases, we're likely wrapping a user-provided initializer
            // function, so we need to catch errors and handle them appropriately.
            this._trySubscribe(subscriber)
      );
    });

    return subscriber;
  }

  /** @internal */
  protected _trySubscribe(sink: Subscriber<T>): TeardownLogic {
    try {
      return this._subscribe(sink);
    } catch (err) {
      // We don't need to return anything in this case,
      // because it's just going to try to `add()` to a subscription
      // above.
      sink.error(err);
    }
  }

  /**
   * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with
   * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.
   *
   * **WARNING**: Only use this with observables you *know* will complete. If the source
   * observable does not complete, you will end up with a promise that is hung up, and
   * potentially all of the state of an async function hanging out in memory. To avoid
   * this situation, look into adding something like {@link timeout}, {@link take},
   * {@link takeWhile}, or {@link takeUntil} amongst others.
   *
   * #### Example
   *
   * ```ts
   * import { interval, take } from 'rxjs';
   *
   * const source$ = interval(1000).pipe(take(4));
   *
   * async function getTotal() {
   *   let total = 0;
   *
   *   await source$.forEach(value => {
   *     total += value;
   *     console.log('observable -> ' + value);
   *   });
   *
   *   return total;
   * }
   *
   * getTotal().then(
   *   total => console.log('Total: ' + total)
   * );
   *
   * // Expected:
   * // 'observable -> 0'
   * // 'observable -> 1'
   * // 'observable -> 2'
   * // 'observable -> 3'
   * // 'Total: 6'
   * ```
   *
   * @param next A handler for each value emitted by the observable.
   * @return A promise that either resolves on observable completion or
   * rejects with the handled error.
   */
  forEach(next: (value: T) => void): Promise<void>;

  /**
   * @param next a handler for each value emitted by the observable
   * @param promiseCtor a constructor function used to instantiate the Promise
   * @return a promise that either resolves on observable completion or
   *  rejects with the handled error
   * @deprecated Passing a Promise constructor will no longer be available
   * in upcoming versions of RxJS. This is because it adds weight to the library, for very
   * little benefit. If you need this functionality, it is recommended that you either
   * polyfill Promise, or you create an adapter to convert the returned native promise
   * to whatever promise implementation you wanted. Will be removed in v8.
   */
  forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise<void>;

  forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise<void> {
    promiseCtor = getPromiseCtor(promiseCtor);

    return new promiseCtor<void>((resolve, reject) => {
      const subscriber = new SafeSubscriber<T>({
        next: (value) => {
          try {
            next(value);
          } catch (err) {
            reject(err);
            subscriber.unsubscribe();
          }
        },
        error: reject,
        complete: resolve,
      });
      this.subscribe(subscriber);
    }) as Promise<void>;
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<any>): TeardownLogic {
    return this.source?.subscribe(subscriber);
  }

  /**
   * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable
   * @return This instance of the observable.
   */
  [Symbol_observable]() {
    return this;
  }

  /* tslint:disable:max-line-length */
  pipe(): Observable<T>;
  pipe<A>(op1: OperatorFunction<T, A>): Observable<A>;
  pipe<A, B>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>): Observable<B>;
  pipe<A, B, C>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>): Observable<C>;
  pipe<A, B, C, D>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>
  ): Observable<D>;
  pipe<A, B, C, D, E>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>
  ): Observable<E>;
  pipe<A, B, C, D, E, F>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>
  ): Observable<F>;
  pipe<A, B, C, D, E, F, G>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>,
    op7: OperatorFunction<F, G>
  ): Observable<G>;
  pipe<A, B, C, D, E, F, G, H>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>,
    op7: OperatorFunction<F, G>,
    op8: OperatorFunction<G, H>
  ): Observable<H>;
  pipe<A, B, C, D, E, F, G, H, I>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>,
    op7: OperatorFunction<F, G>,
    op8: OperatorFunction<G, H>,
    op9: OperatorFunction<H, I>
  ): Observable<I>;
  pipe<A, B, C, D, E, F, G, H, I>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>,
    op7: OperatorFunction<F, G>,
    op8: OperatorFunction<G, H>,
    op9: OperatorFunction<H, I>,
    ...operations: OperatorFunction<any, any>[]
  ): Observable<unknown>;
  /* tslint:enable:max-line-length */

  /**
   * Used to stitch together functional operators into a chain.
   *
   * ## Example
   *
   * ```ts
   * import { interval, filter, map, scan } from 'rxjs';
   *
   * interval(1000)
   *   .pipe(
   *     filter(x => x % 2 === 0),
   *     map(x => x + x),
   *     scan((acc, x) => acc + x)
   *   )
   *   .subscribe(x => console.log(x));
   * ```
   *
   * @return The Observable result of all the operators having been called
   * in the order they were passed in.
   */
  pipe(...operations: OperatorFunction<any, any>[]): Observable<any> {
    return pipeFromArray(operations)(this);
  }

  /* tslint:disable:max-line-length */
  /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */
  toPromise(): Promise<T | undefined>;
  /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */
  toPromise(PromiseCtor: typeof Promise): Promise<T | undefined>;
  /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */
  toPromise(PromiseCtor: PromiseConstructorLike): Promise<T | undefined>;
  /* tslint:enable:max-line-length */

  /**
   * Subscribe to this Observable and get a Promise resolving on
   * `complete` with the last emission (if any).
   *
   * **WARNING**: Only use this with observables you *know* will complete. If the source
   * observable does not complete, you will end up with a promise that is hung up, and
   * potentially all of the state of an async function hanging out in memory. To avoid
   * this situation, look into adding something like {@link timeout}, {@link take},
   * {@link takeWhile}, or {@link takeUntil} amongst others.
   *
   * @param [promiseCtor] a constructor function used to instantiate
   * the Promise
   * @return A Promise that resolves with the last value emit, or
   * rejects on an error. If there were no emissions, Promise
   * resolves with undefined.
   * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise
   */
  toPromise(promiseCtor?: PromiseConstructorLike): Promise<T | undefined> {
    promiseCtor = getPromiseCtor(promiseCtor);

    return new promiseCtor((resolve, reject) => {
      let value: T | undefined;
      this.subscribe(
        (x: T) => (value = x),
        (err: any) => reject(err),
        () => resolve(value)
      );
    }) as Promise<T | undefined>;
  }
}

/**
 * Decides between a passed promise constructor from consuming code,
 * A default configured promise constructor, and the native promise
 * constructor and returns it. If nothing can be found, it will throw
 * an error.
 * @param promiseCtor The optional promise constructor to passed by consuming code
 */
function getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {
  return promiseCtor ?? config.Promise ?? Promise;
}

function isObserver<T>(value: any): value is Observer<T> {
  return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);
}

function isSubscriber<T>(value: any): value is Subscriber<T> {
  return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));
}
Zgx"import { Subscriber } from './Subscriber';
import { TeardownLogic } from './types';

/***
 * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
 */
export interface Operator<T, R> {
  call(subscriber: Subscriber<R>, source: any): TeardownLogic;
}
cx9import { Subject } from './Subject';
import { TimestampProvider } from './types';
import { Subscriber } from './Subscriber';
import { Subscription } from './Subscription';
import { dateTimestampProvider } from './scheduler/dateTimestampProvider';

/**
 * A variant of {@link Subject} that "replays" old values to new subscribers by emitting them when they first subscribe.
 *
 * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,
 * `ReplaySubject` "observes" values by having them passed to its `next` method. When it observes a value, it will store that
 * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.
 *
 * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in
 * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will
 * error if it has observed an error.
 *
 * There are two main configuration items to be concerned with:
 *
 * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.
 * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.
 *
 * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values
 * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.
 *
 * ### Differences with BehaviorSubject
 *
 * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:
 *
 * 1. `BehaviorSubject` comes "primed" with a single value upon construction.
 * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.
 *
 * @see {@link Subject}
 * @see {@link BehaviorSubject}
 * @see {@link shareReplay}
 */
export class ReplaySubject<T> extends Subject<T> {
  private _buffer: (T | number)[] = [];
  private _infiniteTimeWindow = true;

  /**
   * @param _bufferSize The size of the buffer to replay on subscription
   * @param _windowTime The amount of time the buffered items will stay buffered
   * @param _timestampProvider An object with a `now()` method that provides the current timestamp. This is used to
   * calculate the amount of time something has been buffered.
   */
  constructor(
    private _bufferSize = Infinity,
    private _windowTime = Infinity,
    private _timestampProvider: TimestampProvider = dateTimestampProvider
  ) {
    super();
    this._infiniteTimeWindow = _windowTime === Infinity;
    this._bufferSize = Math.max(1, _bufferSize);
    this._windowTime = Math.max(1, _windowTime);
  }

  next(value: T): void {
    const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;
    if (!isStopped) {
      _buffer.push(value);
      !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
    }
    this._trimBuffer();
    super.next(value);
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    this._throwIfClosed();
    this._trimBuffer();

    const subscription = this._innerSubscribe(subscriber);

    const { _infiniteTimeWindow, _buffer } = this;
    // We use a copy here, so reentrant code does not mutate our array while we're
    // emitting it to a new subscriber.
    const copy = _buffer.slice();
    for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
      subscriber.next(copy[i] as T);
    }

    this._checkFinalizedStatuses(subscriber);

    return subscription;
  }

  private _trimBuffer() {
    const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;
    // If we don't have an infinite buffer size, and we're over the length,
    // use splice to truncate the old buffer values off. Note that we have to
    // double the size for instances where we're not using an infinite time window
    // because we're storing the values and the timestamps in the same array.
    const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
    _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);

    // Now, if we're not in an infinite time window, remove all values where the time is
    // older than what is allowed.
    if (!_infiniteTimeWindow) {
      const now = _timestampProvider.now();
      let last = 0;
      // Search the array for the first timestamp that isn't expired and
      // truncate the buffer up to that point.
      for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {
        last = i;
      }
      last && _buffer.splice(0, last + 1);
    }
  }
}
KSXxo	import { Action } from './scheduler/Action';
import { Subscription } from './Subscription';
import { SchedulerLike, SchedulerAction } from './types';
import { dateTimestampProvider } from './scheduler/dateTimestampProvider';

/**
 * An execution context and a data structure to order tasks and schedule their
 * execution. Provides a notion of (potentially virtual) time, through the
 * `now()` getter method.
 *
 * Each unit of work in a Scheduler is called an `Action`.
 *
 * ```ts
 * class Scheduler {
 *   now(): number;
 *   schedule(work, delay?, state?): Subscription;
 * }
 * ```
 *
 * @deprecated Scheduler is an internal implementation detail of RxJS, and
 * should not be used directly. Rather, create your own class and implement
 * {@link SchedulerLike}. Will be made internal in v8.
 */
export class Scheduler implements SchedulerLike {
  public static now: () => number = dateTimestampProvider.now;

  constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {
    this.now = now;
  }

  /**
   * A getter method that returns a number representing the current time
   * (at the time this function was called) according to the scheduler's own
   * internal clock.
   * @return A number that represents the current time. May or may not
   * have a relation to wall-clock time. May or may not refer to a time unit
   * (e.g. milliseconds).
   */
  public now: () => number;

  /**
   * Schedules a function, `work`, for execution. May happen at some point in
   * the future, according to the `delay` parameter, if specified. May be passed
   * some context object, `state`, which will be passed to the `work` function.
   *
   * The given arguments will be processed an stored as an Action object in a
   * queue of actions.
   *
   * @param work A function representing a task, or some unit of work to be
   * executed by the Scheduler.
   * @param delay Time to wait before executing the work, where the time unit is
   * implicit and defined by the Scheduler itself.
   * @param state Some contextual data that the `work` function uses when called
   * by the Scheduler.
   * @return A subscription in order to be able to unsubscribe the scheduled work.
   */
  public schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay: number = 0, state?: T): Subscription {
    return new this.schedulerActionCtor<T>(this, work).schedule(state, delay);
  }
}
K-xwimport { Operator } from './Operator';
import { Observable } from './Observable';
import { Subscriber } from './Subscriber';
import { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';
import { Observer, SubscriptionLike, TeardownLogic } from './types';
import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
import { arrRemove } from './util/arrRemove';
import { errorContext } from './util/errorContext';

/**
 * A Subject is a special type of Observable that allows values to be
 * multicasted to many Observers. Subjects are like EventEmitters.
 *
 * Every Subject is an Observable and an Observer. You can subscribe to a
 * Subject, and you can call next to feed values as well as error and complete.
 */
export class Subject<T> extends Observable<T> implements SubscriptionLike {
  closed = false;

  private currentObservers: Observer<T>[] | null = null;

  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  observers: Observer<T>[] = [];
  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  isStopped = false;
  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  hasError = false;
  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  thrownError: any = null;

  /**
   * Creates a "subject" by basically gluing an observer to an observable.
   *
   * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.
   */
  static create: (...args: any[]) => any = <T>(destination: Observer<T>, source: Observable<T>): AnonymousSubject<T> => {
    return new AnonymousSubject<T>(destination, source);
  };

  constructor() {
    // NOTE: This must be here to obscure Observable's constructor.
    super();
  }

  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  lift<R>(operator: Operator<T, R>): Observable<R> {
    const subject = new AnonymousSubject(this, this);
    subject.operator = operator as any;
    return subject as any;
  }

  /** @internal */
  protected _throwIfClosed() {
    if (this.closed) {
      throw new ObjectUnsubscribedError();
    }
  }

  next(value: T) {
    errorContext(() => {
      this._throwIfClosed();
      if (!this.isStopped) {
        if (!this.currentObservers) {
          this.currentObservers = Array.from(this.observers);
        }
        for (const observer of this.currentObservers) {
          observer.next(value);
        }
      }
    });
  }

  error(err: any) {
    errorContext(() => {
      this._throwIfClosed();
      if (!this.isStopped) {
        this.hasError = this.isStopped = true;
        this.thrownError = err;
        const { observers } = this;
        while (observers.length) {
          observers.shift()!.error(err);
        }
      }
    });
  }

  complete() {
    errorContext(() => {
      this._throwIfClosed();
      if (!this.isStopped) {
        this.isStopped = true;
        const { observers } = this;
        while (observers.length) {
          observers.shift()!.complete();
        }
      }
    });
  }

  unsubscribe() {
    this.isStopped = this.closed = true;
    this.observers = this.currentObservers = null!;
  }

  get observed() {
    return this.observers?.length > 0;
  }

  /** @internal */
  protected _trySubscribe(subscriber: Subscriber<T>): TeardownLogic {
    this._throwIfClosed();
    return super._trySubscribe(subscriber);
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    this._throwIfClosed();
    this._checkFinalizedStatuses(subscriber);
    return this._innerSubscribe(subscriber);
  }

  /** @internal */
  protected _innerSubscribe(subscriber: Subscriber<any>) {
    const { hasError, isStopped, observers } = this;
    if (hasError || isStopped) {
      return EMPTY_SUBSCRIPTION;
    }
    this.currentObservers = null;
    observers.push(subscriber);
    return new Subscription(() => {
      this.currentObservers = null;
      arrRemove(observers, subscriber);
    });
  }

  /** @internal */
  protected _checkFinalizedStatuses(subscriber: Subscriber<any>) {
    const { hasError, thrownError, isStopped } = this;
    if (hasError) {
      subscriber.error(thrownError);
    } else if (isStopped) {
      subscriber.complete();
    }
  }

  /**
   * Creates a new Observable with this Subject as the source. You can do this
   * to create custom Observer-side logic of the Subject and conceal it from
   * code that uses the Observable.
   * @return Observable that this Subject casts to.
   */
  asObservable(): Observable<T> {
    const observable: any = new Observable<T>();
    observable.source = this;
    return observable;
  }
}

export class AnonymousSubject<T> extends Subject<T> {
  constructor(
    /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
    public destination?: Observer<T>,
    source?: Observable<T>
  ) {
    super();
    this.source = source;
  }

  next(value: T) {
    this.destination?.next?.(value);
  }

  error(err: any) {
    this.destination?.error?.(err);
  }

  complete() {
    this.destination?.complete?.();
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;
  }
}
M޳x",import { isFunction } from './util/isFunction';
import { Observer, ObservableNotification } from './types';
import { isSubscription, Subscription } from './Subscription';
import { config } from './config';
import { reportUnhandledError } from './util/reportUnhandledError';
import { noop } from './util/noop';
import { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';
import { timeoutProvider } from './scheduler/timeoutProvider';
import { captureError } from './util/errorContext';

/**
 * Implements the {@link Observer} interface and extends the
 * {@link Subscription} class. While the {@link Observer} is the public API for
 * consuming the values of an {@link Observable}, all Observers get converted to
 * a Subscriber, in order to provide Subscription-like capabilities such as
 * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for
 * implementing operators, but it is rarely used as a public API.
 */
export class Subscriber<T> extends Subscription implements Observer<T> {
  /**
   * A static factory for a Subscriber, given a (potentially partial) definition
   * of an Observer.
   * @param next The `next` callback of an Observer.
   * @param error The `error` callback of an
   * Observer.
   * @param complete The `complete` callback of an
   * Observer.
   * @return A Subscriber wrapping the (partially defined)
   * Observer represented by the given arguments.
   * @deprecated Do not use. Will be removed in v8. There is no replacement for this
   * method, and there is no reason to be creating instances of `Subscriber` directly.
   * If you have a specific use case, please file an issue.
   */
  static create<T>(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber<T> {
    return new SafeSubscriber(next, error, complete);
  }

  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  protected isStopped: boolean = false;
  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  protected destination: Subscriber<any> | Observer<any>; // this `any` is the escape hatch to erase extra type param (e.g. R)

  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.
   */
  constructor(destination?: Subscriber<any> | Observer<any>) {
    super();
    if (destination) {
      this.destination = destination;
      // Automatically chain subscriptions together here.
      // if destination is a Subscription, then it is a Subscriber.
      if (isSubscription(destination)) {
        destination.add(this);
      }
    } else {
      this.destination = EMPTY_OBSERVER;
    }
  }

  /**
   * The {@link Observer} callback to receive notifications of type `next` from
   * the Observable, with a value. The Observable may call this method 0 or more
   * times.
   * @param value The `next` value.
   */
  next(value: T): void {
    if (this.isStopped) {
      handleStoppedNotification(nextNotification(value), this);
    } else {
      this._next(value!);
    }
  }

  /**
   * The {@link Observer} callback to receive notifications of type `error` from
   * the Observable, with an attached `Error`. Notifies the Observer that
   * the Observable has experienced an error condition.
   * @param err The `error` exception.
   */
  error(err?: any): void {
    if (this.isStopped) {
      handleStoppedNotification(errorNotification(err), this);
    } else {
      this.isStopped = true;
      this._error(err);
    }
  }

  /**
   * The {@link Observer} callback to receive a valueless notification of type
   * `complete` from the Observable. Notifies the Observer that the Observable
   * has finished sending push-based notifications.
   */
  complete(): void {
    if (this.isStopped) {
      handleStoppedNotification(COMPLETE_NOTIFICATION, this);
    } else {
      this.isStopped = true;
      this._complete();
    }
  }

  unsubscribe(): void {
    if (!this.closed) {
      this.isStopped = true;
      super.unsubscribe();
      this.destination = null!;
    }
  }

  protected _next(value: T): void {
    this.destination.next(value);
  }

  protected _error(err: any): void {
    try {
      this.destination.error(err);
    } finally {
      this.unsubscribe();
    }
  }

  protected _complete(): void {
    try {
      this.destination.complete();
    } finally {
      this.unsubscribe();
    }
  }
}

/**
 * This bind is captured here because we want to be able to have
 * compatibility with monoid libraries that tend to use a method named
 * `bind`. In particular, a library called Monio requires this.
 */
const _bind = Function.prototype.bind;

function bind<Fn extends (...args: any[]) => any>(fn: Fn, thisArg: any): Fn {
  return _bind.call(fn, thisArg);
}

/**
 * Internal optimization only, DO NOT EXPOSE.
 * @internal
 */
class ConsumerObserver<T> implements Observer<T> {
  constructor(private partialObserver: Partial<Observer<T>>) {}

  next(value: T): void {
    const { partialObserver } = this;
    if (partialObserver.next) {
      try {
        partialObserver.next(value);
      } catch (error) {
        handleUnhandledError(error);
      }
    }
  }

  error(err: any): void {
    const { partialObserver } = this;
    if (partialObserver.error) {
      try {
        partialObserver.error(err);
      } catch (error) {
        handleUnhandledError(error);
      }
    } else {
      handleUnhandledError(err);
    }
  }

  complete(): void {
    const { partialObserver } = this;
    if (partialObserver.complete) {
      try {
        partialObserver.complete();
      } catch (error) {
        handleUnhandledError(error);
      }
    }
  }
}

export class SafeSubscriber<T> extends Subscriber<T> {
  constructor(
    observerOrNext?: Partial<Observer<T>> | ((value: T) => void) | null,
    error?: ((e?: any) => void) | null,
    complete?: (() => void) | null
  ) {
    super();

    let partialObserver: Partial<Observer<T>>;
    if (isFunction(observerOrNext) || !observerOrNext) {
      // The first argument is a function, not an observer. The next
      // two arguments *could* be observers, or they could be empty.
      partialObserver = {
        next: (observerOrNext ?? undefined) as ((value: T) => void) | undefined,
        error: error ?? undefined,
        complete: complete ?? undefined,
      };
    } else {
      // The first argument is a partial observer.
      let context: any;
      if (this && config.useDeprecatedNextContext) {
        // This is a deprecated path that made `this.unsubscribe()` available in
        // next handler functions passed to subscribe. This only exists behind a flag
        // now, as it is *very* slow.
        context = Object.create(observerOrNext);
        context.unsubscribe = () => this.unsubscribe();
        partialObserver = {
          next: observerOrNext.next && bind(observerOrNext.next, context),
          error: observerOrNext.error && bind(observerOrNext.error, context),
          complete: observerOrNext.complete && bind(observerOrNext.complete, context),
        };
      } else {
        // The "normal" path. Just use the partial observer directly.
        partialObserver = observerOrNext;
      }
    }

    // Wrap the partial observer to ensure it's a full observer, and
    // make sure proper error handling is accounted for.
    this.destination = new ConsumerObserver(partialObserver);
  }
}

function handleUnhandledError(error: any) {
  if (config.useDeprecatedSynchronousErrorHandling) {
    captureError(error);
  } else {
    // Ideal path, we report this as an unhandled error,
    // which is thrown on a new call stack.
    reportUnhandledError(error);
  }
}

/**
 * An error handler used when no error handler was supplied
 * to the SafeSubscriber -- meaning no error handler was supplied
 * do the `subscribe` call on our observable.
 * @param err The error to handle
 */
function defaultErrorHandler(err: any) {
  throw err;
}

/**
 * A handler for notifications that cannot be sent to a stopped subscriber.
 * @param notification The notification being sent.
 * @param subscriber The stopped subscriber.
 */
function handleStoppedNotification(notification: ObservableNotification<any>, subscriber: Subscriber<any>) {
  const { onStoppedNotification } = config;
  onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));
}

/**
 * The observer used as a stub for subscriptions where the user did not
 * pass any arguments to `subscribe`. Comes with the default error handling
 * behavior.
 */
export const EMPTY_OBSERVER: Readonly<Observer<any>> & { closed: true } = {
  closed: true,
  next: noop,
  error: defaultErrorHandler,
  complete: noop,
};

uxrimport { isFunction } from './util/isFunction';
import { UnsubscriptionError } from './util/UnsubscriptionError';
import { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';
import { arrRemove } from './util/arrRemove';

/**
 * Represents a disposable resource, such as the execution of an Observable. A
 * Subscription has one important method, `unsubscribe`, that takes no argument
 * and just disposes the resource held by the subscription.
 *
 * Additionally, subscriptions may be grouped together through the `add()`
 * method, which will attach a child Subscription to the current Subscription.
 * When a Subscription is unsubscribed, all its children (and its grandchildren)
 * will be unsubscribed as well.
 */
export class Subscription implements SubscriptionLike {
  public static EMPTY = (() => {
    const empty = new Subscription();
    empty.closed = true;
    return empty;
  })();

  /**
   * A flag to indicate whether this Subscription has already been unsubscribed.
   */
  public closed = false;

  private _parentage: Subscription[] | Subscription | null = null;

  /**
   * The list of registered finalizers to execute upon unsubscription. Adding and removing from this
   * list occurs in the {@link #add} and {@link #remove} methods.
   */
  private _finalizers: Exclude<TeardownLogic, void>[] | null = null;

  /**
   * @param initialTeardown A function executed first as part of the finalization
   * process that is kicked off when {@link #unsubscribe} is called.
   */
  constructor(private initialTeardown?: () => void) {}

  /**
   * Disposes the resources held by the subscription. May, for instance, cancel
   * an ongoing Observable execution or cancel any other type of work that
   * started when the Subscription was created.
   */
  unsubscribe(): void {
    let errors: any[] | undefined;

    if (!this.closed) {
      this.closed = true;

      // Remove this from it's parents.
      const { _parentage } = this;
      if (_parentage) {
        this._parentage = null;
        if (Array.isArray(_parentage)) {
          for (const parent of _parentage) {
            parent.remove(this);
          }
        } else {
          _parentage.remove(this);
        }
      }

      const { initialTeardown: initialFinalizer } = this;
      if (isFunction(initialFinalizer)) {
        try {
          initialFinalizer();
        } catch (e) {
          errors = e instanceof UnsubscriptionError ? e.errors : [e];
        }
      }

      const { _finalizers } = this;
      if (_finalizers) {
        this._finalizers = null;
        for (const finalizer of _finalizers) {
          try {
            execFinalizer(finalizer);
          } catch (err) {
            errors = errors ?? [];
            if (err instanceof UnsubscriptionError) {
              errors = [...errors, ...err.errors];
            } else {
              errors.push(err);
            }
          }
        }
      }

      if (errors) {
        throw new UnsubscriptionError(errors);
      }
    }
  }

  /**
   * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called
   * when this subscription is unsubscribed. If this subscription is already {@link #closed},
   * because it has already been unsubscribed, then whatever finalizer is passed to it
   * will automatically be executed (unless the finalizer itself is also a closed subscription).
   *
   * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed
   * subscription to a any subscription will result in no operation. (A noop).
   *
   * Adding a subscription to itself, or adding `null` or `undefined` will not perform any
   * operation at all. (A noop).
   *
   * `Subscription` instances that are added to this instance will automatically remove themselves
   * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove
   * will need to be removed manually with {@link #remove}
   *
   * @param teardown The finalization logic to add to this subscription.
   */
  add(teardown: TeardownLogic): void {
    // Only add the finalizer if it's not undefined
    // and don't add a subscription to itself.
    if (teardown && teardown !== this) {
      if (this.closed) {
        // If this subscription is already closed,
        // execute whatever finalizer is handed to it automatically.
        execFinalizer(teardown);
      } else {
        if (teardown instanceof Subscription) {
          // We don't add closed subscriptions, and we don't add the same subscription
          // twice. Subscription unsubscribe is idempotent.
          if (teardown.closed || teardown._hasParent(this)) {
            return;
          }
          teardown._addParent(this);
        }
        (this._finalizers = this._finalizers ?? []).push(teardown);
      }
    }
  }

  /**
   * Checks to see if a this subscription already has a particular parent.
   * This will signal that this subscription has already been added to the parent in question.
   * @param parent the parent to check for
   */
  private _hasParent(parent: Subscription) {
    const { _parentage } = this;
    return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));
  }

  /**
   * Adds a parent to this subscription so it can be removed from the parent if it
   * unsubscribes on it's own.
   *
   * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.
   * @param parent The parent subscription to add
   */
  private _addParent(parent: Subscription) {
    const { _parentage } = this;
    this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
  }

  /**
   * Called on a child when it is removed via {@link #remove}.
   * @param parent The parent to remove
   */
  private _removeParent(parent: Subscription) {
    const { _parentage } = this;
    if (_parentage === parent) {
      this._parentage = null;
    } else if (Array.isArray(_parentage)) {
      arrRemove(_parentage, parent);
    }
  }

  /**
   * Removes a finalizer from this subscription that was previously added with the {@link #add} method.
   *
   * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves
   * from every other `Subscription` they have been added to. This means that using the `remove` method
   * is not a common thing and should be used thoughtfully.
   *
   * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance
   * more than once, you will need to call `remove` the same number of times to remove all instances.
   *
   * All finalizer instances are removed to free up memory upon unsubscription.
   *
   * @param teardown The finalizer to remove from this subscription
   */
  remove(teardown: Exclude<TeardownLogic, void>): void {
    const { _finalizers } = this;
    _finalizers && arrRemove(_finalizers, teardown);

    if (teardown instanceof Subscription) {
      teardown._removeParent(this);
    }
  }
}

export const EMPTY_SUBSCRIPTION = Subscription.EMPTY;

export function isSubscription(value: any): value is Subscription {
  return (
    value instanceof Subscription ||
    (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))
  );
}

function execFinalizer(finalizer: Unsubscribable | (() => void)) {
  if (isFunction(finalizer)) {
    finalizer();
  } else {
    finalizer.unsubscribe();
  }
}
Sx5import { AjaxRequest, AjaxResponseType } from './types';
import { getXHRResponse } from './getXHRResponse';

/**
 * A normalized response from an AJAX request. To get the data from the response,
 * you will want to read the `response` property.
 *
 * - DO NOT create instances of this class directly.
 * - DO NOT subclass this class.
 *
 * It is advised not to hold this object in memory, as it has a reference to
 * the original XHR used to make the request, as well as properties containing
 * request and response data.
 *
 * @see {@link ajax}
 * @see {@link AjaxConfig}
 */
export class AjaxResponse<T> {
  /** The HTTP status code */
  readonly status: number;

  /**
   * The response data, if any. Note that this will automatically be converted to the proper type
   */
  readonly response: T;

  /**
   * The responseType set on the request. (For example: `""`, `"arraybuffer"`, `"blob"`, `"document"`, `"json"`, or `"text"`)
   * @deprecated There isn't much reason to examine this. It's the same responseType set (or defaulted) on the ajax config.
   * If you really need to examine this value, you can check it on the `request` or the `xhr`. Will be removed in v8.
   */
  readonly responseType: XMLHttpRequestResponseType;

  /**
   * The total number of bytes loaded so far. To be used with {@link total} while
   * calculating progress. (You will want to set {@link includeDownloadProgress} or
   * {@link includeDownloadProgress})
   */
  readonly loaded: number;

  /**
   * The total number of bytes to be loaded. To be used with {@link loaded} while
   * calculating progress. (You will want to set {@link includeDownloadProgress} or
   * {@link includeDownloadProgress})
   */
  readonly total: number;

  /**
   * A dictionary of the response headers.
   */
  readonly responseHeaders: Record<string, string>;

  /**
   * A normalized response from an AJAX request. To get the data from the response,
   * you will want to read the `response` property.
   *
   * - DO NOT create instances of this class directly.
   * - DO NOT subclass this class.
   *
   * @param originalEvent The original event object from the XHR `onload` event.
   * @param xhr The `XMLHttpRequest` object used to make the request. This is useful for examining status code, etc.
   * @param request The request settings used to make the HTTP request.
   * @param type The type of the event emitted by the {@link ajax} Observable
   */
  constructor(
    /**
     * The original event object from the raw XHR event.
     */
    public readonly originalEvent: ProgressEvent,
    /**
     * The XMLHttpRequest object used to make the request.
     * NOTE: It is advised not to hold this in memory, as it will retain references to all of it's event handlers
     * and many other things related to the request.
     */
    public readonly xhr: XMLHttpRequest,
    /**
     * The request parameters used to make the HTTP request.
     */
    public readonly request: AjaxRequest,
    /**
     * The event type. This can be used to discern between different events
     * if you're using progress events with {@link includeDownloadProgress} or
     * {@link includeUploadProgress} settings in {@link AjaxConfig}.
     *
     * The event type consists of two parts: the {@link AjaxDirection} and the
     * the event type. Merged with `_`, they form the `type` string. The
     * direction can be an `upload` or a `download` direction, while an event can
     * be `loadstart`, `progress` or `load`.
     *
     * `download_load` is the type of event when download has finished and the
     * response is available.
     */
    public readonly type: AjaxResponseType = 'download_load'
  ) {
    const { status, responseType } = xhr;
    this.status = status ?? 0;
    this.responseType = responseType ?? '';

    // Parse the response headers in advance for the user. There's really
    // not a great way to get all of them. So we need to parse the header string
    // we get back. It comes in a simple enough format:
    //
    // header-name: value here
    // content-type: application/json
    // other-header-here: some, other, values, or, whatever
    const allHeaders = xhr.getAllResponseHeaders();
    this.responseHeaders = allHeaders
      ? // Split the header text into lines
        allHeaders.split('\n').reduce((headers: Record<string, string>, line) => {
          // Split the lines on the first ": " as
          // "key: value". Note that the value could
          // technically have a ": " in it.
          const index = line.indexOf(': ');
          headers[line.slice(0, index)] = line.slice(index + 2);
          return headers;
        }, {})
      : {};

    this.response = getXHRResponse(xhr);
    const { loaded, total } = originalEvent;
    this.loaded = loaded;
    this.total = total;
  }
}
UM 
xU>import { map } from '../operators/map';
import { Observable } from '../Observable';
import { AjaxConfig, AjaxRequest, AjaxDirection, ProgressEventType } from './types';
import { AjaxResponse } from './AjaxResponse';
import { AjaxTimeoutError, AjaxError } from './errors';

export interface AjaxCreationMethod {
  /**
   * Creates an observable that will perform an AJAX request using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default.
   *
   * This is the most configurable option, and the basis for all other AJAX calls in the library.
   *
   * ## Example
   *
   * ```ts
   * import { ajax } from 'rxjs/ajax';
   * import { map, catchError, of } from 'rxjs';
   *
   * const obs$ = ajax({
   *   method: 'GET',
   *   url: 'https://api.github.com/users?per_page=5',
   *   responseType: 'json'
   * }).pipe(
   *   map(userResponse => console.log('users: ', userResponse)),
   *   catchError(error => {
   *     console.log('error: ', error);
   *     return of(error);
   *   })
   * );
   * ```
   */
  <T>(config: AjaxConfig): Observable<AjaxResponse<T>>;

  /**
   * Perform an HTTP GET using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope. Defaults to a `responseType` of `"json"`.
   *
   * ## Example
   *
   * ```ts
   * import { ajax } from 'rxjs/ajax';
   * import { map, catchError, of } from 'rxjs';
   *
   * const obs$ = ajax('https://api.github.com/users?per_page=5').pipe(
   *   map(userResponse => console.log('users: ', userResponse)),
   *   catchError(error => {
   *     console.log('error: ', error);
   *     return of(error);
   *   })
   * );
   * ```
   */
  <T>(url: string): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP GET using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * @param url The URL to get the resource from
   * @param headers Optional headers. Case-Insensitive.
   */
  get<T>(url: string, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP POST using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * Before sending the value passed to the `body` argument, it is automatically serialized
   * based on the specified `responseType`. By default, a JavaScript object will be serialized
   * to JSON. A `responseType` of `application/x-www-form-urlencoded` will flatten any provided
   * dictionary object to a url-encoded string.
   *
   * @param url The URL to get the resource from
   * @param body The content to send. The body is automatically serialized.
   * @param headers Optional headers. Case-Insensitive.
   */
  post<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP PUT using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * Before sending the value passed to the `body` argument, it is automatically serialized
   * based on the specified `responseType`. By default, a JavaScript object will be serialized
   * to JSON. A `responseType` of `application/x-www-form-urlencoded` will flatten any provided
   * dictionary object to a url-encoded string.
   *
   * @param url The URL to get the resource from
   * @param body The content to send. The body is automatically serialized.
   * @param headers Optional headers. Case-Insensitive.
   */
  put<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP PATCH using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * Before sending the value passed to the `body` argument, it is automatically serialized
   * based on the specified `responseType`. By default, a JavaScript object will be serialized
   * to JSON. A `responseType` of `application/x-www-form-urlencoded` will flatten any provided
   * dictionary object to a url-encoded string.
   *
   * @param url The URL to get the resource from
   * @param body The content to send. The body is automatically serialized.
   * @param headers Optional headers. Case-Insensitive.
   */
  patch<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP DELETE using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * @param url The URL to get the resource from
   * @param headers Optional headers. Case-Insensitive.
   */
  delete<T>(url: string, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP GET using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and returns the hydrated JavaScript object from the
   * response.
   *
   * @param url The URL to get the resource from
   * @param headers Optional headers. Case-Insensitive.
   */
  getJSON<T>(url: string, headers?: Record<string, string>): Observable<T>;
}

function ajaxGet<T>(url: string, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'GET', url, headers });
}

function ajaxPost<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'POST', url, body, headers });
}

function ajaxDelete<T>(url: string, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'DELETE', url, headers });
}

function ajaxPut<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'PUT', url, body, headers });
}

function ajaxPatch<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'PATCH', url, body, headers });
}

const mapResponse = map((x: AjaxResponse<any>) => x.response);

function ajaxGetJSON<T>(url: string, headers?: Record<string, string>): Observable<T> {
  return mapResponse(
    ajax<T>({
      method: 'GET',
      url,
      headers,
    })
  );
}

/**
 * There is an ajax operator on the Rx object.
 *
 * It creates an observable for an Ajax request with either a request object with
 * url, headers, etc or a string for a URL.
 *
 * ## Examples
 *
 * Using `ajax()` to fetch the response object that is being returned from API
 *
 * ```ts
 * import { ajax } from 'rxjs/ajax';
 * import { map, catchError, of } from 'rxjs';
 *
 * const obs$ = ajax('https://api.github.com/users?per_page=5').pipe(
 *   map(userResponse => console.log('users: ', userResponse)),
 *   catchError(error => {
 *     console.log('error: ', error);
 *     return of(error);
 *   })
 * );
 *
 * obs$.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err)
 * });
 * ```
 *
 * Using `ajax.getJSON()` to fetch data from API
 *
 * ```ts
 * import { ajax } from 'rxjs/ajax';
 * import { map, catchError, of } from 'rxjs';
 *
 * const obs$ = ajax.getJSON('https://api.github.com/users?per_page=5').pipe(
 *   map(userResponse => console.log('users: ', userResponse)),
 *   catchError(error => {
 *     console.log('error: ', error);
 *     return of(error);
 *   })
 * );
 *
 * obs$.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err)
 * });
 * ```
 *
 * Using `ajax()` with object as argument and method POST with a two seconds delay
 *
 * ```ts
 * import { ajax } from 'rxjs/ajax';
 * import { map, catchError, of } from 'rxjs';
 *
 * const users = ajax({
 *   url: 'https://httpbin.org/delay/2',
 *   method: 'POST',
 *   headers: {
 *     'Content-Type': 'application/json',
 *     'rxjs-custom-header': 'Rxjs'
 *   },
 *   body: {
 *     rxjs: 'Hello World!'
 *   }
 * }).pipe(
 *   map(response => console.log('response: ', response)),
 *   catchError(error => {
 *     console.log('error: ', error);
 *     return of(error);
 *   })
 * );
 *
 * users.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err)
 * });
 * ```
 *
 * Using `ajax()` to fetch. An error object that is being returned from the request
 *
 * ```ts
 * import { ajax } from 'rxjs/ajax';
 * import { map, catchError, of } from 'rxjs';
 *
 * const obs$ = ajax('https://api.github.com/404').pipe(
 *   map(userResponse => console.log('users: ', userResponse)),
 *   catchError(error => {
 *     console.log('error: ', error);
 *     return of(error);
 *   })
 * );
 *
 * obs$.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err)
 * });
 * ```
 */
export const ajax: AjaxCreationMethod = (() => {
  const create = <T>(urlOrConfig: string | AjaxConfig) => {
    const config: AjaxConfig =
      typeof urlOrConfig === 'string'
        ? {
            url: urlOrConfig,
          }
        : urlOrConfig;
    return fromAjax<T>(config);
  };

  create.get = ajaxGet;
  create.post = ajaxPost;
  create.delete = ajaxDelete;
  create.put = ajaxPut;
  create.patch = ajaxPatch;
  create.getJSON = ajaxGetJSON;

  return create;
})();

const UPLOAD = 'upload';
const DOWNLOAD = 'download';
const LOADSTART = 'loadstart';
const PROGRESS = 'progress';
const LOAD = 'load';

export function fromAjax<T>(init: AjaxConfig): Observable<AjaxResponse<T>> {
  return new Observable((destination) => {
    const config = {
      // Defaults
      async: true,
      crossDomain: false,
      withCredentials: false,
      method: 'GET',
      timeout: 0,
      responseType: 'json' as XMLHttpRequestResponseType,

      ...init,
    };

    const { queryParams, body: configuredBody, headers: configuredHeaders } = config;

    let url = config.url;
    if (!url) {
      throw new TypeError('url is required');
    }

    if (queryParams) {
      let searchParams: URLSearchParams;
      if (url.includes('?')) {
        // If the user has passed a URL with a querystring already in it,
        // we need to combine them. So we're going to split it. There
        // should only be one `?` in a valid URL.
        const parts = url.split('?');
        if (2 < parts.length) {
          throw new TypeError('invalid url');
        }
        // Add the passed queryParams to the params already in the url provided.
        searchParams = new URLSearchParams(parts[1]);
        // queryParams is converted to any because the runtime is *much* more permissive than
        // the types are.
        new URLSearchParams(queryParams as any).forEach((value, key) => searchParams.set(key, value));
        // We have to do string concatenation here, because `new URL(url)` does
        // not like relative URLs like `/this` without a base url, which we can't
        // specify, nor can we assume `location` will exist, because of node.
        url = parts[0] + '?' + searchParams;
      } else {
        // There is no preexisting querystring, so we can just use URLSearchParams
        // to convert the passed queryParams into the proper format and encodings.
        // queryParams is converted to any because the runtime is *much* more permissive than
        // the types are.
        searchParams = new URLSearchParams(queryParams as any);
        url = url + '?' + searchParams;
      }
    }

    // Normalize the headers. We're going to make them all lowercase, since
    // Headers are case insensitive by design. This makes it easier to verify
    // that we aren't setting or sending duplicates.
    const headers: Record<string, any> = {};
    if (configuredHeaders) {
      for (const key in configuredHeaders) {
        if (configuredHeaders.hasOwnProperty(key)) {
          headers[key.toLowerCase()] = configuredHeaders[key];
        }
      }
    }

    const crossDomain = config.crossDomain;

    // Set the x-requested-with header. This is a non-standard header that has
    // come to be a de facto standard for HTTP requests sent by libraries and frameworks
    // using XHR. However, we DO NOT want to set this if it is a CORS request. This is
    // because sometimes this header can cause issues with CORS. To be clear,
    // None of this is necessary, it's only being set because it's "the thing libraries do"
    // Starting back as far as JQuery, and continuing with other libraries such as Angular 1,
    // Axios, et al.
    if (!crossDomain && !('x-requested-with' in headers)) {
      headers['x-requested-with'] = 'XMLHttpRequest';
    }

    // Allow users to provide their XSRF cookie name and the name of a custom header to use to
    // send the cookie.
    const { withCredentials, xsrfCookieName, xsrfHeaderName } = config;
    if ((withCredentials || !crossDomain) && xsrfCookieName && xsrfHeaderName) {
      const xsrfCookie = document?.cookie.match(new RegExp(`(^|;\\s*)(${xsrfCookieName})=([^;]*)`))?.pop() ?? '';
      if (xsrfCookie) {
        headers[xsrfHeaderName] = xsrfCookie;
      }
    }

    // Examine the body and determine whether or not to serialize it
    // and set the content-type in `headers`, if we're able.
    const body = extractContentTypeAndMaybeSerializeBody(configuredBody, headers);

    // The final request settings.
    const _request: Readonly<AjaxRequest> = {
      ...config,

      // Set values we ensured above
      url,
      headers,
      body,
    };

    let xhr: XMLHttpRequest;

    // Create our XHR so we can get started.
    xhr = init.createXHR ? init.createXHR() : new XMLHttpRequest();

    {
      ///////////////////////////////////////////////////
      // set up the events before open XHR
      // https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest
      // You need to add the event listeners before calling open() on the request.
      // Otherwise the progress events will not fire.
      ///////////////////////////////////////////////////

      const { progressSubscriber, includeDownloadProgress = false, includeUploadProgress = false } = init;

      /**
       * Wires up an event handler that will emit an error when fired. Used
       * for timeout and abort events.
       * @param type The type of event we're treating as an error
       * @param errorFactory A function that creates the type of error to emit.
       */
      const addErrorEvent = (type: string, errorFactory: () => any) => {
        xhr.addEventListener(type, () => {
          const error = errorFactory();
          progressSubscriber?.error?.(error);
          destination.error(error);
        });
      };

      // If the request times out, handle errors appropriately.
      addErrorEvent('timeout', () => new AjaxTimeoutError(xhr, _request));

      // If the request aborts (due to a network disconnection or the like), handle
      // it as an error.
      addErrorEvent('abort', () => new AjaxError('aborted', xhr, _request));

      /**
       * Creates a response object to emit to the consumer.
       * @param direction the direction related to the event. Prefixes the event `type` in the
       * `AjaxResponse` object with "upload_" for events related to uploading and "download_"
       * for events related to downloading.
       * @param event the actual event object.
       */
      const createResponse = (direction: AjaxDirection, event: ProgressEvent) =>
        new AjaxResponse<T>(event, xhr, _request, `${direction}_${event.type as ProgressEventType}` as const);

      /**
       * Wires up an event handler that emits a Response object to the consumer, used for
       * all events that emit responses, loadstart, progress, and load.
       * Note that download load handling is a bit different below, because it has
       * more logic it needs to run.
       * @param target The target, either the XHR itself or the Upload object.
       * @param type The type of event to wire up
       * @param direction The "direction", used to prefix the response object that is
       * emitted to the consumer. (e.g. "upload_" or "download_")
       */
      const addProgressEvent = (target: any, type: string, direction: AjaxDirection) => {
        target.addEventListener(type, (event: ProgressEvent) => {
          destination.next(createResponse(direction, event));
        });
      };

      if (includeUploadProgress) {
        [LOADSTART, PROGRESS, LOAD].forEach((type) => addProgressEvent(xhr.upload, type, UPLOAD));
      }

      if (progressSubscriber) {
        [LOADSTART, PROGRESS].forEach((type) => xhr.upload.addEventListener(type, (e: any) => progressSubscriber?.next?.(e)));
      }

      if (includeDownloadProgress) {
        [LOADSTART, PROGRESS].forEach((type) => addProgressEvent(xhr, type, DOWNLOAD));
      }

      const emitError = (status?: number) => {
        const msg = 'ajax error' + (status ? ' ' + status : '');
        destination.error(new AjaxError(msg, xhr, _request));
      };

      xhr.addEventListener('error', (e) => {
        progressSubscriber?.error?.(e);
        emitError();
      });

      xhr.addEventListener(LOAD, (event) => {
        const { status } = xhr;
        // 4xx and 5xx should error (https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)
        if (status < 400) {
          progressSubscriber?.complete?.();

          let response: AjaxResponse<T>;
          try {
            // This can throw in IE, because we end up needing to do a JSON.parse
            // of the response in some cases to produce object we'd expect from
            // modern browsers.
            response = createResponse(DOWNLOAD, event);
          } catch (err) {
            destination.error(err);
            return;
          }

          destination.next(response);
          destination.complete();
        } else {
          progressSubscriber?.error?.(event);
          emitError(status);
        }
      });
    }

    const { user, method, async } = _request;
    // open XHR
    if (user) {
      xhr.open(method, url, async, user, _request.password);
    } else {
      xhr.open(method, url, async);
    }

    // timeout, responseType and withCredentials can be set once the XHR is open
    if (async) {
      xhr.timeout = _request.timeout;
      xhr.responseType = _request.responseType;
    }

    if ('withCredentials' in xhr) {
      xhr.withCredentials = _request.withCredentials;
    }

    // set headers
    for (const key in headers) {
      if (headers.hasOwnProperty(key)) {
        xhr.setRequestHeader(key, headers[key]);
      }
    }

    // finally send the request
    if (body) {
      xhr.send(body);
    } else {
      xhr.send();
    }

    return () => {
      if (xhr && xhr.readyState !== 4 /*XHR done*/) {
        xhr.abort();
      }
    };
  });
}

/**
 * Examines the body to determine if we need to serialize it for them or not.
 * If the body is a type that XHR handles natively, we just allow it through,
 * otherwise, if the body is something that *we* can serialize for the user,
 * we will serialize it, and attempt to set the `content-type` header, if it's
 * not already set.
 * @param body The body passed in by the user
 * @param headers The normalized headers
 */
function extractContentTypeAndMaybeSerializeBody(body: any, headers: Record<string, string>) {
  if (
    !body ||
    typeof body === 'string' ||
    isFormData(body) ||
    isURLSearchParams(body) ||
    isArrayBuffer(body) ||
    isFile(body) ||
    isBlob(body) ||
    isReadableStream(body)
  ) {
    // The XHR instance itself can handle serializing these, and set the content-type for us
    // so we don't need to do that. https://xhr.spec.whatwg.org/#the-send()-method
    return body;
  }

  if (isArrayBufferView(body)) {
    // This is a typed array (e.g. Float32Array or Uint8Array), or a DataView.
    // XHR can handle this one too: https://fetch.spec.whatwg.org/#concept-bodyinit-extract
    return body.buffer;
  }

  if (typeof body === 'object') {
    // If we have made it here, this is an object, probably a POJO, and we'll try
    // to serialize it for them. If this doesn't work, it will throw, obviously, which
    // is okay. The workaround for users would be to manually set the body to their own
    // serialized string (accounting for circular references or whatever), then set
    // the content-type manually as well.
    headers['content-type'] = headers['content-type'] ?? 'application/json;charset=utf-8';
    return JSON.stringify(body);
  }

  // If we've gotten past everything above, this is something we don't quite know how to
  // handle. Throw an error. This will be caught and emitted from the observable.
  throw new TypeError('Unknown body type');
}

const _toString = Object.prototype.toString;

function toStringCheck(obj: any, name: string): boolean {
  return _toString.call(obj) === `[object ${name}]`;
}

function isArrayBuffer(body: any): body is ArrayBuffer {
  return toStringCheck(body, 'ArrayBuffer');
}

function isFile(body: any): body is File {
  return toStringCheck(body, 'File');
}

function isBlob(body: any): body is Blob {
  return toStringCheck(body, 'Blob');
}

function isArrayBufferView(body: any): body is ArrayBufferView {
  return typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body);
}

function isFormData(body: any): body is FormData {
  return typeof FormData !== 'undefined' && body instanceof FormData;
}

function isURLSearchParams(body: any): body is URLSearchParams {
  return typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams;
}

function isReadableStream(body: any): body is ReadableStream {
  return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;
}
rP˸xGimport { AjaxRequest } from './types';
import { getXHRResponse } from './getXHRResponse';
import { createErrorClass } from '../util/createErrorClass';

/**
 * A normalized AJAX error.
 *
 * @see {@link ajax}
 */
export interface AjaxError extends Error {
  /**
   * The XHR instance associated with the error.
   */
  xhr: XMLHttpRequest;

  /**
   * The AjaxRequest associated with the error.
   */
  request: AjaxRequest;

  /**
   * The HTTP status code, if the request has completed. If not,
   * it is set to `0`.
   */
  status: number;

  /**
   * The responseType (e.g. 'json', 'arraybuffer', or 'xml').
   */
  responseType: XMLHttpRequestResponseType;

  /**
   * The response data.
   */
  response: any;
}

export interface AjaxErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (message: string, xhr: XMLHttpRequest, request: AjaxRequest): AjaxError;
}

/**
 * Thrown when an error occurs during an AJAX request.
 * This is only exported because it is useful for checking to see if an error
 * is an `instanceof AjaxError`. DO NOT create new instances of `AjaxError` with
 * the constructor.
 *
 * @see {@link ajax}
 */
export const AjaxError: AjaxErrorCtor = createErrorClass(
  (_super) =>
    function AjaxErrorImpl(this: any, message: string, xhr: XMLHttpRequest, request: AjaxRequest) {
      this.message = message;
      this.name = 'AjaxError';
      this.xhr = xhr;
      this.request = request;
      this.status = xhr.status;
      this.responseType = xhr.responseType;
      let response: any;
      try {
        // This can throw in IE, because we have to do a JSON.parse of
        // the response in some cases to get the expected response property.
        response = getXHRResponse(xhr);
      } catch (err) {
        response = xhr.responseText;
      }
      this.response = response;
    }
);

export interface AjaxTimeoutError extends AjaxError {}

export interface AjaxTimeoutErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (xhr: XMLHttpRequest, request: AjaxRequest): AjaxTimeoutError;
}

/**
 * Thrown when an AJAX request times out. Not to be confused with {@link TimeoutError}.
 *
 * This is exported only because it is useful for checking to see if errors are an
 * `instanceof AjaxTimeoutError`. DO NOT use the constructor to create an instance of
 * this type.
 *
 * @see {@link ajax}
 */
export const AjaxTimeoutError: AjaxTimeoutErrorCtor = (() => {
  function AjaxTimeoutErrorImpl(this: any, xhr: XMLHttpRequest, request: AjaxRequest) {
    AjaxError.call(this, 'ajax timeout', xhr, request);
    this.name = 'AjaxTimeoutError';
    return this;
  }
  AjaxTimeoutErrorImpl.prototype = Object.create(AjaxError.prototype);
  return AjaxTimeoutErrorImpl;
})() as any;
\ۚDxC/**
 * Gets what should be in the `response` property of the XHR. However,
 * since we still support the final versions of IE, we need to do a little
 * checking here to make sure that we get the right thing back. Consequently,
 * we need to do a JSON.parse() in here, which *could* throw if the response
 * isn't valid JSON.
 *
 * This is used both in creating an AjaxResponse, and in creating certain errors
 * that we throw, so we can give the user whatever was in the response property.
 *
 * @param xhr The XHR to examine the response of
 */
export function getXHRResponse(xhr: XMLHttpRequest) {
  switch (xhr.responseType) {
    case 'json': {
      if ('response' in xhr) {
        return xhr.response;
      } else {
        // IE
        const ieXHR: any = xhr;
        return JSON.parse(ieXHR.responseText);
      }
    }
    case 'document':
      return xhr.responseXML;
    case 'text':
    default: {
      if ('response' in xhr) {
        return xhr.response;
      } else {
        // IE
        const ieXHR: any = xhr;
        return ieXHR.responseText;
      }
    }
  }
}
^T︣x8"import { PartialObserver } from '../types';

/**
 * Valid Ajax direction types. Prefixes the event `type` in the
 * {@link AjaxResponse} object with "upload_" for events related
 * to uploading and "download_" for events related to downloading.
 */
export type AjaxDirection = 'upload' | 'download';

export type ProgressEventType = 'loadstart' | 'progress' | 'load';

export type AjaxResponseType = `${AjaxDirection}_${ProgressEventType}`;

/**
 * The object containing values RxJS used to make the HTTP request.
 *
 * This is provided in {@link AjaxError} instances as the `request`
 * object.
 */
export interface AjaxRequest {
  /**
   * The URL requested.
   */
  url: string;

  /**
   * The body to send over the HTTP request.
   */
  body?: any;

  /**
   * The HTTP method used to make the HTTP request.
   */
  method: string;

  /**
   * Whether or not the request was made asynchronously.
   */
  async: boolean;

  /**
   * The headers sent over the HTTP request.
   */
  headers: Readonly<Record<string, any>>;

  /**
   * The timeout value used for the HTTP request.
   * Note: this is only honored if the request is asynchronous (`async` is `true`).
   */
  timeout: number;

  /**
   * The user credentials user name sent with the HTTP request.
   */
  user?: string;

  /**
   * The user credentials password sent with the HTTP request.
   */
  password?: string;

  /**
   * Whether or not the request was a CORS request.
   */
  crossDomain: boolean;

  /**
   * Whether or not a CORS request was sent with credentials.
   * If `false`, will also ignore cookies in the CORS response.
   */
  withCredentials: boolean;

  /**
   * The [`responseType`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType) set before sending the request.
   */
  responseType: XMLHttpRequestResponseType;
}

/**
 * Configuration for the {@link ajax} creation function.
 */
export interface AjaxConfig {
  /** The address of the resource to request via HTTP. */
  url: string;

  /**
   * The body of the HTTP request to send.
   *
   * This is serialized, by default, based off of the value of the `"content-type"` header.
   * For example, if the `"content-type"` is `"application/json"`, the body will be serialized
   * as JSON. If the `"content-type"` is `"application/x-www-form-urlencoded"`, whatever object passed
   * to the body will be serialized as URL, using key-value pairs based off of the keys and values of the object.
   * In all other cases, the body will be passed directly.
   */
  body?: any;

  /**
   * Whether or not to send the request asynchronously. Defaults to `true`.
   * If set to `false`, this will block the thread until the AJAX request responds.
   */
  async?: boolean;

  /**
   * The HTTP Method to use for the request. Defaults to "GET".
   */
  method?: string;

  /**
   * The HTTP headers to apply.
   *
   * Note that, by default, RxJS will add the following headers under certain conditions:
   *
   * 1. If the `"content-type"` header is **NOT** set, and the `body` is [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData),
   *    a `"content-type"` of `"application/x-www-form-urlencoded; charset=UTF-8"` will be set automatically.
   * 2. If the `"x-requested-with"` header is **NOT** set, and the `crossDomain` configuration property is **NOT** explicitly set to `true`,
   *    (meaning it is not a CORS request), a `"x-requested-with"` header with a value of `"XMLHttpRequest"` will be set automatically.
   *    This header is generally meaningless, and is set by libraries and frameworks using `XMLHttpRequest` to make HTTP requests.
   */
  headers?: Readonly<Record<string, any>>;

  /**
   * The time to wait before causing the underlying XMLHttpRequest to timeout. This is only honored if the
   * `async` configuration setting is unset or set to `true`. Defaults to `0`, which is idiomatic for "never timeout".
   */
  timeout?: number;

  /** The user credentials user name to send with the HTTP request */
  user?: string;

  /** The user credentials password to send with the HTTP request*/
  password?: string;

  /**
   * Whether or not to send the HTTP request as a CORS request.
   * Defaults to `false`.
   *
   * @deprecated Will be removed in version 8. Cross domain requests and what creates a cross
   * domain request, are dictated by the browser, and a boolean that forces it to be cross domain
   * does not make sense. If you need to force cross domain, make sure you're making a secure request,
   * then add a custom header to the request or use `withCredentials`. For more information on what
   * triggers a cross domain request, see the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials).
   * In particular, the section on [Simple Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests) is useful
   * for understanding when CORS will not be used.
   */
  crossDomain?: boolean;

  /**
   * To send user credentials in a CORS request, set to `true`. To exclude user credentials from
   * a CORS request, _OR_ when cookies are to be ignored by the CORS response, set to `false`.
   *
   * Defaults to `false`.
   */
  withCredentials?: boolean;

  /**
   * The name of your site's XSRF cookie.
   */
  xsrfCookieName?: string;

  /**
   * The name of a custom header that you can use to send your XSRF cookie.
   */
  xsrfHeaderName?: string;

  /**
   * Can be set to change the response type.
   * Valid values are `"arraybuffer"`, `"blob"`, `"document"`, `"json"`, and `"text"`.
   * Note that the type of `"document"` (such as an XML document) is ignored if the global context is
   * not `Window`.
   *
   * Defaults to `"json"`.
   */
  responseType?: XMLHttpRequestResponseType;

  /**
   * An optional factory used to create the XMLHttpRequest object used to make the AJAX request.
   * This is useful in environments that lack `XMLHttpRequest`, or in situations where you
   * wish to override the default `XMLHttpRequest` for some reason.
   *
   * If not provided, the `XMLHttpRequest` in global scope will be used.
   *
   * NOTE: This AJAX implementation relies on the built-in serialization and setting
   * of Content-Type headers that is provided by standards-compliant XMLHttpRequest implementations,
   * be sure any implementation you use meets that standard.
   */
  createXHR?: () => XMLHttpRequest;

  /**
   * An observer for watching the upload progress of an HTTP request. Will
   * emit progress events, and completes on the final upload load event, will error for
   * any XHR error or timeout.
   *
   * This will **not** error for errored status codes. Rather, it will always _complete_ when
   * the HTTP response comes back.
   *
   * @deprecated If you're looking for progress events, use {@link includeDownloadProgress} and
   * {@link includeUploadProgress} instead. Will be removed in v8.
   */
  progressSubscriber?: PartialObserver<ProgressEvent>;

  /**
   * If `true`, will emit all download progress and load complete events as {@link AjaxResponse}
   * from the observable. The final download event will also be emitted as a {@link AjaxResponse}.
   *
   * If both this and {@link includeUploadProgress} are `false`, then only the {@link AjaxResponse} will
   * be emitted from the resulting observable.
   */
  includeDownloadProgress?: boolean;

  /**
   * If `true`, will emit all upload progress and load complete events as {@link AjaxResponse}
   * from the observable. The final download event will also be emitted as a {@link AjaxResponse}.
   *
   * If both this and {@link includeDownloadProgress} are `false`, then only the {@link AjaxResponse} will
   * be emitted from the resulting observable.
   */
  includeUploadProgress?: boolean;

  /**
   * Query string parameters to add to the URL in the request.
   * <em>This will require a polyfill for `URL` and `URLSearchParams` in Internet Explorer!</em>
   *
   * Accepts either a query string, a `URLSearchParams` object, a dictionary of key/value pairs, or an
   * array of key/value entry tuples. (Essentially, it takes anything that `new URLSearchParams` would normally take).
   *
   * If, for some reason you have a query string in the `url` argument, this will append to the query string in the url,
   * but it will also overwrite the value of any keys that are an exact match. In other words, a url of `/test?a=1&b=2`,
   * with queryParams of `{ b: 5, c: 6 }` will result in a url of roughly `/test?a=1&b=5&c=6`.
   */
  queryParams?:
    | string
    | URLSearchParams
    | Record<string, string | number | boolean | string[] | number[] | boolean[]>
    | [string, string | number | boolean | string[] | number[] | boolean[]][];
}


ZZx!import { Subscriber } from './Subscriber';
import { ObservableNotification } from './types';

/**
 * The {@link GlobalConfig} object for RxJS. It is used to configure things
 * like how to react on unhandled errors.
 */
export const config: GlobalConfig = {
  onUnhandledError: null,
  onStoppedNotification: null,
  Promise: undefined,
  useDeprecatedSynchronousErrorHandling: false,
  useDeprecatedNextContext: false,
};

/**
 * The global configuration object for RxJS, used to configure things
 * like how to react on unhandled errors. Accessible via {@link config}
 * object.
 */
export interface GlobalConfig {
  /**
   * A registration point for unhandled errors from RxJS. These are errors that
   * cannot were not handled by consuming code in the usual subscription path. For
   * example, if you have this configured, and you subscribe to an observable without
   * providing an error handler, errors from that subscription will end up here. This
   * will _always_ be called asynchronously on another job in the runtime. This is because
   * we do not want errors thrown in this user-configured handler to interfere with the
   * behavior of the library.
   */
  onUnhandledError: ((err: any) => void) | null;

  /**
   * A registration point for notifications that cannot be sent to subscribers because they
   * have completed, errored or have been explicitly unsubscribed. By default, next, complete
   * and error notifications sent to stopped subscribers are noops. However, sometimes callers
   * might want a different behavior. For example, with sources that attempt to report errors
   * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.
   * This will _always_ be called asynchronously on another job in the runtime. This is because
   * we do not want errors thrown in this user-configured handler to interfere with the
   * behavior of the library.
   */
  onStoppedNotification: ((notification: ObservableNotification<any>, subscriber: Subscriber<any>) => void) | null;

  /**
   * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}
   * methods.
   *
   * @deprecated As of version 8, RxJS will no longer support this sort of injection of a
   * Promise constructor. If you need a Promise implementation other than native promises,
   * please polyfill/patch Promise as you see appropriate. Will be removed in v8.
   */
  Promise?: PromiseConstructorLike;

  /**
   * If true, turns on synchronous error rethrowing, which is a deprecated behavior
   * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe
   * call in a try/catch block. It also enables producer interference, a nasty bug
   * where a multicast can be broken for all observers by a downstream consumer with
   * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME
   * FOR MIGRATION REASONS.
   *
   * @deprecated As of version 8, RxJS will no longer support synchronous throwing
   * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad
   * behaviors described above. Will be removed in v8.
   */
  useDeprecatedSynchronousErrorHandling: boolean;

  /**
   * If true, enables an as-of-yet undocumented feature from v5: The ability to access
   * `unsubscribe()` via `this` context in `next` functions created in observers passed
   * to `subscribe`.
   *
   * This is being removed because the performance was severely problematic, and it could also cause
   * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have
   * their `this` context overwritten.
   *
   * @deprecated As of version 8, RxJS will no longer support altering the
   * context of next functions provided as part of an observer to Subscribe. Instead,
   * you will have access to a subscription or a signal or token that will allow you to do things like
   * unsubscribe and test closed status. Will be removed in v8.
   */
  useDeprecatedNextContext: boolean;
}
&t߱x1
import { Observable } from './Observable';
import { EmptyError } from './util/EmptyError';
import { SafeSubscriber } from './Subscriber';

export interface FirstValueFromConfig<T> {
  defaultValue: T;
}

export function firstValueFrom<T, D>(source: Observable<T>, config: FirstValueFromConfig<D>): Promise<T | D>;
export function firstValueFrom<T>(source: Observable<T>): Promise<T>;

/**
 * Converts an observable to a promise by subscribing to the observable,
 * and returning a promise that will resolve as soon as the first value
 * arrives from the observable. The subscription will then be closed.
 *
 * If the observable stream completes before any values were emitted, the
 * returned promise will reject with {@link EmptyError} or will resolve
 * with the default value if a default was specified.
 *
 * If the observable stream emits an error, the returned promise will reject
 * with that error.
 *
 * **WARNING**: Only use this with observables you *know* will emit at least one value,
 * *OR* complete. If the source observable does not emit one value or complete, you will
 * end up with a promise that is hung up, and potentially all of the state of an
 * async function hanging out in memory. To avoid this situation, look into adding
 * something like {@link timeout}, {@link take}, {@link takeWhile}, or {@link takeUntil}
 * amongst others.
 *
 * ## Example
 *
 * Wait for the first value from a stream and emit it from a promise in
 * an async function
 *
 * ```ts
 * import { interval, firstValueFrom } from 'rxjs';
 *
 * async function execute() {
 *   const source$ = interval(2000);
 *   const firstNumber = await firstValueFrom(source$);
 *   console.log(`The first number is ${ firstNumber }`);
 * }
 *
 * execute();
 *
 * // Expected output:
 * // 'The first number is 0'
 * ```
 *
 * @see {@link lastValueFrom}
 *
 * @param source the observable to convert to a promise
 * @param config a configuration object to define the `defaultValue` to use if the source completes without emitting a value
 */
export function firstValueFrom<T, D>(source: Observable<T>, config?: FirstValueFromConfig<D>): Promise<T | D> {
  const hasConfig = typeof config === 'object';
  return new Promise<T | D>((resolve, reject) => {
    const subscriber = new SafeSubscriber<T>({
      next: (value) => {
        resolve(value);
        subscriber.unsubscribe();
      },
      error: reject,
      complete: () => {
        if (hasConfig) {
          resolve(config!.defaultValue);
        } else {
          reject(new EmptyError());
        }
      },
    });
    source.subscribe(subscriber);
  });
}
!c%?x[[
export interface La=la1La7laMwaiting for it to complete, and resolving the returned promise with the
 * last value from the observed stream.
 *
 * If the obkb*
 * observable does not complete, you willA+
 *l#/
 *!.
 *(>5lavltake, la_2.pipe(take(10));
 *   const finalNumber = await lah.nal number is ${ finalI-nal number is 9'
 * ```
 *
 * @see {@link fir!la/?: La%Wj>let _hasValue = false;
    let _value: T;
    source.subscribe$(_value = value;
        _hasValue = true=	D!_hasValue) {
          resolve(_v	}	});
}
5ximport { Subject } from '../Subject';
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { Subscription } from '../Subscription';
import { refCount as higherOrderRefCount } from '../operators/refCount';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { hasLift } from '../util/lift';

/**
 * @class ConnectableObservable<T>
 * @deprecated Will be removed in v8. Use {@link connectable} to create a connectable observable.
 * If you are using the `refCount` method of `ConnectableObservable`, use the {@link share} operator
 * instead.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export class ConnectableObservable<T> extends Observable<T> {
  protected _subject: Subject<T> | null = null;
  protected _refCount: number = 0;
  protected _connection: Subscription | null = null;

  /**
   * @param source The source observable
   * @param subjectFactory The factory that creates the subject used internally.
   * @deprecated Will be removed in v8. Use {@link connectable} to create a connectable observable.
   * `new ConnectableObservable(source, factory)` is equivalent to
   * `connectable(source, { connector: factory })`.
   * When the `refCount()` method is needed, the {@link share} operator should be used instead:
   * `new ConnectableObservable(source, factory).refCount()` is equivalent to
   * `source.pipe(share({ connector: factory }))`.
   * Details: https://rxjs.dev/deprecations/multicasting
   */
  constructor(public source: Observable<T>, protected subjectFactory: () => Subject<T>) {
    super();
    // If we have lift, monkey patch that here. This is done so custom observable
    // types will compose through multicast. Otherwise the resulting observable would
    // simply be an instance of `ConnectableObservable`.
    if (hasLift(source)) {
      this.lift = source.lift;
    }
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>) {
    return this.getSubject().subscribe(subscriber);
  }

  protected getSubject(): Subject<T> {
    const subject = this._subject;
    if (!subject || subject.isStopped) {
      this._subject = this.subjectFactory();
    }
    return this._subject!;
  }

  protected _teardown() {
    this._refCount = 0;
    const { _connection } = this;
    this._subject = this._connection = null;
    _connection?.unsubscribe();
  }

  /**
   * @deprecated {@link ConnectableObservable} will be removed in v8. Use {@link connectable} instead.
   * Details: https://rxjs.dev/deprecations/multicasting
   */
  connect(): Subscription {
    let connection = this._connection;
    if (!connection) {
      connection = this._connection = new Subscription();
      const subject = this.getSubject();
      connection.add(
        this.source.subscribe(
          createOperatorSubscriber(
            subject as any,
            undefined,
            () => {
              this._teardown();
              subject.complete();
            },
            (err) => {
              this._teardown();
              subject.error(err);
            },
            () => this._teardown()
          )
        )
      );

      if (connection.closed) {
        this._connection = null;
        connection = Subscription.EMPTY;
      }
    }
    return connection;
  }

  /**
   * @deprecated {@link ConnectableObservable} will be removed in v8. Use the {@link share} operator instead.
   * Details: https://rxjs.dev/deprecations/multicasting
   */
  refCount(): Observable<T> {
    return higherOrderRefCount()(this) as Observable<T>;
  }
}
Ԑݱx^/* @prettier */
import { SchedulerLike } from '../types';
import { Observable } from '../Observable';
import { bindCallbackInternals } from './bindCallbackInternals';

export function bindCallback(
  callbackFunc: (...args: any[]) => void,
  resultSelector: (...args: any[]) => any,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<any>;

// args is the arguments array and we push the callback on the rest tuple since the rest parameter must be last (only item) in a parameter list
export function bindCallback<A extends readonly unknown[], R extends readonly unknown[]>(
  callbackFunc: (...args: [...A, (...res: R) => void]) => void,
  schedulerLike?: SchedulerLike
): (...arg: A) => Observable<R extends [] ? void : R extends [any] ? R[0] : R>;

/**
 * Converts a callback API to a function that returns an Observable.
 *
 * <span class="informal">Give it a function `f` of type `f(x, callback)` and
 * it will return a function `g` that when called as `g(x)` will output an
 * Observable.</span>
 *
 * `bindCallback` is not an operator because its input and output are not
 * Observables. The input is a function `func` with some parameters. The
 * last parameter must be a callback function that `func` calls when it is
 * done.
 *
 * The output of `bindCallback` is a function that takes the same parameters
 * as `func`, except the last one (the callback). When the output function
 * is called with arguments it will return an Observable. If function `func`
 * calls its callback with one argument, the Observable will emit that value.
 * If on the other hand the callback is called with multiple values the resulting
 * Observable will emit an array with said values as arguments.
 *
 * It is **very important** to remember that input function `func` is not called
 * when the output function is, but rather when the Observable returned by the output
 * function is subscribed. This means if `func` makes an AJAX request, that request
 * will be made every time someone subscribes to the resulting Observable, but not before.
 *
 * The last optional parameter - `scheduler` - can be used to control when the call
 * to `func` happens after someone subscribes to Observable, as well as when results
 * passed to callback will be emitted. By default, the subscription to an Observable calls `func`
 * synchronously, but using {@link asyncScheduler} as the last parameter will defer the call to `func`,
 * just like wrapping the call in `setTimeout` with a timeout of `0` would. If you were to use the async Scheduler
 * and call `subscribe` on the output Observable, all function calls that are currently executing
 * will end before `func` is invoked.
 *
 * By default, results passed to the callback are emitted immediately after `func` invokes the callback.
 * In particular, if the callback is called synchronously, then the subscription of the resulting Observable
 * will call the `next` function synchronously as well.  If you want to defer that call,
 * you may use {@link asyncScheduler} just as before.  This means that by using `Scheduler.async` you can
 * ensure that `func` always calls its callback asynchronously, thus avoiding terrifying Zalgo.
 *
 * Note that the Observable created by the output function will always emit a single value
 * and then complete immediately. If `func` calls the callback multiple times, values from subsequent
 * calls will not appear in the stream. If you need to listen for multiple calls,
 *  you probably want to use {@link fromEvent} or {@link fromEventPattern} instead.
 *
 * If `func` depends on some context (`this` property) and is not already bound, the context of `func`
 * will be the context that the output function has at call time. In particular, if `func`
 * is called as a method of some object and if `func` is not already bound, in order to preserve the context
 * it is recommended that the context of the output function is set to that object as well.
 *
 * If the input function calls its callback in the "node style" (i.e. first argument to callback is
 * optional error parameter signaling whether the call failed or not), {@link bindNodeCallback}
 * provides convenient error handling and probably is a better choice.
 * `bindCallback` will treat such functions the same as any other and error parameters
 * (whether passed or not) will always be interpreted as regular callback argument.
 *
 * ## Examples
 *
 * Convert jQuery's getJSON to an Observable API
 *
 * ```ts
 * import { bindCallback } from 'rxjs';
 * import * as jQuery from 'jquery';
 *
 * // Suppose we have jQuery.getJSON('/my/url', callback)
 * const getJSONAsObservable = bindCallback(jQuery.getJSON);
 * const result = getJSONAsObservable('/my/url');
 * result.subscribe(x => console.log(x), e => console.error(e));
 * ```
 *
 * Receive an array of arguments passed to a callback
 *
 * ```ts
 * import { bindCallback } from 'rxjs';
 *
 * const someFunction = (n, s, cb) => {
 *   cb(n, s, { someProperty: 'someValue' });
 * };
 *
 * const boundSomeFunction = bindCallback(someFunction);
 * boundSomeFunction(5, 'some string').subscribe((values) => {
 *   console.log(values); // [5, 'some string', {someProperty: 'someValue'}]
 * });
 * ```
 *
 * Compare behaviour with and without `asyncScheduler`
 *
 * ```ts
 * import { bindCallback, asyncScheduler } from 'rxjs';
 *
 * function iCallMyCallbackSynchronously(cb) {
 *   cb();
 * }
 *
 * const boundSyncFn = bindCallback(iCallMyCallbackSynchronously);
 * const boundAsyncFn = bindCallback(iCallMyCallbackSynchronously, null, asyncScheduler);
 *
 * boundSyncFn().subscribe(() => console.log('I was sync!'));
 * boundAsyncFn().subscribe(() => console.log('I was async!'));
 * console.log('This happened...');
 *
 * // Logs:
 * // I was sync!
 * // This happened...
 * // I was async!
 * ```
 *
 * Use `bindCallback` on an object method
 *
 * ```ts
 * import { bindCallback } from 'rxjs';
 *
 * const boundMethod = bindCallback(someObject.methodWithCallback);
 * boundMethod
 *   .call(someObject) // make sure methodWithCallback has access to someObject
 *   .subscribe(subscriber);
 * ```
 *
 * @see {@link bindNodeCallback}
 * @see {@link from}
 *
 * @param callbackFunc A function with a callback as the last parameter.
 * @param resultSelector A mapping function used to transform callback events.
 * @param scheduler The scheduler on which to schedule the callbacks.
 * @return A function which returns the Observable that delivers the same
 * values the callback would deliver.
 */
export function bindCallback(
  callbackFunc: (...args: [...any[], (...res: any) => void]) => void,
  resultSelector?: ((...args: any[]) => any) | SchedulerLike,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<unknown> {
  return bindCallbackInternals(false, callbackFunc, resultSelector, scheduler);
}
 xNimport { SchedulerLike } from '../types';
import { isScheduler } from '../util/isScheduler';
import { Observable } from '../Observable';
import { subscribeOn } from '../operators/subscribeOn';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { observeOn } from '../operators/observeOn';
import { AsyncSubject } from '../AsyncSubject';

export function bindCallbackInternals(
  isNodeStyle: boolean,
  callbackFunc: any,
  resultSelector?: any,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<unknown> {
  if (resultSelector) {
    if (isScheduler(resultSelector)) {
      scheduler = resultSelector;
    } else {
      // The user provided a result selector.
      return function (this: any, ...args: any[]) {
        return (bindCallbackInternals(isNodeStyle, callbackFunc, scheduler) as any)
          .apply(this, args)
          .pipe(mapOneOrManyArgs(resultSelector as any));
      };
    }
  }

  // If a scheduler was passed, use our `subscribeOn` and `observeOn` operators
  // to compose that behavior for the user.
  if (scheduler) {
    return function (this: any, ...args: any[]) {
      return (bindCallbackInternals(isNodeStyle, callbackFunc) as any)
        .apply(this, args)
        .pipe(subscribeOn(scheduler!), observeOn(scheduler!));
    };
  }

  return function (this: any, ...args: any[]): Observable<any> {
    // We're using AsyncSubject, because it emits when it completes,
    // and it will play the value to all late-arriving subscribers.
    const subject = new AsyncSubject<any>();

    // If this is true, then we haven't called our function yet.
    let uninitialized = true;
    return new Observable((subscriber) => {
      // Add our subscriber to the subject.
      const subs = subject.subscribe(subscriber);

      if (uninitialized) {
        uninitialized = false;
        // We're going to execute the bound function
        // This bit is to signal that we are hitting the callback asynchronously.
        // Because we don't have any anti-"Zalgo" guarantees with whatever
        // function we are handed, we use this bit to figure out whether or not
        // we are getting hit in a callback synchronously during our call.
        let isAsync = false;

        // This is used to signal that the callback completed synchronously.
        let isComplete = false;

        // Call our function that has a callback. If at any time during this
        // call, an error is thrown, it will be caught by the Observable
        // subscription process and sent to the consumer.
        callbackFunc.apply(
          // Pass the appropriate `this` context.
          this,
          [
            // Pass the arguments.
            ...args,
            // And our callback handler.
            (...results: any[]) => {
              if (isNodeStyle) {
                // If this is a node callback, shift the first value off of the
                // results and check it, as it is the error argument. By shifting,
                // we leave only the argument(s) we want to pass to the consumer.
                const err = results.shift();
                if (err != null) {
                  subject.error(err);
                  // If we've errored, we can stop processing this function
                  // as there's nothing else to do. Just return to escape.
                  return;
                }
              }
              // If we have one argument, notify the consumer
              // of it as a single value, otherwise, if there's more than one, pass
              // them as an array. Note that if there are no arguments, `undefined`
              // will be emitted.
              subject.next(1 < results.length ? results : results[0]);
              // Flip this flag, so we know we can complete it in the synchronous
              // case below.
              isComplete = true;
              // If we're not asynchronous, we need to defer the `complete` call
              // until after the call to the function is over. This is because an
              // error could be thrown in the function after it calls our callback,
              // and if that is the case, if we complete here, we are unable to notify
              // the consumer than an error occurred.
              if (isAsync) {
                subject.complete();
              }
            },
          ]
        );
        // If we flipped `isComplete` during the call, we resolved synchronously,
        // notify complete, because we skipped it in the callback to wait
        // to make sure there were no errors during the call.
        if (isComplete) {
          subject.complete();
        }

        // We're no longer synchronous. If the callback is called at this point
        // we can notify complete on the spot.
        isAsync = true;
      }

      // Return the subscription from adding our subscriber to the subject.
      return subs;
    });
  };
}
W쁳xs/* @prettier */
import { Observable } from '../Observable';
import { SchedulerLike } from '../types';
import { bindCallbackInternals } from './bindCallbackInternals';

export function bindNodeCallback(
  callbackFunc: (...args: any[]) => void,
  resultSelector: (...args: any[]) => any,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<any>;

// args is the arguments array and we push the callback on the rest tuple since the rest parameter must be last (only item) in a parameter list
export function bindNodeCallback<A extends readonly unknown[], R extends readonly unknown[]>(
  callbackFunc: (...args: [...A, (err: any, ...res: R) => void]) => void,
  schedulerLike?: SchedulerLike
): (...arg: A) => Observable<R extends [] ? void : R extends [any] ? R[0] : R>;

/**
 * Converts a Node.js-style callback API to a function that returns an
 * Observable.
 *
 * <span class="informal">It's just like {@link bindCallback}, but the
 * callback is expected to be of type `callback(error, result)`.</span>
 *
 * `bindNodeCallback` is not an operator because its input and output are not
 * Observables. The input is a function `func` with some parameters, but the
 * last parameter must be a callback function that `func` calls when it is
 * done. The callback function is expected to follow Node.js conventions,
 * where the first argument to the callback is an error object, signaling
 * whether call was successful. If that object is passed to callback, it means
 * something went wrong.
 *
 * The output of `bindNodeCallback` is a function that takes the same
 * parameters as `func`, except the last one (the callback). When the output
 * function is called with arguments, it will return an Observable.
 * If `func` calls its callback with error parameter present, Observable will
 * error with that value as well. If error parameter is not passed, Observable will emit
 * second parameter. If there are more parameters (third and so on),
 * Observable will emit an array with all arguments, except first error argument.
 *
 * Note that `func` will not be called at the same time output function is,
 * but rather whenever resulting Observable is subscribed. By default call to
 * `func` will happen synchronously after subscription, but that can be changed
 * with proper `scheduler` provided as optional third parameter. {@link SchedulerLike}
 * can also control when values from callback will be emitted by Observable.
 * To find out more, check out documentation for {@link bindCallback}, where
 * {@link SchedulerLike} works exactly the same.
 *
 * As in {@link bindCallback}, context (`this` property) of input function will be set to context
 * of returned function, when it is called.
 *
 * After Observable emits value, it will complete immediately. This means
 * even if `func` calls callback again, values from second and consecutive
 * calls will never appear on the stream. If you need to handle functions
 * that call callbacks multiple times, check out {@link fromEvent} or
 * {@link fromEventPattern} instead.
 *
 * Note that `bindNodeCallback` can be used in non-Node.js environments as well.
 * "Node.js-style" callbacks are just a convention, so if you write for
 * browsers or any other environment and API you use implements that callback style,
 * `bindNodeCallback` can be safely used on that API functions as well.
 *
 * Remember that Error object passed to callback does not have to be an instance
 * of JavaScript built-in `Error` object. In fact, it does not even have to an object.
 * Error parameter of callback function is interpreted as "present", when value
 * of that parameter is truthy. It could be, for example, non-zero number, non-empty
 * string or boolean `true`. In all of these cases resulting Observable would error
 * with that value. This means usually regular style callbacks will fail very often when
 * `bindNodeCallback` is used. If your Observable errors much more often then you
 * would expect, check if callback really is called in Node.js-style and, if not,
 * switch to {@link bindCallback} instead.
 *
 * Note that even if error parameter is technically present in callback, but its value
 * is falsy, it still won't appear in array emitted by Observable.
 *
 * ## Examples
 *
 *  Read a file from the filesystem and get the data as an Observable
 *
 * ```ts
 * import * as fs from 'fs';
 * const readFileAsObservable = bindNodeCallback(fs.readFile);
 * const result = readFileAsObservable('./roadNames.txt', 'utf8');
 * result.subscribe(x => console.log(x), e => console.error(e));
 * ```
 *
 * Use on function calling callback with multiple arguments
 *
 * ```ts
 * someFunction((err, a, b) => {
 *   console.log(err); // null
 *   console.log(a); // 5
 *   console.log(b); // "some string"
 * });
 * const boundSomeFunction = bindNodeCallback(someFunction);
 * boundSomeFunction()
 * .subscribe(value => {
 *   console.log(value); // [5, "some string"]
 * });
 * ```
 *
 * Use on function calling callback in regular style
 *
 * ```ts
 * someFunction(a => {
 *   console.log(a); // 5
 * });
 * const boundSomeFunction = bindNodeCallback(someFunction);
 * boundSomeFunction()
 * .subscribe(
 *   value => {}             // never gets called
 *   err => console.log(err) // 5
 * );
 * ```
 *
 * @see {@link bindCallback}
 * @see {@link from}
 *
 * @param callbackFunc Function with a Node.js-style callback as the last parameter.
 * @param resultSelector A mapping function used to transform callback events.
 * @param scheduler The scheduler on which to schedule the callbacks.
 * @return A function which returns the Observable that delivers the same values the
 * Node.js callback would deliver.
 */
export function bindNodeCallback(
  callbackFunc: (...args: [...any[], (err: any, ...res: any) => void]) => void,
  resultSelector?: ((...args: any[]) => any) | SchedulerLike,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<any> {
  return bindCallbackInternals(true, callbackFunc, resultSelector, scheduler);
}
Hpx3Jimport { Observable } from '../Observable';
import { ObservableInput, SchedulerLike, ObservedValueOf, ObservableInputTuple } from '../types';
import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';
import { Subscriber } from '../Subscriber';
import { from } from './from';
import { identity } from '../util/identity';
import { Subscription } from '../Subscription';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { popResultSelector, popScheduler } from '../util/args';
import { createObject } from '../util/createObject';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { AnyCatcher } from '../AnyCatcher';
import { executeSchedule } from '../util/executeSchedule';

// combineLatest(any)
// We put this first because we need to catch cases where the user has supplied
// _exactly `any`_ as the argument. Since `any` literally matches _anything_,
// we don't want it to randomly hit one of the other type signatures below,
// as we have no idea at build-time what type we should be returning when given an any.

/**
 * You have passed `any` here, we can't figure out if it is
 * an array or an object, so you're getting `unknown`. Use better types.
 * @param arg Something typed as `any`
 */
export function combineLatest<T extends AnyCatcher>(arg: T): Observable<unknown>;

// combineLatest([a, b, c])
export function combineLatest(sources: []): Observable<never>;
export function combineLatest<A extends readonly unknown[]>(sources: readonly [...ObservableInputTuple<A>]): Observable<A>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `combineLatestAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function combineLatest<A extends readonly unknown[], R>(
  sources: readonly [...ObservableInputTuple<A>],
  resultSelector: (...values: A) => R,
  scheduler: SchedulerLike
): Observable<R>;
export function combineLatest<A extends readonly unknown[], R>(
  sources: readonly [...ObservableInputTuple<A>],
  resultSelector: (...values: A) => R
): Observable<R>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `combineLatestAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function combineLatest<A extends readonly unknown[]>(
  sources: readonly [...ObservableInputTuple<A>],
  scheduler: SchedulerLike
): Observable<A>;

// combineLatest(a, b, c)
/** @deprecated Pass an array of sources instead. The rest-parameters signature will be removed in v8. Details: https://rxjs.dev/deprecations/array-argument */
export function combineLatest<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `combineLatestAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function combineLatest<A extends readonly unknown[], R>(
  ...sourcesAndResultSelectorAndScheduler: [...ObservableInputTuple<A>, (...values: A) => R, SchedulerLike]
): Observable<R>;
/** @deprecated Pass an array of sources instead. The rest-parameters signature will be removed in v8. Details: https://rxjs.dev/deprecations/array-argument */
export function combineLatest<A extends readonly unknown[], R>(
  ...sourcesAndResultSelector: [...ObservableInputTuple<A>, (...values: A) => R]
): Observable<R>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `combineLatestAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function combineLatest<A extends readonly unknown[]>(
  ...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike]
): Observable<A>;

// combineLatest({a, b, c})
export function combineLatest(sourcesObject: { [K in any]: never }): Observable<never>;
export function combineLatest<T extends Record<string, ObservableInput<any>>>(
  sourcesObject: T
): Observable<{ [K in keyof T]: ObservedValueOf<T[K]> }>;

/**
 * Combines multiple Observables to create an Observable whose values are
 * calculated from the latest values of each of its input Observables.
 *
 * <span class="informal">Whenever any input Observable emits a value, it
 * computes a formula using the latest values from all the inputs, then emits
 * the output of that formula.</span>
 *
 * ![](combineLatest.png)
 *
 * `combineLatest` combines the values from all the Observables passed in the
 * observables array. This is done by subscribing to each Observable in order and,
 * whenever any Observable emits, collecting an array of the most recent
 * values from each Observable. So if you pass `n` Observables to this operator,
 * the returned Observable will always emit an array of `n` values, in an order
 * corresponding to the order of the passed Observables (the value from the first Observable
 * will be at index 0 of the array and so on).
 *
 * Static version of `combineLatest` accepts an array of Observables. Note that an array of
 * Observables is a good choice, if you don't know beforehand how many Observables
 * you will combine. Passing an empty array will result in an Observable that
 * completes immediately.
 *
 * To ensure the output array always has the same length, `combineLatest` will
 * actually wait for all input Observables to emit at least once,
 * before it starts emitting results. This means if some Observable emits
 * values before other Observables started emitting, all these values but the last
 * will be lost. On the other hand, if some Observable does not emit a value but
 * completes, resulting Observable will complete at the same moment without
 * emitting anything, since it will now be impossible to include a value from the
 * completed Observable in the resulting array. Also, if some input Observable does
 * not emit any value and never completes, `combineLatest` will also never emit
 * and never complete, since, again, it will wait for all streams to emit some
 * value.
 *
 * If at least one Observable was passed to `combineLatest` and all passed Observables
 * emitted something, the resulting Observable will complete when all combined
 * streams complete. So even if some Observable completes, the result of
 * `combineLatest` will still emit values when other Observables do. In case
 * of a completed Observable, its value from now on will always be the last
 * emitted value. On the other hand, if any Observable errors, `combineLatest`
 * will error immediately as well, and all other Observables will be unsubscribed.
 *
 * ## Examples
 *
 * Combine two timer Observables
 *
 * ```ts
 * import { timer, combineLatest } from 'rxjs';
 *
 * const firstTimer = timer(0, 1000); // emit 0, 1, 2... after every second, starting from now
 * const secondTimer = timer(500, 1000); // emit 0, 1, 2... after every second, starting 0,5s from now
 * const combinedTimers = combineLatest([firstTimer, secondTimer]);
 * combinedTimers.subscribe(value => console.log(value));
 * // Logs
 * // [0, 0] after 0.5s
 * // [1, 0] after 1s
 * // [1, 1] after 1.5s
 * // [2, 1] after 2s
 * ```
 *
 * Combine a dictionary of Observables
 *
 * ```ts
 * import { of, delay, startWith, combineLatest } from 'rxjs';
 *
 * const observables = {
 *   a: of(1).pipe(delay(1000), startWith(0)),
 *   b: of(5).pipe(delay(5000), startWith(0)),
 *   c: of(10).pipe(delay(10000), startWith(0))
 * };
 * const combined = combineLatest(observables);
 * combined.subscribe(value => console.log(value));
 * // Logs
 * // { a: 0, b: 0, c: 0 } immediately
 * // { a: 1, b: 0, c: 0 } after 1s
 * // { a: 1, b: 5, c: 0 } after 5s
 * // { a: 1, b: 5, c: 10 } after 10s
 * ```
 *
 * Combine an array of Observables
 *
 * ```ts
 * import { of, delay, startWith, combineLatest } from 'rxjs';
 *
 * const observables = [1, 5, 10].map(
 *   n => of(n).pipe(
 *     delay(n * 1000), // emit 0 and then emit n after n seconds
 *     startWith(0)
 *   )
 * );
 * const combined = combineLatest(observables);
 * combined.subscribe(value => console.log(value));
 * // Logs
 * // [0, 0, 0] immediately
 * // [1, 0, 0] after 1s
 * // [1, 5, 0] after 5s
 * // [1, 5, 10] after 10s
 * ```
 *
 * Use map operator to dynamically calculate the Body-Mass Index
 *
 * ```ts
 * import { of, combineLatest, map } from 'rxjs';
 *
 * const weight = of(70, 72, 76, 79, 75);
 * const height = of(1.76, 1.77, 1.78);
 * const bmi = combineLatest([weight, height]).pipe(
 *   map(([w, h]) => w / (h * h)),
 * );
 * bmi.subscribe(x => console.log('BMI is ' + x));
 *
 * // With output to console:
 * // BMI is 24.212293388429753
 * // BMI is 23.93948099205209
 * // BMI is 23.671253629592222
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link merge}
 * @see {@link withLatestFrom}
 *
 * @param args Any number of `ObservableInput`s provided either as an array or as an object
 * to combine with each other. If the last parameter is the function, it will be used to project the
 * values from the combined latest values into a new value on the output Observable.
 * @return An Observable of projected values from the most recent values from each `ObservableInput`,
 * or an array of the most recent values from each `ObservableInput`.
 */
export function combineLatest<O extends ObservableInput<any>, R>(...args: any[]): Observable<R> | Observable<ObservedValueOf<O>[]> {
  const scheduler = popScheduler(args);
  const resultSelector = popResultSelector(args);

  const { args: observables, keys } = argsArgArrayOrObject(args);

  if (observables.length === 0) {
    // If no observables are passed, or someone has passed an empty array
    // of observables, or even an empty object POJO, we need to just
    // complete (EMPTY), but we have to honor the scheduler provided if any.
    return from([], scheduler as any);
  }

  const result = new Observable<ObservedValueOf<O>[]>(
    combineLatestInit(
      observables as ObservableInput<ObservedValueOf<O>>[],
      scheduler,
      keys
        ? // A handler for scrubbing the array of args into a dictionary.
          (values) => createObject(keys, values)
        : // A passthrough to just return the array
          identity
    )
  );

  return resultSelector ? (result.pipe(mapOneOrManyArgs(resultSelector)) as Observable<R>) : result;
}

export function combineLatestInit(
  observables: ObservableInput<any>[],
  scheduler?: SchedulerLike,
  valueTransform: (values: any[]) => any = identity
) {
  return (subscriber: Subscriber<any>) => {
    // The outer subscription. We're capturing this in a function
    // because we may have to schedule it.
    maybeSchedule(
      scheduler,
      () => {
        const { length } = observables;
        // A store for the values each observable has emitted so far. We match observable to value on index.
        const values = new Array(length);
        // The number of currently active subscriptions, as they complete, we decrement this number to see if
        // we are all done combining values, so we can complete the result.
        let active = length;
        // The number of inner sources that still haven't emitted the first value
        // We need to track this because all sources need to emit one value in order
        // to start emitting values.
        let remainingFirstValues = length;
        // The loop to kick off subscription. We're keying everything on index `i` to relate the observables passed
        // in to the slot in the output array or the key in the array of keys in the output dictionary.
        for (let i = 0; i < length; i++) {
          maybeSchedule(
            scheduler,
            () => {
              const source = from(observables[i], scheduler as any);
              let hasFirstValue = false;
              source.subscribe(
                createOperatorSubscriber(
                  subscriber,
                  (value) => {
                    // When we get a value, record it in our set of values.
                    values[i] = value;
                    if (!hasFirstValue) {
                      // If this is our first value, record that.
                      hasFirstValue = true;
                      remainingFirstValues--;
                    }
                    if (!remainingFirstValues) {
                      // We're not waiting for any more
                      // first values, so we can emit!
                      subscriber.next(valueTransform(values.slice()));
                    }
                  },
                  () => {
                    if (!--active) {
                      // We only complete the result if we have no more active
                      // inner observables.
                      subscriber.complete();
                    }
                  }
                )
              );
            },
            subscriber
          );
        }
      },
      subscriber
    );
  };
}

/**
 * A small utility to handle the couple of locations where we want to schedule if a scheduler was provided,
 * but we don't if there was no scheduler.
 */
function maybeSchedule(scheduler: SchedulerLike | undefined, execute: () => void, subscription: Subscription) {
  if (scheduler) {
    executeSchedule(subscription, scheduler, execute);
  } else {
    execute();
  }
}
GxMimport { Observable } from '../Observable';
import { ObservableInputTuple, SchedulerLike } from '../types';
import { concatAll } from '../operators/concatAll';
import { popScheduler } from '../util/args';
import { from } from './from';

export function concat<T extends readonly unknown[]>(...inputs: [...ObservableInputTuple<T>]): Observable<T[number]>;
export function concat<T extends readonly unknown[]>(
  ...inputsAndScheduler: [...ObservableInputTuple<T>, SchedulerLike]
): Observable<T[number]>;

/**
 * Creates an output Observable which sequentially emits all values from the first given
 * Observable and then moves on to the next.
 *
 * <span class="informal">Concatenates multiple Observables together by
 * sequentially emitting their values, one Observable after the other.</span>
 *
 * ![](concat.png)
 *
 * `concat` joins multiple Observables together, by subscribing to them one at a time and
 * merging their results into the output Observable. You can pass either an array of
 * Observables, or put them directly as arguments. Passing an empty array will result
 * in Observable that completes immediately.
 *
 * `concat` will subscribe to first input Observable and emit all its values, without
 * changing or affecting them in any way. When that Observable completes, it will
 * subscribe to then next Observable passed and, again, emit its values. This will be
 * repeated, until the operator runs out of Observables. When last input Observable completes,
 * `concat` will complete as well. At any given moment only one Observable passed to operator
 * emits values. If you would like to emit values from passed Observables concurrently, check out
 * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,
 * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.
 *
 * Note that if some input Observable never completes, `concat` will also never complete
 * and Observables following the one that did not complete will never be subscribed. On the other
 * hand, if some Observable simply completes immediately after it is subscribed, it will be
 * invisible for `concat`, which will just move on to the next Observable.
 *
 * If any Observable in chain errors, instead of passing control to the next Observable,
 * `concat` will error immediately as well. Observables that would be subscribed after
 * the one that emitted error, never will.
 *
 * If you pass to `concat` the same Observable many times, its stream of values
 * will be "replayed" on every subscription, which means you can repeat given Observable
 * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,
 * you can always use {@link repeat}.
 *
 * ## Examples
 *
 * Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10
 *
 * ```ts
 * import { interval, take, range, concat } from 'rxjs';
 *
 * const timer = interval(1000).pipe(take(4));
 * const sequence = range(1, 10);
 * const result = concat(timer, sequence);
 * result.subscribe(x => console.log(x));
 *
 * // results in:
 * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
 * ```
 *
 * Concatenate 3 Observables
 *
 * ```ts
 * import { interval, take, concat } from 'rxjs';
 *
 * const timer1 = interval(1000).pipe(take(10));
 * const timer2 = interval(2000).pipe(take(6));
 * const timer3 = interval(500).pipe(take(10));
 *
 * const result = concat(timer1, timer2, timer3);
 * result.subscribe(x => console.log(x));
 *
 * // results in the following:
 * // (Prints to console sequentially)
 * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
 * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
 * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
 * ```
 *
 * Concatenate the same Observable to repeat it
 *
 * ```ts
 * import { interval, take, concat } from 'rxjs';
 *
 * const timer = interval(1000).pipe(take(2));
 *
 * concat(timer, timer) // concatenating the same Observable!
 *   .subscribe({
 *     next: value => console.log(value),
 *     complete: () => console.log('...and it is done!')
 *   });
 *
 * // Logs:
 * // 0 after 1s
 * // 1 after 2s
 * // 0 after 3s
 * // 1 after 4s
 * // '...and it is done!' also after 4s
 * ```
 *
 * @see {@link concatAll}
 * @see {@link concatMap}
 * @see {@link concatMapTo}
 * @see {@link startWith}
 * @see {@link endWith}
 *
 * @param args `ObservableInput`s to concatenate.
 */
export function concat(...args: any[]): Observable<unknown> {
  return concatAll()(from(args, popScheduler(args)));
}
մx$	import { Connectable, ObservableInput, SubjectLike } from '../types';
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';
import { Observable } from '../Observable';
import { defer } from './defer';

export interface ConnectableConfig<T> {
  /**
   * A factory function used to create the Subject through which the source
   * is multicast. By default this creates a {@link Subject}.
   */
  connector: () => SubjectLike<T>;
  /**
   * If true, the resulting observable will reset internal state upon disconnection
   * and return to a "cold" state. This allows the resulting observable to be
   * reconnected.
   * If false, upon disconnection, the connecting subject will remain the
   * connecting subject, meaning the resulting observable will not go "cold" again,
   * and subsequent repeats or resubscriptions will resubscribe to that same subject.
   */
  resetOnDisconnect?: boolean;
}

/**
 * The default configuration for `connectable`.
 */
const DEFAULT_CONFIG: ConnectableConfig<unknown> = {
  connector: () => new Subject<unknown>(),
  resetOnDisconnect: true,
};

/**
 * Creates an observable that multicasts once `connect()` is called on it.
 *
 * @param source The observable source to make connectable.
 * @param config The configuration object for `connectable`.
 * @returns A "connectable" observable, that has a `connect()` method, that you must call to
 * connect the source to all consumers through the subject provided as the connector.
 */
export function connectable<T>(source: ObservableInput<T>, config: ConnectableConfig<T> = DEFAULT_CONFIG): Connectable<T> {
  // The subscription representing the connection.
  let connection: Subscription | null = null;
  const { connector, resetOnDisconnect = true } = config;
  let subject = connector();

  const result: any = new Observable<T>((subscriber) => {
    return subject.subscribe(subscriber);
  });

  // Define the `connect` function. This is what users must call
  // in order to "connect" the source to the subject that is
  // multicasting it.
  result.connect = () => {
    if (!connection || connection.closed) {
      connection = defer(() => source).subscribe(subject);
      if (resetOnDisconnect) {
        connection.add(() => (subject = connector()));
      }
    }
    return connection;
  };

  return result;
}
aԶximport { Observable } from '../Observable';
import { ObservedValueOf, ObservableInput } from '../types';
import { innerFrom } from './innerFrom';

/**
 * Creates an Observable that, on subscribe, calls an Observable factory to
 * make an Observable for each new Observer.
 *
 * <span class="informal">Creates the Observable lazily, that is, only when it
 * is subscribed.
 * </span>
 *
 * ![](defer.png)
 *
 * `defer` allows you to create an Observable only when the Observer
 * subscribes. It waits until an Observer subscribes to it, calls the given
 * factory function to get an Observable -- where a factory function typically
 * generates a new Observable -- and subscribes the Observer to this Observable.
 * In case the factory function returns a falsy value, then EMPTY is used as
 * Observable instead. Last but not least, an exception during the factory
 * function call is transferred to the Observer by calling `error`.
 *
 * ## Example
 *
 * Subscribe to either an Observable of clicks or an Observable of interval, at random
 *
 * ```ts
 * import { defer, fromEvent, interval } from 'rxjs';
 *
 * const clicksOrInterval = defer(() => {
 *   return Math.random() > 0.5
 *     ? fromEvent(document, 'click')
 *     : interval(1000);
 * });
 * clicksOrInterval.subscribe(x => console.log(x));
 *
 * // Results in the following behavior:
 * // If the result of Math.random() is greater than 0.5 it will listen
 * // for clicks anywhere on the "document"; when document is clicked it
 * // will log a MouseEvent object to the console. If the result is less
 * // than 0.5 it will emit ascending numbers, one every second(1000ms).
 * ```
 *
 * @see {@link Observable}
 *
 * @param observableFactory The Observable factory function to invoke for each
 * Observer that subscribes to the output Observable. May also return any
 * `ObservableInput`, which will be converted on the fly to an Observable.
 * @return An Observable whose Observers' subscriptions trigger an invocation of the
 * given Observable factory function.
 */
export function defer<R extends ObservableInput<any>>(observableFactory: () => R): Observable<ObservedValueOf<R>> {
  return new Observable<ObservedValueOf<R>>((subscriber) => {
    innerFrom(observableFactory()).subscribe(subscriber);
  });
}
3Cx1import { Subject, AnonymousSubject } from '../../Subject';
import { Subscriber } from '../../Subscriber';
import { Observable } from '../../Observable';
import { Subscription } from '../../Subscription';
import { Operator } from '../../Operator';
import { ReplaySubject } from '../../ReplaySubject';
import { Observer, NextObserver } from '../../types';

/**
 * WebSocketSubjectConfig is a plain Object that allows us to make our
 * webSocket configurable.
 *
 * <span class="informal">Provides flexibility to {@link webSocket}</span>
 *
 * It defines a set of properties to provide custom behavior in specific
 * moments of the socket's lifecycle. When the connection opens we can
 * use `openObserver`, when the connection is closed `closeObserver`, if we
 * are interested in listening for data coming from server: `deserializer`,
 * which allows us to customize the deserialization strategy of data before passing it
 * to the socket client. By default, `deserializer` is going to apply `JSON.parse` to each message coming
 * from the Server.
 *
 * ## Examples
 *
 * **deserializer**, the default for this property is `JSON.parse` but since there are just two options
 * for incoming data, either be text or binary data. We can apply a custom deserialization strategy
 * or just simply skip the default behaviour.
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const wsSubject = webSocket({
 *   url: 'ws://localhost:8081',
 *   //Apply any transformation of your choice.
 *   deserializer: ({ data }) => data
 * });
 *
 * wsSubject.subscribe(console.log);
 *
 * // Let's suppose we have this on the Server: ws.send('This is a msg from the server')
 * //output
 * //
 * // This is a msg from the server
 * ```
 *
 * **serializer** allows us to apply custom serialization strategy but for the outgoing messages.
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const wsSubject = webSocket({
 *   url: 'ws://localhost:8081',
 *   // Apply any transformation of your choice.
 *   serializer: msg => JSON.stringify({ channel: 'webDevelopment', msg: msg })
 * });
 *
 * wsSubject.subscribe(() => subject.next('msg to the server'));
 *
 * // Let's suppose we have this on the Server:
 * //   ws.on('message', msg => console.log);
 * //   ws.send('This is a msg from the server');
 * // output at server side:
 * //
 * // {"channel":"webDevelopment","msg":"msg to the server"}
 * ```
 *
 * **closeObserver** allows us to set a custom error when an error raises up.
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const wsSubject = webSocket({
 *   url: 'ws://localhost:8081',
 *   closeObserver: {
 *     next() {
 *       const customError = { code: 6666, reason: 'Custom evil reason' }
 *       console.log(`code: ${ customError.code }, reason: ${ customError.reason }`);
 *     }
 *   }
 * });
 *
 * // output
 * // code: 6666, reason: Custom evil reason
 * ```
 *
 * **openObserver**, Let's say we need to make some kind of init task before sending/receiving msgs to the
 * webSocket or sending notification that the connection was successful, this is when
 * openObserver is useful for.
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const wsSubject = webSocket({
 *   url: 'ws://localhost:8081',
 *   openObserver: {
 *     next: () => {
 *       console.log('Connection ok');
 *     }
 *   }
 * });
 *
 * // output
 * // Connection ok
 * ```
 */
export interface WebSocketSubjectConfig<T> {
  /** The url of the socket server to connect to */
  url: string;
  /** The protocol to use to connect */
  protocol?: string | Array<string>;
  /** @deprecated Will be removed in v8. Use {@link deserializer} instead. */
  resultSelector?: (e: MessageEvent) => T;
  /**
   * A serializer used to create messages from passed values before the
   * messages are sent to the server. Defaults to JSON.stringify.
   */
  serializer?: (value: T) => WebSocketMessage;
  /**
   * A deserializer used for messages arriving on the socket from the
   * server. Defaults to JSON.parse.
   */
  deserializer?: (e: MessageEvent) => T;
  /**
   * An Observer that watches when open events occur on the underlying web socket.
   */
  openObserver?: NextObserver<Event>;
  /**
   * An Observer that watches when close events occur on the underlying web socket
   */
  closeObserver?: NextObserver<CloseEvent>;
  /**
   * An Observer that watches when a close is about to occur due to
   * unsubscription.
   */
  closingObserver?: NextObserver<void>;
  /**
   * A WebSocket constructor to use. This is useful for situations like using a
   * WebSocket impl in Node (WebSocket is a DOM API), or for mocking a WebSocket
   * for testing purposes
   */
  WebSocketCtor?: { new (url: string, protocols?: string | string[]): WebSocket };
  /** Sets the `binaryType` property of the underlying WebSocket. */
  binaryType?: 'blob' | 'arraybuffer';
}

const DEFAULT_WEBSOCKET_CONFIG: WebSocketSubjectConfig<any> = {
  url: '',
  deserializer: (e: MessageEvent) => JSON.parse(e.data),
  serializer: (value: any) => JSON.stringify(value),
};

const WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT =
  'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';

export type WebSocketMessage = string | ArrayBuffer | Blob | ArrayBufferView;

export class WebSocketSubject<T> extends AnonymousSubject<T> {
  // @ts-ignore: Property has no initializer and is not definitely assigned
  private _config: WebSocketSubjectConfig<T>;

  /** @internal */
  // @ts-ignore: Property has no initializer and is not definitely assigned
  _output: Subject<T>;

  private _socket: WebSocket | null = null;

  constructor(urlConfigOrSource: string | WebSocketSubjectConfig<T> | Observable<T>, destination?: Observer<T>) {
    super();
    if (urlConfigOrSource instanceof Observable) {
      this.destination = destination;
      this.source = urlConfigOrSource as Observable<T>;
    } else {
      const config = (this._config = { ...DEFAULT_WEBSOCKET_CONFIG });
      this._output = new Subject<T>();
      if (typeof urlConfigOrSource === 'string') {
        config.url = urlConfigOrSource;
      } else {
        for (const key in urlConfigOrSource) {
          if (urlConfigOrSource.hasOwnProperty(key)) {
            (config as any)[key] = (urlConfigOrSource as any)[key];
          }
        }
      }

      if (!config.WebSocketCtor && WebSocket) {
        config.WebSocketCtor = WebSocket;
      } else if (!config.WebSocketCtor) {
        throw new Error('no WebSocket constructor can be found');
      }
      this.destination = new ReplaySubject();
    }
  }

  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  lift<R>(operator: Operator<T, R>): WebSocketSubject<R> {
    const sock = new WebSocketSubject<R>(this._config as WebSocketSubjectConfig<any>, this.destination as any);
    sock.operator = operator;
    sock.source = this;
    return sock;
  }

  private _resetState() {
    this._socket = null;
    if (!this.source) {
      this.destination = new ReplaySubject();
    }
    this._output = new Subject<T>();
  }

  /**
   * Creates an {@link Observable}, that when subscribed to, sends a message,
   * defined by the `subMsg` function, to the server over the socket to begin a
   * subscription to data over that socket. Once data arrives, the
   * `messageFilter` argument will be used to select the appropriate data for
   * the resulting Observable. When finalization occurs, either due to
   * unsubscription, completion, or error, a message defined by the `unsubMsg`
   * argument will be sent to the server over the WebSocketSubject.
   *
   * @param subMsg A function to generate the subscription message to be sent to
   * the server. This will still be processed by the serializer in the
   * WebSocketSubject's config. (Which defaults to JSON serialization)
   * @param unsubMsg A function to generate the unsubscription message to be
   * sent to the server at finalization. This will still be processed by the
   * serializer in the WebSocketSubject's config.
   * @param messageFilter A predicate for selecting the appropriate messages
   * from the server for the output stream.
   */
  multiplex(subMsg: () => any, unsubMsg: () => any, messageFilter: (value: T) => boolean) {
    const self = this;
    return new Observable((observer: Observer<T>) => {
      try {
        self.next(subMsg());
      } catch (err) {
        observer.error(err);
      }

      const subscription = self.subscribe({
        next: (x) => {
          try {
            if (messageFilter(x)) {
              observer.next(x);
            }
          } catch (err) {
            observer.error(err);
          }
        },
        error: (err) => observer.error(err),
        complete: () => observer.complete(),
      });

      return () => {
        try {
          self.next(unsubMsg());
        } catch (err) {
          observer.error(err);
        }
        subscription.unsubscribe();
      };
    });
  }

  private _connectSocket() {
    const { WebSocketCtor, protocol, url, binaryType } = this._config;
    const observer = this._output;

    let socket: WebSocket | null = null;
    try {
      socket = protocol ? new WebSocketCtor!(url, protocol) : new WebSocketCtor!(url);
      this._socket = socket;
      if (binaryType) {
        this._socket.binaryType = binaryType;
      }
    } catch (e) {
      observer.error(e);
      return;
    }

    const subscription = new Subscription(() => {
      this._socket = null;
      if (socket && socket.readyState === 1) {
        socket.close();
      }
    });

    socket.onopen = (evt: Event) => {
      const { _socket } = this;
      if (!_socket) {
        socket!.close();
        this._resetState();
        return;
      }
      const { openObserver } = this._config;
      if (openObserver) {
        openObserver.next(evt);
      }

      const queue = this.destination;

      this.destination = Subscriber.create<T>(
        (x) => {
          if (socket!.readyState === 1) {
            try {
              const { serializer } = this._config;
              socket!.send(serializer!(x!));
            } catch (e) {
              this.destination!.error(e);
            }
          }
        },
        (err) => {
          const { closingObserver } = this._config;
          if (closingObserver) {
            closingObserver.next(undefined);
          }
          if (err && err.code) {
            socket!.close(err.code, err.reason);
          } else {
            observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
          }
          this._resetState();
        },
        () => {
          const { closingObserver } = this._config;
          if (closingObserver) {
            closingObserver.next(undefined);
          }
          socket!.close();
          this._resetState();
        }
      ) as Subscriber<any>;

      if (queue && queue instanceof ReplaySubject) {
        subscription.add((queue as ReplaySubject<T>).subscribe(this.destination));
      }
    };

    socket.onerror = (e: Event) => {
      this._resetState();
      observer.error(e);
    };

    socket.onclose = (e: CloseEvent) => {
      if (socket === this._socket) {
        this._resetState();
      }
      const { closeObserver } = this._config;
      if (closeObserver) {
        closeObserver.next(e);
      }
      if (e.wasClean) {
        observer.complete();
      } else {
        observer.error(e);
      }
    };

    socket.onmessage = (e: MessageEvent) => {
      try {
        const { deserializer } = this._config;
        observer.next(deserializer!(e));
      } catch (err) {
        observer.error(err);
      }
    };
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    const { source } = this;
    if (source) {
      return source.subscribe(subscriber);
    }
    if (!this._socket) {
      this._connectSocket();
    }
    this._output.subscribe(subscriber);
    subscriber.add(() => {
      const { _socket } = this;
      if (this._output.observers.length === 0) {
        if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
          _socket.close();
        }
        this._resetState();
      }
    });
    return subscriber;
  }

  unsubscribe() {
    const { _socket } = this;
    if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
      _socket.close();
    }
    this._resetState();
    super.unsubscribe();
  }
}
unOximport { Observable } from '../../Observable';
import { TimestampProvider } from '../../types';
import { performanceTimestampProvider } from '../../scheduler/performanceTimestampProvider';
import { animationFrameProvider } from '../../scheduler/animationFrameProvider';

/**
 * An observable of animation frames
 *
 * Emits the amount of time elapsed since subscription and the timestamp on each animation frame.
 * Defaults to milliseconds provided to the requestAnimationFrame's callback. Does not end on its own.
 *
 * Every subscription will start a separate animation loop. Since animation frames are always scheduled
 * by the browser to occur directly before a repaint, scheduling more than one animation frame synchronously
 * should not be much different or have more overhead than looping over an array of events during
 * a single animation frame. However, if for some reason the developer would like to ensure the
 * execution of animation-related handlers are all executed during the same task by the engine,
 * the `share` operator can be used.
 *
 * This is useful for setting up animations with RxJS.
 *
 * ## Examples
 *
 * Tweening a div to move it on the screen
 *
 * ```ts
 * import { animationFrames, map, takeWhile, endWith } from 'rxjs';
 *
 * function tween(start: number, end: number, duration: number) {
 *   const diff = end - start;
 *   return animationFrames().pipe(
 *     // Figure out what percentage of time has passed
 *     map(({ elapsed }) => elapsed / duration),
 *     // Take the vector while less than 100%
 *     takeWhile(v => v < 1),
 *     // Finish with 100%
 *     endWith(1),
 *     // Calculate the distance traveled between start and end
 *     map(v => v * diff + start)
 *   );
 * }
 *
 * // Setup a div for us to move around
 * const div = document.createElement('div');
 * document.body.appendChild(div);
 * div.style.position = 'absolute';
 * div.style.width = '40px';
 * div.style.height = '40px';
 * div.style.backgroundColor = 'lime';
 * div.style.transform = 'translate3d(10px, 0, 0)';
 *
 * tween(10, 200, 4000).subscribe(x => {
 *   div.style.transform = `translate3d(${ x }px, 0, 0)`;
 * });
 * ```
 *
 * Providing a custom timestamp provider
 *
 * ```ts
 * import { animationFrames, TimestampProvider } from 'rxjs';
 *
 * // A custom timestamp provider
 * let now = 0;
 * const customTSProvider: TimestampProvider = {
 *   now() { return now++; }
 * };
 *
 * const source$ = animationFrames(customTSProvider);
 *
 * // Log increasing numbers 0...1...2... on every animation frame.
 * source$.subscribe(({ elapsed }) => console.log(elapsed));
 * ```
 *
 * @param timestampProvider An object with a `now` method that provides a numeric timestamp
 */
export function animationFrames(timestampProvider?: TimestampProvider) {
  return timestampProvider ? animationFramesFactory(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
}

/**
 * Does the work of creating the observable for `animationFrames`.
 * @param timestampProvider The timestamp provider to use to create the observable
 */
function animationFramesFactory(timestampProvider?: TimestampProvider) {
  return new Observable<{ timestamp: number; elapsed: number }>((subscriber) => {
    // If no timestamp provider is specified, use performance.now() - as it
    // will return timestamps 'compatible' with those passed to the run
    // callback and won't be affected by NTP adjustments, etc.
    const provider = timestampProvider || performanceTimestampProvider;

    // Capture the start time upon subscription, as the run callback can remain
    // queued for a considerable period of time and the elapsed time should
    // represent the time elapsed since subscription - not the time since the
    // first rendered animation frame.
    const start = provider.now();

    let id = 0;
    const run = () => {
      if (!subscriber.closed) {
        id = animationFrameProvider.requestAnimationFrame((timestamp: DOMHighResTimeStamp | number) => {
          id = 0;
          // Use the provider's timestamp to calculate the elapsed time. Note that
          // this means - if the caller hasn't passed a provider - that
          // performance.now() will be used instead of the timestamp that was
          // passed to the run callback. The reason for this is that the timestamp
          // passed to the callback can be earlier than the start time, as it
          // represents the time at which the browser decided it would render any
          // queued frames - and that time can be earlier the captured start time.
          const now = provider.now();
          subscriber.next({
            timestamp: timestampProvider ? now : timestamp,
            elapsed: now - start,
          });
          run();
        });
      }
    };

    run();

    return () => {
      if (id) {
        animationFrameProvider.cancelAnimationFrame(id);
      }
    };
  });
}

/**
 * In the common case, where the timestamp provided by the rAF API is used,
 * we use this shared observable to reduce overhead.
 */
const DEFAULT_ANIMATION_FRAMES = animationFramesFactory();
x1import { createOperatorSubscriber } from '../../operators/OperatorSubscriber';
import { Observable } from '../../Observable';
import { innerFrom } from '../../observable/innerFrom';
import { ObservableInput } from '../../types';

export function fromFetch<T>(
  input: string | Request,
  init: RequestInit & {
    selector: (response: Response) => ObservableInput<T>;
  }
): Observable<T>;

export function fromFetch(input: string | Request, init?: RequestInit): Observable<Response>;

/**
 * Uses [the Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) to
 * make an HTTP request.
 *
 * **WARNING** Parts of the fetch API are still experimental. `AbortController` is
 * required for this implementation to work and use cancellation appropriately.
 *
 * Will automatically set up an internal [AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController)
 * in order to finalize the internal `fetch` when the subscription tears down.
 *
 * If a `signal` is provided via the `init` argument, it will behave like it usually does with
 * `fetch`. If the provided `signal` aborts, the error that `fetch` normally rejects with
 * in that scenario will be emitted as an error from the observable.
 *
 * ## Examples
 *
 * Basic use
 *
 * ```ts
 * import { fromFetch } from 'rxjs/fetch';
 * import { switchMap, of, catchError } from 'rxjs';
 *
 * const data$ = fromFetch('https://api.github.com/users?per_page=5').pipe(
 *   switchMap(response => {
 *     if (response.ok) {
 *       // OK return data
 *       return response.json();
 *     } else {
 *       // Server is returning a status requiring the client to try something else.
 *       return of({ error: true, message: `Error ${ response.status }` });
 *     }
 *   }),
 *   catchError(err => {
 *     // Network or other error, handle appropriately
 *     console.error(err);
 *     return of({ error: true, message: err.message })
 *   })
 * );
 *
 * data$.subscribe({
 *   next: result => console.log(result),
 *   complete: () => console.log('done')
 * });
 * ```
 *
 * ### Use with Chunked Transfer Encoding
 *
 * With HTTP responses that use [chunked transfer encoding](https://tools.ietf.org/html/rfc7230#section-3.3.1),
 * the promise returned by `fetch` will resolve as soon as the response's headers are
 * received.
 *
 * That means the `fromFetch` observable will emit a `Response` - and will
 * then complete - before the body is received. When one of the methods on the
 * `Response` - like `text()` or `json()` - is called, the returned promise will not
 * resolve until the entire body has been received. Unsubscribing from any observable
 * that uses the promise as an observable input will not abort the request.
 *
 * To facilitate aborting the retrieval of responses that use chunked transfer encoding,
 * a `selector` can be specified via the `init` parameter:
 *
 * ```ts
 * import { of } from 'rxjs';
 * import { fromFetch } from 'rxjs/fetch';
 *
 * const data$ = fromFetch('https://api.github.com/users?per_page=5', {
 *   selector: response => response.json()
 * });
 *
 * data$.subscribe({
 *   next: result => console.log(result),
 *   complete: () => console.log('done')
 * });
 * ```
 *
 * @param input The resource you would like to fetch. Can be a url or a request object.
 * @param initWithSelector A configuration object for the fetch.
 * [See MDN for more details](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
 * @returns An Observable, that when subscribed to, performs an HTTP request using the native `fetch`
 * function. The {@link Subscription} is tied to an `AbortController` for the fetch.
 */
export function fromFetch<T>(
  input: string | Request,
  initWithSelector: RequestInit & {
    selector?: (response: Response) => ObservableInput<T>;
  } = {}
): Observable<Response | T> {
  const { selector, ...init } = initWithSelector;
  return new Observable<Response | T>((subscriber) => {
    // Our controller for aborting this fetch.
    // Any externally provided AbortSignal will have to call
    // abort on this controller when signaled, because the
    // signal from this controller is what is being passed to `fetch`.
    const controller = new AbortController();
    const { signal } = controller;
    // This flag exists to make sure we don't `abort()` the fetch upon tearing down
    // this observable after emitting a Response. Aborting in such circumstances
    // would also abort subsequent methods - like `json()` - that could be called
    // on the Response. Consider: `fromFetch().pipe(take(1), mergeMap(res => res.json()))`
    let abortable = true;

    // If the user provided an init configuration object,
    // let's process it and chain our abort signals, if necessary.
    // If a signal is provided, just have it finalized. It's a cancellation token, basically.
    const { signal: outerSignal } = init;
    if (outerSignal) {
      if (outerSignal.aborted) {
        controller.abort();
      } else {
        // We got an AbortSignal from the arguments passed into `fromFetch`.
        // We need to wire up our AbortController to abort when this signal aborts.
        const outerSignalHandler = () => {
          if (!signal.aborted) {
            controller.abort();
          }
        };
        outerSignal.addEventListener('abort', outerSignalHandler);
        subscriber.add(() => outerSignal.removeEventListener('abort', outerSignalHandler));
      }
    }

    // The initialization object passed to `fetch` as the second
    // argument. This ferries in important information, including our
    // AbortSignal. Create a new init, so we don't accidentally mutate the
    // passed init, or reassign it. This is because the init passed in
    // is shared between each subscription to the result.
    const perSubscriberInit: RequestInit = { ...init, signal };

    const handleError = (err: any) => {
      abortable = false;
      subscriber.error(err);
    };

    fetch(input, perSubscriberInit)
      .then((response) => {
        if (selector) {
          // If we have a selector function, use it to project our response.
          // Note that any error that comes from our selector will be
          // sent to the promise `catch` below and handled.
          innerFrom(selector(response)).subscribe(
            createOperatorSubscriber(
              subscriber,
              // Values are passed through to the subscriber
              undefined,
              // The projected response is complete.
              () => {
                abortable = false;
                subscriber.complete();
              },
              handleError
            )
          );
        } else {
          abortable = false;
          subscriber.next(response);
          subscriber.complete();
        }
      })
      .catch(handleError);

    return () => {
      if (abortable) {
        controller.abort();
      }
    };
  });
}
͓x'dimport { WebSocketSubject, WebSocketSubjectConfig } from './WebSocketSubject';

/**
 * Wrapper around the w3c-compatible WebSocket object provided by the browser.
 *
 * <span class="informal">{@link Subject} that communicates with a server via WebSocket</span>
 *
 * `webSocket` is a factory function that produces a `WebSocketSubject`,
 * which can be used to make WebSocket connection with an arbitrary endpoint.
 * `webSocket` accepts as an argument either a string with url of WebSocket endpoint, or an
 * {@link WebSocketSubjectConfig} object for providing additional configuration, as
 * well as Observers for tracking lifecycle of WebSocket connection.
 *
 * When `WebSocketSubject` is subscribed, it attempts to make a socket connection,
 * unless there is one made already. This means that many subscribers will always listen
 * on the same socket, thus saving resources. If however, two instances are made of `WebSocketSubject`,
 * even if these two were provided with the same url, they will attempt to make separate
 * connections. When consumer of a `WebSocketSubject` unsubscribes, socket connection is closed,
 * only if there are no more subscribers still listening. If after some time a consumer starts
 * subscribing again, connection is reestablished.
 *
 * Once connection is made, whenever a new message comes from the server, `WebSocketSubject` will emit that
 * message as a value in the stream. By default, a message from the socket is parsed via `JSON.parse`. If you
 * want to customize how deserialization is handled (if at all), you can provide custom `resultSelector`
 * function in {@link WebSocketSubject}. When connection closes, stream will complete, provided it happened without
 * any errors. If at any point (starting, maintaining or closing a connection) there is an error,
 * stream will also error with whatever WebSocket API has thrown.
 *
 * By virtue of being a {@link Subject}, `WebSocketSubject` allows for receiving and sending messages from the server. In order
 * to communicate with a connected endpoint, use `next`, `error` and `complete` methods. `next` sends a value to the server, so bear in mind
 * that this value will not be serialized beforehand. Because of This, `JSON.stringify` will have to be called on a value by hand,
 * before calling `next` with a result. Note also that if at the moment of nexting value
 * there is no socket connection (for example no one is subscribing), those values will be buffered, and sent when connection
 * is finally established. `complete` method closes socket connection. `error` does the same,
 * as well as notifying the server that something went wrong via status code and string with details of what happened.
 * Since status code is required in WebSocket API, `WebSocketSubject` does not allow, like regular `Subject`,
 * arbitrary values being passed to the `error` method. It needs to be called with an object that has `code`
 * property with status code number and optional `reason` property with string describing details
 * of an error.
 *
 * Calling `next` does not affect subscribers of `WebSocketSubject` - they have no
 * information that something was sent to the server (unless of course the server
 * responds somehow to a message). On the other hand, since calling `complete` triggers
 * an attempt to close socket connection. If that connection is closed without any errors, stream will
 * complete, thus notifying all subscribers. And since calling `error` closes
 * socket connection as well, just with a different status code for the server, if closing itself proceeds
 * without errors, subscribed Observable will not error, as one might expect, but complete as usual. In both cases
 * (calling `complete` or `error`), if process of closing socket connection results in some errors, *then* stream
 * will error.
 *
 * **Multiplexing**
 *
 * `WebSocketSubject` has an additional operator, not found in other Subjects. It is called `multiplex` and it is
 * used to simulate opening several socket connections, while in reality maintaining only one.
 * For example, an application has both chat panel and real-time notifications about sport news. Since these are two distinct functions,
 * it would make sense to have two separate connections for each. Perhaps there could even be two separate services with WebSocket
 * endpoints, running on separate machines with only GUI combining them together. Having a socket connection
 * for each functionality could become too resource expensive. It is a common pattern to have single
 * WebSocket endpoint that acts as a gateway for the other services (in this case chat and sport news services).
 * Even though there is a single connection in a client app, having the ability to manipulate streams as if it
 * were two separate sockets is desirable. This eliminates manually registering and unregistering in a gateway for
 * given service and filter out messages of interest. This is exactly what `multiplex` method is for.
 *
 * Method accepts three parameters. First two are functions returning subscription and unsubscription messages
 * respectively. These are messages that will be sent to the server, whenever consumer of resulting Observable
 * subscribes and unsubscribes. Server can use them to verify that some kind of messages should start or stop
 * being forwarded to the client. In case of the above example application, after getting subscription message with proper identifier,
 * gateway server can decide that it should connect to real sport news service and start forwarding messages from it.
 * Note that both messages will be sent as returned by the functions, they are by default serialized using JSON.stringify, just
 * as messages pushed via `next`. Also bear in mind that these messages will be sent on *every* subscription and
 * unsubscription. This is potentially dangerous, because one consumer of an Observable may unsubscribe and the server
 * might stop sending messages, since it got unsubscription message. This needs to be handled
 * on the server or using {@link publish} on a Observable returned from 'multiplex'.
 *
 * Last argument to `multiplex` is a `messageFilter` function which should return a boolean. It is used to filter out messages
 * sent by the server to only those that belong to simulated WebSocket stream. For example, server might mark these
 * messages with some kind of string identifier on a message object and `messageFilter` would return `true`
 * if there is such identifier on an object emitted by the socket. Messages which returns `false` in `messageFilter` are simply skipped,
 * and are not passed down the stream.
 *
 * Return value of `multiplex` is an Observable with messages incoming from emulated socket connection. Note that this
 * is not a `WebSocketSubject`, so calling `next` or `multiplex` again will fail. For pushing values to the
 * server, use root `WebSocketSubject`.
 *
 * ## Examples
 *
 * Listening for messages from the server
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const subject = webSocket('ws://localhost:8081');
 *
 * subject.subscribe({
 *   next: msg => console.log('message received: ' + msg), // Called whenever there is a message from the server.
 *   error: err => console.log(err), // Called if at any point WebSocket API signals some kind of error.
 *   complete: () => console.log('complete') // Called when connection is closed (for whatever reason).
 *  });
 * ```
 *
 * Pushing messages to the server
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const subject = webSocket('ws://localhost:8081');
 *
 * subject.subscribe();
 * // Note that at least one consumer has to subscribe to the created subject - otherwise "nexted" values will be just buffered and not sent,
 * // since no connection was established!
 *
 * subject.next({ message: 'some message' });
 * // This will send a message to the server once a connection is made. Remember value is serialized with JSON.stringify by default!
 *
 * subject.complete(); // Closes the connection.
 *
 * subject.error({ code: 4000, reason: 'I think our app just broke!' });
 * // Also closes the connection, but let's the server know that this closing is caused by some error.
 * ```
 *
 * Multiplexing WebSocket
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const subject = webSocket('ws://localhost:8081');
 *
 * const observableA = subject.multiplex(
 *   () => ({ subscribe: 'A' }), // When server gets this message, it will start sending messages for 'A'...
 *   () => ({ unsubscribe: 'A' }), // ...and when gets this one, it will stop.
 *   message => message.type === 'A' // If the function returns `true` message is passed down the stream. Skipped if the function returns false.
 * );
 *
 * const observableB = subject.multiplex( // And the same goes for 'B'.
 *   () => ({ subscribe: 'B' }),
 *   () => ({ unsubscribe: 'B' }),
 *   message => message.type === 'B'
 * );
 *
 * const subA = observableA.subscribe(messageForA => console.log(messageForA));
 * // At this moment WebSocket connection is established. Server gets '{"subscribe": "A"}' message and starts sending messages for 'A',
 * // which we log here.
 *
 * const subB = observableB.subscribe(messageForB => console.log(messageForB));
 * // Since we already have a connection, we just send '{"subscribe": "B"}' message to the server. It starts sending messages for 'B',
 * // which we log here.
 *
 * subB.unsubscribe();
 * // Message '{"unsubscribe": "B"}' is sent to the server, which stops sending 'B' messages.
 *
 * subA.unsubscribe();
 * // Message '{"unsubscribe": "A"}' makes the server stop sending messages for 'A'. Since there is no more subscribers to root Subject,
 * // socket connection closes.
 * ```
 *
 * @param urlConfigOrSource The WebSocket endpoint as an url or an object with configuration and additional Observers.
 * @return Subject which allows to both send and receive messages via WebSocket connection.
 */
export function webSocket<T>(urlConfigOrSource: string | WebSocketSubjectConfig<T>): WebSocketSubject<T> {
  return new WebSocketSubject<T>(urlConfigOrSource);
}
1̒xLimport { Observable } from '../Observable';
import { SchedulerLike } from '../types';

/**
 * A simple Observable that emits no items to the Observer and immediately
 * emits a complete notification.
 *
 * <span class="informal">Just emits 'complete', and nothing else.</span>
 *
 * ![](empty.png)
 *
 * A simple Observable that only emits the complete notification. It can be used
 * for composing with other Observables, such as in a {@link mergeMap}.
 *
 * ## Examples
 *
 * Log complete notification
 *
 * ```ts
 * import { EMPTY } from 'rxjs';
 *
 * EMPTY.subscribe({
 *   next: () => console.log('Next'),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Outputs
 * // Complete!
 * ```
 *
 * Emit the number 7, then complete
 *
 * ```ts
 * import { EMPTY, startWith } from 'rxjs';
 *
 * const result = EMPTY.pipe(startWith(7));
 * result.subscribe(x => console.log(x));
 *
 * // Outputs
 * // 7
 * ```
 *
 * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`
 *
 * ```ts
 * import { interval, mergeMap, of, EMPTY } from 'rxjs';
 *
 * const interval$ = interval(1000);
 * const result = interval$.pipe(
 *   mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),
 * );
 * result.subscribe(x => console.log(x));
 *
 * // Results in the following to the console:
 * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)
 * // x will occur every 1000ms
 * // if x % 2 is equal to 1, print a, b, c (each on its own)
 * // if x % 2 is not equal to 1, nothing will be output
 * ```
 *
 * @see {@link Observable}
 * @see {@link NEVER}
 * @see {@link of}
 * @see {@link throwError}
 */
export const EMPTY = new Observable<never>((subscriber) => subscriber.complete());

/**
 * @param scheduler A {@link SchedulerLike} to use for scheduling
 * the emission of the complete notification.
 * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.
 */
export function empty(scheduler?: SchedulerLike) {
  return scheduler ? emptyScheduled(scheduler) : EMPTY;
}

function emptyScheduled(scheduler: SchedulerLike) {
  return new Observable<never>((subscriber) => scheduler.schedule(() => subscriber.complete()));
}
eJxWimport { Observable } from '../Observable';
import { ObservedValueOf, ObservableInputTuple, ObservableInput } from '../types';
import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';
import { innerFrom } from './innerFrom';
import { popResultSelector } from '../util/args';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { createObject } from '../util/createObject';
import { AnyCatcher } from '../AnyCatcher';

// forkJoin(any)
// We put this first because we need to catch cases where the user has supplied
// _exactly `any`_ as the argument. Since `any` literally matches _anything_,
// we don't want it to randomly hit one of the other type signatures below,
// as we have no idea at build-time what type we should be returning when given an any.

/**
 * You have passed `any` here, we can't figure out if it is
 * an array or an object, so you're getting `unknown`. Use better types.
 * @param arg Something typed as `any`
 */
export function forkJoin<T extends AnyCatcher>(arg: T): Observable<unknown>;

// forkJoin(null | undefined)
export function forkJoin(scheduler: null | undefined): Observable<never>;

// forkJoin([a, b, c])
export function forkJoin(sources: readonly []): Observable<never>;
export function forkJoin<A extends readonly unknown[]>(sources: readonly [...ObservableInputTuple<A>]): Observable<A>;
export function forkJoin<A extends readonly unknown[], R>(
  sources: readonly [...ObservableInputTuple<A>],
  resultSelector: (...values: A) => R
): Observable<R>;

// forkJoin(a, b, c)
/** @deprecated Pass an array of sources instead. The rest-parameters signature will be removed in v8. Details: https://rxjs.dev/deprecations/array-argument */
export function forkJoin<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A>;
/** @deprecated Pass an array of sources instead. The rest-parameters signature will be removed in v8. Details: https://rxjs.dev/deprecations/array-argument */
export function forkJoin<A extends readonly unknown[], R>(
  ...sourcesAndResultSelector: [...ObservableInputTuple<A>, (...values: A) => R]
): Observable<R>;

// forkJoin({a, b, c})
export function forkJoin(sourcesObject: { [K in any]: never }): Observable<never>;
export function forkJoin<T extends Record<string, ObservableInput<any>>>(
  sourcesObject: T
): Observable<{ [K in keyof T]: ObservedValueOf<T[K]> }>;

/**
 * Accepts an `Array` of {@link ObservableInput} or a dictionary `Object` of {@link ObservableInput} and returns
 * an {@link Observable} that emits either an array of values in the exact same order as the passed array,
 * or a dictionary of values in the same shape as the passed dictionary.
 *
 * <span class="informal">Wait for Observables to complete and then combine last values they emitted;
 * complete immediately if an empty array is passed.</span>
 *
 * ![](forkJoin.png)
 *
 * `forkJoin` is an operator that takes any number of input observables which can be passed either as an array
 * or a dictionary of input observables. If no input observables are provided (e.g. an empty array is passed),
 * then the resulting stream will complete immediately.
 *
 * `forkJoin` will wait for all passed observables to emit and complete and then it will emit an array or an object with last
 * values from corresponding observables.
 *
 * If you pass an array of `n` observables to the operator, then the resulting
 * array will have `n` values, where the first value is the last one emitted by the first observable,
 * second value is the last one emitted by the second observable and so on.
 *
 * If you pass a dictionary of observables to the operator, then the resulting
 * objects will have the same keys as the dictionary passed, with their last values they have emitted
 * located at the corresponding key.
 *
 * That means `forkJoin` will not emit more than once and it will complete after that. If you need to emit combined
 * values not only at the end of the lifecycle of passed observables, but also throughout it, try out {@link combineLatest}
 * or {@link zip} instead.
 *
 * In order for the resulting array to have the same length as the number of input observables, whenever any of
 * the given observables completes without emitting any value, `forkJoin` will complete at that moment as well
 * and it will not emit anything either, even if it already has some last values from other observables.
 * Conversely, if there is an observable that never completes, `forkJoin` will never complete either,
 * unless at any point some other observable completes without emitting a value, which brings us back to
 * the previous case. Overall, in order for `forkJoin` to emit a value, all given observables
 * have to emit something at least once and complete.
 *
 * If any given observable errors at some point, `forkJoin` will error as well and immediately unsubscribe
 * from the other observables.
 *
 * Optionally `forkJoin` accepts a `resultSelector` function, that will be called with values which normally
 * would land in the emitted array. Whatever is returned by the `resultSelector`, will appear in the output
 * observable instead. This means that the default `resultSelector` can be thought of as a function that takes
 * all its arguments and puts them into an array. Note that the `resultSelector` will be called only
 * when `forkJoin` is supposed to emit a result.
 *
 * ## Examples
 *
 * Use `forkJoin` with a dictionary of observable inputs
 *
 * ```ts
 * import { forkJoin, of, timer } from 'rxjs';
 *
 * const observable = forkJoin({
 *   foo: of(1, 2, 3, 4),
 *   bar: Promise.resolve(8),
 *   baz: timer(4000)
 * });
 * observable.subscribe({
 *  next: value => console.log(value),
 *  complete: () => console.log('This is how it ends!'),
 * });
 *
 * // Logs:
 * // { foo: 4, bar: 8, baz: 0 } after 4 seconds
 * // 'This is how it ends!' immediately after
 * ```
 *
 * Use `forkJoin` with an array of observable inputs
 *
 * ```ts
 * import { forkJoin, of, timer } from 'rxjs';
 *
 * const observable = forkJoin([
 *   of(1, 2, 3, 4),
 *   Promise.resolve(8),
 *   timer(4000)
 * ]);
 * observable.subscribe({
 *  next: value => console.log(value),
 *  complete: () => console.log('This is how it ends!'),
 * });
 *
 * // Logs:
 * // [4, 8, 0] after 4 seconds
 * // 'This is how it ends!' immediately after
 * ```
 *
 * @see {@link combineLatest}
 * @see {@link zip}
 *
 * @param args Any number of `ObservableInput`s provided either as an array, as an object
 * or as arguments passed directly to the operator.
 * @return Observable emitting either an array of last values emitted by passed Observables
 * or value from project function.
 */
export function forkJoin(...args: any[]): Observable<any> {
  const resultSelector = popResultSelector(args);
  const { args: sources, keys } = argsArgArrayOrObject(args);
  const result = new Observable((subscriber) => {
    const { length } = sources;
    if (!length) {
      subscriber.complete();
      return;
    }
    const values = new Array(length);
    let remainingCompletions = length;
    let remainingEmissions = length;
    for (let sourceIndex = 0; sourceIndex < length; sourceIndex++) {
      let hasValue = false;
      innerFrom(sources[sourceIndex]).subscribe(
        createOperatorSubscriber(
          subscriber,
          (value) => {
            if (!hasValue) {
              hasValue = true;
              remainingEmissions--;
            }
            values[sourceIndex] = value;
          },
          () => remainingCompletions--,
          undefined,
          () => {
            if (!remainingCompletions || !hasValue) {
              if (!remainingEmissions) {
                subscriber.next(keys ? createObject(keys, values) : values);
              }
              subscriber.complete();
            }
          }
        )
      );
    }
  });
  return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
}
!_ x,import { Observable } from '../Observable';
import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';
import { scheduled } from '../scheduled/scheduled';
import { innerFrom } from './innerFrom';

export function from<O extends ObservableInput<any>>(input: O): Observable<ObservedValueOf<O>>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function from<O extends ObservableInput<any>>(input: O, scheduler: SchedulerLike | undefined): Observable<ObservedValueOf<O>>;

/**
 * Creates an Observable from an Array, an array-like object, a Promise, an iterable object, or an Observable-like object.
 *
 * <span class="informal">Converts almost anything to an Observable.</span>
 *
 * ![](from.png)
 *
 * `from` converts various other objects and data types into Observables. It also converts a Promise, an array-like, or an
 * <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable" target="_blank">iterable</a>
 * object into an Observable that emits the items in that promise, array, or iterable. A String, in this context, is treated
 * as an array of characters. Observable-like objects (contains a function named with the ES2015 Symbol for Observable) can also be
 * converted through this operator.
 *
 * ## Examples
 *
 * Converts an array to an Observable
 *
 * ```ts
 * import { from } from 'rxjs';
 *
 * const array = [10, 20, 30];
 * const result = from(array);
 *
 * result.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 10
 * // 20
 * // 30
 * ```
 *
 * Convert an infinite iterable (from a generator) to an Observable
 *
 * ```ts
 * import { from, take } from 'rxjs';
 *
 * function* generateDoubles(seed) {
 *    let i = seed;
 *    while (true) {
 *      yield i;
 *      i = 2 * i; // double it
 *    }
 * }
 *
 * const iterator = generateDoubles(3);
 * const result = from(iterator).pipe(take(10));
 *
 * result.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 3
 * // 6
 * // 12
 * // 24
 * // 48
 * // 96
 * // 192
 * // 384
 * // 768
 * // 1536
 * ```
 *
 * With `asyncScheduler`
 *
 * ```ts
 * import { from, asyncScheduler } from 'rxjs';
 *
 * console.log('start');
 *
 * const array = [10, 20, 30];
 * const result = from(array, asyncScheduler);
 *
 * result.subscribe(x => console.log(x));
 *
 * console.log('end');
 *
 * // Logs:
 * // 'start'
 * // 'end'
 * // 10
 * // 20
 * // 30
 * ```
 *
 * @see {@link fromEvent}
 * @see {@link fromEventPattern}
 *
 * @param input A subscription object, a Promise, an Observable-like,
 * an Array, an iterable, or an array-like object to be converted.
 * @param scheduler An optional {@link SchedulerLike} on which to schedule the emission of values.
 * @return An Observable converted from {@link ObservableInput}.
 */
export function from<T>(input: ObservableInput<T>, scheduler?: SchedulerLike): Observable<T> {
  return scheduler ? scheduled(input, scheduler) : innerFrom(input);
}
]x9_import { innerFrom } from '../observable/innerFrom';
import { Observable } from '../Observable';
import { mergeMap } from '../operators/mergeMap';
import { isArrayLike } from '../util/isArrayLike';
import { isFunction } from '../util/isFunction';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';

// These constants are used to create handler registry functions using array mapping below.
const nodeEventEmitterMethods = ['addListener', 'removeListener'] as const;
const eventTargetMethods = ['addEventListener', 'removeEventListener'] as const;
const jqueryMethods = ['on', 'off'] as const;

export interface NodeStyleEventEmitter {
  addListener(eventName: string | symbol, handler: NodeEventHandler): this;
  removeListener(eventName: string | symbol, handler: NodeEventHandler): this;
}

export type NodeEventHandler = (...args: any[]) => void;

// For APIs that implement `addListener` and `removeListener` methods that may
// not use the same arguments or return EventEmitter values
// such as React Native
export interface NodeCompatibleEventEmitter {
  addListener(eventName: string, handler: NodeEventHandler): void | {};
  removeListener(eventName: string, handler: NodeEventHandler): void | {};
}

// Use handler types like those in @types/jquery. See:
// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/847731ba1d7fa6db6b911c0e43aa0afe596e7723/types/jquery/misc.d.ts#L6395
export interface JQueryStyleEventEmitter<TContext, T> {
  on(eventName: string, handler: (this: TContext, t: T, ...args: any[]) => any): void;
  off(eventName: string, handler: (this: TContext, t: T, ...args: any[]) => any): void;
}

export interface EventListenerObject<E> {
  handleEvent(evt: E): void;
}

export interface HasEventTargetAddRemove<E> {
  addEventListener(
    type: string,
    listener: ((evt: E) => void) | EventListenerObject<E> | null,
    options?: boolean | AddEventListenerOptions
  ): void;
  removeEventListener(
    type: string,
    listener: ((evt: E) => void) | EventListenerObject<E> | null,
    options?: EventListenerOptions | boolean
  ): void;
}

export interface EventListenerOptions {
  capture?: boolean;
  passive?: boolean;
  once?: boolean;
}

export interface AddEventListenerOptions extends EventListenerOptions {
  once?: boolean;
  passive?: boolean;
}

export function fromEvent<T>(target: HasEventTargetAddRemove<T> | ArrayLike<HasEventTargetAddRemove<T>>, eventName: string): Observable<T>;
export function fromEvent<T, R>(
  target: HasEventTargetAddRemove<T> | ArrayLike<HasEventTargetAddRemove<T>>,
  eventName: string,
  resultSelector: (event: T) => R
): Observable<R>;
export function fromEvent<T>(
  target: HasEventTargetAddRemove<T> | ArrayLike<HasEventTargetAddRemove<T>>,
  eventName: string,
  options: EventListenerOptions
): Observable<T>;
export function fromEvent<T, R>(
  target: HasEventTargetAddRemove<T> | ArrayLike<HasEventTargetAddRemove<T>>,
  eventName: string,
  options: EventListenerOptions,
  resultSelector: (event: T) => R
): Observable<R>;

export function fromEvent(target: NodeStyleEventEmitter | ArrayLike<NodeStyleEventEmitter>, eventName: string): Observable<unknown>;
/** @deprecated Do not specify explicit type parameters. Signatures with type parameters that cannot be inferred will be removed in v8. */
export function fromEvent<T>(target: NodeStyleEventEmitter | ArrayLike<NodeStyleEventEmitter>, eventName: string): Observable<T>;
export function fromEvent<R>(
  target: NodeStyleEventEmitter | ArrayLike<NodeStyleEventEmitter>,
  eventName: string,
  resultSelector: (...args: any[]) => R
): Observable<R>;

export function fromEvent(
  target: NodeCompatibleEventEmitter | ArrayLike<NodeCompatibleEventEmitter>,
  eventName: string
): Observable<unknown>;
/** @deprecated Do not specify explicit type parameters. Signatures with type parameters that cannot be inferred will be removed in v8. */
export function fromEvent<T>(target: NodeCompatibleEventEmitter | ArrayLike<NodeCompatibleEventEmitter>, eventName: string): Observable<T>;
export function fromEvent<R>(
  target: NodeCompatibleEventEmitter | ArrayLike<NodeCompatibleEventEmitter>,
  eventName: string,
  resultSelector: (...args: any[]) => R
): Observable<R>;

export function fromEvent<T>(
  target: JQueryStyleEventEmitter<any, T> | ArrayLike<JQueryStyleEventEmitter<any, T>>,
  eventName: string
): Observable<T>;
export function fromEvent<T, R>(
  target: JQueryStyleEventEmitter<any, T> | ArrayLike<JQueryStyleEventEmitter<any, T>>,
  eventName: string,
  resultSelector: (value: T, ...args: any[]) => R
): Observable<R>;

/**
 * Creates an Observable that emits events of a specific type coming from the
 * given event target.
 *
 * <span class="informal">Creates an Observable from DOM events, or Node.js
 * EventEmitter events or others.</span>
 *
 * ![](fromEvent.png)
 *
 * `fromEvent` accepts as a first argument event target, which is an object with methods
 * for registering event handler functions. As a second argument it takes string that indicates
 * type of event we want to listen for. `fromEvent` supports selected types of event targets,
 * which are described in detail below. If your event target does not match any of the ones listed,
 * you should use {@link fromEventPattern}, which can be used on arbitrary APIs.
 * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event
 * handler functions have different names, but they all accept a string describing event type
 * and function itself, which will be called whenever said event happens.
 *
 * Every time resulting Observable is subscribed, event handler function will be registered
 * to event target on given event type. When that event fires, value
 * passed as a first argument to registered function will be emitted by output Observable.
 * When Observable is unsubscribed, function will be unregistered from event target.
 *
 * Note that if event target calls registered function with more than one argument, second
 * and following arguments will not appear in resulting stream. In order to get access to them,
 * you can pass to `fromEvent` optional project function, which will be called with all arguments
 * passed to event handler. Output Observable will then emit value returned by project function,
 * instead of the usual value.
 *
 * Remember that event targets listed below are checked via duck typing. It means that
 * no matter what kind of object you have and no matter what environment you work in,
 * you can safely use `fromEvent` on that object if it exposes described methods (provided
 * of course they behave as was described above). So for example if Node.js library exposes
 * event target which has the same method names as DOM EventTarget, `fromEvent` is still
 * a good choice.
 *
 * If the API you use is more callback then event handler oriented (subscribed
 * callback function fires only once and thus there is no need to manually
 * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback}
 * instead.
 *
 * `fromEvent` supports following types of event targets:
 *
 * **DOM EventTarget**
 *
 * This is an object with `addEventListener` and `removeEventListener` methods.
 *
 * In the browser, `addEventListener` accepts - apart from event type string and event
 * handler function arguments - optional third parameter, which is either an object or boolean,
 * both used for additional configuration how and when passed function will be called. When
 * `fromEvent` is used with event target of that type, you can provide this values
 * as third parameter as well.
 *
 * **Node.js EventEmitter**
 *
 * An object with `addListener` and `removeListener` methods.
 *
 * **JQuery-style event target**
 *
 * An object with `on` and `off` methods
 *
 * **DOM NodeList**
 *
 * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`.
 *
 * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes
 * it contains and install event handler function in every of them. When returned Observable
 * is unsubscribed, function will be removed from all Nodes.
 *
 * **DOM HtmlCollection**
 *
 * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is
 * installed and removed in each of elements.
 *
 *
 * ## Examples
 *
 * Emit clicks happening on the DOM document
 *
 * ```ts
 * import { fromEvent } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * clicks.subscribe(x => console.log(x));
 *
 * // Results in:
 * // MouseEvent object logged to console every time a click
 * // occurs on the document.
 * ```
 *
 * Use `addEventListener` with capture option
 *
 * ```ts
 * import { fromEvent } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * // note optional configuration parameter which will be passed to addEventListener
 * const clicksInDocument = fromEvent(document, 'click', { capture: true });
 * const clicksInDiv = fromEvent(div, 'click');
 *
 * clicksInDocument.subscribe(() => console.log('document'));
 * clicksInDiv.subscribe(() => console.log('div'));
 *
 * // By default events bubble UP in DOM tree, so normally
 * // when we would click on div in document
 * // "div" would be logged first and then "document".
 * // Since we specified optional `capture` option, document
 * // will catch event when it goes DOWN DOM tree, so console
 * // will log "document" and then "div".
 * ```
 *
 * @see {@link bindCallback}
 * @see {@link bindNodeCallback}
 * @see {@link fromEventPattern}
 *
 * @param target The DOM EventTarget, Node.js EventEmitter, JQuery-like event target,
 * NodeList or HTMLCollection to attach the event handler to.
 * @param eventName The event name of interest, being emitted by the `target`.
 * @param options Options to pass through to the underlying `addListener`,
 * `addEventListener` or `on` functions.
 * @param resultSelector A mapping function used to transform events. It takes the
 * arguments from the event handler and should return a single value.
 * @return An Observable emitting events registered through `target`'s
 * listener handlers.
 */
export function fromEvent<T>(
  target: any,
  eventName: string,
  options?: EventListenerOptions | ((...args: any[]) => T),
  resultSelector?: (...args: any[]) => T
): Observable<T> {
  if (isFunction(options)) {
    resultSelector = options;
    options = undefined;
  }
  if (resultSelector) {
    return fromEvent<T>(target, eventName, options as EventListenerOptions).pipe(mapOneOrManyArgs(resultSelector));
  }

  // Figure out our add and remove methods. In order to do this,
  // we are going to analyze the target in a preferred order, if
  // the target matches a given signature, we take the two "add" and "remove"
  // method names and apply them to a map to create opposite versions of the
  // same function. This is because they all operate in duplicate pairs,
  // `addListener(name, handler)`, `removeListener(name, handler)`, for example.
  // The call only differs by method name, as to whether or not you're adding or removing.
  const [add, remove] =
    // If it is an EventTarget, we need to use a slightly different method than the other two patterns.
    isEventTarget(target)
      ? eventTargetMethods.map((methodName) => (handler: any) => target[methodName](eventName, handler, options as EventListenerOptions))
      : // In all other cases, the call pattern is identical with the exception of the method names.
      isNodeStyleEventEmitter(target)
      ? nodeEventEmitterMethods.map(toCommonHandlerRegistry(target, eventName))
      : isJQueryStyleEventEmitter(target)
      ? jqueryMethods.map(toCommonHandlerRegistry(target, eventName))
      : [];

  // If add is falsy, it's because we didn't match a pattern above.
  // Check to see if it is an ArrayLike, because if it is, we want to
  // try to apply fromEvent to all of it's items. We do this check last,
  // because there are may be some types that are both ArrayLike *and* implement
  // event registry points, and we'd rather delegate to that when possible.
  if (!add) {
    if (isArrayLike(target)) {
      return mergeMap((subTarget: any) => fromEvent(subTarget, eventName, options as EventListenerOptions))(
        innerFrom(target)
      ) as Observable<T>;
    }
  }

  // If add is falsy and we made it here, it's because we didn't
  // match any valid target objects above.
  if (!add) {
    throw new TypeError('Invalid event target');
  }

  return new Observable<T>((subscriber) => {
    // The handler we are going to register. Forwards the event object, by itself, or
    // an array of arguments to the event handler, if there is more than one argument,
    // to the consumer.
    const handler = (...args: any[]) => subscriber.next(1 < args.length ? args : args[0]);
    // Do the work of adding the handler to the target.
    add(handler);
    // When we finalize, we want to remove the handler and free up memory.
    return () => remove!(handler);
  });
}

/**
 * Used to create `add` and `remove` functions to register and unregister event handlers
 * from a target in the most common handler pattern, where there are only two arguments.
 * (e.g.  `on(name, fn)`, `off(name, fn)`, `addListener(name, fn)`, or `removeListener(name, fn)`)
 * @param target The target we're calling methods on
 * @param eventName The event name for the event we're creating register or unregister functions for
 */
function toCommonHandlerRegistry(target: any, eventName: string) {
  return (methodName: string) => (handler: any) => target[methodName](eventName, handler);
}

/**
 * Checks to see if the target implements the required node-style EventEmitter methods
 * for adding and removing event handlers.
 * @param target the object to check
 */
function isNodeStyleEventEmitter(target: any): target is NodeStyleEventEmitter {
  return isFunction(target.addListener) && isFunction(target.removeListener);
}

/**
 * Checks to see if the target implements the required jQuery-style EventEmitter methods
 * for adding and removing event handlers.
 * @param target the object to check
 */
function isJQueryStyleEventEmitter(target: any): target is JQueryStyleEventEmitter<any, any> {
  return isFunction(target.on) && isFunction(target.off);
}

/**
 * Checks to see if the target implements the required EventTarget methods
 * for adding and removing event handlers.
 * @param target the object to check
 */
function isEventTarget(target: any): target is HasEventTargetAddRemove<any> {
  return isFunction(target.addEventListener) && isFunction(target.removeEventListener);
}
chx=import { Observable } from '../Observable';
import { isFunction } from '../util/isFunction';
import { NodeEventHandler } from './fromEvent';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';

/* tslint:disable:max-line-length */
export function fromEventPattern<T>(
  addHandler: (handler: NodeEventHandler) => any,
  removeHandler?: (handler: NodeEventHandler, signal?: any) => void
): Observable<T>;
export function fromEventPattern<T>(
  addHandler: (handler: NodeEventHandler) => any,
  removeHandler?: (handler: NodeEventHandler, signal?: any) => void,
  resultSelector?: (...args: any[]) => T
): Observable<T>;
/* tslint:enable:max-line-length */

/**
 * Creates an Observable from an arbitrary API for registering event handlers.
 *
 * <span class="informal">When that method for adding event handler was something {@link fromEvent}
 * was not prepared for.</span>
 *
 * ![](fromEventPattern.png)
 *
 * `fromEventPattern` allows you to convert into an Observable any API that supports registering handler functions
 * for events. It is similar to {@link fromEvent}, but far
 * more flexible. In fact, all use cases of {@link fromEvent} could be easily handled by
 * `fromEventPattern` (although in slightly more verbose way).
 *
 * This operator accepts as a first argument an `addHandler` function, which will be injected with
 * handler parameter. That handler is actually an event handler function that you now can pass
 * to API expecting it. `addHandler` will be called whenever Observable
 * returned by the operator is subscribed, so registering handler in API will not
 * necessarily happen when `fromEventPattern` is called.
 *
 * After registration, every time an event that we listen to happens,
 * Observable returned by `fromEventPattern` will emit value that event handler
 * function was called with. Note that if event handler was called with more
 * than one argument, second and following arguments will not appear in the Observable.
 *
 * If API you are using allows to unregister event handlers as well, you can pass to `fromEventPattern`
 * another function - `removeHandler` - as a second parameter. It will be injected
 * with the same handler function as before, which now you can use to unregister
 * it from the API. `removeHandler` will be called when consumer of resulting Observable
 * unsubscribes from it.
 *
 * In some APIs unregistering is actually handled differently. Method registering an event handler
 * returns some kind of token, which is later used to identify which function should
 * be unregistered or it itself has method that unregisters event handler.
 * If that is the case with your API, make sure token returned
 * by registering method is returned by `addHandler`. Then it will be passed
 * as a second argument to `removeHandler`, where you will be able to use it.
 *
 * If you need access to all event handler parameters (not only the first one),
 * or you need to transform them in any way, you can call `fromEventPattern` with optional
 * third parameter - project function which will accept all arguments passed to
 * event handler when it is called. Whatever is returned from project function will appear on
 * resulting stream instead of usual event handlers first argument. This means
 * that default project can be thought of as function that takes its first parameter
 * and ignores the rest.
 *
 * ## Examples
 *
 * Emits clicks happening on the DOM document
 *
 * ```ts
 * import { fromEventPattern } from 'rxjs';
 *
 * function addClickHandler(handler) {
 *   document.addEventListener('click', handler);
 * }
 *
 * function removeClickHandler(handler) {
 *   document.removeEventListener('click', handler);
 * }
 *
 * const clicks = fromEventPattern(
 *   addClickHandler,
 *   removeClickHandler
 * );
 * clicks.subscribe(x => console.log(x));
 *
 * // Whenever you click anywhere in the browser, DOM MouseEvent
 * // object will be logged.
 * ```
 *
 * Use with API that returns cancellation token
 *
 * ```ts
 * import { fromEventPattern } from 'rxjs';
 *
 * const token = someAPI.registerEventHandler(function() {});
 * someAPI.unregisterEventHandler(token); // this APIs cancellation method accepts
 *                                        // not handler itself, but special token.
 *
 * const someAPIObservable = fromEventPattern(
 *   function(handler) { return someAPI.registerEventHandler(handler); }, // Note that we return the token here...
 *   function(handler, token) { someAPI.unregisterEventHandler(token); }  // ...to then use it here.
 * );
 * ```
 *
 * Use with project function
 *
 * ```ts
 * import { fromEventPattern } from 'rxjs';
 *
 * someAPI.registerEventHandler((eventType, eventMessage) => {
 *   console.log(eventType, eventMessage); // Logs 'EVENT_TYPE' 'EVENT_MESSAGE' to console.
 * });
 *
 * const someAPIObservable = fromEventPattern(
 *   handler => someAPI.registerEventHandler(handler),
 *   handler => someAPI.unregisterEventHandler(handler)
 *   (eventType, eventMessage) => eventType + ' --- ' + eventMessage // without that function only 'EVENT_TYPE'
 * );                                                                // would be emitted by the Observable
 *
 * someAPIObservable.subscribe(value => console.log(value));
 *
 * // Logs:
 * // 'EVENT_TYPE --- EVENT_MESSAGE'
 * ```
 *
 * @see {@link fromEvent}
 * @see {@link bindCallback}
 * @see {@link bindNodeCallback}
 *
 * @param addHandler A function that takes a `handler` function as argument and attaches it
 * somehow to the actual source of events.
 * @param removeHandler A function that takes a `handler` function as an argument and removes
 * it from the event source. If `addHandler` returns some kind of token, `removeHandler` function
 * will have it as a second parameter.
 * @param resultSelector A function to transform results. It takes the arguments from the event
 * handler and should return a single value.
 * @return Observable which, when an event happens, emits first parameter passed to registered
 * event handler. Alternatively it emits whatever project function returns at that moment.
 */
export function fromEventPattern<T>(
  addHandler: (handler: NodeEventHandler) => any,
  removeHandler?: (handler: NodeEventHandler, signal?: any) => void,
  resultSelector?: (...args: any[]) => T
): Observable<T | T[]> {
  if (resultSelector) {
    return fromEventPattern<T>(addHandler, removeHandler).pipe(mapOneOrManyArgs(resultSelector));
  }

  return new Observable<T | T[]>((subscriber) => {
    const handler = (...e: T[]) => subscriber.next(e.length === 1 ? e[0] : e);
    const retValue = addHandler(handler);
    return isFunction(removeHandler) ? () => removeHandler(handler, retValue) : undefined;
  });
}
"x/import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { Subscribable } from '../types';

/**
 * Used to convert a subscribable to an observable.
 *
 * Currently, this is only used within internals.
 *
 * TODO: Discuss ObservableInput supporting "Subscribable".
 * https://github.com/ReactiveX/rxjs/issues/5909
 *
 * @param subscribable A subscribable
 */
export function fromSubscribable<T>(subscribable: Subscribable<T>) {
  return new Observable((subscriber: Subscriber<T>) => subscribable.subscribe(subscriber));
}
#x(/import { Observable } from '../Observable';
import { identity } from '../util/identity';
import { ObservableInput, SchedulerLike } from '../types';
import { isScheduler } from '../util/isScheduler';
import { defer } from './defer';
import { scheduleIterable } from '../scheduled/scheduleIterable';

type ConditionFunc<S> = (state: S) => boolean;
type IterateFunc<S> = (state: S) => S;
type ResultFunc<S, T> = (state: S) => T;

export interface GenerateBaseOptions<S> {
  /**
   * Initial state.
   */
  initialState: S;
  /**
   * Condition function that accepts state and returns boolean.
   * When it returns false, the generator stops.
   * If not specified, a generator never stops.
   */
  condition?: ConditionFunc<S>;
  /**
   * Iterate function that accepts state and returns new state.
   */
  iterate: IterateFunc<S>;
  /**
   * SchedulerLike to use for generation process.
   * By default, a generator starts immediately.
   */
  scheduler?: SchedulerLike;
}

export interface GenerateOptions<T, S> extends GenerateBaseOptions<S> {
  /**
   * Result selection function that accepts state and returns a value to emit.
   */
  resultSelector: ResultFunc<S, T>;
}

/**
 * Generates an observable sequence by running a state-driven loop
 * producing the sequence's elements, using the specified scheduler
 * to send out observer messages.
 *
 * ![](generate.png)
 *
 * ## Examples
 *
 * Produces sequence of numbers
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate(0, x => x < 3, x => x + 1, x => x);
 *
 * result.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * ```
 *
 * Use `asapScheduler`
 *
 * ```ts
 * import { generate, asapScheduler } from 'rxjs';
 *
 * const result = generate(1, x => x < 5, x => x * 2, x => x + 1, asapScheduler);
 *
 * result.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 2
 * // 3
 * // 5
 * ```
 *
 * @see {@link from}
 * @see {@link Observable}
 *
 * @param initialState Initial state.
 * @param condition Condition to terminate generation (upon returning false).
 * @param iterate Iteration step function.
 * @param resultSelector Selector function for results produced in the sequence.
 * @param scheduler A {@link SchedulerLike} on which to run the generator loop.
 * If not provided, defaults to emit immediately.
 * @returns The generated sequence.
 * @deprecated Instead of passing separate arguments, use the options argument.
 * Signatures taking separate arguments will be removed in v8.
 */
export function generate<T, S>(
  initialState: S,
  condition: ConditionFunc<S>,
  iterate: IterateFunc<S>,
  resultSelector: ResultFunc<S, T>,
  scheduler?: SchedulerLike
): Observable<T>;

/**
 * Generates an Observable by running a state-driven loop
 * that emits an element on each iteration.
 *
 * <span class="informal">Use it instead of nexting values in a for loop.</span>
 *
 * ![](generate.png)
 *
 * `generate` allows you to create a stream of values generated with a loop very similar to
 * a traditional for loop. The first argument of `generate` is a beginning value. The second argument
 * is a function that accepts this value and tests if some condition still holds. If it does,
 * then the loop continues, if not, it stops. The third value is a function which takes the
 * previously defined value and modifies it in some way on each iteration. Note how these three parameters
 * are direct equivalents of three expressions in a traditional for loop: the first expression
 * initializes some state (for example, a numeric index), the second tests if the loop can perform the next
 * iteration (for example, if the index is lower than 10) and the third states how the defined value
 * will be modified on every step (for example, the index will be incremented by one).
 *
 * Return value of a `generate` operator is an Observable that on each loop iteration
 * emits a value. First of all, the condition function is ran. If it returns true, then the Observable
 * emits the currently stored value (initial value at the first iteration) and finally updates
 * that value with iterate function. If at some point the condition returns false, then the Observable
 * completes at that moment.
 *
 * Optionally you can pass a fourth parameter to `generate` - a result selector function which allows you
 * to immediately map the value that would normally be emitted by an Observable.
 *
 * If you find three anonymous functions in `generate` call hard to read, you can provide
 * a single object to the operator instead where the object has the properties: `initialState`,
 * `condition`, `iterate` and `resultSelector`, which should have respective values that you
 * would normally pass to `generate`. `resultSelector` is still optional, but that form
 * of calling `generate` allows you to omit `condition` as well. If you omit it, that means
 * condition always holds, or in other words the resulting Observable will never complete.
 *
 * Both forms of `generate` can optionally accept a scheduler. In case of a multi-parameter call,
 * scheduler simply comes as a last argument (no matter if there is a `resultSelector`
 * function or not). In case of a single-parameter call, you can provide it as a
 * `scheduler` property on the object passed to the operator. In both cases, a scheduler decides when
 * the next iteration of the loop will happen and therefore when the next value will be emitted
 * by the Observable. For example, to ensure that each value is pushed to the Observer
 * on a separate task in the event loop, you could use the `async` scheduler. Note that
 * by default (when no scheduler is passed) values are simply emitted synchronously.
 *
 *
 * ## Examples
 *
 * Use with condition and iterate functions
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate(0, x => x < 3, x => x + 1);
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * // 'Complete!'
 * ```
 *
 * Use with condition, iterate and resultSelector functions
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate(0, x => x < 3, x => x + 1, x => x * 1000);
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1000
 * // 2000
 * // 'Complete!'
 * ```
 *
 * Use with options object
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate({
 *   initialState: 0,
 *   condition(value) { return value < 3; },
 *   iterate(value) { return value + 1; },
 *   resultSelector(value) { return value * 1000; }
 * });
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1000
 * // 2000
 * // 'Complete!'
 * ```
 *
 * Use options object without condition function
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate({
 *   initialState: 0,
 *   iterate(value) { return value + 1; },
 *   resultSelector(value) { return value * 1000; }
 * });
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!') // This will never run
 * });
 *
 * // Logs:
 * // 0
 * // 1000
 * // 2000
 * // 3000
 * // ...and never stops.
 * ```
 *
 * @see {@link from}
 *
 * @param initialState Initial state.
 * @param condition Condition to terminate generation (upon returning false).
 * @param iterate Iteration step function.
 * @param scheduler A {@link Scheduler} on which to run the generator loop. If not
 * provided, defaults to emitting immediately.
 * @return The generated sequence.
 * @deprecated Instead of passing separate arguments, use the options argument.
 * Signatures taking separate arguments will be removed in v8.
 */
export function generate<S>(
  initialState: S,
  condition: ConditionFunc<S>,
  iterate: IterateFunc<S>,
  scheduler?: SchedulerLike
): Observable<S>;

/**
 * Generates an observable sequence by running a state-driven loop
 * producing the sequence's elements, using the specified scheduler
 * to send out observer messages.
 * The overload accepts options object that might contain initial state, iterate,
 * condition and scheduler.
 *
 * ![](generate.png)
 *
 * ## Examples
 *
 * Use options object with condition function
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate({
 *   initialState: 0,
 *   condition: x => x < 3,
 *   iterate: x => x + 1
 * });
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * // 'Complete!'
 * ```
 *
 * @see {@link from}
 * @see {@link Observable}
 *
 * @param options Object that must contain initialState, iterate and might contain condition and scheduler.
 * @returns The generated sequence.
 */
export function generate<S>(options: GenerateBaseOptions<S>): Observable<S>;

/**
 * Generates an observable sequence by running a state-driven loop
 * producing the sequence's elements, using the specified scheduler
 * to send out observer messages.
 * The overload accepts options object that might contain initial state, iterate,
 * condition, result selector and scheduler.
 *
 * ![](generate.png)
 *
 * ## Examples
 *
 * Use options object with condition and iterate function
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate({
 *   initialState: 0,
 *   condition: x => x < 3,
 *   iterate: x => x + 1,
 *   resultSelector: x => x
 * });
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * // 'Complete!'
 * ```
 *
 * @see {@link from}
 * @see {@link Observable}
 *
 * @param options Object that must contain initialState, iterate, resultSelector and might contain condition and scheduler.
 * @returns The generated sequence.
 */
export function generate<T, S>(options: GenerateOptions<T, S>): Observable<T>;

export function generate<T, S>(
  initialStateOrOptions: S | GenerateOptions<T, S>,
  condition?: ConditionFunc<S>,
  iterate?: IterateFunc<S>,
  resultSelectorOrScheduler?: ResultFunc<S, T> | SchedulerLike,
  scheduler?: SchedulerLike
): Observable<T> {
  let resultSelector: ResultFunc<S, T>;
  let initialState: S;

  // TODO: Remove this as we move away from deprecated signatures
  // and move towards a configuration object argument.
  if (arguments.length === 1) {
    // If we only have one argument, we can assume it is a configuration object.
    // Note that folks not using TypeScript may trip over this.
    ({
      initialState,
      condition,
      iterate,
      resultSelector = identity as ResultFunc<S, T>,
      scheduler,
    } = initialStateOrOptions as GenerateOptions<T, S>);
  } else {
    // Deprecated arguments path. Figure out what the user
    // passed and set it here.
    initialState = initialStateOrOptions as S;
    if (!resultSelectorOrScheduler || isScheduler(resultSelectorOrScheduler)) {
      resultSelector = identity as ResultFunc<S, T>;
      scheduler = resultSelectorOrScheduler as SchedulerLike;
    } else {
      resultSelector = resultSelectorOrScheduler as ResultFunc<S, T>;
    }
  }

  // The actual generator used to "generate" values.
  function* gen() {
    for (let state = initialState; !condition || condition(state); state = iterate!(state)) {
      yield resultSelector(state);
    }
  }

  // We use `defer` because we want to defer the creation of the iterator from the iterable.
  return defer(
    (scheduler
      ? // If a scheduler was provided, use `scheduleIterable` to ensure that iteration/generation
        // happens on the scheduler.
        () => scheduleIterable(gen(), scheduler!)
      : // Otherwise, if there's no scheduler, we can just use the generator function directly in
        // `defer` and executing it will return the generator (which is iterable).
        gen) as () => ObservableInput<T>
  );
}
Yv{Ľx	import { Observable } from '../Observable';
import { defer } from './defer';
import { ObservableInput } from '../types';

/**
 * Checks a boolean at subscription time, and chooses between one of two observable sources
 *
 * `iif` expects a function that returns a boolean (the `condition` function), and two sources,
 * the `trueResult` and the `falseResult`, and returns an Observable.
 *
 * At the moment of subscription, the `condition` function is called. If the result is `true`, the
 * subscription will be to the source passed as the `trueResult`, otherwise, the subscription will be
 * to the source passed as the `falseResult`.
 *
 * If you need to check more than two options to choose between more than one observable, have a look at the {@link defer} creation method.
 *
 * ## Examples
 *
 * Change at runtime which Observable will be subscribed
 *
 * ```ts
 * import { iif, of } from 'rxjs';
 *
 * let subscribeToFirst;
 * const firstOrSecond = iif(
 *   () => subscribeToFirst,
 *   of('first'),
 *   of('second')
 * );
 *
 * subscribeToFirst = true;
 * firstOrSecond.subscribe(value => console.log(value));
 *
 * // Logs:
 * // 'first'
 *
 * subscribeToFirst = false;
 * firstOrSecond.subscribe(value => console.log(value));
 *
 * // Logs:
 * // 'second'
 * ```
 *
 * Control access to an Observable
 *
 * ```ts
 * import { iif, of, EMPTY } from 'rxjs';
 *
 * let accessGranted;
 * const observableIfYouHaveAccess = iif(
 *   () => accessGranted,
 *   of('It seems you have an access...'),
 *   EMPTY
 * );
 *
 * accessGranted = true;
 * observableIfYouHaveAccess.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('The end')
 * });
 *
 * // Logs:
 * // 'It seems you have an access...'
 * // 'The end'
 *
 * accessGranted = false;
 * observableIfYouHaveAccess.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('The end')
 * });
 *
 * // Logs:
 * // 'The end'
 * ```
 *
 * @see {@link defer}
 *
 * @param condition Condition which Observable should be chosen.
 * @param trueResult An Observable that will be subscribed if condition is true.
 * @param falseResult An Observable that will be subscribed if condition is false.
 * @return An observable that proxies to `trueResult` or `falseResult`, depending on the result of the `condition` function.
 */
export function iif<T, F>(condition: () => boolean, trueResult: ObservableInput<T>, falseResult: ObservableInput<F>): Observable<T | F> {
  return defer(() => (condition() ? trueResult : falseResult));
}
<ؼxSimport { isArrayLike } from '../util/isArrayLike';
import { isPromise } from '../util/isPromise';
import { Observable } from '../Observable';
import { ObservableInput, ObservedValueOf, ReadableStreamLike } from '../types';
import { isInteropObservable } from '../util/isInteropObservable';
import { isAsyncIterable } from '../util/isAsyncIterable';
import { createInvalidObservableTypeError } from '../util/throwUnobservableError';
import { isIterable } from '../util/isIterable';
import { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';
import { Subscriber } from '../Subscriber';
import { isFunction } from '../util/isFunction';
import { reportUnhandledError } from '../util/reportUnhandledError';
import { observable as Symbol_observable } from '../symbol/observable';

export function innerFrom<O extends ObservableInput<any>>(input: O): Observable<ObservedValueOf<O>>;
export function innerFrom<T>(input: ObservableInput<T>): Observable<T> {
  if (input instanceof Observable) {
    return input;
  }
  if (input != null) {
    if (isInteropObservable(input)) {
      return fromInteropObservable(input);
    }
    if (isArrayLike(input)) {
      return fromArrayLike(input);
    }
    if (isPromise(input)) {
      return fromPromise(input);
    }
    if (isAsyncIterable(input)) {
      return fromAsyncIterable(input);
    }
    if (isIterable(input)) {
      return fromIterable(input);
    }
    if (isReadableStreamLike(input)) {
      return fromReadableStreamLike(input);
    }
  }

  throw createInvalidObservableTypeError(input);
}

/**
 * Creates an RxJS Observable from an object that implements `Symbol.observable`.
 * @param obj An object that properly implements `Symbol.observable`.
 */
export function fromInteropObservable<T>(obj: any) {
  return new Observable((subscriber: Subscriber<T>) => {
    const obs = obj[Symbol_observable]();
    if (isFunction(obs.subscribe)) {
      return obs.subscribe(subscriber);
    }
    // Should be caught by observable subscribe function error handling.
    throw new TypeError('Provided object does not correctly implement Symbol.observable');
  });
}

/**
 * Synchronously emits the values of an array like and completes.
 * This is exported because there are creation functions and operators that need to
 * make direct use of the same logic, and there's no reason to make them run through
 * `from` conditionals because we *know* they're dealing with an array.
 * @param array The array to emit values from
 */
export function fromArrayLike<T>(array: ArrayLike<T>) {
  return new Observable((subscriber: Subscriber<T>) => {
    // Loop over the array and emit each value. Note two things here:
    // 1. We're making sure that the subscriber is not closed on each loop.
    //    This is so we don't continue looping over a very large array after
    //    something like a `take`, `takeWhile`, or other synchronous unsubscription
    //    has already unsubscribed.
    // 2. In this form, reentrant code can alter that array we're looping over.
    //    This is a known issue, but considered an edge case. The alternative would
    //    be to copy the array before executing the loop, but this has
    //    performance implications.
    for (let i = 0; i < array.length && !subscriber.closed; i++) {
      subscriber.next(array[i]);
    }
    subscriber.complete();
  });
}

export function fromPromise<T>(promise: PromiseLike<T>) {
  return new Observable((subscriber: Subscriber<T>) => {
    promise
      .then(
        (value) => {
          if (!subscriber.closed) {
            subscriber.next(value);
            subscriber.complete();
          }
        },
        (err: any) => subscriber.error(err)
      )
      .then(null, reportUnhandledError);
  });
}

export function fromIterable<T>(iterable: Iterable<T>) {
  return new Observable((subscriber: Subscriber<T>) => {
    for (const value of iterable) {
      subscriber.next(value);
      if (subscriber.closed) {
        return;
      }
    }
    subscriber.complete();
  });
}

export function fromAsyncIterable<T>(asyncIterable: AsyncIterable<T>) {
  return new Observable((subscriber: Subscriber<T>) => {
    process(asyncIterable, subscriber).catch((err) => subscriber.error(err));
  });
}

export function fromReadableStreamLike<T>(readableStream: ReadableStreamLike<T>) {
  return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));
}

async function process<T>(asyncIterable: AsyncIterable<T>, subscriber: Subscriber<T>) {
  for await (const value of asyncIterable) {
    subscriber.next(value);
    // A side-effect may have closed our subscriber,
    // check before the next iteration.
    if (subscriber.closed) {
      return;
    }
  }
  subscriber.complete();
}
%Brx&import { Observable } from '../Observable';
import { asyncScheduler } from '../scheduler/async';
import { SchedulerLike } from '../types';
import { timer } from './timer';

/**
 * Creates an Observable that emits sequential numbers every specified
 * interval of time, on a specified {@link SchedulerLike}.
 *
 * <span class="informal">Emits incremental numbers periodically in time.</span>
 *
 * ![](interval.png)
 *
 * `interval` returns an Observable that emits an infinite sequence of
 * ascending integers, with a constant interval of time of your choosing
 * between those emissions. The first emission is not sent immediately, but
 * only after the first period has passed. By default, this operator uses the
 * `async` {@link SchedulerLike} to provide a notion of time, but you may pass any
 * {@link SchedulerLike} to it.
 *
 * ## Example
 *
 * Emits ascending numbers, one every second (1000ms) up to the number 3
 *
 * ```ts
 * import { interval, take } from 'rxjs';
 *
 * const numbers = interval(1000);
 *
 * const takeFourNumbers = numbers.pipe(take(4));
 *
 * takeFourNumbers.subscribe(x => console.log('Next: ', x));
 *
 * // Logs:
 * // Next: 0
 * // Next: 1
 * // Next: 2
 * // Next: 3
 * ```
 *
 * @see {@link timer}
 * @see {@link delay}
 *
 * @param period The interval size in milliseconds (by default) or the time unit determined
 * by the scheduler's clock.
 * @param scheduler The {@link SchedulerLike} to use for scheduling the emission of values,
 * and providing a notion of "time".
 * @return An Observable that emits a sequential number each time interval.
 */
export function interval(period = 0, scheduler: SchedulerLike = asyncScheduler): Observable<number> {
  if (period < 0) {
    // We cannot schedule an interval in the past.
    period = 0;
  }

  return timer(period, period, scheduler);
}
bɺximport { Observable } from '../Observable';
import { ObservableInput, ObservableInputTuple, SchedulerLike } from '../types';
import { mergeAll } from '../operators/mergeAll';
import { innerFrom } from './innerFrom';
import { EMPTY } from './empty';
import { popNumber, popScheduler } from '../util/args';
import { from } from './from';

export function merge<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A[number]>;
export function merge<A extends readonly unknown[]>(...sourcesAndConcurrency: [...ObservableInputTuple<A>, number?]): Observable<A[number]>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `mergeAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function merge<A extends readonly unknown[]>(
  ...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike?]
): Observable<A[number]>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `mergeAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function merge<A extends readonly unknown[]>(
  ...sourcesAndConcurrencyAndScheduler: [...ObservableInputTuple<A>, number?, SchedulerLike?]
): Observable<A[number]>;

/**
 * Creates an output Observable which concurrently emits all values from every
 * given input Observable.
 *
 * <span class="informal">Flattens multiple Observables together by blending
 * their values into one Observable.</span>
 *
 * ![](merge.png)
 *
 * `merge` subscribes to each given input Observable (as arguments), and simply
 * forwards (without doing any transformation) all the values from all the input
 * Observables to the output Observable. The output Observable only completes
 * once all input Observables have completed. Any error delivered by an input
 * Observable will be immediately emitted on the output Observable.
 *
 * ## Examples
 *
 * Merge together two Observables: 1s interval and clicks
 *
 * ```ts
 * import { merge, fromEvent, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const timer = interval(1000);
 * const clicksOrTimer = merge(clicks, timer);
 * clicksOrTimer.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // timer will emit ascending values, one every second(1000ms) to console
 * // clicks logs MouseEvents to console every time the "document" is clicked
 * // Since the two streams are merged you see these happening
 * // as they occur.
 * ```
 *
 * Merge together 3 Observables, but run only 2 concurrently
 *
 * ```ts
 * import { interval, take, merge } from 'rxjs';
 *
 * const timer1 = interval(1000).pipe(take(10));
 * const timer2 = interval(2000).pipe(take(6));
 * const timer3 = interval(500).pipe(take(10));
 *
 * const concurrent = 2; // the argument
 * const merged = merge(timer1, timer2, timer3, concurrent);
 * merged.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // - First timer1 and timer2 will run concurrently
 * // - timer1 will emit a value every 1000ms for 10 iterations
 * // - timer2 will emit a value every 2000ms for 6 iterations
 * // - after timer1 hits its max iteration, timer2 will
 * //   continue, and timer3 will start to run concurrently with timer2
 * // - when timer2 hits its max iteration it terminates, and
 * //   timer3 will continue to emit a value every 500ms until it is complete
 * ```
 *
 * @see {@link mergeAll}
 * @see {@link mergeMap}
 * @see {@link mergeMapTo}
 * @see {@link mergeScan}
 *
 * @param args `ObservableInput`s to merge together. If the last parameter
 * is of type number, `merge` will use it to limit number of concurrently
 * subscribed `ObservableInput`s. If the last parameter is {@link SchedulerLike},
 * it will be used for scheduling the emission of values.
 * @return An Observable that emits items that are the result of every input Observable.
 */
export function merge(...args: (ObservableInput<unknown> | number | SchedulerLike)[]): Observable<unknown> {
  const scheduler = popScheduler(args);
  const concurrent = popNumber(args, Infinity);
  const sources = args as ObservableInput<unknown>[];
  return !sources.length
    ? // No source provided
      EMPTY
    : sources.length === 1
    ? // One source? Just return it.
      innerFrom(sources[0])
    : // Merge all sources
      mergeAll(concurrent)(from(sources, scheduler));
}
l>ҀJxXimport { Observable } from '../Observable';
import { noop } from '../util/noop';

/**
 * An Observable that emits no items to the Observer and never completes.
 *
 * ![](never.png)
 *
 * A simple Observable that emits neither values nor errors nor the completion
 * notification. It can be used for testing purposes or for composing with other
 * Observables. Please note that by never emitting a complete notification, this
 * Observable keeps the subscription from being disposed automatically.
 * Subscriptions need to be manually disposed.
 *
 * ##  Example
 *
 * Emit the number 7, then never emit anything else (not even complete)
 *
 * ```ts
 * import { NEVER, startWith } from 'rxjs';
 *
 * const info = () => console.log('Will not be called');
 *
 * const result = NEVER.pipe(startWith(7));
 * result.subscribe({
 *   next: x => console.log(x),
 *   error: info,
 *   complete: info
 * });
 * ```
 *
 * @see {@link Observable}
 * @see {@link EMPTY}
 * @see {@link of}
 * @see {@link throwError}
 */
export const NEVER = new Observable<never>(noop);

/**
 * @deprecated Replaced with the {@link NEVER} constant. Will be removed in v8.
 */
export function never() {
  return NEVER;
}
57x
import { SchedulerLike, ValueFromArray } from '../types';
import { Observable } from '../Observable';
import { popScheduler } from '../util/args';
import { from } from './from';

// Devs are more likely to pass null or undefined than they are a scheduler
// without accompanying values. To make things easier for (naughty) devs who
// use the `strictNullChecks: false` TypeScript compiler option, these
// overloads with explicit null and undefined values are included.

export function of(value: null): Observable<null>;
export function of(value: undefined): Observable<undefined>;

/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function of(scheduler: SchedulerLike): Observable<never>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function of<A extends readonly unknown[]>(...valuesAndScheduler: [...A, SchedulerLike]): Observable<ValueFromArray<A>>;

export function of(): Observable<never>;
/** @deprecated Do not specify explicit type parameters. Signatures with type parameters that cannot be inferred will be removed in v8. */
export function of<T>(): Observable<T>;
export function of<T>(value: T): Observable<T>;
export function of<A extends readonly unknown[]>(...values: A): Observable<ValueFromArray<A>>;

/**
 * Converts the arguments to an observable sequence.
 *
 * <span class="informal">Each argument becomes a `next` notification.</span>
 *
 * ![](of.png)
 *
 * Unlike {@link from}, it does not do any flattening and emits each argument in whole
 * as a separate `next` notification.
 *
 * ## Examples
 *
 * Emit the values `10, 20, 30`
 *
 * ```ts
 * import { of } from 'rxjs';
 *
 * of(10, 20, 30)
 *   .subscribe({
 *     next: value => console.log('next:', value),
 *     error: err => console.log('error:', err),
 *     complete: () => console.log('the end'),
 *   });
 *
 * // Outputs
 * // next: 10
 * // next: 20
 * // next: 30
 * // the end
 * ```
 *
 * Emit the array `[1, 2, 3]`
 *
 * ```ts
 * import { of } from 'rxjs';
 *
 * of([1, 2, 3])
 *   .subscribe({
 *     next: value => console.log('next:', value),
 *     error: err => console.log('error:', err),
 *     complete: () => console.log('the end'),
 *   });
 *
 * // Outputs
 * // next: [1, 2, 3]
 * // the end
 * ```
 *
 * @see {@link from}
 * @see {@link range}
 *
 * @param args A comma separated list of arguments you want to be emitted.
 * @return An Observable that synchronously emits the arguments described
 * above and then immediately completes.
 */
export function of<T>(...args: Array<T | SchedulerLike>): Observable<T> {
  const scheduler = popScheduler(args);
  return from(args as T[], scheduler);
}
ximport { Observable } from '../Observable';
import { ObservableInputTuple } from '../types';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { OperatorSubscriber } from '../operators/OperatorSubscriber';
import { noop } from '../util/noop';
import { innerFrom } from './innerFrom';

export function onErrorResumeNext<A extends readonly unknown[]>(sources: [...ObservableInputTuple<A>]): Observable<A[number]>;
export function onErrorResumeNext<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A[number]>;

/**
 * When any of the provided Observable emits a complete or an error notification, it immediately subscribes to the next one
 * that was passed.
 *
 * <span class="informal">Execute series of Observables no matter what, even if it means swallowing errors.</span>
 *
 * ![](onErrorResumeNext.png)
 *
 * `onErrorResumeNext` will subscribe to each observable source it is provided, in order.
 * If the source it's subscribed to emits an error or completes, it will move to the next source
 * without error.
 *
 * If `onErrorResumeNext` is provided no arguments, or a single, empty array, it will return {@link EMPTY}.
 *
 * `onErrorResumeNext` is basically {@link concat}, only it will continue, even if one of its
 * sources emits an error.
 *
 * Note that there is no way to handle any errors thrown by sources via the result of
 * `onErrorResumeNext`. If you want to handle errors thrown in any given source, you can
 * always use the {@link catchError} operator on them before passing them into `onErrorResumeNext`.
 *
 * ## Example
 *
 * Subscribe to the next Observable after map fails
 *
 * ```ts
 * import { onErrorResumeNext, of, map } from 'rxjs';
 *
 * onErrorResumeNext(
 *   of(1, 2, 3, 0).pipe(
 *     map(x => {
 *       if (x === 0) {
 *         throw Error();
 *       }
 *       return 10 / x;
 *     })
 *   ),
 *   of(1, 2, 3)
 * )
 * .subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err),     // Will never be called.
 *   complete: () => console.log('done')
 * });
 *
 * // Logs:
 * // 10
 * // 5
 * // 3.3333333333333335
 * // 1
 * // 2
 * // 3
 * // 'done'
 * ```
 *
 * @see {@link concat}
 * @see {@link catchError}
 *
 * @param sources `ObservableInput`s passed either directly or as an array.
 * @return An Observable that concatenates all sources, one after the other,
 * ignoring all errors, such that any error causes it to move on to the next source.
 */
export function onErrorResumeNext<A extends readonly unknown[]>(
  ...sources: [[...ObservableInputTuple<A>]] | [...ObservableInputTuple<A>]
): Observable<A[number]> {
  const nextSources: ObservableInputTuple<A> = argsOrArgArray(sources) as any;

  return new Observable((subscriber) => {
    let sourceIndex = 0;
    const subscribeNext = () => {
      if (sourceIndex < nextSources.length) {
        let nextSource: Observable<A[number]>;
        try {
          nextSource = innerFrom(nextSources[sourceIndex++]);
        } catch (err) {
          subscribeNext();
          return;
        }
        const innerSubscriber = new OperatorSubscriber(subscriber, undefined, noop, noop);
        nextSource.subscribe(innerSubscriber);
        innerSubscriber.add(subscribeNext);
      } else {
        subscriber.complete();
      }
    };
    subscribeNext();
  });
}
[Djx
4import { Observable } from '../Observable';
import { SchedulerLike } from '../types';
import { from } from './from';

/**
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs<T>(arr: readonly T[], scheduler?: SchedulerLike): Observable<[string, T]>;
/**
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs<O extends Record<string, unknown>>(obj: O, scheduler?: SchedulerLike): Observable<[keyof O, O[keyof O]]>;
/**
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs<T>(iterable: Iterable<T>, scheduler?: SchedulerLike): Observable<[string, T]>;
/**
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs(
  n: number | bigint | boolean | ((...args: any[]) => any) | symbol,
  scheduler?: SchedulerLike
): Observable<[never, never]>;

/**
 * Convert an object into an Observable of `[key, value]` pairs.
 *
 * <span class="informal">Turn entries of an object into a stream.</span>
 *
 * ![](pairs.png)
 *
 * `pairs` takes an arbitrary object and returns an Observable that emits arrays. Each
 * emitted array has exactly two elements - the first is a key from the object
 * and the second is a value corresponding to that key. Keys are extracted from
 * an object via `Object.keys` function, which means that they will be only
 * enumerable keys that are present on an object directly - not ones inherited
 * via prototype chain.
 *
 * By default, these arrays are emitted synchronously. To change that you can
 * pass a {@link SchedulerLike} as a second argument to `pairs`.
 *
 * ## Example
 *
 * Converts an object to an Observable
 *
 * ```ts
 * import { pairs } from 'rxjs';
 *
 * const obj = {
 *   foo: 42,
 *   bar: 56,
 *   baz: 78
 * };
 *
 * pairs(obj).subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // ['foo', 42]
 * // ['bar', 56]
 * // ['baz', 78]
 * // 'Complete!'
 * ```
 *
 * ### Object.entries required
 *
 * In IE, you will need to polyfill `Object.entries` in order to use this.
 * [MDN has a polyfill here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)
 *
 * @param obj The object to inspect and turn into an Observable sequence.
 * @param scheduler An optional IScheduler to schedule when resulting
 * Observable will emit values.
 * @returns An observable sequence of [key, value] pairs from the object.
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs(obj: any, scheduler?: SchedulerLike) {
  return from(Object.entries(obj), scheduler as any);
}
C6x
*import { not } from '../util/not';
import { filter } from './filter';
import { Observable } from '../Observable';
import { UnaryFunction } from '../types';

/**
 * Splits the source Observable into two, one with values that satisfy a
 * predicate, and another with values that don't satisfy the predicate.
 *
 * <span class="informal">It's like {@link filter}, but returns two Observables:
 * one like the output of {@link filter}, and the other with values that did not
 * pass the condition.</span>
 *
 * ![](partition.png)
 *
 * `partition` outputs an array with two Observables that partition the values
 * from the source Observable through the given `predicate` function. The first
 * Observable in that array emits source values for which the predicate argument
 * returns true. The second Observable emits source values for which the
 * predicate returns false. The first behaves like {@link filter} and the second
 * behaves like {@link filter} with the predicate negated.
 *
 * ## Example
 *
 * Partition click events into those on DIV elements and those elsewhere
 *
 * ```ts
 * import { fromEvent } from 'rxjs';
 * import { partition } from 'rxjs/operators';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const [clicksOnDivs, clicksElsewhere] = clicks.pipe(partition(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 *
 * clicksOnDivs.subscribe(x => console.log('DIV clicked: ', x));
 * clicksElsewhere.subscribe(x => console.log('Other clicked: ', x));
 * ```
 *
 * @see {@link filter}
 *
 * @param predicate A function that evaluates each value emitted by the source
 * Observable. If it returns `true`, the value is emitted on the first Observable
 * in the returned array, if `false` the value is emitted on the second Observable
 * in the array. The `index` parameter is the number `i` for the i-th source
 * emission that has happened since the subscription, starting from the number `0`.
 * @param thisArg An optional argument to determine the value of `this` in the
 * `predicate` function.
 * @return A function that returns an array with two Observables: one with
 * values that passed the predicate, and another with values that did not pass
 * the predicate.
 * @deprecated Replaced with the {@link partition} static creation function. Will be removed in v8.
 */
export function partition<T>(
  predicate: (value: T, index: number) => boolean,
  thisArg?: any
): UnaryFunction<Observable<T>, [Observable<T>, Observable<T>]> {
  return (source: Observable<T>) =>
    [filter(predicate, thisArg)(source), filter(not(predicate, thisArg))(source)] as [Observable<T>, Observable<T>];
}
8+]cx'<./operators<Input } from '../typesC8innerFrom } from './innerFrom';

/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function partition<T, U extends T, A>(
  source: ObservableInput<T>,
  predicate: (this: A, value: T, index: number) => value is U,
  thisArg: A
): [Observable<U>, Observable<Exclude<T, U>>];
export function partition<T, U exten$ds T>(
  source: ObservableInput<T>,	+value is U
): [Observable<U>, Observable<Exclude<T, U>>];

/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function partition<T, A>(
  source: ObservableInput<T>,
  predicate: (this: A, 	.: A
):
;	source: ObservableInput<T>,	0):
]La set of numbers into odds and evens observables
 *
 * ```ts
 * import { of,o';
 *
 * const observableValues = of(1, 2, 3, 4, 5, 6);
 * const [evens$, odds$] = partition(observableValues, value => value % 2 === 0);
 *
 * odds$.odds', x));
 * evens$.levens', x));
 *
 * // Logs:
 * // odds 1
 * // odds 3
 * // odds 5
 * // evens 2
 * // evens 4
 * // evens 6a/bsource The source `ObservableInput` that will be split into a tuple of
 * two Observable elements.
)
: one with- pass the predicate	&5source: ObservableInput<T>,
  predicate: (this: any, 	8
 {
  returna
innerFrom(source)
#EinnerFrom(source))] as [
    Observable<T>,
    Observable<T>
  ];
}
LxYimport { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
import { Subscription } from '../Subscription';
import { ObservableInput, ObservableInputTuple } from '../types';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { Subscriber } from '../Subscriber';

export function race<T extends readonly unknown[]>(inputs: [...ObservableInputTuple<T>]): Observable<T[number]>;
export function race<T extends readonly unknown[]>(...inputs: [...ObservableInputTuple<T>]): Observable<T[number]>;

/**
 * Returns an observable that mirrors the first source observable to emit an item.
 *
 * ![](race.png)
 *
 * `race` returns an observable, that when subscribed to, subscribes to all source observables immediately.
 * As soon as one of the source observables emits a value, the result unsubscribes from the other sources.
 * The resulting observable will forward all notifications, including error and completion, from the "winning"
 * source observable.
 *
 * If one of the used source observable throws an errors before a first notification
 * the race operator will also throw an error, no matter if another source observable
 * could potentially win the race.
 *
 * `race` can be useful for selecting the response from the fastest network connection for
 * HTTP or WebSockets. `race` can also be useful for switching observable context based on user
 * input.
 *
 * ## Example
 *
 * Subscribes to the observable that was the first to start emitting.
 *
 * ```ts
 * import { interval, map, race } from 'rxjs';
 *
 * const obs1 = interval(7000).pipe(map(() => 'slow one'));
 * const obs2 = interval(3000).pipe(map(() => 'fast one'));
 * const obs3 = interval(5000).pipe(map(() => 'medium one'));
 *
 * race(obs1, obs2, obs3)
 *   .subscribe(winner => console.log(winner));
 *
 * // Outputs
 * // a series of 'fast one'
 * ```
 *
 * @param sources Used to race for which `ObservableInput` emits first.
 * @return An Observable that mirrors the output of the first Observable to emit an item.
 */
export function race<T>(...sources: (ObservableInput<T> | ObservableInput<T>[])[]): Observable<any> {
  sources = argsOrArgArray(sources);
  // If only one source was passed, just return it. Otherwise return the race.
  return sources.length === 1 ? innerFrom(sources[0] as ObservableInput<T>) : new Observable<T>(raceInit(sources as ObservableInput<T>[]));
}

/**
 * An observable initializer function for both the static version and the
 * operator version of race.
 * @param sources The sources to race
 */
export function raceInit<T>(sources: ObservableInput<T>[]) {
  return (subscriber: Subscriber<T>) => {
    let subscriptions: Subscription[] = [];

    // Subscribe to all of the sources. Note that we are checking `subscriptions` here
    // Is is an array of all actively "racing" subscriptions, and it is `null` after the
    // race has been won. So, if we have racer that synchronously "wins", this loop will
    // stop before it subscribes to any more.
    for (let i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {
      subscriptions.push(
        innerFrom(sources[i] as ObservableInput<T>).subscribe(
          createOperatorSubscriber(subscriber, (value) => {
            if (subscriptions) {
              // We're still racing, but we won! So unsubscribe
              // all other subscriptions that we have, except this one.
              for (let s = 0; s < subscriptions.length; s++) {
                s !== i && subscriptions[s].unsubscribe();
              }
              subscriptions = null!;
            }
            subscriber.next(value);
          })
        )
      );
    }
  };
}

ܯx
}import { SchedulerLike } from '../types';
import { Observable } from '../Observable';
import { EMPTY } from './empty';

export function range(start: number, count?: number): Observable<number>;

/**
 * @deprecated The `scheduler` parameter will be removed in v8. Use `range(start, count).pipe(observeOn(scheduler))` instead. Details: Details: https://rxjs.dev/deprecations/scheduler-argument
 */
export function range(start: number, count: number | undefined, scheduler: SchedulerLike): Observable<number>;

/**
 * Creates an Observable that emits a sequence of numbers within a specified
 * range.
 *
 * <span class="informal">Emits a sequence of numbers in a range.</span>
 *
 * ![](range.png)
 *
 * `range` operator emits a range of sequential integers, in order, where you
 * select the `start` of the range and its `length`. By default, uses no
 * {@link SchedulerLike} and just delivers the notifications synchronously, but may use
 * an optional {@link SchedulerLike} to regulate those deliveries.
 *
 * ## Example
 *
 * Produce a range of numbers
 *
 * ```ts
 * import { range } from 'rxjs';
 *
 * const numbers = range(1, 3);
 *
 * numbers.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 1
 * // 2
 * // 3
 * // 'Complete!'
 * ```
 *
 * @see {@link timer}
 * @see {@link interval}
 *
 * @param start The value of the first integer in the sequence.
 * @param count The number of sequential integers to generate.
 * @param scheduler A {@link SchedulerLike} to use for scheduling the emissions
 * of the notifications.
 * @return An Observable of numbers that emits a finite range of sequential integers.
 */
export function range(start: number, count?: number, scheduler?: SchedulerLike): Observable<number> {
  if (count == null) {
    // If one argument was passed, it's the count, not the start.
    count = start;
    start = 0;
  }

  if (count <= 0) {
    // No count? We're going nowhere. Return EMPTY.
    return EMPTY;
  }

  // Where the range should stop.
  const end = count + start;

  return new Observable(
    scheduler
      ? // The deprecated scheduled path.
        (subscriber) => {
          let n = start;
          return scheduler.schedule(function () {
            if (n < end) {
              subscriber.next(n++);
              this.schedule();
            } else {
              subscriber.complete();
            }
          });
        }
      : // Standard synchronous range.
        (subscriber) => {
          let n = start;
          while (n < end && !subscriber.closed) {
            subscriber.next(n++);
          }
          subscriber.complete();
        }
  );
}
7	Oxsimport { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { SchedulerLike } from '../types';
import { isFunction } from '../util/isFunction';

/**
 * Creates an observable that will create an error instance and push it to the consumer as an error
 * immediately upon subscription.
 *
 * <span class="informal">Just errors and does nothing else</span>
 *
 * ![](throw.png)
 *
 * This creation function is useful for creating an observable that will create an error and error every
 * time it is subscribed to. Generally, inside of most operators when you might want to return an errored
 * observable, this is unnecessary. In most cases, such as in the inner return of {@link concatMap},
 * {@link mergeMap}, {@link defer}, and many others, you can simply throw the error, and RxJS will pick
 * that up and notify the consumer of the error.
 *
 * ## Example
 *
 * Create a simple observable that will create a new error with a timestamp and log it
 * and the message every time you subscribe to it
 *
 * ```ts
 * import { throwError } from 'rxjs';
 *
 * let errorCount = 0;
 *
 * const errorWithTimestamp$ = throwError(() => {
 *   const error: any = new Error(`This is error number ${ ++errorCount }`);
 *   error.timestamp = Date.now();
 *   return error;
 * });
 *
 * errorWithTimestamp$.subscribe({
 *   error: err => console.log(err.timestamp, err.message)
 * });
 *
 * errorWithTimestamp$.subscribe({
 *   error: err => console.log(err.timestamp, err.message)
 * });
 *
 * // Logs the timestamp and a new error message for each subscription
 * ```
 *
 * ### Unnecessary usage
 *
 * Using `throwError` inside of an operator or creation function
 * with a callback, is usually not necessary
 *
 * ```ts
 * import { of, concatMap, timer, throwError } from 'rxjs';
 *
 * const delays$ = of(1000, 2000, Infinity, 3000);
 *
 * delays$.pipe(
 *   concatMap(ms => {
 *     if (ms < 10000) {
 *       return timer(ms);
 *     } else {
 *       // This is probably overkill.
 *       return throwError(() => new Error(`Invalid time ${ ms }`));
 *     }
 *   })
 * )
 * .subscribe({
 *   next: console.log,
 *   error: console.error
 * });
 * ```
 *
 * You can just throw the error instead
 *
 * ```ts
 * import { of, concatMap, timer } from 'rxjs';
 *
 * const delays$ = of(1000, 2000, Infinity, 3000);
 *
 * delays$.pipe(
 *   concatMap(ms => {
 *     if (ms < 10000) {
 *       return timer(ms);
 *     } else {
 *       // Cleaner and easier to read for most folks.
 *       throw new Error(`Invalid time ${ ms }`);
 *     }
 *   })
 * )
 * .subscribe({
 *   next: console.log,
 *   error: console.error
 * });
 * ```
 *
 * @param errorFactory A factory function that will create the error instance that is pushed.
 */
export function throwError(errorFactory: () => any): Observable<never>;

/**
 * Returns an observable that will error with the specified error immediately upon subscription.
 *
 * @param error The error instance to emit
 * @deprecated Support for passing an error value will be removed in v8. Instead, pass a factory function to `throwError(() => new Error('test'))`. This is
 * because it will create the error at the moment it should be created and capture a more appropriate stack trace. If
 * for some reason you need to create the error ahead of time, you can still do that: `const err = new Error('test'); throwError(() => err);`.
 */
export function throwError(error: any): Observable<never>;

/**
 * Notifies the consumer of an error using a given scheduler by scheduling it at delay `0` upon subscription.
 *
 * @param errorOrErrorFactory An error instance or error factory
 * @param scheduler A scheduler to use to schedule the error notification
 * @deprecated The `scheduler` parameter will be removed in v8.
 * Use `throwError` in combination with {@link observeOn}: `throwError(() => new Error('test')).pipe(observeOn(scheduler));`.
 * Details: https://rxjs.dev/deprecations/scheduler-argument
 */
export function throwError(errorOrErrorFactory: any, scheduler: SchedulerLike): Observable<never>;

export function throwError(errorOrErrorFactory: any, scheduler?: SchedulerLike): Observable<never> {
  const errorFactory = isFunction(errorOrErrorFactory) ? errorOrErrorFactory : () => errorOrErrorFactory;
  const init = (subscriber: Subscriber<never>) => subscriber.error(errorFactory());
  return new Observable(scheduler ? (subscriber) => scheduler.schedule(init as any, 0, subscriber) : init);
}
Txlimport { Observable } from '../Observable';
import { SchedulerLike } from '../types';
import { async as asyncScheduler } from '../scheduler/async';
import { isScheduler } from '../util/isScheduler';
import { isValidDate } from '../util/isDate';

/**
 * Creates an observable that will wait for a specified time period, or exact date, before
 * emitting the number 0.
 *
 * <span class="informal">Used to emit a notification after a delay.</span>
 *
 * This observable is useful for creating delays in code, or racing against other values
 * for ad-hoc timeouts.
 *
 * The `delay` is specified by default in milliseconds, however providing a custom scheduler could
 * create a different behavior.
 *
 * ## Examples
 *
 * Wait 3 seconds and start another observable
 *
 * You might want to use `timer` to delay subscription to an
 * observable by a set amount of time. Here we use a timer with
 * {@link concatMapTo} or {@link concatMap} in order to wait
 * a few seconds and start a subscription to a source.
 *
 * ```ts
 * import { of, timer, concatMap } from 'rxjs';
 *
 * // This could be any observable
 * const source = of(1, 2, 3);
 *
 * timer(3000)
 *   .pipe(concatMap(() => source))
 *   .subscribe(console.log);
 * ```
 *
 * Take all values until the start of the next minute
 *
 * Using a `Date` as the trigger for the first emission, you can
 * do things like wait until midnight to fire an event, or in this case,
 * wait until a new minute starts (chosen so the example wouldn't take
 * too long to run) in order to stop watching a stream. Leveraging
 * {@link takeUntil}.
 *
 * ```ts
 * import { interval, takeUntil, timer } from 'rxjs';
 *
 * // Build a Date object that marks the
 * // next minute.
 * const currentDate = new Date();
 * const startOfNextMinute = new Date(
 *   currentDate.getFullYear(),
 *   currentDate.getMonth(),
 *   currentDate.getDate(),
 *   currentDate.getHours(),
 *   currentDate.getMinutes() + 1
 * );
 *
 * // This could be any observable stream
 * const source = interval(1000);
 *
 * const result = source.pipe(
 *   takeUntil(timer(startOfNextMinute))
 * );
 *
 * result.subscribe(console.log);
 * ```
 *
 * ### Known Limitations
 *
 * - The {@link asyncScheduler} uses `setTimeout` which has limitations for how far in the future it can be scheduled.
 *
 * - If a `scheduler` is provided that returns a timestamp other than an epoch from `now()`, and
 * a `Date` object is passed to the `dueTime` argument, the calculation for when the first emission
 * should occur will be incorrect. In this case, it would be best to do your own calculations
 * ahead of time, and pass a `number` in as the `dueTime`.
 *
 * @param due If a `number`, the amount of time in milliseconds to wait before emitting.
 * If a `Date`, the exact time at which to emit.
 * @param scheduler The scheduler to use to schedule the delay. Defaults to {@link asyncScheduler}.
 */
export function timer(due: number | Date, scheduler?: SchedulerLike): Observable<0>;

/**
 * Creates an observable that starts an interval after a specified delay, emitting incrementing numbers -- starting at `0` --
 * on each interval after words.
 *
 * The `delay` and `intervalDuration` are specified by default in milliseconds, however providing a custom scheduler could
 * create a different behavior.
 *
 * ## Example
 *
 * ### Start an interval that starts right away
 *
 * Since {@link interval} waits for the passed delay before starting,
 * sometimes that's not ideal. You may want to start an interval immediately.
 * `timer` works well for this. Here we have both side-by-side so you can
 * see them in comparison.
 *
 * Note that this observable will never complete.
 *
 * ```ts
 * import { timer, interval } from 'rxjs';
 *
 * timer(0, 1000).subscribe(n => console.log('timer', n));
 * interval(1000).subscribe(n => console.log('interval', n));
 * ```
 *
 * ### Known Limitations
 *
 * - The {@link asyncScheduler} uses `setTimeout` which has limitations for how far in the future it can be scheduled.
 *
 * - If a `scheduler` is provided that returns a timestamp other than an epoch from `now()`, and
 * a `Date` object is passed to the `dueTime` argument, the calculation for when the first emission
 * should occur will be incorrect. In this case, it would be best to do your own calculations
 * ahead of time, and pass a `number` in as the `startDue`.
 * @param startDue If a `number`, is the time to wait before starting the interval.
 * If a `Date`, is the exact time at which to start the interval.
 * @param intervalDuration The delay between each value emitted in the interval. Passing a
 * negative number here will result in immediate completion after the first value is emitted, as though
 * no `intervalDuration` was passed at all.
 * @param scheduler The scheduler to use to schedule the delay. Defaults to {@link asyncScheduler}.
 */
export function timer(startDue: number | Date, intervalDuration: number, scheduler?: SchedulerLike): Observable<number>;

/**
 * @deprecated The signature allowing `undefined` to be passed for `intervalDuration` will be removed in v8. Use the `timer(dueTime, scheduler?)` signature instead.
 */
export function timer(dueTime: number | Date, unused: undefined, scheduler?: SchedulerLike): Observable<0>;

export function timer(
  dueTime: number | Date = 0,
  intervalOrScheduler?: number | SchedulerLike,
  scheduler: SchedulerLike = asyncScheduler
): Observable<number> {
  // Since negative intervalDuration is treated as though no
  // interval was specified at all, we start with a negative number.
  let intervalDuration = -1;

  if (intervalOrScheduler != null) {
    // If we have a second argument, and it's a scheduler,
    // override the scheduler we had defaulted. Otherwise,
    // it must be an interval.
    if (isScheduler(intervalOrScheduler)) {
      scheduler = intervalOrScheduler;
    } else {
      // Note that this *could* be negative, in which case
      // it's like not passing an intervalDuration at all.
      intervalDuration = intervalOrScheduler;
    }
  }

  return new Observable((subscriber) => {
    // If a valid date is passed, calculate how long to wait before
    // executing the first value... otherwise, if it's a number just schedule
    // that many milliseconds (or scheduler-specified unit size) in the future.
    let due = isValidDate(dueTime) ? +dueTime - scheduler!.now() : dueTime;

    if (due < 0) {
      // Ensure we don't schedule in the future.
      due = 0;
    }

    // The incrementing value we emit.
    let n = 0;

    // Start the timer.
    return scheduler.schedule(function () {
      if (!subscriber.closed) {
        // Emit the next value and increment.
        subscriber.next(n++);

        if (0 <= intervalDuration) {
          // If we have a interval after the initial timer,
          // reschedule with the period.
          this.schedule(undefined, intervalDuration);
        } else {
          // We didn't have an interval. So just complete.
          subscriber.complete();
        }
      }
    }, due);
  });
}
-زx2import { Observable } from '../Observable';
import { Unsubscribable, ObservableInput, ObservedValueOf } from '../types';
import { innerFrom } from './innerFrom';
import { EMPTY } from './empty';

/**
 * Creates an Observable that uses a resource which will be disposed at the same time as the Observable.
 *
 * <span class="informal">Use it when you catch yourself cleaning up after an Observable.</span>
 *
 * `using` is a factory operator, which accepts two functions. First function returns a disposable resource.
 * It can be an arbitrary object that implements `unsubscribe` method. Second function will be injected with
 * that object and should return an Observable. That Observable can use resource object during its execution.
 * Both functions passed to `using` will be called every time someone subscribes - neither an Observable nor
 * resource object will be shared in any way between subscriptions.
 *
 * When Observable returned by `using` is subscribed, Observable returned from the second function will be subscribed
 * as well. All its notifications (nexted values, completion and error events) will be emitted unchanged by the output
 * Observable. If however someone unsubscribes from the Observable or source Observable completes or errors by itself,
 * the `unsubscribe` method on resource object will be called. This can be used to do any necessary clean up, which
 * otherwise would have to be handled by hand. Note that complete or error notifications are not emitted when someone
 * cancels subscription to an Observable via `unsubscribe`, so `using` can be used as a hook, allowing you to make
 * sure that all resources which need to exist during an Observable execution will be disposed at appropriate time.
 *
 * @see {@link defer}
 *
 * @param resourceFactory A function which creates any resource object that implements `unsubscribe` method.
 * @param observableFactory A function which creates an Observable, that can use injected resource object.
 * @return An Observable that behaves the same as Observable returned by `observableFactory`, but
 * which - when completed, errored or unsubscribed - will also call `unsubscribe` on created resource object.
 */
export function using<T extends ObservableInput<any>>(
  resourceFactory: () => Unsubscribable | void,
  observableFactory: (resource: Unsubscribable | void) => T | void
): Observable<ObservedValueOf<T>> {
  return new Observable<ObservedValueOf<T>>((subscriber) => {
    const resource = resourceFactory();
    const result = observableFactory(resource);
    const source = result ? innerFrom(result) : EMPTY;
    source.subscribe(subscriber);
    return () => {
      // NOTE: Optional chaining did not work here.
      // Related TS Issue: https://github.com/microsoft/TypeScript/issues/40818
      if (resource) {
        resource.unsubscribe();
      }
    };
  });
}
Q껾x~import { Observable } from '../Observable';
import { ObservableInputTuple } from '../types';
import { innerFrom } from './innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { EMPTY } from './empty';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { popResultSelector } from '../util/args';

export function zip<A extends readonly unknown[]>(sources: [...ObservableInputTuple<A>]): Observable<A>;
export function zip<A extends readonly unknown[], R>(
  sources: [...ObservableInputTuple<A>],
  resultSelector: (...values: A) => R
): Observable<R>;
export function zip<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A>;
export function zip<A extends readonly unknown[], R>(
  ...sourcesAndResultSelector: [...ObservableInputTuple<A>, (...values: A) => R]
): Observable<R>;

/**
 * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each
 * of its input Observables.
 *
 * If the last parameter is a function, this function is used to compute the created value from the input values.
 * Otherwise, an array of the input values is returned.
 *
 * ## Example
 *
 * Combine age and name from different sources
 *
 * ```ts
 * import { of, zip, map } from 'rxjs';
 *
 * const age$ = of(27, 25, 29);
 * const name$ = of('Foo', 'Bar', 'Beer');
 * const isDev$ = of(true, true, false);
 *
 * zip(age$, name$, isDev$).pipe(
 *   map(([age, name, isDev]) => ({ age, name, isDev }))
 * )
 * .subscribe(x => console.log(x));
 *
 * // Outputs
 * // { age: 27, name: 'Foo', isDev: true }
 * // { age: 25, name: 'Bar', isDev: true }
 * // { age: 29, name: 'Beer', isDev: false }
 * ```
 *
 * @param args Any number of `ObservableInput`s provided either as an array or as an object
 * to combine with each other.
 * @return An Observable of array values of the values emitted at the same index from each
 * individual `ObservableInput`.
 */
export function zip(...args: unknown[]): Observable<unknown> {
  const resultSelector = popResultSelector(args);

  const sources = argsOrArgArray(args) as Observable<unknown>[];

  return sources.length
    ? new Observable<unknown[]>((subscriber) => {
        // A collection of buffers of values from each source.
        // Keyed by the same index with which the sources were passed in.
        let buffers: unknown[][] = sources.map(() => []);

        // An array of flags of whether or not the sources have completed.
        // This is used to check to see if we should complete the result.
        // Keyed by the same index with which the sources were passed in.
        let completed = sources.map(() => false);

        // When everything is done, release the arrays above.
        subscriber.add(() => {
          buffers = completed = null!;
        });

        // Loop over our sources and subscribe to each one. The index `i` is
        // especially important here, because we use it in closures below to
        // access the related buffers and completion properties
        for (let sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
          innerFrom(sources[sourceIndex]).subscribe(
            createOperatorSubscriber(
              subscriber,
              (value) => {
                buffers[sourceIndex].push(value);
                // if every buffer has at least one value in it, then we
                // can shift out the oldest value from each buffer and emit
                // them as an array.
                if (buffers.every((buffer) => buffer.length)) {
                  const result: any = buffers.map((buffer) => buffer.shift()!);
                  // Emit the array. If theres' a result selector, use that.
                  subscriber.next(resultSelector ? resultSelector(...result) : result);
                  // If any one of the sources is both complete and has an empty buffer
                  // then we complete the result. This is because we cannot possibly have
                  // any more values to zip together.
                  if (buffers.some((buffer, i) => !buffer.length && completed[i])) {
                    subscriber.complete();
                  }
                }
              },
              () => {
                // This source completed. Mark it as complete so we can check it later
                // if we have to.
                completed[sourceIndex] = true;
                // But, if this complete source has nothing in its buffer, then we
                // can complete the result, because we can't possibly have any more
                // values from this to zip together with the other values.
                !buffers[sourceIndex].length && subscriber.complete();
              }
            )
          );
        }

        // When everything is done, release the arrays above.
        return () => {
          buffers = completed = null!;
        };
      })
    : EMPTY;
}
8~xYimport { Subscriber } from '../Subscriber';

/**
 * Creates an instance of an `OperatorSubscriber`.
 * @param destination The downstream subscriber.
 * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any
 * error that occurs in this function is caught and sent to the `error` method of this subscriber.
 * @param onError Handles errors from the subscription, any errors that occur in this handler are caught
 * and send to the `destination` error handler.
 * @param onComplete Handles completion notification from the subscription. Any errors that occur in
 * this handler are sent to the `destination` error handler.
 * @param onFinalize Additional teardown logic here. This will only be called on teardown if the
 * subscriber itself is not already closed. This is called after all other teardown logic is executed.
 */
export function createOperatorSubscriber<T>(
  destination: Subscriber<any>,
  onNext?: (value: T) => void,
  onComplete?: () => void,
  onError?: (err: any) => void,
  onFinalize?: () => void
): Subscriber<T> {
  return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
}

/**
 * A generic helper for allowing operators to be created with a Subscriber and
 * use closures to capture necessary state from the operator function itself.
 */
export class OperatorSubscriber<T> extends Subscriber<T> {
  /**
   * Creates an instance of an `OperatorSubscriber`.
   * @param destination The downstream subscriber.
   * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any
   * error that occurs in this function is caught and sent to the `error` method of this subscriber.
   * @param onError Handles errors from the subscription, any errors that occur in this handler are caught
   * and send to the `destination` error handler.
   * @param onComplete Handles completion notification from the subscription. Any errors that occur in
   * this handler are sent to the `destination` error handler.
   * @param onFinalize Additional finalization logic here. This will only be called on finalization if the
   * subscriber itself is not already closed. This is called after all other finalization logic is executed.
   * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.
   * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription
   * to the resulting observable does not actually disconnect from the source if there are active subscriptions
   * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)
   */
  constructor(
    destination: Subscriber<any>,
    onNext?: (value: T) => void,
    onComplete?: () => void,
    onError?: (err: any) => void,
    private onFinalize?: () => void,
    private shouldUnsubscribe?: () => boolean
  ) {
    // It's important - for performance reasons - that all of this class's
    // members are initialized and that they are always initialized in the same
    // order. This will ensure that all OperatorSubscriber instances have the
    // same hidden class in V8. This, in turn, will help keep the number of
    // hidden classes involved in property accesses within the base class as
    // low as possible. If the number of hidden classes involved exceeds four,
    // the property accesses will become megamorphic and performance penalties
    // will be incurred - i.e. inline caches won't be used.
    //
    // The reasons for ensuring all instances have the same hidden class are
    // further discussed in this blog post from Benedikt Meurer:
    // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/
    super(destination);
    this._next = onNext
      ? function (this: OperatorSubscriber<T>, value: T) {
          try {
            onNext(value);
          } catch (err) {
            destination.error(err);
          }
        }
      : super._next;
    this._error = onError
      ? function (this: OperatorSubscriber<T>, err: any) {
          try {
            onError(err);
          } catch (err) {
            // Send any errors that occur down stream.
            destination.error(err);
          } finally {
            // Ensure finalization.
            this.unsubscribe();
          }
        }
      : super._error;
    this._complete = onComplete
      ? function (this: OperatorSubscriber<T>) {
          try {
            onComplete();
          } catch (err) {
            // Send any errors that occur down stream.
            destination.error(err);
          } finally {
            // Ensure finalization.
            this.unsubscribe();
          }
        }
      : super._complete;
  }

  unsubscribe() {
    if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
      const { closed } = this;
      super.unsubscribe();
      // Execute additional teardown if we have any and we didn't already do so.
      !closed && this.onFinalize?.();
    }
  }
}
1wux!import { Subscriber } from '../Subscriber';
import { MonoTypeOperatorFunction, ObservableInput } from '../types';

import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Ignores source values for a duration determined by another Observable, then
 * emits the most recent value from the source Observable, then repeats this
 * process.
 *
 * <span class="informal">It's like {@link auditTime}, but the silencing
 * duration is determined by a second Observable.</span>
 *
 * ![](audit.svg)
 *
 * `audit` is similar to `throttle`, but emits the last value from the silenced
 * time window, instead of the first value. `audit` emits the most recent value
 * from the source Observable on the output Observable as soon as its internal
 * timer becomes disabled, and ignores source values while the timer is enabled.
 * Initially, the timer is disabled. As soon as the first source value arrives,
 * the timer is enabled by calling the `durationSelector` function with the
 * source value, which returns the "duration" Observable. When the duration
 * Observable emits a value, the timer is disabled, then the most
 * recent source value is emitted on the output Observable, and this process
 * repeats for the next source value.
 *
 * ## Example
 *
 * Emit clicks at a rate of at most one click per second
 *
 * ```ts
 * import { fromEvent, audit, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(audit(ev => interval(1000)));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link auditTime}
 * @see {@link debounce}
 * @see {@link delayWhen}
 * @see {@link sample}
 * @see {@link throttle}
 *
 * @param durationSelector A function
 * that receives a value from the source Observable, for computing the silencing
 * duration, returned as an Observable or a Promise.
 * @return A function that returns an Observable that performs rate-limiting of
 * emissions from the source Observable.
 */
export function audit<T>(durationSelector: (value: T) => ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    let lastValue: T | null = null;
    let durationSubscriber: Subscriber<any> | null = null;
    let isComplete = false;

    const endDuration = () => {
      durationSubscriber?.unsubscribe();
      durationSubscriber = null;
      if (hasValue) {
        hasValue = false;
        const value = lastValue!;
        lastValue = null;
        subscriber.next(value);
      }
      isComplete && subscriber.complete();
    };

    const cleanupDuration = () => {
      durationSubscriber = null;
      isComplete && subscriber.complete();
    };

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          hasValue = true;
          lastValue = value;
          if (!durationSubscriber) {
            innerFrom(durationSelector(value)).subscribe(
              (durationSubscriber = createOperatorSubscriber(subscriber, endDuration, cleanupDuration))
            );
          }
        },
        () => {
          isComplete = true;
          (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
        }
      )
    );
  });
}
AQUx0	import { asyncScheduler } from '../scheduler/async';
import { audit } from './audit';
import { timer } from '../observable/timer';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';

/**
 * Ignores source values for `duration` milliseconds, then emits the most recent
 * value from the source Observable, then repeats this process.
 *
 * <span class="informal">When it sees a source value, it ignores that plus
 * the next ones for `duration` milliseconds, and then it emits the most recent
 * value from the source.</span>
 *
 * ![](auditTime.png)
 *
 * `auditTime` is similar to `throttleTime`, but emits the last value from the
 * silenced time window, instead of the first value. `auditTime` emits the most
 * recent value from the source Observable on the output Observable as soon as
 * its internal timer becomes disabled, and ignores source values while the
 * timer is enabled. Initially, the timer is disabled. As soon as the first
 * source value arrives, the timer is enabled. After `duration` milliseconds (or
 * the time unit determined internally by the optional `scheduler`) has passed,
 * the timer is disabled, then the most recent source value is emitted on the
 * output Observable, and this process repeats for the next source value.
 * Optionally takes a {@link SchedulerLike} for managing timers.
 *
 * ## Example
 *
 * Emit clicks at a rate of at most one click per second
 *
 * ```ts
 * import { fromEvent, auditTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(auditTime(1000));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link debounceTime}
 * @see {@link delay}
 * @see {@link sampleTime}
 * @see {@link throttleTime}
 *
 * @param duration Time to wait before emitting the most recent source value,
 * measured in milliseconds or the time unit determined internally by the
 * optional `scheduler`.
 * @param scheduler The {@link SchedulerLike} to use for managing the timers
 * that handle the rate-limiting behavior.
 * @return A function that returns an Observable that performs rate-limiting of
 * emissions from the source Observable.
 */
export function auditTime<T>(duration: number, scheduler: SchedulerLike = asyncScheduler): MonoTypeOperatorFunction<T> {
  return audit(() => timer(duration, scheduler));
}
G0D>xM>+throttle, ThrottleConfig } from './throttleGV-
/**
 * Emits a!@ignores subsequent source
 **G3Lets a value pass, then ithe
 * next.</span>
 *
 * ![](throttleTime.png)
 *
 * `throttleTime` emits the source Observable values on the output Observable
 * when its internal timer iC(en the timer
 *{C0 source
 * value arrives, it is forwarded to theen the timer
 *. the time unit determined
 *+4,
 *4 Optionally takes a
 *<s
 *
 * ### Limit click ratHathrottleethrottleTime(1000));
 *$ITimemg5/another value after
 * emitting the last value,-5
 *+':
 * managing the timers that handle the throttling. Defaults to {@link asyncScheduler}.
 * @param config A configuration objecta to define `leading` and
 * `trailing` behavior. Defaults to `{ leading: true, trailing: false }`Athe throttle
 * operation to limit the rate of emissions from the source.
 */
export function throttleTime<T>(
  duration: number,
 *,
  config?: ThrottleConfig
#const duration$ =	0;
  return throttle(() => duration$, config);
}
Xq칙x	fimport { OperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * Buffers the source Observable values until `closingNotifier` emits.
 *
 * <span class="informal">Collects values from the past as an array, and emits
 * that array only when another Observable emits.</span>
 *
 * ![](buffer.png)
 *
 * Buffers the incoming Observable values until the given `closingNotifier`
 * `ObservableInput` (that internally gets converted to an Observable)
 * emits a value, at which point it emits the buffer on the output
 * Observable and starts a new buffer internally, awaiting the next time
 * `closingNotifier` emits.
 *
 * ## Example
 *
 * On every click, emit array of most recent interval events
 *
 * ```ts
 * import { fromEvent, interval, buffer } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const intervalEvents = interval(1000);
 * const buffered = intervalEvents.pipe(buffer(clicks));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link bufferCount}
 * @see {@link bufferTime}
 * @see {@link bufferToggle}
 * @see {@link bufferWhen}
 * @see {@link window}
 *
 * @param closingNotifier An `ObservableInput` that signals the
 * buffer to be emitted on the output Observable.
 * @return A function that returns an Observable of buffers, which are arrays
 * of values.
 */
export function buffer<T>(closingNotifier: ObservableInput<any>): OperatorFunction<T, T[]> {
  return operate((source, subscriber) => {
    // The current buffered values.
    let currentBuffer: T[] = [];

    // Subscribe to our source.
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => currentBuffer.push(value),
        () => {
          subscriber.next(currentBuffer);
          subscriber.complete();
        }
      )
    );

    // Subscribe to the closing notifier.
    innerFrom(closingNotifier).subscribe(
      createOperatorSubscriber(
        subscriber,
        () => {
          // Start a new buffer and emit the previous one.
          const b = currentBuffer;
          currentBuffer = [];
          subscriber.next(b);
        },
        noop
      )
    );

    return () => {
      // Ensure buffered values are released on finalization.
      currentBuffer = null!;
    };
  });
}
ղxMimport { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';

/**
 * Buffers the source Observable values until the size hits the maximum
 * `bufferSize` given.
 *
 * <span class="informal">Collects values from the past as an array, and emits
 * that array only when its size reaches `bufferSize`.</span>
 *
 * ![](bufferCount.png)
 *
 * Buffers a number of values from the source Observable by `bufferSize` then
 * emits the buffer and clears it, and starts a new buffer each
 * `startBufferEvery` values. If `startBufferEvery` is not provided or is
 * `null`, then new buffers are started immediately at the start of the source
 * and when each buffer closes and is emitted.
 *
 * ## Examples
 *
 * Emit the last two click events as an array
 *
 * ```ts
 * import { fromEvent, bufferCount } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(bufferCount(2));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * On every click, emit the last two click events as an array
 *
 * ```ts
 * import { fromEvent, bufferCount } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(bufferCount(2, 1));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferTime}
 * @see {@link bufferToggle}
 * @see {@link bufferWhen}
 * @see {@link pairwise}
 * @see {@link windowCount}
 *
 * @param bufferSize The maximum size of the buffer emitted.
 * @param startBufferEvery Interval at which to start a new buffer.
 * For example if `startBufferEvery` is `2`, then a new buffer will be started
 * on every other value from the source. A new buffer is started at the
 * beginning of the source by default.
 * @return A function that returns an Observable of arrays of buffered values.
 */
export function bufferCount<T>(bufferSize: number, startBufferEvery: number | null = null): OperatorFunction<T, T[]> {
  // If no `startBufferEvery` value was supplied, then we're
  // opening and closing on the bufferSize itself.
  startBufferEvery = startBufferEvery ?? bufferSize;

  return operate((source, subscriber) => {
    let buffers: T[][] = [];
    let count = 0;

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          let toEmit: T[][] | null = null;

          // Check to see if we need to start a buffer.
          // This will start one at the first value, and then
          // a new one every N after that.
          if (count++ % startBufferEvery! === 0) {
            buffers.push([]);
          }

          // Push our value into our active buffers.
          for (const buffer of buffers) {
            buffer.push(value);
            // Check to see if we're over the bufferSize
            // if we are, record it so we can emit it later.
            // If we emitted it now and removed it, it would
            // mutate the `buffers` array while we're looping
            // over it.
            if (bufferSize <= buffer.length) {
              toEmit = toEmit ?? [];
              toEmit.push(buffer);
            }
          }

          if (toEmit) {
            // We have found some buffers that are over the
            // `bufferSize`. Emit them, and remove them from our
            // buffers list.
            for (const buffer of toEmit) {
              arrRemove(buffers, buffer);
              subscriber.next(buffer);
            }
          }
        },
        () => {
          // When the source completes, emit all of our
          // active buffers.
          for (const buffer of buffers) {
            subscriber.next(buffer);
          }
          subscriber.complete();
        },
        // Pass all errors through to consumer.
        undefined,
        () => {
          // Clean up our memory when we finalize
          buffers = null!;
        }
      )
    );
  });
}
v᰾x1import { Subscription } from '../Subscription';
import { OperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
import { asyncScheduler } from '../scheduler/async';
import { popScheduler } from '../util/args';
import { executeSchedule } from '../util/executeSchedule';

export function bufferTime<T>(bufferTimeSpan: number, scheduler?: SchedulerLike): OperatorFunction<T, T[]>;
export function bufferTime<T>(
  bufferTimeSpan: number,
  bufferCreationInterval: number | null | undefined,
  scheduler?: SchedulerLike
): OperatorFunction<T, T[]>;
export function bufferTime<T>(
  bufferTimeSpan: number,
  bufferCreationInterval: number | null | undefined,
  maxBufferSize: number,
  scheduler?: SchedulerLike
): OperatorFunction<T, T[]>;

/**
 * Buffers the source Observable values for a specific time period.
 *
 * <span class="informal">Collects values from the past as an array, and emits
 * those arrays periodically in time.</span>
 *
 * ![](bufferTime.png)
 *
 * Buffers values from the source for a specific time duration `bufferTimeSpan`.
 * Unless the optional argument `bufferCreationInterval` is given, it emits and
 * resets the buffer every `bufferTimeSpan` milliseconds. If
 * `bufferCreationInterval` is given, this operator opens the buffer every
 * `bufferCreationInterval` milliseconds and closes (emits and resets) the
 * buffer every `bufferTimeSpan` milliseconds. When the optional argument
 * `maxBufferSize` is specified, the buffer will be closed either after
 * `bufferTimeSpan` milliseconds or when it contains `maxBufferSize` elements.
 *
 * ## Examples
 *
 * Every second, emit an array of the recent click events
 *
 * ```ts
 * import { fromEvent, bufferTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(bufferTime(1000));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * Every 5 seconds, emit the click events from the next 2 seconds
 *
 * ```ts
 * import { fromEvent, bufferTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(bufferTime(2000, 5000));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferCount}
 * @see {@link bufferToggle}
 * @see {@link bufferWhen}
 * @see {@link windowTime}
 *
 * @param bufferTimeSpan The amount of time to fill each buffer array.
 * @param otherArgs Other configuration arguments such as:
 * - `bufferCreationInterval` - the interval at which to start new buffers;
 * - `maxBufferSize` - the maximum buffer size;
 * - `scheduler` - the scheduler on which to schedule the intervals that determine buffer boundaries.
 * @return A function that returns an Observable of arrays of buffered values.
 */
export function bufferTime<T>(bufferTimeSpan: number, ...otherArgs: any[]): OperatorFunction<T, T[]> {
  const scheduler = popScheduler(otherArgs) ?? asyncScheduler;
  const bufferCreationInterval = (otherArgs[0] as number) ?? null;
  const maxBufferSize = (otherArgs[1] as number) || Infinity;

  return operate((source, subscriber) => {
    // The active buffers, their related subscriptions, and removal functions.
    let bufferRecords: { buffer: T[]; subs: Subscription }[] | null = [];
    // If true, it means that every time we emit a buffer, we want to start a new buffer
    // this is only really used for when *just* the buffer time span is passed.
    let restartOnEmit = false;

    /**
     * Does the work of emitting the buffer from the record, ensuring that the
     * record is removed before the emission so reentrant code (from some custom scheduling, perhaps)
     * does not alter the buffer. Also checks to see if a new buffer needs to be started
     * after the emit.
     */
    const emit = (record: { buffer: T[]; subs: Subscription }) => {
      const { buffer, subs } = record;
      subs.unsubscribe();
      arrRemove(bufferRecords, record);
      subscriber.next(buffer);
      restartOnEmit && startBuffer();
    };

    /**
     * Called every time we start a new buffer. This does
     * the work of scheduling a job at the requested bufferTimeSpan
     * that will emit the buffer (if it's not unsubscribed before then).
     */
    const startBuffer = () => {
      if (bufferRecords) {
        const subs = new Subscription();
        subscriber.add(subs);
        const buffer: T[] = [];
        const record = {
          buffer,
          subs,
        };
        bufferRecords.push(record);
        executeSchedule(subs, scheduler, () => emit(record), bufferTimeSpan);
      }
    };

    if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {
      // The user passed both a bufferTimeSpan (required), and a creation interval
      // That means we need to start new buffers on the interval, and those buffers need
      // to wait the required time span before emitting.
      executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);
    } else {
      restartOnEmit = true;
    }

    startBuffer();

    const bufferTimeSubscriber = createOperatorSubscriber(
      subscriber,
      (value: T) => {
        // Copy the records, so if we need to remove one we
        // don't mutate the array. It's hard, but not impossible to
        // set up a buffer time that could mutate the array and
        // cause issues here.
        const recordsCopy = bufferRecords!.slice();
        for (const record of recordsCopy) {
          // Loop over all buffers and
          const { buffer } = record;
          buffer.push(value);
          // If the buffer is over the max size, we need to emit it.
          maxBufferSize <= buffer.length && emit(record);
        }
      },
      () => {
        // The source completed, emit all of the active
        // buffers we have before we complete.
        while (bufferRecords?.length) {
          subscriber.next(bufferRecords.shift()!.buffer);
        }
        bufferTimeSubscriber?.unsubscribe();
        subscriber.complete();
        subscriber.unsubscribe();
      },
      // Pass all errors through to consumer.
      undefined,
      // Clean up
      () => (bufferRecords = null)
    );

    source.subscribe(bufferTimeSubscriber);
  });
}
Nq'xNimport { Observable } from '../Observable';
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';
import { ObservableInput, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { arrRemove } from '../util/arrRemove';

/**
 * Branch out the source Observable values as a nested Observable starting from
 * an emission from `openings` and ending when the output of `closingSelector`
 * emits.
 *
 * <span class="informal">It's like {@link bufferToggle}, but emits a nested
 * Observable instead of an array.</span>
 *
 * ![](windowToggle.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable emits windows that contain those items
 * emitted by the source Observable between the time when the `openings`
 * Observable emits an item and when the Observable returned by
 * `closingSelector` emits an item.
 *
 * ## Example
 *
 * Every other second, emit the click events from the next 500ms
 *
 * ```ts
 * import { fromEvent, interval, windowToggle, EMPTY, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const openings = interval(1000);
 * const result = clicks.pipe(
 *   windowToggle(openings, i => i % 2 ? interval(500) : EMPTY),
 *   mergeAll()
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link window}
 * @see {@link windowCount}
 * @see {@link windowTime}
 * @see {@link windowWhen}
 * @see {@link bufferToggle}
 *
 * @param openings An observable of notifications to start new windows.
 * @param closingSelector A function that takes the value emitted by the
 * `openings` observable and returns an Observable, which, when it emits a next
 * notification, signals that the associated window should complete.
 * @return A function that returns an Observable of windows, which in turn are
 * Observables.
 */
export function windowToggle<T, O>(
  openings: ObservableInput<O>,
  closingSelector: (openValue: O) => ObservableInput<any>
): OperatorFunction<T, Observable<T>> {
  return operate((source, subscriber) => {
    const windows: Subject<T>[] = [];

    const handleError = (err: any) => {
      while (0 < windows.length) {
        windows.shift()!.error(err);
      }
      subscriber.error(err);
    };

    innerFrom(openings).subscribe(
      createOperatorSubscriber(
        subscriber,
        (openValue) => {
          const window = new Subject<T>();
          windows.push(window);
          const closingSubscription = new Subscription();
          const closeWindow = () => {
            arrRemove(windows, window);
            window.complete();
            closingSubscription.unsubscribe();
          };

          let closingNotifier: Observable<any>;
          try {
            closingNotifier = innerFrom(closingSelector(openValue));
          } catch (err) {
            handleError(err);
            return;
          }

          subscriber.next(window.asObservable());

          closingSubscription.add(closingNotifier.subscribe(createOperatorSubscriber(subscriber, closeWindow, noop, handleError)));
        },
        noop
      )
    );

    // Subscribe to the source to get things started.
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // Copy the windows array before we emit to
          // make sure we don't have issues with reentrant code.
          const windowsCopy = windows.slice();
          for (const window of windowsCopy) {
            window.next(value);
          }
        },
        () => {
          // Complete all of our windows before we complete.
          while (0 < windows.length) {
            windows.shift()!.complete();
          }
          subscriber.complete();
        },
        handleError,
        () => {
          // Add this finalization so that all window subjects are
          // disposed of. This way, if a user tries to subscribe
          // to a window *after* the outer subscription has been unsubscribed,
          // they will get an error, instead of waiting forever to
          // see if a value arrives.
          while (0 < windows.length) {
            windows.shift()!.unsubscribe();
          }
        }
      )
    );
  });
}
Xzl\x="R: peratorFunction, ObservableInputEuffers the source Observable values starting from an emission from
 *;X%Collects values from the past as an array. Starts
 * collecting only when `opening` emits, and calls the `closingSelector`
 * f@unction to get an Observable that tells when to close the bufferbufferToggle.png)
 *
 * Buffers values from the source by opening the buffer via signals from an
 * Observable provided to `ope]nings`, and closing and sending the buffers when
 * a Subscribable or Promise returned by the!function emitsAbufferToggle, EMPTYp7buffered = clicks.pipe(bufferToggle(openings, i =>
 *  
 * ));
 * buffered:buffer}
 * @see {@link buffer%bufferTime}
 * @see {@link bufferWhen?q Subscribable or Promis

 * buffer2
 * the value emitted by the$ Subscribable or Promise,
 *@l'buffer should be emitted
 * and cleared6arrays of buffered valubufferBvb8T[]9Ebuffers: T[][] = [];

    // Subscribe to the openings notifier first	buffer: T[] = [];
          buffers.push(buffer);
          // We use this composite subscription, so that
          // when th.e closing notifier emits, we can tear it down.T
;
          const emitBuffer
!4buffers, buffer);
            subscriber.next(buffer
Je// The line below will add the subscription to the parent subscriber *and* the closing subscription.

add(%{0emitBuffer, noop))`0T
// Value from our source. Add it to all pending buffers.
          for (const buffer of buffers) {
            buffer.push(valu~8Source complete. Emit all pending buffers.
          while (buffers.length > 0) {
            subscriber.next(buffers.shift()!)J"6dDxyimport { Subscriber } from '../Subscriber';
import { ObservableInput, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * Buffers the source Observable values, using a factory function of closing
 * Observables to determine when to close, emit, and reset the buffer.
 *
 * <span class="informal">Collects values from the past as an array. When it
 * starts collecting values, it calls a function that returns an Observable that
 * tells when to close the buffer and restart collecting.</span>
 *
 * ![](bufferWhen.svg)
 *
 * Opens a buffer immediately, then closes the buffer when the observable
 * returned by calling `closingSelector` function emits a value. When it closes
 * the buffer, it immediately opens a new buffer and repeats the process.
 *
 * ## Example
 *
 * Emit an array of the last clicks every [1-5] random seconds
 *
 * ```ts
 * import { fromEvent, bufferWhen, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(
 *   bufferWhen(() => interval(1000 + Math.random() * 4000))
 * );
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferCount}
 * @see {@link bufferTime}
 * @see {@link bufferToggle}
 * @see {@link windowWhen}
 *
 * @param closingSelector A function that takes no arguments and returns an
 * Observable that signals buffer closure.
 * @return A function that returns an Observable of arrays of buffered values.
 */
export function bufferWhen<T>(closingSelector: () => ObservableInput<any>): OperatorFunction<T, T[]> {
  return operate((source, subscriber) => {
    // The buffer we keep and emit.
    let buffer: T[] | null = null;
    // A reference to the subscriber used to subscribe to
    // the closing notifier. We need to hold this so we can
    // end the subscription after the first notification.
    let closingSubscriber: Subscriber<T> | null = null;

    // Ends the previous closing notifier subscription, so it
    // terminates after the first emission, then emits
    // the current buffer  if there is one, starts a new buffer, and starts a
    // new closing notifier.
    const openBuffer = () => {
      // Make sure to finalize the closing subscription, we only cared
      // about one notification.
      closingSubscriber?.unsubscribe();
      // emit the buffer if we have one, and start a new buffer.
      const b = buffer;
      buffer = [];
      b && subscriber.next(b);

      // Get a new closing notifier and subscribe to it.
      innerFrom(closingSelector()).subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openBuffer, noop)));
    };

    // Start the first buffer.
    openBuffer();

    // Subscribe to our source.
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        // Add every new value to the current buffer.
        (value) => buffer?.push(value),
        // When we complete, emit the buffer if we have one,
        // then complete the result.
        () => {
          buffer && subscriber.next(buffer);
          subscriber.complete();
        },
        // Pass all errors through to consumer.
        undefined,
        // Release memory on finalization
        () => (buffer = closingSubscriber = null!)
      )
    );
  });
}
gjxkimport { Observable } from '../Observable';

import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { Subscription } from '../Subscription';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { operate } from '../util/lift';

export function catchError<T, O extends ObservableInput<any>>(
  selector: (err: any, caught: Observable<T>) => O
): OperatorFunction<T, T | ObservedValueOf<O>>;

/**
 * Catches errors on the observable to be handled by returning a new observable or throwing an error.
 *
 * <span class="informal">
 * It only listens to the error channel and ignores notifications.
 * Handles errors from the source observable, and maps them to a new observable.
 * The error may also be rethrown, or a new error can be thrown to emit an error from the result.
 * </span>
 *
 * ![](catch.png)
 *
 * This operator handles errors, but forwards along all other events to the resulting observable.
 * If the source observable terminates with an error, it will map that error to a new observable,
 * subscribe to it, and forward all of its events to the resulting observable.
 *
 * ## Examples
 *
 * Continue with a different Observable when there's an error
 *
 * ```ts
 * import { of, map, catchError } from 'rxjs';
 *
 * of(1, 2, 3, 4, 5)
 *   .pipe(
 *     map(n => {
 *       if (n === 4) {
 *         throw 'four!';
 *       }
 *       return n;
 *     }),
 *     catchError(err => of('I', 'II', 'III', 'IV', 'V'))
 *   )
 *   .subscribe(x => console.log(x));
 *   // 1, 2, 3, I, II, III, IV, V
 * ```
 *
 * Retry the caught source Observable again in case of error, similar to `retry()` operator
 *
 * ```ts
 * import { of, map, catchError, take } from 'rxjs';
 *
 * of(1, 2, 3, 4, 5)
 *   .pipe(
 *     map(n => {
 *       if (n === 4) {
 *         throw 'four!';
 *       }
 *       return n;
 *     }),
 *     catchError((err, caught) => caught),
 *     take(30)
 *   )
 *   .subscribe(x => console.log(x));
 *   // 1, 2, 3, 1, 2, 3, ...
 * ```
 *
 * Throw a new error when the source Observable throws an error
 *
 * ```ts
 * import { of, map, catchError } from 'rxjs';
 *
 * of(1, 2, 3, 4, 5)
 *   .pipe(
 *     map(n => {
 *       if (n === 4) {
 *         throw 'four!';
 *       }
 *       return n;
 *     }),
 *     catchError(err => {
 *       throw 'error in source. Details: ' + err;
 *     })
 *   )
 *   .subscribe({
 *     next: x => console.log(x),
 *     error: err => console.log(err)
 *   });
 *   // 1, 2, 3, error in source. Details: four!
 * ```
 *
 * @see {@link onErrorResumeNext}
 * @see {@link repeat}
 * @see {@link repeatWhen}
 * @see {@link retry }
 * @see {@link retryWhen}
 *
 * @param selector A function that takes as arguments `err`, which is the error, and `caught`, which
 * is the source observable, in case you'd like to "retry" that observable by returning it again.
 * Whatever observable is returned by the `selector` will be used to continue the observable chain.
 * @return A function that returns an Observable that originates from either
 * the source or the Observable returned by the `selector` function.
 */
export function catchError<T, O extends ObservableInput<any>>(
  selector: (err: any, caught: Observable<T>) => O
): OperatorFunction<T, T | ObservedValueOf<O>> {
  return operate((source, subscriber) => {
    let innerSub: Subscription | null = null;
    let syncUnsub = false;
    let handledResult: Observable<ObservedValueOf<O>>;

    innerSub = source.subscribe(
      createOperatorSubscriber(subscriber, undefined, undefined, (err) => {
        handledResult = innerFrom(selector(err, catchError(selector)(source)));
        if (innerSub) {
          innerSub.unsubscribe();
          innerSub = null;
          handledResult.subscribe(subscriber);
        } else {
          // We don't have an innerSub yet, that means the error was synchronous
          // because the subscribe call hasn't returned yet.
          syncUnsub = true;
        }
      })
    );

    if (syncUnsub) {
      // We have a synchronous error, we need to make sure to
      // finalize right away. This ensures that callbacks in the `finalize` operator are called
      // at the right time, and that finalization occurs at the expected
      // time between the source error and the subscription to the
      // next observable.
      innerSub.unsubscribe();
      innerSub = null;
      handledResult!.subscribe(subscriber);
    }
  });
}
ǀx Himport { combineLatestAll } from './combineLatestAll';

/**
 * @deprecated Renamed to {@link combineLatestAll}. Will be removed in v8.
 */
export const combineAll = combineLatestAll;
%>۶uxVimport { combineLatestInit } from '../observable/combineLatest';
import { ObservableInput, ObservableInputTuple, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { pipe } from '../util/pipe';
import { popResultSelector } from '../util/args';

/** @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8. */
export function combineLatest<T, A extends readonly unknown[], R>(
  sources: [...ObservableInputTuple<A>],
  project: (...values: [T, ...A]) => R
): OperatorFunction<T, R>;
/** @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8. */
export function combineLatest<T, A extends readonly unknown[], R>(sources: [...ObservableInputTuple<A>]): OperatorFunction<T, [T, ...A]>;

/** @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8. */
export function combineLatest<T, A extends readonly unknown[], R>(
  ...sourcesAndProject: [...ObservableInputTuple<A>, (...values: [T, ...A]) => R]
): OperatorFunction<T, R>;
/** @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8. */
export function combineLatest<T, A extends readonly unknown[], R>(...sources: [...ObservableInputTuple<A>]): OperatorFunction<T, [T, ...A]>;

/**
 * @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8.
 */
export function combineLatest<T, R>(...args: (ObservableInput<any> | ((...values: any[]) => R))[]): OperatorFunction<T, unknown> {
  const resultSelector = popResultSelector(args);
  return resultSelector
    ? pipe(combineLatest(...(args as Array<ObservableInput<any>>)), mapOneOrManyArgs(resultSelector))
    : operate((source, subscriber) => {
        combineLatestInit([source, ...argsOrArgArray(args)])(subscriber);
      });
}
oˁx	aimport { combineLatest } from '../observable/combineLatest';
import { OperatorFunction, ObservableInput } from '../types';
import { joinAllInternals } from './joinAllInternals';

export function combineLatestAll<T>(): OperatorFunction<ObservableInput<T>, T[]>;
export function combineLatestAll<T>(): OperatorFunction<any, T[]>;
export function combineLatestAll<T, R>(project: (...values: T[]) => R): OperatorFunction<ObservableInput<T>, R>;
export function combineLatestAll<R>(project: (...values: Array<any>) => R): OperatorFunction<any, R>;

/**
 * Flattens an Observable-of-Observables by applying {@link combineLatest} when the Observable-of-Observables completes.
 *
 * `combineLatestAll` takes an Observable of Observables, and collects all Observables from it. Once the outer Observable completes,
 * it subscribes to all collected Observables and combines their values using the {@link combineLatest} strategy, such that:
 *
 * * Every time an inner Observable emits, the output Observable emits
 * * When the returned observable emits, it emits all of the latest values by:
 *    * If a `project` function is provided, it is called with each recent value from each inner Observable in whatever order they
 *      arrived, and the result of the `project` function is what is emitted by the output Observable.
 *    * If there is no `project` function, an array of all the most recent values is emitted by the output Observable.
 *
 * ## Example
 *
 * Map two click events to a finite interval Observable, then apply `combineLatestAll`
 *
 * ```ts
 * import { fromEvent, map, interval, take, combineLatestAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(
 *   map(() => interval(Math.random() * 2000).pipe(take(3))),
 *   take(2)
 * );
 * const result = higherOrder.pipe(combineLatestAll());
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link combineLatest}
 * @see {@link combineLatestWith}
 * @see {@link mergeAll}
 *
 * @param project optional function to map the most recent values from each inner Observable into a new result.
 * Takes each of the most recent values from each collected inner Observable as arguments, in order.
 * @return A function that returns an Observable that flattens Observables
 * emitted by the source Observable.
 */
export function combineLatestAll<R>(project?: (...values: Array<any>) => R) {
  return joinAllInternals(combineLatest, project);
}
Q,x}=Gzip } from '../observable/zipx;/**
 * Collects all observable inner sources from the source, once the source completes,
 * it will subscribe to all inner sourPces, combining their values by index and emitting
 * them.
 *
 * @see {@link zipzip}
 */
export function zipEzip=zipedzipAll<lU	export function zipAll<T, <	T[]_	$zip, project);
}
߿sx?import { ObservableInputTuple, OperatorFunction, Cons } from '../types';
import { combineLatest } from './combineLatest';

/**
 * Create an observable that combines the latest values from all passed observables and the source
 * into arrays and emits them.
 *
 * Returns an observable, that when subscribed to, will subscribe to the source observable and all
 * sources provided as arguments. Once all sources emit at least one value, all of the latest values
 * will be emitted as an array. After that, every time any source emits a value, all of the latest values
 * will be emitted as an array.
 *
 * This is a useful operator for eagerly calculating values based off of changed inputs.
 *
 * ## Example
 *
 * Simple concatenation of values from two inputs
 *
 * ```ts
 * import { fromEvent, combineLatestWith, map } from 'rxjs';
 *
 * // Setup: Add two inputs to the page
 * const input1 = document.createElement('input');
 * document.body.appendChild(input1);
 * const input2 = document.createElement('input');
 * document.body.appendChild(input2);
 *
 * // Get streams of changes
 * const input1Changes$ = fromEvent(input1, 'change');
 * const input2Changes$ = fromEvent(input2, 'change');
 *
 * // Combine the changes by adding them together
 * input1Changes$.pipe(
 *   combineLatestWith(input2Changes$),
 *   map(([e1, e2]) => (<HTMLInputElement>e1.target).value + ' - ' + (<HTMLInputElement>e2.target).value)
 * )
 * .subscribe(x => console.log(x));
 * ```
 *
 * @param otherSources the other sources to subscribe to.
 * @return A function that returns an Observable that emits the latest
 * emissions from both source and provided Observables.
 */
export function combineLatestWith<T, A extends readonly unknown[]>(
  ...otherSources: [...ObservableInputTuple<A>]
): OperatorFunction<T, Cons<T, A>> {
  return combineLatest(...otherSources);
}
s?x import { ObservableInputTuple, OperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { concatAll } from './concatAll';
import { popScheduler } from '../util/args';
import { from } from '../observable/from';

/** @deprecated Replaced with {@link concatWith}. Will be removed in v8. */
export function concat<T, A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link concatWith}. Will be removed in v8. */
export function concat<T, A extends readonly unknown[]>(
  ...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike]
): OperatorFunction<T, T | A[number]>;

/**
 * @deprecated Replaced with {@link concatWith}. Will be removed in v8.
 */
export function concat<T, R>(...args: any[]): OperatorFunction<T, R> {
  const scheduler = popScheduler(args);
  return operate((source, subscriber) => {
    concatAll()(from([source, ...args], scheduler)).subscribe(subscriber);
  });
}
Z^xwimport { mergeAll } from './mergeAll';
import { OperatorFunction, ObservableInput, ObservedValueOf } from '../types';

/**
 * Converts a higher-order Observable into a first-order Observable by
 * concatenating the inner Observables in order.
 *
 * <span class="informal">Flattens an Observable-of-Observables by putting one
 * inner Observable after the other.</span>
 *
 * ![](concatAll.svg)
 *
 * Joins every Observable emitted by the source (a higher-order Observable), in
 * a serial fashion. It subscribes to each inner Observable only after the
 * previous inner Observable has completed, and merges all of their values into
 * the returned observable.
 *
 * __Warning:__ If the source Observable emits Observables quickly and
 * endlessly, and the inner Observables it emits generally complete slower than
 * the source emits, you can run into memory issues as the incoming Observables
 * collect in an unbounded buffer.
 *
 * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set
 * to `1`.
 *
 * ## Example
 *
 * For each click event, tick every second from 0 to 3, with no concurrency
 *
 * ```ts
 * import { fromEvent, map, interval, take, concatAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(
 *   map(() => interval(1000).pipe(take(4)))
 * );
 * const firstOrder = higherOrder.pipe(concatAll());
 * firstOrder.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // (results are not concurrent)
 * // For every click on the "document" it will emit values 0 to 3 spaced
 * // on a 1000ms interval
 * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link concat}
 * @see {@link concatMap}
 * @see {@link concatMapTo}
 * @see {@link exhaustAll}
 * @see {@link mergeAll}
 * @see {@link switchAll}
 * @see {@link switchMap}
 * @see {@link zipAll}
 *
 * @return A function that returns an Observable emitting values from all the
 * inner Observables concatenated.
 */
export function concatAll<O extends ObservableInput<any>>(): OperatorFunction<O, ObservedValueOf<O>> {
  return mergeAll(1);
}
sx.import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { map } from './map';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/* tslint:disable:max-line-length */
export function exhaustMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function exhaustMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector: undefined
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function exhaustMap<T, I, R>(
  project: (value: T, index: number) => ObservableInput<I>,
  resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, R>;
/* tslint:enable:max-line-length */

/**
 * Projects each source value to an Observable which is merged in the output
 * Observable only if the previous projected Observable has completed.
 *
 * <span class="informal">Maps each value to an Observable, then flattens all of
 * these inner Observables using {@link exhaustAll}.</span>
 *
 * ![](exhaustMap.png)
 *
 * Returns an Observable that emits items based on applying a function that you
 * supply to each item emitted by the source Observable, where that function
 * returns an (so-called "inner") Observable. When it projects a source value to
 * an Observable, the output Observable begins emitting the items emitted by
 * that projected Observable. However, `exhaustMap` ignores every new projected
 * Observable if the previous projected Observable has not yet completed. Once
 * that one completes, it will accept and flatten the next projected Observable
 * and repeat this process.
 *
 * ## Example
 *
 * Run a finite timer for each click, only if there is no currently active timer
 *
 * ```ts
 * import { fromEvent, exhaustMap, interval, take } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   exhaustMap(() => interval(1000).pipe(take(5)))
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link concatMap}
 * @see {@link exhaust}
 * @see {@link mergeMap}
 * @see {@link switchMap}
 *
 * @param project A function that, when applied to an item emitted by the source
 * Observable, returns an Observable.
 * @return A function that returns an Observable containing projected
 * Observables of each item of the source, ignoring projected Observables that
 * start before their preceding Observable has completed.
 */
export function exhaustMap<T, R, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, ObservedValueOf<O> | R> {
  if (resultSelector) {
    // DEPRECATED PATH
    return (source: Observable<T>) =>
      source.pipe(exhaustMap((a, i) => innerFrom(project(a, i)).pipe(map((b: any, ii: any) => resultSelector(a, b, i, ii)))));
  }
  return operate((source, subscriber) => {
    let index = 0;
    let innerSub: Subscriber<T> | null = null;
    let isComplete = false;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (outerValue) => {
          if (!innerSub) {
            innerSub = createOperatorSubscriber(subscriber, undefined, () => {
              innerSub = null;
              isComplete && subscriber.complete();
            });
            innerFrom(project(outerValue, index++)).subscribe(innerSub);
          }
        },
        () => {
          isComplete = true;
          !innerSub && subscriber.complete();
        }
      )
    );
  });
}
]`Z<xV $import { mergeMap } from './mergeMapU[%isFunction } from '../util/isFunction_9conca*concaGconcagvOXU, in a serialized fashion waiting for each one to complete before
 * merging the next~concaconca<Each new inner Observable is
 * concatenated with the previous inner Observable.
 *
 * __Warning:__ if source values arrive endlessly and faster than their
 * corresponding inner Observables can complete, it will result in memory issues
 * as inner Observables amass in an unbounded buffer waiting for their turn to
 * be subscribed to.
 *
 * Note: `concatMap` is equivalent to `me0rgeMap` with concurrency parameter set
 * to `1`HFor each click event, tick every second from 0 to 3, with no concurrency$conca	{*concatMap(ev => interval(1000).pipe(take(4	6
 * // Results in the following:
 * // (results are not concurrent)
 * // For every click on the "document" it will emit values 0 to 3 spaced
 * // on a 1000ms interval
 * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
 * ```
 *
 * @see {@
}
All}
To}
 * @see {@link exhaustMap1
that emits the result of
 * applying the projection function (and the optional deprecated
 * `resultSelector`) to each item emi
T Observable and taking
 * values from each projected inner Observable sequentially.
concacreturn isFunction(resultSelector) ? mergeMap(project, resultSelector, 1) : mergeMap(project, 1);
}
,8\tx? XXmergeInternals } from './mergeInternals';
import { isFunction } from '../util/isFunction_9mergeUconcurrent?: numbermergen,
  concurrent?: numbermergefvO@,
  concurrent?: number~mergemerge=cObservable, and then merging those resulting Observables and
 * emitting the results of this mergerMap and flatten each letter to an Observable ticking every 1 second
 *
 * ```ts
 * import { of, mergeMap, interval, map } from 9	letters = of('a', 'b', 'cp	Oletters.pipe(
 *   mergeMap(x => interval(1000).pipe(map(i => x + i)))
 * );
 *	-
 * // Results in the following:
 * // a0
 * // b0
 * // c0
 * // a1
 * // b1
 * // c1
 * // continues to list a, b, c every se'cond with respective ascending integers	;Map1
1
All1
To1
ScanJ
Vparam concurrent Maximum number of `ObservableInput`s being subscribed to concurrently
3that emits the result of
 * applying the projection function (and the optional deprecated
 * `resultSelector`) to each item emi
] Observable and merging
 * the results of the Observables obtained from this transformation.
mergejxO@+) | number,
  concurrent: number = Infinity*isFunction(resultSelector)&*mergeMap((a, i) => map((b: any, ii: numbero!(=), concurrent);
  } else if (typeof resultSelector === 'number') {
    concurrent = resultSelector;
  }

  return operate((sour<mergeInternals(source, subscriber, project, concurrent));
}
Il}Cx9
 *,switch)switchFswitchfvOX-, emitting values only from the most recently~switchswitch=7Each time it observes one of these
 * inner ObservablesGEinner Observable. When a new inner Observable is emitted, `switchMap`
 * stops emitting items from the earlier-emitted inner Observable and begins
 * emitting items from the new one. It continues to behave like this for
 * subsequent inner Observables.
 cGenerate new Observable according to source Observable values
 *
 * ```ts
 * import { of, switchMap1	Oswitched = of(1, 2, 3).pipe(switchMap(x => of(x, x ** 2, x ** 3)));
 * switched	$// outputs
 * // 1
 * // 1
 * // 1
 * // 2
 * // 4
 * // 8
 * // 3
 * // 9
 * // 27
 * ```
 *
 * Restart an interval Observable on every click event$switchMap, interval1	aswitch	)	gMap1
0AllJ
Tod
that emits the result of
 * applying the projection function (and the optional deprecated
 * `resultSelector`) to each item emi
] Observable and taking
 * only the values from the most recently projected inner Observable.
switch3nerSubscriber: Subscriber<ObservedValueOf<O>> | null = null;
    let index = 0;
    // Whether or not the source subscription has completed
    let isComplete = false;

    // We only complete the result if the source is complete AND we don't have an active inner subscription.
    // This is called both when the source completes and when the inners complete.
    const checkComplEete = () => isComplete && !innerSubscriber && subscriber.complete();
!Tvalue) => {
          // Cancel the previous inner subscription if there was one
          innerSubscriber?.unsubscribe();
          let innerIndex = 0;
          const outerIndex = index++;
          // Start the next inner subscription
          innerFIrom(project(value, outerIndex)).subscribe(
            (innerSubscriber ==#Z      // When we get a new inner value, next it through. Note that this is
              // handling the deprecate result selector here. This is because with this architecture
              // it ends up being smaller than using the map operator.
              (innerValue) => subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue),
              () => {
                // The inner has completed. Null out the inner subscriber to
                // free [up memory and to signal that we have no inner subscription
                // currently.
  ]scriber = null!;
                checkComplete();
              }
            ))
          );CcheckC,RKximport { concatMap } from './concatMap';
import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { isFunction } from '../util/isFunction';

/** @deprecated Will be removed in v9. Use {@link concatMap} instead: `concatMap(() => result)` */
export function concatMapTo<O extends ObservableInput<unknown>>(observable: O): OperatorFunction<unknown, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function concatMapTo<O extends ObservableInput<unknown>>(
  observable: O,
  resultSelector: undefined
): OperatorFunction<unknown, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function concatMapTo<T, R, O extends ObservableInput<unknown>>(
  observable: O,
  resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, R>;

/**
 * Projects each source value to the same Observable which is merged multiple
 * times in a serialized fashion on the output Observable.
 *
 * <span class="informal">It's like {@link concatMap}, but maps each value
 * always to the same inner Observable.</span>
 *
 * ![](concatMapTo.png)
 *
 * Maps each source value to the given Observable `innerObservable` regardless
 * of the source value, and then flattens those resulting Observables into one
 * single Observable, which is the output Observable. Each new `innerObservable`
 * instance emitted on the output Observable is concatenated with the previous
 * `innerObservable` instance.
 *
 * __Warning:__ if source values arrive endlessly and faster than their
 * corresponding inner Observables can complete, it will result in memory issues
 * as inner Observables amass in an unbounded buffer waiting for their turn to
 * be subscribed to.
 *
 * Note: `concatMapTo` is equivalent to `mergeMapTo` with concurrency parameter
 * set to `1`.
 *
 * ## Example
 *
 * For each click event, tick every second from 0 to 3, with no concurrency
 *
 * ```ts
 * import { fromEvent, concatMapTo, interval, take } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   concatMapTo(interval(1000).pipe(take(4)))
 * );
 * result.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // (results are not concurrent)
 * // For every click on the "document" it will emit values 0 to 3 spaced
 * // on a 1000ms interval
 * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
 * ```
 *
 * @see {@link concat}
 * @see {@link concatAll}
 * @see {@link concatMap}
 * @see {@link mergeMapTo}
 * @see {@link switchMapTo}
 *
 * @param innerObservable An `ObservableInput` to replace each value from the
 * source Observable.
 * @return A function that returns an Observable of values merged together by
 * joining the passed Observable with itself, one after the other, for each
 * value emitted from the source.
 * @deprecated Will be removed in v9. Use {@link concatMap} instead: `concatMap(() => result)`
 */
export function concatMapTo<T, R, O extends ObservableInput<unknown>>(
  innerObservable: O,
  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, ObservedValueOf<O> | R> {
  return isFunction(resultSelector) ? concatMap(() => innerObservable, resultSelector) : concatMap(() => innerObservable);
}
4xC#import { switchMap } from './switch#switchMap} instead: `switch&switch=*Mswitch=5switch34flattened multiple
 * times with {@link switchMap} iq0switchSswitch_The output Observables
 * emits values only from the most recently emitted instance of
 * `innerObservable`.
 *
 * ## Example
 8*
 * Restart an interval Observable on every click event$switchMapTo, intervalaswitchMapTo(interval(1000))^	/ ```
 *

All}
 * @see {@link switch
"that emits items from the
 * given `innerObservable` (and optionally transformed through the deprecated
 * `resultSelector`) every time a value is emitted on the source Observable,
 * and taking only the values from the most recently projected inner
 * Observable.
 0switchMap} instead: `switchr'switchswitch-switchl)7Rxuimport {B"I, ObservableInput } from '../types';
import { mergeMap } from './mergeMapugmergeMap} instead: `merge&merge=-
concurrent?: number!n!
 _
 *6P
mergek
W^,
  concurrent?: number!@#/* tslint:enable:max-line-length */CDmerged multiple
 * timesI(mergeMap}, but maps each value always
 *+0mergea~merge\For each click event, ticking every 1 second$merge$pmerge`4merge}
 * @see {@link mergeAll}
 * @see {@link merge1ScanJrXparam concurrent Maximum number of input Observables being subscribed to
 * concurrentlyg	3mergeMap} instead: `merge>
'mergek
[\+) | number,
  concurrent: number = Infinity!4if (\) {
    return merge), concurrent);
  }
  if (typeof resultSelector === 'number') {
    concurrent = resultSelector;
  }
  return mergeMap(() => innconcurrent);
}
M-Yxgimport { ObservableInputTuple, OperatorFunction } from '../types';
import { concat } from './concat';

/**
 * Emits all of the values from the source observable, then, once it completes, subscribes
 * to each observable source provided, one at a time, emitting all of their values, and not subscribing
 * to the next one until it completes.
 *
 * `concat(a$, b$, c$)` is the same as `a$.pipe(concatWith(b$, c$))`.
 *
 * ## Example
 *
 * Listen for one mouse click, then listen for all mouse moves.
 *
 * ```ts
 * import { fromEvent, map, take, concatWith } from 'rxjs';
 *
 * const clicks$ = fromEvent(document, 'click');
 * const moves$ = fromEvent(document, 'mousemove');
 *
 * clicks$.pipe(
 *   map(() => 'click'),
 *   take(1),
 *   concatWith(
 *     moves$.pipe(
 *       map(() => 'move')
 *     )
 *   )
 * )
 * .subscribe(x => console.log(x));
 *
 * // 'click'
 * // 'move'
 * // 'move'
 * // 'move'
 * // ...
 * ```
 *
 * @param otherSources Other observable sources to subscribe to, in sequence, after the original source is complete.
 * @return A function that returns an Observable that concatenates
 * subscriptions to the source and provided Observables subscribing to the next
 * only once the current subscription completes.
 */
export function concatWith<T, A extends readonly unknown[]>(
  ...otherSources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]> {
  return concat(...otherSources);
}
xQimport { OperatorFunction, ObservableInput, ObservedValueOf, SubjectLike } from '../types';
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { fromSubscribable } from '../observable/fromSubscribable';

/**
 * An object used to configure {@link connect} operator.
 */
export interface ConnectConfig<T> {
  /**
   * A factory function used to create the Subject through which the source
   * is multicast. By default, this creates a {@link Subject}.
   */
  connector: () => SubjectLike<T>;
}

/**
 * The default configuration for `connect`.
 */
const DEFAULT_CONFIG: ConnectConfig<unknown> = {
  connector: () => new Subject<unknown>(),
};

/**
 * Creates an observable by multicasting the source within a function that
 * allows the developer to define the usage of the multicast prior to connection.
 *
 * This is particularly useful if the observable source you wish to multicast could
 * be synchronous or asynchronous. This sets it apart from {@link share}, which, in the
 * case of totally synchronous sources will fail to share a single subscription with
 * multiple consumers, as by the time the subscription to the result of {@link share}
 * has returned, if the source is synchronous its internal reference count will jump from
 * 0 to 1 back to 0 and reset.
 *
 * To use `connect`, you provide a `selector` function that will give you
 * a multicast observable that is not yet connected. You then use that multicast observable
 * to create a resulting observable that, when subscribed, will set up your multicast. This is
 * generally, but not always, accomplished with {@link merge}.
 *
 * Note that using a {@link takeUntil} inside of `connect`'s `selector` _might_ mean you were looking
 * to use the {@link takeWhile} operator instead.
 *
 * When you subscribe to the result of `connect`, the `selector` function will be called. After
 * the `selector` function returns, the observable it returns will be subscribed to, _then_ the
 * multicast will be connected to the source.
 *
 * ## Example
 *
 * Sharing a totally synchronous observable
 *
 * ```ts
 * import { of, tap, connect, merge, map, filter } from 'rxjs';
 *
 * const source$ = of(1, 2, 3, 4, 5).pipe(
 *   tap({
 *     subscribe: () => console.log('subscription started'),
 *     next: n => console.log(`source emitted ${ n }`)
 *   })
 * );
 *
 * source$.pipe(
 *   // Notice in here we're merging 3 subscriptions to `shared$`.
 *   connect(shared$ => merge(
 *     shared$.pipe(map(n => `all ${ n }`)),
 *     shared$.pipe(filter(n => n % 2 === 0), map(n => `even ${ n }`)),
 *     shared$.pipe(filter(n => n % 2 === 1), map(n => `odd ${ n }`))
 *   ))
 * )
 * .subscribe(console.log);
 *
 * // Expected output: (notice only one subscription)
 * 'subscription started'
 * 'source emitted 1'
 * 'all 1'
 * 'odd 1'
 * 'source emitted 2'
 * 'all 2'
 * 'even 2'
 * 'source emitted 3'
 * 'all 3'
 * 'odd 3'
 * 'source emitted 4'
 * 'all 4'
 * 'even 4'
 * 'source emitted 5'
 * 'all 5'
 * 'odd 5'
 * ```
 *
 * @param selector A function used to set up the multicast. Gives you a multicast observable
 * that is not yet connected. With that, you're expected to create and return
 * and Observable, that when subscribed to, will utilize the multicast observable.
 * After this function is executed -- and its return value subscribed to -- the
 * operator will subscribe to the source, and the connection will be made.
 * @param config The configuration object for `connect`.
 */
export function connect<T, O extends ObservableInput<unknown>>(
  selector: (shared: Observable<T>) => O,
  config: ConnectConfig<T> = DEFAULT_CONFIG
): OperatorFunction<T, ObservedValueOf<O>> {
  const { connector } = config;
  return operate((source, subscriber) => {
    const subject = connector();
    innerFrom(selector(fromSubscribable(subject))).subscribe(subscriber);
    subscriber.add(source.subscribe(subject));
  });
}
8ximport { OperatorFunction } from '../types';
import { reduce } from './reduce';

/**
 * Counts the number of emissions on the source and emits that number when the
 * source completes.
 *
 * <span class="informal">Tells how many values were emitted, when the source
 * completes.</span>
 *
 * ![](count.png)
 *
 * `count` transforms an Observable that emits values into an Observable that
 * emits a single value that represents the number of values emitted by the
 * source Observable. If the source Observable terminates with an error, `count`
 * will pass this error notification along without emitting a value first. If
 * the source Observable does not terminate at all, `count` will neither emit
 * a value nor terminate. This operator takes an optional `predicate` function
 * as argument, in which case the output emission will represent the number of
 * source values that matched `true` with the `predicate`.
 *
 * ## Examples
 *
 * Counts how many seconds have passed before the first click happened
 *
 * ```ts
 * import { interval, fromEvent, takeUntil, count } from 'rxjs';
 *
 * const seconds = interval(1000);
 * const clicks = fromEvent(document, 'click');
 * const secondsBeforeClick = seconds.pipe(takeUntil(clicks));
 * const result = secondsBeforeClick.pipe(count());
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Counts how many odd numbers are there between 1 and 7
 *
 * ```ts
 * import { range, count } from 'rxjs';
 *
 * const numbers = range(1, 7);
 * const result = numbers.pipe(count(i => i % 2 === 1));
 * result.subscribe(x => console.log(x));
 * // Results in:
 * // 4
 * ```
 *
 * @see {@link max}
 * @see {@link min}
 * @see {@link reduce}
 *
 * @param predicate A function that is used to analyze the value and the index and
 * determine whether or not to increment the count. Return `true` to increment the count,
 * and return `false` to keep the count the same.
 * If the predicate is not provided, every value will be counted.
 * @return A function that returns an Observable that emits one number that
 * represents the count of emissions.
 */
export function count<T>(predicate?: (value: T, index: number) => boolean): OperatorFunction<T, number> {
  return reduce((total, value, i) => (!predicate || predicate(value, i) ? total + 1 : total), 0);
}
q	űx1import { Subscriber } from '../Subscriber';
import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * Emits a notification from the source Observable only after a particular time span
 * determined by another Observable has passed without another source emission.
 *
 * <span class="informal">It's like {@link debounceTime}, but the time span of
 * emission silence is determined by a second Observable.</span>
 *
 * ![](debounce.svg)
 *
 * `debounce` delays notifications emitted by the source Observable, but drops previous
 * pending delayed emissions if a new notification arrives on the source Observable.
 * This operator keeps track of the most recent notification from the source
 * Observable, and spawns a duration Observable by calling the
 * `durationSelector` function. The notification is emitted only when the duration
 * Observable emits a next notification, and if no other notification was emitted on
 * the source Observable since the duration Observable was spawned. If a new
 * notification appears before the duration Observable emits, the previous notification will
 * not be emitted and a new duration is scheduled from `durationSelector` is scheduled.
 * If the completing event happens during the scheduled duration the last cached notification
 * is emitted before the completion event is forwarded to the output observable.
 * If the error event happens during the scheduled duration or after it only the error event is
 * forwarded to the output observable. The cache notification is not emitted in this case.
 *
 * Like {@link debounceTime}, this is a rate-limiting operator, and also a
 * delay-like operator since output emissions do not necessarily occur at the
 * same time as they did on the source Observable.
 *
 * ## Example
 *
 * Emit the most recent click after a burst of clicks
 *
 * ```ts
 * import { fromEvent, scan, debounce, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   scan(i => ++i, 1),
 *   debounce(i => interval(200 * i))
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link auditTime}
 * @see {@link debounceTime}
 * @see {@link delay}
 * @see {@link sample}
 * @see {@link sampleTime}
 * @see {@link throttle}
 * @see {@link throttleTime}
 *
 * @param durationSelector A function
 * that receives a value from the source Observable, for computing the timeout
 * duration for each source value, returned as an Observable or a Promise.
 * @return A function that returns an Observable that delays the emissions of
 * the source Observable by the specified duration Observable returned by
 * `durationSelector`, and may drop some values if they occur too frequently.
 */
export function debounce<T>(durationSelector: (value: T) => ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    let lastValue: T | null = null;
    // The subscriber/subscription for the current debounce, if there is one.
    let durationSubscriber: Subscriber<any> | null = null;

    const emit = () => {
      // Unsubscribe any current debounce subscription we have,
      // we only cared about the first notification from it, and we
      // want to clean that subscription up as soon as possible.
      durationSubscriber?.unsubscribe();
      durationSubscriber = null;
      if (hasValue) {
        // We have a value! Free up memory first, then emit the value.
        hasValue = false;
        const value = lastValue!;
        lastValue = null;
        subscriber.next(value);
      }
    };

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // Cancel any pending debounce duration. We don't
          // need to null it out here yet tho, because we're just going
          // to create another one in a few lines.
          durationSubscriber?.unsubscribe();
          hasValue = true;
          lastValue = value;
          // Capture our duration subscriber, so we can unsubscribe it when we're notified
          // and we're going to emit the value.
          durationSubscriber = createOperatorSubscriber(subscriber, emit, noop);
          // Subscribe to the duration.
          innerFrom(durationSelector(value)).subscribe(durationSubscriber);
        },
        () => {
          // Source completed.
          // Emit any pending debounced values then complete
          emit();
          subscriber.complete();
        },
        // Pass all errors through to consumer
        undefined,
        () => {
          // Finalization.
          lastValue = durationSubscriber = null;
        }
      )
    );
  });
}
@ ^x;import { asyncScheduler } from '../scheduler/async';
import { Subscription } from '../Subscription';
import { MonoTypeOperatorFunction, SchedulerAction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits a notification from the source Observable only after a particular time span
 * has passed without another source emission.
 *
 * <span class="informal">It's like {@link delay}, but passes only the most
 * recent notification from each burst of emissions.</span>
 *
 * ![](debounceTime.png)
 *
 * `debounceTime` delays notifications emitted by the source Observable, but drops
 * previous pending delayed emissions if a new notification arrives on the source
 * Observable. This operator keeps track of the most recent notification from the
 * source Observable, and emits that only when `dueTime` has passed
 * without any other notification appearing on the source Observable. If a new value
 * appears before `dueTime` silence occurs, the previous notification will be dropped
 * and will not be emitted and a new `dueTime` is scheduled.
 * If the completing event happens during `dueTime` the last cached notification
 * is emitted before the completion event is forwarded to the output observable.
 * If the error event happens during `dueTime` or after it only the error event is
 * forwarded to the output observable. The cache notification is not emitted in this case.
 *
 * This is a rate-limiting operator, because it is impossible for more than one
 * notification to be emitted in any time window of duration `dueTime`, but it is also
 * a delay-like operator since output emissions do not occur at the same time as
 * they did on the source Observable. Optionally takes a {@link SchedulerLike} for
 * managing timers.
 *
 * ## Example
 *
 * Emit the most recent click after a burst of clicks
 *
 * ```ts
 * import { fromEvent, debounceTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(debounceTime(1000));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link auditTime}
 * @see {@link debounce}
 * @see {@link sample}
 * @see {@link sampleTime}
 * @see {@link throttle}
 * @see {@link throttleTime}
 *
 * @param dueTime The timeout duration in milliseconds (or the time unit determined
 * internally by the optional `scheduler`) for the window of time required to wait
 * for emission silence before emitting the most recent source value.
 * @param scheduler The {@link SchedulerLike} to use for managing the timers that
 * handle the timeout for each value.
 * @return A function that returns an Observable that delays the emissions of
 * the source Observable by the specified `dueTime`, and may drop some values
 * if they occur too frequently.
 */
export function debounceTime<T>(dueTime: number, scheduler: SchedulerLike = asyncScheduler): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let activeTask: Subscription | null = null;
    let lastValue: T | null = null;
    let lastTime: number | null = null;

    const emit = () => {
      if (activeTask) {
        // We have a value! Free up memory first, then emit the value.
        activeTask.unsubscribe();
        activeTask = null;
        const value = lastValue!;
        lastValue = null;
        subscriber.next(value);
      }
    };
    function emitWhenIdle(this: SchedulerAction<unknown>) {
      // This is called `dueTime` after the first value
      // but we might have received new values during this window!

      const targetTime = lastTime! + dueTime;
      const now = scheduler.now();
      if (now < targetTime) {
        // On that case, re-schedule to the new target
        activeTask = this.schedule(undefined, targetTime - now);
        subscriber.add(activeTask);
        return;
      }

      emit();
    }

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          lastValue = value;
          lastTime = scheduler.now();

          // Only set up a task if it's not already up
          if (!activeTask) {
            activeTask = scheduler.schedule(emitWhenIdle, dueTime);
            subscriber.add(activeTask);
          }
        },
        () => {
          // Source completed.
          // Emit any pending debounced values then complete
          emit();
          subscriber.complete();
        },
        // Pass all errors through to consumer.
        undefined,
        () => {
          // Finalization.
          lastValue = activeTask = null;
        }
      )
    );
  });
}
 txJimport { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits a given value if the source Observable completes without emitting any
 * `next` value, otherwise mirrors the source Observable.
 *
 * <span class="informal">If the source Observable turns out to be empty, then
 * this operator will emit a default value.</span>
 *
 * ![](defaultIfEmpty.png)
 *
 * `defaultIfEmpty` emits the values emitted by the source Observable or a
 * specified default value if the source Observable is empty (completes without
 * having emitted any `next` value).
 *
 * ## Example
 *
 * If no clicks happen in 5 seconds, then emit 'no clicks'
 *
 * ```ts
 * import { fromEvent, takeUntil, interval, defaultIfEmpty } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const clicksBeforeFive = clicks.pipe(takeUntil(interval(5000)));
 * const result = clicksBeforeFive.pipe(defaultIfEmpty('no clicks'));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link empty}
 * @see {@link last}
 *
 * @param defaultValue The default value used if the source
 * Observable is empty.
 * @return A function that returns an Observable that emits either the
 * specified `defaultValue` if the source Observable emits no items, or the
 * values emitted by the source Observable.
 */
export function defaultIfEmpty<T, R>(defaultValue: R): OperatorFunction<T, T | R> {
  return operate((source, subscriber) => {
    let hasValue = false;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          hasValue = true;
          subscriber.next(value);
        },
        () => {
          if (!hasValue) {
            subscriber.next(defaultValue!);
          }
          subscriber.complete();
        }
      )
    );
  });
}
`bximport { asyncScheduler } from '../scheduler/async';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { delayWhen } from './delayWhen';
import { timer } from '../observable/timer';

/**
 * Delays the emission of items from the source Observable by a given timeout or
 * until a given Date.
 *
 * <span class="informal">Time shifts each item by some specified amount of
 * milliseconds.</span>
 *
 * ![](delay.svg)
 *
 * If the delay argument is a Number, this operator time shifts the source
 * Observable by that amount of time expressed in milliseconds. The relative
 * time intervals between the values are preserved.
 *
 * If the delay argument is a Date, this operator time shifts the start of the
 * Observable execution until the given date occurs.
 *
 * ## Examples
 *
 * Delay each click by one second
 *
 * ```ts
 * import { fromEvent, delay } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const delayedClicks = clicks.pipe(delay(1000)); // each click emitted after 1 second
 * delayedClicks.subscribe(x => console.log(x));
 * ```
 *
 * Delay all clicks until a future date happens
 *
 * ```ts
 * import { fromEvent, delay } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const date = new Date('March 15, 2050 12:00:00'); // in the future
 * const delayedClicks = clicks.pipe(delay(date)); // click emitted only after that date
 * delayedClicks.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link delayWhen}
 * @see {@link throttle}
 * @see {@link throttleTime}
 * @see {@link debounce}
 * @see {@link debounceTime}
 * @see {@link sample}
 * @see {@link sampleTime}
 * @see {@link audit}
 * @see {@link auditTime}
 *
 * @param due The delay duration in milliseconds (a `number`) or a `Date` until
 * which the emission of the source items is delayed.
 * @param scheduler The {@link SchedulerLike} to use for managing the timers
 * that handle the time-shift for each item.
 * @return A function that returns an Observable that delays the emissions of
 * the source Observable by the specified timeout or Date.
 */
export function delay<T>(due: number | Date, scheduler: SchedulerLike = asyncScheduler): MonoTypeOperatorFunction<T> {
  const duration = timer(due, scheduler);
  return delayWhen(() => duration);
}
h簦x`import { Observable } from '../Observable';
import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { concat } from '../observable/concat';
import { take } from './take';
import { ignoreElements } from './ignoreElements';
import { mapTo } from './mapTo';
import { mergeMap } from './mergeMap';
import { innerFrom } from '../observable/innerFrom';

/** @deprecated The `subscriptionDelay` parameter will be removed in v8. */
export function delayWhen<T>(
  delayDurationSelector: (value: T, index: number) => ObservableInput<any>,
  subscriptionDelay: Observable<any>
): MonoTypeOperatorFunction<T>;
export function delayWhen<T>(delayDurationSelector: (value: T, index: number) => ObservableInput<any>): MonoTypeOperatorFunction<T>;

/**
 * Delays the emission of items from the source Observable by a given time span
 * determined by the emissions of another Observable.
 *
 * <span class="informal">It's like {@link delay}, but the time span of the
 * delay duration is determined by a second Observable.</span>
 *
 * ![](delayWhen.png)
 *
 * `delayWhen` operator shifts each emitted value from the source Observable by
 * a time span determined by another Observable. When the source emits a value,
 * the `delayDurationSelector` function is called with the value emitted from
 * the source Observable as the first argument to the `delayDurationSelector`.
 * The `delayDurationSelector` function should return an {@link ObservableInput},
 * that is internally converted to an Observable that is called the "duration"
 * Observable.
 *
 * The source value is emitted on the output Observable only when the "duration"
 * Observable emits ({@link guide/glossary-and-semantics#next next}s) any value.
 * Upon that, the "duration" Observable gets unsubscribed.
 *
 * Before RxJS V7, the {@link guide/glossary-and-semantics#complete completion}
 * of the "duration" Observable would have been triggering the emission of the
 * source value to the output Observable, but with RxJS V7, this is not the case
 * anymore.
 *
 * Only next notifications (from the "duration" Observable) trigger values from
 * the source Observable to be passed to the output Observable. If the "duration"
 * Observable only emits the complete notification (without next), the value
 * emitted by the source Observable will never get to the output Observable - it
 * will be swallowed. If the "duration" Observable errors, the error will be
 * propagated to the output Observable.
 *
 * Optionally, `delayWhen` takes a second argument, `subscriptionDelay`, which
 * is an Observable. When `subscriptionDelay` emits its first value or
 * completes, the source Observable is subscribed to and starts behaving like
 * described in the previous paragraph. If `subscriptionDelay` is not provided,
 * `delayWhen` will subscribe to the source Observable as soon as the output
 * Observable is subscribed.
 *
 * ## Example
 *
 * Delay each click by a random amount of time, between 0 and 5 seconds
 *
 * ```ts
 * import { fromEvent, delayWhen, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const delayedClicks = clicks.pipe(
 *   delayWhen(() => interval(Math.random() * 5000))
 * );
 * delayedClicks.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link delay}
 * @see {@link throttle}
 * @see {@link throttleTime}
 * @see {@link debounce}
 * @see {@link debounceTime}
 * @see {@link sample}
 * @see {@link sampleTime}
 * @see {@link audit}
 * @see {@link auditTime}
 *
 * @param delayDurationSelector A function that returns an `ObservableInput` for
 * each `value` emitted by the source Observable, which is then used to delay the
 * emission of that `value` on the output Observable until the `ObservableInput`
 * returned from this function emits a next value. When called, beside `value`,
 * this function receives a zero-based `index` of the emission order.
 * @param subscriptionDelay An Observable that triggers the subscription to the
 * source Observable once it emits any value.
 * @return A function that returns an Observable that delays the emissions of
 * the source Observable by an amount of time specified by the Observable
 * returned by `delayDurationSelector`.
 */
export function delayWhen<T>(
  delayDurationSelector: (value: T, index: number) => ObservableInput<any>,
  subscriptionDelay?: Observable<any>
): MonoTypeOperatorFunction<T> {
  if (subscriptionDelay) {
    // DEPRECATED PATH
    return (source: Observable<T>) =>
      concat(subscriptionDelay.pipe(take(1), ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));
  }

  return mergeMap((value, index) => innerFrom(delayDurationSelector(value, index)).pipe(take(1), mapTo(value)));
}
a:x5import { observeNotification } from '../Notification';
import { OperatorFunction, ObservableNotification, ValueFromNotification } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Converts an Observable of {@link ObservableNotification} objects into the emissions
 * that they represent.
 *
 * <span class="informal">Unwraps {@link ObservableNotification} objects as actual `next`,
 * `error` and `complete` emissions. The opposite of {@link materialize}.</span>
 *
 * ![](dematerialize.png)
 *
 * `dematerialize` is assumed to operate an Observable that only emits
 * {@link ObservableNotification} objects as `next` emissions, and does not emit any
 * `error`. Such Observable is the output of a `materialize` operation. Those
 * notifications are then unwrapped using the metadata they contain, and emitted
 * as `next`, `error`, and `complete` on the output Observable.
 *
 * Use this operator in conjunction with {@link materialize}.
 *
 * ## Example
 *
 * Convert an Observable of Notifications to an actual Observable
 *
 * ```ts
 * import { NextNotification, ErrorNotification, of, dematerialize } from 'rxjs';
 *
 * const notifA: NextNotification<string> = { kind: 'N', value: 'A' };
 * const notifB: NextNotification<string> = { kind: 'N', value: 'B' };
 * const notifE: ErrorNotification = { kind: 'E', error: new TypeError('x.toUpperCase is not a function') };
 *
 * const materialized = of(notifA, notifB, notifE);
 *
 * const upperCase = materialized.pipe(dematerialize());
 * upperCase.subscribe({
 *   next: x => console.log(x),
 *   error: e => console.error(e)
 * });
 *
 * // Results in:
 * // A
 * // B
 * // TypeError: x.toUpperCase is not a function
 * ```
 *
 * @see {@link materialize}
 *
 * @return A function that returns an Observable that emits items and
 * notifications embedded in Notification objects emitted by the source
 * Observable.
 */
export function dematerialize<N extends ObservableNotification<any>>(): OperatorFunction<N, ValueFromNotification<N>> {
  return operate((source, subscriber) => {
    source.subscribe(createOperatorSubscriber(subscriber, (notification) => observeNotification(notification, subscriber)));
  });
}
cxYimport { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { innerFrom } from '../observable/innerFrom';

/**
 * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.
 *
 * If a `keySelector` function is provided, then it will project each value from the source observable into a new value that it will
 * check for equality with previously projected values. If the `keySelector` function is not provided, it will use each value from the
 * source observable directly with an equality check against previous values.
 *
 * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.
 *
 * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the
 * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`
 * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so
 * that the internal `Set` can be "flushed", basically clearing it of values.
 *
 * ## Examples
 *
 * A simple example with numbers
 *
 * ```ts
 * import { of, distinct } from 'rxjs';
 *
 * of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1)
 *   .pipe(distinct())
 *   .subscribe(x => console.log(x));
 *
 * // Outputs
 * // 1
 * // 2
 * // 3
 * // 4
 * ```
 *
 * An example using the `keySelector` function
 *
 * ```ts
 * import { of, distinct } from 'rxjs';
 *
 * of(
 *   { age: 4, name: 'Foo'},
 *   { age: 7, name: 'Bar'},
 *   { age: 5, name: 'Foo'}
 * )
 * .pipe(distinct(({ name }) => name))
 * .subscribe(x => console.log(x));
 *
 * // Outputs
 * // { age: 4, name: 'Foo' }
 * // { age: 7, name: 'Bar' }
 * ```
 * @see {@link distinctUntilChanged}
 * @see {@link distinctUntilKeyChanged}
 *
 * @param keySelector Optional `function` to select which value you want to check as distinct.
 * @param flushes Optional `ObservableInput` for flushing the internal HashSet of the operator.
 * @return A function that returns an Observable that emits items from the
 * source Observable with distinct values.
 */
export function distinct<T, K>(keySelector?: (value: T) => K, flushes?: ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    const distinctKeys = new Set();
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        const key = keySelector ? keySelector(value) : value;
        if (!distinctKeys.has(key)) {
          distinctKeys.add(key);
          subscriber.next(value);
        }
      })
    );

    flushes && innerFrom(flushes).subscribe(createOperatorSubscriber(subscriber, () => distinctKeys.clear(), noop));
  });
}
<x import { MonoTypeOperatorFunction } from '../types';
import { identity } from '../util/identity';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function distinctUntilChanged<T>(comparator?: (previous: T, current: T) => boolean): MonoTypeOperatorFunction<T>;
export function distinctUntilChanged<T, K>(
  comparator: (previous: K, current: K) => boolean,
  keySelector: (value: T) => K
): MonoTypeOperatorFunction<T>;

/**
 * Returns a result {@link Observable} that emits all values pushed by the source observable if they
 * are distinct in comparison to the last value the result observable emitted.
 *
 * When provided without parameters or with the first parameter (`{@link distinctUntilChanged#comparator comparator}`),
 * it behaves like this:
 *
 * 1. It will always emit the first value from the source.
 * 2. For all subsequent values pushed by the source, they will be compared to the previously emitted values
 *    using the provided `comparator` or an `===` equality check.
 * 3. If the value pushed by the source is determined to be unequal by this check, that value is emitted and
 *    becomes the new "previously emitted value" internally.
 *
 * When the second parameter (`{@link distinctUntilChanged#keySelector keySelector}`) is provided, the behavior
 * changes:
 *
 * 1. It will always emit the first value from the source.
 * 2. The `keySelector` will be run against all values, including the first value.
 * 3. For all values after the first, the selected key will be compared against the key selected from
 *    the previously emitted value using the `comparator`.
 * 4. If the keys are determined to be unequal by this check, the value (not the key), is emitted
 *    and the selected key from that value is saved for future comparisons against other keys.
 *
 * ## Examples
 *
 * A very basic example with no `{@link distinctUntilChanged#comparator comparator}`. Note that `1` is emitted more than once,
 * because it's distinct in comparison to the _previously emitted_ value,
 * not in comparison to _all other emitted values_.
 *
 * ```ts
 * import { of, distinctUntilChanged } from 'rxjs';
 *
 * of(1, 1, 1, 2, 2, 2, 1, 1, 3, 3)
 *   .pipe(distinctUntilChanged())
 *   .subscribe(console.log);
 * // Logs: 1, 2, 1, 3
 * ```
 *
 * With a `{@link distinctUntilChanged#comparator comparator}`, you can do custom comparisons. Let's say
 * you only want to emit a value when all of its components have
 * changed:
 *
 * ```ts
 * import { of, distinctUntilChanged } from 'rxjs';
 *
 * const totallyDifferentBuilds$ = of(
 *   { engineVersion: '1.1.0', transmissionVersion: '1.2.0' },
 *   { engineVersion: '1.1.0', transmissionVersion: '1.4.0' },
 *   { engineVersion: '1.3.0', transmissionVersion: '1.4.0' },
 *   { engineVersion: '1.3.0', transmissionVersion: '1.5.0' },
 *   { engineVersion: '2.0.0', transmissionVersion: '1.5.0' }
 * ).pipe(
 *   distinctUntilChanged((prev, curr) => {
 *     return (
 *       prev.engineVersion === curr.engineVersion ||
 *       prev.transmissionVersion === curr.transmissionVersion
 *     );
 *   })
 * );
 *
 * totallyDifferentBuilds$.subscribe(console.log);
 *
 * // Logs:
 * // { engineVersion: '1.1.0', transmissionVersion: '1.2.0' }
 * // { engineVersion: '1.3.0', transmissionVersion: '1.4.0' }
 * // { engineVersion: '2.0.0', transmissionVersion: '1.5.0' }
 * ```
 *
 * You can also provide a custom `{@link distinctUntilChanged#comparator comparator}` to check that emitted
 * changes are only in one direction. Let's say you only want to get
 * the next record temperature:
 *
 * ```ts
 * import { of, distinctUntilChanged } from 'rxjs';
 *
 * const temps$ = of(30, 31, 20, 34, 33, 29, 35, 20);
 *
 * const recordHighs$ = temps$.pipe(
 *   distinctUntilChanged((prevHigh, temp) => {
 *     // If the current temp is less than
 *     // or the same as the previous record,
 *     // the record hasn't changed.
 *     return temp <= prevHigh;
 *   })
 * );
 *
 * recordHighs$.subscribe(console.log);
 * // Logs: 30, 31, 34, 35
 * ```
 *
 * Selecting update events only when the `updatedBy` field shows
 * the account changed hands.
 *
 * ```ts
 * import { of, distinctUntilChanged } from 'rxjs';
 *
 * // A stream of updates to a given account
 * const accountUpdates$ = of(
 *   { updatedBy: 'blesh', data: [] },
 *   { updatedBy: 'blesh', data: [] },
 *   { updatedBy: 'ncjamieson', data: [] },
 *   { updatedBy: 'ncjamieson', data: [] },
 *   { updatedBy: 'blesh', data: [] }
 * );
 *
 * // We only want the events where it changed hands
 * const changedHands$ = accountUpdates$.pipe(
 *   distinctUntilChanged(undefined, update => update.updatedBy)
 * );
 *
 * changedHands$.subscribe(console.log);
 * // Logs:
 * // { updatedBy: 'blesh', data: Array[0] }
 * // { updatedBy: 'ncjamieson', data: Array[0] }
 * // { updatedBy: 'blesh', data: Array[0] }
 * ```
 *
 * @see {@link distinct}
 * @see {@link distinctUntilKeyChanged}
 *
 * @param comparator A function used to compare the previous and current keys for
 * equality. Defaults to a `===` check.
 * @param keySelector Used to select a key value to be passed to the `comparator`.
 *
 * @return A function that returns an Observable that emits items from the
 * source Observable with distinct values.
 */
export function distinctUntilChanged<T, K>(
  comparator?: (previous: K, current: K) => boolean,
  keySelector: (value: T) => K = identity as (value: T) => K
): MonoTypeOperatorFunction<T> {
  // We've been allowing `null` do be passed as the `compare`, so we can't do
  // a default value for the parameter, because that will only work
  // for `undefined`.
  comparator = comparator ?? defaultCompare;

  return operate((source, subscriber) => {
    // The previous key, used to compare against keys selected
    // from new arrivals to determine "distinctiveness".
    let previousKey: K;
    // Whether or not this is the first value we've gotten.
    let first = true;

    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        // We always call the key selector.
        const currentKey = keySelector(value);

        // If it's the first value, we always emit it.
        // Otherwise, we compare this key to the previous key, and
        // if the comparer returns false, we emit.
        if (first || !comparator!(previousKey, currentKey)) {
          // Update our state *before* we emit the value
          // as emission can be the source of re-entrant code
          // in functional libraries like this. We only really
          // need to do this if it's the first value, or if the
          // key we're tracking in previous needs to change.
          first = false;
          previousKey = currentKey;

          // Emit the value!
          subscriber.next(value);
        }
      })
    );
  });
}

function defaultCompare(a: any, b: any) {
  return a === b;
}
	մx	kimport { distinctUntilChanged } from './distinctUntilChanged';
import { MonoTypeOperatorFunction } from '../types';

export function distinctUntilKeyChanged<T>(key: keyof T): MonoTypeOperatorFunction<T>;
export function distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T>;

/**
 * Returns an Observable that emits all items emitted by the source Observable that
 * are distinct by comparison from the previous item, using a property accessed by
 * using the key provided to check if the two items are distinct.
 *
 * If a comparator function is provided, then it will be called for each item to
 * test for whether that value should be emitted or not.
 *
 * If a comparator function is not provided, an equality check is used by default.
 *
 * ## Examples
 *
 * An example comparing the name of persons
 *
 * ```ts
 * import { of, distinctUntilKeyChanged } from 'rxjs';
 *
 * of(
 *   { age: 4, name: 'Foo' },
 *   { age: 7, name: 'Bar' },
 *   { age: 5, name: 'Foo' },
 *   { age: 6, name: 'Foo' }
 * ).pipe(
 *   distinctUntilKeyChanged('name')
 * )
 * .subscribe(x => console.log(x));
 *
 * // displays:
 * // { age: 4, name: 'Foo' }
 * // { age: 7, name: 'Bar' }
 * // { age: 5, name: 'Foo' }
 * ```
 *
 * An example comparing the first letters of the name
 *
 * ```ts
 * import { of, distinctUntilKeyChanged } from 'rxjs';
 *
 * of(
 *   { age: 4, name: 'Foo1' },
 *   { age: 7, name: 'Bar' },
 *   { age: 5, name: 'Foo2' },
 *   { age: 6, name: 'Foo3' }
 * ).pipe(
 *   distinctUntilKeyChanged('name', (x, y) => x.substring(0, 3) === y.substring(0, 3))
 * )
 * .subscribe(x => console.log(x));
 *
 * // displays:
 * // { age: 4, name: 'Foo1' }
 * // { age: 7, name: 'Bar' }
 * // { age: 5, name: 'Foo2' }
 * ```
 *
 * @see {@link distinct}
 * @see {@link distinctUntilChanged}
 *
 * @param key String key for object property lookup on each item.
 * @param compare Optional comparison function called to test if an item is distinct
 * from the previous item in the source.
 * @return A function that returns an Observable that emits items from the source
 * Observable with distinct values based on the key specified.
 */
export function distinctUntilKeyChanged<T, K extends keyof T>(
  key: K,
  compare?: (x: T[K], y: T[K]) => boolean
): MonoTypeOperatorFunction<T> {
  return distinctUntilChanged((x: T, y: T) => (compare ? compare(x[key], y[key]) : x[key] === y[key]));
}
9~x	iimport { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
import { Observable } from '../Observable';
import { OperatorFunction } from '../types';
import { filter } from './filter';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { take } from './take';

/**
 * Emits the single value at the specified `index` in a sequence of emissions
 * from the source Observable.
 *
 * <span class="informal">Emits only the i-th value, then completes.</span>
 *
 * ![](elementAt.png)
 *
 * `elementAt` returns an Observable that emits the item at the specified
 * `index` in the source Observable, or a default value if that `index` is out
 * of range and the `default` argument is provided. If the `default` argument is
 * not given and the `index` is out of range, the output Observable will emit an
 * `ArgumentOutOfRangeError` error.
 *
 * ## Example
 *
 * Emit only the third click event
 *
 * ```ts
 * import { fromEvent, elementAt } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(elementAt(2));
 * result.subscribe(x => console.log(x));
 *
 * // Results in:
 * // click 1 = nothing
 * // click 2 = nothing
 * // click 3 = MouseEvent object logged to console
 * ```
 *
 * @see {@link first}
 * @see {@link last}
 * @see {@link skip}
 * @see {@link single}
 * @see {@link take}
 *
 * @throws {ArgumentOutOfRangeError} When using `elementAt(i)`, it delivers an
 * `ArgumentOutOfRangeError` to the Observer's `error` callback if `i < 0` or the
 * Observable has completed before emitting the i-th `next` notification.
 *
 * @param index Is the number `i` for the i-th source emission that has happened
 * since the subscription, starting from the number `0`.
 * @param defaultValue The default value returned for missing indices.
 * @return A function that returns an Observable that emits a single item, if
 * it is found. Otherwise, it will emit the default value if given. If not, it
 * emits an error.
 */
export function elementAt<T, D = T>(index: number, defaultValue?: D): OperatorFunction<T, T | D> {
  if (index < 0) {
    throw new ArgumentOutOfRangeError();
  }
  const hasDefaultValue = arguments.length >= 2;
  return (source: Observable<T>) =>
    source.pipe(
      filter((v, i) => i === index),
      take(1),
      hasDefaultValue ? defaultIfEmpty(defaultValue!) : throwIfEmpty(() => new ArgumentOutOfRangeError())
    );
}
04Gx
/** prettier */
import { Observable } from '../Observable';
import { concat } from '../observable/concat';
import { of } from '../observable/of';
import { MonoTypeOperatorFunction, SchedulerLike, OperatorFunction, ValueFromArray } from '../types';

/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `concatAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function endWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `concatAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function endWith<T, A extends unknown[] = T[]>(
  ...valuesAndScheduler: [...A, SchedulerLike]
): OperatorFunction<T, T | ValueFromArray<A>>;

export function endWith<T, A extends unknown[] = T[]>(...values: A): OperatorFunction<T, T | ValueFromArray<A>>;

/**
 * Returns an observable that will emit all values from the source, then synchronously emit
 * the provided value(s) immediately after the source completes.
 *
 * NOTE: Passing a last argument of a Scheduler is _deprecated_, and may result in incorrect
 * types in TypeScript.
 *
 * This is useful for knowing when an observable ends. Particularly when paired with an
 * operator like {@link takeUntil}
 *
 * ![](endWith.png)
 *
 * ## Example
 *
 * Emit values to know when an interval starts and stops. The interval will
 * stop when a user clicks anywhere on the document.
 *
 * ```ts
 * import { interval, map, fromEvent, startWith, takeUntil, endWith } from 'rxjs';
 *
 * const ticker$ = interval(5000).pipe(
 *   map(() => 'tick')
 * );
 *
 * const documentClicks$ = fromEvent(document, 'click');
 *
 * ticker$.pipe(
 *   startWith('interval started'),
 *   takeUntil(documentClicks$),
 *   endWith('interval ended by click')
 * )
 * .subscribe(x => console.log(x));
 *
 * // Result (assuming a user clicks after 15 seconds)
 * // 'interval started'
 * // 'tick'
 * // 'tick'
 * // 'tick'
 * // 'interval ended by click'
 * ```
 *
 * @see {@link startWith}
 * @see {@link concat}
 * @see {@link takeUntil}
 *
 * @param values Items you want the modified Observable to emit last.
 * @return A function that returns an Observable that emits all values from the
 * source, then synchronously emits the provided value(s) immediately after the
 * source completes.
 */
export function endWith<T>(...values: Array<T | SchedulerLike>): MonoTypeOperatorFunction<T> {
  return (source: Observable<T>) => concat(source, of(...values)) as Observable<T>;
}
ax	kimport { Observable } from '../Observable';
import { Falsy, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function every<T>(predicate: BooleanConstructor): OperatorFunction<T, Exclude<T, Falsy> extends never ? false : boolean>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function every<T>(
  predicate: BooleanConstructor,
  thisArg: any
): OperatorFunction<T, Exclude<T, Falsy> extends never ? false : boolean>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function every<T, A>(
  predicate: (this: A, value: T, index: number, source: Observable<T>) => boolean,
  thisArg: A
): OperatorFunction<T, boolean>;
export function every<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean): OperatorFunction<T, boolean>;

/**
 * Returns an Observable that emits whether or not every item of the source satisfies the condition specified.
 *
 * <span class="informal">If all values pass predicate before the source completes, emits true before completion,
 * otherwise emit false, then complete.</span>
 *
 * ![](every.png)
 *
 * ## Example
 *
 * A simple example emitting true if all elements are less than 5, false otherwise
 *
 * ```ts
 * import { of, every } from 'rxjs';
 *
 * of(1, 2, 3, 4, 5, 6)
 *   .pipe(every(x => x < 5))
 *   .subscribe(x => console.log(x)); // -> false
 * ```
 *
 * @param predicate A function for determining if an item meets a specified condition.
 * @param thisArg Optional object to use for `this` in the callback.
 * @return A function that returns an Observable of booleans that determines if
 * all items of the source Observable meet the condition specified.
 */
export function every<T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  thisArg?: any
): OperatorFunction<T, boolean> {
  return operate((source, subscriber) => {
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          if (!predicate.call(thisArg, value, index++, source)) {
            subscriber.next(false);
            subscriber.complete();
          }
        },
        () => {
          subscriber.next(true);
          subscriber.complete();
        }
      )
    );
  });
}
"A	x cimport { exhaustAll } from './exhaustAll';

/**
 * @deprecated Renamed to {@link exhaustAll}. Will be removed in v8.
 */
export const exhaust = exhaustAll;
.4ǲ|x=import { OperatorFunction, ObservableInput, ObservedValueOf } from '../types';
import { exhaustMap } from './exhaustMap';
import { identity } from '../util/identity';

/**
 * Converts a higher-order Observable into a first-order Observable by dropping
 * inner Observables while the previous inner Observable has not yet completed.
 *
 * <span class="informal">Flattens an Observable-of-Observables by dropping the
 * next inner Observables while the current inner is still executing.</span>
 *
 * ![](exhaustAll.svg)
 *
 * `exhaustAll` subscribes to an Observable that emits Observables, also known as a
 * higher-order Observable. Each time it observes one of these emitted inner
 * Observables, the output Observable begins emitting the items emitted by that
 * inner Observable. So far, it behaves like {@link mergeAll}. However,
 * `exhaustAll` ignores every new inner Observable if the previous Observable has
 * not yet completed. Once that one completes, it will accept and flatten the
 * next inner Observable and repeat this process.
 *
 * ## Example
 *
 * Run a finite timer for each click, only if there is no currently active timer
 *
 * ```ts
 * import { fromEvent, map, interval, take, exhaustAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(
 *   map(() => interval(1000).pipe(take(5)))
 * );
 * const result = higherOrder.pipe(exhaustAll());
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link concatAll}
 * @see {@link switchAll}
 * @see {@link switchMap}
 * @see {@link mergeAll}
 * @see {@link exhaustMap}
 * @see {@link zipAll}
 *
 * @return A function that returns an Observable that takes a source of
 * Observables and propagates the first Observable exclusively until it
 * completes before subscribing to the next.
 */
export function exhaustAll<O extends ObservableInput<any>>(): OperatorFunction<O, ObservedValueOf<O>> {
  return exhaustMap(identity);
}
z?ximport { OperatorFunction, ObservableInput, ObservedValueOf, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';

/* tslint:disable:max-line-length */
export function expand<T, O extends ObservableInput<unknown>>(
  project: (value: T, index: number) => O,
  concurrent?: number,
  scheduler?: SchedulerLike
): OperatorFunction<T, ObservedValueOf<O>>;
/**
 * @deprecated The `scheduler` parameter will be removed in v8. If you need to schedule the inner subscription,
 * use `subscribeOn` within the projection function: `expand((value) => fn(value).pipe(subscribeOn(scheduler)))`.
 * Details: Details: https://rxjs.dev/deprecations/scheduler-argument
 */
export function expand<T, O extends ObservableInput<unknown>>(
  project: (value: T, index: number) => O,
  concurrent: number | undefined,
  scheduler: SchedulerLike
): OperatorFunction<T, ObservedValueOf<O>>;
/* tslint:enable:max-line-length */

/**
 * Recursively projects each source value to an Observable which is merged in
 * the output Observable.
 *
 * <span class="informal">It's similar to {@link mergeMap}, but applies the
 * projection function to every source value as well as every output value.
 * It's recursive.</span>
 *
 * ![](expand.png)
 *
 * Returns an Observable that emits items based on applying a function that you
 * supply to each item emitted by the source Observable, where that function
 * returns an Observable, and then merging those resulting Observables and
 * emitting the results of this merger. *Expand* will re-emit on the output
 * Observable every source value. Then, each output value is given to the
 * `project` function which returns an inner Observable to be merged on the
 * output Observable. Those output values resulting from the projection are also
 * given to the `project` function to produce new output values. This is how
 * *expand* behaves recursively.
 *
 * ## Example
 *
 * Start emitting the powers of two on every click, at most 10 of them
 *
 * ```ts
 * import { fromEvent, map, expand, of, delay, take } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const powersOfTwo = clicks.pipe(
 *   map(() => 1),
 *   expand(x => of(2 * x).pipe(delay(1000))),
 *   take(10)
 * );
 * powersOfTwo.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link mergeMap}
 * @see {@link mergeScan}
 *
 * @param project A function that, when applied to an item emitted by the source
 * or the output Observable, returns an Observable.
 * @param concurrent Maximum number of input Observables being subscribed to
 * concurrently.
 * @param scheduler The {@link SchedulerLike} to use for subscribing to
 * each projected inner Observable.
 * @return A function that returns an Observable that emits the source values
 * and also result of applying the projection function to each value emitted on
 * the output Observable and merging the results of the Observables obtained
 * from this transformation.
 */
export function expand<T, O extends ObservableInput<unknown>>(
  project: (value: T, index: number) => O,
  concurrent = Infinity,
  scheduler?: SchedulerLike
): OperatorFunction<T, ObservedValueOf<O>> {
  concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
  return operate((source, subscriber) =>
    mergeInternals(
      // General merge params
      source,
      subscriber,
      project,
      concurrent,

      // onBeforeNext
      undefined,

      // Expand-specific
      true, // Use expand path
      scheduler // Inner subscription scheduler
    )
  );
}
#px2import { OperatorFunction, MonoTypeOperatorFunction, TruthyTypesOf } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function filter<T, S extends T, A>(predicate: (this: A, value: T, index: number) => value is S, thisArg: A): OperatorFunction<T, S>;
export function filter<T, S extends T>(predicate: (value: T, index: number) => value is S): OperatorFunction<T, S>;
export function filter<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function filter<T, A>(predicate: (this: A, value: T, index: number) => boolean, thisArg: A): MonoTypeOperatorFunction<T>;
export function filter<T>(predicate: (value: T, index: number) => boolean): MonoTypeOperatorFunction<T>;

/**
 * Filter items emitted by the source Observable by only emitting those that
 * satisfy a specified predicate.
 *
 * <span class="informal">Like
 * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),
 * it only emits a value from the source if it passes a criterion function.</span>
 *
 * ![](filter.png)
 *
 * Similar to the well-known `Array.prototype.filter` method, this operator
 * takes values from the source Observable, passes them through a `predicate`
 * function and only emits those values that yielded `true`.
 *
 * ## Example
 *
 * Emit only click events whose target was a DIV element
 *
 * ```ts
 * import { fromEvent, filter } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const clicksOnDivs = clicks.pipe(filter(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 * clicksOnDivs.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link distinct}
 * @see {@link distinctUntilChanged}
 * @see {@link distinctUntilKeyChanged}
 * @see {@link ignoreElements}
 * @see {@link partition}
 * @see {@link skip}
 *
 * @param predicate A function that
 * evaluates each value emitted by the source Observable. If it returns `true`,
 * the value is emitted, if `false` the value is not passed to the output
 * Observable. The `index` parameter is the number `i` for the i-th source
 * emission that has happened since the subscription, starting from the number
 * `0`.
 * @param thisArg An optional argument to determine the value of `this`
 * in the `predicate` function.
 * @return A function that returns an Observable that emits items from the
 * source Observable that satisfy the specified `predicate`.
 */
export function filter<T>(predicate: (value: T, index: number) => boolean, thisArg?: any): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    // An index passed to our predicate function on each call.
    let index = 0;

    // Subscribe to the source, all errors and completions are
    // forwarded to the consumer.
    source.subscribe(
      // Call the predicate with the appropriate `this` context,
      // if the predicate returns `true`, then send the value
      // to the consumer.
      createOperatorSubscriber(subscriber, (value) => predicate.call(thisArg, value, index++) && subscriber.next(value))
    );
  });
}
Z6xaimport { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';

/**
 * Returns an Observable that mirrors the source Observable, but will call a specified function when
 * the source terminates on complete or error.
 * The specified function will also be called when the subscriber explicitly unsubscribes.
 *
 * ## Examples
 *
 * Execute callback function when the observable completes
 *
 * ```ts
 * import { interval, take, finalize } from 'rxjs';
 *
 * // emit value in sequence every 1 second
 * const source = interval(1000);
 * const example = source.pipe(
 *   take(5), //take only the first 5 values
 *   finalize(() => console.log('Sequence complete')) // Execute when the observable completes
 * );
 * const subscribe = example.subscribe(val => console.log(val));
 *
 * // results:
 * // 0
 * // 1
 * // 2
 * // 3
 * // 4
 * // 'Sequence complete'
 * ```
 *
 * Execute callback function when the subscriber explicitly unsubscribes
 *
 * ```ts
 * import { interval, finalize, tap, noop, timer } from 'rxjs';
 *
 * const source = interval(100).pipe(
 *   finalize(() => console.log('[finalize] Called')),
 *   tap({
 *     next: () => console.log('[next] Called'),
 *     error: () => console.log('[error] Not called'),
 *     complete: () => console.log('[tap complete] Not called')
 *   })
 * );
 *
 * const sub = source.subscribe({
 *   next: x => console.log(x),
 *   error: noop,
 *   complete: () => console.log('[complete] Not called')
 * });
 *
 * timer(150).subscribe(() => sub.unsubscribe());
 *
 * // results:
 * // '[next] Called'
 * // 0
 * // '[finalize] Called'
 * ```
 *
 * @param callback Function to be called when source terminates.
 * @return A function that returns an Observable that mirrors the source, but
 * will call the specified function on termination.
 */
export function finalize<T>(callback: () => void): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    // TODO: This try/finally was only added for `useDeprecatedSynchronousErrorHandling`.
    // REMOVE THIS WHEN THAT HOT GARBAGE IS REMOVED IN V8.
    try {
      source.subscribe(subscriber);
    } finally {
      subscriber.add(callback);
    }
  });
}
Ӷximport { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { OperatorFunction, TruthyTypesOf } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function find<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function find<T, S extends T, A>(
  predicate: (this: A, value: T, index: number, source: Observable<T>) => value is S,
  thisArg: A
): OperatorFunction<T, S | undefined>;
export function find<T, S extends T>(
  predicate: (value: T, index: number, source: Observable<T>) => value is S
): OperatorFunction<T, S | undefined>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function find<T, A>(
  predicate: (this: A, value: T, index: number, source: Observable<T>) => boolean,
  thisArg: A
): OperatorFunction<T, T | undefined>;
export function find<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean): OperatorFunction<T, T | undefined>;
/**
 * Emits only the first value emitted by the source Observable that meets some
 * condition.
 *
 * <span class="informal">Finds the first value that passes some test and emits
 * that.</span>
 *
 * ![](find.png)
 *
 * `find` searches for the first item in the source Observable that matches the
 * specified condition embodied by the `predicate`, and returns the first
 * occurrence in the source. Unlike {@link first}, the `predicate` is required
 * in `find`, and does not emit an error if a valid value is not found
 * (emits `undefined` instead).
 *
 * ## Example
 *
 * Find and emit the first click that happens on a DIV element
 *
 * ```ts
 * import { fromEvent, find } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(find(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link filter}
 * @see {@link first}
 * @see {@link findIndex}
 * @see {@link take}
 *
 * @param predicate A function called with each item to test for condition matching.
 * @param thisArg An optional argument to determine the value of `this` in the
 * `predicate` function.
 * @return A function that returns an Observable that emits the first item that
 * matches the condition.
 */
export function find<T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  thisArg?: any
): OperatorFunction<T, T | undefined> {
  return operate(createFind(predicate, thisArg, 'value'));
}

export function createFind<T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  thisArg: any,
  emit: 'value' | 'index'
) {
  const findIndex = emit === 'index';
  return (source: Observable<T>, subscriber: Subscriber<any>) => {
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          const i = index++;
          if (predicate.call(thisArg, value, i, source)) {
            subscriber.next(findIndex ? i : value);
            subscriber.complete();
          }
        },
        () => {
          subscriber.next(findIndex ? -1 : undefined);
          subscriber.complete();
        }
      )
    );
  };
}
g:vx[
import { Observable } from '../Observable';
import { Falsy, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createFind } from './find';

export function findIndex<T>(predicate: BooleanConstructor): OperatorFunction<T, T extends Falsy ? -1 : number>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function findIndex<T>(predicate: BooleanConstructor, thisArg: any): OperatorFunction<T, T extends Falsy ? -1 : number>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function findIndex<T, A>(
  predicate: (this: A, value: T, index: number, source: Observable<T>) => boolean,
  thisArg: A
): OperatorFunction<T, number>;
export function findIndex<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean): OperatorFunction<T, number>;

/**
 * Emits only the index of the first value emitted by the source Observable that
 * meets some condition.
 *
 * <span class="informal">It's like {@link find}, but emits the index of the
 * found value, not the value itself.</span>
 *
 * ![](findIndex.png)
 *
 * `findIndex` searches for the first item in the source Observable that matches
 * the specified condition embodied by the `predicate`, and returns the
 * (zero-based) index of the first occurrence in the source. Unlike
 * {@link first}, the `predicate` is required in `findIndex`, and does not emit
 * an error if a valid value is not found.
 *
 * ## Example
 *
 * Emit the index of first click that happens on a DIV element
 *
 * ```ts
 * import { fromEvent, findIndex } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(findIndex(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link filter}
 * @see {@link find}
 * @see {@link first}
 * @see {@link take}
 *
 * @param predicate A function called with each item to test for condition matching.
 * @param thisArg An optional argument to determine the value of `this` in the
 * `predicate` function.
 * @return A function that returns an Observable that emits the index of the
 * first item that matches the condition.
 */
export function findIndex<T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  thisArg?: any
): OperatorFunction<T, number> {
  return operate(createFind(predicate, thisArg, 'index'));
}
H޵x
import { Observable } from '../Observable';
import { EmptyError } from '../util/EmptyError';
import { OperatorFunction, TruthyTypesOf } from '../types';
import { filter } from './filter';
import { take } from './take';
import { defaultIfEmpty } from './defaultIfEmpty';
import { throwIfEmpty } from './throwIfEmpty';
import { identity } from '../util/identity';

export function first<T, D = T>(predicate?: null, defaultValue?: D): OperatorFunction<T, T | D>;
export function first<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function first<T, D>(predicate: BooleanConstructor, defaultValue: D): OperatorFunction<T, TruthyTypesOf<T> | D>;
export function first<T, S extends T>(
  predicate: (value: T, index: number, source: Observable<T>) => value is S,
  defaultValue?: S
): OperatorFunction<T, S>;
export function first<T, S extends T, D>(
  predicate: (value: T, index: number, source: Observable<T>) => value is S,
  defaultValue: D
): OperatorFunction<T, S | D>;
export function first<T, D = T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  defaultValue?: D
): OperatorFunction<T, T | D>;

/**
 * Emits only the first value (or the first value that meets some condition)
 * emitted by the source Observable.
 *
 * <span class="informal">Emits only the first value. Or emits only the first
 * value that passes some test.</span>
 *
 * ![](first.png)
 *
 * If called with no arguments, `first` emits the first value of the source
 * Observable, then completes. If called with a `predicate` function, `first`
 * emits the first value of the source that matches the specified condition. Emits an error
 * notification if `defaultValue` was not provided and a matching element is not found.
 *
 * ## Examples
 *
 * Emit only the first click that happens on the DOM
 *
 * ```ts
 * import { fromEvent, first } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(first());
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Emits the first click that happens on a DIV
 *
 * ```ts
 * import { fromEvent, first } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(first(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link filter}
 * @see {@link find}
 * @see {@link take}
 * @see {@link last}
 *
 * @throws {EmptyError} Delivers an `EmptyError` to the Observer's `error`
 * callback if the Observable completes before any `next` notification was sent.
 * This is how `first()` is different from `take(1)` which completes instead.
 *
 * @param predicate An optional function called with each item to test for condition
 * matching.
 * @param defaultValue The default value emitted in case no valid value was found on
 * the source.
 * @return A function that returns an Observable that emits the first item that
 * matches the condition.
 */
export function first<T, D>(
  predicate?: ((value: T, index: number, source: Observable<T>) => boolean) | null,
  defaultValue?: D
): OperatorFunction<T, T | D> {
  const hasDefaultValue = arguments.length >= 2;
  return (source: Observable<T>) =>
    source.pipe(
      predicate ? filter((v, i) => predicate(v, i, source)) : identity,
      take(1),
      hasDefaultValue ? defaultIfEmpty(defaultValue!) : throwIfEmpty(() => new EmptyError())
    );
}
R;E	x kimport { mergeMap } from './mergeMap';

/**
 * @deprecated Renamed to {@link mergeMap}. Will be removed in v8.
 */
export const flatMap = mergeMap;
90ֹx	,import { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { ObservableInput, Observer, OperatorFunction, SubjectLike } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber, OperatorSubscriber } from './OperatorSubscriber';

export interface BasicGroupByOptions<K, T> {
  element?: undefined;
  duration?: (grouped: GroupedObservable<K, T>) => ObservableInput<any>;
  connector?: () => SubjectLike<T>;
}

export interface GroupByOptionsWithElement<K, E, T> {
  element: (value: T) => E;
  duration?: (grouped: GroupedObservable<K, E>) => ObservableInput<any>;
  connector?: () => SubjectLike<E>;
}

export function groupBy<T, K>(key: (value: T) => K, options: BasicGroupByOptions<K, T>): OperatorFunction<T, GroupedObservable<K, T>>;

export function groupBy<T, K, E>(
  key: (value: T) => K,
  options: GroupByOptionsWithElement<K, E, T>
): OperatorFunction<T, GroupedObservable<K, E>>;

export function groupBy<T, K extends T>(
  key: (value: T) => value is K
): OperatorFunction<T, GroupedObservable<true, K> | GroupedObservable<false, Exclude<T, K>>>;

export function groupBy<T, K>(key: (value: T) => K): OperatorFunction<T, GroupedObservable<K, T>>;

/**
 * @deprecated use the options parameter instead.
 */
export function groupBy<T, K>(
  key: (value: T) => K,
  element: void,
  duration: (grouped: GroupedObservable<K, T>) => Observable<any>
): OperatorFunction<T, GroupedObservable<K, T>>;

/**
 * @deprecated use the options parameter instead.
 */
export function groupBy<T, K, R>(
  key: (value: T) => K,
  element?: (value: T) => R,
  duration?: (grouped: GroupedObservable<K, R>) => Observable<any>
): OperatorFunction<T, GroupedObservable<K, R>>;

/**
 * Groups the items emitted by an Observable according to a specified criterion,
 * and emits these grouped items as `GroupedObservables`, one
 * {@link GroupedObservable} per group.
 *
 * ![](groupBy.png)
 *
 * When the Observable emits an item, a key is computed for this item with the key function.
 *
 * If a {@link GroupedObservable} for this key exists, this {@link GroupedObservable} emits. Otherwise, a new
 * {@link GroupedObservable} for this key is created and emits.
 *
 * A {@link GroupedObservable} represents values belonging to the same group represented by a common key. The common
 * key is available as the `key` field of a {@link GroupedObservable} instance.
 *
 * The elements emitted by {@link GroupedObservable}s are by default the items emitted by the Observable, or elements
 * returned by the element function.
 *
 * ## Examples
 *
 * Group objects by `id` and return as array
 *
 * ```ts
 * import { of, groupBy, mergeMap, reduce } from 'rxjs';
 *
 * of(
 *   { id: 1, name: 'JavaScript' },
 *   { id: 2, name: 'Parcel' },
 *   { id: 2, name: 'webpack' },
 *   { id: 1, name: 'TypeScript' },
 *   { id: 3, name: 'TSLint' }
 * ).pipe(
 *   groupBy(p => p.id),
 *   mergeMap(group$ => group$.pipe(reduce((acc, cur) => [...acc, cur], [])))
 * )
 * .subscribe(p => console.log(p));
 *
 * // displays:
 * // [{ id: 1, name: 'JavaScript' }, { id: 1, name: 'TypeScript'}]
 * // [{ id: 2, name: 'Parcel' }, { id: 2, name: 'webpack'}]
 * // [{ id: 3, name: 'TSLint' }]
 * ```
 *
 * Pivot data on the `id` field
 *
 * ```ts
 * import { of, groupBy, mergeMap, reduce, map } from 'rxjs';
 *
 * of(
 *   { id: 1, name: 'JavaScript' },
 *   { id: 2, name: 'Parcel' },
 *   { id: 2, name: 'webpack' },
 *   { id: 1, name: 'TypeScript' },
 *   { id: 3, name: 'TSLint' }
 * ).pipe(
 *   groupBy(p => p.id, { element: p => p.name }),
 *   mergeMap(group$ => group$.pipe(reduce((acc, cur) => [...acc, cur], [`${ group$.key }`]))),
 *   map(arr => ({ id: parseInt(arr[0], 10), values: arr.slice(1) }))
 * )
 * .subscribe(p => console.log(p));
 *
 * // displays:
 * // { id: 1, values: [ 'JavaScript', 'TypeScript' ] }
 * // { id: 2, values: [ 'Parcel', 'webpack' ] }
 * // { id: 3, values: [ 'TSLint' ] }
 * ```
 *
 * @param key A function that extracts the key
 * for each item.
 * @param element A function that extracts the
 * return element for each item.
 * @param duration
 * A function that returns an Observable to determine how long each group should
 * exist.
 * @param connector Factory function to create an
 * intermediate Subject through which grouped elements are emitted.
 * @return A function that returns an Observable that emits GroupedObservables,
 * each of which corresponds to a unique key value and each of which emits
 * those items from the source Observable that share that key value.
 *
 * @deprecated Use the options parameter instead.
 */
export function groupBy<T, K, R>(
  key: (value: T) => K,
  element?: (value: T) => R,
  duration?: (grouped: GroupedObservable<K, R>) => Observable<any>,
  connector?: () => Subject<R>
): OperatorFunction<T, GroupedObservable<K, R>>;

// Impl
export function groupBy<T, K, R>(
  keySelector: (value: T) => K,
  elementOrOptions?: ((value: any) => any) | void | BasicGroupByOptions<K, T> | GroupByOptionsWithElement<K, R, T>,
  duration?: (grouped: GroupedObservable<any, any>) => ObservableInput<any>,
  connector?: () => SubjectLike<any>
): OperatorFunction<T, GroupedObservable<K, R>> {
  return operate((source, subscriber) => {
    let element: ((value: any) => any) | void;
    if (!elementOrOptions || typeof elementOrOptions === 'function') {
      element = elementOrOptions as ((value: any) => any);
    } else {
      ({ duration, element, connector } = elementOrOptions);
    }

    // A lookup for the groups that we have so far.
    const groups = new Map<K, SubjectLike<any>>();

    // Used for notifying all groups and the subscriber in the same way.
    const notify = (cb: (group: Observer<any>) => void) => {
      groups.forEach(cb);
      cb(subscriber);
    };

    // Used to handle errors from the source, AND errors that occur during the
    // next call from the source.
    const handleError = (err: any) => notify((consumer) => consumer.error(err));

    // The number of actively subscribed groups
    let activeGroups = 0;

    // Whether or not teardown was attempted on this subscription.
    let teardownAttempted = false;

    // Capturing a reference to this, because we need a handle to it
    // in `createGroupedObservable` below. This is what we use to
    // subscribe to our source observable. This sometimes needs to be unsubscribed
    // out-of-band with our `subscriber` which is the downstream subscriber, or destination,
    // in cases where a user unsubscribes from the main resulting subscription, but
    // still has groups from this subscription subscribed and would expect values from it
    // Consider:  `source.pipe(groupBy(fn), take(2))`.
    const groupBySourceSubscriber = new OperatorSubscriber(
      subscriber,
      (value: T) => {
        // Because we have to notify all groups of any errors that occur in here,
        // we have to add our own try/catch to ensure that those errors are propagated.
        // OperatorSubscriber will only send the error to the main subscriber.
        try {
          const key = keySelector(value);

          let group = groups.get(key);
          if (!group) {
            // Create our group subject
            groups.set(key, (group = connector ? connector() : new Subject<any>()));

            // Emit the grouped observable. Note that we can't do a simple `asObservable()` here,
            // because the grouped observable has special semantics around reference counting
            // to ensure we don't sever our connection to the source prematurely.
            const grouped = createGroupedObservable(key, group);
            subscriber.next(grouped);

            if (duration) {
              const durationSubscriber = createOperatorSubscriber(
                // Providing the group here ensures that it is disposed of -- via `unsubscribe` --
                // when the duration subscription is torn down. That is important, because then
                // if someone holds a handle to the grouped observable and tries to subscribe to it
                // after the connection to the source has been severed, they will get an
                // `ObjectUnsubscribedError` and know they can't possibly get any notifications.
                group as any,
                () => {
                  // Our duration notified! We can complete the group.
                  // The group will be removed from the map in the finalization phase.
                  group!.complete();
                  durationSubscriber?.unsubscribe();
                },
                // Completions are also sent to the group, but just the group.
                undefined,
                // Errors on the duration subscriber are sent to the group
                // but only the group. They are not sent to the main subscription.
                undefined,
                // Finalization: Remove this group from our map.
                () => groups.delete(key)
              );

              // Start our duration notifier.
              groupBySourceSubscriber.add(innerFrom(duration(grouped)).subscribe(durationSubscriber));
            }
          }

          // Send the value to our group.
          group.next(element ? element(value) : value);
        } catch (err) {
          handleError(err);
        }
      },
      // Source completes.
      () => notify((consumer) => consumer.complete()),
      // Error from the source.
      handleError,
      // Free up memory.
      // When the source subscription is _finally_ torn down, release the subjects and keys
      // in our groups Map, they may be quite large and we don't want to keep them around if we
      // don't have to.
      () => groups.clear(),
      () => {
        teardownAttempted = true;
        // We only kill our subscription to the source if we have
        // no active groups. As stated above, consider this scenario:
        // source$.pipe(groupBy(fn), take(2)).
        return activeGroups === 0;
      }
    );

    // Subscribe to the source
    source.subscribe(groupBySourceSubscriber);

    /**
     * Creates the actual grouped observable returned.
     * @param key The key of the group
     * @param groupSubject The subject that fuels the group
     */
    function createGroupedObservable(key: K, groupSubject: SubjectLike<any>) {
      const result: any = new Observable<T>((groupSubscriber) => {
        activeGroups++;
        const innerSub = groupSubject.subscribe(groupSubscriber);
        return () => {
          innerSub.unsubscribe();
          // We can kill the subscription to our source if we now have no more
          // active groups subscribed, and a finalization was already attempted on
          // the source.
          --activeGroups === 0 && teardownAttempted && groupBySourceSubscriber.unsubscribe();
        };
      });
      result.key = key;
      return result;
    }
  });
}

/**
 * An observable of values that is the emitted by the result of a {@link groupBy} operator,
 * contains a `key` property for the grouping.
 */
export interface GroupedObservable<K, T> extends Observable<T> {
  /**
   * The key value for the grouped notifications.
   */
  readonly key: K;
}
Uaximport { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';

/**
 * Ignores all items emitted by the source Observable and only passes calls of `complete` or `error`.
 *
 * ![](ignoreElements.png)
 *
 * The `ignoreElements` operator suppresses all items emitted by the source Observable,
 * but allows its termination notification (either `error` or `complete`) to pass through unchanged.
 *
 * If you do not care about the items being emitted by an Observable, but you do want to be notified
 * when it completes or when it terminates with an error, you can apply the `ignoreElements` operator
 * to the Observable, which will ensure that it will never call its observers’ `next` handlers.
 *
 * ## Example
 *
 * Ignore all `next` emissions from the source
 *
 * ```ts
 * import { of, ignoreElements } from 'rxjs';
 *
 * of('you', 'talking', 'to', 'me')
 *   .pipe(ignoreElements())
 *   .subscribe({
 *     next: word => console.log(word),
 *     error: err => console.log('error:', err),
 *     complete: () => console.log('the end'),
 *   });
 *
 * // result:
 * // 'the end'
 * ```
 *
 * @return A function that returns an empty Observable that only calls
 * `complete` or `error`, based on which one is called by the source
 * Observable.
 */
export function ignoreElements(): OperatorFunction<unknown, never> {
  return operate((source, subscriber) => {
    source.subscribe(createOperatorSubscriber(subscriber, noop));
  });
}
	xwimport { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits `false` if the input Observable emits any values, or emits `true` if the
 * input Observable completes without emitting any values.
 *
 * <span class="informal">Tells whether any values are emitted by an Observable.</span>
 *
 * ![](isEmpty.png)
 *
 * `isEmpty` transforms an Observable that emits values into an Observable that
 * emits a single boolean value representing whether or not any values were
 * emitted by the source Observable. As soon as the source Observable emits a
 * value, `isEmpty` will emit a `false` and complete.  If the source Observable
 * completes having not emitted anything, `isEmpty` will emit a `true` and
 * complete.
 *
 * A similar effect could be achieved with {@link count}, but `isEmpty` can emit
 * a `false` value sooner.
 *
 * ## Examples
 *
 * Emit `false` for a non-empty Observable
 *
 * ```ts
 * import { Subject, isEmpty } from 'rxjs';
 *
 * const source = new Subject<string>();
 * const result = source.pipe(isEmpty());
 *
 * source.subscribe(x => console.log(x));
 * result.subscribe(x => console.log(x));
 *
 * source.next('a');
 * source.next('b');
 * source.next('c');
 * source.complete();
 *
 * // Outputs
 * // 'a'
 * // false
 * // 'b'
 * // 'c'
 * ```
 *
 * Emit `true` for an empty Observable
 *
 * ```ts
 * import { EMPTY, isEmpty } from 'rxjs';
 *
 * const result = EMPTY.pipe(isEmpty());
 * result.subscribe(x => console.log(x));
 *
 * // Outputs
 * // true
 * ```
 *
 * @see {@link count}
 * @see {@link EMPTY}
 *
 * @return A function that returns an Observable that emits boolean value
 * indicating whether the source Observable was empty or not.
 */
export function isEmpty<T>(): OperatorFunction<T, boolean> {
  return operate((source, subscriber) => {
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        () => {
          subscriber.next(false);
          subscriber.complete();
        },
        () => {
          subscriber.next(true);
          subscriber.complete();
        }
      )
    );
  });
}
!aUxPimport { Observable } from '../Observable';
import { ObservableInput, OperatorFunction } from '../types';
import { identity } from '../util/identity';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { pipe } from '../util/pipe';
import { mergeMap } from './mergeMap';
import { toArray } from './toArray';

/**
 * Collects all of the inner sources from source observable. Then, once the
 * source completes, joins the values using the given static.
 *
 * This is used for {@link combineLatestAll} and {@link zipAll} which both have the
 * same behavior of collecting all inner observables, then operating on them.
 *
 * @param joinFn The type of static join to apply to the sources collected
 * @param project The projection function to apply to the values, if any
 */
export function joinAllInternals<T, R>(joinFn: (sources: ObservableInput<T>[]) => Observable<T>, project?: (...args: any[]) => R) {
  return pipe(
    // Collect all inner sources into an array, and emit them when the
    // source completes.
    toArray() as OperatorFunction<ObservableInput<T>, ObservableInput<T>[]>,
    // Run the join function on the collected array of inner sources.
    mergeMap((sources) => joinFn(sources)),
    // If a projection function was supplied, apply it to each result.
    project ? mapOneOrManyArgs(project) : (identity as any)
  );
}
Lsx[import { Observable } from '../Observable';
import { EmptyError } from '../util/EmptyError';
import { OperatorFunction, TruthyTypesOf } from '../types';
import { filter } from './filter';
import { takeLast } from './takeLast';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { identity } from '../util/identity';

export function last<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function last<T, D>(predicate: BooleanConstructor, defaultValue: D): OperatorFunction<T, TruthyTypesOf<T> | D>;
export function last<T, D = T>(predicate?: null, defaultValue?: D): OperatorFunction<T, T | D>;
export function last<T, S extends T>(
  predicate: (value: T, index: number, source: Observable<T>) => value is S,
  defaultValue?: S
): OperatorFunction<T, S>;
export function last<T, D = T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  defaultValue?: D
): OperatorFunction<T, T | D>;

/**
 * Returns an Observable that emits only the last item emitted by the source Observable.
 * It optionally takes a predicate function as a parameter, in which case, rather than emitting
 * the last item from the source Observable, the resulting Observable will emit the last item
 * from the source Observable that satisfies the predicate.
 *
 * ![](last.png)
 *
 * It will emit an error notification if the source completes without notification or one that matches
 * the predicate. It returns the last value or if a predicate is provided last value that matches the
 * predicate. It returns the given default value if no notification is emitted or matches the predicate.
 *
 * ## Examples
 *
 * Last alphabet from the sequence
 *
 * ```ts
 * import { from, last } from 'rxjs';
 *
 * const source = from(['x', 'y', 'z']);
 * const result = source.pipe(last());
 *
 * result.subscribe(value => console.log(`Last alphabet: ${ value }`));
 *
 * // Outputs
 * // Last alphabet: z
 * ```
 *
 * Default value when the value in the predicate is not matched
 *
 * ```ts
 * import { from, last } from 'rxjs';
 *
 * const source = from(['x', 'y', 'z']);
 * const result = source.pipe(last(char => char === 'a', 'not found'));
 *
 * result.subscribe(value => console.log(`'a' is ${ value }.`));
 *
 * // Outputs
 * // 'a' is not found.
 * ```
 *
 * @see {@link skip}
 * @see {@link skipUntil}
 * @see {@link skipLast}
 * @see {@link skipWhile}
 * @see {@link first}
 *
 * @throws {EmptyError} Delivers an `EmptyError` to the Observer's `error`
 * callback if the Observable completes before any `next` notification was sent.
 *
 * @param predicate The condition any source emitted item has to satisfy.
 * @param defaultValue An optional default value to provide if last `predicate`
 * isn't met or no values were emitted.
 * @return A function that returns an Observable that emits only the last item
 * satisfying the given condition from the source, or an error notification
 * with an `EmptyError` object if no such items are emitted.
 */
export function last<T, D>(
  predicate?: ((value: T, index: number, source: Observable<T>) => boolean) | null,
  defaultValue?: D
): OperatorFunction<T, T | D> {
  const hasDefaultValue = arguments.length >= 2;
  return (source: Observable<T>) =>
    source.pipe(
      predicate ? filter((v, i) => predicate(v, i, source)) : identity,
      takeLast(1),
      hasDefaultValue ? defaultIfEmpty(defaultValue!) : throwIfEmpty(() => new EmptyError())
    );
}
x	import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function map<T, R>(project: (value: T, index: number) => R): OperatorFunction<T, R>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function map<T, R, A>(project: (this: A, value: T, index: number) => R, thisArg: A): OperatorFunction<T, R>;

/**
 * Applies a given `project` function to each value emitted by the source
 * Observable, and emits the resulting values as an Observable.
 *
 * <span class="informal">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),
 * it passes each source value through a transformation function to get
 * corresponding output values.</span>
 *
 * ![](map.png)
 *
 * Similar to the well known `Array.prototype.map` function, this operator
 * applies a projection to each value and emits that projection in the output
 * Observable.
 *
 * ## Example
 *
 * Map every click to the `clientX` position of that click
 *
 * ```ts
 * import { fromEvent, map } from 'rxjs';
 *
 * const clicks = fromEvent<PointerEvent>(document, 'click');
 * const positions = clicks.pipe(map(ev => ev.clientX));
 *
 * positions.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link mapTo}
 * @see {@link pluck}
 *
 * @param project The function to apply to each `value` emitted by the source
 * Observable. The `index` parameter is the number `i` for the i-th emission
 * that has happened since the subscription, starting from the number `0`.
 * @param thisArg An optional argument to define what `this` is in the
 * `project` function.
 * @return A function that returns an Observable that emits the values from the
 * source Observable transformed by the given `project` function.
 */
export function map<T, R>(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction<T, R> {
  return operate((source, subscriber) => {
    // The index of the value from the source. Used with projection.
    let index = 0;
    // Subscribe to the source, all errors and completions are sent along
    // to the consumer.
    source.subscribe(
      createOperatorSubscriber(subscriber, (value: T) => {
        // Call the projection function with the appropriate this context,
        // and send the resulting value to the consumer.
        subscriber.next(project.call(thisArg, value, index++));
      })
    );
  });
}
%Xhxwimport { OperatorFunction } from '../types';
import { map } from './map';

/** @deprecated To be removed in v9. Use {@link map} instead: `map(() => value)`. */
export function mapTo<R>(value: R): OperatorFunction<unknown, R>;
/**
 * @deprecated Do not specify explicit type parameters. Signatures with type parameters
 * that cannot be inferred will be removed in v8. `mapTo` itself will be removed in v9,
 * use {@link map} instead: `map(() => value)`.
 * */
export function mapTo<T, R>(value: R): OperatorFunction<T, R>;

/**
 * Emits the given constant value on the output Observable every time the source
 * Observable emits a value.
 *
 * <span class="informal">Like {@link map}, but it maps every source value to
 * the same output value every time.</span>
 *
 * ![](mapTo.png)
 *
 * Takes a constant `value` as argument, and emits that whenever the source
 * Observable emits a value. In other words, ignores the actual source value,
 * and simply uses the emission moment to know when to emit the given `value`.
 *
 * ## Example
 *
 * Map every click to the string `'Hi'`
 *
 * ```ts
 * import { fromEvent, mapTo } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const greetings = clicks.pipe(mapTo('Hi'));
 *
 * greetings.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link map}
 *
 * @param value The value to map each source value to.
 * @return A function that returns an Observable that emits the given `value`
 * every time the source Observable emits.
 * @deprecated To be removed in v9. Use {@link map} instead: `map(() => value)`.
 */
export function mapTo<R>(value: R): OperatorFunction<unknown, R> {
  return map(() => value);
}
z./x
_import { Notification } from '../Notification';
import { OperatorFunction, ObservableNotification } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Represents all of the notifications from the source Observable as `next`
 * emissions marked with their original types within {@link Notification}
 * objects.
 *
 * <span class="informal">Wraps `next`, `error` and `complete` emissions in
 * {@link Notification} objects, emitted as `next` on the output Observable.
 * </span>
 *
 * ![](materialize.png)
 *
 * `materialize` returns an Observable that emits a `next` notification for each
 * `next`, `error`, or `complete` emission of the source Observable. When the
 * source Observable emits `complete`, the output Observable will emit `next` as
 * a Notification of type "complete", and then it will emit `complete` as well.
 * When the source Observable emits `error`, the output will emit `next` as a
 * Notification of type "error", and then `complete`.
 *
 * This operator is useful for producing metadata of the source Observable, to
 * be consumed as `next` emissions. Use it in conjunction with
 * {@link dematerialize}.
 *
 * ## Example
 *
 * Convert a faulty Observable to an Observable of Notifications
 *
 * ```ts
 * import { of, materialize, map } from 'rxjs';
 *
 * const letters = of('a', 'b', 13, 'd');
 * const upperCase = letters.pipe(map((x: any) => x.toUpperCase()));
 * const materialized = upperCase.pipe(materialize());
 *
 * materialized.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // - Notification { kind: 'N', value: 'A', error: undefined, hasValue: true }
 * // - Notification { kind: 'N', value: 'B', error: undefined, hasValue: true }
 * // - Notification { kind: 'E', value: undefined, error: TypeError { message: x.toUpperCase is not a function }, hasValue: false }
 * ```
 *
 * @see {@link Notification}
 * @see {@link dematerialize}
 *
 * @return A function that returns an Observable that emits
 * {@link Notification} objects that wrap the original emissions from the
 * source Observable with metadata.
 */
export function materialize<T>(): OperatorFunction<T, Notification<T> & ObservableNotification<T>> {
  return operate((source, subscriber) => {
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          subscriber.next(Notification.createNext(value));
        },
        () => {
          subscriber.next(Notification.createComplete());
          subscriber.complete();
        },
        (err) => {
          subscriber.next(Notification.createError(err));
          subscriber.complete();
        }
      )
    );
  });
}
ۇWxuimport { reduce } from './reduce';
import { MonoTypeOperatorFunction } from '../types';
import { isFunction } from '../util/isFunction';

/**
 * The `max` operator operates on an Observable that emits numbers (or items that
 * can be compared with a provided function), and when source Observable completes
 * it emits a single item: the item with the largest value.
 *
 * ![](max.png)
 *
 * ## Examples
 *
 * Get the maximal value of a series of numbers
 *
 * ```ts
 * import { of, max } from 'rxjs';
 *
 * of(5, 4, 7, 2, 8)
 *   .pipe(max())
 *   .subscribe(x => console.log(x));
 *
 * // Outputs
 * // 8
 * ```
 *
 * Use a comparer function to get the maximal item
 *
 * ```ts
 * import { of, max } from 'rxjs';
 *
 * of(
 *   { age: 7, name: 'Foo' },
 *   { age: 5, name: 'Bar' },
 *   { age: 9, name: 'Beer' }
 * ).pipe(
 *   max((a, b) => a.age < b.age ? -1 : 1)
 * )
 * .subscribe(x => console.log(x.name));
 *
 * // Outputs
 * // 'Beer'
 * ```
 *
 * @see {@link min}
 *
 * @param comparer Optional comparer function that it will use instead of its
 * default to compare the value of two items.
 * @return A function that returns an Observable that emits item with the
 * largest value.
 */
export function max<T>(comparer?: (x: T, y: T) => number): MonoTypeOperatorFunction<T> {
  return reduce(isFunction(comparer) ? (x, y) => (comparer(x, y) > 0 ? x : y) : (x, y) => (x > y ? x : y));
}
=aximport { ObservableInput, ObservableInputTuple, OperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { mergeAll } from './mergeAll';
import { popNumber, popScheduler } from '../util/args';
import { from } from '../observable/from';

/** @deprecated Replaced with {@link mergeWith}. Will be removed in v8. */
export function merge<T, A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link mergeWith}. Will be removed in v8. */
export function merge<T, A extends readonly unknown[]>(
  ...sourcesAndConcurrency: [...ObservableInputTuple<A>, number]
): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link mergeWith}. Will be removed in v8. */
export function merge<T, A extends readonly unknown[]>(
  ...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike]
): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link mergeWith}. Will be removed in v8. */
export function merge<T, A extends readonly unknown[]>(
  ...sourcesAndConcurrencyAndScheduler: [...ObservableInputTuple<A>, number, SchedulerLike]
): OperatorFunction<T, T | A[number]>;

export function merge<T>(...args: unknown[]): OperatorFunction<T, unknown> {
  const scheduler = popScheduler(args);
  const concurrent = popNumber(args, Infinity);

  return operate((source, subscriber) => {
    mergeAll(concurrent)(from([source, ...(args as ObservableInput<T>[])], scheduler)).subscribe(subscriber);
  });
}
	Ҿx^	import { mergeMap } from './mergeMap';
import { identity } from '../util/identity';
import { OperatorFunction, ObservableInput, ObservedValueOf } from '../types';

/**
 * Converts a higher-order Observable into a first-order Observable which
 * concurrently delivers all values that are emitted on the inner Observables.
 *
 * <span class="informal">Flattens an Observable-of-Observables.</span>
 *
 * ![](mergeAll.png)
 *
 * `mergeAll` subscribes to an Observable that emits Observables, also known as
 * a higher-order Observable. Each time it observes one of these emitted inner
 * Observables, it subscribes to that and delivers all the values from the
 * inner Observable on the output Observable. The output Observable only
 * completes once all inner Observables have completed. Any error delivered by
 * a inner Observable will be immediately emitted on the output Observable.
 *
 * ## Examples
 *
 * Spawn a new interval Observable for each click event, and blend their outputs as one Observable
 *
 * ```ts
 * import { fromEvent, map, interval, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(map(() => interval(1000)));
 * const firstOrder = higherOrder.pipe(mergeAll());
 *
 * firstOrder.subscribe(x => console.log(x));
 * ```
 *
 * Count from 0 to 9 every second for each click, but only allow 2 concurrent timers
 *
 * ```ts
 * import { fromEvent, map, interval, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(
 *   map(() => interval(1000).pipe(take(10)))
 * );
 * const firstOrder = higherOrder.pipe(mergeAll(2));
 *
 * firstOrder.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link concatAll}
 * @see {@link exhaustAll}
 * @see {@link merge}
 * @see {@link mergeMap}
 * @see {@link mergeMapTo}
 * @see {@link mergeScan}
 * @see {@link switchAll}
 * @see {@link switchMap}
 * @see {@link zipAll}
 *
 * @param concurrent Maximum number of inner Observables being subscribed to
 * concurrently.
 * @return A function that returns an Observable that emits values coming from
 * all the inner Observables emitted by the source Observable.
 */
export function mergeAll<O extends ObservableInput<any>>(concurrent: number = Infinity): OperatorFunction<O, ObservedValueOf<O>> {
  return mergeMap(identity, concurrent);
}
.UxDimport { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subscriber } from '../Subscriber';
import { ObservableInput, SchedulerLike } from '../types';
import { executeSchedule } from '../util/executeSchedule';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * A process embodying the general "merge" strategy. This is used in
 * `mergeMap` and `mergeScan` because the logic is otherwise nearly identical.
 * @param source The original source observable
 * @param subscriber The consumer subscriber
 * @param project The projection function to get our inner sources
 * @param concurrent The number of concurrent inner subscriptions
 * @param onBeforeNext Additional logic to apply before nexting to our consumer
 * @param expand If `true` this will perform an "expand" strategy, which differs only
 * in that it recurses, and the inner subscription must be schedule-able.
 * @param innerSubScheduler A scheduler to use to schedule inner subscriptions,
 * this is to support the expand strategy, mostly, and should be deprecated
 */
export function mergeInternals<T, R>(
  source: Observable<T>,
  subscriber: Subscriber<R>,
  project: (value: T, index: number) => ObservableInput<R>,
  concurrent: number,
  onBeforeNext?: (innerValue: R) => void,
  expand?: boolean,
  innerSubScheduler?: SchedulerLike,
  additionalFinalizer?: () => void
) {
  // Buffered values, in the event of going over our concurrency limit
  const buffer: T[] = [];
  // The number of active inner subscriptions.
  let active = 0;
  // An index to pass to our accumulator function
  let index = 0;
  // Whether or not the outer source has completed.
  let isComplete = false;

  /**
   * Checks to see if we can complete our result or not.
   */
  const checkComplete = () => {
    // If the outer has completed, and nothing is left in the buffer,
    // and we don't have any active inner subscriptions, then we can
    // Emit the state and complete.
    if (isComplete && !buffer.length && !active) {
      subscriber.complete();
    }
  };

  // If we're under our concurrency limit, just start the inner subscription, otherwise buffer and wait.
  const outerNext = (value: T) => (active < concurrent ? doInnerSub(value) : buffer.push(value));

  const doInnerSub = (value: T) => {
    // If we're expanding, we need to emit the outer values and the inner values
    // as the inners will "become outers" in a way as they are recursively fed
    // back to the projection mechanism.
    expand && subscriber.next(value as any);

    // Increment the number of active subscriptions so we can track it
    // against our concurrency limit later.
    active++;

    // A flag used to show that the inner observable completed.
    // This is checked during finalization to see if we should
    // move to the next item in the buffer, if there is on.
    let innerComplete = false;

    // Start our inner subscription.
    innerFrom(project(value, index++)).subscribe(
      createOperatorSubscriber(
        subscriber,
        (innerValue) => {
          // `mergeScan` has additional handling here. For example
          // taking the inner value and updating state.
          onBeforeNext?.(innerValue);

          if (expand) {
            // If we're expanding, then just recurse back to our outer
            // handler. It will emit the value first thing.
            outerNext(innerValue as any);
          } else {
            // Otherwise, emit the inner value.
            subscriber.next(innerValue);
          }
        },
        () => {
          // Flag that we have completed, so we know to check the buffer
          // during finalization.
          innerComplete = true;
        },
        // Errors are passed to the destination.
        undefined,
        () => {
          // During finalization, if the inner completed (it wasn't errored or
          // cancelled), then we want to try the next item in the buffer if
          // there is one.
          if (innerComplete) {
            // We have to wrap this in a try/catch because it happens during
            // finalization, possibly asynchronously, and we want to pass
            // any errors that happen (like in a projection function) to
            // the outer Subscriber.
            try {
              // INNER SOURCE COMPLETE
              // Decrement the active count to ensure that the next time
              // we try to call `doInnerSub`, the number is accurate.
              active--;
              // If we have more values in the buffer, try to process those
              // Note that this call will increment `active` ahead of the
              // next conditional, if there were any more inner subscriptions
              // to start.
              while (buffer.length && active < concurrent) {
                const bufferedValue = buffer.shift()!;
                // Particularly for `expand`, we need to check to see if a scheduler was provided
                // for when we want to start our inner subscription. Otherwise, we just start
                // are next inner subscription.
                if (innerSubScheduler) {
                  executeSchedule(subscriber, innerSubScheduler, () => doInnerSub(bufferedValue));
                } else {
                  doInnerSub(bufferedValue);
                }
              }
              // Check to see if we can complete, and complete if so.
              checkComplete();
            } catch (err) {
              subscriber.error(err);
            }
          }
        }
      )
    );
  };

  // Subscribe to our source observable.
  source.subscribe(
    createOperatorSubscriber(subscriber, outerNext, () => {
      // Outer completed, make a note of it, and check to see if we can complete everything.
      isComplete = true;
      checkComplete();
    })
  );

  // Additional finalization (for when the destination is torn down).
  // Other finalization is added implicitly via subscription above.
  return () => {
    additionalFinalizer?.();
  };
}
.yxbimport { ObservableInput, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';

/**
 * Applies an accumulator function over the source Observable where the
 * accumulator function itself returns an Observable, then each intermediate
 * Observable returned is merged into the output Observable.
 *
 * <span class="informal">It's like {@link scan}, but the Observables returned
 * by the accumulator are merged into the outer Observable.</span>
 *
 * The first parameter of the `mergeScan` is an `accumulator` function which is
 * being called every time the source Observable emits a value. `mergeScan` will
 * subscribe to the value returned by the `accumulator` function and will emit
 * values to the subscriber emitted by inner Observable.
 *
 * The `accumulator` function is being called with three parameters passed to it:
 * `acc`, `value` and `index`. The `acc` parameter is used as the state parameter
 * whose value is initially set to the `seed` parameter (the second parameter
 * passed to the `mergeScan` operator).
 *
 * `mergeScan` internally keeps the value of the `acc` parameter: as long as the
 * source Observable emits without inner Observable emitting, the `acc` will be
 * set to `seed`. The next time the inner Observable emits a value, `mergeScan`
 * will internally remember it and it will be passed to the `accumulator`
 * function as `acc` parameter the next time source emits.
 *
 * The `value` parameter of the `accumulator` function is the value emitted by the
 * source Observable, while the `index` is a number which represent the order of the
 * current emission by the source Observable. It starts with 0.
 *
 * The last parameter to the `mergeScan` is the `concurrent` value which defaults
 * to Infinity. It represents the maximum number of inner Observable subscriptions
 * at a time.
 *
 * ## Example
 *
 * Count the number of click events
 *
 * ```ts
 * import { fromEvent, map, mergeScan, of } from 'rxjs';
 *
 * const click$ = fromEvent(document, 'click');
 * const one$ = click$.pipe(map(() => 1));
 * const seed = 0;
 * const count$ = one$.pipe(
 *   mergeScan((acc, one) => of(acc + one), seed)
 * );
 *
 * count$.subscribe(x => console.log(x));
 *
 * // Results:
 * // 1
 * // 2
 * // 3
 * // 4
 * // ...and so on for each click
 * ```
 *
 * @see {@link scan}
 * @see {@link switchScan}
 *
 * @param accumulator The accumulator function called on each source value.
 * @param seed The initial accumulation value.
 * @param concurrent Maximum number of input Observables being subscribed to
 * concurrently.
 * @return A function that returns an Observable of the accumulated values.
 */
export function mergeScan<T, R>(
  accumulator: (acc: R, value: T, index: number) => ObservableInput<R>,
  seed: R,
  concurrent = Infinity
): OperatorFunction<T, R> {
  return operate((source, subscriber) => {
    // The accumulated state.
    let state = seed;

    return mergeInternals(
      source,
      subscriber,
      (value, index) => accumulator(state, value, index),
      concurrent,
      (value) => {
        state = value;
      },
      false,
      undefined,
      () => (state = null!)
    );
  });
}
rL5Gaximport { ObservableInputTuple, OperatorFunction } from '../types';
import { merge } from './merge';

/**
 * Merge the values from all observables to a single observable result.
 *
 * Creates an observable, that when subscribed to, subscribes to the source
 * observable, and all other sources provided as arguments. All values from
 * every source are emitted from the resulting subscription.
 *
 * When all sources complete, the resulting observable will complete.
 *
 * When any source errors, the resulting observable will error.
 *
 * ## Example
 *
 * Joining all outputs from multiple user input event streams
 *
 * ```ts
 * import { fromEvent, map, mergeWith } from 'rxjs';
 *
 * const clicks$ = fromEvent(document, 'click').pipe(map(() => 'click'));
 * const mousemoves$ = fromEvent(document, 'mousemove').pipe(map(() => 'mousemove'));
 * const dblclicks$ = fromEvent(document, 'dblclick').pipe(map(() => 'dblclick'));
 *
 * mousemoves$
 *   .pipe(mergeWith(clicks$, dblclicks$))
 *   .subscribe(x => console.log(x));
 *
 * // result (assuming user interactions)
 * // 'mousemove'
 * // 'mousemove'
 * // 'mousemove'
 * // 'click'
 * // 'click'
 * // 'dblclick'
 * ```
 *
 * @see {@link merge}
 *
 * @param otherSources the sources to combine the current source with.
 * @return A function that returns an Observable that merges the values from
 * all given Observables.
 */
export function mergeWith<T, A extends readonly unknown[]>(
  ...otherSources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]> {
  return merge(...otherSources);
}
	LWxvimport { reduce } from './reduce';
import { MonoTypeOperatorFunction } from '../types';
import { isFunction } from '../util/isFunction';

/**
 * The `min` operator operates on an Observable that emits numbers (or items that
 * can be compared with a provided function), and when source Observable completes
 * it emits a single item: the item with the smallest value.
 *
 * ![](min.png)
 *
 * ## Examples
 *
 * Get the minimal value of a series of numbers
 *
 * ```ts
 * import { of, min } from 'rxjs';
 *
 * of(5, 4, 7, 2, 8)
 *   .pipe(min())
 *   .subscribe(x => console.log(x));
 *
 * // Outputs
 * // 2
 * ```
 *
 * Use a comparer function to get the minimal item
 *
 * ```ts
 * import { of, min } from 'rxjs';
 *
 * of(
 *   { age: 7, name: 'Foo' },
 *   { age: 5, name: 'Bar' },
 *   { age: 9, name: 'Beer' }
 * ).pipe(
 *   min((a, b) => a.age < b.age ? -1 : 1)
 * )
 * .subscribe(x => console.log(x.name));
 *
 * // Outputs
 * // 'Bar'
 * ```
 *
 * @see {@link max}
 *
 * @param comparer Optional comparer function that it will use instead of its
 * default to compare the value of two items.
 * @return A function that returns an Observable that emits item with the
 * smallest value.
 */
export function min<T>(comparer?: (x: T, y: T) => number): MonoTypeOperatorFunction<T> {
  return reduce(isFunction(comparer) ? (x, y) => (comparer(x, y) < 0 ? x : y) : (x, y) => (x < y ? x : y));
}
yxfimport { Subject } from '../Subject';
import { Observable } from '../Observable';
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { OperatorFunction, UnaryFunction, ObservedValueOf, ObservableInput } from '../types';
import { isFunction } from '../util/isFunction';
import { connect } from './connect';

/**
 * An operator that creates a {@link ConnectableObservable}, that when connected,
 * with the `connect` method, will use the provided subject to multicast the values
 * from the source to all consumers.
 *
 * @param subject The subject to multicast through.
 * @return A function that returns a {@link ConnectableObservable}
 * @deprecated Will be removed in v8. To create a connectable observable, use {@link connectable}.
 * If you're using {@link refCount} after `multicast`, use the {@link share} operator instead.
 * `multicast(subject), refCount()` is equivalent to
 * `share({ connector: () => subject, resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T>(subject: Subject<T>): UnaryFunction<Observable<T>, ConnectableObservable<T>>;

/**
 * Because this is deprecated in favor of the {@link connect} operator, and was otherwise poorly documented,
 * rather than duplicate the effort of documenting the same behavior, please see documentation for the
 * {@link connect} operator.
 *
 * @param subject The subject used to multicast.
 * @param selector A setup function to setup the multicast
 * @return A function that returns an observable that mirrors the observable returned by the selector.
 * @deprecated Will be removed in v8. Use the {@link connect} operator instead.
 * `multicast(subject, selector)` is equivalent to
 * `connect(selector, { connector: () => subject })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T, O extends ObservableInput<any>>(
  subject: Subject<T>,
  selector: (shared: Observable<T>) => O
): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * An operator that creates a {@link ConnectableObservable}, that when connected,
 * with the `connect` method, will use the provided subject to multicast the values
 * from the source to all consumers.
 *
 * @param subjectFactory A factory that will be called to create the subject. Passing a function here
 * will cause the underlying subject to be "reset" on error, completion, or refCounted unsubscription of
 * the source.
 * @return A function that returns a {@link ConnectableObservable}
 * @deprecated Will be removed in v8. To create a connectable observable, use {@link connectable}.
 * If you're using {@link refCount} after `multicast`, use the {@link share} operator instead.
 * `multicast(() => new BehaviorSubject('test')), refCount()` is equivalent to
 * `share({ connector: () => new BehaviorSubject('test') })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T>(subjectFactory: () => Subject<T>): UnaryFunction<Observable<T>, ConnectableObservable<T>>;

/**
 * Because this is deprecated in favor of the {@link connect} operator, and was otherwise poorly documented,
 * rather than duplicate the effort of documenting the same behavior, please see documentation for the
 * {@link connect} operator.
 *
 * @param subjectFactory A factory that creates the subject used to multicast.
 * @param selector A function to setup the multicast and select the output.
 * @return A function that returns an observable that mirrors the observable returned by the selector.
 * @deprecated Will be removed in v8. Use the {@link connect} operator instead.
 * `multicast(subjectFactory, selector)` is equivalent to
 * `connect(selector, { connector: subjectFactory })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T, O extends ObservableInput<any>>(
  subjectFactory: () => Subject<T>,
  selector: (shared: Observable<T>) => O
): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * @deprecated Will be removed in v8. Use the {@link connectable} observable, the {@link connect} operator or the
 * {@link share} operator instead. See the overloads below for equivalent replacement examples of this operator's
 * behaviors.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T, R>(
  subjectOrSubjectFactory: Subject<T> | (() => Subject<T>),
  selector?: (source: Observable<T>) => Observable<R>
): OperatorFunction<T, R> {
  const subjectFactory = isFunction(subjectOrSubjectFactory) ? subjectOrSubjectFactory : () => subjectOrSubjectFactory;

  if (isFunction(selector)) {
    // If a selector function is provided, then we're a "normal" operator that isn't
    // going to return a ConnectableObservable. We can use `connect` to do what we
    // need to do.
    return connect(selector, {
      connector: subjectFactory,
    });
  }

  return (source: Observable<T>) => new ConnectableObservable<any>(source, subjectFactory);
}
&x/** @prettier */
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { executeSchedule } from '../util/executeSchedule';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Re-emits all notifications from source Observable with specified scheduler.
 *
 * <span class="informal">Ensure a specific scheduler is used, from outside of an Observable.</span>
 *
 * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule
 * notifications emitted by the source Observable. It might be useful, if you do not have control over
 * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.
 *
 * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,
 * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal
 * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits
 * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.
 * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split
 * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source
 * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a
 * little bit more, to ensure that they are emitted at expected moments.
 *
 * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications
 * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`
 * will delay all notifications - including error notifications - while `delay` will pass through error
 * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator
 * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used
 * for notification emissions in general.
 *
 * ## Example
 *
 * Ensure values in subscribe are called just before browser repaint
 *
 * ```ts
 * import { interval, observeOn, animationFrameScheduler } from 'rxjs';
 *
 * const someDiv = document.createElement('div');
 * someDiv.style.cssText = 'width: 200px;background: #09c';
 * document.body.appendChild(someDiv);
 * const intervals = interval(10);      // Intervals are scheduled
 *                                      // with async scheduler by default...
 * intervals.pipe(
 *   observeOn(animationFrameScheduler) // ...but we will observe on animationFrame
 * )                                    // scheduler to ensure smooth animation.
 * .subscribe(val => {
 *   someDiv.style.height = val + 'px';
 * });
 * ```
 *
 * @see {@link delay}
 *
 * @param scheduler Scheduler that will be used to reschedule notifications from source Observable.
 * @param delay Number of milliseconds that states with what delay every notification should be rescheduled.
 * @return A function that returns an Observable that emits the same
 * notifications as the source Observable, but with provided scheduler.
 */
export function observeOn<T>(scheduler: SchedulerLike, delay = 0): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => executeSchedule(subscriber, scheduler, () => subscriber.next(value), delay),
        () => executeSchedule(subscriber, scheduler, () => subscriber.complete(), delay),
        (err) => executeSchedule(subscriber, scheduler, () => subscriber.error(err), delay)
      )
    );
  });
}
71Vx~import { ObservableInputTuple, OperatorFunction } from '../types';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { onErrorResumeNext as oERNCreate } from '../observable/onErrorResumeNext';

export function onErrorResumeNextWith<T, A extends readonly unknown[]>(
  sources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]>;
export function onErrorResumeNextWith<T, A extends readonly unknown[]>(
  ...sources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]>;

/**
 * When any of the provided Observable emits an complete or error notification, it immediately subscribes to the next one
 * that was passed.
 *
 * <span class="informal">Execute series of Observables, subscribes to next one on error or complete.</span>
 *
 * ![](onErrorResumeNext.png)
 *
 * `onErrorResumeNext` is an operator that accepts a series of Observables, provided either directly as
 * arguments or as an array. If no single Observable is provided, returned Observable will simply behave the same
 * as the source.
 *
 * `onErrorResumeNext` returns an Observable that starts by subscribing and re-emitting values from the source Observable.
 * When its stream of values ends - no matter if Observable completed or emitted an error - `onErrorResumeNext`
 * will subscribe to the first Observable that was passed as an argument to the method. It will start re-emitting
 * its values as well and - again - when that stream ends, `onErrorResumeNext` will proceed to subscribing yet another
 * Observable in provided series, no matter if previous Observable completed or ended with an error. This will
 * be happening until there is no more Observables left in the series, at which point returned Observable will
 * complete - even if the last subscribed stream ended with an error.
 *
 * `onErrorResumeNext` can be therefore thought of as version of {@link concat} operator, which is more permissive
 * when it comes to the errors emitted by its input Observables. While `concat` subscribes to the next Observable
 * in series only if previous one successfully completed, `onErrorResumeNext` subscribes even if it ended with
 * an error.
 *
 * Note that you do not get any access to errors emitted by the Observables. In particular do not
 * expect these errors to appear in error callback passed to {@link Observable#subscribe}. If you want to take
 * specific actions based on what error was emitted by an Observable, you should try out {@link catchError} instead.
 *
 *
 * ## Example
 *
 * Subscribe to the next Observable after map fails
 *
 * ```ts
 * import { of, onErrorResumeNext, map } from 'rxjs';
 *
 * of(1, 2, 3, 0)
 *   .pipe(
 *     map(x => {
 *       if (x === 0) {
 *         throw Error();
 *       }
 *
 *       return 10 / x;
 *     }),
 *     onErrorResumeNext(of(1, 2, 3))
 *   )
 *   .subscribe({
 *     next: val => console.log(val),
 *     error: err => console.log(err),          // Will never be called.
 *     complete: () => console.log('that\'s it!')
 *   });
 *
 * // Logs:
 * // 10
 * // 5
 * // 3.3333333333333335
 * // 1
 * // 2
 * // 3
 * // 'that's it!'
 * ```
 *
 * @see {@link concat}
 * @see {@link catchError}
 *
 * @param sources `ObservableInput`s passed either directly or as an array.
 * @return A function that returns an Observable that emits values from source
 * Observable, but - if it errors - subscribes to the next passed Observable
 * and so on, until it completes or runs out of Observables.
 */
export function onErrorResumeNextWith<T, A extends readonly unknown[]>(
  ...sources: [[...ObservableInputTuple<A>]] | [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]> {
  // For some reason, TS 4.1 RC gets the inference wrong here and infers the
  // result to be `A[number][]` - completely dropping the ObservableInput part
  // of the type. This makes no sense whatsoever. As a workaround, the type is
  // asserted explicitly.
  const nextSources = argsOrArgArray(sources) as unknown as ObservableInputTuple<A>;

  return (source) => oERNCreate(source, ...nextSources);
}

/**
 * @deprecated Renamed. Use {@link onErrorResumeNextWith} instead. Will be removed in v8.
 */
export const onErrorResumeNext = onErrorResumeNextWith;
}xx|import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Groups pairs of consecutive emissions together and emits them as an array of
 * two values.
 *
 * <span class="informal">Puts the current value and previous value together as
 * an array, and emits that.</span>
 *
 * ![](pairwise.png)
 *
 * The Nth emission from the source Observable will cause the output Observable
 * to emit an array [(N-1)th, Nth] of the previous and the current value, as a
 * pair. For this reason, `pairwise` emits on the second and subsequent
 * emissions from the source Observable, but not on the first emission, because
 * there is no previous value in that case.
 *
 * ## Example
 *
 * On every click (starting from the second), emit the relative distance to the previous click
 *
 * ```ts
 * import { fromEvent, pairwise, map } from 'rxjs';
 *
 * const clicks = fromEvent<PointerEvent>(document, 'click');
 * const pairs = clicks.pipe(pairwise());
 * const distance = pairs.pipe(
 *   map(([first, second]) => {
 *     const x0 = first.clientX;
 *     const y0 = first.clientY;
 *     const x1 = second.clientX;
 *     const y1 = second.clientY;
 *     return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
 *   })
 * );
 *
 * distance.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferCount}
 *
 * @return A function that returns an Observable of pairs (as arrays) of
 * consecutive values from the source Observable.
 */
export function pairwise<T>(): OperatorFunction<T, [T, T]> {
  return operate((source, subscriber) => {
    let prev: T;
    let hasPrev = false;
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        const p = prev;
        prev = value;
        hasPrev && subscriber.next([p, value]);
        hasPrev = true;
      })
    );
  });
}
_p`ximport { map } from './map';
import { OperatorFunction } from '../types';

/* tslint:disable:max-line-length */
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T, K1 extends keyof T>(k1: K1): OperatorFunction<T, T[K1]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1]>(k1: K1, k2: K2): OperatorFunction<T, T[K1][K2]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(
  k1: K1,
  k2: K2,
  k3: K3
): OperatorFunction<T, T[K1][K2][K3]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(
  k1: K1,
  k2: K2,
  k3: K3,
  k4: K4
): OperatorFunction<T, T[K1][K2][K3][K4]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<
  T,
  K1 extends keyof T,
  K2 extends keyof T[K1],
  K3 extends keyof T[K1][K2],
  K4 extends keyof T[K1][K2][K3],
  K5 extends keyof T[K1][K2][K3][K4]
>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): OperatorFunction<T, T[K1][K2][K3][K4][K5]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<
  T,
  K1 extends keyof T,
  K2 extends keyof T[K1],
  K3 extends keyof T[K1][K2],
  K4 extends keyof T[K1][K2][K3],
  K5 extends keyof T[K1][K2][K3][K4],
  K6 extends keyof T[K1][K2][K3][K4][K5]
>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6): OperatorFunction<T, T[K1][K2][K3][K4][K5][K6]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<
  T,
  K1 extends keyof T,
  K2 extends keyof T[K1],
  K3 extends keyof T[K1][K2],
  K4 extends keyof T[K1][K2][K3],
  K5 extends keyof T[K1][K2][K3][K4],
  K6 extends keyof T[K1][K2][K3][K4][K5]
>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, ...rest: string[]): OperatorFunction<T, unknown>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T>(...properties: string[]): OperatorFunction<T, unknown>;
/* tslint:enable:max-line-length */

/**
 * Maps each source value to its specified nested property.
 *
 * <span class="informal">Like {@link map}, but meant only for picking one of
 * the nested properties of every emitted value.</span>
 *
 * ![](pluck.png)
 *
 * Given a list of strings or numbers describing a path to a property, retrieves
 * the value of a specified nested property from all values in the source
 * Observable. If a property can't be resolved, it will return `undefined` for
 * that value.
 *
 * ## Example
 *
 * Map every click to the tagName of the clicked target element
 *
 * ```ts
 * import { fromEvent, pluck } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const tagNames = clicks.pipe(pluck('target', 'tagName'));
 *
 * tagNames.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link map}
 *
 * @param properties The nested properties to pluck from each source
 * value.
 * @return A function that returns an Observable of property values from the
 * source values.
 * @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8.
 */
export function pluck<T, R>(...properties: Array<string | number | symbol>): OperatorFunction<T, R> {
  const length = properties.length;
  if (length === 0) {
    throw new Error('list of properties cannot be empty.');
  }
  return map((x) => {
    let currentProp: any = x;
    for (let i = 0; i < length; i++) {
      const p = currentProp?.[properties[i]];
      if (typeof p !== 'undefined') {
        currentProp = p;
      } else {
        return undefined;
      }
    }
    return currentProp;
  });
}
v_ximport { Observable } from '../Observable';
import { Subject } from '../Subject';
import { multicast } from './multicast';
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { MonoTypeOperatorFunction, OperatorFunction, UnaryFunction, ObservableInput, ObservedValueOf } from '../types';
import { connect } from './connect';

/**
 * Returns a connectable observable that, when connected, will multicast
 * all values through a single underlying {@link Subject} instance.
 *
 * @deprecated Will be removed in v8. To create a connectable observable, use {@link connectable}.
 * `source.pipe(publish())` is equivalent to
 * `connectable(source, { connector: () => new Subject(), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publish`, use {@link share} operator instead.
 * `source.pipe(publish(), refCount())` is equivalent to
 * `source.pipe(share({ resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }))`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publish<T>(): UnaryFunction<Observable<T>, ConnectableObservable<T>>;

/**
 * Returns an observable, that when subscribed to, creates an underlying {@link Subject},
 * provides an observable view of it to a `selector` function, takes the observable result of
 * that selector function and subscribes to it, sending its values to the consumer, _then_ connects
 * the subject to the original source.
 *
 * @param selector A function used to setup multicasting prior to automatic connection.
 *
 * @deprecated Will be removed in v8. Use the {@link connect} operator instead.
 * `publish(selector)` is equivalent to `connect(selector)`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publish<T, O extends ObservableInput<any>>(selector: (shared: Observable<T>) => O): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called
 * before it begins emitting items to those Observers that have subscribed to it.
 *
 * <span class="informal">Makes a cold Observable hot</span>
 *
 * ![](publish.png)
 *
 * ## Examples
 *
 * Make `source$` hot by applying `publish` operator, then merge each inner observable into a single one
 * and subscribe
 *
 * ```ts
 * import { zip, interval, of, map, publish, merge, tap } from 'rxjs';
 *
 * const source$ = zip(interval(2000), of(1, 2, 3, 4, 5, 6, 7, 8, 9))
 *   .pipe(map(([, number]) => number));
 *
 * source$
 *   .pipe(
 *     publish(multicasted$ =>
 *       merge(
 *         multicasted$.pipe(tap(x => console.log('Stream 1:', x))),
 *         multicasted$.pipe(tap(x => console.log('Stream 2:', x))),
 *         multicasted$.pipe(tap(x => console.log('Stream 3:', x)))
 *       )
 *     )
 *   )
 *   .subscribe();
 *
 * // Results every two seconds
 * // Stream 1: 1
 * // Stream 2: 1
 * // Stream 3: 1
 * // ...
 * // Stream 1: 9
 * // Stream 2: 9
 * // Stream 3: 9
 * ```
 *
 * @see {@link publishLast}
 * @see {@link publishReplay}
 * @see {@link publishBehavior}
 *
 * @param selector Optional selector function which can use the multicasted source sequence as many times
 * as needed, without causing multiple subscriptions to the source sequence.
 * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.
 * @return A function that returns a ConnectableObservable that upon connection
 * causes the source Observable to emit items to its Observers.
 * @deprecated Will be removed in v8. Use the {@link connectable} observable, the {@link connect} operator or the
 * {@link share} operator instead. See the overloads below for equivalent replacement examples of this operator's
 * behaviors.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publish<T, R>(selector?: OperatorFunction<T, R>): MonoTypeOperatorFunction<T> | OperatorFunction<T, R> {
  return selector ? (source) => connect(selector)(source) : (source) => multicast(new Subject<T>())(source);
}
wd\x1import { Observable } from '../Observable';
import { BehaviorSubject } from '../BehaviorSubject';
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { UnaryFunction } from '../types';

/**
 * Creates a {@link ConnectableObservable} that utilizes a {@link BehaviorSubject}.
 *
 * @param initialValue The initial value passed to the {@link BehaviorSubject}.
 * @return A function that returns a {@link ConnectableObservable}
 * @deprecated Will be removed in v8. To create a connectable observable that uses a
 * {@link BehaviorSubject} under the hood, use {@link connectable}.
 * `source.pipe(publishBehavior(initValue))` is equivalent to
 * `connectable(source, { connector: () => new BehaviorSubject(initValue), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publishBehavior`, use the {@link share} operator instead.
 * `source.pipe(publishBehavior(initValue), refCount())` is equivalent to
 * `source.pipe(share({ connector: () => new BehaviorSubject(initValue), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false  }))`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishBehavior<T>(initialValue: T): UnaryFunction<Observable<T>, ConnectableObservable<T>> {
  // Note that this has *never* supported the selector function.
  return (source) => {
    const subject = new BehaviorSubject<T>(initialValue);
    return new ConnectableObservable(source, () => subject);
  };
}

zxuimport { Observable } from '../Observable';
import { AsyncSubject } from '../AsyncSubject';
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { UnaryFunction } from '../types';

/**
 * Returns a connectable observable sequence that shares a single subscription to the
 * underlying sequence containing only the last notification.
 *
 * ![](publishLast.png)
 *
 * Similar to {@link publish}, but it waits until the source observable completes and stores
 * the last emitted value.
 * Similarly to {@link publishReplay} and {@link publishBehavior}, this keeps storing the last
 * value even if it has no more subscribers. If subsequent subscriptions happen, they will
 * immediately get that last stored value and complete.
 *
 * ## Example
 *
 * ```ts
 * import { ConnectableObservable, interval, publishLast, tap, take } from 'rxjs';
 *
 * const connectable = <ConnectableObservable<number>>interval(1000)
 *   .pipe(
 *     tap(x => console.log('side effect', x)),
 *     take(3),
 *     publishLast()
 *   );
 *
 * connectable.subscribe({
 *   next: x => console.log('Sub. A', x),
 *   error: err => console.log('Sub. A Error', err),
 *   complete: () => console.log('Sub. A Complete')
 * });
 *
 * connectable.subscribe({
 *   next: x => console.log('Sub. B', x),
 *   error: err => console.log('Sub. B Error', err),
 *   complete: () => console.log('Sub. B Complete')
 * });
 *
 * connectable.connect();
 *
 * // Results:
 * // 'side effect 0'   - after one second
 * // 'side effect 1'   - after two seconds
 * // 'side effect 2'   - after three seconds
 * // 'Sub. A 2'        - immediately after 'side effect 2'
 * // 'Sub. B 2'
 * // 'Sub. A Complete'
 * // 'Sub. B Complete'
 * ```
 *
 * @see {@link ConnectableObservable}
 * @see {@link publish}
 * @see {@link publishReplay}
 * @see {@link publishBehavior}
 *
 * @return A function that returns an Observable that emits elements of a
 * sequence produced by multicasting the source sequence.
 * @deprecated Will be removed in v8. To create a connectable observable with an
 * {@link AsyncSubject} under the hood, use {@link connectable}.
 * `source.pipe(publishLast())` is equivalent to
 * `connectable(source, { connector: () => new AsyncSubject(), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publishLast`, use the {@link share} operator instead.
 * `source.pipe(publishLast(), refCount())` is equivalent to
 * `source.pipe(share({ connector: () => new AsyncSubject(), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }))`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishLast<T>(): UnaryFunction<Observable<T>, ConnectableObservable<T>> {
  // Note that this has *never* supported a selector function like `publish` and `publishReplay`.
  return (source) => {
    const subject = new AsyncSubject<T>();
    return new ConnectableObservable(source, () => subject);
  };
}
тx1import { Observable } from '../Observable';
import { ReplaySubject } from '../ReplaySubject';
import { multicast } from './multicast';
import { MonoTypeOperatorFunction, OperatorFunction, TimestampProvider, ObservableInput, ObservedValueOf } from '../types';
import { isFunction } from '../util/isFunction';

/**
 * Creates a {@link ConnectableObservable} that uses a {@link ReplaySubject}
 * internally.
 *
 * @param bufferSize The buffer size for the underlying {@link ReplaySubject}.
 * @param windowTime The window time for the underlying {@link ReplaySubject}.
 * @param timestampProvider The timestamp provider for the underlying {@link ReplaySubject}.
 * @deprecated Will be removed in v8. To create a connectable observable that uses a
 * {@link ReplaySubject} under the hood, use {@link connectable}.
 * `source.pipe(publishReplay(size, time, scheduler))` is equivalent to
 * `connectable(source, { connector: () => new ReplaySubject(size, time, scheduler), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publishReplay`, use the {@link share} operator instead.
 * `publishReplay(size, time, scheduler), refCount()` is equivalent to
 * `share({ connector: () => new ReplaySubject(size, time, scheduler), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishReplay<T>(
  bufferSize?: number,
  windowTime?: number,
  timestampProvider?: TimestampProvider
): MonoTypeOperatorFunction<T>;

/**
 * Creates an observable, that when subscribed to, will create a {@link ReplaySubject},
 * and pass an observable from it (using [asObservable](api/index/class/Subject#asObservable)) to
 * the `selector` function, which then returns an observable that is subscribed to before
 * "connecting" the source to the internal `ReplaySubject`.
 *
 * Since this is deprecated, for additional details see the documentation for {@link connect}.
 *
 * @param bufferSize The buffer size for the underlying {@link ReplaySubject}.
 * @param windowTime The window time for the underlying {@link ReplaySubject}.
 * @param selector A function used to setup the multicast.
 * @param timestampProvider The timestamp provider for the underlying {@link ReplaySubject}.
 * @deprecated Will be removed in v8. Use the {@link connect} operator instead.
 * `source.pipe(publishReplay(size, window, selector, scheduler))` is equivalent to
 * `source.pipe(connect(selector, { connector: () => new ReplaySubject(size, window, scheduler) }))`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishReplay<T, O extends ObservableInput<any>>(
  bufferSize: number | undefined,
  windowTime: number | undefined,
  selector: (shared: Observable<T>) => O,
  timestampProvider?: TimestampProvider
): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * Creates a {@link ConnectableObservable} that uses a {@link ReplaySubject}
 * internally.
 *
 * @param bufferSize The buffer size for the underlying {@link ReplaySubject}.
 * @param windowTime The window time for the underlying {@link ReplaySubject}.
 * @param selector Passing `undefined` here determines that this operator will return a {@link ConnectableObservable}.
 * @param timestampProvider The timestamp provider for the underlying {@link ReplaySubject}.
 * @deprecated Will be removed in v8. To create a connectable observable that uses a
 * {@link ReplaySubject} under the hood, use {@link connectable}.
 * `source.pipe(publishReplay(size, time, scheduler))` is equivalent to
 * `connectable(source, { connector: () => new ReplaySubject(size, time, scheduler), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publishReplay`, use the {@link share} operator instead.
 * `publishReplay(size, time, scheduler), refCount()` is equivalent to
 * `share({ connector: () => new ReplaySubject(size, time, scheduler), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishReplay<T, O extends ObservableInput<any>>(
  bufferSize: number | undefined,
  windowTime: number | undefined,
  selector: undefined,
  timestampProvider: TimestampProvider
): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * @deprecated Will be removed in v8. Use the {@link connectable} observable, the {@link connect} operator or the
 * {@link share} operator instead. See the overloads below for equivalent replacement examples of this operator's
 * behaviors.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishReplay<T, R>(
  bufferSize?: number,
  windowTime?: number,
  selectorOrScheduler?: TimestampProvider | OperatorFunction<T, R>,
  timestampProvider?: TimestampProvider
) {
  if (selectorOrScheduler && !isFunction(selectorOrScheduler)) {
    timestampProvider = selectorOrScheduler;
  }
  const selector = isFunction(selectorOrScheduler) ? selectorOrScheduler : undefined;
  // Note, we're passing `selector!` here, because at runtime, `undefined` is an acceptable argument
  // but it makes our TypeScript signature for `multicast` unhappy (as it should, because it's gross).
  return (source: Observable<T>) => multicast(new ReplaySubject<T>(bufferSize, windowTime, timestampProvider), selector!)(source);
}
J_Gximport { ObservableInputTuple, OperatorFunction } from '../types';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { raceWith } from './raceWith';

/** @deprecated Replaced with {@link raceWith}. Will be removed in v8. */
export function race<T, A extends readonly unknown[]>(otherSources: [...ObservableInputTuple<A>]): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link raceWith}. Will be removed in v8. */
export function race<T, A extends readonly unknown[]>(...otherSources: [...ObservableInputTuple<A>]): OperatorFunction<T, T | A[number]>;

/**
 * Returns an Observable that mirrors the first source Observable to emit a next,
 * error or complete notification from the combination of this Observable and supplied Observables.
 * @param args Sources used to race for which Observable emits first.
 * @return A function that returns an Observable that mirrors the output of the
 * first Observable to emit an item.
 * @deprecated Replaced with {@link raceWith}. Will be removed in v8.
 */
export function race<T>(...args: any[]): OperatorFunction<T, unknown> {
  return raceWith(...argsOrArgArray(args));
}
BUTxEimport { OperatorFunction, ObservableInputTuple } from '../types';
import { raceInit } from '../observable/race';
import { operate } from '../util/lift';
import { identity } from '../util/identity';

/**
 * Creates an Observable that mirrors the first source Observable to emit a next,
 * error or complete notification from the combination of the Observable to which
 * the operator is applied and supplied Observables.
 *
 * ## Example
 *
 * ```ts
 * import { interval, map, raceWith } from 'rxjs';
 *
 * const obs1 = interval(7000).pipe(map(() => 'slow one'));
 * const obs2 = interval(3000).pipe(map(() => 'fast one'));
 * const obs3 = interval(5000).pipe(map(() => 'medium one'));
 *
 * obs1
 *   .pipe(raceWith(obs2, obs3))
 *   .subscribe(winner => console.log(winner));
 *
 * // Outputs
 * // a series of 'fast one'
 * ```
 *
 * @param otherSources Sources used to race for which Observable emits first.
 * @return A function that returns an Observable that mirrors the output of the
 * first Observable to emit an item.
 */
export function raceWith<T, A extends readonly unknown[]>(
  ...otherSources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]> {
  return !otherSources.length
    ? identity
    : operate((source, subscriber) => {
        raceInit<T | A[number]>([source, ...otherSources])(subscriber);
      });
}
UkȽx
"import { scanInternals } from './scanInternals';
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';

export function reduce<V, A = V>(accumulator: (acc: A | V, value: V, index: number) => A): OperatorFunction<V, V | A>;
export function reduce<V, A>(accumulator: (acc: A, value: V, index: number) => A, seed: A): OperatorFunction<V, A>;
export function reduce<V, A, S = A>(accumulator: (acc: A | S, value: V, index: number) => A, seed: S): OperatorFunction<V, A>;

/**
 * Applies an accumulator function over the source Observable, and returns the
 * accumulated result when the source completes, given an optional seed value.
 *
 * <span class="informal">Combines together all values emitted on the source,
 * using an accumulator function that knows how to join a new source value into
 * the accumulation from the past.</span>
 *
 * ![](reduce.png)
 *
 * Like
 * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce),
 * `reduce` applies an `accumulator` function against an accumulation and each
 * value of the source Observable (from the past) to reduce it to a single
 * value, emitted on the output Observable. Note that `reduce` will only emit
 * one value, only when the source Observable completes. It is equivalent to
 * applying operator {@link scan} followed by operator {@link last}.
 *
 * Returns an Observable that applies a specified `accumulator` function to each
 * item emitted by the source Observable. If a `seed` value is specified, then
 * that value will be used as the initial value for the accumulator. If no seed
 * value is specified, the first item of the source is used as the seed.
 *
 * ## Example
 *
 * Count the number of click events that happened in 5 seconds
 *
 * ```ts
 * import { fromEvent, takeUntil, interval, map, reduce } from 'rxjs';
 *
 * const clicksInFiveSeconds = fromEvent(document, 'click')
 *   .pipe(takeUntil(interval(5000)));
 *
 * const ones = clicksInFiveSeconds.pipe(map(() => 1));
 * const seed = 0;
 * const count = ones.pipe(reduce((acc, one) => acc + one, seed));
 *
 * count.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link count}
 * @see {@link expand}
 * @see {@link mergeScan}
 * @see {@link scan}
 *
 * @param accumulator The accumulator function called on each source value.
 * @param seed The initial accumulation value.
 * @return A function that returns an Observable that emits a single value that
 * is the result of accumulating the values emitted by the source Observable.
 */
export function reduce<V, A>(accumulator: (acc: V | A, value: V, index: number) => A, seed?: any): OperatorFunction<V, V | A> {
  return operate(scanInternals(accumulator, seed, arguments.length >= 2, false, true));
}
x.import { ConnectableObservable } from '../observable/ConnectableObservable';
import { Subscription } from '../Subscription';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Make a {@link ConnectableObservable} behave like a ordinary observable and automates the way
 * you can connect to it.
 *
 * Internally it counts the subscriptions to the observable and subscribes (only once) to the source if
 * the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it
 * unsubscribes from the source. This way you can make sure that everything before the *published*
 * refCount has only a single subscription independently of the number of subscribers to the target
 * observable.
 *
 * Note that using the {@link share} operator is exactly the same as using the `multicast(() => new Subject())` operator
 * (making the observable hot) and the *refCount* operator in a sequence.
 *
 * ![](refCount.png)
 *
 * ## Example
 *
 * In the following example there are two intervals turned into connectable observables
 * by using the *publish* operator. The first one uses the *refCount* operator, the
 * second one does not use it. You will notice that a connectable observable does nothing
 * until you call its connect function.
 *
 * ```ts
 * import { interval, tap, publish, refCount } from 'rxjs';
 *
 * // Turn the interval observable into a ConnectableObservable (hot)
 * const refCountInterval = interval(400).pipe(
 *   tap(num => console.log(`refCount ${ num }`)),
 *   publish(),
 *   refCount()
 * );
 *
 * const publishedInterval = interval(400).pipe(
 *   tap(num => console.log(`publish ${ num }`)),
 *   publish()
 * );
 *
 * refCountInterval.subscribe();
 * refCountInterval.subscribe();
 * // 'refCount 0' -----> 'refCount 1' -----> etc
 * // All subscriptions will receive the same value and the tap (and
 * // every other operator) before the `publish` operator will be executed
 * // only once per event independently of the number of subscriptions.
 *
 * publishedInterval.subscribe();
 * // Nothing happens until you call .connect() on the observable.
 * ```
 *
 * @return A function that returns an Observable that automates the connection
 * to ConnectableObservable.
 * @see {@link ConnectableObservable}
 * @see {@link share}
 * @see {@link publish}
 * @deprecated Replaced with the {@link share} operator. How `share` is used
 * will depend on the connectable observable you created just prior to the
 * `refCount` operator.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function refCount<T>(): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let connection: Subscription | null = null;

    (source as any)._refCount++;

    const refCounter = createOperatorSubscriber(subscriber, undefined, undefined, undefined, () => {
      if (!source || (source as any)._refCount <= 0 || 0 < --(source as any)._refCount) {
        connection = null;
        return;
      }

      ///
      // Compare the local RefCountSubscriber's connection Subscription to the
      // connection Subscription on the shared ConnectableObservable. In cases
      // where the ConnectableObservable source synchronously emits values, and
      // the RefCountSubscriber's downstream Observers synchronously unsubscribe,
      // execution continues to here before the RefCountOperator has a chance to
      // supply the RefCountSubscriber with the shared connection Subscription.
      // For example:
      // ```
      // range(0, 10).pipe(
      //   publish(),
      //   refCount(),
      //   take(5),
      // )
      // .subscribe();
      // ```
      // In order to account for this case, RefCountSubscriber should only dispose
      // the ConnectableObservable's shared connection Subscription if the
      // connection Subscription exists, *and* either:
      //   a. RefCountSubscriber doesn't have a reference to the shared connection
      //      Subscription yet, or,
      //   b. RefCountSubscriber's connection Subscription reference is identical
      //      to the shared connection Subscription
      ///

      const sharedConnection = (source as any)._connection;
      const conn = connection;
      connection = null;

      if (sharedConnection && (!conn || sharedConnection === conn)) {
        sharedConnection.unsubscribe();
      }

      subscriber.unsubscribe();
    });

    source.subscribe(refCounter);

    if (!refCounter.closed) {
      connection = (source as ConnectableObservable<T>).connect();
    }
  });
}
Nrximport { Subscription } from '../Subscription';
import { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { timer } from '../observable/timer';

export interface RepeatConfig {
  /**
   * The number of times to repeat the source. Defaults to `Infinity`.
   */
  count?: number;

  /**
   * If a `number`, will delay the repeat of the source by that number of milliseconds.
   * If a function, it will provide the number of times the source has been subscribed to,
   * and the return value should be a valid observable input that will notify when the source
   * should be repeated. If the notifier observable is empty, the result will complete.
   */
  delay?: number | ((count: number) => ObservableInput<any>);
}

/**
 * Returns an Observable that will resubscribe to the source stream when the source stream completes.
 *
 * <span class="informal">Repeats all values emitted on the source. It's like {@link retry}, but for non error cases.</span>
 *
 * ![](repeat.png)
 *
 * Repeat will output values from a source until the source completes, then it will resubscribe to the
 * source a specified number of times, with a specified delay. Repeat can be particularly useful in
 * combination with closing operators like {@link take}, {@link takeUntil}, {@link first}, or {@link takeWhile},
 * as it can be used to restart a source again from scratch.
 *
 * Repeat is very similar to {@link retry}, where {@link retry} will resubscribe to the source in the error case, but
 * `repeat` will resubscribe if the source completes.
 *
 * Note that `repeat` will _not_ catch errors. Use {@link retry} for that.
 *
 * - `repeat(0)` returns an empty observable
 * - `repeat()` will repeat forever
 * - `repeat({ delay: 200 })` will repeat forever, with a delay of 200ms between repetitions.
 * - `repeat({ count: 2, delay: 400 })` will repeat twice, with a delay of 400ms between repetitions.
 * - `repeat({ delay: (count) => timer(count * 1000) })` will repeat forever, but will have a delay that grows by one second for each repetition.
 *
 * ## Example
 *
 * Repeat a message stream
 *
 * ```ts
 * import { of, repeat } from 'rxjs';
 *
 * const source = of('Repeat message');
 * const result = source.pipe(repeat(3));
 *
 * result.subscribe(x => console.log(x));
 *
 * // Results
 * // 'Repeat message'
 * // 'Repeat message'
 * // 'Repeat message'
 * ```
 *
 * Repeat 3 values, 2 times
 *
 * ```ts
 * import { interval, take, repeat } from 'rxjs';
 *
 * const source = interval(1000);
 * const result = source.pipe(take(3), repeat(2));
 *
 * result.subscribe(x => console.log(x));
 *
 * // Results every second
 * // 0
 * // 1
 * // 2
 * // 0
 * // 1
 * // 2
 * ```
 *
 * Defining two complex repeats with delays on the same source.
 * Note that the second repeat cannot be called until the first
 * repeat as exhausted it's count.
 *
 * ```ts
 * import { defer, of, repeat } from 'rxjs';
 *
 * const source = defer(() => {
 *    return of(`Hello, it is ${new Date()}`)
 * });
 *
 * source.pipe(
 *    // Repeat 3 times with a delay of 1 second between repetitions
 *    repeat({
 *      count: 3,
 *      delay: 1000,
 *    }),
 *
 *    // *Then* repeat forever, but with an exponential step-back
 *    // maxing out at 1 minute.
 *    repeat({
 *      delay: (count) => timer(Math.min(60000, 2 ^ count * 1000))
 *    })
 * )
 * ```
 *
 * @see {@link repeatWhen}
 * @see {@link retry}
 *
 * @param countOrConfig Either the number of times the source Observable items are repeated
 * (a count of 0 will yield an empty Observable) or a {@link RepeatConfig} object.
 */
export function repeat<T>(countOrConfig?: number | RepeatConfig): MonoTypeOperatorFunction<T> {
  let count = Infinity;
  let delay: RepeatConfig['delay'];

  if (countOrConfig != null) {
    if (typeof countOrConfig === 'object') {
      ({ count = Infinity, delay } = countOrConfig);
    } else {
      count = countOrConfig;
    }
  }

  return count <= 0
    ? () => EMPTY
    : operate((source, subscriber) => {
        let soFar = 0;
        let sourceSub: Subscription | null;

        const resubscribe = () => {
          sourceSub?.unsubscribe();
          sourceSub = null;
          if (delay != null) {
            const notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(soFar));
            const notifierSubscriber = createOperatorSubscriber(subscriber, () => {
              notifierSubscriber.unsubscribe();
              subscribeToSource();
            });
            notifier.subscribe(notifierSubscriber);
          } else {
            subscribeToSource();
          }
        };

        const subscribeToSource = () => {
          let syncUnsub = false;
          sourceSub = source.subscribe(
            createOperatorSubscriber(subscriber, undefined, () => {
              if (++soFar < count) {
                if (sourceSub) {
                  resubscribe();
                } else {
                  syncUnsub = true;
                }
              } else {
                subscriber.complete();
              }
            })
          );

          if (syncUnsub) {
            resubscribe();
          }
        };

        subscribeToSource();
      });
}
ximport { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';

import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Returns an Observable that mirrors the source Observable with the exception of a `complete`. If the source
 * Observable calls `complete`, this method will emit to the Observable returned from `notifier`. If that Observable
 * calls `complete` or `error`, then this method will call `complete` or `error` on the child subscription. Otherwise
 * this method will resubscribe to the source Observable.
 *
 * ![](repeatWhen.png)
 *
 * ## Example
 *
 * Repeat a message stream on click
 *
 * ```ts
 * import { of, fromEvent, repeatWhen } from 'rxjs';
 *
 * const source = of('Repeat message');
 * const documentClick$ = fromEvent(document, 'click');
 *
 * const result = source.pipe(repeatWhen(() => documentClick$));
 *
 * result.subscribe(data => console.log(data))
 * ```
 *
 * @see {@link repeat}
 * @see {@link retry}
 * @see {@link retryWhen}
 *
 * @param notifier Function that receives an Observable of notifications with
 * which a user can `complete` or `error`, aborting the repetition.
 * @return A function that returns an Observable that mirrors the source
 * Observable with the exception of a `complete`.
 * @deprecated Will be removed in v9 or v10. Use {@link repeat}'s {@link RepeatConfig#delay delay} option instead.
 * Instead of `repeatWhen(() => notify$)`, use: `repeat({ delay: () => notify$ })`.
 */
export function repeatWhen<T>(notifier: (notifications: Observable<void>) => ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let innerSub: Subscription | null;
    let syncResub = false;
    let completions$: Subject<void>;
    let isNotifierComplete = false;
    let isMainComplete = false;

    /**
     * Checks to see if we can complete the result, completes it, and returns `true` if it was completed.
     */
    const checkComplete = () => isMainComplete && isNotifierComplete && (subscriber.complete(), true);
    /**
     * Gets the subject to send errors through. If it doesn't exist,
     * we know we need to setup the notifier.
     */
    const getCompletionSubject = () => {
      if (!completions$) {
        completions$ = new Subject();

        // If the call to `notifier` throws, it will be caught by the OperatorSubscriber
        // In the main subscription -- in `subscribeForRepeatWhen`.
        innerFrom(notifier(completions$)).subscribe(
          createOperatorSubscriber(
            subscriber,
            () => {
              if (innerSub) {
                subscribeForRepeatWhen();
              } else {
                // If we don't have an innerSub yet, that's because the inner subscription
                // call hasn't even returned yet. We've arrived here synchronously.
                // So we flag that we want to resub, such that we can ensure finalization
                // happens before we resubscribe.
                syncResub = true;
              }
            },
            () => {
              isNotifierComplete = true;
              checkComplete();
            }
          )
        );
      }
      return completions$;
    };

    const subscribeForRepeatWhen = () => {
      isMainComplete = false;

      innerSub = source.subscribe(
        createOperatorSubscriber(subscriber, undefined, () => {
          isMainComplete = true;
          // Check to see if we are complete, and complete if so.
          // If we are not complete. Get the subject. This calls the `notifier` function.
          // If that function fails, it will throw and `.next()` will not be reached on this
          // line. The thrown error is caught by the _complete handler in this
          // `OperatorSubscriber` and handled appropriately.
          !checkComplete() && getCompletionSubject().next();
        })
      );

      if (syncResub) {
        // Ensure that the inner subscription is torn down before
        // moving on to the next subscription in the synchronous case.
        // If we don't do this here, all inner subscriptions will not be
        // torn down until the entire observable is done.
        innerSub.unsubscribe();
        // It is important to null this out. Not only to free up memory, but
        // to make sure code above knows we are in a subscribing state to
        // handle synchronous resubscription.
        innerSub = null;
        // We may need to do this multiple times, so reset the flags.
        syncResub = false;
        // Resubscribe
        subscribeForRepeatWhen();
      }
    };

    // Start the subscription
    subscribeForRepeatWhen();
  });
}
XXxwimport { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { Subscription } from '../Subscription';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';
import { timer } from '../observable/timer';
import { innerFrom } from '../observable/innerFrom';

/**
 * The {@link retry} operator configuration object. `retry` either accepts a `number`
 * or an object described by this interface.
 */
export interface RetryConfig {
  /**
   * The maximum number of times to retry. If `count` is omitted, `retry` will try to
   * resubscribe on errors infinite number of times.
   */
  count?: number;
  /**
   * The number of milliseconds to delay before retrying, OR a function to
   * return a notifier for delaying. If a function is given, that function should
   * return a notifier that, when it emits will retry the source. If the notifier
   * completes _without_ emitting, the resulting observable will complete without error,
   * if the notifier errors, the error will be pushed to the result.
   */
  delay?: number | ((error: any, retryCount: number) => ObservableInput<any>);
  /**
   * Whether or not to reset the retry counter when the retried subscription
   * emits its first value.
   */
  resetOnSuccess?: boolean;
}

export function retry<T>(count?: number): MonoTypeOperatorFunction<T>;
export function retry<T>(config: RetryConfig): MonoTypeOperatorFunction<T>;

/**
 * Returns an Observable that mirrors the source Observable with the exception of an `error`.
 *
 * If the source Observable calls `error`, this method will resubscribe to the source Observable for a maximum of
 * `count` resubscriptions rather than propagating the `error` call.
 *
 * ![](retry.png)
 *
 * The number of retries is determined by the `count` parameter. It can be set either by passing a number to
 * `retry` function or by setting `count` property when `retry` is configured using {@link RetryConfig}. If
 * `count` is omitted, `retry` will try to resubscribe on errors infinite number of times.
 *
 * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those
 * emitted during failed subscriptions. For example, if an Observable fails at first but emits `[1, 2]` then
 * succeeds the second time and emits: `[1, 2, 3, 4, 5, complete]` then the complete stream of emissions and
 * notifications would be: `[1, 2, 1, 2, 3, 4, 5, complete]`.
 *
 * ## Example
 *
 * ```ts
 * import { interval, mergeMap, throwError, of, retry } from 'rxjs';
 *
 * const source = interval(1000);
 * const result = source.pipe(
 *   mergeMap(val => val > 5 ? throwError(() => 'Error!') : of(val)),
 *   retry(2) // retry 2 times on error
 * );
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(`${ err }: Retried 2 times then quit!`)
 * });
 *
 * // Output:
 * // 0..1..2..3..4..5..
 * // 0..1..2..3..4..5..
 * // 0..1..2..3..4..5..
 * // 'Error!: Retried 2 times then quit!'
 * ```
 *
 * @see {@link retryWhen}
 *
 * @param configOrCount Either number of retry attempts before failing or a
 * {@link RetryConfig} object.
 * @return A function that returns an Observable that will resubscribe to the
 * source stream when the source stream errors, at most `count` times.
 */
export function retry<T>(configOrCount: number | RetryConfig = Infinity): MonoTypeOperatorFunction<T> {
  let config: RetryConfig;
  if (configOrCount && typeof configOrCount === 'object') {
    config = configOrCount;
  } else {
    config = {
      count: configOrCount as number,
    };
  }
  const { count = Infinity, delay, resetOnSuccess: resetOnSuccess = false } = config;

  return count <= 0
    ? identity
    : operate((source, subscriber) => {
        let soFar = 0;
        let innerSub: Subscription | null;
        const subscribeForRetry = () => {
          let syncUnsub = false;
          innerSub = source.subscribe(
            createOperatorSubscriber(
              subscriber,
              (value) => {
                // If we're resetting on success
                if (resetOnSuccess) {
                  soFar = 0;
                }
                subscriber.next(value);
              },
              // Completions are passed through to consumer.
              undefined,
              (err) => {
                if (soFar++ < count) {
                  // We are still under our retry count
                  const resub = () => {
                    if (innerSub) {
                      innerSub.unsubscribe();
                      innerSub = null;
                      subscribeForRetry();
                    } else {
                      syncUnsub = true;
                    }
                  };

                  if (delay != null) {
                    // The user specified a retry delay.
                    // They gave us a number, use a timer, otherwise, it's a function,
                    // and we're going to call it to get a notifier.
                    const notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(err, soFar));
                    const notifierSubscriber = createOperatorSubscriber(
                      subscriber,
                      () => {
                        // After we get the first notification, we
                        // unsubscribe from the notifier, because we don't want anymore
                        // and we resubscribe to the source.
                        notifierSubscriber.unsubscribe();
                        resub();
                      },
                      () => {
                        // The notifier completed without emitting.
                        // The author is telling us they want to complete.
                        subscriber.complete();
                      }
                    );
                    notifier.subscribe(notifierSubscriber);
                  } else {
                    // There was no notifier given. Just resub immediately.
                    resub();
                  }
                } else {
                  // We're past our maximum number of retries.
                  // Just send along the error.
                  subscriber.error(err);
                }
              }
            )
          );
          if (syncUnsub) {
            innerSub.unsubscribe();
            innerSub = null;
            subscribeForRetry();
          }
        };
        subscribeForRetry();
      });
}
x
import { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';

import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable
 * calls `error`, this method will emit the Throwable that caused the error to the `ObservableInput` returned from `notifier`.
 * If that Observable calls `complete` or `error` then this method will call `complete` or `error` on the child
 * subscription. Otherwise this method will resubscribe to the source Observable.
 *
 * ![](retryWhen.png)
 *
 * Retry an observable sequence on error based on custom criteria.
 *
 * ## Example
 *
 * ```ts
 * import { interval, map, retryWhen, tap, delayWhen, timer } from 'rxjs';
 *
 * const source = interval(1000);
 * const result = source.pipe(
 *   map(value => {
 *     if (value > 5) {
 *       // error will be picked up by retryWhen
 *       throw value;
 *     }
 *     return value;
 *   }),
 *   retryWhen(errors =>
 *     errors.pipe(
 *       // log error message
 *       tap(value => console.log(`Value ${ value } was too high!`)),
 *       // restart in 5 seconds
 *       delayWhen(value => timer(value * 1000))
 *     )
 *   )
 * );
 *
 * result.subscribe(value => console.log(value));
 *
 * // results:
 * // 0
 * // 1
 * // 2
 * // 3
 * // 4
 * // 5
 * // 'Value 6 was too high!'
 * // - Wait 5 seconds then repeat
 * ```
 *
 * @see {@link retry}
 *
 * @param notifier Function that receives an Observable of notifications with which a
 * user can `complete` or `error`, aborting the retry.
 * @return A function that returns an Observable that mirrors the source
 * Observable with the exception of an `error`.
 * @deprecated Will be removed in v9 or v10, use {@link retry}'s `delay` option instead.
 * Will be removed in v9 or v10. Use {@link retry}'s {@link RetryConfig#delay delay} option instead.
 * Instead of `retryWhen(() => notify$)`, use: `retry({ delay: () => notify$ })`.
 */
export function retryWhen<T>(notifier: (errors: Observable<any>) => ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let innerSub: Subscription | null;
    let syncResub = false;
    let errors$: Subject<any>;

    const subscribeForRetryWhen = () => {
      innerSub = source.subscribe(
        createOperatorSubscriber(subscriber, undefined, undefined, (err) => {
          if (!errors$) {
            errors$ = new Subject();
            innerFrom(notifier(errors$)).subscribe(
              createOperatorSubscriber(subscriber, () =>
                // If we have an innerSub, this was an asynchronous call, kick off the retry.
                // Otherwise, if we don't have an innerSub yet, that's because the inner subscription
                // call hasn't even returned yet. We've arrived here synchronously.
                // So we flag that we want to resub, such that we can ensure finalization
                // happens before we resubscribe.
                innerSub ? subscribeForRetryWhen() : (syncResub = true)
              )
            );
          }
          if (errors$) {
            // We have set up the notifier without error.
            errors$.next(err);
          }
        })
      );

      if (syncResub) {
        // Ensure that the inner subscription is torn down before
        // moving on to the next subscription in the synchronous case.
        // If we don't do this here, all inner subscriptions will not be
        // torn down until the entire observable is done.
        innerSub.unsubscribe();
        innerSub = null;
        // We may need to do this multiple times, so reset the flag.
        syncResub = false;
        // Resubscribe
        subscribeForRetryWhen();
      }
    };

    // Start the subscription
    subscribeForRetryWhen();
  });
}
{iximport { innerFrom } from '../observable/innerFrom';
import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits the most recently emitted value from the source Observable whenever
 * another Observable, the `notifier`, emits.
 *
 * <span class="informal">It's like {@link sampleTime}, but samples whenever
 * the `notifier` `ObservableInput` emits something.</span>
 *
 * ![](sample.png)
 *
 * Whenever the `notifier` `ObservableInput` emits a value, `sample`
 * looks at the source Observable and emits whichever value it has most recently
 * emitted since the previous sampling, unless the source has not emitted
 * anything since the previous sampling. The `notifier` is subscribed to as soon
 * as the output Observable is subscribed.
 *
 * ## Example
 *
 * On every click, sample the most recent `seconds` timer
 *
 * ```ts
 * import { fromEvent, interval, sample } from 'rxjs';
 *
 * const seconds = interval(1000);
 * const clicks = fromEvent(document, 'click');
 * const result = seconds.pipe(sample(clicks));
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link debounce}
 * @see {@link sampleTime}
 * @see {@link throttle}
 *
 * @param notifier The `ObservableInput` to use for sampling the
 * source Observable.
 * @return A function that returns an Observable that emits the results of
 * sampling the values emitted by the source Observable whenever the notifier
 * Observable emits value or completes.
 */
export function sample<T>(notifier: ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    let lastValue: T | null = null;
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        hasValue = true;
        lastValue = value;
      })
    );
    innerFrom(notifier).subscribe(
      createOperatorSubscriber(
        subscriber,
        () => {
          if (hasValue) {
            hasValue = false;
            const value = lastValue!;
            lastValue = null;
            subscriber.next(value);
          }
        },
        noop
      )
    );
  });
}
Wwxpimport { asyncScheduler } from '../scheduler/async';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { sample } from './sample';
import { interval } from '../observable/interval';

/**
 * Emits the most recently emitted value from the source Observable within
 * periodic time intervals.
 *
 * <span class="informal">Samples the source Observable at periodic time
 * intervals, emitting what it samples.</span>
 *
 * ![](sampleTime.png)
 *
 * `sampleTime` periodically looks at the source Observable and emits whichever
 * value it has most recently emitted since the previous sampling, unless the
 * source has not emitted anything since the previous sampling. The sampling
 * happens periodically in time every `period` milliseconds (or the time unit
 * defined by the optional `scheduler` argument). The sampling starts as soon as
 * the output Observable is subscribed.
 *
 * ## Example
 *
 * Every second, emit the most recent click at most once
 *
 * ```ts
 * import { fromEvent, sampleTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(sampleTime(1000));
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link auditTime}
 * @see {@link debounceTime}
 * @see {@link delay}
 * @see {@link sample}
 * @see {@link throttleTime}
 *
 * @param period The sampling period expressed in milliseconds or the time unit
 * determined internally by the optional `scheduler`.
 * @param scheduler The {@link SchedulerLike} to use for managing the timers
 * that handle the sampling.
 * @return A function that returns an Observable that emits the results of
 * sampling the values emitted by the source Observable at the specified time
 * interval.
 */
export function sampleTime<T>(period: number, scheduler: SchedulerLike = asyncScheduler): MonoTypeOperatorFunction<T> {
  return sample(interval(period, scheduler));
}
x/import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { scanInternals } from './scanInternals';

export function scan<V, A = V>(accumulator: (acc: A | V, value: V, index: number) => A): OperatorFunction<V, V | A>;
export function scan<V, A>(accumulator: (acc: A, value: V, index: number) => A, seed: A): OperatorFunction<V, A>;
export function scan<V, A, S>(accumulator: (acc: A | S, value: V, index: number) => A, seed: S): OperatorFunction<V, A>;

// TODO: link to a "redux pattern" section in the guide (location TBD)

/**
 * Useful for encapsulating and managing state. Applies an accumulator (or "reducer function")
 * to each value from the source after an initial state is established -- either via
 * a `seed` value (second argument), or from the first value from the source.
 *
 * <span class="informal">It's like {@link reduce}, but emits the current
 * accumulation state after each update</span>
 *
 * ![](scan.png)
 *
 * This operator maintains an internal state and emits it after processing each value as follows:
 *
 * 1. First value arrives
 *   - If a `seed` value was supplied (as the second argument to `scan`), let `state = seed` and `value = firstValue`.
 *   - If NO `seed` value was supplied (no second argument), let `state = firstValue` and go to 3.
 * 2. Let `state = accumulator(state, value)`.
 *   - If an error is thrown by `accumulator`, notify the consumer of an error. The process ends.
 * 3. Emit `state`.
 * 4. Next value arrives, let `value = nextValue`, go to 2.
 *
 * ## Examples
 *
 * An average of previous numbers. This example shows how
 * not providing a `seed` can prime the stream with the
 * first value from the source.
 *
 * ```ts
 * import { of, scan, map } from 'rxjs';
 *
 * const numbers$ = of(1, 2, 3);
 *
 * numbers$
 *   .pipe(
 *     // Get the sum of the numbers coming in.
 *     scan((total, n) => total + n),
 *     // Get the average by dividing the sum by the total number
 *     // received so far (which is 1 more than the zero-based index).
 *     map((sum, index) => sum / (index + 1))
 *   )
 *   .subscribe(console.log);
 * ```
 *
 * The Fibonacci sequence. This example shows how you can use
 * a seed to prime accumulation process. Also... you know... Fibonacci.
 * So important to like, computers and stuff that its whiteboarded
 * in job interviews. Now you can show them the Rx version! (Please don't, haha)
 *
 * ```ts
 * import { interval, scan, map, startWith } from 'rxjs';
 *
 * const firstTwoFibs = [0, 1];
 * // An endless stream of Fibonacci numbers.
 * const fibonacci$ = interval(1000).pipe(
 *   // Scan to get the fibonacci numbers (after 0, 1)
 *   scan(([a, b]) => [b, a + b], firstTwoFibs),
 *   // Get the second number in the tuple, it's the one you calculated
 *   map(([, n]) => n),
 *   // Start with our first two digits :)
 *   startWith(...firstTwoFibs)
 * );
 *
 * fibonacci$.subscribe(console.log);
 * ```
 *
 * @see {@link expand}
 * @see {@link mergeScan}
 * @see {@link reduce}
 * @see {@link switchScan}
 *
 * @param accumulator A "reducer function". This will be called for each value after an initial state is
 * acquired.
 * @param seed The initial state. If this is not provided, the first value from the source will
 * be used as the initial state, and emitted without going through the accumulator. All subsequent values
 * will be processed by the accumulator function. If this is provided, all values will go through
 * the accumulator function.
 * @return A function that returns an Observable of the accumulated values.
 */
export function scan<V, A, S>(accumulator: (acc: V | A | S, value: V, index: number) => A, seed?: S): OperatorFunction<V, V | A> {
  // providing a seed of `undefined` *should* be valid and trigger
  // hasSeed! so don't use `seed !== undefined` checks!
  // For this reason, we have to check it here at the original call site
  // otherwise inside Operator/Subscriber we won't know if `undefined`
  // means they didn't provide anything or if they literally provided `undefined`
  return operate(scanInternals(accumulator, seed as S, arguments.length >= 2, true));
}
lRx(import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * A basic scan operation. This is used for `scan` and `reduce`.
 * @param accumulator The accumulator to use
 * @param seed The seed value for the state to accumulate
 * @param hasSeed Whether or not a seed was provided
 * @param emitOnNext Whether or not to emit the state on next
 * @param emitBeforeComplete Whether or not to emit the before completion
 */

export function scanInternals<V, A, S>(
  accumulator: (acc: V | A | S, value: V, index: number) => A,
  seed: S,
  hasSeed: boolean,
  emitOnNext: boolean,
  emitBeforeComplete?: undefined | true
) {
  return (source: Observable<V>, subscriber: Subscriber<any>) => {
    // Whether or not we have state yet. This will only be
    // false before the first value arrives if we didn't get
    // a seed value.
    let hasState = hasSeed;
    // The state that we're tracking, starting with the seed,
    // if there is one, and then updated by the return value
    // from the accumulator on each emission.
    let state: any = seed;
    // An index to pass to the accumulator function.
    let index = 0;

    // Subscribe to our source. All errors and completions are passed through.
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          // Always increment the index.
          const i = index++;
          // Set the state
          state = hasState
            ? // We already have state, so we can get the new state from the accumulator
              accumulator(state, value, i)
            : // We didn't have state yet, a seed value was not provided, so

              // we set the state to the first value, and mark that we have state now
              ((hasState = true), value);

          // Maybe send it to the consumer.
          emitOnNext && subscriber.next(state);
        },
        // If an onComplete was given, call it, otherwise
        // just pass through the complete notification to the consumer.
        emitBeforeComplete &&
          (() => {
            hasState && subscriber.next(state);
            subscriber.complete();
          })
      )
    );
  };
}
RiIxJimport { OperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * Compares all values of two observables in sequence using an optional comparator function
 * and returns an observable of a single boolean value representing whether or not the two sequences
 * are equal.
 *
 * <span class="informal">Checks to see of all values emitted by both observables are equal, in order.</span>
 *
 * ![](sequenceEqual.png)
 *
 * `sequenceEqual` subscribes to source observable and `compareTo` `ObservableInput` (that internally
 * gets converted to an observable) and buffers incoming values from each observable. Whenever either
 * observable emits a value, the value is buffered and the buffers are shifted and compared from the bottom
 * up; If any value pair doesn't match, the returned observable will emit `false` and complete. If one of the
 * observables completes, the operator will wait for the other observable to complete; If the other
 * observable emits before completing, the returned observable will emit `false` and complete. If one observable never
 * completes or emits after the other completes, the returned observable will never complete.
 *
 * ## Example
 *
 * Figure out if the Konami code matches
 *
 * ```ts
 * import { from, fromEvent, map, bufferCount, mergeMap, sequenceEqual } from 'rxjs';
 *
 * const codes = from([
 *   'ArrowUp',
 *   'ArrowUp',
 *   'ArrowDown',
 *   'ArrowDown',
 *   'ArrowLeft',
 *   'ArrowRight',
 *   'ArrowLeft',
 *   'ArrowRight',
 *   'KeyB',
 *   'KeyA',
 *   'Enter', // no start key, clearly.
 * ]);
 *
 * const keys = fromEvent<KeyboardEvent>(document, 'keyup').pipe(map(e => e.code));
 * const matches = keys.pipe(
 *   bufferCount(11, 1),
 *   mergeMap(last11 => from(last11).pipe(sequenceEqual(codes)))
 * );
 * matches.subscribe(matched => console.log('Successful cheat at Contra? ', matched));
 * ```
 *
 * @see {@link combineLatest}
 * @see {@link zip}
 * @see {@link withLatestFrom}
 *
 * @param compareTo The `ObservableInput` sequence to compare the source sequence to.
 * @param comparator An optional function to compare each value pair.
 *
 * @return A function that returns an Observable that emits a single boolean
 * value representing whether or not the values emitted by the source
 * Observable and provided `ObservableInput` were equal in sequence.
 */
export function sequenceEqual<T>(
  compareTo: ObservableInput<T>,
  comparator: (a: T, b: T) => boolean = (a, b) => a === b
): OperatorFunction<T, boolean> {
  return operate((source, subscriber) => {
    // The state for the source observable
    const aState = createState<T>();
    // The state for the compareTo observable;
    const bState = createState<T>();

    /** A utility to emit and complete */
    const emit = (isEqual: boolean) => {
      subscriber.next(isEqual);
      subscriber.complete();
    };

    /**
     * Creates a subscriber that subscribes to one of the sources, and compares its collected
     * state -- `selfState` -- to the other source's collected state -- `otherState`. This
     * is used for both streams.
     */
    const createSubscriber = (selfState: SequenceState<T>, otherState: SequenceState<T>) => {
      const sequenceEqualSubscriber = createOperatorSubscriber(
        subscriber,
        (a: T) => {
          const { buffer, complete } = otherState;
          if (buffer.length === 0) {
            // If there's no values in the other buffer
            // and the other stream is complete, we know
            // this isn't a match, because we got one more value.
            // Otherwise, we push onto our buffer, so when the other
            // stream emits, it can pull this value off our buffer and check it
            // at the appropriate time.
            complete ? emit(false) : selfState.buffer.push(a);
          } else {
            // If the other stream *does* have values in its buffer,
            // pull the oldest one off so we can compare it to what we
            // just got. If it wasn't a match, emit `false` and complete.
            !comparator(a, buffer.shift()!) && emit(false);
          }
        },
        () => {
          // Or observable completed
          selfState.complete = true;
          const { complete, buffer } = otherState;
          // If the other observable is also complete, and there's
          // still stuff left in their buffer, it doesn't match, if their
          // buffer is empty, then it does match. This is because we can't
          // possibly get more values here anymore.
          complete && emit(buffer.length === 0);
          // Be sure to clean up our stream as soon as possible if we can.
          sequenceEqualSubscriber?.unsubscribe();
        }
      );

      return sequenceEqualSubscriber;
    };

    // Subscribe to each source.
    source.subscribe(createSubscriber(aState, bState));
    innerFrom(compareTo).subscribe(createSubscriber(bState, aState));
  });
}

/**
 * A simple structure for the data used to test each sequence
 */
interface SequenceState<T> {
  /** A temporary store for arrived values before they are checked */
  buffer: T[];
  /** Whether or not the sequence source has completed. */
  complete: boolean;
}

/**
 * Creates a simple structure that is used to represent
 * data used to test each sequence.
 */
function createState<T>(): SequenceState<T> {
  return {
    buffer: [],
    complete: false,
  };
}
AFx,import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { SafeSubscriber } from '../Subscriber';
import { Subscription } from '../Subscription';
import { MonoTypeOperatorFunction, SubjectLike, ObservableInput } from '../types';
import { operate } from '../util/lift';

export interface ShareConfig<T> {
  /**
   * The factory used to create the subject that will connect the source observable to
   * multicast consumers.
   */
  connector?: () => SubjectLike<T>;
  /**
   * If `true`, the resulting observable will reset internal state on error from source and return to a "cold" state. This
   * allows the resulting observable to be "retried" in the event of an error.
   * If `false`, when an error comes from the source it will push the error into the connecting subject, and the subject
   * will remain the connecting subject, meaning the resulting observable will not go "cold" again, and subsequent retries
   * or resubscriptions will resubscribe to that same subject. In all cases, RxJS subjects will emit the same error again, however
   * {@link ReplaySubject} will also push its buffered values before pushing the error.
   * It is also possible to pass a notifier factory returning an `ObservableInput` instead which grants more fine-grained
   * control over how and when the reset should happen. This allows behaviors like conditional or delayed resets.
   */
  resetOnError?: boolean | ((error: any) => ObservableInput<any>);
  /**
   * If `true`, the resulting observable will reset internal state on completion from source and return to a "cold" state. This
   * allows the resulting observable to be "repeated" after it is done.
   * If `false`, when the source completes, it will push the completion through the connecting subject, and the subject
   * will remain the connecting subject, meaning the resulting observable will not go "cold" again, and subsequent repeats
   * or resubscriptions will resubscribe to that same subject.
   * It is also possible to pass a notifier factory returning an `ObservableInput` instead which grants more fine-grained
   * control over how and when the reset should happen. This allows behaviors like conditional or delayed resets.
   */
  resetOnComplete?: boolean | (() => ObservableInput<any>);
  /**
   * If `true`, when the number of subscribers to the resulting observable reaches zero due to those subscribers unsubscribing, the
   * internal state will be reset and the resulting observable will return to a "cold" state. This means that the next
   * time the resulting observable is subscribed to, a new subject will be created and the source will be subscribed to
   * again.
   * If `false`, when the number of subscribers to the resulting observable reaches zero due to unsubscription, the subject
   * will remain connected to the source, and new subscriptions to the result will be connected through that same subject.
   * It is also possible to pass a notifier factory returning an `ObservableInput` instead which grants more fine-grained
   * control over how and when the reset should happen. This allows behaviors like conditional or delayed resets.
   */
  resetOnRefCountZero?: boolean | (() => ObservableInput<any>);
}

export function share<T>(): MonoTypeOperatorFunction<T>;

export function share<T>(options: ShareConfig<T>): MonoTypeOperatorFunction<T>;

/**
 * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
 * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
 * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
 * This is an alias for `multicast(() => new Subject()), refCount()`.
 *
 * The subscription to the underlying source Observable can be reset (unsubscribe and resubscribe for new subscribers),
 * if the subscriber count to the shared observable drops to 0, or if the source Observable errors or completes. It is
 * possible to use notifier factories for the resets to allow for behaviors like conditional or delayed resets. Please
 * note that resetting on error or complete of the source Observable does not behave like a transparent retry or restart
 * of the source because the error or complete will be forwarded to all subscribers and their subscription will be
 * closed. Only new subscribers after a reset on error or complete happened will cause a fresh subscription to the
 * source. To achieve transparent retries or restarts pipe the source through appropriate operators before sharing.
 *
 * ![](share.png)
 *
 * ## Example
 *
 * Generate new multicast Observable from the `source` Observable value
 *
 * ```ts
 * import { interval, tap, map, take, share } from 'rxjs';
 *
 * const source = interval(1000).pipe(
 *   tap(x => console.log('Processing: ', x)),
 *   map(x => x * x),
 *   take(6),
 *   share()
 * );
 *
 * source.subscribe(x => console.log('subscription 1: ', x));
 * source.subscribe(x => console.log('subscription 2: ', x));
 *
 * // Logs:
 * // Processing: 0
 * // subscription 1: 0
 * // subscription 2: 0
 * // Processing: 1
 * // subscription 1: 1
 * // subscription 2: 1
 * // Processing: 2
 * // subscription 1: 4
 * // subscription 2: 4
 * // Processing: 3
 * // subscription 1: 9
 * // subscription 2: 9
 * // Processing: 4
 * // subscription 1: 16
 * // subscription 2: 16
 * // Processing: 5
 * // subscription 1: 25
 * // subscription 2: 25
 * ```
 *
 * ## Example with notifier factory: Delayed reset
 *
 * ```ts
 * import { interval, take, share, timer } from 'rxjs';
 *
 * const source = interval(1000).pipe(
 *   take(3),
 *   share({
 *     resetOnRefCountZero: () => timer(1000)
 *   })
 * );
 *
 * const subscriptionOne = source.subscribe(x => console.log('subscription 1: ', x));
 * setTimeout(() => subscriptionOne.unsubscribe(), 1300);
 *
 * setTimeout(() => source.subscribe(x => console.log('subscription 2: ', x)), 1700);
 *
 * setTimeout(() => source.subscribe(x => console.log('subscription 3: ', x)), 5000);
 *
 * // Logs:
 * // subscription 1:  0
 * // (subscription 1 unsubscribes here)
 * // (subscription 2 subscribes here ~400ms later, source was not reset)
 * // subscription 2:  1
 * // subscription 2:  2
 * // (subscription 2 unsubscribes here)
 * // (subscription 3 subscribes here ~2000ms later, source did reset before)
 * // subscription 3:  0
 * // subscription 3:  1
 * // subscription 3:  2
 * ```
 *
 * @see {@link shareReplay}
 *
 * @return A function that returns an Observable that mirrors the source.
 */
export function share<T>(options: ShareConfig<T> = {}): MonoTypeOperatorFunction<T> {
  const { connector = () => new Subject<T>(), resetOnError = true, resetOnComplete = true, resetOnRefCountZero = true } = options;
  // It's necessary to use a wrapper here, as the _operator_ must be
  // referentially transparent. Otherwise, it cannot be used in calls to the
  // static `pipe` function - to create a partial pipeline.
  //
  // The _operator function_ - the function returned by the _operator_ - will
  // not be referentially transparent - as it shares its source - but the
  // _operator function_ is called when the complete pipeline is composed via a
  // call to a source observable's `pipe` method - not when the static `pipe`
  // function is called.
  return (wrapperSource) => {
    let connection: SafeSubscriber<T> | undefined;
    let resetConnection: Subscription | undefined;
    let subject: SubjectLike<T> | undefined;
    let refCount = 0;
    let hasCompleted = false;
    let hasErrored = false;

    const cancelReset = () => {
      resetConnection?.unsubscribe();
      resetConnection = undefined;
    };
    // Used to reset the internal state to a "cold"
    // state, as though it had never been subscribed to.
    const reset = () => {
      cancelReset();
      connection = subject = undefined;
      hasCompleted = hasErrored = false;
    };
    const resetAndUnsubscribe = () => {
      // We need to capture the connection before
      // we reset (if we need to reset).
      const conn = connection;
      reset();
      conn?.unsubscribe();
    };

    return operate<T, T>((source, subscriber) => {
      refCount++;
      if (!hasErrored && !hasCompleted) {
        cancelReset();
      }

      // Create the subject if we don't have one yet. Grab a local reference to
      // it as well, which avoids non-null assertions when using it and, if we
      // connect to it now, then error/complete need a reference after it was
      // reset.
      const dest = (subject = subject ?? connector());

      // Add the finalization directly to the subscriber - instead of returning it -
      // so that the handling of the subscriber's unsubscription will be wired
      // up _before_ the subscription to the source occurs. This is done so that
      // the assignment to the source connection's `closed` property will be seen
      // by synchronous firehose sources.
      subscriber.add(() => {
        refCount--;

        // If we're resetting on refCount === 0, and it's 0, we only want to do
        // that on "unsubscribe", really. Resetting on error or completion is a different
        // configuration.
        if (refCount === 0 && !hasErrored && !hasCompleted) {
          resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
        }
      });

      // The following line adds the subscription to the subscriber passed.
      // Basically, `subscriber === dest.subscribe(subscriber)` is `true`.
      dest.subscribe(subscriber);

      if (
        !connection &&
        // Check this shareReplay is still activate - it can be reset to 0
        // and be "unsubscribed" _before_ it actually subscribes.
        // If we were to subscribe then, it'd leak and get stuck.
        refCount > 0
      ) {
        // We need to create a subscriber here - rather than pass an observer and
        // assign the returned subscription to connection - because it's possible
        // for reentrant subscriptions to the shared observable to occur and in
        // those situations we want connection to be already-assigned so that we
        // don't create another connection to the source.
        connection = new SafeSubscriber({
          next: (value) => dest.next(value),
          error: (err) => {
            hasErrored = true;
            cancelReset();
            resetConnection = handleReset(reset, resetOnError, err);
            dest.error(err);
          },
          complete: () => {
            hasCompleted = true;
            cancelReset();
            resetConnection = handleReset(reset, resetOnComplete);
            dest.complete();
          },
        });
        innerFrom(source).subscribe(connection);
      }
    })(wrapperSource);
  };
}

function handleReset<T extends unknown[] = never[]>(
  reset: () => void,
  on: boolean | ((...args: T) => ObservableInput<any>),
  ...args: T
): Subscription | undefined {
  if (on === true) {
    reset();
    return;
  }

  if (on === false) {
    return;
  }

  const onSubscriber = new SafeSubscriber({
    next: () => {
      onSubscriber.unsubscribe();
      reset();
    },
  });

  return innerFrom(on(...args)).subscribe(onSubscriber);
}
zMx#import { ReplaySubject } from '../ReplaySubject';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { share } from './share';

export interface ShareReplayConfig {
  bufferSize?: number;
  windowTime?: number;
  refCount: boolean;
  scheduler?: SchedulerLike;
}

export function shareReplay<T>(config: ShareReplayConfig): MonoTypeOperatorFunction<T>;
export function shareReplay<T>(bufferSize?: number, windowTime?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;

/**
 * Share source and replay specified number of emissions on subscription.
 *
 * This operator is a specialization of `replay` that connects to a source observable
 * and multicasts through a `ReplaySubject` constructed with the specified arguments.
 * A successfully completed source will stay cached in the `shareReplay`ed observable forever,
 * but an errored source can be retried.
 *
 * ## Why use `shareReplay`?
 *
 * You generally want to use `shareReplay` when you have side-effects or taxing computations
 * that you do not wish to be executed amongst multiple subscribers.
 * It may also be valuable in situations where you know you will have late subscribers to
 * a stream that need access to previously emitted values.
 * This ability to replay values on subscription is what differentiates {@link share} and `shareReplay`.
 *
 * ## Reference counting
 *
 * By default `shareReplay` will use `refCount` of false, meaning that it will _not_ unsubscribe the
 * source when the reference counter drops to zero, i.e. the inner `ReplaySubject` will _not_ be unsubscribed
 * (and potentially run for ever).
 * This is the default as it is expected that `shareReplay` is often used to keep around expensive to setup
 * observables which we want to keep running instead of having to do the expensive setup again.
 *
 * As of RXJS version 6.4.0 a new overload signature was added to allow for manual control over what
 * happens when the operators internal reference counter drops to zero.
 * If `refCount` is true, the source will be unsubscribed from once the reference count drops to zero, i.e.
 * the inner `ReplaySubject` will be unsubscribed. All new subscribers will receive value emissions from a
 * new `ReplaySubject` which in turn will cause a new subscription to the source observable.
 *
 * ## Examples
 *
 * Example with a third subscriber coming late to the party
 *
 * ```ts
 * import { interval, take, shareReplay } from 'rxjs';
 *
 * const shared$ = interval(2000).pipe(
 *   take(6),
 *   shareReplay(3)
 * );
 *
 * shared$.subscribe(x => console.log('sub A: ', x));
 * shared$.subscribe(y => console.log('sub B: ', y));
 *
 * setTimeout(() => {
 *   shared$.subscribe(y => console.log('sub C: ', y));
 * }, 11000);
 *
 * // Logs:
 * // (after ~2000 ms)
 * // sub A: 0
 * // sub B: 0
 * // (after ~4000 ms)
 * // sub A: 1
 * // sub B: 1
 * // (after ~6000 ms)
 * // sub A: 2
 * // sub B: 2
 * // (after ~8000 ms)
 * // sub A: 3
 * // sub B: 3
 * // (after ~10000 ms)
 * // sub A: 4
 * // sub B: 4
 * // (after ~11000 ms, sub C gets the last 3 values)
 * // sub C: 2
 * // sub C: 3
 * // sub C: 4
 * // (after ~12000 ms)
 * // sub A: 5
 * // sub B: 5
 * // sub C: 5
 * ```
 *
 * Example for `refCount` usage
 *
 * ```ts
 * import { Observable, tap, interval, shareReplay, take } from 'rxjs';
 *
 * const log = <T>(name: string, source: Observable<T>) => source.pipe(
 *   tap({
 *     subscribe: () => console.log(`${ name }: subscribed`),
 *     next: value => console.log(`${ name }: ${ value }`),
 *     complete: () => console.log(`${ name }: completed`),
 *     finalize: () => console.log(`${ name }: unsubscribed`)
 *   })
 * );
 *
 * const obs$ = log('source', interval(1000));
 *
 * const shared$ = log('shared', obs$.pipe(
 *   shareReplay({ bufferSize: 1, refCount: true }),
 *   take(2)
 * ));
 *
 * shared$.subscribe(x => console.log('sub A: ', x));
 * shared$.subscribe(y => console.log('sub B: ', y));
 *
 * // PRINTS:
 * // shared: subscribed <-- reference count = 1
 * // source: subscribed
 * // shared: subscribed <-- reference count = 2
 * // source: 0
 * // shared: 0
 * // sub A: 0
 * // shared: 0
 * // sub B: 0
 * // source: 1
 * // shared: 1
 * // sub A: 1
 * // shared: completed <-- take(2) completes the subscription for sub A
 * // shared: unsubscribed <-- reference count = 1
 * // shared: 1
 * // sub B: 1
 * // shared: completed <-- take(2) completes the subscription for sub B
 * // shared: unsubscribed <-- reference count = 0
 * // source: unsubscribed <-- replaySubject unsubscribes from source observable because the reference count dropped to 0 and refCount is true
 *
 * // In case of refCount being false, the unsubscribe is never called on the source and the source would keep on emitting, even if no subscribers
 * // are listening.
 * // source: 2
 * // source: 3
 * // source: 4
 * // ...
 * ```
 *
 * @see {@link publish}
 * @see {@link share}
 * @see {@link publishReplay}
 *
 * @param configOrBufferSize Maximum element count of the replay buffer or {@link ShareReplayConfig configuration}
 * object.
 * @param windowTime Maximum time length of the replay buffer in milliseconds.
 * @param scheduler Scheduler where connected observers within the selector function
 * will be invoked on.
 * @return A function that returns an Observable sequence that contains the
 * elements of a sequence produced by multicasting the source sequence within a
 * selector function.
 */
export function shareReplay<T>(
  configOrBufferSize?: ShareReplayConfig | number,
  windowTime?: number,
  scheduler?: SchedulerLike
): MonoTypeOperatorFunction<T> {
  let bufferSize: number;
  let refCount = false;
  if (configOrBufferSize && typeof configOrBufferSize === 'object') {
    ({ bufferSize = Infinity, windowTime = Infinity, refCount = false, scheduler } = configOrBufferSize);
  } else {
    bufferSize = (configOrBufferSize ?? Infinity) as number;
  }
  return share<T>({
    connector: () => new ReplaySubject(bufferSize, windowTime, scheduler),
    resetOnError: true,
    resetOnComplete: false,
    resetOnRefCountZero: refCount,
  });
}
ximport { Observable } from '../Observable';
import { EmptyError } from '../util/EmptyError';

import { MonoTypeOperatorFunction, OperatorFunction, TruthyTypesOf } from '../types';
import { SequenceError } from '../util/SequenceError';
import { NotFoundError } from '../util/NotFoundError';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function single<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function single<T>(predicate?: (value: T, index: number, source: Observable<T>) => boolean): MonoTypeOperatorFunction<T>;

/**
 * Returns an observable that asserts that only one value is
 * emitted from the observable that matches the predicate. If no
 * predicate is provided, then it will assert that the observable
 * only emits one value.
 *
 * If the source Observable did not emit `next` before completion, it
 * will emit an {@link EmptyError} to the Observer's `error` callback.
 *
 * In the event that two values are found that match the predicate,
 * or when there are two values emitted and no predicate, it will
 * emit a {@link SequenceError} to the Observer's `error` callback.
 *
 * In the event that no values match the predicate, if one is provided,
 * it will emit a {@link NotFoundError} to the Observer's `error` callback.
 *
 * ## Example
 *
 * Expect only `name` beginning with `'B'`
 *
 * ```ts
 * import { of, single } from 'rxjs';
 *
 * const source1 = of(
 *  { name: 'Ben' },
 *  { name: 'Tracy' },
 *  { name: 'Laney' },
 *  { name: 'Lily' }
 * );
 *
 * source1
 *   .pipe(single(x => x.name.startsWith('B')))
 *   .subscribe(x => console.log(x));
 * // Emits 'Ben'
 *
 *
 * const source2 = of(
 *  { name: 'Ben' },
 *  { name: 'Tracy' },
 *  { name: 'Bradley' },
 *  { name: 'Lincoln' }
 * );
 *
 * source2
 *   .pipe(single(x => x.name.startsWith('B')))
 *   .subscribe({ error: err => console.error(err) });
 * // Error emitted: SequenceError('Too many values match')
 *
 *
 * const source3 = of(
 *  { name: 'Laney' },
 *  { name: 'Tracy' },
 *  { name: 'Lily' },
 *  { name: 'Lincoln' }
 * );
 *
 * source3
 *   .pipe(single(x => x.name.startsWith('B')))
 *   .subscribe({ error: err => console.error(err) });
 * // Error emitted: NotFoundError('No values match')
 * ```
 *
 * @see {@link first}
 * @see {@link find}
 * @see {@link findIndex}
 * @see {@link elementAt}
 *
 * @throws {NotFoundError} Delivers a `NotFoundError` to the Observer's `error`
 * callback if the Observable completes before any `next` notification was sent.
 * @throws {SequenceError} Delivers a `SequenceError` if more than one value is
 * emitted that matches the provided predicate. If no predicate is provided, it
 * will deliver a `SequenceError` if more than one value comes from the source.
 * @throws {EmptyError} Delivers an `EmptyError` if no values were `next`ed prior
 * to completion.
 *
 * @param predicate A predicate function to evaluate items emitted by the source
 * Observable.
 * @return A function that returns an Observable that emits the single item
 * emitted by the source Observable that matches the predicate.
 */
export function single<T>(predicate?: (value: T, index: number, source: Observable<T>) => boolean): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    let singleValue: T;
    let seenValue = false;
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          seenValue = true;
          if (!predicate || predicate(value, index++, source)) {
            hasValue && subscriber.error(new SequenceError('Too many matching values'));
            hasValue = true;
            singleValue = value;
          }
        },
        () => {
          if (hasValue) {
            subscriber.next(singleValue);
            subscriber.complete();
          } else {
            subscriber.error(seenValue ? new NotFoundError('No matching values') : new EmptyError());
          }
        }
      )
    );
  });
}
^#BKxFimport { MonoTypeOperatorFunction } from '../types';
import { filter } from './filter';

/**
 * Returns an Observable that skips the first `count` items emitted by the source Observable.
 *
 * ![](skip.png)
 *
 * Skips the values until the sent notifications are equal or less than provided skip count. It raises
 * an error if skip count is equal or more than the actual number of emits and source raises an error.
 *
 * ## Example
 *
 * Skip the values before the emission
 *
 * ```ts
 * import { interval, skip } from 'rxjs';
 *
 * // emit every half second
 * const source = interval(500);
 * // skip the first 10 emitted values
 * const result = source.pipe(skip(10));
 *
 * result.subscribe(value => console.log(value));
 * // output: 10...11...12...13...
 * ```
 *
 * @see {@link last}
 * @see {@link skipWhile}
 * @see {@link skipUntil}
 * @see {@link skipLast}
 *
 * @param count The number of times, items emitted by source Observable should be skipped.
 * @return A function that returns an Observable that skips the first `count`
 * values emitted by the source Observable.
 */
export function skip<T>(count: number): MonoTypeOperatorFunction<T> {
  return filter((_, index) => count <= index);
}
Qпx import { MonoTypeOperatorFunction } from '../types';
import { identity } from '../util/identity';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Skip a specified number of values before the completion of an observable.
 *
 * ![](skipLast.png)
 *
 * Returns an observable that will emit values as soon as it can, given a number of
 * skipped values. For example, if you `skipLast(3)` on a source, when the source
 * emits its fourth value, the first value the source emitted will finally be emitted
 * from the returned observable, as it is no longer part of what needs to be skipped.
 *
 * All values emitted by the result of `skipLast(N)` will be delayed by `N` emissions,
 * as each value is held in a buffer until enough values have been emitted that that
 * the buffered value may finally be sent to the consumer.
 *
 * After subscribing, unsubscribing will not result in the emission of the buffered
 * skipped values.
 *
 * ## Example
 *
 * Skip the last 2 values of an observable with many values
 *
 * ```ts
 * import { of, skipLast } from 'rxjs';
 *
 * const numbers = of(1, 2, 3, 4, 5);
 * const skipLastTwo = numbers.pipe(skipLast(2));
 * skipLastTwo.subscribe(x => console.log(x));
 *
 * // Results in:
 * // 1 2 3
 * // (4 and 5 are skipped)
 * ```
 *
 * @see {@link skip}
 * @see {@link skipUntil}
 * @see {@link skipWhile}
 * @see {@link take}
 *
 * @param skipCount Number of elements to skip from the end of the source Observable.
 * @return A function that returns an Observable that skips the last `count`
 * values emitted by the source Observable.
 */
export function skipLast<T>(skipCount: number): MonoTypeOperatorFunction<T> {
  return skipCount <= 0
    ? // For skipCounts less than or equal to zero, we are just mirroring the source.
      identity
    : operate((source, subscriber) => {
        // A ring buffer to hold the values while we wait to see
        // if we can emit it or it's part of the "skipped" last values.
        // Note that it is the _same size_ as the skip count.
        let ring: T[] = new Array(skipCount);
        // The number of values seen so far. This is used to get
        // the index of the current value when it arrives.
        let seen = 0;
        source.subscribe(
          createOperatorSubscriber(subscriber, (value) => {
            // Get the index of the value we have right now
            // relative to all other values we've seen, then
            // increment `seen`. This ensures we've moved to
            // the next slot in our ring buffer.
            const valueIndex = seen++;
            if (valueIndex < skipCount) {
              // If we haven't seen enough values to fill our buffer yet,
              // Then we aren't to a number of seen values where we can
              // emit anything, so let's just start by filling the ring buffer.
              ring[valueIndex] = value;
            } else {
              // We are traversing over the ring array in such
              // a way that when we get to the end, we loop back
              // and go to the start.
              const index = valueIndex % skipCount;
              // Pull the oldest value out so we can emit it,
              // and stuff the new value in it's place.
              const oldValue = ring[index];
              ring[index] = value;
              // Emit the old value. It is important that this happens
              // after we swap the value in the buffer, if it happens
              // before we swap the value in the buffer, then a synchronous
              // source can get the buffer out of whack.
              subscriber.next(oldValue);
            }
          })
        );

        return () => {
          // Release our values in memory
          ring = null!;
        };
      });
}
RAx
fimport { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { noop } from '../util/noop';

/**
 * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.
 *
 * The `skipUntil` operator causes the observable stream to skip the emission of values until the passed in observable
 * emits the first value. This can be particularly useful in combination with user interactions, responses of HTTP
 * requests or waiting for specific times to pass by.
 *
 * ![](skipUntil.png)
 *
 * Internally, the `skipUntil` operator subscribes to the passed in `notifier` `ObservableInput` (which gets converted
 * to an Observable) in order to recognize the emission of its first value. When `notifier` emits next, the operator
 * unsubscribes from it and starts emitting the values of the *source* observable until it completes or errors. It
 * will never let the *source* observable emit any values if the `notifier` completes or throws an error without
 * emitting a value before.
 *
 * ## Example
 *
 * In the following example, all emitted values of the interval observable are skipped until the user clicks anywhere
 * within the page
 *
 * ```ts
 * import { interval, fromEvent, skipUntil } from 'rxjs';
 *
 * const intervalObservable = interval(1000);
 * const click = fromEvent(document, 'click');
 *
 * const emitAfterClick = intervalObservable.pipe(
 *   skipUntil(click)
 * );
 * // clicked at 4.6s. output: 5...6...7...8........ or
 * // clicked at 7.3s. output: 8...9...10..11.......
 * emitAfterClick.subscribe(value => console.log(value));
 * ```
 *
 * @see {@link last}
 * @see {@link skip}
 * @see {@link skipWhile}
 * @see {@link skipLast}
 *
 * @param notifier An `ObservableInput` that has to emit an item before the source Observable elements begin to
 * be mirrored by the resulting Observable.
 * @return A function that returns an Observable that skips items from the
 * source Observable until the `notifier` Observable emits an item, then emits the
 * remaining items.
 */
export function skipUntil<T>(notifier: ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let taking = false;

    const skipSubscriber = createOperatorSubscriber(
      subscriber,
      () => {
        skipSubscriber?.unsubscribe();
        taking = true;
      },
      noop
    );

    innerFrom(notifier).subscribe(skipSubscriber);

    source.subscribe(createOperatorSubscriber(subscriber, (value) => taking && subscriber.next(value)));
  });
}
;}x]	import { Falsy, MonoTypeOperatorFunction, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function skipWhile<T>(predicate: BooleanConstructor): OperatorFunction<T, Extract<T, Falsy> extends never ? never : T>;
export function skipWhile<T>(predicate: (value: T, index: number) => true): OperatorFunction<T, never>;
export function skipWhile<T>(predicate: (value: T, index: number) => boolean): MonoTypeOperatorFunction<T>;

/**
 * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds
 * true, but emits all further source items as soon as the condition becomes false.
 *
 * ![](skipWhile.png)
 *
 * Skips all the notifications with a truthy predicate. It will not skip the notifications when the predicate is falsy.
 * It can also be skipped using index. Once the predicate is true, it will not be called again.
 *
 * ## Example
 *
 * Skip some super heroes
 *
 * ```ts
 * import { from, skipWhile } from 'rxjs';
 *
 * const source = from(['Green Arrow', 'SuperMan', 'Flash', 'SuperGirl', 'Black Canary'])
 * // Skip the heroes until SuperGirl
 * const example = source.pipe(skipWhile(hero => hero !== 'SuperGirl'));
 * // output: SuperGirl, Black Canary
 * example.subscribe(femaleHero => console.log(femaleHero));
 * ```
 *
 * Skip values from the array until index 5
 *
 * ```ts
 * import { from, skipWhile } from 'rxjs';
 *
 * const source = from([1, 2, 3, 4, 5, 6, 7, 9, 10]);
 * const example = source.pipe(skipWhile((_, i) => i !== 5));
 * // output: 6, 7, 9, 10
 * example.subscribe(value => console.log(value));
 * ```
 *
 * @see {@link last}
 * @see {@link skip}
 * @see {@link skipUntil}
 * @see {@link skipLast}
 *
 * @param predicate A function to test each item emitted from the source Observable.
 * @return A function that returns an Observable that begins emitting items
 * emitted by the source Observable when the specified predicate becomes false.
 */
export function skipWhile<T>(predicate: (value: T, index: number) => boolean): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let taking = false;
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => (taking || (taking = !predicate(value, index++))) && subscriber.next(value))
    );
  });
}
F!,xm
import { concat } from '../observable/concat';
import { OperatorFunction, SchedulerLike, ValueFromArray } from '../types';
import { popScheduler } from '../util/args';
import { operate } from '../util/lift';

// Devs are more likely to pass null or undefined than they are a scheduler
// without accompanying values. To make things easier for (naughty) devs who
// use the `strictNullChecks: false` TypeScript compiler option, these
// overloads with explicit null and undefined values are included.

export function startWith<T>(value: null): OperatorFunction<T, T | null>;
export function startWith<T>(value: undefined): OperatorFunction<T, T | undefined>;

/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `concatAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function startWith<T, A extends readonly unknown[] = T[]>(
  ...valuesAndScheduler: [...A, SchedulerLike]
): OperatorFunction<T, T | ValueFromArray<A>>;
export function startWith<T, A extends readonly unknown[] = T[]>(...values: A): OperatorFunction<T, T | ValueFromArray<A>>;

/**
 * Returns an observable that, at the moment of subscription, will synchronously emit all
 * values provided to this operator, then subscribe to the source and mirror all of its emissions
 * to subscribers.
 *
 * This is a useful way to know when subscription has occurred on an existing observable.
 *
 * <span class="informal">First emits its arguments in order, and then any
 * emissions from the source.</span>
 *
 * ![](startWith.png)
 *
 * ## Examples
 *
 * Emit a value when a timer starts.
 *
 * ```ts
 * import { timer, map, startWith } from 'rxjs';
 *
 * timer(1000)
 *   .pipe(
 *     map(() => 'timer emit'),
 *     startWith('timer start')
 *   )
 *   .subscribe(x => console.log(x));
 *
 * // results:
 * // 'timer start'
 * // 'timer emit'
 * ```
 *
 * @param values Items you want the modified Observable to emit first.
 * @return A function that returns an Observable that synchronously emits
 * provided values before subscribing to the source Observable.
 *
 * @see {@link endWith}
 * @see {@link finalize}
 * @see {@link concat}
 */
export function startWith<T, D>(...values: D[]): OperatorFunction<T, T | D> {
  const scheduler = popScheduler(values);
  return operate((source, subscriber) => {
    // Here we can't pass `undefined` as a scheduler, because if we did, the
    // code inside of `concat` would be confused by the `undefined`, and treat it
    // like an invalid observable. So we have to split it two different ways.
    (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);
  });
}
Եximport { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';

/**
 * Asynchronously subscribes Observers to this Observable on the specified {@link SchedulerLike}.
 *
 * With `subscribeOn` you can decide what type of scheduler a specific Observable will be using when it is subscribed to.
 *
 * Schedulers control the speed and order of emissions to observers from an Observable stream.
 *
 * ![](subscribeOn.png)
 *
 * ## Example
 *
 * Given the following code:
 *
 * ```ts
 * import { of, merge } from 'rxjs';
 *
 * const a = of(1, 2, 3);
 * const b = of(4, 5, 6);
 *
 * merge(a, b).subscribe(console.log);
 *
 * // Outputs
 * // 1
 * // 2
 * // 3
 * // 4
 * // 5
 * // 6
 * ```
 *
 * Both Observable `a` and `b` will emit their values directly and synchronously once they are subscribed to.
 *
 * If we instead use the `subscribeOn` operator declaring that we want to use the {@link asyncScheduler} for values emitted by Observable `a`:
 *
 * ```ts
 * import { of, subscribeOn, asyncScheduler, merge } from 'rxjs';
 *
 * const a = of(1, 2, 3).pipe(subscribeOn(asyncScheduler));
 * const b = of(4, 5, 6);
 *
 * merge(a, b).subscribe(console.log);
 *
 * // Outputs
 * // 4
 * // 5
 * // 6
 * // 1
 * // 2
 * // 3
 * ```
 *
 * The reason for this is that Observable `b` emits its values directly and synchronously like before
 * but the emissions from `a` are scheduled on the event loop because we are now using the {@link asyncScheduler} for that specific Observable.
 *
 * @param scheduler The {@link SchedulerLike} to perform subscription actions on.
 * @param delay A delay to pass to the scheduler to delay subscriptions
 * @return A function that returns an Observable modified so that its
 * subscriptions happen on the specified {@link SchedulerLike}.
 */
export function subscribeOn<T>(scheduler: SchedulerLike, delay: number = 0): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    subscriber.add(scheduler.schedule(() => source.subscribe(subscriber), delay));
  });
}
xKimport { OperatorFunction, ObservableInput, ObservedValueOf } from '../types';
import { switchMap } from './switchMap';
import { identity } from '../util/identity';

/**
 * Converts a higher-order Observable into a first-order Observable
 * producing values only from the most recent observable sequence
 *
 * <span class="informal">Flattens an Observable-of-Observables.</span>
 *
 * ![](switchAll.png)
 *
 * `switchAll` subscribes to a source that is an observable of observables, also known as a
 * "higher-order observable" (or `Observable<Observable<T>>`). It subscribes to the most recently
 * provided "inner observable" emitted by the source, unsubscribing from any previously subscribed
 * to inner observable, such that only the most recent inner observable may be subscribed to at
 * any point in time. The resulting observable returned by `switchAll` will only complete if the
 * source observable completes, *and* any currently subscribed to inner observable also has completed,
 * if there are any.
 *
 * ## Examples
 *
 * Spawn a new interval observable for each click event, but for every new
 * click, cancel the previous interval and subscribe to the new one
 *
 * ```ts
 * import { fromEvent, tap, map, interval, switchAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click').pipe(tap(() => console.log('click')));
 * const source = clicks.pipe(map(() => interval(1000)));
 *
 * source
 *   .pipe(switchAll())
 *   .subscribe(x => console.log(x));
 *
 * // Output
 * // click
 * // 0
 * // 1
 * // 2
 * // 3
 * // ...
 * // click
 * // 0
 * // 1
 * // 2
 * // ...
 * // click
 * // ...
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link concatAll}
 * @see {@link exhaustAll}
 * @see {@link switchMap}
 * @see {@link switchMapTo}
 * @see {@link mergeAll}
 *
 * @return A function that returns an Observable that converts a higher-order
 * Observable into a first-order Observable producing values only from the most
 * recent Observable sequence.
 */
export function switchAll<O extends ObservableInput<any>>(): OperatorFunction<O, ObservedValueOf<O>> {
  return switchMap(identity);
}
gxxqimport { ObservableInput, ObservedValueOf, OperatorFunction } from '../types';
import { switchMap } from './switchMap';
import { operate } from '../util/lift';

// TODO: Generate a marble diagram for these docs.

/**
 * Applies an accumulator function over the source Observable where the
 * accumulator function itself returns an Observable, emitting values
 * only from the most recently returned Observable.
 *
 * <span class="informal">It's like {@link mergeScan}, but only the most recent
 * Observable returned by the accumulator is merged into the outer Observable.</span>
 *
 * @see {@link scan}
 * @see {@link mergeScan}
 * @see {@link switchMap}
 *
 * @param accumulator
 * The accumulator function called on each source value.
 * @param seed The initial accumulation value.
 * @return A function that returns an observable of the accumulated values.
 */
export function switchScan<T, R, O extends ObservableInput<any>>(
  accumulator: (acc: R, value: T, index: number) => O,
  seed: R
): OperatorFunction<T, ObservedValueOf<O>> {
  return operate((source, subscriber) => {
    // The state we will keep up to date to pass into our
    // accumulator function at each new value from the source.
    let state = seed;

    // Use `switchMap` on our `source` to do the work of creating
    // this operator. Note the backwards order here of `switchMap()(source)`
    // to avoid needing to use `pipe` unnecessarily
    switchMap(
      // On each value from the source, call the accumulator with
      // our previous state, the value and the index.
      (value: T, index) => accumulator(state, value, index),
      // Using the deprecated result selector here as a dirty trick
      // to update our state with the flattened value.
      (_, innerValue) => ((state = innerValue), innerValue)
    )(source).subscribe(subscriber);

    return () => {
      // Release state on finalization
      state = null!;
    };
  });
}
6¼ximport { MonoTypeOperatorFunction } from '../types';
import { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits only the first `count` values emitted by the source Observable.
 *
 * <span class="informal">Takes the first `count` values from the source, then
 * completes.</span>
 *
 * ![](take.png)
 *
 * `take` returns an Observable that emits only the first `count` values emitted
 * by the source Observable. If the source emits fewer than `count` values then
 * all of its values are emitted. After that, it completes, regardless if the
 * source completes.
 *
 * ## Example
 *
 * Take the first 5 seconds of an infinite 1-second interval Observable
 *
 * ```ts
 * import { interval, take } from 'rxjs';
 *
 * const intervalCount = interval(1000);
 * const takeFive = intervalCount.pipe(take(5));
 * takeFive.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * // 3
 * // 4
 * ```
 *
 * @see {@link takeLast}
 * @see {@link takeUntil}
 * @see {@link takeWhile}
 * @see {@link skip}
 *
 * @param count The maximum number of `next` values to emit.
 * @return A function that returns an Observable that emits only the first
 * `count` values emitted by the source Observable, or all of the values from
 * the source if the source emits fewer than `count` values.
 */
export function take<T>(count: number): MonoTypeOperatorFunction<T> {
  return count <= 0
    ? // If we are taking no values, that's empty.
      () => EMPTY
    : operate((source, subscriber) => {
        let seen = 0;
        source.subscribe(
          createOperatorSubscriber(subscriber, (value) => {
            // Increment the number of values we have seen,
            // then check it against the allowed count to see
            // if we are still letting values through.
            if (++seen <= count) {
              subscriber.next(value);
              // If we have met or passed our allowed count,
              // we need to complete. We have to do <= here,
              // because re-entrant code will increment `seen` twice.
              if (count <= seen) {
                subscriber.complete();
              }
            }
          })
        );
      });
}
;︻xGimport { EMPTY } from '../observable/empty';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Waits for the source to complete, then emits the last N values from the source,
 * as specified by the `count` argument.
 *
 * ![](takeLast.png)
 *
 * `takeLast` results in an observable that will hold values up to `count` values in memory,
 * until the source completes. It then pushes all values in memory to the consumer, in the
 * order they were received from the source, then notifies the consumer that it is
 * complete.
 *
 * If for some reason the source completes before the `count` supplied to `takeLast` is reached,
 * all values received until that point are emitted, and then completion is notified.
 *
 * **Warning**: Using `takeLast` with an observable that never completes will result
 * in an observable that never emits a value.
 *
 * ## Example
 *
 * Take the last 3 values of an Observable with many values
 *
 * ```ts
 * import { range, takeLast } from 'rxjs';
 *
 * const many = range(1, 100);
 * const lastThree = many.pipe(takeLast(3));
 * lastThree.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link take}
 * @see {@link takeUntil}
 * @see {@link takeWhile}
 * @see {@link skip}
 *
 * @param count The maximum number of values to emit from the end of
 * the sequence of values emitted by the source Observable.
 * @return A function that returns an Observable that emits at most the last
 * `count` values emitted by the source Observable.
 */
export function takeLast<T>(count: number): MonoTypeOperatorFunction<T> {
  return count <= 0
    ? () => EMPTY
    : operate((source, subscriber) => {
        // This buffer will hold the values we are going to emit
        // when the source completes. Since we only want to take the
        // last N values, we can't emit until we're sure we're not getting
        // any more values.
        let buffer: T[] = [];
        source.subscribe(
          createOperatorSubscriber(
            subscriber,
            (value) => {
              // Add the most recent value onto the end of our buffer.
              buffer.push(value);
              // If our buffer is now larger than the number of values we
              // want to take, we remove the oldest value from the buffer.
              count < buffer.length && buffer.shift();
            },
            () => {
              // The source completed, we now know what are last values
              // are, emit them in the order they were received.
              for (const value of buffer) {
                subscriber.next(value);
              }
              subscriber.complete();
            },
            // Errors are passed through to the consumer
            undefined,
            () => {
              // During finalization release the values in our buffer.
              buffer = null!;
            }
          )
        );
      });
}
̪xxyimport { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { noop } from '../util/noop';

/**
 * Emits the values emitted by the source Observable until a `notifier`
 * Observable emits a value.
 *
 * <span class="informal">Lets values pass until a second Observable,
 * `notifier`, emits a value. Then, it completes.</span>
 *
 * ![](takeUntil.png)
 *
 * `takeUntil` subscribes and begins mirroring the source Observable. It also
 * monitors a second Observable, `notifier` that you provide. If the `notifier`
 * emits a value, the output Observable stops mirroring the source Observable
 * and completes. If the `notifier` doesn't emit any value and completes
 * then `takeUntil` will pass all values.
 *
 * ## Example
 *
 * Tick every second until the first click happens
 *
 * ```ts
 * import { interval, fromEvent, takeUntil } from 'rxjs';
 *
 * const source = interval(1000);
 * const clicks = fromEvent(document, 'click');
 * const result = source.pipe(takeUntil(clicks));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link take}
 * @see {@link takeLast}
 * @see {@link takeWhile}
 * @see {@link skip}
 *
 * @param notifier The `ObservableInput` whose first emitted value will cause the output
 * Observable of `takeUntil` to stop emitting values from the source Observable.
 * @return A function that returns an Observable that emits the values from the
 * source Observable until `notifier` emits its first value.
 */
export function takeUntil<T>(notifier: ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, () => subscriber.complete(), noop));
    !subscriber.closed && source.subscribe(subscriber);
  });
}
^x import { OperatorFunction, MonoTypeOperatorFunction, TruthyTypesOf } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function takeWhile<T>(predicate: BooleanConstructor, inclusive: true): MonoTypeOperatorFunction<T>;
export function takeWhile<T>(predicate: BooleanConstructor, inclusive: false): OperatorFunction<T, TruthyTypesOf<T>>;
export function takeWhile<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function takeWhile<T, S extends T>(predicate: (value: T, index: number) => value is S): OperatorFunction<T, S>;
export function takeWhile<T, S extends T>(predicate: (value: T, index: number) => value is S, inclusive: false): OperatorFunction<T, S>;
export function takeWhile<T>(predicate: (value: T, index: number) => boolean, inclusive?: boolean): MonoTypeOperatorFunction<T>;

/**
 * Emits values emitted by the source Observable so long as each value satisfies
 * the given `predicate`, and then completes as soon as this `predicate` is not
 * satisfied.
 *
 * <span class="informal">Takes values from the source only while they pass the
 * condition given. When the first value does not satisfy, it completes.</span>
 *
 * ![](takeWhile.png)
 *
 * `takeWhile` subscribes and begins mirroring the source Observable. Each value
 * emitted on the source is given to the `predicate` function which returns a
 * boolean, representing a condition to be satisfied by the source values. The
 * output Observable emits the source values until such time as the `predicate`
 * returns false, at which point `takeWhile` stops mirroring the source
 * Observable and completes the output Observable.
 *
 * ## Example
 *
 * Emit click events only while the clientX property is greater than 200
 *
 * ```ts
 * import { fromEvent, takeWhile } from 'rxjs';
 *
 * const clicks = fromEvent<PointerEvent>(document, 'click');
 * const result = clicks.pipe(takeWhile(ev => ev.clientX > 200));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link take}
 * @see {@link takeLast}
 * @see {@link takeUntil}
 * @see {@link skip}
 *
 * @param predicate A function that evaluates a value emitted by the source
 * Observable and returns a boolean. Also takes the (zero-based) index as the
 * second argument.
 * @param inclusive When set to `true` the value that caused `predicate` to
 * return `false` will also be emitted.
 * @return A function that returns an Observable that emits values from the
 * source Observable so long as each value satisfies the condition defined by
 * the `predicate`, then completes.
 */
export function takeWhile<T>(predicate: (value: T, index: number) => boolean, inclusive = false): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        const result = predicate(value, index++);
        (result || inclusive) && subscriber.next(value);
        !result && subscriber.complete();
      })
    );
  });
}
."<xm!import { MonoTypeOperatorFunction, Observer } from '../types';
import { isFunction } from '../util/isFunction';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';

/**
 * An extension to the {@link Observer} interface used only by the {@link tap} operator.
 *
 * It provides a useful set of callbacks a user can register to do side-effects in
 * cases other than what the usual {@link Observer} callbacks are
 * ({@link guide/glossary-and-semantics#next next},
 * {@link guide/glossary-and-semantics#error error} and/or
 * {@link guide/glossary-and-semantics#complete complete}).
 *
 * ## Example
 *
 * ```ts
 * import { fromEvent, switchMap, tap, interval, take } from 'rxjs';
 *
 * const source$ = fromEvent(document, 'click');
 * const result$ = source$.pipe(
 *   switchMap((_, i) => i % 2 === 0
 *     ? fromEvent(document, 'mousemove').pipe(
 *         tap({
 *           subscribe: () => console.log('Subscribed to the mouse move events after click #' + i),
 *           unsubscribe: () => console.log('Mouse move events #' + i + ' unsubscribed'),
 *           finalize: () => console.log('Mouse move events #' + i + ' finalized')
 *         })
 *       )
 *     : interval(1_000).pipe(
 *         take(5),
 *         tap({
 *           subscribe: () => console.log('Subscribed to the 1-second interval events after click #' + i),
 *           unsubscribe: () => console.log('1-second interval events #' + i + ' unsubscribed'),
 *           finalize: () => console.log('1-second interval events #' + i + ' finalized')
 *         })
 *       )
 *   )
 * );
 *
 * const subscription = result$.subscribe({
 *   next: console.log
 * });
 *
 * setTimeout(() => {
 *   console.log('Unsubscribe after 60 seconds');
 *   subscription.unsubscribe();
 * }, 60_000);
 * ```
 */
export interface TapObserver<T> extends Observer<T> {
  /**
   * The callback that `tap` operator invokes at the moment when the source Observable
   * gets subscribed to.
   */
  subscribe: () => void;
  /**
   * The callback that `tap` operator invokes when an explicit
   * {@link guide/glossary-and-semantics#unsubscription unsubscribe} happens. It won't get invoked on
   * `error` or `complete` events.
   */
  unsubscribe: () => void;
  /**
   * The callback that `tap` operator invokes when any kind of
   * {@link guide/glossary-and-semantics#finalization finalization} happens - either when
   * the source Observable `error`s or `complete`s or when it gets explicitly unsubscribed
   * by the user. There is no difference in using this callback or the {@link finalize}
   * operator, but if you're already using `tap` operator, you can use this callback
   * instead. You'd get the same result in either case.
   */
  finalize: () => void;
}
export function tap<T>(observerOrNext?: Partial<TapObserver<T>> | ((value: T) => void)): MonoTypeOperatorFunction<T>;
/** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */
export function tap<T>(
  next?: ((value: T) => void) | null,
  error?: ((error: any) => void) | null,
  complete?: (() => void) | null
): MonoTypeOperatorFunction<T>;

/**
 * Used to perform side-effects for notifications from the source observable
 *
 * <span class="informal">Used when you want to affect outside state with a notification without altering the notification</span>
 *
 * ![](tap.png)
 *
 * Tap is designed to allow the developer a designated place to perform side effects. While you _could_ perform side-effects
 * inside of a `map` or a `mergeMap`, that would make their mapping functions impure, which isn't always a big deal, but will
 * make it so you can't do things like memoize those functions. The `tap` operator is designed solely for such side-effects to
 * help you remove side-effects from other operations.
 *
 * For any notification, next, error, or complete, `tap` will call the appropriate callback you have provided to it, via a function
 * reference, or a partial observer, then pass that notification down the stream.
 *
 * The observable returned by `tap` is an exact mirror of the source, with one exception: Any error that occurs -- synchronously -- in a handler
 * provided to `tap` will be emitted as an error from the returned observable.
 *
 * > Be careful! You can mutate objects as they pass through the `tap` operator's handlers.
 *
 * The most common use of `tap` is actually for debugging. You can place a `tap(console.log)` anywhere
 * in your observable `pipe`, log out the notifications as they are emitted by the source returned by the previous
 * operation.
 *
 * ## Examples
 *
 * Check a random number before it is handled. Below is an observable that will use a random number between 0 and 1,
 * and emit `'big'` or `'small'` depending on the size of that number. But we wanted to log what the original number
 * was, so we have added a `tap(console.log)`.
 *
 * ```ts
 * import { of, tap, map } from 'rxjs';
 *
 * of(Math.random()).pipe(
 *   tap(console.log),
 *   map(n => n > 0.5 ? 'big' : 'small')
 * ).subscribe(console.log);
 * ```
 *
 * Using `tap` to analyze a value and force an error. Below is an observable where in our system we only
 * want to emit numbers 3 or less we get from another source. We can force our observable to error
 * using `tap`.
 *
 * ```ts
 * import { of, tap } from 'rxjs';
 *
 * const source = of(1, 2, 3, 4, 5);
 *
 * source.pipe(
 *   tap(n => {
 *     if (n > 3) {
 *       throw new TypeError(`Value ${ n } is greater than 3`);
 *     }
 *   })
 * )
 * .subscribe({ next: console.log, error: err => console.log(err.message) });
 * ```
 *
 * We want to know when an observable completes before moving on to the next observable. The system
 * below will emit a random series of `'X'` characters from 3 different observables in sequence. The
 * only way we know when one observable completes and moves to the next one, in this case, is because
 * we have added a `tap` with the side effect of logging to console.
 *
 * ```ts
 * import { of, concatMap, interval, take, map, tap } from 'rxjs';
 *
 * of(1, 2, 3).pipe(
 *   concatMap(n => interval(1000).pipe(
 *     take(Math.round(Math.random() * 10)),
 *     map(() => 'X'),
 *     tap({ complete: () => console.log(`Done with ${ n }`) })
 *   ))
 * )
 * .subscribe(console.log);
 * ```
 *
 * @see {@link finalize}
 * @see {@link TapObserver}
 *
 * @param observerOrNext A next handler or partial observer
 * @param error An error handler
 * @param complete A completion handler
 * @return A function that returns an Observable identical to the source, but
 * runs the specified Observer or callback(s) for each item.
 */
export function tap<T>(
  observerOrNext?: Partial<TapObserver<T>> | ((value: T) => void) | null,
  error?: ((e: any) => void) | null,
  complete?: (() => void) | null
): MonoTypeOperatorFunction<T> {
  // We have to check to see not only if next is a function,
  // but if error or complete were passed. This is because someone
  // could technically call tap like `tap(null, fn)` or `tap(null, null, fn)`.
  const tapObserver =
    isFunction(observerOrNext) || error || complete
      ? // tslint:disable-next-line: no-object-literal-type-assertion
        ({ next: observerOrNext as Exclude<typeof observerOrNext, Partial<TapObserver<T>>>, error, complete } as Partial<TapObserver<T>>)
      : observerOrNext;

  return tapObserver
    ? operate((source, subscriber) => {
        tapObserver.subscribe?.();
        let isUnsub = true;
        source.subscribe(
          createOperatorSubscriber(
            subscriber,
            (value) => {
              tapObserver.next?.(value);
              subscriber.next(value);
            },
            () => {
              isUnsub = false;
              tapObserver.complete?.();
              subscriber.complete();
            },
            (err) => {
              isUnsub = false;
              tapObserver.error?.(err);
              subscriber.error(err);
            },
            () => {
              if (isUnsub) {
                tapObserver.unsubscribe?.();
              }
              tapObserver.finalize?.();
            }
          )
        );
      })
    : // Tap was called with no valid tap observer or handler
      // (e.g. `tap(null, null, null)` or `tap(null)` or `tap()`)
      // so we're going to just mirror the source.
      identity;
}
Ѿx^import { Subscription } from '../Subscription';

import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * An object interface used by {@link throttle} or {@link throttleTime} that ensure
 * configuration options of these operators.
 *
 * @see {@link throttle}
 * @see {@link throttleTime}
 */
export interface ThrottleConfig {
  /**
   * If `true`, the resulting Observable will emit the first value from the source
   * Observable at the **start** of the "throttling" process (when starting an
   * internal timer that prevents other emissions from the source to pass through).
   * If `false`, it will not emit the first value from the source Observable at the
   * start of the "throttling" process.
   *
   * If not provided, defaults to: `true`.
   */
  leading?: boolean;
  /**
   * If `true`, the resulting Observable will emit the last value from the source
   * Observable at the **end** of the "throttling" process (when ending an internal
   * timer that prevents other emissions from the source to pass through).
   * If `false`, it will not emit the last value from the source Observable at the
   * end of the "throttling" process.
   *
   * If not provided, defaults to: `false`.
   */
  trailing?: boolean;
}

/**
 * Emits a value from the source Observable, then ignores subsequent source
 * values for a duration determined by another Observable, then repeats this
 * process.
 *
 * <span class="informal">It's like {@link throttleTime}, but the silencing
 * duration is determined by a second Observable.</span>
 *
 * ![](throttle.svg)
 *
 * `throttle` emits the source Observable values on the output Observable
 * when its internal timer is disabled, and ignores source values when the timer
 * is enabled. Initially, the timer is disabled. As soon as the first source
 * value arrives, it is forwarded to the output Observable, and then the timer
 * is enabled by calling the `durationSelector` function with the source value,
 * which returns the "duration" Observable. When the duration Observable emits a
 * value, the timer is disabled, and this process repeats for the
 * next source value.
 *
 * ## Example
 *
 * Emit clicks at a rate of at most one click per second
 *
 * ```ts
 * import { fromEvent, throttle, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(throttle(() => interval(1000)));
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link debounce}
 * @see {@link delayWhen}
 * @see {@link sample}
 * @see {@link throttleTime}
 *
 * @param durationSelector A function that receives a value from the source
 * Observable, for computing the silencing duration for each source value,
 * returned as an `ObservableInput`.
 * @param config A configuration object to define `leading` and `trailing`
 * behavior. Defaults to `{ leading: true, trailing: false }`.
 * @return A function that returns an Observable that performs the throttle
 * operation to limit the rate of emissions from the source.
 */
export function throttle<T>(durationSelector: (value: T) => ObservableInput<any>, config?: ThrottleConfig): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    const { leading = true, trailing = false } = config ?? {};
    let hasValue = false;
    let sendValue: T | null = null;
    let throttled: Subscription | null = null;
    let isComplete = false;

    const endThrottling = () => {
      throttled?.unsubscribe();
      throttled = null;
      if (trailing) {
        send();
        isComplete && subscriber.complete();
      }
    };

    const cleanupThrottling = () => {
      throttled = null;
      isComplete && subscriber.complete();
    };

    const startThrottle = (value: T) =>
      (throttled = innerFrom(durationSelector(value)).subscribe(createOperatorSubscriber(subscriber, endThrottling, cleanupThrottling)));

    const send = () => {
      if (hasValue) {
        // Ensure we clear out our value and hasValue flag
        // before we emit, otherwise reentrant code can cause
        // issues here.
        hasValue = false;
        const value = sendValue!;
        sendValue = null;
        // Emit the value.
        subscriber.next(value);
        !isComplete && startThrottle(value);
      }
    };

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        // Regarding the presence of throttled.closed in the following
        // conditions, if a synchronous duration selector is specified - weird,
        // but legal - an already-closed subscription will be assigned to
        // throttled, so the subscription's closed property needs to be checked,
        // too.
        (value) => {
          hasValue = true;
          sendValue = value;
          !(throttled && !throttled.closed) && (leading ? send() : startThrottle(value));
        },
        () => {
          isComplete = true;
          !(trailing && hasValue && throttled && !throttled.closed) && subscriber.complete();
        }
      )
    );
  });
}
Vnximport { EmptyError } from '../util/EmptyError';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * If the source observable completes without emitting a value, it will emit
 * an error. The error will be created at that time by the optional
 * `errorFactory` argument, otherwise, the error will be {@link EmptyError}.
 *
 * ![](throwIfEmpty.png)
 *
 * ## Example
 *
 * Throw an error if the document wasn't clicked within 1 second
 *
 * ```ts
 * import { fromEvent, takeUntil, timer, throwIfEmpty } from 'rxjs';
 *
 * const click$ = fromEvent(document, 'click');
 *
 * click$.pipe(
 *   takeUntil(timer(1000)),
 *   throwIfEmpty(() => new Error('The document was not clicked within 1 second'))
 * )
 * .subscribe({
 *   next() {
 *    console.log('The document was clicked');
 *   },
 *   error(err) {
 *     console.error(err.message);
 *   }
 * });
 * ```
 *
 * @param errorFactory A factory function called to produce the
 * error to be thrown when the source observable completes without emitting a
 * value.
 * @return A function that returns an Observable that throws an error if the
 * source Observable completed without emitting.
 */
export function throwIfEmpty<T>(errorFactory: () => any = defaultErrorFactory): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          hasValue = true;
          subscriber.next(value);
        },
        () => (hasValue ? subscriber.complete() : subscriber.error(errorFactory()))
      )
    );
  });
}

function defaultErrorFactory() {
  return new EmptyError();
}
Cx!	import { asyncScheduler } from '../scheduler/async';
import { SchedulerLike, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits an object containing the current value, and the time that has
 * passed between emitting the current value and the previous value, which is
 * calculated by using the provided `scheduler`'s `now()` method to retrieve
 * the current time at each emission, then calculating the difference. The `scheduler`
 * defaults to {@link asyncScheduler}, so by default, the `interval` will be in
 * milliseconds.
 *
 * <span class="informal">Convert an Observable that emits items into one that
 * emits indications of the amount of time elapsed between those emissions.</span>
 *
 * ![](timeInterval.png)
 *
 * ## Example
 *
 * Emit interval between current value with the last value
 *
 * ```ts
 * import { interval, timeInterval } from 'rxjs';
 *
 * const seconds = interval(1000);
 *
 * seconds
 *   .pipe(timeInterval())
 *   .subscribe(value => console.log(value));
 *
 * // NOTE: The values will never be this precise,
 * // intervals created with `interval` or `setInterval`
 * // are non-deterministic.
 *
 * // { value: 0, interval: 1000 }
 * // { value: 1, interval: 1000 }
 * // { value: 2, interval: 1000 }
 * ```
 *
 * @param scheduler Scheduler used to get the current time.
 * @return A function that returns an Observable that emits information about
 * value and interval.
 */
export function timeInterval<T>(scheduler: SchedulerLike = asyncScheduler): OperatorFunction<T, TimeInterval<T>> {
  return operate((source, subscriber) => {
    let last = scheduler.now();
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        const now = scheduler.now();
        const interval = now - last;
        last = now;
        subscriber.next(new TimeInterval(value, interval));
      })
    );
  });
}

// TODO(benlesh): make this an interface, export the interface, but not the implemented class,
// there's no reason users should be manually creating this type.

export class TimeInterval<T> {
  /**
   * @deprecated Internal implementation detail, do not construct directly. Will be made an interface in v8.
   */
  constructor(public value: T, public interval: number) {}
}
:Dxf>import { asyncScheduler } from '../scheduler/async';
import { MonoTypeOperatorFunction, SchedulerLike, OperatorFunction, ObservableInput, ObservedValueOf } from '../types';
import { isValidDate } from '../util/isDate';
import { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { createErrorClass } from '../util/createErrorClass';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { executeSchedule } from '../util/executeSchedule';

export interface TimeoutConfig<T, O extends ObservableInput<unknown> = ObservableInput<T>, M = unknown> {
  /**
   * The time allowed between values from the source before timeout is triggered.
   */
  each?: number;

  /**
   * The relative time as a `number` in milliseconds, or a specific time as a `Date` object,
   * by which the first value must arrive from the source before timeout is triggered.
   */
  first?: number | Date;

  /**
   * The scheduler to use with time-related operations within this operator. Defaults to {@link asyncScheduler}
   */
  scheduler?: SchedulerLike;

  /**
   * A factory used to create observable to switch to when timeout occurs. Provides
   * a {@link TimeoutInfo} about the source observable's emissions and what delay or
   * exact time triggered the timeout.
   */
  with?: (info: TimeoutInfo<T, M>) => O;

  /**
   * Optional additional metadata you can provide to code that handles
   * the timeout, will be provided through the {@link TimeoutError}.
   * This can be used to help identify the source of a timeout or pass along
   * other information related to the timeout.
   */
  meta?: M;
}

export interface TimeoutInfo<T, M = unknown> {
  /** Optional metadata that was provided to the timeout configuration. */
  readonly meta: M;
  /** The number of messages seen before the timeout */
  readonly seen: number;
  /** The last message seen */
  readonly lastValue: T | null;
}

/**
 * An error emitted when a timeout occurs.
 */
export interface TimeoutError<T = unknown, M = unknown> extends Error {
  /**
   * The information provided to the error by the timeout
   * operation that created the error. Will be `null` if
   * used directly in non-RxJS code with an empty constructor.
   * (Note that using this constructor directly is not recommended,
   * you should create your own errors)
   */
  info: TimeoutInfo<T, M> | null;
}

export interface TimeoutErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new <T = unknown, M = unknown>(info?: TimeoutInfo<T, M>): TimeoutError<T, M>;
}

/**
 * An error thrown by the {@link timeout} operator.
 *
 * Provided so users can use as a type and do quality comparisons.
 * We recommend you do not subclass this or create instances of this class directly.
 * If you have need of a error representing a timeout, you should
 * create your own error class and use that.
 *
 * @see {@link timeout}
 */
export const TimeoutError: TimeoutErrorCtor = createErrorClass(
  (_super) =>
    function TimeoutErrorImpl(this: any, info: TimeoutInfo<any> | null = null) {
      _super(this);
      this.message = 'Timeout has occurred';
      this.name = 'TimeoutError';
      this.info = info;
    }
);

/**
 * If `with` is provided, this will return an observable that will switch to a different observable if the source
 * does not push values within the specified time parameters.
 *
 * <span class="informal">The most flexible option for creating a timeout behavior.</span>
 *
 * The first thing to know about the configuration is if you do not provide a `with` property to the configuration,
 * when timeout conditions are met, this operator will emit a {@link TimeoutError}. Otherwise, it will use the factory
 * function provided by `with`, and switch your subscription to the result of that. Timeout conditions are provided by
 * the settings in `first` and `each`.
 *
 * The `first` property can be either a `Date` for a specific time, a `number` for a time period relative to the
 * point of subscription, or it can be skipped. This property is to check timeout conditions for the arrival of
 * the first value from the source _only_. The timings of all subsequent values  from the source will be checked
 * against the time period provided by `each`, if it was provided.
 *
 * The `each` property can be either a `number` or skipped. If a value for `each` is provided, it represents the amount of
 * time the resulting observable will wait between the arrival of values from the source before timing out. Note that if
 * `first` is _not_ provided, the value from `each` will be used to check timeout conditions for the arrival of the first
 * value and all subsequent values. If `first` _is_ provided, `each` will only be use to check all values after the first.
 *
 * ## Examples
 *
 * Emit a custom error if there is too much time between values
 *
 * ```ts
 * import { interval, timeout, throwError } from 'rxjs';
 *
 * class CustomTimeoutError extends Error {
 *   constructor() {
 *     super('It was too slow');
 *     this.name = 'CustomTimeoutError';
 *   }
 * }
 *
 * const slow$ = interval(900);
 *
 * slow$.pipe(
 *   timeout({
 *     each: 1000,
 *     with: () => throwError(() => new CustomTimeoutError())
 *   })
 * )
 * .subscribe({
 *   error: console.error
 * });
 * ```
 *
 * Switch to a faster observable if your source is slow.
 *
 * ```ts
 * import { interval, timeout } from 'rxjs';
 *
 * const slow$ = interval(900);
 * const fast$ = interval(500);
 *
 * slow$.pipe(
 *   timeout({
 *     each: 1000,
 *     with: () => fast$,
 *   })
 * )
 * .subscribe(console.log);
 * ```
 * @param config The configuration for the timeout.
 */
export function timeout<T, O extends ObservableInput<unknown>, M = unknown>(
  config: TimeoutConfig<T, O, M> & { with: (info: TimeoutInfo<T, M>) => O }
): OperatorFunction<T, T | ObservedValueOf<O>>;

/**
 * Returns an observable that will error or switch to a different observable if the source does not push values
 * within the specified time parameters.
 *
 * <span class="informal">The most flexible option for creating a timeout behavior.</span>
 *
 * The first thing to know about the configuration is if you do not provide a `with` property to the configuration,
 * when timeout conditions are met, this operator will emit a {@link TimeoutError}. Otherwise, it will use the factory
 * function provided by `with`, and switch your subscription to the result of that. Timeout conditions are provided by
 * the settings in `first` and `each`.
 *
 * The `first` property can be either a `Date` for a specific time, a `number` for a time period relative to the
 * point of subscription, or it can be skipped. This property is to check timeout conditions for the arrival of
 * the first value from the source _only_. The timings of all subsequent values  from the source will be checked
 * against the time period provided by `each`, if it was provided.
 *
 * The `each` property can be either a `number` or skipped. If a value for `each` is provided, it represents the amount of
 * time the resulting observable will wait between the arrival of values from the source before timing out. Note that if
 * `first` is _not_ provided, the value from `each` will be used to check timeout conditions for the arrival of the first
 * value and all subsequent values. If `first` _is_ provided, `each` will only be use to check all values after the first.
 *
 * ### Handling TimeoutErrors
 *
 * If no `with` property was provided, subscriptions to the resulting observable may emit an error of {@link TimeoutError}.
 * The timeout error provides useful information you can examine when you're handling the error. The most common way to handle
 * the error would be with {@link catchError}, although you could use {@link tap} or just the error handler in your `subscribe` call
 * directly, if your error handling is only a side effect (such as notifying the user, or logging).
 *
 * In this case, you would check the error for `instanceof TimeoutError` to validate that the error was indeed from `timeout`, and
 * not from some other source. If it's not from `timeout`, you should probably rethrow it if you're in a `catchError`.
 *
 * ## Examples
 *
 * Emit a {@link TimeoutError} if the first value, and _only_ the first value, does not arrive within 5 seconds
 *
 * ```ts
 * import { interval, timeout } from 'rxjs';
 *
 * // A random interval that lasts between 0 and 10 seconds per tick
 * const source$ = interval(Math.round(Math.random() * 10_000));
 *
 * source$.pipe(
 *   timeout({ first: 5_000 })
 * )
 * .subscribe({
 *   next: console.log,
 *   error: console.error
 * });
 * ```
 *
 * Emit a {@link TimeoutError} if the source waits longer than 5 seconds between any two values or the first value
 * and subscription.
 *
 * ```ts
 * import { timer, timeout, expand } from 'rxjs';
 *
 * const getRandomTime = () => Math.round(Math.random() * 10_000);
 *
 * // An observable that waits a random amount of time between each delivered value
 * const source$ = timer(getRandomTime())
 *   .pipe(expand(() => timer(getRandomTime())));
 *
 * source$
 *   .pipe(timeout({ each: 5_000 }))
 *   .subscribe({
 *     next: console.log,
 *     error: console.error
 *   });
 * ```
 *
 * Emit a {@link TimeoutError} if the source does not emit before 7 seconds, _or_ if the source waits longer than
 * 5 seconds between any two values after the first.
 *
 * ```ts
 * import { timer, timeout, expand } from 'rxjs';
 *
 * const getRandomTime = () => Math.round(Math.random() * 10_000);
 *
 * // An observable that waits a random amount of time between each delivered value
 * const source$ = timer(getRandomTime())
 *   .pipe(expand(() => timer(getRandomTime())));
 *
 * source$
 *   .pipe(timeout({ first: 7_000, each: 5_000 }))
 *   .subscribe({
 *     next: console.log,
 *     error: console.error
 *   });
 * ```
 */
export function timeout<T, M = unknown>(config: Omit<TimeoutConfig<T, any, M>, 'with'>): OperatorFunction<T, T>;

/**
 * Returns an observable that will error if the source does not push its first value before the specified time passed as a `Date`.
 * This is functionally the same as `timeout({ first: someDate })`.
 *
 * <span class="informal">Errors if the first value doesn't show up before the given date and time</span>
 *
 * ![](timeout.png)
 *
 * @param first The date to at which the resulting observable will timeout if the source observable
 * does not emit at least one value.
 * @param scheduler The scheduler to use. Defaults to {@link asyncScheduler}.
 */
export function timeout<T>(first: Date, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;

/**
 * Returns an observable that will error if the source does not push a value within the specified time in milliseconds.
 * This is functionally the same as `timeout({ each: milliseconds })`.
 *
 * <span class="informal">Errors if it waits too long between any value</span>
 *
 * ![](timeout.png)
 *
 * @param each The time allowed between each pushed value from the source before the resulting observable
 * will timeout.
 * @param scheduler The scheduler to use. Defaults to {@link asyncScheduler}.
 */
export function timeout<T>(each: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;

/**
 *
 * Errors if Observable does not emit a value in given time span.
 *
 * <span class="informal">Timeouts on Observable that doesn't emit values fast enough.</span>
 *
 * ![](timeout.png)
 *
 * @see {@link timeoutWith}
 *
 * @return A function that returns an Observable that mirrors behaviour of the
 * source Observable, unless timeout happens when it throws an error.
 */
export function timeout<T, O extends ObservableInput<any>, M>(
  config: number | Date | TimeoutConfig<T, O, M>,
  schedulerArg?: SchedulerLike
): OperatorFunction<T, T | ObservedValueOf<O>> {
  // Intentionally terse code.
  // If the first argument is a valid `Date`, then we use it as the `first` config.
  // Otherwise, if the first argument is a `number`, then we use it as the `each` config.
  // Otherwise, it can be assumed the first argument is the configuration object itself, and
  // we destructure that into what we're going to use, setting important defaults as we do.
  // NOTE: The default for `scheduler` will be the `scheduler` argument if it exists, or
  // it will default to the `asyncScheduler`.
  const {
    first,
    each,
    with: _with = timeoutErrorFactory,
    scheduler = schedulerArg ?? asyncScheduler,
    meta = null!,
  } = (isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config) as TimeoutConfig<T, O, M>;

  if (first == null && each == null) {
    // Ensure timeout was provided at runtime.
    throw new TypeError('No timeout provided.');
  }

  return operate((source, subscriber) => {
    // This subscription encapsulates our subscription to the
    // source for this operator. We're capturing it separately,
    // because if there is a `with` observable to fail over to,
    // we want to unsubscribe from our original subscription, and
    // hand of the subscription to that one.
    let originalSourceSubscription: Subscription;
    // The subscription for our timeout timer. This changes
    // every time we get a new value.
    let timerSubscription: Subscription;
    // A bit of state we pass to our with and error factories to
    // tell what the last value we saw was.
    let lastValue: T | null = null;
    // A bit of state we pass to the with and error factories to
    // tell how many values we have seen so far.
    let seen = 0;
    const startTimer = (delay: number) => {
      timerSubscription = executeSchedule(
        subscriber,
        scheduler,
        () => {
          try {
            originalSourceSubscription.unsubscribe();
            innerFrom(
              _with!({
                meta,
                lastValue,
                seen,
              })
            ).subscribe(subscriber);
          } catch (err) {
            subscriber.error(err);
          }
        },
        delay
      );
    };

    originalSourceSubscription = source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // clear the timer so we can emit and start another one.
          timerSubscription?.unsubscribe();
          seen++;
          // Emit
          subscriber.next((lastValue = value));
          // null | undefined are both < 0. Thanks, JavaScript.
          each! > 0 && startTimer(each!);
        },
        undefined,
        undefined,
        () => {
          if (!timerSubscription?.closed) {
            timerSubscription?.unsubscribe();
          }
          // Be sure not to hold the last value in memory after unsubscription
          // it could be quite large.
          lastValue = null;
        }
      )
    );

    // Intentionally terse code.
    // If we've `seen` a value, that means the "first" clause was met already, if it existed.
    //   it also means that a timer was already started for "each" (in the next handler above).
    // If `first` was provided, and it's a number, then use it.
    // If `first` was provided and it's not a number, it's a Date, and we get the difference between it and "now".
    // If `first` was not provided at all, then our first timer will be the value from `each`.
    !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler!.now()) : each!);
  });
}

/**
 * The default function to use to emit an error when timeout occurs and a `with` function
 * is not specified.
 * @param info The information about the timeout to pass along to the error
 */
function timeoutErrorFactory(info: TimeoutInfo<any>): Observable<never> {
  throw new TimeoutError(info);
}
*fximport { async } from '../scheduler/async';
import { isValidDate } from '../util/isDate';
import { ObservableInput, OperatorFunction, SchedulerLike } from '../types';
import { timeout } from './timeout';

/** @deprecated Replaced with {@link timeout}. Instead of `timeoutWith(someDate, a$, scheduler)`, use the configuration object
 * `timeout({ first: someDate, with: () => a$, scheduler })`. Will be removed in v8. */
export function timeoutWith<T, R>(dueBy: Date, switchTo: ObservableInput<R>, scheduler?: SchedulerLike): OperatorFunction<T, T | R>;
/** @deprecated Replaced with {@link timeout}. Instead of `timeoutWith(100, a$, scheduler)`, use the configuration object
 *  `timeout({ each: 100, with: () => a$, scheduler })`. Will be removed in v8. */
export function timeoutWith<T, R>(waitFor: number, switchTo: ObservableInput<R>, scheduler?: SchedulerLike): OperatorFunction<T, T | R>;

/**
 * When the passed timespan elapses before the source emits any given value, it will unsubscribe from the source,
 * and switch the subscription to another observable.
 *
 * <span class="informal">Used to switch to a different observable if your source is being slow.</span>
 *
 * Useful in cases where:
 *
 * - You want to switch to a different source that may be faster.
 * - You want to notify a user that the data stream is slow.
 * - You want to emit a custom error rather than the {@link TimeoutError} emitted
 *   by the default usage of {@link timeout}.
 *
 * If the first parameter is passed as Date and the time of the Date arrives before the first value arrives from the source,
 * it will unsubscribe from the source and switch the subscription to another observable.
 *
 * <span class="informal">Use Date object to switch to a different observable if the first value doesn't arrive by a specific time.</span>
 *
 * Can be used to set a timeout only for the first value, however it's recommended to use the {@link timeout} operator with
 * the `first` configuration to get the same effect.
 *
 * ## Examples
 *
 * Fallback to a faster observable
 *
 * ```ts
 * import { interval, timeoutWith } from 'rxjs';
 *
 * const slow$ = interval(1000);
 * const faster$ = interval(500);
 *
 * slow$
 *   .pipe(timeoutWith(900, faster$))
 *   .subscribe(console.log);
 * ```
 *
 * Emit your own custom timeout error
 *
 * ```ts
 * import { interval, timeoutWith, throwError } from 'rxjs';
 *
 * class CustomTimeoutError extends Error {
 *   constructor() {
 *     super('It was too slow');
 *     this.name = 'CustomTimeoutError';
 *   }
 * }
 *
 * const slow$ = interval(1000);
 *
 * slow$
 *   .pipe(timeoutWith(900, throwError(() => new CustomTimeoutError())))
 *   .subscribe({
 *     error: err => console.error(err.message)
 *   });
 * ```
 *
 * @see {@link timeout}
 *
 * @param due When passed a number, used as the time (in milliseconds) allowed between each value from the source before timeout
 * is triggered. When passed a Date, used as the exact time at which the timeout will be triggered if the first value does not arrive.
 * @param withObservable The observable to switch to when timeout occurs.
 * @param scheduler The scheduler to use with time-related operations within this operator. Defaults to {@link asyncScheduler}
 * @return A function that returns an Observable that mirrors behaviour of the
 * source Observable, unless timeout happens when it starts emitting values
 * from the `ObservableInput` passed as a second parameter.
 * @deprecated Replaced with {@link timeout}. Instead of `timeoutWith(100, a$, scheduler)`, use {@link timeout} with the configuration
 * object: `timeout({ each: 100, with: () => a$, scheduler })`. Instead of `timeoutWith(someDate, a$, scheduler)`, use {@link timeout}
 * with the configuration object: `timeout({ first: someDate, with: () => a$, scheduler })`. Will be removed in v8.
 */
export function timeoutWith<T, R>(
  due: number | Date,
  withObservable: ObservableInput<R>,
  scheduler?: SchedulerLike
): OperatorFunction<T, T | R> {
  let first: number | Date | undefined;
  let each: number | undefined;
  let _with: () => ObservableInput<R>;
  scheduler = scheduler ?? async;

  if (isValidDate(due)) {
    first = due;
  } else if (typeof due === 'number') {
    each = due;
  }

  if (withObservable) {
    _with = () => withObservable;
  } else {
    throw new TypeError('No observable provided to switch to');
  }

  if (first == null && each == null) {
    // Ensure timeout was provided at runtime.
    throw new TypeError('No timeout provided.');
  }

  return timeout<T, ObservableInput<R>>({
    first,
    each,
    scheduler,
    with: _with,
  });
}
/%uex_import { OperatorFunction, TimestampProvider, Timestamp } from '../types';
import { dateTimestampProvider } from '../scheduler/dateTimestampProvider';
import { map } from './map';

/**
 * Attaches a timestamp to each item emitted by an observable indicating when it was emitted
 *
 * The `timestamp` operator maps the *source* observable stream to an object of type
 * `{value: T, timestamp: R}`. The properties are generically typed. The `value` property contains the value
 * and type of the *source* observable. The `timestamp` is generated by the schedulers `now` function. By
 * default, it uses the `asyncScheduler` which simply returns `Date.now()` (milliseconds since 1970/01/01
 * 00:00:00:000) and therefore is of type `number`.
 *
 * ![](timestamp.png)
 *
 * ## Example
 *
 * In this example there is a timestamp attached to the document's click events
 *
 * ```ts
 * import { fromEvent, timestamp } from 'rxjs';
 *
 * const clickWithTimestamp = fromEvent(document, 'click').pipe(
 *   timestamp()
 * );
 *
 * // Emits data of type { value: PointerEvent, timestamp: number }
 * clickWithTimestamp.subscribe(data => {
 *   console.log(data);
 * });
 * ```
 *
 * @param timestampProvider An object with a `now()` method used to get the current timestamp.
 * @return A function that returns an Observable that attaches a timestamp to
 * each item emitted by the source Observable indicating when it was emitted.
 */
export function timestamp<T>(timestampProvider: TimestampProvider = dateTimestampProvider): OperatorFunction<T, Timestamp<T>> {
  return map((value: T) => ({ value, timestamp: timestampProvider.now() }));
}
qa.óVxcimport { reduce } from './reduce';
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';

const arrReducer = (arr: any[], value: any) => (arr.push(value), arr);

/**
 * Collects all source emissions and emits them as an array when the source completes.
 *
 * <span class="informal">Get all values inside an array when the source completes</span>
 *
 * ![](toArray.png)
 *
 * `toArray` will wait until the source Observable completes before emitting
 * the array containing all emissions. When the source Observable errors no
 * array will be emitted.
 *
 * ## Example
 *
 * ```ts
 * import { interval, take, toArray } from 'rxjs';
 *
 * const source = interval(1000);
 * const example = source.pipe(
 *   take(10),
 *   toArray()
 * );
 *
 * example.subscribe(value => console.log(value));
 *
 * // output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 * ```
 *
 * @return A function that returns an Observable that emits an array of items
 * emitted by the source Observable when source completes.
 */
export function toArray<T>(): OperatorFunction<T, T[]> {
  // Because arrays are mutable, and we're mutating the array in this
  // reducer process, we have to encapsulate the creation of the initial
  // array within this `operate` function.
  return operate((source, subscriber) => {
    reduce(arrReducer, [] as T[])(source).subscribe(subscriber);
  });
}
x]import { Observable } from '../Observable';
import { OperatorFunction, ObservableInput } from '../types';
import { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { innerFrom } from '../observable/innerFrom';

/**
 * Branch out the source Observable values as a nested Observable whenever
 * `windowBoundaries` emits.
 *
 * <span class="informal">It's like {@link buffer}, but emits a nested Observable
 * instead of an array.</span>
 *
 * ![](window.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable emits connected, non-overlapping
 * windows. It emits the current window and opens a new one whenever the
 * `windowBoundaries` emits an item. `windowBoundaries` can be any type that
 * `ObservableInput` accepts. It internally gets converted to an Observable.
 * Because each window is an Observable, the output is a higher-order Observable.
 *
 * ## Example
 *
 * In every window of 1 second each, emit at most 2 click events
 *
 * ```ts
 * import { fromEvent, interval, window, map, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const sec = interval(1000);
 * const result = clicks.pipe(
 *   window(sec),
 *   map(win => win.pipe(take(2))), // take at most 2 emissions from each window
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link windowCount}
 * @see {@link windowTime}
 * @see {@link windowToggle}
 * @see {@link windowWhen}
 * @see {@link buffer}
 *
 * @param windowBoundaries An `ObservableInput` that completes the
 * previous window and starts a new window.
 * @return A function that returns an Observable of windows, which are
 * Observables emitting values of the source Observable.
 */
export function window<T>(windowBoundaries: ObservableInput<any>): OperatorFunction<T, Observable<T>> {
  return operate((source, subscriber) => {
    let windowSubject: Subject<T> = new Subject<T>();

    subscriber.next(windowSubject.asObservable());

    const errorHandler = (err: any) => {
      windowSubject.error(err);
      subscriber.error(err);
    };

    // Subscribe to our source
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => windowSubject?.next(value),
        () => {
          windowSubject.complete();
          subscriber.complete();
        },
        errorHandler
      )
    );

    // Subscribe to the window boundaries.
    innerFrom(windowBoundaries).subscribe(
      createOperatorSubscriber(
        subscriber,
        () => {
          windowSubject.complete();
          subscriber.next((windowSubject = new Subject()));
        },
        noop,
        errorHandler
      )
    );

    return () => {
      // Unsubscribing the subject ensures that anyone who has captured
      // a reference to this window that tries to use it after it can
      // no longer get values from the source will get an ObjectUnsubscribedError.
      windowSubject?.unsubscribe();
      windowSubject = null!;
    };
  });
}
Yvxdimport { Observable } from '../Observable';
import { Subject } from '../Subject';
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Branch out the source Observable values as a nested Observable with each
 * nested Observable emitting at most `windowSize` values.
 *
 * <span class="informal">It's like {@link bufferCount}, but emits a nested
 * Observable instead of an array.</span>
 *
 * ![](windowCount.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable emits windows every `startWindowEvery`
 * items, each containing no more than `windowSize` items. When the source
 * Observable completes or encounters an error, the output Observable emits
 * the current window and propagates the notification from the source
 * Observable. If `startWindowEvery` is not provided, then new windows are
 * started immediately at the start of the source and when each window completes
 * with size `windowSize`.
 *
 * ## Examples
 *
 * Ignore every 3rd click event, starting from the first one
 *
 * ```ts
 * import { fromEvent, windowCount, map, skip, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowCount(3),
 *   map(win => win.pipe(skip(1))), // skip first of every 3 clicks
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Ignore every 3rd click event, starting from the third one
 *
 * ```ts
 * import { fromEvent, windowCount, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowCount(2, 3),
 *   mergeAll() // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link window}
 * @see {@link windowTime}
 * @see {@link windowToggle}
 * @see {@link windowWhen}
 * @see {@link bufferCount}
 *
 * @param windowSize The maximum number of values emitted by each window.
 * @param startWindowEvery Interval at which to start a new window. For example
 * if `startWindowEvery` is `2`, then a new window will be started on every
 * other value from the source. A new window is started at the beginning of the
 * source by default.
 * @return A function that returns an Observable of windows, which in turn are
 * Observable of values.
 */
export function windowCount<T>(windowSize: number, startWindowEvery: number = 0): OperatorFunction<T, Observable<T>> {
  const startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;

  return operate((source, subscriber) => {
    let windows = [new Subject<T>()];
    let starts: number[] = [];
    let count = 0;

    // Open the first window.
    subscriber.next(windows[0].asObservable());

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // Emit the value through all current windows.
          // We don't need to create a new window yet, we
          // do that as soon as we close one.
          for (const window of windows) {
            window.next(value);
          }
          // Here we're using the size of the window array to figure
          // out if the oldest window has emitted enough values. We can do this
          // because the size of the window array is a function of the values
          // seen by the subscription. If it's time to close it, we complete
          // it and remove it.
          const c = count - windowSize + 1;
          if (c >= 0 && c % startEvery === 0) {
            windows.shift()!.complete();
          }

          // Look to see if the next count tells us it's time to open a new window.
          // TODO: We need to figure out if this really makes sense. We're technically
          // emitting windows *before* we have a value to emit them for. It's probably
          // more expected that we should be emitting the window when the start
          // count is reached -- not before.
          if (++count % startEvery === 0) {
            const window = new Subject<T>();
            windows.push(window);
            subscriber.next(window.asObservable());
          }
        },
        () => {
          while (windows.length > 0) {
            windows.shift()!.complete();
          }
          subscriber.complete();
        },
        (err) => {
          while (windows.length > 0) {
            windows.shift()!.error(err);
          }
          subscriber.error(err);
        },
        () => {
          starts = null!;
          windows = null!;
        }
      )
    );
  });
}
5ҾxQimport { Subject } from '../Subject';
import { asyncScheduler } from '../scheduler/async';
import { Observable } from '../Observable';
import { Subscription } from '../Subscription';
import { Observer, OperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
import { popScheduler } from '../util/args';
import { executeSchedule } from '../util/executeSchedule';

export function windowTime<T>(windowTimeSpan: number, scheduler?: SchedulerLike): OperatorFunction<T, Observable<T>>;
export function windowTime<T>(
  windowTimeSpan: number,
  windowCreationInterval: number,
  scheduler?: SchedulerLike
): OperatorFunction<T, Observable<T>>;
export function windowTime<T>(
  windowTimeSpan: number,
  windowCreationInterval: number | null | void,
  maxWindowSize: number,
  scheduler?: SchedulerLike
): OperatorFunction<T, Observable<T>>;

/**
 * Branch out the source Observable values as a nested Observable periodically
 * in time.
 *
 * <span class="informal">It's like {@link bufferTime}, but emits a nested
 * Observable instead of an array.</span>
 *
 * ![](windowTime.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable starts a new window periodically, as
 * determined by the `windowCreationInterval` argument. It emits each window
 * after a fixed timespan, specified by the `windowTimeSpan` argument. When the
 * source Observable completes or encounters an error, the output Observable
 * emits the current window and propagates the notification from the source
 * Observable. If `windowCreationInterval` is not provided, the output
 * Observable starts a new window when the previous window of duration
 * `windowTimeSpan` completes. If `maxWindowCount` is provided, each window
 * will emit at most fixed number of values. Window will complete immediately
 * after emitting last value and next one still will open as specified by
 * `windowTimeSpan` and `windowCreationInterval` arguments.
 *
 * ## Examples
 *
 * In every window of 1 second each, emit at most 2 click events
 *
 * ```ts
 * import { fromEvent, windowTime, map, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowTime(1000),
 *   map(win => win.pipe(take(2))), // take at most 2 emissions from each window
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Every 5 seconds start a window 1 second long, and emit at most 2 click events per window
 *
 * ```ts
 * import { fromEvent, windowTime, map, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowTime(1000, 5000),
 *   map(win => win.pipe(take(2))), // take at most 2 emissions from each window
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Same as example above but with `maxWindowCount` instead of `take`
 *
 * ```ts
 * import { fromEvent, windowTime, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowTime(1000, 5000, 2), // take at most 2 emissions from each window
 *   mergeAll()                 // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link window}
 * @see {@link windowCount}
 * @see {@link windowToggle}
 * @see {@link windowWhen}
 * @see {@link bufferTime}
 *
 * @param windowTimeSpan The amount of time, in milliseconds, to fill each window.
 * @param windowCreationInterval The interval at which to start new
 * windows.
 * @param maxWindowSize Max number of
 * values each window can emit before completion.
 * @param scheduler The scheduler on which to schedule the
 * intervals that determine window boundaries.
 * @return A function that returns an Observable of windows, which in turn are
 * Observables.
 */
export function windowTime<T>(windowTimeSpan: number, ...otherArgs: any[]): OperatorFunction<T, Observable<T>> {
  const scheduler = popScheduler(otherArgs) ?? asyncScheduler;
  const windowCreationInterval = (otherArgs[0] as number) ?? null;
  const maxWindowSize = (otherArgs[1] as number) || Infinity;

  return operate((source, subscriber) => {
    // The active windows, their related subscriptions, and removal functions.
    let windowRecords: WindowRecord<T>[] | null = [];
    // If true, it means that every time we close a window, we want to start a new window.
    // This is only really used for when *just* the time span is passed.
    let restartOnClose = false;

    const closeWindow = (record: { window: Subject<T>; subs: Subscription }) => {
      const { window, subs } = record;
      window.complete();
      subs.unsubscribe();
      arrRemove(windowRecords, record);
      restartOnClose && startWindow();
    };

    /**
     * Called every time we start a new window. This also does
     * the work of scheduling the job to close the window.
     */
    const startWindow = () => {
      if (windowRecords) {
        const subs = new Subscription();
        subscriber.add(subs);
        const window = new Subject<T>();
        const record = {
          window,
          subs,
          seen: 0,
        };
        windowRecords.push(record);
        subscriber.next(window.asObservable());
        executeSchedule(subs, scheduler, () => closeWindow(record), windowTimeSpan);
      }
    };

    if (windowCreationInterval !== null && windowCreationInterval >= 0) {
      // The user passed both a windowTimeSpan (required), and a creation interval
      // That means we need to start new window on the interval, and those windows need
      // to wait the required time span before completing.
      executeSchedule(subscriber, scheduler, startWindow, windowCreationInterval, true);
    } else {
      restartOnClose = true;
    }

    startWindow();

    /**
     * We need to loop over a copy of the window records several times in this operator.
     * This is to save bytes over the wire more than anything.
     * The reason we copy the array is that reentrant code could mutate the array while
     * we are iterating over it.
     */
    const loop = (cb: (record: WindowRecord<T>) => void) => windowRecords!.slice().forEach(cb);

    /**
     * Used to notify all of the windows and the subscriber in the same way
     * in the error and complete handlers.
     */
    const terminate = (cb: (consumer: Observer<any>) => void) => {
      loop(({ window }) => cb(window));
      cb(subscriber);
      subscriber.unsubscribe();
    };

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // Notify all windows of the value.
          loop((record) => {
            record.window.next(value);
            // If the window is over the max size, we need to close it.
            maxWindowSize <= ++record.seen && closeWindow(record);
          });
        },
        // Complete the windows and the downstream subscriber and clean up.
        () => terminate((consumer) => consumer.complete()),
        // Notify the windows and the downstream subscriber of the error and clean up.
        (err) => terminate((consumer) => consumer.error(err))
      )
    );

    // Additional finalization. This will be called when the
    // destination tears down. Other finalizations are registered implicitly
    // above via subscription.
    return () => {
      // Ensure that the buffer is released.
      windowRecords = null!;
    };
  });
}

interface WindowRecord<T> {
  seen: number;
  window: Subject<T>;
  subs: Subscription;
}
H-Nx0import { Subscriber } from '../Subscriber';
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { ObservableInput, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * Branch out the source Observable values as a nested Observable using a
 * factory function of closing Observables to determine when to start a new
 * window.
 *
 * <span class="informal">It's like {@link bufferWhen}, but emits a nested
 * Observable instead of an array.</span>
 *
 * ![](windowWhen.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable emits connected, non-overlapping windows.
 * It emits the current window and opens a new one whenever the Observable
 * produced by the specified `closingSelector` function emits an item. The first
 * window is opened immediately when subscribing to the output Observable.
 *
 * ## Example
 *
 * Emit only the first two clicks events in every window of [1-5] random seconds
 *
 * ```ts
 * import { fromEvent, windowWhen, interval, map, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowWhen(() => interval(1000 + Math.random() * 4000)),
 *   map(win => win.pipe(take(2))), // take at most 2 emissions from each window
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link window}
 * @see {@link windowCount}
 * @see {@link windowTime}
 * @see {@link windowToggle}
 * @see {@link bufferWhen}
 *
 * @param closingSelector A function that takes no arguments and returns an
 * {@link ObservableInput} (that gets converted to Observable) that signals
 * (on either `next` or `complete`) when to close the previous window and
 * start a new one.
 * @return A function that returns an Observable of windows, which in turn are
 * Observables.
 */
export function windowWhen<T>(closingSelector: () => ObservableInput<any>): OperatorFunction<T, Observable<T>> {
  return operate((source, subscriber) => {
    let window: Subject<T> | null;
    let closingSubscriber: Subscriber<any> | undefined;

    /**
     * When we get an error, we have to notify both the
     * destination subscriber and the window.
     */
    const handleError = (err: any) => {
      window!.error(err);
      subscriber.error(err);
    };

    /**
     * Called every time we need to open a window.
     * Recursive, as it will start the closing notifier, which
     * inevitably *should* call openWindow -- but may not if
     * it is a "never" observable.
     */
    const openWindow = () => {
      // We need to clean up our closing subscription,
      // we only cared about the first next or complete notification.
      closingSubscriber?.unsubscribe();

      // Close our window before starting a new one.
      window?.complete();

      // Start the new window.
      window = new Subject<T>();
      subscriber.next(window.asObservable());

      // Get our closing notifier.
      let closingNotifier: Observable<any>;
      try {
        closingNotifier = innerFrom(closingSelector());
      } catch (err) {
        handleError(err);
        return;
      }

      // Subscribe to the closing notifier, be sure
      // to capture the subscriber (aka Subscription)
      // so we can clean it up when we close the window
      // and open a new one.
      closingNotifier.subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openWindow, openWindow, handleError)));
    };

    // Start the first window.
    openWindow();

    // Subscribe to the source
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => window!.next(value),
        () => {
          // The source completed, close the window and complete.
          window!.complete();
          subscriber.complete();
        },
        handleError,
        () => {
          // Be sure to clean up our closing subscription
          // when this tears down.
          closingSubscriber?.unsubscribe();
          window = null!;
        }
      )
    );
  });
}
l,x
import { OperatorFunction, ObservableInputTuple } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { identity } from '../util/identity';
import { noop } from '../util/noop';
import { popResultSelector } from '../util/args';

export function withLatestFrom<T, O extends unknown[]>(...inputs: [...ObservableInputTuple<O>]): OperatorFunction<T, [T, ...O]>;

export function withLatestFrom<T, O extends unknown[], R>(
  ...inputs: [...ObservableInputTuple<O>, (...value: [T, ...O]) => R]
): OperatorFunction<T, R>;

/**
 * Combines the source Observable with other Observables to create an Observable
 * whose values are calculated from the latest values of each, only when the
 * source emits.
 *
 * <span class="informal">Whenever the source Observable emits a value, it
 * computes a formula using that value plus the latest values from other input
 * Observables, then emits the output of that formula.</span>
 *
 * ![](withLatestFrom.png)
 *
 * `withLatestFrom` combines each value from the source Observable (the
 * instance) with the latest values from the other input Observables only when
 * the source emits a value, optionally using a `project` function to determine
 * the value to be emitted on the output Observable. All input Observables must
 * emit at least one value before the output Observable will emit a value.
 *
 * ## Example
 *
 * On every click event, emit an array with the latest timer event plus the click event
 *
 * ```ts
 * import { fromEvent, interval, withLatestFrom } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const timer = interval(1000);
 * const result = clicks.pipe(withLatestFrom(timer));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link combineLatest}
 *
 * @param inputs An input Observable to combine with the source Observable. More
 * than one input Observables may be given as argument. If the last parameter is
 * a function, it will be used as a projection function for combining values
 * together. When the function is called, it receives all values in order of the
 * Observables passed, where the first parameter is a value from the source
 * Observable. (e.g.
 * `a.pipe(withLatestFrom(b, c), map(([a1, b1, c1]) => a1 + b1 + c1))`). If this
 * is not passed, arrays will be emitted on the output Observable.
 * @return A function that returns an Observable of projected values from the
 * most recent values from each input Observable, or an array of the most
 * recent values from each input Observable.
 */
export function withLatestFrom<T, R>(...inputs: any[]): OperatorFunction<T, R | any[]> {
  const project = popResultSelector(inputs) as ((...args: any[]) => R) | undefined;

  return operate((source, subscriber) => {
    const len = inputs.length;
    const otherValues = new Array(len);
    // An array of whether or not the other sources have emitted. Matched with them by index.
    // TODO: At somepoint, we should investigate the performance implications here, and look
    // into using a `Set()` and checking the `size` to see if we're ready.
    let hasValue = inputs.map(() => false);
    // Flipped true when we have at least one value from all other sources and
    // we are ready to start emitting values.
    let ready = false;

    // Other sources. Note that here we are not checking `subscriber.closed`,
    // this causes all inputs to be subscribed to, even if nothing can be emitted
    // from them. This is an important distinction because subscription constitutes
    // a side-effect.
    for (let i = 0; i < len; i++) {
      innerFrom(inputs[i]).subscribe(
        createOperatorSubscriber(
          subscriber,
          (value) => {
            otherValues[i] = value;
            if (!ready && !hasValue[i]) {
              // If we're not ready yet, flag to show this observable has emitted.
              hasValue[i] = true;
              // Intentionally terse code.
              // If all of our other observables have emitted, set `ready` to `true`,
              // so we know we can start emitting values, then clean up the `hasValue` array,
              // because we don't need it anymore.
              (ready = hasValue.every(identity)) && (hasValue = null!);
            }
          },
          // Completing one of the other sources has
          // no bearing on the completion of our result.
          noop
        )
      );
    }

    // Source subscription
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        if (ready) {
          // We have at least one value from the other sources. Go ahead and emit.
          const values = [value, ...otherValues];
          subscriber.next(project ? project(...values) : values);
        }
      })
    );
  });
}
<Ե[xJimport { zip as zipStatic } from '../observable/zip';
import { ObservableInput, ObservableInputTuple, OperatorFunction, Cons } from '../types';
import { operate } from '../util/lift';

/** @deprecated Replaced with {@link zipWith}. Will be removed in v8. */
export function zip<T, A extends readonly unknown[]>(otherInputs: [...ObservableInputTuple<A>]): OperatorFunction<T, Cons<T, A>>;
/** @deprecated Replaced with {@link zipWith}. Will be removed in v8. */
export function zip<T, A extends readonly unknown[], R>(
  otherInputsAndProject: [...ObservableInputTuple<A>],
  project: (...values: Cons<T, A>) => R
): OperatorFunction<T, R>;
/** @deprecated Replaced with {@link zipWith}. Will be removed in v8. */
export function zip<T, A extends readonly unknown[]>(...otherInputs: [...ObservableInputTuple<A>]): OperatorFunction<T, Cons<T, A>>;
/** @deprecated Replaced with {@link zipWith}. Will be removed in v8. */
export function zip<T, A extends readonly unknown[], R>(
  ...otherInputsAndProject: [...ObservableInputTuple<A>, (...values: Cons<T, A>) => R]
): OperatorFunction<T, R>;

/**
 * @deprecated Replaced with {@link zipWith}. Will be removed in v8.
 */
export function zip<T, R>(...sources: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): OperatorFunction<T, any> {
  return operate((source, subscriber) => {
    zipStatic(source as ObservableInput<any>, ...(sources as Array<ObservableInput<any>>)).subscribe(subscriber);
  });
}
\1bx'import { ObservableInputTuple, OperatorFunction, Cons } from '../types';
import { zip } from './zip';

/**
 * Subscribes to the source, and the observable inputs provided as arguments, and combines their values, by index, into arrays.
 *
 * What is meant by "combine by index": The first value from each will be made into a single array, then emitted,
 * then the second value from each will be combined into a single array and emitted, then the third value
 * from each will be combined into a single array and emitted, and so on.
 *
 * This will continue until it is no longer able to combine values of the same index into an array.
 *
 * After the last value from any one completed source is emitted in an array, the resulting observable will complete,
 * as there is no way to continue "zipping" values together by index.
 *
 * Use-cases for this operator are limited. There are memory concerns if one of the streams is emitting
 * values at a much faster rate than the others. Usage should likely be limited to streams that emit
 * at a similar pace, or finite streams of known length.
 *
 * In many cases, authors want `combineLatestWith` and not `zipWith`.
 *
 * @param otherInputs other observable inputs to collate values from.
 * @return A function that returns an Observable that emits items by index
 * combined from the source Observable and provided Observables, in form of an
 * array.
 */
export function zipWith<T, A extends readonly unknown[]>(...otherInputs: [...ObservableInputTuple<A>]): OperatorFunction<T, Cons<T, A>> {
  return zip(...otherInputs);
}
6$;xJimport { Observable } from '../Observable';
import { SchedulerLike } from '../types';

export function scheduleArray<T>(input: ArrayLike<T>, scheduler: SchedulerLike) {
  return new Observable<T>((subscriber) => {
    // The current array index.
    let i = 0;
    // Start iterating over the array like on a schedule.
    return scheduler.schedule(function () {
      if (i === input.length) {
        // If we have hit the end of the array like in the
        // previous job, we can complete.
        subscriber.complete();
      } else {
        // Otherwise let's next the value at the current index,
        // then increment our index.
        subscriber.next(input[i++]);
        // If the last emission didn't cause us to close the subscriber
        // (via take or some side effect), reschedule the job and we'll
        // make another pass.
        if (!subscriber.closed) {
          this.schedule();
        }
      }
    });
  });
}
)&28xyimport { SchedulerLike } from '../types';
import { Observable } from '../Observable';
import { executeSchedule } from '../util/executeSchedule';

export function scheduleAsyncIterable<T>(input: AsyncIterable<T>, scheduler: SchedulerLike) {
  if (!input) {
    throw new Error('Iterable cannot be null');
  }
  return new Observable<T>((subscriber) => {
    executeSchedule(subscriber, scheduler, () => {
      const iterator = input[Symbol.asyncIterator]();
      executeSchedule(
        subscriber,
        scheduler,
        () => {
          iterator.next().then((result) => {
            if (result.done) {
              // This will remove the subscriptions from
              // the parent subscription.
              subscriber.complete();
            } else {
              subscriber.next(result.value);
            }
          });
        },
        0,
        true
      );
    });
  });
}
q踈xwimport { Observable } from '../Observable';
import { SchedulerLike } from '../types';
import { iterator as Symbol_iterator } from '../symbol/iterator';
import { isFunction } from '../util/isFunction';
import { executeSchedule } from '../util/executeSchedule';

/**
 * Used in {@link scheduled} to create an observable from an Iterable.
 * @param input The iterable to create an observable from
 * @param scheduler The scheduler to use
 */
export function scheduleIterable<T>(input: Iterable<T>, scheduler: SchedulerLike) {
  return new Observable<T>((subscriber) => {
    let iterator: Iterator<T, T>;

    // Schedule the initial creation of the iterator from
    // the iterable. This is so the code in the iterable is
    // not called until the scheduled job fires.
    executeSchedule(subscriber, scheduler, () => {
      // Create the iterator.
      iterator = (input as any)[Symbol_iterator]();

      executeSchedule(
        subscriber,
        scheduler,
        () => {
          let value: T;
          let done: boolean | undefined;
          try {
            // Pull the value out of the iterator
            ({ value, done } = iterator.next());
          } catch (err) {
            // We got an error while pulling from the iterator
            subscriber.error(err);
            return;
          }

          if (done) {
            // If it is "done" we just complete. This mimics the
            // behavior of JavaScript's `for..of` consumption of
            // iterables, which will not emit the value from an iterator
            // result of `{ done: true: value: 'here' }`.
            subscriber.complete();
          } else {
            // The iterable is not done, emit the value.
            subscriber.next(value);
          }
        },
        0,
        true
      );
    });

    // During finalization, if we see this iterator has a `return` method,
    // then we know it is a Generator, and not just an Iterator. So we call
    // the `return()` function. This will ensure that any `finally { }` blocks
    // inside of the generator we can hit will be hit properly.
    return () => isFunction(iterator?.return) && iterator.return();
  });
}
xqimport { innerFrom } from '../observable/innerFrom';
import { observeOn } from '../operators/observeOn';
import { subscribeOn } from '../operators/subscribeOn';
import { InteropObservable, SchedulerLike } from '../types';

export function scheduleObservable<T>(input: InteropObservable<T>, scheduler: SchedulerLike) {
  return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
}
X/˲xrimport { innerFrom } from '../observable/innerFrom';
import { observeOn } from '../operators/observeOn';
import { subscribeOn } from '../operators/subscribeOn';
import { SchedulerLike } from '../types';

export function schedulePromise<T>(input: PromiseLike<T>, scheduler: SchedulerLike) {
  return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
}
x1import { SchedulerLike, ReadableStreamLike } from '../types';
import { Observable } from '../Observable';
import { scheduleAsyncIterable } from './scheduleAsyncIterable';
import { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';

export function scheduleReadableStreamLike<T>(input: ReadableStreamLike<T>, scheduler: SchedulerLike): Observable<T> {
  return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);
}
;}x#import { scheduleObservable } from './scheduleObservable';
import { schedulePromise } from './schedulePromise';
import { scheduleArray } from './scheduleArray';
import { scheduleIterable } from './scheduleIterable';
import { scheduleAsyncIterable } from './scheduleAsyncIterable';
import { isInteropObservable } from '../util/isInteropObservable';
import { isPromise } from '../util/isPromise';
import { isArrayLike } from '../util/isArrayLike';
import { isIterable } from '../util/isIterable';
import { ObservableInput, SchedulerLike } from '../types';
import { Observable } from '../Observable';
import { isAsyncIterable } from '../util/isAsyncIterable';
import { createInvalidObservableTypeError } from '../util/throwUnobservableError';
import { isReadableStreamLike } from '../util/isReadableStreamLike';
import { scheduleReadableStreamLike } from './scheduleReadableStreamLike';

/**
 * Converts from a common {@link ObservableInput} type to an observable where subscription and emissions
 * are scheduled on the provided scheduler.
 *
 * @see {@link from}
 * @see {@link of}
 *
 * @param input The observable, array, promise, iterable, etc you would like to schedule
 * @param scheduler The scheduler to use to schedule the subscription and emissions from
 * the returned observable.
 */
export function scheduled<T>(input: ObservableInput<T>, scheduler: SchedulerLike): Observable<T> {
  if (input != null) {
    if (isInteropObservable(input)) {
      return scheduleObservable(input, scheduler);
    }
    if (isArrayLike(input)) {
      return scheduleArray(input, scheduler);
    }
    if (isPromise(input)) {
      return schedulePromise(input, scheduler);
    }
    if (isAsyncIterable(input)) {
      return scheduleAsyncIterable(input, scheduler);
    }
    if (isIterable(input)) {
      return scheduleIterable(input, scheduler);
    }
    if (isReadableStreamLike(input)) {
      return scheduleReadableStreamLike(input, scheduler);
    }
  }
  throw createInvalidObservableTypeError(input);
}
9pȷSx7import { Scheduler } from '../Scheduler';
import { Subscription } from '../Subscription';
import { SchedulerAction } from '../types';

/**
 * A unit of work to be executed in a `scheduler`. An action is typically
 * created from within a {@link SchedulerLike} and an RxJS user does not need to concern
 * themselves about creating and manipulating an Action.
 *
 * ```ts
 * class Action<T> extends Subscription {
 *   new (scheduler: Scheduler, work: (state?: T) => void);
 *   schedule(state?: T, delay: number = 0): Subscription;
 * }
 * ```
 */
export class Action<T> extends Subscription {
  constructor(scheduler: Scheduler, work: (this: SchedulerAction<T>, state?: T) => void) {
    super();
  }
  /**
   * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed
   * some context object, `state`. May happen at some point in the future,
   * according to the `delay` parameter, if specified.
   * @param state Some contextual data that the `work` function uses when called by the
   * Scheduler.
   * @param delay Time to wait before executing the work, where the time unit is implicit
   * and defined by the Scheduler.
   * @return A subscription in order to be able to unsubscribe the scheduled work.
   */
  public schedule(state?: T, delay: number = 0): Subscription {
    return this;
  }
}
V+x[import { AsyncAction } from './AsyncAction';
import { AsapScheduler } from './AsapScheduler';
import { SchedulerAction } from '../types';
import { immediateProvider } from './immediateProvider';
import { TimerHandle } from './timerHandle';

export class AsapAction<T> extends AsyncAction<T> {
  constructor(protected scheduler: AsapScheduler, protected work: (this: SchedulerAction<T>, state?: T) => void) {
    super(scheduler, work);
  }

  protected requestAsyncId(scheduler: AsapScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {
    // If delay is greater than 0, request as an async action.
    if (delay !== null && delay > 0) {
      return super.requestAsyncId(scheduler, id, delay);
    }
    // Push the action to the end of the scheduler queue.
    scheduler.actions.push(this);
    // If a microtask has already been scheduled, don't schedule another
    // one. If a microtask hasn't been scheduled yet, schedule one now. Return
    // the current scheduled microtask id.
    return scheduler._scheduled || (scheduler._scheduled = immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));
  }

  protected recycleAsyncId(scheduler: AsapScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {
    // If delay exists and is greater than 0, or if the delay is null (the
    // action wasn't rescheduled) but was originally scheduled as an async
    // action, then recycle as an async action.
    if (delay != null ? delay > 0 : this.delay > 0) {
      return super.recycleAsyncId(scheduler, id, delay);
    }
    // If the scheduler queue has no remaining actions with the same async id,
    // cancel the requested microtask and set the scheduled flag to undefined
    // so the next AsapAction will request its own.
    const { actions } = scheduler;
    if (id != null && actions[actions.length - 1]?.id !== id) {
      immediateProvider.clearImmediate(id);
      if (scheduler._scheduled === id) {
        scheduler._scheduled = undefined;
      }
    }
    // Return undefined so the action knows to request a new async id if it's rescheduled.
    return undefined;
  }
}
Y%ix^7/nimationFrameScheduler } from './AnimationFrameRA.animationFrameProvider } from './animationFramHnimationFrameGnimationFrameLnimationFrame= n animation frame has already been requested, don't request another
    // one. If an animation frame hasn't been requested yet@, request one. Return
    // the current animation frame request@CanimationFrameProvider.requestAnimationFrame(() => scheduler.flush(`:nimationFrameanimation frame,
    // undefined so the next AnimationFrameVid ===*3;animationFrameProvider.cancelAnimationFrame(id as number);
,ykUxZimport { AsyncAction } from './AsyncAction';
import { AsyncScheduler } from './AsyncScheduler';

export class AsapScheduler extends AsyncScheduler {
  public flush(action?: AsyncAction<any>): void {
    this._active = true;
    // The async id that effects a call to flush is stored in _scheduled.
    // Before executing an action, it's necessary to check the action's async
    // id to determine whether it's supposed to be executed in the current
    // flush.
    // Previous implementations of this method used a count to determine this,
    // but that was unsound, as actions that are unsubscribed - i.e. cancelled -
    // are removed from the actions array and that can shift actions that are
    // scheduled to be executed in a subsequent flush into positions at which
    // they are executed within the current flush.
    const flushId = this._scheduled;
    this._scheduled = undefined;

    const { actions } = this;
    let error: any;
    action = action || actions.shift()!;

    do {
      if ((error = action.execute(action.state, action.delay))) {
        break;
      }
    } while ((action = actions[0]) && action.id === flushId && actions.shift());

    this._active = false;

    if (error) {
      while ((action = actions[0]) && action.id === flushId && actions.shift()) {
        action.unsubscribe();
      }
      throw error;
    }
  }
}
9gxx 
onimationFramerLlet flushId;
    if (action) {
      flushId = action.id;
    } else {
     I g    }qW$xpimport { Action } from './Action';
import { SchedulerAction } from '../types';
import { Subscription } from '../Subscription';
import { AsyncScheduler } from './AsyncScheduler';
import { intervalProvider } from './intervalProvider';
import { arrRemove } from '../util/arrRemove';
import { TimerHandle } from './timerHandle';

export class AsyncAction<T> extends Action<T> {
  public id: TimerHandle | undefined;
  public state?: T;
  // @ts-ignore: Property has no initializer and is not definitely assigned
  public delay: number;
  protected pending: boolean = false;

  constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction<T>, state?: T) => void) {
    super(scheduler, work);
  }

  public schedule(state?: T, delay: number = 0): Subscription {
    if (this.closed) {
      return this;
    }

    // Always replace the current state with the new state.
    this.state = state;

    const id = this.id;
    const scheduler = this.scheduler;

    //
    // Important implementation note:
    //
    // Actions only execute once by default, unless rescheduled from within the
    // scheduled callback. This allows us to implement single and repeat
    // actions via the same code path, without adding API surface area, as well
    // as mimic traditional recursion but across asynchronous boundaries.
    //
    // However, JS runtimes and timers distinguish between intervals achieved by
    // serial `setTimeout` calls vs. a single `setInterval` call. An interval of
    // serial `setTimeout` calls can be individually delayed, which delays
    // scheduling the next `setTimeout`, and so on. `setInterval` attempts to
    // guarantee the interval callback will be invoked more precisely to the
    // interval period, regardless of load.
    //
    // Therefore, we use `setInterval` to schedule single and repeat actions.
    // If the action reschedules itself with the same delay, the interval is not
    // canceled. If the action doesn't reschedule, or reschedules with a
    // different delay, the interval will be canceled after scheduled callback
    // execution.
    //
    if (id != null) {
      this.id = this.recycleAsyncId(scheduler, id, delay);
    }

    // Set the pending flag indicating that this action has been scheduled, or
    // has recursively rescheduled itself.
    this.pending = true;

    this.delay = delay;
    // If this action has already an async Id, don't request a new one.
    this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);

    return this;
  }

  protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {
    return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);
  }

  protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {
    // If this action is rescheduled with the same delay time, don't clear the interval id.
    if (delay != null && this.delay === delay && this.pending === false) {
      return id;
    }
    // Otherwise, if the action's delay time is different from the current delay,
    // or the action has been rescheduled before it's executed, clear the interval id
    if (id != null) {
      intervalProvider.clearInterval(id);
    }

    return undefined;
  }

  /**
   * Immediately executes this action and the `work` it contains.
   */
  public execute(state: T, delay: number): any {
    if (this.closed) {
      return new Error('executing a cancelled action');
    }

    this.pending = false;
    const error = this._execute(state, delay);
    if (error) {
      return error;
    } else if (this.pending === false && this.id != null) {
      // Dequeue if the action didn't reschedule itself. Don't call
      // unsubscribe(), because the action could reschedule later.
      // For example:
      // ```
      // scheduler.schedule(function doWork(counter) {
      //   /* ... I'm a busy worker bee ... */
      //   var originalAction = this;
      //   /* wait 100ms before rescheduling the action */
      //   setTimeout(function () {
      //     originalAction.schedule(counter + 1);
      //   }, 100);
      // }, 1000);
      // ```
      this.id = this.recycleAsyncId(this.scheduler, this.id, null);
    }
  }

  protected _execute(state: T, _delay: number): any {
    let errored: boolean = false;
    let errorValue: any;
    try {
      this.work(state);
    } catch (e) {
      errored = true;
      // HACK: Since code elsewhere is relying on the "truthiness" of the
      // return here, we can't have it return "" or 0 or false.
      // TODO: Clean this up when we refactor schedulers mid-version-8 or so.
      errorValue = e ? e : new Error('Scheduled action threw falsy error');
    }
    if (errored) {
      this.unsubscribe();
      return errorValue;
    }
  }

  unsubscribe() {
    if (!this.closed) {
      const { id, scheduler } = this;
      const { actions } = scheduler;

      this.work = this.state = this.scheduler = null!;
      this.pending = false;

      arrRemove(actions, this);
      if (id != null) {
        this.id = this.recycleAsyncId(scheduler, id, null);
      }

      this.delay = null!;
      super.unsubscribe();
    }
  }
}
lRx$import { Scheduler } from '../Scheduler';
import { Action } from './Action';
import { AsyncAction } from './AsyncAction';
import { TimerHandle } from './timerHandle';

export class AsyncScheduler extends Scheduler {
  public actions: Array<AsyncAction<any>> = [];
  /**
   * A flag to indicate whether the Scheduler is currently executing a batch of
   * queued actions.
   * @internal
   */
  public _active: boolean = false;
  /**
   * An internal ID used to track the latest asynchronous task such as those
   * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and
   * others.
   * @internal
   */
  public _scheduled: TimerHandle | undefined;

  constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {
    super(SchedulerAction, now);
  }

  public flush(action: AsyncAction<any>): void {
    const { actions } = this;

    if (this._active) {
      actions.push(action);
      return;
    }

    let error: any;
    this._active = true;

    do {
      if ((error = action.execute(action.state, action.delay))) {
        break;
      }
    } while ((action = actions.shift()!)); // exhaust the scheduler queue

    this._active = false;

    if (error) {
      while ((action = actions.shift()!)) {
        action.unsubscribe();
      }
      throw error;
    }
  }
}
'9jxSimport { AsyncAction } from './AsyncAction';
import { Subscription } from '../Subscription';
import { QueueScheduler } from './QueueScheduler';
import { SchedulerAction } from '../types';
import { TimerHandle } from './timerHandle';

export class QueueAction<T> extends AsyncAction<T> {
  constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction<T>, state?: T) => void) {
    super(scheduler, work);
  }

  public schedule(state?: T, delay: number = 0): Subscription {
    if (delay > 0) {
      return super.schedule(state, delay);
    }
    this.delay = delay;
    this.state = state;
    this.scheduler.flush(this);
    return this;
  }

  public execute(state: T, delay: number): any {
    return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);
  }

  protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {
    // If delay exists and is greater than 0, or if the delay is null (the
    // action wasn't rescheduled) but was originally scheduled as an async
    // action, then recycle as an async action.

    if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
      return super.requestAsyncId(scheduler, id, delay);
    }

    // Otherwise flush the scheduler starting with this action.
    scheduler.flush(this);

    // HACK: In the past, this was returning `void`. However, `void` isn't a valid
    // `TimerHandle`, and generally the return value here isn't really used. So the
    // compromise is to return `0` which is both "falsy" and a valid `TimerHandle`,
    // as opposed to refactoring every other instanceo of `requestAsyncId`.
    return 0;
  }
}
i,6xk import { AsyncScheduler } from './AsyncScheduler';

export class QueueScheduler extends AsyncScheduler {
}
2*&xdimport { AsyncAction } from './AsyncAction';
import { Subscription } from '../Subscription';
import { AsyncScheduler } from './AsyncScheduler';
import { SchedulerAction } from '../types';
import { TimerHandle } from './timerHandle';

export class VirtualTimeScheduler extends AsyncScheduler {
  /** @deprecated Not used in VirtualTimeScheduler directly. Will be removed in v8. */
  static frameTimeFactor = 10;

  /**
   * The current frame for the state of the virtual scheduler instance. The difference
   * between two "frames" is synonymous with the passage of "virtual time units". So if
   * you record `scheduler.frame` to be `1`, then later, observe `scheduler.frame` to be at `11`,
   * that means `10` virtual time units have passed.
   */
  public frame: number = 0;

  /**
   * Used internally to examine the current virtual action index being processed.
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  public index: number = -1;

  /**
   * This creates an instance of a `VirtualTimeScheduler`. Experts only. The signature of
   * this constructor is likely to change in the long run.
   *
   * @param schedulerActionCtor The type of Action to initialize when initializing actions during scheduling.
   * @param maxFrames The maximum number of frames to process before stopping. Used to prevent endless flush cycles.
   */
  constructor(schedulerActionCtor: typeof AsyncAction = VirtualAction as any, public maxFrames: number = Infinity) {
    super(schedulerActionCtor, () => this.frame);
  }

  /**
   * Prompt the Scheduler to execute all of its queued actions, therefore
   * clearing its queue.
   */
  public flush(): void {
    const { actions, maxFrames } = this;
    let error: any;
    let action: AsyncAction<any> | undefined;

    while ((action = actions[0]) && action.delay <= maxFrames) {
      actions.shift();
      this.frame = action.delay;

      if ((error = action.execute(action.state, action.delay))) {
        break;
      }
    }

    if (error) {
      while ((action = actions.shift())) {
        action.unsubscribe();
      }
      throw error;
    }
  }
}

export class VirtualAction<T> extends AsyncAction<T> {
  protected active: boolean = true;

  constructor(
    protected scheduler: VirtualTimeScheduler,
    protected work: (this: SchedulerAction<T>, state?: T) => void,
    protected index: number = (scheduler.index += 1)
  ) {
    super(scheduler, work);
    this.index = scheduler.index = index;
  }

  public schedule(state?: T, delay: number = 0): Subscription {
    if (Number.isFinite(delay)) {
      if (!this.id) {
        return super.schedule(state, delay);
      }
      this.active = false;
      // If an action is rescheduled, we save allocations by mutating its state,
      // pushing it to the end of the scheduler queue, and recycling the action.
      // But since the VirtualTimeScheduler is used for testing, VirtualActions
      // must be immutable so they can be inspected later.
      const action = new VirtualAction(this.scheduler, this.work);
      this.add(action);
      return action.schedule(state, delay);
    } else {
      // If someone schedules something with Infinity, it'll never happen. So we
      // don't even schedule it.
      return Subscription.EMPTY;
    }
  }

  protected requestAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay: number = 0): TimerHandle {
    this.delay = scheduler.frame + delay;
    const { actions } = scheduler;
    actions.push(this);
    (actions as Array<VirtualAction<T>>).sort(VirtualAction.sortActions);
    return 1;
  }

  protected recycleAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay: number = 0): TimerHandle | undefined {
    return undefined;
  }

  protected _execute(state: T, delay: number): any {
    if (this.active === true) {
      return super._execute(state, delay);
    }
  }

  private static sortActions<T>(a: VirtualAction<T>, b: VirtualAction<T>) {
    if (a.delay === b.delay) {
      if (a.index === b.index) {
        return 0;
      } else if (a.index > b.index) {
        return 1;
      } else {
        return -1;
      }
    } else if (a.delay > b.delay) {
      return 1;
    } else {
      return -1;
    }
  }
}
cXx~import { AnimationFrameAction } from './AnimationFrameAction';
import { AnimationFrameScheduler } from './AnimationFrameScheduler';

/**
 *
 * Animation Frame Scheduler
 *
 * <span class="informal">Perform task when `window.requestAnimationFrame` would fire</span>
 *
 * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler
 * behaviour.
 *
 * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.
 * It makes sure scheduled task will happen just before next browser content repaint,
 * thus performing animations as efficiently as possible.
 *
 * ## Example
 * Schedule div height animation
 * ```ts
 * // html: <div style="background: #0ff;"></div>
 * import { animationFrameScheduler } from 'rxjs';
 *
 * const div = document.querySelector('div');
 *
 * animationFrameScheduler.schedule(function(height) {
 *   div.style.height = height + "px";
 *
 *   this.schedule(height + 1);  // `this` references currently executing Action,
 *                               // which we reschedule with new state
 * }, 0, 0);
 *
 * // You will see a div element growing in height
 * ```
 */

export const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);

/**
 * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.
 */
export const animationFrame = animationFrameScheduler;
`D:ex]import { Subscription } from '../Subscription';

interface AnimationFrameProvider {
  schedule(callback: FrameRequestCallback): Subscription;
  requestAnimationFrame: typeof requestAnimationFrame;
  cancelAnimationFrame: typeof cancelAnimationFrame;
  delegate:
    | {
        requestAnimationFrame: typeof requestAnimationFrame;
        cancelAnimationFrame: typeof cancelAnimationFrame;
      }
    | undefined;
}

export const animationFrameProvider: AnimationFrameProvider = {
  // When accessing the delegate, use the variable rather than `this` so that
  // the functions can be called without being bound to the provider.
  schedule(callback) {
    let request = requestAnimationFrame;
    let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;
    const { delegate } = animationFrameProvider;
    if (delegate) {
      request = delegate.requestAnimationFrame;
      cancel = delegate.cancelAnimationFrame;
    }
    const handle = request((timestamp) => {
      // Clear the cancel function. The request has been fulfilled, so
      // attempting to cancel the request upon unsubscription would be
      // pointless.
      cancel = undefined;
      callback(timestamp);
    });
    return new Subscription(() => cancel?.(handle));
  },
  requestAnimationFrame(...args) {
    const { delegate } = animationFrameProvider;
    return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);
  },
  cancelAnimationFrame(...args) {
    const { delegate } = animationFrameProvider;
    return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);
  },
  delegate: undefined,
};
͐)Ilx;import { AsapAction } from './AsapAction';
import { AsapScheduler } from './AsapScheduler';

/**
 *
 * Asap Scheduler
 *
 * <span class="informal">Perform task as fast as it can be performed asynchronously</span>
 *
 * `asap` scheduler behaves the same as {@link asyncScheduler} scheduler when you use it to delay task
 * in time. If however you set delay to `0`, `asap` will wait for current synchronously executing
 * code to end and then it will try to execute given task as fast as possible.
 *
 * `asap` scheduler will do its best to minimize time between end of currently executing code
 * and start of scheduled task. This makes it best candidate for performing so called "deferring".
 * Traditionally this was achieved by calling `setTimeout(deferredTask, 0)`, but that technique involves
 * some (although minimal) unwanted delay.
 *
 * Note that using `asap` scheduler does not necessarily mean that your task will be first to process
 * after currently executing code. In particular, if some task was also scheduled with `asap` before,
 * that task will execute first. That being said, if you need to schedule task asynchronously, but
 * as soon as possible, `asap` scheduler is your best bet.
 *
 * ## Example
 * Compare async and asap scheduler<
 * ```ts
 * import { asapScheduler, asyncScheduler } from 'rxjs';
 *
 * asyncScheduler.schedule(() => console.log('async')); // scheduling 'async' first...
 * asapScheduler.schedule(() => console.log('asap'));
 *
 * // Logs:
 * // "asap"
 * // "async"
 * // ... but 'asap' goes first!
 * ```
 */

export const asapScheduler = new AsapScheduler(AsapAction);

/**
 * @deprecated Renamed to {@link asapScheduler}. Will be removed in v8.
 */
export const asap = asapScheduler;
жMaximport { AsyncAction } from './AsyncAction';
import { AsyncScheduler } from './AsyncScheduler';

/**
 *
 * Async Scheduler
 *
 * <span class="informal">Schedule task as if you used setTimeout(task, duration)</span>
 *
 * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript
 * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating
 * in intervals.
 *
 * If you just want to "defer" task, that is to perform it right after currently
 * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),
 * better choice will be the {@link asapScheduler} scheduler.
 *
 * ## Examples
 * Use async scheduler to delay task
 * ```ts
 * import { asyncScheduler } from 'rxjs';
 *
 * const task = () => console.log('it works!');
 *
 * asyncScheduler.schedule(task, 2000);
 *
 * // After 2 seconds logs:
 * // "it works!"
 * ```
 *
 * Use async scheduler to repeat task in intervals
 * ```ts
 * import { asyncScheduler } from 'rxjs';
 *
 * function task(state) {
 *   console.log(state);
 *   this.schedule(state + 1, 1000); // `this` references currently executing Action,
 *                                   // which we reschedule with new state and delay
 * }
 *
 * asyncScheduler.schedule(task, 3000, 0);
 *
 * // Logs:
 * // 0 after 3s
 * // 1 after 4s
 * // 2 after 5s
 * // 3 after 6s
 * ```
 */

export const asyncScheduler = new AsyncScheduler(AsyncAction);

/**
 * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.
 */
export const async = asyncScheduler;
~x'import { TimestampProvider } from '../types';

interface PerformanceTimestampProvider extends TimestampProvider {
  delegate: TimestampProvider | undefined;
}

export const performanceTimestampProvider: PerformanceTimestampProvider = {
  now() {
    // Use the variable rather than `this` so that the function can be called
    // without being bound to the provider.
    return (performanceTimestampProvider.delegate || performance).now();
  },
  delegate: undefined,
};
V`ex; 9DatCjdateTimestampProvider: DatէdatDat)Bx!import { Immediate } from '../util/Immediate';
import type { TimerHandle } from './timerHandle';
const { setImmediate, clearImmediate } = Immediate;

type SetImmediateFunction = (handler: () => void, ...args: any[]) => TimerHandle;
type ClearImmediateFunction = (handle: TimerHandle) => void;

interface ImmediateProvider {
  setImmediate: SetImmediateFunction;
  clearImmediate: ClearImmediateFunction;
  delegate:
    | {
        setImmediate: SetImmediateFunction;
        clearImmediate: ClearImmediateFunction;
      }
    | undefined;
}

export const immediateProvider: ImmediateProvider = {
  // When accessing the delegate, use the variable rather than `this` so that
  // the functions can be called without being bound to the provider.
  setImmediate(...args) {
    const { delegate } = immediateProvider;
    return (delegate?.setImmediate || setImmediate)(...args);
  },
  clearImmediate(handle) {
    const { delegate } = immediateProvider;
    return (delegate?.clearImmediate || clearImmediate)(handle as any);
  },
  delegate: undefined,
};
'fBx'import type { TimerHandle } from './timerHandle';
type SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;
type ClearTimeoutFunction = (handle: TimerHandle) => void;

interface TimeoutProvider {
  setTimeout: SetTimeoutFunction;
  clearTimeout: ClearTimeoutFunction;
  delegate:
    | {
        setTimeout: SetTimeoutFunction;
        clearTimeout: ClearTimeoutFunction;
      }
    | undefined;
}

export const timeoutProvider: TimeoutProvider = {
  // When accessing the delegate, use the variable rather than `this` so that
  // the functions can be called without being bound to the provider.
  setTimeout(handler: () => void, timeout?: number, ...args) {
    const { delegate } = timeoutProvider;
    if (delegate?.setTimeout) {
      return delegate.setTimeout(handler, timeout, ...args);
    }
    return setTimeout(handler, timeout, ...args);
  },
  clearTimeout(handle) {
    const { delegate } = timeoutProvider;
    return (delegate?.clearTimeout || clearTimeout)(handle as any);
  },
  delegate: undefined,
};
jBf54xw:IntervalA]Interval5UIntervalProvider {
  setInterval: SetIntervalFunction;
  clearInterval: ClearInterval*)CInterval: SetIntervalFunction;
        clearInterval: ClearInterval3intervalProvider: IntervalIntervalL/interval-Interval) {
      return delegate.setInterval_FInterval_)Interval$interval%Interval || clearInterval1x3import { QueueAction } from './QueueAction';
import { QueueScheduler } from './QueueScheduler';

/**
 *
 * Queue Scheduler
 *
 * <span class="informal">Put every next task on a queue, instead of executing it immediately</span>
 *
 * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.
 *
 * When used without delay, it schedules given task synchronously - executes it right when
 * it is scheduled. However when called recursively, that is when inside the scheduled task,
 * another task is scheduled with queue scheduler, instead of executing immediately as well,
 * that task will be put on a queue and wait for current one to finish.
 *
 * This means that when you execute task with `queue` scheduler, you are sure it will end
 * before any other task scheduled with that scheduler will start.
 *
 * ## Examples
 * Schedule recursively first, then do something
 * ```ts
 * import { queueScheduler } from 'rxjs';
 *
 * queueScheduler.schedule(() => {
 *   queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue
 *
 *   console.log('first');
 * });
 *
 * // Logs:
 * // "first"
 * // "second"
 * ```
 *
 * Reschedule itself recursively
 * ```ts
 * import { queueScheduler } from 'rxjs';
 *
 * queueScheduler.schedule(function(state) {
 *   if (state !== 0) {
 *     console.log('before', state);
 *     this.schedule(state - 1); // `this` references currently executing Action,
 *                               // which we reschedule with new state
 *     console.log('after', state);
 *   }
 * }, 0, 3);
 *
 * // In scheduler that runs recursively, you would expect:
 * // "before", 3
 * // "before", 2
 * // "before", 1
 * // "after", 1
 * // "after", 2
 * // "after", 3
 *
 * // But with queue it logs:
 * // "before", 3
 * // "after", 3
 * // "before", 2
 * // "after", 2
 * // "before", 1
 * // "after", 1
 * ```
 */

export const queueScheduler = new QueueScheduler(QueueAction);

/**
 * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.
 */
export const queue = queueScheduler;
֍xB export type TimerHandle = number | ReturnType<typeof setTimeout>;
?ox (export function getSymbolIterator(): symbol {
  if (typeof Symbol !== 'function' || !Symbol.iterator) {
    return '@@iterator' as any;
  }

  return Symbol.iterator;
}

export const iterator = getSymbolIterator();
pI˱xn/**
 * Symbol.observable or a string "@@observable". Used for interop
 *
 * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.
 * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable
 */
export const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();
'sx6import { Subject } from '../Subject';
import { Subscriber } from '../Subscriber';
import { Subscription } from '../Subscription';
import { Scheduler } from '../Scheduler';
import { TestMessage } from './TestMessage';
import { SubscriptionLog } from './SubscriptionLog';
import { SubscriptionLoggable } from './SubscriptionLoggable';
import { applyMixins } from '../util/applyMixins';
import { observeNotification } from '../Notification';

export class HotObservable<T> extends Subject<T> implements SubscriptionLoggable {
  public subscriptions: SubscriptionLog[] = [];
  scheduler: Scheduler;
  // @ts-ignore: Property has no initializer and is not definitely assigned
  logSubscribedFrame: () => number;
  // @ts-ignore: Property has no initializer and is not definitely assigned
  logUnsubscribedFrame: (index: number) => void;

  constructor(public messages: TestMessage[], scheduler: Scheduler) {
    super();
    this.scheduler = scheduler;
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<any>): Subscription {
    const subject: HotObservable<T> = this;
    const index = subject.logSubscribedFrame();
    const subscription = new Subscription();
    subscription.add(
      new Subscription(() => {
        subject.logUnsubscribedFrame(index);
      })
    );
    subscription.add(super._subscribe(subscriber));
    return subscription;
  }

  setup() {
    const subject = this;
    const messagesLength = subject.messages.length;
    /* tslint:disable:no-var-keyword */
    for (let i = 0; i < messagesLength; i++) {
      (() => {
        const { notification, frame } = subject.messages[i];
        /* tslint:enable */
        subject.scheduler.schedule(() => {
          observeNotification(notification, subject);
        }, frame);
      })();
    }
  }
}
applyMixins(HotObservable, [SubscriptionLoggable]);
i 4CxG)import { Observable } from '../ObservableO:/,<$ColdObservable<T> extends Observablefunction (this: Observable<T>, subscriber: Subscriber<any>) {
      const observable: ColdObservable<T> = this as any;
      co/nst index = observable.logSubscribedFrame();
  l1#  observable.N(index);
        })
      );
      observable.scheduleMessages(subscriber);
  ?  }*`scheduleMessages(subscriber: Subscriber<any>) {
    const messagesLength = this.messages.length;6const message = this.messages[i];
      subscriber.add(
        this.scheduler.schedule(
          (state) => {
            conFst { message: { notification }, subscriber: destination } = state!;
  ,destination);
          },
          message.frame,
          { message, subscriber }
        )
      );
    }
  }
}
applyMixins(Cold%+
Ux pexport class SubscriptionLog {
  constructor(public subscribedFrame: number,
              public unsubscribedFrame: number = Infinity) {
  }
}Q0˷,x8import { Scheduler } from '../Scheduler';
import { SubscriptionLog } from './SubscriptionLog';

export class SubscriptionLoggable {
  public subscriptions: SubscriptionLog[] = [];
  // @ts-ignore: Property has no initializer and is not definitely assigned
  scheduler: Scheduler;

  logSubscribedFrame(): number {
    this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
    return this.subscriptions.length - 1;
  }

  logUnsubscribedFrame(index: number) {
    const subscriptionLogs = this.subscriptions;
    const oldSubscriptionLog = subscriptionLogs[index];
    subscriptionLogs[index] = new SubscriptionLog(
      oldSubscriptionLog.subscribedFrame,
      this.scheduler.now()
    );
  }
}
j=ȸ
x Wimport { ObservableNotification } from '../types';

export interface TestMessage {
  frame: number;
  notification: ObservableNotification<any>;
  isGhost?: boolean;
}
*;;xbJimport { Observable } from '../Observable';
import { ColdObservable } from './ColdObservable';
import { HotObservable } from './HotObservable';
import { TestMessage } from './TestMessage';
import { SubscriptionLog } from './SubscriptionLog';
import { Subscription } from '../Subscription';
import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
import { ObservableNotification } from '../types';
import { COMPLETE_NOTIFICATION, errorNotification, nextNotification } from '../NotificationFactories';
import { dateTimestampProvider } from '../scheduler/dateTimestampProvider';
import { performanceTimestampProvider } from '../scheduler/performanceTimestampProvider';
import { animationFrameProvider } from '../scheduler/animationFrameProvider';
import type { TimerHandle } from '../scheduler/timerHandle';
import { immediateProvider } from '../scheduler/immediateProvider';
import { intervalProvider } from '../scheduler/intervalProvider';
import { timeoutProvider } from '../scheduler/timeoutProvider';

const defaultMaxFrame: number = 750;

export interface RunHelpers {
  cold: typeof TestScheduler.prototype.createColdObservable;
  hot: typeof TestScheduler.prototype.createHotObservable;
  flush: typeof TestScheduler.prototype.flush;
  time: typeof TestScheduler.prototype.createTime;
  expectObservable: typeof TestScheduler.prototype.expectObservable;
  expectSubscriptions: typeof TestScheduler.prototype.expectSubscriptions;
  animate: (marbles: string) => void;
}

interface FlushableTest {
  ready: boolean;
  actual?: any[];
  expected?: any[];
}

export type observableToBeFn = (marbles: string, values?: any, errorValue?: any) => void;
export type subscriptionLogsToBeFn = (marbles: string | string[]) => void;

export class TestScheduler extends VirtualTimeScheduler {
  /**
   * The number of virtual time units each character in a marble diagram represents. If
   * the test scheduler is being used in "run mode", via the `run` method, this is temporarily
   * set to `1` for the duration of the `run` block, then set back to whatever value it was.
   */
  static frameTimeFactor = 10;

  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  public readonly hotObservables: HotObservable<any>[] = [];

  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  public readonly coldObservables: ColdObservable<any>[] = [];

  /**
   * Test meta data to be processed during `flush()`
   */
  private flushTests: FlushableTest[] = [];

  /**
   * Indicates whether the TestScheduler instance is operating in "run mode",
   * meaning it's processing a call to `run()`
   */
  private runMode = false;

  /**
   *
   * @param assertDeepEqual A function to set up your assertion for your test harness
   */
  constructor(public assertDeepEqual: (actual: any, expected: any) => boolean | void) {
    super(VirtualAction, defaultMaxFrame);
  }

  createTime(marbles: string): number {
    const indexOf = this.runMode ? marbles.trim().indexOf('|') : marbles.indexOf('|');
    if (indexOf === -1) {
      throw new Error('marble diagram for time should have a completion marker "|"');
    }
    return indexOf * TestScheduler.frameTimeFactor;
  }

  /**
   * @param marbles A diagram in the marble DSL. Letters map to keys in `values` if provided.
   * @param values Values to use for the letters in `marbles`. If omitted, the letters themselves are used.
   * @param error The error to use for the `#` marble (if present).
   */
  createColdObservable<T = string>(marbles: string, values?: { [marble: string]: T }, error?: any): ColdObservable<T> {
    if (marbles.indexOf('^') !== -1) {
      throw new Error('cold observable cannot have subscription offset "^"');
    }
    if (marbles.indexOf('!') !== -1) {
      throw new Error('cold observable cannot have unsubscription marker "!"');
    }
    const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
    const cold = new ColdObservable<T>(messages, this);
    this.coldObservables.push(cold);
    return cold;
  }

  /**
   * @param marbles A diagram in the marble DSL. Letters map to keys in `values` if provided.
   * @param values Values to use for the letters in `marbles`. If omitted, the letters themselves are used.
   * @param error The error to use for the `#` marble (if present).
   */
  createHotObservable<T = string>(marbles: string, values?: { [marble: string]: T }, error?: any): HotObservable<T> {
    if (marbles.indexOf('!') !== -1) {
      throw new Error('hot observable cannot have unsubscription marker "!"');
    }
    const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
    const subject = new HotObservable<T>(messages, this);
    this.hotObservables.push(subject);
    return subject;
  }

  private materializeInnerObservable(observable: Observable<any>, outerFrame: number): TestMessage[] {
    const messages: TestMessage[] = [];
    observable.subscribe({
      next: (value) => {
        messages.push({ frame: this.frame - outerFrame, notification: nextNotification(value) });
      },
      error: (error) => {
        messages.push({ frame: this.frame - outerFrame, notification: errorNotification(error) });
      },
      complete: () => {
        messages.push({ frame: this.frame - outerFrame, notification: COMPLETE_NOTIFICATION });
      },
    });
    return messages;
  }

  expectObservable<T>(observable: Observable<T>, subscriptionMarbles: string | null = null) {
    const actual: TestMessage[] = [];
    const flushTest: FlushableTest = { actual, ready: false };
    const subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
    const subscriptionFrame = subscriptionParsed.subscribedFrame === Infinity ? 0 : subscriptionParsed.subscribedFrame;
    const unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
    let subscription: Subscription;

    this.schedule(() => {
      subscription = observable.subscribe({
        next: (x) => {
          // Support Observable-of-Observables
          const value = x instanceof Observable ? this.materializeInnerObservable(x, this.frame) : x;
          actual.push({ frame: this.frame, notification: nextNotification(value) });
        },
        error: (error) => {
          actual.push({ frame: this.frame, notification: errorNotification(error) });
        },
        complete: () => {
          actual.push({ frame: this.frame, notification: COMPLETE_NOTIFICATION });
        },
      });
    }, subscriptionFrame);

    if (unsubscriptionFrame !== Infinity) {
      this.schedule(() => subscription.unsubscribe(), unsubscriptionFrame);
    }

    this.flushTests.push(flushTest);
    const { runMode } = this;

    return {
      toBe(marbles: string, values?: any, errorValue?: any) {
        flushTest.ready = true;
        flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
      },
      toEqual: (other: Observable<T>) => {
        flushTest.ready = true;
        flushTest.expected = [];
        this.schedule(() => {
          subscription = other.subscribe({
            next: (x) => {
              // Support Observable-of-Observables
              const value = x instanceof Observable ? this.materializeInnerObservable(x, this.frame) : x;
              flushTest.expected!.push({ frame: this.frame, notification: nextNotification(value) });
            },
            error: (error) => {
              flushTest.expected!.push({ frame: this.frame, notification: errorNotification(error) });
            },
            complete: () => {
              flushTest.expected!.push({ frame: this.frame, notification: COMPLETE_NOTIFICATION });
            },
          });
        }, subscriptionFrame);
      },
    };
  }

  expectSubscriptions(actualSubscriptionLogs: SubscriptionLog[]): { toBe: subscriptionLogsToBeFn } {
    const flushTest: FlushableTest = { actual: actualSubscriptionLogs, ready: false };
    this.flushTests.push(flushTest);
    const { runMode } = this;
    return {
      toBe(marblesOrMarblesArray: string | string[]) {
        const marblesArray: string[] = typeof marblesOrMarblesArray === 'string' ? [marblesOrMarblesArray] : marblesOrMarblesArray;
        flushTest.ready = true;
        flushTest.expected = marblesArray
          .map((marbles) => TestScheduler.parseMarblesAsSubscriptions(marbles, runMode))
          .filter((marbles) => marbles.subscribedFrame !== Infinity);
      },
    };
  }

  flush() {
    const hotObservables = this.hotObservables;
    while (hotObservables.length > 0) {
      hotObservables.shift()!.setup();
    }

    super.flush();

    this.flushTests = this.flushTests.filter((test) => {
      if (test.ready) {
        this.assertDeepEqual(test.actual, test.expected);
        return false;
      }
      return true;
    });
  }

  static parseMarblesAsSubscriptions(marbles: string | null, runMode = false): SubscriptionLog {
    if (typeof marbles !== 'string') {
      return new SubscriptionLog(Infinity);
    }
    // Spreading the marbles into an array leverages ES2015's support for emoji
    // characters when iterating strings.
    const characters = [...marbles];
    const len = characters.length;
    let groupStart = -1;
    let subscriptionFrame = Infinity;
    let unsubscriptionFrame = Infinity;
    let frame = 0;

    for (let i = 0; i < len; i++) {
      let nextFrame = frame;
      const advanceFrameBy = (count: number) => {
        nextFrame += count * this.frameTimeFactor;
      };
      const c = characters[i];
      switch (c) {
        case ' ':
          // Whitespace no longer advances time
          if (!runMode) {
            advanceFrameBy(1);
          }
          break;
        case '-':
          advanceFrameBy(1);
          break;
        case '(':
          groupStart = frame;
          advanceFrameBy(1);
          break;
        case ')':
          groupStart = -1;
          advanceFrameBy(1);
          break;
        case '^':
          if (subscriptionFrame !== Infinity) {
            throw new Error("found a second subscription point '^' in a " + 'subscription marble diagram. There can only be one.');
          }
          subscriptionFrame = groupStart > -1 ? groupStart : frame;
          advanceFrameBy(1);
          break;
        case '!':
          if (unsubscriptionFrame !== Infinity) {
            throw new Error("found a second unsubscription point '!' in a " + 'subscription marble diagram. There can only be one.');
          }
          unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
          break;
        default:
          // time progression syntax
          if (runMode && c.match(/^[0-9]$/)) {
            // Time progression must be preceded by at least one space
            // if it's not at the beginning of the diagram
            if (i === 0 || characters[i - 1] === ' ') {
              const buffer = characters.slice(i).join('');
              const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
              if (match) {
                i += match[0].length - 1;
                const duration = parseFloat(match[1]);
                const unit = match[2];
                let durationInMs: number;

                switch (unit) {
                  case 'ms':
                    durationInMs = duration;
                    break;
                  case 's':
                    durationInMs = duration * 1000;
                    break;
                  case 'm':
                    durationInMs = duration * 1000 * 60;
                    break;
                  default:
                    break;
                }

                advanceFrameBy(durationInMs! / this.frameTimeFactor);
                break;
              }
            }
          }

          throw new Error("there can only be '^' and '!' markers in a " + "subscription marble diagram. Found instead '" + c + "'.");
      }

      frame = nextFrame;
    }

    if (unsubscriptionFrame < 0) {
      return new SubscriptionLog(subscriptionFrame);
    } else {
      return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
    }
  }

  static parseMarbles(
    marbles: string,
    values?: any,
    errorValue?: any,
    materializeInnerObservables: boolean = false,
    runMode = false
  ): TestMessage[] {
    if (marbles.indexOf('!') !== -1) {
      throw new Error('conventional marble diagrams cannot have the ' + 'unsubscription marker "!"');
    }
    // Spreading the marbles into an array leverages ES2015's support for emoji
    // characters when iterating strings.
    const characters = [...marbles];
    const len = characters.length;
    const testMessages: TestMessage[] = [];
    const subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
    let frame = subIndex === -1 ? 0 : subIndex * -this.frameTimeFactor;
    const getValue =
      typeof values !== 'object'
        ? (x: any) => x
        : (x: any) => {
            // Support Observable-of-Observables
            if (materializeInnerObservables && values[x] instanceof ColdObservable) {
              return values[x].messages;
            }
            return values[x];
          };
    let groupStart = -1;

    for (let i = 0; i < len; i++) {
      let nextFrame = frame;
      const advanceFrameBy = (count: number) => {
        nextFrame += count * this.frameTimeFactor;
      };

      let notification: ObservableNotification<any> | undefined;
      const c = characters[i];
      switch (c) {
        case ' ':
          // Whitespace no longer advances time
          if (!runMode) {
            advanceFrameBy(1);
          }
          break;
        case '-':
          advanceFrameBy(1);
          break;
        case '(':
          groupStart = frame;
          advanceFrameBy(1);
          break;
        case ')':
          groupStart = -1;
          advanceFrameBy(1);
          break;
        case '|':
          notification = COMPLETE_NOTIFICATION;
          advanceFrameBy(1);
          break;
        case '^':
          advanceFrameBy(1);
          break;
        case '#':
          notification = errorNotification(errorValue || 'error');
          advanceFrameBy(1);
          break;
        default:
          // Might be time progression syntax, or a value literal
          if (runMode && c.match(/^[0-9]$/)) {
            // Time progression must be preceded by at least one space
            // if it's not at the beginning of the diagram
            if (i === 0 || characters[i - 1] === ' ') {
              const buffer = characters.slice(i).join('');
              const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
              if (match) {
                i += match[0].length - 1;
                const duration = parseFloat(match[1]);
                const unit = match[2];
                let durationInMs: number;

                switch (unit) {
                  case 'ms':
                    durationInMs = duration;
                    break;
                  case 's':
                    durationInMs = duration * 1000;
                    break;
                  case 'm':
                    durationInMs = duration * 1000 * 60;
                    break;
                  default:
                    break;
                }

                advanceFrameBy(durationInMs! / this.frameTimeFactor);
                break;
              }
            }
          }

          notification = nextNotification(getValue(c));
          advanceFrameBy(1);
          break;
      }

      if (notification) {
        testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification });
      }

      frame = nextFrame;
    }
    return testMessages;
  }

  private createAnimator() {
    if (!this.runMode) {
      throw new Error('animate() must only be used in run mode');
    }

    // The TestScheduler assigns a delegate to the provider that's used for
    // requestAnimationFrame (rAF). The delegate works in conjunction with the
    // animate run helper to coordinate the invocation of any rAF callbacks,
    // that are effected within tests, with the animation frames specified by
    // the test's author - in the marbles that are passed to the animate run
    // helper. This allows the test's author to write deterministic tests and
    // gives the author full control over when - or if - animation frames are
    // 'painted'.

    let lastHandle = 0;
    let map: Map<number, FrameRequestCallback> | undefined;

    const delegate = {
      requestAnimationFrame(callback: FrameRequestCallback) {
        if (!map) {
          throw new Error('animate() was not called within run()');
        }
        const handle = ++lastHandle;
        map.set(handle, callback);
        return handle;
      },
      cancelAnimationFrame(handle: number) {
        if (!map) {
          throw new Error('animate() was not called within run()');
        }
        map.delete(handle);
      },
    };

    const animate = (marbles: string) => {
      if (map) {
        throw new Error('animate() must not be called more than once within run()');
      }
      if (/[|#]/.test(marbles)) {
        throw new Error('animate() must not complete or error');
      }
      map = new Map<number, FrameRequestCallback>();
      const messages = TestScheduler.parseMarbles(marbles, undefined, undefined, undefined, true);
      for (const message of messages) {
        this.schedule(() => {
          const now = this.now();
          // Capture the callbacks within the queue and clear the queue
          // before enumerating the callbacks, as callbacks might
          // reschedule themselves. (And, yeah, we're using a Map to represent
          // the queue, but the values are guaranteed to be returned in
          // insertion order, so it's all good. Trust me, I've read the docs.)
          const callbacks = Array.from(map!.values());
          map!.clear();
          for (const callback of callbacks) {
            callback(now);
          }
        }, message.frame);
      }
    };

    return { animate, delegate };
  }

  private createDelegates() {
    // When in run mode, the TestScheduler provides alternate implementations
    // of set/clearImmediate and set/clearInterval. These implementations are
    // consumed by the scheduler implementations via the providers. This is
    // done to effect deterministic asap and async scheduler behavior so that
    // all of the schedulers are testable in 'run mode'. Prior to v7,
    // delegation occurred at the scheduler level. That is, the asap and
    // animation frame schedulers were identical in behavior to the async
    // scheduler. Now, when in run mode, asap actions are prioritized over
    // async actions and animation frame actions are coordinated using the
    // animate run helper.

    let lastHandle = 0;
    const scheduleLookup = new Map<
      TimerHandle,
      {
        due: number;
        duration: number;
        handle: TimerHandle;
        handler: () => void;
        subscription: Subscription;
        type: 'immediate' | 'interval' | 'timeout';
      }
    >();

    const run = () => {
      // Whenever a scheduled run is executed, it must run a single immediate
      // or interval action - with immediate actions being prioritized over
      // interval and timeout actions.
      const now = this.now();
      const scheduledRecords = Array.from(scheduleLookup.values());
      const scheduledRecordsDue = scheduledRecords.filter(({ due }) => due <= now);
      const dueImmediates = scheduledRecordsDue.filter(({ type }) => type === 'immediate');
      if (dueImmediates.length > 0) {
        const { handle, handler } = dueImmediates[0];
        scheduleLookup.delete(handle);
        handler();
        return;
      }
      const dueIntervals = scheduledRecordsDue.filter(({ type }) => type === 'interval');
      if (dueIntervals.length > 0) {
        const firstDueInterval = dueIntervals[0];
        const { duration, handler } = firstDueInterval;
        firstDueInterval.due = now + duration;
        // The interval delegate must behave like setInterval, so run needs to
        // be rescheduled. This will continue until the clearInterval delegate
        // unsubscribes and deletes the handle from the map.
        firstDueInterval.subscription = this.schedule(run, duration);
        handler();
        return;
      }
      const dueTimeouts = scheduledRecordsDue.filter(({ type }) => type === 'timeout');
      if (dueTimeouts.length > 0) {
        const { handle, handler } = dueTimeouts[0];
        scheduleLookup.delete(handle);
        handler();
        return;
      }
      throw new Error('Expected a due immediate or interval');
    };

    // The following objects are the delegates that replace conventional
    // runtime implementations with TestScheduler implementations.
    //
    // The immediate delegate is depended upon by the asapScheduler.
    //
    // The interval delegate is depended upon by the asyncScheduler.
    //
    // The timeout delegate is not depended upon by any scheduler, but it's
    // included here because the onUnhandledError and onStoppedNotification
    // configuration points use setTimeout to avoid producer interference. It's
    // inclusion allows for the testing of these configuration points.

    const immediate = {
      setImmediate: (handler: () => void) => {
        const handle = ++lastHandle;
        scheduleLookup.set(handle, {
          due: this.now(),
          duration: 0,
          handle,
          handler,
          subscription: this.schedule(run, 0),
          type: 'immediate',
        });
        return handle;
      },
      clearImmediate: (handle: TimerHandle) => {
        const value = scheduleLookup.get(handle);
        if (value) {
          value.subscription.unsubscribe();
          scheduleLookup.delete(handle);
        }
      },
    };

    const interval = {
      setInterval: (handler: () => void, duration = 0) => {
        const handle = ++lastHandle;
        scheduleLookup.set(handle, {
          due: this.now() + duration,
          duration,
          handle,
          handler,
          subscription: this.schedule(run, duration),
          type: 'interval',
        });
        return handle;
      },
      clearInterval: (handle: TimerHandle) => {
        const value = scheduleLookup.get(handle);
        if (value) {
          value.subscription.unsubscribe();
          scheduleLookup.delete(handle);
        }
      },
    };

    const timeout = {
      setTimeout: (handler: () => void, duration = 0) => {
        const handle = ++lastHandle;
        scheduleLookup.set(handle, {
          due: this.now() + duration,
          duration,
          handle,
          handler,
          subscription: this.schedule(run, duration),
          type: 'timeout',
        });
        return handle;
      },
      clearTimeout: (handle: TimerHandle) => {
        const value = scheduleLookup.get(handle);
        if (value) {
          value.subscription.unsubscribe();
          scheduleLookup.delete(handle);
        }
      },
    };

    return { immediate, interval, timeout };
  }

  /**
   * The `run` method performs the test in 'run mode' - in which schedulers
   * used within the test automatically delegate to the `TestScheduler`. That
   * is, in 'run mode' there is no need to explicitly pass a `TestScheduler`
   * instance to observable creators or operators.
   *
   * @see {@link /guide/testing/marble-testing}
   */
  run<T>(callback: (helpers: RunHelpers) => T): T {
    const prevFrameTimeFactor = TestScheduler.frameTimeFactor;
    const prevMaxFrames = this.maxFrames;

    TestScheduler.frameTimeFactor = 1;
    this.maxFrames = Infinity;
    this.runMode = true;

    const animator = this.createAnimator();
    const delegates = this.createDelegates();

    animationFrameProvider.delegate = animator.delegate;
    dateTimestampProvider.delegate = this;
    immediateProvider.delegate = delegates.immediate;
    intervalProvider.delegate = delegates.interval;
    timeoutProvider.delegate = delegates.timeout;
    performanceTimestampProvider.delegate = this;

    const helpers: RunHelpers = {
      cold: this.createColdObservable.bind(this),
      hot: this.createHotObservable.bind(this),
      flush: this.flush.bind(this),
      time: this.createTime.bind(this),
      expectObservable: this.expectObservable.bind(this),
      expectSubscriptions: this.expectSubscriptions.bind(this),
      animate: animator.animate,
    };
    try {
      const ret = callback(helpers);
      this.flush();
      return ret;
    } finally {
      TestScheduler.frameTimeFactor = prevFrameTimeFactor;
      this.maxFrames = prevMaxFrames;
      this.runMode = false;
      animationFrameProvider.delegate = undefined;
      dateTimestampProvider.delegate = undefined;
      immediateProvider.delegate = undefined;
      intervalProvider.delegate = undefined;
      timeoutProvider.delegate = undefined;
      performanceTimestampProvider.delegate = undefined;
    }
  }
}
MǇx.a// https://github.com/microsoft/TypeScript/issues/40462#issuecomment-689879308
/// <reference lib="esnext.asynciterable" />

import { Observable } from './Observable';
import { Subscription } from './Subscription';

/**
 * Note: This will add Symbol.observable globally for all TypeScript users,
 * however, we are no longer polyfilling Symbol.observable
 */
declare global {
  interface SymbolConstructor {
    readonly observable: symbol;
  }
}

/* OPERATOR INTERFACES */

/**
 * A function type interface that describes a function that accepts one parameter `T`
 * and returns another parameter `R`.
 *
 * Usually used to describe {@link OperatorFunction} - it always takes a single
 * parameter (the source Observable) and returns another Observable.
 */
export interface UnaryFunction<T, R> {
  (source: T): R;
}

export interface OperatorFunction<T, R> extends UnaryFunction<Observable<T>, Observable<R>> {}

export type FactoryOrValue<T> = T | (() => T);

/**
 * A function type interface that describes a function that accepts and returns a parameter of the same type.
 *
 * Used to describe {@link OperatorFunction} with the only one type: `OperatorFunction<T, T>`.
 *
 */
export interface MonoTypeOperatorFunction<T> extends OperatorFunction<T, T> {}

/**
 * A value and the time at which it was emitted.
 *
 * Emitted by the `timestamp` operator
 *
 * @see {@link timestamp}
 */
export interface Timestamp<T> {
  value: T;
  /**
   * The timestamp. By default, this is in epoch milliseconds.
   * Could vary based on the timestamp provider passed to the operator.
   */
  timestamp: number;
}

/**
 * A value emitted and the amount of time since the last value was emitted.
 *
 * Emitted by the `timeInterval` operator.
 *
 * @see {@link timeInterval}
 */
export interface TimeInterval<T> {
  value: T;

  /**
   * The amount of time between this value's emission and the previous value's emission.
   * If this is the first emitted value, then it will be the amount of time since subscription
   * started.
   */
  interval: number;
}

/* SUBSCRIPTION INTERFACES */

export interface Unsubscribable {
  unsubscribe(): void;
}

export type TeardownLogic = Subscription | Unsubscribable | (() => void) | void;

export interface SubscriptionLike extends Unsubscribable {
  unsubscribe(): void;
  readonly closed: boolean;
}

/**
 * @deprecated Do not use. Most likely you want to use `ObservableInput`. Will be removed in v8.
 */
export type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;

/** OBSERVABLE INTERFACES */

export interface Subscribable<T> {
  subscribe(observer: Partial<Observer<T>>): Unsubscribable;
}

/**
 * Valid types that can be converted to observables.
 */
export type ObservableInput<T> =
  | Observable<T>
  | InteropObservable<T>
  | AsyncIterable<T>
  | PromiseLike<T>
  | ArrayLike<T>
  | Iterable<T>
  | ReadableStreamLike<T>;

/**
 * @deprecated Renamed to {@link InteropObservable }. Will be removed in v8.
 */
export type ObservableLike<T> = InteropObservable<T>;

/**
 * An object that implements the `Symbol.observable` interface.
 */
export interface InteropObservable<T> {
  [Symbol.observable]: () => Subscribable<T>;
}

/* NOTIFICATIONS */

/**
 * A notification representing a "next" from an observable.
 * Can be used with {@link dematerialize}.
 */
export interface NextNotification<T> {
  /** The kind of notification. Always "N" */
  kind: 'N';
  /** The value of the notification. */
  value: T;
}

/**
 * A notification representing an "error" from an observable.
 * Can be used with {@link dematerialize}.
 */
export interface ErrorNotification {
  /** The kind of notification. Always "E" */
  kind: 'E';
  error: any;
}

/**
 * A notification representing a "completion" from an observable.
 * Can be used with {@link dematerialize}.
 */
export interface CompleteNotification {
  kind: 'C';
}

/**
 * Valid observable notification types.
 */
export type ObservableNotification<T> = NextNotification<T> | ErrorNotification | CompleteNotification;

/* OBSERVER INTERFACES */

export interface NextObserver<T> {
  closed?: boolean;
  next: (value: T) => void;
  error?: (err: any) => void;
  complete?: () => void;
}

export interface ErrorObserver<T> {
  closed?: boolean;
  next?: (value: T) => void;
  error: (err: any) => void;
  complete?: () => void;
}

export interface CompletionObserver<T> {
  closed?: boolean;
  next?: (value: T) => void;
  error?: (err: any) => void;
  complete: () => void;
}

export type PartialObserver<T> = NextObserver<T> | ErrorObserver<T> | CompletionObserver<T>;

/**
 * An object interface that defines a set of callback functions a user can use to get
 * notified of any set of {@link Observable}
 * {@link guide/glossary-and-semantics#notification notification} events.
 *
 * For more info, please refer to {@link guide/observer this guide}.
 */
export interface Observer<T> {
  /**
   * A callback function that gets called by the producer during the subscription when
   * the producer "has" the `value`. It won't be called if `error` or `complete` callback
   * functions have been called, nor after the consumer has unsubscribed.
   *
   * For more info, please refer to {@link guide/glossary-and-semantics#next this guide}.
   */
  next: (value: T) => void;
  /**
   * A callback function that gets called by the producer if and when it encountered a
   * problem of any kind. The errored value will be provided through the `err` parameter.
   * This callback can't be called more than one time, it can't be called if the
   * `complete` callback function have been called previously, nor it can't be called if
   * the consumer has unsubscribed.
   *
   * For more info, please refer to {@link guide/glossary-and-semantics#error this guide}.
   */
  error: (err: any) => void;
  /**
   * A callback function that gets called by the producer if and when it has no more
   * values to provide (by calling `next` callback function). This means that no error
   * has happened. This callback can't be called more than one time, it can't be called
   * if the `error` callback function have been called previously, nor it can't be called
   * if the consumer has unsubscribed.
   *
   * For more info, please refer to {@link guide/glossary-and-semantics#complete this guide}.
   */
  complete: () => void;
}

export interface SubjectLike<T> extends Observer<T>, Subscribable<T> {}

/* SCHEDULER INTERFACES */

export interface SchedulerLike extends TimestampProvider {
  schedule<T>(work: (this: SchedulerAction<T>, state: T) => void, delay: number, state: T): Subscription;
  schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay: number, state?: T): Subscription;
  schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription;
}

export interface SchedulerAction<T> extends Subscription {
  schedule(state?: T, delay?: number): Subscription;
}

/**
 * This is a type that provides a method to allow RxJS to create a numeric timestamp
 */
export interface TimestampProvider {
  /**
   * Returns a timestamp as a number.
   *
   * This is used by types like `ReplaySubject` or operators like `timestamp` to calculate
   * the amount of time passed between events.
   */
  now(): number;
}

/**
 * Extracts the type from an `ObservableInput<any>`. If you have
 * `O extends ObservableInput<any>` and you pass in `Observable<number>`, or
 * `Promise<number>`, etc, it will type as `number`.
 */
export type ObservedValueOf<O> = O extends ObservableInput<infer T> ? T : never;

/**
 * Extracts a union of element types from an `ObservableInput<any>[]`.
 * If you have `O extends ObservableInput<any>[]` and you pass in
 * `Observable<string>[]` or `Promise<string>[]` you would get
 * back a type of `string`.
 * If you pass in `[Observable<string>, Observable<number>]` you would
 * get back a type of `string | number`.
 */
export type ObservedValueUnionFromArray<X> = X extends Array<ObservableInput<infer T>> ? T : never;

/**
 * @deprecated Renamed to {@link ObservedValueUnionFromArray}. Will be removed in v8.
 */
export type ObservedValuesFromArray<X> = ObservedValueUnionFromArray<X>;

/**
 * Extracts a tuple of element types from an `ObservableInput<any>[]`.
 * If you have `O extends ObservableInput<any>[]` and you pass in
 * `[Observable<string>, Observable<number>]` you would get back a type
 * of `[string, number]`.
 */
export type ObservedValueTupleFromArray<X> = { [K in keyof X]: ObservedValueOf<X[K]> };

/**
 * Used to infer types from arguments to functions like {@link forkJoin}.
 * So that you can have `forkJoin([Observable<A>, PromiseLike<B>]): Observable<[A, B]>`
 * et al.
 */
export type ObservableInputTuple<T> = {
  [K in keyof T]: ObservableInput<T[K]>;
};

/**
 * Constructs a new tuple with the specified type at the head.
 * If you declare `Cons<A, [B, C]>` you will get back `[A, B, C]`.
 */
export type Cons<X, Y extends readonly any[]> = ((arg: X, ...rest: Y) => any) extends (...args: infer U) => any ? U : never;

/**
 * Extracts the head of a tuple.
 * If you declare `Head<[A, B, C]>` you will get back `A`.
 */
export type Head<X extends readonly any[]> = ((...args: X) => any) extends (arg: infer U, ...rest: any[]) => any ? U : never;

/**
 * Extracts the tail of a tuple.
 * If you declare `Tail<[A, B, C]>` you will get back `[B, C]`.
 */
export type Tail<X extends readonly any[]> = ((...args: X) => any) extends (arg: any, ...rest: infer U) => any ? U : never;

/**
 * Extracts the generic value from an Array type.
 * If you have `T extends Array<any>`, and pass a `string[]` to it,
 * `ValueFromArray<T>` will return the actual type of `string`.
 */
export type ValueFromArray<A extends readonly unknown[]> = A extends Array<infer T> ? T : never;

/**
 * Gets the value type from an {@link ObservableNotification}, if possible.
 */
export type ValueFromNotification<T> = T extends { kind: 'N' | 'E' | 'C' }
  ? T extends NextNotification<any>
    ? T extends { value: infer V }
      ? V
      : undefined
    : never
  : never;

/**
 * A simple type to represent a gamut of "falsy" values... with a notable exception:
 * `NaN` is "falsy" however, it is not and cannot be typed via TypeScript. See
 * comments here: https://github.com/microsoft/TypeScript/issues/28682#issuecomment-707142417
 */
export type Falsy = null | undefined | false | 0 | -0 | 0n | '';

export type TruthyTypesOf<T> = T extends Falsy ? never : T;

// We shouldn't rely on this type definition being available globally yet since it's
// not necessarily available in every TS environment.
interface ReadableStreamDefaultReaderLike<T> {
  // HACK: As of TS 4.2.2, The provided types for the iterator results of a `ReadableStreamDefaultReader`
  // are significantly different enough from `IteratorResult` as to cause compilation errors.
  // The type at the time is `ReadableStreamDefaultReadResult`.
  read(): PromiseLike<
    | {
        done: false;
        value: T;
      }
    | { done: true; value?: undefined }
  >;
  releaseLock(): void;
}

/**
 * The base signature RxJS will look for to identify and use
 * a [ReadableStream](https://streams.spec.whatwg.org/#rs-class)
 * as an {@link ObservableInput} source.
 */
export interface ReadableStreamLike<T> {
  getReader(): ReadableStreamDefaultReaderLike<T>;
}

/**
 * An observable with a `connect` method that is used to create a subscription
 * to an underlying source, connecting it with all consumers via a multicast.
 */
export interface Connectable<T> extends Observable<T> {
  /**
   * (Idempotent) Calling this method will connect the underlying source observable to all subscribed consumers
   * through an underlying {@link Subject}.
   * @returns A subscription, that when unsubscribed, will "disconnect" the source from the connector subject,
   * severing notifications to all consumers.
   */
  connect(): Subscription;
}
%xV/*
  NOTE: This is the global export file for rxjs v6 and higher.
 */

/* rxjs */
export * from '../index';

/* rxjs.operators */
import * as _operators from '../operators/index';
export const operators = _operators;

/* rxjs.testing */
import * as _testing from '../testing/index';
export const testing = _testing;

/* rxjs.ajax */
import * as _ajax from '../ajax/index';
export const ajax = _ajax;

/* rxjs.webSocket */
import * as _webSocket from '../webSocket/index';
export const webSocket = _webSocket;

/* rxjs.fetch */
import * as _fetch from '../fetch/index';
export const fetch = _fetch;
6xkimport { createErrorClass } from './createErrorClass';

export interface ArgumentOutOfRangeError extends Error {}

export interface ArgumentOutOfRangeErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (): ArgumentOutOfRangeError;
}

/**
 * An error thrown when an element was queried at a certain index of an
 * Observable, but no such index or position exists in that sequence.
 *
 * @see {@link elementAt}
 * @see {@link take}
 * @see {@link takeLast}
 */
export const ArgumentOutOfRangeError: ArgumentOutOfRangeErrorCtor = createErrorClass(
  (_super) =>
    function ArgumentOutOfRangeErrorImpl(this: any) {
      _super(this);
      this.name = 'ArgumentOutOfRangeError';
      this.message = 'argument out of range';
    }
);
})xxxIObjectUnsubscribed[)ObjectUnsubscribedObjectUnsubscribedn)action is invalid because the object has been
 * unsubscribed.
 *
 * @see {@link Subject}
 * @see {@link BehaviorSubject}
 *
 *\ @class ObjectUnsubscribedError
 */
export const ObjectUnsubscribedError: ObjectUnsubscribed9ObjectUnsubscribed>ObjectUnsubscribed,object unsubscribed';
    }
);
ƩQ1ximport { createErrorClass } from './createErrorClass';

export interface EmptyError extends Error {}

export interface EmptyErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (): EmptyError;
}

/**
 * An error thrown when an Observable or a sequence was queried but has no
 * elements.
 *
 * @see {@link first}
 * @see {@link last}
 * @see {@link single}
 * @see {@link firstValueFrom}
 * @see {@link lastValueFrom}
 */
export const EmptyError: EmptyErrorCtor = createErrorClass(
  (_super) =>
    function EmptyErrorImpl(this: any) {
      _super(this);
      this.name = 'EmptyError';
      this.message = 'no elements in sequence';
    }
);
_ x5INotFoundN)NotFound|message: string): NotFoundG' value or values are missing from an
 * observable sequence.
 *
 * @see {@link operators/single}
 */
export const NotFoundError
: NotFoundQ9,NotFoundErrorImpl(this: any, message: string+7NotFoundError';
      this.message = message;
    }
);
jDx NISequenceQ)SequenceSequence_&Ksomething is wrong with the sequence of
 * values arriving on the observabl8SequenceError: Sequence9SequencePOSequence/@Hxplet nextHandle = 1;
// The promise needs to be created lazily otherwise it won't be patched by Zones
let resolved: Promise<any>;
const activeHandles: { [key: number]: any } = {};

/**
 * Finds the handle in the list of active handles, and removes it.
 * Returns `true` if found, `false` otherwise. Used both to clear
 * Immediate scheduled tasks, and to identify if a task should be scheduled.
 */
function findAndClearHandle(handle: number): boolean {
  if (handle in activeHandles) {
    delete activeHandles[handle];
    return true;
  }
  return false;
}

/**
 * Helper functions to schedule and unschedule microtasks.
 */
export const Immediate = {
  setImmediate(cb: () => void): number {
    const handle = nextHandle++;
    activeHandles[handle] = true;
    if (!resolved) {
      resolved = Promise.resolve();
    }
    resolved.then(() => findAndClearHandle(handle) && cb());
    return handle;
  },

  clearImmediate(handle: number): void {
    findAndClearHandle(handle);
  },
};

/**
 * Used for internal testing purposes only. Do not export from library.
 */
export const TestTools = {
  pending() {
    return Object.keys(activeHandles).length;
  }
};
<x3import { createErrorClass } from './createErrorClass';

export interface UnsubscriptionError extends Error {
  readonly errors: any[];
}

export interface UnsubscriptionErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (errors: any[]): UnsubscriptionError;
}

/**
 * An error thrown when one or more errors have occurred during the
 * `unsubscribe` of a {@link Subscription}.
 */
export const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(
  (_super) =>
    function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {
      _super(this);
      this.message = errors
        ? `${errors.length} errors occurred during unsubscription:
${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\n  ')}`
        : '';
      this.name = 'UnsubscriptionError';
      this.errors = errors;
    }
);
Hxiexport function applyMixins(derivedCtor: any, baseCtors: any[]) {
  for (let i = 0, len = baseCtors.length; i < len; i++) {
    const baseCtor = baseCtors[i];
    const propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
    for (let j = 0, len2 = propertyKeys.length; j < len2; j++) {
      const name = propertyKeys[j];
      derivedCtor.prototype[name] = baseCtor.prototype[name];
    }
  }
}zϱ(x~import { SchedulerLike } from '../types';
import { isFunction } from './isFunction';
import { isScheduler } from './isScheduler';

function last<T>(arr: T[]): T | undefined {
  return arr[arr.length - 1];
}

export function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {
  return isFunction(last(args)) ? args.pop() : undefined;
}

export function popScheduler(args: any[]): SchedulerLike | undefined {
  return isScheduler(last(args)) ? args.pop() : undefined;
}

export function popNumber(args: any[], defaultValue: number): number {
  return typeof last(args) === 'number' ? args.pop()! : defaultValue;
}
i܃=x%const { isArray } = Array;
const { getPrototypeOf, prototype: objectProto, keys: getKeys } = Object;

/**
 * Used in functions where either a list of arguments, a single array of arguments, or a
 * dictionary of arguments can be returned. Returns an object with an `args` property with
 * the arguments in an array, if it is a dictionary, it will also return the `keys` in another
 * property.
 */
export function argsArgArrayOrObject<T, O extends Record<string, T>>(args: T[] | [O] | [T[]]): { args: T[]; keys: string[] | null } {
  if (args.length === 1) {
    const first = args[0];
    if (isArray(first)) {
      return { args: first, keys: null };
    }
    if (isPOJO(first)) {
      const keys = getKeys(first);
      return {
        args: keys.map((key) => first[key]),
        keys,
      };
    }
  }

  return { args: args as T[], keys: null };
}

function isPOJO(obj: any): obj is object {
  return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;
}
^@Ax)const { isArray } = Array;

/**
 * Used in operators and functions that accept either a list of arguments, or an array of arguments
 * as a single argument.
 */
export function argsOrArgArray<T>(args: (T | T[])[]): T[] {
  return args.length === 1 && isArray(args[0]) ? args[0] : (args as T[]);
}
8*ax./**
 * Removes an item from an array, mutating it.
 * @param arr The array to remove the item from
 * @param item The item to remove
 */
export function arrRemove<T>(arr: T[] | undefined | null, item: T) {
  if (arr) {
    const index = arr.indexOf(item);
    0 <= index && arr.splice(index, 1);
  }
}
`v1x/**
 * Used to create Error subclasses until the community moves away from ES5.
 *
 * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors
 * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123
 *
 * @param createImpl A factory function to create the actual constructor implementation. The returned
 * function should be a named function that calls `_super` internally.
 */
export function createErrorClass<T>(createImpl: (_super: any) => any): T {
  const _super = (instance: any) => {
    Error.call(instance);
    instance.stack = new Error().stack;
  };

  const ctorFunc = createImpl(_super);
  ctorFunc.prototype = Object.create(Error.prototype);
  ctorFunc.prototype.constructor = ctorFunc;
  return ctorFunc;
}
v 	x eexport function createObject(keys: string[], values: any[]) {
  return keys.reduce((result, key, i) => ((result[key] = values[i]), result), {} as any);
}
%5Mx-import { config } from '../config';

let context: { errorThrown: boolean; error: any } | null = null;

/**
 * Handles dealing with errors for super-gross mode. Creates a context, in which
 * any synchronously thrown errors will be passed to {@link captureError}. Which
 * will record the error such that it will be rethrown after the call back is complete.
 * TODO: Remove in v8
 * @param cb An immediately executed function.
 */
export function errorContext(cb: () => void) {
  if (config.useDeprecatedSynchronousErrorHandling) {
    const isRoot = !context;
    if (isRoot) {
      context = { errorThrown: false, error: null };
    }
    cb();
    if (isRoot) {
      const { errorThrown, error } = context!;
      context = null;
      if (errorThrown) {
        throw error;
      }
    }
  } else {
    // This is the general non-deprecated path for everyone that
    // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)
    cb();
  }
}

/**
 * Captures errors only in super-gross mode.
 * @param err the error to capture
 */
export function captureError(err: any) {
  if (config.useDeprecatedSynchronousErrorHandling && context) {
    context.errorThrown = true;
    context.error = err;
  }
}
Mx$import { Subscription } from '../Subscription';
import { SchedulerAction, SchedulerLike } from '../types';

export function executeSchedule(
  parentSubscription: Subscription,
  scheduler: SchedulerLike,
  work: () => void,
  delay: number,
  repeat: true
): void;
export function executeSchedule(
  parentSubscription: Subscription,
  scheduler: SchedulerLike,
  work: () => void,
  delay?: number,
  repeat?: false
): Subscription;

export function executeSchedule(
  parentSubscription: Subscription,
  scheduler: SchedulerLike,
  work: () => void,
  delay = 0,
  repeat = false
): Subscription | void {
  const scheduleSubscription = scheduler.schedule(function (this: SchedulerAction<any>) {
    work();
    if (repeat) {
      parentSubscription.add(this.schedule(null, delay));
    } else {
      this.unsubscribe();
    }
  }, delay);

  parentSubscription.add(scheduleSubscription);

  if (!repeat) {
    // Because user-land scheduler implementations are unlikely to properly reuse
    // Actions for repeat scheduling, we can't trust that the returned subscription
    // will control repeat subscription scenarios. So we're trying to avoid using them
    // incorrectly within this library.
    return scheduleSubscription;
  }
}
Ax/**
 * This function takes one parameter and just returns it. Simply put,
 * this is like `<T>(x: T): T => x`.
 *
 * ## Examples
 *
 * This is useful in some cases when using things like `mergeMap`
 *
 * ```ts
 * import { interval, take, map, range, mergeMap, identity } from 'rxjs';
 *
 * const source$ = interval(1000).pipe(take(5));
 *
 * const result$ = source$.pipe(
 *   map(i => range(i)),
 *   mergeMap(identity) // same as mergeMap(x => x)
 * );
 *
 * result$.subscribe({
 *   next: console.log
 * });
 * ```
 *
 * Or when you want to selectively apply an operator
 *
 * ```ts
 * import { interval, take, identity } from 'rxjs';
 *
 * const shouldLimit = () => Math.random() < 0.5;
 *
 * const source$ = interval(1000);
 *
 * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);
 *
 * result$.subscribe({
 *   next: console.log
 * });
 * ```
 *
 * @param x Any value that is returned by this function
 * @returns The value passed as the first parameter to this function
 */
export function identity<T>(x: T): T {
  return x;
}
_Hx| export const isArrayLike = (<T>(x: any): x is ArrayLike<T> => x && typeof x.length === 'number' && typeof x !== 'function');'x ?import { isFunction } from './isFunction';

export function isAsyncIterable<T>(obj: any): obj is AsyncIterable<T> {
  return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);
}
Cxk/**
 * Checks to see if a value is not only a `Date` object,
 * but a *valid* `Date` object that can be converted to a
 * number. For example, `new Date('blah')` is indeed an
 * `instanceof Date`, however it cannot be converted to a
 * number.
 */
export function isValidDate(value: any): value is Date {
  return value instanceof Date && !isNaN(value as any);
}
hxx 4/**
 * Returns true if the object is a function.
 * @param value The value to check
 */
export function isFunction(value: any): value is (...args: any[]) => any {
  return typeof value === 'function';
}
Bxzimport { InteropObservable } from '../types';
import { observable as Symbol_observable } from '../symbol/observable';
import { isFunction } from './isFunction';

/** Identifies an input as being Observable (but not necessary an Rx Observable) */
export function isInteropObservable(input: any): input is InteropObservable<any> {
  return isFunction(input[Symbol_observable]);
}
`hximport { iterator as Symbol_iterator } from '../symbol/iterator';
import { isFunction } from './isFunction';

/** Identifies an input as being an Iterable */
export function isIterable(input: any): input is Iterable<any> {
  return isFunction(input?.[Symbol_iterator]);
}
S`Gx/** prettier */
import { Observable } from '../Observable';
import { isFunction } from './isFunction';

/**
 * Tests to see if the object is an RxJS {@link Observable}
 * @param obj the object to test
 */
export function isObservable(obj: any): obj is Observable<unknown> {
  // The !! is to ensure that this publicly exposed function returns
  // `false` if something like `null` or `0` is passed.
  return !!obj && (obj instanceof Observable || (isFunction(obj.lift) && isFunction(obj.subscribe)));
}
/x import { isFunction } from "./isFunction";

/**
 * Tests to see if the object is "thennable".
 * @param value the object to test
 */
export function isPromise(value: any): value is PromiseLike<any> {
  return isFunction(value?.then);
}
,O,x?import { ReadableStreamLike } from '../types';
import { isFunction } from './isFunction';

export async function* readableStreamLikeToAsyncGenerator<T>(readableStream: ReadableStreamLike<T>): AsyncGenerator<T> {
  const reader = readableStream.getReader();
  try {
    while (true) {
      const { value, done } = await reader.read();
      if (done) {
        return;
      }
      yield value!;
    }
  } finally {
    reader.releaseLock();
  }
}

export function isReadableStreamLike<T>(obj: any): obj is ReadableStreamLike<T> {
  // We don't want to use instanceof checks because they would return
  // false for instances from another Realm, like an <iframe>.
  return isFunction(obj?.getReader);
}
9x 7import { SchedulerLike } from '../types';
import { isFunction } from './isFunction';

export function isScheduler(value: any): value is SchedulerLike {
  return value && isFunction(value.schedule);
}
VF3ExYimport { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { OperatorFunction } from '../types';
import { isFunction } from './isFunction';

/**
 * Used to determine if an object is an Observable with a lift function.
 */
export function hasLift(source: any): source is { lift: InstanceType<typeof Observable>['lift'] } {
  return isFunction(source?.lift);
}

/**
 * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.
 * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.
 */
export function operate<T, R>(
  init: (liftedSource: Observable<T>, subscriber: Subscriber<R>) => (() => void) | void
): OperatorFunction<T, R> {
  return (source: Observable<T>) => {
    if (hasLift(source)) {
      return source.lift(function (this: Subscriber<R>, liftedSource: Observable<T>) {
        try {
          return init(liftedSource, this);
        } catch (err) {
          this.error(err);
        }
      });
    }
    throw new TypeError('Unable to lift unknown Observable type');
  };
}
Ho!ximport { OperatorFunction } from "../types";
import { map } from "../operators/map";

const { isArray } = Array;

function callOrApply<T, R>(fn: ((...values: T[]) => R), args: T|T[]): R {
    return isArray(args) ? fn(...args) : fn(args);
}

/**
 * Used in several -- mostly deprecated -- situations where we need to 
 * apply a list of arguments or a single argument to a result selector.
 */
export function mapOneOrManyArgs<T, R>(fn: ((...values: T[]) => R)): OperatorFunction<T|T[], R> {
    return map(args => callOrApply(fn, args))
}x9 /* tslint:disable:no-empty */
export function noop() { }
Fx ;export function not<T>(pred: (value: T, index: number) => boolean, thisArg: any): (value: T, index: number) => boolean {
  return (value: T, index: number) => !pred.call(thisArg, value, index); 
}r@x4import { identity } from './identity';
import { UnaryFunction } from '../types';

export function pipe(): typeof identity;
export function pipe<T, A>(fn1: UnaryFunction<T, A>): UnaryFunction<T, A>;
export function pipe<T, A, B>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>): UnaryFunction<T, B>;
export function pipe<T, A, B, C>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>): UnaryFunction<T, C>;
export function pipe<T, A, B, C, D>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>
): UnaryFunction<T, D>;
export function pipe<T, A, B, C, D, E>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>
): UnaryFunction<T, E>;
export function pipe<T, A, B, C, D, E, F>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>
): UnaryFunction<T, F>;
export function pipe<T, A, B, C, D, E, F, G>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>,
  fn7: UnaryFunction<F, G>
): UnaryFunction<T, G>;
export function pipe<T, A, B, C, D, E, F, G, H>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>,
  fn7: UnaryFunction<F, G>,
  fn8: UnaryFunction<G, H>
): UnaryFunction<T, H>;
export function pipe<T, A, B, C, D, E, F, G, H, I>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>,
  fn7: UnaryFunction<F, G>,
  fn8: UnaryFunction<G, H>,
  fn9: UnaryFunction<H, I>
): UnaryFunction<T, I>;
export function pipe<T, A, B, C, D, E, F, G, H, I>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>,
  fn7: UnaryFunction<F, G>,
  fn8: UnaryFunction<G, H>,
  fn9: UnaryFunction<H, I>,
  ...fns: UnaryFunction<any, any>[]
): UnaryFunction<T, unknown>;

/**
 * pipe() can be called on one or more functions, each of which can take one argument ("UnaryFunction")
 * and uses it to return a value.
 * It returns a function that takes one argument, passes it to the first UnaryFunction, and then
 * passes the result to the next one, passes that result to the next one, and so on.  
 */
export function pipe(...fns: Array<UnaryFunction<any, any>>): UnaryFunction<any, any> {
  return pipeFromArray(fns);
}

/** @internal */
export function pipeFromArray<T, R>(fns: Array<UnaryFunction<T, R>>): UnaryFunction<T, R> {
  if (fns.length === 0) {
    return identity as UnaryFunction<any, any>;
  }

  if (fns.length === 1) {
    return fns[0];
  }

  return function piped(input: T): R {
    return fns.reduce((prev: any, fn: UnaryFunction<T, R>) => fn(prev), input as any);
  };
}
Q8xyimport { config } from '../config';
import { timeoutProvider } from '../scheduler/timeoutProvider';

/**
 * Handles an error on another job either with the user-configured {@link onUnhandledError},
 * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.
 *
 * This should be called whenever there is an error that is out-of-band with the subscription
 * or when an error hits a terminal boundary of the subscription and no error handler was provided.
 *
 * @param err the error to report
 */
export function reportUnhandledError(err: any) {
  timeoutProvider.setTimeout(() => {
    const { onUnhandledError } = config;
    if (onUnhandledError) {
      // Execute the user-configured error handler.
      onUnhandledError(err);
    } else {
      // Throw so it is picked up by the runtime's uncaught error mechanism.
      throw err;
    }
  });
}
\O27xzimport { Subscriber } from '../Subscriber';

/**
 * Subscribes to an ArrayLike with a subscriber
 * @param array The array or array-like to subscribe to
 */
export const subscribeToArray = <T>(array: ArrayLike<T>) => (subscriber: Subscriber<T>) => {
  for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {
    subscriber.next(array[i]);
  }
  subscriber.complete();
};
 #x4/**
 * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.
 * @param input The object that was passed.
 */
export function createInvalidObservableTypeError(input: any) {
  // TODO: We should create error codes that can be looked up, so this can be less verbose.
  return new TypeError(
    `You provided ${
      input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`
    } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`
  );
}
exR// Instead of using any - or another less-than-ideal type - to workaround a
// TypeScript problem or bug, create a type alias and use that instead.
// Wherever possible, use a TypeScript issue number in the type - something
// like TS_18757 - or use a descriptive name and leave a detailed comment
// alongside the type alias.

export {}
txz/* Operator exports */
export { audit } from '../internal/operators/audit';
export { auditTime } from '../internal/operators/auditTime';
export { buffer } from '../internal/operators/buffer';
export { bufferCount } from '../internal/operators/bufferCount';
export { bufferTime } from '../internal/operators/bufferTime';
export { bufferToggle } from '../internal/operators/bufferToggle';
export { bufferWhen } from '../internal/operators/bufferWhen';
export { catchError } from '../internal/operators/catchError';
export { combineAll } from '../internal/operators/combineAll';
export { combineLatestAll } from '../internal/operators/combineLatestAll';
export { combineLatest } from '../internal/operators/combineLatest';
export { combineLatestWith } from '../internal/operators/combineLatestWith';
export { concat } from '../internal/operators/concat';
export { concatAll } from '../internal/operators/concatAll';
export { concatMap } from '../internal/operators/concatMap';
export { concatMapTo } from '../internal/operators/concatMapTo';
export { concatWith } from '../internal/operators/concatWith';
export { connect, ConnectConfig } from '../internal/operators/connect';
export { count } from '../internal/operators/count';
export { debounce } from '../internal/operators/debounce';
export { debounceTime } from '../internal/operators/debounceTime';
export { defaultIfEmpty } from '../internal/operators/defaultIfEmpty';
export { delay } from '../internal/operators/delay';
export { delayWhen } from '../internal/operators/delayWhen';
export { dematerialize } from '../internal/operators/dematerialize';
export { distinct } from '../internal/operators/distinct';
export { distinctUntilChanged } from '../internal/operators/distinctUntilChanged';
export { distinctUntilKeyChanged } from '../internal/operators/distinctUntilKeyChanged';
export { elementAt } from '../internal/operators/elementAt';
export { endWith } from '../internal/operators/endWith';
export { every } from '../internal/operators/every';
export { exhaust } from '../internal/operators/exhaust';
export { exhaustAll } from '../internal/operators/exhaustAll';
export { exhaustMap } from '../internal/operators/exhaustMap';
export { expand } from '../internal/operators/expand';
export { filter } from '../internal/operators/filter';
export { finalize } from '../internal/operators/finalize';
export { find } from '../internal/operators/find';
export { findIndex } from '../internal/operators/findIndex';
export { first } from '../internal/operators/first';
export { groupBy, BasicGroupByOptions, GroupByOptionsWithElement } from '../internal/operators/groupBy';
export { ignoreElements } from '../internal/operators/ignoreElements';
export { isEmpty } from '../internal/operators/isEmpty';
export { last } from '../internal/operators/last';
export { map } from '../internal/operators/map';
export { mapTo } from '../internal/operators/mapTo';
export { materialize } from '../internal/operators/materialize';
export { max } from '../internal/operators/max';
export { merge } from '../internal/operators/merge';
export { mergeAll } from '../internal/operators/mergeAll';
export { flatMap } from '../internal/operators/flatMap';
export { mergeMap } from '../internal/operators/mergeMap';
export { mergeMapTo } from '../internal/operators/mergeMapTo';
export { mergeScan } from '../internal/operators/mergeScan';
export { mergeWith } from '../internal/operators/mergeWith';
export { min } from '../internal/operators/min';
export { multicast } from '../internal/operators/multicast';
export { observeOn } from '../internal/operators/observeOn';
export { onErrorResumeNext } from '../internal/operators/onErrorResumeNextWith';
export { pairwise } from '../internal/operators/pairwise';
export { partition } from '../internal/operators/partition';
export { pluck } from '../internal/operators/pluck';
export { publish } from '../internal/operators/publish';
export { publishBehavior } from '../internal/operators/publishBehavior';
export { publishLast } from '../internal/operators/publishLast';
export { publishReplay } from '../internal/operators/publishReplay';
export { race } from '../internal/operators/race';
export { raceWith } from '../internal/operators/raceWith';
export { reduce } from '../internal/operators/reduce';
export { repeat, RepeatConfig } from '../internal/operators/repeat';
export { repeatWhen } from '../internal/operators/repeatWhen';
export { retry, RetryConfig } from '../internal/operators/retry';
export { retryWhen } from '../internal/operators/retryWhen';
export { refCount } from '../internal/operators/refCount';
export { sample } from '../internal/operators/sample';
export { sampleTime } from '../internal/operators/sampleTime';
export { scan } from '../internal/operators/scan';
export { sequenceEqual } from '../internal/operators/sequenceEqual';
export { share, ShareConfig } from '../internal/operators/share';
export { shareReplay, ShareReplayConfig } from '../internal/operators/shareReplay';
export { single } from '../internal/operators/single';
export { skip } from '../internal/operators/skip';
export { skipLast } from '../internal/operators/skipLast';
export { skipUntil } from '../internal/operators/skipUntil';
export { skipWhile } from '../internal/operators/skipWhile';
export { startWith } from '../internal/operators/startWith';
export { subscribeOn } from '../internal/operators/subscribeOn';
export { switchAll } from '../internal/operators/switchAll';
export { switchMap } from '../internal/operators/switchMap';
export { switchMapTo } from '../internal/operators/switchMapTo';
export { switchScan } from '../internal/operators/switchScan';
export { take } from '../internal/operators/take';
export { takeLast } from '../internal/operators/takeLast';
export { takeUntil } from '../internal/operators/takeUntil';
export { takeWhile } from '../internal/operators/takeWhile';
export { tap, TapObserver } from '../internal/operators/tap';
export { throttle, ThrottleConfig } from '../internal/operators/throttle';
export { throttleTime } from '../internal/operators/throttleTime';
export { throwIfEmpty } from '../internal/operators/throwIfEmpty';
export { timeInterval } from '../internal/operators/timeInterval';
export { timeout, TimeoutConfig, TimeoutInfo } from '../internal/operators/timeout';
export { timeoutWith } from '../internal/operators/timeoutWith';
export { timestamp } from '../internal/operators/timestamp';
export { toArray } from '../internal/operators/toArray';
export { window } from '../internal/operators/window';
export { windowCount } from '../internal/operators/windowCount';
export { windowTime } from '../internal/operators/windowTime';
export { windowToggle } from '../internal/operators/windowToggle';
export { windowWhen } from '../internal/operators/windowWhen';
export { withLatestFrom } from '../internal/operators/withLatestFrom';
export { zip } from '../internal/operators/zip';
export { zipAll } from '../internal/operators/zipAll';
export { zipWith } from '../internal/operators/zipWith';
ƿxO export { TestScheduler, RunHelpers } from '../internal/testing/TestScheduler';
x 7{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "noEmit": false,
    "baseUrl": ".",
    "paths": {
      "rxjs": ["./"],
      "rxjs/*": ["./*"]
    }
  },
  "include": ["./**/*.ts"]
}
3x ,{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "downlevelIteration": true,
    "outDir": "../dist/cjs"
  },
  "exclude": ["./internal/umd.ts"]
}
{s?Nx{
  "extends": "./tsconfig.cjs.json",
  /**
   * this is pseudo config for test case's relative path resolution to `../src`, runs
   * cjs config once more instead of manual copying to utilize incremental build.
   */
  "compilerOptions": {
    "outDir": "../dist/src"
  }
}
jYX
x T{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "module": "esnext",
    "importHelpers": true,
    "target": "es2015",
    "outDir": "../dist/esm"
  }
}
wi1Ƚx {
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "module": "esnext",
    "importHelpers": true,
    "target": "es5",
    "downlevelIteration": true,
    "outDir": "../dist/esm5"
  },
  "exclude": ["./internal/umd.ts"]
}
}gG;	x g{
  "extends": "./tsconfig.esm5.json",
  "compilerOptions": {
    "outDir": "../dist/esm5_for_rollup",
    "noEmitHelpers": true
  },
  "exclude": []
}
 o.xG{
  "extends": "./tsconfig.esm.json",
  "compilerOptions": {
    "composite": true,
    "module": "es2015",
    "target": "esnext",
    "removeComments": false,
    "declaration": true,
    "declarationMap": true,
    "declarationDir": "../dist/types",
    "emitDeclarationOnly": true
  },
  "exclude": ["./internal/umd.ts"]
}
Icx s{
  "extends": "./tsconfig.types.json",
  "compilerOptions": {
    "declarationDir": "../dist/types_spec",
    "stripInternal": false
  }
}
X},bx Hexport { webSocket as webSocket } from '../internal/observable/dom/webSocket';
export { WebSocketSubject, WebSocketSubjectConfig } from '../internal/observable/dom/WebSocketSubject';
RBgx {
  "name": "rxjs/testing",
  "types": "../dist/types/testing/index.d.ts",
  "main": "../dist/cjs/testing/index.js",
  "module": "../dist/esm5/testing/index.js",
  "es2015": "../dist/esm/testing/index.js",
  "sideEffects": false
}
H6+xK{
  "compilerOptions": {
    "incremental": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true,
    "strict": true,
    "noImplicitReturns": true,
    "moduleResolution": "node",
    "stripInternal": true,
    "noEmit": true,
    "lib": [
      "esnext",
      "dom"
    ],
    "target": "esnext",
    "baseUrl": ".",
    "paths": {
      "rxjs": ["./src/index"],
      "rxjs/operators": ["./src/operators/index"],
      "rxjs/testing": ["./src/testing/index"],
      "rxjs/ajax": ["./src/ajax/index"],
      "rxjs/webSocket": ["./src/webSocket/index"],
      "rxjs/fetch": ["./src/fetch/index"],
      "rxjs/internal/*": ["./src/internal/*"]
    }
  }
}
ʋx {
  "name": "rxjs/webSocket",
  "types": "../dist/types/webSocket/index.d.ts",
  "main": "../dist/cjs/webSocket/index.js",
  "module": "../dist/esm5/webSocket/index.js",
  "es2015": "../dist/esm/webSocket/index.js",
  "sideEffects": false
}
K3x6/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */

 ԫ(xpCopyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.*9x># tslib

This is a runtime library for [TypeScript](https://www.typescriptlang.org/) that contains all of the TypeScript helper functions.

This library is primarily used by the `--importHelpers` flag in TypeScript.
When using `--importHelpers`, a module that uses helper functions like `__extends` and `__assign` in the following emitted file:

```ts
var __assign = (this && this.__assign) || Object.assign || function(t) {
    for (var s, i = 1, n = arguments.length; i < n; i++) {
        s = arguments[i];
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
            t[p] = s[p];
    }
    return t;
};
exports.x = {};
exports.y = __assign({}, exports.x);

```

will instead be emitted as something like the following:

```ts
var tslib_1 = require("tslib");
exports.x = {};
exports.y = tslib_1.__assign({}, exports.x);
```

Because this can avoid duplicate declarations of things like `__extends`, `__assign`, etc., this means delivering users smaller files on average, as well as less runtime overhead.
For optimized bundles with TypeScript, you should absolutely consider using `tslib` and `--importHelpers`.

# Installing

For the latest stable version, run:

## npm

```sh
# TypeScript 3.9.2 or later
npm install tslib

# TypeScript 3.8.4 or earlier
npm install tslib@^1

# TypeScript 2.3.2 or earlier
npm install tslib@1.6.1
```

## yarn

```sh
# TypeScript 3.9.2 or later
yarn add tslib

# TypeScript 3.8.4 or earlier
yarn add tslib@^1

# TypeScript 2.3.2 or earlier
yarn add tslib@1.6.1
```

## bower

```sh
# TypeScript 3.9.2 or later
bower install tslib

# TypeScript 3.8.4 or earlier
bower install tslib@^1

# TypeScript 2.3.2 or earlier
bower install tslib@1.6.1
```

## JSPM

```sh
# TypeScript 3.9.2 or later
jspm install tslib

# TypeScript 3.8.4 or earlier
jspm install tslib@^1

# TypeScript 2.3.2 or earlier
jspm install tslib@1.6.1
```

# Usage

Set the `importHelpers` compiler option on the command line:

```
tsc --importHelpers file.ts
```

or in your tsconfig.json:

```json
{
    "compilerOptions": {
        "importHelpers": true
    }
}
```

#### For bower and JSPM users

You will need to add a `paths` mapping for `tslib`, e.g. For Bower users:

```json
{
    "compilerOptions": {
        "module": "amd",
        "importHelpers": true,
        "baseUrl": "./",
        "paths": {
            "tslib" : ["bower_components/tslib/tslib.d.ts"]
        }
    }
}
```

For JSPM users:

```json
{
    "compilerOptions": {
        "module": "system",
        "importHelpers": true,
        "baseUrl": "./",
        "paths": {
            "tslib" : ["jspm_packages/npm/tslib@2.x.y/tslib.d.ts"]
        }
    }
}
```

## Deployment

- Choose your new version number
- Set it in `package.json` and `bower.json`
- Create a tag: `git tag [version]`
- Push the tag: `git push --tags`
- Create a [release in GitHub](https://github.com/microsoft/tslib/releases)
- Run the [publish to npm](https://github.com/microsoft/tslib/actions?query=workflow%3A%22Publish+to+NPM%22) workflow

Done.

# Contribute

There are many ways to [contribute](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md) to TypeScript.

* [Submit bugs](https://github.com/Microsoft/TypeScript/issues) and help us verify fixes as they are checked in.
* Review the [source code changes](https://github.com/Microsoft/TypeScript/pulls).
* Engage with other TypeScript users and developers on [StackOverflow](http://stackoverflow.com/questions/tagged/typescript).
* Join the [#typescript](http://twitter.com/#!/search/realtime/%23typescript) discussion on Twitter.
* [Contribute bug fixes](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md).

# Documentation

* [Quick tutorial](http://www.typescriptlang.org/Tutorial)
* [Programming handbook](http://www.typescriptlang.org/Handbook)
* [Homepage](http://www.typescriptlang.org/)
l%Bx
:<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->

## Security

Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).

If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.

## Reporting Security Issues

**Please do not report security vulnerabilities through public GitHub issues.**

Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).

If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).

You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 

Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:

  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
  * Full paths of source file(s) related to the manifestation of the issue
  * The location of the affected source code (tag/branch/commit or direct URL)
  * Any special configuration required to reproduce the issue
  * Step-by-step instructions to reproduce the issue
  * Proof-of-concept or exploit code (if possible)
  * Impact of the issue, including how an attacker might exploit the issue

This information will help us triage your report more quickly.

If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.

## Preferred Languages

We prefer all communications to be in English.

## Policy

Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).

<!-- END MICROSOFT SECURITY.MD BLOCK -->
y{2x!// Note: named reexports are used instead of `export *` because
// TypeScript itself doesn't resolve the `export *` when checking
// if a particular helper exists.
export {
  __extends,
  __assign,
  __rest,
  __decorate,
  __param,
  __esDecorate,
  __runInitializers,
  __propKey,
  __setFunctionName,
  __metadata,
  __awaiter,
  __generator,
  __exportStar,
  __values,
  __read,
  __spread,
  __spreadArrays,
  __spreadArray,
  __await,
  __asyncGenerator,
  __asyncDelegator,
  __asyncValues,
  __makeTemplateObject,
  __importStar,
  __importDefault,
  __classPrivateFieldGet,
  __classPrivateFieldSet,
  __classPrivateFieldIn,
  __createBinding,
  __addDisposableResource,
  __disposeResources,
  __rewriteRelativeImportExtension,
} from '../tslib.js';
export * as default from '../tslib.js';
ѸXxwimport tslib from '../tslib.js';
const {
    __extends,
    __assign,
    __rest,
    __decorate,
    __param,
    __esDecorate,
    __runInitializers,
    __propKey,
    __setFunctionName,
    __metadata,
    __awaiter,
    __generator,
    __exportStar,
    __createBinding,
    __values,
    __read,
    __spread,
    __spreadArrays,
    __spreadArray,
    __await,
    __asyncGenerator,
    __asyncDelegator,
    __asyncValues,
    __makeTemplateObject,
    __importStar,
    __importDefault,
    __classPrivateFieldGet,
    __classPrivateFieldSet,
    __classPrivateFieldIn,
    __addDisposableResource,
    __disposeResources,
    __rewriteRelativeImportExtension,
} = tslib;
export {
    __extends,
    __assign,
    __rest,
    __decorate,
    __param,
    __esDecorate,
    __runInitializers,
    __propKey,
    __setFunctionName,
    __metadata,
    __awaiter,
    __generator,
    __exportStar,
    __createBinding,
    __values,
    __read,
    __spread,
    __spreadArrays,
    __spreadArray,
    __await,
    __asyncGenerator,
    __asyncDelegator,
    __asyncValues,
    __makeTemplateObject,
    __importStar,
    __importDefault,
    __classPrivateFieldGet,
    __classPrivateFieldSet,
    __classPrivateFieldIn,
    __addDisposableResource,
    __disposeResources,
    __rewriteRelativeImportExtension,
};
export default tslib;
(Ⱥx {
    "type": "module"
}U0ѳLx<{
    "name": "tslib",
    "author": "Microsoft Corp.",
    "homepage": "https://www.typescriptlang.org/",
    "version": "2.8.1",
    "license": "0BSD",
    "description": "Runtime library for TypeScript helper functions",
    "keywords": [
        "TypeScript",
        "Microsoft",
        "compiler",
        "language",
        "javascript",
        "tslib",
        "runtime"
    ],
    "bugs": {
        "url": "https://github.com/Microsoft/TypeScript/issues"
    },
    "repository": {
        "type": "git",
        "url": "https://github.com/Microsoft/tslib.git"
    },
    "main": "tslib.js",
    "module": "tslib.es6.js",
    "jsnext:main": "tslib.es6.js",
    "typings": "tslib.d.ts",
    "sideEffects": false,
    "exports": {
        ".": {
            "module": {
                "types": "./modules/index.d.ts",
                "default": "./tslib.es6.mjs"
            },
            "import": {
                "node": "./modules/index.js",
                "default": {
                    "types": "./modules/index.d.ts",
                    "default": "./tslib.es6.mjs"
                }
            },
            "default": "./tslib.js"
        },
        "./*": "./*",
        "./": "./"
    }
}
8սxGr/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */

/**
 * Used to shim class extends.
 *
 * @param d The derived class.
 * @param b The base class.
 */
export declare function __extends(d: Function, b: Function): void;

/**
 * Copy the values of all of the enumerable own properties from one or more source objects to a
 * target object. Returns the target object.
 *
 * @param t The target object to copy to.
 * @param sources One or more source objects from which to copy properties
 */
export declare function __assign(t: any, ...sources: any[]): any;

/**
 * Performs a rest spread on an object.
 *
 * @param t The source value.
 * @param propertyNames The property names excluded from the rest spread.
 */
export declare function __rest(t: any, propertyNames: (string | symbol)[]): any;

/**
 * Applies decorators to a target object
 *
 * @param decorators The set of decorators to apply.
 * @param target The target object.
 * @param key If specified, the own property to apply the decorators to.
 * @param desc The property descriptor, defaults to fetching the descriptor from the target object.
 * @experimental
 */
export declare function __decorate(decorators: Function[], target: any, key?: string | symbol, desc?: any): any;

/**
 * Creates an observing function decorator from a parameter decorator.
 *
 * @param paramIndex The parameter index to apply the decorator to.
 * @param decorator The parameter decorator to apply. Note that the return value is ignored.
 * @experimental
 */
export declare function __param(paramIndex: number, decorator: Function): Function;

/**
 * Applies decorators to a class or class member, following the native ECMAScript decorator specification.
 * @param ctor For non-field class members, the class constructor. Otherwise, `null`.
 * @param descriptorIn The `PropertyDescriptor` to use when unable to look up the property from `ctor`.
 * @param decorators The decorators to apply
 * @param contextIn The `DecoratorContext` to clone for each decorator application.
 * @param initializers An array of field initializer mutation functions into which new initializers are written.
 * @param extraInitializers An array of extra initializer functions into which new initializers are written.
 */
export declare function __esDecorate(ctor: Function | null, descriptorIn: object | null, decorators: Function[], contextIn: object, initializers: Function[] | null, extraInitializers: Function[]): void;

/**
 * Runs field initializers or extra initializers generated by `__esDecorate`.
 * @param thisArg The `this` argument to use.
 * @param initializers The array of initializers to evaluate.
 * @param value The initial value to pass to the initializers.
 */
export declare function __runInitializers(thisArg: unknown, initializers: Function[], value?: any): any;

/**
 * Converts a computed property name into a `string` or `symbol` value.
 */
export declare function __propKey(x: any): string | symbol;

/**
 * Assigns the name of a function derived from the left-hand side of an assignment.
 * @param f The function to rename.
 * @param name The new name for the function.
 * @param prefix A prefix (such as `"get"` or `"set"`) to insert before the name.
 */
export declare function __setFunctionName(f: Function, name: string | symbol, prefix?: string): Function;

/**
 * Creates a decorator that sets metadata.
 *
 * @param metadataKey The metadata key
 * @param metadataValue The metadata value
 * @experimental
 */
export declare function __metadata(metadataKey: any, metadataValue: any): Function;

/**
 * Converts a generator function into a pseudo-async function, by treating each `yield` as an `await`.
 *
 * @param thisArg The reference to use as the `this` value in the generator function
 * @param _arguments The optional arguments array
 * @param P The optional promise constructor argument, defaults to the `Promise` property of the global object.
 * @param generator The generator function
 */
export declare function __awaiter(thisArg: any, _arguments: any, P: Function, generator: Function): any;

/**
 * Creates an Iterator object using the body as the implementation.
 *
 * @param thisArg The reference to use as the `this` value in the function
 * @param body The generator state-machine based implementation.
 *
 * @see [./docs/generator.md]
 */
export declare function __generator(thisArg: any, body: Function): any;

/**
 * Creates bindings for all enumerable properties of `m` on `exports`
 *
 * @param m The source object
 * @param o The `exports` object.
 */
export declare function __exportStar(m: any, o: any): void;

/**
 * Creates a value iterator from an `Iterable` or `ArrayLike` object.
 *
 * @param o The object.
 * @throws {TypeError} If `o` is neither `Iterable`, nor an `ArrayLike`.
 */
export declare function __values(o: any): any;

/**
 * Reads values from an `Iterable` or `ArrayLike` object and returns the resulting array.
 *
 * @param o The object to read from.
 * @param n The maximum number of arguments to read, defaults to `Infinity`.
 */
export declare function __read(o: any, n?: number): any[];

/**
 * Creates an array from iterable spread.
 *
 * @param args The Iterable objects to spread.
 * @deprecated since TypeScript 4.2 - Use `__spreadArray`
 */
export declare function __spread(...args: any[][]): any[];

/**
 * Creates an array from array spread.
 *
 * @param args The ArrayLikes to spread into the resulting array.
 * @deprecated since TypeScript 4.2 - Use `__spreadArray`
 */
export declare function __spreadArrays(...args: any[][]): any[];

/**
 * Spreads the `from` array into the `to` array.
 *
 * @param pack Replace empty elements with `undefined`.
 */
export declare function __spreadArray(to: any[], from: any[], pack?: boolean): any[];

/**
 * Creates an object that signals to `__asyncGenerator` that it shouldn't be yielded,
 * and instead should be awaited and the resulting value passed back to the generator.
 *
 * @param v The value to await.
 */
export declare function __await(v: any): any;

/**
 * Converts a generator function into an async generator function, by using `yield __await`
 * in place of normal `await`.
 *
 * @param thisArg The reference to use as the `this` value in the generator function
 * @param _arguments The optional arguments array
 * @param generator The generator function
 */
export declare function __asyncGenerator(thisArg: any, _arguments: any, generator: Function): any;

/**
 * Used to wrap a potentially async iterator in such a way so that it wraps the result
 * of calling iterator methods of `o` in `__await` instances, and then yields the awaited values.
 *
 * @param o The potentially async iterator.
 * @returns A synchronous iterator yielding `__await` instances on every odd invocation
 *          and returning the awaited `IteratorResult` passed to `next` every even invocation.
 */
export declare function __asyncDelegator(o: any): any;

/**
 * Creates a value async iterator from an `AsyncIterable`, `Iterable` or `ArrayLike` object.
 *
 * @param o The object.
 * @throws {TypeError} If `o` is neither `AsyncIterable`, `Iterable`, nor an `ArrayLike`.
 */
export declare function __asyncValues(o: any): any;

/**
 * Creates a `TemplateStringsArray` frozen object from the `cooked` and `raw` arrays.
 *
 * @param cooked The cooked possibly-sparse array.
 * @param raw The raw string content.
 */
export declare function __makeTemplateObject(cooked: string[], raw: string[]): TemplateStringsArray;

/**
 * Used to shim default and named imports in ECMAScript Modules transpiled to CommonJS.
 *
 * ```js
 * import Default, { Named, Other } from "mod";
 * // or
 * import { default as Default, Named, Other } from "mod";
 * ```
 *
 * @param mod The CommonJS module exports object.
 */
export declare function __importStar<T>(mod: T): T;

/**
 * Used to shim default imports in ECMAScript Modules transpiled to CommonJS.
 *
 * ```js
 * import Default from "mod";
 * ```
 *
 * @param mod The CommonJS module exports object.
 */
export declare function __importDefault<T>(mod: T): T | { default: T };

/**
 * Emulates reading a private instance field.
 *
 * @param receiver The instance from which to read the private field.
 * @param state A WeakMap containing the private field value for an instance.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 *
 * @throws {TypeError} If `state` doesn't have an entry for `receiver`.
 */
export declare function __classPrivateFieldGet<T extends object, V>(
    receiver: T,
    state: { has(o: T): boolean, get(o: T): V | undefined },
    kind?: "f"
): V;

/**
 * Emulates reading a private static field.
 *
 * @param receiver The object from which to read the private static field.
 * @param state The class constructor containing the definition of the static field.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 * @param f The descriptor that holds the static field value.
 *
 * @throws {TypeError} If `receiver` is not `state`.
 */
export declare function __classPrivateFieldGet<T extends new (...args: any[]) => unknown, V>(
    receiver: T,
    state: T,
    kind: "f",
    f: { value: V }
): V;

/**
 * Emulates evaluating a private instance "get" accessor.
 *
 * @param receiver The instance on which to evaluate the private "get" accessor.
 * @param state A WeakSet used to verify an instance supports the private "get" accessor.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 * @param f The "get" accessor function to evaluate.
 *
 * @throws {TypeError} If `state` doesn't have an entry for `receiver`.
 */
export declare function __classPrivateFieldGet<T extends object, V>(
    receiver: T,
    state: { has(o: T): boolean },
    kind: "a",
    f: () => V
): V;

/**
 * Emulates evaluating a private static "get" accessor.
 *
 * @param receiver The object on which to evaluate the private static "get" accessor.
 * @param state The class constructor containing the definition of the static "get" accessor.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 * @param f The "get" accessor function to evaluate.
 *
 * @throws {TypeError} If `receiver` is not `state`.
 */
export declare function __classPrivateFieldGet<T extends new (...args: any[]) => unknown, V>(
    receiver: T,
    state: T,
    kind: "a",
    f: () => V
): V;

/**
 * Emulates reading a private instance method.
 *
 * @param receiver The instance from which to read a private method.
 * @param state A WeakSet used to verify an instance supports the private method.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 * @param f The function to return as the private instance method.
 *
 * @throws {TypeError} If `state` doesn't have an entry for `receiver`.
 */
export declare function __classPrivateFieldGet<T extends object, V extends (...args: any[]) => unknown>(
    receiver: T,
    state: { has(o: T): boolean },
    kind: "m",
    f: V
): V;

/**
 * Emulates reading a private static method.
 *
 * @param receiver The object from which to read the private static method.
 * @param state The class constructor containing the definition of the static method.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 * @param f The function to return as the private static method.
 *
 * @throws {TypeError} If `receiver` is not `state`.
 */
export declare function __classPrivateFieldGet<T extends new (...args: any[]) => unknown, V extends (...args: any[]) => unknown>(
    receiver: T,
    state: T,
    kind: "m",
    f: V
): V;

/**
 * Emulates writing to a private instance field.
 *
 * @param receiver The instance on which to set a private field value.
 * @param state A WeakMap used to store the private field value for an instance.
 * @param value The value to store in the private field.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 *
 * @throws {TypeError} If `state` doesn't have an entry for `receiver`.
 */
export declare function __classPrivateFieldSet<T extends object, V>(
    receiver: T,
    state: { has(o: T): boolean, set(o: T, value: V): unknown },
    value: V,
    kind?: "f"
): V;

/**
 * Emulates writing to a private static field.
 *
 * @param receiver The object on which to set the private static field.
 * @param state The class constructor containing the definition of the private static field.
 * @param value The value to store in the private field.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 * @param f The descriptor that holds the static field value.
 *
 * @throws {TypeError} If `receiver` is not `state`.
 */
export declare function __classPrivateFieldSet<T extends new (...args: any[]) => unknown, V>(
    receiver: T,
    state: T,
    value: V,
    kind: "f",
    f: { value: V }
): V;

/**
 * Emulates writing to a private instance "set" accessor.
 *
 * @param receiver The instance on which to evaluate the private instance "set" accessor.
 * @param state A WeakSet used to verify an instance supports the private "set" accessor.
 * @param value The value to store in the private accessor.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 * @param f The "set" accessor function to evaluate.
 *
 * @throws {TypeError} If `state` doesn't have an entry for `receiver`.
 */
export declare function __classPrivateFieldSet<T extends object, V>(
    receiver: T,
    state: { has(o: T): boolean },
    value: V,
    kind: "a",
    f: (v: V) => void
): V;

/**
 * Emulates writing to a private static "set" accessor.
 *
 * @param receiver The object on which to evaluate the private static "set" accessor.
 * @param state The class constructor containing the definition of the static "set" accessor.
 * @param value The value to store in the private field.
 * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method.
 * @param f The "set" accessor function to evaluate.
 *
 * @throws {TypeError} If `receiver` is not `state`.
 */
export declare function __classPrivateFieldSet<T extends new (...args: any[]) => unknown, V>(
    receiver: T,
    state: T,
    value: V,
    kind: "a",
    f: (v: V) => void
): V;

/**
 * Checks for the existence of a private field/method/accessor.
 *
 * @param state The class constructor containing the static member, or the WeakMap or WeakSet associated with a private instance member.
 * @param receiver The object for which to test the presence of the private member.
 */
export declare function __classPrivateFieldIn(
    state: (new (...args: any[]) => unknown) | { has(o: any): boolean },
    receiver: unknown,
): boolean;

/**
 * Creates a re-export binding on `object` with key `objectKey` that references `target[key]`.
 *
 * @param object The local `exports` object.
 * @param target The object to re-export from.
 * @param key The property key of `target` to re-export.
 * @param objectKey The property key to re-export as. Defaults to `key`.
 */
export declare function __createBinding(object: object, target: object, key: PropertyKey, objectKey?: PropertyKey): void;

/**
 * Adds a disposable resource to a resource-tracking environment object.
 * @param env A resource-tracking environment object.
 * @param value Either a Disposable or AsyncDisposable object, `null`, or `undefined`.
 * @param async When `true`, `AsyncDisposable` resources can be added. When `false`, `AsyncDisposable` resources cannot be added.
 * @returns The {@link value} argument.
 *
 * @throws {TypeError} If {@link value} is not an object, or if either `Symbol.dispose` or `Symbol.asyncDispose` are not
 * defined, or if {@link value} does not have an appropriate `Symbol.dispose` or `Symbol.asyncDispose` method.
 */
export declare function __addDisposableResource<T>(env: { stack: { value?: unknown, dispose?: Function, async: boolean }[]; error: unknown; hasError: boolean; }, value: T, async: boolean): T;

/**
 * Disposes all resources in a resource-tracking environment object.
 * @param env A resource-tracking environment object.
 * @returns A {@link Promise} if any resources in the environment were marked as `async` when added; otherwise, `void`.
 *
 * @throws {SuppressedError} if an error thrown during disposal would have suppressed a prior error from disposal or the
 * error recorded in the resource-tracking environment object.
 * @seealso {@link __addDisposableResource}
 */
export declare function __disposeResources(env: { stack: { value?: unknown, dispose?: Function, async: boolean }[]; error: unknown; hasError: boolean; }): any;

/**
 * Transforms a relative import specifier ending in a non-declaration TypeScript file extension to its JavaScript file extension counterpart.
 * @param path The import specifier.
 * @param preserveJsx Causes '*.tsx' to transform to '*.jsx' instead of '*.js'. Should be true when `--jsx` is set to `preserve`.
 */
export declare function __rewriteRelativeImportExtension(path: string, preserveJsx?: boolean): string;܉x$ <script src="tslib.es6.js"></script>T	xK/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

export function __extends(d, b) {
    if (typeof b !== "function" && b !== null)
        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

export var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    }
    return __assign.apply(this, arguments);
}

export function __rest(s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
}

export function __decorate(decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
}

export function __param(paramIndex, decorator) {
    return function (target, key) { decorator(target, key, paramIndex); }
}

export function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
    function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
    var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
    var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
    var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
    var _, done = false;
    for (var i = decorators.length - 1; i >= 0; i--) {
        var context = {};
        for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
        for (var p in contextIn.access) context.access[p] = contextIn.access[p];
        context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
        var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
        if (kind === "accessor") {
            if (result === void 0) continue;
            if (result === null || typeof result !== "object") throw new TypeError("Object expected");
            if (_ = accept(result.get)) descriptor.get = _;
            if (_ = accept(result.set)) descriptor.set = _;
            if (_ = accept(result.init)) initializers.unshift(_);
        }
        else if (_ = accept(result)) {
            if (kind === "field") initializers.unshift(_);
            else descriptor[key] = _;
        }
    }
    if (target) Object.defineProperty(target, contextIn.name, descriptor);
    done = true;
};

export function __runInitializers(thisArg, initializers, value) {
    var useValue = arguments.length > 2;
    for (var i = 0; i < initializers.length; i++) {
        value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
    }
    return useValue ? value : void 0;
};

export function __propKey(x) {
    return typeof x === "symbol" ? x : "".concat(x);
};

export function __setFunctionName(f, name, prefix) {
    if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
    return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
};

export function __metadata(metadataKey, metadataValue) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}

export function __awaiter(thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

export function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
    return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (g && (g = 0, op[0] && (_ = 0)), _) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

export var __createBinding = Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
        desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
});

export function __exportStar(m, o) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
}

export function __values(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}

export function __read(o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
}

/** @deprecated */
export function __spread() {
    for (var ar = [], i = 0; i < arguments.length; i++)
        ar = ar.concat(__read(arguments[i]));
    return ar;
}

/** @deprecated */
export function __spreadArrays() {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
}

export function __spreadArray(to, from, pack) {
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
            ar[i] = from[i];
        }
    }
    return to.concat(ar || Array.prototype.slice.call(from));
}

export function __await(v) {
    return this instanceof __await ? (this.v = v, this) : new __await(v);
}

export function __asyncGenerator(thisArg, _arguments, generator) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var g = generator.apply(thisArg, _arguments || []), i, q = [];
    return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
    function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
    function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
    function fulfill(value) { resume("next", value); }
    function reject(value) { resume("throw", value); }
    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
}

export function __asyncDelegator(o) {
    var i, p;
    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
}

export function __asyncValues(o) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var m = o[Symbol.asyncIterator], i;
    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
}

export function __makeTemplateObject(cooked, raw) {
    if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
    return cooked;
};

var __setModuleDefault = Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
};

var ownKeys = function(o) {
    ownKeys = Object.getOwnPropertyNames || function (o) {
        var ar = [];
        for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
        return ar;
    };
    return ownKeys(o);
};

export function __importStar(mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
    __setModuleDefault(result, mod);
    return result;
}

export function __importDefault(mod) {
    return (mod && mod.__esModule) ? mod : { default: mod };
}

export function __classPrivateFieldGet(receiver, state, kind, f) {
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
    return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
}

export function __classPrivateFieldSet(receiver, state, value, kind, f) {
    if (kind === "m") throw new TypeError("Private method is not writable");
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
    return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
}

export function __classPrivateFieldIn(state, receiver) {
    if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
    return typeof state === "function" ? receiver === state : state.has(receiver);
}

export function __addDisposableResource(env, value, async) {
    if (value !== null && value !== void 0) {
        if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
        var dispose, inner;
        if (async) {
            if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
            dispose = value[Symbol.asyncDispose];
        }
        if (dispose === void 0) {
            if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
            dispose = value[Symbol.dispose];
            if (async) inner = dispose;
        }
        if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
        if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
        env.stack.push({ value: value, dispose: dispose, async: async });
    }
    else if (async) {
        env.stack.push({ async: true });
    }
    return value;

}

var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
    var e = new Error(message);
    return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};

export function __disposeResources(env) {
    function fail(e) {
        env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
        env.hasError = true;
    }
    var r, s = 0;
    function next() {
        while (r = env.stack.pop()) {
            try {
                if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
                if (r.dispose) {
                    var result = r.dispose.call(r.value);
                    if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
                }
                else s |= 1;
            }
            catch (e) {
                fail(e);
            }
        }
        if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
        if (env.hasError) throw env.error;
    }
    return next();
}

export function __rewriteRelativeImportExtension(path, preserveJsx) {
    if (typeof path === "string" && /^\.\.?\//.test(path)) {
        return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
            return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
        });
    }
    return path;
}

export default {
    __extends: __extends,
    __assign: __assign,
    __rest: __rest,
    __decorate: __decorate,
    __param: __param,
    __esDecorate: __esDecorate,
    __runInitializers: __runInitializers,
    __propKey: __propKey,
    __setFunctionName: __setFunctionName,
    __metadata: __metadata,
    __awaiter: __awaiter,
    __generator: __generator,
    __createBinding: __createBinding,
    __exportStar: __exportStar,
    __values: __values,
    __read: __read,
    __spread: __spread,
    __spreadArrays: __spreadArrays,
    __spreadArray: __spreadArray,
    __await: __await,
    __asyncGenerator: __asyncGenerator,
    __asyncDelegator: __asyncDelegator,
    __asyncValues: __asyncValues,
    __makeTemplateObject: __makeTemplateObject,
    __importStar: __importStar,
    __importDefault: __importDefault,
    __classPrivateFieldGet: __classPrivateFieldGet,
    __classPrivateFieldSet: __classPrivateFieldSet,
    __classPrivateFieldIn: __classPrivateFieldIn,
    __addDisposableResource: __addDisposableResource,
    __disposeResources: __disposeResources,
    __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,
};
nyݰxD/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */

var extendStatics = function(d, b) {
  extendStatics = Object.setPrototypeOf ||
      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  return extendStatics(d, b);
};

export function __extends(d, b) {
  if (typeof b !== "function" && b !== null)
      throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
  extendStatics(d, b);
  function __() { this.constructor = d; }
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

export var __assign = function() {
  __assign = Object.assign || function __assign(t) {
      for (var s, i = 1, n = arguments.length; i < n; i++) {
          s = arguments[i];
          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
      }
      return t;
  }
  return __assign.apply(this, arguments);
}

export function __rest(s, e) {
  var t = {};
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
      t[p] = s[p];
  if (s != null && typeof Object.getOwnPropertySymbols === "function")
      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
              t[p[i]] = s[p[i]];
      }
  return t;
}

export function __decorate(decorators, target, key, desc) {
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  return c > 3 && r && Object.defineProperty(target, key, r), r;
}

export function __param(paramIndex, decorator) {
  return function (target, key) { decorator(target, key, paramIndex); }
}

export function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
  function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
  var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
  var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
  var _, done = false;
  for (var i = decorators.length - 1; i >= 0; i--) {
      var context = {};
      for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
      for (var p in contextIn.access) context.access[p] = contextIn.access[p];
      context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
      var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
      if (kind === "accessor") {
          if (result === void 0) continue;
          if (result === null || typeof result !== "object") throw new TypeError("Object expected");
          if (_ = accept(result.get)) descriptor.get = _;
          if (_ = accept(result.set)) descriptor.set = _;
          if (_ = accept(result.init)) initializers.unshift(_);
      }
      else if (_ = accept(result)) {
          if (kind === "field") initializers.unshift(_);
          else descriptor[key] = _;
      }
  }
  if (target) Object.defineProperty(target, contextIn.name, descriptor);
  done = true;
};

export function __runInitializers(thisArg, initializers, value) {
  var useValue = arguments.length > 2;
  for (var i = 0; i < initializers.length; i++) {
      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
  }
  return useValue ? value : void 0;
};

export function __propKey(x) {
  return typeof x === "symbol" ? x : "".concat(x);
};

export function __setFunctionName(f, name, prefix) {
  if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
  return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
};

export function __metadata(metadataKey, metadataValue) {
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}

export function __awaiter(thisArg, _arguments, P, generator) {
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  return new (P || (P = Promise))(function (resolve, reject) {
      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
      function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
      step((generator = generator.apply(thisArg, _arguments || [])).next());
  });
}

export function __generator(thisArg, body) {
  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
  return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  function verb(n) { return function (v) { return step([n, v]); }; }
  function step(op) {
      if (f) throw new TypeError("Generator is already executing.");
      while (g && (g = 0, op[0] && (_ = 0)), _) try {
          if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
          if (y = 0, t) op = [op[0] & 2, t.value];
          switch (op[0]) {
              case 0: case 1: t = op; break;
              case 4: _.label++; return { value: op[1], done: false };
              case 5: _.label++; y = op[1]; op = [0]; continue;
              case 7: op = _.ops.pop(); _.trys.pop(); continue;
              default:
                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                  if (t[2]) _.ops.pop();
                  _.trys.pop(); continue;
          }
          op = body.call(thisArg, _);
      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
  }
}

export var __createBinding = Object.create ? (function(o, m, k, k2) {
  if (k2 === undefined) k2 = k;
  var desc = Object.getOwnPropertyDescriptor(m, k);
  if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
  }
  Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
  if (k2 === undefined) k2 = k;
  o[k2] = m[k];
});

export function __exportStar(m, o) {
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
}

export function __values(o) {
  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  if (m) return m.call(o);
  if (o && typeof o.length === "number") return {
      next: function () {
          if (o && i >= o.length) o = void 0;
          return { value: o && o[i++], done: !o };
      }
  };
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}

export function __read(o, n) {
  var m = typeof Symbol === "function" && o[Symbol.iterator];
  if (!m) return o;
  var i = m.call(o), r, ar = [], e;
  try {
      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  }
  catch (error) { e = { error: error }; }
  finally {
      try {
          if (r && !r.done && (m = i["return"])) m.call(i);
      }
      finally { if (e) throw e.error; }
  }
  return ar;
}

/** @deprecated */
export function __spread() {
  for (var ar = [], i = 0; i < arguments.length; i++)
      ar = ar.concat(__read(arguments[i]));
  return ar;
}

/** @deprecated */
export function __spreadArrays() {
  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
  for (var r = Array(s), k = 0, i = 0; i < il; i++)
      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
          r[k] = a[j];
  return r;
}

export function __spreadArray(to, from, pack) {
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
      if (ar || !(i in from)) {
          if (!ar) ar = Array.prototype.slice.call(from, 0, i);
          ar[i] = from[i];
      }
  }
  return to.concat(ar || Array.prototype.slice.call(from));
}

export function __await(v) {
  return this instanceof __await ? (this.v = v, this) : new __await(v);
}

export function __asyncGenerator(thisArg, _arguments, generator) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
  return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
  function fulfill(value) { resume("next", value); }
  function reject(value) { resume("throw", value); }
  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
}

export function __asyncDelegator(o) {
  var i, p;
  return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
}

export function __asyncValues(o) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var m = o[Symbol.asyncIterator], i;
  return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
}

export function __makeTemplateObject(cooked, raw) {
  if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
  return cooked;
};

var __setModuleDefault = Object.create ? (function(o, v) {
  Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
  o["default"] = v;
};

var ownKeys = function(o) {
  ownKeys = Object.getOwnPropertyNames || function (o) {
    var ar = [];
    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
    return ar;
  };
  return ownKeys(o);
};

export function __importStar(mod) {
  if (mod && mod.__esModule) return mod;
  var result = {};
  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
  __setModuleDefault(result, mod);
  return result;
}

export function __importDefault(mod) {
  return (mod && mod.__esModule) ? mod : { default: mod };
}

export function __classPrivateFieldGet(receiver, state, kind, f) {
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
}

export function __classPrivateFieldSet(receiver, state, value, kind, f) {
  if (kind === "m") throw new TypeError("Private method is not writable");
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
}

export function __classPrivateFieldIn(state, receiver) {
  if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
  return typeof state === "function" ? receiver === state : state.has(receiver);
}

export function __addDisposableResource(env, value, async) {
  if (value !== null && value !== void 0) {
    if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
    var dispose, inner;
    if (async) {
      if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
      dispose = value[Symbol.asyncDispose];
    }
    if (dispose === void 0) {
      if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
      dispose = value[Symbol.dispose];
      if (async) inner = dispose;
    }
    if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
    env.stack.push({ value: value, dispose: dispose, async: async });
  }
  else if (async) {
    env.stack.push({ async: true });
  }
  return value;
}

var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
  var e = new Error(message);
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};

export function __disposeResources(env) {
  function fail(e) {
    env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
    env.hasError = true;
  }
  var r, s = 0;
  function next() {
    while (r = env.stack.pop()) {
      try {
        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
        if (r.dispose) {
          var result = r.dispose.call(r.value);
          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
        }
        else s |= 1;
      }
      catch (e) {
        fail(e);
      }
    }
    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
    if (env.hasError) throw env.error;
  }
  return next();
}

export function __rewriteRelativeImportExtension(path, preserveJsx) {
  if (typeof path === "string" && /^\.\.?\//.test(path)) {
      return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
          return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
      });
  }
  return path;
}

export default {
  __extends,
  __assign,
  __rest,
  __decorate,
  __param,
  __esDecorate,
  __runInitializers,
  __propKey,
  __setFunctionName,
  __metadata,
  __awaiter,
  __generator,
  __createBinding,
  __exportStar,
  __values,
  __read,
  __spread,
  __spreadArrays,
  __spreadArray,
  __await,
  __asyncGenerator,
  __asyncDelegator,
  __asyncValues,
  __makeTemplateObject,
  __importStar,
  __importDefault,
  __classPrivateFieldGet,
  __classPrivateFieldSet,
  __classPrivateFieldIn,
  __addDisposableResource,
  __disposeResources,
  __rewriteRelativeImportExtension,
};
˺x  <script src="tslib.js"></script>-`xV[/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global global, define, Symbol, Reflect, Promise, SuppressedError, Iterator */
var __extends;
var __assign;
var __rest;
var __decorate;
var __param;
var __esDecorate;
var __runInitializers;
var __propKey;
var __setFunctionName;
var __metadata;
var __awaiter;
var __generator;
var __exportStar;
var __values;
var __read;
var __spread;
var __spreadArrays;
var __spreadArray;
var __await;
var __asyncGenerator;
var __asyncDelegator;
var __asyncValues;
var __makeTemplateObject;
var __importStar;
var __importDefault;
var __classPrivateFieldGet;
var __classPrivateFieldSet;
var __classPrivateFieldIn;
var __createBinding;
var __addDisposableResource;
var __disposeResources;
var __rewriteRelativeImportExtension;
(function (factory) {
    var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
    if (typeof define === "function" && define.amd) {
        define("tslib", ["exports"], function (exports) { factory(createExporter(root, createExporter(exports))); });
    }
    else if (typeof module === "object" && typeof module.exports === "object") {
        factory(createExporter(root, createExporter(module.exports)));
    }
    else {
        factory(createExporter(root));
    }
    function createExporter(exports, previous) {
        if (exports !== root) {
            if (typeof Object.create === "function") {
                Object.defineProperty(exports, "__esModule", { value: true });
            }
            else {
                exports.__esModule = true;
            }
        }
        return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };
    }
})
(function (exporter) {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };

    __extends = function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };

    __assign = Object.assign || function (t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    };

    __rest = function (s, e) {
        var t = {};
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
            t[p] = s[p];
        if (s != null && typeof Object.getOwnPropertySymbols === "function")
            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                    t[p[i]] = s[p[i]];
            }
        return t;
    };

    __decorate = function (decorators, target, key, desc) {
        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
        if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
        return c > 3 && r && Object.defineProperty(target, key, r), r;
    };

    __param = function (paramIndex, decorator) {
        return function (target, key) { decorator(target, key, paramIndex); }
    };

    __esDecorate = function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
        function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
        var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
        var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
        var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
        var _, done = false;
        for (var i = decorators.length - 1; i >= 0; i--) {
            var context = {};
            for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
            for (var p in contextIn.access) context.access[p] = contextIn.access[p];
            context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
            var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
            if (kind === "accessor") {
                if (result === void 0) continue;
                if (result === null || typeof result !== "object") throw new TypeError("Object expected");
                if (_ = accept(result.get)) descriptor.get = _;
                if (_ = accept(result.set)) descriptor.set = _;
                if (_ = accept(result.init)) initializers.unshift(_);
            }
            else if (_ = accept(result)) {
                if (kind === "field") initializers.unshift(_);
                else descriptor[key] = _;
            }
        }
        if (target) Object.defineProperty(target, contextIn.name, descriptor);
        done = true;
    };

    __runInitializers = function (thisArg, initializers, value) {
        var useValue = arguments.length > 2;
        for (var i = 0; i < initializers.length; i++) {
            value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
        }
        return useValue ? value : void 0;
    };

    __propKey = function (x) {
        return typeof x === "symbol" ? x : "".concat(x);
    };

    __setFunctionName = function (f, name, prefix) {
        if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
        return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
    };

    __metadata = function (metadataKey, metadataValue) {
        if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
    };

    __awaiter = function (thisArg, _arguments, P, generator) {
        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
        return new (P || (P = Promise))(function (resolve, reject) {
            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        });
    };

    __generator = function (thisArg, body) {
        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
        return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
        function verb(n) { return function (v) { return step([n, v]); }; }
        function step(op) {
            if (f) throw new TypeError("Generator is already executing.");
            while (g && (g = 0, op[0] && (_ = 0)), _) try {
                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
                if (y = 0, t) op = [op[0] & 2, t.value];
                switch (op[0]) {
                    case 0: case 1: t = op; break;
                    case 4: _.label++; return { value: op[1], done: false };
                    case 5: _.label++; y = op[1]; op = [0]; continue;
                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
                    default:
                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                        if (t[2]) _.ops.pop();
                        _.trys.pop(); continue;
                }
                op = body.call(thisArg, _);
            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
        }
    };

    __exportStar = function(m, o) {
        for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
    };

    __createBinding = Object.create ? (function(o, m, k, k2) {
        if (k2 === undefined) k2 = k;
        var desc = Object.getOwnPropertyDescriptor(m, k);
        if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
            desc = { enumerable: true, get: function() { return m[k]; } };
        }
        Object.defineProperty(o, k2, desc);
    }) : (function(o, m, k, k2) {
        if (k2 === undefined) k2 = k;
        o[k2] = m[k];
    });

    __values = function (o) {
        var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
        if (m) return m.call(o);
        if (o && typeof o.length === "number") return {
            next: function () {
                if (o && i >= o.length) o = void 0;
                return { value: o && o[i++], done: !o };
            }
        };
        throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
    };

    __read = function (o, n) {
        var m = typeof Symbol === "function" && o[Symbol.iterator];
        if (!m) return o;
        var i = m.call(o), r, ar = [], e;
        try {
            while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
        }
        catch (error) { e = { error: error }; }
        finally {
            try {
                if (r && !r.done && (m = i["return"])) m.call(i);
            }
            finally { if (e) throw e.error; }
        }
        return ar;
    };

    /** @deprecated */
    __spread = function () {
        for (var ar = [], i = 0; i < arguments.length; i++)
            ar = ar.concat(__read(arguments[i]));
        return ar;
    };

    /** @deprecated */
    __spreadArrays = function () {
        for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
        for (var r = Array(s), k = 0, i = 0; i < il; i++)
            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
                r[k] = a[j];
        return r;
    };

    __spreadArray = function (to, from, pack) {
        if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
            if (ar || !(i in from)) {
                if (!ar) ar = Array.prototype.slice.call(from, 0, i);
                ar[i] = from[i];
            }
        }
        return to.concat(ar || Array.prototype.slice.call(from));
    };

    __await = function (v) {
        return this instanceof __await ? (this.v = v, this) : new __await(v);
    };

    __asyncGenerator = function (thisArg, _arguments, generator) {
        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
        var g = generator.apply(thisArg, _arguments || []), i, q = [];
        return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
        function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
        function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
        function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
        function fulfill(value) { resume("next", value); }
        function reject(value) { resume("throw", value); }
        function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
    };

    __asyncDelegator = function (o) {
        var i, p;
        return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
    };

    __asyncValues = function (o) {
        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
        var m = o[Symbol.asyncIterator], i;
        return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
    };

    __makeTemplateObject = function (cooked, raw) {
        if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
        return cooked;
    };

    var __setModuleDefault = Object.create ? (function(o, v) {
        Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
        o["default"] = v;
    };

    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };

    __importStar = function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };

    __importDefault = function (mod) {
        return (mod && mod.__esModule) ? mod : { "default": mod };
    };

    __classPrivateFieldGet = function (receiver, state, kind, f) {
        if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
        if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
        return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
    };

    __classPrivateFieldSet = function (receiver, state, value, kind, f) {
        if (kind === "m") throw new TypeError("Private method is not writable");
        if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
        if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
        return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
    };

    __classPrivateFieldIn = function (state, receiver) {
        if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
        return typeof state === "function" ? receiver === state : state.has(receiver);
    };

    __addDisposableResource = function (env, value, async) {
        if (value !== null && value !== void 0) {
            if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
            var dispose, inner;
            if (async) {
                if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
                dispose = value[Symbol.asyncDispose];
            }
            if (dispose === void 0) {
                if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
                dispose = value[Symbol.dispose];
                if (async) inner = dispose;
            }
            if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
            if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
            env.stack.push({ value: value, dispose: dispose, async: async });
        }
        else if (async) {
            env.stack.push({ async: true });
        }
        return value;
    };

    var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
        var e = new Error(message);
        return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
    };

    __disposeResources = function (env) {
        function fail(e) {
            env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
            env.hasError = true;
        }
        var r, s = 0;
        function next() {
            while (r = env.stack.pop()) {
                try {
                    if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
                    if (r.dispose) {
                        var result = r.dispose.call(r.value);
                        if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
                    }
                    else s |= 1;
                }
                catch (e) {
                    fail(e);
                }
            }
            if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
            if (env.hasError) throw env.error;
        }
        return next();
    };

    __rewriteRelativeImportExtension = function (path, preserveJsx) {
        if (typeof path === "string" && /^\.\.?\//.test(path)) {
            return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
                return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
            });
        }
        return path;
    };

    exporter("__extends", __extends);
    exporter("__assign", __assign);
    exporter("__rest", __rest);
    exporter("__decorate", __decorate);
    exporter("__param", __param);
    exporter("__esDecorate", __esDecorate);
    exporter("__runInitializers", __runInitializers);
    exporter("__propKey", __propKey);
    exporter("__setFunctionName", __setFunctionName);
    exporter("__metadata", __metadata);
    exporter("__awaiter", __awaiter);
    exporter("__generator", __generator);
    exporter("__exportStar", __exportStar);
    exporter("__createBinding", __createBinding);
    exporter("__values", __values);
    exporter("__read", __read);
    exporter("__spread", __spread);
    exporter("__spreadArrays", __spreadArrays);
    exporter("__spreadArray", __spreadArray);
    exporter("__await", __await);
    exporter("__asyncGenerator", __asyncGenerator);
    exporter("__asyncDelegator", __asyncDelegator);
    exporter("__asyncValues", __asyncValues);
    exporter("__makeTemplateObject", __makeTemplateObject);
    exporter("__importStar", __importStar);
    exporter("__importDefault", __importDefault);
    exporter("__classPrivateFieldGet", __classPrivateFieldGet);
    exporter("__classPrivateFieldSet", __classPrivateFieldSet);
    exporter("__classPrivateFieldIn", __classPrivateFieldIn);
    exporter("__addDisposableResource", __addDisposableResource);
    exporter("__disposeResources", __disposeResources);
    exporter("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension);
});

0 && (module.exports = {
    __extends: __extends,
    __assign: __assign,
    __rest: __rest,
    __decorate: __decorate,
    __param: __param,
    __esDecorate: __esDecorate,
    __runInitializers: __runInitializers,
    __propKey: __propKey,
    __setFunctionName: __setFunctionName,
    __metadata: __metadata,
    __awaiter: __awaiter,
    __generator: __generator,
    __exportStar: __exportStar,
    __createBinding: __createBinding,
    __values: __values,
    __read: __read,
    __spread: __spread,
    __spreadArrays: __spreadArrays,
    __spreadArray: __spreadArray,
    __await: __await,
    __asyncGenerator: __asyncGenerator,
    __asyncDelegator: __asyncDelegator,
    __asyncValues: __asyncValues,
    __makeTemplateObject: __makeTemplateObject,
    __importStar: __importStar,
    __importDefault: __importDefault,
    __classPrivateFieldGet: __classPrivateFieldGet,
    __classPrivateFieldSet: __classPrivateFieldSet,
    __classPrivateFieldIn: __classPrivateFieldIn,
    __addDisposableResource: __addDisposableResource,
    __disposeResources: __disposeResources,
    __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,
});
R:x   ## [0.15.1](https://github.com/angular/angular/compare/zone.js-0.15.0...zone.js-0.15.1) (2025-05-22)


### Bug Fixes

* **zone.js:** classes that extend Error should retain cause property ([#61599](https://github.com/angular/angular/issues/61599)) ([ad8931c](https://github.com/angular/angular/commit/ad8931cb4968b2bd25b05dcd3d856ec32e4d7145))
* **zone.js:** more robust check for promise-like objects ([#57388](https://github.com/angular/angular/issues/57388)) ([e608e6c](https://github.com/angular/angular/commit/e608e6cfbbc9fba7c74bfef72f102a502e951e6c)), closes [#57385](https://github.com/angular/angular/issues/57385)
* **zone.js:** remove `abort` listener once fetch is settled ([#57882](https://github.com/angular/angular/issues/57882)) ([6976349](https://github.com/angular/angular/commit/69763491c3ffb576822b179af3363ec666d43bce))



# [0.15.0](https://github.com/angular/angular/compare/zone.js-0.14.10...zone.js-0.15.0) (2024-08-15)


### Bug Fixes

* **zone.js:** Add support for addition jest functions. ([#57280](https://github.com/angular/angular/issues/57280)) ([e1240c6](https://github.com/angular/angular/commit/e1240c6f5d9a3d68ccef7ffbf0a0646ad1164cd8)), closes [#57277](https://github.com/angular/angular/issues/57277)
* **zone.js:** Update the default behavior of fakeAsync to flush after the test ([#57240](https://github.com/angular/angular/issues/57240)) ([70e8b40](https://github.com/angular/angular/commit/70e8b40750e894bc1439713cd508d8bd9fafb7a4))


### BREAKING CHANGES

* **zone.js:** `fakeAsync` will now flush pending timers at the end of
the given function by default. To opt-out of this, you can use `{flush:
false}` in options parameter of `fakeAsync`



## [0.14.10](https://github.com/angular/angular/compare/zone.js-0.14.8...zone.js-0.14.10) (2024-08-05)


### Features

* **zone.js:** Add 'flush' parameter option to fakeAsync to flush after the test ([#57137](https://github.com/angular/angular/issues/57137)) ([99d679d](https://github.com/angular/angular/commit/99d679d6061d731a04930824e92f247bb94f21e7))



## [0.14.8](https://github.com/angular/angular/compare/zone.js-0.14.7...zone.js-0.14.8) (2024-07-17)


### Bug Fixes

* **zone.js:** allow enabling default `beforeunload` handling ([#55875](https://github.com/angular/angular/issues/55875)) ([b8d5882](https://github.com/angular/angular/commit/b8d5882127a6e9944d30a7e0c87c2e2c59b352e6)), closes [#47579](https://github.com/angular/angular/issues/47579)
* **zone.js:** support `Timeout.refresh` in Node.js ([#56852](https://github.com/angular/angular/issues/56852)) ([982f1b1](https://github.com/angular/angular/commit/982f1b125147e4292716f9524bef75423b70c71c)), closes [#56586](https://github.com/angular/angular/issues/56586)



## [0.14.7](https://github.com/angular/angular/compare/zone.js-0.14.6...zone.js-0.14.7) (2024-06-06)


### Bug Fixes

* **zone.js:** do not mutate event listener options (may be readonly) ([#55796](https://github.com/angular/angular/issues/55796)) ([85c1719](https://github.com/angular/angular/commit/85c171920ae2b1861896fa6c2d5d7dc8f030a445)), closes [#54142](https://github.com/angular/angular/issues/54142)
* **zone.js:** store remove abort listener on the scheduled task ([#56160](https://github.com/angular/angular/issues/56160)) ([4a3800a](https://github.com/angular/angular/commit/4a3800a6a0ae9d667dd961c6e4029c01c6819988)), closes [#56148](https://github.com/angular/angular/issues/56148)



## [0.14.6](https://github.com/angular/angular/compare/zone.js-0.14.4...zone.js-0.14.6) (2024-05-16)


### Bug Fixes

* **zone.js:** add missing APIs to Node.js `fs` patch ([#54396](https://github.com/angular/angular/issues/54396)) ([9e07b62](https://github.com/angular/angular/commit/9e07b621ead050d27d36cde0549b01ac3f1e9e73))
* **zone.js:** correctly bundle `zone-patch-rxjs` ([#55826](https://github.com/angular/angular/issues/55826)) ([20a530a](https://github.com/angular/angular/commit/20a530acb6ca6efe73cb97c64e9d23a0f5d912c8)), closes [#55825](https://github.com/angular/angular/issues/55825)
* **zone.js:** remove `abort` listener on a signal when actual event is removed ([#55339](https://github.com/angular/angular/issues/55339)) ([a9460d0](https://github.com/angular/angular/commit/a9460d08a0e95dcd8fcd0ea7eca8470af921bfe2)), closes [#54739](https://github.com/angular/angular/issues/54739)



## [0.14.5](https://github.com/angular/angular/compare/zone.js-0.14.4...zone.js-0.14.5) (2024-04-30)


### Bug Fixes

* **zone.js:** Add 'declare' to each interface to prevent renaming ([#54966](https://github.com/angular/angular/issues/54966)) ([b3d045b](https://github.com/angular/angular/commit/b3d045b9a4383d97ea3c5d770d9413ffed35d760))
* **zone.js:** make sure fakeasync use the same id pool with native ([#54600](https://github.com/angular/angular/issues/54600)) ([ddbf6bb](https://github.com/angular/angular/commit/ddbf6bb038d101daf5280abbd2a0efaa0b7fd3a0)), closes [#54323](https://github.com/angular/angular/issues/54323)
* **zone.js:** should not clear onhandler when remove capture listener ([#54602](https://github.com/angular/angular/issues/54602)) ([e44b077](https://github.com/angular/angular/commit/e44b077cbd4fc1ac16b3edd0fea758842ce6e29f)), closes [#54581](https://github.com/angular/angular/issues/54581)



## [0.14.4](https://github.com/angular/angular/compare/zone.js-0.14.3...zone.js-0.14.4) (2024-02-13)


### Bug Fixes

* **zone.js:** add `__Zone_ignore_on_properties` to `ZoneGlobalConfigurations` ([#50737](https://github.com/angular/angular/issues/50737)) ([f87f058](https://github.com/angular/angular/commit/f87f058a69443d9427530c979b39e3630190a7fd))
* **zone.js:** patch `fs.realpath.native` as macrotask ([#54208](https://github.com/angular/angular/issues/54208)) ([19fae76](https://github.com/angular/angular/commit/19fae76bada7146e8993fb672b8d321fb08967f2)), closes [#45546](https://github.com/angular/angular/issues/45546)
* **zone.js:** patch `Response` methods returned by `fetch` ([#50653](https://github.com/angular/angular/issues/50653)) ([260d3ed](https://github.com/angular/angular/commit/260d3ed0d91648d3ba75d7d9896f38195093c7e4)), closes [#50327](https://github.com/angular/angular/issues/50327)
* **zone.js:** patch form-associated custom element callbacks ([#50686](https://github.com/angular/angular/issues/50686)) ([1c990cd](https://github.com/angular/angular/commit/1c990cdb2962fa879762d5e26f87f547a00e1795))



## [0.14.3](https://github.com/angular/angular/compare/zone.js-0.14.2...zone.js-0.14.3) (2023-12-19)


### Bug Fixes

* **zone.js:** handle fetch with AbortSignal ([#49595](https://github.com/angular/angular/issues/49595)) ([b06b24b](https://github.com/angular/angular/commit/b06b24b5049c07fbc18c76fd2a10e49fc93870be))
* **zone.js:** Promise.resolve(subPromise) should return subPromise ([#53423](https://github.com/angular/angular/issues/53423)) ([08b0c87](https://github.com/angular/angular/commit/08b0c87a948007e086a2c5a5c17ccca5fd7a24c4)), closes [/promisesaplus.com/#point-51](https://github.com//promisesaplus.com//issues/point-51)
* **zone.js:** support addEventListener with signal option. ([#49595](https://github.com/angular/angular/issues/49595)) ([d4973ff](https://github.com/angular/angular/commit/d4973ff9b074f4db918f71163e79b7d112c309f5)), closes [#49591](https://github.com/angular/angular/issues/49591)


### Features

* **zone.js:** implement Promise.withResolvers() ([#53514](https://github.com/angular/angular/issues/53514)) ([7a28f50](https://github.com/angular/angular/commit/7a28f50711535fcc285c7ee9021e8e7dc34a655d))



## [0.14.2](https://github.com/angular/angular/compare/zone.js-0.14.1...zone.js-0.14.2) (2023-11-03)


### Bug Fixes

* **zone.js:** disable wrapping unhandled promise error by default ([6d7eb35](https://github.com/angular/angular/commit/6d7eb3548c5fc3aedb4a52ff2010141343748e90))



## [14.0.1](https://github.com/angular/angular/compare/zone.js-0.14.0...zone.js-14.0.1) (2023-10-25)


### Bug Fixes

* **zone.js:** use `globalThis` instead of `global` and `window` ([#52367](https://github.com/angular/angular/issues/52367)) ([def719e](https://github.com/angular/angular/commit/def719e2cac50bbf1cda4a2c4bf96de2d4ba4bfd))



# [0.14.0](https://github.com/angular/angular/compare/zone.js-0.13.3...zone.js-0.14.0) (2023-09-14)


### Features

* **zone.js:** remove legacy files and access to deep imports ([#51752](https://github.com/angular/angular/issues/51752)) ([a8efc60](https://github.com/angular/angular/commit/a8efc605ea9c3cf03d85b5c567218202e304fef9))


### BREAKING CHANGES

* **zone.js:** Deep and legacy `dist/` imports like `zone.js/bundles/zone-testing.js` and `zone.js/dist/zone` are no longer allowed. `zone-testing-bundle` and `zone-testing-node-bundle` are also no longer part of the package.

The proper way to import `zone.js` and `zone.js/testing` is:
```js
import 'zone.js';
import 'zone.js/testing';
```



## [0.13.3](https://github.com/angular/angular/compare/zone.js-0.13.2...zone.js-0.13.3) (2023-09-12)


### Bug Fixes

* **zone.js:** rename `typings` conditional export to `types` ([#51737](https://github.com/angular/angular/issues/51737)) ([74755c4](https://github.com/angular/angular/commit/74755c4b5e6d4d62d2c81f35e6152bb8649fbb5c))
* **zone.js:** temporary allow deep imports ([#51737](https://github.com/angular/angular/issues/51737)) ([e86d6db](https://github.com/angular/angular/commit/e86d6dba27997cb2cad13c43ac5e94eeb7a67725))



## [0.13.2](https://github.com/angular/angular/compare/zone.js-0.13.1...zone.js-0.13.2) (2023-09-07)


### Bug Fixes

* **zone.js:** add conditional exports to zone.js package ([#51652](https://github.com/angular/angular/issues/51652)) ([4798ec4](https://github.com/angular/angular/commit/4798ec41668d47fd5e1504c61d96d5e56dcff345))



## [v0.13.1](https://github.com/angular/angular/compare/zone.js-0.13.0...zone.js-v0.13.1) (2023-06-09)


### Bug Fixes

* **zone.js:** enable monkey patching of the `queueMicrotask()` API in node.js ([#50467](https://github.com/angular/angular/issues/50467)) ([381cb98](https://github.com/angular/angular/commit/381cb982264d30e8c79e77e9186acd6da006e718))
* **zone.js:** enable monkey patching of the `queueMicrotask()` API in node.js ([#50530](https://github.com/angular/angular/issues/50530)) ([7837f71](https://github.com/angular/angular/commit/7837f7119f8cdfb0ae95551f48608f156985113a))
* **zone.js:** patch entire promise in node ([#50552](https://github.com/angular/angular/issues/50552)) ([cb31dbc](https://github.com/angular/angular/commit/cb31dbc75ca4141d61cec3ba6e60505198208a0a)), closes [#50513](https://github.com/angular/angular/issues/50513) [#50457](https://github.com/angular/angular/issues/50457) [#50414](https://github.com/angular/angular/issues/50414) [#49930](https://github.com/angular/angular/issues/49930)
* **zone.js:** revert Mocha it.skip, describe.skip method patch ([#49329](https://github.com/angular/angular/issues/49329)) ([5a2b622](https://github.com/angular/angular/commit/5a2b6227b30a4d3f2090077e8881c753db00798c))


### Features

* **zone.js:** jest 29 should ignore uncaught error console log ([#49325](https://github.com/angular/angular/issues/49325)) ([bc412fd](https://github.com/angular/angular/commit/bc412fd537f965b20dce69232ef66f152962dc06)), closes [#49110](https://github.com/angular/angular/issues/49110)


### Reverts

* Revert "fix(zone.js): enable monkey patching of the `queueMicrotask()` API in node.js (#50467)" (#50529) ([7567348](https://github.com/angular/angular/commit/7567348c54917b2f881d6c68d45f7c15d101954b)), closes [#50467](https://github.com/angular/angular/issues/50467) [#50529](https://github.com/angular/angular/issues/50529) [#50529](https://github.com/angular/angular/issues/50529)



# [0.13](https://github.com/angular/angular/compare/zone.js-0.12.0...zone.js-0.13) (2023-02-28)

### Bug Fixes

- **zone.js:** cancel tasks only when they are scheduled or running ([#46435](https://github.com/angular/angular/issues/46435)) ([b618b5a](https://github.com/angular/angular/commit/b618b5aa86138c900055c5496967e3348a7b98fc)), closes [#45711](https://github.com/angular/angular/issues/45711)
- **zone.js:** Fix ConsoleTask interface typo ([#47090](https://github.com/angular/angular/issues/47090)) ([91954cf](https://github.com/angular/angular/commit/91954cf20e17a386d71cc8ea25d1d17b9ae1e31c))
- **zone.js:** zone-node only patch Promise.prototype.then ([#49144](https://github.com/angular/angular/issues/49144)) ([d1ac3aa](https://github.com/angular/angular/commit/d1ac3aa14e5d3c5415937199a6fb63437ddee0b8)), closes [#47872](https://github.com/angular/angular/issues/47872)

# [0.12.0](https://github.com/angular/angular/compare/zone.js-0.11.8...zone.js-0.12.0) (2022-10-27)

### Bug Fixes

- **zone.js:** cancel tasks only when they are scheduled or running ([#46435](https://github.com/angular/angular/issues/46435)) ([b618b5a](https://github.com/angular/angular/commit/b618b5aa86138c900055c5496967e3348a7b98fc)), closes [#45711](https://github.com/angular/angular/issues/45711)
- **zone.js:** Fix ConsoleTask interface typo ([#47090](https://github.com/angular/angular/issues/47090)) ([91954cf](https://github.com/angular/angular/commit/91954cf20e17a386d71cc8ea25d1d17b9ae1e31c))

## [0.11.8](https://github.com/angular/angular/compare/zone.js-0.11.7...zone.js-0.11.8) (2022-08-08)

### Features

- **zone.js:** Update to the simpler Async Stack Tagging v2 API ([#46958](https://github.com/angular/angular/issues/46958)) ([f23232f](https://github.com/angular/angular/commit/f23232ff66559ddc28aec26d461355568c25530d))

## [0.11.7](https://github.com/angular/angular/compare/zone.js-0.11.6...zone.js-0.11.7) (2022-07-20)

### Bug Fixes

- **zone.js:** do not invoke jasmine done callback multiple times with `waitForAsync` ([4e77c7fbf38](https://github.com/angular/angular/commit/4e77c7fbf38f27741617303165068e1cb1ef6354))

### Features

- **zone.js:** add AsyncStackTaggingZoneSpec implementation ([#46693](https://github.com/angular/angular/issues/46693)) ([848a009](https://github.com/angular/angular/commit/848a00956e693ba8ab648c86cca034ed2e3c807c))
- **zone.js:** include jasmine `describe` block name when raising unexpected task error ([de86285](https://github.com/angular/angular/commit/de86285f2ee1c3a78489c8c40a15fc78f75e2620))
- **zone.js:** include zone name when sync-test zone reports tasks ([72c2567](https://github.com/angular/angular/commit/72c2567847c37b07e468a501a4b13edc791ae9ed))

## [0.11.6](https://github.com/angular/angular/compare/zone.js-0.11.5...zone.js-0.11.6) (2022-06-02)

### Bug Fixes

- **zone.js:** check if `process` is defined when patching the `GlobalErrors.install` ([#45392](https://github.com/angular/angular/issues/45392)) ([c7bcc1b](https://github.com/angular/angular/commit/c7bcc1b50182e5378756aa4528a24075b5be026e)), closes [#42260](https://github.com/angular/angular/issues/42260)
- **zone.js:** in TaskTrackingZoneSpec track a periodic task until it is cancelled ([#45391](https://github.com/angular/angular/issues/45391)) ([f19b36f](https://github.com/angular/angular/commit/f19b36f462803b3b3b9410391c039649541b10bc))
- **zone.js:** read `Symbol.species` safely ([#45369](https://github.com/angular/angular/issues/45369)) ([e2eaac3](https://github.com/angular/angular/commit/e2eaac34b06a558145be41853f1d3585c1108880))
- **zone.js:** should ignore multiple resolve call ([#45283](https://github.com/angular/angular/issues/45283)) ([aebf165](https://github.com/angular/angular/commit/aebf165359ad6de5a8bacd9cb91651fc4175aaad)), closes [#44913](https://github.com/angular/angular/issues/44913)
- **zone.js:** swallow the error when the element callback is not patchable ([#45400](https://github.com/angular/angular/issues/45400)) ([4ea70e3](https://github.com/angular/angular/commit/4ea70e36b998208302183f78088637f3de86323d)), closes [lwc/engine-core/src/framework/base-bridge-element.ts#L180-L186](https://github.com/lwc/engine-core/src/framework/base-bridge-element.ts/issues/L180-L186) [#42546](https://github.com/angular/angular/issues/42546)

### BREAKING CHANGES

- **zone.js:** in TaskTrackingZoneSpec track a periodic task until it is cancelled

The breaking change is scoped only to the plugin
`zone.js/plugins/task-tracking`. If you used `TaskTrackingZoneSpec` and
checked the pending macroTasks e.g. using `(this.ngZone as any)._inner ._parent._properties.TaskTrackingZone.getTasksFor('macroTask')`, then
its behavior slightly changed for periodic macrotasks. For example,
previously the `setInterval` macrotask was no longer tracked after its
callback was executed for the first time. Now it's tracked until
the task is explicitly cancelled, e.g with `clearInterval(id)`.

## [0.11.5](https://github.com/angular/angular/compare/zone.js-0.11.4...zone.js-0.11.5) (2022-03-03)

### Bug Fixes

- **zone.js:** async-test should only call done once ([#45025](https://github.com/angular/angular/issues/45025)) ([dea7234](https://github.com/angular/angular/commit/dea7234a76f652c8e9d9b79719e2b170a5a50777))
- **zone.js:** defineProperties should also set symbol props ([#45098](https://github.com/angular/angular/issues/45098)) ([b437d12](https://github.com/angular/angular/commit/b437d1238d9006baa0cf749adbd7cc3270de3040)), closes [#44095](https://github.com/angular/angular/issues/44095)
- **zone.js:** fix several test cases which trigger `done()` multiple times ([#45025](https://github.com/angular/angular/issues/45025)) ([d5565cc](https://github.com/angular/angular/commit/d5565ccdb4573a47eb329b09c6852c1ae39672a6))
- **zone.js:** only one listener should also re-throw an error correctly ([#41868](https://github.com/angular/angular/issues/41868)) ([299f92c](https://github.com/angular/angular/commit/299f92c3b62a43c94cff4a204f9e41c46a159efc)), closes [#41867](https://github.com/angular/angular/issues/41867) [/github.com/angular/angular/pull/41562#issuecomment-822696973](https://github.com//github.com/angular/angular/pull/41562/issues/issuecomment-822696973)
- **zone.js:** patch global instead of Mocha object ([#45047](https://github.com/angular/angular/issues/45047)) ([8efbdb5](https://github.com/angular/angular/commit/8efbdb57c11a6c632f69d7e142a632b6a853fa46)), closes [#42834](https://github.com/angular/angular/issues/42834)
- **zone.js:** should continue to execute listeners when throw error ([#41562](https://github.com/angular/angular/issues/41562)) ([008eaf3](https://github.com/angular/angular/commit/008eaf3b7df90b2cdd9c83e229d23d4014d6dbc9)), closes [#41522](https://github.com/angular/angular/issues/41522)
- **zone.js:** update several flaky cases ([#41526](https://github.com/angular/angular/issues/41526)) ([25a83eb](https://github.com/angular/angular/commit/25a83eb264aa19fc4616cea45e04d790b9bcd777)), closes [#41434](https://github.com/angular/angular/issues/41434)

### Features

- **zone.js:** add Promise.any() implementation ([#45064](https://github.com/angular/angular/issues/45064)) ([4d494d2](https://github.com/angular/angular/commit/4d494d24ccb69b40a477b0bccd97baf6af66accf)), closes [#44393](https://github.com/angular/angular/issues/44393)
- **zone.js:** update electron patch to support electron/remote 14 ([#45073](https://github.com/angular/angular/issues/45073)) ([d65706a](https://github.com/angular/angular/commit/d65706a3b225ccb88d719478c19a379aef1b6047)), closes [#43346](https://github.com/angular/angular/issues/43346)

<a name="0.11.4"></a>

## [0.11.4](https://github.com/angular/angular/compare/zone.js-0.11.3...zone.js-0.11.4) (2021-02-10)

### Bug Fixes

- **zone.js:** fesm2015 bundle should also be strict module. ([#40456](https://github.com/angular/angular/issues/40456)) ([f35f7c6](https://github.com/angular/angular/commit/f35f7c6)), closes [#40215](https://github.com/angular/angular/issues/40215) [#40215](https://github.com/angular/angular/issues/40215)
- **zone.js:** fix typo in zone_externs ([#40348](https://github.com/angular/angular/issues/40348)) ([8116edb](https://github.com/angular/angular/commit/8116edb))
- **zone.js:** patch child method that overrides an already patched method ([#39850](https://github.com/angular/angular/issues/39850)) ([82e3f54](https://github.com/angular/angular/commit/82e3f54))
- **zone.js:** setTimeout patch should clean tasksByHandleId cache. ([#40586](https://github.com/angular/angular/issues/40586)) ([0652b29](https://github.com/angular/angular/commit/0652b29)), closes [#40387](https://github.com/angular/angular/issues/40387)
- **zone.js:** update build tooling for latest changes in rules_nodejs ([#40710](https://github.com/angular/angular/issues/40710)) ([2827845](https://github.com/angular/angular/commit/2827845))

### Features

- **zone.js:** monkey patches queueMicrotask() ([#38904](https://github.com/angular/angular/issues/38904)) ([27358eb](https://github.com/angular/angular/commit/27358eb)), closes [#38863](https://github.com/angular/angular/issues/38863)

<a name="0.11.3"></a>

## [0.11.3](https://github.com/angular/angular/compare/zone.js-0.11.2...zone.js-0.11.3) (2020-10-27)

### Bug Fixes

- **zone.js:** remove global declaration ([#37861](https://github.com/angular/angular/issues/37861)) ([90c0772](https://github.com/angular/angular/commit/90c0772)), closes [#37531](https://github.com/angular/angular/issues/37531)

<a name="0.11.2"></a>

## [0.11.2](https://github.com/angular/angular/compare/zone.js-0.11.0...zone.js-0.11.2) (2020-09-19)

### Bug Fixes

- **zone.js:** jest getRealSystemTime should return native time ([#39127](https://github.com/angular/angular/issues/39127)) ([ffc3332](https://github.com/angular/angular/commit/ffc3332))
- **zone.js:** add missing types field in package.json ([#38585](https://github.com/angular/angular/issues/38585)) ([27cc56b](https://github.com/angular/angular/commit/27cc56b)), closes [#38584](https://github.com/angular/angular/issues/38584)
- **zone.js:** defineProperty patch should not swallow error ([#37582](https://github.com/angular/angular/issues/37582)) ([45a73dd](https://github.com/angular/angular/commit/45a73dd)), closes [#37432](https://github.com/angular/angular/issues/37432)
- **zone.js:** run tests in umd format ([#37582](https://github.com/angular/angular/issues/37582)) ([40096be](https://github.com/angular/angular/commit/40096be))
- **zone.js:** should have better backward compatibilities ([#38797](https://github.com/angular/angular/issues/38797)) ([a33d630](https://github.com/angular/angular/commit/a33d630)), closes [#38561](https://github.com/angular/angular/issues/38561) [#38669](https://github.com/angular/angular/issues/38669)
- **zone.js:** should invoke xhr send task when no response error occurs ([#38836](https://github.com/angular/angular/issues/38836)) ([d92a0dd](https://github.com/angular/angular/commit/d92a0dd)), closes [#38795](https://github.com/angular/angular/issues/38795)
- **zone.js:** zone.js toString patch should check typeof Promise is function ([#38350](https://github.com/angular/angular/issues/38350)) ([18e474f](https://github.com/angular/angular/commit/18e474f)), closes [#38361](https://github.com/angular/angular/issues/38361)

### Features

- **zone.js:** add jest fakeTimers support ([#39016](https://github.com/angular/angular/issues/39016)) ([82d54fe](https://github.com/angular/angular/commit/82d54fe)), closes [#38851](https://github.com/angular/angular/issues/38851)

### Refactor

- **zone.js:** refactor(zone.js): rename several internal apis in fake async zone spec ([#39127](https://github.com/angular/angular/issues/39127)) ([8a68669](https://github.com/angular/angular/commit/8a68669))

### Build

- **zone.js:** build(zone.js): zone.js should output esm format for fesm2015 bundles ([#39203](https://github.com/angular/angular/issues/39203)) ([822b838](https://github.com/angular/angular/commit/822b838))

### BREAKING CHANGES

- **zone.js:** ZoneJS no longer swallows errors produced by `Object.defineProperty` calls.

Prior to this change, ZoneJS monkey patched `Object.defineProperty` and if there is an error
(such as the property is not configurable or not writable) the patched logic swallowed it
and only console.log was produced. This behavior used to hide real errors,
so the logic is now updated to trigger original errors (if any). One exception
where the patch remains in place is `document.registerElement`
(to allow smooth transition for code/polyfills that rely on old behavior in legacy browsers).
If your code relies on the old behavior (where errors were not thrown before),
you may need to update the logic to handle the errors that are no longer masked by ZoneJS patch.

<a name="0.11.1"></a>

## [0.11.1](https://github.com/angular/angular/compare/zone.js-0.11.0...zone.js-0.11.1) (2020-08-19)

### Bug Fixes

- **zone.js:** zone.js package.json should not include files/directories field ([#38528](https://github.com/angular/angular/issues/38528)) ([6b662d1](https://github.com/angular/angular/commit/6b662d1)), closes [#38526](https://github.com/angular/angular/issues/38526) [#38516](https://github.com/angular/angular/issues/38516) [#38513](https://github.com/angular/angular/issues/38513)

# BREAKING CHANGES since Zone.js v0.11.1

Prior to `v0.11.1`, Zone.js provided two distribution bundle formats in the `dist` folder.
They were (1) `ES5` bundle distributed as `zone.js` and (2) `ES2015` bundle distributed as `zone-evergreen.js`.
These bundles are used for Angular's differential-loading mechanism.

Prior to `v0.11.11` the following code

```
import 'zone.js';
```

would load the `ES5` bundle from `dist/zone.js`.

Starting with `v0.11.1`, Zone.js follows the [Angular Package Format](https://docs.google.com/document/d/1CZC2rcpxffTDfRDs6p1cfbmKNLA6x5O-NtkJglDaBVs), so the folder structure of the Zone.js bundles is updated to match `Angular Package Format`.
So the same code

```
import 'zone.js';
```

now loads the `ES2015` bundle instead.

This is a breaking change for legacy browsers such as `IE11`.

For backwards compatibility `zone.js` continues to distribute the same bundles under `dist`.
To restore the old behavior change the `polyfills.ts` generated by `Angular CLI` to import like so:

```
import 'zone.js/dist/zone';
```

<a name="0.11.0"></a>

# [0.11.0](https://github.com/angular/angular/compare/zone.js-0.10.3...zone.js-0.11.0) (2020-08-14)

### Bug Fixes

- **zone.js:** add issue numbers of `[@types](https://github.com/types)/jasmine` to the test cases ([#34625](https://github.com/angular/angular/issues/34625)) ([41667de](https://github.com/angular/angular/commit/41667de))
- **zone.js:** clearTimeout/clearInterval should call on object global ([#37858](https://github.com/angular/angular/issues/37858)) ([a71f114](https://github.com/angular/angular/commit/a71f114)), closes [#37333](https://github.com/angular/angular/issues/37333)
- **zone.js:** fix 2 bluebird test cases for each/mapSeries ([#36295](https://github.com/angular/angular/issues/36295)) ([b44f7b5](https://github.com/angular/angular/commit/b44f7b5))
- **zone.js:** patch nodejs EventEmtter.prototype.off ([#37863](https://github.com/angular/angular/issues/37863)) ([1822cbc](https://github.com/angular/angular/commit/1822cbc)), closes [#35473](https://github.com/angular/angular/issues/35473)
- **zone.js:** remove unused Promise overwritten setter logic ([#36851](https://github.com/angular/angular/issues/36851)) ([31796e8](https://github.com/angular/angular/commit/31796e8))
- **zone.js:** should not try to patch fetch if it is not writable ([#36311](https://github.com/angular/angular/issues/36311)) ([416c786](https://github.com/angular/angular/commit/416c786)), closes [#36142](https://github.com/angular/angular/issues/36142)
- **zone.js:** UNPATCHED_EVENTS and PASSIVE_EVENTS should be string[] not boolean ([#36258](https://github.com/angular/angular/issues/36258)) ([36e927a](https://github.com/angular/angular/commit/36e927a))
- **zone.js:** zone patch rxjs should return null \_unsubscribe correctly. ([#37091](https://github.com/angular/angular/issues/37091)) ([96aa14d](https://github.com/angular/angular/commit/96aa14d)), closes [#31684](https://github.com/angular/angular/issues/31684)
- **zone.js:** zone.js patch jest should handle done correctly ([#36022](https://github.com/angular/angular/issues/36022)) ([4374931](https://github.com/angular/angular/commit/4374931))

### Features

- **zone.js:** move all zone optional bundles to plugins folders ([#36540](https://github.com/angular/angular/issues/36540)) ([b199ef6](https://github.com/angular/angular/commit/b199ef6))
- **zone.js:** move MutationObserver/FileReader to different module ([#31657](https://github.com/angular/angular/issues/31657)) ([253337d](https://github.com/angular/angular/commit/253337d))
- **zone.js:** patch jasmine.createSpyObj to make properties enumerable to be true ([#34624](https://github.com/angular/angular/issues/34624)) ([c2b4d92](https://github.com/angular/angular/commit/c2b4d92)), closes [#33657](https://github.com/angular/angular/issues/33657)
- **zone.js:** upgrade zone.js to angular package format(APF) ([#36540](https://github.com/angular/angular/issues/36540)) ([583a9d3](https://github.com/angular/angular/commit/583a9d3)), closes [#35157](https://github.com/angular/angular/issues/35157) [/github.com/angular/angular-cli/blob/5376a8b1392ac7bd252782d8474161ce03a4d1cb/packages/schematics/angular/application/files/src/polyfills.ts.template#L55-L58](https://github.com//github.com/angular/angular-cli/blob/5376a8b1392ac7bd252782d8474161ce03a4d1cb/packages/schematics/angular/application/files/src/polyfills.ts.template/issues/L55-L58)

## [0.10.3](https://github.com/angular/angular/compare/zone.js-0.10.2...zone.js-0.10.3) (2020-02-27)

### Bug Fixes

- **zone.js:** a path traversal attack in test ([#32392](https://github.com/angular/angular/issues/32392)) ([d498314](https://github.com/angular/angular/commit/d4983148508a7ddaeb095ab01db6b3bf995ee23f))
- **zone.js:** work around TS3.7 issue ([#33294](https://github.com/angular/angular/issues/33294)) ([0953642](https://github.com/angular/angular/commit/09536423e83892e716de13b2d14f12fff757f5a0))
- fixes typo of zone.js patch vrdisplaydisconnected property ([#33581](https://github.com/angular/angular/issues/33581)) ([71b8e27](https://github.com/angular/angular/commit/71b8e271b352b80519f1b8bbd786d78b49a2012b)), closes [#33579](https://github.com/angular/angular/issues/33579)
- should also allow subclass Promise without Symbol.species ([#34533](https://github.com/angular/angular/issues/34533)) ([58b29f1](https://github.com/angular/angular/commit/58b29f1503a180fdfb8feb73a30d0c4448afad9a))
- **zone.js:** fix `zone-patch-rxjs` bundle to refer to `rxjs` (rather than include) it. ([#35983](https://github.com/angular/angular/issues/35983)) ([99ea5d7](https://github.com/angular/angular/commit/99ea5d7)), closes [#35878](https://github.com/angular/angular/issues/35878)
- **zone.js:** Make `EventTarget` methods optional in `zone.js` extension API ([#35954](https://github.com/angular/angular/issues/35954)) ([5463462](https://github.com/angular/angular/commit/5463462))
- **zone.js:** zone.js patches rxjs should check null for unsubscribe ([#35990](https://github.com/angular/angular/issues/35990)) ([3fa8952](https://github.com/angular/angular/commit/3fa8952)), closes [#31687](https://github.com/angular/angular/issues/31687) [#31684](https://github.com/angular/angular/issues/31684)

### Features

- implement Symbol.specics of Promise ([#34162](https://github.com/angular/angular/issues/34162)) ([539d8f0](https://github.com/angular/angular/commit/539d8f09e01fb4c577bc8a289d2e124360d4c6b1)), closes [#34105](https://github.com/angular/angular/issues/34105) [#33989](https://github.com/angular/angular/issues/33989)
- define all zone.js configurations to typescript interfaces ([#35329](https://github.com/angular/angular/issues/35329)) ([03d88c7](https://github.com/angular/angular/commit/03d88c7965eb8b1310a1b50675fee66986a9ebac))
- add a temp solution to support passive event listeners. ([#34503](https://github.com/angular/angular/issues/34503)) ([f9d483e](https://github.com/angular/angular/commit/f9d483e76ea9992e3fe3e2b7c8c415c264de4679))
- add an tickOptions parameter with property processNewMacroTasksSynchronously. ([#33838](https://github.com/angular/angular/issues/33838)) ([17b862c](https://github.com/angular/angular/commit/17b862cf82a18490329d88b37d3e86e3245d5759)), closes [#33799](https://github.com/angular/angular/issues/33799)
- add interface definitions which zone extends EventTarget ([#35304](https://github.com/angular/angular/issues/35304)) ([4acb676](https://github.com/angular/angular/commit/4acb676f2e9ba3a9ea33dd020e23534d702f988b)), closes [#35173](https://github.com/angular/angular/issues/35173)
- make jasmine patch as zone module ([#34676](https://github.com/angular/angular/issues/34676)) ([e1160f1](https://github.com/angular/angular/commit/e1160f19beb2399581ae36aa498ec0dc23dfed53))
- make mocha a zone module. ([#34719](https://github.com/angular/angular/issues/34719)) ([332937e](https://github.com/angular/angular/commit/332937ef2471ab039cac1eceda42f80f94912f68))
- add basic jest support ([#35080](https://github.com/angular/angular/issues/35080)) ([daac33c](https://github.com/angular/angular/commit/daac33cdc84c6a882ec04c3009e6a230153716b0))
- **zone.js:** add a zone config to allow user disable wrapping uncaught promise rejection ([#35873](https://github.com/angular/angular/issues/35873)) ([8456c5e](https://github.com/angular/angular/commit/8456c5e)), closes [#27840](https://github.com/angular/angular/issues/27840)
- **zone.js:** Monkey patch MessagePort.prototype onproperties ([#34610](https://github.com/angular/angular/issues/34610)) ([0f8e710](https://github.com/angular/angular/commit/0f8e710))

### Performance Improvements

- performance improvement for eventListeners ([#34613](https://github.com/angular/angular/issues/34613)) ([a3c7ab9](https://github.com/angular/angular/commit/a3c7ab99b79cd63965fcce847d35fb2314676f53))

<a name="0.10.2"></a>

## [0.10.2](https://github.com/angular/angular/compare/zone.js-0.10.1...zone.js-0.10.2) (2019-08-13)

### Features

- **zone.js:** support Promise.allSettled ([#31849](https://github.com/angular/angular/issues/31849)) ([96cbcd6](https://github.com/angular/angular/commit/96cbcd6))

<a name="0.10.1"></a>

## [0.10.1](https://github.com/angular/angular/compare/zone.js-0.10.0...zone.js-0.10.1) (2019-08-02)

### Bug Fixes

- **zone.js:** don't rely on global node typings outside of node/ directory ([#31783](https://github.com/angular/angular/issues/31783)) ([5c9a896](https://github.com/angular/angular/commit/5c9a896))
- **zone.js:** should expose some other internal intefaces ([#31866](https://github.com/angular/angular/issues/31866)) ([f5c605b](https://github.com/angular/angular/commit/f5c605b))

<a name="0.10.0"></a>

# [0.10.0](https://github.com/angular/angular/compare/7b3bcc2...174770e) (2019-07-26)

### Bug Fixes

- **zone.js:** **load_patch and **symbol\_\_ should be in zone_extern for closure compiler ([#31350](https://github.com/angular/angular/issues/31350)) ([6b51ed2](https://github.com/angular/angular/commit/6b51ed2))
- **zone.js:** don't fire unhandledrejection if Zone handled error ([#31718](https://github.com/angular/angular/issues/31718)) ([c7542a1](https://github.com/angular/angular/commit/c7542a1)), closes [#31701](https://github.com/angular/angular/issues/31701)
- **zone.js:** don't wrap uncaught promise error. ([#31443](https://github.com/angular/angular/issues/31443)) ([2bb9a65](https://github.com/angular/angular/commit/2bb9a65)), closes [#27840](https://github.com/angular/angular/issues/27840)
- **zone.js:** fix zone for Jasmine 3.3. ([#31497](https://github.com/angular/angular/issues/31497)) ([c4c340a](https://github.com/angular/angular/commit/c4c340a))
- **zone.js:** handle MSPointer event correctly ([#31722](https://github.com/angular/angular/issues/31722)) ([2c402d5](https://github.com/angular/angular/commit/2c402d5)), closes [#31699](https://github.com/angular/angular/issues/31699)
- **zone.js:** handle new api of electron 4 ([#31669](https://github.com/angular/angular/issues/31669)) ([a445826](https://github.com/angular/angular/commit/a445826)), closes [#31668](https://github.com/angular/angular/issues/31668)
- **zone.js:** hook should set correct current zone ([#31642](https://github.com/angular/angular/issues/31642)) ([17b32b5](https://github.com/angular/angular/commit/17b32b5)), closes [#31641](https://github.com/angular/angular/issues/31641)
- **zone.js:** move property patch to legacy ([#31660](https://github.com/angular/angular/issues/31660)) ([716af10](https://github.com/angular/angular/commit/716af10)), closes [#31659](https://github.com/angular/angular/issues/31659)
- **zone.js:** patch shadydom ([#31717](https://github.com/angular/angular/issues/31717)) ([35a025f](https://github.com/angular/angular/commit/35a025f)), closes [#31686](https://github.com/angular/angular/issues/31686)
- **zone.js:** restore definition of global ([#31453](https://github.com/angular/angular/issues/31453)) ([e6f1b04](https://github.com/angular/angular/commit/e6f1b04)), closes [/github.com/angular/zone.js/commit/71b93711806000d7788e79451478e20d6086aa8a#diff-dd469785fca8680a5b33b1e81c5cfd91R1420](https://github.com//github.com/angular/zone.js/commit/71b93711806000d7788e79451478e20d6086aa8a/issues/diff-dd469785fca8680a5b33b1e81c5cfd91R1420)
- **zone.js:** should remove on symbol property after removeAllListeners ([#31644](https://github.com/angular/angular/issues/31644)) ([a182714](https://github.com/angular/angular/commit/a182714)), closes [#31643](https://github.com/angular/angular/issues/31643)
- **zone.js:** update dart zone link ([#31646](https://github.com/angular/angular/issues/31646)) ([7f7033b](https://github.com/angular/angular/commit/7f7033b)), closes [#31645](https://github.com/angular/angular/issues/31645)
- **zone.js:** zone-mix should import correct browser module ([#31628](https://github.com/angular/angular/issues/31628)) ([87ce4e9](https://github.com/angular/angular/commit/87ce4e9)), closes [#31626](https://github.com/angular/angular/issues/31626)

<a name="0.9.1"></a>

## [0.9.1](https://github.com/angular/zone.js/compare/v0.9.0...0.9.1) (2019-04-30)

### Bug Fixes

- ensure that EventTarget is patched prior to legacy property descriptor patch ([#1214](https://github.com/angular/zone.js/issues/1214)) ([aca4728](https://github.com/angular/zone.js/commit/aca4728))
- fakeAsyncTest requestAnimationFrame should pass timestamp as parameter ([#1220](https://github.com/angular/zone.js/issues/1220)) ([62b8525](https://github.com/angular/zone.js/commit/62b8525)), closes [#1216](https://github.com/angular/zone.js/issues/1216)

### Features

- add option to disable jasmine clock patch, also rename the flag of auto jump in FakeAsyncTest ([#1222](https://github.com/angular/zone.js/issues/1222)) ([10e1b0c](https://github.com/angular/zone.js/commit/10e1b0c))

<a name="0.9.0"></a>

# [0.9.0](https://github.com/angular/zone.js/compare/v0.8.29...0.9.0) (2019-03-12)

### Bug Fixes

- **lint:** fix [#1168](https://github.com/angular/zone.js/issues/1168), remove unused = null code ([#1171](https://github.com/angular/zone.js/issues/1171)) ([917e2af](https://github.com/angular/zone.js/commit/917e2af))
- **test:** fix [#1155](https://github.com/angular/zone.js/issues/1155), try/catch modify error.message ([#1157](https://github.com/angular/zone.js/issues/1157)) ([7e983d1](https://github.com/angular/zone.js/commit/7e983d1))
- **test:** fix: make fakeAsync test spec timer id global ([d32e79b](https://github.com/angular/zone.js/commit/d32e79b))
- **build:** fix: closure related fixes ([2a8415d](https://github.com/angular/zone.js/commit/2a8415d))
- **compile:** fix: remove finally definition from Promise interface ([47dd3f4](https://github.com/angular/zone.js/commit/47dd3f4))

### Doc

- **doc:** [#1181](https://github.com/angular/zone.js/pull/1181), Fix the typo in timer module documentation ([8f78b55](https://github.com/angular/zone.js/commit/8f78b55))
- **doc:** [#1163](https://github.com/angular/zone.js/pull/1163), Update YouTube video link ([f171821](https://github.com/angular/zone.js/commit/f171821))
- **doc:** [#1151](https://github.com/angular/zone.js/pull/1151), Re-phrase the lines for better understanding ([2a6444b](https://github.com/angular/zone.js/commit/2a6444b))
- **doc:** [#1152](https://github.com/angular/zone.js/pull/1152), change the word TimerTask to MacroTask ([f3995de](https://github.com/angular/zone.js/commit/f3995de))

### Features

- **test:** add benchmark page ([#1076](https://github.com/angular/zone.js/issues/1076)) ([128649a](https://github.com/angular/zone.js/commit/128649a))
- **test:** test(promise): add test cases for Promise.all with sync then operation ([#1158](https://github.com/angular/zone.js/issues/1158)) ([0b44e83](https://github.com/angular/zone.js/commit/0b44e83))
- **test:** feat: add an option **zone_symbol**disableDatePatching to allow disabling Date patching ([c378f87](https://github.com/angular/zone.js/commit/c378f87))

### Env

- **env:** change BLACK_LISTED_EVENTS to DISABLE_EVENTS ([9c65d25](https://github.com/angular/zone.js/commit/9c65d25))

### Build

- **build:** build zone-evergreen.js in es2015, add terser minify support ([2ad936b](https://github.com/angular/zone.js/commit/2ad936b))
- **build:** upgrade to pass jasmine 3.3 test ([82dfd75](https://github.com/angular/zone.js/commit/82dfd75))
- **build:** upgrade to typescript 3.2.2 ([fcdd559](https://github.com/angular/zone.js/commit/fcdd559))
- **build:** separate zone.js into evergreen only and legacy included bundles ([ac3851e](https://github.com/angular/zone.js/commit/ac3851e))
- **build:** make legacy standalone bundle ([a5fe09b](https://github.com/angular/zone.js/commit/a5fe09b))

<a name="0.8.29"></a>

## [0.8.29](https://github.com/angular/zone.js/compare/v0.8.28...0.8.29) (2019-01-22)

### Bug Fixes

- **core:** fix for tests in angular repo ([fd069db](https://github.com/angular/zone.js/commit/fd069db))

<a name="0.8.28"></a>

## [0.8.28](https://github.com/angular/zone.js/compare/v0.8.27...0.8.28) (2019-01-16)

### Bug Fixes

- **jasmine:** patch jasmine beforeAll/afterAll ([9d27abc4](https://github.com/angular/zone.js/commit/9d27abc4))

<a name="0.8.27"></a>

## [0.8.27](https://github.com/angular/zone.js/compare/v0.8.26...0.8.27) (2019-01-08)

### Bug Fixes

- **bluebird:** fix [#1112](https://github.com/angular/zone.js/issues/1112), bluebird chained callback should return a Bluebird Promise ([#1114](https://github.com/angular/zone.js/issues/1114)) ([6ba3169](https://github.com/angular/zone.js/commit/6ba3169))
- **core:** fix [#1108](https://github.com/angular/zone.js/issues/1108), window.onerror should have (message, source, lineno, colno, error) signiture ([#1109](https://github.com/angular/zone.js/issues/1109)) ([49e0548](https://github.com/angular/zone.js/commit/49e0548))
- **core:** fix [#1153](https://github.com/angular/zone.js/issues/1153), ZoneTask.toString should always be a string ([#1166](https://github.com/angular/zone.js/issues/1166)) ([afa1363](https://github.com/angular/zone.js/commit/afa1363))
- **core:** fix interval will still run after cancelled error ([#1156](https://github.com/angular/zone.js/issues/1156)) ([eb72ff4](https://github.com/angular/zone.js/commit/eb72ff4))
- **core:** use then directly when promise is not patchable ([#1079](https://github.com/angular/zone.js/issues/1079)) ([d7e0a31](https://github.com/angular/zone.js/commit/d7e0a31))
- **duplicate:** fix [#1081](https://github.com/angular/zone.js/issues/1081), load patch should also check the duplicate flag ([#1121](https://github.com/angular/zone.js/issues/1121)) ([8ce5e33](https://github.com/angular/zone.js/commit/8ce5e33))
- **event:** fix [#1110](https://github.com/angular/zone.js/issues/1110), nodejs EventEmitter should support Symbol eventName ([#1113](https://github.com/angular/zone.js/issues/1113)) ([96420d6](https://github.com/angular/zone.js/commit/96420d6))
- **event:** should pass boolean to addEventListener if not support passive ([#1053](https://github.com/angular/zone.js/issues/1053)) ([e9536ec](https://github.com/angular/zone.js/commit/e9536ec))
- **format:** update clang-format to 1.2.3 ([f238908](https://github.com/angular/zone.js/commit/f238908))
- **memory:** Add protection against excessive on prop patching ([#1106](https://github.com/angular/zone.js/issues/1106)) ([875086f](https://github.com/angular/zone.js/commit/875086f))
- **node:** fix [#1164](https://github.com/angular/zone.js/issues/1164), don't patch uncaughtException to prevent endless loop ([#1170](https://github.com/angular/zone.js/issues/1170)) ([33a0ad6](https://github.com/angular/zone.js/commit/33a0ad6))
- **node:** node patched method should copy original delegate's symbol properties ([#1095](https://github.com/angular/zone.js/issues/1095)) ([0a2f6ff](https://github.com/angular/zone.js/commit/0a2f6ff))
- **onProperty:** user quoted access for \_\_Zone_ignore_on_properties ([#1134](https://github.com/angular/zone.js/issues/1134)) ([7201d44](https://github.com/angular/zone.js/commit/7201d44))
- **test:** karma-dist should test bundle under dist ([#1049](https://github.com/angular/zone.js/issues/1049)) ([0720d79](https://github.com/angular/zone.js/commit/0720d79))
- **tsc:** tsconfig.json strict:true ([915042d](https://github.com/angular/zone.js/commit/915042d))
- **xhr:** fix [#1072](https://github.com/angular/zone.js/issues/1072), should set scheduled flag to target ([#1074](https://github.com/angular/zone.js/issues/1074)) ([34c12e5](https://github.com/angular/zone.js/commit/34c12e5))
- **xhr:** should invoke xhr task after onload is triggered ([#1055](https://github.com/angular/zone.js/issues/1055)) ([2aab9c8](https://github.com/angular/zone.js/commit/2aab9c8))

### Features

- **build:** Upgrade to TypeScript 2.9 and rxjs6 ([#1122](https://github.com/angular/zone.js/issues/1122)) ([31fc127](https://github.com/angular/zone.js/commit/31fc127))
- **core:** upgrade to typescript 3.0.3 ([#1132](https://github.com/angular/zone.js/issues/1132)) ([60adc9c](https://github.com/angular/zone.js/commit/60adc9c))
- **Core:** fix [#910](https://github.com/angular/zone.js/issues/910), add a flag to allow user to ignore duplicate Zone error ([#1093](https://github.com/angular/zone.js/issues/1093)) ([a86c6d5](https://github.com/angular/zone.js/commit/a86c6d5))
- **custom-element:** patch customElement v1 APIs ([#1133](https://github.com/angular/zone.js/issues/1133)) ([427705f](https://github.com/angular/zone.js/commit/427705f))
- **error:** fix [#975](https://github.com/angular/zone.js/issues/975), can config how to load blacklist zone stack frames ([#1045](https://github.com/angular/zone.js/issues/1045)) ([ff3d545](https://github.com/angular/zone.js/commit/ff3d545))
- **fetch:** schedule macroTask when fetch ([#1075](https://github.com/angular/zone.js/issues/1075)) ([bf88c34](https://github.com/angular/zone.js/commit/bf88c34))

<a name="0.8.26"></a>

## [0.8.26](https://github.com/angular/zone.js/compare/v0.8.25...0.8.26) (2018-04-08)

### Bug Fixes

- **test:** fix [#1069](https://github.com/angular/zone.js/issues/1069), FakeDate should handle constructor parameter ([#1070](https://github.com/angular/zone.js/issues/1070)) ([b3fdd7e](https://github.com/angular/zone.js/commit/b3fdd7e))

<a name="0.8.25"></a>

## [0.8.25](https://github.com/angular/zone.js/compare/v0.8.24...0.8.25) (2018-04-04)

### Bug Fixes

- **test:** add async/fakeAsync into zone-testing bundle ([#1068](https://github.com/angular/zone.js/issues/1068)) ([3bdfdad](https://github.com/angular/zone.js/commit/3bdfdad))

<a name="0.8.24"></a>

## [0.8.24](https://github.com/angular/zone.js/compare/v0.8.23...0.8.24) (2018-04-02)

### Bug Fixes

- **test:** add flag to patch jasmine.clock, move fakeAsync/async into original bundle ([#1067](https://github.com/angular/zone.js/issues/1067)) ([389762c](https://github.com/angular/zone.js/commit/389762c))

<a name="0.8.24"></a>

## [0.8.24](https://github.com/angular/zone.js/compare/v0.8.23...0.8.24) (2018-04-02)

### Bug Fixes

- **test:** add flag to patch jasmine.clock, move fakeAsync/async into original bundle ([#1067](https://github.com/angular/zone.js/issues/1067)) ([389762c](https://github.com/angular/zone.js/commit/389762c))

<a name="0.8.23"></a>

## [0.8.23](https://github.com/angular/zone.js/compare/v0.8.22...0.8.23) (2018-04-01)

### Bug Fixes

- **test:** check setImmediate supports ([6c7e45b](https://github.com/angular/zone.js/commit/6c7e45b))

<a name="0.8.22"></a>

## [0.8.22](https://github.com/angular/zone.js/compare/v0.8.21...0.8.22) (2018-03-31)

### Bug Fixes

- **fakeAsync:** fix [#1050](https://github.com/angular/zone.js/issues/1050), should only reset patched Date.now until fakeAsync exit ([#1051](https://github.com/angular/zone.js/issues/1051)) ([e15d735](https://github.com/angular/zone.js/commit/e15d735))
- **fakeAsyncTest:** fix [#1061](https://github.com/angular/zone.js/issues/1061), fakeAsync should support setImmediate ([#1062](https://github.com/angular/zone.js/issues/1062)) ([66c6f97](https://github.com/angular/zone.js/commit/66c6f97))

<a name="0.8.21"></a>

## [0.8.21](https://github.com/angular/zone.js/compare/v0.8.20...0.8.21) (2018-03-30)

### Bug Fixes

- add OriginalDelegate prop to Function::toString ([#993](https://github.com/angular/zone.js/issues/993)) ([2dc7e5c](https://github.com/angular/zone.js/commit/2dc7e5c))
- **core:** fix [#1000](https://github.com/angular/zone.js/issues/1000), check target is null or not when patchOnProperty ([#1004](https://github.com/angular/zone.js/issues/1004)) ([5c139e5](https://github.com/angular/zone.js/commit/5c139e5))
- **core:** fix [#946](https://github.com/angular/zone.js/issues/946), don't patch promise if it is not writable ([#1041](https://github.com/angular/zone.js/issues/1041)) ([c8c5990](https://github.com/angular/zone.js/commit/c8c5990))
- **event:** fix [#1021](https://github.com/angular/zone.js/issues/1021), removeListener/removeAllListeners should return eventEmitter ([#1022](https://github.com/angular/zone.js/issues/1022)) ([ab72df6](https://github.com/angular/zone.js/commit/ab72df6))
- **fakeAsync:** fix [#1056](https://github.com/angular/zone.js/issues/1056), fakeAsync timerId should not be zero ([#1057](https://github.com/angular/zone.js/issues/1057)) ([68682cd](https://github.com/angular/zone.js/commit/68682cd))
- **jasmine:** fix [#1015](https://github.com/angular/zone.js/issues/1015), make jasmine patch compatible to jasmine 3.x ([#1016](https://github.com/angular/zone.js/issues/1016)) ([e1df4bc](https://github.com/angular/zone.js/commit/e1df4bc))
- **patch:** fix [#998](https://github.com/angular/zone.js/issues/998), patch mediaQuery for new Safari ([#1003](https://github.com/angular/zone.js/issues/1003)) ([c7c7db5](https://github.com/angular/zone.js/commit/c7c7db5))
- **proxy:** proxyZone should call onHasTask when change delegate ([#1030](https://github.com/angular/zone.js/issues/1030)) ([40b110d](https://github.com/angular/zone.js/commit/40b110d))
- **test:** fix mocha compatible issue ([#1028](https://github.com/angular/zone.js/issues/1028)) ([c554e9f](https://github.com/angular/zone.js/commit/c554e9f))
- **testing:** fix [#1032](https://github.com/angular/zone.js/issues/1032), fakeAsync should pass parameters correctly ([#1033](https://github.com/angular/zone.js/issues/1033)) ([eefe983](https://github.com/angular/zone.js/commit/eefe983))

### Features

- **bluebird:** fix [#921](https://github.com/angular/zone.js/issues/921), [#977](https://github.com/angular/zone.js/issues/977), support bluebird ([#1039](https://github.com/angular/zone.js/issues/1039)) ([438210c](https://github.com/angular/zone.js/commit/438210c))
- **build:** use yarn instead of npm ([#1025](https://github.com/angular/zone.js/issues/1025)) ([ebd348c](https://github.com/angular/zone.js/commit/ebd348c))
- **core:** fix [#996](https://github.com/angular/zone.js/issues/996), expose UncaughtPromiseError ([#1040](https://github.com/angular/zone.js/issues/1040)) ([7f178b1](https://github.com/angular/zone.js/commit/7f178b1))
- **jasmine:** support Date.now in fakeAsyncTest ([#1009](https://github.com/angular/zone.js/issues/1009)) ([f22065e](https://github.com/angular/zone.js/commit/f22065e))
- **jsonp:** provide a help method to patch jsonp ([#997](https://github.com/angular/zone.js/issues/997)) ([008fd43](https://github.com/angular/zone.js/commit/008fd43))
- **patch:** fix [#1011](https://github.com/angular/zone.js/issues/1011), patch ResizeObserver ([#1012](https://github.com/angular/zone.js/issues/1012)) ([8ee88da](https://github.com/angular/zone.js/commit/8ee88da))
- **patch:** fix [#828](https://github.com/angular/zone.js/issues/828), patch socket.io client ([b3db9f4](https://github.com/angular/zone.js/commit/b3db9f4))
- **promise:** support Promise.prototype.finally ([#1005](https://github.com/angular/zone.js/issues/1005)) ([6a1a830](https://github.com/angular/zone.js/commit/6a1a830))
- **rollup:** use new rollup config to prevent warning ([#1006](https://github.com/angular/zone.js/issues/1006)) ([6b6b38a](https://github.com/angular/zone.js/commit/6b6b38a))
- **test:** can handle non zone aware task in promise ([#1014](https://github.com/angular/zone.js/issues/1014)) ([6852f1d](https://github.com/angular/zone.js/commit/6852f1d))
- **test:** move async/fakeAsync from angular to zone.js ([#1048](https://github.com/angular/zone.js/issues/1048)) ([a4b42cd](https://github.com/angular/zone.js/commit/a4b42cd))
- **testing:** can display pending tasks info when test timeout in jasmine/mocha ([#1038](https://github.com/angular/zone.js/issues/1038)) ([57bc80c](https://github.com/angular/zone.js/commit/57bc80c))

<a name="0.8.20"></a>

## [0.8.20](https://github.com/angular/zone.js/compare/v0.8.19...0.8.20) (2018-01-10)

### Bug Fixes

- **core:** add comment for shorter var/function name ([67e8178](https://github.com/angular/zone.js/commit/67e8178))
- **core:** add file check script in travis build ([615a6c1](https://github.com/angular/zone.js/commit/615a6c1))
- **core:** add helper method in util.ts to shorter zone.wrap/scehduleMacroTask ([8293c37](https://github.com/angular/zone.js/commit/8293c37))
- **core:** add rxjs test ([31832a7](https://github.com/angular/zone.js/commit/31832a7))
- **core:** fix [#989](https://github.com/angular/zone.js/issues/989), remove unuse code, use shorter name to reduce bundle size ([73b0061](https://github.com/angular/zone.js/commit/73b0061))
- **core:** fix shorter name closure conflict ([00a4e31](https://github.com/angular/zone.js/commit/00a4e31))
- **core:** remove unreadable short names ([957351e](https://github.com/angular/zone.js/commit/957351e))

<a name="0.8.18"></a>

## [0.8.18](https://github.com/angular/zone.js/compare/v0.8.17...0.8.18) (2017-09-27)

### Bug Fixes

- **event:** EventTarget of SourceBuffer in samsung tv will have null context ([#904](https://github.com/angular/zone.js/issues/904)) ([8718e07](https://github.com/angular/zone.js/commit/8718e07))
- **event:** fix [#883](https://github.com/angular/zone.js/issues/883), fix RTCPeerConnection Safari event not triggered issue ([#905](https://github.com/angular/zone.js/issues/905)) ([6f74efb](https://github.com/angular/zone.js/commit/6f74efb))
- **event:** fix [#911](https://github.com/angular/zone.js/issues/911), in IE, event handler event maybe undefined ([#913](https://github.com/angular/zone.js/issues/913)) ([4ba5d97](https://github.com/angular/zone.js/commit/4ba5d97))
- **event:** should handle event.stopImmediatePropagration ([#903](https://github.com/angular/zone.js/issues/903)) ([dcc285a](https://github.com/angular/zone.js/commit/dcc285a))
- **patch:** patchOnProperty getter should return original listener ([#887](https://github.com/angular/zone.js/issues/887)) ([d4e5ae8](https://github.com/angular/zone.js/commit/d4e5ae8))
- **patch:** Worker should patch onProperties ([#915](https://github.com/angular/zone.js/issues/915)) ([418a583](https://github.com/angular/zone.js/commit/418a583))
- **promise:** can set native promise after loading zone.js ([#899](https://github.com/angular/zone.js/issues/899)) ([956c729](https://github.com/angular/zone.js/commit/956c729))
- **timer:** fix [#314](https://github.com/angular/zone.js/issues/314), setTimeout/interval should return original timerId ([#894](https://github.com/angular/zone.js/issues/894)) ([aec4bd4](https://github.com/angular/zone.js/commit/aec4bd4))

### Features

- **compile:** fix [#892](https://github.com/angular/zone.js/issues/892), upgrade to typescript 2.3.4, support for...of when build zone-node ([#897](https://github.com/angular/zone.js/issues/897)) ([e999593](https://github.com/angular/zone.js/commit/e999593))
- **spec:** log URL in error when attempting XHR from FakeAsyncTestZone ([#893](https://github.com/angular/zone.js/issues/893)) ([874bfdc](https://github.com/angular/zone.js/commit/874bfdc))

<a name="0.8.17"></a>

## [0.8.17](https://github.com/angular/zone.js/compare/v0.8.16...0.8.17) (2017-08-23)

### Bug Fixes

- readonly property should not be patched ([#860](https://github.com/angular/zone.js/issues/860)) ([7fbd655](https://github.com/angular/zone.js/commit/7fbd655))
- suppress closure warnings/errors ([#861](https://github.com/angular/zone.js/issues/861)) ([deae751](https://github.com/angular/zone.js/commit/deae751))
- **module:** fix [#875](https://github.com/angular/zone.js/issues/875), can disable requestAnimationFrame ([#876](https://github.com/angular/zone.js/issues/876)) ([fcf187c](https://github.com/angular/zone.js/commit/fcf187c))
- **node:** remove reference to 'noop' ([#865](https://github.com/angular/zone.js/issues/865)) ([4032ddf](https://github.com/angular/zone.js/commit/4032ddf))
- **patch:** fix [#869](https://github.com/angular/zone.js/issues/869), should not patch readonly method ([#871](https://github.com/angular/zone.js/issues/871)) ([31d38c1](https://github.com/angular/zone.js/commit/31d38c1))
- **rxjs:** asap should runGuarded to let error inZone ([#884](https://github.com/angular/zone.js/issues/884)) ([ce3f12f](https://github.com/angular/zone.js/commit/ce3f12f))
- **rxjs:** fix [#863](https://github.com/angular/zone.js/issues/863), fix asap scheduler issue, add testcases ([#848](https://github.com/angular/zone.js/issues/848)) ([cbc58c1](https://github.com/angular/zone.js/commit/cbc58c1))
- **spec:** fix flush() behavior in handling periodic timers ([#881](https://github.com/angular/zone.js/issues/881)) ([eed776c](https://github.com/angular/zone.js/commit/eed776c))
- **task:** fix closure compatibility issue with ZoneDelegate.\_updateTaskCount ([#878](https://github.com/angular/zone.js/issues/878)) ([a03b84b](https://github.com/angular/zone.js/commit/a03b84b))

### Features

- **cordova:** fix [#868](https://github.com/angular/zone.js/issues/868), patch cordova FileReader ([#879](https://github.com/angular/zone.js/issues/879)) ([b1e5970](https://github.com/angular/zone.js/commit/b1e5970))
- **onProperty:** fix [#875](https://github.com/angular/zone.js/issues/875), can disable patch specified onProperties ([#877](https://github.com/angular/zone.js/issues/877)) ([a733688](https://github.com/angular/zone.js/commit/a733688))
- **patch:** fix [#833](https://github.com/angular/zone.js/issues/833), add IntersectionObserver support ([#880](https://github.com/angular/zone.js/issues/880)) ([f27ff14](https://github.com/angular/zone.js/commit/f27ff14))
- **performance:** onProperty handler use global wrapFn, other performance improve. ([#872](https://github.com/angular/zone.js/issues/872)) ([a66595a](https://github.com/angular/zone.js/commit/a66595a))
- **performance:** reuse microTaskQueue native promise ([#874](https://github.com/angular/zone.js/issues/874)) ([7ee8bcd](https://github.com/angular/zone.js/commit/7ee8bcd))
- **spec:** add a 'tick' callback to flush() ([#866](https://github.com/angular/zone.js/issues/866)) ([02cd40e](https://github.com/angular/zone.js/commit/02cd40e))

<a name="0.8.16"></a>

## [0.8.16](https://github.com/angular/zone.js/compare/v0.8.15...0.8.16) (2017-07-27)

### Bug Fixes

- **console:** console.log in nodejs should run in root Zone ([#855](https://github.com/angular/zone.js/issues/855)) ([5900d3a](https://github.com/angular/zone.js/commit/5900d3a))
- **promise:** fix [#850](https://github.com/angular/zone.js/issues/850), check Promise.then writable ([#851](https://github.com/angular/zone.js/issues/851)) ([6e44cab](https://github.com/angular/zone.js/commit/6e44cab))
- **spec:** do not count requestAnimationFrame as a pending timer ([#854](https://github.com/angular/zone.js/issues/854)) ([eca04b0](https://github.com/angular/zone.js/commit/eca04b0))

### Features

- **spec:** add an option to FakeAsyncTestZoneSpec to flush periodic timers ([#857](https://github.com/angular/zone.js/issues/857)) ([5c5ca1a](https://github.com/angular/zone.js/commit/5c5ca1a))

<a name="0.8.15"></a>

## [0.8.15](https://github.com/angular/zone.js/compare/v0.8.13...0.8.15) (2017-07-27)

### Features

- **rxjs:** fix [#830](https://github.com/angular/zone.js/issues/830), monkey patch rxjs to make rxjs run in correct zone ([#843](https://github.com/angular/zone.js/issues/843)) ([1ed83d0](https://github.com/angular/zone.js/commit/1ed83d0))

<a name="0.8.14"></a>

## [0.8.14](https://github.com/angular/zone.js/compare/v0.8.13...0.8.14) (2017-07-20)

### Bug Fixes

- **event:** fix [#836](https://github.com/angular/zone.js/issues/836), handle event callback call removeEventListener case ([#839](https://github.com/angular/zone.js/issues/839)) ([f301fa2](https://github.com/angular/zone.js/commit/f301fa2))
- **event:** fix memory leak for once, add more test cases ([#841](https://github.com/angular/zone.js/issues/841)) ([2143d9c](https://github.com/angular/zone.js/commit/2143d9c))
- **task:** fix [#832](https://github.com/angular/zone.js/issues/832), fix [#835](https://github.com/angular/zone.js/issues/835), task.data should be an object ([#834](https://github.com/angular/zone.js/issues/834)) ([3a4bfbd](https://github.com/angular/zone.js/commit/3a4bfbd))

### Features

- **rxjs:** fix [#830](https://github.com/angular/zone.js/issues/830), monkey patch rxjs to make rxjs run in correct zone ([#843](https://github.com/angular/zone.js/issues/843)) ([1ed83d0](https://github.com/angular/zone.js/commit/1ed83d0))

<a name="0.8.14"></a>

## [0.8.14](https://github.com/angular/zone.js/compare/v0.8.13...0.8.14) (2017-07-18)

### Bug Fixes

- **event:** fix [#836](https://github.com/angular/zone.js/issues/836), handle event callback call removeEventListener case ([#839](https://github.com/angular/zone.js/issues/839)) ([f301fa2](https://github.com/angular/zone.js/commit/f301fa2))
- **event:** fix memory leak for once, add more test cases ([#841](https://github.com/angular/zone.js/issues/841)) ([2143d9c](https://github.com/angular/zone.js/commit/2143d9c))
- **task:** fix [#832](https://github.com/angular/zone.js/issues/832), fix [#835](https://github.com/angular/zone.js/issues/835), task.data should be an object ([#834](https://github.com/angular/zone.js/issues/834)) ([3a4bfbd](https://github.com/angular/zone.js/commit/3a4bfbd))

<a name="0.8.13"></a>

## [0.8.13](https://github.com/angular/zone.js/compare/v0.8.12...0.8.13) (2017-07-12)

### Bug Fixes

- **promise:** fix [#806](https://github.com/angular/zone.js/issues/806), remove duplicate consolelog ([#807](https://github.com/angular/zone.js/issues/807)) ([f439fe2](https://github.com/angular/zone.js/commit/f439fe2))
- **spec:** fakeAsyncTestSpec should handle requestAnimationFrame ([#805](https://github.com/angular/zone.js/issues/805)) ([8260f1d](https://github.com/angular/zone.js/commit/8260f1d)), closes [#804](https://github.com/angular/zone.js/issues/804)
- **websocket:** fix [#824](https://github.com/angular/zone.js/issues/824), patch websocket onproperties correctly in PhantomJS ([#826](https://github.com/angular/zone.js/issues/826)) ([273cb85](https://github.com/angular/zone.js/commit/273cb85))

### Features

- **FakeAsyncTestZoneSpec:** FakeAsyncTestZoneSpec.flush() passes limit along to scheduler ([#831](https://github.com/angular/zone.js/issues/831)) ([667cd6f](https://github.com/angular/zone.js/commit/667cd6f))

### Performance Improvements

- **eventListener:** fix [#798](https://github.com/angular/zone.js/issues/798), improve EventTarget.addEventListener performance ([#812](https://github.com/angular/zone.js/issues/812)) ([b3a76d3](https://github.com/angular/zone.js/commit/b3a76d3))

<a name="0.8.12"></a>

## [0.8.12](https://github.com/angular/zone.js/compare/v0.8.11...0.8.12) (2017-06-07)

### Bug Fixes

- **doc:** fix [#793](https://github.com/angular/zone.js/issues/793), fix confuseing bluebird patch doc ([#794](https://github.com/angular/zone.js/issues/794)) ([0c5da04](https://github.com/angular/zone.js/commit/0c5da04))
- **patch:** fix [#791](https://github.com/angular/zone.js/issues/791), fix mediaQuery/Notification patch uses wrong global ([#792](https://github.com/angular/zone.js/issues/792)) ([67634ae](https://github.com/angular/zone.js/commit/67634ae))
- **toString:** fix [#802](https://github.com/angular/zone.js/issues/802), fix ios 9 MutationObserver toString error ([#803](https://github.com/angular/zone.js/issues/803)) ([68aa03e](https://github.com/angular/zone.js/commit/68aa03e))
- **xhr:** inner onreadystatechange should not triigger Zone callback ([#800](https://github.com/angular/zone.js/issues/800)) ([7bd1Y(418](https://github.com/angular/zone.js/commit/7bd1418))

### Features

- **patch:** fix [#696](https://github.com/angular/zone.js/issues/696), patch HTMLCanvasElement.toBlob as MacroTask ([#788](https://github.com/angular/zone.js/issues/788)) ([7ca3995](https://github.com/angular/zone.js/commit/7ca3995))
- **patch:** fix [#758](https://github.com/angular/zone.js/issues/758), patch cordova.exec success/error with zone.wrap ([#789](https://github.com/angular/zone.js/issues/789)) ([857929d](https://github.com/angular/zone.js/commit/857929d))

<a name="0.8.11"></a>

## [0.8.11](https://github.com/angular/zone.js/compare/v0.8.10...0.8.11) (2017-05-19)

### Bug Fixes

- **closure:** patchOnProperty with exact eventNames as possible ([#768](https://github.com/angular/zone.js/issues/768)) ([582ff7b](https://github.com/angular/zone.js/commit/582ff7b))
- **patch:** fix [#744](https://github.com/angular/zone.js/issues/744), add namespace to load patch name ([#774](https://github.com/angular/zone.js/issues/774)) ([89f990a](https://github.com/angular/zone.js/commit/89f990a))
- **task:** fix [#778](https://github.com/angular/zone.js/issues/778), sometimes task will run after being canceled ([#780](https://github.com/angular/zone.js/issues/780)) ([b7238c8](https://github.com/angular/zone.js/commit/b7238c8))
- **webcomponents:** fix [#782](https://github.com/angular/zone.js/issues/782), fix conflicts with shadydom of webcomponents ([#784](https://github.com/angular/zone.js/issues/784)) ([245f8e9](https://github.com/angular/zone.js/commit/245f8e9))
- **webpack:** access `process` through `_global` so that WebPack does not accidentally browserify ([#786](https://github.com/angular/zone.js/issues/786)) ([1919b36](https://github.com/angular/zone.js/commit/1919b36))

<a name="0.8.10"></a>

## [0.8.10](https://github.com/angular/zone.js/compare/v0.8.9...0.8.10) (2017-05-03)

### Bug Fixes

- **showError:** fix ignoreConsoleErrorUncaughtError may change during drain microtask ([#763](https://github.com/angular/zone.js/issues/763)) ([4baeb5c](https://github.com/angular/zone.js/commit/4baeb5c))
- **spec:** fix [#760](https://github.com/angular/zone.js/issues/760), fakeAsyncTestSpec should handle microtask with additional args ([#762](https://github.com/angular/zone.js/issues/762)) ([f8d17ac](https://github.com/angular/zone.js/commit/f8d17ac))
- Package Error stack rewriting as a separate bundle. ([#770](https://github.com/angular/zone.js/issues/770)) ([b5e33fd](https://github.com/angular/zone.js/commit/b5e33fd))
- **timer:** fix [#437](https://github.com/angular/zone.js/issues/437), [#744](https://github.com/angular/zone.js/issues/744), fix nativescript timer issue, fix nodejs v0.10.x timer issue ([#772](https://github.com/angular/zone.js/issues/772)) ([3218b5a](https://github.com/angular/zone.js/commit/3218b5a))

### Features

- make codebase more modular so that only parts of it can be loaded ([#748](https://github.com/angular/zone.js/issues/748)) ([e933cbd](https://github.com/angular/zone.js/commit/e933cbd))
- **patch:** load non standard api with new load module method ([#764](https://github.com/angular/zone.js/issues/764)) ([97c03b5](https://github.com/angular/zone.js/commit/97c03b5))

<a name="0.8.9"></a>

## [0.8.9](https://github.com/angular/zone.js/compare/v0.8.8...0.8.9) (2017-04-25)

### Bug Fixes

- **patch:** fix [#746](https://github.com/angular/zone.js/issues/746), check desc get is null and only patch window.resize additionally ([#747](https://github.com/angular/zone.js/issues/747)) ([e598310](https://github.com/angular/zone.js/commit/e598310))

<a name="0.8.8"></a>

## [0.8.8](https://github.com/angular/zone.js/compare/v0.8.7...0.8.8) (2017-04-21)

### Bug Fixes

- on<property> handling broken in v0.8.7 ([fbe7b13](https://github.com/angular/zone.js/commit/fbe7b13))

<a name="0.8.7"></a>

## [0.8.7](https://github.com/angular/zone.js/compare/v0.8.5...0.8.7) (2017-04-21)

### Bug Fixes

- **doc:** fix typo in document, fix a typescript warning in test ([#732](https://github.com/angular/zone.js/issues/732)) ([55cf064](https://github.com/angular/zone.js/commit/55cf064))
- **error:** fix [#706](https://github.com/angular/zone.js/issues/706), handleError when onHasTask throw error ([#709](https://github.com/angular/zone.js/issues/709)) ([06d1ac0](https://github.com/angular/zone.js/commit/06d1ac0))
- **error:** remove throw in Error constructor to improve performance in IE11 ([#704](https://github.com/angular/zone.js/issues/704)) ([88d1a49](https://github.com/angular/zone.js/commit/88d1a49)), closes [#698](https://github.com/angular/zone.js/issues/698)
- **listener:** fix [#616](https://github.com/angular/zone.js/issues/616), webdriver removeEventListener throw permission denied error ([#699](https://github.com/angular/zone.js/issues/699)) ([e02960d](https://github.com/angular/zone.js/commit/e02960d))
- **patch:** fix [#707](https://github.com/angular/zone.js/issues/707), should not try to patch non configurable property ([#717](https://github.com/angular/zone.js/issues/717)) ([e422fb1](https://github.com/angular/zone.js/commit/e422fb1))
- **patch:** fix [#708](https://github.com/angular/zone.js/issues/708), modify the canPatchDescriptor logic when browser don't provide onreadystatechange ([#711](https://github.com/angular/zone.js/issues/711)) ([7d4d07f](https://github.com/angular/zone.js/commit/7d4d07f))
- **patch:** fix [#719](https://github.com/angular/zone.js/issues/719), window onproperty callback this is undefined ([#723](https://github.com/angular/zone.js/issues/723)) ([160531b](https://github.com/angular/zone.js/commit/160531b))
- **task:** fix [#705](https://github.com/angular/zone.js/issues/705), don't json task.data to prevent cyclic error ([#712](https://github.com/angular/zone.js/issues/712)) ([92a39e2](https://github.com/angular/zone.js/commit/92a39e2))
- **test:** fix [#718](https://github.com/angular/zone.js/issues/718), use async test to do unhandle promise rejection test ([#726](https://github.com/angular/zone.js/issues/726)) ([0a06874](https://github.com/angular/zone.js/commit/0a06874))
- **test:** fix websocket test server will crash when test in chrome ([#733](https://github.com/angular/zone.js/issues/733)) ([5090cf9](https://github.com/angular/zone.js/commit/5090cf9))
- **toString:** fix [#666](https://github.com/angular/zone.js/issues/666), Zone patched method toString should like before patched ([#686](https://github.com/angular/zone.js/issues/686)) ([0d0ee53](https://github.com/angular/zone.js/commit/0d0ee53))
- resolve errors with closure ([#722](https://github.com/angular/zone.js/issues/722)) ([51e7ffe](https://github.com/angular/zone.js/commit/51e7ffe))
- **typo:** fix typo, remove extra semicolons, unify api doc ([#697](https://github.com/angular/zone.js/issues/697)) ([967a991](https://github.com/angular/zone.js/commit/967a991))

### Features

- **closure:** fix [#727](https://github.com/angular/zone.js/issues/727), add zone_externs.js for closure compiler ([#731](https://github.com/angular/zone.js/issues/731)) ([b60e9e6](https://github.com/angular/zone.js/commit/b60e9e6))
- **error:** Remove all Zone frames from stack ([#693](https://github.com/angular/zone.js/issues/693)) ([681a017](https://github.com/angular/zone.js/commit/681a017))
- **EventListenerOptions:** fix [#737](https://github.com/angular/zone.js/issues/737), add support to EventListenerOptions ([#738](https://github.com/angular/zone.js/issues/738)) ([a89830d](https://github.com/angular/zone.js/commit/a89830d))
- **patch:** fix [#499](https://github.com/angular/zone.js/issues/499), let promise instance toString active like native ([#734](https://github.com/angular/zone.js/issues/734)) ([2f11e67](https://github.com/angular/zone.js/commit/2f11e67))

<a name="0.8.5"></a>

## [0.8.5](https://github.com/angular/zone.js/compare/v0.8.4...0.8.5) (2017-03-21)

### Bug Fixes

- add support for subclassing of Errors ([81297ee](https://github.com/angular/zone.js/commit/81297ee))
- improve long-stack-trace stack format detection ([6010557](https://github.com/angular/zone.js/commit/6010557))
- remove left over console.log ([eeaab91](https://github.com/angular/zone.js/commit/eeaab91))
- **event:** fix [#667](https://github.com/angular/zone.js/issues/667), eventHandler should return result ([#682](https://github.com/angular/zone.js/issues/682)) ([5c4e24d](https://github.com/angular/zone.js/commit/5c4e24d))
- **jasmine:** modify jasmine test ifEnvSupports message ([#689](https://github.com/angular/zone.js/issues/689)) ([5635ac0](https://github.com/angular/zone.js/commit/5635ac0))
- **REVERT:** remove zone internal stack frames in error.stack ([#632](https://github.com/angular/zone.js/issues/632)) ([#690](https://github.com/angular/zone.js/issues/690)) ([291d5a0](https://github.com/angular/zone.js/commit/291d5a0))

### Features

- **dom:** fix [#664](https://github.com/angular/zone.js/issues/664), patch window,document,SVGElement onProperties ([#687](https://github.com/angular/zone.js/issues/687)) ([61aee2e](https://github.com/angular/zone.js/commit/61aee2e))

<a name="0.8.4"></a>

## [0.8.4](https://github.com/angular/zone.js/compare/v0.8.3...0.8.4) (2017-03-16)

### Bug Fixes

- correct declaration which breaks closure ([0e19304](https://github.com/angular/zone.js/commit/0e19304))
- stack rewriting now works with source maps ([bcd09a0](https://github.com/angular/zone.js/commit/bcd09a0))

<a name="0.8.3"></a>

## [0.8.3](https://github.com/angular/zone.js/compare/v0.8.1...0.8.3) (2017-03-15)

### Bug Fixes

- **zone:** consistent access to **symbol** to work with closure ([f742394](https://github.com/angular/zone.js/commit/f742394))

<a name="0.8.2"></a>

## [0.8.2](https://github.com/angular/zone.js/compare/v0.8.1...0.8.2) (2017-03-14)

### Bug Fixes

- **zone:** fix [#674](https://github.com/angular/zone.js/issues/674), handle error.stack readonly case ([#675](https://github.com/angular/zone.js/issues/675)) ([8322be8](https://github.com/angular/zone.js/commit/8322be8))

<a name="0.8.1"></a>

## [0.8.1](https://github.com/angular/zone.js/compare/v0.8.0...0.8.1) (2017-03-13)

### Bug Fixes

- **example:** Update counting.html ([#648](https://github.com/angular/zone.js/issues/648)) ([a63ae5f](https://github.com/angular/zone.js/commit/a63ae5f))
- **XHR:** fix [#671](https://github.com/angular/zone.js/issues/671), patch XMLHttpRequestEventTarget prototype ([300dc36](https://github.com/angular/zone.js/commit/300dc36))

### Features

- **error:** remove zone internal stack frames in error.stack ([#632](https://github.com/angular/zone.js/issues/632)) ([76fa891](https://github.com/angular/zone.js/commit/76fa891))
- **task:** add task lifecycle doc and testcases to explain task state transition. ([#651](https://github.com/angular/zone.js/issues/651)) ([ef39a44](https://github.com/angular/zone.js/commit/ef39a44))

<a name="0.8.0"></a>

# [0.8.0](https://github.com/angular/zone.js/compare/v0.7.8...0.8.0) (2017-03-10)

### Features

- Upgrade TypeScript to v2.2.1

<a name="0.7.8"></a>

## [0.7.8](https://github.com/angular/zone.js/compare/v0.7.6...0.7.8) (2017-03-10)

### Bug Fixes

- **core:** remove debugger ([#639](https://github.com/angular/zone.js/issues/639)) ([0534b19](https://github.com/angular/zone.js/commit/0534b19))
- **error:** fix [#618](https://github.com/angular/zone.js/issues/618), ZoneAwareError should copy Error's static propeties ([#647](https://github.com/angular/zone.js/issues/647)) ([2d30914](https://github.com/angular/zone.js/commit/2d30914))
- **jasmine:** support "pending" `it` clauses with no test body ([96cb3d0](https://github.com/angular/zone.js/commit/96cb3d0)), closes [#659](https://github.com/angular/zone.js/issues/659)
- **minification:** fix [#607](https://github.com/angular/zone.js/issues/607) to change catch variable name to error/err ([#609](https://github.com/angular/zone.js/issues/609)) ([33d0d8d](https://github.com/angular/zone.js/commit/33d0d8d))
- **node:** patch crypto as macroTask and add test cases for crypto, remove http patch ([#612](https://github.com/angular/zone.js/issues/612)) ([9e81037](https://github.com/angular/zone.js/commit/9e81037))
- **package:** use fixed version typescript,clang-format and jasmine ([#650](https://github.com/angular/zone.js/issues/650)) ([84459f1](https://github.com/angular/zone.js/commit/84459f1))
- **patch:** check timer patch return undefined ([#628](https://github.com/angular/zone.js/issues/628)) ([47962df](https://github.com/angular/zone.js/commit/47962df))
- **patch:** fix [#618](https://github.com/angular/zone.js/issues/618), use zoneSymbol as property name to avoid name conflict ([#645](https://github.com/angular/zone.js/issues/645)) ([fcd8be5](https://github.com/angular/zone.js/commit/fcd8be5))
- **task:** findEventTask should return Task array ([#633](https://github.com/angular/zone.js/issues/633)) ([14c7a6f](https://github.com/angular/zone.js/commit/14c7a6f))
- **task:** fix [#638](https://github.com/angular/zone.js/issues/638), eventTask/Periodical task should not be reset after cancel in running state ([#642](https://github.com/angular/zone.js/issues/642)) ([eb9250d](https://github.com/angular/zone.js/commit/eb9250d))
- **timers:** cleanup task reference when exception ([#637](https://github.com/angular/zone.js/issues/637)) ([2594940](https://github.com/angular/zone.js/commit/2594940))
- **webapi:** refactor webapi to not import util.ts directly ([8b2543e](https://github.com/angular/zone.js/commit/8b2543e)), closes [#652](https://github.com/angular/zone.js/issues/652)
- **xhr:** fix [#657](https://github.com/angular/zone.js/issues/657), sometimes xhr will fire onreadystatechange with done twice ([#658](https://github.com/angular/zone.js/issues/658)) ([36c0899](https://github.com/angular/zone.js/commit/36c0899))
- **zonespec:** don't throw and exception when setInterval is called within a async test zone ([#641](https://github.com/angular/zone.js/issues/641)) ([c07560f](https://github.com/angular/zone.js/commit/c07560f))

### Features

- add Zone.root api ([#601](https://github.com/angular/zone.js/issues/601)) ([9818139](https://github.com/angular/zone.js/commit/9818139))
- allow tasks to be canceled and rescheduled on different zone in a zone delegate ([#629](https://github.com/angular/zone.js/issues/629)) ([76c6ebf](https://github.com/angular/zone.js/commit/76c6ebf))
- make fetch() zone-aware without triggering extra requests or uncatchable errors. ([#622](https://github.com/angular/zone.js/issues/622)) ([6731ad0](https://github.com/angular/zone.js/commit/6731ad0))
- **bluebird:** patch bluebird promise and treat it as microtask ([#655](https://github.com/angular/zone.js/issues/655)) ([e783bfa](https://github.com/angular/zone.js/commit/e783bfa))
- **electron/nw:** fix [#533](https://github.com/angular/zone.js/issues/533), in electron/nw.js, we may need to patch both browser API and nodejs API, so we need a zone-mix.js to contains both patched API. ([6d31734](https://github.com/angular/zone.js/commit/6d31734))
- **longStackTraceSpec:** handled promise rejection can also render longstacktrace ([#631](https://github.com/angular/zone.js/issues/631)) ([a4c6525](https://github.com/angular/zone.js/commit/a4c6525))
- **promise:** fix [#621](https://github.com/angular/zone.js/issues/621), add unhandledRejection handler and ignore consoleError ([#627](https://github.com/angular/zone.js/issues/627)) ([f3547cc](https://github.com/angular/zone.js/commit/f3547cc))

<a name="0.7.6"></a>

## [0.7.6](https://github.com/angular/zone.js/compare/v0.7.4...0.7.6) (2017-01-17)

### Bug Fixes

- **doc:** typo in comment and reformat README.md ([#590](https://github.com/angular/zone.js/issues/590)) ([95ad315](https://github.com/angular/zone.js/commit/95ad315))
- **ZoneAwareError:** Error should keep prototype chain and can be called without new ([82722c3](https://github.com/angular/zone.js/commit/82722c3)), closes [#546](https://github.com/angular/zone.js/issues/546) [#554](https://github.com/angular/zone.js/issues/554) [#555](https://github.com/angular/zone.js/issues/555)
- [#536](https://github.com/angular/zone.js/issues/536), add notification api patch ([#599](https://github.com/angular/zone.js/issues/599)) ([83dfa97](https://github.com/angular/zone.js/commit/83dfa97))
- [#593](https://github.com/angular/zone.js/issues/593), only call removeAttribute when have the method ([#594](https://github.com/angular/zone.js/issues/594)) ([1401d60](https://github.com/angular/zone.js/commit/1401d60))
- [#595](https://github.com/angular/zone.js/issues/595), refactor ZoneAwareError property copy ([#597](https://github.com/angular/zone.js/issues/597)) ([f7330de](https://github.com/angular/zone.js/commit/f7330de))
- [#604](https://github.com/angular/zone.js/issues/604), sometimes setInterval test spec will fail on Android 4.4 ([#605](https://github.com/angular/zone.js/issues/605)) ([e3cd1f4](https://github.com/angular/zone.js/commit/e3cd1f4))
- add missing test MutationObserver ([5c7bc01](https://github.com/angular/zone.js/commit/5c7bc01))
- Promise.toString() to look like native function ([f854ce0](https://github.com/angular/zone.js/commit/f854ce0))

<a name="0.7.5"></a>

## [0.7.5](https://github.com/angular/zone.js/compare/v0.7.4...0.7.5) (2017-01-12)

### Bug Fixes

- patch fs methods as macrotask, add test cases of fs watcher ([#572](https://github.com/angular/zone.js/issues/572)) ([e1d3240](https://github.com/angular/zone.js/commit/e1d3240))
- fix [#577](https://github.com/angular/zone.js/issues/577), canPatchViaPropertyDescriptor test should add configurable to XMLHttpRequest.prototype ([#578](https://github.com/angular/zone.js/issues/578)) ([c297752](https://github.com/angular/zone.js/commit/c297752))
- fix [#551](https://github.com/angular/zone.js/issues/551), add toJSON to ZoneTask to prevent cyclic error ([#576](https://github.com/angular/zone.js/issues/576)) ([03d19f9](https://github.com/angular/zone.js/commit/03d19f9))
- fix [#574](https://github.com/angular/zone.js/issues/574), captureStackTrace will have additional stackframe from Zone will break binding.js ([#575](https://github.com/angular/zone.js/issues/575)) ([41f5306](https://github.com/angular/zone.js/commit/41f5306))
- fix [#569](https://github.com/angular/zone.js/issues/569), request will cause updateTaskCount failed if we call abort multipletimes ([#570](https://github.com/angular/zone.js/issues/570)) ([62f1449](https://github.com/angular/zone.js/commit/62f1449))
- add web-api.ts to patch mediaQuery ([#571](https://github.com/angular/zone.js/issues/571)) ([e92f934](https://github.com/angular/zone.js/commit/e92f934))
- fix [#584](https://github.com/angular/zone.js/issues/584), remove android 4.1~4.3, add no-ssl options to make android 4.4 pass test ([#586](https://github.com/angular/zone.js/issues/586)) ([7cd570e](https://github.com/angular/zone.js/commit/7cd570e))
- Fix [#532](https://github.com/angular/zone.js/issues/532), Fix [#566](https://github.com/angular/zone.js/issues/566), add tslint in ci, add tslint/format/test/karma in precommit of git ([#565](https://github.com/angular/zone.js/issues/565)) ([fb8d51c](https://github.com/angular/zone.js/commit/fb8d51c))
- docs(zone.ts): fix typo ([#583](https://github.com/angular/zone.js/issues/583)) ([ecbef87](https://github.com/angular/zone.js/commit/ecbef87))
- add missing test MutationObserver ([5c7bc01](https://github.com/angular/zone.js/commit/5c7bc01))
- Promise.toString() to look like native function ([f854ce0](https://github.com/angular/zone.js/commit/f854ce0))
- **ZoneAwareError:** Error should keep prototype chain and can be called without new ([82722c3](https://github.com/angular/zone.js/commit/82722c3)), closes [#546](https://github.com/angular/zone.js/issues/546) [#554](https://github.com/angular/zone.js/issues/554) [#555](https://github.com/angular/zone.js/issues/555)

<a name="0.7.4"></a>

## [0.7.4](https://github.com/angular/zone.js/compare/v0.7.1...0.7.4) (2016-12-31)

### Bug Fixes

- add better Type safety ([610649b](https://github.com/angular/zone.js/commit/610649b))
- add missing test MutationObserver ([5c7bc01](https://github.com/angular/zone.js/commit/5c7bc01))
- correct currentZone passed into delegate methods ([dc12d8e](https://github.com/angular/zone.js/commit/dc12d8e)), closes [#587](https://github.com/angular/zone.js/issues/587) [#539](https://github.com/angular/zone.js/issues/539)
- correct zone.min.js not including zone ([384f5ec](https://github.com/angular/zone.js/commit/384f5ec))
- Correct ZoneAwareError prototype chain ([ba7858c](https://github.com/angular/zone.js/commit/ba7858c)), closes [#546](https://github.com/angular/zone.js/issues/546) [#547](https://github.com/angular/zone.js/issues/547)
- formatting issue. ([c70e9ec](https://github.com/angular/zone.js/commit/c70e9ec))
- inline event handler issue ([20b5a5d](https://github.com/angular/zone.js/commit/20b5a5d)), closes [#525](https://github.com/angular/zone.js/issues/525) [#540](https://github.com/angular/zone.js/issues/540)
- parameterize `wrap` method on `Zone` ([#542](https://github.com/angular/zone.js/issues/542)) ([f522e1b](https://github.com/angular/zone.js/commit/f522e1b))
- **closure:** avoid property renaming on globals ([af14646](https://github.com/angular/zone.js/commit/af14646))
- Prevent adding listener for xhrhttprequest multiple times ([9509747](https://github.com/angular/zone.js/commit/9509747)), closes [#529](https://github.com/angular/zone.js/issues/529) [#527](https://github.com/angular/zone.js/issues/527) [#287](https://github.com/angular/zone.js/issues/287) [#530](https://github.com/angular/zone.js/issues/530)
- Promise.toString() to look like native function ([f854ce0](https://github.com/angular/zone.js/commit/f854ce0))
- **closure:** Fix closure error suppression comment. ([#552](https://github.com/angular/zone.js/issues/552)) ([2643783](https://github.com/angular/zone.js/commit/2643783))
- Run tests on both the build as well as the dist folder ([#514](https://github.com/angular/zone.js/issues/514)) ([c0604f5](https://github.com/angular/zone.js/commit/c0604f5))
- support nw.js environment ([486010b](https://github.com/angular/zone.js/commit/486010b)), closes [#524](https://github.com/angular/zone.js/issues/524)

### Features

- Patch captureStackTrace/prepareStackTrace to ZoneAwareError, patch process.nextTick, fix removeAllListeners bug ([#516](https://github.com/angular/zone.js/issues/516)) ([c36c0bc](https://github.com/angular/zone.js/commit/c36c0bc)), closes [#484](https://github.com/angular/zone.js/issues/484) [#491](https://github.com/angular/zone.js/issues/491)

<a name="0.7.1"></a>

## [0.7.1](https://github.com/angular/zone.js/compare/v0.7.0...v0.7.1) (2016-11-22)

### Bug Fixes

- missing zone from the build file ([e961833](https://github.com/angular/zone.js/commit/e961833))

<a name="0.7.0"></a>

# [0.7.0](https://github.com/angular/zone.js/compare/0.6.25...v0.7.0) (2016-11-22)

### Bug Fixes

- **node:** crash when calling listeners() for event with no listeners ([431f6f0](https://github.com/angular/zone.js/commit/431f6f0))
- support clearing the timeouts with numeric IDs ([fea6d68](https://github.com/angular/zone.js/commit/fea6d68)), closes [#461](https://github.com/angular/zone.js/issues/461)
- **promise:** include stack trace in an unhandlerd promise ([#463](https://github.com/angular/zone.js/issues/463)) ([737f8d8](https://github.com/angular/zone.js/commit/737f8d8))
- **property-descriptor:** do not use document object in Safari web worker ([51f2e1f](https://github.com/angular/zone.js/commit/51f2e1f))
- Add WebSocket to the NO_EVENT_TARGET list to be patched as well ([#493](https://github.com/angular/zone.js/issues/493)) ([d8c15eb](https://github.com/angular/zone.js/commit/d8c15eb))
- fix wrong usage of == caught by closure compiler ([#510](https://github.com/angular/zone.js/issues/510)) ([d7d8eb5](https://github.com/angular/zone.js/commit/d7d8eb5))
- fluent interface for EventEmitter ([#475](https://github.com/angular/zone.js/issues/475)) ([c5130a6](https://github.com/angular/zone.js/commit/c5130a6))
- lint errors ([ed87c26](https://github.com/angular/zone.js/commit/ed87c26))
- make fetch promise patching safe ([16be7f9](https://github.com/angular/zone.js/commit/16be7f9)), closes [#451](https://github.com/angular/zone.js/issues/451)
- Make the check for ZoneAwarePromise more stringent ([#495](https://github.com/angular/zone.js/issues/495)) ([c69df25](https://github.com/angular/zone.js/commit/c69df25))
- run all timers in passage of time in a single fakeAsync's tick call ([a85db4c](https://github.com/angular/zone.js/commit/a85db4c)), closes [#454](https://github.com/angular/zone.js/issues/454)
- stop using class extends as it breaks rollup ([b52cf02](https://github.com/angular/zone.js/commit/b52cf02))
- use strict equality in scheduleQueueDrain ([#504](https://github.com/angular/zone.js/issues/504)) ([4b4249c](https://github.com/angular/zone.js/commit/4b4249c))

### Features

- add mocha support ([41a9047](https://github.com/angular/zone.js/commit/41a9047))
- **Error:** Rewrite Error stack frames to include zone ([e1c2a02](https://github.com/angular/zone.js/commit/e1c2a02))

<a name="0.6.25"></a>

## [0.6.25](https://github.com/angular/zone.js/compare/0.6.24...0.6.25) (2016-09-20)

### Bug Fixes

- **zonespecs:** revert unwrapping of zonespecs which actually require global ([#460](https://github.com/angular/zone.js/issues/460)) ([28a14f8](https://github.com/angular/zone.js/commit/28a14f8))

<a name="0.6.24"></a>

## [0.6.24](https://github.com/angular/zone.js/compare/v0.6.23...0.6.24) (2016-09-19)

### Bug Fixes

- **bundling:** switch to using umd bundles ([#457](https://github.com/angular/zone.js/issues/457)) ([8dd06e5](https://github.com/angular/zone.js/commit/8dd06e5)), closes [#456](https://github.com/angular/zone.js/issues/456)

<a name="0.6.23"></a>

## [0.6.23](https://github.com/angular/zone.js/compare/v0.6.22...v0.6.23) (2016-09-14)

### Bug Fixes

- **fetch:** correct chrome not able to load about://blank ([3844435](https://github.com/angular/zone.js/commit/3844435)), closes [#444](https://github.com/angular/zone.js/issues/444)

<a name="0.6.22"></a>

## [0.6.22](https://github.com/angular/zone.js/compare/v0.6.21...v0.6.22) (2016-09-14)

### Bug Fixes

- use fetch(about://blank) to prevent exception on MS Edge ([#442](https://github.com/angular/zone.js/issues/442)) ([8b81537](https://github.com/angular/zone.js/commit/8b81537)), closes [#436](https://github.com/angular/zone.js/issues/436) [#439](https://github.com/angular/zone.js/issues/439)

### Features

- **node:** patch most fs methods ([#438](https://github.com/angular/zone.js/issues/438)) ([4c8a155](https://github.com/angular/zone.js/commit/4c8a155))
- **node:** patch outgoing http requests to capture the zone ([#430](https://github.com/angular/zone.js/issues/430)) ([100b82b](https://github.com/angular/zone.js/commit/100b82b))

<a name="0.6.21"></a>

## [0.6.21](https://github.com/angular/zone.js/compare/v0.6.20...v0.6.21) (2016-09-11)

### Bug Fixes

- proper detection of global in WebWorker ([0a7a155](https://github.com/angular/zone.js/commit/0a7a155))

<a name="0.6.20"></a>

## [0.6.20](https://github.com/angular/zone.js/compare/v0.6.19...v0.6.20) (2016-09-10)

<a name="0.6.19"></a>

## [0.6.19](https://github.com/angular/zone.js/compare/v0.6.17...v0.6.19) (2016-09-10)

### Bug Fixes

- provide a more useful error when configuring properties ([1fe4df0](https://github.com/angular/zone.js/commit/1fe4df0))
- **jasmine:** propagate all arguments of it/describe/etc... ([a85fd68](https://github.com/angular/zone.js/commit/a85fd68))
- **long-stack:** Safer writing of stack traces. ([6767ff5](https://github.com/angular/zone.js/commit/6767ff5))
- **promise:** support more aggressive optimization. ([#431](https://github.com/angular/zone.js/issues/431)) ([26fc3da](https://github.com/angular/zone.js/commit/26fc3da))
- **XHR:** Don't send sync XHR through ZONE ([6e2f13c](https://github.com/angular/zone.js/commit/6e2f13c)), closes [#377](https://github.com/angular/zone.js/issues/377)

### Features

- assert that right ZoneAwarePromise is available ([#420](https://github.com/angular/zone.js/issues/420)) ([4c35e5b](https://github.com/angular/zone.js/commit/4c35e5b))

<a name="0.6.17"></a>

## [0.6.17](https://github.com/angular/zone.js/compare/v0.6.15...v0.6.17) (2016-08-22)

### Bug Fixes

- **browser:** use XMLHttpRequest.DONE constant on target instead of the global interface ([#395](https://github.com/angular/zone.js/issues/395)) ([3b4c20b](https://github.com/angular/zone.js/commit/3b4c20b)), closes [#394](https://github.com/angular/zone.js/issues/394)
- **jasmine:** spelling error of 'describe' in jasmine patch prevented application of sync zone ([d38ccde](https://github.com/angular/zone.js/commit/d38ccde)), closes [#412](https://github.com/angular/zone.js/issues/412)
- **patchProperty:** return null as the default value ([#413](https://github.com/angular/zone.js/issues/413)) ([396942b](https://github.com/angular/zone.js/commit/396942b)), closes [#319](https://github.com/angular/zone.js/issues/319)
- IE10/11 timeout issues. ([382182c](https://github.com/angular/zone.js/commit/382182c))

<a name="0.6.15"></a>

## [0.6.15](https://github.com/angular/zone.js/compare/v0.6.14...v0.6.15) (2016-08-19)

### Bug Fixes

- broken build. ([#406](https://github.com/angular/zone.js/issues/406)) ([5e3c207](https://github.com/angular/zone.js/commit/5e3c207))
- **tasks:** do not drain the microtask queue early. ([ff88bb4](https://github.com/angular/zone.js/commit/ff88bb4))
- **tasks:** do not drain the microtask queue early. ([d4a1436](https://github.com/angular/zone.js/commit/d4a1436))

<a name="0.6.14"></a>

## [0.6.14](https://github.com/angular/zone.js/compare/v0.6.13...v0.6.14) (2016-08-17)

### Features

- **jasmine:** patch jasmine to understand zones. ([3a054be](https://github.com/angular/zone.js/commit/3a054be))
- **trackingZone:** Keep track of tasks to see outstanding tasks. ([4942b4a](https://github.com/angular/zone.js/commit/4942b4a))

<a name="0.6.13"></a>

## [0.6.13](https://github.com/angular/zone.js/compare/v0.6.12...v0.6.13) (2016-08-15)

### Bug Fixes

- **browser:** make Object.defineProperty patch safer ([#392](https://github.com/angular/zone.js/issues/392)) ([597c634](https://github.com/angular/zone.js/commit/597c634)), closes [#391](https://github.com/angular/zone.js/issues/391)
- **browser:** patch Window when EventTarget is missing. ([#368](https://github.com/angular/zone.js/issues/368)) ([fcef80d](https://github.com/angular/zone.js/commit/fcef80d)), closes [#367](https://github.com/angular/zone.js/issues/367)
- **browser:** patchTimer cancelAnimationFrame ([#353](https://github.com/angular/zone.js/issues/353)) ([bf77fbb](https://github.com/angular/zone.js/commit/bf77fbb)), closes [#326](https://github.com/angular/zone.js/issues/326) [Leaflet/Leaflet#4588](https://github.com/Leaflet/Leaflet/issues/4588)
- **browser:** should not throw with frozen prototypes ([#351](https://github.com/angular/zone.js/issues/351)) ([27ca2a9](https://github.com/angular/zone.js/commit/27ca2a9))
- **build:** fix broken master due to setTimeout not returning a number on node ([d43b4b8](https://github.com/angular/zone.js/commit/d43b4b8))
- **doc:** Fixed the home page example. ([#348](https://github.com/angular/zone.js/issues/348)) ([9a0aa4a](https://github.com/angular/zone.js/commit/9a0aa4a))
- throw if trying to load zone more then once. ([6df5f93](https://github.com/angular/zone.js/commit/6df5f93))
- **fakeAsync:** throw error on rejected promisees. ([fd1dfcc](https://github.com/angular/zone.js/commit/fd1dfcc))
- **promise:** allow Promise subclassing ([dafad98](https://github.com/angular/zone.js/commit/dafad98))
- **XHR.responseBlob:** don't access XHR.responseBlob on old android webkit ([#329](https://github.com/angular/zone.js/issues/329)) ([ed69756](https://github.com/angular/zone.js/commit/ed69756))

### Features

- return timeout Id in ZoneTask.toString (fixes [#341](https://github.com/angular/zone.js/issues/341)) ([80ae6a8](https://github.com/angular/zone.js/commit/80ae6a8)), closes [#375](https://github.com/angular/zone.js/issues/375)
- **jasmine:** Switch jasmine patch to use microtask and preserve zone. ([5f519de](https://github.com/angular/zone.js/commit/5f519de))
- **ProxySpec:** create a ProxySpec which can proxy to other ZoneSpecs. ([2d02e39](https://github.com/angular/zone.js/commit/2d02e39))
- **zone:** Add Zone.getZone api ([0621014](https://github.com/angular/zone.js/commit/0621014))

<a name="0.6.12"></a>

## [0.6.12](https://github.com/angular/zone.js/compare/v0.6.11...v0.6.12) (2016-04-19)

### Bug Fixes

- **property-descriptor:** do not fail for events without targets ([3a8deef](https://github.com/angular/zone.js/commit/3a8deef))

### Features

- Add a zone spec for fake async test zone. ([#330](https://github.com/angular/zone.js/issues/330)) ([34159b4](https://github.com/angular/zone.js/commit/34159b4))

<a name="0.6.11"></a>

## [0.6.11](https://github.com/angular/zone.js/compare/v0.6.9...v0.6.11) (2016-04-14)

### Bug Fixes

- Suppress closure compiler warnings about unknown 'process' variable. ([e125173](https://github.com/angular/zone.js/commit/e125173)), closes [#295](https://github.com/angular/zone.js/issues/295)
- **setTimeout:** fix for [#290](https://github.com/angular/zone.js/issues/290), allow clearTimeout to be called in setTimeout callback ([a6967ad](https://github.com/angular/zone.js/commit/a6967ad)), closes [#301](https://github.com/angular/zone.js/issues/301)
- **WebSocket patch:** fix WebSocket constants copy ([#299](https://github.com/angular/zone.js/issues/299)) ([5dc4339](https://github.com/angular/zone.js/commit/5dc4339))
- **xhr:** XHR macrotasks allow abort after XHR has completed ([#311](https://github.com/angular/zone.js/issues/311)) ([c70f011](https://github.com/angular/zone.js/commit/c70f011))
- **zone:** remove debugger statement ([#292](https://github.com/angular/zone.js/issues/292)) ([01cec16](https://github.com/angular/zone.js/commit/01cec16))
- window undefined in node environments ([f8d5dc7](https://github.com/angular/zone.js/commit/f8d5dc7)), closes [#305](https://github.com/angular/zone.js/issues/305)

### Features

- **zonespec:** add a spec for synchronous tests ([#294](https://github.com/angular/zone.js/issues/294)) ([55da3d8](https://github.com/angular/zone.js/commit/55da3d8))
- node/node ([29fc5d2](https://github.com/angular/zone.js/commit/29fc5d2))

<a name="0.6.9"></a>

## [0.6.9](https://github.com/angular/zone.js/compare/v0.6.5...v0.6.9) (2016-04-04)

### Bug Fixes

- Allow calling clearTimeout from within the setTimeout callback ([a8ea55d](https://github.com/angular/zone.js/commit/a8ea55d)), closes [#302](https://github.com/angular/zone.js/issues/302)
- Canceling already run task should not double decrement task counter ([faa3485](https://github.com/angular/zone.js/commit/faa3485)), closes [#290](https://github.com/angular/zone.js/issues/290)
- **xhr:** don't throw on an xhr which is aborted before sending ([8827e1e](https://github.com/angular/zone.js/commit/8827e1e))
- **zone:** remove debugger statement ([d7c116b](https://github.com/angular/zone.js/commit/d7c116b))

### Features

- **zonespec:** add a spec for synchronous tests ([0a6a434](https://github.com/angular/zone.js/commit/0a6a434))
- treat XHRs as macrotasks ([fd39f97](https://github.com/angular/zone.js/commit/fd39f97))

<a name="0.6.5"></a>

## [0.6.5](https://github.com/angular/zone.js/compare/v0.6.2...v0.6.5) (2016-03-21)

### Bug Fixes

- disable safari 7 ([4a4d4f6](https://github.com/angular/zone.js/commit/4a4d4f6))
- **browser/utils:** calling removeEventListener twice with the same args should not cause errors ([1787339](https://github.com/angular/zone.js/commit/1787339)), closes [#283](https://github.com/angular/zone.js/issues/283) [#284](https://github.com/angular/zone.js/issues/284)
- **patching:** call native cancel method ([5783663](https://github.com/angular/zone.js/commit/5783663)), closes [#278](https://github.com/angular/zone.js/issues/278) [#279](https://github.com/angular/zone.js/issues/279)
- **utils:** add the ability to prevent the default action of onEvent (onclick, onpaste,etc..) by returning false. ([99940c3](https://github.com/angular/zone.js/commit/99940c3)), closes [#236](https://github.com/angular/zone.js/issues/236)
- **WebSocket patch:** keep WebSocket constants ([f25b087](https://github.com/angular/zone.js/commit/f25b087)), closes [#267](https://github.com/angular/zone.js/issues/267)
- **zonespec:** Do not crash on error if last task had no data ([0dba019](https://github.com/angular/zone.js/commit/0dba019)), closes [#281](https://github.com/angular/zone.js/issues/281)

### Features

- **indexdb:** Added property patches and event target methods as well as tests for Indexed DB ([84a251f](https://github.com/angular/zone.js/commit/84a251f)), closes [#204](https://github.com/angular/zone.js/issues/204)
- **zonespec:** add a spec for asynchronous tests ([aeeb05c](https://github.com/angular/zone.js/commit/aeeb05c)), closes [#275](https://github.com/angular/zone.js/issues/275)

<a name="0.6.2"></a>

## [0.6.2](https://github.com/angular/zone.js/compare/v0.6.1...v0.6.2) (2016-03-03)

<a name="0.6.1"></a>

## [0.6.1](https://github.com/angular/zone.js/compare/v0.6.0...v0.6.1) (2016-02-29)

<a name="0.6.0"></a>

# [0.6.0](https://github.com/angular/zone.js/compare/v0.5.15...v0.6.0) (2016-02-29)

### Chores

- **everything:** Major Zone Rewrite/Reimplementation ([63d4552](https://github.com/angular/zone.js/commit/63d4552))

### BREAKING CHANGES

- everything: This is a brand new implementation which is not backwards compatible.

<a name="0.5.15"></a>

## [0.5.15](https://github.com/angular/zone.js/compare/v0.5.14...v0.5.15) (2016-02-17)

### Bug Fixes

- **WebWorker:** Patch WebSockets and XMLHttpRequest in WebWorker ([45a6bc1](https://github.com/angular/zone.js/commit/45a6bc1)), closes [#249](https://github.com/angular/zone.js/issues/249)
- **WebWorker:** Patch WebSockets and XMLHttpRequest in WebWorker ([9041a3a](https://github.com/angular/zone.js/commit/9041a3a)), closes [#249](https://github.com/angular/zone.js/issues/249)

<a name="0.5.14"></a>

## [0.5.14](https://github.com/angular/zone.js/compare/v0.5.11...v0.5.14) (2016-02-11)

<a name="0.5.11"></a>

## [0.5.11](https://github.com/angular/zone.js/compare/v0.5.10...v0.5.11) (2016-01-27)

### Bug Fixes

- correct incorrect example path in karma config ([b0a624d](https://github.com/angular/zone.js/commit/b0a624d))
- correct test relaying on jasmine timeout ([4f7d6ae](https://github.com/angular/zone.js/commit/4f7d6ae))
- **WebSocket:** don't patch EventTarget methods twice ([345e56c](https://github.com/angular/zone.js/commit/345e56c)), closes [#235](https://github.com/angular/zone.js/issues/235)

### Features

- **wtf:** add wtf support to (set/clear)Timeout/Interval/Immediate ([6659fd5](https://github.com/angular/zone.js/commit/6659fd5))

<a name="0.5.10"></a>

## [0.5.10](https://github.com/angular/zone.js/compare/v0.5.9...v0.5.10) (2015-12-11)

### Bug Fixes

- **keys:** Do not use Symbol which are broken in Chrome 39.0.2171 (Dartium) ([c48301b](https://github.com/angular/zone.js/commit/c48301b))
- **Promise:** Make sure we check for native Promise before es6-promise gets a chance to polyfill ([fa18d4c](https://github.com/angular/zone.js/commit/fa18d4c))

<a name="0.5.9"></a>

## [0.5.9](https://github.com/angular/zone.js/compare/v0.5.8...v0.5.9) (2015-12-09)

### Bug Fixes

- **keys:** do not declare functions inside blocks ([d44d699](https://github.com/angular/zone.js/commit/d44d699)), closes [#194](https://github.com/angular/zone.js/issues/194)
- **keys:** Symbol is being checked for type of function ([6714be6](https://github.com/angular/zone.js/commit/6714be6))
- **mutation-observe:** output of typeof operator should be string ([19703e3](https://github.com/angular/zone.js/commit/19703e3))
- **util:** origin addEventListener/removeEventListener should be called without eventListener ([26e7f51](https://github.com/angular/zone.js/commit/26e7f51)), closes [#198](https://github.com/angular/zone.js/issues/198)
- **utils:** should have no effect when called addEventListener/removeEventListener without eventListener. ([5bcc6ae](https://github.com/angular/zone.js/commit/5bcc6ae))

<a name="0.5.8"></a>

## [0.5.8](https://github.com/angular/zone.js/compare/v0.5.7...v0.5.8) (2015-10-06)

### Bug Fixes

- **addEventListener:** when called from the global scope ([a23d61a](https://github.com/angular/zone.js/commit/a23d61a)), closes [#190](https://github.com/angular/zone.js/issues/190)
- **EventTarget:** apply the patch even if `Window` is not defined ([32c6df9](https://github.com/angular/zone.js/commit/32c6df9))

<a name="0.5.7"></a>

## [0.5.7](https://github.com/angular/zone.js/compare/v0.5.6...v0.5.7) (2015-09-29)

### Bug Fixes

- **RequestAnimationFrame:** pass the timestamp to the callback ([79a37c0](https://github.com/angular/zone.js/commit/79a37c0)), closes [#187](https://github.com/angular/zone.js/issues/187)

<a name="0.5.6"></a>

## [0.5.6](https://github.com/angular/zone.js/compare/v0.5.5...v0.5.6) (2015-09-25)

### Bug Fixes

- **Jasmine:** add support for jasmine 2 done.fail() ([1d4370b](https://github.com/angular/zone.js/commit/1d4370b)), closes [#180](https://github.com/angular/zone.js/issues/180)
- **utils:** fixes event target patch in web workers ([ad5c0c8](https://github.com/angular/zone.js/commit/ad5c0c8))

<a name="0.5.5"></a>

## [0.5.5](https://github.com/angular/zone.js/compare/v0.5.4...v0.5.5) (2015-09-11)

### Bug Fixes

- **lib/utils:** adds compliant handling of useCapturing param for EventTarget methods ([dd2e1bf](https://github.com/angular/zone.js/commit/dd2e1bf))
- **lib/utils:** fixes incorrect behaviour when re-adding the same event listener fn ([1b804cf](https://github.com/angular/zone.js/commit/1b804cf))
- **longStackTraceZone:** modifies stackFramesFilter to exclude zone.js frames ([50ce9f3](https://github.com/angular/zone.js/commit/50ce9f3))

### Features

- **lib/core:** add/removeEventListener hooks ([1897440](https://github.com/angular/zone.js/commit/1897440))
- **lib/patch/file-reader:** zone-binds FileReader#onEventName listeners ([ce589b9](https://github.com/angular/zone.js/commit/ce589b9)), closes [#137](https://github.com/angular/zone.js/issues/137)

<a name="0.5.4"></a>

## [0.5.4](https://github.com/angular/zone.js/compare/v0.5.3...v0.5.4) (2015-08-31)

### Bug Fixes

- js path in examples ([c7a2ed9](https://github.com/angular/zone.js/commit/c7a2ed9))
- **zone:** fix conflict with Polymer elements ([77b4c0d](https://github.com/angular/zone.js/commit/77b4c0d))

### Features

- **patch:** support requestAnimationFrame time loops ([3d6dc08](https://github.com/angular/zone.js/commit/3d6dc08))

<a name="0.5.3"></a>

## [0.5.3](https://github.com/angular/zone.js/compare/v0.5.2...v0.5.3) (2015-08-21)

### Bug Fixes

- **addEventListener patch:** ignore FunctionWrapper for IE11 & Edge dev tools ([3b0ca3f](https://github.com/angular/zone.js/commit/3b0ca3f))
- **utils:** event listener patches break when passed an object implementing EventListener ([af88ff8](https://github.com/angular/zone.js/commit/af88ff8))
- **WebWorker:** Fix patching in WebWorker ([2cc59d8](https://github.com/angular/zone.js/commit/2cc59d8))

### Features

- **zone.js:** support Android browser ([93b5555](https://github.com/angular/zone.js/commit/93b5555))

<a name="0.5.2"></a>

## [0.5.2](https://github.com/angular/zone.js/compare/v0.5.1...v0.5.2) (2015-07-01)

### Bug Fixes

- **jasmine patch:** forward timeout ([2dde717](https://github.com/angular/zone.js/commit/2dde717))
- **zone.bind:** throw an error if arg is not a function ([ee4262a](https://github.com/angular/zone.js/commit/ee4262a))

<a name="0.5.1"></a>

## [0.5.1](https://github.com/angular/zone.js/compare/v0.5.0...v0.5.1) (2015-06-10)

### Bug Fixes

- **PatchClass:** copy static properties ([b91f8fe](https://github.com/angular/zone.js/commit/b91f8fe)), closes [#127](https://github.com/angular/zone.js/issues/127)
- **register-element:** add check for callback being own property of opts ([8bce00e](https://github.com/angular/zone.js/commit/8bce00e)), closes [#52](https://github.com/angular/zone.js/issues/52)

### Features

- **fetch:** patch the fetch API ([4d3d524](https://github.com/angular/zone.js/commit/4d3d524)), closes [#108](https://github.com/angular/zone.js/issues/108)
- **geolocation:** patch the API ([cd13da1](https://github.com/angular/zone.js/commit/cd13da1)), closes [#113](https://github.com/angular/zone.js/issues/113)
- **jasmine:** export the jasmine patch ([639d5e7](https://github.com/angular/zone.js/commit/639d5e7))
- **test:** serve lib/ files instead of dist/ ([f835213](https://github.com/angular/zone.js/commit/f835213))
- **zone.js:** support IE9+ ([554fae0](https://github.com/angular/zone.js/commit/554fae0))

<a name="0.5.0"></a>

# [0.5.0](https://github.com/angular/zone.js/compare/v0.4.4...v0.5.0) (2015-05-08)

### Bug Fixes

- always run jasmine's done callbacks for async tests in jasmine's zone ([b7f3d04](https://github.com/angular/zone.js/commit/b7f3d04)), closes [#91](https://github.com/angular/zone.js/issues/91)
- don't fork new zones for callbacks from the root zone ([531d0ec](https://github.com/angular/zone.js/commit/531d0ec)), closes [#92](https://github.com/angular/zone.js/issues/92)
- **MutationObserver:** executes hooks in the creation zone ([3122a48](https://github.com/angular/zone.js/commit/3122a48))
- **test:** fix an ineffective assertion ([d85d2cf](https://github.com/angular/zone.js/commit/d85d2cf))
- minor fixes ([18f5511](https://github.com/angular/zone.js/commit/18f5511))

### Code Refactoring

- split zone.js into CJS modules, add zone-microtask.js ([2e52900](https://github.com/angular/zone.js/commit/2e52900))

### Features

- **scheduling:** Prefer MutationObserver over Promise in FF ([038bdd9](https://github.com/angular/zone.js/commit/038bdd9))
- **scheduling:** Support Promise.then() fallbacks to enqueue a microtask ([74eff1c](https://github.com/angular/zone.js/commit/74eff1c))
- add isRootZone api ([bf925bf](https://github.com/angular/zone.js/commit/bf925bf))
- make root zone id to be 1 ([605e213](https://github.com/angular/zone.js/commit/605e213))

### BREAKING CHANGES

- New child zones are now created only from a async task
  that installed a custom zone.

Previously even without a custom zone installed (e.g.
LongStacktracesZone), we would spawn new
child zones for all asynchronous events. This is undesirable and
generally not useful.

It does not make sense for us to create new zones for callbacks from the
root zone since we care
only about callbacks from installed custom zones. This reduces the
overhead of zones.

This primarily means that LongStackTraces zone won't be able to trace
events back to Zone.init(),
but instead the starting point will be the installation of the
LongStacktracesZone. In all practical
situations this should be sufficient.

- zone.js as well as \*-zone.js files are moved from / to dist/

<a name="0.4.4"></a>

## [0.4.4](https://github.com/angular/zone.js/compare/v0.4.3...v0.4.4) (2015-05-07)

### Bug Fixes

- commonjs wrapper ([7b4fdde](https://github.com/angular/zone.js/commit/7b4fdde)), closes [#19](https://github.com/angular/zone.js/issues/19)
- fork the zone in first example (README) ([7b6e8ed](https://github.com/angular/zone.js/commit/7b6e8ed))
- prevent aliasing original window reference ([63b42bd](https://github.com/angular/zone.js/commit/63b42bd))
- use strcit mode for the zone.js code only ([16855e5](https://github.com/angular/zone.js/commit/16855e5))
- **test:** use console.log rather than dump in tests ([490e6dd](https://github.com/angular/zone.js/commit/490e6dd))
- **websockets:** patch websockets via descriptors ([d725f46](https://github.com/angular/zone.js/commit/d725f46)), closes [#81](https://github.com/angular/zone.js/issues/81)
- **websockets:** properly patch websockets in Safari 7.0 ([3ba6fa1](https://github.com/angular/zone.js/commit/3ba6fa1)), closes [#88](https://github.com/angular/zone.js/issues/88)
- **websockets:** properly patch websockets on Safari 7.1 ([1799a20](https://github.com/angular/zone.js/commit/1799a20))

### Features

- add websockets example ([edb17d2](https://github.com/angular/zone.js/commit/edb17d2))
- log a warning if we suspect duplicate Zone install ([657f6fe](https://github.com/angular/zone.js/commit/657f6fe))

<a name="0.4.3"></a>

## [0.4.3](https://github.com/angular/zone.js/compare/v0.4.2...v0.4.3) (2015-04-08)

### Bug Fixes

- **zone:** keep argument[0] refs around. ([48573ff](https://github.com/angular/zone.js/commit/48573ff))

<a name="0.4.2"></a>

## [0.4.2](https://github.com/angular/zone.js/compare/v0.4.1...v0.4.2) (2015-03-27)

### Bug Fixes

- **zone.js:** don't make function declaration in block scope ([229fd8f](https://github.com/angular/zone.js/commit/229fd8f)), closes [#53](https://github.com/angular/zone.js/issues/53) [#54](https://github.com/angular/zone.js/issues/54)

### Features

- **bindPromiseFn:** add bindPromiseFn method ([643f2ac](https://github.com/angular/zone.js/commit/643f2ac)), closes [#49](https://github.com/angular/zone.js/issues/49)
- **lstz:** allow getLongStacktrace to be called with zero args ([26a4dc2](https://github.com/angular/zone.js/commit/26a4dc2)), closes [#47](https://github.com/angular/zone.js/issues/47)
- **Zone:** add unique id to each zone ([fb338b6](https://github.com/angular/zone.js/commit/fb338b6)), closes [#45](https://github.com/angular/zone.js/issues/45)

<a name="0.4.1"></a>

## [0.4.1](https://github.com/angular/zone.js/compare/v0.4.0...v0.4.1) (2015-02-20)

### Bug Fixes

- **patchViaPropertyDescriptor:** disable if properties are not configurable ([fb5e644](https://github.com/angular/zone.js/commit/fb5e644)), closes [#42](https://github.com/angular/zone.js/issues/42)

<a name="0.4.0"></a>

# [0.4.0](https://github.com/angular/zone.js/compare/v0.3.0...v0.4.0) (2015-02-04)

### Bug Fixes

- **WebSocket:** patch WebSocket instance ([7b8e1e6](https://github.com/angular/zone.js/commit/7b8e1e6))

<a name="0.3.0"></a>

# [0.3.0](https://github.com/angular/zone.js/compare/v0.2.4...v0.3.0) (2014-06-12)

### Bug Fixes

- add events for webgl contexts ([4b6e411](https://github.com/angular/zone.js/commit/4b6e411))
- bind prototype chain callback of custom element descriptor ([136e518](https://github.com/angular/zone.js/commit/136e518))
- dequeue tasks from the zone that enqueued it ([f127fd4](https://github.com/angular/zone.js/commit/f127fd4))
- do not reconfig property descriptors of prototypes ([e9dfbed](https://github.com/angular/zone.js/commit/e9dfbed))
- patch property descriptors in Object.create ([7b7258b](https://github.com/angular/zone.js/commit/7b7258b)), closes [#24](https://github.com/angular/zone.js/issues/24)
- support mozRequestAnimationFrame ([886f67d](https://github.com/angular/zone.js/commit/886f67d))
- wrap non-configurable custom element callbacks ([383b479](https://github.com/angular/zone.js/commit/383b479)), closes [#24](https://github.com/angular/zone.js/issues/24)
- wrap Object.defineProperties ([f587f17](https://github.com/angular/zone.js/commit/f587f17)), closes [#24](https://github.com/angular/zone.js/issues/24)

<a name="0.2.4"></a>

## [0.2.4](https://github.com/angular/zone.js/compare/v0.2.3...v0.2.4) (2014-05-23)

<a name="0.2.3"></a>

## [0.2.3](https://github.com/angular/zone.js/compare/v0.2.2...v0.2.3) (2014-05-23)

### Bug Fixes

- remove dump ([45fb7ba](https://github.com/angular/zone.js/commit/45fb7ba))

<a name="0.2.2"></a>

## [0.2.2](https://github.com/angular/zone.js/compare/v0.2.1...v0.2.2) (2014-05-22)

### Bug Fixes

- correctly detect support for document.registerElement ([ab1d487](https://github.com/angular/zone.js/commit/ab1d487))
- dont automagically dequeue on setInterval ([da99e15](https://github.com/angular/zone.js/commit/da99e15))
- fork should deep clone objects ([21b47ae](https://github.com/angular/zone.js/commit/21b47ae))
- support MutationObserver.disconnect ([ad711b8](https://github.com/angular/zone.js/commit/ad711b8))

### Features

- add stackFramesFilter to longStackTraceZone ([7133de0](https://github.com/angular/zone.js/commit/7133de0))
- expose hooks for enqueuing and dequing tasks ([ba72f34](https://github.com/angular/zone.js/commit/ba72f34))
- improve countingZone and example ([86328fb](https://github.com/angular/zone.js/commit/86328fb))
- support document.registerElement ([d3c785a](https://github.com/angular/zone.js/commit/d3c785a)), closes [#18](https://github.com/angular/zone.js/issues/18)

<a name="0.2.1"></a>

## [0.2.1](https://github.com/angular/zone.js/compare/v0.2.0...v0.2.1) (2014-04-24)

### Bug Fixes

- add support for WebKitMutationObserver ([d1a2c8e](https://github.com/angular/zone.js/commit/d1a2c8e))
- preserve setters when wrapping XMLHttpRequest ([fb46688](https://github.com/angular/zone.js/commit/fb46688)), closes [#17](https://github.com/angular/zone.js/issues/17)

<a name="0.2.0"></a>

# [0.2.0](https://github.com/angular/zone.js/compare/v0.1.1...v0.2.0) (2014-04-17)

### Bug Fixes

- patch all properties on the proto chain ([b6d76f0](https://github.com/angular/zone.js/commit/b6d76f0))
- patch MutationObserver ([1c4e85e](https://github.com/angular/zone.js/commit/1c4e85e))
- wrap XMLHttpRequest when we cant patch protos ([76de58e](https://github.com/angular/zone.js/commit/76de58e))

### Features

- add exceptZone ([b134391](https://github.com/angular/zone.js/commit/b134391))

<a name="0.1.1"></a>

## [0.1.1](https://github.com/angular/zone.js/compare/v0.1.0...v0.1.1) (2014-03-31)

### Features

- add commonjs support ([0fe349e](https://github.com/angular/zone.js/commit/0fe349e))

<a name="0.1.0"></a>

# [0.1.0](https://github.com/angular/zone.js/compare/v0.0.0...v0.1.0) (2014-03-31)

### Bug Fixes

- improve patching browsers with EventTarget ([7d3a8b1](https://github.com/angular/zone.js/commit/7d3a8b1))
- improve stacktrace capture on Safari ([46a6fbc](https://github.com/angular/zone.js/commit/46a6fbc))
- long stack trace test ([01ce3b3](https://github.com/angular/zone.js/commit/01ce3b3))
- prevent calling addEventListener on non-functions ([7acebca](https://github.com/angular/zone.js/commit/7acebca))
- throw if a zone does not define an onError hook ([81d5f49](https://github.com/angular/zone.js/commit/81d5f49))
- throw if a zone does not define an onError hook ([3485c1b](https://github.com/angular/zone.js/commit/3485c1b))

### Features

- add decorator syntax ([c6202a1](https://github.com/angular/zone.js/commit/c6202a1))
- add onZoneCreated hook ([f7badb6](https://github.com/angular/zone.js/commit/f7badb6))
- patch onclick in Chrome and Safari ([7205295](https://github.com/angular/zone.js/commit/7205295))
- refactor and test counting zone ([648a95d](https://github.com/angular/zone.js/commit/648a95d))
- support Promise ([091f44e](https://github.com/angular/zone.js/commit/091f44e))

<a name="0.0.0"></a>

# 0.0.0 (2013-09-18)
H2Fxb/**
 @license
The MIT License

Copyright (c) 2010-2025 Google LLC. https://angular.dev/license

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
d-x># Zone.js

[![CDNJS](https://img.shields.io/cdnjs/v/zone.js.svg)](https://cdnjs.com/libraries/zone.js)

Implements _Zones_ for JavaScript, inspired by [Dart](https://dart.dev/articles/archive/zones).

> If you're using zone.js via unpkg (i.e. using `https://unpkg.com/zone.js`)
> and you're using any of the following libraries, make sure you import them first

> * 'newrelic' as it patches global.Promise before zone.js does
> * 'async-listener' as it patches global.setTimeout, global.setInterval before zone.js does
> * 'continuation-local-storage' as it uses async-listener

## Development Status of Zone.js

As Angular moves towards a zoneless application development model, Zone.js is no longer accepting new features, including additional patches for native platform APIs. The team will also not be accepting any low priority bug fixes. Any critical bug fixes that relate to Angular's direct use of Zone.js will still be accepted.

While still a supported part of Angular, the Angular team strongly discourages using Zone.js outside of Angular application contexts.


## NEW Zone.js POST-v0.6.0

See the new API [here](./lib/zone.ts).

Read up on [Zone Primer](https://docs.google.com/document/d/1F5Ug0jcrm031vhSMJEOgp1l-Is-Vf0UCNDY-LsQtAIY).

## BREAKING CHANGES since Zone.js v0.11.1

Prior to `v0.11.1`, Zone.js provided two distribution bundle formats in the `dist` folder.
They were (1) `ES5` bundle distributed as `zone.js` and (2) `ES2015` bundle distributed as `zone-evergreen.js`.
Both of these bundles were in `UMD` format, and are used for Angular's differential-loading mechanism.

Starting with `v0.11.1`, Zone.js follows the [Angular Package Format](https://docs.google.com/document/d/1CZC2rcpxffTDfRDs6p1cfbmKNLA6x5O-NtkJglDaBVs). Therefor the new Zone.js file layout is:

- `bundles`: `ES5` bundle in `UMD` format.
- `fesm2015`: `ES5` bundle in `ESM` format.
- `dist`: `ES5` bundle in `UMD` format. This directory is present to keep backward compatibility.

If you are using `Angular CLI`, the `polyfills.ts` file will contain:

```
import 'zone.js/dist/zone';
```

Starting with Zone.js `v0.11.1+` the import changes to:

```
import 'zone.js';
```

Prior to `v0.11.1` the import would load the `ES5` bundle in `UMD` format from `dist/zone.js`. 
Starting with `v0.11.1` the import loads the `ES2015` bundle in `ESM` format instead.

This is a breaking change for legacy browsers such as `IE11`.

For backwards compatibility `zone.js` continues to distribute the same bundles under `dist`.
To restore the old behavior import from the `dist` directory instead like so:

```
import 'zone.js/dist/zone';
```

For details, please refer the [changelog](./CHANGELOG.md) and the [PR](https://github.com/angular/angular/pull/36540).

## What's a Zone?

A Zone is an execution context that persists across async tasks.
You can think of it as [thread-local storage](https://en.wikipedia.org/wiki/Thread-local_storage) for JavaScript VMs.

See this video from ng-conf 2014 for a detailed explanation:

[![screenshot of the zone.js presentation and ng-conf 2014](./presentation.png)](//www.youtube.com/watch?v=3IqtmUscE_U&t=150)

## See also
* [async-listener](https://github.com/othiym23/async-listener) - a similar library for node
* [Async stack traces in Chrome](https://www.html5rocks.com/en/tutorials/developertools/async-call-stack/)
* [strongloop/zone](https://github.com/strongloop/zone) (Deprecated)
* [vizone](https://github.com/gilbox/vizone) - control flow visualizer that uses zone.js

## Standard API support

zone.js patched most standard web APIs (such as DOM events, `XMLHttpRequest`, ...) and nodejs APIs
(`EventEmitter`, `fs`, ...), for more details, please see [STANDARD-APIS.md](STANDARD-APIS.md).

## Nonstandard API support

We are adding support to some nonstandard APIs, such as MediaQuery and
Notification. Please see [NON-STANDARD-APIS.md](NON-STANDARD-APIS.md) for more details.

## Examples

You can find some samples to describe how to use zone.js in [SAMPLE.md](SAMPLE.md).

## Modules

zone.js patches the async APIs described above, but those patches will have some overhead.
Starting from zone.js v0.8.9, you can choose which web API module you want to patch.
For more details, please
see [MODULE.md](MODULE.md).

## Bundles

Starting with `v0.11.0`, `zone.js`  uses `Angular Package Format` for bundle distribution.
(For backwards compatibility, all bundles can still be accessed from `dist` folder.)

|Bundle|Summary|
|---|---|
|`zone.js`| The default bundle. Contains the most used APIs such as `setTimeout/Promise/EventTarget...`, it also supports differential loading by importing  this bundle using `import zone.js`.  In legacy browsers it includes some additional patches such as `registerElement` and `EventTarget` like APIs.|
|`zone-testing.js`| The bundle for zone testing support of `jasmine` / `mocha` / `jest`. Also includes test utility functions `async` / `fakeAsync` / `sync`.|
|`zone-node.js`|The NodeJS support bundle.|
|`zone-mix.js`|A mixed bundle which supports both browser and NodeJS. Useful for mixed environment such as Electron.|
|`zone-externs.js`|the API definitions for `closure compiler`.|

Additional optional patches not included in the `zone.js` bundles which extend functionality.
The additional bundles can  be found under `zone.js/plugins` folder.
To use these bundles, add the following code after importing zone.js bundle.

```
import 'zone.js';
// For example, import canvas patch
import 'zone.js/plugins/zone-patch-canvas';
```

|Patch|Summary|
|---|---|
|`webapis-media-query.js`|patch for `MediaQuery APIs`|
|`webapis-notification.js`|patch for `Notification APIs`|
|`webapis-rtc-peer-connection.js`|patch for `RTCPeerConnection APIs`|
|`webapis-shadydom.js`|patch for `Shady DOM APIs`|
|`zone-bluebird.js`|patch for `Bluebird APIs`|
|`zone-error.js`|patch for `Error Global Object`, supports adding zone information to stack frame, and also removing unrelated stack frames from `zone.js` internally|
|`zone-patch-canvas.js`|patch for `Canvas API`|
|`zone-patch-cordova.js`|patch for `Cordova API`|
|`zone-patch-electron.js`|patch for `Electron API`|
|`zone-patch-fetch.js`|patch for `Fetch API`|
|`zone-patch-jsonp.js`|helper utility for `jsonp API`|
|`zone-patch-resize-observer.js`|patch for `ResizeObserver API`|
|`zone-patch-rxjs.js`|patch for `rxjs API`|
|`zone-patch-rxjs-fake-async.js`|patch for `rxjs fakeasync test`|
|`zone-patch-socket-io.js`|patch for `socket-io`|
|`zone-patch-user-media.js`|patch for `UserMedia API`|
|`zone-patch-message-port.js`|patch for `MessagePort API`|

## License
MITx:'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    var global$1 = globalThis;
    // __Zone_symbol_prefix global can be used to override the default zone
    // symbol prefix with a custom one if needed.
    function __symbol__(name) {
        var symbolPrefix = global$1['__Zone_symbol_prefix'] || '__zone_symbol__';
        return symbolPrefix + name;
    }
    var __global = (typeof window !== 'undefined' && window) || (typeof self !== 'undefined' && self) || global;
    var AsyncTestZoneSpec = /** @class */ (function () {
        function AsyncTestZoneSpec(finishCallback, failCallback, namePrefix) {
            this._pendingMicroTasks = false;
            this._pendingMacroTasks = false;
            this._alreadyErrored = false;
            this._isSync = false;
            this._existingFinishTimer = null;
            this.entryFunction = null;
            this.runZone = Zone.current;
            this.unresolvedChainedPromiseCount = 0;
            this.supportWaitUnresolvedChainedPromise = false;
            this.finishCallback = finishCallback;
            this.failCallback = failCallback;
            this.name = 'asyncTestZone for ' + namePrefix;
            this.properties = { 'AsyncTestZoneSpec': this };
            this.supportWaitUnresolvedChainedPromise =
                __global[__symbol__('supportWaitUnResolvedChainedPromise')] === true;
        }
        Object.defineProperty(AsyncTestZoneSpec, "symbolParentUnresolved", {
            // Needs to be a getter and not a plain property in order run this just-in-time. Otherwise
            // `__symbol__` would be evaluated during top-level execution prior to the Zone prefix being
            // changed for tests.
            get: function () {
                return __symbol__('parentUnresolved');
            },
            enumerable: false,
            configurable: true
        });
        AsyncTestZoneSpec.prototype.isUnresolvedChainedPromisePending = function () {
            return this.unresolvedChainedPromiseCount > 0;
        };
        AsyncTestZoneSpec.prototype._finishCallbackIfDone = function () {
            var _this = this;
            // NOTE: Technically the `onHasTask` could fire together with the initial synchronous
            // completion in `onInvoke`. `onHasTask` might call this method when it captured e.g.
            // microtasks in the proxy zone that now complete as part of this async zone run.
            // Consider the following scenario:
            //    1. A test `beforeEach` schedules a microtask in the ProxyZone.
            //    2. An actual empty `it` spec executes in the AsyncTestZone` (using e.g. `waitForAsync`).
            //    3. The `onInvoke` invokes `_finishCallbackIfDone` because the spec runs synchronously.
            //    4. We wait the scheduled timeout (see below) to account for unhandled promises.
            //    5. The microtask from (1) finishes and `onHasTask` is invoked.
            //    --> We register a second `_finishCallbackIfDone` even though we have scheduled a timeout.
            // If the finish timeout from below is already scheduled, terminate the existing scheduled
            // finish invocation, avoiding calling `jasmine` `done` multiple times. *Note* that we would
            // want to schedule a new finish callback in case the task state changes again.
            if (this._existingFinishTimer !== null) {
                clearTimeout(this._existingFinishTimer);
                this._existingFinishTimer = null;
            }
            if (!(this._pendingMicroTasks ||
                this._pendingMacroTasks ||
                (this.supportWaitUnresolvedChainedPromise && this.isUnresolvedChainedPromisePending()))) {
                // We wait until the next tick because we would like to catch unhandled promises which could
                // cause test logic to be executed. In such cases we cannot finish with tasks pending then.
                this.runZone.run(function () {
                    _this._existingFinishTimer = setTimeout(function () {
                        if (!_this._alreadyErrored && !(_this._pendingMicroTasks || _this._pendingMacroTasks)) {
                            _this.finishCallback();
                        }
                    }, 0);
                });
            }
        };
        AsyncTestZoneSpec.prototype.patchPromiseForTest = function () {
            if (!this.supportWaitUnresolvedChainedPromise) {
                return;
            }
            var patchPromiseForTest = Promise[Zone.__symbol__('patchPromiseForTest')];
            if (patchPromiseForTest) {
                patchPromiseForTest();
            }
        };
        AsyncTestZoneSpec.prototype.unPatchPromiseForTest = function () {
            if (!this.supportWaitUnresolvedChainedPromise) {
                return;
            }
            var unPatchPromiseForTest = Promise[Zone.__symbol__('unPatchPromiseForTest')];
            if (unPatchPromiseForTest) {
                unPatchPromiseForTest();
            }
        };
        AsyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
            if (task.type !== 'eventTask') {
                this._isSync = false;
            }
            if (task.type === 'microTask' && task.data && task.data instanceof Promise) {
                // check whether the promise is a chained promise
                if (task.data[AsyncTestZoneSpec.symbolParentUnresolved] === true) {
                    // chained promise is being scheduled
                    this.unresolvedChainedPromiseCount--;
                }
            }
            return delegate.scheduleTask(target, task);
        };
        AsyncTestZoneSpec.prototype.onInvokeTask = function (delegate, current, target, task, applyThis, applyArgs) {
            if (task.type !== 'eventTask') {
                this._isSync = false;
            }
            return delegate.invokeTask(target, task, applyThis, applyArgs);
        };
        AsyncTestZoneSpec.prototype.onCancelTask = function (delegate, current, target, task) {
            if (task.type !== 'eventTask') {
                this._isSync = false;
            }
            return delegate.cancelTask(target, task);
        };
        // Note - we need to use onInvoke at the moment to call finish when a test is
        // fully synchronous. TODO(juliemr): remove this when the logic for
        // onHasTask changes and it calls whenever the task queues are dirty.
        // updated by(JiaLiPassion), only call finish callback when no task
        // was scheduled/invoked/canceled.
        AsyncTestZoneSpec.prototype.onInvoke = function (parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
            if (!this.entryFunction) {
                this.entryFunction = delegate;
            }
            try {
                this._isSync = true;
                return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
            }
            finally {
                // We need to check the delegate is the same as entryFunction or not.
                // Consider the following case.
                //
                // asyncTestZone.run(() => { // Here the delegate will be the entryFunction
                //   Zone.current.run(() => { // Here the delegate will not be the entryFunction
                //   });
                // });
                //
                // We only want to check whether there are async tasks scheduled
                // for the entry function.
                if (this._isSync && this.entryFunction === delegate) {
                    this._finishCallbackIfDone();
                }
            }
        };
        AsyncTestZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
            // Let the parent try to handle the error.
            var result = parentZoneDelegate.handleError(targetZone, error);
            if (result) {
                this.failCallback(error);
                this._alreadyErrored = true;
            }
            return false;
        };
        AsyncTestZoneSpec.prototype.onHasTask = function (delegate, current, target, hasTaskState) {
            delegate.hasTask(target, hasTaskState);
            // We should only trigger finishCallback when the target zone is the AsyncTestZone
            // Consider the following cases.
            //
            // const childZone = asyncTestZone.fork({
            //   name: 'child',
            //   onHasTask: ...
            // });
            //
            // So we have nested zones declared the onHasTask hook, in this case,
            // the onHasTask will be triggered twice, and cause the finishCallbackIfDone()
            // is also be invoked twice. So we need to only trigger the finishCallbackIfDone()
            // when the current zone is the same as the target zone.
            if (current !== target) {
                return;
            }
            if (hasTaskState.change == 'microTask') {
                this._pendingMicroTasks = hasTaskState.microTask;
                this._finishCallbackIfDone();
            }
            else if (hasTaskState.change == 'macroTask') {
                this._pendingMacroTasks = hasTaskState.macroTask;
                this._finishCallbackIfDone();
            }
        };
        return AsyncTestZoneSpec;
    }());
    function patchAsyncTest(Zone) {
        // Export the class so that new instances can be created with proper
        // constructor params.
        Zone['AsyncTestZoneSpec'] = AsyncTestZoneSpec;
        Zone.__load_patch('asynctest', function (global, Zone, api) {
            /**
             * Wraps a test function in an asynchronous test zone. The test will automatically
             * complete when all asynchronous calls within this zone are done.
             */
            Zone[api.symbol('asyncTest')] = function asyncTest(fn) {
                // If we're running using the Jasmine test framework, adapt to call the 'done'
                // function when asynchronous activity is finished.
                if (global.jasmine) {
                    // Not using an arrow function to preserve context passed from call site
                    return function (done) {
                        if (!done) {
                            // if we run beforeEach in @angular/core/testing/testing_internal then we get no done
                            // fake it here and assume sync.
                            done = function () { };
                            done.fail = function (e) {
                                throw e;
                            };
                        }
                        runInTestZone(fn, this, done, function (err) {
                            if (typeof err === 'string') {
                                return done.fail(new Error(err));
                            }
                            else {
                                done.fail(err);
                            }
                        });
                    };
                }
                // Otherwise, return a promise which will resolve when asynchronous activity
                // is finished. This will be correctly consumed by the Mocha framework with
                // it('...', async(myFn)); or can be used in a custom framework.
                // Not using an arrow function to preserve context passed from call site
                return function () {
                    var _this = this;
                    return new Promise(function (finishCallback, failCallback) {
                        runInTestZone(fn, _this, finishCallback, failCallback);
                    });
                };
            };
            function runInTestZone(fn, context, finishCallback, failCallback) {
                var currentZone = Zone.current;
                var AsyncTestZoneSpec = Zone['AsyncTestZoneSpec'];
                if (AsyncTestZoneSpec === undefined) {
                    throw new Error('AsyncTestZoneSpec is needed for the async() test helper but could not be found. ' +
                        'Please make sure that your environment includes zone.js/plugins/async-test');
                }
                var ProxyZoneSpec = Zone['ProxyZoneSpec'];
                if (!ProxyZoneSpec) {
                    throw new Error('ProxyZoneSpec is needed for the async() test helper but could not be found. ' +
                        'Please make sure that your environment includes zone.js/plugins/proxy');
                }
                var proxyZoneSpec = ProxyZoneSpec.get();
                ProxyZoneSpec.assertPresent();
                // We need to create the AsyncTestZoneSpec outside the ProxyZone.
                // If we do it in ProxyZone then we will get to infinite recursion.
                var proxyZone = Zone.current.getZoneWith('ProxyZoneSpec');
                var previousDelegate = proxyZoneSpec.getDelegate();
                proxyZone.parent.run(function () {
                    var testZoneSpec = new AsyncTestZoneSpec(function () {
                        // Need to restore the original zone.
                        if (proxyZoneSpec.getDelegate() == testZoneSpec) {
                            // Only reset the zone spec if it's
                            // still this one. Otherwise, assume
                            // it's OK.
                            proxyZoneSpec.setDelegate(previousDelegate);
                        }
                        testZoneSpec.unPatchPromiseForTest();
                        currentZone.run(function () {
                            finishCallback();
                        });
                    }, function (error) {
                        // Need to restore the original zone.
                        if (proxyZoneSpec.getDelegate() == testZoneSpec) {
                            // Only reset the zone spec if it's sill this one. Otherwise, assume it's OK.
                            proxyZoneSpec.setDelegate(previousDelegate);
                        }
                        testZoneSpec.unPatchPromiseForTest();
                        currentZone.run(function () {
                            failCallback(error);
                        });
                    }, 'test');
                    proxyZoneSpec.setDelegate(testZoneSpec);
                    testZoneSpec.patchPromiseForTest();
                });
                return Zone.current.runGuarded(fn, context);
            }
        });
    }
    patchAsyncTest(Zone);
}));
Ȝx-"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){var e=globalThis;function n(n){return(e.__Zone_symbol_prefix||"__zone_symbol__")+n}var t="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global,i=function(){function e(e,i,s){this._pendingMicroTasks=!1,this._pendingMacroTasks=!1,this._alreadyErrored=!1,this._isSync=!1,this._existingFinishTimer=null,this.entryFunction=null,this.runZone=Zone.current,this.unresolvedChainedPromiseCount=0,this.supportWaitUnresolvedChainedPromise=!1,this.finishCallback=e,this.failCallback=i,this.name="asyncTestZone for "+s,this.properties={AsyncTestZoneSpec:this},this.supportWaitUnresolvedChainedPromise=!0===t[n("supportWaitUnResolvedChainedPromise")]}return Object.defineProperty(e,"symbolParentUnresolved",{get:function(){return n("parentUnresolved")},enumerable:!1,configurable:!0}),e.prototype.isUnresolvedChainedPromisePending=function(){return this.unresolvedChainedPromiseCount>0},e.prototype._finishCallbackIfDone=function(){var e=this;null!==this._existingFinishTimer&&(clearTimeout(this._existingFinishTimer),this._existingFinishTimer=null),this._pendingMicroTasks||this._pendingMacroTasks||this.supportWaitUnresolvedChainedPromise&&this.isUnresolvedChainedPromisePending()||this.runZone.run((function(){e._existingFinishTimer=setTimeout((function(){e._alreadyErrored||e._pendingMicroTasks||e._pendingMacroTasks||e.finishCallback()}),0)}))},e.prototype.patchPromiseForTest=function(){if(this.supportWaitUnresolvedChainedPromise){var e=Promise[Zone.__symbol__("patchPromiseForTest")];e&&e()}},e.prototype.unPatchPromiseForTest=function(){if(this.supportWaitUnresolvedChainedPromise){var e=Promise[Zone.__symbol__("unPatchPromiseForTest")];e&&e()}},e.prototype.onScheduleTask=function(n,t,i,s){return"eventTask"!==s.type&&(this._isSync=!1),"microTask"===s.type&&s.data&&s.data instanceof Promise&&!0===s.data[e.symbolParentUnresolved]&&this.unresolvedChainedPromiseCount--,n.scheduleTask(i,s)},e.prototype.onInvokeTask=function(e,n,t,i,s,o){return"eventTask"!==i.type&&(this._isSync=!1),e.invokeTask(t,i,s,o)},e.prototype.onCancelTask=function(e,n,t,i){return"eventTask"!==i.type&&(this._isSync=!1),e.cancelTask(t,i)},e.prototype.onInvoke=function(e,n,t,i,s,o,r){this.entryFunction||(this.entryFunction=i);try{return this._isSync=!0,e.invoke(t,i,s,o,r)}finally{this._isSync&&this.entryFunction===i&&this._finishCallbackIfDone()}},e.prototype.onHandleError=function(e,n,t,i){return e.handleError(t,i)&&(this.failCallback(i),this._alreadyErrored=!0),!1},e.prototype.onHasTask=function(e,n,t,i){e.hasTask(t,i),n===t&&("microTask"==i.change?(this._pendingMicroTasks=i.microTask,this._finishCallbackIfDone()):"macroTask"==i.change&&(this._pendingMacroTasks=i.macroTask,this._finishCallbackIfDone()))},e}();!function s(e){e.AsyncTestZoneSpec=i,e.__load_patch("asynctest",(function(e,n,t){function i(e,t,i,s){var o=n.current,r=n.AsyncTestZoneSpec;if(void 0===r)throw new Error("AsyncTestZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/plugins/async-test");var a=n.ProxyZoneSpec;if(!a)throw new Error("ProxyZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/plugins/proxy");var c=a.get();a.assertPresent();var u=n.current.getZoneWith("ProxyZoneSpec"),h=c.getDelegate();return u.parent.run((function(){var e=new r((function(){c.getDelegate()==e&&c.setDelegate(h),e.unPatchPromiseForTest(),o.run((function(){i()}))}),(function(n){c.getDelegate()==e&&c.setDelegate(h),e.unPatchPromiseForTest(),o.run((function(){s(n)}))}),"test");c.setDelegate(e),e.patchPromiseForTest()})),n.current.runGuarded(e,t)}n[t.symbol("asyncTest")]=function n(t){return e.jasmine?function(e){e||((e=function(){}).fail=function(e){throw e}),i(t,this,e,(function(n){if("string"==typeof n)return e.fail(new Error(n));e.fail(n)}))}:function(){var e=this;return new Promise((function(n,s){i(t,e,n,s)}))}}}))}(Zone)}));DExb'use strict';
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
            ar[i] = from[i];
        }
    }
    return to.concat(ar || Array.prototype.slice.call(from));
};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    var global = (typeof window === 'object' && window) || (typeof self === 'object' && self) || globalThis.global;
    var OriginalDate = global.Date;
    // Since when we compile this file to `es2015`, and if we define
    // this `FakeDate` as `class FakeDate`, and then set `FakeDate.prototype`
    // there will be an error which is `Cannot assign to read only property 'prototype'`
    // so we need to use function implementation here.
    function FakeDate() {
        if (arguments.length === 0) {
            var d = new OriginalDate();
            d.setTime(FakeDate.now());
            return d;
        }
        else {
            var args = Array.prototype.slice.call(arguments);
            return new (OriginalDate.bind.apply(OriginalDate, __spreadArray([void 0], args, false)))();
        }
    }
    FakeDate.now = function () {
        var fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
        if (fakeAsyncTestZoneSpec) {
            return fakeAsyncTestZoneSpec.getFakeSystemTime();
        }
        return OriginalDate.now.apply(this, arguments);
    };
    FakeDate.UTC = OriginalDate.UTC;
    FakeDate.parse = OriginalDate.parse;
    // keep a reference for zone patched timer function
    var patchedTimers;
    var timeoutCallback = function () { };
    var Scheduler = /** @class */ (function () {
        function Scheduler() {
            // Scheduler queue with the tuple of end time and callback function - sorted by end time.
            this._schedulerQueue = [];
            // Current simulated time in millis.
            this._currentTickTime = 0;
            // Current fake system base time in millis.
            this._currentFakeBaseSystemTime = OriginalDate.now();
            // track requeuePeriodicTimer
            this._currentTickRequeuePeriodicEntries = [];
        }
        Scheduler.getNextId = function () {
            var id = patchedTimers.nativeSetTimeout.call(global, timeoutCallback, 0);
            patchedTimers.nativeClearTimeout.call(global, id);
            if (typeof id === 'number') {
                return id;
            }
            // in NodeJS, we just use a number for fakeAsync, since it will not
            // conflict with native TimeoutId
            return Scheduler.nextNodeJSId++;
        };
        Scheduler.prototype.getCurrentTickTime = function () {
            return this._currentTickTime;
        };
        Scheduler.prototype.getFakeSystemTime = function () {
            return this._currentFakeBaseSystemTime + this._currentTickTime;
        };
        Scheduler.prototype.setFakeBaseSystemTime = function (fakeBaseSystemTime) {
            this._currentFakeBaseSystemTime = fakeBaseSystemTime;
        };
        Scheduler.prototype.getRealSystemTime = function () {
            return OriginalDate.now();
        };
        Scheduler.prototype.scheduleFunction = function (cb, delay, options) {
            options = __assign({
                args: [],
                isPeriodic: false,
                isRequestAnimationFrame: false,
                id: -1,
                isRequeuePeriodic: false,
            }, options);
            var currentId = options.id < 0 ? Scheduler.nextId : options.id;
            Scheduler.nextId = Scheduler.getNextId();
            var endTime = this._currentTickTime + delay;
            // Insert so that scheduler queue remains sorted by end time.
            var newEntry = {
                endTime: endTime,
                id: currentId,
                func: cb,
                args: options.args,
                delay: delay,
                isPeriodic: options.isPeriodic,
                isRequestAnimationFrame: options.isRequestAnimationFrame,
            };
            if (options.isRequeuePeriodic) {
                this._currentTickRequeuePeriodicEntries.push(newEntry);
            }
            var i = 0;
            for (; i < this._schedulerQueue.length; i++) {
                var currentEntry = this._schedulerQueue[i];
                if (newEntry.endTime < currentEntry.endTime) {
                    break;
                }
            }
            this._schedulerQueue.splice(i, 0, newEntry);
            return currentId;
        };
        Scheduler.prototype.removeScheduledFunctionWithId = function (id) {
            for (var i = 0; i < this._schedulerQueue.length; i++) {
                if (this._schedulerQueue[i].id == id) {
                    this._schedulerQueue.splice(i, 1);
                    break;
                }
            }
        };
        Scheduler.prototype.removeAll = function () {
            this._schedulerQueue = [];
        };
        Scheduler.prototype.getTimerCount = function () {
            return this._schedulerQueue.length;
        };
        Scheduler.prototype.tickToNext = function (step, doTick, tickOptions) {
            if (step === void 0) { step = 1; }
            if (this._schedulerQueue.length < step) {
                return;
            }
            // Find the last task currently queued in the scheduler queue and tick
            // till that time.
            var startTime = this._currentTickTime;
            var targetTask = this._schedulerQueue[step - 1];
            this.tick(targetTask.endTime - startTime, doTick, tickOptions);
        };
        Scheduler.prototype.tick = function (millis, doTick, tickOptions) {
            if (millis === void 0) { millis = 0; }
            var finalTime = this._currentTickTime + millis;
            var lastCurrentTime = 0;
            tickOptions = Object.assign({ processNewMacroTasksSynchronously: true }, tickOptions);
            // we need to copy the schedulerQueue so nested timeout
            // will not be wrongly called in the current tick
            // https://github.com/angular/angular/issues/33799
            var schedulerQueue = tickOptions.processNewMacroTasksSynchronously
                ? this._schedulerQueue
                : this._schedulerQueue.slice();
            if (schedulerQueue.length === 0 && doTick) {
                doTick(millis);
                return;
            }
            while (schedulerQueue.length > 0) {
                // clear requeueEntries before each loop
                this._currentTickRequeuePeriodicEntries = [];
                var current = schedulerQueue[0];
                if (finalTime < current.endTime) {
                    // Done processing the queue since it's sorted by endTime.
                    break;
                }
                else {
                    // Time to run scheduled function. Remove it from the head of queue.
                    var current_1 = schedulerQueue.shift();
                    if (!tickOptions.processNewMacroTasksSynchronously) {
                        var idx = this._schedulerQueue.indexOf(current_1);
                        if (idx >= 0) {
                            this._schedulerQueue.splice(idx, 1);
                        }
                    }
                    lastCurrentTime = this._currentTickTime;
                    this._currentTickTime = current_1.endTime;
                    if (doTick) {
                        doTick(this._currentTickTime - lastCurrentTime);
                    }
                    var retval = current_1.func.apply(global, current_1.isRequestAnimationFrame ? [this._currentTickTime] : current_1.args);
                    if (!retval) {
                        // Uncaught exception in the current scheduled function. Stop processing the queue.
                        break;
                    }
                    // check is there any requeue periodic entry is added in
                    // current loop, if there is, we need to add to current loop
                    if (!tickOptions.processNewMacroTasksSynchronously) {
                        this._currentTickRequeuePeriodicEntries.forEach(function (newEntry) {
                            var i = 0;
                            for (; i < schedulerQueue.length; i++) {
                                var currentEntry = schedulerQueue[i];
                                if (newEntry.endTime < currentEntry.endTime) {
                                    break;
                                }
                            }
                            schedulerQueue.splice(i, 0, newEntry);
                        });
                    }
                }
            }
            lastCurrentTime = this._currentTickTime;
            this._currentTickTime = finalTime;
            if (doTick) {
                doTick(this._currentTickTime - lastCurrentTime);
            }
        };
        Scheduler.prototype.flushOnlyPendingTimers = function (doTick) {
            if (this._schedulerQueue.length === 0) {
                return 0;
            }
            // Find the last task currently queued in the scheduler queue and tick
            // till that time.
            var startTime = this._currentTickTime;
            var lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
            this.tick(lastTask.endTime - startTime, doTick, { processNewMacroTasksSynchronously: false });
            return this._currentTickTime - startTime;
        };
        Scheduler.prototype.flush = function (limit, flushPeriodic, doTick) {
            if (limit === void 0) { limit = 20; }
            if (flushPeriodic === void 0) { flushPeriodic = false; }
            if (flushPeriodic) {
                return this.flushPeriodic(doTick);
            }
            else {
                return this.flushNonPeriodic(limit, doTick);
            }
        };
        Scheduler.prototype.flushPeriodic = function (doTick) {
            if (this._schedulerQueue.length === 0) {
                return 0;
            }
            // Find the last task currently queued in the scheduler queue and tick
            // till that time.
            var startTime = this._currentTickTime;
            var lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
            this.tick(lastTask.endTime - startTime, doTick);
            return this._currentTickTime - startTime;
        };
        Scheduler.prototype.flushNonPeriodic = function (limit, doTick) {
            var startTime = this._currentTickTime;
            var lastCurrentTime = 0;
            var count = 0;
            while (this._schedulerQueue.length > 0) {
                count++;
                if (count > limit) {
                    throw new Error('flush failed after reaching the limit of ' +
                        limit +
                        ' tasks. Does your code use a polling timeout?');
                }
                // flush only non-periodic timers.
                // If the only remaining tasks are periodic(or requestAnimationFrame), finish flushing.
                if (this._schedulerQueue.filter(function (task) { return !task.isPeriodic && !task.isRequestAnimationFrame; })
                    .length === 0) {
                    break;
                }
                var current = this._schedulerQueue.shift();
                lastCurrentTime = this._currentTickTime;
                this._currentTickTime = current.endTime;
                if (doTick) {
                    // Update any secondary schedulers like Jasmine mock Date.
                    doTick(this._currentTickTime - lastCurrentTime);
                }
                var retval = current.func.apply(global, current.args);
                if (!retval) {
                    // Uncaught exception in the current scheduled function. Stop processing the queue.
                    break;
                }
            }
            return this._currentTickTime - startTime;
        };
        // Next scheduler id.
        Scheduler.nextNodeJSId = 1;
        Scheduler.nextId = -1;
        return Scheduler;
    }());
    var FakeAsyncTestZoneSpec = /** @class */ (function () {
        function FakeAsyncTestZoneSpec(namePrefix, trackPendingRequestAnimationFrame, macroTaskOptions) {
            if (trackPendingRequestAnimationFrame === void 0) { trackPendingRequestAnimationFrame = false; }
            this._scheduler = new Scheduler();
            this._microtasks = [];
            this._lastError = null;
            this._uncaughtPromiseErrors = Promise[Zone.__symbol__('uncaughtPromiseErrors')];
            this.pendingPeriodicTimers = [];
            this.pendingTimers = [];
            this.patchDateLocked = false;
            this.properties = { 'FakeAsyncTestZoneSpec': this };
            this.trackPendingRequestAnimationFrame = trackPendingRequestAnimationFrame;
            this.macroTaskOptions = macroTaskOptions;
            this.name = 'fakeAsyncTestZone for ' + namePrefix;
            // in case user can't access the construction of FakeAsyncTestSpec
            // user can also define macroTaskOptions by define a global variable.
            if (!this.macroTaskOptions) {
                this.macroTaskOptions = global[Zone.__symbol__('FakeAsyncTestMacroTask')];
            }
        }
        FakeAsyncTestZoneSpec.assertInZone = function () {
            if (Zone.current.get('FakeAsyncTestZoneSpec') == null) {
                throw new Error('The code should be running in the fakeAsync zone to call this function');
            }
        };
        FakeAsyncTestZoneSpec.prototype._fnAndFlush = function (fn, completers) {
            var _this = this;
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                fn.apply(global, args);
                if (_this._lastError === null) {
                    // Success
                    if (completers.onSuccess != null) {
                        completers.onSuccess.apply(global);
                    }
                    // Flush microtasks only on success.
                    _this.flushMicrotasks();
                }
                else {
                    // Failure
                    if (completers.onError != null) {
                        completers.onError.apply(global);
                    }
                }
                // Return true if there were no errors, false otherwise.
                return _this._lastError === null;
            };
        };
        FakeAsyncTestZoneSpec._removeTimer = function (timers, id) {
            var index = timers.indexOf(id);
            if (index > -1) {
                timers.splice(index, 1);
            }
        };
        FakeAsyncTestZoneSpec.prototype._dequeueTimer = function (id) {
            var _this = this;
            return function () {
                FakeAsyncTestZoneSpec._removeTimer(_this.pendingTimers, id);
            };
        };
        FakeAsyncTestZoneSpec.prototype._requeuePeriodicTimer = function (fn, interval, args, id) {
            var _this = this;
            return function () {
                // Requeue the timer callback if it's not been canceled.
                if (_this.pendingPeriodicTimers.indexOf(id) !== -1) {
                    _this._scheduler.scheduleFunction(fn, interval, {
                        args: args,
                        isPeriodic: true,
                        id: id,
                        isRequeuePeriodic: true,
                    });
                }
            };
        };
        FakeAsyncTestZoneSpec.prototype._dequeuePeriodicTimer = function (id) {
            var _this = this;
            return function () {
                FakeAsyncTestZoneSpec._removeTimer(_this.pendingPeriodicTimers, id);
            };
        };
        FakeAsyncTestZoneSpec.prototype._setTimeout = function (fn, delay, args, isTimer) {
            if (isTimer === void 0) { isTimer = true; }
            var removeTimerFn = this._dequeueTimer(Scheduler.nextId);
            // Queue the callback and dequeue the timer on success and error.
            var cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
            var id = this._scheduler.scheduleFunction(cb, delay, { args: args, isRequestAnimationFrame: !isTimer });
            if (isTimer) {
                this.pendingTimers.push(id);
            }
            return id;
        };
        FakeAsyncTestZoneSpec.prototype._clearTimeout = function (id) {
            FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
            this._scheduler.removeScheduledFunctionWithId(id);
        };
        FakeAsyncTestZoneSpec.prototype._setInterval = function (fn, interval, args) {
            var id = Scheduler.nextId;
            var completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
            var cb = this._fnAndFlush(fn, completers);
            // Use the callback created above to requeue on success.
            completers.onSuccess = this._requeuePeriodicTimer(cb, interval, args, id);
            // Queue the callback and dequeue the periodic timer only on error.
            this._scheduler.scheduleFunction(cb, interval, { args: args, isPeriodic: true });
            this.pendingPeriodicTimers.push(id);
            return id;
        };
        FakeAsyncTestZoneSpec.prototype._clearInterval = function (id) {
            FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
            this._scheduler.removeScheduledFunctionWithId(id);
        };
        FakeAsyncTestZoneSpec.prototype._resetLastErrorAndThrow = function () {
            var error = this._lastError || this._uncaughtPromiseErrors[0];
            this._uncaughtPromiseErrors.length = 0;
            this._lastError = null;
            throw error;
        };
        FakeAsyncTestZoneSpec.prototype.getCurrentTickTime = function () {
            return this._scheduler.getCurrentTickTime();
        };
        FakeAsyncTestZoneSpec.prototype.getFakeSystemTime = function () {
            return this._scheduler.getFakeSystemTime();
        };
        FakeAsyncTestZoneSpec.prototype.setFakeBaseSystemTime = function (realTime) {
            this._scheduler.setFakeBaseSystemTime(realTime);
        };
        FakeAsyncTestZoneSpec.prototype.getRealSystemTime = function () {
            return this._scheduler.getRealSystemTime();
        };
        FakeAsyncTestZoneSpec.patchDate = function () {
            if (!!global[Zone.__symbol__('disableDatePatching')]) {
                // we don't want to patch global Date
                // because in some case, global Date
                // is already being patched, we need to provide
                // an option to let user still use their
                // own version of Date.
                return;
            }
            if (global['Date'] === FakeDate) {
                // already patched
                return;
            }
            global['Date'] = FakeDate;
            FakeDate.prototype = OriginalDate.prototype;
            // try check and reset timers
            // because jasmine.clock().install() may
            // have replaced the global timer
            FakeAsyncTestZoneSpec.checkTimerPatch();
        };
        FakeAsyncTestZoneSpec.resetDate = function () {
            if (global['Date'] === FakeDate) {
                global['Date'] = OriginalDate;
            }
        };
        FakeAsyncTestZoneSpec.checkTimerPatch = function () {
            if (!patchedTimers) {
                throw new Error('Expected timers to have been patched.');
            }
            if (global.setTimeout !== patchedTimers.setTimeout) {
                global.setTimeout = patchedTimers.setTimeout;
                global.clearTimeout = patchedTimers.clearTimeout;
            }
            if (global.setInterval !== patchedTimers.setInterval) {
                global.setInterval = patchedTimers.setInterval;
                global.clearInterval = patchedTimers.clearInterval;
            }
        };
        FakeAsyncTestZoneSpec.prototype.lockDatePatch = function () {
            this.patchDateLocked = true;
            FakeAsyncTestZoneSpec.patchDate();
        };
        FakeAsyncTestZoneSpec.prototype.unlockDatePatch = function () {
            this.patchDateLocked = false;
            FakeAsyncTestZoneSpec.resetDate();
        };
        FakeAsyncTestZoneSpec.prototype.tickToNext = function (steps, doTick, tickOptions) {
            if (steps === void 0) { steps = 1; }
            if (tickOptions === void 0) { tickOptions = { processNewMacroTasksSynchronously: true }; }
            if (steps <= 0) {
                return;
            }
            FakeAsyncTestZoneSpec.assertInZone();
            this.flushMicrotasks();
            this._scheduler.tickToNext(steps, doTick, tickOptions);
            if (this._lastError !== null) {
                this._resetLastErrorAndThrow();
            }
        };
        FakeAsyncTestZoneSpec.prototype.tick = function (millis, doTick, tickOptions) {
            if (millis === void 0) { millis = 0; }
            if (tickOptions === void 0) { tickOptions = { processNewMacroTasksSynchronously: true }; }
            FakeAsyncTestZoneSpec.assertInZone();
            this.flushMicrotasks();
            this._scheduler.tick(millis, doTick, tickOptions);
            if (this._lastError !== null) {
                this._resetLastErrorAndThrow();
            }
        };
        FakeAsyncTestZoneSpec.prototype.flushMicrotasks = function () {
            var _this = this;
            FakeAsyncTestZoneSpec.assertInZone();
            var flushErrors = function () {
                if (_this._lastError !== null || _this._uncaughtPromiseErrors.length) {
                    // If there is an error stop processing the microtask queue and rethrow the error.
                    _this._resetLastErrorAndThrow();
                }
            };
            while (this._microtasks.length > 0) {
                var microtask = this._microtasks.shift();
                microtask.func.apply(microtask.target, microtask.args);
            }
            flushErrors();
        };
        FakeAsyncTestZoneSpec.prototype.flush = function (limit, flushPeriodic, doTick) {
            FakeAsyncTestZoneSpec.assertInZone();
            this.flushMicrotasks();
            var elapsed = this._scheduler.flush(limit, flushPeriodic, doTick);
            if (this._lastError !== null) {
                this._resetLastErrorAndThrow();
            }
            return elapsed;
        };
        FakeAsyncTestZoneSpec.prototype.flushOnlyPendingTimers = function (doTick) {
            FakeAsyncTestZoneSpec.assertInZone();
            this.flushMicrotasks();
            var elapsed = this._scheduler.flushOnlyPendingTimers(doTick);
            if (this._lastError !== null) {
                this._resetLastErrorAndThrow();
            }
            return elapsed;
        };
        FakeAsyncTestZoneSpec.prototype.removeAllTimers = function () {
            FakeAsyncTestZoneSpec.assertInZone();
            this._scheduler.removeAll();
            this.pendingPeriodicTimers = [];
            this.pendingTimers = [];
        };
        FakeAsyncTestZoneSpec.prototype.getTimerCount = function () {
            return this._scheduler.getTimerCount() + this._microtasks.length;
        };
        FakeAsyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
            switch (task.type) {
                case 'microTask':
                    var args = task.data && task.data.args;
                    // should pass additional arguments to callback if have any
                    // currently we know process.nextTick will have such additional
                    // arguments
                    var additionalArgs = void 0;
                    if (args) {
                        var callbackIndex = task.data.cbIdx;
                        if (typeof args.length === 'number' && args.length > callbackIndex + 1) {
                            additionalArgs = Array.prototype.slice.call(args, callbackIndex + 1);
                        }
                    }
                    this._microtasks.push({
                        func: task.invoke,
                        args: additionalArgs,
                        target: task.data && task.data.target,
                    });
                    break;
                case 'macroTask':
                    switch (task.source) {
                        case 'setTimeout':
                            task.data['handleId'] = this._setTimeout(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
                            break;
                        case 'setImmediate':
                            task.data['handleId'] = this._setTimeout(task.invoke, 0, Array.prototype.slice.call(task.data['args'], 1));
                            break;
                        case 'setInterval':
                            task.data['handleId'] = this._setInterval(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
                            break;
                        case 'XMLHttpRequest.send':
                            throw new Error('Cannot make XHRs from within a fake async test. Request URL: ' +
                                task.data['url']);
                        case 'requestAnimationFrame':
                        case 'webkitRequestAnimationFrame':
                        case 'mozRequestAnimationFrame':
                            // Simulate a requestAnimationFrame by using a setTimeout with 16 ms.
                            // (60 frames per second)
                            task.data['handleId'] = this._setTimeout(task.invoke, 16, task.data['args'], this.trackPendingRequestAnimationFrame);
                            break;
                        default:
                            // user can define which macroTask they want to support by passing
                            // macroTaskOptions
                            var macroTaskOption = this.findMacroTaskOption(task);
                            if (macroTaskOption) {
                                var args_1 = task.data && task.data['args'];
                                var delay = args_1 && args_1.length > 1 ? args_1[1] : 0;
                                var callbackArgs = macroTaskOption.callbackArgs ? macroTaskOption.callbackArgs : args_1;
                                if (!!macroTaskOption.isPeriodic) {
                                    // periodic macroTask, use setInterval to simulate
                                    task.data['handleId'] = this._setInterval(task.invoke, delay, callbackArgs);
                                    task.data.isPeriodic = true;
                                }
                                else {
                                    // not periodic, use setTimeout to simulate
                                    task.data['handleId'] = this._setTimeout(task.invoke, delay, callbackArgs);
                                }
                                break;
                            }
                            throw new Error('Unknown macroTask scheduled in fake async test: ' + task.source);
                    }
                    break;
                case 'eventTask':
                    task = delegate.scheduleTask(target, task);
                    break;
            }
            return task;
        };
        FakeAsyncTestZoneSpec.prototype.onCancelTask = function (delegate, current, target, task) {
            switch (task.source) {
                case 'setTimeout':
                case 'requestAnimationFrame':
                case 'webkitRequestAnimationFrame':
                case 'mozRequestAnimationFrame':
                    return this._clearTimeout(task.data['handleId']);
                case 'setInterval':
                    return this._clearInterval(task.data['handleId']);
                default:
                    // user can define which macroTask they want to support by passing
                    // macroTaskOptions
                    var macroTaskOption = this.findMacroTaskOption(task);
                    if (macroTaskOption) {
                        var handleId = task.data['handleId'];
                        return macroTaskOption.isPeriodic
                            ? this._clearInterval(handleId)
                            : this._clearTimeout(handleId);
                    }
                    return delegate.cancelTask(target, task);
            }
        };
        FakeAsyncTestZoneSpec.prototype.onInvoke = function (delegate, current, target, callback, applyThis, applyArgs, source) {
            try {
                FakeAsyncTestZoneSpec.patchDate();
                return delegate.invoke(target, callback, applyThis, applyArgs, source);
            }
            finally {
                if (!this.patchDateLocked) {
                    FakeAsyncTestZoneSpec.resetDate();
                }
            }
        };
        FakeAsyncTestZoneSpec.prototype.findMacroTaskOption = function (task) {
            if (!this.macroTaskOptions) {
                return null;
            }
            for (var i = 0; i < this.macroTaskOptions.length; i++) {
                var macroTaskOption = this.macroTaskOptions[i];
                if (macroTaskOption.source === task.source) {
                    return macroTaskOption;
                }
            }
            return null;
        };
        FakeAsyncTestZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
            // ComponentFixture has a special-case handling to detect FakeAsyncTestZoneSpec
            // and prevent rethrowing the error from the onError subscription since it's handled here.
            this._lastError = error;
            return false; // Don't propagate error to parent zone.
        };
        return FakeAsyncTestZoneSpec;
    }());
    var _fakeAsyncTestZoneSpec = null;
    function getProxyZoneSpec() {
        return Zone && Zone['ProxyZoneSpec'];
    }
    var _sharedProxyZoneSpec = null;
    var _sharedProxyZone = null;
    /**
     * Clears out the shared fake async zone for a test.
     * To be called in a global `beforeEach`.
     *
     * @experimental
     */
    function resetFakeAsyncZone() {
        var _a, _b;
        if (_fakeAsyncTestZoneSpec) {
            _fakeAsyncTestZoneSpec.unlockDatePatch();
        }
        _fakeAsyncTestZoneSpec = null;
        (_b = (_a = getProxyZoneSpec()) === null || _a === void 0 ? void 0 : _a.get()) === null || _b === void 0 ? void 0 : _b.resetDelegate();
        _sharedProxyZoneSpec === null || _sharedProxyZoneSpec === void 0 ? void 0 : _sharedProxyZoneSpec.resetDelegate();
    }
    /**
     * Wraps a function to be executed in the fakeAsync zone:
     * - microtasks are manually executed by calling `flushMicrotasks()`,
     * - timers are synchronous, `tick()` simulates the asynchronous passage of time.
     *
     * When flush is `false`, if there are any pending timers at the end of the function,
     * an exception will be thrown.
     *
     * Can be used to wrap inject() calls.
     *
     * ## Example
     *
     * {@example core/testing/ts/fake_async.ts region='basic'}
     *
     * @param fn
     * @param options
     *     flush: when true, will drain the macrotask queue after the test function completes.
     * @returns The function wrapped to be executed in the fakeAsync zone
     *
     * @experimental
     */
    function fakeAsync(fn, options) {
        if (options === void 0) { options = {}; }
        var _a = options.flush, flush = _a === void 0 ? true : _a;
        // Not using an arrow function to preserve context passed from call site
        var fakeAsyncFn = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var ProxyZoneSpec = getProxyZoneSpec();
            if (!ProxyZoneSpec) {
                throw new Error('ProxyZoneSpec is needed for the fakeAsync() test helper but could not be found. ' +
                    'Make sure that your environment includes zone-testing.js');
            }
            var proxyZoneSpec = ProxyZoneSpec.assertPresent();
            if (Zone.current.get('FakeAsyncTestZoneSpec')) {
                throw new Error('fakeAsync() calls can not be nested');
            }
            try {
                // in case jasmine.clock init a fakeAsyncTestZoneSpec
                if (!_fakeAsyncTestZoneSpec) {
                    var FakeAsyncTestZoneSpec_1 = Zone && Zone['FakeAsyncTestZoneSpec'];
                    if (proxyZoneSpec.getDelegate() instanceof FakeAsyncTestZoneSpec_1) {
                        throw new Error('fakeAsync() calls can not be nested');
                    }
                    _fakeAsyncTestZoneSpec = new FakeAsyncTestZoneSpec_1();
                }
                var res = void 0;
                var lastProxyZoneSpec = proxyZoneSpec.getDelegate();
                proxyZoneSpec.setDelegate(_fakeAsyncTestZoneSpec);
                _fakeAsyncTestZoneSpec.lockDatePatch();
                try {
                    res = fn.apply(this, args);
                    if (flush) {
                        _fakeAsyncTestZoneSpec.flush(20, true);
                    }
                    else {
                        flushMicrotasks();
                    }
                }
                finally {
                    proxyZoneSpec.setDelegate(lastProxyZoneSpec);
                }
                if (!flush) {
                    if (_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length > 0) {
                        throw new Error("".concat(_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length, " ") +
                            "periodic timer(s) still in the queue.");
                    }
                    if (_fakeAsyncTestZoneSpec.pendingTimers.length > 0) {
                        throw new Error("".concat(_fakeAsyncTestZoneSpec.pendingTimers.length, " timer(s) still in the queue."));
                    }
                }
                return res;
            }
            finally {
                resetFakeAsyncZone();
            }
        };
        fakeAsyncFn.isFakeAsync = true;
        return fakeAsyncFn;
    }
    function _getFakeAsyncZoneSpec() {
        if (_fakeAsyncTestZoneSpec == null) {
            _fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
            if (_fakeAsyncTestZoneSpec == null) {
                throw new Error('The code should be running in the fakeAsync zone to call this function');
            }
        }
        return _fakeAsyncTestZoneSpec;
    }
    /**
     * Simulates the asynchronous passage of time for the timers in the fakeAsync zone.
     *
     * The microtasks queue is drained at the very start of this function and after any timer
     * callback has been executed.
     *
     * ## Example
     *
     * {@example core/testing/ts/fake_async.ts region='basic'}
     *
     * @experimental
     */
    function tick(millis, ignoreNestedTimeout) {
        if (millis === void 0) { millis = 0; }
        if (ignoreNestedTimeout === void 0) { ignoreNestedTimeout = false; }
        _getFakeAsyncZoneSpec().tick(millis, null, ignoreNestedTimeout);
    }
    /**
     * Simulates the asynchronous passage of time for the timers in the fakeAsync zone by
     * draining the macrotask queue until it is empty. The returned value is the milliseconds
     * of time that would have been elapsed.
     *
     * @param maxTurns
     * @returns The simulated time elapsed, in millis.
     *
     * @experimental
     */
    function flush(maxTurns) {
        return _getFakeAsyncZoneSpec().flush(maxTurns);
    }
    /**
     * Discard all remaining periodic tasks.
     *
     * @experimental
     */
    function discardPeriodicTasks() {
        var zoneSpec = _getFakeAsyncZoneSpec();
        zoneSpec.pendingPeriodicTimers;
        zoneSpec.pendingPeriodicTimers.length = 0;
    }
    /**
     * Wraps a function to be executed in a shared ProxyZone.
     *
     * If no shared ProxyZone exists, one is created and reused for subsequent calls.
     * Useful for wrapping test setup (beforeEach) and test execution (it) when test
     * runner patching isn't available or desired for setting up the ProxyZone.
     *
     * @param fn The function to wrap.
     * @returns A function that executes the original function within the shared ProxyZone.
     *
     * @experimental
     */
    function withProxyZone(fn) {
        var autoProxyFn = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var proxyZoneSpec = getProxyZoneSpec();
            if (proxyZoneSpec === undefined) {
                throw new Error('ProxyZoneSpec is needed for the withProxyZone() test helper but could not be found. ' +
                    'Make sure that your environment includes zone-testing.js');
            }
            var proxyZone = proxyZoneSpec.get() !== undefined ? Zone.current : getOrCreateRootProxy();
            return proxyZone.run(fn, this, args);
        };
        return autoProxyFn;
    }
    function getOrCreateRootProxy() {
        var ProxyZoneSpec = getProxyZoneSpec();
        if (ProxyZoneSpec === undefined) {
            throw new Error('ProxyZoneSpec is needed for withProxyZone but could not be found. ' +
                'Make sure that your environment includes zone-testing.js');
        }
        // Ensure the shared ProxyZoneSpec instance exists
        if (_sharedProxyZoneSpec === null) {
            _sharedProxyZoneSpec = new ProxyZoneSpec();
        }
        _sharedProxyZone = Zone.root.fork(_sharedProxyZoneSpec);
        return _sharedProxyZone;
    }
    /**
     * Flush any pending microtasks.
     *
     * @experimental
     */
    function flushMicrotasks() {
        _getFakeAsyncZoneSpec().flushMicrotasks();
    }
    function patchFakeAsyncTest(Zone) {
        // Export the class so that new instances can be created with proper
        // constructor params.
        Zone['FakeAsyncTestZoneSpec'] = FakeAsyncTestZoneSpec;
        Zone.__load_patch('fakeasync', function (global, Zone, api) {
            Zone[api.symbol('fakeAsyncTest')] = {
                resetFakeAsyncZone: resetFakeAsyncZone,
                flushMicrotasks: flushMicrotasks,
                discardPeriodicTasks: discardPeriodicTasks,
                tick: tick,
                flush: flush,
                fakeAsync: fakeAsync,
                withProxyZone: withProxyZone,
            };
        }, true);
        patchedTimers = {
            setTimeout: global.setTimeout,
            setInterval: global.setInterval,
            clearTimeout: global.clearTimeout,
            clearInterval: global.clearInterval,
            nativeSetTimeout: global[Zone.__symbol__('setTimeout')],
            nativeClearTimeout: global[Zone.__symbol__('clearTimeout')],
        };
        Scheduler.nextId = Scheduler.getNextId();
    }
    patchFakeAsyncTest(Zone);
}));
M+x~
'use strict'function patchSϘvar SU27N
function S2!X_runZone = Zone.current;
"name = '5-]S@J^J`k0cV_p_ct_ _cc ЈWCannot call ".concat(task.source, " from within a sync test (").concat(this.name, ").")f_cn n?p!p;uo)Sx	    }());ޘ{SyncTestZoneSpec'] = Sx
    patchSyncTest(Zone);
}));
U)Kxk8"use strict";var __assign=this&&this.__assign||function(){return __assign=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},__assign.apply(this,arguments)},__spreadArray=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var i,n=0,s=t.length;n<s;n++)!i&&n in t||(i||(i=Array.prototype.slice.call(t,0,n)),i[n]=t[n]);return e.concat(i||Array.prototype.slice.call(t))};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){var e,t="object"==typeof window&&window||"object"==typeof self&&self||globalThis.global,r=t.Date;function i(){if(0===arguments.length){var e=new r;return e.setTime(i.now()),e}var t=Array.prototype.slice.call(arguments);return new(r.bind.apply(r,__spreadArray([void 0],t,!1)))}i.now=function(){var e=Zone.current.get("FakeAsyncTestZoneSpec");return e?e.getFakeSystemTime():r.now.apply(this,arguments)},i.UTC=r.UTC,i.parse=r.parse;var n=function(){},s=function(){function i(){this._schedulerQueue=[],this._currentTickTime=0,this._currentFakeBaseSystemTime=r.now(),this._currentTickRequeuePeriodicEntries=[]}return i.getNextId=function(){var r=e.nativeSetTimeout.call(t,n,0);return e.nativeClearTimeout.call(t,r),"number"==typeof r?r:i.nextNodeJSId++},i.prototype.getCurrentTickTime=function(){return this._currentTickTime},i.prototype.getFakeSystemTime=function(){return this._currentFakeBaseSystemTime+this._currentTickTime},i.prototype.setFakeBaseSystemTime=function(e){this._currentFakeBaseSystemTime=e},i.prototype.getRealSystemTime=function(){return r.now()},i.prototype.scheduleFunction=function(e,t,r){var n=(r=__assign({args:[],isPeriodic:!1,isRequestAnimationFrame:!1,id:-1,isRequeuePeriodic:!1},r)).id<0?i.nextId:r.id;i.nextId=i.getNextId();var s={endTime:this._currentTickTime+t,id:n,func:e,args:r.args,delay:t,isPeriodic:r.isPeriodic,isRequestAnimationFrame:r.isRequestAnimationFrame};r.isRequeuePeriodic&&this._currentTickRequeuePeriodicEntries.push(s);for(var o=0;o<this._schedulerQueue.length&&!(s.endTime<this._schedulerQueue[o].endTime);o++);return this._schedulerQueue.splice(o,0,s),n},i.prototype.removeScheduledFunctionWithId=function(e){for(var t=0;t<this._schedulerQueue.length;t++)if(this._schedulerQueue[t].id==e){this._schedulerQueue.splice(t,1);break}},i.prototype.removeAll=function(){this._schedulerQueue=[]},i.prototype.getTimerCount=function(){return this._schedulerQueue.length},i.prototype.tickToNext=function(e,t,r){void 0===e&&(e=1),this._schedulerQueue.length<e||this.tick(this._schedulerQueue[e-1].endTime-this._currentTickTime,t,r)},i.prototype.tick=function(e,r,i){void 0===e&&(e=0);var n=this._currentTickTime+e,s=0,o=(i=Object.assign({processNewMacroTasksSynchronously:!0},i)).processNewMacroTasksSynchronously?this._schedulerQueue:this._schedulerQueue.slice();if(0===o.length&&r)r(e);else{for(;o.length>0&&(this._currentTickRequeuePeriodicEntries=[],!(n<o[0].endTime));){var a=o.shift();if(!i.processNewMacroTasksSynchronously){var c=this._schedulerQueue.indexOf(a);c>=0&&this._schedulerQueue.splice(c,1)}if(s=this._currentTickTime,this._currentTickTime=a.endTime,r&&r(this._currentTickTime-s),!a.func.apply(t,a.isRequestAnimationFrame?[this._currentTickTime]:a.args))break;i.processNewMacroTasksSynchronously||this._currentTickRequeuePeriodicEntries.forEach((function(e){for(var t=0;t<o.length&&!(e.endTime<o[t].endTime);t++);o.splice(t,0,e)}))}s=this._currentTickTime,this._currentTickTime=n,r&&r(this._currentTickTime-s)}},i.prototype.flushOnlyPendingTimers=function(e){if(0===this._schedulerQueue.length)return 0;var t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e,{processNewMacroTasksSynchronously:!1}),this._currentTickTime-t},i.prototype.flush=function(e,t,r){return void 0===e&&(e=20),void 0===t&&(t=!1),t?this.flushPeriodic(r):this.flushNonPeriodic(e,r)},i.prototype.flushPeriodic=function(e){if(0===this._schedulerQueue.length)return 0;var t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e),this._currentTickTime-t},i.prototype.flushNonPeriodic=function(e,r){for(var i=this._currentTickTime,n=0,s=0;this._schedulerQueue.length>0;){if(++s>e)throw new Error("flush failed after reaching the limit of "+e+" tasks. Does your code use a polling timeout?");if(0===this._schedulerQueue.filter((function(e){return!e.isPeriodic&&!e.isRequestAnimationFrame})).length)break;var o=this._schedulerQueue.shift();if(n=this._currentTickTime,this._currentTickTime=o.endTime,r&&r(this._currentTickTime-n),!o.func.apply(t,o.args))break}return this._currentTickTime-i},i.nextNodeJSId=1,i.nextId=-1,i}(),o=function(){function n(e,r,i){void 0===r&&(r=!1),this._scheduler=new s,this._microtasks=[],this._lastError=null,this._uncaughtPromiseErrors=Promise[Zone.__symbol__("uncaughtPromiseErrors")],this.pendingPeriodicTimers=[],this.pendingTimers=[],this.patchDateLocked=!1,this.properties={FakeAsyncTestZoneSpec:this},this.trackPendingRequestAnimationFrame=r,this.macroTaskOptions=i,this.name="fakeAsyncTestZone for "+e,this.macroTaskOptions||(this.macroTaskOptions=t[Zone.__symbol__("FakeAsyncTestMacroTask")])}return n.assertInZone=function(){if(null==Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("The code should be running in the fakeAsync zone to call this function")},n.prototype._fnAndFlush=function(e,r){var i=this;return function(){for(var n=[],s=0;s<arguments.length;s++)n[s]=arguments[s];return e.apply(t,n),null===i._lastError?(null!=r.onSuccess&&r.onSuccess.apply(t),i.flushMicrotasks()):null!=r.onError&&r.onError.apply(t),null===i._lastError}},n._removeTimer=function(e,t){var r=e.indexOf(t);r>-1&&e.splice(r,1)},n.prototype._dequeueTimer=function(e){var t=this;return function(){n._removeTimer(t.pendingTimers,e)}},n.prototype._requeuePeriodicTimer=function(e,t,r,i){var n=this;return function(){-1!==n.pendingPeriodicTimers.indexOf(i)&&n._scheduler.scheduleFunction(e,t,{args:r,isPeriodic:!0,id:i,isRequeuePeriodic:!0})}},n.prototype._dequeuePeriodicTimer=function(e){var t=this;return function(){n._removeTimer(t.pendingPeriodicTimers,e)}},n.prototype._setTimeout=function(e,t,r,i){void 0===i&&(i=!0);var n=this._dequeueTimer(s.nextId),o=this._fnAndFlush(e,{onSuccess:n,onError:n}),a=this._scheduler.scheduleFunction(o,t,{args:r,isRequestAnimationFrame:!i});return i&&this.pendingTimers.push(a),a},n.prototype._clearTimeout=function(e){n._removeTimer(this.pendingTimers,e),this._scheduler.removeScheduledFunctionWithId(e)},n.prototype._setInterval=function(e,t,r){var i=s.nextId,n={onSuccess:null,onError:this._dequeuePeriodicTimer(i)},o=this._fnAndFlush(e,n);return n.onSuccess=this._requeuePeriodicTimer(o,t,r,i),this._scheduler.scheduleFunction(o,t,{args:r,isPeriodic:!0}),this.pendingPeriodicTimers.push(i),i},n.prototype._clearInterval=function(e){n._removeTimer(this.pendingPeriodicTimers,e),this._scheduler.removeScheduledFunctionWithId(e)},n.prototype._resetLastErrorAndThrow=function(){var e=this._lastError||this._uncaughtPromiseErrors[0];throw this._uncaughtPromiseErrors.length=0,this._lastError=null,e},n.prototype.getCurrentTickTime=function(){return this._scheduler.getCurrentTickTime()},n.prototype.getFakeSystemTime=function(){return this._scheduler.getFakeSystemTime()},n.prototype.setFakeBaseSystemTime=function(e){this._scheduler.setFakeBaseSystemTime(e)},n.prototype.getRealSystemTime=function(){return this._scheduler.getRealSystemTime()},n.patchDate=function(){t[Zone.__symbol__("disableDatePatching")]||t.Date!==i&&(t.Date=i,i.prototype=r.prototype,n.checkTimerPatch())},n.resetDate=function(){t.Date===i&&(t.Date=r)},n.checkTimerPatch=function(){if(!e)throw new Error("Expected timers to have been patched.");t.setTimeout!==e.setTimeout&&(t.setTimeout=e.setTimeout,t.clearTimeout=e.clearTimeout),t.setInterval!==e.setInterval&&(t.setInterval=e.setInterval,t.clearInterval=e.clearInterval)},n.prototype.lockDatePatch=function(){this.patchDateLocked=!0,n.patchDate()},n.prototype.unlockDatePatch=function(){this.patchDateLocked=!1,n.resetDate()},n.prototype.tickToNext=function(e,t,r){void 0===e&&(e=1),void 0===r&&(r={processNewMacroTasksSynchronously:!0}),e<=0||(n.assertInZone(),this.flushMicrotasks(),this._scheduler.tickToNext(e,t,r),null!==this._lastError&&this._resetLastErrorAndThrow())},n.prototype.tick=function(e,t,r){void 0===e&&(e=0),void 0===r&&(r={processNewMacroTasksSynchronously:!0}),n.assertInZone(),this.flushMicrotasks(),this._scheduler.tick(e,t,r),null!==this._lastError&&this._resetLastErrorAndThrow()},n.prototype.flushMicrotasks=function(){var e=this;for(n.assertInZone();this._microtasks.length>0;){var t=this._microtasks.shift();t.func.apply(t.target,t.args)}(null!==e._lastError||e._uncaughtPromiseErrors.length)&&e._resetLastErrorAndThrow()},n.prototype.flush=function(e,t,r){n.assertInZone(),this.flushMicrotasks();var i=this._scheduler.flush(e,t,r);return null!==this._lastError&&this._resetLastErrorAndThrow(),i},n.prototype.flushOnlyPendingTimers=function(e){n.assertInZone(),this.flushMicrotasks();var t=this._scheduler.flushOnlyPendingTimers(e);return null!==this._lastError&&this._resetLastErrorAndThrow(),t},n.prototype.removeAllTimers=function(){n.assertInZone(),this._scheduler.removeAll(),this.pendingPeriodicTimers=[],this.pendingTimers=[]},n.prototype.getTimerCount=function(){return this._scheduler.getTimerCount()+this._microtasks.length},n.prototype.onScheduleTask=function(e,t,r,i){switch(i.type){case"microTask":var n=i.data&&i.data.args,s=void 0;if(n){var o=i.data.cbIdx;"number"==typeof n.length&&n.length>o+1&&(s=Array.prototype.slice.call(n,o+1))}this._microtasks.push({func:i.invoke,args:s,target:i.data&&i.data.target});break;case"macroTask":switch(i.source){case"setTimeout":i.data.handleId=this._setTimeout(i.invoke,i.data.delay,Array.prototype.slice.call(i.data.args,2));break;case"setImmediate":i.data.handleId=this._setTimeout(i.invoke,0,Array.prototype.slice.call(i.data.args,1));break;case"setInterval":i.data.handleId=this._setInterval(i.invoke,i.data.delay,Array.prototype.slice.call(i.data.args,2));break;case"XMLHttpRequest.send":throw new Error("Cannot make XHRs from within a fake async test. Request URL: "+i.data.url);case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":i.data.handleId=this._setTimeout(i.invoke,16,i.data.args,this.trackPendingRequestAnimationFrame);break;default:var a=this.findMacroTaskOption(i);if(a){var c=i.data&&i.data.args,u=c&&c.length>1?c[1]:0,h=a.callbackArgs?a.callbackArgs:c;a.isPeriodic?(i.data.handleId=this._setInterval(i.invoke,u,h),i.data.isPeriodic=!0):i.data.handleId=this._setTimeout(i.invoke,u,h);break}throw new Error("Unknown macroTask scheduled in fake async test: "+i.source)}break;case"eventTask":i=e.scheduleTask(r,i)}return i},n.prototype.onCancelTask=function(e,t,r,i){switch(i.source){case"setTimeout":case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":return this._clearTimeout(i.data.handleId);case"setInterval":return this._clearInterval(i.data.handleId);default:var n=this.findMacroTaskOption(i);if(n){var s=i.data.handleId;return n.isPeriodic?this._clearInterval(s):this._clearTimeout(s)}return e.cancelTask(r,i)}},n.prototype.onInvoke=function(e,t,r,i,s,o,a){try{return n.patchDate(),e.invoke(r,i,s,o,a)}finally{this.patchDateLocked||n.resetDate()}},n.prototype.findMacroTaskOption=function(e){if(!this.macroTaskOptions)return null;for(var t=0;t<this.macroTaskOptions.length;t++){var r=this.macroTaskOptions[t];if(r.source===e.source)return r}return null},n.prototype.onHandleError=function(e,t,r,i){return this._lastError=i,!1},n}(),a=null;function c(){return Zone&&Zone.ProxyZoneSpec}var u=null;function h(){var e,t;a&&a.unlockDatePatch(),a=null,null===(t=null===(e=c())||void 0===e?void 0:e.get())||void 0===t||t.resetDelegate(),null==u||u.resetDelegate()}function l(e,t){void 0===t&&(t={});var r=t.flush,i=void 0===r||r,n=function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var n=c();if(!n)throw new Error("ProxyZoneSpec is needed for the fakeAsync() test helper but could not be found. Make sure that your environment includes zone-testing.js");var s=n.assertPresent();if(Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("fakeAsync() calls can not be nested");try{if(!a){var o=Zone&&Zone.FakeAsyncTestZoneSpec;if(s.getDelegate()instanceof o)throw new Error("fakeAsync() calls can not be nested");a=new o}var u=void 0,l=s.getDelegate();s.setDelegate(a),a.lockDatePatch();try{u=e.apply(this,t),i?a.flush(20,!0):_()}finally{s.setDelegate(l)}if(!i){if(a.pendingPeriodicTimers.length>0)throw new Error("".concat(a.pendingPeriodicTimers.length," ")+"periodic timer(s) still in the queue.");if(a.pendingTimers.length>0)throw new Error("".concat(a.pendingTimers.length," timer(s) still in the queue."))}return u}finally{h()}};return n.isFakeAsync=!0,n}function d(){if(null==a&&null==(a=Zone.current.get("FakeAsyncTestZoneSpec")))throw new Error("The code should be running in the fakeAsync zone to call this function");return a}function m(e,t){void 0===e&&(e=0),void 0===t&&(t=!1),d().tick(e,null,t)}function f(e){return d().flush(e)}function p(){d().pendingPeriodicTimers.length=0}function T(e){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var i=c();if(void 0===i)throw new Error("ProxyZoneSpec is needed for the withProxyZone() test helper but could not be found. Make sure that your environment includes zone-testing.js");return(void 0!==i.get()?Zone.current:function n(){var e=c();if(void 0===e)throw new Error("ProxyZoneSpec is needed for withProxyZone but could not be found. Make sure that your environment includes zone-testing.js");return null===u&&(u=new e),Zone.root.fork(u)}()).run(e,this,t)}}function _(){d().flushMicrotasks()}!function y(r){r.FakeAsyncTestZoneSpec=o,r.__load_patch("fakeasync",(function(e,t,r){t[r.symbol("fakeAsyncTest")]={resetFakeAsyncZone:h,flushMicrotasks:_,discardPeriodicTasks:p,tick:m,flush:f,fakeAsync:l,withProxyZone:T}}),!0),e={setTimeout:t.setTimeout,setInterval:t.setInterval,clearTimeout:t.clearTimeout,clearInterval:t.clearInterval,nativeSetTimeout:t[r.__symbol__("setTimeout")],nativeClearTimeout:t[r.__symbol__("clearTimeout")]},s.nextId=s.getNextId()}(Zone)}));ǯH8x   'use strict';
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
            ar[i] = from[i];
        }
    }
    return to.concat(ar || Array.prototype.slice.call(from));
};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchJasmine(Zone) {
        Zone.__load_patch('jasmine', function (global, Zone, api) {
            var __extends = function (d, b) {
                for (var p in b)
                    if (b.hasOwnProperty(p))
                        d[p] = b[p];
                function __() {
                    this.constructor = d;
                }
                d.prototype =
                    b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());
            };
            // Patch jasmine's describe/it/beforeEach/afterEach functions so test code always runs
            // in a testZone (ProxyZone). (See: angular/zone.js#91 & angular/angular#10503)
            if (!Zone)
                throw new Error('Missing: zone.js');
            if (typeof jest !== 'undefined') {
                // return if jasmine is a light implementation inside jest
                // in this case, we are running inside jest not jasmine
                return;
            }
            if (typeof jasmine == 'undefined' || jasmine['__zone_patch__']) {
                return;
            }
            jasmine['__zone_patch__'] = true;
            var SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
            var ProxyZoneSpec = Zone['ProxyZoneSpec'];
            if (!SyncTestZoneSpec)
                throw new Error('Missing: SyncTestZoneSpec');
            if (!ProxyZoneSpec)
                throw new Error('Missing: ProxyZoneSpec');
            var ambientZone = Zone.current;
            var symbol = Zone.__symbol__;
            // whether patch jasmine clock when in fakeAsync
            var disablePatchingJasmineClock = global[symbol('fakeAsyncDisablePatchingClock')] === true;
            // the original variable name fakeAsyncPatchLock is not accurate, so the name will be
            // fakeAsyncAutoFakeAsyncWhenClockPatched and if this enablePatchingJasmineClock is false, we
            // also automatically disable the auto jump into fakeAsync feature
            var enableAutoFakeAsyncWhenClockPatched = !disablePatchingJasmineClock &&
                (global[symbol('fakeAsyncPatchLock')] === true ||
                    global[symbol('fakeAsyncAutoFakeAsyncWhenClockPatched')] === true);
            var ignoreUnhandledRejection = global[symbol('ignoreUnhandledRejection')] === true;
            if (!ignoreUnhandledRejection) {
                var globalErrors_1 = jasmine.GlobalErrors;
                if (globalErrors_1 && !jasmine[symbol('GlobalErrors')]) {
                    jasmine[symbol('GlobalErrors')] = globalErrors_1;
                    jasmine.GlobalErrors = function () {
                        var instance = new globalErrors_1();
                        var originalInstall = instance.install;
                        if (originalInstall && !instance[symbol('install')]) {
                            instance[symbol('install')] = originalInstall;
                            instance.install = function () {
                                var isNode = typeof process !== 'undefined' && !!process.on;
                                // Note: Jasmine checks internally if `process` and `process.on` is defined.
                                // Otherwise, it installs the browser rejection handler through the
                                // `global.addEventListener`. This code may be run in the browser environment where
                                // `process` is not defined, and this will lead to a runtime exception since webpack 5
                                // removed automatic Node.js polyfills. Note, that events are named differently, it's
                                // `unhandledRejection` in Node.js and `unhandledrejection` in the browser.
                                var originalHandlers = isNode
                                    ? process.listeners('unhandledRejection')
                                    : global.eventListeners('unhandledrejection');
                                var result = originalInstall.apply(this, arguments);
                                isNode
                                    ? process.removeAllListeners('unhandledRejection')
                                    : global.removeAllListeners('unhandledrejection');
                                if (originalHandlers) {
                                    originalHandlers.forEach(function (handler) {
                                        if (isNode) {
                                            process.on('unhandledRejection', handler);
                                        }
                                        else {
                                            global.addEventListener('unhandledrejection', handler);
                                        }
                                    });
                                }
                                return result;
                            };
                        }
                        return instance;
                    };
                }
            }
            // Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
            var jasmineEnv = jasmine.getEnv();
            ['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
                var originalJasmineFn = jasmineEnv[methodName];
                jasmineEnv[methodName] = function (description, specDefinitions) {
                    return originalJasmineFn.call(this, description, wrapDescribeInZone(description, specDefinitions));
                };
            });
            ['it', 'xit', 'fit'].forEach(function (methodName) {
                var originalJasmineFn = jasmineEnv[methodName];
                jasmineEnv[symbol(methodName)] = originalJasmineFn;
                jasmineEnv[methodName] = function (description, specDefinitions, timeout) {
                    arguments[1] = wrapTestInZone(specDefinitions);
                    return originalJasmineFn.apply(this, arguments);
                };
            });
            ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach(function (methodName) {
                var originalJasmineFn = jasmineEnv[methodName];
                jasmineEnv[symbol(methodName)] = originalJasmineFn;
                jasmineEnv[methodName] = function (specDefinitions, timeout) {
                    arguments[0] = wrapTestInZone(specDefinitions);
                    return originalJasmineFn.apply(this, arguments);
                };
            });
            if (!disablePatchingJasmineClock) {
                // need to patch jasmine.clock().mockDate and jasmine.clock().tick() so
                // they can work properly in FakeAsyncTest
                var originalClockFn_1 = (jasmine[symbol('clock')] = jasmine['clock']);
                jasmine['clock'] = function () {
                    var clock = originalClockFn_1.apply(this, arguments);
                    if (!clock[symbol('patched')]) {
                        clock[symbol('patched')] = symbol('patched');
                        var originalTick_1 = (clock[symbol('tick')] = clock.tick);
                        clock.tick = function () {
                            var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                            if (fakeAsyncZoneSpec) {
                                return fakeAsyncZoneSpec.tick.apply(fakeAsyncZoneSpec, arguments);
                            }
                            return originalTick_1.apply(this, arguments);
                        };
                        var originalMockDate_1 = (clock[symbol('mockDate')] = clock.mockDate);
                        clock.mockDate = function () {
                            var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                            if (fakeAsyncZoneSpec) {
                                var dateTime = arguments.length > 0 ? arguments[0] : new Date();
                                return fakeAsyncZoneSpec.setFakeBaseSystemTime.apply(fakeAsyncZoneSpec, dateTime && typeof dateTime.getTime === 'function'
                                    ? [dateTime.getTime()]
                                    : arguments);
                            }
                            return originalMockDate_1.apply(this, arguments);
                        };
                        // for auto go into fakeAsync feature, we need the flag to enable it
                        if (enableAutoFakeAsyncWhenClockPatched) {
                            ['install', 'uninstall'].forEach(function (methodName) {
                                var originalClockFn = (clock[symbol(methodName)] = clock[methodName]);
                                clock[methodName] = function () {
                                    var FakeAsyncTestZoneSpec = Zone['FakeAsyncTestZoneSpec'];
                                    if (FakeAsyncTestZoneSpec) {
                                        jasmine[symbol('clockInstalled')] = 'install' === methodName;
                                        return;
                                    }
                                    return originalClockFn.apply(this, arguments);
                                };
                            });
                        }
                    }
                    return clock;
                };
            }
            // monkey patch createSpyObj to make properties enumerable to true
            if (!jasmine[Zone.__symbol__('createSpyObj')]) {
                var originalCreateSpyObj_1 = jasmine.createSpyObj;
                jasmine[Zone.__symbol__('createSpyObj')] = originalCreateSpyObj_1;
                jasmine.createSpyObj = function () {
                    var args = Array.prototype.slice.call(arguments);
                    var propertyNames = args.length >= 3 ? args[2] : null;
                    var spyObj;
                    if (propertyNames) {
                        var defineProperty_1 = Object.defineProperty;
                        Object.defineProperty = function (obj, p, attributes) {
                            return defineProperty_1.call(this, obj, p, __assign(__assign({}, attributes), { configurable: true, enumerable: true }));
                        };
                        try {
                            spyObj = originalCreateSpyObj_1.apply(this, args);
                        }
                        finally {
                            Object.defineProperty = defineProperty_1;
                        }
                    }
                    else {
                        spyObj = originalCreateSpyObj_1.apply(this, args);
                    }
                    return spyObj;
                };
            }
            /**
             * Gets a function wrapping the body of a Jasmine `describe` block to execute in a
             * synchronous-only zone.
             */
            function wrapDescribeInZone(description, describeBody) {
                return function () {
                    // Create a synchronous-only zone in which to run `describe` blocks in order to raise an
                    // error if any asynchronous operations are attempted inside of a `describe`.
                    var syncZone = ambientZone.fork(new SyncTestZoneSpec("jasmine.describe#".concat(description)));
                    return syncZone.run(describeBody, this, arguments);
                };
            }
            function runInTestZone(testBody, applyThis, queueRunner, done) {
                var isClockInstalled = !!jasmine[symbol('clockInstalled')];
                queueRunner.testProxyZoneSpec;
                var testProxyZone = queueRunner.testProxyZone;
                if (isClockInstalled && enableAutoFakeAsyncWhenClockPatched) {
                    // auto run a fakeAsync
                    var fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
                    if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
                        testBody = fakeAsyncModule.fakeAsync(testBody);
                    }
                }
                if (done) {
                    return testProxyZone.run(testBody, applyThis, [done]);
                }
                else {
                    return testProxyZone.run(testBody, applyThis);
                }
            }
            /**
             * Gets a function wrapping the body of a Jasmine `it/beforeEach/afterEach` block to
             * execute in a ProxyZone zone.
             * This will run in `testProxyZone`. The `testProxyZone` will be reset by the `ZoneQueueRunner`
             */
            function wrapTestInZone(testBody) {
                // The `done` callback is only passed through if the function expects at least one argument.
                // Note we have to make a function with correct number of arguments, otherwise jasmine will
                // think that all functions are sync or async.
                return (testBody &&
                    (testBody.length
                        ? function (done) {
                            return runInTestZone(testBody, this, this.queueRunner, done);
                        }
                        : function () {
                            return runInTestZone(testBody, this, this.queueRunner);
                        }));
            }
            var QueueRunner = jasmine.QueueRunner;
            jasmine.QueueRunner = (function (_super) {
                __extends(ZoneQueueRunner, _super);
                function ZoneQueueRunner(attrs) {
                    var _this = this;
                    if (attrs.onComplete) {
                        attrs.onComplete = (function (fn) { return function () {
                            // All functions are done, clear the test zone.
                            _this.testProxyZone = null;
                            _this.testProxyZoneSpec = null;
                            ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
                        }; })(attrs.onComplete);
                    }
                    var nativeSetTimeout = global[Zone.__symbol__('setTimeout')];
                    var nativeClearTimeout = global[Zone.__symbol__('clearTimeout')];
                    if (nativeSetTimeout) {
                        // should run setTimeout inside jasmine outside of zone
                        attrs.timeout = {
                            setTimeout: nativeSetTimeout ? nativeSetTimeout : global.setTimeout,
                            clearTimeout: nativeClearTimeout ? nativeClearTimeout : global.clearTimeout,
                        };
                    }
                    // create a userContext to hold the queueRunner itself
                    // so we can access the testProxy in it/xit/beforeEach ...
                    if (jasmine.UserContext) {
                        if (!attrs.userContext) {
                            attrs.userContext = new jasmine.UserContext();
                        }
                        attrs.userContext.queueRunner = this;
                    }
                    else {
                        if (!attrs.userContext) {
                            attrs.userContext = {};
                        }
                        attrs.userContext.queueRunner = this;
                    }
                    // patch attrs.onException
                    var onException = attrs.onException;
                    attrs.onException = function (error) {
                        if (error &&
                            error.message ===
                                'Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.') {
                            // jasmine timeout, we can make the error message more
                            // reasonable to tell what tasks are pending
                            var proxyZoneSpec = this && this.testProxyZoneSpec;
                            if (proxyZoneSpec) {
                                var pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
                                try {
                                    // try catch here in case error.message is not writable
                                    error.message += pendingTasksInfo;
                                }
                                catch (err) { }
                            }
                        }
                        if (onException) {
                            onException.call(this, error);
                        }
                    };
                    _super.call(this, attrs);
                }
                ZoneQueueRunner.prototype.execute = function () {
                    var _this = this;
                    var zone = Zone.current;
                    var isChildOfAmbientZone = false;
                    while (zone) {
                        if (zone === ambientZone) {
                            isChildOfAmbientZone = true;
                            break;
                        }
                        zone = zone.parent;
                    }
                    if (!isChildOfAmbientZone)
                        throw new Error('Unexpected Zone: ' + Zone.current.name);
                    // This is the zone which will be used for running individual tests.
                    // It will be a proxy zone, so that the tests function can retroactively install
                    // different zones.
                    // Example:
                    //   - In beforeEach() do childZone = Zone.current.fork(...);
                    //   - In it() try to do fakeAsync(). The issue is that because the beforeEach forked the
                    //     zone outside of fakeAsync it will be able to escape the fakeAsync rules.
                    //   - Because ProxyZone is parent fo `childZone` fakeAsync can retroactively add
                    //     fakeAsync behavior to the childZone.
                    this.testProxyZoneSpec = new ProxyZoneSpec();
                    this.testProxyZone = ambientZone.fork(this.testProxyZoneSpec);
                    if (!Zone.currentTask) {
                        // if we are not running in a task then if someone would register a
                        // element.addEventListener and then calling element.click() the
                        // addEventListener callback would think that it is the top most task and would
                        // drain the microtask queue on element.click() which would be incorrect.
                        // For this reason we always force a task when running jasmine tests.
                        Zone.current.scheduleMicroTask('jasmine.execute().forceTask', function () { return QueueRunner.prototype.execute.call(_this); });
                    }
                    else {
                        _super.prototype.execute.call(this);
                    }
                };
                return ZoneQueueRunner;
            })(QueueRunner);
        });
    }
    function patchJest(Zone) {
        Zone.__load_patch('jest', function (context, Zone, api) {
            if (typeof jest === 'undefined' || jest['__zone_patch__']) {
                return;
            }
            // From jest 29 and jest-preset-angular v13, the module transform logic
            // changed, and now jest-preset-angular use the use the tsconfig target
            // other than the hardcoded one, https://github.com/thymikee/jest-preset-angular/issues/2010
            // But jest-angular-preset doesn't introduce the @babel/plugin-transform-async-to-generator
            // which is needed by angular since `async/await` still need to be transformed
            // to promise for ES2017+ target.
            // So for now, we disable to output the uncaught error console log for a temp solution,
            // until jest-preset-angular find a proper solution.
            Zone[api.symbol('ignoreConsoleErrorUncaughtError')] = true;
            jest['__zone_patch__'] = true;
            var ProxyZoneSpec = Zone['ProxyZoneSpec'];
            var SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
            if (!ProxyZoneSpec) {
                throw new Error('Missing ProxyZoneSpec');
            }
            var rootZone = Zone.current;
            var syncZone = rootZone.fork(new SyncTestZoneSpec('jest.describe'));
            var proxyZoneSpec = new ProxyZoneSpec();
            var proxyZone = rootZone.fork(proxyZoneSpec);
            function wrapDescribeFactoryInZone(originalJestFn) {
                return function () {
                    var tableArgs = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        tableArgs[_i] = arguments[_i];
                    }
                    var originalDescribeFn = originalJestFn.apply(this, tableArgs);
                    return function () {
                        var args = [];
                        for (var _i = 0; _i < arguments.length; _i++) {
                            args[_i] = arguments[_i];
                        }
                        args[1] = wrapDescribeInZone(args[1]);
                        return originalDescribeFn.apply(this, args);
                    };
                };
            }
            function wrapTestFactoryInZone(originalJestFn) {
                return function () {
                    var tableArgs = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        tableArgs[_i] = arguments[_i];
                    }
                    return function () {
                        var args = [];
                        for (var _i = 0; _i < arguments.length; _i++) {
                            args[_i] = arguments[_i];
                        }
                        args[1] = wrapTestInZone(args[1]);
                        return originalJestFn.apply(this, tableArgs).apply(this, args);
                    };
                };
            }
            /**
             * Gets a function wrapping the body of a jest `describe` block to execute in a
             * synchronous-only zone.
             */
            function wrapDescribeInZone(describeBody) {
                return function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    return syncZone.run(describeBody, this, args);
                };
            }
            /**
             * Gets a function wrapping the body of a jest `it/beforeEach/afterEach` block to
             * execute in a ProxyZone zone.
             * This will run in the `proxyZone`.
             */
            function wrapTestInZone(testBody, isTestFunc) {
                if (isTestFunc === void 0) { isTestFunc = false; }
                if (typeof testBody !== 'function') {
                    return testBody;
                }
                var wrappedFunc = function () {
                    if (Zone[api.symbol('useFakeTimersCalled')] === true &&
                        testBody &&
                        !testBody.isFakeAsync) {
                        // jest.useFakeTimers is called, run into fakeAsyncTest automatically.
                        var fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
                        if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
                            testBody = fakeAsyncModule.fakeAsync(testBody);
                        }
                    }
                    proxyZoneSpec.isTestFunc = isTestFunc;
                    return proxyZone.run(testBody, null, arguments);
                };
                // Update the length of wrappedFunc to be the same as the length of the testBody
                // So jest core can handle whether the test function has `done()` or not correctly
                Object.defineProperty(wrappedFunc, 'length', {
                    configurable: true,
                    writable: true,
                    enumerable: false,
                });
                wrappedFunc.length = testBody.length;
                return wrappedFunc;
            }
            ['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
                var originalJestFn = context[methodName];
                if (context[Zone.__symbol__(methodName)]) {
                    return;
                }
                context[Zone.__symbol__(methodName)] = originalJestFn;
                context[methodName] = function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    args[1] = wrapDescribeInZone(args[1]);
                    return originalJestFn.apply(this, args);
                };
                context[methodName].each = wrapDescribeFactoryInZone(originalJestFn.each);
            });
            context.describe.only = context.fdescribe;
            context.describe.skip = context.xdescribe;
            ['it', 'xit', 'fit', 'test', 'xtest'].forEach(function (methodName) {
                var originalJestFn = context[methodName];
                if (context[Zone.__symbol__(methodName)]) {
                    return;
                }
                context[Zone.__symbol__(methodName)] = originalJestFn;
                context[methodName] = function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    args[1] = wrapTestInZone(args[1], true);
                    return originalJestFn.apply(this, args);
                };
                context[methodName].each = wrapTestFactoryInZone(originalJestFn.each);
                context[methodName].todo = originalJestFn.todo;
                context[methodName].failing = originalJestFn.failing;
            });
            context.it.only = context.fit;
            context.it.skip = context.xit;
            context.test.only = context.fit;
            context.test.skip = context.xit;
            ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach(function (methodName) {
                var originalJestFn = context[methodName];
                if (context[Zone.__symbol__(methodName)]) {
                    return;
                }
                context[Zone.__symbol__(methodName)] = originalJestFn;
                context[methodName] = function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    args[0] = wrapTestInZone(args[0]);
                    return originalJestFn.apply(this, args);
                };
            });
            Zone.patchJestObject = function patchJestObject(Timer, isModern) {
                if (isModern === void 0) { isModern = false; }
                // check whether currently the test is inside fakeAsync()
                function isPatchingFakeTimer() {
                    var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    return !!fakeAsyncZoneSpec;
                }
                // check whether the current function is inside `test/it` or other methods
                // such as `describe/beforeEach`
                function isInTestFunc() {
                    var proxyZoneSpec = Zone.current.get('ProxyZoneSpec');
                    return proxyZoneSpec && proxyZoneSpec.isTestFunc;
                }
                if (Timer[api.symbol('fakeTimers')]) {
                    return;
                }
                Timer[api.symbol('fakeTimers')] = true;
                // patch jest fakeTimer internal method to make sure no console.warn print out
                api.patchMethod(Timer, '_checkFakeTimers', function (delegate) {
                    return function (self, args) {
                        if (isPatchingFakeTimer()) {
                            return true;
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch useFakeTimers(), set useFakeTimersCalled flag, and make test auto run into fakeAsync
                api.patchMethod(Timer, 'useFakeTimers', function (delegate) {
                    return function (self, args) {
                        Zone[api.symbol('useFakeTimersCalled')] = true;
                        if (isModern || isInTestFunc()) {
                            return delegate.apply(self, args);
                        }
                        return self;
                    };
                });
                // patch useRealTimers(), unset useFakeTimers flag
                api.patchMethod(Timer, 'useRealTimers', function (delegate) {
                    return function (self, args) {
                        Zone[api.symbol('useFakeTimersCalled')] = false;
                        if (isModern || isInTestFunc()) {
                            return delegate.apply(self, args);
                        }
                        return self;
                    };
                });
                // patch setSystemTime(), call setCurrentRealTime() in the fakeAsyncTest
                api.patchMethod(Timer, 'setSystemTime', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec && isPatchingFakeTimer()) {
                            fakeAsyncZoneSpec.setFakeBaseSystemTime(args[0]);
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch getSystemTime(), call getCurrentRealTime() in the fakeAsyncTest
                api.patchMethod(Timer, 'getRealSystemTime', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec && isPatchingFakeTimer()) {
                            return fakeAsyncZoneSpec.getRealSystemTime();
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch runAllTicks(), run all microTasks inside fakeAsync
                api.patchMethod(Timer, 'runAllTicks', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            fakeAsyncZoneSpec.flushMicrotasks();
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch runAllTimers(), run all macroTasks inside fakeAsync
                api.patchMethod(Timer, 'runAllTimers', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            fakeAsyncZoneSpec.flush(100, true);
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch advanceTimersByTime(), call tick() in the fakeAsyncTest
                api.patchMethod(Timer, 'advanceTimersByTime', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            fakeAsyncZoneSpec.tick(args[0]);
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch runOnlyPendingTimers(), call flushOnlyPendingTimers() in the fakeAsyncTest
                api.patchMethod(Timer, 'runOnlyPendingTimers', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            fakeAsyncZoneSpec.flushOnlyPendingTimers();
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch advanceTimersToNextTimer(), call tickToNext() in the fakeAsyncTest
                api.patchMethod(Timer, 'advanceTimersToNextTimer', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            fakeAsyncZoneSpec.tickToNext(args[0]);
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch clearAllTimers(), call removeAllTimers() in the fakeAsyncTest
                api.patchMethod(Timer, 'clearAllTimers', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            fakeAsyncZoneSpec.removeAllTimers();
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
                // patch getTimerCount(), call getTimerCount() in the fakeAsyncTest
                api.patchMethod(Timer, 'getTimerCount', function (delegate) {
                    return function (self, args) {
                        var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            return fakeAsyncZoneSpec.getTimerCount();
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    };
                });
            };
        });
    }
    function patchMocha(Zone) {
        Zone.__load_patch('mocha', function (global, Zone) {
            var Mocha = global.Mocha;
            if (typeof Mocha === 'undefined') {
                // return if Mocha is not available, because now zone-testing
                // will load mocha patch with jasmine/jest patch
                return;
            }
            if (typeof Zone === 'undefined') {
                throw new Error('Missing Zone.js');
            }
            var ProxyZoneSpec = Zone['ProxyZoneSpec'];
            var SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
            if (!ProxyZoneSpec) {
                throw new Error('Missing ProxyZoneSpec');
            }
            if (Mocha['__zone_patch__']) {
                throw new Error('"Mocha" has already been patched with "Zone".');
            }
            Mocha['__zone_patch__'] = true;
            var rootZone = Zone.current;
            var syncZone = rootZone.fork(new SyncTestZoneSpec('Mocha.describe'));
            var testZone = null;
            var suiteZone = rootZone.fork(new ProxyZoneSpec());
            var mochaOriginal = {
                after: global.after,
                afterEach: global.afterEach,
                before: global.before,
                beforeEach: global.beforeEach,
                describe: global.describe,
                it: global.it,
            };
            function modifyArguments(args, syncTest, asyncTest) {
                var _loop_1 = function (i) {
                    var arg = args[i];
                    if (typeof arg === 'function') {
                        // The `done` callback is only passed through if the function expects at
                        // least one argument.
                        // Note we have to make a function with correct number of arguments,
                        // otherwise mocha will
                        // think that all functions are sync or async.
                        args[i] = arg.length === 0 ? syncTest(arg) : asyncTest(arg);
                        // Mocha uses toString to view the test body in the result list, make sure we return the
                        // correct function body
                        args[i].toString = function () {
                            return arg.toString();
                        };
                    }
                };
                for (var i = 0; i < args.length; i++) {
                    _loop_1(i);
                }
                return args;
            }
            function wrapDescribeInZone(args) {
                var syncTest = function (fn) {
                    return function () {
                        return syncZone.run(fn, this, arguments);
                    };
                };
                return modifyArguments(args, syncTest);
            }
            function wrapTestInZone(args) {
                var asyncTest = function (fn) {
                    return function (done) {
                        return testZone.run(fn, this, [done]);
                    };
                };
                var syncTest = function (fn) {
                    return function () {
                        return testZone.run(fn, this);
                    };
                };
                return modifyArguments(args, syncTest, asyncTest);
            }
            function wrapSuiteInZone(args) {
                var asyncTest = function (fn) {
                    return function (done) {
                        return suiteZone.run(fn, this, [done]);
                    };
                };
                var syncTest = function (fn) {
                    return function () {
                        return suiteZone.run(fn, this);
                    };
                };
                return modifyArguments(args, syncTest, asyncTest);
            }
            global.describe = global.suite = function () {
                return mochaOriginal.describe.apply(this, wrapDescribeInZone(arguments));
            };
            global.xdescribe =
                global.suite.skip =
                    global.describe.skip =
                        function () {
                            return mochaOriginal.describe.skip.apply(this, wrapDescribeInZone(arguments));
                        };
            global.describe.only = global.suite.only = function () {
                return mochaOriginal.describe.only.apply(this, wrapDescribeInZone(arguments));
            };
            global.it =
                global.specify =
                    global.test =
                        function () {
                            return mochaOriginal.it.apply(this, wrapTestInZone(arguments));
                        };
            global.xit =
                global.xspecify =
                    global.it.skip =
                        function () {
                            return mochaOriginal.it.skip.apply(this, wrapTestInZone(arguments));
                        };
            global.it.only = global.test.only = function () {
                return mochaOriginal.it.only.apply(this, wrapTestInZone(arguments));
            };
            global.after = global.suiteTeardown = function () {
                return mochaOriginal.after.apply(this, wrapSuiteInZone(arguments));
            };
            global.afterEach = global.teardown = function () {
                return mochaOriginal.afterEach.apply(this, wrapTestInZone(arguments));
            };
            global.before = global.suiteSetup = function () {
                return mochaOriginal.before.apply(this, wrapSuiteInZone(arguments));
            };
            global.beforeEach = global.setup = function () {
                return mochaOriginal.beforeEach.apply(this, wrapTestInZone(arguments));
            };
            (function (originalRunTest, originalRun) {
                Mocha.Runner.prototype.runTest = function (fn) {
                    var _this = this;
                    Zone.current.scheduleMicroTask('mocha.forceTask', function () {
                        originalRunTest.call(_this, fn);
                    });
                };
                Mocha.Runner.prototype.run = function (fn) {
                    this.on('test', function (e) {
                        testZone = rootZone.fork(new ProxyZoneSpec());
                    });
                    this.on('fail', function (test, err) {
                        var proxyZoneSpec = testZone && testZone.get('ProxyZoneSpec');
                        if (proxyZoneSpec && err) {
                            try {
                                // try catch here in case err.message is not writable
                                err.message += proxyZoneSpec.getAndClearPendingTasksInfo();
                            }
                            catch (error) { }
                        }
                    });
                    return originalRun.call(this, fn);
                };
            })(Mocha.Runner.prototype.runTest, Mocha.Runner.prototype.run);
        });
    }
    var global$2 = globalThis;
    // __Zone_symbol_prefix global can be used to override the default zone
    // symbol prefix with a custom one if needed.
    function __symbol__(name) {
        var symbolPrefix = global$2['__Zone_symbol_prefix'] || '__zone_symbol__';
        return symbolPrefix + name;
    }
    var __global = (typeof window !== 'undefined' && window) || (typeof self !== 'undefined' && self) || global;
    var AsyncTestZoneSpec = /** @class */ (function () {
        function AsyncTestZoneSpec(finishCallback, failCallback, namePrefix) {
            this._pendingMicroTasks = false;
            this._pendingMacroTasks = false;
            this._alreadyErrored = false;
            this._isSync = false;
            this._existingFinishTimer = null;
            this.entryFunction = null;
            this.runZone = Zone.current;
            this.unresolvedChainedPromiseCount = 0;
            this.supportWaitUnresolvedChainedPromise = false;
            this.finishCallback = finishCallback;
            this.failCallback = failCallback;
            this.name = 'asyncTestZone for ' + namePrefix;
            this.properties = { 'AsyncTestZoneSpec': this };
            this.supportWaitUnresolvedChainedPromise =
                __global[__symbol__('supportWaitUnResolvedChainedPromise')] === true;
        }
        Object.defineProperty(AsyncTestZoneSpec, "symbolParentUnresolved", {
            // Needs to be a getter and not a plain property in order run this just-in-time. Otherwise
            // `__symbol__` would be evaluated during top-level execution prior to the Zone prefix being
            // changed for tests.
            get: function () {
                return __symbol__('parentUnresolved');
            },
            enumerable: false,
            configurable: true
        });
        AsyncTestZoneSpec.prototype.isUnresolvedChainedPromisePending = function () {
            return this.unresolvedChainedPromiseCount > 0;
        };
        AsyncTestZoneSpec.prototype._finishCallbackIfDone = function () {
            var _this = this;
            // NOTE: Technically the `onHasTask` could fire together with the initial synchronous
            // completion in `onInvoke`. `onHasTask` might call this method when it captured e.g.
            // microtasks in the proxy zone that now complete as part of this async zone run.
            // Consider the following scenario:
            //    1. A test `beforeEach` schedules a microtask in the ProxyZone.
            //    2. An actual empty `it` spec executes in the AsyncTestZone` (using e.g. `waitForAsync`).
            //    3. The `onInvoke` invokes `_finishCallbackIfDone` because the spec runs synchronously.
            //    4. We wait the scheduled timeout (see below) to account for unhandled promises.
            //    5. The microtask from (1) finishes and `onHasTask` is invoked.
            //    --> We register a second `_finishCallbackIfDone` even though we have scheduled a timeout.
            // If the finish timeout from below is already scheduled, terminate the existing scheduled
            // finish invocation, avoiding calling `jasmine` `done` multiple times. *Note* that we would
            // want to schedule a new finish callback in case the task state changes again.
            if (this._existingFinishTimer !== null) {
                clearTimeout(this._existingFinishTimer);
                this._existingFinishTimer = null;
            }
            if (!(this._pendingMicroTasks ||
                this._pendingMacroTasks ||
                (this.supportWaitUnresolvedChainedPromise && this.isUnresolvedChainedPromisePending()))) {
                // We wait until the next tick because we would like to catch unhandled promises which could
                // cause test logic to be executed. In such cases we cannot finish with tasks pending then.
                this.runZone.run(function () {
                    _this._existingFinishTimer = setTimeout(function () {
                        if (!_this._alreadyErrored && !(_this._pendingMicroTasks || _this._pendingMacroTasks)) {
                            _this.finishCallback();
                        }
                    }, 0);
                });
            }
        };
        AsyncTestZoneSpec.prototype.patchPromiseForTest = function () {
            if (!this.supportWaitUnresolvedChainedPromise) {
                return;
            }
            var patchPromiseForTest = Promise[Zone.__symbol__('patchPromiseForTest')];
            if (patchPromiseForTest) {
                patchPromiseForTest();
            }
        };
        AsyncTestZoneSpec.prototype.unPatchPromiseForTest = function () {
            if (!this.supportWaitUnresolvedChainedPromise) {
                return;
            }
            var unPatchPromiseForTest = Promise[Zone.__symbol__('unPatchPromiseForTest')];
            if (unPatchPromiseForTest) {
                unPatchPromiseForTest();
            }
        };
        AsyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
            if (task.type !== 'eventTask') {
                this._isSync = false;
            }
            if (task.type === 'microTask' && task.data && task.data instanceof Promise) {
                // check whether the promise is a chained promise
                if (task.data[AsyncTestZoneSpec.symbolParentUnresolved] === true) {
                    // chained promise is being scheduled
                    this.unresolvedChainedPromiseCount--;
                }
            }
            return delegate.scheduleTask(target, task);
        };
        AsyncTestZoneSpec.prototype.onInvokeTask = function (delegate, current, target, task, applyThis, applyArgs) {
            if (task.type !== 'eventTask') {
                this._isSync = false;
            }
            return delegate.invokeTask(target, task, applyThis, applyArgs);
        };
        AsyncTestZoneSpec.prototype.onCancelTask = function (delegate, current, target, task) {
            if (task.type !== 'eventTask') {
                this._isSync = false;
            }
            return delegate.cancelTask(target, task);
        };
        // Note - we need to use onInvoke at the moment to call finish when a test is
        // fully synchronous. TODO(juliemr): remove this when the logic for
        // onHasTask changes and it calls whenever the task queues are dirty.
        // updated by(JiaLiPassion), only call finish callback when no task
        // was scheduled/invoked/canceled.
        AsyncTestZoneSpec.prototype.onInvoke = function (parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
            if (!this.entryFunction) {
                this.entryFunction = delegate;
            }
            try {
                this._isSync = true;
                return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
            }
            finally {
                // We need to check the delegate is the same as entryFunction or not.
                // Consider the following case.
                //
                // asyncTestZone.run(() => { // Here the delegate will be the entryFunction
                //   Zone.current.run(() => { // Here the delegate will not be the entryFunction
                //   });
                // });
                //
                // We only want to check whether there are async tasks scheduled
                // for the entry function.
                if (this._isSync && this.entryFunction === delegate) {
                    this._finishCallbackIfDone();
                }
            }
        };
        AsyncTestZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
            // Let the parent try to handle the error.
            var result = parentZoneDelegate.handleError(targetZone, error);
            if (result) {
                this.failCallback(error);
                this._alreadyErrored = true;
            }
            return false;
        };
        AsyncTestZoneSpec.prototype.onHasTask = function (delegate, current, target, hasTaskState) {
            delegate.hasTask(target, hasTaskState);
            // We should only trigger finishCallback when the target zone is the AsyncTestZone
            // Consider the following cases.
            //
            // const childZone = asyncTestZone.fork({
            //   name: 'child',
            //   onHasTask: ...
            // });
            //
            // So we have nested zones declared the onHasTask hook, in this case,
            // the onHasTask will be triggered twice, and cause the finishCallbackIfDone()
            // is also be invoked twice. So we need to only trigger the finishCallbackIfDone()
            // when the current zone is the same as the target zone.
            if (current !== target) {
                return;
            }
            if (hasTaskState.change == 'microTask') {
                this._pendingMicroTasks = hasTaskState.microTask;
                this._finishCallbackIfDone();
            }
            else if (hasTaskState.change == 'macroTask') {
                this._pendingMacroTasks = hasTaskState.macroTask;
                this._finishCallbackIfDone();
            }
        };
        return AsyncTestZoneSpec;
    }());
    function patchAsyncTest(Zone) {
        // Export the class so that new instances can be created with proper
        // constructor params.
        Zone['AsyncTestZoneSpec'] = AsyncTestZoneSpec;
        Zone.__load_patch('asynctest', function (global, Zone, api) {
            /**
             * Wraps a test function in an asynchronous test zone. The test will automatically
             * complete when all asynchronous calls within this zone are done.
             */
            Zone[api.symbol('asyncTest')] = function asyncTest(fn) {
                // If we're running using the Jasmine test framework, adapt to call the 'done'
                // function when asynchronous activity is finished.
                if (global.jasmine) {
                    // Not using an arrow function to preserve context passed from call site
                    return function (done) {
                        if (!done) {
                            // if we run beforeEach in @angular/core/testing/testing_internal then we get no done
                            // fake it here and assume sync.
                            done = function () { };
                            done.fail = function (e) {
                                throw e;
                            };
                        }
                        runInTestZone(fn, this, done, function (err) {
                            if (typeof err === 'string') {
                                return done.fail(new Error(err));
                            }
                            else {
                                done.fail(err);
                            }
                        });
                    };
                }
                // Otherwise, return a promise which will resolve when asynchronous activity
                // is finished. This will be correctly consumed by the Mocha framework with
                // it('...', async(myFn)); or can be used in a custom framework.
                // Not using an arrow function to preserve context passed from call site
                return function () {
                    var _this = this;
                    return new Promise(function (finishCallback, failCallback) {
                        runInTestZone(fn, _this, finishCallback, failCallback);
                    });
                };
            };
            function runInTestZone(fn, context, finishCallback, failCallback) {
                var currentZone = Zone.current;
                var AsyncTestZoneSpec = Zone['AsyncTestZoneSpec'];
                if (AsyncTestZoneSpec === undefined) {
                    throw new Error('AsyncTestZoneSpec is needed for the async() test helper but could not be found. ' +
                        'Please make sure that your environment includes zone.js/plugins/async-test');
                }
                var ProxyZoneSpec = Zone['ProxyZoneSpec'];
                if (!ProxyZoneSpec) {
                    throw new Error('ProxyZoneSpec is needed for the async() test helper but could not be found. ' +
                        'Please make sure that your environment includes zone.js/plugins/proxy');
                }
                var proxyZoneSpec = ProxyZoneSpec.get();
                ProxyZoneSpec.assertPresent();
                // We need to create the AsyncTestZoneSpec outside the ProxyZone.
                // If we do it in ProxyZone then we will get to infinite recursion.
                var proxyZone = Zone.current.getZoneWith('ProxyZoneSpec');
                var previousDelegate = proxyZoneSpec.getDelegate();
                proxyZone.parent.run(function () {
                    var testZoneSpec = new AsyncTestZoneSpec(function () {
                        // Need to restore the original zone.
                        if (proxyZoneSpec.getDelegate() == testZoneSpec) {
                            // Only reset the zone spec if it's
                            // still this one. Otherwise, assume
                            // it's OK.
                            proxyZoneSpec.setDelegate(previousDelegate);
                        }
                        testZoneSpec.unPatchPromiseForTest();
                        currentZone.run(function () {
                            finishCallback();
                        });
                    }, function (error) {
                        // Need to restore the original zone.
                        if (proxyZoneSpec.getDelegate() == testZoneSpec) {
                            // Only reset the zone spec if it's sill this one. Otherwise, assume it's OK.
                            proxyZoneSpec.setDelegate(previousDelegate);
                        }
                        testZoneSpec.unPatchPromiseForTest();
                        currentZone.run(function () {
                            failCallback(error);
                        });
                    }, 'test');
                    proxyZoneSpec.setDelegate(testZoneSpec);
                    testZoneSpec.patchPromiseForTest();
                });
                return Zone.current.runGuarded(fn, context);
            }
        });
    }
    var global$1 = (typeof window === 'object' && window) || (typeof self === 'object' && self) || globalThis.global;
    var OriginalDate = global$1.Date;
    // Since when we compile this file to `es2015`, and if we define
    // this `FakeDate` as `class FakeDate`, and then set `FakeDate.prototype`
    // there will be an error which is `Cannot assign to read only property 'prototype'`
    // so we need to use function implementation here.
    function FakeDate() {
        if (arguments.length === 0) {
            var d = new OriginalDate();
            d.setTime(FakeDate.now());
            return d;
        }
        else {
            var args = Array.prototype.slice.call(arguments);
            return new (OriginalDate.bind.apply(OriginalDate, __spreadArray([void 0], args, false)))();
        }
    }
    FakeDate.now = function () {
        var fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
        if (fakeAsyncTestZoneSpec) {
            return fakeAsyncTestZoneSpec.getFakeSystemTime();
        }
        return OriginalDate.now.apply(this, arguments);
    };
    FakeDate.UTC = OriginalDate.UTC;
    FakeDate.parse = OriginalDate.parse;
    // keep a reference for zone patched timer function
    var patchedTimers;
    var timeoutCallback = function () { };
    var Scheduler = /** @class */ (function () {
        function Scheduler() {
            // Scheduler queue with the tuple of end time and callback function - sorted by end time.
            this._schedulerQueue = [];
            // Current simulated time in millis.
            this._currentTickTime = 0;
            // Current fake system base time in millis.
            this._currentFakeBaseSystemTime = OriginalDate.now();
            // track requeuePeriodicTimer
            this._currentTickRequeuePeriodicEntries = [];
        }
        Scheduler.getNextId = function () {
            var id = patchedTimers.nativeSetTimeout.call(global$1, timeoutCallback, 0);
            patchedTimers.nativeClearTimeout.call(global$1, id);
            if (typeof id === 'number') {
                return id;
            }
            // in NodeJS, we just use a number for fakeAsync, since it will not
            // conflict with native TimeoutId
            return Scheduler.nextNodeJSId++;
        };
        Scheduler.prototype.getCurrentTickTime = function () {
            return this._currentTickTime;
        };
        Scheduler.prototype.getFakeSystemTime = function () {
            return this._currentFakeBaseSystemTime + this._currentTickTime;
        };
        Scheduler.prototype.setFakeBaseSystemTime = function (fakeBaseSystemTime) {
            this._currentFakeBaseSystemTime = fakeBaseSystemTime;
        };
        Scheduler.prototype.getRealSystemTime = function () {
            return OriginalDate.now();
        };
        Scheduler.prototype.scheduleFunction = function (cb, delay, options) {
            options = __assign({
                args: [],
                isPeriodic: false,
                isRequestAnimationFrame: false,
                id: -1,
                isRequeuePeriodic: false,
            }, options);
            var currentId = options.id < 0 ? Scheduler.nextId : options.id;
            Scheduler.nextId = Scheduler.getNextId();
            var endTime = this._currentTickTime + delay;
            // Insert so that scheduler queue remains sorted by end time.
            var newEntry = {
                endTime: endTime,
                id: currentId,
                func: cb,
                args: options.args,
                delay: delay,
                isPeriodic: options.isPeriodic,
                isRequestAnimationFrame: options.isRequestAnimationFrame,
            };
            if (options.isRequeuePeriodic) {
                this._currentTickRequeuePeriodicEntries.push(newEntry);
            }
            var i = 0;
            for (; i < this._schedulerQueue.length; i++) {
                var currentEntry = this._schedulerQueue[i];
                if (newEntry.endTime < currentEntry.endTime) {
                    break;
                }
            }
            this._schedulerQueue.splice(i, 0, newEntry);
            return currentId;
        };
        Scheduler.prototype.removeScheduledFunctionWithId = function (id) {
            for (var i = 0; i < this._schedulerQueue.length; i++) {
                if (this._schedulerQueue[i].id == id) {
                    this._schedulerQueue.splice(i, 1);
                    break;
                }
            }
        };
        Scheduler.prototype.removeAll = function () {
            this._schedulerQueue = [];
        };
        Scheduler.prototype.getTimerCount = function () {
            return this._schedulerQueue.length;
        };
        Scheduler.prototype.tickToNext = function (step, doTick, tickOptions) {
            if (step === void 0) { step = 1; }
            if (this._schedulerQueue.length < step) {
                return;
            }
            // Find the last task currently queued in the scheduler queue and tick
            // till that time.
            var startTime = this._currentTickTime;
            var targetTask = this._schedulerQueue[step - 1];
            this.tick(targetTask.endTime - startTime, doTick, tickOptions);
        };
        Scheduler.prototype.tick = function (millis, doTick, tickOptions) {
            if (millis === void 0) { millis = 0; }
            var finalTime = this._currentTickTime + millis;
            var lastCurrentTime = 0;
            tickOptions = Object.assign({ processNewMacroTasksSynchronously: true }, tickOptions);
            // we need to copy the schedulerQueue so nested timeout
            // will not be wrongly called in the current tick
            // https://github.com/angular/angular/issues/33799
            var schedulerQueue = tickOptions.processNewMacroTasksSynchronously
                ? this._schedulerQueue
                : this._schedulerQueue.slice();
            if (schedulerQueue.length === 0 && doTick) {
                doTick(millis);
                return;
            }
            while (schedulerQueue.length > 0) {
                // clear requeueEntries before each loop
                this._currentTickRequeuePeriodicEntries = [];
                var current = schedulerQueue[0];
                if (finalTime < current.endTime) {
                    // Done processing the queue since it's sorted by endTime.
                    break;
                }
                else {
                    // Time to run scheduled function. Remove it from the head of queue.
                    var current_1 = schedulerQueue.shift();
                    if (!tickOptions.processNewMacroTasksSynchronously) {
                        var idx = this._schedulerQueue.indexOf(current_1);
                        if (idx >= 0) {
                            this._schedulerQueue.splice(idx, 1);
                        }
                    }
                    lastCurrentTime = this._currentTickTime;
                    this._currentTickTime = current_1.endTime;
                    if (doTick) {
                        doTick(this._currentTickTime - lastCurrentTime);
                    }
                    var retval = current_1.func.apply(global$1, current_1.isRequestAnimationFrame ? [this._currentTickTime] : current_1.args);
                    if (!retval) {
                        // Uncaught exception in the current scheduled function. Stop processing the queue.
                        break;
                    }
                    // check is there any requeue periodic entry is added in
                    // current loop, if there is, we need to add to current loop
                    if (!tickOptions.processNewMacroTasksSynchronously) {
                  }ǂ8      this._currentTickRequeuePeriodicEntries.forEach(function (newEntry) {
                            var i = 0;
                            for (; i < schedulerQueue.length; i++) {
                                var currentEntry = schedulerQueue[i];
                                if (newEntry.endTime < currentEntry.endTime) {
                                    break;
                                }
                            }
                            schedulerQueue.splice(i, 0, newEntry);
                        });
                    }
                }
            }
            lastCurrentTime = this._currentTickTime;
            this._currentTickTime = finalTime;
            if (doTick) {
                doTick(this._currentTickTime - lastCurrentTime);
            }
        };
        Scheduler.prototype.flushOnlyPendingTimers = function (doTick) {
            if (this._schedulerQueue.length === 0) {
                return 0;
            }
            // Find the last task currently queued in the scheduler queue and tick
            // till that time.
            var startTime = this._currentTickTime;
            var lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
            this.tick(lastTask.endTime - startTime, doTick, { processNewMacroTasksSynchronously: false });
            return this._currentTickTime - startTime;
        };
        Scheduler.prototype.flush = function (limit, flushPeriodic, doTick) {
            if (limit === void 0) { limit = 20; }
            if (flushPeriodic === void 0) { flushPeriodic = false; }
            if (flushPeriodic) {
                return this.flushPeriodic(doTick);
            }
            else {
                return this.flushNonPeriodic(limit, doTick);
            }
        };
        Scheduler.prototype.flushPeriodic = function (doTick) {
            if (this._schedulerQueue.length === 0) {
                return 0;
            }
            // Find the last task currently queued in the scheduler queue and tick
            // till that time.
            var startTime = this._currentTickTime;
            var lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
            this.tick(lastTask.endTime - startTime, doTick);
            return this._currentTickTime - startTime;
        };
        Scheduler.prototype.flushNonPeriodic = function (limit, doTick) {
            var startTime = this._currentTickTime;
            var lastCurrentTime = 0;
            var count = 0;
            while (this._schedulerQueue.length > 0) {
                count++;
                if (count > limit) {
                    throw new Error('flush failed after reaching the limit of ' +
                        limit +
                        ' tasks. Does your code use a polling timeout?');
                }
                // flush only non-periodic timers.
                // If the only remaining tasks are periodic(or requestAnimationFrame), finish flushing.
                if (this._schedulerQueue.filter(function (task) { return !task.isPeriodic && !task.isRequestAnimationFrame; })
                    .length === 0) {
                    break;
                }
                var current = this._schedulerQueue.shift();
                lastCurrentTime = this._currentTickTime;
                this._currentTickTime = current.endTime;
                if (doTick) {
                    // Update any secondary schedulers like Jasmine mock Date.
                    doTick(this._currentTickTime - lastCurrentTime);
                }
                var retval = current.func.apply(global$1, current.args);
                if (!retval) {
                    // Uncaught exception in the current scheduled function. Stop processing the queue.
                    break;
                }
            }
            return this._currentTickTime - startTime;
        };
        // Next scheduler id.
        Scheduler.nextNodeJSId = 1;
        Scheduler.nextId = -1;
        return Scheduler;
    }());
    var FakeAsyncTestZoneSpec = /** @class */ (function () {
        function FakeAsyncTestZoneSpec(namePrefix, trackPendingRequestAnimationFrame, macroTaskOptions) {
            if (trackPendingRequestAnimationFrame === void 0) { trackPendingRequestAnimationFrame = false; }
            this._scheduler = new Scheduler();
            this._microtasks = [];
            this._lastError = null;
            this._uncaughtPromiseErrors = Promise[Zone.__symbol__('uncaughtPromiseErrors')];
            this.pendingPeriodicTimers = [];
            this.pendingTimers = [];
            this.patchDateLocked = false;
            this.properties = { 'FakeAsyncTestZoneSpec': this };
            this.trackPendingRequestAnimationFrame = trackPendingRequestAnimationFrame;
            this.macroTaskOptions = macroTaskOptions;
            this.name = 'fakeAsyncTestZone for ' + namePrefix;
            // in case user can't access the construction of FakeAsyncTestSpec
            // user can also define macroTaskOptions by define a global variable.
            if (!this.macroTaskOptions) {
                this.macroTaskOptions = global$1[Zone.__symbol__('FakeAsyncTestMacroTask')];
            }
        }
        FakeAsyncTestZoneSpec.assertInZone = function () {
            if (Zone.current.get('FakeAsyncTestZoneSpec') == null) {
                throw new Error('The code should be running in the fakeAsync zone to call this function');
            }
        };
        FakeAsyncTestZoneSpec.prototype._fnAndFlush = function (fn, completers) {
            var _this = this;
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                fn.apply(global$1, args);
                if (_this._lastError === null) {
                    // Success
                    if (completers.onSuccess != null) {
                        completers.onSuccess.apply(global$1);
                    }
                    // Flush microtasks only on success.
                    _this.flushMicrotasks();
                }
                else {
                    // Failure
                    if (completers.onError != null) {
                        completers.onError.apply(global$1);
                    }
                }
                // Return true if there were no errors, false otherwise.
                return _this._lastError === null;
            };
        };
        FakeAsyncTestZoneSpec._removeTimer = function (timers, id) {
            var index = timers.indexOf(id);
            if (index > -1) {
                timers.splice(index, 1);
            }
        };
        FakeAsyncTestZoneSpec.prototype._dequeueTimer = function (id) {
            var _this = this;
            return function () {
                FakeAsyncTestZoneSpec._removeTimer(_this.pendingTimers, id);
            };
        };
        FakeAsyncTestZoneSpec.prototype._requeuePeriodicTimer = function (fn, interval, args, id) {
            var _this = this;
            return function () {
                // Requeue the timer callback if it's not been canceled.
                if (_this.pendingPeriodicTimers.indexOf(id) !== -1) {
                    _this._scheduler.scheduleFunction(fn, interval, {
                        args: args,
                        isPeriodic: true,
                        id: id,
                        isRequeuePeriodic: true,
                    });
                }
            };
        };
        FakeAsyncTestZoneSpec.prototype._dequeuePeriodicTimer = function (id) {
            var _this = this;
            return function () {
                FakeAsyncTestZoneSpec._removeTimer(_this.pendingPeriodicTimers, id);
            };
        };
        FakeAsyncTestZoneSpec.prototype._setTimeout = function (fn, delay, args, isTimer) {
            if (isTimer === void 0) { isTimer = true; }
            var removeTimerFn = this._dequeueTimer(Scheduler.nextId);
            // Queue the callback and dequeue the timer on success and error.
            var cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
            var id = this._scheduler.scheduleFunction(cb, delay, { args: args, isRequestAnimationFrame: !isTimer });
            if (isTimer) {
                this.pendingTimers.push(id);
            }
            return id;
        };
        FakeAsyncTestZoneSpec.prototype._clearTimeout = function (id) {
            FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
            this._scheduler.removeScheduledFunctionWithId(id);
        };
        FakeAsyncTestZoneSpec.prototype._setInterval = function (fn, interval, args) {
            var id = Scheduler.nextId;
            var completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
            var cb = this._fnAndFlush(fn, completers);
            // Use the callback created above to requeue on success.
            completers.onSuccess = this._requeuePeriodicTimer(cb, interval, args, id);
            // Queue the callback and dequeue the periodic timer only on error.
            this._scheduler.scheduleFunction(cb, interval, { args: args, isPeriodic: true });
            this.pendingPeriodicTimers.push(id);
            return id;
        };
        FakeAsyncTestZoneSpec.prototype._clearInterval = function (id) {
            FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
            this._scheduler.removeScheduledFunctionWithId(id);
        };
        FakeAsyncTestZoneSpec.prototype._resetLastErrorAndThrow = function () {
            var error = this._lastError || this._uncaughtPromiseErrors[0];
            this._uncaughtPromiseErrors.length = 0;
            this._lastError = null;
            throw error;
        };
        FakeAsyncTestZoneSpec.prototype.getCurrentTickTime = function () {
            return this._scheduler.getCurrentTickTime();
        };
        FakeAsyncTestZoneSpec.prototype.getFakeSystemTime = function () {
            return this._scheduler.getFakeSystemTime();
        };
        FakeAsyncTestZoneSpec.prototype.setFakeBaseSystemTime = function (realTime) {
            this._scheduler.setFakeBaseSystemTime(realTime);
        };
        FakeAsyncTestZoneSpec.prototype.getRealSystemTime = function () {
            return this._scheduler.getRealSystemTime();
        };
        FakeAsyncTestZoneSpec.patchDate = function () {
            if (!!global$1[Zone.__symbol__('disableDatePatching')]) {
                // we don't want to patch global Date
                // because in some case, global Date
                // is already being patched, we need to provide
                // an option to let user still use their
                // own version of Date.
                return;
            }
            if (global$1['Date'] === FakeDate) {
                // already patched
                return;
            }
            global$1['Date'] = FakeDate;
            FakeDate.prototype = OriginalDate.prototype;
            // try check and reset timers
            // because jasmine.clock().install() may
            // have replaced the global timer
            FakeAsyncTestZoneSpec.checkTimerPatch();
        };
        FakeAsyncTestZoneSpec.resetDate = function () {
            if (global$1['Date'] === FakeDate) {
                global$1['Date'] = OriginalDate;
            }
        };
        FakeAsyncTestZoneSpec.checkTimerPatch = function () {
            if (!patchedTimers) {
                throw new Error('Expected timers to have been patched.');
            }
            if (global$1.setTimeout !== patchedTimers.setTimeout) {
                global$1.setTimeout = patchedTimers.setTimeout;
                global$1.clearTimeout = patchedTimers.clearTimeout;
            }
            if (global$1.setInterval !== patchedTimers.setInterval) {
                global$1.setInterval = patchedTimers.setInterval;
                global$1.clearInterval = patchedTimers.clearInterval;
            }
        };
        FakeAsyncTestZoneSpec.prototype.lockDatePatch = function () {
            this.patchDateLocked = true;
            FakeAsyncTestZoneSpec.patchDate();
        };
        FakeAsyncTestZoneSpec.prototype.unlockDatePatch = function () {
            this.patchDateLocked = false;
            FakeAsyncTestZoneSpec.resetDate();
        };
        FakeAsyncTestZoneSpec.prototype.tickToNext = function (steps, doTick, tickOptions) {
            if (steps === void 0) { steps = 1; }
            if (tickOptions === void 0) { tickOptions = { processNewMacroTasksSynchronously: true }; }
            if (steps <= 0) {
                return;
            }
            FakeAsyncTestZoneSpec.assertInZone();
            this.flushMicrotasks();
            this._scheduler.tickToNext(steps, doTick, tickOptions);
            if (this._lastError !== null) {
                this._resetLastErrorAndThrow();
            }
        };
        FakeAsyncTestZoneSpec.prototype.tick = function (millis, doTick, tickOptions) {
            if (millis === void 0) { millis = 0; }
            if (tickOptions === void 0) { tickOptions = { processNewMacroTasksSynchronously: true }; }
            FakeAsyncTestZoneSpec.assertInZone();
            this.flushMicrotasks();
            this._scheduler.tick(millis, doTick, tickOptions);
            if (this._lastError !== null) {
                this._resetLastErrorAndThrow();
            }
        };
        FakeAsyncTestZoneSpec.prototype.flushMicrotasks = function () {
            var _this = this;
            FakeAsyncTestZoneSpec.assertInZone();
            var flushErrors = function () {
                if (_this._lastError !== null || _this._uncaughtPromiseErrors.length) {
                    // If there is an error stop processing the microtask queue and rethrow the error.
                    _this._resetLastErrorAndThrow();
                }
            };
            while (this._microtasks.length > 0) {
                var microtask = this._microtasks.shift();
                microtask.func.apply(microtask.target, microtask.args);
            }
            flushErrors();
        };
        FakeAsyncTestZoneSpec.prototype.flush = function (limit, flushPeriodic, doTick) {
            FakeAsyncTestZoneSpec.assertInZone();
            this.flushMicrotasks();
            var elapsed = this._scheduler.flush(limit, flushPeriodic, doTick);
            if (this._lastError !== null) {
                this._resetLastErrorAndThrow();
            }
            return elapsed;
        };
        FakeAsyncTestZoneSpec.prototype.flushOnlyPendingTimers = function (doTick) {
            FakeAsyncTestZoneSpec.assertInZone();
            this.flushMicrotasks();
            var elapsed = this._scheduler.flushOnlyPendingTimers(doTick);
            if (this._lastError !== null) {
                this._resetLastErrorAndThrow();
            }
            return elapsed;
        };
        FakeAsyncTestZoneSpec.prototype.removeAllTimers = function () {
            FakeAsyncTestZoneSpec.assertInZone();
            this._scheduler.removeAll();
            this.pendingPeriodicTimers = [];
            this.pendingTimers = [];
        };
        FakeAsyncTestZoneSpec.prototype.getTimerCount = function () {
            return this._scheduler.getTimerCount() + this._microtasks.length;
        };
        FakeAsyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
            switch (task.type) {
                case 'microTask':
                    var args = task.data && task.data.args;
                    // should pass additional arguments to callback if have any
                    // currently we know process.nextTick will have such additional
                    // arguments
                    var additionalArgs = void 0;
                    if (args) {
                        var callbackIndex = task.data.cbIdx;
                        if (typeof args.length === 'number' && args.length > callbackIndex + 1) {
                            additionalArgs = Array.prototype.slice.call(args, callbackIndex + 1);
                        }
                    }
                    this._microtasks.push({
                        func: task.invoke,
                        args: additionalArgs,
                        target: task.data && task.data.target,
                    });
                    break;
                case 'macroTask':
                    switch (task.source) {
                        case 'setTimeout':
                            task.data['handleId'] = this._setTimeout(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
                            break;
                        case 'setImmediate':
                            task.data['handleId'] = this._setTimeout(task.invoke, 0, Array.prototype.slice.call(task.data['args'], 1));
                            break;
                        case 'setInterval':
                            task.data['handleId'] = this._setInterval(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
                            break;
                        case 'XMLHttpRequest.send':
                            throw new Error('Cannot make XHRs from within a fake async test. Request URL: ' +
                                task.data['url']);
                        case 'requestAnimationFrame':
                        case 'webkitRequestAnimationFrame':
                        case 'mozRequestAnimationFrame':
                            // Simulate a requestAnimationFrame by using a setTimeout with 16 ms.
                            // (60 frames per second)
                            task.data['handleId'] = this._setTimeout(task.invoke, 16, task.data['args'], this.trackPendingRequestAnimationFrame);
                            break;
                        default:
                            // user can define which macroTask they want to support by passing
                            // macroTaskOptions
                            var macroTaskOption = this.findMacroTaskOption(task);
                            if (macroTaskOption) {
                                var args_1 = task.data && task.data['args'];
                                var delay = args_1 && args_1.length > 1 ? args_1[1] : 0;
                                var callbackArgs = macroTaskOption.callbackArgs ? macroTaskOption.callbackArgs : args_1;
                                if (!!macroTaskOption.isPeriodic) {
                                    // periodic macroTask, use setInterval to simulate
                                    task.data['handleId'] = this._setInterval(task.invoke, delay, callbackArgs);
                                    task.data.isPeriodic = true;
                                }
                                else {
                                    // not periodic, use setTimeout to simulate
                                    task.data['handleId'] = this._setTimeout(task.invoke, delay, callbackArgs);
                                }
                                break;
                            }
                            throw new Error('Unknown macroTask scheduled in fake async test: ' + task.source);
                    }
                    break;
                case 'eventTask':
                    task = delegate.scheduleTask(target, task);
                    break;
            }
            return task;
        };
        FakeAsyncTestZoneSpec.prototype.onCancelTask = function (delegate, current, target, task) {
            switch (task.source) {
                case 'setTimeout':
                case 'requestAnimationFrame':
                case 'webkitRequestAnimationFrame':
                case 'mozRequestAnimationFrame':
                    return this._clearTimeout(task.data['handleId']);
                case 'setInterval':
                    return this._clearInterval(task.data['handleId']);
                default:
                    // user can define which macroTask they want to support by passing
                    // macroTaskOptions
                    var macroTaskOption = this.findMacroTaskOption(task);
                    if (macroTaskOption) {
                        var handleId = task.data['handleId'];
                        return macroTaskOption.isPeriodic
                            ? this._clearInterval(handleId)
                            : this._clearTimeout(handleId);
                    }
                    return delegate.cancelTask(target, task);
            }
        };
        FakeAsyncTestZoneSpec.prototype.onInvoke = function (delegate, current, target, callback, applyThis, applyArgs, source) {
            try {
                FakeAsyncTestZoneSpec.patchDate();
                return delegate.invoke(target, callback, applyThis, applyArgs, source);
            }
            finally {
                if (!this.patchDateLocked) {
                    FakeAsyncTestZoneSpec.resetDate();
                }
            }
        };
        FakeAsyncTestZoneSpec.prototype.findMacroTaskOption = function (task) {
            if (!this.macroTaskOptions) {
                return null;
            }
            for (var i = 0; i < this.macroTaskOptions.length; i++) {
                var macroTaskOption = this.macroTaskOptions[i];
                if (macroTaskOption.source === task.source) {
                    return macroTaskOption;
                }
            }
            return null;
        };
        FakeAsyncTestZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
            // ComponentFixture has a special-case handling to detect FakeAsyncTestZoneSpec
            // and prevent rethrowing the error from the onError subscription since it's handled here.
            this._lastError = error;
            return false; // Don't propagate error to parent zone.
        };
        return FakeAsyncTestZoneSpec;
    }());
    var _fakeAsyncTestZoneSpec = null;
    function getProxyZoneSpec() {
        return Zone && Zone['ProxyZoneSpec'];
    }
    var _sharedProxyZoneSpec = null;
    var _sharedProxyZone = null;
    /**
     * Clears out the shared fake async zone for a test.
     * To be called in a global `beforeEach`.
     *
     * @experimental
     */
    function resetFakeAsyncZone() {
        var _a, _b;
        if (_fakeAsyncTestZoneSpec) {
            _fakeAsyncTestZoneSpec.unlockDatePatch();
        }
        _fakeAsyncTestZoneSpec = null;
        (_b = (_a = getProxyZoneSpec()) === null || _a === void 0 ? void 0 : _a.get()) === null || _b === void 0 ? void 0 : _b.resetDelegate();
        _sharedProxyZoneSpec === null || _sharedProxyZoneSpec === void 0 ? void 0 : _sharedProxyZoneSpec.resetDelegate();
    }
    /**
     * Wraps a function to be executed in the fakeAsync zone:
     * - microtasks are manually executed by calling `flushMicrotasks()`,
     * - timers are synchronous, `tick()` simulates the asynchronous passage of time.
     *
     * When flush is `false`, if there are any pending timers at the end of the function,
     * an exception will be thrown.
     *
     * Can be used to wrap inject() calls.
     *
     * ## Example
     *
     * {@example core/testing/ts/fake_async.ts region='basic'}
     *
     * @param fn
     * @param options
     *     flush: when true, will drain the macrotask queue after the test function completes.
     * @returns The function wrapped to be executed in the fakeAsync zone
     *
     * @experimental
     */
    function fakeAsync(fn, options) {
        if (options === void 0) { options = {}; }
        var _a = options.flush, flush = _a === void 0 ? true : _a;
        // Not using an arrow function to preserve context passed from call site
        var fakeAsyncFn = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var ProxyZoneSpec = getProxyZoneSpec();
            if (!ProxyZoneSpec) {
                throw new Error('ProxyZoneSpec is needed for the fakeAsync() test helper but could not be found. ' +
                    'Make sure that your environment includes zone-testing.js');
            }
            var proxyZoneSpec = ProxyZoneSpec.assertPresent();
            if (Zone.current.get('FakeAsyncTestZoneSpec')) {
                throw new Error('fakeAsync() calls can not be nested');
            }
            try {
                // in case jasmine.clock init a fakeAsyncTestZoneSpec
                if (!_fakeAsyncTestZoneSpec) {
                    var FakeAsyncTestZoneSpec_1 = Zone && Zone['FakeAsyncTestZoneSpec'];
                    if (proxyZoneSpec.getDelegate() instanceof FakeAsyncTestZoneSpec_1) {
                        throw new Error('fakeAsync() calls can not be nested');
                    }
                    _fakeAsyncTestZoneSpec = new FakeAsyncTestZoneSpec_1();
                }
                var res = void 0;
                var lastProxyZoneSpec = proxyZoneSpec.getDelegate();
                proxyZoneSpec.setDelegate(_fakeAsyncTestZoneSpec);
                _fakeAsyncTestZoneSpec.lockDatePatch();
                try {
                    res = fn.apply(this, args);
                    if (flush) {
                        _fakeAsyncTestZoneSpec.flush(20, true);
                    }
                    else {
                        flushMicrotasks();
                    }
                }
                finally {
                    proxyZoneSpec.setDelegate(lastProxyZoneSpec);
                }
                if (!flush) {
                    if (_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length > 0) {
                        throw new Error("".concat(_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length, " ") +
                            "periodic timer(s) still in the queue.");
                    }
                    if (_fakeAsyncTestZoneSpec.pendingTimers.length > 0) {
                        throw new Error("".concat(_fakeAsyncTestZoneSpec.pendingTimers.length, " timer(s) still in the queue."));
                    }
                }
                return res;
            }
            finally {
                resetFakeAsyncZone();
            }
        };
        fakeAsyncFn.isFakeAsync = true;
        return fakeAsyncFn;
    }
    function _getFakeAsyncZoneSpec() {
        if (_fakeAsyncTestZoneSpec == null) {
            _fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
            if (_fakeAsyncTestZoneSpec == null) {
                throw new Error('The code should be running in the fakeAsync zone to call this function');
            }
        }
        return _fakeAsyncTestZoneSpec;
    }
    /**
     * Simulates the asynchronous passage of time for the timers in the fakeAsync zone.
     *
     * The microtasks queue is drained at the very start of this function and after any timer
     * callback has been executed.
     *
     * ## Example
     *
     * {@example core/testing/ts/fake_async.ts region='basic'}
     *
     * @experimental
     */
    function tick(millis, ignoreNestedTimeout) {
        if (millis === void 0) { millis = 0; }
        if (ignoreNestedTimeout === void 0) { ignoreNestedTimeout = false; }
        _getFakeAsyncZoneSpec().tick(millis, null, ignoreNestedTimeout);
    }
    /**
     * Simulates the asynchronous passage of time for the timers in the fakeAsync zone by
     * draining the macrotask queue until it is empty. The returned value is the milliseconds
     * of time that would have been elapsed.
     *
     * @param maxTurns
     * @returns The simulated time elapsed, in millis.
     *
     * @experimental
     */
    function flush(maxTurns) {
        return _getFakeAsyncZoneSpec().flush(maxTurns);
    }
    /**
     * Discard all remaining periodic tasks.
     *
     * @experimental
     */
    function discardPeriodicTasks() {
        var zoneSpec = _getFakeAsyncZoneSpec();
        zoneSpec.pendingPeriodicTimers;
        zoneSpec.pendingPeriodicTimers.length = 0;
    }
    /**
     * Wraps a function to be executed in a shared ProxyZone.
     *
     * If no shared ProxyZone exists, one is created and reused for subsequent calls.
     * Useful for wrapping test setup (beforeEach) and test execution (it) when test
     * runner patching isn't available or desired for setting up the ProxyZone.
     *
     * @param fn The function to wrap.
     * @returns A function that executes the original function within the shared ProxyZone.
     *
     * @experimental
     */
    function withProxyZone(fn) {
        var autoProxyFn = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var proxyZoneSpec = getProxyZoneSpec();
            if (proxyZoneSpec === undefined) {
                throw new Error('ProxyZoneSpec is needed for the withProxyZone() test helper but could not be found. ' +
                    'Make sure that your environment includes zone-testing.js');
            }
            var proxyZone = proxyZoneSpec.get() !== undefined ? Zone.current : getOrCreateRootProxy();
            return proxyZone.run(fn, this, args);
        };
        return autoProxyFn;
    }
    function getOrCreateRootProxy() {
        var ProxyZoneSpec = getProxyZoneSpec();
        if (ProxyZoneSpec === undefined) {
            throw new Error('ProxyZoneSpec is needed for withProxyZone but could not be found. ' +
                'Make sure that your environment includes zone-testing.js');
        }
        // Ensure the shared ProxyZoneSpec instance exists
        if (_sharedProxyZoneSpec === null) {
            _sharedProxyZoneSpec = new ProxyZoneSpec();
        }
        _sharedProxyZone = Zone.root.fork(_sharedProxyZoneSpec);
        return _sharedProxyZone;
    }
    /**
     * Flush any pending microtasks.
     *
     * @experimental
     */
    function flushMicrotasks() {
        _getFakeAsyncZoneSpec().flushMicrotasks();
    }
    function patchFakeAsyncTest(Zone) {
        // Export the class so that new instances can be created with proper
        // constructor params.
        Zone['FakeAsyncTestZoneSpec'] = FakeAsyncTestZoneSpec;
        Zone.__load_patch('fakeasync', function (global, Zone, api) {
            Zone[api.symbol('fakeAsyncTest')] = {
                resetFakeAsyncZone: resetFakeAsyncZone,
                flushMicrotasks: flushMicrotasks,
                discardPeriodicTasks: discardPeriodicTasks,
                tick: tick,
                flush: flush,
                fakeAsync: fakeAsync,
                withProxyZone: withProxyZone,
            };
        }, true);
        patchedTimers = {
            setTimeout: global$1.setTimeout,
            setInterval: global$1.setInterval,
            clearTimeout: global$1.clearTimeout,
            clearInterval: global$1.clearInterval,
            nativeSetTimeout: global$1[Zone.__symbol__('setTimeout')],
            nativeClearTimeout: global$1[Zone.__symbol__('clearTimeout')],
        };
        Scheduler.nextId = Scheduler.getNextId();
    }
    /**
     * @fileoverview
     * @suppress {globalThis}
     */
    function patchLongStackTrace(Zone) {
        var NEWLINE = '\n';
        var IGNORE_FRAMES = {};
        var creationTrace = '__creationTrace__';
        var ERROR_TAG = 'STACKTRACE TRACKING';
        var SEP_TAG = '__SEP_TAG__';
        var sepTemplate = SEP_TAG + '@[native]';
        var LongStackTrace = /** @class */ (function () {
            function LongStackTrace() {
                this.error = getStacktrace();
                this.timestamp = new Date();
            }
            return LongStackTrace;
        }());
        function getStacktraceWithUncaughtError() {
            return new Error(ERROR_TAG);
        }
        function getStacktraceWithCaughtError() {
            try {
                throw getStacktraceWithUncaughtError();
            }
            catch (err) {
                return err;
            }
        }
        // Some implementations of exception handling don't create a stack trace if the exception
        // isn't thrown, however it's faster not to actually throw the exception.
        var error = getStacktraceWithUncaughtError();
        var caughtError = getStacktraceWithCaughtError();
        var getStacktrace = error.stack
            ? getStacktraceWithUncaughtError
            : caughtError.stack
                ? getStacktraceWithCaughtError
                : getStacktraceWithUncaughtError;
        function getFrames(error) {
            return error.stack ? error.stack.split(NEWLINE) : [];
        }
        function addErrorStack(lines, error) {
            var trace = getFrames(error);
            for (var i = 0; i < trace.length; i++) {
                var frame = trace[i];
                // Filter out the Frames which are part of stack capturing.
                if (!IGNORE_FRAMES.hasOwnProperty(frame)) {
                    lines.push(trace[i]);
                }
            }
        }
        function renderLongStackTrace(frames, stack) {
            var longTrace = [stack ? stack.trim() : ''];
            if (frames) {
                var timestamp = new Date().getTime();
                for (var i = 0; i < frames.length; i++) {
                    var traceFrames = frames[i];
                    var lastTime = traceFrames.timestamp;
                    var separator = "____________________Elapsed ".concat(timestamp - lastTime.getTime(), " ms; At: ").concat(lastTime);
                    separator = separator.replace(/[^\w\d]/g, '_');
                    longTrace.push(sepTemplate.replace(SEP_TAG, separator));
                    addErrorStack(longTrace, traceFrames.error);
                    timestamp = lastTime.getTime();
                }
            }
            return longTrace.join(NEWLINE);
        }
        // if Error.stackTraceLimit is 0, means stack trace
        // is disabled, so we don't need to generate long stack trace
        // this will improve performance in some test(some test will
        // set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
        function stackTracesEnabled() {
            // Cast through any since this property only exists on Error in the nodejs
            // typings.
            return Error.stackTraceLimit > 0;
        }
        Zone['longStackTraceZoneSpec'] = {
            name: 'long-stack-trace',
            longStackTraceLimit: 10, // Max number of task to keep the stack trace for.
            // add a getLongStackTrace method in spec to
            // handle handled reject promise error.
            getLongStackTrace: function (error) {
                if (!error) {
                    return undefined;
                }
                var trace = error[Zone.__symbol__('currentTaskTrace')];
                if (!trace) {
                    return error.stack;
                }
                return renderLongStackTrace(trace, error.stack);
            },
            onScheduleTask: function (parentZoneDelegate, currentZone, targetZone, task) {
                if (stackTracesEnabled()) {
                    var currentTask = Zone.currentTask;
                    var trace = (currentTask && currentTask.data && currentTask.data[creationTrace]) || [];
                    trace = [new LongStackTrace()].concat(trace);
                    if (trace.length > this.longStackTraceLimit) {
                        trace.length = this.longStackTraceLimit;
                    }
                    if (!task.data)
                        task.data = {};
                    if (task.type === 'eventTask') {
                        // Fix issue https://github.com/angular/zone.js/issues/1195,
                        // For event task of browser, by default, all task will share a
                        // singleton instance of data object, we should create a new one here
                        // The cast to `any` is required to workaround a closure bug which wrongly applies
                        // URL sanitization rules to .data access.
                        task.data = __assign({}, task.data);
                    }
                    task.data[creationTrace] = trace;
                }
                return parentZoneDelegate.scheduleTask(targetZone, task);
            },
            onHandleError: function (parentZoneDelegate, currentZone, targetZone, error) {
                if (stackTracesEnabled()) {
                    var parentTask = Zone.currentTask || error.task;
                    if (error instanceof Error && parentTask) {
                        var longStack = renderLongStackTrace(parentTask.data && parentTask.data[creationTrace], error.stack);
                        try {
                            error.stack = error.longStack = longStack;
                        }
                        catch (err) { }
                    }
                }
                return parentZoneDelegate.handleError(targetZone, error);
            },
        };
        function captureStackTraces(stackTraces, count) {
            if (count > 0) {
                stackTraces.push(getFrames(new LongStackTrace().error));
                captureStackTraces(stackTraces, count - 1);
            }
        }
        function computeIgnoreFrames() {
            if (!stackTracesEnabled()) {
                return;
            }
            var frames = [];
            captureStackTraces(frames, 2);
            var frames1 = frames[0];
            var frames2 = frames[1];
            for (var i = 0; i < frames1.length; i++) {
                var frame1 = frames1[i];
                if (frame1.indexOf(ERROR_TAG) == -1) {
                    var match = frame1.match(/^\s*at\s+/);
                    if (match) {
                        sepTemplate = match[0] + SEP_TAG + ' (http://localhost)';
                        break;
                    }
                }
            }
            for (var i = 0; i < frames1.length; i++) {
                var frame1 = frames1[i];
                var frame2 = frames2[i];
                if (frame1 === frame2) {
                    IGNORE_FRAMES[frame1] = true;
                }
                else {
                    break;
                }
            }
        }
        computeIgnoreFrames();
    }
    var ProxyZoneSpec = /** @class */ (function () {
        function ProxyZoneSpec(defaultSpecDelegate) {
            if (defaultSpecDelegate === void 0) { defaultSpecDelegate = null; }
            this.name = 'ProxyZone';
            this._delegateSpec = null;
            this.properties = { 'ProxyZoneSpec': this };
            this.propertyKeys = null;
            this.lastTaskState = null;
            this.isNeedToTriggerHasTask = false;
            this.tasks = [];
            this.defaultSpecDelegate = defaultSpecDelegate;
            this.setDelegate(defaultSpecDelegate);
        }
        ProxyZoneSpec.get = function () {
            return Zone.current.get('ProxyZoneSpec');
        };
        ProxyZoneSpec.isLoaded = function () {
            return ProxyZoneSpec.get() instanceof ProxyZoneSpec;
        };
        ProxyZoneSpec.assertPresent = function () {
            var spec = ProxyZoneSpec.get();
            if (spec === undefined) {
                throw new Error("Expected to be running in 'ProxyZone', but it was not found.");
            }
            return spec;
        };
        ProxyZoneSpec.prototype.setDelegate = function (delegateSpec) {
            var _this = this;
            var isNewDelegate = this._delegateSpec !== delegateSpec;
            this._delegateSpec = delegateSpec;
            this.propertyKeys && this.propertyKeys.forEach(function (key) { return delete _this.properties[key]; });
            this.propertyKeys = null;
            if (delegateSpec && delegateSpec.properties) {
                this.propertyKeys = Object.keys(delegateSpec.properties);
                this.propertyKeys.forEach(function (k) { return (_this.properties[k] = delegateSpec.properties[k]); });
            }
            // if a new delegateSpec was set, check if we need to trigger hasTask
            if (isNewDelegate &&
                this.lastTaskState &&
                (this.lastTaskState.macroTask || this.lastTaskState.microTask)) {
                this.isNeedToTriggerHasTask = true;
            }
        };
        ProxyZoneSpec.prototype.getDelegate = function () {
            return this._delegateSpec;
        };
        ProxyZoneSpec.prototype.resetDelegate = function () {
            this.getDelegate();
            this.setDelegate(this.defaultSpecDelegate);
        };
        ProxyZoneSpec.prototype.tryTriggerHasTask = function (parentZoneDelegate, currentZone, targetZone) {
            if (this.isNeedToTriggerHasTask && this.lastTaskState) {
                // last delegateSpec has microTask or macroTask
                // should call onHasTask in current delegateSpec
                this.isNeedToTriggerHasTask = false;
                this.onHasTask(parentZoneDelegate, currentZone, targetZone, this.lastTaskState);
            }
        };
        ProxyZoneSpec.prototype.removeFromTasks = function (task) {
            if (!this.tasks) {
                return;
            }
            for (var i = 0; i < this.tasks.length; i++) {
                if (this.tasks[i] === task) {
                    this.tasks.splice(i, 1);
                    return;
                }
            }
        };
        ProxyZoneSpec.prototype.getAndClearPendingTasksInfo = function () {
            if (this.tasks.length === 0) {
                return '';
            }
            var taskInfo = this.tasks.map(function (task) {
                var dataInfo = task.data &&
                    Object.keys(task.data)
                        .map(function (key) {
                        return key + ':' + task.data[key];
                    })
                        .join(',');
                return "type: ".concat(task.type, ", source: ").concat(task.source, ", args: {").concat(dataInfo, "}");
            });
            var pendingTasksInfo = '--Pending async tasks are: [' + taskInfo + ']';
            // clear tasks
            this.tasks = [];
            return pendingTasksInfo;
        };
        ProxyZoneSpec.prototype.onFork = function (parentZoneDelegate, currentZone, targetZone, zoneSpec) {
            if (this._delegateSpec && this._delegateSpec.onFork) {
                return this._delegateSpec.onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec);
            }
            else {
                return parentZoneDelegate.fork(targetZone, zoneSpec);
            }
        };
        ProxyZoneSpec.prototype.onIntercept = function (parentZoneDelegate, currentZone, targetZone, delegate, source) {
            if (this._delegateSpec && this._delegateSpec.onIntercept) {
                return this._delegateSpec.onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source);
            }
            else {
                return parentZoneDelegate.intercept(targetZone, delegate, source);
            }
        };
        ProxyZoneSpec.prototype.onInvoke = function (parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
            this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
            if (this._delegateSpec && this._delegateSpec.onInvoke) {
                return this._delegateSpec.onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source);
            }
            else {
                return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
            }
        };
        ProxyZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
            if (this._delegateSpec && this._delegateSpec.onHandleError) {
                return this._delegateSpec.onHandleError(parentZoneDelegate, currentZone, targetZone, error);
            }
            else {
                return parentZoneDelegate.handleError(targetZone, error);
            }
        };
        ProxyZoneSpec.prototype.onScheduleTask = function (parentZoneDelegate, currentZone, targetZone, task) {
            if (task.type !== 'eventTask') {
                this.tasks.push(task);
            }
            if (this._delegateSpec && this._delegateSpec.onScheduleTask) {
                return this._delegateSpec.onScheduleTask(parentZoneDelegate, currentZone, targetZone, task);
            }
            else {
                return parentZoneDelegate.scheduleTask(targetZone, task);
            }
        };
        ProxyZoneSpec.prototype.onInvokeTask = function (parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
            if (task.type !== 'eventTask') {
                this.removeFromTasks(task);
            }
            this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
            if (this._delegateSpec && this._delegateSpec.onInvokeTask) {
                return this._delegateSpec.onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs);
            }
            else {
                return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
            }
        };
        ProxyZoneSpec.prototype.onCancelTask = function (parentZoneDelegate, currentZone, targetZone, task) {
            if (task.type !== 'eventTask') {
                this.removeFromTasks(task);
            }
            this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
            if (this._delegateSpec && this._delegateSpec.onCancelTask) {
                return this._delegateSpec.onCancelTask(parentZoneDelegate, currentZone, targetZone, task);
            }
            else {
                return parentZoneDelegate.cancelTask(targetZone, task);
            }
        };
        ProxyZoneSpec.prototype.onHasTask = function (delegate, current, target, hasTaskState) {
            this.lastTaskState = hasTaskState;
            if (this._delegateSpec && this._delegateSpec.onHasTask) {
                this._delegateSpec.onHasTask(delegate, current, target, hasTaskState);
            }
            else {
                delegate.hasTask(target, hasTaskState);
            }
        };
        return ProxyZoneSpec;
    }());
    function patchProxyZoneSpec(Zone) {
        // Export the class so that new instances can be created with proper
        // constructor params.
        Zone['ProxyZoneSpec'] = ProxyZoneSpec;
    }
    function patchSyncTest(Zone) {
        var SyncTestZoneSpec = /** @class */ (function () {
            function SyncTestZoneSpec(namePrefix) {
                this.runZone = Zone.current;
                this.name = 'syncTestZone for ' + namePrefix;
            }
            SyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
                switch (task.type) {
                    case 'microTask':
                    case 'macroTask':
                        throw new Error("Cannot call ".concat(task.source, " from within a sync test (").concat(this.name, ")."));
                    case 'eventTask':
                        task = delegate.scheduleTask(target, task);
                        break;
                }
                return task;
            };
            return SyncTestZoneSpec;
        }());
        // Export the class so that new instances can be created with proper
        // constructor params.
        Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
    }
    function patchPromiseTesting(Zone) {
        /**
         * Promise for async/fakeAsync zoneSpec test
         * can support async operation which not supported by zone.js
         * such as
         * it ('test jsonp in AsyncZone', async() => {
         *   new Promise(res => {
         *     jsonp(url, (data) => {
         *       // success callback
         *       res(data);
         *     });
         *   }).then((jsonpResult) => {
         *     // get jsonp result.
         *
         *     // user will expect AsyncZoneSpec wait for
         *     // then, but because jsonp is not zone aware
         *     // AsyncZone will finish before then is called.
         *   });
         * });
         */
        Zone.__load_patch('promisefortest', function (global, Zone, api) {
            var symbolState = api.symbol('state');
            var UNRESOLVED = null;
            var symbolParentUnresolved = api.symbol('parentUnresolved');
            // patch Promise.prototype.then to keep an internal
            // number for tracking unresolved chained promise
            // we will decrease this number when the parent promise
            // being resolved/rejected and chained promise was
            // scheduled as a microTask.
            // so we can know such kind of chained promise still
            // not resolved in AsyncTestZone
            Promise[api.symbol('patchPromiseForTest')] = function patchPromiseForTest() {
                var oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
                if (oriThen) {
                    return;
                }
                oriThen = Promise[Zone.__symbol__('ZonePromiseThen')] = Promise.prototype.then;
                Promise.prototype.then = function () {
                    var chained = oriThen.apply(this, arguments);
                    if (this[symbolState] === UNRESOLVED) {
                        // parent promise is unresolved.
                        var asyncTestZoneSpec = Zone.current.get('AsyncTestZoneSpec');
                        if (asyncTestZoneSpec) {
                            asyncTestZoneSpec.unresolvedChainedPromiseCount++;
                            chained[symbolParentUnresolved] = true;
                        }
                    }
                    return chained;
                };
            };
            Promise[api.symbol('unPatchPromiseForTest')] = function unpatchPromiseForTest() {
                // restore origin then
                var oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
                if (oriThen) {
                    Promise.prototype.then = oriThen;
                    Promise[Zone.__symbol__('ZonePromiseThen')] = undefined;
                }
            };
        });
    }
    function rollupTesting(Zone) {
        patchLongStackTrace(Zone);
        patchProxyZoneSpec(Zone);
        patchSyncTest(Zone);
        patchJasmine(Zone);
        patchJest(Zone);
        patchMocha(Zone);
        patchAsyncTest(Zone);
        patchFakeAsyncTest(Zone);
        patchPromiseTesting(Zone);
    }
    rollupTesting(Zone);
}));
o>0x( 
mKpatchJasmine(Zone);
}));
8Gx =
zUL}));

tx' 9'use strict'}));
x+xt#'use strict'Bluebird$bluebird7/:/ TODO: @JiaLiPassion, we can automatically patch bluebirdglobal.Promise = Bluebird, but sometimes in nodejs,
            // global.Promise is not Bluebird, and Bluebird is just be
            // used by other libraries such as sequelize, so I think it is
            // safe to just expose a method to patch BluCebird explicitly
            var BLUEBIRD = 'bluebird';
           ?_,BLUEBIRD)] = function patchBluebird(Bluebird u	>method of Bluebird.prototype which not using `then` internallyf+bluebirdApis = ['then', 'spread', 'finally'!YbluebirdApisfbapp|Bluebird.prototype, bapiq|<E)-zunc 0?>fu2-e*argSelfEargArgs = argumentsa@new Bluebird(function (res, rejG$z:Promise.then',/]`&res(func.apply(argSelf, argArg&&)Up mjA!&&K|,	V](@D"@0};r|>שwindowF(function (event2%"event.detail && event.detail.reaso1g0?error && error.isHandledByZonуevent.preventDefaul>event.stopImmediatePropagation+event.stopImmediatePropagationKK|0if (!function (reason, p2_reason && reason.isHandledByZonуlisteners_1 =(x_
listeners_q6// remove unhandledRejection listeners so the callbackA$will not be triggered$(x"nextTick@& listeners_1flistener) { return"
listener);a| -p!`4Bluebird.onPossiblyUnhandledRejection(function (e, p]`P
runGuarded@&e.isHandledByoF)$|K}err.isHandledByE"p|onUnhandledError|override globalk@Promise = BluebirdpatchBluebird(Zone);
}));
uxs"use strict";var __assign=this&&this.__assign||function(){return __assign=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},__assign.apply(this,arguments)},__spreadArray=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,i=0,o=t.length;i<o;i++)!r&&i in t||(r||(r=Array.prototype.slice.call(t,0,i)),r[i]=t[i]);return e.concat(r||Array.prototype.slice.call(t))};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){var e=globalThis;function t(t){return(e.__Zone_symbol_prefix||"__zone_symbol__")+t}var n,r="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global,i=function(){function e(e,n,i){this._pendingMicroTasks=!1,this._pendingMacroTasks=!1,this._alreadyErrored=!1,this._isSync=!1,this._existingFinishTimer=null,this.entryFunction=null,this.runZone=Zone.current,this.unresolvedChainedPromiseCount=0,this.supportWaitUnresolvedChainedPromise=!1,this.finishCallback=e,this.failCallback=n,this.name="asyncTestZone for "+i,this.properties={AsyncTestZoneSpec:this},this.supportWaitUnresolvedChainedPromise=!0===r[t("supportWaitUnResolvedChainedPromise")]}return Object.defineProperty(e,"symbolParentUnresolved",{get:function(){return t("parentUnresolved")},enumerable:!1,configurable:!0}),e.prototype.isUnresolvedChainedPromisePending=function(){return this.unresolvedChainedPromiseCount>0},e.prototype._finishCallbackIfDone=function(){var e=this;null!==this._existingFinishTimer&&(clearTimeout(this._existingFinishTimer),this._existingFinishTimer=null),this._pendingMicroTasks||this._pendingMacroTasks||this.supportWaitUnresolvedChainedPromise&&this.isUnresolvedChainedPromisePending()||this.runZone.run((function(){e._existingFinishTimer=setTimeout((function(){e._alreadyErrored||e._pendingMicroTasks||e._pendingMacroTasks||e.finishCallback()}),0)}))},e.prototype.patchPromiseForTest=function(){if(this.supportWaitUnresolvedChainedPromise){var e=Promise[Zone.__symbol__("patchPromiseForTest")];e&&e()}},e.prototype.unPatchPromiseForTest=function(){if(this.supportWaitUnresolvedChainedPromise){var e=Promise[Zone.__symbol__("unPatchPromiseForTest")];e&&e()}},e.prototype.onScheduleTask=function(t,n,r,i){return"eventTask"!==i.type&&(this._isSync=!1),"microTask"===i.type&&i.data&&i.data instanceof Promise&&!0===i.data[e.symbolParentUnresolved]&&this.unresolvedChainedPromiseCount--,t.scheduleTask(r,i)},e.prototype.onInvokeTask=function(e,t,n,r,i,o){return"eventTask"!==r.type&&(this._isSync=!1),e.invokeTask(n,r,i,o)},e.prototype.onCancelTask=function(e,t,n,r){return"eventTask"!==r.type&&(this._isSync=!1),e.cancelTask(n,r)},e.prototype.onInvoke=function(e,t,n,r,i,o,s){this.entryFunction||(this.entryFunction=r);try{return this._isSync=!0,e.invoke(n,r,i,o,s)}finally{this._isSync&&this.entryFunction===r&&this._finishCallbackIfDone()}},e.prototype.onHandleError=function(e,t,n,r){return e.handleError(n,r)&&(this.failCallback(r),this._alreadyErrored=!0),!1},e.prototype.onHasTask=function(e,t,n,r){e.hasTask(n,r),t===n&&("microTask"==r.change?(this._pendingMicroTasks=r.microTask,this._finishCallbackIfDone()):"macroTask"==r.change&&(this._pendingMacroTasks=r.macroTask,this._finishCallbackIfDone()))},e}(),o="object"==typeof window&&window||"object"==typeof self&&self||globalThis.global,s=o.Date;function a(){if(0===arguments.length){var e=new s;return e.setTime(a.now()),e}var t=Array.prototype.slice.call(arguments);return new(s.bind.apply(s,__spreadArray([void 0],t,!1)))}a.now=function(){var e=Zone.current.get("FakeAsyncTestZoneSpec");return e?e.getFakeSystemTime():s.now.apply(this,arguments)},a.UTC=s.UTC,a.parse=s.parse;var c=function(){},u=function(){function e(){this._schedulerQueue=[],this._currentTickTime=0,this._currentFakeBaseSystemTime=s.now(),this._currentTickRequeuePeriodicEntries=[]}return e.getNextId=function(){var t=n.nativeSetTimeout.call(o,c,0);return n.nativeClearTimeout.call(o,t),"number"==typeof t?t:e.nextNodeJSId++},e.prototype.getCurrentTickTime=function(){return this._currentTickTime},e.prototype.getFakeSystemTime=function(){return this._currentFakeBaseSystemTime+this._currentTickTime},e.prototype.setFakeBaseSystemTime=function(e){this._currentFakeBaseSystemTime=e},e.prototype.getRealSystemTime=function(){return s.now()},e.prototype.scheduleFunction=function(t,n,r){var i=(r=__assign({args:[],isPeriodic:!1,isRequestAnimationFrame:!1,id:-1,isRequeuePeriodic:!1},r)).id<0?e.nextId:r.id;e.nextId=e.getNextId();var o={endTime:this._currentTickTime+n,id:i,func:t,args:r.args,delay:n,isPeriodic:r.isPeriodic,isRequestAnimationFrame:r.isRequestAnimationFrame};r.isRequeuePeriodic&&this._currentTickRequeuePeriodicEntries.push(o);for(var s=0;s<this._schedulerQueue.length&&!(o.endTime<this._schedulerQueue[s].endTime);s++);return this._schedulerQueue.splice(s,0,o),i},e.prototype.removeScheduledFunctionWithId=function(e){for(var t=0;t<this._schedulerQueue.length;t++)if(this._schedulerQueue[t].id==e){this._schedulerQueue.splice(t,1);break}},e.prototype.removeAll=function(){this._schedulerQueue=[]},e.prototype.getTimerCount=function(){return this._schedulerQueue.length},e.prototype.tickToNext=function(e,t,n){void 0===e&&(e=1),this._schedulerQueue.length<e||this.tick(this._schedulerQueue[e-1].endTime-this._currentTickTime,t,n)},e.prototype.tick=function(e,t,n){void 0===e&&(e=0);var r=this._currentTickTime+e,i=0,s=(n=Object.assign({processNewMacroTasksSynchronously:!0},n)).processNewMacroTasksSynchronously?this._schedulerQueue:this._schedulerQueue.slice();if(0===s.length&&t)t(e);else{for(;s.length>0&&(this._currentTickRequeuePeriodicEntries=[],!(r<s[0].endTime));){var a=s.shift();if(!n.processNewMacroTasksSynchronously){var c=this._schedulerQueue.indexOf(a);c>=0&&this._schedulerQueue.splice(c,1)}if(i=this._currentTickTime,this._currentTickTime=a.endTime,t&&t(this._currentTickTime-i),!a.func.apply(o,a.isRequestAnimationFrame?[this._currentTickTime]:a.args))break;n.processNewMacroTasksSynchronously||this._currentTickRequeuePeriodicEntries.forEach((function(e){for(var t=0;t<s.length&&!(e.endTime<s[t].endTime);t++);s.splice(t,0,e)}))}i=this._currentTickTime,this._currentTickTime=r,t&&t(this._currentTickTime-i)}},e.prototype.flushOnlyPendingTimers=function(e){if(0===this._schedulerQueue.length)return 0;var t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e,{processNewMacroTasksSynchronously:!1}),this._currentTickTime-t},e.prototype.flush=function(e,t,n){return void 0===e&&(e=20),void 0===t&&(t=!1),t?this.flushPeriodic(n):this.flushNonPeriodic(e,n)},e.prototype.flushPeriodic=function(e){if(0===this._schedulerQueue.length)return 0;var t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e),this._currentTickTime-t},e.prototype.flushNonPeriodic=function(e,t){for(var n=this._currentTickTime,r=0,i=0;this._schedulerQueue.length>0;){if(++i>e)throw new Error("flush failed after reaching the limit of "+e+" tasks. Does your code use a polling timeout?");if(0===this._schedulerQueue.filter((function(e){return!e.isPeriodic&&!e.isRequestAnimationFrame})).length)break;var s=this._schedulerQueue.shift();if(r=this._currentTickTime,this._currentTickTime=s.endTime,t&&t(this._currentTickTime-r),!s.func.apply(o,s.args))break}return this._currentTickTime-n},e.nextNodeJSId=1,e.nextId=-1,e}(),l=function(){function e(e,t,n){void 0===t&&(t=!1),this._scheduler=new u,this._microtasks=[],this._lastError=null,this._uncaughtPromiseErrors=Promise[Zone.__symbol__("uncaughtPromiseErrors")],this.pendingPeriodicTimers=[],this.pendingTimers=[],this.patchDateLocked=!1,this.properties={FakeAsyncTestZoneSpec:this},this.trackPendingRequestAnimationFrame=t,this.macroTaskOptions=n,this.name="fakeAsyncTestZone for "+e,this.macroTaskOptions||(this.macroTaskOptions=o[Zone.__symbol__("FakeAsyncTestMacroTask")])}return e.assertInZone=function(){if(null==Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("The code should be running in the fakeAsync zone to call this function")},e.prototype._fnAndFlush=function(e,t){var n=this;return function(){for(var r=[],i=0;i<arguments.length;i++)r[i]=arguments[i];return e.apply(o,r),null===n._lastError?(null!=t.onSuccess&&t.onSuccess.apply(o),n.flushMicrotasks()):null!=t.onError&&t.onError.apply(o),null===n._lastError}},e._removeTimer=function(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)},e.prototype._dequeueTimer=function(t){var n=this;return function(){e._removeTimer(n.pendingTimers,t)}},e.prototype._requeuePeriodicTimer=function(e,t,n,r){var i=this;return function(){-1!==i.pendingPeriodicTimers.indexOf(r)&&i._scheduler.scheduleFunction(e,t,{args:n,isPeriodic:!0,id:r,isRequeuePeriodic:!0})}},e.prototype._dequeuePeriodicTimer=function(t){var n=this;return function(){e._removeTimer(n.pendingPeriodicTimers,t)}},e.prototype._setTimeout=function(e,t,n,r){void 0===r&&(r=!0);var i=this._dequeueTimer(u.nextId),o=this._fnAndFlush(e,{onSuccess:i,onError:i}),s=this._scheduler.scheduleFunction(o,t,{args:n,isRequestAnimationFrame:!r});return r&&this.pendingTimers.push(s),s},e.prototype._clearTimeout=function(t){e._removeTimer(this.pendingTimers,t),this._scheduler.removeScheduledFunctionWithId(t)},e.prototype._setInterval=function(e,t,n){var r=u.nextId,i={onSuccess:null,onError:this._dequeuePeriodicTimer(r)},o=this._fnAndFlush(e,i);return i.onSuccess=this._requeuePeriodicTimer(o,t,n,r),this._scheduler.scheduleFunction(o,t,{args:n,isPeriodic:!0}),this.pendingPeriodicTimers.push(r),r},e.prototype._clearInterval=function(t){e._removeTimer(this.pendingPeriodicTimers,t),this._scheduler.removeScheduledFunctionWithId(t)},e.prototype._resetLastErrorAndThrow=function(){var e=this._lastError||this._uncaughtPromiseErrors[0];throw this._uncaughtPromiseErrors.length=0,this._lastError=null,e},e.prototype.getCurrentTickTime=function(){return this._scheduler.getCurrentTickTime()},e.prototype.getFakeSystemTime=function(){return this._scheduler.getFakeSystemTime()},e.prototype.setFakeBaseSystemTime=function(e){this._scheduler.setFakeBaseSystemTime(e)},e.prototype.getRealSystemTime=function(){return this._scheduler.getRealSystemTime()},e.patchDate=function(){o[Zone.__symbol__("disableDatePatching")]||o.Date!==a&&(o.Date=a,a.prototype=s.prototype,e.checkTimerPatch())},e.resetDate=function(){o.Date===a&&(o.Date=s)},e.checkTimerPatch=function(){if(!n)throw new Error("Expected timers to have been patched.");o.setTimeout!==n.setTimeout&&(o.setTimeout=n.setTimeout,o.clearTimeout=n.clearTimeout),o.setInterval!==n.setInterval&&(o.setInterval=n.setInterval,o.clearInterval=n.clearInterval)},e.prototype.lockDatePatch=function(){this.patchDateLocked=!0,e.patchDate()},e.prototype.unlockDatePatch=function(){this.patchDateLocked=!1,e.resetDate()},e.prototype.tickToNext=function(t,n,r){void 0===t&&(t=1),void 0===r&&(r={processNewMacroTasksSynchronously:!0}),t<=0||(e.assertInZone(),this.flushMicrotasks(),this._scheduler.tickToNext(t,n,r),null!==this._lastError&&this._resetLastErrorAndThrow())},e.prototype.tick=function(t,n,r){void 0===t&&(t=0),void 0===r&&(r={processNewMacroTasksSynchronously:!0}),e.assertInZone(),this.flushMicrotasks(),this._scheduler.tick(t,n,r),null!==this._lastError&&this._resetLastErrorAndThrow()},e.prototype.flushMicrotasks=function(){var t=this;for(e.assertInZone();this._microtasks.length>0;){var n=this._microtasks.shift();n.func.apply(n.target,n.args)}(null!==t._lastError||t._uncaughtPromiseErrors.length)&&t._resetLastErrorAndThrow()},e.prototype.flush=function(t,n,r){e.assertInZone(),this.flushMicrotasks();var i=this._scheduler.flush(t,n,r);return null!==this._lastError&&this._resetLastErrorAndThrow(),i},e.prototype.flushOnlyPendingTimers=function(t){e.assertInZone(),this.flushMicrotasks();var n=this._scheduler.flushOnlyPendingTimers(t);return null!==this._lastError&&this._resetLastErrorAndThrow(),n},e.prototype.removeAllTimers=function(){e.assertInZone(),this._scheduler.removeAll(),this.pendingPeriodicTimers=[],this.pendingTimers=[]},e.prototype.getTimerCount=function(){return this._scheduler.getTimerCount()+this._microtasks.length},e.prototype.onScheduleTask=function(e,t,n,r){switch(r.type){case"microTask":var i=r.data&&r.data.args,o=void 0;if(i){var s=r.data.cbIdx;"number"==typeof i.length&&i.length>s+1&&(o=Array.prototype.slice.call(i,s+1))}this._microtasks.push({func:r.invoke,args:o,target:r.data&&r.data.target});break;case"macroTask":switch(r.source){case"setTimeout":r.data.handleId=this._setTimeout(r.invoke,r.data.delay,Array.prototype.slice.call(r.data.args,2));break;case"setImmediate":r.data.handleId=this._setTimeout(r.invoke,0,Array.prototype.slice.call(r.data.args,1));break;case"setInterval":r.data.handleId=this._setInterval(r.invoke,r.data.delay,Array.prototype.slice.call(r.data.args,2));break;case"XMLHttpRequest.send":throw new Error("Cannot make XHRs from within a fake async test. Request URL: "+r.data.url);case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":r.data.handleId=this._setTimeout(r.invoke,16,r.data.args,this.trackPendingRequestAnimationFrame);break;default:var a=this.findMacroTaskOption(r);if(a){var c=r.data&&r.data.args,u=c&&c.length>1?c[1]:0,l=a.callbackArgs?a.callbackArgs:c;a.isPeriodic?(r.data.handleId=this._setInterval(r.invoke,u,l),r.data.isPeriodic=!0):r.data.handleId=this._setTimeout(r.invoke,u,l);break}throw new Error("Unknown macroTask scheduled in fake async test: "+r.source)}break;case"eventTask":r=e.scheduleTask(n,r)}return r},e.prototype.onCancelTask=function(e,t,n,r){switch(r.source){case"setTimeout":case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":return this._clearTimeout(r.data.handleId);case"setInterval":return this._clearInterval(r.data.handleId);default:var i=this.findMacroTaskOption(r);if(i){var o=r.data.handleId;return i.isPeriodic?this._clearInterval(o):this._clearTimeout(o)}return e.cancelTask(n,r)}},e.prototype.onInvoke=function(t,n,r,i,o,s,a){try{return e.patchDate(),t.invoke(r,i,o,s,a)}finally{this.patchDateLocked||e.resetDate()}},e.prototype.findMacroTaskOption=function(e){if(!this.macroTaskOptions)return null;for(var t=0;t<this.macroTaskOptions.length;t++){var n=this.macroTaskOptions[t];if(n.source===e.source)return n}return null},e.prototype.onHandleError=function(e,t,n,r){return this._lastError=r,!1},e}(),h=null;function p(){return Zone&&Zone.ProxyZoneSpec}var f=null;function d(){var e,t;h&&h.unlockDatePatch(),h=null,null===(t=null===(e=p())||void 0===e?void 0:e.get())||void 0===t||t.resetDelegate(),null==f||f.resetDelegate()}function y(e,t){void 0===t&&(t={});var n=t.flush,r=void 0===n||n,i=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var i=p();if(!i)throw new Error("ProxyZoneSpec is needed for the fakeAsync() test helper but could not be found. Make sure that your environment includes zone-testing.js");var o=i.assertPresent();if(Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("fakeAsync() calls can not be nested");try{if(!h){var s=Zone&&Zone.FakeAsyncTestZoneSpec;if(o.getDelegate()instanceof s)throw new Error("fakeAsync() calls can not be nested");h=new s}var a=void 0,c=o.getDelegate();o.setDelegate(h),h.lockDatePatch();try{a=e.apply(this,t),r?h.flush(20,!0):v()}finally{o.setDelegate(c)}if(!r){if(h.pendingPeriodicTimers.length>0)throw new Error("".concat(h.pendingPeriodicTimers.length," ")+"periodic timer(s) still in the queue.");if(h.pendingTimers.length>0)throw new Error("".concat(h.pendingTimers.length," timer(s) still in the queue."))}return a}finally{d()}};return i.isFakeAsync=!0,i}function m(){if(null==h&&null==(h=Zone.current.get("FakeAsyncTestZoneSpec")))throw new Error("The code should be running in the fakeAsync zone to call this function");return h}function T(e,t){void 0===e&&(e=0),void 0===t&&(t=!1),m().tick(e,null,t)}function _(e){return m().flush(e)}function k(){m().pendingPeriodicTimers.length=0}function g(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=p();if(void 0===r)throw new Error("ProxyZoneSpec is needed for the withProxyZone() test helper but could not be found. Make sure that your environment includes zone-testing.js");var i=void 0!==r.get()?Zone.current:function o(){var e=p();if(void 0===e)throw new Error("ProxyZoneSpec is needed for withProxyZone but could not be found. Make sure that your environment includes zone-testing.js");return null===f&&(f=new e),Zone.root.fork(f)}();return i.run(e,this,t)}}function v(){m().flushMicrotasks()}function b(e){var t={},n="__creationTrace__",r="STACKTRACE TRACKING",i="__SEP_TAG__",o=i+"@[native]",s=function s(){this.error=h(),this.timestamp=new Date};function a(){return new Error(r)}function c(){try{throw a()}catch(e){return e}}var u=a(),l=c(),h=u.stack?a:l.stack?c:a;function p(e){return e.stack?e.stack.split("\n"):[]}function f(e,n){for(var r=p(n),i=0;i<r.length;i++)t.hasOwnProperty(r[i])||e.push(r[i])}function d(e,t){var n=[t?t.trim():""];if(e)for(var r=(new Date).getTime(),s=0;s<e.length;s++){var a=e[s],c=a.timestamp,u="____________________Elapsed ".concat(r-c.getTime()," ms; At: ").concat(c);u=u.replace(/[^\w\d]/g,"_"),n.push(o.replace(i,u)),f(n,a.error),r=c.getTime()}return n.join("\n")}function y(){return Error.stackTraceLimit>0}function m(e,t){t>0&&(e.push(p((new s).error)),m(e,t-1))}e.longStackTraceZoneSpec={name:"long-stack-trace",longStackTraceLimit:10,getLongStackTrace:function(t){if(t){var n=t[e.__symbol__("currentTaskTrace")];return n?d(n,t.stack):t.stack}},onScheduleTask:function(t,r,i,o){if(y()){var a=e.currentTask,c=a&&a.data&&a.data[n]||[];(c=[new s].concat(c)).length>this.longStackTraceLimit&&(c.length=this.longStackTraceLimit),o.data||(o.data={}),"eventTask"===o.type&&(o.data=__assign({},o.data)),o.data[n]=c}return t.scheduleTask(i,o)},onHandleError:function(t,r,i,o){if(y()){var s=e.currentTask||o.task;if(o instanceof Error&&s){var a=d(s.data&&s.data[n],o.stack);try{o.stack=o.longStack=a}catch(e){}}}return t.handleError(i,o)}},function T(){if(y()){var e=[];m(e,2);for(var n=e[0],s=e[1],a=0;a<n.length;a++)if(-1==(u=n[a]).indexOf(r)){var c=u.match(/^\s*at\s+/);if(c){o=c[0]+i+" (http://localhost)";break}}for(a=0;a<n.length;a++){var u;if((u=n[a])!==s[a])break;t[u]=!0}}}()}var S=function(){function e(e){void 0===e&&(e=null),this.name="ProxyZone",this._delegateSpec=null,this.properties={ProxyZoneSpec:this},this.propertyKeys=null,this.lastTaskState=null,this.isNeedToTriggerHasTask=!1,this.tasks=[],this.defaultSpecDelegate=e,this.setDelegate(e)}return e.get=function(){return Zone.current.get("ProxyZoneSpec")},e.isLoaded=function(){return e.get()instanceof e},e.assertPresent=function(){var t=e.get();if(void 0===t)throw new Error("Expected to be running in 'ProxyZone', but it was not found.");return t},e.prototype.setDelegate=function(e){var t=this,n=this._delegateSpec!==e;this._delegateSpec=e,this.propertyKeys&&this.propertyKeys.forEach((function(e){return delete t.properties[e]})),this.propertyKeys=null,e&&e.properties&&(this.propertyKeys=Object.keys(e.properties),this.propertyKeys.forEach((function(n){return t.properties[n]=e.properties[n]}))),n&&this.lastTaskState&&(this.lastTaskState.macroTask||this.lastTaskState.microTask)&&(this.isNeedToTriggerHasTask=!0)},e.prototype.getDelegate=function(){return this._delegateSpec},e.prototype.resetDelegate=function(){this.getDelegate(),this.setDelegate(this.defaultSpecDelegate)},e.prototype.tryTriggerHasTask=function(e,t,n){this.isNeedToTriggerHasTask&&this.lastTaskState&&(this.isNeedToTriggerHasTask=!1,this.onHasTask(e,t,n,this.lastTaskState))},e.prototype.removeFromTasks=function(e){if(this.tasks)for(var t=0;t<this.tasks.length;t++)if(this.tasks[t]===e)return void this.tasks.splice(t,1)},e.prototype.getAndClearPendingTasksInfo=function(){if(0===this.tasks.length)return"";var e="--Pending async tasks are: ["+this.tasks.map((function(e){var t=e.data&&Object.keys(e.data).map((function(t){return t+":"+e.data[t]})).join(",");return"type: ".concat(e.type,", source: ").concat(e.source,", args: {").concat(t,"}")}))+"]";return this.tasks=[],e},e.prototype.onFork=function(e,t,n,r){return this._delegateSpec&&this._delegateSpec.onFork?this._delegateSpec.onFork(e,t,n,r):e.fork(n,r)},e.prototype.onIntercept=function(e,t,n,r,i){return this._delegateSpec&&this._delegateSpec.onIntercept?this._delegateSpec.onIntercept(e,t,n,r,i):e.intercept(n,r,i)},e.prototype.onInvoke=function(e,t,n,r,i,o,s){return this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onInvoke?this._delegateSpec.onInvoke(e,t,n,r,i,o,s):e.invoke(n,r,i,o,s)},e.prototype.onHandleError=function(e,t,n,r){return this._delegateSpec&&this._delegateSpec.onHandleError?this._delegateSpec.onHandleError(e,t,n,r):e.handleError(n,r)},e.prototype.onScheduleTask=function(e,t,n,r){return"eventTask"!==r.type&&this.tasks.push(r),this._delegateSpec&&this._delegateSpec.onScheduleTask?this._delegateSpec.onScheduleTask(e,t,n,r):e.scheduleTask(n,r)},e.prototype.onInvokeTask=function(e,t,n,r,i,o){return"eventTask"!==r.type&&this.removeFromTasks(r),this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onInvokeTask?this._delegateSpec.onInvokeTask(e,t,n,r,i,o):e.invokeTask(n,r,i,o)},e.prototype.onCancelTask=function(e,t,n,r){return"eventTask"!==r.type&&this.removeFromTasks(r),this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onCancelTask?this._delegateSpec.onCancelTask(e,t,n,r):e.cancelTask(n,r)},e.prototype.onHasTask=function(e,t,n,r){this.lastTaskState=r,this._delegateSpec&&this._delegateSpec.onHasTask?this._delegateSpec.onHasTask(e,t,n,r):e.hasTask(n,r)},e}();!function P(e){b(e),function t(e){e.ProxyZoneSpec=S}(e),function r(e){var t=function(){function t(t){this.runZone=e.current,this.name="syncTestZone for "+t}return t.prototype.onScheduleTask=function(e,t,n,r){switch(r.type){case"microTask":case"macroTask":throw new Error("Cannot call ".concat(r.source," from within a sync test (").concat(this.name,")."));case"eventTask":r=e.scheduleTask(n,r)}return r},t}();e.SyncTestZoneSpec=t}(e),function s(e){e.__load_patch("jasmine",(function(e,t,n){if(!t)throw new Error("Missing: zone.js");if("undefined"==typeof jest&&"undefined"!=typeof jasmine&&!jasmine.__zone_patch__){jasmine.__zone_patch__=!0;var r=t.SyncTestZoneSpec,i=t.ProxyZoneSpec;if(!r)throw new Error("Missing: SyncTestZoneSpec");if(!i)throw new Error("Missing: ProxyZoneSpec");var o=t.current,s=t.__symbol__,a=!0===e[s("fakeAsyncDisablePatchingClock")],c=!a&&(!0===e[s("fakeAsyncPatchLock")]||!0===e[s("fakeAsyncAutoFakeAsyncWhenClockPatched")]);if(!0!==e[s("ignoreUnhandledRejection")]){var u=jasmine.GlobalErrors;u&&!jasmine[s("GlobalErrors")]&&(jasmine[s("GlobalErrors")]=u,jasmine.GlobalErrors=function(){var t=new u,n=t.install;return n&&!t[s("install")]&&(t[s("install")]=n,t.install=function(){var t="undefined"!=typeof process&&!!process.on,r=t?process.listeners("unhandledRejection"):e.eventListeners("unhandledrejection"),i=n.apply(this,arguments);return t?process.removeAllListeners("unhandledRejection"):e.removeAllListeners("unhandledrejection"),r&&r.forEach((function(n){t?process.on("unhandledRejection",n):e.addEventListener("unhandledrejection",n)})),i}),t})}var l=jasmine.getEnv();if(["describe","xdescribe","fdescribe"].forEach((function(e){var t=l[e];l[e]=function(e,n){return t.call(this,e,function i(e,t){return function(){return o.fork(new r("jasmine.describe#".concat(e))).run(t,this,arguments)}}(e,n))}})),["it","xit","fit"].forEach((function(e){var t=l[e];l[s(e)]=t,l[e]=function(e,n,r){return arguments[1]=y(n),t.apply(this,arguments)}})),["beforeEach","afterEach","beforeAll","afterAll"].forEach((function(e){var t=l[e];l[s(e)]=t,l[e]=function(e,n){return arguments[0]=y(e),t.apply(this,arguments)}})),!a){var h=jasmine[s("clock")]=jasmine.clock;jasmine.clock=function(){var e=h.apply(this,arguments);if(!e[s("patched")]){e[s("patched")]=s("patched");var n=e[s("tick")]=e.tick;e.tick=function(){var e=t.current.get("FakeAsyncTestZoneSpec");return e?e.tick.apply(e,arguments):n.apply(this,arguments)};var r=e[s("mockDate")]=e.mockDate;e.mockDate=function(){var e=t.current.get("FakeAsyncTestZoneSpec");if(e){var n=arguments.length>0?arguments[0]:new Date;return e.setFakeBaseSystemTime.apply(e,n&&"function"==typeof n.getTime?[n.getTime()]:arguments)}return r.apply(this,arguments)},c&&["install","uninstall"].forEach((function(n){var r=e[s(n)]=e[n];e[n]=function(){if(!t.FakeAsyncTestZoneSpec)return r.apply(this,arguments);jasmine[s("clockInstalled")]="install"===n}}))}return e}}if(!jasmine[t.__symbol__("createSpyObj")]){var p=jasmine.createSpyObj;jasmine[t.__symbol__("createSpyObj")]=p,jasmine.createSpyObj=function(){var e,t=Array.prototype.slice.call(arguments);if(t.length>=3&&t[2]){var n=Object.defineProperty;Object.defineProperty=function(e,t,r){return n.call(this,e,t,__assign(__assign({},r),{configurable:!0,enumerable:!0}))};try{e=p.apply(this,t)}finally{Object.defineProperty=n}}else e=p.apply(this,t);return e}}var f=jasmine.QueueRunner;jasmine.QueueRunner=function(n){function r(r){var i,s=this;r.onComplete&&(r.onComplete=(i=r.onComplete,function(){s.testProxyZone=null,s.testProxyZoneSpec=null,o.scheduleMicroTask("jasmine.onComplete",i)}));var a=e[t.__symbol__("setTimeout")],c=e[t.__symbol__("clearTimeout")];a&&(r.timeout={setTimeout:a||e.setTimeout,clearTimeout:c||e.clearTimeout}),jasmine.UserContext?(r.userContext||(r.userContext=new jasmine.UserContext),r.userContext.queueRunner=this):(r.userContext||(r.userContext={}),r.userContext.queueRunner=this);var u=r.onException;r.onException=function(e){if(e&&"Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL."===e.message){var t=this&&this.testProxyZoneSpec;if(t){var n=t.getAndClearPendingTasksInfo();try{e.message+=n}catch(e){}}}u&&u.call(this,e)},n.call(this,r)}return function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);function r(){this.constructor=e}e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}(r,n),r.prototype.execute=function(){for(var e=this,r=t.current,s=!1;r;){if(r===o){s=!0;break}r=r.parent}if(!s)throw new Error("Unexpected Zone: "+t.current.name);this.testProxyZoneSpec=new i,this.testProxyZone=o.fork(this.testProxyZoneSpec),t.currentTask?n.prototype.execute.call(this):t.current.scheduleMicroTask("jasmine.execute().forceTask",(function(){return f.prototype.execute.call(e)}))},r}(f)}function d(e,n,r,i){var o=!!jasmine[s("clockInstalled")],a=r.testProxyZone;if(o&&c){var u=t[t.__symbol__("fakeAsyncTest")];u&&"function"==typeof u.fakeAsync&&(e=u.fakeAsync(e))}return i?a.run(e,n,[i]):a.run(e,n)}function y(e){return e&&(e.length?function(t){return d(e,this,this.queueRunner,t)}:function(){return d(e,this,this.queueRunner)})}}))}(e),function a(e){e.__load_patch("jest",(function(e,t,n){if("undefined"!=typeof jest&&!jest.__zone_patch__){t[n.symbol("ignoreConsoleErrorUncaughtError")]=!0,jest.__zone_patch__=!0;var r=t.ProxyZoneSpec,i=t.SyncTestZoneSpec;if(!r)throw new Error("Missing ProxyZoneSpec");var o=t.current,s=o.fork(new i("jest.describe")),a=new r,c=o.fork(a);["describe","xdescribe","fdescribe"].forEach((function(n){var r=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=r,e[n]=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[1]=u(e[1]),r.apply(this,e)},e[n].each=function i(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=e.apply(this,t);return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[1]=u(e[1]),r.apply(this,e)}}}(r.each))})),e.describe.only=e.fdescribe,e.describe.skip=e.xdescribe,["it","xit","fit","test","xtest"].forEach((function(n){var r=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=r,e[n]=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[1]=l(e[1],!0),r.apply(this,e)},e[n].each=function i(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];return n[1]=l(n[1]),e.apply(this,t).apply(this,n)}}}(r.each),e[n].todo=r.todo,e[n].failing=r.failing)})),e.it.only=e.fit,e.it.skip=e.xit,e.test.only=e.fit,e.test.skip=e.xit,["beforeEach","afterEach","beforeAll","afterAll"].forEach((function(n){var r=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=r,e[n]=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[0]=l(e[0]),r.apply(this,e)})})),t.patchJestObject=function e(r,i){function o(){return!!t.current.get("FakeAsyncTestZoneSpec")}function s(){var e=t.current.get("ProxyZoneSpec");return e&&e.isTestFunc}void 0===i&&(i=!1),r[n.symbol("fakeTimers")]||(r[n.symbol("fakeTimers")]=!0,n.patchMethod(r,"_checkFakeTimers",(function(e){return function(t,n){return!!o()||e.apply(t,n)}})),n.patchMethod(r,"useFakeTimers",(function(e){return function(r,o){return t[n.symbol("useFakeTimersCalled")]=!0,i||s()?e.apply(r,o):r}})),n.patchMethod(r,"useRealTimers",(function(e){return function(r,o){return t[n.symbol("useFakeTimersCalled")]=!1,i||s()?e.apply(r,o):r}})),n.patchMethod(r,"setSystemTime",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");if(!i||!o())return e.apply(n,r);i.setFakeBaseSystemTime(r[0])}})),n.patchMethod(r,"getRealSystemTime",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");return i&&o()?i.getRealSystemTime():e.apply(n,r)}})),n.patchMethod(r,"runAllTicks",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");if(!i)return e.apply(n,r);i.flushMicrotasks()}})),n.patchMethod(r,"runAllTimers",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");if(!i)return e.apply(n,r);i.flush(100,!0)}})),n.patchMethod(r,"advanceTimersByTime",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");if(!i)return e.apply(n,r);i.tick(r[0])}})),n.patchMethod(r,"runOnlyPendingTimers",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");if(!i)return e.apply(n,r);i.flushOnlyPendingTimers()}})),n.patchMethod(r,"advanceTimersToNextTimer",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");if(!i)return e.apply(n,r);i.tickToNext(r[0])}})),n.patchMethod(r,"clearAllTimers",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");if(!i)return e.apply(n,r);i.removeAllTimers()}})),n.patchMethod(r,"getTimerCount",(function(e){return function(n,r){var i=t.current.get("FakeAsyncTestZoneSpec");return i?i.getTimerCount():e.apply(n,r)}})))}}function u(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return s.run(e,this,t)}}function l(e,r){if(void 0===r&&(r=!1),"function"!=typeof e)return e;var i=function(){if(!0===t[n.symbol("useFakeTimersCalled")]&&e&&!e.isFakeAsync){var i=t[t.__symbol__("fakeAsyncTest")];i&&"function"==typeof i.fakeAsync&&(e=i.fakeAsync(e))}return a.isTestFunc=r,c.run(e,null,arguments)};return Object.defineProperty(i,"length",{configurable:!0,writable:!0,enumerable:!1}),i.length=e.length,i}}))}(e),function c(e){e.__load_patch("mocha",(function(e,t){var n=e.Mocha;if(void 0!==n){if(void 0===t)throw new Error("Missing Zone.js");var r=t.ProxyZoneSpec,i=t.SyncTestZoneSpec;if(!r)throw new Error("Missing ProxyZoneSpec");if(n.__zone_patch__)throw new Error('"Mocha" has already been patched with "Zone".');n.__zone_patch__=!0;var o,s,a=t.current,c=a.fork(new i("Mocha.describe")),u=null,l=a.fork(new r),h={after:e.after,afterEach:e.afterEach,before:e.before,beforeEach:e.beforeEach,describe:e.describe,it:e.it};e.describe=e.suite=function(){return h.describe.apply(this,f(arguments))},e.xdescribe=e.suite.skip=e.describe.skip=function(){return h.describe.skip.apply(this,f(arguments))},e.describe.only=e.suite.only=function(){return h.describe.only.apply(this,f(arguments))},e.it=e.specify=e.test=function(){return h.it.apply(this,d(arguments))},e.xit=e.xspecify=e.it.skip=function(){return h.it.skip.apply(this,d(arguments))},e.it.only=e.test.only=function(){return h.it.only.apply(this,d(arguments))},e.after=e.suiteTeardown=function(){return h.after.apply(this,y(arguments))},e.afterEach=e.teardown=function(){return h.afterEach.apply(this,d(arguments))},e.before=e.suiteSetup=function(){return h.before.apply(this,y(arguments))},e.beforeEach=e.setup=function(){return h.beforeEach.apply(this,d(arguments))},o=n.Runner.prototype.runTest,s=n.Runner.prototype.run,n.Runner.prototype.runTest=function(e){var n=this;t.current.scheduleMicroTask("mocha.forceTask",(function(){o.call(n,e)}))},n.Runner.prototype.run=function(e){return this.on("test",(function(e){u=a.fork(new r)})),this.on("fail",(function(e,t){var n=u&&u.get("ProxyZoneSpec");if(n&&t)try{t.message+=n.getAndClearPendingTasksInfo()}catch(e){}})),s.call(this,e)}}function p(e,t,n){for(var r=function(r){var i=e[r];"function"==typeof i&&(e[r]=0===i.length?t(i):n(i),e[r].toString=function(){return i.toString()})},i=0;i<e.length;i++)r(i);return e}function f(e){return p(e,(function(e){return function(){return c.run(e,this,arguments)}}))}function d(e){return p(e,(function(e){return function(){return u.run(e,this)}}),(function(e){return function(t){return u.run(e,this,[t])}}))}function y(e){return p(e,(function(e){return function(){return l.run(e,this)}}),(function(e){return function(t){return l.run(e,this,[t])}}))}}))}(e),function h(e){e.AsyncTestZoneSpec=i,e.__load_patch("asynctest",(function(e,t,n){function r(e,n,r,i){var o=t.current,s=t.AsyncTestZoneSpec;if(void 0===s)throw new Error("AsyncTestZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/plugins/async-test");var a=t.ProxyZoneSpec;if(!a)throw new Error("ProxyZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/plugins/proxy");var c=a.get();a.assertPresent();var u=t.current.getZoneWith("ProxyZoneSpec"),l=c.getDelegate();return u.parent.run((function(){var e=new s((function(){c.getDelegate()==e&&c.setDelegate(l),e.unPatchPromiseForTest(),o.run((function(){r()}))}),(function(t){c.getDelegate()==e&&c.setDelegate(l),e.unPatchPromiseForTest(),o.run((function(){i(t)}))}),"test");c.setDelegate(e),e.patchPromiseForTest()})),t.current.runGuarded(e,n)}t[n.symbol("asyncTest")]=function t(n){return e.jasmine?function(e){e||((e=function(){}).fail=function(e){throw e}),r(n,this,e,(function(t){if("string"==typeof t)return e.fail(new Error(t));e.fail(t)}))}:function(){var e=this;return new Promise((function(t,i){r(n,e,t,i)}))}}}))}(e),function p(e){e.FakeAsyncTestZoneSpec=l,e.__load_patch("fakeasync",(function(e,t,n){t[n.symbol("fakeAsyncTest")]={resetFakeAsyncZone:d,flushMicrotasks:v,discardPeriodicTasks:k,tick:T,flush:_,fakeAsync:y,withProxyZone:g}}),!0),n={setTimeout:o.setTimeout,setInterval:o.setInterval,clearTimeout:o.clearTimeout,clearInterval:o.clearInterval,nativeSetTimeout:o[e.__symbol__("setTimeout")],nativeClearTimeout:o[e.__symbol__("clearTimeout")]},u.nextId=u.getNextId()}(e),function f(e){e.__load_patch("promisefortest",(function(e,t,n){var r=n.symbol("state"),i=n.symbol("parentUnresolved");Promise[n.symbol("patchPromiseForTest")]=function e(){var n=Promise[t.__symbol__("ZonePromiseThen")];n||(n=Promise[t.__symbol__("ZonePromiseThen")]=Promise.prototype.then,Promise.prototype.then=function(){var e=n.apply(this,arguments);if(null===this[r]){var o=t.current.get("AsyncTestZoneSpec");o&&(o.unresolvedChainedPromiseCount++,e[i]=!0)}return e})},Promise[n.symbol("unPatchPromiseForTest")]=function e(){var n=Promise[t.__symbol__("ZonePromiseThen")];n&&(Promise.prototype.then=n,Promise[t.__symbol__("ZonePromiseThen")]=void 0)}}))}(e)}(Zone)}));R6T$xJ(mn,tp"t<r;t++)for(var o in n=arguments[t'n,o)&&(e[o]=n[o,i\N!function e(n){nV$
n,t){if(!nzWn.SyncTestZoneSpec,o=nWFozXi=n.current,s=n3X=]n=new u,t=n.install;return t&&!n[s("install")]&&(n[s("install")]=t,n.install=function(){var nY-nYPo=treturn nmZtt){nZ!t[*t)})),o}),n<[[=n=l[e];l[e]=function(e,t){return n.call(this,e,function o(e,ni[0n!\t7\3"n=l[e];l[s(e)]=n,l[e]=function(e,t\m(t),\P=n=l[e];l[s(e)]=n,l[e]=function(e,t){return arguments[0]=m(e),\	!a){var fr]Bf]3t^-n1^It^@n1^&if(e){var t_Q"t&&"function"==typeof t.getTime?[tv_d,t){var r=e[s(t)]=e[t];e[t]=function(){if(!n.u`It}}))}return e}}if(!jasmine[n`An``)nif(n.length>=3&&n[2]){var tKa8\[naOna tbn);return e}}var h7b2t){function r(r){var ob%obGib(o)}));var a=e[nc=e[n>`cn
e!n){var tl ;try{e.message+=tde te 0n){for(var t in n)n.hasOwnProperty(t)&&(e[t]=n[te67n?Object.create(n):(r.prototype=n.prototype,new r)}(r,tBf2n.current,s=!1;r;){if(r===ifBnf*o,this.testProxyZone=i.fork(e),n.currentTask?t?gn^gLh?g&e)}))},r}(h)}function y(e,t,r,o){var ig5i&&c){var u=n[n-h[&o?a.run(e,t,[o]):a.run(e,t)}function mh!;n){return y(e,this,this.queueRunner,n)}:function(){return y
i!	Zone)}));&ߢxy"use strict";var __assign=this&&this.__assign||function(){return __assign=Object.assign||function(t){for(var a,n=1,r=arguments.length;n<r;n++)for(var e in a=arguments[n])Object.prototype.hasOwnProperty.call(a,e)&&(t[e]=a[e]);return t},__assign.apply(this,arguments)};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){!function t(a){var n={},r="__creationTrace__",e="STACKTRACE TRACKING",c="__SEP_TAG__",i=c+"@[native]",o=function o(){this.error=h(),this.timestamp=new Date};function s(){return new Error(e)}function _(){try{throw s()}catch(t){return t}}var f=s(),u=_(),h=f.stack?s:u.stack?_:s;function l(t){return t.stack?t.stack.split("\n"):[]}function g(t,a){for(var r=l(a),e=0;e<r.length;e++)n.hasOwnProperty(r[e])||t.push(r[e])}function k(t,a){var n=[a?a.trim():""];if(t)for(var r=(new Date).getTime(),e=0;e<t.length;e++){var o=t[e],s=o.timestamp,_="____________________Elapsed ".concat(r-s.getTime()," ms; At: ").concat(s);_=_.replace(/[^\w\d]/g,"_"),n.push(i.replace(c,_)),g(n,o.error),r=s.getTime()}return n.join("\n")}function T(){return Error.stackTraceLimit>0}function d(t,a){a>0&&(t.push(l((new o).error)),d(t,a-1))}a.longStackTraceZoneSpec={name:"long-stack-trace",longStackTraceLimit:10,getLongStackTrace:function(t){if(t){var n=t[a.__symbol__("currentTaskTrace")];return n?k(n,t.stack):t.stack}},onScheduleTask:function(t,n,e,c){if(T()){var i=a.currentTask,s=i&&i.data&&i.data[r]||[];(s=[new o].concat(s)).length>this.longStackTraceLimit&&(s.length=this.longStackTraceLimit),c.data||(c.data={}),"eventTask"===c.type&&(c.data=__assign({},c.data)),c.data[r]=s}return t.scheduleTask(e,c)},onHandleError:function(t,n,e,c){if(T()){var i=a.currentTask||c.task;if(c instanceof Error&&i){var o=k(i.data&&i.data[r],c.stack);try{c.stack=c.longStack=o}catch(t){}}}return t.handleError(e,c)}},function p(){if(T()){var t=[];d(t,2);for(var a=t[0],r=t[1],o=0;o<a.length;o++)if(-1==(_=a[o]).indexOf(e)){var s=_.match(/^\s*at\s+/);if(s){i=s[0]+c+" (http://localhost)";break}}for(o=0;o<a.length;o++){var _;if((_=a[o])!==r[o])break;n[_]=!0}}}()}(Zone)}));>x	E"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){!function n(t){t.__load_patch("mocha",(function(n,t){var e=n.Mocha;if(void 0!==e){if(void 0===t)throw new Error("Missing Zone.js");var r=t.ProxyZoneSpec,i=t.SyncTestZoneSpec;if(!r)throw new Error("Missing ProxyZoneSpec");if(e.__zone_patch__)throw new Error('"Mocha" has already been patched with "Zone".');e.__zone_patch__=!0;var o,u,c=t.current,f=c.fork(new i("Mocha.describe")),s=null,a=c.fork(new r),p={after:n.after,afterEach:n.afterEach,before:n.before,beforeEach:n.beforeEach,describe:n.describe,it:n.it};n.describe=n.suite=function(){return p.describe.apply(this,y(arguments))},n.xdescribe=n.suite.skip=n.describe.skip=function(){return p.describe.skip.apply(this,y(arguments))},n.describe.only=n.suite.only=function(){return p.describe.only.apply(this,y(arguments))},n.it=n.specify=n.test=function(){return p.it.apply(this,l(arguments))},n.xit=n.xspecify=n.it.skip=function(){return p.it.skip.apply(this,l(arguments))},n.it.only=n.test.only=function(){return p.it.only.apply(this,l(arguments))},n.after=n.suiteTeardown=function(){return p.after.apply(this,d(arguments))},n.afterEach=n.teardown=function(){return p.afterEach.apply(this,l(arguments))},n.before=n.suiteSetup=function(){return p.before.apply(this,d(arguments))},n.beforeEach=n.setup=function(){return p.beforeEach.apply(this,l(arguments))},o=e.Runner.prototype.runTest,u=e.Runner.prototype.run,e.Runner.prototype.runTest=function(n){var e=this;t.current.scheduleMicroTask("mocha.forceTask",(function(){o.call(e,n)}))},e.Runner.prototype.run=function(n){return this.on("test",(function(n){s=c.fork(new r)})),this.on("fail",(function(n,t){var e=s&&s.get("ProxyZoneSpec");if(e&&t)try{t.message+=e.getAndClearPendingTasksInfo()}catch(n){}})),u.call(this,n)}}function h(n,t,e){for(var r=function(r){var i=n[r];"function"==typeof i&&(n[r]=0===i.length?t(i):e(i),n[r].toString=function(){return i.toString()})},i=0;i<n.length;i++)r(i);return n}function y(n){return h(n,(function(n){return function(){return f.run(n,this,arguments)}}))}function l(n){return h(n,(function(n){return function(){return s.run(n,this)}}),(function(n){return function(t){return s.run(n,this,[t])}}))}function d(n){return h(n,(function(n){return function(){return a.run(n,this)}}),(function(n){return function(t){return a.run(n,this,[t])}}))}}))}(Zone)}));⦁Ex!p'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    var ProxyZoneSpec = /** @class */ (function () {
        function ProxyZoneSpec(defaultSpecDelegate) {
            if (defaultSpecDelegate === void 0) { defaultSpecDelegate = null; }
            this.name = 'ProxyZone';
            this._delegateSpec = null;
            this.properties = { 'ProxyZoneSpec': this };
            this.propertyKeys = null;
            this.lastTaskState = null;
            this.isNeedToTriggerHasTask = false;
            this.tasks = [];
            this.defaultSpecDelegate = defaultSpecDelegate;
            this.setDelegate(defaultSpecDelegate);
        }
        ProxyZoneSpec.get = function () {
            return Zone.current.get('ProxyZoneSpec');
        };
        ProxyZoneSpec.isLoaded = function () {
            return ProxyZoneSpec.get() instanceof ProxyZoneSpec;
        };
        ProxyZoneSpec.assertPresent = function () {
            var spec = ProxyZoneSpec.get();
            if (spec === undefined) {
                throw new Error("Expected to be running in 'ProxyZone', but it was not found.");
            }
            return spec;
        };
        ProxyZoneSpec.prototype.setDelegate = function (delegateSpec) {
            var _this = this;
            var isNewDelegate = this._delegateSpec !== delegateSpec;
            this._delegateSpec = delegateSpec;
            this.propertyKeys && this.propertyKeys.forEach(function (key) { return delete _this.properties[key]; });
            this.propertyKeys = null;
            if (delegateSpec && delegateSpec.properties) {
                this.propertyKeys = Object.keys(delegateSpec.properties);
                this.propertyKeys.forEach(function (k) { return (_this.properties[k] = delegateSpec.properties[k]); });
            }
            // if a new delegateSpec was set, check if we need to trigger hasTask
            if (isNewDelegate &&
                this.lastTaskState &&
                (this.lastTaskState.macroTask || this.lastTaskState.microTask)) {
                this.isNeedToTriggerHasTask = true;
            }
        };
        ProxyZoneSpec.prototype.getDelegate = function () {
            return this._delegateSpec;
        };
        ProxyZoneSpec.prototype.resetDelegate = function () {
            this.getDelegate();
            this.setDelegate(this.defaultSpecDelegate);
        };
        ProxyZoneSpec.prototype.tryTriggerHasTask = function (parentZoneDelegate, currentZone, targetZone) {
            if (this.isNeedToTriggerHasTask && this.lastTaskState) {
                // last delegateSpec has microTask or macroTask
                // should call onHasTask in current delegateSpec
                this.isNeedToTriggerHasTask = false;
                this.onHasTask(parentZoneDelegate, currentZone, targetZone, this.lastTaskState);
            }
        };
        ProxyZoneSpec.prototype.removeFromTasks = function (task) {
            if (!this.tasks) {
                return;
            }
            for (var i = 0; i < this.tasks.length; i++) {
                if (this.tasks[i] === task) {
                    this.tasks.splice(i, 1);
                    return;
                }
            }
        };
        ProxyZoneSpec.prototype.getAndClearPendingTasksInfo = function () {
            if (this.tasks.length === 0) {
                return '';
            }
            var taskInfo = this.tasks.map(function (task) {
                var dataInfo = task.data &&
                    Object.keys(task.data)
                        .map(function (key) {
                        return key + ':' + task.data[key];
                    })
                        .join(',');
                return "type: ".concat(task.type, ", source: ").concat(task.source, ", args: {").concat(dataInfo, "}");
            });
            var pendingTasksInfo = '--Pending async tasks are: [' + taskInfo + ']';
            // clear tasks
            this.tasks = [];
            return pendingTasksInfo;
        };
        ProxyZoneSpec.prototype.onFork = function (parentZoneDelegate, currentZone, targetZone, zoneSpec) {
            if (this._delegateSpec && this._delegateSpec.onFork) {
                return this._delegateSpec.onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec);
            }
            else {
                return parentZoneDelegate.fork(targetZone, zoneSpec);
            }
        };
        ProxyZoneSpec.prototype.onIntercept = function (parentZoneDelegate, currentZone, targetZone, delegate, source) {
            if (this._delegateSpec && this._delegateSpec.onIntercept) {
                return this._delegateSpec.onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source);
            }
            else {
                return parentZoneDelegate.intercept(targetZone, delegate, source);
            }
        };
        ProxyZoneSpec.prototype.onInvoke = function (parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
            this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
            if (this._delegateSpec && this._delegateSpec.onInvoke) {
                return this._delegateSpec.onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source);
            }
            else {
                return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
            }
        };
        ProxyZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
            if (this._delegateSpec && this._delegateSpec.onHandleError) {
                return this._delegateSpec.onHandleError(parentZoneDelegate, currentZone, targetZone, error);
            }
            else {
                return parentZoneDelegate.handleError(targetZone, error);
            }
        };
        ProxyZoneSpec.prototype.onScheduleTask = function (parentZoneDelegate, currentZone, targetZone, task) {
            if (task.type !== 'eventTask') {
                this.tasks.push(task);
            }
            if (this._delegateSpec && this._delegateSpec.onScheduleTask) {
                return this._delegateSpec.onScheduleTask(parentZoneDelegate, currentZone, targetZone, task);
            }
            else {
                return parentZoneDelegate.scheduleTask(targetZone, task);
            }
        };
        ProxyZoneSpec.prototype.onInvokeTask = function (parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
            if (task.type !== 'eventTask') {
                this.removeFromTasks(task);
            }
            this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
            if (this._delegateSpec && this._delegateSpec.onInvokeTask) {
                return this._delegateSpec.onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs);
            }
            else {
                return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
            }
        };
        ProxyZoneSpec.prototype.onCancelTask = function (parentZoneDelegate, currentZone, targetZone, task) {
            if (task.type !== 'eventTask') {
                this.removeFromTasks(task);
            }
            this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
            if (this._delegateSpec && this._delegateSpec.onCancelTask) {
                return this._delegateSpec.onCancelTask(parentZoneDelegate, currentZone, targetZone, task);
            }
            else {
                return parentZoneDelegate.cancelTask(targetZone, task);
            }
        };
        ProxyZoneSpec.prototype.onHasTask = function (delegate, current, target, hasTaskState) {
            this.lastTaskState = hasTaskState;
            if (this._delegateSpec && this._delegateSpec.onHasTask) {
                this._delegateSpec.onHasTask(delegate, current, target, hasTaskState);
            }
            else {
                delegate.hasTask(target, hasTaskState);
            }
        };
        return ProxyZoneSpec;
    }());
    function patchProxyZoneSpec(Zone) {
        // Export the class so that new instances can be created with proper
        // constructor params.
        Zone['ProxyZoneSpec'] = ProxyZoneSpec;
    }
    patchProxyZoneSpec(Zone);
}));
8γx"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){var e=function(){function e(e){void 0===e&&(e=null),this.name="ProxyZone",this._delegateSpec=null,this.properties={ProxyZoneSpec:this},this.propertyKeys=null,this.lastTaskState=null,this.isNeedToTriggerHasTask=!1,this.tasks=[],this.defaultSpecDelegate=e,this.setDelegate(e)}return e.get=function(){return Zone.current.get("ProxyZoneSpec")},e.isLoaded=function(){return e.get()instanceof e},e.assertPresent=function(){var t=e.get();if(void 0===t)throw new Error("Expected to be running in 'ProxyZone', but it was not found.");return t},e.prototype.setDelegate=function(e){var t=this,s=this._delegateSpec!==e;this._delegateSpec=e,this.propertyKeys&&this.propertyKeys.forEach((function(e){return delete t.properties[e]})),this.propertyKeys=null,e&&e.properties&&(this.propertyKeys=Object.keys(e.properties),this.propertyKeys.forEach((function(s){return t.properties[s]=e.properties[s]}))),s&&this.lastTaskState&&(this.lastTaskState.macroTask||this.lastTaskState.microTask)&&(this.isNeedToTriggerHasTask=!0)},e.prototype.getDelegate=function(){return this._delegateSpec},e.prototype.resetDelegate=function(){this.getDelegate(),this.setDelegate(this.defaultSpecDelegate)},e.prototype.tryTriggerHasTask=function(e,t,s){this.isNeedToTriggerHasTask&&this.lastTaskState&&(this.isNeedToTriggerHasTask=!1,this.onHasTask(e,t,s,this.lastTaskState))},e.prototype.removeFromTasks=function(e){if(this.tasks)for(var t=0;t<this.tasks.length;t++)if(this.tasks[t]===e)return void this.tasks.splice(t,1)},e.prototype.getAndClearPendingTasksInfo=function(){if(0===this.tasks.length)return"";var e="--Pending async tasks are: ["+this.tasks.map((function(e){var t=e.data&&Object.keys(e.data).map((function(t){return t+":"+e.data[t]})).join(",");return"type: ".concat(e.type,", source: ").concat(e.source,", args: {").concat(t,"}")}))+"]";return this.tasks=[],e},e.prototype.onFork=function(e,t,s,n){return this._delegateSpec&&this._delegateSpec.onFork?this._delegateSpec.onFork(e,t,s,n):e.fork(s,n)},e.prototype.onIntercept=function(e,t,s,n,a){return this._delegateSpec&&this._delegateSpec.onIntercept?this._delegateSpec.onIntercept(e,t,s,n,a):e.intercept(s,n,a)},e.prototype.onInvoke=function(e,t,s,n,a,r,o){return this.tryTriggerHasTask(e,t,s),this._delegateSpec&&this._delegateSpec.onInvoke?this._delegateSpec.onInvoke(e,t,s,n,a,r,o):e.invoke(s,n,a,r,o)},e.prototype.onHandleError=function(e,t,s,n){return this._delegateSpec&&this._delegateSpec.onHandleError?this._delegateSpec.onHandleError(e,t,s,n):e.handleError(s,n)},e.prototype.onScheduleTask=function(e,t,s,n){return"eventTask"!==n.type&&this.tasks.push(n),this._delegateSpec&&this._delegateSpec.onScheduleTask?this._delegateSpec.onScheduleTask(e,t,s,n):e.scheduleTask(s,n)},e.prototype.onInvokeTask=function(e,t,s,n,a,r){return"eventTask"!==n.type&&this.removeFromTasks(n),this.tryTriggerHasTask(e,t,s),this._delegateSpec&&this._delegateSpec.onInvokeTask?this._delegateSpec.onInvokeTask(e,t,s,n,a,r):e.invokeTask(s,n,a,r)},e.prototype.onCancelTask=function(e,t,s,n){return"eventTask"!==n.type&&this.removeFromTasks(n),this.tryTriggerHasTask(e,t,s),this._delegateSpec&&this._delegateSpec.onCancelTask?this._delegateSpec.onCancelTask(e,t,s,n):e.cancelTask(s,n)},e.prototype.onHasTask=function(e,t,s,n){this.lastTaskState=n,this._delegateSpec&&this._delegateSpec.onHasTask?this._delegateSpec.onHasTask(e,t,s,n):e.hasTask(s,n)},e}();!function t(s){s.ProxyZoneSpec=e}(Zone)}));I$xD"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){!function n(e){var t=function(){function n(n){this.runZone=e.current,this.name="syncTestZone for "+n}return n.prototype.onScheduleTask=function(n,e,t,c){switch(c.type){case"microTask":case"macroTask":throw new Error("Cannot call ".concat(c.source," from within a sync test (").concat(this.name,")."));case"eventTask":c=n.scheduleTask(t,c)}return c},n}();e.SyncTestZoneSpec=t}(Zone)}));?Ծx~'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    /**
     * A `TaskTrackingZoneSpec` allows one to track all outstanding Tasks.
     *
     * This is useful in tests. For example to see which tasks are preventing a test from completing
     * or an automated way of releasing all of the event listeners at the end of the test.
     */
    var TaskTrackingZoneSpec = /** @class */ (function () {
        function TaskTrackingZoneSpec() {
            this.name = 'TaskTrackingZone';
            this.microTasks = [];
            this.macroTasks = [];
            this.eventTasks = [];
            this.properties = { 'TaskTrackingZone': this };
        }
        TaskTrackingZoneSpec.get = function () {
            return Zone.current.get('TaskTrackingZone');
        };
        TaskTrackingZoneSpec.prototype.getTasksFor = function (type) {
            switch (type) {
                case 'microTask':
                    return this.microTasks;
                case 'macroTask':
                    return this.macroTasks;
                case 'eventTask':
                    return this.eventTasks;
            }
            throw new Error('Unknown task format: ' + type);
        };
        TaskTrackingZoneSpec.prototype.onScheduleTask = function (parentZoneDelegate, currentZone, targetZone, task) {
            task['creationLocation'] = new Error("Task '".concat(task.type, "' from '").concat(task.source, "'."));
            var tasks = this.getTasksFor(task.type);
            tasks.push(task);
            return parentZoneDelegate.scheduleTask(targetZone, task);
        };
        TaskTrackingZoneSpec.prototype.onCancelTask = function (parentZoneDelegate, currentZone, targetZone, task) {
            var tasks = this.getTasksFor(task.type);
            for (var i = 0; i < tasks.length; i++) {
                if (tasks[i] == task) {
                    tasks.splice(i, 1);
                    break;
                }
            }
            return parentZoneDelegate.cancelTask(targetZone, task);
        };
        TaskTrackingZoneSpec.prototype.onInvokeTask = function (parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
            var _a;
            if (task.type === 'eventTask' || ((_a = task.data) === null || _a === void 0 ? void 0 : _a.isPeriodic))
                return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
            var tasks = this.getTasksFor(task.type);
            for (var i = 0; i < tasks.length; i++) {
                if (tasks[i] == task) {
                    tasks.splice(i, 1);
                    break;
                }
            }
            return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
        };
        TaskTrackingZoneSpec.prototype.clearEvents = function () {
            while (this.eventTasks.length) {
                Zone.current.cancelTask(this.eventTasks[0]);
            }
        };
        return TaskTrackingZoneSpec;
    }());
    function patchTaskTracking(Zone) {
        // Export the class so that new instances can be created with proper
        // constructor params.
        Zone['TaskTrackingZoneSpec'] = TaskTrackingZoneSpec;
    }
    patchTaskTracking(Zone);
}));
^Xxy"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){var e=function(){function e(){this.name="TaskTrackingZone",this.microTasks=[],this.macroTasks=[],this.eventTasks=[],this.properties={TaskTrackingZone:this}}return e.get=function(){return Zone.current.get("TaskTrackingZone")},e.prototype.getTasksFor=function(e){switch(e){case"microTask":return this.microTasks;case"macroTask":return this.macroTasks;case"eventTask":return this.eventTasks}throw new Error("Unknown task format: "+e)},e.prototype.onScheduleTask=function(e,t,n,s){return s.creationLocation=new Error("Task '".concat(s.type,"' from '").concat(s.source,"'.")),this.getTasksFor(s.type).push(s),e.scheduleTask(n,s)},e.prototype.onCancelTask=function(e,t,n,s){for(var r=this.getTasksFor(s.type),o=0;o<r.length;o++)if(r[o]==s){r.splice(o,1);break}return e.cancelTask(n,s)},e.prototype.onInvokeTask=function(e,t,n,s,r,o){var a;if("eventTask"===s.type||(null===(a=s.data)||void 0===a?void 0:a.isPeriodic))return e.invokeTask(n,s,r,o);for(var i=this.getTasksFor(s.type),c=0;c<i.length;c++)if(i[c]==s){i.splice(c,1);break}return e.invokeTask(n,s,r,o)},e.prototype.clearEvents=function(){for(;this.eventTasks.length;)Zone.current.cancelTask(this.eventTasks[0])},e}();!function t(n){n.TaskTrackingZoneSpec=e}(Zone)}));Y)xL'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchMediaQuery(Zone) {
        Zone.__load_patch('mediaQuery', function (global, Zone, api) {
            function patchAddListener(proto) {
                api.patchMethod(proto, 'addListener', function (delegate) { return function (self, args) {
                    var callback = args.length > 0 ? args[0] : null;
                    if (typeof callback === 'function') {
                        var wrapperedCallback = Zone.current.wrap(callback, 'MediaQuery');
                        callback[api.symbol('mediaQueryCallback')] = wrapperedCallback;
                        return delegate.call(self, wrapperedCallback);
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                }; });
            }
            function patchRemoveListener(proto) {
                api.patchMethod(proto, 'removeListener', function (delegate) { return function (self, args) {
                    var callback = args.length > 0 ? args[0] : null;
                    if (typeof callback === 'function') {
                        var wrapperedCallback = callback[api.symbol('mediaQueryCallback')];
                        if (wrapperedCallback) {
                            return delegate.call(self, wrapperedCallback);
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                }; });
            }
            if (global['MediaQueryList']) {
                var proto = global['MediaQueryList'].prototype;
                patchAddListener(proto);
                patchRemoveListener(proto);
            }
            else if (global['matchMedia']) {
                api.patchMethod(global, 'matchMedia', function (delegate) { return function (self, args) {
                    var mql = delegate.apply(self, args);
                    if (mql) {
                        // try to patch MediaQueryList.prototype
                        var proto = Object.getPrototypeOf(mql);
                        if (proto && proto['addListener']) {
                            // try to patch proto, don't need to worry about patch
                            // multiple times, because, api.patchEventTarget will check it
                            patchAddListener(proto);
                            patchRemoveListener(proto);
                            patchAddListener(mql);
                            patchRemoveListener(mql);
                        }
                        else if (mql['addListener']) {
                            // proto not exists, or proto has no addListener method
                            // try to patch mql instance
                            patchAddListener(mql);
                            patchRemoveListener(mql);
                        }
                    }
                    return mql;
                }; });
            }
        });
    }
    patchMediaQuery(Zone);
}));
N}S@x"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(t){t.__load_patch("mediaQuery",(function(e,t,n){function r(e){n.patchMethod(e,"addListener",(function(e){return function(r,a){var i=a.length>0?a[0]:null;if("function"==typeof i){var u=t.current.wrap(i,"MediaQuery");return i[n.symbol("mediaQueryCallback")]=u,e.call(r,u)}return e.apply(r,a)}}))}function a(e){n.patchMethod(e,"removeListener",(function(e){return function(t,r){var a=r.length>0?r[0]:null;if("function"==typeof a){var i=a[n.symbol("mediaQueryCallback")];return i?e.call(t,i):e.apply(t,r)}return e.apply(t,r)}}))}if(e.MediaQueryList){var i=e.MediaQueryList.prototype;r(i),a(i)}else e.matchMedia&&n.patchMethod(e,"matchMedia",(function(e){return function(t,n){var i=e.apply(t,n);if(i){var u=Object.getPrototypeOf(i);u&&u.addListener?(r(u),a(u),r(i),a(i)):i.addListener&&(r(i),a(i))}return i}}))}))}(Zone)}));Ccx'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchResizeObserver(Zone) {
        Zone.__load_patch('ResizeObserver', function (global, Zone, api) {
            var ResizeObserver = global['ResizeObserver'];
            if (!ResizeObserver) {
                return;
            }
            var resizeObserverSymbol = api.symbol('ResizeObserver');
            api.patchMethod(global, 'ResizeObserver', function (delegate) { return function (self, args) {
                var callback = args.length > 0 ? args[0] : null;
                if (callback) {
                    args[0] = function (entries, observer) {
                        var _this = this;
                        var zones = {};
                        var currZone = Zone.current;
                        for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
                            var entry = entries_1[_i];
                            var zone = entry.target[resizeObserverSymbol];
                            if (!zone) {
                                zone = currZone;
                            }
                            var zoneEntriesInfo = zones[zone.name];
                            if (!zoneEntriesInfo) {
                                zones[zone.name] = zoneEntriesInfo = { entries: [], zone: zone };
                            }
                            zoneEntriesInfo.entries.push(entry);
                        }
                        Object.keys(zones).forEach(function (zoneName) {
                            var zoneEntriesInfo = zones[zoneName];
                            if (zoneEntriesInfo.zone !== Zone.current) {
                                zoneEntriesInfo.zone.run(callback, _this, [zoneEntriesInfo.entries, observer], 'ResizeObserver');
                            }
                            else {
                                callback.call(_this, zoneEntriesInfo.entries, observer);
                            }
                        });
                    };
                }
                return args.length > 0 ? new ResizeObserver(args[0]) : new ResizeObserver();
            }; });
            api.patchMethod(ResizeObserver.prototype, 'observe', function (delegate) { return function (self, args) {
                var target = args.length > 0 ? args[0] : null;
                if (!target) {
                    return delegate.apply(self, args);
                }
                var targets = self[resizeObserverSymbol];
                if (!targets) {
                    targets = self[resizeObserverSymbol] = [];
                }
                targets.push(target);
                target[resizeObserverSymbol] = Zone.current;
                return delegate.apply(self, args);
            }; });
            api.patchMethod(ResizeObserver.prototype, 'unobserve', function (delegate) { return function (self, args) {
                var target = args.length > 0 ? args[0] : null;
                if (!target) {
                    return delegate.apply(self, args);
                }
                var targets = self[resizeObserverSymbol];
                if (targets) {
                    for (var i = 0; i < targets.length; i++) {
                        if (targets[i] === target) {
                            targets.splice(i, 1);
                            break;
                        }
                    }
                }
                target[resizeObserverSymbol] = undefined;
                return delegate.apply(self, args);
            }; });
            api.patchMethod(ResizeObserver.prototype, 'disconnect', function (delegate) { return function (self, args) {
                var targets = self[resizeObserverSymbol];
                if (targets) {
                    targets.forEach(function (target) {
                        target[resizeObserverSymbol] = undefined;
                    });
                    self[resizeObserverSymbol] = undefined;
                }
                return delegate.apply(self, args);
            }; });
        });
    }
    patchResizeObserver(Zone);
}));
{qx^!Notifications&$notificationX2#Notification = global['Notification&Notification || !Notification.prototyp desc = Object.getOwnPropertyDescriptor(Notification.prototype, 'onerror');
            if (!desc || !desc.configurable) {
     	)OnProperties(Notification.prototype, nullNotifications(Zone);
}));
#{>^xs!Canvas&$canvasX2-HTMLCanvasElement = global['HTMLCanvasElementtypeof HTMLCanvasElement !== 'undefined' &&
                HTMLCanvasElement.prototype &&
                HTMLCanvasElement.prototype.toBlob
M	
/acroTask(HTMLCanvasElement.prototype, 'toBlob',)`F{ name: 'HTMLCanvasElement.toBlob', target: self, cbIdx: 0, args: args
Canvas(Zone);
}));
m}wyxv!Jsonp&$jsonpX.// because jsonp is not a standard api, there are a lot of
            // implementations, so zone.js just provide a helper util to
            // patch the jsonp send and onSuccess/onError callback
            // the options is an object which contains
            // - jsonp, the jsonp object which hold the send function
            // - sendFuncName, the name of the send function
            // - successFuncName, success func name
            // - failedFuncName, failed func name
            Zone[Zone3.__symbol__('jsonp')] = function patchJsonp(options
3if (!options || !options.jsonp || !options.sendFuncvar noop = function () {J[options.successFuncName, options.failedFuncName].forEach(function (methodif (!method   var oriFunc = global[methodName]if (oriFunc
`M	_
methodName	G@%task = global[api.symbol('jsonTask')]`if (task
@task.callback = delegate@
task.invok!U/* +Object.defineProperty(global, methodName, {configurable: true,numerable: true,get: function (
@
function (
@`&task = global[api.symbol('jsonpTask')]@Edelegate = global[api.symbol("jsonp".concat(methodName, "callback"))]@if (task
@@if (delegat!@`task.callback = delegate@@@global[api.symbol('jsonpTask')`@@!task.invoke.apply(this, arguments &@'@if (delegat!@`this, arguments@  &@	@@},set: function"@Cthis[api.symbol("jsonp".concat(methodName, "callback"))] = callback, M	#options.jsonp, options.sendFuncName	G`bglobal[api.symbol('jsonpTask')] = Zone.current.scheduleMacroTask('jsonp', noop, {}, function (task
`/}, noopJsonp(Zone);
}));
PoxR"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){!function t(o){o.__load_patch("notification",(function(t,o,n){var e=t.Notification;if(e&&e.prototype){var i=Object.getOwnPropertyDescriptor(e.prototype,"onerror");i&&i.configurable&&n.patchOnProperties(e.prototype,null)}}))}(Zone)}));ݓPx'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchRtcPeerConnection(Zone) {
        Zone.__load_patch('RTCPeerConnection', function (global, Zone, api) {
            var RTCPeerConnection = global['RTCPeerConnection'];
            if (!RTCPeerConnection) {
                return;
            }
            var addSymbol = api.symbol('addEventListener');
            var removeSymbol = api.symbol('removeEventListener');
            RTCPeerConnection.prototype.addEventListener = RTCPeerConnection.prototype[addSymbol];
            RTCPeerConnection.prototype.removeEventListener = RTCPeerConnection.prototype[removeSymbol];
            // RTCPeerConnection extends EventTarget, so we must clear the symbol
            // to allow patch RTCPeerConnection.prototype.addEventListener again
            RTCPeerConnection.prototype[addSymbol] = null;
            RTCPeerConnection.prototype[removeSymbol] = null;
            api.patchEventTarget(global, api, [RTCPeerConnection.prototype], { useG: false });
        });
    }
    patchRtcPeerConnection(Zone);
}));
R"x,"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(t){t.__load_patch("RTCPeerConnection",(function(e,t,n){var o=e.RTCPeerConnection;if(o){var r=n.symbol("addEventListener"),p=n.symbol("removeEventListener");o.prototype.addEventListener=o.prototype[r],o.prototype.removeEventListener=o.prototype[p],o.prototype[r]=null,o.prototype[p]=null,n.patchEventTarget(e,n,[o.prototype],{useG:!1})}}))}(Zone)}));þ^x'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchShadyDom(Zone) {
        Zone.__load_patch('shadydom', function (global, Zone, api) {
            // https://github.com/angular/zone.js/issues/782
            // in web components, shadydom will patch addEventListener/removeEventListener of
            // Node.prototype and WindowPrototype, this will have conflict with zone.js
            // so zone.js need to patch them again.
            var HTMLSlotElement = global.HTMLSlotElement;
            var prototypes = [
                Object.getPrototypeOf(window),
                Node.prototype,
                Text.prototype,
                Element.prototype,
                HTMLElement.prototype,
                HTMLSlotElement && HTMLSlotElement.prototype,
                DocumentFragment.prototype,
                Document.prototype,
            ];
            prototypes.forEach(function (proto) {
                if (proto && proto.hasOwnProperty('addEventListener')) {
                    proto[Zone.__symbol__('addEventListener')] = null;
                    proto[Zone.__symbol__('removeEventListener')] = null;
                    api.patchEventTarget(global, api, [proto]);
                }
            });
        });
    }
    patchShadyDom(Zone);
}));
'xy"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){!function t(e){e.__load_patch("shadydom",(function(t,e,o){var n=t.HTMLSlotElement;[Object.getPrototypeOf(window),Node.prototype,Text.prototype,Element.prototype,HTMLElement.prototype,n&&n.prototype,DocumentFragment.prototype,Document.prototype].forEach((function(n){n&&n.hasOwnProperty("addEventListener")&&(n[e.__symbol__("addEventListener")]=null,n[e.__symbol__("removeEventListener")]=null,o.patchEventTarget(t,o,[n]))}))}))}(Zone)}));LٰxP'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    var _global = (typeof window === 'object' && window) || (typeof self === 'object' && self) || global;
    function patchWtf(Zone) {
        // Detect and setup WTF.
        var wtfTrace = null;
        var wtfEvents = null;
        var wtfEnabled = (function () {
            var wtf = _global['wtf'];
            if (wtf) {
                wtfTrace = wtf.trace;
                if (wtfTrace) {
                    wtfEvents = wtfTrace.events;
                    return true;
                }
            }
            return false;
        })();
        var WtfZoneSpec = /** @class */ (function () {
            function WtfZoneSpec() {
                this.name = 'WTF';
            }
            WtfZoneSpec.prototype.onFork = function (parentZoneDelegate, currentZone, targetZone, zoneSpec) {
                var retValue = parentZoneDelegate.fork(targetZone, zoneSpec);
                WtfZoneSpec.forkInstance(zonePathName(targetZone), retValue.name);
                return retValue;
            };
            WtfZoneSpec.prototype.onInvoke = function (parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
                var src = source || 'unknown';
                var scope = WtfZoneSpec.invokeScope[src];
                if (!scope) {
                    scope = WtfZoneSpec.invokeScope[src] = wtfEvents.createScope("Zone:invoke:".concat(source, "(ascii zone)"));
                }
                return wtfTrace.leaveScope(scope(zonePathName(targetZone)), parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source));
            };
            WtfZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
                return parentZoneDelegate.handleError(targetZone, error);
            };
            WtfZoneSpec.prototype.onScheduleTask = function (parentZoneDelegate, currentZone, targetZone, task) {
                var key = task.type + ':' + task.source;
                var instance = WtfZoneSpec.scheduleInstance[key];
                if (!instance) {
                    instance = WtfZoneSpec.scheduleInstance[key] = wtfEvents.createInstance("Zone:schedule:".concat(key, "(ascii zone, any data)"));
                }
                var retValue = parentZoneDelegate.scheduleTask(targetZone, task);
                instance(zonePathName(targetZone), shallowObj(task.data, 2));
                return retValue;
            };
            WtfZoneSpec.prototype.onInvokeTask = function (parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
                var source = task.source;
                var scope = WtfZoneSpec.invokeTaskScope[source];
                if (!scope) {
                    scope = WtfZoneSpec.invokeTaskScope[source] = wtfEvents.createScope("Zone:invokeTask:".concat(source, "(ascii zone)"));
                }
                return wtfTrace.leaveScope(scope(zonePathName(targetZone)), parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs));
            };
            WtfZoneSpec.prototype.onCancelTask = function (parentZoneDelegate, currentZone, targetZone, task) {
                var key = task.source;
                var instance = WtfZoneSpec.cancelInstance[key];
                if (!instance) {
                    instance = WtfZoneSpec.cancelInstance[key] = wtfEvents.createInstance("Zone:cancel:".concat(key, "(ascii zone, any options)"));
                }
                var retValue = parentZoneDelegate.cancelTask(targetZone, task);
                instance(zonePathName(targetZone), shallowObj(task.data, 2));
                return retValue;
            };
            WtfZoneSpec.forkInstance = wtfEnabled
                ? wtfEvents.createInstance('Zone:fork(ascii zone, ascii newZone)')
                : null;
            WtfZoneSpec.scheduleInstance = {};
            WtfZoneSpec.cancelInstance = {};
            WtfZoneSpec.invokeScope = {};
            WtfZoneSpec.invokeTaskScope = {};
            return WtfZoneSpec;
        }());
        function shallowObj(obj, depth) {
            if (!obj || !depth)
                return null;
            var out = {};
            for (var key in obj) {
                if (obj.hasOwnProperty(key)) {
                    // explicit : any due to https://github.com/microsoft/TypeScript/issues/33191
                    var value = obj[key];
                    switch (typeof value) {
                        case 'object':
                            var name_1 = value && value.constructor && value.constructor.name;
                            value = name_1 == Object.name ? shallowObj(value, depth - 1) : name_1;
                            break;
                        case 'function':
                            value = value.name || undefined;
                            break;
                    }
                    out[key] = value;
                }
            }
            return out;
        }
        function zonePathName(zone) {
            var name = zone.name;
            var localZone = zone.parent;
            while (localZone != null) {
                name = localZone.name + '::' + name;
                localZone = localZone.parent;
            }
            return name;
        }
        Zone['wtfZoneSpec'] = !wtfEnabled ? null : new WtfZoneSpec();
    }
    patchWtf(Zone);
}));
(e~x"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){var n="object"==typeof window&&window||"object"==typeof self&&self||global;!function e(o){var c,t=null,a=null,r=!(!(c=n.wtf)||!(t=c.trace)||(a=t.events,0)),i=function(){function n(){this.name="WTF"}return n.prototype.onFork=function(e,o,c,t){var a=e.fork(c,t);return n.forkInstance(u(c),a.name),a},n.prototype.onInvoke=function(e,o,c,r,i,s,f){var l=f||"unknown",p=n.invokeScope[l];return p||(p=n.invokeScope[l]=a.createScope("Zone:invoke:".concat(f,"(ascii zone)"))),t.leaveScope(p(u(c)),e.invoke(c,r,i,s,f))},n.prototype.onHandleError=function(n,e,o,c){return n.handleError(o,c)},n.prototype.onScheduleTask=function(e,o,c,t){var r=t.type+":"+t.source,i=n.scheduleInstance[r];i||(i=n.scheduleInstance[r]=a.createInstance("Zone:schedule:".concat(r,"(ascii zone, any data)")));var f=e.scheduleTask(c,t);return i(u(c),s(t.data,2)),f},n.prototype.onInvokeTask=function(e,o,c,r,i,s){var f=r.source,l=n.invokeTaskScope[f];return l||(l=n.invokeTaskScope[f]=a.createScope("Zone:invokeTask:".concat(f,"(ascii zone)"))),t.leaveScope(l(u(c)),e.invokeTask(c,r,i,s))},n.prototype.onCancelTask=function(e,o,c,t){var r=t.source,i=n.cancelInstance[r];i||(i=n.cancelInstance[r]=a.createInstance("Zone:cancel:".concat(r,"(ascii zone, any options)")));var f=e.cancelTask(c,t);return i(u(c),s(t.data,2)),f},n.forkInstance=r?a.createInstance("Zone:fork(ascii zone, ascii newZone)"):null,n.scheduleInstance={},n.cancelInstance={},n.invokeScope={},n.invokeTaskScope={},n}();function s(n,e){if(!n||!e)return null;var o={};for(var c in n)if(n.hasOwnProperty(c)){var t=n[c];switch(typeof t){case"object":var a=t&&t.constructor&&t.constructor.name;t=a==Object.name?s(t,e-1):a;break;case"function":t=t.name||void 0}o[c]=t}return o}function u(n){for(var e=n.name,o=n.parent;null!=o;)e=o.name+"::"+e,o=o.parent;return e}o.wtfZoneSpec=r?new i:null}(Zone)}));PYxo"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){!function n(e){e.__load_patch("bluebird",(function(n,e,o){e[e.__symbol__("bluebird")]=function t(i){["then","spread","finally"].forEach((function(n){o.patchMethod(i.prototype,n,(function(n){return function(o,t){for(var r=e.current,c=function(n){var e=t[n];"function"==typeof e&&(t[n]=function(){var n=this,o=arguments;return new i((function(t,i){r.scheduleMicroTask("Promise.then",(function(){try{t(e.apply(n,o))}catch(n){i(n)}}))}))})},d=0;d<t.length;d++)c(d);return n.apply(o,t)}}))})),"undefined"!=typeof window?window.addEventListener("unhandledrejection",(function(n){var e=n.detail&&n.detail.reason;e&&e.isHandledByZone&&(n.preventDefault(),"function"==typeof n.stopImmediatePropagation&&n.stopImmediatePropagation())})):"undefined"!=typeof process&&process.on("unhandledRejection",(function(n,e){if(n&&n.isHandledByZone){var o=process.listeners("unhandledRejection");o&&(process.removeAllListeners("unhandledRejection"),process.nextTick((function(){o.forEach((function(n){return process.on("unhandledRejection",n)}))})))}})),i.onPossiblyUnhandledRejection((function(n,t){try{e.current.runGuarded((function(){throw n.isHandledByZone=!0,n}))}catch(n){n.isHandledByZone=!1,o.onUnhandledError(n)}})),n.Promise=i}}))}(Zone)})); D	xJ'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    /**
     * @fileoverview
     * @suppress {globalThis,undefinedVars}
     */
    function patchError(Zone) {
        Zone.__load_patch('Error', function (global, Zone, api) {
            /*
             * This code patches Error so that:
             *   - It ignores un-needed stack frames.
             *   - It Shows the associated Zone for reach frame.
             */
            var zoneJsInternalStackFramesSymbol = api.symbol('zoneJsInternalStackFrames');
            var NativeError = (global[api.symbol('Error')] = global['Error']);
            // Store the frames which should be removed from the stack frames
            var zoneJsInternalStackFrames = {};
            // We must find the frame where Error was created, otherwise we assume we don't understand stack
            var zoneAwareFrame1;
            var zoneAwareFrame2;
            var zoneAwareFrame1WithoutNew;
            var zoneAwareFrame2WithoutNew;
            var zoneAwareFrame3WithoutNew;
            global['Error'] = ZoneAwareError;
            var stackRewrite = 'stackRewrite';
            var zoneJsInternalStackFramesPolicy = global['__Zone_Error_BlacklistedStackFrames_policy'] ||
                global['__Zone_Error_ZoneJsInternalStackFrames_policy'] ||
                'default';
            function buildZoneFrameNames(zoneFrame) {
                var zoneFrameName = { zoneName: zoneFrame.zone.name };
                var result = zoneFrameName;
                while (zoneFrame.parent) {
                    zoneFrame = zoneFrame.parent;
                    var parentZoneFrameName = { zoneName: zoneFrame.zone.name };
                    zoneFrameName.parent = parentZoneFrameName;
                    zoneFrameName = parentZoneFrameName;
                }
                return result;
            }
            function buildZoneAwareStackFrames(originalStack, zoneFrame, isZoneFrame) {
                if (isZoneFrame === void 0) { isZoneFrame = true; }
                var frames = originalStack.split('\n');
                var i = 0;
                // Find the first frame
                while (!(frames[i] === zoneAwareFrame1 ||
                    frames[i] === zoneAwareFrame2 ||
                    frames[i] === zoneAwareFrame1WithoutNew ||
                    frames[i] === zoneAwareFrame2WithoutNew ||
                    frames[i] === zoneAwareFrame3WithoutNew) &&
                    i < frames.length) {
                    i++;
                }
                for (; i < frames.length && zoneFrame; i++) {
                    var frame = frames[i];
                    if (frame.trim()) {
                        switch (zoneJsInternalStackFrames[frame]) {
                            case 0 /* FrameType.zoneJsInternal */:
                                frames.splice(i, 1);
                                i--;
                                break;
                            case 1 /* FrameType.transition */:
                                if (zoneFrame.parent) {
                                    // This is the special frame where zone changed. Print and process it accordingly
                                    zoneFrame = zoneFrame.parent;
                                }
                                else {
                                    zoneFrame = null;
                                }
                                frames.splice(i, 1);
                                i--;
                                break;
                            default:
                                frames[i] += isZoneFrame
                                    ? " [".concat(zoneFrame.zone.name, "]")
                                    : " [".concat(zoneFrame.zoneName, "]");
                        }
                    }
                }
                return frames.join('\n');
            }
            /**
             * This is ZoneAwareError which processes the stack frame and cleans up extra frames as well as
             * adds zone information to it.
             */
            function ZoneAwareError() {
                var _this = this;
                // We always have to return native error otherwise the browser console will not work.
                var error = NativeError.apply(this, arguments);
                // Save original stack trace
                var originalStack = (error['originalStack'] = error.stack);
                // Process the stack trace and rewrite the frames.
                if (ZoneAwareError[stackRewrite] && originalStack) {
                    var zoneFrame = api.currentZoneFrame();
                    if (zoneJsInternalStackFramesPolicy === 'lazy') {
                        // don't handle stack trace now
                        error[api.symbol('zoneFrameNames')] = buildZoneFrameNames(zoneFrame);
                    }
                    else if (zoneJsInternalStackFramesPolicy === 'default') {
                        try {
                            error.stack = error.zoneAwareStack = buildZoneAwareStackFrames(originalStack, zoneFrame);
                        }
                        catch (e) {
                            // ignore as some browsers don't allow overriding of stack
                        }
                    }
                }
                if (this instanceof NativeError && this.constructor != NativeError) {
                    // We got called with a `new` operator AND we are subclass of ZoneAwareError
                    // in that case we have to copy all of our properties to `this`.
                    Object.keys(error)
                        .concat('stack', 'message', 'cause')
                        .forEach(function (key) {
                        var value = error[key];
                        if (value !== undefined) {
                            try {
                                _this[key] = value;
                            }
                            catch (e) {
                                // ignore the assignment in case it is a setter and it throws.
                            }
                        }
                    });
                    return this;
                }
                return error;
            }
            // Copy the prototype so that instanceof operator works as expected
            ZoneAwareError.prototype = NativeError.prototype;
            ZoneAwareError[zoneJsInternalStackFramesSymbol] = zoneJsInternalStackFrames;
            ZoneAwareError[stackRewrite] = false;
            var zoneAwareStackSymbol = api.symbol('zoneAwareStack');
            // try to define zoneAwareStack property when zoneJsInternal frames policy is delay
            if (zoneJsInternalStackFramesPolicy === 'lazy') {
                Object.defineProperty(ZoneAwareError.prototype, 'zoneAwareStack', {
                    configurable: true,
                    enumerable: true,
                    get: function () {
                        if (!this[zoneAwareStackSymbol]) {
                            this[zoneAwareStackSymbol] = buildZoneAwareStackFrames(this.originalStack, this[api.symbol('zoneFrameNames')], false);
                        }
                        return this[zoneAwareStackSymbol];
                    },
                    set: function (newStack) {
                        this.originalStack = newStack;
                        this[zoneAwareStackSymbol] = buildZoneAwareStackFrames(this.originalStack, this[api.symbol('zoneFrameNames')], false);
                    },
                });
            }
            // those properties need special handling
            var specialPropertyNames = ['stackTraceLimit', 'captureStackTrace', 'prepareStackTrace'];
            // those properties of NativeError should be set to ZoneAwareError
            var nativeErrorProperties = Object.keys(NativeError);
            if (nativeErrorProperties) {
                nativeErrorProperties.forEach(function (prop) {
                    if (specialPropertyNames.filter(function (sp) { return sp === prop; }).length === 0) {
                        Object.defineProperty(ZoneAwareError, prop, {
                            get: function () {
                                return NativeError[prop];
                            },
                            set: function (value) {
                                NativeError[prop] = value;
                            },
                        });
                    }
                });
            }
            if (NativeError.hasOwnProperty('stackTraceLimit')) {
                // Extend default stack limit as we will be removing few frames.
                NativeError.stackTraceLimit = Math.max(NativeError.stackTraceLimit, 15);
                // make sure that ZoneAwareError has the same property which forwards to NativeError.
                Object.defineProperty(ZoneAwareError, 'stackTraceLimit', {
                    get: function () {
                        return NativeError.stackTraceLimit;
                    },
                    set: function (value) {
                        return (NativeError.stackTraceLimit = value);
                    },
                });
            }
            if (NativeError.hasOwnProperty('captureStackTrace')) {
                Object.defineProperty(ZoneAwareError, 'captureStackTrace', {
                    // add named function here because we need to remove this
                    // stack frame when prepareStackTrace below
                    value: function zoneCaptureStackTrace(targetObject, constructorOpt) {
                        NativeError.captureStackTrace(targetObject, constructorOpt);
                    },
                });
            }
            var ZONE_CAPTURESTACKTRACE = 'zoneCaptureStackTrace';
            Object.defineProperty(ZoneAwareError, 'prepareStackTrace', {
                get: function () {
                    return NativeError.prepareStackTrace;
                },
                set: function (value) {
                    if (!value || typeof value !== 'function') {
                        return (NativeError.prepareStackTrace = value);
                    }
                    return (NativeError.prepareStackTrace = function (error, structuredStackTrace) {
                        // remove additional stack information from ZoneAwareError.captureStackTrace
                        if (structuredStackTrace) {
                            for (var i = 0; i < structuredStackTrace.length; i++) {
                                var st = structuredStackTrace[i];
                                // remove the first function which name is zoneCaptureStackTrace
                                if (st.getFunctionName() === ZONE_CAPTURESTACKTRACE) {
                                    structuredStackTrace.splice(i, 1);
                                    break;
                                }
                            }
                        }
                        return value.call(this, error, structuredStackTrace);
                    });
                },
            });
            if (zoneJsInternalStackFramesPolicy === 'disable') {
                // don't need to run detectZone to populate zoneJs internal stack frames
                return;
            }
            // Now we need to populate the `zoneJsInternalStackFrames` as well as find the
            // run/runGuarded/runTask frames. This is done by creating a detect zone and then threading
            // the execution through all of the above methods so that we can look at the stack trace and
            // find the frames of interest.
            var detectZone = Zone.current.fork({
                name: 'detect',
                onHandleError: function (parentZD, current, target, error) {
                    if (error.originalStack && Error === ZoneAwareError) {
                        var frames_1 = error.originalStack.split(/\n/);
                        var runFrame = false, runGuardedFrame = false, runTaskFrame = false;
                        while (frames_1.length) {
                            var frame = frames_1.shift();
                            // On safari it is possible to have stack frame with no line number.
                            // This check makes sure that we don't filter frames on name only (must have
                            // line number or exact equals to `ZoneAwareError`)
                            if (/:\d+:\d+/.test(frame) || frame === 'ZoneAwareError') {
                                // Get rid of the path so that we don't accidentally find function name in path.
                                // In chrome the separator is `(` and `@` in FF and safari
                                // Chrome: at Zone.run (zone.js:100)
                                // Chrome: at Zone.run (http://localhost:9876/base/build/lib/zone.js:100:24)
                                // FireFox: Zone.prototype.run@http://localhost:9876/base/build/lib/zone.js:101:24
                                // Safari: run@http://localhost:9876/base/build/lib/zone.js:101:24
                                var fnName = frame.split('(')[0].split('@')[0];
                                var frameType = 1 /* FrameType.transition */;
                                if (fnName.indexOf('ZoneAwareError') !== -1) {
                                    if (fnName.indexOf('new ZoneAwareError') !== -1) {
                                        zoneAwareFrame1 = frame;
                                        zoneAwareFrame2 = frame.replace('new ZoneAwareError', 'new Error.ZoneAwareError');
                                    }
                                    else {
                                        zoneAwareFrame1WithoutNew = frame;
                                        zoneAwareFrame2WithoutNew = frame.replace('Error.', '');
                                        if (frame.indexOf('Error.ZoneAwareError') === -1) {
                                            zoneAwareFrame3WithoutNew = frame.replace('ZoneAwareError', 'Error.ZoneAwareError');
                                        }
                                    }
                                    zoneJsInternalStackFrames[zoneAwareFrame2] = 0 /* FrameType.zoneJsInternal */;
                                }
                                if (fnName.indexOf('runGuarded') !== -1) {
                                    runGuardedFrame = true;
                                }
                                else if (fnName.indexOf('runTask') !== -1) {
                                    runTaskFrame = true;
                                }
                                else if (fnName.indexOf('run') !== -1) {
                                    runFrame = true;
                                }
                                else {
                                    frameType = 0 /* FrameType.zoneJsInternal */;
                                }
                                zoneJsInternalStackFrames[frame] = frameType;
                                // Once we find all of the frames we can stop looking.
                                if (runFrame && runGuardedFrame && runTaskFrame) {
                                    ZoneAwareError[stackRewrite] = true;
                                    break;
                                }
                            }
                        }
                    }
                    return false;
                },
            });
            // carefully constructor a stack frame which contains all of the frames of interest which
            // need to be detected and marked as an internal zoneJs frame.
            var childDetectZone = detectZone.fork({
                name: 'child',
                onScheduleTask: function (delegate, curr, target, task) {
                    return delegate.scheduleTask(target, task);
                },
                onInvokeTask: function (delegate, curr, target, task, applyThis, applyArgs) {
                    return delegate.invokeTask(target, task, applyThis, applyArgs);
                },
                onCancelTask: function (delegate, curr, target, task) {
                    return delegate.cancelTask(target, task);
                },
                onInvoke: function (delegate, curr, target, callback, applyThis, applyArgs, source) {
                    return delegate.invoke(target, callback, applyThis, applyArgs, source);
                },
            });
            // we need to detect all zone related frames, it will
            // exceed default stackTraceLimit, so we set it to
            // larger number here, and restore it after detect finish.
            // We cast through any so we don't need to depend on nodejs typings.
            var originalStackTraceLimit = Error.stackTraceLimit;
            Error.stackTraceLimit = 100;
            // we schedule event/micro/macro task, and invoke them
            // when onSchedule, so we can get all stack traces for
            // all kinds of tasks with one error thrown.
            childDetectZone.run(function () {
                childDetectZone.runGuarded(function () {
                    var fakeTransitionTo = function () { };
                    childDetectZone.scheduleEventTask(zoneJsInternalStackFramesSymbol, function () {
                        childDetectZone.scheduleMacroTask(zoneJsInternalStackFramesSymbol, function () {
                            childDetectZone.scheduleMicroTask(zoneJsInternalStackFramesSymbol, function () {
                                throw new Error();
                            }, undefined, function (t) {
                                t._transitionTo = fakeTransitionTo;
                                t.invoke();
                            });
                            childDetectZone.scheduleMicroTask(zoneJsInternalStackFramesSymbol, function () {
                                throw Error();
                            }, undefined, function (t) {
                                t._transitionTo = fakeTransitionTo;
                                t.invoke();
                            });
                        }, undefined, function (t) {
                            t._transitionTo = fakeTransitionTo;
                            t.invoke();
                        }, function () { });
                    }, undefined, function (t) {
                        t._transitionTo = fakeTransitionTo;
                        t.invoke();
                    }, function () { });
                });
            });
            Error.stackTraceLimit = originalStackTraceLimit;
        });
    }
    patchError(Zone);
}));
4xO"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(r){"function"==typeof define&&define.amd?define(r):r()}((function(){!function r(e){e.__load_patch("Error",(function(r,e,n){var t,a,o,i,c,s=n.symbol("zoneJsInternalStackFrames"),u=r[n.symbol("Error")]=r.Error,f={};r.Error=d;var k="stackRewrite",l=r.__Zone_Error_BlacklistedStackFrames_policy||r.__Zone_Error_ZoneJsInternalStackFrames_policy||"default";function p(r,e,n){void 0===n&&(n=!0);for(var s=r.split("\n"),u=0;s[u]!==t&&s[u]!==a&&s[u]!==o&&s[u]!==i&&s[u]!==c&&u<s.length;)u++;for(;u<s.length&&e;u++){var k=s[u];if(k.trim())switch(f[k]){case 0:s.splice(u,1),u--;break;case 1:e=e.parent?e.parent:null,s.splice(u,1),u--;break;default:s[u]+=" [".concat(n?e.zone.name:e.zoneName,"]")}}return s.join("\n")}function d(){var r=this,e=u.apply(this,arguments),t=e.originalStack=e.stack;if(d[k]&&t){var a=n.currentZoneFrame();if("lazy"===l)e[n.symbol("zoneFrameNames")]=function r(e){for(var n={zoneName:e.zone.name},t=n;e.parent;){var a={zoneName:(e=e.parent).zone.name};n.parent=a,n=a}return t}(a);else if("default"===l)try{e.stack=e.zoneAwareStack=p(t,a)}catch(r){}}return this instanceof u&&this.constructor!=u?(Object.keys(e).concat("stack","message","cause").forEach((function(n){var t=e[n];if(void 0!==t)try{r[n]=t}catch(r){}})),this):e}d.prototype=u.prototype,d[s]=f,d[k]=!1;var m=n.symbol("zoneAwareStack");"lazy"===l&&Object.defineProperty(d.prototype,"zoneAwareStack",{configurable:!0,enumerable:!0,get:function(){return this[m]||(this[m]=p(this.originalStack,this[n.symbol("zoneFrameNames")],!1)),this[m]},set:function(r){this.originalStack=r,this[m]=p(this.originalStack,this[n.symbol("zoneFrameNames")],!1)}});var h=["stackTraceLimit","captureStackTrace","prepareStackTrace"],T=Object.keys(u);if(T&&T.forEach((function(r){0===h.filter((function(e){return e===r})).length&&Object.defineProperty(d,r,{get:function(){return u[r]},set:function(e){u[r]=e}})})),u.hasOwnProperty("stackTraceLimit")&&(u.stackTraceLimit=Math.max(u.stackTraceLimit,15),Object.defineProperty(d,"stackTraceLimit",{get:function(){return u.stackTraceLimit},set:function(r){return u.stackTraceLimit=r}})),u.hasOwnProperty("captureStackTrace")&&Object.defineProperty(d,"captureStackTrace",{value:function r(e,n){u.captureStackTrace(e,n)}}),Object.defineProperty(d,"prepareStackTrace",{get:function(){return u.prepareStackTrace},set:function(r){return u.prepareStackTrace=r&&"function"==typeof r?function(e,n){if(n)for(var t=0;t<n.length;t++)if("zoneCaptureStackTrace"===n[t].getFunctionName()){n.splice(t,1);break}return r.call(this,e,n)}:r}}),"disable"!==l){var v=e.current.fork({name:"detect",onHandleError:function(r,e,n,s){if(s.originalStack&&Error===d)for(var u=s.originalStack.split(/\n/),l=!1,p=!1,m=!1;u.length;){var h=u.shift();if(/:\d+:\d+/.test(h)||"ZoneAwareError"===h){var T=h.split("(")[0].split("@")[0],v=1;if(-1!==T.indexOf("ZoneAwareError")&&(-1!==T.indexOf("new ZoneAwareError")?(t=h,a=h.replace("new ZoneAwareError","new Error.ZoneAwareError")):(o=h,i=h.replace("Error.",""),-1===h.indexOf("Error.ZoneAwareError")&&(c=h.replace("ZoneAwareError","Error.ZoneAwareError"))),f[a]=0),-1!==T.indexOf("runGuarded")?p=!0:-1!==T.indexOf("runTask")?m=!0:-1!==T.indexOf("run")?l=!0:v=0,f[h]=v,l&&p&&m){d[k]=!0;break}}}return!1}}).fork({name:"child",onScheduleTask:function(r,e,n,t){return r.scheduleTask(n,t)},onInvokeTask:function(r,e,n,t,a,o){return r.invokeTask(n,t,a,o)},onCancelTask:function(r,e,n,t){return r.cancelTask(n,t)},onInvoke:function(r,e,n,t,a,o,i){return r.invoke(n,t,a,o,i)}}),E=Error.stackTraceLimit;Error.stackTraceLimit=100,v.run((function(){v.runGuarded((function(){var r=function(){};v.scheduleEventTask(s,(function(){v.scheduleMacroTask(s,(function(){v.scheduleMicroTask(s,(function(){throw new Error}),void 0,(function(e){e._transitionTo=r,e.invoke()})),v.scheduleMicroTask(s,(function(){throw Error()}),void 0,(function(e){e._transitionTo=r,e.invoke()}))}),void 0,(function(e){e._transitionTo=r,e.invoke()}),(function(){}))}),void 0,(function(e){e._transitionTo=r,e.invoke()}),(function(){}))}))})),Error.stackTraceLimit=E}}))}(Zone)}));
xVn'use strict';
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
            ar[i] = from[i];
        }
    }
    return to.concat(ar || Array.prototype.slice.call(from));
};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    /*
     * This is necessary for Chrome and Chrome mobile, to enable
     * things like redefining `createdCallback` on an element.
     */
    var zoneSymbol;
    var _defineProperty;
    var _getOwnPropertyDescriptor;
    var _create;
    var unconfigurablesKey;
    function propertyPatch() {
        zoneSymbol = Zone.__symbol__;
        _defineProperty = Object[zoneSymbol('defineProperty')] = Object.defineProperty;
        _getOwnPropertyDescriptor = Object[zoneSymbol('getOwnPropertyDescriptor')] =
            Object.getOwnPropertyDescriptor;
        _create = Object.create;
        unconfigurablesKey = zoneSymbol('unconfigurables');
        Object.defineProperty = function (obj, prop, desc) {
            if (isUnconfigurable(obj, prop)) {
                throw new TypeError("Cannot assign to read only property '" + prop + "' of " + obj);
            }
            var originalConfigurableFlag = desc.configurable;
            if (prop !== 'prototype') {
                desc = rewriteDescriptor(obj, prop, desc);
            }
            return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
        };
        Object.defineProperties = function (obj, props) {
            Object.keys(props).forEach(function (prop) {
                Object.defineProperty(obj, prop, props[prop]);
            });
            for (var _i = 0, _a = Object.getOwnPropertySymbols(props); _i < _a.length; _i++) {
                var sym = _a[_i];
                var desc = Object.getOwnPropertyDescriptor(props, sym);
                // Since `Object.getOwnPropertySymbols` returns *all* symbols,
                // including non-enumerable ones, retrieve property descriptor and check
                // enumerability there. Proceed with the rewrite only when a property is
                // enumerable to make the logic consistent with the way regular
                // properties are retrieved (via `Object.keys`, which respects
                // `enumerable: false` flag). More information:
                // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties#retrieval
                if (desc === null || desc === void 0 ? void 0 : desc.enumerable) {
                    Object.defineProperty(obj, sym, props[sym]);
                }
            }
            return obj;
        };
        Object.create = function (proto, propertiesObject) {
            if (typeof propertiesObject === 'object' && !Object.isFrozen(propertiesObject)) {
                Object.keys(propertiesObject).forEach(function (prop) {
                    propertiesObject[prop] = rewriteDescriptor(proto, prop, propertiesObject[prop]);
                });
            }
            return _create(proto, propertiesObject);
        };
        Object.getOwnPropertyDescriptor = function (obj, prop) {
            var desc = _getOwnPropertyDescriptor(obj, prop);
            if (desc && isUnconfigurable(obj, prop)) {
                desc.configurable = false;
            }
            return desc;
        };
    }
    function _redefineProperty(obj, prop, desc) {
        var originalConfigurableFlag = desc.configurable;
        desc = rewriteDescriptor(obj, prop, desc);
        return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
    }
    function isUnconfigurable(obj, prop) {
        return obj && obj[unconfigurablesKey] && obj[unconfigurablesKey][prop];
    }
    function rewriteDescriptor(obj, prop, desc) {
        // issue-927, if the desc is frozen, don't try to change the desc
        if (!Object.isFrozen(desc)) {
            desc.configurable = true;
        }
        if (!desc.configurable) {
            // issue-927, if the obj is frozen, don't try to set the desc to obj
            if (!obj[unconfigurablesKey] && !Object.isFrozen(obj)) {
                _defineProperty(obj, unconfigurablesKey, { writable: true, value: {} });
            }
            if (obj[unconfigurablesKey]) {
                obj[unconfigurablesKey][prop] = true;
            }
        }
        return desc;
    }
    function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) {
        try {
            return _defineProperty(obj, prop, desc);
        }
        catch (error) {
            if (desc.configurable) {
                // In case of errors, when the configurable flag was likely set by rewriteDescriptor(),
                // let's retry with the original flag value
                if (typeof originalConfigurableFlag == 'undefined') {
                    delete desc.configurable;
                }
                else {
                    desc.configurable = originalConfigurableFlag;
                }
                try {
                    return _defineProperty(obj, prop, desc);
                }
                catch (error) {
                    var swallowError = false;
                    if (prop === 'createdCallback' ||
                        prop === 'attachedCallback' ||
                        prop === 'detachedCallback' ||
                        prop === 'attributeChangedCallback') {
                        // We only swallow the error in registerElement patch
                        // this is the work around since some applications
                        // fail if we throw the error
                        swallowError = true;
                    }
                    if (!swallowError) {
                        throw error;
                    }
                    // TODO: @JiaLiPassion, Some application such as `registerElement` patch
                    // still need to swallow the error, in the future after these applications
                    // are updated, the following logic can be removed.
                    var descJson = null;
                    try {
                        descJson = JSON.stringify(desc);
                    }
                    catch (error) {
                        descJson = desc.toString();
                    }
                    console.log("Attempting to configure '".concat(prop, "' with descriptor '").concat(descJson, "' on object '").concat(obj, "' and got error, giving up: ").concat(error));
                }
            }
            else {
                throw error;
            }
        }
    }
    function eventTargetLegacyPatch(_global, api) {
        var _a = api.getGlobalObjects(), eventNames = _a.eventNames, globalSources = _a.globalSources, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
        var WTF_ISSUE_555 = 'Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video';
        var NO_EVENT_TARGET = 'ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket'.split(',');
        var EVENT_TARGET = 'EventTarget';
        var apis = [];
        var isWtf = _global['wtf'];
        var WTF_ISSUE_555_ARRAY = WTF_ISSUE_555.split(',');
        if (isWtf) {
            // Workaround for: https://github.com/google/tracing-framework/issues/555
            apis = WTF_ISSUE_555_ARRAY.map(function (v) { return 'HTML' + v + 'Element'; }).concat(NO_EVENT_TARGET);
        }
        else if (_global[EVENT_TARGET]) {
            apis.push(EVENT_TARGET);
        }
        else {
            // Note: EventTarget is not available in all browsers,
            // if it's not available, we instead patch the APIs in the IDL that inherit from EventTarget
            apis = NO_EVENT_TARGET;
        }
        var isDisableIECheck = _global['__Zone_disable_IE_check'] || false;
        var isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false;
        var ieOrEdge = api.isIEOrEdge();
        var ADD_EVENT_LISTENER_SOURCE = '.addEventListener:';
        var FUNCTION_WRAPPER = '[object FunctionWrapper]';
        var BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }';
        var pointerEventsMap = {
            'MSPointerCancel': 'pointercancel',
            'MSPointerDown': 'pointerdown',
            'MSPointerEnter': 'pointerenter',
            'MSPointerHover': 'pointerhover',
            'MSPointerLeave': 'pointerleave',
            'MSPointerMove': 'pointermove',
            'MSPointerOut': 'pointerout',
            'MSPointerOver': 'pointerover',
            'MSPointerUp': 'pointerup',
        };
        //  predefine all __zone_symbol__ + eventName + true/false string
        for (var i = 0; i < eventNames.length; i++) {
            var eventName = eventNames[i];
            var falseEventName = eventName + FALSE_STR;
            var trueEventName = eventName + TRUE_STR;
            var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
            var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
            zoneSymbolEventNames[eventName] = {};
            zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
            zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
        }
        //  predefine all task.source string
        for (var i = 0; i < WTF_ISSUE_555_ARRAY.length; i++) {
            var target = WTF_ISSUE_555_ARRAY[i];
            var targets = (globalSources[target] = {});
            for (var j = 0; j < eventNames.length; j++) {
                var eventName = eventNames[j];
                targets[eventName] = target + ADD_EVENT_LISTENER_SOURCE + eventName;
            }
        }
        var checkIEAndCrossContext = function (nativeDelegate, delegate, target, args) {
            if (!isDisableIECheck && ieOrEdge) {
                if (isEnableCrossContextCheck) {
                    try {
                        var testString = delegate.toString();
                        if (testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS) {
                            nativeDelegate.apply(target, args);
                            return false;
                        }
                    }
                    catch (error) {
                        nativeDelegate.apply(target, args);
                        return false;
                    }
                }
                else {
                    var testString = delegate.toString();
                    if (testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS) {
                        nativeDelegate.apply(target, args);
                        return false;
                    }
                }
            }
            else if (isEnableCrossContextCheck) {
                try {
                    delegate.toString();
                }
                catch (error) {
                    nativeDelegate.apply(target, args);
                    return false;
                }
            }
            return true;
        };
        var apiTypes = [];
        for (var i = 0; i < apis.length; i++) {
            var type = _global[apis[i]];
            apiTypes.push(type && type.prototype);
        }
        // vh is validateHandler to check event handler
        // is valid or not(for security check)
        api.patchEventTarget(_global, api, apiTypes, {
            vh: checkIEAndCrossContext,
            transferEventName: function (eventName) {
                var pointerEventName = pointerEventsMap[eventName];
                return pointerEventName || eventName;
            },
        });
        Zone[api.symbol('patchEventTarget')] = !!_global[EVENT_TARGET];
        return true;
    }
    // we have to patch the instance since the proto is non-configurable
    function apply(api, _global) {
        var _a = api.getGlobalObjects(), ADD_EVENT_LISTENER_STR = _a.ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR = _a.REMOVE_EVENT_LISTENER_STR;
        var WS = _global.WebSocket;
        // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
        // On older Chrome, no need since EventTarget was already patched
        if (!_global.EventTarget) {
            api.patchEventTarget(_global, api, [WS.prototype]);
        }
        _global.WebSocket = function (x, y) {
            var socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
            var proxySocket;
            var proxySocketProto;
            // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
            var onmessageDesc = api.ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
            if (onmessageDesc && onmessageDesc.configurable === false) {
                proxySocket = api.ObjectCreate(socket);
                // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
                // but proxySocket not, so we will keep socket as prototype and pass it to
                // patchOnProperties method
                proxySocketProto = socket;
                [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
                    proxySocket[propName] = function () {
                        var args = api.ArraySlice.call(arguments);
                        if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
                            var eventName = args.length > 0 ? args[0] : undefined;
                            if (eventName) {
                                var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
                                socket[propertySymbol] = proxySocket[propertySymbol];
                            }
                        }
                        return socket[propName].apply(socket, args);
                    };
                });
            }
            else {
                // we can patch the real socket
                proxySocket = socket;
            }
            api.patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
            return proxySocket;
        };
        var globalWebSocket = _global['WebSocket'];
        for (var prop in WS) {
            globalWebSocket[prop] = WS[prop];
        }
    }
    /**
     * @fileoverview
     * @suppress {globalThis}
     */
    function propertyDescriptorLegacyPatch(api, _global) {
        var _a = api.getGlobalObjects(), isNode = _a.isNode, isMix = _a.isMix;
        if (isNode && !isMix) {
            return;
        }
        if (!canPatchViaPropertyDescriptor(api, _global)) {
            var supportsWebSocket = typeof WebSocket !== 'undefined';
            // Safari, Android browsers (Jelly Bean)
            patchViaCapturingAllTheEvents(api);
            api.patchClass('XMLHttpRequest');
            if (supportsWebSocket) {
                apply(api, _global);
            }
            Zone[api.symbol('patchEvents')] = true;
        }
    }
    function canPatchViaPropertyDescriptor(api, _global) {
        var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
        if ((isBrowser || isMix) &&
            !api.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
            typeof Element !== 'undefined') {
            // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
            // IDL interface attributes are not configurable
            var desc = api.ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
            if (desc && !desc.configurable)
                return false;
            // try to use onclick to detect whether we can patch via propertyDescriptor
            // because XMLHttpRequest is not available in service worker
            if (desc) {
                api.ObjectDefineProperty(Element.prototype, 'onclick', {
                    enumerable: true,
                    configurable: true,
                    get: function () {
                        return true;
                    },
                });
                var div = document.createElement('div');
                var result = !!div.onclick;
                api.ObjectDefineProperty(Element.prototype, 'onclick', desc);
                return result;
            }
        }
        var XMLHttpRequest = _global['XMLHttpRequest'];
        if (!XMLHttpRequest) {
            // XMLHttpRequest is not available in service worker
            return false;
        }
        var ON_READY_STATE_CHANGE = 'onreadystatechange';
        var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
        var xhrDesc = api.ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
        // add enumerable and configurable here because in opera
        // by default XMLHttpRequest.prototype.onreadystatechange is undefined
        // without adding enumerable and configurable will cause onreadystatechange
        // non-configurable
        // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
        // we should set a real desc instead a fake one
        if (xhrDesc) {
            api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
                enumerable: true,
                configurable: true,
                get: function () {
                    return true;
                },
            });
            var req = new XMLHttpRequest();
            var result = !!req.onreadystatechange;
            // restore original desc
            api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
            return result;
        }
        else {
            var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = api.symbol('fake');
            api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
                enumerable: true,
                configurable: true,
                get: function () {
                    return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1];
                },
                set: function (value) {
                    this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value;
                },
            });
            var req = new XMLHttpRequest();
            var detectFunc = function () { };
            req.onreadystatechange = detectFunc;
            var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
            req.onreadystatechange = null;
            return result;
        }
    }
    var globalEventHandlersEventNames = [
        'abort',
        'animationcancel',
        'animationend',
        'animationiteration',
        'auxclick',
        'beforeinput',
        'blur',
        'cancel',
        'canplay',
        'canplaythrough',
        'change',
        'compositionstart',
        'compositionupdate',
        'compositionend',
        'cuechange',
        'click',
        'close',
        'contextmenu',
        'curechange',
        'dblclick',
        'drag',
        'dragend',
        'dragenter',
        'dragexit',
        'dragleave',
        'dragover',
        'drop',
        'durationchange',
        'emptied',
        'ended',
        'error',
        'focus',
        'focusin',
        'focusout',
        'gotpointercapture',
        'input',
        'invalid',
        'keydown',
        'keypress',
        'keyup',
        'load',
        'loadstart',
        'loadeddata',
        'loadedmetadata',
        'lostpointercapture',
        'mousedown',
        'mouseenter',
        'mouseleave',
        'mousemove',
        'mouseout',
        'mouseover',
        'mouseup',
        'mousewheel',
        'orientationchange',
        'pause',
        'play',
        'playing',
        'pointercancel',
        'pointerdown',
        'pointerenter',
        'pointerleave',
        'pointerlockchange',
        'mozpointerlockchange',
        'webkitpointerlockerchange',
        'pointerlockerror',
        'mozpointerlockerror',
        'webkitpointerlockerror',
        'pointermove',
        'pointout',
        'pointerover',
        'pointerup',
        'progress',
        'ratechange',
        'reset',
        'resize',
        'scroll',
        'seeked',
        'seeking',
        'select',
        'selectionchange',
        'selectstart',
        'show',
        'sort',
        'stalled',
        'submit',
        'suspend',
        'timeupdate',
        'volumechange',
        'touchcancel',
        'touchmove',
        'touchstart',
        'touchend',
        'transitioncancel',
        'transitionend',
        'waiting',
        'wheel',
    ];
    var documentEventNames = [
        'afterscriptexecute',
        'beforescriptexecute',
        'DOMContentLoaded',
        'freeze',
        'fullscreenchange',
        'mozfullscreenchange',
        'webkitfullscreenchange',
        'msfullscreenchange',
        'fullscreenerror',
        'mozfullscreenerror',
        'webkitfullscreenerror',
        'msfullscreenerror',
        'readystatechange',
        'visibilitychange',
        'resume',
    ];
    var windowEventNames = [
        'absolutedeviceorientation',
        'afterinput',
        'afterprint',
        'appinstalled',
        'beforeinstallprompt',
        'beforeprint',
        'beforeunload',
        'devicelight',
        'devicemotion',
        'deviceorientation',
        'deviceorientationabsolute',
        'deviceproximity',
        'hashchange',
        'languagechange',
        'message',
        'mozbeforepaint',
        'offline',
        'online',
        'paint',
        'pageshow',
        'pagehide',
        'popstate',
        'rejectionhandled',
        'storage',
        'unhandledrejection',
        'unload',
        'userproximity',
        'vrdisplayconnected',
        'vrdisplaydisconnected',
        'vrdisplaypresentchange',
    ];
    var htmlElementEventNames = [
        'beforecopy',
        'beforecut',
        'beforepaste',
        'copy',
        'cut',
        'paste',
        'dragstart',
        'loadend',
        'animationstart',
        'search',
        'transitionrun',
        'transitionstart',
        'webkitanimationend',
        'webkitanimationiteration',
        'webkitanimationstart',
        'webkittransitionend',
    ];
    var ieElementEventNames = [
        'activate',
        'afterupdate',
        'ariarequest',
        'beforeactivate',
        'beforedeactivate',
        'beforeeditfocus',
        'beforeupdate',
        'cellchange',
        'controlselect',
        'dataavailable',
        'datasetchanged',
        'datasetcomplete',
        'errorupdate',
        'filterchange',
        'layoutcomplete',
        'losecapture',
        'move',
        'moveend',
        'movestart',
        'propertychange',
        'resizeend',
        'resizestart',
        'rowenter',
        'rowexit',
        'rowsdelete',
        'rowsinserted',
        'command',
        'compassneedscalibration',
        'deactivate',
        'help',
        'mscontentzoom',
        'msmanipulationstatechanged',
        'msgesturechange',
        'msgesturedoubletap',
        'msgestureend',
        'msgesturehold',
        'msgesturestart',
        'msgesturetap',
        'msgotpointercapture',
        'msinertiastart',
        'mslostpointercapture',
        'mspointercancel',
        'mspointerdown',
        'mspointerenter',
        'mspointerhover',
        'mspointerleave',
        'mspointermove',
        'mspointerout',
        'mspointerover',
        'mspointerup',
        'pointerout',
        'mssitemodejumplistitemremoved',
        'msthumbnailclick',
        'stop',
        'storagecommit',
    ];
    var webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror'];
    var formEventNames = ['autocomplete', 'autocompleteerror'];
    var detailEventNames = ['toggle'];
    var eventNames = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], globalEventHandlersEventNames, true), webglEventNames, true), formEventNames, true), detailEventNames, true), documentEventNames, true), windowEventNames, true), htmlElementEventNames, true), ieElementEventNames, true);
    // Whenever any eventListener fires, we check the eventListener target and all parents
    // for `onwhatever` properties and replace them with zone-bound functions
    // - Chrome (for now)
    function patchViaCapturingAllTheEvents(api) {
        var unboundKey = api.symbol('unbound');
        var _loop_1 = function (i) {
            var property = eventNames[i];
            var onproperty = 'on' + property;
            self.addEventListener(property, function (event) {
                var elt = event.target, bound, source;
                if (elt) {
                    source = elt.constructor['name'] + '.' + onproperty;
                }
                else {
                    source = 'unknown.' + onproperty;
                }
                while (elt) {
                    if (elt[onproperty] && !elt[onproperty][unboundKey]) {
                        bound = api.wrapWithCurrentZone(elt[onproperty], source);
                        bound[unboundKey] = elt[onproperty];
                        elt[onproperty] = bound;
                    }
                    elt = elt.parentElement;
                }
            }, true);
        };
        for (var i = 0; i < eventNames.length; i++) {
            _loop_1(i);
        }
    }
    function registerElementPatch(_global, api) {
        var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
        if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) {
            return;
        }
        var callbacks = [
            'createdCallback',
            'attachedCallback',
            'detachedCallback',
            'attributeChangedCallback',
        ];
        api.patchCallbacks(api, document, 'Document', 'registerElement', callbacks);
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    function patchBrowserLegacy() {
        var _global = typeof window !== 'undefined'
            ? window
            : typeof global !== 'undefined'
                ? global
                : typeof self !== 'undefined'
                    ? self
                    : {};
        var symbolPrefix = _global['__Zone_symbol_prefix'] || '__zone_symbol__';
        function __symbol__(name) {
            return symbolPrefix + name;
        }
        _global[__symbol__('legacyPatch')] = function () {
            var Zone = _global['Zone'];
            Zone.__load_patch('defineProperty', function (global, Zone, api) {
                api._redefineProperty = _redefineProperty;
                propertyPatch();
            });
            Zone.__load_patch('registerElement', function (global, Zone, api) {
                registerElementPatch(global, api);
            });
            Zone.__load_patch('EventTargetLegacy', function (global, Zone, api) {
                eventTargetLegacyPatch(global, api);
                propertyDescriptorLegacyPatch(api, global);
            });
        };
    }
    patchBrowserLegacy();
}));
6x+)"use strict";var __spreadArray=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,a=t.length;o<a;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){var e,t,r,n,o;function a(){e=Zone.__symbol__,t=Object[e("defineProperty")]=Object.defineProperty,r=Object[e("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,n=Object.create,o=e("unconfigurables"),Object.defineProperty=function(e,t,r){if(c(e,t))throw new TypeError("Cannot assign to read only property '"+t+"' of "+e);var n=r.configurable;return"prototype"!==t&&(r=l(e,t,r)),s(e,t,r,n)},Object.defineProperties=function(e,t){Object.keys(t).forEach((function(r){Object.defineProperty(e,r,t[r])}));for(var r=0,n=Object.getOwnPropertySymbols(t);r<n.length;r++){var o=n[r],a=Object.getOwnPropertyDescriptor(t,o);(null==a?void 0:a.enumerable)&&Object.defineProperty(e,o,t[o])}return e},Object.create=function(e,t){return"object"!=typeof t||Object.isFrozen(t)||Object.keys(t).forEach((function(r){t[r]=l(e,r,t[r])})),n(e,t)},Object.getOwnPropertyDescriptor=function(e,t){var n=r(e,t);return n&&c(e,t)&&(n.configurable=!1),n}}function i(e,t,r){var n=r.configurable;return s(e,t,r=l(e,t,r),n)}function c(e,t){return e&&e[o]&&e[o][t]}function l(e,r,n){return Object.isFrozen(n)||(n.configurable=!0),n.configurable||(e[o]||Object.isFrozen(e)||t(e,o,{writable:!0,value:{}}),e[o]&&(e[o][r]=!0)),n}function s(e,r,n,o){try{return t(e,r,n)}catch(c){if(!n.configurable)throw c;void 0===o?delete n.configurable:n.configurable=o;try{return t(e,r,n)}catch(t){var a=!1;if("createdCallback"!==r&&"attachedCallback"!==r&&"detachedCallback"!==r&&"attributeChangedCallback"!==r||(a=!0),!a)throw t;var i=null;try{i=JSON.stringify(n)}catch(e){i=n.toString()}console.log("Attempting to configure '".concat(r,"' with descriptor '").concat(i,"' on object '").concat(e,"' and got error, giving up: ").concat(t))}}}function p(e,t){var r=t.getGlobalObjects(),n=r.eventNames,o=r.globalSources,a=r.zoneSymbolEventNames,i=r.TRUE_STR,c=r.FALSE_STR,l=r.ZONE_SYMBOL_PREFIX,s="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),p="EventTarget",u=[],d=e.wtf,f="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video".split(",");d?u=f.map((function(e){return"HTML"+e+"Element"})).concat(s):e[p]?u.push(p):u=s;for(var g=e.__Zone_disable_IE_check||!1,b=e.__Zone_enable_cross_context_check||!1,m=t.isIEOrEdge(),v="[object FunctionWrapper]",h="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",y={MSPointerCancel:"pointercancel",MSPointerDown:"pointerdown",MSPointerEnter:"pointerenter",MSPointerHover:"pointerhover",MSPointerLeave:"pointerleave",MSPointerMove:"pointermove",MSPointerOut:"pointerout",MSPointerOver:"pointerover",MSPointerUp:"pointerup"},_=0;_<n.length;_++){var O=l+((P=n[_])+c),w=l+(P+i);a[P]={},a[P][c]=O,a[P][i]=w}for(_=0;_<f.length;_++)for(var k=f[_],E=o[k]={},S=0;S<n.length;S++){var P;E[P=n[S]]=k+".addEventListener:"+P}var j=[];for(_=0;_<u.length;_++){var T=e[u[_]];j.push(T&&T.prototype)}return t.patchEventTarget(e,t,j,{vh:function(e,t,r,n){if(!g&&m){if(b)try{var o;if((o=t.toString())===v||o==h)return e.apply(r,n),!1}catch(t){return e.apply(r,n),!1}else if((o=t.toString())===v||o==h)return e.apply(r,n),!1}else if(b)try{t.toString()}catch(t){return e.apply(r,n),!1}return!0},transferEventName:function(e){return y[e]||e}}),Zone[t.symbol("patchEventTarget")]=!!e[p],!0}function u(e,t){var r=e.getGlobalObjects();if((!r.isNode||r.isMix)&&!function n(e,t){var r=e.getGlobalObjects();if((r.isBrowser||r.isMix)&&!e.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var n=e.ObjectGetOwnPropertyDescriptor(Element.prototype,"onclick");if(n&&!n.configurable)return!1;if(n){e.ObjectDefineProperty(Element.prototype,"onclick",{enumerable:!0,configurable:!0,get:function(){return!0}});var o=!!document.createElement("div").onclick;return e.ObjectDefineProperty(Element.prototype,"onclick",n),o}}var a=t.XMLHttpRequest;if(!a)return!1;var i="onreadystatechange",c=a.prototype,l=e.ObjectGetOwnPropertyDescriptor(c,i);if(l)return e.ObjectDefineProperty(c,i,{enumerable:!0,configurable:!0,get:function(){return!0}}),o=!!(p=new a).onreadystatechange,e.ObjectDefineProperty(c,i,l||{}),o;var s=e.symbol("fake");e.ObjectDefineProperty(c,i,{enumerable:!0,configurable:!0,get:function(){return this[s]},set:function(e){this[s]=e}});var p,u=function(){};return(p=new a).onreadystatechange=u,o=p[s]===u,p.onreadystatechange=null,o}(e,t)){var o="undefined"!=typeof WebSocket;!function r(e){for(var t=e.symbol("unbound"),r=function(r){var n=d[r],o="on"+n;self.addEventListener(n,(function(r){var n,a,i=r.target;for(a=i?i.constructor.name+"."+o:"unknown."+o;i;)i[o]&&!i[o][t]&&((n=e.wrapWithCurrentZone(i[o],a))[t]=i[o],i[o]=n),i=i.parentElement}),!0)},n=0;n<d.length;n++)r(n)}(e),e.patchClass("XMLHttpRequest"),o&&function n(e,t){var r=e.getGlobalObjects(),n=r.ADD_EVENT_LISTENER_STR,o=r.REMOVE_EVENT_LISTENER_STR,a=t.WebSocket;t.EventTarget||e.patchEventTarget(t,e,[a.prototype]),t.WebSocket=function(t,r){var i,c,l=arguments.length>1?new a(t,r):new a(t),s=e.ObjectGetOwnPropertyDescriptor(l,"onmessage");return s&&!1===s.configurable?(i=e.ObjectCreate(l),c=l,[n,o,"send","close"].forEach((function(t){i[t]=function(){var r=e.ArraySlice.call(arguments);if(t===n||t===o){var a=r.length>0?r[0]:void 0;if(a){var c=Zone.__symbol__("ON_PROPERTY"+a);l[c]=i[c]}}return l[t].apply(l,r)}}))):i=l,e.patchOnProperties(i,["close","error","message","open"],c),i};var i=t.WebSocket;for(var c in a)i[c]=a[c]}(e,t),Zone[e.symbol("patchEvents")]=!0}}var d=__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([],["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"],!0),["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],!0),["autocomplete","autocompleteerror"],!0),["toggle"],!0),["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],!0),["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplayconnected","vrdisplaydisconnected","vrdisplaypresentchange"],!0),["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],!0),["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"],!0);!function f(){var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},t=e.__Zone_symbol_prefix||"__zone_symbol__";e[function r(e){return t+e}("legacyPatch")]=function(){var t=e.Zone;t.__load_patch("defineProperty",(function(e,t,r){r._redefineProperty=i,a()})),t.__load_patch("registerElement",(function(e,t,r){!function n(e,t){var r=t.getGlobalObjects();(r.isBrowser||r.isMix)&&"registerElement"in e.document&&t.patchCallbacks(t,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}(e,r)})),t.__load_patch("EventTargetLegacy",(function(e,t,r){p(e,r),u(r,e)}))}}()}));ղsQx   'use strict';
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    var global = globalThis;
    // __Zone_symbol_prefix global can be used to override the default zone
    // symbol prefix with a custom one if needed.
    function __symbol__(name) {
        var symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';
        return symbolPrefix + name;
    }
    function initZone() {
        var performance = global['performance'];
        function mark(name) {
            performance && performance['mark'] && performance['mark'](name);
        }
        function performanceMeasure(name, label) {
            performance && performance['measure'] && performance['measure'](name, label);
        }
        mark('Zone');
        var ZoneImpl = /** @class */ (function () {
            function ZoneImpl(parent, zoneSpec) {
                this._parent = parent;
                this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '<root>';
                this._properties = (zoneSpec && zoneSpec.properties) || {};
                this._zoneDelegate = new _ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
            }
            ZoneImpl.assertZonePatched = function () {
                if (global['Promise'] !== patches['ZoneAwarePromise']) {
                    throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
                        'has been overwritten.\n' +
                        'Most likely cause is that a Promise polyfill has been loaded ' +
                        'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
                        'If you must load one, do so before loading zone.js.)');
                }
            };
            Object.defineProperty(ZoneImpl, "root", {
                get: function () {
                    var zone = ZoneImpl.current;
                    while (zone.parent) {
                        zone = zone.parent;
                    }
                    return zone;
                },
                enumerable: false,
                configurable: true
            });
            Object.defineProperty(ZoneImpl, "current", {
                get: function () {
                    return _currentZoneFrame.zone;
                },
                enumerable: false,
                configurable: true
            });
            Object.defineProperty(ZoneImpl, "currentTask", {
                get: function () {
                    return _currentTask;
                },
                enumerable: false,
                configurable: true
            });
            ZoneImpl.__load_patch = function (name, fn, ignoreDuplicate) {
                if (ignoreDuplicate === void 0) { ignoreDuplicate = false; }
                if (patches.hasOwnProperty(name)) {
                    // `checkDuplicate` option is defined from global variable
                    // so it works for all modules.
                    // `ignoreDuplicate` can work for the specified module
                    var checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
                    if (!ignoreDuplicate && checkDuplicate) {
                        throw Error('Already loaded patch: ' + name);
                    }
                }
                else if (!global['__Zone_disable_' + name]) {
                    var perfName = 'Zone:' + name;
                    mark(perfName);
                    patches[name] = fn(global, ZoneImpl, _api);
                    performanceMeasure(perfName, perfName);
                }
            };
            Object.defineProperty(ZoneImpl.prototype, "parent", {
                get: function () {
                    return this._parent;
                },
                enumerable: false,
                configurable: true
            });
            Object.defineProperty(ZoneImpl.prototype, "name", {
                get: function () {
                    return this._name;
                },
                enumerable: false,
                configurable: true
            });
            ZoneImpl.prototype.get = function (key) {
                var zone = this.getZoneWith(key);
                if (zone)
                    return zone._properties[key];
            };
            ZoneImpl.prototype.getZoneWith = function (key) {
                var current = this;
                while (current) {
                    if (current._properties.hasOwnProperty(key)) {
                        return current;
                    }
                    current = current._parent;
                }
                return null;
            };
            ZoneImpl.prototype.fork = function (zoneSpec) {
                if (!zoneSpec)
                    throw new Error('ZoneSpec required!');
                return this._zoneDelegate.fork(this, zoneSpec);
            };
            ZoneImpl.prototype.wrap = function (callback, source) {
                if (typeof callback !== 'function') {
                    throw new Error('Expecting function got: ' + callback);
                }
                var _callback = this._zoneDelegate.intercept(this, callback, source);
                var zone = this;
                return function () {
                    return zone.runGuarded(_callback, this, arguments, source);
                };
            };
            ZoneImpl.prototype.run = function (callback, applyThis, applyArgs, source) {
                _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
                try {
                    return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
                }
                finally {
                    _currentZoneFrame = _currentZoneFrame.parent;
                }
            };
            ZoneImpl.prototype.runGuarded = function (callback, applyThis, applyArgs, source) {
                if (applyThis === void 0) { applyThis = null; }
                _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
                try {
                    try {
                        return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
                    }
                    catch (error) {
                        if (this._zoneDelegate.handleError(this, error)) {
                            throw error;
                        }
                    }
                }
                finally {
                    _currentZoneFrame = _currentZoneFrame.parent;
                }
            };
            ZoneImpl.prototype.runTask = function (task, applyThis, applyArgs) {
                if (task.zone != this) {
                    throw new Error('A task can only be run in the zone of creation! (Creation: ' +
                        (task.zone || NO_ZONE).name +
                        '; Execution: ' +
                        this.name +
                        ')');
                }
                var zoneTask = task;
                // https://github.com/angular/zone.js/issues/778, sometimes eventTask
                // will run in notScheduled(canceled) state, we should not try to
                // run such kind of task but just return
                var type = task.type, _a = task.data, _b = _a === void 0 ? {} : _a, _c = _b.isPeriodic, isPeriodic = _c === void 0 ? false : _c, _d = _b.isRefreshable, isRefreshable = _d === void 0 ? false : _d;
                if (task.state === notScheduled && (type === eventTask || type === macroTask)) {
                    return;
                }
                var reEntryGuard = task.state != running;
                reEntryGuard && zoneTask._transitionTo(running, scheduled);
                var previousTask = _currentTask;
                _currentTask = zoneTask;
                _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
                try {
                    if (type == macroTask && task.data && !isPeriodic && !isRefreshable) {
                        task.cancelFn = undefined;
                    }
                    try {
                        return this._zoneDelegate.invokeTask(this, zoneTask, applyThis, applyArgs);
                    }
                    catch (error) {
                        if (this._zoneDelegate.handleError(this, error)) {
                            throw error;
                        }
                    }
                }
                finally {
                    // if the task's state is notScheduled or unknown, then it has already been cancelled
                    // we should not reset the state to scheduled
                    var state = task.state;
                    if (state !== notScheduled && state !== unknown) {
                        if (type == eventTask || isPeriodic || (isRefreshable && state === scheduling)) {
                            reEntryGuard && zoneTask._transitionTo(scheduled, running, scheduling);
                        }
                        else {
                            var zoneDelegates = zoneTask._zoneDelegates;
                            this._updateTaskCount(zoneTask, -1);
                            reEntryGuard && zoneTask._transitionTo(notScheduled, running, notScheduled);
                            if (isRefreshable) {
                                zoneTask._zoneDelegates = zoneDelegates;
                            }
                        }
                    }
                    _currentZoneFrame = _currentZoneFrame.parent;
                    _currentTask = previousTask;
                }
            };
            ZoneImpl.prototype.scheduleTask = function (task) {
                if (task.zone && task.zone !== this) {
                    // check if the task was rescheduled, the newZone
                    // should not be the children of the original zone
                    var newZone = this;
                    while (newZone) {
                        if (newZone === task.zone) {
                            throw Error("can not reschedule task to ".concat(this.name, " which is descendants of the original zone ").concat(task.zone.name));
                        }
                        newZone = newZone.parent;
                    }
                }
                task._transitionTo(scheduling, notScheduled);
                var zoneDelegates = [];
                task._zoneDelegates = zoneDelegates;
                task._zone = this;
                try {
                    task = this._zoneDelegate.scheduleTask(this, task);
                }
                catch (err) {
                    // should set task's state to unknown when scheduleTask throw error
                    // because the err may from reschedule, so the fromState maybe notScheduled
                    task._transitionTo(unknown, scheduling, notScheduled);
                    // TODO: @JiaLiPassion, should we check the result from handleError?
                    this._zoneDelegate.handleError(this, err);
                    throw err;
                }
                if (task._zoneDelegates === zoneDelegates) {
                    // we have to check because internally the delegate can reschedule the task.
                    this._updateTaskCount(task, 1);
                }
                if (task.state == scheduling) {
                    task._transitionTo(scheduled, scheduling);
                }
                return task;
            };
            ZoneImpl.prototype.scheduleMicroTask = function (source, callback, data, customSchedule) {
                return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
            };
            ZoneImpl.prototype.scheduleMacroTask = function (source, callback, data, customSchedule, customCancel) {
                return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
            };
            ZoneImpl.prototype.scheduleEventTask = function (source, callback, data, customSchedule, customCancel) {
                return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
            };
            ZoneImpl.prototype.cancelTask = function (task) {
                if (task.zone != this)
                    throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
                        (task.zone || NO_ZONE).name +
                        '; Execution: ' +
                        this.name +
                        ')');
                if (task.state !== scheduled && task.state !== running) {
                    return;
                }
                task._transitionTo(canceling, scheduled, running);
                try {
                    this._zoneDelegate.cancelTask(this, task);
                }
                catch (err) {
                    // if error occurs when cancelTask, transit the state to unknown
                    task._transitionTo(unknown, canceling);
                    this._zoneDelegate.handleError(this, err);
                    throw err;
                }
                this._updateTaskCount(task, -1);
                task._transitionTo(notScheduled, canceling);
                task.runCount = -1;
                return task;
            };
            ZoneImpl.prototype._updateTaskCount = function (task, count) {
                var zoneDelegates = task._zoneDelegates;
                if (count == -1) {
                    task._zoneDelegates = null;
                }
                for (var i = 0; i < zoneDelegates.length; i++) {
                    zoneDelegates[i]._updateTaskCount(task.type, count);
                }
            };
            ZoneImpl.__symbol__ = __symbol__;
            return ZoneImpl;
        }());
        var DELEGATE_ZS = {
            name: '',
            onHasTask: function (delegate, _, target, hasTaskState) { return delegate.hasTask(target, hasTaskState); },
            onScheduleTask: function (delegate, _, target, task) { return delegate.scheduleTask(target, task); },
            onInvokeTask: function (delegate, _, target, task, applyThis, applyArgs) { return delegate.invokeTask(target, task, applyThis, applyArgs); },
            onCancelTask: function (delegate, _, target, task) { return delegate.cancelTask(target, task); },
        };
        var _ZoneDelegate = /** @class */ (function () {
            function _ZoneDelegate(zone, parentDelegate, zoneSpec) {
                this._taskCounts = {
                    'microTask': 0,
                    'macroTask': 0,
                    'eventTask': 0,
                };
                this._zone = zone;
                this._parentDelegate = parentDelegate;
                this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
                this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
                this._forkCurrZone =
                    zoneSpec && (zoneSpec.onFork ? this._zone : parentDelegate._forkCurrZone);
                this._interceptZS =
                    zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
                this._interceptDlgt =
                    zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
                this._interceptCurrZone =
                    zoneSpec && (zoneSpec.onIntercept ? this._zone : parentDelegate._interceptCurrZone);
                this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
                this._invokeDlgt =
                    zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
                this._invokeCurrZone =
                    zoneSpec && (zoneSpec.onInvoke ? this._zone : parentDelegate._invokeCurrZone);
                this._handleErrorZS =
                    zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
                this._handleErrorDlgt =
                    zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
                this._handleErrorCurrZone =
                    zoneSpec && (zoneSpec.onHandleError ? this._zone : parentDelegate._handleErrorCurrZone);
                this._scheduleTaskZS =
                    zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
                this._scheduleTaskDlgt =
                    zoneSpec && (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
                this._scheduleTaskCurrZone =
                    zoneSpec && (zoneSpec.onScheduleTask ? this._zone : parentDelegate._scheduleTaskCurrZone);
                this._invokeTaskZS =
                    zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
                this._invokeTaskDlgt =
                    zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
                this._invokeTaskCurrZone =
                    zoneSpec && (zoneSpec.onInvokeTask ? this._zone : parentDelegate._invokeTaskCurrZone);
                this._cancelTaskZS =
                    zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
                this._cancelTaskDlgt =
                    zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
                this._cancelTaskCurrZone =
                    zoneSpec && (zoneSpec.onCancelTask ? this._zone : parentDelegate._cancelTaskCurrZone);
                this._hasTaskZS = null;
                this._hasTaskDlgt = null;
                this._hasTaskDlgtOwner = null;
                this._hasTaskCurrZone = null;
                var zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
                var parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
                if (zoneSpecHasTask || parentHasTask) {
                    // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
                    // a case all task related interceptors must go through this ZD. We can't short circuit it.
                    this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
                    this._hasTaskDlgt = parentDelegate;
                    this._hasTaskDlgtOwner = this;
                    this._hasTaskCurrZone = this._zone;
                    if (!zoneSpec.onScheduleTask) {
                        this._scheduleTaskZS = DELEGATE_ZS;
                        this._scheduleTaskDlgt = parentDelegate;
                        this._scheduleTaskCurrZone = this._zone;
                    }
                    if (!zoneSpec.onInvokeTask) {
                        this._invokeTaskZS = DELEGATE_ZS;
                        this._invokeTaskDlgt = parentDelegate;
                        this._invokeTaskCurrZone = this._zone;
                    }
                    if (!zoneSpec.onCancelTask) {
                        this._cancelTaskZS = DELEGATE_ZS;
                        this._cancelTaskDlgt = parentDelegate;
                        this._cancelTaskCurrZone = this._zone;
                    }
                }
            }
            Object.defineProperty(_ZoneDelegate.prototype, "zone", {
                get: function () {
                    return this._zone;
                },
                enumerable: false,
                configurable: true
            });
            _ZoneDelegate.prototype.fork = function (targetZone, zoneSpec) {
                return this._forkZS
                    ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec)
                    : new ZoneImpl(targetZone, zoneSpec);
            };
            _ZoneDelegate.prototype.intercept = function (targetZone, callback, source) {
                return this._interceptZS
                    ? this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source)
                    : callback;
            };
            _ZoneDelegate.prototype.invoke = function (targetZone, callback, applyThis, applyArgs, source) {
                return this._invokeZS
                    ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source)
                    : callback.apply(applyThis, applyArgs);
            };
            _ZoneDelegate.prototype.handleError = function (targetZone, error) {
                return this._handleErrorZS
                    ? this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error)
                    : true;
            };
            _ZoneDelegate.prototype.scheduleTask = function (targetZone, task) {
                var returnTask = task;
                if (this._scheduleTaskZS) {
                    if (this._hasTaskZS) {
                        returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
                    }
                    returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
                    if (!returnTask)
                        returnTask = task;
                }
                else {
                    if (task.scheduleFn) {
                        task.scheduleFn(task);
                    }
                    else if (task.type == microTask) {
                        scheduleMicroTask(task);
                    }
                    else {
                        throw new Error('Task is missing scheduleFn.');
                    }
                }
                return returnTask;
            };
            _ZoneDelegate.prototype.invokeTask = function (targetZone, task, applyThis, applyArgs) {
                return this._invokeTaskZS
                    ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs)
                    : task.callback.apply(applyThis, applyArgs);
            };
            _ZoneDelegate.prototype.cancelTask = function (targetZone, task) {
                var value;
                if (this._cancelTaskZS) {
                    value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
                }
                else {
                    if (!task.cancelFn) {
                        throw Error('Task is not cancelable');
                    }
                    value = task.cancelFn(task);
                }
                return value;
            };
            _ZoneDelegate.prototype.hasTask = function (targetZone, isEmpty) {
                // hasTask should not throw error so other ZoneDelegate
                // can still trigger hasTask callback
                try {
                    this._hasTaskZS &&
                        this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
                }
                catch (err) {
                    this.handleError(targetZone, err);
                }
            };
            _ZoneDelegate.prototype._updateTaskCount = function (type, count) {
                var counts = this._taskCounts;
                var prev = counts[type];
                var next = (counts[type] = prev + count);
                if (next < 0) {
                    throw new Error('More tasks executed then were scheduled.');
                }
                if (prev == 0 || next == 0) {
                    var isEmpty = {
                        microTask: counts['microTask'] > 0,
                        macroTask: counts['macroTask'] > 0,
                        eventTask: counts['eventTask'] > 0,
                        change: type,
                    };
                    this.hasTask(this._zone, isEmpty);
                }
            };
            return _ZoneDelegate;
        }());
        var ZoneTask = /** @class */ (function () {
            function ZoneTask(type, source, callback, options, scheduleFn, cancelFn) {
                this._zone = null;
                this.runCount = 0;
                this._zoneDelegates = null;
                this._state = 'notScheduled';
                this.type = type;
                this.source = source;
                this.data = options;
                this.scheduleFn = scheduleFn;
                this.cancelFn = cancelFn;
                if (!callback) {
                    throw new Error('callback is not defined');
                }
                this.callback = callback;
                var self = this;
                // TODO: @JiaLiPassion options should have interface
                if (type === eventTask && options && options.useG) {
                    this.invoke = ZoneTask.invokeTask;
                }
                else {
                    this.invoke = function () {
                        return ZoneTask.invokeTask.call(global, self, this, arguments);
                    };
                }
            }
            ZoneTask.invokeTask = function (task, target, args) {
                if (!task) {
                    task = this;
                }
                _numberOfNestedTaskFrames++;
                try {
                    task.runCount++;
                    return task.zone.runTask(task, target, args);
                }
                finally {
                    if (_numberOfNestedTaskFrames == 1) {
                        drainMicroTaskQueue();
                    }
                    _numberOfNestedTaskFrames--;
                }
            };
            Object.defineProperty(ZoneTask.prototype, "zone", {
                get: function () {
                    return this._zone;
                },
                enumerable: false,
                configurable: true
            });
            Object.defineProperty(ZoneTask.prototype, "state", {
                get: function () {
                    return this._state;
                },
                enumerable: false,
                configurable: true
            });
            ZoneTask.prototype.cancelScheduleRequest = function () {
                this._transitionTo(notScheduled, scheduling);
            };
            ZoneTask.prototype._transitionTo = function (toState, fromState1, fromState2) {
                if (this._state === fromState1 || this._state === fromState2) {
                    this._state = toState;
                    if (toState == notScheduled) {
                        this._zoneDelegates = null;
                    }
                }
                else {
                    throw new Error("".concat(this.type, " '").concat(this.source, "': can not transition to '").concat(toState, "', expecting state '").concat(fromState1, "'").concat(fromState2 ? " or '" + fromState2 + "'" : '', ", was '").concat(this._state, "'."));
                }
            };
            ZoneTask.prototype.toString = function () {
                if (this.data && typeof this.data.handleId !== 'undefined') {
                    return this.data.handleId.toString();
                }
                else {
                    return Object.prototype.toString.call(this);
                }
            };
            // add toJSON method to prevent cyclic error when
            // call JSON.stringify(zoneTask)
            ZoneTask.prototype.toJSON = function () {
                return {
                    type: this.type,
                    state: this.state,
                    source: this.source,
                    zone: this.zone.name,
                    runCount: this.runCount,
                };
            };
            return ZoneTask;
        }());
        //////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        ///  MICROTASK QUEUE
        //////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        var symbolSetTimeout = __symbol__('setTimeout');
        var symbolPromise = __symbol__('Promise');
        var symbolThen = __symbol__('then');
        var _microTaskQueue = [];
        var _isDrainingMicrotaskQueue = false;
        var nativeMicroTaskQueuePromise;
        function nativeScheduleMicroTask(func) {
            if (!nativeMicroTaskQueuePromise) {
                if (global[symbolPromise]) {
                    nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
                }
            }
            if (nativeMicroTaskQueuePromise) {
                var nativeThen = nativeMicroTaskQueuePromise[symbolThen];
                if (!nativeThen) {
                    // native Promise is not patchable, we need to use `then` directly
                    // issue 1078
                    nativeThen = nativeMicroTaskQueuePromise['then'];
                }
                nativeThen.call(nativeMicroTaskQueuePromise, func);
            }
            else {
                global[symbolSetTimeout](func, 0);
            }
        }
        function scheduleMicroTask(task) {
            // if we are not running in any task, and there has not been anything scheduled
            // we must bootstrap the initial task creation by manually scheduling the drain
            if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
                // We are not running in Task, so we need to kickstart the microtask queue.
                nativeScheduleMicroTask(drainMicroTaskQueue);
            }
            task && _microTaskQueue.push(task);
        }
        function drainMicroTaskQueue() {
            if (!_isDrainingMicrotaskQueue) {
                _isDrainingMicrotaskQueue = true;
                while (_microTaskQueue.length) {
                    var queue = _microTaskQueue;
                    _microTaskQueue = [];
                    for (var i = 0; i < queue.length; i++) {
                        var task = queue[i];
                        try {
                            task.zone.runTask(task, null, null);
                        }
                        catch (error) {
                            _api.onUnhandledError(error);
                        }
                    }
                }
                _api.microtaskDrainDone();
                _isDrainingMicrotaskQueue = false;
            }
        }
        //////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        ///  BOOTSTRAP
        //////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        var NO_ZONE = { name: 'NO ZONE' };
        var notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
        var microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
        var patches = {};
        var _api = {
            symbol: __symbol__,
            currentZoneFrame: function () { return _currentZoneFrame; },
            onUnhandledError: noop,
            microtaskDrainDone: noop,
            scheduleMicroTask: scheduleMicroTask,
            showUncaughtError: function () { return !ZoneImpl[__symbol__('ignoreConsoleErrorUncaughtError')]; },
            patchEventTarget: function () { return []; },
            patchOnProperties: noop,
            patchMethod: function () { return noop; },
            bindArguments: function () { return []; },
            patchThen: function () { return noop; },
            patchMacroTask: function () { return noop; },
            patchEventPrototype: function () { return noop; },
            isIEOrEdge: function () { return false; },
            getGlobalObjects: function () { return undefined; },
            ObjectDefineProperty: function () { return noop; },
            ObjectGetOwnPropertyDescriptor: function () { return undefined; },
            ObjectCreate: function () { return undefined; },
            ArraySlice: function () { return []; },
            patchClass: function () { return noop; },
            wrapWithCurrentZone: function () { return noop; },
            filterProperties: function () { return []; },
            attachOriginToPatched: function () { return noop; },
            _redefineProperty: function () { return noop; },
            patchCallbacks: function () { return noop; },
            nativeScheduleMicroTask: nativeScheduleMicroTask,
        };
        var _currentZoneFrame = { parent: null, zone: new ZoneImpl(null, null) };
        var _currentTask = null;
        var _numberOfNestedTaskFrames = 0;
        function noop() { }
        performanceMeasure('Zone', 'Zone');
        return ZoneImpl;
    }
    /**
     * Suppress closure compiler errors about unknown 'Zone' variable
     * @fileoverview
     * @suppress {undefinedVars,globalThis,missingRequire}
     */
    /// <reference types="node"/>
    // issue #989, to reduce bundle size, use short name
    /** Object.getOwnPropertyDescriptor */
    var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
    /** Object.defineProperty */
    var ObjectDefineProperty = Object.defineProperty;
    /** Object.getPrototypeOf */
    var ObjectGetPrototypeOf = Object.getPrototypeOf;
    /** Object.create */
    var ObjectCreate = Object.create;
    /** Array.prototype.slice */
    var ArraySlice = Array.prototype.slice;
    /** addEventListener string const */
    var ADD_EVENT_LISTENER_STR = 'addEventListener';
    /** removeEventListener string const */
    var REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
    /** zoneSymbol addEventListener */
    var ZONE_SYMBOL_ADD_EVENT_LISTENER = __symbol__(ADD_EVENT_LISTENER_STR);
    /** zoneSymbol removeEventListener */
    var ZONE_SYMBOL_REMOVE_EVENT_LISTENER = __symbol__(REMOVE_EVENT_LISTENER_STR);
    /** true string const */
    var TRUE_STR = 'true';
    /** false string const */
    var FALSE_STR = 'false';
    /** Zone symbol prefix string const. */
    var ZONE_SYMBOL_PREFIX = __symbol__('');
    function wrapWithCurrentZone(callback, source) {
        return Zone.current.wrap(callback, source);
    }
    function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
        return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
    }
    var zoneSymbol = __symbol__;
    var isWindowExists = typeof window !== 'undefined';
    var internalWindow = isWindowExists ? window : undefined;
    var _global = (isWindowExists && internalWindow) || globalThis;
    var REMOVE_ATTRIBUTE = 'removeAttribute';
    function bindArguments(args, source) {
        for (var i = args.length - 1; i >= 0; i--) {
            if (typeof args[i] === 'function') {
                args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
            }
        }
        return args;
    }
    function patchPrototype(prototype, fnNames) {
        var source = prototype.constructor['name'];
        var _loop_1 = function (i) {
            var name_1 = fnNames[i];
            var delegate = prototype[name_1];
            if (delegate) {
                var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name_1);
                if (!isPropertyWritable(prototypeDesc)) {
                    return "continue";
                }
                prototype[name_1] = (function (delegate) {
                    var patched = function () {
                        return delegate.apply(this, bindArguments(arguments, source + '.' + name_1));
                    };
                    attachOriginToPatched(patched, delegate);
                    return patched;
                })(delegate);
            }
        };
        for (var i = 0; i < fnNames.length; i++) {
            _loop_1(i);
        }
    }
    function isPropertyWritable(propertyDesc) {
        if (!propertyDesc) {
            return true;
        }
        if (propertyDesc.writable === false) {
            return false;
        }
        return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
    }
    var isWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
    // Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
    // this code.
    var isNode = !('nw' in _global) &&
        typeof _global.process !== 'undefined' &&
        _global.process.toString() === '[object process]';
    var isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
    // we are in electron of nw, so we are both browser and nodejs
    // Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
    // this code.
    var isMix = typeof _global.process !== 'undefined' &&
        _global.process.toString() === '[object process]' &&
        !isWebWorker &&
        !!(isWindowExists && internalWindow['HTMLElement']);
    var zoneSymbolEventNames$1 = {};
    var enableBeforeunloadSymbol = zoneSymbol('enable_beforeunload');
    var wrapFn = function (event) {
        // https://github.com/angular/zone.js/issues/911, in IE, sometimes
        // event will be undefined, so we need to use window.event
        event = event || _global.event;
        if (!event) {
            return;
        }
        var eventNameSymbol = zoneSymbolEventNames$1[event.type];
        if (!eventNameSymbol) {
            eventNameSymbol = zoneSymbolEventNames$1[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
        }
        var target = this || event.target || _global;
        var listener = target[eventNameSymbol];
        var result;
        if (isBrowser && target === internalWindow && event.type === 'error') {
            // window.onerror have different signature
            // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
            // and onerror callback will prevent default when callback return true
            var errorEvent = event;
            result =
                listener &&
                    listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
            if (result === true) {
                event.preventDefault();
            }
        }
        else {
            result = listener && listener.apply(this, arguments);
            if (
            // https://github.com/angular/angular/issues/47579
            // https://www.w3.org/TR/2011/WD-html5-20110525/history.html#beforeunloadevent
            // This is the only specific case we should check for. The spec defines that the
            // `returnValue` attribute represents the message to show the user. When the event
            // is created, this attribute must be set to the empty string.
            event.type === 'beforeunload' &&
                // To prevent any breaking changes resulting from this change, given that
                // it was already causing a significant number of failures in G3, we have hidden
                // that behavior behind a global configuration flag. Consumers can enable this
                // flag explicitly if they want the `beforeunload` event to be handled as defined
                // in the specification.
                _global[enableBeforeunloadSymbol] &&
                // The IDL event definition is `attribute DOMString returnValue`, so we check whether
                // `typeof result` is a string.
                typeof result === 'string') {
                event.returnValue = result;
            }
            else if (result != undefined && !result) {
                event.preventDefault();
            }
        }
        return result;
    };
    function patchProperty(obj, prop, prototype) {
        var desc = ObjectGetOwnPropertyDescriptor(obj, prop);
        if (!desc && prototype) {
            // when patch window object, use prototype to check prop exist or not
            var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
            if (prototypeDesc) {
                desc = { enumerable: true, configurable: true };
            }
        }
        // if the descriptor not exists or is not configurable
        // just return
        if (!desc || !desc.configurable) {
            return;
        }
        var onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
        if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
            return;
        }
        // A property descriptor cannot have getter/setter and be writable
        // deleting the writable and value properties avoids this error:
        //
        // TypeError: property descriptors must not specify a value or be writable when a
        // getter or setter has been specified
        delete desc.writable;
        delete desc.value;
        var originalDescGet = desc.get;
        var originalDescSet = desc.set;
        // slice(2) cuz 'onclick' -> 'click', etc
        var eventName = prop.slice(2);
        var eventNameSymbol = zoneSymbolEventNames$1[eventName];
        if (!eventNameSymbol) {
            eventNameSymbol = zoneSymbolEventNames$1[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
        }
        desc.set = function (newValue) {
            // In some versions of Windows, the `this` context may be undefined
            // in on-property callbacks.
            // To handle this edge case, we check if `this` is falsy and
            // fallback to `_global` if needed.
            var target = this;
            if (!target && obj === _global) {
                target = _global;
            }
            if (!target) {
                return;
            }
            var previousValue = target[eventNameSymbol];
            if (typeof previousValue === 'function') {
                target.removeEventListener(eventName, wrapFn);
            }
            // https://github.com/angular/zone.js/issues/978
            // If an inline handler (like `onload`) was defined before zone.js was loaded,
            // call the original descriptor's setter to clean it up.
            originalDescSet === null || originalDescSet === void 0 ? void 0 : originalDescSet.call(target, null);
            target[eventNameSymbol] = newValue;
            if (typeof newValue === 'function') {
                target.addEventListener(eventName, wrapFn, false);
            }
        };
        // The getter would return undefined for unassigned properties but the default value of an
        // unassigned property is null
        desc.get = function () {
            // in some of windows's onproperty callback, this is undefined
            // so we need to check it
            var target = this;
            if (!target && obj === _global) {
                target = _global;
            }
            if (!target) {
                return null;
            }
            var listener = target[eventNameSymbol];
            if (listener) {
                return listener;
            }
            else if (originalDescGet) {
                // result will be null when use inline event attribute,
                // such as <button onclick="func();">OK</button>
                // because the onclick function is internal raw uncompiled handler
                // the onclick will be evaluated when first time event was triggered or
                // the property is accessed, https://github.com/angular/zone.js/issues/525
                // so we should use original native get to retrieve the handler
                var value = originalDescGet.call(this);
                if (value) {
                    desc.set.call(this, value);
                    if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
                        target.removeAttribute(prop);
                    }
                    return value;
                }
            }
            return null;
        };
        ObjectDefineProperty(obj, prop, desc);
        obj[onPropPatchedSymbol] = true;
    }
    function patchOnProperties(obj, properties, prototype) {
        if (properties) {
            for (var i = 0; i < properties.length; i++) {
                patchProperty(obj, 'on' + properties[i], prototype);
            }
        }
        else {
            var onProperties = [];
            for (var prop in obj) {
                if (prop.slice(0, 2) == 'on') {
                    onProperties.push(prop);
                }
            }
            for (var j = 0; j < onProperties.length; j++) {
                patchProperty(obj, onProperties[j], prototype);
            }
        }
    }
    var originalInstanceKey = zoneSymbol('originalInstance');
    // wrap some native API on `window`
    function patchClass(className) {
        var OriginalClass = _global[className];
        if (!OriginalClass)
            return;
        // keep original class in global
        _global[zoneSymbol(className)] = OriginalClass;
        _global[className] = function () {
            var a = bindArguments(arguments, className);
            switch (a.length) {
                case 0:
                    this[originalInstanceKey] = new OriginalClass();
                    break;
                case 1:
                    this[originalInstanceKey] = new OriginalClass(a[0]);
                    break;
                case 2:
                    this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
                    break;
                case 3:
                    this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
                    break;
                case 4:
                    this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
                    break;
                default:
                    throw new Error('Arg list too long.');
            }
        };
        // attach original delegate to patched function
        attachOriginToPatched(_global[className], OriginalClass);
        var instance = new OriginalClass(function () { });
        var prop;
        for (prop in instance) {
            // https://bugs.webkit.org/show_bug.cgi?id=44721
            if (className === 'XMLHttpRequest' && prop === 'responseBlob')
                continue;
            (function (prop) {
                if (typeof instance[prop] === 'function') {
                    _global[className].prototype[prop] = function () {
                        return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
                    };
                }
                else {
                    ObjectDefineProperty(_global[className].prototype, prop, {
                        set: function (fn) {
                            if (typeof fn === 'function') {
                                this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
                                // keep callback in wrapped function so we can
                                // use it in Function.prototype.toString to return
                                // the native one.
                                attachOriginToPatched(this[originalInstanceKey][prop], fn);
                            }
                            else {
                                this[originalInstanceKey][prop] = fn;
                            }
                        },
                        get: function () {
                            return this[originalInstanceKey][prop];
                        },
                    });
                }
            })(prop);
        }
        for (prop in OriginalClass) {
            if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
                _global[className][prop] = OriginalClass[prop];
            }
        }
    }
    function copySymbolProperties(src, dest) {
        if (typeof Object.getOwnPropertySymbols !== 'function') {
            return;
        }
        var symbols = Object.getOwnPropertySymbols(src);
        symbols.forEach(function (symbol) {
            var desc = Object.getOwnPropertyDescriptor(src, symbol);
            Object.defineProperty(dest, symbol, {
                get: function () {
                    return src[symbol];
                },
                set: function (value) {
                    if (desc && (!desc.writable || typeof desc.set !== 'function')) {
                        // if src[symbol] is not writable or not have a setter, just return
                        return;
                    }
                    src[symbol] = value;
                },
                enumerable: desc ? desc.enumerable : true,
                configurable: desc ? desc.configurable : true,
            });
        });
    }
    var shouldCopySymbolProperties = false;
    function setShouldCopySymbolProperties(flag) {
        shouldCopySymbolProperties = flag;
    }
    function patchMethod(target, name, patchFn) {
        var proto = target;
        while (proto && !proto.hasOwnProperty(name)) {
            proto = ObjectGetPrototypeOf(proto);
        }
        if (!proto && target[name]) {
            // somehow we did not find it, but we can see it. This happens on IE for Window properties.
            proto = target;
        }
        var delegateName = zoneSymbol(name);
        var delegate = null;
        if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
            delegate = proto[delegateName] = proto[name];
            // check whether proto[name] is writable
            // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
            var desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
            if (isPropertyWritable(desc)) {
                var patchDelegate_1 = patchFn(delegate, delegateName, name);
                proto[name] = function () {
                    return patchDelegate_1(this, arguments);
                };
                attachOriginToPatched(proto[name], delegate);
                if (shouldCopySymbolProperties) {
                    copySymbolProperties(delegate, proto[name]);
                }
            }
        }
        return delegate;
    }
    // TODO: @JiaLiPassion, support cancel task later if necessary
    function patchMacroTask(obj, funcName, metaCreator) {
        var setNative = null;
        function scheduleTask(task) {
            var data = task.data;
            data.args[data.cbIdx] = function () {
                task.invoke.apply(this, arguments);
            };
            setNative.apply(data.target, data.args);
            return task;
        }
        setNative = patchMethod(obj, funcName, function (delegate) { return function (self, args) {
            var meta = metaCreator(self, args);
            if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
                return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
            }
            else {
                // cause an error by calling it directly.
                return delegate.apply(self, args);
            }
        }; });
    }
    function patchMicroTask(obj, funcName, metaCreator) {
        var setNative = null;
        function scheduleTask(task) {
            var data = task.data;
            data.args[data.cbIdx] = function () {
                task.invoke.apply(this, arguments);
            };
            setNative.apply(data.target, data.args);
            return task;
        }
        setNative = patchMethod(obj, funcName, function (delegate) { return function (self, args) {
            var meta = metaCreator(self, args);
            if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
                return Zone.current.scheduleMicroTask(meta.name, args[meta.cbIdx], meta, scheduleTask);
            }
            else {
                // cause an error by calling it directly.
                return delegate.apply(self, args);
            }
        }; });
    }
    function attachOriginToPatched(patched, original) {
        patched[zoneSymbol('OriginalDelegate')] = original;
    }
    var isDetectedIEOrEdge = false;
    var ieOrEdge = false;
    function isIEOrEdge() {
        if (isDetectedIEOrEdge) {
            return ieOrEdge;
        }
        isDetectedIEOrEdge = true;
        try {
            var ua = internalWindow.navigator.userAgent;
            if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
                ieOrEdge = true;
            }
        }
        catch (error) { }
        return ieOrEdge;
    }
    function isFunction(value) {
        return typeof value === 'function';
    }
    function isNumber(value) {
        return typeof value === 'number';
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    // an identifier to tell ZoneTask do not create a new invoke closure
    var OPTIMIZED_ZONE_EVENT_TASK_DATA = {
        useG: true,
    };
    var zoneSymbolEventNames = {};
    var globalSources = {};
    var EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
    var IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
    function prepareEventNames(eventName, eventNameToString) {
        var falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
        var trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
        var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
        var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
        zoneSymbolEventNames[eventName] = {};
        zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
        zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
    }
    function patchEventTarget(_global, api, apis, patchOptions) {
        var ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
        var REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
        var LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
        var REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
        var zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
        var ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
        var PREPEND_EVENT_LISTENER = 'prependListener';
        var PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
        var invokeTask = function (task, target, event) {
            // for better performance, check isRemoved which is set
            // by removeEventListener
            if (task.isRemoved) {
                return;
            }
            var delegate = task.callback;
            if (typeof delegate === 'object' && delegate.handleEvent) {
                // create the bind version of handleEvent when invoke
                task.callback = function (event) { return delegate.handleEvent(event); };
                task.originalDelegate = delegate;
            }
            // invoke static task.invoke
            // need to try/catch error here, otherwise, the error in one event listener
            // will break the executions of the other event listeners. Also error will
            // not remove the event listener when `once` options is true.
            var error;
            try {
                task.invoke(task, target, [event]);
            }
            catch (err) {
                error = err;
            }
            var options = task.options;
            if (options && typeof options === 'object' && options.once) {
                // if options.once is true, after invoke once remove listener here
                // only browser need to do this, nodejs eventEmitter will cal removeListener
                // inside EventEmitter.once
                var delegate_1 = task.originalDelegate ? task.originalDelegate : task.callback;
                target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate_1, options);
            }
            return error;
        };
        function globalCallback(context, event, isCapture) {
            // https://github.com/angular/zone.js/issues/911, in IE, sometimes
            // event will be undefined, so we need to use window.event
            event = event || _global.event;
            if (!event) {
                return;
            }
            // event.target is needed for Samsung TV and SourceBuffer
            // || global is needed https://github.com/angular/zone.js/issues/190
            var target = context || event.target || _global;
            var tasks = target[zoneSymbolEventNames[event.type][isCapture ? TRUE_STR : FALSE_STR]];
            if (tasks) {
                var errors = [];
                // invoke all tasks which attached to current target with given event.type and capture = false
                // for performance concern, if task.length === 1, just invoke
                if (tasks.length === 1) {
                    var err = invokeTask(tasks[0], target, event);
                    err && errors.push(err);
                }
                else {
                    // https://github.com/angular/zone.js/issues/836
                    // copy the tasks array before invoke, to avoid
                    // the callback will remove itself or other listener
                    var copyTasks = tasks.slice();
                    for (var i = 0; i < copyTasks.length; i++) {
                        if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
                            break;
                        }
                        var err = invokeTask(copyTasks[i], target, event);
                        err && errors.push(err);
                    }
                }
                // Since there is only one error, we don't need to schedule microTask
                // to throw the error.
                if (errors.length === 1) {
                    throw errors[0];
                }
                else {
                    var _loop_2 = function (i) {
                        var err = errors[i];
                        api.nativeScheduleMicroTask(function () {
                            throw err;
                        });
                    };
                    for (var i = 0; i < errors.length; i++) {
                        _loop_2(i);
                    }
                }
            }
        }
        // global shared zoneAwareCallback to handle all event callback with capture = false
        var globalZoneAwareCallback = function (event) {
            return globalCallback(this, event, false);
        };
        // global shared zoneAwareCallback to handle all event callback with capture = true
        var globalZoneAwareCaptureCallback = function (event) {
            return globalCallback(this, event, true);
        };
        function patchEventTargetMethods(obj, patchOptions) {
            if (!obj) {
                return false;
            }
            var useGlobalCallback = true;
            if (patchOptions && patchOptions.useG !== undefined) {
                useGlobalCallback = patchOptions.useG;
            }
            var validateHandler = patchOptions && patchOptions.vh;
            var checkDuplicate = true;
            if (patchOptions && patchOptions.chkDup !== undefined) {
                checkDuplicate = patchOptions.chkDup;
            }
            var returnTarget = false;
            if (patchOptions && patchOptions.rt !== undefined) {
                returnTarget = patchOptions.rt;
            }
            var proto = obj;
            while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
                proto = ObjectGetPrototypeOf(proto);
            }
            if (!proto && obj[ADD_EVENT_LISTENER]) {
                // somehow we did not find it, but we can see it. This happens on IE for Window properties.
                proto = obj;
            }
            if (!proto) {
                return false;
            }
            if (proto[zoneSymbolAddEventListener]) {
                return false;
            }
            var eventNameToString = patchOptions && patchOptions.eventNameToString;
            // We use a shared global `taskData` to pass data for `scheduleEventTask`,
            // eliminating the need to create a new object solely for passing data.
            // WARNING: This object has a static lifetime, meaning it is not created
            // each time `addEventListener` is called. It is instantiated only once
            // and captured by reference inside the `addEventListener` and
            // `removeEventListener` functions. Do not add any new properties to this
            // object, as doing so would necessitate maintaining the information
            // between `addEventListener` calls.
            var taskData = {};
            var nativeAddEventListener = (proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER]);
            var nativeRemoveEventListener = (proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
                proto[REMOVE_EVENT_LISTENER]);
            var nativeListeners = (proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
                proto[LISTENERS_EVENT_LISTENER]);
            var nativeRemoveAllListeners = (proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
                proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER]);
            var nativePrependEventListener;
            if (patchOptions && patchOptions.prepend) {
                nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
                    proto[patchOptions.prepend];
            }
            /**
             * This util function will build an option object with passive option
             * to handle all possible input from the user.
             */
            function buildEventListenerOptions(options, passive) {
                if (!passive) {
                    return options;
                }
                if (typeof options === 'boolean') {
                    return { capture: options, passive: true };
                }
                if (!options) {
                    return { passive: true };
                }
                if (typeof options === 'object' && options.passive !== false) {
                    return __assign(__assign({}, options), { passive: true });
                }
                return options;
            }
            var customScheduleGlobal = function (task) {
                // if there is already a task for the eventName + capture,
                // just return, because we use the shared globalZoneAwareCallback here.
                if (taskData.isExisting) {
                    return;
                }
                return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
            };
            /**
             * In the context of events and listeners, this function will be
             * called at the end by `cancelTask`, which, in turn, calls `task.cancelFn`.
             * Cancelling a task is primarily used to remove event listeners from
             * the task target.
             */
            var customCancelGlobal = function (task) {
                // if task is not marked as isRemoved, this call is directly
                // from Zone.prototype.cancelTask, we should remove the task
                // from tasksList of target first
                if (!task.isRemoved) {
                    var symbolEventNames = zoneSymbolEventNames[task.eventName];
                    var symbolEventName = void 0;
                    if (symbolEventNames) {
                        symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
                    }
                    var existingTasks = symbolEventName && task.target[symbolEventName];
                    if (existingTasks) {
                        for (var i = 0; i < existingTasks.length; i++) {
                            var existingTask = existingTasks[i];
                            if (existingTask === task) {
                                existingTasks.splice(i, 1);
                                // set isRemoved to data for faster invokeTask check
                                task.isRemoved = true;
                                if (task.removeAbortListener) {
                                    task.removeAbortListener();
                                       task.removeAbortListener = null;
                                }
                                if (existingTasks.length === 0) {
                                    // all tasks for the eventName + capture have gone,
                                    // remove globalZoneAwareCallback and remove the task cache from target
                                    task.allRemoved = true;
                                    task.target[symbolEventName] = null;
                                }
                                break;
                            }
                        }
                    }
                }
                // if all tasks for the eventName + capture have gone,
                // we will really remove the global event callback,
                // if not, return
                if (!task.allRemoved) {
                    return;
                }
                return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
            };
            var customScheduleNonGlobal = function (task) {
                return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
            };
            var customSchedulePrepend = function (task) {
                return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
            };
            var customCancelNonGlobal = function (task) {
                return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
            };
            var customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
            var customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
            var compareTaskCallbackVsDelegate = function (task, delegate) {
                var typeOfDelegate = typeof delegate;
                return ((typeOfDelegate === 'function' && task.callback === delegate) ||
                    (typeOfDelegate === 'object' && task.originalDelegate === delegate));
            };
            var compare = (patchOptions === null || patchOptions === void 0 ? void 0 : patchOptions.diff) || compareTaskCallbackVsDelegate;
            var unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];
            var passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];
            function copyEventListenerOptions(options) {
                if (typeof options === 'object' && options !== null) {
                    // We need to destructure the target `options` object since it may
                    // be frozen or sealed (possibly provided implicitly by a third-party
                    // library), or its properties may be readonly.
                    var newOptions = __assign({}, options);
                    // The `signal` option was recently introduced, which caused regressions in
                    // third-party scenarios where `AbortController` was directly provided to
                    // `addEventListener` as options. For instance, in cases like
                    // `document.addEventListener('keydown', callback, abortControllerInstance)`,
                    // which is valid because `AbortController` includes a `signal` getter, spreading
                    // `{...options}` wouldn't copy the `signal`. Additionally, using `Object.create`
                    // isn't feasible since `AbortController` is a built-in object type, and attempting
                    // to create a new object directly with it as the prototype might result in
                    // unexpected behavior.
                    if (options.signal) {
                        newOptions.signal = options.signal;
                    }
                    return newOptions;
                }
                return options;
            }
            var makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget, prepend) {
                if (returnTarget === void 0) { returnTarget = false; }
                if (prepend === void 0) { prepend = false; }
                return function () {
                    var target = this || _global;
                    var eventName = arguments[0];
                    if (patchOptions && patchOptions.transferEventName) {
                        eventName = patchOptions.transferEventName(eventName);
                    }
                    var delegate = arguments[1];
                    if (!delegate) {
                        return nativeListener.apply(this, arguments);
                    }
                    if (isNode && eventName === 'uncaughtException') {
                        // don't patch uncaughtException of nodejs to prevent endless loop
                        return nativeListener.apply(this, arguments);
                    }
                    // To improve `addEventListener` performance, we will create the callback
                    // for the task later when the task is invoked.
                    var isEventListenerObject = false;
                    if (typeof delegate !== 'function') {
                        // This checks whether the provided listener argument is an object with
                        // a `handleEvent` method (since we can call `addEventListener` with a
                        // function `event => ...` or with an object `{ handleEvent: event => ... }`).
                        if (!delegate.handleEvent) {
                            return nativeListener.apply(this, arguments);
                        }
                        isEventListenerObject = true;
                    }
                    if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
                        return;
                    }
                    var passive = !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
                    var options = copyEventListenerOptions(buildEventListenerOptions(arguments[2], passive));
                    var signal = options === null || options === void 0 ? void 0 : options.signal;
                    if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
                        // the signal is an aborted one, just return without attaching the event listener.
                        return;
                    }
                    if (unpatchedEvents) {
                        // check unpatched list
                        for (var i = 0; i < unpatchedEvents.length; i++) {
                            if (eventName === unpatchedEvents[i]) {
                                if (passive) {
                                    return nativeListener.call(target, eventName, delegate, options);
                                }
                                else {
                                    return nativeListener.apply(this, arguments);
                                }
                            }
                        }
                    }
                    var capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
                    var once = options && typeof options === 'object' ? options.once : false;
                    var zone = Zone.current;
                    var symbolEventNames = zoneSymbolEventNames[eventName];
                    if (!symbolEventNames) {
                        prepareEventNames(eventName, eventNameToString);
                        symbolEventNames = zoneSymbolEventNames[eventName];
                    }
                    var symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
                    var existingTasks = target[symbolEventName];
                    var isExisting = false;
                    if (existingTasks) {
                        // already have task registered
                        isExisting = true;
                        if (checkDuplicate) {
                            for (var i = 0; i < existingTasks.length; i++) {
                                if (compare(existingTasks[i], delegate)) {
                                    // same callback, same capture, same event name, just return
                                    return;
                                }
                            }
                        }
                    }
                    else {
                        existingTasks = target[symbolEventName] = [];
                    }
                    var source;
                    var constructorName = target.constructor['name'];
                    var targetSource = globalSources[constructorName];
                    if (targetSource) {
                        source = targetSource[eventName];
                    }
                    if (!source) {
                        source =
                            constructorName +
                                addSource +
                                (eventNameToString ? eventNameToString(eventName) : eventName);
                    }
                    // In the code below, `options` should no longer be reassigned; instead, it
                    // should only be mutated. This is because we pass that object to the native
                    // `addEventListener`.
                    // It's generally recommended to use the same object reference for options.
                    // This ensures consistency and avoids potential issues.
                    taskData.options = options;
                    if (once) {
                        // When using `addEventListener` with the `once` option, we don't pass
                        // the `once` option directly to the native `addEventListener` method.
                        // Instead, we keep the `once` setting and handle it ourselves.
                        taskData.options.once = false;
                    }
                    taskData.target = target;
                    taskData.capture = capture;
                    taskData.eventName = eventName;
                    taskData.isExisting = isExisting;
                    var data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
                    // keep taskData into data to allow onScheduleEventTask to access the task information
                    if (data) {
                        data.taskData = taskData;
                    }
                    if (signal) {
                        // When using `addEventListener` with the `signal` option, we don't pass
                        // the `signal` option directly to the native `addEventListener` method.
                        // Instead, we keep the `signal` setting and handle it ourselves.
                        taskData.options.signal = undefined;
                    }
                    // The `scheduleEventTask` function will ultimately call `customScheduleGlobal`,
                    // which in turn calls the native `addEventListener`. This is why `taskData.options`
                    // is updated before scheduling the task, as `customScheduleGlobal` uses
                    // `taskData.options` to pass it to the native `addEventListener`.
                    var task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
                    if (signal) {
                        // after task is scheduled, we need to store the signal back to task.options
                        taskData.options.signal = signal;
                        // Wrapping `task` in a weak reference would not prevent memory leaks. Weak references are
                        // primarily used for preventing strong references cycles. `onAbort` is always reachable
                        // as it's an event listener, so its closure retains a strong reference to the `task`.
                        var onAbort_1 = function () { return task.zone.cancelTask(task); };
                        nativeListener.call(signal, 'abort', onAbort_1, { once: true });
                        // We need to remove the `abort` listener when the event listener is going to be removed,
                        // as it creates a closure that captures `task`. This closure retains a reference to the
                        // `task` object even after it goes out of scope, preventing `task` from being garbage
                        // collected.
                        task.removeAbortListener = function () { return signal.removeEventListener('abort', onAbort_1); };
                    }
                    // should clear taskData.target to avoid memory leak
                    // issue, https://github.com/angular/angular/issues/20442
                    taskData.target = null;
                    // need to clear up taskData because it is a global object
                    if (data) {
                        data.taskData = null;
                    }
                    // have to save those information to task in case
                    // application may call task.zone.cancelTask() directly
                    if (once) {
                        taskData.options.once = true;
                    }
                    if (typeof task.options !== 'boolean') {
                        // We should save the options on the task (if it's an object) because
                        // we'll be using `task.options` later when removing the event listener
                        // and passing it back to `removeEventListener`.
                        task.options = options;
                    }
                    task.target = target;
                    task.capture = capture;
                    task.eventName = eventName;
                    if (isEventListenerObject) {
                        // save original delegate for compare to check duplicate
                        task.originalDelegate = delegate;
                    }
                    if (!prepend) {
                        existingTasks.push(task);
                    }
                    else {
                        existingTasks.unshift(task);
                    }
                    if (returnTarget) {
                        return target;
                    }
                };
            };
            proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
            if (nativePrependEventListener) {
                proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
            }
            proto[REMOVE_EVENT_LISTENER] = function () {
                var target = this || _global;
                var eventName = arguments[0];
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                var options = arguments[2];
                var capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
                var delegate = arguments[1];
                if (!delegate) {
                    return nativeRemoveEventListener.apply(this, arguments);
                }
                if (validateHandler &&
                    !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
                    return;
                }
                var symbolEventNames = zoneSymbolEventNames[eventName];
                var symbolEventName;
                if (symbolEventNames) {
                    symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
                }
                var existingTasks = symbolEventName && target[symbolEventName];
                // `existingTasks` may not exist if the `addEventListener` was called before
                // it was patched by zone.js. Please refer to the attached issue for
                // clarification, particularly after the `if` condition, before calling
                // the native `removeEventListener`.
                if (existingTasks) {
                    for (var i = 0; i < existingTasks.length; i++) {
                        var existingTask = existingTasks[i];
                        if (compare(existingTask, delegate)) {
                            existingTasks.splice(i, 1);
                            // set isRemoved to data for faster invokeTask check
                            existingTask.isRemoved = true;
                            if (existingTasks.length === 0) {
                                // all tasks for the eventName + capture have gone,
                                // remove globalZoneAwareCallback and remove the task cache from target
                                existingTask.allRemoved = true;
                                target[symbolEventName] = null;
                                // in the target, we have an event listener which is added by on_property
                                // such as target.onclick = function() {}, so we need to clear this internal
                                // property too if all delegates with capture=false were removed
                                // https:// github.com/angular/angular/issues/31643
                                // https://github.com/angular/angular/issues/54581
                                if (!capture && typeof eventName === 'string') {
                                    var onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;
                                    target[onPropertySymbol] = null;
                                }
                            }
                            // In all other conditions, when `addEventListener` is called after being
                            // patched by zone.js, we would always find an event task on the `EventTarget`.
                            // This will trigger `cancelFn` on the `existingTask`, leading to `customCancelGlobal`,
                            // which ultimately removes an event listener and cleans up the abort listener
                            // (if an `AbortSignal` was provided when scheduling a task).
                            existingTask.zone.cancelTask(existingTask);
                            if (returnTarget) {
                                return target;
                            }
                            return;
                        }
                    }
                }
                // https://github.com/angular/zone.js/issues/930
                // We may encounter a situation where the `addEventListener` was
                // called on the event target before zone.js is loaded, resulting
                // in no task being stored on the event target due to its invocation
                // of the native implementation. In this scenario, we simply need to
                // invoke the native `removeEventListener`.
                return nativeRemoveEventListener.apply(this, arguments);
            };
            proto[LISTENERS_EVENT_LISTENER] = function () {
                var target = this || _global;
                var eventName = arguments[0];
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                var listeners = [];
                var tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
                for (var i = 0; i < tasks.length; i++) {
                    var task = tasks[i];
                    var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                    listeners.push(delegate);
                }
                return listeners;
            };
            proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
                var target = this || _global;
                var eventName = arguments[0];
                if (!eventName) {
                    var keys = Object.keys(target);
                    for (var i = 0; i < keys.length; i++) {
                        var prop = keys[i];
                        var match = EVENT_NAME_SYMBOL_REGX.exec(prop);
                        var evtName = match && match[1];
                        // in nodejs EventEmitter, removeListener event is
                        // used for monitoring the removeListener call,
                        // so just keep removeListener eventListener until
                        // all other eventListeners are removed
                        if (evtName && evtName !== 'removeListener') {
                            this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
                        }
                    }
                    // remove removeListener listener finally
                    this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
                }
                else {
                    if (patchOptions && patchOptions.transferEventName) {
                        eventName = patchOptions.transferEventName(eventName);
                    }
                    var symbolEventNames = zoneSymbolEventNames[eventName];
                    if (symbolEventNames) {
                        var symbolEventName = symbolEventNames[FALSE_STR];
                        var symbolCaptureEventName = symbolEventNames[TRUE_STR];
                        var tasks = target[symbolEventName];
                        var captureTasks = target[symbolCaptureEventName];
                        if (tasks) {
                            var removeTasks = tasks.slice();
                            for (var i = 0; i < removeTasks.length; i++) {
                                var task = removeTasks[i];
                                var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                                this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                            }
                        }
                        if (captureTasks) {
                            var removeTasks = captureTasks.slice();
                            for (var i = 0; i < removeTasks.length; i++) {
                                var task = removeTasks[i];
                                var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                                this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                            }
                        }
                    }
                }
                if (returnTarget) {
                    return this;
                }
            };
            // for native toString patch
            attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
            attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
            if (nativeRemoveAllListeners) {
                attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
            }
            if (nativeListeners) {
                attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
            }
            return true;
        }
        var results = [];
        for (var i = 0; i < apis.length; i++) {
            results[i] = patchEventTargetMethods(apis[i], patchOptions);
        }
        return results;
    }
    function findEventTasks(target, eventName) {
        if (!eventName) {
            var foundTasks = [];
            for (var prop in target) {
                var match = EVENT_NAME_SYMBOL_REGX.exec(prop);
                var evtName = match && match[1];
                if (evtName && (!eventName || evtName === eventName)) {
                    var tasks = target[prop];
                    if (tasks) {
                        for (var i = 0; i < tasks.length; i++) {
                            foundTasks.push(tasks[i]);
                        }
                    }
                }
            }
            return foundTasks;
        }
        var symbolEventName = zoneSymbolEventNames[eventName];
        if (!symbolEventName) {
            prepareEventNames(eventName);
            symbolEventName = zoneSymbolEventNames[eventName];
        }
        var captureFalseTasks = target[symbolEventName[FALSE_STR]];
        var captureTrueTasks = target[symbolEventName[TRUE_STR]];
        if (!captureFalseTasks) {
            return captureTrueTasks ? captureTrueTasks.slice() : [];
        }
        else {
            return captureTrueTasks
                ? captureFalseTasks.concat(captureTrueTasks)
                : captureFalseTasks.slice();
        }
    }
    function patchEventPrototype(global, api) {
        var Event = global['Event'];
        if (Event && Event.prototype) {
            api.patchMethod(Event.prototype, 'stopImmediatePropagation', function (delegate) { return function (self, args) {
                self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
                // we need to call the native stopImmediatePropagation
                // in case in some hybrid application, some part of
                // application will be controlled by zone, some are not
                delegate && delegate.apply(self, args);
            }; });
        }
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    function patchQueueMicrotask(global, api) {
        api.patchMethod(global, 'queueMicrotask', function (delegate) {
            return function (self, args) {
                Zone.current.scheduleMicroTask('queueMicrotask', args[0]);
            };
        });
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    var taskSymbol = zoneSymbol('zoneTask');
    function patchTimer(window, setName, cancelName, nameSuffix) {
        var setNative = null;
        var clearNative = null;
        setName += nameSuffix;
        cancelName += nameSuffix;
        var tasksByHandleId = {};
        function scheduleTask(task) {
            var data = task.data;
            data.args[0] = function () {
                return task.invoke.apply(this, arguments);
            };
            var handleOrId = setNative.apply(window, data.args);
            // Whlist on Node.js when get can the ID by using `[Symbol.toPrimitive]()` we do
            // to this so that we do not cause potentally leaks when using `setTimeout`
            // since this can be periodic when using `.refresh`.
            if (isNumber(handleOrId)) {
                data.handleId = handleOrId;
            }
            else {
                data.handle = handleOrId;
                // On Node.js a timeout and interval can be restarted over and over again by using the `.refresh` method.
                data.isRefreshable = isFunction(handleOrId.refresh);
            }
            return task;
        }
        function clearTask(task) {
            var _a = task.data, handle = _a.handle, handleId = _a.handleId;
            return clearNative.call(window, handle !== null && handle !== void 0 ? handle : handleId);
        }
        setNative = patchMethod(window, setName, function (delegate) { return function (self, args) {
            var _a;
            if (isFunction(args[0])) {
                var options_1 = {
                    isRefreshable: false,
                    isPeriodic: nameSuffix === 'Interval',
                    delay: nameSuffix === 'Timeout' || nameSuffix === 'Interval' ? args[1] || 0 : undefined,
                    args: args,
                };
                var callback_1 = args[0];
                args[0] = function timer() {
                    try {
                        return callback_1.apply(this, arguments);
                    }
                    finally {
                        // issue-934, task will be cancelled
                        // even it is a periodic task such as
                        // setInterval
                        // https://github.com/angular/angular/issues/40387
                        // Cleanup tasksByHandleId should be handled before scheduleTask
                        // Since some zoneSpec may intercept and doesn't trigger
                        // scheduleFn(scheduleTask) provided here.
                        var handle_1 = options_1.handle, handleId_1 = options_1.handleId, isPeriodic_1 = options_1.isPeriodic, isRefreshable_1 = options_1.isRefreshable;
                        if (!isPeriodic_1 && !isRefreshable_1) {
                            if (handleId_1) {
                                // in non-nodejs env, we remove timerId
                                // from local cache
                                delete tasksByHandleId[handleId_1];
                            }
                            else if (handle_1) {
                                // Node returns complex objects as handleIds
                                // we remove task reference from timer object
                                handle_1[taskSymbol] = null;
                            }
                        }
                    }
                };
                var task_1 = scheduleMacroTaskWithCurrentZone(setName, args[0], options_1, scheduleTask, clearTask);
                if (!task_1) {
                    return task_1;
                }
                // Node.js must additionally support the ref and unref functions.
                var _b = task_1.data, handleId = _b.handleId, handle = _b.handle, isRefreshable = _b.isRefreshable, isPeriodic = _b.isPeriodic;
                if (handleId) {
                    // for non nodejs env, we save handleId: task
                    // mapping in local cache for clearTimeout
                    tasksByHandleId[handleId] = task_1;
                }
                else if (handle) {
                    // for nodejs env, we save task
                    // reference in timerId Object for clearTimeout
                    handle[taskSymbol] = task_1;
                    if (isRefreshable && !isPeriodic) {
                        var originalRefresh_1 = handle.refresh;
                        handle.refresh = function () {
                            var zone = task_1.zone, state = task_1.state;
                            if (state === 'notScheduled') {
                                task_1._state = 'scheduled';
                                zone._updateTaskCount(task_1, 1);
                            }
                            else if (state === 'running') {
                                task_1._state = 'scheduling';
                            }
                            return originalRefresh_1.call(this);
                        };
                    }
                }
                return (_a = handle !== null && handle !== void 0 ? handle : handleId) !== null && _a !== void 0 ? _a : task_1;
            }
            else {
                // cause an error by calling it directly.
                return delegate.apply(window, args);
            }
        }; });
        clearNative = patchMethod(window, cancelName, function (delegate) { return function (self, args) {
            var id = args[0];
            var task;
            if (isNumber(id)) {
                // non nodejs env.
                task = tasksByHandleId[id];
                delete tasksByHandleId[id];
            }
            else {
                // nodejs env ?? other environments.
                task = id === null || id === void 0 ? void 0 : id[taskSymbol];
                if (task) {
                    id[taskSymbol] = null;
                }
                else {
                    task = id;
                }
            }
            if (task === null || task === void 0 ? void 0 : task.type) {
                if (task.cancelFn) {
                    // Do not cancel already canceled functions
                    task.zone.cancelTask(task);
                }
            }
            else {
                // cause an error by calling it directly.
                delegate.apply(window, args);
            }
        }; });
    }
    function patchCustomElements(_global, api) {
        var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
        if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) {
            return;
        }
        // https://html.spec.whatwg.org/multipage/custom-elements.html#concept-custom-element-definition-lifecycle-callbacks
        var callbacks = [
            'connectedCallback',
            'disconnectedCallback',
            'adoptedCallback',
            'attributeChangedCallback',
            'formAssociatedCallback',
            'formDisabledCallback',
            'formResetCallback',
            'formStateRestoreCallback',
        ];
        api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
    }
    function eventTargetPatch(_global, api) {
        if (Zone[api.symbol('patchEventTarget')]) {
            // EventTarget is already patched.
            return;
        }
        var _a = api.getGlobalObjects(), eventNames = _a.eventNames, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
        //  predefine all __zone_symbol__ + eventName + true/false string
        for (var i = 0; i < eventNames.length; i++) {
            var eventName = eventNames[i];
            var falseEventName = eventName + FALSE_STR;
            var trueEventName = eventName + TRUE_STR;
            var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
            var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
            zoneSymbolEventNames[eventName] = {};
            zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
            zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
        }
        var EVENT_TARGET = _global['EventTarget'];
        if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
            return;
        }
        api.patchEventTarget(_global, api, [EVENT_TARGET && EVENT_TARGET.prototype]);
        return true;
    }
    function patchEvent(global, api) {
        api.patchEventPrototype(global, api);
    }
    /**
     * @fileoverview
     * @suppress {globalThis}
     */
    function filterProperties(target, onProperties, ignoreProperties) {
        if (!ignoreProperties || ignoreProperties.length === 0) {
            return onProperties;
        }
        var tip = ignoreProperties.filter(function (ip) { return ip.target === target; });
        if (tip.length === 0) {
            return onProperties;
        }
        var targetIgnoreProperties = tip[0].ignoreProperties;
        return onProperties.filter(function (op) { return targetIgnoreProperties.indexOf(op) === -1; });
    }
    function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
        // check whether target is available, sometimes target will be undefined
        // because different browser or some 3rd party plugin.
        if (!target) {
            return;
        }
        var filteredProperties = filterProperties(target, onProperties, ignoreProperties);
        patchOnProperties(target, filteredProperties, prototype);
    }
    /**
     * Get all event name properties which the event name startsWith `on`
     * from the target object itself, inherited properties are not considered.
     */
    function getOnEventNames(target) {
        return Object.getOwnPropertyNames(target)
            .filter(function (name) { return name.startsWith('on') && name.length > 2; })
            .map(function (name) { return name.substring(2); });
    }
    function propertyDescriptorPatch(api, _global) {
        if (isNode && !isMix) {
            return;
        }
        if (Zone[api.symbol('patchEvents')]) {
            // events are already been patched by legacy patch.
            return;
        }
        var ignoreProperties = _global['__Zone_ignore_on_properties'];
        // for browsers that we can patch the descriptor:  Chrome & Firefox
        var patchTargets = [];
        if (isBrowser) {
            var internalWindow_1 = window;
            patchTargets = patchTargets.concat([
                'Document',
                'SVGElement',
                'Element',
                'HTMLElement',
                'HTMLBodyElement',
                'HTMLMediaElement',
                'HTMLFrameSetElement',
                'HTMLFrameElement',
                'HTMLIFrameElement',
                'HTMLMarqueeElement',
                'Worker',
            ]);
            var ignoreErrorProperties = [];
            // In older browsers like IE or Edge, event handler properties (e.g., `onclick`)
            // may not be defined directly on the `window` object but on its prototype (`WindowPrototype`).
            // To ensure complete coverage, we use the prototype when checking
            // for and patching these properties.
            patchFilteredProperties(internalWindow_1, getOnEventNames(internalWindow_1), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow_1));
        }
        patchTargets = patchTargets.concat([
            'XMLHttpRequest',
            'XMLHttpRequestEventTarget',
            'IDBIndex',
            'IDBRequest',
            'IDBOpenDBRequest',
            'IDBDatabase',
            'IDBTransaction',
            'IDBCursor',
            'WebSocket',
        ]);
        for (var i = 0; i < patchTargets.length; i++) {
            var target = _global[patchTargets[i]];
            (target === null || target === void 0 ? void 0 : target.prototype) &&
                patchFilteredProperties(target.prototype, getOnEventNames(target.prototype), ignoreProperties);
        }
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    function patchBrowser(Zone) {
        Zone.__load_patch('legacy', function (global) {
            var legacyPatch = global[Zone.__symbol__('legacyPatch')];
            if (legacyPatch) {
                legacyPatch();
            }
        });
        Zone.__load_patch('timers', function (global) {
            var set = 'set';
            var clear = 'clear';
            patchTimer(global, set, clear, 'Timeout');
            patchTimer(global, set, clear, 'Interval');
            patchTimer(global, set, clear, 'Immediate');
        });
        Zone.__load_patch('requestAnimationFrame', function (global) {
            patchTimer(global, 'request', 'cancel', 'AnimationFrame');
            patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
            patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
        });
        Zone.__load_patch('blocking', function (global, Zone) {
            var blockingMethods = ['alert', 'prompt', 'confirm'];
            for (var i = 0; i < blockingMethods.length; i++) {
                var name_2 = blockingMethods[i];
                patchMethod(global, name_2, function (delegate, symbol, name) {
                    return function (s, args) {
                        return Zone.current.run(delegate, global, args, name);
                    };
                });
            }
        });
        Zone.__load_patch('EventTarget', function (global, Zone, api) {
            patchEvent(global, api);
            eventTargetPatch(global, api);
            // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
            var XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
            if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
                api.patchEventTarget(global, api, [XMLHttpRequestEventTarget.prototype]);
            }
        });
        Zone.__load_patch('MutationObserver', function (global, Zone, api) {
            patchClass('MutationObserver');
            patchClass('WebKitMutationObserver');
        });
        Zone.__load_patch('IntersectionObserver', function (global, Zone, api) {
            patchClass('IntersectionObserver');
        });
        Zone.__load_patch('FileReader', function (global, Zone, api) {
            patchClass('FileReader');
        });
        Zone.__load_patch('on_property', function (global, Zone, api) {
            propertyDescriptorPatch(api, global);
        });
        Zone.__load_patch('customElements', function (global, Zone, api) {
            patchCustomElements(global, api);
        });
        Zone.__load_patch('XHR', function (global, Zone) {
            // Treat XMLHttpRequest as a macrotask.
            patchXHR(global);
            var XHR_TASK = zoneSymbol('xhrTask');
            var XHR_SYNC = zoneSymbol('xhrSync');
            var XHR_LISTENER = zoneSymbol('xhrListener');
            var XHR_SCHEDULED = zoneSymbol('xhrScheduled');
            var XHR_URL = zoneSymbol('xhrURL');
            var XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
            function patchXHR(window) {
                var XMLHttpRequest = window['XMLHttpRequest'];
                if (!XMLHttpRequest) {
                    // XMLHttpRequest is not available in service worker
                    return;
                }
                var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
                function findPendingTask(target) {
                    return target[XHR_TASK];
                }
                var oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                var oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                if (!oriAddListener) {
                    var XMLHttpRequestEventTarget_1 = window['XMLHttpRequestEventTarget'];
                    if (XMLHttpRequestEventTarget_1) {
                        var XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget_1.prototype;
                        oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                        oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                    }
                }
                var READY_STATE_CHANGE = 'readystatechange';
                var SCHEDULED = 'scheduled';
                function scheduleTask(task) {
                    var data = task.data;
                    var target = data.target;
                    target[XHR_SCHEDULED] = false;
                    target[XHR_ERROR_BEFORE_SCHEDULED] = false;
                    // remove existing event listener
                    var listener = target[XHR_LISTENER];
                    if (!oriAddListener) {
                        oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                        oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                    }
                    if (listener) {
                        oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
                    }
                    var newListener = (target[XHR_LISTENER] = function () {
                        if (target.readyState === target.DONE) {
                            // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with
                            // readyState=4 multiple times, so we need to check task state here
                            if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
                                // check whether the xhr has registered onload listener
                                // if that is the case, the task should invoke after all
                                // onload listeners finish.
                                // Also if the request failed without response (status = 0), the load event handler
                                // will not be triggered, in that case, we should also invoke the placeholder callback
                                // to close the XMLHttpRequest::send macroTask.
                                // https://github.com/angular/angular/issues/38795
                                var loadTasks = target[Zone.__symbol__('loadfalse')];
                                if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
                                    var oriInvoke_1 = task.invoke;
                                    task.invoke = function () {
                                        // need to load the tasks again, because in other
                                        // load listener, they may remove themselves
                                        var loadTasks = target[Zone.__symbol__('loadfalse')];
                                        for (var i = 0; i < loadTasks.length; i++) {
                                            if (loadTasks[i] === task) {
                                                loadTasks.splice(i, 1);
                                            }
                                        }
                                        if (!data.aborted && task.state === SCHEDULED) {
                                            oriInvoke_1.call(task);
                                        }
                                    };
                                    loadTasks.push(task);
                                }
                                else {
                                    task.invoke();
                                }
                            }
                            else if (!data.aborted && target[XHR_SCHEDULED] === false) {
                                // error occurs when xhr.send()
                                target[XHR_ERROR_BEFORE_SCHEDULED] = true;
                            }
                        }
                    });
                    oriAddListener.call(target, READY_STATE_CHANGE, newListener);
                    var storedTask = target[XHR_TASK];
                    if (!storedTask) {
                        target[XHR_TASK] = task;
                    }
                    sendNative.apply(target, data.args);
                    target[XHR_SCHEDULED] = true;
                    return task;
                }
                function placeholderCallback() { }
                function clearTask(task) {
                    var data = task.data;
                    // Note - ideally, we would call data.target.removeEventListener here, but it's too late
                    // to prevent it from firing. So instead, we store info for the event listener.
                    data.aborted = true;
                    return abortNative.apply(data.target, data.args);
                }
                var openNative = patchMethod(XMLHttpRequestPrototype, 'open', function () { return function (self, args) {
                    self[XHR_SYNC] = args[2] == false;
                    self[XHR_URL] = args[1];
                    return openNative.apply(self, args);
                }; });
                var XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
                var fetchTaskAborting = zoneSymbol('fetchTaskAborting');
                var fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
                var sendNative = patchMethod(XMLHttpRequestPrototype, 'send', function () { return function (self, args) {
                    if (Zone.current[fetchTaskScheduling] === true) {
                        // a fetch is scheduling, so we are using xhr to polyfill fetch
                        // and because we already schedule macroTask for fetch, we should
                        // not schedule a macroTask for xhr again
                        return sendNative.apply(self, args);
                    }
                    if (self[XHR_SYNC]) {
                        // if the XHR is sync there is no task to schedule, just execute the code.
                        return sendNative.apply(self, args);
                    }
                    else {
                        var options = {
                            target: self,
                            url: self[XHR_URL],
                            isPeriodic: false,
                            args: args,
                            aborted: false,
                        };
                        var task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
                        if (self &&
                            self[XHR_ERROR_BEFORE_SCHEDULED] === true &&
                            !options.aborted &&
                            task.state === SCHEDULED) {
                            // xhr request throw error when send
                            // we should invoke task instead of leaving a scheduled
                            // pending macroTask
                            task.invoke();
                        }
                    }
                }; });
                var abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', function () { return function (self, args) {
                    var task = findPendingTask(self);
                    if (task && typeof task.type == 'string') {
                        // If the XHR has already completed, do nothing.
                        // If the XHR has already been aborted, do nothing.
                        // Fix #569, call abort multiple times before done will cause
                        // macroTask task count be negative number
                        if (task.cancelFn == null || (task.data && task.data.aborted)) {
                            return;
                        }
                        task.zone.cancelTask(task);
                    }
                    else if (Zone.current[fetchTaskAborting] === true) {
                        // the abort is called from fetch polyfill, we need to call native abort of XHR.
                        return abortNative.apply(self, args);
                    }
                    // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no
                    // task
                    // to cancel. Do nothing.
                }; });
            }
        });
        Zone.__load_patch('geolocation', function (global) {
            /// GEO_LOCATION
            if (global['navigator'] && global['navigator'].geolocation) {
                patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
            }
        });
        Zone.__load_patch('PromiseRejectionEvent', function (global, Zone) {
            // handle unhandled promise rejection
            function findPromiseRejectionHandler(evtName) {
                return function (e) {
                    var eventTasks = findEventTasks(global, evtName);
                    eventTasks.forEach(function (eventTask) {
                        // windows has added unhandledrejection event listener
                        // trigger the event listener
                        var PromiseRejectionEvent = global['PromiseRejectionEvent'];
                        if (PromiseRejectionEvent) {
                            var evt = new PromiseRejectionEvent(evtName, {
                                promise: e.promise,
                                reason: e.rejection,
                            });
                            eventTask.invoke(evt);
                        }
                    });
                };
            }
            if (global['PromiseRejectionEvent']) {
                Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =
                    findPromiseRejectionHandler('unhandledrejection');
                Zone[zoneSymbol('rejectionHandledHandler')] =
                    findPromiseRejectionHandler('rejectionhandled');
            }
        });
        Zone.__load_patch('queueMicrotask', function (global, Zone, api) {
            patchQueueMicrotask(global, api);
        });
    }
    function patchPromise(Zone) {
        Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
            var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
            var ObjectDefineProperty = Object.defineProperty;
            function readableObjectToString(obj) {
                if (obj && obj.toString === Object.prototype.toString) {
                    var className = obj.constructor && obj.constructor.name;
                    return (className ? className : '') + ': ' + JSON.stringify(obj);
                }
                return obj ? obj.toString() : Object.prototype.toString.call(obj);
            }
            var __symbol__ = api.symbol;
            var _uncaughtPromiseErrors = [];
            var isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] !== false;
            var symbolPromise = __symbol__('Promise');
            var symbolThen = __symbol__('then');
            var creationTrace = '__creationTrace__';
            api.onUnhandledError = function (e) {
                if (api.showUncaughtError()) {
                    var rejection = e && e.rejection;
                    if (rejection) {
                        console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
                    }
                    else {
                        console.error(e);
                    }
                }
            };
            api.microtaskDrainDone = function () {
                var _loop_3 = function () {
                    var uncaughtPromiseError = _uncaughtPromiseErrors.shift();
                    try {
                        uncaughtPromiseError.zone.runGuarded(function () {
                            if (uncaughtPromiseError.throwOriginal) {
                                throw uncaughtPromiseError.rejection;
                            }
                            throw uncaughtPromiseError;
                        });
                    }
                    catch (error) {
                        handleUnhandledRejection(error);
                    }
                };
                while (_uncaughtPromiseErrors.length) {
                    _loop_3();
                }
            };
            var UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
            function handleUnhandledRejection(e) {
                api.onUnhandledError(e);
                try {
                    var handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
                    if (typeof handler === 'function') {
                        handler.call(this, e);
                    }
                }
                catch (err) { }
            }
            function isThenable(value) {
                return value && typeof value.then === 'function';
            }
            function forwardResolution(value) {
                return value;
            }
            function forwardRejection(rejection) {
                return ZoneAwarePromise.reject(rejection);
            }
            var symbolState = __symbol__('state');
            var symbolValue = __symbol__('value');
            var symbolFinally = __symbol__('finally');
            var symbolParentPromiseValue = __symbol__('parentPromiseValue');
            var symbolParentPromiseState = __symbol__('parentPromiseState');
            var source = 'Promise.then';
            var UNRESOLVED = null;
            var RESOLVED = true;
            var REJECTED = false;
            var REJECTED_NO_CATCH = 0;
            function makeResolver(promise, state) {
                return function (v) {
                    try {
                        resolvePromise(promise, state, v);
                    }
                    catch (err) {
                        resolvePromise(promise, false, err);
                    }
                    // Do not return value or you will break the Promise spec.
                };
            }
            var once = function () {
                var wasCalled = false;
                return function wrapper(wrappedFunction) {
                    return function () {
                        if (wasCalled) {
                            return;
                        }
                        wasCalled = true;
                        wrappedFunction.apply(null, arguments);
                    };
                };
            };
            var TYPE_ERROR = 'Promise resolved with itself';
            var CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
            // Promise Resolution
            function resolvePromise(promise, state, value) {
                var onceWrapper = once();
                if (promise === value) {
                    throw new TypeError(TYPE_ERROR);
                }
                if (promise[symbolState] === UNRESOLVED) {
                    // should only get value.then once based on promise spec.
                    var then = null;
                    try {
                        if (typeof value === 'object' || typeof value === 'function') {
                            then = value && value.then;
                        }
                    }
                    catch (err) {
                        onceWrapper(function () {
                            resolvePromise(promise, false, err);
                        })();
                        return promise;
                    }
                    // if (value instanceof ZoneAwarePromise) {
                    if (state !== REJECTED &&
                        value instanceof ZoneAwarePromise &&
                        value.hasOwnProperty(symbolState) &&
                        value.hasOwnProperty(symbolValue) &&
                        value[symbolState] !== UNRESOLVED) {
                        clearRejectedNoCatch(value);
                        resolvePromise(promise, value[symbolState], value[symbolValue]);
                    }
                    else if (state !== REJECTED && typeof then === 'function') {
                        try {
                            then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
                        }
                        catch (err) {
                            onceWrapper(function () {
                                resolvePromise(promise, false, err);
                            })();
                        }
                    }
                    else {
                        promise[symbolState] = state;
                        var queue = promise[symbolValue];
                        promise[symbolValue] = value;
                        if (promise[symbolFinally] === symbolFinally) {
                            // the promise is generated by Promise.prototype.finally
                            if (state === RESOLVED) {
                                // the state is resolved, should ignore the value
                                // and use parent promise value
                                promise[symbolState] = promise[symbolParentPromiseState];
                                promise[symbolValue] = promise[symbolParentPromiseValue];
                            }
                        }
                        // record task information in value when error occurs, so we can
                        // do some additional work such as render longStackTrace
                        if (state === REJECTED && value instanceof Error) {
                            // check if longStackTraceZone is here
                            var trace = Zone.currentTask &&
                                Zone.currentTask.data &&
                                Zone.currentTask.data[creationTrace];
                            if (trace) {
                                // only keep the long stack trace into error when in longStackTraceZone
                                ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, {
                                    configurable: true,
                                    enumerable: false,
                                    writable: true,
                                    value: trace,
                                });
                            }
                        }
                        for (var i = 0; i < queue.length;) {
                            scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
                        }
                        if (queue.length == 0 && state == REJECTED) {
                            promise[symbolState] = REJECTED_NO_CATCH;
                            var uncaughtPromiseError = value;
                            try {
                                // Here we throws a new Error to print more readable error log
                                // and if the value is not an error, zone.js builds an `Error`
                                // Object here to attach the stack information.
                                throw new Error('Uncaught (in promise): ' +
                                    readableObjectToString(value) +
                                    (value && value.stack ? '\n' + value.stack : ''));
                            }
                            catch (err) {
                                uncaughtPromiseError = err;
                            }
                            if (isDisableWrappingUncaughtPromiseRejection) {
                                // If disable wrapping uncaught promise reject
                                // use the value instead of wrapping it.
                                uncaughtPromiseError.throwOriginal = true;
                            }
                            uncaughtPromiseError.rejection = value;
                            uncaughtPromiseError.promise = promise;
                            uncaughtPromiseError.zone = Zone.current;
                            uncaughtPromiseError.task = Zone.currentTask;
                            _uncaughtPromiseErrors.push(uncaughtPromiseError);
                            api.scheduleMicroTask(); // to make sure that it is running
                        }
                    }
                }
                // Resolving an already resolved promise is a noop.
                return promise;
            }
            var REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
            function clearRejectedNoCatch(promise) {
                if (promise[symbolState] === REJECTED_NO_CATCH) {
                    // if the promise is rejected no catch status
                    // and queue.length > 0, means there is a error handler
                    // here to handle the rejected promise, we should trigger
                    // windows.rejectionhandled eventHandler or nodejs rejectionHandled
                    // eventHandler
                    try {
                        var handler = Zone[REJECTION_HANDLED_HANDLER];
                        if (handler && typeof handler === 'function') {
                            handler.call(this, { rejection: promise[symbolValue], promise: promise });
                        }
                    }
                    catch (err) { }
                    promise[symbolState] = REJECTED;
                    for (var i = 0; i < _uncaughtPromiseErrors.length; i++) {
                        if (promise === _uncaughtPromiseErrors[i].promise) {
                            _uncaughtPromiseErrors.splice(i, 1);
                        }
                    }
                }
            }
            function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
                clearRejectedNoCatch(promise);
                var promiseState = promise[symbolState];
                var delegate = promiseState
                    ? typeof onFulfilled === 'function'
                        ? onFulfilled
                        : forwardResolution
                    : typeof onRejected === 'function'
                        ? onRejected
                        : forwardRejection;
                zone.scheduleMicroTask(source, function () {
                    try {
                        var parentPromiseValue = promise[symbolValue];
                        var isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
                        if (isFinallyPromise) {
                            // if the promise is generated from finally call, keep parent promise's state and value
                            chainPromise[symbolParentPromiseValue] = parentPromiseValue;
                            chainPromise[symbolParentPromiseState] = promiseState;
                        }
                        // should not pass value to finally callback
                        var value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution
                            ? []
                            : [parentPromiseValue]);
                        btresolvePromise(chainPromise, true, value);
                    }
                    catch (error) {
                        // if error occurs, should always return this error
                        resolvePromise(chainPromise, false, error);
                    }
                }, chainPromise);
            }
            var ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
            var noop = function () { };
            var AggregateError = global.AggregateError;
            var ZoneAwarePromise = /** @class */ (function () {
                function ZoneAwarePromise(executor) {
                    var promise = this;
                    if (!(promise instanceof ZoneAwarePromise)) {
                        throw new Error('Must be an instanceof Promise.');
                    }
                    promise[symbolState] = UNRESOLVED;
                    promise[symbolValue] = []; // queue;
                    try {
                        var onceWrapper = once();
                        executor &&
                            executor(onceWrapper(makeResolver(promise, RESOLVED)), onceWrapper(makeResolver(promise, REJECTED)));
                    }
                    catch (error) {
                        resolvePromise(promise, false, error);
                    }
                }
                ZoneAwarePromise.toString = function () {
                    return ZONE_AWARE_PROMISE_TO_STRING;
                };
                ZoneAwarePromise.resolve = function (value) {
                    if (value instanceof ZoneAwarePromise) {
                        return value;
                    }
                    return resolvePromise(new this(null), RESOLVED, value);
                };
                ZoneAwarePromise.reject = function (error) {
                    return resolvePromise(new this(null), REJECTED, error);
                };
                ZoneAwarePromise.withResolvers = function () {
                    var result = {};
                    result.promise = new ZoneAwarePromise(function (res, rej) {
                        result.resolve = res;
                        result.reject = rej;
                    });
                    return result;
                };
                ZoneAwarePromise.any = function (values) {
                    if (!values || typeof values[Symbol.iterator] !== 'function') {
                        return Promise.reject(new AggregateError([], 'All promises were rejected'));
                    }
                    var promises = [];
                    var count = 0;
                    try {
                        for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
                            var v = values_1[_i];
                            count++;
                            promises.push(ZoneAwarePromise.resolve(v));
                        }
                    }
                    catch (err) {
                        return Promise.reject(new AggregateError([], 'All promises were rejected'));
                    }
                    if (count === 0) {
                        return Promise.reject(new AggregateError([], 'All promises were rejected'));
                    }
                    var finished = false;
                    var errors = [];
                    return new ZoneAwarePromise(function (resolve, reject) {
                        for (var i = 0; i < promises.length; i++) {
                            promises[i].then(function (v) {
                                if (finished) {
                                    return;
                                }
                                finished = true;
                                resolve(v);
                            }, function (err) {
                                errors.push(err);
                                count--;
                                if (count === 0) {
                                    finished = true;
                                    reject(new AggregateError(errors, 'All promises were rejected'));
                                }
                            });
                        }
                    });
                };
                ZoneAwarePromise.race = function (values) {
                    var resolve;
                    var reject;
                    var promise = new this(function (res, rej) {
                        resolve = res;
                        reject = rej;
                    });
                    function onResolve(value) {
                        resolve(value);
                    }
                    function onReject(error) {
                        reject(error);
                    }
                    for (var _i = 0, values_2 = values; _i < values_2.length; _i++) {
                        var value = values_2[_i];
                        if (!isThenable(value)) {
                            value = this.resolve(value);
                        }
                        value.then(onResolve, onReject);
                    }
                    return promise;
                };
                ZoneAwarePromise.all = function (values) {
                    return ZoneAwarePromise.allWithCallback(values);
                };
                ZoneAwarePromise.allSettled = function (values) {
                    var P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
                    return P.allWithCallback(values, {
                        thenCallback: function (value) { return ({ status: 'fulfilled', value: value }); },
                        errorCallback: function (err) { return ({ status: 'rejected', reason: err }); },
                    });
                };
                ZoneAwarePromise.allWithCallback = function (values, callback) {
                    var resolve;
                    var reject;
                    var promise = new this(function (res, rej) {
                        resolve = res;
                        reject = rej;
                    });
                    // Start at 2 to prevent prematurely resolving if .then is called immediately.
                    var unresolvedCount = 2;
                    var valueIndex = 0;
                    var resolvedValues = [];
                    var _loop_4 = function (value) {
                        if (!isThenable(value)) {
                            value = this_1.resolve(value);
                        }
                        var curValueIndex = valueIndex;
                        try {
                            value.then(function (value) {
                                resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;
                                unresolvedCount--;
                                if (unresolvedCount === 0) {
                                    resolve(resolvedValues);
                                }
                            }, function (err) {
                                if (!callback) {
                                    reject(err);
                                }
                                else {
                                    resolvedValues[curValueIndex] = callback.errorCallback(err);
                                    unresolvedCount--;
                                    if (unresolvedCount === 0) {
                                        resolve(resolvedValues);
                                    }
                                }
                            });
                        }
                        catch (thenErr) {
                            reject(thenErr);
                        }
                        unresolvedCount++;
                        valueIndex++;
                    };
                    var this_1 = this;
                    for (var _i = 0, values_3 = values; _i < values_3.length; _i++) {
                        var value = values_3[_i];
                        _loop_4(value);
                    }
                    // Make the unresolvedCount zero-based again.
                    unresolvedCount -= 2;
                    if (unresolvedCount === 0) {
                        resolve(resolvedValues);
                    }
                    return promise;
                };
                Object.defineProperty(ZoneAwarePromise.prototype, Symbol.toStringTag, {
                    get: function () {
                        return 'Promise';
                    },
                    enumerable: false,
                    configurable: true
                });
                Object.defineProperty(ZoneAwarePromise.prototype, Symbol.species, {
                    get: function () {
                        return ZoneAwarePromise;
                    },
                    enumerable: false,
                    configurable: true
                });
                ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) {
                    var _a;
                    // We must read `Symbol.species` safely because `this` may be anything. For instance, `this`
                    // may be an object without a prototype (created through `Object.create(null)`); thus
                    // `this.constructor` will be undefined. One of the use cases is SystemJS creating
                    // prototype-less objects (modules) via `Object.create(null)`. The SystemJS creates an empty
                    // object and copies promise properties into that object (within the `getOrCreateLoad`
                    // function). The zone.js then checks if the resolved value has the `then` method and
                    // invokes it with the `value` context. Otherwise, this will throw an error: `TypeError:
                    // Cannot read properties of undefined (reading 'Symbol(Symbol.species)')`.
                    var C = (_a = this.constructor) === null || _a === void 0 ? void 0 : _a[Symbol.species];
                    if (!C || typeof C !== 'function') {
                        C = this.constructor || ZoneAwarePromise;
                    }
                    var chainPromise = new C(noop);
                    var zone = Zone.current;
                    if (this[symbolState] == UNRESOLVED) {
                        this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
                    }
                    else {
                        scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
                    }
                    return chainPromise;
                };
                ZoneAwarePromise.prototype.catch = function (onRejected) {
                    return this.then(null, onRejected);
                };
                ZoneAwarePromise.prototype.finally = function (onFinally) {
                    var _a;
                    // See comment on the call to `then` about why thee `Symbol.species` is safely accessed.
                    var C = (_a = this.constructor) === null || _a === void 0 ? void 0 : _a[Symbol.species];
                    if (!C || typeof C !== 'function') {
                        C = ZoneAwarePromise;
                    }
                    var chainPromise = new C(noop);
                    chainPromise[symbolFinally] = symbolFinally;
                    var zone = Zone.current;
                    if (this[symbolState] == UNRESOLVED) {
                        this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
                    }
                    else {
                        scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
                    }
                    return chainPromise;
                };
                return ZoneAwarePromise;
            }());
            // Protect against aggressive optimizers dropping seemingly unused properties.
            // E.g. Closure Compiler in advanced mode.
            ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
            ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
            ZoneAwarePromise['race'] = ZoneAwarePromise.race;
            ZoneAwarePromise['all'] = ZoneAwarePromise.all;
            var NativePromise = (global[symbolPromise] = global['Promise']);
            global['Promise'] = ZoneAwarePromise;
            var symbolThenPatched = __symbol__('thenPatched');
            function patchThen(Ctor) {
                var proto = Ctor.prototype;
                var prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
                if (prop && (prop.writable === false || !prop.configurable)) {
                    // check Ctor.prototype.then propertyDescriptor is writable or not
                    // in meteor env, writable is false, we should ignore such case
                    return;
                }
                var originalThen = proto.then;
                // Keep a reference to the original method.
                proto[symbolThen] = originalThen;
                Ctor.prototype.then = function (onResolve, onReject) {
                    var _this = this;
                    var wrapped = new ZoneAwarePromise(function (resolve, reject) {
                        originalThen.call(_this, resolve, reject);
                    });
                    return wrapped.then(onResolve, onReject);
                };
                Ctor[symbolThenPatched] = true;
            }
            api.patchThen = patchThen;
            function zoneify(fn) {
                return function (self, args) {
                    var resultPromise = fn.apply(self, args);
                    if (resultPromise instanceof ZoneAwarePromise) {
                        return resultPromise;
                    }
                    var ctor = resultPromise.constructor;
                    if (!ctor[symbolThenPatched]) {
                        patchThen(ctor);
                    }
                    return resultPromise;
                };
            }
            if (NativePromise) {
                patchThen(NativePromise);
                patchMethod(global, 'fetch', function (delegate) { return zoneify(delegate); });
            }
            // This is not part of public API, but it is useful for tests, so we expose it.
            Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
            return ZoneAwarePromise;
        });
    }
    function patchToString(Zone) {
        // override Function.prototype.toString to make zone.js patched function
        // look like native function
        Zone.__load_patch('toString', function (global) {
            // patch Func.prototype.toString to let them look like native
            var originalFunctionToString = Function.prototype.toString;
            var ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
            var PROMISE_SYMBOL = zoneSymbol('Promise');
            var ERROR_SYMBOL = zoneSymbol('Error');
            var newFunctionToString = function toString() {
                if (typeof this === 'function') {
                    var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
                    if (originalDelegate) {
                        if (typeof originalDelegate === 'function') {
                            return originalFunctionToString.call(originalDelegate);
                        }
                        else {
                            return Object.prototype.toString.call(originalDelegate);
                        }
                    }
                    if (this === Promise) {
                        var nativePromise = global[PROMISE_SYMBOL];
                        if (nativePromise) {
                            return originalFunctionToString.call(nativePromise);
                        }
                    }
                    if (this === Error) {
                        var nativeError = global[ERROR_SYMBOL];
                        if (nativeError) {
                            return originalFunctionToString.call(nativeError);
                        }
                    }
                }
                return originalFunctionToString.call(this);
            };
            newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
            Function.prototype.toString = newFunctionToString;
            // patch Object.prototype.toString to let them look like native
            var originalObjectToString = Object.prototype.toString;
            var PROMISE_OBJECT_TO_STRING = '[object Promise]';
            Object.prototype.toString = function () {
                if (typeof Promise === 'function' && this instanceof Promise) {
                    return PROMISE_OBJECT_TO_STRING;
                }
                return originalObjectToString.call(this);
            };
        });
    }
    function patchCallbacks(api, target, targetName, method, callbacks) {
        var symbol = Zone.__symbol__(method);
        if (target[symbol]) {
            return;
        }
        var nativeDelegate = (target[symbol] = target[method]);
        target[method] = function (name, opts, options) {
            if (opts && opts.prototype) {
                callbacks.forEach(function (callback) {
                    var source = "".concat(targetName, ".").concat(method, "::") + callback;
                    var prototype = opts.prototype;
                    // Note: the `patchCallbacks` is used for patching the `document.registerElement` and
                    // `customElements.define`. We explicitly wrap the patching code into try-catch since
                    // callbacks may be already patched by other web components frameworks (e.g. LWC), and they
                    // make those properties non-writable. This means that patching callback will throw an error
                    // `cannot assign to read-only property`. See this code as an example:
                    // https://github.com/salesforce/lwc/blob/master/packages/@lwc/engine-core/src/framework/base-bridge-element.ts#L180-L186
                    // We don't want to stop the application rendering if we couldn't patch some
                    // callback, e.g. `attributeChangedCallback`.
                    try {
                        if (prototype.hasOwnProperty(callback)) {
                            var descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
                            if (descriptor && descriptor.value) {
                                descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
                                api._redefineProperty(opts.prototype, callback, descriptor);
                            }
                            else if (prototype[callback]) {
                                prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
                            }
                        }
                        else if (prototype[callback]) {
                            prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
                        }
                    }
                    catch (_a) {
                        // Note: we leave the catch block empty since there's no way to handle the error related
                        // to non-writable property.
                    }
                });
            }
            return nativeDelegate.call(target, name, opts, options);
        };
        api.attachOriginToPatched(target[method], nativeDelegate);
    }
    function patchUtil(Zone) {
        Zone.__load_patch('util', function (global, Zone, api) {
            // Collect native event names by looking at properties
            // on the global namespace, e.g. 'onclick'.
            var eventNames = getOnEventNames(global);
            api.patchOnProperties = patchOnProperties;
            api.patchMethod = patchMethod;
            api.bindArguments = bindArguments;
            api.patchMacroTask = patchMacroTask;
            // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS`
            // to define which events will not be patched by `Zone.js`. In newer version (>=0.9.0), we
            // change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep the name consistent with
            // angular repo. The  `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be
            // supported for backwards compatibility.
            var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
            var SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
            if (global[SYMBOL_UNPATCHED_EVENTS]) {
                global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
            }
            if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
                Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
                    global[SYMBOL_BLACK_LISTED_EVENTS];
            }
            api.patchEventPrototype = patchEventPrototype;
            api.patchEventTarget = patchEventTarget;
            api.isIEOrEdge = isIEOrEdge;
            api.ObjectDefineProperty = ObjectDefineProperty;
            api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
            api.ObjectCreate = ObjectCreate;
            api.ArraySlice = ArraySlice;
            api.patchClass = patchClass;
            api.wrapWithCurrentZone = wrapWithCurrentZone;
            api.filterProperties = filterProperties;
            api.attachOriginToPatched = attachOriginToPatched;
            api._redefineProperty = Object.defineProperty;
            api.patchCallbacks = patchCallbacks;
            api.getGlobalObjects = function () { return ({
                globalSources: globalSources,
                zoneSymbolEventNames: zoneSymbolEventNames,
                eventNames: eventNames,
                isBrowser: isBrowser,
                isMix: isMix,
                isNode: isNode,
                TRUE_STR: TRUE_STR,
                FALSE_STR: FALSE_STR,
                ZONE_SYMBOL_PREFIX: ZONE_SYMBOL_PREFIX,
                ADD_EVENT_LISTENER_STR: ADD_EVENT_LISTENER_STR,
                REMOVE_EVENT_LISTENER_STR: REMOVE_EVENT_LISTENER_STR,
            }); };
        });
    }
    function patchCommon(Zone) {
        patchPromise(Zone);
        patchToString(Zone);
        patchUtil(Zone);
    }
    function patchEvents(Zone) {
        Zone.__load_patch('EventEmitter', function (global, Zone, api) {
            // For EventEmitter
            var EE_ADD_LISTENER = 'addListener';
            var EE_PREPEND_LISTENER = 'prependListener';
            var EE_REMOVE_LISTENER = 'removeListener';
            var EE_REMOVE_ALL_LISTENER = 'removeAllListeners';
            var EE_LISTENERS = 'listeners';
            var EE_ON = 'on';
            var EE_OFF = 'off';
            var compareTaskCallbackVsDelegate = function (task, delegate) {
                // same callback, same capture, same event name, just return
                return task.callback === delegate || task.callback.listener === delegate;
            };
            var eventNameToString = function (eventName) {
                if (typeof eventName === 'string') {
                    return eventName;
                }
                if (!eventName) {
                    return '';
                }
                return eventName.toString().replace('(', '_').replace(')', '_');
            };
            function patchEventEmitterMethods(obj) {
                var result = patchEventTarget(global, api, [obj], {
                    useG: false,
                    add: EE_ADD_LISTENER,
                    rm: EE_REMOVE_LISTENER,
                    prepend: EE_PREPEND_LISTENER,
                    rmAll: EE_REMOVE_ALL_LISTENER,
                    listeners: EE_LISTENERS,
                    chkDup: false,
                    rt: true,
                    diff: compareTaskCallbackVsDelegate,
                    eventNameToString: eventNameToString,
                });
                if (result && result[0]) {
                    obj[EE_ON] = obj[EE_ADD_LISTENER];
                    obj[EE_OFF] = obj[EE_REMOVE_LISTENER];
                }
            }
            // EventEmitter
            var events;
            try {
                events = require('events');
            }
            catch (err) { }
            if (events && events.EventEmitter) {
                patchEventEmitterMethods(events.EventEmitter.prototype);
            }
        });
    }
    function patchFs(Zone) {
        Zone.__load_patch('fs', function (global, Zone, api) {
            var _a;
            var fs;
            try {
                fs = require('fs');
            }
            catch (err) { }
            if (!fs)
                return;
            // watch, watchFile, unwatchFile has been patched
            // because EventEmitter has been patched
            var TO_PATCH_MACROTASK_METHODS = [
                'access',
                'appendFile',
                'chmod',
                'chown',
                'close',
                'exists',
                'fchmod',
                'fchown',
                'fdatasync',
                'fstat',
                'fsync',
                'ftruncate',
                'futimes',
                'lchmod',
                'lchown',
                'lutimes',
                'link',
                'lstat',
                'mkdir',
                'mkdtemp',
                'open',
                'opendir',
                'read',
                'readdir',
                'readFile',
                'readlink',
                'realpath',
                'rename',
                'rmdir',
                'stat',
                'symlink',
                'truncate',
                'unlink',
                'utimes',
                'write',
                'writeFile',
                'writev',
            ];
            TO_PATCH_MACROTASK_METHODS.filter(function (name) { return !!fs[name] && typeof fs[name] === 'function'; }).forEach(function (name) {
                patchMacroTask(fs, name, function (self, args) {
                    return {
                        name: 'fs.' + name,
                        args: args,
                        cbIdx: args.length > 0 ? args.length - 1 : -1,
                        target: self,
                    };
                });
            });
            var realpathOriginalDelegate = (_a = fs.realpath) === null || _a === void 0 ? void 0 : _a[api.symbol('OriginalDelegate')];
            // This is the only specific method that should be additionally patched because the previous
            // `patchMacroTask` has overridden the `realpath` function and its `native` property.
            if (realpathOriginalDelegate === null || realpathOriginalDelegate === void 0 ? void 0 : realpathOriginalDelegate.native) {
                fs.realpath.native = realpathOriginalDelegate.native;
                patchMacroTask(fs.realpath, 'native', function (self, args) { return ({
                    args: args,
                    target: self,
                    cbIdx: args.length > 0 ? args.length - 1 : -1,
                    name: 'fs.realpath.native',
                }); });
            }
        });
    }
    function patchNodeUtil(Zone) {
        Zone.__load_patch('node_util', function (global, Zone, api) {
            api.patchOnProperties = patchOnProperties;
            api.patchMethod = patchMethod;
            api.bindArguments = bindArguments;
            api.patchMacroTask = patchMacroTask;
            setShouldCopySymbolProperties(true);
        });
    }
    var set = 'set';
    var clear = 'clear';
    function patchNode(Zone) {
        patchNodeUtil(Zone);
        patchEvents(Zone);
        patchFs(Zone);
        Zone.__load_patch('node_timers', function (global, Zone) {
            // Timers
            var globalUseTimeoutFromTimer = false;
            try {
                var timers = require('timers');
                var globalEqualTimersTimeout = global.setTimeout === timers.setTimeout;
                if (!globalEqualTimersTimeout && !isMix) {
                    // 1. if isMix, then we are in mix environment such as Electron
                    // we should only patch timers.setTimeout because global.setTimeout
                    // have been patched
                    // 2. if global.setTimeout not equal timers.setTimeout, check
                    // whether global.setTimeout use timers.setTimeout or not
                    var originSetTimeout_1 = timers.setTimeout;
                    timers.setTimeout = function () {
                        globalUseTimeoutFromTimer = true;
                        return originSetTimeout_1.apply(this, arguments);
                    };
                    var detectTimeout = global.setTimeout(function () { }, 100);
                    clearTimeout(detectTimeout);
                    timers.setTimeout = originSetTimeout_1;
                }
                patchTimer(timers, set, clear, 'Timeout');
                patchTimer(timers, set, clear, 'Interval');
                patchTimer(timers, set, clear, 'Immediate');
            }
            catch (error) {
                // timers module not exists, for example, when we using nativeScript
                // timers is not available
            }
            if (isMix) {
                // if we are in mix environment, such as Electron,
                // the global.setTimeout has already been patched,
                // so we just patch timers.setTimeout
                return;
            }
            if (!globalUseTimeoutFromTimer) {
                // 1. global setTimeout equals timers setTimeout
                // 2. or global don't use timers setTimeout(maybe some other library patch setTimeout)
                // 3. or load timers module error happens, we should patch global setTimeout
                patchTimer(global, set, clear, 'Timeout');
                patchTimer(global, set, clear, 'Interval');
                patchTimer(global, set, clear, 'Immediate');
            }
            else {
                // global use timers setTimeout, but not equals
                // this happens when use nodejs v0.10.x, global setTimeout will
                // use a lazy load version of timers setTimeout
                // we should not double patch timer's setTimeout
                // so we only store the __symbol__ for consistency
                global[Zone.__symbol__('setTimeout')] = global.setTimeout;
                global[Zone.__symbol__('setInterval')] = global.setInterval;
                global[Zone.__symbol__('setImmediate')] = global.setImmediate;
            }
        });
        // patch process related methods
        Zone.__load_patch('nextTick', function () {
            // patch nextTick as microTask
            patchMicroTask(process, 'nextTick', function (self, args) {
                return {
                    name: 'process.nextTick',
                    args: args,
                    cbIdx: args.length > 0 && typeof args[0] === 'function' ? 0 : -1,
                    target: process,
                };
            });
        });
        Zone.__load_patch('handleUnhandledPromiseRejection', function (global, Zone, api) {
            Zone[api.symbol('unhandledPromiseRejectionHandler')] =
                findProcessPromiseRejectionHandler('unhandledRejection');
            Zone[api.symbol('rejectionHandledHandler')] =
                findProcessPromiseRejectionHandler('rejectionHandled');
            // handle unhandled promise rejection
            function findProcessPromiseRejectionHandler(evtName) {
                return function (e) {
                    var eventTasks = findEventTasks(process, evtName);
                    eventTasks.forEach(function (eventTask) {
                        // process has added unhandledrejection event listener
                        // trigger the event listener
                        if (evtName === 'unhandledRejection') {
                            eventTask.invoke(e.rejection, e.promise);
                        }
                        else if (evtName === 'rejectionHandled') {
                            eventTask.invoke(e.promise);
                        }
                    });
                };
            }
        });
        // Crypto
        Zone.__load_patch('crypto', function () {
            var crypto;
            try {
                crypto = require('crypto');
            }
            catch (err) { }
            // use the generic patchMacroTask to patch crypto
            if (crypto) {
                var methodNames = ['randomBytes', 'pbkdf2'];
                methodNames.forEach(function (name) {
                    patchMacroTask(crypto, name, function (self, args) {
                        return {
                            name: 'crypto.' + name,
                            args: args,
                            cbIdx: args.length > 0 && typeof args[args.length - 1] === 'function' ? args.length - 1 : -1,
                            target: crypto,
                        };
                    });
                });
            }
        });
        Zone.__load_patch('console', function (global, Zone) {
            var consoleMethods = [
                'dir',
                'log',
                'info',
                'error',
                'warn',
                'assert',
                'debug',
                'timeEnd',
                'trace',
            ];
            consoleMethods.forEach(function (m) {
                var originalMethod = (console[Zone.__symbol__(m)] = console[m]);
                if (originalMethod) {
                    console[m] = function () {
                        var args = ArraySlice.call(arguments);
                        if (Zone.current === Zone.root) {
                            return originalMethod.apply(this, args);
                        }
                        else {
                            return Zone.root.run(originalMethod, this, args);
                        }
                    };
                }
            });
        });
        Zone.__load_patch('queueMicrotask', function (global, Zone, api) {
            patchQueueMicrotask(global, api);
        });
    }
    function loadZone() {
        var _a;
        // if global['Zone'] already exists (maybe zone.js was already loaded or
        // some other lib also registered a global object named Zone), we may need
        // to throw an error, but sometimes user may not want this error.
        // For example,
        // we have two web pages, page1 includes zone.js, page2 doesn't.
        // and the 1st time user load page1 and page2, everything work fine,
        // but when user load page2 again, error occurs because global['Zone'] already exists.
        // so we add a flag to let user choose whether to throw this error or not.
        // By default, if existing Zone is from zone.js, we will not throw the error.
        var global = globalThis;
        var checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
        if (global['Zone'] && (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function')) {
            throw new Error('Zone already loaded.');
        }
        // Initialize global `Zone` constant.
        (_a = global['Zone']) !== null && _a !== void 0 ? _a : (global['Zone'] = initZone());
        return global['Zone'];
    }
    var Zone$1 = loadZone();
    patchCommon(Zone$1);
    patchBrowser(Zone$1);
    patchNode(Zone$1);
}));
ᚹ3x1웗
R'use strict'uglobal, Wexports === 'object' && typeof module !== 'undefined' ? factory(require('rxjs')) :
    8['rxjs'], factory) :
            (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.rxjs));
})(this, (function (rxjso6WRxJsqL$rxjs.(B98extSource = 'rxjs.Subscriber.next';
            var errorSource = 'rxjs.Subscriber.error';
            var completeSource = 'rxjs.Subscriber.complete'%ies =q$Tvar patchObservabld"%ObservablePrototype = rxjs.Observable%_symbolSubscribe = symbol('_subscribe1WS_subscribe = (ObservablePrototype[_symbolSubscribe] = ObservablePrototype._subscribies(rxjs.Observable.prototyp_zone: { value: null, writ! f _zoneSource: { value: null, writ! f#_zoneSubscribe: { value: null, writ! fsource:&hG"+` Y?S!XNQ`J;*`JzoneSa  	NXN
subscribe:&hG"+this._zoneSubscriba)!` Y?Subscriba "`J this.constructor === rxjs.Observ! e	_subscriba "`	to(thi!`eproto && proto._subscribaXNsubscriba)#?;*^	!subscriba)!``JzoneSubscribe = subscriba "``JzoneSubscribd*Pj%his._zone && this._zone !== Zone.curr`!&earDown_1 = this._zone.run(subscribe, A :	earDown_1#	_1 =aN	)	^zone_1 !== Zone.currezone_1.run(tearDown_1, A `@"e	earDown_1;)	_?#
tearDown_1!&X?#`e	subscribe;)?#_ "XN`subjectFactory:&"+` Y?SubjectFactoryxNfactorq[ =aN`JzoneSubjectFactory1^zone && zone !== Zone.currzone.run(factory, A  "actory;)pd 	NXNK`M"(rxjs.Observable.prototype, 'lift'~C6observable =)0^observable.operatR`observable.operator._)S7Method(observable.operator, 'call', function (operatorDoperatorSelf, operatorAAy^6operatorSelf._zone && operatorSelf._zone !== Zone.curr>?peratorSelf._zone.run(operatorDelegate, operatorSelf, operatorA8>/peratorDelegate.apply(operatorSelf, operatorArgQp.>bservable;
patchSubscription!ies(rxjs.Subscription.prototyp_zone: { value: null, writ! f%_zoneUnsubscribe: { value: null, writ! f_unsubscribe:&"+3this._zoneUnsubscribe || this._zoneUnsubscribeClear Y?
Unsubscriba "`	to(thi!`eproto && proto._unsubscribaXN
unsubscriba)#?;*^!unsubscriba)!``JzoneUnsubscribe = unsubscribaE2some operator such as `retryWhen`, the _unsubscrib(=// method will be set to null, so we need to set another flag1!`4o tell that we should return null instead of finding1!npМprototype chainq"`JzoneUnsubscribeClear "``JzoneUnsubscribeClearedyp`JzoneUnsubscribd*Pj%his._zone && this._zone !== Zone.currzone.run(unsubscribe, A p*eunsubscribe;)?#_ "XNK`patchSubscriber!$next = rxjs.Subscriber.prototype.nexp$rror = rxjs.Subscriber.prototype.err5+omplete = rxjs.Subscriber.prototype.completa{(rxjs.Subscriber.prototype, 'destination'hG"2Nstina`destina `J;&`JzoneDestination = destinaK0,// patch Subscriber.next to make sure it runADinto SubscriptionZone
                rxjs.Subscriber.prototype.next%oZ'(pCubscriptionZone =aN`+check Zone.currenAm,qual with this._zone(SubscriptionZone) or noA^1subscriptionZone && subscriptionZone !== currentZ_)e1subscriptionZone.run(next, this, arguments, nextSHV5enext;)Xdrxjs.Subscriber.prototype.error%oZ'(pCubscriptionZone =aN`+check Zone.currenAm,qual with this._zone(SubscriptionZone) or noA^1subscriptionZone && subscriptionZone !== currentZ_)e3subscriptionZone.run(error, this, arguments, errorSHV5eerro;*Xd!rxjs.Subscriber.prototype.completd&oZ'(pCubscriptionZone =aN`+check Zone.currenAm,qual with this._zone(SubscriptionZone) or noA^1subscriptionZone && subscriptionZone !== currentZ_)e9subscriptionZone.run(complete, this, arguments, completeSHV5ecompleteAP_opatchObservable(Subscription(Subscriber(patchRxJs(Zone);
}));
x`"use strict";var __assign=this&&this.__assign||function(){return __assign=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},__assign.apply(this,arguments)};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){var e=globalThis;function t(t){return(e.__Zone_symbol_prefix||"__zone_symbol__")+t}function n(){var n=e.performance;function r(e){n&&n.mark&&n.mark(e)}function o(e,t){n&&n.measure&&n.measure(e,t)}r("Zone");var a,i=function(){function n(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new s(this,this._parent&&this._parent._zoneDelegate,t)}return n.assertZonePatched=function(){if(e.Promise!==D.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(n,"root",{get:function(){for(var e=n.current;e.parent;)e=e.parent;return e},enumerable:!1,configurable:!0}),Object.defineProperty(n,"current",{get:function(){return j.zone},enumerable:!1,configurable:!0}),Object.defineProperty(n,"currentTask",{get:function(){return C},enumerable:!1,configurable:!0}),n.__load_patch=function(a,i,c){if(void 0===c&&(c=!1),D.hasOwnProperty(a)){var s=!0===e[t("forceDuplicateZoneCheck")];if(!c&&s)throw Error("Already loaded patch: "+a)}else if(!e["__Zone_disable_"+a]){var u="Zone:"+a;r(u),D[a]=i(e,n,Z),o(u,u)}},Object.defineProperty(n.prototype,"parent",{get:function(){return this._parent},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),n.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},n.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},n.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},n.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},n.prototype.run=function(e,t,n,r){j={parent:j,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{j=j.parent}},n.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),j={parent:j,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{j=j.parent}},n.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");var r=e,o=e.type,a=e.data,i=void 0===a?{}:a,c=i.isPeriodic,s=void 0!==c&&c,u=i.isRefreshable,l=void 0!==u&&u;if(e.state!==k||o!==O&&o!==P){var f=e.state!=T;f&&r._transitionTo(T,b);var h=C;C=r,j={parent:j,zone:this};try{o!=P||!e.data||s||l||(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,r,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{var p=e.state;if(p!==k&&p!==w)if(o==O||s||l&&p===m)f&&r._transitionTo(b,T,m);else{var v=r._zoneDelegates;this._updateTaskCount(r,-1),f&&r._transitionTo(k,T,k),l&&(r._zoneDelegates=v)}j=j.parent,C=h}}},n.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to ".concat(this.name," which is descendants of the original zone ").concat(e.zone.name));t=t.parent}e._transitionTo(m,k);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(w,m,k),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==m&&e._transitionTo(b,m),e},n.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new u(S,e,t,n,r,void 0))},n.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new u(P,e,t,n,r,o))},n.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new u(O,e,t,n,r,o))},n.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");if(e.state===b||e.state===T){e._transitionTo(E,b,T);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(w,E),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(k,E),e.runCount=-1,e}},n.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},n.__symbol__=t,n}(),c={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,a){return e.invokeTask(n,r,o,a)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},s=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this._zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this._zone:t._forkCurrZone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this._zone:t._interceptCurrZone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this._zone:t._invokeCurrZone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this._zone:t._handleErrorCurrZone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this._zone:t._scheduleTaskCurrZone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this._zone:t._invokeTaskCurrZone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this._zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var r=n&&n.onHasTask;(r||t&&t._hasTaskZS)&&(this._hasTaskZS=r?n:c,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,n.onScheduleTask||(this._scheduleTaskZS=c,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this._zone),n.onInvokeTask||(this._invokeTaskZS=c,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this._zone),n.onCancelTask||(this._cancelTaskZS=c,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this._zone))}return Object.defineProperty(e.prototype,"zone",{get:function(){return this._zone},enumerable:!1,configurable:!0}),e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new i(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,o){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,r,o):t.apply(n,r)},e.prototype.handleError=function(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)},e.prototype.scheduleTask=function(e,t){var n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),(n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t))||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=S)throw new Error("Task is missing scheduleFn.");_(t)}return n},e.prototype.invokeTask=function(e,t,n,r){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,r):t.callback.apply(n,r)},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n},e.prototype.hasTask=function(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],o=n[e]=r+t;if(o<0)throw new Error("More tasks executed then were scheduled.");0!=r&&0!=o||this.hasTask(this._zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})},e}(),u=function(){function t(n,r,o,a,i,c){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=a,this.scheduleFn=i,this.cancelFn=c,!o)throw new Error("callback is not defined");this.callback=o;var s=this;this.invoke=n===O&&a&&a.useG?t.invokeTask:function(){return t.invokeTask.call(e,s,this,arguments)}}return t.invokeTask=function(e,t,n){e||(e=this),z++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==z&&g(),z--}},Object.defineProperty(t.prototype,"zone",{get:function(){return this._zone},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return this._state},enumerable:!1,configurable:!0}),t.prototype.cancelScheduleRequest=function(){this._transitionTo(k,m)},t.prototype._transitionTo=function(e,t,n){if(this._state!==t&&this._state!==n)throw new Error("".concat(this.type," '").concat(this.source,"': can not transition to '").concat(e,"', expecting state '").concat(t,"'").concat(n?" or '"+n+"'":"",", was '").concat(this._state,"'."));this._state=e,e==k&&(this._zoneDelegates=null)},t.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},t.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},t}(),l=t("setTimeout"),f=t("Promise"),h=t("then"),p=[],v=!1;function d(t){if(a||e[f]&&(a=e[f].resolve(0)),a){var n=a[h];n||(n=a.then),n.call(a,t)}else e[l](t,0)}function _(e){0===z&&0===p.length&&d(g),e&&p.push(e)}function g(){if(!v){for(v=!0;p.length;){var e=p;p=[];for(var t=0;t<e.length;t++){var n=e[t];try{n.zone.runTask(n,null,null)}catch(e){Z.onUnhandledError(e)}}}Z.microtaskDrainDone(),v=!1}}var y={name:"NO ZONE"},k="notScheduled",m="scheduling",b="scheduled",T="running",E="canceling",w="unknown",S="microTask",P="macroTask",O="eventTask",D={},Z={symbol:t,currentZoneFrame:function(){return j},onUnhandledError:I,microtaskDrainDone:I,scheduleMicroTask:_,showUncaughtError:function(){return!i[t("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:I,patchMethod:function(){return I},bindArguments:function(){return[]},patchThen:function(){return I},patchMacroTask:function(){return I},patchEventPrototype:function(){return I},isIEOrEdge:function(){return!1},getGlobalObjects:function(){},ObjectDefineProperty:function(){return I},ObjectGetOwnPropertyDescriptor:function(){},ObjectCreate:function(){},ArraySlice:function(){return[]},patchClass:function(){return I},wrapWithCurrentZone:function(){return I},filterProperties:function(){return[]},attachOriginToPatched:function(){return I},_redefineProperty:function(){return I},patchCallbacks:function(){return I},nativeScheduleMicroTask:d},j={parent:null,zone:new i(null,null)},C=null,z=0;function I(){}return o("Zone","Zone"),i}var r=Object.getOwnPropertyDescriptor,o=Object.defineProperty,a=Object.getPrototypeOf,i=Object.create,c=Array.prototype.slice,s="addEventListener",u="removeEventListener",l=t(s),f=t(u),h="true",p="false",v=t("");function d(e,t){return Zone.current.wrap(e,t)}function _(e,t,n,r,o){return Zone.current.scheduleMacroTask(e,t,n,r,o)}var g=t,y="undefined"!=typeof window,k=y?window:void 0,m=y&&k||globalThis;function b(e,t){for(var n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=d(e[n],t+"_"+n));return e}function T(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}var E="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,w=!("nw"in m)&&void 0!==m.process&&"[object process]"===m.process.toString(),S=!w&&!E&&!(!y||!k.HTMLElement),P=void 0!==m.process&&"[object process]"===m.process.toString()&&!E&&!(!y||!k.HTMLElement),O={},D=g("enable_beforeunload"),Z=function(e){if(e=e||m.event){var t=O[e.type];t||(t=O[e.type]=g("ON_PROPERTY"+e.type));var n,r=this||e.target||m,o=r[t];return S&&r===k&&"error"===e.type?!0===(n=o&&o.call(this,e.message,e.filename,e.lineno,e.colno,e.error))&&e.preventDefault():(n=o&&o.apply(this,arguments),"beforeunload"===e.type&&m[D]&&"string"==typeof n?e.returnValue=n:null==n||n||e.preventDefault()),n}};function j(e,t,n){var a=r(e,t);if(!a&&n&&r(n,t)&&(a={enumerable:!0,configurable:!0}),a&&a.configurable){var i=g("on"+t+"patched");if(!e.hasOwnProperty(i)||!e[i]){delete a.writable,delete a.value;var c=a.get,s=a.set,u=t.slice(2),l=O[u];l||(l=O[u]=g("ON_PROPERTY"+u)),a.set=function(t){var n=this;n||e!==m||(n=m),n&&("function"==typeof n[l]&&n.removeEventListener(u,Z),null==s||s.call(n,null),n[l]=t,"function"==typeof t&&n.addEventListener(u,Z,!1))},a.get=function(){var n=this;if(n||e!==m||(n=m),!n)return null;var r=n[l];if(r)return r;if(c){var o=c.call(this);if(o)return a.set.call(this,o),"function"==typeof n.removeAttribute&&n.removeAttribute(t),o}return null},o(e,t,a),e[i]=!0}}}function C(e,t,n){if(t)for(var r=0;r<t.length;r++)j(e,"on"+t[r],n);else{var o=[];for(var a in e)"on"==a.slice(0,2)&&o.push(a);for(var i=0;i<o.length;i++)j(e,o[i],n)}}var z=g("originalInstance");function I(e){var t=m[e];if(t){m[g(e)]=t,m[e]=function(){var n=b(arguments,e);switch(n.length){case 0:this[z]=new t;break;case 1:this[z]=new t(n[0]);break;case 2:this[z]=new t(n[0],n[1]);break;case 3:this[z]=new t(n[0],n[1],n[2]);break;case 4:this[z]=new t(n[0],n[1],n[2],n[3]);break;default:throw new Error("Arg list too long.")}},L(m[e],t);var n,r=new t((function(){}));for(n in r)"XMLHttpRequest"===e&&"responseBlob"===n||function(t){"function"==typeof r[t]?m[e].prototype[t]=function(){return this[z][t].apply(this[z],arguments)}:o(m[e].prototype,t,{set:function(n){"function"==typeof n?(this[z][t]=d(n,e+"."+t),L(this[z][t],n)):this[z][t]=n},get:function(){return this[z][t]}})}(n);for(n in t)"prototype"!==n&&t.hasOwnProperty(n)&&(m[e][n]=t[n])}}var R=!1;function M(e,t,n){for(var o=e;o&&!o.hasOwnProperty(t);)o=a(o);!o&&e[t]&&(o=e);var i=g(t),c=null;if(o&&(!(c=o[i])||!o.hasOwnProperty(i))&&(c=o[i]=o[t],T(o&&r(o,t)))){var s=n(c,i,t);o[t]=function(){return s(this,arguments)},L(o[t],c),R&&function e(t,n){"function"==typeof Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach((function(e){var r=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(n,e,{get:function(){return t[e]},set:function(n){(!r||r.writable&&"function"==typeof r.set)&&(t[e]=n)},enumerable:!r||r.enumerable,configurable:!r||r.configurable})}))}(c,o[t])}return c}function N(e,t,n){var r=null;function o(e){var t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},r.apply(t.target,t.args),e}r=M(e,t,(function(e){return function(t,r){var a=n(t,r);return a.cbIdx>=0&&"function"==typeof r[a.cbIdx]?_(a.name,r[a.cbIdx],a,o):e.apply(t,r)}}))}function A(e,t,n){var r=null;function o(e){var t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},r.apply(t.target,t.args),e}r=M(e,t,(function(e){return function(t,r){var a=n(t,r);return a.cbIdx>=0&&"function"==typeof r[a.cbIdx]?Zone.current.scheduleMicroTask(a.name,r[a.cbIdx],a,o):e.apply(t,r)}}))}function L(e,t){e[g("OriginalDelegate")]=t}var x=!1,H=!1;function F(){if(x)return H;x=!0;try{var e=k.navigator.userAgent;-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(H=!0)}catch(e){}return H}function q(e){return"function"==typeof e}function G(e){return"number"==typeof e}var B={useG:!0},U={},W={},V=new RegExp("^"+v+"(\\w+)(true|false)$"),X=g("propagationStopped");function Y(e,t){var n=(t?t(e):e)+p,r=(t?t(e):e)+h,o=v+n,a=v+r;U[e]={},U[e][p]=o,U[e][h]=a}function J(e,t,n,r){var o=r&&r.add||s,i=r&&r.rm||u,c=r&&r.listeners||"eventListeners",l=r&&r.rmAll||"removeAllListeners",f=g(o),d="."+o+":",_="prependListener",y="."+_+":",k=function(e,t,n){if(!e.isRemoved){var r,o=e.callback;"object"==typeof o&&o.handleEvent&&(e.callback=function(e){return o.handleEvent(e)},e.originalDelegate=o);try{e.invoke(e,t,[n])}catch(e){r=e}var a=e.options;return a&&"object"==typeof a&&a.once&&t[i].call(t,n.type,e.originalDelegate?e.originalDelegate:e.callback,a),r}};function m(n,r,o){if(r=r||e.event){var a=n||r.target||e,i=a[U[r.type][o?h:p]];if(i){var c=[];if(1===i.length)(l=k(i[0],a,r))&&c.push(l);else for(var s=i.slice(),u=0;u<s.length&&(!r||!0!==r[X]);u++){var l;(l=k(s[u],a,r))&&c.push(l)}if(1===c.length)throw c[0];var f=function(e){var n=c[e];t.nativeScheduleMicroTask((function(){throw n}))};for(u=0;u<c.length;u++)f(u)}}}var b=function(e){return m(this,e,!1)},T=function(e){return m(this,e,!0)};function E(t,n){if(!t)return!1;var r=!0;n&&void 0!==n.useG&&(r=n.useG);var s=n&&n.vh,u=!0;n&&void 0!==n.chkDup&&(u=n.chkDup);var k=!1;n&&void 0!==n.rt&&(k=n.rt);for(var m=t;m&&!m.hasOwnProperty(o);)m=a(m);if(!m&&t[o]&&(m=t),!m)return!1;if(m[f])return!1;var E,S=n&&n.eventNameToString,P={},O=m[f]=m[o],D=m[g(i)]=m[i],Z=m[g(c)]=m[c],j=m[g(l)]=m[l];n&&n.prepend&&(E=m[g(n.prepend)]=m[n.prepend]);var C=r?function(e){if(!P.isExisting)return O.call(P.target,P.eventName,P.capture?T:b,P.options)}:function(e){return O.call(P.target,P.eventName,e.invoke,P.options)},z=r?function(e){if(!e.isRemoved){var t=U[e.eventName],n=void 0;t&&(n=t[e.capture?h:p]);var r=n&&e.target[n];if(r)for(var o=0;o<r.length;o++)if(r[o]===e){r.splice(o,1),e.isRemoved=!0,e.removeAbortListener&&(e.removeAbortListener(),e.removeAbortListener=null),0===r.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return D.call(e.target,e.eventName,e.capture?T:b,e.options)}:function(e){return D.call(e.target,e.eventName,e.invoke,e.options)},I=(null==n?void 0:n.diff)||function(e,t){var n=typeof t;return"function"===n&&e.callback===t||"object"===n&&e.originalDelegate===t},R=Zone[g("UNPATCHED_EVENTS")],M=e[g("PASSIVE_EVENTS")],N=function(t,o,a,i,c,l){return void 0===c&&(c=!1),void 0===l&&(l=!1),function(){var f=this||e,v=arguments[0];n&&n.transferEventName&&(v=n.transferEventName(v));var d=arguments[1];if(!d)return t.apply(this,arguments);if(w&&"uncaughtException"===v)return t.apply(this,arguments);var _=!1;if("function"!=typeof d){if(!d.handleEvent)return t.apply(this,arguments);_=!0}if(!s||s(t,d,f,arguments)){var g=!!M&&-1!==M.indexOf(v),y=function n(e){if("object"==typeof e&&null!==e){var t=__assign({},e);return e.signal&&(t.signal=e.signal),t}return e}(function e(t,n){return n?"boolean"==typeof t?{capture:t,passive:!0}:t?"object"==typeof t&&!1!==t.passive?__assign(__assign({},t),{passive:!0}):t:{passive:!0}:t}(arguments[2],g)),k=null==y?void 0:y.signal;if(!(null==k?void 0:k.aborted)){if(R)for(var m=0;m<R.length;m++)if(v===R[m])return g?t.call(f,v,d,y):t.apply(this,arguments);var b=!!y&&("boolean"==typeof y||y.capture),T=!(!y||"object"!=typeof y)&&y.once,E=Zone.current,O=U[v];O||(Y(v,S),O=U[v]);var D,Z=O[b?h:p],j=f[Z],C=!1;if(j){if(C=!0,u)for(m=0;m<j.length;m++)if(I(j[m],d))return}else j=f[Z]=[];var z=f.constructor.name,N=W[z];N&&(D=N[v]),D||(D=z+o+(S?S(v):v)),P.options=y,T&&(P.options.once=!1),P.target=f,P.capture=b,P.eventName=v,P.isExisting=C;var A=r?B:void 0;A&&(A.taskData=P),k&&(P.options.signal=void 0);var L=E.scheduleEventTask(D,d,A,a,i);if(k){P.options.signal=k;var x=function(){return L.zone.cancelTask(L)};t.call(k,"abort",x,{once:!0}),L.removeAbortListener=function(){return k.removeEventListener("abort",x)}}return P.target=null,A&&(A.taskData=null),T&&(P.options.once=!0),"boolean"!=typeof L.options&&(L.options=y),L.target=f,L.capture=b,L.eventName=v,_&&(L.originalDelegate=d),l?j.unshift(L):j.push(L),c?f:void 0}}}};return m[o]=N(O,d,C,z,k),E&&(m[_]=N(E,y,(function(e){return E.call(P.target,P.eventName,e.invoke,P.options)}),z,k,!0)),m[i]=function(){var t=this||e,r=arguments[0];n&&n.transferEventName&&(r=n.transferEventName(r));var o=arguments[2],a=!!o&&("boolean"==typeof o||o.capture),i=arguments[1];if(!i)return D.apply(this,arguments);if(!s||s(D,i,t,arguments)){var c,u=U[r];u&&(c=u[a?h:p]);var l=c&&t[c];if(l)for(var f=0;f<l.length;f++){var d=l[f];if(I(d,i))return l.splice(f,1),d.isRemoved=!0,0===l.length&&(d.allRemoved=!0,t[c]=null,a||"string"!=typeof r||(t[v+"ON_PROPERTY"+r]=null)),d.zone.cancelTask(d),k?t:void 0}return D.apply(this,arguments)}},m[c]=function(){var t=this||e,r=arguments[0];n&&n.transferEventName&&(r=n.transferEventName(r));for(var o=[],a=K(t,S?S(r):r),i=0;i<a.length;i++){var c=a[i];o.push(c.originalDelegate?c.originalDelegate:c.callback)}return o},m[l]=function(){var t=this||e,r=arguments[0];if(r){n&&n.transferEventName&&(r=n.transferEventName(r));var o=U[r];if(o){var a=t[o[p]],c=t[o[h]];if(a){var s=a.slice();for(v=0;v<s.length;v++)this[i].call(this,r,(u=s[v]).originalDelegate?u.originalDelegate:u.callback,u.options)}if(c)for(s=c.slice(),v=0;v<s.length;v++){var u;this[i].call(this,r,(u=s[v]).originalDelegate?u.originalDelegate:u.callback,u.options)}}}else{for(var f=Object.keys(t),v=0;v<f.length;v++){var d=V.exec(f[v]),_=d&&d[1];_&&"removeListener"!==_&&this[l].call(this,_)}this[l].call(this,"removeListener")}if(k)return this},L(m[o],O),L(m[i],D),j&&L(m[l],j),Z&&L(m[c],Z),!0}for(var S=[],P=0;P<n.length;P++)S[P]=E(n[P],r);return S}function K(e,t){if(!t){var n=[];for(var r in e){var o=V.exec(r),a=o&&o[1];if(a&&(!t||a===t)){var i=e[r];if(i)for(var c=0;c<i.length;c++)n.push(i[c])}}return n}var s=U[t];s||(Y(t),s=U[t]);var u=e[s[p]],l=e[s[h]];return u?l?u.concat(l):u.slice():l?l.slice():[]}function $(e,t){var n=e.Event;n&&n.prototype&&t.patchMethod(n.prototype,"stopImmediatePropagation",(function(e){return function(t,n){t[X]=!0,e&&e.apply(t,n)}}))}function Q(e,t){t.patchMethod(e,"queueMicrotask",(function(e){return function(e,t){Zone.current.scheduleMicroTask("queueMicrotask",t[0])}}))}var ee=g("zoneTask");function te(e,t,n,r){var o=null,a=null;n+=r;var i={};function c(t){var n=t.data;n.args[0]=function(){return t.invoke.apply(this,arguments)};var r=o.apply(e,n.args);return G(r)?n.handleId=r:(n.handle=r,n.isRefreshable=q(r.refresh)),t}function s(t){var n=t.data,r=n.handle;return a.call(e,null!=r?r:n.handleId)}o=M(e,t+=r,(function(n){return function(o,a){var u;if(q(a[0])){var l={isRefreshable:!1,isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?a[1]||0:void 0,args:a},f=a[0];a[0]=function e(){try{return f.apply(this,arguments)}finally{var t=l.handle,n=l.handleId;l.isPeriodic||l.isRefreshable||(n?delete i[n]:t&&(t[ee]=null))}};var h=_(t,a[0],l,c,s);if(!h)return h;var p=h.data,v=p.handleId,d=p.handle,g=p.isRefreshable,y=p.isPeriodic;if(v)i[v]=h;else if(d&&(d[ee]=h,g&&!y)){var k=d.refresh;d.refresh=function(){var e=h.zone,t=h.state;return"notScheduled"===t?(h._state="scheduled",e._updateTaskCount(h,1)):"running"===t&&(h._state="scheduling"),k.call(this)}}return null!==(u=null!=d?d:v)&&void 0!==u?u:h}return n.apply(e,a)}})),a=M(e,n,(function(t){return function(n,r){var o,a=r[0];G(a)?(o=i[a],delete i[a]):(o=null==a?void 0:a[ee])?a[ee]=null:o=a,(null==o?void 0:o.type)?o.cancelFn&&o.zone.cancelTask(o):t.apply(e,r)}}))}function ne(e,t){if(!Zone[t.symbol("patchEventTarget")]){for(var n=t.getGlobalObjects(),r=n.eventNames,o=n.zoneSymbolEventNames,a=n.TRUE_STR,i=n.FALSE_STR,c=n.ZONE_SYMBOL_PREFIX,s=0;s<r.length;s++){var u=r[s],l=c+(u+i),f=c+(u+a);o[u]={},o[u][i]=l,o[u][a]=f}var h=e.EventTarget;if(h&&h.prototype)return t.patchEventTarget(e,t,[h&&h.prototype]),!0}}function re(e,t,n){if(!n||0===n.length)return t;var r=n.filter((function(t){return t.target===e}));if(0===r.length)return t;var o=r[0].ignoreProperties;return t.filter((function(e){return-1===o.indexOf(e)}))}function oe(e,t,n,r){e&&C(e,re(e,t,n),r)}function ae(e){return Object.getOwnPropertyNames(e).filter((function(e){return e.startsWith("on")&&e.length>2})).map((function(e){return e.substring(2)}))}function ie(e,t){if((!w||P)&&!Zone[e.symbol("patchEvents")]){var n=t.__Zone_ignore_on_properties,r=[];if(S){var o=window;r=r.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]),oe(o,ae(o),n?n.concat([]):n,a(o))}r=r.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(var i=0;i<r.length;i++){var c=t[r[i]];(null==c?void 0:c.prototype)&&oe(c.prototype,ae(c.prototype),n)}}}function ce(e,t,n,r,o){var a=Zone.__symbol__(r);if(!t[a]){var i=t[a]=t[r];t[r]=function(a,c,s){return c&&c.prototype&&o.forEach((function(t){var o="".concat(n,".").concat(r,"::")+t,a=c.prototype;try{if(a.hasOwnProperty(t)){var i=e.ObjectGetOwnPropertyDescriptor(a,t);i&&i.value?(i.value=e.wrapWithCurrentZone(i.value,o),e._redefineProperty(c.prototype,t,i)):a[t]&&(a[t]=e.wrapWithCurrentZone(a[t],o))}else a[t]&&(a[t]=e.wrapWithCurrentZone(a[t],o))}catch(e){}})),i.call(t,a,c,s)},e.attachOriginToPatched(t[r],i)}}var se="set",ue="clear",le=function fe(){var e,r=globalThis,o=!0===r[t("forceDuplicateZoneCheck")];if(r.Zone&&(o||"function"!=typeof r.Zone.__symbol__))throw new Error("Zone already loaded.");return null!==(e=r.Zone)&&void 0!==e||(r.Zone=n()),r.Zone}();!function he(e){(function t(e){e.__load_patch("ZoneAwarePromise",(function(e,t,n){var r=Object.getOwnPropertyDescriptor,o=Object.defineProperty,a=n.symbol,i=[],c=!1!==e[a("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],s=a("Promise"),u=a("then");n.onUnhandledError=function(e){if(n.showUncaughtError()){var t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=function(){for(var e=function(){var e=i.shift();try{e.zone.runGuarded((function(){if(e.throwOriginal)throw e.rejection;throw e}))}catch(e){!function r(e){n.onUnhandledError(e);try{var r=t[l];"function"==typeof r&&r.call(this,e)}catch(e){}}(e)}};i.length;)e()};var l=a("unhandledPromiseRejectionHandler");function f(e){return e&&"function"==typeof e.then}function h(e){return e}function p(e){return z.reject(e)}var v=a("state"),d=a("value"),_=a("finally"),g=a("parentPromiseValue"),y=a("parentPromiseState"),k=null,m=!0,b=!1;function T(e,t){return function(n){try{P(e,t,n)}catch(t){P(e,!1,t)}}}var E=function(){var e=!1;return function t(n){return function(){e||(e=!0,n.apply(null,arguments))}}},w="Promise resolved with itself",S=a("currentTaskTrace");function P(e,r,a){var s=E();if(e===a)throw new TypeError(w);if(e[v]===k){var u=null;try{"object"!=typeof a&&"function"!=typeof a||(u=a&&a.then)}catch(t){return s((function(){P(e,!1,t)}))(),e}if(r!==b&&a instanceof z&&a.hasOwnProperty(v)&&a.hasOwnProperty(d)&&a[v]!==k)D(a),P(e,a[v],a[d]);else if(r!==b&&"function"==typeof u)try{u.call(a,s(T(e,r)),s(T(e,!1)))}catch(t){s((function(){P(e,!1,t)}))()}else{e[v]=r;var l=e[d];if(e[d]=a,e[_]===_&&r===m&&(e[v]=e[y],e[d]=e[g]),r===b&&a instanceof Error){var f=t.currentTask&&t.currentTask.data&&t.currentTask.data.__creationTrace__;f&&o(a,S,{configurable:!0,enumerable:!1,writable:!0,value:f})}for(var h=0;h<l.length;)Z(e,l[h++],l[h++],l[h++],l[h++]);if(0==l.length&&r==b){e[v]=0;var p=a;try{throw new Error("Uncaught (in promise): "+function e(t){return t&&t.toString===Object.prototype.toString?(t.constructor&&t.constructor.name||"")+": "+JSON.stringify(t):t?t.toString():Object.prototype.toString.call(t)}(a)+(a&&a.stack?"\n"+a.stack:""))}catch(e){p=e}c&&(p.throwOriginal=!0),p.rejection=a,p.promise=e,p.zone=t.current,p.task=t.currentTask,i.push(p),n.scheduleMicroTask()}}}return e}var O=a("rejectionHandledHandler");function D(e){if(0===e[v]){try{var n=t[O];n&&"function"==typeof n&&n.call(this,{rejection:e[d],promise:e})}catch(e){}e[v]=b;for(var r=0;r<i.length;r++)e===i[r].promise&&i.splice(r,1)}}function Z(e,t,n,r,o){D(e);var a=e[v],i=a?"function"==typeof r?r:h:"function"==typeof o?o:p;t.scheduleMicroTask("Promise.then",(function(){try{var r=e[d],o=!!n&&_===n[_];o&&(n[g]=r,n[y]=a);var c=t.run(i,void 0,o&&i!==p&&i!==h?[]:[r]);P(n,!0,c)}catch(e){P(n,!1,e)}}),n)}var j=function(){},C=e.AggregateError,z=function(){function e(t){var n=this;if(!(n instanceof e))throw new Error("Must be an instanceof Promise.");n[v]=k,n[d]=[];try{var r=E();t&&t(r(T(n,m)),r(T(n,b)))}catch(e){P(n,!1,e)}}return e.toString=function(){return"function ZoneAwarePromise() { [native code] }"},e.resolve=function(t){return t instanceof e?t:P(new this(null),m,t)},e.reject=function(e){return P(new this(null),b,e)},e.withResolvers=function(){var t={};return t.promise=new e((function(e,n){t.resolve=e,t.reject=n})),t},e.any=function(t){if(!t||"function"!=typeof t[Symbol.iterator])return Promise.reject(new C([],"All promises were rejected"));var n=[],r=0;try{for(var o=0,a=t;o<a.length;o++)r++,n.push(e.resolve(a[o]))}catch(e){return Promise.reject(new C([],"All promises were rejected"))}if(0===r)return Promise.reject(new C([],"All promises were rejected"));var i=!1,c=[];return new e((function(e,t){for(var o=0;o<n.length;o++)n[o].then((function(t){i||(i=!0,e(t))}),(function(e){c.push(e),0===--r&&(i=!0,t(new C(c,"All promises were rejected")))}))}))},e.race=function(e){var t,n,r=new this((function(e,r){t=e,n=r}));function o(e){t(e)}function a(e){n(e)}for(var i=0,c=e;i<c.length;i++){var s=c[i];f(s)||(s=this.resolve(s)),s.then(o,a)}return r},e.all=function(t){return e.allWithCallback(t)},e.allSettled=function(t){return(this&&this.prototype instanceof e?this:e).allWithCallback(t,{thenCallback:function(e){return{status:"fulfilled",value:e}},errorCallback:function(e){return{status:"rejected",reason:e}}})},e.allWithCallback=function(e,t){for(var n,r,o=new this((function(e,t){n=e,r=t})),a=2,i=0,c=[],s=function(e){f(e)||(e=u.resolve(e));var o=i;try{e.then((function(e){c[o]=t?t.thenCallback(e):e,0===--a&&n(c)}),(function(e){t?(c[o]=t.errorCallback(e),0===--a&&n(c)):r(e)}))}catch(e){r(e)}a++,i++},u=this,l=0,h=e;l<h.length;l++)s(h[l]);return 0==(a-=2)&&n(c),o},Object.defineProperty(e.prototype,Symbol.toStringTag,{get:function(){return"Promise"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,Symbol.species,{get:function(){return e},enumerable:!1,configurable:!0}),e.prototype.then=function(n,r){var o,a=null===(o=this.constructor)||void 0===o?void 0:o[Symbol.species];a&&"function"==typeof a||(a=this.constructor||e);var i=new a(j),c=t.current;return this[v]==k?this[d].push(c,i,n,r):Z(this,c,i,n,r),i},e.prototype.catch=function(e){return this.then(null,e)},e.prototype.finally=function(n){var r,o=null===(r=this.constructor)||void 0===r?void 0:r[Symbol.species];o&&"function"==typeof o||(o=e);var a=new o(j);a[_]=_;var i=t.current;return this[v]==k?this[d].push(i,a,n,n):Z(this,i,a,n,n),a},e}();z.resolve=z.resolve,z.reject=z.reject,z.race=z.race,z.all=z.all;var I=e[s]=e.Promise;e.Promise=z;var R=a("thenPatched");function N(e){var t=e.prototype,n=r(t,"then");if(!n||!1!==n.writable&&n.configurable){var o=t.then;t[u]=o,e.prototype.then=function(e,t){var n=this;return new z((function(e,t){o.call(n,e,t)})).then(e,t)},e[R]=!0}}return n.patchThen=N,I&&(N(I),M(e,"fetch",(function(e){return function t(e){return function(t,n){var r=e.apply(t,n);if(r instanceof z)return r;var o=r.constructor;return o[R]||N(o),r}}(e)}))),Promise[t.__symbol__("uncaughtPromiseErrors")]=i,z}))})(e),function n(e){e.__load_patch("toString",(function(e){var t=Function.prototype.toString,n=g("OriginalDelegate"),r=g("Promise"),o=g("Error"),a=function a(){if("function"==typeof this){var i=this[n];if(i)return"function"==typeof i?t.call(i):Object.prototype.toString.call(i);if(this===Promise){var c=e[r];if(c)return t.call(c)}if(this===Error){var s=e[o];if(s)return t.call(s)}}return t.call(this)};a[n]=t,Function.prototype.toString=a;var i=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":i.call(this)}}))}(e),function a(e){e.__load_patch("util",(function(e,t,n){var a=ae(e);n.patchOnProperties=C,n.patchMethod=M,n.bindArguments=b,n.patchMacroTask=N;var l=t.__symbol__("BLACK_LISTED_EVENTS"),f=t.__symbol__("UNPATCHED_EVENTS");e[f]&&(e[l]=e[f]),e[l]&&(t[l]=t[f]=e[l]),n.patchEventPrototype=$,n.patchEventTarget=J,n.isIEOrEdge=F,n.ObjectDefineProperty=o,n.ObjectGetOwnPropertyDescriptor=r,n.ObjectCreate=i,n.ArraySlice=c,n.patchClass=I,n.wrapWithCurrentZone=d,n.filterProperties=re,n.attachOriginToPatched=L,n._redefineProperty=Object.defineProperty,n.patchCallbacks=ce,n.getGlobalObjects=function(){return{globalSources:W,zoneSymbolEventNames:U,eventNames:a,isBrowser:S,isMix:P,isNode:w,TRUE_STR:h,FALSE_STR:p,ZONE_SYMBOL_PREFIX:v,ADD_EVENT_LISTENER_STR:s,REMOVE_EVENT_LISTENER_STR:u}}}))}(e)}(le),function pe(e){e.__load_patch("legacy",(function(t){var n=t[e.__symbol__("legacyPatch")];n&&n()})),e.__load_patch("timers",(function(e){var t="set",n="clear";te(e,t,n,"Timeout"),te(e,t,n,"Interval"),te(e,t,n,"Immediate")})),e.__load_patch("requestAnimationFrame",(function(e){te(e,"request","cancel","AnimationFrame"),te(e,"mozRequest","mozCancel","AnimationFrame"),te(e,"webkitRequest","webkitCancel","AnimationFrame")})),e.__load_patch("blocking",(function(e,t){for(var n=["alert","prompt","confirm"],r=0;r<n.length;r++)M(e,n[r],(function(n,r,o){return function(r,a){return t.current.run(n,e,a,o)}}))})),e.__load_patch("EventTarget",(function(e,t,n){!function r(e,t){t.patchEventPrototype(e,t)}(e,n),ne(e,n);var o=e.XMLHttpRequestEventTarget;o&&o.prototype&&n.patchEventTarget(e,n,[o.prototype])})),e.__load_patch("MutationObserver",(function(e,t,n){I("MutationObserver"),I("WebKitMutationObserver")})),e.__load_patch("IntersectionObserver",(function(e,t,n){I("IntersectionObserver")})),e.__load_patch("FileReader",(function(e,t,n){I("FileReader")})),e.__load_patch("on_property",(function(e,t,n){ie(n,e)})),e.__load_patch("customElements",(function(e,t,n){!function r(e,t){var n=t.getGlobalObjects();(n.isBrowser||n.isMix)&&e.customElements&&"customElements"in e&&t.patchCallbacks(t,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"])}(e,n)})),e.__load_patch("XHR",(function(e,t){!function n(e){var n=e.XMLHttpRequest;if(n){var u=n.prototype,h=u[l],p=u[f];if(!h){var v=e.XMLHttpRequestEventTarget;if(v){var d=v.prototype;h=d[l],p=d[f]}}var y="readystatechange",k="scheduled",m=M(u,"open",(function(){return function(e,t){return e[o]=0==t[2],e[c]=t[1],m.apply(e,t)}})),b=g("fetchTaskAborting"),T=g("fetchTaskScheduling"),E=M(u,"send",(function(){return function(e,n){if(!0===t.current[T])return E.apply(e,n);if(e[o])return E.apply(e,n);var r={target:e,url:e[c],isPeriodic:!1,args:n,aborted:!1},a=_("XMLHttpRequest.send",P,r,S,O);e&&!0===e[s]&&!r.aborted&&a.state===k&&a.invoke()}})),w=M(u,"abort",(function(){return function(e,n){var o=function a(e){return e[r]}(e);if(o&&"string"==typeof o.type){if(null==o.cancelFn||o.data&&o.data.aborted)return;o.zone.cancelTask(o)}else if(!0===t.current[b])return w.apply(e,n)}}))}function S(e){var n=e.data,o=n.target;o[i]=!1,o[s]=!1;var c=o[a];h||(h=o[l],p=o[f]),c&&p.call(o,y,c);var u=o[a]=function(){if(o.readyState===o.DONE)if(!n.aborted&&o[i]&&e.state===k){var r=o[t.__symbol__("loadfalse")];if(0!==o.status&&r&&r.length>0){var a=e.invoke;e.invoke=function(){for(var r=o[t.__symbol__("loadfalse")],i=0;i<r.length;i++)r[i]===e&&r.splice(i,1);n.aborted||e.state!==k||a.call(e)},r.push(e)}else e.invoke()}else n.aborted||!1!==o[i]||(o[s]=!0)};return h.call(o,y,u),o[r]||(o[r]=e),E.apply(o,n.args),o[i]=!0,e}function P(){}function O(e){var t=e.data;return t.aborted=!0,w.apply(t.target,t.args)}}(e);var r=g("xhrTask"),o=g("xhrSync"),a=g("xhrListener"),i=g("xhrScheduled"),c=g("xhrURL"),s=g("xhrErrorBeforeScheduled")})),e.__load_patch("geolocation",(function(e){e.navigator&&e.navigator.geolocation&&function t(e,n){for(var o=e.constructor.name,a=function(t){var a=n[t],i=e[a];if(i){if(!T(r(e,a)))return"continue";e[a]=function(e){var t=function(){return e.apply(this,b(arguments,o+"."+a))};return L(t,e),t}(i)}},i=0;i<n.length;i++)a(i)}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])})),e.__load_patch("PromiseRejectionEvent",(function(e,t){function n(t){return function(n){K(e,t).forEach((function(r){var o=e.PromiseRejectionEvent;if(o){var a=new o(t,{promise:n.promise,reason:n.rejection});r.invoke(a)}}))}}e.PromiseRejectionEvent&&(t[g("unhandledPromiseRejectionHandler")]=n("unhandledrejection"),t[g("rejectionHandledHandler")]=n("rejectionhandled"))})),e.__load_patch("queueMicrotask",(function(e,t,n){Q(e,n)}))}(le),function ve(e){(function t(e){e.__load_patch("node_util",(function(e,t,n){n.patchOnProperties=C,n.patchMethod=M,n.bindArguments=b,n.patchMacroTask=N,function r(e){R=e}(!0)}))})(e),function n(e){e.__load_patch("EventEmitter",(function(e,t,n){var r,o="addListener",a="removeListener",i=function(e,t){return e.callback===t||e.callback.listener===t},c=function(e){return"string"==typeof e?e:e?e.toString().replace("(","_").replace(")","_"):""};try{r=require("events")}catch(e){}r&&r.EventEmitter&&function s(t){var r=J(e,n,[t],{useG:!1,add:o,rm:a,prepend:"prependListener",rmAll:"removeAllListeners",listeners:"listeners",chkDup:!1,rt:!0,diff:i,eventNameToString:c});r&&r[0]&&(t.on=t[o],t.off=t[a])}(r.EventEmitter.prototype)}))}(e),function r(e){e.__load_patch("fs",(function(e,t,n){var r,o;try{o=require("fs")}catch(e){}if(o){["access","appendFile","chmod","chown","close","exists","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchmod","lchown","lutimes","link","lstat","mkdir","mkdtemp","open","opendir","read","readdir","readFile","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","write","writeFile","writev"].filter((function(e){return!!o[e]&&"function"==typeof o[e]})).forEach((function(e){N(o,e,(function(t,n){return{name:"fs."+e,args:n,cbIdx:n.length>0?n.length-1:-1,target:t}}))}));var a=null===(r=o.realpath)||void 0===r?void 0:r[n.symbol("OriginalDelegate")];(null==a?void 0:a.native)&&(o.realpath.native=a.native,N(o.realpath,"native",(function(e,t){return{args:t,target:e,cbIdx:t.length>0?t.length-1:-1,name:"fs.realpath.native"}})))}}))}(e),e.__load_patch("node_timers",(function(e,t){var n=!1;try{var r=require("timers");if(e.setTimeout!==r.setTimeout&&!P){var o=r.setTimeout;r.setTimeout=function(){return n=!0,o.apply(this,arguments)};var a=e.setTimeout((function(){}),100);clearTimeout(a),r.setTimeout=o}te(r,se,ue,"Timeout"),te(r,se,ue,"Interval"),te(r,se,ue,"Immediate")}catch(e){}P||(n?(e[t.__symbol__("setTimeout")]=e.setTimeout,e[t.__symbol__("setInterval")]=e.setInterval,e[t.__symbol__("setImmediate")]=e.setImmediate):(te(e,se,ue,"Timeout"),te(e,se,ue,"Interval"),te(e,se,ue,"Immediate")))})),e.__load_patch("nextTick",(function(){A(process,"nextTick",(function(e,t){return{name:"process.nextTick",args:t,cbIdx:t.length>0&&"function"==typeof t[0]?0:-1,target:process}}))})),e.__load_patch("handleUnhandledPromiseRejection",(function(e,t,n){function r(e){return function(t){K(process,e).forEach((function(n){"unhandledRejection"===e?n.invoke(t.rejection,t.promise):"rejectionHandled"===e&&n.invoke(t.promise)}))}}t[n.symbol("unhandledPromiseRejectionHandler")]=r("unhandledRejection"),t[n.symbol("rejectionHandledHandler")]=r("rejectionHandled")})),e.__load_patch("crypto",(function(){var e;try{e=require("crypto")}catch(e){}e&&["randomBytes","pbkdf2"].forEach((function(t){N(e,t,(function(n,r){return{name:"crypto."+t,args:r,cbIdx:r.length>0&&"function"==typeof r[r.length-1]?r.length-1:-1,target:e}}))}))})),e.__load_patch("console",(function(e,t){["dir","log","info","error","warn","assert","debug","timeEnd","trace"].forEach((function(e){var n=console[t.__symbol__(e)]=console[e];n&&(console[e]=function(){var e=c.call(arguments);return t.current===t.root?n.apply(this,e):t.root.run(n,this,e)})}))})),e.__load_patch("queueMicrotask",(function(e,t,n){Q(e,n)}))}(le)}));,W0Jx   'use strict';
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    var global = globalThis;
    // __Zone_symbol_prefix global can be used to override the default zone
    // symbol prefix with a custom one if needed.
    function __symbol__(name) {
        var symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';
        return symbolPrefix + name;
    }
    function initZone() {
        var performance = global['performance'];
        function mark(name) {
            performance && performance['mark'] && performance['mark'](name);
        }
        function performanceMeasure(name, label) {
            performance && performance['measure'] && performance['measure'](name, label);
        }
        mark('Zone');
        var ZoneImpl = /** @class */ (function () {
            function ZoneImpl(parent, zoneSpec) {
                this._parent = parent;
                this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '<root>';
                this._properties = (zoneSpec && zoneSpec.properties) || {};
                this._zoneDelegate = new _ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
            }
            ZoneImpl.assertZonePatched = function () {
                if (global['Promise'] !== patches['ZoneAwarePromise']) {
                    throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
                        'has been overwritten.\n' +
                        'Most likely cause is that a Promise polyfill has been loaded ' +
                        'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
                        'If you must load one, do so before loading zone.js.)');
                }
            };
            Object.defineProperty(ZoneImpl, "root", {
                get: function () {
                    var zone = ZoneImpl.current;
                    while (zone.parent) {
                        zone = zone.parent;
                    }
                    return zone;
                },
                enumerable: false,
                configurable: true
            });
            Object.defineProperty(ZoneImpl, "current", {
                get: function () {
                    return _currentZoneFrame.zone;
                },
                enumerable: false,
                configurable: true
            });
            Object.defineProperty(ZoneImpl, "currentTask", {
                get: function () {
                    return _currentTask;
                },
                enumerable: false,
                configurable: true
            });
            ZoneImpl.__load_patch = function (name, fn, ignoreDuplicate) {
                if (ignoreDuplicate === void 0) { ignoreDuplicate = false; }
                if (patches.hasOwnProperty(name)) {
                    // `checkDuplicate` option is defined from global variable
                    // so it works for all modules.
                    // `ignoreDuplicate` can work for the specified module
                    var checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
                    if (!ignoreDuplicate && checkDuplicate) {
                        throw Error('Already loaded patch: ' + name);
                    }
                }
                else if (!global['__Zone_disable_' + name]) {
                    var perfName = 'Zone:' + name;
                    mark(perfName);
                    patches[name] = fn(global, ZoneImpl, _api);
                    performanceMeasure(perfName, perfName);
                }
            };
            Object.defineProperty(ZoneImpl.prototype, "parent", {
                get: function () {
                    return this._parent;
                },
                enumerable: false,
                configurable: true
            });
            Object.defineProperty(ZoneImpl.prototype, "name", {
                get: function () {
                    return this._name;
                },
                enumerable: false,
                configurable: true
            });
            ZoneImpl.prototype.get = function (key) {
                var zone = this.getZoneWith(key);
                if (zone)
                    return zone._properties[key];
            };
            ZoneImpl.prototype.getZoneWith = function (key) {
                var current = this;
                while (current) {
                    if (current._properties.hasOwnProperty(key)) {
                        return current;
                    }
                    current = current._parent;
                }
                return null;
            };
            ZoneImpl.prototype.fork = function (zoneSpec) {
                if (!zoneSpec)
                    throw new Error('ZoneSpec required!');
                return this._zoneDelegate.fork(this, zoneSpec);
            };
            ZoneImpl.prototype.wrap = function (callback, source) {
                if (typeof callback !== 'function') {
                    throw new Error('Expecting function got: ' + callback);
                }
                var _callback = this._zoneDelegate.intercept(this, callback, source);
                var zone = this;
                return function () {
                    return zone.runGuarded(_callback, this, arguments, source);
                };
            };
            ZoneImpl.prototype.run = function (callback, applyThis, applyArgs, source) {
                _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
                try {
                    return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
                }
                finally {
                    _currentZoneFrame = _currentZoneFrame.parent;
                }
            };
            ZoneImpl.prototype.runGuarded = function (callback, applyThis, applyArgs, source) {
                if (applyThis === void 0) { applyThis = null; }
                _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
                try {
                    try {
                        return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
                    }
                    catch (error) {
                        if (this._zoneDelegate.handleError(this, error)) {
                            throw error;
                        }
                    }
                }
                finally {
                    _currentZoneFrame = _currentZoneFrame.parent;
                }
            };
            ZoneImpl.prototype.runTask = function (task, applyThis, applyArgs) {
                if (task.zone != this) {
                    throw new Error('A task can only be run in the zone of creation! (Creation: ' +
                        (task.zone || NO_ZONE).name +
                        '; Execution: ' +
                        this.name +
                        ')');
                }
                var zoneTask = task;
                // https://github.com/angular/zone.js/issues/778, sometimes eventTask
                // will run in notScheduled(canceled) state, we should not try to
                // run such kind of task but just return
                var type = task.type, _a = task.data, _b = _a === void 0 ? {} : _a, _c = _b.isPeriodic, isPeriodic = _c === void 0 ? false : _c, _d = _b.isRefreshable, isRefreshable = _d === void 0 ? false : _d;
                if (task.state === notScheduled && (type === eventTask || type === macroTask)) {
                    return;
                }
                var reEntryGuard = task.state != running;
                reEntryGuard && zoneTask._transitionTo(running, scheduled);
                var previousTask = _currentTask;
                _currentTask = zoneTask;
                _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
                try {
                    if (type == macroTask && task.data && !isPeriodic && !isRefreshable) {
                        task.cancelFn = undefined;
                    }
                    try {
                        return this._zoneDelegate.invokeTask(this, zoneTask, applyThis, applyArgs);
                    }
                    catch (error) {
                        if (this._zoneDelegate.handleError(this, error)) {
                            throw error;
                        }
                    }
                }
                finally {
                    // if the task's state is notScheduled or unknown, then it has already been cancelled
                    // we should not reset the state to scheduled
                    var state = task.state;
                    if (state !== notScheduled && state !== unknown) {
                        if (type == eventTask || isPeriodic || (isRefreshable && state === scheduling)) {
                            reEntryGuard && zoneTask._transitionTo(scheduled, running, scheduling);
                        }
                        else {
                            var zoneDelegates = zoneTask._zoneDelegates;
                            this._updateTaskCount(zoneTask, -1);
                            reEntryGuard && zoneTask._transitionTo(notScheduled, running, notScheduled);
                            if (isRefreshable) {
                                zoneTask._zoneDelegates = zoneDelegates;
                            }
                        }
                    }
                    _currentZoneFrame = _currentZoneFrame.parent;
                    _currentTask = previousTask;
                }
            };
            ZoneImpl.prototype.scheduleTask = function (task) {
                if (task.zone && task.zone !== this) {
                    // check if the task was rescheduled, the newZone
                    // should not be the children of the original zone
                    var newZone = this;
                    while (newZone) {
                        if (newZone === task.zone) {
                            throw Error("can not reschedule task to ".concat(this.name, " which is descendants of the original zone ").concat(task.zone.name));
                        }
                        newZone = newZone.parent;
                    }
                }
                task._transitionTo(scheduling, notScheduled);
                var zoneDelegates = [];
                task._zoneDelegates = zoneDelegates;
                task._zone = this;
                try {
                    task = this._zoneDelegate.scheduleTask(this, task);
                }
                catch (err) {
                    // should set task's state to unknown when scheduleTask throw error
                    // because the err may from reschedule, so the fromState maybe notScheduled
                    task._transitionTo(unknown, scheduling, notScheduled);
                    // TODO: @JiaLiPassion, should we check the result from handleError?
                    this._zoneDelegate.handleError(this, err);
                    throw err;
                }
                if (task._zoneDelegates === zoneDelegates) {
                    // we have to check because internally the delegate can reschedule the task.
                    this._updateTaskCount(task, 1);
                }
                if (task.state == scheduling) {
                    task._transitionTo(scheduled, scheduling);
                }
                return task;
            };
            ZoneImpl.prototype.scheduleMicroTask = function (source, callback, data, customSchedule) {
                return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
            };
            ZoneImpl.prototype.scheduleMacroTask = function (source, callback, data, customSchedule, customCancel) {
                return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
            };
            ZoneImpl.prototype.scheduleEventTask = function (source, callback, data, customSchedule, customCancel) {
                return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
            };
            ZoneImpl.prototype.cancelTask = function (task) {
                if (task.zone != this)
                    throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
                        (task.zone || NO_ZONE).name +
                        '; Execution: ' +
                        this.name +
                        ')');
                if (task.state !== scheduled && task.state !== running) {
                    return;
                }
                task._transitionTo(canceling, scheduled, running);
                try {
                    this._zoneDelegate.cancelTask(this, task);
                }
                catch (err) {
                    // if error occurs when cancelTask, transit the state to unknown
                    task._transitionTo(unknown, canceling);
                    this._zoneDelegate.handleError(this, err);
                    throw err;
                }
                this._updateTaskCount(task, -1);
                task._transitionTo(notScheduled, canceling);
                task.runCount = -1;
                return task;
            };
            ZoneImpl.prototype._updateTaskCount = function (task, count) {
                var zoneDelegates = task._zoneDelegates;
                if (count == -1) {
                    task._zoneDelegates = null;
                }
                for (var i = 0; i < zoneDelegates.length; i++) {
                    zoneDelegates[i]._updateTaskCount(task.type, count);
                }
            };
            ZoneImpl.__symbol__ = __symbol__;
            return ZoneImpl;
        }());
        var DELEGATE_ZS = {
            name: '',
            onHasTask: function (delegate, _, target, hasTaskState) { return delegate.hasTask(target, hasTaskState); },
            onScheduleTask: function (delegate, _, target, task) { return delegate.scheduleTask(target, task); },
            onInvokeTask: function (delegate, _, target, task, applyThis, applyArgs) { return delegate.invokeTask(target, task, applyThis, applyArgs); },
            onCancelTask: function (delegate, _, target, task) { return delegate.cancelTask(target, task); },
        };
        var _ZoneDelegate = /** @class */ (function () {
            function _ZoneDelegate(zone, parentDelegate, zoneSpec) {
                this._taskCounts = {
                    'microTask': 0,
                    'macroTask': 0,
                    'eventTask': 0,
                };
                this._zone = zone;
                this._parentDelegate = parentDelegate;
                this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
                this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
                this._forkCurrZone =
                    zoneSpec && (zoneSpec.onFork ? this._zone : parentDelegate._forkCurrZone);
                this._interceptZS =
                    zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
                this._interceptDlgt =
                    zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
                this._interceptCurrZone =
                    zoneSpec && (zoneSpec.onIntercept ? this._zone : parentDelegate._interceptCurrZone);
                this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
                this._invokeDlgt =
                    zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
                this._invokeCurrZone =
                    zoneSpec && (zoneSpec.onInvoke ? this._zone : parentDelegate._invokeCurrZone);
                this._handleErrorZS =
                    zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
                this._handleErrorDlgt =
                    zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
                this._handleErrorCurrZone =
                    zoneSpec && (zoneSpec.onHandleError ? this._zone : parentDelegate._handleErrorCurrZone);
                this._scheduleTaskZS =
                    zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
                this._scheduleTaskDlgt =
                    zoneSpec && (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
                this._scheduleTaskCurrZone =
                    zoneSpec && (zoneSpec.onScheduleTask ? this._zone : parentDelegate._scheduleTaskCurrZone);
                this._invokeTaskZS =
                    zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
                this._invokeTaskDlgt =
                    zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
                this._invokeTaskCurrZone =
                    zoneSpec && (zoneSpec.onInvokeTask ? this._zone : parentDelegate._invokeTaskCurrZone);
                this._cancelTaskZS =
                    zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
                this._cancelTaskDlgt =
                    zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
                this._cancelTaskCurrZone =
                    zoneSpec && (zoneSpec.onCancelTask ? this._zone : parentDelegate._cancelTaskCurrZone);
                this._hasTaskZS = null;
                this._hasTaskDlgt = null;
                this._hasTaskDlgtOwner = null;
                this._hasTaskCurrZone = null;
                var zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
                var parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
                if (zoneSpecHasTask || parentHasTask) {
                    // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
                    // a case all task related interceptors must go through this ZD. We can't short circuit it.
                    this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
                    this._hasTaskDlgt = parentDelegate;
                    this._hasTaskDlgtOwner = this;
                    this._hasTaskCurrZone = this._zone;
                    if (!zoneSpec.onScheduleTask) {
                        this._scheduleTaskZS = DELEGATE_ZS;
                        this._scheduleTaskDlgt = parentDelegate;
                        this._scheduleTaskCurrZone = this._zone;
                    }
                    if (!zoneSpec.onInvokeTask) {
                        this._invokeTaskZS = DELEGATE_ZS;
                        this._invokeTaskDlgt = parentDelegate;
                        this._invokeTaskCurrZone = this._zone;
                    }
                    if (!zoneSpec.onCancelTask) {
                        this._cancelTaskZS = DELEGATE_ZS;
                        this._cancelTaskDlgt = parentDelegate;
                        this._cancelTaskCurrZone = this._zone;
                    }
                }
            }
            Object.defineProperty(_ZoneDelegate.prototype, "zone", {
                get: function () {
                    return this._zone;
                },
                enumerable: false,
                configurable: true
            });
            _ZoneDelegate.prototype.fork = function (targetZone, zoneSpec) {
                return this._forkZS
                    ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec)
                    : new ZoneImpl(targetZone, zoneSpec);
            };
            _ZoneDelegate.prototype.intercept = function (targetZone, callback, source) {
                return this._interceptZS
                    ? this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source)
                    : callback;
            };
            _ZoneDelegate.prototype.invoke = function (targetZone, callback, applyThis, applyArgs, source) {
                return this._invokeZS
                    ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source)
                    : callback.apply(applyThis, applyArgs);
            };
            _ZoneDelegate.prototype.handleError = function (targetZone, error) {
                return this._handleErrorZS
                    ? this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error)
                    : true;
            };
            _ZoneDelegate.prototype.scheduleTask = function (targetZone, task) {
                var returnTask = task;
                if (this._scheduleTaskZS) {
                    if (this._hasTaskZS) {
                        returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
                    }
                    returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
                    if (!returnTask)
                        returnTask = task;
                }
                else {
                    if (task.scheduleFn) {
                        task.scheduleFn(task);
                    }
                    else if (task.type == microTask) {
                        scheduleMicroTask(task);
                    }
                    else {
                        throw new Error('Task is missing scheduleFn.');
                    }
                }
                return returnTask;
            };
            _ZoneDelegate.prototype.invokeTask = function (targetZone, task, applyThis, applyArgs) {
                return this._invokeTaskZS
                    ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs)
                    : task.callback.apply(applyThis, applyArgs);
            };
            _ZoneDelegate.prototype.cancelTask = function (targetZone, task) {
                var value;
                if (this._cancelTaskZS) {
                    value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
                }
                else {
                    if (!task.cancelFn) {
                        throw Error('Task is not cancelable');
                    }
                    value = task.cancelFn(task);
                }
                return value;
            };
            _ZoneDelegate.prototype.hasTask = function (targetZone, isEmpty) {
                // hasTask should not throw error so other ZoneDelegate
                // can still trigger hasTask callback
                try {
                    this._hasTaskZS &&
                        this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
                }
                catch (err) {
                    this.handleError(targetZone, err);
                }
            };
            _ZoneDelegate.prototype._updateTaskCount = function (type, count) {
                var counts = this._taskCounts;
                var prev = counts[type];
                var next = (counts[type] = prev + count);
                if (next < 0) {
                    throw new Error('More tasks executed then were scheduled.');
                }
                if (prev == 0 || next == 0) {
                    var isEmpty = {
                        microTask: counts['microTask'] > 0,
                        macroTask: counts['macroTask'] > 0,
                        eventTask: counts['eventTask'] > 0,
                        change: type,
                    };
                    this.hasTask(this._zone, isEmpty);
                }
            };
            return _ZoneDelegate;
        }());
        var ZoneTask = /** @class */ (function () {
            function ZoneTask(type, source, callback, options, scheduleFn, cancelFn) {
                this._zone = null;
                this.runCount = 0;
                this._zoneDelegates = null;
                this._state = 'notScheduled';
                this.type = type;
                this.source = source;
                this.data = options;
                this.scheduleFn = scheduleFn;
                this.cancelFn = cancelFn;
                if (!callback) {
                    throw new Error('callback is not defined');
                }
                this.callback = callback;
                var self = this;
                // TODO: @JiaLiPassion options should have interface
                if (type === eventTask && options && options.useG) {
                    this.invoke = ZoneTask.invokeTask;
                }
                else {
                    this.invoke = function () {
                        return ZoneTask.invokeTask.call(global, self, this, arguments);
                    };
                }
            }
            ZoneTask.invokeTask = function (task, target, args) {
                if (!task) {
                    task = this;
                }
                _numberOfNestedTaskFrames++;
                try {
                    task.runCount++;
                    return task.zone.runTask(task, target, args);
                }
                finally {
                    if (_numberOfNestedTaskFrames == 1) {
                        drainMicroTaskQueue();
                    }
                    _numberOfNestedTaskFrames--;
                }
            };
            Object.defineProperty(ZoneTask.prototype, "zone", {
                get: function () {
                    return this._zone;
                },
                enumerable: false,
                configurable: true
            });
            Object.defineProperty(ZoneTask.prototype, "state", {
                get: function () {
                    return this._state;
                },
                enumerable: false,
                configurable: true
            });
            ZoneTask.prototype.cancelScheduleRequest = function () {
                this._transitionTo(notScheduled, scheduling);
            };
            ZoneTask.prototype._transitionTo = function (toState, fromState1, fromState2) {
                if (this._state === fromState1 || this._state === fromState2) {
                    this._state = toState;
                    if (toState == notScheduled) {
                        this._zoneDelegates = null;
                    }
                }
                else {
                    throw new Error("".concat(this.type, " '").concat(this.source, "': can not transition to '").concat(toState, "', expecting state '").concat(fromState1, "'").concat(fromState2 ? " or '" + fromState2 + "'" : '', ", was '").concat(this._state, "'."));
                }
            };
            ZoneTask.prototype.toString = function () {
                if (this.data && typeof this.data.handleId !== 'undefined') {
                    return this.data.handleId.toString();
                }
                else {
                    return Object.prototype.toString.call(this);
                }
            };
            // add toJSON method to prevent cyclic error when
            // call JSON.stringify(zoneTask)
            ZoneTask.prototype.toJSON = function () {
                return {
                    type: this.type,
                    state: this.state,
                    source: this.source,
                    zone: this.zone.name,
                    runCount: this.runCount,
                };
            };
            return ZoneTask;
        }());
        //////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        ///  MICROTASK QUEUE
        //////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        var symbolSetTimeout = __symbol__('setTimeout');
        var symbolPromise = __symbol__('Promise');
        var symbolThen = __symbol__('then');
        var _microTaskQueue = [];
        var _isDrainingMicrotaskQueue = false;
        var nativeMicroTaskQueuePromise;
        function nativeScheduleMicroTask(func) {
            if (!nativeMicroTaskQueuePromise) {
                if (global[symbolPromise]) {
                    nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
                }
            }
            if (nativeMicroTaskQueuePromise) {
                var nativeThen = nativeMicroTaskQueuePromise[symbolThen];
                if (!nativeThen) {
                    // native Promise is not patchable, we need to use `then` directly
                    // issue 1078
                    nativeThen = nativeMicroTaskQueuePromise['then'];
                }
                nativeThen.call(nativeMicroTaskQueuePromise, func);
            }
            else {
                global[symbolSetTimeout](func, 0);
            }
        }
        function scheduleMicroTask(task) {
            // if we are not running in any task, and there has not been anything scheduled
            // we must bootstrap the initial task creation by manually scheduling the drain
            if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
                // We are not running in Task, so we need to kickstart the microtask queue.
                nativeScheduleMicroTask(drainMicroTaskQueue);
            }
            task && _microTaskQueue.push(task);
        }
        function drainMicroTaskQueue() {
            if (!_isDrainingMicrotaskQueue) {
                _isDrainingMicrotaskQueue = true;
                while (_microTaskQueue.length) {
                    var queue = _microTaskQueue;
                    _microTaskQueue = [];
                    for (var i = 0; i < queue.length; i++) {
                        var task = queue[i];
                        try {
                            task.zone.runTask(task, null, null);
                        }
                        catch (error) {
                            _api.onUnhandledError(error);
                        }
                    }
                }
                _api.microtaskDrainDone();
                _isDrainingMicrotaskQueue = false;
            }
        }
        //////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        ///  BOOTSTRAP
        //////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        var NO_ZONE = { name: 'NO ZONE' };
        var notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
        var microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
        var patches = {};
        var _api = {
            symbol: __symbol__,
            currentZoneFrame: function () { return _currentZoneFrame; },
            onUnhandledError: noop,
            microtaskDrainDone: noop,
            scheduleMicroTask: scheduleMicroTask,
            showUncaughtError: function () { return !ZoneImpl[__symbol__('ignoreConsoleErrorUncaughtError')]; },
            patchEventTarget: function () { return []; },
            patchOnProperties: noop,
            patchMethod: function () { return noop; },
            bindArguments: function () { return []; },
            patchThen: function () { return noop; },
            patchMacroTask: function () { return noop; },
            patchEventPrototype: function () { return noop; },
            isIEOrEdge: function () { return false; },
            getGlobalObjects: function () { return undefined; },
            ObjectDefineProperty: function () { return noop; },
            ObjectGetOwnPropertyDescriptor: function () { return undefined; },
            ObjectCreate: function () { return undefined; },
            ArraySlice: function () { return []; },
            patchClass: function () { return noop; },
            wrapWithCurrentZone: function () { return noop; },
            filterProperties: function () { return []; },
            attachOriginToPatched: function () { return noop; },
            _redefineProperty: function () { return noop; },
            patchCallbacks: function () { return noop; },
            nativeScheduleMicroTask: nativeScheduleMicroTask,
        };
        var _currentZoneFrame = { parent: null, zone: new ZoneImpl(null, null) };
        var _currentTask = null;
        var _numberOfNestedTaskFrames = 0;
        function noop() { }
        performanceMeasure('Zone', 'Zone');
        return ZoneImpl;
    }
    function loadZone() {
        var _a;
        // if global['Zone'] already exists (maybe zone.js was already loaded or
        // some other lib also registered a global object named Zone), we may need
        // to throw an error, but sometimes user may not want this error.
        // For example,
        // we have two web pages, page1 includes zone.js, page2 doesn't.
        // and the 1st time user load page1 and page2, everything work fine,
        // but when user load page2 again, error occurs because global['Zone'] already exists.
        // so we add a flag to let user choose whether to throw this error or not.
        // By default, if existing Zone is from zone.js, we will not throw the error.
        var global = globalThis;
        var checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
        if (global['Zone'] && (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function')) {
            throw new Error('Zone already loaded.');
        }
        // Initialize global `Zone` constant.
        (_a = global['Zone']) !== null && _a !== void 0 ? _a : (global['Zone'] = initZone());
        return global['Zone'];
    }
    /**
     * Suppress closure compiler errors about unknown 'Zone' variable
     * @fileoverview
     * @suppress {undefinedVars,globalThis,missingRequire}
     */
    /// <reference types="node"/>
    // issue #989, to reduce bundle size, use short name
    /** Object.getOwnPropertyDescriptor */
    var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
    /** Object.defineProperty */
    var ObjectDefineProperty = Object.defineProperty;
    /** Object.getPrototypeOf */
    var ObjectGetPrototypeOf = Object.getPrototypeOf;
    /** Object.create */
    var ObjectCreate = Object.create;
    /** Array.prototype.slice */
    var ArraySlice = Array.prototype.slice;
    /** addEventListener string const */
    var ADD_EVENT_LISTENER_STR = 'addEventListener';
    /** removeEventListener string const */
    var REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
    /** zoneSymbol addEventListener */
    var ZONE_SYMBOL_ADD_EVENT_LISTENER = __symbol__(ADD_EVENT_LISTENER_STR);
    /** zoneSymbol removeEventListener */
    var ZONE_SYMBOL_REMOVE_EVENT_LISTENER = __symbol__(REMOVE_EVENT_LISTENER_STR);
    /** true string const */
    var TRUE_STR = 'true';
    /** false string const */
    var FALSE_STR = 'false';
    /** Zone symbol prefix string const. */
    var ZONE_SYMBOL_PREFIX = __symbol__('');
    function wrapWithCurrentZone(callback, source) {
        return Zone.current.wrap(callback, source);
    }
    function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
        return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
    }
    var zoneSymbol = __symbol__;
    var isWindowExists = typeof window !== 'undefined';
    var internalWindow = isWindowExists ? window : undefined;
    var _global = (isWindowExists && internalWindow) || globalThis;
    var REMOVE_ATTRIBUTE = 'removeAttribute';
    function bindArguments(args, source) {
        for (var i = args.length - 1; i >= 0; i--) {
            if (typeof args[i] === 'function') {
                args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
            }
        }
        return args;
    }
    function patchPrototype(prototype, fnNames) {
        var source = prototype.constructor['name'];
        var _loop_1 = function (i) {
            var name_1 = fnNames[i];
            var delegate = prototype[name_1];
            if (delegate) {
                var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name_1);
                if (!isPropertyWritable(prototypeDesc)) {
                    return "continue";
                }
                prototype[name_1] = (function (delegate) {
                    var patched = function () {
                        return delegate.apply(this, bindArguments(arguments, source + '.' + name_1));
                    };
                    attachOriginToPatched(patched, delegate);
                    return patched;
                })(delegate);
            }
        };
        for (var i = 0; i < fnNames.length; i++) {
            _loop_1(i);
        }
    }
    function isPropertyWritable(propertyDesc) {
        if (!propertyDesc) {
            return true;
        }
        if (propertyDesc.writable === false) {
            return false;
        }
        return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
    }
    var isWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
    // Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
    // this code.
    var isNode = !('nw' in _global) &&
        typeof _global.process !== 'undefined' &&
        _global.process.toString() === '[object process]';
    var isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
    // we are in electron of nw, so we are both browser and nodejs
    // Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
    // this code.
    var isMix = typeof _global.process !== 'undefined' &&
        _global.process.toString() === '[object process]' &&
        !isWebWorker &&
        !!(isWindowExists && internalWindow['HTMLElement']);
    var zoneSymbolEventNames$1 = {};
    var enableBeforeunloadSymbol = zoneSymbol('enable_beforeunload');
    var wrapFn = function (event) {
        // https://github.com/angular/zone.js/issues/911, in IE, sometimes
        // event will be undefined, so we need to use window.event
        event = event || _global.event;
        if (!event) {
            return;
        }
        var eventNameSymbol = zoneSymbolEventNames$1[event.type];
        if (!eventNameSymbol) {
            eventNameSymbol = zoneSymbolEventNames$1[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
        }
        var target = this || event.target || _global;
        var listener = target[eventNameSymbol];
        var result;
        if (isBrowser && target === internalWindow && event.type === 'error') {
            // window.onerror have different signature
            // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
            // and onerror callback will prevent default when callback return true
            var errorEvent = event;
            result =
                listener &&
                    listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
            if (result === true) {
                event.preventDefault();
            }
        }
        else {
            result = listener && listener.apply(this, arguments);
            if (
            // https://github.com/angular/angular/issues/47579
            // https://www.w3.org/TR/2011/WD-html5-20110525/history.html#beforeunloadevent
            // This is the only specific case we should check for. The spec defines that the
            // `returnValue` attribute represents the message to show the user. When the event
            // is created, this attribute must be set to the empty string.
            event.type === 'beforeunload' &&
                // To prevent any breaking changes resulting from this change, given that
                // it was already causing a significant number of failures in G3, we have hidden
                // that behavior behind a global configuration flag. Consumers can enable this
                // flag explicitly if they want the `beforeunload` event to be handled as defined
                // in the specification.
                _global[enableBeforeunloadSymbol] &&
                // The IDL event definition is `attribute DOMString returnValue`, so we check whether
                // `typeof result` is a string.
                typeof result === 'string') {
                event.returnValue = result;
            }
            else if (result != undefined && !result) {
                event.preventDefault();
            }
        }
        return result;
    };
    function patchProperty(obj, prop, prototype) {
        var desc = ObjectGetOwnPropertyDescriptor(obj, prop);
        if (!desc && prototype) {
            // when patch window object, use prototype to check prop exist or not
            var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
            if (prototypeDesc) {
                desc = { enumerable: true, configurable: true };
            }
        }
        // if the descriptor not exists or is not configurable
        // just return
        if (!desc || !desc.configurable) {
            return;
        }
        var onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
        if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
            return;
        }
        // A property descriptor cannot have getter/setter and be writable
        // deleting the writable and value properties avoids this error:
        //
        // TypeError: property descriptors must not specify a value or be writable when a
        // getter or setter has been specified
        delete desc.writable;
        delete desc.value;
        var originalDescGet = desc.get;
        var originalDescSet = desc.set;
        // slice(2) cuz 'onclick' -> 'click', etc
        var eventName = prop.slice(2);
        var eventNameSymbol = zoneSymbolEventNames$1[eventName];
        if (!eventNameSymbol) {
            eventNameSymbol = zoneSymbolEventNames$1[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
        }
        desc.set = function (newValue) {
            // In some versions of Windows, the `this` context may be undefined
            // in on-property callbacks.
            // To handle this edge case, we check if `this` is falsy and
            // fallback to `_global` if needed.
            var target = this;
            if (!target && obj === _global) {
                target = _global;
            }
            if (!target) {
                return;
            }
            var previousValue = target[eventNameSymbol];
            if (typeof previousValue === 'function') {
                target.removeEventListener(eventName, wrapFn);
            }
            // https://github.com/angular/zone.js/issues/978
            // If an inline handler (like `onload`) was defined before zone.js was loaded,
            // call the original descriptor's setter to clean it up.
            originalDescSet === null || originalDescSet === void 0 ? void 0 : originalDescSet.call(target, null);
            target[eventNameSymbol] = newValue;
            if (typeof newValue === 'function') {
                target.addEventListener(eventName, wrapFn, false);
            }
        };
        // The getter would return undefined for unassigned properties but the default value of an
        // unassigned property is null
        desc.get = function () {
            // in some of windows's onproperty callback, this is undefined
            // so we need to check it
            var target = this;
            if (!target && obj === _global) {
                target = _global;
            }
            if (!target) {
                return null;
            }
            var listener = target[eventNameSymbol];
            if (listener) {
                return listener;
            }
            else if (originalDescGet) {
                // result will be null when use inline event attribute,
                // such as <button onclick="func();">OK</button>
                // because the onclick function is internal raw uncompiled handler
                // the onclick will be evaluated when first time event was triggered or
                // the property is accessed, https://github.com/angular/zone.js/issues/525
                // so we should use original native get to retrieve the handler
                var value = originalDescGet.call(this);
                if (value) {
                    desc.set.call(this, value);
                    if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
                        target.removeAttribute(prop);
                    }
                    return value;
                }
            }
            return null;
        };
        ObjectDefineProperty(obj, prop, desc);
        obj[onPropPatchedSymbol] = true;
    }
    function patchOnProperties(obj, properties, prototype) {
        if (properties) {
            for (var i = 0; i < properties.length; i++) {
                patchProperty(obj, 'on' + properties[i], prototype);
            }
        }
        else {
            var onProperties = [];
            for (var prop in obj) {
                if (prop.slice(0, 2) == 'on') {
                    onProperties.push(prop);
                }
            }
            for (var j = 0; j < onProperties.length; j++) {
                patchProperty(obj, onProperties[j], prototype);
            }
        }
    }
    var originalInstanceKey = zoneSymbol('originalInstance');
    // wrap some native API on `window`
    function patchClass(className) {
        var OriginalClass = _global[className];
        if (!OriginalClass)
            return;
        // keep original class in global
        _global[zoneSymbol(className)] = OriginalClass;
        _global[className] = function () {
            var a = bindArguments(arguments, className);
            switch (a.length) {
                case 0:
                    this[originalInstanceKey] = new OriginalClass();
                    break;
                case 1:
                    this[originalInstanceKey] = new OriginalClass(a[0]);
                    break;
                case 2:
                    this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
                    break;
                case 3:
                    this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
                    break;
                case 4:
                    this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
                    break;
                default:
                    throw new Error('Arg list too long.');
            }
        };
        // attach original delegate to patched function
        attachOriginToPatched(_global[className], OriginalClass);
        var instance = new OriginalClass(function () { });
        var prop;
        for (prop in instance) {
            // https://bugs.webkit.org/show_bug.cgi?id=44721
            if (className === 'XMLHttpRequest' && prop === 'responseBlob')
                continue;
            (function (prop) {
                if (typeof instance[prop] === 'function') {
                    _global[className].prototype[prop] = function () {
                        return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
                    };
                }
                else {
                    ObjectDefineProperty(_global[className].prototype, prop, {
                        set: function (fn) {
                            if (typeof fn === 'function') {
                                this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
                                // keep callback in wrapped function so we can
                                // use it in Function.prototype.toString to return
                                // the native one.
                                attachOriginToPatched(this[originalInstanceKey][prop], fn);
                            }
                            else {
                                this[originalInstanceKey][prop] = fn;
                            }
                        },
                        get: function () {
                            return this[originalInstanceKey][prop];
                        },
                    });
                }
            })(prop);
        }
        for (prop in OriginalClass) {
            if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
                _global[className][prop] = OriginalClass[prop];
            }
        }
    }
    function patchMethod(target, name, patchFn) {
        var proto = target;
        while (proto && !proto.hasOwnProperty(name)) {
            proto = ObjectGetPrototypeOf(proto);
        }
        if (!proto && target[name]) {
            // somehow we did not find it, but we can see it. This happens on IE for Window properties.
            proto = target;
        }
        var delegateName = zoneSymbol(name);
        var delegate = null;
        if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
            delegate = proto[delegateName] = proto[name];
            // check whether proto[name] is writable
            // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
            var desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
            if (isPropertyWritable(desc)) {
                var patchDelegate_1 = patchFn(delegate, delegateName, name);
                proto[name] = function () {
                    return patchDelegate_1(this, arguments);
                };
                attachOriginToPatched(proto[name], delegate);
            }
        }
        return delegate;
    }
    // TODO: @JiaLiPassion, support cancel task later if necessary
    function patchMacroTask(obj, funcName, metaCreator) {
        var setNative = null;
        function scheduleTask(task) {
            var data = task.data;
            data.args[data.cbIdx] = function () {
                task.invoke.apply(this, arguments);
            };
            setNative.apply(data.target, data.args);
            return task;
        }
        setNative = patchMethod(obj, funcName, function (delegate) { return function (self, args) {
            var meta = metaCreator(self, args);
            if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
                return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
            }
            else {
                // cause an error by calling it directly.
                return delegate.apply(self, args);
            }
        }; });
    }
    function attachOriginToPatched(patched, original) {
        patched[zoneSymbol('OriginalDelegate')] = original;
    }
    var isDetectedIEOrEdge = false;
    var ieOrEdge = false;
    function isIEOrEdge() {
        if (isDetectedIEOrEdge) {
            return ieOrEdge;
        }
        isDetectedIEOrEdge = true;
        try {
            var ua = internalWindow.navigator.userAgent;
            if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
                ieOrEdge = true;
            }
        }
        catch (error) { }
        return ieOrEdge;
    }
    function isFunction(value) {
        return typeof value === 'function';
    }
    function isNumber(value) {
        return typeof value === 'number';
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    // an identifier to tell ZoneTask do not create a new invoke closure
    var OPTIMIZED_ZONE_EVENT_TASK_DATA = {
        useG: true,
    };
    var zoneSymbolEventNames = {};
    var globalSources = {};
    var EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
    var IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
    function prepareEventNames(eventName, eventNameToString) {
        var falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
        var trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
        var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
        var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
        zoneSymbolEventNames[eventName] = {};
        zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
        zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
    }
    function patchEventTarget(_global, api, apis, patchOptions) {
        var ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
        var REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
        var LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
        var REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
        var zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
        var ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
        var PREPEND_EVENT_LISTENER = 'prependListener';
        var PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
        var invokeTask = function (task, target, event) {
            // for better performance, check isRemoved which is set
            // by removeEventListener
            if (task.isRemoved) {
                return;
            }
            var delegate = task.callback;
            if (typeof delegate === 'object' && delegate.handleEvent) {
                // create the bind version of handleEvent when invoke
                task.callback = function (event) { return delegate.handleEvent(event); };
                task.originalDelegate = delegate;
            }
            // invoke static task.invoke
            // need to try/catch error here, otherwise, the error in one event listener
            // will break the executions of the other event listeners. Also error will
            // not remove the event listener when `once` options is true.
            var error;
            try {
                task.invoke(task, target, [event]);
            }
            catch (err) {
                error = err;
            }
            var options = task.options;
            if (options && typeof options === 'object' && options.once) {
                // if options.once is true, after invoke once remove listener here
                // only browser need to do this, nodejs eventEmitter will cal removeListener
                // inside EventEmitter.once
                var delegate_1 = task.originalDelegate ? task.originalDelegate : task.callback;
                target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate_1, options);
            }
            return error;
        };
        function globalCallback(context, event, isCapture) {
            // https://github.com/angular/zone.js/issues/911, in IE, sometimes
            // event will be undefined, so we need to use window.event
            event = event || _global.event;
            if (!event) {
                return;
            }
            // event.target is needed for Samsung TV and SourceBuffer
            // || global is needed https://github.com/angular/zone.js/issues/190
            var target = context || event.target || _global;
            var tasks = target[zoneSymbolEventNames[event.type][isCapture ? TRUE_STR : FALSE_STR]];
            if (tasks) {
                var errors = [];
                // invoke all tasks which attached to current target with given event.type and capture = false
                // for performance concern, if task.length === 1, just invoke
                if (tasks.length === 1) {
                    var err = invokeTask(tasks[0], target, event);
                    err && errors.push(err);
                }
                else {
                    // https://github.com/angular/zone.js/issues/836
                    // copy the tasks array before invoke, to avoid
                    // the callback will remove itself or other listener
                    var copyTasks = tasks.slice();
                    for (var i = 0; i < copyTasks.length; i++) {
                        if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
                            break;
                        }
                        var err = invokeTask(copyTasks[i], target, event);
                        err && errors.push(err);
                    }
                }
                // Since there is only one error, we don't need to schedule microTask
                // to throw the error.
                if (errors.length === 1) {
                    throw errors[0];
                }
                else {
                    var _loop_2 = function (i) {
                        var err = errors[i];
                        api.nativeScheduleMicroTask(function () {
                            throw err;
                        });
                    };
                    for (var i = 0; i < errors.length; i++) {
                        _loop_2(i);
                    }
                }
            }
        }
        // global shared zoneAwareCallback to handle all event callback with capture = false
        var globalZoneAwareCallback = function (event) {
            return globalCallback(this, event, false);
        };
        // global shared zoneAwareCallback to handle all event callback with capture = true
        var globalZoneAwareCaptureCallback = function (event) {
            return globalCallback(this, event, true);
        };
        function patchEventTargetMethods(obj, patchOptions) {
            if (!obj) {
                return false;
            }
            var useGlobalCallback = true;
            if (patchOptions && patchOptions.useG !== undefined) {
                useGlobalCallback = patchOptions.useG;
            }
            var validateHandler = patchOptions && patchOptions.vh;
            var checkDuplicate = true;
            if (patchOptions && patchOptions.chkDup !== undefined) {
                checkDuplicate = patchOptions.chkDup;
            }
            var returnTarget = false;
            if (patchOptions && patchOptions.rt !== undefined) {
                returnTarget = patchOptions.rt;
            }
            var proto = obj;
            while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
                proto = ObjectGetPrototypeOf(proto);
            }
            if (!proto && obj[ADD_EVENT_LISTENER]) {
                // somehow we did not find it, but we can see it. This happens on IE for Window properties.
                proto = obj;
            }
            if (!proto) {
                return false;
            }
            if (proto[zoneSymbolAddEventListener]) {
                return false;
            }
            var eventNameToString = patchOptions && patchOptions.eventNameToString;
            // We use a shared global `taskData` to pass data for `scheduleEventTask`,
            // eliminating the need to create a new object solely for passing data.
            // WARNING: This object has a static lifetime, meaning it is not created
            // each time `addEventListener` is called. It is instantiated only once
            // and captured by reference inside the `addEventListener` and
            // `removeEventListener` functions. Do not add any new properties to this
            // object, as doing so would necessitate maintaining the information
            // between `addEventListener` calls.
            var taskData = {};
            var nativeAddEventListener = (proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER]);
            var nativeRemoveEventListener = (proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
                proto[REMOVE_EVENT_LISTENER]);
            var nativeListeners = (proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
                proto[LISTENERS_EVENT_LISTENER]);
            var nativeRemoveAllListeners = (proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
                proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER]);
            var nativePrependEventListener;
            if (patchOptions && patchOptions.prepend) {
                nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
                    proto[patchOptions.prepend];
            }
            /**
             * This util function will build an option object with passive option
             * to handle all possible input from the user.
             */
            function buildEventListenerOptions(options, passive) {
                if (!passive) {
                    return options;
                }
                if (typeof options === 'boolean') {
                    return { capture: options, passive: true };
                }
                if (!options) {
                    return { passive: true };
                }
                if (typeof options === 'object' && options.passive !== false) {
                    return __assign(__assign({}, options), { passive: true });
                }
                return options;
            }
            var customScheduleGlobal = function (task) {
                // if there is already a task for the eventName + capture,
                // just return, because we use the shared globalZoneAwareCallback here.
                if (taskData.isExisting) {
                    return;
                }
                return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
            };
            /**
             * In the context of events and listeners, this function will be
             * called at the end by `cancelTask`, which, in turn, calls `task.cancelFn`.
             * Cancelling a task is primarily used to remove event listeners from
             * the task target.
             */
            var customCancelGlobal = function (task) {
                // if task is not marked as isRemoved, this call is directly
                // from Zone.prototype.cancelTask, we should remove the task
                // from tasksList of target first
                if (!task.isRemoved) {
                    var symbolEventNames = zoneSymbolEventNames[task.eventName];
                    var symbolEventName = void 0;
                    if (symbolEventNames) {
                        symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
                    }
                    var existingTasks = symbolEventName && task.target[symbolEventName];
                    if (existingTasks) {
                        for (var i = 0; i < existingTasks.length; i++) {
                            var existingTask = existingTasks[i];
                            if (existingTask === task) {
                                existingTasks.splice(i, 1);
                                // set isRemoved to data for faster invokeTask check
                                task.isRemoved = true;
                                if (task.removeAbortListener) {
                                    task.removeAbortListener();
                                    task.removeAbortListener = null;
                                }
                                if (existingTasks.length === 0) {
                                    // all tasks for the eventName + capture have gone,
                                    // remove globalZoneAwareCallback and remove the task cache from target
                                    task.allRemoved = true;
                                    task.target[symbolEventName] = null;
                                }
                                break;
                            }
                        }
                    }
                }
                // if all tasks for the eventName + capture have gone,
                // we will really remove the global event callback,
                // if not, return
                if (!task.allRemoved) {
                    return;
                }
                   return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
            };
            var customScheduleNonGlobal = function (task) {
                return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
            };
            var customSchedulePrepend = function (task) {
                return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
            };
            var customCancelNonGlobal = function (task) {
                return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
            };
            var customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
            var customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
            var compareTaskCallbackVsDelegate = function (task, delegate) {
                var typeOfDelegate = typeof delegate;
                return ((typeOfDelegate === 'function' && task.callback === delegate) ||
                    (typeOfDelegate === 'object' && task.originalDelegate === delegate));
            };
            var compare = (patchOptions === null || patchOptions === void 0 ? void 0 : patchOptions.diff) || compareTaskCallbackVsDelegate;
            var unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];
            var passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];
            function copyEventListenerOptions(options) {
                if (typeof options === 'object' && options !== null) {
                    // We need to destructure the target `options` object since it may
                    // be frozen or sealed (possibly provided implicitly by a third-party
                    // library), or its properties may be readonly.
                    var newOptions = __assign({}, options);
                    // The `signal` option was recently introduced, which caused regressions in
                    // third-party scenarios where `AbortController` was directly provided to
                    // `addEventListener` as options. For instance, in cases like
                    // `document.addEventListener('keydown', callback, abortControllerInstance)`,
                    // which is valid because `AbortController` includes a `signal` getter, spreading
                    // `{...options}` wouldn't copy the `signal`. Additionally, using `Object.create`
                    // isn't feasible since `AbortController` is a built-in object type, and attempting
                    // to create a new object directly with it as the prototype might result in
                    // unexpected behavior.
                    if (options.signal) {
                        newOptions.signal = options.signal;
                    }
                    return newOptions;
                }
                return options;
            }
            var makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget, prepend) {
                if (returnTarget === void 0) { returnTarget = false; }
                if (prepend === void 0) { prepend = false; }
                return function () {
                    var target = this || _global;
                    var eventName = arguments[0];
                    if (patchOptions && patchOptions.transferEventName) {
                        eventName = patchOptions.transferEventName(eventName);
                    }
                    var delegate = arguments[1];
                    if (!delegate) {
                        return nativeListener.apply(this, arguments);
                    }
                    if (isNode && eventName === 'uncaughtException') {
                        // don't patch uncaughtException of nodejs to prevent endless loop
                        return nativeListener.apply(this, arguments);
                    }
                    // To improve `addEventListener` performance, we will create the callback
                    // for the task later when the task is invoked.
                    var isEventListenerObject = false;
                    if (typeof delegate !== 'function') {
                        // This checks whether the provided listener argument is an object with
                        // a `handleEvent` method (since we can call `addEventListener` with a
                        // function `event => ...` or with an object `{ handleEvent: event => ... }`).
                        if (!delegate.handleEvent) {
                            return nativeListener.apply(this, arguments);
                        }
                        isEventListenerObject = true;
                    }
                    if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
                        return;
                    }
                    var passive = !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
                    var options = copyEventListenerOptions(buildEventListenerOptions(arguments[2], passive));
                    var signal = options === null || options === void 0 ? void 0 : options.signal;
                    if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
                        // the signal is an aborted one, just return without attaching the event listener.
                        return;
                    }
                    if (unpatchedEvents) {
                        // check unpatched list
                        for (var i = 0; i < unpatchedEvents.length; i++) {
                            if (eventName === unpatchedEvents[i]) {
                                if (passive) {
                                    return nativeListener.call(target, eventName, delegate, options);
                                }
                                else {
                                    return nativeListener.apply(this, arguments);
                                }
                            }
                        }
                    }
                    var capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
                    var once = options && typeof options === 'object' ? options.once : false;
                    var zone = Zone.current;
                    var symbolEventNames = zoneSymbolEventNames[eventName];
                    if (!symbolEventNames) {
                        prepareEventNames(eventName, eventNameToString);
                        symbolEventNames = zoneSymbolEventNames[eventName];
                    }
                    var symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
                    var existingTasks = target[symbolEventName];
                    var isExisting = false;
                    if (existingTasks) {
                        // already have task registered
                        isExisting = true;
                        if (checkDuplicate) {
                            for (var i = 0; i < existingTasks.length; i++) {
                                if (compare(existingTasks[i], delegate)) {
                                    // same callback, same capture, same event name, just return
                                    return;
                                }
                            }
                        }
                    }
                    else {
                        existingTasks = target[symbolEventName] = [];
                    }
                    var source;
                    var constructorName = target.constructor['name'];
                    var targetSource = globalSources[constructorName];
                    if (targetSource) {
                        source = targetSource[eventName];
                    }
                    if (!source) {
                        source =
                            constructorName +
                                addSource +
                                (eventNameToString ? eventNameToString(eventName) : eventName);
                    }
                    // In the code below, `options` should no longer be reassigned; instead, it
                    // should only be mutated. This is because we pass that object to the native
                    // `addEventListener`.
                    // It's generally recommended to use the same object reference for options.
                    // This ensures consistency and avoids potential issues.
                    taskData.options = options;
                    if (once) {
                        // When using `addEventListener` with the `once` option, we don't pass
                        // the `once` option directly to the native `addEventListener` method.
                        // Instead, we keep the `once` setting and handle it ourselves.
                        taskData.options.once = false;
                    }
                    taskData.target = target;
                    taskData.capture = capture;
                    taskData.eventName = eventName;
                    taskData.isExisting = isExisting;
                    var data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
                    // keep taskData into data to allow onScheduleEventTask to access the task information
                    if (data) {
                        data.taskData = taskData;
                    }
                    if (signal) {
                        // When using `addEventListener` with the `signal` option, we don't pass
                        // the `signal` option directly to the native `addEventListener` method.
                        // Instead, we keep the `signal` setting and handle it ourselves.
                        taskData.options.signal = undefined;
                    }
                    // The `scheduleEventTask` function will ultimately call `customScheduleGlobal`,
                    // which in turn calls the native `addEventListener`. This is why `taskData.options`
                    // is updated before scheduling the task, as `customScheduleGlobal` uses
                    // `taskData.options` to pass it to the native `addEventListener`.
                    var task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
                    if (signal) {
                        // after task is scheduled, we need to store the signal back to task.options
                        taskData.options.signal = signal;
                        // Wrapping `task` in a weak reference would not prevent memory leaks. Weak references are
                        // primarily used for preventing strong references cycles. `onAbort` is always reachable
                        // as it's an event listener, so its closure retains a strong reference to the `task`.
                        var onAbort_1 = function () { return task.zone.cancelTask(task); };
                        nativeListener.call(signal, 'abort', onAbort_1, { once: true });
                        // We need to remove the `abort` listener when the event listener is going to be removed,
                        // as it creates a closure that captures `task`. This closure retains a reference to the
                        // `task` object even after it goes out of scope, preventing `task` from being garbage
                        // collected.
                        task.removeAbortListener = function () { return signal.removeEventListener('abort', onAbort_1); };
                    }
                    // should clear taskData.target to avoid memory leak
                    // issue, https://github.com/angular/angular/issues/20442
                    taskData.target = null;
                    // need to clear up taskData because it is a global object
                    if (data) {
                        data.taskData = null;
                    }
                    // have to save those information to task in case
                    // application may call task.zone.cancelTask() directly
                    if (once) {
                        taskData.options.once = true;
                    }
                    if (typeof task.options !== 'boolean') {
                        // We should save the options on the task (if it's an object) because
                        // we'll be using `task.options` later when removing the event listener
                        // and passing it back to `removeEventListener`.
                        task.options = options;
                    }
                    task.target = target;
                    task.capture = capture;
                    task.eventName = eventName;
                    if (isEventListenerObject) {
                        // save original delegate for compare to check duplicate
                        task.originalDelegate = delegate;
                    }
                    if (!prepend) {
                        existingTasks.push(task);
                    }
                    else {
                        existingTasks.unshift(task);
                    }
                    if (returnTarget) {
                        return target;
                    }
                };
            };
            proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
            if (nativePrependEventListener) {
                proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
            }
            proto[REMOVE_EVENT_LISTENER] = function () {
                var target = this || _global;
                var eventName = arguments[0];
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                var options = arguments[2];
                var capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
                var delegate = arguments[1];
                if (!delegate) {
                    return nativeRemoveEventListener.apply(this, arguments);
                }
                if (validateHandler &&
                    !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
                    return;
                }
                var symbolEventNames = zoneSymbolEventNames[eventName];
                var symbolEventName;
                if (symbolEventNames) {
                    symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
                }
                var existingTasks = symbolEventName && target[symbolEventName];
                // `existingTasks` may not exist if the `addEventListener` was called before
                // it was patched by zone.js. Please refer to the attached issue for
                // clarification, particularly after the `if` condition, before calling
                // the native `removeEventListener`.
                if (existingTasks) {
                    for (var i = 0; i < existingTasks.length; i++) {
                        var existingTask = existingTasks[i];
                        if (compare(existingTask, delegate)) {
                            existingTasks.splice(i, 1);
                            // set isRemoved to data for faster invokeTask check
                            existingTask.isRemoved = true;
                            if (existingTasks.length === 0) {
                                // all tasks for the eventName + capture have gone,
                                // remove globalZoneAwareCallback and remove the task cache from target
                                existingTask.allRemoved = true;
                                target[symbolEventName] = null;
                                // in the target, we have an event listener which is added by on_property
                                // such as target.onclick = function() {}, so we need to clear this internal
                                // property too if all delegates with capture=false were removed
                                // https:// github.com/angular/angular/issues/31643
                                // https://github.com/angular/angular/issues/54581
                                if (!capture && typeof eventName === 'string') {
                                    var onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;
                                    target[onPropertySymbol] = null;
                                }
                            }
                            // In all other conditions, when `addEventListener` is called after being
                            // patched by zone.js, we would always find an event task on the `EventTarget`.
                            // This will trigger `cancelFn` on the `existingTask`, leading to `customCancelGlobal`,
                            // which ultimately removes an event listener and cleans up the abort listener
                            // (if an `AbortSignal` was provided when scheduling a task).
                            existingTask.zone.cancelTask(existingTask);
                            if (returnTarget) {
                                return target;
                            }
                            return;
                        }
                    }
                }
                // https://github.com/angular/zone.js/issues/930
                // We may encounter a situation where the `addEventListener` was
                // called on the event target before zone.js is loaded, resulting
                // in no task being stored on the event target due to its invocation
                // of the native implementation. In this scenario, we simply need to
                // invoke the native `removeEventListener`.
                return nativeRemoveEventListener.apply(this, arguments);
            };
            proto[LISTENERS_EVENT_LISTENER] = function () {
                var target = this || _global;
                var eventName = arguments[0];
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                var listeners = [];
                var tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
                for (var i = 0; i < tasks.length; i++) {
                    var task = tasks[i];
                    var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                    listeners.push(delegate);
                }
                return listeners;
            };
            proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
                var target = this || _global;
                var eventName = arguments[0];
                if (!eventName) {
                    var keys = Object.keys(target);
                    for (var i = 0; i < keys.length; i++) {
                        var prop = keys[i];
                        var match = EVENT_NAME_SYMBOL_REGX.exec(prop);
                        var evtName = match && match[1];
                        // in nodejs EventEmitter, removeListener event is
                        // used for monitoring the removeListener call,
                        // so just keep removeListener eventListener until
                        // all other eventListeners are removed
                        if (evtName && evtName !== 'removeListener') {
                            this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
                        }
                    }
                    // remove removeListener listener finally
                    this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
                }
                else {
                    if (patchOptions && patchOptions.transferEventName) {
                        eventName = patchOptions.transferEventName(eventName);
                    }
                    var symbolEventNames = zoneSymbolEventNames[eventName];
                    if (symbolEventNames) {
                        var symbolEventName = symbolEventNames[FALSE_STR];
                        var symbolCaptureEventName = symbolEventNames[TRUE_STR];
                        var tasks = target[symbolEventName];
                        var captureTasks = target[symbolCaptureEventName];
                        if (tasks) {
                            var removeTasks = tasks.slice();
                            for (var i = 0; i < removeTasks.length; i++) {
                                var task = removeTasks[i];
                                var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                                this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                            }
                        }
                        if (captureTasks) {
                            var removeTasks = captureTasks.slice();
                            for (var i = 0; i < removeTasks.length; i++) {
                                var task = removeTasks[i];
                                var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                                this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                            }
                        }
                    }
                }
                if (returnTarget) {
                    return this;
                }
            };
            // for native toString patch
            attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
            attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
            if (nativeRemoveAllListeners) {
                attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
            }
            if (nativeListeners) {
                attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
            }
            return true;
        }
        var results = [];
        for (var i = 0; i < apis.length; i++) {
            results[i] = patchEventTargetMethods(apis[i], patchOptions);
        }
        return results;
    }
    function findEventTasks(target, eventName) {
        if (!eventName) {
            var foundTasks = [];
            for (var prop in target) {
                var match = EVENT_NAME_SYMBOL_REGX.exec(prop);
                var evtName = match && match[1];
                if (evtName && (!eventName || evtName === eventName)) {
                    var tasks = target[prop];
                    if (tasks) {
                        for (var i = 0; i < tasks.length; i++) {
                            foundTasks.push(tasks[i]);
                        }
                    }
                }
            }
            return foundTasks;
        }
        var symbolEventName = zoneSymbolEventNames[eventName];
        if (!symbolEventName) {
            prepareEventNames(eventName);
            symbolEventName = zoneSymbolEventNames[eventName];
        }
        var captureFalseTasks = target[symbolEventName[FALSE_STR]];
        var captureTrueTasks = target[symbolEventName[TRUE_STR]];
        if (!captureFalseTasks) {
            return captureTrueTasks ? captureTrueTasks.slice() : [];
        }
        else {
            return captureTrueTasks
                ? captureFalseTasks.concat(captureTrueTasks)
                : captureFalseTasks.slice();
        }
    }
    function patchEventPrototype(global, api) {
        var Event = global['Event'];
        if (Event && Event.prototype) {
            api.patchMethod(Event.prototype, 'stopImmediatePropagation', function (delegate) { return function (self, args) {
                self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
                // we need to call the native stopImmediatePropagation
                // in case in some hybrid application, some part of
                // application will be controlled by zone, some are not
                delegate && delegate.apply(self, args);
            }; });
        }
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    function patchQueueMicrotask(global, api) {
        api.patchMethod(global, 'queueMicrotask', function (delegate) {
            return function (self, args) {
                Zone.current.scheduleMicroTask('queueMicrotask', args[0]);
            };
        });
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    var taskSymbol = zoneSymbol('zoneTask');
    function patchTimer(window, setName, cancelName, nameSuffix) {
        var setNative = null;
        var clearNative = null;
        setName += nameSuffix;
        cancelName += nameSuffix;
        var tasksByHandleId = {};
        function scheduleTask(task) {
            var data = task.data;
            data.args[0] = function () {
                return task.invoke.apply(this, arguments);
            };
            var handleOrId = setNative.apply(window, data.args);
            // Whlist on Node.js when get can the ID by using `[Symbol.toPrimitive]()` we do
            // to this so that we do not cause potentally leaks when using `setTimeout`
            // since this can be periodic when using `.refresh`.
            if (isNumber(handleOrId)) {
                data.handleId = handleOrId;
            }
            else {
                data.handle = handleOrId;
                // On Node.js a timeout and interval can be restarted over and over again by using the `.refresh` method.
                data.isRefreshable = isFunction(handleOrId.refresh);
            }
            return task;
        }
        function clearTask(task) {
            var _a = task.data, handle = _a.handle, handleId = _a.handleId;
            return clearNative.call(window, handle !== null && handle !== void 0 ? handle : handleId);
        }
        setNative = patchMethod(window, setName, function (delegate) { return function (self, args) {
            var _a;
            if (isFunction(args[0])) {
                var options_1 = {
                    isRefreshable: false,
                    isPeriodic: nameSuffix === 'Interval',
                    delay: nameSuffix === 'Timeout' || nameSuffix === 'Interval' ? args[1] || 0 : undefined,
                    args: args,
                };
                var callback_1 = args[0];
                args[0] = function timer() {
                    try {
                        return callback_1.apply(this, arguments);
                    }
                    finally {
                        // issue-934, task will be cancelled
                        // even it is a periodic task such as
                        // setInterval
                        // https://github.com/angular/angular/issues/40387
                        // Cleanup tasksByHandleId should be handled before scheduleTask
                        // Since some zoneSpec may intercept and doesn't trigger
                        // scheduleFn(scheduleTask) provided here.
                        var handle_1 = options_1.handle, handleId_1 = options_1.handleId, isPeriodic_1 = options_1.isPeriodic, isRefreshable_1 = options_1.isRefreshable;
                        if (!isPeriodic_1 && !isRefreshable_1) {
                            if (handleId_1) {
                                // in non-nodejs env, we remove timerId
                                // from local cache
                                delete tasksByHandleId[handleId_1];
                            }
                            else if (handle_1) {
                                // Node returns complex objects as handleIds
                                // we remove task reference from timer object
                                handle_1[taskSymbol] = null;
                            }
                        }
                    }
                };
                var task_1 = scheduleMacroTaskWithCurrentZone(setName, args[0], options_1, scheduleTask, clearTask);
                if (!task_1) {
                    return task_1;
                }
                // Node.js must additionally support the ref and unref functions.
                var _b = task_1.data, handleId = _b.handleId, handle = _b.handle, isRefreshable = _b.isRefreshable, isPeriodic = _b.isPeriodic;
                if (handleId) {
                    // for non nodejs env, we save handleId: task
                    // mapping in local cache for clearTimeout
                    tasksByHandleId[handleId] = task_1;
                }
                else if (handle) {
                    // for nodejs env, we save task
                    // reference in timerId Object for clearTimeout
                    handle[taskSymbol] = task_1;
                    if (isRefreshable && !isPeriodic) {
                        var originalRefresh_1 = handle.refresh;
                        handle.refresh = function () {
                            var zone = task_1.zone, state = task_1.state;
                            if (state === 'notScheduled') {
                                task_1._state = 'scheduled';
                                zone._updateTaskCount(task_1, 1);
                            }
                            else if (state === 'running') {
                                task_1._state = 'scheduling';
                            }
                            return originalRefresh_1.call(this);
                        };
                    }
                }
                return (_a = handle !== null && handle !== void 0 ? handle : handleId) !== null && _a !== void 0 ? _a : task_1;
            }
            else {
                // cause an error by calling it directly.
                return delegate.apply(window, args);
            }
        }; });
        clearNative = patchMethod(window, cancelName, function (delegate) { return function (self, args) {
            var id = args[0];
            var task;
            if (isNumber(id)) {
                // non nodejs env.
                task = tasksByHandleId[id];
                delete tasksByHandleId[id];
            }
            else {
                // nodejs env ?? other environments.
                task = id === null || id === void 0 ? void 0 : id[taskSymbol];
                if (task) {
                    id[taskSymbol] = null;
                }
                else {
                    task = id;
                }
            }
            if (task === null || task === void 0 ? void 0 : task.type) {
                if (task.cancelFn) {
                    // Do not cancel already canceled functions
                    task.zone.cancelTask(task);
                }
            }
            else {
                // cause an error by calling it directly.
                delegate.apply(window, args);
            }
        }; });
    }
    function patchCustomElements(_global, api) {
        var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
        if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) {
            return;
        }
        // https://html.spec.whatwg.org/multipage/custom-elements.html#concept-custom-element-definition-lifecycle-callbacks
        var callbacks = [
            'connectedCallback',
            'disconnectedCallback',
            'adoptedCallback',
            'attributeChangedCallback',
            'formAssociatedCallback',
            'formDisabledCallback',
            'formResetCallback',
            'formStateRestoreCallback',
        ];
        api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
    }
    function eventTargetPatch(_global, api) {
        if (Zone[api.symbol('patchEventTarget')]) {
            // EventTarget is already patched.
            return;
        }
        var _a = api.getGlobalObjects(), eventNames = _a.eventNames, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
        //  predefine all __zone_symbol__ + eventName + true/false string
        for (var i = 0; i < eventNames.length; i++) {
            var eventName = eventNames[i];
            var falseEventName = eventName + FALSE_STR;
            var trueEventName = eventName + TRUE_STR;
            var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
            var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
            zoneSymbolEventNames[eventName] = {};
            zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
            zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
        }
        var EVENT_TARGET = _global['EventTarget'];
        if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
            return;
        }
        api.patchEventTarget(_global, api, [EVENT_TARGET && EVENT_TARGET.prototype]);
        return true;
    }
    function patchEvent(global, api) {
        api.patchEventPrototype(global, api);
    }
    /**
     * @fileoverview
     * @suppress {globalThis}
     */
    function filterProperties(target, onProperties, ignoreProperties) {
        if (!ignoreProperties || ignoreProperties.length === 0) {
            return onProperties;
        }
        var tip = ignoreProperties.filter(function (ip) { return ip.target === target; });
        if (tip.length === 0) {
            return onProperties;
        }
        var targetIgnoreProperties = tip[0].ignoreProperties;
        return onProperties.filter(function (op) { return targetIgnoreProperties.indexOf(op) === -1; });
    }
    function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
        // check whether target is available, sometimes target will be undefined
        // because different browser or some 3rd party plugin.
        if (!target) {
            return;
        }
        var filteredProperties = filterProperties(target, onProperties, ignoreProperties);
        patchOnProperties(target, filteredProperties, prototype);
    }
    /**
     * Get all event name properties which the event name startsWith `on`
     * from the target object itself, inherited properties are not considered.
     */
    function getOnEventNames(target) {
        return Object.getOwnPropertyNames(target)
            .filter(function (name) { return name.startsWith('on') && name.length > 2; })
            .map(function (name) { return name.substring(2); });
    }
    function propertyDescriptorPatch(api, _global) {
        if (isNode && !isMix) {
            return;
        }
        if (Zone[api.symbol('patchEvents')]) {
            // events are already been patched by legacy patch.
            return;
        }
        var ignoreProperties = _global['__Zone_ignore_on_properties'];
        // for browsers that we can patch the descriptor:  Chrome & Firefox
        var patchTargets = [];
        if (isBrowser) {
            var internalWindow_1 = window;
            patchTargets = patchTargets.concat([
                'Document',
                'SVGElement',
                'Element',
                'HTMLElement',
                'HTMLBodyElement',
                'HTMLMediaElement',
                'HTMLFrameSetElement',
                'HTMLFrameElement',
                'HTMLIFrameElement',
                'HTMLMarqueeElement',
                'Worker',
            ]);
            var ignoreErrorProperties = [];
            // In older browsers like IE or Edge, event handler properties (e.g., `onclick`)
            // may not be defined directly on the `window` object but on its prototype (`WindowPrototype`).
            // To ensure complete coverage, we use the prototype when checking
            // for and patching these properties.
            patchFilteredProperties(internalWindow_1, getOnEventNames(internalWindow_1), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow_1));
        }
        patchTargets = patchTargets.concat([
            'XMLHttpRequest',
            'XMLHttpRequestEventTarget',
            'IDBIndex',
            'IDBRequest',
            'IDBOpenDBRequest',
            'IDBDatabase',
            'IDBTransaction',
            'IDBCursor',
            'WebSocket',
        ]);
        for (var i = 0; i < patchTargets.length; i++) {
            var target = _global[patchTargets[i]];
            (target === null || target === void 0 ? void 0 : target.prototype) &&
                patchFilteredProperties(target.prototype, getOnEventNames(target.prototype), ignoreProperties);
        }
    }
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    function patchBrowser(Zone) {
        Zone.__load_patch('legacy', function (global) {
            var legacyPatch = global[Zone.__symbol__('legacyPatch')];
            if (legacyPatch) {
                legacyPatch();
            }
        });
        Zone.__load_patch('timers', function (global) {
            var set = 'set';
            var clear = 'clear';
            patchTimer(global, set, clear, 'Timeout');
            patchTimer(global, set, clear, 'Interval');
            patchTimer(global, set, clear, 'Immediate');
        });
        Zone.__load_patch('requestAnimationFrame', function (global) {
            patchTimer(global, 'request', 'cancel', 'AnimationFrame');
            patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
            patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
        });
        Zone.__load_patch('blocking', function (global, Zone) {
            var blockingMethods = ['alert', 'prompt', 'confirm'];
            for (var i = 0; i < blockingMethods.length; i++) {
                var name_2 = blockingMethods[i];
                patchMethod(global, name_2, function (delegate, symbol, name) {
                    return function (s, args) {
                        return Zone.current.run(delegate, global, args, name);
                    };
                });
            }
        });
        Zone.__load_patch('EventTarget', function (global, Zone, api) {
            patchEvent(global, api);
            eventTargetPatch(global, api);
            // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
            var XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
            if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
                api.patchEventTarget(global, api, [XMLHttpRequestEventTarget.prototype]);
            }
        });
        Zone.__load_patch('MutationObserver', function (global, Zone, api) {
            patchClass('MutationObserver');
            patchClass('WebKitMutationObserver');
        });
        Zone.__load_patch('IntersectionObserver', function (global, Zone, api) {
            patchClass('IntersectionObserver');
        });
        Zone.__load_patch('FileReader', function (global, Zone, api) {
            patchClass('FileReader');
        });
        Zone.__load_patch('on_property', function (global, Zone, api) {
            propertyDescriptorPatch(api, global);
        });
        Zone.__load_patch('customElements', function (global, Zone, api) {
            patchCustomElements(global, api);
        });
        Zone.__load_patch('XHR', function (global, Zone) {
            // Treat XMLHttpRequest as a macrotask.
            patchXHR(global);
            var XHR_TASK = zoneSymbol('xhrTask');
            var XHR_SYNC = zoneSymbol('xhrSync');
            var XHR_LISTENER = zoneSymbol('xhrListener');
            var XHR_SCHEDULED = zoneSymbol('xhrScheduled');
            var XHR_URL = zoneSymbol('xhrURL');
            var XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
            function patchXHR(window) {
                var XMLHttpRequest = window['XMLHttpRequest'];
                if (!XMLHttpRequest) {
                    // XMLHttpRequest is not available in service worker
                    return;
                }
                var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
                function findPendingTask(target) {
                    return target[XHR_TASK];
                }
                var oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                var oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                if (!oriAddListener) {
                    var XMLHttpRequestEventTarget_1 = window['XMLHttpRequestEventTarget'];
                    if (XMLHttpRequestEventTarget_1) {
                        var XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget_1.prototype;
                        oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                        oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                    }
                }
                var READY_STATE_CHANGE = 'readystatechange';
                var SCHEDULED = 'scheduled';
                function scheduleTask(task) {
                    var data = task.data;
                    var target = data.target;
                    target[XHR_SCHEDULED] = false;
                    target[XHR_ERROR_BEFORE_SCHEDULED] = false;
                    // remove existing event listener
                    var listener = target[XHR_LISTENER];
                    if (!oriAddListener) {
                        oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                        oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                    }
                    if (listener) {
                        oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
                    }
                    var newListener = (target[XHR_LISTENER] = function () {
                        if (target.readyState === target.DONE) {
                            // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with
                            // readyState=4 multiple times, so we need to check task state here
                            if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
                                // check whether the xhr has registered onload listener
                                // if that is the case, the task should invoke after all
                                // onload listeners finish.
                                // Also if the request failed without response (status = 0), the load event handler
                                // will not be triggered, in that case, we should also invoke the placeholder callback
                                // to close the XMLHttpRequest::send macroTask.
                                // https://github.com/angular/angular/issues/38795
                                var loadTasks = target[Zone.__symbol__('loadfalse')];
                                if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
                                    var oriInvoke_1 = task.invoke;
                                    task.invoke = function () {
                                        // need to load the tasks again, because in other
                                        // load listener, they may remove themselves
                                        var loadTasks = target[Zone.__symbol__('loadfalse')];
                                        for (var i = 0; i < loadTasks.length; i++) {
                                            if (loadTasks[i] === task) {
                                                loadTasks.splice(i, 1);
                                            }
                                        }
                                        if (!data.aborted && task.state === SCHEDULED) {
                                            oriInvoke_1.call(task);
                                        }
                                    };
                                    loadTasks.push(task);
                                }
                                else {
                                    task.invoke();
                                }
                            }
                            else if (!data.aborted && target[XHR_SCHEDULED] === false) {
                                // error occurs when xhr.send()
                                target[XHR_ERROR_BEFORE_SCHEDULED] = true;
                            }
                        }
                    });
                    oriAddListener.call(target, READY_STATE_CHANGE, newListener);
                    var storedTask = target[XHR_TASK];
                    if (!storedTask) {
                        target[XHR_TASK] = task;
                    }
                    sendNative.apply(target, data.args);
                    target[XHR_SCHEDULED] = true;
                    return task;
                }
                function placeholderCallback() { }
                function clearTask(task) {
                    var data = task.data;
                    // Note - ideally, we would call data.target.removeEventListener here, but it's too late
                    // to prevent it from firing. So instead, we store info for the event listener.
                    data.aborted = true;
                    return abortNative.apply(data.target, data.args);
                }
                var openNative = patchMethod(XMLHttpRequestPrototype, 'open', function () { return function (self, args) {
                    self[XHR_SYNC] = args[2] == false;
                    self[XHR_URL] = args[1];
                    return openNative.apply(self, args);
                }; });
                var XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
                var fetchTaskAborting = zoneSymbol('fetchTaskAborting');
                var fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
                var sendNative = patchMethod(XMLHttpRequestPrototype, 'send', function () { return function (self, args) {
                    if (Zone.current[fetchTaskScheduling] === true) {
                        // a fetch is scheduling, so we are using xhr to polyfill fetch
                        // and because we already schedule macroTask for fetch, we should
                        // not schedule a macroTask for xhr again
                        return sendNative.apply(self, args);
                    }
                    if (self[XHR_SYNC]) {
                        // if the XHR is sync there is no task to schedule, just execute the code.
                        return sendNative.apply(self, args);
                    }
                    else {
                        var options = {
                            target: self,
                            url: self[XHR_URL],
                            isPeriodic: false,
                            args: args,
                            aborted: false,
                        };
                        var task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
                        if (self &&
                            self[XHR_ERROR_BEFORE_SCHEDULED] === true &&
                            !options.aborted &&
                            task.state === SCHEDULED) {
                            // xhr request throw error when send
                            // we should invoke task instead of leaving a scheduled
                            // pending macroTask
                            task.invoke();
                        }
                    }
                }; });
                var abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', function () { return function (self, args) {
                    var task = findPendingTask(self);
                    if (task && typeof task.type == 'string') {
                        // If the XHR has already completed, do nothing.
                        // If the XHR has already been aborted, do nothing.
                        // Fix #569, call abort multiple times before done will cause
                        // macroTask task count be negative number
                        if (task.cancelFn == null || (task.data && task.data.aborted)) {
                            return;
                        }
                        task.zone.cancelTask(task);
                    }
                    else if (Zone.current[fetchTaskAborting] === true) {
                        // the abort is called from fetch polyfill, we need to call native abort of XHR.
                        return abortNative.apply(self, args);
                    }
                    // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no
                    // task
                    // to cancel. Do nothing.
                }; });
            }
        });
        Zone.__load_patch('geolocation', function (global) {
            /// GEO_LOCATION
            if (global['navigator'] && global['navigator'].geolocation) {
                patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
            }
        });
        Zone.__load_patch('PromiseRejectionEvent', function (global, Zone) {
            // handle unhandled promise rejection
            function findPromiseRejectionHandler(evtName) {
                return function (e) {
                    var eventTasks = findEventTasks(global, evtName);
                    eventTasks.forEach(function (eventTask) {
                        // windows has added unhandledrejection event listener
                        // trigger the event listener
                        var PromiseRejectionEvent = global['PromiseRejectionEvent'];
                        if (PromiseRejectionEvent) {
                            var evt = new PromiseRejectionEvent(evtName, {
                                promise: e.promise,
                                reason: e.rejection,
                            });
                            eventTask.invoke(evt);
                        }
                    });
                };
            }
            if (global['PromiseRejectionEvent']) {
                Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =
                    findPromiseRejectionHandler('unhandledrejection');
                Zone[zoneSymbol('rejectionHandledHandler')] =
                    findPromiseRejectionHandler('rejectionhandled');
            }
        });
        Zone.__load_patch('queueMicrotask', function (global, Zone, api) {
            patchQueueMicrotask(global, api);
        });
    }
    function patchPromise(Zone) {
        Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
            var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
            var ObjectDefineProperty = Object.defineProperty;
            function readableObjectToString(obj) {
                if (obj && obj.toString === Object.prototype.toString) {
                    var className = obj.constructor && obj.constructor.name;
                    return (className ? className : '') + ': ' + JSON.stringify(obj);
                }
                return obj ? obj.toString() : Object.prototype.toString.call(obj);
            }
            var __symbol__ = api.symbol;
            var _uncaughtPromiseErrors = [];
            var isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] !== false;
            var symbolPromise = __symbol__('Promise');
            var symbolThen = __symbol__('then');
            var creationTrace = '__creationTrace__';
            api.onUnhandledError = function (e) {
                if (api.showUncaughtError()) {
                    var rejection = e && e.rejection;
                    if (rejection) {
                        console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
                    }
                    else {
                        console.error(e);
                    }
                }
            };
            api.microtaskDrainDone = function () {
                var _loop_3 = function () {
                    var uncaughtPromiseError = _uncaughtPromiseErrors.shift();
                    try {
                        uncaughtPromiseError.zone.runGuarded(function () {
                            if (uncaughtPromiseError.throwOriginal) {
                                throw uncaughtPromiseError.rejection;
                            }
                            throw uncaughtPromiseError;
                        });
                    }
                    catch (error) {
                        handleUnhandledRejection(error);
                    }
                };
                while (_uncaughtPromiseErrors.length) {
                    _loop_3();
                }
            };
            var UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
            function handleUnhandledRejection(e) {
                api.onUnhandledError(e);
                try {
                    var handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
                    if (typeof handler === 'function') {
                        handler.call(this, e);
                    }
                }
                catch (err) { }
            }
            function isThenable(value) {
                return value && typeof value.then === 'function';
            }
            function forwardResolution(value) {
                return value;
            }
            function forwardRejection(rejection) {
                return ZoneAwarePromise.reject(rejection);
            }
            var symbolState = __symbol__('state');
            var symbolValue = __symbol__('value');
            var symbolFinally = __symbol__('finally');
            var symbolParentPromiseValue = __symbol__('parentPromiseValue');
            var symbolParentPromiseState = __symbol__('parentPromiseState');
            var source = 'Promise.then';
            var UNRESOLVED = null;
            var RESOLVED = true;
            var REJECTED = false;
            var REJECTED_NO_CATCH = 0;
            function makeResolver(promise, state) {
                return function (v) {
                    try {
                        resolvePromise(promise, state, v);
                    }
                    catch (err) {
                        resolvePromise(promise, false, err);
                    }
                    // Do not return value or you will break the Promise spec.
                };
            }
            var once = function () {
                var wasCalled = false;
                return function wrapper(wrappedFunction) {
                    return function () {
                        if (wasCalled) {
                            return;
                        }
                        wasCalled = true;
                        wrappedFunction.apply(null, arguments);
                    };
                };
            };
            var TYPE_ERROR = 'Promise resolved with itself';
            var CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
            // Promise Resolution
            function resolvePromise(promise, state, value) {
                var onceWrapper = once();
                if (promise === value) {
                    throw new TypeError(TYPE_ERROR);
                }
                if (promise[symbolState] === UNRESOLVED) {
                    // should only get value.then once based on promise spec.
                    var then = null;
                    try {
                        if (typeof value === 'object' || typeof value === 'function') {
                            then = value && value.then;
                        }
                    }
                    catch (err) {
                        onceWrapper(function () {
                            resolvePromise(promise, false, err);
                        })();
                        return promise;
                    }
                    // if (value instanceof ZoneAwarePromise) {
                    if (state !== REJECTED &&
                        value instanceof ZoneAwarePromise &&
                        value.hasOwnProperty(symbolState) &&
                        value.hasOwnProperty(symbolValue) &&
                        value[symbolState] !== UNRESOLVED) {
                        clearRejectedNoCatch(value);
                        resolvePromise(promise, value[symbolState], value[symbolValue]);
                    }
                    else if (state !== REJECTED && typeof then === 'function') {
                        try {
                            then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
                        }
                        catch (err) {
                            onceWrapper(function () {
                                resolvePromise(promise, false, err);
                            })();
                        }
                    }
                    else {
                        promise[symbolState] = state;
                        var queue = promise[symbolValue];
                        promise[symbolValue] = value;
                        if (promise[symbolFinally] === symbolFinally) {
                            // the promise is generated by Promise.prototype.finally
                            if (state === RESOLVED) {
                                // the state is resolved, should ignore the value
                                // and use parent promise value
                                promise[symbolState] = promise[symbolParentPromiseState];
                                promise[symbolValue] = promise[symbolParentPromiseValue];
                            }
                        }
                        // record task information in value when error occurs, so we can
                        // do some additional work such as render longStackTrace
                        if (state === REJECTED && value instanceof Error) {
                            // check if longStackTraceZone is here
                            var trace = Zone.currentTask &&
                                Zone.currentTask.data &&
                                Zone.currentTask.data[creationTrace];
                            if (trace) {
                                // only keep the long stack trace into error when in longStackTraceZone
                                ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, {
                                    configurable: true,
                                    enumerable: false,
                                    writable: true,
                                    value: trace,
                                });
                            }
                        }
                        for (var i = 0; i < queue.length;) {
                            scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
                        }
                        if (queue.length == 0 && state == REJECTED) {
                            promise[symbolState] = REJECTED_NO_CATCH;
                            var uncaughtPromiseError = value;
                            try {
                                // Here we throws a new Error to print more readable error log
                                // and if the value is not an error, zone.js builds an `Error`
                                // Object here to attach the stack information.
                                throw new Error('Uncaught (in promise): ' +
                                    readableObjectToString(value) +
                                    (value && value.stack ? '\n' + value.stack : ''));
                            }
                            catch (err) {
                                uncaughtPromiseError = err;
                            }
                            if (isDisableWrappingUncaughtPromiseRejection) {
                                // If disable wrapping uncaught promise reject
                                // use the value instead of wrapping it.
                                uncaughtPromiseError.throwOriginal = true;
                            }
                            uncaughtPromiseError.rejection = value;
                            uncaughtPromiseError.promise = promise;
                            uncaughtPromiseError.zone = Zone.current;
                            uncaughtPromiseError.task = Zone.currentTask;
                            _uncaughtPromiseErrors.push(uncaughtPromiseError);
                            api.scheduleMicroTask(); // to make sure that it is running
                        }
                    }
                }
                // Resolving an already resolved promise is a noop.
                return promise;
            }
            var REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
            function clearRejectedNoCatch(promise) {
                if (promise[symbolState] === REJECTED_NO_CATCH) {
                    // if the promise is rejected no catch status
                    // and queue.length > 0, means there is a error handler
                    // here to handle the rejected promise, we should trigger
                    // windows.rejectionhandled eventHandler or nodejs rejectionHandled
                    // eventHandler
                    try {
                        var handler = Zone[REJECTION_HANDLED_HANDLER];
                        if (handler && typeof handler === 'function') {
                            handler.call(this, { rejection: promise[symbolValue], promise: promise });
                        }
                    }
                    catch (err) { }
                    promise[symbolState] = REJECTED;
                    for (var i = 0; i < _uncaughtPromiseErrors.length; i++) {
                        if (promise === _uncaughtPromiseErrors[i].promise) {
                            _uncaughtPromiseErrors.splice(i, 1);
                        }
                    }
                }
            }
            function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
                clearRejectedNoCatch(promise);
                var promiseState = promise[symbolState];
                var delegate = promiseState
                    ? typeof onFulfilled === 'function'
                        ? onFulfilled
                        : forwardResolution
                    : typeof onRejected === 'function'
                        ? onRejected
                        : forwardRejection;
                zone.scheduleMicroTask(source, function () {
                    try {
                        var parentPromiseValue = promise[symbolValue];
                        var isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
                        if (isFinallyPromise) {
                            // if the promise is generated from finally call, keep parent promise's state and value
                            chainPromise[symbolParentPromiseValue] = parentPromiseValue;
                            chainPromise[symbolParentPromiseState] = promiseState;
                        }
                        // should not pass value to finally callback
                        var value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution
                            ? []
                            : [parentPromiseValue]);
                        resolvePromise(chainPromise, true, value);
                    }
                    catch (error) {
                        // if error occurs, should always return this error
                        resolvePromise(chainPromise, false, error);
                    }
                }, chainPromise);
            }
            var ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
            var noop = function () { };
            var AggregateError = global.AggregateError;
            var ZoneAwarePromise = /** @class */ (function () {
                function ZoneAwarePromise(executor) {
                    var promise = this;
                    if (!(promise instanceof ZoneAwarePromise)) {
                        throw new Error('Must be an instanceof Promise.');
                    }
                    promise[symbolState] = UNRESOLVED;
                    promise[symbonTlValue] = []; // queue;
                    try {
                        var onceWrapper = once();
                        executor &&
                            executor(onceWrapper(makeResolver(promise, RESOLVED)), onceWrapper(makeResolver(promise, REJECTED)));
                    }
                    catch (error) {
                        resolvePromise(promise, false, error);
                    }
                }
                ZoneAwarePromise.toString = function () {
                    return ZONE_AWARE_PROMISE_TO_STRING;
                };
                ZoneAwarePromise.resolve = function (value) {
                    if (value instanceof ZoneAwarePromise) {
                        return value;
                    }
                    return resolvePromise(new this(null), RESOLVED, value);
                };
                ZoneAwarePromise.reject = function (error) {
                    return resolvePromise(new this(null), REJECTED, error);
                };
                ZoneAwarePromise.withResolvers = function () {
                    var result = {};
                    result.promise = new ZoneAwarePromise(function (res, rej) {
                        result.resolve = res;
                        result.reject = rej;
                    });
                    return result;
                };
                ZoneAwarePromise.any = function (values) {
                    if (!values || typeof values[Symbol.iterator] !== 'function') {
                        return Promise.reject(new AggregateError([], 'All promises were rejected'));
                    }
                    var promises = [];
                    var count = 0;
                    try {
                        for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
                            var v = values_1[_i];
                            count++;
                            promises.push(ZoneAwarePromise.resolve(v));
                        }
                    }
                    catch (err) {
                        return Promise.reject(new AggregateError([], 'All promises were rejected'));
                    }
                    if (count === 0) {
                        return Promise.reject(new AggregateError([], 'All promises were rejected'));
                    }
                    var finished = false;
                    var errors = [];
                    return new ZoneAwarePromise(function (resolve, reject) {
                        for (var i = 0; i < promises.length; i++) {
                            promises[i].then(function (v) {
                                if (finished) {
                                    return;
                                }
                                finished = true;
                                resolve(v);
                            }, function (err) {
                                errors.push(err);
                                count--;
                                if (count === 0) {
                                    finished = true;
                                    reject(new AggregateError(errors, 'All promises were rejected'));
                                }
                            });
                        }
                    });
                };
                ZoneAwarePromise.race = function (values) {
                    var resolve;
                    var reject;
                    var promise = new this(function (res, rej) {
                        resolve = res;
                        reject = rej;
                    });
                    function onResolve(value) {
                        resolve(value);
                    }
                    function onReject(error) {
                        reject(error);
                    }
                    for (var _i = 0, values_2 = values; _i < values_2.length; _i++) {
                        var value = values_2[_i];
                        if (!isThenable(value)) {
                            value = this.resolve(value);
                        }
                        value.then(onResolve, onReject);
                    }
                    return promise;
                };
                ZoneAwarePromise.all = function (values) {
                    return ZoneAwarePromise.allWithCallback(values);
                };
                ZoneAwarePromise.allSettled = function (values) {
                    var P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
                    return P.allWithCallback(values, {
                        thenCallback: function (value) { return ({ status: 'fulfilled', value: value }); },
                        errorCallback: function (err) { return ({ status: 'rejected', reason: err }); },
                    });
                };
                ZoneAwarePromise.allWithCallback = function (values, callback) {
                    var resolve;
                    var reject;
                    var promise = new this(function (res, rej) {
                        resolve = res;
                        reject = rej;
                    });
                    // Start at 2 to prevent prematurely resolving if .then is called immediately.
                    var unresolvedCount = 2;
                    var valueIndex = 0;
                    var resolvedValues = [];
                    var _loop_4 = function (value) {
                        if (!isThenable(value)) {
                            value = this_1.resolve(value);
                        }
                        var curValueIndex = valueIndex;
                        try {
                            value.then(function (value) {
                                resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;
                                unresolvedCount--;
                                if (unresolvedCount === 0) {
                                    resolve(resolvedValues);
                                }
                            }, function (err) {
                                if (!callback) {
                                    reject(err);
                                }
                                else {
                                    resolvedValues[curValueIndex] = callback.errorCallback(err);
                                    unresolvedCount--;
                                    if (unresolvedCount === 0) {
                                        resolve(resolvedValues);
                                    }
                                }
                            });
                        }
                        catch (thenErr) {
                            reject(thenErr);
                        }
                        unresolvedCount++;
                        valueIndex++;
                    };
                    var this_1 = this;
                    for (var _i = 0, values_3 = values; _i < values_3.length; _i++) {
                        var value = values_3[_i];
                        _loop_4(value);
                    }
                    // Make the unresolvedCount zero-based again.
                    unresolvedCount -= 2;
                    if (unresolvedCount === 0) {
                        resolve(resolvedValues);
                    }
                    return promise;
                };
                Object.defineProperty(ZoneAwarePromise.prototype, Symbol.toStringTag, {
                    get: function () {
                        return 'Promise';
                    },
                    enumerable: false,
                    configurable: true
                });
                Object.defineProperty(ZoneAwarePromise.prototype, Symbol.species, {
                    get: function () {
                        return ZoneAwarePromise;
                    },
                    enumerable: false,
                    configurable: true
                });
                ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) {
                    var _a;
                    // We must read `Symbol.species` safely because `this` may be anything. For instance, `this`
                    // may be an object without a prototype (created through `Object.create(null)`); thus
                    // `this.constructor` will be undefined. One of the use cases is SystemJS creating
                    // prototype-less objects (modules) via `Object.create(null)`. The SystemJS creates an empty
                    // object and copies promise properties into that object (within the `getOrCreateLoad`
                    // function). The zone.js then checks if the resolved value has the `then` method and
                    // invokes it with the `value` context. Otherwise, this will throw an error: `TypeError:
                    // Cannot read properties of undefined (reading 'Symbol(Symbol.species)')`.
                    var C = (_a = this.constructor) === null || _a === void 0 ? void 0 : _a[Symbol.species];
                    if (!C || typeof C !== 'function') {
                        C = this.constructor || ZoneAwarePromise;
                    }
                    var chainPromise = new C(noop);
                    var zone = Zone.current;
                    if (this[symbolState] == UNRESOLVED) {
                        this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
                    }
                    else {
                        scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
                    }
                    return chainPromise;
                };
                ZoneAwarePromise.prototype.catch = function (onRejected) {
                    return this.then(null, onRejected);
                };
                ZoneAwarePromise.prototype.finally = function (onFinally) {
                    var _a;
                    // See comment on the call to `then` about why thee `Symbol.species` is safely accessed.
                    var C = (_a = this.constructor) === null || _a === void 0 ? void 0 : _a[Symbol.species];
                    if (!C || typeof C !== 'function') {
                        C = ZoneAwarePromise;
                    }
                    var chainPromise = new C(noop);
                    chainPromise[symbolFinally] = symbolFinally;
                    var zone = Zone.current;
                    if (this[symbolState] == UNRESOLVED) {
                        this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
                    }
                    else {
                        scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
                    }
                    return chainPromise;
                };
                return ZoneAwarePromise;
            }());
            // Protect against aggressive optimizers dropping seemingly unused properties.
            // E.g. Closure Compiler in advanced mode.
            ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
            ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
            ZoneAwarePromise['race'] = ZoneAwarePromise.race;
            ZoneAwarePromise['all'] = ZoneAwarePromise.all;
            var NativePromise = (global[symbolPromise] = global['Promise']);
            global['Promise'] = ZoneAwarePromise;
            var symbolThenPatched = __symbol__('thenPatched');
            function patchThen(Ctor) {
                var proto = Ctor.prototype;
                var prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
                if (prop && (prop.writable === false || !prop.configurable)) {
                    // check Ctor.prototype.then propertyDescriptor is writable or not
                    // in meteor env, writable is false, we should ignore such case
                    return;
                }
                var originalThen = proto.then;
                // Keep a reference to the original method.
                proto[symbolThen] = originalThen;
                Ctor.prototype.then = function (onResolve, onReject) {
                    var _this = this;
                    var wrapped = new ZoneAwarePromise(function (resolve, reject) {
                        originalThen.call(_this, resolve, reject);
                    });
                    return wrapped.then(onResolve, onReject);
                };
                Ctor[symbolThenPatched] = true;
            }
            api.patchThen = patchThen;
            function zoneify(fn) {
                return function (self, args) {
                    var resultPromise = fn.apply(self, args);
                    if (resultPromise instanceof ZoneAwarePromise) {
                        return resultPromise;
                    }
                    var ctor = resultPromise.constructor;
                    if (!ctor[symbolThenPatched]) {
                        patchThen(ctor);
                    }
                    return resultPromise;
                };
            }
            if (NativePromise) {
                patchThen(NativePromise);
                patchMethod(global, 'fetch', function (delegate) { return zoneify(delegate); });
            }
            // This is not part of public API, but it is useful for tests, so we expose it.
            Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
            return ZoneAwarePromise;
        });
    }
    function patchToString(Zone) {
        // override Function.prototype.toString to make zone.js patched function
        // look like native function
        Zone.__load_patch('toString', function (global) {
            // patch Func.prototype.toString to let them look like native
            var originalFunctionToString = Function.prototype.toString;
            var ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
            var PROMISE_SYMBOL = zoneSymbol('Promise');
            var ERROR_SYMBOL = zoneSymbol('Error');
            var newFunctionToString = function toString() {
                if (typeof this === 'function') {
                    var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
                    if (originalDelegate) {
                        if (typeof originalDelegate === 'function') {
                            return originalFunctionToString.call(originalDelegate);
                        }
                        else {
                            return Object.prototype.toString.call(originalDelegate);
                        }
                    }
                    if (this === Promise) {
                        var nativePromise = global[PROMISE_SYMBOL];
                        if (nativePromise) {
                            return originalFunctionToString.call(nativePromise);
                        }
                    }
                    if (this === Error) {
                        var nativeError = global[ERROR_SYMBOL];
                        if (nativeError) {
                            return originalFunctionToString.call(nativeError);
                        }
                    }
                }
                return originalFunctionToString.call(this);
            };
            newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
            Function.prototype.toString = newFunctionToString;
            // patch Object.prototype.toString to let them look like native
            var originalObjectToString = Object.prototype.toString;
            var PROMISE_OBJECT_TO_STRING = '[object Promise]';
            Object.prototype.toString = function () {
                if (typeof Promise === 'function' && this instanceof Promise) {
                    return PROMISE_OBJECT_TO_STRING;
                }
                return originalObjectToString.call(this);
            };
        });
    }
    function patchCallbacks(api, target, targetName, method, callbacks) {
        var symbol = Zone.__symbol__(method);
        if (target[symbol]) {
            return;
        }
        var nativeDelegate = (target[symbol] = target[method]);
        target[method] = function (name, opts, options) {
            if (opts && opts.prototype) {
                callbacks.forEach(function (callback) {
                    var source = "".concat(targetName, ".").concat(method, "::") + callback;
                    var prototype = opts.prototype;
                    // Note: the `patchCallbacks` is used for patching the `document.registerElement` and
                    // `customElements.define`. We explicitly wrap the patching code into try-catch since
                    // callbacks may be already patched by other web components frameworks (e.g. LWC), and they
                    // make those properties non-writable. This means that patching callback will throw an error
                    // `cannot assign to read-only property`. See this code as an example:
                    // https://github.com/salesforce/lwc/blob/master/packages/@lwc/engine-core/src/framework/base-bridge-element.ts#L180-L186
                    // We don't want to stop the application rendering if we couldn't patch some
                    // callback, e.g. `attributeChangedCallback`.
                    try {
                        if (prototype.hasOwnProperty(callback)) {
                            var descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
                            if (descriptor && descriptor.value) {
                                descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
                                api._redefineProperty(opts.prototype, callback, descriptor);
                            }
                            else if (prototype[callback]) {
                                prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
                            }
                        }
                        else if (prototype[callback]) {
                            prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
                        }
                    }
                    catch (_a) {
                        // Note: we leave the catch block empty since there's no way to handle the error related
                        // to non-writable property.
                    }
                });
            }
            return nativeDelegate.call(target, name, opts, options);
        };
        api.attachOriginToPatched(target[method], nativeDelegate);
    }
    function patchUtil(Zone) {
        Zone.__load_patch('util', function (global, Zone, api) {
            // Collect native event names by looking at properties
            // on the global namespace, e.g. 'onclick'.
            var eventNames = getOnEventNames(global);
            api.patchOnProperties = patchOnProperties;
            api.patchMethod = patchMethod;
            api.bindArguments = bindArguments;
            api.patchMacroTask = patchMacroTask;
            // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS`
            // to define which events will not be patched by `Zone.js`. In newer version (>=0.9.0), we
            // change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep the name consistent with
            // angular repo. The  `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be
            // supported for backwards compatibility.
            var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
            var SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
            if (global[SYMBOL_UNPATCHED_EVENTS]) {
                global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
            }
            if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
                Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
                    global[SYMBOL_BLACK_LISTED_EVENTS];
            }
            api.patchEventPrototype = patchEventPrototype;
            api.patchEventTarget = patchEventTarget;
            api.isIEOrEdge = isIEOrEdge;
            api.ObjectDefineProperty = ObjectDefineProperty;
            api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
            api.ObjectCreate = ObjectCreate;
            api.ArraySlice = ArraySlice;
            api.patchClass = patchClass;
            api.wrapWithCurrentZone = wrapWithCurrentZone;
            api.filterProperties = filterProperties;
            api.attachOriginToPatched = attachOriginToPatched;
            api._redefineProperty = Object.defineProperty;
            api.patchCallbacks = patchCallbacks;
            api.getGlobalObjects = function () { return ({
                globalSources: globalSources,
                zoneSymbolEventNames: zoneSymbolEventNames,
                eventNames: eventNames,
                isBrowser: isBrowser,
                isMix: isMix,
                isNode: isNode,
                TRUE_STR: TRUE_STR,
                FALSE_STR: FALSE_STR,
                ZONE_SYMBOL_PREFIX: ZONE_SYMBOL_PREFIX,
                ADD_EVENT_LISTENER_STR: ADD_EVENT_LISTENER_STR,
                REMOVE_EVENT_LISTENER_STR: REMOVE_EVENT_LISTENER_STR,
            }); };
        });
    }
    function patchCommon(Zone) {
        patchPromise(Zone);
        patchToString(Zone);
        patchUtil(Zone);
    }
    var Zone$1 = loadZone();
    patchCommon(Zone$1);
    patchBrowser(Zone$1);
}));
T[x`	,(֓"͓	"copySymbolProperties(src, dest) {
QObject.getOwnPropertySymbols !a>>Os = Object.getOwnPropertySymbols(src);
        symbols.forEach(function (symbol1Object.gsrc, symbol%dest, symbol
B
src[symbolAset:/(^*desc && (!desc.writable || typeof desc.set "3if src[symbol] is not writable or not have a setter&2src[symbol]~desc ? desc.enumerable h!desc ? desc.configurable : true,
Q4var shouldCopySymbolPropertiesOsetShouldCopySymbolProperties(flag) {
        shouldCopySymbolProperties = flag!i0OhouldCopySymbolProperti!*copySymbolProperties(delegate, proto[name]a.!d

.d/MiQ4l	scheduleMicroTask<b͗m1ѷ`bq1Q 
m	#C2-2]3Z" asα3%73(i7d
	y`EventsH$EventEmitterP._// For EventEmitter
            var EE_ADD_LISTENER = 'addListener';
            var EE_PREPEND'b    var EE_REMOVE_LISTENER = 'removeListener';
            var EE_REMOVE_ALL_LISTENER = 'removeAll    var EE_LISTENERS = 'l4    var EE_ON = 'on';
            var EE_OFF = 'off'^(Ier  || task.callback.listener === daLocO:l
eO@@.e02-K"e''\$e7eventName.toString().replace('(', '_').replace(')', '_'a=	,EventEmitterMethods(obj	,result = patchEventTarget(global, api, [obj]
`useGadd: EE_ADD_LISTENER1	rm: EE_REMOVE_LISTENER1	end: EE_PREPEND_LISTENER1	rmAll: EE_REMOVE_ALL_LISTENER1	I	: EE_LISTENERS1	chkDuprtdiff:an6	ToString: eventNameToString,
$^result && result[0M`obj[EE_ON] = obj[EE_ADD obj[EE_OFF] = obj[EE_REMOVE 
d// EventEmitterIs;
"events = require('events0#- if (events && events.EventEmitte+P3p}#EmitterMethods(events.EventEmitter.A#pSFsH$fO/gvar fs;
"fs = require('fs0#-if (!fs)>
2// watch, watchFile, unwatchFile has been patched
߰dEventEmitter has been patched
            var TO_PATCH_MACROTASK_METHODS = [
                'access
appendFilechmodchowncloseexistsfchmodfchown	fdatasyncfstafsync	ftruncatefutimeslchmodlchownlutimeslinklstamkdirmkdtempopenopendirreadreaddirreadFilereadlinkrealpathrenamermdirstasymlinktruncateunlinkutimeswrite	writeFile>writev',
            ];
            TO_PATCH_MACROTASK_METHODS+!C!!fs[name] && typeof fs[name] === 'function'; }).forEach(function (P3MacroTask(fs, name,v%n`name: 'fs.' + n`$-cbIdx: args.length > 0 ? args.length - 1 : -11	`%^6,realpathOriginalDelegate = (_a = fs.realpath|'*api.sm;
Bmethod that should be additionally patched because the previous
            // `patchMacroTask` has overridden the `realpath` function and its `native` property.
            if (realpathOriginalDelegate === null || realpathOriginalDelegate === void 0 ? v$oid 0 : realpathOriginalDelegate.nat3fs.realpath.native = realpathOriginalDelegate.nativP3 MacroTask(fs.realpath, 'native',vpQ` %-cbIdx: args.length > 0 ? args.length - 1 : -11	name: 'fs.realpath.native',
 }!SNodeH(node_I2.^	I#setShouldCopySymbolProperties(true)4var set = 'set';
Вa"Node(Zone) {
        patchNodeUtilSEventsSFs(Zonenode_`0Timers
            var globalUseTimeoutFromTimeryTimers = require('timers1WAglobalEqualTimersTimeout = global.setTimeout === timers.setTimeouK"globalEqualTimersTimeout && !isMix!<1. if isMix, then we are in mix environment such as Electrona#
/only patch timers.setTimeout because global.set+r// have been patch#82. if global.setTimeout not equal timers.setTimeout, che[`-hether global.setTimeout use timers.setTimeou ?r$riginSetTimeout_1 = timers.setTimeou`timers.setTimeoutѷ&>tUseTimeoutFromTimerw@)e.8SetTimeout_1qd6detectTimeout = global.setTimeout(function () { }, 100clearTimeout(detectTimeout$timers.setTimeout = originSetTimeout`r 
P3imer(timers&0P3imer(timers='0P3imer(timersu$0#-
_xD// timers module not exists, for example, when we using nativeScriptimers is not availableqisMix	,we are in mix environment, such as Electron,-e global.setTimeout has already been patched,"so we just patch timers.setTimeout>
if (!globalUseTimeoutFromTime+0// 1. global setTimeout equals timers setTimeoutS2. or global don't use timers setTimeout(maybe some other library patch setTimeout)I3. or load timers module error happens, we should patch global setTimeout?3=?0P3=?%0P3=?0#U/// global use timers setTimeout, but not equals:is happens when use nodejs v0.10.x, global setTimeout will,use a lazy load version of timers setTimeout#double patch timer's setTimeout/so we only store the __symbol__ for consistency-t1Zone.__symbol__('setTimeout')] = global.setTimeou>t5Zone.__symbol__('setInterval')] = global.setInterval;-t3Zone.__symbol__('setImmediate')] = global.setImmedi@ // patch process related methods
nextTick',QM<	nextTick as mi!#patchMicroTask(process, 'nextTick',v%0nname: 'process.nextTick'1	 @cbIdx: args.length > 0 && typeof args[0] === 'function' ? 0 : -11	: proces_]handleUnhandledPromiseRejectionP.
Zone[api.s=cess)#Rejection');
            Zone[api.s[4cessHandled?cessafprocesM!Eproces8|ptName === 'unhandledReje8&		.rejection, e.pa3@)UevtName === 'rejectionHands$		.pa3@) p.p	// Cryptocrypto',Qcrypto;
"crypto = require('crypto0#-H// use the generic patchMacroTask to patch crypto
            if (crypto	&methodNames = ['randomBytes', 'pbkdf2'methodNames.forEach(function (P3MacroTask(crypto, name,v%Pn@)name: 'crypto.' + n0\cbIdx: args.length > 0 && typeof args[args.length - 1] === 'function' ? args.length - 1 : -11		 crypto1	`_)consoleP'consoleMethods = [
                'dirloginfoerrorwarnasserdebugtimeEndEtrace',
            ];
            consoleMethods.forEach(function (m	<2Method = (console[Zone.__symbol__(m)] = console[m]!^originalMethoA`	console[mqG"@)args = ArraySlice.call(U^k === Zone.roo!!e.8Method.apply(this`Uo#e4.root.run(originalMethod, this` d!^crollupMain() {
        var Zone = loadZone();
        patchNode(Zone); // Node needs to come first.SB4;
    }
    rollupMain();
}));
xp"use strict";var __assign=this&&this.__assign||function(){return __assign=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},__assign.apply(this,arguments)};
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){var e=globalThis;function t(t){return(e.__Zone_symbol_prefix||"__zone_symbol__")+t}function n(){var n=e.performance;function r(e){n&&n.mark&&n.mark(e)}function o(e,t){n&&n.measure&&n.measure(e,t)}r("Zone");var a,i=function(){function n(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new c(this,this._parent&&this._parent._zoneDelegate,t)}return n.assertZonePatched=function(){if(e.Promise!==D.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(n,"root",{get:function(){for(var e=n.current;e.parent;)e=e.parent;return e},enumerable:!1,configurable:!0}),Object.defineProperty(n,"current",{get:function(){return C.zone},enumerable:!1,configurable:!0}),Object.defineProperty(n,"currentTask",{get:function(){return j},enumerable:!1,configurable:!0}),n.__load_patch=function(a,i,s){if(void 0===s&&(s=!1),D.hasOwnProperty(a)){var c=!0===e[t("forceDuplicateZoneCheck")];if(!s&&c)throw Error("Already loaded patch: "+a)}else if(!e["__Zone_disable_"+a]){var u="Zone:"+a;r(u),D[a]=i(e,n,O),o(u,u)}},Object.defineProperty(n.prototype,"parent",{get:function(){return this._parent},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),n.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},n.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},n.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},n.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},n.prototype.run=function(e,t,n,r){C={parent:C,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{C=C.parent}},n.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),C={parent:C,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{C=C.parent}},n.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||k).name+"; Execution: "+this.name+")");var r=e,o=e.type,a=e.data,i=void 0===a?{}:a,s=i.isPeriodic,c=void 0!==s&&s,u=i.isRefreshable,l=void 0!==u&&u;if(e.state!==y||o!==Z&&o!==P){var f=e.state!=b;f&&r._transitionTo(b,m);var h=j;j=r,C={parent:C,zone:this};try{o!=P||!e.data||c||l||(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,r,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{var p=e.state;if(p!==y&&p!==w)if(o==Z||c||l&&p===T)f&&r._transitionTo(m,b,T);else{var v=r._zoneDelegates;this._updateTaskCount(r,-1),f&&r._transitionTo(y,b,y),l&&(r._zoneDelegates=v)}C=C.parent,j=h}}},n.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to ".concat(this.name," which is descendants of the original zone ").concat(e.zone.name));t=t.parent}e._transitionTo(T,y);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(w,T,y),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==T&&e._transitionTo(m,T),e},n.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new u(S,e,t,n,r,void 0))},n.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new u(P,e,t,n,r,o))},n.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new u(Z,e,t,n,r,o))},n.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||k).name+"; Execution: "+this.name+")");if(e.state===m||e.state===b){e._transitionTo(E,m,b);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(w,E),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(y,E),e.runCount=-1,e}},n.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},n.__symbol__=t,n}(),s={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,a){return e.invokeTask(n,r,o,a)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},c=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this._zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this._zone:t._forkCurrZone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this._zone:t._interceptCurrZone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this._zone:t._invokeCurrZone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this._zone:t._handleErrorCurrZone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this._zone:t._scheduleTaskCurrZone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this._zone:t._invokeTaskCurrZone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this._zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var r=n&&n.onHasTask;(r||t&&t._hasTaskZS)&&(this._hasTaskZS=r?n:s,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,n.onScheduleTask||(this._scheduleTaskZS=s,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this._zone),n.onInvokeTask||(this._invokeTaskZS=s,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this._zone),n.onCancelTask||(this._cancelTaskZS=s,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this._zone))}return Object.defineProperty(e.prototype,"zone",{get:function(){return this._zone},enumerable:!1,configurable:!0}),e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new i(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,o){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,r,o):t.apply(n,r)},e.prototype.handleError=function(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)},e.prototype.scheduleTask=function(e,t){var n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),(n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t))||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=S)throw new Error("Task is missing scheduleFn.");_(t)}return n},e.prototype.invokeTask=function(e,t,n,r){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,r):t.callback.apply(n,r)},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n},e.prototype.hasTask=function(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],o=n[e]=r+t;if(o<0)throw new Error("More tasks executed then were scheduled.");0!=r&&0!=o||this.hasTask(this._zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})},e}(),u=function(){function t(n,r,o,a,i,s){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=a,this.scheduleFn=i,this.cancelFn=s,!o)throw new Error("callback is not defined");this.callback=o;var c=this;this.invoke=n===Z&&a&&a.useG?t.invokeTask:function(){return t.invokeTask.call(e,c,this,arguments)}}return t.invokeTask=function(e,t,n){e||(e=this),z++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==z&&g(),z--}},Object.defineProperty(t.prototype,"zone",{get:function(){return this._zone},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return this._state},enumerable:!1,configurable:!0}),t.prototype.cancelScheduleRequest=function(){this._transitionTo(y,T)},t.prototype._transitionTo=function(e,t,n){if(this._state!==t&&this._state!==n)throw new Error("".concat(this.type," '").concat(this.source,"': can not transition to '").concat(e,"', expecting state '").concat(t,"'").concat(n?" or '"+n+"'":"",", was '").concat(this._state,"'."));this._state=e,e==y&&(this._zoneDelegates=null)},t.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},t.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},t}(),l=t("setTimeout"),f=t("Promise"),h=t("then"),p=[],v=!1;function d(t){if(a||e[f]&&(a=e[f].resolve(0)),a){var n=a[h];n||(n=a.then),n.call(a,t)}else e[l](t,0)}function _(e){0===z&&0===p.length&&d(g),e&&p.push(e)}function g(){if(!v){for(v=!0;p.length;){var e=p;p=[];for(var t=0;t<e.length;t++){var n=e[t];try{n.zone.runTask(n,null,null)}catch(e){O.onUnhandledError(e)}}}O.microtaskDrainDone(),v=!1}}var k={name:"NO ZONE"},y="notScheduled",T="scheduling",m="scheduled",b="running",E="canceling",w="unknown",S="microTask",P="macroTask",Z="eventTask",D={},O={symbol:t,currentZoneFrame:function(){return C},onUnhandledError:R,microtaskDrainDone:R,scheduleMicroTask:_,showUncaughtError:function(){return!i[t("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:R,patchMethod:function(){return R},bindArguments:function(){return[]},patchThen:function(){return R},patchMacroTask:function(){return R},patchEventPrototype:function(){return R},isIEOrEdge:function(){return!1},getGlobalObjects:function(){},ObjectDefineProperty:function(){return R},ObjectGetOwnPropertyDescriptor:function(){},ObjectCreate:function(){},ArraySlice:function(){return[]},patchClass:function(){return R},wrapWithCurrentZone:function(){return R},filterProperties:function(){return[]},attachOriginToPatched:function(){return R},_redefineProperty:function(){return R},patchCallbacks:function(){return R},nativeScheduleMicroTask:d},C={parent:null,zone:new i(null,null)},j=null,z=0;function R(){}return o("Zone","Zone"),i}var r=Object.getOwnPropertyDescriptor,o=Object.defineProperty,a=Object.getPrototypeOf,i=Object.create,s=Array.prototype.slice,c="addEventListener",u="removeEventListener",l=t(c),f=t(u),h="true",p="false",v=t("");function d(e,t){return Zone.current.wrap(e,t)}function _(e,t,n,r,o){return Zone.current.scheduleMacroTask(e,t,n,r,o)}var g=t,k="undefined"!=typeof window,y=k?window:void 0,T=k&&y||globalThis;function m(e,t){for(var n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=d(e[n],t+"_"+n));return e}function b(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}var E="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,w=!("nw"in T)&&void 0!==T.process&&"[object process]"===T.process.toString(),S=!w&&!E&&!(!k||!y.HTMLElement),P=void 0!==T.process&&"[object process]"===T.process.toString()&&!E&&!(!k||!y.HTMLElement),Z={},D=g("enable_beforeunload"),O=function(e){if(e=e||T.event){var t=Z[e.type];t||(t=Z[e.type]=g("ON_PROPERTY"+e.type));var n,r=this||e.target||T,o=r[t];return S&&r===y&&"error"===e.type?!0===(n=o&&o.call(this,e.message,e.filename,e.lineno,e.colno,e.error))&&e.preventDefault():(n=o&&o.apply(this,arguments),"beforeunload"===e.type&&T[D]&&"string"==typeof n?e.returnValue=n:null==n||n||e.preventDefault()),n}};function C(e,t,n){var a=r(e,t);if(!a&&n&&r(n,t)&&(a={enumerable:!0,configurable:!0}),a&&a.configurable){var i=g("on"+t+"patched");if(!e.hasOwnProperty(i)||!e[i]){delete a.writable,delete a.value;var s=a.get,c=a.set,u=t.slice(2),l=Z[u];l||(l=Z[u]=g("ON_PROPERTY"+u)),a.set=function(t){var n=this;n||e!==T||(n=T),n&&("function"==typeof n[l]&&n.removeEventListener(u,O),null==c||c.call(n,null),n[l]=t,"function"==typeof t&&n.addEventListener(u,O,!1))},a.get=function(){var n=this;if(n||e!==T||(n=T),!n)return null;var r=n[l];if(r)return r;if(s){var o=s.call(this);if(o)return a.set.call(this,o),"function"==typeof n.removeAttribute&&n.removeAttribute(t),o}return null},o(e,t,a),e[i]=!0}}}function j(e,t,n){if(t)for(var r=0;r<t.length;r++)C(e,"on"+t[r],n);else{var o=[];for(var a in e)"on"==a.slice(0,2)&&o.push(a);for(var i=0;i<o.length;i++)C(e,o[i],n)}}var z=g("originalInstance");function R(e){var t=T[e];if(t){T[g(e)]=t,T[e]=function(){var n=m(arguments,e);switch(n.length){case 0:this[z]=new t;break;case 1:this[z]=new t(n[0]);break;case 2:this[z]=new t(n[0],n[1]);break;case 3:this[z]=new t(n[0],n[1],n[2]);break;case 4:this[z]=new t(n[0],n[1],n[2],n[3]);break;default:throw new Error("Arg list too long.")}},N(T[e],t);var n,r=new t((function(){}));for(n in r)"XMLHttpRequest"===e&&"responseBlob"===n||function(t){"function"==typeof r[t]?T[e].prototype[t]=function(){return this[z][t].apply(this[z],arguments)}:o(T[e].prototype,t,{set:function(n){"function"==typeof n?(this[z][t]=d(n,e+"."+t),N(this[z][t],n)):this[z][t]=n},get:function(){return this[z][t]}})}(n);for(n in t)"prototype"!==n&&t.hasOwnProperty(n)&&(T[e][n]=t[n])}}function I(e,t,n){for(var o=e;o&&!o.hasOwnProperty(t);)o=a(o);!o&&e[t]&&(o=e);var i=g(t),s=null;if(o&&(!(s=o[i])||!o.hasOwnProperty(i))&&(s=o[i]=o[t],b(o&&r(o,t)))){var c=n(s,i,t);o[t]=function(){return c(this,arguments)},N(o[t],s)}return s}function M(e,t,n){var r=null;function o(e){var t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},r.apply(t.target,t.args),e}r=I(e,t,(function(e){return function(t,r){var a=n(t,r);return a.cbIdx>=0&&"function"==typeof r[a.cbIdx]?_(a.name,r[a.cbIdx],a,o):e.apply(t,r)}}))}function N(e,t){e[g("OriginalDelegate")]=t}var A=!1,L=!1;function H(){if(A)return L;A=!0;try{var e=y.navigator.userAgent;-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(L=!0)}catch(e){}return L}function x(e){return"function"==typeof e}function F(e){return"number"==typeof e}var q={useG:!0},G={},W={},B=new RegExp("^"+v+"(\\w+)(true|false)$"),U=g("propagationStopped");function V(e,t){var n=(t?t(e):e)+p,r=(t?t(e):e)+h,o=v+n,a=v+r;G[e]={},G[e][p]=o,G[e][h]=a}function X(e,t,n,r){var o=r&&r.add||c,i=r&&r.rm||u,s=r&&r.listeners||"eventListeners",l=r&&r.rmAll||"removeAllListeners",f=g(o),d="."+o+":",_="prependListener",k="."+_+":",y=function(e,t,n){if(!e.isRemoved){var r,o=e.callback;"object"==typeof o&&o.handleEvent&&(e.callback=function(e){return o.handleEvent(e)},e.originalDelegate=o);try{e.invoke(e,t,[n])}catch(e){r=e}var a=e.options;return a&&"object"==typeof a&&a.once&&t[i].call(t,n.type,e.originalDelegate?e.originalDelegate:e.callback,a),r}};function T(n,r,o){if(r=r||e.event){var a=n||r.target||e,i=a[G[r.type][o?h:p]];if(i){var s=[];if(1===i.length)(l=y(i[0],a,r))&&s.push(l);else for(var c=i.slice(),u=0;u<c.length&&(!r||!0!==r[U]);u++){var l;(l=y(c[u],a,r))&&s.push(l)}if(1===s.length)throw s[0];var f=function(e){var n=s[e];t.nativeScheduleMicroTask((function(){throw n}))};for(u=0;u<s.length;u++)f(u)}}}var m=function(e){return T(this,e,!1)},b=function(e){return T(this,e,!0)};function E(t,n){if(!t)return!1;var r=!0;n&&void 0!==n.useG&&(r=n.useG);var c=n&&n.vh,u=!0;n&&void 0!==n.chkDup&&(u=n.chkDup);var y=!1;n&&void 0!==n.rt&&(y=n.rt);for(var T=t;T&&!T.hasOwnProperty(o);)T=a(T);if(!T&&t[o]&&(T=t),!T)return!1;if(T[f])return!1;var E,S=n&&n.eventNameToString,P={},Z=T[f]=T[o],D=T[g(i)]=T[i],O=T[g(s)]=T[s],C=T[g(l)]=T[l];n&&n.prepend&&(E=T[g(n.prepend)]=T[n.prepend]);var j=r?function(e){if(!P.isExisting)return Z.call(P.target,P.eventName,P.capture?b:m,P.options)}:function(e){return Z.call(P.target,P.eventName,e.invoke,P.options)},z=r?function(e){if(!e.isRemoved){var t=G[e.eventName],n=void 0;t&&(n=t[e.capture?h:p]);var r=n&&e.target[n];if(r)for(var o=0;o<r.length;o++)if(r[o]===e){r.splice(o,1),e.isRemoved=!0,e.removeAbortListener&&(e.removeAbortListener(),e.removeAbortListener=null),0===r.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return D.call(e.target,e.eventName,e.capture?b:m,e.options)}:function(e){return D.call(e.target,e.eventName,e.invoke,e.options)},R=(null==n?void 0:n.diff)||function(e,t){var n=typeof t;return"function"===n&&e.callback===t||"object"===n&&e.originalDelegate===t},I=Zone[g("UNPATCHED_EVENTS")],M=e[g("PASSIVE_EVENTS")],A=function(t,o,a,i,s,l){return void 0===s&&(s=!1),void 0===l&&(l=!1),function(){var f=this||e,v=arguments[0];n&&n.transferEventName&&(v=n.transferEventName(v));var d=arguments[1];if(!d)return t.apply(this,arguments);if(w&&"uncaughtException"===v)return t.apply(this,arguments);var _=!1;if("function"!=typeof d){if(!d.handleEvent)return t.apply(this,arguments);_=!0}if(!c||c(t,d,f,arguments)){var g=!!M&&-1!==M.indexOf(v),k=function n(e){if("object"==typeof e&&null!==e){var t=__assign({},e);return e.signal&&(t.signal=e.signal),t}return e}(function e(t,n){return n?"boolean"==typeof t?{capture:t,passive:!0}:t?"object"==typeof t&&!1!==t.passive?__assign(__assign({},t),{passive:!0}):t:{passive:!0}:t}(arguments[2],g)),y=null==k?void 0:k.signal;if(!(null==y?void 0:y.aborted)){if(I)for(var T=0;T<I.length;T++)if(v===I[T])return g?t.call(f,v,d,k):t.apply(this,arguments);var m=!!k&&("boolean"==typeof k||k.capture),b=!(!k||"object"!=typeof k)&&k.once,E=Zone.current,Z=G[v];Z||(V(v,S),Z=G[v]);var D,O=Z[m?h:p],C=f[O],j=!1;if(C){if(j=!0,u)for(T=0;T<C.length;T++)if(R(C[T],d))return}else C=f[O]=[];var z=f.constructor.name,N=W[z];N&&(D=N[v]),D||(D=z+o+(S?S(v):v)),P.options=k,b&&(P.options.once=!1),P.target=f,P.capture=m,P.eventName=v,P.isExisting=j;var A=r?q:void 0;A&&(A.taskData=P),y&&(P.options.signal=void 0);var L=E.scheduleEventTask(D,d,A,a,i);if(y){P.options.signal=y;var H=function(){return L.zone.cancelTask(L)};t.call(y,"abort",H,{once:!0}),L.removeAbortListener=function(){return y.removeEventListener("abort",H)}}return P.target=null,A&&(A.taskData=null),b&&(P.options.once=!0),"boolean"!=typeof L.options&&(L.options=k),L.target=f,L.capture=m,L.eventName=v,_&&(L.originalDelegate=d),l?C.unshift(L):C.push(L),s?f:void 0}}}};return T[o]=A(Z,d,j,z,y),E&&(T[_]=A(E,k,(function(e){return E.call(P.target,P.eventName,e.invoke,P.options)}),z,y,!0)),T[i]=function(){var t=this||e,r=arguments[0];n&&n.transferEventName&&(r=n.transferEventName(r));var o=arguments[2],a=!!o&&("boolean"==typeof o||o.capture),i=arguments[1];if(!i)return D.apply(this,arguments);if(!c||c(D,i,t,arguments)){var s,u=G[r];u&&(s=u[a?h:p]);var l=s&&t[s];if(l)for(var f=0;f<l.length;f++){var d=l[f];if(R(d,i))return l.splice(f,1),d.isRemoved=!0,0===l.length&&(d.allRemoved=!0,t[s]=null,a||"string"!=typeof r||(t[v+"ON_PROPERTY"+r]=null)),d.zone.cancelTask(d),y?t:void 0}return D.apply(this,arguments)}},T[s]=function(){var t=this||e,r=arguments[0];n&&n.transferEventName&&(r=n.transferEventName(r));for(var o=[],a=Y(t,S?S(r):r),i=0;i<a.length;i++){var s=a[i];o.push(s.originalDelegate?s.originalDelegate:s.callback)}return o},T[l]=function(){var t=this||e,r=arguments[0];if(r){n&&n.transferEventName&&(r=n.transferEventName(r));var o=G[r];if(o){var a=t[o[p]],s=t[o[h]];if(a){var c=a.slice();for(v=0;v<c.length;v++)this[i].call(this,r,(u=c[v]).originalDelegate?u.originalDelegate:u.callback,u.options)}if(s)for(c=s.slice(),v=0;v<c.length;v++){var u;this[i].call(this,r,(u=c[v]).originalDelegate?u.originalDelegate:u.callback,u.options)}}}else{for(var f=Object.keys(t),v=0;v<f.length;v++){var d=B.exec(f[v]),_=d&&d[1];_&&"removeListener"!==_&&this[l].call(this,_)}this[l].call(this,"removeListener")}if(y)return this},N(T[o],Z),N(T[i],D),C&&N(T[l],C),O&&N(T[s],O),!0}for(var S=[],P=0;P<n.length;P++)S[P]=E(n[P],r);return S}function Y(e,t){if(!t){var n=[];for(var r in e){var o=B.exec(r),a=o&&o[1];if(a&&(!t||a===t)){var i=e[r];if(i)for(var s=0;s<i.length;s++)n.push(i[s])}}return n}var c=G[t];c||(V(t),c=G[t]);var u=e[c[p]],l=e[c[h]];return u?l?u.concat(l):u.slice():l?l.slice():[]}function J(e,t){var n=e.Event;n&&n.prototype&&t.patchMethod(n.prototype,"stopImmediatePropagation",(function(e){return function(t,n){t[U]=!0,e&&e.apply(t,n)}}))}function K(e,t){t.patchMethod(e,"queueMicrotask",(function(e){return function(e,t){Zone.current.scheduleMicroTask("queueMicrotask",t[0])}}))}var $=g("zoneTask");function Q(e,t,n,r){var o=null,a=null;n+=r;var i={};function s(t){var n=t.data;n.args[0]=function(){return t.invoke.apply(this,arguments)};var r=o.apply(e,n.args);return F(r)?n.handleId=r:(n.handle=r,n.isRefreshable=x(r.refresh)),t}function c(t){var n=t.data,r=n.handle;return a.call(e,null!=r?r:n.handleId)}o=I(e,t+=r,(function(n){return function(o,a){var u;if(x(a[0])){var l={isRefreshable:!1,isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?a[1]||0:void 0,args:a},f=a[0];a[0]=function e(){try{return f.apply(this,arguments)}finally{var t=l.handle,n=l.handleId;l.isPeriodic||l.isRefreshable||(n?delete i[n]:t&&(t[$]=null))}};var h=_(t,a[0],l,s,c);if(!h)return h;var p=h.data,v=p.handleId,d=p.handle,g=p.isRefreshable,k=p.isPeriodic;if(v)i[v]=h;else if(d&&(d[$]=h,g&&!k)){var y=d.refresh;d.refresh=function(){var e=h.zone,t=h.state;return"notScheduled"===t?(h._state="scheduled",e._updateTaskCount(h,1)):"running"===t&&(h._state="scheduling"),y.call(this)}}return null!==(u=null!=d?d:v)&&void 0!==u?u:h}return n.apply(e,a)}})),a=I(e,n,(function(t){return function(n,r){var o,a=r[0];F(a)?(o=i[a],delete i[a]):(o=null==a?void 0:a[$])?a[$]=null:o=a,(null==o?void 0:o.type)?o.cancelFn&&o.zone.cancelTask(o):t.apply(e,r)}}))}function ee(e,t){if(!Zone[t.symbol("patchEventTarget")]){for(var n=t.getGlobalObjects(),r=n.eventNames,o=n.zoneSymbolEventNames,a=n.TRUE_STR,i=n.FALSE_STR,s=n.ZONE_SYMBOL_PREFIX,c=0;c<r.length;c++){var u=r[c],l=s+(u+i),f=s+(u+a);o[u]={},o[u][i]=l,o[u][a]=f}var h=e.EventTarget;if(h&&h.prototype)return t.patchEventTarget(e,t,[h&&h.prototype]),!0}}function te(e,t,n){if(!n||0===n.length)return t;var r=n.filter((function(t){return t.target===e}));if(0===r.length)return t;var o=r[0].ignoreProperties;return t.filter((function(e){return-1===o.indexOf(e)}))}function ne(e,t,n,r){e&&j(e,te(e,t,n),r)}function re(e){return Object.getOwnPropertyNames(e).filter((function(e){return e.startsWith("on")&&e.length>2})).map((function(e){return e.substring(2)}))}function oe(e,t){if((!w||P)&&!Zone[e.symbol("patchEvents")]){var n=t.__Zone_ignore_on_properties,r=[];if(S){var o=window;r=r.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]),ne(o,re(o),n?n.concat([]):n,a(o))}r=r.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(var i=0;i<r.length;i++){var s=t[r[i]];(null==s?void 0:s.prototype)&&ne(s.prototype,re(s.prototype),n)}}}function ae(e,t,n,r,o){var a=Zone.__symbol__(r);if(!t[a]){var i=t[a]=t[r];t[r]=function(a,s,c){return s&&s.prototype&&o.forEach((function(t){var o="".concat(n,".").concat(r,"::")+t,a=s.prototype;try{if(a.hasOwnProperty(t)){var i=e.ObjectGetOwnPropertyDescriptor(a,t);i&&i.value?(i.value=e.wrapWithCurrentZone(i.value,o),e._redefineProperty(s.prototype,t,i)):a[t]&&(a[t]=e.wrapWithCurrentZone(a[t],o))}else a[t]&&(a[t]=e.wrapWithCurrentZone(a[t],o))}catch(e){}})),i.call(t,a,s,c)},e.attachOriginToPatched(t[r],i)}}var ie=function se(){var e,r=globalThis,o=!0===r[t("forceDuplicateZoneCheck")];if(r.Zone&&(o||"function"!=typeof r.Zone.__symbol__))throw new Error("Zone already loaded.");return null!==(e=r.Zone)&&void 0!==e||(r.Zone=n()),r.Zone}();!function ce(e){(function t(e){e.__load_patch("ZoneAwarePromise",(function(e,t,n){var r=Object.getOwnPropertyDescriptor,o=Object.defineProperty,a=n.symbol,i=[],s=!1!==e[a("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],c=a("Promise"),u=a("then");n.onUnhandledError=function(e){if(n.showUncaughtError()){var t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=function(){for(var e=function(){var e=i.shift();try{e.zone.runGuarded((function(){if(e.throwOriginal)throw e.rejection;throw e}))}catch(e){!function r(e){n.onUnhandledError(e);try{var r=t[l];"function"==typeof r&&r.call(this,e)}catch(e){}}(e)}};i.length;)e()};var l=a("unhandledPromiseRejectionHandler");function f(e){return e&&"function"==typeof e.then}function h(e){return e}function p(e){return z.reject(e)}var v=a("state"),d=a("value"),_=a("finally"),g=a("parentPromiseValue"),k=a("parentPromiseState"),y=null,T=!0,m=!1;function b(e,t){return function(n){try{P(e,t,n)}catch(t){P(e,!1,t)}}}var E=function(){var e=!1;return function t(n){return function(){e||(e=!0,n.apply(null,arguments))}}},w="Promise resolved with itself",S=a("currentTaskTrace");function P(e,r,a){var c=E();if(e===a)throw new TypeError(w);if(e[v]===y){var u=null;try{"object"!=typeof a&&"function"!=typeof a||(u=a&&a.then)}catch(t){return c((function(){P(e,!1,t)}))(),e}if(r!==m&&a instanceof z&&a.hasOwnProperty(v)&&a.hasOwnProperty(d)&&a[v]!==y)D(a),P(e,a[v],a[d]);else if(r!==m&&"function"==typeof u)try{u.call(a,c(b(e,r)),c(b(e,!1)))}catch(t){c((function(){P(e,!1,t)}))()}else{e[v]=r;var l=e[d];if(e[d]=a,e[_]===_&&r===T&&(e[v]=e[k],e[d]=e[g]),r===m&&a instanceof Error){var f=t.currentTask&&t.currentTask.data&&t.currentTask.data.__creationTrace__;f&&o(a,S,{configurable:!0,enumerable:!1,writable:!0,value:f})}for(var h=0;h<l.length;)O(e,l[h++],l[h++],l[h++],l[h++]);if(0==l.length&&r==m){e[v]=0;var p=a;try{throw new Error("Uncaught (in promise): "+function e(t){return t&&t.toString===Object.prototype.toString?(t.constructor&&t.constructor.name||"")+": "+JSON.stringify(t):t?t.toString():Object.prototype.toString.call(t)}(a)+(a&&a.stack?"\n"+a.stack:""))}catch(e){p=e}s&&(p.throwOriginal=!0),p.rejection=a,p.promise=e,p.zone=t.current,p.task=t.currentTask,i.push(p),n.scheduleMicroTask()}}}return e}var Z=a("rejectionHandledHandler");function D(e){if(0===e[v]){try{var n=t[Z];n&&"function"==typeof n&&n.call(this,{rejection:e[d],promise:e})}catch(e){}e[v]=m;for(var r=0;r<i.length;r++)e===i[r].promise&&i.splice(r,1)}}function O(e,t,n,r,o){D(e);var a=e[v],i=a?"function"==typeof r?r:h:"function"==typeof o?o:p;t.scheduleMicroTask("Promise.then",(function(){try{var r=e[d],o=!!n&&_===n[_];o&&(n[g]=r,n[k]=a);var s=t.run(i,void 0,o&&i!==p&&i!==h?[]:[r]);P(n,!0,s)}catch(e){P(n,!1,e)}}),n)}var C=function(){},j=e.AggregateError,z=function(){function e(t){var n=this;if(!(n instanceof e))throw new Error("Must be an instanceof Promise.");n[v]=y,n[d]=[];try{var r=E();t&&t(r(b(n,T)),r(b(n,m)))}catch(e){P(n,!1,e)}}return e.toString=function(){return"function ZoneAwarePromise() { [native code] }"},e.resolve=function(t){return t instanceof e?t:P(new this(null),T,t)},e.reject=function(e){return P(new this(null),m,e)},e.withResolvers=function(){var t={};return t.promise=new e((function(e,n){t.resolve=e,t.reject=n})),t},e.any=function(t){if(!t||"function"!=typeof t[Symbol.iterator])return Promise.reject(new j([],"All promises were rejected"));var n=[],r=0;try{for(var o=0,a=t;o<a.length;o++)r++,n.push(e.resolve(a[o]))}catch(e){return Promise.reject(new j([],"All promises were rejected"))}if(0===r)return Promise.reject(new j([],"All promises were rejected"));var i=!1,s=[];return new e((function(e,t){for(var o=0;o<n.length;o++)n[o].then((function(t){i||(i=!0,e(t))}),(function(e){s.push(e),0===--r&&(i=!0,t(new j(s,"All promises were rejected")))}))}))},e.race=function(e){var t,n,r=new this((function(e,r){t=e,n=r}));function o(e){t(e)}function a(e){n(e)}for(var i=0,s=e;i<s.length;i++){var c=s[i];f(c)||(c=this.resolve(c)),c.then(o,a)}return r},e.all=function(t){return e.allWithCallback(t)},e.allSettled=function(t){return(this&&this.prototype instanceof e?this:e).allWithCallback(t,{thenCallback:function(e){return{status:"fulfilled",value:e}},errorCallback:function(e){return{status:"rejected",reason:e}}})},e.allWithCallback=function(e,t){for(var n,r,o=new this((function(e,t){n=e,r=t})),a=2,i=0,s=[],c=function(e){f(e)||(e=u.resolve(e));var o=i;try{e.then((function(e){s[o]=t?t.thenCallback(e):e,0===--a&&n(s)}),(function(e){t?(s[o]=t.errorCallback(e),0===--a&&n(s)):r(e)}))}catch(e){r(e)}a++,i++},u=this,l=0,h=e;l<h.length;l++)c(h[l]);return 0==(a-=2)&&n(s),o},Object.defineProperty(e.prototype,Symbol.toStringTag,{get:function(){return"Promise"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,Symbol.species,{get:function(){return e},enumerable:!1,configurable:!0}),e.prototype.then=function(n,r){var o,a=null===(o=this.constructor)||void 0===o?void 0:o[Symbol.species];a&&"function"==typeof a||(a=this.constructor||e);var i=new a(C),s=t.current;return this[v]==y?this[d].push(s,i,n,r):O(this,s,i,n,r),i},e.prototype.catch=function(e){return this.then(null,e)},e.prototype.finally=function(n){var r,o=null===(r=this.constructor)||void 0===r?void 0:r[Symbol.species];o&&"function"==typeof o||(o=e);var a=new o(C);a[_]=_;var i=t.current;return this[v]==y?this[d].push(i,a,n,n):O(this,i,a,n,n),a},e}();z.resolve=z.resolve,z.reject=z.reject,z.race=z.race,z.all=z.all;var R=e[c]=e.Promise;e.Promise=z;var M=a("thenPatched");function N(e){var t=e.prototype,n=r(t,"then");if(!n||!1!==n.writable&&n.configurable){var o=t.then;t[u]=o,e.prototype.then=function(e,t){var n=this;return new z((function(e,t){o.call(n,e,t)})).then(e,t)},e[M]=!0}}return n.patchThen=N,R&&(N(R),I(e,"fetch",(function(e){return function t(e){return function(t,n){var r=e.apply(t,n);if(r instanceof z)return r;var o=r.constructor;return o[M]||N(o),r}}(e)}))),Promise[t.__symbol__("uncaughtPromiseErrors")]=i,z}))})(e),function n(e){e.__load_patch("toString",(function(e){var t=Function.prototype.toString,n=g("OriginalDelegate"),r=g("Promise"),o=g("Error"),a=function a(){if("function"==typeof this){var i=this[n];if(i)return"function"==typeof i?t.call(i):Object.prototype.toString.call(i);if(this===Promise){var s=e[r];if(s)return t.call(s)}if(this===Error){var c=e[o];if(c)return t.call(c)}}return t.call(this)};a[n]=t,Function.prototype.toString=a;var i=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":i.call(this)}}))}(e),function a(e){e.__load_patch("util",(function(e,t,n){var a=re(e);n.patchOnProperties=j,n.patchMethod=I,n.bindArguments=m,n.patchMacroTask=M;var l=t.__symbol__("BLACK_LISTED_EVENTS"),f=t.__symbol__("UNPATCHED_EVENTS");e[f]&&(e[l]=e[f]),e[l]&&(t[l]=t[f]=e[l]),n.patchEventPrototype=J,n.patchEventTarget=X,n.isIEOrEdge=H,n.ObjectDefineProperty=o,n.ObjectGetOwnPropertyDescriptor=r,n.ObjectCreate=i,n.ArraySlice=s,n.patchClass=R,n.wrapWithCurrentZone=d,n.filterProperties=te,n.attachOriginToPatched=N,n._redefineProperty=Object.defineProperty,n.patchCallbacks=ae,n.getGlobalObjects=function(){return{globalSources:W,zoneSymbolEventNames:G,eventNames:a,isBrowser:S,isMix:P,isNode:w,TRUE_STR:h,FALSE_STR:p,ZONE_SYMBOL_PREFIX:v,ADD_EVENT_LISTENER_STR:c,REMOVE_EVENT_LISTENER_STR:u}}}))}(e)}(ie),function ue(e){e.__load_patch("legacy",(function(t){var n=t[e.__symbol__("legacyPatch")];n&&n()})),e.__load_patch("timers",(function(e){var t="set",n="clear";Q(e,t,n,"Timeout"),Q(e,t,n,"Interval"),Q(e,t,n,"Immediate")})),e.__load_patch("requestAnimationFrame",(function(e){Q(e,"request","cancel","AnimationFrame"),Q(e,"mozRequest","mozCancel","AnimationFrame"),Q(e,"webkitRequest","webkitCancel","AnimationFrame")})),e.__load_patch("blocking",(function(e,t){for(var n=["alert","prompt","confirm"],r=0;r<n.length;r++)I(e,n[r],(function(n,r,o){return function(r,a){return t.current.run(n,e,a,o)}}))})),e.__load_patch("EventTarget",(function(e,t,n){!function r(e,t){t.patchEventPrototype(e,t)}(e,n),ee(e,n);var o=e.XMLHttpRequestEventTarget;o&&o.prototype&&n.patchEventTarget(e,n,[o.prototype])})),e.__load_patch("MutationObserver",(function(e,t,n){R("MutationObserver"),R("WebKitMutationObserver")})),e.__load_patch("IntersectionObserver",(function(e,t,n){R("IntersectionObserver")})),e.__load_patch("FileReader",(function(e,t,n){R("FileReader")})),e.__load_patch("on_property",(function(e,t,n){oe(n,e)})),e.__load_patch("customElements",(function(e,t,n){!function r(e,t){var n=t.getGlobalObjects();(n.isBrowser||n.isMix)&&e.customElements&&"customElements"in e&&t.patchCallbacks(t,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"])}(e,n)})),e.__load_patch("XHR",(function(e,t){!function n(e){var n=e.XMLHttpRequest;if(n){var u=n.prototype,h=u[l],p=u[f];if(!h){var v=e.XMLHttpRequestEventTarget;if(v){var d=v.prototype;h=d[l],p=d[f]}}var k="readystatechange",y="scheduled",T=I(u,"open",(function(){return function(e,t){return e[o]=0==t[2],e[s]=t[1],T.apply(e,t)}})),m=g("fetchTaskAborting"),b=g("fetchTaskScheduling"),E=I(u,"send",(function(){return function(e,n){if(!0===t.current[b])return E.apply(e,n);if(e[o])return E.apply(e,n);var r={target:e,url:e[s],isPeriodic:!1,args:n,aborted:!1},a=_("XMLHttpRequest.send",P,r,S,Z);e&&!0===e[c]&&!r.aborted&&a.state===y&&a.invoke()}})),w=I(u,"abort",(function(){return function(e,n){var o=function a(e){return e[r]}(e);if(o&&"string"==typeof o.type){if(null==o.cancelFn||o.data&&o.data.aborted)return;o.zone.cancelTask(o)}else if(!0===t.current[m])return w.apply(e,n)}}))}function S(e){var n=e.data,o=n.target;o[i]=!1,o[c]=!1;var s=o[a];h||(h=o[l],p=o[f]),s&&p.call(o,k,s);var u=o[a]=function(){if(o.readyState===o.DONE)if(!n.aborted&&o[i]&&e.state===y){var r=o[t.__symbol__("loadfalse")];if(0!==o.status&&r&&r.length>0){var a=e.invoke;e.invoke=function(){for(var r=o[t.__symbol__("loadfalse")],i=0;i<r.length;i++)r[i]===e&&r.splice(i,1);n.aborted||e.state!==y||a.call(e)},r.push(e)}else e.invoke()}else n.aborted||!1!==o[i]||(o[c]=!0)};return h.call(o,k,u),o[r]||(o[r]=e),E.apply(o,n.args),o[i]=!0,e}function P(){}function Z(e){var t=e.data;return t.aborted=!0,w.apply(t.target,t.args)}}(e);var r=g("xhrTask"),o=g("xhrSync"),a=g("xhrListener"),i=g("xhrScheduled"),s=g("xhrURL"),c=g("xhrErrorBeforeScheduled")})),e.__load_patch("geolocation",(function(e){e.navigator&&e.navigator.geolocation&&function t(e,n){for(var o=e.constructor.name,a=function(t){var a=n[t],i=e[a];if(i){if(!b(r(e,a)))return"continue";e[a]=function(e){var t=function(){return e.apply(this,m(arguments,o+"."+a))};return N(t,e),t}(i)}},i=0;i<n.length;i++)a(i)}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])})),e.__load_patch("PromiseRejectionEvent",(function(e,t){function n(t){return function(n){Y(e,t).forEach((function(r){var o=e.PromiseRejectionEvent;if(o){var a=new o(t,{promise:n.promise,reason:n.rejection});r.invoke(a)}}))}}e.PromiseRejectionEvent&&(t[g("unhandledPromiseRejectionHandler")]=n("unhandledrejection"),t[g("rejectionHandledHandler")]=n("rejectionhandled"))})),e.__load_patch("queueMicrotask",(function(e,t,n){K(e,n)}))}(ie)}));pbx,i,aPz.&<'O.v"i,a0P.hasOwnProperty(i\\i%i]){var u="Zone:"+i;r(u),P[i]=a(e,n,jz={parent:z'
Gz=zq
Hz={parent:z
z=zq
g|g7i=e.data,a=void 0===i?{}:i,s=a9aX3D&&o!==S(.T);var h=O;O=r,z={parent:z,zone:this};try{o!=S/E)if(o==D||c||l&&p===m)f&&r._transitionTo(T,b,mlz=z.parent,O=h}}5smJzE,m,y),O$:m&&e._transitionTo(T,m),ee:Zd
VDeg3T8w,TZME,w),O$:w`iliaYZC i,a#i,this.scheduleFn=a$jD&&i&&i$|Cr%<C&&k(),C--}=&%m&Ai||e[f]&&(i=e[f].resolve(0)),i){var n=i[h];n||(n=i.then),n.call(i)%C&&0===p.length&&d(k*k*{j.onUnhandledError(e)}}}j* g*#m="scheduling",T+Jw="canceling",E="unknown",Z="microTask",S="macroTask",D="eventTask",P={},jd+.*z},onUnhandledError:I,microtaskDrainDone:I+9a+`IW,Iw,AI,#I,(I-gIn-I-(I.PIn.&I.#I},A?:d},z={parent:null,zone:new a(null,null)},O=null,C=0;function I/a}pc>in/=a=Array.prototype.slice,s="true",c="false",u=t("");function l0-f;0Ah=t,p0/v=p?window:void 0,d=p&&v||globalThis;function _0Cl1var 015g=!("nw"in d)&&void 0!==d1Ad.process.toString(),y=!g&&!k&&!(!p||!v.HTMLElement),m=void 0!==d18d.process.toString()&&!k&&!(!p||!v.HTMLElement),T={},b=h2@w=function(e){if(e=e||d.event){var t=T[e.type];t||(t=T[e.type]=h20d,o=r[t];return y&&r===v=3d[b3S9E(e,t,n){var i=r(e,t);if(!i&&n&&r(n,t)&&(i={enumerable:!0Ai&&i.configurable){var a=h4(;a)||!e[a]){delete i.writable,delete i.value;var s=i.get,c=i5%T[u];l||(l=T[u]=h("ON_PROPERTY"+u)),i:5#d||(n=dd57w5L	w,!1))},i5%d||(n=d6Oim6bi),e[a]=!0}}}function Z6(E7&`i in e)"on"==i.slice(0,2)&&o.push(i);for(var a=0;a<o.length;a++)E(e,o[a],n)}}var S=!1;function D:/i(o);!o&&e[t]&&(o=e);var a=h(t),s=null;if(o&&(!(s=o[a])||!o.hasOwnProperty(a))&&(s=o[a]=o[t],function c(e){return!e||!1!==e.wriK13(o&&r(o,t)))){var u=n(s,a>;.u(this,arguments)},z(o[t],s),S&&function e(t,nQ9QObject.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach((function(enc'(t,e);Pvn,e[e]},set:function(n){(!r||r.writable&&"function"==typeof r.set)&&(t[e]=n)},enumerable:!r||r.enumerable,configurable:!r||r.confi)gurable})}))}(s,o[t])}return s}function P;D(e,t1U Vr){var i=n(t,r);return i.cbIdx>=0&&"function"==typeof r[i.cbIdx]?f(i.name,r[i.cbIdx],i<j;D(e,t1U Ar){var i=n(t,r);return i.cbIdx>=0&&"function"==typeof r[i.cbIdx]?N0icroTask(i.name,r[i.cbIdx],i<,z(e,t){e[h("OriginalDelegate")]=t}function O=(C=!CI={useG:!0},A={},N={},x=new RegExp("^"+u+"(\\w+)(true|false)$"),R=h> M?>c,r=(t?t(e):e)+s,o=u+n,i=u+r;A[e]={},A[e][c]=o,A[e][s]=i}function L(e,t,n,r){var o=r&&r.add||"addEventListener",a=r&&r.rm||"removeEventListener",l>"f>"4p=h(o),v="."+o+":",d="prependListener",_="."+d+":",k<?5i=e.options;return i&&"object"==typeof i&&i.once&&t[a7@Ai),r}};function y@i=n||r.target||e,a=i[A[r.type][o?s:c]];if(a){var u=[];if(1===a.length)(h=k(a[0],i,r))&&u.push(h);else for(var l=a.slice(),f=0;f<l.length&&(!r||!0!==r[R]);f++){var h;(h=k(l[f],i,r))&&u.push(h)}if(1===u.length)throw u[0];var p=function(e){var n=u[e];t.natiA0f=0;f<u.length;f++)p(fA;y(this,e,!1)},T=function(e){return y(this,e,!0)};function bBBAk=n&&n.vh,yBy=n.chkDup);var b=!1;n&&void 0!==n.rt&&(b=n.rt);for(var w=t;w&&!w.hasOwnProperty(o);)w=i(w);if(!w&&t[o]&&(w=t),!w)return!1;if(w[p])return!1;var E,Z<CS={},D=w[p]=w[o],P=w[h(a)]=w[a],j=w[h(l)]=w[l],O=w[h(f)]=w[f];n&&n.prepend&&(E=w[h(n.prepend)]=w[n.prepend]);var C=r?function(eE){if(!S.isExisting)return D.call(S.target,S.eventName,S.capture?T:m,SD2D.call(S.target,S.eventName,e.invoke,S.options)},RhD&AD)s:cDPE%TE"PEFL3FH=Zone[hF-G=e[h("PASSIVE_EVENTS")],U=function(t,o,i,a,uGu&&(uG1hLG'hpN%h));var p=arguments[1];if(!p)return tN#g&&"uncaughtException"===h)return tN'var v=!1;if("function"!=typeof p){if(!p)H,>v=!0}if(!k||k(t,p,f,arguments)){var d=!!G&&-1!==G.indexOf(h),_H$d)),m=null==_?void 0:_.signal;if(!(null==m?void 0:m.aborted)){if(H)for(var T=0;T<H.length;T++)if(h===H[T])return d?t.call(f,h,p,_):tN	var b=!!_N_||_.capture),w=!(!_||"object"!=typeof _)&&_.once,E=Zone.current,D=A[h];D||(M(h,Z),D=A[h]);var P,j=D[b?s:c],z=f[j],O=!1;if(z){if(O=!0,y)for(T=0;T<z.length;T++)if(L(z[T],p))return}else z=f[j]=[];var C=f.constructor.name,x=N[C];x&&(P=x[h]),P||(P=C+o+(Z?Z(h):h)),S.options=_,w&&(S.options.once=!1),S.target=f,S.capture=b,S.eventName=h,S.isExisting=O;var R=r?I:void 0;R&&(R.taskData=S)#,m&&(S.options.signal=void 0);var FLP,p,R,i,a);if(m){S.options.signal=m;var U=function(){return F.zone.cancelTask(F)};t.call(m,"abort",U,{once:!0}),F.removeAbortLiLmL3U)}}return S.target=null,R&&(R.taskData=null),w&&(SM$F.options&&(F.options=_),F.target=f,F.capture=b,F.eventName=h,v&&(F.originalDelegate=p),l?z.unshift(F):z.push(F),u?f:void 0}}}}(;return w[o]=U(D,v,C,R,b),E&&(w[d]=U(E,_1UM7S.target,S.eventName,e.invoke,S.options)}),R,b,!0)),w[a,NpiN'a=arguments[1];if(!a)return PNk||k(P,a,t,arguments)){var l,f=A[r];f&&(l=f[i?s:c]);var h=l&&t[l];if(h)for(var p=0;p<h.length;p++){var v=h[p];if(L(v,a))return ah.splice(p,1),v.isRemoved=!0,0===h.length&&(v.allRemoved=!0,t[l]=null,i||"string"!=typeof r||(t[uO(v.zone.cancelTask(v),b?t:void 0}return P;},w[l,N]:for(var o=[],i=F(t,Z?Z(r):r),a=0;a<i.length;a++){var s=i[aPEw[f,N*BQ?0A[r];if(o){var i=t[o[c]],u=t[o[s]];if(i){var l=iQ%l.length;v++)this[a].call(this,r,(h=loRh.originalDelegate:h.callback,h.options)}if(u)for(l=u.slice(),v=0;v<l.length;v++){var h;this[a].call(this,r,(h=l[v]).originalDe~R9h.originalDelegate:h.callback,h.options)}}}else{for(var pRp.length;v++){var d=x.exec(pR-f].call(this,_)}this[f3S!b)return this},z(w[o],D),z(w[a],P),O&&z(w[f],O),j&&z(w[l],j),!0}for(var w=[],E=0;E<n.length;E++)w[E]=b(n[E],r);return w}function FS,x.exec(r),i=o&&o[1];if(i&&(!t||i===t)){var a=e[r];if(a)for(var u=0;u<a.length;u++)n.push(a[u])}}return n}var l=A[t];l||(M(t),l=XA[t]);var f=e[l[c]],h=e[l[s]];return f?h?f.concat(h):f.slice():h?h.slice():[]}function HzU@G=h("zoneTask");function U(e,t,n,r){var o=null,i=null;n+=r;var aAVzCV-OV<i'W DHW'i){var u;if(O(i~W\i[1]||0:void 0,args:i},h=i[0];iWh;-XMa[n]:t&&(t[G]=null))}};var p=f(t,i[0],l,s,c);if(!p)return p;var v=p.data,d=v.handleId,_=v.handle,k=v.isRefreshable,g=v.isPeriod_ic;if(d)a[d]=p;else if(_&&(_[G]=p,k&&!g)){var y=_.refresh;_.refresh=function(){var e=p.zone,t=pXY!pzY'p,1)):"running"===t&&(pY;2_?_:d)&&void 0!==u?u:p}return n.apply(e,i)}})),i=D%Z-Fi=r[0];C(i)?(o=a[i],delete a[i]):(o=null==i?void 0:i[G])?i[G]=null:o=iZK4var q="set",W="clear";!function V(){var e=function rGb(function o*c#node_}}MZ,n.patchMethod=D,n.bindArguments=_,n.patchMacroTask=P,function r(e){S=e}(!0){'EventEmitter]c%,o="addListener",i="removeListener",ae.callback===t||e.callback.listener===t},s=function(e){return"string"==typeof e?e:e?e.toString().replace("(","_").replace(")","_"):""};try{r=require("events")}catch(e){}r&&r.EventEmitter&&function c(t){var r=L(e,n,[t],{useG:!1,add:o,rm:i,prepend:"prependListener",rmAll:"removeAllListeners",listeners:"listeners",chkDup:!1,rt:!0,diff:a,eventNameToString:s});r&&r[0]&&(t.on=t[o],t.oJff=t[i])}(r.EventEmitter.prototype)}))}(e),function r(e){e.__load_patch("fpc,o;try{o=require("fs")}catch(e){}if(o){["access","appendFile","chmod","chown","close","exists","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchmod","lchown","lutimes","link","lstat","mkdir","mkdtemp","open","opendir","read","readdir","readFile","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","write","writeFile","writev"]\!!o[e]&&"function"==typeof o[e]})).forEach((function(e){P(o,e,(function(t,n){return{name:"fs."+e,args:n,cbIdx:n.length>0?n.length-1:-1,target:t}}))}));var i=null===(r=o.realpath)||void 0===r?void 0:r[n.symbol("OriginalDelegate")];(null==i?void 0:i.native6)&&(o.realpath.native=i.native,P(o.realpath,"native",({args:t,target:e,cbIdx:t.length>0?t.length-1:-1,name:"fs.realpath.native"}})))}}))}(e),e.__load_patch("node_timers",(function(e,t){var n=!1;try{var r=require("timers");if(e.setTimeout!==r.setTimeout&&!m){var o=r.setTimeout;r.setTimeout=function(){return n=!0,3};var i=e.setTimeout((function(){}),100);clearTimeout(i),r.setTimeout=o}U(r,q,W,"Timeout"),U(r,q,W,"Interval"),U(r,q,W,"Immediate")}catch(e){}m||(n?(e[t.__symbol__("setTimeout")]=e.setTimeout,e[t.__symbol__("setInterval")]=e.setInterval,e[t.__symbol__("s\etImmediate")]=e.setImmediate):(U(e,q,W,"Timeout"),U(e,q,W,"Interval"),U(e,q,W,"Immediate")) ,nextTick",(function(){j(process,"nextTick",(`{name:"process.nextTick",args:t,cbIdx:t.length>0&&"function"==typeof t[0]?0:-1,target:process}}) handleU@",(function(e,t,n){function r(e){return function(t){F(process,e).forEach((function(n){"unhandledRejection"===e?n.invoke(t.rejecJtion,t.promise):"rejectionHandled"===e&&n.invoke(t.promise)}))}}t[n.symbol=&"r("unhandledRejection"),t[n.symbol~r("rejectionHandledcrypto",(function(){var e;try{e=require("crypto")}catch(e){}e&&["randomBytes","pbkdf2"].forEach((function(t){P(e,t,(function(n,r){return{name:"crypto."+t,args:r,cbIdx:r.length>0&&"function"==typeof r[r.length-1]?r.length-1:-1,target:e}}))}))})),e.__load_.console",(function(e,t){["dir","log","info","error","warn","assert","debug","timeEnd","trace"].forEach((function(e){var n=console[t.__symbol__(e)]=console[e];n&&(console[e]=function(){var e=a.call(arguments);return t.current===t.root?n.apply(this,e):t.root.run(n,this,e)})}7H(e,n)}))})(e),function i9cui=n.symbol,a=[],s=!1!==e[ic3i("Promise"),u=idYaeea.length;)e()};var l=i=$mf_I.reject(e)}var v=i("state"),d=i("value"),_=i("finally"),k=i("parentPromiseValue"),g=i("parentPromiseState"),y=null,m=!0,T=!1;fKg&#S(e,t,n)}catch(t){S(e,!1,t)}}}var wgaEg Z=ih1S(e,r,i){var c=w();if(e===i)throw new TypeError(Ehh/ i&&"function"!=typeof i||(u=i&&ih%ShgT&&i instanceof I&&i.hasOwnProperty(v)&&i.hasOwnProperty(d)&&i[v]!==y)j(i),S(e,i[v],i[d]);else if(r!==T[i"i~i.Si-1i,e[_]===_&&r===m&&(e[v]=e[g],e[d]=e[k]),r===T&&ijfi,ZtjNzj3T){e[v]=0;var p=iki)+(i&&i.stack?"\n"+ik=i9l3aml.P=il%j(e){if(0===e[v]){try{var n=t[PlRgT;for(var r=0;r<a.length;r++)e===a[r].promise&&a.splice(r,1)}}function z(e,t,n,r,o){j(e);var i=e[v],a=imk]=r,n[g]=i);var s=t.run(a,void 0,o&&a!==p&&a!==h?[]:[r]);S(n,!0,s)}catch(e){S(n,!1,e)}}),n)}var O=function(){},C=e.AggregateError,In(w();t&&t(r(b(n,m)),r(b(n,T)))}catch(e){SSoS(new this(null),mo!S(new this(null),T$pC}q"qi=t;o<i1q!iSq)C}qFC}q";var aqWa||(aHr-a=!0,t(new Cr3i(e){n(e)}for(var a=0,s=e;a<s.length;a++){var c=s[a:s%i`sgi=2,at3au:i;u7$i&&n(s)):r(e)}))}catch(e){r(e)}i++,au5iuivBi&&"function"==typeof i||(i>w	a=new i(Oaw/a,n,r):z(this,s,a,n,r),awi=new o(O);i[_]=_;var ax*a,i,n,n):z(this,a,i,n,n),i},e}();I.resolve=I.resolve,I.reject=I.reject,I.race=I.race,I.all=I.all;var A=e[c]=e.Promise;e.Promise$=I;var N=i("thenPatched");function xRyIy.&N]=!0}}return n.patchThen=x,A&&(x(A),D<zeIz'N]||xz>a,I}))}(e),function s"{O>h("OriginalDelegate"),r=h("Promise"),o=h("Error"),i=function i{#a=this[n];if(a{
a?t.call(ak!a&|~i|"i;var a|a.call(this)}}))}(e)}()}));&>x8"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){!function t(n){n.__load_patch("canvas",(function(t,n,o){var e=t.HTMLCanvasElement;void 0!==e&&e.prototype&&e.prototype.toBlob&&o.patchMacroTask(e.prototype,"toBlob",(function(t,n){return{name:"HTMLCanvasElement.toBlob",target:t,cbIdx:0,args:n}}))}))}(Zone)}));x'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchCordova(Zone) {
        Zone.__load_patch('cordova', function (global, Zone, api) {
            if (global.cordova) {
                var SUCCESS_SOURCE_1 = 'cordova.exec.success';
                var ERROR_SOURCE_1 = 'cordova.exec.error';
                var FUNCTION_1 = 'function';
                var nativeExec_1 = api.patchMethod(global.cordova, 'exec', function () { return function (self, args) {
                    if (args.length > 0 && typeof args[0] === FUNCTION_1) {
                        args[0] = Zone.current.wrap(args[0], SUCCESS_SOURCE_1);
                    }
                    if (args.length > 1 && typeof args[1] === FUNCTION_1) {
                        args[1] = Zone.current.wrap(args[1], ERROR_SOURCE_1);
                    }
                    return nativeExec_1.apply(self, args);
                }; });
            }
        });
        Zone.__load_patch('cordova.FileReader', function (global, Zone) {
            if (global.cordova && typeof global['FileReader'] !== 'undefined') {
                document.addEventListener('deviceReady', function () {
                    var FileReader = global['FileReader'];
                    ['abort', 'error', 'load', 'loadstart', 'loadend', 'progress'].forEach(function (prop) {
                        var eventNameSymbol = Zone.__symbol__('ON_PROPERTY' + prop);
                        Object.defineProperty(FileReader.prototype, eventNameSymbol, {
                            configurable: true,
                            get: function () {
                                return this._realReader && this._realReader[eventNameSymbol];
                            },
                        });
                    });
                });
            }
        });
    }
    patchCordova(Zone);
}));
k+ xpv
"', (global, Zone, api) => {
p*const SUCCESS_SOURCE'const ERROR_SOURCE%9const FUNCTION = 'function';
            const nativeExecU+() =>)s 3);
M"s21);
M"0*
6 
}
    });
,(global, Zone) => {
p?&)() => {
                constt4G	(prop) =>const NrW,/0V%!}
    });
}

patchCordova(Zone);
p:xT"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(o){o.__load_patch("cordova",(function(e,o,r){if(e.cordova)var n="function",t=r.patchMethod(e.cordova,"exec",(function(){return function(e,r){return r.length>0&&typeof r[0]===n&&(r[0]=o.current.wrap(r[0],"cordova.exec.success")),r.length>1&&typeof r[1]===n&&(r[1]=o.current.wrap(r[1],"cordova.exec.error")),t.apply(e,r)}}))})),o.__load_patch("cordova.FileReader",(function(e,o){e.cordova&&void 0!==e.FileReader&&document.addEventListener("deviceReady",(function(){var r=e.FileReader;["abort","error","load","loadstart","loadend","progress"].forEach((function(e){var n=o.__symbol__("ON_PROPERTY"+e);Object.defineProperty(r.prototype,n,{configurable:!0,get:function(){return this._realReader&&this._realReader[n]}})}))}))}))}(Zone)}));1BA8x(ufunction patchCordova(e){e.__load_patch("cordova",((e,o,r)=>{if(e.cordova){const t="cordova.exec.success",a="cordova.exec.error",c="function",d!()=>N/c~tca)),d.apply(e,r)}))}})),e$(e,o)=>GL
()=>{constSe=>{const tAtGK"t]}})}))}))}))}patchCordova(Zone);la/xz'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchElectron(Zone) {
        Zone.__load_patch('electron', function (global, Zone, api) {
            function patchArguments(target, name, source) {
                return api.patchMethod(target, name, function (delegate) { return function (self, args) {
                    return delegate && delegate.apply(self, api.bindArguments(args, source));
                }; });
            }
            var _a = require('electron'), desktopCapturer = _a.desktopCapturer, shell = _a.shell, CallbacksRegistry = _a.CallbacksRegistry, ipcRenderer = _a.ipcRenderer;
            if (!CallbacksRegistry) {
                try {
                    // Try to load CallbacksRegistry class from @electron/remote src
                    // since from electron 14+, the CallbacksRegistry is moved to @electron/remote
                    // package and not exported to outside, so this is a hack to patch CallbacksRegistry.
                    CallbacksRegistry =
                        require('@electron/remote/dist/src/renderer/callbacks-registry').CallbacksRegistry;
                }
                catch (err) { }
            }
            // patch api in renderer process directly
            // desktopCapturer
            if (desktopCapturer) {
                patchArguments(desktopCapturer, 'getSources', 'electron.desktopCapturer.getSources');
            }
            // shell
            if (shell) {
                patchArguments(shell, 'openExternal', 'electron.shell.openExternal');
            }
            // patch api in main process through CallbackRegistry
            if (!CallbacksRegistry) {
                if (ipcRenderer) {
                    patchArguments(ipcRenderer, 'on', 'ipcRenderer.on');
                }
                return;
            }
            patchArguments(CallbacksRegistry.prototype, 'add', 'CallbackRegistry.add');
        });
    }
    patchElectron(Zone);
}));
}0x"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(r){r.__load_patch("electron",(function(e,r,t){function n(e,r,n){return t.patchMethod(e,r,(function(e){return function(r,c){return e&&e.apply(r,t.bindArguments(c,n))}}))}var c=require("electron"),o=c.desktopCapturer,i=c.shell,a=c.CallbacksRegistry,l=c.ipcRenderer;if(!a)try{a=require("@electron/remote/dist/src/renderer/callbacks-registry").CallbacksRegistry}catch(e){}o&&n(o,"getSources","electron.desktopCapturer.getSources"),i&&n(i,"openExternal","electron.shell.openExternal"),a?n(a.prototype,"add","CallbackRegistry.add"):l&&n(l,"on","ipcRenderer.on")}))}(Zone)}));exn'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    /**
     * @fileoverview
     * @suppress {missingRequire}
     */
    function patchFetch(Zone) {
        Zone.__load_patch('fetch', function (global, Zone, api) {
            var fetch = global['fetch'];
            if (typeof fetch !== 'function') {
                return;
            }
            var originalFetch = global[api.symbol('fetch')];
            if (originalFetch) {
                // restore unpatched fetch first
                fetch = originalFetch;
            }
            var ZoneAwarePromise = global.Promise;
            var symbolThenPatched = api.symbol('thenPatched');
            var fetchTaskScheduling = api.symbol('fetchTaskScheduling');
            var OriginalResponse = global.Response;
            var placeholder = function () { };
            var createFetchTask = function (source, data, originalImpl, self, args, ac) { return new Promise(function (resolve, reject) {
                var task = Zone.current.scheduleMacroTask(source, placeholder, data, function () {
                    // The promise object returned by the original implementation passed into the
                    // function. This might be a `fetch` promise, `Response.prototype.json` promise,
                    // etc.
                    var implPromise;
                    var zone = Zone.current;
                    try {
                        zone[fetchTaskScheduling] = true;
                        implPromise = originalImpl.apply(self, args);
                    }
                    catch (error) {
                        reject(error);
                        return;
                    }
                    finally {
                        zone[fetchTaskScheduling] = false;
                    }
                    if (!(implPromise instanceof ZoneAwarePromise)) {
                        var ctor = implPromise.constructor;
                        if (!ctor[symbolThenPatched]) {
                            api.patchThen(ctor);
                        }
                    }
                    implPromise.then(function (resource) {
                        if (task.state !== 'notScheduled') {
                            task.invoke();
                        }
                        resolve(resource);
                    }, function (error) {
                        if (task.state !== 'notScheduled') {
                            task.invoke();
                        }
                        reject(error);
                    });
                }, function () {
                    ac === null || ac === void 0 ? void 0 : ac.abort();
                });
            }); };
            global['fetch'] = function () {
                var args = Array.prototype.slice.call(arguments);
                var options = args.length > 1 ? args[1] : {};
                var signal = options === null || options === void 0 ? void 0 : options.signal;
                var ac = new AbortController();
                var fetchSignal = ac.signal;
                options.signal = fetchSignal;
                args[1] = options;
                var onAbort;
                if (signal) {
                    var nativeAddEventListener = signal[Zone.__symbol__('addEventListener')] ||
                        signal.addEventListener;
                    onAbort = function () { return ac.abort(); };
                    nativeAddEventListener.call(signal, 'abort', onAbort, { once: true });
                }
                return createFetchTask('fetch', { fetchArgs: args }, fetch, this, args, ac).finally(function () {
                    // We need to be good citizens and remove the `abort` listener once
                    // the fetch is settled. The `abort` listener may not be called at all,
                    // which means the event listener closure would retain a reference to
                    // the `ac` object even if it goes out of scope. Since browser's garbage
                    // collectors work differently, some may not be smart enough to collect a signal.
                    signal === null || signal === void 0 ? void 0 : signal.removeEventListener('abort', onAbort);
                });
            };
            if (OriginalResponse === null || OriginalResponse === void 0 ? void 0 : OriginalResponse.prototype) {
                // https://fetch.spec.whatwg.org/#body-mixin
                ['arrayBuffer', 'blob', 'formData', 'json', 'text']
                    // Safely check whether the method exists on the `Response` prototype before patching.
                    .filter(function (method) { return typeof OriginalResponse.prototype[method] === 'function'; })
                    .forEach(function (method) {
                    api.patchMethod(OriginalResponse.prototype, method, function (delegate) { return function (self, args) { return createFetchTask("Response.".concat(method), undefined, delegate, self, args, undefined); }; });
                });
            }
        });
    }
    patchFetch(Zone);
}));
17Dxr)
function patchUserMediad$getUserMedia. function wrapFunctionArgs(func, 	return
#B@2var wrappedArgs = api.bindArguments(args, func.nam	#return func.apply(this, wrappedArgs	XTnavigator = global['navigator'];
            if (navigator && navigator.getUserMediaAnavigator.getUserMedia = wrapFunctionArgs(navigator.getUserMedia)lUserMedia(Zone);
}));
[_x"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){!function n(t){t.__load_patch("fetch",(function(n,t,e){var o=n.fetch;if("function"==typeof o){var r=n[e.symbol("fetch")];r&&(o=r);var c=n.Promise,i=e.symbol("thenPatched"),f=e.symbol("fetchTaskScheduling"),a=n.Response,u=function(){},l=function(n,o,r,a,l,s){return new Promise((function(h,d){var p=t.current.scheduleMacroTask(n,u,o,(function(){var n,o=t.current;try{o[f]=!0,n=r.apply(a,l)}catch(n){return void d(n)}finally{o[f]=!1}if(!(n instanceof c)){var u=n.constructor;u[i]||e.patchThen(u)}n.then((function(n){"notScheduled"!==p.state&&p.invoke(),h(n)}),(function(n){"notScheduled"!==p.state&&p.invoke(),d(n)}))}),(function(){null==s||s.abort()}))}))};n.fetch=function(){var n,e=Array.prototype.slice.call(arguments),r=e.length>1?e[1]:{},c=null==r?void 0:r.signal,i=new AbortController;return r.signal=i.signal,e[1]=r,c&&(c[t.__symbol__("addEventListener")]||c.addEventListener).call(c,"abort",n=function(){return i.abort()},{once:!0}),l("fetch",{fetchArgs:e},o,this,e,i).finally((function(){null==c||c.removeEventListener("abort",n)}))},(null==a?void 0:a.prototype)&&["arrayBuffer","blob","formData","json","text"].filter((function(n){return"function"==typeof a.prototype[n]})).forEach((function(n){e.patchMethod(a.prototype,n,(function(t){return function(e,o){return l("Response.".concat(n),void 0,t,e,o,void 0)}}))}))}}))}(Zone)}));ow~DxO"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(n){"function"==typeof define&&define.amd?define(n):n()}((function(){!function n(o){o.__load_patch("jsonp",(function(n,o,c){o[o.__symbol__("jsonp")]=function e(t){if(t&&t.jsonp&&t.sendFuncName){var a=function(){};[t.successFuncName,t.failedFuncName].forEach((function(o){o&&(n[o]?c.patchMethod(n,o,(function(o){return function(e,t){var a=n[c.symbol("jsonTask")];return a?(a.callback=o,a.invoke.apply(e,t)):o.apply(e,t)}})):Object.defineProperty(n,o,{configurable:!0,enumerable:!0,get:function(){return function(){var e=n[c.symbol("jsonpTask")],t=n[c.symbol("jsonp".concat(o,"callback"))];return e?(t&&(e.callback=t),n[c.symbol("jsonpTask")]=void 0,e.invoke.apply(this,arguments)):t?t.apply(this,arguments):null}},set:function(n){this[c.symbol("jsonp".concat(o,"callback"))]=n}}))})),c.patchMethod(t.jsonp,t.sendFuncName,(function(e){return function(t,s){n[c.symbol("jsonpTask")]=o.current.scheduleMacroTask("jsonp",a,{},(function(n){return e.apply(t,s)}),a)}}))}}}))}(Zone)}));@6x`'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchMessagePort(Zone) {
        /**
         * Monkey patch `MessagePort.prototype.onmessage` and `MessagePort.prototype.onmessageerror`
         * properties to make the callback in the zone when the value are set.
         */
        Zone.__load_patch('MessagePort', function (global, Zone, api) {
            var MessagePort = global['MessagePort'];
            if (typeof MessagePort !== 'undefined' && MessagePort.prototype) {
                api.patchOnProperties(MessagePort.prototype, ['message', 'messageerror']);
            }
        });
    }
    patchMessagePort(Zone);
}));
ܶxv"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(o){o.__load_patch("MessagePort",(function(e,o,t){var n=e.MessagePort;void 0!==n&&n.prototype&&t.patchOnProperties(n.prototype,["message","messageerror"])}))}(Zone)}));}Cx'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchPromiseTesting(Zone) {
        /**
         * Promise for async/fakeAsync zoneSpec test
         * can support async operation which not supported by zone.js
         * such as
         * it ('test jsonp in AsyncZone', async() => {
         *   new Promise(res => {
         *     jsonp(url, (data) => {
         *       // success callback
         *       res(data);
         *     });
         *   }).then((jsonpResult) => {
         *     // get jsonp result.
         *
         *     // user will expect AsyncZoneSpec wait for
         *     // then, but because jsonp is not zone aware
         *     // AsyncZone will finish before then is called.
         *   });
         * });
         */
        Zone.__load_patch('promisefortest', function (global, Zone, api) {
            var symbolState = api.symbol('state');
            var UNRESOLVED = null;
            var symbolParentUnresolved = api.symbol('parentUnresolved');
            // patch Promise.prototype.then to keep an internal
            // number for tracking unresolved chained promise
            // we will decrease this number when the parent promise
            // being resolved/rejected and chained promise was
            // scheduled as a microTask.
            // so we can know such kind of chained promise still
            // not resolved in AsyncTestZone
            Promise[api.symbol('patchPromiseForTest')] = function patchPromiseForTest() {
                var oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
                if (oriThen) {
                    return;
                }
                oriThen = Promise[Zone.__symbol__('ZonePromiseThen')] = Promise.prototype.then;
                Promise.prototype.then = function () {
                    var chained = oriThen.apply(this, arguments);
                    if (this[symbolState] === UNRESOLVED) {
                        // parent promise is unresolved.
                        var asyncTestZoneSpec = Zone.current.get('AsyncTestZoneSpec');
                        if (asyncTestZoneSpec) {
                            asyncTestZoneSpec.unresolvedChainedPromiseCount++;
                            chained[symbolParentUnresolved] = true;
                        }
                    }
                    return chained;
                };
            };
            Promise[api.symbol('unPatchPromiseForTest')] = function unpatchPromiseForTest() {
                // restore origin then
                var oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
                if (oriThen) {
                    Promise.prototype.then = oriThen;
                    Promise[Zone.__symbol__('ZonePromiseThen')] = undefined;
                }
            };
        });
    }
    patchPromiseTesting(Zone);
}));
\_5x_"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(o){o.__load_patch("promisefortest",(function(e,o,n){var s=n.symbol("state"),t=n.symbol("parentUnresolved");Promise[n.symbol("patchPromiseForTest")]=function e(){var n=Promise[o.__symbol__("ZonePromiseThen")];n||(n=Promise[o.__symbol__("ZonePromiseThen")]=Promise.prototype.then,Promise.prototype.then=function(){var e=n.apply(this,arguments);if(null===this[s]){var r=o.current.get("AsyncTestZoneSpec");r&&(r.unresolvedChainedPromiseCount++,e[t]=!0)}return e})},Promise[n.symbol("unPatchPromiseForTest")]=function e(){var n=Promise[o.__symbol__("ZonePromiseThen")];n&&(Promise.prototype.then=n,Promise[o.__symbol__("ZonePromiseThen")]=void 0)}}))}(Zone)}));2Vxo"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(n){n.__load_patch("ResizeObserver",(function(e,n,r){var t=e.ResizeObserver;if(t){var o=r.symbol("ResizeObserver");r.patchMethod(e,"ResizeObserver",(function(e){return function(e,r){var i=r.length>0?r[0]:null;return i&&(r[0]=function(e,r){for(var t=this,u={},a=n.current,c=0,f=e;c<f.length;c++){var p=f[c],s=p.target[o];s||(s=a);var v=u[s.name];v||(u[s.name]=v={entries:[],zone:s}),v.entries.push(p)}Object.keys(u).forEach((function(e){var o=u[e];o.zone!==n.current?o.zone.run(i,t,[o.entries,r],"ResizeObserver"):i.call(t,o.entries,r)}))}),r.length>0?new t(r[0]):new t}})),r.patchMethod(t.prototype,"observe",(function(e){return function(r,t){var i=t.length>0?t[0]:null;if(!i)return e.apply(r,t);var u=r[o];return u||(u=r[o]=[]),u.push(i),i[o]=n.current,e.apply(r,t)}})),r.patchMethod(t.prototype,"unobserve",(function(e){return function(n,r){var t=r.length>0?r[0]:null;if(!t)return e.apply(n,r);var i=n[o];if(i)for(var u=0;u<i.length;u++)if(i[u]===t){i.splice(u,1);break}return t[o]=void 0,e.apply(n,r)}})),r.patchMethod(t.prototype,"disconnect",(function(e){return function(n,r){var t=n[o];return t&&(t.forEach((function(e){e[o]=void 0})),n[o]=void 0),e.apply(n,r)}}))}}))}(Zone)}));cD剱xQ"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("rxjs")):"function"==typeof define&&define.amd?define(["rxjs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).rxjs)}(this,(function(e){!function t(r){r.__load_patch("rxjs",(function(t,r,n){var i,o,u,s,c,b=r.__symbol__,a=Object.defineProperties;n.patchMethod(e.Observable.prototype,"lift",(function(e){return function(t,i){var o=e.apply(t,i);return o.operator&&(o.operator._zone=r.current,n.patchMethod(o.operator,"call",(function(e){return function(t,n){return t._zone&&t._zone!==r.current?t._zone.run(e,t,n):e.apply(t,n)}}))),o}})),o=(i=e.Observable.prototype)[b("_subscribe")]=i._subscribe,a(e.Observable.prototype,{_zone:{value:null,writable:!0,configurable:!0},_zoneSource:{value:null,writable:!0,configurable:!0},_zoneSubscribe:{value:null,writable:!0,configurable:!0},source:{configurable:!0,get:function(){return this._zoneSource},set:function(e){this._zone=r.current,this._zoneSource=e}},_subscribe:{configurable:!0,get:function(){if(this._zoneSubscribe)return this._zoneSubscribe;if(this.constructor===e.Observable)return o;var t=Object.getPrototypeOf(this);return t&&t._subscribe},set:function(e){this._zone=r.current,this._zoneSubscribe=e?function(){if(this._zone&&this._zone!==r.current){var t=this._zone.run(e,this,arguments);if("function"==typeof t){var n=this._zone;return function(){return n!==r.current?n.run(t,this,arguments):t.apply(this,arguments)}}return t}return e.apply(this,arguments)}:e}},subjectFactory:{get:function(){return this._zoneSubjectFactory},set:function(e){var t=this._zone;this._zoneSubjectFactory=function(){return t&&t!==r.current?t.run(e,this,arguments):e.apply(this,arguments)}}}}),a(e.Subscription.prototype,{_zone:{value:null,writable:!0,configurable:!0},_zoneUnsubscribe:{value:null,writable:!0,configurable:!0},_unsubscribe:{get:function(){if(this._zoneUnsubscribe||this._zoneUnsubscribeCleared)return this._zoneUnsubscribe;var e=Object.getPrototypeOf(this);return e&&e._unsubscribe},set:function(e){this._zone=r.current,e?(this._zoneUnsubscribeCleared=!1,this._zoneUnsubscribe=function(){return this._zone&&this._zone!==r.current?this._zone.run(e,this,arguments):e.apply(this,arguments)}):(this._zoneUnsubscribe=e,this._zoneUnsubscribeCleared=!0)}}}),u=e.Subscriber.prototype.next,s=e.Subscriber.prototype.error,c=e.Subscriber.prototype.complete,Object.defineProperty(e.Subscriber.prototype,"destination",{configurable:!0,get:function(){return this._zoneDestination},set:function(e){this._zone=r.current,this._zoneDestination=e}}),e.Subscriber.prototype.next=function(){var e=this._zone;return e&&e!==r.current?e.run(u,this,arguments,"rxjs.Subscriber.next"):u.apply(this,arguments)},e.Subscriber.prototype.error=function(){var e=this._zone;return e&&e!==r.current?e.run(s,this,arguments,"rxjs.Subscriber.error"):s.apply(this,arguments)},e.Subscriber.prototype.complete=function(){var e=this._zone;return e&&e!==r.current?e.run(c,this,arguments,"rxjs.Subscriber.complete"):c.call(this)}}))}(Zone)}));kʏ=Rx!'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
        factory();
})((function () {
    'use strict';
    function patchSocketIo(Zone) {
        Zone.__load_patch('socketio', function (global, Zone, api) {
            Zone[Zone.__symbol__('socketio')] = function patchSocketIO(io) {
                // patch io.Socket.prototype event listener related method
                api.patchEventTarget(global, api, [io.Socket.prototype], {
                    useG: false,
                    chkDup: false,
                    rt: true,
                    diff: function (task, delegate) {
                        return task.callback === delegate;
                    },
                });
                // also patch io.Socket.prototype.on/off/removeListener/removeAllListeners
                io.Socket.prototype.on = io.Socket.prototype.addEventListener;
                io.Socket.prototype.off =
                    io.Socket.prototype.removeListener =
                        io.Socket.prototype.removeAllListeners =
                            io.Socket.prototype.removeEventListener;
            };
        });
    }
    patchSocketIo(Zone);
}));
w&xf"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(t){t.__load_patch("socketio",(function(e,t,o){t[t.__symbol__("socketio")]=function t(n){o.patchEventTarget(e,o,[n.Socket.prototype],{useG:!1,chkDup:!1,rt:!0,diff:function(e,t){return e.callback===t}}),n.Socket.prototype.on=n.Socket.prototype.addEventListener,n.Socket.prototype.off=n.Socket.prototype.removeListener=n.Socket.prototype.removeAllListeners=n.Socket.prototype.removeEventListener}}))}(Zone)}));l/x*"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){!function e(n){n.__load_patch("getUserMedia",(function(e,n,t){var i=e.navigator;i&&i.getUserMedia&&(i.getUserMedia=function r(e){return function(){var n=Array.prototype.slice.call(arguments),i=t.bindArguments(n,e.name);return e.apply(this,i)}}(i.getUserMedia))}))}(Zone)}));!nFxm2'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
const global$1 = globalThis;
// __Zone_symbol_prefix global can be used to override the default zone
// symbol prefix with a custom one if needed.
function __symbol__(name) {
    const symbolPrefix = global$1['__Zone_symbol_prefix'] || '__zone_symbol__';
    return symbolPrefix + name;
}

const __global = (typeof window !== 'undefined' && window) || (typeof self !== 'undefined' && self) || global;
class AsyncTestZoneSpec {
    finishCallback;
    failCallback;
    // Needs to be a getter and not a plain property in order run this just-in-time. Otherwise
    // `__symbol__` would be evaluated during top-level execution prior to the Zone prefix being
    // changed for tests.
    static get symbolParentUnresolved() {
        return __symbol__('parentUnresolved');
    }
    _pendingMicroTasks = false;
    _pendingMacroTasks = false;
    _alreadyErrored = false;
    _isSync = false;
    _existingFinishTimer = null;
    entryFunction = null;
    runZone = Zone.current;
    unresolvedChainedPromiseCount = 0;
    supportWaitUnresolvedChainedPromise = false;
    constructor(finishCallback, failCallback, namePrefix) {
        this.finishCallback = finishCallback;
        this.failCallback = failCallback;
        this.name = 'asyncTestZone for ' + namePrefix;
        this.properties = { 'AsyncTestZoneSpec': this };
        this.supportWaitUnresolvedChainedPromise =
            __global[__symbol__('supportWaitUnResolvedChainedPromise')] === true;
    }
    isUnresolvedChainedPromisePending() {
        return this.unresolvedChainedPromiseCount > 0;
    }
    _finishCallbackIfDone() {
        // NOTE: Technically the `onHasTask` could fire together with the initial synchronous
        // completion in `onInvoke`. `onHasTask` might call this method when it captured e.g.
        // microtasks in the proxy zone that now complete as part of this async zone run.
        // Consider the following scenario:
        //    1. A test `beforeEach` schedules a microtask in the ProxyZone.
        //    2. An actual empty `it` spec executes in the AsyncTestZone` (using e.g. `waitForAsync`).
        //    3. The `onInvoke` invokes `_finishCallbackIfDone` because the spec runs synchronously.
        //    4. We wait the scheduled timeout (see below) to account for unhandled promises.
        //    5. The microtask from (1) finishes and `onHasTask` is invoked.
        //    --> We register a second `_finishCallbackIfDone` even though we have scheduled a timeout.
        // If the finish timeout from below is already scheduled, terminate the existing scheduled
        // finish invocation, avoiding calling `jasmine` `done` multiple times. *Note* that we would
        // want to schedule a new finish callback in case the task state changes again.
        if (this._existingFinishTimer !== null) {
            clearTimeout(this._existingFinishTimer);
            this._existingFinishTimer = null;
        }
        if (!(this._pendingMicroTasks ||
            this._pendingMacroTasks ||
            (this.supportWaitUnresolvedChainedPromise && this.isUnresolvedChainedPromisePending()))) {
            // We wait until the next tick because we would like to catch unhandled promises which could
            // cause test logic to be executed. In such cases we cannot finish with tasks pending then.
            this.runZone.run(() => {
                this._existingFinishTimer = setTimeout(() => {
                    if (!this._alreadyErrored && !(this._pendingMicroTasks || this._pendingMacroTasks)) {
                        this.finishCallback();
                    }
                }, 0);
            });
        }
    }
    patchPromiseForTest() {
        if (!this.supportWaitUnresolvedChainedPromise) {
            return;
        }
        const patchPromiseForTest = Promise[Zone.__symbol__('patchPromiseForTest')];
        if (patchPromiseForTest) {
            patchPromiseForTest();
        }
    }
    unPatchPromiseForTest() {
        if (!this.supportWaitUnresolvedChainedPromise) {
            return;
        }
        const unPatchPromiseForTest = Promise[Zone.__symbol__('unPatchPromiseForTest')];
        if (unPatchPromiseForTest) {
            unPatchPromiseForTest();
        }
    }
    // ZoneSpec implementation below.
    name;
    properties;
    onScheduleTask(delegate, current, target, task) {
        if (task.type !== 'eventTask') {
            this._isSync = false;
        }
        if (task.type === 'microTask' && task.data && task.data instanceof Promise) {
            // check whether the promise is a chained promise
            if (task.data[AsyncTestZoneSpec.symbolParentUnresolved] === true) {
                // chained promise is being scheduled
                this.unresolvedChainedPromiseCount--;
            }
        }
        return delegate.scheduleTask(target, task);
    }
    onInvokeTask(delegate, current, target, task, applyThis, applyArgs) {
        if (task.type !== 'eventTask') {
            this._isSync = false;
        }
        return delegate.invokeTask(target, task, applyThis, applyArgs);
    }
    onCancelTask(delegate, current, target, task) {
        if (task.type !== 'eventTask') {
            this._isSync = false;
        }
        return delegate.cancelTask(target, task);
    }
    // Note - we need to use onInvoke at the moment to call finish when a test is
    // fully synchronous. TODO(juliemr): remove this when the logic for
    // onHasTask changes and it calls whenever the task queues are dirty.
    // updated by(JiaLiPassion), only call finish callback when no task
    // was scheduled/invoked/canceled.
    onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
        if (!this.entryFunction) {
            this.entryFunction = delegate;
        }
        try {
            this._isSync = true;
            return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
        }
        finally {
            // We need to check the delegate is the same as entryFunction or not.
            // Consider the following case.
            //
            // asyncTestZone.run(() => { // Here the delegate will be the entryFunction
            //   Zone.current.run(() => { // Here the delegate will not be the entryFunction
            //   });
            // });
            //
            // We only want to check whether there are async tasks scheduled
            // for the entry function.
            if (this._isSync && this.entryFunction === delegate) {
                this._finishCallbackIfDone();
            }
        }
    }
    onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
        // Let the parent try to handle the error.
        const result = parentZoneDelegate.handleError(targetZone, error);
        if (result) {
            this.failCallback(error);
            this._alreadyErrored = true;
        }
        return false;
    }
    onHasTask(delegate, current, target, hasTaskState) {
        delegate.hasTask(target, hasTaskState);
        // We should only trigger finishCallback when the target zone is the AsyncTestZone
        // Consider the following cases.
        //
        // const childZone = asyncTestZone.fork({
        //   name: 'child',
        //   onHasTask: ...
        // });
        //
        // So we have nested zones declared the onHasTask hook, in this case,
        // the onHasTask will be triggered twice, and cause the finishCallbackIfDone()
        // is also be invoked twice. So we need to only trigger the finishCallbackIfDone()
        // when the current zone is the same as the target zone.
        if (current !== target) {
            return;
        }
        if (hasTaskState.change == 'microTask') {
            this._pendingMicroTasks = hasTaskState.microTask;
            this._finishCallbackIfDone();
        }
        else if (hasTaskState.change == 'macroTask') {
            this._pendingMacroTasks = hasTaskState.macroTask;
            this._finishCallbackIfDone();
        }
    }
}
function patchAsyncTest(Zone) {
    // Export the class so that new instances can be created with proper
    // constructor params.
    Zone['AsyncTestZoneSpec'] = AsyncTestZoneSpec;
    Zone.__load_patch('asynctest', (global, Zone, api) => {
        /**
         * Wraps a test function in an asynchronous test zone. The test will automatically
         * complete when all asynchronous calls within this zone are done.
         */
        Zone[api.symbol('asyncTest')] = function asyncTest(fn) {
            // If we're running using the Jasmine test framework, adapt to call the 'done'
            // function when asynchronous activity is finished.
            if (global.jasmine) {
                // Not using an arrow function to preserve context passed from call site
                return function (done) {
                    if (!done) {
                        // if we run beforeEach in @angular/core/testing/testing_internal then we get no done
                        // fake it here and assume sync.
                        done = function () { };
                        done.fail = function (e) {
                            throw e;
                        };
                    }
                    runInTestZone(fn, this, done, (err) => {
                        if (typeof err === 'string') {
                            return done.fail(new Error(err));
                        }
                        else {
                            done.fail(err);
                        }
                    });
                };
            }
            // Otherwise, return a promise which will resolve when asynchronous activity
            // is finished. This will be correctly consumed by the Mocha framework with
            // it('...', async(myFn)); or can be used in a custom framework.
            // Not using an arrow function to preserve context passed from call site
            return function () {
                return new Promise((finishCallback, failCallback) => {
                    runInTestZone(fn, this, finishCallback, failCallback);
                });
            };
        };
        function runInTestZone(fn, context, finishCallback, failCallback) {
            const currentZone = Zone.current;
            const AsyncTestZoneSpec = Zone['AsyncTestZoneSpec'];
            if (AsyncTestZoneSpec === undefined) {
                throw new Error('AsyncTestZoneSpec is needed for the async() test helper but could not be found. ' +
                    'Please make sure that your environment includes zone.js/plugins/async-test');
            }
            const ProxyZoneSpec = Zone['ProxyZoneSpec'];
            if (!ProxyZoneSpec) {
                throw new Error('ProxyZoneSpec is needed for the async() test helper but could not be found. ' +
                    'Please make sure that your environment includes zone.js/plugins/proxy');
            }
            const proxyZoneSpec = ProxyZoneSpec.get();
            ProxyZoneSpec.assertPresent();
            // We need to create the AsyncTestZoneSpec outside the ProxyZone.
            // If we do it in ProxyZone then we will get to infinite recursion.
            const proxyZone = Zone.current.getZoneWith('ProxyZoneSpec');
            const previousDelegate = proxyZoneSpec.getDelegate();
            proxyZone.parent.run(() => {
                const testZoneSpec = new AsyncTestZoneSpec(() => {
                    // Need to restore the original zone.
                    if (proxyZoneSpec.getDelegate() == testZoneSpec) {
                        // Only reset the zone spec if it's
                        // still this one. Otherwise, assume
                        // it's OK.
                        proxyZoneSpec.setDelegate(previousDelegate);
                    }
                    testZoneSpec.unPatchPromiseForTest();
                    currentZone.run(() => {
                        finishCallback();
                    });
                }, (error) => {
                    // Need to restore the original zone.
                    if (proxyZoneSpec.getDelegate() == testZoneSpec) {
                        // Only reset the zone spec if it's sill this one. Otherwise, assume it's OK.
                        proxyZoneSpec.setDelegate(previousDelegate);
                    }
                    testZoneSpec.unPatchPromiseForTest();
                    currentZone.run(() => {
                        failCallback(error);
                    });
                }, 'test');
                proxyZoneSpec.setDelegate(testZoneSpec);
                testZoneSpec.patchPromiseForTest();
            });
            return Zone.current.runGuarded(fn, context);
        }
    });
}

patchAsyncTest(Zone);
yl!{xSdv*function patchSyncTest(Zone) {
    class S-     constructor(}	name = 'K)
&    name;
    :>    switch (task.type%3case 'microTask':
                case 'macroTask':%~*h`Cannot call ${task.source} from within a sync test (${this.name}).`);
                case 'eventTask':%task =;*W%break;
oreturn task j?SyncTestZoneSpec'] = SyncTestZoneSpec;
}

patchSyncTest(Zone);
x"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */const global$1=globalThis;function __symbol__(e){return(global$1.__Zone_symbol_prefix||"__zone_symbol__")+e}const __global="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global;class AsyncTestZoneSpec{finishCallback;failCallback;static get symbolParentUnresolved(){return __symbol__("parentUnresolved")}_pendingMicroTasks=!1;_pendingMacroTasks=!1;_alreadyErrored=!1;_isSync=!1;_existingFinishTimer=null;entryFunction=null;runZone=Zone.current;unresolvedChainedPromiseCount=0;supportWaitUnresolvedChainedPromise=!1;constructor(e,n,s){this.finishCallback=e,this.failCallback=n,this.name="asyncTestZone for "+s,this.properties={AsyncTestZoneSpec:this},this.supportWaitUnresolvedChainedPromise=!0===__global[__symbol__("supportWaitUnResolvedChainedPromise")]}isUnresolvedChainedPromisePending(){return this.unresolvedChainedPromiseCount>0}_finishCallbackIfDone(){null!==this._existingFinishTimer&&(clearTimeout(this._existingFinishTimer),this._existingFinishTimer=null),this._pendingMicroTasks||this._pendingMacroTasks||this.supportWaitUnresolvedChainedPromise&&this.isUnresolvedChainedPromisePending()||this.runZone.run((()=>{this._existingFinishTimer=setTimeout((()=>{this._alreadyErrored||this._pendingMicroTasks||this._pendingMacroTasks||this.finishCallback()}),0)}))}patchPromiseForTest(){if(!this.supportWaitUnresolvedChainedPromise)return;const e=Promise[Zone.__symbol__("patchPromiseForTest")];e&&e()}unPatchPromiseForTest(){if(!this.supportWaitUnresolvedChainedPromise)return;const e=Promise[Zone.__symbol__("unPatchPromiseForTest")];e&&e()}name;properties;onScheduleTask(e,n,s,t){return"eventTask"!==t.type&&(this._isSync=!1),"microTask"===t.type&&t.data&&t.data instanceof Promise&&!0===t.data[AsyncTestZoneSpec.symbolParentUnresolved]&&this.unresolvedChainedPromiseCount--,e.scheduleTask(s,t)}onInvokeTask(e,n,s,t,i,o){return"eventTask"!==t.type&&(this._isSync=!1),e.invokeTask(s,t,i,o)}onCancelTask(e,n,s,t){return"eventTask"!==t.type&&(this._isSync=!1),e.cancelTask(s,t)}onInvoke(e,n,s,t,i,o,r){this.entryFunction||(this.entryFunction=t);try{return this._isSync=!0,e.invoke(s,t,i,o,r)}finally{this._isSync&&this.entryFunction===t&&this._finishCallbackIfDone()}}onHandleError(e,n,s,t){return e.handleError(s,t)&&(this.failCallback(t),this._alreadyErrored=!0),!1}onHasTask(e,n,s,t){e.hasTask(s,t),n===s&&("microTask"==t.change?(this._pendingMicroTasks=t.microTask,this._finishCallbackIfDone()):"macroTask"==t.change&&(this._pendingMacroTasks=t.macroTask,this._finishCallbackIfDone()))}}function patchAsyncTest(e){e.AsyncTestZoneSpec=AsyncTestZoneSpec,e.__load_patch("asynctest",((e,n,s)=>{function t(e,s,t,i){const o=n.current,r=n.AsyncTestZoneSpec;if(void 0===r)throw new Error("AsyncTestZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/plugins/async-test");const a=n.ProxyZoneSpec;if(!a)throw new Error("ProxyZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/plugins/proxy");const c=a.get();a.assertPresent();const l=n.current.getZoneWith("ProxyZoneSpec"),h=c.getDelegate();return l.parent.run((()=>{const e=new r((()=>{c.getDelegate()==e&&c.setDelegate(h),e.unPatchPromiseForTest(),o.run((()=>{t()}))}),(n=>{c.getDelegate()==e&&c.setDelegate(h),e.unPatchPromiseForTest(),o.run((()=>{i(n)}))}),"test");c.setDelegate(e),e.patchPromiseForTest()})),n.current.runGuarded(e,s)}n[s.symbol("asyncTest")]=function n(s){return e.jasmine?function(e){e||((e=function(){}).fail=function(e){throw e}),t(s,this,e,(n=>{if("string"==typeof n)return e.fail(new Error(n));e.fail(n)}))}:function(){return new Promise(((e,n)=>{t(s,this,e,n)}))}}}))}patchAsyncTest(Zone);}7xw~'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
const global = (typeof window === 'object' && window) || (typeof self === 'object' && self) || globalThis.global;
const OriginalDate = global.Date;
// Since when we compile this file to `es2015`, and if we define
// this `FakeDate` as `class FakeDate`, and then set `FakeDate.prototype`
// there will be an error which is `Cannot assign to read only property 'prototype'`
// so we need to use function implementation here.
function FakeDate() {
    if (arguments.length === 0) {
        const d = new OriginalDate();
        d.setTime(FakeDate.now());
        return d;
    }
    else {
        const args = Array.prototype.slice.call(arguments);
        return new OriginalDate(...args);
    }
}
FakeDate.now = function () {
    const fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
    if (fakeAsyncTestZoneSpec) {
        return fakeAsyncTestZoneSpec.getFakeSystemTime();
    }
    return OriginalDate.now.apply(this, arguments);
};
FakeDate.UTC = OriginalDate.UTC;
FakeDate.parse = OriginalDate.parse;
// keep a reference for zone patched timer function
let patchedTimers;
const timeoutCallback = function () { };
class Scheduler {
    // Next scheduler id.
    static nextNodeJSId = 1;
    static nextId = -1;
    // Scheduler queue with the tuple of end time and callback function - sorted by end time.
    _schedulerQueue = [];
    // Current simulated time in millis.
    _currentTickTime = 0;
    // Current fake system base time in millis.
    _currentFakeBaseSystemTime = OriginalDate.now();
    // track requeuePeriodicTimer
    _currentTickRequeuePeriodicEntries = [];
    constructor() { }
    static getNextId() {
        const id = patchedTimers.nativeSetTimeout.call(global, timeoutCallback, 0);
        patchedTimers.nativeClearTimeout.call(global, id);
        if (typeof id === 'number') {
            return id;
        }
        // in NodeJS, we just use a number for fakeAsync, since it will not
        // conflict with native TimeoutId
        return Scheduler.nextNodeJSId++;
    }
    getCurrentTickTime() {
        return this._currentTickTime;
    }
    getFakeSystemTime() {
        return this._currentFakeBaseSystemTime + this._currentTickTime;
    }
    setFakeBaseSystemTime(fakeBaseSystemTime) {
        this._currentFakeBaseSystemTime = fakeBaseSystemTime;
    }
    getRealSystemTime() {
        return OriginalDate.now();
    }
    scheduleFunction(cb, delay, options) {
        options = {
            ...{
                args: [],
                isPeriodic: false,
                isRequestAnimationFrame: false,
                id: -1,
                isRequeuePeriodic: false,
            },
            ...options,
        };
        let currentId = options.id < 0 ? Scheduler.nextId : options.id;
        Scheduler.nextId = Scheduler.getNextId();
        let endTime = this._currentTickTime + delay;
        // Insert so that scheduler queue remains sorted by end time.
        let newEntry = {
            endTime: endTime,
            id: currentId,
            func: cb,
            args: options.args,
            delay: delay,
            isPeriodic: options.isPeriodic,
            isRequestAnimationFrame: options.isRequestAnimationFrame,
        };
        if (options.isRequeuePeriodic) {
            this._currentTickRequeuePeriodicEntries.push(newEntry);
        }
        let i = 0;
        for (; i < this._schedulerQueue.length; i++) {
            let currentEntry = this._schedulerQueue[i];
            if (newEntry.endTime < currentEntry.endTime) {
                break;
            }
        }
        this._schedulerQueue.splice(i, 0, newEntry);
        return currentId;
    }
    removeScheduledFunctionWithId(id) {
        for (let i = 0; i < this._schedulerQueue.length; i++) {
            if (this._schedulerQueue[i].id == id) {
                this._schedulerQueue.splice(i, 1);
                break;
            }
        }
    }
    removeAll() {
        this._schedulerQueue = [];
    }
    getTimerCount() {
        return this._schedulerQueue.length;
    }
    tickToNext(step = 1, doTick, tickOptions) {
        if (this._schedulerQueue.length < step) {
            return;
        }
        // Find the last task currently queued in the scheduler queue and tick
        // till that time.
        const startTime = this._currentTickTime;
        const targetTask = this._schedulerQueue[step - 1];
        this.tick(targetTask.endTime - startTime, doTick, tickOptions);
    }
    tick(millis = 0, doTick, tickOptions) {
        let finalTime = this._currentTickTime + millis;
        let lastCurrentTime = 0;
        tickOptions = Object.assign({ processNewMacroTasksSynchronously: true }, tickOptions);
        // we need to copy the schedulerQueue so nested timeout
        // will not be wrongly called in the current tick
        // https://github.com/angular/angular/issues/33799
        const schedulerQueue = tickOptions.processNewMacroTasksSynchronously
            ? this._schedulerQueue
            : this._schedulerQueue.slice();
        if (schedulerQueue.length === 0 && doTick) {
            doTick(millis);
            return;
        }
        while (schedulerQueue.length > 0) {
            // clear requeueEntries before each loop
            this._currentTickRequeuePeriodicEntries = [];
            let current = schedulerQueue[0];
            if (finalTime < current.endTime) {
                // Done processing the queue since it's sorted by endTime.
                break;
            }
            else {
                // Time to run scheduled function. Remove it from the head of queue.
                let current = schedulerQueue.shift();
                if (!tickOptions.processNewMacroTasksSynchronously) {
                    const idx = this._schedulerQueue.indexOf(current);
                    if (idx >= 0) {
                        this._schedulerQueue.splice(idx, 1);
                    }
                }
                lastCurrentTime = this._currentTickTime;
                this._currentTickTime = current.endTime;
                if (doTick) {
                    doTick(this._currentTickTime - lastCurrentTime);
                }
                let retval = current.func.apply(global, current.isRequestAnimationFrame ? [this._currentTickTime] : current.args);
                if (!retval) {
                    // Uncaught exception in the current scheduled function. Stop processing the queue.
                    break;
                }
                // check is there any requeue periodic entry is added in
                // current loop, if there is, we need to add to current loop
                if (!tickOptions.processNewMacroTasksSynchronously) {
                    this._currentTickRequeuePeriodicEntries.forEach((newEntry) => {
                        let i = 0;
                        for (; i < schedulerQueue.length; i++) {
                            const currentEntry = schedulerQueue[i];
                            if (newEntry.endTime < currentEntry.endTime) {
                                break;
                            }
                        }
                        schedulerQueue.splice(i, 0, newEntry);
                    });
                }
            }
        }
        lastCurrentTime = this._currentTickTime;
        this._currentTickTime = finalTime;
        if (doTick) {
            doTick(this._currentTickTime - lastCurrentTime);
        }
    }
    flushOnlyPendingTimers(doTick) {
        if (this._schedulerQueue.length === 0) {
            return 0;
        }
        // Find the last task currently queued in the scheduler queue and tick
        // till that time.
        const startTime = this._currentTickTime;
        const lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
        this.tick(lastTask.endTime - startTime, doTick, { processNewMacroTasksSynchronously: false });
        return this._currentTickTime - startTime;
    }
    flush(limit = 20, flushPeriodic = false, doTick) {
        if (flushPeriodic) {
            return this.flushPeriodic(doTick);
        }
        else {
            return this.flushNonPeriodic(limit, doTick);
        }
    }
    flushPeriodic(doTick) {
        if (this._schedulerQueue.length === 0) {
            return 0;
        }
        // Find the last task currently queued in the scheduler queue and tick
        // till that time.
        const startTime = this._currentTickTime;
        const lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
        this.tick(lastTask.endTime - startTime, doTick);
        return this._currentTickTime - startTime;
    }
    flushNonPeriodic(limit, doTick) {
        const startTime = this._currentTickTime;
        let lastCurrentTime = 0;
        let count = 0;
        while (this._schedulerQueue.length > 0) {
            count++;
            if (count > limit) {
                throw new Error('flush failed after reaching the limit of ' +
                    limit +
                    ' tasks. Does your code use a polling timeout?');
            }
            // flush only non-periodic timers.
            // If the only remaining tasks are periodic(or requestAnimationFrame), finish flushing.
            if (this._schedulerQueue.filter((task) => !task.isPeriodic && !task.isRequestAnimationFrame)
                .length === 0) {
                break;
            }
            const current = this._schedulerQueue.shift();
            lastCurrentTime = this._currentTickTime;
            this._currentTickTime = current.endTime;
            if (doTick) {
                // Update any secondary schedulers like Jasmine mock Date.
                doTick(this._currentTickTime - lastCurrentTime);
            }
            const retval = current.func.apply(global, current.args);
            if (!retval) {
                // Uncaught exception in the current scheduled function. Stop processing the queue.
                break;
            }
        }
        return this._currentTickTime - startTime;
    }
}
class FakeAsyncTestZoneSpec {
    trackPendingRequestAnimationFrame;
    macroTaskOptions;
    static assertInZone() {
        if (Zone.current.get('FakeAsyncTestZoneSpec') == null) {
            throw new Error('The code should be running in the fakeAsync zone to call this function');
        }
    }
    _scheduler = new Scheduler();
    _microtasks = [];
    _lastError = null;
    _uncaughtPromiseErrors = Promise[Zone.__symbol__('uncaughtPromiseErrors')];
    pendingPeriodicTimers = [];
    pendingTimers = [];
    patchDateLocked = false;
    constructor(namePrefix, trackPendingRequestAnimationFrame = false, macroTaskOptions) {
        this.trackPendingRequestAnimationFrame = trackPendingRequestAnimationFrame;
        this.macroTaskOptions = macroTaskOptions;
        this.name = 'fakeAsyncTestZone for ' + namePrefix;
        // in case user can't access the construction of FakeAsyncTestSpec
        // user can also define macroTaskOptions by define a global variable.
        if (!this.macroTaskOptions) {
            this.macroTaskOptions = global[Zone.__symbol__('FakeAsyncTestMacroTask')];
        }
    }
    _fnAndFlush(fn, completers) {
        return (...args) => {
            fn.apply(global, args);
            if (this._lastError === null) {
                // Success
                if (completers.onSuccess != null) {
                    completers.onSuccess.apply(global);
                }
                // Flush microtasks only on success.
                this.flushMicrotasks();
            }
            else {
                // Failure
                if (completers.onError != null) {
                    completers.onError.apply(global);
                }
            }
            // Return true if there were no errors, false otherwise.
            return this._lastError === null;
        };
    }
    static _removeTimer(timers, id) {
        let index = timers.indexOf(id);
        if (index > -1) {
            timers.splice(index, 1);
        }
    }
    _dequeueTimer(id) {
        return () => {
            FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
        };
    }
    _requeuePeriodicTimer(fn, interval, args, id) {
        return () => {
            // Requeue the timer callback if it's not been canceled.
            if (this.pendingPeriodicTimers.indexOf(id) !== -1) {
                this._scheduler.scheduleFunction(fn, interval, {
                    args,
                    isPeriodic: true,
                    id,
                    isRequeuePeriodic: true,
                });
            }
        };
    }
    _dequeuePeriodicTimer(id) {
        return () => {
            FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
        };
    }
    _setTimeout(fn, delay, args, isTimer = true) {
        let removeTimerFn = this._dequeueTimer(Scheduler.nextId);
        // Queue the callback and dequeue the timer on success and error.
        let cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
        let id = this._scheduler.scheduleFunction(cb, delay, { args, isRequestAnimationFrame: !isTimer });
        if (isTimer) {
            this.pendingTimers.push(id);
        }
        return id;
    }
    _clearTimeout(id) {
        FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
        this._scheduler.removeScheduledFunctionWithId(id);
    }
    _setInterval(fn, interval, args) {
        let id = Scheduler.nextId;
        let completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
        let cb = this._fnAndFlush(fn, completers);
        // Use the callback created above to requeue on success.
        completers.onSuccess = this._requeuePeriodicTimer(cb, interval, args, id);
        // Queue the callback and dequeue the periodic timer only on error.
        this._scheduler.scheduleFunction(cb, interval, { args, isPeriodic: true });
        this.pendingPeriodicTimers.push(id);
        return id;
    }
    _clearInterval(id) {
        FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
        this._scheduler.removeScheduledFunctionWithId(id);
    }
    _resetLastErrorAndThrow() {
        let error = this._lastError || this._uncaughtPromiseErrors[0];
        this._uncaughtPromiseErrors.length = 0;
        this._lastError = null;
        throw error;
    }
    getCurrentTickTime() {
        return this._scheduler.getCurrentTickTime();
    }
    getFakeSystemTime() {
        return this._scheduler.getFakeSystemTime();
    }
    setFakeBaseSystemTime(realTime) {
        this._scheduler.setFakeBaseSystemTime(realTime);
    }
    getRealSystemTime() {
        return this._scheduler.getRealSystemTime();
    }
    static patchDate() {
        if (!!global[Zone.__symbol__('disableDatePatching')]) {
            // we don't want to patch global Date
            // because in some case, global Date
            // is already being patched, we need to provide
            // an option to let user still use their
            // own version of Date.
            return;
        }
        if (global['Date'] === FakeDate) {
            // already patched
            return;
        }
        global['Date'] = FakeDate;
        FakeDate.prototype = OriginalDate.prototype;
        // try check and reset timers
        // because jasmine.clock().install() may
        // have replaced the global timer
        FakeAsyncTestZoneSpec.checkTimerPatch();
    }
    static resetDate() {
        if (global['Date'] === FakeDate) {
            global['Date'] = OriginalDate;
        }
    }
    static checkTimerPatch() {
        if (!patchedTimers) {
            throw new Error('Expected timers to have been patched.');
        }
        if (global.setTimeout !== patchedTimers.setTimeout) {
            global.setTimeout = patchedTimers.setTimeout;
            global.clearTimeout = patchedTimers.clearTimeout;
        }
        if (global.setInterval !== patchedTimers.setInterval) {
            global.setInterval = patchedTimers.setInterval;
            global.clearInterval = patchedTimers.clearInterval;
        }
    }
    lockDatePatch() {
        this.patchDateLocked = true;
        FakeAsyncTestZoneSpec.patchDate();
    }
    unlockDatePatch() {
        this.patchDateLocked = false;
        FakeAsyncTestZoneSpec.resetDate();
    }
    tickToNext(steps = 1, doTick, tickOptions = { processNewMacroTasksSynchronously: true }) {
        if (steps <= 0) {
            return;
        }
        FakeAsyncTestZoneSpec.assertInZone();
        this.flushMicrotasks();
        this._scheduler.tickToNext(steps, doTick, tickOptions);
        if (this._lastError !== null) {
            this._resetLastErrorAndThrow();
        }
    }
    tick(millis = 0, doTick, tickOptions = { processNewMacroTasksSynchronously: true }) {
        FakeAsyncTestZoneSpec.assertInZone();
        this.flushMicrotasks();
        this._scheduler.tick(millis, doTick, tickOptions);
        if (this._lastError !== null) {
            this._resetLastErrorAndThrow();
        }
    }
    flushMicrotasks() {
        FakeAsyncTestZoneSpec.assertInZone();
        const flushErrors = () => {
            if (this._lastError !== null || this._uncaughtPromiseErrors.length) {
                // If there is an error stop processing the microtask queue and rethrow the error.
                this._resetLastErrorAndThrow();
            }
        };
        while (this._microtasks.length > 0) {
            let microtask = this._microtasks.shift();
            microtask.func.apply(microtask.target, microtask.args);
        }
        flushErrors();
    }
    flush(limit, flushPeriodic, doTick) {
        FakeAsyncTestZoneSpec.assertInZone();
        this.flushMicrotasks();
        const elapsed = this._scheduler.flush(limit, flushPeriodic, doTick);
        if (this._lastError !== null) {
            this._resetLastErrorAndThrow();
        }
        return elapsed;
    }
    flushOnlyPendingTimers(doTick) {
        FakeAsyncTestZoneSpec.assertInZone();
        this.flushMicrotasks();
        const elapsed = this._scheduler.flushOnlyPendingTimers(doTick);
        if (this._lastError !== null) {
            this._resetLastErrorAndThrow();
        }
        return elapsed;
    }
    removeAllTimers() {
        FakeAsyncTestZoneSpec.assertInZone();
        this._scheduler.removeAll();
        this.pendingPeriodicTimers = [];
        this.pendingTimers = [];
    }
    getTimerCount() {
        return this._scheduler.getTimerCount() + this._microtasks.length;
    }
    // ZoneSpec implementation below.
    name;
    properties = { 'FakeAsyncTestZoneSpec': this };
    onScheduleTask(delegate, current, target, task) {
        switch (task.type) {
            case 'microTask':
                let args = task.data && task.data.args;
                // should pass additional arguments to callback if have any
                // currently we know process.nextTick will have such additional
                // arguments
                let additionalArgs;
                if (args) {
                    let callbackIndex = task.data.cbIdx;
                    if (typeof args.length === 'number' && args.length > callbackIndex + 1) {
                        additionalArgs = Array.prototype.slice.call(args, callbackIndex + 1);
                    }
                }
                this._microtasks.push({
                    func: task.invoke,
                    args: additionalArgs,
                    target: task.data && task.data.target,
                });
                break;
            case 'macroTask':
                switch (task.source) {
                    case 'setTimeout':
                        task.data['handleId'] = this._setTimeout(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
                        break;
                    case 'setImmediate':
                        task.data['handleId'] = this._setTimeout(task.invoke, 0, Array.prototype.slice.call(task.data['args'], 1));
                        break;
                    case 'setInterval':
                        task.data['handleId'] = this._setInterval(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
                        break;
                    case 'XMLHttpRequest.send':
                        throw new Error('Cannot make XHRs from within a fake async test. Request URL: ' +
                            task.data['url']);
                    case 'requestAnimationFrame':
                    case 'webkitRequestAnimationFrame':
                    case 'mozRequestAnimationFrame':
                        // Simulate a requestAnimationFrame by using a setTimeout with 16 ms.
                        // (60 frames per second)
                        task.data['handleId'] = this._setTimeout(task.invoke, 16, task.data['args'], this.trackPendingRequestAnimationFrame);
                        break;
                    default:
                        // user can define which macroTask they want to support by passing
                        // macroTaskOptions
                        const macroTaskOption = this.findMacroTaskOption(task);
                        if (macroTaskOption) {
                            const args = task.data && task.data['args'];
                            const delay = args && args.length > 1 ? args[1] : 0;
                            let callbackArgs = macroTaskOption.callbackArgs ? macroTaskOption.callbackArgs : args;
                            if (!!macroTaskOption.isPeriodic) {
                                // periodic macroTask, use setInterval to simulate
                                task.data['handleId'] = this._setInterval(task.invoke, delay, callbackArgs);
                                task.data.isPeriodic = true;
                            }
                            else {
                                // not periodic, use setTimeout to simulate
                                task.data['handleId'] = this._setTimeout(task.invoke, delay, callbackArgs);
                            }
                            break;
                        }
                        throw new Error('Unknown macroTask scheduled in fake async test: ' + task.source);
                }
                break;
            case 'eventTask':
                task = delegate.scheduleTask(target, task);
                break;
        }
        return task;
    }
    onCancelTask(delegate, current, target, task) {
        switch (task.source) {
            case 'setTimeout':
            case 'requestAnimationFrame':
            case 'webkitRequestAnimationFrame':
            case 'mozRequestAnimationFrame':
                return this._clearTimeout(task.data['handleId']);
            case 'setInterval':
                return this._clearInterval(task.data['handleId']);
            default:
                // user can define which macroTask they want to support by passing
                // macroTaskOptions
                const macroTaskOption = this.findMacroTaskOption(task);
                if (macroTaskOption) {
                    const handleId = task.data['handleId'];
                    return macroTaskOption.isPeriodic
                        ? this._clearInterval(handleId)
                        : this._clearTimeout(handleId);
                }
                return delegate.cancelTask(target, task);
        }
    }
    onInvoke(delegate, current, target, callback, applyThis, applyArgs, source) {
        try {
            FakeAsyncTestZoneSpec.patchDate();
            return delegate.invoke(target, callback, applyThis, applyArgs, source);
        }
        finally {
            if (!this.patchDateLocked) {
                FakeAsyncTestZoneSpec.resetDate();
            }
        }
    }
    findMacroTaskOption(task) {
        if (!this.macroTaskOptions) {
            return null;
        }
        for (let i = 0; i < this.macroTaskOptions.length; i++) {
            const macroTaskOption = this.macroTaskOptions[i];
            if (macroTaskOption.source === task.source) {
                return macroTaskOption;
            }
        }
        return null;
    }
    onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
        // ComponentFixture has a special-case handling to detect FakeAsyncTestZoneSpec
        // and prevent rethrowing the error from the onError subscription since it's handled here.
        this._lastError = error;
        return false; // Don't propagate error to parent zone.
    }
}
let _fakeAsyncTestZoneSpec = null;
function getProxyZoneSpec() {
    return Zone && Zone['ProxyZoneSpec'];
}
let _sharedProxyZoneSpec = null;
let _sharedProxyZone = null;
/**
 * Clears out the shared fake async zone for a test.
 * To be called in a global `beforeEach`.
 *
 * @experimental
 */
function resetFakeAsyncZone() {
    if (_fakeAsyncTestZoneSpec) {
        _fakeAsyncTestZoneSpec.unlockDatePatch();
    }
    _fakeAsyncTestZoneSpec = null;
    getProxyZoneSpec()?.get()?.resetDelegate();
    _sharedProxyZoneSpec?.resetDelegate();
}
/**
 * Wraps a function to be executed in the fakeAsync zone:
 * - microtasks are manually executed by calling `flushMicrotasks()`,
 * - timers are synchronous, `tick()` simulates the asynchronous passage of time.
 *
 * When flush is `false`, if there are any pending timers at the end of the function,
 * an exception will be thrown.
 *
 * Can be used to wrap inject() calls.
 *
 * ## Example
 *
 * {@example core/testing/ts/fake_async.ts region='basic'}
 *
 * @param fn
 * @param options
 *     flush: when true, will drain the macrotask queue after the test function completes.
 * @returns The function wrapped to be executed in the fakeAsync zone
 *
 * @experimental
 */
function fakeAsync(fn, options = {}) {
    const { flush = true } = options;
    // Not using an arrow function to preserve context passed from call site
    const fakeAsyncFn = function (...args) {
        const ProxyZoneSpec = getProxyZoneSpec();
        if (!ProxyZoneSpec) {
            throw new Error('ProxyZoneSpec is needed for the fakeAsync() test helper but could not be found. ' +
                'Make sure that your environment includes zone-testing.js');
        }
        const proxyZoneSpec = ProxyZoneSpec.assertPresent();
        if (Zone.current.get('FakeAsyncTestZoneSpec')) {
            throw new Error('fakeAsync() calls can not be nested');
        }
        try {
            // in case jasmine.clock init a fakeAsyncTestZoneSpec
            if (!_fakeAsyncTestZoneSpec) {
                const FakeAsyncTestZoneSpec = Zone && Zone['FakeAsyncTestZoneSpec'];
                if (proxyZoneSpec.getDelegate() instanceof FakeAsyncTestZoneSpec) {
                    throw new Error('fakeAsync() calls can not be nested');
                }
                _fakeAsyncTestZoneSpec = new FakeAsyncTestZoneSpec();
            }
            let res;
            const lastProxyZoneSpec = proxyZoneSpec.getDelegate();
            proxyZoneSpec.setDelegate(_fakeAsyncTestZoneSpec);
            _fakeAsyncTestZoneSpec.lockDatePatch();
            try {
                res = fn.apply(this, args);
                if (flush) {
                    _fakeAsyncTestZoneSpec.flush(20, true);
                }
                else {
                    flushMicrotasks();
                }
            }
            finally {
                proxyZoneSpec.setDelegate(lastProxyZoneSpec);
            }
            if (!flush) {
                if (_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length > 0) {
                    throw new Error(`${_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length} ` +
                        `periodic timer(s) still in the queue.`);
                }
                if (_fakeAsyncTestZoneSpec.pendingTimers.length > 0) {
                    throw new Error(`${_fakeAsyncTestZoneSpec.pendingTimers.length} timer(s) still in the queue.`);
                }
            }
            return res;
        }
        finally {
            resetFakeAsyncZone();
        }
    };
    fakeAsyncFn.isFakeAsync = true;
    return fakeAsyncFn;
}
function _getFakeAsyncZoneSpec() {
    if (_fakeAsyncTestZoneSpec == null) {
        _fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
        if (_fakeAsyncTestZoneSpec == null) {
            throw new Error('The code should be running in the fakeAsync zone to call this function');
        }
    }
    return _fakeAsyncTestZoneSpec;
}
/**
 * Simulates the asynchronous passage of time for the timers in the fakeAsync zone.
 *
 * The microtasks queue is drained at the very start of this function and after any timer
 * callback has been executed.
 *
 * ## Example
 *
 * {@example core/testing/ts/fake_async.ts region='basic'}
 *
 * @experimental
 */
function tick(millis = 0, ignoreNestedTimeout = false) {
    _getFakeAsyncZoneSpec().tick(millis, null, ignoreNestedTimeout);
}
/**
 * Simulates the asynchronous passage of time for the timers in the fakeAsync zone by
 * draining the macrotask queue until it is empty. The returned value is the milliseconds
 * of time that would have been elapsed.
 *
 * @param maxTurns
 * @returns The simulated time elapsed, in millis.
 *
 * @experimental
 */
function flush(maxTurns) {
    return _getFakeAsyncZoneSpec().flush(maxTurns);
}
/**
 * Discard all remaining periodic tasks.
 *
 * @experimental
 */
function discardPeriodicTasks() {
    const zoneSpec = _getFakeAsyncZoneSpec();
    zoneSpec.pendingPeriodicTimers;
    zoneSpec.pendingPeriodicTimers.length = 0;
}
/**
 * Wraps a function to be executed in a shared ProxyZone.
 *
 * If no shared ProxyZone exists, one is created and reused for subsequent calls.
 * Useful for wrapping test setup (beforeEach) and test execution (it) when test
 * runner patching isn't available or desired for setting up the ProxyZone.
 *
 * @param fn The function to wrap.
 * @returns A function that executes the original function within the shared ProxyZone.
 *
 * @experimental
 */
function withProxyZone(fn) {
    const autoProxyFn = function (...args) {
        const proxyZoneSpec = getProxyZoneSpec();
        if (proxyZoneSpec === undefined) {
            throw new Error('ProxyZoneSpec is needed for the withProxyZone() test helper but could not be found. ' +
                'Make sure that your environment includes zone-testing.js');
        }
        const proxyZone = proxyZoneSpec.get() !== undefined ? Zone.current : getOrCreateRootProxy();
        return proxyZone.run(fn, this, args);
    };
    return autoProxyFn;
}
function getOrCreateRootProxy() {
    const ProxyZoneSpec = getProxyZoneSpec();
    if (ProxyZoneSpec === undefined) {
        throw new Error('ProxyZoneSpec is needed for withProxyZone but could not be found. ' +
            'Make sure that your environment includes zone-testing.js');
    }
    // Ensure the shared ProxyZoneSpec instance exists
    if (_sharedProxyZoneSpec === null) {
        _sharedProxyZoneSpec = new ProxyZoneSpec();
    }
    _sharedProxyZone = Zone.root.fork(_sharedProxyZoneSpec);
    return _sharedProxyZone;
}
/**
 * Flush any pending microtasks.
 *
 * @experimental
 */
function flushMicrotasks() {
    _getFakeAsyncZoneSpec().flushMicrotasks();
}
function patchFakeAsyncTest(Zone) {
    // Export the class so that new instances can be created with proper
    // constructor params.
    Zone['FakeAsyncTestZoneSpec'] = FakeAsyncTestZoneSpec;
    Zone.__load_patch('fakeasync', (global, Zone, api) => {
        Zone[api.symbol('fakeAsyncTest')] = {
            resetFakeAsyncZone,
            flushMicrotasks,
            discardPeriodicTasks,
            tick,
            flush,
            fakeAsync,
            withProxyZone,
        };
    }, true);
    patchedTimers = {
        setTimeout: global.setTimeout,
        setInterval: global.setInterval,
        clearTimeout: global.clearTimeout,
        clearInterval: global.clearInterval,
        nativeSetTimeout: global[Zone.__symbol__('setTimeout')],
        nativeClearTimeout: global[Zone.__symbol__('clearTimeout')],
    };
    Scheduler.nextId = Scheduler.getNextId();
}

patchFakeAsyncTest(Zone);
hjx7s"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */const global="object"==typeof window&&window||"object"==typeof self&&self||globalThis.global,OriginalDate=global.Date;function FakeDate(){if(0===arguments.length){const e=new OriginalDate;return e.setTime(FakeDate.now()),e}{const e=Array.prototype.slice.call(arguments);return new OriginalDate(...e)}}let patchedTimers;FakeDate.now=function(){const e=Zone.current.get("FakeAsyncTestZoneSpec");return e?e.getFakeSystemTime():OriginalDate.now.apply(this,arguments)},FakeDate.UTC=OriginalDate.UTC,FakeDate.parse=OriginalDate.parse;const timeoutCallback=function(){};class Scheduler{static nextNodeJSId=1;static nextId=-1;_schedulerQueue=[];_currentTickTime=0;_currentFakeBaseSystemTime=OriginalDate.now();_currentTickRequeuePeriodicEntries=[];constructor(){}static getNextId(){const e=patchedTimers.nativeSetTimeout.call(global,timeoutCallback,0);return patchedTimers.nativeClearTimeout.call(global,e),"number"==typeof e?e:Scheduler.nextNodeJSId++}getCurrentTickTime(){return this._currentTickTime}getFakeSystemTime(){return this._currentFakeBaseSystemTime+this._currentTickTime}setFakeBaseSystemTime(e){this._currentFakeBaseSystemTime=e}getRealSystemTime(){return OriginalDate.now()}scheduleFunction(e,t,s){let r=(s={args:[],isPeriodic:!1,isRequestAnimationFrame:!1,id:-1,isRequeuePeriodic:!1,...s}).id<0?Scheduler.nextId:s.id;Scheduler.nextId=Scheduler.getNextId();let n={endTime:this._currentTickTime+t,id:r,func:e,args:s.args,delay:t,isPeriodic:s.isPeriodic,isRequestAnimationFrame:s.isRequestAnimationFrame};s.isRequeuePeriodic&&this._currentTickRequeuePeriodicEntries.push(n);let i=0;for(;i<this._schedulerQueue.length&&!(n.endTime<this._schedulerQueue[i].endTime);i++);return this._schedulerQueue.splice(i,0,n),r}removeScheduledFunctionWithId(e){for(let t=0;t<this._schedulerQueue.length;t++)if(this._schedulerQueue[t].id==e){this._schedulerQueue.splice(t,1);break}}removeAll(){this._schedulerQueue=[]}getTimerCount(){return this._schedulerQueue.length}tickToNext(e=1,t,s){this._schedulerQueue.length<e||this.tick(this._schedulerQueue[e-1].endTime-this._currentTickTime,t,s)}tick(e=0,t,s){let r=this._currentTickTime+e,n=0;const i=(s=Object.assign({processNewMacroTasksSynchronously:!0},s)).processNewMacroTasksSynchronously?this._schedulerQueue:this._schedulerQueue.slice();if(0===i.length&&t)t(e);else{for(;i.length>0&&(this._currentTickRequeuePeriodicEntries=[],!(r<i[0].endTime));){let e=i.shift();if(!s.processNewMacroTasksSynchronously){const t=this._schedulerQueue.indexOf(e);t>=0&&this._schedulerQueue.splice(t,1)}if(n=this._currentTickTime,this._currentTickTime=e.endTime,t&&t(this._currentTickTime-n),!e.func.apply(global,e.isRequestAnimationFrame?[this._currentTickTime]:e.args))break;s.processNewMacroTasksSynchronously||this._currentTickRequeuePeriodicEntries.forEach((e=>{let t=0;for(;t<i.length&&!(e.endTime<i[t].endTime);t++);i.splice(t,0,e)}))}n=this._currentTickTime,this._currentTickTime=r,t&&t(this._currentTickTime-n)}}flushOnlyPendingTimers(e){if(0===this._schedulerQueue.length)return 0;const t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e,{processNewMacroTasksSynchronously:!1}),this._currentTickTime-t}flush(e=20,t=!1,s){return t?this.flushPeriodic(s):this.flushNonPeriodic(e,s)}flushPeriodic(e){if(0===this._schedulerQueue.length)return 0;const t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e),this._currentTickTime-t}flushNonPeriodic(e,t){const s=this._currentTickTime;let r=0,n=0;for(;this._schedulerQueue.length>0;){if(n++,n>e)throw new Error("flush failed after reaching the limit of "+e+" tasks. Does your code use a polling timeout?");if(0===this._schedulerQueue.filter((e=>!e.isPeriodic&&!e.isRequestAnimationFrame)).length)break;const s=this._schedulerQueue.shift();if(r=this._currentTickTime,this._currentTickTime=s.endTime,t&&t(this._currentTickTime-r),!s.func.apply(global,s.args))break}return this._currentTickTime-s}}class FakeAsyncTestZoneSpec{trackPendingRequestAnimationFrame;macroTaskOptions;static assertInZone(){if(null==Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("The code should be running in the fakeAsync zone to call this function")}_scheduler=new Scheduler;_microtasks=[];_lastError=null;_uncaughtPromiseErrors=Promise[Zone.__symbol__("uncaughtPromiseErrors")];pendingPeriodicTimers=[];pendingTimers=[];patchDateLocked=!1;constructor(e,t=!1,s){this.trackPendingRequestAnimationFrame=t,this.macroTaskOptions=s,this.name="fakeAsyncTestZone for "+e,this.macroTaskOptions||(this.macroTaskOptions=global[Zone.__symbol__("FakeAsyncTestMacroTask")])}_fnAndFlush(e,t){return(...s)=>(e.apply(global,s),null===this._lastError?(null!=t.onSuccess&&t.onSuccess.apply(global),this.flushMicrotasks()):null!=t.onError&&t.onError.apply(global),null===this._lastError)}static _removeTimer(e,t){let s=e.indexOf(t);s>-1&&e.splice(s,1)}_dequeueTimer(e){return()=>{FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers,e)}}_requeuePeriodicTimer(e,t,s,r){return()=>{-1!==this.pendingPeriodicTimers.indexOf(r)&&this._scheduler.scheduleFunction(e,t,{args:s,isPeriodic:!0,id:r,isRequeuePeriodic:!0})}}_dequeuePeriodicTimer(e){return()=>{FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers,e)}}_setTimeout(e,t,s,r=!0){let n=this._dequeueTimer(Scheduler.nextId),i=this._fnAndFlush(e,{onSuccess:n,onError:n}),a=this._scheduler.scheduleFunction(i,t,{args:s,isRequestAnimationFrame:!r});return r&&this.pendingTimers.push(a),a}_clearTimeout(e){FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers,e),this._scheduler.removeScheduledFunctionWithId(e)}_setInterval(e,t,s){let r=Scheduler.nextId,n={onSuccess:null,onError:this._dequeuePeriodicTimer(r)},i=this._fnAndFlush(e,n);return n.onSuccess=this._requeuePeriodicTimer(i,t,s,r),this._scheduler.scheduleFunction(i,t,{args:s,isPeriodic:!0}),this.pendingPeriodicTimers.push(r),r}_clearInterval(e){FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers,e),this._scheduler.removeScheduledFunctionWithId(e)}_resetLastErrorAndThrow(){let e=this._lastError||this._uncaughtPromiseErrors[0];throw this._uncaughtPromiseErrors.length=0,this._lastError=null,e}getCurrentTickTime(){return this._scheduler.getCurrentTickTime()}getFakeSystemTime(){return this._scheduler.getFakeSystemTime()}setFakeBaseSystemTime(e){this._scheduler.setFakeBaseSystemTime(e)}getRealSystemTime(){return this._scheduler.getRealSystemTime()}static patchDate(){global[Zone.__symbol__("disableDatePatching")]||global.Date!==FakeDate&&(global.Date=FakeDate,FakeDate.prototype=OriginalDate.prototype,FakeAsyncTestZoneSpec.checkTimerPatch())}static resetDate(){global.Date===FakeDate&&(global.Date=OriginalDate)}static checkTimerPatch(){if(!patchedTimers)throw new Error("Expected timers to have been patched.");global.setTimeout!==patchedTimers.setTimeout&&(global.setTimeout=patchedTimers.setTimeout,global.clearTimeout=patchedTimers.clearTimeout),global.setInterval!==patchedTimers.setInterval&&(global.setInterval=patchedTimers.setInterval,global.clearInterval=patchedTimers.clearInterval)}lockDatePatch(){this.patchDateLocked=!0,FakeAsyncTestZoneSpec.patchDate()}unlockDatePatch(){this.patchDateLocked=!1,FakeAsyncTestZoneSpec.resetDate()}tickToNext(e=1,t,s={processNewMacroTasksSynchronously:!0}){e<=0||(FakeAsyncTestZoneSpec.assertInZone(),this.flushMicrotasks(),this._scheduler.tickToNext(e,t,s),null!==this._lastError&&this._resetLastErrorAndThrow())}tick(e=0,t,s={processNewMacroTasksSynchronously:!0}){FakeAsyncTestZoneSpec.assertInZone(),this.flushMicrotasks(),this._scheduler.tick(e,t,s),null!==this._lastError&&this._resetLastErrorAndThrow()}flushMicrotasks(){for(FakeAsyncTestZoneSpec.assertInZone();this._microtasks.length>0;){let e=this._microtasks.shift();e.func.apply(e.target,e.args)}(()=>{(null!==this._lastError||this._uncaughtPromiseErrors.length)&&this._resetLastErrorAndThrow()})()}flush(e,t,s){FakeAsyncTestZoneSpec.assertInZone(),this.flushMicrotasks();const r=this._scheduler.flush(e,t,s);return null!==this._lastError&&this._resetLastErrorAndThrow(),r}flushOnlyPendingTimers(e){FakeAsyncTestZoneSpec.assertInZone(),this.flushMicrotasks();const t=this._scheduler.flushOnlyPendingTimers(e);return null!==this._lastError&&this._resetLastErrorAndThrow(),t}removeAllTimers(){FakeAsyncTestZoneSpec.assertInZone(),this._scheduler.removeAll(),this.pendingPeriodicTimers=[],this.pendingTimers=[]}getTimerCount(){return this._scheduler.getTimerCount()+this._microtasks.length}name;properties={FakeAsyncTestZoneSpec:this};onScheduleTask(e,t,s,r){switch(r.type){case"microTask":let t,n=r.data&&r.data.args;if(n){let e=r.data.cbIdx;"number"==typeof n.length&&n.length>e+1&&(t=Array.prototype.slice.call(n,e+1))}this._microtasks.push({func:r.invoke,args:t,target:r.data&&r.data.target});break;case"macroTask":switch(r.source){case"setTimeout":r.data.handleId=this._setTimeout(r.invoke,r.data.delay,Array.prototype.slice.call(r.data.args,2));break;case"setImmediate":r.data.handleId=this._setTimeout(r.invoke,0,Array.prototype.slice.call(r.data.args,1));break;case"setInterval":r.data.handleId=this._setInterval(r.invoke,r.data.delay,Array.prototype.slice.call(r.data.args,2));break;case"XMLHttpRequest.send":throw new Error("Cannot make XHRs from within a fake async test. Request URL: "+r.data.url);case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":r.data.handleId=this._setTimeout(r.invoke,16,r.data.args,this.trackPendingRequestAnimationFrame);break;default:const e=this.findMacroTaskOption(r);if(e){const t=r.data&&r.data.args,s=t&&t.length>1?t[1]:0;let n=e.callbackArgs?e.callbackArgs:t;e.isPeriodic?(r.data.handleId=this._setInterval(r.invoke,s,n),r.data.isPeriodic=!0):r.data.handleId=this._setTimeout(r.invoke,s,n);break}throw new Error("Unknown macroTask scheduled in fake async test: "+r.source)}break;case"eventTask":r=e.scheduleTask(s,r)}return r}onCancelTask(e,t,s,r){switch(r.source){case"setTimeout":case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":return this._clearTimeout(r.data.handleId);case"setInterval":return this._clearInterval(r.data.handleId);default:const t=this.findMacroTaskOption(r);if(t){const e=r.data.handleId;return t.isPeriodic?this._clearInterval(e):this._clearTimeout(e)}return e.cancelTask(s,r)}}onInvoke(e,t,s,r,n,i,a){try{return FakeAsyncTestZoneSpec.patchDate(),e.invoke(s,r,n,i,a)}finally{this.patchDateLocked||FakeAsyncTestZoneSpec.resetDate()}}findMacroTaskOption(e){if(!this.macroTaskOptions)return null;for(let t=0;t<this.macroTaskOptions.length;t++){const s=this.macroTaskOptions[t];if(s.source===e.source)return s}return null}onHandleError(e,t,s,r){return this._lastError=r,!1}}let _fakeAsyncTestZoneSpec=null;function getProxyZoneSpec(){return Zone&&Zone.ProxyZoneSpec}let _sharedProxyZoneSpec=null,_sharedProxyZone=null;function resetFakeAsyncZone(){_fakeAsyncTestZoneSpec&&_fakeAsyncTestZoneSpec.unlockDatePatch(),_fakeAsyncTestZoneSpec=null,getProxyZoneSpec()?.get()?.resetDelegate(),_sharedProxyZoneSpec?.resetDelegate()}function fakeAsync(e,t={}){const{flush:s=!0}=t,r=function(...t){const r=getProxyZoneSpec();if(!r)throw new Error("ProxyZoneSpec is needed for the fakeAsync() test helper but could not be found. Make sure that your environment includes zone-testing.js");const n=r.assertPresent();if(Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("fakeAsync() calls can not be nested");try{if(!_fakeAsyncTestZoneSpec){const e=Zone&&Zone.FakeAsyncTestZoneSpec;if(n.getDelegate()instanceof e)throw new Error("fakeAsync() calls can not be nested");_fakeAsyncTestZoneSpec=new e}let r;const i=n.getDelegate();n.setDelegate(_fakeAsyncTestZoneSpec),_fakeAsyncTestZoneSpec.lockDatePatch();try{r=e.apply(this,t),s?_fakeAsyncTestZoneSpec.flush(20,!0):flushMicrotasks()}finally{n.setDelegate(i)}if(!s){if(_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length>0)throw new Error(`${_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length} periodic timer(s) still in the queue.`);if(_fakeAsyncTestZoneSpec.pendingTimers.length>0)throw new Error(`${_fakeAsyncTestZoneSpec.pendingTimers.length} timer(s) still in the queue.`)}return r}finally{resetFakeAsyncZone()}};return r.isFakeAsync=!0,r}function _getFakeAsyncZoneSpec(){if(null==_fakeAsyncTestZoneSpec&&(_fakeAsyncTestZoneSpec=Zone.current.get("FakeAsyncTestZoneSpec"),null==_fakeAsyncTestZoneSpec))throw new Error("The code should be running in the fakeAsync zone to call this function");return _fakeAsyncTestZoneSpec}function tick(e=0,t=!1){_getFakeAsyncZoneSpec().tick(e,null,t)}function flush(e){return _getFakeAsyncZoneSpec().flush(e)}function discardPeriodicTasks(){_getFakeAsyncZoneSpec().pendingPeriodicTimers.length=0}function withProxyZone(e){return function(...t){const s=getProxyZoneSpec();if(void 0===s)throw new Error("ProxyZoneSpec is needed for the withProxyZone() test helper but could not be found. Make sure that your environment includes zone-testing.js");return(void 0!==s.get()?Zone.current:getOrCreateRootProxy()).run(e,this,t)}}function getOrCreateRootProxy(){const e=getProxyZoneSpec();if(void 0===e)throw new Error("ProxyZoneSpec is needed for withProxyZone but could not be found. Make sure that your environment includes zone-testing.js");return null===_sharedProxyZoneSpec&&(_sharedProxyZoneSpec=new e),_sharedProxyZone=Zone.root.fork(_sharedProxyZoneSpec),_sharedProxyZone}function flushMicrotasks(){_getFakeAsyncZoneSpec().flushMicrotasks()}function patchFakeAsyncTest(e){e.FakeAsyncTestZoneSpec=FakeAsyncTestZoneSpec,e.__load_patch("fakeasync",((e,t,s)=>{t[s.symbol("fakeAsyncTest")]={resetFakeAsyncZone:resetFakeAsyncZone,flushMicrotasks:flushMicrotasks,discardPeriodicTasks:discardPeriodicTasks,tick:tick,flush:flush,fakeAsync:fakeAsync,withProxyZone:withProxyZone}}),!0),patchedTimers={setTimeout:global.setTimeout,setInterval:global.setInterval,clearTimeout:global.clearTimeout,clearInterval:global.clearInterval,nativeSetTimeout:global[e.__symbol__("setTimeout")],nativeClearTimeout:global[e.__symbol__("clearTimeout")]},Scheduler.nextId=Scheduler.getNextId()}patchFakeAsyncTest(Zone);==xE2'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchJasmine(Zone) {
    Zone.__load_patch('jasmine', (global, Zone, api) => {
        const __extends = function (d, b) {
            for (const p in b)
                if (b.hasOwnProperty(p))
                    d[p] = b[p];
            function __() {
                this.constructor = d;
            }
            d.prototype =
                b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());
        };
        // Patch jasmine's describe/it/beforeEach/afterEach functions so test code always runs
        // in a testZone (ProxyZone). (See: angular/zone.js#91 & angular/angular#10503)
        if (!Zone)
            throw new Error('Missing: zone.js');
        if (typeof jest !== 'undefined') {
            // return if jasmine is a light implementation inside jest
            // in this case, we are running inside jest not jasmine
            return;
        }
        if (typeof jasmine == 'undefined' || jasmine['__zone_patch__']) {
            return;
        }
        jasmine['__zone_patch__'] = true;
        const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
        const ProxyZoneSpec = Zone['ProxyZoneSpec'];
        if (!SyncTestZoneSpec)
            throw new Error('Missing: SyncTestZoneSpec');
        if (!ProxyZoneSpec)
            throw new Error('Missing: ProxyZoneSpec');
        const ambientZone = Zone.current;
        const symbol = Zone.__symbol__;
        // whether patch jasmine clock when in fakeAsync
        const disablePatchingJasmineClock = global[symbol('fakeAsyncDisablePatchingClock')] === true;
        // the original variable name fakeAsyncPatchLock is not accurate, so the name will be
        // fakeAsyncAutoFakeAsyncWhenClockPatched and if this enablePatchingJasmineClock is false, we
        // also automatically disable the auto jump into fakeAsync feature
        const enableAutoFakeAsyncWhenClockPatched = !disablePatchingJasmineClock &&
            (global[symbol('fakeAsyncPatchLock')] === true ||
                global[symbol('fakeAsyncAutoFakeAsyncWhenClockPatched')] === true);
        const ignoreUnhandledRejection = global[symbol('ignoreUnhandledRejection')] === true;
        if (!ignoreUnhandledRejection) {
            const globalErrors = jasmine.GlobalErrors;
            if (globalErrors && !jasmine[symbol('GlobalErrors')]) {
                jasmine[symbol('GlobalErrors')] = globalErrors;
                jasmine.GlobalErrors = function () {
                    const instance = new globalErrors();
                    const originalInstall = instance.install;
                    if (originalInstall && !instance[symbol('install')]) {
                        instance[symbol('install')] = originalInstall;
                        instance.install = function () {
                            const isNode = typeof process !== 'undefined' && !!process.on;
                            // Note: Jasmine checks internally if `process` and `process.on` is defined.
                            // Otherwise, it installs the browser rejection handler through the
                            // `global.addEventListener`. This code may be run in the browser environment where
                            // `process` is not defined, and this will lead to a runtime exception since webpack 5
                            // removed automatic Node.js polyfills. Note, that events are named differently, it's
                            // `unhandledRejection` in Node.js and `unhandledrejection` in the browser.
                            const originalHandlers = isNode
                                ? process.listeners('unhandledRejection')
                                : global.eventListeners('unhandledrejection');
                            const result = originalInstall.apply(this, arguments);
                            isNode
                                ? process.removeAllListeners('unhandledRejection')
                                : global.removeAllListeners('unhandledrejection');
                            if (originalHandlers) {
                                originalHandlers.forEach((handler) => {
                                    if (isNode) {
                                        process.on('unhandledRejection', handler);
                                    }
                                    else {
                                        global.addEventListener('unhandledrejection', handler);
                                    }
                                });
                            }
                            return result;
                        };
                    }
                    return instance;
                };
            }
        }
        // Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
        const jasmineEnv = jasmine.getEnv();
        ['describe', 'xdescribe', 'fdescribe'].forEach((methodName) => {
            let originalJasmineFn = jasmineEnv[methodName];
            jasmineEnv[methodName] = function (description, specDefinitions) {
                return originalJasmineFn.call(this, description, wrapDescribeInZone(description, specDefinitions));
            };
        });
        ['it', 'xit', 'fit'].forEach((methodName) => {
            let originalJasmineFn = jasmineEnv[methodName];
            jasmineEnv[symbol(methodName)] = originalJasmineFn;
            jasmineEnv[methodName] = function (description, specDefinitions, timeout) {
                arguments[1] = wrapTestInZone(specDefinitions);
                return originalJasmineFn.apply(this, arguments);
            };
        });
        ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach((methodName) => {
            let originalJasmineFn = jasmineEnv[methodName];
            jasmineEnv[symbol(methodName)] = originalJasmineFn;
            jasmineEnv[methodName] = function (specDefinitions, timeout) {
                arguments[0] = wrapTestInZone(specDefinitions);
                return originalJasmineFn.apply(this, arguments);
            };
        });
        if (!disablePatchingJasmineClock) {
            // need to patch jasmine.clock().mockDate and jasmine.clock().tick() so
            // they can work properly in FakeAsyncTest
            const originalClockFn = (jasmine[symbol('clock')] = jasmine['clock']);
            jasmine['clock'] = function () {
                const clock = originalClockFn.apply(this, arguments);
                if (!clock[symbol('patched')]) {
                    clock[symbol('patched')] = symbol('patched');
                    const originalTick = (clock[symbol('tick')] = clock.tick);
                    clock.tick = function () {
                        const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            return fakeAsyncZoneSpec.tick.apply(fakeAsyncZoneSpec, arguments);
                        }
                        return originalTick.apply(this, arguments);
                    };
                    const originalMockDate = (clock[symbol('mockDate')] = clock.mockDate);
                    clock.mockDate = function () {
                        const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            const dateTime = arguments.length > 0 ? arguments[0] : new Date();
                            return fakeAsyncZoneSpec.setFakeBaseSystemTime.apply(fakeAsyncZoneSpec, dateTime && typeof dateTime.getTime === 'function'
                                ? [dateTime.getTime()]
                                : arguments);
                        }
                        return originalMockDate.apply(this, arguments);
                    };
                    // for auto go into fakeAsync feature, we need the flag to enable it
                    if (enableAutoFakeAsyncWhenClockPatched) {
                        ['install', 'uninstall'].forEach((methodName) => {
                            const originalClockFn = (clock[symbol(methodName)] = clock[methodName]);
                            clock[methodName] = function () {
                                const FakeAsyncTestZoneSpec = Zone['FakeAsyncTestZoneSpec'];
                                if (FakeAsyncTestZoneSpec) {
                                    jasmine[symbol('clockInstalled')] = 'install' === methodName;
                                    return;
                                }
                                return originalClockFn.apply(this, arguments);
                            };
                        });
                    }
                }
                return clock;
            };
        }
        // monkey patch createSpyObj to make properties enumerable to true
        if (!jasmine[Zone.__symbol__('createSpyObj')]) {
            const originalCreateSpyObj = jasmine.createSpyObj;
            jasmine[Zone.__symbol__('createSpyObj')] = originalCreateSpyObj;
            jasmine.createSpyObj = function () {
                const args = Array.prototype.slice.call(arguments);
                const propertyNames = args.length >= 3 ? args[2] : null;
                let spyObj;
                if (propertyNames) {
                    const defineProperty = Object.defineProperty;
                    Object.defineProperty = function (obj, p, attributes) {
                        return defineProperty.call(this, obj, p, {
                            ...attributes,
                            configurable: true,
                            enumerable: true,
                        });
                    };
                    try {
                        spyObj = originalCreateSpyObj.apply(this, args);
                    }
                    finally {
                        Object.defineProperty = defineProperty;
                    }
                }
                else {
                    spyObj = originalCreateSpyObj.apply(this, args);
                }
                return spyObj;
            };
        }
        /**
         * Gets a function wrapping the body of a Jasmine `describe` block to execute in a
         * synchronous-only zone.
         */
        function wrapDescribeInZone(description, describeBody) {
            return function () {
                // Create a synchronous-only zone in which to run `describe` blocks in order to raise an
                // error if any asynchronous operations are attempted inside of a `describe`.
                const syncZone = ambientZone.fork(new SyncTestZoneSpec(`jasmine.describe#${description}`));
                return syncZone.run(describeBody, this, arguments);
            };
        }
        function runInTestZone(testBody, applyThis, queueRunner, done) {
            const isClockInstalled = !!jasmine[symbol('clockInstalled')];
            queueRunner.testProxyZoneSpec;
            const testProxyZone = queueRunner.testProxyZone;
            if (isClockInstalled && enableAutoFakeAsyncWhenClockPatched) {
                // auto run a fakeAsync
                const fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
                if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
                    testBody = fakeAsyncModule.fakeAsync(testBody);
                }
            }
            if (done) {
                return testProxyZone.run(testBody, applyThis, [done]);
            }
            else {
                return testProxyZone.run(testBody, applyThis);
            }
        }
        /**
         * Gets a function wrapping the body of a Jasmine `it/beforeEach/afterEach` block to
         * execute in a ProxyZone zone.
         * This will run in `testProxyZone`. The `testProxyZone` will be reset by the `ZoneQueueRunner`
         */
        function wrapTestInZone(testBody) {
            // The `done` callback is only passed through if the function expects at least one argument.
            // Note we have to make a function with correct number of arguments, otherwise jasmine will
            // think that all functions are sync or async.
            return (testBody &&
                (testBody.length
                    ? function (done) {
                        return runInTestZone(testBody, this, this.queueRunner, done);
                    }
                    : function () {
                        return runInTestZone(testBody, this, this.queueRunner);
                    }));
        }
        const QueueRunner = jasmine.QueueRunner;
        jasmine.QueueRunner = (function (_super) {
            __extends(ZoneQueueRunner, _super);
            function ZoneQueueRunner(attrs) {
                if (attrs.onComplete) {
                    attrs.onComplete = ((fn) => () => {
                        // All functions are done, clear the test zone.
                        this.testProxyZone = null;
                        this.testProxyZoneSpec = null;
                        ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
                    })(attrs.onComplete);
                }
                const nativeSetTimeout = global[Zone.__symbol__('setTimeout')];
                const nativeClearTimeout = global[Zone.__symbol__('clearTimeout')];
                if (nativeSetTimeout) {
                    // should run setTimeout inside jasmine outside of zone
                    attrs.timeout = {
                        setTimeout: nativeSetTimeout ? nativeSetTimeout : global.setTimeout,
                        clearTimeout: nativeClearTimeout ? nativeClearTimeout : global.clearTimeout,
                    };
                }
                // create a userContext to hold the queueRunner itself
                // so we can access the testProxy in it/xit/beforeEach ...
                if (jasmine.UserContext) {
                    if (!attrs.userContext) {
                        attrs.userContext = new jasmine.UserContext();
                    }
                    attrs.userContext.queueRunner = this;
                }
                else {
                    if (!attrs.userContext) {
                        attrs.userContext = {};
                    }
                    attrs.userContext.queueRunner = this;
                }
                // patch attrs.onException
                const onException = attrs.onException;
                attrs.onException = function (error) {
                    if (error &&
                        error.message ===
                            'Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.') {
                        // jasmine timeout, we can make the error message more
                        // reasonable to tell what tasks are pending
                        const proxyZoneSpec = this && this.testProxyZoneSpec;
                        if (proxyZoneSpec) {
                            const pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
                            try {
                                // try catch here in case error.message is not writable
                                error.message += pendingTasksInfo;
                            }
                            catch (err) { }
                        }
                    }
                    if (onException) {
                        onException.call(this, error);
                    }
                };
                _super.call(this, attrs);
            }
            ZoneQueueRunner.prototype.execute = function () {
                let zone = Zone.current;
                let isChildOfAmbientZone = false;
                while (zone) {
                    if (zone === ambientZone) {
                        isChildOfAmbientZone = true;
                        break;
                    }
                    zone = zone.parent;
                }
                if (!isChildOfAmbientZone)
                    throw new Error('Unexpected Zone: ' + Zone.current.name);
                // This is the zone which will be used for running individual tests.
                // It will be a proxy zone, so that the tests function can retroactively install
                // different zones.
                // Example:
                //   - In beforeEach() do childZone = Zone.current.fork(...);
                //   - In it() try to do fakeAsync(). The issue is that because the beforeEach forked the
                //     zone outside of fakeAsync it will be able to escape the fakeAsync rules.
                //   - Because ProxyZone is parent fo `childZone` fakeAsync can retroactively add
                //     fakeAsync behavior to the childZone.
                this.testProxyZoneSpec = new ProxyZoneSpec();
                this.testProxyZone = ambientZone.fork(this.testProxyZoneSpec);
                if (!Zone.currentTask) {
                    // if we are not running in a task then if someone would register a
                    // element.addEventListener and then calling element.click() the
                    // addEventListener callback would think that it is the top most task and would
                    // drain the microtask queue on element.click() which would be incorrect.
                    // For this reason we always force a task when running jasmine tests.
                    Zone.current.scheduleMicroTask('jasmine.execute().forceTask', () => QueueRunner.prototype.execute.call(this));
                }
                else {
                    _super.prototype.execute.call(this);
                }
            };
            return ZoneQueueRunner;
        })(QueueRunner);
    });
}

patchJasmine(Zone);
x'"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchJasmine(e){e.__load_patch("jasmine",((e,n,t)=>{if(!n)throw new Error("Missing: zone.js");if("undefined"!=typeof jest)return;if("undefined"==typeof jasmine||jasmine.__zone_patch__)return;jasmine.__zone_patch__=!0;const o=n.SyncTestZoneSpec,s=n.ProxyZoneSpec;if(!o)throw new Error("Missing: SyncTestZoneSpec");if(!s)throw new Error("Missing: ProxyZoneSpec");const r=n.current,c=n.__symbol__,i=!0===e[c("fakeAsyncDisablePatchingClock")],a=!i&&(!0===e[c("fakeAsyncPatchLock")]||!0===e[c("fakeAsyncAutoFakeAsyncWhenClockPatched")]);if(!0!==e[c("ignoreUnhandledRejection")]){const n=jasmine.GlobalErrors;n&&!jasmine[c("GlobalErrors")]&&(jasmine[c("GlobalErrors")]=n,jasmine.GlobalErrors=function(){const t=new n,o=t.install;return o&&!t[c("install")]&&(t[c("install")]=o,t.install=function(){const n="undefined"!=typeof process&&!!process.on,t=n?process.listeners("unhandledRejection"):e.eventListeners("unhandledrejection"),s=o.apply(this,arguments);return n?process.removeAllListeners("unhandledRejection"):e.removeAllListeners("unhandledrejection"),t&&t.forEach((t=>{n?process.on("unhandledRejection",t):e.addEventListener("unhandledrejection",t)})),s}),t})}const l=jasmine.getEnv();if(["describe","xdescribe","fdescribe"].forEach((e=>{let n=l[e];l[e]=function(e,t){return n.call(this,e,function s(e,n){return function(){return r.fork(new o(`jasmine.describe#${e}`)).run(n,this,arguments)}}(e,t))}})),["it","xit","fit"].forEach((e=>{let n=l[e];l[c(e)]=n,l[e]=function(e,t,o){return arguments[1]=p(t),n.apply(this,arguments)}})),["beforeEach","afterEach","beforeAll","afterAll"].forEach((e=>{let n=l[e];l[c(e)]=n,l[e]=function(e,t){return arguments[0]=p(e),n.apply(this,arguments)}})),!i){const e=jasmine[c("clock")]=jasmine.clock;jasmine.clock=function(){const t=e.apply(this,arguments);if(!t[c("patched")]){t[c("patched")]=c("patched");const e=t[c("tick")]=t.tick;t.tick=function(){const t=n.current.get("FakeAsyncTestZoneSpec");return t?t.tick.apply(t,arguments):e.apply(this,arguments)};const o=t[c("mockDate")]=t.mockDate;t.mockDate=function(){const e=n.current.get("FakeAsyncTestZoneSpec");if(e){const n=arguments.length>0?arguments[0]:new Date;return e.setFakeBaseSystemTime.apply(e,n&&"function"==typeof n.getTime?[n.getTime()]:arguments)}return o.apply(this,arguments)},a&&["install","uninstall"].forEach((e=>{const o=t[c(e)]=t[e];t[e]=function(){if(!n.FakeAsyncTestZoneSpec)return o.apply(this,arguments);jasmine[c("clockInstalled")]="install"===e}}))}return t}}if(!jasmine[n.__symbol__("createSpyObj")]){const e=jasmine.createSpyObj;jasmine[n.__symbol__("createSpyObj")]=e,jasmine.createSpyObj=function(){const n=Array.prototype.slice.call(arguments);let t;if(n.length>=3&&n[2]){const o=Object.defineProperty;Object.defineProperty=function(e,n,t){return o.call(this,e,n,{...t,configurable:!0,enumerable:!0})};try{t=e.apply(this,n)}finally{Object.defineProperty=o}}else t=e.apply(this,n);return t}}function u(e,t,o,s){const r=!!jasmine[c("clockInstalled")],i=o.testProxyZone;if(r&&a){const t=n[n.__symbol__("fakeAsyncTest")];t&&"function"==typeof t.fakeAsync&&(e=t.fakeAsync(e))}return s?i.run(e,t,[s]):i.run(e,t)}function p(e){return e&&(e.length?function(n){return u(e,this,this.queueRunner,n)}:function(){return u(e,this,this.queueRunner)})}const f=jasmine.QueueRunner;jasmine.QueueRunner=function(t){function o(o){o.onComplete&&(o.onComplete=(e=>()=>{this.testProxyZone=null,this.testProxyZoneSpec=null,r.scheduleMicroTask("jasmine.onComplete",e)})(o.onComplete));const s=e[n.__symbol__("setTimeout")],c=e[n.__symbol__("clearTimeout")];s&&(o.timeout={setTimeout:s||e.setTimeout,clearTimeout:c||e.clearTimeout}),jasmine.UserContext?(o.userContext||(o.userContext=new jasmine.UserContext),o.userContext.queueRunner=this):(o.userContext||(o.userContext={}),o.userContext.queueRunner=this);const i=o.onException;o.onException=function(e){if(e&&"Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL."===e.message){const n=this&&this.testProxyZoneSpec;if(n){const t=n.getAndClearPendingTasksInfo();try{e.message+=t}catch(e){}}}i&&i.call(this,e)},t.call(this,o)}return function(e,n){for(const t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);function t(){this.constructor=e}e.prototype=null===n?Object.create(n):(t.prototype=n.prototype,new t)}(o,t),o.prototype.execute=function(){let e=n.current,o=!1;for(;e;){if(e===r){o=!0;break}e=e.parent}if(!o)throw new Error("Unexpected Zone: "+n.current.name);this.testProxyZoneSpec=new s,this.testProxyZone=r.fork(this.testProxyZoneSpec),n.currentTask?t.prototype.execute.call(this):n.current.scheduleMicroTask("jasmine.execute().forceTask",(()=>f.prototype.execute.call(this)))},o}(f)}))}patchJasmine(Zone);0G<x'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
/**
 * @fileoverview
 * @suppress {globalThis}
 */
function patchLongStackTrace(Zone) {
    const NEWLINE = '\n';
    const IGNORE_FRAMES = {};
    const creationTrace = '__creationTrace__';
    const ERROR_TAG = 'STACKTRACE TRACKING';
    const SEP_TAG = '__SEP_TAG__';
    let sepTemplate = SEP_TAG + '@[native]';
    class LongStackTrace {
        error = getStacktrace();
        timestamp = new Date();
    }
    function getStacktraceWithUncaughtError() {
        return new Error(ERROR_TAG);
    }
    function getStacktraceWithCaughtError() {
        try {
            throw getStacktraceWithUncaughtError();
        }
        catch (err) {
            return err;
        }
    }
    // Some implementations of exception handling don't create a stack trace if the exception
    // isn't thrown, however it's faster not to actually throw the exception.
    const error = getStacktraceWithUncaughtError();
    const caughtError = getStacktraceWithCaughtError();
    const getStacktrace = error.stack
        ? getStacktraceWithUncaughtError
        : caughtError.stack
            ? getStacktraceWithCaughtError
            : getStacktraceWithUncaughtError;
    function getFrames(error) {
        return error.stack ? error.stack.split(NEWLINE) : [];
    }
    function addErrorStack(lines, error) {
        let trace = getFrames(error);
        for (let i = 0; i < trace.length; i++) {
            const frame = trace[i];
            // Filter out the Frames which are part of stack capturing.
            if (!IGNORE_FRAMES.hasOwnProperty(frame)) {
                lines.push(trace[i]);
            }
        }
    }
    function renderLongStackTrace(frames, stack) {
        const longTrace = [stack ? stack.trim() : ''];
        if (frames) {
            let timestamp = new Date().getTime();
            for (let i = 0; i < frames.length; i++) {
                const traceFrames = frames[i];
                const lastTime = traceFrames.timestamp;
                let separator = `____________________Elapsed ${timestamp - lastTime.getTime()} ms; At: ${lastTime}`;
                separator = separator.replace(/[^\w\d]/g, '_');
                longTrace.push(sepTemplate.replace(SEP_TAG, separator));
                addErrorStack(longTrace, traceFrames.error);
                timestamp = lastTime.getTime();
            }
        }
        return longTrace.join(NEWLINE);
    }
    // if Error.stackTraceLimit is 0, means stack trace
    // is disabled, so we don't need to generate long stack trace
    // this will improve performance in some test(some test will
    // set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
    function stackTracesEnabled() {
        // Cast through any since this property only exists on Error in the nodejs
        // typings.
        return Error.stackTraceLimit > 0;
    }
    Zone['longStackTraceZoneSpec'] = {
        name: 'long-stack-trace',
        longStackTraceLimit: 10, // Max number of task to keep the stack trace for.
        // add a getLongStackTrace method in spec to
        // handle handled reject promise error.
        getLongStackTrace: function (error) {
            if (!error) {
                return undefined;
            }
            const trace = error[Zone.__symbol__('currentTaskTrace')];
            if (!trace) {
                return error.stack;
            }
            return renderLongStackTrace(trace, error.stack);
        },
        onScheduleTask: function (parentZoneDelegate, currentZone, targetZone, task) {
            if (stackTracesEnabled()) {
                const currentTask = Zone.currentTask;
                let trace = (currentTask && currentTask.data && currentTask.data[creationTrace]) || [];
                trace = [new LongStackTrace()].concat(trace);
                if (trace.length > this.longStackTraceLimit) {
                    trace.length = this.longStackTraceLimit;
                }
                if (!task.data)
                    task.data = {};
                if (task.type === 'eventTask') {
                    // Fix issue https://github.com/angular/zone.js/issues/1195,
                    // For event task of browser, by default, all task will share a
                    // singleton instance of data object, we should create a new one here
                    // The cast to `any` is required to workaround a closure bug which wrongly applies
                    // URL sanitization rules to .data access.
                    task.data = { ...task.data };
                }
                task.data[creationTrace] = trace;
            }
            return parentZoneDelegate.scheduleTask(targetZone, task);
        },
        onHandleError: function (parentZoneDelegate, currentZone, targetZone, error) {
            if (stackTracesEnabled()) {
                const parentTask = Zone.currentTask || error.task;
                if (error instanceof Error && parentTask) {
                    const longStack = renderLongStackTrace(parentTask.data && parentTask.data[creationTrace], error.stack);
                    try {
                        error.stack = error.longStack = longStack;
                    }
                    catch (err) { }
                }
            }
            return parentZoneDelegate.handleError(targetZone, error);
        },
    };
    function captureStackTraces(stackTraces, count) {
        if (count > 0) {
            stackTraces.push(getFrames(new LongStackTrace().error));
            captureStackTraces(stackTraces, count - 1);
        }
    }
    function computeIgnoreFrames() {
        if (!stackTracesEnabled()) {
            return;
        }
        const frames = [];
        captureStackTraces(frames, 2);
        const frames1 = frames[0];
        const frames2 = frames[1];
        for (let i = 0; i < frames1.length; i++) {
            const frame1 = frames1[i];
            if (frame1.indexOf(ERROR_TAG) == -1) {
                let match = frame1.match(/^\s*at\s+/);
                if (match) {
                    sepTemplate = match[0] + SEP_TAG + ' (http://localhost)';
                    break;
                }
            }
        }
        for (let i = 0; i < frames1.length; i++) {
            const frame1 = frames1[i];
            const frame2 = frames2[i];
            if (frame1 === frame2) {
                IGNORE_FRAMES[frame1] = true;
            }
            else {
                break;
            }
        }
    }
    computeIgnoreFrames();
}

patchLongStackTrace(Zone);
7wxx"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchLongStackTrace(t){const n={},e="__creationTrace__",a="STACKTRACE TRACKING",r="__SEP_TAG__";let c=r+"@[native]";class o{error=u();timestamp=new Date}function s(){return new Error(a)}function i(){try{throw s()}catch(t){return t}}const l=s(),_=i(),u=l.stack?s:_.stack?i:s;function f(t){return t.stack?t.stack.split("\n"):[]}function k(t,e){let a=f(e);for(let e=0;e<a.length;e++)n.hasOwnProperty(a[e])||t.push(a[e])}function h(t,n){const e=[n?n.trim():""];if(t){let n=(new Date).getTime();for(let a=0;a<t.length;a++){const o=t[a],s=o.timestamp;let i=`____________________Elapsed ${n-s.getTime()} ms; At: ${s}`;i=i.replace(/[^\w\d]/g,"_"),e.push(c.replace(r,i)),k(e,o.error),n=s.getTime()}}return e.join("\n")}function T(){return Error.stackTraceLimit>0}function g(t,n){n>0&&(t.push(f((new o).error)),g(t,n-1))}t.longStackTraceZoneSpec={name:"long-stack-trace",longStackTraceLimit:10,getLongStackTrace:function(n){if(!n)return;const e=n[t.__symbol__("currentTaskTrace")];return e?h(e,n.stack):n.stack},onScheduleTask:function(n,a,r,c){if(T()){const n=t.currentTask;let a=n&&n.data&&n.data[e]||[];a=[new o].concat(a),a.length>this.longStackTraceLimit&&(a.length=this.longStackTraceLimit),c.data||(c.data={}),"eventTask"===c.type&&(c.data={...c.data}),c.data[e]=a}return n.scheduleTask(r,c)},onHandleError:function(n,a,r,c){if(T()){const n=t.currentTask||c.task;if(c instanceof Error&&n){const t=h(n.data&&n.data[e],c.stack);try{c.stack=c.longStack=t}catch(t){}}}return n.handleError(r,c)}},function d(){if(!T())return;const t=[];g(t,2);const e=t[0],o=t[1];for(let t=0;t<e.length;t++){const n=e[t];if(-1==n.indexOf(a)){let t=n.match(/^\s*at\s+/);if(t){c=t[0]+r+" (http://localhost)";break}}}for(let t=0;t<e.length;t++){const a=e[t];if(a!==o[t])break;n[a]=!0}}()}patchLongStackTrace(Zone);җ+x7'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchMocha(Zone) {
    Zone.__load_patch('mocha', (global, Zone) => {
        const Mocha = global.Mocha;
        if (typeof Mocha === 'undefined') {
            // return if Mocha is not available, because now zone-testing
            // will load mocha patch with jasmine/jest patch
            return;
        }
        if (typeof Zone === 'undefined') {
            throw new Error('Missing Zone.js');
        }
        const ProxyZoneSpec = Zone['ProxyZoneSpec'];
        const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
        if (!ProxyZoneSpec) {
            throw new Error('Missing ProxyZoneSpec');
        }
        if (Mocha['__zone_patch__']) {
            throw new Error('"Mocha" has already been patched with "Zone".');
        }
        Mocha['__zone_patch__'] = true;
        const rootZone = Zone.current;
        const syncZone = rootZone.fork(new SyncTestZoneSpec('Mocha.describe'));
        let testZone = null;
        const suiteZone = rootZone.fork(new ProxyZoneSpec());
        const mochaOriginal = {
            after: global.after,
            afterEach: global.afterEach,
            before: global.before,
            beforeEach: global.beforeEach,
            describe: global.describe,
            it: global.it,
        };
        function modifyArguments(args, syncTest, asyncTest) {
            for (let i = 0; i < args.length; i++) {
                let arg = args[i];
                if (typeof arg === 'function') {
                    // The `done` callback is only passed through if the function expects at
                    // least one argument.
                    // Note we have to make a function with correct number of arguments,
                    // otherwise mocha will
                    // think that all functions are sync or async.
                    args[i] = arg.length === 0 ? syncTest(arg) : asyncTest(arg);
                    // Mocha uses toString to view the test body in the result list, make sure we return the
                    // correct function body
                    args[i].toString = function () {
                        return arg.toString();
                    };
                }
            }
            return args;
        }
        function wrapDescribeInZone(args) {
            const syncTest = function (fn) {
                return function () {
                    return syncZone.run(fn, this, arguments);
                };
            };
            return modifyArguments(args, syncTest);
        }
        function wrapTestInZone(args) {
            const asyncTest = function (fn) {
                return function (done) {
                    return testZone.run(fn, this, [done]);
                };
            };
            const syncTest = function (fn) {
                return function () {
                    return testZone.run(fn, this);
                };
            };
            return modifyArguments(args, syncTest, asyncTest);
        }
        function wrapSuiteInZone(args) {
            const asyncTest = function (fn) {
                return function (done) {
                    return suiteZone.run(fn, this, [done]);
                };
            };
            const syncTest = function (fn) {
                return function () {
                    return suiteZone.run(fn, this);
                };
            };
            return modifyArguments(args, syncTest, asyncTest);
        }
        global.describe = global.suite = function () {
            return mochaOriginal.describe.apply(this, wrapDescribeInZone(arguments));
        };
        global.xdescribe =
            global.suite.skip =
                global.describe.skip =
                    function () {
                        return mochaOriginal.describe.skip.apply(this, wrapDescribeInZone(arguments));
                    };
        global.describe.only = global.suite.only = function () {
            return mochaOriginal.describe.only.apply(this, wrapDescribeInZone(arguments));
        };
        global.it =
            global.specify =
                global.test =
                    function () {
                        return mochaOriginal.it.apply(this, wrapTestInZone(arguments));
                    };
        global.xit =
            global.xspecify =
                global.it.skip =
                    function () {
                        return mochaOriginal.it.skip.apply(this, wrapTestInZone(arguments));
                    };
        global.it.only = global.test.only = function () {
            return mochaOriginal.it.only.apply(this, wrapTestInZone(arguments));
        };
        global.after = global.suiteTeardown = function () {
            return mochaOriginal.after.apply(this, wrapSuiteInZone(arguments));
        };
        global.afterEach = global.teardown = function () {
            return mochaOriginal.afterEach.apply(this, wrapTestInZone(arguments));
        };
        global.before = global.suiteSetup = function () {
            return mochaOriginal.before.apply(this, wrapSuiteInZone(arguments));
        };
        global.beforeEach = global.setup = function () {
            return mochaOriginal.beforeEach.apply(this, wrapTestInZone(arguments));
        };
        ((originalRunTest, originalRun) => {
            Mocha.Runner.prototype.runTest = function (fn) {
                Zone.current.scheduleMicroTask('mocha.forceTask', () => {
                    originalRunTest.call(this, fn);
                });
            };
            Mocha.Runner.prototype.run = function (fn) {
                this.on('test', (e) => {
                    testZone = rootZone.fork(new ProxyZoneSpec());
                });
                this.on('fail', (test, err) => {
                    const proxyZoneSpec = testZone && testZone.get('ProxyZoneSpec');
                    if (proxyZoneSpec && err) {
                        try {
                            // try catch here in case err.message is not writable
                            err.message += proxyZoneSpec.getAndClearPendingTasksInfo();
                        }
                        catch (error) { }
                    }
                });
                return originalRun.call(this, fn);
            };
        })(Mocha.Runner.prototype.runTest, Mocha.Runner.prototype.run);
    });
}

patchMocha(Zone);
xa	"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchMocha(t){t.__load_patch("mocha",((t,n)=>{const e=t.Mocha;if(void 0===e)return;if(void 0===n)throw new Error("Missing Zone.js");const r=n.ProxyZoneSpec,o=n.SyncTestZoneSpec;if(!r)throw new Error("Missing ProxyZoneSpec");if(e.__zone_patch__)throw new Error('"Mocha" has already been patched with "Zone".');e.__zone_patch__=!0;const i=n.current,c=i.fork(new o("Mocha.describe"));let u=null;const s=i.fork(new r),f={after:t.after,afterEach:t.afterEach,before:t.before,beforeEach:t.beforeEach,describe:t.describe,it:t.it};function a(t,n,e){for(let r=0;r<t.length;r++){let o=t[r];"function"==typeof o&&(t[r]=0===o.length?n(o):e(o),t[r].toString=function(){return o.toString()})}return t}function h(t){return a(t,(function(t){return function(){return c.run(t,this,arguments)}}))}function p(t){return a(t,(function(t){return function(){return u.run(t,this)}}),(function(t){return function(n){return u.run(t,this,[n])}}))}function l(t){return a(t,(function(t){return function(){return s.run(t,this)}}),(function(t){return function(n){return s.run(t,this,[n])}}))}var y,d;t.describe=t.suite=function(){return f.describe.apply(this,h(arguments))},t.xdescribe=t.suite.skip=t.describe.skip=function(){return f.describe.skip.apply(this,h(arguments))},t.describe.only=t.suite.only=function(){return f.describe.only.apply(this,h(arguments))},t.it=t.specify=t.test=function(){return f.it.apply(this,p(arguments))},t.xit=t.xspecify=t.it.skip=function(){return f.it.skip.apply(this,p(arguments))},t.it.only=t.test.only=function(){return f.it.only.apply(this,p(arguments))},t.after=t.suiteTeardown=function(){return f.after.apply(this,l(arguments))},t.afterEach=t.teardown=function(){return f.afterEach.apply(this,p(arguments))},t.before=t.suiteSetup=function(){return f.before.apply(this,l(arguments))},t.beforeEach=t.setup=function(){return f.beforeEach.apply(this,p(arguments))},y=e.Runner.prototype.runTest,d=e.Runner.prototype.run,e.Runner.prototype.runTest=function(t){n.current.scheduleMicroTask("mocha.forceTask",(()=>{y.call(this,t)}))},e.Runner.prototype.run=function(t){return this.on("test",(t=>{u=i.fork(new r)})),this.on("fail",((t,n)=>{const e=u&&u.get("ProxyZoneSpec");if(e&&n)try{n.message+=e.getAndClearPendingTasksInfo()}catch(t){}})),d.call(this,t)}}))}patchMocha(Zone);=ybx'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
class ProxyZoneSpec {
    defaultSpecDelegate;
    name = 'ProxyZone';
    _delegateSpec = null;
    properties = { 'ProxyZoneSpec': this };
    propertyKeys = null;
    lastTaskState = null;
    isNeedToTriggerHasTask = false;
    tasks = [];
    static get() {
        return Zone.current.get('ProxyZoneSpec');
    }
    static isLoaded() {
        return ProxyZoneSpec.get() instanceof ProxyZoneSpec;
    }
    static assertPresent() {
        const spec = ProxyZoneSpec.get();
        if (spec === undefined) {
            throw new Error(`Expected to be running in 'ProxyZone', but it was not found.`);
        }
        return spec;
    }
    constructor(defaultSpecDelegate = null) {
        this.defaultSpecDelegate = defaultSpecDelegate;
        this.setDelegate(defaultSpecDelegate);
    }
    setDelegate(delegateSpec) {
        const isNewDelegate = this._delegateSpec !== delegateSpec;
        this._delegateSpec = delegateSpec;
        this.propertyKeys && this.propertyKeys.forEach((key) => delete this.properties[key]);
        this.propertyKeys = null;
        if (delegateSpec && delegateSpec.properties) {
            this.propertyKeys = Object.keys(delegateSpec.properties);
            this.propertyKeys.forEach((k) => (this.properties[k] = delegateSpec.properties[k]));
        }
        // if a new delegateSpec was set, check if we need to trigger hasTask
        if (isNewDelegate &&
            this.lastTaskState &&
            (this.lastTaskState.macroTask || this.lastTaskState.microTask)) {
            this.isNeedToTriggerHasTask = true;
        }
    }
    getDelegate() {
        return this._delegateSpec;
    }
    resetDelegate() {
        this.getDelegate();
        this.setDelegate(this.defaultSpecDelegate);
    }
    tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone) {
        if (this.isNeedToTriggerHasTask && this.lastTaskState) {
            // last delegateSpec has microTask or macroTask
            // should call onHasTask in current delegateSpec
            this.isNeedToTriggerHasTask = false;
            this.onHasTask(parentZoneDelegate, currentZone, targetZone, this.lastTaskState);
        }
    }
    removeFromTasks(task) {
        if (!this.tasks) {
            return;
        }
        for (let i = 0; i < this.tasks.length; i++) {
            if (this.tasks[i] === task) {
                this.tasks.splice(i, 1);
                return;
            }
        }
    }
    getAndClearPendingTasksInfo() {
        if (this.tasks.length === 0) {
            return '';
        }
        const taskInfo = this.tasks.map((task) => {
            const dataInfo = task.data &&
                Object.keys(task.data)
                    .map((key) => {
                    return key + ':' + task.data[key];
                })
                    .join(',');
            return `type: ${task.type}, source: ${task.source}, args: {${dataInfo}}`;
        });
        const pendingTasksInfo = '--Pending async tasks are: [' + taskInfo + ']';
        // clear tasks
        this.tasks = [];
        return pendingTasksInfo;
    }
    onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec) {
        if (this._delegateSpec && this._delegateSpec.onFork) {
            return this._delegateSpec.onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec);
        }
        else {
            return parentZoneDelegate.fork(targetZone, zoneSpec);
        }
    }
    onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source) {
        if (this._delegateSpec && this._delegateSpec.onIntercept) {
            return this._delegateSpec.onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source);
        }
        else {
            return parentZoneDelegate.intercept(targetZone, delegate, source);
        }
    }
    onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
        this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
        if (this._delegateSpec && this._delegateSpec.onInvoke) {
            return this._delegateSpec.onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source);
        }
        else {
            return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
        }
    }
    onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
        if (this._delegateSpec && this._delegateSpec.onHandleError) {
            return this._delegateSpec.onHandleError(parentZoneDelegate, currentZone, targetZone, error);
        }
        else {
            return parentZoneDelegate.handleError(targetZone, error);
        }
    }
    onScheduleTask(parentZoneDelegate, currentZone, targetZone, task) {
        if (task.type !== 'eventTask') {
            this.tasks.push(task);
        }
        if (this._delegateSpec && this._delegateSpec.onScheduleTask) {
            return this._delegateSpec.onScheduleTask(parentZoneDelegate, currentZone, targetZone, task);
        }
        else {
            return parentZoneDelegate.scheduleTask(targetZone, task);
        }
    }
    onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
        if (task.type !== 'eventTask') {
            this.removeFromTasks(task);
        }
        this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
        if (this._delegateSpec && this._delegateSpec.onInvokeTask) {
            return this._delegateSpec.onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs);
        }
        else {
            return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
        }
    }
    onCancelTask(parentZoneDelegate, currentZone, targetZone, task) {
        if (task.type !== 'eventTask') {
            this.removeFromTasks(task);
        }
        this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
        if (this._delegateSpec && this._delegateSpec.onCancelTask) {
            return this._delegateSpec.onCancelTask(parentZoneDelegate, currentZone, targetZone, task);
        }
        else {
            return parentZoneDelegate.cancelTask(targetZone, task);
        }
    }
    onHasTask(delegate, current, target, hasTaskState) {
        this.lastTaskState = hasTaskState;
        if (this._delegateSpec && this._delegateSpec.onHasTask) {
            this._delegateSpec.onHasTask(delegate, current, target, hasTaskState);
        }
        else {
            delegate.hasTask(target, hasTaskState);
        }
    }
}
function patchProxyZoneSpec(Zone) {
    // Export the class so that new instances can be created with proper
    // constructor params.
    Zone['ProxyZoneSpec'] = ProxyZoneSpec;
}

patchProxyZoneSpec(Zone);
3cx\"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */class ProxyZoneSpec{defaultSpecDelegate;name="ProxyZone";_delegateSpec=null;properties={ProxyZoneSpec:this};propertyKeys=null;lastTaskState=null;isNeedToTriggerHasTask=!1;tasks=[];static get(){return Zone.current.get("ProxyZoneSpec")}static isLoaded(){return ProxyZoneSpec.get()instanceof ProxyZoneSpec}static assertPresent(){const e=ProxyZoneSpec.get();if(void 0===e)throw new Error("Expected to be running in 'ProxyZone', but it was not found.");return e}constructor(e=null){this.defaultSpecDelegate=e,this.setDelegate(e)}setDelegate(e){const t=this._delegateSpec!==e;this._delegateSpec=e,this.propertyKeys&&this.propertyKeys.forEach((e=>delete this.properties[e])),this.propertyKeys=null,e&&e.properties&&(this.propertyKeys=Object.keys(e.properties),this.propertyKeys.forEach((t=>this.properties[t]=e.properties[t]))),t&&this.lastTaskState&&(this.lastTaskState.macroTask||this.lastTaskState.microTask)&&(this.isNeedToTriggerHasTask=!0)}getDelegate(){return this._delegateSpec}resetDelegate(){this.getDelegate(),this.setDelegate(this.defaultSpecDelegate)}tryTriggerHasTask(e,t,s){this.isNeedToTriggerHasTask&&this.lastTaskState&&(this.isNeedToTriggerHasTask=!1,this.onHasTask(e,t,s,this.lastTaskState))}removeFromTasks(e){if(this.tasks)for(let t=0;t<this.tasks.length;t++)if(this.tasks[t]===e)return void this.tasks.splice(t,1)}getAndClearPendingTasksInfo(){if(0===this.tasks.length)return"";const e="--Pending async tasks are: ["+this.tasks.map((e=>{const t=e.data&&Object.keys(e.data).map((t=>t+":"+e.data[t])).join(",");return`type: ${e.type}, source: ${e.source}, args: {${t}}`}))+"]";return this.tasks=[],e}onFork(e,t,s,a){return this._delegateSpec&&this._delegateSpec.onFork?this._delegateSpec.onFork(e,t,s,a):e.fork(s,a)}onIntercept(e,t,s,a,r){return this._delegateSpec&&this._delegateSpec.onIntercept?this._delegateSpec.onIntercept(e,t,s,a,r):e.intercept(s,a,r)}onInvoke(e,t,s,a,r,o,n){return this.tryTriggerHasTask(e,t,s),this._delegateSpec&&this._delegateSpec.onInvoke?this._delegateSpec.onInvoke(e,t,s,a,r,o,n):e.invoke(s,a,r,o,n)}onHandleError(e,t,s,a){return this._delegateSpec&&this._delegateSpec.onHandleError?this._delegateSpec.onHandleError(e,t,s,a):e.handleError(s,a)}onScheduleTask(e,t,s,a){return"eventTask"!==a.type&&this.tasks.push(a),this._delegateSpec&&this._delegateSpec.onScheduleTask?this._delegateSpec.onScheduleTask(e,t,s,a):e.scheduleTask(s,a)}onInvokeTask(e,t,s,a,r,o){return"eventTask"!==a.type&&this.removeFromTasks(a),this.tryTriggerHasTask(e,t,s),this._delegateSpec&&this._delegateSpec.onInvokeTask?this._delegateSpec.onInvokeTask(e,t,s,a,r,o):e.invokeTask(s,a,r,o)}onCancelTask(e,t,s,a){return"eventTask"!==a.type&&this.removeFromTasks(a),this.tryTriggerHasTask(e,t,s),this._delegateSpec&&this._delegateSpec.onCancelTask?this._delegateSpec.onCancelTask(e,t,s,a):e.cancelTask(s,a)}onHasTask(e,t,s,a){this.lastTaskState=a,this._delegateSpec&&this._delegateSpec.onHasTask?this._delegateSpec.onHasTask(e,t,s,a):e.hasTask(s,a)}}function patchProxyZoneSpec(e){e.ProxyZoneSpec=ProxyZoneSpec}patchProxyZoneSpec(Zone);OIx2"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchSyncTest(e){e.SyncTestZoneSpec=class{runZone=e.current;constructor(e){this.name="syncTestZone for "+e}name;onScheduleTask(e,s,c,n){switch(n.type){case"microTask":case"macroTask":throw new Error(`Cannot call ${n.source} from within a sync test (${this.name}).`);case"eventTask":n=e.scheduleTask(c,n)}return n}}}patchSyncTest(Zone);<ടx	'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
/**
 * A `TaskTrackingZoneSpec` allows one to track all outstanding Tasks.
 *
 * This is useful in tests. For example to see which tasks are preventing a test from completing
 * or an automated way of releasing all of the event listeners at the end of the test.
 */
class TaskTrackingZoneSpec {
    name = 'TaskTrackingZone';
    microTasks = [];
    macroTasks = [];
    eventTasks = [];
    properties = { 'TaskTrackingZone': this };
    static get() {
        return Zone.current.get('TaskTrackingZone');
    }
    getTasksFor(type) {
        switch (type) {
            case 'microTask':
                return this.microTasks;
            case 'macroTask':
                return this.macroTasks;
            case 'eventTask':
                return this.eventTasks;
        }
        throw new Error('Unknown task format: ' + type);
    }
    onScheduleTask(parentZoneDelegate, currentZone, targetZone, task) {
        task['creationLocation'] = new Error(`Task '${task.type}' from '${task.source}'.`);
        const tasks = this.getTasksFor(task.type);
        tasks.push(task);
        return parentZoneDelegate.scheduleTask(targetZone, task);
    }
    onCancelTask(parentZoneDelegate, currentZone, targetZone, task) {
        const tasks = this.getTasksFor(task.type);
        for (let i = 0; i < tasks.length; i++) {
            if (tasks[i] == task) {
                tasks.splice(i, 1);
                break;
            }
        }
        return parentZoneDelegate.cancelTask(targetZone, task);
    }
    onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
        if (task.type === 'eventTask' || task.data?.isPeriodic)
            return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
        const tasks = this.getTasksFor(task.type);
        for (let i = 0; i < tasks.length; i++) {
            if (tasks[i] == task) {
                tasks.splice(i, 1);
                break;
            }
        }
        return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
    }
    clearEvents() {
        while (this.eventTasks.length) {
            Zone.current.cancelTask(this.eventTasks[0]);
        }
    }
}
function patchTaskTracking(Zone) {
    // Export the class so that new instances can be created with proper
    // constructor params.
    Zone['TaskTrackingZoneSpec'] = TaskTrackingZoneSpec;
}

patchTaskTracking(Zone);
RRJx^"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */class TaskTrackingZoneSpec{name="TaskTrackingZone";microTasks=[];macroTasks=[];eventTasks=[];properties={TaskTrackingZone:this};static get(){return Zone.current.get("TaskTrackingZone")}getTasksFor(e){switch(e){case"microTask":return this.microTasks;case"macroTask":return this.macroTasks;case"eventTask":return this.eventTasks}throw new Error("Unknown task format: "+e)}onScheduleTask(e,s,a,r){return r.creationLocation=new Error(`Task '${r.type}' from '${r.source}'.`),this.getTasksFor(r.type).push(r),e.scheduleTask(a,r)}onCancelTask(e,s,a,r){const t=this.getTasksFor(r.type);for(let e=0;e<t.length;e++)if(t[e]==r){t.splice(e,1);break}return e.cancelTask(a,r)}onInvokeTask(e,s,a,r,t,n){if("eventTask"===r.type||r.data?.isPeriodic)return e.invokeTask(a,r,t,n);const k=this.getTasksFor(r.type);for(let e=0;e<k.length;e++)if(k[e]==r){k.splice(e,1);break}return e.invokeTask(a,r,t,n)}clearEvents(){for(;this.eventTasks.length;)Zone.current.cancelTask(this.eventTasks[0])}}function patchTaskTracking(e){e.TaskTrackingZoneSpec=TaskTrackingZoneSpec}patchTaskTracking(Zone);Ϫ?xx'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchMediaQuery(Zone) {
    Zone.__load_patch('mediaQuery', (global, Zone, api) => {
        function patchAddListener(proto) {
            api.patchMethod(proto, 'addListener', (delegate) => (self, args) => {
                const callback = args.length > 0 ? args[0] : null;
                if (typeof callback === 'function') {
                    const wrapperedCallback = Zone.current.wrap(callback, 'MediaQuery');
                    callback[api.symbol('mediaQueryCallback')] = wrapperedCallback;
                    return delegate.call(self, wrapperedCallback);
                }
                else {
                    return delegate.apply(self, args);
                }
            });
        }
        function patchRemoveListener(proto) {
            api.patchMethod(proto, 'removeListener', (delegate) => (self, args) => {
                const callback = args.length > 0 ? args[0] : null;
                if (typeof callback === 'function') {
                    const wrapperedCallback = callback[api.symbol('mediaQueryCallback')];
                    if (wrapperedCallback) {
                        return delegate.call(self, wrapperedCallback);
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                }
                else {
                    return delegate.apply(self, args);
                }
            });
        }
        if (global['MediaQueryList']) {
            const proto = global['MediaQueryList'].prototype;
            patchAddListener(proto);
            patchRemoveListener(proto);
        }
        else if (global['matchMedia']) {
            api.patchMethod(global, 'matchMedia', (delegate) => (self, args) => {
                const mql = delegate.apply(self, args);
                if (mql) {
                    // try to patch MediaQueryList.prototype
                    const proto = Object.getPrototypeOf(mql);
                    if (proto && proto['addListener']) {
                        // try to patch proto, don't need to worry about patch
                        // multiple times, because, api.patchEventTarget will check it
                        patchAddListener(proto);
                        patchRemoveListener(proto);
                        patchAddListener(mql);
                        patchRemoveListener(mql);
                    }
                    else if (mql['addListener']) {
                        // proto not exists, or proto has no addListener method
                        // try to patch mql instance
                        patchAddListener(mql);
                        patchRemoveListener(mql);
                    }
                }
                return mql;
            });
        }
    });
}

patchMediaQuery(Zone);
ae9xo"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchMediaQuery(e){e.__load_patch("mediaQuery",((e,t,a)=>{function n(e){a.patchMethod(e,"addListener",(e=>(n,r)=>{const c=r.length>0?r[0]:null;if("function"==typeof c){const r=t.current.wrap(c,"MediaQuery");return c[a.symbol("mediaQueryCallback")]=r,e.call(n,r)}return e.apply(n,r)}))}function r(e){a.patchMethod(e,"removeListener",(e=>(t,n)=>{const r=n.length>0?n[0]:null;if("function"==typeof r){const c=r[a.symbol("mediaQueryCallback")];return c?e.call(t,c):e.apply(t,n)}return e.apply(t,n)}))}if(e.MediaQueryList){const t=e.MediaQueryList.prototype;n(t),r(t)}else e.matchMedia&&a.patchMethod(e,"matchMedia",(e=>(t,a)=>{const c=e.apply(t,a);if(c){const e=Object.getPrototypeOf(c);e&&e.addListener?(n(e),r(e),n(c),r(c)):c.addListener&&(n(c),r(c))}return c}))}))}patchMediaQuery(Zone);{7&xh'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchNotifications(Zone) {
    Zone.__load_patch('notification', (global, Zone, api) => {
        const Notification = global['Notification'];
        if (!Notification || !Notification.prototype) {
            return;
        }
        const desc = Object.getOwnPropertyDescriptor(Notification.prototype, 'onerror');
        if (!desc || !desc.configurable) {
            return;
        }
        api.patchOnProperties(Notification.prototype, null);
    });
}

patchNotifications(Zone);
F!@x|"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchNotifications(t){t.__load_patch("notification",((t,o,i)=>{const n=t.Notification;if(!n||!n.prototype)return;const r=Object.getOwnPropertyDescriptor(n.prototype,"onerror");r&&r.configurable&&i.patchOnProperties(n.prototype,null)}))}patchNotifications(Zone);1{Bx/'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchRtcPeerConnection(Zone) {
    Zone.__load_patch('RTCPeerConnection', (global, Zone, api) => {
        const RTCPeerConnection = global['RTCPeerConnection'];
        if (!RTCPeerConnection) {
            return;
        }
        const addSymbol = api.symbol('addEventListener');
        const removeSymbol = api.symbol('removeEventListener');
        RTCPeerConnection.prototype.addEventListener = RTCPeerConnection.prototype[addSymbol];
        RTCPeerConnection.prototype.removeEventListener = RTCPeerConnection.prototype[removeSymbol];
        // RTCPeerConnection extends EventTarget, so we must clear the symbol
        // to allow patch RTCPeerConnection.prototype.addEventListener again
        RTCPeerConnection.prototype[addSymbol] = null;
        RTCPeerConnection.prototype[removeSymbol] = null;
        api.patchEventTarget(global, api, [RTCPeerConnection.prototype], { useG: false });
    });
}

patchRtcPeerConnection(Zone);
n` x	"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchRtcPeerConnection(e){e.__load_patch("RTCPeerConnection",((e,t,o)=>{const n=e.RTCPeerConnection;if(!n)return;const r=o.symbol("addEventListener"),p=o.symbol("removeEventListener");n.prototype.addEventListener=n.prototype[r],n.prototype.removeEventListener=n.prototype[p],n.prototype[r]=null,n.prototype[p]=null,o.patchEventTarget(e,o,[n.prototype],{useG:!1})}))}patchRtcPeerConnection(Zone);ĦbNx'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchShadyDom(Zone) {
    Zone.__load_patch('shadydom', (global, Zone, api) => {
        // https://github.com/angular/zone.js/issues/782
        // in web components, shadydom will patch addEventListener/removeEventListener of
        // Node.prototype and WindowPrototype, this will have conflict with zone.js
        // so zone.js need to patch them again.
        const HTMLSlotElement = global.HTMLSlotElement;
        const prototypes = [
            Object.getPrototypeOf(window),
            Node.prototype,
            Text.prototype,
            Element.prototype,
            HTMLElement.prototype,
            HTMLSlotElement && HTMLSlotElement.prototype,
            DocumentFragment.prototype,
            Document.prototype,
        ];
        prototypes.forEach(function (proto) {
            if (proto && proto.hasOwnProperty('addEventListener')) {
                proto[Zone.__symbol__('addEventListener')] = null;
                proto[Zone.__symbol__('removeEventListener')] = null;
                api.patchEventTarget(global, api, [proto]);
            }
        });
    });
}

patchShadyDom(Zone);
FY{ݼ#x<"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchShadyDom(t){t.__load_patch("shadydom",((t,e,o)=>{const n=t.HTMLSlotElement;[Object.getPrototypeOf(window),Node.prototype,Text.prototype,Element.prototype,HTMLElement.prototype,n&&n.prototype,DocumentFragment.prototype,Document.prototype].forEach((function(n){n&&n.hasOwnProperty("addEventListener")&&(n[e.__symbol__("addEventListener")]=null,n[e.__symbol__("removeEventListener")]=null,o.patchEventTarget(t,o,[n]))}))}))}patchShadyDom(Zone);ɁGxm'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
/**
 * @fileoverview
 * @suppress {missingRequire}
 */
const _global = (typeof window === 'object' && window) || (typeof self === 'object' && self) || global;
function patchWtf(Zone) {
    // Detect and setup WTF.
    let wtfTrace = null;
    let wtfEvents = null;
    const wtfEnabled = (function () {
        const wtf = _global['wtf'];
        if (wtf) {
            wtfTrace = wtf.trace;
            if (wtfTrace) {
                wtfEvents = wtfTrace.events;
                return true;
            }
        }
        return false;
    })();
    class WtfZoneSpec {
        name = 'WTF';
        static forkInstance = wtfEnabled
            ? wtfEvents.createInstance('Zone:fork(ascii zone, ascii newZone)')
            : null;
        static scheduleInstance = {};
        static cancelInstance = {};
        static invokeScope = {};
        static invokeTaskScope = {};
        onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec) {
            const retValue = parentZoneDelegate.fork(targetZone, zoneSpec);
            WtfZoneSpec.forkInstance(zonePathName(targetZone), retValue.name);
            return retValue;
        }
        onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
            const src = source || 'unknown';
            let scope = WtfZoneSpec.invokeScope[src];
            if (!scope) {
                scope = WtfZoneSpec.invokeScope[src] = wtfEvents.createScope(`Zone:invoke:${source}(ascii zone)`);
            }
            return wtfTrace.leaveScope(scope(zonePathName(targetZone)), parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source));
        }
        onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
            return parentZoneDelegate.handleError(targetZone, error);
        }
        onScheduleTask(parentZoneDelegate, currentZone, targetZone, task) {
            const key = task.type + ':' + task.source;
            let instance = WtfZoneSpec.scheduleInstance[key];
            if (!instance) {
                instance = WtfZoneSpec.scheduleInstance[key] = wtfEvents.createInstance(`Zone:schedule:${key}(ascii zone, any data)`);
            }
            const retValue = parentZoneDelegate.scheduleTask(targetZone, task);
            instance(zonePathName(targetZone), shallowObj(task.data, 2));
            return retValue;
        }
        onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
            const source = task.source;
            let scope = WtfZoneSpec.invokeTaskScope[source];
            if (!scope) {
                scope = WtfZoneSpec.invokeTaskScope[source] = wtfEvents.createScope(`Zone:invokeTask:${source}(ascii zone)`);
            }
            return wtfTrace.leaveScope(scope(zonePathName(targetZone)), parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs));
        }
        onCancelTask(parentZoneDelegate, currentZone, targetZone, task) {
            const key = task.source;
            let instance = WtfZoneSpec.cancelInstance[key];
            if (!instance) {
                instance = WtfZoneSpec.cancelInstance[key] = wtfEvents.createInstance(`Zone:cancel:${key}(ascii zone, any options)`);
            }
            const retValue = parentZoneDelegate.cancelTask(targetZone, task);
            instance(zonePathName(targetZone), shallowObj(task.data, 2));
            return retValue;
        }
    }
    function shallowObj(obj, depth) {
        if (!obj || !depth)
            return null;
        const out = {};
        for (const key in obj) {
            if (obj.hasOwnProperty(key)) {
                // explicit : any due to https://github.com/microsoft/TypeScript/issues/33191
                let value = obj[key];
                switch (typeof value) {
                    case 'object':
                        const name = value && value.constructor && value.constructor.name;
                        value = name == Object.name ? shallowObj(value, depth - 1) : name;
                        break;
                    case 'function':
                        value = value.name || undefined;
                        break;
                }
                out[key] = value;
            }
        }
        return out;
    }
    function zonePathName(zone) {
        let name = zone.name;
        let localZone = zone.parent;
        while (localZone != null) {
            name = localZone.name + '::' + name;
            localZone = localZone.parent;
        }
        return name;
    }
    Zone['wtfZoneSpec'] = !wtfEnabled ? null : new WtfZoneSpec();
}

patchWtf(Zone);
txE"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */const _global="object"==typeof window&&window||"object"==typeof self&&self||global;function patchWtf(e){let n=null,c=null;const o=function(){const e=_global.wtf;return!(!e||(n=e.trace,!n)||(c=n.events,0))}();class t{name="WTF";static forkInstance=o?c.createInstance("Zone:fork(ascii zone, ascii newZone)"):null;static scheduleInstance={};static cancelInstance={};static invokeScope={};static invokeTaskScope={};onFork(e,n,c,o){const a=e.fork(c,o);return t.forkInstance(s(c),a.name),a}onInvoke(e,o,a,r,l,i,u){const k=u||"unknown";let f=t.invokeScope[k];return f||(f=t.invokeScope[k]=c.createScope(`Zone:invoke:${u}(ascii zone)`)),n.leaveScope(f(s(a)),e.invoke(a,r,l,i,u))}onHandleError(e,n,c,o){return e.handleError(c,o)}onScheduleTask(e,n,o,r){const l=r.type+":"+r.source;let i=t.scheduleInstance[l];i||(i=t.scheduleInstance[l]=c.createInstance(`Zone:schedule:${l}(ascii zone, any data)`));const u=e.scheduleTask(o,r);return i(s(o),a(r.data,2)),u}onInvokeTask(e,o,a,r,l,i){const u=r.source;let k=t.invokeTaskScope[u];return k||(k=t.invokeTaskScope[u]=c.createScope(`Zone:invokeTask:${u}(ascii zone)`)),n.leaveScope(k(s(a)),e.invokeTask(a,r,l,i))}onCancelTask(e,n,o,r){const l=r.source;let i=t.cancelInstance[l];i||(i=t.cancelInstance[l]=c.createInstance(`Zone:cancel:${l}(ascii zone, any options)`));const u=e.cancelTask(o,r);return i(s(o),a(r.data,2)),u}}function a(e,n){if(!e||!n)return null;const c={};for(const o in e)if(e.hasOwnProperty(o)){let t=e[o];switch(typeof t){case"object":const e=t&&t.constructor&&t.constructor.name;t=e==Object.name?a(t,n-1):e;break;case"function":t=t.name||void 0}c[o]=t}return c}function s(e){let n=e.name,c=e.parent;for(;null!=c;)n=c.name+"::"+n,c=c.parent;return n}e.wtfZoneSpec=o?new t:null}patchWtf(Zone);rqxU'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchBluebird(Zone) {
    Zone.__load_patch('bluebird', (global, Zone, api) => {
        // TODO: @JiaLiPassion, we can automatically patch bluebird
        // if global.Promise = Bluebird, but sometimes in nodejs,
        // global.Promise is not Bluebird, and Bluebird is just be
        // used by other libraries such as sequelize, so I think it is
        // safe to just expose a method to patch Bluebird explicitly
        const BLUEBIRD = 'bluebird';
        Zone[Zone.__symbol__(BLUEBIRD)] = function patchBluebird(Bluebird) {
            // patch method of Bluebird.prototype which not using `then` internally
            const bluebirdApis = ['then', 'spread', 'finally'];
            bluebirdApis.forEach((bapi) => {
                api.patchMethod(Bluebird.prototype, bapi, (delegate) => (self, args) => {
                    const zone = Zone.current;
                    for (let i = 0; i < args.length; i++) {
                        const func = args[i];
                        if (typeof func === 'function') {
                            args[i] = function () {
                                const argSelf = this;
                                const argArgs = arguments;
                                return new Bluebird((res, rej) => {
                                    zone.scheduleMicroTask('Promise.then', () => {
                                        try {
                                            res(func.apply(argSelf, argArgs));
                                        }
                                        catch (error) {
                                            rej(error);
                                        }
                                    });
                                });
                            };
                        }
                    }
                    return delegate.apply(self, args);
                });
            });
            if (typeof window !== 'undefined') {
                window.addEventListener('unhandledrejection', function (event) {
                    const error = event.detail && event.detail.reason;
                    if (error && error.isHandledByZone) {
                        event.preventDefault();
                        if (typeof event.stopImmediatePropagation === 'function') {
                            event.stopImmediatePropagation();
                        }
                    }
                });
            }
            else if (typeof process !== 'undefined') {
                process.on('unhandledRejection', (reason, p) => {
                    if (reason && reason.isHandledByZone) {
                        const listeners = process.listeners('unhandledRejection');
                        if (listeners) {
                            // remove unhandledRejection listeners so the callback
                            // will not be triggered.
                            process.removeAllListeners('unhandledRejection');
                            process.nextTick(() => {
                                listeners.forEach((listener) => process.on('unhandledRejection', listener));
                            });
                        }
                    }
                });
            }
            Bluebird.onPossiblyUnhandledRejection(function (e, promise) {
                try {
                    Zone.current.runGuarded(() => {
                        e.isHandledByZone = true;
                        throw e;
                    });
                }
                catch (err) {
                    err.isHandledByZone = false;
                    api.onUnhandledError(err);
                }
            });
            // override global promise
            global.Promise = Bluebird;
        };
    });
}

patchBluebird(Zone);
]߇Ox"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchBluebird(e){e.__load_patch("bluebird",((e,n,o)=>{n[n.__symbol__("bluebird")]=function t(d){["then","spread","finally"].forEach((e=>{o.patchMethod(d.prototype,e,(e=>(o,t)=>{const r=n.current;for(let e=0;e<t.length;e++){const n=t[e];"function"==typeof n&&(t[e]=function(){const e=this,o=arguments;return new d(((t,d)=>{r.scheduleMicroTask("Promise.then",(()=>{try{t(n.apply(e,o))}catch(e){d(e)}}))}))})}return e.apply(o,t)}))})),"undefined"!=typeof window?window.addEventListener("unhandledrejection",(function(e){const n=e.detail&&e.detail.reason;n&&n.isHandledByZone&&(e.preventDefault(),"function"==typeof e.stopImmediatePropagation&&e.stopImmediatePropagation())})):"undefined"!=typeof process&&process.on("unhandledRejection",((e,n)=>{if(e&&e.isHandledByZone){const e=process.listeners("unhandledRejection");e&&(process.removeAllListeners("unhandledRejection"),process.nextTick((()=>{e.forEach((e=>process.on("unhandledRejection",e)))})))}})),d.onPossiblyUnhandledRejection((function(e,t){try{n.current.runGuarded((()=>{throw e.isHandledByZone=!0,e}))}catch(e){e.isHandledByZone=!1,o.onUnhandledError(e)}})),e.Promise=d}}))}patchBluebird(Zone);CTxwC'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
/**
 * @fileoverview
 * @suppress {globalThis,undefinedVars}
 */
function patchError(Zone) {
    Zone.__load_patch('Error', (global, Zone, api) => {
        /*
         * This code patches Error so that:
         *   - It ignores un-needed stack frames.
         *   - It Shows the associated Zone for reach frame.
         */
        const zoneJsInternalStackFramesSymbol = api.symbol('zoneJsInternalStackFrames');
        const NativeError = (global[api.symbol('Error')] = global['Error']);
        // Store the frames which should be removed from the stack frames
        const zoneJsInternalStackFrames = {};
        // We must find the frame where Error was created, otherwise we assume we don't understand stack
        let zoneAwareFrame1;
        let zoneAwareFrame2;
        let zoneAwareFrame1WithoutNew;
        let zoneAwareFrame2WithoutNew;
        let zoneAwareFrame3WithoutNew;
        global['Error'] = ZoneAwareError;
        const stackRewrite = 'stackRewrite';
        const zoneJsInternalStackFramesPolicy = global['__Zone_Error_BlacklistedStackFrames_policy'] ||
            global['__Zone_Error_ZoneJsInternalStackFrames_policy'] ||
            'default';
        function buildZoneFrameNames(zoneFrame) {
            let zoneFrameName = { zoneName: zoneFrame.zone.name };
            let result = zoneFrameName;
            while (zoneFrame.parent) {
                zoneFrame = zoneFrame.parent;
                const parentZoneFrameName = { zoneName: zoneFrame.zone.name };
                zoneFrameName.parent = parentZoneFrameName;
                zoneFrameName = parentZoneFrameName;
            }
            return result;
        }
        function buildZoneAwareStackFrames(originalStack, zoneFrame, isZoneFrame = true) {
            let frames = originalStack.split('\n');
            let i = 0;
            // Find the first frame
            while (!(frames[i] === zoneAwareFrame1 ||
                frames[i] === zoneAwareFrame2 ||
                frames[i] === zoneAwareFrame1WithoutNew ||
                frames[i] === zoneAwareFrame2WithoutNew ||
                frames[i] === zoneAwareFrame3WithoutNew) &&
                i < frames.length) {
                i++;
            }
            for (; i < frames.length && zoneFrame; i++) {
                let frame = frames[i];
                if (frame.trim()) {
                    switch (zoneJsInternalStackFrames[frame]) {
                        case 0 /* FrameType.zoneJsInternal */:
                            frames.splice(i, 1);
                            i--;
                            break;
                        case 1 /* FrameType.transition */:
                            if (zoneFrame.parent) {
                                // This is the special frame where zone changed. Print and process it accordingly
                                zoneFrame = zoneFrame.parent;
                            }
                            else {
                                zoneFrame = null;
                            }
                            frames.splice(i, 1);
                            i--;
                            break;
                        default:
                            frames[i] += isZoneFrame
                                ? ` [${zoneFrame.zone.name}]`
                                : ` [${zoneFrame.zoneName}]`;
                    }
                }
            }
            return frames.join('\n');
        }
        /**
         * This is ZoneAwareError which processes the stack frame and cleans up extra frames as well as
         * adds zone information to it.
         */
        function ZoneAwareError() {
            // We always have to return native error otherwise the browser console will not work.
            let error = NativeError.apply(this, arguments);
            // Save original stack trace
            const originalStack = (error['originalStack'] = error.stack);
            // Process the stack trace and rewrite the frames.
            if (ZoneAwareError[stackRewrite] && originalStack) {
                let zoneFrame = api.currentZoneFrame();
                if (zoneJsInternalStackFramesPolicy === 'lazy') {
                    // don't handle stack trace now
                    error[api.symbol('zoneFrameNames')] = buildZoneFrameNames(zoneFrame);
                }
                else if (zoneJsInternalStackFramesPolicy === 'default') {
                    try {
                        error.stack = error.zoneAwareStack = buildZoneAwareStackFrames(originalStack, zoneFrame);
                    }
                    catch (e) {
                        // ignore as some browsers don't allow overriding of stack
                    }
                }
            }
            if (this instanceof NativeError && this.constructor != NativeError) {
                // We got called with a `new` operator AND we are subclass of ZoneAwareError
                // in that case we have to copy all of our properties to `this`.
                Object.keys(error)
                    .concat('stack', 'message', 'cause')
                    .forEach((key) => {
                    const value = error[key];
                    if (value !== undefined) {
                        try {
                            this[key] = value;
                        }
                        catch (e) {
                            // ignore the assignment in case it is a setter and it throws.
                        }
                    }
                });
                return this;
            }
            return error;
        }
        // Copy the prototype so that instanceof operator works as expected
        ZoneAwareError.prototype = NativeError.prototype;
        ZoneAwareError[zoneJsInternalStackFramesSymbol] = zoneJsInternalStackFrames;
        ZoneAwareError[stackRewrite] = false;
        const zoneAwareStackSymbol = api.symbol('zoneAwareStack');
        // try to define zoneAwareStack property when zoneJsInternal frames policy is delay
        if (zoneJsInternalStackFramesPolicy === 'lazy') {
            Object.defineProperty(ZoneAwareError.prototype, 'zoneAwareStack', {
                configurable: true,
                enumerable: true,
                get: function () {
                    if (!this[zoneAwareStackSymbol]) {
                        this[zoneAwareStackSymbol] = buildZoneAwareStackFrames(this.originalStack, this[api.symbol('zoneFrameNames')], false);
                    }
                    return this[zoneAwareStackSymbol];
                },
                set: function (newStack) {
                    this.originalStack = newStack;
                    this[zoneAwareStackSymbol] = buildZoneAwareStackFrames(this.originalStack, this[api.symbol('zoneFrameNames')], false);
                },
            });
        }
        // those properties need special handling
        const specialPropertyNames = ['stackTraceLimit', 'captureStackTrace', 'prepareStackTrace'];
        // those properties of NativeError should be set to ZoneAwareError
        const nativeErrorProperties = Object.keys(NativeError);
        if (nativeErrorProperties) {
            nativeErrorProperties.forEach((prop) => {
                if (specialPropertyNames.filter((sp) => sp === prop).length === 0) {
                    Object.defineProperty(ZoneAwareError, prop, {
                        get: function () {
                            return NativeError[prop];
                        },
                        set: function (value) {
                            NativeError[prop] = value;
                        },
                    });
                }
            });
        }
        if (NativeError.hasOwnProperty('stackTraceLimit')) {
            // Extend default stack limit as we will be removing few frames.
            NativeError.stackTraceLimit = Math.max(NativeError.stackTraceLimit, 15);
            // make sure that ZoneAwareError has the same property which forwards to NativeError.
            Object.defineProperty(ZoneAwareError, 'stackTraceLimit', {
                get: function () {
                    return NativeError.stackTraceLimit;
                },
                set: function (value) {
                    return (NativeError.stackTraceLimit = value);
                },
            });
        }
        if (NativeError.hasOwnProperty('captureStackTrace')) {
            Object.defineProperty(ZoneAwareError, 'captureStackTrace', {
                // add named function here because we need to remove this
                // stack frame when prepareStackTrace below
                value: function zoneCaptureStackTrace(targetObject, constructorOpt) {
                    NativeError.captureStackTrace(targetObject, constructorOpt);
                },
            });
        }
        const ZONE_CAPTURESTACKTRACE = 'zoneCaptureStackTrace';
        Object.defineProperty(ZoneAwareError, 'prepareStackTrace', {
            get: function () {
                return NativeError.prepareStackTrace;
            },
            set: function (value) {
                if (!value || typeof value !== 'function') {
                    return (NativeError.prepareStackTrace = value);
                }
                return (NativeError.prepareStackTrace = function (error, structuredStackTrace) {
                    // remove additional stack information from ZoneAwareError.captureStackTrace
                    if (structuredStackTrace) {
                        for (let i = 0; i < structuredStackTrace.length; i++) {
                            const st = structuredStackTrace[i];
                            // remove the first function which name is zoneCaptureStackTrace
                            if (st.getFunctionName() === ZONE_CAPTURESTACKTRACE) {
                                structuredStackTrace.splice(i, 1);
                                break;
                            }
                        }
                    }
                    return value.call(this, error, structuredStackTrace);
                });
            },
        });
        if (zoneJsInternalStackFramesPolicy === 'disable') {
            // don't need to run detectZone to populate zoneJs internal stack frames
            return;
        }
        // Now we need to populate the `zoneJsInternalStackFrames` as well as find the
        // run/runGuarded/runTask frames. This is done by creating a detect zone and then threading
        // the execution through all of the above methods so that we can look at the stack trace and
        // find the frames of interest.
        let detectZone = Zone.current.fork({
            name: 'detect',
            onHandleError: function (parentZD, current, target, error) {
                if (error.originalStack && Error === ZoneAwareError) {
                    let frames = error.originalStack.split(/\n/);
                    let runFrame = false, runGuardedFrame = false, runTaskFrame = false;
                    while (frames.length) {
                        let frame = frames.shift();
                        // On safari it is possible to have stack frame with no line number.
                        // This check makes sure that we don't filter frames on name only (must have
                        // line number or exact equals to `ZoneAwareError`)
                        if (/:\d+:\d+/.test(frame) || frame === 'ZoneAwareError') {
                            // Get rid of the path so that we don't accidentally find function name in path.
                            // In chrome the separator is `(` and `@` in FF and safari
                            // Chrome: at Zone.run (zone.js:100)
                            // Chrome: at Zone.run (http://localhost:9876/base/build/lib/zone.js:100:24)
                            // FireFox: Zone.prototype.run@http://localhost:9876/base/build/lib/zone.js:101:24
                            // Safari: run@http://localhost:9876/base/build/lib/zone.js:101:24
                            let fnName = frame.split('(')[0].split('@')[0];
                            let frameType = 1 /* FrameType.transition */;
                            if (fnName.indexOf('ZoneAwareError') !== -1) {
                                if (fnName.indexOf('new ZoneAwareError') !== -1) {
                                    zoneAwareFrame1 = frame;
                                    zoneAwareFrame2 = frame.replace('new ZoneAwareError', 'new Error.ZoneAwareError');
                                }
                                else {
                                    zoneAwareFrame1WithoutNew = frame;
                                    zoneAwareFrame2WithoutNew = frame.replace('Error.', '');
                                    if (frame.indexOf('Error.ZoneAwareError') === -1) {
                                        zoneAwareFrame3WithoutNew = frame.replace('ZoneAwareError', 'Error.ZoneAwareError');
                                    }
                                }
                                zoneJsInternalStackFrames[zoneAwareFrame2] = 0 /* FrameType.zoneJsInternal */;
                            }
                            if (fnName.indexOf('runGuarded') !== -1) {
                                runGuardedFrame = true;
                            }
                            else if (fnName.indexOf('runTask') !== -1) {
                                runTaskFrame = true;
                            }
                            else if (fnName.indexOf('run') !== -1) {
                                runFrame = true;
                            }
                            else {
                                frameType = 0 /* FrameType.zoneJsInternal */;
                            }
                            zoneJsInternalStackFrames[frame] = frameType;
                            // Once we find all of the frames we can stop looking.
                            if (runFrame && runGuardedFrame && runTaskFrame) {
                                ZoneAwareError[stackRewrite] = true;
                                break;
                            }
                        }
                    }
                }
                return false;
            },
        });
        // carefully constructor a stack frame which contains all of the frames of interest which
        // need to be detected and marked as an internal zoneJs frame.
        const childDetectZone = detectZone.fork({
            name: 'child',
            onScheduleTask: function (delegate, curr, target, task) {
                return delegate.scheduleTask(target, task);
            },
            onInvokeTask: function (delegate, curr, target, task, applyThis, applyArgs) {
                return delegate.invokeTask(target, task, applyThis, applyArgs);
            },
            onCancelTask: function (delegate, curr, target, task) {
                return delegate.cancelTask(target, task);
            },
            onInvoke: function (delegate, curr, target, callback, applyThis, applyArgs, source) {
                return delegate.invoke(target, callback, applyThis, applyArgs, source);
            },
        });
        // we need to detect all zone related frames, it will
        // exceed default stackTraceLimit, so we set it to
        // larger number here, and restore it after detect finish.
        // We cast through any so we don't need to depend on nodejs typings.
        const originalStackTraceLimit = Error.stackTraceLimit;
        Error.stackTraceLimit = 100;
        // we schedule event/micro/macro task, and invoke them
        // when onSchedule, so we can get all stack traces for
        // all kinds of tasks with one error thrown.
        childDetectZone.run(() => {
            childDetectZone.runGuarded(() => {
                const fakeTransitionTo = () => { };
                childDetectZone.scheduleEventTask(zoneJsInternalStackFramesSymbol, () => {
                    childDetectZone.scheduleMacroTask(zoneJsInternalStackFramesSymbol, () => {
                        childDetectZone.scheduleMicroTask(zoneJsInternalStackFramesSymbol, () => {
                            throw new Error();
                        }, undefined, (t) => {
                            t._transitionTo = fakeTransitionTo;
                            t.invoke();
                        });
                        childDetectZone.scheduleMicroTask(zoneJsInternalStackFramesSymbol, () => {
                            throw Error();
                        }, undefined, (t) => {
                            t._transitionTo = fakeTransitionTo;
                            t.invoke();
                        });
                    }, undefined, (t) => {
                        t._transitionTo = fakeTransitionTo;
                        t.invoke();
                    }, () => { });
                }, undefined, (t) => {
                    t._transitionTo = fakeTransitionTo;
                    t.invoke();
                }, () => { });
            });
        });
        Error.stackTraceLimit = originalStackTraceLimit;
    });
}

patchError(Zone);
7|nx]"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchError(e){e.__load_patch("Error",((e,r,t)=>{const n=t.symbol("zoneJsInternalStackFrames"),a=e[t.symbol("Error")]=e.Error,o={};let c,i,s,l,u;e.Error=h;const k="stackRewrite",f=e.__Zone_Error_BlacklistedStackFrames_policy||e.__Zone_Error_ZoneJsInternalStackFrames_policy||"default";function p(e,r,t=!0){let n=e.split("\n"),a=0;for(;n[a]!==c&&n[a]!==i&&n[a]!==s&&n[a]!==l&&n[a]!==u&&a<n.length;)a++;for(;a<n.length&&r;a++){let e=n[a];if(e.trim())switch(o[e]){case 0:n.splice(a,1),a--;break;case 1:r=r.parent?r.parent:null,n.splice(a,1),a--;break;default:n[a]+=t?` [${r.zone.name}]`:` [${r.zoneName}]`}}return n.join("\n")}function h(){let e=a.apply(this,arguments);const r=e.originalStack=e.stack;if(h[k]&&r){let n=t.currentZoneFrame();if("lazy"===f)e[t.symbol("zoneFrameNames")]=function a(e){let r={zoneName:e.zone.name},t=r;for(;e.parent;){const t={zoneName:(e=e.parent).zone.name};r.parent=t,r=t}return t}(n);else if("default"===f)try{e.stack=e.zoneAwareStack=p(r,n)}catch(e){}}return this instanceof a&&this.constructor!=a?(Object.keys(e).concat("stack","message","cause").forEach((r=>{const t=e[r];if(void 0!==t)try{this[r]=t}catch(e){}})),this):e}h.prototype=a.prototype,h[n]=o,h[k]=!1;const m=t.symbol("zoneAwareStack");"lazy"===f&&Object.defineProperty(h.prototype,"zoneAwareStack",{configurable:!0,enumerable:!0,get:function(){return this[m]||(this[m]=p(this.originalStack,this[t.symbol("zoneFrameNames")],!1)),this[m]},set:function(e){this.originalStack=e,this[m]=p(this.originalStack,this[t.symbol("zoneFrameNames")],!1)}});const d=["stackTraceLimit","captureStackTrace","prepareStackTrace"],T=Object.keys(a);if(T&&T.forEach((e=>{0===d.filter((r=>r===e)).length&&Object.defineProperty(h,e,{get:function(){return a[e]},set:function(r){a[e]=r}})})),a.hasOwnProperty("stackTraceLimit")&&(a.stackTraceLimit=Math.max(a.stackTraceLimit,15),Object.defineProperty(h,"stackTraceLimit",{get:function(){return a.stackTraceLimit},set:function(e){return a.stackTraceLimit=e}})),a.hasOwnProperty("captureStackTrace")&&Object.defineProperty(h,"captureStackTrace",{value:function e(r,t){a.captureStackTrace(r,t)}}),Object.defineProperty(h,"prepareStackTrace",{get:function(){return a.prepareStackTrace},set:function(e){return a.prepareStackTrace=e&&"function"==typeof e?function(r,t){if(t)for(let e=0;e<t.length;e++)if("zoneCaptureStackTrace"===t[e].getFunctionName()){t.splice(e,1);break}return e.call(this,r,t)}:e}}),"disable"===f)return;const E=r.current.fork({name:"detect",onHandleError:function(e,r,t,n){if(n.originalStack&&Error===h){let e=n.originalStack.split(/\n/),r=!1,t=!1,a=!1;for(;e.length;){let n=e.shift();if(/:\d+:\d+/.test(n)||"ZoneAwareError"===n){let e=n.split("(")[0].split("@")[0],f=1;if(-1!==e.indexOf("ZoneAwareError")&&(-1!==e.indexOf("new ZoneAwareError")?(c=n,i=n.replace("new ZoneAwareError","new Error.ZoneAwareError")):(s=n,l=n.replace("Error.",""),-1===n.indexOf("Error.ZoneAwareError")&&(u=n.replace("ZoneAwareError","Error.ZoneAwareError"))),o[i]=0),-1!==e.indexOf("runGuarded")?t=!0:-1!==e.indexOf("runTask")?a=!0:-1!==e.indexOf("run")?r=!0:f=0,o[n]=f,r&&t&&a){h[k]=!0;break}}}}return!1}}).fork({name:"child",onScheduleTask:function(e,r,t,n){return e.scheduleTask(t,n)},onInvokeTask:function(e,r,t,n,a,o){return e.invokeTask(t,n,a,o)},onCancelTask:function(e,r,t,n){return e.cancelTask(t,n)},onInvoke:function(e,r,t,n,a,o,c){return e.invoke(t,n,a,o,c)}}),y=Error.stackTraceLimit;Error.stackTraceLimit=100,E.run((()=>{E.runGuarded((()=>{const e=()=>{};E.scheduleEventTask(n,(()=>{E.scheduleMacroTask(n,(()=>{E.scheduleMicroTask(n,(()=>{throw new Error}),void 0,(r=>{r._transitionTo=e,r.invoke()})),E.scheduleMicroTask(n,(()=>{throw Error()}),void 0,(r=>{r._transitionTo=e,r.invoke()}))}),void 0,(r=>{r._transitionTo=e,r.invoke()}),(()=>{}))}),void 0,(r=>{r._transitionTo=e,r.invoke()}),(()=>{}))}))})),Error.stackTraceLimit=y}))}patchError(Zone);rx_9'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
/*
 * This is necessary for Chrome and Chrome mobile, to enable
 * things like redefining `createdCallback` on an element.
 */
let zoneSymbol;
let _defineProperty;
let _getOwnPropertyDescriptor;
let _create;
let unconfigurablesKey;
function propertyPatch() {
    zoneSymbol = Zone.__symbol__;
    _defineProperty = Object[zoneSymbol('defineProperty')] = Object.defineProperty;
    _getOwnPropertyDescriptor = Object[zoneSymbol('getOwnPropertyDescriptor')] =
        Object.getOwnPropertyDescriptor;
    _create = Object.create;
    unconfigurablesKey = zoneSymbol('unconfigurables');
    Object.defineProperty = function (obj, prop, desc) {
        if (isUnconfigurable(obj, prop)) {
            throw new TypeError("Cannot assign to read only property '" + prop + "' of " + obj);
        }
        const originalConfigurableFlag = desc.configurable;
        if (prop !== 'prototype') {
            desc = rewriteDescriptor(obj, prop, desc);
        }
        return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
    };
    Object.defineProperties = function (obj, props) {
        Object.keys(props).forEach(function (prop) {
            Object.defineProperty(obj, prop, props[prop]);
        });
        for (const sym of Object.getOwnPropertySymbols(props)) {
            const desc = Object.getOwnPropertyDescriptor(props, sym);
            // Since `Object.getOwnPropertySymbols` returns *all* symbols,
            // including non-enumerable ones, retrieve property descriptor and check
            // enumerability there. Proceed with the rewrite only when a property is
            // enumerable to make the logic consistent with the way regular
            // properties are retrieved (via `Object.keys`, which respects
            // `enumerable: false` flag). More information:
            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties#retrieval
            if (desc?.enumerable) {
                Object.defineProperty(obj, sym, props[sym]);
            }
        }
        return obj;
    };
    Object.create = function (proto, propertiesObject) {
        if (typeof propertiesObject === 'object' && !Object.isFrozen(propertiesObject)) {
            Object.keys(propertiesObject).forEach(function (prop) {
                propertiesObject[prop] = rewriteDescriptor(proto, prop, propertiesObject[prop]);
            });
        }
        return _create(proto, propertiesObject);
    };
    Object.getOwnPropertyDescriptor = function (obj, prop) {
        const desc = _getOwnPropertyDescriptor(obj, prop);
        if (desc && isUnconfigurable(obj, prop)) {
            desc.configurable = false;
        }
        return desc;
    };
}
function _redefineProperty(obj, prop, desc) {
    const originalConfigurableFlag = desc.configurable;
    desc = rewriteDescriptor(obj, prop, desc);
    return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
}
function isUnconfigurable(obj, prop) {
    return obj && obj[unconfigurablesKey] && obj[unconfigurablesKey][prop];
}
function rewriteDescriptor(obj, prop, desc) {
    // issue-927, if the desc is frozen, don't try to change the desc
    if (!Object.isFrozen(desc)) {
        desc.configurable = true;
    }
    if (!desc.configurable) {
        // issue-927, if the obj is frozen, don't try to set the desc to obj
        if (!obj[unconfigurablesKey] && !Object.isFrozen(obj)) {
            _defineProperty(obj, unconfigurablesKey, { writable: true, value: {} });
        }
        if (obj[unconfigurablesKey]) {
            obj[unconfigurablesKey][prop] = true;
        }
    }
    return desc;
}
function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) {
    try {
        return _defineProperty(obj, prop, desc);
    }
    catch (error) {
        if (desc.configurable) {
            // In case of errors, when the configurable flag was likely set by rewriteDescriptor(),
            // let's retry with the original flag value
            if (typeof originalConfigurableFlag == 'undefined') {
                delete desc.configurable;
            }
            else {
                desc.configurable = originalConfigurableFlag;
            }
            try {
                return _defineProperty(obj, prop, desc);
            }
            catch (error) {
                let swallowError = false;
                if (prop === 'createdCallback' ||
                    prop === 'attachedCallback' ||
                    prop === 'detachedCallback' ||
                    prop === 'attributeChangedCallback') {
                    // We only swallow the error in registerElement patch
                    // this is the work around since some applications
                    // fail if we throw the error
                    swallowError = true;
                }
                if (!swallowError) {
                    throw error;
                }
                // TODO: @JiaLiPassion, Some application such as `registerElement` patch
                // still need to swallow the error, in the future after these applications
                // are updated, the following logic can be removed.
                let descJson = null;
                try {
                    descJson = JSON.stringify(desc);
                }
                catch (error) {
                    descJson = desc.toString();
                }
                console.log(`Attempting to configure '${prop}' with descriptor '${descJson}' on object '${obj}' and got error, giving up: ${error}`);
            }
        }
        else {
            throw error;
        }
    }
}

function eventTargetLegacyPatch(_global, api) {
    const { eventNames, globalSources, zoneSymbolEventNames, TRUE_STR, FALSE_STR, ZONE_SYMBOL_PREFIX } = api.getGlobalObjects();
    const WTF_ISSUE_555 = 'Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video';
    const NO_EVENT_TARGET = 'ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket'.split(',');
    const EVENT_TARGET = 'EventTarget';
    let apis = [];
    const isWtf = _global['wtf'];
    const WTF_ISSUE_555_ARRAY = WTF_ISSUE_555.split(',');
    if (isWtf) {
        // Workaround for: https://github.com/google/tracing-framework/issues/555
        apis = WTF_ISSUE_555_ARRAY.map((v) => 'HTML' + v + 'Element').concat(NO_EVENT_TARGET);
    }
    else if (_global[EVENT_TARGET]) {
        apis.push(EVENT_TARGET);
    }
    else {
        // Note: EventTarget is not available in all browsers,
        // if it's not available, we instead patch the APIs in the IDL that inherit from EventTarget
        apis = NO_EVENT_TARGET;
    }
    const isDisableIECheck = _global['__Zone_disable_IE_check'] || false;
    const isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false;
    const ieOrEdge = api.isIEOrEdge();
    const ADD_EVENT_LISTENER_SOURCE = '.addEventListener:';
    const FUNCTION_WRAPPER = '[object FunctionWrapper]';
    const BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }';
    const pointerEventsMap = {
        'MSPointerCancel': 'pointercancel',
        'MSPointerDown': 'pointerdown',
        'MSPointerEnter': 'pointerenter',
        'MSPointerHover': 'pointerhover',
        'MSPointerLeave': 'pointerleave',
        'MSPointerMove': 'pointermove',
        'MSPointerOut': 'pointerout',
        'MSPointerOver': 'pointerover',
        'MSPointerUp': 'pointerup',
    };
    //  predefine all __zone_symbol__ + eventName + true/false string
    for (let i = 0; i < eventNames.length; i++) {
        const eventName = eventNames[i];
        const falseEventName = eventName + FALSE_STR;
        const trueEventName = eventName + TRUE_STR;
        const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
        const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
        zoneSymbolEventNames[eventName] = {};
        zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
        zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
    }
    //  predefine all task.source string
    for (let i = 0; i < WTF_ISSUE_555_ARRAY.length; i++) {
        const target = WTF_ISSUE_555_ARRAY[i];
        const targets = (globalSources[target] = {});
        for (let j = 0; j < eventNames.length; j++) {
            const eventName = eventNames[j];
            targets[eventName] = target + ADD_EVENT_LISTENER_SOURCE + eventName;
        }
    }
    const checkIEAndCrossContext = function (nativeDelegate, delegate, target, args) {
        if (!isDisableIECheck && ieOrEdge) {
            if (isEnableCrossContextCheck) {
                try {
                    const testString = delegate.toString();
                    if (testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS) {
                        nativeDelegate.apply(target, args);
                        return false;
                    }
                }
                catch (error) {
                    nativeDelegate.apply(target, args);
                    return false;
                }
            }
            else {
                const testString = delegate.toString();
                if (testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS) {
                    nativeDelegate.apply(target, args);
                    return false;
                }
            }
        }
        else if (isEnableCrossContextCheck) {
            try {
                delegate.toString();
            }
            catch (error) {
                nativeDelegate.apply(target, args);
                return false;
            }
        }
        return true;
    };
    const apiTypes = [];
    for (let i = 0; i < apis.length; i++) {
        const type = _global[apis[i]];
        apiTypes.push(type && type.prototype);
    }
    // vh is validateHandler to check event handler
    // is valid or not(for security check)
    api.patchEventTarget(_global, api, apiTypes, {
        vh: checkIEAndCrossContext,
        transferEventName: (eventName) => {
            const pointerEventName = pointerEventsMap[eventName];
            return pointerEventName || eventName;
        },
    });
    Zone[api.symbol('patchEventTarget')] = !!_global[EVENT_TARGET];
    return true;
}

// we have to patch the instance since the proto is non-configurable
function apply(api, _global) {
    const { ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR } = api.getGlobalObjects();
    const WS = _global.WebSocket;
    // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
    // On older Chrome, no need since EventTarget was already patched
    if (!_global.EventTarget) {
        api.patchEventTarget(_global, api, [WS.prototype]);
    }
    _global.WebSocket = function (x, y) {
        const socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
        let proxySocket;
        let proxySocketProto;
        // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
        const onmessageDesc = api.ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
        if (onmessageDesc && onmessageDesc.configurable === false) {
            proxySocket = api.ObjectCreate(socket);
            // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
            // but proxySocket not, so we will keep socket as prototype and pass it to
            // patchOnProperties method
            proxySocketProto = socket;
            [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
                proxySocket[propName] = function () {
                    const args = api.ArraySlice.call(arguments);
                    if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
                        const eventName = args.length > 0 ? args[0] : undefined;
                        if (eventName) {
                            const propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
                            socket[propertySymbol] = proxySocket[propertySymbol];
                        }
                    }
                    return socket[propName].apply(socket, args);
                };
            });
        }
        else {
            // we can patch the real socket
            proxySocket = socket;
        }
        api.patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
        return proxySocket;
    };
    const globalWebSocket = _global['WebSocket'];
    for (const prop in WS) {
        globalWebSocket[prop] = WS[prop];
    }
}

/**
 * @fileoverview
 * @suppress {globalThis}
 */
function propertyDescriptorLegacyPatch(api, _global) {
    const { isNode, isMix } = api.getGlobalObjects();
    if (isNode && !isMix) {
        return;
    }
    if (!canPatchViaPropertyDescriptor(api, _global)) {
        const supportsWebSocket = typeof WebSocket !== 'undefined';
        // Safari, Android browsers (Jelly Bean)
        patchViaCapturingAllTheEvents(api);
        api.patchClass('XMLHttpRequest');
        if (supportsWebSocket) {
            apply(api, _global);
        }
        Zone[api.symbol('patchEvents')] = true;
    }
}
function canPatchViaPropertyDescriptor(api, _global) {
    const { isBrowser, isMix } = api.getGlobalObjects();
    if ((isBrowser || isMix) &&
        !api.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
        typeof Element !== 'undefined') {
        // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
        // IDL interface attributes are not configurable
        const desc = api.ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
        if (desc && !desc.configurable)
            return false;
        // try to use onclick to detect whether we can patch via propertyDescriptor
        // because XMLHttpRequest is not available in service worker
        if (desc) {
            api.ObjectDefineProperty(Element.prototype, 'onclick', {
                enumerable: true,
                configurable: true,
                get: function () {
                    return true;
                },
            });
            const div = document.createElement('div');
            const result = !!div.onclick;
            api.ObjectDefineProperty(Element.prototype, 'onclick', desc);
            return result;
        }
    }
    const XMLHttpRequest = _global['XMLHttpRequest'];
    if (!XMLHttpRequest) {
        // XMLHttpRequest is not available in service worker
        return false;
    }
    const ON_READY_STATE_CHANGE = 'onreadystatechange';
    const XMLHttpRequestPrototype = XMLHttpRequest.prototype;
    const xhrDesc = api.ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
    // add enumerable and configurable here because in opera
    // by default XMLHttpRequest.prototype.onreadystatechange is undefined
    // without adding enumerable and configurable will cause onreadystatechange
    // non-configurable
    // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
    // we should set a real desc instead a fake one
    if (xhrDesc) {
        api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
            enumerable: true,
            configurable: true,
            get: function () {
                return true;
            },
        });
        const req = new XMLHttpRequest();
        const result = !!req.onreadystatechange;
        // restore original desc
        api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
        return result;
    }
    else {
        const SYMBOL_FAKE_ONREADYSTATECHANGE = api.symbol('fake');
        api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
            enumerable: true,
            configurable: true,
            get: function () {
                return this[SYMBOL_FAKE_ONREADYSTATECHANGE];
            },
            set: function (value) {
                this[SYMBOL_FAKE_ONREADYSTATECHANGE] = value;
            },
        });
        const req = new XMLHttpRequest();
        const detectFunc = () => { };
        req.onreadystatechange = detectFunc;
        const result = req[SYMBOL_FAKE_ONREADYSTATECHANGE] === detectFunc;
        req.onreadystatechange = null;
        return result;
    }
}
const globalEventHandlersEventNames = [
    'abort',
    'animationcancel',
    'animationend',
    'animationiteration',
    'auxclick',
    'beforeinput',
    'blur',
    'cancel',
    'canplay',
    'canplaythrough',
    'change',
    'compositionstart',
    'compositionupdate',
    'compositionend',
    'cuechange',
    'click',
    'close',
    'contextmenu',
    'curechange',
    'dblclick',
    'drag',
    'dragend',
    'dragenter',
    'dragexit',
    'dragleave',
    'dragover',
    'drop',
    'durationchange',
    'emptied',
    'ended',
    'error',
    'focus',
    'focusin',
    'focusout',
    'gotpointercapture',
    'input',
    'invalid',
    'keydown',
    'keypress',
    'keyup',
    'load',
    'loadstart',
    'loadeddata',
    'loadedmetadata',
    'lostpointercapture',
    'mousedown',
    'mouseenter',
    'mouseleave',
    'mousemove',
    'mouseout',
    'mouseover',
    'mouseup',
    'mousewheel',
    'orientationchange',
    'pause',
    'play',
    'playing',
    'pointercancel',
    'pointerdown',
    'pointerenter',
    'pointerleave',
    'pointerlockchange',
    'mozpointerlockchange',
    'webkitpointerlockerchange',
    'pointerlockerror',
    'mozpointerlockerror',
    'webkitpointerlockerror',
    'pointermove',
    'pointout',
    'pointerover',
    'pointerup',
    'progress',
    'ratechange',
    'reset',
    'resize',
    'scroll',
    'seeked',
    'seeking',
    'select',
    'selectionchange',
    'selectstart',
    'show',
    'sort',
    'stalled',
    'submit',
    'suspend',
    'timeupdate',
    'volumechange',
    'touchcancel',
    'touchmove',
    'touchstart',
    'touchend',
    'transitioncancel',
    'transitionend',
    'waiting',
    'wheel',
];
const documentEventNames = [
    'afterscriptexecute',
    'beforescriptexecute',
    'DOMContentLoaded',
    'freeze',
    'fullscreenchange',
    'mozfullscreenchange',
    'webkitfullscreenchange',
    'msfullscreenchange',
    'fullscreenerror',
    'mozfullscreenerror',
    'webkitfullscreenerror',
    'msfullscreenerror',
    'readystatechange',
    'visibilitychange',
    'resume',
];
const windowEventNames = [
    'absolutedeviceorientation',
    'afterinput',
    'afterprint',
    'appinstalled',
    'beforeinstallprompt',
    'beforeprint',
    'beforeunload',
    'devicelight',
    'devicemotion',
    'deviceorientation',
    'deviceorientationabsolute',
    'deviceproximity',
    'hashchange',
    'languagechange',
    'message',
    'mozbeforepaint',
    'offline',
    'online',
    'paint',
    'pageshow',
    'pagehide',
    'popstate',
    'rejectionhandled',
    'storage',
    'unhandledrejection',
    'unload',
    'userproximity',
    'vrdisplayconnected',
    'vrdisplaydisconnected',
    'vrdisplaypresentchange',
];
const htmlElementEventNames = [
    'beforecopy',
    'beforecut',
    'beforepaste',
    'copy',
    'cut',
    'paste',
    'dragstart',
    'loadend',
    'animationstart',
    'search',
    'transitionrun',
    'transitionstart',
    'webkitanimationend',
    'webkitanimationiteration',
    'webkitanimationstart',
    'webkittransitionend',
];
const ieElementEventNames = [
    'activate',
    'afterupdate',
    'ariarequest',
    'beforeactivate',
    'beforedeactivate',
    'beforeeditfocus',
    'beforeupdate',
    'cellchange',
    'controlselect',
    'dataavailable',
    'datasetchanged',
    'datasetcomplete',
    'errorupdate',
    'filterchange',
    'layoutcomplete',
    'losecapture',
    'move',
    'moveend',
    'movestart',
    'propertychange',
    'resizeend',
    'resizestart',
    'rowenter',
    'rowexit',
    'rowsdelete',
    'rowsinserted',
    'command',
    'compassneedscalibration',
    'deactivate',
    'help',
    'mscontentzoom',
    'msmanipulationstatechanged',
    'msgesturechange',
    'msgesturedoubletap',
    'msgestureend',
    'msgesturehold',
    'msgesturestart',
    'msgesturetap',
    'msgotpointercapture',
    'msinertiastart',
    'mslostpointercapture',
    'mspointercancel',
    'mspointerdown',
    'mspointerenter',
    'mspointerhover',
    'mspointerleave',
    'mspointermove',
    'mspointerout',
    'mspointerover',
    'mspointerup',
    'pointerout',
    'mssitemodejumplistitemremoved',
    'msthumbnailclick',
    'stop',
    'storagecommit',
];
const webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror'];
const formEventNames = ['autocomplete', 'autocompleteerror'];
const detailEventNames = ['toggle'];
const eventNames = [
    ...globalEventHandlersEventNames,
    ...webglEventNames,
    ...formEventNames,
    ...detailEventNames,
    ...documentEventNames,
    ...windowEventNames,
    ...htmlElementEventNames,
    ...ieElementEventNames,
];
// Whenever any eventListener fires, we check the eventListener target and all parents
// for `onwhatever` properties and replace them with zone-bound functions
// - Chrome (for now)
function patchViaCapturingAllTheEvents(api) {
    const unboundKey = api.symbol('unbound');
    for (let i = 0; i < eventNames.length; i++) {
        const property = eventNames[i];
        const onproperty = 'on' + property;
        self.addEventListener(property, function (event) {
            let elt = event.target, bound, source;
            if (elt) {
                source = elt.constructor['name'] + '.' + onproperty;
            }
            else {
                source = 'unknown.' + onproperty;
            }
            while (elt) {
                if (elt[onproperty] && !elt[onproperty][unboundKey]) {
                    bound = api.wrapWithCurrentZone(elt[onproperty], source);
                    bound[unboundKey] = elt[onproperty];
                    elt[onproperty] = bound;
                }
                elt = elt.parentElement;
            }
        }, true);
    }
}

function registerElementPatch(_global, api) {
    const { isBrowser, isMix } = api.getGlobalObjects();
    if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) {
        return;
    }
    const callbacks = [
        'createdCallback',
        'attachedCallback',
        'detachedCallback',
        'attributeChangedCallback',
    ];
    api.patchCallbacks(api, document, 'Document', 'registerElement', callbacks);
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
function patchBrowserLegacy() {
    const _global = typeof window !== 'undefined'
        ? window
        : typeof global !== 'undefined'
            ? global
            : typeof self !== 'undefined'
                ? self
                : {};
    const symbolPrefix = _global['__Zone_symbol_prefix'] || '__zone_symbol__';
    function __symbol__(name) {
        return symbolPrefix + name;
    }
    _global[__symbol__('legacyPatch')] = function () {
        const Zone = _global['Zone'];
        Zone.__load_patch('defineProperty', (global, Zone, api) => {
            api._redefineProperty = _redefineProperty;
            propertyPatch();
        });
        Zone.__load_patch('registerElement', (global, Zone, api) => {
            registerElementPatch(global, api);
        });
        Zone.__load_patch('EventTargetLegacy', (global, Zone, api) => {
            eventTargetLegacyPatch(global, api);
            propertyDescriptorLegacyPatch(api, global);
        });
    };
}

patchBrowserLegacy();
V$x+"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */let zoneSymbol,_defineProperty,_getOwnPropertyDescriptor,_create,unconfigurablesKey;function propertyPatch(){zoneSymbol=Zone.__symbol__,_defineProperty=Object[zoneSymbol("defineProperty")]=Object.defineProperty,_getOwnPropertyDescriptor=Object[zoneSymbol("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,_create=Object.create,unconfigurablesKey=zoneSymbol("unconfigurables"),Object.defineProperty=function(e,t,n){if(isUnconfigurable(e,t))throw new TypeError("Cannot assign to read only property '"+t+"' of "+e);const r=n.configurable;return"prototype"!==t&&(n=rewriteDescriptor(e,t,n)),_tryDefineProperty(e,t,n,r)},Object.defineProperties=function(e,t){Object.keys(t).forEach((function(n){Object.defineProperty(e,n,t[n])}));for(const n of Object.getOwnPropertySymbols(t)){const r=Object.getOwnPropertyDescriptor(t,n);r?.enumerable&&Object.defineProperty(e,n,t[n])}return e},Object.create=function(e,t){return"object"!=typeof t||Object.isFrozen(t)||Object.keys(t).forEach((function(n){t[n]=rewriteDescriptor(e,n,t[n])})),_create(e,t)},Object.getOwnPropertyDescriptor=function(e,t){const n=_getOwnPropertyDescriptor(e,t);return n&&isUnconfigurable(e,t)&&(n.configurable=!1),n}}function _redefineProperty(e,t,n){const r=n.configurable;return _tryDefineProperty(e,t,n=rewriteDescriptor(e,t,n),r)}function isUnconfigurable(e,t){return e&&e[unconfigurablesKey]&&e[unconfigurablesKey][t]}function rewriteDescriptor(e,t,n){return Object.isFrozen(n)||(n.configurable=!0),n.configurable||(e[unconfigurablesKey]||Object.isFrozen(e)||_defineProperty(e,unconfigurablesKey,{writable:!0,value:{}}),e[unconfigurablesKey]&&(e[unconfigurablesKey][t]=!0)),n}function _tryDefineProperty(e,t,n,r){try{return _defineProperty(e,t,n)}catch(o){if(!n.configurable)throw o;void 0===r?delete n.configurable:n.configurable=r;try{return _defineProperty(e,t,n)}catch(r){let o=!1;if("createdCallback"!==t&&"attachedCallback"!==t&&"detachedCallback"!==t&&"attributeChangedCallback"!==t||(o=!0),!o)throw r;let a=null;try{a=JSON.stringify(n)}catch(e){a=n.toString()}console.log(`Attempting to configure '${t}' with descriptor '${a}' on object '${e}' and got error, giving up: ${r}`)}}}function eventTargetLegacyPatch(e,t){const{eventNames:n,globalSources:r,zoneSymbolEventNames:o,TRUE_STR:a,FALSE_STR:c,ZONE_SYMBOL_PREFIX:i}=t.getGlobalObjects(),s="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),l="EventTarget";let p=[];const u=e.wtf,d="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video".split(",");u?p=d.map((e=>"HTML"+e+"Element")).concat(s):e[l]?p.push(l):p=s;const g=e.__Zone_disable_IE_check||!1,m=e.__Zone_enable_cross_context_check||!1,f=t.isIEOrEdge(),b="[object FunctionWrapper]",y="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",h={MSPointerCancel:"pointercancel",MSPointerDown:"pointerdown",MSPointerEnter:"pointerenter",MSPointerHover:"pointerhover",MSPointerLeave:"pointerleave",MSPointerMove:"pointermove",MSPointerOut:"pointerout",MSPointerOver:"pointerover",MSPointerUp:"pointerup"};for(let e=0;e<n.length;e++){const t=n[e],r=i+(t+c),s=i+(t+a);o[t]={},o[t][c]=r,o[t][a]=s}for(let e=0;e<d.length;e++){const t=d[e],o=r[t]={};for(let e=0;e<n.length;e++){const r=n[e];o[r]=t+".addEventListener:"+r}}const v=[];for(let t=0;t<p.length;t++){const n=e[p[t]];v.push(n&&n.prototype)}return t.patchEventTarget(e,t,v,{vh:function(e,t,n,r){if(!g&&f)if(m)try{const o=t.toString();if(o===b||o==y)return e.apply(n,r),!1}catch(t){return e.apply(n,r),!1}else{const o=t.toString();if(o===b||o==y)return e.apply(n,r),!1}else if(m)try{t.toString()}catch(t){return e.apply(n,r),!1}return!0},transferEventName:e=>h[e]||e}),Zone[t.symbol("patchEventTarget")]=!!e[l],!0}function apply(e,t){const{ADD_EVENT_LISTENER_STR:n,REMOVE_EVENT_LISTENER_STR:r}=e.getGlobalObjects(),o=t.WebSocket;t.EventTarget||e.patchEventTarget(t,e,[o.prototype]),t.WebSocket=function(t,a){const c=arguments.length>1?new o(t,a):new o(t);let i,s;const l=e.ObjectGetOwnPropertyDescriptor(c,"onmessage");return l&&!1===l.configurable?(i=e.ObjectCreate(c),s=c,[n,r,"send","close"].forEach((function(t){i[t]=function(){const o=e.ArraySlice.call(arguments);if(t===n||t===r){const e=o.length>0?o[0]:void 0;if(e){const t=Zone.__symbol__("ON_PROPERTY"+e);c[t]=i[t]}}return c[t].apply(c,o)}}))):i=c,e.patchOnProperties(i,["close","error","message","open"],s),i};const a=t.WebSocket;for(const e in o)a[e]=o[e]}function propertyDescriptorLegacyPatch(e,t){const{isNode:n,isMix:r}=e.getGlobalObjects();if((!n||r)&&!canPatchViaPropertyDescriptor(e,t)){const n="undefined"!=typeof WebSocket;patchViaCapturingAllTheEvents(e),e.patchClass("XMLHttpRequest"),n&&apply(e,t),Zone[e.symbol("patchEvents")]=!0}}function canPatchViaPropertyDescriptor(e,t){const{isBrowser:n,isMix:r}=e.getGlobalObjects();if((n||r)&&!e.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){const t=e.ObjectGetOwnPropertyDescriptor(Element.prototype,"onclick");if(t&&!t.configurable)return!1;if(t){e.ObjectDefineProperty(Element.prototype,"onclick",{enumerable:!0,configurable:!0,get:function(){return!0}});const n=!!document.createElement("div").onclick;return e.ObjectDefineProperty(Element.prototype,"onclick",t),n}}const o=t.XMLHttpRequest;if(!o)return!1;const a="onreadystatechange",c=o.prototype,i=e.ObjectGetOwnPropertyDescriptor(c,a);if(i){e.ObjectDefineProperty(c,a,{enumerable:!0,configurable:!0,get:function(){return!0}});const t=!!(new o).onreadystatechange;return e.ObjectDefineProperty(c,a,i||{}),t}{const t=e.symbol("fake");e.ObjectDefineProperty(c,a,{enumerable:!0,configurable:!0,get:function(){return this[t]},set:function(e){this[t]=e}});const n=new o,r=()=>{};n.onreadystatechange=r;const i=n[t]===r;return n.onreadystatechange=null,i}}const globalEventHandlersEventNames=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"],documentEventNames=["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],windowEventNames=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplayconnected","vrdisplaydisconnected","vrdisplaypresentchange"],htmlElementEventNames=["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],ieElementEventNames=["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"],webglEventNames=["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],formEventNames=["autocomplete","autocompleteerror"],detailEventNames=["toggle"],eventNames=[...globalEventHandlersEventNames,...webglEventNames,...formEventNames,...detailEventNames,...documentEventNames,...windowEventNames,...htmlElementEventNames,...ieElementEventNames];function patchViaCapturingAllTheEvents(e){const t=e.symbol("unbound");for(let n=0;n<eventNames.length;n++){const r=eventNames[n],o="on"+r;self.addEventListener(r,(function(n){let r,a,c=n.target;for(a=c?c.constructor.name+"."+o:"unknown."+o;c;)c[o]&&!c[o][t]&&(r=e.wrapWithCurrentZone(c[o],a),r[t]=c[o],c[o]=r),c=c.parentElement}),!0)}}function registerElementPatch(e,t){const{isBrowser:n,isMix:r}=t.getGlobalObjects();(n||r)&&"registerElement"in e.document&&t.patchCallbacks(t,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}function patchBrowserLegacy(){const e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},t=e.__Zone_symbol_prefix||"__zone_symbol__";e[function n(e){return t+e}("legacyPatch")]=function(){const t=e.Zone;t.__load_patch("defineProperty",((e,t,n)=>{n._redefineProperty=_redefineProperty,propertyPatch()})),t.__load_patch("registerElement",((e,t,n)=>{registerElementPatch(e,n)})),t.__load_patch("EventTargetLegacy",((e,t,n)=>{eventTargetLegacyPatch(e,n),propertyDescriptorLegacyPatch(n,e)}))}}patchBrowserLegacy(); Hx   'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
const global = globalThis;
// __Zone_symbol_prefix global can be used to override the default zone
// symbol prefix with a custom one if needed.
function __symbol__(name) {
    const symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';
    return symbolPrefix + name;
}
function initZone() {
    const performance = global['performance'];
    function mark(name) {
        performance && performance['mark'] && performance['mark'](name);
    }
    function performanceMeasure(name, label) {
        performance && performance['measure'] && performance['measure'](name, label);
    }
    mark('Zone');
    class ZoneImpl {
        static __symbol__ = __symbol__;
        static assertZonePatched() {
            if (global['Promise'] !== patches['ZoneAwarePromise']) {
                throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
                    'has been overwritten.\n' +
                    'Most likely cause is that a Promise polyfill has been loaded ' +
                    'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
                    'If you must load one, do so before loading zone.js.)');
            }
        }
        static get root() {
            let zone = ZoneImpl.current;
            while (zone.parent) {
                zone = zone.parent;
            }
            return zone;
        }
        static get current() {
            return _currentZoneFrame.zone;
        }
        static get currentTask() {
            return _currentTask;
        }
        static __load_patch(name, fn, ignoreDuplicate = false) {
            if (patches.hasOwnProperty(name)) {
                // `checkDuplicate` option is defined from global variable
                // so it works for all modules.
                // `ignoreDuplicate` can work for the specified module
                const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
                if (!ignoreDuplicate && checkDuplicate) {
                    throw Error('Already loaded patch: ' + name);
                }
            }
            else if (!global['__Zone_disable_' + name]) {
                const perfName = 'Zone:' + name;
                mark(perfName);
                patches[name] = fn(global, ZoneImpl, _api);
                performanceMeasure(perfName, perfName);
            }
        }
        get parent() {
            return this._parent;
        }
        get name() {
            return this._name;
        }
        _parent;
        _name;
        _properties;
        _zoneDelegate;
        constructor(parent, zoneSpec) {
            this._parent = parent;
            this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '<root>';
            this._properties = (zoneSpec && zoneSpec.properties) || {};
            this._zoneDelegate = new _ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
        }
        get(key) {
            const zone = this.getZoneWith(key);
            if (zone)
                return zone._properties[key];
        }
        getZoneWith(key) {
            let current = this;
            while (current) {
                if (current._properties.hasOwnProperty(key)) {
                    return current;
                }
                current = current._parent;
            }
            return null;
        }
        fork(zoneSpec) {
            if (!zoneSpec)
                throw new Error('ZoneSpec required!');
            return this._zoneDelegate.fork(this, zoneSpec);
        }
        wrap(callback, source) {
            if (typeof callback !== 'function') {
                throw new Error('Expecting function got: ' + callback);
            }
            const _callback = this._zoneDelegate.intercept(this, callback, source);
            const zone = this;
            return function () {
                return zone.runGuarded(_callback, this, arguments, source);
            };
        }
        run(callback, applyThis, applyArgs, source) {
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
            }
            finally {
                _currentZoneFrame = _currentZoneFrame.parent;
            }
        }
        runGuarded(callback, applyThis = null, applyArgs, source) {
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                try {
                    return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
                }
                catch (error) {
                    if (this._zoneDelegate.handleError(this, error)) {
                        throw error;
                    }
                }
            }
            finally {
                _currentZoneFrame = _currentZoneFrame.parent;
            }
        }
        runTask(task, applyThis, applyArgs) {
            if (task.zone != this) {
                throw new Error('A task can only be run in the zone of creation! (Creation: ' +
                    (task.zone || NO_ZONE).name +
                    '; Execution: ' +
                    this.name +
                    ')');
            }
            const zoneTask = task;
            // https://github.com/angular/zone.js/issues/778, sometimes eventTask
            // will run in notScheduled(canceled) state, we should not try to
            // run such kind of task but just return
            const { type, data: { isPeriodic = false, isRefreshable = false } = {} } = task;
            if (task.state === notScheduled && (type === eventTask || type === macroTask)) {
                return;
            }
            const reEntryGuard = task.state != running;
            reEntryGuard && zoneTask._transitionTo(running, scheduled);
            const previousTask = _currentTask;
            _currentTask = zoneTask;
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                if (type == macroTask && task.data && !isPeriodic && !isRefreshable) {
                    task.cancelFn = undefined;
                }
                try {
                    return this._zoneDelegate.invokeTask(this, zoneTask, applyThis, applyArgs);
                }
                catch (error) {
                    if (this._zoneDelegate.handleError(this, error)) {
                        throw error;
                    }
                }
            }
            finally {
                // if the task's state is notScheduled or unknown, then it has already been cancelled
                // we should not reset the state to scheduled
                const state = task.state;
                if (state !== notScheduled && state !== unknown) {
                    if (type == eventTask || isPeriodic || (isRefreshable && state === scheduling)) {
                        reEntryGuard && zoneTask._transitionTo(scheduled, running, scheduling);
                    }
                    else {
                        const zoneDelegates = zoneTask._zoneDelegates;
                        this._updateTaskCount(zoneTask, -1);
                        reEntryGuard && zoneTask._transitionTo(notScheduled, running, notScheduled);
                        if (isRefreshable) {
                            zoneTask._zoneDelegates = zoneDelegates;
                        }
                    }
                }
                _currentZoneFrame = _currentZoneFrame.parent;
                _currentTask = previousTask;
            }
        }
        scheduleTask(task) {
            if (task.zone && task.zone !== this) {
                // check if the task was rescheduled, the newZone
                // should not be the children of the original zone
                let newZone = this;
                while (newZone) {
                    if (newZone === task.zone) {
                        throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${task.zone.name}`);
                    }
                    newZone = newZone.parent;
                }
            }
            task._transitionTo(scheduling, notScheduled);
            const zoneDelegates = [];
            task._zoneDelegates = zoneDelegates;
            task._zone = this;
            try {
                task = this._zoneDelegate.scheduleTask(this, task);
            }
            catch (err) {
                // should set task's state to unknown when scheduleTask throw error
                // because the err may from reschedule, so the fromState maybe notScheduled
                task._transitionTo(unknown, scheduling, notScheduled);
                // TODO: @JiaLiPassion, should we check the result from handleError?
                this._zoneDelegate.handleError(this, err);
                throw err;
            }
            if (task._zoneDelegates === zoneDelegates) {
                // we have to check because internally the delegate can reschedule the task.
                this._updateTaskCount(task, 1);
            }
            if (task.state == scheduling) {
                task._transitionTo(scheduled, scheduling);
            }
            return task;
        }
        scheduleMicroTask(source, callback, data, customSchedule) {
            return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
        }
        scheduleMacroTask(source, callback, data, customSchedule, customCancel) {
            return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
        }
        scheduleEventTask(source, callback, data, customSchedule, customCancel) {
            return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
        }
        cancelTask(task) {
            if (task.zone != this)
                throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
                    (task.zone || NO_ZONE).name +
                    '; Execution: ' +
                    this.name +
                    ')');
            if (task.state !== scheduled && task.state !== running) {
                return;
            }
            task._transitionTo(canceling, scheduled, running);
            try {
                this._zoneDelegate.cancelTask(this, task);
            }
            catch (err) {
                // if error occurs when cancelTask, transit the state to unknown
                task._transitionTo(unknown, canceling);
                this._zoneDelegate.handleError(this, err);
                throw err;
            }
            this._updateTaskCount(task, -1);
            task._transitionTo(notScheduled, canceling);
            task.runCount = -1;
            return task;
        }
        _updateTaskCount(task, count) {
            const zoneDelegates = task._zoneDelegates;
            if (count == -1) {
                task._zoneDelegates = null;
            }
            for (let i = 0; i < zoneDelegates.length; i++) {
                zoneDelegates[i]._updateTaskCount(task.type, count);
            }
        }
    }
    const DELEGATE_ZS = {
        name: '',
        onHasTask: (delegate, _, target, hasTaskState) => delegate.hasTask(target, hasTaskState),
        onScheduleTask: (delegate, _, target, task) => delegate.scheduleTask(target, task),
        onInvokeTask: (delegate, _, target, task, applyThis, applyArgs) => delegate.invokeTask(target, task, applyThis, applyArgs),
        onCancelTask: (delegate, _, target, task) => delegate.cancelTask(target, task),
    };
    class _ZoneDelegate {
        get zone() {
            return this._zone;
        }
        _zone;
        _taskCounts = {
            'microTask': 0,
            'macroTask': 0,
            'eventTask': 0,
        };
        _parentDelegate;
        _forkDlgt;
        _forkZS;
        _forkCurrZone;
        _interceptDlgt;
        _interceptZS;
        _interceptCurrZone;
        _invokeDlgt;
        _invokeZS;
        _invokeCurrZone;
        _handleErrorDlgt;
        _handleErrorZS;
        _handleErrorCurrZone;
        _scheduleTaskDlgt;
        _scheduleTaskZS;
        _scheduleTaskCurrZone;
        _invokeTaskDlgt;
        _invokeTaskZS;
        _invokeTaskCurrZone;
        _cancelTaskDlgt;
        _cancelTaskZS;
        _cancelTaskCurrZone;
        _hasTaskDlgt;
        _hasTaskDlgtOwner;
        _hasTaskZS;
        _hasTaskCurrZone;
        constructor(zone, parentDelegate, zoneSpec) {
            this._zone = zone;
            this._parentDelegate = parentDelegate;
            this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
            this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
            this._forkCurrZone =
                zoneSpec && (zoneSpec.onFork ? this._zone : parentDelegate._forkCurrZone);
            this._interceptZS =
                zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
            this._interceptDlgt =
                zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
            this._interceptCurrZone =
                zoneSpec && (zoneSpec.onIntercept ? this._zone : parentDelegate._interceptCurrZone);
            this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
            this._invokeDlgt =
                zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
            this._invokeCurrZone =
                zoneSpec && (zoneSpec.onInvoke ? this._zone : parentDelegate._invokeCurrZone);
            this._handleErrorZS =
                zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
            this._handleErrorDlgt =
                zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
            this._handleErrorCurrZone =
                zoneSpec && (zoneSpec.onHandleError ? this._zone : parentDelegate._handleErrorCurrZone);
            this._scheduleTaskZS =
                zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
            this._scheduleTaskDlgt =
                zoneSpec && (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
            this._scheduleTaskCurrZone =
                zoneSpec && (zoneSpec.onScheduleTask ? this._zone : parentDelegate._scheduleTaskCurrZone);
            this._invokeTaskZS =
                zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
            this._invokeTaskDlgt =
                zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
            this._invokeTaskCurrZone =
                zoneSpec && (zoneSpec.onInvokeTask ? this._zone : parentDelegate._invokeTaskCurrZone);
            this._cancelTaskZS =
                zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
            this._cancelTaskDlgt =
                zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
            this._cancelTaskCurrZone =
                zoneSpec && (zoneSpec.onCancelTask ? this._zone : parentDelegate._cancelTaskCurrZone);
            this._hasTaskZS = null;
            this._hasTaskDlgt = null;
            this._hasTaskDlgtOwner = null;
            this._hasTaskCurrZone = null;
            const zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
            const parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
            if (zoneSpecHasTask || parentHasTask) {
                // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
                // a case all task related interceptors must go through this ZD. We can't short circuit it.
                this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
                this._hasTaskDlgt = parentDelegate;
                this._hasTaskDlgtOwner = this;
                this._hasTaskCurrZone = this._zone;
                if (!zoneSpec.onScheduleTask) {
                    this._scheduleTaskZS = DELEGATE_ZS;
                    this._scheduleTaskDlgt = parentDelegate;
                    this._scheduleTaskCurrZone = this._zone;
                }
                if (!zoneSpec.onInvokeTask) {
                    this._invokeTaskZS = DELEGATE_ZS;
                    this._invokeTaskDlgt = parentDelegate;
                    this._invokeTaskCurrZone = this._zone;
                }
                if (!zoneSpec.onCancelTask) {
                    this._cancelTaskZS = DELEGATE_ZS;
                    this._cancelTaskDlgt = parentDelegate;
                    this._cancelTaskCurrZone = this._zone;
                }
            }
        }
        fork(targetZone, zoneSpec) {
            return this._forkZS
                ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec)
                : new ZoneImpl(targetZone, zoneSpec);
        }
        intercept(targetZone, callback, source) {
            return this._interceptZS
                ? this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source)
                : callback;
        }
        invoke(targetZone, callback, applyThis, applyArgs, source) {
            return this._invokeZS
                ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source)
                : callback.apply(applyThis, applyArgs);
        }
        handleError(targetZone, error) {
            return this._handleErrorZS
                ? this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error)
                : true;
        }
        scheduleTask(targetZone, task) {
            let returnTask = task;
            if (this._scheduleTaskZS) {
                if (this._hasTaskZS) {
                    returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
                }
                returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
                if (!returnTask)
                    returnTask = task;
            }
            else {
                if (task.scheduleFn) {
                    task.scheduleFn(task);
                }
                else if (task.type == microTask) {
                    scheduleMicroTask(task);
                }
                else {
                    throw new Error('Task is missing scheduleFn.');
                }
            }
            return returnTask;
        }
        invokeTask(targetZone, task, applyThis, applyArgs) {
            return this._invokeTaskZS
                ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs)
                : task.callback.apply(applyThis, applyArgs);
        }
        cancelTask(targetZone, task) {
            let value;
            if (this._cancelTaskZS) {
                value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
            }
            else {
                if (!task.cancelFn) {
                    throw Error('Task is not cancelable');
                }
                value = task.cancelFn(task);
            }
            return value;
        }
        hasTask(targetZone, isEmpty) {
            // hasTask should not throw error so other ZoneDelegate
            // can still trigger hasTask callback
            try {
                this._hasTaskZS &&
                    this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
            }
            catch (err) {
                this.handleError(targetZone, err);
            }
        }
        _updateTaskCount(type, count) {
            const counts = this._taskCounts;
            const prev = counts[type];
            const next = (counts[type] = prev + count);
            if (next < 0) {
                throw new Error('More tasks executed then were scheduled.');
            }
            if (prev == 0 || next == 0) {
                const isEmpty = {
                    microTask: counts['microTask'] > 0,
                    macroTask: counts['macroTask'] > 0,
                    eventTask: counts['eventTask'] > 0,
                    change: type,
                };
                this.hasTask(this._zone, isEmpty);
            }
        }
    }
    class ZoneTask {
        type;
        source;
        invoke;
        callback;
        data;
        scheduleFn;
        cancelFn;
        _zone = null;
        runCount = 0;
        _zoneDelegates = null;
        _state = 'notScheduled';
        constructor(type, source, callback, options, scheduleFn, cancelFn) {
            this.type = type;
            this.source = source;
            this.data = options;
            this.scheduleFn = scheduleFn;
            this.cancelFn = cancelFn;
            if (!callback) {
                throw new Error('callback is not defined');
            }
            this.callback = callback;
            const self = this;
            // TODO: @JiaLiPassion options should have interface
            if (type === eventTask && options && options.useG) {
                this.invoke = ZoneTask.invokeTask;
            }
            else {
                this.invoke = function () {
                    return ZoneTask.invokeTask.call(global, self, this, arguments);
                };
            }
        }
        static invokeTask(task, target, args) {
            if (!task) {
                task = this;
            }
            _numberOfNestedTaskFrames++;
            try {
                task.runCount++;
                return task.zone.runTask(task, target, args);
            }
            finally {
                if (_numberOfNestedTaskFrames == 1) {
                    drainMicroTaskQueue();
                }
                _numberOfNestedTaskFrames--;
            }
        }
        get zone() {
            return this._zone;
        }
        get state() {
            return this._state;
        }
        cancelScheduleRequest() {
            this._transitionTo(notScheduled, scheduling);
        }
        _transitionTo(toState, fromState1, fromState2) {
            if (this._state === fromState1 || this._state === fromState2) {
                this._state = toState;
                if (toState == notScheduled) {
                    this._zoneDelegates = null;
                }
            }
            else {
                throw new Error(`${this.type} '${this.source}': can not transition to '${toState}', expecting state '${fromState1}'${fromState2 ? " or '" + fromState2 + "'" : ''}, was '${this._state}'.`);
            }
        }
        toString() {
            if (this.data && typeof this.data.handleId !== 'undefined') {
                return this.data.handleId.toString();
            }
            else {
                return Object.prototype.toString.call(this);
            }
        }
        // add toJSON method to prevent cyclic error when
        // call JSON.stringify(zoneTask)
        toJSON() {
            return {
                type: this.type,
                state: this.state,
                source: this.source,
                zone: this.zone.name,
                runCount: this.runCount,
            };
        }
    }
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    ///  MICROTASK QUEUE
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    const symbolSetTimeout = __symbol__('setTimeout');
    const symbolPromise = __symbol__('Promise');
    const symbolThen = __symbol__('then');
    let _microTaskQueue = [];
    let _isDrainingMicrotaskQueue = false;
    let nativeMicroTaskQueuePromise;
    function nativeScheduleMicroTask(func) {
        if (!nativeMicroTaskQueuePromise) {
            if (global[symbolPromise]) {
                nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
            }
        }
        if (nativeMicroTaskQueuePromise) {
            let nativeThen = nativeMicroTaskQueuePromise[symbolThen];
            if (!nativeThen) {
                // native Promise is not patchable, we need to use `then` directly
                // issue 1078
                nativeThen = nativeMicroTaskQueuePromise['then'];
            }
            nativeThen.call(nativeMicroTaskQueuePromise, func);
        }
        else {
            global[symbolSetTimeout](func, 0);
        }
    }
    function scheduleMicroTask(task) {
        // if we are not running in any task, and there has not been anything scheduled
        // we must bootstrap the initial task creation by manually scheduling the drain
        if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
            // We are not running in Task, so we need to kickstart the microtask queue.
            nativeScheduleMicroTask(drainMicroTaskQueue);
        }
        task && _microTaskQueue.push(task);
    }
    function drainMicroTaskQueue() {
        if (!_isDrainingMicrotaskQueue) {
            _isDrainingMicrotaskQueue = true;
            while (_microTaskQueue.length) {
                const queue = _microTaskQueue;
                _microTaskQueue = [];
                for (let i = 0; i < queue.length; i++) {
                    const task = queue[i];
                    try {
                        task.zone.runTask(task, null, null);
                    }
                    catch (error) {
                        _api.onUnhandledError(error);
                    }
                }
            }
            _api.microtaskDrainDone();
            _isDrainingMicrotaskQueue = false;
        }
    }
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    ///  BOOTSTRAP
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    const NO_ZONE = { name: 'NO ZONE' };
    const notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
    const microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
    const patches = {};
    const _api = {
        symbol: __symbol__,
        currentZoneFrame: () => _currentZoneFrame,
        onUnhandledError: noop,
        microtaskDrainDone: noop,
        scheduleMicroTask: scheduleMicroTask,
        showUncaughtError: () => !ZoneImpl[__symbol__('ignoreConsoleErrorUncaughtError')],
        patchEventTarget: () => [],
        patchOnProperties: noop,
        patchMethod: () => noop,
        bindArguments: () => [],
        patchThen: () => noop,
        patchMacroTask: () => noop,
        patchEventPrototype: () => noop,
        isIEOrEdge: () => false,
        getGlobalObjects: () => undefined,
        ObjectDefineProperty: () => noop,
        ObjectGetOwnPropertyDescriptor: () => undefined,
        ObjectCreate: () => undefined,
        ArraySlice: () => [],
        patchClass: () => noop,
        wrapWithCurrentZone: () => noop,
        filterProperties: () => [],
        attachOriginToPatched: () => noop,
        _redefineProperty: () => noop,
        patchCallbacks: () => noop,
        nativeScheduleMicroTask: nativeScheduleMicroTask,
    };
    let _currentZoneFrame = { parent: null, zone: new ZoneImpl(null, null) };
    let _currentTask = null;
    let _numberOfNestedTaskFrames = 0;
    function noop() { }
    performanceMeasure('Zone', 'Zone');
    return ZoneImpl;
}

/**
 * Suppress closure compiler errors about unknown 'Zone' variable
 * @fileoverview
 * @suppress {undefinedVars,globalThis,missingRequire}
 */
/// <reference types="node"/>
// issue #989, to reduce bundle size, use short name
/** Object.getOwnPropertyDescriptor */
const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
/** Object.defineProperty */
const ObjectDefineProperty = Object.defineProperty;
/** Object.getPrototypeOf */
const ObjectGetPrototypeOf = Object.getPrototypeOf;
/** Object.create */
const ObjectCreate = Object.create;
/** Array.prototype.slice */
const ArraySlice = Array.prototype.slice;
/** addEventListener string const */
const ADD_EVENT_LISTENER_STR = 'addEventListener';
/** removeEventListener string const */
const REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
/** zoneSymbol addEventListener */
const ZONE_SYMBOL_ADD_EVENT_LISTENER = __symbol__(ADD_EVENT_LISTENER_STR);
/** zoneSymbol removeEventListener */
const ZONE_SYMBOL_REMOVE_EVENT_LISTENER = __symbol__(REMOVE_EVENT_LISTENER_STR);
/** true string const */
const TRUE_STR = 'true';
/** false string const */
const FALSE_STR = 'false';
/** Zone symbol prefix string const. */
const ZONE_SYMBOL_PREFIX = __symbol__('');
function wrapWithCurrentZone(callback, source) {
    return Zone.current.wrap(callback, source);
}
function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
    return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
}
const zoneSymbol = __symbol__;
const isWindowExists = typeof window !== 'undefined';
const internalWindow = isWindowExists ? window : undefined;
const _global = (isWindowExists && internalWindow) || globalThis;
const REMOVE_ATTRIBUTE = 'removeAttribute';
function bindArguments(args, source) {
    for (let i = args.length - 1; i >= 0; i--) {
        if (typeof args[i] === 'function') {
            args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
        }
    }
    return args;
}
function patchPrototype(prototype, fnNames) {
    const source = prototype.constructor['name'];
    for (let i = 0; i < fnNames.length; i++) {
        const name = fnNames[i];
        const delegate = prototype[name];
        if (delegate) {
            const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name);
            if (!isPropertyWritable(prototypeDesc)) {
                continue;
            }
            prototype[name] = ((delegate) => {
                const patched = function () {
                    return delegate.apply(this, bindArguments(arguments, source + '.' + name));
                };
                attachOriginToPatched(patched, delegate);
                return patched;
            })(delegate);
        }
    }
}
function isPropertyWritable(propertyDesc) {
    if (!propertyDesc) {
        return true;
    }
    if (propertyDesc.writable === false) {
        return false;
    }
    return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
}
const isWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
// this code.
const isNode = !('nw' in _global) &&
    typeof _global.process !== 'undefined' &&
    _global.process.toString() === '[object process]';
const isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
// we are in electron of nw, so we are both browser and nodejs
// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
// this code.
const isMix = typeof _global.process !== 'undefined' &&
    _global.process.toString() === '[object process]' &&
    !isWebWorker &&
    !!(isWindowExists && internalWindow['HTMLElement']);
const zoneSymbolEventNames$1 = {};
const enableBeforeunloadSymbol = zoneSymbol('enable_beforeunload');
const wrapFn = function (event) {
    // https://github.com/angular/zone.js/issues/911, in IE, sometimes
    // event will be undefined, so we need to use window.event
    event = event || _global.event;
    if (!event) {
        return;
    }
    let eventNameSymbol = zoneSymbolEventNames$1[event.type];
    if (!eventNameSymbol) {
        eventNameSymbol = zoneSymbolEventNames$1[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
    }
    const target = this || event.target || _global;
    const listener = target[eventNameSymbol];
    let result;
    if (isBrowser && target === internalWindow && event.type === 'error') {
        // window.onerror have different signature
        // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
        // and onerror callback will prevent default when callback return true
        const errorEvent = event;
        result =
            listener &&
                listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
        if (result === true) {
            event.preventDefault();
        }
    }
    else {
        result = listener && listener.apply(this, arguments);
        if (
        // https://github.com/angular/angular/issues/47579
        // https://www.w3.org/TR/2011/WD-html5-20110525/history.html#beforeunloadevent
        // This is the only specific case we should check for. The spec defines that the
        // `returnValue` attribute represents the message to show the user. When the event
        // is created, this attribute must be set to the empty string.
        event.type === 'beforeunload' &&
            // To prevent any breaking changes resulting from this change, given that
            // it was already causing a significant number of failures in G3, we have hidden
            // that behavior behind a global configuration flag. Consumers can enable this
            // flag explicitly if they want the `beforeunload` event to be handled as defined
            // in the specification.
            _global[enableBeforeunloadSymbol] &&
            // The IDL event definition is `attribute DOMString returnValue`, so we check whether
            // `typeof result` is a string.
            typeof result === 'string') {
            event.returnValue = result;
        }
        else if (result != undefined && !result) {
            event.preventDefault();
        }
    }
    return result;
};
function patchProperty(obj, prop, prototype) {
    let desc = ObjectGetOwnPropertyDescriptor(obj, prop);
    if (!desc && prototype) {
        // when patch window object, use prototype to check prop exist or not
        const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
        if (prototypeDesc) {
            desc = { enumerable: true, configurable: true };
        }
    }
    // if the descriptor not exists or is not configurable
    // just return
    if (!desc || !desc.configurable) {
        return;
    }
    const onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
    if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
        return;
    }
    // A property descriptor cannot have getter/setter and be writable
    // deleting the writable and value properties avoids this error:
    //
    // TypeError: property descriptors must not specify a value or be writable when a
    // getter or setter has been specified
    delete desc.writable;
    delete desc.value;
    const originalDescGet = desc.get;
    const originalDescSet = desc.set;
    // slice(2) cuz 'onclick' -> 'click', etc
    const eventName = prop.slice(2);
    let eventNameSymbol = zoneSymbolEventNames$1[eventName];
    if (!eventNameSymbol) {
        eventNameSymbol = zoneSymbolEventNames$1[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
    }
    desc.set = function (newValue) {
        // In some versions of Windows, the `this` context may be undefined
        // in on-property callbacks.
        // To handle this edge case, we check if `this` is falsy and
        // fallback to `_global` if needed.
        let target = this;
        if (!target && obj === _global) {
            target = _global;
        }
        if (!target) {
            return;
        }
        const previousValue = target[eventNameSymbol];
        if (typeof previousValue === 'function') {
            target.removeEventListener(eventName, wrapFn);
        }
        // https://github.com/angular/zone.js/issues/978
        // If an inline handler (like `onload`) was defined before zone.js was loaded,
        // call the original descriptor's setter to clean it up.
        originalDescSet?.call(target, null);
        target[eventNameSymbol] = newValue;
        if (typeof newValue === 'function') {
            target.addEventListener(eventName, wrapFn, false);
        }
    };
    // The getter would return undefined for unassigned properties but the default value of an
    // unassigned property is null
    desc.get = function () {
        // in some of windows's onproperty callback, this is undefined
        // so we need to check it
        let target = this;
        if (!target && obj === _global) {
            target = _global;
        }
        if (!target) {
            return null;
        }
        const listener = target[eventNameSymbol];
        if (listener) {
            return listener;
        }
        else if (originalDescGet) {
            // result will be null when use inline event attribute,
            // such as <button onclick="func();">OK</button>
            // because the onclick function is internal raw uncompiled handler
            // the onclick will be evaluated when first time event was triggered or
            // the property is accessed, https://github.com/angular/zone.js/issues/525
            // so we should use original native get to retrieve the handler
            let value = originalDescGet.call(this);
            if (value) {
                desc.set.call(this, value);
                if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
                    target.removeAttribute(prop);
                }
                return value;
            }
        }
        return null;
    };
    ObjectDefineProperty(obj, prop, desc);
    obj[onPropPatchedSymbol] = true;
}
function patchOnProperties(obj, properties, prototype) {
    if (properties) {
        for (let i = 0; i < properties.length; i++) {
            patchProperty(obj, 'on' + properties[i], prototype);
        }
    }
    else {
        const onProperties = [];
        for (const prop in obj) {
            if (prop.slice(0, 2) == 'on') {
                onProperties.push(prop);
            }
        }
        for (let j = 0; j < onProperties.length; j++) {
            patchProperty(obj, onProperties[j], prototype);
        }
    }
}
const originalInstanceKey = zoneSymbol('originalInstance');
// wrap some native API on `window`
function patchClass(className) {
    const OriginalClass = _global[className];
    if (!OriginalClass)
        return;
    // keep original class in global
    _global[zoneSymbol(className)] = OriginalClass;
    _global[className] = function () {
        const a = bindArguments(arguments, className);
        switch (a.length) {
            case 0:
                this[originalInstanceKey] = new OriginalClass();
                break;
            case 1:
                this[originalInstanceKey] = new OriginalClass(a[0]);
                break;
            case 2:
                this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
                break;
            case 3:
                this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
                break;
            case 4:
                this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
                break;
            default:
                throw new Error('Arg list too long.');
        }
    };
    // attach original delegate to patched function
    attachOriginToPatched(_global[className], OriginalClass);
    const instance = new OriginalClass(function () { });
    let prop;
    for (prop in instance) {
        // https://bugs.webkit.org/show_bug.cgi?id=44721
        if (className === 'XMLHttpRequest' && prop === 'responseBlob')
            continue;
        (function (prop) {
            if (typeof instance[prop] === 'function') {
                _global[className].prototype[prop] = function () {
                    return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
                };
            }
            else {
                ObjectDefineProperty(_global[className].prototype, prop, {
                    set: function (fn) {
                        if (typeof fn === 'function') {
                            this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
                            // keep callback in wrapped function so we can
                            // use it in Function.prototype.toString to return
                            // the native one.
                            attachOriginToPatched(this[originalInstanceKey][prop], fn);
                        }
                        else {
                            this[originalInstanceKey][prop] = fn;
                        }
                    },
                    get: function () {
                        return this[originalInstanceKey][prop];
                    },
                });
            }
        })(prop);
    }
    for (prop in OriginalClass) {
        if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
            _global[className][prop] = OriginalClass[prop];
        }
    }
}
function copySymbolProperties(src, dest) {
    if (typeof Object.getOwnPropertySymbols !== 'function') {
        return;
    }
    const symbols = Object.getOwnPropertySymbols(src);
    symbols.forEach((symbol) => {
        const desc = Object.getOwnPropertyDescriptor(src, symbol);
        Object.defineProperty(dest, symbol, {
            get: function () {
                return src[symbol];
            },
            set: function (value) {
                if (desc && (!desc.writable || typeof desc.set !== 'function')) {
                    // if src[symbol] is not writable or not have a setter, just return
                    return;
                }
                src[symbol] = value;
            },
            enumerable: desc ? desc.enumerable : true,
            configurable: desc ? desc.configurable : true,
        });
    });
}
let shouldCopySymbolProperties = false;
function setShouldCopySymbolProperties(flag) {
    shouldCopySymbolProperties = flag;
}
function patchMethod(target, name, patchFn) {
    let proto = target;
    while (proto && !proto.hasOwnProperty(name)) {
        proto = ObjectGetPrototypeOf(proto);
    }
    if (!proto && target[name]) {
        // somehow we did not find it, but we can see it. This happens on IE for Window properties.
        proto = target;
    }
    const delegateName = zoneSymbol(name);
    let delegate = null;
    if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
        delegate = proto[delegateName] = proto[name];
        // check whether proto[name] is writable
        // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
        const desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
        if (isPropertyWritable(desc)) {
            const patchDelegate = patchFn(delegate, delegateName, name);
            proto[name] = function () {
                return patchDelegate(this, arguments);
            };
            attachOriginToPatched(proto[name], delegate);
            if (shouldCopySymbolProperties) {
                copySymbolProperties(delegate, proto[name]);
            }
        }
    }
    return delegate;
}
// TODO: @JiaLiPassion, support cancel task later if necessary
function patchMacroTask(obj, funcName, metaCreator) {
    let setNative = null;
    function scheduleTask(task) {
        const data = task.data;
        data.args[data.cbIdx] = function () {
            task.invoke.apply(this, arguments);
        };
        setNative.apply(data.target, data.args);
        return task;
    }
    setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {
        const meta = metaCreator(self, args);
        if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
            return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
        }
        else {
            // cause an error by calling it directly.
            return delegate.apply(self, args);
        }
    });
}
function patchMicroTask(obj, funcName, metaCreator) {
    let setNative = null;
    function scheduleTask(task) {
        const data = task.data;
        data.args[data.cbIdx] = function () {
            task.invoke.apply(this, arguments);
        };
        setNative.apply(data.target, data.args);
        return task;
    }
    setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {
        const meta = metaCreator(self, args);
        if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
            return Zone.current.scheduleMicroTask(meta.name, args[meta.cbIdx], meta, scheduleTask);
        }
        else {
            // cause an error by calling it directly.
            return delegate.apply(self, args);
        }
    });
}
function attachOriginToPatched(patched, original) {
    patched[zoneSymbol('OriginalDelegate')] = original;
}
let isDetectedIEOrEdge = false;
let ieOrEdge = false;
function isIEOrEdge() {
    if (isDetectedIEOrEdge) {
        return ieOrEdge;
    }
    isDetectedIEOrEdge = true;
    try {
        const ua = internalWindow.navigator.userAgent;
        if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
            ieOrEdge = true;
        }
    }
    catch (error) { }
    return ieOrEdge;
}
function isFunction(value) {
    return typeof value === 'function';
}
function isNumber(value) {
    return typeof value === 'number';
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
// an identifier to tell ZoneTask do not create a new invoke closure
const OPTIMIZED_ZONE_EVENT_TASK_DATA = {
    useG: true,
};
const zoneSymbolEventNames = {};
const globalSources = {};
const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
function prepareEventNames(eventName, eventNameToString) {
    const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
    const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
    const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
    const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
    zoneSymbolEventNames[eventName] = {};
    zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
    zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
}
function patchEventTarget(_global, api, apis, patchOptions) {
    const ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
    const REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
    const LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
    const REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
    const zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
    const ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
    const PREPEND_EVENT_LISTENER = 'prependListener';
    const PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
    const invokeTask = function (task, target, event) {
        // for better performance, check isRemoved which is set
        // by removeEventListener
        if (task.isRemoved) {
            return;
        }
        const delegate = task.callback;
        if (typeof delegate === 'object' && delegate.handleEvent) {
            // create the bind version of handleEvent when invoke
            task.callback = (event) => delegate.handleEvent(event);
            task.originalDelegate = delegate;
        }
        // invoke static task.invoke
        // need to try/catch error here, otherwise, the error in one event listener
        // will break the executions of the other event listeners. Also error will
        // not remove the event listener when `once` options is true.
        let error;
        try {
            task.invoke(task, target, [event]);
        }
        catch (err) {
            error = err;
        }
        const options = task.options;
        if (options && typeof options === 'object' && options.once) {
            // if options.once is true, after invoke once remove listener here
            // only browser need to do this, nodejs eventEmitter will cal removeListener
            // inside EventEmitter.once
            const delegate = task.originalDelegate ? task.originalDelegate : task.callback;
            target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate, options);
        }
        return error;
    };
    function globalCallback(context, event, isCapture) {
        // https://github.com/angular/zone.js/issues/911, in IE, sometimes
        // event will be undefined, so we need to use window.event
        event = event || _global.event;
        if (!event) {
            return;
        }
        // event.target is needed for Samsung TV and SourceBuffer
        // || global is needed https://github.com/angular/zone.js/issues/190
        const target = context || event.target || _global;
        const tasks = target[zoneSymbolEventNames[event.type][isCapture ? TRUE_STR : FALSE_STR]];
        if (tasks) {
            const errors = [];
            // invoke all tasks which attached to current target with given event.type and capture = false
            // for performance concern, if task.length === 1, just invoke
            if (tasks.length === 1) {
                const err = invokeTask(tasks[0], target, event);
                err && errors.push(err);
            }
            else {
                // https://github.com/angular/zone.js/issues/836
                // copy the tasks array before invoke, to avoid
                // the callback will remove itself or other listener
                const copyTasks = tasks.slice();
                for (let i = 0; i < copyTasks.length; i++) {
                    if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
                        break;
                    }
                    const err = invokeTask(copyTasks[i], target, event);
                    err && errors.push(err);
                }
            }
            // Since there is only one error, we don't need to schedule microTask
            // to throw the error.
            if (errors.length === 1) {
                throw errors[0];
            }
            else {
                for (let i = 0; i < errors.length; i++) {
                    const err = errors[i];
                    api.nativeScheduleMicroTask(() => {
                        throw err;
                    });
                }
            }
        }
    }
    // global shared zoneAwareCallback to handle all event callback with capture = false
    const globalZoneAwareCallback = function (event) {
        return globalCallback(this, event, false);
    };
    // global shared zoneAwareCallback to handle all event callback with capture = true
    const globalZoneAwareCaptureCallback = function (event) {
        return globalCallback(this, event, true);
    };
    function patchEventTargetMethods(obj, patchOptions) {
        if (!obj) {
            return false;
        }
        let useGlobalCallback = true;
        if (patchOptions && patchOptions.useG !== undefined) {
            useGlobalCallback = patchOptions.useG;
        }
        const validateHandler = patchOptions && patchOptions.vh;
        let checkDuplicate = true;
        if (patchOptions && patchOptions.chkDup !== undefined) {
            checkDuplicate = patchOptions.chkDup;
        }
        let returnTarget = false;
        if (patchOptions && patchOptions.rt !== undefined) {
            returnTarget = patchOptions.rt;
        }
        let proto = obj;
        while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
            proto = ObjectGetPrototypeOf(proto);
        }
        if (!proto && obj[ADD_EVENT_LISTENER]) {
            // somehow we did not find it, but we can see it. This happens on IE for Window properties.
            proto = obj;
        }
        if (!proto) {
            return false;
        }
        if (proto[zoneSymbolAddEventListener]) {
            return false;
        }
        const eventNameToString = patchOptions && patchOptions.eventNameToString;
        // We use a shared global `taskData` to pass data for `scheduleEventTask`,
        // eliminating the need to create a new object solely for passing data.
        // WARNING: This object has a static lifetime, meaning it is not created
        // each time `addEventListener` is called. It is instantiated only once
        // and captured by reference inside the `addEventListener` and
        // `removeEventListener` functions. Do not add any new properties to this
        // object, as doing so would necessitate maintaining the information
        // between `addEventListener` calls.
        const taskData = {};
        const nativeAddEventListener = (proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER]);
        const nativeRemoveEventListener = (proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
            proto[REMOVE_EVENT_LISTENER]);
        const nativeListeners = (proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
            proto[LISTENERS_EVENT_LISTENER]);
        const nativeRemoveAllListeners = (proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
            proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER]);
        let nativePrependEventListener;
        if (patchOptions && patchOptions.prepend) {
            nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
                proto[patchOptions.prepend];
        }
        /**
         * This util function will build an option object with passive option
         * to handle all possible input from the user.
         */
        function buildEventListenerOptions(options, passive) {
            if (!passive) {
                return options;
            }
            if (typeof options === 'boolean') {
                return { capture: options, passive: true };
            }
            if (!options) {
                return { passive: true };
            }
            if (typeof options === 'object' && options.passive !== false) {
                return { ...options, passive: true };
            }
            return options;
        }
        const customScheduleGlobal = function (task) {
            // if there is already a task for the eventName + capture,
            // just return, because we use the shared globalZoneAwareCallback here.
            if (taskData.isExisting) {
                return;
            }
            return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
        };
        /**
         * In the context of events and listeners, this function will be
         * called at the end by `cancelTask`, which, in turn, calls `task.cancelFn`.
         * Cancelling a task is primarily used to remove event listeners from
         * the task target.
         */
        const customCancelGlobal = function (task) {
            // if task is not marked as isRemoved, this call is directly
            // from Zone.prototype.cancelTask, we should remove the task
            // from tasksList of target first
            if (!task.isRemoved) {
                const symbolEventNames = zoneSymbolEventNames[task.eventName];
                let symbolEventName;
                if (symbolEventNames) {
                    symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
                }
                const existingTasks = symbolEventName && task.target[symbolEventName];
                if (existingTasks) {
                    for (let i = 0; i < existingTasks.length; i++) {
                        const existingTask = existingTasks[i];
                        if (existingTask === task) {
                            existingTasks.splice(i, 1);
                            // set isRemoved to data for faster invokeTask check
                            task.isRemoved = true;
                            if (task.removeAbortListener) {
                                task.removeAbortListener();
                                task.removeAbortListener = null;
                            }
                            if (existingTasks.length === 0) {
                                // all tasks for the eventName + capture have gone,
                                // remove globalZoneAwareCallback and remove the task cache from target
                                task.allRemoved = true;
                                task.target[symbolEventName] = null;
                            }
                            break;
                        }
                    }
                }
            }
            // if all tasks for the eventName + capture have gone,
            // we will really remove the global event callback,
            // if not, return
            if (!task.allRemoved) {
                return;
            }
            return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
        };
        const customScheduleNonGlobal = function (task) {
            return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
        };
        const customSchedulePrepend = function (task) {
            return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
        };
        const customCancelNonGlobal = function (task) {
            return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
        };
        const customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
        const customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
        const compareTaskCallbackVsDelegate = function (task, delegate) {
            const typeOfDelegate = typeof delegate;
            return ((typeOfDelegate === 'function' && task.callback === delegate) ||
                (typeOfDelegate === 'object' && task.originalDelegate === delegate));
        };
        const compare = patchOptions?.diff || compareTaskCallbackVsDelegate;
        const unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];
        const passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];
        function copyEventListenerOptions(options) {
            if (typeof options === 'object' && options !== null) {
                // We need to destructure the target `options` object since it may
                // be frozen or sealed (possibly provided implicitly by a third-party
                // library), or its properties may be readonly.
                const newOptions = { ...options };
                // The `signal` option was recently introduced, which caused regressions in
                // third-party scenarios where `AbortController` was directly provided to
                // `addEventListener` as options. For instance, in cases like
                // `document.addEventListener('keydown', callback, abortControllerInstance)`,
                // which is valid because `AbortController` includes a `signal` getter, spreading
                // `{...options}` wouldn't copy the `signal`. Additionally, using `Object.create`
                // isn't feasible since `AbortController` is a built-in object type, and attempting
                // to create a new object directly with it as the prototype might result in
                // unexpected behavior.
                if (options.signal) {
                    newOptions.signal = options.signal;
                }
                return newOptions;
            }
            return options;
        }
        const makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget = false, prepend = false) {
            return function () {
                const target = this || _global;
                let eventName = arguments[0];
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                let delegate = arguments[1];
                if (!delegate) {
                    return nativeListener.apply(this, arguments);
                }
                if (isNode && eventName === 'uncaughtException') {
                    // don't patch uncaughtException of nodejs to prevent endless loop
                    return nativeListener.apply(this, arguments);
                }
                // To improve `addEventListener` performance, we will create the callback
                // for the task later when the task is invoked.
                let isEventListenerObject = false;
                if (typeof delegate !== 'function') {
                    // This checks whether the provided listener argument is an object with
                    // a `handleEvent` method (since we can call `addEventListener` with a
                    // function `event => ...` or with an object `{ handleEvent: event => ... }`).
                    if (!delegate.handleEvent) {
                        return nativeListener.apply(this, arguments);
                    }
                    isEventListenerObject = true;
                }
                if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
                    return;
                }
                const passive = !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
                const options = copyEventListenerOptions(buildEventListenerOptions(arguments[2], passive));
                const signal = options?.signal;
                if (signal?.aborted) {
                    // the signal is an aborted one, just return without attaching the event listener.
                    return;
                }
                if (unpatchedEvents) {
                    // check unpatched list
                    for (let i = 0; i < unpatchedEvents.length; i++) {
                        if (eventName === unpatchedEvents[i]) {
                            if (passive) {
                                return nativeListener.call(target, eventName, delegate, options);
                            }
                            else {
                                return nativeListener.apply(this, arguments);
                            }
                        }
                    }
                }
                const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
                const once = options && typeof options === 'object' ? options.once : false;
                const zone = Zone.current;
                let symbolEventNames = zoneSymbolEventNames[eventName];
                if (!symbolEventNames) {
                    prepareEventNames(eventName, eventNameToString);
                    symbolEventNames = zoneSymbolEventNames[eventName];
                }
                const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
                let existingTasks = target[symbolEventName];
                let isExisting = false;
                if (existingTasks) {
                    // already have task registered
                    isExisting = true;
                    if (checkDuplicate) {
                        for (let i = 0; i < existingTasks.length; i++) {
                            if (compare(existingTasks[i], delegate)) {
                                // same callback, same capture, same event name, just return
                                return;
                            }
                        }
                    }
                }
                else {
                    existingTasks = target[symbolEventName] = [];
                }
                let source;
                const constructorName = target.constructor['name'];
                const targetSource = globalSources[constructorName];
                if (targetSource) {
                    source = targetSource[eventName];
                }
                if (!source) {
                    source =
                        constructorName +
                            addSource +
                            (eventNameToString ? eventNameToString(eventNam   e) : eventName);
                }
                // In the code below, `options` should no longer be reassigned; instead, it
                // should only be mutated. This is because we pass that object to the native
                // `addEventListener`.
                // It's generally recommended to use the same object reference for options.
                // This ensures consistency and avoids potential issues.
                taskData.options = options;
                if (once) {
                    // When using `addEventListener` with the `once` option, we don't pass
                    // the `once` option directly to the native `addEventListener` method.
                    // Instead, we keep the `once` setting and handle it ourselves.
                    taskData.options.once = false;
                }
                taskData.target = target;
                taskData.capture = capture;
                taskData.eventName = eventName;
                taskData.isExisting = isExisting;
                const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
                // keep taskData into data to allow onScheduleEventTask to access the task information
                if (data) {
                    data.taskData = taskData;
                }
                if (signal) {
                    // When using `addEventListener` with the `signal` option, we don't pass
                    // the `signal` option directly to the native `addEventListener` method.
                    // Instead, we keep the `signal` setting and handle it ourselves.
                    taskData.options.signal = undefined;
                }
                // The `scheduleEventTask` function will ultimately call `customScheduleGlobal`,
                // which in turn calls the native `addEventListener`. This is why `taskData.options`
                // is updated before scheduling the task, as `customScheduleGlobal` uses
                // `taskData.options` to pass it to the native `addEventListener`.
                const task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
                if (signal) {
                    // after task is scheduled, we need to store the signal back to task.options
                    taskData.options.signal = signal;
                    // Wrapping `task` in a weak reference would not prevent memory leaks. Weak references are
                    // primarily used for preventing strong references cycles. `onAbort` is always reachable
                    // as it's an event listener, so its closure retains a strong reference to the `task`.
                    const onAbort = () => task.zone.cancelTask(task);
                    nativeListener.call(signal, 'abort', onAbort, { once: true });
                    // We need to remove the `abort` listener when the event listener is going to be removed,
                    // as it creates a closure that captures `task`. This closure retains a reference to the
                    // `task` object even after it goes out of scope, preventing `task` from being garbage
                    // collected.
                    task.removeAbortListener = () => signal.removeEventListener('abort', onAbort);
                }
                // should clear taskData.target to avoid memory leak
                // issue, https://github.com/angular/angular/issues/20442
                taskData.target = null;
                // need to clear up taskData because it is a global object
                if (data) {
                    data.taskData = null;
                }
                // have to save those information to task in case
                // application may call task.zone.cancelTask() directly
                if (once) {
                    taskData.options.once = true;
                }
                if (typeof task.options !== 'boolean') {
                    // We should save the options on the task (if it's an object) because
                    // we'll be using `task.options` later when removing the event listener
                    // and passing it back to `removeEventListener`.
                    task.options = options;
                }
                task.target = target;
                task.capture = capture;
                task.eventName = eventName;
                if (isEventListenerObject) {
                    // save original delegate for compare to check duplicate
                    task.originalDelegate = delegate;
                }
                if (!prepend) {
                    existingTasks.push(task);
                }
                else {
                    existingTasks.unshift(task);
                }
                if (returnTarget) {
                    return target;
                }
            };
        };
        proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
        if (nativePrependEventListener) {
            proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
        }
        proto[REMOVE_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (patchOptions && patchOptions.transferEventName) {
                eventName = patchOptions.transferEventName(eventName);
            }
            const options = arguments[2];
            const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
            const delegate = arguments[1];
            if (!delegate) {
                return nativeRemoveEventListener.apply(this, arguments);
            }
            if (validateHandler &&
                !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
                return;
            }
            const symbolEventNames = zoneSymbolEventNames[eventName];
            let symbolEventName;
            if (symbolEventNames) {
                symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
            }
            const existingTasks = symbolEventName && target[symbolEventName];
            // `existingTasks` may not exist if the `addEventListener` was called before
            // it was patched by zone.js. Please refer to the attached issue for
            // clarification, particularly after the `if` condition, before calling
            // the native `removeEventListener`.
            if (existingTasks) {
                for (let i = 0; i < existingTasks.length; i++) {
                    const existingTask = existingTasks[i];
                    if (compare(existingTask, delegate)) {
                        existingTasks.splice(i, 1);
                        // set isRemoved to data for faster invokeTask check
                        existingTask.isRemoved = true;
                        if (existingTasks.length === 0) {
                            // all tasks for the eventName + capture have gone,
                            // remove globalZoneAwareCallback and remove the task cache from target
                            existingTask.allRemoved = true;
                            target[symbolEventName] = null;
                            // in the target, we have an event listener which is added by on_property
                            // such as target.onclick = function() {}, so we need to clear this internal
                            // property too if all delegates with capture=false were removed
                            // https:// github.com/angular/angular/issues/31643
                            // https://github.com/angular/angular/issues/54581
                            if (!capture && typeof eventName === 'string') {
                                const onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;
                                target[onPropertySymbol] = null;
                            }
                        }
                        // In all other conditions, when `addEventListener` is called after being
                        // patched by zone.js, we would always find an event task on the `EventTarget`.
                        // This will trigger `cancelFn` on the `existingTask`, leading to `customCancelGlobal`,
                        // which ultimately removes an event listener and cleans up the abort listener
                        // (if an `AbortSignal` was provided when scheduling a task).
                        existingTask.zone.cancelTask(existingTask);
                        if (returnTarget) {
                            return target;
                        }
                        return;
                    }
                }
            }
            // https://github.com/angular/zone.js/issues/930
            // We may encounter a situation where the `addEventListener` was
            // called on the event target before zone.js is loaded, resulting
            // in no task being stored on the event target due to its invocation
            // of the native implementation. In this scenario, we simply need to
            // invoke the native `removeEventListener`.
            return nativeRemoveEventListener.apply(this, arguments);
        };
        proto[LISTENERS_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (patchOptions && patchOptions.transferEventName) {
                eventName = patchOptions.transferEventName(eventName);
            }
            const listeners = [];
            const tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
            for (let i = 0; i < tasks.length; i++) {
                const task = tasks[i];
                let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                listeners.push(delegate);
            }
            return listeners;
        };
        proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (!eventName) {
                const keys = Object.keys(target);
                for (let i = 0; i < keys.length; i++) {
                    const prop = keys[i];
                    const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
                    let evtName = match && match[1];
                    // in nodejs EventEmitter, removeListener event is
                    // used for monitoring the removeListener call,
                    // so just keep removeListener eventListener until
                    // all other eventListeners are removed
                    if (evtName && evtName !== 'removeListener') {
                        this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
                    }
                }
                // remove removeListener listener finally
                this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
            }
            else {
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                const symbolEventNames = zoneSymbolEventNames[eventName];
                if (symbolEventNames) {
                    const symbolEventName = symbolEventNames[FALSE_STR];
                    const symbolCaptureEventName = symbolEventNames[TRUE_STR];
                    const tasks = target[symbolEventName];
                    const captureTasks = target[symbolCaptureEventName];
                    if (tasks) {
                        const removeTasks = tasks.slice();
                        for (let i = 0; i < removeTasks.length; i++) {
                            const task = removeTasks[i];
                            let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                            this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                        }
                    }
                    if (captureTasks) {
                        const removeTasks = captureTasks.slice();
                        for (let i = 0; i < removeTasks.length; i++) {
                            const task = removeTasks[i];
                            let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                            this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                        }
                    }
                }
            }
            if (returnTarget) {
                return this;
            }
        };
        // for native toString patch
        attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
        attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
        if (nativeRemoveAllListeners) {
            attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
        }
        if (nativeListeners) {
            attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
        }
        return true;
    }
    let results = [];
    for (let i = 0; i < apis.length; i++) {
        results[i] = patchEventTargetMethods(apis[i], patchOptions);
    }
    return results;
}
function findEventTasks(target, eventName) {
    if (!eventName) {
        const foundTasks = [];
        for (let prop in target) {
            const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
            let evtName = match && match[1];
            if (evtName && (!eventName || evtName === eventName)) {
                const tasks = target[prop];
                if (tasks) {
                    for (let i = 0; i < tasks.length; i++) {
                        foundTasks.push(tasks[i]);
                    }
                }
            }
        }
        return foundTasks;
    }
    let symbolEventName = zoneSymbolEventNames[eventName];
    if (!symbolEventName) {
        prepareEventNames(eventName);
        symbolEventName = zoneSymbolEventNames[eventName];
    }
    const captureFalseTasks = target[symbolEventName[FALSE_STR]];
    const captureTrueTasks = target[symbolEventName[TRUE_STR]];
    if (!captureFalseTasks) {
        return captureTrueTasks ? captureTrueTasks.slice() : [];
    }
    else {
        return captureTrueTasks
            ? captureFalseTasks.concat(captureTrueTasks)
            : captureFalseTasks.slice();
    }
}
function patchEventPrototype(global, api) {
    const Event = global['Event'];
    if (Event && Event.prototype) {
        api.patchMethod(Event.prototype, 'stopImmediatePropagation', (delegate) => function (self, args) {
            self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
            // we need to call the native stopImmediatePropagation
            // in case in some hybrid application, some part of
            // application will be controlled by zone, some are not
            delegate && delegate.apply(self, args);
        });
    }
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
function patchQueueMicrotask(global, api) {
    api.patchMethod(global, 'queueMicrotask', (delegate) => {
        return function (self, args) {
            Zone.current.scheduleMicroTask('queueMicrotask', args[0]);
        };
    });
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
const taskSymbol = zoneSymbol('zoneTask');
function patchTimer(window, setName, cancelName, nameSuffix) {
    let setNative = null;
    let clearNative = null;
    setName += nameSuffix;
    cancelName += nameSuffix;
    const tasksByHandleId = {};
    function scheduleTask(task) {
        const data = task.data;
        data.args[0] = function () {
            return task.invoke.apply(this, arguments);
        };
        const handleOrId = setNative.apply(window, data.args);
        // Whlist on Node.js when get can the ID by using `[Symbol.toPrimitive]()` we do
        // to this so that we do not cause potentally leaks when using `setTimeout`
        // since this can be periodic when using `.refresh`.
        if (isNumber(handleOrId)) {
            data.handleId = handleOrId;
        }
        else {
            data.handle = handleOrId;
            // On Node.js a timeout and interval can be restarted over and over again by using the `.refresh` method.
            data.isRefreshable = isFunction(handleOrId.refresh);
        }
        return task;
    }
    function clearTask(task) {
        const { handle, handleId } = task.data;
        return clearNative.call(window, handle ?? handleId);
    }
    setNative = patchMethod(window, setName, (delegate) => function (self, args) {
        if (isFunction(args[0])) {
            const options = {
                isRefreshable: false,
                isPeriodic: nameSuffix === 'Interval',
                delay: nameSuffix === 'Timeout' || nameSuffix === 'Interval' ? args[1] || 0 : undefined,
                args: args,
            };
            const callback = args[0];
            args[0] = function timer() {
                try {
                    return callback.apply(this, arguments);
                }
                finally {
                    // issue-934, task will be cancelled
                    // even it is a periodic task such as
                    // setInterval
                    // https://github.com/angular/angular/issues/40387
                    // Cleanup tasksByHandleId should be handled before scheduleTask
                    // Since some zoneSpec may intercept and doesn't trigger
                    // scheduleFn(scheduleTask) provided here.
                    const { handle, handleId, isPeriodic, isRefreshable } = options;
                    if (!isPeriodic && !isRefreshable) {
                        if (handleId) {
                            // in non-nodejs env, we remove timerId
                            // from local cache
                            delete tasksByHandleId[handleId];
                        }
                        else if (handle) {
                            // Node returns complex objects as handleIds
                            // we remove task reference from timer object
                            handle[taskSymbol] = null;
                        }
                    }
                }
            };
            const task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
            if (!task) {
                return task;
            }
            // Node.js must additionally support the ref and unref functions.
            const { handleId, handle, isRefreshable, isPeriodic } = task.data;
            if (handleId) {
                // for non nodejs env, we save handleId: task
                // mapping in local cache for clearTimeout
                tasksByHandleId[handleId] = task;
            }
            else if (handle) {
                // for nodejs env, we save task
                // reference in timerId Object for clearTimeout
                handle[taskSymbol] = task;
                if (isRefreshable && !isPeriodic) {
                    const originalRefresh = handle.refresh;
                    handle.refresh = function () {
                        const { zone, state } = task;
                        if (state === 'notScheduled') {
                            task._state = 'scheduled';
                            zone._updateTaskCount(task, 1);
                        }
                        else if (state === 'running') {
                            task._state = 'scheduling';
                        }
                        return originalRefresh.call(this);
                    };
                }
            }
            return handle ?? handleId ?? task;
        }
        else {
            // cause an error by calling it directly.
            return delegate.apply(window, args);
        }
    });
    clearNative = patchMethod(window, cancelName, (delegate) => function (self, args) {
        const id = args[0];
        let task;
        if (isNumber(id)) {
            // non nodejs env.
            task = tasksByHandleId[id];
            delete tasksByHandleId[id];
        }
        else {
            // nodejs env ?? other environments.
            task = id?.[taskSymbol];
            if (task) {
                id[taskSymbol] = null;
            }
            else {
                task = id;
            }
        }
        if (task?.type) {
            if (task.cancelFn) {
                // Do not cancel already canceled functions
                task.zone.cancelTask(task);
            }
        }
        else {
            // cause an error by calling it directly.
            delegate.apply(window, args);
        }
    });
}

function patchCustomElements(_global, api) {
    const { isBrowser, isMix } = api.getGlobalObjects();
    if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) {
        return;
    }
    // https://html.spec.whatwg.org/multipage/custom-elements.html#concept-custom-element-definition-lifecycle-callbacks
    const callbacks = [
        'connectedCallback',
        'disconnectedCallback',
        'adoptedCallback',
        'attributeChangedCallback',
        'formAssociatedCallback',
        'formDisabledCallback',
        'formResetCallback',
        'formStateRestoreCallback',
    ];
    api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
}

function eventTargetPatch(_global, api) {
    if (Zone[api.symbol('patchEventTarget')]) {
        // EventTarget is already patched.
        return;
    }
    const { eventNames, zoneSymbolEventNames, TRUE_STR, FALSE_STR, ZONE_SYMBOL_PREFIX } = api.getGlobalObjects();
    //  predefine all __zone_symbol__ + eventName + true/false string
    for (let i = 0; i < eventNames.length; i++) {
        const eventName = eventNames[i];
        const falseEventName = eventName + FALSE_STR;
        const trueEventName = eventName + TRUE_STR;
        const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
        const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
        zoneSymbolEventNames[eventName] = {};
        zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
        zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
    }
    const EVENT_TARGET = _global['EventTarget'];
    if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
        return;
    }
    api.patchEventTarget(_global, api, [EVENT_TARGET && EVENT_TARGET.prototype]);
    return true;
}
function patchEvent(global, api) {
    api.patchEventPrototype(global, api);
}

/**
 * @fileoverview
 * @suppress {globalThis}
 */
function filterProperties(target, onProperties, ignoreProperties) {
    if (!ignoreProperties || ignoreProperties.length === 0) {
        return onProperties;
    }
    const tip = ignoreProperties.filter((ip) => ip.target === target);
    if (tip.length === 0) {
        return onProperties;
    }
    const targetIgnoreProperties = tip[0].ignoreProperties;
    return onProperties.filter((op) => targetIgnoreProperties.indexOf(op) === -1);
}
function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
    // check whether target is available, sometimes target will be undefined
    // because different browser or some 3rd party plugin.
    if (!target) {
        return;
    }
    const filteredProperties = filterProperties(target, onProperties, ignoreProperties);
    patchOnProperties(target, filteredProperties, prototype);
}
/**
 * Get all event name properties which the event name startsWith `on`
 * from the target object itself, inherited properties are not considered.
 */
function getOnEventNames(target) {
    return Object.getOwnPropertyNames(target)
        .filter((name) => name.startsWith('on') && name.length > 2)
        .map((name) => name.substring(2));
}
function propertyDescriptorPatch(api, _global) {
    if (isNode && !isMix) {
        return;
    }
    if (Zone[api.symbol('patchEvents')]) {
        // events are already been patched by legacy patch.
        return;
    }
    const ignoreProperties = _global['__Zone_ignore_on_properties'];
    // for browsers that we can patch the descriptor:  Chrome & Firefox
    let patchTargets = [];
    if (isBrowser) {
        const internalWindow = window;
        patchTargets = patchTargets.concat([
            'Document',
            'SVGElement',
            'Element',
            'HTMLElement',
            'HTMLBodyElement',
            'HTMLMediaElement',
            'HTMLFrameSetElement',
            'HTMLFrameElement',
            'HTMLIFrameElement',
            'HTMLMarqueeElement',
            'Worker',
        ]);
        const ignoreErrorProperties = [];
        // In older browsers like IE or Edge, event handler properties (e.g., `onclick`)
        // may not be defined directly on the `window` object but on its prototype (`WindowPrototype`).
        // To ensure complete coverage, we use the prototype when checking
        // for and patching these properties.
        patchFilteredProperties(internalWindow, getOnEventNames(internalWindow), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
    }
    patchTargets = patchTargets.concat([
        'XMLHttpRequest',
        'XMLHttpRequestEventTarget',
        'IDBIndex',
        'IDBRequest',
        'IDBOpenDBRequest',
        'IDBDatabase',
        'IDBTransaction',
        'IDBCursor',
        'WebSocket',
    ]);
    for (let i = 0; i < patchTargets.length; i++) {
        const target = _global[patchTargets[i]];
        target?.prototype &&
            patchFilteredProperties(target.prototype, getOnEventNames(target.prototype), ignoreProperties);
    }
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
function patchBrowser(Zone) {
    Zone.__load_patch('legacy', (global) => {
        const legacyPatch = global[Zone.__symbol__('legacyPatch')];
        if (legacyPatch) {
            legacyPatch();
        }
    });
    Zone.__load_patch('timers', (global) => {
        const set = 'set';
        const clear = 'clear';
        patchTimer(global, set, clear, 'Timeout');
        patchTimer(global, set, clear, 'Interval');
        patchTimer(global, set, clear, 'Immediate');
    });
    Zone.__load_patch('requestAnimationFrame', (global) => {
        patchTimer(global, 'request', 'cancel', 'AnimationFrame');
        patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
        patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
    });
    Zone.__load_patch('blocking', (global, Zone) => {
        const blockingMethods = ['alert', 'prompt', 'confirm'];
        for (let i = 0; i < blockingMethods.length; i++) {
            const name = blockingMethods[i];
            patchMethod(global, name, (delegate, symbol, name) => {
                return function (s, args) {
                    return Zone.current.run(delegate, global, args, name);
                };
            });
        }
    });
    Zone.__load_patch('EventTarget', (global, Zone, api) => {
        patchEvent(global, api);
        eventTargetPatch(global, api);
        // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
        const XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
        if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
            api.patchEventTarget(global, api, [XMLHttpRequestEventTarget.prototype]);
        }
    });
    Zone.__load_patch('MutationObserver', (global, Zone, api) => {
        patchClass('MutationObserver');
        patchClass('WebKitMutationObserver');
    });
    Zone.__load_patch('IntersectionObserver', (global, Zone, api) => {
        patchClass('IntersectionObserver');
    });
    Zone.__load_patch('FileReader', (global, Zone, api) => {
        patchClass('FileReader');
    });
    Zone.__load_patch('on_property', (global, Zone, api) => {
        propertyDescriptorPatch(api, global);
    });
    Zone.__load_patch('customElements', (global, Zone, api) => {
        patchCustomElements(global, api);
    });
    Zone.__load_patch('XHR', (global, Zone) => {
        // Treat XMLHttpRequest as a macrotask.
        patchXHR(global);
        const XHR_TASK = zoneSymbol('xhrTask');
        const XHR_SYNC = zoneSymbol('xhrSync');
        const XHR_LISTENER = zoneSymbol('xhrListener');
        const XHR_SCHEDULED = zoneSymbol('xhrScheduled');
        const XHR_URL = zoneSymbol('xhrURL');
        const XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
        function patchXHR(window) {
            const XMLHttpRequest = window['XMLHttpRequest'];
            if (!XMLHttpRequest) {
                // XMLHttpRequest is not available in service worker
                return;
            }
            const XMLHttpRequestPrototype = XMLHttpRequest.prototype;
            function findPendingTask(target) {
                return target[XHR_TASK];
            }
            let oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
            let oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
            if (!oriAddListener) {
                const XMLHttpRequestEventTarget = window['XMLHttpRequestEventTarget'];
                if (XMLHttpRequestEventTarget) {
                    const XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype;
                    oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                    oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                }
            }
            const READY_STATE_CHANGE = 'readystatechange';
            const SCHEDULED = 'scheduled';
            function scheduleTask(task) {
                const data = task.data;
                const target = data.target;
                target[XHR_SCHEDULED] = false;
                target[XHR_ERROR_BEFORE_SCHEDULED] = false;
                // remove existing event listener
                const listener = target[XHR_LISTENER];
                if (!oriAddListener) {
                    oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                    oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                }
                if (listener) {
                    oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
                }
                const newListener = (target[XHR_LISTENER] = () => {
                    if (target.readyState === target.DONE) {
                        // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with
                        // readyState=4 multiple times, so we need to check task state here
                        if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
                            // check whether the xhr has registered onload listener
                            // if that is the case, the task should invoke after all
                            // onload listeners finish.
                            // Also if the request failed without response (status = 0), the load event handler
                            // will not be triggered, in that case, we should also invoke the placeholder callback
                            // to close the XMLHttpRequest::send macroTask.
                            // https://github.com/angular/angular/issues/38795
                            const loadTasks = target[Zone.__symbol__('loadfalse')];
                            if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
                                const oriInvoke = task.invoke;
                                task.invoke = function () {
                                    // need to load the tasks again, because in other
                                    // load listener, they may remove themselves
                                    const loadTasks = target[Zone.__symbol__('loadfalse')];
                                    for (let i = 0; i < loadTasks.length; i++) {
                                        if (loadTasks[i] === task) {
                                            loadTasks.splice(i, 1);
                                        }
                                    }
                                    if (!data.aborted && task.state === SCHEDULED) {
                                        oriInvoke.call(task);
                                    }
                                };
                                loadTasks.push(task);
                            }
                            else {
                                task.invoke();
                            }
                        }
                        else if (!data.aborted && target[XHR_SCHEDULED] === false) {
                            // error occurs when xhr.send()
                            target[XHR_ERROR_BEFORE_SCHEDULED] = true;
                        }
                    }
                });
                oriAddListener.call(target, READY_STATE_CHANGE, newListener);
                const storedTask = target[XHR_TASK];
                if (!storedTask) {
                    target[XHR_TASK] = task;
                }
                sendNative.apply(target, data.args);
                target[XHR_SCHEDULED] = true;
                return task;
            }
            function placeholderCallback() { }
            function clearTask(task) {
                const data = task.data;
                // Note - ideally, we would call data.target.removeEventListener here, but it's too late
                // to prevent it from firing. So instead, we store info for the event listener.
                data.aborted = true;
                return abortNative.apply(data.target, data.args);
            }
            const openNative = patchMethod(XMLHttpRequestPrototype, 'open', () => function (self, args) {
                self[XHR_SYNC] = args[2] == false;
                self[XHR_URL] = args[1];
                return openNative.apply(self, args);
            });
            const XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
            const fetchTaskAborting = zoneSymbol('fetchTaskAborting');
            const fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
            const sendNative = patchMethod(XMLHttpRequestPrototype, 'send', () => function (self, args) {
                if (Zone.current[fetchTaskScheduling] === true) {
                    // a fetch is scheduling, so we are using xhr to polyfill fetch
                    // and because we already schedule macroTask for fetch, we should
                    // not schedule a macroTask for xhr again
                    return sendNative.apply(self, args);
                }
                if (self[XHR_SYNC]) {
                    // if the XHR is sync there is no task to schedule, just execute the code.
                    return sendNative.apply(self, args);
                }
                else {
                    const options = {
                        target: self,
                        url: self[XHR_URL],
                        isPeriodic: false,
                        args: args,
                        aborted: false,
                    };
                    const task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
                    if (self &&
                        self[XHR_ERROR_BEFORE_SCHEDULED] === true &&
                        !options.aborted &&
                        task.state === SCHEDULED) {
                        // xhr request throw error when send
                        // we should invoke task instead of leaving a scheduled
                        // pending macroTask
                        task.invoke();
                    }
                }
            });
            const abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', () => function (self, args) {
                const task = findPendingTask(self);
                if (task && typeof task.type == 'string') {
                    // If the XHR has already completed, do nothing.
                    // If the XHR has already been aborted, do nothing.
                    // Fix #569, call abort multiple times before done will cause
                    // macroTask task count be negative number
                    if (task.cancelFn == null || (task.data && task.data.aborted)) {
                        return;
                    }
                    task.zone.cancelTask(task);
                }
                else if (Zone.current[fetchTaskAborting] === true) {
                    // the abort is called from fetch polyfill, we need to call native abort of XHR.
                    return abortNative.apply(self, args);
                }
                // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no
                // task
                // to cancel. Do nothing.
            });
        }
    });
    Zone.__load_patch('geolocation', (global) => {
        /// GEO_LOCATION
        if (global['navigator'] && global['navigator'].geolocation) {
            patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
        }
    });
    Zone.__load_patch('PromiseRejectionEvent', (global, Zone) => {
        // handle unhandled promise rejection
        function findPromiseRejectionHandler(evtName) {
            return function (e) {
                const eventTasks = findEventTasks(global, evtName);
                eventTasks.forEach((eventTask) => {
                    // windows has added unhandledrejection event listener
                    // trigger the event listener
                    const PromiseRejectionEvent = global['PromiseRejectionEvent'];
                    if (PromiseRejectionEvent) {
                        const evt = new PromiseRejectionEvent(evtName, {
                            promise: e.promise,
                            reason: e.rejection,
                        });
                        eventTask.invoke(evt);
                    }
                });
            };
        }
        if (global['PromiseRejectionEvent']) {
            Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =
                findPromiseRejectionHandler('unhandledrejection');
            Zone[zoneSymbol('rejectionHandledHandler')] =
                findPromiseRejectionHandler('rejectionhandled');
        }
    });
    Zone.__load_patch('queueMicrotask', (global, Zone, api) => {
        patchQueueMicrotask(global, api);
    });
}

function patchPromise(Zone) {
    Zone.__load_patch('ZoneAwarePromise', (global, Zone, api) => {
        const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
        const ObjectDefineProperty = Object.defineProperty;
        function readableObjectToString(obj) {
            if (obj && obj.toString === Object.prototype.toString) {
                const className = obj.constructor && obj.constructor.name;
                return (className ? className : '') + ': ' + JSON.stringify(obj);
            }
            return obj ? obj.toString() : Object.prototype.toString.call(obj);
        }
        const __symbol__ = api.symbol;
        const _uncaughtPromiseErrors = [];
        const isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] !== false;
        const symbolPromise = __symbol__('Promise');
        const symbolThen = __symbol__('then');
        const creationTrace = '__creationTrace__';
        api.onUnhandledError = (e) => {
            if (api.showUncaughtError()) {
                const rejection = e && e.rejection;
                if (rejection) {
                    console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
                }
                else {
                    console.error(e);
                }
            }
        };
        api.microtaskDrainDone = () => {
            while (_uncaughtPromiseErrors.length) {
                const uncaughtPromiseError = _uncaughtPromiseErrors.shift();
                try {
                    uncaughtPromiseError.zone.runGuarded(() => {
                        if (uncaughtPromiseError.throwOriginal) {
                            throw uncaughtPromiseError.rejection;
                        }
                        throw uncaughtPromiseError;
                    });
                }
                catch (error) {
                    handleUnhandledRejection(error);
                }
            }
        };
        const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
        function handleUnhandledRejection(e) {
            api.onUnhandledError(e);
            try {
                const handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
                if (typeof handler === 'function') {
                    handler.call(this, e);
                }
            }
            catch (err) { }
        }
        function isThenable(value) {
            return value && typeof value.then === 'function';
        }
        function forwardResolution(value) {
            return value;
        }
        function forwardRejection(rejection) {
            return ZoneAwarePromise.reject(rejection);
        }
        const symbolState = __symbol__('state');
        const symbolValue = __symbol__('value');
        const symbolFinally = __symbol__('finally');
        const symbolParentPromiseValue = __symbol__('parentPromiseValue');
        const symbolParentPromiseState = __symbol__('parentPromiseState');
        const source = 'Promise.then';
        const UNRESOLVED = null;
        const RESOLVED = true;
        const REJECTED = false;
        const REJECTED_NO_CATCH = 0;
        function makeResolver(promise, state) {
            return (v) => {
                try {
                    resolvePromise(promise, state, v);
                }
                catch (err) {
                    resolvePromise(promise, false, err);
                }
                // Do not return value or you will break the Promise spec.
            };
        }
        const once = function () {
            let wasCalled = false;
            return function wrapper(wrappedFunction) {
                return function () {
                    if (wasCalled) {
                        return;
                    }
                    wasCalled = true;
                    wrappedFunction.apply(null, arguments);
                };
            };
        };
        const TYPE_ERROR = 'Promise resolved with itself';
        const CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
        // Promise Resolution
        function resolvePromise(promise, state, value) {
            const onceWrapper = once();
            if (promise === value) {
                throw new TypeError(TYPE_ERROR);
            }
            if (promise[symbolState] === UNRESOLVED) {
                // should only get value.then once based on promise spec.
                let then = null;
                try {
                    if (typeof value === 'object' || typeof value === 'function') {
                        then = value && value.then;
                    }
                }
                catch (err) {
                    onceWrapper(() => {
                        resolvePromise(promise, false, err);
                    })();
                    return promise;
                }
                // if (value instanceof ZoneAwarePromise) {
                if (state !== REJECTED &&
                    value instanceof ZoneAwarePromise &&
                    value.hasOwnProperty(symbolState) &&
                    value.hasOwnProperty(symbolValue) &&
                    value[symbolState] !== UNRESOLVED) {
                    clearRejectedNoCatch(value);
                    resolvePromise(promise, value[symbolState], value[symbolValue]);
                }
                else if (state !== REJECTED && typeof then === 'function') {
                    try {
                        then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
                    }
                    catch (err) {
                        onceWrapper(() => {
                            resolvePromise(promise, false, err);
                        })();
                    }
                }
                else {
                    promise[symbolState] = state;
                    const queue = promise[symbolValue];
                    promise[symbolValue] = value;
                    if (promise[symbolFinally] === symbolFinally) {
                        // the promise is generated by Promise.prototype.finally
                        if (state === RESOLVED) {
                            // the state is resolved, should ignore the value
                            // and use parent promise value
                            promise[symbolState] = promise[symbolParentPromiseState];
                            promise[symbolValue] = promise[symbolParentPromiseValue];
                        }
                    }
                    // record task information in value when error occurs, so we can
                    // do some additional work such as render longStackTrace
                    if (state === REJECTED && value instanceof Error) {
                        // check if longStackTraceZone is here
                        const trace = Zone.currentTask &&
                            Zone.currentTask.data &&
                            Zone.currentTask.data[creationTrace];
                        if (trace) {
                            // only keep the long stack trace into error when in longStackTraceZone
                            ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, {
                                configurable: true,
                                enumerable: false,
                                writable: true,
                                value: trace,
                            });
                        }
                    }
                    for (let i = 0; i < queue.length;) {
                        scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
                    }
                    if (queue.length == 0 && state == REJECTED) {
                        promise[symbolState] = REJECTED_NO_CATCH;
                        let uncaughtPromiseError = value;
                        try {
                            // Here we throws a new Error to print more readable error log
                            // and if the value is not an error, zone.js builds an `Error`
                            // Object here to attach the stack information.
                            throw new Error('Uncaught (in promise): ' +
                                readableObjectToString(value) +
                                (value && value.stack ? '\n' + value.stack : ''));
                        }
                        catch (err) {
                            uncaughtPromiseError = err;
                        }
                        if (isDisableWrappingUncaughtPromiseRejection) {
                            // If disable wrapping uncaught promise reject
                            // use the value instead of wrapping it.
                            uncaughtPromiseError.throwOriginal = true;
                        }
                        uncaughtPromiseError.rejection = value;
                        uncaughtPromiseError.promise = promise;
                        uncaughtPromiseError.zone = Zone.current;
                        uncaughtPromiseError.task = Zone.currentTask;
                        _uncaughtPromiseErrors.push(uncaughtPromiseError);
                        api.scheduleMicroTask(); // to make sure that it is running
                    }
                }
            }
            // Resolving an already resolved promise is a noop.
            return promise;
        }
        const REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
        function clearRejectedNoCatch(promise) {
            if (promise[symbolState] === REJECTED_NO_CATCH) {
                // if the promise is rejected no catch status
                // and queue.length > 0, means there is a error handler
                // here to handle the rejected promise, we should trigger
                // windows.rejectionhandled eventHandler or nodejs rejectionHandled
                // eventHandler
                try {
                    const handler = Zone[REJECTION_HANDLED_HANDLER];
                    if (handler && typeof handler === 'function') {
                        handler.call(this, { rejection: promise[symbolValue], promise: promise });
                    }
                }
                catch (err) { }
                promise[symbolState] = REJECTED;
                for (let i = 0; i < _uncaughtPromiseErrors.length; i++) {
                    if (promise === _uncaughtPromiseErrors[i].promise) {
                        _uncaughtPromiseErrors.splice(i, 1);
                    }
                }
            }
        }
        function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
            clearRejectedNoCatch(promise);
            const promiseState = promise[symbolState];
            const delegate = promiseState
                ? typeof onFulfilled === 'function'
                    ? onFulfilled
                    : forwardResolution
                : typeof onRejected === 'function'
                    ? onRejected
                    : forwardRejection;
            zone.scheduleMicroTask(source, () => {
                try {
                    const parentPromiseValue = promise[symbolValue];
                    const isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
                    if (isFinallyPromise) {
                        // if the promise is generated from finally call, keep parent promise's state and value
                        chainPromise[symbolParentPromiseValue] = parentPromiseValue;
                        chainPromise[symbolParentPromiseState] = promiseState;
                    }
                    // should not pass value to finally callback
                    const value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution
                        ? []
                        : [parentPromiseValue]);
                    resolvePromise(chainPromise, true, value);
                }
                catch (error) {
                    // if error occurs, should always return this error
                    resolvePromise(chainPromise, false, error);
                }
            }, chainPromise);
        }
        const ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
        const noop = function () { };
        const AggregateError = global.AggregateError;
        class ZoneAwarePromise {
            static toString() {
                return ZONE_AWARE_PROMISE_TO_STRING;
            }
            static resolve(value) {
                if (value instanceof ZoneAwarePromise) {
                    return value;
                }
                return resolvePromise(new this(null), RESOLVED, value);
            }
            static reject(error) {
                return resolvePromise(new this(null), REJECTED, error);
            }
            static withResolvers() {
                const result = {};
                result.promise = new ZoneAwarePromise((res, rej) => {
                    result.resolve = res;
                    result.reject = rej;
                });
                return result;
            }
            static any(values) {
                if (!values || typeof values[Symbol.iterator] !== 'function') {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                const promises = [];
                let count = 0;
                try {
                    for (let v of values) {
                        count++;
                        promises.push(ZoneAwarePromise.resolve(v));
                    }
                }
                catch (err) {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                if (count === 0) {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                let finished = false;
                const errors = [];
                return new ZoneAwarePromise((resolve, reject) => {
                    for (let i = 0; i < promises.length; i++) {
                        promises[i].then((v) => {
                            if (finished) {
                                return;
                            }
                            finished = true;
                            resolve(v);
                        }, (err) => {
                            errors.push(err);
                            count--;
                            if (count === 0) {
                                finished = true;
                                reject(new AggregateError(errors, 'All promises were rejected'));
                            }
                        });
                    }
                });
            }
            static race(values) {
                let resolve;
                let reject;
                let promise = new this((res, rej) => {
                    resolve = res;
                    reject = rej;
                });
                function onResolve(value) {
                    resolve(value);
                }
                function onReject(error) {
                    reject(error);
                }
                for (let value of values) {
                    if (!isThenable(value)) {
                        value = this.resolve(value);
                    }
                    value.then(onResolve, onReject);
                }
                return promise;
            }
            static all(values) {
                return ZoneAwarePromise.allWithCallback(values);
            }
            static allSettled(values) {
                const P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
                return P.allWithCallback(values, {
                    thenCallback: (value) => ({ status: 'fulfilled', value }),
                    errorCallback: (err) => ({ status: 'rejected', reason: err }),
                });
            }
            static allWithCallback(values, callback) {
                let resolve;
                let reject;
                let promise = new this((res, rej) => {
                    resolve = res;
                    reject = rej;
                });
                // Start at 2 to prevent prematurely resolving if .then is called immediately.
                let unresolvedCount = 2;
                let valueIndex = 0;
                const resolvedValues = [];
                for (let value of values) {
                    if (!isThenable(value)) {
                        value = this.resolve(value);
                    }
                    const curValueIndex = valueIndex;
                    try {
                        value.then((value) => {
                            resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;
                            unresolvedCount--;
                            if (unresolvedCount === 0) {
                                resolve(resolvedValues);
                            }
                        }, (err) => {
                            if (!callback) {
                                reject(err);
                            }
                            else {
                                resolvedValues[curValueIndex] = callback.errorCallback(err);
                                unresolvedCount--;
                                if (unresolvedCount === 0) {
                                    resolve(resolvedValues);
                                }
                            }
                        });
                    }
                    catch (thenErr) {
                        reject(thenErr);
                    }
                    unresolvedCount++;
                    valueIndex++;
                }
                // Make the unresolvedCount zero-based again.
                unresolvedCount -= 2;
                if (unresolvedCount === 0) {
                    resolve(resolvedValues);
                }
                return promise;
            }
            constructor(executor) {
                const promise = this;
                if (!(promise instanceof ZoneAwarePromise)) {
                    throw new Error('Must be an instanceof Promise.');
                }
                promise[symbolState] = UNRESOLVED;
                promise[symbolValue] = []; // queue;
                try {
                    const onceWrapper = once();
                    executor &&
                        executor(onceWrapper(makeResolver(promise, RESOLVED)), onceWrapper(makeResolver(promise, REJECTED)));
                }
                catch (error) {
                    resolvePromise(promise, false, error);
                }
            }
            get [Symbol.toStringTag]() {
                return 'Promise';
            }
            get [Symbol.species]() {
                return ZoneAwarePromise;
            }
            then(onFulfilled, onRejected) {
                // We must read `Symbol.species` safely because `this` may be anything. For instance, `this`
                // may be an object without a prototype (created through `Object.create(null)`); thus
                // `this.constructor` will be undefined. One of the use cases is SystemJS creating
                // prototype-less objects (modules) via `Object.create(null)`. The SystemJS creates an empty
                // object and copies promise properties into that object (within the `getOrCreateLoad`
                // function). The zone.js then checks if the resolved value has the `then` method and
                // invokes it with the `value` context. Otherwise, this will throw an error: `TypeError:
                // Cannot read properties of undefined (reading 'Symbol(Symbol.species)')`.
                let C = this.constructor?.[Symbol.species];
                if (!C || typeof C !== 'function') {
                    C = this.constructor || ZoneAwarePromise;
                }
                const chainPromise = new C(noop);
                const zone = Zone.current;
                if (this[symbolState] == UNRESOLVED) {
                    this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
                }
                else {
                    scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
                }
                return chainPromise;
            }
            catch(onRejected) {
                return this.then(null, onRejected);
            }
            finally(onFinally) {
                // See comment on the call to `then` about why thee `Symbol.species` is safely accessed.
                let C = this.constructor?.[Symbol.species];
                if (!C || typeof C !== 'function') {
                    C = ZoneAwarePromise;
                }
                const chainPromise = new C(noop);
                chainPromise[symbolFinally] = symbolFinally;
                const zone = Zone.current;
                if (this[symbolState] == UNRESOLVED) {
                    this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
                }
                else {
                    scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
                }
                return chainPromise;
            }
        }
        // Protect against aggressive optimizers dropping seemingly unused properties.
        // E.g. Closure Compiler in advanced mode.
        ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
        ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
        ZoneAwarePromise['race'] = ZoneAwarePromise.race;
        ZoneAwarePromise['all'] = ZoneAwarePromise.all;
        const NativePromise = (global[symbolPromise] = global['Promise']);
        global['Promise'] = ZoneAwarePromise;
        const symbolThenPatched = __symbol__('thenPatched');
        function patchThen(Ctor) {
            const proto = Ctor.prototype;
            const prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
            if (prop && (prop.writable === false || !prop.configurable)) {
                // check Ctor.prototype.then propertyDescriptor is writable or not
                // in meteor env, writable is false, we should ignore such case
                return;
            }
            const originalThen = proto.then;
            // Keep a reference to the original method.
            proto[symbolThen] = originalThen;
            Ctor.prototype.then = function (onResolve, onReject) {
                const wrapped = new ZoneAwarePromise((resolve, reject) => {
                    originalThen.call(this, resolve, reject);
                });
                return wrapped.then(onResolve, onReject);
            };
            Ctor[symbolThenPatched] = true;
        }
        api.patchThen = patchThen;
        function zoneify(fn) {
            return function (self, args) {
                let resultPromise = fn.apply(self, args);
                if (resultPromise instanceof ZoneAwarePromise) {
                    return resultPromise;
                }
                let ctor = resultPromise.constructor;
                if (!ctor[symbolThenPatched]) {
                    patchThen(ctor);
                }
                return resultPromise;
            };
        }
        if (NativePromise) {
            patchThen(NativePromise);
            patchMethod(global, 'fetch', (delegate) => zoneify(delegate));
        }
        // This is not part of public API, but it is useful for tests, so we expose it.
        Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
        return ZoneAwarePromise;
    });
}

function patchToString(Zone) {
    // override Function.prototype.toString to make zone.js patched function
    // look like native function
    Zone.__load_patch('toString', (global) => {
        // patch Func.prototype.toString to let them look like native
        const originalFunctionToString = Function.prototype.toString;
        const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
        const PROMISE_SYMBOL = zoneSymbol('Promise');
        const ERROR_SYMBOL = zoneSymbol('Error');
        const newFunctionToString = function toString() {
            if (typeof this === 'function') {
                const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
                if (originalDelegate) {
                    if (typeof originalDelegate === 'function') {
                        return originalFunctionToString.call(originalDelegate);
                    }
                    else {
                        return Object.prototype.toString.call(originalDelegate);
                    }
                }
                if (this === Promise) {
                    const nativePromise = global[PROMISE_SYMBOL];
                    if (nativePromise) {
                        return originalFunctionToString.call(nativePromise);
                    }
                }
                if (this === Error) {
                    const nativeError = global[ERROR_SYMBOL];
                    if (nativeError) {
                        return originalFunctionToString.call(nativeError);
                    }
                }
            }
            return originalFunctionToString.call(this);
        };
        newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
        Function.prototype.toString = newFunctionToString;
        // patch Object.prototype.toString to let them look like native
        const originalObjectToString = Object.prototype.toString;
        const PROMISE_OBJECT_TO_STRING = '[object Promise]';
        Object.prototype.toString = function () {
            if (typeof Promise === 'function' && this instanceof Promise) {
                return PROMISE_OBJECT_TO_STRING;
            }
            return originalObjectToString.call(this);
        };
    });
}

function patchCallbacks(api, target, targetName, method, callbacks) 3A̾{
    const symbol = Zone.__symbol__(method);
    if (target[symbol]) {
        return;
    }
    const nativeDelegate = (target[symbol] = target[method]);
    target[method] = function (name, opts, options) {
        if (opts && opts.prototype) {
            callbacks.forEach(function (callback) {
                const source = `${targetName}.${method}::` + callback;
                const prototype = opts.prototype;
                // Note: the `patchCallbacks` is used for patching the `document.registerElement` and
                // `customElements.define`. We explicitly wrap the patching code into try-catch since
                // callbacks may be already patched by other web components frameworks (e.g. LWC), and they
                // make those properties non-writable. This means that patching callback will throw an error
                // `cannot assign to read-only property`. See this code as an example:
                // https://github.com/salesforce/lwc/blob/master/packages/@lwc/engine-core/src/framework/base-bridge-element.ts#L180-L186
                // We don't want to stop the application rendering if we couldn't patch some
                // callback, e.g. `attributeChangedCallback`.
                try {
                    if (prototype.hasOwnProperty(callback)) {
                        const descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
                        if (descriptor && descriptor.value) {
                            descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
                            api._redefineProperty(opts.prototype, callback, descriptor);
                        }
                        else if (prototype[callback]) {
                            prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
                        }
                    }
                    else if (prototype[callback]) {
                        prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
                    }
                }
                catch {
                    // Note: we leave the catch block empty since there's no way to handle the error related
                    // to non-writable property.
                }
            });
        }
        return nativeDelegate.call(target, name, opts, options);
    };
    api.attachOriginToPatched(target[method], nativeDelegate);
}

function patchUtil(Zone) {
    Zone.__load_patch('util', (global, Zone, api) => {
        // Collect native event names by looking at properties
        // on the global namespace, e.g. 'onclick'.
        const eventNames = getOnEventNames(global);
        api.patchOnProperties = patchOnProperties;
        api.patchMethod = patchMethod;
        api.bindArguments = bindArguments;
        api.patchMacroTask = patchMacroTask;
        // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS`
        // to define which events will not be patched by `Zone.js`. In newer version (>=0.9.0), we
        // change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep the name consistent with
        // angular repo. The  `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be
        // supported for backwards compatibility.
        const SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
        const SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
        if (global[SYMBOL_UNPATCHED_EVENTS]) {
            global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
        }
        if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
            Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
                global[SYMBOL_BLACK_LISTED_EVENTS];
        }
        api.patchEventPrototype = patchEventPrototype;
        api.patchEventTarget = patchEventTarget;
        api.isIEOrEdge = isIEOrEdge;
        api.ObjectDefineProperty = ObjectDefineProperty;
        api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
        api.ObjectCreate = ObjectCreate;
        api.ArraySlice = ArraySlice;
        api.patchClass = patchClass;
        api.wrapWithCurrentZone = wrapWithCurrentZone;
        api.filterProperties = filterProperties;
        api.attachOriginToPatched = attachOriginToPatched;
        api._redefineProperty = Object.defineProperty;
        api.patchCallbacks = patchCallbacks;
        api.getGlobalObjects = () => ({
            globalSources,
            zoneSymbolEventNames,
            eventNames,
            isBrowser,
            isMix,
            isNode,
            TRUE_STR,
            FALSE_STR,
            ZONE_SYMBOL_PREFIX,
            ADD_EVENT_LISTENER_STR,
            REMOVE_EVENT_LISTENER_STR,
        });
    });
}

function patchCommon(Zone) {
    patchPromise(Zone);
    patchToString(Zone);
    patchUtil(Zone);
}

function patchEvents(Zone) {
    Zone.__load_patch('EventEmitter', (global, Zone, api) => {
        // For EventEmitter
        const EE_ADD_LISTENER = 'addListener';
        const EE_PREPEND_LISTENER = 'prependListener';
        const EE_REMOVE_LISTENER = 'removeListener';
        const EE_REMOVE_ALL_LISTENER = 'removeAllListeners';
        const EE_LISTENERS = 'listeners';
        const EE_ON = 'on';
        const EE_OFF = 'off';
        const compareTaskCallbackVsDelegate = function (task, delegate) {
            // same callback, same capture, same event name, just return
            return task.callback === delegate || task.callback.listener === delegate;
        };
        const eventNameToString = function (eventName) {
            if (typeof eventName === 'string') {
                return eventName;
            }
            if (!eventName) {
                return '';
            }
            return eventName.toString().replace('(', '_').replace(')', '_');
        };
        function patchEventEmitterMethods(obj) {
            const result = patchEventTarget(global, api, [obj], {
                useG: false,
                add: EE_ADD_LISTENER,
                rm: EE_REMOVE_LISTENER,
                prepend: EE_PREPEND_LISTENER,
                rmAll: EE_REMOVE_ALL_LISTENER,
                listeners: EE_LISTENERS,
                chkDup: false,
                rt: true,
                diff: compareTaskCallbackVsDelegate,
                eventNameToString: eventNameToString,
            });
            if (result && result[0]) {
                obj[EE_ON] = obj[EE_ADD_LISTENER];
                obj[EE_OFF] = obj[EE_REMOVE_LISTENER];
            }
        }
        // EventEmitter
        let events;
        try {
            events = require('events');
        }
        catch (err) { }
        if (events && events.EventEmitter) {
            patchEventEmitterMethods(events.EventEmitter.prototype);
        }
    });
}

function patchFs(Zone) {
    Zone.__load_patch('fs', (global, Zone, api) => {
        let fs;
        try {
            fs = require('fs');
        }
        catch (err) { }
        if (!fs)
            return;
        // watch, watchFile, unwatchFile has been patched
        // because EventEmitter has been patched
        const TO_PATCH_MACROTASK_METHODS = [
            'access',
            'appendFile',
            'chmod',
            'chown',
            'close',
            'exists',
            'fchmod',
            'fchown',
            'fdatasync',
            'fstat',
            'fsync',
            'ftruncate',
            'futimes',
            'lchmod',
            'lchown',
            'lutimes',
            'link',
            'lstat',
            'mkdir',
            'mkdtemp',
            'open',
            'opendir',
            'read',
            'readdir',
            'readFile',
            'readlink',
            'realpath',
            'rename',
            'rmdir',
            'stat',
            'symlink',
            'truncate',
            'unlink',
            'utimes',
            'write',
            'writeFile',
            'writev',
        ];
        TO_PATCH_MACROTASK_METHODS.filter((name) => !!fs[name] && typeof fs[name] === 'function').forEach((name) => {
            patchMacroTask(fs, name, (self, args) => {
                return {
                    name: 'fs.' + name,
                    args: args,
                    cbIdx: args.length > 0 ? args.length - 1 : -1,
                    target: self,
                };
            });
        });
        const realpathOriginalDelegate = fs.realpath?.[api.symbol('OriginalDelegate')];
        // This is the only specific method that should be additionally patched because the previous
        // `patchMacroTask` has overridden the `realpath` function and its `native` property.
        if (realpathOriginalDelegate?.native) {
            fs.realpath.native = realpathOriginalDelegate.native;
            patchMacroTask(fs.realpath, 'native', (self, args) => ({
                args,
                target: self,
                cbIdx: args.length > 0 ? args.length - 1 : -1,
                name: 'fs.realpath.native',
            }));
        }
    });
}

function patchNodeUtil(Zone) {
    Zone.__load_patch('node_util', (global, Zone, api) => {
        api.patchOnProperties = patchOnProperties;
        api.patchMethod = patchMethod;
        api.bindArguments = bindArguments;
        api.patchMacroTask = patchMacroTask;
        setShouldCopySymbolProperties(true);
    });
}

const set = 'set';
const clear = 'clear';
function patchNode(Zone) {
    patchNodeUtil(Zone);
    patchEvents(Zone);
    patchFs(Zone);
    Zone.__load_patch('node_timers', (global, Zone) => {
        // Timers
        let globalUseTimeoutFromTimer = false;
        try {
            const timers = require('timers');
            let globalEqualTimersTimeout = global.setTimeout === timers.setTimeout;
            if (!globalEqualTimersTimeout && !isMix) {
                // 1. if isMix, then we are in mix environment such as Electron
                // we should only patch timers.setTimeout because global.setTimeout
                // have been patched
                // 2. if global.setTimeout not equal timers.setTimeout, check
                // whether global.setTimeout use timers.setTimeout or not
                const originSetTimeout = timers.setTimeout;
                timers.setTimeout = function () {
                    globalUseTimeoutFromTimer = true;
                    return originSetTimeout.apply(this, arguments);
                };
                const detectTimeout = global.setTimeout(() => { }, 100);
                clearTimeout(detectTimeout);
                timers.setTimeout = originSetTimeout;
            }
            patchTimer(timers, set, clear, 'Timeout');
            patchTimer(timers, set, clear, 'Interval');
            patchTimer(timers, set, clear, 'Immediate');
        }
        catch (error) {
            // timers module not exists, for example, when we using nativeScript
            // timers is not available
        }
        if (isMix) {
            // if we are in mix environment, such as Electron,
            // the global.setTimeout has already been patched,
            // so we just patch timers.setTimeout
            return;
        }
        if (!globalUseTimeoutFromTimer) {
            // 1. global setTimeout equals timers setTimeout
            // 2. or global don't use timers setTimeout(maybe some other library patch setTimeout)
            // 3. or load timers module error happens, we should patch global setTimeout
            patchTimer(global, set, clear, 'Timeout');
            patchTimer(global, set, clear, 'Interval');
            patchTimer(global, set, clear, 'Immediate');
        }
        else {
            // global use timers setTimeout, but not equals
            // this happens when use nodejs v0.10.x, global setTimeout will
            // use a lazy load version of timers setTimeout
            // we should not double patch timer's setTimeout
            // so we only store the __symbol__ for consistency
            global[Zone.__symbol__('setTimeout')] = global.setTimeout;
            global[Zone.__symbol__('setInterval')] = global.setInterval;
            global[Zone.__symbol__('setImmediate')] = global.setImmediate;
        }
    });
    // patch process related methods
    Zone.__load_patch('nextTick', () => {
        // patch nextTick as microTask
        patchMicroTask(process, 'nextTick', (self, args) => {
            return {
                name: 'process.nextTick',
                args: args,
                cbIdx: args.length > 0 && typeof args[0] === 'function' ? 0 : -1,
                target: process,
            };
        });
    });
    Zone.__load_patch('handleUnhandledPromiseRejection', (global, Zone, api) => {
        Zone[api.symbol('unhandledPromiseRejectionHandler')] =
            findProcessPromiseRejectionHandler('unhandledRejection');
        Zone[api.symbol('rejectionHandledHandler')] =
            findProcessPromiseRejectionHandler('rejectionHandled');
        // handle unhandled promise rejection
        function findProcessPromiseRejectionHandler(evtName) {
            return function (e) {
                const eventTasks = findEventTasks(process, evtName);
                eventTasks.forEach((eventTask) => {
                    // process has added unhandledrejection event listener
                    // trigger the event listener
                    if (evtName === 'unhandledRejection') {
                        eventTask.invoke(e.rejection, e.promise);
                    }
                    else if (evtName === 'rejectionHandled') {
                        eventTask.invoke(e.promise);
                    }
                });
            };
        }
    });
    // Crypto
    Zone.__load_patch('crypto', () => {
        let crypto;
        try {
            crypto = require('crypto');
        }
        catch (err) { }
        // use the generic patchMacroTask to patch crypto
        if (crypto) {
            const methodNames = ['randomBytes', 'pbkdf2'];
            methodNames.forEach((name) => {
                patchMacroTask(crypto, name, (self, args) => {
                    return {
                        name: 'crypto.' + name,
                        args: args,
                        cbIdx: args.length > 0 && typeof args[args.length - 1] === 'function' ? args.length - 1 : -1,
                        target: crypto,
                    };
                });
            });
        }
    });
    Zone.__load_patch('console', (global, Zone) => {
        const consoleMethods = [
            'dir',
            'log',
            'info',
            'error',
            'warn',
            'assert',
            'debug',
            'timeEnd',
            'trace',
        ];
        consoleMethods.forEach((m) => {
            const originalMethod = (console[Zone.__symbol__(m)] = console[m]);
            if (originalMethod) {
                console[m] = function () {
                    const args = ArraySlice.call(arguments);
                    if (Zone.current === Zone.root) {
                        return originalMethod.apply(this, args);
                    }
                    else {
                        return Zone.root.run(originalMethod, this, args);
                    }
                };
            }
        });
    });
    Zone.__load_patch('queueMicrotask', (global, Zone, api) => {
        patchQueueMicrotask(global, api);
    });
}

function loadZone() {
    // if global['Zone'] already exists (maybe zone.js was already loaded or
    // some other lib also registered a global object named Zone), we may need
    // to throw an error, but sometimes user may not want this error.
    // For example,
    // we have two web pages, page1 includes zone.js, page2 doesn't.
    // and the 1st time user load page1 and page2, everything work fine,
    // but when user load page2 again, error occurs because global['Zone'] already exists.
    // so we add a flag to let user choose whether to throw this error or not.
    // By default, if existing Zone is from zone.js, we will not throw the error.
    const global = globalThis;
    const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
    if (global['Zone'] && (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function')) {
        throw new Error('Zone already loaded.');
    }
    // Initialize global `Zone` constant.
    global['Zone'] ??= initZone();
    return global['Zone'];
}

const Zone$1 = loadZone();
patchCommon(Zone$1);
patchBrowser(Zone$1);
patchNode(Zone$1);
V{9xeV"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */const global=globalThis;function __symbol__(e){return(global.__Zone_symbol_prefix||"__zone_symbol__")+e}function initZone(){const e=global.performance;function t(t){e&&e.mark&&e.mark(t)}function n(t,n){e&&e.measure&&e.measure(t,n)}t("Zone");class o{static __symbol__=__symbol__;static assertZonePatched(){if(global.Promise!==w.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let e=o.current;for(;e.parent;)e=e.parent;return e}static get current(){return Z.zone}static get currentTask(){return D}static __load_patch(e,r,s=!1){if(w.hasOwnProperty(e)){const t=!0===global[__symbol__("forceDuplicateZoneCheck")];if(!s&&t)throw Error("Already loaded patch: "+e)}else if(!global["__Zone_disable_"+e]){const s="Zone:"+e;t(s),w[e]=r(global,o,P),n(s,s)}}get parent(){return this._parent}get name(){return this._name}_parent;_name;_properties;_zoneDelegate;constructor(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new s(this,this._parent&&this._parent._zoneDelegate,t)}get(e){const t=this.getZoneWith(e);if(t)return t._properties[e]}getZoneWith(e){let t=this;for(;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null}fork(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)}wrap(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);const n=this._zoneDelegate.intercept(this,e,t),o=this;return function(){return o.runGuarded(n,this,arguments,t)}}run(e,t,n,o){Z={parent:Z,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,o)}finally{Z=Z.parent}}runGuarded(e,t=null,n,o){Z={parent:Z,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,o)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{Z=Z.parent}}runTask(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||m).name+"; Execution: "+this.name+")");const o=e,{type:r,data:{isPeriodic:s=!1,isRefreshable:a=!1}={}}=e;if(e.state===g&&(r===O||r===S))return;const i=e.state!=b;i&&o._transitionTo(b,k);const c=D;D=o,Z={parent:Z,zone:this};try{r!=S||!e.data||s||a||(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,o,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{const t=e.state;if(t!==g&&t!==T)if(r==O||s||a&&t===y)i&&o._transitionTo(k,b,y);else{const e=o._zoneDelegates;this._updateTaskCount(o,-1),i&&o._transitionTo(g,b,g),a&&(o._zoneDelegates=e)}Z=Z.parent,D=c}}scheduleTask(e){if(e.zone&&e.zone!==this){let t=this;for(;t;){if(t===e.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${e.zone.name}`);t=t.parent}}e._transitionTo(y,g);const t=[];e._zoneDelegates=t,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(T,y,g),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===t&&this._updateTaskCount(e,1),e.state==y&&e._transitionTo(k,y),e}scheduleMicroTask(e,t,n,o){return this.scheduleTask(new a(v,e,t,n,o,void 0))}scheduleMacroTask(e,t,n,o,r){return this.scheduleTask(new a(S,e,t,n,o,r))}scheduleEventTask(e,t,n,o,r){return this.scheduleTask(new a(O,e,t,n,o,r))}cancelTask(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||m).name+"; Execution: "+this.name+")");if(e.state===k||e.state===b){e._transitionTo(E,k,b);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(T,E),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(g,E),e.runCount=-1,e}}_updateTaskCount(e,t){const n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(let o=0;o<n.length;o++)n[o]._updateTaskCount(e.type,t)}}const r={name:"",onHasTask:(e,t,n,o)=>e.hasTask(n,o),onScheduleTask:(e,t,n,o)=>e.scheduleTask(n,o),onInvokeTask:(e,t,n,o,r,s)=>e.invokeTask(n,o,r,s),onCancelTask:(e,t,n,o)=>e.cancelTask(n,o)};class s{get zone(){return this._zone}_zone;_taskCounts={microTask:0,macroTask:0,eventTask:0};_parentDelegate;_forkDlgt;_forkZS;_forkCurrZone;_interceptDlgt;_interceptZS;_interceptCurrZone;_invokeDlgt;_invokeZS;_invokeCurrZone;_handleErrorDlgt;_handleErrorZS;_handleErrorCurrZone;_scheduleTaskDlgt;_scheduleTaskZS;_scheduleTaskCurrZone;_invokeTaskDlgt;_invokeTaskZS;_invokeTaskCurrZone;_cancelTaskDlgt;_cancelTaskZS;_cancelTaskCurrZone;_hasTaskDlgt;_hasTaskDlgtOwner;_hasTaskZS;_hasTaskCurrZone;constructor(e,t,n){this._zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this._zone:t._forkCurrZone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this._zone:t._interceptCurrZone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this._zone:t._invokeCurrZone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this._zone:t._handleErrorCurrZone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this._zone:t._scheduleTaskCurrZone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this._zone:t._invokeTaskCurrZone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this._zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const o=n&&n.onHasTask;(o||t&&t._hasTaskZS)&&(this._hasTaskZS=o?n:r,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,n.onScheduleTask||(this._scheduleTaskZS=r,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this._zone),n.onInvokeTask||(this._invokeTaskZS=r,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this._zone),n.onCancelTask||(this._cancelTaskZS=r,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this._zone))}fork(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new o(e,t)}intercept(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t}invoke(e,t,n,o,r){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,o,r):t.apply(n,o)}handleError(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)}scheduleTask(e,t){let n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t),n||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=v)throw new Error("Task is missing scheduleFn.");_(t)}return n}invokeTask(e,t,n,o){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,o):t.callback.apply(n,o)}cancelTask(e,t){let n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n}hasTask(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}}_updateTaskCount(e,t){const n=this._taskCounts,o=n[e],r=n[e]=o+t;if(r<0)throw new Error("More tasks executed then were scheduled.");0!=o&&0!=r||this.hasTask(this._zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})}}class a{type;source;invoke;callback;data;scheduleFn;cancelFn;_zone=null;runCount=0;_zoneDelegates=null;_state="notScheduled";constructor(e,t,n,o,r,s){if(this.type=e,this.source=t,this.data=o,this.scheduleFn=r,this.cancelFn=s,!n)throw new Error("callback is not defined");this.callback=n;const i=this;this.invoke=e===O&&o&&o.useG?a.invokeTask:function(){return a.invokeTask.call(global,i,this,arguments)}}static invokeTask(e,t,n){e||(e=this),N++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==N&&d(),N--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(g,y)}_transitionTo(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(`${this.type} '${this.source}': can not transition to '${e}', expecting state '${t}'${n?" or '"+n+"'":""}, was '${this._state}'.`);this._state=e,e==g&&(this._zoneDelegates=null)}toString(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const i=__symbol__("setTimeout"),c=__symbol__("Promise"),l=__symbol__("then");let h,u=[],p=!1;function f(e){if(h||global[c]&&(h=global[c].resolve(0)),h){let t=h[l];t||(t=h.then),t.call(h,e)}else global[i](e,0)}function _(e){0===N&&0===u.length&&f(d),e&&u.push(e)}function d(){if(!p){for(p=!0;u.length;){const e=u;u=[];for(let t=0;t<e.length;t++){const n=e[t];try{n.zone.runTask(n,null,null)}catch(e){P.onUnhandledError(e)}}}P.microtaskDrainDone(),p=!1}}const m={name:"NO ZONE"},g="notScheduled",y="scheduling",k="scheduled",b="running",E="canceling",T="unknown",v="microTask",S="macroTask",O="eventTask",w={},P={symbol:__symbol__,currentZoneFrame:()=>Z,onUnhandledError:z,microtaskDrainDone:z,scheduleMicroTask:_,showUncaughtError:()=>!o[__symbol__("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:z,patchMethod:()=>z,bindArguments:()=>[],patchThen:()=>z,patchMacroTask:()=>z,patchEventPrototype:()=>z,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>z,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>z,wrapWithCurrentZone:()=>z,filterProperties:()=>[],attachOriginToPatched:()=>z,_redefineProperty:()=>z,patchCallbacks:()=>z,nativeScheduleMicroTask:f};let Z={parent:null,zone:new o(null,null)},D=null,N=0;function z(){}return n("Zone","Zone"),o}const ObjectGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,ObjectDefineProperty=Object.defineProperty,ObjectGetPrototypeOf=Object.getPrototypeOf,ObjectCreate=Object.create,ArraySlice=Array.prototype.slice,ADD_EVENT_LISTENER_STR="addEventListener",REMOVE_EVENT_LISTENER_STR="removeEventListener",ZONE_SYMBOL_ADD_EVENT_LISTENER=__symbol__("addEventListener"),ZONE_SYMBOL_REMOVE_EVENT_LISTENER=__symbol__("removeEventListener"),TRUE_STR="true",FALSE_STR="false",ZONE_SYMBOL_PREFIX=__symbol__("");function wrapWithCurrentZone(e,t){return Zone.current.wrap(e,t)}function scheduleMacroTaskWithCurrentZone(e,t,n,o,r){return Zone.current.scheduleMacroTask(e,t,n,o,r)}const zoneSymbol=__symbol__,isWindowExists="undefined"!=typeof window,internalWindow=isWindowExists?window:void 0,_global=isWindowExists&&internalWindow||globalThis,REMOVE_ATTRIBUTE="removeAttribute";function bindArguments(e,t){for(let n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=wrapWithCurrentZone(e[n],t+"_"+n));return e}function patchPrototype(e,t){const n=e.constructor.name;for(let o=0;o<t.length;o++){const r=t[o],s=e[r];if(s){if(!isPropertyWritable(ObjectGetOwnPropertyDescriptor(e,r)))continue;e[r]=(e=>{const t=function(){return e.apply(this,bindArguments(arguments,n+"."+r))};return attachOriginToPatched(t,e),t})(s)}}}function isPropertyWritable(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}const isWebWorker="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,isNode=!("nw"in _global)&&void 0!==_global.process&&"[object process]"===_global.process.toString(),isBrowser=!isNode&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),isMix=void 0!==_global.process&&"[object process]"===_global.process.toString()&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),zoneSymbolEventNames$1={},enableBeforeunloadSymbol=zoneSymbol("enable_beforeunload"),wrapFn=function(e){if(!(e=e||_global.event))return;let t=zoneSymbolEventNames$1[e.type];t||(t=zoneSymbolEventNames$1[e.type]=zoneSymbol("ON_PROPERTY"+e.type));const n=this||e.target||_global,o=n[t];let r;return isBrowser&&n===internalWindow&&"error"===e.type?(r=o&&o.call(this,e.message,e.filename,e.lineno,e.colno,e.error),!0===r&&e.preventDefault()):(r=o&&o.apply(this,arguments),"beforeunload"===e.type&&_global[enableBeforeunloadSymbol]&&"string"==typeof r?e.returnValue=r:null==r||r||e.preventDefault()),r};function patchProperty(e,t,n){let o=ObjectGetOwnPropertyDescriptor(e,t);if(!o&&n&&ObjectGetOwnPropertyDescriptor(n,t)&&(o={enumerable:!0,configurable:!0}),!o||!o.configurable)return;const r=zoneSymbol("on"+t+"patched");if(e.hasOwnProperty(r)&&e[r])return;delete o.writable,delete o.value;const s=o.get,a=o.set,i=t.slice(2);let c=zoneSymbolEventNames$1[i];c||(c=zoneSymbolEventNames$1[i]=zoneSymbol("ON_PROPERTY"+i)),o.set=function(t){let n=this;n||e!==_global||(n=_global),n&&("function"==typeof n[c]&&n.removeEventListener(i,wrapFn),a?.call(n,null),n[c]=t,"function"==typeof t&&n.addEventListener(i,wrapFn,!1))},o.get=function(){let n=this;if(n||e!==_global||(n=_global),!n)return null;const r=n[c];if(r)return r;if(s){let e=s.call(this);if(e)return o.set.call(this,e),"function"==typeof n[REMOVE_ATTRIBUTE]&&n.removeAttribute(t),e}return null},ObjectDefineProperty(e,t,o),e[r]=!0}function patchOnProperties(e,t,n){if(t)for(let o=0;o<t.length;o++)patchProperty(e,"on"+t[o],n);else{const t=[];for(const n in e)"on"==n.slice(0,2)&&t.push(n);for(let o=0;o<t.length;o++)patchProperty(e,t[o],n)}}const originalInstanceKey=zoneSymbol("originalInstance");function patchClass(e){const t=_global[e];if(!t)return;_global[zoneSymbol(e)]=t,_global[e]=function(){const n=bindArguments(arguments,e);switch(n.length){case 0:this[originalInstanceKey]=new t;break;case 1:this[originalInstanceKey]=new t(n[0]);break;case 2:this[originalInstanceKey]=new t(n[0],n[1]);break;case 3:this[originalInstanceKey]=new t(n[0],n[1],n[2]);break;case 4:this[originalInstanceKey]=new t(n[0],n[1],n[2],n[3]);break;default:throw new Error("Arg list too long.")}},attachOriginToPatched(_global[e],t);const n=new t((function(){}));let o;for(o in n)"XMLHttpRequest"===e&&"responseBlob"===o||function(t){"function"==typeof n[t]?_global[e].prototype[t]=function(){return this[originalInstanceKey][t].apply(this[originalInstanceKey],arguments)}:ObjectDefineProperty(_global[e].prototype,t,{set:function(n){"function"==typeof n?(this[originalInstanceKey][t]=wrapWithCurrentZone(n,e+"."+t),attachOriginToPatched(this[originalInstanceKey][t],n)):this[originalInstanceKey][t]=n},get:function(){return this[originalInstanceKey][t]}})}(o);for(o in t)"prototype"!==o&&t.hasOwnProperty(o)&&(_global[e][o]=t[o])}function copySymbolProperties(e,t){"function"==typeof Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach((n=>{const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,{get:function(){return e[n]},set:function(t){(!o||o.writable&&"function"==typeof o.set)&&(e[n]=t)},enumerable:!o||o.enumerable,configurable:!o||o.configurable})}))}let shouldCopySymbolProperties=!1;function setShouldCopySymbolProperties(e){shouldCopySymbolProperties=e}function patchMethod(e,t,n){let o=e;for(;o&&!o.hasOwnProperty(t);)o=ObjectGetPrototypeOf(o);!o&&e[t]&&(o=e);const r=zoneSymbol(t);let s=null;if(o&&(!(s=o[r])||!o.hasOwnProperty(r))&&(s=o[r]=o[t],isPropertyWritable(o&&ObjectGetOwnPropertyDescriptor(o,t)))){const e=n(s,r,t);o[t]=function(){return e(this,arguments)},attachOriginToPatched(o[t],s),shouldCopySymbolProperties&&copySymbolProperties(s,o[t])}return s}function patchMacroTask(e,t,n){let o=null;function r(e){const t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}o=patchMethod(e,t,(e=>function(t,o){const s=n(t,o);return s.cbIdx>=0&&"function"==typeof o[s.cbIdx]?scheduleMacroTaskWithCurrentZone(s.name,o[s.cbIdx],s,r):e.apply(t,o)}))}function patchMicroTask(e,t,n){let o=null;function r(e){const t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}o=patchMethod(e,t,(e=>function(t,o){const s=n(t,o);return s.cbIdx>=0&&"function"==typeof o[s.cbIdx]?Zone.current.scheduleMicroTask(s.name,o[s.cbIdx],s,r):e.apply(t,o)}))}function attachOriginToPatched(e,t){e[zoneSymbol("OriginalDelegate")]=t}let isDetectedIEOrEdge=!1,ieOrEdge=!1;function isIEOrEdge(){if(isDetectedIEOrEdge)return ieOrEdge;isDetectedIEOrEdge=!0;try{const e=internalWindow.navigator.userAgent;-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(ieOrEdge=!0)}catch(e){}return ieOrEdge}function isFunction(e){return"function"==typeof e}function isNumber(e){return"number"==typeof e}const OPTIMIZED_ZONE_EVENT_TASK_DATA={useG:!0},zoneSymbolEventNames={},globalSources={},EVENT_NAME_SYMBOL_REGX=new RegExp("^"+ZONE_SYMBOL_PREFIX+"(\\w+)(true|false)$"),IMMEDIATE_PROPAGATION_SYMBOL=zoneSymbol("propagationStopped");function prepareEventNames(e,t){const n=(t?t(e):e)+"false",o=(t?t(e):e)+"true",r=ZONE_SYMBOL_PREFIX+n,s=ZONE_SYMBOL_PREFIX+o;zoneSymbolEventNames[e]={},zoneSymbolEventNames[e].false=r,zoneSymbolEventNames[e].true=s}function patchEventTarget(e,t,n,o){const r=o&&o.add||"addEventListener",s=o&&o.rm||"removeEventListener",a=o&&o.listeners||"eventListeners",i=o&&o.rmAll||"removeAllListeners",c=zoneSymbol(r),l="."+r+":",h="prependListener",u="."+h+":",p=function(e,t,n){if(e.isRemoved)return;const o=e.callback;let r;"object"==typeof o&&o.handleEvent&&(e.callback=e=>o.handleEvent(e),e.originalDelegate=o);try{e.invoke(e,t,[n])}catch(e){r=e}const a=e.options;return a&&"object"==typeof a&&a.once&&t[s].call(t,n.type,e.originalDelegate?e.originalDelegate:e.callback,a),r};function f(n,o,r){if(!(o=o||e.event))return;const s=n||o.target||e,a=s[zoneSymbolEventNames[o.type][r?"true":"false"]];if(a){const e=[];if(1===a.length){const t=p(a[0],s,o);t&&e.push(t)}else{const t=a.slice();for(let n=0;n<t.length&&(!o||!0!==o[IMMEDIATE_PROPAGATION_SYMBOL]);n++){const r=p(t[n],s,o);r&&e.push(r)}}if(1===e.length)throw e[0];for(let n=0;n<e.length;n++){const o=e[n];t.nativeScheduleMicroTask((()=>{throw o}))}}}const _=function(e){return f(this,e,!1)},d=function(e){return f(this,e,!0)};function m(t,n){if(!t)return!1;let o=!0;n&&void 0!==n.useG&&(o=n.useG);const p=n&&n.vh;let f=!0;n&&void 0!==n.chkDup&&(f=n.chkDup);let m=!1;n&&void 0!==n.rt&&(m=n.rt);let g=t;for(;g&&!g.hasOwnProperty(r);)g=ObjectGetPrototypeOf(g);if(!g&&t[r]&&(g=t),!g)return!1;if(g[c])return!1;const y=n&&n.eventNameToString,k={},b=g[c]=g[r],E=g[zoneSymbol(s)]=g[s],T=g[zoneSymbol(a)]=g[a],v=g[zoneSymbol(i)]=g[i];let S;n&&n.prepend&&(S=g[zoneSymbol(n.prepend)]=g[n.prepend]);const O=o?function(e){if(!k.isExisting)return b.call(k.target,k.eventName,k.capture?d:_,k.options)}:function(e){return b.call(k.target,k.eventName,e.invoke,k.options)},w=o?function(e){if(!e.isRemoved){const t=zoneSymbolEventNames[e.eventName];let n;t&&(n=t[e.capture?"true":"false"]);const o=n&&e.target[n];if(o)for(let t=0;t<o.length;t++)if(o[t]===e){o.splice(t,1),e.isRemoved=!0,e.removeAbortListener&&(e.removeAbortListener(),e.removeAbortListener=null),0===o.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return E.call(e.target,e.eventName,e.capture?d:_,e.options)}:function(e){return E.call(e.target,e.eventName,e.invoke,e.options)},P=n?.diff||function(e,t){const n=typeof t;return"function"===n&&e.callback===t||"object"===n&&e.originalDelegate===t},Z=Zone[zoneSymbol("UNPATCHED_EVENTS")],D=e[zoneSymbol("PASSIVE_EVENTS")],N=function(t,r,s,a,i=!1,c=!1){return function(){const l=this||e;let h=arguments[0];n&&n.transferEventName&&(h=n.transferEventName(h));let u=arguments[1];if(!u)return t.apply(this,arguments);if(isNode&&"uncaughtException"===h)return t.apply(this,arguments);let _=!1;if("function"!=typeof u){if(!u.handleEvent)return t.apply(this,arguments);_=!0}if(p&&!p(t,u,l,arguments))return;const d=!!D&&-1!==D.indexOf(h),m=function b(e){if("object"==typeof e&&null!==e){const t={...e};return e.signal&&(t.signal=e.signal),t}return e}(function g(e,t){return t?"boolean"==typeof e?{capture:e,passive:!0}:e?"object"==typeof e&&!1!==e.passive?{...e,passive:!0}:e:{passive:!0}:e}(arguments[2],d)),E=m?.signal;if(E?.aborted)return;if(Z)for(let e=0;e<Z.length;e++)if(h===Z[e])return d?t.call(l,h,u,m):t.apply(this,arguments);const T=!!m&&("boolean"==typeof m||m.capture),v=!(!m||"object"!=typeof m)&&m.once,S=Zone.current;let O=zoneSymbolEventNames[h];O||(prepareEventNames(h,y),O=zoneSymbolEventNames[h]);const w=O[T?"true":"false"];let N,z=l[w],C=!1;if(z){if(C=!0,f)for(let e=0;e<z.length;e++)if(P(z[e],u))return}else z=l[w]=[];const M=l.constructor.name,I=globalSources[M];I&&(N=I[h]),N||(N=M+r+(y?y(h):h)),k.options=m,v&&(k.options.once=!1),k.target=l,k.capture=T,k.eventName=h,k.isExisting=C;const R=o?OPTIMIZED_ZONE_EVENT_TASK_DATA:void 0;R&&(R.taskData=k),E&&(k.options.signal=void 0);const j=S.scheduleEventTask(N,u,R,s,a);if(E){k.options.signal=E;const e=()=>j.zone.cancelTask(j);t.call(E,"abort",e,{once:!0}),j.removeAbortListener=()=>E.removeEventListener("abort",e)}return k.target=null,R&&(R.taskData=null),v&&(k.options.once=!0),"boolean"!=typeof j.options&&(j.options=m),j.target=l,j.capture=T,j.eventName=h,_&&(j.originalDelegate=u),c?z.unshift(j):z.push(j),i?l:void 0}};return g[r]=N(b,l,O,w,m),S&&(g[h]=N(S,u,(function(e){return S.call(k.target,k.eventName,e.invoke,k.options)}),w,m,!0)),g[s]=function(){const t=this||e;let o=arguments[0];n&&n.transferEventName&&(o=n.transferEventName(o));const r=arguments[2],s=!!r&&("boolean"==typeof r||r.capture),a=arguments[1];if(!a)return E.apply(this,arguments);if(p&&!p(E,a,t,arguments))return;const i=zoneSymbolEventNames[o];let c;i&&(c=i[s?"true":"false"]);const l=c&&t[c];if(l)for(let e=0;e<l.length;e++){const n=l[e];if(P(n,a))return l.splice(e,1),n.isRemoved=!0,0!==l.length||(n.allRemoved=!0,t[c]=null,s||"string"!=typeof o)||(t[ZONE_SYMBOL_PREFIX+"ON_PROPERTY"+o]=null),n.zone.cancelTask(n),m?t:void 0}return E.apply(this,arguments)},g[a]=function(){const t=this||e;let o=arguments[0];n&&n.transferEventName&&(o=n.transferEventName(o));const r=[],s=findEventTasks(t,y?y(o):o);for(let e=0;e<s.length;e++){const t=s[e];r.push(t.originalDelegate?t.originalDelegate:t.callback)}return r},g[i]=function(){const t=this||e;let o=arguments[0];if(o){n&&n.transferEventName&&(o=n.transferEventName(o));const e=zoneSymbolEventNames[o];if(e){const n=t[e.false],r=t[e.true];if(n){const e=n.slice();for(let t=0;t<e.length;t++){const n=e[t];this[s].call(this,o,n.originalDelegate?n.originalDelegate:n.callback,n.options)}}if(r){const e=r.slice();for(let t=0;t<e.length;t++){const n=e[t];this[s].call(this,o,n.originalDelegate?n.originalDelegate:n.callback,n.options)}}}}else{const e=Object.keys(t);for(let t=0;t<e.length;t++){const n=EVENT_NAME_SYMBOL_REGX.exec(e[t]);let o=n&&n[1];o&&"removeListener"!==o&&this[i].call(this,o)}this[i].call(this,"removeListener")}if(m)return this},attachOriginToPatched(g[r],b),attachOriginToPatched(g[s],E),v&&attachOriginToPatched(g[i],v),T&&attachOriginToPatched(g[a],T),!0}let g=[];for(let e=0;e<n.length;e++)g[e]=m(n[e],o);return g}function findEventTasks(e,t){if(!t){const n=[];for(let o in e){const r=EVENT_NAME_SYMBOL_REGX.exec(o);let s=r&&r[1];if(s&&(!t||s===t)){const t=e[o];if(t)for(let e=0;e<t.length;e++)n.push(t[e])}}return n}let n=zoneSymbolEventNames[t];n||(prepareEventNames(t),n=zoneSymbolEventNames[t]);const o=e[n.false],r=e[n.true];return o?r?o.concat(r):o.slice():r?r.slice():[]}function patchEventPrototype(e,t){const n=e.Event;n&&n.prototype&&t.patchMethod(n.prototype,"stopImmediatePropagation",(e=>function(t,n){t[IMMEDIATE_PROPAGATION_SYMBOL]=!0,e&&e.apply(t,n)}))}function patchQueueMicrotask(e,t){t.patchMethod(e,"queueMicrotask",(e=>function(e,t){Zone.current.scheduleMicroTask("queueMicrotask",t[0])}))}const taskSymbol=zoneSymbol("zoneTask");function patchTimer(e,t,n,o){let r=null,s=null;n+=o;const a={};function i(t){const n=t.data;n.args[0]=function(){return t.invoke.apply(this,arguments)};const o=r.apply(e,n.args);return isNumber(o)?n.handleId=o:(n.handle=o,n.isRefreshable=isFunction(o.refresh)),t}function c(t){const{handle:n,handleId:o}=t.data;return s.call(e,n??o)}r=patchMethod(e,t+=o,(n=>function(r,s){if(isFunction(s[0])){const e={isRefreshable:!1,isPeriodic:"Interval"===o,delay:"Timeout"===o||"Interval"===o?s[1]||0:void 0,args:s},n=s[0];s[0]=function t(){try{return n.apply(this,arguments)}finally{const{handle:t,handleId:n,isPeriodic:o,isRefreshable:r}=e;o||r||(n?delete a[n]:t&&(t[taskSymbol]=null))}};const r=scheduleMacroTaskWithCurrentZone(t,s[0],e,i,c);if(!r)return r;const{handleId:l,handle:h,isRefreshable:u,isPeriodic:p}=r.data;if(l)a[l]=r;else if(h&&(h[taskSymbol]=r,u&&!p)){const e=h.refresh;h.refresh=function(){const{zone:t,state:n}=r;return"notScheduled"===n?(r._state="scheduled",t._updateTaskCount(r,1)):"running"===n&&(r._state="scheduling"),e.call(this)}}return h??l??r}return n.apply(e,s)})),s=patchMethod(e,n,(t=>function(n,o){const r=o[0];let s;isNumber(r)?(s=a[r],delete a[r]):(s=r?.[taskSymbol],s?r[taskSymbol]=null:s=r),s?.type?s.cancelFn&&s.zone.cancelTask(s):t.apply(e,o)}))}function patchCustomElements(e,t){const{isBrowser:n,isMix:o}=t.getGlobalObjects();(n||o)&&e.customElements&&"customElements"in e&&t.patchCallbacks(t,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"])}function eventTargetPatch(e,t){if(Zone[t.symbol("patchEventTarget")])return;const{eventNames:n,zoneSymbolEventNames:o,TRUE_STR:r,FALSE_STR:s,ZONE_SYMBOL_PREFIX:a}=t.getGlobalObjects();for(let e=0;e<n.length;e++){const t=n[e],i=a+(t+s),c=a+(t+r);o[t]={},o[t][s]=i,o[t][r]=c}const i=e.EventTarget;return i&&i.prototype?(t.patchEventTarget(e,t,[i&&i.prototype]),!0):void 0}function patchEvent(e,t){t.patchEventPrototype(e,t)}function filterProperties(e,t,n){if(!n||0===n.length)return t;const o=n.filter((t=>t.target===e));if(0===o.length)return t;const r=o[0].ignoreProperties;return t.filter((e=>-1===r.indexOf(e)))}function patchFilteredProperties(e,t,n,o){e&&patchOnProperties(e,filterProperties(e,t,n),o)}function getOnEventNames(e){return Object.getOwnPropertyNames(e).filter((e=>e.startsWith("on")&&e.length>2)).map((e=>e.substring(2)))}function propertyDescriptorPatch(e,t){if(isNode&&!isMix)return;if(Zone[e.symbol("patchEvents")])return;const n=t.__Zone_ignore_on_properties;let o=[];if(isBrowser){const e=window;o=o.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);const t=[];patchFilteredProperties(e,getOnEventNames(e),n?n.concat(t):n,ObjectGetPrototypeOf(e))}o=o.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let e=0;e<o.length;e++){const r=t[o[e]];r?.prototype&&patchFilteredProperties(r.prototype,getOnEventNames(r.prototype),n)}}function patchBrowser(e){e.__load_patch("legacy",(t=>{const n=t[e.__symbol__("legacyPatch")];n&&n()})),e.__load_patch("timers",(e=>{const t="set",n="clear";patchTimer(e,t,n,"Timeout"),patchTimer(e,t,n,"Interval"),patchTimer(e,t,n,"Immediate")})),e.__load_patch("requestAnimationFrame",(e=>{patchTimer(e,"request","cancel","AnimationFrame"),patchTimer(e,"mozRequest","mozCancel","AnimationFrame"),patchTimer(e,"webkitRequest","webkitCancel","AnimationFrame")})),e.__load_patch("blocking",((e,t)=>{const n=["alert","prompt","confirm"];for(let o=0;o<n.length;o++)patchMethod(e,n[o],((n,o,r)=>function(o,s){return t.current.run(n,e,s,r)}))})),e.__load_patch("EventTarget",((e,t,n)=>{patchEvent(e,n),eventTargetPatch(e,n);const o=e.XMLHttpRequestEventTarget;o&&o.prototype&&n.patchEventTarget(e,n,[o.prototype])})),e.__load_patch("MutationObserver",((e,t,n)=>{patchClass("MutationObserver"),patchClass("WebKitMutationObserver")})),e.__load_patch("IntersectionObserver",((e,t,n)=>{patchClass("IntersectionObserver")})),e.__load_patch("FileReader",((e,t,n)=>{patchClass("FileReader")})),e.__load_patch("on_property",((e,t,n)=>{propertyDescriptorPatch(n,e)})),e.__load_patch("customElements",((e,t,n)=>{patchCustomElements(e,n)})),e.__load_patch("XHR",((e,t)=>{!function n(e){const n=e.XMLHttpRequest;if(!n)return;const l=n.prototype;let h=l[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=l[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];if(!h){const t=e.XMLHttpRequestEventTarget;if(t){const e=t.prototype;h=e[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=e[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]}}const p="readystatechange",f="scheduled";function _(e){const n=e.data,r=n.target;r[a]=!1,r[c]=!1;const i=r[s];h||(h=r[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=r[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]),i&&u.call(r,p,i);const l=r[s]=()=>{if(r.readyState===r.DONE)if(!n.aborted&&r[a]&&e.state===f){const o=r[t.__symbol__("loadfalse")];if(0!==r.status&&o&&o.length>0){const s=e.invoke;e.invoke=function(){const o=r[t.__symbol__("loadfalse")];for(let t=0;t<o.length;t++)o[t]===e&&o.splice(t,1);n.aborted||e.state!==f||s.call(e)},o.push(e)}else e.invoke()}else n.aborted||!1!==r[a]||(r[c]=!0)};return h.call(r,p,l),r[o]||(r[o]=e),b.apply(r,n.args),r[a]=!0,e}function d(){}function m(e){const t=e.data;return t.aborted=!0,E.apply(t.target,t.args)}const g=patchMethod(l,"open",(()=>function(e,t){return e[r]=0==t[2],e[i]=t[1],g.apply(e,t)})),y=zoneSymbol("fetchTaskAborting"),k=zoneSymbol("fetchTaskScheduling"),b=patchMethod(l,"send",(()=>function(e,n){if(!0===t.current[k])return b.apply(e,n);if(e[r])return b.apply(e,n);{const t={target:e,url:e[i],isPeriodic:!1,args:n,aborted:!1},o=scheduleMacroTaskWithCurrentZone("XMLHttpRequest.send",d,t,_,m);e&&!0===e[c]&&!t.aborted&&o.state===f&&o.invoke()}})),E=patchMethod(l,"abort",(()=>function(e,n){const r=function s(e){return e[o]}(e);if(r&&"string"==typeof r.type){if(null==r.cancelFn||r.data&&r.data.aborted)return;r.zone.cancelTask(r)}else if(!0===t.current[y])return E.apply(e,n)}))}(e);const o=zoneSymbol("xhrTask"),r=zoneSymbol("xhrSync"),s=zoneSymbol("xhrListener"),a=zoneSymbol("xhrScheduled"),i=zoneSymbol("xhrURL"),c=zoneSymbol("xhrErrorBeforeScheduled")})),e.__load_patch("geolocation",(e=>{e.navigator&&e.navigator.geolocation&&patchPrototype(e.navigator.geolocation,["getCurrentPosition","watchPosition"])})),e.__load_patch("PromiseRejectionEvent",((e,t)=>{function n(t){return function(n){findEventTasks(e,t).forEach((o=>{const r=e.PromiseRejectionEvent;if(r){const e=new r(t,{promise:n.promise,reason:n.rejection});o.invoke(e)}}))}}e.PromiseRejectionEvent&&(t[zoneSymbol("unhandledPromiseRejectionHandler")]=n("unhandledrejection"),t[zoneSymbol("rejectionHandledHandler")]=n("rejectionhandled"))})),e.__load_patch("queueMicrotask",((e,t,n)=>{patchQueueMicrotask(e,n)}))}function patchPromise(e){e.__load_patch("ZoneAwarePromise",((e,t,n)=>{const o=Object.getOwnPropertyDescriptor,r=Object.defineProperty,s=n.symbol,a=[],i=!1!==e[s("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],c=s("Promise"),l=s("then");n.onUnhandledError=e=>{if(n.showUncaughtError()){const t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=()=>{for(;a.length;){const e=a.shift();try{e.zone.runGuarded((()=>{if(e.throwOriginal)throw e.rejection;throw e}))}catch(e){u(e)}}};const h=s("unhandledPromiseRejectionHandler");function u(e){n.onUnhandledError(e);try{const n=t[h];"function"==typeof n&&n.call(this,e)}catch(e){}}function p(e){return e&&"function"==typeof e.then}function f(e){return e}function _(e){return M.reject(e)}const d=s("state"),m=s("value"),g=s("finally"),y=s("parentPromiseValue"),k=s("parentPromiseState"),b=null,E=!0,T=!1;function v(e,t){return n=>{try{P(e,t,n)}catch(t){P(e,!1,t)}}}const S=function(){let e=!1;return function t(n){return function(){e||(e=!0,n.apply(null,arguments))}}},O="Promise resolved with itself",w=s("currentTaskTrace");function P(e,o,s){const c=S();if(e===s)throw new TypeError(O);if(e[d]===b){let l=null;try{"object"!=typeof s&&"function"!=typeof s||(l=s&&s.then)}catch(t){return c((()=>{P(e,!1,t)}))(),e}if(o!==T&&s instanceof M&&s.hasOwnProperty(d)&&s.hasOwnProperty(m)&&s[d]!==b)D(s),P(e,s[d],s[m]);else if(o!==T&&"function"==typeof l)try{l.call(s,c(v(e,o)),c(v(e,!1)))}catch(t){c((()=>{P(e,!1,t)}))()}else{e[d]=o;const c=e[m];if(e[m]=s,e[g]===g&&o===E&&(e[d]=e[k],e[m]=e[y]),o===T&&s instanceof Error){const e=t.currentTask&&t.currentTask.data&&t.currentTask.data.__creationTrace__;e&&r(s,w,{configurable:!0,enumerable:!1,writable:!0,value:e})}for(let t=0;t<c.length;)N(e,c[t++],c[t++],c[t++],c[t++]);if(0==c.length&&o==T){e[d]=0;let o=s;try{throw new Error("Uncaught (in promise): "+function e(t){return t&&t.toString===Object.prototype.toString?(t.constructor&&t.constructor.name||"")+": "+JSON.stringify(t):t?t.toString():Object.prototype.toString.call(t)}(s)+(s&&s.stack?"\n"+s.stack:""))}catch(e){o=e}i&&(o.throwOriginal=!0),o.rejection=s,o.promise=e,o.zone=t.current,o.task=t.currentTask,a.push(o),n.scheduleMicroTask()}}}return e}const Z=s("rejectionHandledHandler");function D(e){if(0===e[d]){try{const n=t[Z];n&&"function"==typeof n&&n.call(this,{rejection:e[m],promise:e})}catch(e){}e[d]=T;for(let t=0;t<a.length;t++)e===a[t].promise&&a.splice(t,1)}}function N(e,t,n,o,r){D(e);const s=e[d],a=s?"function"==typeof o?o:f:"function"==typeof r?r:_;t.scheduleMicroTask("Promise.then",(()=>{try{const o=e[m],r=!!n&&g===n[g];r&&(n[y]=o,n[k]=s);const i=t.run(a,void 0,r&&a!==_&&a!==f?[]:[o]);P(n,!0,i)}catch(e){P(n,!1,e)}}),n)}const z=function(){},C=e.AggregateError;class M{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(e){return e instanceof M?e:P(new this(null),E,e)}static reject(e){return P(new this(null),T,e)}static withResolvers(){const e={};return e.promise=new M(((t,n)=>{e.resolve=t,e.reject=n})),e}static any(e){if(!e||"function"!=typeof e[Symbol.iterator])return Promise.reject(new C([],"All promises were rejected"));const t=[];let n=0;try{for(let o of e)n++,t.push(M.resolve(o))}catch(e){return Promise.reject(new C([],"All promises were rejected"))}if(0===n)return Promise.reject(new C([],"All promises were rejected"));let o=!1;const r=[];return new M(((e,s)=>{for(let a=0;a<t.length;a++)t[a].then((t=>{o||(o=!0,e(t))}),(e=>{r.push(e),n--,0===n&&(o=!0,s(new C(r,"All promises were rejected")))}))}))}static race(e){let t,n,o=new this(((e,o)=>{t=e,n=o}));function r(e){t(e)}function s(e){n(e)}for(let t of e)p(t)||(t=this.resolve(t)),t.then(r,s);return o}static all(e){return M.allWithCallback(e)}static allSettled(e){return(this&&this.prototype instanceof M?this:M).allWithCallback(e,{thenCallback:e=>({status:"fulfilled",value:e}),errorCallback:e=>({status:"rejected",reason:e})})}static allWithCallback(e,t){let n,o,r=new this(((e,t)=>{n=e,o=t})),s=2,a=0;const i=[];for(let r of e){p(r)||(r=this.resolve(r));const e=a;try{r.then((o=>{i[e]=t?t.thenCallback(o):o,s--,0===s&&n(i)}),(r=>{t?(i[e]=t.errorCallback(r),s--,0===s&&n(i)):o(r)}))}catch(e){o(e)}s++,a++}return s-=2,0===s&&n(i),r}constructor(e){const t=this;if(!(t instanceof M))throw new Error("Must be an instanceof Promise.");t[d]=b,t[m]=[];try{const n=S();e&&e(n(v(t,E)),n(v(t,T)))}catch(e){P(t,!1,e)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return M}then(e,n){let o=this.constructor?.[Symbol.species];o&&"function"==typeof o||(o=this.constructor||M);const r=new o(z),s=t.current;return this[d]==b?this[m].push(s,r,e,n):N(this,s,r,e,n),r}catch(e){return this.then(null,e)}finally(e){let n=this.constructor?.[Symbol.species];n&&"function"==typeof n||(n=M);const o=new n(z);o[g]=g;const r=t.current;return this[d]==b?this[m].push(r,o,e,e):N(this,r,o,e,e),o}}M.resolve=M.resolve,M.reject=M.reject,M.race=M.race,M.all=M.all;const I=e[c]=e.Promise;e.Promise=M;const R=s("thenPatched");function j(e){const t=e.prototype,n=o(t,"then");if(n&&(!1===n.writable||!n.configurable))return;const r=t.then;t[l]=r,e.prototype.then=function(e,t){return new M(((e,t)=>{r.call(this,e,t)})).then(e,t)},e[R]=!0}return n.patchThen=j,I&&(j(I),patchMethod(e,"fetch",(e=>function t(e){return function(t,n){let o=e.apply(t,n);if(o instanceof M)return o;let r=o.constructor;return r[R]||j(r),o}}(e)))),Promise[t.__symbol__("uncaughtPromiseErrors")]=a,M}))}function patchToString(e){e.__load_patch("toString",(e=>{const t=Function.prototype.toString,n=zoneSymbol("OriginalDelegate"),o=zoneSymbol("Promise"),r=zoneSymbol("Error"),s=function s(){if("function"==typeof this){const s=this[n];if(s)return"function"==typeof s?t.call(s):Object.prototype.toString.call(s);if(this===Promise){const n=e[o];if(n)return t.call(n)}if(this===Error){const n=e[r];if(n)return t.call(n)}}return t.call(this)};s[n]=t,Function.prototype.toString=s;const a=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":a.call(this)}}))}function patchCallbacks(e,t,n,o,r){const s=Zone.__symbol__(o);if(t[s])return;const a=t[s]=t[o];t[o]=function(s,i,c){return i&&i.prototype&&r.forEach((function(t){const r=`${n}.${o}::`+t,s=i.prototype;try{if(s.hasOwnProperty(t)){const n=e.ObjectGetOwnPropertyDescriptor(s,t);n&&n.value?(n.value=e.wrapWithCurrentZone(n.value,r),e._redefineProperty(i.prototype,t,n)):s[t]&&(s[t]=e.wrapWithCurrentZone(s[t],r))}else s[t]&&(s[t]=e.wrapWithCurrentZone(s[t],r))}catch{}})),a.call(t,s,i,c)},e.attachOriginToPatched(t[o],a)}function patchUtil(e){e.__load_patch("util",((e,t,n)=>{const o=getOnEventNames(e);n.patchOnProperties=patchOnProperties,n.patchMethod=patchMethod,n.bindArguments=bindArguments,n.patchMacroTask=patchMacroTask;const r=t.__symbol__("BLACK_LISTED_EVENTS"),s=t.__symbol__("UNPATCHED_EVENTS");e[s]&&(e[r]=e[s]),e[r]&&(t[r]=t[s]=e[r]),n.patchEventPrototype=patchEventPrototype,n.patchEventTarget=patchEventTarget,n.isIEOrEdge=isIEOrEdge,n.ObjectDefineProperty=ObjectDefineProperty,n.ObjectGetOwnPropertyDescriptor=ObjectGetOwnPropertyDescriptor,n.ObjectCreate=ObjectCreate,n.ArraySlice=ArraySlice,n.patchClass=patchClass,n.wrapWithCurrentZone=wrapWithCurrentZone,n.filterProperties=filterProperties,n.attachOriginToPatched=attachOriginToPatched,n._redefineProperty=Object.defineProperty,n.patchCallbacks=patchCallbacks,n.getGlobalObjects=()=>({globalSources:globalSources,zoneSymbolEventNames:zoneSymbolEventNames,eventNames:o,isBrowser:isBrowser,isMix:isMix,isNode:isNode,TRUE_STR:"true",FALSE_STR:"false",ZONE_SYMBOL_PREFIX:ZONE_SYMBOL_PREFIX,ADD_EVENT_LISTENER_STR:"addEventListener",REMOVE_EVENT_LISTENER_STR:"removeEventListener"})}))}function patchCommon(e){patchPromise(e),patchToString(e),patchUtil(e)}function patchEvents(e){e.__load_patch("EventEmitter",((e,t,n)=>{const o="addListener",r="removeListener",s=function(e,t){return e.callback===t||e.callback.listener===t},a=function(e){return"string"==typeof e?e:e?e.toString().replace("(","_").replace(")","_"):""};let i;try{i=require("events")}catch(e){}i&&i.EventEmitter&&function c(t){const i=patchEventTarget(e,n,[t],{useG:!1,add:o,rm:r,prepend:"prependListener",rmAll:"removeAllListeners",listeners:"listeners",chkDup:!1,rt:!0,diff:s,eventNameToString:a});i&&i[0]&&(t.on=t[o],t.off=t[r])}(i.EventEmitter.prototype)}))}function patchFs(e){e.__load_patch("fs",((e,t,n)=>{let o;try{o=require("fs")}catch(e){}if(!o)return;["access","appendFile","chmod","chown","close","exists","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchmod","lchown","lutimes","link","lstat","mkdir","mkdtemp","open","opendir","read","readdir","readFile","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","write","writeFile","writev"].filter((e=>!!o[e]&&"function"==typeof o[e])).forEach((e=>{patchMacroTask(o,e,((t,n)=>({name:"fs."+e,args:n,cbIdx:n.length>0?n.length-1:-1,target:t})))}));const r=o.realpath?.[n.symbol("OriginalDelegate")];r?.native&&(o.realpath.native=r.native,patchMacroTask(o.realpath,"native",((e,t)=>({args:t,target:e,cbIdx:t.length>0?t.length-1:-1,name:"fs.realpath.native"}))))}))}function patchNodeUtil(e){e.__load_patch("node_util",((e,t,n)=>{n.patchOnProperties=patchOnProperties,n.patchMethod=patchMethod,n.bindArguments=bindArguments,n.patchMacroTask=patchMacroTask,setShouldCopySymbolProperties(!0)}))}const set="set",clear="clear";function patchNode(e){patchNodeUtil(e),patchEvents(e),patchFs(e),e.__load_patch("node_timers",((e,t)=>{let n=!1;try{const t=require("timers");if(e.setTimeout!==t.setTimeout&&!isMix){const o=t.setTimeout;t.setTimeout=function(){return n=!0,o.apply(this,arguments)};const r=e.setTimeout((()=>{}),100);clearTimeout(r),t.setTimeout=o}patchTimer(t,set,clear,"Timeout"),patchTimer(t,set,clear,"Interval"),patchTimer(t,set,clear,"Immediate")}catch(e){}isMix||(n?(e[t.__symbol__("setTimeout")]=e.setTimeout,e[t.__symbol__("setInterval")]=e.setInterval,e[t.__symbol__("setImmediate")]=e.setImmediate):(patchTimer(e,set,clear,"Timeout"),patchTimer(e,set,clear,"Interval"),patchTimer(e,set,clear,"Immediate")))})),e.__load_patch("nextTick",(()=>{patchMicroTask(process,"nextTick",((e,t)=>({name:"process.nextTick",args:t,cbIdx:t.length>0&&"function"==typeof t[0]?0:-1,target:process})))})),e.__load_patch("handleUnhandledPromiseRejection",((e,t,n)=>{function o(e){return function(t){findEventTasks(process,e).forEach((n=>{"unhandledRejection"===e?n.invoke(t.rejection,t.promise):"rejectionHandled"===e&&n.invoke(t.promise)}))}}t[n.symbol("unhandledPromiseRejectionHandler")]=o("unhandledRejection"),t[n.symbol("rejectionHandledHandler")]=o("rejectionHandled")})),e.__load_patch("crypto",(()=>{let e;try{e=require("crypto")}catch(e){}e&&["randomBytes","pbkdf2"].forEach((t=>{patchMacroTask(e,t,((n,o)=>({name:"crypto."+t,args:o,cbIdx:o.length>0&&"function"==typeof o[o.length-1]?o.length-1:-1,target:e})))}))})),e.__load_patch("console",((e,t)=>{["dir","log","info","error","warn","assert","debug","timeEnd","trace"].forEach((e=>{const n=console[t.__symbol__(e)]=console[e];n&&(console[e]=function(){const e=ArraySlice.call(arguments);return t.current===t.root?n.apply(this,e):t.root.run(n,this,e)})}))})),e.__load_patch("queueMicrotask",((e,t,n)=>{patchQueueMicrotask(e,n)}))}function loadZone(){const e=globalThis,t=!0===e[__symbol__("forceDuplicateZoneCheck")];if(e.Zone&&(t||"function"!=typeof e.Zone.__symbol__))throw new Error("Zone already loaded.");return e.Zone??=initZone(),e.Zone}const Zone$1=loadZone();patchCommon(Zone$1),patchBrowser(Zone$1),patchNode(Zone$1);v:x   'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
const global = globalThis;
// __Zone_symbol_prefix global can be used to override the default zone
// symbol prefix with a custom one if needed.
function __symbol__(name) {
    const symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';
    return symbolPrefix + name;
}
function initZone() {
    const performance = global['performance'];
    function mark(name) {
        performance && performance['mark'] && performance['mark'](name);
    }
    function performanceMeasure(name, label) {
        performance && performance['measure'] && performance['measure'](name, label);
    }
    mark('Zone');
    class ZoneImpl {
        static __symbol__ = __symbol__;
        static assertZonePatched() {
            if (global['Promise'] !== patches['ZoneAwarePromise']) {
                throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
                    'has been overwritten.\n' +
                    'Most likely cause is that a Promise polyfill has been loaded ' +
                    'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
                    'If you must load one, do so before loading zone.js.)');
            }
        }
        static get root() {
            let zone = ZoneImpl.current;
            while (zone.parent) {
                zone = zone.parent;
            }
            return zone;
        }
        static get current() {
            return _currentZoneFrame.zone;
        }
        static get currentTask() {
            return _currentTask;
        }
        static __load_patch(name, fn, ignoreDuplicate = false) {
            if (patches.hasOwnProperty(name)) {
                // `checkDuplicate` option is defined from global variable
                // so it works for all modules.
                // `ignoreDuplicate` can work for the specified module
                const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
                if (!ignoreDuplicate && checkDuplicate) {
                    throw Error('Already loaded patch: ' + name);
                }
            }
            else if (!global['__Zone_disable_' + name]) {
                const perfName = 'Zone:' + name;
                mark(perfName);
                patches[name] = fn(global, ZoneImpl, _api);
                performanceMeasure(perfName, perfName);
            }
        }
        get parent() {
            return this._parent;
        }
        get name() {
            return this._name;
        }
        _parent;
        _name;
        _properties;
        _zoneDelegate;
        constructor(parent, zoneSpec) {
            this._parent = parent;
            this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '<root>';
            this._properties = (zoneSpec && zoneSpec.properties) || {};
            this._zoneDelegate = new _ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
        }
        get(key) {
            const zone = this.getZoneWith(key);
            if (zone)
                return zone._properties[key];
        }
        getZoneWith(key) {
            let current = this;
            while (current) {
                if (current._properties.hasOwnProperty(key)) {
                    return current;
                }
                current = current._parent;
            }
            return null;
        }
        fork(zoneSpec) {
            if (!zoneSpec)
                throw new Error('ZoneSpec required!');
            return this._zoneDelegate.fork(this, zoneSpec);
        }
        wrap(callback, source) {
            if (typeof callback !== 'function') {
                throw new Error('Expecting function got: ' + callback);
            }
            const _callback = this._zoneDelegate.intercept(this, callback, source);
            const zone = this;
            return function () {
                return zone.runGuarded(_callback, this, arguments, source);
            };
        }
        run(callback, applyThis, applyArgs, source) {
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
            }
            finally {
                _currentZoneFrame = _currentZoneFrame.parent;
            }
        }
        runGuarded(callback, applyThis = null, applyArgs, source) {
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                try {
                    return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
                }
                catch (error) {
                    if (this._zoneDelegate.handleError(this, error)) {
                        throw error;
                    }
                }
            }
            finally {
                _currentZoneFrame = _currentZoneFrame.parent;
            }
        }
        runTask(task, applyThis, applyArgs) {
            if (task.zone != this) {
                throw new Error('A task can only be run in the zone of creation! (Creation: ' +
                    (task.zone || NO_ZONE).name +
                    '; Execution: ' +
                    this.name +
                    ')');
            }
            const zoneTask = task;
            // https://github.com/angular/zone.js/issues/778, sometimes eventTask
            // will run in notScheduled(canceled) state, we should not try to
            // run such kind of task but just return
            const { type, data: { isPeriodic = false, isRefreshable = false } = {} } = task;
            if (task.state === notScheduled && (type === eventTask || type === macroTask)) {
                return;
            }
            const reEntryGuard = task.state != running;
            reEntryGuard && zoneTask._transitionTo(running, scheduled);
            const previousTask = _currentTask;
            _currentTask = zoneTask;
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                if (type == macroTask && task.data && !isPeriodic && !isRefreshable) {
                    task.cancelFn = undefined;
                }
                try {
                    return this._zoneDelegate.invokeTask(this, zoneTask, applyThis, applyArgs);
                }
                catch (error) {
                    if (this._zoneDelegate.handleError(this, error)) {
                        throw error;
                    }
                }
            }
            finally {
                // if the task's state is notScheduled or unknown, then it has already been cancelled
                // we should not reset the state to scheduled
                const state = task.state;
                if (state !== notScheduled && state !== unknown) {
                    if (type == eventTask || isPeriodic || (isRefreshable && state === scheduling)) {
                        reEntryGuard && zoneTask._transitionTo(scheduled, running, scheduling);
                    }
                    else {
                        const zoneDelegates = zoneTask._zoneDelegates;
                        this._updateTaskCount(zoneTask, -1);
                        reEntryGuard && zoneTask._transitionTo(notScheduled, running, notScheduled);
                        if (isRefreshable) {
                            zoneTask._zoneDelegates = zoneDelegates;
                        }
                    }
                }
                _currentZoneFrame = _currentZoneFrame.parent;
                _currentTask = previousTask;
            }
        }
        scheduleTask(task) {
            if (task.zone && task.zone !== this) {
                // check if the task was rescheduled, the newZone
                // should not be the children of the original zone
                let newZone = this;
                while (newZone) {
                    if (newZone === task.zone) {
                        throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${task.zone.name}`);
                    }
                    newZone = newZone.parent;
                }
            }
            task._transitionTo(scheduling, notScheduled);
            const zoneDelegates = [];
            task._zoneDelegates = zoneDelegates;
            task._zone = this;
            try {
                task = this._zoneDelegate.scheduleTask(this, task);
            }
            catch (err) {
                // should set task's state to unknown when scheduleTask throw error
                // because the err may from reschedule, so the fromState maybe notScheduled
                task._transitionTo(unknown, scheduling, notScheduled);
                // TODO: @JiaLiPassion, should we check the result from handleError?
                this._zoneDelegate.handleError(this, err);
                throw err;
            }
            if (task._zoneDelegates === zoneDelegates) {
                // we have to check because internally the delegate can reschedule the task.
                this._updateTaskCount(task, 1);
            }
            if (task.state == scheduling) {
                task._transitionTo(scheduled, scheduling);
            }
            return task;
        }
        scheduleMicroTask(source, callback, data, customSchedule) {
            return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
        }
        scheduleMacroTask(source, callback, data, customSchedule, customCancel) {
            return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
        }
        scheduleEventTask(source, callback, data, customSchedule, customCancel) {
            return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
        }
        cancelTask(task) {
            if (task.zone != this)
                throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
                    (task.zone || NO_ZONE).name +
                    '; Execution: ' +
                    this.name +
                    ')');
            if (task.state !== scheduled && task.state !== running) {
                return;
            }
            task._transitionTo(canceling, scheduled, running);
            try {
                this._zoneDelegate.cancelTask(this, task);
            }
            catch (err) {
                // if error occurs when cancelTask, transit the state to unknown
                task._transitionTo(unknown, canceling);
                this._zoneDelegate.handleError(this, err);
                throw err;
            }
            this._updateTaskCount(task, -1);
            task._transitionTo(notScheduled, canceling);
            task.runCount = -1;
            return task;
        }
        _updateTaskCount(task, count) {
            const zoneDelegates = task._zoneDelegates;
            if (count == -1) {
                task._zoneDelegates = null;
            }
            for (let i = 0; i < zoneDelegates.length; i++) {
                zoneDelegates[i]._updateTaskCount(task.type, count);
            }
        }
    }
    const DELEGATE_ZS = {
        name: '',
        onHasTask: (delegate, _, target, hasTaskState) => delegate.hasTask(target, hasTaskState),
        onScheduleTask: (delegate, _, target, task) => delegate.scheduleTask(target, task),
        onInvokeTask: (delegate, _, target, task, applyThis, applyArgs) => delegate.invokeTask(target, task, applyThis, applyArgs),
        onCancelTask: (delegate, _, target, task) => delegate.cancelTask(target, task),
    };
    class _ZoneDelegate {
        get zone() {
            return this._zone;
        }
        _zone;
        _taskCounts = {
            'microTask': 0,
            'macroTask': 0,
            'eventTask': 0,
        };
        _parentDelegate;
        _forkDlgt;
        _forkZS;
        _forkCurrZone;
        _interceptDlgt;
        _interceptZS;
        _interceptCurrZone;
        _invokeDlgt;
        _invokeZS;
        _invokeCurrZone;
        _handleErrorDlgt;
        _handleErrorZS;
        _handleErrorCurrZone;
        _scheduleTaskDlgt;
        _scheduleTaskZS;
        _scheduleTaskCurrZone;
        _invokeTaskDlgt;
        _invokeTaskZS;
        _invokeTaskCurrZone;
        _cancelTaskDlgt;
        _cancelTaskZS;
        _cancelTaskCurrZone;
        _hasTaskDlgt;
        _hasTaskDlgtOwner;
        _hasTaskZS;
        _hasTaskCurrZone;
        constructor(zone, parentDelegate, zoneSpec) {
            this._zone = zone;
            this._parentDelegate = parentDelegate;
            this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
            this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
            this._forkCurrZone =
                zoneSpec && (zoneSpec.onFork ? this._zone : parentDelegate._forkCurrZone);
            this._interceptZS =
                zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
            this._interceptDlgt =
                zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
            this._interceptCurrZone =
                zoneSpec && (zoneSpec.onIntercept ? this._zone : parentDelegate._interceptCurrZone);
            this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
            this._invokeDlgt =
                zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
            this._invokeCurrZone =
                zoneSpec && (zoneSpec.onInvoke ? this._zone : parentDelegate._invokeCurrZone);
            this._handleErrorZS =
                zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
            this._handleErrorDlgt =
                zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
            this._handleErrorCurrZone =
                zoneSpec && (zoneSpec.onHandleError ? this._zone : parentDelegate._handleErrorCurrZone);
            this._scheduleTaskZS =
                zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
            this._scheduleTaskDlgt =
                zoneSpec && (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
            this._scheduleTaskCurrZone =
                zoneSpec && (zoneSpec.onScheduleTask ? this._zone : parentDelegate._scheduleTaskCurrZone);
            this._invokeTaskZS =
                zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
            this._invokeTaskDlgt =
                zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
            this._invokeTaskCurrZone =
                zoneSpec && (zoneSpec.onInvokeTask ? this._zone : parentDelegate._invokeTaskCurrZone);
            this._cancelTaskZS =
                zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
            this._cancelTaskDlgt =
                zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
            this._cancelTaskCurrZone =
                zoneSpec && (zoneSpec.onCancelTask ? this._zone : parentDelegate._cancelTaskCurrZone);
            this._hasTaskZS = null;
            this._hasTaskDlgt = null;
            this._hasTaskDlgtOwner = null;
            this._hasTaskCurrZone = null;
            const zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
            const parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
            if (zoneSpecHasTask || parentHasTask) {
                // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
                // a case all task related interceptors must go through this ZD. We can't short circuit it.
                this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
                this._hasTaskDlgt = parentDelegate;
                this._hasTaskDlgtOwner = this;
                this._hasTaskCurrZone = this._zone;
                if (!zoneSpec.onScheduleTask) {
                    this._scheduleTaskZS = DELEGATE_ZS;
                    this._scheduleTaskDlgt = parentDelegate;
                    this._scheduleTaskCurrZone = this._zone;
                }
                if (!zoneSpec.onInvokeTask) {
                    this._invokeTaskZS = DELEGATE_ZS;
                    this._invokeTaskDlgt = parentDelegate;
                    this._invokeTaskCurrZone = this._zone;
                }
                if (!zoneSpec.onCancelTask) {
                    this._cancelTaskZS = DELEGATE_ZS;
                    this._cancelTaskDlgt = parentDelegate;
                    this._cancelTaskCurrZone = this._zone;
                }
            }
        }
        fork(targetZone, zoneSpec) {
            return this._forkZS
                ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec)
                : new ZoneImpl(targetZone, zoneSpec);
        }
        intercept(targetZone, callback, source) {
            return this._interceptZS
                ? this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source)
                : callback;
        }
        invoke(targetZone, callback, applyThis, applyArgs, source) {
            return this._invokeZS
                ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source)
                : callback.apply(applyThis, applyArgs);
        }
        handleError(targetZone, error) {
            return this._handleErrorZS
                ? this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error)
                : true;
        }
        scheduleTask(targetZone, task) {
            let returnTask = task;
            if (this._scheduleTaskZS) {
                if (this._hasTaskZS) {
                    returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
                }
                returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
                if (!returnTask)
                    returnTask = task;
            }
            else {
                if (task.scheduleFn) {
                    task.scheduleFn(task);
                }
                else if (task.type == microTask) {
                    scheduleMicroTask(task);
                }
                else {
                    throw new Error('Task is missing scheduleFn.');
                }
            }
            return returnTask;
        }
        invokeTask(targetZone, task, applyThis, applyArgs) {
            return this._invokeTaskZS
                ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs)
                : task.callback.apply(applyThis, applyArgs);
        }
        cancelTask(targetZone, task) {
            let value;
            if (this._cancelTaskZS) {
                value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
            }
            else {
                if (!task.cancelFn) {
                    throw Error('Task is not cancelable');
                }
                value = task.cancelFn(task);
            }
            return value;
        }
        hasTask(targetZone, isEmpty) {
            // hasTask should not throw error so other ZoneDelegate
            // can still trigger hasTask callback
            try {
                this._hasTaskZS &&
                    this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
            }
            catch (err) {
                this.handleError(targetZone, err);
            }
        }
        _updateTaskCount(type, count) {
            const counts = this._taskCounts;
            const prev = counts[type];
            const next = (counts[type] = prev + count);
            if (next < 0) {
                throw new Error('More tasks executed then were scheduled.');
            }
            if (prev == 0 || next == 0) {
                const isEmpty = {
                    microTask: counts['microTask'] > 0,
                    macroTask: counts['macroTask'] > 0,
                    eventTask: counts['eventTask'] > 0,
                    change: type,
                };
                this.hasTask(this._zone, isEmpty);
            }
        }
    }
    class ZoneTask {
        type;
        source;
        invoke;
        callback;
        data;
        scheduleFn;
        cancelFn;
        _zone = null;
        runCount = 0;
        _zoneDelegates = null;
        _state = 'notScheduled';
        constructor(type, source, callback, options, scheduleFn, cancelFn) {
            this.type = type;
            this.source = source;
            this.data = options;
            this.scheduleFn = scheduleFn;
            this.cancelFn = cancelFn;
            if (!callback) {
                throw new Error('callback is not defined');
            }
            this.callback = callback;
            const self = this;
            // TODO: @JiaLiPassion options should have interface
            if (type === eventTask && options && options.useG) {
                this.invoke = ZoneTask.invokeTask;
            }
            else {
                this.invoke = function () {
                    return ZoneTask.invokeTask.call(global, self, this, arguments);
                };
            }
        }
        static invokeTask(task, target, args) {
            if (!task) {
                task = this;
            }
            _numberOfNestedTaskFrames++;
            try {
                task.runCount++;
                return task.zone.runTask(task, target, args);
            }
            finally {
                if (_numberOfNestedTaskFrames == 1) {
                    drainMicroTaskQueue();
                }
                _numberOfNestedTaskFrames--;
            }
        }
        get zone() {
            return this._zone;
        }
        get state() {
            return this._state;
        }
        cancelScheduleRequest() {
            this._transitionTo(notScheduled, scheduling);
        }
        _transitionTo(toState, fromState1, fromState2) {
            if (this._state === fromState1 || this._state === fromState2) {
                this._state = toState;
                if (toState == notScheduled) {
                    this._zoneDelegates = null;
                }
            }
            else {
                throw new Error(`${this.type} '${this.source}': can not transition to '${toState}', expecting state '${fromState1}'${fromState2 ? " or '" + fromState2 + "'" : ''}, was '${this._state}'.`);
            }
        }
        toString() {
            if (this.data && typeof this.data.handleId !== 'undefined') {
                return this.data.handleId.toString();
            }
            else {
                return Object.prototype.toString.call(this);
            }
        }
        // add toJSON method to prevent cyclic error when
        // call JSON.stringify(zoneTask)
        toJSON() {
            return {
                type: this.type,
                state: this.state,
                source: this.source,
                zone: this.zone.name,
                runCount: this.runCount,
            };
        }
    }
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    ///  MICROTASK QUEUE
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    const symbolSetTimeout = __symbol__('setTimeout');
    const symbolPromise = __symbol__('Promise');
    const symbolThen = __symbol__('then');
    let _microTaskQueue = [];
    let _isDrainingMicrotaskQueue = false;
    let nativeMicroTaskQueuePromise;
    function nativeScheduleMicroTask(func) {
        if (!nativeMicroTaskQueuePromise) {
            if (global[symbolPromise]) {
                nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
            }
        }
        if (nativeMicroTaskQueuePromise) {
            let nativeThen = nativeMicroTaskQueuePromise[symbolThen];
            if (!nativeThen) {
                // native Promise is not patchable, we need to use `then` directly
                // issue 1078
                nativeThen = nativeMicroTaskQueuePromise['then'];
            }
            nativeThen.call(nativeMicroTaskQueuePromise, func);
        }
        else {
            global[symbolSetTimeout](func, 0);
        }
    }
    function scheduleMicroTask(task) {
        // if we are not running in any task, and there has not been anything scheduled
        // we must bootstrap the initial task creation by manually scheduling the drain
        if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
            // We are not running in Task, so we need to kickstart the microtask queue.
            nativeScheduleMicroTask(drainMicroTaskQueue);
        }
        task && _microTaskQueue.push(task);
    }
    function drainMicroTaskQueue() {
        if (!_isDrainingMicrotaskQueue) {
            _isDrainingMicrotaskQueue = true;
            while (_microTaskQueue.length) {
                const queue = _microTaskQueue;
                _microTaskQueue = [];
                for (let i = 0; i < queue.length; i++) {
                    const task = queue[i];
                    try {
                        task.zone.runTask(task, null, null);
                    }
                    catch (error) {
                        _api.onUnhandledError(error);
                    }
                }
            }
            _api.microtaskDrainDone();
            _isDrainingMicrotaskQueue = false;
        }
    }
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    ///  BOOTSTRAP
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    const NO_ZONE = { name: 'NO ZONE' };
    const notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
    const microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
    const patches = {};
    const _api = {
        symbol: __symbol__,
        currentZoneFrame: () => _currentZoneFrame,
        onUnhandledError: noop,
        microtaskDrainDone: noop,
        scheduleMicroTask: scheduleMicroTask,
        showUncaughtError: () => !ZoneImpl[__symbol__('ignoreConsoleErrorUncaughtError')],
        patchEventTarget: () => [],
        patchOnProperties: noop,
        patchMethod: () => noop,
        bindArguments: () => [],
        patchThen: () => noop,
        patchMacroTask: () => noop,
        patchEventPrototype: () => noop,
        isIEOrEdge: () => false,
        getGlobalObjects: () => undefined,
        ObjectDefineProperty: () => noop,
        ObjectGetOwnPropertyDescriptor: () => undefined,
        ObjectCreate: () => undefined,
        ArraySlice: () => [],
        patchClass: () => noop,
        wrapWithCurrentZone: () => noop,
        filterProperties: () => [],
        attachOriginToPatched: () => noop,
        _redefineProperty: () => noop,
        patchCallbacks: () => noop,
        nativeScheduleMicroTask: nativeScheduleMicroTask,
    };
    let _currentZoneFrame = { parent: null, zone: new ZoneImpl(null, null) };
    let _currentTask = null;
    let _numberOfNestedTaskFrames = 0;
    function noop() { }
    performanceMeasure('Zone', 'Zone');
    return ZoneImpl;
}

/**
 * Suppress closure compiler errors about unknown 'Zone' variable
 * @fileoverview
 * @suppress {undefinedVars,globalThis,missingRequire}
 */
/// <reference types="node"/>
// issue #989, to reduce bundle size, use short name
/** Object.getOwnPropertyDescriptor */
const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
/** Object.defineProperty */
const ObjectDefineProperty = Object.defineProperty;
/** Object.getPrototypeOf */
const ObjectGetPrototypeOf = Object.getPrototypeOf;
/** Array.prototype.slice */
const ArraySlice = Array.prototype.slice;
/** addEventListener string const */
const ADD_EVENT_LISTENER_STR = 'addEventListener';
/** removeEventListener string const */
const REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
/** true string const */
const TRUE_STR = 'true';
/** false string const */
const FALSE_STR = 'false';
/** Zone symbol prefix string const. */
const ZONE_SYMBOL_PREFIX = __symbol__('');
function wrapWithCurrentZone(callback, source) {
    return Zone.current.wrap(callback, source);
}
function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
    return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
}
const zoneSymbol = __symbol__;
const isWindowExists = typeof window !== 'undefined';
const internalWindow = isWindowExists ? window : undefined;
const _global = (isWindowExists && internalWindow) || globalThis;
const REMOVE_ATTRIBUTE = 'removeAttribute';
function bindArguments(args, source) {
    for (let i = args.length - 1; i >= 0; i--) {
        if (typeof args[i] === 'function') {
            args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
        }
    }
    return args;
}
function isPropertyWritable(propertyDesc) {
    if (!propertyDesc) {
        return true;
    }
    if (propertyDesc.writable === false) {
        return false;
    }
    return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
}
const isWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
// this code.
const isNode = !('nw' in _global) &&
    typeof _global.process !== 'undefined' &&
    _global.process.toString() === '[object process]';
const isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
// we are in electron of nw, so we are both browser and nodejs
// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
// this code.
const isMix = typeof _global.process !== 'undefined' &&
    _global.process.toString() === '[object process]' &&
    !isWebWorker &&
    !!(isWindowExists && internalWindow['HTMLElement']);
const zoneSymbolEventNames$1 = {};
const enableBeforeunloadSymbol = zoneSymbol('enable_beforeunload');
const wrapFn = function (event) {
    // https://github.com/angular/zone.js/issues/911, in IE, sometimes
    // event will be undefined, so we need to use window.event
    event = event || _global.event;
    if (!event) {
        return;
    }
    let eventNameSymbol = zoneSymbolEventNames$1[event.type];
    if (!eventNameSymbol) {
        eventNameSymbol = zoneSymbolEventNames$1[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
    }
    const target = this || event.target || _global;
    const listener = target[eventNameSymbol];
    let result;
    if (isBrowser && target === internalWindow && event.type === 'error') {
        // window.onerror have different signature
        // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
        // and onerror callback will prevent default when callback return true
        const errorEvent = event;
        result =
            listener &&
                listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
        if (result === true) {
            event.preventDefault();
        }
    }
    else {
        result = listener && listener.apply(this, arguments);
        if (
        // https://github.com/angular/angular/issues/47579
        // https://www.w3.org/TR/2011/WD-html5-20110525/history.html#beforeunloadevent
        // This is the only specific case we should check for. The spec defines that the
        // `returnValue` attribute represents the message to show the user. When the event
        // is created, this attribute must be set to the empty string.
        event.type === 'beforeunload' &&
            // To prevent any breaking changes resulting from this change, given that
            // it was already causing a significant number of failures in G3, we have hidden
            // that behavior behind a global configuration flag. Consumers can enable this
            // flag explicitly if they want the `beforeunload` event to be handled as defined
            // in the specification.
            _global[enableBeforeunloadSymbol] &&
            // The IDL event definition is `attribute DOMString returnValue`, so we check whether
            // `typeof result` is a string.
            typeof result === 'string') {
            event.returnValue = result;
        }
        else if (result != undefined && !result) {
            event.preventDefault();
        }
    }
    return result;
};
function patchProperty(obj, prop, prototype) {
    let desc = ObjectGetOwnPropertyDescriptor(obj, prop);
    if (!desc && prototype) {
        // when patch window object, use prototype to check prop exist or not
        const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
        if (prototypeDesc) {
            desc = { enumerable: true, configurable: true };
        }
    }
    // if the descriptor not exists or is not configurable
    // just return
    if (!desc || !desc.configurable) {
        return;
    }
    const onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
    if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
        return;
    }
    // A property descriptor cannot have getter/setter and be writable
    // deleting the writable and value properties avoids this error:
    //
    // TypeError: property descriptors must not specify a value or be writable when a
    // getter or setter has been specified
    delete desc.writable;
    delete desc.value;
    const originalDescGet = desc.get;
    const originalDescSet = desc.set;
    // slice(2) cuz 'onclick' -> 'click', etc
    const eventName = prop.slice(2);
    let eventNameSymbol = zoneSymbolEventNames$1[eventName];
    if (!eventNameSymbol) {
        eventNameSymbol = zoneSymbolEventNames$1[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
    }
    desc.set = function (newValue) {
        // In some versions of Windows, the `this` context may be undefined
        // in on-property callbacks.
        // To handle this edge case, we check if `this` is falsy and
        // fallback to `_global` if needed.
        let target = this;
        if (!target && obj === _global) {
            target = _global;
        }
        if (!target) {
            return;
        }
        const previousValue = target[eventNameSymbol];
        if (typeof previousValue === 'function') {
            target.removeEventListener(eventName, wrapFn);
        }
        // https://github.com/angular/zone.js/issues/978
        // If an inline handler (like `onload`) was defined before zone.js was loaded,
        // call the original descriptor's setter to clean it up.
        originalDescSet?.call(target, null);
        target[eventNameSymbol] = newValue;
        if (typeof newValue === 'function') {
            target.addEventListener(eventName, wrapFn, false);
        }
    };
    // The getter would return undefined for unassigned properties but the default value of an
    // unassigned property is null
    desc.get = function () {
        // in some of windows's onproperty callback, this is undefined
        // so we need to check it
        let target = this;
        if (!target && obj === _global) {
            target = _global;
        }
        if (!target) {
            return null;
        }
        const listener = target[eventNameSymbol];
        if (listener) {
            return listener;
        }
        else if (originalDescGet) {
            // result will be null when use inline event attribute,
            // such as <button onclick="func();">OK</button>
            // because the onclick function is internal raw uncompiled handler
            // the onclick will be evaluated when first time event was triggered or
            // the property is accessed, https://github.com/angular/zone.js/issues/525
            // so we should use original native get to retrieve the handler
            let value = originalDescGet.call(this);
            if (value) {
                desc.set.call(this, value);
                if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
                    target.removeAttribute(prop);
                }
                return value;
            }
        }
        return null;
    };
    ObjectDefineProperty(obj, prop, desc);
    obj[onPropPatchedSymbol] = true;
}
function patchOnProperties(obj, properties, prototype) {
    if (properties) {
        for (let i = 0; i < properties.length; i++) {
            patchProperty(obj, 'on' + properties[i], prototype);
        }
    }
    else {
        const onProperties = [];
        for (const prop in obj) {
            if (prop.slice(0, 2) == 'on') {
                onProperties.push(prop);
            }
        }
        for (let j = 0; j < onProperties.length; j++) {
            patchProperty(obj, onProperties[j], prototype);
        }
    }
}
function copySymbolProperties(src, dest) {
    if (typeof Object.getOwnPropertySymbols !== 'function') {
        return;
    }
    const symbols = Object.getOwnPropertySymbols(src);
    symbols.forEach((symbol) => {
        const desc = Object.getOwnPropertyDescriptor(src, symbol);
        Object.defineProperty(dest, symbol, {
            get: function () {
                return src[symbol];
            },
            set: function (value) {
                if (desc && (!desc.writable || typeof desc.set !== 'function')) {
                    // if src[symbol] is not writable or not have a setter, just return
                    return;
                }
                src[symbol] = value;
            },
            enumerable: desc ? desc.enumerable : true,
            configurable: desc ? desc.configurable : true,
        });
    });
}
let shouldCopySymbolProperties = false;
function setShouldCopySymbolProperties(flag) {
    shouldCopySymbolProperties = flag;
}
function patchMethod(target, name, patchFn) {
    let proto = target;
    while (proto && !proto.hasOwnProperty(name)) {
        proto = ObjectGetPrototypeOf(proto);
    }
    if (!proto && target[name]) {
        // somehow we did not find it, but we can see it. This happens on IE for Window properties.
        proto = target;
    }
    const delegateName = zoneSymbol(name);
    let delegate = null;
    if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
        delegate = proto[delegateName] = proto[name];
        // check whether proto[name] is writable
        // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
        const desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
        if (isPropertyWritable(desc)) {
            const patchDelegate = patchFn(delegate, delegateName, name);
            proto[name] = function () {
                return patchDelegate(this, arguments);
            };
            attachOriginToPatched(proto[name], delegate);
            if (shouldCopySymbolProperties) {
                copySymbolProperties(delegate, proto[name]);
            }
        }
    }
    return delegate;
}
// TODO: @JiaLiPassion, support cancel task later if necessary
function patchMacroTask(obj, funcName, metaCreator) {
    let setNative = null;
    function scheduleTask(task) {
        const data = task.data;
        data.args[data.cbIdx] = function () {
            task.invoke.apply(this, arguments);
        };
        setNative.apply(data.target, data.args);
        return task;
    }
    setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {
        const meta = metaCreator(self, args);
        if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
            return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
        }
        else {
            // cause an error by calling it directly.
            return delegate.apply(self, args);
        }
    });
}
function patchMicroTask(obj, funcName, metaCreator) {
    let setNative = null;
    function scheduleTask(task) {
        const data = task.data;
        data.args[data.cbIdx] = function () {
            task.invoke.apply(this, arguments);
        };
        setNative.apply(data.target, data.args);
        return task;
    }
    setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {
        const meta = metaCreator(self, args);
        if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
            return Zone.current.scheduleMicroTask(meta.name, args[meta.cbIdx], meta, scheduleTask);
        }
        else {
            // cause an error by calling it directly.
            return delegate.apply(self, args);
        }
    });
}
function attachOriginToPatched(patched, original) {
    patched[zoneSymbol('OriginalDelegate')] = original;
}
function isFunction(value) {
    return typeof value === 'function';
}
function isNumber(value) {
    return typeof value === 'number';
}

function patchPromise(Zone) {
    Zone.__load_patch('ZoneAwarePromise', (global, Zone, api) => {
        const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
        const ObjectDefineProperty = Object.defineProperty;
        function readableObjectToString(obj) {
            if (obj && obj.toString === Object.prototype.toString) {
                const className = obj.constructor && obj.constructor.name;
                return (className ? className : '') + ': ' + JSON.stringify(obj);
            }
            return obj ? obj.toString() : Object.prototype.toString.call(obj);
        }
        const __symbol__ = api.symbol;
        const _uncaughtPromiseErrors = [];
        const isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] !== false;
        const symbolPromise = __symbol__('Promise');
        const symbolThen = __symbol__('then');
        const creationTrace = '__creationTrace__';
        api.onUnhandledError = (e) => {
            if (api.showUncaughtError()) {
                const rejection = e && e.rejection;
                if (rejection) {
                    console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
                }
                else {
                    console.error(e);
                }
            }
        };
        api.microtaskDrainDone = () => {
            while (_uncaughtPromiseErrors.length) {
                const uncaughtPromiseError = _uncaughtPromiseErrors.shift();
                try {
                    uncaughtPromiseError.zone.runGuarded(() => {
                        if (uncaughtPromiseError.throwOriginal) {
                            throw uncaughtPromiseError.rejection;
                        }
                        throw uncaughtPromiseError;
                    });
                }
                catch (error) {
                    handleUnhandledRejection(error);
                }
            }
        };
        const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
        function handleUnhandledRejection(e) {
            api.onUnhandledError(e);
            try {
                const handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
                if (typeof handler === 'function') {
                    handler.call(this, e);
                }
            }
            catch (err) { }
        }
        function isThenable(value) {
            return value && typeof value.then === 'function';
        }
        function forwardResolution(value) {
            return value;
        }
        function forwardRejection(rejection) {
            return ZoneAwarePromise.reject(rejection);
        }
        const symbolState = __symbol__('state');
        const symbolValue = __symbol__('value');
        const symbolFinally = __symbol__('finally');
        const symbolParentPromiseValue = __symbol__('parentPromiseValue');
        const symbolParentPromiseState = __symbol__('parentPromiseState');
        const source = 'Promise.then';
        const UNRESOLVED = null;
        const RESOLVED = true;
        const REJECTED = false;
        const REJECTED_NO_CATCH = 0;
        function makeResolver(promise, state) {
            return (v) => {
                try {
                    resolvePromise(promise, state, v);
                }
                catch (err) {
                    resolvePromise(promise, false, err);
                }
                // Do not return value or you will break the Promise spec.
            };
        }
        const once = function () {
            let wasCalled = false;
            return function wrapper(wrappedFunction) {
                return function () {
                    if (wasCalled) {
                        return;
                    }
                    wasCalled = true;
                    wrappedFunction.apply(null, arguments);
                };
            };
        };
        const TYPE_ERROR = 'Promise resolved with itself';
        const CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
        // Promise Resolution
        function resolvePromise(promise, state, value) {
            const onceWrapper = once();
            if (promise === value) {
                throw new TypeError(TYPE_ERROR);
            }
            if (promise[symbolState] === UNRESOLVED) {
                // should only get value.then once based on promise spec.
                let then = null;
                try {
                    if (typeof value === 'object' || typeof value === 'function') {
                        then = value && value.then;
                    }
                }
                catch (err) {
                    onceWrapper(() => {
                        resolvePromise(promise, false, err);
                    })();
                    return promise;
                }
                // if (value instanceof ZoneAwarePromise) {
                if (state !== REJECTED &&
                    value instanceof ZoneAwarePromise &&
                    value.hasOwnProperty(symbolState) &&
                    value.hasOwnProperty(symbolValue) &&
                    value[symbolState] !== UNRESOLVED) {
                    clearRejectedNoCatch(value);
                    resolvePromise(promise, value[symbolState], value[symbolValue]);
                }
                else if (state !== REJECTED && typeof then === 'function') {
                    try {
                        then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
                    }
                    catch (err) {
                        onceWrapper(() => {
                            resolvePromise(promise, false, err);
                        })();
                    }
                }
                else {
                    promise[symbolState] = state;
                    const queue = promise[symbolValue];
                    promise[symbolValue] = value;
                    if (promise[symbolFinally] === symbolFinally) {
                        // the promise is generated by Promise.prototype.finally
                        if (state === RESOLVED) {
                            // the state is resolved, should ignore the value
                            // and use parent promise value
                            promise[symbolState] = promise[symbolParentPromiseState];
                            promise[symbolValue] = promise[symbolParentPromiseValue];
                        }
                    }
                    // record task information in value when error occurs, so we can
                    // do some additional work such as render longStackTrace
                    if (state === REJECTED && value instanceof Error) {
                        // check if longStackTraceZone is here
                        const trace = Zone.currentTask &&
                            Zone.currentTask.data &&
                            Zone.currentTask.data[creationTrace];
                        if (trace) {
                            // only keep the long stack trace into error when in longStackTraceZone
                            ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, {
                                configurable: true,
                                enumerable: false,
                                writable: true,
                                value: trace,
                            });
                        }
                    }
                    for (let i = 0; i < queue.length;) {
                        scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
                    }
                    if (queue.length == 0 && state == REJECTED) {
                        promise[symbolState] = REJECTED_NO_CATCH;
                        let uncaughtPromiseError = value;
                        try {
                            // Here we throws a new Error to print more readable error log
                            // and if the value is not an error, zone.js builds an `Error`
                            // Object here to attach the stack information.
                            throw new Error('Uncaught (in promise): ' +
                                readableObjectToString(value) +
                                (value && value.stack ? '\n' + value.stack : ''));
                        }
                        catch (err) {
                            uncaughtPromiseError = err;
                        }
                        if (isDisableWrappingUncaughtPromiseRejection) {
                            // If disable wrapping uncaught promise reject
                            // use the value instead of wrapping it.
                            uncaughtPromiseError.throwOriginal = true;
                        }
                        uncaughtPromiseError.rejection = value;
                        uncaughtPromiseError.promise = promise;
                        uncaughtPromiseError.zone = Zone.current;
                        uncaughtPromiseError.task = Zone.currentTask;
                        _uncaughtPromiseErrors.push(uncaughtPromiseError);
                        api.scheduleMicroTask(); // to make sure that it is running
                    }
                }
            }
            // Resolving an already resolved promise is a noop.
            return promise;
        }
        const REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
        function clearRejectedNoCatch(promise) {
            if (promise[symbolState] === REJECTED_NO_CATCH) {
                // if the promise is rejected no catch status
                // and queue.length > 0, means there is a error handler
                // here to handle the rejected promise, we should trigger
                // windows.rejectionhandled eventHandler or nodejs rejectionHandled
                // eventHandler
                try {
                    const handler = Zone[REJECTION_HANDLED_HANDLER];
                    if (handler && typeof handler === 'function') {
                        handler.call(this, { rejection: promise[symbolValue], promise: promise });
                    }
                }
                catch (err) { }
                promise[symbolState] = REJECTED;
                for (let i = 0; i < _uncaughtPromiseErrors.length; i++) {
                    if (promise === _uncaughtPromiseErrors[i].promise) {
                        _uncaughtPromiseErrors.splice(i, 1);
                    }
                }
            }
        }
        function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
            clearRejectedNoCatch(promise);
            const promiseState = promise[symbolState];
            const delegate = promiseState
                ? typeof onFulfilled === 'function'
                    ? onFulfilled
                    : forwardResolution
                : typeof onRejected === 'function'
                    ? onRejected
                    : forwardRejection;
            zone.scheduleMicroTask(source, () => {
                try {
                    const parentPromiseValue = promise[symbolValue];
                    const isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
                    if (isFinallyPromise) {
                        // if the promise is generated from finally call, keep parent promise's state and value
                        chainPromise[symbolParentPromiseValue] = parentPromiseValue;
                        chainPromise[symbolParentPromiseState] = promiseState;
                    }
                    // should not pass value to finally callback
                    const value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution
                        ? []
                        : [parentPromiseValue]);
                    resolvePromise(chainPromise, true, value);
                }
                catch (error) {
                    // if error occurs, should always return this error
                    resolvePromise(chainPromise, false, error);
                }
            }, chainPromise);
        }
        const ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
        const noop = function () { };
        const AggregateError = global.AggregateError;
        class ZoneAwarePromise {
            static toString() {
                return ZONE_AWARE_PROMISE_TO_STRING;
            }
            static resolve(value) {
                if (value instanceof ZoneAwarePromise) {
                    return value;
                }
                return resolvePromise(new this(null), RESOLVED, value);
            }
            static reject(error) {
                return resolvePromise(new this(null), REJECTED, error);
            }
            static withResolvers() {
                const result = {};
                result.promise = new ZoneAwarePromise((res, rej) => {
                    result.resolve = res;
                    result.reject = rej;
                });
                return result;
            }
            static any(values) {
                if (!values || typeof values[Symbol.iterator] !== 'function') {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                const promises = [];
                let count = 0;
                try {
                    for (let v of values) {
                        count++;
                        promises.push(ZoneAwarePromise.resolve(v));
                    }
                }
                catch (err) {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                if (count === 0) {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                let finished = false;
                const errors = [];
                return new ZoneAwarePromise((resolve, reject) => {
                    for (let i = 0; i < promises.length; i++) {
                        promises[i].then((v) => {
                            if (finished) {
                                return;
                            }
                            finished = true;
                            resolve(v);
                        }, (err) => {
                            errors.push(err);
                            count--;
                            if (count === 0) {
                                finished = true;
                                reject(new AggregateError(errors, 'All promises were rejected'));
                            }
                        });
                    }
                });
            }
            static race(values) {
                let resolve;
                let reject;
                let promise = new this((res, rej) => {
                    resolve = res;
                    reject = rej;
                });
                function onResolve(value) {
                    resolve(value);
                }
                function onReject(error) {
                    reject(error);
                }
                for (let value of values) {
                    if (!isThenable(value)) {
                        value = this.resolve(value);
                    }
                    value.then(onResolve, onReject);
                }
                return promise;
            }
            static all(values) {
                return ZoneAwarePromise.allWithCallback(values);
            }
            static allSettled(values) {
                const P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
                return P.allWithCallback(values, {
                    thenCallback: (value) => ({ status: 'fulfilled', value }),
                    errorCallback: (err) => ({ status: 'rejected', reason: err }),
                });
            }
            static allWithCallback(values, callback) {
                let resolve;
                let reject;
                let promise = new this((res, rej) => {
                    resolve = res;
                    reject = rej;
                });
                // Start at 2 to prevent prematurely resolving if .then is called immediately.
                let unresolvedCount = 2;
                let valueIndex = 0;
                const resolvedValues = [];
                for (let value of values) {
                    if (!isThenable(value)) {
                        value = this.resolve(value);
                    }
                    const curValueIndex = valueIndex;
                    try {
                        value.then((value) => {
                            resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;
                            unresolvedCount--;
                            if (unresolvedCount === 0) {
                                resolve(resolvedValues);
                            }
                        }, (err) => {
                            if (!callback) {
                                reject(err);
                            }
                            else {
                                resolvedValues[curValueIndex] = callback.errorCallback(err);
                                unresolvedCount--;
                                if (unresolvedCount === 0) {
                                    resolve(resolvedValues);
                                }
                            }
                        });
                    }
                    catch (thenErr) {
                        reject(thenErr);
                    }
                    unresolvedCount++;
                    valueIndex++;
                }
                // Make the unresolvedCount zero-based again.
                unresolvedCount -= 2;
                if (unresolvedCount === 0) {
                    resolve(resolvedValues);
                }
                return promise;
            }
            constructor(executor) {
                const promise = this;
                if (!(promise instanceof ZoneAwarePromise)) {
                    throw new Error('Must be an instanceof Promise.');
                }
                promise[symbolState] = UNRESOLVED;
                promise[symbolValue] = []; // queue;
                try {
                    const onceWrapper = once();
                    executor &&
                        executor(onceWrapper(makeResolver(promise, RESOLVED)), onceWrapper(makeResolver(promise, REJECTED)));
                }
                catch (error) {
                    resolvePromise(promise, false, error);
                }
            }
            get [Symbol.toStringTag]() {
                return 'Promise';
            }
            get [Symbol.species]() {
                return ZoneAwarePromise;
            }
            then(onFulfilled, onRejected) {
                // We must read `Symbol.species` safely because `this` may be anything. For instance, `this`
                // may be an object without a prototype (created through `Object.create(null)`); thus
                // `this.constructor` will be undefined. One of the use cases is SystemJS creating
                // prototype-less objects (modules) via `Object.create(null)`. The SystemJS creates an empty
                // object and copies promise properties into that object (within the `getOrCreateLoad`
                // function). The zone.js then checks if the resolved value has the `then` method and
                // invokes it with the `value` context. Otherwise, this will throw an error: `TypeError:
                // Cannot read properties of undefined (reading 'Symbol(Symbol.species)')`.
                let C = this.constructor?.[Symbol.species];
                if (!C || typeof C !== 'function') {
                    C = this.constructor || ZoneAwarePromise;
                }
                const chainPromise = new C(noop);
                const zone = Zone.current;
                if (this[symbolState] == UNRESOLVED) {
                    this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
                }
                else {
                    scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
                }
                return chainPromise;
            }
            catch(onRejected) {
                return this.then(null, onRejected);
            }
            finally(onFinally) {
                // See comment on the call to `then` about why thee `Symbol.species` is safely accessed.
                let C = this.constructor?.[Symbol.species];
                if (!C || typeof C !== 'function') {
                    C = ZoneAwarePromise;
                }
                const chainPromise = new C(noop);
                chainPromise[symbolFinally] = symbolFinally;
                const zone = Zone.current;
                if (this[symbolState] == UNRESOLVED) {
                    this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
                }
                else {
                    scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
                }
                return chainPromise;
            }
        }
        // Protect against aggressive optimizers dropping seemingly unused properties.
        // E.g. Closure Compiler in advanced mode.
        ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
        ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
        ZoneAwarePromise['race'] = ZoneAwarePromise.race;
        ZoneAwarePromise['all'] = ZoneAwarePromise.all;
        const NativePromise = (global[symbolPromise] = global['Promise']);
        global['Promise'] = ZoneAwarePromise;
        const symbolThenPatched = __symbol__('thenPatched');
        function patchThen(Ctor) {
            const proto = Ctor.prototype;
            const prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
            if (prop && (prop.writable === false || !prop.configurable)) {
                // check Ctor.prototype.then propertyDescriptor is writable or not
                // in meteor env, writable is false, we should ignore such case
                return;
            }
            const originalThen = proto.then;
            // Keep a reference to the original method.
            proto[symbolThen] = originalThen;
            Ctor.prototype.then = function (onResolve, onReject) {
                const wrapped = new ZoneAwarePromise((resolve, reject) => {
                    originalThen.call(this, resolve, reject);
                });
                return wrapped.then(onResolve, onReject);
            };
            Ctor[symbolThenPatched] = true;
        }
        api.patchThen = patchThen;
        function zoneify(fn) {
            return function (self, args) {
                let resultPromise = fn.apply(self, args);
                if (resultPromise instanceof ZoneAwarePromise) {
                  KԴ+  return resultPromise;
                }
                let ctor = resultPromise.constructor;
                if (!ctor[symbolThenPatched]) {
                    patchThen(ctor);
                }
                return resultPromise;
            };
        }
        if (NativePromise) {
            patchThen(NativePromise);
            patchMethod(global, 'fetch', (delegate) => zoneify(delegate));
        }
        // This is not part of public API, but it is useful for tests, so we expose it.
        Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
        return ZoneAwarePromise;
    });
}

function patchToString(Zone) {
    // override Function.prototype.toString to make zone.js patched function
    // look like native function
    Zone.__load_patch('toString', (global) => {
        // patch Func.prototype.toString to let them look like native
        const originalFunctionToString = Function.prototype.toString;
        const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
        const PROMISE_SYMBOL = zoneSymbol('Promise');
        const ERROR_SYMBOL = zoneSymbol('Error');
        const newFunctionToString = function toString() {
            if (typeof this === 'function') {
                const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
                if (originalDelegate) {
                    if (typeof originalDelegate === 'function') {
                        return originalFunctionToString.call(originalDelegate);
                    }
                    else {
                        return Object.prototype.toString.call(originalDelegate);
                    }
                }
                if (this === Promise) {
                    const nativePromise = global[PROMISE_SYMBOL];
                    if (nativePromise) {
                        return originalFunctionToString.call(nativePromise);
                    }
                }
                if (this === Error) {
                    const nativeError = global[ERROR_SYMBOL];
                    if (nativeError) {
                        return originalFunctionToString.call(nativeError);
                    }
                }
            }
            return originalFunctionToString.call(this);
        };
        newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
        Function.prototype.toString = newFunctionToString;
        // patch Object.prototype.toString to let them look like native
        const originalObjectToString = Object.prototype.toString;
        const PROMISE_OBJECT_TO_STRING = '[object Promise]';
        Object.prototype.toString = function () {
            if (typeof Promise === 'function' && this instanceof Promise) {
                return PROMISE_OBJECT_TO_STRING;
            }
            return originalObjectToString.call(this);
        };
    });
}

function loadZone() {
    // if global['Zone'] already exists (maybe zone.js was already loaded or
    // some other lib also registered a global object named Zone), we may need
    // to throw an error, but sometimes user may not want this error.
    // For example,
    // we have two web pages, page1 includes zone.js, page2 doesn't.
    // and the 1st time user load page1 and page2, everything work fine,
    // but when user load page2 again, error occurs because global['Zone'] already exists.
    // so we add a flag to let user choose whether to throw this error or not.
    // By default, if existing Zone is from zone.js, we will not throw the error.
    const global = globalThis;
    const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
    if (global['Zone'] && (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function')) {
        throw new Error('Zone already loaded.');
    }
    // Initialize global `Zone` constant.
    global['Zone'] ??= initZone();
    return global['Zone'];
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
// an identifier to tell ZoneTask do not create a new invoke closure
const OPTIMIZED_ZONE_EVENT_TASK_DATA = {
    useG: true,
};
const zoneSymbolEventNames = {};
const globalSources = {};
const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
function prepareEventNames(eventName, eventNameToString) {
    const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
    const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
    const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
    const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
    zoneSymbolEventNames[eventName] = {};
    zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
    zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
}
function patchEventTarget(_global, api, apis, patchOptions) {
    const ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
    const REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
    const LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
    const REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
    const zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
    const ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
    const PREPEND_EVENT_LISTENER = 'prependListener';
    const PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
    const invokeTask = function (task, target, event) {
        // for better performance, check isRemoved which is set
        // by removeEventListener
        if (task.isRemoved) {
            return;
        }
        const delegate = task.callback;
        if (typeof delegate === 'object' && delegate.handleEvent) {
            // create the bind version of handleEvent when invoke
            task.callback = (event) => delegate.handleEvent(event);
            task.originalDelegate = delegate;
        }
        // invoke static task.invoke
        // need to try/catch error here, otherwise, the error in one event listener
        // will break the executions of the other event listeners. Also error will
        // not remove the event listener when `once` options is true.
        let error;
        try {
            task.invoke(task, target, [event]);
        }
        catch (err) {
            error = err;
        }
        const options = task.options;
        if (options && typeof options === 'object' && options.once) {
            // if options.once is true, after invoke once remove listener here
            // only browser need to do this, nodejs eventEmitter will cal removeListener
            // inside EventEmitter.once
            const delegate = task.originalDelegate ? task.originalDelegate : task.callback;
            target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate, options);
        }
        return error;
    };
    function globalCallback(context, event, isCapture) {
        // https://github.com/angular/zone.js/issues/911, in IE, sometimes
        // event will be undefined, so we need to use window.event
        event = event || _global.event;
        if (!event) {
            return;
        }
        // event.target is needed for Samsung TV and SourceBuffer
        // || global is needed https://github.com/angular/zone.js/issues/190
        const target = context || event.target || _global;
        const tasks = target[zoneSymbolEventNames[event.type][isCapture ? TRUE_STR : FALSE_STR]];
        if (tasks) {
            const errors = [];
            // invoke all tasks which attached to current target with given event.type and capture = false
            // for performance concern, if task.length === 1, just invoke
            if (tasks.length === 1) {
                const err = invokeTask(tasks[0], target, event);
                err && errors.push(err);
            }
            else {
                // https://github.com/angular/zone.js/issues/836
                // copy the tasks array before invoke, to avoid
                // the callback will remove itself or other listener
                const copyTasks = tasks.slice();
                for (let i = 0; i < copyTasks.length; i++) {
                    if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
                        break;
                    }
                    const err = invokeTask(copyTasks[i], target, event);
                    err && errors.push(err);
                }
            }
            // Since there is only one error, we don't need to schedule microTask
            // to throw the error.
            if (errors.length === 1) {
                throw errors[0];
            }
            else {
                for (let i = 0; i < errors.length; i++) {
                    const err = errors[i];
                    api.nativeScheduleMicroTask(() => {
                        throw err;
                    });
                }
            }
        }
    }
    // global shared zoneAwareCallback to handle all event callback with capture = false
    const globalZoneAwareCallback = function (event) {
        return globalCallback(this, event, false);
    };
    // global shared zoneAwareCallback to handle all event callback with capture = true
    const globalZoneAwareCaptureCallback = function (event) {
        return globalCallback(this, event, true);
    };
    function patchEventTargetMethods(obj, patchOptions) {
        if (!obj) {
            return false;
        }
        let useGlobalCallback = true;
        if (patchOptions && patchOptions.useG !== undefined) {
            useGlobalCallback = patchOptions.useG;
        }
        const validateHandler = patchOptions && patchOptions.vh;
        let checkDuplicate = true;
        if (patchOptions && patchOptions.chkDup !== undefined) {
            checkDuplicate = patchOptions.chkDup;
        }
        let returnTarget = false;
        if (patchOptions && patchOptions.rt !== undefined) {
            returnTarget = patchOptions.rt;
        }
        let proto = obj;
        while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
            proto = ObjectGetPrototypeOf(proto);
        }
        if (!proto && obj[ADD_EVENT_LISTENER]) {
            // somehow we did not find it, but we can see it. This happens on IE for Window properties.
            proto = obj;
        }
        if (!proto) {
            return false;
        }
        if (proto[zoneSymbolAddEventListener]) {
            return false;
        }
        const eventNameToString = patchOptions && patchOptions.eventNameToString;
        // We use a shared global `taskData` to pass data for `scheduleEventTask`,
        // eliminating the need to create a new object solely for passing data.
        // WARNING: This object has a static lifetime, meaning it is not created
        // each time `addEventListener` is called. It is instantiated only once
        // and captured by reference inside the `addEventListener` and
        // `removeEventListener` functions. Do not add any new properties to this
        // object, as doing so would necessitate maintaining the information
        // between `addEventListener` calls.
        const taskData = {};
        const nativeAddEventListener = (proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER]);
        const nativeRemoveEventListener = (proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
            proto[REMOVE_EVENT_LISTENER]);
        const nativeListeners = (proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
            proto[LISTENERS_EVENT_LISTENER]);
        const nativeRemoveAllListeners = (proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
            proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER]);
        let nativePrependEventListener;
        if (patchOptions && patchOptions.prepend) {
            nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
                proto[patchOptions.prepend];
        }
        /**
         * This util function will build an option object with passive option
         * to handle all possible input from the user.
         */
        function buildEventListenerOptions(options, passive) {
            if (!passive) {
                return options;
            }
            if (typeof options === 'boolean') {
                return { capture: options, passive: true };
            }
            if (!options) {
                return { passive: true };
            }
            if (typeof options === 'object' && options.passive !== false) {
                return { ...options, passive: true };
            }
            return options;
        }
        const customScheduleGlobal = function (task) {
            // if there is already a task for the eventName + capture,
            // just return, because we use the shared globalZoneAwareCallback here.
            if (taskData.isExisting) {
                return;
            }
            return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
        };
        /**
         * In the context of events and listeners, this function will be
         * called at the end by `cancelTask`, which, in turn, calls `task.cancelFn`.
         * Cancelling a task is primarily used to remove event listeners from
         * the task target.
         */
        const customCancelGlobal = function (task) {
            // if task is not marked as isRemoved, this call is directly
            // from Zone.prototype.cancelTask, we should remove the task
            // from tasksList of target first
            if (!task.isRemoved) {
                const symbolEventNames = zoneSymbolEventNames[task.eventName];
                let symbolEventName;
                if (symbolEventNames) {
                    symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
                }
                const existingTasks = symbolEventName && task.target[symbolEventName];
                if (existingTasks) {
                    for (let i = 0; i < existingTasks.length; i++) {
                        const existingTask = existingTasks[i];
                        if (existingTask === task) {
                            existingTasks.splice(i, 1);
                            // set isRemoved to data for faster invokeTask check
                            task.isRemoved = true;
                            if (task.removeAbortListener) {
                                task.removeAbortListener();
                                task.removeAbortListener = null;
                            }
                            if (existingTasks.length === 0) {
                                // all tasks for the eventName + capture have gone,
                                // remove globalZoneAwareCallback and remove the task cache from target
                                task.allRemoved = true;
                                task.target[symbolEventName] = null;
                            }
                            break;
                        }
                    }
                }
            }
            // if all tasks for the eventName + capture have gone,
            // we will really remove the global event callback,
            // if not, return
            if (!task.allRemoved) {
                return;
            }
            return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
        };
        const customScheduleNonGlobal = function (task) {
            return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
        };
        const customSchedulePrepend = function (task) {
            return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
        };
        const customCancelNonGlobal = function (task) {
            return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
        };
        const customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
        const customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
        const compareTaskCallbackVsDelegate = function (task, delegate) {
            const typeOfDelegate = typeof delegate;
            return ((typeOfDelegate === 'function' && task.callback === delegate) ||
                (typeOfDelegate === 'object' && task.originalDelegate === delegate));
        };
        const compare = patchOptions?.diff || compareTaskCallbackVsDelegate;
        const unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];
        const passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];
        function copyEventListenerOptions(options) {
            if (typeof options === 'object' && options !== null) {
                // We need to destructure the target `options` object since it may
                // be frozen or sealed (possibly provided implicitly by a third-party
                // library), or its properties may be readonly.
                const newOptions = { ...options };
                // The `signal` option was recently introduced, which caused regressions in
                // third-party scenarios where `AbortController` was directly provided to
                // `addEventListener` as options. For instance, in cases like
                // `document.addEventListener('keydown', callback, abortControllerInstance)`,
                // which is valid because `AbortController` includes a `signal` getter, spreading
                // `{...options}` wouldn't copy the `signal`. Additionally, using `Object.create`
                // isn't feasible since `AbortController` is a built-in object type, and attempting
                // to create a new object directly with it as the prototype might result in
                // unexpected behavior.
                if (options.signal) {
                    newOptions.signal = options.signal;
                }
                return newOptions;
            }
            return options;
        }
        const makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget = false, prepend = false) {
            return function () {
                const target = this || _global;
                let eventName = arguments[0];
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                let delegate = arguments[1];
                if (!delegate) {
                    return nativeListener.apply(this, arguments);
                }
                if (isNode && eventName === 'uncaughtException') {
                    // don't patch uncaughtException of nodejs to prevent endless loop
                    return nativeListener.apply(this, arguments);
                }
                // To improve `addEventListener` performance, we will create the callback
                // for the task later when the task is invoked.
                let isEventListenerObject = false;
                if (typeof delegate !== 'function') {
                    // This checks whether the provided listener argument is an object with
                    // a `handleEvent` method (since we can call `addEventListener` with a
                    // function `event => ...` or with an object `{ handleEvent: event => ... }`).
                    if (!delegate.handleEvent) {
                        return nativeListener.apply(this, arguments);
                    }
                    isEventListenerObject = true;
                }
                if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
                    return;
                }
                const passive = !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
                const options = copyEventListenerOptions(buildEventListenerOptions(arguments[2], passive));
                const signal = options?.signal;
                if (signal?.aborted) {
                    // the signal is an aborted one, just return without attaching the event listener.
                    return;
                }
                if (unpatchedEvents) {
                    // check unpatched list
                    for (let i = 0; i < unpatchedEvents.length; i++) {
                        if (eventName === unpatchedEvents[i]) {
                            if (passive) {
                                return nativeListener.call(target, eventName, delegate, options);
                            }
                            else {
                                return nativeListener.apply(this, arguments);
                            }
                        }
                    }
                }
                const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
                const once = options && typeof options === 'object' ? options.once : false;
                const zone = Zone.current;
                let symbolEventNames = zoneSymbolEventNames[eventName];
                if (!symbolEventNames) {
                    prepareEventNames(eventName, eventNameToString);
                    symbolEventNames = zoneSymbolEventNames[eventName];
                }
                const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
                let existingTasks = target[symbolEventName];
                let isExisting = false;
                if (existingTasks) {
                    // already have task registered
                    isExisting = true;
                    if (checkDuplicate) {
                        for (let i = 0; i < existingTasks.length; i++) {
                            if (compare(existingTasks[i], delegate)) {
                                // same callback, same capture, same event name, just return
                                return;
                            }
                        }
                    }
                }
                else {
                    existingTasks = target[symbolEventName] = [];
                }
                let source;
                const constructorName = target.constructor['name'];
                const targetSource = globalSources[constructorName];
                if (targetSource) {
                    source = targetSource[eventName];
                }
                if (!source) {
                    source =
                        constructorName +
                            addSource +
                            (eventNameToString ? eventNameToString(eventName) : eventName);
                }
                // In the code below, `options` should no longer be reassigned; instead, it
                // should only be mutated. This is because we pass that object to the native
                // `addEventListener`.
                // It's generally recommended to use the same object reference for options.
                // This ensures consistency and avoids potential issues.
                taskData.options = options;
                if (once) {
                    // When using `addEventListener` with the `once` option, we don't pass
                    // the `once` option directly to the native `addEventListener` method.
                    // Instead, we keep the `once` setting and handle it ourselves.
                    taskData.options.once = false;
                }
                taskData.target = target;
                taskData.capture = capture;
                taskData.eventName = eventName;
                taskData.isExisting = isExisting;
                const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
                // keep taskData into data to allow onScheduleEventTask to access the task information
                if (data) {
                    data.taskData = taskData;
                }
                if (signal) {
                    // When using `addEventListener` with the `signal` option, we don't pass
                    // the `signal` option directly to the native `addEventListener` method.
                    // Instead, we keep the `signal` setting and handle it ourselves.
                    taskData.options.signal = undefined;
                }
                // The `scheduleEventTask` function will ultimately call `customScheduleGlobal`,
                // which in turn calls the native `addEventListener`. This is why `taskData.options`
                // is updated before scheduling the task, as `customScheduleGlobal` uses
                // `taskData.options` to pass it to the native `addEventListener`.
                const task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
                if (signal) {
                    // after task is scheduled, we need to store the signal back to task.options
                    taskData.options.signal = signal;
                    // Wrapping `task` in a weak reference would not prevent memory leaks. Weak references are
                    // primarily used for preventing strong references cycles. `onAbort` is always reachable
                    // as it's an event listener, so its closure retains a strong reference to the `task`.
                    const onAbort = () => task.zone.cancelTask(task);
                    nativeListener.call(signal, 'abort', onAbort, { once: true });
                    // We need to remove the `abort` listener when the event listener is going to be removed,
                    // as it creates a closure that captures `task`. This closure retains a reference to the
                    // `task` object even after it goes out of scope, preventing `task` from being garbage
                    // collected.
                    task.removeAbortListener = () => signal.removeEventListener('abort', onAbort);
                }
                // should clear taskData.target to avoid memory leak
                // issue, https://github.com/angular/angular/issues/20442
                taskData.target = null;
                // need to clear up taskData because it is a global object
                if (data) {
                    data.taskData = null;
                }
                // have to save those information to task in case
                // application may call task.zone.cancelTask() directly
                if (once) {
                    taskData.options.once = true;
                }
                if (typeof task.options !== 'boolean') {
                    // We should save the options on the task (if it's an object) because
                    // we'll be using `task.options` later when removing the event listener
                    // and passing it back to `removeEventListener`.
                    task.options = options;
                }
                task.target = target;
                task.capture = capture;
                task.eventName = eventName;
                if (isEventListenerObject) {
                    // save original delegate for compare to check duplicate
                    task.originalDelegate = delegate;
                }
                if (!prepend) {
                    existingTasks.push(task);
                }
                else {
                    existingTasks.unshift(task);
                }
                if (returnTarget) {
                    return target;
                }
            };
        };
        proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
        if (nativePrependEventListener) {
            proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
        }
        proto[REMOVE_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (patchOptions && patchOptions.transferEventName) {
                eventName = patchOptions.transferEventName(eventName);
            }
            const options = arguments[2];
            const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
            const delegate = arguments[1];
            if (!delegate) {
                return nativeRemoveEventListener.apply(this, arguments);
            }
            if (validateHandler &&
                !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
                return;
            }
            const symbolEventNames = zoneSymbolEventNames[eventName];
            let symbolEventName;
            if (symbolEventNames) {
                symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
            }
            const existingTasks = symbolEventName && target[symbolEventName];
            // `existingTasks` may not exist if the `addEventListener` was called before
            // it was patched by zone.js. Please refer to the attached issue for
            // clarification, particularly after the `if` condition, before calling
            // the native `removeEventListener`.
            if (existingTasks) {
                for (let i = 0; i < existingTasks.length; i++) {
                    const existingTask = existingTasks[i];
                    if (compare(existingTask, delegate)) {
                        existingTasks.splice(i, 1);
                        // set isRemoved to data for faster invokeTask check
                        existingTask.isRemoved = true;
                        if (existingTasks.length === 0) {
                            // all tasks for the eventName + capture have gone,
                            // remove globalZoneAwareCallback and remove the task cache from target
                            existingTask.allRemoved = true;
                            target[symbolEventName] = null;
                            // in the target, we have an event listener which is added by on_property
                            // such as target.onclick = function() {}, so we need to clear this internal
                            // property too if all delegates with capture=false were removed
                            // https:// github.com/angular/angular/issues/31643
                            // https://github.com/angular/angular/issues/54581
                            if (!capture && typeof eventName === 'string') {
                                const onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;
                                target[onPropertySymbol] = null;
                            }
                        }
                        // In all other conditions, when `addEventListener` is called after being
                        // patched by zone.js, we would always find an event task on the `EventTarget`.
                        // This will trigger `cancelFn` on the `existingTask`, leading to `customCancelGlobal`,
                        // which ultimately removes an event listener and cleans up the abort listener
                        // (if an `AbortSignal` was provided when scheduling a task).
                        existingTask.zone.cancelTask(existingTask);
                        if (returnTarget) {
                            return target;
                        }
                        return;
                    }
                }
            }
            // https://github.com/angular/zone.js/issues/930
            // We may encounter a situation where the `addEventListener` was
            // called on the event target before zone.js is loaded, resulting
            // in no task being stored on the event target due to its invocation
            // of the native implementation. In this scenario, we simply need to
            // invoke the native `removeEventListener`.
            return nativeRemoveEventListener.apply(this, arguments);
        };
        proto[LISTENERS_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (patchOptions && patchOptions.transferEventName) {
                eventName = patchOptions.transferEventName(eventName);
            }
            const listeners = [];
            const tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
            for (let i = 0; i < tasks.length; i++) {
                const task = tasks[i];
                let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                listeners.push(delegate);
            }
            return listeners;
        };
        proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (!eventName) {
                const keys = Object.keys(target);
                for (let i = 0; i < keys.length; i++) {
                    const prop = keys[i];
                    const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
                    let evtName = match && match[1];
                    // in nodejs EventEmitter, removeListener event is
                    // used for monitoring the removeListener call,
                    // so just keep removeListener eventListener until
                    // all other eventListeners are removed
                    if (evtName && evtName !== 'removeListener') {
                        this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
                    }
                }
                // remove removeListener listener finally
                this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
            }
            else {
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                const symbolEventNames = zoneSymbolEventNames[eventName];
                if (symbolEventNames) {
                    const symbolEventName = symbolEventNames[FALSE_STR];
                    const symbolCaptureEventName = symbolEventNames[TRUE_STR];
                    const tasks = target[symbolEventName];
                    const captureTasks = target[symbolCaptureEventName];
                    if (tasks) {
                        const removeTasks = tasks.slice();
                        for (let i = 0; i < removeTasks.length; i++) {
                            const task = removeTasks[i];
                            let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                            this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                        }
                    }
                    if (captureTasks) {
                        const removeTasks = captureTasks.slice();
                        for (let i = 0; i < removeTasks.length; i++) {
                            const task = removeTasks[i];
                            let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                            this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                        }
                    }
                }
            }
            if (returnTarget) {
                return this;
            }
        };
        // for native toString patch
        attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
        attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
        if (nativeRemoveAllListeners) {
            attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
        }
        if (nativeListeners) {
            attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
        }
        return true;
    }
    let results = [];
    for (let i = 0; i < apis.length; i++) {
        results[i] = patchEventTargetMethods(apis[i], patchOptions);
    }
    return results;
}
function findEventTasks(target, eventName) {
    if (!eventName) {
        const foundTasks = [];
        for (let prop in target) {
            const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
            let evtName = match && match[1];
            if (evtName && (!eventName || evtName === eventName)) {
                const tasks = target[prop];
                if (tasks) {
                    for (let i = 0; i < tasks.length; i++) {
                        foundTasks.push(tasks[i]);
                    }
                }
            }
        }
        return foundTasks;
    }
    let symbolEventName = zoneSymbolEventNames[eventName];
    if (!symbolEventName) {
        prepareEventNames(eventName);
        symbolEventName = zoneSymbolEventNames[eventName];
    }
    const captureFalseTasks = target[symbolEventName[FALSE_STR]];
    const captureTrueTasks = target[symbolEventName[TRUE_STR]];
    if (!captureFalseTasks) {
        return captureTrueTasks ? captureTrueTasks.slice() : [];
    }
    else {
        return captureTrueTasks
            ? captureFalseTasks.concat(captureTrueTasks)
            : captureFalseTasks.slice();
    }
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
function patchQueueMicrotask(global, api) {
    api.patchMethod(global, 'queueMicrotask', (delegate) => {
        return function (self, args) {
            Zone.current.scheduleMicroTask('queueMicrotask', args[0]);
        };
    });
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
const taskSymbol = zoneSymbol('zoneTask');
function patchTimer(window, setName, cancelName, nameSuffix) {
    let setNative = null;
    let clearNative = null;
    setName += nameSuffix;
    cancelName += nameSuffix;
    const tasksByHandleId = {};
    function scheduleTask(task) {
        const data = task.data;
        data.args[0] = function () {
            return task.invoke.apply(this, arguments);
        };
        const handleOrId = setNative.apply(window, data.args);
        // Whlist on Node.js when get can the ID by using `[Symbol.toPrimitive]()` we do
        // to this so that we do not cause potentally leaks when using `setTimeout`
        // since this can be periodic when using `.refresh`.
        if (isNumber(handleOrId)) {
            data.handleId = handleOrId;
        }
        else {
            data.handle = handleOrId;
            // On Node.js a timeout and interval can be restarted over and over again by using the `.refresh` method.
            data.isRefreshable = isFunction(handleOrId.refresh);
        }
        return task;
    }
    function clearTask(task) {
        const { handle, handleId } = task.data;
        return clearNative.call(window, handle ?? handleId);
    }
    setNative = patchMethod(window, setName, (delegate) => function (self, args) {
        if (isFunction(args[0])) {
            const options = {
                isRefreshable: false,
                isPeriodic: nameSuffix === 'Interval',
                delay: nameSuffix === 'Timeout' || nameSuffix === 'Interval' ? args[1] || 0 : undefined,
                args: args,
            };
            const callback = args[0];
            args[0] = function timer() {
                try {
                    return callback.apply(this, arguments);
                }
                finally {
                    // issue-934, task will be cancelled
                    // even it is a periodic task such as
                    // setInterval
                    // https://github.com/angular/angular/issues/40387
                    // Cleanup tasksByHandleId should be handled before scheduleTask
                    // Since some zoneSpec may intercept and doesn't trigger
                    // scheduleFn(scheduleTask) provided here.
                    const { handle, handleId, isPeriodic, isRefreshable } = options;
                    if (!isPeriodic && !isRefreshable) {
                        if (handleId) {
                            // in non-nodejs env, we remove timerId
                            // from local cache
                            delete tasksByHandleId[handleId];
                        }
                        else if (handle) {
                            // Node returns complex objects as handleIds
                            // we remove task reference from timer object
                            handle[taskSymbol] = null;
                        }
                    }
                }
            };
            const task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
            if (!task) {
                return task;
            }
            // Node.js must additionally support the ref and unref functions.
            const { handleId, handle, isRefreshable, isPeriodic } = task.data;
            if (handleId) {
                // for non nodejs env, we save handleId: task
                // mapping in local cache for clearTimeout
                tasksByHandleId[handleId] = task;
            }
            else if (handle) {
                // for nodejs env, we save task
                // reference in timerId Object for clearTimeout
                handle[taskSymbol] = task;
                if (isRefreshable && !isPeriodic) {
                    const originalRefresh = handle.refresh;
                    handle.refresh = function () {
                        const { zone, state } = task;
                        if (state === 'notScheduled') {
                            task._state = 'scheduled';
                            zone._updateTaskCount(task, 1);
                        }
                        else if (state === 'running') {
                            task._state = 'scheduling';
                        }
                        return originalRefresh.call(this);
                    };
                }
            }
            return handle ?? handleId ?? task;
        }
        else {
            // cause an error by calling it directly.
            return delegate.apply(window, args);
        }
    });
    clearNative = patchMethod(window, cancelName, (delegate) => function (self, args) {
        const id = args[0];
        let task;
        if (isNumber(id)) {
            // non nodejs env.
            task = tasksByHandleId[id];
            delete tasksByHandleId[id];
        }
        else {
            // nodejs env ?? other environments.
            task = id?.[taskSymbol];
            if (task) {
                id[taskSymbol] = null;
            }
            else {
                task = id;
            }
        }
        if (task?.type) {
            if (task.cancelFn) {
                // Do not cancel already canceled functions
                task.zone.cancelTask(task);
            }
        }
        else {
            // cause an error by calling it directly.
            delegate.apply(window, args);
        }
    });
}

function patchEvents(Zone) {
    Zone.__load_patch('EventEmitter', (global, Zone, api) => {
        // For EventEmitter
        const EE_ADD_LISTENER = 'addListener';
        const EE_PREPEND_LISTENER = 'prependListener';
        const EE_REMOVE_LISTENER = 'removeListener';
        const EE_REMOVE_ALL_LISTENER = 'removeAllListeners';
        const EE_LISTENERS = 'listeners';
        const EE_ON = 'on';
        const EE_OFF = 'off';
        const compareTaskCallbackVsDelegate = function (task, delegate) {
            // same callback, same capture, same event name, just return
            return task.callback === delegate || task.callback.listener === delegate;
        };
        const eventNameToString = function (eventName) {
            if (typeof eventName === 'string') {
                return eventName;
            }
            if (!eventName) {
                return '';
            }
            return eventName.toString().replace('(', '_').replace(')', '_');
        };
        function patchEventEmitterMethods(obj) {
            const result = patchEventTarget(global, api, [obj], {
                useG: false,
                add: EE_ADD_LISTENER,
                rm: EE_REMOVE_LISTENER,
                prepend: EE_PREPEND_LISTENER,
                rmAll: EE_REMOVE_ALL_LISTENER,
                listeners: EE_LISTENERS,
                chkDup: false,
                rt: true,
                diff: compareTaskCallbackVsDelegate,
                eventNameToString: eventNameToString,
            });
            if (result && result[0]) {
                obj[EE_ON] = obj[EE_ADD_LISTENER];
                obj[EE_OFF] = obj[EE_REMOVE_LISTENER];
            }
        }
        // EventEmitter
        let events;
        try {
            events = require('events');
        }
        catch (err) { }
        if (events && events.EventEmitter) {
            patchEventEmitterMethods(events.EventEmitter.prototype);
        }
    });
}

function patchFs(Zone) {
    Zone.__load_patch('fs', (global, Zone, api) => {
        let fs;
        try {
            fs = require('fs');
        }
        catch (err) { }
        if (!fs)
            return;
        // watch, watchFile, unwatchFile has been patched
        // because EventEmitter has been patched
        const TO_PATCH_MACROTASK_METHODS = [
            'access',
            'appendFile',
            'chmod',
            'chown',
            'close',
            'exists',
            'fchmod',
            'fchown',
            'fdatasync',
            'fstat',
            'fsync',
            'ftruncate',
            'futimes',
            'lchmod',
            'lchown',
            'lutimes',
            'link',
            'lstat',
            'mkdir',
            'mkdtemp',
            'open',
            'opendir',
            'read',
            'readdir',
            'readFile',
            'readlink',
            'realpath',
            'rename',
            'rmdir',
            'stat',
            'symlink',
            'truncate',
            'unlink',
            'utimes',
            'write',
            'writeFile',
            'writev',
        ];
        TO_PATCH_MACROTASK_METHODS.filter((name) => !!fs[name] && typeof fs[name] === 'function').forEach((name) => {
            patchMacroTask(fs, name, (self, args) => {
                return {
                    name: 'fs.' + name,
                    args: args,
                    cbIdx: args.length > 0 ? args.length - 1 : -1,
                    target: self,
                };
            });
        });
        const realpathOriginalDelegate = fs.realpath?.[api.symbol('OriginalDelegate')];
        // This is the only specific method that should be additionally patched because the previous
        // `patchMacroTask` has overridden the `realpath` function and its `native` property.
        if (realpathOriginalDelegate?.native) {
            fs.realpath.native = realpathOriginalDelegate.native;
            patchMacroTask(fs.realpath, 'native', (self, args) => ({
                args,
                target: self,
                cbIdx: args.length > 0 ? args.length - 1 : -1,
                name: 'fs.realpath.native',
            }));
        }
    });
}

function patchNodeUtil(Zone) {
    Zone.__load_patch('node_util', (global, Zone, api) => {
        api.patchOnProperties = patchOnProperties;
        api.patchMethod = patchMethod;
        api.bindArguments = bindArguments;
        api.patchMacroTask = patchMacroTask;
        setShouldCopySymbolProperties(true);
    });
}

const set = 'set';
const clear = 'clear';
function patchNode(Zone) {
    patchNodeUtil(Zone);
    patchEvents(Zone);
    patchFs(Zone);
    Zone.__load_patch('node_timers', (global, Zone) => {
        // Timers
        let globalUseTimeoutFromTimer = false;
        try {
            const timers = require('timers');
            let globalEqualTimersTimeout = global.setTimeout === timers.setTimeout;
            if (!globalEqualTimersTimeout && !isMix) {
                // 1. if isMix, then we are in mix environment such as Electron
                // we should only patch timers.setTimeout because global.setTimeout
                // have been patched
                // 2. if global.setTimeout not equal timers.setTimeout, check
                // whether global.setTimeout use timers.setTimeout or not
                const originSetTimeout = timers.setTimeout;
                timers.setTimeout = function () {
                    globalUseTimeoutFromTimer = true;
                    return originSetTimeout.apply(this, arguments);
                };
                const detectTimeout = global.setTimeout(() => { }, 100);
                clearTimeout(detectTimeout);
                timers.setTimeout = originSetTimeout;
            }
            patchTimer(timers, set, clear, 'Timeout');
            patchTimer(timers, set, clear, 'Interval');
            patchTimer(timers, set, clear, 'Immediate');
        }
        catch (error) {
            // timers module not exists, for example, when we using nativeScript
            // timers is not available
        }
        if (isMix) {
            // if we are in mix environment, such as Electron,
            // the global.setTimeout has already been patched,
            // so we just patch timers.setTimeout
            return;
        }
        if (!globalUseTimeoutFromTimer) {
            // 1. global setTimeout equals timers setTimeout
            // 2. or global don't use timers setTimeout(maybe some other library patch setTimeout)
            // 3. or load timers module error happens, we should patch global setTimeout
            patchTimer(global, set, clear, 'Timeout');
            patchTimer(global, set, clear, 'Interval');
            patchTimer(global, set, clear, 'Immediate');
        }
        else {
            // global use timers setTimeout, but not equals
            // this happens when use nodejs v0.10.x, global setTimeout will
            // use a lazy load version of timers setTimeout
            // we should not double patch timer's setTimeout
            // so we only store the __symbol__ for consistency
            global[Zone.__symbol__('setTimeout')] = global.setTimeout;
            global[Zone.__symbol__('setInterval')] = global.setInterval;
            global[Zone.__symbol__('setImmediate')] = global.setImmediate;
        }
    });
    // patch process related methods
    Zone.__load_patch('nextTick', () => {
        // patch nextTick as microTask
        patchMicroTask(process, 'nextTick', (self, args) => {
            return {
                name: 'process.nextTick',
                args: args,
                cbIdx: args.length > 0 && typeof args[0] === 'function' ? 0 : -1,
                target: process,
            };
        });
    });
    Zone.__load_patch('handleUnhandledPromiseRejection', (global, Zone, api) => {
        Zone[api.symbol('unhandledPromiseRejectionHandler')] =
            findProcessPromiseRejectionHandler('unhandledRejection');
        Zone[api.symbol('rejectionHandledHandler')] =
            findProcessPromiseRejectionHandler('rejectionHandled');
        // handle unhandled promise rejection
        function findProcessPromiseRejectionHandler(evtName) {
            return function (e) {
                const eventTasks = findEventTasks(process, evtName);
                eventTasks.forEach((eventTask) => {
                    // process has added unhandledrejection event listener
                    // trigger the event listener
                    if (evtName === 'unhandledRejection') {
                        eventTask.invoke(e.rejection, e.promise);
                    }
                    else if (evtName === 'rejectionHandled') {
                        eventTask.invoke(e.promise);
                    }
                });
            };
        }
    });
    // Crypto
    Zone.__load_patch('crypto', () => {
        let crypto;
        try {
            crypto = require('crypto');
        }
        catch (err) { }
        // use the generic patchMacroTask to patch crypto
        if (crypto) {
            const methodNames = ['randomBytes', 'pbkdf2'];
            methodNames.forEach((name) => {
                patchMacroTask(crypto, name, (self, args) => {
                    return {
                        name: 'crypto.' + name,
                        args: args,
                        cbIdx: args.length > 0 && typeof args[args.length - 1] === 'function' ? args.length - 1 : -1,
                        target: crypto,
                    };
                });
            });
        }
    });
    Zone.__load_patch('console', (global, Zone) => {
        const consoleMethods = [
            'dir',
            'log',
            'info',
            'error',
            'warn',
            'assert',
            'debug',
            'timeEnd',
            'trace',
        ];
        consoleMethods.forEach((m) => {
            const originalMethod = (console[Zone.__symbol__(m)] = console[m]);
            if (originalMethod) {
                console[m] = function () {
                    const args = ArraySlice.call(arguments);
                    if (Zone.current === Zone.root) {
                        return originalMethod.apply(this, args);
                    }
                    else {
                        return Zone.root.run(originalMethod, this, args);
                    }
                };
            }
        });
    });
    Zone.__load_patch('queueMicrotask', (global, Zone, api) => {
        patchQueueMicrotask(global, api);
    });
}

function rollupMain() {
    const Zone = loadZone();
    patchNode(Zone); // Node needs to come first.
    patchPromise(Zone);
    patchToString(Zone);
    return Zone;
}

rollupMain();
Jx"{"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */const global=globalThis;function __symbol__(e){return(global.__Zone_symbol_prefix||"__zone_symbol__")+e}function initZone(){const e=global.performance;function t(t){e&&e.mark&&e.mark(t)}function n(t,n){e&&e.measure&&e.measure(t,n)}t("Zone");class o{static __symbol__=__symbol__;static assertZonePatched(){if(global.Promise!==Z.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let e=o.current;for(;e.parent;)e=e.parent;return e}static get current(){return D.zone}static get currentTask(){return z}static __load_patch(e,r,s=!1){if(Z.hasOwnProperty(e)){const t=!0===global[__symbol__("forceDuplicateZoneCheck")];if(!s&&t)throw Error("Already loaded patch: "+e)}else if(!global["__Zone_disable_"+e]){const s="Zone:"+e;t(s),Z[e]=r(global,o,P),n(s,s)}}get parent(){return this._parent}get name(){return this._name}_parent;_name;_properties;_zoneDelegate;constructor(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new s(this,this._parent&&this._parent._zoneDelegate,t)}get(e){const t=this.getZoneWith(e);if(t)return t._properties[e]}getZoneWith(e){let t=this;for(;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null}fork(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)}wrap(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);const n=this._zoneDelegate.intercept(this,e,t),o=this;return function(){return o.runGuarded(n,this,arguments,t)}}run(e,t,n,o){D={parent:D,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,o)}finally{D=D.parent}}runGuarded(e,t=null,n,o){D={parent:D,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,o)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{D=D.parent}}runTask(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||k).name+"; Execution: "+this.name+")");const o=e,{type:r,data:{isPeriodic:s=!1,isRefreshable:a=!1}={}}=e;if(e.state===g&&(r===w||r===S))return;const i=e.state!=T;i&&o._transitionTo(T,y);const l=z;z=o,D={parent:D,zone:this};try{r!=S||!e.data||s||a||(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,o,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{const t=e.state;if(t!==g&&t!==v)if(r==w||s||a&&t===m)i&&o._transitionTo(y,T,m);else{const e=o._zoneDelegates;this._updateTaskCount(o,-1),i&&o._transitionTo(g,T,g),a&&(o._zoneDelegates=e)}D=D.parent,z=l}}scheduleTask(e){if(e.zone&&e.zone!==this){let t=this;for(;t;){if(t===e.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${e.zone.name}`);t=t.parent}}e._transitionTo(m,g);const t=[];e._zoneDelegates=t,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(v,m,g),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===t&&this._updateTaskCount(e,1),e.state==m&&e._transitionTo(y,m),e}scheduleMicroTask(e,t,n,o){return this.scheduleTask(new a(E,e,t,n,o,void 0))}scheduleMacroTask(e,t,n,o,r){return this.scheduleTask(new a(S,e,t,n,o,r))}scheduleEventTask(e,t,n,o,r){return this.scheduleTask(new a(w,e,t,n,o,r))}cancelTask(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||k).name+"; Execution: "+this.name+")");if(e.state===y||e.state===T){e._transitionTo(b,y,T);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(v,b),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(g,b),e.runCount=-1,e}}_updateTaskCount(e,t){const n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(let o=0;o<n.length;o++)n[o]._updateTaskCount(e.type,t)}}const r={name:"",onHasTask:(e,t,n,o)=>e.hasTask(n,o),onScheduleTask:(e,t,n,o)=>e.scheduleTask(n,o),onInvokeTask:(e,t,n,o,r,s)=>e.invokeTask(n,o,r,s),onCancelTask:(e,t,n,o)=>e.cancelTask(n,o)};class s{get zone(){return this._zone}_zone;_taskCounts={microTask:0,macroTask:0,eventTask:0};_parentDelegate;_forkDlgt;_forkZS;_forkCurrZone;_interceptDlgt;_interceptZS;_interceptCurrZone;_invokeDlgt;_invokeZS;_invokeCurrZone;_handleErrorDlgt;_handleErrorZS;_handleErrorCurrZone;_scheduleTaskDlgt;_scheduleTaskZS;_scheduleTaskCurrZone;_invokeTaskDlgt;_invokeTaskZS;_invokeTaskCurrZone;_cancelTaskDlgt;_cancelTaskZS;_cancelTaskCurrZone;_hasTaskDlgt;_hasTaskDlgtOwner;_hasTaskZS;_hasTaskCurrZone;constructor(e,t,n){this._zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this._zone:t._forkCurrZone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this._zone:t._interceptCurrZone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this._zone:t._invokeCurrZone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this._zone:t._handleErrorCurrZone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this._zone:t._scheduleTaskCurrZone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this._zone:t._invokeTaskCurrZone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this._zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const o=n&&n.onHasTask;(o||t&&t._hasTaskZS)&&(this._hasTaskZS=o?n:r,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,n.onScheduleTask||(this._scheduleTaskZS=r,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this._zone),n.onInvokeTask||(this._invokeTaskZS=r,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this._zone),n.onCancelTask||(this._cancelTaskZS=r,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this._zone))}fork(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new o(e,t)}intercept(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t}invoke(e,t,n,o,r){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,o,r):t.apply(n,o)}handleError(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)}scheduleTask(e,t){let n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t),n||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=E)throw new Error("Task is missing scheduleFn.");_(t)}return n}invokeTask(e,t,n,o){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,o):t.callback.apply(n,o)}cancelTask(e,t){let n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n}hasTask(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}}_updateTaskCount(e,t){const n=this._taskCounts,o=n[e],r=n[e]=o+t;if(r<0)throw new Error("More tasks executed then were scheduled.");0!=o&&0!=r||this.hasTask(this._zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})}}class a{type;source;invoke;callback;data;scheduleFn;cancelFn;_zone=null;runCount=0;_zoneDelegates=null;_state="notScheduled";constructor(e,t,n,o,r,s){if(this.type=e,this.source=t,this.data=o,this.scheduleFn=r,this.cancelFn=s,!n)throw new Error("callback is not defined");this.callback=n;const i=this;this.invoke=e===w&&o&&o.useG?a.invokeTask:function(){return a.invokeTask.call(global,i,this,arguments)}}static invokeTask(e,t,n){e||(e=this),O++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==O&&d(),O--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(g,m)}_transitionTo(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(`${this.type} '${this.source}': can not transition to '${e}', expecting state '${t}'${n?" or '"+n+"'":""}, was '${this._state}'.`);this._state=e,e==g&&(this._zoneDelegates=null)}toString(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const i=__symbol__("setTimeout"),l=__symbol__("Promise"),c=__symbol__("then");let h,u=[],p=!1;function f(e){if(h||global[l]&&(h=global[l].resolve(0)),h){let t=h[c];t||(t=h.then),t.call(h,e)}else global[i](e,0)}function _(e){0===O&&0===u.length&&f(d),e&&u.push(e)}function d(){if(!p){for(p=!0;u.length;){const e=u;u=[];for(let t=0;t<e.length;t++){const n=e[t];try{n.zone.runTask(n,null,null)}catch(e){P.onUnhandledError(e)}}}P.microtaskDrainDone(),p=!1}}const k={name:"NO ZONE"},g="notScheduled",m="scheduling",y="scheduled",T="running",b="canceling",v="unknown",E="microTask",S="macroTask",w="eventTask",Z={},P={symbol:__symbol__,currentZoneFrame:()=>D,onUnhandledError:C,microtaskDrainDone:C,scheduleMicroTask:_,showUncaughtError:()=>!o[__symbol__("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:C,patchMethod:()=>C,bindArguments:()=>[],patchThen:()=>C,patchMacroTask:()=>C,patchEventPrototype:()=>C,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>C,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>C,wrapWithCurrentZone:()=>C,filterProperties:()=>[],attachOriginToPatched:()=>C,_redefineProperty:()=>C,patchCallbacks:()=>C,nativeScheduleMicroTask:f};let D={parent:null,zone:new o(null,null)},z=null,O=0;function C(){}return n("Zone","Zone"),o}const ObjectGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,ObjectDefineProperty=Object.defineProperty,ObjectGetPrototypeOf=Object.getPrototypeOf,ArraySlice=Array.prototype.slice,ADD_EVENT_LISTENER_STR="addEventListener",REMOVE_EVENT_LISTENER_STR="removeEventListener",TRUE_STR="true",FALSE_STR="false",ZONE_SYMBOL_PREFIX=__symbol__("");function wrapWithCurrentZone(e,t){return Zone.current.wrap(e,t)}function scheduleMacroTaskWithCurrentZone(e,t,n,o,r){return Zone.current.scheduleMacroTask(e,t,n,o,r)}const zoneSymbol=__symbol__,isWindowExists="undefined"!=typeof window,internalWindow=isWindowExists?window:void 0,_global=isWindowExists&&internalWindow||globalThis,REMOVE_ATTRIBUTE="removeAttribute";function bindArguments(e,t){for(let n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=wrapWithCurrentZone(e[n],t+"_"+n));return e}function isPropertyWritable(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}const isWebWorker="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,isNode=!("nw"in _global)&&void 0!==_global.process&&"[object process]"===_global.process.toString(),isBrowser=!isNode&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),isMix=void 0!==_global.process&&"[object process]"===_global.process.toString()&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),zoneSymbolEventNames$1={},enableBeforeunloadSymbol=zoneSymbol("enable_beforeunload"),wrapFn=function(e){if(!(e=e||_global.event))return;let t=zoneSymbolEventNames$1[e.type];t||(t=zoneSymbolEventNames$1[e.type]=zoneSymbol("ON_PROPERTY"+e.type));const n=this||e.target||_global,o=n[t];let r;return isBrowser&&n===internalWindow&&"error"===e.type?(r=o&&o.call(this,e.message,e.filename,e.lineno,e.colno,e.error),!0===r&&e.preventDefault()):(r=o&&o.apply(this,arguments),"beforeunload"===e.type&&_global[enableBeforeunloadSymbol]&&"string"==typeof r?e.returnValue=r:null==r||r||e.preventDefault()),r};function patchProperty(e,t,n){let o=ObjectGetOwnPropertyDescriptor(e,t);if(!o&&n&&ObjectGetOwnPropertyDescriptor(n,t)&&(o={enumerable:!0,configurable:!0}),!o||!o.configurable)return;const r=zoneSymbol("on"+t+"patched");if(e.hasOwnProperty(r)&&e[r])return;delete o.writable,delete o.value;const s=o.get,a=o.set,i=t.slice(2);let l=zoneSymbolEventNames$1[i];l||(l=zoneSymbolEventNames$1[i]=zoneSymbol("ON_PROPERTY"+i)),o.set=function(t){let n=this;n||e!==_global||(n=_global),n&&("function"==typeof n[l]&&n.removeEventListener(i,wrapFn),a?.call(n,null),n[l]=t,"function"==typeof t&&n.addEventListener(i,wrapFn,!1))},o.get=function(){let n=this;if(n||e!==_global||(n=_global),!n)return null;const r=n[l];if(r)return r;if(s){let e=s.call(this);if(e)return o.set.call(this,e),"function"==typeof n[REMOVE_ATTRIBUTE]&&n.removeAttribute(t),e}return null},ObjectDefineProperty(e,t,o),e[r]=!0}function patchOnProperties(e,t,n){if(t)for(let o=0;o<t.length;o++)patchProperty(e,"on"+t[o],n);else{const t=[];for(const n in e)"on"==n.slice(0,2)&&t.push(n);for(let o=0;o<t.length;o++)patchProperty(e,t[o],n)}}function copySymbolProperties(e,t){"function"==typeof Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach((n=>{const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,{get:function(){return e[n]},set:function(t){(!o||o.writable&&"function"==typeof o.set)&&(e[n]=t)},enumerable:!o||o.enumerable,configurable:!o||o.configurable})}))}let shouldCopySymbolProperties=!1;function setShouldCopySymbolProperties(e){shouldCopySymbolProperties=e}function patchMethod(e,t,n){let o=e;for(;o&&!o.hasOwnProperty(t);)o=ObjectGetPrototypeOf(o);!o&&e[t]&&(o=e);const r=zoneSymbol(t);let s=null;if(o&&(!(s=o[r])||!o.hasOwnProperty(r))&&(s=o[r]=o[t],isPropertyWritable(o&&ObjectGetOwnPropertyDescriptor(o,t)))){const e=n(s,r,t);o[t]=function(){return e(this,arguments)},attachOriginToPatched(o[t],s),shouldCopySymbolProperties&&copySymbolProperties(s,o[t])}return s}function patchMacroTask(e,t,n){let o=null;function r(e){const t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}o=patchMethod(e,t,(e=>function(t,o){const s=n(t,o);return s.cbIdx>=0&&"function"==typeof o[s.cbIdx]?scheduleMacroTaskWithCurrentZone(s.name,o[s.cbIdx],s,r):e.apply(t,o)}))}function patchMicroTask(e,t,n){let o=null;function r(e){const t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}o=patchMethod(e,t,(e=>function(t,o){const s=n(t,o);return s.cbIdx>=0&&"function"==typeof o[s.cbIdx]?Zone.current.scheduleMicroTask(s.name,o[s.cbIdx],s,r):e.apply(t,o)}))}function attachOriginToPatched(e,t){e[zoneSymbol("OriginalDelegate")]=t}function isFunction(e){return"function"==typeof e}function isNumber(e){return"number"==typeof e}function patchPromise(e){e.__load_patch("ZoneAwarePromise",((e,t,n)=>{const o=Object.getOwnPropertyDescriptor,r=Object.defineProperty,s=n.symbol,a=[],i=!1!==e[s("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],l=s("Promise"),c=s("then");n.onUnhandledError=e=>{if(n.showUncaughtError()){const t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=()=>{for(;a.length;){const e=a.shift();try{e.zone.runGuarded((()=>{if(e.throwOriginal)throw e.rejection;throw e}))}catch(e){u(e)}}};const h=s("unhandledPromiseRejectionHandler");function u(e){n.onUnhandledError(e);try{const n=t[h];"function"==typeof n&&n.call(this,e)}catch(e){}}function p(e){return e&&"function"==typeof e.then}function f(e){return e}function _(e){return j.reject(e)}const d=s("state"),k=s("value"),g=s("finally"),m=s("parentPromiseValue"),y=s("parentPromiseState"),T=null,b=!0,v=!1;function E(e,t){return n=>{try{P(e,t,n)}catch(t){P(e,!1,t)}}}const S=function(){let e=!1;return function t(n){return function(){e||(e=!0,n.apply(null,arguments))}}},w="Promise resolved with itself",Z=s("currentTaskTrace");function P(e,o,s){const l=S();if(e===s)throw new TypeError(w);if(e[d]===T){let c=null;try{"object"!=typeof s&&"function"!=typeof s||(c=s&&s.then)}catch(t){return l((()=>{P(e,!1,t)}))(),e}if(o!==v&&s instanceof j&&s.hasOwnProperty(d)&&s.hasOwnProperty(k)&&s[d]!==T)z(s),P(e,s[d],s[k]);else if(o!==v&&"function"==typeof c)try{c.call(s,l(E(e,o)),l(E(e,!1)))}catch(t){l((()=>{P(e,!1,t)}))()}else{e[d]=o;const l=e[k];if(e[k]=s,e[g]===g&&o===b&&(e[d]=e[y],e[k]=e[m]),o===v&&s instanceof Error){const e=t.currentTask&&t.currentTask.data&&t.currentTask.data.__creationTrace__;e&&r(s,Z,{configurable:!0,enumerable:!1,writable:!0,value:e})}for(let t=0;t<l.length;)O(e,l[t++],l[t++],l[t++],l[t++]);if(0==l.length&&o==v){e[d]=0;let o=s;try{throw new Error("Uncaught (in promise): "+function e(t){return t&&t.toString===Object.prototype.toString?(t.constructor&&t.constructor.name||"")+": "+JSON.stringify(t):t?t.toString():Object.prototype.toString.call(t)}(s)+(s&&s.stack?"\n"+s.stack:""))}catch(e){o=e}i&&(o.throwOriginal=!0),o.rejection=s,o.promise=e,o.zone=t.current,o.task=t.currentTask,a.push(o),n.scheduleMicroTask()}}}return e}const D=s("rejectionHandledHandler");function z(e){if(0===e[d]){try{const n=t[D];n&&"function"==typeof n&&n.call(this,{rejection:e[k],promise:e})}catch(e){}e[d]=v;for(let t=0;t<a.length;t++)e===a[t].promise&&a.splice(t,1)}}function O(e,t,n,o,r){z(e);const s=e[d],a=s?"function"==typeof o?o:f:"function"==typeof r?r:_;t.scheduleMicroTask("Promise.then",(()=>{try{const o=e[k],r=!!n&&g===n[g];r&&(n[m]=o,n[y]=s);const i=t.run(a,void 0,r&&a!==_&&a!==f?[]:[o]);P(n,!0,i)}catch(e){P(n,!1,e)}}),n)}const C=function(){},N=e.AggregateError;class j{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(e){return e instanceof j?e:P(new this(null),b,e)}static reject(e){return P(new this(null),v,e)}static withResolvers(){const e={};return e.promise=new j(((t,n)=>{e.resolve=t,e.reject=n})),e}static any(e){if(!e||"function"!=typeof e[Symbol.iterator])return Promise.reject(new N([],"All promises were rejected"));const t=[];let n=0;try{for(let o of e)n++,t.push(j.resolve(o))}catch(e){return Promise.reject(new N([],"All promises were rejected"))}if(0===n)return Promise.reject(new N([],"All promises were rejected"));let o=!1;const r=[];return new j(((e,s)=>{for(let a=0;a<t.length;a++)t[a].then((t=>{o||(o=!0,e(t))}),(e=>{r.push(e),n--,0===n&&(o=!0,s(new N(r,"All promises were rejected")))}))}))}static race(e){let t,n,o=new this(((e,o)=>{t=e,n=o}));function r(e){t(e)}function s(e){n(e)}for(let t of e)p(t)||(t=this.resolve(t)),t.then(r,s);return o}static all(e){return j.allWithCallback(e)}static allSettled(e){return(this&&this.prototype instanceof j?this:j).allWithCallback(e,{thenCallback:e=>({status:"fulfilled",value:e}),errorCallback:e=>({status:"rejected",reason:e})})}static allWithCallback(e,t){let n,o,r=new this(((e,t)=>{n=e,o=t})),s=2,a=0;const i=[];for(let r of e){p(r)||(r=this.resolve(r));const e=a;try{r.then((o=>{i[e]=t?t.thenCallback(o):o,s--,0===s&&n(i)}),(r=>{t?(i[e]=t.errorCallback(r),s--,0===s&&n(i)):o(r)}))}catch(e){o(e)}s++,a++}return s-=2,0===s&&n(i),r}constructor(e){const t=this;if(!(t instanceof j))throw new Error("Must be an instanceof Promise.");t[d]=T,t[k]=[];try{const n=S();e&&e(n(E(t,b)),n(E(t,v)))}catch(e){P(t,!1,e)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return j}then(e,n){let o=this.constructor?.[Symbol.species];o&&"function"==typeof o||(o=this.constructor||j);const r=new o(C),s=t.current;return this[d]==T?this[k].push(s,r,e,n):O(this,s,r,e,n),r}catch(e){return this.then(null,e)}finally(e){let n=this.constructor?.[Symbol.species];n&&"function"==typeof n||(n=j);const o=new n(C);o[g]=g;const r=t.current;return this[d]==T?this[k].push(r,o,e,e):O(this,r,o,e,e),o}}j.resolve=j.resolve,j.reject=j.reject,j.race=j.race,j.all=j.all;const M=e[l]=e.Promise;e.Promise=j;const I=s("thenPatched");function A(e){const t=e.prototype,n=o(t,"then");if(n&&(!1===n.writable||!n.configurable))return;const r=t.then;t[c]=r,e.prototype.then=function(e,t){return new j(((e,t)=>{r.call(this,e,t)})).then(e,t)},e[I]=!0}return n.patchThen=A,M&&(A(M),patchMethod(e,"fetch",(e=>function t(e){return function(t,n){let o=e.apply(t,n);if(o instanceof j)return o;let r=o.constructor;return r[I]||A(r),o}}(e)))),Promise[t.__symbol__("uncaughtPromiseErrors")]=a,j}))}function patchToString(e){e.__load_patch("toString",(e=>{const t=Function.prototype.toString,n=zoneSymbol("OriginalDelegate"),o=zoneSymbol("Promise"),r=zoneSymbol("Error"),s=function s(){if("function"==typeof this){const s=this[n];if(s)return"function"==typeof s?t.call(s):Object.prototype.toString.call(s);if(this===Promise){const n=e[o];if(n)return t.call(n)}if(this===Error){const n=e[r];if(n)return t.call(n)}}return t.call(this)};s[n]=t,Function.prototype.toString=s;const a=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":a.call(this)}}))}function loadZone(){const e=globalThis,t=!0===e[__symbol__("forceDuplicateZoneCheck")];if(e.Zone&&(t||"function"!=typeof e.Zone.__symbol__))throw new Error("Zone already loaded.");return e.Zone??=initZone(),e.Zone}const OPTIMIZED_ZONE_EVENT_TASK_DATA={useG:!0},zoneSymbolEventNames={},globalSources={},EVENT_NAME_SYMBOL_REGX=new RegExp("^"+ZONE_SYMBOL_PREFIX+"(\\w+)(true|false)$"),IMMEDIATE_PROPAGATION_SYMBOL=zoneSymbol("propagationStopped");function prepareEventNames(e,t){const n=(t?t(e):e)+"false",o=(t?t(e):e)+"true",r=ZONE_SYMBOL_PREFIX+n,s=ZONE_SYMBOL_PREFIX+o;zoneSymbolEventNames[e]={},zoneSymbolEventNames[e].false=r,zoneSymbolEventNames[e].true=s}function patchEventTarget(e,t,n,o){const r=o&&o.add||"addEventListener",s=o&&o.rm||"removeEventListener",a=o&&o.listeners||"eventListeners",i=o&&o.rmAll||"removeAllListeners",l=zoneSymbol(r),c="."+r+":",h="prependListener",u="."+h+":",p=function(e,t,n){if(e.isRemoved)return;const o=e.callback;let r;"object"==typeof o&&o.handleEvent&&(e.callback=e=>o.handleEvent(e),e.originalDelegate=o);try{e.invoke(e,t,[n])}catch(e){r=e}const a=e.options;return a&&"object"==typeof a&&a.once&&t[s].call(t,n.type,e.originalDelegate?e.originalDelegate:e.callback,a),r};function f(n,o,r){if(!(o=o||e.event))return;const s=n||o.target||e,a=s[zoneSymbolEventNames[o.type][r?"true":"false"]];if(a){const e=[];if(1===a.length){const t=p(a[0],s,o);t&&e.push(t)}else{const t=a.slice();for(let n=0;n<t.length&&(!o||!0!==o[IMMEDIATE_PROPAGATION_SYMBOL]);n++){const r=p(t[n],s,o);r&&e.push(r)}}if(1===e.length)throw e[0];for(let n=0;n<e.length;n++){const o=e[n];t.nativeScheduleMicroTask((()=>{throw o}))}}}const _=function(e){return f(this,e,!1)},d=function(e){return f(this,e,!0)};function k(t,n){if(!t)return!1;let o=!0;n&&void 0!==n.useG&&(o=n.useG);const p=n&&n.vh;let f=!0;n&&void 0!==n.chkDup&&(f=n.chkDup);let k=!1;n&&void 0!==n.rt&&(k=n.rt);let g=t;for(;g&&!g.hasOwnProperty(r);)g=ObjectGetPrototypeOf(g);if(!g&&t[r]&&(g=t),!g)return!1;if(g[l])return!1;const m=n&&n.eventNameToString,y={},T=g[l]=g[r],b=g[zoneSymbol(s)]=g[s],v=g[zoneSymbol(a)]=g[a],E=g[zoneSymbol(i)]=g[i];let S;n&&n.prepend&&(S=g[zoneSymbol(n.prepend)]=g[n.prepend]);const w=o?function(e){if(!y.isExisting)return T.call(y.target,y.eventName,y.capture?d:_,y.options)}:function(e){return T.call(y.target,y.eventName,e.invoke,y.options)},Z=o?function(e){if(!e.isRemoved){const t=zoneSymbolEventNames[e.eventName];let n;t&&(n=t[e.capture?"true":"false"]);const o=n&&e.target[n];if(o)for(let t=0;t<o.length;t++)if(o[t]===e){o.splice(t,1),e.isRemoved=!0,e.removeAbortListener&&(e.removeAbortListener(),e.removeAbortListener=null),0===o.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return b.call(e.target,e.eventName,e.capture?d:_,e.options)}:function(e){return b.call(e.target,e.eventName,e.invoke,e.options)},P=n?.diff||function(e,t){const n=typeof t;return"function"===n&&e.callback===t||"object"===n&&e.originalDelegate===t},D=Zone[zoneSymbol("UNPATCHED_EVENTS")],z=e[zoneSymbol("PASSIVE_EVENTS")],O=function(t,r,s,a,i=!1,l=!1){return function(){const c=this||e;let h=arguments[0];n&&n.transferEventName&&(h=n.transferEventName(h));let u=arguments[1];if(!u)return t.apply(this,arguments);if(isNode&&"uncaughtException"===h)return t.apply(this,arguments);let _=!1;if("function"!=typeof u){if(!u.handleEvent)return t.apply(this,arguments);_=!0}if(p&&!p(t,u,c,arguments))return;const d=!!z&&-1!==z.indexOf(h),k=function T(e){if("object"==typeof e&&null!==e){const t={...e};return e.signal&&(t.signal=e.signal),t}return e}(function g(e,t){return t?"boolean"==typeof e?{capture:e,passive:!0}:e?"object"==typeof e&&!1!==e.passive?{...e,passive:!0}:e:{passive:!0}:e}(arguments[2],d)),b=k?.signal;if(b?.aborted)return;if(D)for(let e=0;e<D.length;e++)if(h===D[e])return d?t.call(c,h,u,k):t.apply(this,arguments);const v=!!k&&("boolean"==typeof k||k.capture),E=!(!k||"object"!=typeof k)&&k.once,S=Zone.current;let w=zoneSymbolEventNames[h];w||(prepareEventNames(h,m),w=zoneSymbolEventNames[h]);const Z=w[v?"true":"false"];let O,C=c[Z],N=!1;if(C){if(N=!0,f)for(let e=0;e<C.length;e++)if(P(C[e],u))return}else C=c[Z]=[];const j=c.constructor.name,M=globalSources[j];M&&(O=M[h]),O||(O=j+r+(m?m(h):h)),y.options=k,E&&(y.options.once=!1),y.target=c,y.capture=v,y.eventName=h,y.isExisting=N;const I=o?OPTIMIZED_ZONE_EVENT_TASK_DATA:void 0;I&&(I.taskData=y),b&&(y.options.signal=void 0);const A=S.scheduleEventTask(O,u,I,s,a);if(b){y.options.signal=b;const e=()=>A.zone.cancelTask(A);t.call(b,"abort",e,{once:!0}),A.removeAbortListener=()=>b.removeEventListener("abort",e)}return y.target=null,I&&(I.taskData=null),E&&(y.options.once=!0),"boolean"!=typeof A.options&&(A.options=k),A.target=c,A.capture=v,A.eventName=h,_&&(A.originalDelegate=u),l?C.unshift(A):C.push(A),i?c:void 0}};return g[r]=O(T,c,w,Z,k),S&&(g[h]=O(S,u,(function(e){return S.call(y.target,y.eventName,e.invoke,y.options)}),Z,k,!0)),g[s]=function(){const t=this||e;let o=arguments[0];n&&n.transferEventName&&(o=n.transferEventName(o));const r=arguments[2],s=!!r&&("boolean"==typeof r||r.capture),a=arguments[1];if(!a)return b.apply(this,arguments);if(p&&!p(b,a,t,arguments))return;const i=zoneSymbolEventNames[o];let l;i&&(l=i[s?"true":"false"]);const c=l&&t[l];if(c)for(let e=0;e<c.length;e++){const n=c[e];if(P(n,a))return c.splice(e,1),n.isRemoved=!0,0!==c.length||(n.allRemoved=!0,t[l]=null,s||"string"!=typeof o)||(t[ZONE_SYMBOL_PREFIX+"ON_PROPERTY"+o]=null),n.zone.cancelTask(n),k?t:void 0}return b.apply(this,arguments)},g[a]=function(){const t=this||e;let o=arguments[0];n&&n.transferEventName&&(o=n.transferEventName(o));const r=[],s=findEventTasks(t,m?m(o):o);for(let e=0;e<s.length;e++){const t=s[e];r.push(t.originalDelegate?t.originalDelegate:t.callback)}return r},g[i]=function(){const t=this||e;let o=arguments[0];if(o){n&&n.transferEventName&&(o=n.transferEventName(o));const e=zoneSymbolEventNames[o];if(e){const n=t[e.false],r=t[e.true];if(n){const e=n.slice();for(let t=0;t<e.length;t++){const n=e[t];this[s].call(this,o,n.originalDelegate?n.originalDelegate:n.callback,n.options)}}if(r){const e=r.slice();for(let t=0;t<e.length;t++){const n=e[t];this[s].call(this,o,n.originalDelegate?n.originalDelegate:n.callback,n.options)}}}}else{const e=Object.keys(t);for(let t=0;t<e.length;t++){const n=EVENT_NAME_SYMBOL_REGX.exec(e[t]);let o=n&&n[1];o&&"removeListener"!==o&&this[i].call(this,o)}this[i].call(this,"removeListener")}if(k)return this},attachOriginToPatched(g[r],T),attachOriginToPatched(g[s],b),E&&attachOriginToPatched(g[i],E),v&&attachOriginToPatched(g[a],v),!0}let g=[];for(let e=0;e<n.length;e++)g[e]=k(n[e],o);return g}function findEventTasks(e,t){if(!t){const n=[];for(let o in e){const r=EVENT_NAME_SYMBOL_REGX.exec(o);let s=r&&r[1];if(s&&(!t||s===t)){const t=e[o];if(t)for(let e=0;e<t.length;e++)n.push(t[e])}}return n}let n=zoneSymbolEventNames[t];n||(prepareEventNames(t),n=zoneSymbolEventNames[t]);const o=e[n.false],r=e[n.true];return o?r?o.concat(r):o.slice():r?r.slice():[]}function patchQueueMicrotask(e,t){t.patchMethod(e,"queueMicrotask",(e=>function(e,t){Zone.current.scheduleMicroTask("queueMicrotask",t[0])}))}const taskSymbol=zoneSymbol("zoneTask");function patchTimer(e,t,n,o){let r=null,s=null;n+=o;const a={};function i(t){const n=t.data;n.args[0]=function(){return t.invoke.apply(this,arguments)};const o=r.apply(e,n.args);return isNumber(o)?n.handleId=o:(n.handle=o,n.isRefreshable=isFunction(o.refresh)),t}function l(t){const{handle:n,handleId:o}=t.data;return s.call(e,n??o)}r=patchMethod(e,t+=o,(n=>function(r,s){if(isFunction(s[0])){const e={isRefreshable:!1,isPeriodic:"Interval"===o,delay:"Timeout"===o||"Interval"===o?s[1]||0:void 0,args:s},n=s[0];s[0]=function t(){try{return n.apply(this,arguments)}finally{const{handle:t,handleId:n,isPeriodic:o,isRefreshable:r}=e;o||r||(n?delete a[n]:t&&(t[taskSymbol]=null))}};const r=scheduleMacroTaskWithCurrentZone(t,s[0],e,i,l);if(!r)return r;const{handleId:c,handle:h,isRefreshable:u,isPeriodic:p}=r.data;if(c)a[c]=r;else if(h&&(h[taskSymbol]=r,u&&!p)){const e=h.refresh;h.refresh=function(){const{zone:t,state:n}=r;return"notScheduled"===n?(r._state="scheduled",t._updateTaskCount(r,1)):"running"===n&&(r._state="scheduling"),e.call(this)}}return h??c??r}return n.apply(e,s)})),s=patchMethod(e,n,(t=>function(n,o){const r=o[0];let s;isNumber(r)?(s=a[r],delete a[r]):(s=r?.[taskSymbol],s?r[taskSymbol]=null:s=r),s?.type?s.cancelFn&&s.zone.cancelTask(s):t.apply(e,o)}))}function patchEvents(e){e.__load_patch("EventEmitter",((e,t,n)=>{const o="addListener",r="removeListener",s=function(e,t){return e.callback===t||e.callback.listener===t},a=function(e){return"string"==typeof e?e:e?e.toString().replace("(","_").replace(")","_"):""};let i;try{i=require("events")}catch(e){}i&&i.EventEmitter&&function l(t){const i=patchEventTarget(e,n,[t],{useG:!1,add:o,rm:r,prepend:"prependListener",rmAll:"removeAllListeners",listeners:"listeners",chkDup:!1,rt:!0,diff:s,eventNameToString:a});i&&i[0]&&(t.on=t[o],t.off=t[r])}(i.EventEmitter.prototype)}))}function patchFs(e){e.__load_patch("fs",((e,t,n)=>{let o;try{o=require("fs")}catch(e){}if(!o)return;["access","appendFile","chmod","chown","close","exists","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchmod","lchown","lutimes","link","lstat","mkdir","mkdtemp","open","opendir","read","readdir","readFile","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","write","writeFile","writev"].filter((e=>!!o[e]&&"function"==typeof o[e])).forEach((e=>{patchMacroTask(o,e,((t,n)=>({name:"fs."+e,args:n,cbIdx:n.length>0?n.length-1:-1,target:t})))}));const r=o.realpath?.[n.symbol("OriginalDelegate")];r?.native&&(o.realpath.native=r.native,patchMacroTask(o.realpath,"native",((e,t)=>({args:t,target:e,cbIdx:t.length>0?t.length-1:-1,name:"fs.realpath.native"}))))}))}function patchNodeUtil(e){e.__load_patch("node_util",((e,t,n)=>{n.patchOnProperties=patchOnProperties,n.patchMethod=patchMethod,n.bindArguments=bindArguments,n.patchMacroTask=patchMacroTask,setShouldCopySymbolProperties(!0)}))}const set="set",clear="clear";function patchNode(e){patchNodeUtil(e),patchEvents(e),patchFs(e),e.__load_patch("node_timers",((e,t)=>{let n=!1;try{const t=require("timers");if(e.setTimeout!==t.setTimeout&&!isMix){const o=t.setTimeout;t.setTimeout=function(){return n=!0,o.apply(this,arguments)};const r=e.setTimeout((()=>{}),100);clearTimeout(r),t.setTimeout=o}patchTimer(t,set,clear,"Timeout"),patchTimer(t,set,clear,"Interval"),patchTimer(t,set,clear,"Immediate")}catch(e){}isMix||(n?(e[t.__symbol__("setTimeout")]=e.setTimeout,e[t.__symbol__("setInterval")]=e.setInterval,e[t.__symbol__("setImmediate")]=e.setImmediate):(patchTimer(e,set,clear,"Timeout"),patchTimer(e,set,clear,"Interval"),patchTimer(e,set,clear,"Immediate")))})),e.__load_patch("nextTick",(()=>{patchMicroTask(process,"nextTick",((e,t)=>({name:"process.nextTick",args:t,cbIdx:t.length>0&&"function"==typeof t[0]?0:-1,target:process})))})),e.__load_patch("handleUnhandledPromiseRejection",((e,t,n)=>{function o(e){return function(t){findEventTasks(process,e).forEach((n=>{"unhandledRejection"===e?n.invoke(t.rejection,t.promise):"rejectionHandled"===e&&n.invoke(t.promise)}))}}t[n.symbol("unhandledPromiseRejectionHandler")]=o("unhandledRejection"),t[n.symbol("rejectionHandledHandler")]=o("rejectionHandled")})),e.__load_patch("crypto",(()=>{let e;try{e=require("crypto")}catch(e){}e&&["randomBytes","pbkdf2"].forEach((t=>{patchMacroTask(e,t,((n,o)=>({name:"crypto."+t,args:o,cbIdx:o.length>0&&"function"==typeof o[o.length-1]?o.length-1:-1,target:e})))}))})),e.__load_patch("console",((e,t)=>{["dir","log","info","error","warn","assert","debug","timeEnd","trace"].forEach((e=>{const n=console[t.__symbol__(e)]=console[e];n&&(console[e]=function(){const e=ArraySlice.call(arguments);return t.current===t.root?n.apply(this,e):t.root.run(n,this,e)})}))})),e.__load_patch("queueMicrotask",((e,t,n)=>{patchQueueMicrotask(e,n)}))}function rollupMain(){const e=loadZone();return patchNode(e),patchPromise(e),patchToString(e),e}rollupMain();&)xn'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchCanvas(Zone) {
    Zone.__load_patch('canvas', (global, Zone, api) => {
        const HTMLCanvasElement = global['HTMLCanvasElement'];
        if (typeof HTMLCanvasElement !== 'undefined' &&
            HTMLCanvasElement.prototype &&
            HTMLCanvasElement.prototype.toBlob) {
            api.patchMacroTask(HTMLCanvasElement.prototype, 'toBlob', (self, args) => {
                return { name: 'HTMLCanvasElement.toBlob', target: self, cbIdx: 0, args: args };
            });
        }
    });
}

patchCanvas(Zone);
$Mvxz"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchCanvas(t){t.__load_patch("canvas",((t,a,o)=>{const n=t.HTMLCanvasElement;void 0!==n&&n.prototype&&n.prototype.toBlob&&o.patchMacroTask(n.prototype,"toBlob",((t,a)=>({name:"HTMLCanvasElement.toBlob",target:t,cbIdx:0,args:a})))}))}patchCanvas(Zone);L}ox'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchElectron(Zone) {
    Zone.__load_patch('electron', (global, Zone, api) => {
        function patchArguments(target, name, source) {
            return api.patchMethod(target, name, (delegate) => (self, args) => {
                return delegate && delegate.apply(self, api.bindArguments(args, source));
            });
        }
        let { desktopCapturer, shell, CallbacksRegistry, ipcRenderer } = require('electron');
        if (!CallbacksRegistry) {
            try {
                // Try to load CallbacksRegistry class from @electron/remote src
                // since from electron 14+, the CallbacksRegistry is moved to @electron/remote
                // package and not exported to outside, so this is a hack to patch CallbacksRegistry.
                CallbacksRegistry =
                    require('@electron/remote/dist/src/renderer/callbacks-registry').CallbacksRegistry;
            }
            catch (err) { }
        }
        // patch api in renderer process directly
        // desktopCapturer
        if (desktopCapturer) {
            patchArguments(desktopCapturer, 'getSources', 'electron.desktopCapturer.getSources');
        }
        // shell
        if (shell) {
            patchArguments(shell, 'openExternal', 'electron.shell.openExternal');
        }
        // patch api in main process through CallbackRegistry
        if (!CallbacksRegistry) {
            if (ipcRenderer) {
                patchArguments(ipcRenderer, 'on', 'ipcRenderer.on');
            }
            return;
        }
        patchArguments(CallbacksRegistry.prototype, 'add', 'CallbackRegistry.add');
    });
}

patchElectron(Zone);
@*x_"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchElectron(e){e.__load_patch("electron",((e,r,t)=>{function c(e,r,c){return t.patchMethod(e,r,(e=>(r,l)=>e&&e.apply(r,t.bindArguments(l,c))))}let{desktopCapturer:l,shell:n,CallbacksRegistry:o,ipcRenderer:a}=require("electron");if(!o)try{o=require("@electron/remote/dist/src/renderer/callbacks-registry").CallbacksRegistry}catch(e){}l&&c(l,"getSources","electron.desktopCapturer.getSources"),n&&c(n,"openExternal","electron.shell.openExternal"),o?c(o.prototype,"add","CallbackRegistry.add"):a&&c(a,"on","ipcRenderer.on")}))}patchElectron(Zone);xC'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
/**
 * @fileoverview
 * @suppress {missingRequire}
 */
function patchFetch(Zone) {
    Zone.__load_patch('fetch', (global, Zone, api) => {
        let fetch = global['fetch'];
        if (typeof fetch !== 'function') {
            return;
        }
        const originalFetch = global[api.symbol('fetch')];
        if (originalFetch) {
            // restore unpatched fetch first
            fetch = originalFetch;
        }
        const ZoneAwarePromise = global.Promise;
        const symbolThenPatched = api.symbol('thenPatched');
        const fetchTaskScheduling = api.symbol('fetchTaskScheduling');
        const OriginalResponse = global.Response;
        const placeholder = function () { };
        const createFetchTask = (source, data, originalImpl, self, args, ac) => new Promise((resolve, reject) => {
            const task = Zone.current.scheduleMacroTask(source, placeholder, data, () => {
                // The promise object returned by the original implementation passed into the
                // function. This might be a `fetch` promise, `Response.prototype.json` promise,
                // etc.
                let implPromise;
                let zone = Zone.current;
                try {
                    zone[fetchTaskScheduling] = true;
                    implPromise = originalImpl.apply(self, args);
                }
                catch (error) {
                    reject(error);
                    return;
                }
                finally {
                    zone[fetchTaskScheduling] = false;
                }
                if (!(implPromise instanceof ZoneAwarePromise)) {
                    let ctor = implPromise.constructor;
                    if (!ctor[symbolThenPatched]) {
                        api.patchThen(ctor);
                    }
                }
                implPromise.then((resource) => {
                    if (task.state !== 'notScheduled') {
                        task.invoke();
                    }
                    resolve(resource);
                }, (error) => {
                    if (task.state !== 'notScheduled') {
                        task.invoke();
                    }
                    reject(error);
                });
            }, () => {
                ac?.abort();
            });
        });
        global['fetch'] = function () {
            const args = Array.prototype.slice.call(arguments);
            const options = args.length > 1 ? args[1] : {};
            const signal = options?.signal;
            const ac = new AbortController();
            const fetchSignal = ac.signal;
            options.signal = fetchSignal;
            args[1] = options;
            let onAbort;
            if (signal) {
                const nativeAddEventListener = signal[Zone.__symbol__('addEventListener')] ||
                    signal.addEventListener;
                onAbort = () => ac.abort();
                nativeAddEventListener.call(signal, 'abort', onAbort, { once: true });
            }
            return createFetchTask('fetch', { fetchArgs: args }, fetch, this, args, ac).finally(() => {
                // We need to be good citizens and remove the `abort` listener once
                // the fetch is settled. The `abort` listener may not be called at all,
                // which means the event listener closure would retain a reference to
                // the `ac` object even if it goes out of scope. Since browser's garbage
                // collectors work differently, some may not be smart enough to collect a signal.
                signal?.removeEventListener('abort', onAbort);
            });
        };
        if (OriginalResponse?.prototype) {
            // https://fetch.spec.whatwg.org/#body-mixin
            ['arrayBuffer', 'blob', 'formData', 'json', 'text']
                // Safely check whether the method exists on the `Response` prototype before patching.
                .filter((method) => typeof OriginalResponse.prototype[method] === 'function')
                .forEach((method) => {
                api.patchMethod(OriginalResponse.prototype, method, (delegate) => (self, args) => createFetchTask(`Response.${method}`, undefined, delegate, self, args, undefined));
            });
        }
    });
}

patchFetch(Zone);
{^Rx%"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchFetch(t){t.__load_patch("fetch",((t,e,o)=>{let n=t.fetch;if("function"!=typeof n)return;const c=t[o.symbol("fetch")];c&&(n=c);const r=t.Promise,a=o.symbol("thenPatched"),s=o.symbol("fetchTaskScheduling"),l=t.Response,i=function(){},h=(t,n,c,l,h,f)=>new Promise(((p,u)=>{const d=e.current.scheduleMacroTask(t,i,n,(()=>{let t,n=e.current;try{n[s]=!0,t=c.apply(l,h)}catch(t){return void u(t)}finally{n[s]=!1}if(!(t instanceof r)){let e=t.constructor;e[a]||o.patchThen(e)}t.then((t=>{"notScheduled"!==d.state&&d.invoke(),p(t)}),(t=>{"notScheduled"!==d.state&&d.invoke(),u(t)}))}),(()=>{f?.abort()}))}));t.fetch=function(){const t=Array.prototype.slice.call(arguments),o=t.length>1?t[1]:{},c=o?.signal,r=new AbortController;let a;if(o.signal=r.signal,t[1]=o,c){const t=c[e.__symbol__("addEventListener")]||c.addEventListener;a=()=>r.abort(),t.call(c,"abort",a,{once:!0})}return h("fetch",{fetchArgs:t},n,this,t,r).finally((()=>{c?.removeEventListener("abort",a)}))},l?.prototype&&["arrayBuffer","blob","formData","json","text"].filter((t=>"function"==typeof l.prototype[t])).forEach((t=>{o.patchMethod(l.prototype,t,(e=>(o,n)=>h(`Response.${t}`,void 0,e,o,n,void 0)))}))}))}patchFetch(Zone);K xD'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchJsonp(Zone) {
    Zone.__load_patch('jsonp', (global, Zone, api) => {
        // because jsonp is not a standard api, there are a lot of
        // implementations, so zone.js just provide a helper util to
        // patch the jsonp send and onSuccess/onError callback
        // the options is an object which contains
        // - jsonp, the jsonp object which hold the send function
        // - sendFuncName, the name of the send function
        // - successFuncName, success func name
        // - failedFuncName, failed func name
        Zone[Zone.__symbol__('jsonp')] = function patchJsonp(options) {
            if (!options || !options.jsonp || !options.sendFuncName) {
                return;
            }
            const noop = function () { };
            [options.successFuncName, options.failedFuncName].forEach((methodName) => {
                if (!methodName) {
                    return;
                }
                const oriFunc = global[methodName];
                if (oriFunc) {
                    api.patchMethod(global, methodName, (delegate) => (self, args) => {
                        const task = global[api.symbol('jsonTask')];
                        if (task) {
                            task.callback = delegate;
                            return task.invoke.apply(self, args);
                        }
                        else {
                            return delegate.apply(self, args);
                        }
                    });
                }
                else {
                    Object.defineProperty(global, methodName, {
                        configurable: true,
                        enumerable: true,
                        get: function () {
                            return function () {
                                const task = global[api.symbol('jsonpTask')];
                                const delegate = global[api.symbol(`jsonp${methodName}callback`)];
                                if (task) {
                                    if (delegate) {
                                        task.callback = delegate;
                                    }
                                    global[api.symbol('jsonpTask')] = undefined;
                                    return task.invoke.apply(this, arguments);
                                }
                                else {
                                    if (delegate) {
                                        return delegate.apply(this, arguments);
                                    }
                                }
                                return null;
                            };
                        },
                        set: function (callback) {
                            this[api.symbol(`jsonp${methodName}callback`)] = callback;
                        },
                    });
                }
            });
            api.patchMethod(options.jsonp, options.sendFuncName, (delegate) => (self, args) => {
                global[api.symbol('jsonpTask')] = Zone.current.scheduleMacroTask('jsonp', noop, {}, (task) => {
                    return delegate.apply(self, args);
                }, noop);
            });
        };
    });
}

patchJsonp(Zone);
8[;x@"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchJsonp(n){n.__load_patch("jsonp",((n,o,s)=>{o[o.__symbol__("jsonp")]=function c(a){if(!a||!a.jsonp||!a.sendFuncName)return;const e=function(){};[a.successFuncName,a.failedFuncName].forEach((o=>{o&&(n[o]?s.patchMethod(n,o,(o=>(c,a)=>{const e=n[s.symbol("jsonTask")];return e?(e.callback=o,e.invoke.apply(c,a)):o.apply(c,a)})):Object.defineProperty(n,o,{configurable:!0,enumerable:!0,get:function(){return function(){const c=n[s.symbol("jsonpTask")],a=n[s.symbol(`jsonp${o}callback`)];return c?(a&&(c.callback=a),n[s.symbol("jsonpTask")]=void 0,c.invoke.apply(this,arguments)):a?a.apply(this,arguments):null}},set:function(n){this[s.symbol(`jsonp${o}callback`)]=n}}))})),s.patchMethod(a.jsonp,a.sendFuncName,(c=>(a,t)=>{n[s.symbol("jsonpTask")]=o.current.scheduleMacroTask("jsonp",e,{},(n=>c.apply(a,t)),e)}))}}))}patchJsonp(Zone);pNJ)xk'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchMessagePort(Zone) {
    /**
     * Monkey patch `MessagePort.prototype.onmessage` and `MessagePort.prototype.onmessageerror`
     * properties to make the callback in the zone when the value are set.
     */
    Zone.__load_patch('MessagePort', (global, Zone, api) => {
        const MessagePort = global['MessagePort'];
        if (typeof MessagePort !== 'undefined' && MessagePort.prototype) {
            api.patchOnProperties(MessagePort.prototype, ['message', 'messageerror']);
        }
    });
}

patchMessagePort(Zone);
uFx?"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchMessagePort(e){e.__load_patch("MessagePort",((e,t,s)=>{const o=e.MessagePort;void 0!==o&&o.prototype&&s.patchOnProperties(o.prototype,["message","messageerror"])}))}patchMessagePort(Zone);-hkdxn
'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchPromiseTesting(Zone) {
    /**
     * Promise for async/fakeAsync zoneSpec test
     * can support async operation which not supported by zone.js
     * such as
     * it ('test jsonp in AsyncZone', async() => {
     *   new Promise(res => {
     *     jsonp(url, (data) => {
     *       // success callback
     *       res(data);
     *     });
     *   }).then((jsonpResult) => {
     *     // get jsonp result.
     *
     *     // user will expect AsyncZoneSpec wait for
     *     // then, but because jsonp is not zone aware
     *     // AsyncZone will finish before then is called.
     *   });
     * });
     */
    Zone.__load_patch('promisefortest', (global, Zone, api) => {
        const symbolState = api.symbol('state');
        const UNRESOLVED = null;
        const symbolParentUnresolved = api.symbol('parentUnresolved');
        // patch Promise.prototype.then to keep an internal
        // number for tracking unresolved chained promise
        // we will decrease this number when the parent promise
        // being resolved/rejected and chained promise was
        // scheduled as a microTask.
        // so we can know such kind of chained promise still
        // not resolved in AsyncTestZone
        Promise[api.symbol('patchPromiseForTest')] = function patchPromiseForTest() {
            let oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
            if (oriThen) {
                return;
            }
            oriThen = Promise[Zone.__symbol__('ZonePromiseThen')] = Promise.prototype.then;
            Promise.prototype.then = function () {
                const chained = oriThen.apply(this, arguments);
                if (this[symbolState] === UNRESOLVED) {
                    // parent promise is unresolved.
                    const asyncTestZoneSpec = Zone.current.get('AsyncTestZoneSpec');
                    if (asyncTestZoneSpec) {
                        asyncTestZoneSpec.unresolvedChainedPromiseCount++;
                        chained[symbolParentUnresolved] = true;
                    }
                }
                return chained;
            };
        };
        Promise[api.symbol('unPatchPromiseForTest')] = function unpatchPromiseForTest() {
            // restore origin then
            const oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
            if (oriThen) {
                Promise.prototype.then = oriThen;
                Promise[Zone.__symbol__('ZonePromiseThen')] = undefined;
            }
        };
    });
}

patchPromiseTesting(Zone);
*3x4"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchPromiseTesting(o){o.__load_patch("promisefortest",((o,e,s)=>{const t=s.symbol("state"),n=s.symbol("parentUnresolved");Promise[s.symbol("patchPromiseForTest")]=function o(){let s=Promise[e.__symbol__("ZonePromiseThen")];s||(s=Promise[e.__symbol__("ZonePromiseThen")]=Promise.prototype.then,Promise.prototype.then=function(){const o=s.apply(this,arguments);if(null===this[t]){const s=e.current.get("AsyncTestZoneSpec");s&&(s.unresolvedChainedPromiseCount++,o[n]=!0)}return o})},Promise[s.symbol("unPatchPromiseForTest")]=function o(){const s=Promise[e.__symbol__("ZonePromiseThen")];s&&(Promise.prototype.then=s,Promise[e.__symbol__("ZonePromiseThen")]=void 0)}}))}patchPromiseTesting(Zone);R%x$'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchResizeObserver(Zone) {
    Zone.__load_patch('ResizeObserver', (global, Zone, api) => {
        const ResizeObserver = global['ResizeObserver'];
        if (!ResizeObserver) {
            return;
        }
        const resizeObserverSymbol = api.symbol('ResizeObserver');
        api.patchMethod(global, 'ResizeObserver', (delegate) => (self, args) => {
            const callback = args.length > 0 ? args[0] : null;
            if (callback) {
                args[0] = function (entries, observer) {
                    const zones = {};
                    const currZone = Zone.current;
                    for (let entry of entries) {
                        let zone = entry.target[resizeObserverSymbol];
                        if (!zone) {
                            zone = currZone;
                        }
                        let zoneEntriesInfo = zones[zone.name];
                        if (!zoneEntriesInfo) {
                            zones[zone.name] = zoneEntriesInfo = { entries: [], zone: zone };
                        }
                        zoneEntriesInfo.entries.push(entry);
                    }
                    Object.keys(zones).forEach((zoneName) => {
                        const zoneEntriesInfo = zones[zoneName];
                        if (zoneEntriesInfo.zone !== Zone.current) {
                            zoneEntriesInfo.zone.run(callback, this, [zoneEntriesInfo.entries, observer], 'ResizeObserver');
                        }
                        else {
                            callback.call(this, zoneEntriesInfo.entries, observer);
                        }
                    });
                };
            }
            return args.length > 0 ? new ResizeObserver(args[0]) : new ResizeObserver();
        });
        api.patchMethod(ResizeObserver.prototype, 'observe', (delegate) => (self, args) => {
            const target = args.length > 0 ? args[0] : null;
            if (!target) {
                return delegate.apply(self, args);
            }
            let targets = self[resizeObserverSymbol];
            if (!targets) {
                targets = self[resizeObserverSymbol] = [];
            }
            targets.push(target);
            target[resizeObserverSymbol] = Zone.current;
            return delegate.apply(self, args);
        });
        api.patchMethod(ResizeObserver.prototype, 'unobserve', (delegate) => (self, args) => {
            const target = args.length > 0 ? args[0] : null;
            if (!target) {
                return delegate.apply(self, args);
            }
            let targets = self[resizeObserverSymbol];
            if (targets) {
                for (let i = 0; i < targets.length; i++) {
                    if (targets[i] === target) {
                        targets.splice(i, 1);
                        break;
                    }
                }
            }
            target[resizeObserverSymbol] = undefined;
            return delegate.apply(self, args);
        });
        api.patchMethod(ResizeObserver.prototype, 'disconnect', (delegate) => (self, args) => {
            const targets = self[resizeObserverSymbol];
            if (targets) {
                targets.forEach((target) => {
                    target[resizeObserverSymbol] = undefined;
                });
                self[resizeObserverSymbol] = undefined;
            }
            return delegate.apply(self, args);
        });
    });
}

patchResizeObserver(Zone);
HMx-"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchResizeObserver(e){e.__load_patch("ResizeObserver",((e,t,r)=>{const n=e.ResizeObserver;if(!n)return;const s=r.symbol("ResizeObserver");r.patchMethod(e,"ResizeObserver",(e=>(e,r)=>{const o=r.length>0?r[0]:null;return o&&(r[0]=function(e,r){const n={},c=t.current;for(let t of e){let e=t.target[s];e||(e=c);let r=n[e.name];r||(n[e.name]=r={entries:[],zone:e}),r.entries.push(t)}Object.keys(n).forEach((e=>{const s=n[e];s.zone!==t.current?s.zone.run(o,this,[s.entries,r],"ResizeObserver"):o.call(this,s.entries,r)}))}),r.length>0?new n(r[0]):new n})),r.patchMethod(n.prototype,"observe",(e=>(r,n)=>{const o=n.length>0?n[0]:null;if(!o)return e.apply(r,n);let c=r[s];return c||(c=r[s]=[]),c.push(o),o[s]=t.current,e.apply(r,n)})),r.patchMethod(n.prototype,"unobserve",(e=>(t,r)=>{const n=r.length>0?r[0]:null;if(!n)return e.apply(t,r);let o=t[s];if(o)for(let e=0;e<o.length;e++)if(o[e]===n){o.splice(e,1);break}return n[s]=void 0,e.apply(t,r)})),r.patchMethod(n.prototype,"disconnect",(e=>(t,r)=>{const n=t[s];return n&&(n.forEach((e=>{e[s]=void 0})),t[s]=void 0),e.apply(t,r)}))}))}patchResizeObserver(Zone);5x$v'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
import { Observable, Subscription, Subscriber } from 'rxjs';

function patchRxJs(Zone) {
    Zone.__load_patch('rxjs', (global, Zone, api) => {
        const symbol = Zone.__symbol__;
        const nextSource = 'rxjs.Subscriber.next';
        const errorSource = 'rxjs.Subscriber.error';
        const completeSource = 'rxjs.Subscriber.complete';
        const ObjectDefineProperties = Object.defineProperties;
        const patchObservable = function () {
            const ObservablePrototype = Observable.prototype;
            const _symbolSubscribe = symbol('_subscribe');
            const _subscribe = (ObservablePrototype[_symbolSubscribe] = ObservablePrototype._subscribe);
            ObjectDefineProperties(Observable.prototype, {
                _zone: { value: null, writable: true, configurable: true },
                _zoneSource: { value: null, writable: true, configurable: true },
                _zoneSubscribe: { value: null, writable: true, configurable: true },
                source: {
                    configurable: true,
                    get: function () {
                        return this._zoneSource;
                    },
                    set: function (source) {
                        this._zone = Zone.current;
                        this._zoneSource = source;
                    },
                },
                _subscribe: {
                    configurable: true,
                    get: function () {
                        if (this._zoneSubscribe) {
                            return this._zoneSubscribe;
                        }
                        else if (this.constructor === Observable) {
                            return _subscribe;
                        }
                        const proto = Object.getPrototypeOf(this);
                        return proto && proto._subscribe;
                    },
                    set: function (subscribe) {
                        this._zone = Zone.current;
                        if (!subscribe) {
                            this._zoneSubscribe = subscribe;
                        }
                        else {
                            this._zoneSubscribe = function () {
                                if (this._zone && this._zone !== Zone.current) {
                                    const tearDown = this._zone.run(subscribe, this, arguments);
                                    if (typeof tearDown === 'function') {
                                        const zone = this._zone;
                                        return function () {
                                            if (zone !== Zone.current) {
                                                return zone.run(tearDown, this, arguments);
                                            }
                                            return tearDown.apply(this, arguments);
                                        };
                                    }
                                    else {
                                        return tearDown;
                                    }
                                }
                                else {
                                    return subscribe.apply(this, arguments);
                                }
                            };
                        }
                    },
                },
                subjectFactory: {
                    get: function () {
                        return this._zoneSubjectFactory;
                    },
                    set: function (factory) {
                        const zone = this._zone;
                        this._zoneSubjectFactory = function () {
                            if (zone && zone !== Zone.current) {
                                return zone.run(factory, this, arguments);
                            }
                            return factory.apply(this, arguments);
                        };
                    },
                },
            });
        };
        api.patchMethod(Observable.prototype, 'lift', (delegate) => (self, args) => {
            const observable = delegate.apply(self, args);
            if (observable.operator) {
                observable.operator._zone = Zone.current;
                api.patchMethod(observable.operator, 'call', (operatorDelegate) => (operatorSelf, operatorArgs) => {
                    if (operatorSelf._zone && operatorSelf._zone !== Zone.current) {
                        return operatorSelf._zone.run(operatorDelegate, operatorSelf, operatorArgs);
                    }
                    return operatorDelegate.apply(operatorSelf, operatorArgs);
                });
            }
            return observable;
        });
        const patchSubscription = function () {
            ObjectDefineProperties(Subscription.prototype, {
                _zone: { value: null, writable: true, configurable: true },
                _zoneUnsubscribe: { value: null, writable: true, configurable: true },
                _unsubscribe: {
                    get: function () {
                        if (this._zoneUnsubscribe || this._zoneUnsubscribeCleared) {
                            return this._zoneUnsubscribe;
                        }
                        const proto = Object.getPrototypeOf(this);
                        return proto && proto._unsubscribe;
                    },
                    set: function (unsubscribe) {
                        this._zone = Zone.current;
                        if (!unsubscribe) {
                            this._zoneUnsubscribe = unsubscribe;
                            // In some operator such as `retryWhen`, the _unsubscribe
                            // method will be set to null, so we need to set another flag
                            // to tell that we should return null instead of finding
                            // in the prototype chain.
                            this._zoneUnsubscribeCleared = true;
                        }
                        else {
                            this._zoneUnsubscribeCleared = false;
                            this._zoneUnsubscribe = function () {
                                if (this._zone && this._zone !== Zone.current) {
                                    return this._zone.run(unsubscribe, this, arguments);
                                }
                                else {
                                    return unsubscribe.apply(this, arguments);
                                }
                            };
                        }
                    },
                },
            });
        };
        const patchSubscriber = function () {
            const next = Subscriber.prototype.next;
            const error = Subscriber.prototype.error;
            const complete = Subscriber.prototype.complete;
            Object.defineProperty(Subscriber.prototype, 'destination', {
                configurable: true,
                get: function () {
                    return this._zoneDestination;
                },
                set: function (destination) {
                    this._zone = Zone.current;
                    this._zoneDestination = destination;
                },
            });
            // patch Subscriber.next to make sure it run
            // into SubscriptionZone
            Subscriber.prototype.next = function () {
                const currentZone = Zone.current;
                const subscriptionZone = this._zone;
                // for performance concern, check Zone.current
                // equal with this._zone(SubscriptionZone) or not
                if (subscriptionZone && subscriptionZone !== currentZone) {
                    return subscriptionZone.run(next, this, arguments, nextSource);
                }
                else {
                    return next.apply(this, arguments);
                }
            };
            Subscriber.prototype.error = function () {
                const currentZone = Zone.current;
                const subscriptionZone = this._zone;
                // for performance concern, check Zone.current
                // equal with this._zone(SubscriptionZone) or not
                if (subscriptionZone && subscriptionZone !== currentZone) {
                    return subscriptionZone.run(error, this, arguments, errorSource);
                }
                else {
                    return error.apply(this, arguments);
                }
            };
            Subscriber.prototype.complete = function () {
                const currentZone = Zone.current;
                const subscriptionZone = this._zone;
                // for performance concern, check Zone.current
                // equal with this._zone(SubscriptionZone) or not
                if (subscriptionZone && subscriptionZone !== currentZone) {
                    return subscriptionZone.run(complete, this, arguments, completeSource);
                }
                else {
                    return complete.call(this);
                }
            };
        };
        patchObservable();
        patchSubscription();
        patchSubscriber();
    });
}

patchRxJs(Zone);
0Sxp"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */import{Observable,Subscription,Subscriber}from"rxjs";function patchRxJs(e){e.__load_patch("rxjs",((e,t,r)=>{const n=t.__symbol__,o=Object.defineProperties;r.patchMethod(Observable.prototype,"lift",(e=>(n,o)=>{const i=e.apply(n,o);return i.operator&&(i.operator._zone=t.current,r.patchMethod(i.operator,"call",(e=>(r,n)=>r._zone&&r._zone!==t.current?r._zone.run(e,r,n):e.apply(r,n)))),i})),function(){const e=Observable.prototype,r=e[n("_subscribe")]=e._subscribe;o(Observable.prototype,{_zone:{value:null,writable:!0,configurable:!0},_zoneSource:{value:null,writable:!0,configurable:!0},_zoneSubscribe:{value:null,writable:!0,configurable:!0},source:{configurable:!0,get:function(){return this._zoneSource},set:function(e){this._zone=t.current,this._zoneSource=e}},_subscribe:{configurable:!0,get:function(){if(this._zoneSubscribe)return this._zoneSubscribe;if(this.constructor===Observable)return r;const e=Object.getPrototypeOf(this);return e&&e._subscribe},set:function(e){this._zone=t.current,this._zoneSubscribe=e?function(){if(this._zone&&this._zone!==t.current){const r=this._zone.run(e,this,arguments);if("function"==typeof r){const e=this._zone;return function(){return e!==t.current?e.run(r,this,arguments):r.apply(this,arguments)}}return r}return e.apply(this,arguments)}:e}},subjectFactory:{get:function(){return this._zoneSubjectFactory},set:function(e){const r=this._zone;this._zoneSubjectFactory=function(){return r&&r!==t.current?r.run(e,this,arguments):e.apply(this,arguments)}}}})}(),o(Subscription.prototype,{_zone:{value:null,writable:!0,configurable:!0},_zoneUnsubscribe:{value:null,writable:!0,configurable:!0},_unsubscribe:{get:function(){if(this._zoneUnsubscribe||this._zoneUnsubscribeCleared)return this._zoneUnsubscribe;const e=Object.getPrototypeOf(this);return e&&e._unsubscribe},set:function(e){this._zone=t.current,e?(this._zoneUnsubscribeCleared=!1,this._zoneUnsubscribe=function(){return this._zone&&this._zone!==t.current?this._zone.run(e,this,arguments):e.apply(this,arguments)}):(this._zoneUnsubscribe=e,this._zoneUnsubscribeCleared=!0)}}}),function(){const e=Subscriber.prototype.next,r=Subscriber.prototype.error,n=Subscriber.prototype.complete;Object.defineProperty(Subscriber.prototype,"destination",{configurable:!0,get:function(){return this._zoneDestination},set:function(e){this._zone=t.current,this._zoneDestination=e}}),Subscriber.prototype.next=function(){const r=this._zone;return r&&r!==t.current?r.run(e,this,arguments,"rxjs.Subscriber.next"):e.apply(this,arguments)},Subscriber.prototype.error=function(){const e=this._zone;return e&&e!==t.current?e.run(r,this,arguments,"rxjs.Subscriber.error"):r.apply(this,arguments)},Subscriber.prototype.complete=function(){const e=this._zone;return e&&e!==t.current?e.run(n,this,arguments,"rxjs.Subscriber.complete"):n.call(this)}}()}))}patchRxJs(Zone);eLBx)'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchSocketIo(Zone) {
    Zone.__load_patch('socketio', (global, Zone, api) => {
        Zone[Zone.__symbol__('socketio')] = function patchSocketIO(io) {
            // patch io.Socket.prototype event listener related method
            api.patchEventTarget(global, api, [io.Socket.prototype], {
                useG: false,
                chkDup: false,
                rt: true,
                diff: (task, delegate) => {
                    return task.callback === delegate;
                },
            });
            // also patch io.Socket.prototype.on/off/removeListener/removeAllListeners
            io.Socket.prototype.on = io.Socket.prototype.addEventListener;
            io.Socket.prototype.off =
                io.Socket.prototype.removeListener =
                    io.Socket.prototype.removeAllListeners =
                        io.Socket.prototype.removeEventListener;
        };
    });
}

patchSocketIo(Zone);
9?!x"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchSocketIo(t){t.__load_patch("socketio",((t,e,o)=>{e[e.__symbol__("socketio")]=function e(c){o.patchEventTarget(t,o,[c.Socket.prototype],{useG:!1,chkDup:!1,rt:!0,diff:(t,e)=>t.callback===e}),c.Socket.prototype.on=c.Socket.prototype.addEventListener,c.Socket.prototype.off=c.Socket.prototype.removeListener=c.Socket.prototype.removeAllListeners=c.Socket.prototype.removeEventListener}}))}patchSocketIo(Zone);ȼԽ-x"'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchUserMedia(Zone) {
    Zone.__load_patch('getUserMedia', (global, Zone, api) => {
        function wrapFunctionArgs(func, source) {
            return function () {
                const args = Array.prototype.slice.call(arguments);
                const wrappedArgs = api.bindArguments(args, func.name);
                return func.apply(this, wrappedArgs);
            };
        }
        let navigator = global['navigator'];
        if (navigator && navigator.getUserMedia) {
            navigator.getUserMedia = wrapFunctionArgs(navigator.getUserMedia);
        }
    });
}

patchUserMedia(Zone);
2$xe"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchUserMedia(e){e.__load_patch("getUserMedia",((e,t,a)=>{let r=e.navigator;r&&r.getUserMedia&&(r.getUserMedia=function i(e){return function(){const t=Array.prototype.slice.call(arguments),r=a.bindArguments(t,e.name);return e.apply(this,r)}}(r.getUserMedia))}))}patchUserMedia(Zone);a팪0x   'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
function patchJasmine(Zone) {
    Zone.__load_patch('jasmine', (global, Zone, api) => {
        const __extends = function (d, b) {
            for (const p in b)
                if (b.hasOwnProperty(p))
                    d[p] = b[p];
            function __() {
                this.constructor = d;
            }
            d.prototype =
                b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());
        };
        // Patch jasmine's describe/it/beforeEach/afterEach functions so test code always runs
        // in a testZone (ProxyZone). (See: angular/zone.js#91 & angular/angular#10503)
        if (!Zone)
            throw new Error('Missing: zone.js');
        if (typeof jest !== 'undefined') {
            // return if jasmine is a light implementation inside jest
            // in this case, we are running inside jest not jasmine
            return;
        }
        if (typeof jasmine == 'undefined' || jasmine['__zone_patch__']) {
            return;
        }
        jasmine['__zone_patch__'] = true;
        const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
        const ProxyZoneSpec = Zone['ProxyZoneSpec'];
        if (!SyncTestZoneSpec)
            throw new Error('Missing: SyncTestZoneSpec');
        if (!ProxyZoneSpec)
            throw new Error('Missing: ProxyZoneSpec');
        const ambientZone = Zone.current;
        const symbol = Zone.__symbol__;
        // whether patch jasmine clock when in fakeAsync
        const disablePatchingJasmineClock = global[symbol('fakeAsyncDisablePatchingClock')] === true;
        // the original variable name fakeAsyncPatchLock is not accurate, so the name will be
        // fakeAsyncAutoFakeAsyncWhenClockPatched and if this enablePatchingJasmineClock is false, we
        // also automatically disable the auto jump into fakeAsync feature
        const enableAutoFakeAsyncWhenClockPatched = !disablePatchingJasmineClock &&
            (global[symbol('fakeAsyncPatchLock')] === true ||
                global[symbol('fakeAsyncAutoFakeAsyncWhenClockPatched')] === true);
        const ignoreUnhandledRejection = global[symbol('ignoreUnhandledRejection')] === true;
        if (!ignoreUnhandledRejection) {
            const globalErrors = jasmine.GlobalErrors;
            if (globalErrors && !jasmine[symbol('GlobalErrors')]) {
                jasmine[symbol('GlobalErrors')] = globalErrors;
                jasmine.GlobalErrors = function () {
                    const instance = new globalErrors();
                    const originalInstall = instance.install;
                    if (originalInstall && !instance[symbol('install')]) {
                        instance[symbol('install')] = originalInstall;
                        instance.install = function () {
                            const isNode = typeof process !== 'undefined' && !!process.on;
                            // Note: Jasmine checks internally if `process` and `process.on` is defined.
                            // Otherwise, it installs the browser rejection handler through the
                            // `global.addEventListener`. This code may be run in the browser environment where
                            // `process` is not defined, and this will lead to a runtime exception since webpack 5
                            // removed automatic Node.js polyfills. Note, that events are named differently, it's
                            // `unhandledRejection` in Node.js and `unhandledrejection` in the browser.
                            const originalHandlers = isNode
                                ? process.listeners('unhandledRejection')
                                : global.eventListeners('unhandledrejection');
                            const result = originalInstall.apply(this, arguments);
                            isNode
                                ? process.removeAllListeners('unhandledRejection')
                                : global.removeAllListeners('unhandledrejection');
                            if (originalHandlers) {
                                originalHandlers.forEach((handler) => {
                                    if (isNode) {
                                        process.on('unhandledRejection', handler);
                                    }
                                    else {
                                        global.addEventListener('unhandledrejection', handler);
                                    }
                                });
                            }
                            return result;
                        };
                    }
                    return instance;
                };
            }
        }
        // Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
        const jasmineEnv = jasmine.getEnv();
        ['describe', 'xdescribe', 'fdescribe'].forEach((methodName) => {
            let originalJasmineFn = jasmineEnv[methodName];
            jasmineEnv[methodName] = function (description, specDefinitions) {
                return originalJasmineFn.call(this, description, wrapDescribeInZone(description, specDefinitions));
            };
        });
        ['it', 'xit', 'fit'].forEach((methodName) => {
            let originalJasmineFn = jasmineEnv[methodName];
            jasmineEnv[symbol(methodName)] = originalJasmineFn;
            jasmineEnv[methodName] = function (description, specDefinitions, timeout) {
                arguments[1] = wrapTestInZone(specDefinitions);
                return originalJasmineFn.apply(this, arguments);
            };
        });
        ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach((methodName) => {
            let originalJasmineFn = jasmineEnv[methodName];
            jasmineEnv[symbol(methodName)] = originalJasmineFn;
            jasmineEnv[methodName] = function (specDefinitions, timeout) {
                arguments[0] = wrapTestInZone(specDefinitions);
                return originalJasmineFn.apply(this, arguments);
            };
        });
        if (!disablePatchingJasmineClock) {
            // need to patch jasmine.clock().mockDate and jasmine.clock().tick() so
            // they can work properly in FakeAsyncTest
            const originalClockFn = (jasmine[symbol('clock')] = jasmine['clock']);
            jasmine['clock'] = function () {
                const clock = originalClockFn.apply(this, arguments);
                if (!clock[symbol('patched')]) {
                    clock[symbol('patched')] = symbol('patched');
                    const originalTick = (clock[symbol('tick')] = clock.tick);
                    clock.tick = function () {
                        const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            return fakeAsyncZoneSpec.tick.apply(fakeAsyncZoneSpec, arguments);
                        }
                        return originalTick.apply(this, arguments);
                    };
                    const originalMockDate = (clock[symbol('mockDate')] = clock.mockDate);
                    clock.mockDate = function () {
                        const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                        if (fakeAsyncZoneSpec) {
                            const dateTime = arguments.length > 0 ? arguments[0] : new Date();
                            return fakeAsyncZoneSpec.setFakeBaseSystemTime.apply(fakeAsyncZoneSpec, dateTime && typeof dateTime.getTime === 'function'
                                ? [dateTime.getTime()]
                                : arguments);
                        }
                        return originalMockDate.apply(this, arguments);
                    };
                    // for auto go into fakeAsync feature, we need the flag to enable it
                    if (enableAutoFakeAsyncWhenClockPatched) {
                        ['install', 'uninstall'].forEach((methodName) => {
                            const originalClockFn = (clock[symbol(methodName)] = clock[methodName]);
                            clock[methodName] = function () {
                                const FakeAsyncTestZoneSpec = Zone['FakeAsyncTestZoneSpec'];
                                if (FakeAsyncTestZoneSpec) {
                                    jasmine[symbol('clockInstalled')] = 'install' === methodName;
                                    return;
                                }
                                return originalClockFn.apply(this, arguments);
                            };
                        });
                    }
                }
                return clock;
            };
        }
        // monkey patch createSpyObj to make properties enumerable to true
        if (!jasmine[Zone.__symbol__('createSpyObj')]) {
            const originalCreateSpyObj = jasmine.createSpyObj;
            jasmine[Zone.__symbol__('createSpyObj')] = originalCreateSpyObj;
            jasmine.createSpyObj = function () {
                const args = Array.prototype.slice.call(arguments);
                const propertyNames = args.length >= 3 ? args[2] : null;
                let spyObj;
                if (propertyNames) {
                    const defineProperty = Object.defineProperty;
                    Object.defineProperty = function (obj, p, attributes) {
                        return defineProperty.call(this, obj, p, {
                            ...attributes,
                            configurable: true,
                            enumerable: true,
                        });
                    };
                    try {
                        spyObj = originalCreateSpyObj.apply(this, args);
                    }
                    finally {
                        Object.defineProperty = defineProperty;
                    }
                }
                else {
                    spyObj = originalCreateSpyObj.apply(this, args);
                }
                return spyObj;
            };
        }
        /**
         * Gets a function wrapping the body of a Jasmine `describe` block to execute in a
         * synchronous-only zone.
         */
        function wrapDescribeInZone(description, describeBody) {
            return function () {
                // Create a synchronous-only zone in which to run `describe` blocks in order to raise an
                // error if any asynchronous operations are attempted inside of a `describe`.
                const syncZone = ambientZone.fork(new SyncTestZoneSpec(`jasmine.describe#${description}`));
                return syncZone.run(describeBody, this, arguments);
            };
        }
        function runInTestZone(testBody, applyThis, queueRunner, done) {
            const isClockInstalled = !!jasmine[symbol('clockInstalled')];
            queueRunner.testProxyZoneSpec;
            const testProxyZone = queueRunner.testProxyZone;
            if (isClockInstalled && enableAutoFakeAsyncWhenClockPatched) {
                // auto run a fakeAsync
                const fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
                if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
                    testBody = fakeAsyncModule.fakeAsync(testBody);
                }
            }
            if (done) {
                return testProxyZone.run(testBody, applyThis, [done]);
            }
            else {
                return testProxyZone.run(testBody, applyThis);
            }
        }
        /**
         * Gets a function wrapping the body of a Jasmine `it/beforeEach/afterEach` block to
         * execute in a ProxyZone zone.
         * This will run in `testProxyZone`. The `testProxyZone` will be reset by the `ZoneQueueRunner`
         */
        function wrapTestInZone(testBody) {
            // The `done` callback is only passed through if the function expects at least one argument.
            // Note we have to make a function with correct number of arguments, otherwise jasmine will
            // think that all functions are sync or async.
            return (testBody &&
                (testBody.length
                    ? function (done) {
                        return runInTestZone(testBody, this, this.queueRunner, done);
                    }
                    : function () {
                        return runInTestZone(testBody, this, this.queueRunner);
                    }));
        }
        const QueueRunner = jasmine.QueueRunner;
        jasmine.QueueRunner = (function (_super) {
            __extends(ZoneQueueRunner, _super);
            function ZoneQueueRunner(attrs) {
                if (attrs.onComplete) {
                    attrs.onComplete = ((fn) => () => {
                        // All functions are done, clear the test zone.
                        this.testProxyZone = null;
                        this.testProxyZoneSpec = null;
                        ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
                    })(attrs.onComplete);
                }
                const nativeSetTimeout = global[Zone.__symbol__('setTimeout')];
                const nativeClearTimeout = global[Zone.__symbol__('clearTimeout')];
                if (nativeSetTimeout) {
                    // should run setTimeout inside jasmine outside of zone
                    attrs.timeout = {
                        setTimeout: nativeSetTimeout ? nativeSetTimeout : global.setTimeout,
                        clearTimeout: nativeClearTimeout ? nativeClearTimeout : global.clearTimeout,
                    };
                }
                // create a userContext to hold the queueRunner itself
                // so we can access the testProxy in it/xit/beforeEach ...
                if (jasmine.UserContext) {
                    if (!attrs.userContext) {
                        attrs.userContext = new jasmine.UserContext();
                    }
                    attrs.userContext.queueRunner = this;
                }
                else {
                    if (!attrs.userContext) {
                        attrs.userContext = {};
                    }
                    attrs.userContext.queueRunner = this;
                }
                // patch attrs.onException
                const onException = attrs.onException;
                attrs.onException = function (error) {
                    if (error &&
                        error.message ===
                            'Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.') {
                        // jasmine timeout, we can make the error message more
                        // reasonable to tell what tasks are pending
                        const proxyZoneSpec = this && this.testProxyZoneSpec;
                        if (proxyZoneSpec) {
                            const pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
                            try {
                                // try catch here in case error.message is not writable
                                error.message += pendingTasksInfo;
                            }
                            catch (err) { }
                        }
                    }
                    if (onException) {
                        onException.call(this, error);
                    }
                };
                _super.call(this, attrs);
            }
            ZoneQueueRunner.prototype.execute = function () {
                let zone = Zone.current;
                let isChildOfAmbientZone = false;
                while (zone) {
                    if (zone === ambientZone) {
                        isChildOfAmbientZone = true;
                        break;
                    }
                    zone = zone.parent;
                }
                if (!isChildOfAmbientZone)
                    throw new Error('Unexpected Zone: ' + Zone.current.name);
                // This is the zone which will be used for running individual tests.
                // It will be a proxy zone, so that the tests function can retroactively install
                // different zones.
                // Example:
                //   - In beforeEach() do childZone = Zone.current.fork(...);
                //   - In it() try to do fakeAsync(). The issue is that because the beforeEach forked the
                //     zone outside of fakeAsync it will be able to escape the fakeAsync rules.
                //   - Because ProxyZone is parent fo `childZone` fakeAsync can retroactively add
                //     fakeAsync behavior to the childZone.
                this.testProxyZoneSpec = new ProxyZoneSpec();
                this.testProxyZone = ambientZone.fork(this.testProxyZoneSpec);
                if (!Zone.currentTask) {
                    // if we are not running in a task then if someone would register a
                    // element.addEventListener and then calling element.click() the
                    // addEventListener callback would think that it is the top most task and would
                    // drain the microtask queue on element.click() which would be incorrect.
                    // For this reason we always force a task when running jasmine tests.
                    Zone.current.scheduleMicroTask('jasmine.execute().forceTask', () => QueueRunner.prototype.execute.call(this));
                }
                else {
                    _super.prototype.execute.call(this);
                }
            };
            return ZoneQueueRunner;
        })(QueueRunner);
    });
}

function patchJest(Zone) {
    Zone.__load_patch('jest', (context, Zone, api) => {
        if (typeof jest === 'undefined' || jest['__zone_patch__']) {
            return;
        }
        // From jest 29 and jest-preset-angular v13, the module transform logic
        // changed, and now jest-preset-angular use the use the tsconfig target
        // other than the hardcoded one, https://github.com/thymikee/jest-preset-angular/issues/2010
        // But jest-angular-preset doesn't introduce the @babel/plugin-transform-async-to-generator
        // which is needed by angular since `async/await` still need to be transformed
        // to promise for ES2017+ target.
        // So for now, we disable to output the uncaught error console log for a temp solution,
        // until jest-preset-angular find a proper solution.
        Zone[api.symbol('ignoreConsoleErrorUncaughtError')] = true;
        jest['__zone_patch__'] = true;
        const ProxyZoneSpec = Zone['ProxyZoneSpec'];
        const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
        if (!ProxyZoneSpec) {
            throw new Error('Missing ProxyZoneSpec');
        }
        const rootZone = Zone.current;
        const syncZone = rootZone.fork(new SyncTestZoneSpec('jest.describe'));
        const proxyZoneSpec = new ProxyZoneSpec();
        const proxyZone = rootZone.fork(proxyZoneSpec);
        function wrapDescribeFactoryInZone(originalJestFn) {
            return function (...tableArgs) {
                const originalDescribeFn = originalJestFn.apply(this, tableArgs);
                return function (...args) {
                    args[1] = wrapDescribeInZone(args[1]);
                    return originalDescribeFn.apply(this, args);
                };
            };
        }
        function wrapTestFactoryInZone(originalJestFn) {
            return function (...tableArgs) {
                return function (...args) {
                    args[1] = wrapTestInZone(args[1]);
                    return originalJestFn.apply(this, tableArgs).apply(this, args);
                };
            };
        }
        /**
         * Gets a function wrapping the body of a jest `describe` block to execute in a
         * synchronous-only zone.
         */
        function wrapDescribeInZone(describeBody) {
            return function (...args) {
                return syncZone.run(describeBody, this, args);
            };
        }
        /**
         * Gets a function wrapping the body of a jest `it/beforeEach/afterEach` block to
         * execute in a ProxyZone zone.
         * This will run in the `proxyZone`.
         */
        function wrapTestInZone(testBody, isTestFunc = false) {
            if (typeof testBody !== 'function') {
                return testBody;
            }
            const wrappedFunc = function () {
                if (Zone[api.symbol('useFakeTimersCalled')] === true &&
                    testBody &&
                    !testBody.isFakeAsync) {
                    // jest.useFakeTimers is called, run into fakeAsyncTest automatically.
                    const fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
                    if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
                        testBody = fakeAsyncModule.fakeAsync(testBody);
                    }
                }
                proxyZoneSpec.isTestFunc = isTestFunc;
                return proxyZone.run(testBody, null, arguments);
            };
            // Update the length of wrappedFunc to be the same as the length of the testBody
            // So jest core can handle whether the test function has `done()` or not correctly
            Object.defineProperty(wrappedFunc, 'length', {
                configurable: true,
                writable: true,
                enumerable: false,
            });
            wrappedFunc.length = testBody.length;
            return wrappedFunc;
        }
        ['describe', 'xdescribe', 'fdescribe'].forEach((methodName) => {
            let originalJestFn = context[methodName];
            if (context[Zone.__symbol__(methodName)]) {
                return;
            }
            context[Zone.__symbol__(methodName)] = originalJestFn;
            context[methodName] = function (...args) {
                args[1] = wrapDescribeInZone(args[1]);
                return originalJestFn.apply(this, args);
            };
            context[methodName].each = wrapDescribeFactoryInZone(originalJestFn.each);
        });
        context.describe.only = context.fdescribe;
        context.describe.skip = context.xdescribe;
        ['it', 'xit', 'fit', 'test', 'xtest'].forEach((methodName) => {
            let originalJestFn = context[methodName];
            if (context[Zone.__symbol__(methodName)]) {
                return;
            }
            context[Zone.__symbol__(methodName)] = originalJestFn;
            context[methodName] = function (...args) {
                args[1] = wrapTestInZone(args[1], true);
                return originalJestFn.apply(this, args);
            };
            context[methodName].each = wrapTestFactoryInZone(originalJestFn.each);
            context[methodName].todo = originalJestFn.todo;
            context[methodName].failing = originalJestFn.failing;
        });
        context.it.only = context.fit;
        context.it.skip = context.xit;
        context.test.only = context.fit;
        context.test.skip = context.xit;
        ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach((methodName) => {
            let originalJestFn = context[methodName];
            if (context[Zone.__symbol__(methodName)]) {
                return;
            }
            context[Zone.__symbol__(methodName)] = originalJestFn;
            context[methodName] = function (...args) {
                args[0] = wrapTestInZone(args[0]);
                return originalJestFn.apply(this, args);
            };
        });
        Zone.patchJestObject = function patchJestObject(Timer, isModern = false) {
            // check whether currently the test is inside fakeAsync()
            function isPatchingFakeTimer() {
                const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                return !!fakeAsyncZoneSpec;
            }
            // check whether the current function is inside `test/it` or other methods
            // such as `describe/beforeEach`
            function isInTestFunc() {
                const proxyZoneSpec = Zone.current.get('ProxyZoneSpec');
                return proxyZoneSpec && proxyZoneSpec.isTestFunc;
            }
            if (Timer[api.symbol('fakeTimers')]) {
                return;
            }
            Timer[api.symbol('fakeTimers')] = true;
            // patch jest fakeTimer internal method to make sure no console.warn print out
            api.patchMethod(Timer, '_checkFakeTimers', (delegate) => {
                return function (self, args) {
                    if (isPatchingFakeTimer()) {
                        return true;
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch useFakeTimers(), set useFakeTimersCalled flag, and make test auto run into fakeAsync
            api.patchMethod(Timer, 'useFakeTimers', (delegate) => {
                return function (self, args) {
                    Zone[api.symbol('useFakeTimersCalled')] = true;
                    if (isModern || isInTestFunc()) {
                        return delegate.apply(self, args);
                    }
                    return self;
                };
            });
            // patch useRealTimers(), unset useFakeTimers flag
            api.patchMethod(Timer, 'useRealTimers', (delegate) => {
                return function (self, args) {
                    Zone[api.symbol('useFakeTimersCalled')] = false;
                    if (isModern || isInTestFunc()) {
                        return delegate.apply(self, args);
                    }
                    return self;
                };
            });
            // patch setSystemTime(), call setCurrentRealTime() in the fakeAsyncTest
            api.patchMethod(Timer, 'setSystemTime', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec && isPatchingFakeTimer()) {
                        fakeAsyncZoneSpec.setFakeBaseSystemTime(args[0]);
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch getSystemTime(), call getCurrentRealTime() in the fakeAsyncTest
            api.patchMethod(Timer, 'getRealSystemTime', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec && isPatchingFakeTimer()) {
                        return fakeAsyncZoneSpec.getRealSystemTime();
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch runAllTicks(), run all microTasks inside fakeAsync
            api.patchMethod(Timer, 'runAllTicks', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec) {
                        fakeAsyncZoneSpec.flushMicrotasks();
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch runAllTimers(), run all macroTasks inside fakeAsync
            api.patchMethod(Timer, 'runAllTimers', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec) {
                        fakeAsyncZoneSpec.flush(100, true);
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch advanceTimersByTime(), call tick() in the fakeAsyncTest
            api.patchMethod(Timer, 'advanceTimersByTime', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec) {
                        fakeAsyncZoneSpec.tick(args[0]);
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch runOnlyPendingTimers(), call flushOnlyPendingTimers() in the fakeAsyncTest
            api.patchMethod(Timer, 'runOnlyPendingTimers', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec) {
                        fakeAsyncZoneSpec.flushOnlyPendingTimers();
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch advanceTimersToNextTimer(), call tickToNext() in the fakeAsyncTest
            api.patchMethod(Timer, 'advanceTimersToNextTimer', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec) {
                        fakeAsyncZoneSpec.tickToNext(args[0]);
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch clearAllTimers(), call removeAllTimers() in the fakeAsyncTest
            api.patchMethod(Timer, 'clearAllTimers', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec) {
                        fakeAsyncZoneSpec.removeAllTimers();
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
            // patch getTimerCount(), call getTimerCount() in the fakeAsyncTest
            api.patchMethod(Timer, 'getTimerCount', (delegate) => {
                return function (self, args) {
                    const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
                    if (fakeAsyncZoneSpec) {
                        return fakeAsyncZoneSpec.getTimerCount();
                    }
                    else {
                        return delegate.apply(self, args);
                    }
                };
            });
        };
    });
}

function patchMocha(Zone) {
    Zone.__load_patch('mocha', (global, Zone) => {
        const Mocha = global.Mocha;
        if (typeof Mocha === 'undefined') {
            // return if Mocha is not available, because now zone-testing
            // will load mocha patch with jasmine/jest patch
            return;
        }
        if (typeof Zone === 'undefined') {
            throw new Error('Missing Zone.js');
        }
        const ProxyZoneSpec = Zone['ProxyZoneSpec'];
        const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
        if (!ProxyZoneSpec) {
            throw new Error('Missing ProxyZoneSpec');
        }
        if (Mocha['__zone_patch__']) {
            throw new Error('"Mocha" has already been patched with "Zone".');
        }
        Mocha['__zone_patch__'] = true;
        const rootZone = Zone.current;
        const syncZone = rootZone.fork(new SyncTestZoneSpec('Mocha.describe'));
        let testZone = null;
        const suiteZone = rootZone.fork(new ProxyZoneSpec());
        const mochaOriginal = {
            after: global.after,
            afterEach: global.afterEach,
            before: global.before,
            beforeEach: global.beforeEach,
            describe: global.describe,
            it: global.it,
        };
        function modifyArguments(args, syncTest, asyncTest) {
            for (let i = 0; i < args.length; i++) {
                let arg = args[i];
                if (typeof arg === 'function') {
                    // The `done` callback is only passed through if the function expects at
                    // least one argument.
                    // Note we have to make a function with correct number of arguments,
                    // otherwise mocha will
                    // think that all functions are sync or async.
                    args[i] = arg.length === 0 ? syncTest(arg) : asyncTest(arg);
                    // Mocha uses toString to view the test body in the result list, make sure we return the
                    // correct function body
                    args[i].toString = function () {
                        return arg.toString();
                    };
                }
            }
            return args;
        }
        function wrapDescribeInZone(args) {
            const syncTest = function (fn) {
                return function () {
                    return syncZone.run(fn, this, arguments);
                };
            };
            return modifyArguments(args, syncTest);
        }
        function wrapTestInZone(args) {
            const asyncTest = function (fn) {
                return function (done) {
                    return testZone.run(fn, this, [done]);
                };
            };
            const syncTest = function (fn) {
                return function () {
                    return testZone.run(fn, this);
                };
            };
            return modifyArguments(args, syncTest, asyncTest);
        }
        function wrapSuiteInZone(args) {
            const asyncTest = function (fn) {
                return function (done) {
                    return suiteZone.run(fn, this, [done]);
                };
            };
            const syncTest = function (fn) {
                return function () {
                    return suiteZone.run(fn, this);
                };
            };
            return modifyArguments(args, syncTest, asyncTest);
        }
        global.describe = global.suite = function () {
            return mochaOriginal.describe.apply(this, wrapDescribeInZone(arguments));
        };
        global.xdescribe =
            global.suite.skip =
                global.describe.skip =
                    function () {
                        return mochaOriginal.describe.skip.apply(this, wrapDescribeInZone(arguments));
                    };
        global.describe.only = global.suite.only = function () {
            return mochaOriginal.describe.only.apply(this, wrapDescribeInZone(arguments));
        };
        global.it =
            global.specify =
                global.test =
                    function () {
                        return mochaOriginal.it.apply(this, wrapTestInZone(arguments));
                    };
        global.xit =
            global.xspecify =
                global.it.skip =
                    function () {
                        return mochaOriginal.it.skip.apply(this, wrapTestInZone(arguments));
                    };
        global.it.only = global.test.only = function () {
            return mochaOriginal.it.only.apply(this, wrapTestInZone(arguments));
        };
        global.after = global.suiteTeardown = function () {
            return mochaOriginal.after.apply(this, wrapSuiteInZone(arguments));
        };
        global.afterEach = global.teardown = function () {
            return mochaOriginal.afterEach.apply(this, wrapTestInZone(arguments));
        };
        global.before = global.suiteSetup = function () {
            return mochaOriginal.before.apply(this, wrapSuiteInZone(arguments));
        };
        global.beforeEach = global.setup = function () {
            return mochaOriginal.beforeEach.apply(this, wrapTestInZone(arguments));
        };
        ((originalRunTest, originalRun) => {
            Mocha.Runner.prototype.runTest = function (fn) {
                Zone.current.scheduleMicroTask('mocha.forceTask', () => {
                    originalRunTest.call(this, fn);
                });
            };
            Mocha.Runner.prototype.run = function (fn) {
                this.on('test', (e) => {
                    testZone = rootZone.fork(new ProxyZoneSpec());
                });
                this.on('fail', (test, err) => {
                    const proxyZoneSpec = testZone && testZone.get('ProxyZoneSpec');
                    if (proxyZoneSpec && err) {
                        try {
                            // try catch here in case err.message is not writable
                            err.message += proxyZoneSpec.getAndClearPendingTasksInfo();
                        }
                        catch (error) { }
                    }
                });
                return originalRun.call(this, fn);
            };
        })(Mocha.Runner.prototype.runTest, Mocha.Runner.prototype.run);
    });
}

const global$2 = globalThis;
// __Zone_symbol_prefix global can be used to override the default zone
// symbol prefix with a custom one if needed.
function __symbol__(name) {
    const symbolPrefix = global$2['__Zone_symbol_prefix'] || '__zone_symbol__';
    return symbolPrefix + name;
}

const __global = (typeof window !== 'undefined' && window) || (typeof self !== 'undefined' && self) || global;
class AsyncTestZoneSpec {
    finishCallback;
    failCallback;
    // Needs to be a getter and not a plain property in order run this just-in-time. Otherwise
    // `__symbol__` would be evaluated during top-level execution prior to the Zone prefix being
    // changed for tests.
    static get symbolParentUnresolved() {
        return __symbol__('parentUnresolved');
    }
    _pendingMicroTasks = false;
    _pendingMacroTasks = false;
    _alreadyErrored = false;
    _isSync = false;
    _existingFinishTimer = null;
    entryFunction = null;
    runZone = Zone.current;
    unresolvedChainedPromiseCount = 0;
    supportWaitUnresolvedChainedPromise = false;
    constructor(finishCallback, failCallback, namePrefix) {
        this.finishCallback = finishCallback;
        this.failCallback = failCallback;
        this.name = 'asyncTestZone for ' + namePrefix;
        this.properties = { 'AsyncTestZoneSpec': this };
        this.supportWaitUnresolvedChainedPromise =
            __global[__symbol__('supportWaitUnResolvedChainedPromise')] === true;
    }
    isUnresolvedChainedPromisePending() {
        return this.unresolvedChainedPromiseCount > 0;
    }
    _finishCallbackIfDone() {
        // NOTE: Technically the `onHasTask` could fire together with the initial synchronous
        // completion in `onInvoke`. `onHasTask` might call this method when it captured e.g.
        // microtasks in the proxy zone that now complete as part of this async zone run.
        // Consider the following scenario:
        //    1. A test `beforeEach` schedules a microtask in the ProxyZone.
        //    2. An actual empty `it` spec executes in the AsyncTestZone` (using e.g. `waitForAsync`).
        //    3. The `onInvoke` invokes `_finishCallbackIfDone` because the spec runs synchronously.
        //    4. We wait the scheduled timeout (see below) to account for unhandled promises.
        //    5. The microtask from (1) finishes and `onHasTask` is invoked.
        //    --> We register a second `_finishCallbackIfDone` even though we have scheduled a timeout.
        // If the finish timeout from below is already scheduled, terminate the existing scheduled
        // finish invocation, avoiding calling `jasmine` `done` multiple times. *Note* that we would
        // want to schedule a new finish callback in case the task state changes again.
        if (this._existingFinishTimer !== null) {
            clearTimeout(this._existingFinishTimer);
            this._existingFinishTimer = null;
        }
        if (!(this._pendingMicroTasks ||
            this._pendingMacroTasks ||
            (this.supportWaitUnresolvedChainedPromise && this.isUnresolvedChainedPromisePending()))) {
            // We wait until the next tick because we would like to catch unhandled promises which could
            // cause test logic to be executed. In such cases we cannot finish with tasks pending then.
            this.runZone.run(() => {
                this._existingFinishTimer = setTimeout(() => {
                    if (!this._alreadyErrored && !(this._pendingMicroTasks || this._pendingMacroTasks)) {
                        this.finishCallback();
                    }
                }, 0);
            });
        }
    }
    patchPromiseForTest() {
        if (!this.supportWaitUnresolvedChainedPromise) {
            return;
        }
        const patchPromiseForTest = Promise[Zone.__symbol__('patchPromiseForTest')];
        if (patchPromiseForTest) {
            patchPromiseForTest();
        }
    }
    unPatchPromiseForTest() {
        if (!this.supportWaitUnresolvedChainedPromise) {
            return;
        }
        const unPatchPromiseForTest = Promise[Zone.__symbol__('unPatchPromiseForTest')];
        if (unPatchPromiseForTest) {
            unPatchPromiseForTest();
        }
    }
    // ZoneSpec implementation below.
    name;
    properties;
    onScheduleTask(delegate, current, target, task) {
        if (task.type !== 'eventTask') {
            this._isSync = false;
        }
        if (task.type === 'microTask' && task.data && task.data instanceof Promise) {
            // check whether the promise is a chained promise
            if (task.data[AsyncTestZoneSpec.symbolParentUnresolved] === true) {
                // chained promise is being scheduled
                this.unresolvedChainedPromiseCount--;
            }
        }
        return delegate.scheduleTask(target, task);
    }
    onInvokeTask(delegate, current, target, task, applyThis, applyArgs) {
        if (task.type !== 'eventTask') {
            this._isSync = false;
        }
        return delegate.invokeTask(target, task, applyThis, applyArgs);
    }
    onCancelTask(delegate, current, target, task) {
        if (task.type !== 'eventTask') {
            this._isSync = false;
        }
        return delegate.cancelTask(target, task);
    }
    // Note - we need to use onInvoke at the moment to call finish when a test is
    // fully synchronous. TODO(juliemr): remove this when the logic for
    // onHasTask changes and it calls whenever the task queues are dirty.
    // updated by(JiaLiPassion), only call finish callback when no task
    // was scheduled/invoked/canceled.
    onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
        if (!this.entryFunction) {
            this.entryFunction = delegate;
        }
        try {
            this._isSync = true;
            return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
        }
        finally {
            // We need to check the delegate is the same as entryFunction or not.
            // Consider the following case.
            //
            // asyncTestZone.run(() => { // Here the delegate will be the entryFunction
            //   Zone.current.run(() => { // Here the delegate will not be the entryFunction
            //   });
            // });
            //
            // We only want to check whether there are async tasks scheduled
            // for the entry function.
            if (this._isSync && this.entryFunction === delegate) {
                this._finishCallbackIfDone();
            }
        }
    }
    onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
        // Let the parent try to handle the error.
        const result = parentZoneDelegate.handleError(targetZone, error);
        if (result) {
            this.failCallback(error);
            this._alreadyErrored = true;
        }
        return false;
    }
    onHasTask(delegate, current, target, hasTaskState) {
        delegate.hasTask(target, hasTaskState);
        // We should only trigger finishCallback when the target zone is the AsyncTestZone
        // Consider the following cases.
        //
        // const childZone = asyncTestZone.fork({
        //   name: 'child',
        //   onHasTask: ...
        // });
        //
        // So we have nested zones declared the onHasTask hook, in this case,
        // the onHasTask will be triggered twice, and cause the finishCallbackIfDone()
        // is also be invoked twice. So we need to only trigger the finishCallbackIfDone()
        // when the current zone is the same as the target zone.
        if (current !== target) {
            return;
        }
        if (hasTaskState.change == 'microTask') {
            this._pendingMicroTasks = hasTaskState.microTask;
            this._finishCallbackIfDone();
        }
        else if (hasTaskState.change == 'macroTask') {
            this._pendingMacroTasks = hasTaskState.macroTask;
            this._finishCallbackIfDone();
        }
    }
}
function patchAsyncTest(Zone) {
    // Export the class so that new instances can be created with proper
    // constructor params.
    Zone['AsyncTestZoneSpec'] = AsyncTestZoneSpec;
    Zone.__load_patch('asynctest', (global, Zone, api) => {
        /**
         * Wraps a test function in an asynchronous test zone. The test will automatically
         * complete when all asynchronous calls within this zone are done.
         */
        Zone[api.symbol('asyncTest')] = function asyncTest(fn) {
            // If we're running using the Jasmine test framework, adapt to call the 'done'
            // function when asynchronous activity is finished.
            if (global.jasmine) {
                // Not using an arrow function to preserve context passed from call site
                return function (done) {
                    if (!done) {
                        // if we run beforeEach in @angular/core/testing/testing_internal then we get no done
                        // fake it here and assume sync.
                        done = function () { };
                        done.fail = function (e) {
                            throw e;
                        };
                    }
                    runInTestZone(fn, this, done, (err) => {
                        if (typeof err === 'string') {
                            return done.fail(new Error(err));
                        }
                        else {
                            done.fail(err);
                        }
                    });
                };
            }
            // Otherwise, return a promise which will resolve when asynchronous activity
            // is finished. This will be correctly consumed by the Mocha framework with
            // it('...', async(myFn)); or can be used in a custom framework.
            // Not using an arrow function to preserve context passed from call site
            return function () {
                return new Promise((finishCallback, failCallback) => {
                    runInTestZone(fn, this, finishCallback, failCallback);
                });
            };
        };
        function runInTestZone(fn, context, finishCallback, failCallback) {
            const currentZone = Zone.current;
            const AsyncTestZoneSpec = Zone['AsyncTestZoneSpec'];
            if (AsyncTestZoneSpec === undefined) {
                throw new Error('AsyncTestZoneSpec is needed for the async() test helper but could not be found. ' +
                    'Please make sure that your environment includes zone.js/plugins/async-test');
            }
            const ProxyZoneSpec = Zone['ProxyZoneSpec'];
            if (!ProxyZoneSpec) {
                throw new Error('ProxyZoneSpec is needed for the async() test helper but could not be found. ' +
                    'Please make sure that your environment includes zone.js/plugins/proxy');
            }
            const proxyZoneSpec = ProxyZoneSpec.get();
            ProxyZoneSpec.assertPresent();
            // We need to create the AsyncTestZoneSpec outside the ProxyZone.
            // If we do it in ProxyZone then we will get to infinite recursion.
            const proxyZone = Zone.current.getZoneWith('ProxyZoneSpec');
            const previousDelegate = proxyZoneSpec.getDelegate();
            proxyZone.parent.run(() => {
                const testZoneSpec = new AsyncTestZoneSpec(() => {
                    // Need to restore the original zone.
                    if (proxyZoneSpec.getDelegate() == testZoneSpec) {
                        // Only reset the zone spec if it's
                        // still this one. Otherwise, assume
                        // it's OK.
                        proxyZoneSpec.setDelegate(previousDelegate);
                    }
                    testZoneSpec.unPatchPromiseForTest();
                    currentZone.run(() => {
                        finishCallback();
                    });
                }, (error) => {
                    // Need to restore the original zone.
                    if (proxyZoneSpec.getDelegate() == testZoneSpec) {
                        // Only reset the zone spec if it's sill this one. Otherwise, assume it's OK.
                        proxyZoneSpec.setDelegate(previousDelegate);
                    }
                    testZoneSpec.unPatchPromiseForTest();
                    currentZone.run(() => {
                        failCallback(error);
                    });
                }, 'test');
                proxyZoneSpec.setDelegate(testZoneSpec);
                testZoneSpec.patchPromiseForTest();
            });
            return Zone.current.runGuarded(fn, context);
        }
    });
}

const global$1 = (typeof window === 'object' && window) || (typeof self === 'object' && self) || globalThis.global;
const OriginalDate = global$1.Date;
// Since when we compile this file to `es2015`, and if we define
// this `FakeDate` as `class FakeDate`, and then set `FakeDate.prototype`
// there will be an error which is `Cannot assign to read only property 'prototype'`
// so we need to use function implementation here.
function FakeDate() {
    if (arguments.length === 0) {
        const d = new OriginalDate();
        d.setTime(FakeDate.now());
        return d;
    }
    else {
        const args = Array.prototype.slice.call(arguments);
        return new OriginalDate(...args);
    }
}
FakeDate.now = function () {
    const fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
    if (fakeAsyncTestZoneSpec) {
        return fakeAsyncTestZoneSpec.getFakeSystemTime();
    }
    return OriginalDate.now.apply(this, arguments);
};
FakeDate.UTC = OriginalDate.UTC;
FakeDate.parse = OriginalDate.parse;
// keep a reference for zone patched timer function
let patchedTimers;
const timeoutCallback = function () { };
class Scheduler {
    // Next scheduler id.
    static nextNodeJSId = 1;
    static nextId = -1;
    // Scheduler queue with the tuple of end time and callback function - sorted by end time.
    _schedulerQueue = [];
    // Current simulated time in millis.
    _currentTickTime = 0;
    // Current fake system base time in millis.
    _currentFakeBaseSystemTime = OriginalDate.now();
    // track requeuePeriodicTimer
    _currentTickRequeuePeriodicEntries = [];
    constructor() { }
    static getNextId() {
        const id = patchedTimers.nativeSetTimeout.call(global$1, timeoutCallback, 0);
        patchedTimers.nativeClearTimeout.call(global$1, id);
        if (typeof id === 'number') {
            return id;
        }
        // in NodeJS, we just use a number for fakeAsync, since it will not
        // conflict with native TimeoutId
        return Scheduler.nextNodeJSId++;
    }
    getCurrentTickTime() {
        return this._currentTickTime;
    }
    getFakeSystemTime() {
        return this._currentFakeBaseSystemTime + this._currentTickTime;
    }
    setFakeBaseSystemTime(fakeBaseSystemTime) {
        this._currentFakeBaseSystemTime = fakeBaseSystemTime;
    }
    getRealSystemTime() {
        return OriginalDate.now();
    }
    scheduleFunction(cb, delay, options) {
        options = {
            ...{
                args: [],
                isPeriodic: false,
                isRequestAnimationFrame: false,
                id: -1,
                isRequeuePeriodic: false,
            },
            ...options,
        };
        let currentId = options.id < 0 ? Scheduler.nextId : options.id;
        Scheduler.nextId = Scheduler.getNextId();
        let endTime = this._currentTickTime + delay;
        // Insert so that scheduler queue remains sorted by end time.
        let newEntry = {
            endTime: endTime,
            id: currentId,
            func: cb,
            args: options.args,
            delay: delay,
            isPeriodic: options.isPeriodic,
            isRequestAnimationFrame: options.isRequestAnimationFrame,
        };
        if (options.isRequeuePeriodic) {
            this._currentTickRequeuePeriodicEntries.push(newEntry);
        }
        let i = 0;
        for (; i < this._schedulerQueue.length; i++) {
            let currentEntry = this._schedulerQueue[i];
            if (newEntry.endTime < currentEntry.endTime) {
                break;
            }
        }
        this._schedulerQueue.splice(i, 0, newEntry);
        return currentId;
    }
    removeScheduledFunctionWithId(id) {
        for (let i = 0; i < this._schedulerQueue.length; i++) {
            if (this._schedulerQueue[i].id == id) {
                this._schedulerQueue.splice(i, 1);
                break;
            }
        }
    }
    removeAll() {
        this._schedulerQueue = [];
    }
    getTimerCount() {
        return this._schedulerQueue.length;
    }
    tickToNext(step = 1, doTick, tickOptions) {
        if (this._schedulerQueue.length < step) {
            return;
        }
        // Find the last task currently queued in the scheduler queue and tick
        // till that time.
        const startTime = this._currentTickTime;
        const targetTask = this._schedulerQueue[step - 1];
        this.tick(targetTask.endTime - startTime, doTick, tickOptions);
    }
    tick(millis = 0, doTick, tickOptions) {
        let finalTime = this._currentTickTime + millis;
        let lastCurrentTime = 0;
        tickOptions = Object.assign({ processNewMacroTasksSynchronously: true }, tickOptions);
        // we need to copy the schedulerQueue so nested timeout
        // will not be wrongly called in the current tick
        // https://github.com/angular/angular/issues/33799
        const schedulerQueue = tickOptions.processNewMacroTasksSynchronously
            ? this._schedulerQueue
            : this._schedulerQueue.slice();
        if (schedulerQueue.length === 0 && doTick) {
            doTick(millis);
            return;
        }
        while (schedulerQueue.length > 0) {
            // clear requeueEntries before each loop
            this._currentTickRequeuePeriodicEntries = [];
            let current = schedulerQueue[0];
            if (finalTime < current.endTime) {
                // Done processing the queue since it's sorted by endTime.
                break;
            }
            else {
                // Time to run scheduled function. Remove it from the head of queue.
                let current = schedulerQueue.shift();
                if (!tickOptions.processNewMacroTasksSynchronously) {
                    const idx = this._schedulerQueue.indexOf(current);
                    if (idx >= 0) {
                        this._schedulerQueue.splice(idx, 1);
                    }
                }
                lastCurrentTime = this._currentTickTime;
                this._currentTickTime = current.endTime;
                if (doTick) {
                    doTick(this._currentTickTime - lastCurrentTime);
                }
                let retval = current.func.apply(global$1, current.isRequestAnimationFrame ? [this._currentTickTime] : current.args);
                if (!retval) {
                    // Uncaught exception in the current scheduled function. Stop processing the queue.
                    break;
                }
                // check is there any requeue periodic entry is added in
                // current loop, if there is, we need to add to current loop
                if (!tickOptions.processNewMacroTasksSynchronously) {
                    this._currentTickRequeuePeriodicEntries.forEach((newEntry) => {
                        let i = 0;
                        for (; i < schedulerQueue.length; i++) {
                            const currentEntry = schedulerQueue[i];
                            if (newEntry.endTime < currentEntry.endTime) {
                                break;
                            }
                        }
                        schedulerQueue.splice(i, 0, newEntry);
                    });
                }
            }
        }
        lastCurrentTime = this._currentTickTime;
        this._currentTickTime = finalTime;
        if (doTick) {
            doTick(this._currentTickTime - lastCurrentTime);
        }
    }
    flushOnlyPendingTimers(doTick) {
        if (this._schedulerQueue.length === 0) {
            return 0;
        }
        // Find the last task currently queued in the scheduler queue and tick
        // till that time.
        const startTime = this._currentTickTime;
        const lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
        this.tick(lastTask.endTime - startTime, doTick, { processNewMacroTasksSynchronously: false });
        return this._currentTickTime - startTime;
    }
    flush(limit = 20, flushPeriodic = false, doTick) {
        if (flushPeriodic) {
            return this.flushPeriodic(doTick);
        }
        else {
            return this.flushNonPeriodic(limit, doTick);
        }
    }
    flushPeriodic(doTick) {
        if (this._schedulerQueue.length === 0) {
            return 0;
        }
        // Find the last task currently queued in the scheduler queue and tick
        // till that time.
        const startTime = this._currentTickTime;
        const lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
        this.tick(lastTask.endTime - startTime, doTick);
        return this._currentTickTime - startTime;
    }
    flushNonPeriodic(limit, doTick) {
        const startTime = this._currentTickTime;
        let lastCurrentTime = 0;
        let count = 0;
        while (this._schedulerQueue.length > 0) {
            count++;
            if (count > limit) {
                throw new Error('flush failed after reaching the limit of ' +
                    limit +
                    ' tasks. Does your code use a polling timeout?');
            }
            // flush only non-periodic timers.
            // If the only remaining tasks are periodic(or requestAnimationFrame), finish flushing.
            if (this._schedulerQueue.filter((task) => !task.isPeriodic && !task.isRequestAnimationFrame)
                .length === 0) {
                break;
            }
            const current = this._schedulerQueue.shift();
            lastCurrentTime = this._currentTickTime;
            this._currentTickTime = current.endTime;
            if (doTick) {
                // Update any secondary schedulers like Jasmine mock Date.
                doTick(this._currentTickTime - lastCurrentTime);
            }
            const retval = current.func.apply(global$1, current.args);
            if (!retval) {
                // Uncaught exception in the current scheduled function. Stop processing the queue.
                break;
            }
        }
        return this._currentTickTime - startTime;
    }
}
class FakeAsyncTestZoneSpec {
    trackPendingRequestAnimationFrame;
    macroTaskOptions;
    static assertInZone() {
        if (Zone.current.get('FakeAsyncTestZoneSpec') == null) {
            throw new Error('The code should be running in the fakeAsync zone to call this function');
        }
    }
    _scheduler = new Scheduler();
    _microtasks = [];
    _lastError = null;
    _uncaughtPromiseErrors = Promise[Zone.__symbol__('uncaughtPromiseErrors')];
    pendingPeriodicTimers = [];
    pendingTimers = [];
    patchDateLocked = false;
    constructor(namePrefix, trackPendingRequestAnimationFrame = false, macroTaskOptions) {
        this.trackPendingRequestAnimationFrame = trackPendingRequestAnimationFrame;
        this.macroTaskOptions = macroTaskOptions;
        this.name = 'fakeAsyncTestZone for ' + namePrefix;
        // in case user can't access the construction of FakeAsyncTestSpec
        // user can also define macroTaskOptions by define a global variable.
        if (!this.macroTaskOptions) {
            this.macroTaskOptions = global$1[Zone.__symbol__('FakeAsyncTestMacroTask')];
        }
    }
    _fnAndFlush(fn, completers) {
        return (...args) => {
            fn.apply(global$1, args);
            if (this._lastError === null) {
                // Success
                if (completers.onSuccess != null) {
                    completers.onSuccess.apply(global$1);
                }
                // Flush microtasks only on success.
                this.flushMicrotasks();
            }
            else {
                // Failure
                if (completers.onError != null) {
                    completers.onError.apply(global$1);
                }
            }
            // Return true if there were no errors, false otherwise.
            return this._lastError === null;
        };
    }
    static _removeTimer(timers, id) {
        let index = timers.indexOf(id);
        if (index > -1) {
            timers.splice(index, 1);
        }
    }
    _dequeueTimer(id) {
        return () => {
            FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
        };
    }
    _requeuePeriodicTimer(fn, interval, args, id) {
        return () => {
            // Requeue the timer callback if it's not been canceled.
            if (this.pendingPeriodicTimers.indexOf(id) !== -1) {
                this._scheduler.scheduleFunction(fn, interval, {
                    args,
                    isPeriodic: true,
                    id,
                    isRequeuePeriodic: true,
                });
            }
        };
    }
    _dequeuePeriodicTimer(id) {
        return () => {
            FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
        };
    }
    _setTimeout(fn, delay, args, isTimer = true) {
        let removeTimerFn = this._dequeueTimer(Scheduler.nextId);
        // Queue the callback and dequeue the timer on success and error.
        let cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
        let id = this._scheduler.scheduleFunction(cb, delay, { args, isRequestAnimationFrame: !isTimer });
        if (isTimer) {
            this.pendingTimers.push(id);
        }
        return id;
    }
    _clearTimeout(id) {
        FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
        this._scheduler.removeScheduledFunctionWithId(id);
    }
    _setInterval(fn, interval, args) {
        let id = Scheduler.nextId;
        let completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
        let cb = this._fnAndFlush(fn, completers);
        // Use the callback created above to requeue on success.
        completers.onSuccess = this._requeuePeriodicTimer(cb, interval, args, id);
        // Queue the callback and dequeue the periodic timer only on error.
        this._scheduler.scheduleFunction(cb, interval, { args, isPeriodic: true });
        this.pendingPeriodicTimers.push(id);
        return id;
    }
    _clearInterval(id) {
        FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
        this._scheduler.removeScheduledFunctionWithId(id);
    }
    _resetLastErrorAndThrow() {
        let error = this._lastError || this._uncaughtPromiseErrors[0];
        this._uncaughtPromiseErrors.length = 0;
        this._lastError = null;
        throw error;
    }
    getCurrentTickTime() {
        return this._scheduler.getCurrentTickTime();
    }
    getFakeSystemTime() {
        return this._scheduler.getFakeSystemTime();
    }
    setFakeBaseSystemTime(realTime) {
        this._scheduler.setFakeBaseSystemTime(realTime);
    }
    getRealSystemTime() {
        return this._scheduler.getRealSystemTime();
    }
    static patchDate() {
        if (!!global$1[Zone.__symbol__('disableDatePatching')]) {
            // we don't want to patch global Date
            // because in some case, global Date
            // is already being patched, we need to provide
            // an option to let user still use their
            // own version of Date.
            return;
        }
        if (global$1['Date'] === FakeDate) {
            // already patched
            return;
        }
        global$1['Date']y{ = FakeDate;
        FakeDate.prototype = OriginalDate.prototype;
        // try check and reset timers
        // because jasmine.clock().install() may
        // have replaced the global timer
        FakeAsyncTestZoneSpec.checkTimerPatch();
    }
    static resetDate() {
        if (global$1['Date'] === FakeDate) {
            global$1['Date'] = OriginalDate;
        }
    }
    static checkTimerPatch() {
        if (!patchedTimers) {
            throw new Error('Expected timers to have been patched.');
        }
        if (global$1.setTimeout !== patchedTimers.setTimeout) {
            global$1.setTimeout = patchedTimers.setTimeout;
            global$1.clearTimeout = patchedTimers.clearTimeout;
        }
        if (global$1.setInterval !== patchedTimers.setInterval) {
            global$1.setInterval = patchedTimers.setInterval;
            global$1.clearInterval = patchedTimers.clearInterval;
        }
    }
    lockDatePatch() {
        this.patchDateLocked = true;
        FakeAsyncTestZoneSpec.patchDate();
    }
    unlockDatePatch() {
        this.patchDateLocked = false;
        FakeAsyncTestZoneSpec.resetDate();
    }
    tickToNext(steps = 1, doTick, tickOptions = { processNewMacroTasksSynchronously: true }) {
        if (steps <= 0) {
            return;
        }
        FakeAsyncTestZoneSpec.assertInZone();
        this.flushMicrotasks();
        this._scheduler.tickToNext(steps, doTick, tickOptions);
        if (this._lastError !== null) {
            this._resetLastErrorAndThrow();
        }
    }
    tick(millis = 0, doTick, tickOptions = { processNewMacroTasksSynchronously: true }) {
        FakeAsyncTestZoneSpec.assertInZone();
        this.flushMicrotasks();
        this._scheduler.tick(millis, doTick, tickOptions);
        if (this._lastError !== null) {
            this._resetLastErrorAndThrow();
        }
    }
    flushMicrotasks() {
        FakeAsyncTestZoneSpec.assertInZone();
        const flushErrors = () => {
            if (this._lastError !== null || this._uncaughtPromiseErrors.length) {
                // If there is an error stop processing the microtask queue and rethrow the error.
                this._resetLastErrorAndThrow();
            }
        };
        while (this._microtasks.length > 0) {
            let microtask = this._microtasks.shift();
            microtask.func.apply(microtask.target, microtask.args);
        }
        flushErrors();
    }
    flush(limit, flushPeriodic, doTick) {
        FakeAsyncTestZoneSpec.assertInZone();
        this.flushMicrotasks();
        const elapsed = this._scheduler.flush(limit, flushPeriodic, doTick);
        if (this._lastError !== null) {
            this._resetLastErrorAndThrow();
        }
        return elapsed;
    }
    flushOnlyPendingTimers(doTick) {
        FakeAsyncTestZoneSpec.assertInZone();
        this.flushMicrotasks();
        const elapsed = this._scheduler.flushOnlyPendingTimers(doTick);
        if (this._lastError !== null) {
            this._resetLastErrorAndThrow();
        }
        return elapsed;
    }
    removeAllTimers() {
        FakeAsyncTestZoneSpec.assertInZone();
        this._scheduler.removeAll();
        this.pendingPeriodicTimers = [];
        this.pendingTimers = [];
    }
    getTimerCount() {
        return this._scheduler.getTimerCount() + this._microtasks.length;
    }
    // ZoneSpec implementation below.
    name;
    properties = { 'FakeAsyncTestZoneSpec': this };
    onScheduleTask(delegate, current, target, task) {
        switch (task.type) {
            case 'microTask':
                let args = task.data && task.data.args;
                // should pass additional arguments to callback if have any
                // currently we know process.nextTick will have such additional
                // arguments
                let additionalArgs;
                if (args) {
                    let callbackIndex = task.data.cbIdx;
                    if (typeof args.length === 'number' && args.length > callbackIndex + 1) {
                        additionalArgs = Array.prototype.slice.call(args, callbackIndex + 1);
                    }
                }
                this._microtasks.push({
                    func: task.invoke,
                    args: additionalArgs,
                    target: task.data && task.data.target,
                });
                break;
            case 'macroTask':
                switch (task.source) {
                    case 'setTimeout':
                        task.data['handleId'] = this._setTimeout(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
                        break;
                    case 'setImmediate':
                        task.data['handleId'] = this._setTimeout(task.invoke, 0, Array.prototype.slice.call(task.data['args'], 1));
                        break;
                    case 'setInterval':
                        task.data['handleId'] = this._setInterval(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
                        break;
                    case 'XMLHttpRequest.send':
                        throw new Error('Cannot make XHRs from within a fake async test. Request URL: ' +
                            task.data['url']);
                    case 'requestAnimationFrame':
                    case 'webkitRequestAnimationFrame':
                    case 'mozRequestAnimationFrame':
                        // Simulate a requestAnimationFrame by using a setTimeout with 16 ms.
                        // (60 frames per second)
                        task.data['handleId'] = this._setTimeout(task.invoke, 16, task.data['args'], this.trackPendingRequestAnimationFrame);
                        break;
                    default:
                        // user can define which macroTask they want to support by passing
                        // macroTaskOptions
                        const macroTaskOption = this.findMacroTaskOption(task);
                        if (macroTaskOption) {
                            const args = task.data && task.data['args'];
                            const delay = args && args.length > 1 ? args[1] : 0;
                            let callbackArgs = macroTaskOption.callbackArgs ? macroTaskOption.callbackArgs : args;
                            if (!!macroTaskOption.isPeriodic) {
                                // periodic macroTask, use setInterval to simulate
                                task.data['handleId'] = this._setInterval(task.invoke, delay, callbackArgs);
                                task.data.isPeriodic = true;
                            }
                            else {
                                // not periodic, use setTimeout to simulate
                                task.data['handleId'] = this._setTimeout(task.invoke, delay, callbackArgs);
                            }
                            break;
                        }
                        throw new Error('Unknown macroTask scheduled in fake async test: ' + task.source);
                }
                break;
            case 'eventTask':
                task = delegate.scheduleTask(target, task);
                break;
        }
        return task;
    }
    onCancelTask(delegate, current, target, task) {
        switch (task.source) {
            case 'setTimeout':
            case 'requestAnimationFrame':
            case 'webkitRequestAnimationFrame':
            case 'mozRequestAnimationFrame':
                return this._clearTimeout(task.data['handleId']);
            case 'setInterval':
                return this._clearInterval(task.data['handleId']);
            default:
                // user can define which macroTask they want to support by passing
                // macroTaskOptions
                const macroTaskOption = this.findMacroTaskOption(task);
                if (macroTaskOption) {
                    const handleId = task.data['handleId'];
                    return macroTaskOption.isPeriodic
                        ? this._clearInterval(handleId)
                        : this._clearTimeout(handleId);
                }
                return delegate.cancelTask(target, task);
        }
    }
    onInvoke(delegate, current, target, callback, applyThis, applyArgs, source) {
        try {
            FakeAsyncTestZoneSpec.patchDate();
            return delegate.invoke(target, callback, applyThis, applyArgs, source);
        }
        finally {
            if (!this.patchDateLocked) {
                FakeAsyncTestZoneSpec.resetDate();
            }
        }
    }
    findMacroTaskOption(task) {
        if (!this.macroTaskOptions) {
            return null;
        }
        for (let i = 0; i < this.macroTaskOptions.length; i++) {
            const macroTaskOption = this.macroTaskOptions[i];
            if (macroTaskOption.source === task.source) {
                return macroTaskOption;
            }
        }
        return null;
    }
    onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
        // ComponentFixture has a special-case handling to detect FakeAsyncTestZoneSpec
        // and prevent rethrowing the error from the onError subscription since it's handled here.
        this._lastError = error;
        return false; // Don't propagate error to parent zone.
    }
}
let _fakeAsyncTestZoneSpec = null;
function getProxyZoneSpec() {
    return Zone && Zone['ProxyZoneSpec'];
}
let _sharedProxyZoneSpec = null;
let _sharedProxyZone = null;
/**
 * Clears out the shared fake async zone for a test.
 * To be called in a global `beforeEach`.
 *
 * @experimental
 */
function resetFakeAsyncZone() {
    if (_fakeAsyncTestZoneSpec) {
        _fakeAsyncTestZoneSpec.unlockDatePatch();
    }
    _fakeAsyncTestZoneSpec = null;
    getProxyZoneSpec()?.get()?.resetDelegate();
    _sharedProxyZoneSpec?.resetDelegate();
}
/**
 * Wraps a function to be executed in the fakeAsync zone:
 * - microtasks are manually executed by calling `flushMicrotasks()`,
 * - timers are synchronous, `tick()` simulates the asynchronous passage of time.
 *
 * When flush is `false`, if there are any pending timers at the end of the function,
 * an exception will be thrown.
 *
 * Can be used to wrap inject() calls.
 *
 * ## Example
 *
 * {@example core/testing/ts/fake_async.ts region='basic'}
 *
 * @param fn
 * @param options
 *     flush: when true, will drain the macrotask queue after the test function completes.
 * @returns The function wrapped to be executed in the fakeAsync zone
 *
 * @experimental
 */
function fakeAsync(fn, options = {}) {
    const { flush = true } = options;
    // Not using an arrow function to preserve context passed from call site
    const fakeAsyncFn = function (...args) {
        const ProxyZoneSpec = getProxyZoneSpec();
        if (!ProxyZoneSpec) {
            throw new Error('ProxyZoneSpec is needed for the fakeAsync() test helper but could not be found. ' +
                'Make sure that your environment includes zone-testing.js');
        }
        const proxyZoneSpec = ProxyZoneSpec.assertPresent();
        if (Zone.current.get('FakeAsyncTestZoneSpec')) {
            throw new Error('fakeAsync() calls can not be nested');
        }
        try {
            // in case jasmine.clock init a fakeAsyncTestZoneSpec
            if (!_fakeAsyncTestZoneSpec) {
                const FakeAsyncTestZoneSpec = Zone && Zone['FakeAsyncTestZoneSpec'];
                if (proxyZoneSpec.getDelegate() instanceof FakeAsyncTestZoneSpec) {
                    throw new Error('fakeAsync() calls can not be nested');
                }
                _fakeAsyncTestZoneSpec = new FakeAsyncTestZoneSpec();
            }
            let res;
            const lastProxyZoneSpec = proxyZoneSpec.getDelegate();
            proxyZoneSpec.setDelegate(_fakeAsyncTestZoneSpec);
            _fakeAsyncTestZoneSpec.lockDatePatch();
            try {
                res = fn.apply(this, args);
                if (flush) {
                    _fakeAsyncTestZoneSpec.flush(20, true);
                }
                else {
                    flushMicrotasks();
                }
            }
            finally {
                proxyZoneSpec.setDelegate(lastProxyZoneSpec);
            }
            if (!flush) {
                if (_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length > 0) {
                    throw new Error(`${_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length} ` +
                        `periodic timer(s) still in the queue.`);
                }
                if (_fakeAsyncTestZoneSpec.pendingTimers.length > 0) {
                    throw new Error(`${_fakeAsyncTestZoneSpec.pendingTimers.length} timer(s) still in the queue.`);
                }
            }
            return res;
        }
        finally {
            resetFakeAsyncZone();
        }
    };
    fakeAsyncFn.isFakeAsync = true;
    return fakeAsyncFn;
}
function _getFakeAsyncZoneSpec() {
    if (_fakeAsyncTestZoneSpec == null) {
        _fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
        if (_fakeAsyncTestZoneSpec == null) {
            throw new Error('The code should be running in the fakeAsync zone to call this function');
        }
    }
    return _fakeAsyncTestZoneSpec;
}
/**
 * Simulates the asynchronous passage of time for the timers in the fakeAsync zone.
 *
 * The microtasks queue is drained at the very start of this function and after any timer
 * callback has been executed.
 *
 * ## Example
 *
 * {@example core/testing/ts/fake_async.ts region='basic'}
 *
 * @experimental
 */
function tick(millis = 0, ignoreNestedTimeout = false) {
    _getFakeAsyncZoneSpec().tick(millis, null, ignoreNestedTimeout);
}
/**
 * Simulates the asynchronous passage of time for the timers in the fakeAsync zone by
 * draining the macrotask queue until it is empty. The returned value is the milliseconds
 * of time that would have been elapsed.
 *
 * @param maxTurns
 * @returns The simulated time elapsed, in millis.
 *
 * @experimental
 */
function flush(maxTurns) {
    return _getFakeAsyncZoneSpec().flush(maxTurns);
}
/**
 * Discard all remaining periodic tasks.
 *
 * @experimental
 */
function discardPeriodicTasks() {
    const zoneSpec = _getFakeAsyncZoneSpec();
    zoneSpec.pendingPeriodicTimers;
    zoneSpec.pendingPeriodicTimers.length = 0;
}
/**
 * Wraps a function to be executed in a shared ProxyZone.
 *
 * If no shared ProxyZone exists, one is created and reused for subsequent calls.
 * Useful for wrapping test setup (beforeEach) and test execution (it) when test
 * runner patching isn't available or desired for setting up the ProxyZone.
 *
 * @param fn The function to wrap.
 * @returns A function that executes the original function within the shared ProxyZone.
 *
 * @experimental
 */
function withProxyZone(fn) {
    const autoProxyFn = function (...args) {
        const proxyZoneSpec = getProxyZoneSpec();
        if (proxyZoneSpec === undefined) {
            throw new Error('ProxyZoneSpec is needed for the withProxyZone() test helper but could not be found. ' +
                'Make sure that your environment includes zone-testing.js');
        }
        const proxyZone = proxyZoneSpec.get() !== undefined ? Zone.current : getOrCreateRootProxy();
        return proxyZone.run(fn, this, args);
    };
    return autoProxyFn;
}
function getOrCreateRootProxy() {
    const ProxyZoneSpec = getProxyZoneSpec();
    if (ProxyZoneSpec === undefined) {
        throw new Error('ProxyZoneSpec is needed for withProxyZone but could not be found. ' +
            'Make sure that your environment includes zone-testing.js');
    }
    // Ensure the shared ProxyZoneSpec instance exists
    if (_sharedProxyZoneSpec === null) {
        _sharedProxyZoneSpec = new ProxyZoneSpec();
    }
    _sharedProxyZone = Zone.root.fork(_sharedProxyZoneSpec);
    return _sharedProxyZone;
}
/**
 * Flush any pending microtasks.
 *
 * @experimental
 */
function flushMicrotasks() {
    _getFakeAsyncZoneSpec().flushMicrotasks();
}
function patchFakeAsyncTest(Zone) {
    // Export the class so that new instances can be created with proper
    // constructor params.
    Zone['FakeAsyncTestZoneSpec'] = FakeAsyncTestZoneSpec;
    Zone.__load_patch('fakeasync', (global, Zone, api) => {
        Zone[api.symbol('fakeAsyncTest')] = {
            resetFakeAsyncZone,
            flushMicrotasks,
            discardPeriodicTasks,
            tick,
            flush,
            fakeAsync,
            withProxyZone,
        };
    }, true);
    patchedTimers = {
        setTimeout: global$1.setTimeout,
        setInterval: global$1.setInterval,
        clearTimeout: global$1.clearTimeout,
        clearInterval: global$1.clearInterval,
        nativeSetTimeout: global$1[Zone.__symbol__('setTimeout')],
        nativeClearTimeout: global$1[Zone.__symbol__('clearTimeout')],
    };
    Scheduler.nextId = Scheduler.getNextId();
}

/**
 * @fileoverview
 * @suppress {globalThis}
 */
function patchLongStackTrace(Zone) {
    const NEWLINE = '\n';
    const IGNORE_FRAMES = {};
    const creationTrace = '__creationTrace__';
    const ERROR_TAG = 'STACKTRACE TRACKING';
    const SEP_TAG = '__SEP_TAG__';
    let sepTemplate = SEP_TAG + '@[native]';
    class LongStackTrace {
        error = getStacktrace();
        timestamp = new Date();
    }
    function getStacktraceWithUncaughtError() {
        return new Error(ERROR_TAG);
    }
    function getStacktraceWithCaughtError() {
        try {
            throw getStacktraceWithUncaughtError();
        }
        catch (err) {
            return err;
        }
    }
    // Some implementations of exception handling don't create a stack trace if the exception
    // isn't thrown, however it's faster not to actually throw the exception.
    const error = getStacktraceWithUncaughtError();
    const caughtError = getStacktraceWithCaughtError();
    const getStacktrace = error.stack
        ? getStacktraceWithUncaughtError
        : caughtError.stack
            ? getStacktraceWithCaughtError
            : getStacktraceWithUncaughtError;
    function getFrames(error) {
        return error.stack ? error.stack.split(NEWLINE) : [];
    }
    function addErrorStack(lines, error) {
        let trace = getFrames(error);
        for (let i = 0; i < trace.length; i++) {
            const frame = trace[i];
            // Filter out the Frames which are part of stack capturing.
            if (!IGNORE_FRAMES.hasOwnProperty(frame)) {
                lines.push(trace[i]);
            }
        }
    }
    function renderLongStackTrace(frames, stack) {
        const longTrace = [stack ? stack.trim() : ''];
        if (frames) {
            let timestamp = new Date().getTime();
            for (let i = 0; i < frames.length; i++) {
                const traceFrames = frames[i];
                const lastTime = traceFrames.timestamp;
                let separator = `____________________Elapsed ${timestamp - lastTime.getTime()} ms; At: ${lastTime}`;
                separator = separator.replace(/[^\w\d]/g, '_');
                longTrace.push(sepTemplate.replace(SEP_TAG, separator));
                addErrorStack(longTrace, traceFrames.error);
                timestamp = lastTime.getTime();
            }
        }
        return longTrace.join(NEWLINE);
    }
    // if Error.stackTraceLimit is 0, means stack trace
    // is disabled, so we don't need to generate long stack trace
    // this will improve performance in some test(some test will
    // set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
    function stackTracesEnabled() {
        // Cast through any since this property only exists on Error in the nodejs
        // typings.
        return Error.stackTraceLimit > 0;
    }
    Zone['longStackTraceZoneSpec'] = {
        name: 'long-stack-trace',
        longStackTraceLimit: 10, // Max number of task to keep the stack trace for.
        // add a getLongStackTrace method in spec to
        // handle handled reject promise error.
        getLongStackTrace: function (error) {
            if (!error) {
                return undefined;
            }
            const trace = error[Zone.__symbol__('currentTaskTrace')];
            if (!trace) {
                return error.stack;
            }
            return renderLongStackTrace(trace, error.stack);
        },
        onScheduleTask: function (parentZoneDelegate, currentZone, targetZone, task) {
            if (stackTracesEnabled()) {
                const currentTask = Zone.currentTask;
                let trace = (currentTask && currentTask.data && currentTask.data[creationTrace]) || [];
                trace = [new LongStackTrace()].concat(trace);
                if (trace.length > this.longStackTraceLimit) {
                    trace.length = this.longStackTraceLimit;
                }
                if (!task.data)
                    task.data = {};
                if (task.type === 'eventTask') {
                    // Fix issue https://github.com/angular/zone.js/issues/1195,
                    // For event task of browser, by default, all task will share a
                    // singleton instance of data object, we should create a new one here
                    // The cast to `any` is required to workaround a closure bug which wrongly applies
                    // URL sanitization rules to .data access.
                    task.data = { ...task.data };
                }
                task.data[creationTrace] = trace;
            }
            return parentZoneDelegate.scheduleTask(targetZone, task);
        },
        onHandleError: function (parentZoneDelegate, currentZone, targetZone, error) {
            if (stackTracesEnabled()) {
                const parentTask = Zone.currentTask || error.task;
                if (error instanceof Error && parentTask) {
                    const longStack = renderLongStackTrace(parentTask.data && parentTask.data[creationTrace], error.stack);
                    try {
                        error.stack = error.longStack = longStack;
                    }
                    catch (err) { }
                }
            }
            return parentZoneDelegate.handleError(targetZone, error);
        },
    };
    function captureStackTraces(stackTraces, count) {
        if (count > 0) {
            stackTraces.push(getFrames(new LongStackTrace().error));
            captureStackTraces(stackTraces, count - 1);
        }
    }
    function computeIgnoreFrames() {
        if (!stackTracesEnabled()) {
            return;
        }
        const frames = [];
        captureStackTraces(frames, 2);
        const frames1 = frames[0];
        const frames2 = frames[1];
        for (let i = 0; i < frames1.length; i++) {
            const frame1 = frames1[i];
            if (frame1.indexOf(ERROR_TAG) == -1) {
                let match = frame1.match(/^\s*at\s+/);
                if (match) {
                    sepTemplate = match[0] + SEP_TAG + ' (http://localhost)';
                    break;
                }
            }
        }
        for (let i = 0; i < frames1.length; i++) {
            const frame1 = frames1[i];
            const frame2 = frames2[i];
            if (frame1 === frame2) {
                IGNORE_FRAMES[frame1] = true;
            }
            else {
                break;
            }
        }
    }
    computeIgnoreFrames();
}

class ProxyZoneSpec {
    defaultSpecDelegate;
    name = 'ProxyZone';
    _delegateSpec = null;
    properties = { 'ProxyZoneSpec': this };
    propertyKeys = null;
    lastTaskState = null;
    isNeedToTriggerHasTask = false;
    tasks = [];
    static get() {
        return Zone.current.get('ProxyZoneSpec');
    }
    static isLoaded() {
        return ProxyZoneSpec.get() instanceof ProxyZoneSpec;
    }
    static assertPresent() {
        const spec = ProxyZoneSpec.get();
        if (spec === undefined) {
            throw new Error(`Expected to be running in 'ProxyZone', but it was not found.`);
        }
        return spec;
    }
    constructor(defaultSpecDelegate = null) {
        this.defaultSpecDelegate = defaultSpecDelegate;
        this.setDelegate(defaultSpecDelegate);
    }
    setDelegate(delegateSpec) {
        const isNewDelegate = this._delegateSpec !== delegateSpec;
        this._delegateSpec = delegateSpec;
        this.propertyKeys && this.propertyKeys.forEach((key) => delete this.properties[key]);
        this.propertyKeys = null;
        if (delegateSpec && delegateSpec.properties) {
            this.propertyKeys = Object.keys(delegateSpec.properties);
            this.propertyKeys.forEach((k) => (this.properties[k] = delegateSpec.properties[k]));
        }
        // if a new delegateSpec was set, check if we need to trigger hasTask
        if (isNewDelegate &&
            this.lastTaskState &&
            (this.lastTaskState.macroTask || this.lastTaskState.microTask)) {
            this.isNeedToTriggerHasTask = true;
        }
    }
    getDelegate() {
        return this._delegateSpec;
    }
    resetDelegate() {
        this.getDelegate();
        this.setDelegate(this.defaultSpecDelegate);
    }
    tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone) {
        if (this.isNeedToTriggerHasTask && this.lastTaskState) {
            // last delegateSpec has microTask or macroTask
            // should call onHasTask in current delegateSpec
            this.isNeedToTriggerHasTask = false;
            this.onHasTask(parentZoneDelegate, currentZone, targetZone, this.lastTaskState);
        }
    }
    removeFromTasks(task) {
        if (!this.tasks) {
            return;
        }
        for (let i = 0; i < this.tasks.length; i++) {
            if (this.tasks[i] === task) {
                this.tasks.splice(i, 1);
                return;
            }
        }
    }
    getAndClearPendingTasksInfo() {
        if (this.tasks.length === 0) {
            return '';
        }
        const taskInfo = this.tasks.map((task) => {
            const dataInfo = task.data &&
                Object.keys(task.data)
                    .map((key) => {
                    return key + ':' + task.data[key];
                })
                    .join(',');
            return `type: ${task.type}, source: ${task.source}, args: {${dataInfo}}`;
        });
        const pendingTasksInfo = '--Pending async tasks are: [' + taskInfo + ']';
        // clear tasks
        this.tasks = [];
        return pendingTasksInfo;
    }
    onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec) {
        if (this._delegateSpec && this._delegateSpec.onFork) {
            return this._delegateSpec.onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec);
        }
        else {
            return parentZoneDelegate.fork(targetZone, zoneSpec);
        }
    }
    onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source) {
        if (this._delegateSpec && this._delegateSpec.onIntercept) {
            return this._delegateSpec.onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source);
        }
        else {
            return parentZoneDelegate.intercept(targetZone, delegate, source);
        }
    }
    onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
        this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
        if (this._delegateSpec && this._delegateSpec.onInvoke) {
            return this._delegateSpec.onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source);
        }
        else {
            return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
        }
    }
    onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
        if (this._delegateSpec && this._delegateSpec.onHandleError) {
            return this._delegateSpec.onHandleError(parentZoneDelegate, currentZone, targetZone, error);
        }
        else {
            return parentZoneDelegate.handleError(targetZone, error);
        }
    }
    onScheduleTask(parentZoneDelegate, currentZone, targetZone, task) {
        if (task.type !== 'eventTask') {
            this.tasks.push(task);
        }
        if (this._delegateSpec && this._delegateSpec.onScheduleTask) {
            return this._delegateSpec.onScheduleTask(parentZoneDelegate, currentZone, targetZone, task);
        }
        else {
            return parentZoneDelegate.scheduleTask(targetZone, task);
        }
    }
    onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
        if (task.type !== 'eventTask') {
            this.removeFromTasks(task);
        }
        this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
        if (this._delegateSpec && this._delegateSpec.onInvokeTask) {
            return this._delegateSpec.onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs);
        }
        else {
            return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
        }
    }
    onCancelTask(parentZoneDelegate, currentZone, targetZone, task) {
        if (task.type !== 'eventTask') {
            this.removeFromTasks(task);
        }
        this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
        if (this._delegateSpec && this._delegateSpec.onCancelTask) {
            return this._delegateSpec.onCancelTask(parentZoneDelegate, currentZone, targetZone, task);
        }
        else {
            return parentZoneDelegate.cancelTask(targetZone, task);
        }
    }
    onHasTask(delegate, current, target, hasTaskState) {
        this.lastTaskState = hasTaskState;
        if (this._delegateSpec && this._delegateSpec.onHasTask) {
            this._delegateSpec.onHasTask(delegate, current, target, hasTaskState);
        }
        else {
            delegate.hasTask(target, hasTaskState);
        }
    }
}
function patchProxyZoneSpec(Zone) {
    // Export the class so that new instances can be created with proper
    // constructor params.
    Zone['ProxyZoneSpec'] = ProxyZoneSpec;
}

function patchSyncTest(Zone) {
    class SyncTestZoneSpec {
        runZone = Zone.current;
        constructor(namePrefix) {
            this.name = 'syncTestZone for ' + namePrefix;
        }
        // ZoneSpec implementation below.
        name;
        onScheduleTask(delegate, current, target, task) {
            switch (task.type) {
                case 'microTask':
                case 'macroTask':
                    throw new Error(`Cannot call ${task.source} from within a sync test (${this.name}).`);
                case 'eventTask':
                    task = delegate.scheduleTask(target, task);
                    break;
            }
            return task;
        }
    }
    // Export the class so that new instances can be created with proper
    // constructor params.
    Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
}

function patchPromiseTesting(Zone) {
    /**
     * Promise for async/fakeAsync zoneSpec test
     * can support async operation which not supported by zone.js
     * such as
     * it ('test jsonp in AsyncZone', async() => {
     *   new Promise(res => {
     *     jsonp(url, (data) => {
     *       // success callback
     *       res(data);
     *     });
     *   }).then((jsonpResult) => {
     *     // get jsonp result.
     *
     *     // user will expect AsyncZoneSpec wait for
     *     // then, but because jsonp is not zone aware
     *     // AsyncZone will finish before then is called.
     *   });
     * });
     */
    Zone.__load_patch('promisefortest', (global, Zone, api) => {
        const symbolState = api.symbol('state');
        const UNRESOLVED = null;
        const symbolParentUnresolved = api.symbol('parentUnresolved');
        // patch Promise.prototype.then to keep an internal
        // number for tracking unresolved chained promise
        // we will decrease this number when the parent promise
        // being resolved/rejected and chained promise was
        // scheduled as a microTask.
        // so we can know such kind of chained promise still
        // not resolved in AsyncTestZone
        Promise[api.symbol('patchPromiseForTest')] = function patchPromiseForTest() {
            let oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
            if (oriThen) {
                return;
            }
            oriThen = Promise[Zone.__symbol__('ZonePromiseThen')] = Promise.prototype.then;
            Promise.prototype.then = function () {
                const chained = oriThen.apply(this, arguments);
                if (this[symbolState] === UNRESOLVED) {
                    // parent promise is unresolved.
                    const asyncTestZoneSpec = Zone.current.get('AsyncTestZoneSpec');
                    if (asyncTestZoneSpec) {
                        asyncTestZoneSpec.unresolvedChainedPromiseCount++;
                        chained[symbolParentUnresolved] = true;
                    }
                }
                return chained;
            };
        };
        Promise[api.symbol('unPatchPromiseForTest')] = function unpatchPromiseForTest() {
            // restore origin then
            const oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
            if (oriThen) {
                Promise.prototype.then = oriThen;
                Promise[Zone.__symbol__('ZonePromiseThen')] = undefined;
            }
        };
    });
}

function rollupTesting(Zone) {
    patchLongStackTrace(Zone);
    patchProxyZoneSpec(Zone);
    patchSyncTest(Zone);
    patchJasmine(Zone);
    patchJest(Zone);
    patchMocha(Zone);
    patchAsyncTest(Zone);
    patchFakeAsyncTest(Zone);
    patchPromiseTesting(Zone);
}

rollupTesting(Zone);
xy"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */function patchJasmine(e){e.__load_patch("jasmine",((e,t,n)=>{if(!t)throw new Error("Missing: zone.js");if("undefined"!=typeof jest)return;if("undefined"==typeof jasmine||jasmine.__zone_patch__)return;jasmine.__zone_patch__=!0;const s=t.SyncTestZoneSpec,r=t.ProxyZoneSpec;if(!s)throw new Error("Missing: SyncTestZoneSpec");if(!r)throw new Error("Missing: ProxyZoneSpec");const i=t.current,o=t.__symbol__,c=!0===e[o("fakeAsyncDisablePatchingClock")],a=!c&&(!0===e[o("fakeAsyncPatchLock")]||!0===e[o("fakeAsyncAutoFakeAsyncWhenClockPatched")]);if(!0!==e[o("ignoreUnhandledRejection")]){const t=jasmine.GlobalErrors;t&&!jasmine[o("GlobalErrors")]&&(jasmine[o("GlobalErrors")]=t,jasmine.GlobalErrors=function(){const n=new t,s=n.install;return s&&!n[o("install")]&&(n[o("install")]=s,n.install=function(){const t="undefined"!=typeof process&&!!process.on,n=t?process.listeners("unhandledRejection"):e.eventListeners("unhandledrejection"),r=s.apply(this,arguments);return t?process.removeAllListeners("unhandledRejection"):e.removeAllListeners("unhandledrejection"),n&&n.forEach((n=>{t?process.on("unhandledRejection",n):e.addEventListener("unhandledrejection",n)})),r}),n})}const l=jasmine.getEnv();if(["describe","xdescribe","fdescribe"].forEach((e=>{let t=l[e];l[e]=function(e,n){return t.call(this,e,function r(e,t){return function(){return i.fork(new s(`jasmine.describe#${e}`)).run(t,this,arguments)}}(e,n))}})),["it","xit","fit"].forEach((e=>{let t=l[e];l[o(e)]=t,l[e]=function(e,n,s){return arguments[1]=h(n),t.apply(this,arguments)}})),["beforeEach","afterEach","beforeAll","afterAll"].forEach((e=>{let t=l[e];l[o(e)]=t,l[e]=function(e,n){return arguments[0]=h(e),t.apply(this,arguments)}})),!c){const e=jasmine[o("clock")]=jasmine.clock;jasmine.clock=function(){const n=e.apply(this,arguments);if(!n[o("patched")]){n[o("patched")]=o("patched");const e=n[o("tick")]=n.tick;n.tick=function(){const n=t.current.get("FakeAsyncTestZoneSpec");return n?n.tick.apply(n,arguments):e.apply(this,arguments)};const s=n[o("mockDate")]=n.mockDate;n.mockDate=function(){const e=t.current.get("FakeAsyncTestZoneSpec");if(e){const t=arguments.length>0?arguments[0]:new Date;return e.setFakeBaseSystemTime.apply(e,t&&"function"==typeof t.getTime?[t.getTime()]:arguments)}return s.apply(this,arguments)},a&&["install","uninstall"].forEach((e=>{const s=n[o(e)]=n[e];n[e]=function(){if(!t.FakeAsyncTestZoneSpec)return s.apply(this,arguments);jasmine[o("clockInstalled")]="install"===e}}))}return n}}if(!jasmine[t.__symbol__("createSpyObj")]){const e=jasmine.createSpyObj;jasmine[t.__symbol__("createSpyObj")]=e,jasmine.createSpyObj=function(){const t=Array.prototype.slice.call(arguments);let n;if(t.length>=3&&t[2]){const s=Object.defineProperty;Object.defineProperty=function(e,t,n){return s.call(this,e,t,{...n,configurable:!0,enumerable:!0})};try{n=e.apply(this,t)}finally{Object.defineProperty=s}}else n=e.apply(this,t);return n}}function u(e,n,s,r){const i=!!jasmine[o("clockInstalled")],c=s.testProxyZone;if(i&&a){const n=t[t.__symbol__("fakeAsyncTest")];n&&"function"==typeof n.fakeAsync&&(e=n.fakeAsync(e))}return r?c.run(e,n,[r]):c.run(e,n)}function h(e){return e&&(e.length?function(t){return u(e,this,this.queueRunner,t)}:function(){return u(e,this,this.queueRunner)})}const p=jasmine.QueueRunner;jasmine.QueueRunner=function(n){function s(s){s.onComplete&&(s.onComplete=(e=>()=>{this.testProxyZone=null,this.testProxyZoneSpec=null,i.scheduleMicroTask("jasmine.onComplete",e)})(s.onComplete));const r=e[t.__symbol__("setTimeout")],o=e[t.__symbol__("clearTimeout")];r&&(s.timeout={setTimeout:r||e.setTimeout,clearTimeout:o||e.clearTimeout}),jasmine.UserContext?(s.userContext||(s.userContext=new jasmine.UserContext),s.userContext.queueRunner=this):(s.userContext||(s.userContext={}),s.userContext.queueRunner=this);const c=s.onException;s.onException=function(e){if(e&&"Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL."===e.message){const t=this&&this.testProxyZoneSpec;if(t){const n=t.getAndClearPendingTasksInfo();try{e.message+=n}catch(e){}}}c&&c.call(this,e)},n.call(this,s)}return function(e,t){for(const n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);function n(){this.constructor=e}e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(s,n),s.prototype.execute=function(){let e=t.current,s=!1;for(;e;){if(e===i){s=!0;break}e=e.parent}if(!s)throw new Error("Unexpected Zone: "+t.current.name);this.testProxyZoneSpec=new r,this.testProxyZone=i.fork(this.testProxyZoneSpec),t.currentTask?n.prototype.execute.call(this):t.current.scheduleMicroTask("jasmine.execute().forceTask",(()=>p.prototype.execute.call(this)))},s}(p)}))}function patchJest(e){e.__load_patch("jest",((e,t,n)=>{if("undefined"==typeof jest||jest.__zone_patch__)return;t[n.symbol("ignoreConsoleErrorUncaughtError")]=!0,jest.__zone_patch__=!0;const s=t.ProxyZoneSpec,r=t.SyncTestZoneSpec;if(!s)throw new Error("Missing ProxyZoneSpec");const i=t.current,o=i.fork(new r("jest.describe")),c=new s,a=i.fork(c);function l(e){return function(...t){return o.run(e,this,t)}}function u(e,s=!1){if("function"!=typeof e)return e;const r=function(){if(!0===t[n.symbol("useFakeTimersCalled")]&&e&&!e.isFakeAsync){const n=t[t.__symbol__("fakeAsyncTest")];n&&"function"==typeof n.fakeAsync&&(e=n.fakeAsync(e))}return c.isTestFunc=s,a.run(e,null,arguments)};return Object.defineProperty(r,"length",{configurable:!0,writable:!0,enumerable:!1}),r.length=e.length,r}["describe","xdescribe","fdescribe"].forEach((n=>{let s=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=s,e[n]=function(...e){return e[1]=l(e[1]),s.apply(this,e)},e[n].each=function r(e){return function(...t){const n=e.apply(this,t);return function(...e){return e[1]=l(e[1]),n.apply(this,e)}}}(s.each))})),e.describe.only=e.fdescribe,e.describe.skip=e.xdescribe,["it","xit","fit","test","xtest"].forEach((n=>{let s=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=s,e[n]=function(...e){return e[1]=u(e[1],!0),s.apply(this,e)},e[n].each=function r(e){return function(...t){return function(...n){return n[1]=u(n[1]),e.apply(this,t).apply(this,n)}}}(s.each),e[n].todo=s.todo,e[n].failing=s.failing)})),e.it.only=e.fit,e.it.skip=e.xit,e.test.only=e.fit,e.test.skip=e.xit,["beforeEach","afterEach","beforeAll","afterAll"].forEach((n=>{let s=e[n];e[t.__symbol__(n)]||(e[t.__symbol__(n)]=s,e[n]=function(...e){return e[0]=u(e[0]),s.apply(this,e)})})),t.patchJestObject=function e(s,r=!1){function i(){return!!t.current.get("FakeAsyncTestZoneSpec")}function o(){const e=t.current.get("ProxyZoneSpec");return e&&e.isTestFunc}s[n.symbol("fakeTimers")]||(s[n.symbol("fakeTimers")]=!0,n.patchMethod(s,"_checkFakeTimers",(e=>function(t,n){return!!i()||e.apply(t,n)})),n.patchMethod(s,"useFakeTimers",(e=>function(s,i){return t[n.symbol("useFakeTimersCalled")]=!0,r||o()?e.apply(s,i):s})),n.patchMethod(s,"useRealTimers",(e=>function(s,i){return t[n.symbol("useFakeTimersCalled")]=!1,r||o()?e.apply(s,i):s})),n.patchMethod(s,"setSystemTime",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");if(!r||!i())return e.apply(n,s);r.setFakeBaseSystemTime(s[0])})),n.patchMethod(s,"getRealSystemTime",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");return r&&i()?r.getRealSystemTime():e.apply(n,s)})),n.patchMethod(s,"runAllTicks",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");if(!r)return e.apply(n,s);r.flushMicrotasks()})),n.patchMethod(s,"runAllTimers",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");if(!r)return e.apply(n,s);r.flush(100,!0)})),n.patchMethod(s,"advanceTimersByTime",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");if(!r)return e.apply(n,s);r.tick(s[0])})),n.patchMethod(s,"runOnlyPendingTimers",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");if(!r)return e.apply(n,s);r.flushOnlyPendingTimers()})),n.patchMethod(s,"advanceTimersToNextTimer",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");if(!r)return e.apply(n,s);r.tickToNext(s[0])})),n.patchMethod(s,"clearAllTimers",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");if(!r)return e.apply(n,s);r.removeAllTimers()})),n.patchMethod(s,"getTimerCount",(e=>function(n,s){const r=t.current.get("FakeAsyncTestZoneSpec");return r?r.getTimerCount():e.apply(n,s)})))}}))}function patchMocha(e){e.__load_patch("mocha",((e,t)=>{const n=e.Mocha;if(void 0===n)return;if(void 0===t)throw new Error("Missing Zone.js");const s=t.ProxyZoneSpec,r=t.SyncTestZoneSpec;if(!s)throw new Error("Missing ProxyZoneSpec");if(n.__zone_patch__)throw new Error('"Mocha" has already been patched with "Zone".');n.__zone_patch__=!0;const i=t.current,o=i.fork(new r("Mocha.describe"));let c=null;const a=i.fork(new s),l={after:e.after,afterEach:e.afterEach,before:e.before,beforeEach:e.beforeEach,describe:e.describe,it:e.it};function u(e,t,n){for(let s=0;s<e.length;s++){let r=e[s];"function"==typeof r&&(e[s]=0===r.length?t(r):n(r),e[s].toString=function(){return r.toString()})}return e}function h(e){return u(e,(function(e){return function(){return o.run(e,this,arguments)}}))}function p(e){return u(e,(function(e){return function(){return c.run(e,this)}}),(function(e){return function(t){return c.run(e,this,[t])}}))}function d(e){return u(e,(function(e){return function(){return a.run(e,this)}}),(function(e){return function(t){return a.run(e,this,[t])}}))}var f,T;e.describe=e.suite=function(){return l.describe.apply(this,h(arguments))},e.xdescribe=e.suite.skip=e.describe.skip=function(){return l.describe.skip.apply(this,h(arguments))},e.describe.only=e.suite.only=function(){return l.describe.only.apply(this,h(arguments))},e.it=e.specify=e.test=function(){return l.it.apply(this,p(arguments))},e.xit=e.xspecify=e.it.skip=function(){return l.it.skip.apply(this,p(arguments))},e.it.only=e.test.only=function(){return l.it.only.apply(this,p(arguments))},e.after=e.suiteTeardown=function(){return l.after.apply(this,d(arguments))},e.afterEach=e.teardown=function(){return l.afterEach.apply(this,p(arguments))},e.before=e.suiteSetup=function(){return l.before.apply(this,d(arguments))},e.beforeEach=e.setup=function(){return l.beforeEach.apply(this,p(arguments))},f=n.Runner.prototype.runTest,T=n.Runner.prototype.run,n.Runner.prototype.runTest=function(e){t.current.scheduleMicroTask("mocha.forceTask",(()=>{f.call(this,e)}))},n.Runner.prototype.run=function(e){return this.on("test",(e=>{c=i.fork(new s)})),this.on("fail",((e,t)=>{const n=c&&c.get("ProxyZoneSpec");if(n&&t)try{t.message+=n.getAndClearPendingTasksInfo()}catch(e){}})),T.call(this,e)}}))}const global$2=globalThis;function __symbol__(e){return(global$2.__Zone_symbol_prefix||"__zone_symbol__")+e}const __global="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global;class AsyncTestZoneSpec{finishCallback;failCallback;static get symbolParentUnresolved(){return __symbol__("parentUnresolved")}_pendingMicroTasks=!1;_pendingMacroTasks=!1;_alreadyErrored=!1;_isSync=!1;_existingFinishTimer=null;entryFunction=null;runZone=Zone.current;unresolvedChainedPromiseCount=0;supportWaitUnresolvedChainedPromise=!1;constructor(e,t,n){this.finishCallback=e,this.failCallback=t,this.name="asyncTestZone for "+n,this.properties={AsyncTestZoneSpec:this},this.supportWaitUnresolvedChainedPromise=!0===__global[__symbol__("supportWaitUnResolvedChainedPromise")]}isUnresolvedChainedPromisePending(){return this.unresolvedChainedPromiseCount>0}_finishCallbackIfDone(){null!==this._existingFinishTimer&&(clearTimeout(this._existingFinishTimer),this._existingFinishTimer=null),this._pendingMicroTasks||this._pendingMacroTasks||this.supportWaitUnresolvedChainedPromise&&this.isUnresolvedChainedPromisePending()||this.runZone.run((()=>{this._existingFinishTimer=setTimeout((()=>{this._alreadyErrored||this._pendingMicroTasks||this._pendingMacroTasks||this.finishCallback()}),0)}))}patchPromiseForTest(){if(!this.supportWaitUnresolvedChainedPromise)return;const e=Promise[Zone.__symbol__("patchPromiseForTest")];e&&e()}unPatchPromiseForTest(){if(!this.supportWaitUnresolvedChainedPromise)return;const e=Promise[Zone.__symbol__("unPatchPromiseForTest")];e&&e()}name;properties;onScheduleTask(e,t,n,s){return"eventTask"!==s.type&&(this._isSync=!1),"microTask"===s.type&&s.data&&s.data instanceof Promise&&!0===s.data[AsyncTestZoneSpec.symbolParentUnresolved]&&this.unresolvedChainedPromiseCount--,e.scheduleTask(n,s)}onInvokeTask(e,t,n,s,r,i){return"eventTask"!==s.type&&(this._isSync=!1),e.invokeTask(n,s,r,i)}onCancelTask(e,t,n,s){return"eventTask"!==s.type&&(this._isSync=!1),e.cancelTask(n,s)}onInvoke(e,t,n,s,r,i,o){this.entryFunction||(this.entryFunction=s);try{return this._isSync=!0,e.invoke(n,s,r,i,o)}finally{this._isSync&&this.entryFunction===s&&this._finishCallbackIfDone()}}onHandleError(e,t,n,s){return e.handleError(n,s)&&(this.failCallback(s),this._alreadyErrored=!0),!1}onHasTask(e,t,n,s){e.hasTask(n,s),t===n&&("microTask"==s.change?(this._pendingMicroTasks=s.microTask,this._finishCallbackIfDone()):"macroTask"==s.change&&(this._pendingMacroTasks=s.macroTask,this._finishCallbackIfDone()))}}function patchAsyncTest(e){e.AsyncTestZoneSpec=AsyncTestZoneSpec,e.__load_patch("asynctest",((e,t,n)=>{function s(e,n,s,r){const i=t.current,o=t.AsyncTestZoneSpec;if(void 0===o)throw new Error("AsyncTestZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/plugins/async-test");const c=t.ProxyZoneSpec;if(!c)throw new Error("ProxyZoneSpec is needed for the async() test helper but could not be found. Please make sure that your environment includes zone.js/plugins/proxy");const a=c.get();c.assertPresent();const l=t.current.getZoneWith("ProxyZoneSpec"),u=a.getDelegate();return l.parent.run((()=>{const e=new o((()=>{a.getDelegate()==e&&a.setDelegate(u),e.unPatchPromiseForTest(),i.run((()=>{s()}))}),(t=>{a.getDelegate()==e&&a.setDelegate(u),e.unPatchPromiseForTest(),i.run((()=>{r(t)}))}),"test");a.setDelegate(e),e.patchPromiseForTest()})),t.current.runGuarded(e,n)}t[n.symbol("asyncTest")]=function t(n){return e.jasmine?function(e){e||((e=function(){}).fail=function(e){throw e}),s(n,this,e,(t=>{if("string"==typeof t)return e.fail(new Error(t));e.fail(t)}))}:function(){return new Promise(((e,t)=>{s(n,this,e,t)}))}}}))}const global$1="object"==typeof window&&window||"object"==typeof self&&self||globalThis.global,OriginalDate=global$1.Date;function FakeDate(){if(0===arguments.length){const e=new OriginalDate;return e.setTime(FakeDate.now()),e}{const e=Array.prototype.slice.call(arguments);return new OriginalDate(...e)}}let patchedTimers;FakeDate.now=function(){const e=Zone.current.get("FakeAsyncTestZoneSpec");return e?e.getFakeSystemTime():OriginalDate.now.apply(this,arguments)},FakeDate.UTC=OriginalDate.UTC,FakeDate.parse=OriginalDate.parse;const timeoutCallback=function(){};class Scheduler{static nextNodeJSId=1;static nextId=-1;_schedulerQueue=[];_currentTickTime=0;_currentFakeBaseSystemTime=OriginalDate.now();_currentTickRequeuePeriodicEntries=[];constructor(){}static getNextId(){const e=patchedTimers.nativeSetTimeout.call(global$1,timeoutCallback,0);return patchedTimers.nativeClearTimeout.call(global$1,e),"number"==typeof e?e:Scheduler.nextNodeJSId++}getCurrentTickTime(){return this._currentTickTime}getFakeSystemTime(){return this._currentFakeBaseSystemTime+this._currentTickTime}setFakeBaseSystemTime(e){this._currentFakeBaseSystemTime=e}getRealSystemTime(){return OriginalDate.now()}scheduleFunction(e,t,n){let s=(n={args:[],isPeriodic:!1,isRequestAnimationFrame:!1,id:-1,isRequeuePeriodic:!1,...n}).id<0?Scheduler.nextId:n.id;Scheduler.nextId=Scheduler.getNextId();let r={endTime:this._currentTickTime+t,id:s,func:e,args:n.args,delay:t,isPeriodic:n.isPeriodic,isRequestAnimationFrame:n.isRequestAnimationFrame};n.isRequeuePeriodic&&this._currentTickRequeuePeriodicEntries.push(r);let i=0;for(;i<this._schedulerQueue.length&&!(r.endTime<this._schedulerQueue[i].endTime);i++);return this._schedulerQueue.splice(i,0,r),s}removeScheduledFunctionWithId(e){for(let t=0;t<this._schedulerQueue.length;t++)if(this._schedulerQueue[t].id==e){this._schedulerQueue.splice(t,1);break}}removeAll(){this._schedulerQueue=[]}getTimerCount(){return this._schedulerQueue.length}tickToNext(e=1,t,n){this._schedulerQueue.length<e||this.tick(this._schedulerQueue[e-1].endTime-this._currentTickTime,t,n)}tick(e=0,t,n){let s=this._currentTickTime+e,r=0;const i=(n=Object.assign({processNewMacroTasksSynchronously:!0},n)).processNewMacroTasksSynchronously?this._schedulerQueue:this._schedulerQueue.slice();if(0===i.length&&t)t(e);else{for(;i.length>0&&(this._currentTickRequeuePeriodicEntries=[],!(s<i[0].endTime));){let e=i.shift();if(!n.processNewMacroTasksSynchronously){const t=this._schedulerQueue.indexOf(e);t>=0&&this._schedulerQueue.splice(t,1)}if(r=this._currentTickTime,this._currentTickTime=e.endTime,t&&t(this._currentTickTime-r),!e.func.apply(global$1,e.isRequestAnimationFrame?[this._currentTickTime]:e.args))break;n.processNewMacroTasksSynchronously||this._currentTickRequeuePeriodicEntries.forEach((e=>{let t=0;for(;t<i.length&&!(e.endTime<i[t].endTime);t++);i.splice(t,0,e)}))}r=this._currentTickTime,this._currentTickTime=s,t&&t(this._currentTickTime-r)}}flushOnlyPendingTimers(e){if(0===this._schedulerQueue.length)return 0;const t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e,{processNewMacroTasksSynchronously:!1}),this._currentTickTime-t}flush(e=20,t=!1,n){return t?this.flushPeriodic(n):this.flushNonPeriodic(e,n)}flushPeriodic(e){if(0===this._schedulerQueue.length)return 0;const t=this._currentTickTime;return this.tick(this._schedulerQueue[this._schedulerQueue.length-1].endTime-t,e),this._currentTickTime-t}flushNonPeriodic(e,t){const n=this._currentTickTime;let s=0,r=0;for(;this._schedulerQueue.length>0;){if(r++,r>e)throw new Error("flush failed after reaching the limit of "+e+" tasks. Does your code use a polling timeout?");if(0===this._schedulerQueue.filter((e=>!e.isPeriodic&&!e.isRequestAnimationFrame)).length)break;const n=this._schedulerQueue.shift();if(s=this._currentTickTime,this._currentTickTime=n.endTime,t&&t(this._currentTickTime-s),!n.func.apply(global$1,n.args))break}return this._currentTickTime-n}}class FakeAsyncTestZoneSpec{trackPendingRequestAnimationFrame;macroTaskOptions;static assertInZone(){if(null==Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("The code should be running in the fakeAsync zone to call this function")}_scheduler=new Scheduler;_microtasks=[];_lastError=null;_uncaughtPromiseErrors=Promise[Zone.__symbol__("uncaughtPromiseErrors")];pendingPeriodicTimers=[];pendingTimers=[];patchDateLocked=!1;constructor(e,t=!1,n){this.trackPendingRequestAnimationFrame=t,this.macroTaskOptions=n,this.name="fakeAsyncTestZone for "+e,this.macroTaskOptions||(this.macroTaskOptions=global$1[Zone.__symbol__("FakeAsyncTestMacroTask")])}_fnAndFlush(e,t){return(...n)=>(e.apply(global$1,n),null===this._lastError?(null!=t.onSuccess&&t.onSuccess.apply(global$1),this.flushMicrotasks()):null!=t.onError&&t.onError.apply(global$1),null===this._lastError)}static _removeTimer(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}_dequeueTimer(e){return()=>{FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers,e)}}_requeuePeriodicTimer(e,t,n,s){return()=>{-1!==this.pendingPeriodicTimers.indexOf(s)&&this._scheduler.scheduleFunction(e,t,{args:n,isPeriodic:!0,id:s,isRequeuePeriodic:!0})}}_dequeuePeriodicTimer(e){return()=>{FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers,e)}}_setTimeout(e,t,n,s=!0){let r=this._dequeueTimer(Scheduler.nextId),i=this._fnAndFlush(e,{onSuccess:r,onError:r}),o=this._scheduler.scheduleFunction(i,t,{args:n,isRequestAnimationFrame:!s});return s&&this.pendingTimers.push(o),o}_clearTimeout(e){FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers,e),this._scheduler.removeScheduledFunctionWithId(e)}_setInterval(e,t,n){let s=Scheduler.nextId,r={onSuccess:null,onError:this._dequeuePeriodicTimer(s)},i=this._fnAndFlush(e,r);return r.onSuccess=this._requeuePeriodicTimer(i,t,n,s),this._scheduler.scheduleFunction(i,t,{args:n,isPeriodic:!0}),this.pendingPeriodicTimers.push(s),s}_clearInterval(e){FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers,e),this._scheduler.removeScheduledFunctionWithId(e)}_resetLastErrorAndThrow(){let e=this._lastError||this._uncaughtPromiseErrors[0];throw this._uncaughtPromiseErrors.length=0,this._lastError=null,e}getCurrentTickTime(){return this._scheduler.getCurrentTickTime()}getFakeSystemTime(){return this._scheduler.getFakeSystemTime()}setFakeBaseSystemTime(e){this._scheduler.setFakeBaseSystemTime(e)}getRealSystemTime(){return this._scheduler.getRealSystemTime()}static patchDate(){global$1[Zone.__symbol__("disableDatePatching")]||global$1.Date!==FakeDate&&(global$1.Date=FakeDate,FakeDate.prototype=OriginalDate.prototype,FakeAsyncTestZoneSpec.checkTimerPatch())}static resetDate(){global$1.Date===FakeDate&&(global$1.Date=OriginalDate)}static checkTimerPatch(){if(!patchedTimers)throw new Error("Expected timers to have been patched.");global$1.setTimeout!==patchedTimers.setTimeout&&(global$1.setTimeout=patchedTimers.setTimeout,global$1.clearTimeout=patchedTimers.clearTimeout),global$1.setInterval!==patchedTimers.setInterval&&(global$1.setInterval=patchedTimers.setInterval,global$1.clearInterval=patchedTimers.clearInterval)}lockDatePatch(){this.patchDateLocked=!0,FakeAsyncTestZoneSpec.patchDate()}unlockDatePatch(){this.patchDateLocked=!1,FakeAsyncTestZoneSpec.resetDate()}tickToNext(e=1,t,n={processNewMacroTasksSynchronously:!0}){e<=0||(FakeAsyncTestZoneSpec.assertInZone(),this.flushMicrotasks(),this._scheduler.tickToNext(e,t,n),null!==this._lastError&&this._resetLastErrorAndThrow())}tick(e=0,t,n={processNewMacroTasksSynchronously:!0}){FakeAsyncTestZoneSpec.assertInZone(),this.flushMicrotasks(),this._scheduler.tick(e,t,n),null!==this._lastError&&this._resetLastErrorAndThrow()}flushMicrotasks(){for(FakeAsyncTestZoneSpec.assertInZone();this._microtasks.length>0;){let e=this._microtasks.shift();e.func.apply(e.target,e.args)}(()=>{(null!==this._lastError||this._uncaughtPromiseErrors.length)&&this._resetLastErrorAndThrow()})()}flush(e,t,n){FakeAsyncTestZoneSpec.assertInZone(),this.flushMicrotasks();const s=this._scheduler.flush(e,t,n);return null!==this._lastError&&this._resetLastErrorAndThrow(),s}flushOnlyPendingTimers(e){FakeAsyncTestZoneSpec.assertInZone(),this.flushMicrotasks();const t=this._scheduler.flushOnlyPendingTimers(e);return null!==this._lastError&&this._resetLastErrorAndThrow(),t}removeAllTimers(){FakeAsyncTestZoneSpec.assertInZone(),this._scheduler.removeAll(),this.pendingPeriodicTimers=[],this.pendingTimers=[]}getTimerCount(){return this._scheduler.getTimerCount()+this._microtasks.length}name;properties={FakeAsyncTestZoneSpec:this};onScheduleTask(e,t,n,s){switch(s.type){case"microTask":let t,r=s.data&&s.data.args;if(r){let e=s.data.cbIdx;"number"==typeof r.length&&r.length>e+1&&(t=Array.prototype.slice.call(r,e+1))}this._microtasks.push({func:s.invoke,args:t,target:s.data&&s.data.target});break;case"macroTask":switch(s.source){case"setTimeout":s.data.handleId=this._setTimeout(s.invoke,s.data.delay,Array.prototype.slice.call(s.data.args,2));break;case"setImmediate":s.data.handleId=this._setTimeout(s.invoke,0,Array.prototype.slice.call(s.data.args,1));break;case"setInterval":s.data.handleId=this._setInterval(s.invoke,s.data.delay,Array.prototype.slice.call(s.data.args,2));break;case"XMLHttpRequest.send":throw new Error("Cannot make XHRs from within a fake async test. Request URL: "+s.data.url);case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":s.data.handleId=this._setTimeout(s.invoke,16,s.data.args,this.trackPendingRequestAnimationFrame);break;default:const e=this.findMacroTaskOption(s);if(e){const t=s.data&&s.data.args,n=t&&t.length>1?t[1]:0;let r=e.callbackArgs?e.callbackArgs:t;e.isPeriodic?(s.data.handleId=this._setInterval(s.invoke,n,r),s.data.isPeriodic=!0):s.data.handleId=this._setTimeout(s.invoke,n,r);break}throw new Error("Unknown macroTask scheduled in fake async test: "+s.source)}break;case"eventTask":s=e.scheduleTask(n,s)}return s}onCancelTask(e,t,n,s){switch(s.source){case"setTimeout":case"requestAnimationFrame":case"webkitRequestAnimationFrame":case"mozRequestAnimationFrame":return this._clearTimeout(s.data.handleId);case"setInterval":return this._clearInterval(s.data.handleId);default:const t=this.findMacroTaskOption(s);if(t){const e=s.data.handleId;return t.isPeriodic?this._clearInterval(e):this._clearTimeout(e)}return e.cancelTask(n,s)}}onInvoke(e,t,n,s,r,i,o){try{return FakeAsyncTestZoneSpec.patchDate(),e.invoke(n,s,r,i,o)}finally{this.patchDateLocked||FakeAsyncTestZoneSpec.resetDate()}}findMacroTaskOption(e){if(!this.macroTaskOptions)return null;for(let t=0;t<this.macroTaskOptions.length;t++){const n=this.macroTaskOptions[t];if(n.source===e.source)return n}return null}onHandleError(e,t,n,s){return this._lastError=s,!1}}let _fakeAsyncTestZoneSpec=null;function getProxyZoneSpec(){return Zone&&Zone.ProxyZoneSpec}let _sharedProxyZoneSpec=null,_sharedProxyZone=null;function resetFakeAsyncZone(){_fakeAsyncTestZoneSpec&&_fakeAsyncTestZoneSpec.unlockDatePatch(),_fakeAsyncTestZoneSpec=null,getProxyZoneSpec()?.get()?.resetDelegate(),_sharedProxyZoneSpec?.resetDelegate()}function fakeAsync(e,t={}){const{flush:n=!0}=t,s=function(...t){const s=getProxyZoneSpec();if(!s)throw new Error("ProxyZoneSpec is needed for the fakeAsync() test helper but could not be found. Make sure that your environment includes zone-testing.js");const r=s.assertPresent();if(Zone.current.get("FakeAsyncTestZoneSpec"))throw new Error("fakeAsync() calls can not be nested");try{if(!_fakeAsyncTestZoneSpec){const e=Zone&&Zone.FakeAsyncTestZoneSpec;if(r.getDelegate()instanceof e)throw new Error("fakeAsync() calls can not be nested");_fakeAsyncTestZoneSpec=new e}let s;const i=r.getDelegate();r.setDelegate(_fakeAsyncTestZoneSpec),_fakeAsyncTestZoneSpec.lockDatePatch();try{s=e.apply(this,t),n?_fakeAsyncTestZoneSpec.flush(20,!0):flushMicrotasks()}finally{r.setDelegate(i)}if(!n){if(_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length>0)throw new Error(`${_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length} periodic timer(s) still in the queue.`);if(_fakeAsyncTestZoneSpec.pendingTimers.length>0)throw new Error(`${_fakeAsyncTestZoneSpec.pendingTimers.length} timer(s) still in the queue.`)}return s}finally{resetFakeAsyncZone()}};return s.isFakeAsync=!0,s}function _getFakeAsyncZoneSpec(){if(null==_fakeAsyncTestZoneSpec&&(_fakeAsyncTestZoneSpec=Zone.current.get("FakeAsyncTestZoneSpec"),null==_fakeAsyncTestZoneSpec))throw new Error("The code should be running in the fakeAsync zone to call this function");return _fakeAsyncTestZoneSpec}function tick(e=0,t=!1){_getFakeAsyncZoneSpec().tick(e,null,t)}function flush(e){return _getFakeAsyncZoneSpec().flush(e)}function discardPeriodicTasks(){_getFakeAsyncZoneSpec().pendingPeriodicTimers.length=0}function withProxyZone(e){return function(...t){const n=getProxyZoneSpec();if(void 0===n)throw new Error("ProxyZoneSpec is needed for the withProxyZone() test helper but could not be found. Make sure that your environment includes zone-testing.js");return(void 0!==n.get()?Zone.current:getOrCreateRootProxy()).run(e,this,t)}}function getOrCreateRootProxy(){const e=getProxyZoneSpec();if(void 0===e)throw new Error("ProxyZoneSpec is needed for withProxyZone but could not be found. Make sure that your environment includes zone-testing.js");return null===_sharedProxyZoneSpec&&(_sharedProxyZoneSpec=new e),_sharedProxyZone=Zone.root.fork(_sharedProxyZoneSpec),_sharedProxyZone}function flushMicrotasks(){_getFakeAsyncZoneSpec().flushMicrotasks()}function patchFakeAsyncTest(e){e.FakeAsyncTestZoneSpec=FakeAsyncTestZoneSpec,e.__load_patch("fakeasync",((e,t,n)=>{t[n.symbol("fakeAsyncTest")]={resetFakeAsyncZone:resetFakeAsyncZone,flushMicrotasks:flushMicrotasks,discardPeriodicTasks:discardPeriodicTasks,tick:tick,flush:flush,fakeAsync:fakeAsync,withProxyZone:withProxyZone}}),!0),patchedTimers={setTimeout:global$1.setTimeout,setInterval:global$1.setInterval,clearTimeout:global$1.clearTimeout,clearInterval:global$1.clearInterval,nativeSetTimeout:global$1[e.__symbol__("setTimeout")],nativeClearTimeout:global$1[e.__symbol__("clearTimeout")]},Scheduler.nextId=Scheduler.getNextId()}function patchLongStackTrace(e){const t={},n="__creationTrace__",s="STACKTRACE TRACKING",r="__SEP_TAG__";let i=r+"@[native]";class o{error=h();timestamp=new Date}function c(){return new Error(s)}function a(){try{throw c()}catch(e){return e}}const l=c(),u=a(),h=l.stack?c:u.stack?a:c;function p(e){return e.stack?e.stack.split("\n"):[]}function d(e,n){let s=p(n);for(let n=0;n<s.length;n++)t.hasOwnProperty(s[n])||e.push(s[n])}function f(e,t){const n=[t?t.trim():""];if(e){let t=(new Date).getTime();for(let s=0;s<e.length;s++){const o=e[s],c=o.timestamp;let a=`____________________Elapsed ${t-c.getTime()} ms; At: ${c}`;a=a.replace(/[^\w\d]/g,"_"),n.push(i.replace(r,a)),d(n,o.error),t=c.getTime()}}return n.join("\n")}function T(){return Error.stackTraceLimit>0}function m(e,t){t>0&&(e.push(p((new o).error)),m(e,t-1))}e.longStackTraceZoneSpec={name:"long-stack-trace",longStackTraceLimit:10,getLongStackTrace:function(t){if(!t)return;const n=t[e.__symbol__("currentTaskTrace")];return n?f(n,t.stack):t.stack},onScheduleTask:function(t,s,r,i){if(T()){const t=e.currentTask;let s=t&&t.data&&t.data[n]||[];s=[new o].concat(s),s.length>this.longStackTraceLimit&&(s.length=this.longStackTraceLimit),i.data||(i.data={}),"eventTask"===i.type&&(i.data={...i.data}),i.data[n]=s}return t.scheduleTask(r,i)},onHandleError:function(t,s,r,i){if(T()){const t=e.currentTask||i.task;if(i instanceof Error&&t){const e=f(t.data&&t.data[n],i.stack);try{i.stack=i.longStack=e}catch(e){}}}return t.handleError(r,i)}},function y(){if(!T())return;const e=[];m(e,2);const n=e[0],o=e[1];for(let e=0;e<n.length;e++){const t=n[e];if(-1==t.indexOf(s)){let e=t.match(/^\s*at\s+/);if(e){i=e[0]+r+" (http://localhost)";break}}}for(let e=0;e<n.length;e++){const s=n[e];if(s!==o[e])break;t[s]=!0}}()}class ProxyZoneSpec{defaultSpecDelegate;name="ProxyZone";_delegateSpec=null;properties={ProxyZoneSpec:this};propertyKeys=null;lastTaskState=null;isNeedToTriggerHasTask=!1;tasks=[];static get(){return Zone.current.get("ProxyZoneSpec")}static isLoaded(){return ProxyZoneSpec.get()instanceof ProxyZoneSpec}static assertPresent(){const e=ProxyZoneSpec.get();if(void 0===e)throw new Error("Expected to be running in 'ProxyZone', but it was not found.");return e}constructor(e=null){this.defaultSpecDelegate=e,this.setDelegate(e)}setDelegate(e){const t=this._delegateSpec!==e;this._delegateSpec=e,this.propertyKeys&&this.propertyKeys.forEach((e=>delete this.properties[e])),this.propertyKeys=null,e&&e.properties&&(this.propertyKeys=Object.keys(e.properties),this.propertyKeys.forEach((t=>this.properties[t]=e.properties[t]))),t&&this.lastTaskState&&(this.lastTaskState.macroTask||this.lastTaskState.microTask)&&(this.isNeedToTriggerHasTask=!0)}getDelegate(){return this._delegateSpec}resetDelegate(){this.getDelegate(),this.setDelegate(this.defaultSpecDelegate)}tryTriggerHasTask(e,t,n){this.isNeedToTriggerHasTask&&this.lastTaskState&&(this.isNeedToTriggerHasTask=!1,this.onHasTask(e,t,n,this.lastTaskState))}removeFromTasks(e){if(this.tasks)for(let t=0;t<this.tasks.length;t++)if(this.tasks[t]===e)return void this.tasks.splice(t,1)}getAndClearPendingTasksInfo(){if(0===this.tasks.length)return"";const e="--Pending async tasks are: ["+this.tasks.map((e=>{const t=e.data&&Object.keys(e.data).map((t=>t+":"+e.data[t])).join(",");return`type: ${e.type}, source: ${e.source}, args: {${t}}`}))+"]";return this.tasks=[],e}onFork(e,t,n,s){return this._delegateSpec&&this._delegateSpec.onFork?this._delegateSpec.onFork(e,t,n,s):e.fork(n,s)}onIntercept(e,t,n,s,r){return this._delegateSpec&&this._delegateSpec.onIntercept?this._delegateSpec.onIntercept(e,t,n,s,r):e.intercept(n,s,r)}onInvoke(e,t,n,s,r,i,o){return this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onInvoke?this._delegateSpec.onInvoke(e,t,n,s,r,i,o):e.invoke(n,s,r,i,o)}onHandleError(e,t,n,s){return this._delegateSpec&&this._delegateSpec.onHandleError?this._delegateSpec.onHandleError(e,t,n,s):e.handleError(n,s)}onScheduleTask(e,t,n,s){return"eventTask"!==s.type&&this.tasks.push(s),this._delegateSpec&&this._delegateSpec.onScheduleTask?this._delegateSpec.onScheduleTask(e,t,n,s):e.scheduleTask(n,s)}onInvokeTask(e,t,n,s,r,i){return"eventTask"!==s.type&&this.removeFromTasks(s),this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onInvokeTask?this._delegateSpec.onInvokeTask(e,t,n,s,r,i):e.invokeTask(n,s,r,i)}onCancelTask(e,t,n,s){return"eventTask"!==s.type&&this.removeFromTasks(s),this.tryTriggerHasTask(e,t,n),this._delegateSpec&&this._delegateSpec.onCancelTask?this._delegateSpec.onCancelTask(e,t,n,s):e.cancelTask(n,s)}onHasTask(e,t,n,s){this.lastTaskState=s,this._delegateSpec&&this._delegateSpec.onHasTask?this._delegateSpec.onHasTask(e,t,n,s):e.hasTask(n,s)}}function patchProxyZoneSpec(e){e.ProxyZoneSpec=ProxyZoneSpec}function patchSyncTest(e){e.SyncTestZoneSpec=class{runZone=e.current;constructor(e){this.name="syncTestZone for "+e}name;onScheduleTask(e,t,n,s){switch(s.type){case"microTask":case"macroTask":throw new Error(`Cannot call ${s.source} from within a sync test (${this.name}).`);case"eventTask":s=e.scheduleTask(n,s)}return s}}}function patchPromiseTesting(e){e.__load_patch("promisefortest",((e,t,n)=>{const s=n.symbol("state"),r=n.symbol("parentUnresolved");Promise[n.symbol("patchPromiseForTest")]=function e(){let n=Promise[t.__symbol__("ZonePromiseThen")];n||(n=Promise[t.__symbol__("ZonePromiseThen")]=Promise.prototype.then,Promise.prototype.then=function(){const e=n.apply(this,arguments);if(null===this[s]){const n=t.current.get("AsyncTestZoneSpec");n&&(n.unresolvedChainedPromiseCount++,e[r]=!0)}return e})},Promise[n.symbol("unPatchPromiseForTest")]=function e(){const n=Promise[t.__symbol__("ZonePromiseThen")];n&&(Promise.prototype.then=n,Promise[t.__symbol__("ZonePromiseThen")]=void 0)}}))}function rollupTesting(e){patchLongStackTrace(e),patchProxyZoneSpec(e),patchSyncTest(e),patchJasmine(e),patchJest(e),patchMocha(e),patchAsyncTest(e),patchFakeAsyncTest(e),patchPromiseTesting(e)}rollupTesting(Zone);QBx   'use strict';
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */
const global = globalThis;
// __Zone_symbol_prefix global can be used to override the default zone
// symbol prefix with a custom one if needed.
function __symbol__(name) {
    const symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';
    return symbolPrefix + name;
}
function initZone() {
    const performance = global['performance'];
    function mark(name) {
        performance && performance['mark'] && performance['mark'](name);
    }
    function performanceMeasure(name, label) {
        performance && performance['measure'] && performance['measure'](name, label);
    }
    mark('Zone');
    class ZoneImpl {
        static __symbol__ = __symbol__;
        static assertZonePatched() {
            if (global['Promise'] !== patches['ZoneAwarePromise']) {
                throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
                    'has been overwritten.\n' +
                    'Most likely cause is that a Promise polyfill has been loaded ' +
                    'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
                    'If you must load one, do so before loading zone.js.)');
            }
        }
        static get root() {
            let zone = ZoneImpl.current;
            while (zone.parent) {
                zone = zone.parent;
            }
            return zone;
        }
        static get current() {
            return _currentZoneFrame.zone;
        }
        static get currentTask() {
            return _currentTask;
        }
        static __load_patch(name, fn, ignoreDuplicate = false) {
            if (patches.hasOwnProperty(name)) {
                // `checkDuplicate` option is defined from global variable
                // so it works for all modules.
                // `ignoreDuplicate` can work for the specified module
                const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
                if (!ignoreDuplicate && checkDuplicate) {
                    throw Error('Already loaded patch: ' + name);
                }
            }
            else if (!global['__Zone_disable_' + name]) {
                const perfName = 'Zone:' + name;
                mark(perfName);
                patches[name] = fn(global, ZoneImpl, _api);
                performanceMeasure(perfName, perfName);
            }
        }
        get parent() {
            return this._parent;
        }
        get name() {
            return this._name;
        }
        _parent;
        _name;
        _properties;
        _zoneDelegate;
        constructor(parent, zoneSpec) {
            this._parent = parent;
            this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '<root>';
            this._properties = (zoneSpec && zoneSpec.properties) || {};
            this._zoneDelegate = new _ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
        }
        get(key) {
            const zone = this.getZoneWith(key);
            if (zone)
                return zone._properties[key];
        }
        getZoneWith(key) {
            let current = this;
            while (current) {
                if (current._properties.hasOwnProperty(key)) {
                    return current;
                }
                current = current._parent;
            }
            return null;
        }
        fork(zoneSpec) {
            if (!zoneSpec)
                throw new Error('ZoneSpec required!');
            return this._zoneDelegate.fork(this, zoneSpec);
        }
        wrap(callback, source) {
            if (typeof callback !== 'function') {
                throw new Error('Expecting function got: ' + callback);
            }
            const _callback = this._zoneDelegate.intercept(this, callback, source);
            const zone = this;
            return function () {
                return zone.runGuarded(_callback, this, arguments, source);
            };
        }
        run(callback, applyThis, applyArgs, source) {
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
            }
            finally {
                _currentZoneFrame = _currentZoneFrame.parent;
            }
        }
        runGuarded(callback, applyThis = null, applyArgs, source) {
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                try {
                    return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
                }
                catch (error) {
                    if (this._zoneDelegate.handleError(this, error)) {
                        throw error;
                    }
                }
            }
            finally {
                _currentZoneFrame = _currentZoneFrame.parent;
            }
        }
        runTask(task, applyThis, applyArgs) {
            if (task.zone != this) {
                throw new Error('A task can only be run in the zone of creation! (Creation: ' +
                    (task.zone || NO_ZONE).name +
                    '; Execution: ' +
                    this.name +
                    ')');
            }
            const zoneTask = task;
            // https://github.com/angular/zone.js/issues/778, sometimes eventTask
            // will run in notScheduled(canceled) state, we should not try to
            // run such kind of task but just return
            const { type, data: { isPeriodic = false, isRefreshable = false } = {} } = task;
            if (task.state === notScheduled && (type === eventTask || type === macroTask)) {
                return;
            }
            const reEntryGuard = task.state != running;
            reEntryGuard && zoneTask._transitionTo(running, scheduled);
            const previousTask = _currentTask;
            _currentTask = zoneTask;
            _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
            try {
                if (type == macroTask && task.data && !isPeriodic && !isRefreshable) {
                    task.cancelFn = undefined;
                }
                try {
                    return this._zoneDelegate.invokeTask(this, zoneTask, applyThis, applyArgs);
                }
                catch (error) {
                    if (this._zoneDelegate.handleError(this, error)) {
                        throw error;
                    }
                }
            }
            finally {
                // if the task's state is notScheduled or unknown, then it has already been cancelled
                // we should not reset the state to scheduled
                const state = task.state;
                if (state !== notScheduled && state !== unknown) {
                    if (type == eventTask || isPeriodic || (isRefreshable && state === scheduling)) {
                        reEntryGuard && zoneTask._transitionTo(scheduled, running, scheduling);
                    }
                    else {
                        const zoneDelegates = zoneTask._zoneDelegates;
                        this._updateTaskCount(zoneTask, -1);
                        reEntryGuard && zoneTask._transitionTo(notScheduled, running, notScheduled);
                        if (isRefreshable) {
                            zoneTask._zoneDelegates = zoneDelegates;
                        }
                    }
                }
                _currentZoneFrame = _currentZoneFrame.parent;
                _currentTask = previousTask;
            }
        }
        scheduleTask(task) {
            if (task.zone && task.zone !== this) {
                // check if the task was rescheduled, the newZone
                // should not be the children of the original zone
                let newZone = this;
                while (newZone) {
                    if (newZone === task.zone) {
                        throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${task.zone.name}`);
                    }
                    newZone = newZone.parent;
                }
            }
            task._transitionTo(scheduling, notScheduled);
            const zoneDelegates = [];
            task._zoneDelegates = zoneDelegates;
            task._zone = this;
            try {
                task = this._zoneDelegate.scheduleTask(this, task);
            }
            catch (err) {
                // should set task's state to unknown when scheduleTask throw error
                // because the err may from reschedule, so the fromState maybe notScheduled
                task._transitionTo(unknown, scheduling, notScheduled);
                // TODO: @JiaLiPassion, should we check the result from handleError?
                this._zoneDelegate.handleError(this, err);
                throw err;
            }
            if (task._zoneDelegates === zoneDelegates) {
                // we have to check because internally the delegate can reschedule the task.
                this._updateTaskCount(task, 1);
            }
            if (task.state == scheduling) {
                task._transitionTo(scheduled, scheduling);
            }
            return task;
        }
        scheduleMicroTask(source, callback, data, customSchedule) {
            return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
        }
        scheduleMacroTask(source, callback, data, customSchedule, customCancel) {
            return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
        }
        scheduleEventTask(source, callback, data, customSchedule, customCancel) {
            return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
        }
        cancelTask(task) {
            if (task.zone != this)
                throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
                    (task.zone || NO_ZONE).name +
                    '; Execution: ' +
                    this.name +
                    ')');
            if (task.state !== scheduled && task.state !== running) {
                return;
            }
            task._transitionTo(canceling, scheduled, running);
            try {
                this._zoneDelegate.cancelTask(this, task);
            }
            catch (err) {
                // if error occurs when cancelTask, transit the state to unknown
                task._transitionTo(unknown, canceling);
                this._zoneDelegate.handleError(this, err);
                throw err;
            }
            this._updateTaskCount(task, -1);
            task._transitionTo(notScheduled, canceling);
            task.runCount = -1;
            return task;
        }
        _updateTaskCount(task, count) {
            const zoneDelegates = task._zoneDelegates;
            if (count == -1) {
                task._zoneDelegates = null;
            }
            for (let i = 0; i < zoneDelegates.length; i++) {
                zoneDelegates[i]._updateTaskCount(task.type, count);
            }
        }
    }
    const DELEGATE_ZS = {
        name: '',
        onHasTask: (delegate, _, target, hasTaskState) => delegate.hasTask(target, hasTaskState),
        onScheduleTask: (delegate, _, target, task) => delegate.scheduleTask(target, task),
        onInvokeTask: (delegate, _, target, task, applyThis, applyArgs) => delegate.invokeTask(target, task, applyThis, applyArgs),
        onCancelTask: (delegate, _, target, task) => delegate.cancelTask(target, task),
    };
    class _ZoneDelegate {
        get zone() {
            return this._zone;
        }
        _zone;
        _taskCounts = {
            'microTask': 0,
            'macroTask': 0,
            'eventTask': 0,
        };
        _parentDelegate;
        _forkDlgt;
        _forkZS;
        _forkCurrZone;
        _interceptDlgt;
        _interceptZS;
        _interceptCurrZone;
        _invokeDlgt;
        _invokeZS;
        _invokeCurrZone;
        _handleErrorDlgt;
        _handleErrorZS;
        _handleErrorCurrZone;
        _scheduleTaskDlgt;
        _scheduleTaskZS;
        _scheduleTaskCurrZone;
        _invokeTaskDlgt;
        _invokeTaskZS;
        _invokeTaskCurrZone;
        _cancelTaskDlgt;
        _cancelTaskZS;
        _cancelTaskCurrZone;
        _hasTaskDlgt;
        _hasTaskDlgtOwner;
        _hasTaskZS;
        _hasTaskCurrZone;
        constructor(zone, parentDelegate, zoneSpec) {
            this._zone = zone;
            this._parentDelegate = parentDelegate;
            this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
            this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
            this._forkCurrZone =
                zoneSpec && (zoneSpec.onFork ? this._zone : parentDelegate._forkCurrZone);
            this._interceptZS =
                zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
            this._interceptDlgt =
                zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
            this._interceptCurrZone =
                zoneSpec && (zoneSpec.onIntercept ? this._zone : parentDelegate._interceptCurrZone);
            this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
            this._invokeDlgt =
                zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
            this._invokeCurrZone =
                zoneSpec && (zoneSpec.onInvoke ? this._zone : parentDelegate._invokeCurrZone);
            this._handleErrorZS =
                zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
            this._handleErrorDlgt =
                zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
            this._handleErrorCurrZone =
                zoneSpec && (zoneSpec.onHandleError ? this._zone : parentDelegate._handleErrorCurrZone);
            this._scheduleTaskZS =
                zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
            this._scheduleTaskDlgt =
                zoneSpec && (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
            this._scheduleTaskCurrZone =
                zoneSpec && (zoneSpec.onScheduleTask ? this._zone : parentDelegate._scheduleTaskCurrZone);
            this._invokeTaskZS =
                zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
            this._invokeTaskDlgt =
                zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
            this._invokeTaskCurrZone =
                zoneSpec && (zoneSpec.onInvokeTask ? this._zone : parentDelegate._invokeTaskCurrZone);
            this._cancelTaskZS =
                zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
            this._cancelTaskDlgt =
                zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
            this._cancelTaskCurrZone =
                zoneSpec && (zoneSpec.onCancelTask ? this._zone : parentDelegate._cancelTaskCurrZone);
            this._hasTaskZS = null;
            this._hasTaskDlgt = null;
            this._hasTaskDlgtOwner = null;
            this._hasTaskCurrZone = null;
            const zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
            const parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
            if (zoneSpecHasTask || parentHasTask) {
                // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
                // a case all task related interceptors must go through this ZD. We can't short circuit it.
                this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
                this._hasTaskDlgt = parentDelegate;
                this._hasTaskDlgtOwner = this;
                this._hasTaskCurrZone = this._zone;
                if (!zoneSpec.onScheduleTask) {
                    this._scheduleTaskZS = DELEGATE_ZS;
                    this._scheduleTaskDlgt = parentDelegate;
                    this._scheduleTaskCurrZone = this._zone;
                }
                if (!zoneSpec.onInvokeTask) {
                    this._invokeTaskZS = DELEGATE_ZS;
                    this._invokeTaskDlgt = parentDelegate;
                    this._invokeTaskCurrZone = this._zone;
                }
                if (!zoneSpec.onCancelTask) {
                    this._cancelTaskZS = DELEGATE_ZS;
                    this._cancelTaskDlgt = parentDelegate;
                    this._cancelTaskCurrZone = this._zone;
                }
            }
        }
        fork(targetZone, zoneSpec) {
            return this._forkZS
                ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec)
                : new ZoneImpl(targetZone, zoneSpec);
        }
        intercept(targetZone, callback, source) {
            return this._interceptZS
                ? this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source)
                : callback;
        }
        invoke(targetZone, callback, applyThis, applyArgs, source) {
            return this._invokeZS
                ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source)
                : callback.apply(applyThis, applyArgs);
        }
        handleError(targetZone, error) {
            return this._handleErrorZS
                ? this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error)
                : true;
        }
        scheduleTask(targetZone, task) {
            let returnTask = task;
            if (this._scheduleTaskZS) {
                if (this._hasTaskZS) {
                    returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
                }
                returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
                if (!returnTask)
                    returnTask = task;
            }
            else {
                if (task.scheduleFn) {
                    task.scheduleFn(task);
                }
                else if (task.type == microTask) {
                    scheduleMicroTask(task);
                }
                else {
                    throw new Error('Task is missing scheduleFn.');
                }
            }
            return returnTask;
        }
        invokeTask(targetZone, task, applyThis, applyArgs) {
            return this._invokeTaskZS
                ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs)
                : task.callback.apply(applyThis, applyArgs);
        }
        cancelTask(targetZone, task) {
            let value;
            if (this._cancelTaskZS) {
                value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
            }
            else {
                if (!task.cancelFn) {
                    throw Error('Task is not cancelable');
                }
                value = task.cancelFn(task);
            }
            return value;
        }
        hasTask(targetZone, isEmpty) {
            // hasTask should not throw error so other ZoneDelegate
            // can still trigger hasTask callback
            try {
                this._hasTaskZS &&
                    this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
            }
            catch (err) {
                this.handleError(targetZone, err);
            }
        }
        _updateTaskCount(type, count) {
            const counts = this._taskCounts;
            const prev = counts[type];
            const next = (counts[type] = prev + count);
            if (next < 0) {
                throw new Error('More tasks executed then were scheduled.');
            }
            if (prev == 0 || next == 0) {
                const isEmpty = {
                    microTask: counts['microTask'] > 0,
                    macroTask: counts['macroTask'] > 0,
                    eventTask: counts['eventTask'] > 0,
                    change: type,
                };
                this.hasTask(this._zone, isEmpty);
            }
        }
    }
    class ZoneTask {
        type;
        source;
        invoke;
        callback;
        data;
        scheduleFn;
        cancelFn;
        _zone = null;
        runCount = 0;
        _zoneDelegates = null;
        _state = 'notScheduled';
        constructor(type, source, callback, options, scheduleFn, cancelFn) {
            this.type = type;
            this.source = source;
            this.data = options;
            this.scheduleFn = scheduleFn;
            this.cancelFn = cancelFn;
            if (!callback) {
                throw new Error('callback is not defined');
            }
            this.callback = callback;
            const self = this;
            // TODO: @JiaLiPassion options should have interface
            if (type === eventTask && options && options.useG) {
                this.invoke = ZoneTask.invokeTask;
            }
            else {
                this.invoke = function () {
                    return ZoneTask.invokeTask.call(global, self, this, arguments);
                };
            }
        }
        static invokeTask(task, target, args) {
            if (!task) {
                task = this;
            }
            _numberOfNestedTaskFrames++;
            try {
                task.runCount++;
                return task.zone.runTask(task, target, args);
            }
            finally {
                if (_numberOfNestedTaskFrames == 1) {
                    drainMicroTaskQueue();
                }
                _numberOfNestedTaskFrames--;
            }
        }
        get zone() {
            return this._zone;
        }
        get state() {
            return this._state;
        }
        cancelScheduleRequest() {
            this._transitionTo(notScheduled, scheduling);
        }
        _transitionTo(toState, fromState1, fromState2) {
            if (this._state === fromState1 || this._state === fromState2) {
                this._state = toState;
                if (toState == notScheduled) {
                    this._zoneDelegates = null;
                }
            }
            else {
                throw new Error(`${this.type} '${this.source}': can not transition to '${toState}', expecting state '${fromState1}'${fromState2 ? " or '" + fromState2 + "'" : ''}, was '${this._state}'.`);
            }
        }
        toString() {
            if (this.data && typeof this.data.handleId !== 'undefined') {
                return this.data.handleId.toString();
            }
            else {
                return Object.prototype.toString.call(this);
            }
        }
        // add toJSON method to prevent cyclic error when
        // call JSON.stringify(zoneTask)
        toJSON() {
            return {
                type: this.type,
                state: this.state,
                source: this.source,
                zone: this.zone.name,
                runCount: this.runCount,
            };
        }
    }
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    ///  MICROTASK QUEUE
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    const symbolSetTimeout = __symbol__('setTimeout');
    const symbolPromise = __symbol__('Promise');
    const symbolThen = __symbol__('then');
    let _microTaskQueue = [];
    let _isDrainingMicrotaskQueue = false;
    let nativeMicroTaskQueuePromise;
    function nativeScheduleMicroTask(func) {
        if (!nativeMicroTaskQueuePromise) {
            if (global[symbolPromise]) {
                nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
            }
        }
        if (nativeMicroTaskQueuePromise) {
            let nativeThen = nativeMicroTaskQueuePromise[symbolThen];
            if (!nativeThen) {
                // native Promise is not patchable, we need to use `then` directly
                // issue 1078
                nativeThen = nativeMicroTaskQueuePromise['then'];
            }
            nativeThen.call(nativeMicroTaskQueuePromise, func);
        }
        else {
            global[symbolSetTimeout](func, 0);
        }
    }
    function scheduleMicroTask(task) {
        // if we are not running in any task, and there has not been anything scheduled
        // we must bootstrap the initial task creation by manually scheduling the drain
        if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
            // We are not running in Task, so we need to kickstart the microtask queue.
            nativeScheduleMicroTask(drainMicroTaskQueue);
        }
        task && _microTaskQueue.push(task);
    }
    function drainMicroTaskQueue() {
        if (!_isDrainingMicrotaskQueue) {
            _isDrainingMicrotaskQueue = true;
            while (_microTaskQueue.length) {
                const queue = _microTaskQueue;
                _microTaskQueue = [];
                for (let i = 0; i < queue.length; i++) {
                    const task = queue[i];
                    try {
                        task.zone.runTask(task, null, null);
                    }
                    catch (error) {
                        _api.onUnhandledError(error);
                    }
                }
            }
            _api.microtaskDrainDone();
            _isDrainingMicrotaskQueue = false;
        }
    }
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    ///  BOOTSTRAP
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    const NO_ZONE = { name: 'NO ZONE' };
    const notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
    const microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
    const patches = {};
    const _api = {
        symbol: __symbol__,
        currentZoneFrame: () => _currentZoneFrame,
        onUnhandledError: noop,
        microtaskDrainDone: noop,
        scheduleMicroTask: scheduleMicroTask,
        showUncaughtError: () => !ZoneImpl[__symbol__('ignoreConsoleErrorUncaughtError')],
        patchEventTarget: () => [],
        patchOnProperties: noop,
        patchMethod: () => noop,
        bindArguments: () => [],
        patchThen: () => noop,
        patchMacroTask: () => noop,
        patchEventPrototype: () => noop,
        isIEOrEdge: () => false,
        getGlobalObjects: () => undefined,
        ObjectDefineProperty: () => noop,
        ObjectGetOwnPropertyDescriptor: () => undefined,
        ObjectCreate: () => undefined,
        ArraySlice: () => [],
        patchClass: () => noop,
        wrapWithCurrentZone: () => noop,
        filterProperties: () => [],
        attachOriginToPatched: () => noop,
        _redefineProperty: () => noop,
        patchCallbacks: () => noop,
        nativeScheduleMicroTask: nativeScheduleMicroTask,
    };
    let _currentZoneFrame = { parent: null, zone: new ZoneImpl(null, null) };
    let _currentTask = null;
    let _numberOfNestedTaskFrames = 0;
    function noop() { }
    performanceMeasure('Zone', 'Zone');
    return ZoneImpl;
}

function loadZone() {
    // if global['Zone'] already exists (maybe zone.js was already loaded or
    // some other lib also registered a global object named Zone), we may need
    // to throw an error, but sometimes user may not want this error.
    // For example,
    // we have two web pages, page1 includes zone.js, page2 doesn't.
    // and the 1st time user load page1 and page2, everything work fine,
    // but when user load page2 again, error occurs because global['Zone'] already exists.
    // so we add a flag to let user choose whether to throw this error or not.
    // By default, if existing Zone is from zone.js, we will not throw the error.
    const global = globalThis;
    const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
    if (global['Zone'] && (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function')) {
        throw new Error('Zone already loaded.');
    }
    // Initialize global `Zone` constant.
    global['Zone'] ??= initZone();
    return global['Zone'];
}

/**
 * Suppress closure compiler errors about unknown 'Zone' variable
 * @fileoverview
 * @suppress {undefinedVars,globalThis,missingRequire}
 */
/// <reference types="node"/>
// issue #989, to reduce bundle size, use short name
/** Object.getOwnPropertyDescriptor */
const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
/** Object.defineProperty */
const ObjectDefineProperty = Object.defineProperty;
/** Object.getPrototypeOf */
const ObjectGetPrototypeOf = Object.getPrototypeOf;
/** Object.create */
const ObjectCreate = Object.create;
/** Array.prototype.slice */
const ArraySlice = Array.prototype.slice;
/** addEventListener string const */
const ADD_EVENT_LISTENER_STR = 'addEventListener';
/** removeEventListener string const */
const REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
/** zoneSymbol addEventListener */
const ZONE_SYMBOL_ADD_EVENT_LISTENER = __symbol__(ADD_EVENT_LISTENER_STR);
/** zoneSymbol removeEventListener */
const ZONE_SYMBOL_REMOVE_EVENT_LISTENER = __symbol__(REMOVE_EVENT_LISTENER_STR);
/** true string const */
const TRUE_STR = 'true';
/** false string const */
const FALSE_STR = 'false';
/** Zone symbol prefix string const. */
const ZONE_SYMBOL_PREFIX = __symbol__('');
function wrapWithCurrentZone(callback, source) {
    return Zone.current.wrap(callback, source);
}
function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
    return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
}
const zoneSymbol = __symbol__;
const isWindowExists = typeof window !== 'undefined';
const internalWindow = isWindowExists ? window : undefined;
const _global = (isWindowExists && internalWindow) || globalThis;
const REMOVE_ATTRIBUTE = 'removeAttribute';
function bindArguments(args, source) {
    for (let i = args.length - 1; i >= 0; i--) {
        if (typeof args[i] === 'function') {
            args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
        }
    }
    return args;
}
function patchPrototype(prototype, fnNames) {
    const source = prototype.constructor['name'];
    for (let i = 0; i < fnNames.length; i++) {
        const name = fnNames[i];
        const delegate = prototype[name];
        if (delegate) {
            const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name);
            if (!isPropertyWritable(prototypeDesc)) {
                continue;
            }
            prototype[name] = ((delegate) => {
                const patched = function () {
                    return delegate.apply(this, bindArguments(arguments, source + '.' + name));
                };
                attachOriginToPatched(patched, delegate);
                return patched;
            })(delegate);
        }
    }
}
function isPropertyWritable(propertyDesc) {
    if (!propertyDesc) {
        return true;
    }
    if (propertyDesc.writable === false) {
        return false;
    }
    return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
}
const isWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
// this code.
const isNode = !('nw' in _global) &&
    typeof _global.process !== 'undefined' &&
    _global.process.toString() === '[object process]';
const isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
// we are in electron of nw, so we are both browser and nodejs
// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
// this code.
const isMix = typeof _global.process !== 'undefined' &&
    _global.process.toString() === '[object process]' &&
    !isWebWorker &&
    !!(isWindowExists && internalWindow['HTMLElement']);
const zoneSymbolEventNames$1 = {};
const enableBeforeunloadSymbol = zoneSymbol('enable_beforeunload');
const wrapFn = function (event) {
    // https://github.com/angular/zone.js/issues/911, in IE, sometimes
    // event will be undefined, so we need to use window.event
    event = event || _global.event;
    if (!event) {
        return;
    }
    let eventNameSymbol = zoneSymbolEventNames$1[event.type];
    if (!eventNameSymbol) {
        eventNameSymbol = zoneSymbolEventNames$1[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
    }
    const target = this || event.target || _global;
    const listener = target[eventNameSymbol];
    let result;
    if (isBrowser && target === internalWindow && event.type === 'error') {
        // window.onerror have different signature
        // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
        // and onerror callback will prevent default when callback return true
        const errorEvent = event;
        result =
            listener &&
                listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
        if (result === true) {
            event.preventDefault();
        }
    }
    else {
        result = listener && listener.apply(this, arguments);
        if (
        // https://github.com/angular/angular/issues/47579
        // https://www.w3.org/TR/2011/WD-html5-20110525/history.html#beforeunloadevent
        // This is the only specific case we should check for. The spec defines that the
        // `returnValue` attribute represents the message to show the user. When the event
        // is created, this attribute must be set to the empty string.
        event.type === 'beforeunload' &&
            // To prevent any breaking changes resulting from this change, given that
            // it was already causing a significant number of failures in G3, we have hidden
            // that behavior behind a global configuration flag. Consumers can enable this
            // flag explicitly if they want the `beforeunload` event to be handled as defined
            // in the specification.
            _global[enableBeforeunloadSymbol] &&
            // The IDL event definition is `attribute DOMString returnValue`, so we check whether
            // `typeof result` is a string.
            typeof result === 'string') {
            event.returnValue = result;
        }
        else if (result != undefined && !result) {
            event.preventDefault();
        }
    }
    return result;
};
function patchProperty(obj, prop, prototype) {
    let desc = ObjectGetOwnPropertyDescriptor(obj, prop);
    if (!desc && prototype) {
        // when patch window object, use prototype to check prop exist or not
        const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
        if (prototypeDesc) {
            desc = { enumerable: true, configurable: true };
        }
    }
    // if the descriptor not exists or is not configurable
    // just return
    if (!desc || !desc.configurable) {
        return;
    }
    const onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
    if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
        return;
    }
    // A property descriptor cannot have getter/setter and be writable
    // deleting the writable and value properties avoids this error:
    //
    // TypeError: property descriptors must not specify a value or be writable when a
    // getter or setter has been specified
    delete desc.writable;
    delete desc.value;
    const originalDescGet = desc.get;
    const originalDescSet = desc.set;
    // slice(2) cuz 'onclick' -> 'click', etc
    const eventName = prop.slice(2);
    let eventNameSymbol = zoneSymbolEventNames$1[eventName];
    if (!eventNameSymbol) {
        eventNameSymbol = zoneSymbolEventNames$1[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
    }
    desc.set = function (newValue) {
        // In some versions of Windows, the `this` context may be undefined
        // in on-property callbacks.
        // To handle this edge case, we check if `this` is falsy and
        // fallback to `_global` if needed.
        let target = this;
        if (!target && obj === _global) {
            target = _global;
        }
        if (!target) {
            return;
        }
        const previousValue = target[eventNameSymbol];
        if (typeof previousValue === 'function') {
            target.removeEventListener(eventName, wrapFn);
        }
        // https://github.com/angular/zone.js/issues/978
        // If an inline handler (like `onload`) was defined before zone.js was loaded,
        // call the original descriptor's setter to clean it up.
        originalDescSet?.call(target, null);
        target[eventNameSymbol] = newValue;
        if (typeof newValue === 'function') {
            target.addEventListener(eventName, wrapFn, false);
        }
    };
    // The getter would return undefined for unassigned properties but the default value of an
    // unassigned property is null
    desc.get = function () {
        // in some of windows's onproperty callback, this is undefined
        // so we need to check it
        let target = this;
        if (!target && obj === _global) {
            target = _global;
        }
        if (!target) {
            return null;
        }
        const listener = target[eventNameSymbol];
        if (listener) {
            return listener;
        }
        else if (originalDescGet) {
            // result will be null when use inline event attribute,
            // such as <button onclick="func();">OK</button>
            // because the onclick function is internal raw uncompiled handler
            // the onclick will be evaluated when first time event was triggered or
            // the property is accessed, https://github.com/angular/zone.js/issues/525
            // so we should use original native get to retrieve the handler
            let value = originalDescGet.call(this);
            if (value) {
                desc.set.call(this, value);
                if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
                    target.removeAttribute(prop);
                }
                return value;
            }
        }
        return null;
    };
    ObjectDefineProperty(obj, prop, desc);
    obj[onPropPatchedSymbol] = true;
}
function patchOnProperties(obj, properties, prototype) {
    if (properties) {
        for (let i = 0; i < properties.length; i++) {
            patchProperty(obj, 'on' + properties[i], prototype);
        }
    }
    else {
        const onProperties = [];
        for (const prop in obj) {
            if (prop.slice(0, 2) == 'on') {
                onProperties.push(prop);
            }
        }
        for (let j = 0; j < onProperties.length; j++) {
            patchProperty(obj, onProperties[j], prototype);
        }
    }
}
const originalInstanceKey = zoneSymbol('originalInstance');
// wrap some native API on `window`
function patchClass(className) {
    const OriginalClass = _global[className];
    if (!OriginalClass)
        return;
    // keep original class in global
    _global[zoneSymbol(className)] = OriginalClass;
    _global[className] = function () {
        const a = bindArguments(arguments, className);
        switch (a.length) {
            case 0:
                this[originalInstanceKey] = new OriginalClass();
                break;
            case 1:
                this[originalInstanceKey] = new OriginalClass(a[0]);
                break;
            case 2:
                this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
                break;
            case 3:
                this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
                break;
            case 4:
                this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
                break;
            default:
                throw new Error('Arg list too long.');
        }
    };
    // attach original delegate to patched function
    attachOriginToPatched(_global[className], OriginalClass);
    const instance = new OriginalClass(function () { });
    let prop;
    for (prop in instance) {
        // https://bugs.webkit.org/show_bug.cgi?id=44721
        if (className === 'XMLHttpRequest' && prop === 'responseBlob')
            continue;
        (function (prop) {
            if (typeof instance[prop] === 'function') {
                _global[className].prototype[prop] = function () {
                    return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
                };
            }
            else {
                ObjectDefineProperty(_global[className].prototype, prop, {
                    set: function (fn) {
                        if (typeof fn === 'function') {
                            this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
                            // keep callback in wrapped function so we can
                            // use it in Function.prototype.toString to return
                            // the native one.
                            attachOriginToPatched(this[originalInstanceKey][prop], fn);
                        }
                        else {
                            this[originalInstanceKey][prop] = fn;
                        }
                    },
                    get: function () {
                        return this[originalInstanceKey][prop];
                    },
                });
            }
        })(prop);
    }
    for (prop in OriginalClass) {
        if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
            _global[className][prop] = OriginalClass[prop];
        }
    }
}
function patchMethod(target, name, patchFn) {
    let proto = target;
    while (proto && !proto.hasOwnProperty(name)) {
        proto = ObjectGetPrototypeOf(proto);
    }
    if (!proto && target[name]) {
        // somehow we did not find it, but we can see it. This happens on IE for Window properties.
        proto = target;
    }
    const delegateName = zoneSymbol(name);
    let delegate = null;
    if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
        delegate = proto[delegateName] = proto[name];
        // check whether proto[name] is writable
        // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
        const desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
        if (isPropertyWritable(desc)) {
            const patchDelegate = patchFn(delegate, delegateName, name);
            proto[name] = function () {
                return patchDelegate(this, arguments);
            };
            attachOriginToPatched(proto[name], delegate);
        }
    }
    return delegate;
}
// TODO: @JiaLiPassion, support cancel task later if necessary
function patchMacroTask(obj, funcName, metaCreator) {
    let setNative = null;
    function scheduleTask(task) {
        const data = task.data;
        data.args[data.cbIdx] = function () {
            task.invoke.apply(this, arguments);
        };
        setNative.apply(data.target, data.args);
        return task;
    }
    setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {
        const meta = metaCreator(self, args);
        if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
            return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
        }
        else {
            // cause an error by calling it directly.
            return delegate.apply(self, args);
        }
    });
}
function attachOriginToPatched(patched, original) {
    patched[zoneSymbol('OriginalDelegate')] = original;
}
let isDetectedIEOrEdge = false;
let ieOrEdge = false;
function isIEOrEdge() {
    if (isDetectedIEOrEdge) {
        return ieOrEdge;
    }
    isDetectedIEOrEdge = true;
    try {
        const ua = internalWindow.navigator.userAgent;
        if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
            ieOrEdge = true;
        }
    }
    catch (error) { }
    return ieOrEdge;
}
function isFunction(value) {
    return typeof value === 'function';
}
function isNumber(value) {
    return typeof value === 'number';
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
// an identifier to tell ZoneTask do not create a new invoke closure
const OPTIMIZED_ZONE_EVENT_TASK_DATA = {
    useG: true,
};
const zoneSymbolEventNames = {};
const globalSources = {};
const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
function prepareEventNames(eventName, eventNameToString) {
    const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
    const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
    const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
    const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
    zoneSymbolEventNames[eventName] = {};
    zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
    zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
}
function patchEventTarget(_global, api, apis, patchOptions) {
    const ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
    const REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
    const LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
    const REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
    const zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
    const ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
    const PREPEND_EVENT_LISTENER = 'prependListener';
    const PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
    const invokeTask = function (task, target, event) {
        // for better performance, check isRemoved which is set
        // by removeEventListener
        if (task.isRemoved) {
            return;
        }
        const delegate = task.callback;
        if (typeof delegate === 'object' && delegate.handleEvent) {
            // create the bind version of handleEvent when invoke
            task.callback = (event) => delegate.handleEvent(event);
            task.originalDelegate = delegate;
        }
        // invoke static task.invoke
        // need to try/catch error here, otherwise, the error in one event listener
        // will break the executions of the other event listeners. Also error will
        // not remove the event listener when `once` options is true.
        let error;
        try {
            task.invoke(task, target, [event]);
        }
        catch (err) {
            error = err;
        }
        const options = task.options;
        if (options && typeof options === 'object' && options.once) {
            // if options.once is true, after invoke once remove listener here
            // only browser need to do this, nodejs eventEmitter will cal removeListener
            // inside EventEmitter.once
            const delegate = task.originalDelegate ? task.originalDelegate : task.callback;
            target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate, options);
        }
        return error;
    };
    function globalCallback(context, event, isCapture) {
        // https://github.com/angular/zone.js/issues/911, in IE, sometimes
        // event will be undefined, so we need to use window.event
        event = event || _global.event;
        if (!event) {
            return;
        }
        // event.target is needed for Samsung TV and SourceBuffer
        // || global is needed https://github.com/angular/zone.js/issues/190
        const target = context || event.target || _global;
        const tasks = target[zoneSymbolEventNames[event.type][isCapture ? TRUE_STR : FALSE_STR]];
        if (tasks) {
            const errors = [];
            // invoke all tasks which attached to current target with given event.type and capture = false
            // for performance concern, if task.length === 1, just invoke
            if (tasks.length === 1) {
                const err = invokeTask(tasks[0], target, event);
                err && errors.push(err);
            }
            else {
                // https://github.com/angular/zone.js/issues/836
                // copy the tasks array before invoke, to avoid
                // the callback will remove itself or other listener
                const copyTasks = tasks.slice();
                for (let i = 0; i < copyTasks.length; i++) {
                    if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
                        break;
                    }
                    const err = invokeTask(copyTasks[i], target, event);
                    err && errors.push(err);
                }
            }
            // Since there is only one error, we don't need to schedule microTask
            // to throw the error.
            if (errors.length === 1) {
                throw errors[0];
            }
            else {
                for (let i = 0; i < errors.length; i++) {
                    const err = errors[i];
                    api.nativeScheduleMicroTask(() => {
                        throw err;
                    });
                }
            }
        }
    }
    // global shared zoneAwareCallback to handle all event callback with capture = false
    const globalZoneAwareCallback = function (event) {
        return globalCallback(this, event, false);
    };
    // global shared zoneAwareCallback to handle all event callback with capture = true
    const globalZoneAwareCaptureCallback = function (event) {
        return globalCallback(this, event, true);
    };
    function patchEventTargetMethods(obj, patchOptions) {
        if (!obj) {
            return false;
        }
        let useGlobalCallback = true;
        if (patchOptions && patchOptions.useG !== undefined) {
            useGlobalCallback = patchOptions.useG;
        }
        const validateHandler = patchOptions && patchOptions.vh;
        let checkDuplicate = true;
        if (patchOptions && patchOptions.chkDup !== undefined) {
            checkDuplicate = patchOptions.chkDup;
        }
        let returnTarget = false;
        if (patchOptions && patchOptions.rt !== undefined) {
            returnTarget = patchOptions.rt;
        }
        let proto = obj;
        while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
            proto = ObjectGetPrototypeOf(proto);
        }
        if (!proto && obj[ADD_EVENT_LISTENER]) {
            // somehow we did not find it, but we can see it. This happens on IE for Window properties.
            proto = obj;
        }
        if (!proto) {
            return false;
        }
        if (proto[zoneSymbolAddEventListener]) {
            return false;
        }
        const eventNameToString = patchOptions && patchOptions.eventNameToString;
        // We use a shared global `taskData` to pass data for `scheduleEventTask`,
        // eliminating the need to create a new object solely for passing data.
        // WARNING: This object has a static lifetime, meaning it is not created
        // each time `addEventListener` is called. It is instantiated only once
        // and captured by reference inside the `addEventListener` and
        // `removeEventListener` functions. Do not add any new properties to this
        // object, as doing so would necessitate maintaining the information
        // between `addEventListener` calls.
        const taskData = {};
        const nativeAddEventListener = (proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER]);
        const nativeRemoveEventListener = (proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
            proto[REMOVE_EVENT_LISTENER]);
        const nativeListeners = (proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
            proto[LISTENERS_EVENT_LISTENER]);
        const nativeRemoveAllListeners = (proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
            proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER]);
        let nativePrependEventListener;
        if (patchOptions && patchOptions.prepend) {
            nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
                proto[patchOptions.prepend];
        }
        /**
         * This util function will build an option object with passive option
         * to handle all possible input from the user.
         */
        function buildEventListenerOptions(options, passive) {
            if (!passive) {
                return options;
            }
            if (typeof options === 'boolean') {
                return { capture: options, passive: true };
            }
            if (!options) {
                return { passive: true };
            }
            if (typeof options === 'object' && options.passive !== false) {
                return { ...options, passive: true };
            }
            return options;
        }
        const customScheduleGlobal = function (task) {
            // if there is already a task for the eventName + capture,
            // just return, because we use the shared globalZoneAwareCallback here.
            if (taskData.isExisting) {
                return;
            }
            return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
        };
        /**
         * In the context of events and listeners, this function will be
         * called at the end by `cancelTask`, which, in turn, calls `task.cancelFn`.
         * Cancelling a task is primarily used to remove event listeners from
         * the task target.
         */
        const customCancelGlobal = function (task) {
            // if task is not marked as isRemoved, this call is directly
            // from Zone.prototype.cancelTask, we should remove the task
            // from tasksList of target first
            if (!task.isRemoved) {
                const symbolEventNames = zoneSymbolEventNames[task.eventName];
                let symbolEventName;
                if (symbolEventNames) {
                    symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
                }
                const existingTasks = symbolEventName && task.target[symbolEventName];
                if (existingTasks) {
                    for (let i = 0; i < existingTasks.length; i++) {
                        const existingTask = existingTasks[i];
                        if (existingTask === task) {
                            existingTasks.splice(i, 1);
                            // set isRemoved to data for faster invokeTask check
                            task.isRemoved = true;
                            if (task.removeAbortListener) {
                                task.removeAbortListener();
                                task.removeAbortListener = null;
                            }
                            if (existingTasks.length === 0) {
                                // all tasks for the eventName + capture have gone,
                                // remove globalZoneAwareCallback and remove the task cache from target
                                task.allRemoved = true;
                                task.target[symbolEventName] = null;
                            }
                            break;
                        }
                    }
                }
            }
            // if all tasks for the eventName + capture have gone,
            // we will really remove the global event callback,
            // if not, return
            if (!task.allRemoved) {
                return;
            }
            return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
        };
        const customScheduleNonGlobal = function (task) {
            return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
        };
        const customSchedulePrepend = function (task) {
            return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
        };
        const customCancelNonGlobal = function (task) {
            return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
        };
        const customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
        const customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
        const compareTaskCallbackVsDelegate = function (task, delegate) {
            const typeOfDelegate = typeof delegate;
            return ((typeOfDelegate === 'function' && task.callback === delegate) ||
                (typeOfDelegate === 'object' && task.originalDelegate === delegate));
        };
        const compare = patchOptions?.diff || compareTaskCallbackVsDelegate;
        const unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];
        const passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];
        function copyEventListenerOptions(options) {
            if (typeof options === 'object' && options !== null) {
                // We need to destructure the target `options` object since it may
                // be frozen or sealed (possibly provided implicitly by a third-party
                // library), or its properties may be readonly.
                const newOptions = { ...options };
                // The `signal` option was recently introduced, which caused regressions in
                // third-party scenarios where `AbortController` was directly provided to
                // `addEventListener` as options. For instance, in cases like
                // `document.addEventListener('keydown', callback, abortControllerInstance)`,
                // which is valid because `AbortController` includes a `signal` getter, spreading
                // `{...options}` wouldn't copy the `signal`. Additionally, using `Object.create`
                // isn't feasible since `AbortController` is a built-in object type, and attempting
                // to create a new object directly with it as the prototype might result in
                // unexpected behavior.
                if (options.signal) {
                    newOptions.signal = options.signal;
                }
                return newOptions;
            }
            return options;
        }
        const makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget = false, prepend = false) {
            return function () {
                const target = this || _global;
                let eventName = arguments[0];
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                let delegate = arguments[1];
                if (!delegate) {
                    return nativeListener.apply(this, arguments);
                }
                if (isNode && eventName === 'uncaughtException') {
                    // don't patch uncaughtException of nodejs to prevent endless loop
                    return nativeListener.apply(this, arguments);
                }
                // To improve `addEventListener` performance, we will create the callback
                // for the task later when the task is invoked.
                let isEventListenerObject = false;
                if (typeof delegate !== 'function') {
                    // This checks whether the provided listener argument is an object with
                    // a `handleEvent` method (since we can call `addEventListener` with a
                    // function `event => ...` or with an object `{ handleEvent: event => ... }`).
                    if (!delegate.handleEvent) {
                        return nativeListener.apply(this, arguments);
                    }
                    isEventListenerObject = true;
                }
                if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
                    return;
                }
                const passive = !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
                const options = copyEventListenerOptions(buildEventListenerOptions(arguments[2], passive));
                const signal = options?.signal;
                if (signal?.aborted) {
                    // the signal is an aborted one, just return without attaching the event listener.
                    return;
                }
                if (unpatchedEvents) {
                    // check unpatched list
                    for (let i = 0; i < unpatchedEvents.length; i++) {
                        if (eventName === unpatchedEvents[i]) {
                            if (passive) {
                                return nativeListener.call(target, eventName, delegate, options);
                            }
                            else {
                                return nativeListener.apply(this, arguments);
                            }
                        }
                    }
                }
                const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
                const once = options && typeof options === 'object' ? options.once : false;
                const zone = Zone.current;
                let symbolEventNames = zoneSymbolEventNames[eventName];
                if (!symbolEventNames) {
                    prepareEventNames(eventName, eventNameToString);
                    symbolEventNames = zoneSymbolEventNames[eventName];
                }
                const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
                let existingTasks = target[symbolEventName];
                let isExisting = false;
                if (existingTasks) {
                    // already have task registered
                    isExisting = true;
                    if (checkDuplicate) {
                        for (let i = 0; i < existingTasks.length; i++) {
                            if (compare(existingTasks[i], delegate)) {
                                // same callback, same capture, same event name, just return
                                return;
                            }
                        }
                    }
                }
                else {
                    existingTasks = target[symbolEventName] = [];
                }
                let source;
                const constructorName = target.constructor['name'];
                const targetSource = globalSources[constructorName];
                if (targetSource) {
                    source = targetSource[eventName];
                }
                if (!source) {
                    source =
                        constructorName +
                            addSource +
                            (eventNameToString ? eventNameToString(eventName) : eventName);
                }
                // In the code below, `options` should no longer be reassigned; instead, it
                // should only be mutated. This is because we pass that object to the native
                // `addEventListener`.
                // It's generally recommended to use the same object reference for options.
                // This ensures consistency and avoids potential issues.
                taskData.options = options;
                if (once) {
                    // When using `addEventListener` with the `once` option, we don't pass
                    // the `once` option directly to the native `addEventListener` method.
                    // Instead, we keep the `once` setting and handle it ourselves.
                    taskData.options.once = false;
                }
                   taskData.target = target;
                taskData.capture = capture;
                taskData.eventName = eventName;
                taskData.isExisting = isExisting;
                const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
                // keep taskData into data to allow onScheduleEventTask to access the task information
                if (data) {
                    data.taskData = taskData;
                }
                if (signal) {
                    // When using `addEventListener` with the `signal` option, we don't pass
                    // the `signal` option directly to the native `addEventListener` method.
                    // Instead, we keep the `signal` setting and handle it ourselves.
                    taskData.options.signal = undefined;
                }
                // The `scheduleEventTask` function will ultimately call `customScheduleGlobal`,
                // which in turn calls the native `addEventListener`. This is why `taskData.options`
                // is updated before scheduling the task, as `customScheduleGlobal` uses
                // `taskData.options` to pass it to the native `addEventListener`.
                const task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
                if (signal) {
                    // after task is scheduled, we need to store the signal back to task.options
                    taskData.options.signal = signal;
                    // Wrapping `task` in a weak reference would not prevent memory leaks. Weak references are
                    // primarily used for preventing strong references cycles. `onAbort` is always reachable
                    // as it's an event listener, so its closure retains a strong reference to the `task`.
                    const onAbort = () => task.zone.cancelTask(task);
                    nativeListener.call(signal, 'abort', onAbort, { once: true });
                    // We need to remove the `abort` listener when the event listener is going to be removed,
                    // as it creates a closure that captures `task`. This closure retains a reference to the
                    // `task` object even after it goes out of scope, preventing `task` from being garbage
                    // collected.
                    task.removeAbortListener = () => signal.removeEventListener('abort', onAbort);
                }
                // should clear taskData.target to avoid memory leak
                // issue, https://github.com/angular/angular/issues/20442
                taskData.target = null;
                // need to clear up taskData because it is a global object
                if (data) {
                    data.taskData = null;
                }
                // have to save those information to task in case
                // application may call task.zone.cancelTask() directly
                if (once) {
                    taskData.options.once = true;
                }
                if (typeof task.options !== 'boolean') {
                    // We should save the options on the task (if it's an object) because
                    // we'll be using `task.options` later when removing the event listener
                    // and passing it back to `removeEventListener`.
                    task.options = options;
                }
                task.target = target;
                task.capture = capture;
                task.eventName = eventName;
                if (isEventListenerObject) {
                    // save original delegate for compare to check duplicate
                    task.originalDelegate = delegate;
                }
                if (!prepend) {
                    existingTasks.push(task);
                }
                else {
                    existingTasks.unshift(task);
                }
                if (returnTarget) {
                    return target;
                }
            };
        };
        proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
        if (nativePrependEventListener) {
            proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
        }
        proto[REMOVE_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (patchOptions && patchOptions.transferEventName) {
                eventName = patchOptions.transferEventName(eventName);
            }
            const options = arguments[2];
            const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
            const delegate = arguments[1];
            if (!delegate) {
                return nativeRemoveEventListener.apply(this, arguments);
            }
            if (validateHandler &&
                !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
                return;
            }
            const symbolEventNames = zoneSymbolEventNames[eventName];
            let symbolEventName;
            if (symbolEventNames) {
                symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
            }
            const existingTasks = symbolEventName && target[symbolEventName];
            // `existingTasks` may not exist if the `addEventListener` was called before
            // it was patched by zone.js. Please refer to the attached issue for
            // clarification, particularly after the `if` condition, before calling
            // the native `removeEventListener`.
            if (existingTasks) {
                for (let i = 0; i < existingTasks.length; i++) {
                    const existingTask = existingTasks[i];
                    if (compare(existingTask, delegate)) {
                        existingTasks.splice(i, 1);
                        // set isRemoved to data for faster invokeTask check
                        existingTask.isRemoved = true;
                        if (existingTasks.length === 0) {
                            // all tasks for the eventName + capture have gone,
                            // remove globalZoneAwareCallback and remove the task cache from target
                            existingTask.allRemoved = true;
                            target[symbolEventName] = null;
                            // in the target, we have an event listener which is added by on_property
                            // such as target.onclick = function() {}, so we need to clear this internal
                            // property too if all delegates with capture=false were removed
                            // https:// github.com/angular/angular/issues/31643
                            // https://github.com/angular/angular/issues/54581
                            if (!capture && typeof eventName === 'string') {
                                const onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;
                                target[onPropertySymbol] = null;
                            }
                        }
                        // In all other conditions, when `addEventListener` is called after being
                        // patched by zone.js, we would always find an event task on the `EventTarget`.
                        // This will trigger `cancelFn` on the `existingTask`, leading to `customCancelGlobal`,
                        // which ultimately removes an event listener and cleans up the abort listener
                        // (if an `AbortSignal` was provided when scheduling a task).
                        existingTask.zone.cancelTask(existingTask);
                        if (returnTarget) {
                            return target;
                        }
                        return;
                    }
                }
            }
            // https://github.com/angular/zone.js/issues/930
            // We may encounter a situation where the `addEventListener` was
            // called on the event target before zone.js is loaded, resulting
            // in no task being stored on the event target due to its invocation
            // of the native implementation. In this scenario, we simply need to
            // invoke the native `removeEventListener`.
            return nativeRemoveEventListener.apply(this, arguments);
        };
        proto[LISTENERS_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (patchOptions && patchOptions.transferEventName) {
                eventName = patchOptions.transferEventName(eventName);
            }
            const listeners = [];
            const tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
            for (let i = 0; i < tasks.length; i++) {
                const task = tasks[i];
                let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                listeners.push(delegate);
            }
            return listeners;
        };
        proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
            const target = this || _global;
            let eventName = arguments[0];
            if (!eventName) {
                const keys = Object.keys(target);
                for (let i = 0; i < keys.length; i++) {
                    const prop = keys[i];
                    const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
                    let evtName = match && match[1];
                    // in nodejs EventEmitter, removeListener event is
                    // used for monitoring the removeListener call,
                    // so just keep removeListener eventListener until
                    // all other eventListeners are removed
                    if (evtName && evtName !== 'removeListener') {
                        this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
                    }
                }
                // remove removeListener listener finally
                this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
            }
            else {
                if (patchOptions && patchOptions.transferEventName) {
                    eventName = patchOptions.transferEventName(eventName);
                }
                const symbolEventNames = zoneSymbolEventNames[eventName];
                if (symbolEventNames) {
                    const symbolEventName = symbolEventNames[FALSE_STR];
                    const symbolCaptureEventName = symbolEventNames[TRUE_STR];
                    const tasks = target[symbolEventName];
                    const captureTasks = target[symbolCaptureEventName];
                    if (tasks) {
                        const removeTasks = tasks.slice();
                        for (let i = 0; i < removeTasks.length; i++) {
                            const task = removeTasks[i];
                            let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                            this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                        }
                    }
                    if (captureTasks) {
                        const removeTasks = captureTasks.slice();
                        for (let i = 0; i < removeTasks.length; i++) {
                            const task = removeTasks[i];
                            let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
                            this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
                        }
                    }
                }
            }
            if (returnTarget) {
                return this;
            }
        };
        // for native toString patch
        attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
        attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
        if (nativeRemoveAllListeners) {
            attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
        }
        if (nativeListeners) {
            attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
        }
        return true;
    }
    let results = [];
    for (let i = 0; i < apis.length; i++) {
        results[i] = patchEventTargetMethods(apis[i], patchOptions);
    }
    return results;
}
function findEventTasks(target, eventName) {
    if (!eventName) {
        const foundTasks = [];
        for (let prop in target) {
            const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
            let evtName = match && match[1];
            if (evtName && (!eventName || evtName === eventName)) {
                const tasks = target[prop];
                if (tasks) {
                    for (let i = 0; i < tasks.length; i++) {
                        foundTasks.push(tasks[i]);
                    }
                }
            }
        }
        return foundTasks;
    }
    let symbolEventName = zoneSymbolEventNames[eventName];
    if (!symbolEventName) {
        prepareEventNames(eventName);
        symbolEventName = zoneSymbolEventNames[eventName];
    }
    const captureFalseTasks = target[symbolEventName[FALSE_STR]];
    const captureTrueTasks = target[symbolEventName[TRUE_STR]];
    if (!captureFalseTasks) {
        return captureTrueTasks ? captureTrueTasks.slice() : [];
    }
    else {
        return captureTrueTasks
            ? captureFalseTasks.concat(captureTrueTasks)
            : captureFalseTasks.slice();
    }
}
function patchEventPrototype(global, api) {
    const Event = global['Event'];
    if (Event && Event.prototype) {
        api.patchMethod(Event.prototype, 'stopImmediatePropagation', (delegate) => function (self, args) {
            self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
            // we need to call the native stopImmediatePropagation
            // in case in some hybrid application, some part of
            // application will be controlled by zone, some are not
            delegate && delegate.apply(self, args);
        });
    }
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
function patchQueueMicrotask(global, api) {
    api.patchMethod(global, 'queueMicrotask', (delegate) => {
        return function (self, args) {
            Zone.current.scheduleMicroTask('queueMicrotask', args[0]);
        };
    });
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
const taskSymbol = zoneSymbol('zoneTask');
function patchTimer(window, setName, cancelName, nameSuffix) {
    let setNative = null;
    let clearNative = null;
    setName += nameSuffix;
    cancelName += nameSuffix;
    const tasksByHandleId = {};
    function scheduleTask(task) {
        const data = task.data;
        data.args[0] = function () {
            return task.invoke.apply(this, arguments);
        };
        const handleOrId = setNative.apply(window, data.args);
        // Whlist on Node.js when get can the ID by using `[Symbol.toPrimitive]()` we do
        // to this so that we do not cause potentally leaks when using `setTimeout`
        // since this can be periodic when using `.refresh`.
        if (isNumber(handleOrId)) {
            data.handleId = handleOrId;
        }
        else {
            data.handle = handleOrId;
            // On Node.js a timeout and interval can be restarted over and over again by using the `.refresh` method.
            data.isRefreshable = isFunction(handleOrId.refresh);
        }
        return task;
    }
    function clearTask(task) {
        const { handle, handleId } = task.data;
        return clearNative.call(window, handle ?? handleId);
    }
    setNative = patchMethod(window, setName, (delegate) => function (self, args) {
        if (isFunction(args[0])) {
            const options = {
                isRefreshable: false,
                isPeriodic: nameSuffix === 'Interval',
                delay: nameSuffix === 'Timeout' || nameSuffix === 'Interval' ? args[1] || 0 : undefined,
                args: args,
            };
            const callback = args[0];
            args[0] = function timer() {
                try {
                    return callback.apply(this, arguments);
                }
                finally {
                    // issue-934, task will be cancelled
                    // even it is a periodic task such as
                    // setInterval
                    // https://github.com/angular/angular/issues/40387
                    // Cleanup tasksByHandleId should be handled before scheduleTask
                    // Since some zoneSpec may intercept and doesn't trigger
                    // scheduleFn(scheduleTask) provided here.
                    const { handle, handleId, isPeriodic, isRefreshable } = options;
                    if (!isPeriodic && !isRefreshable) {
                        if (handleId) {
                            // in non-nodejs env, we remove timerId
                            // from local cache
                            delete tasksByHandleId[handleId];
                        }
                        else if (handle) {
                            // Node returns complex objects as handleIds
                            // we remove task reference from timer object
                            handle[taskSymbol] = null;
                        }
                    }
                }
            };
            const task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
            if (!task) {
                return task;
            }
            // Node.js must additionally support the ref and unref functions.
            const { handleId, handle, isRefreshable, isPeriodic } = task.data;
            if (handleId) {
                // for non nodejs env, we save handleId: task
                // mapping in local cache for clearTimeout
                tasksByHandleId[handleId] = task;
            }
            else if (handle) {
                // for nodejs env, we save task
                // reference in timerId Object for clearTimeout
                handle[taskSymbol] = task;
                if (isRefreshable && !isPeriodic) {
                    const originalRefresh = handle.refresh;
                    handle.refresh = function () {
                        const { zone, state } = task;
                        if (state === 'notScheduled') {
                            task._state = 'scheduled';
                            zone._updateTaskCount(task, 1);
                        }
                        else if (state === 'running') {
                            task._state = 'scheduling';
                        }
                        return originalRefresh.call(this);
                    };
                }
            }
            return handle ?? handleId ?? task;
        }
        else {
            // cause an error by calling it directly.
            return delegate.apply(window, args);
        }
    });
    clearNative = patchMethod(window, cancelName, (delegate) => function (self, args) {
        const id = args[0];
        let task;
        if (isNumber(id)) {
            // non nodejs env.
            task = tasksByHandleId[id];
            delete tasksByHandleId[id];
        }
        else {
            // nodejs env ?? other environments.
            task = id?.[taskSymbol];
            if (task) {
                id[taskSymbol] = null;
            }
            else {
                task = id;
            }
        }
        if (task?.type) {
            if (task.cancelFn) {
                // Do not cancel already canceled functions
                task.zone.cancelTask(task);
            }
        }
        else {
            // cause an error by calling it directly.
            delegate.apply(window, args);
        }
    });
}

function patchCustomElements(_global, api) {
    const { isBrowser, isMix } = api.getGlobalObjects();
    if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) {
        return;
    }
    // https://html.spec.whatwg.org/multipage/custom-elements.html#concept-custom-element-definition-lifecycle-callbacks
    const callbacks = [
        'connectedCallback',
        'disconnectedCallback',
        'adoptedCallback',
        'attributeChangedCallback',
        'formAssociatedCallback',
        'formDisabledCallback',
        'formResetCallback',
        'formStateRestoreCallback',
    ];
    api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
}

function eventTargetPatch(_global, api) {
    if (Zone[api.symbol('patchEventTarget')]) {
        // EventTarget is already patched.
        return;
    }
    const { eventNames, zoneSymbolEventNames, TRUE_STR, FALSE_STR, ZONE_SYMBOL_PREFIX } = api.getGlobalObjects();
    //  predefine all __zone_symbol__ + eventName + true/false string
    for (let i = 0; i < eventNames.length; i++) {
        const eventName = eventNames[i];
        const falseEventName = eventName + FALSE_STR;
        const trueEventName = eventName + TRUE_STR;
        const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
        const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
        zoneSymbolEventNames[eventName] = {};
        zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
        zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
    }
    const EVENT_TARGET = _global['EventTarget'];
    if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
        return;
    }
    api.patchEventTarget(_global, api, [EVENT_TARGET && EVENT_TARGET.prototype]);
    return true;
}
function patchEvent(global, api) {
    api.patchEventPrototype(global, api);
}

/**
 * @fileoverview
 * @suppress {globalThis}
 */
function filterProperties(target, onProperties, ignoreProperties) {
    if (!ignoreProperties || ignoreProperties.length === 0) {
        return onProperties;
    }
    const tip = ignoreProperties.filter((ip) => ip.target === target);
    if (tip.length === 0) {
        return onProperties;
    }
    const targetIgnoreProperties = tip[0].ignoreProperties;
    return onProperties.filter((op) => targetIgnoreProperties.indexOf(op) === -1);
}
function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
    // check whether target is available, sometimes target will be undefined
    // because different browser or some 3rd party plugin.
    if (!target) {
        return;
    }
    const filteredProperties = filterProperties(target, onProperties, ignoreProperties);
    patchOnProperties(target, filteredProperties, prototype);
}
/**
 * Get all event name properties which the event name startsWith `on`
 * from the target object itself, inherited properties are not considered.
 */
function getOnEventNames(target) {
    return Object.getOwnPropertyNames(target)
        .filter((name) => name.startsWith('on') && name.length > 2)
        .map((name) => name.substring(2));
}
function propertyDescriptorPatch(api, _global) {
    if (isNode && !isMix) {
        return;
    }
    if (Zone[api.symbol('patchEvents')]) {
        // events are already been patched by legacy patch.
        return;
    }
    const ignoreProperties = _global['__Zone_ignore_on_properties'];
    // for browsers that we can patch the descriptor:  Chrome & Firefox
    let patchTargets = [];
    if (isBrowser) {
        const internalWindow = window;
        patchTargets = patchTargets.concat([
            'Document',
            'SVGElement',
            'Element',
            'HTMLElement',
            'HTMLBodyElement',
            'HTMLMediaElement',
            'HTMLFrameSetElement',
            'HTMLFrameElement',
            'HTMLIFrameElement',
            'HTMLMarqueeElement',
            'Worker',
        ]);
        const ignoreErrorProperties = [];
        // In older browsers like IE or Edge, event handler properties (e.g., `onclick`)
        // may not be defined directly on the `window` object but on its prototype (`WindowPrototype`).
        // To ensure complete coverage, we use the prototype when checking
        // for and patching these properties.
        patchFilteredProperties(internalWindow, getOnEventNames(internalWindow), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
    }
    patchTargets = patchTargets.concat([
        'XMLHttpRequest',
        'XMLHttpRequestEventTarget',
        'IDBIndex',
        'IDBRequest',
        'IDBOpenDBRequest',
        'IDBDatabase',
        'IDBTransaction',
        'IDBCursor',
        'WebSocket',
    ]);
    for (let i = 0; i < patchTargets.length; i++) {
        const target = _global[patchTargets[i]];
        target?.prototype &&
            patchFilteredProperties(target.prototype, getOnEventNames(target.prototype), ignoreProperties);
    }
}

/**
 * @fileoverview
 * @suppress {missingRequire}
 */
function patchBrowser(Zone) {
    Zone.__load_patch('legacy', (global) => {
        const legacyPatch = global[Zone.__symbol__('legacyPatch')];
        if (legacyPatch) {
            legacyPatch();
        }
    });
    Zone.__load_patch('timers', (global) => {
        const set = 'set';
        const clear = 'clear';
        patchTimer(global, set, clear, 'Timeout');
        patchTimer(global, set, clear, 'Interval');
        patchTimer(global, set, clear, 'Immediate');
    });
    Zone.__load_patch('requestAnimationFrame', (global) => {
        patchTimer(global, 'request', 'cancel', 'AnimationFrame');
        patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
        patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
    });
    Zone.__load_patch('blocking', (global, Zone) => {
        const blockingMethods = ['alert', 'prompt', 'confirm'];
        for (let i = 0; i < blockingMethods.length; i++) {
            const name = blockingMethods[i];
            patchMethod(global, name, (delegate, symbol, name) => {
                return function (s, args) {
                    return Zone.current.run(delegate, global, args, name);
                };
            });
        }
    });
    Zone.__load_patch('EventTarget', (global, Zone, api) => {
        patchEvent(global, api);
        eventTargetPatch(global, api);
        // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
        const XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
        if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
            api.patchEventTarget(global, api, [XMLHttpRequestEventTarget.prototype]);
        }
    });
    Zone.__load_patch('MutationObserver', (global, Zone, api) => {
        patchClass('MutationObserver');
        patchClass('WebKitMutationObserver');
    });
    Zone.__load_patch('IntersectionObserver', (global, Zone, api) => {
        patchClass('IntersectionObserver');
    });
    Zone.__load_patch('FileReader', (global, Zone, api) => {
        patchClass('FileReader');
    });
    Zone.__load_patch('on_property', (global, Zone, api) => {
        propertyDescriptorPatch(api, global);
    });
    Zone.__load_patch('customElements', (global, Zone, api) => {
        patchCustomElements(global, api);
    });
    Zone.__load_patch('XHR', (global, Zone) => {
        // Treat XMLHttpRequest as a macrotask.
        patchXHR(global);
        const XHR_TASK = zoneSymbol('xhrTask');
        const XHR_SYNC = zoneSymbol('xhrSync');
        const XHR_LISTENER = zoneSymbol('xhrListener');
        const XHR_SCHEDULED = zoneSymbol('xhrScheduled');
        const XHR_URL = zoneSymbol('xhrURL');
        const XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
        function patchXHR(window) {
            const XMLHttpRequest = window['XMLHttpRequest'];
            if (!XMLHttpRequest) {
                // XMLHttpRequest is not available in service worker
                return;
            }
            const XMLHttpRequestPrototype = XMLHttpRequest.prototype;
            function findPendingTask(target) {
                return target[XHR_TASK];
            }
            let oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
            let oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
            if (!oriAddListener) {
                const XMLHttpRequestEventTarget = window['XMLHttpRequestEventTarget'];
                if (XMLHttpRequestEventTarget) {
                    const XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype;
                    oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                    oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                }
            }
            const READY_STATE_CHANGE = 'readystatechange';
            const SCHEDULED = 'scheduled';
            function scheduleTask(task) {
                const data = task.data;
                const target = data.target;
                target[XHR_SCHEDULED] = false;
                target[XHR_ERROR_BEFORE_SCHEDULED] = false;
                // remove existing event listener
                const listener = target[XHR_LISTENER];
                if (!oriAddListener) {
                    oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
                    oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
                }
                if (listener) {
                    oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
                }
                const newListener = (target[XHR_LISTENER] = () => {
                    if (target.readyState === target.DONE) {
                        // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with
                        // readyState=4 multiple times, so we need to check task state here
                        if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
                            // check whether the xhr has registered onload listener
                            // if that is the case, the task should invoke after all
                            // onload listeners finish.
                            // Also if the request failed without response (status = 0), the load event handler
                            // will not be triggered, in that case, we should also invoke the placeholder callback
                            // to close the XMLHttpRequest::send macroTask.
                            // https://github.com/angular/angular/issues/38795
                            const loadTasks = target[Zone.__symbol__('loadfalse')];
                            if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
                                const oriInvoke = task.invoke;
                                task.invoke = function () {
                                    // need to load the tasks again, because in other
                                    // load listener, they may remove themselves
                                    const loadTasks = target[Zone.__symbol__('loadfalse')];
                                    for (let i = 0; i < loadTasks.length; i++) {
                                        if (loadTasks[i] === task) {
                                            loadTasks.splice(i, 1);
                                        }
                                    }
                                    if (!data.aborted && task.state === SCHEDULED) {
                                        oriInvoke.call(task);
                                    }
                                };
                                loadTasks.push(task);
                            }
                            else {
                                task.invoke();
                            }
                        }
                        else if (!data.aborted && target[XHR_SCHEDULED] === false) {
                            // error occurs when xhr.send()
                            target[XHR_ERROR_BEFORE_SCHEDULED] = true;
                        }
                    }
                });
                oriAddListener.call(target, READY_STATE_CHANGE, newListener);
                const storedTask = target[XHR_TASK];
                if (!storedTask) {
                    target[XHR_TASK] = task;
                }
                sendNative.apply(target, data.args);
                target[XHR_SCHEDULED] = true;
                return task;
            }
            function placeholderCallback() { }
            function clearTask(task) {
                const data = task.data;
                // Note - ideally, we would call data.target.removeEventListener here, but it's too late
                // to prevent it from firing. So instead, we store info for the event listener.
                data.aborted = true;
                return abortNative.apply(data.target, data.args);
            }
            const openNative = patchMethod(XMLHttpRequestPrototype, 'open', () => function (self, args) {
                self[XHR_SYNC] = args[2] == false;
                self[XHR_URL] = args[1];
                return openNative.apply(self, args);
            });
            const XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
            const fetchTaskAborting = zoneSymbol('fetchTaskAborting');
            const fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
            const sendNative = patchMethod(XMLHttpRequestPrototype, 'send', () => function (self, args) {
                if (Zone.current[fetchTaskScheduling] === true) {
                    // a fetch is scheduling, so we are using xhr to polyfill fetch
                    // and because we already schedule macroTask for fetch, we should
                    // not schedule a macroTask for xhr again
                    return sendNative.apply(self, args);
                }
                if (self[XHR_SYNC]) {
                    // if the XHR is sync there is no task to schedule, just execute the code.
                    return sendNative.apply(self, args);
                }
                else {
                    const options = {
                        target: self,
                        url: self[XHR_URL],
                        isPeriodic: false,
                        args: args,
                        aborted: false,
                    };
                    const task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
                    if (self &&
                        self[XHR_ERROR_BEFORE_SCHEDULED] === true &&
                        !options.aborted &&
                        task.state === SCHEDULED) {
                        // xhr request throw error when send
                        // we should invoke task instead of leaving a scheduled
                        // pending macroTask
                        task.invoke();
                    }
                }
            });
            const abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', () => function (self, args) {
                const task = findPendingTask(self);
                if (task && typeof task.type == 'string') {
                    // If the XHR has already completed, do nothing.
                    // If the XHR has already been aborted, do nothing.
                    // Fix #569, call abort multiple times before done will cause
                    // macroTask task count be negative number
                    if (task.cancelFn == null || (task.data && task.data.aborted)) {
                        return;
                    }
                    task.zone.cancelTask(task);
                }
                else if (Zone.current[fetchTaskAborting] === true) {
                    // the abort is called from fetch polyfill, we need to call native abort of XHR.
                    return abortNative.apply(self, args);
                }
                // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no
                // task
                // to cancel. Do nothing.
            });
        }
    });
    Zone.__load_patch('geolocation', (global) => {
        /// GEO_LOCATION
        if (global['navigator'] && global['navigator'].geolocation) {
            patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
        }
    });
    Zone.__load_patch('PromiseRejectionEvent', (global, Zone) => {
        // handle unhandled promise rejection
        function findPromiseRejectionHandler(evtName) {
            return function (e) {
                const eventTasks = findEventTasks(global, evtName);
                eventTasks.forEach((eventTask) => {
                    // windows has added unhandledrejection event listener
                    // trigger the event listener
                    const PromiseRejectionEvent = global['PromiseRejectionEvent'];
                    if (PromiseRejectionEvent) {
                        const evt = new PromiseRejectionEvent(evtName, {
                            promise: e.promise,
                            reason: e.rejection,
                        });
                        eventTask.invoke(evt);
                    }
                });
            };
        }
        if (global['PromiseRejectionEvent']) {
            Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =
                findPromiseRejectionHandler('unhandledrejection');
            Zone[zoneSymbol('rejectionHandledHandler')] =
                findPromiseRejectionHandler('rejectionhandled');
        }
    });
    Zone.__load_patch('queueMicrotask', (global, Zone, api) => {
        patchQueueMicrotask(global, api);
    });
}

function patchPromise(Zone) {
    Zone.__load_patch('ZoneAwarePromise', (global, Zone, api) => {
        const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
        const ObjectDefineProperty = Object.defineProperty;
        function readableObjectToString(obj) {
            if (obj && obj.toString === Object.prototype.toString) {
                const className = obj.constructor && obj.constructor.name;
                return (className ? className : '') + ': ' + JSON.stringify(obj);
            }
            return obj ? obj.toString() : Object.prototype.toString.call(obj);
        }
        const __symbol__ = api.symbol;
        const _uncaughtPromiseErrors = [];
        const isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] !== false;
        const symbolPromise = __symbol__('Promise');
        const symbolThen = __symbol__('then');
        const creationTrace = '__creationTrace__';
        api.onUnhandledError = (e) => {
            if (api.showUncaughtError()) {
                const rejection = e && e.rejection;
                if (rejection) {
                    console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
                }
                else {
                    console.error(e);
                }
            }
        };
        api.microtaskDrainDone = () => {
            while (_uncaughtPromiseErrors.length) {
                const uncaughtPromiseError = _uncaughtPromiseErrors.shift();
                try {
                    uncaughtPromiseError.zone.runGuarded(() => {
                        if (uncaughtPromiseError.throwOriginal) {
                            throw uncaughtPromiseError.rejection;
                        }
                        throw uncaughtPromiseError;
                    });
                }
                catch (error) {
                    handleUnhandledRejection(error);
                }
            }
        };
        const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
        function handleUnhandledRejection(e) {
            api.onUnhandledError(e);
            try {
                const handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
                if (typeof handler === 'function') {
                    handler.call(this, e);
                }
            }
            catch (err) { }
        }
        function isThenable(value) {
            return value && typeof value.then === 'function';
        }
        function forwardResolution(value) {
            return value;
        }
        function forwardRejection(rejection) {
            return ZoneAwarePromise.reject(rejection);
        }
        const symbolState = __symbol__('state');
        const symbolValue = __symbol__('value');
        const symbolFinally = __symbol__('finally');
        const symbolParentPromiseValue = __symbol__('parentPromiseValue');
        const symbolParentPromiseState = __symbol__('parentPromiseState');
        const source = 'Promise.then';
        const UNRESOLVED = null;
        const RESOLVED = true;
        const REJECTED = false;
        const REJECTED_NO_CATCH = 0;
        function makeResolver(promise, state) {
            return (v) => {
                try {
                    resolvePromise(promise, state, v);
                }
                catch (err) {
                    resolvePromise(promise, false, err);
                }
                // Do not return value or you will break the Promise spec.
            };
        }
        const once = function () {
            let wasCalled = false;
            return function wrapper(wrappedFunction) {
                return function () {
                    if (wasCalled) {
                        return;
                    }
                    wasCalled = true;
                    wrappedFunction.apply(null, arguments);
                };
            };
        };
        const TYPE_ERROR = 'Promise resolved with itself';
        const CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
        // Promise Resolution
        function resolvePromise(promise, state, value) {
            const onceWrapper = once();
            if (promise === value) {
                throw new TypeError(TYPE_ERROR);
            }
            if (promise[symbolState] === UNRESOLVED) {
                // should only get value.then once based on promise spec.
                let then = null;
                try {
                    if (typeof value === 'object' || typeof value === 'function') {
                        then = value && value.then;
                    }
                }
                catch (err) {
                    onceWrapper(() => {
                        resolvePromise(promise, false, err);
                    })();
                    return promise;
                }
                // if (value instanceof ZoneAwarePromise) {
                if (state !== REJECTED &&
                    value instanceof ZoneAwarePromise &&
                    value.hasOwnProperty(symbolState) &&
                    value.hasOwnProperty(symbolValue) &&
                    value[symbolState] !== UNRESOLVED) {
                    clearRejectedNoCatch(value);
                    resolvePromise(promise, value[symbolState], value[symbolValue]);
                }
                else if (state !== REJECTED && typeof then === 'function') {
                    try {
                        then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
                    }
                    catch (err) {
                        onceWrapper(() => {
                            resolvePromise(promise, false, err);
                        })();
                    }
                }
                else {
                    promise[symbolState] = state;
                    const queue = promise[symbolValue];
                    promise[symbolValue] = value;
                    if (promise[symbolFinally] === symbolFinally) {
                        // the promise is generated by Promise.prototype.finally
                        if (state === RESOLVED) {
                            // the state is resolved, should ignore the value
                            // and use parent promise value
                            promise[symbolState] = promise[symbolParentPromiseState];
                            promise[symbolValue] = promise[symbolParentPromiseValue];
                        }
                    }
                    // record task information in value when error occurs, so we can
                    // do some additional work such as render longStackTrace
                    if (state === REJECTED && value instanceof Error) {
                        // check if longStackTraceZone is here
                        const trace = Zone.currentTask &&
                            Zone.currentTask.data &&
                            Zone.currentTask.data[creationTrace];
                        if (trace) {
                            // only keep the long stack trace into error when in longStackTraceZone
                            ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, {
                                configurable: true,
                                enumerable: false,
                                writable: true,
                                value: trace,
                            });
                        }
                    }
                    for (let i = 0; i < queue.length;) {
                        scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
                    }
                    if (queue.length == 0 && state == REJECTED) {
                        promise[symbolState] = REJECTED_NO_CATCH;
                        let uncaughtPromiseError = value;
                        try {
                            // Here we throws a new Error to print more readable error log
                            // and if the value is not an error, zone.js builds an `Error`
                            // Object here to attach the stack information.
                            throw new Error('Uncaught (in promise): ' +
                                readableObjectToString(value) +
                                (value && value.stack ? '\n' + value.stack : ''));
                        }
                        catch (err) {
                            uncaughtPromiseError = err;
                        }
                        if (isDisableWrappingUncaughtPromiseRejection) {
                            // If disable wrapping uncaught promise reject
                            // use the value instead of wrapping it.
                            uncaughtPromiseError.throwOriginal = true;
                        }
                        uncaughtPromiseError.rejection = value;
                        uncaughtPromiseError.promise = promise;
                        uncaughtPromiseError.zone = Zone.current;
                        uncaughtPromiseError.task = Zone.currentTask;
                        _uncaughtPromiseErrors.push(uncaughtPromiseError);
                        api.scheduleMicroTask(); // to make sure that it is running
                    }
                }
            }
            // Resolving an already resolved promise is a noop.
            return promise;
        }
        const REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
        function clearRejectedNoCatch(promise) {
            if (promise[symbolState] === REJECTED_NO_CATCH) {
                // if the promise is rejected no catch status
                // and queue.length > 0, means there is a error handler
                // here to handle the rejected promise, we should trigger
                // windows.rejectionhandled eventHandler or nodejs rejectionHandled
                // eventHandler
                try {
                    const handler = Zone[REJECTION_HANDLED_HANDLER];
                    if (handler && typeof handler === 'function') {
                        handler.call(this, { rejection: promise[symbolValue], promise: promise });
                    }
                }
                catch (err) { }
                promise[symbolState] = REJECTED;
                for (let i = 0; i < _uncaughtPromiseErrors.length; i++) {
                    if (promise === _uncaughtPromiseErrors[i].promise) {
                        _uncaughtPromiseErrors.splice(i, 1);
                    }
                }
            }
        }
        function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
            clearRejectedNoCatch(promise);
            const promiseState = promise[symbolState];
            const delegate = promiseState
                ? typeof onFulfilled === 'function'
                    ? onFulfilled
                    : forwardResolution
                : typeof onRejected === 'function'
                    ? onRejected
                    : forwardRejection;
            zone.scheduleMicroTask(source, () => {
                try {
                    const parentPromiseValue = promise[symbolValue];
                    const isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
                    if (isFinallyPromise) {
                        // if the promise is generated from finally call, keep parent promise's state and value
                        chainPromise[symbolParentPromiseValue] = parentPromiseValue;
                        chainPromise[symbolParentPromiseState] = promiseState;
                    }
                    // should not pass value to finally callback
                    const value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution
                        ? []
                        : [parentPromiseValue]);
                    resolvePromise(chainPromise, true, value);
                }
                catch (error) {
                    // if error occurs, should always return this error
                    resolvePromise(chainPromise, false, error);
                }
            }, chainPromise);
        }
        const ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
        const noop = function () { };
        const AggregateError = global.AggregateError;
        class ZoneAwarePromise {
            static toString() {
                return ZONE_AWARE_PROMISE_TO_STRING;
            }
            static resolve(value) {
                if (value instanceof ZoneAwarePromise) {
                    return value;
                }
                return resolvePromise(new this(null), RESOLVED, value);
            }
            static reject(error) {
                return resolvePromise(new this(null), REJECTED, error);
            }
            static withResolvers() {
                const result = {};
                result.promise = new ZoneAwarePromise((res, rej) => {
                    result.resolve = res;
                    result.reject = rej;
                });
                return result;
            }
            static any(values) {
                if (!values || typeof values[Symbol.iterator] !== 'function') {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                const promises = [];
                let count = 0;
                try {
                    for (let v of values) {
                        count++;
                        promises.push(ZoneAwarePromise.resolve(v));
                    }
                }
                catch (err) {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                if (count === 0) {
                    return Promise.reject(new AggregateError([], 'All promises were rejected'));
                }
                let finished = false;
                const errors = [];
                return new ZoneAwarePromise((resolve, reject) => {
                    for (let i = 0; i < promises.length; i++) {
                        promises[i].then((v) => {
                            if (finished) {
                                return;
                            }
                            finished = true;
                            resolve(v);
                        }, (err) => {
                            errors.push(err);
                            count--;
                            if (count === 0) {
                                finished = true;
                                reject(new AggregateError(errors, 'All promises were rejected'));
                            }
                        });
                    }
                });
            }
            static race(values) {
                let resolve;
                let reject;
                let promise = new this((res, rej) => {
                    resolve = res;
                    reject = rej;
                });
                function onResolve(value) {
                    resolve(value);
                }
                function onReject(error) {
                    reject(error);
                }
                for (let value of values) {
                    if (!isThenable(value)) {
                        value = this.resolve(value);
                    }
                    value.then(onResolve, onReject);
                }
                return promise;
            }
            static all(values) {
                return ZoneAwarePromise.allWithCallback(values);
            }
            static allSettled(values) {
                const P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
                return P.allWithCallback(values, {
                    thenCallback: (value) => ({ status: 'fulfilled', value }),
                    errorCallback: (err) => ({ status: 'rejected', reason: err }),
                });
            }
            static allWithCallback(values, callback) {
                let resolve;
                let reject;
                let promise = new this((res, rej) => {
                    resolve = res;
                    reject = rej;
                });
                // Start at 2 to prevent prematurely resolving if .then is called immediately.
                let unresolvedCount = 2;
                let valueIndex = 0;
                const resolvedValues = [];
                for (let value of values) {
                    if (!isThenable(value)) {
                        value = this.resolve(value);
                    }
                    const curValueIndex = valueIndex;
                    try {
                        value.then((value) => {
                            resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;
                            unresolvedCount--;
                            if (unresolvedCount === 0) {
                                resolve(resolvedValues);
                            }
                        }, (err) => {
                            if (!callback) {
                                reject(err);
                            }
                            else {
                                resolvedValues[curValueIndex] = callback.errorCallback(err);
                                unresolvedCount--;
                                if (unresolvedCount === 0) {
                                    resolve(resolvedValues);
                                }
                            }
                        });
                    }
                    catch (thenErr) {
                        reject(thenErr);
                    }
                    unresolvedCount++;
                    valueIndex++;
                }
                // Make the unresolvedCount zero-based again.
                unresolvedCount -= 2;
                if (unresolvedCount === 0) {
                    resolve(resolvedValues);
                }
                return promise;
            }
            constructor(executor) {
                const promise = this;
                if (!(promise instanceof ZoneAwarePromise)) {
                    throw new Error('Must be an instanceof Promise.');
                }
                promise[symbolState] = UNRESOLVED;
                promise[symbolValue] = []; // queue;
                try {
                    const onceWrapper = once();
                    executor &&
                        executor(onceWrapper(makeResolver(promise, RESOLVED)), onceWrapper(makeResolver(promise, REJECTED)));
                }
                catch (error) {
                    resolvePromise(promise, false, error);
                }
            }
            get [Symbol.toStringTag]() {
                return 'Promise';
            }
            get [Symbol.species]() {
                return ZoneAwarePromise;
            }
            then(onFulfilled, onRejected) {
                // We must read `Symbol.species` safely because `this` may be anything. For instance, `this`
                // may be an object without a prototype (created through `Object.create(null)`); thus
                // `this.constructor` will be undefined. One of the use cases is SystemJS creating
                // prototype-less objects (modules) via `Object.create(null)`. The SystemJS creates an empty
                // object and copies promise properties into that object (within the `getOrCreateLoad`
                // function). The zone.js then checks if the resolved value has the `then` method and
                // invokes it with the `value` context. Otherwise, this will throw an error: `TypeError:
                // Cannot read properties of undefined (reading 'Symbol(Symbol.species)')`.
                let C = this.constructor?.[Symbol.species];
                if (!C || typeof C !== 'function') {
                    C = this.constructor || ZoneAwarePromise;
                }
                const chainPromise = new C(noop);
                const zone = Zone.current;
                if (this[symbolState] == UNRESOLVED) {
                    this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
                }
                else {
                    scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
                }
                return chainPromise;
            }
            catch(onRejected) {
                return this.then(null, onRejected);
            }
            finally(onFinally) {
                // See comment on the call to `then` about why thee `Symbol.species` is safely accessed.
                let C = this.constructor?.[Symbol.species];
                if (!C || typeof C !== 'function') {
                    C = ZoneAwarePromise;
                }
                const chainPromise = new C(noop);
                chainPromise[symbolFinally] = symbolFinally;
                const zone = Zone.current;
                if (this[symbolState] == UNRESOLVED) {
                    this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
                }
                else {
                    scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
                }
                return chainPromise;
            }
        }
        // Protect against aggressive optimizers dropping seemingly unused properties.
        // E.g. Closure Compiler in advanced mode.
        ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
        ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
        ZoneAwarePromise['race'] = ZoneAwarePromise.race;
        ZoneAwarePromise['all'] = ZoneAwarePromise.all;
        const NativePromise = (global[symbolPromise] = global['Promise']);
        global['Promise'] = ZoneAwarePromise;
        const symbolThenPatched = __symbol__('thenPatched');
        function patchThen(Ctor) {
            const proto = Ctor.prototype;
            const prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
            if (prop && (prop.writable === false || !prop.configurable)) {
                // check Ctor.prototype.then propertyDescriptor is writable or not
                // in meteor env, writable is false, we should ignore such case
                return;
            }
            const originalThen = proto.then;
            // Keep a reference to the original method.
            proto[symbolThen] = originalThen;
            Ctor.prototype.then = function (onResolve, onReject) {
                const wrapped = new ZoneAwarePromise((resolve, reject) => {
                    originalThen.call(this, resolve, reject);
                });
                return wrapped.then(onResolve, onReject);
            };
            Ctor[symbolThenPatched] = true;
        }
        api.patchThen = patchThen;
        function zoneify(fn) {
            return function (self, args) {
                let resultPromise = fn.apply(self, args);
                if (resultPromise instanceof ZoneAwarePromise) {
                    return resultPromise;
                }
                let ctor = resultPromise.constructor;
                if (!ctor[symbolThenPatched]) {
                    patchThen(ctor);
                }
                return resultPromise;
            };
        }
        if (NativePromise) {
            patchThen(NativePromise);
            patchMethod(global, 'fetch', (delegate) => zoneify(delegate));
        }
        // This is not part of public API, but it is useful for tests, so we expose it.
        Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
        return ZoneAwarePromise;
    });
}

function patchToString(Zone) {
    // override Function.prototype.toString to make zone.js patched function
    // look like native function
    Zone.__load_patch('toString', (global) => {
        // patch Func.prototype.toString to let them look like native
        const originalFunctionToString = Function.prototype.toString;
        const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
        const PROMISE_SYMBOL = zoneSymbol('Promise');
        const ERROR_SYMBOL = zoneSymbol('Error');
        const newFunctionToString = function toString() {
            if (typeof this === 'function') {
                const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
                if (originalDelegate) {
                    if (typeof originalDelegate === 'function') {
                        return originalFunctionToString.call(originalDelegate);
                    }
                    else {
                        return Object.prototype.toString.call(originalDelegate);
                    }
                }
                if (this === Promise) {
                    const nativePromise = global[PROMISE_SYMBOL];
                    if (nativePromise) {
                        return originalFunctionToString.call(nativePromise);
                    }
                }
                if (this === Error) {
                    const nativeError = global[ERROR_SYMBOL];
                    if (nativeError) {
                        return originalFunctionToString.call(nativeError);
                    }
                }
            }
            return originalFunctionToString.call(this);
        };
        newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
        Function.prototype.toString = newFunctionToString;
        // patch Object.prototype.toString to let them look like native
        const originalObjectToString = Object.prototype.toString;
        const PROMISE_OBJECT_TO_STRING = '[object Promise]';
        Object.prototype.toString = function () {
            if (typeof Promise === 'function' && this instanceof Promise) {
                return PROMISE_OBJECT_TO_STRING;
            }
            return originalObjectToString.call(this);
        };
    });
}

function patchCallbacks(api, target, targetName, method, callbacks) {
    const symbol = Zone.__symbol__(method);
    if (target[symbol]) {
        return;
    }
    const nativeDelegate = (target[symbol] = target[method]);
    target[method] = function (name, opts, options) {
        if (opts && opts.prototype) {
            callbacks.forEach(function (callback) {
                const source = `${targetName}.${method}::` + callback;
                const prototype = opts.prototype;
                // Note: the `patchCallbacks` is used for patching the `document.registerElement` and
                // `customElements.define`. We explicitly wrap the patching code into try-catch since
                // callbacks may be already patched by other web components frameworks (e.g. LWC), and they
                // make those properties non-writable. This means that patching callback will throw an erFror
                // `cannot assign to read-only property`. See this code as an example:
                // https://github.com/salesforce/lwc/blob/master/packages/@lwc/engine-core/src/framework/base-bridge-element.ts#L180-L186
                // We don't want to stop the application rendering if we couldn't patch some
                // callback, e.g. `attributeChangedCallback`.
                try {
                    if (prototype.hasOwnProperty(callback)) {
                        const descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
                        if (descriptor && descriptor.value) {
                            descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
                            api._redefineProperty(opts.prototype, callback, descriptor);
                        }
                        else if (prototype[callback]) {
                            prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
                        }
                    }
                    else if (prototype[callback]) {
                        prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
                    }
                }
                catch {
                    // Note: we leave the catch block empty since there's no way to handle the error related
                    // to non-writable property.
                }
            });
        }
        return nativeDelegate.call(target, name, opts, options);
    };
    api.attachOriginToPatched(target[method], nativeDelegate);
}

function patchUtil(Zone) {
    Zone.__load_patch('util', (global, Zone, api) => {
        // Collect native event names by looking at properties
        // on the global namespace, e.g. 'onclick'.
        const eventNames = getOnEventNames(global);
        api.patchOnProperties = patchOnProperties;
        api.patchMethod = patchMethod;
        api.bindArguments = bindArguments;
        api.patchMacroTask = patchMacroTask;
        // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS`
        // to define which events will not be patched by `Zone.js`. In newer version (>=0.9.0), we
        // change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep the name consistent with
        // angular repo. The  `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be
        // supported for backwards compatibility.
        const SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
        const SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
        if (global[SYMBOL_UNPATCHED_EVENTS]) {
            global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
        }
        if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
            Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
                global[SYMBOL_BLACK_LISTED_EVENTS];
        }
        api.patchEventPrototype = patchEventPrototype;
        api.patchEventTarget = patchEventTarget;
        api.isIEOrEdge = isIEOrEdge;
        api.ObjectDefineProperty = ObjectDefineProperty;
        api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
        api.ObjectCreate = ObjectCreate;
        api.ArraySlice = ArraySlice;
        api.patchClass = patchClass;
        api.wrapWithCurrentZone = wrapWithCurrentZone;
        api.filterProperties = filterProperties;
        api.attachOriginToPatched = attachOriginToPatched;
        api._redefineProperty = Object.defineProperty;
        api.patchCallbacks = patchCallbacks;
        api.getGlobalObjects = () => ({
            globalSources,
            zoneSymbolEventNames,
            eventNames,
            isBrowser,
            isMix,
            isNode,
            TRUE_STR,
            FALSE_STR,
            ZONE_SYMBOL_PREFIX,
            ADD_EVENT_LISTENER_STR,
            REMOVE_EVENT_LISTENER_STR,
        });
    });
}

function patchCommon(Zone) {
    patchPromise(Zone);
    patchToString(Zone);
    patchUtil(Zone);
}

const Zone$1 = loadZone();
patchCommon(Zone$1);
patchBrowser(Zone$1);
O9xBg"use strict";
/**
 * @license Angular v<unknown>
 * (c) 2010-2025 Google LLC. https://angular.io/
 * License: MIT
 */const global=globalThis;function __symbol__(e){return(global.__Zone_symbol_prefix||"__zone_symbol__")+e}function initZone(){const e=global.performance;function t(t){e&&e.mark&&e.mark(t)}function n(t,n){e&&e.measure&&e.measure(t,n)}t("Zone");class o{static __symbol__=__symbol__;static assertZonePatched(){if(global.Promise!==w.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let e=o.current;for(;e.parent;)e=e.parent;return e}static get current(){return Z.zone}static get currentTask(){return D}static __load_patch(e,r,s=!1){if(w.hasOwnProperty(e)){const t=!0===global[__symbol__("forceDuplicateZoneCheck")];if(!s&&t)throw Error("Already loaded patch: "+e)}else if(!global["__Zone_disable_"+e]){const s="Zone:"+e;t(s),w[e]=r(global,o,P),n(s,s)}}get parent(){return this._parent}get name(){return this._name}_parent;_name;_properties;_zoneDelegate;constructor(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new s(this,this._parent&&this._parent._zoneDelegate,t)}get(e){const t=this.getZoneWith(e);if(t)return t._properties[e]}getZoneWith(e){let t=this;for(;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null}fork(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)}wrap(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);const n=this._zoneDelegate.intercept(this,e,t),o=this;return function(){return o.runGuarded(n,this,arguments,t)}}run(e,t,n,o){Z={parent:Z,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,o)}finally{Z=Z.parent}}runGuarded(e,t=null,n,o){Z={parent:Z,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,o)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{Z=Z.parent}}runTask(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||g).name+"; Execution: "+this.name+")");const o=e,{type:r,data:{isPeriodic:s=!1,isRefreshable:a=!1}={}}=e;if(e.state===k&&(r===O||r===S))return;const i=e.state!=m;i&&o._transitionTo(m,E);const c=D;D=o,Z={parent:Z,zone:this};try{r!=S||!e.data||s||a||(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,o,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{const t=e.state;if(t!==k&&t!==b)if(r==O||s||a&&t===y)i&&o._transitionTo(E,m,y);else{const e=o._zoneDelegates;this._updateTaskCount(o,-1),i&&o._transitionTo(k,m,k),a&&(o._zoneDelegates=e)}Z=Z.parent,D=c}}scheduleTask(e){if(e.zone&&e.zone!==this){let t=this;for(;t;){if(t===e.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${e.zone.name}`);t=t.parent}}e._transitionTo(y,k);const t=[];e._zoneDelegates=t,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(b,y,k),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===t&&this._updateTaskCount(e,1),e.state==y&&e._transitionTo(E,y),e}scheduleMicroTask(e,t,n,o){return this.scheduleTask(new a(v,e,t,n,o,void 0))}scheduleMacroTask(e,t,n,o,r){return this.scheduleTask(new a(S,e,t,n,o,r))}scheduleEventTask(e,t,n,o,r){return this.scheduleTask(new a(O,e,t,n,o,r))}cancelTask(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||g).name+"; Execution: "+this.name+")");if(e.state===E||e.state===m){e._transitionTo(T,E,m);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(b,T),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(k,T),e.runCount=-1,e}}_updateTaskCount(e,t){const n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(let o=0;o<n.length;o++)n[o]._updateTaskCount(e.type,t)}}const r={name:"",onHasTask:(e,t,n,o)=>e.hasTask(n,o),onScheduleTask:(e,t,n,o)=>e.scheduleTask(n,o),onInvokeTask:(e,t,n,o,r,s)=>e.invokeTask(n,o,r,s),onCancelTask:(e,t,n,o)=>e.cancelTask(n,o)};class s{get zone(){return this._zone}_zone;_taskCounts={microTask:0,macroTask:0,eventTask:0};_parentDelegate;_forkDlgt;_forkZS;_forkCurrZone;_interceptDlgt;_interceptZS;_interceptCurrZone;_invokeDlgt;_invokeZS;_invokeCurrZone;_handleErrorDlgt;_handleErrorZS;_handleErrorCurrZone;_scheduleTaskDlgt;_scheduleTaskZS;_scheduleTaskCurrZone;_invokeTaskDlgt;_invokeTaskZS;_invokeTaskCurrZone;_cancelTaskDlgt;_cancelTaskZS;_cancelTaskCurrZone;_hasTaskDlgt;_hasTaskDlgtOwner;_hasTaskZS;_hasTaskCurrZone;constructor(e,t,n){this._zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this._zone:t._forkCurrZone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this._zone:t._interceptCurrZone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this._zone:t._invokeCurrZone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this._zone:t._handleErrorCurrZone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this._zone:t._scheduleTaskCurrZone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this._zone:t._invokeTaskCurrZone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this._zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const o=n&&n.onHasTask;(o||t&&t._hasTaskZS)&&(this._hasTaskZS=o?n:r,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,n.onScheduleTask||(this._scheduleTaskZS=r,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this._zone),n.onInvokeTask||(this._invokeTaskZS=r,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this._zone),n.onCancelTask||(this._cancelTaskZS=r,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this._zone))}fork(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new o(e,t)}intercept(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t}invoke(e,t,n,o,r){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,o,r):t.apply(n,o)}handleError(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)}scheduleTask(e,t){let n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t),n||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=v)throw new Error("Task is missing scheduleFn.");_(t)}return n}invokeTask(e,t,n,o){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,o):t.callback.apply(n,o)}cancelTask(e,t){let n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n}hasTask(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}}_updateTaskCount(e,t){const n=this._taskCounts,o=n[e],r=n[e]=o+t;if(r<0)throw new Error("More tasks executed then were scheduled.");0!=o&&0!=r||this.hasTask(this._zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})}}class a{type;source;invoke;callback;data;scheduleFn;cancelFn;_zone=null;runCount=0;_zoneDelegates=null;_state="notScheduled";constructor(e,t,n,o,r,s){if(this.type=e,this.source=t,this.data=o,this.scheduleFn=r,this.cancelFn=s,!n)throw new Error("callback is not defined");this.callback=n;const i=this;this.invoke=e===O&&o&&o.useG?a.invokeTask:function(){return a.invokeTask.call(global,i,this,arguments)}}static invokeTask(e,t,n){e||(e=this),z++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==z&&d(),z--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(k,y)}_transitionTo(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(`${this.type} '${this.source}': can not transition to '${e}', expecting state '${t}'${n?" or '"+n+"'":""}, was '${this._state}'.`);this._state=e,e==k&&(this._zoneDelegates=null)}toString(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const i=__symbol__("setTimeout"),c=__symbol__("Promise"),l=__symbol__("then");let h,u=[],p=!1;function f(e){if(h||global[c]&&(h=global[c].resolve(0)),h){let t=h[l];t||(t=h.then),t.call(h,e)}else global[i](e,0)}function _(e){0===z&&0===u.length&&f(d),e&&u.push(e)}function d(){if(!p){for(p=!0;u.length;){const e=u;u=[];for(let t=0;t<e.length;t++){const n=e[t];try{n.zone.runTask(n,null,null)}catch(e){P.onUnhandledError(e)}}}P.microtaskDrainDone(),p=!1}}const g={name:"NO ZONE"},k="notScheduled",y="scheduling",E="scheduled",m="running",T="canceling",b="unknown",v="microTask",S="macroTask",O="eventTask",w={},P={symbol:__symbol__,currentZoneFrame:()=>Z,onUnhandledError:N,microtaskDrainDone:N,scheduleMicroTask:_,showUncaughtError:()=>!o[__symbol__("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:N,patchMethod:()=>N,bindArguments:()=>[],patchThen:()=>N,patchMacroTask:()=>N,patchEventPrototype:()=>N,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>N,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>N,wrapWithCurrentZone:()=>N,filterProperties:()=>[],attachOriginToPatched:()=>N,_redefineProperty:()=>N,patchCallbacks:()=>N,nativeScheduleMicroTask:f};let Z={parent:null,zone:new o(null,null)},D=null,z=0;function N(){}return n("Zone","Zone"),o}function loadZone(){const e=globalThis,t=!0===e[__symbol__("forceDuplicateZoneCheck")];if(e.Zone&&(t||"function"!=typeof e.Zone.__symbol__))throw new Error("Zone already loaded.");return e.Zone??=initZone(),e.Zone}const ObjectGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,ObjectDefineProperty=Object.defineProperty,ObjectGetPrototypeOf=Object.getPrototypeOf,ObjectCreate=Object.create,ArraySlice=Array.prototype.slice,ADD_EVENT_LISTENER_STR="addEventListener",REMOVE_EVENT_LISTENER_STR="removeEventListener",ZONE_SYMBOL_ADD_EVENT_LISTENER=__symbol__("addEventListener"),ZONE_SYMBOL_REMOVE_EVENT_LISTENER=__symbol__("removeEventListener"),TRUE_STR="true",FALSE_STR="false",ZONE_SYMBOL_PREFIX=__symbol__("");function wrapWithCurrentZone(e,t){return Zone.current.wrap(e,t)}function scheduleMacroTaskWithCurrentZone(e,t,n,o,r){return Zone.current.scheduleMacroTask(e,t,n,o,r)}const zoneSymbol=__symbol__,isWindowExists="undefined"!=typeof window,internalWindow=isWindowExists?window:void 0,_global=isWindowExists&&internalWindow||globalThis,REMOVE_ATTRIBUTE="removeAttribute";function bindArguments(e,t){for(let n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=wrapWithCurrentZone(e[n],t+"_"+n));return e}function patchPrototype(e,t){const n=e.constructor.name;for(let o=0;o<t.length;o++){const r=t[o],s=e[r];if(s){if(!isPropertyWritable(ObjectGetOwnPropertyDescriptor(e,r)))continue;e[r]=(e=>{const t=function(){return e.apply(this,bindArguments(arguments,n+"."+r))};return attachOriginToPatched(t,e),t})(s)}}}function isPropertyWritable(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}const isWebWorker="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,isNode=!("nw"in _global)&&void 0!==_global.process&&"[object process]"===_global.process.toString(),isBrowser=!isNode&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),isMix=void 0!==_global.process&&"[object process]"===_global.process.toString()&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),zoneSymbolEventNames$1={},enableBeforeunloadSymbol=zoneSymbol("enable_beforeunload"),wrapFn=function(e){if(!(e=e||_global.event))return;let t=zoneSymbolEventNames$1[e.type];t||(t=zoneSymbolEventNames$1[e.type]=zoneSymbol("ON_PROPERTY"+e.type));const n=this||e.target||_global,o=n[t];let r;return isBrowser&&n===internalWindow&&"error"===e.type?(r=o&&o.call(this,e.message,e.filename,e.lineno,e.colno,e.error),!0===r&&e.preventDefault()):(r=o&&o.apply(this,arguments),"beforeunload"===e.type&&_global[enableBeforeunloadSymbol]&&"string"==typeof r?e.returnValue=r:null==r||r||e.preventDefault()),r};function patchProperty(e,t,n){let o=ObjectGetOwnPropertyDescriptor(e,t);if(!o&&n&&ObjectGetOwnPropertyDescriptor(n,t)&&(o={enumerable:!0,configurable:!0}),!o||!o.configurable)return;const r=zoneSymbol("on"+t+"patched");if(e.hasOwnProperty(r)&&e[r])return;delete o.writable,delete o.value;const s=o.get,a=o.set,i=t.slice(2);let c=zoneSymbolEventNames$1[i];c||(c=zoneSymbolEventNames$1[i]=zoneSymbol("ON_PROPERTY"+i)),o.set=function(t){let n=this;n||e!==_global||(n=_global),n&&("function"==typeof n[c]&&n.removeEventListener(i,wrapFn),a?.call(n,null),n[c]=t,"function"==typeof t&&n.addEventListener(i,wrapFn,!1))},o.get=function(){let n=this;if(n||e!==_global||(n=_global),!n)return null;const r=n[c];if(r)return r;if(s){let e=s.call(this);if(e)return o.set.call(this,e),"function"==typeof n[REMOVE_ATTRIBUTE]&&n.removeAttribute(t),e}return null},ObjectDefineProperty(e,t,o),e[r]=!0}function patchOnProperties(e,t,n){if(t)for(let o=0;o<t.length;o++)patchProperty(e,"on"+t[o],n);else{const t=[];for(const n in e)"on"==n.slice(0,2)&&t.push(n);for(let o=0;o<t.length;o++)patchProperty(e,t[o],n)}}const originalInstanceKey=zoneSymbol("originalInstance");function patchClass(e){const t=_global[e];if(!t)return;_global[zoneSymbol(e)]=t,_global[e]=function(){const n=bindArguments(arguments,e);switch(n.length){case 0:this[originalInstanceKey]=new t;break;case 1:this[originalInstanceKey]=new t(n[0]);break;case 2:this[originalInstanceKey]=new t(n[0],n[1]);break;case 3:this[originalInstanceKey]=new t(n[0],n[1],n[2]);break;case 4:this[originalInstanceKey]=new t(n[0],n[1],n[2],n[3]);break;default:throw new Error("Arg list too long.")}},attachOriginToPatched(_global[e],t);const n=new t((function(){}));let o;for(o in n)"XMLHttpRequest"===e&&"responseBlob"===o||function(t){"function"==typeof n[t]?_global[e].prototype[t]=function(){return this[originalInstanceKey][t].apply(this[originalInstanceKey],arguments)}:ObjectDefineProperty(_global[e].prototype,t,{set:function(n){"function"==typeof n?(this[originalInstanceKey][t]=wrapWithCurrentZone(n,e+"."+t),attachOriginToPatched(this[originalInstanceKey][t],n)):this[originalInstanceKey][t]=n},get:function(){return this[originalInstanceKey][t]}})}(o);for(o in t)"prototype"!==o&&t.hasOwnProperty(o)&&(_global[e][o]=t[o])}function patchMethod(e,t,n){let o=e;for(;o&&!o.hasOwnProperty(t);)o=ObjectGetPrototypeOf(o);!o&&e[t]&&(o=e);const r=zoneSymbol(t);let s=null;if(o&&(!(s=o[r])||!o.hasOwnProperty(r))&&(s=o[r]=o[t],isPropertyWritable(o&&ObjectGetOwnPropertyDescriptor(o,t)))){const e=n(s,r,t);o[t]=function(){return e(this,arguments)},attachOriginToPatched(o[t],s)}return s}function patchMacroTask(e,t,n){let o=null;function r(e){const t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}o=patchMethod(e,t,(e=>function(t,o){const s=n(t,o);return s.cbIdx>=0&&"function"==typeof o[s.cbIdx]?scheduleMacroTaskWithCurrentZone(s.name,o[s.cbIdx],s,r):e.apply(t,o)}))}function attachOriginToPatched(e,t){e[zoneSymbol("OriginalDelegate")]=t}let isDetectedIEOrEdge=!1,ieOrEdge=!1;function isIEOrEdge(){if(isDetectedIEOrEdge)return ieOrEdge;isDetectedIEOrEdge=!0;try{const e=internalWindow.navigator.userAgent;-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(ieOrEdge=!0)}catch(e){}return ieOrEdge}function isFunction(e){return"function"==typeof e}function isNumber(e){return"number"==typeof e}const OPTIMIZED_ZONE_EVENT_TASK_DATA={useG:!0},zoneSymbolEventNames={},globalSources={},EVENT_NAME_SYMBOL_REGX=new RegExp("^"+ZONE_SYMBOL_PREFIX+"(\\w+)(true|false)$"),IMMEDIATE_PROPAGATION_SYMBOL=zoneSymbol("propagationStopped");function prepareEventNames(e,t){const n=(t?t(e):e)+"false",o=(t?t(e):e)+"true",r=ZONE_SYMBOL_PREFIX+n,s=ZONE_SYMBOL_PREFIX+o;zoneSymbolEventNames[e]={},zoneSymbolEventNames[e].false=r,zoneSymbolEventNames[e].true=s}function patchEventTarget(e,t,n,o){const r=o&&o.add||"addEventListener",s=o&&o.rm||"removeEventListener",a=o&&o.listeners||"eventListeners",i=o&&o.rmAll||"removeAllListeners",c=zoneSymbol(r),l="."+r+":",h="prependListener",u="."+h+":",p=function(e,t,n){if(e.isRemoved)return;const o=e.callback;let r;"object"==typeof o&&o.handleEvent&&(e.callback=e=>o.handleEvent(e),e.originalDelegate=o);try{e.invoke(e,t,[n])}catch(e){r=e}const a=e.options;return a&&"object"==typeof a&&a.once&&t[s].call(t,n.type,e.originalDelegate?e.originalDelegate:e.callback,a),r};function f(n,o,r){if(!(o=o||e.event))return;const s=n||o.target||e,a=s[zoneSymbolEventNames[o.type][r?"true":"false"]];if(a){const e=[];if(1===a.length){const t=p(a[0],s,o);t&&e.push(t)}else{const t=a.slice();for(let n=0;n<t.length&&(!o||!0!==o[IMMEDIATE_PROPAGATION_SYMBOL]);n++){const r=p(t[n],s,o);r&&e.push(r)}}if(1===e.length)throw e[0];for(let n=0;n<e.length;n++){const o=e[n];t.nativeScheduleMicroTask((()=>{throw o}))}}}const _=function(e){return f(this,e,!1)},d=function(e){return f(this,e,!0)};function g(t,n){if(!t)return!1;let o=!0;n&&void 0!==n.useG&&(o=n.useG);const p=n&&n.vh;let f=!0;n&&void 0!==n.chkDup&&(f=n.chkDup);let g=!1;n&&void 0!==n.rt&&(g=n.rt);let k=t;for(;k&&!k.hasOwnProperty(r);)k=ObjectGetPrototypeOf(k);if(!k&&t[r]&&(k=t),!k)return!1;if(k[c])return!1;const y=n&&n.eventNameToString,E={},m=k[c]=k[r],T=k[zoneSymbol(s)]=k[s],b=k[zoneSymbol(a)]=k[a],v=k[zoneSymbol(i)]=k[i];let S;n&&n.prepend&&(S=k[zoneSymbol(n.prepend)]=k[n.prepend]);const O=o?function(e){if(!E.isExisting)return m.call(E.target,E.eventName,E.capture?d:_,E.options)}:function(e){return m.call(E.target,E.eventName,e.invoke,E.options)},w=o?function(e){if(!e.isRemoved){const t=zoneSymbolEventNames[e.eventName];let n;t&&(n=t[e.capture?"true":"false"]);const o=n&&e.target[n];if(o)for(let t=0;t<o.length;t++)if(o[t]===e){o.splice(t,1),e.isRemoved=!0,e.removeAbortListener&&(e.removeAbortListener(),e.removeAbortListener=null),0===o.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return T.call(e.target,e.eventName,e.capture?d:_,e.options)}:function(e){return T.call(e.target,e.eventName,e.invoke,e.options)},P=n?.diff||function(e,t){const n=typeof t;return"function"===n&&e.callback===t||"object"===n&&e.originalDelegate===t},Z=Zone[zoneSymbol("UNPATCHED_EVENTS")],D=e[zoneSymbol("PASSIVE_EVENTS")],z=function(t,r,s,a,i=!1,c=!1){return function(){const l=this||e;let h=arguments[0];n&&n.transferEventName&&(h=n.transferEventName(h));let u=arguments[1];if(!u)return t.apply(this,arguments);if(isNode&&"uncaughtException"===h)return t.apply(this,arguments);let _=!1;if("function"!=typeof u){if(!u.handleEvent)return t.apply(this,arguments);_=!0}if(p&&!p(t,u,l,arguments))return;const d=!!D&&-1!==D.indexOf(h),g=function m(e){if("object"==typeof e&&null!==e){const t={...e};return e.signal&&(t.signal=e.signal),t}return e}(function k(e,t){return t?"boolean"==typeof e?{capture:e,passive:!0}:e?"object"==typeof e&&!1!==e.passive?{...e,passive:!0}:e:{passive:!0}:e}(arguments[2],d)),T=g?.signal;if(T?.aborted)return;if(Z)for(let e=0;e<Z.length;e++)if(h===Z[e])return d?t.call(l,h,u,g):t.apply(this,arguments);const b=!!g&&("boolean"==typeof g||g.capture),v=!(!g||"object"!=typeof g)&&g.once,S=Zone.current;let O=zoneSymbolEventNames[h];O||(prepareEventNames(h,y),O=zoneSymbolEventNames[h]);const w=O[b?"true":"false"];let z,N=l[w],C=!1;if(N){if(C=!0,f)for(let e=0;e<N.length;e++)if(P(N[e],u))return}else N=l[w]=[];const M=l.constructor.name,I=globalSources[M];I&&(z=I[h]),z||(z=M+r+(y?y(h):h)),E.options=g,v&&(E.options.once=!1),E.target=l,E.capture=b,E.eventName=h,E.isExisting=C;const R=o?OPTIMIZED_ZONE_EVENT_TASK_DATA:void 0;R&&(R.taskData=E),T&&(E.options.signal=void 0);const j=S.scheduleEventTask(z,u,R,s,a);if(T){E.options.signal=T;const e=()=>j.zone.cancelTask(j);t.call(T,"abort",e,{once:!0}),j.removeAbortListener=()=>T.removeEventListener("abort",e)}return E.target=null,R&&(R.taskData=null),v&&(E.options.once=!0),"boolean"!=typeof j.options&&(j.options=g),j.target=l,j.capture=b,j.eventName=h,_&&(j.originalDelegate=u),c?N.unshift(j):N.push(j),i?l:void 0}};return k[r]=z(m,l,O,w,g),S&&(k[h]=z(S,u,(function(e){return S.call(E.target,E.eventName,e.invoke,E.options)}),w,g,!0)),k[s]=function(){const t=this||e;let o=arguments[0];n&&n.transferEventName&&(o=n.transferEventName(o));const r=arguments[2],s=!!r&&("boolean"==typeof r||r.capture),a=arguments[1];if(!a)return T.apply(this,arguments);if(p&&!p(T,a,t,arguments))return;const i=zoneSymbolEventNames[o];let c;i&&(c=i[s?"true":"false"]);const l=c&&t[c];if(l)for(let e=0;e<l.length;e++){const n=l[e];if(P(n,a))return l.splice(e,1),n.isRemoved=!0,0!==l.length||(n.allRemoved=!0,t[c]=null,s||"string"!=typeof o)||(t[ZONE_SYMBOL_PREFIX+"ON_PROPERTY"+o]=null),n.zone.cancelTask(n),g?t:void 0}return T.apply(this,arguments)},k[a]=function(){const t=this||e;let o=arguments[0];n&&n.transferEventName&&(o=n.transferEventName(o));const r=[],s=findEventTasks(t,y?y(o):o);for(let e=0;e<s.length;e++){const t=s[e];r.push(t.originalDelegate?t.originalDelegate:t.callback)}return r},k[i]=function(){const t=this||e;let o=arguments[0];if(o){n&&n.transferEventName&&(o=n.transferEventName(o));const e=zoneSymbolEventNames[o];if(e){const n=t[e.false],r=t[e.true];if(n){const e=n.slice();for(let t=0;t<e.length;t++){const n=e[t];this[s].call(this,o,n.originalDelegate?n.originalDelegate:n.callback,n.options)}}if(r){const e=r.slice();for(let t=0;t<e.length;t++){const n=e[t];this[s].call(this,o,n.originalDelegate?n.originalDelegate:n.callback,n.options)}}}}else{const e=Object.keys(t);for(let t=0;t<e.length;t++){const n=EVENT_NAME_SYMBOL_REGX.exec(e[t]);let o=n&&n[1];o&&"removeListener"!==o&&this[i].call(this,o)}this[i].call(this,"removeListener")}if(g)return this},attachOriginToPatched(k[r],m),attachOriginToPatched(k[s],T),v&&attachOriginToPatched(k[i],v),b&&attachOriginToPatched(k[a],b),!0}let k=[];for(let e=0;e<n.length;e++)k[e]=g(n[e],o);return k}function findEventTasks(e,t){if(!t){const n=[];for(let o in e){const r=EVENT_NAME_SYMBOL_REGX.exec(o);let s=r&&r[1];if(s&&(!t||s===t)){const t=e[o];if(t)for(let e=0;e<t.length;e++)n.push(t[e])}}return n}let n=zoneSymbolEventNames[t];n||(prepareEventNames(t),n=zoneSymbolEventNames[t]);const o=e[n.false],r=e[n.true];return o?r?o.concat(r):o.slice():r?r.slice():[]}function patchEventPrototype(e,t){const n=e.Event;n&&n.prototype&&t.patchMethod(n.prototype,"stopImmediatePropagation",(e=>function(t,n){t[IMMEDIATE_PROPAGATION_SYMBOL]=!0,e&&e.apply(t,n)}))}function patchQueueMicrotask(e,t){t.patchMethod(e,"queueMicrotask",(e=>function(e,t){Zone.current.scheduleMicroTask("queueMicrotask",t[0])}))}const taskSymbol=zoneSymbol("zoneTask");function patchTimer(e,t,n,o){let r=null,s=null;n+=o;const a={};function i(t){const n=t.data;n.args[0]=function(){return t.invoke.apply(this,arguments)};const o=r.apply(e,n.args);return isNumber(o)?n.handleId=o:(n.handle=o,n.isRefreshable=isFunction(o.refresh)),t}function c(t){const{handle:n,handleId:o}=t.data;return s.call(e,n??o)}r=patchMethod(e,t+=o,(n=>function(r,s){if(isFunction(s[0])){const e={isRefreshable:!1,isPeriodic:"Interval"===o,delay:"Timeout"===o||"Interval"===o?s[1]||0:void 0,args:s},n=s[0];s[0]=function t(){try{return n.apply(this,arguments)}finally{const{handle:t,handleId:n,isPeriodic:o,isRefreshable:r}=e;o||r||(n?delete a[n]:t&&(t[taskSymbol]=null))}};const r=scheduleMacroTaskWithCurrentZone(t,s[0],e,i,c);if(!r)return r;const{handleId:l,handle:h,isRefreshable:u,isPeriodic:p}=r.data;if(l)a[l]=r;else if(h&&(h[taskSymbol]=r,u&&!p)){const e=h.refresh;h.refresh=function(){const{zone:t,state:n}=r;return"notScheduled"===n?(r._state="scheduled",t._updateTaskCount(r,1)):"running"===n&&(r._state="scheduling"),e.call(this)}}return h??l??r}return n.apply(e,s)})),s=patchMethod(e,n,(t=>function(n,o){const r=o[0];let s;isNumber(r)?(s=a[r],delete a[r]):(s=r?.[taskSymbol],s?r[taskSymbol]=null:s=r),s?.type?s.cancelFn&&s.zone.cancelTask(s):t.apply(e,o)}))}function patchCustomElements(e,t){const{isBrowser:n,isMix:o}=t.getGlobalObjects();(n||o)&&e.customElements&&"customElements"in e&&t.patchCallbacks(t,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"])}function eventTargetPatch(e,t){if(Zone[t.symbol("patchEventTarget")])return;const{eventNames:n,zoneSymbolEventNames:o,TRUE_STR:r,FALSE_STR:s,ZONE_SYMBOL_PREFIX:a}=t.getGlobalObjects();for(let e=0;e<n.length;e++){const t=n[e],i=a+(t+s),c=a+(t+r);o[t]={},o[t][s]=i,o[t][r]=c}const i=e.EventTarget;return i&&i.prototype?(t.patchEventTarget(e,t,[i&&i.prototype]),!0):void 0}function patchEvent(e,t){t.patchEventPrototype(e,t)}function filterProperties(e,t,n){if(!n||0===n.length)return t;const o=n.filter((t=>t.target===e));if(0===o.length)return t;const r=o[0].ignoreProperties;return t.filter((e=>-1===r.indexOf(e)))}function patchFilteredProperties(e,t,n,o){e&&patchOnProperties(e,filterProperties(e,t,n),o)}function getOnEventNames(e){return Object.getOwnPropertyNames(e).filter((e=>e.startsWith("on")&&e.length>2)).map((e=>e.substring(2)))}function propertyDescriptorPatch(e,t){if(isNode&&!isMix)return;if(Zone[e.symbol("patchEvents")])return;const n=t.__Zone_ignore_on_properties;let o=[];if(isBrowser){const e=window;o=o.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);const t=[];patchFilteredProperties(e,getOnEventNames(e),n?n.concat(t):n,ObjectGetPrototypeOf(e))}o=o.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let e=0;e<o.length;e++){const r=t[o[e]];r?.prototype&&patchFilteredProperties(r.prototype,getOnEventNames(r.prototype),n)}}function patchBrowser(e){e.__load_patch("legacy",(t=>{const n=t[e.__symbol__("legacyPatch")];n&&n()})),e.__load_patch("timers",(e=>{const t="set",n="clear";patchTimer(e,t,n,"Timeout"),patchTimer(e,t,n,"Interval"),patchTimer(e,t,n,"Immediate")})),e.__load_patch("requestAnimationFrame",(e=>{patchTimer(e,"request","cancel","AnimationFrame"),patchTimer(e,"mozRequest","mozCancel","AnimationFrame"),patchTimer(e,"webkitRequest","webkitCancel","AnimationFrame")})),e.__load_patch("blocking",((e,t)=>{const n=["alert","prompt","confirm"];for(let o=0;o<n.length;o++)patchMethod(e,n[o],((n,o,r)=>function(o,s){return t.current.run(n,e,s,r)}))})),e.__load_patch("EventTarget",((e,t,n)=>{patchEvent(e,n),eventTargetPatch(e,n);const o=e.XMLHttpRequestEventTarget;o&&o.prototype&&n.patchEventTarget(e,n,[o.prototype])})),e.__load_patch("MutationObserver",((e,t,n)=>{patchClass("MutationObserver"),patchClass("WebKitMutationObserver")})),e.__load_patch("IntersectionObserver",((e,t,n)=>{patchClass("IntersectionObserver")})),e.__load_patch("FileReader",((e,t,n)=>{patchClass("FileReader")})),e.__load_patch("on_property",((e,t,n)=>{propertyDescriptorPatch(n,e)})),e.__load_patch("customElements",((e,t,n)=>{patchCustomElements(e,n)})),e.__load_patch("XHR",((e,t)=>{!function n(e){const n=e.XMLHttpRequest;if(!n)return;const l=n.prototype;let h=l[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=l[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];if(!h){const t=e.XMLHttpRequestEventTarget;if(t){const e=t.prototype;h=e[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=e[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]}}const p="readystatechange",f="scheduled";function _(e){const n=e.data,r=n.target;r[a]=!1,r[c]=!1;const i=r[s];h||(h=r[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=r[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]),i&&u.call(r,p,i);const l=r[s]=()=>{if(r.readyState===r.DONE)if(!n.aborted&&r[a]&&e.state===f){const o=r[t.__symbol__("loadfalse")];if(0!==r.status&&o&&o.length>0){const s=e.invoke;e.invoke=function(){const o=r[t.__symbol__("loadfalse")];for(let t=0;t<o.length;t++)o[t]===e&&o.splice(t,1);n.aborted||e.state!==f||s.call(e)},o.push(e)}else e.invoke()}else n.aborted||!1!==r[a]||(r[c]=!0)};return h.call(r,p,l),r[o]||(r[o]=e),m.apply(r,n.args),r[a]=!0,e}function d(){}function g(e){const t=e.data;return t.aborted=!0,T.apply(t.target,t.args)}const k=patchMethod(l,"open",(()=>function(e,t){return e[r]=0==t[2],e[i]=t[1],k.apply(e,t)})),y=zoneSymbol("fetchTaskAborting"),E=zoneSymbol("fetchTaskScheduling"),m=patchMethod(l,"send",(()=>function(e,n){if(!0===t.current[E])return m.apply(e,n);if(e[r])return m.apply(e,n);{const t={target:e,url:e[i],isPeriodic:!1,args:n,aborted:!1},o=scheduleMacroTaskWithCurrentZone("XMLHttpRequest.send",d,t,_,g);e&&!0===e[c]&&!t.aborted&&o.state===f&&o.invoke()}})),T=patchMethod(l,"abort",(()=>function(e,n){const r=function s(e){return e[o]}(e);if(r&&"string"==typeof r.type){if(null==r.cancelFn||r.data&&r.data.aborted)return;r.zone.cancelTask(r)}else if(!0===t.current[y])return T.apply(e,n)}))}(e);const o=zoneSymbol("xhrTask"),r=zoneSymbol("xhrSync"),s=zoneSymbol("xhrListener"),a=zoneSymbol("xhrScheduled"),i=zoneSymbol("xhrURL"),c=zoneSymbol("xhrErrorBeforeScheduled")})),e.__load_patch("geolocation",(e=>{e.navigator&&e.navigator.geolocation&&patchPrototype(e.navigator.geolocation,["getCurrentPosition","watchPosition"])})),e.__load_patch("PromiseRejectionEvent",((e,t)=>{function n(t){return function(n){findEventTasks(e,t).forEach((o=>{const r=e.PromiseRejectionEvent;if(r){const e=new r(t,{promise:n.promise,reason:n.rejection});o.invoke(e)}}))}}e.PromiseRejectionEvent&&(t[zoneSymbol("unhandledPromiseRejectionHandler")]=n("unhandledrejection"),t[zoneSymbol("rejectionHandledHandler")]=n("rejectionhandled"))})),e.__load_patch("queueMicrotask",((e,t,n)=>{patchQueueMicrotask(e,n)}))}function patchPromise(e){e.__load_patch("ZoneAwarePromise",((e,t,n)=>{const o=Object.getOwnPropertyDescriptor,r=Object.defineProperty,s=n.symbol,a=[],i=!1!==e[s("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],c=s("Promise"),l=s("then");n.onUnhandledError=e=>{if(n.showUncaughtError()){const t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=()=>{for(;a.length;){const e=a.shift();try{e.zone.runGuarded((()=>{if(e.throwOriginal)throw e.rejection;throw e}))}catch(e){u(e)}}};const h=s("unhandledPromiseRejectionHandler");function u(e){n.onUnhandledError(e);try{const n=t[h];"function"==typeof n&&n.call(this,e)}catch(e){}}function p(e){return e&&"function"==typeof e.then}function f(e){return e}function _(e){return M.reject(e)}const d=s("state"),g=s("value"),k=s("finally"),y=s("parentPromiseValue"),E=s("parentPromiseState"),m=null,T=!0,b=!1;function v(e,t){return n=>{try{P(e,t,n)}catch(t){P(e,!1,t)}}}const S=function(){let e=!1;return function t(n){return function(){e||(e=!0,n.apply(null,arguments))}}},O="Promise resolved with itself",w=s("currentTaskTrace");function P(e,o,s){const c=S();if(e===s)throw new TypeError(O);if(e[d]===m){let l=null;try{"object"!=typeof s&&"function"!=typeof s||(l=s&&s.then)}catch(t){return c((()=>{P(e,!1,t)}))(),e}if(o!==b&&s instanceof M&&s.hasOwnProperty(d)&&s.hasOwnProperty(g)&&s[d]!==m)D(s),P(e,s[d],s[g]);else if(o!==b&&"function"==typeof l)try{l.call(s,c(v(e,o)),c(v(e,!1)))}catch(t){c((()=>{P(e,!1,t)}))()}else{e[d]=o;const c=e[g];if(e[g]=s,e[k]===k&&o===T&&(e[d]=e[E],e[g]=e[y]),o===b&&s instanceof Error){const e=t.currentTask&&t.currentTask.data&&t.currentTask.data.__creationTrace__;e&&r(s,w,{configurable:!0,enumerable:!1,writable:!0,value:e})}for(let t=0;t<c.length;)z(e,c[t++],c[t++],c[t++],c[t++]);if(0==c.length&&o==b){e[d]=0;let o=s;try{throw new Error("Uncaught (in promise): "+function e(t){return t&&t.toString===Object.prototype.toString?(t.constructor&&t.constructor.name||"")+": "+JSON.stringify(t):t?t.toString():Object.prototype.toString.call(t)}(s)+(s&&s.stack?"\n"+s.stack:""))}catch(e){o=e}i&&(o.throwOriginal=!0),o.rejection=s,o.promise=e,o.zone=t.current,o.task=t.currentTask,a.push(o),n.scheduleMicroTask()}}}return e}const Z=s("rejectionHandledHandler");function D(e){if(0===e[d]){try{const n=t[Z];n&&"function"==typeof n&&n.call(this,{rejection:e[g],promise:e})}catch(e){}e[d]=b;for(let t=0;t<a.length;t++)e===a[t].promise&&a.splice(t,1)}}function z(e,t,n,o,r){D(e);const s=e[d],a=s?"function"==typeof o?o:f:"function"==typeof r?r:_;t.scheduleMicroTask("Promise.then",(()=>{try{const o=e[g],r=!!n&&k===n[k];r&&(n[y]=o,n[E]=s);const i=t.run(a,void 0,r&&a!==_&&a!==f?[]:[o]);P(n,!0,i)}catch(e){P(n,!1,e)}}),n)}const N=function(){},C=e.AggregateError;class M{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(e){return e instanceof M?e:P(new this(null),T,e)}static reject(e){return P(new this(null),b,e)}static withResolvers(){const e={};return e.promise=new M(((t,n)=>{e.resolve=t,e.reject=n})),e}static any(e){if(!e||"function"!=typeof e[Symbol.iterator])return Promise.reject(new C([],"All promises were rejected"));const t=[];let n=0;try{for(let o of e)n++,t.push(M.resolve(o))}catch(e){return Promise.reject(new C([],"All promises were rejected"))}if(0===n)return Promise.reject(new C([],"All promises were rejected"));let o=!1;const r=[];return new M(((e,s)=>{for(let a=0;a<t.length;a++)t[a].then((t=>{o||(o=!0,e(t))}),(e=>{r.push(e),n--,0===n&&(o=!0,s(new C(r,"All promises were rejected")))}))}))}static race(e){let t,n,o=new this(((e,o)=>{t=e,n=o}));function r(e){t(e)}function s(e){n(e)}for(let t of e)p(t)||(t=this.resolve(t)),t.then(r,s);return o}static all(e){return M.allWithCallback(e)}static allSettled(e){return(this&&this.prototype instanceof M?this:M).allWithCallback(e,{thenCallback:e=>({status:"fulfilled",value:e}),errorCallback:e=>({status:"rejected",reason:e})})}static allWithCallback(e,t){let n,o,r=new this(((e,t)=>{n=e,o=t})),s=2,a=0;const i=[];for(let r of e){p(r)||(r=this.resolve(r));const e=a;try{r.then((o=>{i[e]=t?t.thenCallback(o):o,s--,0===s&&n(i)}),(r=>{t?(i[e]=t.errorCallback(r),s--,0===s&&n(i)):o(r)}))}catch(e){o(e)}s++,a++}return s-=2,0===s&&n(i),r}constructor(e){const t=this;if(!(t instanceof M))throw new Error("Must be an instanceof Promise.");t[d]=m,t[g]=[];try{const n=S();e&&e(n(v(t,T)),n(v(t,b)))}catch(e){P(t,!1,e)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return M}then(e,n){let o=this.constructor?.[Symbol.species];o&&"function"==typeof o||(o=this.constructor||M);const r=new o(N),s=t.current;return this[d]==m?this[g].push(s,r,e,n):z(this,s,r,e,n),r}catch(e){return this.then(null,e)}finally(e){let n=this.constructor?.[Symbol.species];n&&"function"==typeof n||(n=M);const o=new n(N);o[k]=k;const r=t.current;return this[d]==m?this[g].push(r,o,e,e):z(this,r,o,e,e),o}}M.resolve=M.resolve,M.reject=M.reject,M.race=M.race,M.all=M.all;const I=e[c]=e.Promise;e.Promise=M;const R=s("thenPatched");function j(e){const t=e.prototype,n=o(t,"then");if(n&&(!1===n.writable||!n.configurable))return;const r=t.then;t[l]=r,e.prototype.then=function(e,t){return new M(((e,t)=>{r.call(this,e,t)})).then(e,t)},e[R]=!0}return n.patchThen=j,I&&(j(I),patchMethod(e,"fetch",(e=>function t(e){return function(t,n){let o=e.apply(t,n);if(o instanceof M)return o;let r=o.constructor;return r[R]||j(r),o}}(e)))),Promise[t.__symbol__("uncaughtPromiseErrors")]=a,M}))}function patchToString(e){e.__load_patch("toString",(e=>{const t=Function.prototype.toString,n=zoneSymbol("OriginalDelegate"),o=zoneSymbol("Promise"),r=zoneSymbol("Error"),s=function s(){if("function"==typeof this){const s=this[n];if(s)return"function"==typeof s?t.call(s):Object.prototype.toString.call(s);if(this===Promise){const n=e[o];if(n)return t.call(n)}if(this===Error){const n=e[r];if(n)return t.call(n)}}return t.call(this)};s[n]=t,Function.prototype.toString=s;const a=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":a.call(this)}}))}function patchCallbacks(e,t,n,o,r){const s=Zone.__symbol__(o);if(t[s])return;const a=t[s]=t[o];t[o]=function(s,i,c){return i&&i.prototype&&r.forEach((function(t){const r=`${n}.${o}::`+t,s=i.prototype;try{if(s.hasOwnProperty(t)){const n=e.ObjectGetOwnPropertyDescriptor(s,t);n&&n.value?(n.value=e.wrapWithCurrentZone(n.value,r),e._redefineProperty(i.prototype,t,n)):s[t]&&(s[t]=e.wrapWithCurrentZone(s[t],r))}else s[t]&&(s[t]=e.wrapWithCurrentZone(s[t],r))}catch{}})),a.call(t,s,i,c)},e.attachOriginToPatched(t[o],a)}function patchUtil(e){e.__load_patch("util",((e,t,n)=>{const o=getOnEventNames(e);n.patchOnProperties=patchOnProperties,n.patchMethod=patchMethod,n.bindArguments=bindArguments,n.patchMacroTask=patchMacroTask;const r=t.__symbol__("BLACK_LISTED_EVENTS"),s=t.__symbol__("UNPATCHED_EVENTS");e[s]&&(e[r]=e[s]),e[r]&&(t[r]=t[s]=e[r]),n.patchEventPrototype=patchEventPrototype,n.patchEventTarget=patchEventTarget,n.isIEOrEdge=isIEOrEdge,n.ObjectDefineProperty=ObjectDefineProperty,n.ObjectGetOwnPropertyDescriptor=ObjectGetOwnPropertyDescriptor,n.ObjectCreate=ObjectCreate,n.ArraySlice=ArraySlice,n.patchClass=patchClass,n.wrapWithCurrentZone=wrapWithCurrentZone,n.filterProperties=filterProperties,n.attachOriginToPatched=attachOriginToPatched,n._redefineProperty=Object.defineProperty,n.patchCallbacks=patchCallbacks,n.getGlobalObjects=()=>({globalSources:globalSources,zoneSymbolEventNames:zoneSymbolEventNames,eventNames:o,isBrowser:isBrowser,isMix:isMix,isNode:isNode,TRUE_STR:"true",FALSE_STR:"false",ZONE_SYMBOL_PREFIX:ZONE_SYMBOL_PREFIX,ADD_EVENT_LISTENER_STR:"addEventListener",REMOVE_EVENT_LISTENER_STR:"removeEventListener"})}))}function patchCommon(e){patchPromise(e),patchToString(e),patchUtil(e)}const Zone$1=loadZone();patchCommon(Zone$1),patchBrowser(Zone$1);X]Ϲxyg/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * Suppress closure compiler errors about unknown 'global' variable
 * @fileoverview
 * @suppress {undefinedVars}
 */
/**
 * Zone is a mechanism for intercepting and keeping track of asynchronous work.
 *
 * A Zone is a global object which is configured with rules about how to intercept and keep track
 * of the asynchronous callbacks. Zone has these responsibilities:
 *
 * 1. Intercept asynchronous task scheduling
 * 2. Wrap callbacks for error-handling and zone tracking across async operations.
 * 3. Provide a way to attach data to zones
 * 4. Provide a context specific last frame error handling
 * 5. (Intercept blocking methods)
 *
 * A zone by itself does not do anything, instead it relies on some other code to route existing
 * platform API through it. (The zone library ships with code which monkey patches all of the
 * browsers's asynchronous API and redirects them through the zone for interception.)
 *
 * In its simplest form a zone allows one to intercept the scheduling and calling of asynchronous
 * operations, and execute additional code before as well as after the asynchronous task. The
 * rules of interception are configured using [ZoneConfig]. There can be many different zone
 * instances in a system, but only one zone is active at any given time which can be retrieved
 * using [Zone#current].
 *
 *
 *
 * ## Callback Wrapping
 *
 * An important aspect of the zones is that they should persist across asynchronous operations. To
 * achieve this, when a future work is scheduled through async API, it is necessary to capture,
 * and subsequently restore the current zone. For example if a code is running in zone `b` and it
 * invokes `setTimeout` to scheduleTask work later, the `setTimeout` method needs to 1) capture
 * the current zone and 2) wrap the `wrapCallback` in code which will restore the current zone `b`
 * once the wrapCallback executes. In this way the rules which govern the current code are
 * preserved in all future asynchronous tasks. There could be a different zone `c` which has
 * different rules and is associated with different asynchronous tasks. As these tasks are
 * processed, each asynchronous wrapCallback correctly restores the correct zone, as well as
 * preserves the zone for future asynchronous callbacks.
 *
 * Example: Suppose a browser page consist of application code as well as third-party
 * advertisement code. (These two code bases are independent, developed by different mutually
 * unaware developers.) The application code may be interested in doing global error handling and
 * so it configures the `app` zone to send all of the errors to the server for analysis, and then
 * executes the application in the `app` zone. The advertising code is interested in the same
 * error processing but it needs to send the errors to a different third-party. So it creates the
 * `ads` zone with a different error handler. Now both advertising as well as application code
 * create many asynchronous operations, but the [Zone] will ensure that all of the asynchronous
 * operations created from the application code will execute in `app` zone with its error
 * handler and all of the advertisement code will execute in the `ads` zone with its error
 * handler. This will not only work for the async operations created directly, but also for all
 * subsequent asynchronous operations.
 *
 * If you think of chain of asynchronous operations as a thread of execution (bit of a stretch)
 * then [Zone#current] will act as a thread local variable.
 *
 *
 *
 * ## Asynchronous operation scheduling
 *
 * In addition to wrapping the callbacks to restore the zone, all operations which cause a
 * scheduling of work for later are routed through the current zone which is allowed to intercept
 * them by adding work before or after the wrapCallback as well as using different means of
 * achieving the request. (Useful for unit testing, or tracking of requests). In some instances
 * such as `setTimeout` the wrapping of the wrapCallback and scheduling is done in the same
 * wrapCallback, but there are other examples such as `Promises` where the `then` wrapCallback is
 * wrapped, but the execution of `then` is triggered by `Promise` scheduling `resolve` work.
 *
 * Fundamentally there are three kinds of tasks which can be scheduled:
 *
 * 1. [MicroTask] used for doing work right after the current task. This is non-cancelable which
 * is guaranteed to run exactly once and immediately.
 * 2. [MacroTask] used for doing work later. Such as `setTimeout`. This is typically cancelable
 *    which is guaranteed to execute at least once after some well understood delay.
 * 3. [EventTask] used for listening on some future event. This may execute zero or more times,
 * with an unknown delay.
 *
 * Each asynchronous API is modeled and routed through one of these APIs.
 *
 *
 * ### [MicroTask]
 *
 * [MicroTask]s represent work which will be done in current VM turn as soon as possible, before
 * VM yielding.
 *
 *
 * ### [MacroTask]
 *
 * [MacroTask]s represent work which will be done after some delay. (Sometimes the delay is
 * approximate such as on next available animation frame). Typically these methods include:
 * `setTimeout`, `setImmediate`, `setInterval`, `requestAnimationFrame`, and all browser specific
 * variants.
 *
 *
 * ### [EventTask]
 *
 * [EventTask]s represent a request to create a listener on an event. Unlike the other task
 * events they may never be executed, but typically execute more than once. There is no queue of
 * events, rather their callbacks are unpredictable both in order and time.
 *
 *
 * ## Global Error Handling
 *
 *
 * ## Composability
 *
 * Zones can be composed together through [Zone.fork()]. A child zone may create its own set of
 * rules. A child zone is expected to either:
 *
 * 1. Delegate the interception to a parent zone, and optionally add before and after wrapCallback
 *    hooks.
 * 2. Process the request itself without delegation.
 *
 * Composability allows zones to keep their concerns clean. For example a top most zone may choose
 * to handle error handling, while child zones may choose to do user action tracking.
 *
 *
 * ## Root Zone
 *
 * At the start the browser will run in a special root zone, which is configured to behave exactly
 * like the platform, making any existing code which is not zone-aware behave as expected. All
 * zones are children of the root zone.
 *
 */
export declare interface Zone {
    /**
     *
     * @returns {Zone} The parent Zone.
     */
    parent: Zone | null;
    /**
     * @returns {string} The Zone name (useful for debugging)
     */
    name: string;
    /**
     * Returns a value associated with the `key`.
     *
     * If the current zone does not have a key, the request is delegated to the parent zone. Use
     * [ZoneSpec.properties] to configure the set of properties associated with the current zone.
     *
     * @param key The key to retrieve.
     * @returns {any} The value for the key, or `undefined` if not found.
     */
    get(key: string): any;
    /**
     * Returns a Zone which defines a `key`.
     *
     * Recursively search the parent Zone until a Zone which has a property `key` is found.
     *
     * @param key The key to use for identification of the returned zone.
     * @returns {Zone} The Zone which defines the `key`, `null` if not found.
     */
    getZoneWith(key: string): Zone | null;
    /**
     * Used to create a child zone.
     *
     * @param zoneSpec A set of rules which the child zone should follow.
     * @returns {Zone} A new child zone.
     */
    fork(zoneSpec: ZoneSpec): Zone;
    /**
     * Wraps a callback function in a new function which will properly restore the current zone upon
     * invocation.
     *
     * The wrapped function will properly forward `this` as well as `arguments` to the `callback`.
     *
     * Before the function is wrapped the zone can intercept the `callback` by declaring
     * [ZoneSpec.onIntercept].
     *
     * @param callback the function which will be wrapped in the zone.
     * @param source A unique debug location of the API being wrapped.
     * @returns {function(): *} A function which will invoke the `callback` through
     *     [Zone.runGuarded].
     */
    wrap<F extends Function>(callback: F, source: string): F;
    /**
     * Invokes a function in a given zone.
     *
     * The invocation of `callback` can be intercepted by declaring [ZoneSpec.onInvoke].
     *
     * @param callback The function to invoke.
     * @param applyThis
     * @param applyArgs
     * @param source A unique debug location of the API being invoked.
     * @returns {any} Value from the `callback` function.
     */
    run<T>(callback: Function, applyThis?: any, applyArgs?: any[], source?: string): T;
    /**
     * Invokes a function in a given zone and catches any exceptions.
     *
     * Any exceptions thrown will be forwarded to [Zone.HandleError].
     *
     * The invocation of `callback` can be intercepted by declaring [ZoneSpec.onInvoke]. The
     * handling of exceptions can be intercepted by declaring [ZoneSpec.handleError].
     *
     * @param callback The function to invoke.
     * @param applyThis
     * @param applyArgs
     * @param source A unique debug location of the API being invoked.
     * @returns {any} Value from the `callback` function.
     */
    runGuarded<T>(callback: Function, applyThis?: any, applyArgs?: any[], source?: string): T;
    /**
     * Execute the Task by restoring the [Zone.currentTask] in the Task's zone.
     *
     * @param task to run
     * @param applyThis
     * @param applyArgs
     * @returns {any} Value from the `task.callback` function.
     */
    runTask<T>(task: Task, applyThis?: any, applyArgs?: any): T;
    /**
     * Schedule a MicroTask.
     *
     * @param source
     * @param callback
     * @param data
     * @param customSchedule
     */
    scheduleMicroTask(source: string, callback: Function, data?: TaskData, customSchedule?: (task: Task) => void): MicroTask;
    /**
     * Schedule a MacroTask.
     *
     * @param source
     * @param callback
     * @param data
     * @param customSchedule
     * @param customCancel
     */
    scheduleMacroTask(source: string, callback: Function, data?: TaskData, customSchedule?: (task: Task) => void, customCancel?: (task: Task) => void): MacroTask;
    /**
     * Schedule an EventTask.
     *
     * @param source
     * @param callback
     * @param data
     * @param customSchedule
     * @param customCancel
     */
    scheduleEventTask(source: string, callback: Function, data?: TaskData, customSchedule?: (task: Task) => void, customCancel?: (task: Task) => void): EventTask;
    /**
     * Schedule an existing Task.
     *
     * Useful for rescheduling a task which was already canceled.
     *
     * @param task
     */
    scheduleTask<T extends Task>(task: T): T;
    /**
     * Allows the zone to intercept canceling of scheduled Task.
     *
     * The interception is configured using [ZoneSpec.onCancelTask]. The default canceler invokes
     * the [Task.cancelFn].
     *
     * @param task
     * @returns {any}
     */
    cancelTask(task: Task): any;
}
export declare interface ZoneType {
    /**
     * @returns {Zone} Returns the current [Zone]. The only way to change
     * the current zone is by invoking a run() method, which will update the current zone for the
     * duration of the run method callback.
     */
    current: Zone;
    /**
     * @returns {Task} The task associated with the current execution.
     */
    currentTask: Task | null;
    /**
     * Verify that Zone has been correctly patched. Specifically that Promise is zone aware.
     */
    assertZonePatched(): void;
    /**
     *  Return the root zone.
     */
    root: Zone;
    /**
     * load patch for specified native module, allow user to
     * define their own patch, user can use this API after loading zone.js
     */
    __load_patch(name: string, fn: PatchFn, ignoreDuplicate?: boolean): void;
    /**
     * Zone symbol API to generate a string with __zone_symbol__ prefix
     */
    __symbol__(name: string): string;
}
/**
 * Patch Function to allow user define their own monkey patch module.
 */
export type PatchFn = (global: Window, Zone: ZoneType, api: ZonePrivate) => void;
/**
 * ZonePrivate interface to provide helper method to help user implement
 * their own monkey patch module.
 */
export declare interface ZonePrivate {
    currentZoneFrame: () => ZoneFrame;
    symbol: (name: string) => string;
    scheduleMicroTask: (task?: MicroTask) => void;
    onUnhandledError: (error: Error) => void;
    microtaskDrainDone: () => void;
    showUncaughtError: () => boolean;
    patchEventTarget: (global: any, api: ZonePrivate, apis: any[], options?: any) => boolean[];
    patchOnProperties: (obj: any, properties: string[] | null, prototype?: any) => void;
    patchThen: (ctro: Function) => void;
    patchMethod: (target: any, name: string, patchFn: (delegate: Function, delegateName: string, name: string) => (self: any, args: any[]) => any) => Function | null;
    bindArguments: (args: any[], source: string) => any[];
    patchMacroTask: (obj: any, funcName: string, metaCreator: (self: any, args: any[]) => any) => void;
    patchEventPrototype: (_global: any, api: ZonePrivate) => void;
    isIEOrEdge: () => boolean;
    ObjectDefineProperty: (o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => any;
    ObjectGetOwnPropertyDescriptor: (o: any, p: PropertyKey) => PropertyDescriptor | undefined;
    ObjectCreate(o: object | null, properties?: PropertyDescriptorMap & ThisType<any>): any;
    ArraySlice(start?: number, end?: number): any[];
    patchClass: (className: string) => void;
    wrapWithCurrentZone: (callback: any, source: string) => any;
    filterProperties: (target: any, onProperties: string[], ignoreProperties: any[]) => string[];
    attachOriginToPatched: (target: any, origin: any) => void;
    _redefineProperty: (target: any, callback: string, desc: any) => void;
    nativeScheduleMicroTask: (func: Function) => void;
    patchCallbacks: (api: ZonePrivate, target: any, targetName: string, method: string, callbacks: string[]) => void;
    getGlobalObjects: () => {
        globalSources: any;
        zoneSymbolEventNames: any;
        eventNames: string[];
        isBrowser: boolean;
        isMix: boolean;
        isNode: boolean;
        TRUE_STR: string;
        FALSE_STR: string;
        ZONE_SYMBOL_PREFIX: string;
        ADD_EVENT_LISTENER_STR: string;
        REMOVE_EVENT_LISTENER_STR: string;
    } | undefined;
}
/**
 * ZoneFrame represents zone stack frame information
 */
export declare interface ZoneFrame {
    parent: ZoneFrame | null;
    zone: Zone;
}
export declare interface UncaughtPromiseError extends Error {
    zone: Zone;
    task: Task;
    promise: Promise<any>;
    rejection: any;
    throwOriginal?: boolean;
}
/**
 * Provides a way to configure the interception of zone events.
 *
 * Only the `name` property is required (all other are optional).
 */
export declare interface ZoneSpec {
    /**
     * The name of the zone. Useful when debugging Zones.
     */
    name: string;
    /**
     * A set of properties to be associated with Zone. Use [Zone.get] to retrieve them.
     */
    properties?: {
        [key: string]: any;
    };
    /**
     * Allows the interception of zone forking.
     *
     * When the zone is being forked, the request is forwarded to this method for interception.
     *
     * @param parentZoneDelegate Delegate which performs the parent [ZoneSpec] operation.
     * @param currentZone The current [Zone] where the current interceptor has been declared.
     * @param targetZone The [Zone] which originally received the request.
     * @param zoneSpec The argument passed into the `fork` method.
     */
    onFork?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, zoneSpec: ZoneSpec) => Zone;
    /**
     * Allows interception of the wrapping of the callback.
     *
     * @param parentZoneDelegate Delegate which performs the parent [ZoneSpec] operation.
     * @param currentZone The current [Zone] where the current interceptor has been declared.
     * @param targetZone The [Zone] which originally received the request.
     * @param delegate The argument passed into the `wrap` method.
     * @param source The argument passed into the `wrap` method.
     */
    onIntercept?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, delegate: Function, source: string) => Function;
    /**
     * Allows interception of the callback invocation.
     *
     * @param parentZoneDelegate Delegate which performs the parent [ZoneSpec] operation.
     * @param currentZone The current [Zone] where the current interceptor has been declared.
     * @param targetZone The [Zone] which originally received the request.
     * @param delegate The argument passed into the `run` method.
     * @param applyThis The argument passed into the `run` method.
     * @param applyArgs The argument passed into the `run` method.
     * @param source The argument passed into the `run` method.
     */
    onInvoke?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, delegate: Function, applyThis: any, applyArgs?: any[], source?: string) => any;
    /**
     * Allows interception of the error handling.
     *
     * @param parentZoneDelegate Delegate which performs the parent [ZoneSpec] operation.
     * @param currentZone The current [Zone] where the current interceptor has been declared.
     * @param targetZone The [Zone] which originally received the request.
     * @param error The argument passed into the `handleError` method.
     */
    onHandleError?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, error: any) => boolean;
    /**
     * Allows interception of task scheduling.
     *
     * @param parentZoneDelegate Delegate which performs the parent [ZoneSpec] operation.
     * @param currentZone The current [Zone] where the current interceptor has been declared.
     * @param targetZone The [Zone] which originally received the request.
     * @param task The argument passed into the `scheduleTask` method.
     */
    onScheduleTask?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task) => Task;
    onInvokeTask?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task, applyThis: any, applyArgs?: any[]) => any;
    /**
     * Allows interception of task cancellation.
     *
     * @param parentZoneDelegate Delegate which performs the parent [ZoneSpec] operation.
     * @param currentZone The current [Zone] where the current interceptor has been declared.
     * @param targetZone The [Zone] which originally received the request.
     * @param task The argument passed into the `cancelTask` method.
     */
    onCancelTask?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task) => any;
    /**
     * Notifies of changes to the task queue empty status.
     *
     * @param parentZoneDelegate Delegate which performs the parent [ZoneSpec] operation.
     * @param currentZone The current [Zone] where the current interceptor has been declared.
     * @param targetZone The [Zone] which originally received the request.
     * @param hasTaskState
     */
    onHasTask?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, hasTaskState: HasTaskState) => void;
}
/**
 *  A delegate when intercepting zone operations.
 *
 *  A ZoneDelegate is needed because a child zone can't simply invoke a method on a parent zone.
 * For example a child zone wrap can't just call parent zone wrap. Doing so would create a
 * callback which is bound to the parent zone. What we are interested in is intercepting the
 * callback before it is bound to any zone. Furthermore, we also need to pass the targetZone (zone
 * which received the original request) to the delegate.
 *
 *  The ZoneDelegate methods mirror those of Zone with an addition of extra targetZone argument in
 *  the method signature. (The original Zone which received the request.) Some methods are renamed
 *  to prevent confusion, because they have slightly different semantics and arguments.
 *
 *  - `wrap` => `intercept`: The `wrap` method delegates to `intercept`. The `wrap` method returns
 *     a callback which will run in a given zone, where as intercept allows wrapping the callback
 *     so that additional code can be run before and after, but does not associate the callback
 *     with the zone.
 *  - `run` => `invoke`: The `run` method delegates to `invoke` to perform the actual execution of
 *     the callback. The `run` method switches to new zone; saves and restores the `Zone.current`;
 *     and optionally performs error handling. The invoke is not responsible for error handling,
 *     or zone management.
 *
 *  Not every method is usually overwritten in the child zone, for this reason the ZoneDelegate
 *  stores the closest zone which overwrites this behavior along with the closest ZoneSpec.
 *
 *  NOTE: We have tried to make this API analogous to Event bubbling with target and current
 *  properties.
 *
 *  Note: The ZoneDelegate treats ZoneSpec as class. This allows the ZoneSpec to use its `this` to
 *  store internal state.
 */
export declare interface ZoneDelegate {
    zone: Zone;
    fork(targetZone: Zone, zoneSpec: ZoneSpec): Zone;
    intercept(targetZone: Zone, callback: Function, source: string): Function;
    invoke(targetZone: Zone, callback: Function, applyThis?: any, applyArgs?: any[], source?: string): any;
    handleError(targetZone: Zone, error: any): boolean;
    scheduleTask(targetZone: Zone, task: Task): Task;
    invokeTask(targetZone: Zone, task: Task, applyThis?: any, applyArgs?: any[]): any;
    cancelTask(targetZone: Zone, task: Task): any;
    hasTask(targetZone: Zone, isEmpty: HasTaskState): void;
}
export type HasTaskState = {
    microTask: boolean;
    macroTask: boolean;
    eventTask: boolean;
    change: TaskType;
};
/**
 * Task type: `microTask`, `macroTask`, `eventTask`.
 */
export type TaskType = 'microTask' | 'macroTask' | 'eventTask';
/**
 * Task type: `notScheduled`, `scheduling`, `scheduled`, `running`, `canceling`, 'unknown'.
 */
export type TaskState = 'notScheduled' | 'scheduling' | 'scheduled' | 'running' | 'canceling' | 'unknown';
/**
 */
export declare interface TaskData {
    /**
     * A periodic [MacroTask] is such which get automatically rescheduled after it is executed.
     */
    isPeriodic?: boolean;
    /**
     * A [MacroTask] that can be manually rescheduled.
     */
    isRefreshable?: boolean;
    /**
     * Delay in milliseconds when the Task will run.
     */
    delay?: number;
    /**
     * identifier returned by the native setTimeout.
     */
    handleId?: number;
    /** The target handler. */
    handle?: any;
}
/**
 * Represents work which is executed with a clean stack.
 *
 * Tasks are used in Zones to mark work which is performed on clean stack frame. There are three
 * kinds of task. [MicroTask], [MacroTask], and [EventTask].
 *
 * A JS VM can be modeled as a [MicroTask] queue, [MacroTask] queue, and [EventTask] set.
 *
 * - [MicroTask] queue represents a set of tasks which are executing right after the current stack
 *   frame becomes clean and before a VM yield. All [MicroTask]s execute in order of insertion
 *   before VM yield and the next [MacroTask] is executed.
 * - [MacroTask] queue represents a set of tasks which are executed one at a time after each VM
 *   yield. The queue is ordered by time, and insertions can happen in any location.
 * - [EventTask] is a set of tasks which can at any time be inserted to the end of the [MacroTask]
 *   queue. This happens when the event fires.
 *
 */
export declare interface Task {
    /**
     * Task type: `microTask`, `macroTask`, `eventTask`.
     */
    type: TaskType;
    /**
     * Task state: `notScheduled`, `scheduling`, `scheduled`, `running`, `canceling`, `unknown`.
     */
    state: TaskState;
    /**
     * Debug string representing the API which requested the scheduling of the task.
     */
    source: string;
    /**
     * The Function to be used by the VM upon entering the [Task]. This function will delegate to
     * [Zone.runTask] and delegate to `callback`.
     */
    invoke: Function;
    /**
     * Function which needs to be executed by the Task after the [Zone.currentTask] has been set to
     * the current task.
     */
    callback: Function;
    /**
     * Task specific options associated with the current task. This is passed to the `scheduleFn`.
     */
    data?: TaskData;
    /**
     * Represents the default work which needs to be done to schedule the Task by the VM.
     *
     * A zone may choose to intercept this function and perform its own scheduling.
     */
    scheduleFn?: (task: Task) => void;
    /**
     * Represents the default work which needs to be done to un-schedule the Task from the VM. Not
     * all Tasks are cancelable, and therefore this method is optional.
     *
     * A zone may chose to intercept this function and perform its own un-scheduling.
     */
    cancelFn?: (task: Task) => void;
    /**
     * @type {Zone} The zone which will be used to invoke the `callback`. The Zone is captured
     * at the time of Task creation.
     */
    readonly zone: Zone;
    /**
     * Number of times the task has been executed, or -1 if canceled.
     */
    runCount: number;
    /**
     * Cancel the scheduling request. This method can be called from `ZoneSpec.onScheduleTask` to
     * cancel the current scheduling interception. Once canceled the task can be discarded or
     * rescheduled using `Zone.scheduleTask` on a different zone.
     */
    cancelScheduleRequest(): void;
}
export declare interface MicroTask extends Task {
    type: 'microTask';
}
export declare interface MacroTask extends Task {
    type: 'macroTask';
}
export declare interface EventTask extends Task {
    type: 'eventTask';
}
export type AmbientZone = Zone;
export declare function __symbol__(name: string): string;
export declare function initZone(): ZoneType;
}hXvxl/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare global {
    /**
     * Additional `EventTarget` methods added by `Zone.js`.
     *
     * 1. removeAllListeners, remove all event listeners of the given event name.
     * 2. eventListeners, get all event listeners of the given event name.
     */
    interface EventTarget {
        /**
         *
         * Remove all event listeners by name for this event target.
         *
         * This method is optional because it may not be available if you use `noop zone` when
         * bootstrapping Angular application or disable the `EventTarget` monkey patch by `zone.js`.
         *
         * If the `eventName` is provided, will remove event listeners of that name.
         * If the `eventName` is not provided, will remove all event listeners associated with
         * `EventTarget`.
         *
         * @param eventName the name of the event, such as `click`. This parameter is optional.
         */
        removeAllListeners?(eventName?: string): void;
        /**
         *
         * Retrieve all event listeners by name.
         *
         * This method is optional because it may not be available if you use `noop zone` when
         * bootstrapping Angular application or disable the `EventTarget` monkey patch by `zone.js`.
         *
         * If the `eventName` is provided, will return an array of event handlers or event listener
         * objects of the given event.
         * If the `eventName` is not provided, will return all listeners.
         *
         * @param eventName the name of the event, such as click. This parameter is optional.
         */
        eventListeners?(eventName?: string): EventListenerOrEventListenerObject[];
    }
}
export {};
"UDxVs/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
declare global {
    /**
     * Interface of `zone.js` configurations.
     *
     * You can define the following configurations on the `window/global` object before
     * importing `zone.js` to change `zone.js` default behaviors.
     */
    interface ZoneGlobalConfigurations {
        /**
         * Disable the monkey patch of the `Node.js` `EventEmitter` API.
         *
         * By default, `zone.js` monkey patches the `Node.js` `EventEmitter` APIs to make asynchronous
         * callbacks of those APIs in the same zone when scheduled.
         *
         * Consider the following example:
         *
         * ```ts
         * const EventEmitter = require('events');
         * class MyEmitter extends EventEmitter {}
         * const myEmitter = new MyEmitter();
         *
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   myEmitter.on('event', () => {
         *     console.log('an event occurs in the zone', Zone.current.name);
         *     // the callback runs in the zone when it is scheduled,
         *     // so the output is 'an event occurs in the zone myZone'.
         *   });
         * });
         * myEmitter.emit('event');
         * ```
         *
         * If you set `__Zone_disable_EventEmitter = true` before importing `zone.js`,
         * `zone.js` does not monkey patch the `EventEmitter` APIs and the above code
         * outputs 'an event occurred <root>'.
         */
        __Zone_disable_EventEmitter?: boolean;
        /**
         * Disable the monkey patch of the `Node.js` `fs` API.
         *
         * By default, `zone.js` monkey patches `Node.js` `fs` APIs to make asynchronous callbacks of
         * those APIs in the same zone when scheduled.
         *
         * Consider the following example:
         *
         * ```ts
         * const fs = require('fs');
         *
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   fs.stat('/tmp/world', (err, stats) => {
         *     console.log('fs.stats() callback is invoked in the zone', Zone.current.name);
         *     // since the callback of the `fs.stat()` runs in the same zone
         *     // when it is called, so the output is 'fs.stats() callback is invoked in the zone
         * myZone'.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_fs = true` before importing `zone.js`,
         * `zone.js` does not monkey patch the `fs` API and the above code
         * outputs 'get stats occurred <root>'.
         */
        __Zone_disable_fs?: boolean;
        /**
         * Disable the monkey patch of the `Node.js` `timer` API.
         *
         * By default, `zone.js` monkey patches the `Node.js` `timer` APIs to make asynchronous
         * callbacks of those APIs in the same zone when scheduled.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   setTimeout(() => {
         *     console.log('setTimeout() callback is invoked in the zone', Zone.current.name);
         *     // since the callback of `setTimeout()` runs in the same zone
         *     // when it is scheduled, so the output is 'setTimeout() callback is invoked in the zone
         *     // myZone'.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_timers = true` before importing `zone.js`,
         * `zone.js` does not monkey patch the `timer` APIs and the above code
         * outputs 'timeout <root>'.
         */
        __Zone_disable_node_timers?: boolean;
        /**
         * Disable the monkey patch of the `Node.js` `process.nextTick()` API.
         *
         * By default, `zone.js` monkey patches the `Node.js` `process.nextTick()` API to make the
         * callback in the same zone when calling `process.nextTick()`.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   process.nextTick(() => {
         *     console.log('process.nextTick() callback is invoked in the zone', Zone.current.name);
         *     // since the callback of `process.nextTick()` runs in the same zone
         *     // when it is scheduled, so the output is 'process.nextTick() callback is invoked in the
         *     // zone myZone'.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_nextTick = true` before importing `zone.js`,
         * `zone.js` does not monkey patch the `process.nextTick()` API and the above code
         * outputs 'nextTick <root>'.
         */
        __Zone_disable_nextTick?: boolean;
        /**
         * Disable the monkey patch of the `Node.js` `crypto` API.
         *
         * By default, `zone.js` monkey patches the `Node.js` `crypto` APIs to make asynchronous
         * callbacks of those APIs in the same zone when called.
         *
         * Consider the following example:
         *
         * ```ts
         * const crypto = require('crypto');
         *
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   crypto.randomBytes(() => {
         *     console.log('crypto.randomBytes() callback is invoked in the zone', Zone.current.name);
         *     // since the callback of `crypto.randomBytes()` runs in the same zone
         *     // when it is called, so the output is 'crypto.randomBytes() callback is invoked in the
         *     // zone myZone'.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_crypto = true` before importing `zone.js`,
         * `zone.js` does not monkey patch the `crypto` API and the above code
         * outputs 'crypto <root>'.
         */
        __Zone_disable_crypto?: boolean;
        /**
         * Disable the monkey patch of the `Object.defineProperty()` API.
         *
         * Note: This configuration is available only in the legacy bundle (dist/zone.js). This module
         * is not available in the evergreen bundle (zone-evergreen.js).
         *
         * In the legacy browser, the default behavior of `zone.js` is to monkey patch
         * `Object.defineProperty()` and `Object.create()` to try to ensure PropertyDescriptor
         * parameter's configurable property to be true. This patch is only needed in some old mobile
         * browsers.
         *
         * If you set `__Zone_disable_defineProperty = true` before importing `zone.js`,
         * `zone.js` does not monkey patch the `Object.defineProperty()` API and does not
         * modify desc.configurable to true.
         *
         */
        __Zone_disable_defineProperty?: boolean;
        /**
         * Disable the monkey patch of the browser `registerElement()` API.
         *
         * NOTE: This configuration is only available in the legacy bundle (dist/zone.js), this
         * module is not available in the evergreen bundle (zone-evergreen.js).
         *
         * In the legacy browser, the default behavior of `zone.js` is to monkey patch the
         * `registerElement()` API to make asynchronous callbacks of the API in the same zone when
         * `registerElement()` is called.
         *
         * Consider the following example:
         *
         * ```ts
         * const proto = Object.create(HTMLElement.prototype);
         * proto.createdCallback = function() {
         *   console.log('createdCallback is invoked in the zone', Zone.current.name);
         * };
         * proto.attachedCallback = function() {
         *   console.log('attachedCallback is invoked in the zone', Zone.current.name);
         * };
         * proto.detachedCallback = function() {
         *   console.log('detachedCallback is invoked in the zone', Zone.current.name);
         * };
         * proto.attributeChangedCallback = function() {
         *   console.log('attributeChangedCallback is invoked in the zone', Zone.current.name);
         * };
         *
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   document.registerElement('x-elem', {prototype: proto});
         * });
         * ```
         *
         * When these callbacks are invoked, those callbacks will be in the zone when
         * `registerElement()` is called.
         *
         * If you set `__Zone_disable_registerElement = true` before importing `zone.js`,
         * `zone.js` does not monkey patch `registerElement()` API and the above code
         * outputs '<root>'.
         */
        __Zone_disable_registerElement?: boolean;
        /**
         * Disable the monkey patch of the browser legacy `EventTarget` API.
         *
         * NOTE: This configuration is only available in the legacy bundle (dist/zone.js), this module
         * is not available in the evergreen bundle (zone-evergreen.js).
         *
         * In some old browsers, the `EventTarget` is not available, so `zone.js` cannot directly monkey
         * patch the `EventTarget`. Instead, `zone.js` patches all known HTML elements' prototypes (such
         * as `HtmlDivElement`). The callback of the `addEventListener()` will be in the same zone when
         * the `addEventListener()` is called.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   div.addEventListener('click', () => {
         *     console.log('div click event listener is invoked in the zone', Zone.current.name);
         *     // the output is 'div click event listener is invoked in the zone myZone'.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_EventTargetLegacy = true` before importing `zone.js`
         * In some old browsers, where `EventTarget` is not available, if you set
         * `__Zone_disable_EventTargetLegacy = true` before importing `zone.js`, `zone.js` does not
         * monkey patch all HTML element APIs and the above code outputs 'clicked <root>'.
         */
        __Zone_disable_EventTargetLegacy?: boolean;
        /**
         * Disable the monkey patch of the browser `timer` APIs.
         *
         * By default, `zone.js` monkey patches browser timer
         * APIs (`setTimeout()`/`setInterval()`/`setImmediate()`) to make asynchronous callbacks of
         * those APIs in the same zone when scheduled.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   setTimeout(() => {
         *     console.log('setTimeout() callback is invoked in the zone', Zone.current.name);
         *     // since the callback of `setTimeout()` runs in the same zone
         *     // when it is scheduled, so the output is 'setTimeout() callback is invoked in the zone
         *     // myZone'.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_timers = true` before importing `zone.js`,
         * `zone.js` does not monkey patch `timer` API and the above code
         * outputs 'timeout <root>'.
         *
         */
        __Zone_disable_timers?: boolean;
        /**
         * Disable the monkey patch of the browser `requestAnimationFrame()` API.
         *
         * By default, `zone.js` monkey patches the browser `requestAnimationFrame()` API
         * to make the asynchronous callback of the `requestAnimationFrame()` in the same zone when
         * scheduled.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   requestAnimationFrame(() => {
         *     console.log('requestAnimationFrame() callback is invoked in the zone',
         * Zone.current.name);
         *     // since the callback of `requestAnimationFrame()` will be in the same zone
         *     // when it is scheduled, so the output will be 'requestAnimationFrame() callback is
         * invoked
         *     // in the zone myZone'
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_requestAnimationFrame = true` before importing `zone.js`,
         * `zone.js` does not monkey patch the `requestAnimationFrame()` API and the above code
         * outputs 'raf <root>'.
         */
        __Zone_disable_requestAnimationFrame?: boolean;
        /**
         *
         * Disable the monkey patching of the `queueMicrotask()` API.
         *
         * By default, `zone.js` monkey patches the `queueMicrotask()` API
         * to ensure that `queueMicrotask()` callback is invoked in the same zone as zone used to invoke
         * `queueMicrotask()`. And also the callback is running as `microTask` like
         * `Promise.prototype.then()`.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   queueMicrotask(() => {
         *     console.log('queueMicrotask() callback is invoked in the zone', Zone.current.name);
         *     // Since `queueMicrotask()` was invoked in `myZone`, same zone is restored
         *     // when 'queueMicrotask() callback is invoked, resulting in `myZone` being console
         * logged.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_queueMicrotask = true` before importing `zone.js`,
         * `zone.js` does not monkey patch the `queueMicrotask()` API and the above code
         * output will change to: 'queueMicrotask() callback is invoked in the zone <root>'.
         */
        __Zone_disable_queueMicrotask?: boolean;
        /**
         *
         * Disable the monkey patch of the browser blocking APIs(`alert()`/`prompt()`/`confirm()`).
         */
        __Zone_disable_blocking?: boolean;
        /**
         * Disable the monkey patch of the browser `EventTarget` APIs.
         *
         * By default, `zone.js` monkey patches EventTarget APIs. The callbacks of the
         * `addEventListener()` run in the same zone when the `addEventListener()` is called.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   div.addEventListener('click', () => {
         *     console.log('div event listener is invoked in the zone', Zone.current.name);
         *     // the output is 'div event listener is invoked in the zone myZone'.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_EventTarget = true` before importing `zone.js`,
         * `zone.js` does not monkey patch EventTarget API and the above code
         * outputs 'clicked <root>'.
         *
         */
        __Zone_disable_EventTarget?: boolean;
        /**
         * Disable the monkey patch of the browser `FileReader` APIs.
         */
        __Zone_disable_FileReader?: boolean;
        /**
         * Disable the monkey patch of the browser `MutationObserver` APIs.
         */
        __Zone_disable_MutationObserver?: boolean;
        /**
         * Disable the monkey patch of the browser `IntersectionObserver` APIs.
         */
        __Zone_disable_IntersectionObserver?: boolean;
        /**
         * Disable the monkey patch of the browser onProperty APIs(such as onclick).
         *
         * By default, `zone.js` monkey patches onXXX properties (such as onclick). The callbacks of
         * onXXX properties run in the same zone when the onXXX properties is set.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         * zone.run(() => {
         *   div.onclick = () => {
         *     console.log('div click event listener is invoked in the zone', Zone.current.name);
         *     // the output will be 'div click event listener is invoked in the zone myZone'
         *   }
         * });
         * ```
         *
         * If you set `__Zone_disable_on_property = true` before importing `zone.js`,
         * `zone.js` does not monkey patch onXXX properties and the above code
         * outputs 'clicked <root>'.
         *
         */
        __Zone_disable_on_property?: boolean;
        /**
         * Disable the monkey patch of the browser `customElements` APIs.
         *
         * By default, `zone.js` monkey patches `customElements` APIs to make callbacks run in the
         * same zone when the `customElements.define()` is called.
         *
         * Consider the following example:
         *
         * ```ts
         * class TestCustomElement extends HTMLElement {
         *   constructor() { super(); }
         *   connectedCallback() {}
         *   disconnectedCallback() {}
         *   attributeChangedCallback(attrName, oldVal, newVal) {}
         *   adoptedCallback() {}
         *   formAssociatedCallback(form) {}
         *   formDisabledCallback(isDisabled) {}
         *   formResetCallback() {}
         *   formStateRestoreCallback(state, reason) {}
         * }
         *
         * const zone = Zone.fork({name: 'myZone'});
         * zone.run(() => {
         *   customElements.define('x-elem', TestCustomElement);
         * });
         * ```
         *
         * All those callbacks defined in TestCustomElement runs in the zone when
         * the `customElements.define()` is called.
         *
         * If you set `__Zone_disable_customElements = true` before importing `zone.js`,
         * `zone.js` does not monkey patch `customElements` APIs and the above code
         * runs inside <root> zone.
         */
        __Zone_disable_customElements?: boolean;
        /**
         * Disable the monkey patch of the browser `XMLHttpRequest` APIs.
         *
         * By default, `zone.js` monkey patches `XMLHttpRequest` APIs to make XMLHttpRequest act
         * as macroTask.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({
         *   name: 'myZone',
         *   onScheduleTask: (delegate, curr, target, task) => {
         *     console.log('task is scheduled', task.type, task.source, task.zone.name);
         *     return delegate.scheduleTask(target, task);
         *   }
         * })
         * const xhr = new XMLHttpRequest();
         * zone.run(() => {
         *   xhr.onload = function() {};
         *   xhr.open('get', '/', true);
         *   xhr.send();
         * });
         * ```
         *
         * In this example, the instance of XMLHttpRequest runs in the zone and acts as a macroTask. The
         * output is 'task is scheduled macroTask, XMLHttpRequest.send, zone'.
         *
         * If you set `__Zone_disable_XHR = true` before importing `zone.js`,
         * `zone.js` does not monkey patch `XMLHttpRequest` APIs and the above onScheduleTask callback
         * will not be called.
         *
         */
        __Zone_disable_XHR?: boolean;
        /**
         * Disable the monkey patch of the browser geolocation APIs.
         *
         * By default, `zone.js` monkey patches geolocation APIs to make callbacks run in the same zone
         * when those APIs are called.
         *
         * Consider the following examples:
         *
         * ```ts
         * const zone = Zone.current.fork({
         *   name: 'myZone'
         * });
         *
         * zone.run(() => {
         *   navigator.geolocation.getCurrentPosition(pos => {
         *     console.log('navigator.getCurrentPosition() callback is invoked in the zone',
         *     Zone.current.name);
         *     // output is 'navigator.getCurrentPosition() callback is invoked in the zone myZone'.
         *   }
         * });
         * ```
         *
         * If set you `__Zone_disable_geolocation = true` before importing `zone.js`,
         * `zone.js` does not monkey patch geolocation APIs and the above code
         * outputs 'getCurrentPosition <root>'.
         *
         */
        __Zone_disable_geolocation?: boolean;
        /**
         * Disable the monkey patch of the browser `canvas` APIs.
         *
         * By default, `zone.js` monkey patches `canvas` APIs to make callbacks run in the same zone
         * when those APIs are called.
         *
         * Consider the following example:
         *
         * ```ts
         * const zone = Zone.current.fork({
         *   name: 'myZone'
         * });
         *
         * zone.run(() => {
         *   canvas.toBlob(blog => {
         *     console.log('canvas.toBlob() callback is invoked in the zone', Zone.current.name);
         *     // output is 'canvas.toBlob() callback is invoked in the zone myZone'.
         *   }
         * });
         * ```
         *
         * If you set `__Zone_disable_canvas = true` before importing `zone.js`,
         * `zone.js` does not monkey patch `canvas` APIs and the above code
         * outputs 'canvas.toBlob <root>'.
         */
        __Zone_disable_canvas?: boolean;
        /**
         * Disable the `Promise` monkey patch.
         *
         * By default, `zone.js` monkey patches `Promise` APIs to make the `then()/catch()` callbacks in
         * the same zone when those callbacks are called.
         *
         * Consider the following examples:
         *
         * ```ts
         * const zone = Zone.current.fork({name: 'myZone'});
         *
         * const p = Promise.resolve(1);
         *
         * zone.run(() => {
         *   p.then(() => {
         *     console.log('then() callback is invoked in the zone', Zone.current.name);
         *     // output is 'then() callback is invoked in the zone myZone'.
         *   });
         * });
         * ```
         *
         * If you set `__Zone_disable_ZoneAwarePromise = true` before importing `zone.js`,
         * `zone.js` does not monkey patch `Promise` APIs and the above code
         * outputs 'promise then callback <root>'.
         */
        __Zone_disable_ZoneAwarePromise?: boolean;
        /**
         * Define event names that users don't want monkey patched by the `zone.js`.
         *
         * By default, `zone.js` monkey patches EventTarget.addEventListener(). The event listener
         * callback runs in the same zone when the addEventListener() is called.
         *
         * Sometimes, you don't want all of the event names used in this patched version because it
         * impacts performance. For example, you might want `scroll` or `mousemove` event listeners to
         * run the native `addEventListener()` for better performance.
         *
         * Users can achieve this goal by defining `__zone_symbol__UNPATCHED_EVENTS = ['scroll',
         * 'mousemove'];` before importing `zone.js`.
         */
        __zone_symbol__UNPATCHED_EVENTS?: string[];
        /**
         * Define a list of `on` properties to be ignored when being monkey patched by the `zone.js`.
         *
         * By default, `zone.js` monkey patches `on` properties on inbuilt browser classes as
         * `WebSocket`, `XMLHttpRequest`, `Worker`, `HTMLElement` and others (see `patchTargets` in
         * `propertyDescriptorPatch`). `on` properties may be `WebSocket.prototype.onclose`,
         * `XMLHttpRequest.prototype.onload`, etc.
         *
         * Sometimes, we're not able to customise third-party libraries, which setup `on` listeners.
         * Given a library creates a `Websocket` and sets `socket.onmessage`, this will impact
         * performance if the `onmessage` property is set within the Angular zone, because this will
         * trigger change detection on any message coming through the socket. We can exclude specific
         * targets and their `on` properties from being patched by zone.js.
         *
         * Users can achieve this by defining `__Zone_ignore_on_properties`, it expects an array of
         * objects where `target` is the actual object `on` properties will be set on:
         * ```
         * __Zone_ignore_on_properties = [
         *   {
         *     target: WebSocket.prototype,
         *     ignoreProperties: ['message', 'close', 'open']
         *   }
         * ];
         * ```
         *
         * In order to check whether `on` properties have been successfully ignored or not, it's enough
         * to open the console in the browser, run `WebSocket.prototype` and expand the object, we
         * should see the following:
         * ```
         * {
         *   __zone_symbol__ononclosepatched: true,
         *   __zone_symbol__ononerrorpatched: true,
         *   __zone_symbol__ononmessagepatched: true,
         *   __zone_symbol__ononopenpatched: true
         * }
         * ```
         * These `__zone_symbol__*` properties are set by zone.js when `on` properties have been patched
         * previously. When `__Zone_ignore_on_properties` is setup, we should not see those properties
         * on targets.
         */
        __Zone_ignore_on_properties?: {
            target: any;
            ignoreProperties: string[];
        }[];
        /**
         * Define the event names of the passive listeners.
         *
         * To add passive event listeners, you can use `elem.addEventListener('scroll', listener,
         * {passive: true});` or implement your own `EventManagerPlugin`.
         *
         * You can also define a global variable as follows:
         *
         * ```
         * __zone_symbol__PASSIVE_EVENTS = ['scroll'];
         * ```
         *
         * The preceding code makes all scroll event listeners passive.
         */
        __zone_symbol__PASSIVE_EVENTS?: string[];
        /**
         * Disable wrapping uncaught promise rejection.
         *
         * By default, `zone.js` throws the original error occurs in the uncaught promise rejection.
         *
         * If you set `__zone_symbol__DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION = false;` before
         * importing `zone.js`, `zone.js` will wrap the uncaught promise rejection in a new `Error`
         * object which contains additional information such as a value of the rejection and a stack
         * trace.
         */
        __zone_symbol__DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION?: boolean;
        /**
         * https://github.com/angular/angular/issues/47579
         *
         * Enables the default `beforeunload` handling behavior, allowing the result of the event
         * handling invocation to be set on the event's `returnValue`. The browser may then prompt
         * the user with a string returned from the event handler.
         */
        __zone_symbol__enable_beforeunload?: boolean;
    }
    /**
     * Interface of `zone-testing.js` test configurations.
     *
     * You can define the following configurations on the `window` or `global` object before
     * importing `zone-testing.js` to change `zone-testing.js` default behaviors in the test runner.
     */
    interface ZoneTestConfigurations {
        /**
         * Disable the Jasmine integration.
         *
         * In the `zone-testing.js` bundle, by default, `zone-testing.js` monkey patches Jasmine APIs
         * to make Jasmine APIs run in specified zone.
         *
         * 1. Make the `describe()`/`xdescribe()`/`fdescribe()` methods run in the syncTestZone.
         * 2. Make the `it()`/`xit()`/`fit()`/`beforeEach()`/`afterEach()`/`beforeAll()`/`afterAll()`
         * methods run in the ProxyZone.
         *
         * With this patch, `async()`/`fakeAsync()` can work with the Jasmine runner.
         *
         * If you set `__Zone_disable_jasmine = true` before importing `zone-testing.js`,
         * `zone-testing.js` does not monkey patch the jasmine APIs and the `async()`/`fakeAsync()`
         * cannot work with the Jasmine runner any longer.
         */
        __Zone_disable_jasmine?: boolean;
        /**
         * Disable the Mocha integration.
         *
         * In the `zone-testing.js` bundle, by default, `zone-testing.js` monkey patches the Mocha APIs
         * to make Mocha APIs run in the specified zone.
         *
         * 1. Make the `describe()`/`xdescribe()`/`fdescribe()` methods run in the syncTestZone.
         * 2. Make the `it()`/`xit()`/`fit()`/`beforeEach()`/`afterEach()`/`beforeAll()`/`afterAll()`
         * methods run in the ProxyZone.
         *
         * With this patch, `async()`/`fakeAsync()` can work with the Mocha runner.
         *
         * If you set `__Zone_disable_mocha = true` before importing `zone-testing.js`,
         * `zone-testing.js` does not monkey patch the Mocha APIs and the `async()/`fakeAsync()` can not
         * work with the Mocha runner any longer.
         */
        __Zone_disable_mocha?: boolean;
        /**
         * Disable the Jest integration.
         *
         * In the `zone-testing.js` bundle, by default, `zone-testing.js` monkey patches Jest APIs
         * to make Jest APIs run in the specified zone.
         *
         * 1. Make the `describe()`/`xdescribe()`/`fdescribe()` methods run in the syncTestZone.
         * 2. Make the `it()`/`xit()`/`fit()`/`beforeEach()`/`afterEach()`/`before()`/`after()` methods
         * run in the ProxyZone.
         *
         * With this patch, `async()`/`fakeAsync()` can work with the Jest runner.
         *
         * If you set `__Zone_disable_jest = true` before importing `zone-testing.js`,
         * `zone-testing.js` does not monkey patch the jest APIs and `async()`/`fakeAsync()` cannot
         * work with the Jest runner any longer.
         */
        __Zone_disable_jest?: boolean;
        /**
         * Disable monkey patch the jasmine clock APIs.
         *
         * By default, `zone-testing.js` monkey patches the `jasmine.clock()` API,
         * so the `jasmine.clock()` can work with the `fakeAsync()/tick()` API.
         *
         * Consider the following example:
         *
         * ```ts
         * describe('jasmine.clock integration', () => {
         *   beforeEach(() => {
         *     jasmine.clock().install();
         *   });
         *   afterEach(() => {
         *     jasmine.clock().uninstall();
         *   });
         *   it('fakeAsync test', fakeAsync(() => {
         *     setTimeout(spy, 100);
         *     expect(spy).not.toHaveBeenCalled();
         *     jasmine.clock().tick(100);
         *     expect(spy).toHaveBeenCalled();
         *   }));
         * });
         * ```
         *
         * In the `fakeAsync()` method, `jasmine.clock().tick()` works just like `tick()`.
         *
         * If you set `__zone_symbol__fakeAsyncDisablePatchingClock = true` before importing
         * `zone-testing.js`,`zone-testing.js` does not monkey patch the `jasmine.clock()` APIs and the
         * `jasmine.clock()` cannot work with `fakeAsync()` any longer.
         */
        __zone_symbol__fakeAsyncDisablePatchingClock?: boolean;
        /**
         * Enable auto running into `fakeAsync()` when installing the `jasmine.clock()`.
         *
         * By default, `zone-testing.js` does not automatically run into `fakeAsync()`
         * if the `jasmine.clock().install()` is called.
         *
         * Consider the following example:
         *
         * ```ts
         * describe('jasmine.clock integration', () => {
         *   beforeEach(() => {
         *     jasmine.clock().install();
         *   });
         *   afterEach(() => {
         *     jasmine.clock().uninstall();
         *   });
         *   it('fakeAsync test', fakeAsync(() => {
         *     setTimeout(spy, 100);
         *     expect(spy).not.toHaveBeenCalled();
         *     jasmine.clock().tick(100);
         *     expect(spy).toHaveBeenCalled();
         *   }));
         * });
         * ```
         *
         * You must run `fakeAsync()` to make test cases in the `FakeAsyncTestZone`.
         *
         * If you set `__zone_symbol__fakeAsyncAutoFakeAsyncWhenClockPatched = true` before importing
         * `zone-testing.js`, `zone-testing.js` can run test case automatically in the
         * `FakeAsyncTestZone` without calling the `fakeAsync()`.
         *
         * Consider the following example:
         *
         * ```ts
         * describe('jasmine.clock integration', () => {
         *   beforeEach(() => {
         *     jasmine.clock().install();
         *   });
         *   afterEach(() => {
         *     jasmine.clock().uninstall();
         *   });
         *   it('fakeAsync test', () => { // here we don't need to call fakeAsync
         *     setTimeout(spy, 100);
         *     expect(spy).not.toHaveBeenCalled();
         *     jasmine.clock().tick(100);
         *     expect(spy).toHaveBeenCalled();
         *   });
         * });
         * ```
         *
         */
        __zone_symbol__fakeAsyncAutoFakeAsyncWhenClockPatched?: boolean;
        /**
         * Enable waiting for the unresolved promise in the `async()` test.
         *
         * In the `async()` test, `AsyncTestZone` waits for all the asynchronous tasks to finish. By
         * default, if some promises remain unresolved, `AsyncTestZone` does not wait and reports that
         * it received an unexpected result.
         *
         * Consider the following example:
         *
         * ```ts
         * describe('wait never resolved promise', () => {
         *   it('async with never resolved promise test', async(() => {
         *     const p = new Promise(() => {});
         *     p.then(() => {
         *       // do some expectation.
         *     });
         *   }))
         * });
         * ```
         *
         * By default, this case passes, because the callback of `p.then()` is never called. Because `p`
         * is an unresolved promise, there is no pending asynchronous task, which means the `async()`
         * method does not wait.
         *
         * If you set `__zone_symbol__supportWaitUnResolvedChainedPromise = true`, the above case
         * times out, because `async()` will wait for the unresolved promise.
         */
        __zone_symbol__supportWaitUnResolvedChainedPromise?: boolean;
    }
    /**
     * The interface of the `zone.js` runtime configurations.
     *
     * These configurations can be defined on the `Zone` object after
     * importing zone.js to change behaviors. The differences between
     * the `ZoneRuntimeConfigurations` and the `ZoneGlobalConfigurations` are,
     *
     * 1. `ZoneGlobalConfigurations` must be defined on the `global/window` object before importing
     * `zone.js`. The value of the configuration cannot be changed at runtime.
     *
     * 2. `ZoneRuntimeConfigurations` must be defined on the `Zone` object after importing `zone.js`.
     * You can change the value of this configuration at runtime.
     *
     */
    interface ZoneRuntimeConfigurations {
        /**
         * Ignore outputting errors to the console when uncaught Promise errors occur.
         *
         * By default, if an uncaught Promise error occurs, `zone.js` outputs the
         * error to the console by calling `console.error()`.
         *
         * If you set `__zone_symbol__ignoreConsoleErrorUncaughtError = true`, `zone.js` does not output
         * the uncaught error to `console.error()`.
         */
        __zone_symbol__ignoreConsoleErrorUncaughtError?: boolean;
    }
}
export {};
֠kcx5/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
import { EventTask as _EventTask, HasTaskState as _HasTaskState, MacroTask as _MacroTask, MicroTask as _MicroTask, PatchFn, Task as _Task, TaskData as _TaskData, TaskState as _TaskState, TaskType as _TaskType, UncaughtPromiseError as _UncaughtPromiseError, Zone as _Zone, ZoneDelegate as _ZoneDelegate, ZoneFrame, ZonePrivate, ZoneSpec as _ZoneSpec, ZoneType as _ZoneType } from './zone-impl';
declare global {
    const Zone: ZoneType;
    type Zone = _Zone;
    type ZoneType = _ZoneType;
    type _PatchFn = PatchFn;
    type _ZonePrivate = ZonePrivate;
    type _ZoneFrame = ZoneFrame;
    type UncaughtPromiseError = _UncaughtPromiseError;
    type ZoneSpec = _ZoneSpec;
    type ZoneDelegate = _ZoneDelegate;
    type HasTaskState = _HasTaskState;
    type TaskType = _TaskType;
    type TaskState = _TaskState;
    type TaskData = _TaskData;
    type Task = _Task;
    type MicroTask = _MicroTask;
    type MacroTask = _MacroTask;
    type EventTask = _EventTask;
    /**
     * Extend the Error with additional fields for rewritten stack frames
     */
    interface Error {
        /**
         * Stack trace where extra frames have been removed and zone names added.
         */
        zoneAwareStack?: string;
        /**
         * Original stack trace with no modifications
         */
        originalStack?: string;
    }
}
export declare function loadZone(): ZoneType;
>պxu{
  "name": "zone.js",
  "version": "0.15.1",
  "description": "Zones for JavaScript",
  "main": "./bundles/zone.umd.js",
  "module": "./fesm2015/zone.js",
  "es2015": "./fesm2015/zone.js",
  "fesm2015": "./fesm2015/zone.js",
  "typings": "./zone.d.ts",
  "devDependencies": {
    "@externs/nodejs": "^1.5.0",
    "@types/node": "^10.9.4",
    "domino": "https://github.com/angular/domino.git#93e720f143d0296dd2726ffbcf4fc12283363a7b",
    "google-closure-compiler": "^20250519.0.0",
    "jest": "^29.0",
    "jest-environment-jsdom": "^29.0.3",
    "jest-environment-node": "^29.0.3",
    "mocha": "^11.0.0",
    "mock-require": "3.0.3",
    "tslib": "^2.3.0",
    "vitest": "^3.1.3"
  },
  "scripts": {
    "electrontest": "cd test/extra && node electron.js",
    "jest:test": "jest --config ./test/jest/jest.config.js ./test/jest/jest.spec.js",
    "jest:nodetest": "jest --config ./test/jest/jest.node.config.js ./test/jest/jest.spec.js",
    "vitest:test": "vitest ./test/vitest/vitest.spec.js",
    "promisefinallytest": "mocha ./test/promise/promise.finally.spec.mjs"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/angular/angular.git",
    "directory": "packages/zone.js"
  },
  "publishConfig": {
    "registry": "https://wombat-dressing-room.appspot.com"
  },
  "author": "Brian Ford",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/angular/angular/issues"
  },
  "exports": {
    "./package.json": {
      "default": "./package.json"
    },
    ".": {
      "types": "./zone.d.ts",
      "require": "./bundles/zone.umd.js",
      "default": "./fesm2015/zone.js"
    },
    "./testing": {
      "require": "./bundles/zone-testing.umd.js",
      "default": "./fesm2015/zone-testing.js"
    },
    "./node": {
      "require": "./bundles/zone-node.umd.js",
      "default": "./fesm2015/zone-node.js"
    },
    "./mix": {
      "require": "./bundles/zone-mix.umd.js",
      "default": "./fesm2015/zone-mix.js"
    },
    "./plugins/*.min": {
      "require": "./bundles/*.umd.min.js",
      "default": "./fesm2015/*.min.js"
    },
    "./plugins/*": {
      "require": "./bundles/*.umd.js",
      "default": "./fesm2015/*.js"
    }
  }
}
>y`xa import './lib/zone';
import './lib/zone.api.extensions';
import './lib/zone.configurations.api';
k!+xE %40000 components N
 z]Y4%4QHc`3D'mѲxM@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

// Code block component styles with design token integration
.code-block {
  position: relative;
  width: 100%;
  font-family: 'Roboto Mono', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace;
  font-size: $base-typography-font-size-sm;
  background: var(--code-bg, #{$semantic-color-surface-primary});
  
  // Variant styles
  &--default {
    border: $semantic-border-card-width $semantic-border-card-style var(--code-border, #{$semantic-color-border-secondary});
    border-radius: $semantic-border-card-radius;
    overflow: hidden;
  }
  
  &--minimal {
    border: none;
    border-radius: 0;
  }
  
  &--bordered {
    border-left: 4px solid var(--code-keyword, #{$semantic-color-brand-primary});
    padding-left: $semantic-spacing-component-md;
  }
  
  // Wrapping variant
  &--wrap {
    .code-block__code {
      white-space: pre-wrap;
      word-break: break-word;
    }
  }
  
  // Copyable variant
  &--copyable {
    &:hover .code-block__copy-btn {
      opacity: 1;
    }
  }
}

.code-block__copy-btn {
  position: absolute;
  top: $semantic-spacing-component-sm;
  right: $semantic-spacing-component-sm;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2rem;
  height: 2rem;
  padding: 0;
  border: none;
  background: var(--code-surface, #{$semantic-color-surface-secondary});
  color: var(--code-text, #{$semantic-color-text-secondary});
  border-radius: $semantic-border-button-radius;
  cursor: pointer;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  opacity: 0;
  z-index: 1;
  
  &:hover {
    background: var(--code-border, #{$semantic-color-surface-elevated});
    color: var(--code-text, #{$semantic-color-text-primary});
  }
  
  &:active {
    transform: scale(0.95);
  }
  
  &:focus-visible {
    opacity: 1;
    outline: $semantic-border-focus-width solid var(--code-keyword, #{$semantic-color-focus});
    outline-offset: 2px;
  }
}

.code-block__pre {
  margin: 0;
  padding: $semantic-spacing-component-md;
  background: transparent;
  overflow-x: auto;
  font-family: inherit;
  font-size: inherit;
  line-height: $base-typography-line-height-relaxed;
  display: flex;
  
  &--with-line-numbers {
    .code-block__code {
      padding-left: $semantic-spacing-component-md;
    }
  }
  
  .code-block--minimal & {
    padding: 0;
  }
  
  .code-block--bordered & {
    padding-left: 0;
  }
}

// Line numbers
.code-block__line-numbers {
  display: flex;
  flex-direction: column;
  padding-right: $semantic-spacing-component-md;
  border-right: $semantic-border-separator-width $semantic-border-separator-style var(--code-border, #{$semantic-color-border-subtle});
  user-select: none;
  min-width: 3ch;
  text-align: right;
  flex-shrink: 0;
}

.code-block__line-number {
  color: var(--code-line-number, #{$semantic-color-text-tertiary});
  font-size: inherit;
  line-height: inherit;
  padding: 0 $semantic-spacing-component-xs;
  
  &--highlighted {
    background: var(--code-line-highlight, #{$semantic-color-container-primary});
    color: var(--code-text, #{$semantic-color-text-primary});
  }
}

// Code content
.code-block__code {
  display: block;
  padding: 0;
  margin: 0;
  background: transparent;
  color: var(--code-text, #{$semantic-color-text-primary});
  font-family: inherit;
  font-size: inherit;
  line-height: inherit;
  white-space: pre;
  overflow: visible;
  flex: 1;
  min-width: 0;
  
  // Syntax highlighting styles
  .token.comment,
  .token.prolog,
  .token.doctype,
  .token.cdata {
    color: var(--code-comment, #{$semantic-color-text-tertiary});
    font-style: italic;
  }
  
  .token.keyword,
  .token.control,
  .token.directive,
  .token.unit {
    color: var(--code-keyword, #{$semantic-color-brand-primary});
    font-weight: $base-typography-font-weight-medium;
  }
  
  .token.string,
  .token.attr-value {
    color: var(--code-string, #{$semantic-color-success});
  }
  
  .token.number {
    color: var(--code-number, #{$semantic-color-warning});
  }
  
  .token.function,
  .token.class-name {
    color: var(--code-function, #{$semantic-color-interactive-primary});
  }
  
  .token.operator,
  .token.entity,
  .token.url {
    color: var(--code-operator, #{$semantic-color-text-primary});
  }
  
  .token.punctuation {
    color: var(--code-punctuation, #{$semantic-color-text-secondary});
  }
  
  .token.variable {
    color: var(--code-variable, #{$semantic-color-text-primary});
  }
  
  .token.boolean,
  .token.constant {
    color: var(--code-keyword, #{$semantic-color-brand-primary});
  }
  
  .token.property,
  .token.attr-name {
    color: var(--code-function, #{$semantic-color-interactive-primary});
  }
  
  .token.selector,
  .token.tag {
    color: var(--code-keyword, #{$semantic-color-brand-primary});
  }
  
  .token.important {
    font-weight: $base-typography-font-weight-bold;
  }
  
  .token.bold {
    font-weight: $base-typography-font-weight-bold;
  }
  
  .token.italic {
    font-style: italic;
  }
}

// Responsive adjustments
@media (max-width: 768px) {
  .code-block__pre {
    padding: $semantic-spacing-component-sm;
  }
  
  .code-block__copy-btn {
    top: $semantic-spacing-component-xs;
    right: $semantic-spacing-component-xs;
  }
}F*@xۤ٩PtFL`F?AF0#7 
ex\import { Component, Input, computed, signal, ChangeDetectionStrategy, ViewEncapsulation, OnInit, OnChanges, SimpleChanges } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SyntaxHighlighterService } from '../../services/syntax-highlighter.service';
import { CodeThemeService, CodeTheme } from '../../services/theme.service';
import { CopyButtonDirective } from '../../directives/copy-button.directive';

export type CodeBlockVariant = 'default' | 'minimal' | 'bordered';

@Component({
  selector: 'ui-code-block',
  standalone: true,
  imports: [CommonModule, CopyButtonDirective],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div [class]="containerClasses()">
      @if (copyable) {
        <button 
          type="button"
          class="code-block__copy-btn"
          [uiCopyButton]="code"
          [attr.aria-label]="'Copy code to clipboard'"
          title="Copy code">
          <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
            <path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/>
          </svg>
        </button>
      }
      
      <pre [class]="preClasses()">
        @if (showLineNumbers && lineCount() > 1) {
          <div class="code-block__line-numbers" [attr.aria-hidden]="true">
            @for (lineNum of lineNumbers(); track lineNum) {
              <span 
                class="code-block__line-number"
                [class.code-block__line-number--highlighted]="isLineHighlighted(lineNum)">
                {{ lineNum }}
              </span>
            }
          </div>
        }
        
        <code 
          [class]="codeClasses()"
          [innerHTML]="highlightedCode()">
        </code>
      </pre>
    </div>
  `,
  styleUrl: './code-block.component.scss'
})
export class CodeBlockComponent implements OnInit, OnChanges {
  @Input() code = '';
  @Input() language = '';
  @Input() theme: CodeTheme | null = null;
  @Input() variant: CodeBlockVariant = 'default';
  @Input() showLineNumbers = true;
  @Input() copyable = true;
  @Input() highlightLines: (number | string)[] = [];
  @Input() startLineNumber = 1;
  @Input() wrap = false;

  constructor(
    private syntaxHighlighter: SyntaxHighlighterService,
    private themeService: CodeThemeService
  ) {}

  readonly finalLanguage = computed(() => {
    if (this.language) {
      return this.language;
    }
    return this.syntaxHighlighter.detectLanguage(this.code);
  });

  readonly highlightedCode = signal('');

  private async updateHighlightedCode() {
    if (!this.code) {
      this.highlightedCode.set('');
      return;
    }
    
    const lang = this.finalLanguage();
    try {
      const highlighted = await this.syntaxHighlighter.highlight(this.code, {
        language: lang,
        lineNumbers: this.showLineNumbers,
        highlightLines: this.highlightLines
      });
      this.highlightedCode.set(highlighted);
    } catch (error) {
      console.warn('Failed to highlight code:', error);
      this.highlightedCode.set(this.escapeHtml(this.code));
    }
  }

  readonly lineCount = computed(() => {
    return this.code ? this.code.split('\n').length : 0;
  });

  readonly lineNumbers = computed(() => {
    const count = this.lineCount();
    return Array.from({ length: count }, (_, i) => i + this.startLineNumber);
  });

  readonly currentTheme = computed(() => {
    return this.theme || this.themeService.theme();
  });

  readonly containerClasses = computed(() => {
    const classes = ['code-block'];
    classes.push(`code-block--${this.variant}`);
    classes.push(`code-theme-${this.currentTheme()}`);
    
    if (this.wrap) classes.push('code-block--wrap');
    if (this.copyable) classes.push('code-block--copyable');
    
    return classes.join(' ');
  });

  readonly preClasses = computed(() => {
    const classes = ['code-block__pre'];
    if (this.showLineNumbers && this.lineCount() > 1) {
      classes.push('code-block__pre--with-line-numbers');
    }
    return classes.join(' ');
  });

  readonly codeClasses = computed(() => {
    const classes = ['code-block__code'];
    classes.push(`language-${this.finalLanguage()}`);
    return classes.join(' ');
  });

  isLineHighlighted(lineNumber: number): boolean {
    return this.highlightLines.some(highlight => {
      if (typeof highlight === 'number') {
        return highlight === lineNumber;
      }
      
      // Handle range format like "5-10"
      const range = highlight.toString().split('-');
      if (range.length === 2) {
        const start = parseInt(range[0], 10);
        const end = parseInt(range[1], 10);
        return lineNumber >= start && lineNumber <= end;
      }
      
      return false;
    });
  }

  ngOnInit(): void {
    this.updateHighlightedCode();
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes['code'] || changes['language']) {
      this.updateHighlightedCode();
    }
  }

  private escapeHtml(text: string): string {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
  }
}WR3jx$(*divdivif (!this.code) return 0;
    
    const lines = this.code.split('\n');
    // Remove the last empty line if the code ends with a newline
    if (lines.length > 1 && lines[lines.length - 1] === '') {
      return lines.length - 1;
    }
    return lines.lengthx%O\x)@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

// Code snippet component styles with design token integration
.code-snippet {
  position: relative;
  width: 100%;
  border-radius: $semantic-border-card-radius;
  border: $semantic-border-card-width $semantic-border-card-style var(--code-border, #{$semantic-color-border-secondary});
  background: var(--code-bg, #{$semantic-color-surface-primary});
  overflow: hidden;
  font-family: 'Roboto Mono', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace;
  
  // Size variants
  &--sm {
    font-size: $base-typography-font-size-xs;
    
    .code-snippet__header {
      padding: $semantic-spacing-component-padding-xs $semantic-spacing-component-padding-sm;
      gap: $semantic-spacing-component-xs;
    }
    
    .code-snippet__content {
      padding: $semantic-spacing-component-padding-xs $semantic-spacing-component-padding-sm;
    }
  }
  
  &--md {
    font-size: $base-typography-font-size-sm;
    
    .code-snippet__header {
      padding: $semantic-spacing-component-padding-sm $semantic-spacing-component-padding-md;
      gap: $semantic-spacing-component-sm;
    }
    
    .code-snippet__content {
      padding: $semantic-spacing-component-padding-sm $semantic-spacing-component-padding-md;
    }
  }
  
  &--lg {
    font-size: $base-typography-font-size-md;
    
    .code-snippet__header {
      padding: $semantic-spacing-component-padding-md $semantic-spacing-component-padding-lg;
      gap: $semantic-spacing-component-md;
    }
    
    .code-snippet__content {
      padding: $semantic-spacing-component-padding-md $semantic-spacing-component-padding-lg;
    }
  }
  
  // Wrapping variant
  &--wrap {
    .code-snippet__code {
      white-space: pre-wrap;
      word-break: break-word;
    }
  }
  
  // Constrained height variant
  &--constrained {
    .code-snippet__content {
      max-height: var(--max-height);
      overflow: hidden;
      position: relative;
      
      &::after {
        content: '';
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        height: $semantic-spacing-component-xl;
        background: linear-gradient(to bottom, transparent, var(--code-bg, #{$semantic-color-surface-primary}));
        pointer-events: none;
      }
    }
  }
}

// Header section
.code-snippet__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: var(--code-surface, #{$semantic-color-surface-secondary});
  border-bottom: $semantic-border-divider-width $semantic-border-divider-style var(--code-border, #{$semantic-color-border-secondary});
  color: var(--code-text, #{$semantic-color-text-primary});
}

.code-snippet__title {
  font-weight: $base-typography-font-weight-medium;
  color: var(--code-text, #{$semantic-color-text-primary});
}

.code-snippet__actions {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-sm;
}

.code-snippet__language-badge {
  padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  background: var(--code-keyword, #{$semantic-color-interactive-primary});
  color: white;
  border-radius: $semantic-border-input-radius;
  font-size: $base-typography-font-size-xs;
  font-weight: $base-typography-font-weight-medium;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.code-snippet__copy-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2rem;
  height: 2rem;
  padding: 0;
  border: none;
  background: transparent;
  color: var(--code-text, #{$semantic-color-text-secondary});
  border-radius: $semantic-border-button-radius;
  cursor: pointer;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  
  &:hover {
    background: var(--code-surface, #{$semantic-color-surface-elevated});
    color: var(--code-text, #{$semantic-color-text-primary});
  }
  
  &:active {
    transform: scale(0.95);
  }
  
  &:focus-visible {
    outline: $semantic-border-focus-width solid var(--code-keyword, #{$semantic-color-focus});
    outline-offset: 2px;
  }
}

// Content area
.code-snippet__content {
  position: relative;
  overflow-x: auto;
  background: var(--code-bg, #{$semantic-color-surface-primary});
}

.code-snippet__pre {
  margin: 0;
  padding: 0;
  background: transparent;
  overflow: visible;
  font-family: inherit;
  font-size: inherit;
  line-height: $base-typography-line-height-relaxed;
  display: flex;
  
  &--with-line-numbers {
    .code-snippet__code {
      padding-left: $semantic-spacing-component-md;
    }
  }
}

// Line numbers
.code-snippet__line-numbers {
  display: flex;
  flex-direction: column;
  padding-right: $semantic-spacing-component-md;
  border-right: $semantic-border-separator-width $semantic-border-separator-style var(--code-border, #{$semantic-color-border-subtle});
  user-select: none;
  min-width: 3ch;
  text-align: right;
}

.code-snippet__line-number {
  color: var(--code-line-number, #{$semantic-color-text-tertiary});
  font-size: inherit;
  line-height: inherit;
  padding: 0 $semantic-spacing-component-xs;
  
  &--highlighted {
    background: var(--code-line-highlight, #{$semantic-color-container-primary});
    color: var(--code-text, #{$semantic-color-text-primary});
  }
}

// Code content
.code-snippet__code {
  display: block;
  padding: 0;
  margin: 0;
  background: transparent;
  color: var(--code-text, #{$semantic-color-text-primary});
  font-family: inherit;
  font-size: inherit;
  line-height: inherit;
  white-space: pre;
  overflow: visible;
  flex: 1;
  
  // Syntax highlighting styles
  .token.comment,
  .token.prolog,
  .token.doctype,
  .token.cdata {
    color: var(--code-comment, #{$semantic-color-text-tertiary});
    font-style: italic;
  }
  
  .token.keyword,
  .token.control,
  .token.directive,
  .token.unit {
    color: var(--code-keyword, #{$semantic-color-brand-primary});
    font-weight: $base-typography-font-weight-medium;
  }
  
  .token.string,
  .token.attr-value {
    color: var(--code-string, #{$semantic-color-success});
  }
  
  .token.number {
    color: var(--code-number, #{$semantic-color-warning});
  }
  
  .token.function,
  .token.class-name {
    color: var(--code-function, #{$semantic-color-interactive-primary});
  }
  
  .token.operator,
  .token.entity,
  .token.url {
    color: var(--code-operator, #{$semantic-color-text-primary});
  }
  
  .token.punctuation {
    color: var(--code-punctuation, #{$semantic-color-text-secondary});
  }
  
  .token.variable {
    color: var(--code-variable, #{$semantic-color-text-primary});
  }
  
  .token.boolean,
  .token.constant {
    color: var(--code-keyword, #{$semantic-color-brand-primary});
  }
  
  .token.property,
  .token.attr-name {
    color: var(--code-function, #{$semantic-color-interactive-primary});
  }
  
  .token.selector,
  .token.tag {
    color: var(--code-keyword, #{$semantic-color-brand-primary});
  }
}

// Expand section
.code-snippet__expand {
  display: flex;
  justify-content: center;
  padding: $semantic-spacing-component-sm;
  background: var(--code-surface, #{$semantic-color-surface-secondary});
  border-top: $semantic-border-separator-width $semantic-border-separator-style var(--code-border, #{$semantic-color-border-secondary});
}

.code-snippet__expand-btn {
  padding: $semantic-spacing-component-xs $semantic-spacing-component-md;
  border: $semantic-border-button-width $semantic-border-button-style var(--code-border, #{$semantic-color-border-primary});
  border-radius: $semantic-border-button-radius;
  background: var(--code-bg, #{$semantic-color-surface-primary});
  color: var(--code-text, #{$semantic-color-text-primary});
  font-size: $base-typography-font-size-sm;
  cursor: pointer;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  
  &:hover {
    background: var(--code-surface, #{$semantic-color-surface-elevated});
  }
  
  &:focus-visible {
    outline: $semantic-border-focus-width solid var(--code-keyword, #{$semantic-color-focus});
    outline-offset: 2px;
  }
}

// Theme-specific overrides
.code-theme-github-light {
  --code-bg: #{$semantic-color-surface-primary};
  --code-surface: #{$semantic-color-surface-secondary};
  --code-text: #{$semantic-color-text-primary};
  --code-comment: #{$semantic-color-text-tertiary};
  --code-keyword: #{$semantic-color-brand-primary};
  --code-string: #{$semantic-color-success};
  --code-number: #{$semantic-color-warning};
  --code-function: #{$semantic-color-interactive-primary};
  --code-operator: #{$semantic-color-text-primary};
  --code-punctuation: #{$semantic-color-text-secondary};
  --code-variable: #{$semantic-color-text-primary};
  --code-line-number: #{$semantic-color-text-tertiary};
  --code-line-highlight: #{$semantic-color-container-primary};
  --code-border: #{$semantic-color-border-secondary};
}

.code-theme-github-dark {
  --code-bg: #0d1117;
  --code-surface: #161b22;
  --code-text: #f0f6fc;
  --code-comment: #8b949e;
  --code-keyword: #ff7b72;
  --code-string: #a5d6ff;
  --code-number: #79c0ff;
  --code-function: #d2a8ff;
  --code-operator: #f0f6fc;
  --code-punctuation: #c9d1d9;
  --code-variable: #f0f6fc;
  --code-line-number: #8b949e;
  --code-line-highlight: rgba(255, 211, 61, 0.08);
  --code-border: #30363d;
}

.code-theme-one-dark {
  --code-bg: #282c34;
  --code-surface: #3e4451;
  --code-text: #abb2bf;
  --code-comment: #5c6370;
  --code-keyword: #c678dd;
  --code-string: #98c379;
  --code-number: #d19a66;
  --code-function: #61afef;
  --code-operator: #abb2bf;
  --code-punctuation: #abb2bf;
  --code-variable: #e06c75;
  --code-line-number: #5c6370;
  --code-line-highlight: #3e4451;
  --code-border: #3e4451;
}

.code-theme-material {
  --code-bg: #263238;
  --code-surface: #37474f;
  --code-text: #eeffff;
  --code-comment: #546e7a;
  --code-keyword: #c792ea;
  --code-string: #c3e88d;
  --code-number: #f78c6c;
  --code-function: #82aaff;
  --code-operator: #89ddff;
  --code-punctuation: #89ddff;
  --code-variable: #eeffff;
  --code-line-number: #546e7a;
  --code-line-highlight: #37474f;
  --code-border: #37474f;
}

.code-theme-dracula {
  --code-bg: #282a36;
  --code-surface: #44475a;
  --code-text: #f8f8f2;
  --code-comment: #6272a4;
  --code-keyword: #ff79c6;
  --code-string: #f1fa8c;
  --code-number: #bd93f9;
  --code-function: #8be9fd;
  --code-operator: #ff79c6;
  --code-punctuation: #f8f8f2;
  --code-variable: #f8f8f2;
  --code-line-number: #6272a4;
  --code-line-highlight: #44475a;
  --code-border: #44475a;
}ʊDxkzAKPz!d% O8xvimport { Component, Input, Output, EventEmitter, computed, signal, ChangeDetectionStrategy, ViewEncapsulation, OnInit, OnChanges, SimpleChanges } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SyntaxHighlighterService } from '../../services/syntax-highlighter.service';
import { CodeThemeService, CodeTheme } from '../../services/theme.service';
import { CopyButtonDirective } from '../../directives/copy-button.directive';

export type CodeSnippetSize = 'sm' | 'md' | 'lg';

@Component({
  selector: 'ui-code-snippet',
  standalone: true,
  imports: [CommonModule, CopyButtonDirective],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div [class]="containerClasses()">
      @if (title || showLanguage || copyable) {
        <div class="code-snippet__header">
          @if (title) {
            <span class="code-snippet__title">{{ title }}</span>
          }
          
          <div class="code-snippet__actions">
            @if (showLanguage && finalLanguage()) {
              <span class="code-snippet__language-badge">{{ finalLanguage() }}</span>
            }
            
            @if (copyable) {
              <button 
                type="button"
                class="code-snippet__copy-btn"
                [uiCopyButton]="code"
                [attr.aria-label]="'Copy code to clipboard'"
                title="Copy code">
                <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
                  <path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/>
                </svg>
              </button>
            }
          </div>
        </div>
      }
      
      <div class="code-snippet__content">
        <pre [class]="preClasses()">
          @if (showLineNumbers && lineCount() > 1) {
            <div class="code-snippet__line-numbers" [attr.aria-hidden]="true">
              @for (lineNum of lineNumbers(); track lineNum) {
                <span 
                  class="code-snippet__line-number"
                  [class.code-snippet__line-number--highlighted]="isLineHighlighted(lineNum)">
                  {{ lineNum }}
                </span>
              }
            </div>
          }
          
          <code 
            [class]="codeClasses()"
            [innerHTML]="highlightedCode()">
          </code>
        </pre>
      </div>
      
      @if (maxHeight && !expanded() && isOverflowing()) {
        <div class="code-snippet__expand">
          <button 
            type="button"
            class="code-snippet__expand-btn"
            (click)="toggleExpanded()"
            [attr.aria-expanded]="expanded()">
            Show {{ isOverflowing() ? 'more' : 'less' }}
          </button>
        </div>
      }
    </div>
  `,
  styleUrl: './code-snippet.component.scss'
})
export class CodeSnippetComponent implements OnInit, OnChanges {
  @Input() code = '';
  @Input() language = '';
  @Input() title = '';
  @Input() theme: CodeTheme | null = null;
  @Input() size: CodeSnippetSize = 'md';
  @Input() showLineNumbers = false;
  @Input() copyable = true;
  @Input() showLanguage = true;
  @Input() highlightLines: (number | string)[] = [];
  @Input() maxHeight: string | null = null;
  @Input() wrap = false;
  @Input() startLineNumber = 1;

  @Output() codeChange = new EventEmitter<string>();
  @Output() languageChange = new EventEmitter<string>();

  readonly expanded = signal(false);

  constructor(
    private syntaxHighlighter: SyntaxHighlighterService,
    private themeService: CodeThemeService
  ) {}

  readonly finalLanguage = computed(() => {
    if (this.language) {
      return this.language;
    }
    return this.syntaxHighlighter.detectLanguage(this.code);
  });

  readonly highlightedCode = signal('');

  private async updateHighlightedCode() {
    if (!this.code) {
      this.highlightedCode.set('');
      return;
    }
    
    const lang = this.finalLanguage();
    try {
      const highlighted = await this.syntaxHighlighter.highlight(this.code, {
        language: lang,
        lineNumbers: this.showLineNumbers,
        highlightLines: this.highlightLines
      });
      this.highlightedCode.set(highlighted);
    } catch (error) {
      console.warn('Failed to highlight code:', error);
      this.highlightedCode.set(this.escapeHtml(this.code));
    }
  }

  readonly lineCount = computed(() => {
    return this.code ? this.code.split('\n').length : 0;
  });

  readonly lineNumbers = computed(() => {
    const count = this.lineCount();
    return Array.from({ length: count }, (_, i) => i + this.startLineNumber);
  });

  readonly currentTheme = computed(() => {
    return this.theme || this.themeService.theme();
  });

  readonly containerClasses = computed(() => {
    const classes = ['code-snippet'];
    classes.push(`code-snippet--${this.size}`);
    classes.push(`code-theme-${this.currentTheme()}`);
    
    if (this.wrap) classes.push('code-snippet--wrap');
    if (this.maxHeight && !this.expanded()) classes.push('code-snippet--constrained');
    
    return classes.join(' ');
  });

  readonly preClasses = computed(() => {
    const classes = ['code-snippet__pre'];
    if (this.showLineNumbers && this.lineCount() > 1) {
      classes.push('code-snippet__pre--with-line-numbers');
    }
    return classes.join(' ');
  });

  readonly codeClasses = computed(() => {
    const classes = ['code-snippet__code'];
    classes.push(`language-${this.finalLanguage()}`);
    return classes.join(' ');
  });

  isLineHighlighted(lineNumber: number): boolean {
    return this.highlightLines.some(highlight => {
      if (typeof highlight === 'number') {
        return highlight === lineNumber;
      }
      
      // Handle range format like "5-10"
      const range = highlight.toString().split('-');
      if (range.length === 2) {
        const start = parseInt(range[0], 10);
        const end = parseInt(range[1], 10);
        return lineNumber >= start && lineNumber <= end;
      }
      
      return false;
    });
  }

  isOverflowing(): boolean {
    // This would need to be implemented with ViewChild and element measurements
    // For now, return true if content is long
    return this.lineCount() > 20;
  }

  toggleExpanded(): void {
    this.expanded.update(val => !val);
  }

  ngOnInit(): void {
    this.updateHighlightedCode();
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes['code'] || changes['language']) {
      this.updateHighlightedCode();
    }
  }

  private escapeHtml(text: string): string {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
  }
}$xA@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

// Inline code component styles with design token integration
.inline-code {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: $semantic-spacing-component-xs;
  background: var(--code-surface, #{$semantic-color-surface-secondary});
  border: $semantic-border-input-width $semantic-border-input-style var(--code-border, #{$semantic-color-border-secondary});
  border-radius: $semantic-border-input-radius;
  font-family: 'Roboto Mono', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace;
  
  // Size variants
  &--xs {
    padding: $semantic-spacing-component-xs;
    font-size: $base-typography-font-size-xs;
  }
  
  &--sm {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    font-size: $base-typography-font-size-sm;
  }
  
  &--md {
    padding: $semantic-spacing-component-sm;
    font-size: $base-typography-font-size-sm;
  }
  
  &--lg {
    padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    font-size: $base-typography-font-size-md;
  }
  
  // Copyable variant
  &--copyable {
    padding-right: calc(#{$semantic-spacing-component-sm} + 1.5rem + #{$semantic-spacing-component-xs});
  }
}

.inline-code__code {
  display: inline;
  padding: 0;
  margin: 0;
  background: transparent;
  border: none;
  color: var(--code-text, #{$semantic-color-text-primary});
  font-family: inherit;
  font-size: inherit;
  line-height: 1.2;
  white-space: nowrap;
  
  // Syntax highlighting styles (simplified for inline use)
  .token.comment {
    color: var(--code-comment, #{$semantic-color-text-tertiary});
    font-style: italic;
  }
  
  .token.keyword {
    color: var(--code-keyword, #{$semantic-color-brand-primary});
    font-weight: $base-typography-font-weight-medium;
  }
  
  .token.string {
    color: var(--code-string, #{$semantic-color-success});
  }
  
  .token.number {
    color: var(--code-number, #{$semantic-color-warning});
  }
  
  .token.function {
    color: var(--code-function, #{$semantic-color-interactive-primary});
  }
  
  .token.operator {
    color: var(--code-operator, #{$semantic-color-text-primary});
  }
  
  .token.punctuation {
    color: var(--code-punctuation, #{$semantic-color-text-secondary});
  }
  
  .token.variable {
    color: var(--code-variable, #{$semantic-color-text-primary});
  }
  
  .token.boolean,
  .token.constant {
    color: var(--code-keyword, #{$semantic-color-brand-primary});
  }
}

.inline-code__copy-btn {
  position: absolute;
  right: $semantic-spacing-component-xs;
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.25rem;
  height: 1.25rem;
  padding: 0;
  border: none;
  background: transparent;
  color: var(--code-comment, #{$semantic-color-text-tertiary});
  border-radius: calc(#{$semantic-border-button-radius} * 0.5);
  cursor: pointer;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  opacity: 0;
  
  .inline-code:hover & {
    opacity: 1;
  }
  
  &:hover {
    background: var(--code-bg, #{$semantic-color-surface-primary});
    color: var(--code-text, #{$semantic-color-text-primary});
  }
  
  &:active {
    transform: translateY(-50%) scale(0.9);
  }
  
  &:focus-visible {
    opacity: 1;
    outline: 1px solid var(--code-keyword, #{$semantic-color-focus});
    outline-offset: 1px;
  }
  
  svg {
    width: 10px;
    height: 10px;
  }
}

// Theme inheritance from parent
.inline-code {
  // Themes are handled by parent code-theme- classes
  // or can be applied directly to inline-code elements
}[xAimport { Component, Input, computed, signal, ChangeDetectionStrategy, ViewEncapsulation, OnInit, OnChanges, SimpleChanges } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SyntaxHighlighterService } from '../../services/syntax-highlighter.service';
import { CodeThemeService, CodeTheme } from '../../services/theme.service';
import { CopyButtonDirective } from '../../directives/copy-button.directive';

export type InlineCodeSize = 'xs' | 'sm' | 'md' | 'lg';

@Component({
  selector: 'ui-inline-code',
  standalone: true,
  imports: [CommonModule, CopyButtonDirective],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <span [class]="containerClasses()">
      <code 
        [class]="codeClasses()"
        [innerHTML]="highlightedCode()">
      </code>
      
      @if (copyable) {
        <button 
          type="button"
          class="inline-code__copy-btn"
          [uiCopyButton]="code"
          [attr.aria-label]="'Copy code to clipboard'"
          title="Copy code">
          <svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
            <path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/>
          </svg>
        </button>
      }
    </span>
  `,
  styleUrl: './inline-code.component.scss'
})
export class InlineCodeComponent implements OnInit, OnChanges {
  @Input() code = '';
  @Input() language = '';
  @Input() theme: CodeTheme | null = null;
  @Input() size: InlineCodeSize = 'md';
  @Input() copyable = false;

  constructor(
    private syntaxHighlighter: SyntaxHighlighterService,
    private themeService: CodeThemeService
  ) {}

  readonly finalLanguage = computed(() => {
    if (this.language) {
      return this.language;
    }
    // For inline code, we're more conservative with auto-detection
    return 'text';
  });

  readonly highlightedCode = signal('');

  private async updateHighlightedCode() {
    if (!this.code) {
      this.highlightedCode.set('');
      return;
    }
    
    const lang = this.finalLanguage();
    if (lang === 'text') {
      this.highlightedCode.set(this.escapeHtml(this.code));
      return;
    }
    
    try {
      const highlighted = await this.syntaxHighlighter.highlight(this.code, {
        language: lang
      });
      this.highlightedCode.set(highlighted);
    } catch (error) {
      console.warn('Failed to highlight code:', error);
      this.highlightedCode.set(this.escapeHtml(this.code));
    }
  }

  readonly currentTheme = computed(() => {
    return this.theme || this.themeService.theme();
  });

  readonly containerClasses = computed(() => {
    const classes = ['inline-code'];
    classes.push(`inline-code--${this.size}`);
    classes.push(`code-theme-${this.currentTheme()}`);
    
    if (this.copyable) classes.push('inline-code--copyable');
    
    return classes.join(' ');
  });

  readonly codeClasses = computed(() => {
    const classes = ['inline-code__code'];
    classes.push(`language-${this.finalLanguage()}`);
    return classes.join(' ');
  });

  ngOnInit(): void {
    this.updateHighlightedCode();
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes['code'] || changes['language']) {
      this.updateHighlightedCode();
    }
  }

  private escapeHtml(text: string): string {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
  }
}
Tx=import { Directive, Input, HostListener, inject, signal } from '@angular/core';

@Directive({
  selector: '[uiCopyButton]',
  standalone: true
})
export class CopyButtonDirective {
  @Input() uiCopyButton!: string;
  @Input() copySuccessMessage = 'Copied!';
  @Input() copyErrorMessage = 'Failed to copy';

  private copied = signal(false);
  private timeoutId: number | null = null;

  @HostListener('click', ['$event'])
  async onClick(event: Event): Promise<void> {
    event.preventDefault();
    event.stopPropagation();

    if (!this.uiCopyButton) {
      console.warn('No content provided to copy');
      return;
    }

    try {
      await this.copyToClipboard(this.uiCopyButton);
      this.showFeedback(true);
    } catch (error) {
      console.error('Failed to copy to clipboard:', error);
      this.showFeedback(false);
    }
  }

  private async copyToClipboard(text: string): Promise<void> {
    if (navigator.clipboard && window.isSecureContext) {
      // Use modern clipboard API
      await navigator.clipboard.writeText(text);
    } else {
      // Fallback for older browsers or non-secure contexts
      this.fallbackCopyToClipboard(text);
    }
  }

  private fallbackCopyToClipboard(text: string): void {
    const textArea = document.createElement('textarea');
    textArea.value = text;
    textArea.style.position = 'fixed';
    textArea.style.left = '-999999px';
    textArea.style.top = '-999999px';
    document.body.appendChild(textArea);
    textArea.focus();
    textArea.select();
    
    try {
      document.execCommand('copy');
    } catch (error) {
      throw new Error('Fallback copy failed');
    } finally {
      document.body.removeChild(textArea);
    }
  }

  private showFeedback(success: boolean): void {
    this.copied.set(success);
    
    // Clear existing timeout
    if (this.timeoutId) {
      clearTimeout(this.timeoutId);
    }
    
    // Reset after 2 seconds
    this.timeoutId = window.setTimeout(() => {
      this.copied.set(false);
      this.timeoutId = null;
    }, 2000);
  }

  get isCopied(): boolean {
    return this.copied();
  }
}	8ximport { Injectable } from '@angular/core';

export interface HighlightOptions {
  language: string;
  lineNumbers?: boolean;
  highlightLines?: (number | string)[];
}

@Injectable({
  providedIn: 'root'
})
export class SyntaxHighlighterService {

  private supportedLanguages = new Set([
    'javascript', 'typescript', 'css', 'scss', 'html', 'json', 
    'bash', 'python', 'java', 'csharp', 'markup'
  ]);

  private prismLoaded = false;
  private loadPromise: Promise<any> | null = null;

  constructor() {}

  async highlight(code: string, options: HighlightOptions): Promise<string> {
    const { language } = options;
    
    if (!this.isLanguageSupported(language)) {
      return this.escapeHtml(code);
    }

    try {
      const Prism = await this.loadPrism();
      await this.loadLanguage(language);
      
      const grammar = Prism.languages[language];
      if (!grammar) {
        return this.escapeHtml(code);
      }

      return Prism.highlight(code, grammar, language);
    } catch (error) {
      console.warn('Failed to highlight code:', error);
      return this.escapeHtml(code);
    }
  }

  private async loadPrism(): Promise<any> {
    if (this.prismLoaded && (window as any).Prism) {
      return (window as any).Prism;
    }

    if (this.loadPromise) {
      return this.loadPromise;
    }

    this.loadPromise = new Promise(async (resolve, reject) => {
      try {
        if (typeof window === 'undefined') {
          // Server-side rendering fallback
          resolve({ highlight: () => '', languages: {} });
          return;
        }

        // Load Prism core
        const prismModule = await import(/* @vite-ignore */ 'prismjs');
        const Prism = prismModule.default || prismModule;
        
        // Ensure global availability
        (window as any).Prism = Prism;
        this.prismLoaded = true;
        
        resolve(Prism);
      } catch (error) {
        console.warn('Failed to load Prism:', error);
        reject(error);
      }
    });

    return this.loadPromise;
  }

  private async loadLanguage(language: string): Promise<void> {
    if (typeof window === 'undefined') return;
    
    const Prism = (window as any).Prism;
    if (!Prism) return;

    // Check if language is already loaded
    if (Prism.languages[language]) {
      return;
    }

    try {
      // Map of language identifiers to their import paths
      const languageMap: Record<string, string> = {
        'typescript': 'prismjs/components/prism-typescript',
        'javascript': 'prismjs/components/prism-javascript',
        'css': 'prismjs/components/prism-css',
        'scss': 'prismjs/components/prism-scss',
        'json': 'prismjs/components/prism-json',
        'markup': 'prismjs/components/prism-markup',
        'html': 'prismjs/components/prism-markup',
        'bash': 'prismjs/components/prism-bash',
        'python': 'prismjs/components/prism-python',
        'java': 'prismjs/components/prism-java',
        'csharp': 'prismjs/components/prism-csharp'
      };

      const importPath = languageMap[language];
      if (importPath) {
        await import(/* @vite-ignore */ importPath);
      }
    } catch (error) {
      console.warn(`Failed to load language ${language}:`, error);
    }
  }

  isLanguageSupported(language: string): boolean {
    return this.supportedLanguages.has(language.toLowerCase());
  }

  detectLanguage(code: string): string {
    // Simple heuristics for language detection
    const trimmedCode = code.trim();
    
    if (trimmedCode.startsWith('<?') || trimmedCode.includes('<html>') || 
        /<\/?[a-z][\s\S]*>/i.test(trimmedCode)) {
      return 'markup';
    }
    
    if (trimmedCode.startsWith('{') || trimmedCode.startsWith('[')) {
      try {
        JSON.parse(trimmedCode);
        return 'json';
      } catch {}
    }
    
    if (trimmedCode.includes('function ') || trimmedCode.includes('const ') || 
        trimmedCode.includes('let ') || trimmedCode.includes('var ')) {
      if (trimmedCode.includes(': ') && (trimmedCode.includes('interface ') || 
          trimmedCode.includes('type '))) {
        return 'typescript';
      }
      return 'javascript';
    }
    
    if (trimmedCode.includes('#') && trimmedCode.includes('def ')) {
      return 'python';
    }
    
    if (trimmedCode.includes('public class ') || trimmedCode.includes('import java.')) {
      return 'java';
    }
    
    if (trimmedCode.includes('using System') || trimmedCode.includes('namespace ')) {
      return 'csharp';
    }
    
    if (trimmedCode.includes('#!/bin/') || trimmedCode.includes('echo ')) {
      return 'bash';
    }
    
    if (trimmedCode.includes('{') && (trimmedCode.includes('color:') || 
        trimmedCode.includes('margin:') || trimmedCode.includes('@'))) {
      return trimmedCode.includes('$') ? 'scss' : 'css';
    }
    
    return 'text';
  }

  getSupportedLanguages(): string[] {
    return Array.from(this.supportedLanguages).sort();
  }

  private escapeHtml(text: string): string {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
  }
}@x7(#n*O9// Skip loading for unsupported languages or use fallbackt<		// For now, just use the built-in languages or fallback gracefully
    // This avoids the import issues while still providing b[asic highlighting
    console.warn(`Language '${language}' not preloaded, using fallback`);Pnx]import { Injectable, signal, computed } from '@angular/core';

export type CodeTheme = 'github-light' | 'github-dark' | 'one-dark' | 'material' | 'dracula';

export interface ThemeColors {
  background: string;
  surface: string;
  text: string;
  comment: string;
  keyword: string;
  string: string;
  number: string;
  function: string;
  operator: string;
  punctuation: string;
  variable: string;
  lineNumber: string;
  lineHighlight: string;
  border: string;
}

@Injectable({
  providedIn: 'root'
})
export class CodeThemeService {
  
  private currentTheme = signal<CodeTheme>('github-light');
  
  readonly theme = this.currentTheme.asReadonly();
  
  readonly themeColors = computed(() => this.getThemeColors(this.currentTheme()));
  
  private themes: Record<CodeTheme, ThemeColors> = {
    'github-light': {
      background: 'var(--semantic-color-surface-primary, #ffffff)',
      surface: 'var(--semantic-color-surface-secondary, #f6f8fa)',
      text: 'var(--semantic-color-text-primary, #24292f)',
      comment: 'var(--semantic-color-text-tertiary, #6e7781)',
      keyword: 'var(--semantic-color-brand-primary, #cf222e)',
      string: 'var(--semantic-color-success, #0a3069)',
      number: 'var(--semantic-color-warning, #0550ae)',
      function: 'var(--semantic-color-interactive-primary, #8250df)',
      operator: 'var(--semantic-color-text-primary, #24292f)',
      punctuation: 'var(--semantic-color-text-secondary, #656d76)',
      variable: 'var(--semantic-color-text-primary, #24292f)',
      lineNumber: 'var(--semantic-color-text-tertiary, #656d76)',
      lineHighlight: 'var(--semantic-color-container-primary, #fff8c5)',
      border: 'var(--semantic-color-border-secondary, #d0d7de)'
    },
    
    'github-dark': {
      background: 'var(--semantic-color-surface-primary, #0d1117)',
      surface: 'var(--semantic-color-surface-secondary, #161b22)',
      text: 'var(--semantic-color-text-primary, #f0f6fc)',
      comment: 'var(--semantic-color-text-tertiary, #8b949e)',
      keyword: 'var(--semantic-color-brand-primary, #ff7b72)',
      string: 'var(--semantic-color-success, #a5d6ff)',
      number: 'var(--semantic-color-warning, #79c0ff)',
      function: 'var(--semantic-color-interactive-primary, #d2a8ff)',
      operator: 'var(--semantic-color-text-primary, #f0f6fc)',
      punctuation: 'var(--semantic-color-text-secondary, #c9d1d9)',
      variable: 'var(--semantic-color-text-primary, #f0f6fc)',
      lineNumber: 'var(--semantic-color-text-tertiary, #8b949e)',
      lineHighlight: 'var(--semantic-color-container-primary, #ffd33d14)',
      border: 'var(--semantic-color-border-secondary, #30363d)'
    },
    
    'one-dark': {
      background: 'var(--semantic-color-surface-primary, #282c34)',
      surface: 'var(--semantic-color-surface-secondary, #3e4451)',
      text: 'var(--semantic-color-text-primary, #abb2bf)',
      comment: 'var(--semantic-color-text-tertiary, #5c6370)',
      keyword: 'var(--semantic-color-brand-primary, #c678dd)',
      string: 'var(--semantic-color-success, #98c379)',
      number: 'var(--semantic-color-warning, #d19a66)',
      function: 'var(--semantic-color-interactive-primary, #61afef)',
      operator: 'var(--semantic-color-text-primary, #abb2bf)',
      punctuation: 'var(--semantic-color-text-secondary, #abb2bf)',
      variable: 'var(--semantic-color-text-primary, #e06c75)',
      lineNumber: 'var(--semantic-color-text-tertiary, #5c6370)',
      lineHighlight: 'var(--semantic-color-container-primary, #3e4451)',
      border: 'var(--semantic-color-border-secondary, #3e4451)'
    },
    
    'material': {
      background: 'var(--semantic-color-surface-primary, #263238)',
      surface: 'var(--semantic-color-surface-secondary, #37474f)',
      text: 'var(--semantic-color-text-primary, #eeffff)',
      comment: 'var(--semantic-color-text-tertiary, #546e7a)',
      keyword: 'var(--semantic-color-brand-primary, #c792ea)',
      string: 'var(--semantic-color-success, #c3e88d)',
      number: 'var(--semantic-color-warning, #f78c6c)',
      function: 'var(--semantic-color-interactive-primary, #82aaff)',
      operator: 'var(--semantic-color-text-primary, #89ddff)',
      punctuation: 'var(--semantic-color-text-secondary, #89ddff)',
      variable: 'var(--semantic-color-text-primary, #eeffff)',
      lineNumber: 'var(--semantic-color-text-tertiary, #546e7a)',
      lineHighlight: 'var(--semantic-color-container-primary, #37474f)',
      border: 'var(--semantic-color-border-secondary, #37474f)'
    },
    
    'dracula': {
      background: 'var(--semantic-color-surface-primary, #282a36)',
      surface: 'var(--semantic-color-surface-secondary, #44475a)',
      text: 'var(--semantic-color-text-primary, #f8f8f2)',
      comment: 'var(--semantic-color-text-tertiary, #6272a4)',
      keyword: 'var(--semantic-color-brand-primary, #ff79c6)',
      string: 'var(--semantic-color-success, #f1fa8c)',
      number: 'var(--semantic-color-warning, #bd93f9)',
      function: 'var(--semantic-color-interactive-primary, #8be9fd)',
      operator: 'var(--semantic-color-text-primary, #ff79c6)',
      punctuation: 'var(--semantic-color-text-secondary, #f8f8f2)',
      variable: 'var(--semantic-color-text-primary, #f8f8f2)',
      lineNumber: 'var(--semantic-color-text-tertiary, #6272a4)',
      lineHighlight: 'var(--semantic-color-container-primary, #44475a)',
      border: 'var(--semantic-color-border-secondary, #44475a)'
    }
  };

  setTheme(theme: CodeTheme): void {
    this.currentTheme.set(theme);
  }

  getThemeColors(theme: CodeTheme): ThemeColors {
    return this.themes[theme];
  }

  getAvailableThemes(): CodeTheme[] {
    return Object.keys(this.themes) as CodeTheme[];
  }

  generateThemeCSS(theme: CodeTheme): string {
    const colors = this.getThemeColors(theme);
    
    return `
      .code-theme-${theme} {
        --code-bg: ${colors.background};
        --code-surface: ${colors.surface};
        --code-text: ${colors.text};
        --code-comment: ${colors.comment};
        --code-keyword: ${colors.keyword};
        --code-string: ${colors.string};
        --code-number: ${colors.number};
        --code-function: ${colors.function};
        --code-operator: ${colors.operator};
        --code-punctuation: ${colors.punctuation};
        --code-variable: ${colors.variable};
        --code-line-number: ${colors.lineNumber};
        --code-line-highlight: ${colors.lineHighlight};
        --code-border: ${colors.border};
      }
    `;
  }
}JĴx import { Component } from '@angular/core';

@Component({
  selector: 'ui-ui-code-display',
  imports: [],
  template: `
    <p>
      ui-code-display works!
    </p>
  `,
  styles: ``
})
export class UiCodeDisplayComponent {

}
,H¶xY{
  "name": "ui-data-utils",
  "version": "0.0.1",
  "description": "Data manipulation helpers for sorting, filtering, pagination, and transformation",
  "keywords": ["angular", "data", "utilities", "sorting", "filtering", "pagination", "transformation"],
  "peerDependencies": {
    "@angular/common": "^19.2.0",
    "@angular/core": "^19.2.0"
  },
  "dependencies": {
    "tslib": "^2.3.0"
  },
  "sideEffects": false
}
Uix*/**
 * Filtering utilities for data manipulation
 */

import { FilterConfig, FilterOperator, DataType } from './types';

/**
 * Get nested property value from object
 * @param obj - Object to get value from
 * @param path - Property path (supports dot notation)
 */
function getNestedValue(obj: any, path: string | keyof any): any {
  if (typeof path === 'string' && path.includes('.')) {
    return path.split('.').reduce((current, key) => current?.[key], obj);
  }
  return obj?.[path];
}

/**
 * Convert value to appropriate type for comparison
 * @param value - Value to convert
 * @param dataType - Target data type
 */
function convertFilterValue(value: any, dataType: DataType): any {
  if (value == null) return value;

  switch (dataType) {
    case 'string':
      return String(value);
    case 'number':
      const num = Number(value);
      return isNaN(num) ? 0 : num;
    case 'date':
      if (value instanceof Date) return value;
      const date = new Date(value);
      return isNaN(date.getTime()) ? new Date(0) : date;
    case 'boolean':
      return Boolean(value);
    default:
      return value;
  }
}

/**
 * Check if value matches filter condition
 * @param itemValue - Value from the data item
 * @param filterValue - Value to compare against
 * @param operator - Filter operator
 * @param dataType - Data type for proper comparison
 */
function matchesFilter(
  itemValue: any,
  filterValue: any,
  operator: FilterOperator,
  dataType: DataType = 'string'
): boolean {
  // Handle empty values
  if (operator === 'is_empty') {
    return itemValue == null || itemValue === '' || (Array.isArray(itemValue) && itemValue.length === 0);
  }
  
  if (operator === 'is_not_empty') {
    return itemValue != null && itemValue !== '' && !(Array.isArray(itemValue) && itemValue.length === 0);
  }

  // Convert values for comparison
  const convertedItemValue = convertFilterValue(itemValue, dataType);
  
  // Handle array filter values (for 'in' and 'not_in')
  if (Array.isArray(filterValue)) {
    const convertedFilterValues = filterValue.map(v => convertFilterValue(v, dataType));
    
    switch (operator) {
      case 'in':
        return convertedFilterValues.some(fv => 
          dataType === 'string' 
            ? convertedItemValue?.toLowerCase() === fv?.toLowerCase()
            : convertedItemValue === fv
        );
      case 'not_in':
        return !convertedFilterValues.some(fv => 
          dataType === 'string' 
            ? convertedItemValue?.toLowerCase() === fv?.toLowerCase()
            : convertedItemValue === fv
        );
    }
  }

  const convertedFilterValue = convertFilterValue(filterValue, dataType);

  // Handle between operator (expects array with 2 values)
  if (operator === 'between') {
    if (!Array.isArray(filterValue) || filterValue.length !== 2) return false;
    const [min, max] = filterValue.map(v => convertFilterValue(v, dataType));
    return convertedItemValue >= min && convertedItemValue <= max;
  }

  // Handle null/undefined item values for operators that don't handle empty values
  if (convertedItemValue == null) {
    return operator === 'not_equals';
  }

  switch (operator) {
    case 'equals':
      return dataType === 'string'
        ? convertedItemValue?.toLowerCase() === convertedFilterValue?.toLowerCase()
        : convertedItemValue === convertedFilterValue;
    
    case 'not_equals':
      return dataType === 'string'
        ? convertedItemValue?.toLowerCase() !== convertedFilterValue?.toLowerCase()
        : convertedItemValue !== convertedFilterValue;
    
    case 'contains':
      if (dataType !== 'string') return false;
      return convertedItemValue?.toLowerCase()?.includes(convertedFilterValue?.toLowerCase()) || false;
    
    case 'not_contains':
      if (dataType !== 'string') return true;
      return !convertedItemValue?.toLowerCase()?.includes(convertedFilterValue?.toLowerCase());
    
    case 'starts_with':
      if (dataType !== 'string') return false;
      return convertedItemValue?.toLowerCase()?.startsWith(convertedFilterValue?.toLowerCase()) || false;
    
    case 'ends_with':
      if (dataType !== 'string') return false;
      return convertedItemValue?.toLowerCase()?.endsWith(convertedFilterValue?.toLowerCase()) || false;
    
    case 'greater_than':
      return convertedItemValue > convertedFilterValue;
    
    case 'greater_than_equal':
      return convertedItemValue >= convertedFilterValue;
    
    case 'less_than':
      return convertedItemValue < convertedFilterValue;
    
    case 'less_than_equal':
      return convertedItemValue <= convertedFilterValue;
    
    default:
      return false;
  }
}

/**
 * Filter array by single property
 * @param data - Array to filter
 * @param config - Filter configuration
 */
export function filterBy<T>(data: T[], config: FilterConfig<T>): T[] {
  if (!Array.isArray(data) || data.length === 0) return data;

  return data.filter(item => {
    const itemValue = getNestedValue(item, config.key);
    return matchesFilter(
      itemValue,
      config.value,
      config.operator,
      config.dataType || 'string'
    );
  });
}

/**
 * Filter array by multiple conditions (AND logic)
 * @param data - Array to filter
 * @param configs - Array of filter configurations
 */
export function filterByMultiple<T>(data: T[], configs: FilterConfig<T>[]): T[] {
  if (!Array.isArray(data) || data.length === 0) return data;
  if (!configs || configs.length === 0) return data;

  return data.filter(item => {
    return configs.every(config => {
      const itemValue = getNestedValue(item, config.key);
      return matchesFilter(
        itemValue,
        config.value,
        config.operator,
        config.dataType || 'string'
      );
    });
  });
}

/**
 * Filter array by multiple conditions with OR logic
 * @param data - Array to filter
 * @param configs - Array of filter configurations
 */
export function filterByAny<T>(data: T[], configs: FilterConfig<T>[]): T[] {
  if (!Array.isArray(data) || data.length === 0) return data;
  if (!configs || configs.length === 0) return data;

  return data.filter(item => {
    return configs.some(config => {
      const itemValue = getNestedValue(item, config.key);
      return matchesFilter(
        itemValue,
        config.value,
        config.operator,
        config.dataType || 'string'
      );
    });
  });
}

/**
 * Search filter - searches across multiple properties
 * @param data - Array to search
 * @param searchTerm - Search term
 * @param searchKeys - Properties to search in
 * @param caseSensitive - Whether search is case sensitive
 */
export function searchFilter<T>(
  data: T[],
  searchTerm: string,
  searchKeys: (keyof T)[],
  caseSensitive: boolean = false
): T[] {
  if (!Array.isArray(data) || data.length === 0) return data;
  if (!searchTerm || searchTerm.trim() === '') return data;
  if (!searchKeys || searchKeys.length === 0) return data;

  const term = caseSensitive ? searchTerm : searchTerm.toLowerCase();

  return data.filter(item => {
    return searchKeys.some(key => {
      const value = getNestedValue(item, key);
      if (value == null) return false;
      
      const stringValue = String(value);
      const searchValue = caseSensitive ? stringValue : stringValue.toLowerCase();
      return searchValue.includes(term);
    });
  });
}

/**
 * Advanced search with highlighting matches
 * @param data - Array to search
 * @param searchTerm - Search term
 * @param searchKeys - Properties to search in
 * @param caseSensitive - Whether search is case sensitive
 */
export function searchWithHighlight<T extends Record<string, any>>(
  data: T[],
  searchTerm: string,
  searchKeys: (keyof T)[],
  caseSensitive: boolean = false
): Array<T & { _searchMatches: { [key: string]: string } }> {
  if (!Array.isArray(data) || data.length === 0) return [];
  if (!searchTerm || searchTerm.trim() === '') {
    return data.map(item => ({ ...item, _searchMatches: {} }));
  }
  if (!searchKeys || searchKeys.length === 0) return [];

  const term = caseSensitive ? searchTerm : searchTerm.toLowerCase();
  const highlightStartTag = '<mark>';
  const highlightEndTag = '</mark>';

  return data.filter(item => {
    const matches: { [key: string]: string } = {};
    let hasMatch = false;

    searchKeys.forEach(key => {
      const value = getNestedValue(item, key);
      if (value == null) return;
      
      const stringValue = String(value);
      const searchValue = caseSensitive ? stringValue : stringValue.toLowerCase();
      
      if (searchValue.includes(term)) {
        hasMatch = true;
        // Create highlighted version
        const regex = new RegExp(
          caseSensitive ? searchTerm : searchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 
          caseSensitive ? 'g' : 'gi'
        );
        matches[key as string] = stringValue.replace(regex, `${highlightStartTag}$&${highlightEndTag}`);
      }
    });

    if (hasMatch) {
      return Object.assign(item, { _searchMatches: matches });
    }
    return false;
  }).map(item => item as T & { _searchMatches: { [key: string]: string } });
}

/**
 * Create a filter predicate function
 * @param config - Filter configuration
 */
export function createFilterPredicate<T>(config: FilterConfig<T>) {
  return (item: T): boolean => {
    const itemValue = getNestedValue(item, config.key);
    return matchesFilter(
      itemValue,
      config.value,
      config.operator,
      config.dataType || 'string'
    );
  };
}

/**
 * Get unique values from a property across all items
 * @param data - Array of data
 * @param key - Property key
 */
export function getUniqueValues<T>(data: T[], key: keyof T): any[] {
  if (!Array.isArray(data) || data.length === 0) return [];

  const values = new Set();
  data.forEach(item => {
    const value = getNestedValue(item, key);
    if (value != null) {
      values.add(value);
    }
  });

  return Array.from(values).sort();
}

/**
 * Get filter suggestions based on current data and partial input
 * @param data - Array of data
 * @param key - Property key
 * @param partialValue - Partial value to match
 * @param maxSuggestions - Maximum number of suggestions
 */
export function getFilterSuggestions<T>(
  data: T[],
  key: keyof T,
  partialValue: string,
  maxSuggestions: number = 10
): string[] {
  if (!Array.isArray(data) || data.length === 0) return [];
  if (!partialValue || partialValue.trim() === '') return [];

  const term = partialValue.toLowerCase();
  const suggestions = new Set<string>();

  data.forEach(item => {
    const value = getNestedValue(item, key);
    if (value != null) {
      const stringValue = String(value);
      if (stringValue.toLowerCase().includes(term)) {
        suggestions.add(stringValue);
      }
    }
  });

  return Array.from(suggestions)
    .sort()
    .slice(0, maxSuggestions);
},oʱxn/**
 * Pagination utilities for data manipulation
 */

import { PaginationConfig, PaginationResult } from './types';

/**
 * Paginate data array
 * @param data - Array to paginate
 * @param config - Pagination configuration
 */
export function paginate<T>(data: T[], config: PaginationConfig): PaginationResult<T> {
  if (!Array.isArray(data)) {
    throw new Error('Data must be an array');
  }

  const { page, pageSize } = config;

  if (page < 1) {
    throw new Error('Page number must be 1 or greater');
  }

  if (pageSize < 1) {
    throw new Error('Page size must be 1 or greater');
  }

  const totalItems = data.length;
  const totalPages = Math.ceil(totalItems / pageSize);
  const startIndex = (page - 1) * pageSize;
  const endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);
  
  const paginatedData = totalItems > 0 ? data.slice(startIndex, startIndex + pageSize) : [];

  return {
    data: paginatedData,
    page,
    pageSize,
    totalItems,
    totalPages,
    hasPrevious: page > 1,
    hasNext: page < totalPages,
    startIndex: totalItems > 0 ? startIndex : -1,
    endIndex: totalItems > 0 ? endIndex : -1
  };
}

/**
 * Calculate pagination metadata without slicing data
 * @param totalItems - Total number of items
 * @param page - Current page
 * @param pageSize - Items per page
 */
export function calculatePages(totalItems: number, page: number, pageSize: number): Omit<PaginationResult, 'data'> {
  if (totalItems < 0) {
    throw new Error('Total items cannot be negative');
  }

  if (page < 1) {
    throw new Error('Page number must be 1 or greater');
  }

  if (pageSize < 1) {
    throw new Error('Page size must be 1 or greater');
  }

  const totalPages = Math.ceil(totalItems / pageSize);
  const startIndex = (page - 1) * pageSize;
  const endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);

  return {
    page,
    pageSize,
    totalItems,
    totalPages,
    hasPrevious: page > 1,
    hasNext: page < totalPages,
    startIndex: totalItems > 0 ? startIndex : -1,
    endIndex: totalItems > 0 ? endIndex : -1
  };
}

/**
 * Get page numbers for pagination display (with ellipsis logic)
 * @param currentPage - Current page
 * @param totalPages - Total number of pages
 * @param maxVisible - Maximum number of visible page numbers
 */
export function getPaginationRange(
  currentPage: number, 
  totalPages: number, 
  maxVisible: number = 7
): Array<number | 'ellipsis'> {
  if (currentPage < 1 || currentPage > totalPages) {
    throw new Error('Current page is out of range');
  }

  if (totalPages <= maxVisible) {
    // Show all pages if total is less than max visible
    return Array.from({ length: totalPages }, (_, i) => i + 1);
  }

  const range: Array<number | 'ellipsis'> = [];
  const sidePages = Math.floor((maxVisible - 3) / 2); // Reserve 3 spots for first, last, and current

  // Always show first page
  range.push(1);

  if (currentPage <= sidePages + 2) {
    // Current page is near the beginning
    for (let i = 2; i <= Math.min(maxVisible - 1, totalPages - 1); i++) {
      range.push(i);
    }
    if (totalPages > maxVisible - 1) {
      range.push('ellipsis');
    }
  } else if (currentPage >= totalPages - sidePages - 1) {
    // Current page is near the end
    range.push('ellipsis');
    for (let i = Math.max(2, totalPages - maxVisible + 2); i <= totalPages - 1; i++) {
      range.push(i);
    }
  } else {
    // Current page is in the middle
    range.push('ellipsis');
    for (let i = currentPage - sidePages; i <= currentPage + sidePages; i++) {
      range.push(i);
    }
    range.push('ellipsis');
  }

  // Always show last page (if it's not already included)
  if (totalPages > 1 && !range.includes(totalPages)) {
    range.push(totalPages);
  }

  return range;
}

/**
 * Get item range text for display (e.g., "1-10 of 100")
 * @param startIndex - Start index (0-based)
 * @param endIndex - End index (0-based)
 * @param totalItems - Total number of items
 */
export function getItemRangeText(startIndex: number, endIndex: number, totalItems: number): string {
  if (totalItems === 0) return '0 of 0';
  
  const start = startIndex + 1; // Convert to 1-based
  const end = endIndex + 1;     // Convert to 1-based
  
  return `${start}-${end} of ${totalItems}`;
}

/**
 * Get page information text (e.g., "Page 1 of 10")
 * @param currentPage - Current page
 * @param totalPages - Total number of pages
 */
export function getPageInfoText(currentPage: number, totalPages: number): string {
  if (totalPages === 0) return 'Page 0 of 0';
  return `Page ${currentPage} of ${totalPages}`;
}

/**
 * Calculate optimal page size based on container height and item height
 * @param containerHeight - Height of the container in pixels
 * @param itemHeight - Height of each item in pixels
 * @param minPageSize - Minimum page size
 * @param maxPageSize - Maximum page size
 */
export function calculateOptimalPageSize(
  containerHeight: number,
  itemHeight: number,
  minPageSize: number = 5,
  maxPageSize: number = 100
): number {
  const calculatedSize = Math.floor(containerHeight / itemHeight);
  return Math.max(minPageSize, Math.min(maxPageSize, calculatedSize));
}

/**
 * Navigate to a specific page (with bounds checking)
 * @param currentPage - Current page
 * @param totalPages - Total number of pages
 * @param targetPage - Target page to navigate to
 */
export function navigateToPage(currentPage: number, totalPages: number, targetPage: number): number {
  return Math.max(1, Math.min(totalPages, targetPage));
}

/**
 * Navigate to previous page
 * @param currentPage - Current page
 */
export function navigateToPrevious(currentPage: number): number {
  return Math.max(1, currentPage - 1);
}

/**
 * Navigate to next page
 * @param currentPage - Current page
 * @param totalPages - Total number of pages
 */
export function navigateToNext(currentPage: number, totalPages: number): number {
  return Math.min(totalPages, currentPage + 1);
}

/**
 * Navigate to first page
 */
export function navigateToFirst(): number {
  return 1;
}

/**
 * Navigate to last page
 * @param totalPages - Total number of pages
 */
export function navigateToLast(totalPages: number): number {
  return Math.max(1, totalPages);
}

/**
 * Check if page navigation is valid
 * @param page - Page to check
 * @param totalPages - Total number of pages
 */
export function isValidPage(page: number, totalPages: number): boolean {
  return page >= 1 && page <= totalPages && totalPages > 0;
}

/**
 * Get all possible page sizes (common values)
 */
export function getStandardPageSizes(): number[] {
  return [5, 10, 20, 25, 50, 100];
}

/**
 * Get recommended page size based on total items
 * @param totalItems - Total number of items
 */
export function getRecommendedPageSize(totalItems: number): number {
  if (totalItems <= 25) return 10;
  if (totalItems <= 100) return 25;
  if (totalItems <= 500) return 50;
  return 100;
}

/**
 * Paginate with server-side pagination simulation
 * @param data - Full dataset
 * @param page - Current page
 * @param pageSize - Items per page
 * @param searchTerm - Search term to filter data first
 * @param searchKeys - Keys to search in
 */
export function serverPaginate<T>(
  data: T[],
  page: number,
  pageSize: number,
  searchTerm?: string,
  searchKeys?: (keyof T)[]
): PaginationResult<T> {
  let filteredData = data;

  // Apply search filter first if provided
  if (searchTerm && searchKeys && searchKeys.length > 0) {
    const term = searchTerm.toLowerCase();
    filteredData = data.filter(item => {
      return searchKeys.some(key => {
        const value = item[key];
        return value != null && String(value).toLowerCase().includes(term);
      });
    });
  }

  // Then paginate the filtered data
  return paginate(filteredData, { page, pageSize });
}0w޼xS/**
 * Sorting utilities for data manipulation
 */

import { SortConfig, MultiSortConfig, ComparatorFn, SortDirection, DataType } from './types';

/**
 * Get nested property value from object
 * @param obj - Object to get value from
 * @param path - Property path (supports dot notation)
 */
function getNestedValue(obj: any, path: string | keyof any): any {
  if (typeof path === 'string' && path.includes('.')) {
    return path.split('.').reduce((current, key) => current?.[key], obj);
  }
  return obj?.[path];
}

/**
 * Convert value to appropriate type for comparison
 * @param value - Value to convert
 * @param dataType - Target data type
 */
function convertValue(value: any, dataType: DataType): any {
  if (value == null) return value;

  switch (dataType) {
    case 'string':
      return String(value).toLowerCase();
    case 'number':
      const num = Number(value);
      return isNaN(num) ? 0 : num;
    case 'date':
      if (value instanceof Date) return value;
      const date = new Date(value);
      return isNaN(date.getTime()) ? new Date(0) : date;
    case 'boolean':
      return Boolean(value);
    default:
      return value;
  }
}

/**
 * Create a comparator function for a specific property and direction
 * @param key - Property key to sort by
 * @param direction - Sort direction
 * @param dataType - Data type for proper comparison
 */
export function createComparator<T = any>(
  key: keyof T,
  direction: SortDirection = 'asc',
  dataType: DataType = 'string'
): ComparatorFn<T> {
  return (a: T, b: T): number => {
    const valueA = convertValue(getNestedValue(a, key), dataType);
    const valueB = convertValue(getNestedValue(b, key), dataType);

    // Handle null/undefined values
    if (valueA == null && valueB == null) return 0;
    if (valueA == null) return direction === 'asc' ? -1 : 1;
    if (valueB == null) return direction === 'asc' ? 1 : -1;

    let result = 0;

    if (dataType === 'string') {
      result = valueA.localeCompare(valueB);
    } else if (dataType === 'date') {
      result = valueA.getTime() - valueB.getTime();
    } else {
      // For numbers and booleans
      if (valueA < valueB) result = -1;
      else if (valueA > valueB) result = 1;
      else result = 0;
    }

    return direction === 'desc' ? -result : result;
  };
}

/**
 * Sort array by single property
 * @param data - Array to sort
 * @param config - Sort configuration
 */
export function sortBy<T>(data: T[], config: SortConfig<T>): T[] {
  if (!Array.isArray(data) || data.length === 0) return data;

  const comparator = createComparator(
    config.key,
    config.direction,
    config.dataType || 'string'
  );

  return [...data].sort(comparator);
}

/**
 * Sort array by multiple properties with priority
 * @param data - Array to sort
 * @param config - Multi-sort configuration
 */
export function sortByMultiple<T>(data: T[], config: MultiSortConfig<T>): T[] {
  if (!Array.isArray(data) || data.length === 0) return data;
  if (!config.sorts || config.sorts.length === 0) return data;

  // Create comparators for each sort configuration
  const comparators = config.sorts.map(sortConfig =>
    createComparator(
      sortConfig.key,
      sortConfig.direction,
      sortConfig.dataType || 'string'
    )
  );

  return [...data].sort((a: T, b: T): number => {
    // Apply each comparator in order until we find a non-zero result
    for (const comparator of comparators) {
      const result = comparator(a, b);
      if (result !== 0) return result;
    }
    return 0;
  });
}

/**
 * Create a stable sort function that maintains relative order of equal elements
 * @param data - Array to sort
 * @param comparator - Comparison function
 */
export function stableSort<T>(data: T[], comparator: ComparatorFn<T>): T[] {
  if (!Array.isArray(data) || data.length === 0) return data;

  // Add index to maintain stability
  const indexed = data.map((item, index) => ({ item, index }));

  indexed.sort((a, b) => {
    const result = comparator(a.item, b.item);
    // If items are equal, maintain original order
    return result !== 0 ? result : a.index - b.index;
  });

  return indexed.map(({ item }) => item);
}

/**
 * Check if an array is sorted according to a comparator
 * @param data - Array to check
 * @param comparator - Comparison function
 */
export function isSorted<T>(data: T[], comparator: ComparatorFn<T>): boolean {
  if (!Array.isArray(data) || data.length <= 1) return true;

  for (let i = 1; i < data.length; i++) {
    if (comparator(data[i - 1], data[i]) > 0) return false;
  }
  return true;
}

/**
 * Reverse sort direction
 * @param direction - Current direction
 */
export function reverseDirection(direction: SortDirection): SortDirection {
  return direction === 'asc' ? 'desc' : 'asc';
}

/**
 * Get sort direction for next click (for UI toggling)
 * @param currentDirection - Current sort direction
 * @param allowUnsorted - Whether to allow unsorted state
 */
export function getNextSortDirection(
  currentDirection: SortDirection | null,
  allowUnsorted: boolean = true
): SortDirection | null {
  if (currentDirection === null) return 'asc';
  if (currentDirection === 'asc') return 'desc';
  if (currentDirection === 'desc' && allowUnsorted) return null;
  return 'asc'; // Cycle back to asc if unsorted not allowed
}

/**
 * Sort array by multiple keys with individual directions
 * @param data - Array to sort
 * @param keys - Array of keys to sort by
 * @param directions - Array of directions (defaults to 'asc' for all)
 * @param dataTypes - Array of data types (defaults to 'string' for all)
 */
export function sortByKeys<T>(
  data: T[],
  keys: (keyof T)[],
  directions: SortDirection[] = [],
  dataTypes: DataType[] = []
): T[] {
  if (!Array.isArray(data) || data.length === 0) return data;
  if (!keys || keys.length === 0) return data;

  const sorts: SortConfig<T>[] = keys.map((key, index) => ({
    key,
    direction: directions[index] || 'asc',
    dataType: dataTypes[index] || 'string'
  }));

  return sortByMultiple(data, { sorts });
}x'\/**
 * Data transformation utilities
 */

import { GroupByResult, AggregationFunction, AggregationResult } from './types';

/**
 * Get nested property value from object
 * @param obj - Object to get value from
 * @param path - Property path (supports dot notation)
 */
function getNestedValue(obj: any, path: string | keyof any): any {
  if (typeof path === 'string' && path.includes('.')) {
    return path.split('.').reduce((current, key) => current?.[key], obj);
  }
  return obj?.[path];
}

/**
 * Group array of objects by a specific property
 * @param data - Array to group
 * @param key - Property to group by
 */
export function groupBy<T>(data: T[], key: keyof T): GroupByResult<T>[] {
  if (!Array.isArray(data) || data.length === 0) return [];

  const groups = new Map<any, T[]>();

  data.forEach(item => {
    const groupKey = getNestedValue(item, key);
    if (!groups.has(groupKey)) {
      groups.set(groupKey, []);
    }
    groups.get(groupKey)!.push(item);
  });

  return Array.from(groups.entries()).map(([groupKey, items]) => ({
    key: groupKey,
    items,
    count: items.length
  }));
}

/**
 * Group array by multiple properties
 * @param data - Array to group
 * @param keys - Properties to group by
 */
export function groupByMultiple<T>(data: T[], keys: (keyof T)[]): GroupByResult<T>[] {
  if (!Array.isArray(data) || data.length === 0) return [];
  if (!keys || keys.length === 0) return [{ key: null, items: data, count: data.length }];

  const groups = new Map<string, T[]>();

  data.forEach(item => {
    const groupKey = keys.map(key => String(getNestedValue(item, key))).join('|');
    if (!groups.has(groupKey)) {
      groups.set(groupKey, []);
    }
    groups.get(groupKey)!.push(item);
  });

  return Array.from(groups.entries()).map(([groupKey, items]) => ({
    key: groupKey,
    items,
    count: items.length
  }));
}

/**
 * Aggregate values using specified functions
 * @param data - Array to aggregate
 * @param key - Property to aggregate
 * @param functions - Aggregation functions to apply
 */
export function aggregate<T>(
  data: T[],
  key: keyof T,
  functions: AggregationFunction[]
): AggregationResult {
  if (!Array.isArray(data) || data.length === 0) {
    return functions.reduce((acc, fn) => ({ ...acc, [fn]: 0 }), {});
  }

  const values = data
    .map(item => getNestedValue(item, key))
    .filter(value => value != null && !isNaN(Number(value)))
    .map(value => Number(value));

  if (values.length === 0) {
    return functions.reduce((acc, fn) => ({ ...acc, [fn]: 0 }), {});
  }

  const result: AggregationResult = {};

  functions.forEach(fn => {
    switch (fn) {
      case 'sum':
        result['sum'] = values.reduce((acc, val) => acc + val, 0);
        break;
      case 'avg':
        result['avg'] = values.reduce((acc, val) => acc + val, 0) / values.length;
        break;
      case 'min':
        result['min'] = Math.min(...values);
        break;
      case 'max':
        result['max'] = Math.max(...values);
        break;
      case 'count':
        result['count'] = values.length;
        break;
    }
  });

  return result;
}

/**
 * Group by and aggregate in one operation
 * @param data - Array to process
 * @param groupKey - Property to group by
 * @param aggregateKey - Property to aggregate
 * @param functions - Aggregation functions
 */
export function groupAndAggregate<T>(
  data: T[],
  groupKey: keyof T,
  aggregateKey: keyof T,
  functions: AggregationFunction[]
): Array<{ group: any; aggregates: AggregationResult }> {
  const groups = groupBy(data, groupKey);
  
  return groups.map(group => ({
    group: group.key,
    aggregates: aggregate(group.items, aggregateKey, functions)
  }));
}

/**
 * Extract specific properties from objects (pluck)
 * @param data - Array of objects
 * @param keys - Properties to extract
 */
export function pluck<T extends Record<string, any>, K extends keyof T>(data: T[], keys: K[]): Pick<T, K>[] {
  if (!Array.isArray(data) || data.length === 0) return [];
  if (!keys || keys.length === 0) return [];

  return data.map(item => {
    const result = {} as Pick<T, K>;
    keys.forEach(key => {
      if (key in item) {
        result[key] = item[key];
      }
    });
    return result;
  });
}

/**
 * Extract single property values into array
 * @param data - Array of objects
 * @param key - Property to extract
 */
export function pluckProperty<T, K extends keyof T>(data: T[], key: K): T[K][] {
  if (!Array.isArray(data) || data.length === 0) return [];
  
  return data.map(item => getNestedValue(item, key)).filter(value => value !== undefined);
}

/**
 * Flatten nested arrays
 * @param data - Array that may contain nested arrays
 * @param depth - Maximum depth to flatten (default: 1)
 */
export function flatten<T>(data: any[], depth: number = 1): T[] {
  if (!Array.isArray(data)) return [];
  
  const flattenRecursive = (arr: any[], currentDepth: number): any[] => {
    return currentDepth > 0 
      ? arr.reduce((acc, val) => 
          Array.isArray(val) 
            ? acc.concat(flattenRecursive(val, currentDepth - 1))
            : acc.concat(val), [])
      : arr.slice();
  };

  return flattenRecursive(data, depth);
}

/**
 * Flatten array completely (all levels)
 * @param data - Array to flatten
 */
export function flattenDeep<T>(data: any[]): T[] {
  if (!Array.isArray(data)) return [];
  
  return data.reduce((acc, val) => 
    Array.isArray(val) 
      ? acc.concat(flattenDeep(val))
      : acc.concat(val), []);
}

/**
 * Create pivot table from data
 * @param data - Array to pivot
 * @param rowKey - Property for rows
 * @param colKey - Property for columns  
 * @param valueKey - Property for values
 * @param aggregateFunction - How to aggregate values
 */
export function pivot<T>(
  data: T[],
  rowKey: keyof T,
  colKey: keyof T,
  valueKey: keyof T,
  aggregateFunction: AggregationFunction = 'sum'
): { [row: string]: { [col: string]: number } } {
  if (!Array.isArray(data) || data.length === 0) return {};

  const result: { [row: string]: { [col: string]: number } } = {};

  data.forEach(item => {
    const row = String(getNestedValue(item, rowKey));
    const col = String(getNestedValue(item, colKey));
    const value = Number(getNestedValue(item, valueKey)) || 0;

    if (!result[row]) {
      result[row] = {};
    }

    if (!result[row][col]) {
      result[row][col] = 0;
    }

    switch (aggregateFunction) {
      case 'sum':
        result[row][col] += value;
        break;
      case 'count':
        result[row][col] += 1;
        break;
      case 'avg':
        // For avg, we need to track sum and count separately
        // This is a simplified version that treats each occurrence as separate
        result[row][col] = (result[row][col] + value) / 2;
        break;
      case 'min':
        result[row][col] = Math.min(result[row][col], value);
        break;
      case 'max':
        result[row][col] = Math.max(result[row][col], value);
        break;
    }
  });

  return result;
}

/**
 * Transpose 2D array (flip rows and columns)
 * @param data - 2D array to transpose
 */
export function transpose<T>(data: T[][]): T[][] {
  if (!Array.isArray(data) || data.length === 0) return [];
  if (!Array.isArray(data[0])) return [];

  const rows = data.length;
  const cols = data[0].length;
  const result: T[][] = [];

  for (let col = 0; col < cols; col++) {
    result[col] = [];
    for (let row = 0; row < rows; row++) {
      result[col][row] = data[row][col];
    }
  }

  return result;
}

/**
 * Create frequency map of values
 * @param data - Array of values or objects
 * @param key - Property key (if data contains objects)
 */
export function frequency<T>(data: T[], key?: keyof T): Map<any, number> {
  if (!Array.isArray(data)) return new Map();

  const freqMap = new Map<any, number>();

  data.forEach(item => {
    const value = key ? getNestedValue(item, key) : item;
    freqMap.set(value, (freqMap.get(value) || 0) + 1);
  });

  return freqMap;
}

/**
 * Get unique values from array or object property
 * @param data - Array of data
 * @param key - Property key (optional)
 */
export function unique<T>(data: T[], key?: keyof T): any[] {
  if (!Array.isArray(data)) return [];

  const values = key 
    ? data.map(item => getNestedValue(item, key))
    : data;

  return [...new Set(values)];
}

/**
 * Chunk array into smaller arrays of specified size
 * @param data - Array to chunk
 * @param size - Size of each chunk
 */
export function chunk<T>(data: T[], size: number): T[][] {
  if (!Array.isArray(data) || size <= 0) return [];

  const chunks: T[][] = [];
  for (let i = 0; i < data.length; i += size) {
    chunks.push(data.slice(i, i + size));
  }
  return chunks;
}

/**
 * Zip multiple arrays together
 * @param arrays - Arrays to zip
 */
export function zip<T>(...arrays: T[][]): T[][] {
  if (arrays.length === 0) return [];
  
  const length = Math.max(...arrays.map(arr => Array.isArray(arr) ? arr.length : 0));
  const result: T[][] = [];

  for (let i = 0; i < length; i++) {
    result[i] = arrays.map(arr => arr[i]);
  }

  return result;
}

/**
 * Create cross product of multiple arrays
 * @param arrays - Arrays to get cross product from
 */
export function cartesianProduct<T>(...arrays: T[][]): T[][] {
  if (arrays.length === 0) return [];
  if (arrays.some(arr => !Array.isArray(arr) || arr.length === 0)) return [];

  return arrays.reduce(
    (acc, curr) => acc.flatMap(a => curr.map(b => [...a, b])),
    [[]] as T[][]
  );
}

/**
 * Sample random items from array
 * @param data - Array to sample from
 * @param count - Number of items to sample
 * @param withReplacement - Whether to allow duplicate selections
 */
export function sample<T>(data: T[], count: number, withReplacement: boolean = false): T[] {
  if (!Array.isArray(data) || data.length === 0 || count <= 0) return [];

  if (withReplacement) {
    return Array.from({ length: count }, () => 
      data[Math.floor(Math.random() * data.length)]
    );
  } else {
    const shuffled = [...data].sort(() => Math.random() - 0.5);
    return shuffled.slice(0, Math.min(count, data.length));
  }
}B@xo	/**
 * Common types used across ui-data-utils
 */

/**
 * Sort direction
 */
export type SortDirection = 'asc' | 'desc';

/**
 * Supported data types for comparison
 */
export type DataType = 'string' | 'number' | 'date' | 'boolean';

/**
 * Sort configuration for single property
 */
export interface SortConfig<T = any> {
  /** Property key to sort by */
  key: keyof T;
  /** Sort direction */
  direction: SortDirection;
  /** Data type for proper comparison */
  dataType?: DataType;
}

/**
 * Multi-column sort configuration
 */
export interface MultiSortConfig<T = any> {
  /** Array of sort configurations in priority order */
  sorts: SortConfig<T>[];
}

/**
 * Comparator function type
 */
export type ComparatorFn<T = any> = (a: T, b: T) => number;

/**
 * Filter operator types
 */
export type FilterOperator = 
  | 'equals' 
  | 'not_equals'
  | 'contains' 
  | 'not_contains'
  | 'starts_with' 
  | 'ends_with'
  | 'greater_than' 
  | 'greater_than_equal'
  | 'less_than' 
  | 'less_than_equal'
  | 'between'
  | 'in'
  | 'not_in'
  | 'is_empty'
  | 'is_not_empty';

/**
 * Filter configuration
 */
export interface FilterConfig<T = any> {
  /** Property key to filter by */
  key: keyof T;
  /** Filter operator */
  operator: FilterOperator;
  /** Filter value(s) */
  value: any;
  /** Data type for proper comparison */
  dataType?: DataType;
}

/**
 * Pagination configuration
 */
export interface PaginationConfig {
  /** Current page (1-based) */
  page: number;
  /** Items per page */
  pageSize: number;
}

/**
 * Pagination result
 */
export interface PaginationResult<T = any> {
  /** Paginated data */
  data: T[];
  /** Current page */
  page: number;
  /** Items per page */
  pageSize: number;
  /** Total number of items */
  totalItems: number;
  /** Total number of pages */
  totalPages: number;
  /** Has previous page */
  hasPrevious: boolean;
  /** Has next page */
  hasNext: boolean;
  /** Start index (0-based) */
  startIndex: number;
  /** End index (0-based) */
  endIndex: number;
}

/**
 * Aggregation functions
 */
export type AggregationFunction = 'sum' | 'avg' | 'min' | 'max' | 'count';

/**
 * Aggregation result
 */
export interface AggregationResult {
  [key: string]: number;
}

/**
 * Group by result
 */
export interface GroupByResult<T = any> {
  /** Group key */
  key: any;
  /** Items in this group */
  items: T[];
  /** Group count */
  count: number;
}Px%/*
 * Public API Surface of ui-data-utils
 */

// Types and interfaces
export * from './lib/types';

// Sorting utilities
export * from './lib/sorting';

// Filtering utilities  
export * from './lib/filtering';

// Pagination utilities
export * from './lib/pagination';

// Transformation utilities
export * from './lib/transformation';

// Legacy exports (keep for compatibility)
export * from './lib/ui-data-utils.service';
export * from './lib/ui-data-utils.component';
bɽxMimport { FaIconLibrary } from '@fortawesome/angular-fontawesome';
import { 
  faUser, 
  faHome, 
  faCog, 
  faSearch,
  faPlus,
  faEdit,
  faTrash,
  faSave,
  faCancel,
  faCheck,
  faTimes,
  faArrowLeft,
  faArrowRight,
  faChevronLeft,
  faChevronRight,
  faChevronUp,
  faChevronDown,
  faBars,
  faEllipsisV,
  faEye,
  faEyeSlash,
  faDownload,
  faUpload,
  faRefresh,
  faSpinner,
  faExclamationTriangle,
  faInfoCircle,
  faCheckCircle,
  faTimesCircle,
  faEnvelope,
  faWindowMaximize,
  faUserCircle,
  faCertificate,
  faHandPointer,
  faIdCard,
  faTags,
  faCheckSquare,
  faKeyboard,
  faThLarge,
  faList,
  faDotCircle,
  faToggleOn,
  faTable,
  faCirclePlus
} from '@fortawesome/free-solid-svg-icons';
import {
  faHeart,
  faBookmark,
  faComment,
  faThumbsUp
} from '@fortawesome/free-regular-svg-icons';
import {
  faGithub,
  faTwitter,
  faLinkedin,
  faGoogle
} from '@fortawesome/free-brands-svg-icons';

/**
 * Configuration function to add commonly used Font Awesome icons to the library
 * Call this function in your application's initialization to register icons
 */
export function configureFontAwesome(library: FaIconLibrary): void {
  // Add solid icons
  library.addIcons(
    faUser,
    faHome,
    faCog,
    faSearch,
    faPlus,
    faEdit,
    faTrash,
    faSave,
    faCancel,
    faCheck,
    faTimes,
    faArrowLeft,
    faArrowRight,
    faChevronLeft,
    faChevronRight,
    faChevronUp,
    faChevronDown,
    faBars,
    faEllipsisV,
    faEye,
    faEyeSlash,
    faDownload,
    faUpload,
    faRefresh,
    faSpinner,
    faExclamationTriangle,
    faInfoCircle,
    faCheckCircle,
    faTimesCircle,
    faEnvelope,
    faWindowMaximize,
    faUserCircle,
    faCertificate,
    faHandPointer,
    faIdCard,
    faTags,
    faCheckSquare,
    faKeyboard,
    faThLarge,
    faList,
    faDotCircle,
    faToggleOn,
    faTable,
    faCirclePlus
  );

  // Add regular icons
  library.addIcons(
    faHeart,
    faBookmark,
    faComment,
    faThumbsUp
  );

  // Add brand icons
  library.addIcons(
    faGithub,
    faTwitter,
    faLinkedin,
    faGoogle
  );
}5xS// Font Awesome exports
export { FaIconComponent } from '@fortawesome/angular-fontawesome';
export { configureFontAwesome } from './font-awesome.config';

// Re-export commonly used icon definitions
export {
  faUser,
  faHome,
  faCog,
  faSearch,
  faPlus,
  faEdit,
  faTrash,
  faSave,
  faCancel,
  faCheck,
  faTimes,
  faArrowLeft,
  faArrowRight,
  faChevronLeft,
  faChevronRight,
  faChevronUp,
  faChevronDown,
  faBars,
  faEllipsisV,
  faEye,
  faEyeSlash,
  faDownload,
  faUpload,
  faRefresh,
  faSpinner,
  faExclamationTriangle,
  faInfoCircle,
  faCheckCircle,
  faTimesCircle
} from '@fortawesome/free-solid-svg-icons';

export {
  faHeart,
  faBookmark,
  faComment,
  faThumbsUp
} from '@fortawesome/free-regular-svg-icons';

export {
  faGithub,
  faTwitter,
  faLinkedin,
  faGoogle
} from '@fortawesome/free-brands-svg-icons';"xj0y
T{+=*.OqQ ;~~*8%wxcO!msc,vbUc
1)>'E5۪Bk#НΩJ'PA)mA~i+}لp+]oY꿼k сZz4&</#ܘ]^|;R`u!"^SNll)%B?;GH4Nv0nD7"yx[2egqFbQjniF I
ZxG'// AI Enhancement Tokens
// Generated from base-tokens.json

// AI State Classes
$base-ai-states-cognitive-thinking: 'ai-thinking';
$base-ai-states-cognitive-analyzing: 'ai-analyzing';
$base-ai-states-cognitive-processing: 'ai-processing';
$base-ai-states-cognitive-deciding: 'ai-deciding';
$base-ai-states-cognitive-learning: 'ai-learning';
$base-ai-states-cognitive-validating: 'ai-validating';

$base-ai-states-activity-loading: 'ai-loading';
$base-ai-states-activity-working: 'ai-working';
$base-ai-states-activity-busy: 'ai-busy';
$base-ai-states-activity-idle: 'ai-idle';

$base-ai-states-communication-listening: 'ai-listening';
$base-ai-states-communication-speaking: 'ai-speaking';
$base-ai-states-communication-waiting: 'ai-waiting';
$base-ai-states-communication-responding: 'ai-responding';

$base-ai-states-status-complete: 'ai-complete';
$base-ai-states-status-success: 'ai-success';
$base-ai-states-status-error: 'ai-has-error';
$base-ai-states-status-warning: 'ai-has-warning';
$base-ai-states-status-paused: 'ai-is-paused';
$base-ai-states-status-cancelled: 'ai-is-cancelled';

// AI Control Mode Classes
$base-ai-control-modes-cooperative: 'mode-cooperative';
$base-ai-control-modes-ai-priority: 'mode-ai-priority';
$base-ai-control-modes-ai-exclusive: 'mode-ai-exclusive';
$base-ai-control-modes-human-override: 'mode-human-override';

$base-ai-control-locks-soft: 'ai-lock-soft';
$base-ai-control-locks-hard: 'ai-lock-hard';
$base-ai-control-locks-visual-only: 'ai-lock-visual-only';

// AI Enhancement Colors
$base-ai-glow-subtle-color: #8b5cf6;
$base-ai-glow-subtle-blur: 8px;
$base-ai-glow-subtle-spread: 2px;
$base-ai-glow-subtle-opacity: 0.2;

$base-ai-glow-standard-color: #8b5cf6;
$base-ai-glow-standard-blur: 16px;
$base-ai-glow-standard-spread: 4px;
$base-ai-glow-standard-opacity: 0.3;

$base-ai-glow-strong-color: #8b5cf6;
$base-ai-glow-strong-blur: 24px;
$base-ai-glow-strong-spread: 6px;
$base-ai-glow-strong-opacity: 0.4;

// AI Gradient Colors
$base-ai-gradient-colors: (#8b5cf6, #06b6d4, #f59e0b);
$base-ai-gradient-blur: 20px;
$base-ai-gradient-spread: 4px;
$base-ai-gradient-opacity: 0.35;

// AI Status Colors
$base-ai-status-thinking-color: #8b5cf6;
$base-ai-status-thinking-background: var(--color-gray-100);
$base-ai-status-thinking-indicator: #8b5cf6;
$base-ai-status-thinking-animation: pulse 2s ease-in-out infinite;

$base-ai-status-ready-color: var(--color-success);
$base-ai-status-ready-background: #f0fdf4;
$base-ai-status-ready-indicator: var(--color-success);
$base-ai-status-ready-animation: none;

$base-ai-status-processing-color: #06b6d4;
$base-ai-status-processing-background: #f0f9ff;
$base-ai-status-processing-indicator: #06b6d4;
$base-ai-status-processing-animation: spin 1s linear infinite;

$base-ai-status-error-color: var(--color-danger);
$base-ai-status-error-background: #fef2f2;
$base-ai-status-error-indicator: var(--color-danger);
$base-ai-status-error-animation: none;

$base-ai-status-offline-color: var(--color-gray-500);
$base-ai-status-offline-background: var(--color-gray-50);
$base-ai-status-offline-indicator: var(--color-gray-500);
$base-ai-status-offline-animation: none;

// AI Confidence Levels
$base-ai-confidence-low-color: #f59e0b;
$base-ai-confidence-low-background: #fef3c7;
$base-ai-confidence-low-border: #f59e0b;
$base-ai-confidence-low-glow: 0 0 8px rgba(245, 158, 11, 0.2);

$base-ai-confidence-medium-color: #06b6d4;
$base-ai-confidence-medium-background: #cffafe;
$base-ai-confidence-medium-border: #06b6d4;
$base-ai-confidence-medium-glow: 0 0 12px rgba(6, 182, 212, 0.3);

$base-ai-confidence-high-color: var(--color-success);
$base-ai-confidence-high-background: #d1fae5;
$base-ai-confidence-high-border: var(--color-success);
$base-ai-confidence-high-glow: 0 0 16px rgba(16, 185, 129, 0.4);

// AI Pulse Animations
$base-ai-pulse-thinking-duration: 2s;
$base-ai-pulse-thinking-easing: ease-in-out;
$base-ai-pulse-thinking-scale-from: 1;
$base-ai-pulse-thinking-scale-to: 1.02;
$base-ai-pulse-thinking-opacity-from: 0.8;
$base-ai-pulse-thinking-opacity-to: 1;
$base-ai-pulse-thinking-iteration: infinite;

$base-ai-pulse-processing-duration: 1.5s;
$base-ai-pulse-processing-easing: ease-in-out;
$base-ai-pulse-processing-scale-from: 1;
$base-ai-pulse-processing-scale-to: 1.05;
$base-ai-pulse-processing-opacity-from: 0.7;
$base-ai-pulse-processing-opacity-to: 1;
$base-ai-pulse-processing-iteration: infinite;

$base-ai-pulse-heartbeat-duration: 1s;
$base-ai-pulse-heartbeat-easing: ease-in-out;
$base-ai-pulse-heartbeat-scale-from: 1;
$base-ai-pulse-heartbeat-scale-to: 1.1;
$base-ai-pulse-heartbeat-opacity-from: 0.9;
$base-ai-pulse-heartbeat-opacity-to: 1;
$base-ai-pulse-heartbeat-iteration: infinite;

// AI Feedback Colors
$base-ai-feedback-success-color: var(--color-success);
$base-ai-feedback-success-background: #d1fae5;
$base-ai-feedback-success-border: var(--color-success);
$base-ai-feedback-success-duration: 300ms;
$base-ai-feedback-success-easing: ease-out;

$base-ai-feedback-warning-color: #f59e0b;
$base-ai-feedback-warning-background: #fef3c7;
$base-ai-feedback-warning-border: #f59e0b;
$base-ai-feedback-warning-duration: 300ms;
$base-ai-feedback-warning-easing: ease-out;

$base-ai-feedback-error-color: var(--color-danger);
$base-ai-feedback-error-background: #fee2e2;
$base-ai-feedback-error-border: var(--color-danger);
$base-ai-feedback-error-duration: 300ms;
$base-ai-feedback-error-easing: ease-out;

$base-ai-feedback-info-color: var(--color-primary);
$base-ai-feedback-info-background: #dbeafe;
$base-ai-feedback-info-border: var(--color-primary);
$base-ai-feedback-info-duration: 300ms;
$base-ai-feedback-info-easing: ease-out;

// AI Gradients
$base-ai-gradient-primary: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
$base-ai-gradient-secondary: linear-gradient(135deg, #06b6d4 0%, #0891b2 100%);
$base-ai-gradient-tertiary: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
$base-ai-gradient-thinking: linear-gradient(135deg, #8b5cf6 0%, #a855f7 50%, #8b5cf6 100%);
$base-ai-gradient-processing: linear-gradient(135deg, #06b6d4 0%, #0ea5e9 50%, #06b6d4 100%);
$base-ai-gradient-success: linear-gradient(135deg, var(--color-success) 0%, #059669 100%);
$base-ai-gradient-warning: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
$base-ai-gradient-error: linear-gradient(135deg, var(--color-danger) 0%, #dc2626 100%);

// AI Border Animations
$base-ai-border-flowing-width: 2px;
$base-ai-border-flowing-style: solid;
$base-ai-border-flowing-colors: (#8b5cf6, #06b6d4, #f59e0b);
$base-ai-border-flowing-animation-duration: 3s;
$base-ai-border-flowing-animation-timing: linear;

$base-ai-border-static-width: 1px;
$base-ai-border-static-style: solid;
$base-ai-border-static-color: #8b5cf6;

$base-ai-border-processing-width: 2px;
$base-ai-border-processing-style: dashed;
$base-ai-border-processing-colors: (#06b6d4, #0ea5e9);
$base-ai-border-processing-animation-duration: 1.5s;
$base-ai-border-processing-animation-timing: ease-in-out;

// AI Animation Properties
$base-ai-animation-glow-duration: 2s;
$base-ai-animation-glow-easing: ease-in-out;
$base-ai-animation-glow-iterations: infinite;

$base-ai-animation-pulse-duration: 1.5s;
$base-ai-animation-pulse-easing: ease-in-out;
$base-ai-animation-pulse-iterations: infinite;

// AI Timing Values
$base-ai-timing-selection: 150ms;
$base-ai-timing-press: 100ms;
$base-ai-timing-interaction: 200ms;

// AI State Maps
$base-ai-states: (
  thinking: $base-ai-states-cognitive-thinking,
  analyzing: $base-ai-states-cognitive-analyzing,
  processing: $base-ai-states-cognitive-processing,
  deciding: $base-ai-states-cognitive-deciding,
  learning: $base-ai-states-cognitive-learning,
  validating: $base-ai-states-cognitive-validating,
  loading: $base-ai-states-activity-loading,
  working: $base-ai-states-activity-working,
  busy: $base-ai-states-activity-busy,
  idle: $base-ai-states-activity-idle,
  listening: $base-ai-states-communication-listening,
  speaking: $base-ai-states-communication-speaking,
  waiting: $base-ai-states-communication-waiting,
  responding: $base-ai-states-communication-responding,
  complete: $base-ai-states-status-complete,
  success: $base-ai-states-status-success,
  error: $base-ai-states-status-error,
  warning: $base-ai-states-status-warning,
  paused: $base-ai-states-status-paused,
  cancelled: $base-ai-states-status-cancelled,
);

// AI Glow Levels Map
$base-ai-glow-levels: (
  subtle: (
    color: $base-ai-glow-subtle-color,
    blur: $base-ai-glow-subtle-blur,
    spread: $base-ai-glow-subtle-spread,
    opacity: $base-ai-glow-subtle-opacity,
  ),
  standard: (
    color: $base-ai-glow-standard-color,
    blur: $base-ai-glow-standard-blur,
    spread: $base-ai-glow-standard-spread,
    opacity: $base-ai-glow-standard-opacity,
  ),
  strong: (
    color: $base-ai-glow-strong-color,
    blur: $base-ai-glow-strong-blur,
    spread: $base-ai-glow-strong-spread,
    opacity: $base-ai-glow-strong-opacity,
  ),
);

// AI Status Map
$base-ai-status-map: (
  thinking: (
    color: $base-ai-status-thinking-color,
    background: $base-ai-status-thinking-background,
    indicator: $base-ai-status-thinking-indicator,
    animation: $base-ai-status-thinking-animation,
  ),
  ready: (
    color: $base-ai-status-ready-color,
    background: $base-ai-status-ready-background,
    indicator: $base-ai-status-ready-indicator,
    animation: $base-ai-status-ready-animation,
  ),
  processing: (
    color: $base-ai-status-processing-color,
    background: $base-ai-status-processing-background,
    indicator: $base-ai-status-processing-indicator,
    animation: $base-ai-status-processing-animation,
  ),
  error: (
    color: $base-ai-status-error-color,
    background: $base-ai-status-error-background,
    indicator: $base-ai-status-error-indicator,
    animation: $base-ai-status-error-animation,
  ),
  offline: (
    color: $base-ai-status-offline-color,
    background: $base-ai-status-offline-background,
    indicator: $base-ai-status-offline-indicator,
    animation: $base-ai-status-offline-animation,
  ),
);}X:|x9// Border Tokens
// Generated from base-tokens.json

// Border Widths
$base-border-width-0: 0px;
$base-border-width-1: 1px;
$base-border-width-2: 2px;
$base-border-width-3: 3px;
$base-border-width-4: 4px;
$base-border-width-5: 5px;
$base-border-width-6: 6px;
$base-border-width-7: 7px;
$base-border-width-8: 8px;
$base-border-width-10: 10px;
$base-border-width-hairline: 0.5px;

// Border Radius
$base-border-radius-none: 0px;
$base-border-radius-xs: 0.125rem;
$base-border-radius-sm: 0.25rem;
$base-border-radius-md: 0.375rem;
$base-border-radius-lg: 0.5rem;
$base-border-radius-xl: 0.75rem;
$base-border-radius-2xl: 1rem;
$base-border-radius-3xl: 1.5rem;
$base-border-radius-4xl: 2rem;
$base-border-radius-5xl: 2.5rem;
$base-border-radius-full: 9999px;
$base-border-radius-pill: 50rem;

// Border Styles
$base-border-style-none: none;
$base-border-style-solid: solid;
$base-border-style-dashed: dashed;
$base-border-style-dotted: dotted;
$base-border-style-double: double;

// Border Width Map
$base-border-widths: (
  0: $base-border-width-0,
  1: $base-border-width-1,
  2: $base-border-width-2,
  3: $base-border-width-3,
  4: $base-border-width-4,
  5: $base-border-width-5,
  6: $base-border-width-6,
  7: $base-border-width-7,
  8: $base-border-width-8,
  10: $base-border-width-10,
  hairline: $base-border-width-hairline,
);

// Border Radius Map
$base-border-radiuses: (
  none: $base-border-radius-none,
  xs: $base-border-radius-xs,
  sm: $base-border-radius-sm,
  md: $base-border-radius-md,
  lg: $base-border-radius-lg,
  xl: $base-border-radius-xl,
  2xl: $base-border-radius-2xl,
  3xl: $base-border-radius-3xl,
  4xl: $base-border-radius-4xl,
  5xl: $base-border-radius-5xl,
  full: $base-border-radius-full,
  pill: $base-border-radius-pill,
);

// Border Style Map
$base-border-styles: (
  none: $base-border-style-none,
  solid: $base-border-style-solid,
  dashed: $base-border-style-dashed,
  dotted: $base-border-style-dotted,
  double: $base-border-style-double,
);h xx7// Breakpoint Tokens
// Generated from base-tokens.json

// Breakpoint Values
$base-breakpoint-xs: 475px;
$base-breakpoint-sm: 640px;
$base-breakpoint-md: 768px;
$base-breakpoint-lg: 1024px;
$base-breakpoint-xl: 1280px;
$base-breakpoint-2xl: 1536px;

// Breakpoint Map
$base-breakpoints: (
  xs: $base-breakpoint-xs,
  sm: $base-breakpoint-sm,
  md: $base-breakpoint-md,
  lg: $base-breakpoint-lg,
  xl: $base-breakpoint-xl,
  2xl: $base-breakpoint-2xl,
);nx+// ==========================================================================
// COLOR TOKENS
// ==========================================================================
// Tonal color system using HCL for tones
// Material Design 3 inspired color tokens with $base prefix
// ==========================================================================

// KEY COLORS (Material M3 HCL Seed Colors)
$base-color-primary-key: hsl(258, 100%, 47%) !default;     // Dynamic Color - Primary
$base-color-secondary-key: hsl(258, 29%, 16%) !default;    // Dynamic Color - Secondary
$base-color-tertiary-key: hsl(295, 26%, 25%) !default;     // Dynamic Color - Tertiary
$base-color-quaternary-key: hsl(76, 29%, 16%) !default;    // Dynamic Color - Quaternary
$base-color-neutral-key: hsl(279, 14%, 11%) !default;      // Dynamic Color - Neutral
$base-color-error-key: hsl(25, 84%, 44%) !default;         // Dynamic Color - Error
$base-color-neutral-variant-key: hsl(287, 12%, 15%) !default; // Dynamic Color - Neutral Variant

// PRIMARY COLORS (HCL Tonal Palette)
$base-color-primary: hsl(258, 100%, 47%) !default;             // Tone 40
$base-color-on-primary: hsl(0, 0%, 100%) !default;             // Tone 100
$base-color-primary-container: hsl(263, 100%, 88%) !default;   // Tone 90
$base-color-on-primary-container: hsl(260, 100%, 13%) !default; // Tone 10
$base-color-inverse-primary: hsl(263, 100%, 78%) !default;     // Tone 80

// SECONDARY COLORS (HCL Tonal Palette)
$base-color-secondary: hsl(258, 29%, 40%) !default;            // Tone 40
$base-color-on-secondary: hsl(0, 0%, 100%) !default;           // Tone 100
$base-color-secondary-container: hsl(262, 25%, 84%) !default;  // Tone 90
$base-color-on-secondary-container: hsl(256, 29%, 11%) !default; // Tone 10

// TERTIARY COLORS (HCL Tonal Palette)
$base-color-tertiary: hsl(295, 26%, 40%) !default;             // Tone 40
$base-color-on-tertiary: hsl(0, 0%, 100%) !default;            // Tone 100
$base-color-tertiary-container: hsl(307, 24%, 84%) !default;   // Tone 90
$base-color-on-tertiary-container: hsl(290, 26%, 11%) !default; // Tone 10

// NEUTRAL COLORS (HCL Tonal Palette)
$base-color-neutral: hsl(279, 14%, 22%) !default;              // Tone 25
$base-color-neutral-variant: hsl(287, 12%, 25%) !default;      // Tone 30

// SURFACE COLORS (Light Theme - HCL Tonal System)
$base-color-surface: hsl(286, 20%, 99%) !default;              // Tone 99
$base-color-surface-bright: hsl(286, 20%, 99%) !default;       // Tone 99
$base-color-surface-dim: hsl(285, 9%, 87%) !default;           // Tone 87
$base-color-on-surface: hsl(279, 14%, 11%) !default;           // Tone 10
$base-color-surface-lowest: hsl(0, 0%, 100%) !default;         // Tone 100
$base-color-surface-low: hsl(289, 14%, 96%) !default;          // Tone 96
$base-color-surface-container: hsl(287, 8%, 94%) !default;     // Tone 94
$base-color-surface-high: hsl(286, 6%, 92%) !default;          // Tone 92
$base-color-surface-highest: hsl(284, 7%, 90%) !default;       // Tone 90
$base-color-surface-variant: hsl(289, 14%, 90%) !default;      // Tone 90
$base-color-on-surface-variant: hsl(287, 12%, 47%) !default;   // Tone 50
$base-color-inverse-surface: hsl(279, 14%, 20%) !default;      // Tone 20
$base-color-inverse-on-surface: hsl(285, 15%, 95%) !default;   // Tone 95

// BACKGROUND COLORS (Light Theme)
$base-color-background: hsl(286, 20%, 99%) !default;           // Tone 99
$base-color-on-background: hsl(279, 14%, 11%) !default;        // Tone 10

// ERROR COLORS (HCL Tonal Palette)
$base-color-error: hsl(25, 84%, 44%) !default;                 // Tone 40
$base-color-on-error: hsl(0, 0%, 100%) !default;               // Tone 100
$base-color-error-container: hsl(25, 100%, 92%) !default;      // Tone 90
$base-color-on-error-container: hsl(25, 100%, 11%) !default;   // Tone 10

// OUTLINE COLORS (HCL Tonal System)
$base-color-outline: hsl(287, 12%, 59%) !default;              // Tone 50
$base-color-outline-variant: hsl(289, 14%, 80%) !default;      // Tone 80

// UTILITY COLORS (Material M3 Standards)
$base-color-shadow: hsl(0, 0%, 0%) !default;                   // Pure black shadow
$base-color-surface-tint: hsl(258, 100%, 47%) !default;        // Primary color for tint
$base-color-scrim: hsl(0, 0%, 0%) !default;                    // Pure black scrimwȴx2// ==========================================================================
// CSS CUSTOM PROPERTIES MAPPING
// ==========================================================================
// Maps SCSS design tokens to CSS custom properties for runtime theming
// These variables can be dynamically updated via JavaScript
// ==========================================================================
@use 'colors' as colors;
@use 'glass' as glass;

:root {
  // ==========================================================================
  // PRIMARY COLORS - Material Design 3 Tonal Palette
  // ==========================================================================
  --color-primary-key: #{colors.$base-color-primary-key};
  --color-primary: #{colors.$base-color-primary};
  --color-on-primary: #{colors.$base-color-on-primary};
  --color-primary-container: #{colors.$base-color-primary-container};
  --color-on-primary-container: #{colors.$base-color-on-primary-container};
  --color-inverse-primary: #{colors.$base-color-inverse-primary};

  // ==========================================================================
  // SECONDARY COLORS - Material Design 3 Tonal Palette
  // ==========================================================================
  --color-secondary-key: #{colors.$base-color-secondary-key};
  --color-secondary: #{colors.$base-color-secondary};
  --color-on-secondary: #{colors.$base-color-on-secondary};
  --color-secondary-container: #{colors.$base-color-secondary-container};
  --color-on-secondary-container: #{colors.$base-color-on-secondary-container};

  // ==========================================================================
  // TERTIARY COLORS - Material Design 3 Tonal Palette
  // ==========================================================================
  --color-tertiary-key: #{colors.$base-color-tertiary-key};
  --color-tertiary: #{colors.$base-color-tertiary};
  --color-on-tertiary: #{colors.$base-color-on-tertiary};
  --color-tertiary-container: #{colors.$base-color-tertiary-container};
  --color-on-tertiary-container: #{colors.$base-color-on-tertiary-container};

  // ==========================================================================
  // QUATERNARY COLORS - Extended Material Design 3
  // ==========================================================================
  --color-quaternary-key: #{colors.$base-color-quaternary-key};

  // ==========================================================================
  // ERROR COLORS - Material Design 3 Error System
  // ==========================================================================
  --color-error-key: #{colors.$base-color-error-key};
  --color-error: #{colors.$base-color-error};
  --color-on-error: #{colors.$base-color-on-error};
  --color-error-container: #{colors.$base-color-error-container};
  --color-on-error-container: #{colors.$base-color-on-error-container};

  // ==========================================================================
  // NEUTRAL COLORS - Material Design 3 Neutral System
  // ==========================================================================
  --color-neutral-key: #{colors.$base-color-neutral-key};
  --color-neutral: #{colors.$base-color-neutral};
  --color-neutral-variant-key: #{colors.$base-color-neutral-variant-key};
  --color-neutral-variant: #{colors.$base-color-neutral-variant};

  // ==========================================================================
  // SURFACE COLORS - Material Design 3 Surface System
  // ==========================================================================
  --color-surface: #{colors.$base-color-surface};
  --color-surface-bright: #{colors.$base-color-surface-bright};
  --color-surface-dim: #{colors.$base-color-surface-dim};
  --color-on-surface: #{colors.$base-color-on-surface};
  --color-surface-lowest: #{colors.$base-color-surface-lowest};
  --color-surface-low: #{colors.$base-color-surface-low};
  --color-surface-container: #{colors.$base-color-surface-container};
  --color-surface-high: #{colors.$base-color-surface-high};
  --color-surface-highest: #{colors.$base-color-surface-highest};
  --color-surface-variant: #{colors.$base-color-surface-variant};
  --color-on-surface-variant: #{colors.$base-color-on-surface-variant};
  --color-inverse-surface: #{colors.$base-color-inverse-surface};
  --color-inverse-on-surface: #{colors.$base-color-inverse-on-surface};

  // ==========================================================================
  // BACKGROUND COLORS - Material Design 3 Background System
  // ==========================================================================
  --color-background: #{colors.$base-color-background};
  --color-on-background: #{colors.$base-color-on-background};

  // ==========================================================================
  // OUTLINE COLORS - Material Design 3 Outline System
  // ==========================================================================
  --color-outline: #{colors.$base-color-outline};
  --color-outline-variant: #{colors.$base-color-outline-variant};

  // ==========================================================================
  // UTILITY COLORS - Material Design 3 Utility Colors
  // ==========================================================================
  --color-shadow: #{colors.$base-color-shadow};
  --color-surface-tint: #{colors.$base-color-surface-tint};
  --color-scrim: #{colors.$base-color-scrim};

  // ==========================================================================
  // GLASS EFFECT VARIABLES - Default to Light Mode
  // ==========================================================================
  --glass-blur-xs: #{glass.$base-glass-blur-xs};
  --glass-blur-sm: #{glass.$base-glass-blur-sm};
  --glass-blur-md: #{glass.$base-glass-blur-md};
  --glass-blur-lg: #{glass.$base-glass-blur-lg};
  --glass-blur-xl: #{glass.$base-glass-blur-xl};
  --glass-blur-2xl: #{glass.$base-glass-blur-2xl};
  --glass-blur-3xl: #{glass.$base-glass-blur-3xl};

  --glass-opacity-translucent: #{glass.$base-glass-opacity-translucent-light};
  --glass-opacity-light: #{glass.$base-glass-opacity-light-light};
  --glass-opacity-medium: #{glass.$base-glass-opacity-medium-light};
  --glass-opacity-heavy: #{glass.$base-glass-opacity-heavy-light};
  --glass-opacity-frosted: #{glass.$base-glass-opacity-frosted-light};

  --glass-background-base: #{glass.$base-glass-bg-light};
  --glass-border-color: #{glass.$base-glass-border-light};
  --glass-shadow-color: #{glass.$base-glass-shadow-light};

  --glass-duration-fast: #{glass.$base-glass-duration-fast};
  --glass-duration-normal: #{glass.$base-glass-duration-normal};
  --glass-duration-slow: #{glass.$base-glass-duration-slow};
}

// ==========================================================================
// CSS VARIABLE FALLBACK SYSTEM
// ==========================================================================
// Fallback variables that use SCSS tokens when CSS variables are not supported
// This ensures compatibility with older browsers

// Primary system fallbacks
$css-color-primary: var(--color-primary, #{colors.$base-color-primary}) !default;
$css-color-on-primary: var(--color-on-primary, #{colors.$base-color-on-primary}) !default;
$css-color-primary-container: var(--color-primary-container, #{colors.$base-color-primary-container}) !default;
$css-color-on-primary-container: var(--color-on-primary-container, #{colors.$base-color-on-primary-container}) !default;
$css-color-inverse-primary: var(--color-inverse-primary, #{colors.$base-color-inverse-primary}) !default;

// Secondary system fallbacks
$css-color-secondary: var(--color-secondary, #{colors.$base-color-secondary}) !default;
$css-color-on-secondary: var(--color-on-secondary, #{colors.$base-color-on-secondary}) !default;
$css-color-secondary-container: var(--color-secondary-container, #{colors.$base-color-secondary-container}) !default;
$css-color-on-secondary-container: var(--color-on-secondary-container, #{colors.$base-color-on-secondary-container}) !default;

// Tertiary system fallbacks
$css-color-tertiary: var(--color-tertiary, #{colors.$base-color-tertiary}) !default;
$css-color-on-tertiary: var(--color-on-tertiary, #{colors.$base-color-on-tertiary}) !default;
$css-color-tertiary-container: var(--color-tertiary-container, #{colors.$base-color-tertiary-container}) !default;
$css-color-on-tertiary-container: var(--color-on-tertiary-container, #{colors.$base-color-on-tertiary-container}) !default;

// Error system fallbacks
$css-color-error: var(--color-error, #{colors.$base-color-error}) !default;
$css-color-on-error: var(--color-on-error, #{colors.$base-color-on-error}) !default;
$css-color-error-container: var(--color-error-container, #{colors.$base-color-error-container}) !default;
$css-color-on-error-container: var(--color-on-error-container, #{colors.$base-color-on-error-container}) !default;

// Surface system fallbacks
$css-color-surface: var(--color-surface, #{colors.$base-color-surface}) !default;
$css-color-surface-bright: var(--color-surface-bright, #{colors.$base-color-surface-bright}) !default;
$css-color-surface-dim: var(--color-surface-dim, #{colors.$base-color-surface-dim}) !default;
$css-color-on-surface: var(--color-on-surface, #{colors.$base-color-on-surface}) !default;
$css-color-surface-lowest: var(--color-surface-lowest, #{colors.$base-color-surface-lowest}) !default;
$css-color-surface-low: var(--color-surface-low, #{colors.$base-color-surface-low}) !default;
$css-color-surface-container: var(--color-surface-container, #{colors.$base-color-surface-container}) !default;
$css-color-surface-high: var(--color-surface-high, #{colors.$base-color-surface-high}) !default;
$css-color-surface-highest: var(--color-surface-highest, #{colors.$base-color-surface-highest}) !default;
$css-color-surface-variant: var(--color-surface-variant, #{colors.$base-color-surface-variant}) !default;
$css-color-on-surface-variant: var(--color-on-surface-variant, #{colors.$base-color-on-surface-variant}) !default;
$css-color-inverse-surface: var(--color-inverse-surface, #{colors.$base-color-inverse-surface}) !default;
$css-color-inverse-on-surface: var(--color-inverse-on-surface, #{colors.$base-color-inverse-on-surface}) !default;

// Background system fallbacks
$css-color-background: var(--color-background, #{colors.$base-color-background}) !default;
$css-color-on-background: var(--color-on-background, #{colors.$base-color-on-background}) !default;

// Outline system fallbacks
$css-color-outline: var(--color-outline, #{colors.$base-color-outline}) !default;
$css-color-outline-variant: var(--color-outline-variant, #{colors.$base-color-outline-variant}) !default;

// Utility fallbacks
$css-color-shadow: var(--color-shadow, #{colors.$base-color-shadow}) !default;
$css-color-surface-tint: var(--color-surface-tint, #{colors.$base-color-surface-tint}) !default;
$css-color-scrim: var(--color-scrim, #{colors.$base-color-scrim}) !default;

// Glass effect fallbacks
$css-glass-blur-xs: var(--glass-blur-xs, #{glass.$base-glass-blur-xs}) !default;
$css-glass-blur-sm: var(--glass-blur-sm, #{glass.$base-glass-blur-sm}) !default;
$css-glass-blur-md: var(--glass-blur-md, #{glass.$base-glass-blur-md}) !default;
$css-glass-blur-lg: var(--glass-blur-lg, #{glass.$base-glass-blur-lg}) !default;
$css-glass-blur-xl: var(--glass-blur-xl, #{glass.$base-glass-blur-xl}) !default;
$css-glass-blur-2xl: var(--glass-blur-2xl, #{glass.$base-glass-blur-2xl}) !default;
$css-glass-blur-3xl: var(--glass-blur-3xl, #{glass.$base-glass-blur-3xl}) !default;

$css-glass-opacity-translucent: var(--glass-opacity-translucent, #{glass.$base-glass-opacity-translucent-light}) !default;
$css-glass-opacity-light: var(--glass-opacity-light, #{glass.$base-glass-opacity-light-light}) !default;
$css-glass-opacity-medium: var(--glass-opacity-medium, #{glass.$base-glass-opacity-medium-light}) !default;
$css-glass-opacity-heavy: var(--glass-opacity-heavy, #{glass.$base-glass-opacity-heavy-light}) !default;
$css-glass-opacity-frosted: var(--glass-opacity-frosted, #{glass.$base-glass-opacity-frosted-light}) !default;

$css-glass-background-base: var(--glass-background-base, #{glass.$base-glass-bg-light}) !default;
$css-glass-border-color: var(--glass-border-color, #{glass.$base-glass-border-light}) !default;
$css-glass-shadow-color: var(--glass-shadow-color, #{glass.$base-glass-shadow-light}) !default;

// ==========================================================================
// RUNTIME THEMING MIXIN
// ==========================================================================
// Mixin for applying CSS custom properties to components
// Use this to make components theme-aware

@mixin theme-aware-colors($properties: ()) {
  @each $property, $css-variable in $properties {
    #{$property}: var(--color-#{$css-variable});
  }
}

// Example usage:
// .my-component {
//   @include theme-aware-colors((
//     'color': 'on-surface',
//     'background-color': 'surface',
//     'border-color': 'outline'
//   ));
// }!x]// ==========================================================================
// GLASS EFFECT TOKENS
// ==========================================================================
// Base tokens for glass morphism effects including blur and opacity values
// Supports both light and dark mode variants
// ==========================================================================

// BLUR INTENSITIES
// Progressive blur values for different glass effect strengths
$base-glass-blur-none: 0 !default;
$base-glass-blur-xs: 2px !default;
$base-glass-blur-sm: 4px !default;
$base-glass-blur-md: 8px !default;
$base-glass-blur-lg: 16px !default;
$base-glass-blur-xl: 24px !default;
$base-glass-blur-2xl: 32px !default;
$base-glass-blur-3xl: 40px !default;

// GLASS OPACITY VARIANTS - LIGHT MODE
// 5 levels from nearly transparent to nearly opaque
$base-glass-opacity-translucent-light: 0.1 !default;   // Nearly transparent
$base-glass-opacity-light-light: 0.3 !default;         // Light glass
$base-glass-opacity-medium-light: 0.5 !default;        // Medium glass
$base-glass-opacity-heavy-light: 0.7 !default;         // Heavy glass
$base-glass-opacity-frosted-light: 0.85 !default;      // Nearly opaque

// GLASS OPACITY VARIANTS - DARK MODE
// Adjusted for better visibility in dark environments
$base-glass-opacity-translucent-dark: 0.05 !default;   // Nearly transparent
$base-glass-opacity-light-dark: 0.2 !default;          // Light glass
$base-glass-opacity-medium-dark: 0.4 !default;         // Medium glass
$base-glass-opacity-heavy-dark: 0.6 !default;          // Heavy glass
$base-glass-opacity-frosted-dark: 0.8 !default;        // Nearly opaque

// GLASS BACKGROUND COLORS
// Base colors for glass effects (RGB values for rgba() usage)
$base-glass-bg-light: 255, 255, 255 !default;          // White for light mode
$base-glass-bg-dark: 0, 0, 0 !default;                 // Black for dark mode

// GLASS BORDER COLORS
$base-glass-border-light: rgba(255, 255, 255, 0.2) !default;
$base-glass-border-dark: rgba(255, 255, 255, 0.1) !default;

// GLASS SHADOW COLORS
$base-glass-shadow-light: rgba(0, 0, 0, 0.1) !default;
$base-glass-shadow-dark: rgba(0, 0, 0, 0.5) !default;

// GLASS ANIMATION DURATIONS
$base-glass-duration-fast: 200ms !default;
$base-glass-duration-normal: 300ms !default;
$base-glass-duration-slow: 500ms !default;

// GLASS ANIMATION EASINGS
$base-glass-easing-smooth: cubic-bezier(0.4, 0, 0.2, 1) !default;
$base-glass-easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55) !default;

// BLUR MAP FOR EASY ACCESS
$base-glass-blurs: (
  none: $base-glass-blur-none,
  xs: $base-glass-blur-xs,
  sm: $base-glass-blur-sm,
  md: $base-glass-blur-md,
  lg: $base-glass-blur-lg,
  xl: $base-glass-blur-xl,
  2xl: $base-glass-blur-2xl,
  3xl: $base-glass-blur-3xl
) !default;

// OPACITY MAP FOR EASY ACCESS - LIGHT MODE
$base-glass-opacities-light: (
  translucent: $base-glass-opacity-translucent-light,
  light: $base-glass-opacity-light-light,
  medium: $base-glass-opacity-medium-light,
  heavy: $base-glass-opacity-heavy-light,
  frosted: $base-glass-opacity-frosted-light
) !default;

// OPACITY MAP FOR EASY ACCESS - DARK MODE
$base-glass-opacities-dark: (
  translucent: $base-glass-opacity-translucent-dark,
  light: $base-glass-opacity-light-dark,
  medium: $base-glass-opacity-medium-dark,
  heavy: $base-glass-opacity-heavy-dark,
  frosted: $base-glass-opacity-frosted-dark
) !default;+/ĳx|// Motion Tokens
// Generated from base-tokens.json

// Animation Durations
$base-motion-duration-instant: 50ms;
$base-motion-duration-fast: 150ms;
$base-motion-duration-normal: 300ms;
$base-motion-duration-slow: 500ms;
$base-motion-duration-slower: 700ms;
$base-motion-duration-slowest: 1000ms;
$base-motion-duration-ultra-slow: 2000ms;

// Easing Functions
$base-motion-easing-linear: linear;
$base-motion-easing-ease: ease;
$base-motion-easing-ease-in: cubic-bezier(0.4, 0, 1, 1);
$base-motion-easing-ease-out: cubic-bezier(0, 0, 0.2, 1);
$base-motion-easing-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
$base-motion-easing-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
$base-motion-easing-bounce: cubic-bezier(0.175, 0.885, 0.32, 1.275);
$base-motion-easing-sharp: cubic-bezier(0.4, 0, 0.6, 1);
$base-motion-easing-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275);

// Transition Properties
$base-motion-transition-property-none: none;
$base-motion-transition-property-all: all;
$base-motion-transition-property-colors: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke;
$base-motion-transition-property-opacity: opacity;
$base-motion-transition-property-shadow: box-shadow;
$base-motion-transition-property-transform: transform;
$base-motion-transition-property-spacing: margin, padding;
$base-motion-transition-property-size: width, height;

// Transition Durations
$base-motion-transition-duration-0: 0ms;
$base-motion-transition-duration-75: 75ms;
$base-motion-transition-duration-100: 100ms;
$base-motion-transition-duration-150: 150ms;
$base-motion-transition-duration-200: 200ms;
$base-motion-transition-duration-300: 300ms;
$base-motion-transition-duration-500: 500ms;
$base-motion-transition-duration-700: 700ms;
$base-motion-transition-duration-1000: 1000ms;
$base-motion-transition-duration-1500: 1500ms;
$base-motion-transition-duration-2000: 2000ms;

// Transition Timing Functions
$base-motion-transition-timing-linear: linear;
$base-motion-transition-timing-in: cubic-bezier(0.4, 0, 1, 1);
$base-motion-transition-timing-out: cubic-bezier(0, 0, 0.2, 1);
$base-motion-transition-timing-in-out: cubic-bezier(0.4, 0, 0.2, 1);
$base-motion-transition-timing-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
$base-motion-transition-timing-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);

// Transition Delays
$base-motion-transition-delay-0: 0ms;
$base-motion-transition-delay-75: 75ms;
$base-motion-transition-delay-100: 100ms;
$base-motion-transition-delay-150: 150ms;
$base-motion-transition-delay-200: 200ms;
$base-motion-transition-delay-300: 300ms;
$base-motion-transition-delay-500: 500ms;
$base-motion-transition-delay-700: 700ms;
$base-motion-transition-delay-1000: 1000ms;

// Duration Map
$base-motion-durations: (
  instant: $base-motion-duration-instant,
  fast: $base-motion-duration-fast,
  normal: $base-motion-duration-normal,
  slow: $base-motion-duration-slow,
  slower: $base-motion-duration-slower,
  slowest: $base-motion-duration-slowest,
  ultra-slow: $base-motion-duration-ultra-slow,
);

// Easing Map
$base-motion-easings: (
  linear: $base-motion-easing-linear,
  ease: $base-motion-easing-ease,
  ease-in: $base-motion-easing-ease-in,
  ease-out: $base-motion-easing-ease-out,
  ease-in-out: $base-motion-easing-ease-in-out,
  spring: $base-motion-easing-spring,
  bounce: $base-motion-easing-bounce,
  sharp: $base-motion-easing-sharp,
  elastic: $base-motion-easing-elastic,
);

// Hover Transform Values
$base-motion-hover-transform-none: none;
$base-motion-hover-transform-scale-sm: scale(1.02);
$base-motion-hover-transform-scale-md: scale(1.05);
$base-motion-hover-transform-scale-lg: scale(1.1);
$base-motion-hover-transform-lift-sm: translateY(-2px);
$base-motion-hover-transform-lift-md: translateY(-4px);
$base-motion-hover-transform-lift-lg: translateY(-8px);
$base-motion-hover-transform-scale-lift-sm: scale(1.02) translateY(-2px);
$base-motion-hover-transform-scale-lift-md: scale(1.05) translateY(-4px);

// Transition Property Map
$base-motion-transition-properties: (
  none: $base-motion-transition-property-none,
  all: $base-motion-transition-property-all,
  colors: $base-motion-transition-property-colors,
  opacity: $base-motion-transition-property-opacity,
  shadow: $base-motion-transition-property-shadow,
  transform: $base-motion-transition-property-transform,
  spacing: $base-motion-transition-property-spacing,
  size: $base-motion-transition-property-size,
);

// Hover Transform Map
$base-motion-hover-transforms: (
  none: $base-motion-hover-transform-none,
  scale-sm: $base-motion-hover-transform-scale-sm,
  scale-md: $base-motion-hover-transform-scale-md,
  scale-lg: $base-motion-hover-transform-scale-lg,
  lift-sm: $base-motion-hover-transform-lift-sm,
  lift-md: $base-motion-hover-transform-lift-md,
  lift-lg: $base-motion-hover-transform-lift-lg,
  scale-lift-sm: $base-motion-hover-transform-scale-lift-sm,
  scale-lift-md: $base-motion-hover-transform-scale-lift-md,
);xĹ3x4// Opacity Tokens
// Generated from base-tokens.json

// Opacity Values
$base-opacity-0: 0;
$base-opacity-5: 0.05;
$base-opacity-10: 0.10;
$base-opacity-20: 0.20;
$base-opacity-25: 0.25;
$base-opacity-30: 0.30;
$base-opacity-40: 0.40;
$base-opacity-50: 0.50;
$base-opacity-60: 0.60;
$base-opacity-70: 0.70;
$base-opacity-75: 0.75;
$base-opacity-80: 0.80;
$base-opacity-90: 0.90;
$base-opacity-95: 0.95;
$base-opacity-100: 1;

// Opacity Map
$base-opacities: (
  0: $base-opacity-0,
  5: $base-opacity-5,
  10: $base-opacity-10,
  20: $base-opacity-20,
  25: $base-opacity-25,
  30: $base-opacity-30,
  40: $base-opacity-40,
  50: $base-opacity-50,
  60: $base-opacity-60,
  70: $base-opacity-70,
  75: $base-opacity-75,
  80: $base-opacity-80,
  90: $base-opacity-90,
  95: $base-opacity-95,
  100: $base-opacity-100,
);,ɳOx// Shadow Tokens
// Generated from base-tokens.json

// Standard Shadows
$base-shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
$base-shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
$base-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
$base-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
$base-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
$base-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
$base-shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.05);
$base-shadow-none: none;

// AI Shadows
$base-shadow-ai-glow: 0 0 20px rgba(139, 92, 246, 0.3), 0 0 40px rgba(139, 92, 246, 0.1);
$base-shadow-ai-pulse: 0 0 30px rgba(6, 182, 212, 0.4), 0 0 60px rgba(6, 182, 212, 0.2);
$base-shadow-ai-soft: 0 0 15px rgba(139, 92, 246, 0.2), 0 0 30px rgba(139, 92, 246, 0.1);

// Shadow Scale Map
$base-shadows: (
  xs: $base-shadow-xs,
  sm: $base-shadow-sm,
  md: $base-shadow-md,
  lg: $base-shadow-lg,
  xl: $base-shadow-xl,
  2xl: $base-shadow-2xl,
  inner: $base-shadow-inner,
  none: $base-shadow-none,
);

// AI Shadow Map
$base-shadows-ai: (
  glow: $base-shadow-ai-glow,
  pulse: $base-shadow-ai-pulse,
  soft: $base-shadow-ai-soft,
);7dMxv// Sizing Tokens
// Generated from base-tokens.json

// Icon Sizes
$base-sizing-icon-xxs: 8px;
$base-sizing-icon-xs: 12px;
$base-sizing-icon-sm: 16px;
$base-sizing-icon-md: 20px;
$base-sizing-icon-lg: 24px;
$base-sizing-icon-xl: 32px;
$base-sizing-icon-2xl: 40px;
$base-sizing-icon-3xl: 48px;
$base-sizing-icon-4xl: 64px;
$base-sizing-icon-5xl: 80px;

// Avatar Sizes
$base-sizing-avatar-xs: 24px;
$base-sizing-avatar-sm: 32px;
$base-sizing-avatar-md: 40px;
$base-sizing-avatar-lg: 48px;
$base-sizing-avatar-xl: 64px;
$base-sizing-avatar-2xl: 80px;

// Button Sizes
$base-sizing-button-sm: 32px;
$base-sizing-button-md: 40px;
$base-sizing-button-lg: 48px;

// Input Sizes
$base-sizing-input-sm: 32px;
$base-sizing-input-md: 40px;
$base-sizing-input-lg: 48px;

// Touch Target Sizes
$base-sizing-interaction-touch-target: 44px;
$base-sizing-interaction-min-clickable: 32px;

$base-sizing-touch-minimum: 44px;
$base-sizing-touch-comfortable: 48px;
$base-sizing-touch-spacious: 56px;

// Line Sizes
$base-sizing-line-1: 1px;
$base-sizing-line-2: 2px;
$base-sizing-line-4: 4px;
$base-sizing-line-8: 8px;

// Width Values
$base-sizing-width-0: 0px;
$base-sizing-width-1: 0.25rem;
$base-sizing-width-2: 0.5rem;
$base-sizing-width-3: 0.75rem;
$base-sizing-width-4: 1rem;
$base-sizing-width-5: 1.25rem;
$base-sizing-width-6: 1.5rem;
$base-sizing-width-7: 1.75rem;
$base-sizing-width-8: 2rem;
$base-sizing-width-9: 2.25rem;
$base-sizing-width-10: 2.5rem;
$base-sizing-width-11: 2.75rem;
$base-sizing-width-12: 3rem;
$base-sizing-width-14: 3.5rem;
$base-sizing-width-16: 4rem;
$base-sizing-width-20: 5rem;
$base-sizing-width-24: 6rem;
$base-sizing-width-28: 7rem;
$base-sizing-width-32: 8rem;
$base-sizing-width-36: 9rem;
$base-sizing-width-40: 10rem;
$base-sizing-width-44: 11rem;
$base-sizing-width-48: 12rem;
$base-sizing-width-52: 13rem;
$base-sizing-width-56: 14rem;
$base-sizing-width-60: 15rem;
$base-sizing-width-64: 16rem;
$base-sizing-width-72: 18rem;
$base-sizing-width-80: 20rem;
$base-sizing-width-96: 24rem;
$base-sizing-width-auto: auto;
$base-sizing-width-full: 100%;
$base-sizing-width-screen: 100vw;
$base-sizing-width-min: min-content;
$base-sizing-width-max: max-content;
$base-sizing-width-fit: fit-content;

// Height Values
$base-sizing-height-0: 0px;
$base-sizing-height-1: 0.25rem;
$base-sizing-height-2: 0.5rem;
$base-sizing-height-3: 0.75rem;
$base-sizing-height-4: 1rem;
$base-sizing-height-5: 1.25rem;
$base-sizing-height-6: 1.5rem;
$base-sizing-height-7: 1.75rem;
$base-sizing-height-8: 2rem;
$base-sizing-height-9: 2.25rem;
$base-sizing-height-10: 2.5rem;
$base-sizing-height-11: 2.75rem;
$base-sizing-height-12: 3rem;
$base-sizing-height-14: 3.5rem;
$base-sizing-height-16: 4rem;
$base-sizing-height-20: 5rem;
$base-sizing-height-24: 6rem;
$base-sizing-height-28: 7rem;
$base-sizing-height-32: 8rem;
$base-sizing-height-36: 9rem;
$base-sizing-height-40: 10rem;
$base-sizing-height-44: 11rem;
$base-sizing-height-48: 12rem;
$base-sizing-height-52: 13rem;
$base-sizing-height-56: 14rem;
$base-sizing-height-60: 15rem;
$base-sizing-height-64: 16rem;
$base-sizing-height-72: 18rem;
$base-sizing-height-80: 20rem;
$base-sizing-height-96: 24rem;
$base-sizing-height-auto: auto;
$base-sizing-height-full: 100%;
$base-sizing-height-screen: 100vh;
$base-sizing-height-min: min-content;
$base-sizing-height-max: max-content;
$base-sizing-height-fit: fit-content;

// Max Width Values
$base-sizing-max-width-0: 0px;
$base-sizing-max-width-xs: 20rem;
$base-sizing-max-width-sm: 24rem;
$base-sizing-max-width-md: 28rem;
$base-sizing-max-width-lg: 32rem;
$base-sizing-max-width-xl: 36rem;
$base-sizing-max-width-2xl: 42rem;
$base-sizing-max-width-3xl: 48rem;
$base-sizing-max-width-4xl: 56rem;
$base-sizing-max-width-5xl: 64rem;
$base-sizing-max-width-6xl: 72rem;
$base-sizing-max-width-7xl: 80rem;
$base-sizing-max-width-full: 100%;
$base-sizing-max-width-min: min-content;
$base-sizing-max-width-max: max-content;
$base-sizing-max-width-fit: fit-content;
$base-sizing-max-width-prose: 65ch;
$base-sizing-max-width-screen-sm: 640px;
$base-sizing-max-width-screen-md: 768px;
$base-sizing-max-width-screen-lg: 1024px;
$base-sizing-max-width-screen-xl: 1280px;
$base-sizing-max-width-screen-2xl: 1536px;

// Min Width/Height Values
$base-sizing-min-width-0: 0px;
$base-sizing-min-width-full: 100%;
$base-sizing-min-width-min: min-content;
$base-sizing-min-width-max: max-content;
$base-sizing-min-width-fit: fit-content;

$base-sizing-min-height-0: 0px;
$base-sizing-min-height-full: 100%;
$base-sizing-min-height-screen: 100vh;
$base-sizing-min-height-min: min-content;
$base-sizing-min-height-max: max-content;
$base-sizing-min-height-fit: fit-content;

$base-sizing-max-height-0: 0px;
$base-sizing-max-height-full: 100%;
$base-sizing-max-height-screen: 100vh;
$base-sizing-max-height-min: min-content;
$base-sizing-max-height-max: max-content;
$base-sizing-max-height-fit: fit-content;

// AI Sizing
$base-sizing-ai-indicator: 20px;
$base-sizing-ai-glow: 40px;

// Component Size Maps
$base-sizing-icons: (
  xxs: $base-sizing-icon-xxs,
  xs: $base-sizing-icon-xs,
  sm: $base-sizing-icon-sm,
  md: $base-sizing-icon-md,
  lg: $base-sizing-icon-lg,
  xl: $base-sizing-icon-xl,
  2xl: $base-sizing-icon-2xl,
  3xl: $base-sizing-icon-3xl,
  4xl: $base-sizing-icon-4xl,
  5xl: $base-sizing-icon-5xl,
);

$base-sizing-avatars: (
  xs: $base-sizing-avatar-xs,
  sm: $base-sizing-avatar-sm,
  md: $base-sizing-avatar-md,
  lg: $base-sizing-avatar-lg,
  xl: $base-sizing-avatar-xl,
  2xl: $base-sizing-avatar-2xl,
);

$base-sizing-buttons: (
  sm: $base-sizing-button-sm,
  md: $base-sizing-button-md,
  lg: $base-sizing-button-lg,
);

$base-sizing-inputs: (
  sm: $base-sizing-input-sm,
  md: $base-sizing-input-md,
  lg: $base-sizing-input-lg,
);wyJxG// Spacing Tokens
// Generated from base-tokens.json

// Base Spacing Configuration
$base-spacing-base: 1rem;
$base-spacing-scale: 1.5;
$base-spacing-micro-hairline: 0.5px;

// Spacing Values
$base-spacing-0: 0px;
$base-spacing-0-5: 0.125rem;
$base-spacing-1: 0.25rem;
$base-spacing-1-5: 0.375rem;
$base-spacing-2: 0.5rem;
$base-spacing-2-5: 0.625rem;
$base-spacing-3: 0.75rem;
$base-spacing-3-5: 0.875rem;
$base-spacing-4: 1rem;
$base-spacing-4-5: 1.125rem;
$base-spacing-5: 1.25rem;
$base-spacing-6: 1.5rem;
$base-spacing-7: 1.75rem;
$base-spacing-8: 2rem;
$base-spacing-9: 2.25rem;
$base-spacing-10: 2.5rem;
$base-spacing-11: 2.75rem;
$base-spacing-12: 3rem;
$base-spacing-14: 3.5rem;
$base-spacing-16: 4rem;
$base-spacing-20: 5rem;
$base-spacing-24: 6rem;
$base-spacing-28: 7rem;
$base-spacing-32: 8rem;
$base-spacing-36: 9rem;
$base-spacing-40: 10rem;
$base-spacing-44: 11rem;
$base-spacing-48: 12rem;
$base-spacing-52: 13rem;
$base-spacing-56: 14rem;
$base-spacing-60: 15rem;
$base-spacing-64: 16rem;
$base-spacing-72: 18rem;
$base-spacing-80: 20rem;
$base-spacing-96: 24rem;
$base-spacing-128: 32rem;
$base-spacing-160: 40rem;
$base-spacing-192: 48rem;
$base-spacing-224: 56rem;
$base-spacing-256: 64rem;

// Semantic Spacing
$base-spacing-semantic-xs: 0.5rem;
$base-spacing-semantic-sm: 0.75rem;
$base-spacing-semantic-md: 1rem;
$base-spacing-semantic-lg: 1.5rem;
$base-spacing-semantic-xl: 2rem;
$base-spacing-semantic-2xl: 2.5rem;
$base-spacing-semantic-3xl: 3rem;
$base-spacing-semantic-4xl: 4rem;
$base-spacing-semantic-5xl: 5rem;

// Spacing Scale Map
$base-spacing-scale-map: (
  0: $base-spacing-0,
  0.5: $base-spacing-0-5,
  1: $base-spacing-1,
  1.5: $base-spacing-1-5,
  2: $base-spacing-2,
  2.5: $base-spacing-2-5,
  3: $base-spacing-3,
  3.5: $base-spacing-3-5,
  4: $base-spacing-4,
  5: $base-spacing-5,
  6: $base-spacing-6,
  7: $base-spacing-7,
  8: $base-spacing-8,
  9: $base-spacing-9,
  10: $base-spacing-10,
  11: $base-spacing-11,
  12: $base-spacing-12,
  14: $base-spacing-14,
  16: $base-spacing-16,
  20: $base-spacing-20,
  24: $base-spacing-24,
  28: $base-spacing-28,
  32: $base-spacing-32,
  36: $base-spacing-36,
  40: $base-spacing-40,
  44: $base-spacing-44,
  48: $base-spacing-48,
  52: $base-spacing-52,
  56: $base-spacing-56,
  60: $base-spacing-60,
  64: $base-spacing-64,
  72: $base-spacing-72,
  80: $base-spacing-80,
  96: $base-spacing-96,
  128: $base-spacing-128,
  160: $base-spacing-160,
  192: $base-spacing-192,
  224: $base-spacing-224,
  256: $base-spacing-256,
);

// Semantic Spacing Map
$base-spacing-semantic: (
  xs: $base-spacing-semantic-xs,
  sm: $base-spacing-semantic-sm,
  md: $base-spacing-semantic-md,
  lg: $base-spacing-semantic-lg,
  xl: $base-spacing-semantic-xl,
  2xl: $base-spacing-semantic-2xl,
  3xl: $base-spacing-semantic-3xl,
  4xl: $base-spacing-semantic-4xl,
  5xl: $base-spacing-semantic-5xl,
);3dnlUx;.Jl78$1x8// Typography Tokens
// Generated from base-tokens.json
// Using Google Fonts: Inter, Playfair Display, JetBrains Mono

// Font Families with Google Fonts
$base-typography-font-family-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
$base-typography-font-family-serif: 'Playfair Display', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;
$base-typography-font-family-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Monaco, Consolas, 'Courier New', monospace;
$base-typography-font-family-display: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;

// Font Sizes
$base-typography-font-size-xs: 0.75rem;    // 12px
$base-typography-font-size-sm: 0.875rem;   // 14px
$base-typography-font-size-md: 1rem;       // 16px
$base-typography-font-size-lg: 1.125rem;   // 18px
$base-typography-font-size-xl: 1.25rem;    // 20px
$base-typography-font-size-2xl: 1.5rem;    // 24px
$base-typography-font-size-3xl: 1.875rem;  // 30px
$base-typography-font-size-4xl: 2.25rem;   // 36px
$base-typography-font-size-5xl: 3rem;      // 48px
$base-typography-font-size-6xl: 3.75rem;   // 60px
$base-typography-font-size-7xl: 4.5rem;    // 72px
$base-typography-font-size-8xl: 6rem;      // 96px
$base-typography-font-size-9xl: 8rem;      // 128px
$base-typography-font-size-10xl: 10rem;    // 160px
$base-typography-font-size-11xl: 12rem;    // 192px

// Font Weights
$base-typography-font-weight-100: 100;
$base-typography-font-weight-200: 200;
$base-typography-font-weight-300: 300;
$base-typography-font-weight-400: 400;
$base-typography-font-weight-500: 500;
$base-typography-font-weight-600: 600;
$base-typography-font-weight-700: 700;
$base-typography-font-weight-800: 800;
$base-typography-font-weight-900: 900;

$base-typography-font-weight-thin: 100;
$base-typography-font-weight-extralight: 200;
$base-typography-font-weight-light: 300;
$base-typography-font-weight-normal: 400;
$base-typography-font-weight-medium: 500;
$base-typography-font-weight-semibold: 600;
$base-typography-font-weight-bold: 700;
$base-typography-font-weight-extrabold: 800;
$base-typography-font-weight-black: 900;

// Line Heights
$base-typography-line-height-none: 1;
$base-typography-line-height-tight: 1.25;
$base-typography-line-height-snug: 1.375;
$base-typography-line-height-normal: 1.5;
$base-typography-line-height-relaxed: 1.625;
$base-typography-line-height-loose: 2;
$base-typography-line-height-3: 0.75rem;
$base-typography-line-height-4: 1rem;
$base-typography-line-height-5: 1.25rem;
$base-typography-line-height-6: 1.5rem;
$base-typography-line-height-7: 1.75rem;
$base-typography-line-height-8: 2rem;
$base-typography-line-height-9: 2.25rem;
$base-typography-line-height-10: 2.5rem;

// Letter Spacing
$base-typography-letter-spacing-tighter: -0.05em;
$base-typography-letter-spacing-tight: -0.025em;
$base-typography-letter-spacing-normal: 0em;
$base-typography-letter-spacing-wide: 0.025em;
$base-typography-letter-spacing-wider: 0.05em;
$base-typography-letter-spacing-widest: 0.1em;

// Word Spacing
$base-typography-word-spacing-tight: -0.05em;
$base-typography-word-spacing-normal: 0em;
$base-typography-word-spacing-wide: 0.05em;
$base-typography-word-spacing-wider: 0.1em;

// Text Decoration
$base-typography-text-decoration-line-none: none;
$base-typography-text-decoration-line-underline: underline;
$base-typography-text-decoration-line-overline: overline;
$base-typography-text-decoration-line-line-through: line-through;

$base-typography-text-decoration-style-solid: solid;
$base-typography-text-decoration-style-double: double;
$base-typography-text-decoration-style-dotted: dotted;
$base-typography-text-decoration-style-dashed: dashed;
$base-typography-text-decoration-style-wavy: wavy;

$base-typography-text-decoration-thickness-auto: auto;
$base-typography-text-decoration-thickness-from-font: from-font;
$base-typography-text-decoration-thickness-0: 0px;
$base-typography-text-decoration-thickness-1: 1px;
$base-typography-text-decoration-thickness-2: 2px;
$base-typography-text-decoration-thickness-4: 4px;
$base-typography-text-decoration-thickness-8: 8px;

$base-typography-text-decoration-offset-auto: auto;
$base-typography-text-decoration-offset-0: 0px;
$base-typography-text-decoration-offset-1: 1px;
$base-typography-text-decoration-offset-2: 2px;
$base-typography-text-decoration-offset-4: 4px;
$base-typography-text-decoration-offset-8: 8px;

// Typography Scale Map
$base-typography-scale: (
  xs: (
    font-size: $base-typography-font-size-xs,
    line-height: $base-typography-line-height-4,
  ),
  sm: (
    font-size: $base-typography-font-size-sm,
    line-height: $base-typography-line-height-5,
  ),
  md: (
    font-size: $base-typography-font-size-md,
    line-height: $base-typography-line-height-6,
  ),
  lg: (
    font-size: $base-typography-font-size-lg,
    line-height: $base-typography-line-height-7,
  ),
  xl: (
    font-size: $base-typography-font-size-xl,
    line-height: $base-typography-line-height-7,
  ),
  2xl: (
    font-size: $base-typography-font-size-2xl,
    line-height: $base-typography-line-height-8,
  ),
  3xl: (
    font-size: $base-typography-font-size-3xl,
    line-height: $base-typography-line-height-9,
  ),
  4xl: (
    font-size: $base-typography-font-size-4xl,
    line-height: $base-typography-line-height-10,
  ),
);

// Font Family Map
$base-typography-families: (
  sans: $base-typography-font-family-sans,
  serif: $base-typography-font-family-serif,
  mono: $base-typography-font-family-mono,
  display: $base-typography-font-family-display,
);

// Font Weight Map
$base-typography-weights: (
  thin: $base-typography-font-weight-thin,
  extralight: $base-typography-font-weight-extralight,
  light: $base-typography-font-weight-light,
  normal: $base-typography-font-weight-normal,
  medium: $base-typography-font-weight-medium,
  semibold: $base-typography-font-weight-semibold,
  bold: $base-typography-font-weight-bold,
  extrabold: $base-typography-font-weight-extrabold,
  black: $base-typography-font-weight-black,
);

78I]x(// Z-Index Tokens
// Generated from base-tokens.json

// Z-Index Values
$base-z-index-neg-10: -10;
$base-z-index-neg-1: -1;
$base-z-index-0: 0;
$base-z-index-10: 10;
$base-z-index-20: 20;
$base-z-index-30: 30;
$base-z-index-40: 40;
$base-z-index-50: 50;
$base-z-index-60: 60;
$base-z-index-70: 70;
$base-z-index-80: 80;
$base-z-index-90: 90;
$base-z-index-100: 100;

// Semantic Z-Index Values
$base-z-index-dropdown: 1000;
$base-z-index-sticky: 1020;
$base-z-index-fixed: 1030;
$base-z-index-modal-backdrop: 1040;
$base-z-index-overlay: 1045;
$base-z-index-modal: 1050;
$base-z-index-banner: 1010;
$base-z-index-popover: 1060;
$base-z-index-tooltip: 1070;
$base-z-index-toast: 1080;
$base-z-index-max: 2147483647;
$base-z-index-debug: 9999;

// Z-Index Map
$base-z-indexes: (
  -10: $base-z-index-neg-10,
  -1: $base-z-index-neg-1,
  0: $base-z-index-0,
  10: $base-z-index-10,
  20: $base-z-index-20,
  30: $base-z-index-30,
  40: $base-z-index-40,
  50: $base-z-index-50,
  60: $base-z-index-60,
  70: $base-z-index-70,
  80: $base-z-index-80,
  90: $base-z-index-90,
  100: $base-z-index-100,
  dropdown: $base-z-index-dropdown,
  banner: $base-z-index-banner,
  sticky: $base-z-index-sticky,
  fixed: $base-z-index-fixed,
  modal-backdrop: $base-z-index-modal-backdrop,
  overlay: $base-z-index-overlay,
  modal: $base-z-index-modal,
  popover: $base-z-index-popover,
  tooltip: $base-z-index-tooltip,
  toast: $base-z-index-toast,
  max: $base-z-index-max,
  debug: $base-z-index-debug,
);8Ǽ	x c// Base tokens entry point
@forward 'colors';
@forward 'spacing';
@forward 'typography';
@forward 'motion';
@forward 'shadows';


@forward 'css-variables';
5dx// ==========================================================================
// COMMONS LAYOUTS INDEX
// ==========================================================================
// Import all layout-related commons files
// Theme-agnostic structural definitions
// ==========================================================================

@import 'dashboard-layouts';
@import 'grid-systems';
@import 'content-containers';
@import 'page-templates';
@import 'responsive-layouts';
@import 'layout-system';2K
x WYab$commons modules in the correct order!yles that work across all themes
NR
@import 'layouts';
@import 'components';
@import 'patterns';
@import 'utilities';؅=?x =YCOMPONEN^ecomponen*#component structures and behaviors
N}
@import 'base-buttons';
@import 'base-cards';
@import 'base-forms';
@import 'base-navigation';
@import 'utility-components';*Fk
x YYUTILITIE_dutility)utility classes
Nu
@import 'layout-utilities';
@import 'spacing-utilities';
@import 'display-utilities';
@import 'scrollbar-utilities';=>x YPATTERNS INDEX
Qpattern)patternhMcontent-patterns';
@import 'interaction-patterns';
@import 'layout-patterns';.Xx// ==========================================================================
// BASE BUTTONS
// ==========================================================================
// Theme-agnostic button structures and behaviors
// Visual styling handled by themes
// ==========================================================================

// BUTTON BASE
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--btn-gap, #{$semantic-spacing-micro-icon-gap});
  padding: var(--btn-padding, #{$semantic-spacing-interactive-button-padding-y} #{$semantic-spacing-interactive-button-padding-x});
  border: var(--btn-border-width, #{$semantic-border-button-width}) solid transparent;
  border-radius: var(--btn-border-radius, #{$semantic-border-button-radius});
  font-family: inherit;
  font-size: var(--btn-font-size, 1rem);
  font-weight: var(--btn-font-weight, 500);
  line-height: var(--btn-line-height, 1.5);
  text-align: center;
  text-decoration: none;
  white-space: nowrap;
  vertical-align: middle;
  cursor: pointer;
  user-select: none;
  transition: all var(--btn-transition-duration, 0.2s) var(--btn-transition-easing, ease);
  position: relative;
  overflow: hidden;

  &:focus {
    outline: var(--btn-focus-outline, 2px solid transparent);
    outline-offset: var(--btn-focus-outline-offset, 2px);
  }

  &:disabled,
  &.btn-disabled {
    pointer-events: none;
    opacity: var(--btn-disabled-opacity, 0.6);
    cursor: not-allowed;
  }

  &.btn-loading {
    pointer-events: none;
    
    .btn-text {
      opacity: 0;
    }
    
    .btn-spinner {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    }
  }
}

// BUTTON SIZES - Using semantic sizing tokens
.btn-xs {
  --btn-padding: #{$semantic-spacing-component-padding-xs} #{$semantic-spacing-component-padding-sm};
  --btn-font-size: 0.75rem;
  --btn-gap: #{$base-spacing-1};
}

.btn-sm {
  --btn-padding: #{$semantic-spacing-component-padding-sm} #{$semantic-spacing-component-padding-md};
  --btn-font-size: 0.875rem;
  --btn-gap: #{$semantic-spacing-micro-icon-gap};
}

.btn-lg {
  --btn-padding: #{$semantic-spacing-component-padding-md} #{$semantic-spacing-component-padding-xl};
  --btn-font-size: 1.125rem;
  --btn-gap: #{$semantic-spacing-component-padding-sm};
}

.btn-xl {
  --btn-padding: #{$semantic-spacing-component-padding-lg} #{$semantic-spacing-component-padding-xl};
  --btn-font-size: 1.25rem;
  --btn-gap: 16px;
}

// BUTTON SHAPES
.btn-rounded {
  border-radius: var(--btn-rounded-radius, 50px);
}

.btn-square {
  border-radius: 0;
}

.btn-circle {
  border-radius: 50%;
  width: var(--btn-circle-size, 48px);
  height: var(--btn-circle-size, 48px);
  padding: 0;
}

// BUTTON WIDTHS
.btn-block {
  display: flex;
  width: 100%;
}

.btn-auto {
  width: auto;
}

// BUTTON GROUPS
.btn-group {
  display: inline-flex;
  vertical-align: middle;

  > .btn {
    position: relative;
    flex: 1 1 auto;
    border-radius: 0;

    &:first-child {
      border-top-left-radius: var(--btn-border-radius, 4px);
      border-bottom-left-radius: var(--btn-border-radius, 4px);
    }

    &:last-child {
      border-top-right-radius: var(--btn-border-radius, 4px);
      border-bottom-right-radius: var(--btn-border-radius, 4px);
    }

    &:not(:first-child) {
      margin-left: calc(var(--btn-border-width, 1px) * -1);
    }

    &:hover,
    &:focus,
    &.btn-active {
      z-index: 1;
    }
  }

  &.btn-group-vertical {
    flex-direction: column;

    > .btn {
      &:first-child {
        border-radius: var(--btn-border-radius, 4px) var(--btn-border-radius, 4px) 0 0;
      }

      &:last-child {
        border-radius: 0 0 var(--btn-border-radius, 4px) var(--btn-border-radius, 4px);
      }

      &:not(:first-child) {
        margin-left: 0;
        margin-top: calc(var(--btn-border-width, 1px) * -1);
      }
    }
  }
}

// FLOATING ACTION BUTTON (FAB)
.btn-fab {
  position: fixed;
  bottom: var(--fab-bottom, 24px);
  right: var(--fab-right, 24px);
  width: var(--fab-size, 56px);
  height: var(--fab-size, 56px);
  border-radius: 50%;
  padding: 0;
  z-index: var(--z-fab, 1000);
  box-shadow: var(--fab-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));
  transition: all var(--fab-transition-duration, 0.3s) var(--fab-transition-easing, ease);

  &:hover {
    transform: var(--fab-hover-transform, translateY(-2px));
    box-shadow: var(--fab-hover-shadow, 0 6px 20px rgba(0, 0, 0, 0.2));
  }

  &.btn-fab-mini {
    --fab-size: 40px;
    --fab-bottom: 16px;
    --fab-right: 16px;
  }

  &.btn-fab-extended {
    width: auto;
    min-width: var(--fab-extended-min-width, 120px);
    border-radius: var(--fab-extended-radius, 28px);
    padding: var(--fab-extended-padding, 0 20px);
    gap: var(--fab-extended-gap, 8px);
  }
}

// BUTTON ICON HANDLING
.btn-icon {
  width: var(--btn-icon-size, 24px);
  height: var(--btn-icon-size, 24px);
  flex-shrink: 0;

  &.btn-icon-start {
    margin-right: var(--btn-icon-spacing, 8px);
    margin-left: calc(var(--btn-icon-spacing, 8px) * -0.5);
  }

  &.btn-icon-end {
    margin-left: var(--btn-icon-spacing, 8px);
    margin-right: calc(var(--btn-icon-spacing, 8px) * -0.5);
  }
}

.btn-icon-only {
  width: var(--btn-icon-only-size, 40px);
  height: var(--btn-icon-only-size, 40px);
  padding: 0;

  &.btn-sm {
    --btn-icon-only-size: 32px;
  }

  &.btn-lg {
    --btn-icon-only-size: 48px;
  }

  &.btn-xl {
    --btn-icon-only-size: 56px;
  }
}

// BUTTON STATES
.btn-loading-spinner {
  display: inline-block;
  width: var(--spinner-size, 16px);
  height: var(--spinner-size, 16px);
  border: 2px solid transparent;
  border-top: 2px solid currentColor;
  border-radius: 50%;
  animation: btn-spin var(--spinner-duration, 1s) linear infinite;
}

@keyframes btn-spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

// RIPPLE EFFECT (Structure only)
.btn-ripple {
  position: relative;
  overflow: hidden;

  &::before {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: 0;
    height: 0;
    border-radius: 50%;
    transform: translate(-50%, -50%);
    transition: width 0.6s, height 0.6s;
    background: var(--btn-ripple-color, rgba(255, 255, 255, 0.3));
  }

  &:active::before {
    width: 300px;
    height: 300px;
  }
}

// TOGGLE BUTTON
.btn-toggle {
  &.btn-toggle-active {
    // Active state handled by theme
  }

  &[aria-pressed="true"] {
    // Pressed state handled by theme
  }
}

// DROPDOWN BUTTON
.btn-dropdown {
  .dropdown-caret {
    margin-left: var(--dropdown-caret-spacing, 8px);
    transition: transform var(--dropdown-transition-duration, 0.2s);
  }

  &.dropdown-open .dropdown-caret {
    transform: rotate(180deg);
  }
}

// RESPONSIVE BUTTON ADJUSTMENTS
@media (max-width: 576px) {
  .btn {
    --btn-padding: 10px 20px;
    --btn-font-size: 0.875rem;
  }

  .btn-block-mobile {
    display: flex;
    width: 100%;
  }

  .btn-fab {
    --fab-size: 48px;
    --fab-bottom: 16px;
    --fab-right: 16px;
  }
}

// ACCESSIBILITY IMPROVEMENTS
@media (prefers-reduced-motion: reduce) {
  .btn {
    transition: none;
  }

  .btn-fab {
    transition: none;
    
    &:hover {
      transform: none;
    }
  }

  .btn-loading-spinner {
    animation: none;
  }
}

// HIGH CONTRAST MODE
@media (prefers-contrast: high) {
  .btn {
    border-width: 2px;
  }

  .btn:focus {
    outline: 3px solid;
    outline-offset: 3px;
  }
}1x+$// ==========================================================================
// BASE CARDS
// ==========================================================================
// Theme-agnostic card structures and layouts
// Visual styling handled by themes
// ==========================================================================

// CARD BASE
.card {
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 0;
  word-wrap: break-word;
  background-clip: border-box;
  border: var(--card-border-width, #{$semantic-border-card-width}) solid transparent;
  border-radius: var(--card-border-radius, #{$semantic-border-card-radius});

  &.card-interactive {
    cursor: pointer;
    transition: all var(--card-transition-duration, 0.2s) var(--card-transition-easing, ease);

    &:hover {
      transform: var(--card-hover-transform, translateY(-2px));
    }

    &:active {
      transform: var(--card-active-transform, translateY(0));
    }
  }

  &.card-clickable {
    cursor: pointer;
    text-decoration: none;

    &:focus {
      outline: var(--card-focus-outline, 2px solid transparent);
      outline-offset: var(--card-focus-outline-offset, 2px);
    }
  }
}

// CARD COMPONENTS
.card-header {
  padding: var(--card-header-padding, #{$semantic-spacing-container-card-padding} #{$semantic-spacing-container-card-padding-lg});
  border-bottom: var(--card-header-border-width, #{$semantic-border-divider-width}) solid var(--card-header-border-color, transparent);
  border-top-left-radius: inherit;
  border-top-right-radius: inherit;
  display: flex;
  align-items: center;
  gap: var(--card-header-gap, #{$semantic-spacing-component-padding-sm});
  min-height: var(--card-header-min-height, auto);

  &:first-child {
    border-top-left-radius: var(--card-border-radius, #{$semantic-border-card-radius});
    border-top-right-radius: var(--card-border-radius, #{$semantic-border-card-radius});
  }

  &.card-header-borderless {
    border-bottom: none;
  }

  .card-title {
    margin: 0;
    font-size: var(--card-title-size, 1.125rem);
    font-weight: var(--card-title-weight, 600);
    line-height: var(--card-title-line-height, 1.4);
    flex: 1;
  }

  .card-subtitle {
    margin: var(--card-subtitle-margin, 4px 0 0 0);
    font-size: var(--card-subtitle-size, 0.875rem);
    opacity: var(--card-subtitle-opacity, 0.7);
  }

  .card-actions {
    display: flex;
    align-items: center;
    gap: var(--card-actions-gap, 8px);
    margin-left: auto;
  }
}

.card-body {
  flex: 1 1 auto;
  padding: var(--card-body-padding, 20px);

  &.card-body-compact {
    padding: var(--card-body-compact-padding, 12px);
  }

  &.card-body-spacious {
    padding: var(--card-body-spacious-padding, 32px);
  }

  &.card-body-flush {
    padding: 0;
  }

  &:first-child {
    border-top-left-radius: inherit;
    border-top-right-radius: inherit;
  }

  &:last-child {
    border-bottom-left-radius: inherit;
    border-bottom-right-radius: inherit;
  }

  .card-text {
    margin: 0 0 var(--card-text-spacing, 16px) 0;
    line-height: var(--card-text-line-height, 1.6);

    &:last-child {
      margin-bottom: 0;
    }
  }
}

.card-footer {
  padding: var(--card-footer-padding, 12px 20px);
  border-top: var(--card-footer-border-width, 1px) solid var(--card-footer-border-color, transparent);
  border-bottom-left-radius: inherit;
  border-bottom-right-radius: inherit;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--card-footer-gap, 12px);

  &:last-child {
    border-bottom-left-radius: var(--card-border-radius, 8px);
    border-bottom-right-radius: var(--card-border-radius, 8px);
  }

  &.card-footer-borderless {
    border-top: none;
  }

  &.card-footer-center {
    justify-content: center;
  }

  &.card-footer-end {
    justify-content: flex-end;
  }
}

// CARD MEDIA
.card-img {
  width: 100%;
  border-radius: inherit;

  &.card-img-top {
    border-bottom-left-radius: 0;
    border-bottom-right-radius: 0;
  }

  &.card-img-bottom {
    border-top-left-radius: 0;
    border-top-right-radius: 0;
  }
}

.card-img-overlay {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: var(--card-overlay-padding, 20px);
  border-radius: inherit;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}

// CARD VARIANTS
.card-horizontal {
  flex-direction: row;

  .card-img {
    flex-shrink: 0;
    width: var(--card-horizontal-img-width, 200px);
    height: auto;
    border-radius: var(--card-border-radius, 8px) 0 0 var(--card-border-radius, 8px);

    &.card-img-end {
      border-radius: 0 var(--card-border-radius, 8px) var(--card-border-radius, 8px) 0;
      order: 2;
    }
  }

  .card-body {
    display: flex;
    flex-direction: column;
    justify-content: center;
  }
}

@media (max-width: 768px) {
  .card-horizontal {
    flex-direction: column;

    .card-img {
      width: 100%;
      border-radius: var(--card-border-radius, 8px) var(--card-border-radius, 8px) 0 0;

      &.card-img-end {
        border-radius: 0 0 var(--card-border-radius, 8px) var(--card-border-radius, 8px);
        order: 0;
      }
    }
  }
}

// CARD SIZES
.card-sm {
  --card-header-padding: 12px 16px;
  --card-body-padding: 16px;
  --card-footer-padding: 8px 16px;
  --card-border-radius: 6px;
}

.card-lg {
  --card-header-padding: 24px 32px;
  --card-body-padding: 32px;
  --card-footer-padding: 16px 32px;
  --card-border-radius: 12px;
}

// CARD STATES
.card-loading {
  pointer-events: none;
  opacity: var(--card-loading-opacity, 0.7);

  .card-loading-overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: inherit;
    z-index: 1;
  }
}

.card-disabled {
  pointer-events: none;
  opacity: var(--card-disabled-opacity, 0.6);
}

// CARD GROUPS
.card-group {
  display: flex;

  > .card {
    flex: 1 0 0%;
    border-radius: 0;

    &:first-child {
      border-top-left-radius: var(--card-border-radius, 8px);
      border-bottom-left-radius: var(--card-border-radius, 8px);
    }

    &:last-child {
      border-top-right-radius: var(--card-border-radius, 8px);
      border-bottom-right-radius: var(--card-border-radius, 8px);
    }

    &:not(:last-child) {
      border-right: none;
    }
  }
}

@media (max-width: 768px) {
  .card-group {
    flex-direction: column;

    > .card {
      border-radius: 0;

      &:first-child {
        border-radius: var(--card-border-radius, 8px) var(--card-border-radius, 8px) 0 0;
      }

      &:last-child {
        border-radius: 0 0 var(--card-border-radius, 8px) var(--card-border-radius, 8px);
      }

      &:not(:last-child) {
        border-right: var(--card-border-width, 1px) solid transparent;
        border-bottom: none;
      }
    }
  }
}

// CARD DECK
.card-deck {
  display: flex;
  flex-direction: column;
  gap: var(--card-deck-gap, 24px);

  @media (min-width: 576px) {
    flex-direction: row;
  }

  > .card {
    flex: 1 0 0%;
  }
}

// CARD COLUMNS (Masonry-style)
.card-columns {
  column-count: 1;
  column-gap: var(--card-columns-gap, 24px);
  orphans: 1;
  widows: 1;

  @media (min-width: 576px) {
    column-count: 2;
  }

  @media (min-width: 768px) {
    column-count: 3;
  }

  @media (min-width: 992px) {
    column-count: 4;
  }

  > .card {
    display: inline-block;
    width: 100%;
    margin-bottom: var(--card-columns-gap, 24px);
    break-inside: avoid;
  }
}

// CARD GRID
.card-grid {
  display: grid;
  gap: var(--card-grid-gap, 24px);
  grid-template-columns: 1fr;

  @media (min-width: 576px) {
    grid-template-columns: repeat(2, 1fr);
  }

  @media (min-width: 768px) {
    grid-template-columns: repeat(3, 1fr);
  }

  @media (min-width: 992px) {
    grid-template-columns: repeat(4, 1fr);
  }

  &.card-grid-auto-fit {
    grid-template-columns: repeat(auto-fit, minmax(var(--card-grid-min-width, 280px), 1fr));
  }

  &.card-grid-auto-fill {
    grid-template-columns: repeat(auto-fill, minmax(var(--card-grid-min-width, 280px), 1fr));
  }
}

// SPECIAL CARD TYPES
.card-feature {
  text-align: center;

  .card-body {
    padding: var(--card-feature-padding, 48px 32px);
  }

  .card-icon {
    width: var(--card-feature-icon-size, 64px);
    height: var(--card-feature-icon-size, 64px);
    margin: 0 auto var(--card-feature-icon-spacing, 24px) auto;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--card-feature-icon-radius, 12px);
  }
}

.card-profile {
  text-align: center;

  .card-avatar {
    width: var(--card-avatar-size, 80px);
    height: var(--card-avatar-size, 80px);
    border-radius: 50%;
    margin: calc(var(--card-avatar-size, 80px) / -2) auto var(--card-avatar-spacing, 16px) auto;
    border: var(--card-avatar-border, 4px solid white);
    position: relative;
    z-index: 1;
  }

  .card-header {
    padding-bottom: calc(var(--card-avatar-size, 80px) / 2 + var(--card-header-padding-bottom, 16px));
  }
}

// ACCESSIBILITY
@media (prefers-reduced-motion: reduce) {
  .card-interactive {
    transition: none;

    &:hover {
      transform: none;
    }
  }
}

@media (prefers-contrast: high) {
  .card {
    border-width: 2px;
  }
}W@x-R// ==========================================================================
// BASE FORMS
// ==========================================================================
// Theme-agnostic form structures and behaviors
// Visual styling handled by themes
// ==========================================================================

// FORM CONTAINER
.form {
  display: flex;
  flex-direction: column;
  gap: var(--form-gap, 24px);
  max-width: var(--form-max-width, 100%);
  margin: var(--form-margin, 0);

  &.form-inline {
    flex-direction: row;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--form-inline-gap, 16px);
  }

  &.form-compact {
    gap: var(--form-compact-gap, 16px);
  }

  &.form-spacious {
    gap: var(--form-spacious-gap, 32px);
  }
}

// FIELDSET
.fieldset {
  border: var(--fieldset-border, 1px solid transparent);
  border-radius: var(--fieldset-border-radius, 8px);
  padding: var(--fieldset-padding, 24px);
  margin: var(--fieldset-margin, 0 0 24px 0);

  .fieldset-legend {
    font-size: var(--fieldset-legend-size, 1.125rem);
    font-weight: var(--fieldset-legend-weight, 600);
    margin-bottom: var(--fieldset-legend-spacing, 16px);
    padding: var(--fieldset-legend-padding, 0 8px);
  }
}

// FORM FIELD
.form-field {
  display: flex;
  flex-direction: column;
  gap: var(--form-field-gap, 8px);
  position: relative;

  &.form-field-inline {
    flex-direction: row;
    align-items: center;
    gap: var(--form-field-inline-gap, 12px);

    .form-label {
      flex-shrink: 0;
      margin-bottom: 0;
      min-width: var(--form-label-min-width, 120px);
    }

    .form-input-wrapper {
      flex: 1;
    }
  }

  &.form-field-checkbox,
  &.form-field-radio {
    flex-direction: row;
    align-items: flex-start;
    gap: var(--form-checkbox-gap, 8px);

    .form-input {
      flex-shrink: 0;
      margin: 0;
    }

    .form-label {
      flex: 1;
      margin-bottom: 0;
      cursor: pointer;
      line-height: var(--form-checkbox-label-line-height, 1.5);
    }
  }

  &.form-field-error {
    .form-input {
      border-color: var(--form-error-color, #dc3545);
    }

    .form-label {
      color: var(--form-error-color, #dc3545);
    }
  }

  &.form-field-success {
    .form-input {
      border-color: var(--form-success-color, #28a745);
    }
  }

  &.form-field-disabled {
    opacity: var(--form-disabled-opacity, 0.6);
    pointer-events: none;
  }
}

// FORM LABEL
.form-label {
  font-size: var(--form-label-size, 0.875rem);
  font-weight: var(--form-label-weight, 500);
  line-height: var(--form-label-line-height, 1.4);
  margin-bottom: var(--form-label-spacing, 8px);
  cursor: pointer;

  &.form-label-required::after {
    content: var(--form-required-indicator, ' *');
    color: var(--form-required-color, #dc3545);
  }

  &.form-label-optional::after {
    content: var(--form-optional-indicator, ' (optional)');
    opacity: var(--form-optional-opacity, 0.6);
    font-weight: normal;
  }
}

// FORM INPUTS
.form-input {
  width: 100%;
  padding: var(--form-input-padding, 12px 16px);
  border: var(--form-input-border, 1px solid #d1d5db);
  border-radius: var(--form-input-border-radius, 6px);
  font-family: inherit;
  font-size: var(--form-input-font-size, 1rem);
  line-height: var(--form-input-line-height, 1.5);
  transition: all var(--form-input-transition-duration, 0.2s) var(--form-input-transition-easing, ease);
  background: var(--form-input-background, transparent);

  &:focus {
    outline: var(--form-input-focus-outline, 2px solid transparent);
    outline-offset: var(--form-input-focus-outline-offset, 2px);
    border-color: var(--form-input-focus-border-color, #3b82f6);
  }

  &:disabled,
  &[readonly] {
    opacity: var(--form-input-disabled-opacity, 0.6);
    cursor: not-allowed;
    background: var(--form-input-disabled-background, #f9fafb);
  }

  &::placeholder {
    color: var(--form-input-placeholder-color, #9ca3af);
    opacity: 1;
  }
}

// INPUT SIZES
.form-input-sm {
  --form-input-padding: 8px 12px;
  --form-input-font-size: 0.875rem;
}

.form-input-lg {
  --form-input-padding: 16px 20px;
  --form-input-font-size: 1.125rem;
}

// TEXTAREA
.form-textarea {
  min-height: var(--form-textarea-min-height, 120px);
  resize: var(--form-textarea-resize, vertical);
  line-height: var(--form-textarea-line-height, 1.6);
}

// SELECT
.form-select {
  cursor: pointer;
  appearance: none;
  background-image: var(--form-select-arrow, url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E"));
  background-position: right 12px center;
  background-repeat: no-repeat;
  background-size: 16px 12px;
  padding-right: var(--form-select-padding-right, 40px);

  &[multiple] {
    background-image: none;
    padding-right: var(--form-input-padding-right, 16px);
  }
}

// CHECKBOX & RADIO
.form-checkbox,
.form-radio {
  width: var(--form-checkbox-size, 18px);
  height: var(--form-checkbox-size, 18px);
  margin: var(--form-checkbox-margin, 2px 0 0 0);
  cursor: pointer;
  appearance: none;
  border: var(--form-checkbox-border, 2px solid #d1d5db);
  transition: all var(--form-checkbox-transition-duration, 0.2s) var(--form-checkbox-transition-easing, ease);

  &:focus {
    outline: var(--form-checkbox-focus-outline, 2px solid transparent);
    outline-offset: var(--form-checkbox-focus-outline-offset, 2px);
  }

  &:checked {
    background: var(--form-checkbox-checked-background, #3b82f6);
    border-color: var(--form-checkbox-checked-border-color, #3b82f6);
  }

  &:disabled {
    opacity: var(--form-checkbox-disabled-opacity, 0.5);
    cursor: not-allowed;
  }
}

.form-checkbox {
  border-radius: var(--form-checkbox-border-radius, 3px);

  &:checked {
    background-image: var(--form-checkbox-check-icon, url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m13.854 3.646-7.5 7.5a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6 10.293l7.146-7.147a.5.5 0 0 1 .708.708z'/%3E%3C/svg%3E"));
    background-position: center;
    background-repeat: no-repeat;
    background-size: 12px 12px;
  }

  &:indeterminate {
    background: var(--form-checkbox-indeterminate-background, #3b82f6);
    border-color: var(--form-checkbox-indeterminate-border-color, #3b82f6);
    background-image: var(--form-checkbox-indeterminate-icon, url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E"));
    background-position: center;
    background-repeat: no-repeat;
    background-size: 12px 12px;
  }
}

.form-radio {
  border-radius: 50%;

  &:checked {
    background-image: var(--form-radio-dot-icon, radial-gradient(circle at center, white 4px, transparent 4px));
  }
}

// INPUT GROUPS
.form-input-group {
  display: flex;
  position: relative;

  > .form-input {
    position: relative;
    flex: 1 1 auto;
    min-width: 0;

    &:not(:first-child) {
      border-top-left-radius: 0;
      border-bottom-left-radius: 0;
      border-left: none;
    }

    &:not(:last-child) {
      border-top-right-radius: 0;
      border-bottom-right-radius: 0;
    }

    &:focus {
      z-index: 2;
    }
  }

  .form-input-addon,
  .form-input-btn {
    display: flex;
    align-items: center;
    padding: var(--form-input-addon-padding, 12px 16px);
    font-size: var(--form-input-addon-font-size, 1rem);
    border: var(--form-input-border, 1px solid #d1d5db);
    white-space: nowrap;

    &:first-child {
      border-top-left-radius: var(--form-input-border-radius, 6px);
      border-bottom-left-radius: var(--form-input-border-radius, 6px);
      border-right: none;
    }

    &:last-child {
      border-top-right-radius: var(--form-input-border-radius, 6px);
      border-bottom-right-radius: var(--form-input-border-radius, 6px);
      border-left: none;
    }
  }

  .form-input-btn {
    cursor: pointer;
    transition: all var(--form-input-btn-transition-duration, 0.2s);

    &:hover {
      z-index: 2;
    }
  }
}

// FLOATING LABELS
.form-floating {
  position: relative;

  .form-input {
    height: var(--form-floating-height, 56px);
    padding: var(--form-floating-padding, 20px 16px 8px 16px);

    &:focus,
    &:not(:placeholder-shown) {
      padding: var(--form-floating-padding-active, 20px 16px 8px 16px);
    }

    &::placeholder {
      opacity: 0;
      transition: opacity var(--form-floating-transition-duration, 0.2s);
    }

    &:focus::placeholder {
      opacity: 1;
    }
  }

  .form-label {
    position: absolute;
    top: 50%;
    left: 16px;
    margin-bottom: 0;
    pointer-events: none;
    transform: translateY(-50%);
    transition: all var(--form-floating-transition-duration, 0.2s) var(--form-floating-transition-easing, ease);
    transform-origin: left center;
    cursor: text;
  }

  .form-input:focus ~ .form-label,
  .form-input:not(:placeholder-shown) ~ .form-label {
    top: 12px;
    transform: translateY(0) scale(0.85);
    opacity: var(--form-floating-label-opacity, 0.7);
  }
}

// FORM FEEDBACK
.form-feedback {
  font-size: var(--form-feedback-size, 0.875rem);
  line-height: var(--form-feedback-line-height, 1.4);
  margin-top: var(--form-feedback-spacing, 6px);

  &.form-feedback-error {
    color: var(--form-error-color, #dc3545);
  }

  &.form-feedback-success {
    color: var(--form-success-color, #28a745);
  }

  &.form-feedback-warning {
    color: var(--form-warning-color, #ffc107);
  }

  &.form-feedback-info {
    color: var(--form-info-color, #17a2b8);
  }
}

.form-help-text {
  font-size: var(--form-help-size, 0.875rem);
  line-height: var(--form-help-line-height, 1.4);
  margin-top: var(--form-help-spacing, 6px);
  opacity: var(--form-help-opacity, 0.7);
}

// FORM ACTIONS
.form-actions {
  display: flex;
  gap: var(--form-actions-gap, 12px);
  align-items: center;
  padding-top: var(--form-actions-padding, 16px);
  margin-top: var(--form-actions-margin, 24px);
  border-top: var(--form-actions-border, 1px solid transparent);

  &.form-actions-center {
    justify-content: center;
  }

  &.form-actions-end {
    justify-content: flex-end;
  }

  &.form-actions-between {
    justify-content: space-between;
  }

  &.form-actions-stack {
    flex-direction: column;

    .btn {
      width: 100%;
    }
  }
}

@media (max-width: 576px) {
  .form-actions {
    flex-direction: column;

    .btn {
      width: 100%;
    }
  }

  .form-field-inline {
    flex-direction: column;
    align-items: stretch;

    .form-label {
      min-width: auto;
    }
  }
}

// FORM VALIDATION
.was-validated {
  .form-input {
    &:valid {
      border-color: var(--form-success-color, #28a745);

      &:focus {
        border-color: var(--form-success-color, #28a745);
        box-shadow: var(--form-success-focus-shadow, 0 0 0 0.2rem rgba(40, 167, 69, 0.25));
      }
    }

    &:invalid {
      border-color: var(--form-error-color, #dc3545);

      &:focus {
        border-color: var(--form-error-color, #dc3545);
        box-shadow: var(--form-error-focus-shadow, 0 0 0 0.2rem rgba(220, 53, 69, 0.25));
      }
    }
  }
}

// ACCESSIBILITY
@media (prefers-reduced-motion: reduce) {
  .form-input,
  .form-checkbox,
  .form-radio,
  .form-floating .form-label {
    transition: none;
  }
}

@media (prefers-contrast: high) {
  .form-input,
  .form-select,
  .form-textarea {
    border-width: 2px;
  }

  .form-checkbox,
  .form-radio {
    border-width: 3px;
  }
}Ǳ8x,// ==========================================================================
// BASE NAVIGATION
// ==========================================================================
// Theme-agnostic navigation structures and behaviors
// Visual styling handled by themes
// ==========================================================================

// NAVIGATION BASE
.nav {
  display: flex;
  flex-wrap: wrap;
  padding-left: 0;
  margin-bottom: 0;
  list-style: none;
  gap: var(--nav-gap, 8px);

  &.nav-vertical {
    flex-direction: column;
  }

  &.nav-horizontal {
    flex-direction: row;
  }

  &.nav-fill {
    .nav-item {
      flex: 1 1 auto;
      text-align: center;
    }
  }

  &.nav-justified {
    .nav-item {
      flex-basis: 0;
      flex-grow: 1;
      text-align: center;
    }
  }
}

.nav-item {
  display: flex;
}

.nav-link {
  display: block;
  padding: var(--nav-link-padding, 8px 16px);
  text-decoration: none;
  border: var(--nav-link-border, 1px solid transparent);
  border-radius: var(--nav-link-border-radius, 4px);
  transition: all var(--nav-link-transition-duration, 0.2s) var(--nav-link-transition-easing, ease);
  cursor: pointer;
  position: relative;

  &:hover {
    text-decoration: none;
  }

  &:focus {
    outline: var(--nav-link-focus-outline, 2px solid transparent);
    outline-offset: var(--nav-link-focus-outline-offset, 2px);
  }

  &.nav-link-active {
    // Active state styling handled by themes
  }

  &.nav-link-disabled {
    pointer-events: none;
    opacity: var(--nav-link-disabled-opacity, 0.6);
    cursor: not-allowed;
  }
}

// NAVIGATION TABS
.nav-tabs {
  border-bottom: var(--nav-tabs-border, 1px solid #dee2e6);

  .nav-link {
    margin-bottom: calc(var(--nav-tabs-border-width, 1px) * -1);
    border: var(--nav-tabs-link-border, 1px solid transparent);
    border-top-left-radius: var(--nav-tabs-border-radius, 4px);
    border-top-right-radius: var(--nav-tabs-border-radius, 4px);
    border-bottom: none;

    &.nav-link-active {
      border-bottom: var(--nav-tabs-active-border-bottom, 1px solid transparent);
    }
  }
}

// NAVIGATION PILLS
.nav-pills {
  .nav-link {
    border-radius: var(--nav-pills-border-radius, 20px);
  }
}

// NAVBAR
.navbar {
  position: relative;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  padding: var(--navbar-padding, 8px 16px);

  &.navbar-expand {
    flex-wrap: nowrap;
    justify-content: flex-start;
  }

  &.navbar-fixed-top {
    position: fixed;
    top: 0;
    right: 0;
    left: 0;
    z-index: var(--z-navbar, 1030);
  }

  &.navbar-fixed-bottom {
    position: fixed;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: var(--z-navbar, 1030);
  }

  &.navbar-sticky-top {
    position: sticky;
    top: 0;
    z-index: var(--z-navbar, 1030);
  }
}

.navbar-brand {
  display: inline-block;
  padding-top: var(--navbar-brand-padding-y, 4px);
  padding-bottom: var(--navbar-brand-padding-y, 4px);
  margin-right: var(--navbar-brand-margin-end, 16px);
  font-size: var(--navbar-brand-font-size, 1.25rem);
  font-weight: var(--navbar-brand-font-weight, 600);
  line-height: inherit;
  text-decoration: none;
  white-space: nowrap;

  &:hover,
  &:focus {
    text-decoration: none;
  }
}

.navbar-nav {
  display: flex;
  flex-direction: column;
  padding-left: 0;
  margin-bottom: 0;
  list-style: none;

  .nav-link {
    padding-right: 0;
    padding-left: 0;
  }
}

.navbar-collapse {
  align-items: center;
  width: 100%;
  flex-basis: 100%;
  flex-grow: 1;

  &.navbar-collapse-show {
    display: flex !important;
  }
}

.navbar-toggler {
  padding: var(--navbar-toggler-padding, 4px 8px);
  font-size: var(--navbar-toggler-font-size, 1.25rem);
  line-height: 1;
  border: var(--navbar-toggler-border, 1px solid transparent);
  border-radius: var(--navbar-toggler-border-radius, 4px);
  background: transparent;
  cursor: pointer;
  transition: all var(--navbar-toggler-transition-duration, 0.2s);

  &:focus {
    outline: var(--navbar-toggler-focus-outline, 2px solid transparent);
    outline-offset: var(--navbar-toggler-focus-outline-offset, 2px);
  }

  &:not(:disabled):not(.disabled):hover {
    text-decoration: none;
  }
}

.navbar-toggler-icon {
  display: inline-block;
  width: var(--navbar-toggler-icon-size, 24px);
  height: var(--navbar-toggler-icon-size, 24px);
  vertical-align: middle;
  background-repeat: no-repeat;
  background-position: center;
  background-size: 100%;
}

// RESPONSIVE NAVBAR
@media (min-width: 576px) {
  .navbar-expand-sm {
    flex-wrap: nowrap;
    justify-content: flex-start;

    .navbar-nav {
      flex-direction: row;

      .nav-link {
        padding-right: var(--navbar-nav-link-padding-x, 8px);
        padding-left: var(--navbar-nav-link-padding-x, 8px);
      }
    }

    .navbar-collapse {
      display: flex !important;
      flex-basis: auto;
    }

    .navbar-toggler {
      display: none;
    }
  }
}

@media (min-width: 768px) {
  .navbar-expand-md {
    flex-wrap: nowrap;
    justify-content: flex-start;

    .navbar-nav {
      flex-direction: row;

      .nav-link {
        padding-right: var(--navbar-nav-link-padding-x, 8px);
        padding-left: var(--navbar-nav-link-padding-x, 8px);
      }
    }

    .navbar-collapse {
      display: flex !important;
      flex-basis: auto;
    }

    .navbar-toggler {
      display: none;
    }
  }
}

@media (min-width: 992px) {
  .navbar-expand-lg {
    flex-wrap: nowrap;
    justify-content: flex-start;

    .navbar-nav {
      flex-direction: row;

      .nav-link {
        padding-right: var(--navbar-nav-link-padding-x, 8px);
        padding-left: var(--navbar-nav-link-padding-x, 8px);
      }
    }

    .navbar-collapse {
      display: flex !important;
      flex-basis: auto;
    }

    .navbar-toggler {
      display: none;
    }
  }
}

// BREADCRUMB
.breadcrumb {
  display: flex;
  flex-wrap: wrap;
  padding: var(--breadcrumb-padding, 12px 0);
  margin-bottom: var(--breadcrumb-margin-bottom, 16px);
  list-style: none;
  border-radius: var(--breadcrumb-border-radius, 4px);
}

.breadcrumb-item {
  display: flex;
  align-items: center;

  + .breadcrumb-item {
    padding-left: var(--breadcrumb-divider-padding, 8px);

    &::before {
      content: var(--breadcrumb-divider, '/');
      padding-right: var(--breadcrumb-divider-padding, 8px);
      opacity: var(--breadcrumb-divider-opacity, 0.6);
    }
  }

  &.breadcrumb-item-active {
    opacity: var(--breadcrumb-active-opacity, 0.6);
  }

  .breadcrumb-link {
    text-decoration: none;
    transition: all var(--breadcrumb-link-transition-duration, 0.2s);

    &:hover {
      text-decoration: underline;
    }

    &:focus {
      outline: var(--breadcrumb-link-focus-outline, 2px solid transparent);
      outline-offset: var(--breadcrumb-link-focus-outline-offset, 2px);
    }
  }
}

// PAGINATION
.pagination {
  display: flex;
  padding-left: 0;
  list-style: none;
  border-radius: var(--pagination-border-radius, 4px);
  gap: var(--pagination-gap, 4px);
}

.pagination-item {
  &.pagination-item-active .pagination-link {
    z-index: 3;
    // Active styling handled by themes
  }

  &.pagination-item-disabled .pagination-link {
    pointer-events: none;
    opacity: var(--pagination-disabled-opacity, 0.6);
    cursor: not-allowed;
  }
}

.pagination-link {
  position: relative;
  display: block;
  padding: var(--pagination-link-padding, 8px 12px);
  text-decoration: none;
  border: var(--pagination-link-border, 1px solid #dee2e6);
  border-radius: var(--pagination-link-border-radius, 4px);
  transition: all var(--pagination-link-transition-duration, 0.2s) var(--pagination-link-transition-easing, ease);
  min-width: var(--pagination-link-min-width, 44px);
  text-align: center;

  &:hover {
    z-index: 2;
    text-decoration: none;
  }

  &:focus {
    z-index: 3;
    outline: var(--pagination-link-focus-outline, 2px solid transparent);
    outline-offset: var(--pagination-link-focus-outline-offset, 2px);
  }
}

// PAGINATION SIZES
.pagination-sm {
  .pagination-link {
    padding: var(--pagination-sm-padding, 4px 8px);
    font-size: var(--pagination-sm-font-size, 0.875rem);
    min-width: var(--pagination-sm-min-width, 32px);
  }
}

.pagination-lg {
  .pagination-link {
    padding: var(--pagination-lg-padding, 12px 16px);
    font-size: var(--pagination-lg-font-size, 1.125rem);
    min-width: var(--pagination-lg-min-width, 52px);
  }
}

// SIDEBAR NAVIGATION
.nav-sidebar {
  flex-direction: column;
  width: 100%;

  .nav-item {
    width: 100%;
  }

  .nav-link {
    display: flex;
    align-items: center;
    padding: var(--nav-sidebar-link-padding, 12px 16px);
    border-radius: var(--nav-sidebar-link-border-radius, 6px);
    margin-bottom: var(--nav-sidebar-link-margin, 4px);
    text-decoration: none;
    transition: all var(--nav-sidebar-link-transition-duration, 0.2s);
    position: relative;
    gap: var(--nav-sidebar-link-gap, 12px);

    .nav-icon {
      width: var(--nav-sidebar-icon-size, 20px);
      height: var(--nav-sidebar-icon-size, 20px);
      flex-shrink: 0;
    }

    .nav-text {
      flex: 1;
      min-width: 0;
    }

    .nav-badge {
      margin-left: auto;
      flex-shrink: 0;
    }

    .nav-arrow {
      margin-left: auto;
      transition: transform var(--nav-sidebar-arrow-transition-duration, 0.2s);
      flex-shrink: 0;
    }

    &.nav-link-expandable {
      cursor: pointer;

      &.nav-link-expanded .nav-arrow {
        transform: rotate(180deg);
      }
    }

    &.nav-link-active {
      // Active styling handled by themes
      
      &::before {
        content: '';
        position: absolute;
        left: 0;
        top: 0;
        bottom: 0;
        width: var(--nav-sidebar-active-indicator-width, 4px);
        border-radius: var(--nav-sidebar-active-indicator-radius, 0 2px 2px 0);
        // Color handled by themes
      }
    }
  }

  .nav-submenu {
    margin-left: var(--nav-sidebar-submenu-indent, 32px);
    margin-top: var(--nav-sidebar-submenu-margin, 4px);
    padding-left: var(--nav-sidebar-submenu-padding, 16px);
    border-left: var(--nav-sidebar-submenu-border, 1px solid rgba(0, 0, 0, 0.1));

    .nav-link {
      padding: var(--nav-sidebar-submenu-link-padding, 8px 12px);
      font-size: var(--nav-sidebar-submenu-font-size, 0.875rem);
    }
  }
}

// MOBILE NAVIGATION
@media (max-width: 768px) {
  .nav-sidebar {
    .nav-link {
      padding: var(--nav-sidebar-mobile-padding, 16px);
      font-size: var(--nav-sidebar-mobile-font-size, 1rem);
    }
  }

  .navbar-collapse {
    display: none;

    &.navbar-collapse-show {
      display: block !important;
    }
  }

  .navbar-nav {
    .nav-item {
      margin: var(--navbar-mobile-item-margin, 4px 0);
    }

    .nav-link {
      padding: var(--navbar-mobile-link-padding, 12px 16px);
    }
  }
}

// ACCESSIBILITY
@media (prefers-reduced-motion: reduce) {
  .nav-link,
  .navbar-toggler,
  .breadcrumb-link,
  .pagination-link,
  .nav-sidebar .nav-arrow {
    transition: none;
  }
}

@media (prefers-contrast: high) {
  .nav-link,
  .navbar-toggler,
  .pagination-link {
    border-width: 2px;
  }

  .nav-link:focus,
  .navbar-toggler:focus,
  .breadcrumb-link:focus,
  .pagination-link:focus {
    outline-width: 3px;
  }
}Ōx3X// ==========================================================================
// UTILITY COMPONENTS
// ==========================================================================
// Small, reusable utility components
// Theme-agnostic structures and behaviors
// ==========================================================================

// BADGES
.badge {
  display: inline-block;
  padding: var(--badge-padding, 4px 8px);
  font-size: var(--badge-font-size, 0.75rem);
  font-weight: var(--badge-font-weight, 500);
  line-height: 1;
  text-align: center;
  white-space: nowrap;
  vertical-align: baseline;
  border-radius: var(--badge-border-radius, 4px);
  transition: all var(--badge-transition-duration, 0.2s);

  &.badge-pill {
    padding: var(--badge-pill-padding, 4px 12px);
    border-radius: var(--badge-pill-border-radius, 10em);
  }

  &.badge-dot {
    width: var(--badge-dot-size, 8px);
    height: var(--badge-dot-size, 8px);
    padding: 0;
    border-radius: 50%;
  }

  &.badge-lg {
    padding: var(--badge-lg-padding, 8px 12px);
    font-size: var(--badge-lg-font-size, 0.875rem);
  }

  &.badge-sm {
    padding: var(--badge-sm-padding, 2px 6px);
    font-size: var(--badge-sm-font-size, 0.625rem);
  }
}

// ALERTS
.alert {
  position: relative;
  padding: var(--alert-padding, 16px 20px);
  margin-bottom: var(--alert-margin-bottom, 16px);
  border: var(--alert-border, 1px solid transparent);
  border-radius: var(--alert-border-radius, 6px);

  .alert-title {
    margin: 0 0 var(--alert-title-margin, 8px) 0;
    font-size: var(--alert-title-size, 1rem);
    font-weight: var(--alert-title-weight, 600);
  }

  .alert-content {
    margin: 0;

    p:last-child {
      margin-bottom: 0;
    }
  }

  .alert-actions {
    margin-top: var(--alert-actions-margin, 12px);
    display: flex;
    gap: var(--alert-actions-gap, 8px);
  }

  .alert-close {
    position: absolute;
    top: var(--alert-close-top, 12px);
    right: var(--alert-close-right, 12px);
    padding: var(--alert-close-padding, 4px);
    background: transparent;
    border: none;
    cursor: pointer;
    opacity: var(--alert-close-opacity, 0.7);
    transition: opacity var(--alert-close-transition-duration, 0.2s);
    width: var(--alert-close-size, 24px);
    height: var(--alert-close-size, 24px);
    display: flex;
    align-items: center;
    justify-content: center;

    &:hover {
      opacity: 1;
    }

    &:focus {
      outline: var(--alert-close-focus-outline, 2px solid transparent);
      outline-offset: var(--alert-close-focus-outline-offset, 2px);
    }
  }

  &.alert-dismissible {
    padding-right: var(--alert-dismissible-padding-right, 48px);
  }
}

// TOOLTIPS (Structure only - positioning handled by JS)
.tooltip {
  position: absolute;
  z-index: var(--z-tooltip, 1070);
  display: block;
  margin: var(--tooltip-margin, 0);
  font-size: var(--tooltip-font-size, 0.875rem);
  line-height: var(--tooltip-line-height, 1.4);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--tooltip-transition-duration, 0.2s);

  &.tooltip-show {
    opacity: 1;
  }

  .tooltip-arrow {
    position: absolute;
    display: block;
    width: var(--tooltip-arrow-size, 8px);
    height: var(--tooltip-arrow-size, 8px);
  }

  .tooltip-inner {
    max-width: var(--tooltip-max-width, 200px);
    padding: var(--tooltip-padding, 8px 12px);
    text-align: center;
    border-radius: var(--tooltip-border-radius, 4px);
  }
}

// POPOVER (Structure only - positioning handled by JS)
.popover {
  position: absolute;
  top: 0;
  left: 0;
  z-index: var(--z-popover, 1060);
  display: block;
  max-width: var(--popover-max-width, 276px);
  font-size: var(--popover-font-size, 0.875rem);
  line-height: var(--popover-line-height, 1.6);
  word-wrap: break-word;
  border: var(--popover-border, 1px solid rgba(0, 0, 0, 0.2));
  border-radius: var(--popover-border-radius, 6px);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--popover-transition-duration, 0.2s);

  &.popover-show {
    opacity: 1;
    pointer-events: auto;
  }

  .popover-arrow {
    position: absolute;
    display: block;
    width: var(--popover-arrow-size, 12px);
    height: var(--popover-arrow-size, 12px);
  }

  .popover-header {
    padding: var(--popover-header-padding, 12px 16px);
    margin: 0;
    font-size: var(--popover-header-font-size, 1rem);
    font-weight: var(--popover-header-font-weight, 600);
    border-bottom: var(--popover-header-border, 1px solid rgba(0, 0, 0, 0.1));
    border-top-left-radius: inherit;
    border-top-right-radius: inherit;

    &:empty {
      display: none;
    }
  }

  .popover-body {
    padding: var(--popover-body-padding, 16px);
  }
}

// DROPDOWN
.dropdown {
  position: relative;
  display: inline-block;
}

.dropdown-toggle {
  &::after {
    display: inline-block;
    margin-left: var(--dropdown-caret-spacing, 8px);
    vertical-align: middle;
    content: '';
    border-top: var(--dropdown-caret-size, 4px) solid;
    border-right: var(--dropdown-caret-size, 4px) solid transparent;
    border-bottom: 0;
    border-left: var(--dropdown-caret-size, 4px) solid transparent;
    transition: transform var(--dropdown-caret-transition-duration, 0.2s);
  }

  &[aria-expanded="true"]::after {
    transform: rotate(180deg);
  }

  &.dropdown-toggle-no-caret::after {
    display: none;
  }
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: var(--z-dropdown, 1000);
  display: none;
  float: left;
  min-width: var(--dropdown-min-width, 160px);
  padding: var(--dropdown-padding, 8px 0);
  margin: var(--dropdown-margin, 2px 0 0);
  font-size: var(--dropdown-font-size, 1rem);
  text-align: left;
  list-style: none;
  border: var(--dropdown-border, 1px solid rgba(0, 0, 0, 0.15));
  border-radius: var(--dropdown-border-radius, 6px);
  box-shadow: var(--dropdown-box-shadow, 0 6px 12px rgba(0, 0, 0, 0.175));
  background-clip: padding-box;

  &.dropdown-menu-end {
    right: 0;
    left: auto;
  }

  &.dropdown-menu-show {
    display: block;
  }
}

.dropdown-item {
  display: block;
  width: 100%;
  padding: var(--dropdown-item-padding, 6px 20px);
  clear: both;
  font-weight: normal;
  line-height: var(--dropdown-item-line-height, 1.5);
  text-align: inherit;
  text-decoration: none;
  white-space: nowrap;
  border: 0;
  background: transparent;
  cursor: pointer;
  transition: all var(--dropdown-item-transition-duration, 0.2s);

  &:focus {
    outline: var(--dropdown-item-focus-outline, 2px solid transparent);
    outline-offset: var(--dropdown-item-focus-outline-offset, -2px);
  }

  &.dropdown-item-active {
    // Active styling handled by themes
  }

  &.dropdown-item-disabled {
    pointer-events: none;
    opacity: var(--dropdown-item-disabled-opacity, 0.5);
  }
}

.dropdown-divider {
  height: 0;
  margin: var(--dropdown-divider-margin, 4px 0);
  overflow: hidden;
  border-top: 1px solid var(--dropdown-divider-color, rgba(0, 0, 0, 0.15));
}

.dropdown-header {
  display: block;
  padding: var(--dropdown-header-padding, 4px 20px);
  margin-bottom: 0;
  font-size: var(--dropdown-header-font-size, 0.875rem);
  font-weight: var(--dropdown-header-font-weight, 600);
  line-height: var(--dropdown-header-line-height, 1.5);
  white-space: nowrap;
  opacity: var(--dropdown-header-opacity, 0.6);
}

// MODAL (Structure only - overlay/backdrop handled separately)
.modal {
  position: fixed;
  top: 0;
  left: 0;
  z-index: var(--z-modal, 1050);
  width: 100%;
  height: 100%;
  overflow-x: hidden;
  overflow-y: auto;
  outline: 0;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--modal-transition-duration, 0.3s) var(--modal-transition-easing, ease);

  &.modal-show {
    opacity: 1;
    pointer-events: auto;
  }
}

.modal-dialog {
  position: relative;
  width: auto;
  margin: var(--modal-margin, 16px);
  pointer-events: none;
  transform: translateY(-50px);
  transition: transform var(--modal-transition-duration, 0.3s) var(--modal-transition-easing, ease);

  .modal-show & {
    transform: translateY(0);
  }

  @media (min-width: 576px) {
    max-width: var(--modal-sm-max-width, 500px);
    margin: var(--modal-margin-sm, 32px auto);
  }

  &.modal-sm {
    @media (min-width: 576px) {
      max-width: var(--modal-sm-width, 300px);
    }
  }

  &.modal-lg {
    @media (min-width: 992px) {
      max-width: var(--modal-lg-width, 800px);
    }
  }

  &.modal-xl {
    @media (min-width: 1200px) {
      max-width: var(--modal-xl-width, 1140px);
    }
  }

  &.modal-fullscreen {
    width: 100vw;
    max-width: none;
    height: 100%;
    margin: 0;

    .modal-content {
      height: 100%;
      border: 0;
      border-radius: 0;
    }
  }
}

.modal-content {
  position: relative;
  display: flex;
  flex-direction: column;
  width: 100%;
  pointer-events: auto;
  background-clip: padding-box;
  border: var(--modal-content-border, 1px solid rgba(0, 0, 0, 0.2));
  border-radius: var(--modal-content-border-radius, 6px);
  outline: 0;
}

.modal-backdrop {
  position: fixed;
  top: 0;
  left: 0;
  z-index: var(--z-modal-backdrop, 1040);
  width: 100vw;
  height: 100vh;
  background-color: var(--modal-backdrop-bg, rgba(0, 0, 0, 0.5));
  opacity: 0;
  transition: opacity var(--modal-backdrop-transition-duration, 0.15s) linear;

  &.modal-backdrop-show {
    opacity: 1;
  }
}

.modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--modal-header-padding, 16px 24px);
  border-bottom: var(--modal-header-border, 1px solid rgba(0, 0, 0, 0.125));
  border-top-left-radius: inherit;
  border-top-right-radius: inherit;

  .modal-title {
    margin: 0;
    line-height: var(--modal-title-line-height, 1.5);
    font-size: var(--modal-title-font-size, 1.25rem);
    font-weight: var(--modal-title-font-weight, 600);
  }
}

.modal-body {
  position: relative;
  flex: 1 1 auto;
  padding: var(--modal-body-padding, 24px);
}

.modal-footer {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--modal-footer-gap, 8px);
  padding: var(--modal-footer-padding, 16px 24px);
  border-top: var(--modal-footer-border, 1px solid rgba(0, 0, 0, 0.125));
  border-bottom-left-radius: inherit;
  border-bottom-right-radius: inherit;

  &.modal-footer-center {
    justify-content: center;
  }

  &.modal-footer-between {
    justify-content: space-between;
  }
}

// ACCORDION
.accordion {
  border-radius: var(--accordion-border-radius, 6px);
  overflow: hidden;
}

.accordion-item {
  border: var(--accordion-item-border, 1px solid rgba(0, 0, 0, 0.125));

  &:not(:first-child) {
    border-top: none;
  }

  &:first-child {
    border-top-left-radius: var(--accordion-border-radius, 6px);
    border-top-right-radius: var(--accordion-border-radius, 6px);
  }

  &:last-child {
    border-bottom-left-radius: var(--accordion-border-radius, 6px);
    border-bottom-right-radius: var(--accordion-border-radius, 6px);
  }
}

.accordion-header {
  margin-bottom: 0;
}

.accordion-button {
  position: relative;
  display: flex;
  align-items: center;
  width: 100%;
  padding: var(--accordion-button-padding, 16px 20px);
  font-size: var(--accordion-button-font-size, 1rem);
  font-weight: var(--accordion-button-font-weight, 500);
  text-align: left;
  background: transparent;
  border: 0;
  border-radius: 0;
  overflow-anchor: none;
  transition: all var(--accordion-button-transition-duration, 0.2s) var(--accordion-button-transition-easing, ease);
  cursor: pointer;

  &:focus {
    z-index: 3;
    outline: var(--accordion-button-focus-outline, 2px solid transparent);
    outline-offset: var(--accordion-button-focus-outline-offset, -2px);
  }

  &::after {
    flex-shrink: 0;
    width: var(--accordion-icon-size, 16px);
    height: var(--accordion-icon-size, 16px);
    margin-left: auto;
    content: '';
    background-image: var(--accordion-button-icon, url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"));
    background-repeat: no-repeat;
    background-size: var(--accordion-icon-size, 16px);
    transition: transform var(--accordion-icon-transition-duration, 0.2s) var(--accordion-icon-transition-easing, ease);
  }

  &:not(.accordion-button-collapsed)::after {
    transform: rotate(180deg);
  }
}

.accordion-collapse {
  overflow: hidden;
  transition: height var(--accordion-collapse-transition-duration, 0.3s) var(--accordion-collapse-transition-easing, ease);
}

.accordion-body {
  padding: var(--accordion-body-padding, 16px 20px);
}

// ACCESSIBILITY
@media (prefers-reduced-motion: reduce) {
  .alert-close,
  .tooltip,
  .popover,
  .dropdown-toggle::after,
  .modal,
  .modal-dialog,
  .modal-backdrop,
  .accordion-button,
  .accordion-button::after,
  .accordion-collapse {
    transition: none;
  }
}

@media (prefers-contrast: high) {
  .alert,
  .popover,
  .dropdown-menu,
  .modal-content,
  .accordion-item {
    border-width: 2px;
  }

  .alert-close:focus,
  .dropdown-item:focus,
  .accordion-button:focus {
    outline-width: 3px;
  }
}fxc// ==========================================================================
// CONTENT CONTAINERS
// ==========================================================================
// Theme-agnostic content container structures
// Focus on layout, spacing, and behavior - not visual styling
// ==========================================================================

// PAGE CONTAINERS
.page-container {
  min-height: 100vh;
  display: flex;
  flex-direction: column;

  &.page-centered {
    align-items: center;
    justify-content: center;
  }

  &.page-top-aligned {
    justify-content: flex-start;
  }
}

.page-header {
  flex-shrink: 0;
  position: relative;
  z-index: var(--z-page-header, 50);

  &.page-header-sticky {
    position: sticky;
    top: 0;
  }

  &.page-header-fixed {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
  }
}

.page-content {
  flex: 1;
  display: flex;
  flex-direction: column;
  position: relative;
}

.page-footer {
  flex-shrink: 0;
  margin-top: auto;
}

// MAIN CONTENT AREAS
.main-content {
  flex: 1;
  width: 100%;
  max-width: var(--content-max-width, none);
  margin: 0 auto;
  padding: var(--content-padding, 24px);

  &.main-content-narrow {
    max-width: var(--content-max-width-narrow, 768px);
  }

  &.main-content-wide {
    max-width: var(--content-max-width-wide, 1400px);
  }

  &.main-content-full {
    max-width: none;
    padding: 0;
  }
}

// CONTENT SECTIONS
.content-section {
  margin-bottom: var(--section-spacing, 48px);

  &:last-child {
    margin-bottom: 0;
  }

  &.content-section-compact {
    margin-bottom: var(--section-spacing-compact, 24px);
  }

  &.content-section-spacious {
    margin-bottom: var(--section-spacing-spacious, 72px);
  }
}

.section-header {
  margin-bottom: var(--section-header-spacing, 24px);

  .section-title {
    margin: 0 0 var(--section-title-spacing, 8px) 0;
    font-size: var(--section-title-size, 1.5rem);
    font-weight: var(--section-title-weight, 600);
  }

  .section-subtitle {
    margin: 0;
    opacity: 0.7;
  }

  .section-actions {
    margin-top: var(--section-actions-spacing, 16px);
  }
}

.section-content {
  position: relative;
}

// ARTICLE CONTAINERS
.article-container {
  max-width: var(--article-max-width, 65ch);
  margin: 0 auto;
  padding: var(--article-padding, 24px);

  .article-header {
    margin-bottom: var(--article-header-spacing, 32px);
    text-align: center;

    .article-title {
      margin: 0 0 var(--article-title-spacing, 16px) 0;
      font-size: var(--article-title-size, 2rem);
      font-weight: var(--article-title-weight, 700);
    }

    .article-meta {
      margin-bottom: var(--article-meta-spacing, 24px);
      opacity: 0.7;
    }
  }

  .article-content {
    line-height: var(--article-line-height, 1.6);

    > * + * {
      margin-top: var(--article-element-spacing, 1.5em);
    }
  }

  .article-footer {
    margin-top: var(--article-footer-spacing, 48px);
    padding-top: var(--article-footer-padding, 24px);
    border-top: 1px solid var(--border-color, #e5e5e5);
  }
}

// SIDEBAR CONTAINERS
.content-with-sidebar {
  display: flex;
  gap: var(--sidebar-gap, 32px);
  align-items: flex-start;

  .main-column {
    flex: 1;
    min-width: 0; // Prevents flex item overflow
  }

  .sidebar-column {
    flex-shrink: 0;
    width: var(--sidebar-width, 300px);
  }

  &.sidebar-left {
    flex-direction: row;
  }

  &.sidebar-right {
    flex-direction: row-reverse;
  }
}

@media (max-width: 768px) {
  .content-with-sidebar {
    flex-direction: column;
    gap: var(--sidebar-gap-mobile, 24px);

    .sidebar-column {
      width: 100%;
    }

    &.sidebar-right {
      flex-direction: column;
    }
  }
}

// CARD CONTAINERS
.card-container {
  display: flex;
  flex-direction: column;
  position: relative;
  word-wrap: break-word;
  background-clip: border-box;

  .card-header {
    flex-shrink: 0;
    padding: var(--card-header-padding, 16px 24px);
    border-bottom: 1px solid var(--border-color, transparent);

    &:first-child {
      border-top-left-radius: inherit;
      border-top-right-radius: inherit;
    }

    &.card-header-borderless {
      border-bottom: none;
    }
  }

  .card-body {
    flex: 1;
    padding: var(--card-body-padding, 24px);

    &.card-body-compact {
      padding: var(--card-body-padding-compact, 16px);
    }

    &.card-body-spacious {
      padding: var(--card-body-padding-spacious, 32px);
    }
  }

  .card-footer {
    flex-shrink: 0;
    padding: var(--card-footer-padding, 16px 24px);
    border-top: 1px solid var(--border-color, transparent);

    &:last-child {
      border-bottom-left-radius: inherit;
      border-bottom-right-radius: inherit;
    }

    &.card-footer-borderless {
      border-top: none;
    }
  }
}

// SPLIT CONTAINERS
.split-container {
  display: flex;
  min-height: 0; // Allows flex children to shrink

  &.split-horizontal {
    flex-direction: row;
  }

  &.split-vertical {
    flex-direction: column;
  }

  .split-pane {
    flex: 1;
    overflow: auto;
    position: relative;
  }

  .split-resizer {
    flex-shrink: 0;
    background: var(--resizer-background, transparent);
    position: relative;
    z-index: var(--z-resizer, 10);

    &.split-resizer-horizontal {
      width: var(--resizer-size, 4px);
      cursor: ew-resize;
    }

    &.split-resizer-vertical {
      height: var(--resizer-size, 4px);
      cursor: ns-resize;
    }

    &:hover {
      background: var(--resizer-background-hover, rgba(0, 0, 0, 0.1));
    }
  }
}

// SCROLLABLE CONTAINERS
.scrollable {
  overflow: auto;

  &.scrollable-x {
    overflow-x: auto;
    overflow-y: hidden;
  }

  &.scrollable-y {
    overflow-y: auto;
    overflow-x: hidden;
  }

  &.scrollable-hidden {
    overflow: hidden;
  }
}

// CENTERED CONTAINERS
.centered-container {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: var(--centered-min-height, 400px);

  &.centered-full-height {
    min-height: 100vh;
  }

  &.centered-content {
    text-align: center;
  }
}2Bx U// ==========================================================================
// DASHBOARD LAYOUTS
// ==========================================================================
// Theme-agnostic dashboard layout structures
// Visual styling handled by themes
// ==========================================================================

@use '../../semantic' as semantic;

// DASHBOARD CONTAINER
.dashboard-container {
  display: grid;
  grid-template-areas: 
    "sidebar header"
    "sidebar content";
  grid-template-columns: var(--sidebar-width, #{semantic.$semantic-sizing-sidebar-expanded}) 1fr;
  grid-template-rows: var(--header-height, #{semantic.$semantic-sizing-navbar-height}) 1fr;
  height: 100vh;
  overflow: hidden;
}

// DASHBOARD HEADER
.dashboard-header {
  grid-area: header;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 var(--header-padding, #{semantic.$semantic-spacing-container-card-padding-lg});
  z-index: var(--z-header, 100);
  position: relative;

  .header-title {
    font-size: var(--header-title-size, 1.25rem);
    font-weight: var(--header-title-weight, 600);
    margin: 0;
  }

  .header-actions {
    display: flex;
    align-items: center;
    gap: var(--header-actions-gap, #{semantic.$semantic-spacing-component-padding-md});
  }
}

// DASHBOARD SIDEBAR
.dashboard-sidebar {
  grid-area: sidebar;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  z-index: var(--z-sidebar, 90);
  position: relative;

  .sidebar-header {
    padding: var(--sidebar-header-padding, #{semantic.$semantic-spacing-container-card-padding-lg});
    flex-shrink: 0;
  }

  .sidebar-nav {
    flex: 1;
    padding: 0 var(--sidebar-nav-padding, #{semantic.$semantic-spacing-component-padding-md});
    overflow-y: auto;
  }

  .sidebar-footer {
    padding: var(--sidebar-footer-padding, #{semantic.$semantic-spacing-component-padding-md});
    flex-shrink: 0;
  }

  // Sidebar state classes
  &.sidebar-is-collapsed {
    width: var(--sidebar-width-collapsed, #{semantic.$semantic-sizing-sidebar-collapsed});
    
    .sidebar-text,
    .sidebar-nav-text {
      opacity: 0;
      visibility: hidden;
      transition: opacity var(--transition-duration, 0.2s) var(--transition-easing, ease);
    }

    .sidebar-nav-item {
      justify-content: center;
      padding: #{semantic.$semantic-spacing-component-padding-sm};
    }
  }

  &.sidebar-overlay-mode {
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    width: var(--sidebar-width, #{semantic.$semantic-sizing-sidebar-expanded});
    z-index: var(--z-sidebar-overlay, 1000);
    transform: translateX(-100%);
    transition: transform var(--transition-duration, 0.3s) var(--transition-easing, ease);

    &.sidebar-open {
      transform: translateX(0);
    }
  }

  &.sidebar-fixed-position {
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
  }
}

// DASHBOARD CONTENT
.dashboard-content {
  grid-area: content;
  overflow-y: auto;
  padding: var(--content-padding, #{semantic.$semantic-spacing-container-card-padding-lg});
  position: relative;

  &.dashboard-content-full {
    padding: 0;
  }

  &.dashboard-content-constrained {
    max-width: var(--content-max-width, #{semantic.$semantic-sizing-content-wide});
    margin: 0 auto;
  }

  // Content state classes
  &.content-with-padding {
    padding: var(--content-padding, #{semantic.$semantic-spacing-container-card-padding-lg});
  }

  &.content-is-scrollable {
    overflow-y: auto;
    overflow-x: hidden;
    max-height: calc(100vh - var(--header-height, #{semantic.$semantic-sizing-navbar-height}));
    scrollbar-width: thin;
    scrollbar-color: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)) var(--scrollbar-track, transparent);

    // Webkit scrollbar styling
    &::-webkit-scrollbar {
      width: #{$base-spacing-2}; // 8px
      height: #{$base-spacing-2};
    }

    &::-webkit-scrollbar-track {
      background: var(--scrollbar-track, transparent);
      border-radius: #{$base-border-radius-sm};
    }

    &::-webkit-scrollbar-thumb {
      background: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2));
      border-radius: #{$base-border-radius-sm};
      border: 1px solid var(--scrollbar-thumb-border, transparent);

      &:hover {
        background: var(--scrollbar-thumb-hover, rgba(0, 0, 0, 0.3));
      }

      &:active {
        background: var(--scrollbar-thumb-active, rgba(0, 0, 0, 0.4));
      }
    }

    // Invisible scrollbar variant
    &.scrollbar-invisible {
      scrollbar-width: none;
      -ms-overflow-style: none;

      &::-webkit-scrollbar {
        display: none;
      }
    }
  }

  &.content-is-centered {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
  }

  &.content-has-breadcrumbs {
    .content-breadcrumbs {
      margin-bottom: #{semantic.$semantic-spacing-content-paragraph};
      padding-bottom: #{semantic.$semantic-spacing-component-padding-sm};
      border-bottom: #{semantic.$semantic-border-divider-width} solid var(--content-breadcrumb-border, transparent);
    }
  }

  // Content header styling
  .content-header {
    margin-bottom: #{semantic.$semantic-spacing-layout-section-sm};

    .content-title {
      font-size: var(--content-title-size, 2rem);
      font-weight: var(--content-title-weight, 600);
      margin: 0 0 #{semantic.$semantic-spacing-component-padding-sm} 0;
      line-height: var(--content-title-line-height, 1.2);
    }

    .content-subtitle {
      font-size: var(--content-subtitle-size, 1.125rem);
      color: var(--content-subtitle-color, rgba(0, 0, 0, 0.6));
      margin: 0;
      line-height: var(--content-subtitle-line-height, 1.4);
    }
  }

  // Content actions styling
  .content-actions {
    margin-top: #{semantic.$semantic-spacing-layout-section-sm};
    padding-top: #{semantic.$semantic-spacing-component-padding-md};
    border-top: #{semantic.$semantic-border-divider-width} solid var(--content-actions-border, transparent);
    display: flex;
    gap: #{semantic.$semantic-spacing-component-padding-sm};
    justify-content: flex-end;
    align-items: center;
  }
}

// COLLAPSIBLE SIDEBAR VARIANT
.dashboard-container.sidebar-collapsed {
  grid-template-columns: var(--sidebar-width-collapsed, 72px) 1fr;

  .dashboard-sidebar {
    .sidebar-text {
      display: none;
    }
  }
}

// RESPONSIVE DASHBOARD
@media (max-width: 768px) {
  .dashboard-container {
    grid-template-areas: 
      "header"
      "content";
    grid-template-columns: 1fr;
    grid-template-rows: var(--header-height, 64px) 1fr;
  }

  .dashboard-sidebar {
    position: fixed;
    top: var(--header-height, 64px);
    left: 0;
    bottom: 0;
    width: var(--sidebar-width, 280px);
    transform: translateX(-100%);
    transition: transform var(--transition-duration, 0.3s) var(--transition-easing, ease);
    z-index: var(--z-sidebar-mobile, 1000);

    &.sidebar-open {
      transform: translateX(0);
    }
  }

  .dashboard-overlay {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    opacity: 0;
    visibility: hidden;
    transition: all var(--transition-duration, 0.3s) var(--transition-easing, ease);
    z-index: var(--z-overlay, 999);
    pointer-events: none;

    &.overlay-active {
      opacity: 1;
      visibility: visible;
      pointer-events: all;
    }
  }
}

// DASHBOARD GRID LAYOUTS
.dashboard-grid {
  display: grid;
  gap: var(--dashboard-grid-gap, 24px);
  
  &.grid-2-cols {
    grid-template-columns: repeat(2, 1fr);
  }
  
  &.grid-3-cols {
    grid-template-columns: repeat(3, 1fr);
  }
  
  &.grid-4-cols {
    grid-template-columns: repeat(4, 1fr);
  }

  &.grid-auto-fill {
    grid-template-columns: repeat(auto-fill, minmax(var(--grid-min-width, 300px), 1fr));
  }

  &.grid-auto-fit {
    grid-template-columns: repeat(auto-fit, minmax(var(--grid-min-width, 300px), 1fr));
  }
}

// RESPONSIVE GRID
@media (max-width: 1200px) {
  .dashboard-grid.grid-4-cols {
    grid-template-columns: repeat(3, 1fr);
  }
}

@media (max-width: 900px) {
  .dashboard-grid.grid-3-cols,
  .dashboard-grid.grid-4-cols {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 600px) {
  .dashboard-grid.grid-2-cols,
  .dashboard-grid.grid-3-cols,
  .dashboard-grid.grid-4-cols {
    grid-template-columns: 1fr;
  }
}"Xx// ==========================================================================
// GRID SYSTEMS
// ==========================================================================
// Flexible grid system supporting 12-column, CSS Grid, and Flexbox layouts
// Theme-agnostic structural definitions
// ==========================================================================

// CSS VARIABLES - Using base design tokens
:root {
  --grid-columns: 12;
  --grid-gap: #{$base-spacing-6};        // 24px -> 1.5rem
  --grid-gap-sm: #{$base-spacing-4};     // 16px -> 1rem
  --grid-gap-lg: #{$base-spacing-8};     // 32px -> 2rem
  --grid-max-width: #{$base-sizing-max-width-screen-xl}; // 1280px
  --grid-padding: #{$base-spacing-6};    // 24px -> 1.5rem
}

// CONTAINER SYSTEM
.container {
  width: 100%;
  max-width: var(--grid-max-width);
  margin: 0 auto;
  padding: 0 var(--grid-padding);

  &.container-fluid {
    max-width: none;
  }

  &.container-sm {
    max-width: #{$base-breakpoint-sm};
  }

  &.container-md {
    max-width: #{$base-breakpoint-md};
  }

  &.container-lg {
    max-width: #{$base-breakpoint-lg};
  }

  &.container-xl {
    max-width: #{$base-breakpoint-xl};
  }

  &.container-xxl {
    max-width: #{$base-breakpoint-2xl};
  }

  // Container state classes
  &.container-is-fluid {
    max-width: none;
    width: 100%;
  }

  &.container-no-gutters {
    padding-left: 0;
    padding-right: 0;
  }

  &.container-max-sm,
  &.container-max-md,
  &.container-max-lg,
  &.container-max-xl,
  &.container-max-xxl {
    // These classes are applied dynamically by the component
    // and use the existing container-* classes above
  }
}

// FLEXBOX GRID SYSTEM
.row {
  display: flex;
  flex-wrap: wrap;
  margin: calc(var(--grid-gap) / -2);

  &.row-no-gutters {
    margin: 0;
    
    > .col,
    > [class*="col-"] {
      padding: 0;
    }
  }

  &.row-gap-sm {
    margin: calc(var(--grid-gap-sm) / -2);
  }

  &.row-gap-lg {
    margin: calc(var(--grid-gap-lg) / -2);
  }

  // Row state classes from components
  &.row-without-gutters {
    margin: 0;
    
    > .col,
    > [class*="col-"] {
      padding: 0;
    }
  }

  &.row-justify-start { justify-content: flex-start; }
  &.row-justify-center { justify-content: center; }
  &.row-justify-end { justify-content: flex-end; }
  &.row-justify-around { justify-content: space-around; }
  &.row-justify-between { justify-content: space-between; }
  &.row-justify-evenly { justify-content: space-evenly; }

  &.row-align-start { align-items: flex-start; }
  &.row-align-center { align-items: center; }
  &.row-align-end { align-items: flex-end; }
  &.row-align-stretch { align-items: stretch; }
  &.row-align-baseline { align-items: baseline; }
}

.col {
  flex: 1 0 0%;
  padding: calc(var(--grid-gap) / 2);
}

// RESPONSIVE COLUMNS
@for $i from 1 through 12 {
  .col-#{$i} {
    flex: 0 0 auto;
    width: percentage($i / 12);
    padding: calc(var(--grid-gap) / 2);
  }
}

// BREAKPOINT-SPECIFIC COLUMNS
@media (min-width: 576px) {
  @for $i from 1 through 12 {
    .col-sm-#{$i} {
      flex: 0 0 auto;
      width: percentage($i / 12);
    }
  }
  .col-sm {
    flex: 1 0 0%;
  }
}

@media (min-width: 768px) {
  @for $i from 1 through 12 {
    .col-md-#{$i} {
      flex: 0 0 auto;
      width: percentage($i / 12);
    }
  }
  .col-md {
    flex: 1 0 0%;
  }
}

@media (min-width: 992px) {
  @for $i from 1 through 12 {
    .col-lg-#{$i} {
      flex: 0 0 auto;
      width: percentage($i / 12);
    }
  }
  .col-lg {
    flex: 1 0 0%;
  }
}

@media (min-width: 1200px) {
  @for $i from 1 through 12 {
    .col-xl-#{$i} {
      flex: 0 0 auto;
      width: percentage($i / 12);
    }
  }
  .col-xl {
    flex: 1 0 0%;
  }
}

// CSS GRID SYSTEM
.grid {
  display: grid;
  gap: var(--grid-gap);

  &.grid-12 {
    grid-template-columns: repeat(12, 1fr);
  }

  &.grid-auto {
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  }

  &.grid-auto-fill {
    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  }
}

// GRID SPANS
@for $i from 1 through 12 {
  .span-#{$i} {
    grid-column: span #{$i};
  }
}

// GRID POSITIONING
@for $i from 1 through 12 {
  .col-start-#{$i} {
    grid-column-start: #{$i};
  }
  
  .col-end-#{$i} {
    grid-column-end: #{$i};
  }
  
  .row-start-#{$i} {
    grid-row-start: #{$i};
  }
  
  .row-end-#{$i} {
    grid-row-end: #{$i};
  }
}

// RESPONSIVE GRID SPANS
@media (min-width: 576px) {
  @for $i from 1 through 12 {
    .span-sm-#{$i} {
      grid-column: span #{$i};
    }
  }
}

@media (min-width: 768px) {
  @for $i from 1 through 12 {
    .span-md-#{$i} {
      grid-column: span #{$i};
    }
  }
}

@media (min-width: 992px) {
  @for $i from 1 through 12 {
    .span-lg-#{$i} {
      grid-column: span #{$i};
    }
  }
}

@media (min-width: 1200px) {
  @for $i from 1 through 12 {
    .span-xl-#{$i} {
      grid-column: span #{$i};
    }
  }
}

// ALIGNMENT UTILITIES
.justify-start { justify-content: start; }
.justify-end { justify-content: end; }
.justify-center { justify-content: center; }
.justify-between { justify-content: space-between; }
.justify-around { justify-content: space-around; }
.justify-evenly { justify-content: space-evenly; }

.align-start { align-content: start; }
.align-end { align-content: end; }
.align-center { align-content: center; }
.align-between { align-content: space-between; }
.align-around { align-content: space-around; }
.align-evenly { align-content: space-evenly; }

.items-start { align-items: start; }
.items-end { align-items: end; }
.items-center { align-items: center; }
.items-baseline { align-items: baseline; }
.items-stretch { align-items: stretch; }

.self-start { align-self: start; }
.self-end { align-self: end; }
.self-center { align-self: center; }
.self-baseline { align-self: baseline; }
.self-stretch { align-self: stretch; }

// RESPONSIVE CONTAINERS
@media (max-width: 575px) {
  .container {
    padding: 0 16px;
  }
}

@media (max-width: 767px) {
  .row {
    margin: calc(var(--grid-gap-sm) / -2);
  }
  
  .col,
  [class*="col-"] {
    padding: calc(var(--grid-gap-sm) / 2);
  }
  
  .grid {
    gap: var(--grid-gap-sm);
  }
}VDx// ==========================================================================
// LAYOUT SYSTEM
// ==========================================================================
// Core layout utilities and patterns for the application shell
// ==========================================================================

// Layout variables
:root {
  --header-height: 64px;
  --sidenav-width-expanded: 240px;
  --sidenav-width-rail: 64px;
  --sidenav-width-hidden: 0px;
}

// ==========================================================================
// LAYOUT CONTAINERS
// ==========================================================================

.layout-container {
  width: 100%;
  height: 100vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

.layout-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: var(--header-height);
  z-index: 1000;
  background-color: var(--surface-elevated, #ffffff);
  border-bottom: 1px solid var(--border-secondary, #e5e5e5);
}

.layout-body {
  flex: 1;
  display: flex;
  margin-top: var(--header-height);
  overflow: hidden;
}

.layout-sidebar {
  flex-shrink: 0;
  height: 100%;
  background-color: var(--surface-elevated, #ffffff);
  border-right: 1px solid var(--border-secondary, #e5e5e5);
  transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  
  &.sidebar-expanded {
    width: var(--sidenav-width-expanded);
  }
  
  &.sidebar-rail {
    width: var(--sidenav-width-rail);
  }
  
  &.sidebar-hidden {
    width: var(--sidenav-width-hidden);
  }
}

.layout-main {
  flex: 1;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

.layout-content {
  flex: 1;
  overflow: auto;
  padding: 1.5rem;
  background-color: var(--surface-primary, #fafafa);
}

// ==========================================================================
// RESPONSIVE LAYOUT UTILITIES
// ==========================================================================

@media (max-width: 768px) {
  .layout-sidebar {
    position: fixed;
    top: var(--header-height);
    left: 0;
    height: calc(100vh - var(--header-height));
    z-index: 900;
    transform: translateX(-100%);
    transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    
    &.sidebar-visible {
      transform: translateX(0);
      width: 280px;
      box-shadow: 4px 0 24px rgba(0, 0, 0, 0.15);
    }
  }
  
  .layout-main {
    margin-left: 0 !important;
  }
  
  .layout-content {
    padding: 1rem;
  }
}

// ==========================================================================
// LAYOUT STATE UTILITIES
// ==========================================================================

.layout-no-scroll {
  overflow: hidden;
}

.layout-with-sidebar-expanded .layout-main {
  margin-left: var(--sidenav-width-expanded);
}

.layout-with-sidebar-rail .layout-main {
  margin-left: var(--sidenav-width-rail);
}

.layout-with-sidebar-hidden .layout-main {
  margin-left: var(--sidenav-width-hidden);
}

// ==========================================================================
// LAYOUT ANIMATIONS
// ==========================================================================

@keyframes slideInFromLeft {
  from {
    transform: translateX(-100%);
    opacity: 0;
  }
  to {
    transform: translateX(0);
    opacity: 1;
  }
}

@keyframes slideOutToLeft {
  from {
    transform: translateX(0);
    opacity: 1;
  }
  to {
    transform: translateX(-100%);
    opacity: 0;
  }
}

.layout-animation-enter {
  animation: slideInFromLeft 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.layout-animation-leave {
  animation: slideOutToLeft 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

// ==========================================================================
// LAYOUT FOCUS MANAGEMENT
// ==========================================================================

.layout-focus-trap {
  position: relative;
}

.layout-overlay {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 800;
  opacity: 0;
  visibility: hidden;
  transition: all 0.3s ease-in-out;
  
  &.active {
    opacity: 1;
    visibility: visible;
  }
}ۯx// ==========================================================================
// PAGE TEMPLATES
// ==========================================================================
// Common page layout templates for different application pages
// Structural definitions without visual theming
// ==========================================================================

// LANDING PAGE TEMPLATE
.landing-page {
  display: flex;
  flex-direction: column;
  min-height: 100vh;

  .landing-hero {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: var(--hero-min-height, 60vh);
    text-align: center;
    position: relative;
    overflow: hidden;

    .hero-content {
      max-width: var(--hero-content-max-width, 800px);
      padding: var(--hero-content-padding, 48px 24px);
      z-index: 2;
      position: relative;
    }

    .hero-background {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      z-index: 1;
    }
  }

  .landing-features {
    flex-shrink: 0;
    padding: var(--features-padding, 80px 24px);

    .features-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
      gap: var(--features-gap, 48px);
      max-width: var(--features-max-width, 1200px);
      margin: 0 auto;
    }
  }

  .landing-cta {
    flex-shrink: 0;
    text-align: center;
    padding: var(--cta-padding, 80px 24px);
  }
}

// DASHBOARD PAGE TEMPLATE
.dashboard-page {
  display: flex;
  flex-direction: column;
  height: 100vh;

  .dashboard-nav {
    flex-shrink: 0;
    z-index: var(--z-nav, 100);
  }

  .dashboard-body {
    flex: 1;
    display: flex;
    overflow: hidden;
  }

  .dashboard-main {
    flex: 1;
    display: flex;
    flex-direction: column;
    overflow: hidden;
  }
}

// PROFILE PAGE TEMPLATE
.profile-page {
  max-width: var(--profile-max-width, 1000px);
  margin: 0 auto;
  padding: var(--profile-padding, 24px);

  .profile-header {
    display: flex;
    align-items: flex-start;
    gap: var(--profile-header-gap, 24px);
    margin-bottom: var(--profile-header-spacing, 48px);

    .profile-avatar {
      flex-shrink: 0;
      width: var(--profile-avatar-size, 120px);
      height: var(--profile-avatar-size, 120px);
      border-radius: var(--profile-avatar-radius, 50%);
      overflow: hidden;
    }

    .profile-info {
      flex: 1;
      min-width: 0;

      .profile-name {
        margin: 0 0 var(--profile-name-spacing, 8px) 0;
        font-size: var(--profile-name-size, 2rem);
        font-weight: var(--profile-name-weight, 600);
      }

      .profile-bio {
        margin: 0 0 var(--profile-bio-spacing, 16px) 0;
        opacity: 0.7;
      }

      .profile-actions {
        display: flex;
        gap: var(--profile-actions-gap, 12px);
        flex-wrap: wrap;
      }
    }
  }

  .profile-content {
    display: grid;
    grid-template-columns: 2fr 1fr;
    gap: var(--profile-content-gap, 48px);
    align-items: flex-start;

    .profile-main {
      min-width: 0;
    }

    .profile-sidebar {
      min-width: 0;
    }
  }
}

@media (max-width: 768px) {
  .profile-page {
    .profile-header {
      flex-direction: column;
      text-align: center;

      .profile-info {
        text-align: center;
      }
    }

    .profile-content {
      grid-template-columns: 1fr;
      gap: var(--profile-content-gap-mobile, 32px);
    }
  }
}

// SETTINGS PAGE TEMPLATE
.settings-page {
  max-width: var(--settings-max-width, 800px);
  margin: 0 auto;
  padding: var(--settings-padding, 24px);

  .settings-nav {
    margin-bottom: var(--settings-nav-spacing, 32px);

    .nav-tabs {
      display: flex;
      gap: var(--nav-tabs-gap, 24px);
      border-bottom: 1px solid var(--border-color, #e5e5e5);

      .nav-tab {
        padding: var(--nav-tab-padding, 12px 0);
        border-bottom: 2px solid transparent;
        cursor: pointer;
        transition: all var(--transition-duration, 0.2s);

        &.nav-tab-active {
          border-bottom-color: var(--primary-color, #007bff);
        }
      }
    }
  }

  .settings-content {
    .settings-section {
      margin-bottom: var(--settings-section-spacing, 48px);

      &:last-child {
        margin-bottom: 0;
      }

      .section-title {
        margin: 0 0 var(--section-title-spacing, 24px) 0;
        font-size: var(--section-title-size, 1.25rem);
        font-weight: var(--section-title-weight, 600);
      }

      .section-description {
        margin: 0 0 var(--section-description-spacing, 24px) 0;
        opacity: 0.7;
      }

      .setting-item {
        display: flex;
        justify-content: space-between;
        align-items: flex-start;
        padding: var(--setting-item-padding, 16px 0);
        border-bottom: 1px solid var(--border-color-light, #f0f0f0);

        &:last-child {
          border-bottom: none;
        }

        .setting-info {
          flex: 1;
          margin-right: var(--setting-info-spacing, 24px);

          .setting-label {
            margin: 0 0 var(--setting-label-spacing, 4px) 0;
            font-weight: var(--setting-label-weight, 500);
          }

          .setting-description {
            margin: 0;
            opacity: 0.7;
            font-size: var(--setting-description-size, 0.875rem);
          }
        }

        .setting-control {
          flex-shrink: 0;
        }
      }
    }
  }
}

// ERROR PAGE TEMPLATE
.error-page {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  text-align: center;
  padding: var(--error-page-padding, 24px);

  .error-content {
    max-width: var(--error-content-max-width, 600px);

    .error-code {
      font-size: var(--error-code-size, 6rem);
      font-weight: var(--error-code-weight, 700);
      line-height: 1;
      margin: 0 0 var(--error-code-spacing, 24px) 0;
    }

    .error-title {
      font-size: var(--error-title-size, 2rem);
      font-weight: var(--error-title-weight, 600);
      margin: 0 0 var(--error-title-spacing, 16px) 0;
    }

    .error-message {
      margin: 0 0 var(--error-message-spacing, 32px) 0;
      opacity: 0.7;
    }

    .error-actions {
      display: flex;
      justify-content: center;
      gap: var(--error-actions-gap, 16px);
      flex-wrap: wrap;
    }
  }
}

// AUTH PAGE TEMPLATE
.auth-page {
  display: flex;
  min-height: 100vh;

  .auth-visual {
    flex: 1;
    display: none;
    position: relative;
    overflow: hidden;

    @media (min-width: 768px) {
      display: flex;
    }

    .auth-visual-content {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      text-align: center;
      z-index: 2;
    }

    .auth-visual-background {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      z-index: 1;
    }
  }

  .auth-form-container {
    flex-shrink: 0;
    width: 100%;
    max-width: var(--auth-form-max-width, 480px);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--auth-form-padding, 48px 24px);

    .auth-form {
      width: 100%;
      max-width: var(--auth-form-width, 400px);

      .auth-header {
        text-align: center;
        margin-bottom: var(--auth-header-spacing, 48px);

        .auth-title {
          margin: 0 0 var(--auth-title-spacing, 16px) 0;
          font-size: var(--auth-title-size, 2rem);
          font-weight: var(--auth-title-weight, 600);
        }

        .auth-subtitle {
          margin: 0;
          opacity: 0.7;
        }
      }

      .auth-footer {
        text-align: center;
        margin-top: var(--auth-footer-spacing, 32px);
      }
    }
  }
}3<x #// ==========================================================================
// RESPONSIVE LAYOUTS
// ==========================================================================
// Responsive layout utilities and patterns
// Mobile-first approach with progressive enhancement
// ==========================================================================

// RESPONSIVE BREAKPOINTS (from base/_breakpoints.scss)
$breakpoints: (
  xs: 0,
  sm: 576px,
  md: 768px,
  lg: 992px,
  xl: 1200px,
  xxl: 1400px
) !default;

// RESPONSIVE UTILITIES
.d-none { display: none !important; }
.d-block { display: block !important; }
.d-flex { display: flex !important; }
.d-grid { display: grid !important; }
.d-inline { display: inline !important; }
.d-inline-block { display: inline-block !important; }
.d-inline-flex { display: inline-flex !important; }

// RESPONSIVE DISPLAY UTILITIES
@media (max-width: 575px) {
  .d-xs-none { display: none !important; }
  .d-xs-block { display: block !important; }
  .d-xs-flex { display: flex !important; }
  .d-xs-grid { display: grid !important; }
  .d-xs-inline { display: inline !important; }
  .d-xs-inline-block { display: inline-block !important; }
  .d-xs-inline-flex { display: inline-flex !important; }
}

@media (min-width: 576px) {
  .d-sm-none { display: none !important; }
  .d-sm-block { display: block !important; }
  .d-sm-flex { display: flex !important; }
  .d-sm-grid { display: grid !important; }
  .d-sm-inline { display: inline !important; }
  .d-sm-inline-block { display: inline-block !important; }
  .d-sm-inline-flex { display: inline-flex !important; }
}

@media (min-width: 768px) {
  .d-md-none { display: none !important; }
  .d-md-block { display: block !important; }
  .d-md-flex { display: flex !important; }
  .d-md-grid { display: grid !important; }
  .d-md-inline { display: inline !important; }
  .d-md-inline-block { display: inline-block !important; }
  .d-md-inline-flex { display: inline-flex !important; }
}

@media (min-width: 992px) {
  .d-lg-none { display: none !important; }
  .d-lg-block { display: block !important; }
  .d-lg-flex { display: flex !important; }
  .d-lg-grid { display: grid !important; }
  .d-lg-inline { display: inline !important; }
  .d-lg-inline-block { display: inline-block !important; }
  .d-lg-inline-flex { display: inline-flex !important; }
}

@media (min-width: 1200px) {
  .d-xl-none { display: none !important; }
  .d-xl-block { display: block !important; }
  .d-xl-flex { display: flex !important; }
  .d-xl-grid { display: grid !important; }
  .d-xl-inline { display: inline !important; }
  .d-xl-inline-block { display: inline-block !important; }
  .d-xl-inline-flex { display: inline-flex !important; }
}

// RESPONSIVE FLEX DIRECTION
.flex-column { flex-direction: column !important; }
.flex-row { flex-direction: row !important; }
.flex-column-reverse { flex-direction: column-reverse !important; }
.flex-row-reverse { flex-direction: row-reverse !important; }

@media (max-width: 575px) {
  .flex-xs-column { flex-direction: column !important; }
  .flex-xs-row { flex-direction: row !important; }
  .flex-xs-column-reverse { flex-direction: column-reverse !important; }
  .flex-xs-row-reverse { flex-direction: row-reverse !important; }
}

@media (min-width: 576px) {
  .flex-sm-column { flex-direction: column !important; }
  .flex-sm-row { flex-direction: row !important; }
  .flex-sm-column-reverse { flex-direction: column-reverse !important; }
  .flex-sm-row-reverse { flex-direction: row-reverse !important; }
}

@media (min-width: 768px) {
  .flex-md-column { flex-direction: column !important; }
  .flex-md-row { flex-direction: row !important; }
  .flex-md-column-reverse { flex-direction: column-reverse !important; }
  .flex-md-row-reverse { flex-direction: row-reverse !important; }
}

// RESPONSIVE LAYOUT PATTERNS
.mobile-stack {
  @media (max-width: 767px) {
    flex-direction: column !important;
    
    > * {
      width: 100% !important;
      margin-bottom: var(--mobile-stack-gap, 16px);
      
      &:last-child {
        margin-bottom: 0;
      }
    }
  }
}

.tablet-stack {
  @media (max-width: 991px) {
    flex-direction: column !important;
    
    > * {
      width: 100% !important;
      margin-bottom: var(--tablet-stack-gap, 20px);
      
      &:last-child {
        margin-bottom: 0;
      }
    }
  }
}

// RESPONSIVE SPACING
.p-responsive {
  padding: var(--spacing-mobile, 16px);
  
  @media (min-width: 768px) {
    padding: var(--spacing-tablet, 24px);
  }
  
  @media (min-width: 1200px) {
    padding: var(--spacing-desktop, 32px);
  }
}

.m-responsive {
  margin: var(--spacing-mobile, 16px);
  
  @media (min-width: 768px) {
    margin: var(--spacing-tablet, 24px);
  }
  
  @media (min-width: 1200px) {
    margin: var(--spacing-desktop, 32px);
  }
}

// RESPONSIVE TEXT ALIGNMENT
.text-center { text-align: center !important; }
.text-left { text-align: left !important; }
.text-right { text-align: right !important; }

@media (max-width: 575px) {
  .text-xs-center { text-align: center !important; }
  .text-xs-left { text-align: left !important; }
  .text-xs-right { text-align: right !important; }
}

@media (min-width: 576px) {
  .text-sm-center { text-align: center !important; }
  .text-sm-left { text-align: left !important; }
  .text-sm-right { text-align: right !important; }
}

@media (min-width: 768px) {
  .text-md-center { text-align: center !important; }
  .text-md-left { text-align: left !important; }
  .text-md-right { text-align: right !important; }
}

// RESPONSIVE LAYOUT COMPONENTS
.responsive-sidebar {
  display: flex;
  gap: var(--sidebar-gap, 32px);
  
  .sidebar-main {
    flex: 1;
    min-width: 0;
  }
  
  .sidebar-aside {
    flex-shrink: 0;
    width: var(--sidebar-width, 300px);
  }
  
  @media (max-width: 991px) {
    flex-direction: column;
    gap: var(--sidebar-gap-mobile, 24px);
    
    .sidebar-aside {
      width: 100%;
      order: -1; // Move sidebar to top on mobile
    }
    
    &.sidebar-bottom {
      .sidebar-aside {
        order: 1; // Keep sidebar at bottom
      }
    }
  }
}

.responsive-cards {
  display: grid;
  gap: var(--cards-gap, 24px);
  grid-template-columns: 1fr;
  
  @media (min-width: 576px) {
    grid-template-columns: repeat(2, 1fr);
  }
  
  @media (min-width: 768px) {
    grid-template-columns: repeat(3, 1fr);
  }
  
  @media (min-width: 1200px) {
    grid-template-columns: repeat(4, 1fr);
  }
  
  &.cards-auto-fit {
    grid-template-columns: repeat(auto-fit, minmax(var(--card-min-width, 280px), 1fr));
  }
  
  &.cards-2-max {
    @media (min-width: 768px) {
      grid-template-columns: repeat(2, 1fr);
    }
  }
  
  &.cards-3-max {
    @media (min-width: 1200px) {
      grid-template-columns: repeat(3, 1fr);
    }
  }
}

.responsive-hero {
  padding: var(--hero-padding-mobile, 48px 16px);
  text-align: center;
  
  @media (min-width: 768px) {
    padding: var(--hero-padding-tablet, 80px 24px);
  }
  
  @media (min-width: 1200px) {
    padding: var(--hero-padding-desktop, 120px 32px);
  }
  
  .hero-title {
    font-size: var(--hero-title-mobile, 2rem);
    
    @media (min-width: 768px) {
      font-size: var(--hero-title-tablet, 3rem);
    }
    
    @media (min-width: 1200px) {
      font-size: var(--hero-title-desktop, 4rem);
    }
  }
  
  .hero-subtitle {
    font-size: var(--hero-subtitle-mobile, 1rem);
    
    @media (min-width: 768px) {
      font-size: var(--hero-subtitle-tablet, 1.25rem);
    }
    
    @media (min-width: 1200px) {
      font-size: var(--hero-subtitle-desktop, 1.5rem);
    }
  }
}

// RESPONSIVE NAVIGATION
.responsive-nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--nav-padding, 16px 24px);
  
  .nav-brand {
    flex-shrink: 0;
  }
  
  .nav-menu {
    display: flex;
    align-items: center;
    gap: var(--nav-menu-gap, 24px);
    
    @media (max-width: 767px) {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      flex-direction: column;
      justify-content: center;
      background: var(--nav-mobile-bg, white);
      transform: translateX(-100%);
      transition: transform 0.3s ease;
      z-index: var(--z-nav-mobile, 1000);
      
      &.nav-menu-open {
        transform: translateX(0);
      }
    }
  }
  
  .nav-toggle {
    display: none;
    flex-direction: column;
    gap: 4px;
    padding: 8px;
    border: none;
    background: transparent;
    cursor: pointer;
    
    @media (max-width: 767px) {
      display: flex;
    }
    
    .nav-toggle-bar {
      width: 24px;
      height: 2px;
      background: currentColor;
      transition: all 0.3s ease;
    }
    
    &.nav-toggle-active {
      .nav-toggle-bar:nth-child(1) {
        transform: rotate(45deg) translate(5px, 5px);
      }
      
      .nav-toggle-bar:nth-child(2) {
        opacity: 0;
      }
      
      .nav-toggle-bar:nth-child(3) {
        transform: rotate(-45deg) translate(7px, -6px);
      }
    }
  }
}NxX// ==========================================================================
// CONTENT PATTERNS
// ==========================================================================
// Theme-agnostic content layout patterns and structures
// Visual styling handled by themes - includes component-specific classes
// ==========================================================================

// COMPONENT-SPECIFIC CONTENT PATTERNS
// These classes are used by our Angular components

// ARTICLE PATTERNS
.content-article {
  display: block;
  width: 100%;
  max-width: var(--article-max-width, #{$semantic-sizing-content-medium});
  margin: 0 auto;

  &.article-is-featured {
    max-width: var(--article-featured-max-width, #{$semantic-sizing-content-wide});
    
    .article-title {
      font-size: var(--article-featured-title-size, 3rem);
      line-height: var(--article-featured-title-line-height, 1.1);
    }
  }

  &.article-is-compact {
    max-width: var(--article-compact-max-width, #{$semantic-sizing-content-narrow});
    
    .article-header {
      margin-bottom: #{$semantic-spacing-component-padding-md};
    }
    
    .article-title {
      font-size: var(--article-compact-title-size, 1.5rem);
    }
  }

  &.article-has-lead-image {
    .article-lead-image {
      margin-bottom: #{$semantic-spacing-content-paragraph};
      
      img {
        width: 100%;
        height: auto;
        display: block;
        border-radius: var(--article-image-border-radius, #{$semantic-border-card-radius});
      }
    }
  }

  // Article structure
  .article-header {
    margin-bottom: #{$semantic-spacing-layout-section-sm};
    
    .article-title {
      font-size: var(--article-title-size, 2.5rem);
      font-weight: var(--article-title-weight, 700);
      line-height: var(--article-title-line-height, 1.2);
      margin: 0 0 #{$semantic-spacing-component-padding-sm} 0;
    }
    
    .article-subtitle {
      font-size: var(--article-subtitle-size, 1.25rem);
      font-weight: var(--article-subtitle-weight, 400);
      line-height: var(--article-subtitle-line-height, 1.4);
      margin: 0 0 #{$semantic-spacing-component-padding-md} 0;
      color: var(--article-subtitle-color, rgba(0, 0, 0, 0.6));
    }
    
    .article-meta {
      display: flex;
      flex-wrap: wrap;
      gap: #{$semantic-spacing-component-padding-sm};
      align-items: center;
      font-size: var(--article-meta-size, 0.875rem);
      color: var(--article-meta-color, rgba(0, 0, 0, 0.5));
    }
  }
  
  .article-content {
    line-height: var(--article-content-line-height, 1.7);
    font-size: var(--article-content-size, 1rem);
    
    > * + * {
      margin-top: #{$semantic-spacing-content-paragraph};
    }
  }
  
  .article-footer {
    margin-top: #{$semantic-spacing-layout-section-sm};
    padding-top: #{$semantic-spacing-component-padding-md};
    border-top: #{$semantic-border-divider-width} solid var(--article-footer-border, transparent);
  }
}

// HERO PATTERNS
.content-hero {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: var(--hero-min-height, 60vh);
  overflow: hidden;

  &.hero-is-fullscreen {
    min-height: 100vh;
    height: 100vh;
  }

  &.hero-content-centered {
    text-align: center;
    
    .hero-content {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
    }
  }

  &.hero-has-background {
    .hero-background {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      z-index: 1;
      
      .hero-bg-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        object-position: center;
      }
    }
  }

  &.hero-has-overlay-effect {
    .hero-overlay {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: var(--hero-overlay-color, rgba(0, 0, 0, 0.3));
      z-index: 2;
    }
  }

  .hero-content {
    position: relative;
    z-index: 3;
    padding: #{$semantic-spacing-layout-section-md};
    max-width: var(--hero-content-max-width, #{$semantic-sizing-content-medium});
    width: 100%;

    .hero-title {
      font-size: var(--hero-title-size, 3.5rem);
      font-weight: var(--hero-title-weight, 800);
      line-height: var(--hero-title-line-height, 1.1);
      margin: 0 0 #{$semantic-spacing-component-padding-lg} 0;
    }

    .hero-subtitle {
      font-size: var(--hero-subtitle-size, 1.5rem);
      font-weight: var(--hero-subtitle-weight, 400);
      line-height: var(--hero-subtitle-line-height, 1.3);
      margin: 0 0 #{$semantic-spacing-component-padding-md} 0;
      color: var(--hero-subtitle-color, rgba(0, 0, 0, 0.7));
    }

    .hero-description {
      font-size: var(--hero-description-size, 1.125rem);
      line-height: var(--hero-description-line-height, 1.6);
      margin: 0 0 #{$semantic-spacing-layout-section-sm} 0;
      color: var(--hero-description-color, rgba(0, 0, 0, 0.8));
    }

    .hero-actions {
      display: flex;
      gap: #{$semantic-spacing-component-padding-md};
      flex-wrap: wrap;
      align-items: center;
    }
  }

  // Responsive hero
  @media (max-width: #{$base-breakpoint-md}) {
    .hero-content {
      padding: #{$semantic-spacing-layout-section-sm};
      
      .hero-title {
        font-size: var(--hero-mobile-title-size, 2.5rem);
      }
      
      .hero-subtitle {
        font-size: var(--hero-mobile-subtitle-size, 1.25rem);
      }
    }
  }
}

// SECTION PATTERNS
.content-section {
  width: 100%;
  
  &.section-is-padded {
    padding: #{$semantic-spacing-layout-section-md} 0;
  }
  
  &.section-is-contained {
    max-width: var(--section-max-width, #{$semantic-sizing-content-medium});
    margin: 0 auto;
    padding-left: #{$semantic-spacing-component-padding-lg};
    padding-right: #{$semantic-spacing-component-padding-lg};
  }
  
  &.section-content-centered {
    text-align: center;
    
    .section-header,
    .section-content {
      display: flex;
      flex-direction: column;
      align-items: center;
    }
  }
  
  &.section-is-highlighted {
    position: relative;
    
    &::before {
      content: '';
      position: absolute;
      left: 0;
      top: 0;
      bottom: 0;
      width: #{$base-spacing-1};
      background: var(--section-highlight-color, currentColor);
      opacity: var(--section-highlight-opacity, 0.3);
    }
    
    padding-left: #{$semantic-spacing-component-padding-lg};
  }

  .section-header {
    margin-bottom: #{$semantic-spacing-layout-section-xs};
    
    .section-title {
      font-size: var(--section-title-size, 2rem);
      font-weight: var(--section-title-weight, 600);
      line-height: var(--section-title-line-height, 1.2);
      margin: 0 0 #{$semantic-spacing-component-padding-sm} 0;
    }
    
    .section-subtitle {
      font-size: var(--section-subtitle-size, 1.125rem);
      font-weight: var(--section-subtitle-weight, 400);
      line-height: var(--section-subtitle-line-height, 1.4);
      margin: 0;
      color: var(--section-subtitle-color, rgba(0, 0, 0, 0.6));
    }
  }
  
  .section-content {
    line-height: var(--section-content-line-height, 1.6);
  }
  
  .section-actions {
    margin-top: #{$semantic-spacing-layout-section-xs};
    display: flex;
    gap: #{$semantic-spacing-component-padding-sm};
    flex-wrap: wrap;
    align-items: center;
  }
}

// MEDIA PATTERNS
.content-media {
  display: block;
  width: 100%;
  
  &.media-is-responsive {
    .media-container {
      position: relative;
      width: 100%;
      
      img, video, audio {
        max-width: 100%;
        height: auto;
        display: block;
      }
    }
  }
  
  &.media-is-rounded {
    .media-container {
      border-radius: var(--media-border-radius, #{$semantic-border-card-radius});
      overflow: hidden;
    }
  }
  
  &.media-has-caption {
    .media-caption {
      padding: #{$semantic-spacing-component-padding-sm} 0;
      
      .caption-text {
        font-size: var(--media-caption-size, 0.875rem);
        line-height: var(--media-caption-line-height, 1.4);
        color: var(--media-caption-color, rgba(0, 0, 0, 0.6));
        margin: 0;
        font-style: var(--media-caption-style, italic);
      }
      
      &.media-caption-top {
        order: -1;
      }
      
      &.media-caption-bottom {
        order: 1;
      }
    }
  }
  
  &.media-has-overlay {
    .media-container {
      position: relative;
      
      .media-overlay {
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background: var(--media-overlay-color, rgba(0, 0, 0, 0.3));
        display: flex;
        align-items: center;
        justify-content: center;
        opacity: 0;
        transition: opacity var(--transition-duration, 0.3s) var(--transition-easing, ease);
      }
      
      &:hover .media-overlay {
        opacity: 1;
      }
    }
  }

  // Media layouts
  &.media-layout-featured {
    .media-container {
      aspect-ratio: var(--media-featured-aspect-ratio, 16/9);
      
      img, video {
        width: 100%;
        height: 100%;
        object-fit: cover;
      }
    }
  }
  
  &.media-layout-thumbnail {
    max-width: var(--media-thumbnail-size, #{$base-sizing-width-32});
    
    .media-container {
      aspect-ratio: var(--media-thumbnail-aspect-ratio, 1);
      
      img, video {
        width: 100%;
        height: 100%;
        object-fit: cover;
      }
    }
  }
  
  &.media-layout-gallery {
    .media-container {
      aspect-ratio: var(--media-gallery-aspect-ratio, 4/3);
      
      img, video {
        width: 100%;
        height: 100%;
        object-fit: cover;
      }
    }
  }

  // Media types
  &.media-type-image {
    .media-image {
      &.media-cover {
        object-fit: cover;
      }
      
      &.media-contain {
        object-fit: contain;
      }
    }
  }
  
  &.media-type-video,
  &.media-type-audio {
    .media-video,
    .media-audio {
      width: 100%;
      background: var(--media-player-bg, #000);
    }
  }
  
  &.media-type-embed {
    .media-embed {
      position: relative;
      width: 100%;
      height: 0;
      padding-bottom: var(--media-embed-aspect-ratio, 56.25%); // 16:9 default
      
      iframe,
      object,
      embed {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
      }
    }
  }
}

// ==========================================================================
// LEGACY CONTENT PATTERNS - EXISTING PATTERNS BELOW
// ==========================================================================

// MEDIA OBJECT PATTERN
.media {
  display: flex;
  align-items: flex-start;
  gap: var(--media-gap, 16px);

  .media-object {
    flex-shrink: 0;
    width: var(--media-object-size, auto);
    height: var(--media-object-size, auto);
    border-radius: var(--media-object-border-radius, 4px);

    &.media-object-circle {
      border-radius: 50%;
    }

    &.media-object-sm {
      --media-object-size: 32px;
    }

    &.media-object-lg {
      --media-object-size: 64px;
    }
  }

  .media-body {
    flex: 1;
    min-width: 0; // Prevents flex item overflow

    .media-heading {
      margin: 0 0 var(--media-heading-margin, 8px) 0;
      font-size: var(--media-heading-size, 1rem);
      font-weight: var(--media-heading-weight, 600);
    }

    .media-content {
      margin: 0;
      line-height: var(--media-content-line-height, 1.5);
    }

    .media-meta {
      margin-top: var(--media-meta-margin, 8px);
      font-size: var(--media-meta-size, 0.875rem);
      opacity: var(--media-meta-opacity, 0.7);
    }
  }

  &.media-reverse {
    flex-direction: row-reverse;
  }

  &.media-top {
    align-items: flex-start;
  }

  &.media-middle {
    align-items: center;
  }

  &.media-bottom {
    align-items: flex-end;
  }

  // Nested media objects
  .media {
    margin-top: var(--media-nested-margin, 16px);
  }
}

@media (max-width: 576px) {
  .media {
    --media-gap: 12px;
    
    &.media-stack-mobile {
      flex-direction: column;
      
      .media-object {
        align-self: center;
      }
      
      .media-body {
        text-align: center;
      }
    }
  }
}

// HERO SECTIONS
.hero {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: var(--hero-min-height, 400px);
  padding: var(--hero-padding, 80px 24px);
  text-align: center;
  overflow: hidden;

  .hero-background {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 0;

    &.hero-background-image {
      background-size: cover;
      background-position: center;
      background-repeat: no-repeat;
    }

    &.hero-background-video {
      video {
        width: 100%;
        height: 100%;
        object-fit: cover;
      }
    }

    &.hero-background-overlay::after {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: var(--hero-overlay, rgba(0, 0, 0, 0.4));
    }
  }

  .hero-content {
    position: relative;
    z-index: 1;
    max-width: var(--hero-content-max-width, 800px);
    width: 100%;

    .hero-title {
      margin: 0 0 var(--hero-title-margin, 24px) 0;
      font-size: var(--hero-title-size, 3rem);
      font-weight: var(--hero-title-weight, 700);
      line-height: var(--hero-title-line-height, 1.2);
    }

    .hero-subtitle {
      margin: 0 0 var(--hero-subtitle-margin, 32px) 0;
      font-size: var(--hero-subtitle-size, 1.25rem);
      line-height: var(--hero-subtitle-line-height, 1.5);
      opacity: var(--hero-subtitle-opacity, 0.9);
    }

    .hero-actions {
      display: flex;
      gap: var(--hero-actions-gap, 16px);
      justify-content: center;
      flex-wrap: wrap;
    }
  }

  &.hero-left {
    text-align: left;
    justify-content: flex-start;

    .hero-actions {
      justify-content: flex-start;
    }
  }

  &.hero-right {
    text-align: right;
    justify-content: flex-end;

    .hero-actions {
      justify-content: flex-end;
    }
  }

  &.hero-split {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--hero-split-gap, 48px);
    text-align: left;

    .hero-content {
      display: flex;
      flex-direction: column;
      justify-content: center;
    }

    .hero-media {
      display: flex;
      align-items: center;
      justify-content: center;

      img,
      video {
        max-width: 100%;
        height: auto;
        border-radius: var(--hero-media-border-radius, 8px);
      }
    }
  }
}

@media (max-width: 768px) {
  .hero {
    --hero-padding: 60px 16px;
    --hero-title-size: 2rem;
    --hero-subtitle-size: 1rem;

    &.hero-split {
      grid-template-columns: 1fr;
      text-align: center;

      .hero-media {
        order: -1;
      }

      .hero-actions {
        justify-content: center;
      }
    }

    .hero-actions {
      flex-direction: column;

      .btn {
        width: 100%;
      }
    }
  }
}

// FEATURE SECTIONS
.features {
  padding: var(--features-padding, 80px 0);

  .features-header {
    text-align: center;
    margin-bottom: var(--features-header-margin, 64px);

    .features-title {
      margin: 0 0 var(--features-title-margin, 16px) 0;
      font-size: var(--features-title-size, 2.5rem);
      font-weight: var(--features-title-weight, 700);
    }

    .features-subtitle {
      margin: 0;
      font-size: var(--features-subtitle-size, 1.125rem);
      opacity: var(--features-subtitle-opacity, 0.8);
      max-width: var(--features-subtitle-max-width, 600px);
      margin-left: auto;
      margin-right: auto;
    }
  }

  .features-grid {
    display: grid;
    gap: var(--features-grid-gap, 48px);
    grid-template-columns: 1fr;

    @media (min-width: 768px) {
      grid-template-columns: repeat(2, 1fr);
    }

    @media (min-width: 992px) {
      grid-template-columns: repeat(3, 1fr);
    }

    &.features-grid-2-col {
      @media (min-width: 768px) {
        grid-template-columns: repeat(2, 1fr);
      }
    }

    &.features-grid-4-col {
      @media (min-width: 1200px) {
        grid-template-columns: repeat(4, 1fr);
      }
    }
  }

  .feature-item {
    text-align: center;

    .feature-icon {
      width: var(--feature-icon-size, 64px);
      height: var(--feature-icon-size, 64px);
      margin: 0 auto var(--feature-icon-margin, 24px) auto;
      display: flex;
      align-items: center;
      justify-content: center;
      border-radius: var(--feature-icon-border-radius, 12px);
    }

    .feature-title {
      margin: 0 0 var(--feature-title-margin, 16px) 0;
      font-size: var(--feature-title-size, 1.25rem);
      font-weight: var(--feature-title-weight, 600);
    }

    .feature-description {
      margin: 0;
      line-height: var(--feature-description-line-height, 1.6);
      opacity: var(--feature-description-opacity, 0.8);
    }

    &.feature-item-left {
      text-align: left;

      .feature-icon {
        margin-left: 0;
        margin-right: auto;
      }
    }

    &.feature-item-horizontal {
      display: flex;
      gap: var(--feature-horizontal-gap, 24px);
      text-align: left;

      .feature-icon {
        flex-shrink: 0;
        margin: 0;
      }

      .feature-content {
        flex: 1;
      }
    }
  }
}

// TESTIMONIAL SECTIONS
.testimonials {
  padding: var(--testimonials-padding, 80px 0);

  .testimonials-header {
    text-align: center;
    margin-bottom: var(--testimonials-header-margin, 64px);

    .testimonials-title {
      margin: 0 0 var(--testimonials-title-margin, 16px) 0;
      font-size: var(--testimonials-title-size, 2.5rem);
      font-weight: var(--testimonials-title-weight, 700);
    }

    .testimonials-subtitle {
      margin: 0;
      font-size: var(--testimonials-subtitle-size, 1.125rem);
      opacity: var(--testimonials-subtitle-opacity, 0.8);
    }
  }

  .testimonials-grid {
    display: grid;
    gap: var(--testimonials-grid-gap, 32px);
    grid-template-columns: 1fr;

    @media (min-width: 768px) {
      grid-template-columns: repeat(2, 1fr);
    }

    @media (min-width: 992px) {
      grid-template-columns: repeat(3, 1fr);
    }
  }

  .testimonial-item {
    display: flex;
    flex-direction: column;
    padding: var(--testimonial-padding, 32px);
    border-radius: var(--testimonial-border-radius, 12px);
    border: var(--testimonial-border, 1px solid rgba(0, 0, 0, 0.1));

    .testimonial-content {
      flex: 1;
      margin-bottom: var(--testimonial-content-margin, 24px);
      font-size: var(--testimonial-content-size, 1rem);
      line-height: var(--testimonial-content-line-height, 1.6);
      font-style: italic;

      &::before {
        content: '"';
      }

      &::after {
        content: '"';
      }
    }

    .testimonial-author {
      display: flex;
      align-items: center;
      gap: var(--testimonial-author-gap, 16px);

      .author-avatar {
        width: var(--author-avatar-size, 48px);
        height: var(--author-avatar-size, 48px);
        border-radius: 50%;
        flex-shrink: 0;
      }

      .author-info {
        .author-name {
          margin: 0 0 var(--author-name-margin, 4px) 0;
          font-size: var(--author-name-size, 1rem);
          font-weight: var(--author-name-weight, 600);
        }

        .author-title {
          margin: 0;
          font-size: var(--author-title-size, 0.875rem);
          opacity: var(--author-title-opacity, 0.7);
        }
      }
    }
  }
}

// CALL TO ACTION SECTIONS
.cta {
  padding: var(--cta-padding, 80px 24px);
  text-align: center;
  position: relative;
  overflow: hidden;

  .cta-background {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 0;
  }

  .cta-content {
    position: relative;
    z-index: 1;
    max-width: var(--cta-content-max-width, 600px);
    margin: 0 auto;

    .cta-title {
      margin: 0 0 var(--cta-title-margin, 24px) 0;
      font-size: var(--cta-title-size, 2.5rem);
      font-weight: var(--cta-title-weight, 700);
      line-height: var(--cta-title-line-height, 1.2);
    }

    .cta-subtitle {
      margin: 0 0 var(--cta-subtitle-margin, 32px) 0;
      font-size: var(--cta-subtitle-size, 1.125rem);
      line-height: var(--cta-subtitle-line-height, 1.5);
      opacity: var(--cta-subtitle-opacity, 0.9);
    }

    .cta-actions {
      display: flex;
      gap: var(--cta-actions-gap, 16px);
      justify-content: center;
      flex-wrap: wrap;
    }
  }

  &.cta-split {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--cta-split-gap, 48px);
    align-items: center;
    text-align: left;

    .cta-content {
      max-width: none;
      margin: 0;

      .cta-actions {
        justify-content: flex-start;
      }
    }

    .cta-visual {
      display: flex;
      align-items: center;
      justify-content: center;

      img,
      video {
        max-width: 100%;
        height: auto;
        border-radius: var(--cta-visual-border-radius, 8px);
      }
    }
  }
}

@media (max-width: 768px) {
  .cta {
    --cta-padding: 60px 16px;
    --cta-title-size: 2rem;
    --cta-subtitle-size: 1rem;

    &.cta-split {
      grid-template-columns: 1fr;
      text-align: center;

      .cta-visual {
        order: -1;
      }

      .cta-content .cta-actions {
        justify-content: center;
      }
    }

    .cta-actions {
      flex-direction: column;

      .btn {
        width: 100%;
      }
    }
  }
}

// STATS/METRICS SECTIONS
.stats {
  padding: var(--stats-padding, 80px 0);

  .stats-grid {
    display: grid;
    gap: var(--stats-grid-gap, 32px);
    grid-template-columns: 1fr;

    @media (min-width: 576px) {
      grid-template-columns: repeat(2, 1fr);
    }

    @media (min-width: 992px) {
      grid-template-columns: repeat(4, 1fr);
    }
  }

  .stat-item {
    text-align: center;

    .stat-number {
      display: block;
      font-size: var(--stat-number-size, 3rem);
      font-weight: var(--stat-number-weight, 700);
      line-height: var(--stat-number-line-height, 1);
      margin-bottom: var(--stat-number-margin, 8px);
    }

    .stat-label {
      font-size: var(--stat-label-size, 1rem);
      font-weight: var(--stat-label-weight, 500);
      opacity: var(--stat-label-opacity, 0.8);
      margin: 0;
    }

    .stat-description {
      margin-top: var(--stat-description-margin, 8px);
      font-size: var(--stat-description-size, 0.875rem);
      opacity: var(--stat-description-opacity, 0.6);
    }
  }
}xD+// ==========================================================================
// INTERACTION PATTERNS
// ==========================================================================
// Common interaction and state patterns
// Theme-agnostic behavioral styles
// ==========================================================================

// HOVER EFFECTS
.hover-lift {
  transition: transform var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease);

  &:hover {
    transform: var(--hover-lift-transform, translateY(-4px));
  }
}

.hover-scale {
  transition: transform var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease);

  &:hover {
    transform: var(--hover-scale-transform, scale(1.05));
  }
}

.hover-glow {
  transition: box-shadow var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease);

  &:hover {
    box-shadow: var(--hover-glow-shadow, 0 0 20px rgba(0, 0, 0, 0.15));
  }
}

.hover-fade {
  transition: opacity var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease);

  &:hover {
    opacity: var(--hover-fade-opacity, 0.8);
  }
}

.hover-brighten {
  transition: filter var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease);

  &:hover {
    filter: brightness(var(--hover-brighten-value, 1.1));
  }
}

.hover-darken {
  transition: filter var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease);

  &:hover {
    filter: brightness(var(--hover-darken-value, 0.9));
  }
}

// FOCUS STATES
.focus-ring {
  &:focus,
  &:focus-visible {
    outline: var(--focus-ring-width, 2px) solid var(--focus-ring-color, #007bff);
    outline-offset: var(--focus-ring-offset, 2px);
  }
}

.focus-ring-inset {
  &:focus,
  &:focus-visible {
    outline: var(--focus-ring-width, 2px) solid var(--focus-ring-color, #007bff);
    outline-offset: var(--focus-ring-inset-offset, -2px);
  }
}

.focus-glow {
  &:focus,
  &:focus-visible {
    box-shadow: var(--focus-glow-shadow, 0 0 0 3px rgba(0, 123, 255, 0.25));
    outline: none;
  }
}

// ACTIVE STATES
.active-press {
  transition: transform var(--active-transition-duration, 0.1s) var(--active-transition-easing, ease);

  &:active {
    transform: var(--active-press-transform, scale(0.98));
  }
}

.active-sink {
  transition: transform var(--active-transition-duration, 0.1s) var(--active-transition-easing, ease);

  &:active {
    transform: var(--active-sink-transform, translateY(2px));
  }
}

// LOADING STATES
.loading {
  position: relative;
  pointer-events: none;

  &::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: var(--loading-spinner-size, 20px);
    height: var(--loading-spinner-size, 20px);
    margin-top: calc(var(--loading-spinner-size, 20px) / -2);
    margin-left: calc(var(--loading-spinner-size, 20px) / -2);
    border: 2px solid var(--loading-spinner-color, rgba(0, 0, 0, 0.3));
    border-top-color: var(--loading-spinner-active-color, #007bff);
    border-radius: 50%;
    animation: loading-spin var(--loading-spin-duration, 1s) linear infinite;
    z-index: 1;
  }

  &.loading-overlay::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: var(--loading-overlay-bg, rgba(255, 255, 255, 0.8));
    z-index: 0;
  }
}

@keyframes loading-spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

.loading-pulse {
  animation: loading-pulse var(--loading-pulse-duration, 2s) infinite;
}

@keyframes loading-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: var(--loading-pulse-opacity, 0.5); }
}

.loading-skeleton {
  background: var(--skeleton-bg, #f0f0f0);
  background-image: linear-gradient(
    90deg,
    var(--skeleton-bg, #f0f0f0),
    var(--skeleton-highlight, #e0e0e0),
    var(--skeleton-bg, #f0f0f0)
  );
  background-size: 200px 100%;
  background-repeat: no-repeat;
  animation: loading-shimmer var(--skeleton-duration, 1.5s) infinite;
  border-radius: var(--skeleton-border-radius, 4px);
}

@keyframes loading-shimmer {
  0% { background-position: -200px 0; }
  100% { background-position: calc(200px + 100%) 0; }
}

// DISABLED STATES
.disabled,
[disabled] {
  opacity: var(--disabled-opacity, 0.6);
  pointer-events: none;
  cursor: not-allowed;
}

.disabled-loading {
  opacity: var(--disabled-loading-opacity, 0.8);
  pointer-events: none;
  cursor: wait;
}

// SUCCESS STATES
.success-flash {
  animation: success-flash var(--success-flash-duration, 0.5s) ease-in-out;
}

@keyframes success-flash {
  0%, 100% { background-color: transparent; }
  50% { background-color: var(--success-flash-color, rgba(40, 167, 69, 0.2)); }
}

.success-checkmark {
  position: relative;

  &::after {
    content: '✓';
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    color: var(--success-color, #28a745);
    font-size: var(--success-checkmark-size, 1.5rem);
    font-weight: bold;
    animation: success-checkmark-appear var(--success-checkmark-duration, 0.3s) ease-in-out;
  }
}

@keyframes success-checkmark-appear {
  0% { opacity: 0; transform: translate(-50%, -50%) scale(0.5); }
  100% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
}

// ERROR STATES
.error-shake {
  animation: error-shake var(--error-shake-duration, 0.5s) ease-in-out;
}

@keyframes error-shake {
  0%, 20%, 40%, 60%, 80%, 100% { transform: translateX(0); }
  10%, 50%, 90% { transform: translateX(-5px); }
  30%, 70% { transform: translateX(5px); }
}

.error-flash {
  animation: error-flash var(--error-flash-duration, 0.5s) ease-in-out;
}

@keyframes error-flash {
  0%, 100% { background-color: transparent; }
  50% { background-color: var(--error-flash-color, rgba(220, 53, 69, 0.2)); }
}

// WARNING STATES
.warning-pulse {
  animation: warning-pulse var(--warning-pulse-duration, 2s) infinite;
}

@keyframes warning-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: var(--warning-pulse-opacity, 0.7); }
}

// DRAG AND DROP STATES
.draggable {
  cursor: grab;
  user-select: none;
  transition: transform var(--draggable-transition-duration, 0.2s) var(--draggable-transition-easing, ease);

  &:active {
    cursor: grabbing;
  }

  &.dragging {
    cursor: grabbing;
    opacity: var(--dragging-opacity, 0.8);
    transform: var(--dragging-transform, rotate(5deg));
    z-index: var(--z-dragging, 1000);
  }
}

.drop-zone {
  transition: all var(--drop-zone-transition-duration, 0.2s) var(--drop-zone-transition-easing, ease);
  border: 2px dashed transparent;
  border-radius: var(--drop-zone-border-radius, 8px);
  padding: var(--drop-zone-padding, 20px);

  &.drop-zone-active {
    border-color: var(--drop-zone-active-border, #007bff);
    background-color: var(--drop-zone-active-bg, rgba(0, 123, 255, 0.05));
  }

  &.drop-zone-invalid {
    border-color: var(--drop-zone-invalid-border, #dc3545);
    background-color: var(--drop-zone-invalid-bg, rgba(220, 53, 69, 0.05));
  }
}

// SELECTION STATES
.selectable {
  cursor: pointer;
  transition: all var(--selectable-transition-duration, 0.2s) var(--selectable-transition-easing, ease);
  border: var(--selectable-border-width, 2px) solid transparent;
  border-radius: var(--selectable-border-radius, 4px);

  &:hover {
    border-color: var(--selectable-hover-border, rgba(0, 123, 255, 0.5));
  }

  &.selected {
    border-color: var(--selectable-selected-border, #007bff);
    background-color: var(--selectable-selected-bg, rgba(0, 123, 255, 0.05));
  }

  &.selecting {
    opacity: var(--selecting-opacity, 0.7);
    transform: var(--selecting-transform, scale(0.98));
  }
}

// EXPANDABLE CONTENT
.expandable {
  overflow: hidden;
  transition: height var(--expandable-transition-duration, 0.3s) var(--expandable-transition-easing, ease);

  &.expanding {
    transition: height var(--expanding-transition-duration, 0.3s) var(--expanding-transition-easing, ease-out);
  }

  &.collapsing {
    transition: height var(--collapsing-transition-duration, 0.3s) var(--collapsing-transition-easing, ease-in);
  }
}

.expandable-trigger {
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: var(--expandable-trigger-gap, 8px);

  .expand-icon {
    transition: transform var(--expand-icon-transition-duration, 0.2s) var(--expand-icon-transition-easing, ease);
  }

  &.expanded .expand-icon {
    transform: var(--expand-icon-expanded-transform, rotate(180deg));
  }
}

// SORTABLE LISTS
.sortable {
  .sortable-item {
    cursor: move;
    user-select: none;
    transition: all var(--sortable-transition-duration, 0.2s) var(--sortable-transition-easing, ease);

    &.sortable-ghost {
      opacity: var(--sortable-ghost-opacity, 0.5);
      background: var(--sortable-ghost-bg, rgba(0, 123, 255, 0.1));
    }

    &.sortable-chosen {
      opacity: var(--sortable-chosen-opacity, 0.8);
      transform: var(--sortable-chosen-transform, scale(1.02));
    }
  }

  .sortable-handle {
    cursor: grab;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--sortable-handle-padding, 8px);
    opacity: var(--sortable-handle-opacity, 0.6);
    transition: opacity var(--sortable-handle-transition-duration, 0.2s);

    &:hover {
      opacity: 1;
    }

    &:active {
      cursor: grabbing;
    }
  }
}

// RIPPLE EFFECT
.ripple-effect {
  position: relative;
  overflow: hidden;

  &::before {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: 0;
    height: 0;
    border-radius: 50%;
    background: var(--ripple-color, rgba(255, 255, 255, 0.3));
    transform: translate(-50%, -50%);
    transition: width var(--ripple-duration, 0.6s), height var(--ripple-duration, 0.6s);
    pointer-events: none;
  }

  &.ripple-active::before {
    width: var(--ripple-size, 200px);
    height: var(--ripple-size, 200px);
  }
}

// FLOATING ELEMENTS
.floating {
  animation: floating var(--floating-duration, 3s) ease-in-out infinite;
}

@keyframes floating {
  0%, 100% { transform: translateY(0px); }
  50% { transform: translateY(var(--floating-distance, -10px)); }
}

.bob {
  animation: bob var(--bob-duration, 2s) ease-in-out infinite;
}

@keyframes bob {
  0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
  40% { transform: translateY(var(--bob-distance, -10px)); }
  60% { transform: translateY(var(--bob-distance-small, -5px)); }
}

// ACCESSIBILITY ENHANCEMENTS
@media (prefers-reduced-motion: reduce) {
  .hover-lift,
  .hover-scale,
  .hover-glow,
  .hover-fade,
  .hover-brighten,
  .hover-darken,
  .active-press,
  .active-sink,
  .expandable,
  .expandable-trigger .expand-icon,
  .sortable .sortable-item,
  .ripple-effect,
  .floating,
  .bob {
    transition: none;
    animation: none;
  }

  .loading::after {
    animation: none;
  }

  .loading-pulse,
  .loading-skeleton,
  .warning-pulse {
    animation: none;
  }
}

@media (prefers-contrast: high) {
  .focus-ring:focus,
  .focus-ring:focus-visible {
    outline-width: 3px;
  }

  .selectable {
    border-width: 3px;
  }

  .drop-zone {
    border-width: 3px;
  }
}zŹxy%// ==========================================================================
// LAYOUT PATTERNS
// ==========================================================================
// Common layout patterns and organizational structures
// Theme-agnostic layout behaviors
// ==========================================================================

// STACK LAYOUT PATTERN
.stack {
  display: flex;
  flex-direction: column;
  gap: var(--stack-gap, 16px);

  &.stack-sm {
    gap: var(--stack-gap-sm, 8px);
  }

  &.stack-lg {
    gap: var(--stack-gap-lg, 24px);
  }

  &.stack-xl {
    gap: var(--stack-gap-xl, 32px);
  }

  &.stack-horizontal {
    flex-direction: row;
    align-items: center;
  }

  &.stack-center {
    align-items: center;
  }

  &.stack-end {
    align-items: flex-end;
  }

  &.stack-stretch {
    align-items: stretch;
  }
}

// CLUSTER LAYOUT PATTERN (Flexbox wrap)
.cluster {
  display: flex;
  flex-wrap: wrap;
  gap: var(--cluster-gap, 16px);
  align-items: center;

  &.cluster-start {
    justify-content: flex-start;
  }

  &.cluster-center {
    justify-content: center;
  }

  &.cluster-end {
    justify-content: flex-end;
  }

  &.cluster-between {
    justify-content: space-between;
  }

  &.cluster-around {
    justify-content: space-around;
  }

  &.cluster-evenly {
    justify-content: space-evenly;
  }

  &.cluster-baseline {
    align-items: baseline;
  }

  &.cluster-stretch {
    align-items: stretch;
  }
}

// SIDEBAR LAYOUT PATTERN
.sidebar-layout {
  display: flex;
  gap: var(--sidebar-gap, 32px);
  align-items: flex-start;

  .sidebar {
    flex-shrink: 0;
    width: var(--sidebar-width, 250px);
    min-width: var(--sidebar-min-width, 200px);
  }

  .main-content {
    flex: 1;
    min-width: 0; // Prevents flex overflow
  }

  &.sidebar-right {
    flex-direction: row-reverse;
  }

  &.sidebar-sticky {
    .sidebar {
      position: sticky;
      top: var(--sidebar-sticky-top, 20px);
      align-self: flex-start;
    }
  }

  // Responsive behavior
  &.sidebar-collapse-md {
    @media (max-width: 768px) {
      flex-direction: column;
      gap: var(--sidebar-gap-mobile, 24px);

      .sidebar {
        width: 100%;
        position: static;
      }
    }
  }

  &.sidebar-collapse-lg {
    @media (max-width: 992px) {
      flex-direction: column;
      gap: var(--sidebar-gap-mobile, 24px);

      .sidebar {
        width: 100%;
        position: static;
      }
    }
  }
}

// SWITCHER LAYOUT PATTERN (Responsive stack/row)
.switcher {
  display: flex;
  flex-wrap: wrap;
  gap: var(--switcher-gap, 16px);

  > * {
    flex-grow: 1;
    flex-basis: calc((var(--switcher-threshold, 30rem) - 100%) * 999);
    min-width: var(--switcher-min-width, 250px);
  }

  &.switcher-no-grow > * {
    flex-grow: 0;
  }
}

// COVER LAYOUT PATTERN (Centered content)
.cover {
  display: flex;
  flex-direction: column;
  min-height: var(--cover-min-height, 100vh);
  padding: var(--cover-padding, 24px);

  > * {
    margin-top: var(--cover-spacing, 16px);
    margin-bottom: var(--cover-spacing, 16px);
  }

  > :first-child:not(.cover-centered) {
    margin-top: 0;
  }

  > :last-child:not(.cover-centered) {
    margin-bottom: 0;
  }

  .cover-centered {
    margin-top: auto;
    margin-bottom: auto;
  }
}

// IMPOSTER LAYOUT PATTERN (Absolute positioning)
.imposter {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);

  &.imposter-contain {
    max-width: calc(100% - var(--imposter-margin, 32px));
    max-height: calc(100% - var(--imposter-margin, 32px));
    overflow: auto;
  }

  &.imposter-fixed {
    position: fixed;
  }

  &.imposter-top {
    top: var(--imposter-offset, 20px);
    transform: translate(-50%, 0);
  }

  &.imposter-bottom {
    top: auto;
    bottom: var(--imposter-offset, 20px);
    transform: translate(-50%, 0);
  }

  &.imposter-left {
    left: var(--imposter-offset, 20px);
    transform: translate(0, -50%);
  }

  &.imposter-right {
    left: auto;
    right: var(--imposter-offset, 20px);
    transform: translate(0, -50%);
  }
}

// GRID LAYOUT PATTERNS
.auto-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(var(--auto-grid-min-width, 250px), 1fr));
  gap: var(--auto-grid-gap, 24px);

  &.auto-grid-fill {
    grid-template-columns: repeat(auto-fill, minmax(var(--auto-grid-min-width, 250px), 1fr));
  }

  &.auto-grid-dense {
    grid-auto-flow: dense;
  }
}

.reel {
  display: flex;
  overflow-x: auto;
  gap: var(--reel-gap, 16px);
  padding-bottom: var(--reel-scrollbar-space, 8px);

  > * {
    flex-shrink: 0;
    width: var(--reel-item-width, 250px);
  }

  &.reel-auto-width > * {
    width: auto;
    min-width: var(--reel-min-width, 200px);
  }

  // Snap scrolling
  &.reel-snap {
    scroll-snap-type: x mandatory;

    > * {
      scroll-snap-align: start;
    }
  }

  // Hide scrollbar
  &.reel-no-scrollbar {
    scrollbar-width: none;
    -ms-overflow-style: none;

    &::-webkit-scrollbar {
      display: none;
    }
  }
}

// HOLY GRAIL LAYOUT
.holy-grail {
  display: grid;
  grid-template-areas:
    "header header header"
    "nav main aside"
    "footer footer footer";
  grid-template-rows: auto 1fr auto;
  grid-template-columns: var(--nav-width, 200px) 1fr var(--aside-width, 200px);
  min-height: 100vh;
  gap: var(--holy-grail-gap, 0);

  .header {
    grid-area: header;
  }

  .nav {
    grid-area: nav;
  }

  .main {
    grid-area: main;
    min-width: 0;
  }

  .aside {
    grid-area: aside;
  }

  .footer {
    grid-area: footer;
  }

  // Responsive collapse
  @media (max-width: 768px) {
    grid-template-areas:
      "header"
      "nav"
      "main"
      "aside"
      "footer";
    grid-template-columns: 1fr;
    grid-template-rows: auto auto 1fr auto auto;
  }
}

// PANCAKE STACK LAYOUT (Header, flexible content, footer)
.pancake-stack {
  display: grid;
  grid-template-rows: auto 1fr auto;
  min-height: var(--pancake-min-height, 100vh);

  .header {
    /* Header content */
  }

  .main {
    /* Main content - grows to fill space */
  }

  .footer {
    /* Footer content */
  }
}

// MASONRY LAYOUT
.masonry {
  columns: var(--masonry-columns, 3);
  column-gap: var(--masonry-gap, 24px);

  > * {
    break-inside: avoid;
    margin-bottom: var(--masonry-gap, 24px);
  }

  &.masonry-2 {
    columns: 2;
  }

  &.masonry-4 {
    columns: 4;
  }

  &.masonry-5 {
    columns: 5;
  }

  // Responsive columns
  @media (max-width: 768px) {
    columns: 1;
  }

  @media (min-width: 769px) and (max-width: 1024px) {
    columns: 2;
  }
}

// FLEX EQUAL HEIGHT PATTERN
.equal-height {
  display: flex;
  
  > * {
    flex: 1;
    display: flex;
    flex-direction: column;
  }

  &.equal-height-baseline {
    align-items: baseline;
  }

  &.equal-height-center {
    align-items: center;
  }

  &.equal-height-end {
    align-items: flex-end;
  }
}

// STICKY FOOTER PATTERN
.sticky-footer {
  display: flex;
  flex-direction: column;
  min-height: 100vh;

  .content {
    flex: 1;
  }

  .footer {
    margin-top: auto;
  }
}

// ASPECT RATIO CONTAINERS
.aspect-ratio {
  position: relative;
  width: 100%;

  &::before {
    content: '';
    display: block;
    padding-top: var(--aspect-ratio, 56.25%); /* 16:9 default */
  }

  > * {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  &.aspect-1-1 {
    --aspect-ratio: 100%; /* 1:1 */
  }

  &.aspect-4-3 {
    --aspect-ratio: 75%; /* 4:3 */
  }

  &.aspect-3-2 {
    --aspect-ratio: 66.67%; /* 3:2 */
  }

  &.aspect-16-9 {
    --aspect-ratio: 56.25%; /* 16:9 */
  }

  &.aspect-21-9 {
    --aspect-ratio: 42.86%; /* 21:9 */
  }
}

// INTRINSIC RATIO (modern aspect-ratio support)
@supports (aspect-ratio: 16 / 9) {
  .intrinsic-ratio {
    aspect-ratio: var(--intrinsic-ratio, 16 / 9);
    
    &.intrinsic-1-1 {
      aspect-ratio: 1 / 1;
    }

    &.intrinsic-4-3 {
      aspect-ratio: 4 / 3;
    }

    &.intrinsic-3-2 {
      aspect-ratio: 3 / 2;
    }

    &.intrinsic-16-9 {
      aspect-ratio: 16 / 9;
    }

    &.intrinsic-21-9 {
      aspect-ratio: 21 / 9;
    }
  }
}

// QUANTITY QUERIES (Layout based on number of items)
.quantity-query {
  display: flex;
  flex-wrap: wrap;
  gap: var(--quantity-gap, 16px);

  /* Single item - full width */
  &:has(> :nth-child(1):nth-last-child(1)) > * {
    flex-basis: 100%;
  }

  /* Two items - 50% each */
  &:has(> :nth-child(2):nth-last-child(1)) > * {
    flex-basis: calc(50% - var(--quantity-gap, 16px) / 2);
  }

  /* Three items - 33% each */
  &:has(> :nth-child(3):nth-last-child(1)) > * {
    flex-basis: calc(33.333% - var(--quantity-gap, 16px) * 2 / 3);
  }

  /* Four or more items - 25% each */
  &:has(> :nth-child(4)) > * {
    flex-basis: calc(25% - var(--quantity-gap, 16px) * 3 / 4);
  }
}

// RESPONSIVE UTILITIES FOR PATTERNS
@media (max-width: 576px) {
  .stack-horizontal-mobile {
    flex-direction: row;
    align-items: center;
  }

  .stack-vertical-mobile {
    flex-direction: column;
    align-items: stretch;
  }

  .cluster-stack-mobile {
    flex-direction: column;
    align-items: stretch;
  }
}

@media (max-width: 768px) {
  .equal-height {
    flex-direction: column;
  }

  .switcher {
    flex-direction: column;
  }
}

// ACCESSIBILITY IMPROVEMENTS
@media (prefers-reduced-motion: reduce) {
  .sticky-footer,
  .cover,
  .imposter {
    transition: none;
  }
}

// PRINT OPTIMIZATIONS
@media print {
  .reel {
    display: block;
    overflow: visible;
  }

  .masonry {
    columns: 1;
  }

  .holy-grail {
    display: block;
  }
}6Ŷx0// ==========================================================================
// DISPLAY UTILITIES
// ==========================================================================
// Utility classes for display, visibility, and text formatting
// Theme-agnostic display and layout helpers
// ==========================================================================

// TEXT ALIGNMENT
.text-left { text-align: left !important; }
.text-right { text-align: right !important; }
.text-center { text-align: center !important; }
.text-justify { text-align: justify !important; }
.text-start { text-align: left !important; }
.text-end { text-align: right !important; }

// Responsive text alignment - Using base breakpoint tokens
@media (max-width: #{$base-breakpoint-xs - 1px}) {
  .text-xs-left { text-align: left !important; }
  .text-xs-right { text-align: right !important; }
  .text-xs-center { text-align: center !important; }
  .text-xs-start { text-align: left !important; }
  .text-xs-end { text-align: right !important; }
}

@media (min-width: #{$base-breakpoint-sm}) {
  .text-sm-left { text-align: left !important; }
  .text-sm-right { text-align: right !important; }
  .text-sm-center { text-align: center !important; }
  .text-sm-start { text-align: left !important; }
  .text-sm-end { text-align: right !important; }
}

@media (min-width: #{$base-breakpoint-md}) {
  .text-md-left { text-align: left !important; }
  .text-md-right { text-align: right !important; }
  .text-md-center { text-align: center !important; }
  .text-md-start { text-align: left !important; }
  .text-md-end { text-align: right !important; }
}

@media (min-width: #{$base-breakpoint-lg}) {
  .text-lg-left { text-align: left !important; }
  .text-lg-right { text-align: right !important; }
  .text-lg-center { text-align: center !important; }
  .text-lg-start { text-align: left !important; }
  .text-lg-end { text-align: right !important; }
}

// TEXT TRANSFORM
.text-lowercase { text-transform: lowercase !important; }
.text-uppercase { text-transform: uppercase !important; }
.text-capitalize { text-transform: capitalize !important; }
.text-normal-case { text-transform: none !important; }

// FONT WEIGHT
.fw-light { font-weight: 300 !important; }
.fw-lighter { font-weight: lighter !important; }
.fw-normal { font-weight: 400 !important; }
.fw-medium { font-weight: 500 !important; }
.fw-semibold { font-weight: 600 !important; }
.fw-bold { font-weight: 700 !important; }
.fw-bolder { font-weight: bolder !important; }

// FONT STYLE
.fst-italic { font-style: italic !important; }
.fst-normal { font-style: normal !important; }

// TEXT DECORATION
.text-decoration-none { text-decoration: none !important; }
.text-decoration-underline { text-decoration: underline !important; }
.text-decoration-line-through { text-decoration: line-through !important; }

// LINE HEIGHT
.lh-1 { line-height: 1 !important; }
.lh-sm { line-height: 1.25 !important; }
.lh-base { line-height: 1.5 !important; }
.lh-lg { line-height: 2 !important; }

// TEXT WRAP
.text-wrap { white-space: normal !important; }
.text-nowrap { white-space: nowrap !important; }
.text-pre { white-space: pre !important; }
.text-pre-line { white-space: pre-line !important; }
.text-pre-wrap { white-space: pre-wrap !important; }

// TEXT OVERFLOW
.text-truncate {
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  white-space: nowrap !important;
}

.text-break {
  word-wrap: break-word !important;
  word-break: break-word !important;
}

// WORD BREAK
.text-break-all { word-break: break-all !important; }
.text-break-keep { word-break: keep-all !important; }

// VERTICAL ALIGNMENT
.align-baseline { vertical-align: baseline !important; }
.align-top { vertical-align: top !important; }
.align-middle { vertical-align: middle !important; }
.align-bottom { vertical-align: bottom !important; }
.align-text-bottom { vertical-align: text-bottom !important; }
.align-text-top { vertical-align: text-top !important; }

// LIST STYLES
.list-unstyled {
  padding-left: 0 !important;
  list-style: none !important;
}

.list-inline {
  padding-left: 0 !important;
  list-style: none !important;

  .list-inline-item {
    display: inline-block !important;

    &:not(:last-child) {
      margin-right: var(--list-inline-gap, 8px) !important;
    }
  }
}

// OPACITY
.opacity-0 { opacity: 0 !important; }
.opacity-25 { opacity: 0.25 !important; }
.opacity-50 { opacity: 0.5 !important; }
.opacity-75 { opacity: 0.75 !important; }
.opacity-100 { opacity: 1 !important; }

// BORDERS
.border { border: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; }
.border-0 { border: 0 !important; }
.border-top { border-top: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; }
.border-top-0 { border-top: 0 !important; }
.border-end { border-right: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; }
.border-end-0 { border-right: 0 !important; }
.border-bottom { border-bottom: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; }
.border-bottom-0 { border-bottom: 0 !important; }
.border-start { border-left: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; }
.border-start-0 { border-left: 0 !important; }

// BORDER RADIUS - Using base border radius tokens
.rounded { border-radius: var(--border-radius, #{$base-border-radius-md}) !important; }
.rounded-0 { border-radius: #{$base-border-radius-none} !important; }
.rounded-1 { border-radius: var(--border-radius-sm, #{$base-border-radius-sm}) !important; }
.rounded-2 { border-radius: var(--border-radius, #{$base-border-radius-md}) !important; }
.rounded-3 { border-radius: var(--border-radius-lg, #{$base-border-radius-lg}) !important; }
.rounded-4 { border-radius: var(--border-radius-xl, #{$base-border-radius-xl}) !important; }
.rounded-5 { border-radius: var(--border-radius-xxl, #{$base-border-radius-2xl}) !important; }
.rounded-circle { border-radius: #{$base-border-radius-full} !important; }
.rounded-pill { border-radius: var(--rounded-pill, #{$base-border-radius-pill}) !important; }

// Individual border radius
.rounded-top { border-top-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; border-top-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; }
.rounded-end { border-top-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; border-bottom-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; }
.rounded-bottom { border-bottom-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; border-bottom-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; }
.rounded-start { border-bottom-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; border-top-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; }

.rounded-top-start { border-top-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; }
.rounded-top-end { border-top-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; }
.rounded-bottom-end { border-bottom-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; }
.rounded-bottom-start { border-bottom-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; }

// WIDTH AND HEIGHT
.w-25 { width: 25% !important; }
.w-50 { width: 50% !important; }
.w-75 { width: 75% !important; }
.w-100 { width: 100% !important; }
.w-auto { width: auto !important; }

.mw-100 { max-width: 100% !important; }
.mw-75 { max-width: 75% !important; }
.mw-50 { max-width: 50% !important; }
.mw-25 { max-width: 25% !important; }

.h-25 { height: 25% !important; }
.h-50 { height: 50% !important; }
.h-75 { height: 75% !important; }
.h-100 { height: 100% !important; }
.h-auto { height: auto !important; }

.mh-100 { max-height: 100% !important; }
.mh-75 { max-height: 75% !important; }
.mh-50 { max-height: 50% !important; }
.mh-25 { max-height: 25% !important; }

// Min width/height
.min-w-0 { min-width: 0 !important; }
.min-w-100 { min-width: 100% !important; }
.min-h-0 { min-height: 0 !important; }
.min-h-100 { min-height: 100% !important; }

// Viewport dimensions
.vw-100 { width: 100vw !important; }
.min-vw-100 { min-width: 100vw !important; }

.vh-100 { height: 100vh !important; }
.min-vh-100 { min-height: 100vh !important; }

// SHADOWS - Using base shadow tokens
.shadow-none { box-shadow: #{$base-shadow-none} !important; }
.shadow-sm { box-shadow: var(--shadow-sm, #{$base-shadow-sm}) !important; }
.shadow { box-shadow: var(--shadow, #{$base-shadow-md}) !important; }
.shadow-md { box-shadow: var(--shadow-md, #{$base-shadow-lg}) !important; }
.shadow-lg { box-shadow: var(--shadow-lg, #{$base-shadow-xl}) !important; }
.shadow-xl { box-shadow: var(--shadow-xl, #{$base-shadow-2xl}) !important; }

// FOCUS UTILITIES
.focus\:outline-none:focus {
  outline: 2px solid transparent !important;
  outline-offset: 2px !important;
}

.focus\:ring:focus {
  outline: 2px solid transparent !important;
  outline-offset: 2px !important;
  box-shadow: var(--focus-ring-shadow, 0 0 0 3px rgba(59, 130, 246, 0.5)) !important;
}

.focus\:ring-2:focus {
  outline: 2px solid transparent !important;
  outline-offset: 2px !important;
  box-shadow: var(--focus-ring-shadow, 0 0 0 2px rgba(59, 130, 246, 0.5)) !important;
}

.focus\:ring-4:focus {
  outline: 2px solid transparent !important;
  outline-offset: 2px !important;
  box-shadow: var(--focus-ring-shadow, 0 0 0 4px rgba(59, 130, 246, 0.5)) !important;
}

// SCREEN READER ONLY
.sr-only {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

.sr-only-focusable:focus {
  position: static !important;
  width: auto !important;
  height: auto !important;
  padding: inherit !important;
  margin: inherit !important;
  overflow: visible !important;
  clip: auto !important;
  white-space: normal !important;
}

// PRINT UTILITIES
@media print {
  .d-print-none { display: none !important; }
  .d-print-inline { display: inline !important; }
  .d-print-inline-block { display: inline-block !important; }
  .d-print-block { display: block !important; }
  .d-print-flex { display: flex !important; }
  .d-print-inline-flex { display: inline-flex !important; }
  .d-print-grid { display: grid !important; }
  .d-print-table { display: table !important; }
  .d-print-table-row { display: table-row !important; }
  .d-print-table-cell { display: table-cell !important; }
}

// IMAGE UTILITIES
.img-fluid {
  max-width: 100% !important;
  height: auto !important;
}

.img-thumbnail {
  padding: var(--img-thumbnail-padding, 4px) !important;
  background-color: var(--img-thumbnail-bg, white) !important;
  border: var(--img-thumbnail-border-width, 1px) solid var(--img-thumbnail-border-color, #dee2e6) !important;
  border-radius: var(--img-thumbnail-border-radius, 6px) !important;
  max-width: 100% !important;
  height: auto !important;
}

// FIGURE
.figure {
  display: inline-block !important;

  .figure-img {
    margin-bottom: var(--figure-caption-margin-top, 8px) !important;
    line-height: 1 !important;
  }

  .figure-caption {
    font-size: var(--figure-caption-font-size, 0.875em) !important;
    color: var(--figure-caption-color, rgba(0, 0, 0, 0.6)) !important;
  }
}

// TABLE UTILITIES
.table-responsive {
  overflow-x: auto !important;

  .table {
    margin-bottom: 0 !important;
  }
}

@media (max-width: #{$base-breakpoint-xs - 1px}) {
  .table-responsive-sm {
    overflow-x: auto !important;
  }
}

@media (max-width: #{$base-breakpoint-md - 1px}) {
  .table-responsive-md {
    overflow-x: auto !important;
  }
}

@media (max-width: #{$base-breakpoint-lg - 1px}) {
  .table-responsive-lg {
    overflow-x: auto !important;
  }
}

@media (max-width: #{$base-breakpoint-xl - 1px}) {
  .table-responsive-xl {
    overflow-x: auto !important;
  }
}

// STRETCHED LINK
.stretched-link::after {
  position: absolute !important;
  top: 0 !important;
  right: 0 !important;
  bottom: 0 !important;
  left: 0 !important;
  z-index: 1 !important;
  content: "" !important;
}=&绔xKA// ==========================================================================
// LAYOUT UTILITIES
// ==========================================================================
// Utility classes for common layout needs
// Theme-agnostic layout helpers
// ==========================================================================

// DISPLAY UTILITIES
.d-none { display: none !important; }
.d-inline { display: inline !important; }
.d-inline-block { display: inline-block !important; }
.d-block { display: block !important; }
.d-flex { display: flex !important; }
.d-inline-flex { display: inline-flex !important; }
.d-grid { display: grid !important; }
.d-inline-grid { display: inline-grid !important; }
.d-table { display: table !important; }
.d-table-cell { display: table-cell !important; }

// RESPONSIVE DISPLAY UTILITIES - Using base breakpoint tokens
@media (max-width: #{$base-breakpoint-xs - 1px}) {
  .d-xs-none { display: none !important; }
  .d-xs-inline { display: inline !important; }
  .d-xs-inline-block { display: inline-block !important; }
  .d-xs-block { display: block !important; }
  .d-xs-flex { display: flex !important; }
  .d-xs-inline-flex { display: inline-flex !important; }
  .d-xs-grid { display: grid !important; }
  .d-xs-inline-grid { display: inline-grid !important; }
}

@media (min-width: #{$base-breakpoint-sm}) {
  .d-sm-none { display: none !important; }
  .d-sm-inline { display: inline !important; }
  .d-sm-inline-block { display: inline-block !important; }
  .d-sm-block { display: block !important; }
  .d-sm-flex { display: flex !important; }
  .d-sm-inline-flex { display: inline-flex !important; }
  .d-sm-grid { display: grid !important; }
  .d-sm-inline-grid { display: inline-grid !important; }
}

@media (min-width: #{$base-breakpoint-md}) {
  .d-md-none { display: none !important; }
  .d-md-inline { display: inline !important; }
  .d-md-inline-block { display: inline-block !important; }
  .d-md-block { display: block !important; }
  .d-md-flex { display: flex !important; }
  .d-md-inline-flex { display: inline-flex !important; }
  .d-md-grid { display: grid !important; }
  .d-md-inline-grid { display: inline-grid !important; }
}

@media (min-width: #{$base-breakpoint-lg}) {
  .d-lg-none { display: none !important; }
  .d-lg-inline { display: inline !important; }
  .d-lg-inline-block { display: inline-block !important; }
  .d-lg-block { display: block !important; }
  .d-lg-flex { display: flex !important; }
  .d-lg-inline-flex { display: inline-flex !important; }
  .d-lg-grid { display: grid !important; }
  .d-lg-inline-grid { display: inline-grid !important; }
}

@media (min-width: #{$base-breakpoint-xl}) {
  .d-xl-none { display: none !important; }
  .d-xl-inline { display: inline !important; }
  .d-xl-inline-block { display: inline-block !important; }
  .d-xl-block { display: block !important; }
  .d-xl-flex { display: flex !important; }
  .d-xl-inline-flex { display: inline-flex !important; }
  .d-xl-grid { display: grid !important; }
  .d-xl-inline-grid { display: inline-grid !important; }
}

// POSITION UTILITIES
.position-static { position: static !important; }
.position-relative { position: relative !important; }
.position-absolute { position: absolute !important; }
.position-fixed { position: fixed !important; }
.position-sticky { position: sticky !important; }

// POSITIONING
.top-0 { top: 0 !important; }
.top-50 { top: 50% !important; }
.top-100 { top: 100% !important; }
.bottom-0 { bottom: 0 !important; }
.bottom-50 { bottom: 50% !important; }
.bottom-100 { bottom: 100% !important; }
.start-0 { left: 0 !important; }
.start-50 { left: 50% !important; }
.start-100 { left: 100% !important; }
.end-0 { right: 0 !important; }
.end-50 { right: 50% !important; }
.end-100 { right: 100% !important; }

// TRANSLATE UTILITIES
.translate-middle { transform: translate(-50%, -50%) !important; }
.translate-middle-x { transform: translateX(-50%) !important; }
.translate-middle-y { transform: translateY(-50%) !important; }

// OVERFLOW UTILITIES
.overflow-auto { overflow: auto !important; }
.overflow-hidden { overflow: hidden !important; }
.overflow-visible { overflow: visible !important; }
.overflow-scroll { overflow: scroll !important; }
.overflow-x-auto { overflow-x: auto !important; }
.overflow-x-hidden { overflow-x: hidden !important; }
.overflow-x-visible { overflow-x: visible !important; }
.overflow-x-scroll { overflow-x: scroll !important; }
.overflow-y-auto { overflow-y: auto !important; }
.overflow-y-hidden { overflow-y: hidden !important; }
.overflow-y-visible { overflow-y: visible !important; }
.overflow-y-scroll { overflow-y: scroll !important; }

// Z-INDEX UTILITIES
.z-n1 { z-index: -1 !important; }
.z-0 { z-index: 0 !important; }
.z-1 { z-index: 1 !important; }
.z-2 { z-index: 2 !important; }
.z-3 { z-index: 3 !important; }
.z-10 { z-index: 10 !important; }
.z-20 { z-index: 20 !important; }
.z-30 { z-index: 30 !important; }
.z-40 { z-index: 40 !important; }
.z-50 { z-index: 50 !important; }
.z-100 { z-index: 100 !important; }
.z-1000 { z-index: 1000 !important; }
.z-1010 { z-index: 1010 !important; }
.z-1020 { z-index: 1020 !important; }
.z-1030 { z-index: 1030 !important; }
.z-1040 { z-index: 1040 !important; }
.z-1050 { z-index: 1050 !important; }
.z-1060 { z-index: 1060 !important; }
.z-1070 { z-index: 1070 !important; }

// FLEXBOX UTILITIES
// Direction
.flex-row { flex-direction: row !important; }
.flex-column { flex-direction: column !important; }
.flex-row-reverse { flex-direction: row-reverse !important; }
.flex-column-reverse { flex-direction: column-reverse !important; }

// Responsive flex direction
@media (max-width: 575px) {
  .flex-xs-row { flex-direction: row !important; }
  .flex-xs-column { flex-direction: column !important; }
  .flex-xs-row-reverse { flex-direction: row-reverse !important; }
  .flex-xs-column-reverse { flex-direction: column-reverse !important; }
}

@media (min-width: 576px) {
  .flex-sm-row { flex-direction: row !important; }
  .flex-sm-column { flex-direction: column !important; }
  .flex-sm-row-reverse { flex-direction: row-reverse !important; }
  .flex-sm-column-reverse { flex-direction: column-reverse !important; }
}

@media (min-width: 768px) {
  .flex-md-row { flex-direction: row !important; }
  .flex-md-column { flex-direction: column !important; }
  .flex-md-row-reverse { flex-direction: row-reverse !important; }
  .flex-md-column-reverse { flex-direction: column-reverse !important; }
}

// Wrap
.flex-wrap { flex-wrap: wrap !important; }
.flex-nowrap { flex-wrap: nowrap !important; }
.flex-wrap-reverse { flex-wrap: wrap-reverse !important; }

// Justify content
.justify-content-start { justify-content: flex-start !important; }
.justify-content-end { justify-content: flex-end !important; }
.justify-content-center { justify-content: center !important; }
.justify-content-between { justify-content: space-between !important; }
.justify-content-around { justify-content: space-around !important; }
.justify-content-evenly { justify-content: space-evenly !important; }

// Align items
.align-items-start { align-items: flex-start !important; }
.align-items-end { align-items: flex-end !important; }
.align-items-center { align-items: center !important; }
.align-items-baseline { align-items: baseline !important; }
.align-items-stretch { align-items: stretch !important; }

// Align content
.align-content-start { align-content: flex-start !important; }
.align-content-end { align-content: flex-end !important; }
.align-content-center { align-content: center !important; }
.align-content-between { align-content: space-between !important; }
.align-content-around { align-content: space-around !important; }
.align-content-stretch { align-content: stretch !important; }

// Align self
.align-self-auto { align-self: auto !important; }
.align-self-start { align-self: flex-start !important; }
.align-self-end { align-self: flex-end !important; }
.align-self-center { align-self: center !important; }
.align-self-baseline { align-self: baseline !important; }
.align-self-stretch { align-self: stretch !important; }

// Flex grow/shrink
.flex-fill { flex: 1 1 auto !important; }
.flex-grow-0 { flex-grow: 0 !important; }
.flex-grow-1 { flex-grow: 1 !important; }
.flex-shrink-0 { flex-shrink: 0 !important; }
.flex-shrink-1 { flex-shrink: 1 !important; }

// ORDER
.order-first { order: -1 !important; }
.order-0 { order: 0 !important; }
.order-1 { order: 1 !important; }
.order-2 { order: 2 !important; }
.order-3 { order: 3 !important; }
.order-4 { order: 4 !important; }
.order-5 { order: 5 !important; }
.order-last { order: 6 !important; }

// GRID UTILITIES
.grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; }
.grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
.grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; }
.grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; }
.grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; }
.grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; }
.grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; }

.grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; }
.grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; }
.grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; }
.grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; }
.grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; }
.grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; }

// Grid column spans
.col-span-1 { grid-column: span 1 / span 1 !important; }
.col-span-2 { grid-column: span 2 / span 2 !important; }
.col-span-3 { grid-column: span 3 / span 3 !important; }
.col-span-4 { grid-column: span 4 / span 4 !important; }
.col-span-5 { grid-column: span 5 / span 5 !important; }
.col-span-6 { grid-column: span 6 / span 6 !important; }
.col-span-full { grid-column: 1 / -1 !important; }

// Grid row spans
.row-span-1 { grid-row: span 1 / span 1 !important; }
.row-span-2 { grid-row: span 2 / span 2 !important; }
.row-span-3 { grid-row: span 3 / span 3 !important; }
.row-span-4 { grid-row: span 4 / span 4 !important; }
.row-span-5 { grid-row: span 5 / span 5 !important; }
.row-span-6 { grid-row: span 6 / span 6 !important; }
.row-span-full { grid-row: 1 / -1 !important; }

// Grid column start/end
.col-start-1 { grid-column-start: 1 !important; }
.col-start-2 { grid-column-start: 2 !important; }
.col-start-3 { grid-column-start: 3 !important; }
.col-start-4 { grid-column-start: 4 !important; }
.col-start-5 { grid-column-start: 5 !important; }
.col-start-6 { grid-column-start: 6 !important; }
.col-start-auto { grid-column-start: auto !important; }

.col-end-1 { grid-column-end: 1 !important; }
.col-end-2 { grid-column-end: 2 !important; }
.col-end-3 { grid-column-end: 3 !important; }
.col-end-4 { grid-column-end: 4 !important; }
.col-end-5 { grid-column-end: 5 !important; }
.col-end-6 { grid-column-end: 6 !important; }
.col-end-auto { grid-column-end: auto !important; }

// Grid row start/end
.row-start-1 { grid-row-start: 1 !important; }
.row-start-2 { grid-row-start: 2 !important; }
.row-start-3 { grid-row-start: 3 !important; }
.row-start-4 { grid-row-start: 4 !important; }
.row-start-5 { grid-row-start: 5 !important; }
.row-start-6 { grid-row-start: 6 !important; }
.row-start-auto { grid-row-start: auto !important; }

.row-end-1 { grid-row-end: 1 !important; }
.row-end-2 { grid-row-end: 2 !important; }
.row-end-3 { grid-row-end: 3 !important; }
.row-end-4 { grid-row-end: 4 !important; }
.row-end-5 { grid-row-end: 5 !important; }
.row-end-6 { grid-row-end: 6 !important; }
.row-end-auto { grid-row-end: auto !important; }

// Grid auto flow
.grid-flow-row { grid-auto-flow: row !important; }
.grid-flow-col { grid-auto-flow: column !important; }
.grid-flow-dense { grid-auto-flow: dense !important; }
.grid-flow-row-dense { grid-auto-flow: row dense !important; }
.grid-flow-col-dense { grid-auto-flow: column dense !important; }

// FLOAT UTILITIES
.float-start { float: left !important; }
.float-end { float: right !important; }
.float-none { float: none !important; }

// CLEAR UTILITIES
.clearfix::after {
  display: block;
  clear: both;
  content: "";
}

// OBJECT FIT UTILITIES
.object-contain { object-fit: contain !important; }
.object-cover { object-fit: cover !important; }
.object-fill { object-fit: fill !important; }
.object-scale { object-fit: scale-down !important; }
.object-none { object-fit: none !important; }

// OBJECT POSITION UTILITIES
.object-top { object-position: top !important; }
.object-bottom { object-position: bottom !important; }
.object-center { object-position: center !important; }
.object-left { object-position: left !important; }
.object-left-bottom { object-position: left bottom !important; }
.object-left-top { object-position: left top !important; }
.object-right { object-position: right !important; }
.object-right-bottom { object-position: right bottom !important; }
.object-right-top { object-position: right top !important; }

// VISIBILITY UTILITIES
.visible { visibility: visible !important; }
.invisible { visibility: hidden !important; }

// INTERACTION UTILITIES
.user-select-all { user-select: all !important; }
.user-select-auto { user-select: auto !important; }
.user-select-none { user-select: none !important; }

.pointer-events-none { pointer-events: none !important; }
.pointer-events-auto { pointer-events: auto !important; }

// CURSOR UTILITIES
.cursor-auto { cursor: auto !important; }
.cursor-default { cursor: default !important; }
.cursor-pointer { cursor: pointer !important; }
.cursor-wait { cursor: wait !important; }
.cursor-text { cursor: text !important; }
.cursor-move { cursor: move !important; }
.cursor-help { cursor: help !important; }
.cursor-not-allowed { cursor: not-allowed !important; }
.cursor-grab { cursor: grab !important; }
.cursor-grabbing { cursor: grabbing !important; }

// RESIZE UTILITIES
.resize-none { resize: none !important; }
.resize-y { resize: vertical !important; }
.resize-x { resize: horizontal !important; }
.resize { resize: both !important; }

// BOX SIZING UTILITIES
.box-border { box-sizing: border-box !important; }
.box-content { box-sizing: content-box !important; }

// ASPECT RATIO UTILITIES (Modern)
@supports (aspect-ratio: 1 / 1) {
  .aspect-auto { aspect-ratio: auto !important; }
  .aspect-square { aspect-ratio: 1 / 1 !important; }
  .aspect-video { aspect-ratio: 16 / 9 !important; }
  .aspect-4-3 { aspect-ratio: 4 / 3 !important; }
  .aspect-3-2 { aspect-ratio: 3 / 2 !important; }
  .aspect-21-9 { aspect-ratio: 21 / 9 !important; }
}

// CLIP PATH UTILITIES
.clip-ellipse { clip-path: ellipse(50% 50% at 50% 50%) !important; }
.clip-circle { clip-path: circle(50% at 50% 50%) !important; }
.clip-triangle { clip-path: polygon(50% 0%, 0% 100%, 100% 100%) !important; }
.clip-none { clip-path: none !important; }

// TRANSFORM UTILITIES
.transform { transform: var(--tw-transform) !important; }
.transform-none { transform: none !important; }

.rotate-0 { --tw-rotate: 0deg; transform: rotate(var(--tw-rotate)) !important; }
.rotate-45 { --tw-rotate: 45deg; transform: rotate(var(--tw-rotate)) !important; }
.rotate-90 { --tw-rotate: 90deg; transform: rotate(var(--tw-rotate)) !important; }
.rotate-180 { --tw-rotate: 180deg; transform: rotate(var(--tw-rotate)) !important; }

.scale-0 { --tw-scale-x: 0; --tw-scale-y: 0; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-50 { --tw-scale-x: 0.5; --tw-scale-y: 0.5; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-75 { --tw-scale-x: 0.75; --tw-scale-y: 0.75; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-90 { --tw-scale-x: 0.9; --tw-scale-y: 0.9; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-95 { --tw-scale-x: 0.95; --tw-scale-y: 0.95; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-100 { --tw-scale-x: 1; --tw-scale-y: 1; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-105 { --tw-scale-x: 1.05; --tw-scale-y: 1.05; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-110 { --tw-scale-x: 1.1; --tw-scale-y: 1.1; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-125 { --tw-scale-x: 1.25; --tw-scale-y: 1.25; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }
.scale-150 { --tw-scale-x: 1.5; --tw-scale-y: 1.5; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; }3 Ҵx#// ==========================================================================
// SCROLLBAR UTILITIES
// ==========================================================================
// Scrollbar styling utilities with visibility options
// Theme-agnostic scrollbar controls
// ==========================================================================

// SCROLLBAR VISIBILITY OPTIONS
.scrollbar-visible {
  scrollbar-width: thin;
  scrollbar-color: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)) var(--scrollbar-track, transparent);

  // Webkit scrollbar styling (Chrome, Safari, Edge)
  &::-webkit-scrollbar {
    width: #{$base-spacing-2}; // 8px
    height: #{$base-spacing-2};
  }

  &::-webkit-scrollbar-track {
    background: var(--scrollbar-track, transparent);
    border-radius: #{$base-border-radius-sm};
  }

  &::-webkit-scrollbar-thumb {
    background: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2));
    border-radius: #{$base-border-radius-sm};
    border: 1px solid var(--scrollbar-thumb-border, transparent);

    &:hover {
      background: var(--scrollbar-thumb-hover, rgba(0, 0, 0, 0.3));
    }

    &:active {
      background: var(--scrollbar-thumb-active, rgba(0, 0, 0, 0.4));
    }
  }

  &::-webkit-scrollbar-corner {
    background: var(--scrollbar-corner, transparent);
  }
}

.scrollbar-invisible {
  // Firefox
  scrollbar-width: none;
  
  // Internet Explorer and Edge
  -ms-overflow-style: none;

  // Webkit browsers (Chrome, Safari, newer Edge)
  &::-webkit-scrollbar {
    display: none;
    width: 0;
    height: 0;
  }
}

// SCROLLBAR SIZING OPTIONS
.scrollbar-thin {
  scrollbar-width: thin;
  
  &::-webkit-scrollbar {
    width: #{$base-spacing-1}; // 4px
    height: #{$base-spacing-1};
  }
}

.scrollbar-thick {
  scrollbar-width: auto;
  
  &::-webkit-scrollbar {
    width: #{$base-spacing-3}; // 12px
    height: #{$base-spacing-3};
  }
}

// SCROLLBAR BEHAVIOR OPTIONS
.scroll-smooth {
  scroll-behavior: smooth;
}

.scroll-auto {
  scroll-behavior: auto;
}

// OVERFLOW UTILITIES WITH SCROLLBAR CONTROL
.overflow-auto-visible {
  overflow: auto;
  @extend .scrollbar-visible;
}

.overflow-auto-invisible {
  overflow: auto;
  @extend .scrollbar-invisible;
}

.overflow-scroll-visible {
  overflow: scroll;
  @extend .scrollbar-visible;
}

.overflow-scroll-invisible {
  overflow: scroll;
  @extend .scrollbar-invisible;
}

.overflow-y-auto-visible {
  overflow-y: auto;
  overflow-x: hidden;
  @extend .scrollbar-visible;
}

.overflow-y-auto-invisible {
  overflow-y: auto;
  overflow-x: hidden;
  @extend .scrollbar-invisible;
}

.overflow-x-auto-visible {
  overflow-x: auto;
  overflow-y: hidden;
  @extend .scrollbar-visible;
}

.overflow-x-auto-invisible {
  overflow-x: auto;
  overflow-y: hidden;
  @extend .scrollbar-invisible;
}

// HOVER-BASED SCROLLBAR VISIBILITY
.scrollbar-hover {
  // Hide by default
  @extend .scrollbar-invisible;
  
  // Show on hover
  &:hover {
    @extend .scrollbar-visible;
  }
}

// FOCUS-BASED SCROLLBAR VISIBILITY
.scrollbar-focus {
  // Hide by default
  @extend .scrollbar-invisible;
  
  // Show on focus-within
  &:focus-within {
    @extend .scrollbar-visible;
  }
}

// SCROLLBAR THEME VARIANTS
.scrollbar-light {
  --scrollbar-track: rgba(255, 255, 255, 0.1);
  --scrollbar-thumb: rgba(255, 255, 255, 0.3);
  --scrollbar-thumb-hover: rgba(255, 255, 255, 0.5);
  --scrollbar-thumb-active: rgba(255, 255, 255, 0.7);
  --scrollbar-thumb-border: rgba(255, 255, 255, 0.1);
}

.scrollbar-dark {
  --scrollbar-track: rgba(0, 0, 0, 0.1);
  --scrollbar-thumb: rgba(0, 0, 0, 0.3);
  --scrollbar-thumb-hover: rgba(0, 0, 0, 0.5);
  --scrollbar-thumb-active: rgba(0, 0, 0, 0.7);
  --scrollbar-thumb-border: rgba(0, 0, 0, 0.1);
}

// SCROLLBAR POSITION UTILITIES
.scroll-padding-block-start {
  scroll-padding-block-start: var(--scroll-padding-block-start, #{$semantic-spacing-layout-section-sm});
}

.scroll-padding-block-end {
  scroll-padding-block-end: var(--scroll-padding-block-end, #{$semantic-spacing-layout-section-sm});
}

.scroll-padding-inline-start {
  scroll-padding-inline-start: var(--scroll-padding-inline-start, #{$semantic-spacing-component-padding-lg});
}

.scroll-padding-inline-end {
  scroll-padding-inline-end: var(--scroll-padding-inline-end, #{$semantic-spacing-component-padding-lg});
}

// SCROLL SNAP UTILITIES
.scroll-snap-x {
  scroll-snap-type: x mandatory;
  
  > * {
    scroll-snap-align: start;
  }
}

.scroll-snap-y {
  scroll-snap-type: y mandatory;
  
  > * {
    scroll-snap-align: start;
  }
}

.scroll-snap-both {
  scroll-snap-type: both mandatory;
  
  > * {
    scroll-snap-align: start;
  }
}

.scroll-snap-proximity {
  scroll-snap-type: y proximity;
  
  > * {
    scroll-snap-align: start;
  }
}

.scroll-snap-center {
  > * {
    scroll-snap-align: center;
  }
}

.scroll-snap-end {
  > * {
    scroll-snap-align: end;
  }
}

// MOMENTUM SCROLLING (iOS)
.scroll-momentum {
  -webkit-overflow-scrolling: touch;
}

// CUSTOM SCROLLBAR COMPONENT CLASSES
.custom-scrollbar {
  // Base scrollbar with custom styling
  @extend .scrollbar-visible;
  
  &::-webkit-scrollbar-thumb {
    background: linear-gradient(45deg, 
      var(--scrollbar-gradient-start, #667eea), 
      var(--scrollbar-gradient-end, #764ba2)
    );
    border-radius: #{$base-border-radius-lg};
    border: 2px solid var(--scrollbar-border, transparent);
    
    &:hover {
      transform: scale(1.1);
      transition: transform 0.2s ease;
    }
  }
  
  &::-webkit-scrollbar-track {
    background: var(--scrollbar-track-custom, rgba(0, 0, 0, 0.05));
    border-radius: #{$base-border-radius-lg};
    margin: #{$base-spacing-1};
  }
}

// DEVELOPER CHOICE MIXINS - For programmatic scrollbar control
@mixin scrollbar-choice($visible: true) {
  @if $visible {
    @extend .scrollbar-visible;
  } @else {
    @extend .scrollbar-invisible;
  }
}

// Utility classes for Angular component integration
.scrollbar-auto-visible {
  @include scrollbar-choice(true);
}

.scrollbar-auto-invisible {
  @include scrollbar-choice(false);
}

// RESPONSIVE SCROLLBAR UTILITIES
@media (max-width: #{$base-breakpoint-md}) {
  .scrollbar-mobile-invisible {
    // Firefox
    scrollbar-width: none;
    
    // Internet Explorer and Edge
    -ms-overflow-style: none;

    // Webkit browsers (Chrome, Safari, newer Edge)
    &::-webkit-scrollbar {
      display: none;
      width: 0;
      height: 0;
    }
  }
  
  .scrollbar-mobile-visible {
    scrollbar-width: thin;
    scrollbar-color: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)) var(--scrollbar-track, transparent);

    // Webkit scrollbar styling (Chrome, Safari, Edge)
    &::-webkit-scrollbar {
      width: #{$base-spacing-2}; // 8px
      height: #{$base-spacing-2};
    }

    &::-webkit-scrollbar-track {
      background: var(--scrollbar-track, transparent);
      border-radius: #{$base-border-radius-sm};
    }

    &::-webkit-scrollbar-thumb {
      background: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2));
      border-radius: #{$base-border-radius-sm};
      border: 1px solid var(--scrollbar-thumb-border, transparent);

      &:hover {
        background: var(--scrollbar-thumb-hover, rgba(0, 0, 0, 0.3));
      }

      &:active {
        background: var(--scrollbar-thumb-active, rgba(0, 0, 0, 0.4));
      }
    }

    &::-webkit-scrollbar-corner {
      background: var(--scrollbar-corner, transparent);
    }
  }
}

@media (min-width: #{$base-breakpoint-md}) {
  .scrollbar-desktop-invisible {
    // Firefox
    scrollbar-width: none;
    
    // Internet Explorer and Edge
    -ms-overflow-style: none;

    // Webkit browsers (Chrome, Safari, newer Edge)
    &::-webkit-scrollbar {
      display: none;
      width: 0;
      height: 0;
    }
  }
  
  .scrollbar-desktop-visible {
    scrollbar-width: thin;
    scrollbar-color: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)) var(--scrollbar-track, transparent);

    // Webkit scrollbar styling (Chrome, Safari, Edge)
    &::-webkit-scrollbar {
      width: #{$base-spacing-2}; // 8px
      height: #{$base-spacing-2};
    }

    &::-webkit-scrollbar-track {
      background: var(--scrollbar-track, transparent);
      border-radius: #{$base-border-radius-sm};
    }

    &::-webkit-scrollbar-thumb {
      background: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2));
      border-radius: #{$base-border-radius-sm};
      border: 1px solid var(--scrollbar-thumb-border, transparent);

      &:hover {
        background: var(--scrollbar-thumb-hover, rgba(0, 0, 0, 0.3));
      }

      &:active {
        background: var(--scrollbar-thumb-active, rgba(0, 0, 0, 0.4));
      }
    }

    &::-webkit-scrollbar-corner {
      background: var(--scrollbar-corner, transparent);
    }
  }
}

// ACCESSIBILITY CONSIDERATIONS
.scrollbar-high-contrast {
  --scrollbar-thumb: var(--color-text, #000);
  --scrollbar-thumb-hover: var(--color-text-emphasis, #333);
  --scrollbar-track: var(--color-border, #ccc);
}

.scrollbar-reduced-motion {
  scroll-behavior: auto;
  
  &::-webkit-scrollbar-thumb {
    transition: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .scrollbar-visible,
  .custom-scrollbar {
    scroll-behavior: auto;
    
    &::-webkit-scrollbar-thumb {
      transition: none;
    }
  }
}Gع
xW// ==========================================================================
// SPACING UTILITIES
// ==========================================================================
// Utility classes for margin and padding
// Uses CSS custom properties for consistent spacing scale
// ==========================================================================

// SPACING SCALE - Using base design tokens
:root {
  --space-0: #{$base-spacing-0};
  --space-1: #{$base-spacing-1};
  --space-2: #{$base-spacing-2};
  --space-3: #{$base-spacing-3};
  --space-4: #{$base-spacing-4};
  --space-5: #{$base-spacing-5};
  --space-6: #{$base-spacing-6};
  --space-7: #{$base-spacing-7};
  --space-8: #{$base-spacing-8};
  --space-9: #{$base-spacing-9};
  --space-10: #{$base-spacing-10};
  --space-11: #{$base-spacing-11};
  --space-12: #{$base-spacing-12};
  --space-14: #{$base-spacing-14};
  --space-16: #{$base-spacing-16};
  --space-20: #{$base-spacing-20};
  --space-24: #{$base-spacing-24};
  --space-28: #{$base-spacing-28};
  --space-32: #{$base-spacing-32};
  --space-36: #{$base-spacing-36};
  --space-40: #{$base-spacing-40};
  --space-44: #{$base-spacing-44};
  --space-48: #{$base-spacing-48};
  --space-52: #{$base-spacing-52};
  --space-56: #{$base-spacing-56};
  --space-60: #{$base-spacing-60};
  --space-64: #{$base-spacing-64};
  --space-72: #{$base-spacing-72};
  --space-80: #{$base-spacing-80};
  --space-96: #{$base-spacing-96};
  
  // Negative spacing
  --space--1: -#{$base-spacing-1};
  --space--2: -#{$base-spacing-2};
  --space--3: -#{$base-spacing-3};
  --space--4: -#{$base-spacing-4};
  --space--5: -#{$base-spacing-5};
  --space--6: -#{$base-spacing-6};
  --space--7: -#{$base-spacing-7};
  --space--8: -#{$base-spacing-8};
  --space--9: -#{$base-spacing-9};
  --space--10: -#{$base-spacing-10};
  --space--11: -#{$base-spacing-11};
  --space--12: -#{$base-spacing-12};
  --space--14: -#{$base-spacing-14};
  --space--16: -#{$base-spacing-16};
  --space--20: -#{$base-spacing-20};
  --space--24: -#{$base-spacing-24};
  --space--28: -#{$base-spacing-28};
  --space--32: -#{$base-spacing-32};
}

// MARGIN UTILITIES
// All margins
.m-0 { margin: var(--space-0) !important; }
.m-1 { margin: var(--space-1) !important; }
.m-2 { margin: var(--space-2) !important; }
.m-3 { margin: var(--space-3) !important; }
.m-4 { margin: var(--space-4) !important; }
.m-5 { margin: var(--space-5) !important; }
.m-6 { margin: var(--space-6) !important; }
.m-7 { margin: var(--space-7) !important; }
.m-8 { margin: var(--space-8) !important; }
.m-9 { margin: var(--space-9) !important; }
.m-10 { margin: var(--space-10) !important; }
.m-11 { margin: var(--space-11) !important; }
.m-12 { margin: var(--space-12) !important; }
.m-14 { margin: var(--space-14) !important; }
.m-16 { margin: var(--space-16) !important; }
.m-20 { margin: var(--space-20) !important; }
.m-24 { margin: var(--space-24) !important; }
.m-28 { margin: var(--space-28) !important; }
.m-32 { margin: var(--space-32) !important; }
.m-36 { margin: var(--space-36) !important; }
.m-40 { margin: var(--space-40) !important; }
.m-44 { margin: var(--space-44) !important; }
.m-48 { margin: var(--space-48) !important; }
.m-52 { margin: var(--space-52) !important; }
.m-56 { margin: var(--space-56) !important; }
.m-60 { margin: var(--space-60) !important; }
.m-64 { margin: var(--space-64) !important; }
.m-72 { margin: var(--space-72) !important; }
.m-80 { margin: var(--space-80) !important; }
.m-96 { margin: var(--space-96) !important; }

// Auto margin
.m-auto { margin: auto !important; }

// Negative margins
.m-n1 { margin: var(--space--1) !important; }
.m-n2 { margin: var(--space--2) !important; }
.m-n3 { margin: var(--space--3) !important; }
.m-n4 { margin: var(--space--4) !important; }
.m-n5 { margin: var(--space--5) !important; }
.m-n6 { margin: var(--space--6) !important; }
.m-n8 { margin: var(--space--8) !important; }
.m-n10 { margin: var(--space--10) !important; }
.m-n12 { margin: var(--space--12) !important; }
.m-n16 { margin: var(--space--16) !important; }
.m-n20 { margin: var(--space--20) !important; }
.m-n24 { margin: var(--space--24) !important; }

// Margin X (horizontal)
.mx-0 { margin-left: var(--space-0) !important; margin-right: var(--space-0) !important; }
.mx-1 { margin-left: var(--space-1) !important; margin-right: var(--space-1) !important; }
.mx-2 { margin-left: var(--space-2) !important; margin-right: var(--space-2) !important; }
.mx-3 { margin-left: var(--space-3) !important; margin-right: var(--space-3) !important; }
.mx-4 { margin-left: var(--space-4) !important; margin-right: var(--space-4) !important; }
.mx-5 { margin-left: var(--space-5) !important; margin-right: var(--space-5) !important; }
.mx-6 { margin-left: var(--space-6) !important; margin-right: var(--space-6) !important; }
.mx-8 { margin-left: var(--space-8) !important; margin-right: var(--space-8) !important; }
.mx-10 { margin-left: var(--space-10) !important; margin-right: var(--space-10) !important; }
.mx-12 { margin-left: var(--space-12) !important; margin-right: var(--space-12) !important; }
.mx-16 { margin-left: var(--space-16) !important; margin-right: var(--space-16) !important; }
.mx-20 { margin-left: var(--space-20) !important; margin-right: var(--space-20) !important; }
.mx-24 { margin-left: var(--space-24) !important; margin-right: var(--space-24) !important; }
.mx-32 { margin-left: var(--space-32) !important; margin-right: var(--space-32) !important; }

.mx-auto { margin-left: auto !important; margin-right: auto !important; }

// Margin Y (vertical)
.my-0 { margin-top: var(--space-0) !important; margin-bottom: var(--space-0) !important; }
.my-1 { margin-top: var(--space-1) !important; margin-bottom: var(--space-1) !important; }
.my-2 { margin-top: var(--space-2) !important; margin-bottom: var(--space-2) !important; }
.my-3 { margin-top: var(--space-3) !important; margin-bottom: var(--space-3) !important; }
.my-4 { margin-top: var(--space-4) !important; margin-bottom: var(--space-4) !important; }
.my-5 { margin-top: var(--space-5) !important; margin-bottom: var(--space-5) !important; }
.my-6 { margin-top: var(--space-6) !important; margin-bottom: var(--space-6) !important; }
.my-8 { margin-top: var(--space-8) !important; margin-bottom: var(--space-8) !important; }
.my-10 { margin-top: var(--space-10) !important; margin-bottom: var(--space-10) !important; }
.my-12 { margin-top: var(--space-12) !important; margin-bottom: var(--space-12) !important; }
.my-16 { margin-top: var(--space-16) !important; margin-bottom: var(--space-16) !important; }
.my-20 { margin-top: var(--space-20) !important; margin-bottom: var(--space-20) !important; }
.my-24 { margin-top: var(--space-24) !important; margin-bottom: var(--space-24) !important; }
.my-32 { margin-top: var(--space-32) !important; margin-bottom: var(--space-32) !important; }

.my-auto { margin-top: auto !important; margin-bottom: auto !important; }

// Individual margins
.mt-0 { margin-top: var(--space-0) !important; }
.mt-1 { margin-top: var(--space-1) !important; }
.mt-2 { margin-top: var(--space-2) !important; }
.mt-3 { margin-top: var(--space-3) !important; }
.mt-4 { margin-top: var(--space-4) !important; }
.mt-5 { margin-top: var(--space-5) !important; }
.mt-6 { margin-top: var(--space-6) !important; }
.mt-8 { margin-top: var(--space-8) !important; }
.mt-10 { margin-top: var(--space-10) !important; }
.mt-12 { margin-top: var(--space-12) !important; }
.mt-16 { margin-top: var(--space-16) !important; }
.mt-20 { margin-top: var(--space-20) !important; }
.mt-24 { margin-top: var(--space-24) !important; }
.mt-32 { margin-top: var(--space-32) !important; }
.mt-auto { margin-top: auto !important; }

.mb-0 { margin-bottom: var(--space-0) !important; }
.mb-1 { margin-bottom: var(--space-1) !important; }
.mb-2 { margin-bottom: var(--space-2) !important; }
.mb-3 { margin-bottom: var(--space-3) !important; }
.mb-4 { margin-bottom: var(--space-4) !important; }
.mb-5 { margin-bottom: var(--space-5) !important; }
.mb-6 { margin-bottom: var(--space-6) !important; }
.mb-8 { margin-bottom: var(--space-8) !important; }
.mb-10 { margin-bottom: var(--space-10) !important; }
.mb-12 { margin-bottom: var(--space-12) !important; }
.mb-16 { margin-bottom: var(--space-16) !important; }
.mb-20 { margin-bottom: var(--space-20) !important; }
.mb-24 { margin-bottom: var(--space-24) !important; }
.mb-32 { margin-bottom: var(--space-32) !important; }
.mb-auto { margin-bottom: auto !important; }

.ms-0 { margin-left: var(--space-0) !important; }
.ms-1 { margin-left: var(--space-1) !important; }
.ms-2 { margin-left: var(--space-2) !important; }
.ms-3 { margin-left: var(--space-3) !important; }
.ms-4 { margin-left: var(--space-4) !important; }
.ms-5 { margin-left: var(--space-5) !important; }
.ms-6 { margin-left: var(--space-6) !important; }
.ms-8 { margin-left: var(--space-8) !important; }
.ms-10 { margin-left: var(--space-10) !important; }
.ms-12 { margin-left: var(--space-12) !important; }
.ms-16 { margin-left: var(--space-16) !important; }
.ms-20 { margin-left: var(--space-20) !important; }
.ms-24 { margin-left: var(--space-24) !important; }
.ms-32 { margin-left: var(--space-32) !important; }
.ms-auto { margin-left: auto !important; }

.me-0 { margin-right: var(--space-0) !important; }
.me-1 { margin-right: var(--space-1) !important; }
.me-2 { margin-right: var(--space-2) !important; }
.me-3 { margin-right: var(--space-3) !important; }
.me-4 { margin-right: var(--space-4) !important; }
.me-5 { margin-right: var(--space-5) !important; }
.me-6 { margin-right: var(--space-6) !important; }
.me-8 { margin-right: var(--space-8) !important; }
.me-10 { margin-right: var(--space-10) !important; }
.me-12 { margin-right: var(--space-12) !important; }
.me-16 { margin-right: var(--space-16) !important; }
.me-20 { margin-right: var(--space-20) !important; }
.me-24 { margin-right: var(--space-24) !important; }
.me-32 { margin-right: var(--space-32) !important; }
.me-auto { margin-right: auto !important; }

// PADDING UTILITIES
// All padding
.p-0 { padding: var(--space-0) !important; }
.p-1 { padding: var(--space-1) !important; }
.p-2 { padding: var(--space-2) !important; }
.p-3 { padding: var(--space-3) !important; }
.p-4 { padding: var(--space-4) !important; }
.p-5 { padding: var(--space-5) !important; }
.p-6 { padding: var(--space-6) !important; }
.p-7 { padding: var(--space-7) !important; }
.p-8 { padding: var(--space-8) !important; }
.p-9 { padding: var(--space-9) !important; }
.p-10 { padding: var(--space-10) !important; }
.p-11 { padding: var(--space-11) !important; }
.p-12 { padding: var(--space-12) !important; }
.p-14 { padding: var(--space-14) !important; }
.p-16 { padding: var(--space-16) !important; }
.p-20 { padding: var(--space-20) !important; }
.p-24 { padding: var(--space-24) !important; }
.p-28 { padding: var(--space-28) !important; }
.p-32 { padding: var(--space-32) !important; }
.p-36 { padding: var(--space-36) !important; }
.p-40 { padding: var(--space-40) !important; }
.p-44 { padding: var(--space-44) !important; }
.p-48 { padding: var(--space-48) !important; }

// Padding X (horizontal)
.px-0 { padding-left: var(--space-0) !important; padding-right: var(--space-0) !important; }
.px-1 { padding-left: var(--space-1) !important; padding-right: var(--space-1) !important; }
.px-2 { padding-left: var(--space-2) !important; padding-right: var(--space-2) !important; }
.px-3 { padding-left: var(--space-3) !important; padding-right: var(--space-3) !important; }
.px-4 { padding-left: var(--space-4) !important; padding-right: var(--space-4) !important; }
.px-5 { padding-left: var(--space-5) !important; padding-right: var(--space-5) !important; }
.px-6 { padding-left: var(--space-6) !important; padding-right: var(--space-6) !important; }
.px-8 { padding-left: var(--space-8) !important; padding-right: var(--space-8) !important; }
.px-10 { padding-left: var(--space-10) !important; padding-right: var(--space-10) !important; }
.px-12 { padding-left: var(--space-12) !important; padding-right: var(--space-12) !important; }
.px-16 { padding-left: var(--space-16) !important; padding-right: var(--space-16) !important; }
.px-20 { padding-left: var(--space-20) !important; padding-right: var(--space-20) !important; }
.px-24 { padding-left: var(--space-24) !important; padding-right: var(--space-24) !important; }
.px-32 { padding-left: var(--space-32) !important; padding-right: var(--space-32) !important; }

// Padding Y (vertical)
.py-0 { padding-top: var(--space-0) !important; padding-bottom: var(--space-0) !important; }
.py-1 { padding-top: var(--space-1) !important; padding-bottom: var(--space-1) !important; }
.py-2 { padding-top: var(--space-2) !important; padding-bottom: var(--space-2) !important; }
.py-3 { padding-top: var(--space-3) !important; padding-bottom: var(--space-3) !important; }
.py-4 { padding-top: var(--space-4) !important; padding-bottom: var(--space-4) !important; }
.py-5 { padding-top: var(--space-5) !important; padding-bottom: var(--space-5) !important; }
.py-6 { padding-top: var(--space-6) !important; padding-bottom: var(--space-6) !important; }
.py-8 { padding-top: var(--space-8) !important; padding-bottom: var(--space-8) !important; }
.py-10 { padding-top: var(--space-10) !important; padding-bottom: var(--space-10) !important; }
.py-12 { padding-top: var(--space-12) !important; padding-bottom: var(--space-12) !important; }
.py-16 { padding-top: var(--space-16) !important; padding-bottom: var(--space-16) !important; }
.py-20 { padding-top: var(--space-20) !important; padding-bottom: var(--space-20) !important; }
.py-24 { padding-top: var(--space-24) !important; padding-bottom: var(--space-24) !important; }
.py-32 { padding-top: var(--space-32) !important; padding-bottom: var(--space-32) !important; }

// Individual padding
.pt-0 { padding-top: var(--space-0) !important; }
.pt-1 { padding-top: var(--space-1) !important; }
.pt-2 { padding-top: var(--space-2) !important; }
.pt-3 { padding-top: var(--space-3) !important; }
.pt-4 { padding-top: var(--space-4) !important; }
.pt-5 { padding-top: var(--space-5) !important; }
.pt-6 { padding-top: var(--space-6) !important; }
.pt-8 { padding-top: var(--space-8) !important; }
.pt-10 { padding-top: var(--space-10) !important; }
.pt-12 { padding-top: var(--space-12) !important; }
.pt-16 { padding-top: var(--space-16) !important; }
.pt-20 { padding-top: var(--space-20) !important; }
.pt-24 { padding-top: var(--space-24) !important; }
.pt-32 { padding-top: var(--space-32) !important; }

.pb-0 { padding-bottom: var(--space-0) !important; }
.pb-1 { padding-bottom: var(--space-1) !important; }
.pb-2 { padding-bottom: var(--space-2) !important; }
.pb-3 { padding-bottom: var(--space-3) !important; }
.pb-4 { padding-bottom: var(--space-4) !important; }
.pb-5 { padding-bottom: var(--space-5) !important; }
.pb-6 { padding-bottom: var(--space-6) !important; }
.pb-8 { padding-bottom: var(--space-8) !important; }
.pb-10 { padding-bottom: var(--space-10) !important; }
.pb-12 { padding-bottom: var(--space-12) !important; }
.pb-16 { padding-bottom: var(--space-16) !important; }
.pb-20 { padding-bottom: var(--space-20) !important; }
.pb-24 { padding-bottom: var(--space-24) !important; }
.pb-32 { padding-bottom: var(--space-32) !important; }

.ps-0 { padding-left: var(--space-0) !important; }
.ps-1 { padding-left: var(--space-1) !important; }
.ps-2 { padding-left: var(--space-2) !important; }
.ps-3 { padding-left: var(--space-3) !important; }
.ps-4 { padding-left: var(--space-4) !important; }
.ps-5 { padding-left: var(--space-5) !important; }
.ps-6 { padding-left: var(--space-6) !important; }
.ps-8 { padding-left: var(--space-8) !important; }
.ps-10 { padding-left: var(--space-10) !important; }
.ps-12 { padding-left: var(--space-12) !important; }
.ps-16 { padding-left: var(--space-16) !important; }
.ps-20 { padding-left: var(--space-20) !important; }
.ps-24 { padding-left: var(--space-24) !important; }
.ps-32 { padding-left: var(--space-32) !important; }

.pe-0 { padding-right: var(--space-0) !important; }
.pe-1 { padding-right: var(--space-1) !important; }
.pe-2 { padding-right: var(--space-2) !important; }
.pe-3 { padding-right: var(--space-3) !important; }
.pe-4 { padding-right: var(--space-4) !important; }
.pe-5 { padding-right: var(--space-5) !important; }
.pe-6 { padding-right: var(--space-6) !important; }
.pe-8 { padding-right: var(--space-8) !important; }
.pe-10 { padding-right: var(--space-10) !important; }
.pe-12 { padding-right: var(--space-12) !important; }
.pe-16 { padding-right: var(--space-16) !important; }
.pe-20 { padding-right: var(--space-20) !important; }
.pe-24 { padding-right: var(--space-24) !important; }
.pe-32 { padding-right: var(--space-32) !important; }

// GAP UTILITIES (for flexbox and grid)
.gap-0 { gap: var(--space-0) !important; }
.gap-1 { gap: var(--space-1) !important; }
.gap-2 { gap: var(--space-2) !important; }
.gap-3 { gap: var(--space-3) !important; }
.gap-4 { gap: var(--space-4) !important; }
.gap-5 { gap: var(--space-5) !important; }
.gap-6 { gap: var(--space-6) !important; }
.gap-8 { gap: var(--space-8) !important; }
.gap-10 { gap: var(--space-10) !important; }
.gap-12 { gap: var(--space-12) !important; }
.gap-16 { gap: var(--space-16) !important; }
.gap-20 { gap: var(--space-20) !important; }
.gap-24 { gap: var(--space-24) !important; }
.gap-32 { gap: var(--space-32) !important; }

.gap-x-0 { column-gap: var(--space-0) !important; }
.gap-x-1 { column-gap: var(--space-1) !important; }
.gap-x-2 { column-gap: var(--space-2) !important; }
.gap-x-3 { column-gap: var(--space-3) !important; }
.gap-x-4 { column-gap: var(--space-4) !important; }
.gap-x-5 { column-gap: var(--space-5) !important; }
.gap-x-6 { column-gap: var(--space-6) !important; }
.gap-x-8 { column-gap: var(--space-8) !important; }
.gap-x-10 { column-gap: var(--space-10) !important; }
.gap-x-12 { column-gap: var(--space-12) !important; }
.gap-x-16 { column-gap: var(--space-16) !important; }
.gap-x-20 { column-gap: var(--space-20) !important; }
.gap-x-24 { column-gap: var(--space-24) !important; }
.gap-x-32 { column-gap: var(--space-32) !important; }

.gap-y-0 { row-gap: var(--space-0) !important; }
.gap-y-1 { row-gap: var(--space-1) !important; }
.gap-y-2 { row-gap: var(--space-2) !important; }
.gap-y-3 { row-gap: var(--space-3) !important; }
.gap-y-4 { row-gap: var(--space-4) !important; }
.gap-y-5 { row-gap: var(--space-5) !important; }
.gap-y-6 { row-gap: var(--space-6) !important; }
.gap-y-8 { row-gap: var(--space-8) !important; }
.gap-y-10 { row-gap: var(--space-10) !important; }
.gap-y-12 { row-gap: var(--space-12) !important; }
.gap-y-16 { row-gap: var(--space-16) !important; }
.gap-y-20 { row-gap: var(--space-20) !important; }
.gap-y-24 { row-gap: var(--space-24) !important; }
.gap-y-32 { row-gap: var(--space-32) !important; }

// RESPONSIVE SPACING UTILITIES
@media (min-width: 576px) {
  .m-sm-0 { margin: var(--space-0) !important; }
  .m-sm-1 { margin: var(--space-1) !important; }
  .m-sm-2 { margin: var(--space-2) !important; }
  .m-sm-3 { margin: var(--space-3) !important; }
  .m-sm-4 { margin: var(--space-4) !important; }
  .m-sm-6 { margin: var(--space-6) !important; }
  .m-sm-8 { margin: var(--space-8) !important; }
  .m-sm-12 { margin: var(--space-12) !important; }
  .m-sm-16 { margin: var(--space-16) !important; }
  .m-sm-20 { margin: var(--space-20) !important; }
  .m-sm-24 { margin: var(--space-24) !important; }
  
  .p-sm-0 { padding: var(--space-0) !important; }
  .p-sm-1 { padding: var(--space-1) !important; }
  .p-sm-2 { padding: var(--space-2) !important; }
  .p-sm-3 { padding: var(--space-3) !important; }
  .p-sm-4 { padding: var(--space-4) !important; }
  .p-sm-6 { padding: var(--space-6) !important; }
  .p-sm-8 { padding: var(--space-8) !important; }
  .p-sm-12 { padding: var(--space-12) !important; }
  .p-sm-16 { padding: var(--space-16) !important; }
  .p-sm-20 { padding: var(--space-20) !important; }
  .p-sm-24 { padding: var(--space-24) !important; }
}

@media (min-width: 768px) {
  .m-md-0 { margin: var(--space-0) !important; }
  .m-md-1 { margin: var(--space-1) !important; }
  .m-md-2 { margin: var(--space-2) !important; }
  .m-md-3 { margin: var(--space-3) !important; }
  .m-md-4 { margin: var(--space-4) !important; }
  .m-md-6 { margin: var(--space-6) !important; }
  .m-md-8 { margin: var(--space-8) !important; }
  .m-md-12 { margin: var(--space-12) !important; }
  .m-md-16 { margin: var(--space-16) !important; }
  .m-md-20 { margin: var(--space-20) !important; }
  .m-md-24 { margin: var(--space-24) !important; }
  
  .p-md-0 { padding: var(--space-0) !important; }
  .p-md-1 { padding: var(--space-1) !important; }
  .p-md-2 { padding: var(--space-2) !important; }
  .p-md-3 { padding: var(--space-3) !important; }
  .p-md-4 { padding: var(--space-4) !important; }
  .p-md-6 { padding: var(--space-6) !important; }
  .p-md-8 { padding: var(--space-8) !important; }
  .p-md-12 { padding: var(--space-12) !important; }
  .p-md-16 { padding: var(--space-16) !important; }
  .p-md-20 { padding: var(--space-20) !important; }
  .p-md-24 { padding: var(--space-24) !important; }
}

@media (min-width: 992px) {
  .m-lg-0 { margin: var(--space-0) !important; }
  .m-lg-1 { margin: var(--space-1) !important; }
  .m-lg-2 { margin: var(--space-2) !important; }
  .m-lg-3 { margin: var(--space-3) !important; }
  .m-lg-4 { margin: var(--space-4) !important; }
  .m-lg-6 { margin: var(--space-6) !important; }
  .m-lg-8 { margin: var(--space-8) !important; }
  .m-lg-12 { margin: var(--space-12) !important; }
  .m-lg-16 { margin: var(--space-16) !important; }
  .m-lg-20 { margin: var(--space-20) !important; }
  .m-lg-24 { margin: var(--space-24) !important; }
  
  .p-lg-0 { padding: var(--space-0) !important; }
  .p-lg-1 { padding: var(--space-1) !important; }
  .p-lg-2 { padding: var(--space-2) !important; }
  .p-lg-3 { padding: var(--space-3) !important; }
  .p-lg-4 { padding: var(--space-4) !important; }
  .p-lg-6 { padding: var(--space-6) !important; }
  .p-lg-8 { padding: var(--space-8) !important; }
  .p-lg-12 { padding: var(--space-12) !important; }
  .p-lg-16 { padding: var(--space-16) !important; }
  .p-lg-20 { padding: var(--space-20) !important; }
  .p-lg-24 { padding: var(--space-24) !important; }
}gjx_$aileron-font-path: "/fonts/aileron/" !default;


/*** Aileron**/
@font-face {
    font-family: 'Aileron Bold';
    src: url("#{$aileron-font-path}Aileron-Bold-webfont.ttf") format("truetype"),
         url('#{$aileron-font-path}Aileron-Bold-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$aileron-font-path}Aileron-Bold-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}
@font-face {
    font-family: 'Aileron Semi Bold';
    src: url("#{$aileron-font-path}Aileron-SemiBold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
@font-face {
  font-family: 'Aileron Heavy';
    src: url("#{$aileron-font-path}Aileron-Heavy-webfont.ttf") format("truetype"),
         url('#{$aileron-font-path}Aileron-Heavy-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$aileron-font-path}Aileron-Heavy-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}
@font-face {
  font-family: 'Aileron Light';
    src: url("#{$aileron-font-path}Aileron-Light.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

@font-face {
  font-family: 'Aileron Regular';
    src: url("#{$aileron-font-path}Aileron-Regular-webfont.ttf") format("truetype"),
         url('#{$aileron-font-path}Aileron-Regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$aileron-font-path}Aileron-Regular-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

.aileron {
  font-family: 'Aileron Regular';
}
.aileron-heavy {
  font-family: 'Aileron Heavy';
}
+׺xJ$alegreya-font-path: "/fonts/alegreya/" !default;

@font-face {
    font-family: 'Alegreya';
    src: url("#{$alegreya-font-path}Alegreya-VariableFont_wght.ttf") format("truetype");
}
@font-face {
    font-family: 'Alegreya Italic';
    src: url("#{$alegreya-font-path}Alegreya-Italic-VariableFont_wght.ttf") format("truetype");
}orx)/* You can add global styles to this file, and also import other style files */
 //////////////////////////////////////////////////////////////////////
// Fontfaces  ./
//////////////////////////////////////////////////////////////////////
@import './alegreya';
@import './amarante';
@import './archivo';
@import './architectsdaughter.scss';
@import './averiaseriflibre';
@import './bebasneue';
@import './blinker';
@import './bonheurroyale';
@import './bonveno';
@import './cabin';
@import './cinzel';
@import './comfortaa';
@import './commissioner';
@import './crimson-text';
@import './dellarespira';
@import './dmsans';
@import './ebgaramond';
@import './epilogue';
@import './exo2';
@import './figtree';
@import './fraunces';
@import './iceland';
@import './geist';
@import './glassantiqua';
@import './inter';
@import './josefin_sans';
@import './karla';
@import './lato';
@import './leaguespartan';
@import './lexend';
@import './librebaskerville';
@import './limelight';
@import './lora';
@import './manrope';
@import './monasans';
@import './metropolis';
@import './merriweather';
@import './montserrat';
@import './opensans';
@import './outfit';
@import './overused';
@import './nacelle';
@import './notosans';
@import './nunito';
@import './oswald';
@import './playfair_display';
@import './plusjakatasans';
@import './poppins';
@import './questrial';
@import './quicksand';
@import './raleway';
@import './roboto';
@import './robotomono';
@import './robotoslab';
@import './rubik';
@import './sacramento';
@import './satoshi';
@import './sifonn';
@import './sixcaps';
@import './sourcesanspro';
@import './sora';
@import './sourcesanspro';
@import './spacegrotesk';
@import './spacemono';
@import './unbounded';
@import './urbanist';
@import './vollkorn';
@import './whisper';
@import './worksans';
@import './zillaslab';NUx $amarante-font-path: "/fonts/amarante/" !default;

@font-face {
    font-family: 'Amarante Regular';
    src: url("#{$amarante-font-path}Amarante-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
QLֳx$architectsdaughter-font-path: "/fonts/architectsdaughter/" !default;

@font-face {
    font-family: 'Architects Daughter';
    src: url("#{$architectsdaughter-font-path}ArchitectsDaughter-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

9^׳xC$archivo-font-path: "/fonts/archivo/" !default;


@font-face {
    font-family: 'Archivo';
    src: url("#{$archivo-font-path}Archivo-VariableFont_wdth,wght.ttf") format("truetype");
}

@font-face {
    font-family: 'Archivo';
    src: url("#{$archivo-font-path}Archivo-Italic-VariableFont_wght.ttf") format("truetype");
}
 lxL$archivonarrow-font-path: "/fonts/archivonarrow/" !default;


@font-face {
    font-family: "Archivo Narrow Regular";
    src: local(Archivo Narrow Regular), url('#{$archivonarrow-font-path}ArchivoNarrow-Regular.ttf');
    src: url("#{$archivonarrow-font-path}ArchivoNarrow-Regular.ttf") format("truetype");
    font-weight: 500;
}
q˽6xm$averia-font-path: "/fonts/averiaseriflibre/" !default;


@font-face {
    font-family: 'Averia Regular';
    src: url("#{$averia-font-path}AveriaSerifLibre-Regular.ttf") format("truetype");
}

@font-face {
    font-family: 'Averia Bold';
    src: url("#{$averia-font-path}AveriaSerifLibre-Bold.ttf") format("truetype");
}

@font-face {
    font-family: 'Averia Bold Italic';
    src: url("#{$averia-font-path}AveriaSerifLibre-BoldItalic.ttf") format("truetype");
}

@font-face {
    font-family: 'Averia Italic';
    src: url("#{$averia-font-path}AveriaSerifLibre-talic.ttf") format("truetype");
}

@font-face {
    font-family: 'Averia Light';
    src: url("#{$averia-font-path}AveriaSerifLibre-Light.ttf") format("truetype");
}

@font-face {
    font-family: 'Averia Light Italic';
    src: url("#{$averia-font-path}AveriaSerifLibre-LightItalic.ttf") format("truetype");
}

#7# "x $bebasneue-font-path: "/fonts/bebasneue/" !default;

/*** Bebas Neue ***/
@font-face {
    font-family: 'Bebas Neue Regular';
    src: url("#{$bebasneue-font-path}bebasneue-regular-webfont.ttf") format("truetype"),
         url('#{$bebasneue-font-path}bebasneue-regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$bebasneue-font-path}bebasneue-regular-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}


.bebas-neue {
  font-family: 'bebas_neueregular';
}
:xY$blinker-font-path: "/fonts/blinker/" !default;


/*** Blinker**/
@font-face {
    font-family: 'Blinker Bold';
    src: url("#{$blinker-font-path}Blinker-Bold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
@font-face {
    font-family: 'Blinker Semi Bold';
    src: url("#{$blinker-font-path}Blinker-SemiBold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
@font-face {
  font-family: 'Blinker Light';
    src: url("#{$blinker-font-path}Blinker-Light.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

@font-face {
  font-family: 'Blinker Regular';
    src: url("#{$blinker-font-path}Blinker-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

@font-face {
  font-family: 'Blinker Thin';
    src: url("#{$blinker-font-path}Blinker-Thin.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
]2x$bonheurroyale-font-path: "/fonts/bonheurroyale/" !default;

@font-face {
    font-family: 'Bonheur Royale Regular';
    src: url("#{$bonheurroyale-font-path}BonheurRoyale-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
/Wĸx $bonvenocf-font-path: "/fonts/bonvenocf/" !default;


@font-face {
    font-family: "BonvenoCFLight";
    src: url("#{$bonvenocf-font-path}BonvenoCF-Light.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
3Lհx@$cabin-font-path: "/fonts/cabin/" !default;


@font-face {
    font-family: "Cabin";
    src: url("#{$cabin-font-path}Cabin-VariableFont_wdth,wght.ttf") format("truetype");
}

@font-face {
    font-family: "Cabin Italic";
    src: url("#{$cabin-font-path}Cabin-Italic-VariableFont_wdth,wght.ttf") format("truetype");
}

SiXx O$cinzel-font-path: "/fonts/cinzel/" !default;


@font-face {
    font-family: "Cinzel";
    src: url("#{$cinzel-font-path}Cinzel-VariableFont_wght.ttf") format("truetype");
}

:Mx $comfortaa-font-path: "/fonts/comfortaa/" !default;


@font-face {
    font-family: 'Comfortaa';
    src: url("#{$comfortaa-font-path}Comfortaa-VariableFont_wght.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
uP1	|x j$exo2-font-path: "/fonts/exo_2'.+Exo2';
    src: url("#{$exo2-font-path}Exo2`5 9Exo2 Italic';
    src: url("#{$exo2-font-path}Exo2-Italic` 50лx $$commissioner-font-path: "/fonts/commissioner/" !default;

@font-face {
    font-family: 'Commissioner';
    src: url("#{$commissioner-font-path}Commissioner-VariableFont_FLAR,VOLM,slnt,wght.ttf") format("truetype");
}
CKʳxs$cooperhewitt-font-path: "/fonts/cooperhewitt/" !default;

/*** Cooper Hewitt ***/
@font-face {
    font-family: 'Cooper Hewitt Bold';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-Bold.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Bold Italic';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-BoldItalic.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Book';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-Book.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Book Italic';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-BookItalic.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Heavy';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-Heavy.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Heavy Italic';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-HeavyItalic.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Light';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-Light.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Light Italic';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-LightItalic.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Medium';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-Medium.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Medium Italic';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-MediumItalic.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Semibold';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-Semibold.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Semibold Italic';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-SemiboldItalic.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Thin';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-Thin.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Cooper Hewitt Thin Italic';
    src: url('#{$cooperhewitt-font-path}CooperHewitt-ThinItalic.woff') format('woff'); /* Super Modern Browsers */
    font-weight: normal;
    font-style: normal;
}
!fxk$crimsontext-font-path: "/fonts/crimson_text/" !default;


@font-face {
    font-family: "Crimson Text Bold";
    src: local(Crimson Text Bold), url('#{$crimsontext-font-path}CrimsonText-Bold.ttf');
    src: url("#{$crimsontext-font-path}CrimsonText-Bold.ttf") format("truetype");
    font-weight: 700;
}
@font-face {
    font-family: "Crimson Text Bold Italic";
    src: local(Crimson Text Bold Italic), url('#{$crimsontext-font-path}CrimsonText-BoldItalic.ttf');
    src: url("#{$crimsontext-font-path}CrimsonText-BoldItalic.ttf") format("truetype");
    font-weight: 700;
}
@font-face {
    font-family: "Crimson Text Italic";
    src: local(Crimson Text Italic), url('#{$crimsontext-font-path}CrimsonText-Italic.ttf');
    src: url("#{$crimsontext-font-path}CrimsonText-Italic.ttf") format("truetype");
    font-weight: 400;
}
@font-face {
    font-family: "Crimson Text Regular";
    src: local(Crimson Text Regular), url('#{$crimsontext-font-path}CrimsonText-Regular.ttf');
    src: url("#{$crimsontext-font-path}CrimsonText-Regular.ttf") format("truetype");
    font-weight: 400;
}
@font-face {
    font-family: "Crimson Text Semi Bold";
    src: local(Crimson Text Semi Bold), url('#{$crimsontext-font-path}CrimsonText-SemiBold.ttf');
    src: url("#{$crimsontext-font-path}CrimsonText-SemiBold.ttf") format("truetype");
    font-weight: 600;
}
@font-face {
    font-family: "Crimson Text Semi Bold Italic";
    src: local(Crimson Text Semi Bold Italic), url('#{$crimsontext-font-path}CrimsonText-SemiBoldItalic.ttf');
    src: url("#{$crimsontext-font-path}CrimsonText-SemiBoldItalic.ttf") format("truetype");
    font-weight: 600;
}
D*`x{$dancingscript-font-path: "/fonts/dancingscript/" !default;

/*** Poppins ***/
@font-face {
    font-family: "Dancing Script";
    src: local(Dancing Script), url('#{$dancingscript-font-path}DancingScript-Regular.ttf');
    src: url("#{$dancingscript-font-path}DancingScript-Regular.ttf") format("truetype");
    font-weight: 400;
}


.dancing-script {
  font-family: "Dancing Script";
}
6_x 
$dellarespira-font-path: "/fonts/dellarespira/" !default;

@font-face {
    font-family: 'Della Respira';
    src: url("#{$dellarespira-font-path}DellaRespira-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}


5R9x?$dmsans-font-path: "/fonts/dmsans/" !default;


@font-face {
  font-family: 'DM Sans';
  src: url("#{$dmsans-font-path}DMSans-VariableFont_opsz,wght.ttf") format("truetype")
}

@font-face {
  font-family: 'DM Sans Italic';
  src: url("#{$dmsans-font-path}DMSans-Italic-VariableFont_opsz,wght.ttf") format("truetype")
}
kwxx$vesperlibre-font-path: "/fonts/vesperlibre/" !default;


@font-face {
    font-family: 'Vesper Libre Regular';
    src: url("#{$vesperlibre-font-path}VesperLibre-Regular.ttf") format("truetype"),
         url('#{$vesperlibre-font-path}VesperLibre-Regular.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$vesperlibre-font-path}VesperLibre-Regular.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

.vesperlibre-regular {
  font-family: 'Vesper Libre Regular';
}


@font-face {
    font-family: 'Vesper Libre Bold';
    src: url("#{$vesperlibre-font-path}VesperLibre-Bold.ttf") format("truetype"),
         url('#{$vesperlibre-font-path}VesperLibre-Bold.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$vesperlibre-font-path}VesperLibre-Bold.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

.vesperlibre-bold {
  font-family: 'Vesper Libre Bold';
}


@font-face {
    font-family: 'Vesper Libre Medium';
    src: url("#{$vesperlibre-font-path}VesperLibre-Medium.ttf") format("truetype"),
         url('#{$vesperlibre-font-path}VesperLibre-Medium.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$vesperlibre-font-path}VesperLibre-Medium.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

.vesperlibre-medium {
  font-family: 'Vesper Libre Medium';
}


@font-face {
    font-family: 'Vesper Libre Heavy';
    src: url("#{$vesperlibre-font-path}VesperLibre-Heavy.ttf") format("truetype"),
         url('#{$vesperlibre-font-path}VesperLibre-Heavy.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$vesperlibre-font-path}VesperLibre-Heavy.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

.vesperlibre-heavy {
  font-family: 'Vesper Libre Heavy';
}
vux1"$nacelle-font-path: "/fonts/nacell*/;Nacelle Regular';
    src: url("#{$nacelle-font-path}Nacell";5Nacelle Semi>nacelle-font-path}Nacelle-Semiy;5Nacell=nacelle-font-path}Nacellw;5@Nacelle Heavy';
    src: url("#{$nacelle-font-path}Nacelle-Heavy};5@Nacelle Black';
    src: url("#{$nacelle-font-path}Nacelle-Black};5 @Nacelle Light';
    src: url("#{$nacelle-font-path}Nacelle-Light};5
D8]xt6$ebgaramond-font-path: "/fonts/ebgaramond/" !default;
!
EBGaramondq.ebgaramond-font-path}EBGaramond-VariableFont_wB"EBGaramond Italicq5ebgaramond-font-path}EBGaramond-Italic-VariableFont_w}

/*1 
EBGaramondebgaramond-font-path}EBGaramondS2EBGaramond Bold Italicq*ebgaramond-font-path}EBGaramond-BoldItalicN2EBGaramond Extra)ebgaramond-font-path}EBGaramond-ExtraBoldN2EBGaramond Extra Bold Italicq/ebgaramond-font-path}EBGaramond-ExtraBoldItalicO
EBGaramond
ebgaramond-font-path}EBGaramondAW2EBGaramond Semi Bold Italicq.ebgaramond-font-path}EBGaramond-SemiBoldItalicOfont-family: 'EBGaramond Mediumq&ebgaramond-font-path}EBGaramond-MediumO&font-family: 'EBGaramond Medium Italicq,ebgaramond-font-path}EBGaramond-MediumItalicO font-family: 'EBGaramond Regularqebgaramond-font-path}EBGaramondV*/?ͼx\$epilogue-font-path: "/fonts/epilogue/" !default;


/*** Aileron**/
@font-face {
    font-family: 'Epilogue';
    src: url("#{$epilogue-font-path}Epilogue-VariableFont_wght.ttf") format("truetype");
}
@font-face {
    font-family: 'Epilogue Italic';
    src: url("#{$epilogue-font-path}Epilogue-Italic-VariableFont_wght.ttf") format("truetype");
}
O	txE$figtree-font-path: "/fonts/figtree/" !default;


@font-face {
    font-family: 'Figtree';
    src: url("#{$figtree-font-path}Figtree-VariableFont_wght.ttf") format("truetype");
}

@font-face {
    font-family: 'Figtree Italic';
    src: url("#{$figtree-font-path}Figtree-Italic-VariableFont_wght.ttf") format("truetype");
}
lx $fraunces-font-path: "/fonts/fraunces/" !default;

@font-face {
    font-family: 'Fraunces';
    src: url("#{$fraunces-font-path}Fraunces-VariableFontt.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
L
x U$geist-font-path: "/fonts/geist/" !default;


@font-face {
    font-family: 'Geist';
    src: url("#{$geist-font-path}Geist-VariableFont_wght.ttf") format("truetype");
}
F8@x $glassantiqua-font-path: "/fonts/glassantiqua/" !default;

@font-face {
    font-family: 'Glass Antiqua';
    src: url("#{$glassantiqua-font-path}GlassAntiqua-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
Rx$iceland-font-path: "/fonts/iceland/" !default;

@font-face {
    font-family: "Iceland Regular";
    src: local(Lato Regular), url('#{$iceland-font-path}Iceland-Regular.ttf');
    src: url("#{$iceland-font-path}Iceland-Regular.ttf") format("truetype");
    font-weight: 400;
}
[8x%$inter-font-path: "/fonts/inter/" !default;

/*
@font-face {
    font-family: 'Inter';
    src: urlll("#{$inter-font-path}Inter-V.otf") format("otf");
    font-weight: normal;
    font-style: normal;
}
*/


@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 100;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-Thin.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-Thin.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 100;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-ThinItalic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-ThinItalic.woff") format("woff");
}

@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 200;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-ExtraLight.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-ExtraLight.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 200;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-ExtraLightItalic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-ExtraLightItalic.woff") format("woff");
}

@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 300;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-Light.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-Light.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 300;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-LightItalic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-LightItalic.woff") format("woff");
}

@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 400;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-Regular.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-Regular.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 400;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-Italic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-Italic.woff") format("woff");
}

@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 500;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-Medium.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-Medium.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 500;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-MediumItalic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-MediumItalic.woff") format("woff");
}

@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 600;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-SemiBold.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-SemiBold.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 600;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-SemiBoldItalic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-SemiBoldItalic.woff") format("woff");
}

@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 700;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-Bold.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-Bold.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 700;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-BoldItalic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-BoldItalic.woff") format("woff");
}

@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 800;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-ExtraBold.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-ExtraBold.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 800;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-ExtraBoldItalic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-ExtraBoldItalic.woff") format("woff");
}

@font-face {
  font-family: 'Inter';
  font-style:  normal;
  font-weight: 900;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-Black.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-Black.woff") format("woff");
}
@font-face {
  font-family: 'Inter';
  font-style:  italic;
  font-weight: 900;
  font-display: swap;
  src: url("#{$inter-font-path}Inter-BlackItalic.woff2") format("woff2"),
       url("#{$inter-font-path}Inter-BlackItalic.woff") format("woff");
}
/^e$xJ$josefin-font-path: "/fonts/josefin/" !default;


@font-face {
    font-family: "Josefin Sans";
    src: local(Julius Sans One), url('#{$josefin-font-path}JosefinSans-VariableFont_wght.ttf');
    src: url("#{$josefin-font-path}JosefinSans-VariableFont_wght.ttf") format("truetype");
    font-weight: 500;
}

@font-face {
    font-family: "Josefin Sans Italic";
    src: local(Julius Sans One), url('#{$josefin-font-path}JosefinSans-Italic-VariableFont_wght.ttf');
    src: url("#{$josefin-font-path}JosefinSans-Italic-VariableFont_wght.ttf") format("truetype");
    font-weight: 500;
}
5x>$juliussansone-font-path: "/fonts/juliussansone/" !default;


@font-face {
    font-family: "Julius Sans One";
    src: local(Julius Sans One), url('#{$juliussansone-font-path}JuliusSansOne-Regular.ttf');
    src: url("#{$juliussansone-font-path}JuliusSansOne-Regular.ttf") format("truetype");
    font-weight: 500;
}
lx2$karla-font-path: "/fonts/karla/" !default;

@font-face {
    font-family: 'Karla';
    src: url("#{$karla-font-path}Karla-VariableFont_wght.ttf") format("truetype");
}
@font-face {
    font-family: 'Karla Italic';
    src: url("#{$karla-font-path}Karla-Italic-VariableFont_wght.ttf") format("truetype");
}Ne=x,$kollektif-font-path: "/fonts/kollektif-webfont/" !default;


/*** Kollektif**/
@font-face {
    font-family: 'Kollektif Bold';
    src: url("#{$kollektif-font-path}kollektif-bold-webfont.ttf") format("truetype"),
         url('#{$kollektif-font-path}kollektif-bold-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$kollektif-font-path}kollektif-bold-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}
@font-face {
    font-family: 'Kollektif Regular';
    src: url("#{$kollektif-font-path}kollektif-webfont.ttf") format("truetype"),
         url('#{$kollektif-font-path}kollektif-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$kollektif-font-path}kollektif-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}


.kollektif-bold {
  font-family: 'kollektifbold';
}

.kollektif {
  font-family: 'kollektifregular';
}
{D/x$lato-font-path: "/fonts/lato/" !default;


@font-face {
    font-family: "Lato Black";
    src: local(Lato Black), url('#{$lato-font-path}Lato-Black.ttf');
    src: url("#{$lato-font-path}Lato-Black.ttf") format("truetype");
    font-weight: 500;
}
@font-face {
    font-family: "Lato Regular";
    src: local(Lato Regular), url('#{$lato-font-path}Lato-Regular.ttf');
    src: url("#{$lato-font-path}Lato-Regular.ttf") format("truetype");
    font-weight: 400;
}
@font-face {
  font-family: "Lato Medium";
  src: local(Lato Regular), url('#{$lato-font-path}Lato-Medium.ttf');
  src: url("#{$lato-font-path}Lato-Medium.ttf") format("truetype");
  font-weight: 500;
}


.lato-black {
  font-family: "Lato Black";
}

.lato-regular {
  font-family: "Lato Regular";
}
q+ox +$leaguespartan-font-path: "/fonts/leaguespartan/" !default;


@font-face {
    font-family: "League Spartan";
    src: url("#{$leaguespartan-font-path}LeagueSpartan-VariableFont_wght.ttf") format("truetype");
}

F8Hx $lexend-font-path: "/fonts/lexend/" !default;


@font-face {
    font-family: 'Lexend';
    src: url("#{$lexend-font-path}Lexend-VariableFont_wght.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
t%J6xg$librebaskerville-font-path: "/fonts/librebaskerville/" !default;

@font-face {
    font-family: "Libre Baskerville Bold";
    src: local(Lato Black), url('#{$librebaskerville-font-path}LibreBaskerville-Bold.ttf');
    src: url("#{$librebaskerville-font-path}LibreBaskerville-Bold.ttf") format("truetype");
    font-weight: 500;
}
@font-face {
  font-family: "Libre Baskerville Italic";
    src: local(Lato Regular), url('#{$librebaskerville-font-path}LibreBaskerville-Bold.ttf');
    src: url("#{$librebaskerville-font-path}LibreBaskerville-Bold.ttf") format("truetype");
    font-weight: 400;
}

@font-face {
  font-family: "Libre Baskerville Regular";
    src: local(Lato Regular), url('#{$librebaskerville-font-path}LibreBaskerville-Regular.ttf');
    src: url("#{$librebaskerville-font-path}LibreBaskerville-Regular.ttf") format("truetype");
    font-weight: 400;
}
(Դx $limelight-font-path: "/fonts/limelight/" !default;

@font-face {
    font-family: 'Limelight';
    src: url("#{$limelight-font-path}Limelight-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
SL2x,$lora-font-path: "/fonts/lora/" !default;

@font-face {
    font-family: "Lora";
    src: url("#{$lora-font-path}Lora-VariableFont_wght.ttf") format("truetype");
}

@font-face {
    font-family: "Lora Italic";
    src: url("#{$lora-font-path}Lora-Italic-VariableFont_wght.ttf") format("truetype");
}
cxF$manrope-font-path: "/fonts/manrope/" !default;



/*
@font-face {
  font-family: "Manrope";
  src: url("#{$manrope-font-path}Manrope-VariableFont_wght.ttf") format("truetype");
}
*/


@font-face {
    font-family: 'Manrope';
    src: url("#{$manrope-font-path}Manrope-V.otf") format("otf");
    font-weight: normal;
    font-style: normal;
}




@font-face {
  font-family: 'Manrope';
  font-style:  normal;
  font-weight: 200;
  font-display: swap;
  src: url("#{$manrope-font-path}Manrope-ExtraLight.woff2") format("woff2"),
       url("#{$manrope-font-path}Manrope-ExtraLight.woff") format("woff");
}

@font-face {
  font-family: 'Manrope';
  font-style:  normal;
  font-weight: 300;
  font-display: swap;
  src: url("#{$manrope-font-path}Manrope-Light.woff2") format("woff2"),
       url("#{$manrope-font-path}Manrope-Light.woff") format("woff");
}

@font-face {
  font-family: 'Manrope';
  font-style:  normal;
  font-weight: 400;
  font-display: swap;
  src: url("#{$manrope-font-path}Manrope-Regular.woff2") format("woff2"),
       url("#{$manrope-font-path}Manrope-Regular.woff") format("woff");
}

@font-face {
  font-family: 'Manrope';
  font-style:  normal;
  font-weight: 500;
  font-display: swap;
  src: url("#{$manrope-font-path}Manrope-Medium.woff2") format("woff2"),
       url("#{$manrope-font-path}Manrope-Medium.woff") format("woff");
}

@font-face {
  font-family: 'Manrope';
  font-style:  normal;
  font-weight: 600;
  font-display: swap;
  src: url("#{$manrope-font-path}Manrope-SemiBold.woff2") format("woff2"),
       url("#{$manrope-font-path}Manrope-SemiBold.woff") format("woff");
}

@font-face {
  font-family: 'Manrope';
  font-style:  normal;
  font-weight: 700;
  font-display: swap;
  src: url("#{$manrope-font-path}Manrope-Bold.woff2") format("woff2"),
       url("#{$manrope-font-path}Manrope-Bold.woff") format("woff");
}

@font-face {
  font-family: 'Manrope';
  font-style:  normal;
  font-weight: 800;
  font-display: swap;
  src: url("#{$manrope-font-path}Manrope-ExtraBold.woff2") format("woff2"),
       url("#{$manrope-font-path}Manrope-ExtraBold.woff") format("woff");
}

xC$merriweather-font-path: "/fonts/merriweather/" !default;


@font-face {
    font-family: 'Merriweather Regular';
    src: url("#{$merriweather-font-path}merriweather-regular-webfont.ttf");
}

@font-face {
    font-family: 'Merriweather Italic';
    src: url("#{$merriweather-font-path}merriweather-italic-webfont.ttf");
}
F5o[xN$opensans-font-path: "/fonts/opensans/" !default;


@font-face {
  font-family: 'Open Sans';
  src: url("#{$opensans-font-path}OpenSans-VariableFont_wdth.ttf") format("truetype");
  font-style: normal;
}

@font-face {
  font-family: 'Open Sans Italic';
  src: url("#{$opensans-font-path}OpenSans-Italic-VariableFont_wdth.ttf") format("truetype");
  font-style: italic;
}

/*
@font-face {
    font-family: 'Open Sans Bold';
    src: url("#{$opensans-font-path}OpenSans-Bold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-bold {
  font-family: 'Open Sans Bold';
}


@font-face {
    font-family: 'Open Sans Bold Italic';
    src: url("#{$opensans-font-path}OpenSans-BoldItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-bold-italic {
  font-family: 'Open Sans Bold Italic';
}


@font-face {
    font-family: 'Open Sans Extra Bold';
    src: url("#{$opensans-font-path}OpenSans-ExtraBold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-extra-bold {
  font-family: 'Open Sans Extra Bold';
}


@font-face {
    font-family: 'Open Sans Extra Bold Italic';
    src: url("#{$opensans-font-path}Open Sans-ExtraBoldItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-extra-bold-italic {
  font-family: 'Open Sans Extra Bold Italic';
}


@font-face {
    font-family: 'Open Sans Italic';
    src: url("#{$opensans-font-path}OpenSans-Italic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-italic {
  font-family: 'Open Sans Italic';
}


@font-face {
    font-family: 'Open Sans Light';
    src: url("#{$opensans-font-path}OpenSans-Light.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-light {
  font-family: 'Open Sans Light';
}

@font-face {
    font-family: 'Open Sans Light Italic';
    src: url("#{$opensans-font-path}OpenSans-LightItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-light-italic {
  font-family: 'Open Sans Light Italic';
}



@font-face {
    font-family: 'Open Sans Regular';
    src: url("#{$opensans-font-path}OpenSans-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-regular {
  font-family: 'Open Sans Regular';
}


@font-face {
    font-family: 'Open Sans Semi Bold';
    src: url("#{$opensans-font-path}OpenSans-SemiBold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-semibold {
  font-family: 'Open Sans Semi Bold';
}


@font-face {
    font-family: 'Open Sans Semi Bold Italic';
    src: url("#{$opensans-font-path}OpenSans-SemiBoldItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.opensans-semibold-italic {
  font-family: 'Open Sans Semi Bold Italic';
}
*/0@U\xP5$metropolis-font-path: "/fonts/metropolis/" !default;q"Metropolis Regular+metropolis-font-path}Metropolis-Regular.otf8`Metropolis Regular1metropolis-font-path}Metropolis-RegularItalic.otf8`Metropolis Medium*metropolis-font-path}Metropolis-Medium.otf8`Metropolis Medium0metropolis-font-path}Metropolis-MediumItalic.otf8`
Metropolisp	(metropolis-font-path}Metropolis-Bold.otf8`
Metropolis .metropolis-font-path}Metropolis-BoldItalic.otf8`Metropolis Extrap	(metropolis-font-path}Metropolis-Bold.otf8`	Metropoli'.metropolis-font-path}Metropolis-BoldItalic.otf8`Metropolis Black)metropolis-font-path}Metropolis-Black.otf8`	Metropolij	,metropolis-font-path}Metropolis-SemiBold.otf8`	Metropoli'2metropolis-font-path}Metropolis-SemiBoldItalic.otf8`Metropolis Thin(metropolis-font-path}Metropolis-Thin.otf8`Metropolis Thin.metropolis-font-path}Metropolis-ThinItalic.otf8`Metropolis Light)metropolis-font-path}Metropolis-Light.otf8`Metropolis Light/metropolis-font-path}Metropolis-LightItalic.otf8`Metropolis Extra Light.metropolis-font-path}Metropolis-ExtraLight.otf8`Metropolis Extra Light4metropolis-font-path}Metropolis-ExtraLightItalic.otf7';x .$monasans-font-path: "/fonts/monasans/" !default;


@font-face {
  font-family: 'Mona Sans';
  src: url("#{$monasans-font-path}Mona-Sans.ttf") format("truetype");
  font-weight: normal;
  font-style: normal;
}ʾFelx9$montserrat-font-path: "/fonts/montserrat/" !default;

@font-face {
    font-family: "Montserrat";
    src: url("#{$montserrat-font-path}Montserrat-VariableFont_wght.ttf") format("truetype")
}
/*
@font-face {
    font-family: "Montserrat Light";
    src: local(Montserrat Light), url('#{$montserrat-font-path}Montserrat-Light.ttf');
    src: url("#{$montserrat-font-path}Montserrat-Light.ttf") format("truetype");
    font-weight: 300;
}
@font-face {
    font-family: "Montserrat Regular";
    src: local(Montserrat Regular), url('#{$montserrat-font-path}Montserrat-Regular.ttf');
    src: url("#{$montserrat-font-path}Montserrat-Regular.ttf") format("truetype");
    font-weight: 400; 
}
@font-face {
    font-family: "Montserrat Bold";
    src: local(Montserrat Bold), url('#{$montserrat-font-path}Montserrat-Bold.ttf');
    src: url("#{$montserrat-font-path}Montserrat-Bold.ttf") format("truetype");
    font-weight: 700;
}

@font-face {
    font-family: "Montserrat Semi Bold";
    src: local(Montserrat Semi Bold), url('#{$montserrat-font-path}Montserrat-SemiBold.ttf');
    src: url("#{$montserrat-font-path}Montserrat-SemiBold.ttf") format("truetype");
    font-weight: 600;
}

@font-face {
    font-family: "Montserrat Medium";
    src: local(Montserrat Medium), url('#{$montserrat-font-path}Montserrat-Medium.ttf');
    src: url("#{$montserrat-font-path}Montserrat-Medium.ttf") format("truetype");
    font-weight: 600;
}

@font-face {
    font-family: "Montserrat Hairline";
    src: local(Montserrat Hairline), url('#{$montserrat-font-path}Montserrat-Hairline.ttf');
    src: url("#{$montserrat-font-path}Montserrat-Hairline.ttf") format("truetype");
    font-weight: 100;
}

.montserrat {
  font-family: "Montserrat";
}
*/Ix$norwester-font-path: "/fonts/norwester/" !default;

/*** Norwester ***/
@font-face {
    font-family: 'Norwester';
    src: url("#{$norwester-font-path}norwester-webfont.ttf") format("truetype"),
         url('#{$norwester-font-path}norwester-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$norwester-font-path}norwester-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}



.norwester {
  font-family: 'norwesterregular';
}
Exh$notosans-font-path: "/fonts/notosans/" !default;


/*** Aileron**/
@font-face {
    font-family: 'Noto Sans';
    src: url("#{$notosans-font-path}NotoSans-VariableFont_wdth,wght.ttf") format("truetype");
}
@font-face {
    font-family: 'Noto Sans Italic';
    src: url("#{$notosans-font-path}NotoSans-Italic-VariableFont_wdth,wght.ttf") format("truetype");
}
x;xO$nuntio-font-path: "/fonts/nunito/" !default;


@font-face {
    font-family: 'Nunito';
    src: url("#{$nuntio-font-path}Nunito-VariableFont_wght.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Nunito Italic';
    src: url("#{$nuntio-font-path}Nunito-Italic-VariableFont_wght.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

/*
@font-face {
    font-family: 'Nunito Regular';
    src: url("#{$nuntio-font-path}Nunito-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Nunito Light';
    src: url("#{$nuntio-font-path}Nunito-Light.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Nunito Semi Bold';
    src: url("#{$nuntio-font-path}Nunito-SemiBold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
*/6ưx O$oswald-font-path: "/fonts/oswald/" !default;


@font-face {
    font-family: "Oswald";
    src: url("#{$oswald-font-path}Oswald-VariableFont_wght.ttf") format("truetype");
}

X:fx O$outfit-font-path: "/fonts/outfit/" !default;


@font-face {
    font-family: 'Outfit';
    src: url("#{$outfit-font-path}Outfit-VariableFont_wght.ttf") format("truetype");
}

9:Żx;$overused-font-path: "/fonts/overused/" !default;


@font-face {
    font-family: "Overused";
    src: url("#{$overused-font-path}OverusedGrotesk-VF.ttf") format("truetype");
}

@font-face {
    font-family: "Overused Italic";
    src: url("#{$overused-font-path}OverusedGroteskRoman-VF.ttf") format("truetype");
}
i̸xw$playfairdisplay-font-path: "/fonts/playfair_display/" !default;


@font-face {
    font-family: "Playfair Display";
    src: url("#{$playfairdisplay-font-path}PlayfairDisplay-VariableFont_wght.ttf") format("truetype");
}

@font-face {
    font-family: "Playfair Display Italic";
    src: url("#{$playfairdisplay-font-path}PlayfairDisplay-Italic-VariableFont_wght.ttf") format("truetype");
}
I/xv$plusJakartasans-font-path: "/fonts/plusjakatasans/" !default;


@font-face {
    font-family: 'Plus Jakarta Sans';
    src: url("#{$plusJakartasans-font-path}PlusJakartaSans-VariableFont_wght.ttf") format("truetype");
}

@font-face {
    font-family: 'Plus Jakarta Sans Italic';
    src: url("#{$plusJakartasans-font-path}PlusJakartaSans-Italic-VariableFont_wght.ttf") format("truetype");
}
 +:hx|$poppins-font-path: "/fonts/poppins/" !default;

/*** Poppins ***/
@font-face {
    font-family: 'Poppins Regular';
    src: url("#{$poppins-font-path}poppins-regular-webfont.ttf") format("truetype"),
         url('#{$poppins-font-path}poppins-regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$poppins-font-path}poppins-regular-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Poppins Medium';
    src: url("#{$poppins-font-path}poppins-medium-webfont.ttf") format("truetype"),
         url('#{$poppins-font-path}poppins-medium-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$poppins-font-path}poppins-medium-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Poppins Light';
    src: url("#{$poppins-font-path}poppins-light-webfont.ttf") format("truetype"),
         url('#{$poppins-font-path}poppins-light-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$poppins-font-path}poppins-light-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Poppins Semi Bold';
    src: url("#{$poppins-font-path}poppins-semibold-webfont.ttf") format("truetype"),
         url('#{$poppins-font-path}poppins-semibold-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$poppins-font-path}poppins-semibold-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}
( !x	2$worksans-font-path: "/fonts/worksans/" !default;
a!	Work Sansq,worksans-font-path}WorkSans-VariableFont_wgh;
} Work Sans Italicq3worksans-font-path}WorkSans-Italic-VariableFont_wgh;
}

/* Work Sans Boldq worksans-font-path}WorkSans-Bold;5b Work Sans Extra Boldq%worksans-font-path}WorkSans-ExtraBold;5b Work Sans Lightq worksans-font-path}WorkSans-Ligh;5b Work Sag#worksans-font-path}WorkSans-Regular;5b Work Sa $worksans-font-path}WorkSans-SemiBold;4*/wx $questrial-font-path: "/fonts/questrial/" !default;


/*** Aileron**/
@font-face {
    font-family: 'Questrial Regular';
    src: url("#{$questrial-font-path}Questrial-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
Sٱx$quicksand-font-path: "/fonts/quicksand/" !default;


/*** Aileron**/
@font-face {
    font-family: 'Quicksand';
    src: url("#{$quicksand-font-path}Quicksand-VariableFont_wght.ttf") format("truetype");
    //font-weight: normal;
    font-style: normal;
}
^Tֺxu$raleway-font-path: "/fonts/raleway/" !default;

@font-face {
  font-family: 'Raleway';
  src: url("#{$commissioner-font-path}Raleway-VariableFont_wght.ttf") format("truetype");
}

@font-face {
  font-family: 'Raleway Italic';
  src: url("#{$commissioner-font-path}Raleway-Italic-VariableFont_wght.ttf") format("truetype");
}

/*
@font-face {
    font-family: 'Raleway Black';
    src: url("#{$raleway-font-path}Raleway-Black.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-black {
  font-family: 'Raleway Black';
}

@font-face {
    font-family: 'Raleway Black Italic';
    src: url("#{$raleway-font-path}Raleway-BlackItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-black-italic {
  font-family: 'Raleway Black Italic';
}



@font-face {
    font-family: 'Raleway Bold';
    src: url("#{$raleway-font-path}Raleway-Bold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-bold {
  font-family: 'Raleway Bold';
}


@font-face {
    font-family: 'Raleway Bold Italic';
    src: url("#{$raleway-font-path}Raleway-BoldItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-bold-italic {
  font-family: 'Raleway Bold Italic';
}


@font-face {
    font-family: 'Raleway Extra Bold';
    src: url("#{$raleway-font-path}Raleway-ExtraBold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-extra-bold {
  font-family: 'Raleway Extra Bold';
}


@font-face {
    font-family: 'Raleway Extra Bold Italic';
    src: url("#{$raleway-font-path}Raleway-ExtraBoldItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-extra-bold-italic {
  font-family: 'Raleway Extra Bold Italic';
}


@font-face {
    font-family: 'Raleway Extra Light';
    src: url("#{$raleway-font-path}Raleway-ExtraLight.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-extra-light {
  font-family: 'Raleway Extra Light';
}

@font-face {
    font-family: 'Raleway Extra Light Italic';
    src: url("#{$raleway-font-path}Raleway-ExtraLightItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-extra-light-italic {
  font-family: 'Raleway Extra Light Italic';
}


@font-face {
    font-family: 'Raleway Italic';
    src: url("#{$raleway-font-path}Raleway-Italic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-italic {
  font-family: 'Raleway Italic';
}


@font-face {
    font-family: 'Raleway Light';
    src: url("#{$raleway-font-path}Raleway-Light.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-light {
  font-family: 'Raleway Light';
}

@font-face {
    font-family: 'Raleway Light Italic';
    src: url("#{$raleway-font-path}Raleway-LightItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-light-italic {
  font-family: 'Raleway Light Italic';
}


@font-face {
    font-family: 'Raleway Medium';
    src: url("#{$raleway-font-path}Raleway-Medium.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-medium {
  font-family: 'Raleway Medium';
}


@font-face {
    font-family: 'Raleway Medium Italic';
    src: url("#{$raleway-font-path}Raleway-MediumItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-medium-italic {
  font-family: 'Raleway Medium Italic';
}


@font-face {
    font-family: 'Raleway Regular';
    src: url("#{$raleway-font-path}Raleway-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-regular {
  font-family: 'Raleway Regular';
}


@font-face {
    font-family: 'Raleway Semi Bold';
    src: url("#{$raleway-font-path}Raleway-SemiBold.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-semibold {
  font-family: 'Raleway Semi Bold';
}


@font-face {
    font-family: 'Raleway Semi Bold Italic';
    src: url("#{$raleway-font-path}Raleway-SemiBoldItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-semibold-italic {
  font-family: 'Raleway Semi Bold Italic';
}


@font-face {
    font-family: 'Raleway Thin';
    src: url("#{$raleway-font-path}Raleway-Thin.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-thin {
  font-family: 'Raleway Thin';
}


@font-face {
    font-family: 'Raleway Thin Italic';
    src: url("#{$raleway-font-path}Raleway-ThinItalic.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

.raleway-thin-italic {
  font-family: 'Raleway Thin Italic';
}
*/&:xV$roboto-font-path: "/fonts/roboto/" !default;

/****************************************************************
ROBOTO
****************************************************************/
@font-face {
    font-family: "Roboto";
    src: url("#{$roboto-font-path}Roboto-Thin.ttf") format("truetype");
    font-weight: 200;
}
@font-face {
    font-family: "Roboto Light";
    src:  url("#{$roboto-font-path}Roboto-Light.ttf") format("truetype");
    font-weight: 300;
}

@font-face {
    font-family: "Roboto Regular";
    src: url("#{$roboto-font-path}Roboto-Regular.ttf") format("truetype");
    font-weight: 400;
}

@font-face {
    font-family: "Roboto Medium";
    src: url("#{$roboto-font-path}Roboto-Medium.ttf") format("truetype");
    font-weight: 500;
}

@font-face {
    font-family: "Roboto";
    src: url("#{$roboto-font-path}Roboto-Bold.ttf") format("truetype");
    font-weight: 700;
}



.roboto {
  font-family: "Roboto";
}
82x~$robotocondensed-font-path: "/fonts/robotocondensed/" !default;

@font-face {
  font-family: 'Roboto Condensed';
  src: url("#{$robotocondensed-font-path}RobotoCondensed-VariableFont_wght.ttf") format("truetype");
}

@font-face {
  font-family: 'Roboto Condensed Italic';
  src: url("#{$robotocondensed-font-path}RobotoCondensed-Italic-VariableFont_wght.ttf") format("truetype");
}
x\$robotomono-font-path: "/fonts/robotomono/" !default;

@font-face {
    font-family: 'Ronotomono';
    src: url("#{$robotomono-font-path}RobotoMono-VariableFont_wght.ttf") format("truetype");
}

@font-face {
    font-family: 'Ronotomono Italic';
    src: url("#{$robotomono-font-path}RobotoMono-Italic-VariableFont_wght.ttf") format("truetype");
}
,wx :$robotoslab-font-path: "/fonts/robotoslab/" !default;


@font-face {
    font-family: "Roboto Slab";
    src: url("#{$robotoslab-font-path}RobotoSlab-VariableFont_wght.ttf") format("truetype");
}

Bx4$rubik-font-path: "/fonts/rubik/" !default;

@font-face {
    font-family: 'Rubik';
    src: url("#{$rubik-font-path}Rubik-VariableFont_wght.ttf") format("truetype");
}

@font-face {
    font-family: 'Rubik Italic';
    src: url("#{$rubik-font-path}Rubik-Italic-VariableFont_wght.ttf") format("truetype");
}
XQf x
$sacramento-font-path: "/fonts/sacramento/" !default;


@font-face {
    font-family: 'Sacramento Regular';
    font-style: normal;
    src: url("#{$sacramento-font-path}Sacramento-Regular.ttf") format("truetype"),
         url('#{$sacramento-font-path}sacramento-regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$sacramento-font-path}sacramento-regular-webfont.woff') format('woff'); /* Modern Browsers */

    font-weight: 400;
}


.sacramento {
  font-family: 'sacramentoregular';
}
uxo$satoshi-font-path: "/fonts/satoshi/" !default;


@font-face {
    font-family: 'Satoshi';
    src: url("#{$satoshi-font-path}Satoshi-Variable.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Satoshi Semi Bold';
    src: url("#{$satoshi-font-path}Satoshi-Variable.ttf") format("truetype");
    font-weight:bolder;
    font-style: normal;
}
dx$sifonn-font-path: "/fonts/sifonn/" !default;

/*** Sifonn ***/
@font-face {
    font-family: 'Sifonn';
    src: url("#{$sifonn-font-path}sifonn_basic-webfont.ttf") format("truetype"),
         url('#{$sifonn-font-path}sifonn_basic-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$sifonn-font-path}sifonn_basic-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}


.sifonn {
  font-family: 'sifonnbasic';
}
x *$sixcaps-font-path: "/fonts/six-caps/" !default;


@font-face {
    font-family: 'Six Caps';
    src: url("#{$sixcaps-font-path}SixCaps.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
_Evx@$sora-font-path: "/fonts/sora/" !default;

@font-face {
    font-family: 'Sora';
    src: url("#{$sora-font-path}Sora[wght].ttf") format("truetype");
}
@font-face {
    font-family: 'Sora Italic';
    src: url("#{$sora-font-path}Sora-Italic[wght].ttf") format("truetype");
}

.sora-regular {
    letter-spacing: -0.5%;
}dgxr$sourcesanspro-font-path: "/fonts/sourcesanspro/" !default;

/*** Source Sans Pro ***/
@font-face {
    font-family: 'Source Sans Pro';
    src: url("#{$sourcesanspro-font-path}SourceSans3-VariableFont_wght.ttf") format("truetype");
}
@font-face {
    font-family: 'Source Sans Pro Italic';
    src: url("#{$sourcesanspro-font-path}SourceSans3-Italic-VariableFont_wght.ttf") format("truetype");
}
${x
$sourceserifpro-font-path: "/fonts/sourceserifpro/" !default;

/*** Source Sans Pro ***/
@font-face {
    font-family: 'Source Serif Pro Black';
    src: url("#{$sourceserifpro-font-path}sourceserifpro-black-webfont.ttf") format("truetype"),
         url('#{$sourceserifpro-font-path}sourceserifpro-black-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$sourceserifpro-font-path}sourceserifpro-black-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Source Serif Pro Bold';
    src: url("#{$sourceserifpro-font-path}sourceserifpro-bold-webfont.ttf") format("truetype"),
         url('#{$sourceserifpro-font-path}sourceserifpro-bold-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$sourceserifpro-font-path}sourceserifpro-bold-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Source Serif Pro SemiBold';
    src: url("#{$sourceserifpro-font-path}sourceserifpro-semibold-webfont.ttf") format("truetype"),
         url('#{$sourceserifpro-font-path}sourceserifpro-semibold-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$sourceserifpro-font-path}sourceserifpro-semibold-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Source Serif Pro ExtraLight';
    src: url("#{$sourceserifpro-font-path}sourceserifpro-extralight-webfont.ttf") format("truetype"),
         url('#{$sourceserifpro-font-path}sourceserifpro-extralight-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$sourceserifpro-font-path}sourceserifpro-extralight-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Source Serif Pro Light';
    src: url("#{$sourceserifpro-font-path}sourceserifpro-light-webfont.ttf") format("truetype"),
         url('#{$sourceserifpro-font-path}sourceserifpro-light-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$sourceserifpro-font-path}sourceserifpro-light-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Source Serif Pro Regular';
    src: url("#{$sourceserifpro-font-path}sourceserifpro-regular-webfont.ttf") format("truetype"),
         url('#{$sourceserifpro-font-path}sourceserifpro-regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */
         url('#{$sourceserifpro-font-path}sourceserifpro-regular-webfont.woff') format('woff'); /* Modern Browsers */
    font-weight: normal;
    font-style: normal;
}
pAx 1$spacegrotesk-font-path: "/fonts/spacegrotesk/" !default;

@font-face {
    font-family: "Space Grotesk";
    src: url("#{$spacegrotesk-font-path}SpaceGrotesk-VariableFont_wght.ttf") format("truetype");
}

F$xH$spacemono-font-path: "/fonts/spacemono/" !default;


@font-face {
    font-family: 'Space Mono Bold';
    src: url("#{$spacemono-font-path}SpaceMono-Bold.ttf") format("truetype");
}

@font-face {
  font-family: 'Space Mono Bold Italic';
  src: url("#{$spacemono-font-path}SpaceMono-BoldItalic.ttf") format("truetype");
}

@font-face {
  font-family: 'Space Mono Italic';
  src: url("#{$spacemono-font-path}SpaceMono-Italic.ttf") format("truetype");
}

@font-face {
  font-family: 'Space Mono Regular';
  src: url("#{$spacemono-font-path}SpaceMono-Regular.ttf") format("truetype");
}
׾x 1$unbounded-font-path: "/fonts/unbounded/" !default;


/*** Aileron**/
@font-face {
    font-family: 'Unbounded';
    src: url("#{$unbounded-font-path}Unbounded-VariableFont_wght.ttf") format("truetype");
}
bDxJ$urbanist-font-path: "/fonts/urbanist/" !default;

@font-face {
    font-family: 'Urbanist';
    src: url("#{$urbanist-font-path}Urbanist-VariableFont_wght.ttf") format("truetype");
}
@font-face {
    font-family: 'Urbanist Italic';
    src: url("#{$urbanist-font-path}Urbanist-Italic-VariableFont_wght.ttf") format("truetype");
}TpֿxP$vollkorn-font-path: "/fonts/vollkorn/" !default;


@font-face {
    font-family: 'Vollkorn';
    src: url("#{$vollkorn-font-path}Vollkorn-VariableFont_wght.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'Vollkorn Italic';
    src: url("#{$vollkorn-font-path}Vollkorn-Italic-VariableFont_wght.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
x $whisper-font-path: "/fonts/whisper/" !default;

@font-face {
    font-family: 'Whisper Regular';
    src: url("#{$whisper-font-path}Whisper-Regular.ttf") format("truetype");
    font-weight: normal;
    font-style: normal;
}
IKsXx~$zillaslab-font-path: "/fonts/zillaslab/" !default;


@font-face {
    font-family: 'Zilla Slab Bold';
    src: url("#{$zillaslab-font-path}ZillaSlab-Bold.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Bold Italic';
  src: url("#{$zillaslab-font-path}ZillaSlab-BoldItalic.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Italic';
  src: url("#{$zillaslab-font-path}ZillaSlab-Italic.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Regular';
  src: url("#{$zillaslab-font-path}ZillaSlab-Regular.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Light';
  src: url("#{$zillaslab-font-path}ZillaSlab-Light.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Light Italic';
  src: url("#{$zillaslab-font-path}ZillaSlab-LightItalic.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Medium';
  src: url("#{$zillaslab-font-path}ZillaSlab-Medium.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Medium Italic';
  src: url("#{$zillaslab-font-path}ZillaSlab-MediumItalic.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Semi Bold';
  src: url("#{$zillaslab-font-path}ZillaSlab-SemiBold.ttf") format("truetype");
}

@font-face {
  font-family: 'Zilla Slab Semi Bold Italic';
  src: url("#{$zillaslab-font-path}ZillaSlab-SemiBoldItalic.ttf") format("truetype");
}
!J9xo// ==========================================================================
// SHARED-UI STYLES MAIN ENTRY POINT
// ==========================================================================
// Complete design system including base tokens, semantic tokens, and components
// This is the primary entry point for importing the entire design system
// 
// Usage:
//   @use 'path/to/shared-ui/src/styles' as styles;
//   color: styles.$semantic-color-primary;
//
// For tokens only:
//   @use 'path/to/shared-ui/src/styles/tokens' as tokens;
// ==========================================================================

// Forward semantic layer (includes base tokens automatically)
@forward 'semantic/index'; 


// Forward font faces
@forward 'fontfaces/all-fontfaces';

// Note: Commons should be imported separately to avoid circular dependencies
// Import commons: @use 'path/to/shared-ui/src/styles/commons';&Ժx*3// ==========================================================================
// SEMANTIC TYPOGRAPHY
// ==========================================================================
// Meaningful typography tokens for content hierarchy and UI components
// Maps base typography values to contextual usage patterns
// ==========================================================================
@use '../../base/typography' as *;

// CONTENT HIERARCHY - Semantic text roles
$semantic-typography-heading-display: (
  font-family: $base-typography-font-family-display,
  font-size: $base-typography-font-size-4xl,
  font-weight: $base-typography-font-weight-bold,
  line-height: $base-typography-line-height-tight,
  letter-spacing: $base-typography-letter-spacing-tight,
) !default;

$semantic-typography-heading-h1: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-3xl,
  font-weight: $base-typography-font-weight-bold,
  line-height: $base-typography-line-height-tight,
  letter-spacing: $base-typography-letter-spacing-tight,
) !default;

$semantic-typography-heading-h2: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-2xl,
  font-weight: $base-typography-font-weight-semibold,
  line-height: $base-typography-line-height-snug,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-heading-h3: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-xl,
  font-weight: $base-typography-font-weight-semibold,
  line-height: $base-typography-line-height-snug,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-heading-h4: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-lg,
  font-weight: $base-typography-font-weight-medium,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-heading-h5: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-md,
  font-weight: $base-typography-font-weight-medium,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-font-family-sans: $base-typography-font-family-sans !default;
$semantic-typography-font-family-serif: $base-typography-font-family-serif !default;
$semantic-typography-font-family-mono: $base-typography-font-family-mono !default;
$semantic-typography-font-family-display: $base-typography-font-family-display !default;



// INDIVIDUAL TOKENS - For easier access in component styles
$semantic-typography-heading-h1-size: $base-typography-font-size-3xl !default;
$semantic-typography-heading-h1-weight: $base-typography-font-weight-bold !default;
$semantic-typography-heading-h1-line-height: $base-typography-line-height-tight !default;

$semantic-typography-heading-h2-size: $base-typography-font-size-2xl !default;
$semantic-typography-heading-h2-weight: $base-typography-font-weight-semibold !default;
$semantic-typography-heading-h2-line-height: $base-typography-line-height-snug !default;

$semantic-typography-heading-h3-size: $base-typography-font-size-xl !default;
$semantic-typography-heading-h3-weight: $base-typography-font-weight-semibold !default;
$semantic-typography-heading-h3-line-height: $base-typography-line-height-snug !default;

$semantic-typography-heading-h4-size: $base-typography-font-size-lg !default;
$semantic-typography-heading-h4-weight: $base-typography-font-weight-medium !default;
$semantic-typography-heading-h4-line-height: $base-typography-line-height-normal !default;

$semantic-typography-heading-h5-size: $base-typography-font-size-md !default;
$semantic-typography-heading-h5-weight: $base-typography-font-weight-medium !default;
$semantic-typography-heading-h5-line-height: $base-typography-line-height-normal !default;

// ICON TYPOGRAPHY - Icon sizing for different contexts
$semantic-typography-icon-small-size: $base-typography-font-size-sm !default;
$semantic-typography-icon-medium-size: $base-typography-font-size-lg !default;
$semantic-typography-icon-large-size: $base-typography-font-size-xl !default;

// BREAKPOINT TOKENS - For responsive adjustments
$semantic-breakpoint-sm: 640px !default;
$semantic-breakpoint-md: 768px !default;
$semantic-breakpoint-lg: 1024px !default;

// BODY TEXT - Content text styles
$semantic-typography-body-large: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-lg,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-relaxed,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-body-medium: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-md,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-relaxed,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-body-small: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-sm,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

// UI COMPONENT TEXT - Interface elements
$semantic-typography-button-large: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-md,
  font-weight: $base-typography-font-weight-medium,
  line-height: $base-typography-line-height-none,
  letter-spacing: $base-typography-letter-spacing-wide,
) !default;

$semantic-typography-button-medium: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-sm,
  font-weight: $base-typography-font-weight-medium,
  line-height: $base-typography-line-height-none,
  letter-spacing: $base-typography-letter-spacing-wide,
) !default;

$semantic-typography-button-small: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-xs,
  font-weight: $base-typography-font-weight-medium,
  line-height: $base-typography-line-height-none,
  letter-spacing: $base-typography-letter-spacing-wider,
) !default;

// FORM TEXT - Input and label styles
$semantic-typography-label: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-sm,
  font-weight: $base-typography-font-weight-medium,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-input: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-md,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-placeholder: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-md,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

// NAVIGATION TEXT - Menu and navigation styles
$semantic-typography-nav-primary: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-md,
  font-weight: $base-typography-font-weight-medium,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-nav-secondary: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-sm,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

// UTILITY TEXT - Captions, tags, etc.
$semantic-typography-caption: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-xs,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-tag: (
  font-family: $base-typography-font-family-sans,
  font-size: $base-typography-font-size-xs,
  font-weight: $base-typography-font-weight-medium,
  line-height: $base-typography-line-height-none,
  letter-spacing: $base-typography-letter-spacing-wide,
) !default;

$semantic-typography-code-inline: (
  font-family: $base-typography-font-family-mono,
  font-size: $base-typography-font-size-sm,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-normal,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

$semantic-typography-code-block: (
  font-family: $base-typography-font-family-mono,
  font-size: $base-typography-font-size-sm,
  font-weight: $base-typography-font-weight-normal,
  line-height: $base-typography-line-height-relaxed,
  letter-spacing: $base-typography-letter-spacing-normal,
) !default;

// INDIVIDUAL SEMANTIC FONT WEIGHTS - Direct access to weight values
$semantic-typography-font-weight-thin: $base-typography-font-weight-thin !default;
$semantic-typography-font-weight-extralight: $base-typography-font-weight-extralight !default;
$semantic-typography-font-weight-light: $base-typography-font-weight-light !default;
$semantic-typography-font-weight-normal: $base-typography-font-weight-normal !default;
$semantic-typography-font-weight-medium: $base-typography-font-weight-medium !default;
$semantic-typography-font-weight-semibold: $base-typography-font-weight-semibold !default;
$semantic-typography-font-weight-bold: $base-typography-font-weight-bold !default;
$semantic-typography-font-weight-extrabold: $base-typography-font-weight-extrabold !default;
$semantic-typography-font-weight-black: $base-typography-font-weight-black !default;

// INDIVIDUAL SEMANTIC FONT SIZES - Direct access to size values
$semantic-typography-font-size-xs: $base-typography-font-size-xs !default;
$semantic-typography-font-size-sm: $base-typography-font-size-sm !default;
$semantic-typography-font-size-md: $base-typography-font-size-md !default;
$semantic-typography-font-size-lg: $base-typography-font-size-lg !default;
$semantic-typography-font-size-xl: $base-typography-font-size-xl !default;
$semantic-typography-font-size-2xl: $base-typography-font-size-2xl !default;
$semantic-typography-font-size-3xl: $base-typography-font-size-3xl !default;
$semantic-typography-font-size-4xl: $base-typography-font-size-4xl !default;
$semantic-typography-font-size-5xl: $base-typography-font-size-5xl !default;
$semantic-typography-font-size-6xl: $base-typography-font-size-6xl !default;
$semantic-typography-font-size-7xl: $base-typography-font-size-7xl !default;
$semantic-typography-font-size-8xl: $base-typography-font-size-8xl !default;
$semantic-typography-font-size-9xl: $base-typography-font-size-9xl !default;
$semantic-typography-font-size-10xl: $base-typography-font-size-10xl !default;
$semantic-typography-font-size-11xl: $base-typography-font-size-11xl !default;

// INDIVIDUAL SEMANTIC LINE HEIGHTS - Direct access to line height values
$semantic-typography-line-height-none: $base-typography-line-height-none !default;
$semantic-typography-line-height-tight: $base-typography-line-height-tight !default;
$semantic-typography-line-height-snug: $base-typography-line-height-snug !default;
$semantic-typography-line-height-normal: $base-typography-line-height-normal !default;
$semantic-typography-line-height-relaxed: $base-typography-line-height-relaxed !default;
$semantic-typography-line-height-loose: $base-typography-line-height-loose !default;
$semantic-typography-line-height-3: $base-typography-line-height-3 !default;
$semantic-typography-line-height-4: $base-typography-line-height-4 !default;
$semantic-typography-line-height-5: $base-typography-line-height-5 !default;
$semantic-typography-line-height-6: $base-typography-line-height-6 !default;
$semantic-typography-line-height-7: $base-typography-line-height-7 !default;
$semantic-typography-line-height-8: $base-typography-line-height-8 !default;
$semantic-typography-line-height-9: $base-typography-line-height-9 !default;
$semantic-typography-line-height-10: $base-typography-line-height-10 !default;

// INDIVIDUAL SEMANTIC LETTER SPACING - Direct access to letter spacing values
$semantic-typography-letter-spacing-tighter: $base-typography-letter-spacing-tighter !default;
$semantic-typography-letter-spacing-tight: $base-typography-letter-spacing-tight !default;
$semantic-typography-letter-spacing-normal: $base-typography-letter-spacing-normal !default;
$semantic-typography-letter-spacing-wide: $base-typography-letter-spacing-wide !default;
$semantic-typography-letter-spacing-wider: $base-typography-letter-spacing-wider !default;
$semantic-typography-letter-spacing-widest: $base-typography-letter-spacing-widest !default;R<	8x cfd INDEX
QContextual typography system,Ka
// Note: base tokens imported at semantic/index level

// Semantic typography mappings
@import '1';I7+x[ ZBORDERS INDEXO(border system for components and UI elemborder	borders';{ 
x UZCOLORS INDEXOH// Meaningful color system that bridges base tokens with component usagecolor=colors';

// Interactive state colors
@import 'state-colors';<INx] ZMOTION INDEXO,motion system for animations and interactionmotionmotion';!"x:x 6ZSHADOWS INDEXO/shadow system for elevation and depth hierarchykImport semantic colors for context-aware shadows
//@import '../colors/semantic-colors';

// Semantic shadowshadows';

fFgx8 ZSIZINGacsizinglayoutsizingsizing';UGxD [PAC]gpac$,pacing mappings
@forward 'semantic-spacing';x( [PAC]gpac$pac pacing';/x?!// ==========================================================================
// SEMANTIC BORDERS
// ==========================================================================
// Meaningful border tokens for components and UI elements
// Maps base border values to contextual usage patterns
// ==========================================================================
@use '../../base/borders' as *;

// COMPONENT BORDERS - UI component border styles
$semantic-border-button-width: $base-border-width-1 !default;              // Standard button border
$semantic-border-button-style: $base-border-style-solid !default;          // Button border style
$semantic-border-button-radius: $base-border-radius-md !default;           // Button corner radius

$semantic-border-input-width: $base-border-width-1 !default;               // Form input border
$semantic-border-input-style: $base-border-style-solid !default;           // Input border style
$semantic-border-input-radius: $base-border-radius-md !default;            // Input corner radius

$semantic-border-card-width: $base-border-width-1 !default;                // Card border width
$semantic-border-card-style: $base-border-style-solid !default;            // Card border style
$semantic-border-card-radius: $base-border-radius-lg !default;             // Card corner radius

// INTERACTION BORDERS - State-based border styles
$semantic-border-focus-width: $base-border-width-2 !default;               // Focus state border
$semantic-border-hover-width: $base-border-width-1 !default;               // Hover state border
$semantic-border-active-width: $base-border-width-2 !default;              // Active state border
$semantic-border-disabled-width: $base-border-width-1 !default;            // Disabled state border

// FEEDBACK BORDERS - Status and validation borders
$semantic-border-success-width: $base-border-width-1 !default;             // Success state border
$semantic-border-warning-width: $base-border-width-1 !default;             // Warning state border
$semantic-border-error-width: $base-border-width-1 !default;               // Error state border
$semantic-border-info-width: $base-border-width-1 !default;                // Info state border

// LAYOUT BORDERS - Structure and separation
$semantic-border-divider-width: $base-border-width-1 !default;             // Content dividers
$semantic-border-divider-style: $base-border-style-solid !default;         // Divider style
$semantic-border-separator-width: $base-border-width-hairline !default;    // Subtle separators
$semantic-border-separator-style: $base-border-style-solid !default;       // Separator style

// NAVIGATION BORDERS - Menu and navigation elements
$semantic-border-nav-width: $base-border-width-1 !default;                 // Navigation borders
$semantic-border-nav-style: $base-border-style-solid !default;             // Nav border style
$semantic-border-nav-radius: $base-border-radius-sm !default;              // Nav corner radius

$semantic-border-tab-width: $base-border-width-2 !default;                 // Tab borders
$semantic-border-tab-style: $base-border-style-solid !default;             // Tab border style
$semantic-border-tab-radius: $base-border-radius-sm !default;              // Tab corner radius

// CONTAINER BORDERS - Cards, panels, modals
$semantic-border-modal-width: $base-border-width-0 !default;               // Modal border (usually none)
$semantic-border-modal-radius: $base-border-radius-xl !default;            // Modal corner radius

$semantic-border-panel-width: $base-border-width-1 !default;               // Side panel border
$semantic-border-panel-style: $base-border-style-solid !default;           // Panel border style
$semantic-border-panel-radius: $base-border-radius-lg !default;            // Panel corner radius

// SHAPE BORDERS - Geometric and utility borders
$semantic-border-pill: $base-border-radius-pill !default;                  // Pill-shaped elements
$semantic-border-circle: $base-border-radius-full !default;                // Circular elements
$semantic-border-rounded-sm: $base-border-radius-sm !default;              // Small rounded corners
$semantic-border-rounded-md: $base-border-radius-md !default;              // Medium rounded corners
$semantic-border-rounded-lg: $base-border-radius-lg !default;              // Large rounded corners
$semantic-border-rounded-xl: $base-border-radius-xl !default;              // Extra large rounded corners

// TABLE BORDERS - Data table styling
$semantic-border-table-width: $base-border-width-1 !default;               // Table border width
$semantic-border-table-style: $base-border-style-solid !default;           // Table border style
$semantic-border-table-radius: $base-border-radius-md !default;            // Table corner radius

$semantic-border-table-cell-width: $base-border-width-hairline !default;   // Table cell borders
$semantic-border-table-cell-style: $base-border-style-solid !default;      // Cell border style

// AVATAR AND IMAGE BORDERS
$semantic-border-avatar-width: $base-border-width-2 !default;              // Avatar border width
$semantic-border-avatar-style: $base-border-style-solid !default;          // Avatar border style
$semantic-border-avatar-radius: $base-border-radius-full !default;         // Avatar shape (circular)

$semantic-border-image-width: $base-border-width-1 !default;               // Image border width
$semantic-border-image-style: $base-border-style-solid !default;           // Image border style
$semantic-border-image-radius: $base-border-radius-md !default;            // Image corner radius

// UTILITY BORDERS - Common border patterns
$semantic-border-outline-width: $base-border-width-1 !default;             // Outline/stroke borders
$semantic-border-outline-style: $base-border-style-solid !default;         // Outline border style

$semantic-border-dashed-width: $base-border-width-1 !default;              // Dashed borders
$semantic-border-dashed-style: $base-border-style-dashed !default;         // Dashed border style

$semantic-border-dotted-width: $base-border-width-1 !default;              // Dotted borders
$semantic-border-dotted-style: $base-border-style-dotted !default;         // Dotted border style

// ==========================================================================
// BACKWARDS COMPATIBILITY ALIASES
// ==========================================================================
// Aliases for existing border radius patterns in the codebase

$semantic-border-radius-xs: $base-border-radius-xs !default;               // Extra small radius
$semantic-border-radius-sm: $base-border-radius-sm !default;               // Small radius
$semantic-border-radius-md: $base-border-radius-md !default;               // Medium radius
$semantic-border-radius-lg: $base-border-radius-lg !default;               // Large radius
$semantic-border-radius-xl: $base-border-radius-xl !default;               // Extra large radius

// INDIVIDUAL SEMANTIC BORDER TOKENS - Direct access to all base border values

// BORDER WIDTHS
$semantic-border-width-0: $base-border-width-0 !default;
$semantic-border-width-1: $base-border-width-1 !default;
$semantic-border-width-2: $base-border-width-2 !default;
$semantic-border-width-3: $base-border-width-3 !default;
$semantic-border-width-4: $base-border-width-4 !default;
$semantic-border-width-5: $base-border-width-5 !default;
$semantic-border-width-6: $base-border-width-6 !default;
$semantic-border-width-7: $base-border-width-7 !default;
$semantic-border-width-8: $base-border-width-8 !default;
$semantic-border-width-10: $base-border-width-10 !default;
$semantic-border-width-hairline: $base-border-width-hairline !default;

// BORDER RADIUS
$semantic-border-radius-none: $base-border-radius-none !default;
$semantic-border-radius-2xl: $base-border-radius-2xl !default;
$semantic-border-radius-3xl: $base-border-radius-3xl !default;
$semantic-border-radius-4xl: $base-border-radius-4xl !default;
$semantic-border-radius-5xl: $base-border-radius-5xl !default;
$semantic-border-radius-full: $base-border-radius-full !default;
$semantic-border-radius-pill: $base-border-radius-pill !default;

// BORDER STYLES
$semantic-border-style-none: $base-border-style-none !default;
$semantic-border-style-solid: $base-border-style-solid !default;
$semantic-border-style-dashed: $base-border-style-dashed !default;
$semantic-border-style-dotted: $base-border-style-dotted !default;
$semantic-border-style-double: $base-border-style-double !default;pxxo// ==========================================================================
// SEMANTIC COLORS
// ==========================================================================
// Meaningful color tokens that map base tokens to contextual usage
// These provide semantic meaning and make components more maintainable
// ==========================================================================
@use '../../base/colors' as *;
@use '../../base/css-variables' as *;

// BRAND COLORS - Core brand identity (now CSS variable aware)
$semantic-color-brand-primary: $css-color-primary !default;
$semantic-color-brand-secondary: $css-color-secondary !default;
$semantic-color-brand-tertiary: $css-color-tertiary !default;
$semantic-color-brand-accent: $css-color-tertiary !default;

// BRAND ON COLORS - Text/icons on brand colors (now CSS variable aware)
$semantic-color-on-brand-primary: $css-color-on-primary !default;
$semantic-color-on-brand-secondary: $css-color-on-secondary !default;
$semantic-color-on-brand-tertiary: $css-color-on-tertiary !default;

// FEEDBACK COLORS - User feedback and status
$semantic-color-success: $css-color-tertiary !default;      // Often green in M3
$semantic-color-warning: #ff9800 !default;                   // Amber/orange
$semantic-color-danger: $css-color-error !default;          // Red/error
$semantic-color-info: #2196f3 !default;                      // Blue
$semantic-color-neutral-info: $base-color-neutral !default;  // Neutral feedback

// FEEDBACK ON COLORS - Text/icons on feedback colors
$semantic-color-on-success: $css-color-on-tertiary !default;
$semantic-color-on-warning: #000000 !default;
$semantic-color-on-danger: $css-color-on-error !default;
$semantic-color-on-info: #ffffff !default;

// SURFACE COLORS - Background and container colors (now CSS variable aware)
$semantic-color-surface-primary: $css-color-surface !default;
$semantic-color-surface-secondary: $css-color-surface-variant !default;
$semantic-color-surface-elevated: $css-color-surface-high !default;
$semantic-color-surface-sunken: $css-color-surface-low !default;
$semantic-color-surface-interactive: $css-color-surface-container !default;
$semantic-color-surface-disabled: $css-color-surface-dim !default;

// TEXT COLORS - Typography and content (now CSS variable aware)
$semantic-color-text-primary: $css-color-on-surface !default;
$semantic-color-text-secondary: $css-color-on-surface-variant !default;
$semantic-color-text-tertiary: $css-color-outline !default;
$semantic-color-text-disabled: $css-color-outline-variant !default;
$semantic-color-text-inverse: $css-color-inverse-on-surface !default;

// BORDER COLORS - Lines, dividers, outlines (now CSS variable aware)
$semantic-color-border-primary: $css-color-outline !default;
$semantic-color-border-secondary: $css-color-outline-variant !default;
$semantic-color-border-subtle: $css-color-outline-variant !default;
$semantic-color-border-focus: $css-color-primary !default;
$semantic-color-focus: $css-color-primary !default;                        // General focus indicator color
$semantic-color-border-error: $css-color-error !default;
$semantic-color-border-disabled: $css-color-outline-variant !default;

// INTERACTIVE COLORS - Buttons, links, actions (now CSS variable aware)
$semantic-color-interactive-primary: $css-color-primary !default;
$semantic-color-interactive-secondary: $css-color-secondary !default;
$semantic-color-interactive-tertiary: $css-color-tertiary !default;
$semantic-color-interactive-neutral: $css-color-surface-variant !default;

// CONTAINER COLORS - Cards, panels, modals (now CSS variable aware)
$semantic-color-container-primary: $css-color-primary-container !default;
$semantic-color-container-secondary: $css-color-secondary-container !default;
$semantic-color-container-tertiary: $css-color-tertiary-container !default;
$semantic-color-container-error: $css-color-error-container !default;
$semantic-color-container-surface: $css-color-surface-container !default;

// CONTAINER ON COLORS - Text/icons on containers (now CSS variable aware)
$semantic-color-on-container-primary: $css-color-on-primary-container !default;
$semantic-color-on-container-secondary: $css-color-on-secondary-container !default;
$semantic-color-on-container-tertiary: $css-color-on-tertiary-container !default;
$semantic-color-on-container-error: $css-color-on-error-container !default;

// UTILITY COLORS - Special purpose colors (partially CSS variable aware)
$semantic-color-shadow: $css-color-shadow !default;
$semantic-color-scrim: $css-color-scrim !default;
$semantic-color-backdrop: rgba(0, 0, 0, 0.5) !default;
$semantic-color-overlay: rgba(255, 255, 255, 0.1) !default;
$semantic-color-focus-ring: rgba($base-color-primary, 0.12) !default;

// INDIVIDUAL SEMANTIC COLOR TOKENS - Direct access to all base color values

// KEY COLORS
$semantic-color-primary-key: $base-color-primary-key !default;
$semantic-color-secondary-key: $base-color-secondary-key !default;
$semantic-color-tertiary-key: $base-color-tertiary-key !default;
$semantic-color-quaternary-key: $base-color-quaternary-key !default;
$semantic-color-neutral-key: $base-color-neutral-key !default;
$semantic-color-error-key: $base-color-error-key !default;
$semantic-color-neutral-variant-key: $base-color-neutral-variant-key !default;

// PRIMARY COLORS
$semantic-color-primary: $base-color-primary !default;
$semantic-color-on-primary: $base-color-on-primary !default;
$semantic-color-primary-container: $base-color-primary-container !default;
$semantic-color-on-primary-container: $base-color-on-primary-container !default;
$semantic-color-inverse-primary: $base-color-inverse-primary !default;

// SECONDARY COLORS
$semantic-color-secondary: $base-color-secondary !default;
$semantic-color-on-secondary: $base-color-on-secondary !default;
$semantic-color-secondary-container: $base-color-secondary-container !default;
$semantic-color-on-secondary-container: $base-color-on-secondary-container !default;

// TERTIARY COLORS
$semantic-color-tertiary: $base-color-tertiary !default;
$semantic-color-on-tertiary: $base-color-on-tertiary !default;
$semantic-color-tertiary-container: $base-color-tertiary-container !default;
$semantic-color-on-tertiary-container: $base-color-on-tertiary-container !default;

// NEUTRAL COLORS
$semantic-color-neutral: $base-color-neutral !default;
$semantic-color-neutral-variant: $base-color-neutral-variant !default;

// SURFACE COLORS
$semantic-color-surface: $base-color-surface !default;
$semantic-color-surface-bright: $base-color-surface-bright !default;
$semantic-color-surface-dim: $base-color-surface-dim !default;
$semantic-color-on-surface: $base-color-on-surface !default;
$semantic-color-surface-lowest: $base-color-surface-lowest !default;
$semantic-color-surface-low: $base-color-surface-low !default;
$semantic-color-surface-container: $base-color-surface-container !default;
$semantic-color-surface-high: $base-color-surface-high !default;
$semantic-color-surface-highest: $base-color-surface-highest !default;
$semantic-color-surface-variant: $base-color-surface-variant !default;
$semantic-color-on-surface-variant: $base-color-on-surface-variant !default;
$semantic-color-inverse-surface: $base-color-inverse-surface !default;
$semantic-color-inverse-on-surface: $base-color-inverse-on-surface !default;

// BACKGROUND COLORS
$semantic-color-background: $base-color-background !default;
$semantic-color-on-background: $base-color-on-background !default;

// ERROR COLORS
$semantic-color-error: $base-color-error !default;
$semantic-color-on-error: $base-color-on-error !default;
$semantic-color-error-container: $base-color-error-container !default;
$semantic-color-on-error-container: $base-color-on-error-container !default;

// OUTLINE COLORS
$semantic-color-outline: $base-color-outline !default;
$semantic-color-outline-variant: $base-color-outline-variant !default;

// UTILITY COLORS
$semantic-color-shadow: $base-color-shadow !default;
$semantic-color-surface-tint: $base-color-surface-tint !default;
$semantic-color-scrim: $base-color-scrim !default;fxc// ==========================================================================
// STATE COLORS
// ==========================================================================
// Interactive state colors for hover, active, focus, and disabled states
// Based on Material Design 3 state layer system
// ==========================================================================
@use '../../base/colors' as *;
@use '../../base/css-variables' as *;

// PRIMARY STATE COLORS
$semantic-color-primary-hover: rgba($base-color-primary, 0.08) !default;
$semantic-color-primary-focus: rgba($base-color-primary, 0.12) !default;
$semantic-color-primary-pressed: rgba($base-color-primary, 0.16) !default;
$semantic-color-primary-selected: rgba($base-color-primary, 0.12) !default;
$semantic-color-primary-disabled: rgba($base-color-on-surface, 0.12) !default;

// SECONDARY STATE COLORS
$semantic-color-secondary-hover: rgba($base-color-secondary, 0.08) !default;
$semantic-color-secondary-focus: rgba($base-color-secondary, 0.12) !default;
$semantic-color-secondary-pressed: rgba($base-color-secondary, 0.16) !default;
$semantic-color-secondary-selected: rgba($base-color-secondary, 0.12) !default;
$semantic-color-secondary-disabled: rgba($base-color-on-surface, 0.12) !default;

// SURFACE STATE COLORS
$semantic-color-surface-hover: rgba($base-color-on-surface, 0.05) !default;
$semantic-color-surface-focus: rgba($base-color-on-surface, 0.08) !default;
$semantic-color-surface-pressed: rgba($base-color-on-surface, 0.12) !default;
$semantic-color-surface-selected: rgba($base-color-primary, 0.08) !default;
$semantic-color-surface-disabled: rgba($base-color-on-surface, 0.04) !default;

// ERROR STATE COLORS
$semantic-color-error-hover: rgba($base-color-error, 0.08) !default;
$semantic-color-error-focus: rgba($base-color-error, 0.12) !default;
$semantic-color-error-pressed: rgba($base-color-error, 0.16) !default;
$semantic-color-error-selected: rgba($base-color-error, 0.12) !default;

// SUCCESS STATE COLORS
$semantic-color-success-hover: rgba($semantic-color-success, 0.08) !default;
$semantic-color-success-focus: rgba($semantic-color-success, 0.12) !default;
$semantic-color-success-pressed: rgba($semantic-color-success, 0.16) !default;
$semantic-color-success-selected: rgba($semantic-color-success, 0.12) !default;

// WARNING STATE COLORS
$semantic-color-warning-hover: rgba($semantic-color-warning, 0.08) !default;
$semantic-color-warning-focus: rgba($semantic-color-warning, 0.12) !default;
$semantic-color-warning-pressed: rgba($semantic-color-warning, 0.16) !default;
$semantic-color-warning-selected: rgba($semantic-color-warning, 0.12) !default;

// OUTLINE STATE COLORS
$semantic-color-outline-hover: rgba($base-color-outline, 0.08) !default;
$semantic-color-outline-focus: $base-color-outline !default;
$semantic-color-outline-pressed: rgba($base-color-outline, 0.12) !default;
$semantic-color-outline-disabled: rgba($base-color-outline, 0.38) !default;

// TEXT STATE COLORS
$semantic-color-text-hover: rgba($base-color-on-surface, 0.87) !default;
$semantic-color-text-focus: $base-color-on-surface !default;
$semantic-color-text-pressed: rgba($base-color-on-surface, 0.87) !default;
$semantic-color-text-disabled: rgba($base-color-on-surface, 0.38) !default;

// ELEVATION STATE COLORS (for shadows and elevation changes)
$semantic-color-elevation-1: rgba($base-color-shadow, 0.05) !default;
$semantic-color-elevation-2: rgba($base-color-shadow, 0.08) !default;
$semantic-color-elevation-3: rgba($base-color-shadow, 0.12) !default;
$semantic-color-elevation-4: rgba($base-color-shadow, 0.16) !default;
$semantic-color-elevation-5: rgba($base-color-shadow, 0.20) !default;5x
;// ==========================================================================
// GLASS BORDER SEMANTIC TOKENS
// ==========================================================================
// Semantic tokens for glass morphism border effects
// Enhances glass surfaces with subtle borders and edge highlights
// ==========================================================================
@use '../../base/glass' as *;
@use '../../base/borders' as *;
@use '../../base/css-variables' as *;

// CORE GLASS BORDER VARIANTS
// Border styles that complement glass surfaces
$semantic-glass-border-subtle: $css-glass-border-color !default;
$semantic-glass-border-medium: rgba($css-glass-background-base, calc($css-glass-opacity-light + 0.1)) !default;
$semantic-glass-border-prominent: rgba($css-glass-background-base, calc($css-glass-opacity-medium + 0.1)) !default;

// EDGE HIGHLIGHT EFFECTS
// Subtle highlights that enhance the glass illusion
$semantic-glass-border-highlight-top: rgba(255, 255, 255, 0.3) !default;
$semantic-glass-border-highlight-bottom: rgba(0, 0, 0, 0.1) !default;

// COMPONENT-SPECIFIC GLASS BORDERS
$semantic-glass-border-card: $semantic-glass-border-subtle !default;
$semantic-glass-border-modal: $semantic-glass-border-medium !default;
$semantic-glass-border-dropdown: $semantic-glass-border-prominent !default;
$semantic-glass-border-tooltip: $semantic-glass-border-subtle !default;
$semantic-glass-border-button: $semantic-glass-border-medium !default;
$semantic-glass-border-input: $semantic-glass-border-subtle !default;

// INTERACTIVE GLASS BORDERS
$semantic-glass-border-hover: rgba($css-glass-background-base, calc($css-glass-opacity-medium + 0.2)) !default;
$semantic-glass-border-focus: rgba($css-glass-background-base, calc($css-glass-opacity-heavy + 0.1)) !default;
$semantic-glass-border-active: rgba($css-glass-background-base, calc($css-glass-opacity-frosted + 0.1)) !default;

// GLASS BORDER WIDTHS
$semantic-glass-border-width-thin: 1px !default;
$semantic-glass-border-width-medium: 2px !default;
$semantic-glass-border-width-thick: 3px !default;

// GLASS BORDER RADIUS
// Complement existing border radius tokens with glass-specific values
$semantic-glass-border-radius-sm: $base-border-radius-sm !default;
$semantic-glass-border-radius-md: $base-border-radius-md !default;
$semantic-glass-border-radius-lg: $base-border-radius-lg !default;
$semantic-glass-border-radius-xl: $base-border-radius-xl !default;

// GLASS BORDER MAP
$semantic-glass-borders: (
  subtle: $semantic-glass-border-subtle,
  medium: $semantic-glass-border-medium,
  prominent: $semantic-glass-border-prominent,
  hover: $semantic-glass-border-hover,
  focus: $semantic-glass-border-focus,
  active: $semantic-glass-border-active
) !default;avxi// ==========================================================================
// GLASS EFFECT MIXINS
// ==========================================================================
// Comprehensive mixins for implementing glass morphism effects
// Includes animations, fallbacks, and responsive behavior
// ==========================================================================
@use '../../base/css-variables' as *;
@use '../../base/motion' as *;
@use '../../base/spacing' as *;
@use '../../base/glass' as *;
@use '../../base/breakpoints' as *;
@use '../../base/z-index' as *;

@use '../spacing' as *;
@use '../colors' as *;

@import 'glass-borders';

// CORE GLASS EFFECT MIXIN
// Primary mixin for applying glass morphism with full customization
@mixin glass-effect(
  $variant: 'medium',
  $blur: $css-glass-blur-md,
  $border: true,
  $shadow: true,
  $animate: false,
  $duration: var(--glass-duration-normal, 300ms)
) {
  // Background with dynamic opacity
  background: rgba($css-glass-background-base, var(--glass-opacity-#{$variant}));
  
  // Backdrop blur effect
  backdrop-filter: blur($blur);
  -webkit-backdrop-filter: blur($blur);
  
  // Optional border
  @if $border {
    border: $semantic-glass-border-width-thin solid $css-glass-border-color;
  }
  
  // Optional shadow
  @if $shadow {
    box-shadow: 
      0 4px 6px $css-glass-shadow-color,
      0 1px 3px rgba($css-glass-background-base, 0.1);
  }
  
  // Animation support
  @if $animate {
    transition: 
      background $duration $base-glass-easing-smooth,
      backdrop-filter $duration $base-glass-easing-smooth,
      border-color $duration $base-glass-easing-smooth,
      box-shadow $duration $base-glass-easing-smooth;
  }
  
  // Performance optimization
  will-change: backdrop-filter, background;
  
  // Fallback for browsers without backdrop-filter support
  @supports not (backdrop-filter: blur(1px)) {
    background: rgba($css-glass-background-base, calc(var(--glass-opacity-#{$variant}) + 0.15));
  }
}

// SIMPLIFIED GLASS VARIANTS
// Quick mixins for common glass effect intensities
@mixin glass-translucent($animate: false) {
  @include glass-effect('translucent', $css-glass-blur-sm, true, true, $animate);
}

@mixin glass-light($animate: false) {
  @include glass-effect('light', $css-glass-blur-md, true, true, $animate);
}

@mixin glass-medium($animate: false) {
  @include glass-effect('medium', $css-glass-blur-md, true, true, $animate);
}

@mixin glass-heavy($animate: false) {
  @include glass-effect('heavy', $css-glass-blur-lg, true, true, $animate);
}

@mixin glass-frosted($animate: false) {
  @include glass-effect('frosted', $css-glass-blur-xl, true, true, $animate);
}

// GLASS TRANSITION MIXIN
// Animates from one glass state to another
@mixin glass-transition(
  $from-variant: 'opaque', 
  $to-variant: 'medium', 
  $duration: var(--glass-duration-normal, 300ms),
  $trigger: 'hover'
) {
  // Initial state
  @if $from-variant == 'opaque' {
    background: rgb($css-glass-background-base);
    backdrop-filter: blur(0);
    -webkit-backdrop-filter: blur(0);
    border: $semantic-glass-border-width-thin solid transparent;
  } @else {
    @include glass-effect($from-variant, $css-glass-blur-md, true, true, false);
  }
  
  // Smooth transition properties
  transition: 
    background $duration $base-glass-easing-smooth,
    backdrop-filter $duration $base-glass-easing-smooth,
    border-color $duration $base-glass-easing-smooth,
    box-shadow $duration $base-glass-easing-smooth,
    transform $duration $base-glass-easing-smooth;
  
  // Target state based on trigger
  @if $trigger == 'hover' {
    &:hover {
      @include glass-effect($to-variant, $css-glass-blur-md, true, true, false);
      transform: translateY(-1px);
    }
  } @else if $trigger == 'focus' {
    &:focus,
    &:focus-within {
      @include glass-effect($to-variant, $css-glass-blur-md, true, true, false);
    }
  } @else if $trigger == 'active' {
    &.glass-active,
    &[data-glass-active="true"] {
      @include glass-effect($to-variant, $css-glass-blur-md, true, true, false);
    }
  }
}

// GLASS BORDER ENHANCEMENT MIXIN
// Adds subtle border highlights to enhance glass illusion
@mixin glass-border-enhance($style: 'subtle') {
  position: relative;
  
  &::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 1px;
    background: $semantic-glass-border-highlight-top;
    border-radius: inherit;
  }
  
  &::after {
    content: '';
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    height: 1px;
    background: $semantic-glass-border-highlight-bottom;
    border-radius: inherit;
  }
}

// RESPONSIVE GLASS MIXIN
// Adjusts glass intensity based on screen size
@mixin glass-responsive($mobile-variant: 'light', $desktop-variant: 'medium') {
  @include glass-effect($mobile-variant);
  
  @media (min-width: $base-breakpoint-md) {
    @include glass-effect($desktop-variant);
  }
}

// GLASS COMPONENT MIXIN
// Complete glass component styling with all enhancements
@mixin glass-component(
  $variant: 'medium',
  $border-radius: $semantic-glass-border-radius-md,
  $padding: $semantic-spacing-component-md,
  $enhance-borders: true,
  $animate: true
) {
  @include glass-effect($variant, $css-glass-blur-md, true, true, $animate);
  
  border-radius: $border-radius;
  padding: $padding;
  
  @if $enhance-borders {
    @include glass-border-enhance();
  }
  
  // Ensure content is readable on glass background
  color: $semantic-color-text-primary;
  
  // Prevent content from interfering with glass effect
  isolation: isolate;
}

// UTILITY MIXIN FOR GLASS ANIMATIONS
@mixin glass-keyframes($name, $from-variant: 'opaque', $to-variant: 'medium') {
  @keyframes #{$name} {
    from {
      @if $from-variant == 'opaque' {
        background: rgb($css-glass-background-base);
        backdrop-filter: blur(0);
      } @else {
        background: rgba($css-glass-background-base, var(--glass-opacity-#{$from-variant}));
        backdrop-filter: blur($css-glass-blur-sm);
      }
    }
    
    to {
      background: rgba($css-glass-background-base, var(--glass-opacity-#{$to-variant}));
      backdrop-filter: blur($css-glass-blur-md);
    }
  }
}

// GLASS DISABLED STATE MIXIN
@mixin glass-disabled() {
  background: rgba($css-glass-background-base, calc($css-glass-opacity-light * 0.5));
  backdrop-filter: blur($css-glass-blur-xs);
  opacity: 0.6;
  cursor: not-allowed;
  
  &:hover {
    transform: none;
  }
}&ļx<// ==========================================================================
// GLASS SURFACE SEMANTIC TOKENS
// ==========================================================================
// Semantic tokens for glass morphism surface effects
// Uses CSS variables to support dynamic light/dark mode switching
// ==========================================================================
@use '../../base/glass' as *;
@use '../../base/css-variables' as *;

// CORE GLASS SURFACE VARIANTS
// 5 opacity levels with CSS variable support for dynamic theming
$semantic-glass-surface-translucent: rgba($css-glass-background-base, $css-glass-opacity-translucent) !default;
$semantic-glass-surface-light: rgba($css-glass-background-base, $css-glass-opacity-light) !default;
$semantic-glass-surface-medium: rgba($css-glass-background-base, $css-glass-opacity-medium) !default;
$semantic-glass-surface-heavy: rgba($css-glass-background-base, $css-glass-opacity-heavy) !default;
$semantic-glass-surface-frosted: rgba($css-glass-background-base, $css-glass-opacity-frosted) !default;

// COMPONENT-SPECIFIC GLASS SURFACES
// Common UI component glass effects using semantic variants
$semantic-glass-card: $semantic-glass-surface-medium !default;
$semantic-glass-card-elevated: $semantic-glass-surface-heavy !default;
$semantic-glass-card-subtle: $semantic-glass-surface-light !default;

$semantic-glass-modal: $semantic-glass-surface-heavy !default;
$semantic-glass-modal-backdrop: $semantic-glass-surface-translucent !default;

$semantic-glass-dropdown: $semantic-glass-surface-frosted !default;
$semantic-glass-dropdown-item: $semantic-glass-surface-light !default;

$semantic-glass-tooltip: $semantic-glass-surface-light !default;
$semantic-glass-popover: $semantic-glass-surface-medium !default;

$semantic-glass-navbar: $semantic-glass-surface-frosted !default;
$semantic-glass-sidebar: $semantic-glass-surface-medium !default;

$semantic-glass-notification: $semantic-glass-surface-heavy !default;
$semantic-glass-alert: $semantic-glass-surface-medium !default;

$semantic-glass-overlay: $semantic-glass-surface-translucent !default;
$semantic-glass-overlay-heavy: $semantic-glass-surface-light !default;

// INTERACTIVE GLASS SURFACES
// Glass effects for interactive elements
$semantic-glass-button: $semantic-glass-surface-light !default;
$semantic-glass-button-hover: $semantic-glass-surface-medium !default;
$semantic-glass-button-active: $semantic-glass-surface-heavy !default;

$semantic-glass-input: $semantic-glass-surface-translucent !default;
$semantic-glass-input-focus: $semantic-glass-surface-light !default;

// LAYOUT GLASS SURFACES
// Glass effects for layout components
$semantic-glass-header: $semantic-glass-surface-frosted !default;
$semantic-glass-footer: $semantic-glass-surface-medium !default;
$semantic-glass-panel: $semantic-glass-surface-light !default;
$semantic-glass-panel-elevated: $semantic-glass-surface-medium !default;

// STATUS-BASED GLASS SURFACES
// Glass effects with status/state implications
$semantic-glass-success: $semantic-glass-surface-light !default;
$semantic-glass-warning: $semantic-glass-surface-medium !default;
$semantic-glass-error: $semantic-glass-surface-heavy !default;
$semantic-glass-info: $semantic-glass-surface-light !default;

// GLASS SURFACE MAP
// Easy access to all glass surface variants
$semantic-glass-surfaces: (
  translucent: $semantic-glass-surface-translucent,
  light: $semantic-glass-surface-light,
  medium: $semantic-glass-surface-medium,
  heavy: $semantic-glass-surface-heavy,
  frosted: $semantic-glass-surface-frosted,
  
  card: $semantic-glass-card,
  modal: $semantic-glass-modal,
  dropdown: $semantic-glass-dropdown,
  tooltip: $semantic-glass-tooltip,
  navbar: $semantic-glass-navbar,
  button: $semantic-glass-button,
  input: $semantic-glass-input,
  overlay: $semantic-glass-overlay,
  panel: $semantic-glass-panel
) !default;

// INDIVIDUAL SEMANTIC GLASS TOKENS - Direct access to all base glass values

// GLASS BLUR INTENSITIES
$semantic-glass-blur-none: $base-glass-blur-none !default;
$semantic-glass-blur-xs: $base-glass-blur-xs !default;
$semantic-glass-blur-sm: $base-glass-blur-sm !default;
$semantic-glass-blur-md: $base-glass-blur-md !default;
$semantic-glass-blur-lg: $base-glass-blur-lg !default;
$semantic-glass-blur-xl: $base-glass-blur-xl !default;
$semantic-glass-blur-2xl: $base-glass-blur-2xl !default;
$semantic-glass-blur-3xl: $base-glass-blur-3xl !default;

// GLASS OPACITY VARIANTS - LIGHT MODE
$semantic-glass-opacity-translucent-light: $base-glass-opacity-translucent-light !default;
$semantic-glass-opacity-light-light: $base-glass-opacity-light-light !default;
$semantic-glass-opacity-medium-light: $base-glass-opacity-medium-light !default;
$semantic-glass-opacity-heavy-light: $base-glass-opacity-heavy-light !default;
$semantic-glass-opacity-frosted-light: $base-glass-opacity-frosted-light !default;

// GLASS OPACITY VARIANTS - DARK MODE
$semantic-glass-opacity-translucent-dark: $base-glass-opacity-translucent-dark !default;
$semantic-glass-opacity-light-dark: $base-glass-opacity-light-dark !default;
$semantic-glass-opacity-medium-dark: $base-glass-opacity-medium-dark !default;
$semantic-glass-opacity-heavy-dark: $base-glass-opacity-heavy-dark !default;
$semantic-glass-opacity-frosted-dark: $base-glass-opacity-frosted-dark !default;

// GLASS BACKGROUND COLORS
$semantic-glass-bg-light: $base-glass-bg-light !default;
$semantic-glass-bg-dark: $base-glass-bg-dark !default;

// GLASS BORDER COLORS
$semantic-glass-border-light: $base-glass-border-light !default;
$semantic-glass-border-dark: $base-glass-border-dark !default;

// GLASS SHADOW COLORS
$semantic-glass-shadow-light: $base-glass-shadow-light !default;
$semantic-glass-shadow-dark: $base-glass-shadow-dark !default;

// GLASS ANIMATION DURATIONS
$semantic-glass-duration-fast: $base-glass-duration-fast !default;
$semantic-glass-duration-normal: $base-glass-duration-normal !default;
$semantic-glass-duration-slow: $base-glass-duration-slow !default;

// GLASS ANIMATION EASINGS
$semantic-glass-easing-smooth: $base-glass-easing-smooth !default;
$semantic-glass-easing-bounce: $base-glass-easing-bounce !default;OixE// ==========================================================================
// GLASS UTILITY CLASSES
// ==========================================================================
// Ready-to-use utility classes for rapid prototyping with glass effects
// Can be applied directly in HTML or used as @extend placeholders
// ==========================================================================

@use '../../base/css-variables' as *;
@use '../../base/motion' as *;
@use '../../base/spacing' as *;
@use '../../base/glass' as *;
@use '../../base/glass' as *;
@use '../../base/breakpoints' as *;
@use '../../base/z-index' as *;

@use '../spacing' as *;
@use '../colors' as *;

// CORE GLASS UTILITY CLASSES
// Basic glass effect classes for each variant
.glass-translucent {
  @include glass-translucent();
}

.glass-light {
  @include glass-light();
}

.glass-medium {
  @include glass-medium();
}

.glass-heavy {
  @include glass-heavy();
}

.glass-frosted {
  @include glass-frosted();
}

// ANIMATED GLASS UTILITIES
// Glass effects with built-in animations
.glass-translucent-animated {
  @include glass-translucent(true);
}

.glass-light-animated {
  @include glass-light(true);
}

.glass-medium-animated {
  @include glass-medium(true);
}

.glass-heavy-animated {
  @include glass-heavy(true);
}

.glass-frosted-animated {
  @include glass-frosted(true);
}

// TRANSITION UTILITIES
// Classes for animating to glass effects on interaction
.glass-on-hover {
  @include glass-transition('opaque', 'medium', var(--glass-duration-normal), 'hover');
}

.glass-on-focus {
  @include glass-transition('opaque', 'light', var(--glass-duration-normal), 'focus');
}

.glass-on-active {
  @include glass-transition('opaque', 'heavy', var(--glass-duration-normal), 'active');
}

// SPECIFIC TRANSITION VARIANTS
@each $variant in (translucent, light, medium, heavy, frosted) {
  .glass-hover-to-#{$variant} {
    @include glass-transition('opaque', $variant, var(--glass-duration-normal), 'hover');
  }
  
  .glass-focus-to-#{$variant} {
    @include glass-transition('opaque', $variant, var(--glass-duration-normal), 'focus');
  }
  
  .glass-active-to-#{$variant} {
    @include glass-transition('opaque', $variant, var(--glass-duration-normal), 'active');
  }
}

// COMPONENT-SPECIFIC UTILITIES
// Pre-configured glass effects for common components
.glass-card {
  @include glass-component('medium', $semantic-glass-border-radius-lg);
}

.glass-modal {
  @include glass-component('heavy', $semantic-glass-border-radius-xl);
}

.glass-dropdown {
  @include glass-component('frosted', $semantic-glass-border-radius-md, $semantic-spacing-component-sm);
}

.glass-tooltip {
  @include glass-component('light', $semantic-glass-border-radius-sm, $semantic-spacing-component-xs);
}

.glass-navbar {
  @include glass-component('frosted', 0, $semantic-spacing-component-md, false);
}

.glass-button {
  @include glass-component('light', $semantic-glass-border-radius-md, $semantic-spacing-component-sm);
  @include glass-transition('light', 'medium', var(--glass-duration-fast), 'hover');
  
  &:active {
    @include glass-effect('heavy', $css-glass-blur-lg, true, true, false);
    transform: translateY(0);
  }
}

// BLUR-ONLY UTILITIES
// For cases where you only want the blur effect without the glass background
.blur-xs {
  backdrop-filter: blur($css-glass-blur-xs);
  -webkit-backdrop-filter: blur($css-glass-blur-xs);
}

.blur-sm {
  backdrop-filter: blur($css-glass-blur-sm);
  -webkit-backdrop-filter: blur($css-glass-blur-sm);
}

.blur-md {
  backdrop-filter: blur($css-glass-blur-md);
  -webkit-backdrop-filter: blur($css-glass-blur-md);
}

.blur-lg {
  backdrop-filter: blur($css-glass-blur-lg);
  -webkit-backdrop-filter: blur($css-glass-blur-lg);
}

.blur-xl {
  backdrop-filter: blur($css-glass-blur-xl);
  -webkit-backdrop-filter: blur($css-glass-blur-xl);
}

// GLASS STATE MODIFIERS
// Utility classes for different states
.glass-disabled {
  @include glass-disabled();
}

.glass-interactive {
  cursor: pointer;
  
  &:hover {
    transform: translateY(-2px);
  }
  
  &:active {
    transform: translateY(0);
  }
}

// RESPONSIVE GLASS UTILITIES
.glass-responsive {
  @include glass-responsive('light', 'medium');
}

.glass-responsive-heavy {
  @include glass-responsive('medium', 'heavy');
}

// GLASS OVERLAY UTILITIES
.glass-overlay {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: $base-z-index-overlay;
  @include glass-effect('translucent', $css-glass-blur-lg);
}

.glass-modal-backdrop {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: $base-z-index-modal-backdrop;
  background: rgba($css-glass-background-base, calc($css-glass-opacity-translucent * 0.5));
  backdrop-filter: blur($css-glass-blur-md);
  -webkit-backdrop-filter: blur($css-glass-blur-md);
}

// GLASS ANIMATION CLASSES
// For JavaScript-triggered animations
.glass-fade-in {
  animation: glassEffectFadeIn var(--glass-duration-normal) $base-glass-easing-smooth forwards;
}

.glass-fade-out {
  animation: glassEffectFadeOut var(--glass-duration-normal) $base-glass-easing-smooth forwards;
}

// KEYFRAME ANIMATIONS
@keyframes glassEffectFadeIn {
  from {
    background: transparent;
    backdrop-filter: blur(0);
    opacity: 0;
  }
  to {
    background: rgba($css-glass-background-base, $css-glass-opacity-medium);
    backdrop-filter: blur($css-glass-blur-md);
    opacity: 1;
  }
}

@keyframes glassEffectFadeOut {
  from {
    background: rgba($css-glass-background-base, $css-glass-opacity-medium);
    backdrop-filter: blur($css-glass-blur-md);
    opacity: 1;
  }
  to {
    background: transparent;
    backdrop-filter: blur(0);
    opacity: 0;
  }
}I["x$// ==========================================================================
// GLASS EFFECT SEMANTIC TOKENS
// ==========================================================================
// Complete glass morphism design system with semantic tokens, mixins, and utilities
// Supports light/dark mode theming and responsive behavior
// ==========================================================================

// Import all glass effect modules
@import 'glass-surfaces';
@import 'glass-borders';
@import 'glass-mixins';
@import 'glass-utilities';hYV9xb// ==========================================================================
// SEMANTIC TOKENS ENTRY POINT
// ==========================================================================
// Semantic tokens built on top of base design tokens
// Forward all semantic token categories for consumption by other projects
// ==========================================================================

// Forward base tokens first (semantic tokens depend on base tokens)
@forward '../base';

// Forward semantic token categories
@forward 'colors/index';
@forward 'typography/index'; 
@forward 'spacing/index'; 
@forward 'motion/index'; 
//@forward 'elevation/index'; 
//@forward 'layout/index'; 
//@forward 'breakpoints/index'; 

// Forward additional semantic categories
@forward 'borders/index'; 
@forward 'shadows/index'; 
@forward 'sizing/index'; 
@forward 'glass/index'; 
@forward 'z-index/index'; 
@forward 'opacity/index'; 

\#
*xmd&qMuk.Ģ̼tTELsTg$	fVaXJ73/%U0d}I%H 0Q5xS1// ==========================================================================
// SEMANTIC MOTION
// ==========================================================================
// Meaningful motion tokens for animations and interactions
// Maps base motion values to contextual usage patterns
// ==========================================================================
@use '../../base/motion' as *;

// DURATION TOKENS - Semantic timing values
$semantic-duration-instant: $base-motion-duration-instant !default;        // 50ms - Instant feedback
$semantic-duration-fast: $base-motion-duration-fast !default;              // 150ms - Quick interactions
$semantic-duration-short: $base-motion-duration-normal !default;           // 300ms - Standard transitions
$semantic-duration-medium: $base-motion-duration-slow !default;            // 500ms - Moderate animations
$semantic-duration-long: $base-motion-duration-slower !default;            // 700ms - Slower transitions

// EASING TOKENS - Semantic timing functions
$semantic-easing-standard: $base-motion-easing-ease-in-out !default;       // Standard easing curve
$semantic-easing-decelerate: $base-motion-easing-ease-out !default;        // Deceleration curve
$semantic-easing-accelerate: $base-motion-easing-ease-in !default;         // Acceleration curve
$semantic-easing-spring: $base-motion-easing-spring !default;              // Spring-like easing

// INTERACTION ANIMATIONS - User interface interactions
$semantic-motion-button-hover: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-ease-out,
  property: $base-motion-transition-property-colors,
  transform: $base-motion-hover-transform-scale-sm,
) !default;

$semantic-motion-button-press: (
  duration: $base-motion-duration-instant,
  timing: $base-motion-easing-ease-in,
  property: $base-motion-transition-property-transform,
  transform: scale(0.98),
) !default;

$semantic-motion-link-hover: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-ease-out,
  property: $base-motion-transition-property-colors,
) !default;

// FORM ANIMATIONS - Input and form interactions
$semantic-motion-input-focus: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: border-color box-shadow,
) !default;

$semantic-motion-input-error: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-spring,
  property: border-color,
  transform: translateX(-2px),
) !default;

$semantic-motion-checkbox-check: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-spring,
  property: $base-motion-transition-property-transform,
) !default;

// CARD ANIMATIONS - Card and container interactions
$semantic-motion-card-hover: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: box-shadow transform,
  transform: $base-motion-hover-transform-lift-sm,
) !default;

$semantic-motion-card-press: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-ease-in,
  property: $base-motion-transition-property-transform,
  transform: $base-motion-hover-transform-scale-sm,
) !default;

// NAVIGATION ANIMATIONS - Menu and navigation
$semantic-motion-nav-item-hover: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-ease-out,
  property: $base-motion-transition-property-colors,
) !default;

$semantic-motion-dropdown-enter: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: opacity transform,
  transform: translateY(-8px),
) !default;

$semantic-motion-dropdown-exit: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-ease-in,
  property: opacity transform,
) !default;

// MODAL AND OVERLAY ANIMATIONS
$semantic-motion-modal-enter: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: opacity transform,
  transform: scale(0.95) translateY(-20px),
) !default;

$semantic-motion-modal-exit: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-ease-in,
  property: opacity transform,
) !default;

$semantic-motion-backdrop-enter: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: $base-motion-transition-property-opacity,
) !default;

$semantic-motion-backdrop-exit: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-ease-in,
  property: $base-motion-transition-property-opacity,
) !default;

// TOAST AND NOTIFICATION ANIMATIONS
$semantic-motion-toast-enter: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-spring,
  property: opacity transform,
  transform: translateX(100%),
) !default;

$semantic-motion-toast-exit: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-in,
  property: opacity transform,
  transform: translateX(100%),
) !default;

// LOADING ANIMATIONS
$semantic-motion-spinner: (
  duration: $base-motion-duration-slowest,
  timing: $base-motion-easing-linear,
  property: $base-motion-transition-property-transform,
  iteration-count: infinite,
) !default;

$semantic-motion-pulse: (
  duration: $base-motion-duration-slower,
  timing: $base-motion-easing-ease-in-out,
  property: $base-motion-transition-property-opacity,
  iteration-count: infinite,
  direction: alternate,
) !default;

$semantic-motion-skeleton: (
  duration: 1500ms,
  timing: $base-motion-easing-ease-in-out,
  property: background-position,
  iteration-count: infinite,
) !default;

// PAGE TRANSITIONS
$semantic-motion-page-enter: (
  duration: $base-motion-duration-slow,
  timing: $base-motion-easing-ease-out,
  property: opacity transform,
  transform: translateY(20px),
) !default;

$semantic-motion-page-exit: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-in,
  property: opacity transform,
) !default;

// UTILITY MOTIONS - Common animation patterns
$semantic-motion-fade-in: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: $base-motion-transition-property-opacity,
) !default;

$semantic-motion-fade-out: (
  duration: $base-motion-duration-fast,
  timing: $base-motion-easing-ease-in,
  property: $base-motion-transition-property-opacity,
) !default;

$semantic-motion-slide-up: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: opacity transform,
  transform: translateY(16px),
) !default;

$semantic-motion-slide-down: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: opacity transform,
  transform: translateY(-16px),
) !default;

// ACCESSIBILITY MOTIONS - Respecting user preferences
$semantic-motion-reduced: (
  duration: $base-motion-duration-instant,
  timing: $base-motion-easing-linear,
  property: $base-motion-transition-property-none,
) !default;

$semantic-motion-standard: (
  duration: $base-motion-duration-normal,
  timing: $base-motion-easing-ease-out,
  property: $base-motion-transition-property-all,
) !default;

// INDIVIDUAL SEMANTIC MOTION DURATIONS - Direct access to duration values
$semantic-motion-duration-instant: $base-motion-duration-instant !default;
$semantic-motion-duration-fast: $base-motion-duration-fast !default;
$semantic-motion-duration-normal: $base-motion-duration-normal !default;
$semantic-motion-duration-slow: $base-motion-duration-slow !default;
$semantic-motion-duration-slower: $base-motion-duration-slower !default;
$semantic-motion-duration-slowest: $base-motion-duration-slowest !default;
$semantic-motion-duration-ultra-slow: $base-motion-duration-ultra-slow !default;

// INDIVIDUAL SEMANTIC MOTION EASING - Direct access to easing functions
$semantic-motion-easing-linear: $base-motion-easing-linear !default;
$semantic-motion-easing-ease: $base-motion-easing-ease !default;
$semantic-motion-easing-ease-in: $base-motion-easing-ease-in !default;
$semantic-motion-easing-ease-out: $base-motion-easing-ease-out !default;
$semantic-motion-easing-ease-in-out: $base-motion-easing-ease-in-out !default;
$semantic-motion-easing-spring: $base-motion-easing-spring !default;
$semantic-motion-easing-bounce: $base-motion-easing-bounce !default;
$semantic-motion-easing-sharp: $base-motion-easing-sharp !default;
$semantic-motion-easing-elastic: $base-motion-easing-elastic !default;

// INDIVIDUAL SEMANTIC TRANSITION PROPERTIES - Direct access to transition properties
$semantic-motion-transition-property-none: $base-motion-transition-property-none !default;
$semantic-motion-transition-property-all: $base-motion-transition-property-all !default;
$semantic-motion-transition-property-colors: $base-motion-transition-property-colors !default;
$semantic-motion-transition-property-opacity: $base-motion-transition-property-opacity !default;
$semantic-motion-transition-property-shadow: $base-motion-transition-property-shadow !default;
$semantic-motion-transition-property-transform: $base-motion-transition-property-transform !default;
$semantic-motion-transition-property-spacing: $base-motion-transition-property-spacing !default;
$semantic-motion-transition-property-size: $base-motion-transition-property-size !default;

// INDIVIDUAL SEMANTIC TRANSITION DURATIONS - Direct access to transition duration values
$semantic-motion-transition-duration-0: $base-motion-transition-duration-0 !default;
$semantic-motion-transition-duration-75: $base-motion-transition-duration-75 !default;
$semantic-motion-transition-duration-100: $base-motion-transition-duration-100 !default;
$semantic-motion-transition-duration-150: $base-motion-transition-duration-150 !default;
$semantic-motion-transition-duration-200: $base-motion-transition-duration-200 !default;
$semantic-motion-transition-duration-300: $base-motion-transition-duration-300 !default;
$semantic-motion-transition-duration-500: $base-motion-transition-duration-500 !default;
$semantic-motion-transition-duration-700: $base-motion-transition-duration-700 !default;
$semantic-motion-transition-duration-1000: $base-motion-transition-duration-1000 !default;
$semantic-motion-transition-duration-1500: $base-motion-transition-duration-1500 !default;
$semantic-motion-transition-duration-2000: $base-motion-transition-duration-2000 !default;

// INDIVIDUAL SEMANTIC TRANSITION TIMING FUNCTIONS - Direct access to timing functions
$semantic-motion-transition-timing-linear: $base-motion-transition-timing-linear !default;
$semantic-motion-transition-timing-in: $base-motion-transition-timing-in !default;
$semantic-motion-transition-timing-out: $base-motion-transition-timing-out !default;
$semantic-motion-transition-timing-in-out: $base-motion-transition-timing-in-out !default;
$semantic-motion-transition-timing-spring: $base-motion-transition-timing-spring !default;
$semantic-motion-transition-timing-out-back: $base-motion-transition-timing-out-back !default;

// INDIVIDUAL SEMANTIC TRANSITION DELAYS - Direct access to transition delay values
$semantic-motion-transition-delay-0: $base-motion-transition-delay-0 !default;
$semantic-motion-transition-delay-75: $base-motion-transition-delay-75 !default;
$semantic-motion-transition-delay-100: $base-motion-transition-delay-100 !default;
$semantic-motion-transition-delay-150: $base-motion-transition-delay-150 !default;
$semantic-motion-transition-delay-200: $base-motion-transition-delay-200 !default;
$semantic-motion-transition-delay-300: $base-motion-transition-delay-300 !default;
$semantic-motion-transition-delay-500: $base-motion-transition-delay-500 !default;
$semantic-motion-transition-delay-700: $base-motion-transition-delay-700 !default;
$semantic-motion-transition-delay-1000: $base-motion-transition-delay-1000 !default;

// INDIVIDUAL SEMANTIC HOVER TRANSFORMS - Direct access to hover transform values
$semantic-motion-hover-transform-none: $base-motion-hover-transform-none !default;
$semantic-motion-hover-transform-scale-sm: $base-motion-hover-transform-scale-sm !default;
$semantic-motion-hover-transform-scale-md: $base-motion-hover-transform-scale-md !default;
$semantic-motion-hover-transform-scale-lg: $base-motion-hover-transform-scale-lg !default;
$semantic-motion-hover-transform-lift-sm: $base-motion-hover-transform-lift-sm !default;
$semantic-motion-hover-transform-lift-md: $base-motion-hover-transform-lift-md !default;
$semantic-motion-hover-transform-lift-lg: $base-motion-hover-transform-lift-lg !default;
$semantic-motion-hover-transform-scale-lift-sm: $base-motion-hover-transform-scale-lift-sm !default;
$semantic-motion-hover-transform-scale-lift-md: $base-motion-hover-transform-scale-lift-md !default;=x@// ==========================================================================
// SEMANTIC SHADOWS
// ==========================================================================
// Meaningful shadow tokens for elevation and depth hierarchy
// Maps base shadow values to contextual usage patterns
// ==========================================================================
@use '../../base/shadows' as *;
@use '../colors' as *;  // Add this line


// ELEVATION HIERARCHY - Material Design inspired depth levels
$semantic-shadow-elevation-0: $base-shadow-none !default;                  // No elevation - flat elements
$semantic-shadow-elevation-1: $base-shadow-xs !default;                    // Subtle lift - cards at rest
$semantic-shadow-elevation-2: $base-shadow-sm !default;                    // Light hover - interactive cards
$semantic-shadow-elevation-3: $base-shadow-md !default;                    // Medium lift - dropdowns, popovers
$semantic-shadow-elevation-4: $base-shadow-lg !default;                    // High lift - modals, dialogs
$semantic-shadow-elevation-5: $base-shadow-xl !default;                    // Maximum lift - tooltips, notifications

// COMPONENT SHADOWS - Specific component contexts
$semantic-shadow-card-rest: $base-shadow-xs !default;                      // Cards in default state
$semantic-shadow-card-hover: $base-shadow-sm !default;                     // Cards on hover
$semantic-shadow-card-active: $base-shadow-md !default;                    // Cards when pressed/active
$semantic-shadow-card-featured: $base-shadow-lg !default;                  // Featured/highlighted cards

// INTERACTIVE SHADOWS - User interaction feedback
$semantic-shadow-button-rest: $base-shadow-none !default;                  // Buttons in default state
$semantic-shadow-button-hover: $base-shadow-xs !default;                   // Buttons on hover
$semantic-shadow-button-active: $base-shadow-sm !default;                  // Buttons when pressed
$semantic-shadow-button-focus: 0 0 0 3px rgba($semantic-color-brand-primary, 0.12) !default;  // Button focus ring
//$semantic-shadow-button-focus: 0 0 0 3px rgba($base-color-primary, 0.12) !default;  // Button focus ring

// OVERLAY SHADOWS - Floating elements
$semantic-shadow-dropdown: $base-shadow-md !default;                       // Dropdown menus
$semantic-shadow-popover: $base-shadow-lg !default;                        // Popovers and tooltips
$semantic-shadow-modal: $base-shadow-2xl !default;                         // Modal dialogs
$semantic-shadow-drawer: $base-shadow-xl !default;                         // Side drawers/panels

// FORM SHADOWS - Input and form elements
$semantic-shadow-input-rest: $base-shadow-none !default;                   // Inputs in default state
$semantic-shadow-input-focus: 0 0 0 2px rgba($semantic-color-brand-primary, 0.12) !default;  // Input focus ring
$semantic-shadow-input-error: 0 0 0 2px rgba($semantic-color-brand-primary, 0.12) !default;    // Input error state
$semantic-shadow-input-inner: $base-shadow-inner !default;                 // Inset input shadow

// NAVIGATION SHADOWS - Menu and navigation elements
$semantic-shadow-nav-primary: $base-shadow-sm !default;                    // Primary navigation bar
$semantic-shadow-nav-secondary: $base-shadow-xs !default;                  // Secondary navigation elements
$semantic-shadow-nav-submenu: $base-shadow-md !default;                    // Submenu dropdowns

// SURFACE SHADOWS - Background and container elements
$semantic-shadow-surface-raised: $base-shadow-xs !default;                 // Slightly raised surfaces
$semantic-shadow-surface-floating: $base-shadow-sm !default;               // Floating surfaces
$semantic-shadow-surface-overlay: $base-shadow-lg !default;                // Overlay surfaces

// UTILITY SHADOWS - Special purpose shadows
$semantic-shadow-text: 0 1px 2px rgba(0, 0, 0, 0.1) !default;            // Text shadow for legibility
$semantic-shadow-image: $base-shadow-sm !default;                          // Image/media shadows
$semantic-shadow-separator: $base-shadow-inner !default;                   // Divider/separator shadows

// AI-SPECIFIC SHADOWS - Special AI/tech themed shadows
$semantic-shadow-ai-element: $base-shadow-ai-glow !default;                // AI/tech themed glow
$semantic-shadow-ai-active: $base-shadow-ai-pulse !default;                // Active AI elements
$semantic-shadow-ai-subtle: $base-shadow-ai-soft !default;                 // Subtle AI theming

// CONTEXT-AWARE SHADOWS - Theme and context sensitive
$semantic-shadow-success: 0 0 0 2px rgba($semantic-color-success, 0.12) !default;   // Success state
$semantic-shadow-warning: 0 0 0 2px rgba($semantic-color-warning, 0.12) !default;   // Warning state
$semantic-shadow-danger: 0 0 0 2px rgba($semantic-color-danger, 0.12) !default;     // Danger state
$semantic-shadow-info: 0 0 0 2px rgba($semantic-color-info, 0.12) !default;         // Info state

// ==========================================================================
// BACKWARDS COMPATIBILITY ALIASES
// ==========================================================================
// Aliases for existing shadow patterns in the codebase

$semantic-shadow-elevated: $base-shadow-md !default;                        // General elevated elements
$semantic-shadow-floating: $base-shadow-lg !default;                        // Floating elements

// INDIVIDUAL SEMANTIC SHADOW TOKENS - Direct access to all base shadow values

// STANDARD SHADOWS
$semantic-shadow-xs: $base-shadow-xs !default;
$semantic-shadow-sm: $base-shadow-sm !default;
$semantic-shadow-md: $base-shadow-md !default;
$semantic-shadow-lg: $base-shadow-lg !default;
$semantic-shadow-xl: $base-shadow-xl !default;
$semantic-shadow-2xl: $base-shadow-2xl !default;
$semantic-shadow-inner: $base-shadow-inner !default;
$semantic-shadow-none: $base-shadow-none !default;

// AI SHADOWS
$semantic-shadow-ai-glow: $base-shadow-ai-glow !default;
$semantic-shadow-ai-pulse: $base-shadow-ai-pulse !default;
$semantic-shadow-ai-soft: $base-shadow-ai-soft !default;cgRMxc /QOPACITY INDEXaS*ain index file for semantic opacity tokensaO
@forward 'semantic-opacity';'#^rx: QZ-INDEX INDEX
Qz-index tokens
N*	z-index';.IȸxH// ==========================================================================
// SEMANTIC OPACITY
// ==========================================================================
// Meaningful opacity tokens for visibility and transparency effects
// Maps base opacity values to contextual usage patterns
// ==========================================================================
@use '../../base/opacity' as *;

// VISIBILITY HIERARCHY - Progressive transparency levels
$semantic-opacity-invisible: $base-opacity-0 !default;             // Completely transparent
$semantic-opacity-subtle: $base-opacity-5 !default;               // Barely visible
$semantic-opacity-faint: $base-opacity-10 !default;               // Very faint
$semantic-opacity-light: $base-opacity-20 !default;               // Light transparency
$semantic-opacity-medium: $base-opacity-50 !default;              // Half transparent
$semantic-opacity-heavy: $base-opacity-75 !default;               // Mostly opaque
$semantic-opacity-opaque: $base-opacity-100 !default;             // Fully opaque

// INTERACTION STATES - Element state opacity
$semantic-opacity-disabled: $base-opacity-40 !default;            // Disabled elements
$semantic-opacity-hover: $base-opacity-80 !default;               // Hover state
$semantic-opacity-active: $base-opacity-90 !default;              // Active/pressed state
$semantic-opacity-focus: $base-opacity-100 !default;              // Focused elements

// OVERLAY OPACITY - Background overlays and modals
$semantic-opacity-backdrop: $base-opacity-50 !default;            // Modal backdrop
$semantic-opacity-scrim: $base-opacity-75 !default;               // Dark overlay
$semantic-opacity-overlay-light: $base-opacity-10 !default;       // Light overlay
$semantic-opacity-overlay-medium: $base-opacity-30 !default;      // Medium overlay
$semantic-opacity-overlay-heavy: $base-opacity-60 !default;       // Heavy overlay

// TEXT OPACITY - Text visibility levels
$semantic-opacity-text-primary: $base-opacity-100 !default;       // Primary text
$semantic-opacity-text-secondary: $base-opacity-70 !default;      // Secondary text
$semantic-opacity-text-tertiary: $base-opacity-50 !default;       // Tertiary text
$semantic-opacity-text-disabled: $base-opacity-30 !default;       // Disabled text
$semantic-opacity-text-placeholder: $base-opacity-60 !default;    // Placeholder text

// BORDER OPACITY - Border visibility levels
$semantic-opacity-border-subtle: $base-opacity-10 !default;       // Subtle borders
$semantic-opacity-border-normal: $base-opacity-20 !default;       // Normal borders
$semantic-opacity-border-emphasis: $base-opacity-40 !default;     // Emphasized borders
$semantic-opacity-border-strong: $base-opacity-60 !default;       // Strong borders

// SHADOW OPACITY - Shadow transparency levels
$semantic-opacity-shadow-subtle: $base-opacity-5 !default;        // Subtle shadows
$semantic-opacity-shadow-normal: $base-opacity-10 !default;       // Normal shadows
$semantic-opacity-shadow-emphasis: $base-opacity-25 !default;     // Emphasized shadows
$semantic-opacity-shadow-strong: $base-opacity-40 !default;       // Strong shadows

// LOADING STATES - Loading animation opacity
$semantic-opacity-loading-min: $base-opacity-30 !default;         // Loading animation min
$semantic-opacity-loading-max: $base-opacity-70 !default;         // Loading animation max
$semantic-opacity-skeleton: $base-opacity-10 !default;            // Skeleton loading

// NOTIFICATION OPACITY - Alert and notification transparency
$semantic-opacity-toast: $base-opacity-95 !default;               // Toast notifications
$semantic-opacity-alert: $base-opacity-90 !default;               // Alert messages
$semantic-opacity-badge: $base-opacity-100 !default;              // Badge elements

// GLASS EFFECT OPACITY - Glassmorphism transparency levels
$semantic-opacity-glass-light: $base-opacity-10 !default;         // Light glass effect
$semantic-opacity-glass-medium: $base-opacity-20 !default;        // Medium glass effect
$semantic-opacity-glass-heavy: $base-opacity-30 !default;         // Heavy glass effect

// INDIVIDUAL SEMANTIC OPACITY TOKENS - Direct access to all base opacity values
$semantic-opacity-0: $base-opacity-0 !default;
$semantic-opacity-5: $base-opacity-5 !default;
$semantic-opacity-10: $base-opacity-10 !default;
$semantic-opacity-20: $base-opacity-20 !default;
$semantic-opacity-25: $base-opacity-25 !default;
$semantic-opacity-30: $base-opacity-30 !default;
$semantic-opacity-40: $base-opacity-40 !default;
$semantic-opacity-50: $base-opacity-50 !default;
$semantic-opacity-60: $base-opacity-60 !default;
$semantic-opacity-70: $base-opacity-70 !default;
$semantic-opacity-75: $base-opacity-75 !default;
$semantic-opacity-80: $base-opacity-80 !default;
$semantic-opacity-90: $base-opacity-90 !default;
$semantic-opacity-95: $base-opacity-95 !default;
$semantic-opacity-100: $base-opacity-100 !default;/7x"// ==========================================================================
// SEMANTIC SIZING
// ==========================================================================
// Meaningful sizing tokens for components and layout elements
// Maps base sizing values to contextual usage patterns
// ==========================================================================
@use '../../base/sizing' as *;

// COMPONENT SIZING - UI element dimensions
$semantic-sizing-button-height-sm: $base-sizing-button-sm !default;        // 32px - Small button height
$semantic-sizing-button-height-md: $base-sizing-button-md !default;        // 40px - Medium button height  
$semantic-sizing-button-height-lg: $base-sizing-button-lg !default;        // 48px - Large button height

$semantic-sizing-input-height-sm: $base-sizing-input-sm !default;          // 32px - Small input height
$semantic-sizing-input-height-md: $base-sizing-input-md !default;          // 40px - Medium input height
$semantic-sizing-input-height-lg: $base-sizing-input-lg !default;          // 48px - Large input height

// ICON SIZING - Icon dimensions for different contexts
$semantic-sizing-icon-inline: $base-sizing-icon-sm !default;               // 16px - Inline with text
$semantic-sizing-icon-button: $base-sizing-icon-md !default;               // 20px - In buttons
$semantic-sizing-icon-navigation: $base-sizing-icon-lg !default;           // 24px - Navigation items
$semantic-sizing-icon-header: $base-sizing-icon-xl !default;               // 32px - Page headers
$semantic-sizing-icon-hero: $base-sizing-icon-3xl !default;                // 48px - Hero sections
$semantic-sizing-icon-feature: $base-sizing-icon-4xl !default;             // 64px - Feature highlights

// AVATAR SIZING - User avatar dimensions
$semantic-sizing-avatar-inline: $base-sizing-avatar-xs !default;           // 24px - Inline avatars
$semantic-sizing-avatar-comment: $base-sizing-avatar-sm !default;          // 32px - Comment avatars
$semantic-sizing-avatar-card: $base-sizing-avatar-md !default;             // 40px - Card avatars
$semantic-sizing-avatar-nav: $base-sizing-avatar-lg !default;              // 48px - Navigation avatars
$semantic-sizing-avatar-profile: $base-sizing-avatar-xl !default;          // 64px - Profile avatars
$semantic-sizing-avatar-hero: $base-sizing-avatar-2xl !default;            // 80px - Hero profile avatars

// INTERACTION SIZING - Touch and click targets
$semantic-sizing-touch-minimum: $base-sizing-touch-minimum !default;       // 44px - Minimum touch target
$semantic-sizing-touch-comfortable: $base-sizing-touch-comfortable !default; // 48px - Comfortable touch
$semantic-sizing-touch-spacious: $base-sizing-touch-spacious !default;     // 56px - Spacious touch

$semantic-sizing-clickable-minimum: $base-sizing-interaction-min-clickable !default;  // 32px - Minimum clickable

// LAYOUT SIZING - Container and layout dimensions
$semantic-sizing-sidebar-collapsed: $base-sizing-width-16 !default;        // 4rem - Collapsed sidebar
$semantic-sizing-sidebar-expanded: $base-sizing-width-64 !default;         // 16rem - Expanded sidebar
$semantic-sizing-sidebar-wide: $base-sizing-width-80 !default;             // 20rem - Wide sidebar

$semantic-sizing-navbar-height: $base-sizing-height-16 !default;           // 4rem - Navigation bar height
$semantic-sizing-header-height: $base-sizing-height-20 !default;           // 5rem - Page header height
$semantic-sizing-footer-height: $base-sizing-height-24 !default;           // 6rem - Footer height

// CONTENT SIZING - Text and content areas
$semantic-sizing-content-narrow: $base-sizing-max-width-2xl !default;      // 42rem - Narrow content
$semantic-sizing-content-medium: $base-sizing-max-width-4xl !default;      // 56rem - Medium content
$semantic-sizing-content-wide: $base-sizing-max-width-6xl !default;        // 72rem - Wide content
$semantic-sizing-content-full: $base-sizing-max-width-full !default;       // 100% - Full width content

$semantic-sizing-prose-width: $base-sizing-max-width-prose !default;       // 65ch - Optimal reading width

// CARD SIZING - Card and panel dimensions
$semantic-sizing-card-width-sm: $base-sizing-width-64 !default;            // 16rem - Small cards
$semantic-sizing-card-width-md: $base-sizing-width-80 !default;            // 20rem - Medium cards
$semantic-sizing-card-width-lg: $base-sizing-width-96 !default;            // 24rem - Large cards

$semantic-sizing-card-height-sm: $base-sizing-height-32 !default;          // 8rem - Small card height
$semantic-sizing-card-height-md: $base-sizing-height-48 !default;          // 12rem - Medium card height
$semantic-sizing-card-height-lg: $base-sizing-height-64 !default;          // 16rem - Large card height

// MODAL SIZING - Dialog and modal dimensions
$semantic-sizing-modal-width-sm: $base-sizing-max-width-md !default;       // 28rem - Small modals
$semantic-sizing-modal-width-md: $base-sizing-max-width-lg !default;       // 32rem - Medium modals
$semantic-sizing-modal-width-lg: $base-sizing-max-width-2xl !default;      // 42rem - Large modals
$semantic-sizing-modal-width-xl: $base-sizing-max-width-4xl !default;      // 56rem - Extra large modals

$semantic-sizing-modal-height-max: 80vh !default;                          // Maximum modal height

// BREAKPOINT SIZING - Responsive design breakpoints
$semantic-sizing-breakpoint-mobile: $base-sizing-max-width-screen-sm !default;     // 640px
$semantic-sizing-breakpoint-tablet: $base-sizing-max-width-screen-md !default;     // 768px
$semantic-sizing-breakpoint-desktop: $base-sizing-max-width-screen-lg !default;    // 1024px
$semantic-sizing-breakpoint-wide: $base-sizing-max-width-screen-xl !default;       // 1280px
$semantic-sizing-breakpoint-ultra: $base-sizing-max-width-screen-2xl !default;     // 1536px

// FORM SIZING - Form element dimensions
$semantic-sizing-form-field-width-sm: $base-sizing-width-32 !default;      // 8rem - Small form fields
$semantic-sizing-form-field-width-md: $base-sizing-width-48 !default;      // 12rem - Medium form fields
$semantic-sizing-form-field-width-lg: $base-sizing-width-64 !default;      // 16rem - Large form fields
$semantic-sizing-form-field-width-full: $base-sizing-width-full !default;  // 100% - Full width fields

// DIVIDER SIZING - Line and separator dimensions
$semantic-sizing-divider-thin: $base-sizing-line-1 !default;               // 1px - Thin dividers
$semantic-sizing-divider-medium: $base-sizing-line-2 !default;             // 2px - Medium dividers
$semantic-sizing-divider-thick: $base-sizing-line-4 !default;              // 4px - Thick dividers
$semantic-sizing-divider-heavy: $base-sizing-line-8 !default;              // 8px - Heavy dividers

// UTILITY SIZING - Common sizing patterns
$semantic-sizing-full-viewport-width: 100vw !default;                      // Full viewport width
$semantic-sizing-full-viewport-height: 100vh !default;                     // Full viewport height
$semantic-sizing-half-viewport-height: 50vh !default;                      // Half viewport height

$semantic-sizing-container-padding: $base-sizing-width-4 !default;         // 1rem - Container padding
$semantic-sizing-container-padding-lg: $base-sizing-width-6 !default;      // 1.5rem - Large container padding

// APPBAR SIZING - Application bar height variants
$semantic-sizing-appbar-compact: $base-sizing-height-12 !default;          // 3rem/48px - Compact appbar
$semantic-sizing-appbar-standard: $base-sizing-height-16 !default;         // 4rem/64px - Standard appbar  
$semantic-sizing-appbar-large: $base-sizing-height-20 !default;            // 5rem/80px - Large appbar
$semantic-sizing-appbar-prominent: $base-sizing-height-24 !default;        // 6rem/96px - Prominent appbar

$semantic-sizing-touch-target: $base-sizing-touch-comfortable !default;    // 48px - Touch target size

// LAYER/Z-INDEX TOKENS - Stacking order hierarchy
$semantic-layer-base: 0 !default;                                          // Base layer for content
$semantic-layer-dropdown: 1000 !default;                                   // Dropdowns and menus
$semantic-layer-overlay: 2000 !default;                                    // Overlays and backdrops
$semantic-layer-modal: 3000 !default;                                      // Modal dialogs
$semantic-layer-tooltip: 4000 !default;                                    // Tooltips and hints
$semantic-layer-appbar: 100 !default;                                      // App bars and navigation
$semantic-layer-sidebar: 50 !default;                                      // Side navigation
$semantic-layer-banner: 200 !default;                                      // Banners and alerts

// AI-SPECIFIC SIZING - Special AI/tech themed sizes  
$semantic-sizing-ai-indicator: $base-sizing-ai-indicator !default;         // 20px - AI indicators
$semantic-sizing-ai-glow: $base-sizing-ai-glow !default;                   // 40px - AI glow effectsaBx(\// ==========================================================================
// SEMANTIC SPACING
// ==========================================================================
// Meaningful spacing tokens for layout and component design
// Maps base spacing values to contextual usage patterns
// ==========================================================================
@use '../../base/spacing' as *;

// COMPONENT SPACING - Internal component spacing
$semantic-spacing-component-xs: $base-spacing-1 !default;              // 0.25rem - tight spacing
$semantic-spacing-component-sm: $base-spacing-2 !default;              // 0.5rem - small spacing
$semantic-spacing-component-md: $base-spacing-3 !default;              // 0.75rem - medium spacing
$semantic-spacing-component-lg: $base-spacing-4 !default;              // 1rem - large spacing
$semantic-spacing-component-xl: $base-spacing-6 !default;              // 1.5rem - extra large spacing

$semantic-spacing-component-padding-xs: $base-spacing-1 !default;      // 0.25rem - tight padding
$semantic-spacing-component-padding-sm: $base-spacing-2 !default;      // 0.5rem - small padding
$semantic-spacing-component-padding-md: $base-spacing-3 !default;      // 0.75rem - medium padding
$semantic-spacing-component-padding-lg: $base-spacing-4 !default;      // 1rem - large padding
$semantic-spacing-component-padding-xl: $base-spacing-6 !default;      // 1.5rem - extra large padding

// LAYOUT SPACING - Between major layout elements
$semantic-spacing-layout-section-xs: $base-spacing-8 !default;         // 2rem - small section gap
$semantic-spacing-layout-section-sm: $base-spacing-12 !default;        // 3rem - medium section gap
$semantic-spacing-layout-section-md: $base-spacing-16 !default;        // 4rem - large section gap
$semantic-spacing-layout-section-lg: $base-spacing-20 !default;        // 5rem - extra large section gap
$semantic-spacing-layout-section-xl: $base-spacing-24 !default;        // 6rem - huge section gap

// CONTENT SPACING - Text and content flow
$semantic-spacing-content-paragraph: $base-spacing-4 !default;         // 1rem - paragraph spacing
$semantic-spacing-content-heading: $base-spacing-6 !default;           // 1.5rem - heading spacing
$semantic-spacing-content-list-item: $base-spacing-2 !default;         // 0.5rem - list item spacing
$semantic-spacing-content-line-tight: $base-spacing-1 !default;        // 0.25rem - tight line spacing
$semantic-spacing-content-line-normal: $base-spacing-2 !default;       // 0.5rem - normal line spacing

// INTERACTIVE SPACING - Clickable elements
$semantic-spacing-interactive-button-padding-x: $base-spacing-4 !default;  // 1rem - button horizontal padding
$semantic-spacing-interactive-button-padding-y: $base-spacing-2 !default;  // 0.5rem - button vertical padding
$semantic-spacing-interactive-input-padding-x: $base-spacing-3 !default;   // 0.75rem - input horizontal padding
$semantic-spacing-interactive-input-padding-y: $base-spacing-2-5 !default; // 0.625rem - input vertical padding
$semantic-spacing-interactive-touch-target: $base-spacing-11 !default;     // 2.75rem - minimum touch target

// CARD AND CONTAINER SPACING
$semantic-spacing-container-card-padding: $base-spacing-4 !default;        // 1rem - card internal padding
$semantic-spacing-container-card-padding-lg: $base-spacing-6 !default;     // 1.5rem - large card padding
$semantic-spacing-container-modal-padding: $base-spacing-6 !default;       // 1.5rem - modal padding
$semantic-spacing-container-sidebar-padding: $base-spacing-4 !default;     // 1rem - sidebar padding

// NAVIGATION SPACING
$semantic-spacing-nav-item-padding-x: $base-spacing-3 !default;            // 0.75rem - nav item horizontal padding
$semantic-spacing-nav-item-padding-y: $base-spacing-2 !default;            // 0.5rem - nav item vertical padding
$semantic-spacing-nav-section-gap: $base-spacing-6 !default;               // 1.5rem - nav section gaps
$semantic-spacing-nav-submenu-indent: $base-spacing-4 !default;            // 1rem - submenu indentation

// GRID AND LAYOUT GAPS
$semantic-spacing-grid-gap-xs: $base-spacing-2 !default;                   // 0.5rem - tight grid
$semantic-spacing-grid-gap-sm: $base-spacing-3 !default;                   // 0.75rem - small grid
$semantic-spacing-grid-gap-md: $base-spacing-4 !default;                   // 1rem - medium grid
$semantic-spacing-grid-gap-lg: $base-spacing-6 !default;                   // 1.5rem - large grid
$semantic-spacing-grid-gap-xl: $base-spacing-8 !default;                   // 2rem - extra large grid

// FORM SPACING
$semantic-spacing-form-field-gap: $base-spacing-4 !default;                // 1rem - gap between form fields
$semantic-spacing-form-group-gap: $base-spacing-6 !default;                // 1.5rem - gap between form groups
$semantic-spacing-form-section-gap: $base-spacing-8 !default;              // 2rem - gap between form sections
$semantic-spacing-form-label-gap: $base-spacing-1 !default;                // 0.25rem - label to input gap

// UTILITY SPACING - Common spacing needs
$semantic-spacing-stack-xs: $base-spacing-1 !default;                      // 0.25rem - tight stack
$semantic-spacing-stack-sm: $base-spacing-2 !default;                      // 0.5rem - small stack
$semantic-spacing-stack-md: $base-spacing-4 !default;                      // 1rem - medium stack
$semantic-spacing-stack-lg: $base-spacing-6 !default;                      // 1.5rem - large stack
$semantic-spacing-stack-xl: $base-spacing-8 !default;                      // 2rem - extra large stack

// MICRO SPACING - Fine-tuned spacing
$semantic-spacing-micro-hairline: $base-spacing-micro-hairline !default;   // 0.5px - hairline
$semantic-spacing-micro-tight: $base-spacing-0-5 !default;                 // 0.125rem - very tight
$semantic-spacing-micro-icon-gap: $base-spacing-1-5 !default;              // 0.375rem - icon to text gap

// ==========================================================================
// BACKWARDS COMPATIBILITY ALIASES
// ==========================================================================
// Aliases for existing usage patterns in the codebase

// Component spacing aliases
$semantic-spacing-component-2xs: $base-spacing-1 !default;                 // 0.25rem
$semantic-spacing-component-xs: $base-spacing-2 !default;                  // 0.5rem  
$semantic-spacing-component-sm: $base-spacing-3 !default;                  // 0.75rem
$semantic-spacing-component-md: $base-spacing-4 !default;                  // 1rem
$semantic-spacing-component-lg: $base-spacing-6 !default;                  // 1.5rem
$semantic-spacing-component-xl: $base-spacing-8 !default;                  // 2rem

// Layout spacing aliases  
$semantic-spacing-layout-xs: $base-spacing-2 !default;                     // 0.5rem
$semantic-spacing-layout-sm: $base-spacing-4 !default;                     // 1rem
$semantic-spacing-layout-md: $base-spacing-6 !default;                     // 1.5rem
$semantic-spacing-layout-lg: $base-spacing-8 !default;                     // 2rem
$semantic-spacing-layout-xl: $base-spacing-12 !default;                    // 3rem

// Section spacing aliases
$semantic-spacing-section-xs: $base-spacing-8 !default;                    // 2rem
$semantic-spacing-section-sm: $base-spacing-12 !default;                   // 3rem
$semantic-spacing-section-md: $base-spacing-16 !default;                   // 4rem
$semantic-spacing-section-lg: $base-spacing-20 !default;                   // 5rem
$semantic-spacing-section-xl: $base-spacing-24 !default;                   // 6rem

// INDIVIDUAL SEMANTIC SPACING VARIABLES - Direct access to all base spacing values
$semantic-spacing-0: $base-spacing-0 !default;
$semantic-spacing-0-5: $base-spacing-0-5 !default;
$semantic-spacing-1: $base-spacing-1 !default;
$semantic-spacing-1-5: $base-spacing-1-5 !default;
$semantic-spacing-2: $base-spacing-2 !default;
$semantic-spacing-2-5: $base-spacing-2-5 !default;
$semantic-spacing-3: $base-spacing-3 !default;
$semantic-spacing-3-5: $base-spacing-3-5 !default;
$semantic-spacing-4: $base-spacing-4 !default;
$semantic-spacing-4-5: $base-spacing-4-5 !default;
$semantic-spacing-5: $base-spacing-5 !default;
$semantic-spacing-6: $base-spacing-6 !default;
$semantic-spacing-7: $base-spacing-7 !default;
$semantic-spacing-8: $base-spacing-8 !default;
$semantic-spacing-9: $base-spacing-9 !default; 
$semantic-spacing-10: $base-spacing-10 !default;
$semantic-spacing-11: $base-spacing-11 !default;
$semantic-spacing-12: $base-spacing-12 !default;
$semantic-spacing-14: $base-spacing-14 !default;
$semantic-spacing-16: $base-spacing-16 !default;
$semantic-spacing-20: $base-spacing-20 !default;
$semantic-spacing-24: $base-spacing-24 !default;
$semantic-spacing-28: $base-spacing-28 !default;
$semantic-spacing-32: $base-spacing-32 !default;
$semantic-spacing-36: $base-spacing-36 !default;
$semantic-spacing-40: $base-spacing-40 !default;
$semantic-spacing-44: $base-spacing-44 !default;
$semantic-spacing-48: $base-spacing-48 !default;
$semantic-spacing-52: $base-spacing-52 !default;
$semantic-spacing-56: $base-spacing-56 !default;
$semantic-spacing-60: $base-spacing-60 !default;
$semantic-spacing-64: $base-spacing-64 !default;
$semantic-spacing-72: $base-spacing-72 !default;
$semantic-spacing-80: $base-spacing-80 !default;
$semantic-spacing-96: $base-spacing-96 !default;
$semantic-spacing-128: $base-spacing-128 !default;
$semantic-spacing-160: $base-spacing-160 !default;
$semantic-spacing-192: $base-spacing-192 !default;
$semantic-spacing-224: $base-spacing-224 !default;
$semantic-spacing-256: $base-spacing-256 !default;

// SEMANTIC SIZE ALIASES - Common semantic size names
$semantic-spacing-xs: $base-spacing-semantic-xs !default;              // 0.5rem
$semantic-spacing-sm: $base-spacing-semantic-sm !default;              // 0.75rem
$semantic-spacing-md: $base-spacing-semantic-md !default;              // 1rem
$semantic-spacing-lg: $base-spacing-semantic-lg !default;              // 1.5rem
$semantic-spacing-xl: $base-spacing-semantic-xl !default;              // 2rem
$semantic-spacing-2xl: $base-spacing-semantic-2xl !default;            // 2.5rem
$semantic-spacing-3xl: $base-spacing-semantic-3xl !default;            // 3rem
$semantic-spacing-4xl: $base-spacing-semantic-4xl !default;            // 4rem
$semantic-spacing-5xl: $base-spacing-semantic-5xl !default;            // 5remپ1x[>`^oLV|W; m	x3// ==========================================================================
// SEMANTIC Z-INDEX
// ==========================================================================
// Meaningful z-index tokens for layering and stacking context
// Maps base z-index values to contextual usage patterns
// ==========================================================================
@use '../../base/z-index' as *;

// LAYERING HIERARCHY - Component and UI element stacking
$semantic-z-index-background: $base-z-index-neg-1 !default;           // Background elements
$semantic-z-index-base: $base-z-index-0 !default;                     // Base layer elements
$semantic-z-index-content: $base-z-index-10 !default;                 // Main content layer
$semantic-z-index-elevated: $base-z-index-20 !default;                // Elevated content
$semantic-z-index-floating: $base-z-index-30 !default;                // Floating elements

// NAVIGATION LAYERS - Menu and navigation stacking
$semantic-z-index-nav-primary: $base-z-index-40 !default;             // Primary navigation
$semantic-z-index-nav-secondary: $base-z-index-50 !default;           // Secondary navigation
$semantic-z-index-breadcrumb: $base-z-index-10 !default;              // Breadcrumb navigation

// INTERACTIVE LAYERS - User interaction elements
$semantic-z-index-dropdown: $base-z-index-dropdown !default;          // Dropdown menus
$semantic-z-index-popover: $base-z-index-popover !default;            // Popovers and tooltips
$semantic-z-index-tooltip: $base-z-index-tooltip !default;            // Tooltips
$semantic-z-index-banner: $base-z-index-banner !default;              // Notification banners

// OVERLAY LAYERS - Modal and overlay elements
$semantic-z-index-sticky: $base-z-index-sticky !default;              // Sticky elements
$semantic-z-index-fixed: $base-z-index-fixed !default;                // Fixed position elements
$semantic-z-index-modal-backdrop: $base-z-index-modal-backdrop !default; // Modal backdrop
$semantic-z-index-overlay: $base-z-index-overlay !default;            // General overlays
$semantic-z-index-modal: $base-z-index-modal !default;                // Modal dialogs

// NOTIFICATION LAYERS - Alerts and notifications
$semantic-z-index-toast: $base-z-index-toast !default;                // Toast notifications
$semantic-z-index-alert: $base-z-index-60 !default;                   // Alert messages
$semantic-z-index-snackbar: $base-z-index-70 !default;                // Snackbar notifications

// UTILITY LAYERS - Special purpose elements
$semantic-z-index-loading: $base-z-index-80 !default;                 // Loading overlays
$semantic-z-index-debug: $base-z-index-debug !default;                // Debug/development elements
$semantic-z-index-max: $base-z-index-max !default;                    // Maximum z-index value

// COMPONENT-SPECIFIC LAYERS
$semantic-z-index-header: $base-z-index-30 !default;                  // Page/section headers
$semantic-z-index-sidebar: $base-z-index-20 !default;                 // Sidebar panels
$semantic-z-index-footer: $base-z-index-10 !default;                  // Page/section footers
$semantic-z-index-card-hover: $base-z-index-10 !default;              // Cards on hover
$semantic-z-index-button-focus: $base-z-index-10 !default;            // Focused buttons

// INDIVIDUAL SEMANTIC Z-INDEX TOKENS - Direct access to all base z-index values
$semantic-z-index-neg-10: $base-z-index-neg-10 !default;
$semantic-z-index-neg-1: $base-z-index-neg-1 !default;
$semantic-z-index-0: $base-z-index-0 !default;
$semantic-z-index-10: $base-z-index-10 !default;
$semantic-z-index-20: $base-z-index-20 !default;
$semantic-z-index-30: $base-z-index-30 !default;
$semantic-z-index-40: $base-z-index-40 !default;
$semantic-z-index-50: $base-z-index-50 !default;
$semantic-z-index-60: $base-z-index-60 !default;
$semantic-z-index-70: $base-z-index-70 !default;
$semantic-z-index-80: $base-z-index-80 !default;
$semantic-z-index-90: $base-z-index-90 !default;
$semantic-z-index-100: $base-z-index-100 !default;B'xy// ==========================================================================
// DESIGN TOKENS ENTRY POINT
// ==========================================================================
// Complete design token system including base and semantic tokens
// Use this file to import only tokens without components/commons
// 
// Usage:
//   @use 'path/to/shared-ui/src/styles/tokens' as tokens;
//   color: tokens.$semantic-color-primary;
//   margin: tokens.$base-space-4;
// ==========================================================================

// Forward complete semantic layer (includes base tokens)
@forward 'semantic/index';S'jxeC95 rx 0#Ph#aͮz[̲,!x[̴iBraۻ;w},Ѫc`3qZ/ yNx[̴iBHG'%;wjנz2{x[̴iBȉ_\8qCbuqzF(x[̴iBHLGݘg7Q-%Cii aUx[̴iBQ-{XJ%JM ox a\(L"{ru-x ̅2¸ϛmvVۑ]:x b2V9i%]v;53x -v,m>%54"y6t>R-x GBSBCnR!	0x m`#40000 fab-menu jnEs-{`&40000 icon-button lօkCAF[8&9ǥUlZٲb	?{CL3H>%M@jSx, _d5ٓoB37R(R6O>%Mx8!]63/%B!P7NŰGnE$l9q   x $LK8f7&hl1>4K9zNbscss Y`3 I=#+ڑOtܬS-EmT.B2)L8c_oq3/u}Ag*kP0 ݘqLtx;Q"LoͦnL6QEdjx" o"+@X&_#1H3xz@use "../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

.ui-button {
  // Reset and base styles
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: $semantic-border-radius-md;
  cursor: pointer;
  text-decoration: none;
  outline: none;
  position: relative;
  overflow: hidden;
  
  // Typography
  font-family: $semantic-typography-font-family-sans;
  font-weight: $semantic-typography-font-weight-medium;
  text-align: center;
  text-transform: none;
  letter-spacing: $semantic-typography-letter-spacing-normal;
  white-space: nowrap;
  
  // Interaction states
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  box-sizing: border-box;
  
  // Transitions
  transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
  
  // Size variants
  &--small {
    height: $semantic-spacing-9; // 2.25rem
    padding: 0 $semantic-spacing-3; // 0.75rem
    font-size: $semantic-typography-font-size-sm;
    line-height: $semantic-typography-line-height-tight;
    min-width: $semantic-spacing-16; // 4rem
  }
  
  &--medium {
    height: $semantic-spacing-11; // 2.75rem
    padding: 0 $semantic-spacing-4; // 1rem
    font-size: $semantic-typography-font-size-md;
    line-height: $semantic-typography-line-height-normal;
    min-width: $semantic-spacing-20; // 5rem
  }
  
  &--large {
    height: $semantic-spacing-12; // 3rem + a bit
    padding: 0 $semantic-spacing-6; // 1.5rem
    font-size: $semantic-typography-font-size-lg;
    line-height: $semantic-typography-line-height-normal;
    min-width: $semantic-spacing-24; // 6rem
  }
  
  // Filled variant (primary)
  &--filled {
    background-color: $semantic-color-interactive-primary;
    color: $semantic-color-on-brand-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-brand-primary;
      transform: translateY(-1px);
      box-shadow: $semantic-shadow-button-hover;
    }
    
    &:active:not(:disabled) {
      transform: scale(0.98);
      box-shadow: $semantic-shadow-button-active;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
  
  // Tonal variant
  &--tonal {
    background-color: $semantic-color-container-primary;
    color: $semantic-color-on-container-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-container-primary;
      transform: translateY(-1px);
      box-shadow: $semantic-shadow-button-hover;
      filter: brightness(0.95);
    }
    
    &:active:not(:disabled) {
      transform: scale(0.98);
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
  
  // Outlined variant
  &--outlined {
    background-color: transparent;
    color: $semantic-color-interactive-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-container-primary;
      border-color: $semantic-color-interactive-primary;
      transform: translateY(-1px);
    }
    
    &:active:not(:disabled) {
      background-color: $semantic-color-container-primary;
      transform: scale(0.98);
      filter: brightness(0.9);
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
  
  // States
  &--disabled {
    opacity: 0.38;
    cursor: not-allowed;
    pointer-events: none;
  }
  
  &--loading {
    cursor: wait;
    
    .button-content {
      opacity: 0;
    }
  }
  
  &--full-width {
    width: 100%;
  }

  // Icon styles
  .button-content {
    display: flex;
    align-items: center;
    justify-content: center;
  }

  .button-icon {
    display: inline-flex;
    align-items: center;
    flex-shrink: 0;

    &--left {
      margin-right: $semantic-spacing-2; // 0.5rem
    }

    &--right {
      margin-left: $semantic-spacing-2; // 0.5rem
    }
  }

  // Size-specific icon adjustments
  &--small .button-icon {
    font-size: $semantic-typography-font-size-xs;
    
    &--left {
      margin-right: $semantic-spacing-1-5; // 0.375rem
    }
    
    &--right {
      margin-left: $semantic-spacing-1-5; // 0.375rem
    }
  }

  &--medium .button-icon {
    font-size: $semantic-typography-font-size-sm;
    
    &--left {
      margin-right: $semantic-spacing-2; // 0.5rem
    }
    
    &--right {
      margin-left: $semantic-spacing-2; // 0.5rem
    }
  }

  &--large .button-icon {
    font-size: $semantic-typography-font-size-md;
    
    &--left {
      margin-right: $semantic-spacing-2-5; // 0.625rem
    }
    
    &--right {
      margin-left: $semantic-spacing-2-5; // 0.625rem
    }
  }
  
  // Loader styles
  .button-loader {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  
  .button-spinner {
    width: $semantic-spacing-4; // 1rem
    height: $semantic-spacing-4; // 1rem
    border: 2px solid currentColor;
    border-top: 2px solid transparent;
    border-radius: 50%;
    animation: spin 1s linear infinite;
    opacity: 0.7;
  }
  
  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
  
  // Ripple effect
  &::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.3) 0%, transparent 70%);
    transform: scale(0);
    opacity: 0;
    pointer-events: none;
    transition: transform 0.3s ease, opacity 0.3s ease;
  }
  
  &:active:not(:disabled)::after {
    transform: scale(1);
    opacity: 1;
    transition: none;
  }
}Dxk3A8#(5E4sj QbYxx	import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';

export type ButtonVariant = 'filled' | 'tonal' | 'outlined';
export type ButtonSize = 'small' | 'medium' | 'large';
export type IconPosition = 'left' | 'right';

@Component({
  selector: 'ui-button',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <button
      [class]="buttonClasses"
      [disabled]="disabled || loading"
      [type]="type"
      (click)="handleClick($event)"
    >
      @if (loading) {
        <div class="button-loader">
          <div class="button-spinner"></div>
        </div>
      } @else {
        <div class="button-content">
          @if (icon && iconPosition === 'left') {
            <fa-icon [icon]="icon" class="button-icon button-icon--left"></fa-icon>
          }
          <span class="button-text">
            <ng-content></ng-content>
          </span>
          @if (icon && iconPosition === 'right') {
            <fa-icon [icon]="icon" class="button-icon button-icon--right"></fa-icon>
          }
        </div>
      }
    </button>
  `,
  styleUrl: './button.component.scss'
})
export class ButtonComponent {
  @Input() variant: ButtonVariant = 'filled';
  @Input() size: ButtonSize = 'medium';
  @Input() disabled: boolean = false;
  @Input() loading: boolean = false;
  @Input() type: 'button' | 'submit' | 'reset' = 'button';
  @Input() fullWidth: boolean = false;
  @Input() class: string = '';
  @Input() icon?: IconDefinition;
  @Input() iconPosition: IconPosition = 'left';

  @Output() clicked = new EventEmitter<Event>();

  get buttonClasses(): string {
    return [
      'ui-button',
      `ui-button--${this.variant}`,
      `ui-button--${this.size}`,
      this.disabled ? 'ui-button--disabled' : '',
      this.loading ? 'ui-button--loading' : '',
      this.fullWidth ? 'ui-button--full-width' : '',
      this.icon ? 'ui-button--with-icon' : '',
      this.icon ? `ui-button--icon-${this.iconPosition}` : '',
      this.class
    ].filter(Boolean).join(' ');
  }

  handleClick(event: Event): void {
    if (!this.disabled && !this.loading) {
      this.clicked.emit(event);
    }
  }
}x!3aWjEA~QBIeA{F~qTF{X[fy`L7fɩ,-YU`B`CJKJsRJ<
JK443R]e}<=Kb@XP5$fB\p1eǡ62 ?4H-x!^`#gr~dF[#Q{^F9L㏨Ē"ĢDݜĤԜX[%VR $5Eũ)@UP̒T$|)ddf5(ˍ~fYi0/HJv6i`dCVXVu
sRJ:xhT+fX)*j*4+N>&[rt^X!p5Y&;YO^&oBqIQf^5.M' yF]	ߴBB{qP:T,X`a=9Cx%e !Nax 0simple񾓺Fsimple(Simple
+variant: 'primary' | 'secondary' = 'primaryF40j7simple-button',
      `ui-simple-button--${this.variantsimple-button--disabled' : ''na/uH?xu TexJtex4tex((texTtex)Tex	$Tex1~text-button',
      `ui-tex3tex3tex
$i#&xyimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, HostListener, ElementRef, inject } from '@angular/core';
import { CommonModule } from '@angular/common';

export type FabMenuSize = 'sm' | 'md' | 'lg';
export type FabMenuPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
export type FabMenuVariant = 'primary' | 'secondary' | 'success' | 'danger';
export type FabMenuDirection = 'up' | 'down' | 'left' | 'right' | 'auto';

export interface FabMenuItem {
  id: string;
  label: string;
  icon?: string;
  disabled?: boolean;
  variant?: FabMenuVariant;
}

@Component({
  selector: 'ui-fab-menu',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-fab-menu"
      [class.ui-fab-menu--{{size}}]="size"
      [class.ui-fab-menu--{{variant}}]="variant"
      [class.ui-fab-menu--{{position}}]="position"
      [class.ui-fab-menu--{{direction}}]="actualDirection"
      [class.ui-fab-menu--open]="isOpen"
      [class.ui-fab-menu--disabled]="disabled"
      [class.ui-fab-menu--animating]="isAnimating">
      
      <!-- Menu Items -->
      @if (isOpen) {
        <div class="ui-fab-menu__items" role="menu">
          @for (item of menuItems; track item.id) {
            <button
              type="button"
              class="ui-fab-menu__item"
              [class.ui-fab-menu__item--{{item.variant || variant}}]="item.variant || variant"
              [class.ui-fab-menu__item--disabled]="item.disabled"
              [disabled]="item.disabled || disabled"
              [attr.aria-label]="item.label"
              role="menuitem"
              [tabindex]="isOpen ? 0 : -1"
              (click)="handleItemClick(item, $event)"
              (keydown)="handleItemKeydown(item, $event)">
              
              @if (item.icon) {
                <span class="ui-fab-menu__item-icon" [innerHTML]="item.icon"></span>
              }
              
              <span class="ui-fab-menu__item-label">{{ item.label }}</span>
              
              <div class="ui-fab-menu__item-ripple"></div>
            </button>
          }
        </div>
      }
      
      <!-- Main FAB Button -->
      <button
        type="button"
        class="ui-fab-menu__trigger"
        [class.ui-fab-menu__trigger--{{size}}]="size"
        [class.ui-fab-menu__trigger--{{variant}}]="variant"
        [class.ui-fab-menu__trigger--active]="isOpen"
        [disabled]="disabled"
        [attr.aria-expanded]="isOpen"
        [attr.aria-haspopup]="true"
        [attr.aria-label]="triggerLabel"
        role="button"
        (click)="toggle($event)"
        (keydown)="handleTriggerKeydown($event)">
        
        @if (isOpen && closeIcon) {
          <span class="ui-fab-menu__trigger-icon ui-fab-menu__trigger-icon--close" [innerHTML]="closeIcon"></span>
        } @else if (triggerIcon) {
          <span class="ui-fab-menu__trigger-icon ui-fab-menu__trigger-icon--open" [innerHTML]="triggerIcon"></span>
        }
        
        <ng-content></ng-content>
        
        <div class="ui-fab-menu__trigger-ripple"></div>
      </button>
      
      <!-- Backdrop -->
      @if (isOpen && backdrop) {
        <div 
          class="ui-fab-menu__backdrop"
          (click)="close()"
          role="presentation"></div>
      }
    </div>
  `,
  styleUrl: './fab-menu.component.scss'
})
export class FabMenuComponent {
  @Input() size: FabMenuSize = 'md';
  @Input() variant: FabMenuVariant = 'primary';
  @Input() position: FabMenuPosition = 'bottom-right';
  @Input() direction: FabMenuDirection = 'auto';
  @Input() menuItems: FabMenuItem[] = [];
  @Input() disabled = false;
  @Input() triggerIcon?: string;
  @Input() closeIcon?: string;
  @Input() triggerLabel = 'Open menu';
  @Input() backdrop = true;
  @Input() closeOnItemClick = true;
  @Input() closeOnOutsideClick = true;
  
  @Output() opened = new EventEmitter<void>();
  @Output() closed = new EventEmitter<void>();
  @Output() itemClicked = new EventEmitter<{item: FabMenuItem, event: Event}>();
  
  private elementRef = inject(ElementRef);
  
  isOpen = false;
  isAnimating = false;
  
  get actualDirection(): FabMenuDirection {
    if (this.direction !== 'auto') return this.direction;
    
    // Auto-determine direction based on position
    switch (this.position) {
      case 'bottom-right':
      case 'bottom-left':
        return 'up';
      case 'top-right':
      case 'top-left':
        return 'down';
      default:
        return 'up';
    }
  }
  
  @HostListener('document:click', ['$event'])
  onDocumentClick(event: Event): void {
    const target = event.target as Node;
    if (this.closeOnOutsideClick && this.isOpen && target && !this.elementRef.nativeElement.contains(target)) {
      this.close();
    }
  }
  
  @HostListener('keydown.escape')
  onEscapePress(): void {
    if (this.isOpen) {
      this.close();
    }
  }
  
  toggle(event?: Event): void {
    if (this.disabled) return;
    
    if (this.isOpen) {
      this.close();
    } else {
      this.open();
    }
  }
  
  open(): void {
    if (this.disabled || this.isOpen) return;
    
    this.isAnimating = true;
    this.isOpen = true;
    this.opened.emit();
    
    // Focus first menu item after animation
    setTimeout(() => {
      this.isAnimating = false;
      this.focusFirstMenuItem();
    }, 200);
  }
  
  close(): void {
    if (!this.isOpen) return;
    
    this.isAnimating = true;
    this.isOpen = false;
    this.closed.emit();
    
    setTimeout(() => {
      this.isAnimating = false;
    }, 200);
  }
  
  handleItemClick(item: FabMenuItem, event: Event): void {
    if (item.disabled || this.disabled) return;
    
    this.itemClicked.emit({ item, event });
    
    if (this.closeOnItemClick) {
      this.close();
    }
  }
  
  handleTriggerKeydown(event: KeyboardEvent): void {
    switch (event.key) {
      case 'Enter':
      case ' ':
        event.preventDefault();
        this.toggle();
        break;
      case 'ArrowUp':
        if (this.actualDirection === 'up') {
          event.preventDefault();
          if (!this.isOpen) this.open();
        }
        break;
      case 'ArrowDown':
        if (this.actualDirection === 'down') {
          event.preventDefault();
          if (!this.isOpen) this.open();
        }
        break;
    }
  }
  
  handleItemKeydown(item: FabMenuItem, event: KeyboardEvent): void {
    switch (event.key) {
      case 'Enter':
      case ' ':
        event.preventDefault();
        this.handleItemClick(item, event);
        break;
      case 'ArrowUp':
        event.preventDefault();
        this.focusPreviousItem(event.target as HTMLElement);
        break;
      case 'ArrowDown':
        event.preventDefault();
        this.focusNextItem(event.target as HTMLElement);
        break;
      case 'Tab':
        if (event.shiftKey) {
          this.focusPreviousItem(event.target as HTMLElement);
        } else {
          this.focusNextItem(event.target as HTMLElement);
        }
        break;
    }
  }
  
  private focusFirstMenuItem(): void {
    const firstItem = this.elementRef.nativeElement.querySelector('.ui-fab-menu__item:not([disabled])');
    if (firstItem) {
      firstItem.focus();
    }
  }
  
  private focusNextItem(currentElement: HTMLElement): void {
    const items = Array.from(this.elementRef.nativeElement.querySelectorAll('.ui-fab-menu__item:not([disabled])'));
    const currentIndex = items.indexOf(currentElement);
    const nextIndex = (currentIndex + 1) % items.length;
    (items[nextIndex] as HTMLElement).focus();
  }
  
  private focusPreviousItem(currentElement: HTMLElement): void {
    const items = Array.from(this.elementRef.nativeElement.querySelectorAll('.ui-fab-menu__item:not([disabled])'));
    const currentIndex = items.indexOf(currentElement);
    const previousIndex = currentIndex === 0 ? items.length - 1 : currentIndex - 1;
    (items[previousIndex] as HTMLElement).focus();
  }
}
H9xo?A;[class]="getFabMenuClasses()[class]="getItemClasses(item);[class]="getTriggerClasses()	,
  getFabMenuClasses(): string {
    return [
      'ui-fab-menu',
      `ui-fab-menu--${this.size}`,
      `ui-fab-menu--${this.variant}`,
      `ui-fab-menu--${this.position}`,
      `ui-fab-menu--${this.actualDirection}`,
      this.isOpen ? 'ui-fab-m(enu--open' : '',
      this.disabled ? 'O' : '',? '~a' : ''
    ].filter(Boolean).join(' ');
  }

  getTriggerClasses(): string {
    return [
      ' 
',
      ` -${this.size}`,
      ` (-${this.variant}`,
      this.isOpen ? ' 	' : ''
    ].filter(Boolean).join(' ');
  }

  getItemClasses(item: FabMenuItem): string {
    const variant = item.variant || =this.variant;
    return [
      'ui-fab-menu__item',
      `$${variant}`,
      item.disabled ? '/disabled' : ''
    ].filter(Boolean).join(' ');u
x% export * from './fab-menu.component';ӹx)@use "../../../../../ui-design-system/src/styles/semantic/index" as *;
.ui-fab {
  // Reset and base styles
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  cursor: pointer;
  outline: none;
  position: relative;
  overflow: hidden;
  
  // Interaction states
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  box-sizing: border-box;
  
  // Transitions
  transition: all $semantic-motion-duration-normal $semantic-motion-easing-ease-out;
  
  // Size variants
  &--small {
    width: $semantic-spacing-10; // 2.5rem
    height: $semantic-spacing-10; // 2.5rem
    box-shadow: $semantic-shadow-card-hover;
    
    .fab-icon {
      font-size: $semantic-typography-font-size-lg; // 1.125rem
    }
    
    .fab-touch-overlay {
      width: $semantic-spacing-4; // 1rem
      height: $semantic-spacing-4; // 1rem
      top: $semantic-spacing-3; // 0.75rem
      left: $semantic-spacing-3; // 0.75rem
      border-radius: $semantic-border-radius-sm;
    }
    
    .fab-spinner {
      width: $semantic-spacing-4; // 1rem
      height: $semantic-spacing-4; // 1rem
      border-width: $semantic-border-width-2; // 2px (closest to 1.5px)
    }
  }
  
  &--medium {
    width: $semantic-spacing-14; // 3.5rem
    height: $semantic-spacing-14; // 3.5rem
    box-shadow: $semantic-shadow-card-active;
    
    .fab-icon {
      font-size: $semantic-typography-font-size-2xl; // 1.5rem
    }
    
    .fab-touch-overlay {
      width: $semantic-spacing-5; // 1.25rem
      height: $semantic-spacing-5; // 1.25rem
      top: $semantic-spacing-4-5; // ~1.125rem (closest available)
      left: $semantic-spacing-4-5; // ~1.125rem (closest available)
      border-radius: $semantic-border-radius-lg;
    }
    
    .fab-spinner {
      width: $semantic-spacing-5; // 1.25rem
      height: $semantic-spacing-5; // 1.25rem
      border-width: $semantic-border-width-2;
    }
  }
  
  &--large {
    width: $semantic-spacing-24; // 6rem
    height: $semantic-spacing-24; // 6rem
    box-shadow: $semantic-shadow-card-featured;
    
    .fab-icon {
      font-size: $semantic-typography-font-size-5xl; // 3rem (closest to 2.5rem)
    }
    
    .fab-touch-overlay {
      width: $semantic-spacing-10; // 2.5rem
      height: $semantic-spacing-10; // 2.5rem
      top: $semantic-spacing-7; // 1.75rem
      left: $semantic-spacing-7; // 1.75rem
      border-radius: $semantic-border-radius-xl;
    }
    
    .fab-spinner {
      width: $semantic-spacing-8; // 2rem
      height: $semantic-spacing-8; // 2rem
      border-width: $semantic-border-width-3;
    }
  }
  
  // Color variants
  &--primary {
    background-color: $semantic-color-interactive-primary;
    color: $semantic-color-on-brand-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-brand-primary;
      transform: $semantic-motion-hover-transform-scale-md;
      box-shadow: $semantic-shadow-elevation-4;
    }
  }
  
  &--secondary {
    background-color: $semantic-color-interactive-secondary;
    color: $semantic-color-on-brand-secondary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-brand-secondary;
      transform: $semantic-motion-hover-transform-scale-md;
      box-shadow: $semantic-shadow-elevation-4;
    }
  }
  
  &--tertiary {
    background-color: $semantic-color-interactive-tertiary;
    color: $semantic-color-on-brand-tertiary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-brand-tertiary;
      transform: $semantic-motion-hover-transform-scale-md;
      box-shadow: $semantic-shadow-elevation-4;
    }
  }
  
  // Position variants
  &--bottom-right {
    position: fixed;
    bottom: $semantic-spacing-8; // 2rem
    right: $semantic-spacing-6; // 1.5rem
    z-index: $semantic-z-index-toast; // 1080
  }
  
  &--bottom-left {
    position: fixed;
    bottom: $semantic-spacing-8; // 2rem
    left: $semantic-spacing-6; // 1.5rem
    z-index: $semantic-z-index-toast; // 1080
  }
  
  &--top-right {
    position: fixed;
    top: $semantic-spacing-8; // 2rem
    right: $semantic-spacing-6; // 1.5rem
    z-index: $semantic-z-index-toast; // 1080
  }
  
  &--top-left {
    position: fixed;
    top: $semantic-spacing-8; // 2rem
    left: $semantic-spacing-6; // 1.5rem
    z-index: $semantic-z-index-toast; // 1080
  }
  
  // States
  &:active:not(:disabled) {
    transform: scale(0.92);
  }
  
  &:focus-visible {
    box-shadow: 
      $semantic-shadow-button-focus,
      $semantic-shadow-card-active;
  }
  
  &--disabled {
    opacity: $semantic-opacity-disabled;
    cursor: not-allowed;
    pointer-events: none;
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &--loading {
    cursor: wait;
    
    .fab-icon {
      opacity: $semantic-opacity-invisible;
    }
  }
  
  // Pulse effect
  &--pulse {
    overflow: visible;
    
    .fab-pulse {
      position: absolute;
      width: 100%;
      height: 100%;
      background-color: inherit;
      border-radius: inherit;
      animation: fab-pulse 2s infinite;
      z-index: -1;
    }
  }
  
  @keyframes fab-pulse {
    0% {
      transform: scale(1);
      opacity: 1;
    }
    100% {
      transform: scale(1.4);
      opacity: 0;
    }
  }
  
  // Expand animation
  &--expanding {
    animation: fab-expand 300ms cubic-bezier(0, 0, 0.2, 1);
  }
  
  @keyframes fab-expand {
    0% {
      transform: scale(1);
      opacity: 1;
    }
    50% {
      transform: scale(1.2);
      opacity: 0.8;
    }
    100% {
      transform: scale(1);
      opacity: 1;
    }
  }
  
  // Touch overlay for ripple effect
  .fab-touch-overlay {
    position: absolute;
    background-color: rgba(0, 0, 0, 0);
    z-index: 1;
    pointer-events: none;
  }
  
  // Icon container
  .fab-icon {
    position: relative;
    z-index: 2;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
  }
  
  // Loader styles
  .fab-loader {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 3;
  }
  
  .fab-spinner {
    border: 2px solid rgba(255, 255, 255, 0.3);
    border-top: 2px solid white;
    border-radius: 50%;
    animation: spin 1s linear infinite;
  }
  
  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
  
  // Ripple effect
  &::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.3) 0%, transparent 70%);
    transform: scale(0);
    opacity: 0;
    pointer-events: none;
    transition: transform 0.3s ease, opacity 0.3s ease;
    border-radius: inherit;
  }
  
  &:active:not(:disabled)::after {
    transform: scale(1);
    opacity: 1;
    transition: none;
  }
  
  // Extended FAB support (for future use)
  &--extended {
    border-radius: $semantic-border-radius-pill; // 1.75rem equivalent
    padding: 0 $semantic-spacing-4; // 1rem
    width: auto;
    min-width: $semantic-spacing-20; // 5rem
    height: $semantic-spacing-14; // 3.5rem
    
    .fab-icon {
      margin-right: $semantic-spacing-1-5; // 0.375rem
    }
  }
}7x[ib(gqFbQjniFU NⰐx 	import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';

export type FabSize = 'small' | 'medium' | 'large';
export type FabVariant = 'primary' | 'secondary' | 'tertiary';
export type FabPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' | 'static';

@Component({
  selector: 'ui-fab',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <button
      [class]="fabClasses"
      [disabled]="disabled || loading"
      [type]="type"
      (click)="handleClick($event)"
    >
      @if (loading) {
        <div class="fab-loader">
          <div class="fab-spinner"></div>
        </div>
      } @else {
        <div class="fab-icon">
          <ng-content></ng-content>
        </div>
      }
      
      @if (pulse) {
        <div class="fab-pulse"></div>
      }
      
      <div class="fab-touch-overlay"></div>
    </button>
  `,
  styleUrl: './fab.component.scss'
})
export class FabComponent {
  @Input() variant: FabVariant = 'primary';
  @Input() size: FabSize = 'medium';
  @Input() disabled: boolean = false;
  @Input() loading: boolean = false;
  @Input() type: 'button' | 'submit' | 'reset' = 'button';
  @Input() position: FabPosition = 'static';
  @Input() pulse: boolean = false;
  @Input() expandOnClick: boolean = false;
  @Input() class: string = '';

  @Output() clicked = new EventEmitter<Event>();

  get fabClasses(): string {
    return [
      'ui-fab',
      `ui-fab--${this.variant}`,
      `ui-fab--${this.size}`,
      `ui-fab--${this.position}`,
      this.disabled ? 'ui-fab--disabled' : '',
      this.loading ? 'ui-fab--loading' : '',
      this.pulse ? 'ui-fab--pulse' : '',
      this.expandOnClick ? 'ui-fab--expandable' : '',
      this.class
    ].filter(Boolean).join(' ');
  }

  handleClick(event: Event): void {
    if (!this.disabled && !this.loading) {
      this.clicked.emit(event);
      
      if (this.expandOnClick) {
        // Add animation class for expand effect
        (event.target as HTMLElement).classList.add('ui-fab--expanding');
        setTimeout(() => {
          (event.target as HTMLElement).classList.remove('ui-fab--expanding');
        }, 300);
      }
    }
  }
}9xU@use "../../../../../ui-design-system/src/styles/semantic/index" as *;
.ui-ghost-button {
  // Reset and base styles
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: $semantic-border-width-1 solid transparent;
  background: transparent;
  cursor: pointer;
  text-decoration: none;
  outline: none;
  position: relative;
  overflow: hidden;
  border-radius: $semantic-border-radius-lg;
  
  // Typography
  font-family: $semantic-typography-font-family-sans;
  font-weight: $semantic-typography-font-weight-medium;
  text-align: center;
  text-transform: none;
  letter-spacing: $semantic-typography-letter-spacing-wide;
  white-space: nowrap;
  color: $semantic-color-text-secondary;
  
  // Interaction states
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  box-sizing: border-box;
  
  // Transitions
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
  
  // Size variants
  &--small {
    height: $semantic-spacing-9; // 2.25rem
    padding: 0 $semantic-spacing-2; // 0.5rem
    font-size: $semantic-typography-font-size-sm;
    line-height: $semantic-typography-line-height-normal;
    min-width: $semantic-spacing-16; // 4rem
  }
  
  &--medium {
    height: $semantic-spacing-11; // 2.75rem
    padding: 0 $semantic-spacing-4; // 1rem
    font-size: $semantic-typography-font-size-md;
    line-height: $semantic-typography-line-height-normal;
    min-width: $semantic-spacing-20; // 5rem
  }
  
  &--large {
    height: $semantic-spacing-12; // 3rem (closest to 3.25rem)
    padding: 0 $semantic-spacing-6; // 1.5rem
    font-size: $semantic-typography-font-size-lg;
    line-height: $semantic-typography-line-height-normal;
    min-width: $semantic-spacing-24; // 6rem
  }
  
  // Hover states
  &:hover:not(:disabled) {
    background-color: $semantic-color-surface-container;
    color: $semantic-color-text-primary;
    border-color: $semantic-color-border-secondary;
    transform: $semantic-motion-hover-transform-lift-sm;
    box-shadow: $semantic-shadow-button-hover;
  }
  
  &:active:not(:disabled) {
    background-color: $semantic-color-surface-high;
    transform: scale(0.98);
    box-shadow: $semantic-shadow-none;
  }
  
  &:focus-visible {
    background-color: $semantic-color-surface-container;
    border-color: $semantic-color-border-focus;
    box-shadow: $semantic-shadow-button-focus;
  }
  
  // States
  &--disabled {
    opacity: $semantic-opacity-disabled;
    cursor: not-allowed;
    pointer-events: none;
  }
  
  &--loading {
    cursor: wait;
    
    .ghost-button-content {
      opacity: $semantic-opacity-invisible;
    }
  }
  
  &--full-width {
    width: 100%;
  }
  
  // Loader styles
  .ghost-button-loader {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  
  .ghost-button-spinner {
    width: $semantic-spacing-4; // 1rem
    height: $semantic-spacing-4; // 1rem
    border: $semantic-border-width-2 solid rgba($semantic-color-brand-primary, 0.3);
    border-top: $semantic-border-width-2 solid $semantic-color-brand-primary;
    border-radius: $semantic-border-radius-full;
    animation: spin 1s $semantic-motion-easing-linear infinite;
  }
  
  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
  
  // Ripple effect (basic implementation)
  &::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: radial-gradient(circle, rgba($semantic-color-brand-primary, 0.08) 0%, transparent 70%);
    transform: scale(0);
    opacity: $semantic-opacity-invisible;
    pointer-events: none;
    transition: transform $semantic-motion-duration-normal $semantic-motion-easing-ease, opacity $semantic-motion-duration-normal $semantic-motion-easing-ease;
    border-radius: inherit;
  }
  
  &:active:not(:disabled)::after {
    transform: scale(1);
    opacity: $semantic-opacity-opaque;
    transition: none;
  }
}`b 8xQKtexOznone󆳦interactive-prim}-'smC8; // 2%
1; // 0.25,2W`
50; // 2.&;^_1"
3; // 0.75,2x`A&08)N7&12);N0.98)3&08)1	tex
N// Loader styles
  .tex
wtex"03-5; // 0.875rem3-5; // 0.875rem
  !1 // closest to 1.5px12mcx[%X~(gqFbQjniFV~ L<&8x[%%;A8#(5E4ssIjD*ԉ6/cd+I-JL.,K-(̝|v.:SqdgU

FXUL=#:FY&a|Ŕ Jo2,֓X'oc|p231T9Do[}"߰9Nȭl`9ُ]vdqsd?~1V=KZcRCG L듟ZP\RZ̥[UVm `k
ܴ(5w9fyatAƉ'6	'(+Tl-dh6F g/98xd@E
// Tokens available globally via main application styles

.ui-simpleH&mdWbox-sizing: border-boxG0B8Btext-align: center;
  white-space: nowrap;
  
  // Default sizing
,4; // 1rem
l{\mPrimary variant
  &--primary%don-brand-primary;
    
  %!	Y(-1px);
   (hover;
    }
    
   {
  /	 (Bactive;
    }
    
    &:focus-visible {
      outline: 2px solid ;
      outline-offset: 2px@	 Secondary variant
  &--secondary%container-primaryon-container-primary;Q
$/1 solid $semantic-color-border-primary;
    
  % container-primary;
      border-d	6Y(-1px);
      filter: brightness(0.95);
    }
    
   {
  %container-primary;
  /	W    filter: brightness(0.9);
    }
    
    &:focus-visible {
      outline: 2px solid ;
      outline-offset: 2px@	Disabled state
  &:gk} 9x  "2LF,R[ЖM/ S;x$@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-icon-button {
  // Reset and base styles
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: $semantic-border-radius-md;
  cursor: pointer;
  text-decoration: none;
  outline: none;
  position: relative;
  overflow: hidden;
  
  // Make it square/circular
  aspect-ratio: 1;
  flex-shrink: 0;
  
  // Interaction states
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  box-sizing: border-box;
  
  // Transitions
  transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
  
  // Size variants - square buttons with proper touch targets
  &--small {
    width: $semantic-spacing-component-padding-xl; // 1.5rem
    height: $semantic-spacing-component-padding-xl;
    border-radius: $semantic-border-radius-sm;
    
    .icon-button-icon {
      font-size: $semantic-spacing-component-md; // 0.75rem
    }
  }
  
  &--medium {
    width: $semantic-spacing-interactive-touch-target; // 2.75rem 
    height: $semantic-spacing-interactive-touch-target;
    border-radius: $semantic-border-radius-md;
    
    .icon-button-icon {
      font-size: $semantic-spacing-component-lg; // 1rem
    }
  }
  
  &--large {
    width: $semantic-spacing-layout-section-xs; // 2rem but we need larger
    height: $semantic-spacing-layout-section-xs;
    border-radius: $semantic-border-radius-lg;
    
    .icon-button-icon {
      font-size: $semantic-spacing-component-xl; // 1.5rem
    }
  }
  
  // Filled variant (primary)
  &--filled {
    background-color: $semantic-color-brand-primary;
    color: $semantic-color-on-brand-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-brand-primary;
      transform: translateY(-1px);
      box-shadow: $semantic-shadow-elevation-2;
      filter: brightness(1.1);
    }
    
    &:active:not(:disabled) {
      transform: scale(0.95);
      box-shadow: $semantic-shadow-elevation-1;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
  
  // Tonal variant
  &--tonal {
    background-color: $semantic-color-surface-interactive;
    color: $semantic-color-text-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-surface-interactive;
      transform: translateY(-1px);
      box-shadow: $semantic-shadow-elevation-2;
      filter: brightness(0.95);
    }
    
    &:active:not(:disabled) {
      transform: scale(0.95);
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
  
  // Outlined variant
  &--outlined {
    background-color: transparent;
    color: $semantic-color-brand-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-surface-interactive;
      border-color: $semantic-color-brand-primary;
      transform: translateY(-1px);
    }
    
    &:active:not(:disabled) {
      background-color: $semantic-color-surface-interactive;
      transform: scale(0.95);
      filter: brightness(0.9);
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
  
  // States
  &--disabled {
    opacity: $semantic-opacity-disabled;
    cursor: not-allowed;
    pointer-events: none;
  }
  
  &--loading {
    cursor: wait;
    
    .icon-button-icon {
      opacity: 0;
    }
  }
  
  &--pressed {
    background-color: $semantic-color-surface-selected;
    color: $semantic-color-text-primary;
    
    &.ui-icon-button--outlined {
      border-color: $semantic-color-brand-primary;
    }
  }

  // Icon styles
  .icon-button-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: opacity 200ms ease;
  }
  
  // Loader styles
  .icon-button-loader {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  
  .icon-button-spinner {
    width: $semantic-spacing-component-lg; // 1rem
    height: $semantic-spacing-component-lg;
    border: 2px solid currentColor;
    border-top: 2px solid transparent;
    border-radius: 50%;
    animation: spin 1s linear infinite;
    opacity: 0.7;
  }
  
  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
  
  // Ripple effect
  &::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.3) 0%, transparent 70%);
    transform: scale(0);
    opacity: 0;
    pointer-events: none;
    transition: transform 0.3s ease, opacity 0.3s ease;
  }
  
  &:active:not(:disabled)::after {
    transform: scale(1);
    opacity: 1;
    transition: none;
  }
}2x[6WmgqFbQjniF?B M{x( export * from './icon-button.component';:x =export * from './simple-button.component';
export * from './button.component';
export * from './text-button.component';
export * from './ghost-button.component';
export * from './fab.component';CmOx +*#_dxK(/*QRH+UPO*-)K-K+QJEWSZQKbT%&@775{3srRrQqAN&E@ ,WJ^x $icon-button';
z⶚x	Y@use "../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

.ui-simple-button {
  // Reset and base styles
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: $semantic-border-radius-md;
  cursor: pointer;
  text-decoration: none;
  outline: none;
  position: relative;
  box-sizing: border-box;
  
  // Typography
  font-family: $semantic-typography-font-family-sans;
  font-weight: $semantic-typography-font-weight-medium;
  font-size: $semantic-typography-font-size-sm;
  line-height: $semantic-typography-line-height-normal;
  text-align: center;
  white-space: nowrap;
  
  // Default sizing
  height: $semantic-spacing-10; // 2.5rem
  padding: 0 $semantic-spacing-4; // 1rem
  min-width: $semantic-spacing-20; // 5rem
  
  // Interaction states
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  
  // Transitions
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
  
  // Primary variant
  &--primary {
    background-color: $semantic-color-interactive-primary;
    color: $semantic-color-on-brand-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-brand-primary;
      transform: translateY(-1px);
      box-shadow: $semantic-shadow-button-hover;
    }
    
    &:active:not(:disabled) {
      transform: scale(0.98);
      box-shadow: $semantic-shadow-button-active;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
  
  // Secondary variant
  &--secondary {
    background-color: $semantic-color-container-primary;
    color: $semantic-color-on-container-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-container-primary;
      border-color: $semantic-color-interactive-primary;
      transform: translateY(-1px);
      filter: brightness(0.95);
    }
    
    &:active:not(:disabled) {
      background-color: $semantic-color-container-primary;
      transform: scale(0.98);
      filter: brightness(0.9);
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
  }
  
  // Disabled state
  &:disabled {
    opacity: $semantic-opacity-disabled;
    cursor: not-allowed;
    pointer-events: none;
  }
})Kx3 GwIMr?79-s>m[!x|g6t(g?Dx GwtA_#5њ[5ɨaxK(/*QRH+UP/.,M*-)K-K+Q 1x#.@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-split-button {
  // Reset and base styles
  display: inline-flex;
  align-items: center;
  position: relative;
  border-radius: $semantic-border-radius-md;
  overflow: hidden;
  
  // Size variants
  &--small {
    height: $semantic-spacing-9; // 2.25rem
    
    .ui-split-button__primary,
    .ui-split-button__dropdown {
      font-size: $semantic-typography-font-size-sm;
      line-height: $semantic-typography-line-height-tight;
    }
  }
  
  &--medium {
    height: $semantic-spacing-11; // 2.75rem
    
    .ui-split-button__primary,
    .ui-split-button__dropdown {
      font-size: $semantic-typography-font-size-md;
      line-height: $semantic-typography-line-height-normal;
    }
  }
  
  &--large {
    height: $semantic-spacing-12; // 3rem
    
    .ui-split-button__primary,
    .ui-split-button__dropdown {
      font-size: $semantic-typography-font-size-lg;
      line-height: $semantic-typography-line-height-normal;
    }
  }
  
  // Full width variant
  &--full-width {
    width: 100%;
  }
  
  // Disabled state
  &--disabled {
    opacity: 0.38;
    cursor: not-allowed;
    pointer-events: none;
  }

  // Primary button part
  &__primary {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    cursor: pointer;
    text-decoration: none;
    outline: none;
    flex: 1;
    height: 100%; // Match the container height
    
    // Default colors (filled variant)
    background-color: $semantic-color-interactive-primary;
    color: $semantic-color-on-primary;
    
    // Typography
    font-family: $semantic-typography-font-family-sans;
    font-size: $semantic-typography-font-size-md; // Default medium size
    font-weight: $semantic-typography-font-weight-medium;
    line-height: $semantic-typography-line-height-normal; // Default medium line-height
    text-align: center;
    text-transform: none;
    letter-spacing: $semantic-typography-letter-spacing-normal;
    white-space: nowrap;
    
    // Interaction states
    user-select: none;
    -webkit-tap-highlight-color: transparent;
    box-sizing: border-box;
    
    // Transitions
    transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
    
    // Default hover state
    &:hover:not(:disabled) {
      background-color: $semantic-color-primary;
      transform: translateY(-1px);
      box-shadow: $semantic-shadow-button-hover;
    }
    
    &:active:not(:disabled) {
      transform: scale(0.98);
      box-shadow: $semantic-shadow-button-active;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-primary;
      outline-offset: 2px;
    }
    
    // Size-specific padding
    .ui-split-button--small & {
      padding: 0 $semantic-spacing-3; // 0.75rem
    }
    
    .ui-split-button--medium & {
      padding: 0 $semantic-spacing-4; // 1rem
    }
    
    .ui-split-button--large & {
      padding: 0 $semantic-spacing-6; // 1.5rem
    }
  }

  // Dropdown button part
  &__dropdown {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    cursor: pointer;
    outline: none;
    position: relative;
    
    // Default colors (filled variant)
    background-color: $semantic-color-interactive-primary;
    color: $semantic-color-on-primary;
    
    // Typography
    font-family: $semantic-typography-font-family-sans;
    font-size: $semantic-typography-font-size-md; // Default medium size
    font-weight: $semantic-typography-font-weight-medium;
    line-height: $semantic-typography-line-height-normal; // Default medium line-height
    
    // Default size (medium) - defaults only
    width: $semantic-spacing-9; // Default to medium size
    padding: 0 $semantic-spacing-2-5; // Default medium padding
    
    // Interaction states
    user-select: none;
    -webkit-tap-highlight-color: transparent;
    box-sizing: border-box;
    
    // Transitions
    transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
    
    // Default hover state
    &:hover:not(:disabled) {
      background-color: $semantic-color-primary;
      transform: translateY(-1px);
      box-shadow: $semantic-shadow-button-hover;
    }
    
    &:active:not(:disabled) {
      transform: scale(0.98);
      box-shadow: $semantic-shadow-button-active;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-primary;
      outline-offset: 2px;
    }
    
    // Divider between buttons
    &::before {
      content: '';
      position: absolute;
      left: 0;
      top: 20%;
      height: 60%;
      width: 1px;
      background-color: currentColor;
      opacity: 0.3;
    }
  }

  // Size-specific dropdown dimensions (must come after default styles)
  &--small &__dropdown {
    width: $semantic-spacing-8; // 2rem - slightly smaller than height
    height: $semantic-spacing-9; // Match small container height
    padding: 0 $semantic-spacing-2; // 0.5rem
  }
  
  &--medium &__dropdown {
    width: $semantic-spacing-9; // 2.25rem - smaller than height 
    height: $semantic-spacing-11; // Match medium container height
    padding: 0 $semantic-spacing-2-5; // 0.625rem
  }
  
  &--large &__dropdown {
    width: $semantic-spacing-10; // 2.5rem - smaller than height
    height: $semantic-spacing-12; // Match large container height
    padding: 0 $semantic-spacing-3; // 0.75rem
  }

  // Content wrapper
  &__content {
    display: flex;
    align-items: center;
    justify-content: center;
  }

  // Icon styles
  &__icon {
    display: inline-flex;
    align-items: center;
    flex-shrink: 0;

    &--left {
      margin-right: $semantic-spacing-2; // 0.5rem
    }

    &--right {
      margin-left: $semantic-spacing-2; // 0.5rem
    }
    
    // Size-specific adjustments
    .ui-split-button--small & {
      font-size: $semantic-typography-font-size-xs;
      
      &--left {
        margin-right: $semantic-spacing-1-5; // 0.375rem
      }
      
      &--right {
        margin-left: $semantic-spacing-1-5; // 0.375rem
      }
    }

    .ui-split-button--medium & {
      font-size: $semantic-typography-font-size-sm;
    }

    .ui-split-button--large & {
      font-size: $semantic-typography-font-size-md;
      
      &--left {
        margin-right: $semantic-spacing-2-5; // 0.625rem
      }
      
      &--right {
        margin-left: $semantic-spacing-2-5; // 0.625rem
      }
    }
  }

  // Dropdown arrow
  &__arrow {
    display: inline-flex;
    align-items: center;
    font-size: 0.875em; // Slightly larger for better visibility
    transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1);
  }

  // Dropdown menu
  &__menu {
    position: absolute;
    top: 100%;
    left: 0;
    min-width: 100%;
    background: $semantic-color-surface-elevated;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-md;
    box-shadow: $semantic-shadow-dropdown;
    z-index: $semantic-z-index-dropdown;
    opacity: 0;
    visibility: hidden;
    transform: translateY(-$semantic-spacing-2);
    transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
    
    &--open {
      opacity: 1;
      visibility: visible;
      transform: translateY(0);
    }
  }

  // Menu item
  &__menu-item {
    display: flex;
    align-items: center;
    width: 100%;
    padding: $semantic-spacing-3 $semantic-spacing-4;
    border: none;
    background: transparent;
    color: $semantic-color-text-primary;
    font-family: $semantic-typography-font-family-sans;
    font-size: $semantic-typography-font-size-sm;
    font-weight: $semantic-typography-font-weight-normal;
    text-align: left;
    cursor: pointer;
    transition: background-color 200ms cubic-bezier(0.4, 0, 0.2, 1);
    
    &:hover {
      background: $semantic-color-surface-container;
    }
    
    &:first-child {
      border-top-left-radius: $semantic-border-radius-md;
      border-top-right-radius: $semantic-border-radius-md;
    }
    
    &:last-child {
      border-bottom-left-radius: $semantic-border-radius-md;
      border-bottom-right-radius: $semantic-border-radius-md;
    }
  }

  // Filled variant (primary)
  &--filled {
    .ui-split-button__primary,
    .ui-split-button__dropdown {
      background-color: $semantic-color-interactive-primary;
      color: $semantic-color-on-primary;
      
      &:hover:not(:disabled) {
        background-color: $semantic-color-primary;
        transform: translateY(-1px);
        box-shadow: $semantic-shadow-button-hover;
      }
      
      &:active:not(:disabled) {
        transform: scale(0.98);
        box-shadow: $semantic-shadow-button-active;
      }
      
      &:focus-visible {
        outline: 2px solid $semantic-color-primary;
        outline-offset: 2px;
      }
    }
    
    .ui-split-button__dropdown:hover .ui-split-button__arrow {
      transform: rotate(180deg);
    }
  }

  // Tonal variant
  &--tonal {
    .ui-split-button__primary,
    .ui-split-button__dropdown {
      background-color: $semantic-color-surface-container;
      color: $semantic-color-text-primary;
      
      &:hover:not(:disabled) {
        background-color: $semantic-color-surface-container;
        transform: translateY(-1px);
        box-shadow: $semantic-shadow-button-hover;
        filter: brightness(0.95);
      }
      
      &:active:not(:disabled) {
        transform: scale(0.98);
      }
      
      &:focus-visible {
        outline: 2px solid $semantic-color-primary;
        outline-offset: 2px;
      }
    }
    
    .ui-split-button__dropdown:hover .ui-split-button__arrow {
      transform: rotate(180deg);
    }
  }

  // Outlined variant
  &--outlined {
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    .ui-split-button__primary,
    .ui-split-button__dropdown {
      background-color: transparent;
      color: $semantic-color-interactive-primary;
      
      &:hover:not(:disabled) {
        background-color: $semantic-color-surface-container;
        transform: translateY(-1px);
      }
      
      &:active:not(:disabled) {
        background-color: $semantic-color-surface-container;
        transform: scale(0.98);
        filter: brightness(0.9);
      }
      
      &:focus-visible {
        outline: 2px solid $semantic-color-primary;
        outline-offset: 2px;
      }
    }
    
    .ui-split-button__dropdown:hover .ui-split-button__arrow {
      transform: rotate(180deg);
    }
  }

  // Loading state
  &--loading {
    .ui-split-button__primary {
      cursor: wait;
      
      .ui-split-button__content {
        opacity: 0;
      }
    }
    
    .ui-split-button__dropdown {
      pointer-events: none;
      opacity: 0.5;
    }
  }

  // Loader
  &__loader {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }

  &__spinner {
    width: $semantic-spacing-4; // 1rem
    height: $semantic-spacing-4; // 1rem
    border: 2px solid currentColor;
    border-top: 2px solid transparent;
    border-radius: 50%;
    animation: spin 1s linear infinite;
    opacity: 0.7;
  }

  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }

  // Ripple effect
  .ui-split-button__primary::after,
  .ui-split-button__dropdown::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.3) 0%, transparent 70%);
    transform: scale(0);
    opacity: 0;
    pointer-events: none;
    transition: transform 0.3s ease, opacity 0.3s ease;
  }

  .ui-split-button__primary:active:not(:disabled)::after,
  .ui-split-button__dropdown:active:not(:disabled)::after {
    transform: scale(1);
    opacity: 1;
    transition: none;
  }
}RX1x[3'fgqFbQjniFߺ U,xWo6_dg;βVl]te,&JH9\#%%;-6?Xx_\ȭdLky[݆Ê	]SbaKÕ|g
jyBst'4ץ5!*m~0
'Y6$<PKUh6%ߨw}_4?=16ʀˊAysyT˸(s7*nK5H=(`T,asF傛Kc|ON!se\F`
;R\;CP0rcǢNve
ZOl.'2o,_!!>21%\fd?N	8EE,n\G8l>*%`pk&U1%QcBďVhۆʔ
Sל,|R/CwVޗz8.?@$}!W)+aNjwanv?̇88Ounf 9P4dO08
V}.|Cg$k+R4CEɗ/%;b ~O$G1L"UUGm?^
Yι2Zؓ&4{,MK{1r6e^IJϰhKڹ
'm+tPq:>/ρ8MBƗR{ċTv:.
~sLoJ0L 	&^.Lˈk|欛rMu2Jx;ey}QmmǠ}jEcy>x):!7+I"\5&?=XD6CƝiű{*g41b!A@n$~iGaۏ_?Ffp](.|gˌWkR^t{NH5aշcaW;y$VoArѕςU@%ɲT:uluMQkU~cјT%tg0!XMkjJl (<UcOaT7
|ѵL3͛ xOJ;	rm$mwh]Pf5&*?xDx6~vwFԭάswJFGOZn,&v	{y8wQeAm&d=%.)*V[gY0I5	\f>h 4Y
6Ec/|<<zrG5͚kw
oTq?OsBA9ZE0}TH;T; WWWihEYϻ`K[*2l68ڭ;v5W://,#2Q=+ЏB//٤?;d 쵥ށ-?h-t$k{}'ݑNywv;-%԰Yux;JknfX[%LₜݤҒ<]]um̪T U,(31H,NLIMQ*"Y`	OLKaDRVR]HZ$գdǥ PFQWWa dBxx
@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-range-slider {
  // Core Structure
  display: flex;
  flex-direction: column;
  position: relative;
  width: 100%;

  // Sizing variants
  &--sm {
    .ui-range-slider__track {
      height: 4px;
    }
    
    .ui-range-slider__thumb {
      width: 16px;
      height: 16px;
    }
    
    .ui-range-slider__label {
      font-size: $semantic-typography-font-size-xs;
    }
  }

  &--md {
    .ui-range-slider__track {
      height: 6px;
    }
    
    .ui-range-slider__thumb {
      width: 20px;
      height: 20px;
    }
    
    .ui-range-slider__label {
      font-size: $semantic-typography-font-size-xs;
    }
  }

  &--lg {
    .ui-range-slider__track {
      height: 8px;
    }
    
    .ui-range-slider__thumb {
      width: 24px;
      height: 24px;
    }
    
    .ui-range-slider__label {
      font-size: $semantic-typography-font-size-sm;
    }
  }

  // Color variants
  &--primary {
    .ui-range-slider__fill {
      background: $semantic-color-primary;
    }
    
    .ui-range-slider__thumb {
      border-color: $semantic-color-primary;
      
      &:hover {
        border-color: $semantic-color-primary;
        box-shadow: 0 0 0 8px rgba($semantic-color-primary, 0.1);
      }
      
      &:focus {
        border-color: $semantic-color-primary;
        box-shadow: 0 0 0 4px rgba($semantic-color-primary, 0.2);
      }
    }
  }

  &--secondary {
    .ui-range-slider__fill {
      background: $semantic-color-secondary;
    }
    
    .ui-range-slider__thumb {
      border-color: $semantic-color-secondary;
      
      &:hover {
        border-color: $semantic-color-secondary;
        box-shadow: 0 0 0 8px rgba($semantic-color-secondary, 0.1);
      }
      
      &:focus {
        border-color: $semantic-color-secondary;
        box-shadow: 0 0 0 4px rgba($semantic-color-secondary, 0.2);
      }
    }
  }

  &--success {
    .ui-range-slider__fill {
      background: $semantic-color-success;
    }
    
    .ui-range-slider__thumb {
      border-color: $semantic-color-success;
      
      &:hover {
        border-color: $semantic-color-success;
        box-shadow: 0 0 0 8px rgba($semantic-color-success, 0.1);
      }
    }
  }

  &--warning {
    .ui-range-slider__fill {
      background: $semantic-color-warning;
    }
    
    .ui-range-slider__thumb {
      border-color: $semantic-color-warning;
      
      &:hover {
        border-color: $semantic-color-warning;
        box-shadow: 0 0 0 8px rgba($semantic-color-warning, 0.1);
      }
    }
  }

  &--danger {
    .ui-range-slider__fill {
      background: $semantic-color-danger;
    }
    
    .ui-range-slider__thumb {
      border-color: $semantic-color-danger;
      
      &:hover {
        border-color: $semantic-color-danger;
        box-shadow: 0 0 0 8px rgba($semantic-color-danger, 0.1);
      }
    }
  }

  // State variants
  &--disabled {
    opacity: 0.38;
    cursor: not-allowed;
    
    .ui-range-slider__thumb {
      cursor: not-allowed;
      pointer-events: none;
    }
    
    .ui-range-slider__input {
      cursor: not-allowed;
    }
  }

  // Label positioning
  &__header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: $semantic-spacing-component-sm;
  }

  &__label {
    color: $semantic-color-text-primary;
    font-size: $semantic-typography-font-size-sm;
    font-weight: $semantic-typography-font-weight-medium;
    
    &--disabled {
      color: $semantic-color-text-tertiary;
    }
  }

  &__value-display {
    color: $semantic-color-text-secondary;
    font-size: $semantic-typography-font-size-xs;
    font-weight: $semantic-typography-font-weight-medium;
    min-width: 40px;
    text-align: right;
  }

  // Slider container
  &__container {
    position: relative;
    padding: $semantic-spacing-component-sm 0;
  }

  // Track (background)
  &__track {
    position: relative;
    width: 100%;
    height: 6px;
    background: $semantic-color-surface-secondary;
    border-radius: $semantic-border-radius-xl;
    overflow: hidden;
  }

  // Fill (progress)
  &__fill {
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    background: $semantic-color-primary;
    border-radius: inherit;
    transition: width $semantic-motion-duration-fast $semantic-easing-standard;
  }

  // Native input (hidden but functional)
  &__input {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: pointer;
    
    &:focus {
      outline: none;
    }
    
    &:disabled {
      cursor: not-allowed;
    }
  }

  // Visual thumb
  &__thumb {
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 20px;
    height: 20px;
    background: $semantic-color-surface-primary;
    border: 2px solid $semantic-color-primary;
    border-radius: 50%;
    cursor: pointer;
    transition: all $semantic-motion-duration-fast $semantic-easing-standard;
    z-index: 2;
    
    &:hover {
      box-shadow: 0 0 0 8px rgba($semantic-color-primary, 0.1);
      border-color: $semantic-color-primary;
    }
    
    &:focus,
    &--focused {
      box-shadow: 0 0 0 4px rgba($semantic-color-primary, 0.2);
      border-color: $semantic-color-primary;
    }
    
    &:active,
    &--dragging {
      box-shadow: 0 0 0 8px rgba($semantic-color-primary, 0.15);
      transform: translate(-50%, -50%) scale(1.1);
    }
  }

  // Tick marks (optional)
  &__ticks {
    display: flex;
    justify-content: space-between;
    margin-top: $semantic-spacing-component-xs;
    padding: 0 10px; // Offset for thumb width
  }

  &__tick {
    width: 2px;
    height: 8px;
    background: $semantic-color-border-subtle;
    border-radius: $semantic-border-radius-xs;
    
    &--major {
      height: 12px;
      background: $semantic-color-border-primary;
    }
  }

  // Tick labels
  &__tick-labels {
    display: flex;
    justify-content: space-between;
    margin-top: $semantic-spacing-component-xs;
    padding: 0 10px; // Offset for thumb width
  }

  &__tick-label {
    font-size: $semantic-typography-font-size-xs;
    color: $semantic-color-text-tertiary;
    text-align: center;
    min-width: 20px;
  }

  // Helper text
  &__helper-text {
    margin-top: $semantic-spacing-component-xs;
    font-size: $semantic-typography-font-size-xs;
    color: $semantic-color-text-secondary;
    
    &--error {
      color: $semantic-color-danger;
    }
  }

  // Range variant (dual thumb)
  &--range {
    .ui-range-slider__fill {
      left: auto;
      right: auto;
    }
  }

  // Vertical orientation
  &--vertical {
    flex-direction: row;
    align-items: center;
    height: 200px;
    width: auto;
    
    .ui-range-slider__container {
      width: auto;
      height: 100%;
      padding: 0 $semantic-spacing-component-sm;
    }
    
    .ui-range-slider__track {
      width: 6px;
      height: 100%;
    }
    
    .ui-range-slider__fill {
      width: 100%;
      height: auto;
      bottom: 0;
      top: auto;
    }
    
    .ui-range-slider__thumb {
      left: 50%;
      top: auto;
      transform: translate(-50%, 50%);
    }
    
    .ui-range-slider__input {
      width: 100%;
      height: 100%;
    }
  }

  // Dark mode support
  :host-context(.dark-theme) & {
    .ui-range-slider__track {
      background: $semantic-color-surface-secondary;
    }
    
    .ui-range-slider__thumb {
      background: $semantic-color-surface-primary;
      border-color: $semantic-color-primary;
    }
    
    .ui-range-slider__label {
      color: $semantic-color-text-primary;
    }
  }
}

// Responsive design
@media (max-width: $semantic-breakpoint-sm - 1) {
  .ui-range-slider {
    &--lg {
      .ui-range-slider__thumb {
        width: 20px;
        height: 20px;
      }
      
      .ui-range-slider__track {
        height: 6px;
      }
    }
  }
}?Vxx=9O	accordion[g;  box-sizing: border-box;
  
  // Base styles
  font-familyUfamily-sans;
  
  // Default styles (md variant as default)
  .ui-accordion__header {-md00%md;
  }
  
  .ui-accordion__content {-md00md;
  }
  
  // Sizeaccordion__header {
  )xssm;q=accordion__content {
  )xssm;q?+  
  &--md {
    .ui-accordion__header {
  ,md;q1mdaccordion__content {
  ,md;q19md;
    }
  }
  
  &--lg {
    .ui-accordion__header {
  )mdlg;q1lgaccordion__content {
  )mdlg;q1Llg;
    }
  }
  
  // Variant styles
  &--elevated {
    .ui-accordion__item%"  border: $semantic-border-width-1y)md;Q $semantic-shadow-elevation-1;
  /8xs;
      
      &:last-child {
        margin-bottom: 0A*  
  &--outlined {
    .ui-accordion__item%"  border: $semantic-border-width-1)md;
  /8xs;
      
      &:last-child {
        margin-bottom: 0A(  
  &--filled {
    .ui-accordion__item%"  border: $semantic-border-width-1)md;
  /8xs;
      
      &:last-child {
        margin-bottom: 0A  UUEpointer-events: none;
  }
  
  // Individual accordion item
  &__item^MP
    &--expanded {
      .ui-accordion__header {
        .ui-accordion__icon {
          transform: rotate(180deg);
        }
      }
    }opacity: 0.38;
  %  
      .ui-accordion__header {
    G  
  // Header/trigger areae&1W$:width: 100%;
    background: transparent;
    border: none)g5text-align: leftIT
    &:hover:not(:disabled)%"&:focus-visible {
      outline)  outline-offset: 2px:not(:disabled)%elevated=Y  opacity: 0.38;
    }
  }
  
  // Header content area
  &__header-content {
    flex: 1;1ga(sm;
  }
  
  // Icon container
  &__iconq1WZcenter;
    width: $semantic-sizing-icon-inline;
    height: $semantic-sizing-icon-inline;0transition: transform^?7flex-shrink: 0;
  }
  
  // Content area
  &__content { )line-hnline-height-relaxed;
    
    // Animation states
    &--collapsed {
      max-height: 0;
      padding-top: 0;
      padding-b/ottom: 0;
      transition: 
        max-height^normal},
        padding^normal} }
    
    &--expanded {
      max-height: 1000px; // Large enough for most content
      transition: max-height $semantic-motimnormal} ?}
    
    &--expanding {
      transition: 
        max-height^normal},
        padding^normal} a}
  }
  
  // Content inner wrapper for proper padding animation
  &__content-inner {
    padding(}
  
  // Multiple expand mode styling
  &--multiple {
    .ui-accordion__item:not(:last-child) {
      border-bottom: $semantic-border-width-1y}
  }
  uAaccordion__item%elevated&borde accordion__header2v:not(:disabled) {
  "  }!	accordion__content%	elevated;?  
  // Responsive design
  (8md - 1) {
    &--lg {
      .ui-accordion__header {
    ,md;
  0mdaccordion__content {
    ,md;
  0mdA  
  47  &--md,
    &--lg {
      .ui-accordion__header {
    )xssm;
  0`accordion__content {
    )xssm;
  0`G}xjvgqFbQjniFr \kU x9=,@use '	2%' as *;

.demo-container {
  padding:7layout-lg;
  max-width: 1200px;
  margin: 0 auto;

  h2Pheading-h2-size''layout-lg;
    border-bottom: 1px solida$padding-bottom:ntent-paragraph;
  }

  h3#/heading-h3-size1lg$layout-lg;
  }

  h4Pheading-h4-size1md;
  }
}

.demo-section {
#Jlayout-xl;
  
  &:last-child {
    margin-bottom: 0;
  }
}

.demo-column {j.gap:lg;
}

.demo-item {
  padding:lg;
  border: 1px solida"'md;

  &:hover {

"Abox-shadow: $semantic-shadow-elevation-1;
  }
}

.demo-controls {j.gap:md;
-lg;
  padding:lg;
'lg;
  border: 1px solida 
  .control-rowjgap:Dlg;
    flex-wrap: wrap;
    align-items: end;
  }

  .control-groupj~  gap:min-width: 150px;

    p8sm;
  ]>
    input[type="range"]:3}

    input[type="checkbox"] {
      margin-right:}

    select {
  )xs%  border: 1px solidaprimary;
  +sm;#o0outline: 2px solidQ   outline-offset: 2px;6(}

.demo-interactive-result {
  padding:xl;
'lg;
  border: 2px dasheda }

.demo-form {
  padding:lg;
'lg;
  border: 1px solida 
  .form-row {0Olg;
    
    &:last-child {
      margin-bottom: 0;
    }
  }

  .form-output {.l+mdP"'md;
    border: 1px solida 
    pre {
      margin: 0;j9Q  white-space: pre-wrap;
      word-break: break-word;
    }
  }
}

.event-log {
*lg;
  padding:md;
'md;
  border: 1px solida <
  .event-list {
    max-height: 200px;
    overflow-y: auto1md-V!sm;
    border: 1px solida 
    .event-itemh3xs;#'$xs 0;
      border-bottom: 1px solida$3  
      &:last-child {
        border-bottom: nonebutton {-md;
    border: 1px solidasmP"[3_
    &:hover&Z '
    &:focus {
      outline: 2px solidQ outline-offset: 2pxLmd - 1) {
  .demo-container { 2layout-md;
  }

  .demo-controls .control-row {
  |Bstretch;

    .control-group {
      min-width: auto;
    }
  }
}
6demo-container { layout-sm;
  }

  .demo-item {*	md;
  }
}U^,Ux4,#@ntent-heading;#pzrow {
  display: flex;
=#4flex-wrap: wrap;
  align-items: start;
}

.demo-item90align-items: center;
=ntent-line-normal00[\(  min-width: 100px;

  p {
    margin: 0&
md;
	 +text-align: center;
<}?!flex-wrap: wrap;
-+p2u  min-width: 150px mA~G
s02G
	on@:=k:not(:disabled) {
  - primary-hover&primary-hover;
  +2jA
    &:disabled {
      opacity: 0.38;
      cursor: not-allowed;a#"	tertiary;
+(display: flex;
  justify-content: center)
row {&md;
  }

  .demo-controls {Bmda!row {
    justify-content: centermin-width: 80px;
  }
}\k;ZxC#@use "2"9>)md;
  max-width: 800px;
  margin: 0 auto;>lg;
  
  h3 {.paragraph;

-*lgOalign-items: center;
%.
1M}

.positions-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr) xl;
  max-width: 400px;
  marginmd 0;
}

.demo-buttonP ,/border: none+md;
  cursor: pointer;
.
,"md;
  transition: background-color;  
  &:hover {
	 P
}
  
  &:focus-visible {
'focus;
}
}

.demo-text {
0
*Amd;
  text-decoration: underline;
  cursor: help;
  
  &:hover {

/}
}

.demo-icon {
  width: 24px;
  height: 24px50%;~
.$display: flex;
  align-items: center0
.%  font-weight: bold;
  cursor: help;

  &:hover {
	(\
'}
}

p {
  margin: 0;
0
* md;
}

// Responsive adjustments/)=md - 1) {
  .positions-grid {
    grid-template-columns: 1fr;o.  a<-w  aalign-items: flex-start;o&_	}
})Kxd 0F}

.demo-column	'
  > div {
    display: flex;	!!rspan
Z}ZH(xv(import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, ContentChildren, QueryList, AfterContentInit, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Subject, takeUntil } from 'rxjs';

export type AccordionSize = 'sm' | 'md' | 'lg';
export type AccordionVariant = 'elevated' | 'outlined' | 'filled';

export interface AccordionItem {
  id: string;
  title: string;
  content?: string;
  disabled?: boolean;
  expanded?: boolean;
}

export interface AccordionExpandEvent {
  item: AccordionItem;
  index: number;
  expanded: boolean;
}

@Component({
  selector: 'ui-accordion-item',
  standalone: true,
  imports: [CommonModule],
  template: `
    <div class="ui-accordion__item"
         [class.ui-accordion__item--expanded]="expanded"
         [class.ui-accordion__item--disabled]="disabled">
      
      <button
        type="button"
        class="ui-accordion__header"
        [disabled]="disabled"
        [attr.aria-expanded]="expanded"
        [attr.aria-controls]="contentId"
        [attr.id]="headerId"
        (click)="handleToggle()"
        (keydown)="handleKeydown($event)">
        
        <div class="ui-accordion__header-content">
          <ng-content select="[slot='header']"></ng-content>
          @if (!hasHeaderContent) {
            <span>{{ title }}</span>
          }
        </div>
        
        <div class="ui-accordion__icon" aria-hidden="true">
          <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
            <path d="M4.5 6l3.5 3.5L11.5 6"/>
          </svg>
        </div>
      </button>
      
      <div
        class="ui-accordion__content"
        [class.ui-accordion__content--expanded]="expanded"
        [class.ui-accordion__content--collapsed]="!expanded"
        [attr.id]="contentId"
        [attr.aria-labelledby]="headerId"
        role="region">
        
        @if (expanded || !collapseContent) {
          <div class="ui-accordion__content-inner">
            <ng-content></ng-content>
            @if (!hasContent && content) {
              <p>{{ content }}</p>
            }
          </div>
        }
      </div>
    </div>
  `
})
export class AccordionItemComponent {
  @Input() id!: string;
  @Input() title!: string;
  @Input() content?: string;
  @Input() disabled = false;
  @Input() expanded = false;
  @Input() collapseContent = true; // Whether to remove content from DOM when collapsed
  @Input() hasHeaderContent = false;
  @Input() hasContent = false;

  @Output() expandedChange = new EventEmitter<boolean>();
  @Output() itemToggle = new EventEmitter<AccordionExpandEvent>();

  get headerId(): string {
    return `accordion-header-${this.id}`;
  }

  get contentId(): string {
    return `accordion-content-${this.id}`;
  }

  handleToggle(): void {
    if (!this.disabled) {
      this.expanded = !this.expanded;
      this.expandedChange.emit(this.expanded);
      this.itemToggle.emit({
        item: {
          id: this.id,
          title: this.title,
          content: this.content,
          disabled: this.disabled,
          expanded: this.expanded
        },
        index: 0, // Will be set by parent accordion
        expanded: this.expanded
      });
    }
  }

  handleKeydown(event: KeyboardEvent): void {
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.handleToggle();
    }
  }
}

@Component({
  selector: 'ui-accordion',
  standalone: true,
  imports: [CommonModule, AccordionItemComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-accordion"
      [class]="getComponentClasses()"
      [attr.aria-multiselectable]="multiple"
      role="group">
      
      @if (items && items.length > 0) {
        @for (item of items; track item.id; let i = $index) {
          <ui-accordion-item
            [id]="item.id"
            [title]="item.title"
            [content]="item.content"
            [disabled]="item.disabled || disabled"
            [expanded]="item.expanded || false"
            [collapseContent]="collapseContent"
            (itemToggle)="handleItemToggle($event, i)">
          </ui-accordion-item>
        }
      } @else {
        <ng-content></ng-content>
      }
    </div>
  `,
  styleUrl: './accordion.component.scss'
})
export class AccordionComponent implements AfterContentInit, OnDestroy {
  @Input() size: AccordionSize = 'md';
  @Input() variant: AccordionVariant = 'elevated';
  @Input() disabled = false;
  @Input() multiple = false; // Allow multiple items to be expanded simultaneously
  @Input() collapseContent = true; // Whether to remove content from DOM when collapsed
  @Input() items: AccordionItem[] = []; // Programmatic items
  @Input() expandedItems: string[] = []; // IDs of initially expanded items

  @Output() itemToggle = new EventEmitter<AccordionExpandEvent>();
  @Output() expandedItemsChange = new EventEmitter<string[]>();

  @ContentChildren(AccordionItemComponent) accordionItems!: QueryList<AccordionItemComponent>;

  private destroy$ = new Subject<void>();

  getComponentClasses(): string {
    const classes = [
      'ui-accordion',
      `ui-accordion--${this.size}`,
      `ui-accordion--${this.variant}`
    ];
    
    if (this.disabled) {
      classes.push('ui-accordion--disabled');
    }
    
    if (this.multiple) {
      classes.push('ui-accordion--multiple');
    }
    
    return classes.join(' ');
  }

  ngAfterContentInit(): void {
    // Set up keyboard navigation between accordion items
    this.setupKeyboardNavigation();
    
    // Initialize expanded states
    this.initializeExpandedStates();
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  private setupKeyboardNavigation(): void {
    this.accordionItems.changes
      .pipe(takeUntil(this.destroy$))
      .subscribe(() => {
        this.accordionItems.forEach((item, index) => {
          // Update index for event emission
          const originalToggle = item.handleToggle.bind(item);
          item.handleToggle = () => {
            originalToggle();
            // Emit with correct index
            const event = {
              item: {
                id: item.id,
                title: item.title,
                content: item.content,
                disabled: item.disabled,
                expanded: item.expanded
              },
              index,
              expanded: item.expanded
            };
            this.handleItemToggle(event, index);
          };
        });
      });
  }

  private initializeExpandedStates(): void {
    if (this.items.length > 0) {
      // Initialize programmatic items
      this.items.forEach(item => {
        if (this.expandedItems.includes(item.id)) {
          item.expanded = true;
        }
      });
    }
  }

  handleItemToggle(event: AccordionExpandEvent, index: number): void {
    event.index = index;
    
    if (!this.multiple && event.expanded) {
      // Close other items if not in multiple mode
      this.closeOtherItems(event.item.id);
    }

    // Update expanded items list
    this.updateExpandedItems(event.item.id, event.expanded);
    
    // Emit events
    this.itemToggle.emit(event);
    this.expandedItemsChange.emit([...this.expandedItems]);
  }

  private closeOtherItems(exceptId: string): void {
    if (this.items.length > 0) {
      // Close other programmatic items
      this.items.forEach(item => {
        if (item.id !== exceptId && item.expanded) {
          item.expanded = false;
        }
      });
    }

    // Close other content-projected items
    this.accordionItems.forEach(item => {
      if (item.id !== exceptId && item.expanded) {
        item.expanded = false;
        item.expandedChange.emit(false);
      }
    });
  }

  private updateExpandedItems(itemId: string, expanded: boolean): void {
    if (expanded) {
      if (!this.expandedItems.includes(itemId)) {
        this.expandedItems.push(itemId);
      }
    } else {
      const index = this.expandedItems.indexOf(itemId);
      if (index > -1) {
        this.expandedItems.splice(index, 1);
      }
    }
  }

  // Public methods for programmatic control
  expandItem(itemId: string): void {
    const item = this.items.find(i => i.id === itemId);
    const accordionItem = this.accordionItems.find(i => i.id === itemId);
    
    if (item && !item.disabled) {
      if (!this.multiple) {
        this.closeAllItems();
      }
      item.expanded = true;
      this.updateExpandedItems(itemId, true);
    }
    
    if (accordionItem && !accordionItem.disabled) {
      if (!this.multiple) {
        this.closeAllItems();
      }
      accordionItem.expanded = true;
      accordionItem.expandedChange.emit(true);
      this.updateExpandedItems(itemId, true);
    }
  }

  collapseItem(itemId: string): void {
    const item = this.items.find(i => i.id === itemId);
    const accordionItem = this.accordionItems.find(i => i.id === itemId);
    
    if (item) {
      item.expanded = false;
      this.updateExpandedItems(itemId, false);
    }
    
    if (accordionItem) {
      accordionItem.expanded = false;
      accordionItem.expandedChange.emit(false);
      this.updateExpandedItems(itemId, false);
    }
  }

  expandAll(): void {
    if (this.multiple) {
      this.items.forEach(item => {
        if (!item.disabled) {
          item.expanded = true;
          this.updateExpandedItems(item.id, true);
        }
      });
      
      this.accordionItems.forEach(item => {
        if (!item.disabled) {
          item.expanded = true;
          item.expandedChange.emit(true);
          this.updateExpandedItems(item.id, true);
        }
      });
    }
  }

  collapseAll(): void {
    this.items.forEach(item => {
      item.expanded = false;
      this.updateExpandedItems(item.id, false);
    });
    
    this.accordionItems.forEach(item => {
      item.expanded = false;
      item.expandedChange.emit(false);
      this.updateExpandedItems(item.id, false);
    });
  }

  private closeAllItems(): void {
    this.items.forEach(item => {
      item.expanded = false;
    });
    
    this.accordionItems.forEach(item => {
      item.expanded = false;
      item.expandedChange.emit(false);
    });
    
    this.expandedItems = [];
  }
}#fxClºřUJ l ĢļM,NLIMJ9Q]Ҝ̂To>IO ,xK(/*QVpLN/Js-K+AyjҊsa
a\3K*RάJE23,(3$kEAb^kV H[x 52p|%-)A1Sⱡx@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;
.skyui-avatar {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background-color: $semantic-color-surface-secondary;
  color: $semantic-color-text-secondary;
  box-sizing: border-box;
  flex-shrink: 0;
  user-select: none;
  cursor: pointer;

  // Size variants based on semantic sizing tokens
  &--size-xs {
    width: 24px;
    height: 24px;
    
    .skyui-avatar__initials {
      font-size: calc(24px * 0.4);
      font-weight: 500;
    }
    
    .skyui-avatar__icon {
      font-size: calc(24px * 0.6);
    }
  }

  &--size-sm {
    width: 32px;
    height: 32px;
    
    .skyui-avatar__initials {
      font-size: calc(32px * 0.4);
      font-weight: 500;
    }
    
    .skyui-avatar__icon {
      font-size: calc(32px * 0.6);
    }
  }

  &--size-md {
    width: 40px;
    height: 40px;
    
    .skyui-avatar__initials {
      font-size: calc(40px * 0.4);
      font-weight: 500;
    }
    
    .skyui-avatar__icon {
      font-size: calc(40px * 0.6);
    }
  }

  &--size-lg {
    width: 48px;
    height: 48px;
    
    .skyui-avatar__initials {
      font-size: calc(48px * 0.4);
      font-weight: 600;
    }
    
    .skyui-avatar__icon {
      font-size: calc(48px * 0.6);
    }
  }

  &--size-xl {
    width: 64px;
    height: 64px;
    
    .skyui-avatar__initials {
      font-size: calc(64px * 0.35);
      font-weight: 600;
    }
    
    .skyui-avatar__icon {
      font-size: calc(64px * 0.5);
    }
  }

  &--size-xxl {
    width: 80px;
    height: 80px;
    
    .skyui-avatar__initials {
      font-size: calc(80px * 0.35);
      font-weight: 600;
    }
    
    .skyui-avatar__icon {
      font-size: calc(80px * 0.5);
    }
  }

  // Loading state
  &--loading {
    background-color: $semantic-color-surface-disabled;
    
    .skyui-avatar__loading {
      position: absolute;
      inset: 0;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    .loading-spinner {
      width: 50%;
      height: 50%;
      border: 2px solid $semantic-color-border-subtle;
      border-top: 2px solid $semantic-color-brand-primary;
      border-radius: 50%;
      animation: spin 1s linear infinite;
    }
  }

  // Avatar image
  &__image {
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: 50%;
    overflow: hidden;
  }

  // Fallback container
  &__fallback {
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: $semantic-color-container-primary;
    color: $semantic-color-on-container-primary;
    border-radius: 50%;
    overflow: hidden;
  }

  // Initials text
  &__initials {
    line-height: 1;
    text-align: center;
    letter-spacing: -0.02em;
  }

  // Icon
  &__icon {
    display: flex;
    align-items: center;
    justify-content: center;
  }

  // Status indicator
  &__status {
    position: absolute;
    bottom: 0;
    right: 0;
    width: 25%;
    height: 25%;
    min-width: 8px;
    min-height: 8px;
    border-radius: 50%;
    border: 2px solid $semantic-color-surface-primary;
    box-sizing: border-box;

    &--online {
      background-color: $semantic-color-success;
    }

    &--offline {
      background-color: $semantic-color-text-tertiary;
    }

    &--away {
      background-color: $semantic-color-warning;
    }

    &--busy {
      background-color: $semantic-color-danger;
    }
  }

  // Badge indicator positioning
  &__badge {
    position: absolute;
    top: -4px;
    right: -4px;
  }
}

// Animation for loading spinner
@keyframes spin {
  0% { 
    transform: rotate(0deg); 
  }
  100% { 
    transform: rotate(360deg); 
  }
}

// Focus and hover states for interactive avatars
.skyui-avatar {
  &[role="button"]:focus-visible,
  &[tabindex]:focus-visible {
    outline: 2px solid $semantic-color-brand-primary;
    outline-offset: 2px;
  }

  &[role="button"]:hover,
  &[tabindex]:hover {
    transform: scale(1.05);
    transition: transform $semantic-duration-fast $semantic-easing-standard;
  }
}

// High contrast mode support
@media (prefers-contrast: high) {
  .skyui-avatar {
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    &__status {
      border-width: $semantic-border-width-3;
    }
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .skyui-avatar {
    &[role="button"]:hover,
    &[tabindex]:hover {
      transition: none;
    }
    
    .loading-spinner {
      animation: none;
    }
  }
}rxҥ2A8#(5E4sKA J:jxHimport { Component, Input, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faUser } from '@fortawesome/free-solid-svg-icons';
import { BadgeComponent } from '../badge/badge.component';

export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';

@Component({
  selector: 'ui-avatar',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, FontAwesomeModule, BadgeComponent],
  template: `
    <div class="skyui-avatar"
         [class]="'skyui-avatar--size-' + size"
         [class.skyui-avatar--loading]="loading"
         [attr.aria-label]="ariaLabel || (name ? name + ' avatar' : 'User avatar')">
      
      @if (loading) {
        <div class="skyui-avatar__loading">
          <div class="loading-spinner" aria-hidden="true"></div>
        </div>
      } @else {
        @if (imageUrl && !imageError) {
          <img 
            [src]="imageUrl"
            [alt]="altText || (name ? name + ' avatar' : 'User avatar')"
            class="skyui-avatar__image"
            (error)="onImageError()"
            (load)="onImageLoad()">
        } @else {
          <div class="skyui-avatar__fallback">
            @if (computedInitials) {
              <span class="skyui-avatar__initials" aria-hidden="true">{{ computedInitials }}</span>
            } @else {
              <fa-icon 
                [icon]="faUser"
                class="skyui-avatar__icon"
                aria-hidden="true">
              </fa-icon>
            }
          </div>
        }
      }

      @if (status) {
        <div class="skyui-avatar__status"
             [class]="'skyui-avatar__status--' + status"
             [attr.aria-label]="statusLabel || status + ' status'">
        </div>
      }

      @if (badge !== undefined && badge !== null) {
        <ui-badge
          class="skyui-avatar__badge"
          variant="danger"
          size="xs"
          [ariaLabel]="badgeLabel || 'Badge: ' + badge">
          {{ badge }}
        </ui-badge>
      }
    </div>
  `,
  styleUrl: './avatar.component.scss'
})
export class AvatarComponent {
  @Input() imageUrl?: string;
  @Input() name?: string;
  @Input() initials?: string;
  @Input() size: AvatarSize = 'md';
  @Input() altText?: string;
  @Input() ariaLabel?: string;
  @Input() loading: boolean = false;
  @Input() status?: 'online' | 'offline' | 'away' | 'busy';
  @Input() statusLabel?: string;
  @Input() badge?: string | number;
  @Input() badgeLabel?: string;

  faUser = faUser;
  imageError = false;

  onImageError(): void {
    this.imageError = true;
  }

  onImageLoad(): void {
    this.imageError = false;
  }

  // Auto-generate initials from name if not provided
  get computedInitials(): string {
    if (this.initials) {
      return this.initials.slice(0, 2).toUpperCase();
    }
    
    if (this.name) {
      const nameParts = this.name.trim().split(/\s+/);
      if (nameParts.length >= 2) {
        return (nameParts[0][0] + nameParts[nameParts.length - 1][0]).toUpperCase();
      } else if (nameParts[0]) {
        return nameParts[0].slice(0, 2).toUpperCase();
      }
    }
    
    return '';
  }
}Лx# export * from './avatar.component';G-x kBw*0|ّ0RѸx@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;
/**
 * ==========================================================================
 * BADGE COMPONENT STYLES
 * ==========================================================================
 * Material Design 3 inspired badge component with design token integration.
 * Supports multiple variants, sizes, shapes, and dot mode for notifications.
 * ==========================================================================
 */


// Tokens available globally via main application styles

.ui-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-weight: $semantic-typography-font-weight-medium;
  line-height: 1;
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
  user-select: none;
  box-sizing: border-box;
  transition: all $semantic-duration-short $semantic-easing-standard;
  background-color: aqua;

  // Default size (md)
  min-width: $semantic-sizing-icon-navigation;
  height: $semantic-sizing-icon-navigation;
  padding: 0 $semantic-spacing-component-xs;
  font-size: $semantic-typography-font-size-xs;
  border-radius: $semantic-border-radius-full;
  
  // Default variant styling
  background-color: $semantic-color-surface-secondary;
  color: $semantic-color-text-primary;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;

  // Size variants
  &[data-size="xs"] {
    min-width: $semantic-typography-icon-small-size;
    height: $semantic-typography-icon-small-size;
    padding: 0 calc($semantic-spacing-component-xs / 2);
    font-size: $semantic-typography-font-size-xs;
  }

  &[data-size="sm"] {
    min-width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
    padding: 0 $semantic-spacing-component-xs;
    font-size: $semantic-typography-font-size-xs;
  }

  &[data-size="md"] {
    min-width: $semantic-sizing-icon-navigation;
    height: $semantic-sizing-icon-navigation;
    padding: 0 $semantic-spacing-component-xs;
    font-size: $semantic-typography-font-size-xs;
  }

  &[data-size="lg"] {
    min-width: $semantic-sizing-icon-header;
    height: $semantic-sizing-icon-header;
    padding: 0 $semantic-spacing-component-sm;
    font-size: $semantic-typography-font-size-sm;
  }

  // Shape variants
  &[data-shape="pill"] {
    border-radius: $semantic-border-radius-full;
  }

  &[data-shape="rounded"] {
    border-radius: $semantic-border-radius-md;
  }

  &[data-shape="square"] {
    border-radius: $semantic-border-radius-sm;
  }

  // Dot mode - small notification dot
  &[data-dot="true"] {
    min-width: 0;
    width: 8px;
    height: 8px;
    padding: 0;
    border-radius: 50%;
    border: 2px solid $semantic-color-surface-primary;
    
    &[data-size="xs"] {
      width: 6px;
      height: 6px;
    }

    &[data-size="sm"] {
      width: 8px;
      height: 8px;
    }

    &[data-size="md"] {
      width: 10px;
      height: 10px;
    }

    &[data-size="lg"] {
      width: 12px;
      height: 12px;
    }
  }

  // Color variants
  &[data-variant="default"] {
    background-color: $semantic-color-surface-secondary;
    color: $semantic-color-text-primary;
    border-color: $semantic-color-border-subtle;
  }

  &[data-variant="primary"] {
    background-color: $semantic-color-brand-primary;
    color: $semantic-color-text-inverse;
    border-color: $semantic-color-brand-primary;
  }

  &[data-variant="secondary"] {
    background-color: $semantic-color-brand-secondary;
    color: $semantic-color-text-inverse;
    border-color: $semantic-color-brand-secondary;
  }

  &[data-variant="success"] {
    background-color: $semantic-color-success;
    color: $semantic-color-text-inverse;
    border-color: $semantic-color-success;
  }

  &[data-variant="warning"] {
    background-color: $semantic-color-warning;
    color: $semantic-color-text-inverse;
    border-color: $semantic-color-warning;
  }

  &[data-variant="danger"] {
    background-color: $semantic-color-danger;
    color: $semantic-color-text-inverse;
    border-color: $semantic-color-danger;
  }

  &[data-variant="info"] {
    background-color: $semantic-color-info;
    color: $semantic-color-text-inverse;
    border-color: $semantic-color-info;
  }

  // Hover states for interactive badges
  &:hover {
    transform: translateY(-1px);
    box-shadow: $semantic-shadow-elevation-1;
  }

  // Focus states for accessibility
  &:focus {
    outline: 2px solid $semantic-color-focus-ring;
    outline-offset: 2px;
  }

  // Responsive adjustments
  @media (max-width: calc($semantic-breakpoint-sm - 1px)) {
    &[data-size="lg"] {
      min-width: $semantic-sizing-icon-navigation;
      height: $semantic-sizing-icon-navigation;
      padding: 0 $semantic-spacing-component-xs;
      font-size: $semantic-typography-font-size-xs;
    }
  }
}@l(Ntx{z_ugqFbQjniF}B VCx:import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';

export type BadgeVariant = 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';
export type BadgeSize = 'xs' | 'sm' | 'md' | 'lg';
export type BadgeShape = 'pill' | 'rounded' | 'square';

@Component({
  selector: 'ui-badge',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <span 
      class="ui-badge"
      [attr.data-variant]="variant"
      [attr.data-size]="size"
      [attr.data-shape]="shape"
      [attr.data-dot]="isDot"
      [attr.aria-label]="ariaLabel"
      [title]="title"
    >
      @if (!isDot) {
        <ng-content></ng-content>
      }
    </span>
  `,
  styleUrls: ['./badge.component.scss']
})
export class BadgeComponent {
  @Input() variant: BadgeVariant = 'default';
  @Input() size: BadgeSize = 'md';
  @Input() shape: BadgeShape = 'pill';
  @Input() isDot: boolean = false;
  @Input() ariaLabel?: string;
  @Input() title?: string;
}Z<x" export * from './badge.component';Wx  ̟®QRO8BE;xk`l` -ҟb{XNX>oU	b]?x$F@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

.ui-card {
  position: relative;
  width: 100%;
  box-sizing: border-box;
  margin-right: $semantic-spacing-grid-gap-xs;
  margin-bottom: $semantic-spacing-grid-gap-xs;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  
  // Base styles
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  
  // Size variants - following 8px grid increments
  &--sm {
    min-height: $semantic-sizing-card-height-sm;
    
    .card-content-layer {
      padding: $semantic-spacing-component-padding-sm;
    }
    
    .card-header {
      padding-bottom: $semantic-spacing-component-sm;
    }
    
    .card-footer {
      padding-top: $semantic-spacing-component-sm;
    }
  }
  
  &--md {
    min-height: $semantic-sizing-card-height-md;
    
    .card-content-layer {
      padding: $semantic-spacing-component-padding-lg;
    }
    
    .card-header {
      padding-bottom: $semantic-spacing-component-md;
    }
    
    .card-footer {
      padding-top: $semantic-spacing-component-md;
    }
  }
  
  &--lg {
    min-height: $semantic-sizing-card-height-lg;
    
    .card-content-layer {
      padding: $semantic-spacing-component-padding-xl;
    }
    
    .card-header {
      padding-bottom: $semantic-spacing-component-lg;
    }
    
    .card-footer {
      padding-top: $semantic-spacing-component-lg;
    }
  }
  
  // Elevation variants - Material Design shadow levels
  &--elevation-none {
    box-shadow: none;
  }
  
  &--elevation-sm {
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &--elevation-md {
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &--elevation-lg {
    box-shadow: $semantic-shadow-elevation-3;
  }
  
  &--elevation-xl {
    box-shadow: $semantic-shadow-elevation-4;
  }
  
  // Radius variants - consistent scale
  &--radius-none {
    border-radius: 0;
  }
  
  &--radius-sm {
    border-radius: $semantic-border-radius-sm;
  }
  
  &--radius-md {
    border-radius: $semantic-border-radius-md;
  }
  
  &--radius-lg {
    border-radius: $semantic-border-radius-lg;
  }
  
  &--radius-full {
    border-radius: $semantic-border-radius-full;
    aspect-ratio: 1;
  }
  
  // Variant styles - Material Design 3 inspired colors
  &--elevated {
    background-color: $semantic-color-surface-primary;
    color: $semantic-color-text-primary;
    border: none;
    
    &:hover:not(.ui-card--disabled) {
      transform: translateY(-2px);
      box-shadow: $semantic-shadow-card-hover;
    }
  }
  
  &--filled {
    background-color: $semantic-color-surface-secondary;
    color: $semantic-color-text-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    &:hover:not(.ui-card--disabled) {
      background-color: $semantic-color-surface-elevated;
    }
  }
  
  &--outlined {
    background-color: transparent;
    color: $semantic-color-text-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-secondary;
    
    &:hover:not(.ui-card--disabled) {
      border-color: $semantic-color-border-focus;
      background-color: $semantic-color-surface-elevated;
    }
  }
  
  // Clickable state
  &--clickable {
    cursor: pointer;
    user-select: none;
    
    &:active:not(.ui-card--disabled) {
      transform: scale(0.98); // Subtle press effect
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-border-focus;
      outline-offset: 2px;
    }
  }
  
  // Disabled state
  &--disabled {
    opacity: 0.38; // Material Design disabled opacity
    cursor: not-allowed;
    pointer-events: none;
  }
  
  // Glass effect using CSS variables and semantic approach
  &--glass {
    position: relative;
    isolation: isolate;
    backdrop-filter: blur(var(--glass-blur-md, 8px));
    -webkit-backdrop-filter: blur(var(--glass-blur-md, 8px));
    border: 1px solid var(--glass-border-color, rgba(255, 255, 255, 0.2));
    transition: all $semantic-duration-short $semantic-easing-standard;
    
    .card-content-layer {
      position: relative;
      z-index: 2;
    }
    
    // Glass variant styles using CSS variables - fixed syntax
    &.ui-card--glass-translucent {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-translucent, 0.1));
      backdrop-filter: blur(var(--glass-blur-sm, 4px));
      -webkit-backdrop-filter: blur(var(--glass-blur-sm, 4px));
    }
    
    &.ui-card--glass-light {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-light, 0.3));
      backdrop-filter: blur(var(--glass-blur-md, 8px));
      -webkit-backdrop-filter: blur(var(--glass-blur-md, 8px));
    }
    
    &.ui-card--glass-medium {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-medium, 0.5));
      backdrop-filter: blur(var(--glass-blur-md, 8px));
      -webkit-backdrop-filter: blur(var(--glass-blur-md, 8px));
    }
    
    &.ui-card--glass-heavy {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-heavy, 0.7));
      backdrop-filter: blur(var(--glass-blur-lg, 16px));
      -webkit-backdrop-filter: blur(var(--glass-blur-lg, 16px));
    }
    
    &.ui-card--glass-frosted {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-frosted, 0.85));
      backdrop-filter: blur(var(--glass-blur-xl, 24px));
      -webkit-backdrop-filter: blur(var(--glass-blur-xl, 24px));
    }
    
    // Interactive glass states
    &.ui-card--clickable:hover:not(.ui-card--disabled) {
      transform: translateY(-2px);
      box-shadow: $semantic-shadow-elevation-3;
    }
    
    &.ui-card--clickable:active:not(.ui-card--disabled) {
      transform: scale(0.98);
    }
    
    // Disabled state for glass cards
    &.ui-card--disabled {
      backdrop-filter: blur(var(--glass-blur-xs, 2px));
      -webkit-backdrop-filter: blur(var(--glass-blur-xs, 2px));
      opacity: 0.6;
    }
  }
  
  // With background layer
  &--with-background {
    .card-background-layer {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      box-sizing: border-box;
      transform: translateZ(0);
      z-index: 0;
    }
    
    .card-content-layer {
      position: relative;
      z-index: 1;
      background: $semantic-color-surface-primary;
      color: $semantic-color-text-primary;
    }
  }
}

// Card content structure
.card-content-layer {
  display: flex;
  flex-direction: column;
  height: 100%;
  flex: 1;
  color: inherit;
}

.card-header {
  border-bottom: $semantic-border-width-1 solid $semantic-color-border-secondary;
  
  h1, h2, h3, h4, h5, h6 {
    margin: 0;
    color: $semantic-color-text-primary;
  }
  
  p {
    margin: 0;
    color: $semantic-color-text-secondary;
  }
}

.card-body {
  flex: 1;
  color: inherit;
  
  // Typography reset
  > *:first-child {
    margin-top: 0;
  }
  
  > *:last-child {
    margin-bottom: 0;
  }
  
  p {
    color: $semantic-color-text-primary;
  }
}

.card-footer {
  border-top: $semantic-border-width-1 solid $semantic-color-border-secondary;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: $semantic-spacing-component-sm;
}

// Glass overlay for enhanced glass effect
.card-glass-overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: linear-gradient(145deg, 
    rgba(255, 255, 255, 0.1) 0%,
    rgba(255, 255, 255, 0.05) 50%,
    rgba(255, 255, 255, 0.1) 100%);
  pointer-events: none;
  z-index: 1;
  border-radius: inherit;
}

// Ripple effect for clickable cards
.card-ripple-overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 3;
  
  &::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: 0;
    height: 0;
    border-radius: 50%;
    background: rgba(120, 53, 255, 0.2); // Brand color ripple
    transform: translate(-50%, -50%) scale(0);
    opacity: 0;
    transition: transform 0.3s ease, opacity 0.3s ease;
  }
  
  .ui-card--clickable:active & {
    &::after {
      transform: translate(-50%, -50%) scale(2);
      opacity: 1;
      transition: none;
    }
  }
}

// Hover effects based on elevation
.ui-card:hover:not(.ui-card--disabled) {
  &.ui-card--elevation-sm {
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &.ui-card--elevation-md {
    box-shadow: $semantic-shadow-elevation-3;
  }
  
  &.ui-card--elevation-lg {
    box-shadow: $semantic-shadow-elevation-4;
  }
}

// Dark mode support - Remove problematic dark mode overrides
// Semantic tokens should handle dark mode automatically

// Responsive adaptations  
@media (max-width: ($semantic-breakpoint-md - 1)) {
  .ui-card {
    margin-right: 0;
    
    &--lg {
      .card-content-layer {
        padding: $semantic-spacing-component-padding-lg;
      }
    }
    
    .card-footer {
      flex-direction: column;
      gap: $semantic-spacing-component-md;
    }
  }
}

// Accessibility
@media (prefers-reduced-motion: reduce) {
  .ui-card {
    transition: none;
    
    &:hover,
    &:active {
      transform: none;
    }
  }
  
  .card-ripple-overlay::after {
    transition: none;
  }
}@hGxsgqFbQjniF* Tximport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';

export type CardVariant = 'elevated' | 'filled' | 'outlined';
export type CardSize = 'sm' | 'md' | 'lg';
export type CardElevation = 'none' | 'sm' | 'md' | 'lg' | 'xl';
export type CardRadius = 'none' | 'sm' | 'md' | 'lg' | 'full';
export type GlassVariant = 'translucent' | 'light' | 'medium' | 'heavy' | 'frosted';

@Component({
  selector: 'ui-card',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div 
      [class]="cardClasses"
      [style.backgroundImage]="backgroundImage"
      [attr.tabindex]="clickable && !disabled ? '0' : null"
      [attr.role]="clickable ? 'button' : null"
      [attr.aria-disabled]="disabled"
      (click)="handleClick($event)"
      (keydown.enter)="handleClick($event)"
      (keydown.space)="handleClick($event)"
    >
      @if (hasBackgroundLayer) {
        <div class="card-background-layer">
          <ng-content select="[slot=background]"></ng-content>
        </div>
      }
      
      <div class="card-content-layer">
        @if (hasHeader) {
          <div class="card-header">
            <ng-content select="[slot=header]"></ng-content>
          </div>
        }
        
        <div class="card-body">
          <ng-content></ng-content>
        </div>
        
        @if (hasFooter) {
          <div class="card-footer">
            <ng-content select="[slot=footer]"></ng-content>
          </div>
        }
      </div>
      
      @if (glass) {
        <div class="card-glass-overlay"></div>
      }
      
      @if (clickable && !disabled) {
        <div class="card-ripple-overlay"></div>
      }
    </div>
  `,
  styleUrl: './card.component.scss'
})
export class CardComponent {
  @Input() variant: CardVariant = 'elevated';
  @Input() size: CardSize = 'md';
  @Input() elevation: CardElevation = 'sm';
  @Input() radius: CardRadius = 'md';
  @Input() disabled: boolean = false;
  @Input() clickable: boolean = false;
  @Input() glass: boolean = false;
  @Input() glassVariant: GlassVariant = 'medium';
  @Input() backgroundImage?: string;
  @Input() hasBackgroundLayer: boolean = false;
  @Input() hasHeader: boolean = false;
  @Input() hasFooter: boolean = false;
  @Input() class: string = '';

  @Output() cardClick = new EventEmitter<Event>();

  get cardClasses(): string {
    return [
      'ui-card',
      `ui-card--${this.variant}`,
      `ui-card--${this.size}`,
      `ui-card--elevation-${this.elevation}`,
      `ui-card--radius-${this.radius}`,
      this.disabled ? 'ui-card--disabled' : '',
      this.clickable ? 'ui-card--clickable' : '',
      this.glass ? 'ui-card--glass' : '',
      this.glass ? `ui-card--glass-${this.glassVariant}` : '',
      this.hasBackgroundLayer ? 'ui-card--with-background' : '',
      this.class
    ].filter(Boolean).join(' ');
  }

  handleClick(event: Event): void {
    if (this.clickable && !this.disabled) {
      this.cardClick.emit(event);
    }
  }
}Op|x! export * from './card.component';bx!@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

@mixin font-properties($font-map) {
  @if type-of($font-map) == 'map' {
    font-family: map-get($font-map, 'font-family');
    font-size: map-get($font-map, 'font-size');
    line-height: map-get($font-map, 'line-height');
    font-weight: map-get($font-map, 'font-weight');
    letter-spacing: map-get($font-map, 'letter-spacing');
  } @else {
    font: $font-map;
  }
}

.ui-video-player {
  position: relative;
  width: 100%;
  background: $semantic-color-surface;
  border-radius: 12px;
  overflow: hidden;
  box-shadow: $semantic-shadow-elevation-2;

  // Default size (medium)
  max-width: 800px;

  &--fullscreen {
    max-width: none !important;
    width: 100vw !important;
    height: 100vh !important;
    border-radius: 0;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 9999;
  }

  &--disabled {
    opacity: 0.6;
    pointer-events: none;
  }

  &--loading {
    .ui-video-player__video {
      cursor: wait;
    }
  }

  // Size variants - placed after default to override
  &--sm {
    max-width: 400px;
  }

  &--md {
    max-width: 800px;
  }

  &--lg {
    max-width: 1200px;
  }

  // Variant styles
  &--minimal {
    border-radius: 0;
    box-shadow: none;
    background: transparent;
  }

  &--theater {
    width: 100%;
    background: #000;
    
    .ui-video-player__video-container {
      padding-bottom: 42.85%; // 21:9 aspect ratio for theater mode
    }
    
    // Only remove max-width if no size variant is applied
    &:not(.ui-video-player--sm):not(.ui-video-player--md):not(.ui-video-player--lg) {
      max-width: none;
    }
  }

  &__video-container {
    position: relative;
    width: 100%;
    height: 0;
    padding-bottom: 56.25%; // 16:9 aspect ratio
    background: #000;
  }

  &__video {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    cursor: pointer;
  }

  &__loading-overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(0, 0, 0, 0.8);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: $semantic-spacing-component-md;
    z-index: 2;
  }

  &__loading-spinner {
    width: 40px;
    height: 40px;
    border: 3px solid rgba(255, 255, 255, 0.3);
    border-top: 3px solid $semantic-color-primary;
    border-radius: 50%;
    animation: spin 1s linear infinite;
  }

  &__loading-text {
    color: white;
    @include font-properties($semantic-typography-body-medium);
  }

  &__controls {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    background: linear-gradient(transparent, rgba(0, 0, 0, 0.8));
    padding: $semantic-spacing-component-lg $semantic-spacing-component-md $semantic-spacing-component-md;
    opacity: 0;
    transition: opacity $semantic-duration-medium $semantic-easing-standard;
    z-index: 3;
    display: flex;
    align-items: center;
    gap: $semantic-spacing-component-sm;

    &--visible {
      opacity: 1;
    }
  }

  &__control {
    background: none;
    border: none;
    color: white;
    cursor: pointer;
    padding: $semantic-spacing-component-xs;
    border-radius: 4px;
    transition: background-color $semantic-duration-fast $semantic-easing-standard;
    display: flex;
    align-items: center;
    justify-content: center;

    &:hover:not(:disabled) {
      background: rgba(255, 255, 255, 0.2);
    }

    &:focus {
      outline: 2px solid $semantic-color-primary;
      outline-offset: 2px;
    }

    &:disabled {
      opacity: 0.5;
      cursor: not-allowed;
    }
  }

  &__control-icon {
    width: 20px;
    height: 20px;
  }

  &__progress-container {
    flex: 1;
    display: flex;
    align-items: center;
    position: relative;
    margin: 0 $semantic-spacing-component-sm;
  }

  &__progress-bar {
    width: 100%;
    height: 4px;
    background: transparent;
    border: none;
    cursor: pointer;
    outline: none;
    -webkit-appearance: none;
    appearance: none;

    &::-webkit-slider-thumb {
      -webkit-appearance: none;
      appearance: none;
      width: 12px;
      height: 12px;
      border-radius: 50%;
      background: $semantic-color-primary;
      cursor: pointer;
      border: 2px solid white;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
    }

    &::-moz-range-thumb {
      width: 12px;
      height: 12px;
      border-radius: 50%;
      background: $semantic-color-primary;
      cursor: pointer;
      border: 2px solid white;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
    }
  }

  &__progress-track {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 100%;
    height: 4px;
    background: rgba(255, 255, 255, 0.3);
    border-radius: 2px;
    pointer-events: none;
  }

  &__progress-filled {
    height: 100%;
    background: $semantic-color-primary;
    border-radius: 2px;
    transition: width 0.1s linear;
  }

  &__time {
    color: white;
    @include font-properties($semantic-typography-body-small);
    white-space: nowrap;
    margin: 0 $semantic-spacing-component-xs;
  }

  &__volume-bar {
    width: 80px;
    height: 4px;
    background: transparent;
    border: none;
    cursor: pointer;
    outline: none;
    -webkit-appearance: none;
    appearance: none;
    margin-left: $semantic-spacing-component-xs;

    &::-webkit-slider-track {
      width: 100%;
      height: 4px;
      background: rgba(255, 255, 255, 0.3);
      border-radius: 2px;
    }

    &::-webkit-slider-thumb {
      -webkit-appearance: none;
      appearance: none;
      width: 12px;
      height: 12px;
      border-radius: 50%;
      background: $semantic-color-primary;
      cursor: pointer;
      border: 2px solid white;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
    }

    &::-moz-range-track {
      width: 100%;
      height: 4px;
      background: rgba(255, 255, 255, 0.3);
      border-radius: 2px;
    }

    &::-moz-range-thumb {
      width: 12px;
      height: 12px;
      border-radius: 50%;
      background: $semantic-color-primary;
      cursor: pointer;
      border: 2px solid white;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
    }
  }

  &__fallback {
    color: white;
    @include font-properties($semantic-typography-body-medium);
    text-align: center;
    padding: $semantic-spacing-component-lg;

    a {
      color: $semantic-color-primary;
      text-decoration: none;

      &:hover {
        text-decoration: underline;
      }
    }
  }

  &__error {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(0, 0, 0, 0.9);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: $semantic-spacing-component-md;
    z-index: 4;
    padding: $semantic-spacing-component-lg;
  }

  &__error-icon {
    width: 48px;
    height: 48px;
    color: $semantic-color-error;

    svg {
      width: 100%;
      height: 100%;
    }
  }

  &__error-message {
    color: white;
    @include font-properties($semantic-typography-body-large);
    text-align: center;
    margin: 0;
  }

  &__error-link {
    color: $semantic-color-primary;
    @include font-properties($semantic-typography-body-medium);
    text-decoration: none;
    padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    border: 1px solid $semantic-color-primary;
    border-radius: 4px;
    transition: all $semantic-duration-fast $semantic-easing-standard;

    &:hover {
      background: $semantic-color-primary;
      color: white;
    }
  }

  // Show controls on hover or when paused
  &:hover &__controls,
  &__controls--visible {
    opacity: 1;
  }

  // Responsive design
  @media (max-width: 768px) {
    // On mobile, make size variants responsive but maintain relative sizing
    &--sm {
      max-width: 320px;
    }
    
    &--md {
      max-width: 600px;
    }
    
    &--lg {
      max-width: 100%;
    }

    &__controls {
      padding: $semantic-spacing-component-md $semantic-spacing-component-sm;
      gap: $semantic-spacing-component-xs;
    }

    &__control-icon {
      width: 18px;
      height: 18px;
    }

    &__volume-bar {
      width: 60px;
    }

    &__time {
      @include font-properties($semantic-typography-body-small);
    }
  }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}jWx]B?carousel*overflow: hiddensurface-container;

  &__A@400px; // Default height
    overflow: hidden;
  }

  &__track {1W#transition: transformH8"}

  &__slide {
    flex: 0 0 100%Q),~#opacity: 1;
    transform: scale(1)/M,
                transformH6
    &--activ  transform: scale(1);
    }

    .ui-carousel__image-container,
    .ui-carousel__card,
    .ui-carousel__content-slide {
    R3imageBp

    .ui-carousel__imageK.@  object-fit: cover;
    }

    .ui-carousel__image-overlay {
  *  bottom: 0;
      left: 0;
      right: 0
-7));a,9lg;
      color: white;

      .ui-carousel__title {
    	2"heading-h3);
        margin-bottom"&}

      .ui-carousel__subtitle {
    	B3      opacity: 0.9;
      }
    }
  }

  &__card {
 surface-containerp	8px;
    overflow: hidden;
  K/  .ui-carousel__card-imageK$C60%;
      object-fit: cover;
    }

    .ui-carousel__card-content_.lg;
      height: 40%;
  1|!
      .ui-carousel__title {
    	2"heading-h4);
        margin-bottom"&}

      .ui-carousel__subtitle {
    	B  !%text-secondary;
        margin-bottom"%}

      .ui-carousel__content {
    	7 !7text-secondary;
      }
    }
  }

  &__content-slide {o*lg;
    text-align: centertext-primaryI~
    .ui-carousel__titl^ 8 heading-h3);
      margin-bottom
}

    .ui-carousel__subtitl^ =#text-secondary;
      margin-bottom
}

    .ui-carousel__content_ <#text-secondary;
    }
  }

  &__nav$I*
z-index: 2(9)|v	#,~M'34 motion*}!	white;
  N
 scale(1.1P#}

    &--prev {
      left
}

    &--next {
      right
}

    .ui-carousel__nav20px;
      height: 20px;'text-primary;
    }
  }

  &__indicator.
(
leftGX(-50%)!:xs;
    z-index: 2;

    &--dots .ui-carousel__indicator {AF:}

    &--bars .ui-carousel__indicator {
      width: 24pxMP--thumbnails .ui-carousel__indicator {
      width: 48px;
      height: 32px;
  /  overflow: hidden;
    }
  }

  &__indicator {}"5);
:#\"
    &--active {atransform: scale(1.2);
    }|"08pT.ui-carousel__indicator-dot,
    .ui-carousel__indicator-bar {
      display: block;M,F  border-radius: inherit;
    }

    .ui-carousel__indicator-thumbnailK.  object-fit: cover
  &--sm {
    .ui-carousel__container {
      height: 250px;
    }
  }

  &--md {
    .ui-carousel__container {
      height: 400px;
    }
  }

  &--lg {
    .ui-carousel__container {
      height: 600px;
    }
  }

  // Transition effects
  &--fade {
 _   .ui-carousel__track {
      // For fade transition, we need to position slides absolutely
  #}
    
    .ui-carousel__slide {
  +  top: 0;
      left: 0;
      right: 0;
  !3O  flex: none; // Override the flex property
      
      &--active {
        opacity: 1;
        z-index: 1;
      }
    }
  }
*
  &--scale {
    .ui-carousel__track {
  #}
    
    .ui-carousel__slide {
    top: 0;
      left: 0;
      right: 0;
      transform: scale(0.8);
      opacity: 0.3;
      transition: transform $semanticR*,
                 @B  flex: none; // Override the flex property
      
      &--active {
        transform: scale(1);
        opacity: 1;
        z-index: 1;
      }
    }
  }

  &--slide {
    // Default slide behavior - already handled by track transform
    .ui-carousel_$_track {
      transition: transformH:}
  }

  // Disabled statepDH7&__container {
      height: 300px;
    }

    &--sm .ui-carousel__container {
      height: 200px;
    }

    &--lg .ui-carousel__container {
      height: 400px;
    }

    &__nav {
      width: 40px;
      height: 40px;

      .ui-carousel__nav-icon {
        width: 16px;
        height: 16px;
      }
    }

    &__card .ui-carousel__card-content,
    &__content-slide {
     g(}
  }
}ƓuKxvjq YX[Q M xWOVW(@p B	DhnZ:i7/īcU,.SIiǮvmҤzzXOٱlJ$~O/~VD]kXC˰ڗy]Q@+#x6W4b$|.MqTDUT~Pma1bSc+L5d"kjUMC)9׹e(c
HAXg±~':2Q觓ۈǋ</V| /ɶG*29fB٦wۓ>v)oR9U{}7&1\8oN^%~lR_
2)v`M!El10;:EQS7lz4~\Ĭ-׭Dq,M0M5uNꢾ/e<INF$,a\4ĊLZMx%@P!xG07lBY몀Mv6v_.W	ÝbbdT]pI64`V14u~qqtI[=TTei1ꢢXRy$MNCfKo=qIN 

ӓ-ƶ'%f9.LxTwF#_*uXfMy>_k5S(\~dYnD:]2Oc/m9m1/)J-wb:,uD
[/"7~f(rE$nPf.fσGgXׅ3DgϙAx"i8`;p=~tYO9;8ǆv]LRk˪(+Fo~<94[w
ar9ԿNk~fHh5QNgkv՝]RPmlj<8
PYV"NU4>.5ˤלt@͆9w兙v1`mK̆cNF|]zKakGQyon~VÆeYUtZl\)vh0qw̠CT%D4lH,$XiYGhb2
R.snsZ|1ݽY?UMlW7fPCX'-I}U4q<vZ
XK4;:8~Rnd׺.\UE]nFw)[)tebqM<iHTt:[&BSBV<g{G!-m˦
|aJ7ڋs[NK̹;L}esPBcm:}c%`[g{o;@+.==偵KX3͋.is5"skC	?xkq:_7/fJcâ<yVk'hhLg隼6<X7qHe L):XR7;a С+Խx]$import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal, computed } from '@angular/core';
import { CommonModule } from '@angular/common';

export type CarouselSize = 'sm' | 'md' | 'lg';
export type CarouselVariant = 'card' | 'image' | 'content';
export type CarouselIndicatorStyle = 'dots' | 'bars' | 'thumbnails' | 'none';
export type CarouselTransition = 'slide' | 'fade' | 'scale';

export interface CarouselItem {
  id: string | number;
  imageUrl?: string;
  title?: string;
  subtitle?: string;
  content?: string;
  thumbnail?: string;
}

@Component({
  selector: 'ui-carousel',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-carousel"
      [class]="getComponentClasses()"
      [attr.aria-roledescription]="'carousel'"
      [attr.aria-label]="ariaLabel"
      role="region">
      
      <!-- Navigation buttons -->
      @if (showNavigation && items.length > 1) {
        <button 
          class="ui-carousel__nav ui-carousel__nav--prev"
          [disabled]="disabled || (currentIndex() === 0 && !loop)"
          (click)="goToPrevious()"
          [attr.aria-label]="'Previous slide'"
          type="button">
          <svg class="ui-carousel__nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
            <polyline points="15,18 9,12 15,6"></polyline>
          </svg>
        </button>
        
        <button 
          class="ui-carousel__nav ui-carousel__nav--next"
          [disabled]="disabled || (currentIndex() === items.length - 1 && !loop)"
          (click)="goToNext()"
          [attr.aria-label]="'Next slide'"
          type="button">
          <svg class="ui-carousel__nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
            <polyline points="9,18 15,12 9,6"></polyline>
          </svg>
        </button>
      }
      
      <!-- Carousel container -->
      <div class="ui-carousel__container">
        <div 
          class="ui-carousel__track"
          [style.transform]="transition === 'slide' ? 'translateX(-' + (currentIndex() * 100) + '%)' : 'translateX(0)'">
          @for (item of items; track item.id; let i = $index) {
            <div 
              class="ui-carousel__slide"
              [class.ui-carousel__slide--active]="i === currentIndex()"
              [attr.aria-hidden]="i === currentIndex() ? 'false' : 'true'"
              [attr.aria-label]="'Slide ' + (i + 1) + ' of ' + items.length">
              
              <!-- Content based on variant -->
              @switch (variant) {
                @case ('image') {
                  @if (item.imageUrl) {
                    <div class="ui-carousel__image-container">
                      <img 
                        [src]="item.imageUrl" 
                        [alt]="item.title || 'Carousel image'"
                        class="ui-carousel__image"
                        loading="lazy">
                      @if (item.title || item.subtitle) {
                        <div class="ui-carousel__image-overlay">
                          @if (item.title) {
                            <h3 class="ui-carousel__title">{{ item.title }}</h3>
                          }
                          @if (item.subtitle) {
                            <p class="ui-carousel__subtitle">{{ item.subtitle }}</p>
                          }
                        </div>
                      }
                    </div>
                  }
                }
                
                @case ('card') {
                  <div class="ui-carousel__card">
                    @if (item.imageUrl) {
                      <img 
                        [src]="item.imageUrl" 
                        [alt]="item.title || 'Card image'"
                        class="ui-carousel__card-image"
                        loading="lazy">
                    }
                    <div class="ui-carousel__card-content">
                      @if (item.title) {
                        <h3 class="ui-carousel__title">{{ item.title }}</h3>
                      }
                      @if (item.subtitle) {
                        <p class="ui-carousel__subtitle">{{ item.subtitle }}</p>
                      }
                      @if (item.content) {
                        <p class="ui-carousel__content">{{ item.content }}</p>
                      }
                    </div>
                  </div>
                }
                
                @case ('content') {
                  <div class="ui-carousel__content-slide">
                    @if (item.title) {
                      <h3 class="ui-carousel__title">{{ item.title }}</h3>
                    }
                    @if (item.subtitle) {
                      <p class="ui-carousel__subtitle">{{ item.subtitle }}</p>
                    }
                    @if (item.content) {
                      <div class="ui-carousel__content" [innerHTML]="item.content"></div>
                    }
                  </div>
                }
              }
            </div>
          }
        </div>
      </div>
      
      <!-- Indicators -->
      @if (showIndicators && indicatorStyle !== 'none' && items.length > 1) {
        <div class="ui-carousel__indicators" [class]="getIndicatorClasses()">
          @for (item of items; track item.id; let i = $index) {
            <button 
              class="ui-carousel__indicator"
              [class.ui-carousel__indicator--active]="i === currentIndex()"
              [disabled]="disabled"
              (click)="goToSlide(i)"
              [attr.aria-label]="'Go to slide ' + (i + 1)"
              type="button">
              @switch (indicatorStyle) {
                @case ('thumbnails') {
                  @if (item.thumbnail || item.imageUrl) {
                    <img 
                      [src]="item.thumbnail || item.imageUrl" 
                      [alt]="item.title || 'Slide thumbnail'"
                      class="ui-carousel__indicator-thumbnail">
                  }
                }
                @case ('dots') {
                  <span class="ui-carousel__indicator-dot"></span>
                }
                @case ('bars') {
                  <span class="ui-carousel__indicator-bar"></span>
                }
              }
            </button>
          }
        </div>
      }
    </div>
  `,
  styleUrl: './carousel.component.scss'
})
export class CarouselComponent {
  @Input() items: CarouselItem[] = [];
  @Input() size: CarouselSize = 'md';
  @Input() variant: CarouselVariant = 'image';
  @Input() transition: CarouselTransition = 'slide';
  @Input() indicatorStyle: CarouselIndicatorStyle = 'dots';
  @Input() disabled = false;
  @Input() autoplay = false;
  @Input() autoplayInterval = 3000;
  @Input() loop = true;
  @Input() showNavigation = true;
  @Input() showIndicators = true;
  @Input() ariaLabel = 'Image carousel';
  @Input() initialIndex = 0;

  @Output() slideChange = new EventEmitter<number>();
  @Output() itemClick = new EventEmitter<{item: CarouselItem, index: number}>();

  private _currentIndex = signal(this.initialIndex);
  private _autoplayTimer?: number;

  currentIndex = this._currentIndex.asReadonly();

  getComponentClasses(): string {
    const classes = [
      'ui-carousel',
      `ui-carousel--${this.size}`,
      `ui-carousel--${this.variant}`,
      `ui-carousel--${this.transition}`
    ];
    
    if (this.disabled) {
      classes.push('ui-carousel--disabled');
    }
    
    if (this.autoplay) {
      classes.push('ui-carousel--autoplay');
    }
    
    return classes.join(' ');
  }

  getIndicatorClasses(): string {
    const classes = ['ui-carousel__indicators'];
    
    if (this.indicatorStyle) {
      classes.push(`ui-carousel__indicators--${this.indicatorStyle}`);
    }
    
    return classes.join(' ');
  }

  ngOnInit(): void {
    this._currentIndex.set(this.initialIndex);
    if (this.autoplay && !this.disabled) {
      this.startAutoplay();
    }
  }

  ngOnDestroy(): void {
    this.stopAutoplay();
  }

  goToSlide(index: number): void {
    if (this.disabled || index < 0 || index >= this.items.length) {
      return;
    }

    this._currentIndex.set(index);
    this.slideChange.emit(index);
    this.resetAutoplay();
  }

  goToNext(): void {
    const nextIndex = this.loop && this.currentIndex() === this.items.length - 1 
      ? 0 
      : Math.min(this.currentIndex() + 1, this.items.length - 1);
    this.goToSlide(nextIndex);
  }

  goToPrevious(): void {
    const prevIndex = this.loop && this.currentIndex() === 0 
      ? this.items.length - 1 
      : Math.max(this.currentIndex() - 1, 0);
    this.goToSlide(prevIndex);
  }

  private startAutoplay(): void {
    this.stopAutoplay();
    this._autoplayTimer = window.setInterval(() => {
      this.goToNext();
    }, this.autoplayInterval);
  }

  private stopAutoplay(): void {
    if (this._autoplayTimer) {
      clearInterval(this._autoplayTimer);
      this._autoplayTimer = undefined;
    }
  }

  private resetAutoplay(): void {
    if (this.autoplay && !this.disabled) {
      this.stopAutoplay();
      this.startAutoplay();
    }
  }
}BDkxqu=䳢<ºřUJ 䃢 Ģļɖ%gd 5LY <Q]ҒJZss8QAFEԊAffd&'T@܄*48G䟬B%&ܼ]}+ K$xu% N͓8$8tx% export * from './carousel.component';[&cx  6,9Fy4twE;Ǳ;xv$@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;
.ui-chip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  position: relative;
  vertical-align: top;
  white-space: nowrap;
  overflow: hidden;
  margin-right: 0.75rem;
  margin-bottom: 0.5rem;
  
  // Prevent text selection
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  
  // Base typography
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  font-weight: 500;
  text-decoration: none;
  outline: none;
  
  // Transitions
  transition: all $semantic-duration-fast $semantic-easing-standard;
  
  // Size variants
  &--sm {
    height: 24px;
    font-size: 0.75rem;
    line-height: 1;
    
    .chip-label {
      padding: 0 0.5rem;
    }
    
    .chip-leading-icon,
    .chip-trailing-icon {
      width: 18px;
      height: 18px;
      font-size: 0.75rem;
      margin: 0 0.25rem;
    }
    
    .chip-avatar {
      width: 18px;
      height: 18px;
      margin: 0 0.25rem 0 0.125rem;
      
      img {
        width: 18px;
        height: 18px;
        border-radius: 9px;
      }
    }
    
    &.ui-chip--with-leading-icon .chip-label,
    &.ui-chip--with-avatar .chip-label {
      padding-left: 0.25rem;
    }
    
    &.ui-chip--with-trailing-icon .chip-label,
    &.ui-chip--removable .chip-label {
      padding-right: 0.25rem;
    }
  }
  
  &--md {
    height: 32px;
    font-size: 0.875rem;
    line-height: 1;
    
    .chip-label {
      padding: 0 0.75rem;
    }
    
    .chip-leading-icon,
    .chip-trailing-icon {
      width: 24px;
      height: 24px;
      font-size: 1rem;
      margin: 0 0.25rem;
    }
    
    .chip-avatar {
      width: 24px;
      height: 24px;
      margin: 0 0.25rem 0 0.125rem;
      
      img {
        width: 24px;
        height: 24px;
        border-radius: 12px;
      }
    }
    
    &.ui-chip--with-leading-icon .chip-label,
    &.ui-chip--with-avatar .chip-label {
      padding-left: 0.5rem;
    }
    
    &.ui-chip--with-trailing-icon .chip-label,
    &.ui-chip--removable .chip-label {
      padding-right: 0.5rem;
    }
  }
  
  &--lg {
    height: 40px;
    font-size: 1rem;
    line-height: 1;
    
    .chip-label {
      padding: 0 1rem;
    }
    
    .chip-leading-icon,
    .chip-trailing-icon {
      width: 28px;
      height: 28px;
      font-size: 1.125rem;
      margin: 0 0.375rem;
    }
    
    .chip-avatar {
      width: 32px;
      height: 32px;
      margin: 0 0.375rem 0 0.25rem;
      
      img {
        width: 32px;
        height: 32px;
        border-radius: 16px;
      }
    }
    
    &.ui-chip--with-leading-icon .chip-label,
    &.ui-chip--with-avatar .chip-label {
      padding-left: 0.5rem;
    }
    
    &.ui-chip--with-trailing-icon .chip-label,
    &.ui-chip--removable .chip-label {
      padding-right: 0.5rem;
    }
  }
  
  // Radius variants
  &--radius-none {
    border-radius: 0;
  }
  
  &--radius-sm {
    border-radius: 0.25rem;
  }
  
  &--radius-md {
    border-radius: 0.375rem;
  }
  
  &--radius-lg {
    border-radius: 0.5rem;
  }
  
  &--radius-capsule {
    border-radius: 50px;
  }
  
  // Variant styles
  &--filled {
    background-color: $semantic-color-surface-elevated;
    color: $semantic-color-text-primary;
    border: 1px solid transparent;
    
    &:hover:not(.ui-chip--disabled) {
      background-color: $semantic-color-surface-selected;
      transform: translateY(-1px);
    }
    
    &:active:not(.ui-chip--disabled) {
      transform: scale(0.95);
    }
    
    &.ui-chip--selected {
      background-color: $semantic-color-primary;
      color: $semantic-color-text-inverse;
      
      &:hover:not(.ui-chip--disabled) {
        background-color: $semantic-color-primary-hover;
      }
    }
  }
  
  &--outlined {
    background-color: transparent;
    color: $semantic-color-primary;
    border: 1px solid $semantic-color-border-primary;
    
    &:hover:not(.ui-chip--disabled) {
      background-color: $semantic-color-surface-elevated;
      border-color: $semantic-color-primary;
      transform: translateY(-1px);
    }
    
    &:active:not(.ui-chip--disabled) {
      background-color: $semantic-color-surface-primary;
      transform: scale(0.95);
    }
    
    &.ui-chip--selected {
      background-color: $semantic-color-surface-primary;
      border-color: $semantic-color-primary;
      
      &:hover:not(.ui-chip--disabled) {
        background-color: $semantic-color-surface-elevated;
      }
    }
  }
  
  &--elevated {
    background-color: $semantic-color-surface-primary;
    color: $semantic-color-text-primary;
    border: none;
    box-shadow: $semantic-shadow-elevation-1;
    
    &:hover:not(.ui-chip--disabled) {
      box-shadow: $semantic-shadow-elevation-2;
      transform: translateY(-1px);
    }
    
    &:active:not(.ui-chip--disabled) {
      box-shadow: $semantic-shadow-elevation-1;
      transform: scale(0.95);
    }
    
    &.ui-chip--selected {
      background-color: $semantic-color-primary;
      color: $semantic-color-text-inverse;
      box-shadow: $semantic-shadow-elevation-2;
      
      &:hover:not(.ui-chip--disabled) {
        background-color: $semantic-color-primary-hover;
        box-shadow: $semantic-shadow-elevation-3;
      }
    }
  }
  
  // States
  &--clickable {
    cursor: pointer;
    
    &:focus-visible {
      outline: 2px solid $semantic-color-border-focus;
      outline-offset: 2px;
    }
  }
  
  &--disabled {
    opacity: 0.38;
    cursor: not-allowed;
    pointer-events: none;
  }
  
  &--selected {
    // Selected styles are handled in variant sections above
  }
  
  // Icon and avatar styles
  .chip-leading-icon,
  .chip-trailing-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
  }
  
  .chip-trailing-icon {
    cursor: pointer;
    border-radius: 50%;
    transition: background-color $semantic-duration-fast ease;
    
    &:hover {
      background-color: rgba(0, 0, 0, 0.1);
    }
    
    &:focus-visible {
      outline: 1px solid $semantic-color-border-focus;
      outline-offset: 1px;
    }
  }
  
  .chip-avatar {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    overflow: hidden;
    
    img {
      object-fit: cover;
      border: 1px solid rgba(0, 0, 0, 0.1);
    }
  }
  
  .chip-label {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 1;
    min-width: 0;
    text-align: center;
  }
}

// Dark mode support
@media (prefers-color-scheme: dark) {
  .ui-chip {
    &--filled {
      background-color: hsl(279, 14%, 25%);
      color: hsl(0, 0%, 90%);
      
      &:hover:not(.ui-chip--disabled) {
        background-color: hsl(279, 14%, 30%);
      }
      
      &.ui-chip--selected {
        background-color: hsl(258, 100%, 47%);
        color: white;
        
        &:hover:not(.ui-chip--disabled) {
          background-color: hsl(258, 100%, 52%);
        }
      }
    }
    
    &--outlined {
      background-color: transparent;
      color: hsl(258, 100%, 67%);
      border-color: hsl(279, 14%, 45%);
      
      &:hover:not(.ui-chip--disabled) {
        background-color: hsl(279, 14%, 15%);
        border-color: hsl(258, 100%, 67%);
      }
      
      &:active:not(.ui-chip--disabled) {
        background-color: hsl(279, 14%, 20%);
      }
      
      &.ui-chip--selected {
        background-color: hsl(279, 14%, 20%);
        border-color: hsl(258, 100%, 67%);
        
        &:hover:not(.ui-chip--disabled) {
          background-color: hsl(279, 14%, 25%);
        }
      }
    }
    
    &--elevated {
      background-color: hsl(279, 14%, 15%);
      color: hsl(0, 0%, 90%);
      
      &:hover:not(.ui-chip--disabled) {
        background-color: hsl(279, 14%, 20%);
      }
      
      &.ui-chip--selected {
        background-color: hsl(258, 100%, 47%);
        color: white;
        
        &:hover:not(.ui-chip--disabled) {
          background-color: hsl(258, 100%, 52%);
        }
      }
    }
    
    .chip-trailing-icon:hover {
      background-color: rgba(255, 255, 255, 0.1);
    }
    
    .chip-avatar img {
      border-color: rgba(255, 255, 255, 0.2);
    }
  }
}

// Accessibility
@media (prefers-reduced-motion: reduce) {
  .ui-chip {
    transition: none;
    
    &:hover,
    &:active {
      transform: none;
    }
  }
}

// Chip group/set container utility
.ui-chip-set {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  align-items: flex-start;
  
  &--row {
    flex-wrap: nowrap;
    overflow-x: auto;
    scroll-padding-left: 1rem;
    scroll-snap-type: x mandatory;
    
    .ui-chip {
      scroll-snap-align: center;
      flex-shrink: 0;
    }
    
    &::-webkit-scrollbar {
      height: 0;
      background: transparent;
    }
    
    scrollbar-width: none;
    -ms-overflow-style: none;
  }
  
  &--no-scroll {
    overflow-x: visible;
  }
}

// Responsive
@media (max-width: 768px) {
  .ui-chip {
    margin-right: 0.5rem;
    margin-bottom: 0.375rem;
    
    &--lg {
      height: 36px;
      font-size: 0.875rem;
      
      .chip-label {
        padding: 0 0.75rem;
      }
    }
  }
}1xcgqFbQjniF? ]%xBimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';

export type ChipVariant = 'filled' | 'outlined' | 'elevated';
export type ChipSize = 'sm' | 'md' | 'lg';
export type ChipRadius = 'none' | 'sm' | 'md' | 'lg' | 'capsule';

@Component({
  selector: 'ui-chip',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div 
      [class]="chipClasses"
      [attr.tabindex]="disabled ? null : '0'"
      [attr.role]="clickable ? 'button' : null"
      [attr.aria-disabled]="disabled"
      [attr.aria-selected]="selected"
      (click)="handleClick($event)"
      (keydown.enter)="handleClick($event)"
      (keydown.space)="handleClick($event)"
    >
      @if (leadingIcon) {
        <div class="chip-leading-icon">
          <fa-icon [icon]="leadingIcon"></fa-icon>
        </div>
      }
      
      @if (avatar) {
        <div class="chip-avatar">
          <img [src]="avatar" [alt]="avatarAlt || label" />
        </div>
      }
      
      <div class="chip-label">
        {{ label }}
      </div>
      
      @if (removable && closeIcon) {
        <div class="chip-trailing-icon" (click)="handleRemove($event)" [attr.tabindex]="disabled ? null : '0'">
          <fa-icon [icon]="closeIcon"></fa-icon>
        </div>
      }
      
      @if (trailingIcon && !removable) {
        <div class="chip-trailing-icon">
          <fa-icon [icon]="trailingIcon"></fa-icon>
        </div>
      }
    </div>
  `,
  styleUrl: './chip.component.scss'
})
export class ChipComponent {
  @Input() label: string = '';
  @Input() variant: ChipVariant = 'filled';
  @Input() size: ChipSize = 'md';
  @Input() radius: ChipRadius = 'md';
  @Input() disabled: boolean = false;
  @Input() selected: boolean = false;
  @Input() clickable: boolean = false;
  @Input() removable: boolean = false;
  @Input() leadingIcon?: IconDefinition;
  @Input() trailingIcon?: IconDefinition;
  @Input() closeIcon?: IconDefinition;
  @Input() avatar?: string;
  @Input() avatarAlt?: string;
  @Input() class: string = '';

  @Output() chipClick = new EventEmitter<Event>();
  @Output() chipRemove = new EventEmitter<Event>();

  get chipClasses(): string {
    return [
      'ui-chip',
      `ui-chip--${this.variant}`,
      `ui-chip--${this.size}`,
      `ui-chip--radius-${this.radius}`,
      this.disabled ? 'ui-chip--disabled' : '',
      this.selected ? 'ui-chip--selected' : '',
      this.clickable ? 'ui-chip--clickable' : '',
      this.removable ? 'ui-chip--removable' : '',
      this.leadingIcon ? 'ui-chip--with-leading-icon' : '',
      this.trailingIcon ? 'ui-chip--with-trailing-icon' : '',
      this.avatar ? 'ui-chip--with-avatar' : '',
      this.class
    ].filter(Boolean).join(' ');
  }

  handleClick(event: Event): void {
    if (!this.disabled && this.clickable) {
      this.chipClick.emit(event);
    }
  }

  handleRemove(event: Event): void {
    event.stopPropagation();
    if (!this.disabled) {
      this.chipRemove.emit(event);
    }
  }
}Iűx! export * from './chip.component';lEx  &T4@نăIoGdL4![;NxJ@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

.ui-image-container {
  // Core Structure
  position: relative;
  display: inline-block;
  overflow: hidden;
  
  // Layout & Aspect Ratio
  aspect-ratio: var(--aspect-ratio, 1/1);
  
  // Visual Design
  background: $semantic-color-surface-secondary;
  border: $semantic-border-width-1 solid $semantic-color-border-primary;
  border-radius: $semantic-border-radius-md;
  
  // Transitions
  transition: all $semantic-duration-fast $semantic-easing-standard;

  // Size Variants
  &--size-sm {
    min-width: $semantic-sizing-card-width-sm * 0.5; // 8rem
    max-width: $semantic-sizing-card-width-sm; // 16rem
    min-height: $semantic-sizing-card-height-sm * 0.5; // 4rem
  }
  
  &--size-md {
    min-width: $semantic-sizing-card-width-md * 0.5; // 10rem
    max-width: $semantic-sizing-card-width-md; // 20rem
    min-height: $semantic-sizing-card-height-md * 0.5; // 6rem
  }
  
  &--size-lg {
    min-width: $semantic-sizing-card-width-lg * 0.5; // 12rem
    max-width: $semantic-sizing-card-width-lg; // 24rem
    min-height: $semantic-sizing-card-height-lg * 0.5; // 8rem
  }
  
  &--size-xl {
    min-width: $semantic-sizing-card-width-lg * 0.75; // 18rem
    max-width: $semantic-sizing-content-narrow; // 42rem
    min-height: $semantic-sizing-card-height-lg * 0.75; // 12rem
  }

  // Aspect Ratio Variants
  &--aspect-1-1 { aspect-ratio: 1/1; }
  &--aspect-4-3 { aspect-ratio: 4/3; }
  &--aspect-16-9 { aspect-ratio: 16/9; }
  &--aspect-3-2 { aspect-ratio: 3/2; }
  &--aspect-2-1 { aspect-ratio: 2/1; }
  &--aspect-3-4 { aspect-ratio: 3/4; }
  &--aspect-9-16 { aspect-ratio: 9/16; }

  // Shape Variants
  &--shape-square {
    border-radius: $semantic-border-radius-sm;
  }
  
  &--shape-rounded {
    border-radius: $semantic-border-radius-md;
  }
  
  &--shape-circle {
    border-radius: $semantic-border-radius-full;
    aspect-ratio: 1/1;
  }

  // State Variants
  &--loading {
    cursor: wait;
  }
  
  &--error {
    border-color: $semantic-color-border-error;
    border-style: dashed;
  }
  
  &--lazy {
    background: $semantic-color-surface-secondary;
    
    &:not(.ui-image-container--loaded) {
      animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
    }
  }

  // Interactive States
  &:not(.ui-image-container--error) {
    &:hover {
      box-shadow: $semantic-shadow-elevation-2;
      transform: translateY(-1px);
      border-color: $semantic-color-border-primary;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus-ring;
      outline-offset: 2px;
    }
    
    &:active {
      transform: translateY(0);
      box-shadow: $semantic-shadow-elevation-1;
    }
  }

  // Image Element
  &__image {
    width: 100%;
    height: 100%;
    display: block;
    
    // Object Fit Variants
    &--fit-contain { object-fit: contain; }
    &--fit-cover { object-fit: cover; }
    &--fit-fill { object-fit: fill; }
    &--fit-scale-down { object-fit: scale-down; }
    &--fit-none { object-fit: none; }
    
    // Smooth appearance transition
    opacity: 0;
    transition: opacity $semantic-duration-medium $semantic-easing-standard;
    
    .ui-image-container--loaded & {
      opacity: 1;
    }
  }

  // Loading State
  &__loading {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: $semantic-color-surface-secondary;
    z-index: 2;
  }
  
  &__spinner {
    width: $semantic-sizing-icon-navigation;
    height: $semantic-sizing-icon-navigation;
    border: 2px solid $semantic-color-border-primary;
    border-top: 2px solid $semantic-color-interactive-primary;
    border-radius: $semantic-border-radius-full;
    animation: spin 1s linear infinite;
  }

  // Error State
  &__error {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: $semantic-spacing-component-xs;
    background: $semantic-color-surface-secondary;
    color: $semantic-color-danger;
    z-index: 2;
    padding: $semantic-spacing-component-sm;
    text-align: center;
  }
  
  &__error-icon {
    color: $semantic-color-text-secondary;
    
    svg {
      width: $semantic-sizing-icon-navigation;
      height: $semantic-sizing-icon-navigation;
    }
  }
  
  &__error-text {
    font-size: $semantic-typography-font-size-xs;
    color: $semantic-color-text-secondary;
    font-weight: $semantic-typography-font-weight-medium;
  }

  // Overlay
  &__overlay {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(0, 0, 0, 0.4);
    opacity: 0;
    transition: opacity $semantic-duration-fast $semantic-easing-standard;
    z-index: 3;
    
    .ui-image-container:hover & {
      opacity: 1;
    }
  }

  // Caption
  &__caption {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    background: linear-gradient(transparent, rgba(0, 0, 0, 0.7));
    color: white;
    padding: $semantic-spacing-component-md $semantic-spacing-component-sm $semantic-spacing-component-sm;
    font-size: $semantic-typography-font-size-sm;
    line-height: $semantic-typography-line-height-tight;
    z-index: 4;
  }

  // Dark Mode Support
  :host-context(.dark-theme) & {
    background: $semantic-color-surface-primary;
    border-color: $semantic-color-border-subtle;
    
    &__loading {
      background: $semantic-color-surface-primary;
    }
    
    &__spinner {
      border-color: $semantic-color-border-subtle;
      border-top-color: $semantic-color-interactive-primary;
    }
  }

  // Responsive Design
  @media (max-width: $semantic-sizing-breakpoint-tablet - 1) {
    &--size-xl {
      max-width: $semantic-sizing-card-width-lg;
    }
    
    &--size-lg {
      max-width: $semantic-sizing-card-width-md;
    }
  }
  
  @media (max-width: $semantic-sizing-breakpoint-mobile - 1) {
    // Mobile adjustments
    &__caption {
      font-size: $semantic-typography-font-size-xs;
      padding: $semantic-spacing-component-xs;
    }
    
    &__error-text {
      font-size: $semantic-typography-font-size-xs;
    }
  }

  // Accessibility - Reduced motion
  @media (prefers-reduced-motion: reduce) {
    transition: none;
    
    &__image {
      transition: none;
    }
    
    &__overlay {
      transition: none;
    }
    
    &--lazy:not(.ui-image-container--loaded) {
      animation: none;
    }
    
    &__spinner {
      animation: none;
    }
  }
}

// Animation Keyframes
@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

@keyframes pulse {
  0%, 100% {
    opacity: 1;
  }
  50% {
    opacity: 0.5;
  }
}

// Utility classes for content projection
.ui-image-container {
  [slot='error'] {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: $semantic-spacing-component-xs;
    padding: $semantic-spacing-component-sm;
    text-align: center;
    height: 100%;
    color: $semantic-color-danger;
  }
  
  [slot='overlay'] {
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
    font-weight: $semantic-typography-font-weight-medium;
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
  }
  
  [slot='caption'] {
    font-size: $semantic-typography-font-size-sm;
    line-height: $semantic-typography-line-height-tight;
  }
}[D:Xx;eujgqFbQjniF%Y TFMxMimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, OnInit, OnDestroy, inject } from '@angular/core';
import { CommonModule } from '@angular/common';

export type ImageContainerSize = 'sm' | 'md' | 'lg' | 'xl';
export type ImageContainerAspectRatio = '1/1' | '4/3' | '16/9' | '3/2' | '2/1' | '3/4' | '9/16';
export type ImageContainerObjectFit = 'contain' | 'cover' | 'fill' | 'scale-down' | 'none';
export type ImageContainerShape = 'square' | 'rounded' | 'circle';

@Component({
  selector: 'ui-image-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-image-container"
      [class]="getContainerClasses()"
      [class.ui-image-container--loading]="loading"
      [class.ui-image-container--error]="hasError"
      [class.ui-image-container--lazy]="lazy"
      [class.ui-image-container--loaded]="isLoaded"
      [style.--aspect-ratio]="aspectRatio"
      [attr.aria-label]="ariaLabel"
      (click)="handleClick($event)">
      
      @if (loading && !isLoaded) {
        <div class="ui-image-container__loading" aria-hidden="true">
          <div class="ui-image-container__spinner"></div>
        </div>
      }
      
      @if (hasError) {
        <div class="ui-image-container__error" role="img" [attr.aria-label]="errorAlt || 'Image failed to load'">
          <ng-content select="[slot='error']">
            <div class="ui-image-container__error-icon" aria-hidden="true">
              <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                <rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
                <circle cx="8.5" cy="8.5" r="1.5"/>
                <polyline points="21,15 16,10 5,21"/>
              </svg>
            </div>
            <span class="ui-image-container__error-text">Failed to load image</span>
          </ng-content>
        </div>
      } @else {
        <img 
          #imageElement
          class="ui-image-container__image"
          [class]="getImageClasses()"
          [src]="currentSrc"
          [alt]="alt || ''"
          [loading]="lazy ? 'lazy' : 'eager'"
          [style.object-fit]="objectFit"
          (load)="handleLoad($event)"
          (error)="handleError($event)"
          (loadstart)="handleLoadStart()"
          [attr.crossorigin]="crossorigin"
          [attr.referrerpolicy]="referrerPolicy"
          [attr.sizes]="sizes"
          [attr.srcset]="srcset">
      }

      @if (overlay) {
        <div class="ui-image-container__overlay">
          <ng-content select="[slot='overlay']"></ng-content>
        </div>
      }

      @if (caption) {
        <div class="ui-image-container__caption">
          <ng-content select="[slot='caption']">
            <span>{{ caption }}</span>
          </ng-content>
        </div>
      }
    </div>
  `,
  styleUrl: './image-container.component.scss'
})
export class ImageContainerComponent implements OnInit, OnDestroy {
  @Input() src!: string;
  @Input() alt = '';
  @Input() size: ImageContainerSize = 'md';
  @Input() aspectRatio: ImageContainerAspectRatio = '1/1';
  @Input() objectFit: ImageContainerObjectFit = 'cover';
  @Input() shape: ImageContainerShape = 'rounded';
  @Input() lazy = true;
  @Input() loading = false;
  @Input() placeholder?: string;
  @Input() caption?: string;
  @Input() overlay = false;
  @Input() ariaLabel?: string;
  @Input() errorAlt?: string;
  
  // Advanced image attributes
  @Input() srcset?: string;
  @Input() sizes?: string;
  @Input() crossorigin?: 'anonymous' | 'use-credentials';
  @Input() referrerPolicy?: 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url';

  @Output() imageLoaded = new EventEmitter<Event>();
  @Output() imageError = new EventEmitter<Event>();
  @Output() imageClick = new EventEmitter<MouseEvent>();
  @Output() loadingChange = new EventEmitter<boolean>();

  private elementRef = inject(ElementRef);
  private intersectionObserver?: IntersectionObserver;
  
  hasError = false;
  isLoaded = false;
  currentSrc = '';

  ngOnInit(): void {
    this.initializeImage();
    if (this.lazy && this.supportsIntersectionObserver()) {
      this.setupLazyLoading();
    } else {
      this.loadImage();
    }
  }

  ngOnDestroy(): void {
    if (this.intersectionObserver) {
      this.intersectionObserver.disconnect();
    }
  }

  private initializeImage(): void {
    this.currentSrc = this.placeholder || this.src;
    this.hasError = false;
    this.isLoaded = false;
  }

  private setupLazyLoading(): void {
    if (!this.supportsIntersectionObserver()) {
      this.loadImage();
      return;
    }

    this.intersectionObserver = new IntersectionObserver(
      (entries) => {
        entries.forEach((entry) => {
          if (entry.isIntersecting) {
            this.loadImage();
            this.intersectionObserver?.unobserve(entry.target);
          }
        });
      },
      {
        rootMargin: '50px 0px',
        threshold: 0.01
      }
    );

    this.intersectionObserver.observe(this.elementRef.nativeElement);
  }

  private loadImage(): void {
    if (this.src && !this.isLoaded && !this.hasError) {
      this.currentSrc = this.src;
      this.loading = true;
      this.loadingChange.emit(true);
    }
  }

  private supportsIntersectionObserver(): boolean {
    return 'IntersectionObserver' in window;
  }

  handleLoadStart(): void {
    this.loading = true;
    this.loadingChange.emit(true);
  }

  handleLoad(event: Event): void {
    this.loading = false;
    this.isLoaded = true;
    this.hasError = false;
    this.loadingChange.emit(false);
    this.imageLoaded.emit(event);
  }

  handleError(event: Event): void {
    this.loading = false;
    this.hasError = true;
    this.isLoaded = false;
    this.loadingChange.emit(false);
    this.imageError.emit(event);
  }

  handleClick(event: MouseEvent): void {
    if (!this.hasError) {
      this.imageClick.emit(event);
    }
  }

  // Method to retry loading failed images
  retryLoad(): void {
    this.hasError = false;
    this.isLoaded = false;
    this.loadImage();
  }

  getContainerClasses(): string {
    const aspectClass = `ui-image-container--aspect-${this.aspectRatio.replace('/', '-')}`;
    const sizeClass = `ui-image-container--size-${this.size}`;
    const shapeClass = `ui-image-container--shape-${this.shape}`;
    
    return `ui-image-container ${sizeClass} ${aspectClass} ${shapeClass}`;
  }

  getImageClasses(): string {
    const fitClass = `ui-image-container__image--fit-${this.objectFit}`;
    return `ui-image-container__image ${fitClass}`;
  }
}F@^&x, export * from './image-container.component';['xuQAN@
*Uy@oH;NjYG^w N@J{=zE0Lٵhdɛ#+Gr*\ȳGɆ<YeT*2(-\H2?)261%j*bܶQ`\)oQQ1	`|Iq@}iL`ǐ8'tv*c_kv5Lp#|Ae׬|o=ijix
 ȭ<kxreC!Inxry섉''a	 1x" divider0_3tooltippIxR nFOdSyI ;\oݿJL@A@ᜑV 5NSkQ[2+x5# List Components

Comprehensive list component system built with Angular 19+ and semantic design tokens. Features multiple variants, sizes, and interactive states for maximum flexibility.

## Components

### `ListItemComponent`
Individual list item with support for avatars, media, icons, and multiple text lines.

### `ListContainerComponent` 
Container for list items with elevation, spacing, and scrolling capabilities.

### `ListExamplesComponent`
Demonstration component showcasing all variants and usage patterns.

## Features

- **Multiple Sizes**: `sm`, `md`, `lg`
- **Line Variants**: One, two, or three lines of text
- **Content Types**: Text-only, avatar, media, icon
- **Interactive States**: Hover, focus, selected, disabled
- **Container Options**: Elevation, spacing, scrolling, rounded corners
- **Text Overflow**: Automatic ellipsis handling
- **Accessibility**: Full ARIA support and keyboard navigation
- **Responsive**: Mobile-first design with breakpoint adjustments

## Usage

### Basic Text List

```typescript
import { ListItemComponent, ListContainerComponent } from './shared/components';

// In your component:
items = [
  { primary: 'Inbox' },
  { primary: 'Starred' },
  { primary: 'Sent' }
];
```

```html
<ui-list-container elevation="sm" spacing="xs" rounded>
  @for (item of items; track item.primary) {
    <ui-list-item 
      [data]="item"
      size="md"
      lines="one"
      variant="text"
    />
  }
</ui-list-container>
```

### Avatar List with Two Lines

```typescript
avatarItems = [
  {
    primary: 'John Doe',
    secondary: 'Software Engineer',
    avatarSrc: 'https://example.com/avatar.jpg',
    avatarAlt: 'John Doe'
  }
];
```

```html
<ui-list-container elevation="md" spacing="sm">
  @for (item of avatarItems; track item.primary) {
    <ui-list-item 
      [data]="item"
      size="lg"
      lines="two"
      variant="avatar"
    >
      <button slot="trailing" class="action-btn">
        <i class="fas fa-more-vert"></i>
      </button>
    </ui-list-item>
  }
</ui-list-container>
```

### Media List with Three Lines

```typescript
mediaItems = [
  {
    primary: 'Angular Course',
    secondary: 'Complete guide to modern development',
    tertiary: 'Duration: 2h 30m • Updated: Today',
    mediaSrc: 'https://example.com/thumb.jpg',
    mediaAlt: 'Course thumbnail'
  }
];
```

```html
<ui-list-container elevation="lg" spacing="md" rounded>
  @for (item of mediaItems; track item.primary) {
    <ui-list-item 
      [data]="item"
      size="lg"
      lines="three"
      variant="media"
    >
      <div slot="trailing" class="rating">
        <i class="fas fa-star"></i>
        <span>4.8</span>
      </div>
    </ui-list-item>
  }
</ui-list-container>
```

### Scrollable List

```html
<ui-list-container 
  elevation="md"
  spacing="xs"
  [scrollable]="true"
  maxHeight="400px"
  [fadeIndicator]="true"
  rounded
>
  @for (item of longList; track item.id) {
    <ui-list-item [data]="item" size="md" lines="two" variant="avatar" />
  }
</ui-list-container>
```

## API

### ListItemComponent Props

| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `data` | `ListItemData` | required | Item content and configuration |
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Item height and spacing |
| `lines` | `'one' \| 'two' \| 'three'` | `'one'` | Number of text lines |
| `variant` | `'text' \| 'avatar' \| 'media'` | `'text'` | Content type |
| `interactive` | `boolean` | `true` | Enable hover/focus states |
| `divider` | `boolean` | `false` | Show bottom border |

### ListContainerComponent Props

| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `elevation` | `'none' \| 'sm' \| 'md' \| 'lg'` | `'none'` | Shadow elevation |
| `spacing` | `'none' \| 'xs' \| 'sm' \| 'md' \| 'lg'` | `'sm'` | Item spacing |
| `scrollable` | `boolean` | `false` | Enable vertical scrolling |
| `maxHeight` | `string?` | - | Maximum container height |
| `fadeIndicator` | `boolean` | `true` | Show fade at scroll bottom |
| `dense` | `boolean` | `false` | Reduce spacing between items |
| `rounded` | `boolean` | `false` | Round container corners |
| `ariaLabel` | `string?` | - | Accessibility label |

### ListItemData Interface

```typescript
interface ListItemData {
  primary: string;           // Main text (required)
  secondary?: string;        // Secondary text
  tertiary?: string;         // Tertiary text (three-line only)
  avatarSrc?: string;        // Avatar image URL
  avatarAlt?: string;        // Avatar alt text
  mediaSrc?: string;         // Media image URL
  mediaAlt?: string;         // Media alt text
  icon?: string;             // Icon class name
  disabled?: boolean;        // Disabled state
  selected?: boolean;        // Selected state
}
```

## Slots

### Trailing Content
Use the `slot="trailing"` attribute to add content to the right side of list items:

```html
<ui-list-item [data]="item">
  <button slot="trailing">Action</button>
</ui-list-item>
```

## Design Tokens

The components use semantic design tokens for consistent styling:

- **Colors**: `$semantic-color-*`
- **Spacing**: `$semantic-spacing-*`
- **Shadows**: `$semantic-shadow-*`
- **Borders**: `$semantic-border-radius-*`

## Accessibility

- Full ARIA support with proper roles and labels
- Keyboard navigation support
- Focus management and indicators
- Screen reader friendly
- High contrast mode support
- Reduced motion support

## Responsive Design

- Mobile-first approach
- Breakpoint-specific adjustments
- Touch-friendly tap targets
- Optimized spacing for different screen sizes

## Examples

Import and use the `ListExamplesComponent` to see all variants in action:

```typescript
import { ListExamplesComponent } from './shared/components';
```

```html
<ui-list-examples></ui-list-examples>
```|&/x// ==========================================================================
// LIST COMPONENTS
// ==========================================================================
// Comprehensive list component system with multiple variants and sizes
// Built with Angular 19+ and semantic design tokens
// ==========================================================================

export * from './list-item.component';
export * from './list-container.component';
export * from './list-examples.component';

// Re-export types for convenience
export type {
  ListItemSize,
  ListItemLines,
  ListItemVariant,
  ListItemData
} from './list-item.component';

export type {
  ListContainerElevation,
  ListContainerSpacing
} from './list-container.component';Qx%@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// LIST CONTAINER COMPONENT
// ==========================================================================
// Container component for list items with elevation, spacing, and scrolling
// Provides consistent layout and styling using semantic design tokens
// ==========================================================================

.list-container {
  display: flex;
  flex-direction: column;
  width: 100%;
  box-sizing: border-box;
  background-color: $semantic-color-surface-primary;
  position: relative;
  overflow: hidden;

  // ==========================================================================
  // ELEVATION VARIANTS
  // ==========================================================================
  
  &--elevation-none {
    box-shadow: none;
  }
  
  &--elevation-sm {
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &--elevation-md {
    box-shadow: $semantic-shadow-elevation-3;
  }
  
  &--elevation-lg {
    box-shadow: $semantic-shadow-elevation-4;
  }

  // ==========================================================================
  // SPACING VARIANTS
  // ==========================================================================
  
  &--spacing-none {
    padding: 0;
    
    .list-item:not(:last-child) {
      margin-bottom: 0;
    }
  }
  
  &--spacing-xs {
    padding: $semantic-spacing-component-xs 0;
    
    .list-item:not(:last-child) {
      margin-bottom: $semantic-spacing-component-xs;
    }
  }
  
  &--spacing-sm {
    padding: $semantic-spacing-component-sm 0;
    
    .list-item:not(:last-child) {
      margin-bottom: $semantic-spacing-component-sm;
    }
  }
  
  &--spacing-md {
    padding: $semantic-spacing-component-md 0;
    
    .list-item:not(:last-child) {
      margin-bottom: $semantic-spacing-component-md;
    }
  }
  
  &--spacing-lg {
    padding: $semantic-spacing-component-lg 0;
    
    .list-item:not(:last-child) {
      margin-bottom: $semantic-spacing-component-lg;
    }
  }

  // ==========================================================================
  // LAYOUT MODIFIERS
  // ==========================================================================
  
  &--scrollable {
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    
    // Custom scrollbar styling
    &::-webkit-scrollbar {
      width: 6px;
    }
    
    &::-webkit-scrollbar-track {
      background: $semantic-color-surface-secondary;
      border-radius: 3px;
    }
    
    &::-webkit-scrollbar-thumb {
      background: $semantic-color-border-primary;
      border-radius: 3px;
      
      &:hover {
        background: $semantic-color-border-secondary;
      }
    }
    
    // Firefox scrollbar
    scrollbar-width: thin;
    scrollbar-color: $semantic-color-border-primary $semantic-color-surface-secondary;
  }
  
  &--max-height {
    height: var(--list-max-height);
    max-height: var(--list-max-height);
  }
  
  &--dense {
    &.list-container--spacing-xs .list-item:not(:last-child) {
      margin-bottom: $semantic-spacing-micro-tight;
    }
    
    &.list-container--spacing-sm .list-item:not(:last-child) {
      margin-bottom: $semantic-spacing-component-xs;
    }
    
    &.list-container--spacing-md .list-item:not(:last-child) {
      margin-bottom: $semantic-spacing-component-sm;
    }
    
    &.list-container--spacing-lg .list-item:not(:last-child) {
      margin-bottom: $semantic-spacing-component-md;
    }
  }
  
  &--rounded {
    border-radius: $semantic-border-radius-md;
    overflow: hidden;
    
    .list-item:first-child {
      border-top-left-radius: $semantic-border-radius-md;
      border-top-right-radius: $semantic-border-radius-md;
    }
    
    .list-item:last-child {
      border-bottom-left-radius: $semantic-border-radius-md;
      border-bottom-right-radius: $semantic-border-radius-md;
    }
  }
}

// ==========================================================================
// FADE INDICATOR
// ==========================================================================

.list-container__fade-bottom {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 24px;
  background: linear-gradient(
    to bottom,
    transparent 0%,
    $semantic-color-surface-primary 100%
  );
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.2s ease-in-out;
  
  .list-container--scrollable:not(.list-container--at-bottom) & {
    opacity: 1;
  }
}

// ==========================================================================
// DYNAMIC HEIGHT SETUP
// ==========================================================================

// JavaScript will set this CSS custom property
.list-container--max-height {
  --list-max-height: 400px;
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .list-container {
    &--spacing-md {
      padding: $semantic-spacing-component-sm 0;
      
      .list-item:not(:last-child) {
        margin-bottom: $semantic-spacing-component-sm;
      }
    }
    
    &--spacing-lg {
      padding: $semantic-spacing-component-md 0;
      
      .list-item:not(:last-child) {
        margin-bottom: $semantic-spacing-component-md;
      }
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

.list-container {
  &:focus-within {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 2px;
  }
}

// ==========================================================================
// ANIMATION UTILITIES
// ==========================================================================

.list-container {
  // Smooth height transitions when content changes
  transition: height 0.2s ease-in-out;
}

// List item enter/leave animations
@keyframes list-item-enter {
  from {
    opacity: 0;
    transform: translateY(-8px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes list-item-leave {
  from {
    opacity: 1;
    transform: translateY(0);
  }
  to {
    opacity: 0;
    transform: translateY(-8px);
  }
}

// Add these classes via JavaScript for dynamic content
.list-item-enter {
  animation: list-item-enter 0.2s ease-out;
}

.list-item-leave {
  animation: list-item-leave 0.2s ease-out;
}~nhxe|xgqFbQjniFM VdxFimport { Component, Input, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';

export type ListContainerElevation = 'none' | 'sm' | 'md' | 'lg';
export type ListContainerSpacing = 'none' | 'xs' | 'sm' | 'md' | 'lg';

@Component({
  selector: 'ui-list-container',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule],
  template: `
    <div 
      class="list-container"
      [class]="getContainerClasses()"
      role="list"
      [attr.aria-label]="ariaLabel"
    >
      <ng-content></ng-content>
      
      <!-- Fade indicator for scrollable content -->
      @if (scrollable && fadeIndicator) {
        <div class="list-container__fade-bottom"></div>
      }
    </div>
  `,
  styleUrls: ['./list-container.component.scss']
})
export class ListContainerComponent {
  @Input() elevation: ListContainerElevation = 'none';
  @Input() spacing: ListContainerSpacing = 'sm';
  @Input() scrollable = false;
  @Input() maxHeight?: string;
  @Input() fadeIndicator = true;
  @Input() dense = false;
  @Input() rounded = false;
  @Input() ariaLabel?: string;

  getContainerClasses(): string {
    const classes = [
      `list-container--elevation-${this.elevation}`,
      `list-container--spacing-${this.spacing}`
    ];

    if (this.scrollable) classes.push('list-container--scrollable');
    if (this.dense) classes.push('list-container--dense');
    if (this.rounded) classes.push('list-container--rounded');
    if (this.maxHeight) classes.push('list-container--max-height');

    return classes.join(' ');
  }
}PSxkOutput, EventEmitteroMenu>MenuUmenu'menu>menu*orientation]="orientation%,menu,MenuH+MenuContainerElevation = 'smMenuContainerSpacing = 'xsLrounded.3orientation: 'vertical' | 'horizontal' = 'vertical'Xamenu1menu$+,
      `menu-container--${this.orientation2menuJ<menu9menu=menu>B}Uxb@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// LIST EXAMPLES COMPONENT
// ==========================================================================
// Demonstration component showcasing all list variants and capabilities
// ==========================================================================

.list-examples {
  padding: $semantic-spacing-component-xl;
  max-width: 1200px;
  margin: 0 auto;
  
  h2 {
    font-size: 2rem;
    font-weight: 600;
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-layout-lg;
    text-align: center;
  }
}

.example-section {
  margin-bottom: $semantic-spacing-layout-xl;
  
  h3 {
    font-size: 1.5rem;
    font-weight: 500;
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-xl;
    padding-bottom: $semantic-spacing-component-sm;
    border-bottom: 2px solid $semantic-color-border-secondary;
  }
}

.example-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: $semantic-spacing-component-xl;
  margin-bottom: $semantic-spacing-layout-md;
}

.example-item {
  h4 {
    font-size: 1rem;
    font-weight: 500;
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-component-md;
    text-align: center;
  }
}

.example-single {
  max-width: 600px;
  margin: 0 auto;
}

// ==========================================================================
// TRAILING SLOT COMPONENTS
// ==========================================================================

.action-button {
  background: none;
  border: none;
  color: $semantic-color-text-tertiary;
  cursor: pointer;
  padding: $semantic-spacing-component-xs;
  border-radius: $semantic-border-radius-sm;
  transition: all 0.15s ease-in-out;
  
  &:hover {
    background-color: $semantic-color-surface-interactive;
    color: $semantic-color-text-secondary;
  }
  
  &:focus {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 2px;
  }
  
  i {
    font-size: 14px;
  }
}

.timestamp {
  font-size: 0.75rem;
  color: $semantic-color-text-tertiary;
  font-weight: 400;
}

.play-button {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background-color: $semantic-color-interactive-primary;
  color: $semantic-color-on-brand-primary;
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all 0.15s ease-in-out;
  
  &:hover {
    transform: scale(1.05);
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &:focus {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 2px;
  }
  
  i {
    font-size: 12px;
    margin-left: 2px; // Optical alignment for play icon
  }
}

.rating {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-micro-tight;
  color: $semantic-color-warning;
  font-size: 0.875rem;
  font-weight: 500;
  
  i {
    font-size: 14px;
  }
}

.select-button {
  background-color: $semantic-color-interactive-primary;
  color: $semantic-color-on-brand-primary;
  border: none;
  padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  border-radius: $semantic-border-radius-sm;
  font-size: 0.875rem;
  font-weight: 500;
  cursor: pointer;
  transition: all 0.15s ease-in-out;
  
  &:hover {
    background-color: $semantic-color-interactive-secondary;
  }
  
  &:focus {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 2px;
  }
}

.text-success {
  color: $semantic-color-success;
}

// ==========================================================================
// RESPONSIVE DESIGN
// ==========================================================================

@media (max-width: 768px) {
  .list-examples {
    padding: $semantic-spacing-component-lg;
    
    h2 {
      font-size: 1.5rem;
    }
  }
  
  .example-grid {
    grid-template-columns: 1fr;
    gap: $semantic-spacing-component-lg;
  }
  
  .example-section {
    margin-bottom: $semantic-spacing-layout-md;
    
    h3 {
      font-size: 1.25rem;
    }
  }
}

@media (max-width: 480px) {
  .list-examples {
    padding: $semantic-spacing-component-md;
  }
  
  .example-grid {
    gap: $semantic-spacing-component-md;
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

// Focus indicators for better keyboard navigation
.list-examples {
  button:focus,
  .action-button:focus,
  .play-button:focus,
  .select-button:focus {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 2px;
    border-radius: $semantic-border-radius-sm;
  }
}

// High contrast mode support
@media (prefers-contrast: high) {
  .action-button,
  .play-button,
  .select-button {
    border: 1px solid $semantic-color-border-primary;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .action-button,
  .play-button,
  .select-button {
    transition: none;
  }
  
  .play-button:hover {
    transform: none;
  }
}cx.import { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ListItemComponent, ListItemData } from './list-item.component';
import { ListContainerComponent } from './list-container.component';

@Component({
  selector: 'ui-list-examples',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, ListItemComponent, ListContainerComponent],
  template: `
    <div class="list-examples">
      <h2>List Component Examples</h2>
      
      <!-- Basic Text Lists -->
      <section class="example-section">
        <h3>Text Lists - Different Sizes</h3>
        
        <div class="example-grid">
          <div class="example-item">
            <h4>Small (sm)</h4>
            <ui-list-container elevation="sm" spacing="xs" [rounded]="true">
              @for (item of basicTextItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="sm"
                  lines="one"
                  variant="text"
                  [divider]="true"
                />
              }
            </ui-list-container>
          </div>
          
          <div class="example-item">
            <h4>Medium (md)</h4>
            <ui-list-container elevation="sm" spacing="xs" [rounded]="true">
              @for (item of basicTextItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="md"
                  lines="one"
                  variant="text"
                  [divider]="true"
                />
              }
            </ui-list-container>
          </div>
          
          <div class="example-item">
            <h4>Large (lg)</h4>
            <ui-list-container elevation="sm" spacing="xs" [rounded]="true">
              @for (item of basicTextItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="one"
                  variant="text"
                  [divider]="true"
                />
              }
            </ui-list-container>
          </div>
        </div>
      </section>

      <!-- Multi-line Lists -->
      <section class="example-section">
        <h3>Multi-line Text Lists</h3>
        
        <div class="example-grid">
          <div class="example-item">
            <h4>Two Lines</h4>
            <ui-list-container elevation="md" spacing="sm" [rounded]="true">
              @for (item of twoLineItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="md"
                  lines="two"
                  variant="text"
                />
              }
            </ui-list-container>
          </div>
          
          <div class="example-item">
            <h4>Three Lines</h4>
            <ui-list-container elevation="md" spacing="sm" [rounded]="true">
              @for (item of threeLineItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="three"
                  variant="text"
                />
              }
            </ui-list-container>
          </div>
        </div>
      </section>

      <!-- Avatar Lists -->
      <section class="example-section">
        <h3>Lists with Avatars</h3>
        
        <div class="example-grid">
          <div class="example-item">
            <h4>Avatar + One Line</h4>
            <ui-list-container elevation="sm" spacing="xs" [rounded]="true">
              @for (item of avatarItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="md"
                  lines="one"
                  variant="avatar"
                >
                  <button slot="trailing" class="action-button">
                    <i class="fas fa-ellipsis-v"></i>
                  </button>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
          
          <div class="example-item">
            <h4>Avatar + Two Lines</h4>
            <ui-list-container elevation="sm" spacing="xs" [rounded]="true">
              @for (item of avatarTwoLineItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="two"
                  variant="avatar"
                >
                  <span slot="trailing" class="timestamp">2h</span>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
        </div>
      </section>

      <!-- Media Lists -->
      <section class="example-section">
        <h3>Lists with Media</h3>
        
        <div class="example-grid">
          <div class="example-item">
            <h4>Media + Two Lines</h4>
            <ui-list-container elevation="md" spacing="sm" [rounded]="true">
              @for (item of mediaItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="two"
                  variant="media"
                >
                  <button slot="trailing" class="play-button">
                    <i class="fas fa-play"></i>
                  </button>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
          
          <div class="example-item">
            <h4>Media + Three Lines</h4>
            <ui-list-container elevation="md" spacing="sm" [rounded]="true">
              @for (item of mediaThreeLineItems; track item.primary) {
                <ui-list-item 
                  [data]="item"
                  size="lg"
                  lines="three"
                  variant="media"
                >
                  <div slot="trailing" class="rating">
                    <i class="fas fa-star"></i>
                    <span>4.8</span>
                  </div>
                </ui-list-item>
              }
            </ui-list-container>
          </div>
        </div>
      </section>

      <!-- Scrollable List -->
      <section class="example-section">
        <h3>Scrollable List</h3>
        
        <div class="example-single">
          <ui-list-container 
            elevation="lg" 
            spacing="xs" 
            [scrollable]="true"
            maxHeight="300px"
            [rounded]="true"
          >
            @for (item of longList; track item.primary) {
              <ui-list-item 
                [data]="item"
                size="md"
                lines="two"
                variant="avatar"
                [divider]="true"
              >
                @if (item.selected) {
                  <i slot="trailing" class="fas fa-check text-success"></i>
                }
              </ui-list-item>
            }
          </ui-list-container>
        </div>
      </section>

      <!-- Interactive States -->
      <section class="example-section">
        <h3>Interactive States</h3>
        
        <div class="example-single">
          <ui-list-container elevation="sm" spacing="sm" [rounded]="true">
            @for (item of interactiveItems; track item.primary) {
              <ui-list-item 
                [data]="item"
                size="md"
                lines="two"
                variant="avatar"
              >
                @if (item.selected) {
                  <i slot="trailing" class="fas fa-check text-success"></i>
                } @else {
                  <button slot="trailing" class="select-button">Select</button>
                }
              </ui-list-item>
            }
          </ui-list-container>
        </div>
      </section>
    </div>
  `,
  styleUrls: ['./list-examples.component.scss']
})
export class ListExamplesComponent {
  basicTextItems: ListItemData[] = [
    { primary: 'Inbox' },
    { primary: 'Starred' },
    { primary: 'Sent' },
    { primary: 'Drafts' },
    { primary: 'Archive' }
  ];

  twoLineItems: ListItemData[] = [
    {
      primary: 'Meeting with Design Team',
      secondary: 'Discuss new component library architecture and implementation'
    },
    {
      primary: 'Code Review - Authentication',
      secondary: 'Review pull request #247 for OAuth integration updates'
    },
    {
      primary: 'Performance Optimization',
      secondary: 'Analyze bundle size and implement lazy loading strategies'
    }
  ];

  threeLineItems: ListItemData[] = [
    {
      primary: 'Angular 19 Migration',
      secondary: 'Upgrade project to latest Angular version with new control flow',
      tertiary: 'Estimated completion: Next Sprint'
    },
    {
      primary: 'Design System Documentation',
      secondary: 'Create comprehensive documentation for all components',
      tertiary: 'Priority: High - Needed for team onboarding'
    }
  ];

  avatarItems: ListItemData[] = [
    {
      primary: 'John Doe',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=john',
      avatarAlt: 'John Doe avatar'
    },
    {
      primary: 'Jane Smith',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=jane',
      avatarAlt: 'Jane Smith avatar'
    },
    {
      primary: 'Mike Johnson',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=mike',
      avatarAlt: 'Mike Johnson avatar'
    }
  ];

  avatarTwoLineItems: ListItemData[] = [
    {
      primary: 'Sarah Wilson',
      secondary: 'Hey! How\'s the new component library coming along?',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=sarah',
      avatarAlt: 'Sarah Wilson avatar'
    },
    {
      primary: 'Alex Chen',
      secondary: 'The design tokens look great. Ready for review.',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=alex',
      avatarAlt: 'Alex Chen avatar'
    }
  ];

  mediaItems: ListItemData[] = [
    {
      primary: 'Angular Fundamentals',
      secondary: 'Complete guide to modern Angular development',
      mediaSrc: 'https://picsum.photos/80/80?random=1',
      mediaAlt: 'Angular course thumbnail'
    },
    {
      primary: 'TypeScript Deep Dive',
      secondary: 'Advanced TypeScript patterns and best practices',
      mediaSrc: 'https://picsum.photos/80/80?random=2',
      mediaAlt: 'TypeScript course thumbnail'
    }
  ];

  mediaThreeLineItems: ListItemData[] = [
    {
      primary: 'Design Systems at Scale',
      secondary: 'Building maintainable design systems for large organizations',
      tertiary: 'Duration: 2h 30m • Updated: Today',
      mediaSrc: 'https://picsum.photos/80/80?random=3',
      mediaAlt: 'Design systems course'
    },
    {
      primary: 'Component Architecture',
      secondary: 'Scalable component patterns in modern web applications',
      tertiary: 'Duration: 1h 45m • Updated: Yesterday',
      mediaSrc: 'https://picsum.photos/80/80?random=4',
      mediaAlt: 'Component architecture course'
    }
  ];

  longList: ListItemData[] = Array.from({ length: 20 }, (_, i) => ({
    primary: `Contact ${i + 1}`,
    secondary: `contact${i + 1}@example.com`,
    avatarSrc: `https://api.dicebear.com/7.x/avataaars/svg?seed=contact${i}`,
    avatarAlt: `Contact ${i + 1} avatar`,
    selected: i === 3 || i === 7 || i === 12
  }));

  interactiveItems: ListItemData[] = [
    {
      primary: 'Enable Notifications',
      secondary: 'Get notified about important updates',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=notify',
      selected: false
    },
    {
      primary: 'Dark Mode',
      secondary: 'Switch to dark theme',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=dark',
      selected: true
    },
    {
      primary: 'Auto-save',
      secondary: 'Automatically save your work',
      avatarSrc: 'https://api.dicebear.com/7.x/avataaars/svg?seed=save',
      selected: false,
      disabled: true
    }
  ];
}*>ҳx3@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// LIST ITEM COMPONENT
// ==========================================================================
// Comprehensive list item component with multiple variants and sizes
// Uses semantic design tokens for consistent styling across the design system
// ==========================================================================

.list-item {
  display: flex;
  align-items: stretch;
  width: 100%;
  box-sizing: border-box;
  position: relative;
  user-select: none;
  background-color: $semantic-color-surface-primary;
  color: $semantic-color-text-primary;
  
  // Interactive states
  &--interactive {
    cursor: pointer;
    transition: background-color 0.15s ease-in-out;
    
    &:hover:not(.list-item--disabled) {
      background-color: $semantic-color-surface-interactive;
    }
    
    &:focus-within:not(.list-item--disabled) {
      outline: 2px solid $semantic-color-border-focus;
      outline-offset: -2px;
    }
  }
  
  // States
  &--selected {
    background-color: $semantic-color-container-primary;
    color: $semantic-color-on-container-primary;
  }
  
  &--disabled {
    opacity: 0.6;
    cursor: not-allowed;
    color: $semantic-color-text-disabled;
  }
  
  &--divider {
    border-bottom: 1px solid $semantic-color-border-secondary;
  }

  // ==========================================================================
  // SIZE VARIANTS
  // ==========================================================================
  
  &--sm {
    min-height: 40px;
    
    &.list-item--one-line { height: 40px; }
    &.list-item--two-line { min-height: 56px; }
    &.list-item--three-line { min-height: 72px; }
  }
  
  &--md {
    min-height: 48px;
    
    &.list-item--one-line { height: 48px; }
    &.list-item--two-line { min-height: 64px; }
    &.list-item--three-line { min-height: 80px; }
  }
  
  &--lg {
    min-height: 56px;
    
    &.list-item--one-line { height: 56px; }
    &.list-item--two-line { min-height: 72px; }
    &.list-item--three-line { min-height: 88px; }
  }
}

// ==========================================================================
// LAYOUT ELEMENTS
// ==========================================================================

.list-item__avatar,
.list-item__media,
.list-item__icon {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}

.list-item__avatar {
  .list-item--sm & {
    width: 32px;
    padding: $semantic-spacing-component-sm;
  }
  
  .list-item--md & {
    width: 40px;
    padding: $semantic-spacing-component-md;
  }
  
  .list-item--lg & {
    width: 48px;
    padding: $semantic-spacing-component-lg;
  }
}

.list-item__avatar-image {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  object-fit: cover;
  
  .list-item--sm & {
    width: 24px;
    height: 24px;
  }
  
  .list-item--md & {
    width: 32px;
    height: 32px;
  }
  
  .list-item--lg & {
    width: 40px;
    height: 40px;
  }
}

.list-item__media {
  .list-item--sm & {
    width: 48px;
    padding: $semantic-spacing-component-sm;
  }
  
  .list-item--md & {
    width: 56px;
    padding: $semantic-spacing-component-md;
  }
  
  .list-item--lg & {
    width: 64px;
    padding: $semantic-spacing-component-lg;
  }
}

.list-item__media-image {
  width: 100%;
  height: auto;
  border-radius: $semantic-border-radius-sm;
  object-fit: cover;
  
  .list-item--sm & {
    width: 40px;
    height: 40px;
  }
  
  .list-item--md & {
    width: 48px;
    height: 48px;
  }
  
  .list-item--lg & {
    width: 56px;
    height: 56px;
  }
}

.list-item__icon {
  .list-item--sm & {
    width: 32px;
    padding: $semantic-spacing-component-sm;
  }
  
  .list-item--md & {
    width: 40px;
    padding: $semantic-spacing-component-md;
  }
  
  .list-item--lg & {
    width: 48px;
    padding: $semantic-spacing-component-lg;
  }
  
  i {
    color: $semantic-color-text-secondary;
    
    .list-item--sm & { font-size: 16px; }
    .list-item--md & { font-size: 20px; }
    .list-item--lg & { font-size: 24px; }
  }
}

.list-item__content {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
  gap: $semantic-spacing-micro-tight;
  
  .list-item--sm & {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  }
  
  .list-item--lg & {
    padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
  }
}

.list-item__primary {
  font-size: 1rem;
  font-weight: 500;
  line-height: 1.25;
  color: inherit;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  
  .list-item--sm & {
    font-size: 0.875rem;
  }
  
  .list-item--lg & {
    font-size: 1.125rem;
  }
}

.list-item__secondary {
  font-size: 0.875rem;
  font-weight: 400;
  line-height: 1.25;
  color: $semantic-color-text-secondary;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  
  .list-item--sm & {
    font-size: 0.75rem;
  }
  
  .list-item--lg & {
    font-size: 1rem;
  }
}

.list-item__tertiary {
  font-size: 0.75rem;
  font-weight: 400;
  line-height: 1.25;
  color: $semantic-color-text-tertiary;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  
  .list-item--sm & {
    font-size: 0.6875rem;
  }
  
  .list-item--lg & {
    font-size: 0.875rem;
  }
}

.list-item__trailing {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  padding-right: $semantic-spacing-component-md;
  
  .list-item--sm & {
    padding-right: $semantic-spacing-component-sm;
  }
  
  .list-item--lg & {
    padding-right: $semantic-spacing-component-lg;
  }
  
  &:empty {
    display: none;
  }
}

// ==========================================================================
// LINE VARIANTS - Content layout adjustments
// ==========================================================================

.list-item--one-line {
  .list-item__content {
    justify-content: center;
  }
}

.list-item--two-line {
  .list-item__content {
    justify-content: center;
    gap: $semantic-spacing-micro-tight;
  }
}

.list-item--three-line {
  .list-item__content {
    justify-content: flex-start;
    padding-top: $semantic-spacing-component-sm;
    padding-bottom: $semantic-spacing-component-sm;
    gap: $semantic-spacing-micro-tight;
    
    .list-item--sm & {
      padding-top: $semantic-spacing-component-xs;
      padding-bottom: $semantic-spacing-component-xs;
    }
    
    .list-item--lg & {
      padding-top: $semantic-spacing-component-md;
      padding-bottom: $semantic-spacing-component-md;
    }
  }
}

// ==========================================================================
// VARIANT SPECIFIC STYLES
// ==========================================================================

.list-item--avatar {
  .list-item__content {
    padding-left: $semantic-spacing-component-xs;
  }
}

.list-item--media {
  .list-item__content {
    padding-left: $semantic-spacing-component-xs;
  }
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .list-item {
    &--lg {
      min-height: 48px;
      
      &.list-item--one-line { height: 48px; }
      &.list-item--two-line { min-height: 64px; }
      &.list-item--three-line { min-height: 80px; }
    }
  }
  
  .list-item__content {
    padding-left: $semantic-spacing-component-sm;
    padding-right: $semantic-spacing-component-sm;
  }
})AxlfgqFbQjniFn9 Px-import { Component, Input, ChangeDetectionStrategy, inject } from '@angular/core';
import { CommonModule } from '@angular/common';

export type ListItemSize = 'sm' | 'md' | 'lg';
export type ListItemLines = 'one' | 'two' | 'three';
export type ListItemVariant = 'text' | 'avatar' | 'media';

export interface ListItemData {
  primary: string;
  secondary?: string;
  tertiary?: string;
  avatarSrc?: string;
  avatarAlt?: string;
  mediaSrc?: string;
  mediaAlt?: string;
  icon?: string;
  disabled?: boolean;
  selected?: boolean;
}

@Component({
  selector: 'ui-list-item',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule],
  template: `
    <div 
      class="list-item"
      [class]="getItemClasses()"
      [attr.aria-disabled]="data.disabled"
      [attr.aria-selected]="data.selected"
      role="listitem"
    >
      <!-- Leading content -->
      @if (variant === 'avatar' && data.avatarSrc) {
        <div class="list-item__avatar">
          <img 
            [src]="data.avatarSrc" 
            [alt]="data.avatarAlt || ''"
            class="list-item__avatar-image"
          />
        </div>
      }
      
      @if (variant === 'media' && data.mediaSrc) {
        <div class="list-item__media">
          <img 
            [src]="data.mediaSrc" 
            [alt]="data.mediaAlt || ''"
            class="list-item__media-image"
          />
        </div>
      }
      
      @if (data.icon) {
        <div class="list-item__icon">
          <i [class]="data.icon"></i>
        </div>
      }

      <!-- Content area -->
      <div class="list-item__content">
        @if (lines === 'one') {
          <div class="list-item__primary">{{ data.primary }}</div>
        }
        
        @if (lines === 'two') {
          <div class="list-item__primary">{{ data.primary }}</div>
          <div class="list-item__secondary">{{ data.secondary }}</div>
        }
        
        @if (lines === 'three') {
          <div class="list-item__primary">{{ data.primary }}</div>
          <div class="list-item__secondary">{{ data.secondary }}</div>
          <div class="list-item__tertiary">{{ data.tertiary }}</div>
        }
      </div>

      <!-- Trailing content -->
      <div class="list-item__trailing">
        <ng-content select="[slot=trailing]"></ng-content>
      </div>
    </div>
  `,
  styleUrls: ['./list-item.component.scss']
})
export class ListItemComponent {
  @Input() data!: ListItemData;
  @Input() size: ListItemSize = 'md';
  @Input() lines: ListItemLines = 'one';
  @Input() variant: ListItemVariant = 'text';
  @Input() interactive = true;
  @Input() divider = false;

  getItemClasses(): string {
    const classes = [
      `list-item--${this.size}`,
      `list-item--${this.lines}-line`,
      `list-item--${this.variant}`
    ];

    if (this.interactive) classes.push('list-item--interactive');
    if (this.divider) classes.push('list-item--divider');
    if (this.data.disabled) classes.push('list-item--disabled');
    if (this.data.selected) classes.push('list-item--selected');

    return classes.join(' ');
  }
}}Bx G%(!a-`NL[5[x) export * from './progress-bar.component';0x% @use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// PROGRESS BAR COMPONENT STYLES
// ==========================================================================
// Modern progress bar implementation using design tokens
// Follows Material Design 3 principles with semantic token system
// Includes determinate, indeterminate, and buffer progress types
// ==========================================================================

.progress-bar-wrapper {
  display: flex;
  flex-direction: column;
  width: 100%;
  
  // Size variants
  &.progress-bar-wrapper--sm {
    gap: $semantic-spacing-component-xs;
  }
  
  &.progress-bar-wrapper--md {
    gap: $semantic-spacing-component-sm;
  }
  
  &.progress-bar-wrapper--lg {
    gap: $semantic-spacing-component-md;
  }
  
  // State variants
  &.progress-bar-wrapper--disabled {
    opacity: 0.6;
    pointer-events: none;
  }
}

.progress-bar {
  position: relative;
  display: block;
  width: 100%;
  background-color: $semantic-color-surface-secondary;
  border-radius: $semantic-border-radius-full;
  overflow: hidden;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  
  // Size variants
  &.progress-bar--sm {
    height: 4px;
  }
  
  &.progress-bar--md {
    height: 6px;
  }
  
  &.progress-bar--lg {
    height: 8px;
  }
  
  // Disabled state
  &.progress-bar--disabled {
    background-color: $semantic-color-surface-disabled;
  }
}

.progress-bar__fill {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  border-radius: inherit;
  transition: width $semantic-duration-medium $semantic-easing-standard;
  
  // Variant colors
  .progress-bar-wrapper--primary & {
    background-color: $semantic-color-brand-primary;
  }
  
  .progress-bar-wrapper--secondary & {
    background-color: $semantic-color-text-secondary;
  }
  
  .progress-bar-wrapper--success & {
    background-color: $semantic-color-success;
  }
  
  .progress-bar-wrapper--warning & {
    background-color: $semantic-color-warning;
  }
  
  .progress-bar-wrapper--danger & {
    background-color: $semantic-color-danger;
  }
  
  // Disabled state
  &.progress-bar__fill--disabled {
    background-color: $semantic-color-surface-disabled !important;
  }
  
  // Striped effect
  &.progress-bar__fill--striped {
    background-image: linear-gradient(
      45deg,
      rgba(255, 255, 255, 0.15) 25%,
      transparent 25%,
      transparent 50%,
      rgba(255, 255, 255, 0.15) 50%,
      rgba(255, 255, 255, 0.15) 75%,
      transparent 75%,
      transparent
    );
    background-size: 1rem 1rem;
  }
  
  // Animated stripes
  &.progress-bar__fill--animated {
    animation: progress-bar-stripes 1s linear infinite;
  }
}

// Indeterminate progress bar
.progress-bar__fill--indeterminate {
  width: 100%;
  
  &:before {
    content: '';
    position: absolute;
    background-color: inherit;
    top: 0;
    left: 0;
    bottom: 0;
    will-change: left, right;
    animation: indeterminate 2.1s cubic-bezier(0.650, 0.815, 0.735, 0.395) infinite;
  }
  
  &:after {
    content: '';
    position: absolute;
    background-color: inherit;
    top: 0;
    left: 0;
    bottom: 0;
    will-change: left, right;
    animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.840, 0.440, 1.000) infinite;
    animation-delay: 1.15s;
  }
}

// Buffer progress bar
.progress-bar__buffer {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  background-color: rgba($semantic-color-text-secondary, 0.3);
  border-radius: inherit;
  transition: width $semantic-duration-medium $semantic-easing-standard;
  
  &.progress-bar__buffer--disabled {
    background-color: $semantic-color-surface-disabled;
  }
}

.progress-bar__fill--buffer {
  z-index: 1;
}

// Label and percentage
.progress-bar__label {
  display: flex;
  justify-content: space-between;
  align-items: center;
  color: $semantic-color-text-primary;
  font-weight: $semantic-typography-font-weight-medium;
  line-height: $semantic-typography-line-height-tight;
  
  // Size variants
  &.progress-bar__label--sm {
    font-size: $semantic-typography-font-size-sm;
    margin-bottom: $semantic-spacing-component-xs;
  }
  
  &.progress-bar__label--md {
    font-size: $semantic-typography-font-size-md;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  &.progress-bar__label--lg {
    font-size: $semantic-typography-font-size-lg;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  // Disabled state
  &.progress-bar__label--disabled {
    color: $semantic-color-text-disabled;
  }
}

.progress-bar__label-text {
  flex: 1;
  margin-right: $semantic-spacing-component-sm;
}

.progress-bar__percentage {
  font-weight: $semantic-typography-font-weight-bold;
  color: $semantic-color-text-secondary;
  font-variant-numeric: tabular-nums;
  
  .progress-bar__label--disabled & {
    color: $semantic-color-text-disabled;
  }
}

.progress-bar__helper-text {
  color: $semantic-color-text-secondary;
  line-height: $semantic-typography-line-height-tight;
  
  // Size variants
  &.progress-bar__helper-text--sm {
    font-size: $semantic-typography-font-size-xs;
    margin-top: $semantic-spacing-component-xs;
  }
  
  &.progress-bar__helper-text--md {
    font-size: $semantic-typography-font-size-sm;
    margin-top: $semantic-spacing-component-xs;
  }
  
  &.progress-bar__helper-text--lg {
    font-size: $semantic-typography-font-size-md;
    margin-top: $semantic-spacing-component-sm;
  }
  
  // Disabled state
  &.progress-bar__helper-text--disabled {
    color: $semantic-color-text-disabled;
  }
}

// ==========================================================================
// ANIMATIONS
// ==========================================================================

// Striped animation
@keyframes progress-bar-stripes {
  0% {
    background-position-x: 1rem;
  }
  100% {
    background-position-x: 0;
  }
}

// Indeterminate animations
@keyframes indeterminate {
  0% {
    left: -35%;
    right: 100%;
  }
  60% {
    left: 100%;
    right: -90%;
  }
  100% {
    left: 100%;
    right: -90%;
  }
}

@keyframes indeterminate-short {
  0% {
    left: -200%;
    right: 100%;
  }
  60% {
    left: 107%;
    right: -8%;
  }
  100% {
    left: 107%;
    right: -8%;
  }
}

// Pulse animation for focus/hover states
@keyframes progress-bar-pulse {
  0% {
    box-shadow: 0 0 0 0 rgba($semantic-color-brand-primary, 0.4);
  }
  70% {
    box-shadow: 0 0 0 4px rgba($semantic-color-brand-primary, 0);
  }
  100% {
    box-shadow: 0 0 0 0 rgba($semantic-color-brand-primary, 0);
  }
}

// ==========================================================================
// HOVER AND FOCUS STATES
// ==========================================================================

.progress-bar:hover:not(.progress-bar--disabled) {
  transform: scaleY(1.1);
  box-shadow: $semantic-shadow-elevation-1;
}

.progress-bar:focus-visible {
  outline: $semantic-border-width-2 solid $semantic-color-brand-primary;
  outline-offset: 2px;
}

// ==========================================================================
// RESPONSIVE DESIGN
// ==========================================================================

@media (max-width: $semantic-sizing-breakpoint-tablet - 1) {
  .progress-bar-wrapper {
    // Slightly larger progress bars on mobile for better visibility
    &.progress-bar-wrapper--sm {
      .progress-bar--sm {
        height: 5px;
      }
    }
    
    &.progress-bar-wrapper--md {
      .progress-bar--md {
        height: 7px;
      }
    }
    
    &.progress-bar-wrapper--lg {
      .progress-bar--lg {
        height: 9px;
      }
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

// Reduced motion preference
@media (prefers-reduced-motion: reduce) {
  .progress-bar__fill,
  .progress-bar__buffer {
    transition: none !important;
  }
  
  .progress-bar__fill--animated,
  .progress-bar__fill--indeterminate:before,
  .progress-bar__fill--indeterminate:after {
    animation: none !important;
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .progress-bar {
    border: $semantic-border-width-1 solid $semantic-color-text-primary;
  }
  
  .progress-bar__fill {
    border: $semantic-border-width-1 solid $semantic-color-text-primary;
    border-radius: 0;
  }
}

// ==========================================================================
// THEME VARIANTS
// ==========================================================================

// Dark theme adjustments
@media (prefers-color-scheme: dark) {
  .progress-bar {
    background-color: rgba($semantic-color-surface-primary, 0.1);
  }
  
  .progress-bar__buffer {
    background-color: rgba($semantic-color-text-secondary, 0.2);
  }
}

// ==========================================================================
// SPECIAL STATES AND EFFECTS
// ==========================================================================

// Success completion effect
.progress-bar-wrapper--success {
  .progress-bar__fill[style*="100%"] {
    animation: progress-complete 0.6s $semantic-easing-spring;
  }
}

@keyframes progress-complete {
  0% {
    transform: scaleX(1);
  }
  50% {
    transform: scaleX(1.02);
  }
  100% {
    transform: scaleX(1);
  }
}

// Error state pulsing
.progress-bar-wrapper--danger {
  .progress-bar__fill {
    animation: progress-error 2s ease-in-out infinite;
  }
}

@keyframes progress-error {
  0%, 100% {
    opacity: 1;
  }
  50% {
    opacity: 0.8;
  }
}^ƴx{gqFbQjniF _ximport { Component, Input, ChangeDetectionStrategy, signal, computed, ViewChild, ElementRef } from '@angular/core';
import { CommonModule } from '@angular/common';

export type ProgressBarSize = 'sm' | 'md' | 'lg';
export type ProgressBarVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
export type ProgressBarType = 'determinate' | 'indeterminate' | 'buffer';
export type ProgressBarState = 'default' | 'disabled';

@Component({
  selector: 'ui-progress-bar',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule],
  template: `
    <div class="progress-bar-wrapper" [class]="getWrapperClasses()" [attr.aria-label]="ariaLabel">
      
      @if (showLabelComputed()) {
        <div class="progress-bar__label" [class]="getLabelClasses()">
          <span class="progress-bar__label-text">{{ label }}</span>
          @if (showPercentageComputed() && type() === 'determinate') {
            <span class="progress-bar__percentage">{{ Math.round(value()) }}%</span>
          }
        </div>
      }
      
      <div 
        #progressElement
        class="progress-bar" 
        [class]="getProgressBarClasses()"
        role="progressbar"
        [attr.aria-valuenow]="type() === 'determinate' ? value() : null"
        [attr.aria-valuemin]="type() === 'determinate' ? 0 : null"
        [attr.aria-valuemax]="type() === 'determinate' ? 100 : null"
        [attr.aria-valuetext]="getAriaValueText()"
        [attr.aria-label]="ariaLabel || label || 'Progress'"
      >
        
        @if (type() === 'determinate') {
          <div 
            class="progress-bar__fill progress-bar__fill--determinate" 
            [class]="getFillClasses()"
            [style.width.%]="value()">
          </div>
        }
        
        @if (type() === 'indeterminate') {
          <div 
            class="progress-bar__fill progress-bar__fill--indeterminate" 
            [class]="getFillClasses()">
          </div>
        }
        
        @if (type() === 'buffer') {
          <div 
            class="progress-bar__buffer" 
            [class]="getBufferClasses()"
            [style.width.%]="bufferValue()">
          </div>
          <div 
            class="progress-bar__fill progress-bar__fill--buffer" 
            [class]="getFillClasses()"
            [style.width.%]="value()">
          </div>
        }
        
      </div>
      
      @if (helperTextComputed()) {
        <div class="progress-bar__helper-text" [class]="getHelperTextClasses()">
          {{ helperTextComputed() }}
        </div>
      }
      
    </div>
  `,
  styleUrls: ['./progress-bar.component.scss']
})
export class ProgressBarComponent {
  @ViewChild('progressElement', { static: false }) progressElement!: ElementRef<HTMLDivElement>;

  // Core inputs
  @Input() set progress(value: number) { this._value.set(Math.max(0, Math.min(100, value))); }
  @Input() set buffer(value: number) { this._bufferValue.set(Math.max(0, Math.min(100, value))); }
  @Input() label: string = '';
  @Input() size: ProgressBarSize = 'md';
  @Input() variant: ProgressBarVariant = 'primary';
  @Input() progressType: ProgressBarType = 'determinate';
  @Input() state: ProgressBarState = 'default';
  
  // Display options
  @Input() showLabel = true;
  @Input() showPercentage = true;
  @Input() striped = false;
  @Input() animated = false;
  
  // Accessibility
  @Input() ariaLabel: string = '';
  @Input() helperText: string = '';
  @Input() progressId: string = `progress-${Math.random().toString(36).substr(2, 9)}`;

  // Exposed Math for template
  protected readonly Math = Math;

  // Internal state
  private _value = signal<number>(0);
  private _bufferValue = signal<number>(0);

  // Computed properties
  protected value = computed(() => this._value());
  protected bufferValue = computed(() => this._bufferValue());
  protected type = computed(() => this.progressType);
  protected showLabelComputed = computed(() => this.label && this.showLabel);
  protected showPercentageComputed = computed(() => this.showPercentage && this.progressType === 'determinate');
  protected helperTextComputed = computed(() => this.helperText);

  ngOnInit(): void {
    // Initialize with default values if not set
    if (this._value() === 0 && this.progressType === 'determinate') {
      this._value.set(0);
    }
  }

  getAriaValueText(): string {
    if (this.progressType === 'determinate') {
      return `${Math.round(this.value())}% complete`;
    } else if (this.progressType === 'indeterminate') {
      return 'Loading...';
    } else {
      return `${Math.round(this.value())}% of ${Math.round(this.bufferValue())}%`;
    }
  }

  // CSS class getters
  getWrapperClasses(): string {
    const classes = [
      `progress-bar-wrapper--${this.size}`,
      `progress-bar-wrapper--${this.variant}`,
      `progress-bar-wrapper--${this.progressType}`,
      `progress-bar-wrapper--${this.state}`
    ];

    if (this.state === 'disabled') classes.push('progress-bar-wrapper--disabled');
    if (this.striped) classes.push('progress-bar-wrapper--striped');
    if (this.animated) classes.push('progress-bar-wrapper--animated');

    return classes.join(' ');
  }

  getProgressBarClasses(): string {
    const classes = [
      `progress-bar--${this.size}`,
      `progress-bar--${this.variant}`,
      `progress-bar--${this.progressType}`,
      `progress-bar--${this.state}`
    ];

    if (this.state === 'disabled') classes.push('progress-bar--disabled');

    return classes.join(' ');
  }

  getFillClasses(): string {
    const classes = [`progress-bar__fill--${this.size}`];
    
    if (this.striped) classes.push('progress-bar__fill--striped');
    if (this.animated) classes.push('progress-bar__fill--animated');
    if (this.state === 'disabled') classes.push('progress-bar__fill--disabled');
    
    return classes.join(' ');
  }

  getBufferClasses(): string {
    const classes = [`progress-bar__buffer--${this.size}`];
    
    if (this.state === 'disabled') classes.push('progress-bar__buffer--disabled');
    
    return classes.join(' ');
  }

  getLabelClasses(): string {
    const classes = [`progress-bar__label--${this.size}`];
    
    if (this.state === 'disabled') classes.push('progress-bar__label--disabled');
    
    return classes.join(' ');
  }

  getHelperTextClasses(): string {
    const classes = [`progress-bar__helper-text--${this.size}`];
    
    if (this.state === 'disabled') classes.push('progress-bar__helper-text--disabled');
    
    return classes.join(' ');
  }

  // Public methods for programmatic control
  setProgress(value: number): void {
    this._value.set(Math.max(0, Math.min(100, value)));
  }

  setBuffer(value: number): void {
    this._bufferValue.set(Math.max(0, Math.min(100, value)));
  }

  reset(): void {
    this._value.set(0);
    this._bufferValue.set(0);
  }

  complete(): void {
    this._value.set(100);
  }
}MYxQ %:&dxk/Y0剐 Y__#lx.li =R ANHQP >~yb2.u$xxqimport { 
  Component, 
  Input, 
  Output, 
  EventEmitter, 
  ChangeDetectionStrategy, 
  ViewEncapsulation,
  ContentChild, 
  TemplateRef,
  ViewChild,
  ElementRef,
  OnInit,
  OnDestroy,
  AfterViewInit,
  HostListener,
  signal,
  computed
} from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';

export type EnhancedTableVariant = 'default' | 'striped' | 'bordered' | 'minimal';
export type EnhancedTableSize = 'compact' | 'default' | 'comfortable';
export type EnhancedTableColumnAlign = 'left' | 'center' | 'right';
export type FilterOperator = 'equals' | 'contains' | 'startsWith' | 'endsWith' | 'gt' | 'gte' | 'lt' | 'lte' | 'range' | 'in' | 'notIn';

export interface EnhancedTableColumn {
  key: string;
  label: string;
  sortable?: boolean;
  filterable?: boolean;
  resizable?: boolean;
  draggable?: boolean;
  align?: EnhancedTableColumnAlign;
  width?: number;
  minWidth?: number;
  maxWidth?: number;
  sticky?: boolean;
  filterType?: 'text' | 'number' | 'date' | 'select' | 'multi-select';
  filterOptions?: Array<{label: string, value: any}>;
  hidden?: boolean;
}

export interface TableFilter {
  column: string;
  operator: FilterOperator;
  value: any;
  value2?: any; // For range filters
}

export interface TableSort {
  column: string;
  direction: 'asc' | 'desc';
  priority: number; // For multi-column sorting
}

export interface EnhancedTableSortEvent {
  sorting: TableSort[];
}

export interface EnhancedTableFilterEvent {
  filters: TableFilter[];
}

export interface EnhancedTableColumnResizeEvent {
  column: string;
  width: number;
  columnWidths: Record<string, number>;
}

export interface EnhancedTableColumnReorderEvent {
  fromIndex: number;
  toIndex: number;
  columnOrder: string[];
}

export interface VirtualScrollConfig {
  enabled: boolean;
  itemHeight: number;
  buffer?: number;
  trackBy?: (index: number, item: any) => any;
}

@Component({
  selector: 'ui-enhanced-table',
  standalone: true,
  imports: [CommonModule, FormsModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div [class]="tableContainerClasses" #tableContainer>
      
      <!-- Filter Row (Optional) -->
      @if (showFilterRow) {
        <div class="ui-enhanced-table__filter-row">
          @for (column of visibleColumns(); track column.key) {
            @if (column.filterable) {
              <div class="ui-enhanced-table__filter-cell" [style.width.px]="getColumnWidth(column.key)">
                @switch (column.filterType || 'text') {
                  @case ('text') {
                    <input
                      type="text"
                      class="ui-enhanced-table__filter-input"
                      [placeholder]="'Filter ' + column.label"
                      [value]="getFilterValue(column.key)"
                      (input)="updateFilter(column.key, 'contains', $any($event.target).value)"
                    />
                  }
                  @case ('number') {
                    <input
                      type="number"
                      class="ui-enhanced-table__filter-input"
                      [placeholder]="'Filter ' + column.label"
                      [value]="getFilterValue(column.key)"
                      (input)="updateFilter(column.key, 'equals', $any($event.target).value)"
                    />
                  }
                  @case ('select') {
                    <select
                      class="ui-enhanced-table__filter-select"
                      [value]="getFilterValue(column.key)"
                      (change)="updateFilter(column.key, 'equals', $any($event.target).value)"
                    >
                      <option value="">All</option>
                      @for (option of column.filterOptions || []; track option.value) {
                        <option [value]="option.value">{{ option.label }}</option>
                      }
                    </select>
                  }
                }
              </div>
            } @else {
              <div class="ui-enhanced-table__filter-cell" [style.width.px]="getColumnWidth(column.key)"></div>
            }
          }
        </div>
      }

      <!-- Virtual Scroll Container -->
      <div class="ui-enhanced-table__scroll-container" #scrollContainer>
        
        <!-- Header -->
        <div class="ui-enhanced-table__header" [class.ui-enhanced-table__header--sticky]="stickyHeader">
          <div class="ui-enhanced-table__header-row">
            @for (column of visibleColumns(); track column.key; let colIndex = $index) {
              <div
                class="ui-enhanced-table__header-cell"
                [class.ui-enhanced-table__header-cell--sortable]="column.sortable"
                [class.ui-enhanced-table__header-cell--sorted]="getSortInfo(column.key).active"
                [class.ui-enhanced-table__header-cell--draggable]="column.draggable"
                [style.width.px]="getColumnWidth(column.key)"
                [style.text-align]="column.align || 'left'"
                [attr.data-column]="column.key"
                [attr.aria-sort]="getSortAttribute(column.key)"
                (click)="handleSort(column, $event)"
                (mousedown)="startColumnReorder($event, colIndex)"
              >
                <div class="ui-enhanced-table__header-content">
                  <span class="ui-enhanced-table__header-text">{{ column.label }}</span>
                  
                  <!-- Sort indicators -->
                  @if (column.sortable) {
                    <div class="ui-enhanced-table__sort-indicators">
                      @for (sort of getCurrentSorting(column.key); track sort.priority) {
                        <span 
                          class="ui-enhanced-table__sort-indicator"
                          [attr.data-direction]="sort.direction"
                          [attr.data-priority]="sort.priority"
                        >
                          @if (sort.direction === 'asc') {
                            ↑
                          } @else {
                            ↓
                          }
                          @if (sorting().length > 1) {
                            <sup>{{ sort.priority + 1 }}</sup>
                          }
                        </span>
                      }
                    </div>
                  }
                </div>
                
                <!-- Resize handle -->
                @if (column.resizable) {
                  <div 
                    class="ui-enhanced-table__resize-handle"
                    (mousedown)="startColumnResize($event, column.key)"
                    (dblclick)="autoSizeColumn(column.key)"
                  ></div>
                }
              </div>
            }
          </div>
        </div>

        <!-- Virtual Scroll Viewport -->
        @if (virtualScrolling.enabled) {
          <div 
            class="ui-enhanced-table__virtual-viewport"
            [style.height.px]="virtualViewportHeight()"
            (scroll)="onVirtualScroll($event)"
          >
            <!-- Spacer before visible items -->
            @if (virtualStartOffset() > 0) {
              <div [style.height.px]="virtualStartOffset()"></div>
            }

            <!-- Visible rows -->
            @for (row of virtualRows(); track virtualScrolling.trackBy ? virtualScrolling.trackBy($index, row) : $index; let rowIndex = $index) {
              <div 
                class="ui-enhanced-table__virtual-row"
                [class.ui-enhanced-table__virtual-row--selected]="selectedRows.has(row)"
                [class.ui-enhanced-table__virtual-row--hover]="hoverable"
                [style.height.px]="virtualScrolling.itemHeight"
                (click)="handleRowClick(row, virtualStartIndex() + rowIndex)"
              >
                @for (column of visibleColumns(); track column.key) {
                  <div 
                    class="ui-enhanced-table__virtual-cell"
                    [style.width.px]="getColumnWidth(column.key)"
                    [style.text-align]="column.align || 'left'"
                  >
                    @if (getCellTemplate(column.key)) {
                      <ng-container 
                        [ngTemplateOutlet]="getCellTemplate(column.key)!" 
                        [ngTemplateOutletContext]="{
                          $implicit: getCellValue(row, column.key),
                          row: row,
                          column: column,
                          index: virtualStartIndex() + rowIndex
                        }"
                      ></ng-container>
                    } @else {
                      <span class="ui-enhanced-table__cell-content">
                        {{ getCellValue(row, column.key) }}
                      </span>
                    }
                  </div>
                }
              </div>
            }

            <!-- Spacer after visible items -->
            @if (virtualEndOffset() > 0) {
              <div [style.height.px]="virtualEndOffset()"></div>
            }
          </div>
        } @else {
          <!-- Traditional table body -->
          <div class="ui-enhanced-table__body">
            @if (filteredAndSortedData().length === 0 && showEmptyState) {
              <div class="ui-enhanced-table__empty-row">
                <div class="ui-enhanced-table__empty-cell">
                  <div class="ui-enhanced-table__empty-content">
                    @if (emptyTemplate) {
                      <ng-container [ngTemplateOutlet]="emptyTemplate"></ng-container>
                    } @else {
                      <div class="ui-enhanced-table__empty-text">{{ emptyMessage }}</div>
                    }
                  </div>
                </div>
              </div>
            } @else {
              @for (row of filteredAndSortedData(); track trackByFn ? trackByFn($index, row) : $index; let rowIndex = $index) {
                <div 
                  class="ui-enhanced-table__row"
                  [class.ui-enhanced-table__row--selected]="selectedRows.has(row)"
                  [class.ui-enhanced-table__row--hover]="hoverable"
                  [class.ui-enhanced-table__row--striped]="rowIndex % 2 === 1 && variant === 'striped'"
                  (click)="handleRowClick(row, rowIndex)"
                >
                  @for (column of visibleColumns(); track column.key) {
                    <div 
                      class="ui-enhanced-table__cell"
                      [style.width.px]="getColumnWidth(column.key)"
                      [style.text-align]="column.align || 'left'"
                    >
                      @if (getCellTemplate(column.key)) {
                        <ng-container 
                          [ngTemplateOutlet]="getCellTemplate(column.key)!" 
                          [ngTemplateOutletContext]="{
                            $implicit: getCellValue(row, column.key),
                            row: row,
                            column: column,
                            index: rowIndex
                          }"
                        ></ng-container>
                      } @else {
                        <span class="ui-enhanced-table__cell-content">
                          {{ getCellValue(row, column.key) }}
                        </span>
                      }
                    </div>
                  }
                </div>
              }
            }
          </div>
        }
      </div>

      <!-- Loading Overlay -->
      @if (loading) {
        <div class="ui-enhanced-table__loading-overlay">
          <div class="ui-enhanced-table__loading-spinner"></div>
          <div class="ui-enhanced-table__loading-text">{{ loadingMessage }}</div>
        </div>
      }

      <!-- Column Reorder Ghost -->
      @if (columnReorderState.dragging) {
        <div 
          class="ui-enhanced-table__column-ghost"
          [style.left.px]="columnReorderState.ghostX"
          [style.top.px]="columnReorderState.ghostY"
        >
          {{ columnReorderState.draggedColumn?.label }}
        </div>
      }
    </div>
  `,
  styleUrl: './enhanced-table.component.scss'
})
export class EnhancedTableComponent implements OnInit, OnDestroy, AfterViewInit {
  @Input() data: any[] = [];
  @Input() columns: EnhancedTableColumn[] = [];
  @Input() variant: EnhancedTableVariant = 'default';
  @Input() size: EnhancedTableSize = 'default';
  @Input() showFilterRow: boolean = false;
  @Input() showEmptyState: boolean = true;
  @Input() emptyMessage: string = 'No data available';
  @Input() loading: boolean = false;
  @Input() loadingMessage: string = 'Loading...';
  @Input() hoverable: boolean = true;
  @Input() selectable: boolean = false;
  @Input() stickyHeader: boolean = false;
  @Input() maxHeight: string = '';
  @Input() trackByFn?: (index: number, item: any) => any;
  @Input() cellTemplates: Record<string, TemplateRef<any>> = {};
  @Input() class: string = '';

  // Enhanced features
  @Input() virtualScrolling: VirtualScrollConfig = { enabled: false, itemHeight: 48, buffer: 5 };
  @Input() multiSort: boolean = false;
  @Input() initialSorting: TableSort[] = [];
  @Input() initialFilters: TableFilter[] = [];
  @Input() initialColumnWidths: Record<string, number> = {};
  @Input() initialColumnOrder: string[] = [];

  @Output() rowClick = new EventEmitter<{row: any, index: number}>();
  @Output() sortChange = new EventEmitter<EnhancedTableSortEvent>();
  @Output() filterChange = new EventEmitter<EnhancedTableFilterEvent>();
  @Output() columnResize = new EventEmitter<EnhancedTableColumnResizeEvent>();
  @Output() columnReorder = new EventEmitter<EnhancedTableColumnReorderEvent>();
  @Output() selectionChange = new EventEmitter<any[]>();

  @ContentChild('emptyTemplate') emptyTemplate?: TemplateRef<any>;
  @ViewChild('tableContainer') tableContainer?: ElementRef<HTMLDivElement>;
  @ViewChild('scrollContainer') scrollContainer?: ElementRef<HTMLDivElement>;

  // Signals for reactive state management
  sorting = signal<TableSort[]>([]);
  filters = signal<TableFilter[]>([]);
  columnWidths = signal<Record<string, number>>({});
  columnOrder = signal<string[]>([]);
  selectedRows: Set<any> = new Set();

  // Virtual scrolling state
  virtualStartIndex = signal(0);
  virtualEndIndex = signal(0);
  virtualViewportHeight = signal(400);

  // Column resizing state
  columnResizeState = {
    resizing: false,
    columnKey: '',
    startX: 0,
    startWidth: 0
  };

  // Column reordering state
  columnReorderState = {
    dragging: false,
    draggedIndex: -1,
    draggedColumn: null as EnhancedTableColumn | null,
    ghostX: 0,
    ghostY: 0
  };

  // Computed properties
  visibleColumns = computed(() => {
    const order = this.columnOrder();
    const cols = this.columns.filter(col => !col.hidden);
    
    if (order.length === 0) {
      return cols;
    }
    
    // Sort columns by order array
    return order
      .map(key => cols.find(col => col.key === key))
      .filter(Boolean) as EnhancedTableColumn[];
  });

  filteredAndSortedData = computed(() => {
    let result = [...this.data];
    
    // Apply filters
    const currentFilters = this.filters();
    currentFilters.forEach(filter => {
      result = this.applyFilter(result, filter);
    });
    
    // Apply sorting
    const currentSorting = this.sorting();
    if (currentSorting.length > 0) {
      result.sort((a, b) => {
        for (const sort of currentSorting.sort((x, y) => x.priority - y.priority)) {
          const valueA = this.getCellValue(a, sort.column);
          const valueB = this.getCellValue(b, sort.column);
          const comparison = this.compareValues(valueA, valueB);
          
          if (comparison !== 0) {
            return sort.direction === 'desc' ? -comparison : comparison;
          }
        }
        return 0;
      });
    }
    
    return result;
  });

  virtualRows = computed(() => {
    if (!this.virtualScrolling.enabled) return [];
    
    const data = this.filteredAndSortedData();
    const start = this.virtualStartIndex();
    const end = Math.min(this.virtualEndIndex(), data.length);
    
    return data.slice(start, end);
  });

  virtualStartOffset = computed(() => {
    return this.virtualStartIndex() * this.virtualScrolling.itemHeight;
  });

  virtualEndOffset = computed(() => {
    const data = this.filteredAndSortedData();
    const remainingItems = data.length - this.virtualEndIndex();
    return remainingItems > 0 ? remainingItems * this.virtualScrolling.itemHeight : 0;
  });

  ngOnInit() {
    // Initialize state from inputs
    this.sorting.set([...this.initialSorting]);
    this.filters.set([...this.initialFilters]);
    this.columnWidths.set({...this.initialColumnWidths});
    this.columnOrder.set([...this.initialColumnOrder]);

    // Set default column widths
    this.initializeColumnWidths();
  }

  ngAfterViewInit() {
    if (this.virtualScrolling.enabled) {
      this.calculateVirtualScrolling();
    }
  }

  ngOnDestroy() {
    // Cleanup event listeners
    document.removeEventListener('mousemove', this.onColumnResize);
    document.removeEventListener('mouseup', this.onColumnResizeEnd);
    document.removeEventListener('mousemove', this.onColumnReorderMove);
    document.removeEventListener('mouseup', this.onColumnReorderEnd);
  }

  get tableContainerClasses(): string {
    return [
      'ui-enhanced-table-container',
      `ui-enhanced-table-container--${this.variant}`,
      `ui-enhanced-table-container--${this.size}`,
      this.stickyHeader ? 'ui-enhanced-table-container--sticky-header' : '',
      this.maxHeight ? 'ui-enhanced-table-container--max-height' : '',
      this.loading ? 'ui-enhanced-table-container--loading' : '',
      this.virtualScrolling.enabled ? 'ui-enhanced-table-container--virtual' : '',
      this.class
    ].filter(Boolean).join(' ');
  }

  private initializeColumnWidths(): void {
    const widths = {...this.columnWidths()};
    this.columns.forEach(column => {
      if (!widths[column.key]) {
        widths[column.key] = column.width || 150;
      }
    });
    this.columnWidths.set(widths);
  }

  getColumnWidth(columnKey: string): number {
    return this.columnWidths()[columnKey] || 150;
  }

  // Virtual scrolling methods
  calculateVirtualScrolling(): void {
    if (!this.scrollContainer) return;

    const container = this.scrollContainer.nativeElement;
    const containerHeight = container.clientHeight;
    const itemHeight = this.virtualScrolling.itemHeight;
    const buffer = this.virtualScrolling.buffer || 5;
    
    const visibleCount = Math.ceil(containerHeight / itemHeight);
    const startIndex = Math.floor(container.scrollTop / itemHeight);
    const bufferedStart = Math.max(0, startIndex - buffer);
    const bufferedEnd = Math.min(
      this.filteredAndSortedData().length,
      startIndex + visibleCount + buffer
    );

    this.virtualStartIndex.set(bufferedStart);
    this.virtualEndIndex.set(bufferedEnd);
    this.virtualViewportHeight.set(this.filteredAndSortedData().length * itemHeight);
  }

  onVirtualScroll(event: Event): void {
    this.calculateVirtualScrolling();
  }

  // Sorting methods
  handleSort(column: EnhancedTableColumn, event?: MouseEvent): void {
    if (!column.sortable) return;

    const currentSorting = [...this.sorting()];
    const existingIndex = currentSorting.findIndex(s => s.column === column.key);

    if (this.multiSort && event?.ctrlKey) {
      // Multi-sort mode
      if (existingIndex >= 0) {
        const existing = currentSorting[existingIndex];
        if (existing.direction === 'asc') {
          existing.direction = 'desc';
        } else {
          currentSorting.splice(existingIndex, 1);
        }
      } else {
        currentSorting.push({
          column: column.key,
          direction: 'asc',
          priority: currentSorting.length
        });
      }
    } else {
      // Single sort mode
      if (existingIndex >= 0) {
        const existing = currentSorting[existingIndex];
        if (existing.direction === 'asc') {
          existing.direction = 'desc';
          currentSorting.splice(0, currentSorting.length, existing);
        } else {
          currentSorting.splice(0, currentSorting.length);
        }
      } else {
        currentSorting.splice(0, currentSorting.length, {
          column: column.key,
          direction: 'asc',
          priority: 0
        });
      }
    }

    // Update priorities
    currentSorting.forEach((sort, index) => {
      sort.priority = index;
    });

    this.sorting.set(currentSorting);
    this.sortChange.emit({ sorting: currentSorting });
  }

  getSortInfo(columnKey: string): {active: boolean, direction?: 'asc' | 'desc', priority?: number} {
    const sort = this.sorting().find(s => s.column === columnKey);
    return sort ? {
      active: true,
      direction: sort.direction,
      priority: sort.priority
    } : { active: false };
  }

  getCurrentSorting(columnKey: string): TableSort[] {
    return this.sorting().filter(s => s.column === columnKey);
  }

  getSortAttribute(columnKey: string): string | null {
    const sort = this.sorting().find(s => s.column === columnKey);
    return sort ? (sort.direction === 'asc' ? 'ascending' : 'descending') : null;
  }

  private compareValues(a: any, b: any): number {
    if (a == null && b == null) return 0;
    if (a == null) return -1;
    if (b == null) return 1;

    // Handle different data types
    if (typeof a === 'string' && typeof b === 'string') {
      return a.localeCompare(b);
    }

    if (typeof a === 'number' && typeof b === 'number') {
      return a - b;
    }

    if (a instanceof Date && b instanceof Date) {
      return a.getTime() - b.getTime();
    }

    // Fallback to string comparison
    return String(a).localeCompare(String(b));
  }

  // Filtering methods
  updateFilter(columnKey: string, operator: FilterOperator, value: any): void {
    const currentFilters = [...this.filters()];
    const existingIndex = currentFilters.findIndex(f => f.column === columnKey);

    if (value === '' || value == null) {
      // Remove filter if value is empty
      if (existingIndex >= 0) {
        currentFilters.splice(existingIndex, 1);
      }
    } else {
      const filter: TableFilter = { column: columnKey, operator, value };
      
      if (existingIndex >= 0) {
        currentFilters[existingIndex] = filter;
      } else {
        currentFilters.push(filter);
      }
    }

    this.filters.set(currentFilters);
    this.filterChange.emit({ filters: currentFilters });
  }

  getFilterValue(columnKey: string): any {
    const filter = this.filters().find(f => f.column === columnKey);
    return filter?.value || '';
  }

  private applyFilter(data: any[], filter: TableFilter): any[] {
    return data.filter(row => {
      const cellValue = this.getCellValue(row, filter.column);
      const filterValue = filter.value;

      switch (filter.operator) {
        case 'equals':
          return cellValue == filterValue;
        case 'contains':
          return String(cellValue).toLowerCase().includes(String(filterValue).toLowerCase());
        case 'startsWith':
          return String(cellValue).toLowerCase().startsWith(String(filterValue).toLowerCase());
        case 'endsWith':
          return String(cellValue).toLowerCase().endsWith(String(filterValue).toLowerCase());
        case 'gt':
          return Number(cellValue) > Number(filterValue);
        case 'gte':
          return Number(cellValue) >= Number(filterValue);
        case 'lt':
          return Number(cellValue) < Number(filterValue);
        case 'lte':
          return Number(cellValue) <= Number(filterValue);
        case 'range':
          const numValue = Number(cellValue);
          return numValue >= Number(filterValue) && numValue <= Number(filter.value2);
        case 'in':
          return Array.isArray(filterValue) && filterValue.includes(cellValue);
        case 'notIn':
          return Array.isArray(filterValue) && !filterValue.includes(cellValue);
        default:
          return true;
      }
    });
  }

  // Column resizing methods
  startColumnResize = (event: MouseEvent, columnKey: string): void => {
    event.preventDefault();
    event.stopPropagation();

    this.columnResizeState = {
      resizing: true,
      columnKey,
      startX: event.clientX,
      startWidth: this.getColumnWidth(columnKey)
    };

    document.addEventListener('mousemove', this.onColumnResize);
    document.addEventListener('mouseup', this.onColumnResizeEnd);
  };

  private onColumnResize = (event: MouseEvent): void => {
    if (!this.columnResizeState.resizing) return;

    const deltaX = event.clientX - this.columnResizeState.startX;
    const newWidth = Math.max(50, this.columnResizeState.startWidth + deltaX);
    
    const widths = {...this.columnWidths()};
    widths[this.columnResizeState.columnKey] = newWidth;
    this.columnWidths.set(widths);
  };

  private onColumnResizeEnd = (): void => {
    if (this.columnResizeState.resizing) {
      this.columnResize.emit({
        column: this.columnResizeState.columnKey,
        width: this.getColumnWidth(this.columnResizeState.columnKey),
        columnWidths: this.columnWidths()
      });
    }

    this.columnResizeState.resizing = false;
    document.removeEventListener('mousemove', this.onColumnResize);
    document.removeEventListener('mouseup', this.onColumnResizeEnd);
  };

  autoSizeColumn(columnKey: string): void {
    // Simple auto-sizing logic - could be enhanced to measure content
    const column = this.columns.find(c => c.key === columnKey);
    if (column) {
      const defaultWidth = Math.max(column.label.length * 8 + 40, 100);
      const widths = {...this.columnWidths()};
      widths[columnKey] = defaultWidth;
      this.columnWidths.set(widths);
    }
  }

  // Column reordering methods
  startColumnReorder = (event: MouseEvent, columnIndex: number): void => {
    if (!this.visibleColumns()[columnIndex]?.draggable) return;

    event.preventDefault();
    this.columnReorderState = {
      dragging: true,
      draggedIndex: columnIndex,
      draggedColumn: this.visibleColumns()[columnIndex],
      ghostX: event.clientX,
      ghostY: event.clientY
    };

    document.addEventListener('mousemove', this.onColumnReorderMove);
    document.addEventListener('mouseup', this.onColumnReorderEnd);
  };

  private onColumnReorderMove = (event: MouseEvent): void => {
    if (!this.columnReorderState.dragging) return;

    this.columnReorderState.ghostX = event.clientX;
    this.columnReorderState.ghostY = event.clientY;
  };

  private onColumnReorderEnd = (event: MouseEvent): void => {
    if (!this.columnReorderState.dragging) return;

    // Find drop target
    const element = document.elementFromPoint(event.clientX, event.clientY);
    const headerCell = element?.closest('.ui-enhanced-table__header-cell');
    
    if (headerCell) {
      const targetColumn = headerCell.getAttribute('data-column');
      const targetIndex = this.visibleColumns().findIndex(c => c.key === targetColumn);
      
      if (targetIndex >= 0 && targetIndex !== this.columnReorderState.draggedIndex) {
        const newOrder = [...this.columnOrder()];
        const draggedKey = this.columnReorderState.draggedColumn!.key;
        
        // Remove dragged item and insert at new position
        const currentIndex = newOrder.indexOf(draggedKey);
        if (currentIndex >= 0) {
          newOrder.splice(currentIndex, 1);
        }
        newOrder.splice(targetIndex, 0, draggedKey);
        
        this.columnOrder.set(newOrder);
        this.columnReorder.emit({
          fromIndex: this.columnReorderState.draggedIndex,
          toIndex: targetIndex,
          columnOrder: newOrder
        });
      }
    }

    this.columnReorderState.dragging = false;
    document.removeEventListener('mousemove', this.onColumnReorderMove);
    document.removeEventListener('mouseup', this.onColumnReorderEnd);
  };

  // Utility methods
  handleRowClick(row: any, index: number): void {
    if (this.selectable) {
      this.toggleRowSelection(row);
    }
    
    this.rowClick.emit({ row, index });
  }

  toggleRowSelection(row: any): void {
    if (this.selectedRows.has(row)) {
      this.selectedRows.delete(row);
    } else {
      this.selectedRows.add(row);
    }
    
    this.selectionChange.emit(Array.from(this.selectedRows));
  }

  getCellValue(row: any, key: string): any {
    return key.split('.').reduce((obj, prop) => obj?.[prop], row) ?? '';
  }

  getCellTemplate(columnKey: string): TemplateRef<any> | null {
    return this.cellTemplates[columnKey] || null;
  }

  @HostListener('window:resize')
  onWindowResize(): void {
    if (this.virtualScrolling.enabled) {
      setTimeout(() => this.calculateVirtualScrolling(), 0);
    }
  }
}sxBxVMlEV8Nu&/:T%QiS5B]gw4JMD!TBP@E\HH.)HT	q񮽛!}fZS5mJ	tZcng:W%Zp^U"W%@Kx&;بa:9K-w-REF!$tmWTUƢ
B+ S.7,{<<\qOnG7c+2FKx3O`٨ %fz
e!Ahk+(WuS*W=)cbT,JfeI*1F,oK˼\e!lUjmKo~qfȎ|+HZ`YO˲RikA1kJR
y:w`Ln,ZqkB΢nxRt!\.xT+HJY*04
K*<=>rQ|;g8Z4^wɡ <KDg~7s¨r'ȫfGHKmQۍ/f*1L*u1,"#|26/c0cE0$A_JkJx
r(FD6:BEVχg	^Q1tE7roz{\Q&xGzEMM]'S7=y=M_Qᩏ?]hKnGPpw26Hc>>
p6vH'k/~AOMa~2Iɓtbp`#5_k*ty 	ޯ;6^f8`4d4)i!knO3KpƧF st<j! ]Aq|"It4
ӬHlE6A4N;L`TUcxE-q[YDˤ>mkg3*rD<vvP6⿽mG˟]#{y3@=gF|pz.s0De◶RZnmni!Z%;ӄ+䤐ሪUE%#[̲ొeQeiz0v?P;f:XmOΤdl qβ?B@KjBjT5^fNeADn5oO@`'Seo3b3R~ZmSÙM[;W_t{4bԿ?</tkV6Ꚃl [Z,4zlxy export * from './table.component';
export * from './enhanced-table.component';
export * from './table-actions.component';$*xU@use "../../../../../../ui-design-system/src/styles/semantic" as *;
.ui-table-actions {
  display: flex;
  align-items: center;
  gap: 0.25rem;
  position: relative;

  // Size variants
  &--small {
    gap: 0.125rem;
  }

  &--medium {
    gap: 0.25rem;
  }

  &--large {
    gap: 0.375rem;
  }

  // Layout modifiers
  &--compact {
    gap: 0.125rem;

    .ui-table-action {
      min-width: auto;
    }
  }

  &--with-labels {
    gap: 0.5rem;
  }
}

.ui-table-action {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.25rem;
  padding: 0.375rem;
  border: 1px solid transparent;
  border-radius: 0.25rem;
  background: transparent;
  color: hsl(287, 12%, 47%);
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  font-size: 0.875rem;
  font-weight: 500;
  line-height: 1;
  cursor: pointer;
  transition: all 150ms cubic-bezier(0, 0, 0.2, 1);
  min-width: 2rem;
  min-height: 2rem;
  position: relative;
  user-select: none;

  &:hover:not(:disabled) {
    background: hsl(289, 14%, 96%);
    color: hsl(279, 14%, 11%);
    transform: scale(1.05);
  }

  &:active:not(:disabled) {
    transform: scale(0.98);
  }

  &:focus-visible {
    outline: 2px solid hsl(258, 100%, 47%);
    outline-offset: 1px;
  }

  // Action variants
  &--edit {
    color: hsl(207, 90%, 45%);

    &:hover:not(:disabled) {
      background: hsl(207, 90%, 95%);
      color: hsl(207, 90%, 35%);
      border-color: hsl(207, 90%, 80%);
    }
  }

  &--delete {
    color: hsl(0, 84%, 45%);

    &:hover:not(:disabled) {
      background: hsl(0, 84%, 95%);
      color: hsl(0, 84%, 35%);
      border-color: hsl(0, 84%, 80%);
    }
  }

  &--view {
    color: hsl(142, 76%, 45%);

    &:hover:not(:disabled) {
      background: hsl(142, 76%, 95%);
      color: hsl(142, 76%, 35%);
      border-color: hsl(142, 76%, 80%);
    }
  }

  &--download {
    color: hsl(45, 93%, 45%);

    &:hover:not(:disabled) {
      background: hsl(45, 93%, 95%);
      color: hsl(45, 93%, 35%);
      border-color: hsl(45, 93%, 80%);
    }
  }

  &--custom {
    color: hsl(258, 100%, 47%);

    &:hover:not(:disabled) {
      background: hsl(263, 100%, 95%);
      color: hsl(258, 100%, 35%);
      border-color: hsl(263, 100%, 80%);
    }
  }

  // Size variants
  .ui-table-actions--small & {
    padding: 0.25rem;
    min-width: 1.5rem;
    min-height: 1.5rem;
    font-size: 0.75rem;

    .ui-table-action__icon {
      font-size: 0.75rem;
    }
  }

  .ui-table-actions--large & {
    padding: 0.5rem;
    min-width: 2.5rem;
    min-height: 2.5rem;
    font-size: 1rem;

    .ui-table-action__icon {
      font-size: 1rem;
    }
  }

  // States
  &--disabled {
    opacity: 0.4;
    cursor: not-allowed;
    pointer-events: none;
  }

  &--active {
    background: hsl(289, 14%, 90%);
    color: hsl(279, 14%, 11%);
    border-color: hsl(289, 14%, 80%);
  }

  // More button specific styles
  &--more {
    color: hsl(287, 12%, 47%);

    &:hover:not(:disabled) {
      background: hsl(289, 14%, 90%);
      color: hsl(279, 14%, 11%);
    }

    &.ui-table-action--active {
      background: hsl(258, 100%, 95%);
      color: hsl(258, 100%, 47%);
      border-color: hsl(258, 100%, 80%);
    }
  }
}

.ui-table-action__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 0.875rem;
  line-height: 1;
  flex-shrink: 0;

  // Icon-only adjustments
  .ui-table-actions:not(.ui-table-actions--with-labels) & {
    margin: 0;
  }
}

.ui-table-action__label {
  font-size: 0.8125rem;
  white-space: nowrap;
  flex-shrink: 0;

  // Hide labels by default, show when --with-labels
  .ui-table-actions:not(.ui-table-actions--with-labels) & {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
  }
}

// Dropdown styles
.ui-table-actions__dropdown {
  position: relative;
  display: inline-flex;
}

.ui-table-actions__dropdown-menu {
  position: absolute;
  top: calc(100% + 0.25rem);
  right: 0;
  min-width: 10rem;
  background: hsl(286, 20%, 99%);
  border: 1px solid hsl(289, 14%, 80%);
  border-radius: 0.375rem;
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
  padding: 0.25rem;
  z-index: 50;
  animation: dropdown-appear 150ms cubic-bezier(0, 0, 0.2, 1);

  // Ensure dropdown is on top
  &::before {
    content: '';
    position: absolute;
    top: -0.25rem;
    right: 0.75rem;
    width: 0;
    height: 0;
    border-left: 0.25rem solid transparent;
    border-right: 0.25rem solid transparent;
    border-bottom: 0.25rem solid hsl(289, 14%, 80%);
  }

  &::after {
    content: '';
    position: absolute;
    top: -0.1875rem;
    right: 0.8125rem;
    width: 0;
    height: 0;
    border-left: 0.1875rem solid transparent;
    border-right: 0.1875rem solid transparent;
    border-bottom: 0.1875rem solid hsl(286, 20%, 99%);
  }
}

.ui-table-actions__dropdown-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  width: 100%;
  padding: 0.5rem 0.75rem;
  border: none;
  border-radius: 0.25rem;
  background: transparent;
  color: hsl(279, 14%, 11%);
  font-family: inherit;
  font-size: 0.875rem;
  font-weight: 500;
  text-align: left;
  cursor: pointer;
  transition: background-color 150ms ease;

  &:hover:not(:disabled) {
    background: hsl(289, 14%, 96%);
  }

  &:focus-visible {
    outline: 2px solid hsl(258, 100%, 47%);
    outline-offset: -2px;
  }

  &:disabled {
    opacity: 0.4;
    cursor: not-allowed;
  }

  .ui-table-action__icon {
    font-size: 0.875rem;
  }

  .ui-table-action__label {
    position: static;
    width: auto;
    height: auto;
    padding: 0;
    margin: 0;
    overflow: visible;
    clip: auto;
    white-space: normal;
    border: none;
  }
}

// Animation for dropdown
@keyframes dropdown-appear {
  0% {
    opacity: 0;
    transform: translateY(-0.25rem) scale(0.98);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

// Tooltip support (when labels are hidden)
.ui-table-actions:not(.ui-table-actions--with-labels) {
  .ui-table-action {
    position: relative;

    &[title]:hover::after {
      content: attr(title);
      position: absolute;
      bottom: calc(100% + 0.5rem);
      left: 50%;
      transform: translateX(-50%);
      padding: 0.375rem 0.5rem;
      background: hsl(279, 14%, 11%);
      color: white;
      font-size: 0.75rem;
      white-space: nowrap;
      border-radius: 0.25rem;
      z-index: 100;
      animation: tooltip-appear 150ms ease-out;
    }

    &[title]:hover::before {
      content: '';
      position: absolute;
      bottom: calc(100% + 0.125rem);
      left: 50%;
      transform: translateX(-50%);
      width: 0;
      height: 0;
      border-left: 0.25rem solid transparent;
      border-right: 0.25rem solid transparent;
      border-top: 0.25rem solid hsl(279, 14%, 11%);
      z-index: 100;
    }
  }
}

@keyframes tooltip-appear {
  0% {
    opacity: 0;
    transform: translateX(-50%) translateY(0.125rem);
  }
  100% {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
  }
}

// Responsive design
@media (max-width: 640px) {
  .ui-table-actions {
    &--with-labels .ui-table-action__label {
      display: none;
    }

    &--with-labels {
      gap: 0.25rem;
    }
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .ui-table-action {
    border: 1px solid;

    &:hover:not(:disabled) {
      border-width: 2px;
    }
  }

  .ui-table-actions__dropdown-menu {
    border-width: 2px;
  }
}

// Reduced motion
@media (prefers-reduced-motion: reduce) {
  .ui-table-action,
  .ui-table-actions__dropdown-menu,
  .ui-table-actions__dropdown-item {
    transition: none;
  }

  .ui-table-actions__dropdown-menu {
    animation: none;
  }
}d<8x[evgqFbQjniF&9 PtXx[evrqFbQjni~qQ~qIeNj~qjnb^If~f^JjF<9 qx import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';

export type ActionVariant = 'edit' | 'delete' | 'view' | 'download' | 'custom';
export type ActionSize = 'small' | 'medium' | 'large';

export interface TableAction {
  id: string;
  label: string;
  variant: ActionVariant;
  icon?: string;
  disabled?: boolean;
  hidden?: boolean;
  tooltip?: string;
  confirmMessage?: string;
}

@Component({
  selector: 'ui-table-actions',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div [class]="containerClasses">
      @for (action of visibleActions; track action.id) {
        <button
          [class]="getActionClasses(action)"
          [disabled]="action.disabled"
          [title]="action.tooltip || action.label"
          [attr.aria-label]="action.label"
          (click)="handleActionClick(action, $event)"
          type="button"
        >
          @if (action.icon) {
            <span class="ui-table-action__icon" [innerHTML]="action.icon"></span>
          }
          @if (showLabels) {
            <span class="ui-table-action__label">{{ action.label }}</span>
          }
        </button>
      }
      
      @if (hasMoreActions) {
        <div class="ui-table-actions__dropdown" [class.ui-table-actions__dropdown--open]="dropdownOpen">
          <button
            class="ui-table-action ui-table-action--more"
            [class]="getMoreButtonClasses()"
            (click)="toggleDropdown()"
            [attr.aria-expanded]="dropdownOpen"
            [attr.aria-haspopup]="true"
            type="button"
          >
            <span class="ui-table-action__icon">⋯</span>
            @if (showLabels) {
              <span class="ui-table-action__label">More</span>
            }
          </button>
          
          @if (dropdownOpen) {
            <div class="ui-table-actions__dropdown-menu" role="menu">
              @for (action of hiddenActions; track action.id) {
                <button
                  class="ui-table-actions__dropdown-item"
                  [disabled]="action.disabled"
                  [attr.aria-label]="action.label"
                  (click)="handleActionClick(action, $event)"
                  role="menuitem"
                  type="button"
                >
                  @if (action.icon) {
                    <span class="ui-table-action__icon" [innerHTML]="action.icon"></span>
                  }
                  <span class="ui-table-action__label">{{ action.label }}</span>
                </button>
              }
            </div>
          }
        </div>
      }
    </div>
  `,
  styleUrl: './table-actions.component.scss'
})
export class TableActionsComponent {
  @Input() actions: TableAction[] = [];
  @Input() size: ActionSize = 'medium';
  @Input() maxVisibleActions: number = 3;
  @Input() showLabels: boolean = false;
  @Input() compact: boolean = false;
  @Input() data: any = null; // Row data passed to action handlers
  @Input() index: number = -1; // Row index
  @Input() class: string = '';

  @Output() actionClick = new EventEmitter<{action: TableAction, data: any, index: number, event: Event}>();

  dropdownOpen = false;

  get visibleActions(): TableAction[] {
    const filtered = this.actions.filter(action => !action.hidden);
    return filtered.slice(0, this.maxVisibleActions);
  }

  get hiddenActions(): TableAction[] {
    const filtered = this.actions.filter(action => !action.hidden);
    return filtered.slice(this.maxVisibleActions);
  }

  get hasMoreActions(): boolean {
    return this.hiddenActions.length > 0;
  }

  get containerClasses(): string {
    return [
      'ui-table-actions',
      `ui-table-actions--${this.size}`,
      this.compact ? 'ui-table-actions--compact' : '',
      this.showLabels ? 'ui-table-actions--with-labels' : '',
      this.class
    ].filter(Boolean).join(' ');
  }

  getActionClasses(action: TableAction): string {
    return [
      'ui-table-action',
      `ui-table-action--${action.variant}`,
      action.disabled ? 'ui-table-action--disabled' : '',
    ].filter(Boolean).join(' ');
  }

  getMoreButtonClasses(): string {
    return [
      `ui-table-action--${this.size}`,
      this.dropdownOpen ? 'ui-table-action--active' : ''
    ].filter(Boolean).join(' ');
  }

  handleActionClick(action: TableAction, event: Event): void {
    if (action.disabled) {
      return;
    }

    // Close dropdown if it's open
    this.dropdownOpen = false;

    // Handle confirmation if required
    if (action.confirmMessage) {
      if (!confirm(action.confirmMessage)) {
        return;
      }
    }

    this.actionClick.emit({
      action,
      data: this.data,
      index: this.index,
      event
    });
  }

  toggleDropdown(): void {
    this.dropdownOpen = !this.dropdownOpen;
    
    if (this.dropdownOpen) {
      // Close dropdown when clicking outside
      setTimeout(() => {
        const handleClickOutside = (event: Event) => {
          const target = event.target as Element;
          if (!target.closest('.ui-table-actions__dropdown')) {
            this.dropdownOpen = false;
            document.removeEventListener('click', handleClickOutside);
          }
        };
        document.addEventListener('click', handleClickOutside);
      });
    }
  }
}4lkx|@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;
// Modern table component using design tokens
.ui-table-container {
  position: relative;
  width: 100%;
  overflow: auto;
  background: hsl(286, 20%, 99%); // Surface color
  border-radius: 0.5rem;
  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);

  // Sticky header container
  &--sticky-header {
    max-height: 400px;
    
    .ui-table__header {
      position: sticky;
      top: 0;
      z-index: 10;
      background: hsl(285, 9%, 87%); // Surface dim
    }
  }

  // Max height container
  &--max-height {
    max-height: var(--ui-table-max-height, 500px);
  }

  // Loading state
  &--loading {
    pointer-events: none;
  }
}

.ui-table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  position: relative;

  // Subtle noise texture for modern brutalist feel
  &::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"><filter id="noise"><feTurbulence type="fractalNoise" baseFrequency="0.9" numOctaves="1" stitchTiles="stitch"/><feColorMatrix type="saturate" values="0"/></filter><rect width="100%" height="100%" filter="url(%23noise)" opacity="0.02"/></svg>');
    pointer-events: none;
    mix-blend-mode: overlay;
    border-radius: inherit;
    z-index: 1;
  }

  // Size variants
  &--compact {
    .ui-table__header-cell,
    .ui-table__body-cell {
      padding: 0.5rem 0.75rem;
      font-size: 0.875rem;
    }
  }

  &--default {
    .ui-table__header-cell,
    .ui-table__body-cell {
      padding: 0.75rem 1rem;
      font-size: 0.875rem;
    }
  }

  &--comfortable {
    .ui-table__header-cell,
    .ui-table__body-cell {
      padding: 1rem 1.25rem;
      font-size: 1rem;
    }
  }

  // Style variants
  &--bordered {
    border: 1px solid hsl(289, 14%, 80%);
    
    .ui-table__header-cell,
    .ui-table__body-cell {
      border-right: 1px solid hsl(289, 14%, 80%);
      
      &:last-child {
        border-right: none;
      }
    }

    .ui-table__body-row {
      border-bottom: 1px solid hsl(289, 14%, 80%);
    }
  }

  &--minimal {
    .ui-table__header {
      border-bottom: 2px solid hsl(258, 100%, 47%);
    }

    .ui-table__body-row {
      border-bottom: none;
      
      &:not(:last-child) {
        border-bottom: 1px solid hsl(289, 14%, 90%);
      }
    }
  }

  // Hover effects
  &--hoverable {
    .ui-table__body-row {
      transition: background-color 150ms cubic-bezier(0, 0, 0.2, 1);
      cursor: pointer;

      &:hover {
        background: hsl(289, 14%, 96%);
        position: relative;
        z-index: 2;
      }
    }
  }

  // Selection
  &--selectable {
    .ui-table__body-row {
      cursor: pointer;

      &--selected {
        background: hsl(263, 100%, 95%);
        border-left: 3px solid hsl(258, 100%, 47%);
      }
    }
  }
}

// Header styles
.ui-table__header {
  background: hsl(285, 9%, 87%);
  border-bottom: 2px solid hsl(287, 12%, 59%);
  position: relative;
  z-index: 5;
}

.ui-table__header-row {
  // No additional styles needed
}

.ui-table__header-cell {
  text-align: left;
  font-weight: 700;
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: hsl(279, 14%, 11%);
  position: relative;
  white-space: nowrap;
  user-select: none;

  // Alignment variants
  &--left {
    text-align: left;
  }

  &--center {
    text-align: center;
  }

  &--right {
    text-align: right;
  }

  // Sortable headers
  &--sortable {
    cursor: pointer;
    transition: background-color 150ms ease;

    &:hover {
      background: hsl(285, 9%, 82%);
    }

    &--sorted {
      color: hsl(258, 100%, 47%);
      background: hsl(263, 100%, 95%);
    }
  }

  // Sticky columns
  &--sticky {
    position: sticky;
    left: 0;
    background: inherit;
    z-index: 6;
    box-shadow: 2px 0 4px rgba(0, 0, 0, 0.1);
  }
}

.ui-table__header-content {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  min-height: 1.5rem;
}

.ui-table__header-text {
  flex: 1;
}

.ui-table__sort-indicator {
  font-size: 0.875rem;
  color: hsl(258, 100%, 47%);
  font-weight: bold;
  opacity: 0.8;
  
  &[data-direction="asc"] {
    opacity: 1;
  }
  
  &[data-direction="desc"] {
    opacity: 1;
  }
}

// Body styles
.ui-table__body {
  position: relative;
  z-index: 2;
}

.ui-table__body-row {
  transition: all 150ms cubic-bezier(0, 0, 0.2, 1);
  border-bottom: 1px solid hsl(289, 14%, 90%);

  &:last-child {
    border-bottom: none;
  }

  // Striped variant
  &--striped {
    background: hsl(289, 14%, 98%);
  }

  // Selection state
  &--selected {
    background: hsl(263, 100%, 95%);
    box-shadow: inset 3px 0 0 hsl(258, 100%, 47%);
  }
}

.ui-table__body-cell {
  color: hsl(279, 14%, 11%);
  font-weight: 400;
  line-height: 1.5;
  position: relative;

  // Alignment variants
  &--left {
    text-align: left;
  }

  &--center {
    text-align: center;
  }

  &--right {
    text-align: right;
  }

  // Sticky columns
  &--sticky {
    position: sticky;
    left: 0;
    background: inherit;
    z-index: 3;
    box-shadow: 2px 0 4px rgba(0, 0, 0, 0.05);

    .ui-table__body-row:hover & {
      background: hsl(289, 14%, 96%);
    }

    .ui-table__body-row--selected & {
      background: hsl(263, 100%, 95%);
    }

    .ui-table__body-row--striped & {
      background: hsl(289, 14%, 98%);
    }
  }
}

.ui-table__cell-content {
  display: block;
  width: 100%;
  word-break: break-word;
}

// Empty state
.ui-table__empty-row {
  background: transparent;
  
  &:hover {
    background: transparent !important;
  }
}

.ui-table__empty-cell {
  padding: 3rem 1rem;
  text-align: center;
  border-bottom: none;
}

.ui-table__empty-content {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
}

.ui-table__empty-text {
  color: hsl(287, 12%, 47%);
  font-size: 1rem;
  font-weight: 500;
}

// Loading overlay
.ui-table__loading-overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(255, 255, 255, 0.9);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1rem;
  z-index: 20;
  backdrop-filter: blur(2px);
}

.ui-table__loading-spinner {
  width: 2rem;
  height: 2rem;
  border: 3px solid hsl(289, 14%, 80%);
  border-top: 3px solid hsl(258, 100%, 47%);
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

.ui-table__loading-text {
  color: hsl(287, 12%, 47%);
  font-size: 0.875rem;
  font-weight: 500;
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

// Responsive design
@media (max-width: 768px) {
  .ui-table-container {
    border-radius: 0;
    margin: 0 -1rem;
  }

  .ui-table {
    &--compact {
      .ui-table__header-cell,
      .ui-table__body-cell {
        padding: 0.375rem 0.5rem;
        font-size: 0.8125rem;
      }
    }

    &--default {
      .ui-table__header-cell,
      .ui-table__body-cell {
        padding: 0.5rem 0.625rem;
        font-size: 0.8125rem;
      }
    }
  }

  .ui-table__header-cell,
  .ui-table__body-cell {
    &:first-child {
      padding-left: 1rem;
    }

    &:last-child {
      padding-right: 1rem;
    }
  }
}

// Focus management
.ui-table__header-cell--sortable:focus-visible {
  outline: 2px solid hsl(258, 100%, 47%);
  outline-offset: -2px;
}

// Print styles
@media print {
  .ui-table-container {
    box-shadow: none;
    border: 1px solid #000;
  }

  .ui-table {
    &::before {
      display: none;
    }
  }

  .ui-table__loading-overlay {
    display: none;
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .ui-table {
    border: 2px solid;
  }

  .ui-table__header-cell,
  .ui-table__body-cell {
    border: 1px solid;
  }

  .ui-table__body-row:hover {
    background: highlight;
    color: highlighttext;
  }
}Sxkc7A8#(5E4sF< SxK(/*QRH+UP/MKK-K+Q @xVimport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

export type TimelineSize = 'sm' | 'md' | 'lg';
export type TimelineVariant = 'primary' | 'secondary' | 'success';
export type TimelineOrientation = 'vertical' | 'horizontal';
export type TimelineItemStatus = 'pending' | 'active' | 'completed' | 'error';

export interface TimelineItem {
  id: string;
  title: string;
  description?: string;
  timestamp?: string;
  status: TimelineItemStatus;
}

@Component({
  selector: 'ui-timeline',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-timeline"
      [class]="getComponentClasses()"
      [attr.role]="'list'"
      [attr.aria-label]="ariaLabel || 'Timeline'">
      
      @for (item of items; track item.id) {
        <div 
          class="ui-timeline__item"
          [class]="getItemClasses(item)"
          [attr.role]="'listitem'"
          [attr.aria-label]="getItemAriaLabel(item)">
          
          <div 
            class="ui-timeline__marker"
            [attr.aria-hidden]="true">
          </div>
          
          <div class="ui-timeline__content">
            @if (item.title) {
              <div class="ui-timeline__title">
                {{ item.title }}
              </div>
            }
            
            @if (item.description) {
              <div class="ui-timeline__description">
                {{ item.description }}
              </div>
            }
            
            @if (item.timestamp) {
              <div class="ui-timeline__timestamp">
                {{ item.timestamp }}
              </div>
            }
          </div>
        </div>
      }
    </div>
  `,
  styleUrl: './timeline.component.scss'
})
export class TimelineComponent {
  @Input() items: TimelineItem[] = [];
  @Input() size: TimelineSize = 'md';
  @Input() variant: TimelineVariant = 'primary';
  @Input() orientation: TimelineOrientation = 'vertical';
  @Input() ariaLabel?: string;

  getComponentClasses(): string {
    const classes = [
      'ui-timeline',
      `ui-timeline--${this.size}`,
      `ui-timeline--${this.variant}`,
      `ui-timeline--${this.orientation}`
    ];
    
    return classes.join(' ');
  }

  getItemClasses(item: TimelineItem): string {
    const classes = [
      'ui-timeline__item',
      `ui-timeline__item--${item.status}`
    ];
    
    return classes.join(' ');
  }

  getItemAriaLabel(item: TimelineItem): string {
    const status = this.getStatusLabel(item.status);
    const title = item.title || 'Timeline item';
    const timestamp = item.timestamp ? `, ${item.timestamp}` : '';
    return `${title}, ${status}${timestamp}`;
  }

  private getStatusLabel(status: TimelineItemStatus): string {
    switch (status) {
      case 'completed':
        return 'completed';
      case 'active':
        return 'in progress';
      case 'pending':
        return 'pending';
      case 'error':
        return 'error';
      default:
        return status;
    }
  }
}Tadx&Cl/s^inIfnjNf^nuuqfUjmmĥ 9J2Jl2SJK2|dU棆3KRsA@^1PYi1X3#K,fV@& %Jx$ export * from './tooltip.component';XӸx7@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-tooltip-wrapper {
  position: relative;
  display: inline-block;
}

.ui-tooltip-trigger {
  display: inherit;
  width: inherit;
  height: inherit;
}

.ui-tooltip {
  position: absolute;
  z-index: $semantic-z-index-tooltip;
  background: $semantic-color-surface-elevated;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  border-radius: $semantic-border-radius-md;
  box-shadow: $semantic-shadow-elevation-3;
  pointer-events: none;
  opacity: 1;
  transform: scale(1);
  animation: tooltip-fade-in $semantic-motion-duration-fast $semantic-easing-standard;
  
  // Size variants
  &--sm {
    max-width: 200px;
    
    .ui-tooltip__content {
      padding: $semantic-spacing-component-xs;
      font-size: $semantic-typography-font-size-xs;
    }
  }
  
  &--md {
    max-width: 250px;
    
    .ui-tooltip__content {
      padding: $semantic-spacing-component-sm;
      font-size: $semantic-typography-font-size-sm;
    }
  }
  
  &--lg {
    max-width: 300px;
    
    .ui-tooltip__content {
      padding: $semantic-spacing-component-md;
      font-size: $semantic-typography-font-size-sm;
    }
  }
  
  // Position variants
  &--top {
    bottom: 100%;
    left: 50%;
    transform: translateX(-50%) translateY(-8px);
    margin-bottom: $semantic-spacing-component-xs;
    
    .ui-tooltip__arrow {
      top: 100%;
      left: 50%;
      transform: translateX(-50%);
      border-top-color: $semantic-color-surface-elevated;
      border-bottom: none;
    }
  }
  
  &--bottom {
    top: 100%;
    left: 50%;
    transform: translateX(-50%) translateY(8px);
    margin-top: $semantic-spacing-component-xs;
    
    .ui-tooltip__arrow {
      bottom: 100%;
      left: 50%;
      transform: translateX(-50%);
      border-bottom-color: $semantic-color-surface-elevated;
      border-top: none;
    }
  }
  
  &--left {
    right: 100%;
    top: 50%;
    transform: translateY(-50%) translateX(-8px);
    margin-right: $semantic-spacing-component-xs;
    
    .ui-tooltip__arrow {
      left: 100%;
      top: 50%;
      transform: translateY(-50%);
      border-left-color: $semantic-color-surface-elevated;
      border-right: none;
    }
  }
  
  &--right {
    left: 100%;
    top: 50%;
    transform: translateY(-50%) translateX(8px);
    margin-left: $semantic-spacing-component-xs;
    
    .ui-tooltip__arrow {
      right: 100%;
      top: 50%;
      transform: translateY(-50%);
      border-right-color: $semantic-color-surface-elevated;
      border-left: none;
    }
  }
  
  &__content {
    color: $semantic-color-text-primary;
    line-height: 1.4;
    word-wrap: break-word;
    text-align: center;
  }
  
  &__arrow {
    position: absolute;
    width: 0;
    height: 0;
    border: 6px solid transparent;
    
    // Default arrow styling
    border-top: 6px solid $semantic-color-surface-elevated;
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
  }
  
  // Dark mode support
  :host-context(.dark-theme) & {
    background: $semantic-color-surface-secondary;
    border-color: $semantic-color-border-primary;
    
    .ui-tooltip__content {
      color: $semantic-color-text-primary;
    }
    
    .ui-tooltip__arrow {
      border-top-color: $semantic-color-surface-secondary;
      
      &::after {
        border-top-color: $semantic-color-surface-secondary;
      }
    }
    
    &--bottom .ui-tooltip__arrow {
      border-bottom-color: $semantic-color-surface-secondary;
      border-top: none;
    }
    
    &--left .ui-tooltip__arrow {
      border-left-color: $semantic-color-surface-secondary;
      border-right: none;
    }
    
    &--right .ui-tooltip__arrow {
      border-right-color: $semantic-color-surface-secondary;
      border-left: none;
    }
  }
  
  // Responsive adjustments
  @media (max-width: $semantic-breakpoint-sm - 1) {
    &--sm { max-width: 150px; }
    &--md { max-width: 200px; }
    &--lg { max-width: 250px; }
    
    .ui-tooltip__content {
      padding: $semantic-spacing-component-xs;
      font-size: $semantic-typography-font-size-xs;
    }
  }
}

// Animation keyframes
@keyframes tooltip-fade-in {
  from {
    opacity: 0;
    transform: scale(0.95);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}L6}Vx;xPqgqFbQjniF Qeximport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, OnDestroy, ElementRef, ViewChild, signal } from '@angular/core';
import { CommonModule } from '@angular/common';

type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';
type TooltipTrigger = 'hover' | 'click' | 'focus';
type TooltipSize = 'sm' | 'md' | 'lg';

@Component({
  selector: 'ui-tooltip',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-tooltip-wrapper"
      (mouseenter)="handleMouseEnter()"
      (mouseleave)="handleMouseLeave()"
      (click)="handleClick($event)"
      (focus)="handleFocus()"
      (blur)="handleBlur()">
      
      <!-- Trigger content -->
      <div class="ui-tooltip-trigger">
        <ng-content></ng-content>
      </div>
      
      <!-- Tooltip content -->
      @if (isVisible()) {
        <div 
          #tooltipElement
          class="ui-tooltip"
          [class.ui-tooltip--top]="position === 'top'"
          [class.ui-tooltip--bottom]="position === 'bottom'"
          [class.ui-tooltip--left]="position === 'left'"
          [class.ui-tooltip--right]="position === 'right'"
          [class.ui-tooltip--sm]="size === 'sm'"
          [class.ui-tooltip--md]="size === 'md'"
          [class.ui-tooltip--lg]="size === 'lg'"
          [attr.role]="'tooltip'"
          [attr.aria-hidden]="!isVisible()">
          
          <div class="ui-tooltip__content">
            {{ text }}
          </div>
          
          <div class="ui-tooltip__arrow"></div>
        </div>
      }
    </div>
  `,
  styleUrl: './tooltip.component.scss'
})
export class TooltipComponent implements OnDestroy {
  @ViewChild('tooltipElement') tooltipElement?: ElementRef;
  
  @Input() text = '';
  @Input() position: TooltipPosition = 'top';
  @Input() trigger: TooltipTrigger = 'hover';
  @Input() size: TooltipSize = 'md';
  @Input() disabled = false;
  @Input() delay = 500;
  
  @Output() tooltipShow = new EventEmitter<void>();
  @Output() tooltipHide = new EventEmitter<void>();
  
  protected isVisible = signal(false);
  private showTimeout?: number;
  private hideTimeout?: number;
  
  ngOnDestroy(): void {
    this.clearTimeouts();
  }
  
  handleMouseEnter(): void {
    if (this.trigger === 'hover' && !this.disabled) {
      this.scheduleShow();
    }
  }
  
  handleMouseLeave(): void {
    if (this.trigger === 'hover') {
      this.scheduleHide();
    }
  }
  
  handleClick(event: MouseEvent): void {
    if (this.trigger === 'click' && !this.disabled) {
      event.preventDefault();
      this.toggle();
    }
  }
  
  handleFocus(): void {
    if (this.trigger === 'focus' && !this.disabled) {
      this.show();
    }
  }
  
  handleBlur(): void {
    if (this.trigger === 'focus') {
      this.hide();
    }
  }
  
  private scheduleShow(): void {
    this.clearTimeouts();
    this.showTimeout = window.setTimeout(() => {
      this.show();
    }, this.delay);
  }
  
  private scheduleHide(): void {
    this.clearTimeouts();
    this.hideTimeout = window.setTimeout(() => {
      this.hide();
    }, 100);
  }
  
  private show(): void {
    if (!this.disabled && !this.isVisible()) {
      this.isVisible.set(true);
      this.tooltipShow.emit();
    }
  }
  
  private hide(): void {
    if (this.isVisible()) {
      this.isVisible.set(false);
      this.tooltipHide.emit();
    }
  }
  
  private toggle(): void {
    if (this.isVisible()) {
      this.hide();
    } else {
      this.show();
    }
  }
  
  private clearTimeouts(): void {
    if (this.showTimeout) {
      clearTimeout(this.showTimeout);
      this.showTimeout = undefined;
    }
    if (this.hideTimeout) {
      clearTimeout(this.hideTimeout);
      this.hideTimeout = undefined;
    }
  }
}Y0xx HqTB$
Pܓvaf\6κx* export * from './transfer-list.component';@-
xTPimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal, computed } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { 
  faChevronRight, 
  faChevronLeft, 
  faAnglesRight, 
  faAnglesLeft,
  faSearch,
  faTimes
} from '@fortawesome/free-solid-svg-icons';

export interface TransferListItem {
  id: string | number;
  label: string;
  disabled?: boolean;
  data?: any;
}

export type TransferListSize = 'sm' | 'md' | 'lg';

@Component({
  selector: 'ui-transfer-list',
  standalone: true,
  imports: [CommonModule, FormsModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-transfer-list"
      [class.ui-transfer-list--{{size}}]="size"
      [class.ui-transfer-list--disabled]="disabled"
      role="application"
      [attr.aria-label]="ariaLabel || 'Transfer list'"
    >
      <!-- Source List -->
      <div class="ui-transfer-list__panel ui-transfer-list__panel--source">
        <div class="ui-transfer-list__header">
          <h3 class="ui-transfer-list__title">{{ sourceTitle }}</h3>
          @if (showSearch) {
            <div class="ui-transfer-list__search">
              <fa-icon [icon]="faSearch" class="ui-transfer-list__search-icon"></fa-icon>
              <input
                type="text"
                class="ui-transfer-list__search-input"
                [(ngModel)]="sourceSearchTerm"
                [placeholder]="searchPlaceholder"
                [disabled]="disabled"
                (input)="updateSourceSearch()"
              />
              @if (sourceSearchTerm()) {
                <button
                  type="button"
                  class="ui-transfer-list__search-clear"
                  (click)="clearSourceSearch()"
                  [disabled]="disabled"
                  aria-label="Clear search"
                >
                  <fa-icon [icon]="faTimes"></fa-icon>
                </button>
              }
            </div>
          }
          @if (showSelectAll) {
            <label class="ui-transfer-list__select-all">
              <input
                type="checkbox"
                [checked]="isAllSourceSelected()"
                [indeterminate]="isSourceIndeterminate()"
                [disabled]="disabled || filteredSourceItems().length === 0"
                (change)="toggleAllSource($event)"
              />
              <span>Select all ({{ getSourceSelectedCount() }}/{{ filteredSourceItems().length }})</span>
            </label>
          }
        </div>
        
        <div class="ui-transfer-list__list-container">
          <div 
            class="ui-transfer-list__list"
            role="listbox"
            [attr.aria-label]="sourceTitle + ' items'"
            tabindex="0"
            (keydown)="handleSourceKeydown($event)"
          >
            @if (filteredSourceItems().length === 0) {
              <div class="ui-transfer-list__empty" role="option">
                @if (sourceSearchTerm()) {
                  No items match your search
                } @else {
                  No items available
                }
              </div>
            } @else {
              @for (item of filteredSourceItems(); track item.id) {
                <div
                  class="ui-transfer-list__item"
                  [class.ui-transfer-list__item--selected]="isSourceItemSelected(item.id)"
                  [class.ui-transfer-list__item--disabled]="disabled || item.disabled"
                  role="option"
                  [attr.aria-selected]="isSourceItemSelected(item.id)"
                  [attr.aria-disabled]="disabled || item.disabled"
                  [tabindex]="disabled || item.disabled ? -1 : 0"
                  (click)="toggleSourceItem(item)"
                  (keydown)="handleItemKeydown($event, item, 'source')"
                >
                  @if (showCheckboxes) {
                    <input
                      type="checkbox"
                      class="ui-transfer-list__checkbox"
                      [checked]="isSourceItemSelected(item.id)"
                      [disabled]="disabled || item.disabled"
                      (change)="toggleSourceItem(item)"
                      tabindex="-1"
                    />
                  }
                  <span class="ui-transfer-list__item-label">{{ item.label }}</span>
                </div>
              }
            }
          </div>
        </div>
        
        <div class="ui-transfer-list__footer">
          {{ getSourceSelectedCount() }} of {{ filteredSourceItems().length }} selected
        </div>
      </div>

      <!-- Transfer Controls -->
      <div class="ui-transfer-list__controls">
        <button
          type="button"
          class="ui-transfer-list__control-btn"
          [disabled]="disabled || selectedSourceItems().length === 0"
          (click)="moveSelectedToTarget()"
          [attr.aria-label]="'Move ' + selectedSourceItems().length + ' selected items to ' + targetTitle"
          title="Move selected items"
        >
          <fa-icon [icon]="faChevronRight"></fa-icon>
        </button>
        
        @if (showMoveAll) {
          <button
            type="button"
            class="ui-transfer-list__control-btn"
            [disabled]="disabled || filteredSourceItems().length === 0"
            (click)="moveAllToTarget()"
            [attr.aria-label]="'Move all ' + filteredSourceItems().length + ' items to ' + targetTitle"
            title="Move all items"
          >
            <fa-icon [icon]="faAnglesRight"></fa-icon>
          </button>
        }
        
        @if (showMoveAll) {
          <button
            type="button"
            class="ui-transfer-list__control-btn"
            [disabled]="disabled || filteredTargetItems().length === 0"
            (click)="moveAllToSource()"
            [attr.aria-label]="'Move all ' + filteredTargetItems().length + ' items back to ' + sourceTitle"
            title="Move all items back"
          >
            <fa-icon [icon]="faAnglesLeft"></fa-icon>
          </button>
        }
        
        <button
          type="button"
          class="ui-transfer-list__control-btn"
          [disabled]="disabled || selectedTargetItems().length === 0"
          (click)="moveSelectedToSource()"
          [attr.aria-label]="'Move ' + selectedTargetItems().length + ' selected items back to ' + sourceTitle"
          title="Move selected items back"
        >
          <fa-icon [icon]="faChevronLeft"></fa-icon>
        </button>
      </div>

      <!-- Target List -->
      <div class="ui-transfer-list__panel ui-transfer-list__panel--target">
        <div class="ui-transfer-list__header">
          <h3 class="ui-transfer-list__title">{{ targetTitle }}</h3>
          @if (showSearch) {
            <div class="ui-transfer-list__search">
              <fa-icon [icon]="faSearch" class="ui-transfer-list__search-icon"></fa-icon>
              <input
                type="text"
                class="ui-transfer-list__search-input"
                [(ngModel)]="targetSearchTerm"
                [placeholder]="searchPlaceholder"
                [disabled]="disabled"
                (input)="updateTargetSearch()"
              />
              @if (targetSearchTerm()) {
                <button
                  type="button"
                  class="ui-transfer-list__search-clear"
                  (click)="clearTargetSearch()"
                  [disabled]="disabled"
                  aria-label="Clear search"
                >
                  <fa-icon [icon]="faTimes"></fa-icon>
                </button>
              }
            </div>
          }
          @if (showSelectAll) {
            <label class="ui-transfer-list__select-all">
              <input
                type="checkbox"
                [checked]="isAllTargetSelected()"
                [indeterminate]="isTargetIndeterminate()"
                [disabled]="disabled || filteredTargetItems().length === 0"
                (change)="toggleAllTarget($event)"
              />
              <span>Select all ({{ getTargetSelectedCount() }}/{{ filteredTargetItems().length }})</span>
            </label>
          }
        </div>
        
        <div class="ui-transfer-list__list-container">
          <div 
            class="ui-transfer-list__list"
            role="listbox"
            [attr.aria-label]="targetTitle + ' items'"
            tabindex="0"
            (keydown)="handleTargetKeydown($event)"
          >
            @if (filteredTargetItems().length === 0) {
              <div class="ui-transfer-list__empty" role="option">
                @if (targetSearchTerm()) {
                  No items match your search
                } @else {
                  No items selected
                }
              </div>
            } @else {
              @for (item of filteredTargetItems(); track item.id) {
                <div
                  class="ui-transfer-list__item"
                  [class.ui-transfer-list__item--selected]="isTargetItemSelected(item.id)"
                  [class.ui-transfer-list__item--disabled]="disabled || item.disabled"
                  role="option"
                  [attr.aria-selected]="isTargetItemSelected(item.id)"
                  [attr.aria-disabled]="disabled || item.disabled"
                  [tabindex]="disabled || item.disabled ? -1 : 0"
                  (click)="toggleTargetItem(item)"
                  (keydown)="handleItemKeydown($event, item, 'target')"
                >
                  @if (showCheckboxes) {
                    <input
                      type="checkbox"
                      class="ui-transfer-list__checkbox"
                      [checked]="isTargetItemSelected(item.id)"
                      [disabled]="disabled || item.disabled"
                      (change)="toggleTargetItem(item)"
                      tabindex="-1"
                    />
                  }
                  <span class="ui-transfer-list__item-label">{{ item.label }}</span>
                </div>
              }
            }
          </div>
        </div>
        
        <div class="ui-transfer-list__footer">
          {{ getTargetSelectedCount() }} of {{ filteredTargetItems().length }} selected
        </div>
      </div>
    </div>
  `,
  styleUrl: './transfer-list.component.scss'
})
export class TransferListComponent {
  // FontAwesome icons
  faChevronRight = faChevronRight;
  faChevronLeft = faChevronLeft;
  faAnglesRight = faAnglesRight;
  faAnglesLeft = faAnglesLeft;
  faSearch = faSearch;
  faTimes = faTimes;

  // Component inputs
  @Input() sourceItems: TransferListItem[] = [];
  @Input() targetItems: TransferListItem[] = [];
  @Input() sourceTitle = 'Available';
  @Input() targetTitle = 'Selected';
  @Input() size: TransferListSize = 'md';
  @Input() disabled = false;
  @Input() showSearch = true;
  @Input() showSelectAll = true;
  @Input() showCheckboxes = true;
  @Input() showMoveAll = true;
  @Input() searchPlaceholder = 'Search items...';
  @Input() ariaLabel?: string;

  // Component outputs
  @Output() sourceChange = new EventEmitter<TransferListItem[]>();
  @Output() targetChange = new EventEmitter<TransferListItem[]>();
  @Output() itemMove = new EventEmitter<{
    item: TransferListItem;
    from: 'source' | 'target';
    to: 'source' | 'target';
  }>();

  // Internal signals for reactive state management
  private sourceItemsSignal = signal<TransferListItem[]>([]);
  private targetItemsSignal = signal<TransferListItem[]>([]);
  private selectedSourceIds = signal<Set<string | number>>(new Set());
  private selectedTargetIds = signal<Set<string | number>>(new Set());
  
  // Search terms
  sourceSearchTerm = signal<string>('');
  targetSearchTerm = signal<string>('');

  // Computed filtered items
  filteredSourceItems = computed(() => {
    const items = this.sourceItemsSignal();
    const searchTerm = this.sourceSearchTerm().toLowerCase().trim();
    
    if (!searchTerm) return items;
    
    return items.filter(item => 
      item.label.toLowerCase().includes(searchTerm)
    );
  });

  filteredTargetItems = computed(() => {
    const items = this.targetItemsSignal();
    const searchTerm = this.targetSearchTerm().toLowerCase().trim();
    
    if (!searchTerm) return items;
    
    return items.filter(item => 
      item.label.toLowerCase().includes(searchTerm)
    );
  });

  // Computed selected items
  selectedSourceItems = computed(() => {
    const selectedIds = this.selectedSourceIds();
    return this.sourceItemsSignal().filter(item => selectedIds.has(item.id));
  });

  selectedTargetItems = computed(() => {
    const selectedIds = this.selectedTargetIds();
    return this.targetItemsSignal().filter(item => selectedIds.has(item.id));
  });

  ngOnInit() {
    this.sourceItemsSignal.set([...this.sourceItems]);
    this.targetItemsSignal.set([...this.targetItems]);
  }

  ngOnChanges() {
    this.sourceItemsSignal.set([...this.sourceItems]);
    this.targetItemsSignal.set([...this.targetItems]);
  }

  // Search methods
  updateSourceSearch() {
    // Clear selection when searching to avoid confusion
    this.selectedSourceIds.set(new Set());
  }

  updateTargetSearch() {
    // Clear selection when searching to avoid confusion
    this.selectedTargetIds.set(new Set());
  }

  clearSourceSearch() {
    this.sourceSearchTerm.set('');
    this.selectedSourceIds.set(new Set());
  }

  clearTargetSearch() {
    this.targetSearchTerm.set('');
    this.selectedTargetIds.set(new Set());
  }

  // Selection methods
  isSourceItemSelected(id: string | number): boolean {
    return this.selectedSourceIds().has(id);
  }

  isTargetItemSelected(id: string | number): boolean {
    return this.selectedTargetIds().has(id);
  }

  toggleSourceItem(item: TransferListItem) {
    if (this.disabled || item.disabled) return;

    const currentSelected = new Set(this.selectedSourceIds());
    if (currentSelected.has(item.id)) {
      currentSelected.delete(item.id);
    } else {
      currentSelected.add(item.id);
    }
    this.selectedSourceIds.set(currentSelected);
  }

  toggleTargetItem(item: TransferListItem) {
    if (this.disabled || item.disabled) return;

    const currentSelected = new Set(this.selectedTargetIds());
    if (currentSelected.has(item.id)) {
      currentSelected.delete(item.id);
    } else {
      currentSelected.add(item.id);
    }
    this.selectedTargetIds.set(currentSelected);
  }

  // Select all methods
  getSourceSelectedCount(): number {
    return this.selectedSourceIds().size;
  }

  getTargetSelectedCount(): number {
    return this.selectedTargetIds().size;
  }

  isAllSourceSelected(): boolean {
    const availableItems = this.filteredSourceItems().filter(item => !item.disabled);
    return availableItems.length > 0 && 
           availableItems.every(item => this.selectedSourceIds().has(item.id));
  }

  isAllTargetSelected(): boolean {
    const availableItems = this.filteredTargetItems().filter(item => !item.disabled);
    return availableItems.length > 0 && 
           availableItems.every(item => this.selectedTargetIds().has(item.id));
  }

  isSourceIndeterminate(): boolean {
    const availableItems = this.filteredSourceItems().filter(item => !item.disabled);
    const selectedCount = availableItems.filter(item => this.selectedSourceIds().has(item.id)).length;
    return selectedCount > 0 && selectedCount < availableItems.length;
  }

  isTargetIndeterminate(): boolean {
    const availableItems = this.filteredTargetItems().filter(item => !item.disabled);
    const selectedCount = availableItems.filter(item => this.selectedTargetIds().has(item.id)).length;
    return selectedCount > 0 && selectedCount < availableItems.length;
  }

  toggleAllSource(event: Event) {
    if (this.disabled) return;

    const target = event.target as HTMLInputElement;
    const availableItems = this.filteredSourceItems().filter(item => !item.disabled);
    
    if (target.checked) {
      const newSelected = new Set(this.selectedSourceIds());
      availableItems.forEach(item => newSelected.add(item.id));
      this.selectedSourceIds.set(newSelected);
    } else {
      const newSelected = new Set(this.selectedSourceIds());
      availableItems.forEach(item => newSelected.delete(item.id));
      this.selectedSourceIds.set(newSelected);
    }
  }

  toggleAllTarget(event: Event) {
    if (this.disabled) return;

    const target = event.target as HTMLInputElement;
    const availableItems = this.filteredTargetItems().filter(item => !item.disabled);
    
    if (target.checked) {
      const newSelected = new Set(this.selectedTargetIds());
      availableItems.forEach(item => newSelected.add(item.id));
      this.selectedTargetIds.set(newSelected);
    } else {
      const newSelected = new Set(this.selectedTargetIds());
      availableItems.forEach(item => newSelected.delete(item.id));
      this.selectedTargetIds.set(newSelected);
    }
  }

  // Transfer methods
  moveSelectedToTarget() {
    if (this.disabled) return;

    const itemsToMove = this.selectedSourceItems();
    if (itemsToMove.length === 0) return;

    const newSourceItems = this.sourceItemsSignal().filter(
      item => !this.selectedSourceIds().has(item.id)
    );
    const newTargetItems = [...this.targetItemsSignal(), ...itemsToMove];

    this.sourceItemsSignal.set(newSourceItems);
    this.targetItemsSignal.set(newTargetItems);
    this.selectedSourceIds.set(new Set());

    // Emit events
    this.sourceChange.emit(newSourceItems);
    this.targetChange.emit(newTargetItems);
    
    itemsToMove.forEach(item => {
      this.itemMove.emit({ item, from: 'source', to: 'target' });
    });
  }

  moveSelectedToSource() {
    if (this.disabled) return;

    const itemsToMove = this.selectedTargetItems();
    if (itemsToMove.length === 0) return;

    const newTargetItems = this.targetItemsSignal().filter(
      item => !this.selectedTargetIds().has(item.id)
    );
    const newSourceItems = [...this.sourceItemsSignal(), ...itemsToMove];

    this.sourceItemsSignal.set(newSourceItems);
    this.targetItemsSignal.set(newTargetItems);
    this.selectedTargetIds.set(new Set());

    // Emit events
    this.sourceChange.emit(newSourceItems);
    this.targetChange.emit(newTargetItems);
    
    itemsToMove.forEach(item => {
      this.itemMove.emit({ item, from: 'target', to: 'source' });
    });
  }

  moveAllToTarget() {
    if (this.disabled) return;

    const itemsToMove = this.filteredSourceItems().filter(item => !item.disabled);
    if (itemsToMove.length === 0) return;

    const newSourceItems = this.sourceItemsSignal().filter(item => item.disabled);
    const newTargetItems = [...this.targetItemsSignal(), ...itemsToMove];

    this.sourceItemsSignal.set(newSourceItems);
    this.targetItemsSignal.set(newTargetItems);
    this.selectedSourceIds.set(new Set());

    // Emit events
    this.sourceChange.emit(newSourceItems);
    this.targetChange.emit(newTargetItems);
    
    itemsToMove.forEach(item => {
      this.itemMove.emit({ item, from: 'source', to: 'target' });
    });
  }

  moveAllToSource() {
    if (this.disabled) return;

    const itemsToMove = this.filteredTargetItems().filter(item => !item.disabled);
    if (itemsToMove.length === 0) return;

    const newTargetItems = this.targetItemsSignal().filter(item => item.disabled);
    const newSourceItems = [...this.sourceItemsSignal(), ...itemsToMove];

    this.sourceItemsSignal.set(newSourceItems);
    this.targetItemsSignal.set(newTargetItems);
    this.selectedTargetIds.set(new Set());

    // Emit events
    this.sourceChange.emit(newSourceItems);
    this.targetChange.emit(newTargetItems);
    
    itemsToMove.forEach(item => {
      this.itemMove.emit({ item, from: 'target', to: 'source' });
    });
  }

  // Keyboard navigation
  handleSourceKeydown(event: KeyboardEvent) {
    this.handleListKeydown(event, this.filteredSourceItems(), 'source');
  }

  handleTargetKeydown(event: KeyboardEvent) {
    this.handleListKeydown(event, this.filteredTargetItems(), 'target');
  }

  handleItemKeydown(event: KeyboardEvent, item: TransferListItem, list: 'source' | 'target') {
    if (event.key === ' ' || event.key === 'Enter') {
      event.preventDefault();
      if (list === 'source') {
        this.toggleSourceItem(item);
      } else {
        this.toggleTargetItem(item);
      }
    }
  }

  private handleListKeydown(event: KeyboardEvent, items: TransferListItem[], list: 'source' | 'target') {
    const currentFocus = document.activeElement as HTMLElement;
    const listItems = Array.from(currentFocus.parentElement?.querySelectorAll('.ui-transfer-list__item[tabindex="0"]') || []) as HTMLElement[];
    
    if (listItems.length === 0) return;

    const currentIndex = listItems.indexOf(currentFocus);
    let nextIndex = currentIndex;

    switch (event.key) {
      case 'ArrowDown':
        event.preventDefault();
        nextIndex = Math.min(currentIndex + 1, listItems.length - 1);
        break;
      case 'ArrowUp':
        event.preventDefault();
        nextIndex = Math.max(currentIndex - 1, 0);
        break;
      case 'Home':
        event.preventDefault();
        nextIndex = 0;
        break;
      case 'End':
        event.preventDefault();
        nextIndex = listItems.length - 1;
        break;
    }

    if (nextIndex !== currentIndex) {
      listItems[nextIndex]?.focus();
    }
  }
}ǑxK(/*QRH+UP/)JM-L-K-K+Q `xZ]n7~)h!VZ;}#ǩ14/FZJ"Z
KS =DԓtOR?I$rÙ3:td@b.e_oj/`bA  q9#/ AYy-*,l5@(('xKZi{+`:tOh炕X^$-@>xBۊ,' !-g'0*-)	:apb2E^9iܼ9ɁpXAp)g9)lN9-ZX``}p VKNu"W_RHeEZ)FN\ 3wZ"F[ӡ A$MM UM> >B7	N+:&ޔW5%$Q5 ^2
XF=qt2>|fuÍá=㎜x`R;vKX$[<zI"[~ܑ~:vX*[jX瘟_EϐZhhʺ(NѓN&1|{;+pqGH(loRɧRrw*gE{6Ωa4_gtz}nu4tC	qS!LBM^ {Ίt"t#&[6`_-˸c>H3Xe=E[a<9u@)UBj`w Z9Kqy9hE\	vN$2Zm>Ӽ;4QNmhSpx 灃)3(G`/
Hez7.hTZe+9<GFƙdt7rrk;1ycv5tq~7xu!赺+|=eTEv10^v9gHIS}[Cn
3UHx}u4ct%"y!QId5<%ا:p\9>OZB-I}[*=֊*aO)"/ڞ
RcZԺGl#se3)mc8?NT4պFڑ;^Q2.bK<Sf`/YR8(Pe0eKRǥgw~OdJ.o޽Uw!7.+L1D!r.Ot^UW:`gQ*Jg]
F*)`\Y{jjO(/CuFA[ײǺʾ#EEoe7=8b+A54]TdK]ò
%jAZzSKV@ /,6tQ\G_<'?OE(j((+9NhԥiTVeݠÆ^.I1ԑ@Ie13aZ
[FPD֝to~ZeYyغGI }Q]]U#t<JGQs._"=ڶf݀^lLmYېq/[6	͆۳ᐟFn8ܢMtϡz <iE*oO7;rM]	d"-ž[?j=}qD=F:+=j]W&ϋ"Ms!Ǒ`@COwHniREFy]8%<!]GKJJ0`m2˶Ө'_fN1넵i?{H2woG"
al&piԓ<6ͱ	&bN3*nNw2*R$G2`(G<|M\&G/a	xnpnW-T%Z1g<=HD xp @%X+31/߸[a10eH'*9y\Ɔ1e?.cEE
x0՟zy^[>h'¯sZMnIoESrmG<Q|JVR˖+9;2IH@b%L	'֯w*yAO|FҼr2Ok÷h<Ije&U@V Q]VRx X, Q{]e0Rɇ/x KD;&;~nӑ0R;PxX[o6~ϯa	u:mdCn-n/AmsHfE"u0 SIey%M0aɕUxS˒1yb.aR3?&rvw)2UAq	8+`(	˂g>&\LȞ,0RuIgG<GWCjN
iY6-x5\* 	0,֊gv3@cG->*+رJz8ѷP\vLjȒu9&ȸ JQ2%U,cZ;W(Aք[⛭Pl+i,U?Q}}x ZҬ jAdӆ \*Qg1 ױw]Yo+EGƢ,@V`
dF<-ooA^iF~l˛H[+/e@&B 62rawyOls^&<HަN?%ךh4|"nFQNz+!B+#/A60ZaG v5JZ.fU|}bEsjgc%㫜,Mt70:ՈUp0p[S2I=	~C(F\*ŋ[!®'~0OeI#?tǞ2>o9%%xl&|ycY#Y@#'ۯ\Ҩ+ʉ&,됻&`ΟDb yW4kjS:/ؘ-9'-ZSIrti3#oPj2JXUPtE<8If+kVrhrkIVt9J̧4|`mnz9NvZ:{a[m'ZQN[瞁üRhHҐ=VtU`s(V^FKhd_O.`*XiY:~urnIsݽYX7ɔ`H]lbދn7A,|,y״,YZc}˱Q,3rrBB^rF;ߞ/u} EX	ЂRh!vp]1v`w@´zlٔ{B op!rX.><?L
A,vs)}zRd%RSF;uf[Tagӫط3D* pcW\>f:%\Aʗd:7ɓos] f'_o#ž3OI4	PXwq׭p<	 ţ<cl>
̇O%V2i>li:tnѾ`lLE5K$B3`+Q͚k٢.%fCeC.07GmojC6D,iUǲwWX^Y\?BǩKy{,@4:<}˭8bJ<lX{SALsCcj2/S{ɓө/wPFM#N	kb1릗zUD}>V%w.~}B3m{JRB9+ɥxȸ1[)pa֘Ib!JG̶#zE	/rAt#F]?ElګlOv$Zb?=W"ǚj)sh*)M]ٳ	փ[FY`p_oi]>R`6L7m޲F8|t'?Ks4uIJo xf:EaB"E28M̨aH09M>$ǒe:%b(q)AtrNbq^i.X:D_Cf10a0o#ÐUHfU-K$$'UW]A[,9MG"WWΦ1?&XM||&PԽ`7Dbm@B.y;= VCCKr8͡'*ؓES8;!O as}#T(¿9? ?Uhg^AiBqfU8(A5-18u*Ę@0ւ̒7OWa0HO-;eIU*N;X 'Ȯ3xK(/*QRH+UPOI-*K-K+Q "x  "#!:M;l̰񬑭S;Z1x V^:9%7!j$͋x#@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-empty-state {
  // Core Structure
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  position: relative;
  
  // Layout & Spacing
  padding: $semantic-spacing-component-lg;
  min-height: 200px;
  
  // Visual Design
  background: $semantic-color-surface-primary;
  border-radius: $semantic-border-card-radius;
  
  // Typography
  color: $semantic-color-text-secondary;
  
  // Sizing Variants
  &--sm {
    min-height: 120px;
    padding: $semantic-spacing-component-sm;
    
    .ui-empty-state__icon {
      width: $semantic-sizing-icon-inline;
      height: $semantic-sizing-icon-inline;
      margin-bottom: $semantic-spacing-content-line-tight;
    }
    
    .ui-empty-state__title {
      font-size: $base-typography-font-size-sm;
      margin-bottom: $semantic-spacing-content-line-tight;
    }
    
    .ui-empty-state__description {
      font-size: $base-typography-font-size-sm;
      margin-bottom: $semantic-spacing-content-line-normal;
    }
  }
  
  &--md {
    min-height: 200px;
    padding: $semantic-spacing-component-md;
    
    .ui-empty-state__icon {
      width: $semantic-sizing-icon-button;
      height: $semantic-sizing-icon-button;
      margin-bottom: $semantic-spacing-content-line-normal;
    }
    
    .ui-empty-state__title {
      font-size: $base-typography-font-size-lg;
      margin-bottom: $semantic-spacing-content-line-normal;
    }
    
    .ui-empty-state__description {
      font-size: $base-typography-font-size-md;
      margin-bottom: $semantic-spacing-content-paragraph;
    }
  }
  
  &--lg {
    min-height: 300px;
    padding: $semantic-spacing-component-lg;
    
    .ui-empty-state__icon {
      width: $semantic-sizing-icon-navigation;
      height: $semantic-sizing-icon-navigation;
      margin-bottom: $semantic-spacing-content-paragraph;
    }
    
    .ui-empty-state__title {
      font-size: $base-typography-font-size-xl;
      margin-bottom: $semantic-spacing-content-line-normal;
    }
    
    .ui-empty-state__description {
      font-size: $base-typography-font-size-lg;
      margin-bottom: $semantic-spacing-content-heading;
    }
  }
  
  // Variant Styles
  &--default {
    .ui-empty-state__icon {
      color: $semantic-color-text-tertiary;
    }
  }
  
  &--search {
    .ui-empty-state__icon {
      color: $semantic-color-primary;
    }
    
    .ui-empty-state__title {
      color: $semantic-color-text-primary;
    }
  }
  
  &--error {
    .ui-empty-state__icon {
      color: $semantic-color-error;
    }
    
    .ui-empty-state__title {
      color: $semantic-color-error;
    }
  }
  
  &--loading {
    .ui-empty-state__icon {
      color: $semantic-color-primary;
    }
  }
  
  &--success {
    .ui-empty-state__icon {
      color: $semantic-color-success;
    }
    
    .ui-empty-state__title {
      color: $semantic-color-success;
    }
  }
}

.ui-empty-state__icon {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  margin-bottom: $semantic-spacing-content-line-normal;
  
  svg, img {
    width: 100%;
    height: 100%;
    object-fit: contain;
  }
}

.ui-empty-state__spinner {
  width: 100%;
  height: 100%;
  border: 3px solid $semantic-color-border-subtle;
  border-top: 3px solid $semantic-color-primary;
  border-radius: 50%;
  animation: spin $semantic-duration-medium $semantic-easing-standard infinite;
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

.ui-empty-state__title {
  margin: 0 0 $semantic-spacing-content-line-normal 0;
  color: $semantic-color-text-primary;
  font-weight: $base-typography-font-weight-semibold;
  line-height: $base-typography-line-height-tight;
}

.ui-empty-state__description {
  margin: 0 0 $semantic-spacing-content-paragraph 0;
  color: $semantic-color-text-secondary;
  line-height: $base-typography-line-height-relaxed;
  max-width: 400px;
}

.ui-empty-state__content {
  margin-bottom: $semantic-spacing-content-paragraph;
  
  &:empty {
    display: none;
  }
}

.ui-empty-state__actions {
  display: flex;
  gap: $semantic-spacing-content-line-normal;
  justify-content: center;
  flex-wrap: wrap;
}

.ui-empty-state__action {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
  
  // Visual Design
  background: $semantic-color-primary;
  color: $semantic-color-on-primary;
  border: $semantic-border-button-width solid $semantic-color-primary;
  border-radius: $semantic-border-button-radius;
  box-shadow: $semantic-shadow-button-rest;
  
  // Typography
  font-size: $base-typography-font-size-md;
  font-weight: $base-typography-font-weight-medium;
  text-decoration: none;
  
  // Transitions
  transition: all $semantic-duration-fast $semantic-easing-standard;
  
  cursor: pointer;
  user-select: none;
  
  // Interactive States
  &:not([disabled]) {
    &:hover {
      background: $semantic-color-primary;
      border-color: $semantic-color-primary;
      box-shadow: $semantic-shadow-button-hover;
      transform: translateY(-1px);
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    &:active {
      background: $semantic-color-primary;
      border-color: $semantic-color-primary;
      box-shadow: $semantic-shadow-button-active;
      transform: translateY(0);
    }
  }
  
  &[disabled] {
    opacity: 0.38;
    cursor: not-allowed;
    pointer-events: none;
  }
}

// Dark Mode Support
:host-context(.dark-theme) .ui-empty-state {
  background: $semantic-color-surface-secondary;
}

// Responsive Design
@media (max-width: 768px) {
  .ui-empty-state {
    padding: $semantic-spacing-component-md;
    min-height: 160px;
    
    &--lg {
      min-height: 200px;
    }
    
    .ui-empty-state__description {
      max-width: 300px;
    }
  }
}

@media (max-width: 480px) {
  .ui-empty-state {
    padding: $semantic-spacing-component-sm;
    min-height: 120px;
    
    .ui-empty-state__icon {
      width: $semantic-sizing-icon-inline;
      height: $semantic-sizing-icon-inline;
    }
    
    .ui-empty-state__title {
      font-size: $base-typography-font-size-sm;
    }
    
    .ui-empty-state__description {
      font-size: $base-typography-font-size-sm;
      max-width: 280px;
    }
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .ui-empty-state__action {
    border-width: 2px;
    font-weight: $base-typography-font-weight-bold;
  }
}

// Reduced motion
@media (prefers-reduced-motion: reduce) {
  .ui-empty-state__spinner {
    animation: none;
    border-top-color: $semantic-color-primary;
  }
  
  .ui-empty-state__action {
    transition: none;
    
    &:hover {
      transform: none;
    }
    
    &:active {
      transform: none;
    }
  }
}]#	1x[l6lgqFbQjniFR Oͼx	import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type EmptyStateSize = 'sm' | 'md' | 'lg';
type EmptyStateVariant = 'default' | 'search' | 'error' | 'loading' | 'success';

@Component({
  selector: 'ui-empty-state',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-empty-state"
      [class]="getComponentClasses()"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel">
      
      @if (icon || variant === 'loading') {
        <div class="ui-empty-state__icon" [attr.aria-hidden]="true">
          @if (variant === 'loading') {
            <div class="ui-empty-state__spinner"></div>
          } @else if (icon) {
            <span [innerHTML]="icon"></span>
          }
        </div>
      }
      
      @if (title) {
        <h3 class="ui-empty-state__title">{{ title }}</h3>
      }
      
      @if (description) {
        <p class="ui-empty-state__description">{{ description }}</p>
      }
      
      <div class="ui-empty-state__content">
        <ng-content></ng-content>
      </div>
      
      @if (actionLabel) {
        <div class="ui-empty-state__actions">
          <button 
            type="button"
            class="ui-empty-state__action"
            (click)="handleAction($event)"
            [disabled]="disabled">
            {{ actionLabel }}
          </button>
        </div>
      }
    </div>
  `,
  styleUrl: './empty-state.component.scss'
})
export class EmptyStateComponent {
  @Input() size: EmptyStateSize = 'md';
  @Input() variant: EmptyStateVariant = 'default';
  @Input() icon = '';
  @Input() title = '';
  @Input() description = '';
  @Input() actionLabel = '';
  @Input() disabled = false;
  @Input() role = 'region';
  @Input() ariaLabel = 'Empty state';
  
  @Output() action = new EventEmitter<MouseEvent>();
  
  getComponentClasses(): string {
    const classes = [
      'ui-empty-state',
      `ui-empty-state--${this.size}`,
      `ui-empty-state--${this.variant}`
    ];
    
    return classes.join(' ');
  }
  
  handleAction(event: MouseEvent): void {
    if (!this.disabled) {
      this.action.emit(event);
    }
  }
}X*x#)A)D4S75R$$UW8*6V	PR b,2JLY'o #x( export * from './empty-state.component';!ExmA0)8Yڈ4liorGx3݅j'5~UÄvpF'H0.KJĜ"<	TeLUף`+8CXĴQꇄ@aӵ鹣HQu>n$x snackbar@jdk	"jHx;qd'I cx*  export * from "./progress-circleeL4|x JsSID<z40T^8/x Сa~Wf6oz駪Ox, export * from './loading-spinner.component';^-Ҿx.@use "../../../../../../ui-design-system/src/styles/semantic" as *;

.ui-loading-spinner {
  // Core Structure
  display: inline-flex;
  align-items: center;
  justify-content: center;
  position: relative;
  flex-shrink: 0;
  
  // Sizing Variants
  &--sm {
    width: $semantic-sizing-icon-inline;
    height: $semantic-sizing-icon-inline;
  }
  
  &--md {
    width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
  }
  
  &--lg {
    width: $semantic-sizing-icon-navigation;
    height: $semantic-sizing-icon-navigation;
  }
  
  // Color Variants
  &--primary {
    color: $semantic-color-brand-primary;
  }
  
  &--secondary {
    color: $semantic-color-brand-secondary;
  }
  
  &--accent {
    color: $semantic-color-brand-accent;
  }
  
  &--success {
    color: $semantic-color-success;
  }
  
  &--warning {
    color: $semantic-color-warning;
  }
  
  &--danger {
    color: $semantic-color-danger;
  }
  
  &--info {
    color: $semantic-color-info;
  }
  
  // Style Variants
  &--spin .ui-loading-spinner__spin {
    border: 2px solid $semantic-color-border-secondary;
    border-top: 2px solid currentColor;
    border-radius: 50%;
    width: 100%;
    height: 100%;
    animation: ui-spinner-spin 1s ease-in-out infinite;
  }
  
  &--dots {
    .ui-loading-spinner__dots {
      display: flex;
      gap: 0.25rem;
      
      .ui-loading-spinner__dot {
        width: 25%;
        height: 25%;
        background-color: currentColor;
        border-radius: 50%;
        animation: ui-spinner-dots 0.6s ease-in-out infinite;
        
        &:nth-child(1) { animation-delay: 0ms; }
        &:nth-child(2) { animation-delay: 150ms; }
        &:nth-child(3) { animation-delay: 300ms; }
      }
    }
  }
  
  &--pulse .ui-loading-spinner__pulse {
    width: 100%;
    height: 100%;
    background-color: currentColor;
    border-radius: 50%;
    animation: ui-spinner-pulse 1s ease-in-out infinite;
  }
  
  &--bars {
    .ui-loading-spinner__bars {
      display: flex;
      align-items: flex-end;
      gap: 20%;
      height: 100%;
      
      .ui-loading-spinner__bar {
        width: 15%;
        background-color: currentColor;
        border-radius: 0.125rem;
        animation: ui-spinner-bars 0.6s ease-in-out infinite;
        
        &:nth-child(1) { animation-delay: 0ms; }
        &:nth-child(2) { animation-delay: 100ms; }
        &:nth-child(3) { animation-delay: 200ms; }
      }
    }
  }
  
  // State Variants
  &--disabled {
    opacity: 0.38;
    pointer-events: none;
  }
  
  // Speed Variants
  &--slow {
    .ui-loading-spinner__spin {
      animation-duration: 2s;
    }
    
    .ui-loading-spinner__dots .ui-loading-spinner__dot {
      animation-duration: 1.2s;
    }
    
    .ui-loading-spinner__pulse {
      animation-duration: 2s;
    }
    
    .ui-loading-spinner__bars .ui-loading-spinner__bar {
      animation-duration: 1.2s;
    }
  }
  
  &--fast {
    .ui-loading-spinner__spin {
      animation-duration: 0.5s;
    }
    
    .ui-loading-spinner__dots .ui-loading-spinner__dot {
      animation-duration: 0.3s;
    }
    
    .ui-loading-spinner__pulse {
      animation-duration: 0.5s;
    }
    
    .ui-loading-spinner__bars .ui-loading-spinner__bar {
      animation-duration: 0.3s;
    }
  }
  
  // Label
  &__label {
    margin-left: 0.5rem;
    color: $semantic-color-text-secondary;
    font-size: 0.875rem;
    font-weight: 500;
  }
  
  // Screen Reader Only Text
  &__sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
  }
  
  // Accessibility - Respect reduced motion preference
  @media (prefers-reduced-motion: reduce) {
    .ui-loading-spinner__spin,
    .ui-loading-spinner__dots .ui-loading-spinner__dot,
    .ui-loading-spinner__pulse,
    .ui-loading-spinner__bars .ui-loading-spinner__bar {
      animation: none;
    }
    
    .ui-loading-spinner__spin {
      border-top-color: transparent;
      border-right-color: transparent;
      border-bottom-color: transparent;
    }
    
    .ui-loading-spinner__pulse {
      opacity: 0.6;
    }
  }
  
  // High contrast mode
  @media (prefers-contrast: high) {
    .ui-loading-spinner__spin {
      border-width: 3px;
    }
  }
}

// Keyframes
@keyframes ui-spinner-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

@keyframes ui-spinner-dots {
  0%, 20%, 80%, 100% {
    transform: scale(1);
    opacity: 1;
  }
  50% {
    transform: scale(1.5);
    opacity: 0.7;
  }
}

@keyframes ui-spinner-pulse {
  0% {
    transform: scale(1);
    opacity: 1;
  }
  50% {
    transform: scale(1.1);
    opacity: 0.5;
  }
  100% {
    transform: scale(1);
    opacity: 1;
  }
}

@keyframes ui-spinner-bars {
  0%, 40%, 100% {
    height: 40%;
  }
  20% {
    height: 100%;
  }
}Ƈ<x[\mgqFbQjniF6a Mǰxpimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type SpinnerSize = 'sm' | 'md' | 'lg';
type SpinnerVariant = 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'danger' | 'info';
type SpinnerType = 'spin' | 'dots' | 'pulse' | 'bars';
type SpinnerSpeed = 'slow' | 'normal' | 'fast';

@Component({
  selector: 'ui-loading-spinner',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-loading-spinner"
      [class.ui-loading-spinner--{{size}}]="size"
      [class.ui-loading-spinner--{{variant}}]="variant"
      [class.ui-loading-spinner--{{type}}]="type"
      [class.ui-loading-spinner--{{speed}}]="speed !== 'normal'"
      [class.ui-loading-spinner--disabled]="disabled"
      [attr.aria-label]="ariaLabel || defaultAriaLabel"
      [attr.aria-busy]="!disabled"
      [attr.role]="role"
      [tabindex]="disabled ? -1 : tabIndex"
      (click)="handleClick($event)"
      (keydown)="handleKeydown($event)">
      
      <!-- Screen reader text -->
      <span class="ui-loading-spinner__sr-only">
        {{ srText || defaultSrText }}
      </span>
      
      <!-- Spinner variants -->
      @switch (type) {
        @case ('spin') {
          <div class="ui-loading-spinner__spin"></div>
        }
        
        @case ('dots') {
          <div class="ui-loading-spinner__dots">
            <div class="ui-loading-spinner__dot"></div>
            <div class="ui-loading-spinner__dot"></div>
            <div class="ui-loading-spinner__dot"></div>
          </div>
        }
        
        @case ('pulse') {
          <div class="ui-loading-spinner__pulse"></div>
        }
        
        @case ('bars') {
          <div class="ui-loading-spinner__bars">
            <div class="ui-loading-spinner__bar"></div>
            <div class="ui-loading-spinner__bar"></div>
            <div class="ui-loading-spinner__bar"></div>
          </div>
        }
      }
      
      <!-- Optional label -->
      @if (label && showLabel) {
        <span class="ui-loading-spinner__label">{{ label }}</span>
      }
    </div>
  `,
  styleUrl: './loading-spinner.component.scss'
})
export class LoadingSpinnerComponent {
  @Input() size: SpinnerSize = 'md';
  @Input() variant: SpinnerVariant = 'primary';
  @Input() type: SpinnerType = 'spin';
  @Input() speed: SpinnerSpeed = 'normal';
  @Input() disabled = false;
  @Input() label = '';
  @Input() showLabel = false;
  @Input() role = 'status';
  @Input() tabIndex = 0;
  @Input() ariaLabel = '';
  @Input() srText = '';
  
  @Output() clicked = new EventEmitter<MouseEvent>();
  
  get defaultAriaLabel(): string {
    if (this.ariaLabel) return this.ariaLabel;
    return this.label ? `Loading: ${this.label}` : 'Loading';
  }
  
  get defaultSrText(): string {
    if (this.srText) return this.srText;
    return this.label ? `Loading ${this.label}...` : 'Loading...';
  }
  
  handleClick(event: MouseEvent): void {
    if (!this.disabled) {
      this.clicked.emit(event);
    }
  }
  
  handleKeydown(event: KeyboardEvent): void {
    // Allow keyboard interaction if the spinner is interactive
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.handleClick(event as any);
    }
  }
}8*!~x*]="getComponentClasses()JComponentClasses(): string {
    const classes = [
      'ui-loading-spinner',
      `ui-loading-spinner--${this.size}`,
      `ui-loading-spinner--${this.variant}`,
      `ui-loading-spinner--${this.type}`
    ];
    
    if (this.speed !== 'normal') {
L      classes.push(`ui-loading-spinner--${this.speed}`);
    }
    
    if (?Uclasses.push('ui-loading-spinner--disabled');
    }
    
    return classes.join(' ')q
y(x J}6Ȣ_۔
MfnA^8xx, export * from './progress-circle.component';`Bܵx
@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-progress-circle {
  // Core Structure
  display: inline-flex;
  position: relative;
  align-items: center;
  justify-content: center;

  // Sizing variants
  &--sm {
    width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
  }

  &--md {
    width: $semantic-sizing-icon-navigation;
    height: $semantic-sizing-icon-navigation;
  }

  &--lg {
    width: $semantic-sizing-icon-header;
    height: $semantic-sizing-icon-header;
  }

  &--xl {
    width: $semantic-sizing-icon-feature;
    height: $semantic-sizing-icon-feature;
  }

  // Color variants
  &--primary {
    .ui-progress-circle__progress {
      stroke: $semantic-color-primary;
    }
  }

  &--secondary {
    .ui-progress-circle__progress {
      stroke: $semantic-color-secondary;
    }
  }

  &--success {
    .ui-progress-circle__progress {
      stroke: $semantic-color-success;
    }
  }

  &--warning {
    .ui-progress-circle__progress {
      stroke: $semantic-color-warning;
    }
  }

  &--danger {
    .ui-progress-circle__progress {
      stroke: $semantic-color-danger;
    }
  }

  &--info {
    .ui-progress-circle__progress {
      stroke: $semantic-color-info;
    }
  }

  // State variants
  &--disabled {
    opacity: 0.38;
    cursor: not-allowed;
  }

  &--indeterminate {
    .ui-progress-circle__progress {
      animation: progress-circle-spin $semantic-motion-duration-slow 
                 $semantic-easing-standard infinite linear;
      stroke-dasharray: 85, 85;
      stroke-dashoffset: 0;
    }
  }

  // SVG elements
  &__svg {
    width: 100%;
    height: 100%;
    transform: rotate(-90deg); // Start progress from top
    overflow: visible;
  }

  &__track {
    fill: none;
    stroke: $semantic-color-border-subtle;
    stroke-width: 2;
  }

  &__progress {
    fill: none;
    stroke: $semantic-color-primary;
    stroke-width: 2;
    stroke-linecap: round;
    transition: stroke-dashoffset $semantic-motion-duration-normal 
                $semantic-easing-standard;
  }

  // Label content
  &__label {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    color: $semantic-color-text-primary;
    font-size: $semantic-typography-font-size-xs;
    font-weight: $semantic-typography-font-weight-medium;
    text-align: center;
    line-height: 1;

    &--sm {
      font-size: $semantic-typography-font-size-xs;
    }

    &--md {
      font-size: $semantic-typography-font-size-xs;
    }

    &--lg {
      font-size: $semantic-typography-font-size-sm;
    }

    &--xl {
      font-size: $semantic-typography-font-size-sm;
    }

    &--disabled {
      opacity: 0.38;
    }
  }

  // Stroke width variants
  &--thin {
    .ui-progress-circle__track,
    .ui-progress-circle__progress {
      stroke-width: 1;
    }
  }

  &--thick {
    .ui-progress-circle__track,
    .ui-progress-circle__progress {
      stroke-width: 3;
    }
  }

  &--extra-thick {
    .ui-progress-circle__track,
    .ui-progress-circle__progress {
      stroke-width: 4;
    }
  }

  // Dark mode support
  :host-context(.dark-theme) & {
    .ui-progress-circle__track {
      stroke: $semantic-color-border-primary;
    }

    .ui-progress-circle__label {
      color: $semantic-color-text-primary;
    }
  }
}

// Keyframe animations
@keyframes progress-circle-spin {
  0% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(180deg);
    stroke-dasharray: 1, 200;
    stroke-dashoffset: -35;
  }
  100% {
    transform: rotate(360deg);
    stroke-dasharray: 85, 85;
    stroke-dashoffset: -124;
  }
}

// Responsive design
@media (max-width: 480px) {
  .ui-progress-circle {
    &--xl {
      width: $semantic-sizing-icon-header;
      height: $semantic-sizing-icon-header;
    }
  }
}kx*NvgqFbQjniF| Wxzimport { Component, Input, ChangeDetectionStrategy, computed, signal, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

export type ProgressCircleSize = 'sm' | 'md' | 'lg' | 'xl';
export type ProgressCircleVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';
export type ProgressCircleStroke = 'thin' | 'default' | 'thick' | 'extra-thick';

@Component({
  selector: 'ui-progress-circle',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-progress-circle"
      [class]="containerClasses()"
      [attr.aria-label]="ariaLabel || 'Progress indicator'"
      [attr.aria-valuenow]="indeterminate ? null : value"
      [attr.aria-valuemin]="indeterminate ? null : 0"
      [attr.aria-valuemax]="indeterminate ? null : max"
      [attr.aria-valuetext]="ariaValueText"
      [attr.role]="'progressbar'">
      
      <svg 
        class="ui-progress-circle__svg"
        [attr.viewBox]="viewBox"
        [attr.width]="svgSize()"
        [attr.height]="svgSize()">
        
        <!-- Background track -->
        <circle
          class="ui-progress-circle__track"
          [attr.cx]="center"
          [attr.cy]="center"
          [attr.r]="radius"
          [attr.stroke-width]="strokeWidth" />
        
        <!-- Progress circle -->
        @if (!indeterminate) {
          <circle
            class="ui-progress-circle__progress"
            [attr.cx]="center"
            [attr.cy]="center"
            [attr.r]="radius"
            [attr.stroke-width]="strokeWidth"
            [attr.stroke-dasharray]="circumference"
            [attr.stroke-dashoffset]="progressOffset()" />
        } @else {
          <circle
            class="ui-progress-circle__progress"
            [attr.cx]="center"
            [attr.cy]="center"
            [attr.r]="radius"
            [attr.stroke-width]="strokeWidth" />
        }
      </svg>
      
      <!-- Label content -->
      @if (showLabel) {
        <div class="ui-progress-circle__label" [class]="labelClasses()">
          @if (labelContent) {
            {{ labelContent }}
          } @else {
            <ng-content></ng-content>
          }
        </div>
      }
    </div>
  `,
  styleUrl: './progress-circle.component.scss'
})
export class ProgressCircleComponent {
  @Input() value = 0;
  @Input() max = 100;
  @Input() size: ProgressCircleSize = 'md';
  @Input() variant: ProgressCircleVariant = 'primary';
  @Input() stroke: ProgressCircleStroke = 'default';
  @Input() disabled = false;
  @Input() indeterminate = false;
  @Input() showLabel = false;
  @Input() labelContent = '';
  @Input() ariaLabel = '';
  @Input() ariaValueText = '';

  // Constants for SVG calculations
  private readonly _center = 20;
  private readonly _baseRadius = 16;
  
  // Computed properties for SVG dimensions
  center = this._center;
  radius = this._baseRadius;
  viewBox = `0 0 ${this._center * 2} ${this._center * 2}`;

  // Computed signals
  private _normalizedValue = computed(() => {
    const val = Math.max(0, Math.min(this.max, this.value));
    return val;
  });

  private _percentage = computed(() => {
    return this.max === 0 ? 0 : (this._normalizedValue() / this.max) * 100;
  });

  circumference = computed(() => 2 * Math.PI * this.radius);

  progressOffset = computed(() => {
    const progress = this._percentage();
    return this.circumference() - (progress / 100) * this.circumference();
  });

  svgSize = computed(() => {
    const sizeMap = {
      sm: 24,
      md: 32, 
      lg: 40,
      xl: 64
    };
    return sizeMap[this.size];
  });

  strokeWidth = computed(() => {
    const strokeMap = {
      thin: 1,
      default: 2,
      thick: 3,
      'extra-thick': 4
    };
    return strokeMap[this.stroke];
  });

  containerClasses = computed(() => {
    const classes = [
      `ui-progress-circle--${this.size}`,
      `ui-progress-circle--${this.variant}`,
      `ui-progress-circle--${this.stroke}`
    ];

    if (this.disabled) classes.push('ui-progress-circle--disabled');
    if (this.indeterminate) classes.push('ui-progress-circle--indeterminate');

    return classes.join(' ');
  });

  labelClasses = computed(() => {
    const classes = [
      `ui-progress-circle__label--${this.size}`
    ];

    if (this.disabled) classes.push('ui-progress-circle__label--disabled');

    return classes.join(' ');
  });

  // Utility methods
  getPercentage(): number {
    return this._percentage();
  }

  getValue(): number {
    return this._normalizedValue();
  }

  isComplete(): boolean {
    return this._normalizedValue() >= this.max;
  }
}`߰(x JI[!N9G1S0^8Ox, export * from './skeleton-loader.component';_ѻxd@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-skeleton-loader {
  display: block;
  width: 100%;
  overflow: hidden;
  position: relative;
  background: $semantic-color-surface-variant;
  
  // Core structure
  &::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: linear-gradient(
      90deg,
      transparent,
      rgba(255, 255, 255, 0.2),
      transparent
    );
    animation: shimmer 2s ease-in-out infinite;
    transform: translateX(-100%);
  }

  // Size variants
  &--xs {
    height: 0.5rem;
    border-radius: 0.125rem;
  }

  &--sm {
    height: 0.75rem;
    border-radius: 0.25rem;
  }

  &--md {
    height: 1rem;
    border-radius: 0.375rem;
  }

  &--lg {
    height: 1.25rem;
    border-radius: 0.5rem;
  }

  &--xl {
    height: 1.5rem;
    border-radius: 0.5rem;
  }

  // Shape variants
  &--text {
    height: 1.25rem;
    border-radius: 0.25rem;
  }

  &--heading {
    height: 1.75rem;
    border-radius: 0.25rem;
  }

  &--avatar {
    border-radius: 50%;
    aspect-ratio: 1;
    
    &.ui-skeleton-loader--xs { width: 1rem; }
    &.ui-skeleton-loader--sm { width: 1.5rem; }
    &.ui-skeleton-loader--md { width: 2rem; }
    &.ui-skeleton-loader--lg { width: 2.5rem; }
    &.ui-skeleton-loader--xl { width: 3rem; }
  }

  &--card {
    height: 200px;
    border-radius: 0.5rem;
  }

  &--button {
    height: 2.5rem;
    width: 120px;
    border-radius: 0.375rem;
  }

  &--image {
    aspect-ratio: 16/9;
    border-radius: 0.375rem;
  }

  &--circle {
    border-radius: 50%;
    aspect-ratio: 1;
  }

  &--rounded {
    border-radius: 0.375rem;
  }

  &--square {
    border-radius: 0;
  }

  // Animation variants
  &--pulse {
    &::after {
      display: none;
    }
    
    animation: pulse 1.5s ease-in-out infinite alternate;
  }

  &--wave {
    &::after {
      background: linear-gradient(
        90deg,
        transparent 0%,
        rgba(255, 255, 255, 0.4) 50%,
        transparent 100%
      );
      animation: wave 2s ease-in-out infinite;
    }
  }

  &--shimmer {
    // Default shimmer animation (already applied)
  }

  // Width variants
  &--w-25 { width: 25%; }
  &--w-50 { width: 50%; }
  &--w-75 { width: 75%; }
  &--w-full { width: 100%; }

  // State variants
  &--loading {
    opacity: 1;
  }

  &--loaded {
    opacity: 0;
    transition: opacity 0.3s ease;
  }

  // Dark mode support
  :host-context(.dark-theme) & {
    background: #374151;
    
    &::after {
      background: linear-gradient(
        90deg,
        transparent,
        rgba(255, 255, 255, 0.1),
        transparent
      );
    }
  }

  // High contrast mode
  @media (prefers-contrast: high) {
    background: #6b7280;
    
    &::after {
      background: linear-gradient(
        90deg,
        transparent,
        rgba(255, 255, 255, 0.6),
        transparent
      );
    }
  }

  // Reduced motion
  @media (prefers-reduced-motion: reduce) {
    &::after {
      animation: none;
    }
    
    &.ui-skeleton-loader--pulse {
      animation: none;
    }
  }
}

// Skeleton group for multiple skeleton items
.ui-skeleton-group {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  
  // Horizontal group
  &--horizontal {
    flex-direction: row;
    align-items: center;
  }
  
  // Grid group
  &--grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 1rem;
  }
  
  // Avatar with text group
  &--avatar-text {
    flex-direction: row;
    align-items: flex-start;
    gap: 0.75rem;
    
    .ui-skeleton-loader--avatar {
      flex-shrink: 0;
    }
    
    .ui-skeleton-content {
      flex: 1;
      display: flex;
      flex-direction: column;
      gap: 0.5rem;
    }
  }
  
  // Card group
  &--card {
    .ui-skeleton-loader {
      &:first-child {
        height: 180px;
        border-radius: 0.5rem 0.5rem 0 0;
      }
      
      &:not(:first-child) {
        margin: 0.75rem;
        height: 1rem;
        
        &:last-child {
          width: 60%;
        }
      }
    }
  }
  
  // Table group
  &--table {
    .ui-skeleton-loader {
      height: 1.25rem;
      
      &:first-child {
        width: 30%;
      }
      
      &:nth-child(2) {
        width: 50%;
      }
      
      &:last-child {
        width: 20%;
      }
    }
  }
}

// Animations
@keyframes shimmer {
  0% {
    transform: translateX(-100%);
  }
  100% {
    transform: translateX(100%);
  }
}

@keyframes pulse {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 0.6;
  }
}

@keyframes wave {
  0% {
    transform: translateX(-100%) scale(0.8);
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  100% {
    transform: translateX(100%) scale(1.2);
    opacity: 0;
  }
}0)x:EugqFbQjniFb! Jx&uimport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

export type SkeletonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
export type SkeletonShape = 'text' | 'heading' | 'avatar' | 'card' | 'button' | 'image' | 'circle' | 'rounded' | 'square';
export type SkeletonAnimation = 'shimmer' | 'pulse' | 'wave';
export type SkeletonWidth = 'w-25' | 'w-50' | 'w-75' | 'w-full' | 'auto';

@Component({
  selector: 'ui-skeleton-loader',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-skeleton-loader"
      [class]="skeletonClasses"
      [style.width]="customWidth"
      [style.height]="customHeight"
      [attr.aria-label]="ariaLabel"
      [attr.aria-busy]="loading"
      [attr.role]="role"
      [attr.data-testid]="'skeleton-' + shape + '-' + size">
    </div>
  `,
  styleUrl: './skeleton-loader.component.scss'
})
export class SkeletonLoaderComponent {
  @Input() size: SkeletonSize = 'md';
  @Input() shape: SkeletonShape = 'text';
  @Input() animation: SkeletonAnimation = 'shimmer';
  @Input() width: SkeletonWidth = 'w-full';
  @Input() loading = true;
  @Input() customWidth?: string;
  @Input() customHeight?: string;
  @Input() rounded = false;
  @Input() circle = false;
  @Input() ariaLabel = 'Loading content';
  @Input() role = 'status';
  @Input() class = '';

  get skeletonClasses(): string {
    const classes = [
      'ui-skeleton-loader',
      `ui-skeleton-loader--${this.size}`,
      `ui-skeleton-loader--${this.shape}`,
      `ui-skeleton-loader--${this.animation}`,
      this.width !== 'auto' ? `ui-skeleton-loader--${this.width}` : '',
      this.loading ? 'ui-skeleton-loader--loading' : 'ui-skeleton-loader--loaded',
      this.rounded ? 'ui-skeleton-loader--rounded' : '',
      this.circle ? 'ui-skeleton-loader--circle' : '',
      this.class
    ].filter(Boolean);

    return classes.join(' ');
  }
}

@Component({
  selector: 'ui-skeleton-group',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-skeleton-group"
      [class]="groupClasses"
      [attr.aria-label]="ariaLabel"
      [attr.role]="role">
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './skeleton-loader.component.scss'
})
export class SkeletonGroupComponent {
  @Input() variant: 'vertical' | 'horizontal' | 'grid' | 'avatar-text' | 'card' | 'table' = 'vertical';
  @Input() ariaLabel = 'Loading multiple items';
  @Input() role = 'status';
  @Input() class = '';

  get groupClasses(): string {
    const classes = [
      'ui-skeleton-group',
      this.variant !== 'vertical' ? `ui-skeleton-group--${this.variant}` : '',
      this.class
    ].filter(Boolean);

    return classes.join(' ');
  }
}

// Pre-built skeleton patterns for common use cases
@Component({
  selector: 'ui-skeleton-text-block',
  standalone: true,
  imports: [CommonModule, SkeletonLoaderComponent, SkeletonGroupComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <ui-skeleton-group>
      @for (line of lineArray; track $index) {
        <ui-skeleton-loader 
          shape="text"
          [size]="size"
          [width]="getLineWidth($index)"
          [animation]="animation">
        </ui-skeleton-loader>
      }
    </ui-skeleton-group>
  `
})
export class SkeletonTextBlockComponent {
  @Input() lines = 3;
  @Input() size: SkeletonSize = 'md';
  @Input() animation: SkeletonAnimation = 'shimmer';
  @Input() lastLineWidth: SkeletonWidth = 'w-75';

  get lineArray(): number[] {
    return Array.from({ length: this.lines }, (_, i) => i);
  }

  getLineWidth(index: number): SkeletonWidth {
    return index === this.lines - 1 ? this.lastLineWidth : 'w-full';
  }
}

@Component({
  selector: 'ui-skeleton-article',
  standalone: true,
  imports: [CommonModule, SkeletonLoaderComponent, SkeletonGroupComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <ui-skeleton-group>
      <!-- Article title -->
      <ui-skeleton-loader 
        shape="heading"
        size="lg"
        width="w-75"
        [animation]="animation">
      </ui-skeleton-loader>
      
      <!-- Article meta -->
      <ui-skeleton-loader 
        shape="text"
        size="sm"
        width="w-50"
        [animation]="animation">
      </ui-skeleton-loader>
      
      <!-- Article image -->
      @if (showImage) {
        <ui-skeleton-loader 
          shape="image"
          [animation]="animation">
        </ui-skeleton-loader>
      }
      
      <!-- Article content -->
      @for (line of contentArray; track $index) {
        <ui-skeleton-loader 
          shape="text"
          [width]="getContentLineWidth($index)"
          [animation]="animation">
        </ui-skeleton-loader>
      }
    </ui-skeleton-group>
  `
})
export class SkeletonArticleComponent {
  @Input() showImage = true;
  @Input() contentLines = 5;
  @Input() animation: SkeletonAnimation = 'shimmer';

  get contentArray(): number[] {
    return Array.from({ length: this.contentLines }, (_, i) => i);
  }

  getContentLineWidth(index: number): SkeletonWidth {
    if (index === this.contentLines - 1) return 'w-50';
    if (index === this.contentLines - 2) return 'w-75';
    return 'w-full';
  }
}

@Component({
  selector: 'ui-skeleton-card',
  standalone: true,
  imports: [CommonModule, SkeletonLoaderComponent, SkeletonGroupComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <ui-skeleton-group variant="card">
      <!-- Card image -->
      @if (showImage) {
        <ui-skeleton-loader 
          shape="image"
          [animation]="animation">
        </ui-skeleton-loader>
      }
      
      <!-- Card title -->
      <ui-skeleton-loader 
        shape="heading"
        size="md"
        width="w-75"
        [animation]="animation">
      </ui-skeleton-loader>
      
      <!-- Card content -->
      @for (line of contentArray; track $index) {
        <ui-skeleton-loader 
          shape="text"
          [width]="getCardLineWidth($index)"
          [animation]="animation">
        </ui-skeleton-loader>
      }
      
      <!-- Card actions -->
      @if (showActions) {
        <ui-skeleton-group variant="horizontal">
          <ui-skeleton-loader 
            shape="button"
            size="sm"
            width="auto"
            customWidth="80px"
            [animation]="animation">
          </ui-skeleton-loader>
          <ui-skeleton-loader 
            shape="button"
            size="sm"
            width="auto"
            customWidth="80px"
            [animation]="animation">
          </ui-skeleton-loader>
        </ui-skeleton-group>
      }
    </ui-skeleton-group>
  `
})
export class SkeletonCardComponent {
  @Input() showImage = true;
  @Input() showActions = true;
  @Input() contentLines = 3;
  @Input() animation: SkeletonAnimation = 'shimmer';

  get contentArray(): number[] {
    return Array.from({ length: this.contentLines }, (_, i) => i);
  }

  getCardLineWidth(index: number): SkeletonWidth {
    if (index === this.contentLines - 1) return 'w-50';
    return 'w-full';
  }
}

@Component({
  selector: 'ui-skeleton-profile',
  standalone: true,
  imports: [CommonModule, SkeletonLoaderComponent, SkeletonGroupComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <ui-skeleton-group variant="avatar-text">
      <!-- Profile avatar -->
      <ui-skeleton-loader 
        shape="avatar"
        [size]="avatarSize"
        [animation]="animation">
      </ui-skeleton-loader>
      
      <!-- Profile info -->
      <div class="ui-skeleton-content">
        <!-- Name -->
        <ui-skeleton-loader 
          shape="text"
          size="lg"
          width="w-50"
          [animation]="animation">
        </ui-skeleton-loader>
        
        <!-- Role/Title -->
        <ui-skeleton-loader 
          shape="text"
          size="sm"
          width="w-75"
          [animation]="animation">
        </ui-skeleton-loader>
        
        <!-- Additional info -->
        @if (showExtraInfo) {
          <ui-skeleton-loader 
            shape="text"
            size="sm"
            width="w-25"
            [animation]="animation">
          </ui-skeleton-loader>
        }
      </div>
    </ui-skeleton-group>
  `
})
export class SkeletonProfileComponent {
  @Input() avatarSize: SkeletonSize = 'lg';
  @Input() showExtraInfo = true;
  @Input() animation: SkeletonAnimation = 'shimmer';
}

@Component({
  selector: 'ui-skeleton-table-row',
  standalone: true,
  imports: [CommonModule, SkeletonLoaderComponent, SkeletonGroupComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <ui-skeleton-group variant="table">
      @for (column of columnArray; track $index) {
        <ui-skeleton-loader 
          shape="text"
          [width]="getColumnWidth($index)"
          [animation]="animation">
        </ui-skeleton-loader>
      }
    </ui-skeleton-group>
  `
})
export class SkeletonTableRowComponent {
  @Input() columns = 3;
  @Input() animation: SkeletonAnimation = 'shimmer';

  get columnArray(): number[] {
    return Array.from({ length: this.columns }, (_, i) => i);
  }

  getColumnWidth(index: number): SkeletonWidth {
    const widths: SkeletonWidth[] = ['w-25', 'w-50', 'w-25', 'w-full'];
    return widths[index % widths.length];
  }
}

// Convenience export for all skeleton components
export const SKELETON_COMPONENTS = [
  SkeletonLoaderComponent,
  SkeletonGroupComponent,
  SkeletonTextBlockComponent,
  SkeletonArticleComponent,
  SkeletonCardComponent,
  SkeletonProfileComponent,
  SkeletonTableRowComponent
] as const;6̵x% export * from './snackbar.component';x'import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, OnInit, OnDestroy, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/free-solid-svg-icons';
import { 
  faCheckCircle, 
  faExclamationTriangle, 
  faExclamationCircle, 
  faInfoCircle,
  faTimes
} from '@fortawesome/free-solid-svg-icons';

type SnackbarSize = 'sm' | 'md' | 'lg';
type SnackbarVariant = 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info';
type SnackbarPosition = 'bottom-center' | 'bottom-left' | 'bottom-right' | 'top-center' | 'top-left' | 'top-right';

export interface SnackbarAction {
  label: string;
  handler: () => void;
  disabled?: boolean;
}

@Component({
  selector: 'ui-snackbar',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.Default,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-snackbar"
      [class.ui-snackbar--sm]="size === 'sm'"
      [class.ui-snackbar--md]="size === 'md'"
      [class.ui-snackbar--lg]="size === 'lg'"
      [class.ui-snackbar--primary]="variant === 'primary'"
      [class.ui-snackbar--success]="variant === 'success'"
      [class.ui-snackbar--warning]="variant === 'warning'"
      [class.ui-snackbar--danger]="variant === 'danger'"
      [class.ui-snackbar--info]="variant === 'info'"
      [class.ui-snackbar--top]="position.startsWith('top')"
      [class.ui-snackbar--left]="position.includes('left')"
      [class.ui-snackbar--right]="position.includes('right')"
      [class.ui-snackbar--entering]="isEntering"
      [class.ui-snackbar--exiting]="isExiting"
      [attr.role]="role"
      [attr.aria-live]="ariaLive"
      [attr.aria-labelledby]="message ? 'snackbar-message-' + snackbarId : null">
      
      @if (showIcon && snackbarIcon) {
        <fa-icon 
          class="ui-snackbar__icon" 
          [icon]="snackbarIcon"
          [attr.aria-hidden]="true">
        </fa-icon>
      }
      
      <div class="ui-snackbar__content" [class.ui-snackbar__content--multiline]="isMultiline">
        <div 
          class="ui-snackbar__message"
          [id]="'snackbar-message-' + snackbarId">
          {{ message }}
          <ng-content></ng-content>
        </div>
      </div>
      
      @if (actions && actions.length > 0) {
        <div class="ui-snackbar__actions">
          @for (action of actions; track action.label) {
            <button
              type="button"
              class="ui-snackbar__action"
              [disabled]="action.disabled"
              [attr.aria-label]="action.label"
              (click)="handleActionClick(action)">
              {{ action.label }}
            </button>
          }
        </div>
      }
      
      @if (dismissible) {
        <button
          type="button"
          class="ui-snackbar__dismiss"
          [attr.aria-label]="dismissLabel"
          (click)="handleDismiss()"
          (keydown)="handleDismissKeydown($event)">
          <fa-icon [icon]="faTimes" [attr.aria-hidden]="true"></fa-icon>
        </button>
      }
    </div>
  `,
  styleUrl: './snackbar.component.scss'
})
export class SnackbarComponent implements OnInit, OnDestroy {
  @Input() size: SnackbarSize = 'md';
  @Input() variant: SnackbarVariant = 'default';
  @Input() message = '';
  @Input() showIcon = false;
  @Input() dismissible = true;
  @Input() autoDismiss = true;
  @Input() duration = 4000; // 4 seconds - shorter than toast
  @Input() position: SnackbarPosition = 'bottom-center';
  @Input() dismissLabel = 'Dismiss snackbar';
  @Input() role = 'status';
  @Input() ariaLive: 'polite' | 'assertive' | 'off' = 'polite';
  @Input() actions: SnackbarAction[] = [];
  @Input() isMultiline = false;
  
  @Output() dismissed = new EventEmitter<void>();
  @Output() expired = new EventEmitter<void>();
  @Output() shown = new EventEmitter<void>();
  @Output() hidden = new EventEmitter<void>();
  @Output() actionClicked = new EventEmitter<SnackbarAction>();
  
  // Icons
  readonly faCheckCircle = faCheckCircle;
  readonly faExclamationTriangle = faExclamationTriangle;
  readonly faExclamationCircle = faExclamationCircle;
  readonly faInfoCircle = faInfoCircle;
  readonly faTimes = faTimes;
  
  // Generate unique ID for accessibility
  readonly snackbarId = Math.random().toString(36).substr(2, 9);
  
  // State management
  isEntering = false;
  isExiting = false;
  private autoDismissTimeout?: any;
  private enterTimeout?: any;
  private exitTimeout?: any;
  
  get snackbarIcon(): IconDefinition | null {
    if (!this.showIcon) return null;
    
    switch (this.variant) {
      case 'success':
        return this.faCheckCircle;
      case 'warning':
        return this.faExclamationTriangle;
      case 'danger':
        return this.faExclamationCircle;
      case 'info':
        return this.faInfoCircle;
      case 'primary':
      case 'default':
      default:
        return this.faInfoCircle;
    }
  }
  
  ngOnInit(): void {
    this.show();
  }
  
  ngOnDestroy(): void {
    this.clearTimeouts();
  }
  
  show(): void {
    this.isEntering = true;
    
    this.enterTimeout = setTimeout(() => {
      this.isEntering = false;
      this.shown.emit();
      
      if (this.autoDismiss && this.duration > 0) {
        this.startAutoDismissTimer();
      }
    }, 300); // Animation duration
  }
  
  hide(): void {
    this.clearTimeouts();
    this.isExiting = true;
    
    this.exitTimeout = setTimeout(() => {
      this.isExiting = false;
      this.hidden.emit();
    }, 300); // Animation duration
  }
  
  handleDismiss(): void {
    this.hide();
    this.dismissed.emit();
  }
  
  handleDismissKeydown(event: KeyboardEvent): void {
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.handleDismiss();
    }
  }
  
  handleActionClick(action: SnackbarAction): void {
    if (!action.disabled) {
      action.handler();
      this.actionClicked.emit(action);
    }
  }
  
  private startAutoDismissTimer(): void {
    if (this.autoDismissTimeout) {
      clearTimeout(this.autoDismissTimeout);
    }
    
    this.autoDismissTimeout = setTimeout(() => {
      this.hide();
      this.expired.emit();
    }, this.duration);
  }
  
  private clearTimeouts(): void {
    if (this.autoDismissTimeout) {
      clearTimeout(this.autoDismissTimeout);
      this.autoDismissTimeout = undefined;
    }
    
    if (this.enterTimeout) {
      clearTimeout(this.enterTimeout);
      this.enterTimeout = undefined;
    }
    
    if (this.exitTimeout) {
      clearTimeout(this.exitTimeout);
      this.exitTimeout = undefined;
    }
  }
  
  // Pause auto-dismiss on mouse enter
  onMouseEnter(): void {
    if (this.autoDismissTimeout) {
      clearTimeout(this.autoDismissTimeout);
    }
  }
  
  // Resume auto-dismiss on mouse leave  
  onMouseLeave(): void {
    if (this.autoDismiss && this.duration > 0 && !this.isExiting) {
      this.startAutoDismissTimer();
    }
  }
}S5xB@use "../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-status-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  font-weight: 500;
  line-height: 1;
  text-align: center;
  white-space: nowrap;
  vertical-align: baseline;
  transition: all 150ms cubic-bezier(0, 0, 0.2, 1);
  position: relative;

  // Size variants
  &--small {
    padding: 0.125rem 0.375rem;
    font-size: 0.625rem;
    min-height: 1.125rem;

    &.ui-status-badge--with-icon .ui-status-badge__icon {
      font-size: 0.625rem;
    }

    &.ui-status-badge--with-dot .ui-status-badge__dot {
      width: 0.375rem;
      height: 0.375rem;
    }
  }

  &--medium {
    padding: 0.25rem 0.5rem;
    font-size: 0.75rem;
    min-height: 1.25rem;

    &.ui-status-badge--with-icon .ui-status-badge__icon {
      font-size: 0.75rem;
    }

    &.ui-status-badge--with-dot .ui-status-badge__dot {
      width: 0.5rem;
      height: 0.5rem;
    }
  }

  &--large {
    padding: 0.375rem 0.75rem;
    font-size: 0.875rem;
    min-height: 1.5rem;

    &.ui-status-badge--with-icon .ui-status-badge__icon {
      font-size: 0.875rem;
    }

    &.ui-status-badge--with-dot .ui-status-badge__dot {
      width: 0.625rem;
      height: 0.625rem;
    }
  }

  // Shape variants
  &--rounded {
    border-radius: 0.25rem;
  }

  &--pill {
    border-radius: 9999px;
  }

  &--square {
    border-radius: 0;
  }

  // Style modifiers
  &--uppercase {
    text-transform: uppercase;
    letter-spacing: 0.05em;
  }

  &--bold {
    font-weight: 700;
  }

  // Success variant
  &--success {
    background: hsl(142, 76%, 90%);
    color: hsl(142, 76%, 25%);
    border: 1px solid hsl(142, 76%, 80%);

    &.ui-status-badge--outlined {
      background: transparent;
      color: hsl(142, 76%, 35%);
      border-color: hsl(142, 76%, 50%);
    }

    .ui-status-badge__dot {
      background: hsl(142, 76%, 45%);
    }
  }

  // Warning variant
  &--warning {
    background: hsl(45, 93%, 88%);
    color: hsl(45, 93%, 25%);
    border: 1px solid hsl(45, 93%, 75%);

    &.ui-status-badge--outlined {
      background: transparent;
      color: hsl(45, 93%, 35%);
      border-color: hsl(45, 93%, 50%);
    }

    .ui-status-badge__dot {
      background: hsl(45, 93%, 45%);
    }
  }

  // Danger variant
  &--danger {
    background: hsl(0, 84%, 90%);
    color: hsl(0, 84%, 25%);
    border: 1px solid hsl(0, 84%, 80%);

    &.ui-status-badge--outlined {
      background: transparent;
      color: hsl(0, 84%, 35%);
      border-color: hsl(0, 84%, 50%);
    }

    .ui-status-badge__dot {
      background: hsl(0, 84%, 45%);
    }
  }

  // Info variant
  &--info {
    background: hsl(207, 90%, 88%);
    color: hsl(207, 90%, 25%);
    border: 1px solid hsl(207, 90%, 75%);

    &.ui-status-badge--outlined {
      background: transparent;
      color: hsl(207, 90%, 35%);
      border-color: hsl(207, 90%, 50%);
    }

    .ui-status-badge__dot {
      background: hsl(207, 90%, 45%);
    }
  }

  // Neutral variant
  &--neutral {
    background: hsl(289, 14%, 90%);
    color: hsl(279, 14%, 25%);
    border: 1px solid hsl(289, 14%, 80%);

    &.ui-status-badge--outlined {
      background: transparent;
      color: hsl(279, 14%, 35%);
      border-color: hsl(289, 14%, 60%);
    }

    .ui-status-badge__dot {
      background: hsl(287, 12%, 47%);
    }
  }

  // Primary variant
  &--primary {
    background: hsl(263, 100%, 88%);
    color: hsl(260, 100%, 25%);
    border: 1px solid hsl(263, 100%, 75%);

    &.ui-status-badge--outlined {
      background: transparent;
      color: hsl(258, 100%, 47%);
      border-color: hsl(258, 100%, 47%);
    }

    .ui-status-badge__dot {
      background: hsl(258, 100%, 47%);
    }
  }

  // Secondary variant
  &--secondary {
    background: hsl(262, 25%, 84%);
    color: hsl(256, 29%, 25%);
    border: 1px solid hsl(262, 25%, 75%);

    &.ui-status-badge--outlined {
      background: transparent;
      color: hsl(258, 29%, 40%);
      border-color: hsl(258, 29%, 40%);
    }

    .ui-status-badge__dot {
      background: hsl(258, 29%, 40%);
    }
  }
}

.ui-status-badge__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  line-height: 1;
}

.ui-status-badge__dot {
  border-radius: 50%;
  flex-shrink: 0;
}

.ui-status-badge__text {
  flex: 1;
  min-width: 0;
}

// Hover effects for interactive badges (when used in buttons, etc.)
button .ui-status-badge,
a .ui-status-badge,
[role="button"] .ui-status-badge {
  transition: all 150ms cubic-bezier(0, 0, 0.2, 1);

  &:hover {
    transform: scale(1.02);
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .ui-status-badge {
    border-width: 2px;
    font-weight: 700;

    &--outlined {
      background: buttonface;
      color: buttontext;
      border-color: buttontext;
    }
  }
}

// Reduced motion
@media (prefers-reduced-motion: reduce) {
  .ui-status-badge {
    transition: none;
  }
}\Kx۫M}(gqFbQjniF PXssx3import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';

export type StatusBadgeVariant = 'success' | 'warning' | 'danger' | 'info' | 'neutral' | 'primary' | 'secondary';
export type StatusBadgeSize = 'small' | 'medium' | 'large';
export type StatusBadgeShape = 'rounded' | 'pill' | 'square';

@Component({
  selector: 'ui-status-badge',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <span [class]="badgeClasses" [attr.aria-label]="ariaLabel">
      @if (icon) {
        <span class="ui-status-badge__icon" [innerHTML]="icon"></span>
      }
      @if (dot) {
        <span class="ui-status-badge__dot"></span>
      }
      <span class="ui-status-badge__text">
        <ng-content></ng-content>
      </span>
    </span>
  `,
  styleUrl: './status-badge.component.scss'
})
export class StatusBadgeComponent {
  @Input() variant: StatusBadgeVariant = 'neutral';
  @Input() size: StatusBadgeSize = 'medium';
  @Input() shape: StatusBadgeShape = 'rounded';
  @Input() icon: string = '';
  @Input() dot: boolean = false;
  @Input() outlined: boolean = false;
  @Input() uppercase: boolean = true;
  @Input() bold: boolean = false;
  @Input() ariaLabel: string = '';
  @Input() class: string = '';

  get badgeClasses(): string {
    return [
      'ui-status-badge',
      `ui-status-badge--${this.variant}`,
      `ui-status-badge--${this.size}`,
      `ui-status-badge--${this.shape}`,
      this.outlined ? 'ui-status-badge--outlined' : '',
      this.uppercase ? 'ui-status-badge--uppercase' : '',
      this.bold ? 'ui-status-badge--bold' : '',
      this.icon ? 'ui-status-badge--with-icon' : '',
      this.dot ? 'ui-status-badge--with-dot' : '',
      this.class
    ].filter(Boolean).join(' ');
  }
}1Mx;`@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;
/**
 * ==========================================================================
 * THEME SWITCHER COMPONENT STYLES
 * ==========================================================================
 * Material Design 3 inspired styling for the theme switcher component.
 * Uses CSS variables for runtime theming support.
 * ==========================================================================
 */


// Tokens available globally via main application styles


.theme-switcher {
  background-color: $semantic-color-surface-primary;
  border-radius: $semantic-border-radius-lg;
  padding: $semantic-spacing-component-lg;
  box-shadow: $semantic-shadow-elevated;
  border: 1px solid $semantic-color-border-primary;
  position: relative;
  max-width: 400px;
  width: 100%;

  // ==========================================================================
  // HEADER STYLES
  // ==========================================================================

  &__header {
    margin-bottom: $semantic-spacing-component-lg;
  }

  &__title {
    @extend .skyui-heading--h3 !optional;
    color: $semantic-color-text-primary;
    margin: 0 0 $semantic-spacing-component-2xs 0;
  }

  &__subtitle {
    @extend .skyui-text--small !optional;
    color: $semantic-color-text-secondary;
    margin: 0;
  }

  // ==========================================================================
  // SECTION STYLES
  // ==========================================================================

  &__section {
    margin-bottom: $semantic-spacing-component-lg;

    &:last-child {
      margin-bottom: 0;
    }
  }

  &__section-title {
    @extend .skyui-heading--h4 !optional;
    color: $semantic-color-text-primary;
    margin: 0 0 $semantic-spacing-component-sm 0;
  }

  &__section-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: $semantic-spacing-component-sm;
  }

  // ==========================================================================
  // DARK MODE TOGGLE STYLES
  // ==========================================================================

  &__option {
    display: flex;
    align-items: center;
  }

  &__label {
    display: flex;
    align-items: center;
    cursor: pointer;
    @extend .skyui-text--medium !optional;
    color: $semantic-color-text-primary;

    &:hover {
      color: $css-color-primary;
    }
  }

  &__checkbox {
    position: absolute;
    opacity: 0;
    cursor: pointer;

    &:checked + &-custom {
      background-color: $css-color-primary;
      border-color: $css-color-primary;

      &::after {
        display: block;
      }
    }

    &:focus + &-custom {
      outline: 2px solid $css-color-primary;
      outline-offset: 2px;
    }

    &:disabled + &-custom {
      opacity: 0.6;
      cursor: not-allowed;
    }
  }

  &__checkbox-custom {
    width: 20px;
    height: 20px;
    border: 2px solid $css-color-outline;
    border-radius: $semantic-border-radius-sm;
    margin-right: $semantic-spacing-component-sm;
    position: relative;
    transition: all 0.2s ease;
    display: flex;
    align-items: center;
    justify-content: center;

    &::after {
      content: '✓';
      color: $css-color-on-primary;
      font-size: 12px;
      font-weight: bold;
      display: none;
    }
  }

  &__text {
    user-select: none;
  }

  // ==========================================================================
  // THEME GRID STYLES
  // ==========================================================================

  .theme-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
    gap: $semantic-spacing-component-sm;
  }

  .theme-card {
    background-color: $semantic-color-primary-container;
    border: 2px solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-md;
    padding: $semantic-spacing-component-sm;
    cursor: pointer;
    transition: all 0.2s ease;
    position: relative;
    text-align: center;

    &:hover:not(&--disabled) {
      border-color: $css-color-primary;
      box-shadow: $semantic-shadow-elevated;
      transform: translateY(-1px);
    }

    &--active {
      border-color: $css-color-primary;
      background-color: $css-color-primary-container;
    }

    &--disabled {
      opacity: 0.6;
      cursor: not-allowed;
    }

    &__preview {
      margin-bottom: $semantic-spacing-component-xs;
    }

    &__color-primary {
      width: 100%;
      height: 32px;
      border-radius: $semantic-border-radius-sm;
      margin-bottom: $semantic-spacing-component-2xs;
    }

    &__color-details {
      display: flex;
      gap: $semantic-spacing-component-2xs;
    }

    &__color-secondary,
    &__color-tertiary {
      flex: 1;
      height: 16px;
      border-radius: $semantic-border-radius-xs;
    }

    &__name {
      @extend .skyui-text--small !optional;
      color: $semantic-color-text-primary;
      font-weight: $semantic-typography-font-weight-medium;
      display: block;
    }

    &__active-indicator {
      position: absolute;
      top: 4px;
      right: 4px;
      color: $css-color-primary;
      background-color: $semantic-color-surface-primary;
      border-radius: 50%;
      width: 20px;
      height: 20px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 12px;
    }
  }

  // ==========================================================================
  // TOGGLE BUTTON STYLES
  // ==========================================================================

  &__toggle-btn {
    @extend .skyui-interactive-text--button-small !optional;
    background-color: transparent;
    color: $css-color-primary;
    border: 1px solid $css-color-primary;
    border-radius: $semantic-border-radius-sm;
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    cursor: pointer;
    transition: all 0.2s ease;

    &:hover {
      background-color: $css-color-primary-container;
      border-color: $css-color-primary;
    }

    &--active {
      background-color: $css-color-primary;
      color: $css-color-on-primary;

      &:hover {
        background-color: var(--color-primary-hover, $css-color-primary);
        filter: brightness(0.9);
      }
    }

    &:disabled {
      opacity: 0.6;
      cursor: not-allowed;
    }
  }

  // ==========================================================================
  // CUSTOM PANEL STYLES
  // ==========================================================================

  &__custom-panel {
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.3s ease;

    &--visible {
      max-height: 800px;
    }
  }

  // ==========================================================================
  // CUSTOM COLOR INPUT STYLES
  // ==========================================================================

  .custom-color-input {
    margin-bottom: $semantic-spacing-component-md;

    &__label {
      @extend .skyui-form-text--label !optional;
      display: block;
      margin-bottom: $semantic-spacing-component-2xs;
      color: $semantic-color-text-primary;
    }

    &__container {
      display: flex;
      gap: $semantic-spacing-component-xs;
      align-items: center;
    }

    &__picker {
      width: 48px;
      height: 48px;
      border: none;
      border-radius: $semantic-border-radius-sm;
      cursor: pointer;
      background: none;

      &:disabled {
        opacity: 0.6;
        cursor: not-allowed;
      }
    }

    &__text {
      @extend .skyui-form-text--input !optional;
      flex: 1;
      padding: $semantic-spacing-component-sm;
      border: 1px solid $css-color-outline;
      border-radius: $semantic-border-radius-sm;
      background-color: $semantic-color-surface-primary;
      color: $semantic-color-text-primary;
      font-family: $semantic-typography-font-family-mono;

      &:focus {
        border-color: $css-color-primary;
        outline: none;
        box-shadow: 0 0 0 2px rgba($css-color-primary, 0.2);
      }

      &:disabled {
        opacity: 0.6;
        cursor: not-allowed;
        background-color: $semantic-color-surface-variant;
      }
    }
  }

  // ==========================================================================
  // THEME NAME INPUT STYLES
  // ==========================================================================

  .custom-theme-name {
    margin-bottom: $semantic-spacing-component-md;

    &__label {
      @extend .skyui-form-text--label !optional;
      display: block;
      margin-bottom: $semantic-spacing-component-2xs;
      color: $semantic-color-text-primary;
    }

    &__input {
      @extend .skyui-form-text--input !optional;
      width: 100%;
      padding: $semantic-spacing-component-sm;
      border: 1px solid $css-color-outline;
      border-radius: $semantic-border-radius-sm;
      background-color: $semantic-color-surface-primary;
      color: $semantic-color-text-primary;

      &:focus {
        border-color: $css-color-primary;
        outline: none;
        box-shadow: 0 0 0 2px rgba($css-color-primary, 0.2);
      }

      &:disabled {
        opacity: 0.6;
        cursor: not-allowed;
        background-color: $semantic-color-surface-variant;
      }
    }
  }

  // ==========================================================================
  // COLOR VALIDATION STYLES
  // ==========================================================================

  .color-validation {
    margin-bottom: $semantic-spacing-component-md;
    padding: $semantic-spacing-component-sm;
    border-radius: $semantic-border-radius-sm;

    &--error {
      background-color: rgba($css-color-error, 0.1);
      border: 1px solid $css-color-error;
    }

    &--success {
      background-color: rgba($semantic-color-success, 0.1);
      border: 1px solid $semantic-color-success;
    }

    &__title {
      @extend .skyui-text--small !optional;
      font-weight: $semantic-typography-font-weight-medium;
      margin-bottom: $semantic-spacing-component-2xs;
    }

    &__list {
      margin: 0;
      padding-left: $semantic-spacing-component-md;
      
      li {
        @extend .skyui-text--small !optional;
        margin-bottom: $semantic-spacing-component-2xs;

        &:last-child {
          margin-bottom: 0;
        }
      }
    }

    &--error &__title,
    &--error &__list {
      color: $css-color-error;
    }

    &--success &__title,
    &--success &__list {
      color: $semantic-color-success;
    }
  }

  // ==========================================================================
  // COLOR PREVIEW STYLES
  // ==========================================================================

  .color-preview {
    margin-bottom: $semantic-spacing-component-md;

    &__title {
      @extend .skyui-text--small !optional;
      font-weight: $semantic-typography-font-weight-medium;
      color: $semantic-color-text-primary;
      margin-bottom: $semantic-spacing-component-xs;
    }

    &__palette {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
      gap: $semantic-spacing-component-2xs;
    }

    &__swatch {
      aspect-ratio: 1;
      border-radius: $semantic-border-radius-sm;
      display: flex;
      align-items: center;
      justify-content: center;
      text-align: center;
      border: 1px solid $semantic-color-border-primary;
    }

    &__swatch-label {
      font-size: 10px;
      font-weight: $semantic-typography-font-weight-medium;
      text-transform: capitalize;
      text-shadow: 0 0 2px rgba(0, 0, 0, 0.5);
    }
  }

  // ==========================================================================
  // ACTION BUTTON STYLES
  // ==========================================================================

  .custom-color-actions {
    margin-bottom: $semantic-spacing-component-md;

    &__apply {
      @extend .skyui-interactive-text--button-medium !optional;
      width: 100%;
      background-color: $css-color-primary;
      color: $css-color-on-primary;
      border: none;
      border-radius: $semantic-border-radius-md;
      padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
      cursor: pointer;
      transition: all 0.2s ease;
      font-weight: $semantic-typography-font-weight-medium;

      &:hover:not(:disabled) {
        background-color: var(--color-primary-hover, $css-color-primary);
        filter: brightness(0.9);
        box-shadow: $semantic-shadow-elevated;
        transform: translateY(-1px);
      }

      &:disabled {
        opacity: 0.6;
        cursor: not-allowed;
        transform: none;
        box-shadow: none;
      }
    }
  }

  // ==========================================================================
  // RESET BUTTON STYLES
  // ==========================================================================

  &__reset-btn {
    @extend .skyui-interactive-text--button-medium !optional;
    width: 100%;
    background-color: transparent;
    color: $css-color-error;
    border: 1px solid $css-color-error;
    border-radius: $semantic-border-radius-md;
    padding: $semantic-spacing-component-sm $semantic-spacing-component-lg;
    cursor: pointer;
    transition: all 0.2s ease;

    &:hover:not(:disabled) {
      background-color: rgba($css-color-error, 0.1);
      box-shadow: $semantic-shadow-elevated;
    }

    &:disabled {
      opacity: 0.6;
      cursor: not-allowed;
    }
  }

  // ==========================================================================
  // LOADING OVERLAY STYLES
  // ==========================================================================

  &__loading-overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba($css-color-scrim, 0.5);
    border-radius: $semantic-border-radius-lg;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    z-index: 10;
  }

  &__loading-spinner {
    width: 32px;
    height: 32px;
    border: 3px solid $semantic-color-border-primary;
    border-top: 3px solid $css-color-primary;
    border-radius: 50%;
    animation: spin 1s linear infinite;
    margin-bottom: $semantic-spacing-component-sm;
  }

  &__loading-text {
    @extend .skyui-text--small !optional;
    color: $semantic-color-text-primary;
    font-weight: $semantic-typography-font-weight-medium;
  }
}

// ==========================================================================
// ANIMATIONS
// ==========================================================================

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

// ==========================================================================
// RESPONSIVE DESIGN
// ==========================================================================

@media (max-width: $semantic-breakpoint-sm) {
  .theme-switcher {
    padding: $semantic-spacing-component-md;
    
    .theme-grid {
      grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
    }
    
    .color-preview {
      &__palette {
        grid-template-columns: repeat(auto-fit, minmax(60px, 1fr));
      }
    }
  }
}۵:-xawnJ
.ui-time-picker {
q6width: 100%VSIZE VARIANT U&--sm {
    .ui-time-picker1kmin-height: $semantic-sizing-input-height-sm;
    }

    .ui-time-picker__field {
      font-size: 0.875rem-'/}

    .ui-time-picker__label {
      font-sizesize-sm*="  }

  &--md {
    .ui-time-picker1gmin-height: $semantic-sizing-input-height-md;
    }

    .ui-time-picker__field {
      font-size: 1rem/3%/}

    .ui-time-picker__label {
      font-sizesize-mdO'3-$}
  }

  &--lg {
    .ui-time-picker1kmin-height: $semantic-sizing-input-height-lg;
    }

    .ui-time-picker__field {
      font-size: 1.125rem-%/}

    .ui-time-picker__label {
      font-sizesize-lgO'3-V)\VARIANT$[!&--outlined {
    .ui-time-picker1border%width-17+\/+)  background D}

    .ui-time-picker__field {
      border: none;
      background3(}
  }

  &--filled {
    .ui-time-picker1z
 secondary;
      border%width-1 solid transparent;
  !3  border!%width-37+D}

    .ui-time-picker__field {
      border: none;
      background3,}
  }

  &--underlined {
    .ui-time-picker1z
3!%width-17+\/+	K0;
    }

    .ui-time-picker__field {
      border: none;
      background3V)\STATE VARIANT U&--error {
    .ui-time-picker18
G&.ui-time-picker__label {
  ~G&'  }

  &--success {
    .ui-time-picker18
I$&'  }

  &--warning {
    .ui-time-picker18
$warning;
    }
  }

  &--disabled {
#*pointer-events: none;

    .ui-time-picker1z
 	secondary4*&--open {
    .ui-time-picker18
'%
input-focuO)eMPONENT ELEMENT U
&__label {Q8=+line-hVline-height-tight;

    &--required {
      .ui-time-picker__required-indicator {
    ~error;
        margin-lefta&7 &__container {
vB$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out//
    &:hover:not(.ui-time-picker--disabled &) {1
Zborder-secondary;
    }

    &--has-clear {
      .ui-time-picker__field {
        padding$xl1 &__prefix-icon {
v}lefta-	Utertiary;
    pointer-events: none;
  }

  &__field {
    flex: 1;
    border: none;
#
background3!5.font-family: inherit;

    &::placeholder {
  ~ tertiary;
    }

    &:focus {
#)	clear-btn	+v}    width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
    border: none;
    background: transparen3tertiary/w7` B$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out`	z
 second'9}

    &:focus-visible
&focus
#%  }

  &__helper-text {
    font-sizesize-sm;
    margin-topa&line-hline-height-normal%G&%2)&
    &--warning {
  ~#warning;
    }

    &--default {
  ~ 9V)\TIME PICKER DROPDOWNA5Wdropdown		top: 100%5!z-index: 1000;
    margin-topa&
background border%width-172~7`lg;
0!dropdown%+%(min-width: 320px;
  }

  &__time-displayo.6  }

  &__time-sections {
v}    gapa&__time-section {
q65gapa$}

  &__time-btn {
v}    width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
    border: none;
    background: transparen395w7` B$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out`	z
 second4}

    &:focus-visible
&focus
#&  }

  &__time-input {
    width: 60px%+'border%width-172~7`3
background )font-size: 1.125remP8>,JS$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out;

    &:focus {
#8
'%input-focus;
    }

    &::-webkit-outer-spin-button,
    &::-webkit-inner-spin-button {
      -webkit-appearance: none;
      margin: 0;
    }

    &[type=number] {
      -moz-appearance: textfield;
    }
  }

  &__time-label {
    font-size: $semantic-size-xs|"9Ytext-transform: uppercase;
    letter-spacing: 0.5px;
  }

  &__separator {
    font-sizesize-xlP84bold|9;
    align-selfEtop: -20px; // Adjust to center with inputs
  }

  &__ampm-section {
q6gapa&margin-lefta%$}

  &__ampm-btn {O*'border%width-172~7` 
background 95font-size: 0.875remP8>B$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out`	z
 second4}

    &:focus-visible
&focus
): $semantic-color'^/>
	7% : $semantic-color-primary-focus;`#focus1 j
PRESET TIM V&__presets {
    border-top%width-17subtle;
    padding-topa%&7+%%}

  &__presets-title {
    font-sizesize-smP8>97+Q  text-transform: uppercase;
    letter-spacing: 0.5px;
  }

  &__presets-list {
flex-wrap: wrap;
    gapa$}

  &__preset-btn {O*'border%width-172~7` 
background 95font-size: 0.875remB$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out`	z
 second6^/>
	,border-secondary;
    }

    &:focus-visible
&focus
#;ZACTION U&__actions {
6flex-end;
    gapa-
border-top%width-17subtle;
    padding-topa%$}

  &__action-btn {O,3%w7`3font-size: 0.875remP8>3'$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out;
    min-width: 80px;

    &:focus-visible {
      outline: 
&focus
)	--primaryq: $semantic-color'^/%width-170, : $semantic-color-primary-focus;`#Ufocus;
      }

      &:active {
        background: $semantic-color-primary-pressed;`#press--secondaryq39  border%width-17'9# secondary;
    ~-e#>border-secondary;
      }

      &:active {
        background 	secondary1 jRESPONSIVE DESIGNA5T@media (max-width: 768px) {
    &__dropdown {
      position: fixed;
      top: 50%;
      left: 50%;
      right: auto;
      !1Y(-50%, -50%);
      width: 90vw;
      max-width: 350px;
    }

    &__time-sections {
  m6 f#%}

    &__separator {S
    &__ampm-section {
      flex-direction: row;
      margin-left: 0;
    }
  }
}ݱ3x_>|gqFbQjniFrk W@jxXn`Odate-picker {
pdat`$min-height: 36px;
    }

    .ui-dat-
o>0''}

    .ui-dat`#0.8125rem;
  /L#dat`$min-height: 48px;
    }

    .ui-dat-
ondat`#>0-?_dat`$min-height: 56px;
    }

    .ui-dat-
Badat`#z+?_	
S xdat`"12+~'	
P   background-0Ydat-
Rdat`
ackground-0.2NZ3-dat-
RK	dat`	M2+~'	
dat-
dat`:\.ui-dat`8-)dat`:Adat`dat`4G4dat`:1 0x
ZQ*dat~ddatrdat-
rCALENDA280px;
  }

  &__header.*space-between;>nav-btn.6\navigati}&navigation;
A
9m%$jHmonth-year {
    flex: 1;
    text-align: center;
  }

  &__month-btn {
A
9&{	%:0R
!@-q&__calendar {
    width: 100%;
  }

  &__day-headers {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: $!-?}

  &__day-header { !*)m'-+Cdays {
    display: grid;
    grid-template-columns: repeat(7, 1fr)5day.6width: 32px;
    height: 32px;
A
9&	D30,`:not(&--disabled)<-jl1today%1
-container0-1".z0}

    &--selected%18".medium3712    }

    &--other-month {1-#x--disabled {1-#disabled?!  opacity: 0.5p
bMONTH/YEAR PICKERU__month-year-picker.#!Emonths {
    display: grid;
    grid-template-columns: repeat(3, 1fr)5month-optio//M

9&	D30,-jl1selected%18".medium3712
year-input.+P
}

  &__year-field/Yړ{	 width: 80px/ 
S85+20px;
    }
  }
}nWxmwnC$
.ui-time-picker {
  display: flex;
h6width: 100%;
$Q SIZE VARIANTV--sm {
    .ui-time-picker__container {
      min-height: $semantic-sizing-input-height-sm;
    }

    .ui-time-picker__field {
      font-size: 0.875rem;
  P}

    .ui-time-picker__,size6++
  }

  &--md {
    .ui-time-picker__container {
      min-height: $semantic-sizing-input-height-md;
    }

    .ui-time-picker_"_field {
      font-size: 1rem;
  )3 md;
    }

    .ui-time-picker__,size-md3sm;
    }
  }

  &--lg {
    .ui-time-picker__container {
      min-height: $semantic-sizing-input-height-lg;
    }

    .ui-ti0me-picker__field {
      font-size: 1.125rem;
  ) md;
    }

    .ui-time-picker__,size-lg3sm;1aVARIAN\U&--outlined {
    .ui-time-picker__container {
      border: $semantic-border-width-17+/
	 md;
      background0).ui-time-picker__field {background: transparent;
    }
  }

  &--filled {
    .ui-time-picker__container {
      background0)Csecondary;
      border: $semantic-border-width-1 solid transparent/1md;
      border-bottom: $semantic-border-width-37+.ui-time-picker__field {ackground: transparent;
    }
  }

  &--underlined {
    .ui-time-picker__container {
      background: transparent;
      bord bottom: $semantic-border-width-17+/
	&0;
    }

    .ui-time-picker__field {ackground: transparent;1aSTATE VARIANTV7--error {
    .ui-time-picker__container {
      border.(.ui-time-picker__label {*Nerror;
    }
  }

  &--success {
    .ui-time-picker__container {
      border.D):&--warning {
    .ui-time-picker__container {
      border.warning;
    }
  }

Hpointer-events: none;

    .ui-time-picker__container {
      background0)	secondary*7&--open {
    .ui-time-picker__container {
      border.)input-focus;1aCOMPONENT ELEMENTXlabel {
>&8)line-h*Tline-height-tight;

    &--required {
      .ui-time-picker__required-indicator {
  *error;
        margin-left!xs`$
&__contain/*B$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out<
    &:hover:not(.ui-time-picker--disabled &) {
      border..7Ysecondary;
    }

    &--has-clear {
      .ui-time-picker__field {
        padding-right!xl`$&__prefix-icon16margin-left!sm"tertiary;
    pointer-events: none;
  }

  &__field {
    flex: 1;
    border: none;
    outline: none;
    background: transpa3.8!+font-family: inherit;

    &::placeholder {*#tertiary;
    }

    &:focus {
P}
  }

  &__clear-btn5right!smQ66width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
    border: none;
    background: transparent;
 
3tertiary/Rtransition: all $semantic-motion-duration-fast $semantic-motion-easing-ease-in-out\!0)	secondaryQ$5secondary;
    }

    &:focus-visible {
      outlinefocus
#%  }

  &__helper-text {
    font-sizesize-sm;
    margin-top!xs;
    line-h*#line-height-normal;

    &--error {*(]&*&--warning {*warning;
    }

    &--defaul!)!p
secondary;1aTIME PICKER DROPDOWN$T&__dropdown5$100%5!z-index: 1000;
    margin-top!xs;
    background0): $semantic-border-width-172 dropdown+0md;
    min-width: 320px;
  }

  &__time-display!6  }

  &__time-sections16+!7time-secj65+!xs;
  }

  &__time-btn16width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
    border: none;
    background: transparent;
 
3#/Rtransition: all $semantic-motion-duration-fast $semantic-motion-easing-ease-in-out\!0)	secondary9:focus-visible {
      outlinefocus
#&  }

  &__time-input {
    width: 60pxR border: $semantic-border-width-172 md;
    background0)&8.size: 1.125rem;
>g    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease-in-out;

    &:focus {
P7)input-focus;
    }

    &::-webkit-outer-spin-button,
    &::-webkit-inner-spin-button {
      -webkit-appearance: none;
      margin: 0;
    }

    &[type=number] {
      -moz-appearance: textfield;
    }
  }

  &__time-label {
    font-size: $semantic-size-xs1Ytext-transform: uppercase;
    letter-spacing: 0.5px;
  }

  &__separator {
    font-size	size-xl;
2bold 8/
exs;
    align-self: center;
    margin-top: -20px; // Adjust to center with inputs
  }

  &__ampm-secj6+!xs;
    margin-left!md;
  }

  &__ampm-btn {Q border: $semantic-border-width-172(
background0)+font-size: 0.875rem;
>Rtransition: all $semantic-motion-duration-fast $semantic-motion-easing-ease-in-out\!0)	secondary9:focus-visible {
      outlinefocus
)~	ackgroundYE/	7),focus;
        border.primary-focus`$j
PRESET TIMY2presets {
    border-top: $semantic-border-width-17subtle;
    padding-top!md;
!/+md;
  }

  &__presets-title {
    font-size	size-sm;
>1!%Tsm;
    text-transform: uppercase;
    letter-spacing: 0.5px;
  }

  &__presets-list1flex-wrap: wrap;
+%xs;
  }

  &__preset-btn {Q border: $semantic-border-width-172(
background0)+font-size: 0.875rem;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease-in-out;

    &:hover {
   p0)	secondaryQ37.75secondary;
    }

    &:focus-visible {
      outlinefocus
#1ZACTIONXactions1+
flex-end;
+%%top: $semantic-border-width-17subtle;
    padding-top!md;
  }

  &__action-btn {*3md-md;
    font-size: 0.875rem;
>$semantic-motion-duration-fast $semantic-motion-easing-ease-in-out;
    min-width: 80px;

    &:focus-visible {
      outline: focus
)--primary {
      backgroundYE/$semantic-border-width-1 solid0%focus;
        border.&primary-focus;
      }

      &:active@pressed;
        border.primary-pressed;()secondary {
      background: transparentQ$1secondary;
      border: $semantic-border-width-17'2#0)secondary;
  *1  border..7"secondary;
      }

      &:active@0)	secondary`$jRESPONSIVE DESIGN$T@media (max-width: 768px) {
    &__dropdown {
      position: fixed;
      top: 50%;
      left: 50%;
      right: auto;
      UY(-50%, -50%);
      width: 90vw;
      max-width: 350px;
    }

    &__time-sections {
  f6 +#md;
    }

    &__separator {S
    &__ampm-section {
      flex-direction: row;
      margin-left: 0;
    }
  }
}mrd}xNn`HdatK"dat36px;
    }

    .ui-datP#gdat>#0.8125reUdat48px;
    }

    .ui-datPdat>#%Ldat56px;
    }

    .ui-datZlg;
    }

    .ui-dat>#1remD.(Sxdat"-21
p#/	-"4_datP>
:dat,	-"4'2GZ3px1datP>
:D	dat,^
_	421
#datP>
dat:}dat>@datedat:Jdat,5A3dat:21datwddatrdatPkCALENDAR DROPDOWA5U280px;
  }

  &__head58space-between;
/)navqnavigation;
    con-navigatimonth-year {
    flex: 1 }

  &__month-btn {
9font-size: 1<0XRœ-q&__calendar {
    width: 100%;
  }

  &__day-headers {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: $#*,*}

  &__day-header { %|')e'O;
  }

  &__days {
    display: grid;
    grid-template-columns: repeat(7, 1fr)#-}

  &__dayPwidth: 32px;
    height: 32px;
9/F`:not(&--disabled)<-j'today%2
container;21E0:}

    &--selected%211E062J(3other-monthq 
--disabledq disabled8!  opacity: 0.5; (aMONTH/YEAR PICKERWmonth-year-pick6'Emonths {
    display: grid;
    grid-template-columns: repeat(3, 1fr)#-}

  &__month-option {
)P
9/F-j'selected%211E062J(&__year-input'}

  &__year-field {
)/-3A:re width: 80px@a B4~20px;
    }
  }
}2-x</**
 * ==========================================================================
 * THEME SWITCHER COMPONENT
 * ==========================================================================
 * Interactive component for runtime theme switching.
 * Supports predefined themes, custom colors, and dark mode toggle.
 * Provides color validation and preview functionality.
 * ==========================================================================
 */

import { Component, OnInit, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Subject } from 'rxjs';
import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';

import { ThemeService, ThemeConfig, ThemeState } from '../../../core/services/theme.service';

@Component({
  selector: 'app-theme-switcher',
  standalone: true,
  imports: [CommonModule, FormsModule],
  template: `
    <!--
    ==========================================================================
    THEME SWITCHER TEMPLATE
    ==========================================================================
    Interactive UI for runtime theme switching with Material Design 3 styling
    ==========================================================================
    -->

    <div class="theme-switcher">
      <!-- Theme Switcher Header -->
      <div class="theme-switcher__header">
        <h3 class="theme-switcher__title">Theme Settings</h3>
        <p class="theme-switcher__subtitle">Customize your app's appearance</p>
      </div>

      <!-- Dark Mode Toggle -->
      <div class="theme-switcher__section">
        <div class="theme-switcher__option">
          <label class="theme-switcher__label">
            <input 
              type="checkbox" 
              class="theme-switcher__checkbox"
              [checked]="isDarkMode"
              (change)="onDarkModeToggle()"
              [disabled]="isApplyingTheme"
            >
            <span class="theme-switcher__checkbox-custom"></span>
            <span class="theme-switcher__text">Dark mode</span>
          </label>
        </div>
      </div>

      <!-- Predefined Themes -->
      <div class="theme-switcher__section">
        <h4 class="theme-switcher__section-title">Predefined Themes</h4>
        <div class="theme-grid">
          @for (theme of availableThemes; track theme.name) {
            <div 
              class="theme-card"
              [class.theme-card--active]="isThemeActive(theme.name)"
              [class.theme-card--disabled]="isApplyingTheme"
              (click)="onThemeChange(theme.name)"
            >
            <div class="theme-card__preview">
              <div 
                class="theme-card__color-primary" 
                [style.backgroundColor]="theme.primary"
              ></div>
              <div class="theme-card__color-details">
                <div 
                  class="theme-card__color-secondary" 
                  [style.backgroundColor]="theme.secondary || '#625B71'"
                ></div>
                <div 
                  class="theme-card__color-tertiary" 
                  [style.backgroundColor]="theme.tertiary || '#7D5260'"
                ></div>
              </div>
            </div>
            <span class="theme-card__name">{{ getThemeDisplayName(theme.name) }}</span>
            @if (isThemeActive(theme.name)) {
              <div class="theme-card__active-indicator">
                <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
                  <path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/>
                </svg>
              </div>
            }
            </div>
          }
        </div>
      </div>

      <!-- Custom Color Section -->
      <div class="theme-switcher__section">
        <div class="theme-switcher__section-header">
          <h4 class="theme-switcher__section-title">Custom Color</h4>
          <button 
            type="button" 
            class="theme-switcher__toggle-btn"
            [class.theme-switcher__toggle-btn--active]="showCustomColorPanel"
            (click)="onToggleCustomPanel()"
            [disabled]="isApplyingTheme"
          >
            {{ showCustomColorPanel ? 'Hide' : 'Customize' }}
          </button>
        </div>

        <div 
          class="theme-switcher__custom-panel"
          [class.theme-switcher__custom-panel--visible]="showCustomColorPanel"
        >
          <!-- Color Input -->
          <div class="custom-color-input">
            <label class="custom-color-input__label">Primary Color</label>
            <div class="custom-color-input__container">
              <input 
                type="color" 
                class="custom-color-input__picker"
                [(ngModel)]="customColorInput"
                (input)="onCustomColorChange($any($event.target).value || '')"
                [disabled]="isApplyingTheme"
              >
              <input 
                type="text" 
                class="custom-color-input__text"
                [(ngModel)]="customColorInput"
                (input)="onCustomColorChange($any($event.target).value || '')"
                placeholder="#6750A4"
                [disabled]="isApplyingTheme"
              >
            </div>
          </div>

          <!-- Theme Name Input -->
          <div class="custom-theme-name">
            <label class="custom-theme-name__label">Theme Name (Optional)</label>
            <input 
              type="text" 
              class="custom-theme-name__input"
              [(ngModel)]="customThemeName"
              placeholder="My Custom Theme"
              [disabled]="isApplyingTheme"
            >
          </div>

          <!-- Color Validation -->
          @if (colorValidation) {
            <div 
              class="color-validation"
              [class.color-validation--error]="!colorValidation.isValid"
              [class.color-validation--success]="colorValidation.isValid"
            >
              @if (!colorValidation.isValid) {
                <div class="color-validation__warnings">
                  <div class="color-validation__title">⚠️ Issues found:</div>
                  <ul class="color-validation__list">
                    @for (warning of colorValidation.warnings; track warning) {
                      <li>{{ warning }}</li>
                    }
                  </ul>
                </div>
              }
              @if (colorValidation.recommendations) {
                <div class="color-validation__recommendations">
                  <div class="color-validation__title">💡 Recommendations:</div>
                  <ul class="color-validation__list">
                    @for (rec of colorValidation.recommendations; track rec) {
                      <li>{{ rec }}</li>
                    }
                  </ul>
                </div>
              }
            </div>
          }

          <!-- Color Preview -->
          @if (showColorPreview && colorValidation?.isValid) {
            <div class="color-preview">
              <div class="color-preview__title">Color Preview</div>
              <div class="color-preview__palette">
                @for (color of colorPreview | keyvalue; track color.key) {
                  <div 
                    class="color-preview__swatch" 
                    [style.backgroundColor]="color.value"
                    [style.color]="getContrastTextColor(color.value)"
                  >
                    <span class="color-preview__swatch-label">{{ color.key }}</span>
                  </div>
                }
              </div>
            </div>
          }

          <!-- Apply Button -->
          <div class="custom-color-actions">
            <button 
              type="button" 
              class="custom-color-actions__apply"
              [disabled]="!colorValidation?.isValid || isApplyingTheme"
              (click)="onApplyCustomColor()"
            >
              @if (!isApplyingTheme) {
                <span>Apply Custom Theme</span>
              } @else {
                <span>Applying...</span>
              }
            </button>
          </div>
        </div>
      </div>

      <!-- Reset Section -->
      <div class="theme-switcher__section">
        <button 
          type="button" 
          class="theme-switcher__reset-btn"
          (click)="onResetTheme()"
          [disabled]="isApplyingTheme"
        >
          Reset to Default
        </button>
      </div>

      <!-- Loading Overlay -->
      @if (isApplyingTheme) {
        <div class="theme-switcher__loading-overlay">
          <div class="theme-switcher__loading-spinner"></div>
          <span class="theme-switcher__loading-text">Applying theme...</span>
        </div>
      }
    </div>
  `,
  styleUrls: ['./theme-switcher.component.scss']
})
export class ThemeSwitcherComponent implements OnInit, OnDestroy {
  private destroy$ = new Subject<void>();

  // Component state
  currentTheme: ThemeState = {
    currentTheme: 'default',
    isDark: false,
    primaryColor: '#6750A4',
    customThemes: []
  };
  
  availableThemes: ThemeConfig[] = [];
  isDarkMode = false;
  
  // Custom color input
  customColorInput = '#6750A4';
  customThemeName = 'My Theme';
  colorPreview: { [key: string]: string } = {};
  colorValidation: { isValid: boolean; warnings: string[]; recommendations?: string[]; } | null = null;
  
  // UI state
  showCustomColorPanel = false;
  showColorPreview = false;
  isApplyingTheme = false;

  constructor(private themeService: ThemeService) {}

  ngOnInit(): void {
    this.initializeComponent();
    this.setupSubscriptions();
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  // ==========================================================================
  // INITIALIZATION METHODS
  // ==========================================================================

  /**
   * Initializes component state
   */
  private initializeComponent(): void {
    this.availableThemes = this.themeService.getAvailableThemes();
    this.currentTheme = this.themeService.getCurrentTheme();
    this.isDarkMode = this.themeService.isDarkMode();
    this.customColorInput = this.currentTheme.primaryColor;
  }

  /**
   * Sets up reactive subscriptions
   */
  private setupSubscriptions(): void {
    // Listen to theme state changes
    this.themeService.themeState$
      .pipe(takeUntil(this.destroy$))
      .subscribe(themeState => {
        this.currentTheme = themeState;
        this.availableThemes = this.themeService.getAvailableThemes();
      });

    // Listen to dark mode changes
    this.themeService.isDark$
      .pipe(takeUntil(this.destroy$))
      .subscribe(isDark => {
        this.isDarkMode = isDark;
      });
  }

  // ==========================================================================
  // THEME SWITCHING METHODS
  // ==========================================================================

  /**
   * Applies a predefined theme
   * @param themeName - Name of the theme to apply
   */
  onThemeChange(themeName: string): void {
    if (themeName !== this.currentTheme.currentTheme) {
      this.isApplyingTheme = true;
      setTimeout(() => {
        this.themeService.applyTheme(themeName, this.isDarkMode);
        this.isApplyingTheme = false;
      }, 100);
    }
  }

  /**
   * Toggles dark mode
   */
  onDarkModeToggle(): void {
    this.themeService.toggleDarkMode();
  }

  /**
   * Resets to default theme
   */
  onResetTheme(): void {
    this.isApplyingTheme = true;
    setTimeout(() => {
      this.themeService.resetToDefault();
      this.customColorInput = this.themeService.getCurrentTheme().primaryColor;
      this.isApplyingTheme = false;
    }, 100);
  }

  // ==========================================================================
  // CUSTOM COLOR METHODS
  // ==========================================================================

  /**
   * Handles custom color input changes
   * @param color - Color input value
   */
  onCustomColorChange(color: string): void {
    this.customColorInput = color;
    this.validateAndPreviewColor(color);
  }

  /**
   * Validates and previews a custom color
   * @param color - Color to validate and preview
   */
  private validateAndPreviewColor(color: string): void {
    // Clear previous validation
    this.colorValidation = null;
    this.colorPreview = {};
    this.showColorPreview = false;

    if (!color || color.length < 4) {
      return;
    }

    try {
      // Validate color
      this.colorValidation = this.themeService.validateColor(color);
      
      // Generate preview if valid
      if (this.colorValidation?.isValid) {
        this.colorPreview = this.themeService.generateColorPreview(color);
        this.showColorPreview = true;
      }
    } catch (error) {
      this.colorValidation = {
        isValid: false,
        warnings: ['Invalid color format']
      };
    }
  }

  /**
   * Applies custom color theme
   */
  onApplyCustomColor(): void {
    if (!this.colorValidation?.isValid) {
      return;
    }

    this.isApplyingTheme = true;
    setTimeout(() => {
      this.themeService.applyCustomTheme(
        this.customColorInput,
        this.customThemeName || 'Custom Theme',
        this.isDarkMode
      );
      this.showCustomColorPanel = false;
      this.isApplyingTheme = false;
    }, 100);
  }

  /**
   * Toggles custom color panel
   */
  onToggleCustomPanel(): void {
    this.showCustomColorPanel = !this.showCustomColorPanel;
    if (this.showCustomColorPanel) {
      this.validateAndPreviewColor(this.customColorInput);
    }
  }

  // ==========================================================================
  // UTILITY METHODS
  // ==========================================================================

  /**
   * Gets display name for theme
   * @param themeName - Theme internal name
   * @returns Human-readable theme name
   */
  getThemeDisplayName(themeName: string): string {
    const displayNames: { [key: string]: string } = {
      'default': 'Material Purple',
      'ocean': 'Ocean Blue',
      'forest': 'Forest Green',
      'sunset': 'Sunset Orange'
    };
    return displayNames[themeName] || themeName;
  }

  /**
   * Gets CSS class for theme preview
   * @param themeName - Theme name
   * @returns CSS class name
   */
  getThemePreviewClass(themeName: string): string {
    return `theme-preview--${themeName}`;
  }

  /**
   * Checks if theme is currently active
   * @param themeName - Theme name to check
   * @returns True if theme is active
   */
  isThemeActive(themeName: string): boolean {
    return this.currentTheme.currentTheme === themeName;
  }

  /**
   * Gets color contrast text color
   * @param backgroundColor - Background color
   * @returns Text color (black or white)
   */
  getContrastTextColor(backgroundColor: string): string {
    // Simple contrast check - in production you might want to use ColorUtils.getContrast
    const hex = backgroundColor.replace('#', '');
    const r = parseInt(hex.substr(0, 2), 16);
    const g = parseInt(hex.substr(2, 2), 16);
    const b = parseInt(hex.substr(4, 2), 16);
    const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
    return luminance > 0.5 ? '#000000' : '#FFFFFF';
  }
}{~xK(/*QRH+UP/O,.K-K+Q Lx  #t(yP@dT=8U;w޴x$@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-autocomplete {
  // Core Structure
  position: relative;
  display: inline-flex;
  flex-direction: column;
  width: 100%;
  
  // Size Variants
  &--sm {
    .ui-autocomplete__input-wrapper {
      min-height: 40px;
    }
    
    .ui-autocomplete__input {
      font-size: 16px;
      padding: 8px 12px;
    }
    
    .ui-autocomplete__label {
      font-size: 14px;
    }
  }
  
  &--md {
    .ui-autocomplete__input-wrapper {
      min-height: 48px;
    }
    
    .ui-autocomplete__input {
      font-size: 18px;
      padding: 12px 16px;
    }
    
    .ui-autocomplete__label {
      font-size: 16px;
    }
  }
  
  &--lg {
    .ui-autocomplete__input-wrapper {
      min-height: 56px;
    }
    
    .ui-autocomplete__input {
      font-size: 20px;
      padding: 16px 20px;
    }
    
    .ui-autocomplete__label {
      font-size: 18px;
    }
  }
  
  // Variant Styles
  &--outlined {
    .ui-autocomplete__input-wrapper {
      background: $semantic-color-surface-primary;
      border: $semantic-border-width-1 solid $semantic-color-border-primary;
      border-radius: $semantic-border-radius-md;
    }
    
    &:hover:not(.ui-autocomplete--disabled) .ui-autocomplete__input-wrapper {
      border-color: $semantic-color-border-focus;
    }
  }
  
  &--filled {
    .ui-autocomplete__input-wrapper {
      background: $semantic-color-surface-secondary;
      border: $semantic-border-width-1 solid transparent;
      border-radius: $semantic-border-radius-md $semantic-border-radius-md 0 0;
      border-bottom-color: $semantic-color-border-primary;
    }
    
    &:hover:not(.ui-autocomplete--disabled) .ui-autocomplete__input-wrapper {
      border-bottom-color: $semantic-color-border-focus;
    }
  }
  
  // State Variants
  &--focused {
    .ui-autocomplete__input-wrapper {
      border-color: $semantic-color-brand-primary;
      box-shadow: $semantic-shadow-button-focus;
    }
    
    .ui-autocomplete__label {
      color: $semantic-color-brand-primary;
    }
  }
  
  &--error {
    .ui-autocomplete__input-wrapper {
      border-color: $semantic-color-error;
    }
    
    .ui-autocomplete__label {
      color: $semantic-color-error;
    }
  }
  
  &--disabled {
    opacity: 0.38;
    cursor: not-allowed;
    
    .ui-autocomplete__input {
      cursor: not-allowed;
    }
  }
  
  &--loading {
    .ui-autocomplete__input {
      cursor: wait;
    }
  }
  
  // Label
  &__label {
    display: block;
    margin-bottom: 8px;
    color: $semantic-color-text-secondary;
    font-weight: 500;
    transition: color 0.2s ease;
    
    &--required::after {
      content: ' *';
      color: $semantic-color-error;
    }
  }
  
  // Input Wrapper
  &__input-wrapper {
    position: relative;
    display: flex;
    align-items: center;
    transition: all 0.2s ease;
  }
  
  // Input Field
  &__input {
    flex: 1;
    border: none;
    outline: none;
    background: transparent;
    color: $semantic-color-text-primary;
    font-family: inherit;
    transition: all 0.2s ease;
    
    &::placeholder {
      color: $semantic-color-text-tertiary;
    }
    
    &:focus {
      outline: none;
    }
    
    &:disabled {
      color: $semantic-color-text-tertiary;
      cursor: not-allowed;
    }
  }
  
  // Clear Button
  &__clear-button {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 8px;
    margin-right: 8px;
    border: none;
    background: transparent;
    color: $semantic-color-text-secondary;
    border-radius: $semantic-border-radius-sm;
    cursor: pointer;
    transition: all 0.2s ease;
    
    &:hover {
      background: $semantic-color-surface-elevated;
      color: $semantic-color-text-primary;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: 2px;
    }
    
    &:disabled {
      opacity: 0.38;
      cursor: not-allowed;
    }
  }
  
  // Dropdown Container
  &__dropdown {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: 1000;
    margin-top: 8px;
    background: $semantic-color-surface-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-md;
    box-shadow: $semantic-shadow-elevation-3;
    max-height: 240px;
    overflow-y: auto;
    
    &--sm {
      max-height: 200px;
    }
    
    &--lg {
      max-height: 280px;
    }
  }
  
  // Option Item
  &__option {
    display: flex;
    align-items: center;
    width: 100%;
    padding: 12px 16px;
    border: none;
    background: transparent;
    color: $semantic-color-text-primary;
    font-family: inherit;
    font-size: 18px;
    text-align: left;
    cursor: pointer;
    transition: all 0.2s ease;
    
    &--sm {
      padding: 8px 12px;
      font-size: 16px;
    }
    
    &--md {
      padding: 12px 16px;
      font-size: 18px;
    }
    
    &--lg {
      padding: 16px 20px;
      font-size: 20px;
    }
    
    &:hover {
      background: $semantic-color-surface-secondary;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-brand-primary;
      outline-offset: -2px;
    }
    
    &--highlighted {
      background: $semantic-color-surface-secondary;
      color: $semantic-color-text-primary;
    }
    
    &--selected {
      background: rgba($semantic-color-brand-primary, 0.08);
      color: $semantic-color-brand-primary;
      font-weight: 500;
    }
    
    &--disabled {
      opacity: 0.38;
      cursor: not-allowed;
      
      &:hover {
        background: transparent;
      }
    }
  }
  
  // Option Text
  &__option-text {
    flex: 1;
  }
  
  // Option Secondary Text
  &__option-secondary {
    color: $semantic-color-text-secondary;
    font-size: 12px;
    margin-left: 12px;
  }
  
  // Loading State
  &__loading {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 16px;
    color: $semantic-color-text-secondary;
    font-size: 14px;
  }
  
  // No Options State
  &__no-options {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 16px;
    color: $semantic-color-text-secondary;
    font-size: 14px;
    font-style: italic;
  }
  
  // Helper Text
  &__helper-text {
    margin-top: 8px;
    color: $semantic-color-text-secondary;
    font-size: 12px;
  }
  
  // Error Text
  &__error-text {
    margin-top: 8px;
    color: $semantic-color-error;
    font-size: 12px;
  }
  
  // Full Width
  &--full-width {
    width: 100%;
  }
  
  // Dark Mode Support
  :host-context(.dark-theme) & {
    .ui-autocomplete__input::placeholder {
      color: $semantic-color-text-secondary;
    }
  }
  
  // Responsive Design
  @media (max-width: 767px) {
    &__dropdown {
      max-height: 200px;
    }
  }
  
  @media (max-width: 575px) {
    // Mobile adjustments - respect size variants
    &--sm &__input {
      font-size: 16px;
    }
    
    &--md &__input {
      font-size: 18px;
    }
    
    &--lg &__input {
      font-size: 20px;
    }
    
    &__dropdown {
      max-height: 180px;
    }
    
    &__option {
      padding: 12px 16px;
    }
  }
}|.2x[b1bgqFbQjniF? P	 xklC4	)s%'N>89Qd0&s^Fɻj'{	sMvdsN^Ľy1ɍBM`EsU&gaۼNEAF`v3(,MgTl+3yt |+x<import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal, ViewChild, ElementRef, HostListener } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faTimes } from '@fortawesome/free-solid-svg-icons';

export type AutocompleteSize = 'sm' | 'md' | 'lg';
export type AutocompleteVariant = 'outlined' | 'filled';

export interface AutocompleteOption {
  value: any;
  label: string;
  secondaryText?: string;
  disabled?: boolean;
}

@Component({
  selector: 'ui-autocomplete',
  standalone: true,
  imports: [CommonModule, FormsModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => AutocompleteComponent),
      multi: true
    }
  ],
  template: `
    <div 
      class="ui-autocomplete"
      [class.ui-autocomplete--sm]="size === 'sm'"
      [class.ui-autocomplete--md]="size === 'md'"
      [class.ui-autocomplete--lg]="size === 'lg'"
      [class.ui-autocomplete--outlined]="variant === 'outlined'"
      [class.ui-autocomplete--filled]="variant === 'filled'"
      [class.ui-autocomplete--focused]="isFocused()"
      [class.ui-autocomplete--error]="hasError"
      [class.ui-autocomplete--disabled]="disabled"
      [class.ui-autocomplete--loading]="loading"
      [class.ui-autocomplete--full-width]="fullWidth"
    >
      @if (label) {
        <label 
          class="ui-autocomplete__label"
          [class.ui-autocomplete__label--required]="required"
          [for]="autocompleteId"
        >
          {{ label }}
        </label>
      }
      
      <div class="ui-autocomplete__input-wrapper">
        <input
          #inputElement
          type="text"
          class="ui-autocomplete__input"
          [id]="autocompleteId"
          [value]="displayValue()"
          [placeholder]="placeholder"
          [disabled]="disabled"
          [readonly]="readonly"
          [required]="required"
          [attr.aria-label]="ariaLabel || placeholder || 'Autocomplete'"
          [attr.aria-expanded]="isDropdownOpen()"
          [attr.aria-haspopup]="true"
          [attr.aria-autocomplete]="'list'"
          [attr.aria-controls]="autocompleteId + '-listbox'"
          [attr.aria-activedescendant]="highlightedIndex() >= 0 ? autocompleteId + '-option-' + highlightedIndex() : null"
          [attr.aria-describedby]="getAriaDescribedBy()"
          [attr.aria-invalid]="hasError"
          (input)="onInput($event)"
          (focus)="onFocus()"
          (blur)="onBlur()"
          (keydown)="onKeyDown($event)"
          autocomplete="off"
        />
        
        @if (displayValue() && clearable && !disabled && !readonly) {
          <button
            type="button"
            class="ui-autocomplete__clear-button"
            [attr.aria-label]="'Clear input'"
            (click)="clearValue()"
            (mousedown)="$event.preventDefault()"
          >
            <fa-icon [icon]="faTimes" size="sm"></fa-icon>
          </button>
        }
      </div>
      
      @if (isDropdownOpen()) {
        <div 
          class="ui-autocomplete__dropdown"
          [class.ui-autocomplete__dropdown--sm]="size === 'sm'"
          [class.ui-autocomplete__dropdown--lg]="size === 'lg'"
          [id]="autocompleteId + '-listbox'"
          role="listbox"
          [attr.aria-label]="'Options'"
        >
          @if (loading) {
            <div class="ui-autocomplete__loading">
              Loading...
            </div>
          } @else if (filteredOptions().length === 0) {
            <div class="ui-autocomplete__no-options">
              {{ noOptionsText }}
            </div>
          } @else {
            @for (option of filteredOptions(); track option.value; let index = $index) {
              <button
                type="button"
                class="ui-autocomplete__option"
                [class.ui-autocomplete__option--sm]="size === 'sm'"
                [class.ui-autocomplete__option--md]="size === 'md'"
                [class.ui-autocomplete__option--lg]="size === 'lg'"
                [class.ui-autocomplete__option--highlighted]="highlightedIndex() === index"
                [class.ui-autocomplete__option--selected]="isSelected(option)"
                [class.ui-autocomplete__option--disabled]="option.disabled"
                [id]="autocompleteId + '-option-' + index"
                [disabled]="option.disabled"
                [attr.aria-selected]="isSelected(option)"
                role="option"
                (click)="selectOption(option)"
                (mouseenter)="setHighlightedIndex(index)"
                (mousedown)="$event.preventDefault()"
              >
                <span class="ui-autocomplete__option-text">{{ option.label }}</span>
                @if (option.secondaryText) {
                  <span class="ui-autocomplete__option-secondary">{{ option.secondaryText }}</span>
                }
              </button>
            }
          }
        </div>
      }
      
      @if (helperText && !hasError) {
        <div class="ui-autocomplete__helper-text" [id]="autocompleteId + '-helper'">
          {{ helperText }}
        </div>
      }
      
      @if (errorText && hasError) {
        <div class="ui-autocomplete__error-text" [id]="autocompleteId + '-error'">
          {{ errorText }}
        </div>
      }
    </div>
  `,
  styleUrl: './autocomplete.component.scss'
})
export class AutocompleteComponent implements ControlValueAccessor {
  @ViewChild('inputElement', { static: true }) inputElement!: ElementRef<HTMLInputElement>;

  // Core inputs
  @Input() label: string = '';
  @Input() placeholder: string = 'Search...';
  @Input() helperText: string = '';
  @Input() errorText: string = '';
  @Input() size: AutocompleteSize = 'md';
  @Input() variant: AutocompleteVariant = 'outlined';
  
  // Options and filtering
  @Input() options: AutocompleteOption[] = [];
  @Input() filterFn?: (option: AutocompleteOption, query: string) => boolean;
  @Input() minQueryLength: number = 0;
  @Input() maxOptions: number = 100;
  @Input() noOptionsText: string = 'No options found';
  
  // Behavior
  @Input() disabled: boolean = false;
  @Input() readonly: boolean = false;
  @Input() required: boolean = false;
  @Input() clearable: boolean = true;
  @Input() loading: boolean = false;
  @Input() fullWidth: boolean = false;
  @Input() openOnFocus: boolean = false;
  @Input() closeOnSelect: boolean = true;
  
  // Accessibility
  @Input() ariaLabel: string = '';
  @Input() autocompleteId: string = `ui-autocomplete-${Math.random().toString(36).substr(2, 9)}`;

  // Outputs
  @Output() valueChange = new EventEmitter<any>();
  @Output() optionSelected = new EventEmitter<AutocompleteOption>();
  @Output() queryChange = new EventEmitter<string>();
  @Output() focused = new EventEmitter<FocusEvent>();
  @Output() blurred = new EventEmitter<FocusEvent>();
  @Output() dropdownOpen = new EventEmitter<void>();
  @Output() dropdownClose = new EventEmitter<void>();

  // Font Awesome icons
  protected readonly faTimes = faTimes;

  // Internal state
  private _selectedOption = signal<AutocompleteOption | null>(null);
  private _query = signal<string>('');
  private _displayValue = signal<string>('');
  private _isFocused = signal<boolean>(false);
  private _isDropdownOpen = signal<boolean>(false);
  private _highlightedIndex = signal<number>(-1);
  private _filteredOptions = signal<AutocompleteOption[]>([]);

  // Public signals
  selectedOption = this._selectedOption.asReadonly();
  query = this._query.asReadonly();
  displayValue = this._displayValue.asReadonly();
  isFocused = this._isFocused.asReadonly();
  isDropdownOpen = this._isDropdownOpen.asReadonly();
  highlightedIndex = this._highlightedIndex.asReadonly();
  filteredOptions = this._filteredOptions.asReadonly();

  // ControlValueAccessor implementation
  private onChange = (value: any) => {};
  private onTouched = () => {};

  get hasError(): boolean {
    return !!this.errorText;
  }

  ngOnInit(): void {
    this.updateFilteredOptions();
  }

  ngOnChanges(): void {
    this.updateFilteredOptions();
  }

  // ControlValueAccessor methods
  writeValue(value: any): void {
    if (value) {
      const option = this.options.find(opt => opt.value === value);
      if (option) {
        this._selectedOption.set(option);
        this._displayValue.set(option.label);
        this._query.set(option.label);
      } else {
        // If value doesn't match any option, treat as free text
        this._selectedOption.set(null);
        this._displayValue.set(String(value));
        this._query.set(String(value));
      }
    } else {
      this.clearValue();
    }
    this.updateFilteredOptions();
  }

  registerOnChange(fn: (value: any) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  // Event handlers
  onInput(event: Event): void {
    if (this.readonly) return;

    const target = event.target as HTMLInputElement;
    const value = target.value;
    
    this._query.set(value);
    this._displayValue.set(value);
    this._selectedOption.set(null);
    this._highlightedIndex.set(-1);
    
    this.updateFilteredOptions();
    this.openDropdown();
    
    this.onChange(value);
    this.valueChange.emit(value);
    this.queryChange.emit(value);
  }

  onFocus(): void {
    this._isFocused.set(true);
    this.focused.emit();
    
    if (this.openOnFocus) {
      this.openDropdown();
    }
  }

  onBlur(): void {
    // Delay to allow for option selection
    setTimeout(() => {
      this._isFocused.set(false);
      this.closeDropdown();
      this.onTouched();
      this.blurred.emit();
    }, 150);
  }

  onKeyDown(event: KeyboardEvent): void {
    if (this.readonly) return;

    switch (event.key) {
      case 'ArrowDown':
        event.preventDefault();
        this.highlightNext();
        this.openDropdown();
        break;
        
      case 'ArrowUp':
        event.preventDefault();
        this.highlightPrevious();
        this.openDropdown();
        break;
        
      case 'Enter':
        event.preventDefault();
        if (this.isDropdownOpen() && this.highlightedIndex() >= 0) {
          const option = this.filteredOptions()[this.highlightedIndex()];
          if (option && !option.disabled) {
            this.selectOption(option);
          }
        }
        break;
        
      case 'Escape':
        this.closeDropdown();
        this.inputElement.nativeElement.blur();
        break;
        
      case 'Tab':
        this.closeDropdown();
        break;
    }
  }

  // Option selection
  selectOption(option: AutocompleteOption): void {
    if (option.disabled) return;

    this._selectedOption.set(option);
    this._displayValue.set(option.label);
    this._query.set(option.label);
    this._highlightedIndex.set(-1);

    if (this.closeOnSelect) {
      this.closeDropdown();
    }

    this.onChange(option.value);
    this.valueChange.emit(option.value);
    this.optionSelected.emit(option);

    // Return focus to input
    this.inputElement.nativeElement.focus();
  }

  clearValue(): void {
    this._selectedOption.set(null);
    this._displayValue.set('');
    this._query.set('');
    this._highlightedIndex.set(-1);
    
    this.updateFilteredOptions();
    this.closeDropdown();
    
    this.onChange(null);
    this.valueChange.emit(null);
    this.queryChange.emit('');

    if (this.inputElement) {
      this.inputElement.nativeElement.focus();
    }
  }

  // Dropdown management
  openDropdown(): void {
    if (this.disabled || this.readonly) return;
    
    if (this.query().length >= this.minQueryLength || this.filteredOptions().length > 0) {
      this._isDropdownOpen.set(true);
      this.dropdownOpen.emit();
    }
  }

  closeDropdown(): void {
    this._isDropdownOpen.set(false);
    this._highlightedIndex.set(-1);
    this.dropdownClose.emit();
  }

  // Navigation
  highlightNext(): void {
    const options = this.filteredOptions();
    if (options.length === 0) return;

    const currentIndex = this.highlightedIndex();
    let nextIndex = currentIndex + 1;

    // Skip disabled options
    while (nextIndex < options.length && options[nextIndex].disabled) {
      nextIndex++;
    }

    if (nextIndex >= options.length) {
      // Wrap to first enabled option
      nextIndex = 0;
      while (nextIndex < options.length && options[nextIndex].disabled) {
        nextIndex++;
      }
    }

    if (nextIndex < options.length) {
      this._highlightedIndex.set(nextIndex);
    }
  }

  highlightPrevious(): void {
    const options = this.filteredOptions();
    if (options.length === 0) return;

    const currentIndex = this.highlightedIndex();
    let prevIndex = currentIndex - 1;

    // Skip disabled options
    while (prevIndex >= 0 && options[prevIndex].disabled) {
      prevIndex--;
    }

    if (prevIndex < 0) {
      // Wrap to last enabled option
      prevIndex = options.length - 1;
      while (prevIndex >= 0 && options[prevIndex].disabled) {
        prevIndex--;
      }
    }

    if (prevIndex >= 0) {
      this._highlightedIndex.set(prevIndex);
    }
  }

  setHighlightedIndex(index: number): void {
    this._highlightedIndex.set(index);
  }

  // Utility methods
  isSelected(option: AutocompleteOption): boolean {
    const selected = this.selectedOption();
    return selected ? selected.value === option.value : false;
  }

  getAriaDescribedBy(): string | null {
    const ids: string[] = [];
    
    if (this.helperText && !this.hasError) {
      ids.push(this.autocompleteId + '-helper');
    }
    
    if (this.errorText && this.hasError) {
      ids.push(this.autocompleteId + '-error');
    }
    
    return ids.length > 0 ? ids.join(' ') : null;
  }

  private updateFilteredOptions(): void {
    const query = this.query();
    const options = this.options;

    if (query.length < this.minQueryLength) {
      this._filteredOptions.set([]);
      return;
    }

    let filtered: AutocompleteOption[];

    if (this.filterFn) {
      filtered = options.filter(option => this.filterFn!(option, query));
    } else {
      // Default filtering: case-insensitive substring match on label
      const lowerQuery = query.toLowerCase();
      filtered = options.filter(option => 
        option.label.toLowerCase().includes(lowerQuery) ||
        (option.secondaryText && option.secondaryText.toLowerCase().includes(lowerQuery))
      );
    }

    // Limit results
    if (filtered.length > this.maxOptions) {
      filtered = filtered.slice(0, this.maxOptions);
    }

    this._filteredOptions.set(filtered);
    
    // Reset highlighted index if out of bounds
    if (this.highlightedIndex() >= filtered.length) {
      this._highlightedIndex.set(-1);
    }
  }

  // Close dropdown when clicking outside
  @HostListener('document:click', ['$event'])
  onDocumentClick(event: Event): void {
    const target = event.target as Element;
    if (!target.closest('.ui-autocomplete')) {
      this.closeDropdown();
    }
  }
}Oax* _]]YZ[kbLN`Q.K,L+CٛX%8Еo΄a}~weD%x) export * from './autocomplete.component';3x  ^4RG'АM;?x!@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// CHECKBOX COMPONENT STYLES
// ==========================================================================
// Modern checkbox implementation using design tokens
// Follows Material Design 3 principles with semantic token system
// ==========================================================================

.checkbox-wrapper {
  display: flex;
  align-items: flex-start;
  position: relative;
  cursor: pointer;
  user-select: none;
  transition: all $semantic-duration-fast $semantic-easing-standard;

  &:hover:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      border-color: $semantic-color-border-focus;
      box-shadow: $semantic-shadow-input-focus;
    }
  }

  &:focus-within:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      border-color: $semantic-color-brand-primary;
      box-shadow: $semantic-shadow-button-focus;
    }
  }

  // Disabled state
  &.checkbox-wrapper--disabled {
    cursor: not-allowed;
    opacity: 0.6;

    .checkbox-control {
      border-color: $semantic-color-border-disabled;
      background-color: $semantic-color-surface-disabled;
    }

    .checkbox-content {
      color: $semantic-color-text-disabled;
    }
  }

  // Checked state
  &.checkbox-wrapper--checked:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      background-color: $semantic-color-brand-primary;
      border-color: $semantic-color-brand-primary;
    }

    .checkbox-icon {
      color: $semantic-color-on-brand-primary;
    }
  }

  // Size variants with proper spacing and alignment
  &.checkbox-wrapper--sm {
    gap: $semantic-spacing-component-sm; // 8px spacing
    align-items: center; // Center align for single line content
    
    .checkbox-control {
      height: 20px;
      width: 20px;
    }
    
    .checkbox-label {
      font-size: $semantic-typography-font-size-sm;
      line-height: $semantic-typography-line-height-normal;
    }
    
    .checkbox-description {
      font-size: $semantic-typography-font-size-xs;
      line-height: $semantic-typography-line-height-tight;
    }
    
    // If description exists, align to flex-start for multi-line content
    &.checkbox-wrapper--with-description {
      align-items: flex-start;
    }
  }

  &.checkbox-wrapper--md {
    gap: $semantic-spacing-component-md; // 12px spacing
    align-items: center; // Center align for single line content
    
    .checkbox-control {
      height: 24px;
      width: 24px;
    }
    
    .checkbox-label {
      font-size: $semantic-typography-font-size-md;
      line-height: $semantic-typography-line-height-relaxed;
    }
    
    .checkbox-description {
      font-size: $semantic-typography-font-size-sm;
      line-height: $semantic-typography-line-height-normal;
    }
    
    // If description exists, align to flex-start for multi-line content
    &.checkbox-wrapper--with-description {
      align-items: flex-start;
    }
  }

  &.checkbox-wrapper--lg {
    gap: $semantic-spacing-component-md; // 12px spacing (within range)
    align-items: center; // Center align for single line content
    
    .checkbox-control {
      height: 28px;
      width: 28px;
    }
    
    .checkbox-label {
      font-size: $semantic-typography-font-size-lg;
      line-height: $semantic-typography-line-height-relaxed;
    }
    
    .checkbox-description {
      font-size: $semantic-typography-font-size-md;
      line-height: $semantic-typography-line-height-relaxed;
    }
    
    // If description exists, align to flex-start for multi-line content
    &.checkbox-wrapper--with-description {
      align-items: flex-start;
    }
  }

  // Variant colors
  &.checkbox-wrapper--primary.checkbox-wrapper--checked:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      background-color: $semantic-color-brand-primary;
      border-color: $semantic-color-brand-primary;
    }
  }

  &.checkbox-wrapper--secondary.checkbox-wrapper--checked:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      background-color: $semantic-color-brand-secondary;
      border-color: $semantic-color-brand-secondary;
    }
  }

  &.checkbox-wrapper--success.checkbox-wrapper--checked:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      background-color: $semantic-color-success;
      border-color: $semantic-color-success;
    }
    
    .checkbox-icon {
      color: $semantic-color-on-success;
    }
  }

  &.checkbox-wrapper--warning.checkbox-wrapper--checked:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      background-color: $semantic-color-warning;
      border-color: $semantic-color-warning;
    }
    
    .checkbox-icon {
      color: $semantic-color-on-warning;
    }
  }

  &.checkbox-wrapper--danger.checkbox-wrapper--checked:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      background-color: $semantic-color-danger;
      border-color: $semantic-color-danger;
    }
    
    .checkbox-icon {
      color: $semantic-color-on-danger;
    }
  }

  // Error state
  &.checkbox-wrapper--error:not(.checkbox-wrapper--disabled) {
    .checkbox-control {
      border-color: $semantic-color-danger;
    }

    .checkbox-label {
      color: $semantic-color-danger;
    }
  }
}

.checkbox-input {
  position: absolute;
  opacity: 0;
  cursor: pointer;
  height: 0;
  width: 0;
  margin: 0;
  padding: 0;
}

.checkbox-control {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  background-color: $semantic-color-surface-primary;
  border: $semantic-border-width-2 solid $semantic-color-border-primary;
  border-radius: $semantic-border-radius-sm;
  transition: all $semantic-duration-fast $semantic-easing-standard;

  // Base sizes (overridden by wrapper variants)
  height: 24px;
  width: 24px;
}

.checkbox-checkmark {
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  transform: scale(0.8);
  transition: all $semantic-duration-fast $semantic-easing-spring;

  &.checkbox-checkmark--checked {
    opacity: 1;
    transform: scale(1);
  }
}

.checkbox-icon {
  width: 60%;
  height: 60%;
  color: transparent;
  transition: color $semantic-duration-fast $semantic-easing-standard;
}

.checkbox-content {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-xs;
  // Removed margin-left as it's now handled by wrapper gap
}

.checkbox-label {
  color: $semantic-color-text-primary;
  font-weight: $semantic-typography-font-weight-medium;
  transition: color $semantic-duration-fast $semantic-easing-standard;

  &.checkbox-label--required {
    .checkbox-required-indicator {
      color: $semantic-color-danger;
      margin-left: 2px;
    }
  }
}

.checkbox-description {
  color: $semantic-color-text-secondary;
  margin-top: $semantic-spacing-component-xs;
  transition: color $semantic-duration-fast $semantic-easing-standard;
}

// Content disabled state
.checkbox-content--disabled {
  .checkbox-label,
  .checkbox-description {
    color: $semantic-color-text-disabled;
  }
}

// ==========================================================================
// RESPONSIVE DESIGN
// ==========================================================================

@media (max-width: $semantic-breakpoint-md - 1) {
  .checkbox-wrapper {
    // Slightly larger touch targets on mobile
    &.checkbox-wrapper--sm .checkbox-control {
      height: calc(#{20px} + 4px);
      width: calc(#{20px} + 4px);
    }
    
    &.checkbox-wrapper--md .checkbox-control {
      height: calc(#{24px} + 4px);
      width: calc(#{24px} + 4px);
    }
    
    &.checkbox-wrapper--lg .checkbox-control {
      height: calc(#{28px} + 4px);
      width: calc(#{28px} + 4px);
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

// Reduced motion preference
@media (prefers-reduced-motion: reduce) {
  .checkbox-wrapper,
  .checkbox-control,
  .checkbox-checkmark,
  .checkbox-icon,
  .checkbox-label,
  .checkbox-description {
    transition: none !important;
    animation: none !important;
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .checkbox-wrapper {
    .checkbox-control {
      border-width: $semantic-border-width-3;
    }
    
    &.checkbox-wrapper--checked:not(.checkbox-wrapper--disabled) {
      .checkbox-control {
        border-width: $semantic-border-width-3;
      }
    }
  }
}{x{ygqFbQjniF \Lxaimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

export type CheckboxSize = 'sm' | 'md' | 'lg';
export type CheckboxVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
export type CheckboxState = 'default' | 'error' | 'disabled';

@Component({
  selector: 'ui-checkbox',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => CheckboxComponent),
      multi: true
    }
  ],
  template: `
    <label class="checkbox-wrapper" [class]="getWrapperClasses()" [attr.aria-disabled]="disabled">
      <input
        type="checkbox"
        class="checkbox-input"
        [id]="checkboxId"
        [checked]="isChecked()"
        [disabled]="disabled"
        [required]="required"
        [attr.aria-describedby]="description ? checkboxId + '-desc' : null"
        (change)="onCheckboxChange($event)"
        (focus)="onFocus($event)"
        (blur)="onBlur($event)"
      />
      <div class="checkbox-control" [class]="getControlClasses()">
        <div class="checkbox-checkmark" [class.checkbox-checkmark--checked]="isChecked()">
          <svg class="checkbox-icon" viewBox="0 0 16 16" fill="none">
            <path d="M13.5 4.5L6 12L2.5 8.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
          </svg>
        </div>
      </div>
      
      @if (label || description) {
        <div class="checkbox-content" [class]="getContentClasses()">
          @if (label) {
            <div class="checkbox-label" [class.checkbox-label--required]="required">
              {{ label }}
              @if (required) {
                <span class="checkbox-required-indicator">*</span>
              }
            </div>
          }
          @if (description) {
            <div class="checkbox-description" [id]="checkboxId + '-desc'">{{ description }}</div>
          }
        </div>
      }
    </label>
  `,
  styleUrls: ['./checkbox.component.scss']
})
export class CheckboxComponent implements ControlValueAccessor {
  @Input() label: string = '';
  @Input() description: string = '';
  @Input() size: CheckboxSize = 'md';
  @Input() variant: CheckboxVariant = 'primary';
  @Input() state: CheckboxState = 'default';
  @Input() disabled = false;
  @Input() required = false;
  @Input() checkboxId: string = `checkbox-${Math.random().toString(36).substr(2, 9)}`;

  @Output() checkboxChange = new EventEmitter<boolean>();
  @Output() checkboxFocus = new EventEmitter<FocusEvent>();
  @Output() checkboxBlur = new EventEmitter<FocusEvent>();

  private checked = signal<boolean>(false);

  // ControlValueAccessor implementation
  private onChange = (value: boolean) => {};
  private onTouched = () => {};

  isChecked(): boolean {
    return this.checked();
  }

  writeValue(value: boolean): void {
    this.checked.set(!!value);
  }

  registerOnChange(fn: (value: boolean) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  getWrapperClasses(): string {
    const classes = [
      `checkbox-wrapper--${this.size}`,
      `checkbox-wrapper--${this.variant}`,
      `checkbox-wrapper--${this.state}`
    ];

    if (this.disabled) classes.push('checkbox-wrapper--disabled');
    if (this.isChecked()) classes.push('checkbox-wrapper--checked');
    if (this.description) classes.push('checkbox-wrapper--with-description');

    return classes.join(' ');
  }

  getControlClasses(): string {
    const classes = [
      `checkbox-control--${this.size}`,
      `checkbox-control--${this.variant}`,
      `checkbox-control--${this.state}`
    ];

    if (this.disabled) classes.push('checkbox-control--disabled');
    if (this.isChecked()) classes.push('checkbox-control--checked');

    return classes.join(' ');
  }

  getContentClasses(): string {
    const classes = [
      `checkbox-content--${this.size}`
    ];

    if (this.disabled) classes.push('checkbox-content--disabled');

    return classes.join(' ');
  }

  onCheckboxChange(event: Event): void {
    const target = event.target as HTMLInputElement;
    const value = target.checked;
    
    this.checked.set(value);
    this.onChange(value);
    this.checkboxChange.emit(value);
  }

  onFocus(event: FocusEvent): void {
    this.checkboxFocus.emit(event);
  }

  onBlur(event: FocusEvent): void {
    this.onTouched();
    this.checkboxBlur.emit(event);
  }
}䛵x% export * from './checkbox.component';2x  #rvAe.WJ
ȐU;oxks6{~ev[vQg.i3vM&WS$$B
@9﷋	$']I}a<c9!O2xJiɋt_.r>yNY<>98K/rtjcz,9_$dEt&<A:~bIL$jc/NRlEd̲ic3F[;!,K_e".l36V0K{,0g_~/<'..~=#`{.|5-8|OEoJNHZ#i"+ I4G9g[	N,R<Gh" E"X$ỹQB#\DAHKrs逤و!H216`*0:qO=i~"\Fp-(IG5=m;mG4y~O?GD,#P
x%B;.VN-c)0ɩiBQ&Rbd?Rs:0 GQDap~Ww'{=	uѻ;@?*4xL$/aS@[/JB7DXQ119σqNMwq19{bZ\۫n?]>H+?Mܮ	a^X˿',	,ԷqO$9t1doD8ptɀ])xrADT&@ 	
B%*4-$\1 ~ꊼYaeש9I,x)nUt!	E	eў45f쀾0ZY4W	&twKmucԟwN<o[5jyGMXe:#W;~cg;YuHF[sH3_
N2zI %c3Z]Z`_/t[4ra5 *_8PdN|2\4Q|	i$d=K}BԎ	*H,>9ХlnaI]K$t?Vӳg!s2V2]bg;n~2	#đS<IkH!$4La`Sa罷;σ~E.O,JOid,P{eqDy9FUo-feŲAd̖`r-D=a3膺!Z;k_wBpgݚ<0z*Gi#_A߄=1tXl3tgx%;fkSnK2N-nM@mzc:o^wyv!G~/F@rx9˃"`-6egGrS֩gႻ@	1vCkMK/Of~w`RW
3Y#LTBA6Q9S9rE]<nTS>8쓵*8[̱8d{ixP>GbO=0"OMt6d	Li3fi቞SË-[S1^tb,Tͧ10	)?}KpĂ'@geaN\x˘q-%*RKFgmfqN+:8F#"9Q!_@PL9:  -;*<3]WG`>zNpmWeboiad\CGgau3mN*=$AĨe[Kr>U:) aP8KAhI	<@tGִ""mZݱ~z6,ۦT8,G9PBDoJՁ|}ކ0E'Dvj9E|UO;lKU<A#|%R&W^|wܐ~
GX[JryFaAAȁ	)D PbI!7+
5(^|+`Kbrg'LuI M$LA2/Ґ's3&7&-NL!RS|71x`.&̳yi(dv5$=<<Ì?}@_િB('ґnV0`lvȑU:)dVRrg&e)TH6 I!V2Lam.]3&3E 5]^~<{M^涀	 /Q0)P0MA(odWejJXN&T 	Mq*]fQdIk;aZQtwRlNjvK& H+2]"A@(Ř¯c<(R$ڪ@[hEDnKPa\V2<>@jxZ%Y x4VHդl$xѪ[W9G05%{dNI ~wqU{Z&ȳ_YuѶl8m!Xٮ;to]n<1Gkr%:mmSlwrmR͛m4]W[NVn1Q[qr8P	XԘ\Ӌ	KHYsXFx->=~AznE©.b=%#:˂vʿW4k,W{`G<Z ](`$(O[9I)tP> 4Xy]~«; ,	,\̔-D%Vpw2RlyVrlR"UJ943QV4M@YUe>qہY*ow{;yB󻝞+X{ϲYՎa)޶/cX C'撳.s«ȭ/zSf }š;_Qiު5v 'ƅ6a+'g/к^]E*"	nٺ[6bK*L%9LcP޻6ޒ$
+6_ߡ'%&⪂U:t߸u}BUXj[k,N=q϶ߪ0fk}XvVnUSC?֕Iw;Zb.p)G&7lG7A޾M[8J&o	."Xk39c[@+O\rbݭ
)#1w_O'ԶxenW#I.r|s`IAٗV@UЗZ{^j=f,~3oʐ%
gC~?sz

q>'%W89cq[
YV{c2}!m)tk{_Ҙ2/F\^|%UnmjKYw#/b_a|WK
<`{<y'+޺9g]!>"r]ks{Qiw%%fֽ톞	F@⭦ld"R.lߙ&Q[ᜂx|Q۠8嗶e-SUQm낱ت`,k<Q"5ܾ3hnS0Aq Ul+_wЬM&m24!X7#Xu%M˛P|(s(g+ҩersx4?N>:1]}b]: xPj"֙ }}|CEq۽n]ayAm>ȯ'u6rPwj#V`b\3'tR,HA:>ds7}22lM(Ф)p(%ͪRE@hV.(uSq1T^ _\*&k+vM`Sʁ>%w
h,XYJjG( Aˏ oTϕJ135lc1`bbzCOUS=[PNT446Q[N-D-k;P~cCt錝q:`ΐX]u ?<CCMj;ayF>lLdm}_6&*P=3v´;#]4-[{or=Ukub%~#>"?xK(/*QRH+UPO/-LN-K-K+Q .x  "v ނ}kaf$ ሐS;r{	x5Iʶimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faClock, faTimes, faChevronUp, faChevronDown } from '@fortawesome/free-solid-svg-icons';

export type TimePickerSize = 'sm' | 'md' | 'lg';
export type TimePickerVariant = 'outlined' | 'filled' | 'underlined';
export type TimePickerState = 'default' | 'error' | 'success' | 'warning';
export type TimePickerFormat = '12' | '24';

export interface TimeValue {
  hours: number;
  minutes: number;
  seconds?: number;
}

@Component({
  selector: 'ui-time-picker',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => TimePickerComponent),
      multi: true
    }
  ],
  template: `
    <div class="ui-time-picker" [class]="getWrapperClasses()">
      <!-- Label -->
      @if (label) {
        <label 
          class="ui-time-picker__label"
          [for]="inputId"
          [class.ui-time-picker__label--required]="required"
        >
          {{ label }}
          @if (required) {
            <span class="ui-time-picker__required-indicator">*</span>
          }
        </label>
      }
      
      <!-- Input Container -->
      <div class="ui-time-picker__container" [class]="getContainerClasses()">
        <!-- Clock Icon -->
        <div class="ui-time-picker__prefix-icon">
          <fa-icon [icon]="faClock"></fa-icon>
        </div>
        
        <!-- Input Field -->
        <input
          [id]="inputId"
          class="ui-time-picker__field"
          type="text"
          [placeholder]="placeholder"
          [disabled]="disabled"
          [readonly]="true"
          [required]="required"
          [value]="formattedValue"
          [attr.aria-expanded]="isOpen()"
          [attr.aria-haspopup]="'dialog'"
          [attr.aria-describedby]="helperText ? inputId + '-helper' : null"
          (click)="toggleTimePicker()"
          (keydown)="onInputKeyDown($event)"
        />
        
        <!-- Clear Button -->
        @if (clearable && value && !disabled) {
          <button
            type="button"
            class="ui-time-picker__clear-btn"
            (click)="clearValue()"
            [attr.aria-label]="'Clear ' + (label || 'time')"
          >
            <fa-icon [icon]="faTimes"></fa-icon>
          </button>
        }
      </div>
      
      <!-- Time Picker Dropdown -->
      @if (isOpen()) {
        <div class="ui-time-picker__dropdown" role="dialog" aria-label="Time picker">
          <div class="ui-time-picker__time-display">
            <div class="ui-time-picker__time-sections">
              <!-- Hours -->
              <div class="ui-time-picker__time-section">
                <button
                  type="button"
                  class="ui-time-picker__time-btn ui-time-picker__time-btn--up"
                  (click)="incrementHours()"
                  [attr.aria-label]="'Increase hours'"
                >
                  <fa-icon [icon]="faChevronUp"></fa-icon>
                </button>
                
                <input
                  type="number"
                  class="ui-time-picker__time-input"
                  [value]="displayHours"
                  [min]="timeFormat === '24' ? 0 : 1"
                  [max]="timeFormat === '24' ? 23 : 12"
                  (input)="onHoursInput($event)"
                  (blur)="validateHours()"
                />
                
                <button
                  type="button"
                  class="ui-time-picker__time-btn ui-time-picker__time-btn--down"
                  (click)="decrementHours()"
                  [attr.aria-label]="'Decrease hours'"
                >
                  <fa-icon [icon]="faChevronDown"></fa-icon>
                </button>
                
                <div class="ui-time-picker__time-label">Hours</div>
              </div>
              
              <!-- Separator -->
              <div class="ui-time-picker__separator">:</div>
              
              <!-- Minutes -->
              <div class="ui-time-picker__time-section">
                <button
                  type="button"
                  class="ui-time-picker__time-btn ui-time-picker__time-btn--up"
                  (click)="incrementMinutes()"
                  [attr.aria-label]="'Increase minutes'"
                >
                  <fa-icon [icon]="faChevronUp"></fa-icon>
                </button>
                
                <input
                  type="number"
                  class="ui-time-picker__time-input"
                  [value]="displayMinutes"
                  min="0"
                  max="59"
                  (input)="onMinutesInput($event)"
                  (blur)="validateMinutes()"
                />
                
                <button
                  type="button"
                  class="ui-time-picker__time-btn ui-time-picker__time-btn--down"
                  (click)="decrementMinutes()"
                  [attr.aria-label]="'Decrease minutes'"
                >
                  <fa-icon [icon]="faChevronDown"></fa-icon>
                </button>
                
                <div class="ui-time-picker__time-label">Minutes</div>
              </div>
              
              <!-- Seconds (if enabled) -->
              @if (showSeconds) {
                <div class="ui-time-picker__separator">:</div>
                
                <div class="ui-time-picker__time-section">
                  <button
                    type="button"
                    class="ui-time-picker__time-btn ui-time-picker__time-btn--up"
                    (click)="incrementSeconds()"
                    [attr.aria-label]="'Increase seconds'"
                  >
                    <fa-icon [icon]="faChevronUp"></fa-icon>
                  </button>
                  
                  <input
                    type="number"
                    class="ui-time-picker__time-input"
                    [value]="displaySeconds"
                    min="0"
                    max="59"
                    (input)="onSecondsInput($event)"
                    (blur)="validateSeconds()"
                  />
                  
                  <button
                    type="button"
                    class="ui-time-picker__time-btn ui-time-picker__time-btn--down"
                    (click)="decrementSeconds()"
                    [attr.aria-label]="'Decrease seconds'"
                  >
                    <fa-icon [icon]="faChevronDown"></fa-icon>
                  </button>
                  
                  <div class="ui-time-picker__time-label">Seconds</div>
                </div>
              }
              
              <!-- AM/PM (if 12-hour format) -->
              @if (timeFormat === '12') {
                <div class="ui-time-picker__ampm-section">
                  <button
                    type="button"
                    class="ui-time-picker__ampm-btn"
                    [class.ui-time-picker__ampm-btn--active]="ampm() === 'AM'"
                    (click)="setAMPM('AM')"
                  >
                    AM
                  </button>
                  
                  <button
                    type="button"
                    class="ui-time-picker__ampm-btn"
                    [class.ui-time-picker__ampm-btn--active]="ampm() === 'PM'"
                    (click)="setAMPM('PM')"
                  >
                    PM
                  </button>
                </div>
              }
            </div>
          </div>
          
          <!-- Preset Times (if enabled) -->
          @if (presetTimes.length > 0) {
            <div class="ui-time-picker__presets">
              <div class="ui-time-picker__presets-title">Quick Select</div>
              <div class="ui-time-picker__presets-list">
                @for (preset of presetTimes; track preset.label) {
                  <button
                    type="button"
                    class="ui-time-picker__preset-btn"
                    (click)="selectPreset(preset.value)"
                  >
                    {{ preset.label }}
                  </button>
                }
              </div>
            </div>
          }
          
          <!-- Actions -->
          <div class="ui-time-picker__actions">
            <button
              type="button"
              class="ui-time-picker__action-btn ui-time-picker__action-btn--secondary"
              (click)="closeTimePicker()"
            >
              Cancel
            </button>
            
            <button
              type="button"
              class="ui-time-picker__action-btn ui-time-picker__action-btn--primary"
              (click)="confirmTime()"
            >
              OK
            </button>
          </div>
        </div>
      }
      
      <!-- Helper Text / Error Message -->
      @if (helperText || errorMessage) {
        <div 
          class="ui-time-picker__helper-text" 
          [class]="getHelperTextClasses()"
          [id]="inputId + '-helper'"
        >
          {{ state === 'error' ? errorMessage : helperText }}
        </div>
      }
    </div>
  `,
  styleUrl: './time-picker.component.scss'
})
export class TimePickerComponent implements ControlValueAccessor {
  @Input() label: string = '';
  @Input() placeholder: string = 'Select time';
  @Input() size: TimePickerSize = 'md';
  @Input() variant: TimePickerVariant = 'outlined';
  @Input() state: TimePickerState = 'default';
  @Input() disabled = false;
  @Input() required = false;
  @Input() clearable = true;
  @Input() helperText: string = '';
  @Input() errorMessage: string = '';
  @Input() timeFormat: TimePickerFormat = '12';
  @Input() showSeconds = false;
  @Input() minuteStep = 1;
  @Input() secondStep = 1;
  @Input() presetTimes: Array<{label: string, value: TimeValue}> = [];
  @Input() inputId: string = `time-picker-${Math.random().toString(36).substr(2, 9)}`;

  @Output() timeChange = new EventEmitter<TimeValue | null>();
  @Output() pickerOpen = new EventEmitter<void>();
  @Output() pickerClose = new EventEmitter<void>();

  value: TimeValue | null = null;
  isOpen = signal(false);
  ampm = signal<'AM' | 'PM'>('AM');

  // Internal state for the picker
  private tempValue: TimeValue = { hours: 12, minutes: 0, seconds: 0 };

  readonly faClock = faClock;
  readonly faTimes = faTimes;
  readonly faChevronUp = faChevronUp;
  readonly faChevronDown = faChevronDown;

  private onChange = (value: TimeValue | null) => {};
  private onTouched = () => {};

  writeValue(value: TimeValue | null): void {
    this.value = value;
    if (value) {
      this.tempValue = { ...value };
      if (this.timeFormat === '12') {
        this.updateAMPM();
      }
    }
  }

  registerOnChange(fn: (value: TimeValue | null) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  get formattedValue(): string {
    if (!this.value) return '';
    return this.formatTime(this.value);
  }

  get displayHours(): string {
    if (this.timeFormat === '12') {
      const hours = this.tempValue.hours;
      const displayHour = hours === 0 ? 12 : hours > 12 ? hours - 12 : hours;
      return displayHour.toString().padStart(2, '0');
    }
    return this.tempValue.hours.toString().padStart(2, '0');
  }

  get displayMinutes(): string {
    return this.tempValue.minutes.toString().padStart(2, '0');
  }

  get displaySeconds(): string {
    return (this.tempValue.seconds || 0).toString().padStart(2, '0');
  }

  getWrapperClasses(): string {
    const classes = [
      `ui-time-picker--${this.size}`,
      `ui-time-picker--${this.variant}`,
      `ui-time-picker--${this.state}`
    ];

    if (this.disabled) classes.push('ui-time-picker--disabled');
    if (this.isOpen()) classes.push('ui-time-picker--open');

    return classes.join(' ');
  }

  getContainerClasses(): string {
    const classes: string[] = [];
    if (this.clearable && this.value) classes.push('ui-time-picker__container--has-clear');
    return classes.join(' ');
  }

  getHelperTextClasses(): string {
    return `ui-time-picker__helper-text--${this.state}`;
  }

  toggleTimePicker(): void {
    if (this.disabled) return;
    
    if (this.isOpen()) {
      this.closeTimePicker();
    } else {
      this.openTimePicker();
    }
  }

  openTimePicker(): void {
    this.isOpen.set(true);
    // Initialize temp value with current value or default
    if (this.value) {
      this.tempValue = { ...this.value };
    } else {
      const now = new Date();
      this.tempValue = {
        hours: now.getHours(),
        minutes: now.getMinutes(),
        seconds: this.showSeconds ? now.getSeconds() : 0
      };
    }
    
    if (this.timeFormat === '12') {
      this.updateAMPM();
    }
    
    this.pickerOpen.emit();
  }

  closeTimePicker(): void {
    this.isOpen.set(false);
    this.onTouched();
    this.pickerClose.emit();
  }

  confirmTime(): void {
    this.value = { ...this.tempValue };
    this.onChange(this.value);
    this.timeChange.emit(this.value);
    this.closeTimePicker();
  }

  clearValue(): void {
    this.value = null;
    this.onChange(null);
    this.timeChange.emit(null);
  }

  incrementHours(): void {
    const maxHours = this.timeFormat === '24' ? 23 : 12;
    const minHours = this.timeFormat === '24' ? 0 : 1;
    
    if (this.tempValue.hours >= maxHours) {
      this.tempValue.hours = minHours;
    } else {
      this.tempValue.hours++;
    }
    
    if (this.timeFormat === '12') {
      this.updateAMPM();
    }
  }

  decrementHours(): void {
    const maxHours = this.timeFormat === '24' ? 23 : 12;
    const minHours = this.timeFormat === '24' ? 0 : 1;
    
    if (this.tempValue.hours <= minHours) {
      this.tempValue.hours = maxHours;
    } else {
      this.tempValue.hours--;
    }
    
    if (this.timeFormat === '12') {
      this.updateAMPM();
    }
  }

  incrementMinutes(): void {
    if (this.tempValue.minutes >= 59) {
      this.tempValue.minutes = 0;
    } else {
      this.tempValue.minutes = Math.min(59, this.tempValue.minutes + this.minuteStep);
    }
  }

  decrementMinutes(): void {
    if (this.tempValue.minutes <= 0) {
      this.tempValue.minutes = 59;
    } else {
      this.tempValue.minutes = Math.max(0, this.tempValue.minutes - this.minuteStep);
    }
  }

  incrementSeconds(): void {
    if (!this.showSeconds) return;
    
    if ((this.tempValue.seconds || 0) >= 59) {
      this.tempValue.seconds = 0;
    } else {
      this.tempValue.seconds = Math.min(59, (this.tempValue.seconds || 0) + this.secondStep);
    }
  }

  decrementSeconds(): void {
    if (!this.showSeconds) return;
    
    if ((this.tempValue.seconds || 0) <= 0) {
      this.tempValue.seconds = 59;
    } else {
      this.tempValue.seconds = Math.max(0, (this.tempValue.seconds || 0) - this.secondStep);
    }
  }

  onHoursInput(event: Event): void {
    const target = event.target as HTMLInputElement;
    const hours = parseInt(target.value, 10);
    
    if (!isNaN(hours)) {
      this.tempValue.hours = hours;
    }
  }

  onMinutesInput(event: Event): void {
    const target = event.target as HTMLInputElement;
    const minutes = parseInt(target.value, 10);
    
    if (!isNaN(minutes)) {
      this.tempValue.minutes = minutes;
    }
  }

  onSecondsInput(event: Event): void {
    if (!this.showSeconds) return;
    
    const target = event.target as HTMLInputElement;
    const seconds = parseInt(target.value, 10);
    
    if (!isNaN(seconds)) {
      this.tempValue.seconds = seconds;
    }
  }

  validateHours(): void {
    const maxHours = this.timeFormat === '24' ? 23 : 12;
    const minHours = this.timeFormat === '24' ? 0 : 1;
    
    this.tempValue.hours = Math.max(minHours, Math.min(maxHours, this.tempValue.hours));
  }

  validateMinutes(): void {
    this.tempValue.minutes = Math.max(0, Math.min(59, this.tempValue.minutes));
  }

  validateSeconds(): void {
    if (!this.showSeconds) return;
    this.tempValue.seconds = Math.max(0, Math.min(59, this.tempValue.seconds || 0));
  }

  setAMPM(period: 'AM' | 'PM'): void {
    if (this.timeFormat !== '12') return;
    
    this.ampm.set(period);
    
    // Convert temp hours to 24-hour format for internal storage
    const currentHours = this.tempValue.hours;
    
    if (period === 'AM') {
      if (currentHours === 12) {
        this.tempValue.hours = 0;
      } else if (currentHours > 12) {
        this.tempValue.hours = currentHours - 12;
      }
    } else {
      if (currentHours < 12) {
        this.tempValue.hours = currentHours + 12;
      }
    }
  }

  selectPreset(timeValue: TimeValue): void {
    this.tempValue = { ...timeValue };
    if (this.timeFormat === '12') {
      this.updateAMPM();
    }
    this.confirmTime();
  }

  onInputKeyDown(event: KeyboardEvent): void {
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.toggleTimePicker();
    } else if (event.key === 'Escape' && this.isOpen()) {
      event.preventDefault();
      this.closeTimePicker();
    }
  }

  private formatTime(time: TimeValue): string {
    if (this.timeFormat === '12') {
      const hours = time.hours;
      const displayHour = hours === 0 ? 12 : hours > 12 ? hours - 12 : hours;
      const period = hours >= 12 ? 'PM' : 'AM';
      const minutes = time.minutes.toString().padStart(2, '0');
      
      if (this.showSeconds && time.seconds !== undefined) {
        const seconds = time.seconds.toString().padStart(2, '0');
        return `${displayHour}:${minutes}:${seconds} ${period}`;
      }
      
      return `${displayHour}:${minutes} ${period}`;
    } else {
      const hours = time.hours.toString().padStart(2, '0');
      const minutes = time.minutes.toString().padStart(2, '0');
      
      if (this.showSeconds && time.seconds !== undefined) {
        const seconds = time.seconds.toString().padStart(2, '0');
        return `${hours}:${minutes}:${seconds}`;
      }
      
      return `${hours}:${minutes}`;
    }
  }

  private updateAMPM(): void {
    if (this.timeFormat !== '12') return;
    
    const period = this.tempValue.hours >= 12 ? 'PM' : 'AM';
    this.ampm.set(period);
  }
}'VJCx5絒j3alendarDays, faTimes, faChevronLeft, faChevronRight:Dat.DatCDatb<"datCDat!Qdatuvdat?dat0}datdat:Dalendar Icon -->
`dat6alendarDays!!ZdataCalendadat	mdat8
Calenda
=dat.)Calendar">
          <!-- Calendar Header!date-picker__header"Kdate-picker__nav-btn"
_previousMonth()"
"Previous month'#JLeft!#Z~date-picker__month-year">
  "" O"
date-picker__month 	MonthView()"
 {{ getMonthYearLabel() }}
n$\"<date-picker__nav-btn"
_nextMonth()"
"Next month'#JRight!##UCalendar Content -->
          @if (!showMonthView()) {
            <!-- Days Grid --p4date-picker__calendar">
              <!-- Day Heade$date-picker__day-headers, day of dayHeaders; track dayn `"date-picker__day-header">{{ day }}<!-- Days Grid1_date-picker__days, -day of calendarDays; track day.date.getTime()n ^date-picker__day
%date-picker__day--today]="day.isToday
+date-picker__day--selected]="day.isSelected
0date-picker__day--other-month]="day.isOtherMonth
+date-picker__day--disabled]="day.isDisableday.isDisabledgetDayAriaLabel(day)selected]="day.isSelected!lectDate(day.date00!day.date.getDate() }}q }2} @else {
            <!-- Month/Year Selection --pdate-picker__month-year-picker"Adate-picker__months, "month of months; track month.valuen ^date-picker__month-opti
Bdate-picker__month-option--selected]="month.value === currentMonthselectMonth(month.value00!monthO!Y_date-picker__year-input">
_) O"
date-picker__year-field1value]="currentYearyYear[![min]="minYear1max]="maxYear#>%$ydat$daty%)Dat%{date';
  @Input() size: Dat;&(Dat&Dat&minDate: Date | null = null;
  @Input() maxDate: Date | null = null;
  @Input() dateFormat: string = 'MM/dd/yyyy';
  @Input() i,(datA(C	dateChang)(Date | null>();
  @Output() calendarOpen)(calenda(-Dat0)-currentMonth = signal(new Date().getMonth());
  currentYear = signal(new Date().getFullYear());
  showMonthView = signal(false)-;

  readonly faCalendarDays = faCalendarDays*4Left = faChevronLeft;
  readonly faChevronRight = faChevronRight;

  readonly dayHeaders = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
  readonly months = [
    { value: 0, label: 'January' },
    { value: 1, label: 'February' },
    { value: 2, label: 'March' },
    { value: 3, label: 'April' },
    { value: 4, label: 'May' },
    { value: 5, label: 'June' },
    { value: 6, label: 'July' },
    { value: 7, label: 'August' },
    { value: 8, label: 'September' },
    { value: 9, label: 'October' },
    { value: 10, label: 'November' },
    { value: 11, label: 'December' }
  ];

  readonly minYear = 1900;
  readonly maxYear = 2100v* Dat*FDat*FTcurrentMonth.set(value.getMonth());
      this.currentYear.set(value.getFullYear());++Dat+.Date(this.value);
  }

  get calendarDays() {
    const year = this.currentYear();
    const month = this.currentMonth();
    const firstDay = new Date(year, month, 1);
    const lastDay = new Date(year, month + 1, 0);
    const startDate = new Date(firstDay);
    startDate.setDate(startDate.getDate() - firstDay.getDay());
    
    const days = [];
    const currentDate = new Date(startDate);
    
    for (let i = 0; i < 42; i++) {
      const isOtherMonth = currentDate.getMonth() !== month;
      const isToday = this.isSameDay(currentDate, new Date());
      const isSelected = this.value ? this.isSameDay(currentDate, this.value) : false;
      const isDisabled = this.isDateDisabled(currentDate);
      
      days.push({
        date: new Date(currentDate),
        isOtherMonth,
        isToday,
        isSelected,
        isDisabled
      });
      
      currentDate.setDate(6currentDate.getDate() + 1);
    }
    
    return days/GdatY/#dat/&dat/Idat/>dat50dat0wdat$x1getMonthYearLabel0monthName = this.months[this.currentMonth()].label;
    return `${monthName} ${this.currentYear()}`;
  }

  getDayAriaLabel(day: any0date = day.date;
    const dayName = date.toLocaleDateString('en-US', { weekday: 'long' });
    const monthName = date.toLocaleDateString('en-US', { month: 'long' });
    return `${dayName}, ${monthName} ${date.getDate()}, ${date.getFullYear()}`;
  }

  toggleCalenda1Y
Calendar()7*openCalendar();
    }
  }

  openCalendar(!,`2/this.calendarOpen.emit();
  }

  closeCalendar(!,`2Y4showMonthViewT4,-calendarClose.emit();
  }

  toggleMonthView(!,>showMonthView.set(!this.showMonthView());
  }

  previousMonth1kcurrentMonth() === 0) {
      this.currentMonth.set(11);
      this.currentYear.set(this.currentYear() - 1)7AcurrentMonth.set(this.currentMonth() - 1);
    }
  }

  nextMonth1kcurrentMonth() === 11) {
      this.currentMonth.set(0);
      this.currentYear.set(this.currentYear() + 1)7QcurrentMonth.set(this.currentMonth() + 1);
    }
  }

  selectMonth(month: number!,XcurrentMonth.set(month);
    this.showMonthView.set(false);
  }

  selectDate(date: Date8isDateDisabled(date)1this.value = new Date(date)4*dat5(Calenda55ZdateChange.emit(nullCCalendaLDmCalendar();
    }
  }

  onYear=[yearq=3Yyear) && year >= this.minYear && year <= this.maxYear) {
      this.currentYear.set(year)}HformatDate(date: Date): string {
    // Simple MM/dd/yyyy format - can be enhanced based on dateFormat input
    const month = (date.getMonth() + 1)-"const day = date.getDate()-"const year = date.getFullYear();
    return `${month}/${day}/${year}`;
  }

  private isSameDay(date1: Date, date2: Date): boolean {
    return date1.getDate() === date2.getDate() &&
           date1.getMonth() === date2.getMonth() &&
           date1.getFullYear() === date2.getFullYear();
  }

  private isDateDisabled(date: Date): boolean {
    if (this.minDate && date < this.mfinDate) return true;
    if (this.maxDate && date > this.maxDate) return true;
    return false;
  }
}880x( export * from './date-picker.component';x  "=ZIsΞS;Ӹx@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-file-upload {
  position: relative;
  width: 100%;

  // Size Variants
  &--sm {
    min-height: 36px;
    
    .ui-file-upload__dropzone {
      padding: $semantic-spacing-component-sm;
      font-size: 0.875rem;
    }
  }

  &--md {
    min-height: 48px;
    
    .ui-file-upload__dropzone {
      padding: $semantic-spacing-component-md;
      font-size: 1rem;
    }
  }

  &--lg {
    min-height: 56px;
    
    .ui-file-upload__dropzone {
      padding: $semantic-spacing-component-lg;
      font-size: 1.125rem;
    }
  }

  // Variant Styles
  &--outlined {
    .ui-file-upload__dropzone {
      background: $semantic-color-surface-primary;
      border: 1px solid $semantic-color-border-primary;
      border-radius: 0.375rem;
    }
  }

  &--filled {
    .ui-file-upload__dropzone {
      background: $semantic-color-surface-secondary;
      border: 1px solid transparent;
      border-radius: 0.375rem;
    }
  }

  &--underlined {
    .ui-file-upload__dropzone {
      background: transparent;
      border: none;
      border-bottom: 1px solid $semantic-color-border-primary;
      border-radius: 0;
    }
  }

  // State Styles
  &--disabled {
    opacity: 0.38;
    cursor: not-allowed;
    
    .ui-file-upload__dropzone {
      pointer-events: none;
      background: $semantic-color-surface-primary;
      color: $semantic-color-text-disabled;
    }
  }

  &--error {
    .ui-file-upload__dropzone {
      border-color: $semantic-color-error;
      background: $semantic-color-error-container;
    }
  }

  &--success {
    .ui-file-upload__dropzone {
      border-color: $semantic-color-success;
      background: $semantic-color-surface-secondary;
    }
  }

  &--dragover {
    .ui-file-upload__dropzone {
      border-color: $semantic-color-primary;
      background: $semantic-color-surface-secondary;
      box-shadow: $semantic-shadow-elevation-2;
      transform: scale(1.02);
    }
  }

  // Label
  &__label {
    display: block;
    margin-bottom: $semantic-spacing-stack-xs;
    font-size: 0.875rem;
    font-weight: 500;
    color: $semantic-color-text-primary;

    &--required::after {
      content: ' *';
      color: $semantic-color-error;
    }
  }

  // Dropzone
  &__dropzone {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    cursor: pointer;
    transition: all 0.15s $semantic-motion-easing-ease-in-out;
    color: $semantic-color-text-secondary;

    &:hover:not(.ui-file-upload--disabled &) {
      border-color: $semantic-color-primary;
      background: $semantic-color-surface-secondary;
      box-shadow: $semantic-shadow-elevation-1;
    }

    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
  }

  // Hidden Input
  &__input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
    overflow: hidden;
  }

  // Upload Icon
  &__icon {
    font-size: 1.5rem;
    margin-bottom: $semantic-spacing-stack-xs;
    color: $semantic-color-text-tertiary;
  }

  // Upload Text
  &__text {
    margin-bottom: $semantic-spacing-stack-xs;
    
    &-primary {
      font-weight: 600;
      color: $semantic-color-text-primary;
    }
    
    &-secondary {
      font-size: 0.875rem;
      color: $semantic-color-text-tertiary;
    }
  }

  // Browse Button
  &__browse-btn {
    display: inline-flex;
    align-items: center;
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    background: $semantic-color-primary;
    color: $semantic-color-on-primary;
    border: none;
    border-radius: 0.25rem;
    font-size: 0.875rem;
    font-weight: 500;
    cursor: pointer;
    transition: all 0.15s $semantic-motion-easing-ease-in-out;
    margin-top: $semantic-spacing-stack-xs;

    &:hover {
      background: $semantic-color-primary-hover;
      box-shadow: $semantic-shadow-elevation-2;
    }

    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
  }

  // File List
  &__file-list {
    margin-top: $semantic-spacing-stack-md;
  }

  // File Item
  &__file-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: $semantic-spacing-component-sm;
    background: $semantic-color-surface-secondary;
    border: 1px solid $semantic-color-border-subtle;
    border-radius: 0.25rem;
    margin-bottom: $semantic-spacing-stack-xs;
    transition: all 0.15s $semantic-motion-easing-ease-in-out;

    &:hover {
      box-shadow: $semantic-shadow-elevation-1;
    }

    &--uploading {
      opacity: 0.7;
      position: relative;
      overflow: hidden;
    }

    &--error {
      background: $semantic-color-error-container;
      border-color: $semantic-color-error;
    }

    &--success {
      background: $semantic-color-surface-secondary;
      border-color: $semantic-color-success;
    }
  }

  // File Info
  &__file-info {
    display: flex;
    align-items: center;
    flex: 1;
    min-width: 0;
  }

  &__file-icon {
    font-size: 1.25rem;
    margin-right: $semantic-spacing-stack-xs;
    color: $semantic-color-text-tertiary;
  }

  &__file-details {
    min-width: 0;
    flex: 1;
  }

  &__file-name {
    font-size: 0.875rem;
    font-weight: 500;
    color: $semantic-color-text-primary;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    margin-bottom: 2px;
  }

  &__file-size {
    font-size: 0.8125rem;
    color: $semantic-color-text-tertiary;
  }

  // File Actions
  &__file-actions {
    display: flex;
    align-items: center;
    gap: $semantic-spacing-stack-xs;
  }

  // Remove Button
  &__remove-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    background: transparent;
    border: none;
    border-radius: 0.25rem;
    color: $semantic-color-text-tertiary;
    cursor: pointer;
    transition: all 0.15s $semantic-motion-easing-ease-in-out;

    &:hover {
      background: $semantic-color-error-container;
      color: $semantic-color-error;
    }

    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
  }

  // Progress Bar
  &__progress {
    position: absolute;
    bottom: 0;
    left: 0;
    height: 2px;
    background: $semantic-color-primary;
    border-radius: 0.125rem;
    transition: width 0.3s $semantic-motion-easing-ease-in-out;
  }

  // Helper Text
  &__helper-text {
    margin-top: $semantic-spacing-stack-xs;
    font-size: 0.875rem;
    
    &--default {
      color: $semantic-color-text-tertiary;
    }
    
    &--error {
      color: $semantic-color-error;
    }
    
    &--success {
      color: $semantic-color-success;
    }
  }

  // Loading State
  &--loading {
    .ui-file-upload__dropzone {
      cursor: wait;
      opacity: 0.7;
    }
  }

  // Responsive Design
  @media (max-width: $semantic-breakpoint-md - 1) {
    &__dropzone {
      padding: $semantic-spacing-component-sm;
    }
    
    &__file-name {
      font-size: 0.75rem;
    }
  }

  @media (max-width: $semantic-breakpoint-sm - 1) {
    &__dropzone {
      padding: $semantic-spacing-component-xs;
    }
    
    &__text-primary {
      font-size: 0.875rem;
    }
    
    &__text-secondary {
      font-size: 0.8125rem;
    }
  }
}vx{argqFbQjniF2 Y$x4[import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, forwardRef } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faCloudUploadAlt, faFile, faImage, faFilePdf, faFileWord, faFileExcel, faFileCode, faTimes, faSpinner } from '@fortawesome/free-solid-svg-icons';

export type FileUploadSize = 'sm' | 'md' | 'lg';
export type FileUploadVariant = 'outlined' | 'filled' | 'underlined';
export type FileUploadState = 'default' | 'error' | 'success' | 'warning';

export interface UploadedFile {
  file: File;
  id: string;
  name: string;
  size: number;
  type: string;
  status: 'pending' | 'uploading' | 'completed' | 'error';
  progress?: number;
  error?: string;
  url?: string;
}

@Component({
  selector: 'ui-file-upload',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => FileUploadComponent),
      multi: true
    }
  ],
  template: `
    <div class="ui-file-upload" [class]="getWrapperClasses()">
      <!-- Label -->
      @if (label) {
        <label 
          class="ui-file-upload__label"
          [class.ui-file-upload__label--required]="required"
          [for]="inputId"
        >
          {{ label }}
        </label>
      }
      
      <!-- Dropzone -->
      <div 
        class="ui-file-upload__dropzone"
        [class.ui-file-upload__dropzone--dragover]="isDragOver"
        [attr.tabindex]="disabled ? -1 : 0"
        [attr.role]="'button'"
        [attr.aria-label]="'Upload files'"
        (click)="openFileDialog()"
        (dragover)="onDragOver($event)"
        (dragleave)="onDragLeave($event)"
        (drop)="onDrop($event)"
        (keydown)="onKeyDown($event)"
      >
        <fa-icon 
          class="ui-file-upload__icon" 
          [icon]="faCloudUploadAlt"
        ></fa-icon>
        
        <div class="ui-file-upload__text">
          <div class="ui-file-upload__text-primary">
            {{ isDragOver ? 'Drop files here' : 'Drag & drop files here' }}
          </div>
          <div class="ui-file-upload__text-secondary">
            @if (acceptedTypes.length > 0) {
              <div>Accepted formats: {{ getAcceptedTypesText() }}</div>
            }
            @if (maxFileSize) {
              <div>Max file size: {{ formatFileSize(maxFileSize) }}</div>
            }
            @if (maxFiles && maxFiles > 1) {
              <div>Max {{ maxFiles }} files</div>
            }
          </div>
        </div>
        
        <button 
          type="button" 
          class="ui-file-upload__browse-btn"
          [disabled]="disabled"
          (click)="$event.stopPropagation(); openFileDialog()"
        >
          Browse Files
        </button>
      </div>
      
      <!-- Hidden File Input -->
      <input
        #fileInput
        class="ui-file-upload__input"
        [id]="inputId"
        type="file"
        [accept]="accept"
        [multiple]="multiple"
        [disabled]="disabled"
        (change)="onFileSelected($event)"
      />
      
      <!-- File List -->
      @if (uploadedFiles.length > 0) {
        <div class="ui-file-upload__file-list">
          @for (uploadedFile of uploadedFiles; track uploadedFile.id) {
            <div 
              class="ui-file-upload__file-item"
              [class.ui-file-upload__file-item--uploading]="uploadedFile.status === 'uploading'"
              [class.ui-file-upload__file-item--error]="uploadedFile.status === 'error'"
              [class.ui-file-upload__file-item--success]="uploadedFile.status === 'completed'"
            >
              <div class="ui-file-upload__file-info">
                <fa-icon 
                  class="ui-file-upload__file-icon" 
                  [icon]="getFileIcon(uploadedFile.type)"
                ></fa-icon>
                <div class="ui-file-upload__file-details">
                  <div class="ui-file-upload__file-name" [title]="uploadedFile.name">
                    {{ uploadedFile.name }}
                  </div>
                  <div class="ui-file-upload__file-size">
                    {{ formatFileSize(uploadedFile.size) }}
                    @if (uploadedFile.status === 'error' && uploadedFile.error) {
                      <span> - {{ uploadedFile.error }}</span>
                    }
                  </div>
                </div>
              </div>
              
              <div class="ui-file-upload__file-actions">
                @if (uploadedFile.status === 'uploading') {
                  <fa-icon [icon]="faSpinner" [animation]="'spin'"></fa-icon>
                } @else {
                  <button
                    type="button"
                    class="ui-file-upload__remove-btn"
                    [attr.aria-label]="'Remove ' + uploadedFile.name"
                    (click)="removeFile(uploadedFile.id)"
                  >
                    <fa-icon [icon]="faTimes"></fa-icon>
                  </button>
                }
              </div>
              
              <!-- Progress Bar -->
              @if (uploadedFile.status === 'uploading' && uploadedFile.progress !== undefined) {
                <div 
                  class="ui-file-upload__progress"
                  [style.width.%]="uploadedFile.progress"
                ></div>
              }
            </div>
          }
        </div>
      }
      
      <!-- Helper Text -->
      @if (helperText || errorMessage) {
        <div class="ui-file-upload__helper-text" [class]="getHelperTextClasses()">
          {{ state === 'error' ? errorMessage : helperText }}
        </div>
      }
    </div>
  `,
  styleUrl: './file-upload.component.scss'
})
export class FileUploadComponent implements ControlValueAccessor {
  @Input() label: string = '';
  @Input() size: FileUploadSize = 'md';
  @Input() variant: FileUploadVariant = 'outlined';
  @Input() state: FileUploadState = 'default';
  @Input() disabled = false;
  @Input() required = false;
  @Input() multiple = false;
  @Input() accept: string = '';
  @Input() acceptedTypes: string[] = [];
  @Input() maxFileSize: number | null = null; // in bytes
  @Input() maxFiles: number | null = null;
  @Input() helperText: string = '';
  @Input() errorMessage: string = '';
  @Input() autoUpload = false;
  @Input() uploadUrl: string = '';
  @Input() inputId: string = `file-upload-${Math.random().toString(36).substr(2, 9)}`;

  @Output() filesSelected = new EventEmitter<UploadedFile[]>();
  @Output() fileAdded = new EventEmitter<UploadedFile>();
  @Output() fileRemoved = new EventEmitter<UploadedFile>();
  @Output() uploadProgress = new EventEmitter<{file: UploadedFile, progress: number}>();
  @Output() uploadComplete = new EventEmitter<UploadedFile>();
  @Output() uploadError = new EventEmitter<{file: UploadedFile, error: string}>();

  uploadedFiles: UploadedFile[] = [];
  isDragOver = false;

  // FontAwesome icons
  readonly faCloudUploadAlt = faCloudUploadAlt;
  readonly faFile = faFile;
  readonly faImage = faImage;
  readonly faFilePdf = faFilePdf;
  readonly faFileWord = faFileWord;
  readonly faFileExcel = faFileExcel;
  readonly faFileCode = faFileCode;
  readonly faTimes = faTimes;
  readonly faSpinner = faSpinner;

  // ControlValueAccessor implementation
  private onChange = (value: UploadedFile[]) => {};
  private onTouched = () => {};

  writeValue(value: UploadedFile[]): void {
    this.uploadedFiles = value || [];
  }

  registerOnChange(fn: (value: UploadedFile[]) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  getWrapperClasses(): string {
    const classes = [
      `ui-file-upload--${this.size}`,
      `ui-file-upload--${this.variant}`,
      `ui-file-upload--${this.state}`
    ];

    if (this.disabled) classes.push('ui-file-upload--disabled');
    if (this.isDragOver) classes.push('ui-file-upload--dragover');

    return classes.join(' ');
  }

  getHelperTextClasses(): string {
    return `ui-file-upload__helper-text--${this.state}`;
  }

  openFileDialog(): void {
    if (!this.disabled) {
      const input = document.getElementById(this.inputId) as HTMLInputElement;
      input?.click();
    }
  }

  onFileSelected(event: Event): void {
    const input = event.target as HTMLInputElement;
    if (input.files) {
      this.handleFiles(Array.from(input.files));
      // Reset input value to allow selecting the same file again
      input.value = '';
    }
  }

  onDragOver(event: DragEvent): void {
    if (!this.disabled) {
      event.preventDefault();
      event.stopPropagation();
      this.isDragOver = true;
    }
  }

  onDragLeave(event: DragEvent): void {
    if (!this.disabled) {
      event.preventDefault();
      event.stopPropagation();
      this.isDragOver = false;
    }
  }

  onDrop(event: DragEvent): void {
    if (!this.disabled) {
      event.preventDefault();
      event.stopPropagation();
      this.isDragOver = false;

      const files = event.dataTransfer?.files;
      if (files) {
        this.handleFiles(Array.from(files));
      }
    }
  }

  onKeyDown(event: KeyboardEvent): void {
    if ((event.key === 'Enter' || event.key === ' ') && !this.disabled) {
      event.preventDefault();
      this.openFileDialog();
    }
  }

  handleFiles(files: File[]): void {
    let validFiles: File[] = files;

    // Filter by accepted types
    if (this.acceptedTypes.length > 0) {
      validFiles = files.filter(file => this.isFileTypeAccepted(file));
    }

    // Filter by file size
    if (this.maxFileSize) {
      validFiles = validFiles.filter(file => file.size <= this.maxFileSize!);
    }

    // Limit number of files
    if (this.maxFiles) {
      const remainingSlots = this.maxFiles - this.uploadedFiles.length;
      validFiles = validFiles.slice(0, remainingSlots);
    }

    // Create UploadedFile objects
    const newUploadedFiles: UploadedFile[] = validFiles.map(file => ({
      file,
      id: this.generateFileId(),
      name: file.name,
      size: file.size,
      type: file.type,
      status: 'pending',
      progress: 0
    }));

    // Add to uploaded files array
    if (this.multiple) {
      this.uploadedFiles = [...this.uploadedFiles, ...newUploadedFiles];
    } else {
      this.uploadedFiles = newUploadedFiles;
    }

    // Emit events
    newUploadedFiles.forEach(uploadedFile => {
      this.fileAdded.emit(uploadedFile);
    });

    this.filesSelected.emit(this.uploadedFiles);
    this.onChange(this.uploadedFiles);
    this.onTouched();

    // Auto upload if enabled
    if (this.autoUpload && this.uploadUrl) {
      newUploadedFiles.forEach(uploadedFile => {
        this.uploadFile(uploadedFile);
      });
    }
  }

  removeFile(fileId: string): void {
    const fileIndex = this.uploadedFiles.findIndex(f => f.id === fileId);
    if (fileIndex > -1) {
      const removedFile = this.uploadedFiles[fileIndex];
      this.uploadedFiles.splice(fileIndex, 1);
      this.uploadedFiles = [...this.uploadedFiles]; // Trigger change detection
      
      this.fileRemoved.emit(removedFile);
      this.onChange(this.uploadedFiles);
    }
  }

  private uploadFile(uploadedFile: UploadedFile): void {
    uploadedFile.status = 'uploading';
    
    const formData = new FormData();
    formData.append('file', uploadedFile.file);

    // Simulate upload progress (replace with actual upload logic)
    let progress = 0;
    const interval = setInterval(() => {
      progress += 10;
      uploadedFile.progress = progress;
      this.uploadProgress.emit({ file: uploadedFile, progress });

      if (progress >= 100) {
        clearInterval(interval);
        uploadedFile.status = 'completed';
        this.uploadComplete.emit(uploadedFile);
      }
    }, 200);
  }

  private isFileTypeAccepted(file: File): boolean {
    return this.acceptedTypes.some(type => {
      if (type.startsWith('.')) {
        return file.name.toLowerCase().endsWith(type.toLowerCase());
      }
      return file.type.includes(type);
    });
  }

  private generateFileId(): string {
    return `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
  }

  getFileIcon(fileType: string): IconDefinition {
    if (fileType.startsWith('image/')) return this.faImage;
    if (fileType.includes('pdf')) return this.faFilePdf;
    if (fileType.includes('word') || fileType.includes('document')) return this.faFileWord;
    if (fileType.includes('excel') || fileType.includes('spreadsheet')) return this.faFileExcel;
    if (fileType.includes('code') || fileType.includes('javascript') || fileType.includes('typescript')) return this.faFileCode;
    return this.faFile;
  }

  formatFileSize(bytes: number): string {
    if (bytes === 0) return '0 Bytes';
    const k = 1024;
    const sizes = ['Bytes', 'KB', 'MB', 'GB'];
    const i = Math.floor(Math.log(bytes) / Math.log(k));
    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
  }

  getAcceptedTypesText(): string {
    return this.acceptedTypes.join(', ').toUpperCase();
  }
}4ax( export * from './file-upload.component';"x  !DNwUM \e)J
Ƕ`'Q;
Sxaa("(_MGvpѰi*%-6Afb5 ex&@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-form-field {
  position: relative;
  width: 100%;
  margin-bottom: $semantic-spacing-stack-md;

  // Size Variants
  &--sm {
    .ui-form-field__label {
      font-size: 0.8125rem;
      margin-bottom: $semantic-spacing-stack-xs;
    }
    
    .ui-form-field__helper-text {
      font-size: 0.75rem;
      margin-top: $semantic-spacing-stack-xs;
    }
  }

  &--md {
    .ui-form-field__label {
      font-size: 0.875rem;
      margin-bottom: $semantic-spacing-stack-sm;
    }
    
    .ui-form-field__helper-text {
      font-size: 0.8125rem;
      margin-top: $semantic-spacing-stack-sm;
    }
  }

  &--lg {
    .ui-form-field__label {
      font-size: 1rem;
      margin-bottom: $semantic-spacing-stack-sm;
    }
    
    .ui-form-field__helper-text {
      font-size: 0.875rem;
      margin-top: $semantic-spacing-stack-sm;
    }
  }

  // State Variants
  &--error {
    .ui-form-field__label {
      color: $semantic-color-error;
    }
    
    .ui-form-field__helper-text {
      color: $semantic-color-error;
    }
  }

  &--success {
    .ui-form-field__label {
      color: $semantic-color-success;
    }
    
    .ui-form-field__helper-text {
      color: $semantic-color-success;
    }
  }

  &--warning {
    .ui-form-field__label {
      color: $semantic-color-warning;
    }
    
    .ui-form-field__helper-text {
      color: $semantic-color-warning;
    }
  }

  &--disabled {
    .ui-form-field__label {
      color: $semantic-color-text-disabled;
    }
    
    .ui-form-field__helper-text {
      color: $semantic-color-text-disabled;
    }
  }

  // Label
  &__label {
    display: block;
    font-weight: 500;
    color: $semantic-color-text-primary;
    cursor: pointer;
    transition: color 0.15s $semantic-motion-easing-ease-in-out;

    &--required::after {
      content: ' *';
      color: $semantic-color-error;
      font-weight: 400;
    }

    &--optional {
      &::after {
        content: ' (optional)';
        color: $semantic-color-text-tertiary;
        font-weight: 400;
        font-size: 0.9em;
      }
    }
  }

  // Control Container
  &__control {
    position: relative;
    width: 100%;
  }

  // Helper Text
  &__helper-text {
    color: $semantic-color-text-tertiary;
    line-height: 1.4;
    transition: color 0.15s $semantic-motion-easing-ease-in-out;

    &--error {
      color: $semantic-color-error;
    }

    &--success {
      color: $semantic-color-success;
    }

    &--warning {
      color: $semantic-color-warning;
    }

    &--info {
      color: $semantic-color-info;
    }
  }

  // Validation Message
  &__validation {
    display: flex;
    align-items: flex-start;
    gap: $semantic-spacing-stack-xs;
    margin-top: $semantic-spacing-stack-xs;
    
    &--error {
      color: $semantic-color-error;
    }
    
    &--success {
      color: $semantic-color-success;
    }
    
    &--warning {
      color: $semantic-color-warning;
    }
    
    &--info {
      color: $semantic-color-info;
    }
  }

  &__validation-icon {
    font-size: 1rem;
    margin-top: 0.125rem;
    flex-shrink: 0;
    line-height: 1;
  }

  &__validation-text {
    font-size: 0.8125rem;
    line-height: 1.4;
    flex: 1;
  }

  // Character Counter
  &__char-counter {
    font-size: 0.75rem;
    color: $semantic-color-text-tertiary;
    text-align: right;
    margin-top: $semantic-spacing-stack-sm;
    
    &--over-limit {
      color: $semantic-color-error;
    }
  }

  // Hint Text
  &__hint {
    font-size: 0.8125rem;
    color: $semantic-color-text-secondary;
    margin-top: $semantic-spacing-stack-xs;
    display: flex;
    align-items: flex-start;
    gap: $semantic-spacing-stack-xs;
  }

  &__hint-icon {
    font-size: 1rem;
    color: $semantic-color-info;
    margin-top: 0.125rem;
    flex-shrink: 0;
    line-height: 1;
  }

  // Layout Variants
  &--horizontal {
    display: flex;
    align-items: flex-start;
    gap: $semantic-spacing-stack-lg;

    .ui-form-field__label {
      flex: 0 0 auto;
      min-width: 120px;
      margin-bottom: 0;
      padding-top: $semantic-spacing-stack-xs;
    }

    .ui-form-field__content {
      flex: 1;
      min-width: 0;
    }
  }

  // Content Wrapper
  &__content {
    width: 100%;
  }

  // Focus Ring Support
  &:focus-within {
    .ui-form-field__label {
      color: $semantic-color-primary;
    }
  }

  // Group Support (for radio buttons, checkboxes, etc.)
  &--group {
    .ui-form-field__control {
      display: flex;
      flex-direction: column;
      gap: $semantic-spacing-stack-sm;
    }

    &.ui-form-field--horizontal {
      .ui-form-field__control {
        flex-direction: row;
        flex-wrap: wrap;
        gap: $semantic-spacing-stack-md;
      }
    }
  }

  // Compact variant for tighter layouts
  &--compact {
    margin-bottom: $semantic-spacing-stack-sm;

    .ui-form-field__label {
      margin-bottom: $semantic-spacing-stack-xs;
    }

    .ui-form-field__helper-text,
    .ui-form-field__validation {
      margin-top: $semantic-spacing-stack-xs;
    }
  }

  // Full width variant
  &--full-width {
    width: 100%;

    .ui-form-field__control,
    .ui-form-field__control > * {
      width: 100%;
    }
  }

  // Responsive Design
  @media (max-width: $semantic-breakpoint-md - 1) {
    &--horizontal {
      flex-direction: column;
      gap: $semantic-spacing-stack-sm;

      .ui-form-field__label {
        min-width: unset;
        padding-top: 0;
        margin-bottom: $semantic-spacing-stack-xs;
      }
    }
  }

  @media (max-width: $semantic-breakpoint-sm - 1) {
    &--group.ui-form-field--horizontal {
      .ui-form-field__control {
        flex-direction: column;
        gap: $semantic-spacing-stack-sm;
      }
    }
  }

  // Animation for validation messages
  .ui-form-field__validation,
  .ui-form-field__helper-text {
    animation: slideInUp 0.3s $semantic-motion-easing-ease-in-out;
  }
}

@keyframes slideInUp {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}Tz7gxIgqFbQjniF V xIC*qql. Zx/bimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, ContentChild, AfterContentInit, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AbstractControl, FormControl, NgControl, ValidationErrors } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faExclamationCircle, faCheckCircle, faExclamationTriangle, faInfoCircle, faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
import { Subject, takeUntil } from 'rxjs';

export type FormFieldSize = 'sm' | 'md' | 'lg';
export type FormFieldState = 'default' | 'error' | 'success' | 'warning' | 'info';
export type FormFieldLayout = 'vertical' | 'horizontal';

export interface ValidationMessage {
  type: string;
  message: string;
  icon?: IconDefinition;
}

@Component({
  selector: 'ui-form-field',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div class="ui-form-field" [class]="getWrapperClasses()">
      @if (layout === 'horizontal') {
        <!-- Horizontal Layout -->
        @if (label) {
          <label 
            class="ui-form-field__label"
            [class.ui-form-field__label--required]="required && !showOptional"
            [class.ui-form-field__label--optional]="showOptional && !required"
            [for]="fieldId"
          >
            {{ label }}
          </label>
        }
        
        <div class="ui-form-field__content">
          <div class="ui-form-field__control">
            <ng-content></ng-content>
          </div>
          
          <!-- Helper Text -->
          @if (helperText && !hasValidationMessages()) {
            <div class="ui-form-field__helper-text" [class]="getHelperTextClasses()">
              {{ helperText }}
            </div>
          }
          
          <!-- Validation Messages -->
          @if (hasValidationMessages()) {
            <div class="ui-form-field__validation" [class]="getValidationClasses()">
              <fa-icon 
                class="ui-form-field__validation-icon" 
                [icon]="getValidationIcon()"
              ></fa-icon>
              <div class="ui-form-field__validation-text">
                {{ getValidationMessage() }}
              </div>
            </div>
          }
          
          <!-- Character Counter -->
          @if (showCharacterCount && maxLength) {
            <div class="ui-form-field__char-counter" [class.ui-form-field__char-counter--over-limit]="isOverCharacterLimit()">
              {{ currentLength }}/{{ maxLength }}
            </div>
          }
          
          <!-- Hint Text -->
          @if (hintText) {
            <div class="ui-form-field__hint">
              <fa-icon class="ui-form-field__hint-icon" [icon]="faQuestionCircle"></fa-icon>
              {{ hintText }}
            </div>
          }
        </div>
      } @else {
        <!-- Vertical Layout -->
        @if (label) {
          <label 
            class="ui-form-field__label"
            [class.ui-form-field__label--required]="required && !showOptional"
            [class.ui-form-field__label--optional]="showOptional && !required"
            [for]="fieldId"
          >
            {{ label }}
          </label>
        }
        
        <div class="ui-form-field__control">
          <ng-content></ng-content>
        </div>
        
        <!-- Helper Text -->
        @if (helperText && !hasValidationMessages()) {
          <div class="ui-form-field__helper-text" [class]="getHelperTextClasses()">
            {{ helperText }}
          </div>
        }
        
        <!-- Validation Messages -->
        @if (hasValidationMessages()) {
          <div class="ui-form-field__validation" [class]="getValidationClasses()">
            <fa-icon 
              class="ui-form-field__validation-icon" 
              [icon]="getValidationIcon()"
            ></fa-icon>
            <div class="ui-form-field__validation-text">
              {{ getValidationMessage() }}
            </div>
          </div>
        }
        
        <!-- Character Counter -->
        @if (showCharacterCount && maxLength) {
          <div class="ui-form-field__char-counter" [class.ui-form-field__char-counter--over-limit]="isOverCharacterLimit()">
            {{ currentLength }}/{{ maxLength }}
          </div>
        }
        
        <!-- Hint Text -->
        @if (hintText) {
          <div class="ui-form-field__hint">
            <fa-icon class="ui-form-field__hint-icon" [icon]="faQuestionCircle"></fa-icon>
            {{ hintText }}
          </div>
        }
      }
    </div>
  `,
  styleUrl: './form-field.component.scss'
})
export class FormFieldComponent implements AfterContentInit, OnDestroy {
  @Input() label: string = '';
  @Input() size: FormFieldSize = 'md';
  @Input() state: FormFieldState = 'default';
  @Input() layout: FormFieldLayout = 'vertical';
  @Input() required = false;
  @Input() disabled = false;
  @Input() showOptional = false;
  @Input() helperText: string = '';
  @Input() hintText: string = '';
  @Input() errorMessage: string = '';
  @Input() successMessage: string = '';
  @Input() warningMessage: string = '';
  @Input() infoMessage: string = '';
  @Input() showCharacterCount = false;
  @Input() maxLength: number | null = null;
  @Input() currentLength = 0;
  @Input() fieldId: string = `form-field-${Math.random().toString(36).substr(2, 9)}`;
  @Input() validationMessages: { [key: string]: string } = {};
  @Input() customValidationMessages: ValidationMessage[] = [];
  @Input() compact = false;
  @Input() fullWidth = false;
  @Input() group = false;

  @Output() stateChange = new EventEmitter<FormFieldState>();
  @Output() validationChange = new EventEmitter<ValidationErrors | null>();

  @ContentChild(NgControl, { static: false }) ngControl: NgControl | null = null;

  // FontAwesome icons
  readonly faExclamationCircle = faExclamationCircle;
  readonly faCheckCircle = faCheckCircle;
  readonly faExclamationTriangle = faExclamationTriangle;
  readonly faInfoCircle = faInfoCircle;
  readonly faQuestionCircle = faQuestionCircle;

  private destroy$ = new Subject<void>();
  private currentState: FormFieldState = 'default';

  ngAfterContentInit(): void {
    if (this.ngControl && this.ngControl.control) {
      // Listen to control status changes
      this.ngControl.control.statusChanges
        .pipe(takeUntil(this.destroy$))
        .subscribe(() => {
          this.updateStateFromControl();
        });

      // Listen to value changes for character count
      this.ngControl.control.valueChanges
        .pipe(takeUntil(this.destroy$))
        .subscribe((value: string) => {
          this.currentLength = value ? value.length : 0;
        });

      // Initial state update
      this.updateStateFromControl();
    }
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  getWrapperClasses(): string {
    const classes = [
      `ui-form-field--${this.size}`,
      `ui-form-field--${this.getCurrentState()}`,
      `ui-form-field--${this.layout}`
    ];

    if (this.disabled) classes.push('ui-form-field--disabled');
    if (this.compact) classes.push('ui-form-field--compact');
    if (this.fullWidth) classes.push('ui-form-field--full-width');
    if (this.group) classes.push('ui-form-field--group');

    return classes.join(' ');
  }

  getHelperTextClasses(): string {
    const state = this.getCurrentState();
    return `ui-form-field__helper-text--${state}`;
  }

  getValidationClasses(): string {
    const state = this.getCurrentState();
    return `ui-form-field__validation--${state}`;
  }

  getValidationIcon(): IconDefinition {
    const state = this.getCurrentState();
    switch (state) {
      case 'error':
        return this.faExclamationCircle;
      case 'success':
        return this.faCheckCircle;
      case 'warning':
        return this.faExclamationTriangle;
      case 'info':
        return this.faInfoCircle;
      default:
        return this.faExclamationCircle;
    }
  }

  getCurrentState(): FormFieldState {
    // Override state takes precedence
    if (this.state !== 'default') {
      return this.state;
    }

    // Check if we have a form control
    if (this.ngControl && this.ngControl.control) {
      const control = this.ngControl.control;
      
      // Error state
      if (control.invalid && (control.dirty || control.touched)) {
        return 'error';
      }
      
      // Success state
      if (control.valid && control.value && (control.dirty || control.touched)) {
        return 'success';
      }
    }

    // Check custom messages
    if (this.errorMessage) return 'error';
    if (this.successMessage) return 'success';
    if (this.warningMessage) return 'warning';
    if (this.infoMessage) return 'info';

    return 'default';
  }

  hasValidationMessages(): boolean {
    const currentState = this.getCurrentState();
    
    if (currentState === 'error') {
      return !!(this.getControlErrors() || this.errorMessage);
    }
    
    if (currentState === 'success') {
      return !!this.successMessage;
    }
    
    if (currentState === 'warning') {
      return !!this.warningMessage;
    }
    
    if (currentState === 'info') {
      return !!this.infoMessage;
    }

    return this.customValidationMessages.length > 0;
  }

  getValidationMessage(): string {
    const currentState = this.getCurrentState();
    
    if (currentState === 'error') {
      const controlErrors = this.getControlErrors();
      if (controlErrors) return controlErrors;
      return this.errorMessage || 'Please correct the error';
    }
    
    if (currentState === 'success') {
      return this.successMessage || 'Valid input';
    }
    
    if (currentState === 'warning') {
      return this.warningMessage || 'Warning message';
    }
    
    if (currentState === 'info') {
      return this.infoMessage || 'Information message';
    }

    if (this.customValidationMessages.length > 0) {
      return this.customValidationMessages[0].message;
    }

    return '';
  }

  isOverCharacterLimit(): boolean {
    return this.maxLength ? this.currentLength > this.maxLength : false;
  }

  private updateStateFromControl(): void {
    const newState = this.getCurrentState();
    if (newState !== this.currentState) {
      this.currentState = newState;
      this.stateChange.emit(newState);
    }

    if (this.ngControl && this.ngControl.control) {
      this.validationChange.emit(this.ngControl.control.errors);
    }
  }

  private getControlErrors(): string | null {
    if (!this.ngControl || !this.ngControl.control || !this.ngControl.control.errors) {
      return null;
    }

    const errors = this.ngControl.control.errors;
    const errorKey = Object.keys(errors)[0]; // Get first error

    // Check for custom validation messages first
    if (this.validationMessages[errorKey]) {
      return this.validationMessages[errorKey];
    }

    // Default error messages
    switch (errorKey) {
      case 'required':
        return 'This field is required';
      case 'email':
        return 'Please enter a valid email address';
      case 'minlength':
        return `Minimum length is ${errors[errorKey].requiredLength} characters`;
      case 'maxlength':
        return `Maximum length is ${errors[errorKey].requiredLength} characters`;
      case 'min':
        return `Minimum value is ${errors[errorKey].min}`;
      case 'max':
        return `Maximum value is ${errors[errorKey].max}`;
      case 'pattern':
        return 'Please enter a valid format';
      case 'url':
        return 'Please enter a valid URL';
      case 'number':
        return 'Please enter a valid number';
      case 'date':
        return 'Please enter a valid date';
      case 'time':
        return 'Please enter a valid time';
      case 'custom':
        return errors[errorKey].message || 'Invalid input';
      default:
        return 'Please correct this field';
    }
  }
}x' export * from './form-field.component';x}10St &$/ԪG+z|D$d<|~6\Rqӂo|3ŕ'#ټcJR44wEr4NizlTq!F;KuU큰1eE? Kx tag-input';
\.i5x`>4a+ Qx Arange-slider';
|z x6 {o͸u<YRonO8!T1Rxx export * from './text-input.component';
export * from './textarea.component';
export * from './input-wrapper.component';*Hx7import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, ViewChild, AfterViewInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { TextInputComponent, TextInputSize, TextInputVariant, TextInputType, TextInputState } from './text-input.component';
import { TextareaComponent, TextareaSize, TextareaVariant, TextareaState, TextareaResize } from './textarea.component';

export type InputWrapperMode = 'input' | 'textarea';

@Component({
  selector: 'ui-input-wrapper',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, TextInputComponent, TextareaComponent],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => InputWrapperComponent),
      multi: true
    }
  ],
  template: `
    @if (mode === 'input') {
      <ui-text-input
        #textInput
        [label]="label"
        [placeholder]="placeholder"
        [type]="inputType"
        [size]="size"
        [variant]="variant"
        [state]="state"
        [disabled]="disabled"
        [readonly]="readonly"
        [required]="required"
        [loading]="loading"
        [clearable]="clearable"
        [prefixIcon]="prefixIcon"
        [prefixText]="prefixText"
        [suffixIcon]="suffixIcon"
        [helperText]="helperText"
        [errorMessage]="errorMessage"
        [maxLength]="maxLength"
        [showCharacterCount]="showCharacterCount"
        [autocomplete]="autocomplete"
        [min]="min"
        [max]="max"
        [step]="step"
        [inputId]="inputId"
        (inputChange)="onInputChange($event)"
        (inputFocus)="onInputFocus($event)"
        (inputBlur)="onInputBlur($event)"
        (keyDown)="onKeyDown($event)"
        (clear)="onClear()"
      />
    }
    
    @if (mode === 'textarea') {
      <ui-textarea
        #textArea
        [label]="label"
        [placeholder]="placeholder"
        [size]="size"
        [variant]="variant"
        [state]="state"
        [disabled]="disabled"
        [readonly]="readonly"
        [required]="required"
        [loading]="loading"
        [clearable]="clearable"
        [prefixIcon]="prefixIcon"
        [suffixIcon]="suffixIcon"
        [helperText]="helperText"
        [errorMessage]="errorMessage"
        [maxLength]="maxLength"
        [showCharacterCount]="showCharacterCount"
        [rows]="rows"
        [cols]="cols"
        [resize]="resize"
        [autoResize]="autoResize"
        [textareaId]="inputId"
        (textareaChange)="onInputChange($event)"
        (textareaFocus)="onInputFocus($event)"
        (textareaBlur)="onInputBlur($event)"
        (keyDown)="onKeyDown($event)"
        (clear)="onClear()"
      />
    }
  `,
  styles: [`
    :host {
      display: block;
      width: 100%;
    }
  `]
})
export class InputWrapperComponent implements ControlValueAccessor, AfterViewInit {
  @ViewChild('textInput') textInput?: TextInputComponent;
  @ViewChild('textArea') textArea?: TextareaComponent;
  @Input() mode: InputWrapperMode = 'input';
  @Input() label: string = '';
  @Input() placeholder: string = '';
  @Input() inputType: TextInputType = 'text';
  @Input() size: TextInputSize | TextareaSize = 'md';
  @Input() variant: TextInputVariant | TextareaVariant = 'outlined';
  @Input() state: TextInputState | TextareaState = 'default';
  @Input() disabled = false;
  @Input() readonly = false;
  @Input() required = false;
  @Input() loading = false;
  @Input() clearable = false;
  @Input() prefixIcon: IconDefinition | null = null;
  @Input() prefixText: string = '';
  @Input() suffixIcon: IconDefinition | null = null;
  @Input() helperText: string = '';
  @Input() errorMessage: string = '';
  @Input() maxLength: number | null = null;
  @Input() showCharacterCount = false;
  @Input() autocomplete: string = '';
  @Input() min: string | number | null = null;
  @Input() max: string | number | null = null;
  @Input() step: string | number | null = null;
  @Input() inputId: string = `input-wrapper-${Math.random().toString(36).substr(2, 9)}`;
  
  // Textarea-specific inputs
  @Input() rows: number = 4;
  @Input() cols: number | null = null;
  @Input() resize: TextareaResize = 'vertical';
  @Input() autoResize = false;

  @Output() inputChange = new EventEmitter<string>();
  @Output() inputFocus = new EventEmitter<FocusEvent>();
  @Output() inputBlur = new EventEmitter<FocusEvent>();
  @Output() keyDown = new EventEmitter<KeyboardEvent>();
  @Output() clear = new EventEmitter<void>();

  value = '';

  // ControlValueAccessor implementation
  private onChange = (value: string) => {};
  private onTouched = () => {};

  ngAfterViewInit(): void {
    // Set up the initial value and event forwarding for child components
    this.updateChildComponent();
  }

  writeValue(value: string): void {
    this.value = value || '';
    this.updateChildComponent();
  }

  registerOnChange(fn: (value: string) => void): void {
    this.onChange = fn;
    this.updateChildComponent();
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
    this.updateChildComponent();
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
    this.updateChildComponent();
  }

  private updateChildComponent(): void {
    const activeComponent = this.mode === 'input' ? this.textInput : this.textArea;
    if (activeComponent) {
      activeComponent.writeValue(this.value);
      activeComponent.registerOnChange(this.onChange);
      activeComponent.registerOnTouched(this.onTouched);
      activeComponent.setDisabledState(this.disabled);
    }
  }

  onInputChange(value: string): void {
    this.value = value;
    this.onChange(value);
    this.inputChange.emit(value);
  }

  onInputFocus(event: FocusEvent): void {
    this.inputFocus.emit(event);
  }

  onInputBlur(event: FocusEvent): void {
    this.onTouched();
    this.inputBlur.emit(event);
  }

  onKeyDown(event: KeyboardEvent): void {
    this.keyDown.emit(event);
  }

  onClear(): void {
    this.clear.emit();
  }
}Ax'7@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// TEXT INPUT COMPONENT
// ==========================================================================
// Comprehensive text input component with multiple variants and sizes
// Uses semantic design tokens for consistent styling across the design system
// ==========================================================================

.text-input-wrapper {
  display: flex;
  flex-direction: column;
  width: 100%;
  position: relative;
  
  // ==========================================================================
  // SIZE VARIANTS
  // ==========================================================================
  
  &--sm {
    .text-input__container {
      min-height: 36px;
    }
    
    .text-input__field {
      font-size: 0.875rem;
      padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    }
    
    .text-input__label {
      font-size: 0.8125rem;
      margin-bottom: $semantic-spacing-component-xs;
    }
  }
  
  &--md {
    .text-input__container {
      min-height: 48px;
    }
    
    .text-input__field {
      font-size: 1rem;
      padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    }
    
    .text-input__label {
      font-size: 0.875rem;
      margin-bottom: $semantic-spacing-component-sm;
    }
  }
  
  &--lg {
    .text-input__container {
      min-height: 56px;
    }
    
    .text-input__field {
      font-size: 1.125rem;
      padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
    }
    
    .text-input__label {
      font-size: 1rem;
      margin-bottom: $semantic-spacing-component-sm;
    }
  }

  // ==========================================================================
  // VARIANT STYLES
  // ==========================================================================
  
  &--outlined {
    .text-input__container {
      border: $semantic-border-width-2 solid $semantic-color-border-primary;
      border-radius: $semantic-border-radius-md;
      background-color: $semantic-color-surface-primary;
    }
    
    &.text-input-wrapper--focused .text-input__container {
      border-color: $semantic-color-interactive-primary;
      box-shadow: 0 0 0 2px rgba($semantic-color-brand-primary, 0.12);
    }
  }
  
  &--filled {
    .text-input__container {
      border: none;
      border-bottom: 2px solid $semantic-color-border-primary;
      border-radius: $semantic-border-radius-sm $semantic-border-radius-sm 0 0;
      background-color: $semantic-color-surface-secondary;
    }
    
    &.text-input-wrapper--focused .text-input__container {
      border-bottom-color: $semantic-color-interactive-primary;
      background-color: $semantic-color-surface-elevated;
    }
  }
  
  &--underlined {
    .text-input__container {
      border: none;
      border-bottom: 1px solid $semantic-color-border-primary;
      border-radius: 0;
      background-color: transparent;
      padding: $semantic-spacing-component-xs 0;
    }
    
    &.text-input-wrapper--focused .text-input__container {
      border-bottom: 2px solid $semantic-color-interactive-primary;
    }
  }

  // ==========================================================================
  // STATE VARIANTS
  // ==========================================================================
  
  &--error {
    .text-input__container {
      border-color: $semantic-color-danger;
    }
    
    &.text-input-wrapper--focused .text-input__container {
      border-color: $semantic-color-danger;
      box-shadow: 0 0 0 2px rgba($semantic-color-danger, 0.12);
    }
    
    .text-input__label {
      color: $semantic-color-danger;
    }
  }
  
  &--success {
    .text-input__container {
      border-color: $semantic-color-success;
    }
    
    &.text-input-wrapper--focused .text-input__container {
      border-color: $semantic-color-success;
      box-shadow: 0 0 0 2px rgba($semantic-color-success, 0.12);
    }
    
    .text-input__label {
      color: $semantic-color-success;
    }
  }
  
  &--warning {
    .text-input__container {
      border-color: $semantic-color-warning;
    }
    
    &.text-input-wrapper--focused .text-input__container {
      border-color: $semantic-color-warning;
      box-shadow: 0 0 0 2px rgba($semantic-color-warning, 0.12);
    }
    
    .text-input__label {
      color: $semantic-color-warning;
    }
  }
  
  &--disabled {
    opacity: 0.6;
    pointer-events: none;
    
    .text-input__container {
      background-color: $semantic-color-surface-disabled;
      border-color: $semantic-color-border-disabled;
    }
    
    .text-input__label {
      color: $semantic-color-text-disabled;
    }
  }
  
  &--readonly {
    .text-input__field {
      background-color: $semantic-color-surface-secondary;
      cursor: default;
    }
  }
  
  &--loading {
    .text-input__field {
      padding-right: calc($semantic-spacing-component-lg + 24px);
    }
  }
}

// ==========================================================================
// LABEL STYLES
// ==========================================================================

.text-input__label {
  display: block;
  font-weight: 500;
  color: $semantic-color-text-primary;
  cursor: pointer;
  user-select: none;
  transition: color 0.2s ease-in-out;
  
  &--required {
    .text-input__required-indicator {
      color: $semantic-color-danger;
      margin-left: $semantic-spacing-micro-tight;
    }
  }
}

// ==========================================================================
// INPUT CONTAINER
// ==========================================================================

.text-input__container {
  display: flex;
  align-items: center;
  width: 100%;
  box-sizing: border-box;
  transition: all 0.2s ease-in-out;
  position: relative;
  
  &:hover:not(.text-input-wrapper--disabled &) {
    border-color: $semantic-color-border-secondary;
  }
  
  &--has-prefix {
    .text-input__field {
      padding-left: 0; // Prefix handles spacing
    }
  }
  
  &--has-suffix {
    .text-input__field {
      padding-right: 0; // Suffix handles spacing
    }
  }
}

// ==========================================================================
// INPUT FIELD
// ==========================================================================

.text-input__field {
  flex: 1;
  border: none;
  outline: none;
  background: transparent;
  color: $semantic-color-text-primary;
  font-family: inherit;
  font-weight: 400;
  line-height: 1.5;
  min-width: 0;
  
  &::placeholder {
    color: $semantic-color-text-tertiary;
    transition: opacity 0.2s ease-in-out;
  }
  
  &:focus::placeholder {
    opacity: 0.7;
  }
  
  // Remove browser default styles
  &::-webkit-outer-spin-button,
  &::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
  }
  
  &[type="number"] {
    -moz-appearance: textfield;
  }
  
  // Autofill styles
  &:-webkit-autofill {
    -webkit-text-fill-color: $semantic-color-text-primary !important;
    -webkit-box-shadow: 0 0 0 1000px $semantic-color-surface-primary inset !important;
    transition: background-color 5000s ease-in-out 0s;
  }
  
  // Remove password reveal button in Edge
  &::-ms-reveal,
  &::-ms-clear {
    display: none;
  }
}

// ==========================================================================
// PREFIX STYLES
// ==========================================================================

.text-input__prefix-icon,
.text-input__prefix-text {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  color: $semantic-color-text-secondary;
}

.text-input__prefix-icon {
  padding-left: 12px; // 8-12px padding from left edge so icon isn't hard against side
  padding-right: 12px; // 8-12px spacing between icon and text as requested
  
  // Size-specific spacing adjustments
  .text-input-wrapper--sm & {
    padding-left: 10px; // Slightly less for smaller size
    padding-right: 10px; // Slightly less for smaller size
  }
  
  .text-input-wrapper--lg & {
    padding-left: 14px; // Slightly more for larger size
    padding-right: 14px; // Slightly more for larger size
  }
  
  fa-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 1rem;
    height: 1rem;
    font-size: 1rem;
    
    .text-input-wrapper--sm & {
      width: 0.875rem;
      height: 0.875rem;
      font-size: 0.875rem;
    }
    
    .text-input-wrapper--lg & {
      width: 1.125rem;
      height: 1.125rem;
      font-size: 1.125rem;
    }
  }
}

.text-input__prefix-text {
  padding-left: $semantic-spacing-component-md;
  padding-right: 10px; // Slightly less than icon to account for border
  font-weight: 500;
  font-size: 0.875rem;
  white-space: nowrap;
  border-right: 1px solid $semantic-color-border-secondary;
  margin-right: $semantic-spacing-component-xs;
  
  .text-input-wrapper--sm & {
    font-size: 0.8125rem;
  }
  
  .text-input-wrapper--lg & {
    font-size: 1rem;
  }
}

// ==========================================================================
// SUFFIX STYLES
// ==========================================================================

.text-input__suffix {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-xs;
  padding-right: 12px; // 8-12px padding from right edge so icons aren't hard against side
  padding-left: 12px; // Consistent spacing from text content
  
  // Size-specific spacing adjustments
  .text-input-wrapper--sm & {
    padding-left: 10px; // Slightly less for smaller size
    padding-right: 10px; // Slightly less for smaller size
  }
  
  .text-input-wrapper--lg & {
    padding-left: 14px; // Slightly more for larger size
    padding-right: 14px; // Slightly more for larger size
  }
  
  &--has-content {
    // Maintain consistent padding even when content is present
  }
}

.text-input__clear-btn,
.text-input__password-toggle {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border: none;
  border-radius: $semantic-border-radius-sm;
  background: transparent;
  color: $semantic-color-text-secondary;
  cursor: pointer;
  transition: all 0.2s ease-in-out;
  
  &:hover {
    background-color: $semantic-color-surface-interactive;
    color: $semantic-color-text-primary;
  }
  
  &:focus {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 1px;
  }
  
  fa-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 0.875rem;
    height: 0.875rem;
    font-size: 0.875rem;
  }
}

.text-input__spinner {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  color: $semantic-color-interactive-primary;
  
  fa-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 0.875rem;
    height: 0.875rem;
    font-size: 0.875rem;
  }
}

.text-input__suffix-icon {
  display: flex;
  align-items: center;
  color: $semantic-color-text-secondary;
  
  fa-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 1rem;
    height: 1rem;
    font-size: 1rem;
  }
}

// ==========================================================================
// HELPER TEXT AND ERROR MESSAGES
// ==========================================================================

.text-input__helper-text {
  margin-top: $semantic-spacing-component-xs;
  font-size: 0.8125rem;
  line-height: 1.4;
  color: $semantic-color-text-secondary;
  
  &--error {
    color: $semantic-color-danger;
  }
  
  &--success {
    color: $semantic-color-success;
  }
  
  &--warning {
    color: $semantic-color-warning;
  }
}

// ==========================================================================
// CHARACTER COUNTER
// ==========================================================================

.text-input__char-counter {
  position: absolute;
  bottom: -#{$semantic-spacing-component-lg};
  right: 0;
  font-size: 0.75rem;
  color: $semantic-color-text-tertiary;
  user-select: none;
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .text-input-wrapper {
    &--lg {
      .text-input__container {
        min-height: 48px;
      }
      
      .text-input__field {
        font-size: 1rem;
        padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
      }
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

.text-input__field:focus {
  // Focus is handled by container border/shadow
}

// High contrast mode support
@media (prefers-contrast: high) {
  .text-input__container {
    border-width: 2px;
  }
  
  .text-input-wrapper--focused .text-input__container {
    border-width: 3px;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .text-input__container,
  .text-input__field,
  .text-input__label,
  .text-input__clear-btn,
  .text-input__password-toggle {
    transition: none;
  }
}

// ==========================================================================
// FLOATING LABEL VARIANT (OPTIONAL)
// ==========================================================================

.text-input-wrapper--floating {
  .text-input__label {
    position: absolute;
    top: 50%;
    left: $semantic-spacing-component-md;
    transform: translateY(-50%);
    background-color: $semantic-color-surface-primary;
    padding: 0 $semantic-spacing-component-xs;
    pointer-events: none;
    transition: all 0.2s ease-in-out;
    z-index: 1;
  }
  
  &.text-input-wrapper--focused .text-input__label,
  &.text-input-wrapper--has-value .text-input__label {
    top: 0;
    transform: translateY(-50%);
    font-size: 0.75rem;
    color: $semantic-color-interactive-primary;
  }
}55x[ ogqFbQjniFf X7ex!import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faSearch, faEnvelope, faTimes, faEye, faEyeSlash, faSpinner } from '@fortawesome/free-solid-svg-icons';

export type TextInputSize = 'sm' | 'md' | 'lg';
export type TextInputVariant = 'outlined' | 'filled' | 'underlined';
export type TextInputType = 'text' | 'email' | 'password' | 'search' | 'number' | 'tel' | 'url';
export type TextInputState = 'default' | 'error' | 'success' | 'warning';

@Component({
  selector: 'ui-text-input',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, FontAwesomeModule],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => TextInputComponent),
      multi: true
    }
  ],
  template: `
    <div class="text-input-wrapper" [class]="getWrapperClasses()">
      <!-- Label -->
      @if (label) {
        <label 
          class="text-input__label"
          [for]="inputId"
          [class.text-input__label--required]="required"
        >
          {{ label }}
          @if (required) {
            <span class="text-input__required-indicator">*</span>
          }
        </label>
      }
      
      <!-- Input Container -->
      <div class="text-input__container" [class]="getContainerClasses()">
        <!-- Prefix Icon -->
        @if (prefixIcon) {
          <div class="text-input__prefix-icon">
            <fa-icon [icon]="prefixIcon"></fa-icon>
          </div>
        }
        
        <!-- Prefix Text -->
        @if (prefixText) {
          <div class="text-input__prefix-text">{{ prefixText }}</div>
        }
        
        <!-- Input Field -->
        <input
          [id]="inputId"
          class="text-input__field"
          [type]="getInputType()"
          [placeholder]="placeholder"
          [disabled]="disabled"
          [readonly]="readonly"
          [required]="required"
          [min]="min"
          [max]="max"
          [step]="step"
          [attr.maxlength]="maxLength"
          [autocomplete]="autocomplete"
          [value]="value"
          (input)="onInput($event)"
          (focus)="onFocus($event)"
          (blur)="onBlur($event)"
          (keydown)="onKeyDown($event)"
        />
        
        <!-- Suffix Content -->
        <div class="text-input__suffix" [class.text-input__suffix--has-content]="hasSuffixContent()">
          <!-- Clear Button -->
          @if (clearable && value && !disabled) {
            <button
              type="button"
              class="text-input__clear-btn"
              (click)="clearValue()"
              [attr.aria-label]="'Clear ' + (label || 'input')"
            >
              <fa-icon [icon]="faTimes"></fa-icon>
            </button>
          }
          
          <!-- Password Toggle -->
          @if (type === 'password') {
            <button
              type="button"
              class="text-input__password-toggle"
              (click)="togglePasswordVisibility()"
              [attr.aria-label]="passwordVisible() ? 'Hide password' : 'Show password'"
            >
              <fa-icon [icon]="passwordVisible() ? faEyeSlash : faEye"></fa-icon>
            </button>
          }
          
          <!-- Loading Spinner -->
          @if (loading) {
            <div class="text-input__spinner">
              <fa-icon [icon]="faSpinner" [animation]="'spin'"></fa-icon>
            </div>
          }
          
          <!-- Custom Suffix -->
          @if (suffixIcon) {
            <div class="text-input__suffix-icon">
              <fa-icon [icon]="suffixIcon"></fa-icon>
            </div>
          }
        </div>
      </div>
      
      <!-- Helper Text / Error Message -->
      @if (helperText || errorMessage) {
        <div class="text-input__helper-text" [class]="getHelperTextClasses()">
          {{ state === 'error' ? errorMessage : helperText }}
        </div>
      }
      
      <!-- Character Counter -->
      @if (maxLength && showCharacterCount) {
        <div class="text-input__char-counter">
          {{ value.length }}/{{ maxLength }}
        </div>
      }
    </div>
  `,
  styleUrls: ['./text-input.component.scss']
})
export class TextInputComponent implements ControlValueAccessor {
  @Input() label: string = '';
  @Input() placeholder: string = '';
  @Input() type: TextInputType = 'text';
  @Input() size: TextInputSize = 'md';
  @Input() variant: TextInputVariant = 'outlined';
  @Input() state: TextInputState = 'default';
  @Input() disabled = false;
  @Input() readonly = false;
  @Input() required = false;
  @Input() loading = false;
  @Input() clearable = false;
  @Input() prefixIcon: IconDefinition | null = null;
  @Input() prefixText: string = '';
  @Input() suffixIcon: IconDefinition | null = null;
  @Input() helperText: string = '';
  @Input() errorMessage: string = '';
  @Input() maxLength: number | null = null;
  @Input() showCharacterCount = false;
  @Input() autocomplete: string = '';
  @Input() min: string | number | null = null;
  @Input() max: string | number | null = null;
  @Input() step: string | number | null = null;
  @Input() inputId: string = `text-input-${Math.random().toString(36).substr(2, 9)}`;

  @Output() inputChange = new EventEmitter<string>();
  @Output() inputFocus = new EventEmitter<FocusEvent>();
  @Output() inputBlur = new EventEmitter<FocusEvent>();
  @Output() keyDown = new EventEmitter<KeyboardEvent>();
  @Output() clear = new EventEmitter<void>();

  value = '';
  focused = false;
  passwordVisible = signal(false);

  // FontAwesome icons
  readonly faSearch = faSearch;
  readonly faEnvelope = faEnvelope;
  readonly faTimes = faTimes;
  readonly faEye = faEye;
  readonly faEyeSlash = faEyeSlash;
  readonly faSpinner = faSpinner;

  // ControlValueAccessor implementation
  private onChange = (value: string) => {};
  private onTouched = () => {};

  writeValue(value: string): void {
    this.value = value || '';
  }

  registerOnChange(fn: (value: string) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  getWrapperClasses(): string {
    const classes = [
      `text-input-wrapper--${this.size}`,
      `text-input-wrapper--${this.variant}`,
      `text-input-wrapper--${this.state}`
    ];

    if (this.disabled) classes.push('text-input-wrapper--disabled');
    if (this.focused) classes.push('text-input-wrapper--focused');
    if (this.readonly) classes.push('text-input-wrapper--readonly');
    if (this.loading) classes.push('text-input-wrapper--loading');

    return classes.join(' ');
  }

  getContainerClasses(): string {
    const classes: string[] = [];

    if (this.prefixIcon || this.prefixText) classes.push('text-input__container--has-prefix');
    if (this.hasSuffixContent()) classes.push('text-input__container--has-suffix');

    return classes.join(' ');
  }

  getHelperTextClasses(): string {
    const classes = [`text-input__helper-text--${this.state}`];
    return classes.join(' ');
  }

  getInputType(): string {
    if (this.type === 'password') {
      return this.passwordVisible() ? 'text' : 'password';
    }
    return this.type;
  }

  hasSuffixContent(): boolean {
    return !!(
      this.clearable ||
      this.type === 'password' ||
      this.loading ||
      this.suffixIcon
    );
  }

  onInput(event: Event): void {
    const target = event.target as HTMLInputElement;
    this.value = target.value;
    this.onChange(this.value);
    this.inputChange.emit(this.value);
  }

  onFocus(event: FocusEvent): void {
    this.focused = true;
    this.inputFocus.emit(event);
  }

  onBlur(event: FocusEvent): void {
    this.focused = false;
    this.onTouched();
    this.inputBlur.emit(event);
  }

  onKeyDown(event: KeyboardEvent): void {
    this.keyDown.emit(event);
  }

  togglePasswordVisibility(): void {
    this.passwordVisible.set(!this.passwordVisible());
  }

  clearValue(): void {
    this.value = '';
    this.onChange(this.value);
    this.inputChange.emit(this.value);
    this.clear.emit();
  }
},,"x1@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// TEXTAREA COMPONENT
// ==========================================================================
// Comprehensive textarea component with multiple variants and sizes
// Uses semantic design tokens for consistent styling across the design system
// ==========================================================================

.textarea-wrapper {
  display: flex;
  flex-direction: column;
  width: 100%;
  position: relative;
  
  // ==========================================================================
  // SIZE VARIANTS
  // ==========================================================================
  
  &--sm {
    .textarea__container {
      min-height: 80px;
    }
    
    .textarea__field {
      font-size: 0.875rem;
      padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
      line-height: 1.4;
    }
    
    .textarea__label {
      font-size: 0.8125rem;
      margin-bottom: $semantic-spacing-component-xs;
    }
  }
  
  &--md {
    .textarea__container {
      min-height: 100px;
    }
    
    .textarea__field {
      font-size: 1rem;
      padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
      line-height: 1.5;
    }
    
    .textarea__label {
      font-size: 0.875rem;
      margin-bottom: $semantic-spacing-component-sm;
    }
  }
  
  &--lg {
    .textarea__container {
      min-height: 120px;
    }
    
    .textarea__field {
      font-size: 1.125rem;
      padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
      line-height: 1.6;
    }
    
    .textarea__label {
      font-size: 1rem;
      margin-bottom: $semantic-spacing-component-sm;
    }
  }

  // ==========================================================================
  // VARIANT STYLES
  // ==========================================================================
  
  &--outlined {
    .textarea__container {
      border: 2px solid $semantic-color-border-primary;
      border-radius: $semantic-border-radius-md;
      background-color: $semantic-color-surface-primary;
    }
    
    &.textarea-wrapper--focused .textarea__container {
      border-color: $semantic-color-interactive-primary;
      box-shadow: 0 0 0 2px rgba($semantic-color-brand-primary, 0.12);
    }
  }
  
  &--filled {
    .textarea__container {
      border: none;
      border-bottom: 2px solid $semantic-color-border-primary;
      border-radius: $semantic-border-radius-sm $semantic-border-radius-sm 0 0;
      background-color: $semantic-color-surface-secondary;
    }
    
    &.textarea-wrapper--focused .textarea__container {
      border-bottom-color: $semantic-color-interactive-primary;
      background-color: $semantic-color-surface-elevated;
    }
  }
  
  &--underlined {
    .textarea__container {
      border: none;
      border-bottom: 1px solid $semantic-color-border-primary;
      border-radius: 0;
      background-color: transparent;
      padding: $semantic-spacing-component-xs 0;
    }
    
    &.textarea-wrapper--focused .textarea__container {
      border-bottom: 2px solid $semantic-color-interactive-primary;
    }
  }

  // ==========================================================================
  // STATE VARIANTS
  // ==========================================================================
  
  &--error {
    .textarea__container {
      border-color: $semantic-color-danger;
    }
    
    &.textarea-wrapper--focused .textarea__container {
      border-color: $semantic-color-danger;
      box-shadow: 0 0 0 2px rgba($semantic-color-danger, 0.12);
    }
    
    .textarea__label {
      color: $semantic-color-danger;
    }
  }
  
  &--success {
    .textarea__container {
      border-color: $semantic-color-success;
    }
    
    &.textarea-wrapper--focused .textarea__container {
      border-color: $semantic-color-success;
      box-shadow: 0 0 0 2px rgba($semantic-color-success, 0.12);
    }
    
    .textarea__label {
      color: $semantic-color-success;
    }
  }
  
  &--warning {
    .textarea__container {
      border-color: $semantic-color-warning;
    }
    
    &.textarea-wrapper--focused .textarea__container {
      border-color: $semantic-color-warning;
      box-shadow: 0 0 0 2px rgba($semantic-color-warning, 0.12);
    }
    
    .textarea__label {
      color: $semantic-color-warning;
    }
  }
  
  &--disabled {
    opacity: 0.6;
    pointer-events: none;
    
    .textarea__container {
      background-color: $semantic-color-surface-disabled;
      border-color: $semantic-color-border-disabled;
    }
    
    .textarea__label {
      color: $semantic-color-text-disabled;
    }
  }
  
  &--readonly {
    .textarea__field {
      background-color: $semantic-color-surface-secondary;
      cursor: default;
    }
  }
  
  &--loading {
    .textarea__field {
      padding-right: calc($semantic-spacing-component-lg + 24px);
    }
  }

  &--resize-none {
    .textarea__field {
      resize: none;
    }
  }

  &--resize-vertical {
    .textarea__field {
      resize: vertical;
    }
  }

  &--resize-horizontal {
    .textarea__field {
      resize: horizontal;
    }
  }

  &--resize-both {
    .textarea__field {
      resize: both;
    }
  }

  &--auto-resize {
    .textarea__field {
      resize: none;
      overflow: hidden;
    }
  }
}

// ==========================================================================
// LABEL STYLES
// ==========================================================================

.textarea__label {
  display: block;
  font-weight: 500;
  color: $semantic-color-text-primary;
  cursor: pointer;
  user-select: none;
  transition: color 0.2s ease-in-out;
  
  &--required {
    .textarea__required-indicator {
      color: $semantic-color-danger;
      margin-left: $semantic-spacing-micro-tight;
    }
  }
}

// ==========================================================================
// TEXTAREA CONTAINER
// ==========================================================================

.textarea__container {
  display: flex;
  align-items: flex-start;
  width: 100%;
  box-sizing: border-box;
  transition: all 0.2s ease-in-out;
  position: relative;
  
  &:hover:not(.textarea-wrapper--disabled &) {
    border-color: $semantic-color-border-secondary;
  }
  
  &--has-prefix {
    .textarea__field {
      padding-left: 0;
    }
  }
  
  &--has-suffix {
    .textarea__field {
      padding-right: 0;
    }
  }
}

// ==========================================================================
// TEXTAREA FIELD
// ==========================================================================

.textarea__field {
  flex: 1;
  border: none;
  outline: none;
  background: transparent;
  color: $semantic-color-text-primary;
  font-family: inherit;
  font-weight: 400;
  min-width: 0;
  resize: vertical;
  
  &::placeholder {
    color: $semantic-color-text-tertiary;
    transition: opacity 0.2s ease-in-out;
  }
  
  &:focus::placeholder {
    opacity: 0.7;
  }
}

// ==========================================================================
// PREFIX STYLES
// ==========================================================================

.textarea__prefix-icon {
  flex-shrink: 0;
  display: flex;
  align-items: flex-start;
  color: $semantic-color-text-secondary;
  padding-left: 12px; // 8-12px padding from left edge so icon isn't hard against side
  padding-right: 12px; // 8-12px spacing between icon and text
  padding-top: $semantic-spacing-component-sm;
  
  // Size-specific spacing adjustments
  .textarea-wrapper--sm & {
    padding-left: 10px; // Slightly less for smaller size
    padding-right: 10px; // Slightly less for smaller size
  }
  
  .textarea-wrapper--lg & {
    padding-left: 14px; // Slightly more for larger size
    padding-right: 14px; // Slightly more for larger size
  }
  
  fa-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 1rem;
    height: 1rem;
    font-size: 1rem;
    
    .textarea-wrapper--sm & {
      width: 0.875rem;
      height: 0.875rem;
      font-size: 0.875rem;
    }
    
    .textarea-wrapper--lg & {
      width: 1.125rem;
      height: 1.125rem;
      font-size: 1.125rem;
    }
  }
}

// ==========================================================================
// SUFFIX STYLES
// ==========================================================================

.textarea__suffix {
  flex-shrink: 0;
  display: flex;
  align-items: flex-start;
  gap: $semantic-spacing-component-xs;
  padding-right: 12px; // 8-12px padding from right edge so icons aren't hard against side
  padding-left: 12px; // Consistent spacing from text content
  padding-top: $semantic-spacing-component-sm;
  
  // Size-specific spacing adjustments
  .textarea-wrapper--sm & {
    padding-left: 10px; // Slightly less for smaller size
    padding-right: 10px; // Slightly less for smaller size
  }
  
  .textarea-wrapper--lg & {
    padding-left: 14px; // Slightly more for larger size
    padding-right: 14px; // Slightly more for larger size
  }
  
  &--has-content {
    // Maintain consistent padding even when content is present
  }
}

.textarea__clear-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border: none;
  border-radius: $semantic-border-radius-sm;
  background: transparent;
  color: $semantic-color-text-secondary;
  cursor: pointer;
  transition: all 0.2s ease-in-out;
  
  &:hover {
    background-color: $semantic-color-surface-interactive;
    color: $semantic-color-text-primary;
  }
  
  &:focus {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 1px;
  }
  
  fa-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 0.875rem;
    height: 0.875rem;
    font-size: 0.875rem;
  }
}

.textarea__spinner {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  color: $semantic-color-interactive-primary;
  
  fa-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 0.875rem;
    height: 0.875rem;
    font-size: 0.875rem;
  }
}

.textarea__suffix-icon {
  display: flex;
  align-items: center;
  color: $semantic-color-text-secondary;
  
  fa-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 1rem;
    height: 1rem;
    font-size: 1rem;
  }
}

// ==========================================================================
// HELPER TEXT AND ERROR MESSAGES
// ==========================================================================

.textarea__helper-text {
  margin-top: $semantic-spacing-component-xs;
  font-size: 0.8125rem;
  line-height: 1.4;
  color: $semantic-color-text-secondary;
  
  &--error {
    color: $semantic-color-danger;
  }
  
  &--success {
    color: $semantic-color-success;
  }
  
  &--warning {
    color: $semantic-color-warning;
  }
}

// ==========================================================================
// CHARACTER COUNTER
// ==========================================================================

.textarea__char-counter {
  position: absolute;
  bottom: -#{$semantic-spacing-component-lg};
  right: 0;
  font-size: 0.75rem;
  color: $semantic-color-text-tertiary;
  user-select: none;
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .textarea-wrapper {
    &--lg {
      .textarea__container {
        min-height: 100px;
      }
      
      .textarea__field {
        font-size: 1rem;
        padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
      }
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

.textarea__field:focus {
  // Focus is handled by container border/shadow
}

// High contrast mode support
@media (prefers-contrast: high) {
  .textarea__container {
    border-width: 2px;
  }
  
  .textarea-wrapper--focused .textarea__container {
    border-width: 3px;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .textarea__container,
  .textarea__field,
  .textarea__label,
  .textarea__clear-btn {
    transition: none;
  }
}!ʚ(xbPRADIO BUTTONjradio buttonPradio-button-wrapper {A=1radio-button {
      width: 20px;
      height: 2Sradio-button__circle {
      width: 20px;
      height: 20px;
      border-width: 1radio-button__inner-circle {
      width: 8px;
      height: 8px;
      top: 50%;
      left: 50%;
    }
    
    .radio-button/&	025rem;
    }
    
    .radio-button__descriptionPO0.75rem;
      line-height: 1rem;
    }
    
    .radio-button-container {
    !)2radio-button {
      width: 24px;
      height: 24Sradio-button__circle {
      width: 24px;
      height: 24px;
      border-width: 2radio-button__inner-circle {
      width: 10px;
      height: 10px;
      top: 50%;
      left: 50%;
    }
    
    .radio-button/
/5rem;
    }
    
    .radio-button__descriptionP&425rem;
    }
    
    .radio-button-container {
    !#>2radio-button {
      width: 28px;
      height: 28Sradio-button__circle {
      width: 28px;
      height: 28px;
      border-width: 2radio-button__inner-circle {
      width: 12px;
      height: 12px;
      top: 50%;
      left: 50%;
    }
    
    .radio-button/ 075rem;
    }
    
    .radio-button__descriptionP	35rem;
    }
    
    .radio-button-container {
    !#md@#primary {
    .radio-button__circle	'Wnradio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle	@/}
    
    .radio-button__inner-circle--selecte,	%secondary {
    .radio-button__circle	'
nradio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle	3
$.radio-button__inner-circle--selecte,	secondary	*.radio-button__circle	'Wnradio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle	'J$.radio-button__inner-circle--selecte.L	
]radio-button__circle	'Wnradio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle	'O$.radio-button__inner-circle--selecte,O
!anger {
    .radio-button__circle	'Wnradio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle	'`$.radio-button__inner-circle--selecte,`F\DgAradio-button__circle	'	disabled;1@/}
    
    .radio-button__inner-circle--selecte,  
    .radio-button'!  
    .radio-button__descriptionA!error {
    .radio-button__circle	'`.radio-buttonA%focused {
    .radio-button__circle {2primary, 0.2)_`RADIO BUTTON[radio-button-container {0K%@C:not(.radio-button-wrapper--disabled &) {
    .radio-button__circle	'c\RADIO BUTTON
N&
.radio-button {
  position: relative;3/'#}

.radio-button__input {
  position: absolute;
  opacity: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  cursor: pointer;
  U
  &:focus {
    outline: none;
  }
}

.radio-button__circle {
  position: relative;
 
)full;
  border	.r
*primary(Obox-sizing: border-box;
}

.radio-button__inner-circle {
  position: absolute;
 
)?full;
  opacity: 0;
  transform: translate(-50%, -50%) scale(0)(N
  &--selected {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1)ZCONTENT AREA
N"
.radio-button-content {
  flex: 1A'min-width: 0;
}

.radio-button__label {?Q]%margin: 0;
`}

.radio-button__description {p'*
margin: 0;*!Jc*T)oradio-button*calc(24px + #{1sm}); // Align with label text
  
  .radio-button"#calc(20px + #{});
  }
  
  .radio-buttoni##calc(28px + #{ md});
  }
}

.radio-button__erro*|`
padding-left: calc(24px + #{1sm}); // Align with label text
  
  .radio-button"#calc(20px + #{});
  }
  
  .radio-buttoni##calc(28px + #{md})Z-radio-button-radio-button {
        width: 24px;
        height: 24px;
      }
      
      .radio-button__circle {
        width: 24px;
        height: 24px;
      }
      
      .radio-button__inner-circle {
        width: 10px;
        height: 10px;
        top: 5@0%;
        left: 50%;
      }
      
      .radio-button__label.")}
      
      .radio-button__description.&~.<radio-button__input:focus-visible + .radio-button__circle {
P	focus;
  outline: none;/Gradio-button__circleA09  
  .radio-button-wrapper--checked .radio-button__circleA0hNradio-button__circle,
  .radio-button__inner-circle,
  .radio-button-container0Rx49igqFbQjniFO Ty !xRbORADIO BUTTONjradio buttonIradio-button[
  Nuradio-button {
      width: 20px;
      height: 20px;
    }
    
    .radio-button__circle {
      width: 20px;
      height: 20px;
      border-width: 1px;
    }
    
    .radio-button__inner-circle {
      width: 8px;
      height: 8px;
      top: 4px;.
      left: 4px;
    }
    
    .radio-button(   line-height: 1.2  radio-button__description/p,	    line-height: 1! !radio-button-container {
      ga radio-button {
      width: 24px;
      height: 24px;
    }
    
    .radio-button__circle {
      width: 24px;
      height: 24px;
  /  }
    
    .radio-button__inner-circle {
      width: 10px;
      height: 10px;
      top: 5px;
      left: 5px;
    }
    
    .radio-button__label line-height: 1.  radio-button__description/   line-height: 1.2  !radio-button-container {
      ga%=lg {
    .radio-button {
      width: 28px;
      height: 28px;
    }
    
    .radio-button__circle {
      width: 28px;
      height: 28px;
  /  }
    
    .radio-button__inner-circle {
      width: 12px;
      height: 12px;
      top: 6px;
      left: 6px;
    }
    
    .radio-button__label {}    line-height: 1. radio-button__description line-height: 1.  !radio-button-container {
      gamdbg#primary {
    .radio-button__circle'PGradio-button-wrapper--checked .radio-button__circle,
    &.radio-buttonradio-button__circle'0	'.radio-button__inner-circle--selected {!)0	%secondary {
    .radio-button__circle'P	secondaryGradio-button-wrapper--checked .radio-button__circle,
    &.radio-buttonradio-button__circle'0	Asecondary;
    }
    
    .radio-button__inner-circle--selected {!)0		secondaryradio-button__circle'PGradio-button-wrapper--checked .radio-button__circle,
    &.radio-buttonradio-button__circle?'.radio-button__inner-circle--selected {!+=(radio-button__circle'PGradio-button-wrapper--checked .radio-button__circle,
    &.radio-buttonradio-button__circle''.radio-button__inner-circle--selected {!)
"danger {
    .radio-button__circle'PGradio-button-wrapper--checked .radio-button__circle,
    &.radio-buttonradio-button__circle'.  
    .radio-button__inner-circle--selected {!)Aradio-button__circle'Pn&,9|&radio-button__inner-circle--selected {!)radio-button>radio-button__description !error {
    .radio-button__circle'  
    .radio-buttonp'%focused {
    .radio-button__circle {`2primary, 0.2)`RADIO BUTTON CONTAINERO
.radio-button-:C%A:not(.radio-button.radio-button__circle'P	secondary`RADIO BUTTONO
.radio-button {`0~$#}

.radio-button__input,
opacity: 0Qheight: 100%;
  margin: 0?%%$none;
  }
}

.radio-button__circle {`$'full;
,6*primaryz(d}

.radio-button__inner-circle,$%)full;
  opacity: 0;
  transform: scale(0)z(9
  &--selected {
    opacity: 1;
    transform: scale(1);_YCONTENT AREAO$
.radio-button-content {
  flex: 1;
a&:'min-width: 0;
}

.radio-button__label {8Q&>margin: 0;
  line-height: 1.5;
}

.radio-button__description {m*,margin: 0;
  margino" micro-tight;
  line-height: 1.4;A+U)oradio-button*padding-left: calc(24px + #{/}); // Align with label text
  
  .radio-button"#calc(20px + #{xs});
  }
  
  .radio-button#calc(28px + #{ md});
  }
}

.radio-button__erro*|
padding-left: calc(24px + #{/}); // Align with label text
  
  .radio-button"#calc(20px + #{xs});
  }
  
  .radio-button#calc(28px + #{md});_Y-`radio-button-wrapper {
    &--lg {
      .radio-button {
        width: 24px;
        height: 24->radio-button__circle {
        width: 24px;
        height: 24-iradio-button__inner-circle {
        width: 10px;
        height: 10px;
        top: 5px;
        left: 5-radio-button__label {
  .}
      
      .radio-button__description {
  !}_.k<radio-button__input:focus-visible + .radio-button__circle {
@,&	outline: none;/Gradio-button__circle:09  
  .radio-button-wrapper--checked .radio-button__circle:0hlradio-button__circle,
  .radio-button__inner-circle,
  .radio-button-container {
    transition: none;
  }
}xAimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faTimes, faSpinner } from '@fortawesome/free-solid-svg-icons';

export type TextareaSize = 'sm' | 'md' | 'lg';
export type TextareaVariant = 'outlined' | 'filled' | 'underlined';
export type TextareaState = 'default' | 'error' | 'success' | 'warning';
export type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';

@Component({
  selector: 'ui-textarea',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, FontAwesomeModule],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => TextareaComponent),
      multi: true
    }
  ],
  template: `
    <div class="textarea-wrapper" [class]="getWrapperClasses()">
      <!-- Label -->
      @if (label) {
        <label 
          class="textarea__label"
          [for]="textareaId"
          [class.textarea__label--required]="required"
        >
          {{ label }}
          @if (required) {
            <span class="textarea__required-indicator">*</span>
          }
        </label>
      }
      
      <!-- Textarea Container -->
      <div class="textarea__container" [class]="getContainerClasses()">
        <!-- Prefix Icon -->
        @if (prefixIcon) {
          <div class="textarea__prefix-icon">
            <fa-icon [icon]="prefixIcon"></fa-icon>
          </div>
        }
        
        <!-- Textarea Field -->
        <textarea
          [id]="textareaId"
          class="textarea__field"
          [placeholder]="placeholder"
          [disabled]="disabled"
          [readonly]="readonly"
          [required]="required"
          [rows]="rows"
          [cols]="cols"
          [attr.maxlength]="maxLength"
          [value]="value"
          (input)="onInput($event)"
          (focus)="onFocus($event)"
          (blur)="onBlur($event)"
          (keydown)="onKeyDown($event)"
        ></textarea>
        
        <!-- Suffix Content -->
        <div class="textarea__suffix" [class.textarea__suffix--has-content]="hasSuffixContent()">
          <!-- Clear Button -->
          @if (clearable && value && !disabled) {
            <button
              type="button"
              class="textarea__clear-btn"
              (click)="clearValue()"
              [attr.aria-label]="'Clear ' + (label || 'textarea')"
            >
              <fa-icon [icon]="faTimes"></fa-icon>
            </button>
          }
          
          <!-- Loading Spinner -->
          @if (loading) {
            <div class="textarea__spinner">
              <fa-icon [icon]="faSpinner" [animation]="'spin'"></fa-icon>
            </div>
          }
          
          <!-- Custom Suffix -->
          @if (suffixIcon) {
            <div class="textarea__suffix-icon">
              <fa-icon [icon]="suffixIcon"></fa-icon>
            </div>
          }
        </div>
      </div>
      
      <!-- Helper Text / Error Message -->
      @if (helperText || errorMessage) {
        <div class="textarea__helper-text" [class]="getHelperTextClasses()">
          {{ state === 'error' ? errorMessage : helperText }}
        </div>
      }
      
      <!-- Character Counter -->
      @if (maxLength && showCharacterCount) {
        <div class="textarea__char-counter">
          {{ value.length }}/{{ maxLength }}
        </div>
      }
    </div>
  `,
  styleUrls: ['./textarea.component.scss']
})
export class TextareaComponent implements ControlValueAccessor {
  @Input() label: string = '';
  @Input() placeholder: string = '';
  @Input() size: TextareaSize = 'md';
  @Input() variant: TextareaVariant = 'outlined';
  @Input() state: TextareaState = 'default';
  @Input() disabled = false;
  @Input() readonly = false;
  @Input() required = false;
  @Input() loading = false;
  @Input() clearable = false;
  @Input() prefixIcon: IconDefinition | null = null;
  @Input() suffixIcon: IconDefinition | null = null;
  @Input() helperText: string = '';
  @Input() errorMessage: string = '';
  @Input() maxLength: number | null = null;
  @Input() showCharacterCount = false;
  @Input() rows: number = 4;
  @Input() cols: number | null = null;
  @Input() resize: TextareaResize = 'vertical';
  @Input() autoResize = false;
  @Input() textareaId: string = `textarea-${Math.random().toString(36).substr(2, 9)}`;

  @Output() textareaChange = new EventEmitter<string>();
  @Output() textareaFocus = new EventEmitter<FocusEvent>();
  @Output() textareaBlur = new EventEmitter<FocusEvent>();
  @Output() keyDown = new EventEmitter<KeyboardEvent>();
  @Output() clear = new EventEmitter<void>();

  value = '';
  focused = false;

  // FontAwesome icons
  readonly faTimes = faTimes;
  readonly faSpinner = faSpinner;

  // ControlValueAccessor implementation
  private onChange = (value: string) => {};
  private onTouched = () => {};

  writeValue(value: string): void {
    this.value = value || '';
  }

  registerOnChange(fn: (value: string) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  getWrapperClasses(): string {
    const classes = [
      `textarea-wrapper--${this.size}`,
      `textarea-wrapper--${this.variant}`,
      `textarea-wrapper--${this.state}`,
      `textarea-wrapper--resize-${this.resize}`
    ];

    if (this.disabled) classes.push('textarea-wrapper--disabled');
    if (this.focused) classes.push('textarea-wrapper--focused');
    if (this.readonly) classes.push('textarea-wrapper--readonly');
    if (this.loading) classes.push('textarea-wrapper--loading');
    if (this.autoResize) classes.push('textarea-wrapper--auto-resize');

    return classes.join(' ');
  }

  getContainerClasses(): string {
    const classes: string[] = [];

    if (this.prefixIcon) classes.push('textarea__container--has-prefix');
    if (this.hasSuffixContent()) classes.push('textarea__container--has-suffix');

    return classes.join(' ');
  }

  getHelperTextClasses(): string {
    const classes = [`textarea__helper-text--${this.state}`];
    return classes.join(' ');
  }

  hasSuffixContent(): boolean {
    return !!(
      this.clearable ||
      this.loading ||
      this.suffixIcon
    );
  }

  onInput(event: Event): void {
    const target = event.target as HTMLTextAreaElement;
    this.value = target.value;
    
    if (this.autoResize) {
      this.adjustHeight(target);
    }
    
    this.onChange(this.value);
    this.textareaChange.emit(this.value);
  }

  onFocus(event: FocusEvent): void {
    this.focused = true;
    this.textareaFocus.emit(event);
  }

  onBlur(event: FocusEvent): void {
    this.focused = false;
    this.onTouched();
    this.textareaBlur.emit(event);
  }

  onKeyDown(event: KeyboardEvent): void {
    this.keyDown.emit(event);
  }

  clearValue(): void {
    this.value = '';
    this.onChange(this.value);
    this.textareaChange.emit(this.value);
    this.clear.emit();
  }

  private adjustHeight(textarea: HTMLTextAreaElement): void {
    textarea.style.height = 'auto';
    textarea.style.height = textarea.scrollHeight + 'px';
  }
}%<Wx9 GY:"[WF ,6V_c2d5Nd!x Gɧ_v]E?ߑ[FxR export * from './radio-button.component';
export * from './radio-group.component';ڵx(@use "../../../../../../shared-ui/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// RADIO BUTTON COMPONENT
// ==========================================================================
// Comprehensive radio button component with multiple variants and sizes
// Uses semantic design tokens for consistent styling across the design system
// ==========================================================================

.radio-button-wrapper {
  display: flex;
  flex-direction: column;
  width: 100%;
  position: relative;

  // ==========================================================================
  // SIZE VARIANTS
  // ==========================================================================
  
  &--sm {
    .radio-button {
      width: 20px;
      height: 20px;
    }
    
    .radio-button__circle {
      width: 20px;
      height: 20px;
      border-width: 1px;
    }
    
    .radio-button__inner-circle {
      width: 8px;
      height: 8px;
      top: 50%;
      left: 50%;
    }
    
    .radio-button__label {
      font-size: 0.875rem;
      line-height: 1.25rem;
    }
    
    .radio-button__description {
      font-size: 0.75rem;
      line-height: 1rem;
    }
    
    .radio-button-container {
      gap: $semantic-spacing-component-xs;
    }
  }
  
  &--md {
    .radio-button {
      width: 24px;
      height: 24px;
    }
    
    .radio-button__circle {
      width: 24px;
      height: 24px;
      border-width: 2px;
    }
    
    .radio-button__inner-circle {
      width: 10px;
      height: 10px;
      top: 50%;
      left: 50%;
    }
    
    .radio-button__label {
      font-size: 1rem;
      line-height: 1.5rem;
    }
    
    .radio-button__description {
      font-size: 0.875rem;
      line-height: 1.25rem;
    }
    
    .radio-button-container {
      gap: $semantic-spacing-component-sm;
    }
  }
  
  &--lg {
    .radio-button {
      width: 28px;
      height: 28px;
    }
    
    .radio-button__circle {
      width: 28px;
      height: 28px;
      border-width: 2px;
    }
    
    .radio-button__inner-circle {
      width: 12px;
      height: 12px;
      top: 50%;
      left: 50%;
    }
    
    .radio-button__label {
      font-size: 1.125rem;
      line-height: 1.75rem;
    }
    
    .radio-button__description {
      font-size: 1rem;
      line-height: 1.5rem;
    }
    
    .radio-button-container {
      gap: $semantic-spacing-component-md;
    }
  }

  // ==========================================================================
  // VARIANT STYLES
  // ==========================================================================
  
  &--primary {
    .radio-button__circle {
      border-color: $semantic-color-border-primary;
    }
    
    &.radio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle {
      border-color: $semantic-color-interactive-primary;
    }
    
    .radio-button__inner-circle--selected {
      background-color: $semantic-color-interactive-primary;
    }
  }
  
  &--secondary {
    .radio-button__circle {
      border-color: $semantic-color-border-secondary;
    }
    
    &.radio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle {
      border-color: $semantic-color-interactive-secondary;
    }
    
    .radio-button__inner-circle--selected {
      background-color: $semantic-color-interactive-secondary;
    }
  }
  
  &--success {
    .radio-button__circle {
      border-color: $semantic-color-border-primary;
    }
    
    &.radio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle {
      border-color: $semantic-color-success;
    }
    
    .radio-button__inner-circle--selected {
      background-color: $semantic-color-success;
    }
  }
  
  &--warning {
    .radio-button__circle {
      border-color: $semantic-color-border-primary;
    }
    
    &.radio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle {
      border-color: $semantic-color-warning;
    }
    
    .radio-button__inner-circle--selected {
      background-color: $semantic-color-warning;
    }
  }
  
  &--danger {
    .radio-button__circle {
      border-color: $semantic-color-border-primary;
    }
    
    &.radio-button-wrapper--checked .radio-button__circle,
    &.radio-button-wrapper--focused .radio-button__circle {
      border-color: $semantic-color-danger;
    }
    
    .radio-button__inner-circle--selected {
      background-color: $semantic-color-danger;
    }
  }

  // ==========================================================================
  // STATE VARIANTS
  // ==========================================================================
  
  &--disabled {
    opacity: 0.6;
    pointer-events: none;
    
    .radio-button__circle {
      border-color: $semantic-color-border-disabled;
      background-color: $semantic-color-surface-disabled;
    }
    
    .radio-button__inner-circle--selected {
      background-color: $semantic-color-text-disabled;
    }
    
    .radio-button__label {
      color: $semantic-color-text-disabled;
    }
    
    .radio-button__description {
      color: $semantic-color-text-disabled;
    }
  }
  
  &--error {
    .radio-button__circle {
      border-color: $semantic-color-danger;
    }
    
    .radio-button__label {
      color: $semantic-color-danger;
    }
  }
  
  &--focused {
    .radio-button__circle {
      box-shadow: 0 0 0 2px rgba($semantic-color-primary, 0.2);
    }
  }
}

// ==========================================================================
// RADIO BUTTON CONTAINER
// ==========================================================================

.radio-button-container {
  display: flex;
  align-items: flex-start;
  cursor: pointer;
  transition: all 0.2s ease-in-out;
  
  &:hover:not(.radio-button-wrapper--disabled &) {
    .radio-button__circle {
      border-color: $semantic-color-border-secondary;
    }
  }
}

// ==========================================================================
// RADIO BUTTON
// ==========================================================================

.radio-button {
  position: relative;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}

.radio-button__input {
  position: absolute;
  opacity: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  cursor: pointer;
  
  &:focus {
    outline: none;
  }
}

.radio-button__circle {
  position: relative;
  border-radius: $semantic-border-radius-full;
  border: 2px solid $semantic-color-border-primary;
  background-color: $semantic-color-surface-primary;
  transition: all 0.2s ease-in-out;
  box-sizing: border-box;
}

.radio-button__inner-circle {
  position: absolute;
  border-radius: $semantic-border-radius-full;
  opacity: 0;
  transform: translate(-50%, -50%) scale(0);
  transition: all 0.2s ease-in-out;
  
  &--selected {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1);
  }
}

// ==========================================================================
// CONTENT AREA
// ==========================================================================

.radio-button-content {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.radio-button__label {
  font-weight: 500;
  color: $semantic-color-text-primary;
  cursor: pointer;
  transition: color 0.2s ease-in-out;
  margin: 0;
  line-height: 1.5;
}

.radio-button__description {
  color: $semantic-color-text-secondary;
  margin: 0;
  margin-top: $semantic-spacing-micro-tight;
  line-height: 1.4;
}

// ==========================================================================
// HELPER TEXT AND ERROR MESSAGES
// ==========================================================================

.radio-button__helper-text {
  margin-top: $semantic-spacing-component-xs;
  font-size: 0.8125rem;
  line-height: 1.4;
  color: $semantic-color-text-secondary;
  padding-left: calc(24px + #{$semantic-spacing-component-sm}); // Align with label text
  
  .radio-button-wrapper--sm & {
    padding-left: calc(20px + #{$semantic-spacing-component-xs});
  }
  
  .radio-button-wrapper--lg & {
    padding-left: calc(28px + #{$semantic-spacing-component-md});
  }
}

.radio-button__error-text {
  margin-top: $semantic-spacing-component-xs;
  font-size: 0.8125rem;
  line-height: 1.4;
  color: $semantic-color-danger;
  padding-left: calc(24px + #{$semantic-spacing-component-sm}); // Align with label text
  
  .radio-button-wrapper--sm & {
    padding-left: calc(20px + #{$semantic-spacing-component-xs});
  }
  
  .radio-button-wrapper--lg & {
    padding-left: calc(28px + #{$semantic-spacing-component-md});
  }
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .radio-button-wrapper {
    &--lg {
      .radio-button {
        width: 24px;
        height: 24px;
      }
      
      .radio-button__circle {
        width: 24px;
        height: 24px;
      }
      
      .radio-button__inner-circle {
        width: 10px;
        height: 10px;
        top: 50%;
        left: 50%;
      }
      
      .radio-button__label {
        font-size: 1rem;
      }
      
      .radio-button__description {
        font-size: 0.875rem;
      }
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

.radio-button__input:focus-visible + .radio-button__circle {
  box-shadow: 0 0 0 2px $semantic-color-border-focus;
  outline: none;
}

// High contrast mode support
@media (prefers-contrast: high) {
  .radio-button__circle {
    border-width: 3px;
  }
  
  .radio-button-wrapper--checked .radio-button__circle {
    border-width: 3px;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .radio-button__circle,
  .radio-button__inner-circle,
  .radio-button-container {
    transition: none;
  }
}Q2ϸxGimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

export type RadioButtonSize = 'sm' | 'md' | 'lg';
export type RadioButtonVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
export type RadioButtonState = 'default' | 'error' | 'disabled';

export interface RadioButtonData {
  value: string;
  label: string;
  disabled?: boolean;
  description?: string;
}

@Component({
  selector: 'ui-radio-button',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => RadioButtonComponent),
      multi: true
    }
  ],
  template: `
    <div class="radio-button-wrapper" [class]="getWrapperClasses()">
      <label class="radio-button-container" [for]="radioId">
        <div class="radio-button" [class]="getRadioClasses()">
          <input
            type="radio"
            class="radio-button__input"
            [id]="radioId"
            [name]="name"
            [value]="value"
            [checked]="isChecked()"
            [disabled]="disabled"
            [required]="required"
            (change)="onSelectionChange($event)"
            (focus)="onFocus($event)"
            (blur)="onBlur($event)"
          />
          <div class="radio-button__circle">
            <div class="radio-button__inner-circle" [class.radio-button__inner-circle--selected]="isChecked()"></div>
          </div>
        </div>
        
        <div class="radio-button-content" [class]="getContentClasses()">
          <div class="radio-button__label">{{ label }}</div>
          @if (description) {
            <div class="radio-button__description">{{ description }}</div>
          }
        </div>
      </label>
      
      @if (helperText && !error) {
        <div class="radio-button__helper-text">{{ helperText }}</div>
      }
      
      @if (error) {
        <div class="radio-button__error-text">{{ error }}</div>
      }
    </div>
  `,
  styleUrls: ['./radio-button.component.scss']
})
export class RadioButtonComponent implements ControlValueAccessor {
  @Input() value: string = '';
  @Input() label: string = '';
  @Input() name: string = '';
  @Input() size: RadioButtonSize = 'md';
  @Input() variant: RadioButtonVariant = 'primary';
  @Input() state: RadioButtonState = 'default';
  @Input() disabled = false;
  @Input() required = false;
  @Input() description: string = '';
  @Input() helperText: string = '';
  @Input() error: string = '';
  @Input() radioId: string = `radio-${Math.random().toString(36).substr(2, 9)}`;

  @Output() selectionChange = new EventEmitter<string>();
  @Output() radioFocus = new EventEmitter<FocusEvent>();
  @Output() radioBlur = new EventEmitter<FocusEvent>();

  private selectedValue = signal<string>('');
  private focused = signal<boolean>(false);

  // ControlValueAccessor implementation
  private onChange = (value: string) => {};
  private onTouched = () => {};

  writeValue(value: string): void {
    this.selectedValue.set(value || '');
  }

  registerOnChange(fn: (value: string) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  isChecked(): boolean {
    return this.selectedValue() === this.value;
  }

  getWrapperClasses(): string {
    const classes = [
      `radio-button-wrapper--${this.size}`,
      `radio-button-wrapper--${this.variant}`,
      `radio-button-wrapper--${this.state}`
    ];

    if (this.disabled) classes.push('radio-button-wrapper--disabled');
    if (this.focused()) classes.push('radio-button-wrapper--focused');
    if (this.isChecked()) classes.push('radio-button-wrapper--checked');
    if (this.error) classes.push('radio-button-wrapper--error');
    if (this.description) classes.push('radio-button-wrapper--has-description');

    return classes.join(' ');
  }

  getRadioClasses(): string {
    const classes: string[] = [];

    if (this.isChecked()) classes.push('radio-button--checked');
    if (this.disabled) classes.push('radio-button--disabled');

    return classes.join(' ');
  }

  getContentClasses(): string {
    const classes: string[] = [];

    if (this.description) classes.push('radio-button-content--has-description');

    return classes.join(' ');
  }

  onSelectionChange(event: Event): void {
    const target = event.target as HTMLInputElement;
    if (target.checked) {
      this.selectedValue.set(this.value);
      this.onChange(this.value);
      this.selectionChange.emit(this.value);
    }
  }

  onFocus(event: FocusEvent): void {
    this.focused.set(true);
    this.radioFocus.emit(event);
  }

  onBlur(event: FocusEvent): void {
    this.focused.set(false);
    this.onTouched();
    this.radioBlur.emit(event);
  }
}0J濎x@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// RADIO GROUP COMPONENT
// ==========================================================================
// Container component for managing groups of radio buttons
// Uses semantic design tokens for consistent styling across the design system
// ==========================================================================

.radio-group-wrapper {
  display: flex;
  flex-direction: column;
  width: 100%;
  position: relative;

  // ==========================================================================
  // SIZE VARIANTS
  // ==========================================================================
  
  &--sm {
    .radio-group__label {
      font-size: 0.875rem;
      margin-bottom: $semantic-spacing-component-xs;
    }
    
    .radio-group {
      gap: $semantic-spacing-component-xs;
    }
    
    &.radio-group-wrapper--horizontal .radio-group {
      gap: $semantic-spacing-component-sm;
    }
  }
  
  &--md {
    .radio-group__label {
      font-size: 1rem;
      margin-bottom: $semantic-spacing-component-sm;
    }
    
    .radio-group {
      gap: $semantic-spacing-component-sm;
    }
    
    &.radio-group-wrapper--horizontal .radio-group {
      gap: $semantic-spacing-component-md;
    }
  }
  
  &--lg {
    .radio-group__label {
      font-size: 1.125rem;
      margin-bottom: $semantic-spacing-component-sm;
    }
    
    .radio-group {
      gap: $semantic-spacing-component-sm;
    }
    
    &.radio-group-wrapper--horizontal .radio-group {
      gap: $semantic-spacing-component-lg;
    }
  }

  // ==========================================================================
  // VARIANT STYLES
  // ==========================================================================
  
  &--primary {
    .radio-group__label {
      color: $semantic-color-text-primary;
    }
  }
  
  &--secondary {
    .radio-group__label {
      color: $semantic-color-text-primary;
    }
  }
  
  &--success {
    .radio-group__label {
      color: $semantic-color-text-primary;
    }
    
    &.radio-group-wrapper--error .radio-group__label {
      color: $semantic-color-success;
    }
  }
  
  &--warning {
    .radio-group__label {
      color: $semantic-color-text-primary;
    }
    
    &.radio-group-wrapper--error .radio-group__label {
      color: $semantic-color-warning;
    }
  }
  
  &--danger {
    .radio-group__label {
      color: $semantic-color-text-primary;
    }
    
    &.radio-group-wrapper--error .radio-group__label {
      color: $semantic-color-danger;
    }
  }

  // ==========================================================================
  // ORIENTATION VARIANTS
  // ==========================================================================
  
  &--horizontal {
    .radio-group {
      flex-direction: row;
      flex-wrap: wrap;
      align-items: flex-start;
    }
  }
  
  &--vertical {
    .radio-group {
      flex-direction: column;
    }
  }

  // ==========================================================================
  // STATE VARIANTS
  // ==========================================================================
  
  &--disabled {
    opacity: 0.6;
    pointer-events: none;
    
    .radio-group__label {
      color: $semantic-color-text-disabled;
    }
  }
  
  &--error {
    .radio-group__label {
      color: $semantic-color-danger;
    }
  }
  
  &--dense {
    .radio-group {
      gap: $semantic-spacing-component-xs;
    }
    
    &.radio-group-wrapper--horizontal .radio-group {
      gap: $semantic-spacing-component-sm;
    }
    
    .radio-group__label {
      margin-bottom: $semantic-spacing-component-xs;
    }
  }
}

// ==========================================================================
// RADIO GROUP LABEL
// ==========================================================================

.radio-group__label {
  display: block;
  font-weight: 600;
  color: $semantic-color-text-primary;
  line-height: 1.5;
  user-select: none;
  
  &--required {
    .radio-group__required-indicator {
      color: $semantic-color-danger;
      margin-left: $semantic-spacing-micro-tight;
      font-weight: 400;
    }
  }
}

// ==========================================================================
// RADIO GROUP CONTAINER
// ==========================================================================

.radio-group {
  display: flex;
  flex-direction: column;
  position: relative;
  
  &--vertical {
    align-items: flex-start;
  }
  
  &--horizontal {
    flex-direction: row;
    flex-wrap: wrap;
    align-items: flex-start;
  }
  
  &--dense {
    gap: $semantic-spacing-component-xs;
  }
}

// ==========================================================================
// HELPER TEXT AND ERROR MESSAGES
// ==========================================================================

.radio-group__helper-text {
  margin-top: $semantic-spacing-component-sm;
  font-size: 0.8125rem;
  line-height: 1.4;
  color: $semantic-color-text-secondary;
}

.radio-group__error-text {
  margin-top: $semantic-spacing-component-sm;
  font-size: 0.8125rem;
  line-height: 1.4;
  color: $semantic-color-danger;
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .radio-group-wrapper {
    &--horizontal {
      .radio-group {
        flex-direction: column;
        gap: $semantic-spacing-component-sm;
      }
    }
    
    &--lg {
      .radio-group__label {
        font-size: 1rem;
      }
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

.radio-group[role="radiogroup"]:focus-within {
  // Focus styles are handled by individual radio buttons
}

// High contrast mode support
@media (prefers-contrast: high) {
  .radio-group__label {
    font-weight: 700;
  }
  
  .radio-group-wrapper--error .radio-group__label {
    text-decoration: underline;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .radio-group__label {
    transition: none;
  }
}x8}x{opgqFbQjniF Y%xHimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, ContentChildren, QueryList, AfterContentInit, OnDestroy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { Subject, takeUntil } from 'rxjs';
import { RadioButtonComponent, RadioButtonSize, RadioButtonVariant, RadioButtonState, RadioButtonData } from './radio-button.component';

export type RadioGroupOrientation = 'horizontal' | 'vertical';

@Component({
  selector: 'ui-radio-group',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, RadioButtonComponent],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => RadioGroupComponent),
      multi: true
    }
  ],
  template: `
    <div class="radio-group-wrapper" [class]="getWrapperClasses()">
      @if (label) {
        <div class="radio-group__label" [class.radio-group__label--required]="required">
          {{ label }}
          @if (required) {
            <span class="radio-group__required-indicator">*</span>
          }
        </div>
      }
      
      <div class="radio-group" [class]="getGroupClasses()" role="radiogroup" [attr.aria-labelledby]="label ? groupId + '-label' : null">
        @if (options && options.length > 0) {
          @for (option of options; track option.value) {
            <ui-radio-button
              [value]="option.value"
              [label]="option.label"
              [description]="option.description || ''"
              [name]="name || groupId"
              [size]="size"
              [variant]="variant"
              [disabled]="disabled || (option.disabled ?? false)"
              [radioId]="groupId + '-' + option.value"
              (selectionChange)="onSelectionChange($event)"
              (radioFocus)="onRadioFocus($event)"
              (radioBlur)="onRadioBlur($event)"
            />
          }
        } @else {
          <ng-content></ng-content>
        }
      </div>
      
      @if (helperText && !errorMessage) {
        <div class="radio-group__helper-text">{{ helperText }}</div>
      }
      
      @if (errorMessage) {
        <div class="radio-group__error-text">{{ errorMessage }}</div>
      }
    </div>
  `,
  styleUrls: ['./radio-group.component.scss']
})
export class RadioGroupComponent implements ControlValueAccessor, AfterContentInit, OnDestroy {
  @ContentChildren(RadioButtonComponent) radioButtons!: QueryList<RadioButtonComponent>;

  @Input() options: RadioButtonData[] = [];
  @Input() label: string = '';
  @Input() name: string = '';
  @Input() size: RadioButtonSize = 'md';
  @Input() variant: RadioButtonVariant = 'primary';
  @Input() state: RadioButtonState = 'default';
  @Input() orientation: RadioGroupOrientation = 'vertical';
  @Input() disabled = false;
  @Input() required = false;
  @Input() helperText: string = '';
  @Input() errorMessage: string = '';
  @Input() dense = false;
  @Input() groupId: string = `radio-group-${Math.random().toString(36).substr(2, 9)}`;

  @Output() selectionChange = new EventEmitter<string>();
  @Output() groupFocus = new EventEmitter<FocusEvent>();
  @Output() groupBlur = new EventEmitter<FocusEvent>();

  private selectedValue = signal<string>('');
  private destroy$ = new Subject<void>();

  // ControlValueAccessor implementation
  private onChange = (value: string) => {};
  private onTouched = () => {};

  ngAfterContentInit(): void {
    this.syncRadioButtons();
    
    // Listen for changes in radio buttons
    this.radioButtons.changes.pipe(takeUntil(this.destroy$)).subscribe(() => {
      this.syncRadioButtons();
    });
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  writeValue(value: string): void {
    this.selectedValue.set(value || '');
    this.syncRadioButtons();
  }

  registerOnChange(fn: (value: string) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
    this.syncRadioButtons();
  }

  private syncRadioButtons(): void {
    if (this.radioButtons) {
      this.radioButtons.forEach(radio => {
        radio.name = this.name || this.groupId;
        radio.size = this.size;
        radio.variant = this.variant;
        radio.state = this.state;
        radio.writeValue(this.selectedValue());
        radio.setDisabledState(this.disabled);
        radio.registerOnChange(this.onChange);
        radio.registerOnTouched(this.onTouched);
      });
    }
  }

  getWrapperClasses(): string {
    const classes = [
      `radio-group-wrapper--${this.size}`,
      `radio-group-wrapper--${this.variant}`,
      `radio-group-wrapper--${this.state}`,
      `radio-group-wrapper--${this.orientation}`
    ];

    if (this.disabled) classes.push('radio-group-wrapper--disabled');
    if (this.dense) classes.push('radio-group-wrapper--dense');
    if (this.errorMessage) classes.push('radio-group-wrapper--error');

    return classes.join(' ');
  }

  getGroupClasses(): string {
    const classes = [
      `radio-group--${this.orientation}`
    ];

    if (this.dense) classes.push('radio-group--dense');

    return classes.join(' ');
  }

  onSelectionChange(value: string): void {
    this.selectedValue.set(value);
    this.onChange(value);
    this.selectionChange.emit(value);
    this.syncRadioButtons();
  }

  onRadioFocus(event: FocusEvent): void {
    this.groupFocus.emit(event);
  }

  onRadioBlur(event: FocusEvent): void {
    this.onTouched();
    this.groupBlur.emit(event);
  }
}Xx G-Bc,QfiJ9n*[5x) export * from './range-slider.component';-$xg.import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal, computed, ViewChild, ElementRef, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

export type RangeSliderSize = 'sm' | 'md' | 'lg';
export type RangeSliderVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
export type RangeSliderOrientation = 'horizontal' | 'vertical';

export interface RangeSliderTickMark {
  value: number;
  label?: string;
  major?: boolean;
}

@Component({
  selector: 'ui-range-slider',
  standalone: true,
  imports: [CommonModule, FormsModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => RangeSliderComponent),
      multi: true
    }
  ],
  template: `
    <div 
      class="ui-range-slider"
      [class]="containerClasses()"
      [attr.aria-label]="ariaLabel || label || 'Range slider'"
      [attr.aria-disabled]="disabled">
      
      @if (label || showValue) {
        <div class="ui-range-slider__header">
          @if (label) {
            <label 
              class="ui-range-slider__label"
              [class.ui-range-slider__label--disabled]="disabled"
              [for]="sliderId">
              {{ label }}
              @if (required) {
                <span class="ui-range-slider__required">*</span>
              }
            </label>
          }
          
          @if (showValue) {
            <span class="ui-range-slider__value-display">
              {{ formatValue(currentValue()) }}{{ valueUnit }}
            </span>
          }
        </div>
      }
      
      <div class="ui-range-slider__container" #container>
        <!-- Track background -->
        <div class="ui-range-slider__track">
          <!-- Fill/Progress -->
          <div 
            class="ui-range-slider__fill"
            [style.width]="fillWidth() + '%'"
            [style.left]="'0%'">
          </div>
        </div>
        
        <!-- Hidden native input for accessibility and form integration -->
        <input
          #sliderInput
          type="range"
          class="ui-range-slider__input"
          [id]="sliderId"
          [min]="min"
          [max]="max"
          [step]="step"
          [value]="currentValue()"
          [disabled]="disabled"
          [required]="required"
          [attr.aria-label]="ariaLabel || label || 'Range slider'"
          [attr.aria-valuetext]="ariaValueText"
          [attr.aria-orientation]="orientation"
          (input)="onInputChange($event)"
          (focus)="onFocus($event)"
          (blur)="onBlur($event)"
          (keydown)="onKeyDown($event)" />
        
        <!-- Visual thumb -->
        <div 
          class="ui-range-slider__thumb"
          [class.ui-range-slider__thumb--focused]="isFocused()"
          [class.ui-range-slider__thumb--dragging]="isDragging()"
          [style.left]="thumbPosition() + '%'"
          (mousedown)="onThumbMouseDown($event)"
          (touchstart)="onThumbTouchStart($event)">
        </div>
      </div>
      
      @if (ticks && ticks.length > 0) {
        <!-- Tick marks -->
        <div class="ui-range-slider__ticks">
          @for (tick of ticks; track tick.value) {
            <div 
              class="ui-range-slider__tick"
              [class.ui-range-slider__tick--major]="tick.major"
              [style.left]="getTickPosition(tick.value) + '%'">
            </div>
          }
        </div>
        
        <!-- Tick labels -->
        @if (showTickLabels) {
          <div class="ui-range-slider__tick-labels">
            @for (tick of ticks; track tick.value) {
              @if (tick.label) {
                <div 
                  class="ui-range-slider__tick-label"
                  [style.left]="getTickPosition(tick.value) + '%'">
                  {{ tick.label }}
                </div>
              }
            }
          </div>
        }
      }
      
      @if (helperText && !disabled) {
        <div 
          class="ui-range-slider__helper-text"
          [class.ui-range-slider__helper-text--error]="hasError"
          [id]="sliderId + '-helper'">
          {{ helperText }}
        </div>
      }
    </div>
  `,
  styleUrl: './range-slider.component.scss'
})
export class RangeSliderComponent implements ControlValueAccessor {
  @ViewChild('sliderInput', { static: true }) sliderInput!: ElementRef<HTMLInputElement>;
  @ViewChild('container', { static: true }) container!: ElementRef<HTMLDivElement>;

  // Core inputs
  @Input() min = 0;
  @Input() max = 100;
  @Input() step = 1;
  @Input() set value(val: number) {
    if (val !== null && val !== undefined) {
      this._value.set(this.normalizeValue(val));
    }
  }
  get value(): number {
    return this.currentValue();
  }
  @Input() size: RangeSliderSize = 'md';
  @Input() variant: RangeSliderVariant = 'primary';
  @Input() orientation: RangeSliderOrientation = 'horizontal';
  
  // Behavior inputs
  @Input() disabled = false;
  @Input() required = false;
  @Input() readonly = false;
  
  // Display options
  @Input() label = '';
  @Input() showValue = false;
  @Input() valueUnit = '';
  @Input() showTickLabels = false;
  @Input() ticks: RangeSliderTickMark[] = [];
  
  // Validation and help
  @Input() helperText = '';
  @Input() hasError = false;
  @Input() ariaLabel = '';
  @Input() ariaValueText = '';
  @Input() sliderId = `range-slider-${Math.random().toString(36).substr(2, 9)}`;

  // Outputs
  @Output() valueChange = new EventEmitter<number>();
  @Output() sliderFocus = new EventEmitter<FocusEvent>();
  @Output() sliderBlur = new EventEmitter<FocusEvent>();
  @Output() slideStart = new EventEmitter<number>();
  @Output() slideEnd = new EventEmitter<number>();

  // Internal state
  private _value = signal(0);
  currentValue = this._value.asReadonly();
  
  private _isFocused = signal(false);
  isFocused = this._isFocused.asReadonly();
  
  private _isDragging = signal(false);
  isDragging = this._isDragging.asReadonly();

  // Computed properties
  fillWidth = computed(() => {
    const range = this.max - this.min;
    const progress = (this.currentValue() - this.min) / range;
    return Math.max(0, Math.min(100, progress * 100));
  });

  thumbPosition = computed(() => {
    return this.fillWidth();
  });

  containerClasses = computed(() => {
    const classes = [
      `ui-range-slider--${this.size}`,
      `ui-range-slider--${this.variant}`,
      `ui-range-slider--${this.orientation}`
    ];

    if (this.disabled) classes.push('ui-range-slider--disabled');
    if (this.hasError) classes.push('ui-range-slider--error');
    if (this.readonly) classes.push('ui-range-slider--readonly');

    return classes.join(' ');
  });

  // ControlValueAccessor implementation
  private onChange = (value: number) => {};
  private onTouched = () => {};

  writeValue(value: number): void {
    if (value !== null && value !== undefined) {
      this._value.set(this.normalizeValue(value));
    }
  }

  registerOnChange(fn: (value: number) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  // Event handlers
  onInputChange(event: Event): void {
    const target = event.target as HTMLInputElement;
    const newValue = this.normalizeValue(parseFloat(target.value));
    this.updateValue(newValue);
  }

  onFocus(event: FocusEvent): void {
    this._isFocused.set(true);
    this.sliderFocus.emit(event);
  }

  onBlur(event: FocusEvent): void {
    this._isFocused.set(false);
    this.onTouched();
    this.sliderBlur.emit(event);
  }

  onKeyDown(event: KeyboardEvent): void {
    if (this.disabled || this.readonly) return;

    let delta = 0;
    const largeStep = (this.max - this.min) * 0.1;

    switch (event.key) {
      case 'ArrowRight':
      case 'ArrowUp':
        delta = this.step;
        break;
      case 'ArrowLeft':
      case 'ArrowDown':
        delta = -this.step;
        break;
      case 'PageUp':
        delta = largeStep;
        break;
      case 'PageDown':
        delta = -largeStep;
        break;
      case 'Home':
        this.updateValue(this.min);
        event.preventDefault();
        return;
      case 'End':
        this.updateValue(this.max);
        event.preventDefault();
        return;
      default:
        return;
    }

    event.preventDefault();
    const newValue = this.normalizeValue(this.currentValue() + delta);
    this.updateValue(newValue);
  }

  onThumbMouseDown(event: MouseEvent): void {
    if (this.disabled || this.readonly) return;
    
    event.preventDefault();
    this._isDragging.set(true);
    this.slideStart.emit(this.currentValue());
    
    const handleMouseMove = (e: MouseEvent) => {
      this.updateValueFromPosition(e.clientX);
    };
    
    const handleMouseUp = () => {
      this._isDragging.set(false);
      this.slideEnd.emit(this.currentValue());
      document.removeEventListener('mousemove', handleMouseMove);
      document.removeEventListener('mouseup', handleMouseUp);
    };
    
    document.addEventListener('mousemove', handleMouseMove);
    document.addEventListener('mouseup', handleMouseUp);
  }

  onThumbTouchStart(event: TouchEvent): void {
    if (this.disabled || this.readonly) return;
    
    event.preventDefault();
    this._isDragging.set(true);
    this.slideStart.emit(this.currentValue());
    
    const handleTouchMove = (e: TouchEvent) => {
      if (e.touches.length > 0) {
        this.updateValueFromPosition(e.touches[0].clientX);
      }
    };
    
    const handleTouchEnd = () => {
      this._isDragging.set(false);
      this.slideEnd.emit(this.currentValue());
      document.removeEventListener('touchmove', handleTouchMove);
      document.removeEventListener('touchend', handleTouchEnd);
    };
    
    document.addEventListener('touchmove', handleTouchMove, { passive: false });
    document.addEventListener('touchend', handleTouchEnd);
  }

  // Utility methods
  private updateValue(newValue: number): void {
    const normalizedValue = this.normalizeValue(newValue);
    if (normalizedValue !== this.currentValue()) {
      this._value.set(normalizedValue);
      this.onChange(normalizedValue);
      this.valueChange.emit(normalizedValue);
      
      // Sync with native input
      if (this.sliderInput) {
        this.sliderInput.nativeElement.value = normalizedValue.toString();
      }
    }
  }

  private updateValueFromPosition(clientX: number): void {
    if (!this.container) return;
    
    const rect = this.container.nativeElement.getBoundingClientRect();
    const percentage = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
    const newValue = this.min + (percentage * (this.max - this.min));
    this.updateValue(newValue);
  }

  private normalizeValue(value: number): number {
    // Round to nearest step
    const steppedValue = Math.round((value - this.min) / this.step) * this.step + this.min;
    // Clamp to min/max bounds
    return Math.max(this.min, Math.min(this.max, steppedValue));
  }

  formatValue(value: number): string {
    // Format the value for display (could be overridden for custom formatting)
    return value.toString();
  }

  getTickPosition(tickValue: number): number {
    const range = this.max - this.min;
    return ((tickValue - this.min) / range) * 100;
  }

  // Public API methods
  setValue(value: number): void {
    this.updateValue(value);
  }

  getValue(): number {
    return this.currentValue();
  }

  focus(): void {
    if (this.sliderInput) {
      this.sliderInput.nativeElement.focus();
    }
  }
} KH6x EX	"8,9xMY3dx' export * from './search-bar.component';x/>@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// SEARCH BAR COMPONENT STYLES
// ==========================================================================
// Modern search bar implementation using design tokens
// Follows Material Design 3 principles with semantic token system
// ==========================================================================

.search-bar-wrapper {
  position: relative;
  width: 100%;
  display: flex;
  flex-direction: column;

  // Size variants
  &.search-bar-wrapper--sm {
    .search-bar {
      height: 40px;
    }
  }

  &.search-bar-wrapper--md {
    .search-bar {
      height: 48px;
    }
  }

  &.search-bar-wrapper--lg {
    .search-bar {
      height: 56px;
    }
  }

  // Variant styles
  &.search-bar-wrapper--outlined {
    .search-bar {
      background-color: $semantic-color-surface-primary;
      border: $semantic-border-width-1 solid $semantic-color-border-primary;
      
      &:hover:not(.search-bar--disabled) {
        border-color: $semantic-color-border-focus;
      }
      
      &.search-bar--focused {
        border-color: $semantic-color-brand-primary;
        box-shadow: $semantic-shadow-button-focus;
      }
    }
  }

  &.search-bar-wrapper--filled {
    .search-bar {
      background-color: $semantic-color-surface-secondary;
      border: $semantic-border-width-1 solid transparent;
      
      &:hover:not(.search-bar--disabled) {
        background-color: $semantic-color-surface-secondary;
      }
      
      &.search-bar--focused {
        border-color: $semantic-color-brand-primary;
        box-shadow: $semantic-shadow-button-focus;
      }
    }
  }

  &.search-bar-wrapper--elevated {
    .search-bar {
      background-color: $semantic-color-surface-primary;
      border: none;
      box-shadow: $semantic-shadow-elevation-1;
      
      &:hover:not(.search-bar--disabled) {
        box-shadow: $semantic-shadow-elevation-2;
      }
      
      &.search-bar--focused {
        box-shadow: $semantic-shadow-elevation-3;
      }
    }
  }

  // State variants
  &.search-bar-wrapper--error {
    .search-bar {
      border-color: $semantic-color-danger;
      
      &.search-bar--focused {
        box-shadow: $semantic-shadow-danger;
      }
    }
  }

  &.search-bar-wrapper--disabled {
    opacity: 0.6;
    
    .search-bar {
      background-color: $semantic-color-surface-disabled;
      border-color: $semantic-color-border-disabled;
      cursor: not-allowed;
    }
  }
}

.search-bar {
  display: flex;
  align-items: center;
  border-radius: $semantic-border-radius-3xl;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  position: relative;
  overflow: hidden;

  // Size-specific heights handled by wrapper

  &--disabled {
    pointer-events: none;
  }
}

.search-bar__leading-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  color: $semantic-color-text-secondary;
  flex-shrink: 0;
  
  &--sm {
    width: 40px;
    height: 40px;
    padding-left: $semantic-spacing-component-sm;
    
    fa-icon {
      font-size: $semantic-typography-font-size-lg;
    }
  }
  
  &--md {
    width: 48px;
    height: 48px;
    padding-left: $semantic-spacing-component-md;
    
    fa-icon {
      font-size: $semantic-typography-font-size-2xl;
    }
  }
  
  &--lg {
    width: 56px;
    height: 56px;
    padding-left: $semantic-spacing-component-lg;
    
    fa-icon {
      font-size: $semantic-typography-font-size-lg;
    }
  }
}

.search-bar__input-wrapper {
  flex: 1;
  position: relative;
  height: 100%;
  display: flex;
  align-items: center;
  
  &--sm {
    padding: 0 $semantic-spacing-component-xs;
  }
  
  &--md {
    padding: 0 $semantic-spacing-component-sm;
  }
  
  &--lg {
    padding: 0 $semantic-spacing-component-md;
  }
}

.search-bar__label {
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  color: $semantic-color-text-secondary;
  font-size: $semantic-typography-font-size-md;
  font-weight: $semantic-typography-font-weight-normal;
  pointer-events: none;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  z-index: 1;
  
  &--floating {
    top: 8px;
    font-size: $semantic-typography-font-size-xs;
    color: $semantic-color-brand-primary;
    transform: translateY(0);
  }
  
  .search-bar__required-indicator {
    color: $semantic-color-danger;
    margin-left: 2px;
  }
}

.search-bar__input {
  width: 100%;
  height: 100%;
  border: none;
  background: transparent;
  outline: none;
  color: $semantic-color-text-primary;
  font-size: $semantic-typography-font-size-md;
  font-weight: $semantic-typography-font-weight-normal;
  line-height: $semantic-typography-line-height-normal;
  caret-color: $semantic-color-brand-primary;
  
  &::placeholder {
    color: $semantic-color-text-secondary;
    transition: color $semantic-duration-fast $semantic-easing-standard;
  }
  
  &:focus::placeholder {
    color: transparent;
  }
  
  // Remove default search input styling
  &::-webkit-search-cancel-button,
  &::-webkit-search-decoration {
    -webkit-appearance: none;
  }
  
  // Size variants
  &--sm {
    font-size: $semantic-typography-font-size-sm;
    padding: 0 $semantic-spacing-component-xs;
  }
  
  &--md {
    font-size: $semantic-typography-font-size-md;
    padding: 0 $semantic-spacing-component-sm;
  }
  
  &--lg {
    font-size: $semantic-typography-font-size-lg;
    padding: 0 $semantic-spacing-component-md;
  }
  
  &--has-value {
    font-weight: $semantic-typography-font-weight-medium;
  }
}

.search-bar__trailing-icons {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-xs;
  flex-shrink: 0;
  
  &--sm {
    padding-right: $semantic-spacing-component-sm;
  }
  
  &--md {
    padding-right: $semantic-spacing-component-md;
  }
  
  &--lg {
    padding-right: $semantic-spacing-component-lg;
  }
}

.search-bar__icon-button {
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  background: transparent;
  color: $semantic-color-text-secondary;
  cursor: pointer;
  border-radius: $semantic-border-radius-sm;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  
  &:hover:not(:disabled) {
    background-color: $semantic-color-surface-secondary;
    color: $semantic-color-text-primary;
  }
  
  &:active:not(:disabled) {
    transform: scale(0.95);
  }
  
  &:disabled {
    opacity: 0.5;
    cursor: not-allowed;
  }
  
  // Size variants
  &--sm {
    width: 32px;
    height: 32px;
    
    fa-icon {
      font-size: $semantic-typography-font-size-md;
    }
  }
  
  &--md {
    width: 36px;
    height: 36px;
    
    fa-icon {
      font-size: $semantic-typography-font-size-lg;
    }
  }
  
  &--lg {
    width: 40px;
    height: 40px;
    
    fa-icon {
      font-size: $semantic-typography-font-size-2xl;
    }
  }
}

.search-bar__clear-button {
  color: $semantic-color-text-tertiary;
  
  &:hover:not(:disabled) {
    color: $semantic-color-danger;
    background-color: rgba($semantic-color-danger, 0.1);
  }
}

.search-bar__suggestions {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  background-color: $semantic-color-surface-primary;
  border-radius: $semantic-border-radius-lg;
  box-shadow: $semantic-shadow-elevation-3;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  max-height: 300px;
  overflow-y: auto;
  z-index: 1000;
  margin-top: $semantic-spacing-component-xs;
  
  &--sm {
    margin-top: 4px;
  }
  
  &--md {
    margin-top: 6px;
  }
  
  &--lg {
    margin-top: 8px;
  }
}

.search-bar__suggestion {
  width: 100%;
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-sm;
  padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
  border: none;
  background: transparent;
  color: $semantic-color-text-primary;
  cursor: pointer;
  text-align: left;
  transition: background-color $semantic-duration-fast $semantic-easing-standard;
  
  &:hover,
  &--selected {
    background-color: $semantic-color-surface-secondary;
  }
  
  &:first-child {
    border-top-left-radius: $semantic-border-radius-lg;
    border-top-right-radius: $semantic-border-radius-lg;
  }
  
  &:last-child {
    border-bottom-left-radius: $semantic-border-radius-lg;
    border-bottom-right-radius: $semantic-border-radius-lg;
  }
  
  // Size variants
  &--sm {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    
    .search-bar__suggestion-text {
      font-size: $semantic-typography-font-size-sm;
    }
    
    .search-bar__suggestion-category {
      font-size: $semantic-typography-font-size-xs;
    }
  }
  
  &--md {
    padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    
    .search-bar__suggestion-text {
      font-size: $semantic-typography-font-size-md;
    }
    
    .search-bar__suggestion-category {
      font-size: $semantic-typography-font-size-sm;
    }
  }
  
  &--lg {
    padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
    
    .search-bar__suggestion-text {
      font-size: $semantic-typography-font-size-lg;
    }
    
    .search-bar__suggestion-category {
      font-size: $semantic-typography-font-size-md;
    }
  }
}

.search-bar__suggestion-icon {
  color: $semantic-color-text-secondary;
  flex-shrink: 0;
  width: 20px;
  height: 20px;
}

.search-bar__suggestion-text {
  flex: 1;
  font-weight: $semantic-typography-font-weight-normal;
}

.search-bar__suggestion-category {
  color: $semantic-color-text-tertiary;
  font-weight: $semantic-typography-font-weight-normal;
  flex-shrink: 0;
}

.search-bar__helper-text {
  margin-top: $semantic-spacing-component-xs;
  padding-left: $semantic-spacing-component-md;
  font-size: $semantic-typography-font-size-xs;
  color: $semantic-color-text-secondary;
  line-height: $semantic-typography-line-height-tight;
}

.search-bar__error-text {
  margin-top: $semantic-spacing-component-xs;
  padding-left: $semantic-spacing-component-md;
  font-size: $semantic-typography-font-size-xs;
  color: $semantic-color-danger;
  line-height: $semantic-typography-line-height-tight;
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-xs;
}

// ==========================================================================
// RESPONSIVE DESIGN
// ==========================================================================

@media (max-width: $semantic-breakpoint-md - 1) {
  .search-bar-wrapper {
    // Larger touch targets on mobile
    &.search-bar-wrapper--sm {
      .search-bar {
        height: 44px;
      }
      
      .search-bar__icon-button--sm {
        width: 36px;
        height: 36px;
      }
    }
    
    &.search-bar-wrapper--md {
      .search-bar {
        height: 52px;
      }
      
      .search-bar__icon-button--md {
        width: 40px;
        height: 40px;
      }
    }
  }
  
  .search-bar__suggestions {
    max-height: 250px; // Smaller on mobile
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

// Reduced motion preference
@media (prefers-reduced-motion: reduce) {
  .search-bar,
  .search-bar__label,
  .search-bar__input,
  .search-bar__icon-button,
  .search-bar__suggestion {
    transition: none !important;
    animation: none !important;
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .search-bar-wrapper {
    &.search-bar-wrapper--outlined,
    &.search-bar-wrapper--filled {
      .search-bar {
        border-width: $semantic-border-width-2;
      }
    }
  }
  
  .search-bar__suggestions {
    border-width: $semantic-border-width-2;
  }
}

// Focus visible for keyboard navigation
.search-bar__icon-button:focus-visible {
  outline: $semantic-border-width-2 solid $semantic-color-brand-primary;
  outline-offset: 2px;
}

.search-bar__suggestion:focus-visible {
  outline: $semantic-border-width-2 solid $semantic-color-brand-primary;
  outline-offset: -2px;
}2>Ox;+~gqFbQjniF Y$x2(import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal, ElementRef, ViewChild } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faSearch, faTimes, faMicrophone, faCamera, faFilter } from '@fortawesome/free-solid-svg-icons';

export type SearchBarSize = 'sm' | 'md' | 'lg';
export type SearchBarVariant = 'filled' | 'outlined' | 'elevated';
export type SearchBarState = 'default' | 'error' | 'disabled';

export interface SearchSuggestion {
  id: string;
  text: string;
  category?: string;
  icon?: IconDefinition;
}

@Component({
  selector: 'ui-search-bar',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, FormsModule, FontAwesomeModule],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => SearchBarComponent),
      multi: true
    }
  ],
  template: `
    <div class="search-bar-wrapper" [class]="getWrapperClasses()">
      <div class="search-bar" [class]="getSearchBarClasses()" role="combobox" [attr.aria-expanded]="showSuggestions()" [attr.aria-haspopup]="true">
        
        @if (leadingIcon) {
          <div class="search-bar__leading-icon" [class]="getLeadingIconClasses()">
            <fa-icon [icon]="leadingIcon" [attr.aria-label]="leadingIconLabel || 'Search'"></fa-icon>
          </div>
        }

        <div class="search-bar__input-wrapper" [class]="getInputWrapperClasses()">
          @if (label && size !== 'sm') {
            <label class="search-bar__label" [for]="searchId" [class.search-bar__label--floating]="hasValue() || isFocused()">
              {{ label }}
              @if (required) {
                <span class="search-bar__required-indicator">*</span>
              }
            </label>
          }
          
          <input
            #searchInput
            type="search"
            class="search-bar__input"
            [class]="getInputClasses()"
            [id]="searchId"
            [value]="searchValue()"
            [placeholder]="placeholder"
            [disabled]="disabled"
            [readonly]="readonly"
            [required]="required"
            [attr.aria-describedby]="helperText ? searchId + '-helper' : null"
            [attr.aria-invalid]="state === 'error'"
            [attr.aria-label]="ariaLabel || placeholder || 'Search'"
            [attr.aria-autocomplete]="suggestions.length > 0 ? 'list' : 'none'"
            [attr.aria-controls]="suggestions.length > 0 ? searchId + '-suggestions' : null"
            (input)="onInput($event)"
            (focus)="onFocus($event)"
            (blur)="onBlur($event)"
            (keydown)="onKeyDown($event)"
          />
        </div>

        <div class="search-bar__trailing-icons" [class]="getTrailingIconsClasses()">
          @if (searchValue() && clearable) {
            <button
              type="button"
              class="search-bar__icon-button search-bar__clear-button"
              [class]="getIconButtonClasses()"
              (click)="clearSearch()"
              [attr.aria-label]="'Clear search'"
              [disabled]="disabled"
            >
              <fa-icon [icon]="faTimes"></fa-icon>
            </button>
          }
          
          @for (icon of trailingIcons; track icon.id) {
            <button
              type="button"
              class="search-bar__icon-button"
              [class]="getIconButtonClasses()"
              (click)="onTrailingIconClick(icon)"
              [attr.aria-label]="icon.label"
              [disabled]="disabled || icon.disabled"
            >
              <fa-icon [icon]="icon.icon"></fa-icon>
            </button>
          }
        </div>
      </div>

      @if (suggestions.length > 0 && showSuggestions()) {
        <div 
          class="search-bar__suggestions" 
          [class]="getSuggestionsClasses()"
          [id]="searchId + '-suggestions'"
          role="listbox"
          [attr.aria-label]="'Search suggestions'"
        >
          @for (suggestion of suggestions; track suggestion.id; let i = $index) {
            <button
              type="button"
              class="search-bar__suggestion"
              [class]="getSuggestionClasses(i)"
              role="option"
              [attr.aria-selected]="selectedSuggestionIndex() === i"
              (click)="selectSuggestion(suggestion)"
              (mouseenter)="setSelectedSuggestionIndex(i)"
            >
              @if (suggestion.icon) {
                <fa-icon class="search-bar__suggestion-icon" [icon]="suggestion.icon"></fa-icon>
              }
              <span class="search-bar__suggestion-text">{{ suggestion.text }}</span>
              @if (suggestion.category) {
                <span class="search-bar__suggestion-category">{{ suggestion.category }}</span>
              }
            </button>
          }
        </div>
      }

      @if (helperText && state !== 'error') {
        <div class="search-bar__helper-text" [id]="searchId + '-helper'">{{ helperText }}</div>
      }

      @if (errorMessage && state === 'error') {
        <div class="search-bar__error-text" [id]="searchId + '-helper'">{{ errorMessage }}</div>
      }
    </div>
  `,
  styleUrls: ['./search-bar.component.scss']
})
export class SearchBarComponent implements ControlValueAccessor {
  @ViewChild('searchInput', { static: true }) searchInput!: ElementRef<HTMLInputElement>;

  // Core inputs
  @Input() placeholder: string = 'Search...';
  @Input() label: string = '';
  @Input() size: SearchBarSize = 'md';
  @Input() variant: SearchBarVariant = 'outlined';
  @Input() state: SearchBarState = 'default';
  
  // Icon inputs
  @Input() leadingIcon: IconDefinition = faSearch;
  @Input() leadingIconLabel: string = '';
  @Input() trailingIcons: Array<{
    id: string;
    icon: IconDefinition;
    label: string;
    disabled?: boolean;
  }> = [];
  
  // Behavior inputs
  @Input() disabled = false;
  @Input() readonly = false;
  @Input() required = false;
  @Input() clearable = true;
  @Input() autofocus = false;
  
  // Suggestions
  @Input() suggestions: SearchSuggestion[] = [];
  @Input() maxSuggestions = 10;
  
  // Accessibility
  @Input() ariaLabel: string = '';
  @Input() helperText: string = '';
  @Input() errorMessage: string = '';
  @Input() searchId: string = `search-${Math.random().toString(36).substr(2, 9)}`;

  // Outputs
  @Output() searchChange = new EventEmitter<string>();
  @Output() searchSubmit = new EventEmitter<string>();
  @Output() searchFocus = new EventEmitter<FocusEvent>();
  @Output() searchBlur = new EventEmitter<FocusEvent>();
  @Output() suggestionSelect = new EventEmitter<SearchSuggestion>();
  @Output() trailingIconClick = new EventEmitter<{id: string, icon: IconDefinition}>();

  // Font Awesome icons
  protected readonly faSearch = faSearch;
  protected readonly faTimes = faTimes;
  protected readonly faMicrophone = faMicrophone;
  protected readonly faCamera = faCamera;
  protected readonly faFilter = faFilter;

  // Internal state
  protected searchValue = signal<string>('');
  protected isFocused = signal<boolean>(false);
  protected showSuggestions = signal<boolean>(false);
  protected selectedSuggestionIndex = signal<number>(-1);

  // ControlValueAccessor implementation
  private onChange = (value: string) => {};
  private onTouched = () => {};

  ngAfterViewInit(): void {
    if (this.autofocus) {
      this.searchInput.nativeElement.focus();
    }
  }

  writeValue(value: string): void {
    this.searchValue.set(value || '');
  }

  registerOnChange(fn: (value: string) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  // Event handlers
  onInput(event: Event): void {
    const target = event.target as HTMLInputElement;
    const value = target.value;
    
    this.searchValue.set(value);
    this.onChange(value);
    this.searchChange.emit(value);
    
    // Show/hide suggestions based on input
    this.showSuggestions.set(value.length > 0 && this.suggestions.length > 0);
    this.selectedSuggestionIndex.set(-1);
  }

  onFocus(event: FocusEvent): void {
    this.isFocused.set(true);
    this.showSuggestions.set(this.searchValue().length > 0 && this.suggestions.length > 0);
    this.searchFocus.emit(event);
  }

  onBlur(event: FocusEvent): void {
    this.isFocused.set(false);
    this.onTouched();
    
    // Delay hiding suggestions to allow for suggestion clicks
    setTimeout(() => {
      this.showSuggestions.set(false);
      this.selectedSuggestionIndex.set(-1);
    }, 150);
    
    this.searchBlur.emit(event);
  }

  onKeyDown(event: KeyboardEvent): void {
    const suggestions = this.suggestions.slice(0, this.maxSuggestions);
    
    switch (event.key) {
      case 'ArrowDown':
        event.preventDefault();
        if (this.showSuggestions()) {
          const nextIndex = this.selectedSuggestionIndex() + 1;
          this.selectedSuggestionIndex.set(nextIndex >= suggestions.length ? 0 : nextIndex);
        }
        break;
        
      case 'ArrowUp':
        event.preventDefault();
        if (this.showSuggestions()) {
          const prevIndex = this.selectedSuggestionIndex() - 1;
          this.selectedSuggestionIndex.set(prevIndex < 0 ? suggestions.length - 1 : prevIndex);
        }
        break;
        
      case 'Enter':
        event.preventDefault();
        if (this.showSuggestions() && this.selectedSuggestionIndex() >= 0) {
          this.selectSuggestion(suggestions[this.selectedSuggestionIndex()]);
        } else {
          this.submitSearch();
        }
        break;
        
      case 'Escape':
        this.showSuggestions.set(false);
        this.selectedSuggestionIndex.set(-1);
        this.searchInput.nativeElement.blur();
        break;
    }
  }

  clearSearch(): void {
    this.searchValue.set('');
    this.onChange('');
    this.searchChange.emit('');
    this.showSuggestions.set(false);
    this.searchInput.nativeElement.focus();
  }

  selectSuggestion(suggestion: SearchSuggestion): void {
    this.searchValue.set(suggestion.text);
    this.onChange(suggestion.text);
    this.searchChange.emit(suggestion.text);
    this.showSuggestions.set(false);
    this.selectedSuggestionIndex.set(-1);
    this.suggestionSelect.emit(suggestion);
  }

  setSelectedSuggestionIndex(index: number): void {
    this.selectedSuggestionIndex.set(index);
  }

  submitSearch(): void {
    this.searchSubmit.emit(this.searchValue());
    this.showSuggestions.set(false);
  }

  onTrailingIconClick(iconData: {id: string, icon: IconDefinition, label: string, disabled?: boolean}): void {
    if (!iconData.disabled) {
      this.trailingIconClick.emit({id: iconData.id, icon: iconData.icon});
    }
  }

  hasValue(): boolean {
    return this.searchValue().length > 0;
  }

  // CSS class getters
  getWrapperClasses(): string {
    const classes = [
      `search-bar-wrapper--${this.size}`,
      `search-bar-wrapper--${this.variant}`,
      `search-bar-wrapper--${this.state}`
    ];

    if (this.disabled) classes.push('search-bar-wrapper--disabled');
    if (this.readonly) classes.push('search-bar-wrapper--readonly');
    if (this.isFocused()) classes.push('search-bar-wrapper--focused');
    if (this.hasValue()) classes.push('search-bar-wrapper--has-value');

    return classes.join(' ');
  }

  getSearchBarClasses(): string {
    const classes = [
      `search-bar--${this.size}`,
      `search-bar--${this.variant}`,
      `search-bar--${this.state}`
    ];

    if (this.disabled) classes.push('search-bar--disabled');
    if (this.readonly) classes.push('search-bar--readonly');
    if (this.isFocused()) classes.push('search-bar--focused');

    return classes.join(' ');
  }

  getLeadingIconClasses(): string {
    return `search-bar__leading-icon--${this.size}`;
  }

  getInputWrapperClasses(): string {
    return `search-bar__input-wrapper--${this.size}`;
  }

  getInputClasses(): string {
    const classes = [`search-bar__input--${this.size}`];
    if (this.hasValue()) classes.push('search-bar__input--has-value');
    return classes.join(' ');
  }

  getTrailingIconsClasses(): string {
    return `search-bar__trailing-icons--${this.size}`;
  }

  getIconButtonClasses(): string {
    return `search-bar__icon-button--${this.size}`;
  }

  getSuggestionsClasses(): string {
    return `search-bar__suggestions--${this.size}`;
  }

  getSuggestionClasses(index: number): string {
    const classes = [`search-bar__suggestion--${this.size}`];
    if (this.selectedSuggestionIndex() === index) {
      classes.push('search-bar__suggestion--selected');
    }
    return classes.join(' ');
  }
}=|x_@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

.ui-select {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-micro-tight; // 0.25rem
  
  &--full-width {
    width: 100%;
  }
}

.select-label {
  font-family: $semantic-typography-font-family-sans;
  font-weight: $semantic-typography-font-weight-medium;
  color: $semantic-color-text-primary;
  font-size: $semantic-typography-font-size-sm;
  line-height: $semantic-typography-line-height-normal;
  margin-bottom: $semantic-spacing-micro-tight; // 0.25rem
}

.select-required {
  color: $semantic-color-danger;
  margin-left: $semantic-spacing-micro-tight; // 0.125rem
}

.select-container {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-micro-tight; // 0.25rem
}

.select-field {
  appearance: none;
  font-family: $semantic-typography-font-family-sans;
  font-weight: $semantic-typography-font-weight-normal;
  background-color: $semantic-color-surface-primary;
  border-radius: $semantic-border-radius-md;
  transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
  outline: none;
  cursor: pointer;
  padding-right: $semantic-spacing-10; // 2.5rem - space for arrow
  
  // Size variants
  .ui-select--small & {
    height: $semantic-spacing-8; // 2rem
    padding: 0 $semantic-spacing-3; // 0.75rem
    padding-right: $semantic-spacing-8; // 2rem
    font-size: $semantic-typography-font-size-sm;
  }
  
  .ui-select--medium & {
    height: $semantic-spacing-micro-tight; // 2.5rem
    padding: 0 $semantic-spacing-3; // 0.75rem
    padding-right: $semantic-spacing-micro-tight; // 2.5rem
    font-size: $semantic-typography-font-size-md;
  }
  
  .ui-select--large & {
    height: $semantic-spacing-12; // 3rem
    padding: 0 $semantic-spacing-4; // 1rem
    padding-right: $semantic-spacing-12; // 3rem
    font-size: $semantic-typography-font-size-lg;
  }
  
  // Variant styles - Outlined
  .ui-select--outlined & {
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    background-color: transparent;
    
    &:hover:not(:disabled) {
      border-color: $semantic-color-border-focus;
    }
    
    &:focus {
      border-color: $semantic-color-interactive-primary;
      box-shadow: 0 0 0 1px $semantic-color-interactive-primary;
    }
  }
  
  // Variant styles - Filled
  .ui-select--filled & {
    border: none;
    background-color: $semantic-color-surface-elevated;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-surface-interactive;
    }
    
    &:focus {
      background-color: $semantic-color-surface-primary;
      box-shadow: inset 0 -2px 0 $semantic-color-interactive-primary;
    }
  }
  
  // States
  &:disabled {
    opacity: 0.6;
    cursor: not-allowed;
    background-color: $semantic-color-surface-disabled;
    color: $semantic-color-text-disabled;
  }
  
  // Option styling
  option {
    background-color: $semantic-color-surface-primary;
    color: $semantic-color-text-primary;
    padding: $semantic-spacing-2; // 0.5rem
    
    &:disabled {
      color: $semantic-color-text-disabled;
    }
  }
  
  // Error state
  &--error {
    .ui-select--outlined & {
      border-color: $semantic-color-danger;
      
      &:focus {
        border-color: $semantic-color-danger;
        box-shadow: 0 0 0 1px $semantic-color-danger;
      }
    }
    
    .ui-select--filled & {
      background-color: rgba($semantic-color-danger, 0.08);
      
      &:focus {
        box-shadow: inset 0 -2px 0 $semantic-color-danger;
      }
    }
  }
}

// Custom arrow icon
.select-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  pointer-events: none;
  color: $semantic-color-text-secondary;
  transition: transform 150ms ease;
  
  .ui-select--small & {
    right: $semantic-spacing-2; // 0.5rem
    
    svg {
      width: 10px;
      height: 6px;
    }
  }
  
  .ui-select--medium & {
    right: $semantic-spacing-3; // 0.75rem
    
    svg {
      width: 12px;
      height: 8px;
    }
  }
  
  .ui-select--large & {
    right: $semantic-spacing-4; // 1rem
    
    svg {
      width: 14px;
      height: 10px;
    }
  }
}

.select-field:focus + .select-arrow {
  color: $semantic-color-interactive-primary;
  transform: translateY(-50%) rotate(180deg);
}

.select-field:disabled + .select-arrow {
  color: $semantic-color-text-disabled;
}

// Helper and error text
.select-helper-text {
  font-family: $semantic-typography-font-family-sans;
  font-size: $semantic-typography-font-size-xs;
  color: $semantic-color-text-secondary;
  line-height: $semantic-typography-line-height-normal;
}

.select-error-text {
  font-family: $semantic-typography-font-family-sans;
  font-size: $semantic-typography-font-size-xs;
  color: $semantic-color-danger;
  line-height: $semantic-typography-line-height-normal;
}

// Disabled state for wrapper
.ui-select--disabled {
  .select-label {
    color: $semantic-color-text-disabled;
  }
}O.x[>S}gqFbQjniF
a L j x>M}FFa x
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

export type SelectSize = 'small' | 'medium' | 'large';
export type SelectVariant = 'outlined' | 'filled';

export interface SelectOption {
  value: any;
  label: string;
  disabled?: boolean;
}

@Component({
  selector: 'ui-select',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => SelectComponent),
      multi: true
    }
  ],
  template: `
    <div [class]="wrapperClasses">
      @if (label) {
        <label [for]="selectId" class="select-label">
          {{ label }}
          @if (required) {
            <span class="select-required">*</span>
          }
        </label>
      }
      
      <div class="select-container">
        <select
          [id]="selectId"
          [disabled]="disabled"
          [value]="value"
          [class]="selectClasses"
          (change)="onSelectionChange($event)"
          (blur)="onBlur()"
          (focus)="onFocus()"
        >
          @if (placeholder) {
            <option value="" disabled>{{ placeholder }}</option>
          }
          
          @for (option of options; track option.value) {
            <option 
              [value]="option.value" 
              [disabled]="option.disabled"
            >
              {{ option.label }}
            </option>
          }
        </select>
        
        <div class="select-arrow">
          <svg width="12" height="8" viewBox="0 0 12 8" fill="none">
            <path d="M1 1L6 6L11 1" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
          </svg>
        </div>
        
        @if (helperText && !errorText) {
          <div class="select-helper-text">{{ helperText }}</div>
        }
        
        @if (errorText) {
          <div class="select-error-text">{{ errorText }}</div>
        }
      </div>
    </div>
  `,
  styleUrl: './select.component.scss'
})
export class SelectComponent implements ControlValueAccessor {
  @Input() label: string = '';
  @Input() placeholder: string = '';
  @Input() helperText: string = '';
  @Input() errorText: string = '';
  @Input() size: SelectSize = 'medium';
  @Input() variant: SelectVariant = 'outlined';
  @Input() disabled: boolean = false;
  @Input() required: boolean = false;
  @Input() fullWidth: boolean = false;
  @Input() options: SelectOption[] = [];

  @Output() valueChange = new EventEmitter<any>();
  @Output() focused = new EventEmitter<void>();
  @Output() blurred = new EventEmitter<void>();

  value: any = '';
  selectId = `ui-select-${Math.random().toString(36).substr(2, 9)}`;

  // ControlValueAccessor implementation
  private onChange = (value: any) => {};
  private onTouched = () => {};

  writeValue(value: any): void {
    this.value = value;
  }

  registerOnChange(fn: (value: any) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  get wrapperClasses(): string {
    return [
      'ui-select',
      `ui-select--${this.size}`,
      `ui-select--${this.variant}`,
      this.disabled ? 'ui-select--disabled' : '',
      this.errorText ? 'ui-select--error' : '',
      this.fullWidth ? 'ui-select--full-width' : ''
    ].filter(Boolean).join(' ');
  }

  get selectClasses(): string {
    return [
      'select-field',
      this.errorText ? 'select-field--error' : ''
    ].filter(Boolean).join(' ');
  }

  onSelectionChange(event: Event): void {
    const target = event.target as HTMLSelectElement;
    this.value = target.value;
    this.onChange(this.value);
    this.valueChange.emit(this.value);
  }

  onFocus(): void {
    this.focused.emit();
  }

  onBlur(): void {
    this.onTouched();
    this.blurred.emit();
  }
};=x# export * from './switch.component';;Zx 
@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// SWITCH COMPONENT STYLES
// ==========================================================================
// Modern switch implementation using design tokens
// Follows Material Design 3 principles with semantic token system
// ==========================================================================

.switch-wrapper {
  display: inline-flex;
  flex-direction: column;
  align-items: flex-start;
  
  // Size variants
  &.switch-wrapper--sm {
    gap: $semantic-spacing-component-xs;
  }
  
  &.switch-wrapper--md {
    gap: $semantic-spacing-component-sm;
  }
  
  &.switch-wrapper--lg {
    gap: $semantic-spacing-component-md;
  }
  
  // State variants
  &.switch-wrapper--disabled {
    opacity: 0.6;
    pointer-events: none;
  }
  
  &.switch-wrapper--focused {
    .switch__track {
      box-shadow: $semantic-shadow-button-focus;
    }
  }
}

.switch {
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  user-select: none;
  position: relative;
  
  // Size-specific gaps
  &.switch--sm {
    gap: $semantic-spacing-component-sm;
  }
  
  &.switch--md {
    gap: $semantic-spacing-component-md;
  }
  
  &.switch--lg {
    gap: $semantic-spacing-component-lg;
  }
  
  &.switch--disabled {
    cursor: not-allowed;
  }
}

.switch__input {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
  pointer-events: none;
  
  // Focus visible for keyboard navigation
  &:focus-visible + .switch__track {
    outline: $semantic-border-width-2 solid $semantic-color-brand-primary;
    outline-offset: 2px;
  }
}

.switch__track {
  position: relative;
  border-radius: $semantic-border-radius-full;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  cursor: pointer;
  
  // Size variants
  &.switch__track--sm {
    width: 32px;
    height: 18px;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    background-color: $semantic-color-surface-secondary;
  }
  
  &.switch__track--md {
    width: 44px;
    height: 24px;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    background-color: $semantic-color-surface-secondary;
  }
  
  &.switch__track--lg {
    width: 56px;
    height: 32px;
    border: $semantic-border-width-2 solid $semantic-color-border-primary;
    background-color: $semantic-color-surface-secondary;
  }
  
  // Checked state - variant colors
  &.switch__track--checked {
    border-color: $semantic-color-brand-primary;
    background-color: $semantic-color-brand-primary;
    
    .switch-wrapper--primary & {
      border-color: $semantic-color-brand-primary;
      background-color: $semantic-color-brand-primary;
    }
    
    .switch-wrapper--secondary & {
      border-color: $semantic-color-text-secondary;
      background-color: $semantic-color-text-secondary;
    }
    
    .switch-wrapper--success & {
      border-color: $semantic-color-success;
      background-color: $semantic-color-success;
    }
    
    .switch-wrapper--warning & {
      border-color: $semantic-color-warning;
      background-color: $semantic-color-warning;
    }
    
    .switch-wrapper--danger & {
      border-color: $semantic-color-danger;
      background-color: $semantic-color-danger;
    }
  }
  
  // Hover states
  &:hover:not(.switch__track--disabled) {
    border-color: $semantic-color-border-focus;
    
    &.switch__track--checked {
      .switch-wrapper--primary & {
        background-color: $semantic-color-brand-secondary;
        border-color: $semantic-color-brand-secondary;
      }
      
      .switch-wrapper--secondary & {
        opacity: 0.9;
      }
      
      .switch-wrapper--success & {
        opacity: 0.9;
      }
      
      .switch-wrapper--warning & {
        opacity: 0.9;
      }
      
      .switch-wrapper--danger & {
        opacity: 0.9;
      }
    }
  }
  
  // Disabled state
  &.switch__track--disabled {
    background-color: $semantic-color-surface-disabled;
    border-color: $semantic-color-border-disabled;
    cursor: not-allowed;
    opacity: 0.5;
  }
}

.switch__thumb {
  position: absolute;
  top: 50%;
  border-radius: $semantic-border-radius-full;
  background-color: $semantic-color-surface-primary;
  box-shadow: $semantic-shadow-elevation-1;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  transform: translateY(-50%);
  
  // Size variants - unchecked position
  &.switch__thumb--sm {
    width: 14px;
    height: 14px;
    left: 2px;
  }
  
  &.switch__thumb--md {
    width: 20px;
    height: 20px;
    left: 2px;
  }
  
  &.switch__thumb--lg {
    width: 26px;
    height: 26px;
    left: 3px;
  }
  
  // Checked position
  &.switch__thumb--checked {
    &.switch__thumb--sm {
      left: 16px; // 32px - 14px - 2px
    }
    
    &.switch__thumb--md {
      left: 22px; // 44px - 20px - 2px
    }
    
    &.switch__thumb--lg {
      left: 27px; // 56px - 26px - 3px
    }
  }
  
  // Hover enhancement
  .switch__track:hover &:not(.switch__thumb--disabled) {
    box-shadow: $semantic-shadow-elevation-2;
    
    &.switch__thumb--checked {
      box-shadow: $semantic-shadow-elevation-3;
    }
  }
  
  // Disabled state
  &.switch__thumb--disabled {
    background-color: $semantic-color-surface-disabled;
    box-shadow: none;
  }
}

.switch__label {
  color: $semantic-color-text-primary;
  font-weight: $semantic-typography-font-weight-medium;
  line-height: $semantic-typography-line-height-tight;
  
  // Size variants
  &.switch__label--sm {
    font-size: $semantic-typography-font-size-sm;
  }
  
  &.switch__label--md {
    font-size: $semantic-typography-font-size-md;
  }
  
  &.switch__label--lg {
    font-size: $semantic-typography-font-size-lg;
  }
  
  // Disabled state
  &.switch__label--disabled {
    color: $semantic-color-text-disabled;
  }
  
  .switch__required-indicator {
    color: $semantic-color-danger;
    margin-left: 2px;
  }
}

.switch__helper-text {
  font-size: $semantic-typography-font-size-xs;
  color: $semantic-color-text-secondary;
  line-height: $semantic-typography-line-height-tight;
  margin-top: $semantic-spacing-component-xs;
  
  .switch-wrapper--sm & {
    margin-left: 40px; // Align with switch track
  }
  
  .switch-wrapper--md & {
    margin-left: 52px; // Align with switch track
  }
  
  .switch-wrapper--lg & {
    margin-left: 64px; // Align with switch track
  }
}

// ==========================================================================
// RESPONSIVE DESIGN
// ==========================================================================

@media (max-width: $semantic-breakpoint-md - 1) {
  .switch-wrapper {
    // Larger touch targets on mobile
    &.switch-wrapper--sm {
      .switch__track--sm {
        width: 36px;
        height: 20px;
      }
      
      .switch__thumb--sm {
        width: 16px;
        height: 16px;
        
        &.switch__thumb--checked {
          left: 18px; // 36px - 16px - 2px
        }
      }
    }
    
    &.switch-wrapper--md {
      .switch__track--md {
        width: 48px;
        height: 26px;
      }
      
      .switch__thumb--md {
        width: 22px;
        height: 22px;
        
        &.switch__thumb--checked {
          left: 24px; // 48px - 22px - 2px
        }
      }
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

// Reduced motion preference
@media (prefers-reduced-motion: reduce) {
  .switch__track,
  .switch__thumb {
    transition: none !important;
  }
}

// High contrast mode
@media (prefers-contrast: high) {
  .switch__track {
    border-width: $semantic-border-width-2;
    
    &.switch__track--checked {
      border-width: $semantic-border-width-2;
    }
  }
  
  .switch__thumb {
    box-shadow: 0 0 0 1px $semantic-color-text-primary;
  }
}

// Focus visible for keyboard navigation
.switch__input:focus-visible + .switch__track {
  outline: $semantic-border-width-2 solid $semantic-color-brand-primary;
  outline-offset: 2px;
}

// Active state for better touch feedback
.switch:active:not(.switch--disabled) {
  .switch__thumb:not(.switch__thumb--disabled) {
    transform: translateY(-50%) scale(1.1);
  }
}P;-xqgqFbQjniF
 \_xTimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, signal, ViewChild, ElementRef } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

export type SwitchSize = 'sm' | 'md' | 'lg';
export type SwitchVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
export type SwitchState = 'default' | 'disabled';

@Component({
  selector: 'ui-switch',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, FormsModule],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => SwitchComponent),
      multi: true
    }
  ],
  template: `
    <div class="switch-wrapper" [class]="getWrapperClasses()">
      <label class="switch" [class]="getSwitchClasses()" [for]="switchId">
        <input
          #switchInput
          type="checkbox"
          class="switch__input"
          [id]="switchId"
          [checked]="isChecked()"
          [disabled]="disabled"
          [required]="required"
          [attr.aria-label]="ariaLabel || label || 'Switch'"
          [attr.aria-describedby]="helperText ? switchId + '-helper' : null"
          [attr.aria-invalid]="state === 'disabled' ? null : false"
          (change)="onToggle($event)"
          (focus)="onFocus($event)"
          (blur)="onBlur($event)"
          (keydown)="onKeyDown($event)"
        />
        <span class="switch__track" [class]="getTrackClasses()">
          <span class="switch__thumb" [class]="getThumbClasses()"></span>
        </span>
        @if (label) {
          <span class="switch__label" [class]="getLabelClasses()">
            {{ label }}
            @if (required) {
              <span class="switch__required-indicator">*</span>
            }
          </span>
        }
      </label>

      @if (helperText && state !== 'disabled') {
        <div class="switch__helper-text" [id]="switchId + '-helper'">{{ helperText }}</div>
      }
    </div>
  `,
  styleUrls: ['./switch.component.scss']
})
export class SwitchComponent implements ControlValueAccessor {
  @ViewChild('switchInput', { static: true }) switchInput!: ElementRef<HTMLInputElement>;

  // Core inputs
  @Input() label: string = '';
  @Input() size: SwitchSize = 'md';
  @Input() variant: SwitchVariant = 'primary';
  @Input() state: SwitchState = 'default';
  
  // Behavior inputs
  @Input() disabled = false;
  @Input() required = false;
  @Input() autofocus = false;
  
  // Accessibility
  @Input() ariaLabel: string = '';
  @Input() helperText: string = '';
  @Input() switchId: string = `switch-${Math.random().toString(36).substr(2, 9)}`;

  // Outputs
  @Output() switchChange = new EventEmitter<boolean>();
  @Output() switchFocus = new EventEmitter<FocusEvent>();
  @Output() switchBlur = new EventEmitter<FocusEvent>();

  // Internal state
  protected isChecked = signal<boolean>(false);
  protected isFocused = signal<boolean>(false);

  // ControlValueAccessor implementation
  private onChange = (value: boolean) => {};
  private onTouched = () => {};

  ngAfterViewInit(): void {
    if (this.autofocus) {
      this.switchInput.nativeElement.focus();
    }
  }

  writeValue(value: boolean): void {
    this.isChecked.set(!!value);
  }

  registerOnChange(fn: (value: boolean) => void): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }

  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }

  // Event handlers
  onToggle(event: Event): void {
    const target = event.target as HTMLInputElement;
    const checked = target.checked;
    
    this.isChecked.set(checked);
    this.onChange(checked);
    this.switchChange.emit(checked);
  }

  onFocus(event: FocusEvent): void {
    this.isFocused.set(true);
    this.switchFocus.emit(event);
  }

  onBlur(event: FocusEvent): void {
    this.isFocused.set(false);
    this.onTouched();
    this.switchBlur.emit(event);
  }

  onKeyDown(event: KeyboardEvent): void {
    // Space or Enter can toggle the switch
    if (event.key === ' ' || event.key === 'Enter') {
      event.preventDefault();
      if (!this.disabled) {
        const newValue = !this.isChecked();
        this.isChecked.set(newValue);
        this.onChange(newValue);
        this.switchChange.emit(newValue);
        
        // Update the actual input element
        this.switchInput.nativeElement.checked = newValue;
      }
    }
  }

  // CSS class getters
  getWrapperClasses(): string {
    const classes = [
      `switch-wrapper--${this.size}`,
      `switch-wrapper--${this.variant}`,
      `switch-wrapper--${this.state}`
    ];

    if (this.disabled) classes.push('switch-wrapper--disabled');
    if (this.isChecked()) classes.push('switch-wrapper--checked');
    if (this.isFocused()) classes.push('switch-wrapper--focused');

    return classes.join(' ');
  }

  getSwitchClasses(): string {
    const classes = [
      `switch--${this.size}`,
      `switch--${this.variant}`,
      `switch--${this.state}`
    ];

    if (this.disabled) classes.push('switch--disabled');
    if (this.isChecked()) classes.push('switch--checked');
    if (this.isFocused()) classes.push('switch--focused');

    return classes.join(' ');
  }

  getTrackClasses(): string {
    const classes = [`switch__track--${this.size}`];
    
    if (this.isChecked()) classes.push('switch__track--checked');
    if (this.disabled) classes.push('switch__track--disabled');
    
    return classes.join(' ');
  }

  getThumbClasses(): string {
    const classes = [`switch__thumb--${this.size}`];
    
    if (this.isChecked()) classes.push('switch__thumb--checked');
    if (this.disabled) classes.push('switch__thumb--disabled');
    
    return classes.join(' ');
  }

  getLabelClasses(): string {
    const classes = [`switch__label--${this.size}`];
    
    if (this.disabled) classes.push('switch__label--disabled');
    
    return classes.join(' ');
  }
}{3x& export * from './tag-input.component';axM"import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, forwardRef, ElementRef, ViewChild } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { ChipComponent } from '../../data-display/chip/chip.component';
import { faXmark } from '@fortawesome/free-solid-svg-icons';

export type TagInputSize = 'sm' | 'md' | 'lg';
export type TagInputVariant = 'outlined' | 'filled';

@Component({
  selector: 'ui-tag-input',
  standalone: true,
  imports: [CommonModule, ChipComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => TagInputComponent),
      multi: true
    }
  ],
  template: `
    <div 
      [class]="containerClasses"
      [attr.aria-label]="ariaLabel"
      [attr.aria-describedby]="ariaDescribedBy"
      (click)="focusInput()">
      
      <div class="ui-tag-input__tags">
        @for (tag of tags; track tag; let i = $index) {
          <div class="ui-tag-input__tag">
            <ui-chip
              [label]="tag"
              [size]="chipSize"
              [variant]="chipVariant"
              [removable]="!disabled && !readonly"
              [closeIcon]="faXmark"
              [disabled]="disabled"
              (chipRemove)="removeTag(i)"
              [attr.aria-label]="'Remove tag: ' + tag">
            </ui-chip>
          </div>
        }
      </div>
      
      @if (!isMaxTagsReached) {
        <input
          #inputElement
          class="ui-tag-input__input"
          type="text"
          [value]="inputValue"
          [placeholder]="effectivePlaceholder"
          [disabled]="disabled"
          [readonly]="readonly"
          [attr.aria-label]="inputAriaLabel"
          [attr.maxlength]="maxTagLength"
          (input)="handleInput($event)"
          (keydown)="handleKeydown($event)"
          (blur)="handleBlur()"
          (focus)="handleFocus()">
      }
    </div>
    
    @if (errorMessage) {
      <div class="ui-tag-input-error" [attr.id]="errorId">
        {{ errorMessage }}
      </div>
    }
    
    @if (helpText && !errorMessage) {
      <div class="ui-tag-input-help" [attr.id]="helpId">
        {{ helpText }}
      </div>
    }
  `,
  styleUrl: './tag-input.component.scss'
})
export class TagInputComponent implements ControlValueAccessor {
  @Input() size: TagInputSize = 'md';
  @Input() variant: TagInputVariant = 'outlined';
  @Input() disabled = false;
  @Input() readonly = false;
  @Input() placeholder = 'Add tags...';
  @Input() maxTags?: number;
  @Input() maxTagLength?: number;
  @Input() allowDuplicates = false;
  @Input() trimTags = true;
  @Input() separators = [',', ';', '|'];
  @Input() ariaLabel = 'Tag input';
  @Input() inputAriaLabel = 'Add new tag';
  @Input() errorMessage?: string;
  @Input() helpText?: string;
  @Input() class = '';
  
  @Output() tagAdd = new EventEmitter<string>();
  @Output() tagRemove = new EventEmitter<{ tag: string; index: number }>();
  @Output() maxTagsReached = new EventEmitter<void>();
  @Output() duplicateTag = new EventEmitter<string>();
  @Output() tagValidationError = new EventEmitter<{ tag: string; error: string }>();
  
  @ViewChild('inputElement') inputElement!: ElementRef<HTMLInputElement>;
  
  // FontAwesome icon
  faXmark = faXmark;
  
  // Internal state
  tags: string[] = [];
  inputValue = '';
  
  // ControlValueAccessor
  private onChange = (value: string[]) => {};
  private onTouched = () => {};
  
  get containerClasses(): string {
    return [
      'ui-tag-input',
      `ui-tag-input--${this.size}`,
      `ui-tag-input--${this.variant}`,
      this.disabled ? 'ui-tag-input--disabled' : '',
      this.errorMessage ? 'ui-tag-input--error' : '',
      this.isMaxTagsReached ? 'ui-tag-input--max-reached' : '',
      this.class
    ].filter(Boolean).join(' ');
  }
  
  get chipSize(): 'sm' | 'md' | 'lg' {
    return this.size;
  }
  
  get chipVariant(): 'filled' | 'outlined' {
    return this.variant === 'outlined' ? 'outlined' : 'filled';
  }
  
  get isMaxTagsReached(): boolean {
    return this.maxTags ? this.tags.length >= this.maxTags : false;
  }
  
  get effectivePlaceholder(): string {
    if (this.tags.length === 0) {
      return this.placeholder;
    }
    if (this.isMaxTagsReached) {
      return `Maximum ${this.maxTags} tags reached`;
    }
    return '';
  }
  
  get errorId(): string {
    return `ui-tag-input-error-${Math.random().toString(36).substr(2, 9)}`;
  }
  
  get helpId(): string {
    return `ui-tag-input-help-${Math.random().toString(36).substr(2, 9)}`;
  }
  
  get ariaDescribedBy(): string {
    const ids: string[] = [];
    if (this.errorMessage) {
      ids.push(this.errorId);
    } else if (this.helpText) {
      ids.push(this.helpId);
    }
    return ids.join(' ') || '';
  }
  
  // ControlValueAccessor implementation
  writeValue(value: string[]): void {
    this.tags = Array.isArray(value) ? [...value] : [];
  }
  
  registerOnChange(fn: (value: string[]) => void): void {
    this.onChange = fn;
  }
  
  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }
  
  setDisabledState(isDisabled: boolean): void {
    this.disabled = isDisabled;
  }
  
  // Event handlers
  handleInput(event: Event): void {
    const target = event.target as HTMLInputElement;
    this.inputValue = target.value;
    
    // Check for separators
    const lastChar = this.inputValue[this.inputValue.length - 1];
    if (this.separators.includes(lastChar)) {
      this.addTagFromInput();
    }
  }
  
  handleKeydown(event: KeyboardEvent): void {
    switch (event.key) {
      case 'Enter':
      case 'Tab':
        if (this.inputValue.trim()) {
          event.preventDefault();
          this.addTagFromInput();
        }
        break;
        
      case 'Backspace':
        if (!this.inputValue && this.tags.length > 0) {
          event.preventDefault();
          this.removeTag(this.tags.length - 1);
        }
        break;
        
      case 'Escape':
        this.inputValue = '';
        if (this.inputElement) {
          this.inputElement.nativeElement.value = '';
        }
        break;
    }
  }
  
  handleBlur(): void {
    this.onTouched();
    if (this.inputValue.trim()) {
      this.addTagFromInput();
    }
  }
  
  handleFocus(): void {
    // Focus handling if needed
  }
  
  focusInput(): void {
    if (!this.disabled && !this.readonly && !this.isMaxTagsReached && this.inputElement) {
      this.inputElement.nativeElement.focus();
    }
  }
  
  // Tag management
  addTag(tag: string): boolean {
    const processedTag = this.trimTags ? tag.trim() : tag;
    
    if (!processedTag) {
      return false;
    }
    
    // Check max length
    if (this.maxTagLength && processedTag.length > this.maxTagLength) {
      this.tagValidationError.emit({
        tag: processedTag,
        error: `Tag exceeds maximum length of ${this.maxTagLength} characters`
      });
      return false;
    }
    
    // Check max tags
    if (this.isMaxTagsReached) {
      this.maxTagsReached.emit();
      return false;
    }
    
    // Check duplicates
    if (!this.allowDuplicates && this.tags.includes(processedTag)) {
      this.duplicateTag.emit(processedTag);
      return false;
    }
    
    // Add tag
    this.tags = [...this.tags, processedTag];
    this.onChange(this.tags);
    this.tagAdd.emit(processedTag);
    
    return true;
  }
  
  removeTag(index: number): void {
    if (index >= 0 && index < this.tags.length) {
      const removedTag = this.tags[index];
      this.tags = this.tags.filter((_, i) => i !== index);
      this.onChange(this.tags);
      this.tagRemove.emit({ tag: removedTag, index });
      
      // Focus input after removal
      setTimeout(() => this.focusInput(), 0);
    }
  }
  
  private addTagFromInput(): void {
    if (this.inputValue) {
      // Remove separator characters
      let cleanValue = this.inputValue;
      this.separators.forEach(sep => {
        cleanValue = cleanValue.replace(new RegExp(`\\${sep}`, 'g'), '');
      });
      
      if (this.addTag(cleanValue)) {
        this.inputValue = '';
        if (this.inputElement) {
          this.inputElement.nativeElement.value = '';
        }
      }
    }
  }
  
  // Public methods
  clear(): void {
    this.tags = [];
    this.inputValue = '';
    if (this.inputElement) {
      this.inputElement.nativeElement.value = '';
    }
    this.onChange(this.tags);
  }
  
  addTagProgrammatically(tag: string): boolean {
    return this.addTag(tag);
  }
  
  getTagsAsString(separator = ', '): string {
    return this.tags.join(separator);
  }
}|Zrx Fqx ˓%̹Z4x( export * from './time-picker.component';t"xh@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-aspect-ratio {
  // Core Structure
  display: block;
  position: relative;
  width: 100%;
  overflow: hidden;
  
  // Visual Design
  background: $semantic-color-surface-primary;
  border-radius: $semantic-border-radius-md;
  
  // Default aspect ratio container
  &::before {
    content: '';
    display: block;
    padding-bottom: 56.25%; // 16:9 default
  }
  
  // Content wrapper
  &__content {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    
    // Ensure content fills the container properly
    & > * {
      width: 100%;
      height: 100%;
      object-fit: cover;
    }
    
    // For images and videos
    & > img,
    & > video {
      object-fit: cover;
      border-radius: inherit;
    }
    
    // For custom content that needs centering
    &--center {
      & > * {
        width: auto;
        height: auto;
        object-fit: initial;
      }
    }
  }
  
  // Common Aspect Ratio Variants
  &--square {
    &::before {
      padding-bottom: 100%; // 1:1
    }
  }
  
  &--video {
    &::before {
      padding-bottom: 56.25%; // 16:9
    }
  }
  
  &--cinema {
    &::before {
      padding-bottom: 42.86%; // 21:9
    }
  }
  
  &--photo {
    &::before {
      padding-bottom: 66.67%; // 3:2
    }
  }
  
  &--portrait {
    &::before {
      padding-bottom: 133.33%; // 3:4
    }
  }
  
  &--golden {
    &::before {
      padding-bottom: 61.8%; // Golden ratio ~1.618:1
    }
  }
  
  // Size variants for different contexts
  &--sm {
    border-radius: $semantic-border-radius-sm;
    
    .ui-aspect-ratio__content {
      & > img,
      & > video {
        border-radius: $semantic-border-radius-sm;
      }
    }
  }
  
  &--lg {
    border-radius: $semantic-border-radius-lg;
    
    .ui-aspect-ratio__content {
      & > img,
      & > video {
        border-radius: $semantic-border-radius-lg;
      }
    }
  }
  
  // Surface variants
  &--elevated {
    background: $semantic-color-surface-elevated;
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &--bordered {
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
  }
  
  // Interactive state for clickable aspect ratios
  &--interactive {
    cursor: pointer;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &:hover {
      box-shadow: $semantic-shadow-elevation-3;
      transform: translateY(-1px);
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    &:active {
      transform: translateY(0);
      box-shadow: $semantic-shadow-elevation-1;
    }
  }
  
  // Loading state
  &--loading {
    background: $semantic-color-surface-secondary;
    
    .ui-aspect-ratio__content {
      display: flex;
      align-items: center;
      justify-content: center;
      
      &::after {
        content: '';
        width: 32px;
        height: 32px;
        border: 3px solid $semantic-color-border-subtle;
        border-top: 3px solid $semantic-color-primary;
        border-radius: 50%;
        animation: spin $semantic-motion-duration-slow linear infinite;
      }
    }
  }
  
  // Responsive adjustments
  @media (max-width: calc($semantic-breakpoint-md - 1px)) {
    border-radius: $semantic-border-radius-sm;
    
    &--sm {
      border-radius: $semantic-border-radius-sm;
    }
    
    &--lg {
      border-radius: $semantic-border-radius-md;
    }
  }
}

// Loading animation
@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}Kxf	import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type AspectRatioPreset = 'square' | 'video' | 'cinema' | 'photo' | 'portrait' | 'golden';
type AspectRatioSize = 'sm' | 'md' | 'lg';
type AspectRatioVariant = 'default' | 'elevated' | 'bordered' | 'interactive';

@Component({
  selector: 'ui-aspect-ratio',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      [ngClass]="getClasses()"
      [style.--aspect-ratio]="customRatio"
      [attr.role]="role"
      [tabindex]="interactive && !loading ? tabIndex : -1"
      (click)="handleClick($event)"
      (keydown)="handleKeydown($event)">
      
      <div class="ui-aspect-ratio__content" [class.ui-aspect-ratio__content--center]="centerContent">
        @if (loading) {
          <!-- Loading indicator is handled by CSS -->
        } @else {
          <ng-content></ng-content>
        }
      </div>
    </div>
  `,
  styleUrl: './aspect-ratio.component.scss'
})
export class AspectRatioComponent {
  @Input() ratio: AspectRatioPreset = 'video';
  @Input() customRatio?: string; // e.g., "4/3", "1.5", "75%"
  @Input() size: AspectRatioSize = 'md';
  @Input() variant: AspectRatioVariant = 'default';
  @Input() loading = false;
  @Input() centerContent = false;
  @Input() role?: string;
  @Input() tabIndex = 0;

  @Output() clicked = new EventEmitter<MouseEvent>();

  get interactive(): boolean {
    return this.variant === 'interactive';
  }

  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {
      'ui-aspect-ratio': true,
      [`ui-aspect-ratio--${this.ratio}`]: !this.customRatio,
      [`ui-aspect-ratio--${this.size}`]: this.size !== 'md',
      'ui-aspect-ratio--loading': this.loading
    };

    if (this.variant !== 'default') {
      classes[`ui-aspect-ratio--${this.variant}`] = true;
    }

    return classes;
  }

  handleClick(event: MouseEvent): void {
    if (this.interactive && !this.loading) {
      this.clicked.emit(event);
    }
  }

  handleKeydown(event: KeyboardEvent): void {
    if (this.interactive && !this.loading && (event.key === 'Enter' || event.key === ' ')) {
      event.preventDefault();
      this.handleClick(event as any);
    }
  }
}J x) export * from './aspect-ratio.component';.DFx9 $++Zfq"DWmT8spǕݷaLtq$!Ex	Himport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type BentoGridItemSpan = 1 | 2 | 3 | 4 | 'full' | "1" | "2" | "3" | "4";
type BentoGridItemRowSpan = 1 | 2 | 3 | 4 | "1" | "2" | "3" | "4";
type BentoGridItemFeatured = 'sm' | 'md' | 'lg' | 'xl';
type BentoGridItemVariant = 'default' | 'primary' | 'secondary' | 'elevated';

@Component({
  selector: 'ui-bento-grid-item',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-bento-grid-item"
      [class]="getComponentClasses()"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel"
      [attr.tabindex]="interactive ? tabIndex : -1"
      (click)="handleClick($event)"
      (keydown)="handleKeydown($event)">
      
      @if (header) {
        <div class="ui-bento-grid-item__header">
          {{ header }}
        </div>
      }
      
      <div class="ui-bento-grid-item__content">
        <ng-content></ng-content>
      </div>
    </div>
  `,
  styleUrl: './bento-grid.component.scss'
})
export class BentoGridItemComponent {
  @Input() colSpan: BentoGridItemSpan = 1;
  @Input() rowSpan: BentoGridItemRowSpan = 1;
  @Input() featured?: BentoGridItemFeatured;
  @Input() variant: BentoGridItemVariant = 'default';
  @Input() interactive = false;
  @Input() header?: string;
  @Input() role = 'gridcell';
  @Input() ariaLabel?: string;
  @Input() tabIndex = 0;
  
  @Output() clicked = new EventEmitter<MouseEvent>();
  
  getComponentClasses(): string {
    const classes = [
      'ui-bento-grid-item',
      `ui-bento-grid-item--span-${this.colSpan}`,
      `ui-bento-grid-item--row-span-${this.rowSpan}`
    ];
    
    if (this.featured) {
      classes.push(`ui-bento-grid-item--featured-${this.featured}`);
    }
    
    if (this.variant !== 'default') {
      classes.push(`ui-bento-grid-item--${this.variant}`);
    }
    
    if (this.interactive) {
      classes.push('ui-bento-grid-item--interactive');
    }
    
    return classes.join(' ');
  }
  
  handleClick(event: MouseEvent): void {
    if (this.interactive) {
      this.clicked.emit(event);
    }
  }
  
  handleKeydown(event: KeyboardEvent): void {
    if (this.interactive && (event.key === 'Enter' || event.key === ' ')) {
      event.preventDefault();
      this.handleClick(event as any);
    }
  }
}tEx.Upv&FɁ"y9@Vmmĥ 9`ՓqTWC٘eժRKJRS*a,UW%e&敀UB

)i9%؜cTWZ\Y<u {]KxL@use '../../../../../../ui-design-system/src/styles/semantic' as *;

.ui-bento-grid {
  display: grid;
  position: relative;
  width: 100%;
  
  // Base grid layout with masonry-like behavior
  gap: $semantic-spacing-grid-gap-md;
  grid-auto-rows: minmax(120px, auto);
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  
  // Size variants for gap
  &--gap-xs {
    gap: $semantic-spacing-grid-gap-sm;
  }
  
  &--gap-sm {
    gap: $semantic-spacing-grid-gap-sm;
  }
  
  &--gap-md {
    gap: $semantic-spacing-grid-gap-md;
  }
  
  &--gap-lg {
    gap: $semantic-spacing-grid-gap-lg;
  }
  
  // Column variants for different breakpoints
  &--cols-2 {
    grid-template-columns: repeat(2, 1fr);
  }
  
  &--cols-3 {
    grid-template-columns: repeat(3, 1fr);
  }
  
  &--cols-4 {
    grid-template-columns: repeat(4, 1fr);
  }
  
  &--cols-5 {
    grid-template-columns: repeat(5, 1fr);
  }
  
  &--cols-6 {
    grid-template-columns: repeat(6, 1fr);
  }
  
  // Auto-fit responsive columns with different min widths
  &--auto-fit-sm {
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  }
  
  &--auto-fit-md {
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  }
  
  &--auto-fit-lg {
    grid-template-columns: repeat(auto-fit, minmax(360px, 1fr));
  }
  
  // Row height variants
  &--rows-sm {
    grid-auto-rows: minmax(80px, auto);
  }
  
  &--rows-md {
    grid-auto-rows: minmax(120px, auto);
  }
  
  &--rows-lg {
    grid-auto-rows: minmax(160px, auto);
  }
  
  // Dense packing for masonry effect
  &--dense {
    grid-auto-flow: row dense;
  }
  
  // Responsive behavior
  @media (max-width: 1024px) {
    &--cols-6,
    &--cols-5 {
      grid-template-columns: repeat(3, 1fr);
    }
    
    &--cols-4 {
      grid-template-columns: repeat(2, 1fr);
    }
    
    &--auto-fit-lg {
      grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    }
  }
  
  @media (max-width: 768px) {
    gap: $semantic-spacing-grid-gap-sm;
    
    &--cols-6,
    &--cols-5,
    &--cols-4,
    &--cols-3 {
      grid-template-columns: repeat(2, 1fr);
    }
    
    &--auto-fit-md,
    &--auto-fit-lg {
      grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    }
  }
  
  @media (max-width: 480px) {
    gap: $semantic-spacing-grid-gap-sm;
    
    &--cols-6,
    &--cols-5,
    &--cols-4,
    &--cols-3,
    &--cols-2 {
      grid-template-columns: 1fr;
    }
    
    &--auto-fit-sm,
    &--auto-fit-md,
    &--auto-fit-lg {
      grid-template-columns: 1fr;
    }
  }
}

// Bento Grid Item - for individual grid cells with specific spans
.ui-bento-grid-item {
  position: relative;
  overflow: hidden;
  background: $semantic-color-surface-primary;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  border-radius: $semantic-border-card-radius;
  box-shadow: $semantic-shadow-elevation-1;
  padding: $semantic-spacing-component-md;
  
  // Transitions
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  
  // Size variants - column spans
  &--span-1 {
    grid-column: span 1;
  }
  
  &--span-2 {
    grid-column: span 2;
  }
  
  &--span-3 {
    grid-column: span 3;
  }
  
  &--span-4 {
    grid-column: span 4;
  }
  
  &--span-full {
    grid-column: 1 / -1;
  }
  
  // Row spans for featured items
  &--row-span-1 {
    grid-row: span 1;
  }
  
  &--row-span-2 {
    grid-row: span 2;
  }
  
  &--row-span-3 {
    grid-row: span 3;
  }
  
  &--row-span-4 {
    grid-row: span 4;
  }
  
  // Combined featured sizes
  &--featured-sm {
    grid-column: span 2;
    grid-row: span 1;
  }
  
  &--featured-md {
    grid-column: span 2;
    grid-row: span 2;
  }
  
  &--featured-lg {
    grid-column: span 3;
    grid-row: span 2;
  }
  
  &--featured-xl {
    grid-column: span 4;
    grid-row: span 3;
  }
  
  // Color variants
  &--primary {
    background: $semantic-color-primary;
    color: $semantic-color-on-primary;
    border-color: $semantic-color-primary;
  }
  
  &--secondary {
    background: $semantic-color-secondary;
    color: $semantic-color-on-secondary;
    border-color: $semantic-color-secondary;
  }
  
  &--elevated {
    background: $semantic-color-surface-elevated;
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  // Interactive states
  &--interactive {
    cursor: pointer;
    
    &:hover {
      box-shadow: $semantic-shadow-elevation-3;
      transform: translateY(-2px);
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    &:active {
      transform: translateY(-1px);
      box-shadow: $semantic-shadow-elevation-2;
    }
  }
  
  // Content styling
  &__header {
    margin-bottom: $semantic-spacing-content-paragraph;
    font-family: map-get($semantic-typography-heading-h5, font-family);
    font-size: map-get($semantic-typography-heading-h5, font-size);
    font-weight: map-get($semantic-typography-heading-h5, font-weight);
    line-height: map-get($semantic-typography-heading-h5, line-height);
    color: $semantic-color-text-primary;
  }
  
  &__content {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-secondary;
  }
  
  // Responsive item behavior
  @media (max-width: 1024px) {
    &--featured-xl,
    &--featured-lg {
      grid-column: span 2;
      grid-row: span 2;
    }
    
    &--span-4 {
      grid-column: span 3;
    }
    
    &--span-3 {
      grid-column: span 2;
    }
  }
  
  @media (max-width: 768px) {
    padding: $semantic-spacing-component-sm;
    
    &--featured-xl,
    &--featured-lg,
    &--featured-md,
    &--featured-sm {
      grid-column: span 2;
      grid-row: span 1;
    }
    
    &--span-4,
    &--span-3,
    &--span-2 {
      grid-column: span 2;
    }
    
    &--row-span-4,
    &--row-span-3,
    &--row-span-2 {
      grid-row: span 2;
    }
  }
  
  @media (max-width: 480px) {
    padding: $semantic-spacing-component-xs;
    
    &--featured-xl,
    &--featured-lg,
    &--featured-md,
    &--featured-sm,
    &--span-4,
    &--span-3,
    &--span-2,
    &--span-full {
      grid-column: span 1;
    }
    
    &--row-span-4,
    &--row-span-3,
    &--row-span-2 {
      grid-row: span 1;
    }
  }
}Zx	c2'<7/index' as *;

.ui-grid-container {
  // Core StructureU?Layout & Spacing
1"md?5Visual Design
!

)
  // Sizing VariantsPPadding Variants
  &--padding-none {
    padding: 0;
  }
  
  &--padding-sm {
  A'}
  
  &--padding-md {
  A-}
  
  &--padding-lg {
  A'9lg;
  }
  
  // Column Variants - Auto Grid
  &--auto-fit625Pll,ll, minmax(25PIColumn Templates
  &--cols-1p	}
  FRow Variants
  &--rows-auto>auto;
  }
  
  &--rows-equal>!1fr;
  }
  
  &--rows-min-content>&-content;
  }
  
  &--rows-max-content>4ax-content;
  }
  
  // Dense Grid for Auto Placemen#dense;
  }
  
  // Alignment Options
  &--justify-start {
    justify-content: start;
  }
  
  &--justify-center {
    justify-content: center;
  }
  
  &--justify-end {
    justify-content: end;
  }
  
  &--justify-space-between {
    justify-content: space-between;
  }
  
  &--justify-space-around {
    justify-content: space-around;
  }
  
  &--justify-space-evenly {
    justify-content: space-evenly;
  }
  
  &--align-start {
    align-content: start;
  }
  
  &--align-center {
    align-content: center;
  }
  
  &--align-end {
    align-content: end;
  }
  
  &--align-space-between {
    align-content: space-between;
  }
  
  &--align-space-around {
    align-content: space-around;
  }
  
  &--align-space-evenly {
    align-content: space-evenly;
  }
  
  // Item Alignment
  &--items-start {
    align-items: start;
  }
  
  &--items-center {
    align-items: center;
  }
 ] 
  &--items-end {
    align-items: end;
  }
  
  &--items-stretch {
    align-items: stretch>B[.cols-60'=:l C%	38>^
0C%0	,
    &--auto-fillP	-K}
}

// Grid Item Utilities
.ui-grid-item {
  // Span Utilities
  &--span-11515;
  }
  
  &--span-616CSpan UtilitieItem Alignment
  &--justify-self-start {
    justify-self: start;
  }
  
  &--justify-self-center {
    justify-self: center;
  }
  
  &--justify-self-end {
    justify-self: end;
  }
  
  &--justify-self-stretch {
    justify-self: stretch;
  }
  
  &--align-self-start {
    align-self: start;
  }
  
  &--align-self-center {
    align-self: center;
  }
  
  &--align-self-end {
M    align-self: end;
  }
  
  &--align-self-stretch {
    align-self: stretch>
Item Spans_l&--span-6,
    &--span-5,@&--span-6,
    &--span-5-&o1;
    }
  }
}QQximport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type BentoGridColumns = 2 | 3 | 4 | 5 | 6 | 'auto-fit-sm' | 'auto-fit-md' | 'auto-fit-lg' | "2" | "3" | "4" | "5" | "6";
type BentoGridGap = 'xs' | 'sm' | 'md' | 'lg';
type BentoGridRows = 'sm' | 'md' | 'lg';

@Component({
  selector: 'ui-bento-grid',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-bento-grid"
      [class.ui-bento-grid--cols-{{columns}}]="typeof columns === 'number'"
      [class.ui-bento-grid--{{columns}}]="typeof columns === 'string'"
      [class.ui-bento-grid--gap-{{gap}}]="gap"
      [class.ui-bento-grid--rows-{{rowHeight}}]="rowHeight"
      [class.ui-bento-grid--dense]="dense"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './bento-grid.component.scss'
})
export class BentoGridComponent {
  @Input() columns: BentoGridColumns = 'auto-fit-md';
  @Input() gap: BentoGridGap = 'md';
  @Input() rowHeight: BentoGridRows = 'md';
  @Input() dense = true;
  @Input() role = 'grid';
  @Input() ariaLabel = 'Bento grid layout';
}o&+xm
V]="getComponentClasses()qe  
  getComponentClasses(): string {
    const classes = ['ui-bento-grid'];
    
    if (typeof this.) {
      classes.push(`ui-bento-grid--cols-${this.columns}`);
    } else if (typeof this.columns === 'string') {
      classes.push(`ui-bento-grid--${this.columns}`);
    }
    
    if (this.gap) {
      classes.push(`ui-bento-grid--gap-${this.gap}`);
    }
    
    if (this.rowHeight) {
      classes.push(`ui-bento-grid--rows-${this.rowHeight}`);
    }
    
    if (this.dense)] {
      classes.push('ui-bento-grid--dense');
    }
    
    return classes.join(' ');
  }
}!ȴxT export * from './bento-grid.component';
export * from './bento-grid-item.component';Kx,,@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-box {
  // Base box behavior
  box-sizing: border-box;
  
  // Display variants
  &--display-block {
    display: block;
  }
  
  &--display-inline {
    display: inline;
  }
  
  &--display-inline-block {
    display: inline-block;
  }
  
  &--display-flex {
    display: flex;
  }
  
  &--display-inline-flex {
    display: inline-flex;
  }
  
  &--display-grid {
    display: grid;
  }
  
  &--display-inline-grid {
    display: inline-grid;
  }
  
  // Position variants
  &--position-relative {
    position: relative;
  }
  
  &--position-absolute {
    position: absolute;
  }
  
  &--position-fixed {
    position: fixed;
  }
  
  &--position-sticky {
    position: sticky;
  }
  
  // Overflow variants
  &--overflow-hidden {
    overflow: hidden;
  }
  
  &--overflow-scroll {
    overflow: scroll;
  }
  
  &--overflow-auto {
    overflow: auto;
  }
  
  // Padding utilities - All sides
  &--p-none {
    padding: 0;
  }
  
  &--p-xs {
    padding: $semantic-spacing-component-xs;
  }
  
  &--p-sm {
    padding: $semantic-spacing-component-sm;
  }
  
  &--p-md {
    padding: $semantic-spacing-component-md;
  }
  
  &--p-lg {
    padding: $semantic-spacing-component-lg;
  }
  
  &--p-xl {
    padding: $semantic-spacing-component-xl;
  }
  
  &--p-2xl {
    padding: $semantic-spacing-2xl;
  }
  
  &--p-3xl {
    padding: $semantic-spacing-3xl;
  }
  
  &--p-4xl {
    padding: $semantic-spacing-4xl;
  }
  
  &--p-5xl {
    padding: $semantic-spacing-5xl;
  }
  
  // Padding utilities - Horizontal (left + right)
  &--px-none {
    padding-left: 0;
    padding-right: 0;
  }
  
  &--px-xs {
    padding-left: $semantic-spacing-component-xs;
    padding-right: $semantic-spacing-component-xs;
  }
  
  &--px-sm {
    padding-left: $semantic-spacing-component-sm;
    padding-right: $semantic-spacing-component-sm;
  }
  
  &--px-md {
    padding-left: $semantic-spacing-component-md;
    padding-right: $semantic-spacing-component-md;
  }
  
  &--px-lg {
    padding-left: $semantic-spacing-component-lg;
    padding-right: $semantic-spacing-component-lg;
  }
  
  &--px-xl {
    padding-left: $semantic-spacing-component-xl;
    padding-right: $semantic-spacing-component-xl;
  }
  
  &--px-2xl {
    padding-left: $semantic-spacing-2xl;
    padding-right: $semantic-spacing-2xl;
  }
  
  &--px-3xl {
    padding-left: $semantic-spacing-3xl;
    padding-right: $semantic-spacing-3xl;
  }
  
  &--px-4xl {
    padding-left: $semantic-spacing-4xl;
    padding-right: $semantic-spacing-4xl;
  }
  
  &--px-5xl {
    padding-left: $semantic-spacing-5xl;
    padding-right: $semantic-spacing-5xl;
  }
  
  // Padding utilities - Vertical (top + bottom)
  &--py-none {
    padding-top: 0;
    padding-bottom: 0;
  }
  
  &--py-xs {
    padding-top: $semantic-spacing-component-xs;
    padding-bottom: $semantic-spacing-component-xs;
  }
  
  &--py-sm {
    padding-top: $semantic-spacing-component-sm;
    padding-bottom: $semantic-spacing-component-sm;
  }
  
  &--py-md {
    padding-top: $semantic-spacing-component-md;
    padding-bottom: $semantic-spacing-component-md;
  }
  
  &--py-lg {
    padding-top: $semantic-spacing-component-lg;
    padding-bottom: $semantic-spacing-component-lg;
  }
  
  &--py-xl {
    padding-top: $semantic-spacing-component-xl;
    padding-bottom: $semantic-spacing-component-xl;
  }
  
  &--py-2xl {
    padding-top: $semantic-spacing-2xl;
    padding-bottom: $semantic-spacing-2xl;
  }
  
  &--py-3xl {
    padding-top: $semantic-spacing-3xl;
    padding-bottom: $semantic-spacing-3xl;
  }
  
  &--py-4xl {
    padding-top: $semantic-spacing-4xl;
    padding-bottom: $semantic-spacing-4xl;
  }
  
  &--py-5xl {
    padding-top: $semantic-spacing-5xl;
    padding-bottom: $semantic-spacing-5xl;
  }
  
  // Individual padding sides (pt, pr, pb, pl)
  &--pt-none { padding-top: 0; }
  &--pt-xs { padding-top: $semantic-spacing-component-xs; }
  &--pt-sm { padding-top: $semantic-spacing-component-sm; }
  &--pt-md { padding-top: $semantic-spacing-component-md; }
  &--pt-lg { padding-top: $semantic-spacing-component-lg; }
  &--pt-xl { padding-top: $semantic-spacing-component-xl; }
  &--pt-2xl { padding-top: $semantic-spacing-2xl; }
  &--pt-3xl { padding-top: $semantic-spacing-3xl; }
  &--pt-4xl { padding-top: $semantic-spacing-4xl; }
  &--pt-5xl { padding-top: $semantic-spacing-5xl; }
  
  &--pr-none { padding-right: 0; }
  &--pr-xs { padding-right: $semantic-spacing-component-xs; }
  &--pr-sm { padding-right: $semantic-spacing-component-sm; }
  &--pr-md { padding-right: $semantic-spacing-component-md; }
  &--pr-lg { padding-right: $semantic-spacing-component-lg; }
  &--pr-xl { padding-right: $semantic-spacing-component-xl; }
  &--pr-2xl { padding-right: $semantic-spacing-2xl; }
  &--pr-3xl { padding-right: $semantic-spacing-3xl; }
  &--pr-4xl { padding-right: $semantic-spacing-4xl; }
  &--pr-5xl { padding-right: $semantic-spacing-5xl; }
  
  &--pb-none { padding-bottom: 0; }
  &--pb-xs { padding-bottom: $semantic-spacing-component-xs; }
  &--pb-sm { padding-bottom: $semantic-spacing-component-sm; }
  &--pb-md { padding-bottom: $semantic-spacing-component-md; }
  &--pb-lg { padding-bottom: $semantic-spacing-component-lg; }
  &--pb-xl { padding-bottom: $semantic-spacing-component-xl; }
  &--pb-2xl { padding-bottom: $semantic-spacing-2xl; }
  &--pb-3xl { padding-bottom: $semantic-spacing-3xl; }
  &--pb-4xl { padding-bottom: $semantic-spacing-4xl; }
  &--pb-5xl { padding-bottom: $semantic-spacing-5xl; }
  
  &--pl-none { padding-left: 0; }
  &--pl-xs { padding-left: $semantic-spacing-component-xs; }
  &--pl-sm { padding-left: $semantic-spacing-component-sm; }
  &--pl-md { padding-left: $semantic-spacing-component-md; }
  &--pl-lg { padding-left: $semantic-spacing-component-lg; }
  &--pl-xl { padding-left: $semantic-spacing-component-xl; }
  &--pl-2xl { padding-left: $semantic-spacing-2xl; }
  &--pl-3xl { padding-left: $semantic-spacing-3xl; }
  &--pl-4xl { padding-left: $semantic-spacing-4xl; }
  &--pl-5xl { padding-left: $semantic-spacing-5xl; }
  
  // Margin utilities - All sides
  &--m-none {
    margin: 0;
  }
  
  &--m-xs {
    margin: $semantic-spacing-layout-xs;
  }
  
  &--m-sm {
    margin: $semantic-spacing-layout-sm;
  }
  
  &--m-md {
    margin: $semantic-spacing-layout-md;
  }
  
  &--m-lg {
    margin: $semantic-spacing-layout-lg;
  }
  
  &--m-xl {
    margin: $semantic-spacing-layout-xl;
  }
  
  &--m-2xl {
    margin: $semantic-spacing-2xl;
  }
  
  &--m-3xl {
    margin: $semantic-spacing-3xl;
  }
  
  &--m-4xl {
    margin: $semantic-spacing-4xl;
  }
  
  &--m-5xl {
    margin: $semantic-spacing-5xl;
  }
  
  // Margin utilities - Horizontal (left + right)
  &--mx-none {
    margin-left: 0;
    margin-right: 0;
  }
  
  &--mx-xs {
    margin-left: $semantic-spacing-layout-xs;
    margin-right: $semantic-spacing-layout-xs;
  }
  
  &--mx-sm {
    margin-left: $semantic-spacing-layout-sm;
    margin-right: $semantic-spacing-layout-sm;
  }
  
  &--mx-md {
    margin-left: $semantic-spacing-layout-md;
    margin-right: $semantic-spacing-layout-md;
  }
  
  &--mx-lg {
    margin-left: $semantic-spacing-layout-lg;
    margin-right: $semantic-spacing-layout-lg;
  }
  
  &--mx-xl {
    margin-left: $semantic-spacing-layout-xl;
    margin-right: $semantic-spacing-layout-xl;
  }
  
  &--mx-2xl {
    margin-left: $semantic-spacing-2xl;
    margin-right: $semantic-spacing-2xl;
  }
  
  &--mx-3xl {
    margin-left: $semantic-spacing-3xl;
    margin-right: $semantic-spacing-3xl;
  }
  
  &--mx-4xl {
    margin-left: $semantic-spacing-4xl;
    margin-right: $semantic-spacing-4xl;
  }
  
  &--mx-5xl {
    margin-left: $semantic-spacing-5xl;
    margin-right: $semantic-spacing-5xl;
  }
  
  // Margin utilities - Vertical (top + bottom)
  &--my-none {
    margin-top: 0;
    margin-bottom: 0;
  }
  
  &--my-xs {
    margin-top: $semantic-spacing-layout-xs;
    margin-bottom: $semantic-spacing-layout-xs;
  }
  
  &--my-sm {
    margin-top: $semantic-spacing-layout-sm;
    margin-bottom: $semantic-spacing-layout-sm;
  }
  
  &--my-md {
    margin-top: $semantic-spacing-layout-md;
    margin-bottom: $semantic-spacing-layout-md;
  }
  
  &--my-lg {
    margin-top: $semantic-spacing-layout-lg;
    margin-bottom: $semantic-spacing-layout-lg;
  }
  
  &--my-xl {
    margin-top: $semantic-spacing-layout-xl;
    margin-bottom: $semantic-spacing-layout-xl;
  }
  
  &--my-2xl {
    margin-top: $semantic-spacing-2xl;
    margin-bottom: $semantic-spacing-2xl;
  }
  
  &--my-3xl {
    margin-top: $semantic-spacing-3xl;
    margin-bottom: $semantic-spacing-3xl;
  }
  
  &--my-4xl {
    margin-top: $semantic-spacing-4xl;
    margin-bottom: $semantic-spacing-4xl;
  }
  
  &--my-5xl {
    margin-top: $semantic-spacing-5xl;
    margin-bottom: $semantic-spacing-5xl;
  }
  
  // Individual margin sides (mt, mr, mb, ml)
  &--mt-none { margin-top: 0; }
  &--mt-xs { margin-top: $semantic-spacing-layout-xs; }
  &--mt-sm { margin-top: $semantic-spacing-layout-sm; }
  &--mt-md { margin-top: $semantic-spacing-layout-md; }
  &--mt-lg { margin-top: $semantic-spacing-layout-lg; }
  &--mt-xl { margin-top: $semantic-spacing-layout-xl; }
  &--mt-2xl { margin-top: $semantic-spacing-2xl; }
  &--mt-3xl { margin-top: $semantic-spacing-3xl; }
  &--mt-4xl { margin-top: $semantic-spacing-4xl; }
  &--mt-5xl { margin-top: $semantic-spacing-5xl; }
  
  &--mr-none { margin-right: 0; }
  &--mr-xs { margin-right: $semantic-spacing-layout-xs; }
  &--mr-sm { margin-right: $semantic-spacing-layout-sm; }
  &--mr-md { margin-right: $semantic-spacing-layout-md; }
  &--mr-lg { margin-right: $semantic-spacing-layout-lg; }
  &--mr-xl { margin-right: $semantic-spacing-layout-xl; }
  &--mr-2xl { margin-right: $semantic-spacing-2xl; }
  &--mr-3xl { margin-right: $semantic-spacing-3xl; }
  &--mr-4xl { margin-right: $semantic-spacing-4xl; }
  &--mr-5xl { margin-right: $semantic-spacing-5xl; }
  
  &--mb-none { margin-bottom: 0; }
  &--mb-xs { margin-bottom: $semantic-spacing-layout-xs; }
  &--mb-sm { margin-bottom: $semantic-spacing-layout-sm; }
  &--mb-md { margin-bottom: $semantic-spacing-layout-md; }
  &--mb-lg { margin-bottom: $semantic-spacing-layout-lg; }
  &--mb-xl { margin-bottom: $semantic-spacing-layout-xl; }
  &--mb-2xl { margin-bottom: $semantic-spacing-2xl; }
  &--mb-3xl { margin-bottom: $semantic-spacing-3xl; }
  &--mb-4xl { margin-bottom: $semantic-spacing-4xl; }
  &--mb-5xl { margin-bottom: $semantic-spacing-5xl; }
  
  &--ml-none { margin-left: 0; }
  &--ml-xs { margin-left: $semantic-spacing-layout-xs; }
  &--ml-sm { margin-left: $semantic-spacing-layout-sm; }
  &--ml-md { margin-left: $semantic-spacing-layout-md; }
  &--ml-lg { margin-left: $semantic-spacing-layout-lg; }
  &--ml-xl { margin-left: $semantic-spacing-layout-xl; }
  &--ml-2xl { margin-left: $semantic-spacing-2xl; }
  &--ml-3xl { margin-left: $semantic-spacing-3xl; }
  &--ml-4xl { margin-left: $semantic-spacing-4xl; }
  &--ml-5xl { margin-left: $semantic-spacing-5xl; }
  
  // Visual utilities
  &--rounded {
    border-radius: $semantic-border-radius-md;
  }
  
  &--shadow {
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &--border {
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
  }
}h3xsimport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type BoxSpacing = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
type BoxDisplay = 'block' | 'inline' | 'inline-block' | 'flex' | 'inline-flex' | 'grid' | 'inline-grid';
type BoxPosition = 'static' | 'relative' | 'absolute' | 'fixed' | 'sticky';
type BoxOverflow = 'visible' | 'hidden' | 'scroll' | 'auto';

@Component({
  selector: 'ui-box',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      [ngClass]="getClasses()"
      [style.width]="width"
      [style.height]="height"
      [style.min-width]="minWidth"
      [style.min-height]="minHeight"
      [style.max-width]="maxWidth"
      [style.max-height]="maxHeight"
      [attr.role]="role">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './box.component.scss'
})
export class BoxComponent {
  // Padding variants
  @Input() p?: BoxSpacing; // all sides
  @Input() px?: BoxSpacing; // horizontal (left + right)
  @Input() py?: BoxSpacing; // vertical (top + bottom)
  @Input() pt?: BoxSpacing; // top
  @Input() pr?: BoxSpacing; // right
  @Input() pb?: BoxSpacing; // bottom
  @Input() pl?: BoxSpacing; // left

  // Margin variants
  @Input() m?: BoxSpacing; // all sides
  @Input() mx?: BoxSpacing; // horizontal (left + right)
  @Input() my?: BoxSpacing; // vertical (top + bottom)
  @Input() mt?: BoxSpacing; // top
  @Input() mr?: BoxSpacing; // right
  @Input() mb?: BoxSpacing; // bottom
  @Input() ml?: BoxSpacing; // left

  // Display and layout
  @Input() display?: BoxDisplay;
  @Input() position?: BoxPosition;
  @Input() overflow?: BoxOverflow;

  // Dimensions
  @Input() width?: string;
  @Input() height?: string;
  @Input() minWidth?: string;
  @Input() minHeight?: string;
  @Input() maxWidth?: string;
  @Input() maxHeight?: string;

  // Visual
  @Input() rounded = false;
  @Input() shadow = false;
  @Input() border = false;

  // Accessibility
  @Input() role?: string;

  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {
      'ui-box': true
    };

    // Display
    if (this.display) {
      classes[`ui-box--display-${this.display}`] = true;
    }

    // Position
    if (this.position && this.position !== 'static') {
      classes[`ui-box--position-${this.position}`] = true;
    }

    // Overflow
    if (this.overflow && this.overflow !== 'visible') {
      classes[`ui-box--overflow-${this.overflow}`] = true;
    }

    // Padding classes
    if (this.p) classes[`ui-box--p-${this.p}`] = true;
    if (this.px) classes[`ui-box--px-${this.px}`] = true;
    if (this.py) classes[`ui-box--py-${this.py}`] = true;
    if (this.pt) classes[`ui-box--pt-${this.pt}`] = true;
    if (this.pr) classes[`ui-box--pr-${this.pr}`] = true;
    if (this.pb) classes[`ui-box--pb-${this.pb}`] = true;
    if (this.pl) classes[`ui-box--pl-${this.pl}`] = true;

    // Margin classes
    if (this.m) classes[`ui-box--m-${this.m}`] = true;
    if (this.mx) classes[`ui-box--mx-${this.mx}`] = true;
    if (this.my) classes[`ui-box--my-${this.my}`] = true;
    if (this.mt) classes[`ui-box--mt-${this.mt}`] = true;
    if (this.mr) classes[`ui-box--mr-${this.mr}`] = true;
    if (this.mb) classes[`ui-box--mb-${this.mb}`] = true;
    if (this.ml) classes[`ui-box--ml-${this.ml}`] = true;

    // Visual styles
    if (this.rounded) classes['ui-box--rounded'] = true;
    if (this.shadow) classes['ui-box--shadow'] = true;
    if (this.border) classes['ui-box--border'] = true;

    return classes;
  }
}g-x#FCenterAxis = 'both' | 'horizontal' | 'vertical';
type CenterMaxWidth =5full' | 'none';
type Center3 centermax-width]="customM`/	customMinhcenter!CenterComponent {
  @Input() axis: CenterAxis = 'both';
  @Input() maxWidth: CenterMaxWidth = 'none';
  @Input() padding?: Cent^erSpacing;
  @Input() margin?: CenterSpacing;
  @Input() inline = false;
  @Input() customMaxW>
customMinHYas^center': true,
      [`ui-center--${this.axis}`]: true
    };

    if (this.maxWidth !== 'none	!center--max-width-${this.maxWidthN
if (this.padding	center--padding-${this.paddingN
if (this.margin	center--margin-${this.marginN
4if (this.inline) {
      classes['ui-center--inline'P
wm"x  export * from './box.component';x hml2;,Ն>ǿ,|$Cxv@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-breakpoint-container {
  position: relative;
  display: block;
  
  // Base visibility - show by default
  &:not(.ui-breakpoint-container--hidden) {
    display: block;
  }
  
  &--hidden {
    display: none !important;
  }
  
  // Show only on mobile (below tablet)
  &--mobile-only {
    display: block;
    
    @media (min-width: $semantic-breakpoint-md) {
      display: none !important;
    }
  }
  
  // Hide on mobile
  &--mobile-hidden {
    display: none;
    
    @media (min-width: $semantic-breakpoint-md) {
      display: block;
    }
  }
  
  // Show only on tablet (between mobile and desktop)
  &--tablet-only {
    display: none;
    
    @media (min-width: $semantic-breakpoint-md) and (max-width: $semantic-breakpoint-lg - 1px) {
      display: block;
    }
  }
  
  // Hide on tablet
  &--tablet-hidden {
    display: block;
    
    @media (min-width: $semantic-breakpoint-md) and (max-width: $semantic-breakpoint-lg - 1px) {
      display: none !important;
    }
  }
  
  // Show only on desktop and up
  &--desktop-only {
    display: none;
    
    @media (min-width: $semantic-breakpoint-lg) {
      display: block;
    }
  }
  
  // Hide on desktop and up
  &--desktop-hidden {
    display: block;
    
    @media (min-width: $semantic-breakpoint-lg) {
      display: none !important;
    }
  }
  
  // Custom breakpoint utilities
  &--show-sm {
    display: none;
    
    @media (min-width: $semantic-breakpoint-sm) {
      display: block;
    }
  }
  
  &--hide-sm {
    display: block;
    
    @media (min-width: $semantic-breakpoint-sm) {
      display: none !important;
    }
  }
  
  &--show-md {
    display: none;
    
    @media (min-width: $semantic-breakpoint-md) {
      display: block;
    }
  }
  
  &--hide-md {
    display: block;
    
    @media (min-width: $semantic-breakpoint-md) {
      display: none !important;
    }
  }
  
  &--show-lg {
    display: none;
    
    @media (min-width: $semantic-breakpoint-lg) {
      display: block;
    }
  }
  
  &--hide-lg {
    display: block;
    
    @media (min-width: $semantic-breakpoint-lg) {
      display: none !important;
    }
  }
  
  // Screen size based visibility using semantic sizing breakpoints
  &--mobile-screen {
    display: block;
    
    @media (min-width: $semantic-sizing-breakpoint-tablet) {
      display: none !important;
    }
  }
  
  &--tablet-screen {
    display: none;
    
    @media (min-width: $semantic-sizing-breakpoint-tablet) and (max-width: $semantic-sizing-breakpoint-desktop - 1px) {
      display: block;
    }
  }
  
  &--desktop-screen {
    display: none;
    
    @media (min-width: $semantic-sizing-breakpoint-desktop) {
      display: block;
    }
  }
  
  // Combination utilities - show/hide between specific ranges
  &--sm-to-md {
    display: none;
    
    @media (min-width: $semantic-breakpoint-sm) and (max-width: $semantic-breakpoint-md - 1px) {
      display: block;
    }
  }
  
  &--md-to-lg {
    display: none;
    
    @media (min-width: $semantic-breakpoint-md) and (max-width: $semantic-breakpoint-lg - 1px) {
      display: block;
    }
  }
  
  // Inline display variant
  &--inline {
    display: inline;
    
    &.ui-breakpoint-container--hidden {
      display: none !important;
    }
    
    &.ui-breakpoint-container--mobile-only {
      display: inline;
      
      @media (min-width: $semantic-breakpoint-md) {
        display: none !important;
      }
    }
    
    &.ui-breakpoint-container--desktop-only {
      display: none;
      
      @media (min-width: $semantic-breakpoint-lg) {
        display: inline;
      }
    }
  }
  
  // Flex display variant
  &--flex {
    display: flex;
    
    &.ui-breakpoint-container--hidden {
      display: none !important;
    }
    
    &.ui-breakpoint-container--mobile-only {
      display: flex;
      
      @media (min-width: $semantic-breakpoint-md) {
        display: none !important;
      }
    }
    
    &.ui-breakpoint-container--desktop-only {
      display: none;
      
      @media (min-width: $semantic-breakpoint-lg) {
        display: flex;
      }
    }
  }
  
  // Print media query
  @media print {
    &--print-hidden {
      display: none !important;
    }
    
    &--print-only {
      display: block;
    }
    
    &:not(.ui-breakpoint-container--print-only) {
      &.ui-breakpoint-container--print-hidden {
        display: none !important;
      }
    }
  }
}f3Jx/import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type BreakpointVisibility = 
  | 'always' 
  | 'mobile-only' 
  | 'tablet-only' 
  | 'desktop-only' 
  | 'mobile-hidden' 
  | 'tablet-hidden' 
  | 'desktop-hidden'
  | 'mobile-screen'
  | 'tablet-screen' 
  | 'desktop-screen'
  | 'sm-to-md'
  | 'md-to-lg';

type DisplayType = 'block' | 'inline' | 'flex';

type BreakpointRule = 'show-sm' | 'hide-sm' | 'show-md' | 'hide-md' | 'show-lg' | 'hide-lg';

@Component({
  selector: 'ui-breakpoint-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-breakpoint-container"
      [class]="getComponentClasses()"
      [attr.role]="role"
      [attr.aria-hidden]="getAriaHidden()">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './breakpoint-container.component.scss'
})
export class BreakpointContainerComponent {
  @Input() visibility: BreakpointVisibility = 'always';
  @Input() displayType: DisplayType = 'block';
  @Input() showSm = false;
  @Input() hideSm = false;
  @Input() showMd = false;
  @Input() hideMd = false;
  @Input() showLg = false;
  @Input() hideLg = false;
  @Input() printHidden = false;
  @Input() printOnly = false;
  @Input() role?: string;

  getComponentClasses(): string {
    const classes = ['ui-breakpoint-container'];
    
    if (this.visibility !== 'always') {
      classes.push(`ui-breakpoint-container--${this.visibility}`);
    }
    
    if (this.displayType !== 'block') {
      classes.push(`ui-breakpoint-container--${this.displayType}`);
    }
    
    if (this.printHidden) {
      classes.push('ui-breakpoint-container--print-hidden');
    }
    
    if (this.printOnly) {
      classes.push('ui-breakpoint-container--print-only');
    }
    
    // Add breakpoint rule classes
    const breakpointRules = this.getBreakpointRuleClasses();
    Object.keys(breakpointRules).forEach(className => {
      if (breakpointRules[className]) {
        classes.push(className);
      }
    });
    
    return classes.join(' ');
  }

  getBreakpointRuleClasses(): Record<string, boolean> {
    return {
      'ui-breakpoint-container--show-sm': this.showSm,
      'ui-breakpoint-container--hide-sm': this.hideSm,
      'ui-breakpoint-container--show-md': this.showMd,
      'ui-breakpoint-container--hide-md': this.hideMd,
      'ui-breakpoint-container--show-lg': this.showLg,
      'ui-breakpoint-container--hide-lg': this.hideLg
    };
  }

  getAriaHidden(): string | null {
    // Don't set aria-hidden for content that might be visible
    if (this.visibility === 'always') {
      return null;
    }
    
    // For screen readers, we generally want to keep content accessible
    // unless it's explicitly meant to be hidden for print or specific contexts
    if (this.printOnly) {
      return 'true';
    }
    
    return null;
  }
}Z^x ~Mx&3NI̤̜̒X[%WAVA=1<X]KszS2r+C*R'ǳcQYPWTzyUTpy  .Kmvd`|]|!>f q$Gx1 export * from './breakpoint-container.component';+粜x	=@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-center {
  // Base structure - centering container
  display: flex;
  box-sizing: border-box;
  
  // Both axis centering (default)
  &--both {
    align-items: center;
    justify-content: center;
    flex-direction: column;
  }
  
  // Horizontal centering only
  &--horizontal {
    justify-content: center;
    flex-direction: row;
  }
  
  // Vertical centering only  
  &--vertical {
    align-items: center;
    flex-direction: column;
  }
  
  // Inline variant
  &--inline {
    display: inline-flex;
  }
  
  // Max width constraints
  &--max-width-xs {
    max-width: 475px;
  }
  
  &--max-width-sm {
    max-width: 640px;
  }
  
  &--max-width-md {
    max-width: 768px;
  }
  
  &--max-width-lg {
    max-width: 1024px;
  }
  
  &--max-width-xl {
    max-width: 1280px;
  }
  
  &--max-width-2xl {
    max-width: 1536px;
  }
  
  &--max-width-3xl {
    max-width: 1792px;
  }
  
  &--max-width-full {
    width: 100%;
  }
  
  // Padding variants
  &--padding-xs {
    padding: $semantic-spacing-component-xs;
  }
  
  &--padding-sm {
    padding: $semantic-spacing-component-sm;
  }
  
  &--padding-md {
    padding: $semantic-spacing-component-md;
  }
  
  &--padding-lg {
    padding: $semantic-spacing-component-lg;
  }
  
  &--padding-xl {
    padding: $semantic-spacing-component-xl;
  }
  
  &--padding-none {
    padding: 0;
  }
  
  // Margin variants
  &--margin-xs {
    margin: $semantic-spacing-component-xs;
  }
  
  &--margin-sm {
    margin: $semantic-spacing-component-sm;
  }
  
  &--margin-md {
    margin: $semantic-spacing-component-md;
  }
  
  &--margin-lg {
    margin: $semantic-spacing-component-lg;
  }
  
  &--margin-xl {
    margin: $semantic-spacing-component-xl;
  }
  
  &--margin-none {
    margin: 0;
  }
  
  // Responsive adjustments - ensure centering works on all screen sizes
  @media (max-width: 768px) {
    &--max-width-xl,
    &--max-width-lg {
      max-width: 100%;
      padding-left: $semantic-spacing-component-sm;
      padding-right: $semantic-spacing-component-sm;
    }
    
    // Stack content vertically on smaller screens for horizontal centering
    &--horizontal {
      flex-direction: column;
      align-items: center;
    }
  }
  
  @media (max-width: 480px) {
    &--max-width-md,
    &--max-width-sm {
      max-width: 100%;
      padding-left: $semantic-spacing-component-xs;
      padding-right: $semantic-spacing-component-xs;
    }
  }
}Aسx# export * from './center.component';Ix^
@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-column {
  // Core column container
  box-sizing: border-box;
  
  // Column count variants
  &--count-1 {
    column-count: 1;
  }
  
  &--count-2 {
    column-count: 2;
  }
  
  &--count-3 {
    column-count: 3;
  }
  
  &--count-4 {
    column-count: 4;
  }
  
  &--count-5 {
    column-count: 5;
  }
  
  &--count-6 {
    column-count: 6;
  }
  
  &--count-auto {
    column-count: auto;
  }
  
  // Gap variants using semantic spacing tokens
  &--gap-xs {
    column-gap: $semantic-spacing-component-xs;
  }
  
  &--gap-sm {
    column-gap: $semantic-spacing-component-sm;
  }
  
  &--gap-md {
    column-gap: $semantic-spacing-component-md;
  }
  
  &--gap-lg {
    column-gap: $semantic-spacing-component-lg;
  }
  
  &--gap-xl {
    column-gap: $semantic-spacing-component-xl;
  }
  
  // Column fill variants
  &--fill-auto {
    column-fill: auto;
  }
  
  &--fill-balance {
    column-fill: balance;
  }
  
  &--fill-balance-all {
    column-fill: balance-all;
  }
  
  // Column rule variants
  &--rule-solid {
    column-rule-style: solid;
    column-rule-color: $semantic-color-border-secondary;
  }
  
  &--rule-dashed {
    column-rule-style: dashed;
    column-rule-color: $semantic-color-border-secondary;
  }
  
  &--rule-dotted {
    column-rule-style: dotted;
    column-rule-color: $semantic-color-border-secondary;
  }
  
  // Rule width variants
  &--rule-width-1 {
    column-rule-width: $semantic-border-width-1;
  }
  
  &--rule-width-2 {
    column-rule-width: $semantic-border-width-2;
  }
  
  &--rule-width-3 {
    column-rule-width: 3px; // No semantic token for 3px, using fallback
  }
  
  // Column span control
  &--span-all {
    * {
      column-span: all;
    }
  }
  
  // Size variants
  &--full-width {
    width: 100%;
  }
  
  &--full-height {
    height: 100%;
  }
  
  // Responsive behavior
  &--responsive {
    // Single column on small screens
    @media (max-width: calc(768px - 1px)) {
      column-count: 1 !important;
    }
    
    // Reduce column count on medium screens
    @media (max-width: calc(1024px - 1px)) and (min-width: 768px) {
      &.ui-column--count-6 {
        column-count: 3;
      }
      
      &.ui-column--count-5 {
        column-count: 3;
      }
      
      &.ui-column--count-4 {
        column-count: 2;
      }
    }
  }
  
  // Prevent orphans and widows for better text flow
  p, li, div {
    break-inside: avoid-column;
    page-break-inside: avoid;
  }
  
  // Headings should not be orphaned
  h1, h2, h3, h4, h5, h6 {
    break-after: avoid-column;
    page-break-after: avoid;
  }
}x/	import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type ColumnCount = '1' | '2' | '3' | '4' | '5' | '6' | 'auto';
type ColumnGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
type ColumnFill = 'auto' | 'balance' | 'balance-all';
type ColumnRule = 'none' | 'solid' | 'dashed' | 'dotted';
type ColumnRuleWidth = '1' | '2' | '3';

@Component({
  selector: 'ui-column',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      [ngClass]="getClasses()"
      [attr.role]="role">
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './column.component.scss'
})
export class ColumnComponent {
  // Column layout properties
  @Input() count: ColumnCount = '2';
  @Input() gap: ColumnGap = 'md';
  @Input() fill: ColumnFill = 'balance';
  
  // Column rule (divider) properties
  @Input() rule: ColumnRule = 'none';
  @Input() ruleWidth: ColumnRuleWidth = '1';
  
  // Column span control
  @Input() spanAll = false;
  
  // Size variants
  @Input() fullWidth = false;
  @Input() fullHeight = false;
  
  // Responsive breakpoint control
  @Input() responsive = true;
  
  // Accessibility
  @Input() role?: string;

  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {
      'ui-column': true
    };

    // Column count
    if (this.count) {
      classes[`ui-column--count-${this.count}`] = true;
    }

    // Gap
    if (this.gap) {
      classes[`ui-column--gap-${this.gap}`] = true;
    }

    // Fill
    if (this.fill) {
      classes[`ui-column--fill-${this.fill}`] = true;
    }

    // Rule
    if (this.rule && this.rule !== 'none') {
      classes[`ui-column--rule-${this.rule}`] = true;
      
      if (this.ruleWidth) {
        classes[`ui-column--rule-width-${this.ruleWidth}`] = true;
      }
    }

    // Span all
    if (this.spanAll) {
      classes['ui-column--span-all'] = true;
    }

    // Size variants
    if (this.fullWidth) {
      classes['ui-column--full-width'] = true;
    }
    
    if (this.fullHeight) {
      classes['ui-column--full-height'] = true;
    }

    // Responsive
    if (this.responsive) {
      classes['ui-column--responsive'] = true;
    }

    return classes;
  }
}ߩPx# export * from './column.component';ܬV_x   '@Df+6u&x)O/PO;ݲx=@use '../../../../../../shared-ui/src/styles/semantic/index' as *;

.ui-container {
  display: block;
  position: relative;
  width: 100%;
  margin-left: auto;
  margin-right: auto;
  
  // Base padding
  padding-left: $semantic-spacing-component-md;
  padding-right: $semantic-spacing-component-md;
  
  // Size variants
  &--xs {
    max-width: 475px;
  }
  
  &--sm {
    max-width: 640px;
  }
  
  &--md {
    max-width: 768px;
  }
  
  &--lg {
    max-width: 1024px;
  }
  
  &--xl {
    max-width: 1280px;
  }
  
  &--2xl {
    max-width: 1536px;
  }
  
  &--3xl {
    max-width: 1792px;
  }
  
  &--4xl {
    max-width: 1920px;
  }
  
  &--full {
    max-width: none;
  }
  
  // Padding variants
  &--padding-xs {
    padding-left: $semantic-spacing-component-xs;
    padding-right: $semantic-spacing-component-xs;
  }
  
  &--padding-sm {
    padding-left: $semantic-spacing-component-sm;
    padding-right: $semantic-spacing-component-sm;
  }
  
  &--padding-md {
    padding-left: $semantic-spacing-component-md;
    padding-right: $semantic-spacing-component-md;
  }
  
  &--padding-lg {
    padding-left: $semantic-spacing-component-lg;
    padding-right: $semantic-spacing-component-lg;
  }
  
  &--padding-xl {
    padding-left: $semantic-spacing-component-xl;
    padding-right: $semantic-spacing-component-xl;
  }
  
  &--padding-none {
    padding-left: 0;
    padding-right: 0;
  }
  
  // Vertical padding variants
  &--padding-y-xs {
    padding-top: $semantic-spacing-component-xs;
    padding-bottom: $semantic-spacing-component-xs;
  }
  
  &--padding-y-sm {
    padding-top: $semantic-spacing-component-sm;
    padding-bottom: $semantic-spacing-component-sm;
  }
  
  &--padding-y-md {
    padding-top: $semantic-spacing-component-md;
    padding-bottom: $semantic-spacing-component-md;
  }
  
  &--padding-y-lg {
    padding-top: $semantic-spacing-component-lg;
    padding-bottom: $semantic-spacing-component-lg;
  }
  
  &--padding-y-xl {
    padding-top: $semantic-spacing-component-xl;
    padding-bottom: $semantic-spacing-component-xl;
  }
  
  &--padding-y-none {
    padding-top: 0;
    padding-bottom: 0;
  }
  
  // Background variants
  &--surface {
    background: $semantic-color-surface-primary;
  }
  
  &--surface-secondary {
    background: $semantic-color-surface-secondary;
  }
  
  &--surface-elevated {
    background: $semantic-color-surface-elevated;
  }
  
  &--transparent {
    background: transparent;
  }
  
  // Visual variants
  &--card {
    background: $semantic-color-surface-primary;
    border-radius: $semantic-border-radius-md;
    box-shadow: $semantic-shadow-elevation-1;
    border: 1px solid $semantic-color-border-subtle;
    
    padding: $semantic-spacing-container-card-padding;
    
    &.ui-container--padding-lg {
      padding: $semantic-spacing-container-card-padding-lg;
    }
  }
  
  &--section {
    padding-top: $semantic-spacing-layout-section-sm;
    padding-bottom: $semantic-spacing-layout-section-sm;
  }
  
  &--hero {
    padding-top: $semantic-spacing-layout-section-lg;
    padding-bottom: $semantic-spacing-layout-section-lg;
    text-align: center;
  }
  
  // Flex container variants
  &--flex {
    display: flex;
    flex-direction: column;
    gap: $semantic-spacing-stack-md;
    
    &.ui-container--flex-row {
      flex-direction: row;
    }
    
    &.ui-container--flex-center {
      align-items: center;
      justify-content: center;
    }
    
    &.ui-container--flex-between {
      justify-content: space-between;
    }
    
    &.ui-container--flex-around {
      justify-content: space-around;
    }
    
    &.ui-container--flex-evenly {
      justify-content: space-evenly;
    }
    
    &.ui-container--flex-start {
      align-items: flex-start;
      justify-content: flex-start;
    }
    
    &.ui-container--flex-end {
      align-items: flex-end;
      justify-content: flex-end;
    }
  }
  
  // Grid container variants
  &--grid {
    display: grid;
    gap: $semantic-spacing-grid-gap-md;
    
    &.ui-container--grid-2 {
      grid-template-columns: repeat(2, 1fr);
    }
    
    &.ui-container--grid-3 {
      grid-template-columns: repeat(3, 1fr);
    }
    
    &.ui-container--grid-4 {
      grid-template-columns: repeat(4, 1fr);
    }
    
    &.ui-container--grid-auto {
      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    }
  }
  
  // Centered content
  &--centered {
    text-align: center;
    
    &.ui-container--flex {
      align-items: center;
      justify-content: center;
    }
  }
  
  // Responsive behavior
  @media (max-width: 768px) {
    &--responsive {
      padding-left: $semantic-spacing-component-sm;
      padding-right: $semantic-spacing-component-sm;
      
      &.ui-container--card {
        border-radius: $semantic-border-radius-sm;
        padding: $semantic-spacing-component-sm;
      }
      
      &.ui-container--section {
        padding-top: $semantic-spacing-layout-section-xs;
        padding-bottom: $semantic-spacing-layout-section-xs;
      }
      
      &.ui-container--hero {
        padding-top: $semantic-spacing-layout-section-sm;
        padding-bottom: $semantic-spacing-layout-section-sm;
      }
      
      &.ui-container--grid-4,
      &.ui-container--grid-3 {
        grid-template-columns: repeat(2, 1fr);
      }
      
      &.ui-container--flex-row {
        flex-direction: column;
      }
    }
  }
  
  @media (max-width: 480px) {
    &--responsive {
      padding-left: $semantic-spacing-component-xs;
      padding-right: $semantic-spacing-component-xs;
      
      &.ui-container--grid-4,
      &.ui-container--grid-3,
      &.ui-container--grid-2 {
        grid-template-columns: 1fr;
      }
    }
  }
  
  // Constrain content width while maintaining container responsiveness
  &--prose {
    max-width: 65ch;
  }
  
  // Scrollable container
  &--scrollable {
    overflow-y: auto;
    
    &.ui-container--scrollable-x {
      overflow-x: auto;
      overflow-y: visible;
    }
    
    &.ui-container--scrollable-both {
      overflow: auto;
    }
  }
}fXPx;?M@inJjqfznqeqIjD"%+Ғ|k.
̪̼t+ (%H(4q3PDfl }[x߯?A8#(5E4sF8 Kx
import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type ContainerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | 'full';
type ContainerPadding = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'none';
type ContainerVariant = 'default' | 'card' | 'section' | 'hero' | 'flex' | 'grid' | 'centered' | 'prose';
type ContainerBackground = 'transparent' | 'surface' | 'surface-secondary' | 'surface-elevated';
type FlexDirection = 'row' | 'column';
type FlexJustify = 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly';
type GridColumns = 2 | 3 | 4 | 'auto';
type ScrollDirection = 'y' | 'x' | 'both';

@Component({
  selector: 'ui-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-container"
      [class.ui-container--{{size}}]="size"
      [class.ui-container--{{variant}}]="variant !== 'default'"
      [class.ui-container--{{background}}]="background !== 'transparent'"
      [class.ui-container--padding-{{padding}}]="padding"
      [class.ui-container--padding-y-{{paddingY}}]="paddingY"
      [class.ui-container--flex-{{flexDirection}}]="flexDirection && variant === 'flex'"
      [class.ui-container--flex-{{flexJustify}}]="flexJustify && variant === 'flex'"
      [class.ui-container--grid-{{gridColumns}}]="gridColumns && variant === 'grid'"
      [class.ui-container--scrollable]="scrollable === 'y'"
      [class.ui-container--scrollable-x]="scrollable === 'x'"
      [class.ui-container--scrollable-both]="scrollable === 'both'"
      [class.ui-container--responsive]="responsive"
      [style.max-width]="customMaxWidth"
      [style.min-height]="customMinHeight"
      [style.max-height]="customMaxHeight"
      [attr.role]="role">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './container.component.scss'
})
export class ContainerComponent {
  @Input() size: ContainerSize = 'lg';
  @Input() variant: ContainerVariant = 'default';
  @Input() background: ContainerBackground = 'transparent';
  @Input() padding?: ContainerPadding;
  @Input() paddingY?: ContainerPadding;
  @Input() flexDirection?: FlexDirection;
  @Input() flexJustify?: FlexJustify;
  @Input() gridColumns?: GridColumns;
  @Input() scrollable?: ScrollDirection;
  @Input() responsive = true;
  @Input() customMaxWidth?: string;
  @Input() customMinHeight?: string;
  @Input() customMaxHeight?: string;
  @Input() role?: string;
}\)N x[ngClass]="getClasses()I
  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {
      'ui-container': true,
      [`ui-container--${this.size}`]: true,
      'ui-container--responsive': this.responsive
    };

    if (this.variant !== 'default'O) {
      classes[`ui-container--${this.variant}`] = true;
    }

    if (this.?) {
      classes[`ui-container--${this.background}`] = true;
    }

    if (this.padding) {
      classes[`ui-container--padding-${this.padding}`] = true;
    }

    if (this.paddingY) {
      classes[`ui-container--padding-y-${this.paddingY}`] = true;
    }

    if (this.flexDirection && this.variant === 'flex') {
      classes[`ui-container--flex-${this.flexDirection}`] = true;
    }

    if (this.flexJustify && this.variant === 'flex') {
      classes[`ui-container--flex-${this.flexJustify}`] = true;
    }

    if (this.gridColumns && this.variant === 'grid') {
      classes[`ui-container--grid-${this.gridColumns}`] = true;:
    }

    if (this.scrollable === 'y') {
      classes['!D'] = true;
    } else if (this.scrollable === 'x') {
      classes['!'] = true;
    } else if (this.) {
      classes['!/both'] = true;
    }

    return classes;
  }
}x& export * from './container.component';Nx=import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type DashboardVariant = 'default' | 'bordered' | 'elevated';
type SidebarWidth = 'sm' | 'md' | 'lg';
type HeaderHeight = 'sm' | 'md' | 'lg';
type FooterVariant = 'minimal' | 'standard' | 'detailed';

@Component({
  selector: 'ui-dashboard-shell',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-dashboard-shell"
      [class.ui-dashboard-shell--sidebar-collapsed]="sidebarCollapsed"
      [class.ui-dashboard-shell--mobile-menu-open]="mobileMenuOpen"
      [class.ui-dashboard-shell--bordered]="variant === 'bordered'"
      [class.ui-dashboard-shell--elevated]="variant === 'elevated'"
      [class.ui-dashboard-shell--no-footer]="!showFooter"
      [attr.role]="role">
      
      <!-- Mobile Backdrop -->
      @if (mobileMenuOpen) {
        <div 
          class="ui-dashboard-shell__mobile-backdrop"
          (click)="handleMobileBackdropClick()"
          role="presentation"
          aria-hidden="true">
        </div>
      }
      
      <!-- Header -->
      <header 
        class="ui-dashboard-shell__header"
        [class.ui-dashboard-shell__header--sm]="headerHeight === 'sm'"
        [class.ui-dashboard-shell__header--md]="headerHeight === 'md'"
        [class.ui-dashboard-shell__header--lg]="headerHeight === 'lg'"
        role="banner">
        
        <!-- Mobile Menu Toggle -->
        <button
          class="ui-dashboard-shell__mobile-toggle"
          (click)="handleMobileToggle()"
          [attr.aria-expanded]="mobileMenuOpen"
          [attr.aria-label]="mobileMenuOpen ? 'Close menu' : 'Open menu'"
          type="button">
          <span class="ui-dashboard-shell__mobile-toggle-icon" aria-hidden="true">
            @if (mobileMenuOpen) {
              ✕
            } @else {
              ☰
            }
          </span>
        </button>
        
        <!-- Header Content -->
        <div class="ui-dashboard-shell__header-content">
          <ng-content select="[slot='header']"></ng-content>
        </div>
        
        <!-- Header Actions (Theme Switcher, Notifications, etc.) -->
        <div class="ui-dashboard-shell__header-actions">
          <ng-content select="[slot='header-actions']"></ng-content>
        </div>
      </header>
      
      <!-- Main Container -->
      <div class="ui-dashboard-shell__container">
        
        <!-- Sidebar -->
        <aside 
          class="ui-dashboard-shell__sidebar"
          [class.ui-dashboard-shell__sidebar--sm]="sidebarWidth === 'sm'"
          [class.ui-dashboard-shell__sidebar--md]="sidebarWidth === 'md'"
          [class.ui-dashboard-shell__sidebar--lg]="sidebarWidth === 'lg'"
          [class.ui-dashboard-shell__sidebar--collapsed]="sidebarCollapsed"
          [attr.aria-hidden]="sidebarCollapsed && !mobileMenuOpen"
          [attr.aria-expanded]="!sidebarCollapsed || mobileMenuOpen"
          role="navigation"
          [attr.aria-label]="sidebarLabel">
          
          <ng-content select="[slot='sidebar']"></ng-content>
        </aside>
        
        <!-- Main Content Area -->
        <main 
          class="ui-dashboard-shell__main"
          role="main"
          [attr.aria-label]="mainContentLabel">
          
          <!-- Breadcrumbs Area -->
          @if (showBreadcrumbs) {
            <nav 
              class="ui-dashboard-shell__breadcrumbs"
              [attr.aria-label]="breadcrumbsLabel"
              role="navigation">
              <ng-content select="[slot='breadcrumbs']"></ng-content>
            </nav>
          }
          
          <!-- Notifications Area -->
          @if (showNotifications) {
            <div 
              class="ui-dashboard-shell__notifications"
              [attr.aria-live]="notificationsLive ? 'polite' : null"
              role="status">
              <ng-content select="[slot='notifications']"></ng-content>
            </div>
          }
          
          <!-- Main Content -->
          <div 
            class="ui-dashboard-shell__content"
            [attr.aria-label]="contentLabel">
            <ng-content></ng-content>
          </div>
        </main>
      </div>
      
      <!-- Footer -->
      @if (showFooter) {
        <footer 
          class="ui-dashboard-shell__footer"
          [class.ui-dashboard-shell__footer--minimal]="footerVariant === 'minimal'"
          [class.ui-dashboard-shell__footer--standard]="footerVariant === 'standard'"
          [class.ui-dashboard-shell__footer--detailed]="footerVariant === 'detailed'"
          role="contentinfo"
          [attr.aria-label]="footerLabel">
          
          <ng-content select="[slot='footer']"></ng-content>
        </footer>
      }
    </div>
  `,
  styleUrl: './dashboard-shell.component.scss'
})
export class DashboardShellComponent {
  @Input() variant: DashboardVariant = 'default';
  @Input() sidebarWidth: SidebarWidth = 'md';
  @Input() headerHeight: HeaderHeight = 'md';
  @Input() footerVariant: FooterVariant = 'standard';
  @Input() sidebarCollapsed = false;
  @Input() mobileMenuOpen = false;
  @Input() showFooter = true;
  @Input() showBreadcrumbs = true;
  @Input() showNotifications = true;
  @Input() notificationsLive = true;
  @Input() enableMobileBackdropClose = true;
  @Input() role = 'application';
  
  // ARIA Labels
  @Input() sidebarLabel = 'Main navigation';
  @Input() mainContentLabel = 'Main content';
  @Input() breadcrumbsLabel = 'Breadcrumb navigation';
  @Input() contentLabel = 'Page content';
  @Input() footerLabel = 'Site footer';
  
  // Events
  @Output() sidebarToggled = new EventEmitter<boolean>();
  @Output() mobileMenuToggled = new EventEmitter<boolean>();
  @Output() mobileBackdropClicked = new EventEmitter<void>();
  
  handleMobileToggle(): void {
    const newState = !this.mobileMenuOpen;
    this.mobileMenuToggled.emit(newState);
  }
  
  handleMobileBackdropClick(): void {
    if (this.enableMobileBackdropClose) {
      this.mobileBackdropClicked.emit();
    }
  }
  
  handleSidebarToggle(): void {
    const newState = !this.sidebarCollapsed;
    this.sidebarToggled.emit(newState);
  }
}xF export { DashboardShellComponent } from './dashboard-shell.component';h%x    ScQK;MxE@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-divider {
  display: flex;
  align-items: center;
  position: relative;
  
  // Horizontal divider (default)
  &--horizontal {
    width: 100%;
    flex-direction: row;
    
    &::before,
    &::after {
      content: '';
      flex: 1;
      height: $semantic-border-width-1;
      background-color: $semantic-color-border-primary;
    }
    
    // Thickness variants for horizontal
    &.ui-divider--thin {
      &::before,
      &::after {
        height: $semantic-border-width-1;
      }
    }
    
    &.ui-divider--thick {
      &::before,
      &::after {
        height: $semantic-border-width-2;
      }
    }
    
    // Style variants for horizontal
    &.ui-divider--dashed {
      &::before,
      &::after {
        background: none;
        border-top: $semantic-border-width-1 dashed $semantic-color-border-primary;
        height: 0;
      }
      
      &.ui-divider--thin {
        &::before,
        &::after {
          border-top-width: $semantic-border-width-1;
        }
      }
      
      &.ui-divider--thick {
        &::before,
        &::after {
          border-top-width: $semantic-border-width-2;
        }
      }
    }
    
    &.ui-divider--dotted {
      &::before,
      &::after {
        background: none;
        border-top: $semantic-border-width-1 dotted $semantic-color-border-primary;
        height: 0;
      }
      
      &.ui-divider--thin {
        &::before,
        &::after {
          border-top-width: $semantic-border-width-1;
        }
      }
      
      &.ui-divider--thick {
        &::before,
        &::after {
          border-top-width: $semantic-border-width-2;
        }
      }
    }
  }
  
  // Vertical divider
  &--vertical {
    height: 100%;
    min-height: $semantic-spacing-layout-lg;
    flex-direction: column;
    width: $semantic-border-width-1;
    background-color: $semantic-color-border-primary;
    
    // Thickness variants for vertical
    &.ui-divider--thin {
      width: $semantic-border-width-1;
    }
    
    &.ui-divider--thick {
      width: $semantic-border-width-2;
    }
    
    // Style variants for vertical
    &.ui-divider--dashed {
      background: none;
      border-left: $semantic-border-width-1 dashed $semantic-color-border-primary;
      width: 0;
      
      &.ui-divider--thin {
        border-left-width: $semantic-border-width-1;
      }
      
      &.ui-divider--thick {
        border-left-width: $semantic-border-width-2;
      }
    }
    
    &.ui-divider--dotted {
      background: none;
      border-left: $semantic-border-width-1 dotted $semantic-color-border-primary;
      width: 0;
      
      &.ui-divider--thin {
        border-left-width: $semantic-border-width-1;
      }
      
      &.ui-divider--thick {
        border-left-width: $semantic-border-width-2;
      }
    }
  }
  
  // Content styling (only for horizontal dividers)
  &__content {
    padding: 0 $semantic-spacing-component-sm;
    background: $semantic-color-surface-primary;
    color: $semantic-color-text-secondary;
    font-size: $semantic-typography-font-size-sm;
    white-space: nowrap;
    flex-shrink: 0;
  }
  
  // Dark mode support
  :host-context(.dark-theme) & {
    &::before,
    &::after {
      background-color: $semantic-color-border-subtle;
    }
    
    &--vertical {
      background-color: $semantic-color-border-subtle;
    }
    
    &--dashed,
    &--dotted {
      &::before,
      &::after {
        border-color: $semantic-color-border-subtle;
      }
      
      &.ui-divider--vertical {
        border-left-color: $semantic-color-border-subtle;
      }
    }
    
    .ui-divider__content {
      background: $semantic-color-surface-primary;
      color: $semantic-color-text-tertiary;
    }
  }
  
  // Responsive adjustments
  @media (max-width: $semantic-breakpoint-sm - 1) {
    &__content {
      padding: 0 $semantic-spacing-component-xs;
      font-size: $semantic-typography-font-size-xs;
    }
  }
}YIHx%Y~gqFbQjniFI NY`ximport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type DividerOrientation = 'horizontal' | 'vertical';
type DividerVariant = 'solid' | 'dashed' | 'dotted';
type DividerThickness = 'thin' | 'default' | 'thick';

@Component({
  selector: 'ui-divider',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-divider"
      [class.ui-divider--horizontal]="orientation === 'horizontal'"
      [class.ui-divider--vertical]="orientation === 'vertical'"
      [class.ui-divider--solid]="variant === 'solid'"
      [class.ui-divider--dashed]="variant === 'dashed'"
      [class.ui-divider--dotted]="variant === 'dotted'"
      [class.ui-divider--thin]="thickness === 'thin'"
      [class.ui-divider--default]="thickness === 'default'"
      [class.ui-divider--thick]="thickness === 'thick'"
      [attr.role]="'separator'"
      [attr.aria-orientation]="orientation">
      
      @if (hasContent) {
        <span class="ui-divider__content">
          <ng-content></ng-content>
        </span>
      }
    </div>
  `,
  styleUrl: './divider.component.scss'
})
export class DividerComponent {
  @Input() orientation: DividerOrientation = 'horizontal';
  @Input() variant: DividerVariant = 'solid';
  @Input() thickness: DividerThickness = 'default';
  
  get hasContent(): boolean {
    return this.orientation === 'horizontal';
  }
}
:x$ export * from './divider.component';x V,G}<jb"?f*j$x%=@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-supporting-pane-layout {
  // Core Structure
  display: flex;
  position: relative;
  min-height: 100vh;
  width: 100%;
  
  // Layout & Spacing
  gap: 0;
  
  // Visual Design
  background: $semantic-color-surface;
  color: $semantic-color-text-primary;
  
  // Transitions
  transition: all $semantic-motion-duration-normal $semantic-motion-easing-ease;
  
  // Right position variant
  &--position-right {
    flex-direction: row-reverse;
    
    .ui-supporting-pane-layout__pane {
      border-left: $semantic-border-width-1 solid $semantic-color-border-secondary;
      border-right: none;
    }
  }
  
  // Collapsed state
  &--collapsed {
    .ui-supporting-pane-layout__pane {
      width: 60px;
      min-width: 60px;
      
      .ui-supporting-pane-layout__pane-content {
        opacity: 0;
        visibility: hidden;
      }
      
      .ui-supporting-pane-layout__pane-toggle {
        padding: $semantic-spacing-component-xs;
      }
    }
  }
  
  // Sticky positioning
  &--sticky-pane {
    .ui-supporting-pane-layout__pane {
      position: sticky;
      top: 0;
      height: 100vh;
      overflow-y: auto;
    }
  }
  
  // Visual variants
  &--bordered {
    .ui-supporting-pane-layout__pane {
      border-right: $semantic-border-width-1 solid $semantic-color-border-primary;
    }
  }
  
  &--elevated {
    .ui-supporting-pane-layout__pane {
      box-shadow: $semantic-shadow-elevation-2;
      background: $semantic-color-surface-elevated;
    }
  }
  
  &--subtle {
    .ui-supporting-pane-layout__pane {
      background: $semantic-color-surface-secondary;
      border-right: $semantic-border-width-1 solid $semantic-color-border-subtle;
    }
  }
  
  // Size variants
  &--sm {
    .ui-supporting-pane-layout__pane:not(.ui-supporting-pane-layout__pane--collapsed) {
      width: 240px;
      min-width: 240px;
    }
  }
  
  &--md {
    .ui-supporting-pane-layout__pane:not(.ui-supporting-pane-layout__pane--collapsed) {
      width: 320px;
      min-width: 320px;
    }
  }
  
  &--lg {
    .ui-supporting-pane-layout__pane:not(.ui-supporting-pane-layout__pane--collapsed) {
      width: 400px;
      min-width: 400px;
    }
  }
  
  &--xl {
    .ui-supporting-pane-layout__pane:not(.ui-supporting-pane-layout__pane--collapsed) {
      width: 480px;
      min-width: 480px;
    }
  }
  
  // Main Content Element
  &__content {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-width: 0;
    position: relative;
    
    // Layout & Spacing
    padding: $semantic-spacing-component-md;
    
    // Visual Design
    background: $semantic-color-surface;
    color: $semantic-color-text-primary;
    
    // Typography
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    
    // Transitions
    transition: margin $semantic-motion-duration-normal $semantic-motion-easing-ease;
  }
  
  // Supporting Pane Element
  &__pane {
    display: flex;
    flex-direction: column;
    flex-shrink: 0;
    position: relative;
    width: 320px;
    min-width: 320px;
    
    // Layout & Spacing
    padding: 0;
    
    // Visual Design
    background: $semantic-color-surface-secondary;
    border-right: $semantic-border-width-1 solid $semantic-color-border-secondary;
    
    // Typography
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    
    // Transitions
    transition: all $semantic-motion-duration-normal $semantic-motion-easing-ease;
    
    &--collapsed {
      width: 60px;
      min-width: 60px;
    }
  }
  
  // Pane Header Element
  &__pane-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-shrink: 0;
    
    // Layout & Spacing
    padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
    
    // Visual Design
    background: $semantic-color-surface-elevated;
    color: $semantic-color-text-primary;
    
    // Typography
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: $semantic-typography-font-weight-semibold;
    line-height: map-get($semantic-typography-body-medium, line-height);
  }
  
  // Pane Content Element
  &__pane-content {
    display: flex;
    flex-direction: column;
    flex: 1;
    
    // Layout & Spacing
    padding: $semantic-spacing-component-md;
    
    // Visual Design
    background: inherit;
    color: $semantic-color-text-primary;
    
    // Transitions
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    // When collapsed
    .ui-supporting-pane-layout--collapsed & {
      opacity: 0;
      visibility: hidden;
      padding: 0;
    }
  }
  
  // Pane Toggle Button
  &__pane-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    
    // Layout & Spacing
    width: $semantic-sizing-touch-target;
    height: $semantic-sizing-touch-target;
    padding: $semantic-spacing-component-xs;
    
    // Visual Design
    background: transparent;
    border: none;
    border-radius: $semantic-border-radius-sm;
    color: $semantic-color-text-secondary;
    
    // Typography
    font-size: $semantic-sizing-icon-button;
    line-height: 1;
    
    // Transitions
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    cursor: pointer;
    
    // Interactive States
    &:hover {
      background: $semantic-color-interactive-primary;
      color: $semantic-color-text-primary;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    &:active {
      background: $semantic-color-interactive-primary;
      opacity: $semantic-opacity-hover;
    }
    
    // Icon styling
    .fa-icon {
      font-size: inherit;
      transition: transform $semantic-motion-duration-fast $semantic-motion-easing-ease;
    }
    
    // Collapsed state rotation
    .ui-supporting-pane-layout--collapsed & .fa-icon {
      transform: rotate(180deg);
    }
    
    .ui-supporting-pane-layout--position-right & .fa-icon {
      transform: rotate(180deg);
    }
    
    .ui-supporting-pane-layout--position-right.ui-supporting-pane-layout--collapsed & .fa-icon {
      transform: rotate(0deg);
    }
  }
  
  // Pane Footer Element (optional)
  &__pane-footer {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-shrink: 0;
    
    // Layout & Spacing
    padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    border-top: $semantic-border-width-1 solid $semantic-color-border-subtle;
    
    // Visual Design
    background: $semantic-color-surface-elevated;
    color: $semantic-color-text-secondary;
    
    // Typography
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: map-get($semantic-typography-body-small, font-weight);
    line-height: map-get($semantic-typography-body-small, line-height);
  }
  
  // Responsive Design
  @media (max-width: 1024px) {
    &:not(.ui-supporting-pane-layout--always-visible) {
      .ui-supporting-pane-layout__pane {
        position: fixed;
        top: 0;
        right: 0;
        height: 100vh;
        z-index: $semantic-z-index-modal;
        box-shadow: $semantic-shadow-elevation-4;
        transform: translateX(100%);
        
        &:not(.ui-supporting-pane-layout__pane--collapsed) {
          transform: translateX(0);
        }
      }
      
      &.ui-supporting-pane-layout--position-left .ui-supporting-pane-layout__pane {
        left: 0;
        right: auto;
        transform: translateX(-100%);
        
        &:not(.ui-supporting-pane-layout__pane--collapsed) {
          transform: translateX(0);
        }
      }
      
      .ui-supporting-pane-layout__content {
        width: 100%;
        padding: $semantic-spacing-component-sm;
      }
    }
  }
  
  @media (max-width: 768px) {
    .ui-supporting-pane-layout__content {
      padding: $semantic-spacing-component-sm;
    }
    
    .ui-supporting-pane-layout__pane {
      width: 280px !important;
      min-width: 280px !important;
      
      &--collapsed {
        width: 60px !important;
        min-width: 60px !important;
      }
    }
    
    .ui-supporting-pane-layout__pane-content {
      padding: $semantic-spacing-component-sm;
    }
  }
  
  @media (max-width: 480px) {
    .ui-supporting-pane-layout__content {
      padding: $semantic-spacing-component-xs;
    }
    
    .ui-supporting-pane-layout__pane {
      width: 240px !important;
      min-width: 240px !important;
    }
    
    .ui-supporting-pane-layout__pane-content {
      padding: $semantic-spacing-component-xs;
    }
    
    .ui-supporting-pane-layout__pane-header {
      padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    }
    
    .ui-supporting-pane-layout__pane-footer {
      padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    }
  }
}BTPxzKj@use "	9" as *;

.demo-container {
#Alayout-section-md;
  max-width: 1400px;
  margin: 0 auto;

  h2 {/
heading-h2<
heading-h2P<
heading-h2>heading-h2, line-height)Q/margin-bottom!ntent-heading;
  }

  h3 {/
heading-h3<
heading-h3P<
heading-h3>heading-h3, line-height)Q/margin-bottom!md;
  }

  p {4@
Wmargin-bottom!7ntent-paragraph;
  }
}

.demo-section {
  margin-bottom!mlayout-section-lg;

  &:last-child {
    margin-bottom: 0;
  }
}

.demo-variant-container {
  display: flex;
gap!lg;

  @media (min-width: $semantic-breakpoint-lg) {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(400p'x, 1fr));
  }
}

.demo-variant {
  h4 {/
heading-h4<
heading-h4P<
heading-h4>heading-h4, line-height)Q/margin-bottom!$7}
}

.demo-layout-container {
  height: 400px;
  border9	.'lg;
  overflow: hidden;

  &.demo-layout--sm {
    height: 350px;
  }

  &.demo-layout--lg {
    height: 450px;
  }

  &.demo-layout--variant {
    height: 300px;
  }

  &.demo-layout--interactive {
    height: 500px;
  }
}

// Demo List Styles
.demo-list {
  display: flex;
height: 100%;
`&n
  &__]#%]%2E\	
    h4 {
  
.heading-h4, font-family);
  ,,heading-h4, font-size);
  q.heading-h4, font-weight);
  ].heading-h4, line-height)1c  margin: 0;
    }
  }

  &__content {
    flex: 1;
    overflow-y: auto;
  }
}

.demo-list-item {
#'md;
Q)cursor: pointer;
  transition: background1>
  &:hover {
Q(container;
  }

  &--selected { 7border-left: 3px(primary;
  }

  &__content {
    h5 {
  
.heading-h5, font-family);
  ,,heading-h5, font-size);
  q.heading-h5, font-weight);
  ].heading-h5, line-height)1  margin: 0 0$ 0;
    }

    p {
  
3Kfamily);
  ,1Ks1K_1/  margin: 0 0$ G0;
    }
  }

  &__status {
    display: inline-block;
    padding: 2px%./*caption<captionP<caption>Ccaption, line-height);
    text-transform: uppercase;

    &--activK(ccess!on-success;
    }

    &--pendingL%warning#on-warning;
    }

    &--completedl'foLon-info;
    }
  }
}

// Demo Detail Styles
.demo-detail {
  display: flex;
height: 100%;
`&primary;

  &__]#%lg; 7E\	
    h3 {
  
.heading-h3, font-family);
  ,,heading-h3, font-size);
  q.heading-h3, font-weight);
  ].heading-h3, line-height)1(  margin: 0;
    }
  }

  &__category {
#+%%UprimaryQ
on-primary(5*caption<captionP<caption>8caption, line-height);
  }

  &__content {
    flex: 1;
#)6lg;
    overflow-y: auto;

    p {
      margin-bottom!#ntent-paragraph;
    }

    h4 {
  
.heading-h4, font-family);
  ,,heading-h4, font-size);
  q.heading-h4, font-weight);
  ].heading-h4, line-height)1  margin!lg 0@.sm 0;
    }
  }

  &__meta {
    margin-bottom!lg;
#)]U3}6md;

    p {
      margin! xs 0;
      
      strong {
    !@-3  }
    }
  }

  &__description {
    margin-bottom!2lg;
  }

  &__actions {
    display: flex;
    gap!&=flex-wrap: wrap;
  }

  &__stats {
    display: flex;
    gap!'lg;
    flex-wrap: wrap;
    margin-top!)md;
  }
}

.demo-stat {
  display: flex;
gap!xs;

  label {/label<labeO=label>label, line-height)Q"(text-transform: uppercase;
  }

  span {4@
W'9}
}

// Empty State
.demo-empty-state {
  display: flex;
)justify-content: center;
  height: 100%;
#'Mlg;
  text-align: center;

  &__icon {
    font-size: 3rem;
    margin-bottom!md;
  }

  h4 {/
heading-h4<
heading-h4P<
heading-h4>heading-h4, line-height)Q/margin: 0 0@sm 0;
  }

  p {0Omargin: 0;
  }
}

// Interactive Controls
.demo-interactive {
  display: flex;
gap!.lg;
}

.demo-controls {
  display: flex;
  gap!lg;
  flex-wrap: wrap;
#'md;
`&n.'md;

  label3gap!/@
W)cursor: pointer;

    input[type="checkbox"] {
      width: 18px;
      height: 18px;
    }
  }
}

// Buttons
.demo-button {
  display: inline-flex;
justify-content: center;
  gap!xs;
#Uinteractive-button-padding-y $semantic-spacing-interactive-button-padding-x;
  border!transparent;
,"!button-radius;
  cursor: pointer;a-L%

-utton
0)utton-medium, font-size);
`-utton~a+utton
  &--primary {
Q primaryQon-primary;
    border-]primary;

    &:hover {

#*button-hover;
    }
  }

  &--secondary {
Q(primaryQ/border-]Ux1~}
  }

  &--small {
    padding: calc($semantic-spacing-interactive-button-padding-y / 2) $semantic-spacing-interactive-button-
padding-x;0utton-small=uttonJCuttonE4utton-small, line-height);
  }

  &:focus-visible {
2@M}
}

// Event Log
.demo-event-log {
  max-height: 300px;
  overflow-y: auto;
`&n.'md;
#'+md;

  &__item {
    display: flex;
    gap!&#' 0WK
    &:last-child {
      border-bottom: none;
    }
  }

  &__timestamp {
 tertiary;
    font-family03family-mono;
    min-width: 80px;
  }

  &__type {
primaryB"min-width: 100px;
  }

  &__data {0flex: 1;
  }
}

// Responsive adjustments
@media (max-width: calc($semantic-breakpoint-md - 1px)) {
  .demo-variant-container {{2_}

  .demo-layout-container {
    height: 300px;

    &.demo-layout--interactive {
      height
  .demo-controls {!gap!$}
}m=ex.KWOdashboard-shelle"grid;
  grid-template-areas: 
    "header header"
    "sidebar main"
    "footer footer";
  grid-template-rows: auto 1fr auto;
#  grid-template-columns: auto 1fr;
*FVariant: Bordered
  &--bordered {
    .ui-dashboard-shell__header {
  I\"dashboard-shell__sidebar^"dashboard-shell__footer {
  F\// Variant: Elevatedqdashboard-shell__header {

-2;
!dropdown"dashboard-shell__sidebar {

-3;
  !6"dashboard-shell__footer {

-1mSidebar collapsed state
  &--sidebar-collapsed {
    .ui-dashboard-shell__sidebar {
      &--sm, &--md, &--lg""No footer variant
  &--no-footer {
    grid-template-areas: 
      "header header"
      "sidebar main";
    grid-template-rowsj: auto 1fr;
  }
  
  // Mobile menu open state
  &--mobile-menu-open {
    .ui-dashboard-shell__sidebar {
^ 0)3Header Element
  &__header {
    grid-area: header;1#z-index: $semantic-z-index-dropdown@# 
@%gap!].nn??&Height variants
    &--sm {
      min-!input-height-sm;
      padding: 0@!&--md {
      min-!input-height-md;
      padding: 0@%}
    
    &--lg {
      min-!input-height-lg;
      padding: 0@lg;Mobile Toggle Button
  &__mobile-toggle {
    display: none0center@  ^margin-right!&I:utton
Dutton\Dutton~Futton&+L'^K~~;container;
    }
    
    &-icon {
      display: block;
  <size-lg1Header Content
  &__header-content {
    flex: 1;1gap!$,}
  
  // Header Actions
  &__header-actions3gap!$}
  
  // Container for Sidebar and Main
  &__container {
    grid-area: sidebar / sidebar / main / main;
    display: contentsD;
  }
  
  // Sidebar Element
  &__sidebar {
    grid-area: sidebar;{4#z-index: $semantic-z-index-dropdown@# 	#].nn	F// Width variants
    &--sm {
      width: 200px;
      min-width: 200Q/--md {
      width: 280px;
      min-width: 280Q/--lg {
      width: 360px;
      min-width: 360Q~
"!-  overflow: hidden'Mobile Backdrop
  &__mobile-backdrop {
Xtop: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: $semantic-z-index-overlay_,
backdrop;
backdrop*opacity1B(
    // Interactive
    cursor: pointer;Z	'main {
    grid-area: main;{4	min-width=& 	#].
`
9Breadcrumbs Element
  &__breadcrumbs {
    padding-bottom!&margin-bottom!]Y>K#:KUF}
  
  // Notifications Element
  &__notifications {
    margin-bottom!]#%!U$	container(-md;
    border9		}
  
  //k	$flex: 1;{4Nmin-height: 0;
  }
  
  // Footer Element
  &__footer {
    grid-area: footer;UF 	#].nn<FK#:KUFooter variants
    &--minimal!6
,caption, font-family);
  ,,caption, font-size);
  q.caption, font-weight);
  ].caption, line-height);
    }
    
    &--standard {
      // Default styling already applied above
    }
    
    &--detailed {
   $  align-items: flex-start;
      gap!&$'lg - Mobile First!#grid-template-areas: 
      "header"
      "main"
      "footer";
    grid-template-columns: 1fr;
    
    .ui-dashboard-shell_$_mobile-toggle {
      display: flex"dashboard-shell__sidebar {
top: 0;
      left (d $1
      &--sm, &--md, &--lg {
        width: 280px"280px;
      }dashboard-shell__main!E*dashboard-shell__header {
      padding: 0@!  gap!&+  
      &--sm, &--md, &--lg {
        min-#input-height-md;
        padding: 0@!{!dashboard-shell__`%4!  
      &--detailed0]!j#dashboard-shell__main!.#*dashboard-shell__header {
      padding: 0%  gap!1  
      &--sm, &--md, &--lg {
        padding: 0%  }dashboard-shell__`%6  
      &--detailed0!{!Kdashboard-shell__sidebar {
      &--sm, &--md, &--lg {
        width: 100vw"100vw;
      }
    }
  }
}<Fx
K8@use "<" as *;

.ui-feed^1width: 100%;
  height#'
  // Size Vmax-width: 640px;
  }
  
  &--md {
    max-width: 768px;
  }
  
  &--lg {
    max-width: 1024px;
  }
  
  // Loading State
  &-+-loading {
    .ui-feed-layout__container {"aRefresh Enabled
  &--refresh-enabled {
    .ui-feed-layout__container {
      touch-action: pan-y'Refresh Indicator
  &__refresh-indicatoEcenter;
    gap!&#%]%2VU}
  
  &__refresh-spinner {^icon-inlineicon-inline;
    border: 2px*border-top-]primary(-(full;
    animation: ui-feed-layout-spin1slow linear infinite;
  }
  
  // Container
  &__container {
    flex: 1;
    overflow-y: auto;
    overflow-x: hidden;
    scroll-behavior: smooth;
    -webkit-overflow-scrolling: touch;
    
    // Custom scrollbar
    &::-webkit-scrollbar {
      width: 4Q:-webkit-scrollbar-trackL<%}
    
    &::-webkit-scrollbar-thumbL%U,1  
      &:hover {
  O"primaryLoader
  &__loadery6*center;
    gap!&#%lg;
    S%0}
  
  &__loader-spinner {^border: 2px*border-top-]primary(-(full;
    animation: ui-feed-layout-spin1/slow linear infinite;
  }
  
  &__loader-text {U }
  
  // Error State
  &__errory6*center;
    gap!]#%lg;
     7border8error(-md;
    margin!]/@
W;danger;
    text-align: center;
  }
  
  &__retry-button {
#Minteractive-button-padding-y $semantic-spacing-interactive-button-padding-x;
Q dangerQ	on-danger8(button-radius;
    cursor: pointer;
    0utton-small=uttonJCuttonEutton-small*L'
    &:hover:not(:disabled) {8n
disabled {"#disabled;
      cursor: not-allowedEmpty State
  &__emptyy6*center;
#.layout-section-lg;
    min-height: 200px;
    4largeAlargePAlargeClarge, line-height)Q"tertiary;
    text-align: center;
  }
  
  // Refresh Zone (for pull-to-refresh)
  &__refresh-zone {
    position: absolute;
  `  top: 0;
    left: 0;
    right: 0;
    height: 100px;
    z-index: -1;
    
    &--active {
  !6  border-bottom: 2px\B// Animation Keyframes
  @keyframes ui-feed-layout-spin {
    from  to36'2768px) {
    &__loader,
    &__error,
    &__empty!.]}
    
    &__refresh-indicator!6  
  
.caption, font-family);
  ,,caption, font-size);
  q.caption, font-weight);
  ].caption, line-height);~!#j#g&--sm,
    &--md,
    &--lg {
      max-width: 100%;
    }
    
    &__empty {
      min-height: 150px;$,lg;
      
  
M.GsK_I  }
  }
}

// Focus management for accessibility
.ui-feed-layout:focus-within {
  .ui-feed-layout__container::-webkit-scrollbar	-thumb {
Q focus;
  }
}7iV?xgK&Pidebar^idebar-layout__sidebar2idebar!Nmargin-left: 0;
    }
    
    &.ui-sidebar-layout--position-right .ui-sidebar!margin-right: 0LHidden variant
  &--hidden {
    .ui-sidebar-layout__sidebar {
      display>Overlay mode
  &--overlay {
    .ui-sidebar-layout__sidebar {
top: 0;
      left (}"d $}
    }
    
    &.ui-sidebar-layout--position-right .ui-sidebar-layout__sidebar {
      left: auto;
      right: 0;
      
   "d X}idebar!8width: 100%;
      margin-left: 0;
      margin-right: 0)idebar-layout__sidebar|idebar-layout__sidebar {

-F// Sidebar Element
  &__sidebarybF 	#].nn	F// Width variants
    &--sm {
      width: 200px;
      min-width: 200Q/--md {
      width: 280px;
      min-width: 280Q/--lg {
      width: 360px;
      min-width: 360Q--xl {
      width: 4440Q~
"($'!P#$// Backdrop Element
  &__backdrop {
Xtop: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: $semantic-z-index-overlay_,
backdrop;
backdrop*opacity1B4
    // Interactive
    cursor: pointer;
  }
  
  //k	'j768px) {
    &:not(.ui-sidebar-layout--overlay) {
      .ui-sidebar-layout__sidebar {
        &--sm {
    3  } --md, &--lg, &--xl {
    3  }
      }idebar!JP#,idebar!>#}
}oѣ6xKWOtabs-container {{*Dvariants based on position
  &--position-top,
  &--position-bottom {}
  
  &--position-left,.;
  }
  
  &--position-bottom {-reverse;
  }
  :#}
  
  // Tab Navigation
  &__nav {,U#\E.ui-tabs-container--position-bottom & {
      border-bottom: none;
  R"<tabs-container--position-left & {
      border-bottom: none;K  align-items: stretch"=tabs-container--position-right & {
      border-bottom: none;4K.  align-items: stretch;
    }
  }
  
  &__nav-	%i: 1;
    overflow-x: auto;
    scrollbar-width: none;
    
    &::-webkit-scrollbar {
      display: none"Ntabs-container--position-left &,
    .ui-tabs-container--position-right & {
     overflow-x: visible""tabs-container--scrollable & {
      scroll-behavior: smooth;
    }
    
    &--dragging {
      pointer-events: none;
      
 ;     .ui-tabs-container__tab {
        pointer-events: autoIndividual Tab Button
  &__tab3gap!/cursor: pointer;0utton
Dutton\Dutton~FuttonU*L'gwhite-space: nowrap;
    user-select: none;
    
    // Size variants
    .ui-tabs-container--size-sm &!.%'  min-button-height-sm;
  
/utton-small, font-family);
  ,-utton-small, font-size);
  q/utton_-utton-small, line-height)"tabs-container--size-md &!0%  min-button-height-md"tabs-container--size-lg &!.md@lg;
      min-button-height-lg;
  
/utton-large, font-family);
  ,-utton-large, font-size);
  q/utton-large, font-weight);
  ]/utton-large, line-height);
    }
    
    // Variant styles
    .ui-tabs-container--variant-default & {
      border-bottom: 2p0x solid transparent;
      
      &--active {
  primary;
        border-bottom-]primary;
      }%tabs-container--variant-filled & {
  *3  margin: 0%  
      &--active {
  O"primary;
  on-primary;
      }$tabs-container--variant-pills & {
  *+full;
      margin: 0%  
      &--active {
  O"primary;
  on-primary;
      }tabs-container--variant-underlined & {
      border-radius: 0;
      border-bottom: 2px solid transparent;
      
      &--active {
  primary;
        border-bottom-]primary;
    !6  }
    }
    
    // Position-specific styles
    .ui-tabs-container--position-left &,
    .ui-tabs-container--position-right & {
  flex-start;
      width: 100%;
      text-align: left;
      
      .ui-tabs-container--variant-default & {
        border-bott5om: none;
        border-right: 2px solid transparent "--active {
          border-right-]primary %Wtabs-container--position-right & {
        .ui-tabs-container--variant-default & {
    c      border-left: 2px solid transparent;
          
          &--active {
            border-left-]primary;
          }
        }
      }
    }
    
    // Interactive states
    &:hover:not(&--disabled):not(&--active) {
     *S5x
--active {primary;
  !@]  
      .ui-tabs-container--variant-filled &,
      .ui-tabs-container--variant-pills & {
  O"primary;
  
on-primary hover {
    O"7primary;
        }
      }
    }
    
    &--disabled {##disabled;
      cursor: not-allowed#%disabled;
      
      &:hover {
    ! disabled;
      }
    }
    
    // Draggable state
    &[draggable="true"]:not(&--disabled) {
      cursor: grab;
      
     c  cursor: grabbingTab elements
  &__tab-icon3!inline;
  }
  
  &__tab-label {	$Coverflow: hidden;
    text-overflow: ellipsis;
  }
  
  &__tab-closQcminimum%minimum;
    border: none;(40inherit;
    cursor: pointer;
subtle;/L'<size-lg&:hover {
      opacity: 1;N<dangeri1Q	AScroll Controls
  &__scroll-controls {
    display: flex;
    gap!
padding: 0@!;DR.ui-tabs-container--position-left &,
    .ui-tabs-container--position-right & {
     border-left: none;
  R$'%sm 0;
    }
  }
  
  &__scroll-buttonDcenter;^button-height-smbutton-height-sm;
    border8\U#(Qcursor: pointer;<size-md;
    line-height: 1;/L'
    &:hover:not(:disabled)LE]y
disabled {#disabled;
      border-]  cursor: not-allowed#disabled%ntent Area
  &__content {
    flex: 1min-height: 0;
  }
  
  &__panel {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    padding: $#lg;
Q';
q+visibility: hidden;
    transition: opacity1BToverflow: auto;
    
    &--active {
      opacity: 1;
      visibility: visible;
  >  top: auto;
      left: auto;
      right: auto;
      bottomadjustments
  @media (max-width: $semantic-breakpoint-md - 1) {
    &__tab {
      .ui-tabs-container--size-lg & {
        padd!'    min-button-height-md;
    
/utton
,-utton\q/utton~]/utton    }
    }
    
    &__panel!.]!$semantic-breakpoint-sm - 1) {
    &__tab {
      .ui-tabs-container--size-md &,
      .ui-tabs-container--size-lg & {
        '%%    min-button-height-sm;
    
/utton-small, font-family);
    ,-utton-small, font-size);
    q/utton]/:utton-small, line-height);
      }
    }
    
    &__panel!A%&__scroll-controls {
      padding: 0%#}
}ҌyBx9KOONfloating-toolbar {
  // Core Structure
  position: absolute;
  display: flex;
gap!xs;
  opacity: 0;
@Y(-8px);a-L%]z-index: $semantic-z-index-overlay;
  pointer-events: none;
  will-change: opacity, transform=-primary;
  border8\.'lg;
)3;
  
  // Typography

I0Cb/@aG
'PSize V#-gap!!&--md {
#)!gap!$}
  
  &--lg {
#)]gap!]/largeAlargePAlargeClargeVariant Styles
  &--default {
Q(primary;
    border-]U'2;j%2border: none;
0}
  
  &--floating {
Q7}]backdrop-filter: blur(8px);
+3;
  }
  
  &--compact {
#+%%gap!$#Context Variants
  &--contextual {
Q primaryQXon-primary;
    border: none;
  }
  
  // State Variants
  &--visible {
    opacity: 1;
` 7Y(0);
    pointer-events: auto;
  }
  
  &--entering {
qd Y(-8px);
  }
  
  &--leaving {
qd !Y(-8px);
    transition-duration:1;
  }
  
  &--disabled {
Jdisabled;
    pointer-events: none;
  }
  
  // Content Areas
  &__actions3gap!-xs;
  }
  
  &__action {
    display: inline-4center;
    gap!#'%%Obutton-radiusQ/+utton-small=uttonJCuttonE/utton-small, line-height);
    cursor: pointer;/L'min-fbutton-height-sm;
    white-space: nowrap;
    user-select: none;
    
    &:hover:not(:disabled) {
  !68active:not(:disabled)L-	pressed;
^ Y(1px)~--disabled,
    &:disabled {"disabled;
      cursor: not-allowed;
      pointer-events: none;
    }
    
    // Contextual toolbar button styles
    .ui-floating-toolbar--contextual & {bon-primary;
      
      &:hover:not(:disabled) {
        background: rgba(255, 255, 255, 0.1);
  
on-primaryO&:active:not(:disabled) {
        background: rgba(255, 255, 255, 0.2);
      }$i {
  .<size-sm;
      line-height: 1;
    }
  }
  
  &__action-label {
    display: none;
    
    &--visible {
      display: inline;
    }
    
    // Show labels on small screens or when no icon
    @media (max-width: $semantic-breakpoint-sm - 1) {
      dis?play: inline;
    }
  }
  
  &__shortcut {
    display: inline-#padding: 2px 6px;
Q7Wfont-family0family-mono;<size-xs4medium(5border9margin-left!P.ui-floating-toolbar--contextual & {
      background: rgba(255, 255, 255, 0.15)8on-primary;
      border-color: rgba(255, 255, 255, 0.2)#&__divider {^border-width-1button-height-sm;
Q 	margin: 0*j.ui-floating-toolbar--contextual & {
      background: rgba(255, 255, 255, 0.2);
    }
  }
  
  &__label {0D  white-space: nowrap;
    
    .ui-floating-toolbar--contextual & {on+Position Variants
  &--top {
` 2Y(8px);
    
    &.ui-floating-toolbar--visible {
^ !Y(0);
    }
  }
  
  &--bottom {
` 3Y(-8px);
    
    &.ui-floating-toolbar--visible {
^ Y(0);
    }
  }
  
  &--left {
` 08px);
    
    &.ui-floating-toolbar--visible {
^ 0);
    }
  }
  
  &--right {
` 08px);
    
    &.ui-floating-toolbar--visible {
^ 0)<Animation Variants
  &--slide-fade {
    transition: opacity1#,
               '%'N#&--bounce {
    transition: opacity18spring,
               'Bspring;
  }
  
a=&:not(.ui-floating-toolbar--disabled) {
    &:focus-within {

.!, 0 0 0 2px $semantic-color-focus'$semantic-breakpoint-md - 1) {
#+%%gap!&.ui-floating-toolbar--lg!6  gap!*P#$semantic-breakpoint-sm - 1) {
#1gap!.'md;
    &__actions {
      gap!#&__divider {
      margin: 0%#
RTouch-friendly adjustments
  @media (hover: none) and (pointer: coarse) {
    min-+
    &__actions {
      min-minimumHigh contrast mode support
  @media (prefers-contrast: high) {
    border-width: $semantic-border-width-2;
    box-shadow: noneP;
    
    &--elevated,
    &--floating {
      border: $semantic-border-width-2\// Reduced motion support
  @media (prefers-reduced-motion: reduce) {
    transition: none;
    
    &--slide-fade,
    &--bounce {
      transition: none;
    }
  }
}

// Backdrop for modal-like behavior when needed
.ui-floating-toolbar-backdrop {
  posBition: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
Gz-index: calc($semantic-z-index-overlay - 1);
  pointer-events: auto;
}MJ><xj%@use '9'@X200px;
  margin: 0 auto;IJ  
  h3#:.-%SG1padding!
#p}
  #D3  row {
asgrid-gap-md;
t1280px, 1fr));
#sm;
  
  @media (max<sm) {q1fr;
  }
}

.demo-card {
!2)'I1
-5&%M,elevation-1;
  
  &:hover {
I,!#elevation-2;
  }
}

.demo-content {!0,)0*O'*)+4f++.(text-align: center)#2 dashed;
  +}
  ,3econd+#second,'!on-secondary;
  }
  
  &--success,%ccess,}
  
  &--warning,#]
on-warning,$on-warning;
  }
  
  &--danger,#danger	on-danger,$on-danger;
  }
  
  &--info,#
,}
  
  &--dark,#+?,,?,}
  
  &--inline {*Q~,D< :3-}
}

.viewport-info {
@sm 0;
  min-height: 80px;%"2
  .demo-content {(33bold7$-D%ul {
,O'*)sizea+0.($padding-left0
  lin*ntent-list-item;
  }
}l1,\.x1j0@use '9'@JJI  
  h3#:.-%}

.demo-rowQ%/grid-gap-md;
  flex-wrap: wrap;
}

.demo-columnQG>stack-md;
}

.demo-example {
  flex: 1;
  min-width: 250px;
  #W 6boundary {
  border: 2px dasheoecondary;
  background-color: rgba(128, 128, 128, 0.1);
  min-height: 100px;
  width: 100%;
}

.demo-content {
!25&,&0border: 1px0`	K,elevation-1;
$)text-align: center;
  
,O'*)+4f++.(}

.demo-content-small {
! 3$5&%xs+font-size: O3	size-sm;
+30%medium;
}

.demo-inline {
  margin: 0a) 
xs;
}

.demo-card {
!&,5&%xl1M,elevation-2;
  border: 1px0(/text-align: center;
  max-width: 400px;
  
  h3#:.-}
  y#}
}

.demo-loading {
  text-align: center;
  
  .demo-spinner {
    width: 40px;
    height: 40px;
    border: 4px solid $seman0border-top: 4px0 3'@full;
    animation: spin 1s linear infinite;
    margin: 0 autoa)P& auto;
  }
  T}
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

.demo-hero {
  text-align: center;
    :large<large!Alarge@.+large!"0+xl;
  }
}

.demo-button {
!&N
$)border: 1px0`	3&-b)-)*
,+*  '*h2O,+}
  +     -Vopacity: $semantic-opacity-hover;
    }
  }
}

@media (max-width: 768px) {
  .demo-row4!1}
  
  .demo-example {
    min-width: auto;
  }
}ixBjQ@use '9'@X200px;
  margin: 0 auto;IJ  
  h3#:.-%}

.demo-row {
av/300px, 1fr));
qgrid-gap-lg;
%#}

.demo-feed-wrapperQQp#DD%.demo-feed {)*I /)lg;
!%;
  
  &--preview {
4+}
  
  &--interactive {
    height: 600px;
>(lg 0;
  }
}

.demo-feed!/E1

  &:last-child {Pcnone;
  }
  
  &--loading {
    opacity: $semantic-opacity-subtle;
    pointer-events: none;
  }
  Y
?&!pX#+p
    strong3O'*O'JN:3/T1O'.(}
  }
  
  &__badge {.    
    &--text {
  a 4  
    &--imag^    
    &--video {
  a ]8  }
  
  &__timestam2/֓2$margin-left: auto;
  }
  
  &__title#:(	m3.*	`/ 0;
  }
  
  &__contentX"md 0;
  }
  LHP}
  
  &__action,none;
    border: none+Q(e.cursor: pointer;
    -'2
  ;*Q   -G+}
    
    &:focus-visible {
  ./2^/  }
  }
}

4%2P"##5&O'0
  button { -b)--e 3+-: none^&*  cursor: pointer;
    -'  
  ;*Qk  
    &:hover:not(:disabled) {
      opacity: $semantic-opacity-hover;
    }
    
    &:focus-visible {
  ./2^/  }
    
    &:disabled {
      opacity: $semantic-opacity-disabled;
      cursor: not-allowed;
    }
  }
  
  label {
    disp&Q!4151*1b$ z($}
o"text-align: center1&  m-"}
  2#Y  #  \"lg 0;
  }
  
  &__button { -b)--eecond+#secondary;
    border: none^&*  cursor: pointer;
    -6*`1+ .*J6 .*!8 .*+    
  ;*Q   -Eopacity: $semantic-opacity-hover;
    }
    
    &:focus-visible {
  ./2^/  }
  }
}

.demo-stats {
av/200px, 1fr));
qgrid-gap-md1&)#0'0)'I1D#""
  &__label6151*1b$ }
  
  &__value:3/'` 3\";Responsive Design
@media (max-width: 768px) {
  .demo-row {q1fr;
  }
  44align-items: stretch&'p
    label {
      justify-content: center;
    }
  }
  
  .demo-feed {
    &--preview {
      height: 300px;
    }
    
    &-4#500px;
    }
  }
  
  .demo-stats {q
1fr;
  }
}NZxEjA@use '3'@X200px;
  margin: 0 auto;
  rsmDKmd;
  
  h3#:.-%  #D+P	}
  
  h5#:(	m3.*	`Tp	}
  
  h6:3/'r3  rowQ%grid-gap&7align-items: flex-start;
  
  @media (max-width: 768px)4![}
}

.demo-column {
  flex: 1;
  min-width: 200px;
}

// Flex demo containers
.flex-demo {
!2)'I /T#min-height: 100px;
}

.flex-item {
! 3$5&,&text-align: center;
+3<*O'*)sizea+0.(m-p}
  
  &--medium {*P}
  
  &--large {0'}
  
  &--fixed {
    min-width: 120px;`"econd+#secondary;
  }
  
  &--inline {*Q'(1e
1}
}

// Justify content demos
.justify-example {
%#}

.justify-demo {
!&N
&)!I/c:  min-height: 80px;
}

// Align items demos
.align-demo {
!&N
&)!I/c6  min-height: 120px;
}

// Wrap demos
.wrap-example {
%#}

.wrap-demo {
!&N
&)!I/c0  max-width: 400px;
}

// Gap demos
.gap-demo {
!&N
&)!I/c*}

// Complex examples
.complex-example {
#sm;
}

.centered-container {
!&N
&)!I/:min-height: 200px;
  
  .card,8%xl^-lg;
I,!Felevation-2;
    text-align: center;
    max-width: 300px;
    
    h5m,#p}
    g0;
    }
  }
}

.nav-demo {
! 3$5&%'0
  .nav-brand {(33bold.'large, font-size);
  }
  
  .nav-item {*sma)P&b1transition: background-color>     -!@rgba(255, 255, 255, 0.1);
    }
  }
}

.card-grid {
  .grid-card,8)'I /2N,Qelevation-1;
    flex: 1;
    min-width: 250px;
    max-width: 350px;
    
    h6m,#p}
    g"0;
    }
  }
}

.sidebar-layout {
!&N
&)!I/: min-height: 200px;
  
  .sidebar,8-"min-width: 200px;
    border-right)I	secondary1 :3/}
  
  .main-content {2flex: 1;
    
    h6m,#P  }
    g10;
    }
  }
}

// Size examples
.size-example {
%'	l;
}

.size-demo {
!&N
&)!I/c}

.inline-flex-demo {
!2)'I1
'5&%p}h}/W0x{j)@use '9'@FBlg;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-description {
,large*;large+;largeT+=large, line-height);
$!md;IFxl;
  
  h3#:.-%}

.demo-example {
#md;
  #W 6row {
av/300px, 1fr));
qgrid-gap-lg;
}

.demo-grid!<card-radius)+I1

,O'*)+4f++.(%"2gtext-align: center;
  min-height: 80px;
  position: relative;
  
  small {
    position: absolute;
    !$\right0 ^ 'size: O36size-xs;
    opacity: $semantic-opacity-subtle;
  }
  +  }
  ,3econd+#second,'secondary;
  }
  
  &--success,%ccess,success;
  }
  
  &--info,#
,info;
  }
  
  &--warning,#]
on-warning,$]}
  
  &--danger,#danger	on-danger,$danger;
  }
}

4%
'&s!!md1&)#0 card-radius)+I1}

.demo-control-groupQU
  
  label1  }
  
  select,
}(-input-padding-ya)input-padding-x;
  ))I $input-radius;`),6/input<input!<input@.*input
    &:focus {
  ./2^/,)focus;
    }
  }
  
}(Lwidth: auto;
    height: $semantic-sizing-touch-minimum;
    cursor: pointer36768px) {
  .demo-container { md;
  }
  
  .demo-row {q1fr;
  }
  42-}
  
  .demo-grid-item {
    min-height: 60px+p}
}÷n;xj:@use '9'@7 !%;
  min-height: 100vh;
  SGsecondary;
    padding!
#pKS@  
  h3#:.=}

.demo-row {
av/300px, 1fr));
qgrid-gap-md;
%#}

.demo-card {)*I/-card-radius;
!&N
3&-#W 1'sidebar-demo-container {
  height: 300p),I1
'>overflow: hidden;
  position: relative;
  
  &--interactive {
4}
  
  .demo-content {*P
    h4,?$3$Nv#'}
    m>O'*O'JN,O'!,O'.(5|46    
    ul {
      list-style: none;
      padding: 0  
      li {
      "ntent-line-tight&SG1"    
        &:last-child {
      Q[2
I    }
      }
    }
  }
}

// Sidebar content styling
[slot="sidebar"] {
$)
  h5#:(	m3.*	u+pS}
  
  ul {
    list-style: none;
    padding: 0;
    margin: 0;
    
    li {
    "'\t%'b1cursor: pointer;
    ;*Q    
  !-c4;  
  nav ul li3&'}
}

4%
'&s!P##5&O'0)'Isecondary;
  &"4=\ '*  
    select, input {
    "-input-padding-ya)input-padding-x;
    ))I   `$input-radius;
  a'3*input*1input, font-size);
      transition: border-color>      
      &:focus {
    ./2\/  ,)focus;
      }
    }
    z(+auto;
      margin-right0 ^}
  }
}

.demo-button {!0-b)-)$ 3$border: non%**+*!I*F
&:hover {
I,1}
  /`  
  &:active {
I,(Krest;
  }
}

// Responsive design
@media (max-width: 768px) {
  .demo-row {q1fr;
  }
  44,
    label {
      flex-direction: row;
    "o-}
  }
  
  .sidebar-demo}4250px;
    
    &4300px;
    }
  }
}n6x	jK@use '9'@7   max-width: 100%;
    
  h3#:.-%  #W -  	  
  h3 {PJ1padding!
#pKgrid {
av/500px, 1fr));
q#	margin-to%P}

.demo-card {
!2)'I1
'0/  
  h4 {
    margin-top: 0"}
}

.demo-layout-previewfU/3overflow: hidden;
  margin-to%pF
  .ui-supporting-pane-layout {
    min-height: 100%;
  }
}

.demo-rowQ%!pB$'md 0;
  flex-wrap: wrap;
}

.demo-btn {!0(Q%)'I /)##;
$)*+*!I*F*interactive+%}
  
  &.active,# 3+N  }
}

4%2PB$*md 0;
  flex-wrap: wrap;
}

.demo-checkboxQ"s!xs;
,O'*)+4f++.($'
}(width: 16px;
    height: 16	#content styles
.demo-main-content {!0,  height: 100%/
  h33&)!margin-top: 0;
    
    fa-icon { 3}
  }
  
  ul {
>(sm 0;
    padding-left0P	  
    lim,'!K*O'JN,O'!,O'.(- }
  }
}

.demo-content-blocks {
as'	margin-to%P}

.demo-content-block {
!2)'I1
'5&%p
  h43&)2
    fa-icon { 3K  font-size: $semantic-sizing-icon-inline;
    }
  }
  
  p {
    margin: 00151*1b'  }
}

.demo-pane-content {
  margin-to%p}

.demo-setting-itemQ"s'5&%0E1
*O'*)+4f++.($'color>  
  &:last-child {Pnone;
  }
  
  &:hover {0" 3}
  
  fa-icon {0"!3=ont-size: $semantic-sizing-icon-inline;
    transition: color>  }
  
  &:hover fa-icon {0" 3/}
}

.demo-tag-item {
  display: inline-block;
! 3$5&%Q%'*1*41+:3!medium;
Q,B'TQ0I*F+econd+#/secondary;
  }
}

.demo-info-item,
.demo-config!/0E1
*1*41++1[+61$
  &:last-child {Pnone;
  }
  
  strong {0",+3<-info {
!2)'I1
'5&%p##ptext-align: center;
,1*41+:3!medium;
Q,$ 3	C}

// Responsive design
@media (max-width: 1200px) {
  .demo-grid {qn1fr;
  }
  
  .demo-layout-preview {
    height: 300px;
  }
}

@media (max-width: 768px) {
  .demo-container {*p7}
  
  .demo-layout-preview {
    height: 250px;
  }
  4^BbCx.Q:w+[%$!\lg;
  flex-wrap: wrap;
}

.demo-item {
  flex: 1;
  min-width: 200px;
}

.demo-content {
  p1 6&@//	r@6
paragraph; 
H  
    &:last-child {
  "horizontal-conten#'$#%-}

.demo-horizontal-item {
  min-width: 150px #))$secondary;
! "#S  white-space: nowrap;
  
-& 
(!+&	*@8}

.demo-large-content {
  width: 800px;
  height: 600px #)D}

.demo-table {
  width: 100%;
  border-collapse: collapse;
  
  td"
#8 primary;
    white-space: nowrap:/P(˓@fP1flex-wrap: wrap`~! background-color!Wjinteractiveinfo,
.demo-stats {
  margin-to%$#%surface-secondary;
! "	#F  
  p {
    margin: 0;
  -Y%&:last-child {
      margin-bottom: 0"grid;ll"d#width: 1000px;
}

.demo-grid-item {!#()$	secondary#J! "#
  h4 {%1@}
  
  p {
    margin: 0P}
}

.virtual-item {!#(zO$m
  strong {
/margin-right$}
  
-& 
(!+&	*@&+0$semantic-breakpoint-lg - 1) {
  .demo-container"
}
  
  .demo-rowk'#!V'EVflex-start;
  }
}

@media (max-width: $semantic-breakpoint-md - 1) {
  .demo-container"
}
  
  .demo-section {H&~md;
  }
  
  .demo-large-content {
    width: 400px;
    height: 300px;
  }
  
  .demo-grid {
    width: 600px;
    grid-templa(ll, minmax(150px, 1fr))		sm;
  }
}en`Qx:"7}
}

.demo-example {
#9Jd
+sm;
    border-left: 3pxqprimary;
    padding-leftq
#ection-content {
  h2, h3, h4, h5 {9}R}R}<R}
  
  h5 {/H'
}
  
  p {/
Z(*z*)#$}
  
  ul {.*padding-leftq
  
    li {
  .
	+	list-item? Fdisplay: inline-flex;
  align-items: center;
  justify-content: center,  transform: translateY(-1px)h}:GxV:%w*md;
  max-width: 1200px;
  margin: 0 auto;73md;
}

.demo-item {kcard-radius)-?W: 0 07 0;
  }
}

.demo-info {
,small; small; small= small, line-height);
	
margin-topq
%sm5% [border-left: 3pxqinfo;% [^min-width: 120px.=(align-self: flex-start;
      margin-topq
*Istatus {
  margin-topq
smL
  p {
    margin: 0 0 00
Z(*z*
^,margin-bottom: 0;
    }
    
    strong {
  A-  font-weight: 
font-weight-semibold;
    }
  }
}

// Responsive adjustments
@media (max-width: $semantic-breakpoint-lg - 1) {
  .demo-row {
  1sm;
  }
  
  .demo-item2C@media (max-width: $semantic-breakpoint-md - 1) {
  .demo-container"smM
      select {
        min-width: auto;
        flex: 1;
      }
    }
  }
}SHxCO0Oscroll-containe^sFposition: relative;
  flex-direction: column;
  
  // Layout & SpacingG'"subtle;
"radius-md;
  
  // Base overflow behavior
  overflow: auto;
  
  // Smooth scrolling when enabled
  &--smooth {
    scroll-behavior: smooth;
  }
  
  // Direcvertical {
    overflow-x: hidden;
    overflow-y: auto;
  }
  
  &--horizontal {
    overflow-y: hidden;
    overflow-x: auto;
    flex-direction: row;
  }
  
  &--both {
    overflow: auto;
  }
  
  // Scrollbar Visibility Variants
  &--scrollbar-auto {
    // Default behavior - scrollbars appear when needed
  }
  
  &--scrollbar-always {
    overflow: scroll;
  }
  
  &--scrollbar-never {
    scrollbar-width: none; /* Firefox */
    -ms-overflow-style: none; /* Internet Explorer 10+ */
    
    &::-w3ebkit-scrollbar {
      display: none; /* WebKit */!^Custom Scrollbar Styling
  &:not(&--scrollbar-never) {
    scrollbar-width: thin;
    scrollba 	secondaryj
    &::-webkit-scrollbar {
      width: 8px;
      height: 8px;
    }
    
    &::-webkit-scrollbar-track-b")%}
    
    &::-webkit-scrollbar-thumb%econdary;
  `"+  transition: background-colorp'  
      &:hover@`&u&::-webkit-scrollbar-corner-&DContent Container
  &__content {
    flex: 1;
    position: relativeP+M
    // TypographyP4m/m:m=1m)}
  
  // Virtual Scrolling Components
  &__virtual-spacer {
    position: relative;
    width: 100%;
  }
  
  &__virtual-content {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    will-change: transform;
  }
  
  &__virtual-item {
    s,V%border-bottomq%subtle;
    
    // TypographyP4m/m:m=1m+-
    &:last-child {
      border-bottom: none BScroll Indicators
  &__indicators {
    position: absolute;
    toright0Ytooltip*%0&__indicator {
    width: 24px;
    height: 24px^"-fullQ*g%2;
    margin-bottom0&s,subtle;P
-
    &--up::before {
      content: '↑';
  -F0bold&own::before {
      content: '↓';
  -F0Dbold;
    }
    
    .ui-scroll-container:hover & {
      opacity: 1 !Focus States
  &:focus-visible {
82outline-offset: 2px; W
&__contentl!6}
    
    &__virtual-item {
  1+  
      // Smaller typography on mobile
  Q3jF
J=H%  }
    
    &__indicators {
      to%	    right0&}
    
    &__indicator {
      width: 20px;
      height: 20px;
      
      &--up::before,
      &--down::before {
        foB  }!F&__content {
  1&Reduced Motion S:&7d&--smooth {
      scroll-behavior: auto;
    }
    
    &::-webkit-scrollbar-thumb,
    &__indicator&%,High Contrast Mode S6%[
    &::-webkit-scrollbar-thumb%&__indicator%(*	  }
  }
}Xo\exZO&Ocommand-palette-item {
qwidth: 100%;
'!sm;
  margin: 0;
  border: none;
"yr'text-align: left;
O
M
  &:hover,
  &--selectedM#_%1;
  }

  &:focus-visible {
82outline-offset: 2px;
  }
>0
  &__contentl3width: 100%/

  &__iconl3widthicon-navigation;
    $#icon-navigation;
    flex-shrink: 0";transition: colorp%-}

  &:hover &__icon,
  &--selected &__icon {p-}

  &__text {
    flex: 1;
    min-width: 0;nflex-direction: column#ntent-line-tight;
  }

  &__title {P4m/m:m=1m+fFoverflow: hidden;
    text-overflow: ellipsis;
  }

  &__description {P4j6
;fBoverflow: hidden;
    text-overflow: ellipsis;
  }

  &__highlightMWpadding: 0 2px^"-,!semibold;
  }
|<Jntent-line-tight;
    flex-shrink: 0;
    margin-left: auto;
  }

  &__kbd:	min-width%$8
padding: 01%W3%subtle^"-U*caption<caption<caption+>caption#;text-transform: uppercas.1;
  }

  &__plus {!tertiA3caption<caption<caption+>captionJ
  // Hover state for shortcut keys
  &:hover &__kbd,
  &--selected &__kbdM#_	&}\}

  // Focus state improvements
  &:focus-visible {
    .ui-command-palette-item__icon {
  p$}

    .ui-command-palette-item__kbd-g	_)}
  }

  // Responsive]$ &calc(#{$semantic-breakpoint-md} - 1px) /PN!__content {
  !!-Z}

    &__shortcut {
      display: none; // Hide shortcuts on smaller screens
    }
  }
}axuOMOcommand-palette'-right: 0;
  bottom: 0U3modal;
  display: none;
  align-items: flex-start;
layout-section-lg1+md;

  &--open,
  &--entering,
  &--leavingl_}

  &__backdrop {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0Q"	backdrop;animation: backdropEnterp>F forwards;
  }

  &--leaving &__backdrop {
    animation: backdropExitp>\ forwards;
  }

  &__container {
    position: relative;
    width: 100%;
    max-width: 640O,%subtle^"-omodal;
    overflow: hidden20px);animation: containerEnterp:Nspring forwards;
  }

  &--leaving &__container {
    animation: containerExitp> forwards;
  }

  // Size variants
  &--md &__container {
    max-width: 480px;
  }

  &--lg &__container {
    max-width: 640px;
  }

  &--xl &__container {
    max-width: 800px;
  }

  // Search Section
  &__search {
    position: relative;
    displayz%V%Mborder-bottomq%$	[ }

  &__search-iconl3widthicon-navigation;
    $!icon-navigation;
    margin-right0;<lex-shrink: 0;
  }

  &__input {
    flex: 1;
    padding: 0oU*input<input<input+>input#%
    &::placeholder {
   tertiary;
    }

    &:focus {
      outline: none;
    }

    // Remove search input styling
    &::-webkit-search-cancel-button,
    &::-webkit-search-decoration {
      -webkit-appearance: none;
    }

    &[type="search"] {
      -webkit-appearance:  textfield;
    }
  }

  &__clearl3width%$%
padding: 07uf"%	;Qf*lg,!bold;

    &:hover-gp-jR}

  // Results Section
  &__results {
    max-height: 400px;
    overflow-y: autoP.0Q*	k
    // Custom scrollbar
    &::-webkit-scrollbar {
      width: 8px;
    }

    &::-webkit-scrollbar-track-!}

    &::-webkit-scrollbar-thumb%econdary;
  `"+
      &:hover@`&X  }
    }
  }

  // Group styling
  &__group {
    &:not(:first-child) {
      margin-toM  padding-to  border-topq%
  &__group-headerlZTFMmargin-bottom0$}

  &__group-iconl3widthicon-inline;
    $icon-inline"<tertiary;
  }

  &__group-title {
    flex: 1;
    margin: 0O0labe=labe#=labe*?labeQ;Ntext-transform: uppercase;
    letter-spacing: 0.05em;
  }

  &__group-count {P/caption<caption<caption+>caption#tertiaryQ9padding: 2px1%d"'Sfull;
    min-width: 20px;
    text-align: center;
  }

  // Empty state
  &__emptylflex-direction: column<V?layout-section-md;
    text-align: center;
  }

  &__empty-iconl30width: 48px;
    height: 48px;
    margin-bottom0M
tertiary;
,subtle;
  }

  &__empty-text {
    margin: 0O5m/m:m=1m;}

  // Footer
  &__footerlTlgP+sm1M
border-topq%$	[/}

  &__footer-se|L
  &__footer-kbd:1min-width: 24px;
    height: 20px;
    padding: 01%W$%subtle^"-U*caption<caption<caption+>caption#;'"1;
  }

  &__footer-section span {P/caption<caption<caption+>caption# tertiary;
  }

  // Responsive d &calc(#{$semantic-breakpoint-md} - 1px) -md1Csm;

    &__container {
      max-width: none;
    }

    &__searchl!6F}

    &__results {
      max-height: 300px;
    }

    &__footer {
  +!%#M}
  }
 &calc(#{$semantic-breakpoint-sm} - 1px) -sm;

    &__footer-section:not(:first-child) {
      display: none; // Hide extra keyboard hints on mobile
    }
  }

  // Redu ce motion for users who prefer i?&2f&__backdrop,
    &__container {
      animation: none !important;
    }

    &--entering &__backdrop {"-backdrop;
    }

    &--entering &__containerqTnone;
      opacity: 1;
    }
  }
}

// Animations
@keyframes backdropEnter {
  from}
  to"1backdrop;
  }
}

@keyframes backdropExit {
  from"backdrop;
  }
  to'}
}

@keyframes containerEnter {
  from0	Y(-20px);}
  to0
4opacity: 1;
  }
}

@keyframes containerExit {
  from0
opacity: 1;
  }
  to0	Y(-10px);}
}|xEimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, ViewChild, OnInit, OnDestroy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';

type FeedLayoutSize = 'sm' | 'md' | 'lg';

export interface FeedItem {
  id: string;
  [key: string]: any;
}

@Component({
  selector: 'ui-feed-layout',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-feed-layout"
      [class]="getFeedLayoutClasses()"
      [attr.aria-busy]="loading"
      [attr.aria-label]="ariaLabel"
      role="feed">
      
      @if (enableRefresh && isRefreshing()) {
        <div class="ui-feed-layout__refresh-indicator" aria-hidden="true">
          <div class="ui-feed-layout__refresh-spinner"></div>
          <span>Refreshing...</span>
        </div>
      }
      
      <div 
        class="ui-feed-layout__container"
        #scrollContainer
        (scroll)="handleScroll($event)"
        role="log"
        aria-live="polite"
        aria-atomic="false">
        
        <ng-content></ng-content>
        
        @if (loading && !isRefreshing()) {
          <div class="ui-feed-layout__loader" role="status" aria-live="polite">
            <div class="ui-feed-layout__loader-spinner" aria-hidden="true"></div>
            <span class="ui-feed-layout__loader-text">Loading more content...</span>
          </div>
        }
        
        @if (hasError) {
          <div class="ui-feed-layout__error" role="alert">
            <span>{{ errorMessage || 'Failed to load content' }}</span>
            <button 
              type="button" 
              class="ui-feed-layout__retry-button"
              (click)="handleRetry()"
              [disabled]="loading">
              Retry
            </button>
          </div>
        }
        
        @if (isEmpty && !loading) {
          <div class="ui-feed-layout__empty" role="status">
            <ng-content select="[slot=empty]">
              <span>No content available</span>
            </ng-content>
          </div>
        }
      </div>
      
      @if (enableRefresh) {
        <div 
          class="ui-feed-layout__refresh-zone"
          [class.ui-feed-layout__refresh-zone--active]="isPullingToRefresh()"
          (touchstart)="handleTouchStart($event)"
          (touchmove)="handleTouchMove($event)"
          (touchend)="handleTouchEnd($event)">
        </div>
      }
    </div>
  `,
  styleUrl: './feed-layout.component.scss'
})
export class FeedLayoutComponent implements OnInit, OnDestroy {
  @Input() size: FeedLayoutSize = 'md';
  @Input() loading = false;
  @Input() hasError = false;
  @Input() errorMessage = '';
  @Input() isEmpty = false;
  @Input() enableInfiniteScroll = true;
  @Input() enableRefresh = true;
  @Input() scrollThreshold = 200;
  @Input() refreshThreshold = 80;
  @Input() ariaLabel = 'Content feed';
  
  @Output() loadMore = new EventEmitter<void>();
  @Output() refresh = new EventEmitter<void>();
  @Output() retry = new EventEmitter<void>();
  @Output() scrolled = new EventEmitter<Event>();
  
  @ViewChild('scrollContainer', { static: true }) scrollContainer!: ElementRef<HTMLDivElement>;
  
  protected readonly isRefreshing = signal(false);
  protected readonly isPullingToRefresh = signal(false);
  
  private touchStartY = 0;
  private touchCurrentY = 0;
  private scrollThrottleTimer: number | null = null;
  private resizeObserver?: ResizeObserver;
  
  ngOnInit(): void {
    this.setupResizeObserver();
  }
  
  ngOnDestroy(): void {
    if (this.scrollThrottleTimer) {
      clearTimeout(this.scrollThrottleTimer);
    }
    this.resizeObserver?.disconnect();
  }
  
  getFeedLayoutClasses(): string {
    const classes = [
      'ui-feed-layout',
      `ui-feed-layout--${this.size}`,
    ];
    
    if (this.loading) {
      classes.push('ui-feed-layout--loading');
    }
    
    if (this.enableRefresh) {
      classes.push('ui-feed-layout--refresh-enabled');
    }
    
    return classes.join(' ');
  }

  private setupResizeObserver(): void {
    if (typeof ResizeObserver !== 'undefined') {
      this.resizeObserver = new ResizeObserver(() => {
        this.checkScrollPosition();
      });
      this.resizeObserver.observe(this.scrollContainer.nativeElement);
    }
  }
  
  handleScroll(event: Event): void {
    this.scrolled.emit(event);
    
    if (!this.enableInfiniteScroll || this.loading || this.hasError) {
      return;
    }
    
    if (this.scrollThrottleTimer) {
      clearTimeout(this.scrollThrottleTimer);
    }
    
    this.scrollThrottleTimer = window.setTimeout(() => {
      this.checkScrollPosition();
    }, 100);
  }
  
  private checkScrollPosition(): void {
    const container = this.scrollContainer.nativeElement;
    const scrollTop = container.scrollTop;
    const scrollHeight = container.scrollHeight;
    const clientHeight = container.clientHeight;
    
    if (scrollTop + clientHeight >= scrollHeight - this.scrollThreshold) {
      this.loadMore.emit();
    }
  }
  
  handleTouchStart(event: TouchEvent): void {
    if (!this.enableRefresh) return;
    
    this.touchStartY = event.touches[0].clientY;
  }
  
  handleTouchMove(event: TouchEvent): void {
    if (!this.enableRefresh || this.scrollContainer.nativeElement.scrollTop > 0) {
      return;
    }
    
    this.touchCurrentY = event.touches[0].clientY;
    const pullDistance = this.touchCurrentY - this.touchStartY;
    
    if (pullDistance > 0) {
      this.isPullingToRefresh.set(pullDistance > this.refreshThreshold);
      
      if (pullDistance > this.refreshThreshold) {
        event.preventDefault();
      }
    }
  }
  
  handleTouchEnd(event: TouchEvent): void {
    if (!this.enableRefresh) return;
    
    const pullDistance = this.touchCurrentY - this.touchStartY;
    
    if (pullDistance > this.refreshThreshold && !this.loading) {
      this.triggerRefresh();
    }
    
    this.isPullingToRefresh.set(false);
    this.touchStartY = 0;
    this.touchCurrentY = 0;
  }
  
  private triggerRefresh(): void {
    this.isRefreshing.set(true);
    this.refresh.emit();
    
    // Auto-reset refreshing state after 2 seconds if not manually reset
    setTimeout(() => {
      if (this.isRefreshing()) {
        this.isRefreshing.set(false);
      }
    }, 2000);
  }
  
  handleRetry(): void {
    this.retry.emit();
  }
  
  // Public method to reset refresh state
  resetRefresh(): void {
    this.isRefreshing.set(false);
  }
  
  // Public method to scroll to top
  scrollToTop(): void {
    this.scrollContainer.nativeElement.scrollTo({
      top: 0,
      behavior: 'smooth'
    });
  }
}1Sx;jhoºřUJ WҢ9)y@a("3 P05/1)'5(5(8cs(S
fA. x( export * from './feed-layout.component';'x@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-flex {
  // Core flexbox container
  display: flex;
  box-sizing: border-box;
  
  // Direction variants
  &--row {
    flex-direction: row;
  }
  
  &--row-reverse {
    flex-direction: row-reverse;
  }
  
  &--column {
    flex-direction: column;
  }
  
  &--column-reverse {
    flex-direction: column-reverse;
  }
  
  // Wrap variants
  &--nowrap {
    flex-wrap: nowrap;
  }
  
  &--wrap {
    flex-wrap: wrap;
  }
  
  &--wrap-reverse {
    flex-wrap: wrap-reverse;
  }
  
  // Justify content variants
  &--justify-start {
    justify-content: flex-start;
  }
  
  &--justify-end {
    justify-content: flex-end;
  }
  
  &--justify-center {
    justify-content: center;
  }
  
  &--justify-between {
    justify-content: space-between;
  }
  
  &--justify-around {
    justify-content: space-around;
  }
  
  &--justify-evenly {
    justify-content: space-evenly;
  }
  
  // Align items variants
  &--align-start {
    align-items: flex-start;
  }
  
  &--align-end {
    align-items: flex-end;
  }
  
  &--align-center {
    align-items: center;
  }
  
  &--align-baseline {
    align-items: baseline;
  }
  
  &--align-stretch {
    align-items: stretch;
  }
  
  // Align content variants (for wrapped flex containers)
  &--align-content-start {
    align-content: flex-start;
  }
  
  &--align-content-end {
    align-content: flex-end;
  }
  
  &--align-content-center {
    align-content: center;
  }
  
  &--align-content-between {
    align-content: space-between;
  }
  
  &--align-content-around {
    align-content: space-around;
  }
  
  &--align-content-stretch {
    align-content: stretch;
  }
  
  // Gap variants using semantic spacing tokens
  &--gap-xs {
    gap: $semantic-spacing-component-xs;
  }
  
  &--gap-sm {
    gap: $semantic-spacing-component-sm;
  }
  
  &--gap-md {
    gap: $semantic-spacing-component-md;
  }
  
  &--gap-lg {
    gap: $semantic-spacing-component-lg;
  }
  
  &--gap-xl {
    gap: $semantic-spacing-component-xl;
  }
  
  // Row gap variants
  &--row-gap-xs {
    row-gap: $semantic-spacing-component-xs;
  }
  
  &--row-gap-sm {
    row-gap: $semantic-spacing-component-sm;
  }
  
  &--row-gap-md {
    row-gap: $semantic-spacing-component-md;
  }
  
  &--row-gap-lg {
    row-gap: $semantic-spacing-component-lg;
  }
  
  &--row-gap-xl {
    row-gap: $semantic-spacing-component-xl;
  }
  
  // Column gap variants
  &--column-gap-xs {
    column-gap: $semantic-spacing-component-xs;
  }
  
  &--column-gap-sm {
    column-gap: $semantic-spacing-component-sm;
  }
  
  &--column-gap-md {
    column-gap: $semantic-spacing-component-md;
  }
  
  &--column-gap-lg {
    column-gap: $semantic-spacing-component-lg;
  }
  
  &--column-gap-xl {
    column-gap: $semantic-spacing-component-xl;
  }
  
  // Inline flex variant
  &--inline {
    display: inline-flex;
  }
  
  // Full width/height variants
  &--full-width {
    width: 100%;
  }
  
  &--full-height {
    height: 100%;
  }
  
  &--full {
    width: 100%;
    height: 100%;
  }
}gximport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type FlexDirection = 'row' | 'row-reverse' | 'column' | 'column-reverse';
type FlexWrap = 'nowrap' | 'wrap' | 'wrap-reverse';
type FlexJustify = 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly';
type FlexAlign = 'start' | 'end' | 'center' | 'baseline' | 'stretch';
type FlexAlignContent = 'start' | 'end' | 'center' | 'between' | 'around' | 'stretch';
type FlexGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';

@Component({
  selector: 'ui-flex',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      [ngClass]="getClasses()"
      [attr.role]="role">
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './flex.component.scss'
})
export class FlexComponent {
  // Flexbox properties
  @Input() direction: FlexDirection = 'row';
  @Input() wrap: FlexWrap = 'nowrap';
  @Input() justify: FlexJustify = 'start';
  @Input() align: FlexAlign = 'stretch';
  @Input() alignContent?: FlexAlignContent;
  
  // Gap properties
  @Input() gap?: FlexGap;
  @Input() rowGap?: FlexGap;
  @Input() columnGap?: FlexGap;
  
  // Display variants
  @Input() inline = false;
  
  // Size variants
  @Input() fullWidth = false;
  @Input() fullHeight = false;
  @Input() full = false;
  
  // Accessibility
  @Input() role?: string;

  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {
      'ui-flex': true
    };

    // Direction
    if (this.direction) {
      classes[`ui-flex--${this.direction}`] = true;
    }

    // Wrap
    if (this.wrap) {
      classes[`ui-flex--${this.wrap}`] = true;
    }

    // Justify content
    if (this.justify) {
      classes[`ui-flex--justify-${this.justify}`] = true;
    }

    // Align items
    if (this.align) {
      classes[`ui-flex--align-${this.align}`] = true;
    }

    // Align content (for wrapped containers)
    if (this.alignContent) {
      classes[`ui-flex--align-content-${this.alignContent}`] = true;
    }

    // Gap properties
    if (this.gap) {
      classes[`ui-flex--gap-${this.gap}`] = true;
    }
    
    if (this.rowGap) {
      classes[`ui-flex--row-gap-${this.rowGap}`] = true;
    }
    
    if (this.columnGap) {
      classes[`ui-flex--column-gap-${this.columnGap}`] = true;
    }

    // Display variant
    if (this.inline) {
      classes['ui-flex--inline'] = true;
    }

    // Size variants
    if (this.full) {
      classes['ui-flex--full'] = true;
    } else {
      if (this.fullWidth) {
        classes['ui-flex--full-width'] = true;
      }
      if (this.fullHeight) {
        classes['ui-flex--full-height'] = true;
      }
    }

    return classes;
  }
}m:{x! export * from './flex.component';¸wx 	import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

export type GalleryGridColumns = 1 | 2 | 3 | 4 | 5 | 6 | 'auto-fit';
export type GalleryGridGap = 'sm' | 'md' | 'lg';
export type GalleryGridObjectFit = 'cover' | 'contain' | 'fill' | 'scale-down';

export interface GalleryGridItem {
  id: string | number;
  src: string;
  alt?: string;
  title?: string;
  caption?: string;
  thumbnail?: string;
  loading?: boolean;
  selected?: boolean;
}

@Component({
  selector: 'ui-gallery-grid',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-gallery-grid"
      [class]="getGridClasses()"
      [class.ui-gallery-grid--masonry]="masonry"
      [attr.role]="'grid'"
      [attr.aria-label]="ariaLabel || 'Image gallery'">
      
      @if (items.length === 0) {
        <div class="ui-gallery-grid__empty" role="status" aria-live="polite">
          <div class="ui-gallery-grid__empty-icon" aria-hidden="true">
            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
              <rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
              <circle cx="8.5" cy="8.5" r="1.5"/>
              <polyline points="21,15 16,10 5,21"/>
            </svg>
          </div>
          <div class="ui-gallery-grid__empty-text">
            {{ emptyText || 'No images to display' }}
          </div>
        </div>
      } @else {
        @for (item of items; track item.id) {
          <div 
            class="ui-gallery-grid__item"
            [class.ui-gallery-grid__item--loading]="item.loading"
            [class.ui-gallery-grid__item--selected]="item.selected"
            [attr.role]="'gridcell'"
            [attr.aria-label]="getItemAriaLabel(item)"
            [attr.tabindex]="disabled ? -1 : 0"
            (click)="handleItemClick(item, $event)"
            (keydown)="handleItemKeydown(item, $event)">
            
            @if (showZoomIndicator) {
              <div class="ui-gallery-grid__zoom-indicator" aria-hidden="true">
                <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                  <circle cx="11" cy="11" r="8"/>
                  <path d="21 21l-4.35-4.35"/>
                  <circle cx="11" cy="11" r="3"/>
                </svg>
              </div>
            }
            
            <img 
              class="ui-gallery-grid__image"
              [class]="getImageClasses()"
              [src]="item.thumbnail || item.src"
              [alt]="item.alt || item.title || ''"
              [loading]="lazyLoading ? 'lazy' : 'eager'"
              (load)="handleImageLoad(item, $event)"
              (error)="handleImageError(item, $event)">
            
            @if (showOverlay && (item.title || item.caption)) {
              <div class="ui-gallery-grid__overlay">
                @if (item.title) {
                  <div class="ui-gallery-grid__title">{{ item.title }}</div>
                }
                @if (item.caption) {
                  <div class="ui-gallery-grid__caption">{{ item.caption }}</div>
                }
              </div>
            }
          </div>
        }
      }
    </div>
  `,
  styleUrl: './gallery-grid.component.scss'
})
export class GalleryGridComponent {
  @Input() items: GalleryGridItem[] = [];
  @Input() columns: GalleryGridColumns = 3;
  @Input() gap: GalleryGridGap = 'md';
  @Input() objectFit: GalleryGridObjectFit = 'cover';
  @Input() masonry = false;
  @Input() showOverlay = true;
  @Input() showZoomIndicator = true;
  @Input() lazyLoading = true;
  @Input() disabled = false;
  @Input() emptyText = 'No images to display';
  @Input() ariaLabel?: string;
  
  @Output() itemClick = new EventEmitter<{ item: GalleryGridItem; event: MouseEvent }>();
  @Output() itemSelect = new EventEmitter<GalleryGridItem>();
  @Output() imageLoad = new EventEmitter<{ item: GalleryGridItem; event: Event }>();
  @Output() imageError = new EventEmitter<{ item: GalleryGridItem; event: Event }>();

  handleItemClick(item: GalleryGridItem, event: MouseEvent): void {
    if (this.disabled || item.loading) {
      return;
    }
    
    event.preventDefault();
    this.itemClick.emit({ item, event });
    
    // Toggle selection if item supports it
    if (item.selected !== undefined) {
      this.itemSelect.emit(item);
    }
  }

  handleItemKeydown(item: GalleryGridItem, event: KeyboardEvent): void {
    if (this.disabled || item.loading) {
      return;
    }
    
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.handleItemClick(item, event as any);
    }
    
    // Arrow key navigation
    if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
      event.preventDefault();
      this.handleArrowNavigation(item, event.key);
    }
  }

  handleImageLoad(item: GalleryGridItem, event: Event): void {
    this.imageLoad.emit({ item, event });
  }

  handleImageError(item: GalleryGridItem, event: Event): void {
    this.imageError.emit({ item, event });
  }

  private handleArrowNavigation(currentItem: GalleryGridItem, key: string): void {
    const currentIndex = this.items.findIndex(item => item.id === currentItem.id);
    if (currentIndex === -1) return;
    
    let nextIndex: number;
    const columnsNum = typeof this.columns === 'number' ? this.columns : 3;
    
    switch (key) {
      case 'ArrowLeft':
        nextIndex = currentIndex > 0 ? currentIndex - 1 : this.items.length - 1;
        break;
      case 'ArrowRight':
        nextIndex = currentIndex < this.items.length - 1 ? currentIndex + 1 : 0;
        break;
      case 'ArrowUp':
        nextIndex = currentIndex - columnsNum;
        if (nextIndex < 0) {
          nextIndex = Math.floor((this.items.length - 1) / columnsNum) * columnsNum + (currentIndex % columnsNum);
          if (nextIndex >= this.items.length) {
            nextIndex -= columnsNum;
          }
        }
        break;
      case 'ArrowDown':
        nextIndex = currentIndex + columnsNum;
        if (nextIndex >= this.items.length) {
          nextIndex = currentIndex % columnsNum;
        }
        break;
      default:
        return;
    }
    
    // Focus the next item
    this.focusItem(nextIndex);
  }

  private focusItem(index: number): void {
    // This would ideally use ViewChild to focus the specific item
    // For now, we'll rely on the browser's tab navigation
    setTimeout(() => {
      const items = document.querySelectorAll('.ui-gallery-grid__item');
      const targetItem = items[index] as HTMLElement;
      if (targetItem) {
        targetItem.focus();
      }
    }, 0);
  }

  getGridClasses(): string {
    const columnsClass = typeof this.columns === 'number' 
      ? `ui-gallery-grid--columns-${this.columns}` 
      : `ui-gallery-grid--${this.columns}`;
    const gapClass = `ui-gallery-grid--gap-${this.gap}`;
    
    return `${columnsClass} ${gapClass}`;
  }

  getImageClasses(): string {
    return `ui-gallery-grid__image--${this.objectFit}`;
  }

  getItemAriaLabel(item: GalleryGridItem): string {
    const parts: string[] = [];
    
    if (item.title) {
      parts.push(item.title);
    }
    
    if (item.caption) {
      parts.push(item.caption);
    }
    
    if (item.alt) {
      parts.push(item.alt);
    }
    
    if (parts.length === 0) {
      parts.push('Gallery image');
    }
    
    if (item.selected) {
      parts.push('selected');
    }
    
    if (item.loading) {
      parts.push('loading');
    }
    
    return parts.join(', ');
  }

  // Utility methods for external use
  selectItem(itemId: string | number): void {
    const item = this.items.find(i => i.id === itemId);
    if (item) {
      item.selected = true;
      this.itemSelect.emit(item);
    }
  }

  deselectItem(itemId: string | number): void {
    const item = this.items.find(i => i.id === itemId);
    if (item) {
      item.selected = false;
    }
  }

  selectAll(): void {
    this.items.forEach(item => {
      item.selected = true;
    });
  }

  deselectAll(): void {
    this.items.forEach(item => {
      item.selected = false;
    });
  }

  getSelectedItems(): GalleryGridItem[] {
    return this.items.filter(item => item.selected);
  }
}S߹x) export * from './gallery-grid.component';-ximport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type GridColumns = 1 | 2 | 3 | 4 | 5 | 6 | 'auto-fit' | 'auto-fill';
type GridGap = 'sm' | 'md' | 'lg';
type GridPadding = 'none' | 'sm' | 'md' | 'lg';
type GridRowMode = 'auto' | 'equal' | 'min-content' | 'max-content';
type GridJustifyContent = 'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly';
type GridAlignContent = 'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly';
type GridAlignItems = 'start' | 'center' | 'end' | 'stretch';

@Component({
  selector: 'ui-grid-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-grid-container"
      [class.ui-grid-container--gap-sm]="gap === 'sm'"
      [class.ui-grid-container--gap-md]="gap === 'md'"
      [class.ui-grid-container--gap-lg]="gap === 'lg'"
      [class.ui-grid-container--padding-none]="padding === 'none'"
      [class.ui-grid-container--padding-sm]="padding === 'sm'"
      [class.ui-grid-container--padding-md]="padding === 'md'"
      [class.ui-grid-container--padding-lg]="padding === 'lg'"
      [class.ui-grid-container--cols-1]="columns === 1"
      [class.ui-grid-container--cols-2]="columns === 2"
      [class.ui-grid-container--cols-3]="columns === 3"
      [class.ui-grid-container--cols-4]="columns === 4"
      [class.ui-grid-container--cols-5]="columns === 5"
      [class.ui-grid-container--cols-6]="columns === 6"
      [class.ui-grid-container--auto-fit]="columns === 'auto-fit'"
      [class.ui-grid-container--auto-fill]="columns === 'auto-fill'"
      [class.ui-grid-container--rows-auto]="rowMode === 'auto'"
      [class.ui-grid-container--rows-equal]="rowMode === 'equal'"
      [class.ui-grid-container--rows-min-content]="rowMode === 'min-content'"
      [class.ui-grid-container--rows-max-content]="rowMode === 'max-content'"
      [class.ui-grid-container--dense]="dense"
      [class.ui-grid-container--justify-start]="justifyContent === 'start'"
      [class.ui-grid-container--justify-center]="justifyContent === 'center'"
      [class.ui-grid-container--justify-end]="justifyContent === 'end'"
      [class.ui-grid-container--justify-space-between]="justifyContent === 'space-between'"
      [class.ui-grid-container--justify-space-around]="justifyContent === 'space-around'"
      [class.ui-grid-container--justify-space-evenly]="justifyContent === 'space-evenly'"
      [class.ui-grid-container--align-start]="alignContent === 'start'"
      [class.ui-grid-container--align-center]="alignContent === 'center'"
      [class.ui-grid-container--align-end]="alignContent === 'end'"
      [class.ui-grid-container--align-space-between]="alignContent === 'space-between'"
      [class.ui-grid-container--align-space-around]="alignContent === 'space-around'"
      [class.ui-grid-container--align-space-evenly]="alignContent === 'space-evenly'"
      [class.ui-grid-container--items-start]="alignItems === 'start'"
      [class.ui-grid-container--items-center]="alignItems === 'center'"
      [class.ui-grid-container--items-end]="alignItems === 'end'"
      [class.ui-grid-container--items-stretch]="alignItems === 'stretch'"
      [style.grid-template-columns]="customColumns || null"
      [style.grid-template-rows]="customRows || null"
      [style.grid-template-areas]="templateAreas || null"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './grid-container.component.scss'
})
export class GridContainerComponent {
  @Input() columns: GridColumns = 'auto-fit';
  @Input() gap: GridGap = 'md';
  @Input() padding: GridPadding = 'md';
  @Input() rowMode: GridRowMode = 'auto';
  @Input() dense = false;
  @Input() justifyContent: GridJustifyContent | null = null;
  @Input() alignContent: GridAlignContent | null = null;
  @Input() alignItems: GridAlignItems = 'stretch';
  
  // Advanced CSS Grid Properties
  @Input() customColumns: string | null = null;
  @Input() customRows: string | null = null;
  @Input() templateAreas: string | null = null;
  
  // Accessibility
  @Input() role: string = 'grid';
  @Input() ariaLabel: string | null = null;
}U"x+ export * from './grid-container.component';L^cx  "Ssó4^S;_xo@use '../../../../../../ui-design-system/src/styles/semantic' as tokens;

.ui-grid-system {
  display: grid;
  position: relative;
  width: 100%;
  
  // Base grid layout
  gap: tokens.$semantic-spacing-grid-gap-md;
  
  // Size variants
  &--gap-xs {
    gap: tokens.$semantic-spacing-grid-gap-xs;
  }
  
  &--gap-sm {
    gap: tokens.$semantic-spacing-grid-gap-sm;
  }
  
  &--gap-md {
    gap: tokens.$semantic-spacing-grid-gap-md;
  }
  
  &--gap-lg {
    gap: tokens.$semantic-spacing-grid-gap-lg;
  }
  
  &--gap-xl {
    gap: tokens.$semantic-spacing-grid-gap-xl;
  }
  
  // Column variants
  &--cols-1 {
    grid-template-columns: repeat(1, 1fr);
  }
  
  &--cols-2 {
    grid-template-columns: repeat(2, 1fr);
  }
  
  &--cols-3 {
    grid-template-columns: repeat(3, 1fr);
  }
  
  &--cols-4 {
    grid-template-columns: repeat(4, 1fr);
  }
  
  &--cols-6 {
    grid-template-columns: repeat(6, 1fr);
  }
  
  &--cols-12 {
    grid-template-columns: repeat(12, 1fr);
  }
  
  // Auto-fill responsive columns
  &--auto-fill {
    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  }
  
  &--auto-fit {
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  }
  
  // Row gap variants
  &--row-gap-xs {
    row-gap: tokens.$semantic-spacing-grid-gap-xs;
  }
  
  &--row-gap-sm {
    row-gap: tokens.$semantic-spacing-grid-gap-sm;
  }
  
  &--row-gap-md {
    row-gap: tokens.$semantic-spacing-grid-gap-md;
  }
  
  &--row-gap-lg {
    row-gap: tokens.$semantic-spacing-grid-gap-lg;
  }
  
  &--row-gap-xl {
    row-gap: tokens.$semantic-spacing-grid-gap-xl;
  }
  
  // Column gap variants
  &--column-gap-xs {
    column-gap: tokens.$semantic-spacing-grid-gap-xs;
  }
  
  &--column-gap-sm {
    column-gap: tokens.$semantic-spacing-grid-gap-sm;
  }
  
  &--column-gap-md {
    column-gap: tokens.$semantic-spacing-grid-gap-md;
  }
  
  &--column-gap-lg {
    column-gap: tokens.$semantic-spacing-grid-gap-lg;
  }
  
  &--column-gap-xl {
    column-gap: tokens.$semantic-spacing-grid-gap-xl;
  }
  
  // Alignment variants
  &--justify-start {
    justify-items: start;
  }
  
  &--justify-end {
    justify-items: end;
  }
  
  &--justify-center {
    justify-items: center;
  }
  
  &--justify-stretch {
    justify-items: stretch;
  }
  
  &--align-start {
    align-items: start;
  }
  
  &--align-end {
    align-items: end;
  }
  
  &--align-center {
    align-items: center;
  }
  
  &--align-stretch {
    align-items: stretch;
  }
  
  // Content alignment
  &--justify-content-start {
    justify-content: start;
  }
  
  &--justify-content-end {
    justify-content: end;
  }
  
  &--justify-content-center {
    justify-content: center;
  }
  
  &--justify-content-stretch {
    justify-content: stretch;
  }
  
  &--justify-content-space-around {
    justify-content: space-around;
  }
  
  &--justify-content-space-between {
    justify-content: space-between;
  }
  
  &--justify-content-space-evenly {
    justify-content: space-evenly;
  }
  
  &--align-content-start {
    align-content: start;
  }
  
  &--align-content-end {
    align-content: end;
  }
  
  &--align-content-center {
    align-content: center;
  }
  
  &--align-content-stretch {
    align-content: stretch;
  }
  
  &--align-content-space-around {
    align-content: space-around;
  }
  
  &--align-content-space-between {
    align-content: space-between;
  }
  
  &--align-content-space-evenly {
    align-content: space-evenly;
  }
  
  // Dense packing
  &--auto-rows-min {
    grid-auto-rows: min-content;
  }
  
  &--auto-rows-max {
    grid-auto-rows: max-content;
  }
  
  &--auto-rows-fr {
    grid-auto-rows: 1fr;
  }
  
  &--dense {
    grid-auto-flow: dense;
  }
  
  // Responsive behavior
  @media (max-width: 768px) {
    &--responsive {
      grid-template-columns: 1fr;
      gap: tokens.$semantic-spacing-grid-gap-sm;
    }
    
    &--cols-12,
    &--cols-6,
    &--cols-4 {
      grid-template-columns: repeat(2, 1fr);
    }
  }
  
  @media (max-width: 480px) {
    &--responsive {
      gap: tokens.$semantic-spacing-grid-gap-xs;
    }
    
    &--cols-12,
    &--cols-6,
    &--cols-4,
    &--cols-3,
    &--cols-2 {
      grid-template-columns: 1fr;
    }
  }
}G}x{BagqFbQjniFw VY{xximport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type GridColumns = 1 | 2 | 3 | 4 | 6 | 12 | 'auto-fill' | 'auto-fit';
type GridGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
type GridAlignment = 'start' | 'end' | 'center' | 'stretch';
type GridContentAlignment = 'start' | 'end' | 'center' | 'stretch' | 'space-around' | 'space-between' | 'space-evenly';
type GridAutoRows = 'min' | 'max' | 'fr';

@Component({
  selector: 'ui-grid-system',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-grid-system"
      [class.ui-grid-system--cols-{{columns}}]="columns"
      [class.ui-grid-system--gap-{{gap}}]="gap"
      [class.ui-grid-system--row-gap-{{rowGap}}]="rowGap"
      [class.ui-grid-system--column-gap-{{columnGap}}]="columnGap"
      [class.ui-grid-system--justify-{{justifyItems}}]="justifyItems"
      [class.ui-grid-system--align-{{alignItems}}]="alignItems"
      [class.ui-grid-system--justify-content-{{justifyContent}}]="justifyContent"
      [class.ui-grid-system--align-content-{{alignContent}}]="alignContent"
      [class.ui-grid-system--auto-rows-{{autoRows}}]="autoRows"
      [class.ui-grid-system--dense]="dense"
      [class.ui-grid-system--responsive]="responsive"
      [style.grid-template-columns]="customColumns"
      [style.grid-template-rows]="customRows"
      [attr.role]="role">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './grid-system.component.scss'
})
export class GridSystemComponent {
  @Input() columns: GridColumns = 'auto-fit';
  @Input() gap: GridGap = 'md';
  @Input() rowGap?: GridGap;
  @Input() columnGap?: GridGap;
  @Input() justifyItems?: GridAlignment;
  @Input() alignItems?: GridAlignment;
  @Input() justifyContent?: GridContentAlignment;
  @Input() alignContent?: GridContentAlignment;
  @Input() autoRows?: GridAutoRows;
  @Input() dense = false;
  @Input() responsive = true;
  @Input() customColumns?: string;
  @Input() customRows?: string;
  @Input() role = 'grid';
} ډx( export * from './grid-system.component'; 3@x @use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-stack {
  display: flex;
  position: relative;
  
  // Base structure
  &--column {
    flex-direction: column;
  }
  
  &--row {
    flex-direction: row;
  }
  
  // Inline variant
  &--inline {
    display: inline-flex;
  }
  
  // Spacing variants - using semantic stack spacing tokens
  &--spacing-xs {
    gap: $semantic-spacing-stack-xs;
  }
  
  &--spacing-sm {
    gap: $semantic-spacing-stack-sm;
  }
  
  &--spacing-md {
    gap: $semantic-spacing-stack-md;
  }
  
  &--spacing-lg {
    gap: $semantic-spacing-stack-lg;
  }
  
  &--spacing-xl {
    gap: $semantic-spacing-stack-xl;
  }
  
  &--spacing-2xl {
    gap: $semantic-spacing-2xl;
  }
  
  &--spacing-3xl {
    gap: $semantic-spacing-3xl;
  }
  
  &--spacing-4xl {
    gap: $semantic-spacing-4xl;
  }
  
  &--spacing-5xl {
    gap: $semantic-spacing-5xl;
  }
  
  // Alignment variants
  &--align-start {
    align-items: flex-start;
  }
  
  &--align-center {
    align-items: center;
  }
  
  &--align-end {
    align-items: flex-end;
  }
  
  &--align-stretch {
    align-items: stretch;
  }
  
  &--align-baseline {
    align-items: baseline;
  }
  
  // Justify variants
  &--justify-start {
    justify-content: flex-start;
  }
  
  &--justify-center {
    justify-content: center;
  }
  
  &--justify-end {
    justify-content: flex-end;
  }
  
  &--justify-between {
    justify-content: space-between;
  }
  
  &--justify-around {
    justify-content: space-around;
  }
  
  &--justify-evenly {
    justify-content: space-evenly;
  }
  
  // Wrap variants
  &--wrap-wrap {
    flex-wrap: wrap;
  }
  
  &--wrap-nowrap {
    flex-wrap: nowrap;
  }
  
  &--wrap-wrap-reverse {
    flex-wrap: wrap-reverse;
  }
  
  // Divider variant - adds borders between children
  &--divider {
    &.ui-stack--column > :not(:last-child) {
      border-bottom: $semantic-border-width-1 solid $semantic-color-border-secondary;
      padding-bottom: $semantic-spacing-component-sm;
      margin-bottom: $semantic-spacing-component-sm;
    }
    
    &.ui-stack--row > :not(:last-child) {
      border-right: $semantic-border-width-1 solid $semantic-color-border-secondary;
      padding-right: $semantic-spacing-component-sm;
      margin-right: $semantic-spacing-component-sm;
    }
    
    // Remove gap when using dividers to avoid double spacing
    gap: 0;
  }
  
  // Responsive behavior
  &--responsive {
    // On small screens, convert horizontal stacks to vertical for better usability
    @media (max-width: 640px) {
      &.ui-stack--row {
        flex-direction: column;
        
        // Adjust dividers for responsive layout
        &.ui-stack--divider {
          > :not(:last-child) {
            border-right: none;
            border-bottom: $semantic-border-width-1 solid $semantic-color-border-secondary;
            padding-right: 0;
            margin-right: 0;
            padding-bottom: $semantic-spacing-component-sm;
            margin-bottom: $semantic-spacing-component-sm;
          }
        }
      }
      
      // Reduce spacing on small screens
      &.ui-stack--spacing-xl,
      &.ui-stack--spacing-2xl,
      &.ui-stack--spacing-3xl,
      &.ui-stack--spacing-4xl,
      &.ui-stack--spacing-5xl {
        gap: $semantic-spacing-stack-lg;
      }
    }
    
    @media (max-width: 480px) {
      &.ui-stack--spacing-lg,
      &.ui-stack--spacing-xl,
      &.ui-stack--spacing-2xl,
      &.ui-stack--spacing-3xl,
      &.ui-stack--spacing-4xl,
      &.ui-stack--spacing-5xl {
        gap: $semantic-spacing-stack-md;
      }
    }
  }
}J.xXOhOflex-direction: rowf C4Full width variant
  &--full-width {
    width: 100%+h'Vertical alignment (cross-axis for row)&Horizontal justify (main-axis for row)=vertical-
_\<	"E// Convert to vertical stack on small screens for better usability
  8

K
5&.ui-hstack--divider {

(

Z@^{:7Eh?h]hhh:Bh6h?h]hhhQM6x OvP+column~m/height variants-&--full-height {
    heightn+Horizontal alignment (cross-axis for columnؓzcolumnyhorizontRb
Eb
.
3&
+vv0vPvpv|vvv0vPvpv:&cS̷sx7import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type StackDirection = 'column' | 'row';
type StackSpacing = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
type StackAlignment = 'start' | 'center' | 'end' | 'stretch' | 'baseline';
type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
type StackWrap = 'nowrap' | 'wrap' | 'wrap-reverse';

@Component({
  selector: 'ui-stack',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      [ngClass]="getClasses()"
      [attr.role]="role"
      [style.gap]="customGap">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './stack.component.scss'
})
export class StackComponent {
  @Input() direction: StackDirection = 'column';
  @Input() spacing: StackSpacing = 'md';
  @Input() align?: StackAlignment;
  @Input() justify?: StackJustify;
  @Input() wrap?: StackWrap;
  @Input() inline = false;
  @Input() responsive = true;
  @Input() divider = false;
  @Input() customGap?: string;
  @Input() role?: string;

  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {
      'ui-stack': true,
      [`ui-stack--${this.direction}`]: true,
      [`ui-stack--spacing-${this.spacing}`]: true,
      'ui-stack--inline': this.inline,
      'ui-stack--responsive': this.responsive,
      'ui-stack--divider': this.divider
    };

    if (this.align) {
      classes[`ui-stack--align-${this.align}`] = true;
    }

    if (this.justify) {
      classes[`ui-stack--justify-${this.justify}`] = true;
    }

    if (this.wrap) {
      classes[`ui-stack--wrap-${this.wrap}`] = true;
    }

    return classes;
  }
}5TBDx *QVerticalFHorizontalJustify !shHhE&Hk1Vertical 
Horizontal	fullWidthh+hq2h'h/h/,
      'ui-hstack--full-width': this.fullWidth1hGVhWhCG1dx Horizont4;
type Vertic@JvHv'&VNMHorizont"VerticalJustify
fullHeight\vstack': true,
      [`ui-v2vQ'vy/v)v"1,
      'ui-vstack--full-height': this.fullHeight1v'Vv~47Mx# export * from './hstack.component';F+xBexport * from './aspect-ratio';
export * from './bento-grid';
export * from './box';
export * from './breakpoint-container';
export * from './center';
export * from './column';
export * from './container';
export * from './dashboard-shell';
export * from './divider';
export * from './feed-layout';
export * from './flex';
export * from './grid-container';
export * from './grid-system';
export * from './hstack';
export * from './list-detail-layout';
export * from './scroll-container';
export * from './section';
export * from './sidebar-layout';
export * from './spacer';
export * from './stack';
export * from './supporting-pane-layout';
export * from './tabs-container';
export * from './vstack';9Jxo Uallery-gridT[infinite-scrollpkanban-board&masonry	plit-viewQticky!iT&x6 export * from './infinite-scroll-container.component';ʺxJ,import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, ViewChild, AfterViewInit, OnDestroy, TemplateRef } from '@angular/core';
import { CommonModule } from '@angular/common';

type InfiniteScrollDirection = 'down' | 'up' | 'both';
type InfiniteScrollThreshold = number;

export interface InfiniteScrollEvent {
  direction: 'up' | 'down';
  currentIndex: number;
  scrollPosition: number;
}

export interface InfiniteScrollConfig {
  threshold?: number; // Distance from edge to trigger load (in pixels)
  debounceTime?: number; // Debounce time for scroll events (in ms)
  disabled?: boolean; // Disable infinite scrolling
  initialItemCount?: number; // Number of items to load initially
  itemHeight?: number; // Fixed height for virtual scrolling optimization
}

@Component({
  selector: 'ui-infinite-scroll-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      #scrollContainer
      class="ui-infinite-scroll-container"
      [class.ui-infinite-scroll-container--direction-down]="direction === 'down'"
      [class.ui-infinite-scroll-container--direction-up]="direction === 'up'"
      [class.ui-infinite-scroll-container--direction-both]="direction === 'both'"
      [class.ui-infinite-scroll-container--loading]="loading"
      [class.ui-infinite-scroll-container--disabled]="config?.disabled"
      [class.ui-infinite-scroll-container--has-fixed-height]="config?.itemHeight"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel"
      [attr.aria-busy]="loading"
      [tabindex]="tabIndex"
      (scroll)="onScroll($event)"
      (keydown)="onKeyDown($event)">
      
      @if (direction === 'up' || direction === 'both') {
        <!-- Top loading indicator -->
        <div class="ui-infinite-scroll-container__loader ui-infinite-scroll-container__loader--top">
          @if (loadingUp && loadingTemplate) {
            <ng-container [ngTemplateOutlet]="loadingTemplate"></ng-container>
          } @else if (loadingUp) {
            <div class="ui-infinite-scroll-container__default-loader">
              <span class="ui-infinite-scroll-container__spinner" aria-hidden="true"></span>
              <span>Loading more items...</span>
            </div>
          }
        </div>
      }
      
      <!-- Main content area -->
      <div class="ui-infinite-scroll-container__content">
        @if (items && items.length > 0 && itemTemplate) {
          <!-- Template-based rendering -->
          @for (item of items; track trackByFn ? trackByFn($index, item) : item; let i = $index) {
            <div 
              class="ui-infinite-scroll-container__item"
              [style.height.px]="config?.itemHeight"
              [attr.data-index]="i">
              <ng-container [ngTemplateOutlet]="itemTemplate" [ngTemplateOutletContext]="{ 
                $implicit: item, 
                item: item, 
                index: i,
                isFirst: i === 0,
                isLast: i === items.length - 1
              }"></ng-container>
            </div>
          }
        } @else {
          <!-- Content projection -->
          <ng-content></ng-content>
        }
      </div>
      
      @if (direction === 'down' || direction === 'both') {
        <!-- Bottom loading indicator -->
        <div class="ui-infinite-scroll-container__loader ui-infinite-scroll-container__loader--bottom">
          @if (loadingDown && loadingTemplate) {
            <ng-container [ngTemplateOutlet]="loadingTemplate"></ng-container>
          } @else if (loadingDown) {
            <div class="ui-infinite-scroll-container__default-loader">
              <span class="ui-infinite-scroll-container__spinner" aria-hidden="true"></span>
              <span>Loading more items...</span>
            </div>
          }
        </div>
      }
      
      @if (hasMore === false && endTemplate) {
        <!-- End of content indicator -->
        <div class="ui-infinite-scroll-container__end">
          <ng-container [ngTemplateOutlet]="endTemplate"></ng-container>
        </div>
      } @else if (hasMore === false) {
        <div class="ui-infinite-scroll-container__end">
          <div class="ui-infinite-scroll-container__default-end">
            No more items to load
          </div>
        </div>
      }
      
      @if (error && errorTemplate) {
        <!-- Error state -->
        <div class="ui-infinite-scroll-container__error">
          <ng-container [ngTemplateOutlet]="errorTemplate" [ngTemplateOutletContext]="{ error: error }"></ng-container>
        </div>
      } @else if (error) {
        <div class="ui-infinite-scroll-container__error">
          <div class="ui-infinite-scroll-container__default-error">
            <span>Failed to load more items</span>
            <button 
              type="button" 
              class="ui-infinite-scroll-container__retry-button"
              (click)="retry()"
              [attr.aria-label]="'Retry loading more items'">
              Retry
            </button>
          </div>
        </div>
      }
    </div>
  `,
  styleUrl: './infinite-scroll-container.component.scss'
})
export class InfiniteScrollContainerComponent implements AfterViewInit, OnDestroy {
  @ViewChild('scrollContainer', { static: true }) scrollContainer!: ElementRef<HTMLDivElement>;

  // Basic Configuration
  @Input() direction: InfiniteScrollDirection = 'down';
  @Input() config?: InfiniteScrollConfig;
  @Input() role = 'region';
  @Input() ariaLabel = 'Infinite scroll content';
  @Input() tabIndex = 0;

  // Data Management
  @Input() items?: any[];
  @Input() itemTemplate?: TemplateRef<any>;
  @Input() trackByFn?: (index: number, item: any) => any;
  @Input() hasMore = true;

  // State Management
  @Input() loading = false;
  @Input() loadingUp = false;
  @Input() loadingDown = false;
  @Input() error?: string | Error;

  // Templates
  @Input() loadingTemplate?: TemplateRef<any>;
  @Input() errorTemplate?: TemplateRef<any>;
  @Input() endTemplate?: TemplateRef<any>;

  // Events
  @Output() scrolledToEnd = new EventEmitter<InfiniteScrollEvent>();
  @Output() scrolledToTop = new EventEmitter<InfiniteScrollEvent>();
  @Output() loadMore = new EventEmitter<InfiniteScrollEvent>();
  @Output() retryRequested = new EventEmitter<void>();
  @Output() scrolled = new EventEmitter<{ scrollTop: number; scrollHeight: number; clientHeight: number }>();

  // Internal State
  private scrollTimeout?: number;
  private isScrolling = false;
  private lastScrollTop = 0;
  private currentIndex = 0;

  private get threshold(): number {
    return this.config?.threshold ?? 200;
  }

  private get debounceTime(): number {
    return this.config?.debounceTime ?? 100;
  }

  private get isDisabled(): boolean {
    return this.config?.disabled ?? false;
  }

  ngAfterViewInit(): void {
    // Initial setup
    this.updateCurrentIndex();
  }

  ngOnDestroy(): void {
    if (this.scrollTimeout) {
      clearTimeout(this.scrollTimeout);
    }
  }

  onScroll(event: Event): void {
    if (this.isDisabled) return;

    const element = event.target as HTMLElement;
    const scrollTop = element.scrollTop;
    const scrollHeight = element.scrollHeight;
    const clientHeight = element.clientHeight;

    // Emit scroll position
    this.scrolled.emit({ scrollTop, scrollHeight, clientHeight });

    // Debounced scroll handling
    if (this.scrollTimeout) {
      clearTimeout(this.scrollTimeout);
    }

    this.scrollTimeout = window.setTimeout(() => {
      this.handleScroll(element, scrollTop, scrollHeight, clientHeight);
    }, this.debounceTime);

    this.lastScrollTop = scrollTop;
  }

  onKeyDown(event: KeyboardEvent): void {
    if (this.isDisabled) return;

    const element = this.scrollContainer.nativeElement;
    let handled = false;

    switch (event.key) {
      case 'ArrowDown':
        this.scrollBy(40);
        handled = true;
        break;
      case 'ArrowUp':
        this.scrollBy(-40);
        handled = true;
        break;
      case 'PageDown':
        this.scrollBy(element.clientHeight * 0.8);
        handled = true;
        break;
      case 'PageUp':
        this.scrollBy(-element.clientHeight * 0.8);
        handled = true;
        break;
      case 'Home':
        this.scrollToTop();
        handled = true;
        break;
      case 'End':
        this.scrollToBottom();
        handled = true;
        break;
    }

    if (handled) {
      event.preventDefault();
    }
  }

  // Public API Methods
  scrollBy(deltaY: number): void {
    const element = this.scrollContainer.nativeElement;
    element.scrollBy({
      top: deltaY,
      behavior: 'smooth'
    });
  }

  scrollToTop(): void {
    const element = this.scrollContainer.nativeElement;
    element.scrollTo({ top: 0, behavior: 'smooth' });
  }

  scrollToBottom(): void {
    const element = this.scrollContainer.nativeElement;
    element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' });
  }

  scrollToIndex(index: number): void {
    if (!this.config?.itemHeight || !this.items) return;

    const targetY = index * this.config.itemHeight;
    const element = this.scrollContainer.nativeElement;
    element.scrollTo({ top: targetY, behavior: 'smooth' });
  }

  retry(): void {
    this.retryRequested.emit();
  }

  resetScroll(): void {
    const element = this.scrollContainer.nativeElement;
    element.scrollTo({ top: 0 });
    this.currentIndex = 0;
  }

  // Private Methods
  private handleScroll(
    element: HTMLElement, 
    scrollTop: number, 
    scrollHeight: number, 
    clientHeight: number
  ): void {
    this.updateCurrentIndex();

    const scrollDirection = scrollTop > this.lastScrollTop ? 'down' : 'up';
    
    // Check for infinite scroll triggers
    if (this.shouldLoadMore('down', element)) {
      const event: InfiniteScrollEvent = {
        direction: 'down',
        currentIndex: this.currentIndex,
        scrollPosition: scrollTop
      };

      this.scrolledToEnd.emit(event);
      this.loadMore.emit(event);
    }

    if (this.shouldLoadMore('up', element)) {
      const event: InfiniteScrollEvent = {
        direction: 'up', 
        currentIndex: this.currentIndex,
        scrollPosition: scrollTop
      };

      this.scrolledToTop.emit(event);
      this.loadMore.emit(event);
    }
  }

  private shouldLoadMore(direction: 'up' | 'down', element: HTMLElement): boolean {
    if (this.isDisabled || this.loading) return false;

    if (direction === 'down') {
      if (this.direction !== 'down' && this.direction !== 'both') return false;
      if (!this.hasMore || this.loadingDown) return false;

      const scrollBottom = element.scrollHeight - element.scrollTop - element.clientHeight;
      return scrollBottom <= this.threshold;
    } else {
      if (this.direction !== 'up' && this.direction !== 'both') return false;
      if (this.loadingUp) return false;

      return element.scrollTop <= this.threshold;
    }
  }

  private updateCurrentIndex(): void {
    if (!this.config?.itemHeight || !this.items) return;

    const element = this.scrollContainer.nativeElement;
    const scrollTop = element.scrollTop;
    this.currentIndex = Math.floor(scrollTop / this.config.itemHeight);
  }
}&\x) export * from './kanban-board.component';+3hxN$import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

export interface KanbanColumn {
  id: string;
  title: string;
  items: KanbanItem[];
  maxItems?: number;
  disabled?: boolean;
}

export interface KanbanItem {
  id: string;
  title: string;
  description?: string;
  priority?: 'low' | 'medium' | 'high';
  tags?: string[];
  assignee?: string;
  dueDate?: Date;
}

export interface KanbanDragEvent {
  item: KanbanItem;
  fromColumn: string;
  toColumn: string;
  fromIndex: number;
  toIndex: number;
}

type KanbanSize = 'sm' | 'md' | 'lg';

@Component({
  selector: 'ui-kanban-board',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-kanban-board"
      [class.ui-kanban-board--sm]="size === 'sm'"
      [class.ui-kanban-board--md]="size === 'md'"
      [class.ui-kanban-board--lg]="size === 'lg'"
      [class.ui-kanban-board--disabled]="disabled"
      role="application"
      [attr.aria-label]="ariaLabel || 'Kanban board'">
      
      <div class="ui-kanban-board__header" *ngIf="title">
        <h2 class="ui-kanban-board__title">{{ title }}</h2>
        @if (subtitle) {
          <p class="ui-kanban-board__subtitle">{{ subtitle }}</p>
        }
      </div>
      
      <div class="ui-kanban-board__columns" 
           role="group" 
           [attr.aria-label]="'Kanban columns with ' + columns.length + ' columns'">
        @for (column of columns; track column.id; let columnIndex = $index) {
          <div 
            class="ui-kanban-board__column"
            [class.ui-kanban-board__column--disabled]="column.disabled || disabled"
            [class.ui-kanban-board__column--full]="column.maxItems && column.items.length >= column.maxItems"
            [attr.data-column-id]="column.id"
            role="region"
            [attr.aria-label]="column.title + ' column with ' + column.items.length + ' items'"
            (dragover)="onDragOver($event, column)"
            (drop)="onDrop($event, column, columnIndex)">
            
            <div class="ui-kanban-board__column-header">
              <h3 class="ui-kanban-board__column-title">{{ column.title }}</h3>
              <span class="ui-kanban-board__column-count" 
                    [attr.aria-label]="column.items.length + ' items in this column'">
                {{ column.items.length }}
                @if (column.maxItems) {
                  <span class="ui-kanban-board__column-limit">/ {{ column.maxItems }}</span>
                }
              </span>
            </div>
            
            <div class="ui-kanban-board__column-content"
                 role="list">
              @for (item of column.items; track item.id; let itemIndex = $index) {
                <div 
                  class="ui-kanban-board__item"
                  [class.ui-kanban-board__item--priority-low]="item.priority === 'low'"
                  [class.ui-kanban-board__item--priority-medium]="item.priority === 'medium'"
                  [class.ui-kanban-board__item--priority-high]="item.priority === 'high'"
                  [class.ui-kanban-board__item--dragging]="draggedItem?.id === item.id"
                  [attr.data-item-id]="item.id"
                  [draggable]="!disabled && !column.disabled"
                  role="listitem"
                  [attr.aria-label]="getItemAriaLabel(item)"
                  [tabindex]="disabled || column.disabled ? -1 : 0"
                  (dragstart)="onDragStart($event, item, column.id, itemIndex)"
                  (dragend)="onDragEnd($event)"
                  (click)="onItemClick(item, column.id)"
                  (keydown)="onItemKeydown($event, item, column.id)">
                  
                  <div class="ui-kanban-board__item-header">
                    <h4 class="ui-kanban-board__item-title">{{ item.title }}</h4>
                    @if (item.priority) {
                      <span class="ui-kanban-board__item-priority" 
                            [attr.aria-label]="item.priority + ' priority'">
                        @switch (item.priority) {
                          @case ('high') { 🔴 }
                          @case ('medium') { 🟡 }
                          @case ('low') { 🟢 }
                        }
                      </span>
                    }
                  </div>
                  
                  @if (item.description) {
                    <p class="ui-kanban-board__item-description">{{ item.description }}</p>
                  }
                  
                  @if (item.tags && item.tags.length > 0) {
                    <div class="ui-kanban-board__item-tags" role="list" aria-label="Item tags">
                      @for (tag of item.tags; track tag) {
                        <span class="ui-kanban-board__item-tag" role="listitem">{{ tag }}</span>
                      }
                    </div>
                  }
                  
                  @if (item.assignee || item.dueDate) {
                    <div class="ui-kanban-board__item-meta">
                      @if (item.assignee) {
                        <span class="ui-kanban-board__item-assignee" 
                              [attr.aria-label]="'Assigned to ' + item.assignee">
                          👤 {{ item.assignee }}
                        </span>
                      }
                      @if (item.dueDate) {
                        <span class="ui-kanban-board__item-due-date" 
                              [attr.aria-label]="'Due date ' + (item.dueDate | date)">
                          📅 {{ item.dueDate | date:'short' }}
                        </span>
                      }
                    </div>
                  }
                </div>
              }
              
              @if (column.items.length === 0) {
                <div class="ui-kanban-board__empty-state" 
                     role="status" 
                     aria-label="No items in this column">
                  <p class="ui-kanban-board__empty-text">No items</p>
                </div>
              }
            </div>
          </div>
        }
      </div>
    </div>
  `,
  styleUrl: './kanban-board.component.scss'
})
export class KanbanBoardComponent {
  @Input() columns: KanbanColumn[] = [];
  @Input() size: KanbanSize = 'md';
  @Input() disabled = false;
  @Input() title?: string;
  @Input() subtitle?: string;
  @Input() ariaLabel?: string;
  
  @Output() itemMoved = new EventEmitter<KanbanDragEvent>();
  @Output() itemClicked = new EventEmitter<{ item: KanbanItem; columnId: string }>();
  @Output() columnChanged = new EventEmitter<{ column: KanbanColumn; action: 'add' | 'remove' | 'update' }>();
  
  draggedItem: KanbanItem | null = null;
  draggedFromColumn: string | null = null;
  draggedFromIndex: number | null = null;
  
  onDragStart(event: DragEvent, item: KanbanItem, columnId: string, itemIndex: number): void {
    if (this.disabled) {
      event.preventDefault();
      return;
    }
    
    this.draggedItem = item;
    this.draggedFromColumn = columnId;
    this.draggedFromIndex = itemIndex;
    
    if (event.dataTransfer) {
      event.dataTransfer.effectAllowed = 'move';
      event.dataTransfer.setData('text/plain', JSON.stringify({
        itemId: item.id,
        columnId,
        itemIndex
      }));
    }
  }
  
  onDragOver(event: DragEvent, column: KanbanColumn): void {
    if (this.disabled || column.disabled) {
      return;
    }
    
    event.preventDefault();
    
    if (event.dataTransfer) {
      event.dataTransfer.dropEffect = 'move';
    }
  }
  
  onDrop(event: DragEvent, column: KanbanColumn, columnIndex: number): void {
    event.preventDefault();
    
    if (this.disabled || column.disabled || !this.draggedItem || !this.draggedFromColumn) {
      return;
    }
    
    // Check if column is at capacity
    if (column.maxItems && column.items.length >= column.maxItems && column.id !== this.draggedFromColumn) {
      return;
    }
    
    const dragEvent: KanbanDragEvent = {
      item: this.draggedItem,
      fromColumn: this.draggedFromColumn,
      toColumn: column.id,
      fromIndex: this.draggedFromIndex!,
      toIndex: column.items.length
    };
    
    this.itemMoved.emit(dragEvent);
  }
  
  onDragEnd(event: DragEvent): void {
    this.draggedItem = null;
    this.draggedFromColumn = null;
    this.draggedFromIndex = null;
  }
  
  onItemClick(item: KanbanItem, columnId: string): void {
    if (!this.disabled) {
      this.itemClicked.emit({ item, columnId });
    }
  }
  
  onItemKeydown(event: KeyboardEvent, item: KanbanItem, columnId: string): void {
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.onItemClick(item, columnId);
    }
  }
  
  getItemAriaLabel(item: KanbanItem): string {
    let label = `Item: ${item.title}`;
    if (item.description) {
      label += `, ${item.description}`;
    }
    if (item.priority) {
      label += `, ${item.priority} priority`;
    }
    if (item.assignee) {
      label += `, assigned to ${item.assignee}`;
    }
    return label;
  }
}:)x/ export * from './list-detail-layout.component';﹐x	@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-list-detail-layout {
  // Core structure
  display: flex;
  position: relative;
  width: 100%;
  height: 100vh;
  
  // Visual design
  background: $semantic-color-surface-primary;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  border-radius: $semantic-border-radius-lg;
  
  // Typography
  font-family: map-get($semantic-typography-body-medium, font-family);
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-weight: map-get($semantic-typography-body-medium, font-weight);
  line-height: map-get($semantic-typography-body-medium, line-height);
  color: $semantic-color-text-primary;
  
  // Mobile-first orientation
  flex-direction: column;
  
  // Desktop orientation
  @media (min-width: $semantic-breakpoint-md) {
    flex-direction: row;
  }
  
  // List panel
  &__list {
    display: flex;
    flex-direction: column;
    position: relative;
    background: $semantic-color-surface-secondary;
    border-right: $semantic-border-width-1 solid $semantic-color-border-primary;
    overflow: hidden;
    
    // Mobile: full height, collapsed when detail shown
    flex: none;
    width: 100%;
    height: 100%;
    
    // Desktop: fixed width, full height
    @media (min-width: $semantic-breakpoint-md) {
      flex: none;
      width: 320px;
      height: auto;
    }
    
    // Resizable on desktop
    @media (min-width: $semantic-breakpoint-md) {
      resize: horizontal;
      min-width: 280px;
      max-width: 600px;
    }
    
    // Mobile: hide when detail is shown
    &--hidden-mobile {
      @media (max-width: calc($semantic-breakpoint-md - 1px)) {
        display: none;
      }
    }
  }
  
  // Detail panel
  &__detail {
    display: flex;
    flex-direction: column;
    position: relative;
    background: $semantic-color-surface-primary;
    overflow: hidden;
    
    // Mobile: full height, shown only when item selected
    flex: 1;
    width: 100%;
    height: 100%;
    
    // Desktop: flexible width
    @media (min-width: $semantic-breakpoint-md) {
      flex: 1;
      height: auto;
    }
    
    // Mobile: hide when no selection
    &--hidden-mobile {
      @media (max-width: calc($semantic-breakpoint-md - 1px)) {
        display: none;
      }
    }
    
    // Empty state
    &--empty {
      display: flex;
      align-items: center;
      justify-content: center;
      padding: $semantic-spacing-layout-section-lg;
      color: $semantic-color-text-secondary;
      
      font-family: map-get($semantic-typography-body-large, font-family);
      font-size: map-get($semantic-typography-body-large, font-size);
      font-weight: map-get($semantic-typography-body-large, font-weight);
      line-height: map-get($semantic-typography-body-large, line-height);
    }
  }
  
  // Resize handle for desktop
  &__resize-handle {
    display: none;
    position: absolute;
    top: 0;
    right: -2px;
    width: 4px;
    height: 100%;
    cursor: col-resize;
    background: transparent;
    z-index: 1;
    
    @media (min-width: $semantic-breakpoint-md) {
      display: block;
    }
    
    &:hover,
    &:active {
      background: $semantic-color-primary;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
  }
  
  // Mobile navigation controls
  &__mobile-nav {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: $semantic-spacing-component-md;
    background: $semantic-color-surface-elevated;
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    @media (min-width: $semantic-breakpoint-md) {
      display: none;
    }
  }
  
  &__mobile-nav-button {
    display: flex;
    align-items: center;
    gap: $semantic-spacing-component-xs;
    padding: $semantic-spacing-interactive-button-padding-y $semantic-spacing-interactive-button-padding-x;
    background: $semantic-color-surface-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    border-radius: $semantic-border-button-radius;
    color: $semantic-color-text-primary;
    cursor: pointer;
    
    font-family: map-get($semantic-typography-button-medium, font-family);
    font-size: map-get($semantic-typography-button-medium, font-size);
    font-weight: map-get($semantic-typography-button-medium, font-weight);
    line-height: map-get($semantic-typography-button-medium, line-height);
    
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &:hover {
      background: $semantic-color-surface-elevated;
      box-shadow: $semantic-shadow-button-hover;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    &:active {
      box-shadow: $semantic-shadow-button-rest;
    }
    
    &[disabled] {
      opacity: $semantic-opacity-disabled;
      cursor: not-allowed;
      pointer-events: none;
    }
  }
  
  // Size variants
  &--sm {
    .ui-list-detail-layout__list {
      @media (min-width: $semantic-breakpoint-md) {
        width: 280px;
        min-width: 240px;
        max-width: 400px;
      }
    }
  }
  
  &--lg {
    .ui-list-detail-layout__list {
      @media (min-width: $semantic-breakpoint-md) {
        width: 400px;
        min-width: 320px;
        max-width: 800px;
      }
    }
  }
  
  // Variant styles
  &--bordered {
    border: $semantic-border-width-2 solid $semantic-color-border-primary;
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &--elevated {
    border: none;
    box-shadow: $semantic-shadow-elevation-3;
  }
  
  // Selection states for items (to be applied via content projection)
  ::ng-deep .ui-list-item {
    &--selected {
      background: $semantic-color-surface-elevated;
      border-left: 3px solid $semantic-color-primary;
      color: $semantic-color-text-primary;
    }
    
    &--hover {
      background: $semantic-color-surface-container;
    }
  }
  
  // Loading state
  &--loading {
    pointer-events: none;
    opacity: $semantic-opacity-subtle;
  }
  
  // Responsive adjustments for small screens
  @media (max-width: calc($semantic-breakpoint-sm - 1px)) {
    border-radius: 0;
    height: 100vh;
    
    .ui-list-detail-layout__mobile-nav {
      padding: $semantic-spacing-component-sm;
    }
  }
}Yximport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';

type ListDetailSize = 'sm' | 'md' | 'lg';
type ListDetailVariant = 'default' | 'bordered' | 'elevated';
type MobileView = 'list' | 'detail';

export interface ListDetailNavigationEvent {
  view: MobileView;
  hasSelection: boolean;
}

@Component({
  selector: 'ui-list-detail-layout',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-list-detail-layout"
      [class.ui-list-detail-layout--sm]="size === 'sm'"
      [class.ui-list-detail-layout--lg]="size === 'lg'"
      [class.ui-list-detail-layout--bordered]="variant === 'bordered'"
      [class.ui-list-detail-layout--elevated]="variant === 'elevated'"
      [class.ui-list-detail-layout--loading]="loading"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel">
      
      <!-- Mobile Navigation Header -->
      <div class="ui-list-detail-layout__mobile-nav" *ngIf="showMobileNavigation">
        <button
          type="button"
          class="ui-list-detail-layout__mobile-nav-button"
          [disabled]="!hasSelection()"
          (click)="handleMobileNavigation('list')"
          [attr.aria-label]="backToListLabel">
          ← {{ backToListText }}
        </button>
        
        <span class="ui-list-detail-layout__mobile-nav-title">
          {{ currentView() === 'list' ? listTitle : detailTitle }}
        </span>
        
        <button
          type="button"
          class="ui-list-detail-layout__mobile-nav-button"
          [disabled]="!hasSelection()"
          (click)="handleMobileNavigation('detail')"
          [attr.aria-label]="viewDetailLabel">
          {{ viewDetailText }} →
        </button>
      </div>
      
      <!-- List Panel -->
      <div 
        class="ui-list-detail-layout__list"
        [class.ui-list-detail-layout__list--hidden-mobile]="currentView() === 'detail'"
        [attr.aria-label]="listAriaLabel"
        role="region">
        
        <div 
          class="ui-list-detail-layout__resize-handle"
          [attr.tabindex]="resizable ? 0 : -1"
          [attr.aria-label]="resizeHandleLabel"
          role="separator"
          aria-orientation="vertical"
          (keydown)="handleResizeKeydown($event)">
        </div>
        
        <ng-content select="[slot='list']"></ng-content>
      </div>
      
      <!-- Detail Panel -->
      <div 
        class="ui-list-detail-layout__detail"
        [class.ui-list-detail-layout__detail--hidden-mobile]="currentView() === 'list'"
        [class.ui-list-detail-layout__detail--empty]="!hasSelection() && showEmptyState"
        [attr.aria-label]="detailAriaLabel"
        role="region">
        
        @if (!hasSelection() && showEmptyState) {
          <div class="ui-list-detail-layout__empty-state">
            <ng-content select="[slot='empty']">
              {{ emptyStateText }}
            </ng-content>
          </div>
        } @else {
          <ng-content select="[slot='detail']"></ng-content>
        }
      </div>
    </div>
  `,
  styleUrl: './list-detail-layout.component.scss'
})
export class ListDetailLayoutComponent {
  // Appearance
  @Input() size: ListDetailSize = 'md';
  @Input() variant: ListDetailVariant = 'default';
  @Input() loading = false;
  
  // Functionality
  @Input() resizable = true;
  @Input() showEmptyState = true;
  @Input() showMobileNavigation = true;
  
  // Selection state
  @Input() 
  set selectedItem(value: any) {
    this._selectedItem.set(value);
  }
  get selectedItem() {
    return this._selectedItem();
  }
  private _selectedItem = signal<any>(null);
  
  // Mobile view state
  @Input()
  set mobileView(value: MobileView) {
    this._currentView.set(value);
  }
  get mobileView() {
    return this._currentView();
  }
  private _currentView = signal<MobileView>('list');
  
  // Text customization
  @Input() listTitle = 'List';
  @Input() detailTitle = 'Details';
  @Input() backToListText = 'Back to List';
  @Input() viewDetailText = 'View Details';
  @Input() emptyStateText = 'Select an item to view details';
  
  // Accessibility
  @Input() role = 'application';
  @Input() ariaLabel = 'List and detail view';
  @Input() listAriaLabel = 'Item list';
  @Input() detailAriaLabel = 'Item details';
  @Input() backToListLabel = 'Return to item list';
  @Input() viewDetailLabel = 'View item details';
  @Input() resizeHandleLabel = 'Resize panels';
  
  // Events
  @Output() selectionChanged = new EventEmitter<any>();
  @Output() mobileNavigated = new EventEmitter<ListDetailNavigationEvent>();
  @Output() panelResized = new EventEmitter<{ listWidth: number }>();
  
  // Computed properties
  currentView = this._currentView.asReadonly();
  
  hasSelection(): boolean {
    return this._selectedItem() != null;
  }
  
  // Event handlers
  handleMobileNavigation(view: MobileView): void {
    if (view === 'detail' && !this.hasSelection()) {
      return; // Can't navigate to detail without selection
    }
    
    this._currentView.set(view);
    this.mobileNavigated.emit({
      view,
      hasSelection: this.hasSelection()
    });
  }
  
  handleResizeKeydown(event: KeyboardEvent): void {
    if (!this.resizable) return;
    
    // Keyboard control for resize handle
    const step = 20; // pixels
    let deltaX = 0;
    
    switch (event.key) {
      case 'ArrowLeft':
        deltaX = -step;
        break;
      case 'ArrowRight':
        deltaX = step;
        break;
      case 'Home':
        // Reset to default size
        this.panelResized.emit({ listWidth: 320 });
        event.preventDefault();
        return;
      case 'End':
        // Maximize list panel
        this.panelResized.emit({ listWidth: 600 });
        event.preventDefault();
        return;
      default:
        return;
    }
    
    if (deltaX !== 0) {
      event.preventDefault();
      // In a real implementation, you'd calculate the new width
      // For demo purposes, we'll just emit the event
      this.panelResized.emit({ listWidth: 320 + deltaX });
    }
  }
  
  // Public methods for external control
  selectItem(item: any): void {
    this._selectedItem.set(item);
    this.selectionChanged.emit(item);
    
    // Auto-navigate to detail on mobile when item is selected
    if (window.innerWidth < 768) { // md breakpoint
      this._currentView.set('detail');
      this.mobileNavigated.emit({
        view: 'detail',
        hasSelection: true
      });
    }
  }
  
  clearSelection(): void {
    this._selectedItem.set(null);
    this.selectionChanged.emit(null);
    
    // Auto-navigate to list on mobile when selection is cleared
    if (window.innerWidth < 768) { // md breakpoint
      this._currentView.set('list');
      this.mobileNavigated.emit({
        view: 'list',
        hasSelection: false
      });
    }
  }
  
  showList(): void {
    this._currentView.set('list');
  }
  
  showDetail(): void {
    if (this.hasSelection()) {
      this._currentView.set('detail');
    }
  }
}x$ export * from './masonry.component';ѽx]@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-masonry {
  // Core Structure - CSS Columns for masonry effect
  display: block;
  position: relative;
  width: 100%;
  
  // Layout & Spacing
  column-gap: $semantic-spacing-grid-gap-md;
  padding: $semantic-spacing-component-md;
  
  // Visual Design
  background: $semantic-color-surface-primary;
  border-radius: $semantic-border-card-radius;
  
  // Prevent breaking items across columns
  & > * {
    break-inside: avoid;
    page-break-inside: avoid;
    margin-bottom: $semantic-spacing-grid-gap-md;
    display: inline-block;
    width: 100%;
    
    // Remove margin from last item in each column
    &:last-child {
      margin-bottom: 0;
    }
  }
  
  // Gap Variants
  &--gap-sm {
    column-gap: $semantic-spacing-grid-gap-sm;
    
    & > * {
      margin-bottom: $semantic-spacing-grid-gap-sm;
    }
  }
  
  &--gap-md {
    column-gap: $semantic-spacing-grid-gap-md;
    
    & > * {
      margin-bottom: $semantic-spacing-grid-gap-md;
    }
  }
  
  &--gap-lg {
    column-gap: $semantic-spacing-grid-gap-lg;
    
    & > * {
      margin-bottom: $semantic-spacing-grid-gap-lg;
    }
  }
  
  // Padding Variants
  &--padding-none {
    padding: 0;
  }
  
  &--padding-sm {
    padding: $semantic-spacing-component-sm;
  }
  
  &--padding-md {
    padding: $semantic-spacing-component-md;
  }
  
  &--padding-lg {
    padding: $semantic-spacing-component-lg;
  }
  
  // Column Variants - Fixed Column Count
  &--cols-2 {
    column-count: 2;
  }
  
  &--cols-3 {
    column-count: 3;
  }
  
  &--cols-4 {
    column-count: 4;
  }
  
  &--cols-5 {
    column-count: 5;
  }
  
  &--cols-6 {
    column-count: 6;
  }
  
  // Auto Column Variants - Responsive masonry
  &--auto-fit {
    column-count: auto;
    column-width: 250px;
    column-fill: balance;
  }
  
  &--auto-fill {
    column-count: auto;
    column-width: 200px;
    column-fill: auto;
  }
  
  // Alignment Options
  &--align-start {
    text-align: left;
  }
  
  &--align-center {
    text-align: center;
  }
  
  &--align-end {
    text-align: right;
  }
  
  // Responsive Behavior
  @media (max-width: 1024px) {
    &--cols-6 {
      column-count: 4;
    }
    
    &--cols-5 {
      column-count: 3;
    }
    
    &--cols-4 {
      column-count: 3;
    }
  }
  
  @media (max-width: 768px) {
    column-gap: $semantic-spacing-grid-gap-sm;
    padding: $semantic-spacing-component-sm;
    
    & > * {
      margin-bottom: $semantic-spacing-grid-gap-sm;
    }
    
    &--cols-6,
    &--cols-5,
    &--cols-4,
    &--cols-3 {
      column-count: 2;
    }
    
    &--auto-fit,
    &--auto-fill {
      column-width: 200px;
    }
  }
  
  @media (max-width: 480px) {
    column-gap: $semantic-spacing-component-xs;
    padding: $semantic-spacing-component-xs;
    
    & > * {
      margin-bottom: $semantic-spacing-component-xs;
    }
    
    &--cols-6,
    &--cols-5,
    &--cols-4,
    &--cols-3,
    &--cols-2 {
      column-count: 1;
    }
    
    &--auto-fit,
    &--auto-fill {
      column-count: 1;
    }
  }
}

// Masonry Item Utilities
.ui-masonry-item {
  // Prevent breaking
  break-inside: avoid;
  page-break-inside: avoid;
  
  // Spacing
  margin-bottom: $semantic-spacing-grid-gap-md;
  display: inline-block;
  width: 100%;
  
  // Visual Design
  background: $semantic-color-surface-secondary;
  border-radius: $semantic-border-card-radius;
  overflow: hidden;
  
  // Interactive States
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  
  &:hover {
    box-shadow: $semantic-shadow-card-hover;
  }
  
  // Size Variants
  &--compact {
    padding: $semantic-spacing-component-sm;
  }
  
  &--comfortable {
    padding: $semantic-spacing-component-md;
  }
  
  &--spacious {
    padding: $semantic-spacing-component-lg;
  }
  
  // No spacing variant for full-bleed content
  &--flush {
    padding: 0;
  }
}p5ximport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type MasonryColumns = 2 | 3 | 4 | 5 | 6 | 'auto-fit' | 'auto-fill';
type MasonryGap = 'sm' | 'md' | 'lg';
type MasonryPadding = 'none' | 'sm' | 'md' | 'lg';
type MasonryAlignment = 'start' | 'center' | 'end';

@Component({
  selector: 'ui-masonry',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-masonry"
      [class.ui-masonry--gap-sm]="gap === 'sm'"
      [class.ui-masonry--gap-md]="gap === 'md'"
      [class.ui-masonry--gap-lg]="gap === 'lg'"
      [class.ui-masonry--padding-none]="padding === 'none'"
      [class.ui-masonry--padding-sm]="padding === 'sm'"
      [class.ui-masonry--padding-md]="padding === 'md'"
      [class.ui-masonry--padding-lg]="padding === 'lg'"
      [class.ui-masonry--cols-2]="columns === 2"
      [class.ui-masonry--cols-3]="columns === 3"
      [class.ui-masonry--cols-4]="columns === 4"
      [class.ui-masonry--cols-5]="columns === 5"
      [class.ui-masonry--cols-6]="columns === 6"
      [class.ui-masonry--auto-fit]="columns === 'auto-fit'"
      [class.ui-masonry--auto-fill]="columns === 'auto-fill'"
      [class.ui-masonry--align-start]="alignment === 'start'"
      [class.ui-masonry--align-center]="alignment === 'center'"
      [class.ui-masonry--align-end]="alignment === 'end'"
      [style.column-width]="minColumnWidth || null"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './masonry.component.scss'
})
export class MasonryComponent {
  @Input() columns: MasonryColumns = 'auto-fit';
  @Input() gap: MasonryGap = 'md';
  @Input() padding: MasonryPadding = 'md';
  @Input() alignment: MasonryAlignment = 'start';
  @Input() minColumnWidth: string | null = null;
  
  // Accessibility
  @Input() role: string = 'grid';
  @Input() ariaLabel: string | null = null;
}]x- export * from './scroll-container.component';p3Gx(import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, ViewChild, AfterViewInit, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';

type ScrollbarVisibility = 'auto' | 'always' | 'never';
type ScrollDirection = 'vertical' | 'horizontal' | 'both';
type ScrollBehavior = 'smooth' | 'auto';

export interface ScrollVirtualConfig {
  itemHeight: number;
  bufferSize?: number;
  enabled?: boolean;
}

export interface ScrollPosition {
  top: number;
  left: number;
}

@Component({
  selector: 'ui-scroll-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      #scrollContainer
      class="ui-scroll-container"
      [class.ui-scroll-container--vertical]="direction === 'vertical'"
      [class.ui-scroll-container--horizontal]="direction === 'horizontal'"
      [class.ui-scroll-container--both]="direction === 'both'"
      [class.ui-scroll-container--scrollbar-auto]="scrollbarVisibility === 'auto'"
      [class.ui-scroll-container--scrollbar-always]="scrollbarVisibility === 'always'"
      [class.ui-scroll-container--scrollbar-never]="scrollbarVisibility === 'never'"
      [class.ui-scroll-container--virtual]="virtualScrollConfig?.enabled"
      [class.ui-scroll-container--smooth]="scrollBehavior === 'smooth'"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel"
      [tabindex]="tabIndex"
      (scroll)="onScroll($event)"
      (keydown)="onKeyDown($event)">
      
      @if (virtualScrollConfig?.enabled && items && items.length > 0) {
        <!-- Virtual Scrolling Content -->
        <div class="ui-scroll-container__virtual-spacer" [style.height.px]="totalHeight">
          <div class="ui-scroll-container__virtual-content" [style.transform]="'translateY(' + offsetY + 'px)'">
            @for (item of visibleItems; track trackByFn ? trackByFn(item) : item) {
              <div 
                class="ui-scroll-container__virtual-item" 
                [style.height.px]="virtualScrollConfig?.itemHeight">
                <ng-content [ngTemplateOutlet]="itemTemplate" [ngTemplateOutletContext]="{ item: item, index: getItemIndex(item) }"></ng-content>
              </div>
            }
          </div>
        </div>
      } @else {
        <!-- Regular Content -->
        <div class="ui-scroll-container__content">
          <ng-content></ng-content>
        </div>
      }
      
      @if (showScrollIndicators) {
        <div class="ui-scroll-container__indicators">
          @if (canScrollUp) {
            <div class="ui-scroll-container__indicator ui-scroll-container__indicator--up" aria-hidden="true"></div>
          }
          @if (canScrollDown) {
            <div class="ui-scroll-container__indicator ui-scroll-container__indicator--down" aria-hidden="true"></div>
          }
        </div>
      }
    </div>
  `,
  styleUrl: './scroll-container.component.scss'
})
export class ScrollContainerComponent implements AfterViewInit, OnDestroy {
  @ViewChild('scrollContainer', { static: true }) scrollContainer!: ElementRef<HTMLDivElement>;

  // Basic Configuration
  @Input() direction: ScrollDirection = 'vertical';
  @Input() scrollbarVisibility: ScrollbarVisibility = 'auto';
  @Input() scrollBehavior: ScrollBehavior = 'auto';
  @Input() showScrollIndicators = false;
  @Input() role = 'region';
  @Input() ariaLabel = 'Scrollable content';
  @Input() tabIndex = 0;

  // Virtual Scrolling
  @Input() virtualScrollConfig?: ScrollVirtualConfig;
  @Input() items?: any[];
  @Input() itemTemplate?: any;
  @Input() trackByFn?: (item: any) => any;

  // Scroll Position Restoration
  @Input() restoreScrollPosition = false;
  @Input() scrollPositionKey?: string;

  // Events
  @Output() scrolled = new EventEmitter<ScrollPosition>();
  @Output() scrollStart = new EventEmitter<void>();
  @Output() scrollEnd = new EventEmitter<void>();
  @Output() reachedTop = new EventEmitter<void>();
  @Output() reachedBottom = new EventEmitter<void>();

  // Virtual Scrolling State
  visibleItems: any[] = [];
  totalHeight = 0;
  offsetY = 0;
  startIndex = 0;
  endIndex = 0;

  // Scroll State
  canScrollUp = false;
  canScrollDown = false;
  private scrollTimeout?: number;
  private isScrolling = false;

  ngAfterViewInit(): void {
    if (this.virtualScrollConfig?.enabled && this.items) {
      this.setupVirtualScrolling();
    }

    if (this.restoreScrollPosition) {
      this.restorePosition();
    }

    this.updateScrollIndicators();
  }

  ngOnDestroy(): void {
    if (this.scrollTimeout) {
      clearTimeout(this.scrollTimeout);
    }

    if (this.restoreScrollPosition) {
      this.savePosition();
    }
  }

  onScroll(event: Event): void {
    const element = event.target as HTMLElement;
    const scrollPosition: ScrollPosition = {
      top: element.scrollTop,
      left: element.scrollLeft
    };

    if (!this.isScrolling) {
      this.isScrolling = true;
      this.scrollStart.emit();
    }

    this.scrolled.emit(scrollPosition);

    // Check if reached boundaries
    if (element.scrollTop === 0) {
      this.reachedTop.emit();
    }

    if (element.scrollTop + element.clientHeight >= element.scrollHeight - 1) {
      this.reachedBottom.emit();
    }

    // Update virtual scrolling
    if (this.virtualScrollConfig?.enabled) {
      this.updateVirtualScrolling(element.scrollTop);
    }

    this.updateScrollIndicators();

    // Debounce scroll end event
    if (this.scrollTimeout) {
      clearTimeout(this.scrollTimeout);
    }

    this.scrollTimeout = window.setTimeout(() => {
      this.isScrolling = false;
      this.scrollEnd.emit();
    }, 150);
  }

  onKeyDown(event: KeyboardEvent): void {
    const element = this.scrollContainer.nativeElement;
    let handled = false;

    switch (event.key) {
      case 'ArrowUp':
        this.scrollBy(0, -40);
        handled = true;
        break;
      case 'ArrowDown':
        this.scrollBy(0, 40);
        handled = true;
        break;
      case 'ArrowLeft':
        if (this.direction === 'horizontal' || this.direction === 'both') {
          this.scrollBy(-40, 0);
          handled = true;
        }
        break;
      case 'ArrowRight':
        if (this.direction === 'horizontal' || this.direction === 'both') {
          this.scrollBy(40, 0);
          handled = true;
        }
        break;
      case 'PageUp':
        this.scrollBy(0, -element.clientHeight * 0.8);
        handled = true;
        break;
      case 'PageDown':
        this.scrollBy(0, element.clientHeight * 0.8);
        handled = true;
        break;
      case 'Home':
        this.scrollTo({ top: 0, left: 0 });
        handled = true;
        break;
      case 'End':
        this.scrollTo({ top: element.scrollHeight, left: 0 });
        handled = true;
        break;
    }

    if (handled) {
      event.preventDefault();
    }
  }

  // Public API Methods
  scrollTo(position: Partial<ScrollPosition>): void {
    const element = this.scrollContainer.nativeElement;
    const options: ScrollToOptions = {
      behavior: this.scrollBehavior
    };

    if (position.top !== undefined) {
      options.top = position.top;
    }
    if (position.left !== undefined) {
      options.left = position.left;
    }

    element.scrollTo(options);
  }

  scrollBy(deltaX: number, deltaY: number): void {
    const element = this.scrollContainer.nativeElement;
    element.scrollBy({
      left: deltaX,
      top: deltaY,
      behavior: this.scrollBehavior
    });
  }

  scrollToTop(): void {
    this.scrollTo({ top: 0 });
  }

  scrollToBottom(): void {
    const element = this.scrollContainer.nativeElement;
    this.scrollTo({ top: element.scrollHeight });
  }

  getScrollPosition(): ScrollPosition {
    const element = this.scrollContainer.nativeElement;
    return {
      top: element.scrollTop,
      left: element.scrollLeft
    };
  }

  // Virtual Scrolling Implementation
  private setupVirtualScrolling(): void {
    if (!this.virtualScrollConfig || !this.items) return;

    const bufferSize = this.virtualScrollConfig.bufferSize || 10;
    const itemHeight = this.virtualScrollConfig.itemHeight;
    
    this.totalHeight = this.items.length * itemHeight;
    
    const containerHeight = this.scrollContainer.nativeElement.clientHeight;
    const visibleCount = Math.ceil(containerHeight / itemHeight) + bufferSize * 2;
    
    this.endIndex = Math.min(visibleCount, this.items.length);
    this.visibleItems = this.items.slice(this.startIndex, this.endIndex);
  }

  private updateVirtualScrolling(scrollTop: number): void {
    if (!this.virtualScrollConfig || !this.items) return;

    const itemHeight = this.virtualScrollConfig.itemHeight;
    const bufferSize = this.virtualScrollConfig.bufferSize || 10;
    const containerHeight = this.scrollContainer.nativeElement.clientHeight;
    
    this.startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - bufferSize);
    const visibleCount = Math.ceil(containerHeight / itemHeight) + bufferSize * 2;
    this.endIndex = Math.min(this.startIndex + visibleCount, this.items.length);
    
    this.visibleItems = this.items.slice(this.startIndex, this.endIndex);
    this.offsetY = this.startIndex * itemHeight;
  }

  getItemIndex(item: any): number {
    if (!this.items) return -1;
    return this.items.indexOf(item);
  }

  // Scroll Position Restoration
  private savePosition(): void {
    if (!this.scrollPositionKey) return;
    
    const position = this.getScrollPosition();
    const key = `scroll-position-${this.scrollPositionKey}`;
    sessionStorage.setItem(key, JSON.stringify(position));
  }

  private restorePosition(): void {
    if (!this.scrollPositionKey) return;
    
    const key = `scroll-position-${this.scrollPositionKey}`;
    const saved = sessionStorage.getItem(key);
    
    if (saved) {
      try {
        const position = JSON.parse(saved) as ScrollPosition;
        setTimeout(() => this.scrollTo(position), 0);
      } catch (e) {
        console.warn('Failed to restore scroll position:', e);
      }
    }
  }

  // Scroll Indicators
  private updateScrollIndicators(): void {
    if (!this.showScrollIndicators) return;

    const element = this.scrollContainer.nativeElement;
    this.canScrollUp = element.scrollTop > 0;
    this.canScrollDown = element.scrollTop + element.clientHeight < element.scrollHeight - 1;
  }
}6`(x$ export * from './section.component';xn@use '../../../../../../ui-design-system/src/styles/semantic' as *;

.ui-section {
  display: block;
  position: relative;
  width: 100%;
  
  // Base spacing - using semantic layout section tokens
  &--spacing-xs {
    padding-top: $semantic-spacing-layout-section-xs;
    padding-bottom: $semantic-spacing-layout-section-xs;
  }
  
  &--spacing-sm {
    padding-top: $semantic-spacing-layout-section-sm;
    padding-bottom: $semantic-spacing-layout-section-sm;
  }
  
  &--spacing-md {
    padding-top: $semantic-spacing-layout-section-md;
    padding-bottom: $semantic-spacing-layout-section-md;
  }
  
  &--spacing-lg {
    padding-top: $semantic-spacing-layout-section-lg;
    padding-bottom: $semantic-spacing-layout-section-lg;
  }
  
  &--spacing-xl {
    padding-top: $semantic-spacing-layout-section-xl;
    padding-bottom: $semantic-spacing-layout-section-xl;
  }
  
  // Background variants
  &--surface {
    background: $semantic-color-surface-primary;
  }
  
  &--surface-secondary {
    background: $semantic-color-surface-secondary;
  }
  
  &--surface-elevated {
    background: $semantic-color-surface-elevated;
  }
  
  // Content alignment
  &--align-center {
    text-align: center;
  }
  
  &--align-end {
    text-align: end;
  }
  
  // Width variants
  &--full-width {
    width: 100%;
    max-width: none;
  }
  
  &--contained {
    max-width: 1200px;
    margin-left: auto;
    margin-right: auto;
    padding-left: $semantic-spacing-component-md;
    padding-right: $semantic-spacing-component-md;
  }
  
  // Typography styling for section content
  color: $semantic-color-text-primary;
  font-family: map-get($semantic-typography-body-medium, font-family);
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-weight: map-get($semantic-typography-body-medium, font-weight);
  line-height: map-get($semantic-typography-body-medium, line-height);
  
  // Responsive behavior
  @media (max-width: 768px) {
    &--contained {
      padding-left: $semantic-spacing-component-sm;
      padding-right: $semantic-spacing-component-sm;
    }
    
    // Reduce section spacing on mobile
    &--spacing-xl {
      padding-top: $semantic-spacing-layout-section-lg;
      padding-bottom: $semantic-spacing-layout-section-lg;
    }
    
    &--spacing-lg {
      padding-top: $semantic-spacing-layout-section-md;
      padding-bottom: $semantic-spacing-layout-section-md;
    }
  }
  
  @media (max-width: 480px) {
    &--contained {
      padding-left: $semantic-spacing-component-xs;
      padding-right: $semantic-spacing-component-xs;
    }
    
    // Further reduce section spacing on very small screens
    &--spacing-xl,
    &--spacing-lg {
      padding-top: $semantic-spacing-layout-section-sm;
      padding-bottom: $semantic-spacing-layout-section-sm;
    }
    
    &--spacing-md {
      padding-top: $semantic-spacing-layout-section-xs;
      padding-bottom: $semantic-spacing-layout-section-xs;
    }
  }
}tœ\x=import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type SectionSpacing = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
type SectionBackground = 'transparent' | 'surface' | 'surface-secondary' | 'surface-elevated';
type SectionAlign = 'start' | 'center' | 'end';

@Component({
  selector: 'ui-section',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      [ngClass]="getClasses()"
      [attr.aria-label]="ariaLabel"
      [attr.role]="role">
      
      <ng-content></ng-content>
    </section>
  `,
  styleUrl: './section.component.scss'
})
export class SectionComponent {
  @Input() spacing: SectionSpacing = 'md';
  @Input() background: SectionBackground = 'transparent';
  @Input() align: SectionAlign = 'start';
  @Input() fullWidth = false;
  @Input() contained = true;
  @Input() ariaLabel?: string;
  @Input() role?: string;

  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {
      'ui-section': true,
      [`ui-section--spacing-${this.spacing}`]: true,
      [`ui-section--${this.background}`]: this.background !== 'transparent',
      [`ui-section--align-${this.align}`]: this.align !== 'start',
      'ui-section--full-width': this.fullWidth,
      'ui-section--contained': this.contained
    };

    return classes;
  }
}ɻx+ export * from './sidebar-layout.component';Mmx
 import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type SidebarPosition = 'left' | 'right';
type SidebarWidth = 'sm' | 'md' | 'lg' | 'xl';
type SidebarVariant = 'default' | 'bordered' | 'elevated';
type CollapseMode = 'hidden' | 'collapsed' | 'overlay';

@Component({
  selector: 'ui-sidebar-layout',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-sidebar-layout"
      [class.ui-sidebar-layout--position-right]="position === 'right'"
      [class.ui-sidebar-layout--collapsed]="collapsed"
      [class.ui-sidebar-layout--overlay]="collapseMode === 'overlay'"
      [class.ui-sidebar-layout--hidden]="collapseMode === 'hidden' && collapsed"
      [class.ui-sidebar-layout--bordered]="variant === 'bordered'"
      [class.ui-sidebar-layout--elevated]="variant === 'elevated'"
      [attr.role]="role">
      
      <aside 
        class="ui-sidebar-layout__sidebar"
        [class.ui-sidebar-layout__sidebar--sm]="sidebarWidth === 'sm'"
        [class.ui-sidebar-layout__sidebar--md]="sidebarWidth === 'md'"
        [class.ui-sidebar-layout__sidebar--lg]="sidebarWidth === 'lg'"
        [class.ui-sidebar-layout__sidebar--xl]="sidebarWidth === 'xl'"
        [class.ui-sidebar-layout__sidebar--collapsed]="collapsed"
        [attr.aria-hidden]="collapsed && collapseMode === 'hidden'"
        [attr.aria-expanded]="!collapsed"
        role="complementary">
        
        <ng-content select="[slot='sidebar']"></ng-content>
      </aside>
      
      @if (collapseMode === 'overlay' && !collapsed) {
        <div 
          class="ui-sidebar-layout__backdrop"
          (click)="handleBackdropClick()"
          role="presentation"
          aria-hidden="true">
        </div>
      }
      
      <main 
        class="ui-sidebar-layout__content"
        [attr.aria-label]="contentLabel"
        role="main">
        
        <ng-content></ng-content>
      </main>
    </div>
  `,
  styleUrl: './sidebar-layout.component.scss'
})
export class SidebarLayoutComponent {
  @Input() position: SidebarPosition = 'left';
  @Input() sidebarWidth: SidebarWidth = 'md';
  @Input() variant: SidebarVariant = 'default';
  @Input() collapsed = false;
  @Input() collapseMode: CollapseMode = 'collapsed';
  @Input() role = 'application';
  @Input() contentLabel = 'Main content';
  @Input() enableBackdropClose = true;
  
  handleBackdropClick(): void {
    if (this.enableBackdropClose && this.collapseMode === 'overlay') {
      // In a real implementation, this would emit an event
      // For demo purposes, we'll just log
      console.log('Backdrop clicked - sidebar should close');
    }
  }
}){x# export * from './spacer.component';Fx@use '../../../../../../ui-design-system/src/styles/semantic' as tokens;

.ui-spacer {
  display: block;
  position: relative;
  
  // Default spacing (only when not flexible)
  &:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-md;
    height: tokens.$semantic-spacing-md;
  }
  
  // Size variants (only when not flexible)
  &--xs:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-xs;
    height: tokens.$semantic-spacing-xs;
  }
  
  &--sm:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-sm;
    height: tokens.$semantic-spacing-sm;
  }
  
  &--md:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-md;
    height: tokens.$semantic-spacing-md;
  }
  
  &--lg:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-lg;
    height: tokens.$semantic-spacing-lg;
  }
  
  &--xl:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-xl;
    height: tokens.$semantic-spacing-xl;
  }
  
  &--2xl:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-2xl;
    height: tokens.$semantic-spacing-2xl;
  }
  
  &--3xl:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-3xl;
    height: tokens.$semantic-spacing-3xl;
  }
  
  &--4xl:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-4xl;
    height: tokens.$semantic-spacing-4xl;
  }
  
  &--5xl:not(.ui-spacer--flexible) {
    width: tokens.$semantic-spacing-5xl;
    height: tokens.$semantic-spacing-5xl;
  }
  
  // Directional variants (only when not flexible)
  &--horizontal:not(.ui-spacer--flexible) {
    height: 0;
    width: tokens.$semantic-spacing-md;
    
    &.ui-spacer--xs { width: tokens.$semantic-spacing-xs; }
    &.ui-spacer--sm { width: tokens.$semantic-spacing-sm; }
    &.ui-spacer--md { width: tokens.$semantic-spacing-md; }
    &.ui-spacer--lg { width: tokens.$semantic-spacing-lg; }
    &.ui-spacer--xl { width: tokens.$semantic-spacing-xl; }
    &.ui-spacer--2xl { width: tokens.$semantic-spacing-2xl; }
    &.ui-spacer--3xl { width: tokens.$semantic-spacing-3xl; }
    &.ui-spacer--4xl { width: tokens.$semantic-spacing-4xl; }
    &.ui-spacer--5xl { width: tokens.$semantic-spacing-5xl; }
  }
  
  &--vertical:not(.ui-spacer--flexible) {
    width: 0;
    height: tokens.$semantic-spacing-md;
    
    &.ui-spacer--xs { height: tokens.$semantic-spacing-xs; }
    &.ui-spacer--sm { height: tokens.$semantic-spacing-sm; }
    &.ui-spacer--md { height: tokens.$semantic-spacing-md; }
    &.ui-spacer--lg { height: tokens.$semantic-spacing-lg; }
    &.ui-spacer--xl { height: tokens.$semantic-spacing-xl; }
    &.ui-spacer--2xl { height: tokens.$semantic-spacing-2xl; }
    &.ui-spacer--3xl { height: tokens.$semantic-spacing-3xl; }
    &.ui-spacer--4xl { height: tokens.$semantic-spacing-4xl; }
    &.ui-spacer--5xl { height: tokens.$semantic-spacing-5xl; }
  }
  
  // Flexible spacer (grows to fill available space)
  &--flexible {
    flex: 1 1 0;
    
    &.ui-spacer--horizontal {
      height: 0;
      min-width: tokens.$semantic-spacing-xs;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      min-height: tokens.$semantic-spacing-xs;
    }
    
    // When both directions, allow flex in any direction
    &:not(.ui-spacer--horizontal):not(.ui-spacer--vertical) {
      min-width: tokens.$semantic-spacing-xs;
      min-height: tokens.$semantic-spacing-xs;
    }
  }
  
  // Component-specific spacing variants
  &--component-xs {
    width: tokens.$semantic-spacing-component-xs;
    height: tokens.$semantic-spacing-component-xs;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-xs;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-xs;
    }
  }
  
  &--component-sm {
    width: tokens.$semantic-spacing-component-sm;
    height: tokens.$semantic-spacing-component-sm;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-sm;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-sm;
    }
  }
  
  &--component-md {
    width: tokens.$semantic-spacing-component-md;
    height: tokens.$semantic-spacing-component-md;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-md;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-md;
    }
  }
  
  &--component-lg {
    width: tokens.$semantic-spacing-component-lg;
    height: tokens.$semantic-spacing-component-lg;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-lg;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-lg;
    }
  }
  
  &--component-xl {
    width: tokens.$semantic-spacing-component-xl;
    height: tokens.$semantic-spacing-component-xl;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-xl;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-xl;
    }
  }
  
  // Layout-specific spacing variants
  &--layout-xs {
    width: tokens.$semantic-spacing-layout-xs;
    height: tokens.$semantic-spacing-layout-xs;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-xs;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-xs;
    }
  }
  
  &--layout-sm {
    width: tokens.$semantic-spacing-layout-sm;
    height: tokens.$semantic-spacing-layout-sm;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-sm;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-sm;
    }
  }
  
  &--layout-md {
    width: tokens.$semantic-spacing-layout-md;
    height: tokens.$semantic-spacing-layout-md;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-md;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-md;
    }
  }
  
  &--layout-lg {
    width: tokens.$semantic-spacing-layout-lg;
    height: tokens.$semantic-spacing-layout-lg;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-lg;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-lg;
    }
  }
  
  &--layout-xl {
    width: tokens.$semantic-spacing-layout-xl;
    height: tokens.$semantic-spacing-layout-xl;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-xl;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-xl;
    }
  }
  
  // Visual debug mode (only in development)
  &--debug {
    background: repeating-linear-gradient(
      45deg,
      transparent,
      transparent 2px,
      rgba(255, 0, 0, 0.1) 2px,
      rgba(255, 0, 0, 0.1) 4px
    );
    border: 1px dashed rgba(255, 0, 0, 0.3);
  }
  
  // Responsive behavior
  @media (max-width: 768px) {
    &--responsive {
      &.ui-spacer--xl,
      &.ui-spacer--2xl,
      &.ui-spacer--3xl,
      &.ui-spacer--4xl,
      &.ui-spacer--5xl {
        width: tokens.$semantic-spacing-lg;
        height: tokens.$semantic-spacing-lg;
        
        &.ui-spacer--horizontal {
          width: tokens.$semantic-spacing-lg;
          height: 0;
        }
        
        &.ui-spacer--vertical {
          width: 0;
          height: tokens.$semantic-spacing-lg;
        }
      }
    }
  }
  
  @media (max-width: 480px) {
    &--responsive {
      &.ui-spacer--lg,
      &.ui-spacer--xl,
      &.ui-spacer--2xl,
      &.ui-spacer--3xl,
      &.ui-spacer--4xl,
      &.ui-spacer--5xl {
        width: tokens.$semantic-spacing-md;
        height: tokens.$semantic-spacing-md;
        
        &.ui-spacer--horizontal {
          width: tokens.$semantic-spacing-md;
          height: 0;
        }
        
        &.ui-spacer--vertical {
          width: 0;
          height: tokens.$semantic-spacing-md;
        }
      }
    }
  }
}xg~gqFbQjniFk ^unximport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type SpacerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
type SpacerVariant = 'component-xs' | 'component-sm' | 'component-md' | 'component-lg' | 'component-xl' | 
                    'layout-xs' | 'layout-sm' | 'layout-md' | 'layout-lg' | 'layout-xl';
type SpacerDirection = 'both' | 'horizontal' | 'vertical';

@Component({
  selector: 'ui-spacer',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-spacer"
      [ngClass]="getClasses()"
      [style.width]="customWidth"
      [style.height]="customHeight"
      [attr.aria-hidden]="true">
    </div>
  `,
  styleUrl: './spacer.component.scss'
})
export class SpacerComponent {
  @Input() size: SpacerSize = 'md';
  @Input() variant?: SpacerVariant;
  @Input() direction: SpacerDirection = 'both';
  @Input() flexible = false;
  @Input() responsive = true;
  @Input() debug = false;
  @Input() customWidth?: string;
  @Input() customHeight?: string;

  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {};
    
    if (this.size && !this.variant) {
      classes[`ui-spacer--${this.size}`] = true;
    }
    
    if (this.variant) {
      classes[`ui-spacer--${this.variant}`] = true;
    }
    
    if (this.direction !== 'both') {
      classes[`ui-spacer--${this.direction}`] = true;
    }
    
    classes['ui-spacer--flexible'] = this.flexible;
    classes['ui-spacer--responsive'] = this.responsive;
    classes['ui-spacer--debug'] = this.debug;
    
    return classes;
  }
}	;wx{Ż{ibL"]̪X[%CAMMA,(31DKh*#ByJfQjrIf~}Xhk_[{ZNjEfRN*P#[qQjqA~^qfH9ӀEGJjRi:Q zC g^x' export * from './split-view.component';]ܷx'0import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, OnDestroy, AfterViewInit, ViewChild } from '@angular/core';
import { CommonModule } from '@angular/common';

export type SplitDirection = 'horizontal' | 'vertical';
export type SplitSize = 'sm' | 'md' | 'lg';
export type PanelVariant = 'primary' | 'secondary' | 'elevated';

export interface PanelConfig {
  id: string;
  size?: number | string;
  minSize?: number;
  maxSize?: number;
  resizable?: boolean;
  variant?: PanelVariant;
  collapsed?: boolean;
}

export interface ResizeEvent {
  panelId: string;
  newSize: number;
  direction: SplitDirection;
}

@Component({
  selector: 'ui-split-view',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      #splitContainer
      class="ui-split-view"
      [class]="'ui-split-view ui-split-view--' + direction + ' ui-split-view--' + size"
      [class.ui-split-view--disabled]="disabled"
      [class.ui-split-view--resizing]="isResizing"
      [attr.aria-orientation]="direction"
      role="separator">
      
      @for (panel of panels; track panel.id; let i = $index) {
        <div 
          class="ui-split-view__panel"
          [class]="'ui-split-view__panel ui-split-view__panel--' + (panel.variant || 'primary')"
          [class.ui-split-view__panel--collapsed]="panel.collapsed"
          [style.flex-basis]="getPanelSize(panel, i)"
          [style.min-width]="direction === 'horizontal' ? (panel.minSize ? panel.minSize + 'px' : '100px') : 'auto'"
          [style.min-height]="direction === 'vertical' ? (panel.minSize ? panel.minSize + 'px' : '50px') : 'auto'"
          [style.max-width]="direction === 'horizontal' && panel.maxSize ? panel.maxSize + 'px' : 'none'"
          [style.max-height]="direction === 'vertical' && panel.maxSize ? panel.maxSize + 'px' : 'none'"
          [attr.data-panel-id]="panel.id"
          role="region"
          [attr.aria-label]="'Panel ' + (i + 1)">
          
          <div class="ui-split-view__panel-content">
            <ng-content [select]="'[slot=' + panel.id + ']'"></ng-content>
          </div>
        </div>
        
        @if (i < panels.length - 1 && (panel.resizable !== false) && !disabled) {
          <div 
            class="ui-split-view__resizer"
            [class]="'ui-split-view__resizer ui-split-view__resizer--' + (direction === 'horizontal' ? 'vertical' : 'horizontal')"
            [class.ui-split-view__resizer--disabled]="disabled"
            [attr.data-resizer-index]="i"
            [tabindex]="disabled ? -1 : 0"
            [attr.aria-label]="'Resize panels'"
            role="separator"
            [attr.aria-orientation]="direction"
            (mousedown)="startResize($event, i)"
            (touchstart)="startResize($event, i)"
            (keydown)="handleResizerKeydown($event, i)">
            
            <div class="ui-split-view__resizer-handle"></div>
          </div>
        }
      }
    </div>
  `,
  styleUrl: './split-view.component.scss'
})
export class SplitViewComponent implements AfterViewInit, OnDestroy {
  @Input() direction: SplitDirection = 'horizontal';
  @Input() size: SplitSize = 'md';
  @Input() disabled = false;
  @Input() panels: PanelConfig[] = [
    { id: 'panel-1', size: '50%' },
    { id: 'panel-2', size: '50%' }
  ];
  @Input() minPanelSize = 100;
  @Input() resizerSize = 4;
  
  @Output() panelResized = new EventEmitter<ResizeEvent>();
  @Output() resizeStart = new EventEmitter<{ panelId: string, direction: SplitDirection }>();
  @Output() resizeEnd = new EventEmitter<{ panelId: string, direction: SplitDirection }>();
  
  @ViewChild('splitContainer', { static: true }) splitContainer!: ElementRef<HTMLDivElement>;
  
  isResizing = false;
  private currentResizerIndex = -1;
  private startPosition = 0;
  private startSizes: number[] = [];
  private boundMouseMove = this.handleMouseMove.bind(this);
  private boundMouseUp = this.handleMouseUp.bind(this);
  private boundTouchMove = this.handleTouchMove.bind(this);
  private boundTouchEnd = this.handleTouchEnd.bind(this);
  
  ngAfterViewInit(): void {
    // Initialize panel sizes if not set
    this.initializePanelSizes();
  }
  
  ngOnDestroy(): void {
    this.removeGlobalListeners();
  }
  
  private initializePanelSizes(): void {
    // Ensure panels have proper sizes
    const totalPanels = this.panels.length;
    const defaultSize = `${100 / totalPanels}%`;
    
    this.panels.forEach((panel, index) => {
      if (!panel.size) {
        panel.size = defaultSize;
      }
    });
  }
  
  getPanelSize(panel: PanelConfig, index: number): string {
    if (panel.collapsed) return '0';
    return typeof panel.size === 'number' ? `${panel.size}px` : panel.size || '1fr';
  }
  
  startResize(event: MouseEvent | TouchEvent, resizerIndex: number): void {
    if (this.disabled) return;
    
    event.preventDefault();
    event.stopPropagation();
    
    this.isResizing = true;
    this.currentResizerIndex = resizerIndex;
    
    const clientPos = this.getClientPosition(event);
    this.startPosition = this.direction === 'horizontal' ? clientPos.x : clientPos.y;
    
    // Store current panel sizes
    this.startSizes = this.getCurrentPanelSizes();
    
    // Add global listeners
    this.addGlobalListeners();
    
    // Emit resize start event
    const panelId = this.panels[resizerIndex].id;
    this.resizeStart.emit({ panelId, direction: this.direction });
  }
  
  private handleMouseMove(event: MouseEvent): void {
    this.handleMove(this.getClientPosition(event));
  }
  
  private handleTouchMove(event: TouchEvent): void {
    this.handleMove(this.getClientPosition(event));
  }
  
  private handleMove(clientPos: { x: number, y: number }): void {
    if (!this.isResizing || this.currentResizerIndex === -1) return;
    
    const currentPosition = this.direction === 'horizontal' ? clientPos.x : clientPos.y;
    const delta = currentPosition - this.startPosition;
    
    const containerRect = this.splitContainer.nativeElement.getBoundingClientRect();
    const containerSize = this.direction === 'horizontal' ? containerRect.width : containerRect.height;
    
    const leftPanelIndex = this.currentResizerIndex;
    const rightPanelIndex = this.currentResizerIndex + 1;
    
    if (leftPanelIndex >= 0 && rightPanelIndex < this.panels.length) {
      const leftPanel = this.panels[leftPanelIndex];
      const rightPanel = this.panels[rightPanelIndex];
      
      // Calculate new sizes
      const leftStartSize = this.startSizes[leftPanelIndex];
      const rightStartSize = this.startSizes[rightPanelIndex];
      
      let newLeftSize = leftStartSize + delta;
      let newRightSize = rightStartSize - delta;
      
      // Apply minimum size constraints
      const minSize = leftPanel.minSize || this.minPanelSize;
      const rightMinSize = rightPanel.minSize || this.minPanelSize;
      
      if (newLeftSize < minSize) {
        newLeftSize = minSize;
        newRightSize = leftStartSize + rightStartSize - newLeftSize;
      }
      
      if (newRightSize < rightMinSize) {
        newRightSize = rightMinSize;
        newLeftSize = leftStartSize + rightStartSize - newRightSize;
      }
      
      // Apply maximum size constraints
      if (leftPanel.maxSize && newLeftSize > leftPanel.maxSize) {
        newLeftSize = leftPanel.maxSize;
        newRightSize = leftStartSize + rightStartSize - newLeftSize;
      }
      
      if (rightPanel.maxSize && newRightSize > rightPanel.maxSize) {
        newRightSize = rightPanel.maxSize;
        newLeftSize = leftStartSize + rightStartSize - newRightSize;
      }
      
      // Convert to percentages
      const leftPercentage = (newLeftSize / containerSize) * 100;
      const rightPercentage = (newRightSize / containerSize) * 100;
      
      // Update panel sizes
      leftPanel.size = `${leftPercentage}%`;
      rightPanel.size = `${rightPercentage}%`;
      
      // Emit resize event
      this.panelResized.emit({
        panelId: leftPanel.id,
        newSize: newLeftSize,
        direction: this.direction
      });
    }
  }
  
  private handleMouseUp(): void {
    this.endResize();
  }
  
  private handleTouchEnd(): void {
    this.endResize();
  }
  
  private endResize(): void {
    if (!this.isResizing) return;
    
    this.isResizing = false;
    const panelId = this.panels[this.currentResizerIndex]?.id;
    this.currentResizerIndex = -1;
    
    this.removeGlobalListeners();
    
    // Emit resize end event
    if (panelId) {
      this.resizeEnd.emit({ panelId, direction: this.direction });
    }
  }
  
  private getCurrentPanelSizes(): number[] {
    const containerRect = this.splitContainer.nativeElement.getBoundingClientRect();
    const containerSize = this.direction === 'horizontal' ? containerRect.width : containerRect.height;
    
    return this.panels.map((panel) => {
      if (typeof panel.size === 'string' && panel.size.endsWith('%')) {
        const percentage = parseFloat(panel.size.replace('%', ''));
        return (percentage / 100) * containerSize;
      } else if (typeof panel.size === 'number') {
        return panel.size;
      }
      return containerSize / this.panels.length; // Default equal distribution
    });
  }
  
  private getClientPosition(event: MouseEvent | TouchEvent): { x: number, y: number } {
    if (event instanceof MouseEvent) {
      return { x: event.clientX, y: event.clientY };
    } else {
      const touch = event.touches[0] || event.changedTouches[0];
      return { x: touch.clientX, y: touch.clientY };
    }
  }
  
  private addGlobalListeners(): void {
    document.addEventListener('mousemove', this.boundMouseMove);
    document.addEventListener('mouseup', this.boundMouseUp);
    document.addEventListener('touchmove', this.boundTouchMove, { passive: false });
    document.addEventListener('touchend', this.boundTouchEnd);
    document.addEventListener('selectstart', this.preventSelection);
  }
  
  private removeGlobalListeners(): void {
    document.removeEventListener('mousemove', this.boundMouseMove);
    document.removeEventListener('mouseup', this.boundMouseUp);
    document.removeEventListener('touchmove', this.boundTouchMove);
    document.removeEventListener('touchend', this.boundTouchEnd);
    document.removeEventListener('selectstart', this.preventSelection);
  }
  
  private preventSelection(event: Event): void {
    event.preventDefault();
  }
  
  handleResizerKeydown(event: KeyboardEvent, resizerIndex: number): void {
    const step = 10; // pixels
    let delta = 0;
    
    switch (event.key) {
      case 'ArrowLeft':
        if (this.direction === 'horizontal') delta = -step;
        break;
      case 'ArrowRight':
        if (this.direction === 'horizontal') delta = step;
        break;
      case 'ArrowUp':
        if (this.direction === 'vertical') delta = -step;
        break;
      case 'ArrowDown':
        if (this.direction === 'vertical') delta = step;
        break;
      case 'Home':
        delta = -1000; // Move to minimum
        break;
      case 'End':
        delta = 1000; // Move to maximum
        break;
      default:
        return;
    }
    
    event.preventDefault();
    
    // Simulate resize with keyboard
    this.currentResizerIndex = resizerIndex;
    this.startSizes = this.getCurrentPanelSizes();
    this.handleMove({ x: this.startPosition + delta, y: this.startPosition + delta });
    this.currentResizerIndex = -1;
  }
  
  // Public methods for programmatic control
  collapsePanel(panelId: string): void {
    const panel = this.panels.find(p => p.id === panelId);
    if (panel) {
      panel.collapsed = true;
    }
  }
  
  expandPanel(panelId: string): void {
    const panel = this.panels.find(p => p.id === panelId);
    if (panel) {
      panel.collapsed = false;
    }
  }
  
  setPanelSize(panelId: string, size: number | string): void {
    const panel = this.panels.find(p => p.id === panelId);
    if (panel) {
      panel.size = size;
    }
  }
  
  resetPanelSizes(): void {
    const equalSize = `${100 / this.panels.length}%`;
    this.panels.forEach(panel => {
      panel.size = equalSize;
      panel.collapsed = false;
    });
  }
}8^xx" export * from './stack.component';6޺x* export * from './sticky-layout.component';A*x 	import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

type StickyPosition = 'top' | 'bottom' | 'left' | 'right';
type StickyOffset = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'none';
type StickyVariant = 'default' | 'header' | 'sidebar' | 'footer' | 'floating' | 'toolbar';
type StickyBackground = 'transparent' | 'surface' | 'surface-secondary' | 'surface-elevated' | 'backdrop';
type StickySize = 'auto' | 'full' | 'content';

@Component({
  selector: 'ui-sticky-layout',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      [ngClass]="getClasses()"
      [style.z-index]="customZIndex"
      [style.width]="customWidth"
      [style.height]="customHeight"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel">
      
      <ng-content></ng-content>
    </div>
  `,
  styleUrl: './sticky-layout.component.scss'
})
export class StickyLayoutComponent {
  @Input() position: StickyPosition = 'top';
  @Input() variant: StickyVariant = 'default';
  @Input() background: StickyBackground = 'transparent';
  @Input() offset?: StickyOffset;
  @Input() size: StickySize = 'auto';
  @Input() shadow = false;
  @Input() border = false;
  @Input() blur = false;
  @Input() customZIndex?: number;
  @Input() customWidth?: string;
  @Input() customHeight?: string;
  @Input() role?: string;
  @Input() ariaLabel?: string;

  getClasses(): Record<string, boolean> {
    const classes: Record<string, boolean> = {
      'ui-sticky-layout': true,
      [`ui-sticky-layout--${this.position}`]: true,
      [`ui-sticky-layout--${this.size}`]: this.size !== 'auto'
    };

    if (this.variant !== 'default') {
      classes[`ui-sticky-layout--${this.variant}`] = true;
    }

    if (this.background !== 'transparent') {
      classes[`ui-sticky-layout--${this.background}`] = true;
    }

    if (this.offset) {
      classes[`ui-sticky-layout--offset-${this.offset}`] = true;
    }

    if (this.shadow) {
      classes['ui-sticky-layout--shadow'] = true;
    }

    if (this.border) {
      classes['ui-sticky-layout--border'] = true;
    }

    if (this.blur) {
      classes['ui-sticky-layout--blur'] = true;
    }

    return classes;
  }
}!۳x3 export * from './supporting-pane-layout.component';ߧx7import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons';

type PanePosition = 'left' | 'right';
type PaneSize = 'sm' | 'md' | 'lg' | 'xl';
type PaneVariant = 'default' | 'bordered' | 'elevated' | 'subtle';

@Component({
  selector: 'ui-supporting-pane-layout',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-supporting-pane-layout"
      [class.ui-supporting-pane-layout--position-right]="position === 'right'"
      [class.ui-supporting-pane-layout--collapsed]="collapsed"
      [class.ui-supporting-pane-layout--sticky-pane]="stickyPane"
      [class.ui-supporting-pane-layout--always-visible]="alwaysVisible"
      [class.ui-supporting-pane-layout--bordered]="variant === 'bordered'"
      [class.ui-supporting-pane-layout--elevated]="variant === 'elevated'"
      [class.ui-supporting-pane-layout--subtle]="variant === 'subtle'"
      [class.ui-supporting-pane-layout--sm]="paneSize === 'sm'"
      [class.ui-supporting-pane-layout--md]="paneSize === 'md'"
      [class.ui-supporting-pane-layout--lg]="paneSize === 'lg'"
      [class.ui-supporting-pane-layout--xl]="paneSize === 'xl'"
      [attr.role]="role">
      
      <!-- Main Content -->
      <main 
        class="ui-supporting-pane-layout__content"
        [attr.aria-label]="contentLabel"
        role="main">
        
        <ng-content></ng-content>
      </main>
      
      <!-- Supporting Pane -->
      <aside 
        class="ui-supporting-pane-layout__pane"
        [class.ui-supporting-pane-layout__pane--collapsed]="collapsed"
        [attr.aria-hidden]="collapsed"
        [attr.aria-expanded]="!collapsed"
        [attr.aria-label]="paneLabel"
        role="complementary">
        
        <!-- Pane Header (optional) -->
        @if (showPaneHeader) {
          <header class="ui-supporting-pane-layout__pane-header">
            @if (!collapsed) {
              <ng-content select="[slot='pane-header']"></ng-content>
            }
            
            @if (collapsible) {
              <button
                class="ui-supporting-pane-layout__pane-toggle"
                type="button"
                [attr.aria-label]="collapsed ? expandAriaLabel : collapseAriaLabel"
                [attr.aria-expanded]="!collapsed"
                (click)="handleTogglePane()"
                (keydown)="handleToggleKeydown($event)">
                
                <fa-icon 
                  [icon]="position === 'right' ? faChevronRight : faChevronLeft"
                  class="fa-icon"
                  aria-hidden="true">
                </fa-icon>
              </button>
            }
          </header>
        }
        
        <!-- Pane Content -->
        <div class="ui-supporting-pane-layout__pane-content">
          <ng-content select="[slot='supporting-pane']"></ng-content>
        </div>
        
        <!-- Pane Footer (optional) -->
        @if (showPaneFooter && !collapsed) {
          <footer class="ui-supporting-pane-layout__pane-footer">
            <ng-content select="[slot='pane-footer']"></ng-content>
          </footer>
        }
      </aside>
    </div>
  `,
  styleUrl: './supporting-pane-layout.component.scss'
})
export class SupportingPaneLayoutComponent {
  @Input() position: PanePosition = 'right';
  @Input() paneSize: PaneSize = 'md';
  @Input() variant: PaneVariant = 'default';
  @Input() collapsed = false;
  @Input() collapsible = true;
  @Input() stickyPane = false;
  @Input() alwaysVisible = false;
  @Input() showPaneHeader = true;
  @Input() showPaneFooter = false;
  @Input() role = 'application';
  @Input() contentLabel = 'Main content';
  @Input() paneLabel = 'Supporting information';
  @Input() collapseAriaLabel = 'Collapse supporting pane';
  @Input() expandAriaLabel = 'Expand supporting pane';
  
  @Output() paneToggled = new EventEmitter<boolean>();
  @Output() paneCollapsed = new EventEmitter<void>();
  @Output() paneExpanded = new EventEmitter<void>();
  
  // FontAwesome icons
  faChevronLeft = faChevronLeft;
  faChevronRight = faChevronRight;
  
  handleTogglePane(): void {
    if (!this.collapsible) return;
    
    const newCollapsedState = !this.collapsed;
    this.collapsed = newCollapsedState;
    
    // Emit events
    this.paneToggled.emit(newCollapsedState);
    
    if (newCollapsedState) {
      this.paneCollapsed.emit();
    } else {
      this.paneExpanded.emit();
    }
  }
  
  handleToggleKeydown(event: KeyboardEvent): void {
    // Support Enter and Space keys for accessibility
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.handleTogglePane();
    }
  }
  
  /**
   * Programmatically collapse the pane
   */
  collapsePane(): void {
    if (!this.collapsed && this.collapsible) {
      this.handleTogglePane();
    }
  }
  
  /**
   * Programmatically expand the pane
   */
  expandPane(): void {
    if (this.collapsed && this.collapsible) {
      this.handleTogglePane();
    }
  }
  
  /**
   * Get current pane state
   */
  isPaneCollapsed(): boolean {
    return this.collapsed;
  }
}
8ExJAQv"+m-6 uԅuG1	n	=zuvլj3oE{Z:ӳZA0'EKǦ?ɶIG?r";)ͪ0-FMiԐ`ƋmN$%d	Fkr*l6"6N	=:>.9>2[%bW-'o
@_)Ҍ6 <j 3 _+|D8DHOsQ!ȟC9KV4&glp>{Kf ħR1Y˩5߆l4vu%a_	=wS,ա1^CU'yhRh_%'[-T`vvkyؤT'p&qf^l(*-^96	~B/x 
bento-grid^bbento-grid" 
      [class]="'bento-grid--' + variant"
      [attr.data-adaptive]="adaptive"
    >
\$<
bento-gridf(	BentoGridcvariant: 'balanced' | 'asymmetric' | 'masonry' = 'balanced';
  @Input() adaptive: boolean = true;
}R4>xNfeedP7class="feed-layout" [class]="'feed-layout--' + variant"q&feed-layout__header" *ngIf="showHeaderfeed-layout__title(title+feed-layout__header-actions(header"-(feed-layout__filters" *ngIf="showFilters&filters#=feed-layout__content" [class.infinite-scroll]="infiniteScrollfeed-layout__items(item*
m$$feed-layout__loading" *ngIf="loading(loading+>feed-layout__load-more" *ngIf="showLoadMore && !infiniteScroll(	load-more+"feed-layout__empty" *ngIf="isEmpty(empty+-&feed-layout__footer" *ngIf="showFooter&o1&feedf(FeedLvariant: 'standard' | 'card-based' | 'compact' = 'standard';
  @Input() show,'Filters]")LoadMore: boolean = true;
  @Input() showW$infiniteScroll]loading]isEmpty: boolean = false;
}-&
lx Pwidgetcwidget>widget-grid--' + gridSize"
      [attr.data-auto-fit]="autoFitBGwidget-Widget!7gridSize: 'sm' | 'md' | 'lg' = 'md';
  @Input() autoFit1w9Nx+ export * from './tabs-container.component';Lbx3)import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal, computed } from '@angular/core';
import { CommonModule } from '@angular/common';

export interface Tab {
  id: string;
  label: string;
  content?: any;
  closeable?: boolean;
  disabled?: boolean;
  lazyLoad?: boolean;
  icon?: string;
}

type TabSize = 'sm' | 'md' | 'lg';
type TabVariant = 'default' | 'filled' | 'pills' | 'underlined';
type TabPosition = 'top' | 'bottom' | 'left' | 'right';

@Component({
  selector: 'ui-tabs-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      [ngClass]="getContainerClasses()"
      [attr.role]="'tablist'"
      [attr.aria-orientation]="position === 'left' || position === 'right' ? 'vertical' : 'horizontal'">
      
      <!-- Tab Navigation -->
      <div class="ui-tabs-container__nav" 
           [attr.role]="'tablist'">
        <div class="ui-tabs-container__nav-content"
             [class.ui-tabs-container__nav-content--dragging]="isDragging">
          @for (tab of tabs; track tab.id; let index = $index) {
            <button
              type="button"
              class="ui-tabs-container__tab"
              [class.ui-tabs-container__tab--active]="activeTabId() === tab.id"
              [class.ui-tabs-container__tab--disabled]="tab.disabled"
              [attr.role]="'tab'"
              [attr.aria-selected]="activeTabId() === tab.id"
              [attr.aria-controls]="'panel-' + tab.id"
              [attr.id]="'tab-' + tab.id"
              [attr.tabindex]="activeTabId() === tab.id ? 0 : -1"
              [disabled]="tab.disabled"
              [draggable]="reorderable && !tab.disabled"
              (click)="selectTab(tab.id)"
              (keydown)="handleTabKeydown($event, index)"
              (dragstart)="handleDragStart($event, index)"
              (dragover)="handleDragOver($event)"
              (drop)="handleDrop($event, index)"
              (dragend)="handleDragEnd()">
              
              @if (tab.icon) {
                <span class="ui-tabs-container__tab-icon" [attr.aria-hidden]="true">
                  {{ tab.icon }}
                </span>
              }
              
              <span class="ui-tabs-container__tab-label">{{ tab.label }}</span>
              
              @if (tab.closeable && !tab.disabled) {
                <button
                  type="button"
                  class="ui-tabs-container__tab-close"
                  [attr.aria-label]="'Close ' + tab.label"
                  (click)="closeTab($event, tab.id)">
                  ×
                </button>
              }
            </button>
          }
        </div>
        
        @if (scrollable && showScrollControls()) {
          <div class="ui-tabs-container__scroll-controls">
            <button
              type="button"
              class="ui-tabs-container__scroll-button ui-tabs-container__scroll-button--prev"
              [disabled]="!canScrollPrev()"
              [attr.aria-label]="'Scroll tabs left'"
              (click)="scrollTabs('prev')">
              ‹
            </button>
            <button
              type="button"
              class="ui-tabs-container__scroll-button ui-tabs-container__scroll-button--next"
              [disabled]="!canScrollNext()"
              [attr.aria-label]="'Scroll tabs right'"
              (click)="scrollTabs('next')">
              ›
            </button>
          </div>
        }
      </div>
      
      <!-- Tab Panels -->
      <div class="ui-tabs-container__content">
        <ng-content></ng-content>
      </div>
    </div>
  `,
  styleUrl: './tabs-container.component.scss'
})
export class TabsContainerComponent {
  @Input() tabs: Tab[] = [];
  @Input() size: TabSize = 'md';
  @Input() variant: TabVariant = 'default';
  @Input() position: TabPosition = 'top';
  @Input() scrollable = false;
  @Input() reorderable = false;
  @Input() lazyLoad = true;
  
  // Active tab management
  private _activeTabId = signal<string | null>(null);
  activeTabId = computed(() => this._activeTabId());
  
  // Drag and drop state
  isDragging = false;
  draggedIndex: number | null = null;
  
  @Output() tabSelected = new EventEmitter<string>();
  @Output() tabClosed = new EventEmitter<string>();
  @Output() tabsReordered = new EventEmitter<Tab[]>();
  
  ngOnInit() {
    // Set initial active tab if none is set
    if (!this.activeTabId() && this.tabs.length > 0) {
      const firstEnabledTab = this.tabs.find(tab => !tab.disabled);
      if (firstEnabledTab) {
        this._activeTabId.set(firstEnabledTab.id);
      }
    }
  }
  
  getContainerClasses(): Record<string, boolean> {
    return {
      'ui-tabs-container': true,
      [`ui-tabs-container--size-${this.size}`]: true,
      [`ui-tabs-container--variant-${this.variant}`]: true,
      [`ui-tabs-container--position-${this.position}`]: true,
      'ui-tabs-container--scrollable': this.scrollable
    };
  }
  
  selectTab(tabId: string): void {
    const tab = this.tabs.find(t => t.id === tabId);
    if (!tab || tab.disabled) return;
    
    this._activeTabId.set(tabId);
    this.tabSelected.emit(tabId);
  }
  
  closeTab(event: Event, tabId: string): void {
    event.stopPropagation();
    
    const tabIndex = this.tabs.findIndex(t => t.id === tabId);
    if (tabIndex === -1) return;
    
    // If closing active tab, select adjacent tab
    if (this.activeTabId() === tabId) {
      const remainingTabs = this.tabs.filter(t => t.id !== tabId && !t.disabled);
      if (remainingTabs.length > 0) {
        // Try to select next tab, or previous if no next
        const nextTab = this.tabs[tabIndex + 1];
        const prevTab = this.tabs[tabIndex - 1];
        
        if (nextTab && !nextTab.disabled) {
          this._activeTabId.set(nextTab.id);
        } else if (prevTab && !prevTab.disabled) {
          this._activeTabId.set(prevTab.id);
        } else {
          this._activeTabId.set(remainingTabs[0].id);
        }
      } else {
        this._activeTabId.set(null);
      }
    }
    
    this.tabClosed.emit(tabId);
  }
  
  handleTabKeydown(event: KeyboardEvent, index: number): void {
    const isHorizontal = this.position === 'top' || this.position === 'bottom';
    let newIndex = index;
    
    switch (event.key) {
      case 'ArrowRight':
        if (isHorizontal) {
          event.preventDefault();
          newIndex = this.getNextEnabledTabIndex(index, 1);
        }
        break;
      case 'ArrowLeft':
        if (isHorizontal) {
          event.preventDefault();
          newIndex = this.getNextEnabledTabIndex(index, -1);
        }
        break;
      case 'ArrowDown':
        if (!isHorizontal) {
          event.preventDefault();
          newIndex = this.getNextEnabledTabIndex(index, 1);
        }
        break;
      case 'ArrowUp':
        if (!isHorizontal) {
          event.preventDefault();
          newIndex = this.getNextEnabledTabIndex(index, -1);
        }
        break;
      case 'Home':
        event.preventDefault();
        newIndex = this.getNextEnabledTabIndex(-1, 1);
        break;
      case 'End':
        event.preventDefault();
        newIndex = this.getNextEnabledTabIndex(this.tabs.length, -1);
        break;
      case 'Delete':
        if (this.tabs[index].closeable) {
          event.preventDefault();
          this.closeTab(event, this.tabs[index].id);
        }
        break;
    }
    
    if (newIndex !== index && newIndex >= 0 && newIndex < this.tabs.length) {
      this.selectTab(this.tabs[newIndex].id);
      // Focus the new tab
      setTimeout(() => {
        const newTabElement = document.getElementById('tab-' + this.tabs[newIndex].id);
        newTabElement?.focus();
      });
    }
  }
  
  private getNextEnabledTabIndex(startIndex: number, direction: number): number {
    let index = startIndex + direction;
    
    while (index >= 0 && index < this.tabs.length) {
      if (!this.tabs[index].disabled) {
        return index;
      }
      index += direction;
    }
    
    // If we didn't find an enabled tab, wrap around
    if (direction > 0) {
      // Going forward, start from beginning
      for (let i = 0; i < startIndex; i++) {
        if (!this.tabs[i].disabled) {
          return i;
        }
      }
    } else {
      // Going backward, start from end
      for (let i = this.tabs.length - 1; i > startIndex; i--) {
        if (!this.tabs[i].disabled) {
          return i;
        }
      }
    }
    
    return startIndex; // Return original index if no other enabled tab found
  }
  
  // Drag and drop methods
  handleDragStart(event: DragEvent, index: number): void {
    if (!this.reorderable) return;
    
    this.isDragging = true;
    this.draggedIndex = index;
    
    if (event.dataTransfer) {
      event.dataTransfer.effectAllowed = 'move';
      event.dataTransfer.setData('text/plain', index.toString());
    }
  }
  
  handleDragOver(event: DragEvent): void {
    if (!this.reorderable || !this.isDragging) return;
    
    event.preventDefault();
    event.dataTransfer!.dropEffect = 'move';
  }
  
  handleDrop(event: DragEvent, dropIndex: number): void {
    if (!this.reorderable || this.draggedIndex === null) return;
    
    event.preventDefault();
    
    if (this.draggedIndex !== dropIndex) {
      const newTabs = [...this.tabs];
      const draggedTab = newTabs.splice(this.draggedIndex, 1)[0];
      newTabs.splice(dropIndex, 0, draggedTab);
      
      this.tabsReordered.emit(newTabs);
    }
    
    this.handleDragEnd();
  }
  
  handleDragEnd(): void {
    this.isDragging = false;
    this.draggedIndex = null;
  }
  
  // Scrolling methods
  showScrollControls(): boolean {
    // This would need actual element measurement in a real implementation
    return this.scrollable;
  }
  
  canScrollPrev(): boolean {
    // Implementation would check actual scroll position
    return true;
  }
  
  canScrollNext(): boolean {
    // Implementation would check actual scroll position
    return true;
  }
  
  scrollTabs(direction: 'prev' | 'next'): void {
    // Implementation would handle actual scrolling
    const navContent = document.querySelector('.ui-tabs-container__nav-content') as HTMLElement;
    if (navContent) {
      const scrollAmount = 200;
      navContent.scrollBy({
        left: direction === 'next' ? scrollAmount : -scrollAmount,
        behavior: 'smooth'
      });
    }
  }
}gQx# export * from './vstack.component';Tx export * from './video-player';
1x GSjmfGbM/*F[5Ƭ`x8q_]/`M{Ѧ \x G!Q8:jҌ"C[5o,x |In,%-1R5rg
ix) export * from './video-player.component';.xX;import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, ViewChild, ElementRef, OnDestroy, signal, computed } from '@angular/core';
import { CommonModule } from '@angular/common';

export type VideoPlayerSize = 'sm' | 'md' | 'lg';
export type VideoPlayerVariant = 'default' | 'minimal' | 'theater';
export type VideoQuality = '240p' | '360p' | '480p' | '720p' | '1080p' | 'auto';

export interface VideoSource {
  src: string;
  type: string;
  quality?: VideoQuality;
  label?: string;
}

export interface VideoTrack {
  src: string;
  kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';
  srclang: string;
  label: string;
  default?: boolean;
}

@Component({
  selector: 'ui-video-player',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-video-player"
      [class]="getComponentClasses()"
      [attr.aria-label]="ariaLabel">
      
      <!-- Video element -->
      <div class="ui-video-player__video-container">
        <video
          #videoElement
          class="ui-video-player__video"
          [poster]="poster"
          [muted]="muted"
          [autoplay]="autoplay"
          [loop]="loop"
          [attr.playsinline]="playsinline"
          [preload]="preload"
          [attr.aria-label]="videoAriaLabel"
          (loadstart)="handleLoadStart()"
          (loadeddata)="handleLoadedData()"
          (canplay)="handleCanPlay()"
          (play)="handlePlay()"
          (pause)="handlePause()"
          (ended)="handleEnded()"
          (timeupdate)="handleTimeUpdate()"
          (volumechange)="handleVideoVolumeChange()"
          (error)="handleError($event)">
          
          <!-- Video sources -->
          @for (source of sources; track source.src) {
            <source [src]="source.src" [type]="source.type">
          }
          
          <!-- Text tracks -->
          @for (track of tracks; track track.src) {
            <track 
              [src]="track.src" 
              [kind]="track.kind" 
              [srclang]="track.srclang" 
              [label]="track.label"
              [default]="track.default || false">
          }
          
          <!-- Fallback message -->
          <p class="ui-video-player__fallback">
            Your browser does not support the video tag.
            @if (sources.length > 0) {
              <a [href]="sources[0].src" target="_blank">Download the video</a>
            }
          </p>
        </video>
        
        <!-- Loading overlay -->
        @if (loading()) {
          <div class="ui-video-player__loading-overlay">
            <div class="ui-video-player__loading-spinner"></div>
            <span class="ui-video-player__loading-text">Loading video...</span>
          </div>
        }
        
        <!-- Controls overlay -->
        @if (showControls && !disabled) {
          <div class="ui-video-player__controls" [class.ui-video-player__controls--visible]="controlsVisible()">
            
            <!-- Play/Pause button -->
            <button 
              class="ui-video-player__control ui-video-player__play-pause"
              [disabled]="disabled || loading"
              (click)="togglePlayPause()"
              [attr.aria-label]="isPlaying() ? 'Pause video' : 'Play video'"
              type="button">
              @if (isPlaying()) {
                <svg class="ui-video-player__control-icon" viewBox="0 0 24 24" fill="currentColor">
                  <rect x="6" y="4" width="4" height="16"/>
                  <rect x="14" y="4" width="4" height="16"/>
                </svg>
              } @else {
                <svg class="ui-video-player__control-icon" viewBox="0 0 24 24" fill="currentColor">
                  <polygon points="5,3 19,12 5,21"/>
                </svg>
              }
            </button>
            
            <!-- Progress bar -->
            <div class="ui-video-player__progress-container">
              <input 
                type="range"
                class="ui-video-player__progress-bar"
                [min]="0"
                [max]="duration() || 100"
                [value]="currentTime()"
                [disabled]="disabled || loading"
                (input)="handleSeek($event)"
                [attr.aria-label]="'Seek video position'"
                step="0.1">
              <div class="ui-video-player__progress-track">
                <div class="ui-video-player__progress-filled" [style.width.%]="progressPercentage()"></div>
              </div>
            </div>
            
            <!-- Time display -->
            <span class="ui-video-player__time">
              {{ formatTime(currentTime()) }} / {{ formatTime(duration()) }}
            </span>
            
            <!-- Volume control -->
            @if (showVolumeControl) {
              <button 
                class="ui-video-player__control ui-video-player__mute"
                [disabled]="disabled"
                (click)="toggleMute()"
                [attr.aria-label]="isMuted() ? 'Unmute video' : 'Mute video'"
                type="button">
                @if (isMuted() || volume() === 0) {
                  <svg class="ui-video-player__control-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                    <polygon points="11,5 6,9 2,9 2,15 6,15 11,19"/>
                    <line x1="23" y1="9" x2="17" y2="15"/>
                    <line x1="17" y1="9" x2="23" y2="15"/>
                  </svg>
                } @else if (volume() < 0.5) {
                  <svg class="ui-video-player__control-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                    <polygon points="11,5 6,9 2,9 2,15 6,15 11,19"/>
                    <path d="M15.54,8.46a5,5,0,0,1,0,7.07"/>
                  </svg>
                } @else {
                  <svg class="ui-video-player__control-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                    <polygon points="11,5 6,9 2,9 2,15 6,15 11,19"/>
                    <path d="M19.07,4.93a10,10,0,0,1,0,14.14M15.54,8.46a5,5,0,0,1,0,7.07"/>
                  </svg>
                }
              </button>
              
              <input 
                type="range"
                class="ui-video-player__volume-bar"
                [min]="0"
                [max]="1"
                [value]="volume()"
                [disabled]="disabled"
                (input)="handleVolumeSliderChange($event)"
                [attr.aria-label]="'Volume control'"
                step="0.1">
            }
            
            <!-- Fullscreen button -->
            @if (allowFullscreen) {
              <button 
                class="ui-video-player__control ui-video-player__fullscreen"
                [disabled]="disabled"
                (click)="toggleFullscreen()"
                [attr.aria-label]="isFullscreen() ? 'Exit fullscreen' : 'Enter fullscreen'"
                type="button">
                @if (isFullscreen()) {
                  <svg class="ui-video-player__control-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                    <path d="M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3"/>
                  </svg>
                } @else {
                  <svg class="ui-video-player__control-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                    <path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/>
                  </svg>
                }
              </button>
            }
          </div>
        }
      </div>
      
      <!-- Error message -->
      @if (hasError()) {
        <div class="ui-video-player__error">
          <div class="ui-video-player__error-icon">
            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
              <circle cx="12" cy="12" r="10"/>
              <line x1="12" y1="8" x2="12" y2="12"/>
              <line x1="12" y1="16" x2="12.01" y2="16"/>
            </svg>
          </div>
          <p class="ui-video-player__error-message">{{ errorMessage() || 'Failed to load video' }}</p>
          @if (sources.length > 0) {
            <a [href]="sources[0].src" target="_blank" class="ui-video-player__error-link">
              Download video
            </a>
          }
        </div>
      }
    </div>
  `,
  styleUrl: './video-player.component.scss'
})
export class VideoPlayerComponent implements OnDestroy {
  @ViewChild('videoElement') videoElement!: ElementRef<HTMLVideoElement>;

  @Input() sources: VideoSource[] = [];
  @Input() tracks: VideoTrack[] = [];
  @Input() poster?: string;
  @Input() size: VideoPlayerSize = 'md';
  @Input() variant: VideoPlayerVariant = 'default';
  @Input() disabled = false;
  @Input() autoplay = false;
  @Input() loop = false;
  @Input() muted = false;
  @Input() playsinline = true;
  @Input() preload: 'none' | 'metadata' | 'auto' = 'metadata';
  @Input() showControls = true;
  @Input() showVolumeControl = true;
  @Input() allowFullscreen = true;
  @Input() ariaLabel = 'Video player';
  @Input() videoAriaLabel = 'Video content';

  @Output() play = new EventEmitter<void>();
  @Output() pause = new EventEmitter<void>();
  @Output() ended = new EventEmitter<void>();
  @Output() timeUpdate = new EventEmitter<number>();
  @Output() volumeChange = new EventEmitter<number>();
  @Output() fullscreenChange = new EventEmitter<boolean>();
  @Output() error = new EventEmitter<Event>();

  // Signals for reactive state
  private _isPlaying = signal(false);
  private _currentTime = signal(0);
  private _duration = signal(0);
  private _volume = signal(1);
  private _isMuted = signal(false);
  private _loading = signal(false);
  private _hasError = signal(false);
  private _errorMessage = signal('');
  private _isFullscreen = signal(false);
  private _controlsVisible = signal(true);

  // Public readonly signals
  isPlaying = this._isPlaying.asReadonly();
  currentTime = this._currentTime.asReadonly();
  duration = this._duration.asReadonly();
  volume = this._volume.asReadonly();
  isMuted = this._isMuted.asReadonly();
  loading = this._loading.asReadonly();
  hasError = this._hasError.asReadonly();
  errorMessage = this._errorMessage.asReadonly();
  isFullscreen = this._isFullscreen.asReadonly();
  controlsVisible = this._controlsVisible.asReadonly();

  // Computed values
  progressPercentage = computed(() => {
    const duration = this.duration();
    const currentTime = this.currentTime();
    return duration > 0 ? (currentTime / duration) * 100 : 0;
  });

  private controlsHideTimer?: number;

  getComponentClasses(): string {
    const classes = [
      'ui-video-player',
      `ui-video-player--${this.size}`,
      `ui-video-player--${this.variant}`
    ];
    
    if (this.disabled) {
      classes.push('ui-video-player--disabled');
    }
    
    if (this.loading()) {
      classes.push('ui-video-player--loading');
    }
    
    if (this.isFullscreen()) {
      classes.push('ui-video-player--fullscreen');
    }
    
    return classes.join(' ');
  }

  ngOnDestroy(): void {
    if (this.controlsHideTimer) {
      clearTimeout(this.controlsHideTimer);
    }
  }

  // Video event handlers
  handleLoadStart(): void {
    this._loading.set(true);
    this._hasError.set(false);
  }

  handleLoadedData(): void {
    if (this.videoElement?.nativeElement) {
      this._duration.set(this.videoElement.nativeElement.duration);
    }
  }

  handleCanPlay(): void {
    this._loading.set(false);
  }

  handlePlay(): void {
    this._isPlaying.set(true);
    this.play.emit();
    this.hideControlsAfterDelay();
  }

  handlePause(): void {
    this._isPlaying.set(false);
    this.pause.emit();
    this.showControlsOverlay();
  }

  handleEnded(): void {
    this._isPlaying.set(false);
    this.ended.emit();
    this.showControlsOverlay();
  }

  handleTimeUpdate(): void {
    if (this.videoElement?.nativeElement) {
      const currentTime = this.videoElement.nativeElement.currentTime;
      this._currentTime.set(currentTime);
      this.timeUpdate.emit(currentTime);
    }
  }

  handleVideoVolumeChange(): void {
    if (this.videoElement?.nativeElement) {
      const video = this.videoElement.nativeElement;
      this._volume.set(video.volume);
      this._isMuted.set(video.muted);
      this.volumeChange.emit(video.volume);
    }
  }

  handleError(event: Event): void {
    this._loading.set(false);
    this._hasError.set(true);
    this._errorMessage.set('Failed to load video');
    this.error.emit(event);
  }

  // Control methods
  togglePlayPause(): void {
    if (!this.videoElement?.nativeElement || this.disabled) return;

    if (this.isPlaying()) {
      this.videoElement.nativeElement.pause();
    } else {
      this.videoElement.nativeElement.play();
    }
  }

  handleSeek(event: Event): void {
    if (!this.videoElement?.nativeElement || this.disabled) return;

    const target = event.target as HTMLInputElement;
    const seekTime = parseFloat(target.value);
    this.videoElement.nativeElement.currentTime = seekTime;
  }

  toggleMute(): void {
    if (!this.videoElement?.nativeElement || this.disabled) return;

    this.videoElement.nativeElement.muted = !this.videoElement.nativeElement.muted;
  }

  handleVolumeSliderChange(event: Event): void {
    if (!this.videoElement?.nativeElement || this.disabled) return;

    const target = event.target as HTMLInputElement;
    const newVolume = parseFloat(target.value);
    this.videoElement.nativeElement.volume = newVolume;
  }

  toggleFullscreen(): void {
    if (!this.allowFullscreen || this.disabled) return;

    if (!document.fullscreenElement) {
      this.videoElement?.nativeElement.requestFullscreen().then(() => {
        this._isFullscreen.set(true);
        this.fullscreenChange.emit(true);
      });
    } else {
      document.exitFullscreen().then(() => {
        this._isFullscreen.set(false);
        this.fullscreenChange.emit(false);
      });
    }
  }

  // Control visibility
  private showControlsOverlay(): void {
    this._controlsVisible.set(true);
    if (this.controlsHideTimer) {
      clearTimeout(this.controlsHideTimer);
    }
  }

  private hideControlsAfterDelay(): void {
    if (this.controlsHideTimer) {
      clearTimeout(this.controlsHideTimer);
    }
    
    this.controlsHideTimer = window.setTimeout(() => {
      if (this.isPlaying()) {
        this._controlsVisible.set(false);
      }
    }, 3000);
  }

  // Utility methods
  formatTime(seconds: number): string {
    if (isNaN(seconds)) return '0:00';
    
    const hours = Math.floor(seconds / 3600);
    const minutes = Math.floor((seconds % 3600) / 60);
    const secs = Math.floor(seconds % 60);
    
    if (hours > 0) {
      return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
    }
    
    return `${minutes}:${secs.toString().padStart(2, '0')}`;
  }
}rsfxQvd^zLݲ̔|݂"]̪X[%CKs)/K,L+뀲	iJ,NLIMHRjm	w9)yH+)N.JM,vs54&3Jnܧ9T Rx 멊7PY`nf$1SMxJ@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;
/**
 * ==========================================================================
 * APPBAR COMPONENT STYLES
 * ==========================================================================
 * Material Design 3 inspired appbar component with design token integration.
 * Supports multiple height variants, positioning options, and content slots.
 * ==========================================================================
 */


// Tokens available globally via main application styles

.ui-appbar {
  display: flex;
  flex-wrap: nowrap;
  flex-direction: row;
  align-items: center;
  overflow: hidden;
  position: relative;
  box-sizing: border-box;
  width: 100%;
  z-index: $semantic-layer-appbar;
  transition: all $semantic-duration-short $semantic-easing-standard;
  background-color: $semantic-color-surface-primary;
  color: $semantic-color-text-primary;
  border-bottom: $semantic-border-width-1 solid $semantic-color-border-subtle;
  padding-left: $semantic-spacing-component-lg;
  padding-right: $semantic-spacing-component-lg;

  // Variant heights
  &[data-variant="compact"] {
    height: $semantic-sizing-appbar-compact;
    min-height: $semantic-sizing-appbar-compact;
  }

  &[data-variant="standard"] {
    height: $semantic-sizing-appbar-standard;
    min-height: $semantic-sizing-appbar-standard;
  }

  &[data-variant="large"] {
    height: $semantic-sizing-appbar-large;
    min-height: $semantic-sizing-appbar-large;
  }

  &[data-variant="prominent"] {
    height: $semantic-sizing-appbar-prominent;
    min-height: $semantic-sizing-appbar-prominent;
  }

  // Position variants
  &[data-position="fixed"] {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
  }

  &[data-position="sticky"] {
    position: sticky;
    top: 0;
  }

  // Elevated state
  &[data-elevated="true"] {
    box-shadow: $semantic-shadow-elevation-2;
  }

  // Responsive adjustments
  @media (max-width: calc($semantic-breakpoint-md - 1px)) {
    padding-left: $semantic-spacing-component-md;
    padding-right: $semantic-spacing-component-md;

    &[data-variant="large"] {
      height: $semantic-sizing-appbar-standard;
      min-height: $semantic-sizing-appbar-standard;
    }

    &[data-variant="prominent"] {
      height: $semantic-sizing-appbar-large;
      min-height: $semantic-sizing-appbar-large;
    }
  }

  @media (max-width: calc($semantic-breakpoint-sm - 1px)) {
    &[data-variant="large"],
    &[data-variant="prominent"] {
      height: $semantic-sizing-appbar-compact;
      min-height: $semantic-sizing-appbar-compact;
    }
  }
}

// Left side components
.ui-appbar__left-icon {
  flex: 0 0 $semantic-sizing-touch-target;
  display: flex;
  align-items: center;
  justify-content: center;
  user-select: none;
  padding: $semantic-spacing-component-xs;
}

.ui-appbar__left-logo {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  padding: $semantic-spacing-component-xs;
  user-select: none;
  overflow: hidden;
  box-sizing: border-box;

  ::ng-deep img {
    max-height: calc(100% - #{$semantic-spacing-component-sm});
    width: auto;
    object-fit: contain;
  }
}

.ui-appbar__left-avatar {
  flex: 0 0 $semantic-sizing-touch-target;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: $semantic-spacing-component-xs;
  box-sizing: border-box;
  overflow: hidden;
}

// Center title
.ui-appbar__title {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  text-align: center;
  font-size: $semantic-typography-font-size-lg;
  font-weight: $semantic-typography-font-weight-medium;
  line-height: $semantic-typography-line-height-normal;
  padding: 0 $semantic-spacing-component-sm;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;

  // Adjust for prominent variant
  [data-variant="prominent"] & {
    font-size: $semantic-typography-font-size-lg;
    font-weight: $semantic-typography-font-weight-semibold;
    line-height: $semantic-typography-line-height-normal;
  }

  // Responsive adjustments
  @media (max-width: calc($semantic-breakpoint-sm - 1px)) {
    font-size: $semantic-typography-font-size-md;
    font-weight: $semantic-typography-font-weight-medium;
    line-height: $semantic-typography-line-height-normal;
  }
}

.ui-appbar__spacer {
  flex: 1 1 auto;
}

// Right side components
.ui-appbar__right-icon {
  flex: 0 0 $semantic-sizing-touch-target;
  display: flex;
  align-items: center;
  justify-content: center;
  user-select: none;
  padding: $semantic-spacing-component-xs;
}

.ui-appbar__right-logo {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  padding: $semantic-spacing-component-xs;
  user-select: none;
  overflow: hidden;
  box-sizing: border-box;

  ::ng-deep img {
    max-height: calc(100% - #{$semantic-spacing-component-sm});
    width: auto;
    object-fit: contain;
  }
}

.ui-appbar__right-avatar {
  flex: 0 0 $semantic-sizing-touch-target;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: $semantic-spacing-component-xs;
  box-sizing: border-box;
  overflow: hidden;
}

.ui-appbar__right-menu {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  padding: $semantic-spacing-component-xs;
  user-select: none;
}

// Icon styling for all slots
.ui-appbar__left-icon,
.ui-appbar__right-icon,
.ui-appbar__right-menu {
  ::ng-deep i,
  ::ng-deep mat-icon,
  ::ng-deep [class*="icon"] {
    font-size: $semantic-typography-font-size-lg;
    line-height: 1;
    color: $semantic-color-text-secondary;
    transition: color $semantic-duration-short $semantic-easing-standard;

    &:hover {
      color: $semantic-color-text-primary;
    }
  }
}'s`sXx;sXggqFbQjniF%1 RG*xJimport { Component, Input, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';

export type AppbarVariant = 'compact' | 'standard' | 'large' | 'prominent';
export type AppbarPosition = 'static' | 'fixed' | 'sticky';

export interface AppbarSlots {
  leftIcon?: boolean;
  leftLogo?: boolean;
  leftAvatar?: boolean;
  title?: boolean;
  rightIcon?: boolean;
  rightLogo?: boolean;
  rightAvatar?: boolean;
  rightMenu?: boolean;
}

@Component({
  selector: 'ui-appbar',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  styleUrls: ['./appbar.component.scss'],
  template: `
    <div 
      class="ui-appbar"
      [class]="getAppbarClasses()"
      [attr.data-variant]="variant"
      [attr.data-position]="position"
      [attr.data-elevated]="elevated"
    >
      @if (slots.leftIcon) {
        <div class="ui-appbar__left-icon" slot="left-icon">
          <ng-content select="[slot=left-icon]"></ng-content>
        </div>
      }

      @if (slots.leftLogo) {
        <div class="ui-appbar__left-logo" slot="left-logo">
          <ng-content select="[slot=left-logo]"></ng-content>
        </div>
      }

      @if (slots.leftAvatar) {
        <div class="ui-appbar__left-avatar" slot="left-avatar">
          <ng-content select="[slot=left-avatar]"></ng-content>
        </div>
      }

      @if (slots.title) {
        <div class="ui-appbar__title" slot="title">
          <ng-content select="[slot=title]"></ng-content>
        </div>
      }

      <div class="ui-appbar__spacer"></div>

      @if (slots.rightIcon) {
        <div class="ui-appbar__right-icon" slot="right-icon">
          <ng-content select="[slot=right-icon]"></ng-content>
        </div>
      }

      @if (slots.rightLogo) {
        <div class="ui-appbar__right-logo" slot="right-logo">
          <ng-content select="[slot=right-logo]"></ng-content>
        </div>
      }

      @if (slots.rightAvatar) {
        <div class="ui-appbar__right-avatar" slot="right-avatar">
          <ng-content select="[slot=right-avatar]"></ng-content>
        </div>
      }

      @if (slots.rightMenu) {
        <div class="ui-appbar__right-menu" slot="right-menu">
          <ng-content select="[slot=right-menu]"></ng-content>
        </div>
      }
    </div>
  `
})
export class AppbarComponent {
  @Input() variant: AppbarVariant = 'standard';
  @Input() position: AppbarPosition = 'static';
  @Input() elevated: boolean = false;
  @Input() slots: AppbarSlots = {
    leftIcon: false,
    leftLogo: false,
    leftAvatar: false,
    title: true,
    rightIcon: false,
    rightLogo: false,
    rightAvatar: false,
    rightMenu: false
  };

  getAppbarClasses(): string {
    const classes: string[] = [];
    
    if (this.elevated) {
      classes.push('ui-appbar--elevated');
    }

    return classes.join(' ');
  }
}³x# export * from './appbar.component';H>/x  (Sf\f5Qh|#_;&ӾxQimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';

export type BottomNavigationSize = 'sm' | 'md' | 'lg';
export type BottomNavigationVariant = 'default' | 'primary' | 'secondary';

export interface BottomNavigationItem {
  id: string;
  label: string;
  icon?: string;
  badge?: string | number;
  disabled?: boolean;
  href?: string;
  route?: string;
}

@Component({
  selector: 'ui-bottom-navigation',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <nav 
      class="ui-bottom-navigation"
      [class.ui-bottom-navigation--{{size}}]="size"
      [class.ui-bottom-navigation--{{variant}}]="variant"
      [class.ui-bottom-navigation--elevated]="elevated"
      [class.ui-bottom-navigation--hidden]="hidden"
      [attr.aria-label]="ariaLabel"
      role="navigation">
      
      @for (item of items; track item.id) {
        <a 
          class="ui-bottom-navigation__item"
          [class.ui-bottom-navigation__item--active]="activeItemId === item.id"
          [class.ui-bottom-navigation__item--disabled]="item.disabled"
          [class.ui-bottom-navigation__item--has-badge]="item.badge"
          [href]="item.href || null"
          [attr.aria-current]="activeItemId === item.id ? 'page' : null"
          [attr.aria-disabled]="item.disabled"
          [tabindex]="item.disabled ? -1 : 0"
          (click)="handleItemClick($event, item)"
          (keydown)="handleItemKeydown($event, item)">
          
          @if (item.icon) {
            <span class="ui-bottom-navigation__icon" aria-hidden="true">
              <ng-content [select]="'[data-icon=' + item.id + ']'"></ng-content>
            </span>
          }
          
          @if (item.label) {
            <span class="ui-bottom-navigation__label">{{ item.label }}</span>
          }
          
          @if (item.badge) {
            <span class="ui-bottom-navigation__badge" [attr.aria-label]="getBadgeAriaLabel(item.badge)">
              {{ getBadgeDisplay(item.badge) }}
            </span>
          }
        </a>
      }
    </nav>
  `,
  styleUrl: './bottom-navigation.component.scss'
})
export class BottomNavigationComponent {
  @Input() size: BottomNavigationSize = 'md';
  @Input() variant: BottomNavigationVariant = 'default';
  @Input() elevated = false;
  @Input() hidden = false;
  @Input() items: BottomNavigationItem[] = [];
  @Input() activeItemId?: string;
  @Input() ariaLabel = 'Bottom navigation';
  
  @Output() itemClicked = new EventEmitter<BottomNavigationItem>();
  @Output() activeItemChanged = new EventEmitter<string>();
  
  handleItemClick(event: MouseEvent, item: BottomNavigationItem): void {
    if (item.disabled) {
      event.preventDefault();
      return;
    }
    
    // If it's a route navigation, prevent default to let router handle it
    if (item.route && !item.href) {
      event.preventDefault();
    }
    
    // Update active item if not disabled
    if (this.activeItemId !== item.id) {
      this.activeItemChanged.emit(item.id);
    }
    
    // Emit item clicked event
    this.itemClicked.emit(item);
  }
  
  handleItemKeydown(event: KeyboardEvent, item: BottomNavigationItem): void {
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.handleItemClick(event as any, item);
    } else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
      event.preventDefault();
      this.navigateToAdjacentItem(event.key === 'ArrowLeft' ? -1 : 1);
    }
  }
  
  private navigateToAdjacentItem(direction: number): void {
    const enabledItems = this.items.filter(item => !item.disabled);
    const currentIndex = enabledItems.findIndex(item => item.id === this.activeItemId);
    
    if (currentIndex === -1) return;
    
    const nextIndex = (currentIndex + direction + enabledItems.length) % enabledItems.length;
    const nextItem = enabledItems[nextIndex];
    
    if (nextItem) {
      this.activeItemChanged.emit(nextItem.id);
      
      // Focus the next item
      setTimeout(() => {
        const itemElement = document.querySelector(
          `.ui-bottom-navigation__item[aria-current="page"]`
        ) as HTMLElement;
        itemElement?.focus();
      });
    }
  }
  
  getBadgeDisplay(badge: string | number): string {
    if (typeof badge === 'number' && badge > 99) {
      return '99+';
    }
    return badge.toString();
  }
  
  getBadgeAriaLabel(badge: string | number): string {
    if (typeof badge === 'number') {
      return badge > 99 ? 'More than 99 notifications' : `${badge} notifications`;
    }
    return `Badge: ${badge}`;
  }
}KPx. export * from './bottom-navigation.component';0x  !/2Wf|Q;Ҽx
6@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

.ui-breadcrumb {
  display: flex;
  align-items: center;
  padding: $semantic-spacing-2 0; // 0.5rem vertical
}

.breadcrumb-list {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  margin: 0;
  padding: 0;
  list-style: none;
  gap: $semantic-spacing-1; // 0.25rem
}

.breadcrumb-item {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-2; // 0.5rem
  
  &:not(:last-child) {
    margin-right: $semantic-spacing-1; // 0.25rem
  }
}

.breadcrumb-link {
  font-family: $semantic-typography-font-family-sans;
  font-size: $semantic-typography-font-size-sm;
  font-weight: $semantic-typography-font-weight-normal;
  color: $semantic-color-text-secondary;
  text-decoration: none;
  line-height: $semantic-typography-line-height-normal;
  transition: color $semantic-motion-duration-fast ease;
  border-radius: $semantic-border-radius-sm;
  padding: $semantic-spacing-1 $semantic-spacing-1-5; // 0.25rem 0.375rem
  
  &:hover {
    color: $semantic-color-interactive-primary;
    background-color: $semantic-color-surface-hover;
  }
  
  &:focus-visible {
    outline: 2px solid $semantic-color-interactive-primary;
    outline-offset: 2px;
  }
  
  &:active {
    transform: scale(0.98);
  }
}

.breadcrumb-label {
  font-family: $semantic-typography-font-family-sans;
  font-size: $semantic-typography-font-size-sm;
  font-weight: $semantic-typography-font-weight-normal;
  color: $semantic-color-text-secondary;
  line-height: $semantic-typography-line-height-normal;
  padding: $semantic-spacing-1 $semantic-spacing-1-5; // 0.25rem 0.375rem
  
  &--current {
    color: $semantic-color-text-primary;
    font-weight: $semantic-typography-font-weight-medium;
  }
  
  &--disabled {
    opacity: $semantic-opacity-disabled;
    cursor: not-allowed;
  }
}

.breadcrumb-separator {
  color: $semantic-color-text-tertiary;
  font-size: $semantic-typography-font-size-xs;
  opacity: $semantic-opacity-heavy;
  margin: 0 $semantic-spacing-0-5; // 0 0.125rem
  
  svg {
    width: 12px;
    height: 12px;
  }
}

// Responsive design
@media (max-width: 768px) {
  .breadcrumb-list {
    gap: $semantic-spacing-0-5; // 0.125rem
  }
  
  .breadcrumb-item {
    gap: $semantic-spacing-1; // 0.25rem
    
    &:not(:last-child) {
      margin-right: $semantic-spacing-0-5; // 0.125rem
    }
  }
  
  .breadcrumb-link,
  .breadcrumb-label {
    font-size: $semantic-typography-font-size-xs;
    padding: $semantic-spacing-0-5 $semantic-spacing-1; // 0.125rem 0.25rem
  }
  
  .breadcrumb-separator {
    margin: 0 $semantic-spacing-0-5; // 0 0.125rem
    
    svg {
      width: 10px;
      height: 10px;
    }
  }
}gRWx;)zHtgqFbQjniF\ Omx	kimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faChevronRight } from '@fortawesome/free-solid-svg-icons';

export interface BreadcrumbItem {
  label: string;
  route?: string;
  disabled?: boolean;
}

@Component({
  selector: 'ui-breadcrumb',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <nav [class]="wrapperClasses" aria-label="breadcrumb">
      <ol class="breadcrumb-list">
        @for (item of items; track $index; let isLast = $last) {
          <li [class]="getItemClasses($index, isLast)">
            @if (!isLast && item.route && !item.disabled) {
              <a 
                class="breadcrumb-link"
                [href]="item.route"
                (click)="onItemClick($event, item, $index)"
              >
                {{ item.label }}
              </a>
            } @else {
              <span [class]="getLabelClasses(isLast, item.disabled)">
                {{ item.label }}
              </span>
            }
            
            @if (!isLast) {
              <fa-icon 
                class="breadcrumb-separator" 
                [icon]="separatorIcon"
              />
            }
          </li>
        }
      </ol>
    </nav>
  `,
  styleUrl: './breadcrumb.component.scss'
})
export class BreadcrumbComponent {
  @Input() items: BreadcrumbItem[] = [];
  @Input() separator: 'chevron' | 'slash' = 'chevron';

  @Output() itemClick = new EventEmitter<{item: BreadcrumbItem, index: number}>();

  separatorIcon = faChevronRight;

  get wrapperClasses(): string {
    return [
      'ui-breadcrumb'
    ].filter(Boolean).join(' ');
  }

  getItemClasses(index: number, isLast: boolean): string {
    return [
      'breadcrumb-item',
      isLast ? 'breadcrumb-item--current' : ''
    ].filter(Boolean).join(' ');
  }

  getLabelClasses(isLast: boolean, disabled?: boolean): string {
    return [
      'breadcrumb-label',
      isLast ? 'breadcrumb-label--current' : '',
      disabled ? 'breadcrumb-label--disabled' : ''
    ].filter(Boolean).join(' ');
  }

  onItemClick(event: Event, item: BreadcrumbItem, index: number): void {
    event.preventDefault();
    if (!item.disabled) {
      this.itemClick.emit({ item, index });
    }
  }
}c·x' export * from './breadcrumb.component';6ߺx 5export * from './appbar';
export * from './bottom-navigation';
export * from './breadcrumb';
export * from './menu';
export * from './pagination';
export * from './stepper';
export * from './tab-group';BlWx;8Agb` 3Vx7 o=U6̪-錤=@UYh)E|Z/Jȓ15#|[HxO I=sⱭcuJ(E5>i]W>VPQZ`]Ux>̞ʐX[qI15&&]x Ri@9@.]@"Qнax| export * from './menu-container.component';
export * from './menu-item.component';
export * from './menu-submenu.component';9+x$@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// MENU CONTAINER COMPONENT
// ==========================================================================
// Container component for menu items with elevation, spacing, and orientation
// Provides consistent layout and styling using semantic design tokens
// ==========================================================================

.menu-container {
  display: flex;
  width: 100%;
  box-sizing: border-box;
  background-color: $semantic-color-surface-primary;
  position: relative;
  overflow: hidden;
  
  // ==========================================================================
  // ORIENTATION
  // ==========================================================================
  
  &--vertical {
    flex-direction: column;
  }
  
  &--horizontal {
    flex-direction: row;
    align-items: center;
    flex-wrap: wrap;
  }

  // ==========================================================================
  // ELEVATION VARIANTS
  // ==========================================================================
  
  &--elevation-none {
    box-shadow: none;
  }
  
  &--elevation-sm {
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &--elevation-md {
    box-shadow: $semantic-shadow-elevation-3;
  }
  
  &--elevation-lg {
    box-shadow: $semantic-shadow-elevation-4;
  }

  // ==========================================================================
  // SPACING VARIANTS
  // ==========================================================================
  
  &--spacing-none {
    padding: 0;
    gap: 0;
  }
  
  &--spacing-xs {
    padding: $semantic-spacing-component-xs;
    gap: $semantic-spacing-component-xs;
  }
  
  &--spacing-sm {
    padding: $semantic-spacing-component-sm;
    gap: $semantic-spacing-micro-tight;
  }
  
  &--spacing-md {
    padding: $semantic-spacing-component-md;
    gap: $semantic-spacing-component-xs;
  }
  
  &--spacing-lg {
    padding: $semantic-spacing-component-lg;
    gap: $semantic-spacing-component-sm;
  }

  // ==========================================================================
  // LAYOUT MODIFIERS
  // ==========================================================================
  
  &--scrollable {
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    
    // Custom scrollbar styling
    &::-webkit-scrollbar {
      width: 6px;
    }
    
    &::-webkit-scrollbar-track {
      background: $semantic-color-surface-secondary;
      border-radius: 3px;
    }
    
    &::-webkit-scrollbar-thumb {
      background: $semantic-color-border-primary;
      border-radius: 3px;
      
      &:hover {
        background: $semantic-color-border-secondary;
      }
    }
    
    // Firefox scrollbar
    scrollbar-width: thin;
    scrollbar-color: $semantic-color-border-primary $semantic-color-surface-secondary;
  }
  
  &--max-height {
    height: var(--menu-max-height);
    max-height: var(--menu-max-height);
  }
  
  &--dense {
    &.menu-container--spacing-xs {
      padding: $semantic-spacing-micro-tight;
      gap: $semantic-spacing-micro-hairline;
    }
    
    &.menu-container--spacing-sm {
      padding: $semantic-spacing-component-xs;
      gap: $semantic-spacing-micro-tight;
    }
    
    &.menu-container--spacing-md {
      padding: $semantic-spacing-component-sm;
      gap: $semantic-spacing-micro-tight;
    }
    
    &.menu-container--spacing-lg {
      padding: $semantic-spacing-component-md;
      gap: $semantic-spacing-component-xs;
    }
  }
  
  &--rounded {
    border-radius: $semantic-border-radius-md;
    overflow: hidden;
  }

  // ==========================================================================
  // HORIZONTAL LAYOUT ADJUSTMENTS
  // ==========================================================================
  
  &--horizontal {
    .menu-item {
      flex-shrink: 0;
      
      &:not(:last-child) {
        margin-right: $semantic-spacing-component-xs;
      }
    }
    
    &.menu-container--spacing-none .menu-item:not(:last-child) {
      margin-right: 0;
    }
    
    &.menu-container--spacing-sm .menu-item:not(:last-child) {
      margin-right: $semantic-spacing-component-sm;
    }
    
    &.menu-container--spacing-md .menu-item:not(:last-child) {
      margin-right: $semantic-spacing-component-md;
    }
    
    &.menu-container--spacing-lg .menu-item:not(:last-child) {
      margin-right: $semantic-spacing-component-lg;
    }
  }
}

// ==========================================================================
// DYNAMIC HEIGHT SETUP
// ==========================================================================

.menu-container--max-height {
  --menu-max-height: 400px;
}

// ==========================================================================
// MENU DIVIDERS
// ==========================================================================

.menu-divider {
  height: 1px;
  background-color: $semantic-color-border-secondary;
  margin: $semantic-spacing-component-xs 0;
  
  .menu-container--spacing-none & {
    margin: 0;
  }
  
  .menu-container--spacing-sm & {
    margin: $semantic-spacing-component-sm $semantic-spacing-component-sm;
  }
  
  .menu-container--spacing-md & {
    margin: $semantic-spacing-component-md $semantic-spacing-component-md;
  }
  
  .menu-container--spacing-lg & {
    margin: $semantic-spacing-component-lg $semantic-spacing-component-lg;
  }
  
  .menu-container--horizontal & {
    height: auto;
    width: 1px;
    margin: 0 $semantic-spacing-component-xs;
    align-self: stretch;
  }
}

// ==========================================================================
// MENU SECTION HEADERS
// ==========================================================================

.menu-section-header {
  padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
  font-size: $semantic-typography-font-size-xs;
  font-weight: $semantic-typography-font-weight-semibold;
  text-transform: uppercase;
  letter-spacing: $semantic-typography-letter-spacing-wider;
  color: $semantic-color-text-tertiary;
  background-color: $semantic-color-surface-secondary;
  
  .menu-container--spacing-sm & {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  }
  
  .menu-container--spacing-lg & {
    padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
  }
  
  .menu-container--horizontal & {
    display: none; // Hide section headers in horizontal layout
  }
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .menu-container {
    &--horizontal {
      flex-direction: column;
      align-items: stretch;
      
      .menu-item {
        margin-right: 0;
        
        &:not(:last-child) {
          margin-bottom: $semantic-spacing-component-xs;
        }
      }
    }
    
    &--spacing-md {
      padding: $semantic-spacing-component-sm;
      gap: $semantic-spacing-component-xs;
    }
    
    &--spacing-lg {
      padding: $semantic-spacing-component-md;
      gap: $semantic-spacing-component-sm;
    }
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

.menu-container {
  &:focus-within {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 2px;
  }
}

// ==========================================================================
// SUBMENU STYLES
// ==========================================================================

.menu-submenu {
  background-color: $semantic-color-surface-elevated;
  border: $semantic-border-width-1 solid $semantic-color-border-secondary;
  border-radius: $semantic-border-radius-md;
  box-shadow: $semantic-shadow-elevation-3;
  overflow: hidden;
  // Nested submenu indentation
  .menu-item {
    padding-left: calc($semantic-spacing-component-md + $semantic-spacing-component-lg);
  }
  
  .menu-container--spacing-sm & .menu-item {
    padding-left: calc($semantic-spacing-component-sm + $semantic-spacing-component-md);
  }
  
  .menu-container--spacing-lg & .menu-item {
    padding-left: calc($semantic-spacing-component-lg + $semantic-spacing-component-xl);
  }
}

// ==========================================================================
// ANIMATION UTILITIES
// ==========================================================================

.menu-container {
  // Smooth height transitions when content changes
  transition: height $semantic-motion-duration-fast $semantic-motion-easing-ease-in-out;
}

// Menu item enter/leave animations
@keyframes menu-item-enter {
  from {
    opacity: 0;
    transform: translateY(-4px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes menu-item-leave {
  from {
    opacity: 1;
    transform: translateY(0);
  }
  to {
    opacity: 0;
    transform: translateY(-4px);
  }
}

// Add these classes via JavaScript for dynamic content
.menu-item-enter {
  animation: menu-item-enter $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
}

.menu-item-leave {
  animation: menu-item-leave $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
}F!볤xC2@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// MENU ITEM COMPONENT
// ==========================================================================
// Comprehensive menu item component with multiple variants and sizes
// Uses semantic design tokens for consistent styling across the design system
// ==========================================================================

.menu-item {
  display: flex;
  flex-direction: row;  // Changed from column to row
  align-items: center;  // Add this to vertically center content
  width: 100%;
  box-sizing: border-box;
  position: relative;
  user-select: none;
  background-color: $semantic-color-surface-primary;
  color: $semantic-color-text-primary;
  cursor: pointer;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease-in-out;
  border-radius: $semantic-border-radius-sm;
  


  &:hover:not(.menu-item--disabled) {
    background-color: $semantic-color-surface-interactive;
  }
  
  &:focus-within:not(.menu-item--disabled) {
//   outline: 2px solid $semantic-color-border-focus;
 //   outline-offset: 2px;
  }
  
  // States
  &--active {
    background-color: $semantic-color-container-primary;
    color: $semantic-color-on-container-primary;
    
    &:hover {
      background-color: $semantic-color-container-primary;
      opacity: 0.9;
    }
  }
  
  &--disabled {
    opacity: 0.6;
    cursor: not-allowed;
    color: $semantic-color-text-disabled;
    
    &:hover {
      background-color: $semantic-color-surface-primary;
    }
  }

  // ==========================================================================
  // SIZE VARIANTS
  // ==========================================================================
  
  &--sm {
    min-height: 36px;
    
    &.menu-item--dense {
      min-height: 32px;
    }
  }
  
  &--md {
    min-height: 48px;
    
    &.menu-item--dense {
      min-height: 40px;
    }
  }
  
  &--lg {
    min-height: 56px;
    
    &.menu-item--dense {
      min-height: 48px;
    }
  }

  // ==========================================================================
  // VARIANT STYLES
  // ==========================================================================
  
  &--primary {
    color: $semantic-color-interactive-primary;
    
    &.menu-item--active {
      background-color: $semantic-color-container-primary;
      color: $semantic-color-on-container-primary;
    }
    
    &:hover:not(.menu-item--disabled):not(.menu-item--active) {
      background-color: $semantic-color-surface-hover;
    }
  }
  
  &--secondary {
    color: $semantic-color-interactive-secondary;
    
    &.menu-item--active {
      background-color: $semantic-color-container-secondary;
      color: $semantic-color-on-container-secondary;
    }
    
    &:hover:not(.menu-item--disabled):not(.menu-item--active) {
      background-color: $semantic-color-surface-hover;
    }
  }
  
  &--danger {
    color: $semantic-color-danger;
    
    &.menu-item--active {
      background-color: $semantic-color-container-error;
      color: $semantic-color-on-container-error;
    }
    
    &:hover:not(.menu-item--disabled):not(.menu-item--active) {
      background-color: $semantic-color-surface-hover;
    }
  }

  // ==========================================================================
  // LAYOUT MODIFIERS 
  // ==========================================================================
  
  &--indent {
    margin-left: $semantic-spacing-component-md;
  }
  
  &--with-divider {
    margin-bottom: $semantic-spacing-component-xs;
  }
}

// ==========================================================================
// MENU ITEM LINK
// ==========================================================================

.menu-item__link {
  display: flex;
  align-items: center;
  width: 100%;
  height: 100%;
  text-decoration: none;
  color: inherit;
  padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
  
  .menu-item--sm & {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  }
  
  .menu-item--lg & {
    padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
  }
  
  &:focus {
    outline: none;
  }
}

// ==========================================================================
// MENU ITEM CONTENT (when no link)
// ==========================================================================

.menu-item:not(:has(.menu-item__link)) {
  padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
  
  &.menu-item--sm {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
  }
  
  &.menu-item--lg {
    padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
  }
}

// FontAwesome icon content wrapper
.menu-item:not(:has(.menu-item__link)) ng-container {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  width: 100%;
  height: 100%;
  min-height: inherit;
}

// ==========================================================================
// ICON STYLES
// ==========================================================================

.menu-item__icon {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: $semantic-color-text-secondary;

  &--left {
    margin-right: $semantic-spacing-component-md;
    align-self: center;
  }
  
  &--right {
    margin-left: auto; // Push right icons to the end
    align-self: center;
  }
  
  &--circle {
    border-radius: 50%;
    background-color: $semantic-color-surface-elevated;
    border: 1px solid $semantic-color-border-secondary;
    
    .menu-item--sm & {
      width: 28px;
      height: 28px;
    }
    
    .menu-item--md & {
      width: 32px;
      height: 32px;
    }
    
    .menu-item--lg & {
      width: 36px;
      height: 36px;
    }
  }
  
  i {
    .menu-item--sm & { font-size: 14px; }
    .menu-item--md & { font-size: 16px; }
    .menu-item--lg & { font-size: 18px; }
    
    .menu-item__icon--circle & {
      .menu-item--sm & { font-size: $semantic-typography-font-size-xs; }
      .menu-item--md & { font-size: $semantic-typography-font-size-sm; }
      .menu-item--lg & { font-size: $semantic-typography-font-size-md; }
    }
  }
  
  // Variant specific icon colors
  .menu-item--primary & {
    color: $semantic-color-interactive-primary;
  }
  
  .menu-item--secondary & {
    color: $semantic-color-interactive-secondary;
  }
  
  .menu-item--danger & {
    color: $semantic-color-danger;
  }
  
  // Custom emoji-based icon mappings using ::before pseudo-elements
  // These apply to the <i> element when it has these specific classes
  &.icon-dashboard::before { content: '📊'; }
  &.icon-chart::before { content: '📈'; }
  &.icon-projects::before { content: '📁'; }
  &.icon-team::before { content: '👥'; }
  &.icon-documents::before { content: '📄'; }
  &.icon-demo::before { content: '🎨'; }
  &.icon-button::before { content: '🔘'; }
  &.icon-badge::before { content: '🏷️'; }
  &.icon-avatar::before { content: '👤'; }
  &.icon-table::before { content: '📊'; }
  &.icon-appbar::before { content: '📱'; }
  &.icon-home::before { content: '🏠'; }
  &.icon-settings::before { content: '⚙️'; }
  &.icon-help::before { content: '❓'; }
  &.icon-overview::before { content: '👁️'; }
  &.icon-reports::before { content: '📋'; }
  &.icon-insights::before { content: '💡'; }
  &.icon-members::before { content: '👤'; }
  &.icon-roles::before { content: '🏷️'; }
  &.icon-chevron-left::before { content: '‹'; }
  &.icon-chevron-double-left::before { content: '«'; }
  &.icon-chevron-right::before { content: '›'; }
  
  // FontAwesome component support
  fa-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: currentColor;
    
    .menu-item--sm & { 
      font-size: 14px; 
      width: 14px;
      height: 14px;
    }
    .menu-item--md & { 
      font-size: 16px;
      width: 16px; 
      height: 16px;
    }
    .menu-item--lg & { 
      font-size: 18px;
      width: 18px;
      height: 18px;
    }
    
    .menu-item__icon--circle & {
      .menu-item--sm & { 
        font-size: 12px;
        width: 12px;
        height: 12px;
      }
      .menu-item--md & { 
        font-size: 14px;
        width: 14px;
        height: 14px;
      }
      .menu-item--lg & { 
        font-size: 16px;
        width: 16px;
        height: 16px;
      }
    }
  }
}

// ==========================================================================
// CONTENT AREA
// ==========================================================================

.menu-item__content {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: $semantic-spacing-component-sm;
  width: 100%;
}

.menu-item__label {
  font-weight: 500;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  
  .menu-item--sm & {
    font-size: $semantic-typography-font-size-sm;
  }
  
  .menu-item--md & {
    font-size: $semantic-typography-font-size-md;
  }
  
  .menu-item--lg & {
    font-size: $semantic-typography-font-size-lg;
  }
}

.menu-item__badge {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  margin-left: auto; /* Push badge to the right */
  background-color: $semantic-color-interactive-primary;
  color: $semantic-color-on-brand-primary;
  border-radius: $semantic-border-radius-full;
  font-size: $semantic-typography-font-size-xs;
  font-weight: 600;
  line-height: 1;
  
  .menu-item--sm & {
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    font-size: $semantic-typography-font-size-xs;
  }
  
  .menu-item--lg & {
    min-width: 24px;
    height: 24px;
    padding: 0 8px;
    font-size: $semantic-typography-font-size-sm;
  }
}

// ==========================================================================
// SUBMENU CARET
// ==========================================================================

.menu-item__caret {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-left: $semantic-spacing-component-sm;
  color: $semantic-color-text-tertiary;
  transition: transform $semantic-motion-duration-normal $semantic-motion-easing-ease-in-out;
  
  i {
    .menu-item--sm & { font-size: $semantic-typography-font-size-xs; }
    .menu-item--md & { font-size: $semantic-typography-font-size-sm; }
    .menu-item--lg & { font-size: $semantic-typography-font-size-md; }
  }
  
  fa-icon {
    .menu-item--sm & { font-size: $semantic-typography-font-size-xs; }
    .menu-item--md & { font-size: $semantic-typography-font-size-sm; }
    .menu-item--lg & { font-size: $semantic-typography-font-size-md; }
  }
  
  .menu-item--has-submenu.menu-item--active & {
    transform: rotate(90deg);
  }
}

// ==========================================================================
// DIVIDER
// ==========================================================================

.menu-item__divider {
  position: absolute;
  bottom: 0;
  left: $semantic-spacing-component-md;
  right: $semantic-spacing-component-md;
  height: 1px;
  background-color: $semantic-color-border-secondary;
  
  .menu-item--sm & {
    left: $semantic-spacing-component-sm;
    right: $semantic-spacing-component-sm;
  }
  
  .menu-item--lg & {
    left: $semantic-spacing-component-lg;
    right: $semantic-spacing-component-lg;
  }
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .menu-item {
    &--lg {
      min-height: 48px;
      
      &.menu-item--dense {
        min-height: 40px;
      }
    }
  }
  
  .menu-item__content {
    padding-left: $semantic-spacing-component-sm;
    padding-right: $semantic-spacing-component-sm;
  }
}

// ==========================================================================
// ACCESSIBILITY ENHANCEMENTS
// ==========================================================================

.menu-item {
  &:focus-visible {
    outline: 2px solid $semantic-color-border-focus;
    outline-offset: 2px;
  }
}

// High contrast mode support
@media (prefers-contrast: high) {
  .menu-item {
    border: 1px solid transparent;
    
    &:hover:not(.menu-item--disabled) {
      border-color: $semantic-color-border-primary;
    }
    
    &--active {
      border-color: $semantic-color-interactive-primary;
    }
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .menu-item,
  .menu-item__caret {
    transition: none;
  }
}bQx;'egqFbQjniFi# Y+o xۓ'e<SEfE>i 2r%xXdI	CONTAINER^ntainer component for menu items with elevation, spacing, and orientation
// Provides consistent layout and styling using semanAVB)S5overflow: hidden;
  S// ORIENTATIONYBvertical {
    flex-direction: column;
  }
  
  &--horizontal {
  _flex-wrap: wrap;
  }
S// ELEVATIONbelevation-none {
    box-shadow: none;
  }
  
  &--elevation-sm {
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &--elevation-md {
    box-shadow: $semantic-shadow-elevation-3;
  }
  
  &--elevation-lg {
    box-shadow: $semantic-shadow-elevation-4;
  }
S
// SPACINGc@pacing-none {
    padding: 0;
    gap: 0;
  }
  
  &--spacing-xs,xs;
    gapn  
  &--spacing-sm,sm;
    gap#micro-tight;
  }
  
  &--spacing-md._gapn  
  &--spacing/  gap,S|Yscrollable {
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    
    // Custom scrollbar styling
    &::-webkit-scrollbar {
      width: 61 -&::-webkit-scrollbar-track {
      background!secondary;
      border-radius: 31 .&::-webkit-scrollbar-thumb {
      background:O1?  border-radius: 3px;
      
      &:hover {
        backgroundp,&Q    }
    }
    
    // Firefox scrollbar
    scrollbar-width: thin;
    scrollba/1'&--max-height {
    height: var(--menu-max-height);
    max-height: var(--menu-max-height);
  }
  
  &--dense {
    &.menu-container--spacing-xs {
  micro-tight;
      gap@micro-hairline;
    }
    
    &.menu-container--spacing-sm {
  )xs;
      gap=micro-tight;
    }
    
    &.menu-container--spacing-md {
  )sm;
      gap=micro-tight;
    }
    
    &.menu-container--spacing-lg {
  +_  gapsq
rounded {
  %)md;
    overflow: hidden;
  }
S// HORIZONTAL LAYOUT ADJUSTME\"horizontal {
    .menu-item {
    '$    
      &:not(:last-child) {
    /.xs;
      }
    }
    
    &.menu-container--spacing-none .menu-item:not(:last-child) {
      margin-right: 0;
    }
    
    &<.menu-container--spacing-sm .menu-item:not(:last-child) {
  /.Psm;
    }
    
    &.menu-container--spacing-md .menu-item:not(:last-child) {
  /6H}
    
    &.menu-container--spacing-lg .menu-item:not(:last-child) {
  /.  }q-YDYNAMIC HEIGHT SETUPAV2container--max-height {
  --menu-max-height: 400pxV@DIVIDER@W	divider {N,Hmarginns 0;
  
  .menu-container--spacing-none & {
    margin: 0;
  }
  
  .menu-container--spacing-sm & {
    margin,$container--spacing-md & {
    margin=1}
  
  .menu-container--spacing-lg & {
    marginlg*O.menu-container--horizontal & {
    height: auto;
    width: 1px;
    margin: 0xs;
    align-self: stretchp-Z@SECTION HEADER@Wsection-header {
'%b)*%#>weight-semibold;
  text-transform: uppercase;
  letter-spacing#letter-spacing-wider1 
tertiary;
Q,+secondary;
  
  .menu-container--spacing-smq.72container--spacingn]_.menu-container--horizontal & {
    display: none; // Hide section headers in horizontal layoutq-container {
    &--horizontal {
      flex-direction: column;
      align-items: stretch;
      
      .menu-item {
        mar:gin-right: 0;
        
        &:not(:last-child) {
      >51      }
      }
    }
    
    &--spacing-md {
  )sm;
      gap$s;
    }
    
    &--spacing-lg {
  +_  gap	sm;
    }q-Y/pcontainer {
  &:focus-within-0[|-N';\
submenu {
Q,,elevated;
  border: $semantic-border-width-1@0m%'md;
  box-shadow: $semantic-shadow-elevation-3;
  overflow: hidden;
  // Nested submenu indentation
  .menu-item {
    padding-left: calc(A +N);
  }
  
  .menu-container--spacing-sm & .menu-item {
    padding-left: calc(, +Pmd);
  }
  
  .menu-container--spacing-lg & .menu-item {
    padding-left: calc(Qlg +xl)p-ZANIMATION UTILITI?XTcontainer {
  // Smooth height transitions when content changes
  transition: height~E}

// Menu item enter/leave animations
@keyframes menu-item-enter {
  from {
    opacity: 0;
    transform: translateY(-4px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes menu-item-leave {
  from {
    opacity: 1;
    transform: translateY(0);
  }
  to {
    opacity: 0;
    transform: translateY(-4px);
  }
}

// Add these classes via JavaScript for ?dynamic content
.menu-item-enter {
  animation: menu-item-enter~=7out;
}

.menu-item-leave {
  animation: menu-item-leave~=out;
}.uvYxjimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
import { faChevronRight } from '@fortawesome/free-solid-svg-icons';

export type MenuItemSize = 'sm' | 'md' | 'lg';
export type MenuItemIconPosition = 'left' | 'right';
export type MenuItemVariant = 'default' | 'primary' | 'secondary' | 'danger';

export interface MenuItemData {
  id?: string;
  label: string;
  icon?: any; // FontAwesome icon definition
  iconCircle?: boolean;
  disabled?: boolean;
  active?: boolean;
  hasSubmenu?: boolean;
  badge?: string | number;
  href?: string;
  target?: string;
}

@Component({
  selector: 'ui-menu-item',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, FaIconComponent],
  template: `
    <div 
      class="menu-item"
      [class]="getItemClasses()"
      [attr.aria-disabled]="data.disabled"
      [attr.aria-selected]="data.active"
      [attr.role]="data.href ? 'none' : 'menuitem'"
      (click)="handleClick($event)"
      (keydown.enter)="handleClick($event)"
      (keydown.space)="handleClick($event)"
      [tabindex]="data.disabled ? -1 : 0"
    >
      @if (data.href && !data.disabled) {
        <a 
          [href]="data.href"
          [target]="data.target || '_self'"
          class="menu-item__link"
          [attr.aria-label]="data.label"
        >
          <ng-container [ngTemplateOutlet]="itemContent"></ng-container>
        </a>
      } @else {
        <ng-container [ngTemplateOutlet]="itemContent"></ng-container>
      }

      <!-- Menu item content template -->
      <ng-template #itemContent>
        <!-- Left icon -->
        @if (data.icon && iconPosition === 'left') {
          <div class="menu-item__icon menu-item__icon--left" [class.menu-item__icon--circle]="data.iconCircle">
            <fa-icon [icon]="data.icon"></fa-icon>
          </div>
        }

        <!-- Label content -->
        <div class="menu-item__content">
          <span class="menu-item__label">{{ data.label }}</span>
          
          @if (data.badge) {
            <span class="menu-item__badge">{{ data.badge }}</span>
          }
        </div>

        <!-- Right content (icon or submenu caret) -->
        @if (data.icon && iconPosition === 'right') {
          <div class="menu-item__icon menu-item__icon--right" [class.menu-item__icon--circle]="data.iconCircle">
            <fa-icon [icon]="data.icon"></fa-icon>
          </div>
        } @else if (data.hasSubmenu) {
          <div class="menu-item__caret">
            <fa-icon [icon]="faChevronRight"></fa-icon>
          </div>
        }
      </ng-template>

      <!-- Bottom border -->
      @if (showDivider) {
        <div class="menu-item__divider"></div>
      }
    </div>
  `,
  styleUrls: ['./menu-item.component.scss']
})
export class MenuItemComponent {
  @Input() data!: MenuItemData;
  @Input() size: MenuItemSize = 'md';
  @Input() variant: MenuItemVariant = 'default';
  @Input() iconPosition: MenuItemIconPosition = 'left';
  @Input() showDivider = false;
  @Input() indent = false;
  @Input() dense = false;

  @Output() itemClick = new EventEmitter<MenuItemData>();
  @Output() submenuToggle = new EventEmitter<MenuItemData>();

  // FontAwesome icons
  faChevronRight = faChevronRight;

  getItemClasses(): string {
    const classes = [
      `menu-item--${this.size}`,
      `menu-item--${this.variant}`
    ];

    if (this.dense) classes.push('menu-item--dense');
    if (this.indent) classes.push('menu-item--indent');
    if (this.data.disabled) classes.push('menu-item--disabled');
    if (this.data.active) classes.push('menu-item--active');
    if (this.data.hasSubmenu) classes.push('menu-item--has-submenu');
    if (this.showDivider) classes.push('menu-item--with-divider');

    return classes.join(' ');
  }

  handleClick(event: Event): void {
    if (this.data.disabled) {
      event.preventDefault();
      return;
    }

    if (this.data.hasSubmenu) {
      event.preventDefault();
      this.submenuToggle.emit(this.data);
    } else if (!this.data.href) {
      this.itemClick.emit(this.data);
    }
  }
}?,xy@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

// ==========================================================================
// MENU SUBMENU COMPONENT
// ==========================================================================
// Collapsible submenu component with smooth animations
// ==========================================================================

.submenu-wrapper {
  display: flex;
  flex-direction: column;
  width: 100%;
  position: relative;
  
  // Ensure parent menu item doesn't interfere with submenu hover states
  > ui-menu-item {
    position: relative;
    z-index: 1;
  }
}

.submenu-content {
  overflow: hidden;
  transition: max-height $semantic-motion-duration-slow $semantic-motion-easing-ease-in-out, opacity $semantic-motion-duration-normal $semantic-motion-easing-ease-in-out;
  // Apply indentation to the entire submenu content block
  margin-left: calc($semantic-spacing-component-lg + $semantic-spacing-component-sm);
  // Fix z-index and positioning to prevent hover state conflicts
  position: relative;
  z-index: 1;
  
  .menu-submenu {
    //border-left: 2px solid $semantic-color-border-secondary;
    border-radius: 0;
    background-color: $semantic-color-surface-elevated;
    box-shadow: none;
    position: relative;
    z-index: 2;
  }
}

// ==========================================================================
// ANIMATION STATES
// ==========================================================================

.submenu-wrapper--open {
  .submenu-content {
    max-height: 1000px; // Large enough to accommodate content
    opacity: 1;
  }
}

.submenu-wrapper:not(.submenu-wrapper--open) {
  .submenu-content {
    max-height: 0;
    opacity: 0;
  }
}

// ==========================================================================
// NESTED SUBMENU STYLING
// ==========================================================================

.submenu-content {
  .menu-item {
    position: relative;
    // Ensure submenu items have proper stacking context
    z-index: 3;
    // Clear any potential interaction with parent items
    pointer-events: auto;
    
    &::before {
      content: '';
      position: absolute;
      left: -2px;
      top: 50%;
      width: 8px;
      height: 1px;
      background-color: $semantic-color-border-secondary;
      transform: translateY(-50%);
    }
  }
}

// Force vertical layout for all submenus
.menu-submenu {
  // Override any inherited horizontal layout
  .menu-container {
    flex-direction: column !important;
    align-items: stretch !important;
    flex-wrap: nowrap !important;
  }
  
  // Ensure menu items stack vertically and take full width
  .menu-item {
    width: 100% !important;
    margin-right: 0 !important;
    margin-bottom: 0;
    // Create isolated interaction area to prevent hover conflicts
    isolation: isolate;
    
    &:not(:last-child) {
      margin-bottom: 0 !important;
    }
    
    // Ensure hover states don't bleed to adjacent items
    &:hover {
      z-index: 4;
    }
  }
}

// ==========================================================================
// RESPONSIVE ADJUSTMENTS
// ==========================================================================

@media (max-width: 768px) {
  .submenu-content {
    margin-left: calc($semantic-spacing-component-md + $semantic-spacing-component-sm);
  }
}

// ==========================================================================
// REDUCED MOTION SUPPORT
// ==========================================================================

@media (prefers-reduced-motion: reduce) {
  .submenu-content {
    transition: none;
  }
}&}eBx)IfgqFbQjniF@> WW'x) 1A8#(5E4sssS4'W\y;L]"KxX xpimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MenuItemComponent, MenuItemData } from './menu-item.component';
import { MenuContainerComponent } from './menu-container.component';

@Component({
  selector: 'ui-menu-submenu',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, MenuItemComponent, MenuContainerComponent],
  template: `
    <div class="submenu-wrapper" [class.submenu-wrapper--open]="isOpen">
      <!-- Parent menu item -->
      <ui-menu-item 
        [data]="parentItem"
        [size]="size"
        [variant]="variant"
        [iconPosition]="iconPosition"
        [showDivider]="showDivider"
        [indent]="indent"
        [dense]="dense"
        (submenuToggle)="toggleSubmenu($event)"
        (itemClick)="onParentClick($event)"
      />
      
      <!-- Submenu content -->
      @if (isOpen) {
        <div class="submenu-content">
          <ui-menu-container 
            [elevation]="submenuElevation"
            [spacing]="submenuSpacing"
            [rounded]="false"
            [dense]="dense"
            class="menu-submenu"
          >
            <ng-content></ng-content>
          </ui-menu-container>
        </div>
      }
    </div>
  `,
  styleUrls: ['./menu-submenu.component.scss'],
  animations: []
})
export class MenuSubmenuComponent implements OnInit, OnChanges {
  @Input() parentItem!: MenuItemData;
  @Input() size: 'sm' | 'md' | 'lg' = 'md';
  @Input() variant: 'default' | 'primary' | 'secondary' | 'danger' = 'default';
  @Input() iconPosition: 'left' | 'right' = 'left';
  @Input() showDivider = false;
  @Input() indent = false;
  @Input() dense = false;
  @Input() isOpen = false;
  @Input() submenuElevation: 'none' | 'sm' | 'md' | 'lg' = 'none';
  @Input() submenuSpacing: 'none' | 'xs' | 'sm' | 'md' | 'lg' = 'xs';

  @Output() submenuToggled = new EventEmitter<{ item: MenuItemData; isOpen: boolean }>();
  @Output() parentItemClick = new EventEmitter<MenuItemData>();

  constructor(private cdr: ChangeDetectorRef) {}

  ngOnInit(): void {
    // Initialize parent item active state based on submenu open state
    this.updateParentItemState();
  }

  ngOnChanges(changes: SimpleChanges): void {
    // Update parent item state when isOpen input changes
    if (changes['isOpen']) {
      this.updateParentItemState();
    }
  }

  toggleSubmenu(item: MenuItemData): void {
    this.isOpen = !this.isOpen;
    this.updateParentItemState();
    this.submenuToggled.emit({ item, isOpen: this.isOpen });
  }

  private updateParentItemState(): void {
    // Create a new object reference to trigger change detection
    this.parentItem = {
      ...this.parentItem,
      active: this.isOpen
    };
  }

  onParentClick(item: MenuItemData): void {
    this.parentItemClick.emit(item);
  }
}6x/8ccmLOpO岞l 
}x E:1JݬJ19q(c1Y3x' export * from './pagination.component';{xt@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-pagination {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: $semantic-spacing-2 0;
  
  &--left {
    justify-content: flex-start;
  }
  
  &--right {
    justify-content: flex-end;
  }
  
  &--sm {
    padding: $semantic-spacing-1 0;
    
    .pagination-list {
      gap: $semantic-spacing-1;
    }
    
    .pagination-item {
      min-width: $semantic-sizing-button-height-sm;
      height: $semantic-sizing-button-height-sm;
      font-size: $semantic-typography-font-size-xs;
    }
  }
  
  &--md {
    .pagination-list {
      gap: $semantic-spacing-1-5;
    }
    
    .pagination-item {
      min-width: $semantic-sizing-button-height-md;
      height: $semantic-sizing-button-height-md;
      font-size: $semantic-typography-font-size-sm;
    }
  }
  
  &--lg {
    padding: $semantic-spacing-3 0;
    
    .pagination-list {
      gap: $semantic-spacing-2;
    }
    
    .pagination-item {
      min-width: $semantic-sizing-button-height-lg;
      height: $semantic-sizing-button-height-lg;
      font-size: $semantic-typography-font-size-md;
    }
  }
}

.pagination-list {
  display: flex;
  align-items: center;
  margin: 0;
  padding: 0;
  list-style: none;
  gap: $semantic-spacing-1-5;
}

.pagination-item {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: $semantic-sizing-button-height-md;
  height: $semantic-sizing-button-height-md;
  border-radius: $semantic-border-radius-md;
  font-family: $semantic-typography-font-family-sans;
  font-size: $semantic-typography-font-size-sm;
  font-weight: $semantic-typography-font-weight-medium;
  line-height: $semantic-typography-line-height-none;
  text-decoration: none;
  cursor: pointer;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  user-select: none;
  
  // Default state
  background: $semantic-color-surface-primary;
  border: $semantic-border-width-1 solid $semantic-color-border-primary;
  color: $semantic-color-text-primary;
  
  &:hover:not(.pagination-item--disabled):not(.pagination-item--current) {
    background: $semantic-color-surface-hover;
    border-color: $semantic-color-border-focus;
    transform: translateY(-1px);
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &:focus-visible {
    outline: 2px solid $semantic-color-interactive-primary;
    outline-offset: 2px;
  }
  
  &:active:not(.pagination-item--disabled):not(.pagination-item--current) {
    transform: translateY(0);
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  // Current page state
  &--current {
    background: $semantic-color-interactive-primary;
    border-color: $semantic-color-interactive-primary;
    color: $semantic-color-on-primary;
    cursor: default;
    
    &:hover {
      background: $semantic-color-interactive-primary;
      border-color: $semantic-color-interactive-primary;
      transform: none;
    }
  }
  
  // Disabled state
  &--disabled {
    opacity: $semantic-opacity-disabled;
    cursor: not-allowed;
    pointer-events: none;
  }
  
  // Ellipsis state
  &--ellipsis {
    cursor: default;
    pointer-events: none;
    border: none;
    background: transparent;
    color: $semantic-color-text-tertiary;
    font-weight: $semantic-typography-font-weight-normal;
  }
  
  // Navigation buttons (prev/next)
  &--nav {
    padding: 0 $semantic-spacing-2;
    min-width: auto;
    gap: $semantic-spacing-1;
    
    &:hover:not(.pagination-item--disabled) {
      color: $semantic-color-interactive-primary;
    }
  }
  
  // Icon sizing
  fa-icon {
    font-size: inherit;
  }
}

.pagination-info {
  display: flex;
  align-items: center;
  margin-left: $semantic-spacing-4;
  font-family: $semantic-typography-font-family-sans;
  font-size: $semantic-typography-font-size-sm;
  color: $semantic-color-text-secondary;
  white-space: nowrap;
  
  &--sm {
    margin-left: $semantic-spacing-2;
    font-size: $semantic-typography-font-size-xs;
  }
  
  &--lg {
    margin-left: $semantic-spacing-6;
    font-size: $semantic-typography-font-size-md;
  }
}

// Compact variant
.ui-pagination--compact {
  .pagination-list {
    gap: $semantic-spacing-1;
  }
  
  .pagination-item {
    min-width: $semantic-sizing-button-height-sm;
    height: $semantic-sizing-button-height-sm;
    font-size: $semantic-typography-font-size-xs;
    border-radius: $semantic-border-radius-sm;
    
    &--nav {
      padding: 0 $semantic-spacing-1-5;
    }
  }
  
  .pagination-info {
    margin-left: $semantic-spacing-2;
    font-size: $semantic-typography-font-size-xs;
  }
}

// Responsive design
@media (max-width: 768px) {
  .ui-pagination {
    padding: $semantic-spacing-1 0;
    
    .pagination-list {
      gap: $semantic-spacing-1;
    }
    
    .pagination-item {
      min-width: $semantic-sizing-button-height-sm;
      height: $semantic-sizing-button-height-sm;
      font-size: $semantic-typography-font-size-xs;
      
      &--nav {
        padding: 0 $semantic-spacing-1-5;
        gap: $semantic-spacing-0-5;
      }
    }
    
    .pagination-info {
      margin-left: $semantic-spacing-2;
      font-size: $semantic-typography-font-size-xs;
      
      // Hide detailed info on very small screens
      @media (max-width: 480px) {
        display: none;
      }
    }
  }
  
  // Show only essential pages on mobile
  .pagination-item--hide-mobile {
    display: none;
  }
}

// Dark mode support will be added in future versionsWxnў YX[Q#Y IJximport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, computed, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faChevronLeft, faChevronRight, faEllipsisH } from '@fortawesome/free-solid-svg-icons';

export interface PageChangeEvent {
  page: number;
  previousPage: number;
}

type PaginationSize = 'sm' | 'md' | 'lg';
type PaginationAlignment = 'left' | 'center' | 'right';

@Component({
  selector: 'ui-pagination',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <nav [class]="wrapperClasses()" [attr.aria-label]="ariaLabel">
      <ul class="pagination-list" role="list">
        <!-- Previous Button -->
        <li>
          <button
            type="button"
            [class]="getItemClasses(false, false, !hasPrevious())"
            [disabled]="!hasPrevious()"
            [attr.aria-label]="previousAriaLabel"
            (click)="goToPrevious()"
          >
            <fa-icon [icon]="prevIcon" />
            @if (showLabels) {
              <span>{{ previousLabel }}</span>
            }
          </button>
        </li>

        <!-- Page Numbers -->
        @for (page of visiblePages(); track page.value) {
          <li>
            @if (page.type === 'page') {
              <button
                type="button"
                [class]="getItemClasses(page.value === currentPage(), false, false)"
                [attr.aria-label]="getPageAriaLabel(page.value)"
                [attr.aria-current]="page.value === currentPage() ? 'page' : null"
                (click)="goToPage(page.value)"
              >
                {{ page.display }}
              </button>
            } @else {
              <span [class]="getItemClasses(false, true, false)" aria-hidden="true">
                <fa-icon [icon]="ellipsisIcon" />
              </span>
            }
          </li>
        }

        <!-- Next Button -->
        <li>
          <button
            type="button"
            [class]="getItemClasses(false, false, !hasNext())"
            [disabled]="!hasNext()"
            [attr.aria-label]="nextAriaLabel"
            (click)="goToNext()"
          >
            @if (showLabels) {
              <span>{{ nextLabel }}</span>
            }
            <fa-icon [icon]="nextIcon" />
          </button>
        </li>
      </ul>

      <!-- Page Info -->
      @if (showInfo) {
        <div [class]="getInfoClasses()">
          {{ getInfoText() }}
        </div>
      }
    </nav>
  `,
  styleUrl: './pagination.component.scss'
})
export class PaginationComponent {
  @Input() currentPage = signal(1);
  @Input() totalPages = signal(1);
  @Input() totalItems?: number;
  @Input() itemsPerPage?: number;
  @Input() size: PaginationSize = 'md';
  @Input() alignment: PaginationAlignment = 'center';
  @Input() compact = false;
  @Input() showInfo = true;
  @Input() showLabels = false;
  @Input() maxVisible = 7;
  @Input() ariaLabel = 'Pagination navigation';
  @Input() previousLabel = 'Previous';
  @Input() nextLabel = 'Next';
  @Input() previousAriaLabel = 'Go to previous page';
  @Input() nextAriaLabel = 'Go to next page';
  @Input() disabled = false;

  @Output() pageChange = new EventEmitter<PageChangeEvent>();

  // Icons
  prevIcon = faChevronLeft;
  nextIcon = faChevronRight;
  ellipsisIcon = faEllipsisH;

  // Computed properties using signals
  hasPrevious = computed(() => this.currentPage() > 1 && !this.disabled);
  hasNext = computed(() => this.currentPage() < this.totalPages() && !this.disabled);

  visiblePages = computed(() => {
    const current = this.currentPage();
    const total = this.totalPages();
    const max = this.maxVisible;

    if (total <= max) {
      // Show all pages if total is within max visible
      return Array.from({ length: total }, (_, i) => ({
        value: i + 1,
        display: (i + 1).toString(),
        type: 'page' as const
      }));
    }

    const pages: Array<{ value: number; display: string; type: 'page' | 'ellipsis' }> = [];
    const sidePages = Math.floor((max - 3) / 2); // Reserve space for first, last, and ellipses

    // Always show first page
    pages.push({ value: 1, display: '1', type: 'page' });

    if (current <= sidePages + 2) {
      // Current is near the beginning
      for (let i = 2; i <= Math.min(max - 1, total - 1); i++) {
        pages.push({ value: i, display: i.toString(), type: 'page' });
      }
      if (total > max - 1) {
        pages.push({ value: -1, display: '...', type: 'ellipsis' });
      }
    } else if (current >= total - sidePages - 1) {
      // Current is near the end
      if (total > max - 1) {
        pages.push({ value: -1, display: '...', type: 'ellipsis' });
      }
      for (let i = Math.max(total - max + 2, 2); i <= total - 1; i++) {
        pages.push({ value: i, display: i.toString(), type: 'page' });
      }
    } else {
      // Current is in the middle
      pages.push({ value: -1, display: '...', type: 'ellipsis' });
      const start = Math.max(2, current - sidePages);
      const end = Math.min(total - 1, current + sidePages);
      for (let i = start; i <= end; i++) {
        pages.push({ value: i, display: i.toString(), type: 'page' });
      }
      pages.push({ value: -2, display: '...', type: 'ellipsis' });
    }

    // Always show last page if more than 1 page
    if (total > 1) {
      pages.push({ value: total, display: total.toString(), type: 'page' });
    }

    return pages;
  });

  wrapperClasses = computed(() => {
    return [
      'ui-pagination',
      `ui-pagination--${this.size}`,
      `ui-pagination--${this.alignment}`,
      this.compact ? 'ui-pagination--compact' : '',
      this.disabled ? 'ui-pagination--disabled' : ''
    ].filter(Boolean).join(' ');
  });

  getItemClasses(isCurrent: boolean, isEllipsis: boolean, isDisabled: boolean): string {
    return [
      'pagination-item',
      isCurrent ? 'pagination-item--current' : '',
      isEllipsis ? 'pagination-item--ellipsis' : '',
      isDisabled ? 'pagination-item--disabled' : '',
      !isCurrent && !isEllipsis ? 'pagination-item--nav' : ''
    ].filter(Boolean).join(' ');
  }

  getInfoClasses(): string {
    return [
      'pagination-info',
      `pagination-info--${this.size}`
    ].filter(Boolean).join(' ');
  }

  getPageAriaLabel(page: number): string {
    return page === this.currentPage() 
      ? `Page ${page}, current page`
      : `Go to page ${page}`;
  }

  getInfoText(): string {
    const current = this.currentPage();
    const total = this.totalPages();
    
    if (this.totalItems && this.itemsPerPage) {
      const startItem = (current - 1) * this.itemsPerPage + 1;
      const endItem = Math.min(current * this.itemsPerPage, this.totalItems);
      return `${startItem}–${endItem} of ${this.totalItems} items`;
    }
    
    return `Page ${current} of ${total}`;
  }

  goToPage(page: number): void {
    if (page !== this.currentPage() && page >= 1 && page <= this.totalPages() && !this.disabled) {
      const previousPage = this.currentPage();
      this.currentPage.set(page);
      this.pageChange.emit({ page, previousPage });
    }
  }

  goToPrevious(): void {
    if (this.hasPrevious()) {
      this.goToPage(this.currentPage() - 1);
    }
  }

  goToNext(): void {
    if (this.hasNext()) {
      this.goToPage(this.currentPage() + 1);
    }
  }

  // Public methods for programmatic navigation
  first(): void {
    this.goToPage(1);
  }

  last(): void {
    this.goToPage(this.totalPages());
  }
}x$ export * from './stepper.component';˼x\ @use "../../../../../../ui-design-system/src/styles/semantic" as *;

.ui-stepper {
  display: flex;
  width: 100%;
  position: relative;
  
  // Layout variants
  &--horizontal {
    flex-direction: row;
    align-items: center;
  }
  
  &--vertical {
    flex-direction: column;
    align-items: flex-start;
  }
}

.ui-stepper__step {
  display: flex;
  position: relative;
  
  .ui-stepper--horizontal & {
    flex-direction: column;
    align-items: center;
    flex: 1;
    
    &:not(:last-child) {
      margin-right: $semantic-spacing-component-lg;
    }
  }
  
  .ui-stepper--vertical & {
    flex-direction: row;
    align-items: flex-start;
    width: 100%;
    
    &:not(:last-child) {
      margin-bottom: $semantic-spacing-component-xl;
    }
  }
}

.ui-stepper__step-header {
  display: flex;
  align-items: center;
  cursor: pointer;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  border-radius: $semantic-border-radius-md;
  
  .ui-stepper--horizontal & {
    flex-direction: column;
    text-align: center;
    padding: $semantic-spacing-component-sm;
  }
  
  .ui-stepper--vertical & {
    flex-direction: row;
    padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  &:hover:not(.ui-stepper__step-header--disabled) {
    background: $semantic-color-surface-secondary;
  }
  
  &:focus-visible {
    outline: 2px solid $semantic-color-brand-primary;
    outline-offset: 2px;
  }
  
  &--disabled {
    cursor: not-allowed;
    opacity: $semantic-opacity-disabled;
  }
}

.ui-stepper__step-indicator {
  display: flex;
  align-items: center;
  justify-content: center;
  width: $semantic-sizing-touch-target;
  height: $semantic-sizing-touch-target;
  border-radius: $semantic-border-radius-full;
  border: $semantic-border-width-2 solid $semantic-color-border-primary;
  background: $semantic-color-surface-primary;
  color: $semantic-color-text-secondary;
  font-weight: $semantic-typography-font-weight-semibold;
  font-size: $semantic-typography-font-size-sm;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  position: relative;
  flex-shrink: 0;
  
  .ui-stepper--horizontal & {
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  .ui-stepper--vertical & {
    margin-right: $semantic-spacing-component-md;
  }
  
  // Step states
  &--pending {
    border-color: $semantic-color-border-primary;
    background: $semantic-color-surface-primary;
    color: $semantic-color-text-secondary;
  }
  
  &--current {
    border-color: $semantic-color-brand-primary;
    background: $semantic-color-brand-primary;
    color: $semantic-color-on-brand-primary;
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &--completed {
    border-color: $semantic-color-success;
    background: $semantic-color-success;
    color: $semantic-color-on-success;
  }
  
  &--error {
    border-color: $semantic-color-danger;
    background: $semantic-color-danger;
    color: $semantic-color-on-danger;
  }
  
  &--disabled {
    border-color: $semantic-color-border-primary;
    background: $semantic-color-surface-disabled;
    color: $semantic-color-text-disabled;
  }
}

.ui-stepper__step-content {
  display: flex;
  flex-direction: column;
  
  .ui-stepper--horizontal & {
    align-items: center;
    text-align: center;
  }
  
  .ui-stepper--vertical & {
    align-items: flex-start;
    flex: 1;
  }
}

.ui-stepper__step-title {
  font-family: map-get($semantic-typography-body-medium, font-family);
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-weight: $semantic-typography-font-weight-semibold;
  line-height: map-get($semantic-typography-body-medium, line-height);
  color: $semantic-color-text-primary;
  margin: 0;
  
  .ui-stepper__step-header--disabled & {
    color: $semantic-color-text-disabled;
  }
}

.ui-stepper__step-description {
  font-family: map-get($semantic-typography-body-small, font-family);
  font-size: map-get($semantic-typography-body-small, font-size);
  font-weight: map-get($semantic-typography-body-small, font-weight);
  line-height: map-get($semantic-typography-body-small, line-height);
  color: $semantic-color-text-secondary;
  margin: $semantic-spacing-content-line-tight 0 0 0;
  
  .ui-stepper__step-header--disabled & {
    color: $semantic-color-text-disabled;
  }
}

.ui-stepper__connector {
  position: absolute;
  background: $semantic-color-border-primary;
  transition: background-color $semantic-motion-duration-fast $semantic-motion-easing-ease;
  
  .ui-stepper--horizontal & {
    top: calc(#{$semantic-sizing-touch-target / 2} + #{$semantic-spacing-component-sm} - 1px);
    left: calc(#{$semantic-sizing-touch-target / 2} + #{$semantic-spacing-component-sm} + #{$semantic-sizing-touch-target / 2} + #{$semantic-sizing-touch-target * 2} - 13px);
    right: calc(-#{$semantic-spacing-component-lg} - #{$semantic-spacing-component-sm} + #{$semantic-sizing-touch-target / 2});
    height: 2px;
    transform: none;
  }
  
  .ui-stepper--vertical & {
    left: calc(#{$semantic-sizing-touch-target / 2} + #{$semantic-spacing-component-sm} + #{$semantic-spacing-component-sm} - 2px);
    top: calc(#{$semantic-sizing-touch-target} + #{$semantic-spacing-component-sm} + 2px);
    height: calc(100% - 2px);
    width: 2px;
  }
  
  &--completed {
    background: $semantic-color-success;
  }
  
  &--error {
    background: $semantic-color-danger;
  }
  
  &--incoming {
    .ui-stepper--horizontal & {
      left: -16px;
      width: calc(#{$semantic-sizing-touch-target / 2} + #{$semantic-spacing-component-sm} + 4px + #{$semantic-sizing-touch-target} + 20px);
    }
    
    .ui-stepper--vertical & {
      top: calc(-#{$semantic-spacing-component-xl} + #{$semantic-spacing-component-sm});
      height: calc(#{$semantic-spacing-component-xl} - #{$semantic-spacing-component-sm * 2} - 4px);
    }
  }
}

// Size variants
.ui-stepper--sm {
  .ui-stepper__step-indicator {
    width: $semantic-sizing-button-height-sm;
    height: $semantic-sizing-button-height-sm;
    font-size: $semantic-typography-font-size-xs;
  }
  
  .ui-stepper__step-title {
    font-size: map-get($semantic-typography-body-small, font-size);
  }
  
  .ui-stepper__step-description {
    font-size: $semantic-typography-font-size-xs;
  }
}

.ui-stepper--lg {
  .ui-stepper__step-indicator {
    width: $semantic-sizing-button-height-lg;
    height: $semantic-sizing-button-height-lg;
    font-size: $semantic-typography-font-size-md;
  }
  
  .ui-stepper__step-title {
    font-size: map-get($semantic-typography-body-large, font-size);
    font-weight: map-get($semantic-typography-body-large, font-weight);
  }
}

// Alternative visual style
.ui-stepper--outlined {
  .ui-stepper__step-indicator {
    &--current {
      background: $semantic-color-surface-primary;
      color: $semantic-color-brand-primary;
      border-color: $semantic-color-brand-primary;
      border-width: 3px;
    }
  }
}

// Dense variant for compact layouts  
.ui-stepper--dense {
  .ui-stepper__step {
    .ui-stepper--horizontal & {
      &:not(:last-child) {
        margin-right: $semantic-spacing-component-md;
      }
    }
    
    .ui-stepper--vertical & {
      &:not(:last-child) {
        margin-bottom: $semantic-spacing-component-lg;
      }
    }
  }
  
  .ui-stepper__step-header {
    padding: $semantic-spacing-component-xs;
  }
  
  .ui-stepper__step-indicator {
    .ui-stepper--vertical & {
      margin-right: $semantic-spacing-component-sm;
    }
  }
}

// Responsive design
@media (max-width: 768px) {
  .ui-stepper--horizontal {
    .ui-stepper__step {
      &:not(:last-child) {
        margin-right: $semantic-spacing-component-sm;
      }
    }
    
    .ui-stepper__step-description {
      display: none;
    }
    
    .ui-stepper__step-title {
      font-size: map-get($semantic-typography-body-small, font-size);
    }
  }
  
  .ui-stepper__step-indicator {
    width: $semantic-sizing-button-height-sm;
    height: $semantic-sizing-button-height-sm;
    font-size: $semantic-typography-font-size-xs;
  }
}

@media (max-width: 480px) {
  .ui-stepper--horizontal {
    .ui-stepper__step-title {
      font-size: $semantic-typography-font-size-xs;
    }
  }
}ļjxpagqFbQjniF Wx import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faCheck, faTimes } from '@fortawesome/free-solid-svg-icons';

export interface StepperStep {
  id: string;
  title: string;
  description?: string;
  completed?: boolean;
  current?: boolean;
  error?: boolean;
  disabled?: boolean;
  optional?: boolean;
}

export type StepperOrientation = 'horizontal' | 'vertical';
export type StepperSize = 'sm' | 'md' | 'lg';
export type StepperVariant = 'default' | 'outlined';

@Component({
  selector: 'ui-stepper',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div [class]="getStepperClasses()">
      @for (step of steps; track step.id; let i = $index; let isLast = $last) {
        <div class="ui-stepper__step">
          <div 
            [class]="getStepHeaderClasses(step)"
            [attr.role]="clickable ? 'button' : 'presentation'"
            [attr.tabindex]="getTabIndex(step)"
            [attr.aria-current]="step.current ? 'step' : null"
            [attr.aria-disabled]="step.disabled"
            (click)="onStepClick(step, i)"
            (keydown)="onStepKeydown($event, step, i)">
            
            <div [class]="getStepIndicatorClasses(step)">
              @if (step.completed && !step.error) {
                <fa-icon [icon]="checkIcon" />
              } @else if (step.error) {
                <fa-icon [icon]="errorIcon" />
              } @else {
                {{ i + 1 }}
              }
            </div>
            
            <div class="ui-stepper__step-content">
              <h4 class="ui-stepper__step-title">{{ step.title }}</h4>
              @if (step.description) {
                <p class="ui-stepper__step-description">{{ step.description }}</p>
              }
            </div>
          </div>
          
          @if (!isLast) {
            <div [class]="getConnectorClasses(step, steps[i + 1]) + ' ui-stepper__connector--outgoing'"></div>
          }
          @if (i > 0) {
            <div [class]="getConnectorClasses(steps[i - 1], step) + ' ui-stepper__connector--incoming'"></div>
          }
        </div>
      }
    </div>
  `,
  styleUrl: './stepper.component.scss'
})
export class StepperComponent {
  @Input() steps: StepperStep[] = [];
  @Input() orientation: StepperOrientation = 'horizontal';
  @Input() size: StepperSize = 'md';
  @Input() variant: StepperVariant = 'default';
  @Input() dense = false;
  @Input() clickable = false;
  @Input() linear = true;
  
  @Output() stepClick = new EventEmitter<{step: StepperStep, index: number}>();
  @Output() stepChange = new EventEmitter<{step: StepperStep, index: number}>();
  
  checkIcon = faCheck;
  errorIcon = faTimes;
  
  getStepperClasses(): string {
    return [
      'ui-stepper',
      `ui-stepper--${this.orientation}`,
      `ui-stepper--${this.size}`,
      this.variant === 'outlined' ? 'ui-stepper--outlined' : '',
      this.dense ? 'ui-stepper--dense' : ''
    ].filter(Boolean).join(' ');
  }
  
  getStepHeaderClasses(step: StepperStep): string {
    return [
      'ui-stepper__step-header',
      step.disabled ? 'ui-stepper__step-header--disabled' : ''
    ].filter(Boolean).join(' ');
  }
  
  getStepIndicatorClasses(step: StepperStep): string {
    let state = 'pending';
    
    if (step.disabled) {
      state = 'disabled';
    } else if (step.error) {
      state = 'error';
    } else if (step.completed) {
      state = 'completed';
    } else if (step.current) {
      state = 'current';
    }
    
    return [
      'ui-stepper__step-indicator',
      `ui-stepper__step-indicator--${state}`
    ].filter(Boolean).join(' ');
  }
  
  getConnectorClasses(currentStep: StepperStep, nextStep: StepperStep): string {
    let state = 'default';
    
    if (currentStep.error) {
      state = 'error';
    } else if (currentStep.completed && !nextStep.error) {
      state = 'completed';
    }
    
    return [
      'ui-stepper__connector',
      state !== 'default' ? `ui-stepper__connector--${state}` : ''
    ].filter(Boolean).join(' ');
  }
  
  getTabIndex(step: StepperStep): number {
    if (!this.clickable || step.disabled) {
      return -1;
    }
    
    if (this.linear) {
      // In linear mode, only allow interaction with current step and completed steps
      return step.current || step.completed ? 0 : -1;
    }
    
    return 0;
  }
  
  onStepClick(step: StepperStep, index: number): void {
    if (!this.clickable || step.disabled) {
      return;
    }
    
    if (this.linear && !step.current && !step.completed) {
      // In linear mode, don't allow clicking on future steps
      return;
    }
    
    this.stepClick.emit({ step, index });
    
    if (!step.current) {
      this.updateCurrentStep(index);
      this.stepChange.emit({ step, index });
    }
  }
  
  onStepKeydown(event: KeyboardEvent, step: StepperStep, index: number): void {
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault();
      this.onStepClick(step, index);
    }
    
    // Arrow navigation
    if (this.clickable && ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {
      event.preventDefault();
      this.handleArrowNavigation(event.key, index);
    }
  }
  
  private handleArrowNavigation(key: string, currentIndex: number): void {
    const isHorizontal = this.orientation === 'horizontal';
    const isForward = (isHorizontal && key === 'ArrowRight') || (!isHorizontal && key === 'ArrowDown');
    const isBackward = (isHorizontal && key === 'ArrowLeft') || (!isHorizontal && key === 'ArrowUp');
    
    if (!isForward && !isBackward) return;
    
    const direction = isForward ? 1 : -1;
    let targetIndex = currentIndex + direction;
    
    // Find next available step
    while (targetIndex >= 0 && targetIndex < this.steps.length) {
      const targetStep = this.steps[targetIndex];
      
      if (!targetStep.disabled && this.getTabIndex(targetStep) >= 0) {
        this.focusStep(targetIndex);
        break;
      }
      
      targetIndex += direction;
    }
  }
  
  private focusStep(index: number): void {
    // This would require ViewChild to focus the element
    // For now, emit an event that parent can handle
    const step = this.steps[index];
    if (step) {
      this.stepClick.emit({ step, index });
    }
  }
  
  private updateCurrentStep(newCurrentIndex: number): void {
    this.steps.forEach((step, index) => {
      step.current = index === newCurrentIndex;
    });
  }
  
  // Public methods for programmatic control
  public goToStep(index: number): void {
    if (index >= 0 && index < this.steps.length) {
      const step = this.steps[index];
      if (!step.disabled && (!this.linear || step.completed || step.current || index === 0)) {
        this.updateCurrentStep(index);
        this.stepChange.emit({ step, index });
      }
    }
  }
  
  public markStepCompleted(index: number, completed = true): void {
    if (index >= 0 && index < this.steps.length) {
      this.steps[index].completed = completed;
      this.steps[index].error = false; // Clear error when marking completed
    }
  }
  
  public markStepError(index: number, error = true): void {
    if (index >= 0 && index < this.steps.length) {
      this.steps[index].error = error;
      if (error) {
        this.steps[index].completed = false; // Clear completed when marking error
      }
    }
  }
  
  public nextStep(): void {
    const currentIndex = this.steps.findIndex(step => step.current);
    if (currentIndex >= 0 && currentIndex < this.steps.length - 1) {
      // Mark current step as completed if not already
      if (!this.steps[currentIndex].completed && !this.steps[currentIndex].error) {
        this.markStepCompleted(currentIndex);
      }
      
      this.goToStep(currentIndex + 1);
    }
  }
  
  public previousStep(): void {
    const currentIndex = this.steps.findIndex(step => step.current);
    if (currentIndex > 0) {
      this.goToStep(currentIndex - 1);
    }
  }
  
  public resetStepper(): void {
    this.steps.forEach((step, index) => {
      step.current = index === 0;
      step.completed = false;
      step.error = false;
    });
  }
}cC
x& export * from './tab-group.component';Yx#@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

.ui-tab-group {
  display: flex;
  flex-direction: column;
  width: 100%;
  
  &--full-width .tab-list {
    width: 100%;
    
    .tab-button {
      flex: 1;
    }
  }
}

.tab-list {
  display: flex;
  align-items: center;
  position: relative;
  
  // Line variant (default)
  .ui-tab-group--line & {
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-primary;
    gap: 0;
  }
  
  // Pills variant
  .ui-tab-group--pills & {
    background-color: $semantic-color-surface-elevated;
    padding: $semantic-spacing-1; // 0.25rem
    border-radius: $semantic-border-radius-lg;
    gap: $semantic-spacing-1; // 0.25rem
  }
  
  // Cards variant
  .ui-tab-group--cards & {
    gap: $semantic-spacing-1; // 0.25rem
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-primary;
  }
}

.tab-button {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-2; // 0.5rem
  border: none;
  background: transparent;
  cursor: pointer;
  font-family: $semantic-typography-font-family-sans;
  font-weight: $semantic-typography-font-weight-medium;
  color: $semantic-color-text-secondary;
  transition: all $semantic-motion-duration-normal $semantic-motion-easing-ease-out;
  position: relative;
  outline: none;
  
  // Size variants
  .ui-tab-group--small & {
    padding: $semantic-spacing-2 $semantic-spacing-3; // 0.5rem 0.75rem
    font-size: $semantic-typography-font-size-sm;
    line-height: $semantic-typography-line-height-tight;
    min-height: $semantic-spacing-8; // 2rem
  }
  
  .ui-tab-group--medium & {
    padding: $semantic-spacing-3 $semantic-spacing-4; // 0.75rem 1rem
    font-size: $semantic-typography-font-size-md;
    line-height: $semantic-typography-line-height-normal;
    min-height: $semantic-spacing-10; // 2.5rem
  }
  
  .ui-tab-group--large & {
    padding: $semantic-spacing-4 $semantic-spacing-6; // 1rem 1.5rem
    font-size: $semantic-typography-font-size-lg;
    line-height: $semantic-typography-line-height-normal;
    min-height: $semantic-spacing-12; // 3rem
  }
  
  // Line variant styling
  .ui-tab-group--line & {
    border-radius: 0;
    margin-bottom: -1px;
    
    &::after {
      content: '';
      position: absolute;
      bottom: 0;
      left: 0;
      right: 0;
      height: 2px;
      background-color: transparent;
      transition: background-color $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
    
    &:hover:not(:disabled) {
      color: $semantic-color-interactive-primary;
      background-color: $semantic-color-surface-hover;
    }
    
    &--active {
      color: $semantic-color-interactive-primary;
      
      &::after {
        background-color: $semantic-color-interactive-primary;
      }
    }
  }
  
  // Pills variant styling
  .ui-tab-group--pills & {
    border-radius: $semantic-border-radius-md;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-surface-hover;
      color: $semantic-color-text-primary;
    }
    
    &--active {
      background-color: $semantic-color-surface-primary;
      color: $semantic-color-interactive-primary;
      box-shadow: $semantic-shadow-button-hover;
    }
  }
  
  // Cards variant styling
  .ui-tab-group--cards & {
    border: $semantic-border-width-1 solid transparent;
    border-radius: $semantic-border-radius-md $semantic-border-radius-md 0 0;
    margin-bottom: -1px;
    
    &:hover:not(:disabled) {
      background-color: $semantic-color-surface-hover;
      color: $semantic-color-text-primary;
    }
    
    &--active {
      background-color: $semantic-color-surface-primary;
      color: $semantic-color-interactive-primary;
      border-color: $semantic-color-border-primary;
      border-bottom-color: $semantic-color-surface-primary;
    }
  }
  
  // Focus state
  &:focus-visible {
    outline: 2px solid $semantic-color-interactive-primary;
    outline-offset: 2px;
  }
  
  // Disabled state
  &:disabled,
  &--disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
  }
}

.tab-icon {
  flex-shrink: 0;
  
  .ui-tab-group--small & {
    font-size: $semantic-typography-font-size-xs;
  }
  
  .ui-tab-group--medium & {
    font-size: $semantic-typography-font-size-sm;
  }
  
  .ui-tab-group--large & {
    font-size: $semantic-typography-font-size-md;
  }
}

.tab-label {
  white-space: nowrap;
  user-select: none;
}

.tab-badge {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: $semantic-spacing-5; // 1.25rem
  height: $semantic-spacing-5; // 1.25rem
  background-color: $semantic-color-interactive-primary;
  color: $semantic-color-on-brand-primary;
  border-radius: $semantic-border-radius-full;
  font-size: $semantic-typography-font-size-xs;
  font-weight: $semantic-typography-font-weight-semibold;
  line-height: 1;
  padding: 0 $semantic-spacing-1; // 0 0.25rem
  
  .ui-tab-group--small & {
    min-width: $semantic-spacing-4; // 1rem
    height: $semantic-spacing-4; // 1rem
    font-size: $semantic-typography-font-size-xs;
  }
  
  .ui-tab-group--large & {
    min-width: $semantic-spacing-6; // 1.5rem
    height: $semantic-spacing-6; // 1.5rem
    font-size: $semantic-typography-font-size-sm;
  }
}

.tab-panels {
  padding-top: $semantic-spacing-4; // 1rem
  
  .ui-tab-group--pills & {
    padding-top: $semantic-spacing-6; // 1.5rem
  }
}

// Responsive design
@media (max-width: 768px) {
  .tab-list {
    overflow-x: auto;
    scrollbar-width: none;
    -ms-overflow-style: none;
    
    &::-webkit-scrollbar {
      display: none;
    }
  }
  
  .tab-button {
    white-space: nowrap;
    flex-shrink: 0;
    
    .ui-tab-group--small & {
      padding: $semantic-spacing-1-5 $semantic-spacing-2-5; // 0.375rem 0.625rem
    }
    
    .ui-tab-group--medium & {
      padding: $semantic-spacing-2 $semantic-spacing-3; // 0.5rem 0.75rem
    }
    
    .ui-tab-group--large & {
      padding: $semantic-spacing-3 $semantic-spacing-4; // 0.75rem 1rem
    }
  }
}T\jxUgqFbQjniF- V米x1import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';

export interface TabItem {
  id: string;
  label: string;
  icon?: IconDefinition;
  disabled?: boolean;
  badge?: string | number;
}

export type TabVariant = 'line' | 'pills' | 'cards';
export type TabSize = 'small' | 'medium' | 'large';

@Component({
  selector: 'ui-tab-group',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div [class]="wrapperClasses">
      <div class="tab-list" role="tablist">
        @for (tab of tabs; track tab.id) {
          <button
            type="button"
            [id]="'tab-' + tab.id"
            role="tab"
            [class]="getTabClasses(tab)"
            [attr.aria-selected]="activeTabId() === tab.id"
            [attr.aria-controls]="'panel-' + tab.id"
            [disabled]="tab.disabled"
            (click)="selectTab(tab.id)"
          >
            @if (tab.icon) {
              <fa-icon class="tab-icon" [icon]="tab.icon" />
            }
            <span class="tab-label">{{ tab.label }}</span>
            @if (tab.badge) {
              <span class="tab-badge">{{ tab.badge }}</span>
            }
          </button>
        }
      </div>
      
      <div class="tab-panels">
        <ng-content></ng-content>
      </div>
    </div>
  `,
  styleUrl: './tab-group.component.scss'
})
export class TabGroupComponent {
  @Input() tabs: TabItem[] = [];
  @Input() variant: TabVariant = 'line';
  @Input() size: TabSize = 'medium';
  @Input() fullWidth: boolean = false;

  @Output() tabChange = new EventEmitter<string>();

  activeTabId = signal<string>('');

  ngOnInit(): void {
    // Set the first non-disabled tab as active by default
    if (this.tabs.length > 0 && !this.activeTabId()) {
      const firstEnabledTab = this.tabs.find(tab => !tab.disabled);
      if (firstEnabledTab) {
        this.activeTabId.set(firstEnabledTab.id);
      }
    }
  }

  get wrapperClasses(): string {
    return [
      'ui-tab-group',
      `ui-tab-group--${this.variant}`,
      `ui-tab-group--${this.size}`,
      this.fullWidth ? 'ui-tab-group--full-width' : ''
    ].filter(Boolean).join(' ');
  }

  getTabClasses(tab: TabItem): string {
    return [
      'tab-button',
      this.activeTabId() === tab.id ? 'tab-button--active' : '',
      tab.disabled ? 'tab-button--disabled' : ''
    ].filter(Boolean).join(' ');
  }

  selectTab(tabId: string): void {
    const tab = this.tabs.find(t => t.id === tabId);
    if (tab && !tab.disabled) {
      this.activeTabId.set(tabId);
      this.tabChange.emit(tabId);
    }
  }
}h?x9gstring |fB  closeable?: boolean%@if (isIconDefinition(tab.icon)) {
  I  } @else {
    icon" [innerHTML]="tab.icon">05
  isIconDefinition(icon: string | IconDefinition): icon is IconDefinition {
    return typeof icon === 'object' && icon !== null && 'iconName' in icon;
  }
}f#2x  M)%/jpr}2>qM;D7xl@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-backdrop {
  // Core Structure
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: var(--backdrop-z-index, 1000);
  
  // Visual Design
  background: rgba(0, 0, 0, 0.5);
  opacity: 0;
  
  // Transitions
  transition: opacity $semantic-motion-duration-normal $semantic-motion-easing-ease;
  
  // Pointer Events
  pointer-events: none;
  
  // Backdrop Variants
  &--default {
    background: rgba(0, 0, 0, 0.5);
  }
  
  &--blur {
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
  }
  
  &--dark {
    background: rgba(0, 0, 0, 0.6);
  }
  
  &--light {
    background: rgba(255, 255, 255, 0.6);
  }
  
  // State Variants
  &--visible {
    pointer-events: auto;
    opacity: var(--backdrop-opacity, 0.5);
  }
  
  &--clickable {
    cursor: pointer;
    
    &:hover {
      opacity: calc(var(--backdrop-opacity, 0.5) + 0.05);
    }
    
    &:active {
      opacity: calc(var(--backdrop-opacity, 0.5) + 0.1);
    }
  }
  
  // Animation States
  &--entering {
    opacity: 0;
    animation: backdrop-fade-in $semantic-motion-duration-normal $semantic-motion-easing-ease forwards;
  }
  
  &--leaving {
    opacity: var(--backdrop-opacity, 0.5);
    animation: backdrop-fade-out $semantic-motion-duration-normal $semantic-motion-easing-ease forwards;
  }
  
  // Content Positioning
  &__content {
    position: relative;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: $semantic-spacing-layout-md;
  }
  
  // Dark Mode Support
  :host-context(.dark-theme) & {
    &--default {
      background: rgba(0, 0, 0, 0.7);
    }
    
    &--light {
      background: rgba(255, 255, 255, 0.1);
    }
  }
  
  // High Contrast Mode
  @media (prefers-contrast: high) {
    &--default {
      background: rgba(0, 0, 0, 0.8);
    }
    
    &--light {
      background: rgba(255, 255, 255, 0.8);
    }
  }
  
  // Reduced Motion Support
  @media (prefers-reduced-motion: reduce) {
    transition: none;
    animation: none;
    
    &--entering,
    &--leaving {
      animation: none;
    }
  }
  
  // Responsive Design
  @media (max-width: 768px - 1) {
    &__content {
      padding: $semantic-spacing-layout-sm;
    }
  }
  
  @media (max-width: 576px - 1) {
    &__content {
      padding: $semantic-spacing-layout-xs;
    }
  }
}

// Keyframe Animations
@keyframes backdrop-fade-in {
  from {
    opacity: 0;
  }
  
  to {
    opacity: var(--backdrop-opacity, 0.5);
  }
}

@keyframes backdrop-fade-out {
  from {
    opacity: var(--backdrop-opacity, 0.5);
  }
  
  to {
    opacity: 0;
  }
}

// Z-index Management Utilities
.ui-backdrop {
  // Common z-index levels
  &--z-index-modal {
    z-index: 1050;
  }
  
  &--z-index-drawer {
    z-index: 1040;
  }
  
  &--z-index-popover {
    z-index: 1030;
  }
  
  &--z-index-tooltip {
    z-index: 1020;
  }
}e!x,#>A8#(5E4sF67 Gаx,Oimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, OnInit, OnDestroy, inject, ElementRef, HostListener } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faXmark } from '@fortawesome/free-solid-svg-icons';
import { signal, computed } from '@angular/core';

type DrawerSize = 'sm' | 'md' | 'lg' | 'xl';
type DrawerPosition = 'left' | 'right' | 'top' | 'bottom';
type FooterAlignment = 'start' | 'center' | 'end' | 'between';

export interface DrawerConfig {
  size?: DrawerSize;
  position?: DrawerPosition;
  closable?: boolean;
  backdropClosable?: boolean;
  escapeClosable?: boolean;
  showHeader?: boolean;
  showFooter?: boolean;
  headerBorder?: boolean;
  footerBorder?: boolean;
  bodyPadding?: boolean;
  bodyScrollable?: boolean;
  footerAlignment?: FooterAlignment;
  preventBodyScroll?: boolean;
  focusTrap?: boolean;
  persistent?: boolean;
}

@Component({
  selector: 'ui-drawer',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.Default,
  encapsulation: ViewEncapsulation.None,
  template: `
    @if (isVisible()) {
      <div 
        class="ui-drawer"
        [class.ui-drawer--{{size}}]="size"
        [class.ui-drawer--{{position}}]="position"
        [class.ui-drawer--loading]="loading"
        [class.ui-drawer--persistent]="persistent"
        role="dialog"
        [attr.aria-modal]="!persistent"
        [attr.aria-labelledby]="titleId"
        [attr.aria-describedby]="contentId"
        (keydown)="handleKeydown($event)"
      >
        <!-- Drawer Backdrop -->
        @if (!persistent) {
          <div 
            class="ui-drawer__backdrop"
            [class.ui-drawer__backdrop--visible]="isVisible()"
            [class.ui-drawer__backdrop--entering]="isEntering()"
            [class.ui-drawer__backdrop--leaving]="isLeaving()"
            (click)="handleBackdropClick($event)"
          ></div>
        }
        
        <!-- Drawer Container -->
        <div 
          class="ui-drawer__container"
          [class.ui-drawer__container--visible]="isVisible()"
          [class.ui-drawer__container--entering]="isEntering()"
          [class.ui-drawer__container--leaving]="isLeaving()"
          (click)="$event.stopPropagation()"
          #drawerContainer
        >
          <!-- Drawer Header -->
          @if (showHeader) {
            <div 
              class="ui-drawer__header"
              [class.ui-drawer__header--no-border]="!headerBorder"
            >
              <h2 
                class="ui-drawer__title" 
                [id]="titleId"
              >
                @if (title) {
                  {{ title }}
                } @else {
                  <ng-content select="[slot='title']"></ng-content>
                }
              </h2>
              
              @if (closable) {
                <button 
                  type="button"
                  class="ui-drawer__close-button"
                  (click)="close()"
                  [attr.aria-label]="closeAriaLabel"
                  #closeButton
                >
                  <fa-icon [icon]="faXmark"></fa-icon>
                </button>
              }
            </div>
          }

          <!-- Drawer Body -->
          <div 
            class="ui-drawer__body"
            [class.ui-drawer__body--no-padding]="!bodyPadding"
            [class.ui-drawer__body--scrollable]="bodyScrollable"
            [id]="contentId"
          >
            @if (loading) {
              <div class="ui-drawer__loader" role="status" aria-label="Loading"></div>
            } @else {
              <div class="ui-drawer__content">
                <ng-content></ng-content>
              </div>
            }
          </div>

          <!-- Drawer Footer -->
          @if (showFooter) {
            <div 
              class="ui-drawer__footer"
              [class.ui-drawer__footer--no-border]="!footerBorder"
              [class.ui-drawer__footer--start]="footerAlignment === 'start'"
              [class.ui-drawer__footer--center]="footerAlignment === 'center'"
              [class.ui-drawer__footer--between]="footerAlignment === 'between'"
            >
              <ng-content select="[slot='footer']"></ng-content>
            </div>
          }
        </div>
      </div>
    }
  `,
  styleUrl: './drawer.component.scss'
})
export class DrawerComponent implements OnInit, OnDestroy {
  // Dependencies
  private elementRef = inject(ElementRef);

  // Icons
  readonly faXmark = faXmark;

  // Inputs
  @Input() size: DrawerSize = 'md';
  @Input() position: DrawerPosition = 'left';
  @Input() title = '';
  @Input() loading = false;
  @Input() closable = true;
  @Input() backdropClosable = true;
  @Input() escapeClosable = true;
  @Input() showHeader = true;
  @Input() showFooter = false;
  @Input() headerBorder = true;
  @Input() footerBorder = true;
  @Input() bodyPadding = true;
  @Input() bodyScrollable = true;
  @Input() footerAlignment: FooterAlignment = 'end';
  @Input() preventBodyScroll = true;
  @Input() focusTrap = true;
  @Input() persistent = false;
  @Input() closeAriaLabel = 'Close drawer';

  // State Inputs
  @Input() set open(value: boolean) {
    if (value !== this._open()) {
      if (value) {
        this.show();
      } else {
        this.hide();
      }
    }
  }

  get open(): boolean {
    return this._open();
  }

  // Outputs
  @Output() openChange = new EventEmitter<boolean>();
  @Output() opened = new EventEmitter<void>();
  @Output() closed = new EventEmitter<void>();
  @Output() backdropClicked = new EventEmitter<void>();
  @Output() escapePressed = new EventEmitter<void>();

  // Internal state signals
  private _open = signal(false);
  private _entering = signal(false);
  private _leaving = signal(false);

  // Computed signals
  readonly isVisible = computed(() => this._open() || this._entering() || this._leaving());
  readonly isEntering = computed(() => this._entering());
  readonly isLeaving = computed(() => this._leaving());

  // Internal properties
  private originalBodyOverflow = '';
  private originalBodyPaddingRight = '';
  private focusableElements: HTMLElement[] = [];
  private previousActiveElement: Element | null = null;
  private currentFocusIndex = 0;

  // Unique IDs for accessibility
  readonly titleId = `drawer-title-${Math.random().toString(36).substr(2, 9)}`;
  readonly contentId = `drawer-content-${Math.random().toString(36).substr(2, 9)}`;

  ngOnInit(): void {
    if (this.open) {
      this.show();
    }
  }

  ngOnDestroy(): void {
    this.restoreBodyScroll();
    this.restoreFocus();
  }

  /**
   * Shows the drawer with animation
   */
  show(): void {
    if (this._open()) return;

    if (this.preventBodyScroll && !this.persistent) {
      this.preventBodyScrollAction();
    }
    this.storePreviousFocus();
    
    this._open.set(true);
    this._entering.set(true);
    this.openChange.emit(true);

    // Animation timing
    setTimeout(() => {
      this._entering.set(false);
      this.setupFocusTrap();
      this.opened.emit();
    }, 300);
  }

  /**
   * Hides the drawer with animation
   */
  hide(): void {
    if (!this._open()) return;

    this._leaving.set(true);

    // Animation timing
    setTimeout(() => {
      this._open.set(false);
      this._leaving.set(false);
      this.restoreBodyScroll();
      this.restoreFocus();
      this.openChange.emit(false);
      this.closed.emit();
    }, 300);
  }

  /**
   * Toggles the drawer open/closed state
   */
  toggle(): void {
    if (this.open) {
      this.close();
    } else {
      this.open = true;
    }
  }

  /**
   * Closes the drawer
   */
  close(): void {
    this.open = false;
  }

  /**
   * Handles backdrop click events
   */
  handleBackdropClick(event: MouseEvent): void {
    event.stopPropagation();
    this.backdropClicked.emit();
    
    if (this.backdropClosable && !this.persistent) {
      this.close();
    }
  }

  /**
   * Handles keyboard events for accessibility
   */
  @HostListener('keydown', ['$event'])
  handleKeydown(event: KeyboardEvent): void {
    if (event.key === 'Escape' && this.escapeClosable) {
      event.preventDefault();
      this.escapePressed.emit();
      this.close();
    }

    if (this.focusTrap && this.isVisible()) {
      this.handleFocusTrap(event);
    }
  }

  /**
   * Prevents body scrolling by manipulating body styles
   */
  private preventBodyScrollAction(): void {
    const body = document.body;
    this.originalBodyOverflow = body.style.overflow;
    this.originalBodyPaddingRight = body.style.paddingRight;

    // Calculate scrollbar width to prevent layout shift
    const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
    
    body.style.overflow = 'hidden';
    if (scrollbarWidth > 0) {
      body.style.paddingRight = `${scrollbarWidth}px`;
    }
  }

  /**
   * Restores body scrolling
   */
  private restoreBodyScroll(): void {
    const body = document.body;
    body.style.overflow = this.originalBodyOverflow;
    body.style.paddingRight = this.originalBodyPaddingRight;
  }

  /**
   * Stores the currently focused element before showing drawer
   */
  private storePreviousFocus(): void {
    this.previousActiveElement = document.activeElement;
  }

  /**
   * Restores focus to the previously focused element
   */
  private restoreFocus(): void {
    if (this.previousActiveElement && this.previousActiveElement instanceof HTMLElement) {
      setTimeout(() => {
        if (this.previousActiveElement instanceof HTMLElement) {
          this.previousActiveElement.focus();
        }
        this.previousActiveElement = null;
      }, 100);
    }
  }

  /**
   * Sets up focus trap for accessibility
   */
  private setupFocusTrap(): void {
    if (!this.focusTrap) return;

    const drawerElement = this.elementRef.nativeElement.querySelector('.ui-drawer__container');
    if (drawerElement) {
      this.focusableElements = this.getFocusableElements(drawerElement);
      if (this.focusableElements.length > 0) {
        this.focusableElements[0].focus();
        this.currentFocusIndex = 0;
      }
    }
  }

  /**
   * Gets all focusable elements within the drawer
   */
  private getFocusableElements(container: Element): HTMLElement[] {
    const focusableSelectors = [
      'button:not([disabled])',
      'input:not([disabled])',
      'textarea:not([disabled])',
      'select:not([disabled])',
      'a[href]',
      '[tabindex]:not([tabindex="-1"])',
      '[contenteditable="true"]'
    ];

    return Array.from(container.querySelectorAll(focusableSelectors.join(', '))) as HTMLElement[];
  }

  /**
   * Handles focus trap keyboard navigation
   */
  private handleFocusTrap(event: KeyboardEvent): void {
    if (event.key !== 'Tab' || this.focusableElements.length === 0) return;

    if (event.shiftKey) {
      // Shift + Tab (backward)
      this.currentFocusIndex = this.currentFocusIndex <= 0 
        ? this.focusableElements.length - 1 
        : this.currentFocusIndex - 1;
    } else {
      // Tab (forward)
      this.currentFocusIndex = this.currentFocusIndex >= this.focusableElements.length - 1 
        ? 0 
        : this.currentFocusIndex + 1;
    }

    event.preventDefault();
    this.focusableElements[this.currentFocusIndex].focus();
  }
}j>x$YXp HostListener, inject, ElementRefRe/OverlayPosition = 'center |R-left' | 'top-right' | 'bottom-left' | 'bottom-right';
type OverlaySize = 'auto' | | 'fullscreen';
type OverlayVariant = 'default' | 'elevated' | 'floating' | 'modal' | 'popover';

export interface OverlayContainerConfig {
  position?: OverlayPosition;
  size?: OverlaySize;
  variant?: OverlayVariant;
  visible?: boolean;
  closable?:J,Backdrop?: boolean;
  backdropBlur?: boolean:autoFocus?: boolean;
  restoreFocus?: boolean;
  zIndex?: number;
  offsetX?: number;
  offsetY?: number;
}

@Component({
  seloverlay-contain	1M.OnPusho4overlay-container"
        [class.ui-overlay-contain:/overlay-contain'Doverlay-container--{{variant}}]="variant"
        [class.ui-overlay-z*[class.ui-overlay-,[class.ui-overlay-*[class.ui-overlay-container--backdrop-blur]="showBackdrop && backdropBlur"
        [style.--overlay-z-index]="zIndex"
        [style.--overlay-offset-x.px]="offsetX"
        [style.--overlay-offset-y.px]="offsetY"
        [attr.role]="variant === 'modal' ? 'dialog' : 'presentation'Bvariant === 'modal' ? 'true' : null"
        [attr.aria-hidden]="!R((  #overlayContainer
      >
        <!--showBackdrop) {
	@
overlay-contain$overlay-contain;overlay-containJ=overlay-contain1
Voverlay-container__backdrop--blur]="backdropBlur"
            [attr.aria-hidden]="trueP"
        <!-- Overlay Content -->
		
Joverlay-container__content"
          [class.ui-overlay-container__content#$[class.ui-overlay-container__content/overlay-container__content	QoverlayContenta	!6.overlay-containh#OverlayContaino(]
OverlayPosition = 'center';
  @Input() size: OverlaySize = 'auto';
  @Input() variant: OverlayVariant = 'default';
  @Input() ceBackdro@backdropBlur_1b	autoFocus_restoreFocusA=zIndex = 1000;
  @Input() offsetX = 0;
  @Input() offsetY = 0$visible+,visible()) {
      this._visible.set(value);fvisibleYvisible|"visibleChangeAshownA)hiddenA)2#
MouseEventY2KeyboardEvent-visiblevisibleb(  private animationDuration = 200; // ms$visible
    // Set appropriate z-index based on variant
    if (!this.zIndex || this.zIndex === 1000) {
      this.setVariantZIndex();WIfNeededMoverlayq5visible()) return;

IfEnabled();"IfNeeded();
    
    this._visibleK3visible}eIfEnabled();
      this.autoFocusIfEnabled();
      this.shown.emit();
    }, this.animationDuration);	overlayqbvisiblefvisibled(IfNeeded();
      this.visibleChange.emi.hidden.emit();
    }, this.animationDuration);A&overlay (alias for hide)
   */
  closeclosable) {
      this.hidoverlay visibility'+_visible()) {
      this.hide();
    } else#!	*<	H!  this.backdropClicked.emit(event0
   */{z 7event);
      return;
    }

    // Focus trap handling 1event.key === 'Tab') {
      this.handleTabKeyFor (gGlobal keyboard listener for ESC key
   */
  @HostListener('document:keydown', ['$event'])
  onDocument.visible() && ' Z{z event`&z-index based on variant
   */
  private setVariantZIndex(): void {
    switch (this.variant) {
      case 'modal':
        this.zIndex = 1050; // Higher than backdrop
        break;
      case 'popover':
        this.zIndex = 1030;
        break;
      case 'elevated':
        this.zIndex = 1020;
        break;
      case 'floating':
        this.zIndex = 1010;
        break;
 7     default:
        this.zIndex = 1000;
        break!, when overlay is openL!"IfEnabled(): void {
    if (!
) return;
~!%O"Q!x"K#1if (!
) return;
~!%#$e$IfNeededrestoreFocus) {
% $!$MIfNeededrestoreFocus &&% && 'focus' in%	) {
     %as HTMLElement).focusAuto focuses the first focusable element if enabled
   */
  private autoFocusIfEnabled(): void {
    if (!this.autoFocus) return;

%this.updateFocusableElements(', 100);O&$6within overlay
   */
  private setupFocusTrapIfEnabled&1%this.updateFocusableElements(', 100);
  }

  /**
   * Updates the list of focusable elements
   */
  private updateFocusableElements(): void {
    const overlay&;?overlay-container__content');
    if (!overlayElement) return;
(.join(', ');
n, = Array.from(
      overlay'))
    ),:Tab key for focus trapping
   */
  private handleTabKeyFor[*0 Z+*const isShiftTab = event.shiftKey;
    
    if (isShiftTab) {
      // Shift + Tab - move to previous focusable element
      t'+@+s!- move to next focusable element
'+
  /**
   * Public API method to apply configuration
   */
  configure(config: OverlayContainerConfig): void {
    Object.assign(this, config);
  }
}@G4xqX"[BackdropQblur' | 'dark' | 'light';

export interface BackdropConfig {
  variant?: Backdrop"7ickable?: boolean;
  blur?: boolean;
  opacity?: number< backdropbackdropbackdrop+backdrop--blur]="blubackdrop--clickable]="clickable)
	+`
k	)O[style.--backdrop-opacity]="opacity"
        [style.--backdrop-z-index]="zIndex*true"
        [attr.data-backdrop]="true"
	
4(animationend)="handleAnimationEnd($event)"
      >
(	!backdrop;!<BackdropComponent {
  // Inputs
  @Input() variant: Backdropeickableluraopacity = 0.5'falsepc5CQ
  /**
   * Shows the backdropM if (this.preventBodyScroll) {
  1Action();
    }~200backdrop<200);backdropclick events
   */
  handle.clickable) {
      this.c2animation end events
   */
  handleAnimationEnd(event: AnimationEvent): void {
    // Additional animation handling can be adde*d here if needed
    event.stopPropagation+)Action&C! $C " ") $this.preventBodyScroll) {
  9!$A s!#+CBackdrop(,6zx% export * from './backdrop.component';3x: + hC$N<4Đ&e=X$:>~e"ɐ%DKx: +UDp_#VWW0Ɔ&e=bHzŘac̥c&ximport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { CommandSearchResult } from './command-palette.types';

@Component({
  selector: 'ui-command-palette-item',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <button
      type="button"
      class="ui-command-palette-item"
      [class.ui-command-palette-item--selected]="selected"
      [class.ui-command-palette-item--disabled]="result.command.disabled"
      [attr.aria-selected]="selected"
      [attr.aria-disabled]="result.command.disabled"
      role="option"
      (click)="handleClick()"
      (mouseenter)="handleMouseEnter()"
    >
      <div class="ui-command-palette-item__content">
        @if (result.command.icon) {
          <div class="ui-command-palette-item__icon" aria-hidden="true">
            <fa-icon [icon]="result.command.icon"></fa-icon>
          </div>
        }
        
        <div class="ui-command-palette-item__text">
          <div class="ui-command-palette-item__title">
            @if (result.highlightRanges.length > 0) {
              @for (segment of getHighlightedSegments(); track $index) {
                @if (segment.highlighted) {
                  <mark class="ui-command-palette-item__highlight">{{ segment.text }}</mark>
                } @else {
                  <span>{{ segment.text }}</span>
                }
              }
            } @else {
              {{ result.command.title }}
            }
          </div>
          
          @if (result.command.description) {
            <div class="ui-command-palette-item__description">
              {{ result.command.description }}
            </div>
          }
        </div>
        
        @if (result.command.shortcut && result.command.shortcut.length > 0) {
          <div class="ui-command-palette-item__shortcut" aria-hidden="true">
            @for (key of result.command.shortcut; track key; let last = $last) {
              <kbd class="ui-command-palette-item__kbd">{{ key }}</kbd>
              @if (!last) {
                <span class="ui-command-palette-item__plus">+</span>
              }
            }
          </div>
        }
      </div>
    </button>
  `,
  styleUrl: './command-palette-item.component.scss'
})
export class CommandPaletteItemComponent {
  @Input({ required: true }) result!: CommandSearchResult;
  @Input() selected = false;
  
  @Output() itemClick = new EventEmitter<CommandSearchResult>();
  @Output() itemHover = new EventEmitter<CommandSearchResult>();

  handleClick(): void {
    if (!this.result.command.disabled) {
      this.itemClick.emit(this.result);
    }
  }

  handleMouseEnter(): void {
    this.itemHover.emit(this.result);
  }

  getHighlightedSegments(): Array<{ text: string; highlighted: boolean }> {
    const title = this.result.command.title;
    const ranges = this.result.highlightRanges;
    
    if (ranges.length === 0) {
      return [{ text: title, highlighted: false }];
    }

    const segments: Array<{ text: string; highlighted: boolean }> = [];
    let currentIndex = 0;

    // Sort ranges by start position
    const sortedRanges = [...ranges].sort((a, b) => a.start - b.start);

    for (const range of sortedRanges) {
      // Add non-highlighted text before this range
      if (currentIndex < range.start) {
        segments.push({
          text: title.substring(currentIndex, range.start),
          highlighted: false
        });
      }

      // Add highlighted text
      segments.push({
        text: title.substring(range.start, range.end),
        highlighted: true
      });

      currentIndex = range.end;
    }

    // Add remaining non-highlighted text
    if (currentIndex < title.length) {
      segments.push({
        text: title.substring(currentIndex),
        highlighted: false
      });
    }

    return segments;
  }
}B=xD<import { 
  Component, 
  Input, 
  Output, 
  EventEmitter, 
  ChangeDetectionStrategy, 
  ViewEncapsulation, 
  OnInit, 
  OnDestroy, 
  ViewChild, 
  ElementRef,
  inject,
  signal,
  computed,
  effect
} from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faSearch, faClock, faFolder, faTerminal } from '@fortawesome/free-solid-svg-icons';
import { CommandPaletteService } from './command-palette.service';
import { CommandPaletteItemComponent } from './command-palette-item.component';
import { 
  CommandSearchResult, 
  CommandGroup, 
  CommandCategory,
  CommandExecutionContext
} from './command-palette.types';

export type CommandPaletteSize = 'md' | 'lg' | 'xl';

@Component({
  selector: 'ui-command-palette',
  standalone: true,
  imports: [CommonModule, FormsModule, FontAwesomeModule, CommandPaletteItemComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div 
      class="ui-command-palette"
      [class.ui-command-palette--{{size}}]="size"
      [class.ui-command-palette--open]="isOpen()"
      [class.ui-command-palette--entering]="isEntering()"
      [class.ui-command-palette--leaving]="isLeaving()"
      role="dialog"
      [attr.aria-modal]="isOpen()"
      [attr.aria-labelledby]="'command-palette-' + paletteId + '-label'"
      (keydown)="handleKeydown($event)"
    >
      @if (isVisible()) {
        <!-- Backdrop -->
        <div 
          class="ui-command-palette__backdrop"
          (click)="close()"
          aria-hidden="true"
        ></div>

        <!-- Modal Container -->
        <div class="ui-command-palette__container">
          <!-- Search Input -->
          <div class="ui-command-palette__search">
            <div class="ui-command-palette__search-icon" aria-hidden="true">
              <fa-icon [icon]="faSearch"></fa-icon>
            </div>
            
            <input
              #searchInput
              type="search"
              class="ui-command-palette__input"
              [placeholder]="commandService.config().placeholder"
              [value]="searchQuery()"
              (input)="handleSearchInput($event)"
              autocomplete="off"
              autocorrect="off"
              autocapitalize="off"
              spellcheck="false"
              [id]="'command-palette-' + paletteId + '-input'"
              [attr.aria-label]="'Search commands'"
              [attr.aria-describedby]="'command-palette-' + paletteId + '-results'"
              role="combobox"
              [attr.aria-expanded]="searchResults().length > 0"
              [attr.aria-activedescendant]="getActiveDescendantId()"
              aria-haspopup="listbox"
            />

            @if (searchQuery()) {
              <button
                type="button"
                class="ui-command-palette__clear"
                (click)="clearSearch()"
                aria-label="Clear search"
                tabindex="-1"
              >
                ×
              </button>
            }
          </div>

          <!-- Results -->
          <div 
            class="ui-command-palette__results"
            [id]="'command-palette-' + paletteId + '-results'"
            role="listbox"
            [attr.aria-label]="'Command results'"
          >
            @if (searchResults().length > 0) {
              @if (commandService.config().showCategories && !searchQuery()) {
                <!-- Grouped by category -->
                @for (group of groupedResults(); track group.category) {
                  <div class="ui-command-palette__group">
                    <div class="ui-command-palette__group-header">
                      <div class="ui-command-palette__group-icon" aria-hidden="true">
                        <fa-icon [icon]="getCategoryIcon(group.category)"></fa-icon>
                      </div>
                      <h3 class="ui-command-palette__group-title">{{ group.title }}</h3>
                      <span class="ui-command-palette__group-count">{{ group.commands.length }}</span>
                    </div>
                    
                    @for (result of getResultsForGroup(group); track result.command.id; let i = $index) {
                      <ui-command-palette-item
                        [result]="result"
                        [selected]="getGlobalIndex(group, i) === selectedIndex()"
                        [id]="'command-' + result.command.id"
                        (itemClick)="executeCommand(result)"
                        (itemHover)="setSelectedIndex(getGlobalIndex(group, i))"
                      />
                    }
                  </div>
                }
              } @else {
                <!-- Flat results list -->
                @for (result of searchResults(); track result.command.id; let i = $index) {
                  <ui-command-palette-item
                    [result]="result"
                    [selected]="i === selectedIndex()"
                    [id]="'command-' + result.command.id"
                    (itemClick)="executeCommand(result)"
                    (itemHover)="setSelectedIndex(i)"
                  />
                }
              }
            } @else {
              <div class="ui-command-palette__empty" role="status">
                <div class="ui-command-palette__empty-icon" aria-hidden="true">
                  <fa-icon [icon]="faTerminal"></fa-icon>
                </div>
                <p class="ui-command-palette__empty-text">
                  {{ commandService.config().noResultsMessage }}
                </p>
              </div>
            }
          </div>

          <!-- Footer -->
          @if (showFooter) {
            <div class="ui-command-palette__footer">
              <div class="ui-command-palette__footer-section">
                <kbd class="ui-command-palette__footer-kbd">↑↓</kbd>
                <span>Navigate</span>
              </div>
              <div class="ui-command-palette__footer-section">
                <kbd class="ui-command-palette__footer-kbd">Enter</kbd>
                <span>Select</span>
              </div>
              <div class="ui-command-palette__footer-section">
                <kbd class="ui-command-palette__footer-kbd">Esc</kbd>
                <span>Close</span>
              </div>
            </div>
          }
        </div>
      }
    </div>
  `,
  styleUrl: './command-palette.component.scss'
})
export class CommandPaletteComponent implements OnInit, OnDestroy {
  @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;

  @Input() size: CommandPaletteSize = 'lg';
  @Input() showFooter = true;
  @Input() autoFocus = true;

  @Output() opened = new EventEmitter<void>();
  @Output() closed = new EventEmitter<void>();
  @Output() commandExecuted = new EventEmitter<{ commandId: string; context: CommandExecutionContext }>();

  // Inject services
  readonly commandService = inject(CommandPaletteService);

  // Icons
  readonly faSearch = faSearch;
  readonly faClock = faClock;
  readonly faFolder = faFolder;
  readonly faTerminal = faTerminal;

  // State signals
  private _isOpen = signal(false);
  private _isEntering = signal(false);
  private _isLeaving = signal(false);
  private _searchQuery = signal('');
  private _selectedIndex = signal(0);
  private _searchResults = signal<CommandSearchResult[]>([]);

  // Computed signals
  readonly isOpen = this._isOpen.asReadonly();
  readonly isEntering = this._isEntering.asReadonly();
  readonly isLeaving = this._isLeaving.asReadonly();
  readonly searchQuery = this._searchQuery.asReadonly();
  readonly selectedIndex = this._selectedIndex.asReadonly();
  readonly searchResults = this._searchResults.asReadonly();
  readonly isVisible = computed(() => this._isOpen() || this._isEntering() || this._isLeaving());

  readonly groupedResults = computed(() => {
    const results = this._searchResults();
    if (!results.length || this._searchQuery()) {
      return [];
    }

    const groups = new Map<CommandCategory, CommandSearchResult[]>();
    
    results.forEach(result => {
      const category = result.command.category;
      const categoryResults = groups.get(category) || [];
      categoryResults.push(result);
      groups.set(category, categoryResults);
    });

    return Array.from(groups.entries()).map(([category, commands]) => ({
      category,
      title: this.getCategoryTitle(category),
      commands: []
    })).sort((a, b) => this.getCategoryOrder(a.category) - this.getCategoryOrder(b.category));
  });

  // Internal properties
  readonly paletteId = `palette-${Math.random().toString(36).substr(2, 9)}`;
  private previousActiveElement: Element | null = null;

  constructor() {
    // Auto-update search results when query changes
    effect(() => {
      const query = this._searchQuery();
      const results = this.commandService.searchCommands(query);
      this._searchResults.set(results);
      this._selectedIndex.set(0);
    });
  }

  ngOnInit(): void {
    // Initial search to show recent commands
    this.updateSearchResults();
  }

  ngOnDestroy(): void {
    this.restoreFocus();
  }

  open(): void {
    if (this._isOpen()) return;

    this.storePreviousFocus();
    this._isOpen.set(true);
    this._isEntering.set(true);
    this.updateSearchResults();
    
    // Focus input after animation
    setTimeout(() => {
      this._isEntering.set(false);
      if (this.autoFocus && this.searchInput) {
        this.searchInput.nativeElement.focus();
      }
      this.opened.emit();
    }, 150);
  }

  close(): void {
    if (!this._isOpen()) return;

    this._isLeaving.set(true);
    
    setTimeout(() => {
      this._isOpen.set(false);
      this._isLeaving.set(false);
      this._searchQuery.set('');
      this._selectedIndex.set(0);
      this.restoreFocus();
      this.closed.emit();
    }, 150);
  }

  toggle(): void {
    if (this._isOpen()) {
      this.close();
    } else {
      this.open();
    }
  }

  handleSearchInput(event: Event): void {
    const target = event.target as HTMLInputElement;
    this._searchQuery.set(target.value);
  }

  clearSearch(): void {
    this._searchQuery.set('');
    if (this.searchInput) {
      this.searchInput.nativeElement.focus();
    }
  }

  handleKeydown(event: KeyboardEvent): void {
    const results = this._searchResults();
    
    switch (event.key) {
      case 'ArrowDown':
        event.preventDefault();
        this.navigateDown();
        break;
        
      case 'ArrowUp':
        event.preventDefault();
        this.navigateUp();
        break;
        
      case 'Enter':
        event.preventDefault();
        this.executeSelectedCommand();
        break;
        
      case 'Escape':
        event.preventDefault();
        this.close();
        break;
        
      case 'Tab':
        event.preventDefault();
        // Tab could cycle through results or close
        if (event.shiftKey) {
          this.navigateUp();
        } else {
          this.navigateDown();
        }
        break;
    }
  }

  private navigateDown(): void {
    const results = this._searchResults();
    if (results.length === 0) return;
    
    const currentIndex = this._selectedIndex();
    const nextIndex = currentIndex >= results.length - 1 ? 0 : currentIndex + 1;
    this._selectedIndex.set(nextIndex);
  }

  private navigateUp(): void {
    const results = this._searchResults();
    if (results.length === 0) return;
    
    const currentIndex = this._selectedIndex();
    const prevIndex = currentIndex <= 0 ? results.length - 1 : currentIndex - 1;
    this._selectedIndex.set(prevIndex);
  }

  executeSelectedCommand(): void {
    const results = this._searchResults();
    const selectedResult = results[this._selectedIndex()];
    
    if (selectedResult) {
      this.executeCommand(selectedResult);
    }
  }

  async executeCommand(result: CommandSearchResult): Promise<void> {
    const context: CommandExecutionContext = {
      source: 'click',
      timestamp: new Date()
    };

    try {
      await this.commandService.executeCommand(result.command.id, context);
      this.commandExecuted.emit({ commandId: result.command.id, context });
      this.close();
    } catch (error) {
      console.error('Failed to execute command:', error);
    }
  }

  setSelectedIndex(index: number): void {
    this._selectedIndex.set(index);
  }

  getActiveDescendantId(): string | null {
    const results = this._searchResults();
    const selectedResult = results[this._selectedIndex()];
    return selectedResult ? `command-${selectedResult.command.id}` : null;
  }

  getCategoryIcon(category: CommandCategory) {
    const icons = {
      [CommandCategory.RECENT]: faClock,
      [CommandCategory.NAVIGATION]: faFolder,
      [CommandCategory.ACTIONS]: faTerminal,
      [CommandCategory.SETTINGS]: faTerminal,
      [CommandCategory.SEARCH]: faSearch,
      [CommandCategory.HELP]: faTerminal,
      [CommandCategory.FILE]: faFolder,
      [CommandCategory.EDIT]: faTerminal,
      [CommandCategory.VIEW]: faTerminal,
      [CommandCategory.TOOLS]: faTerminal
    };
    return icons[category] || faTerminal;
  }

  getCategoryTitle(category: CommandCategory): string {
    const titles = {
      [CommandCategory.RECENT]: 'Recent',
      [CommandCategory.NAVIGATION]: 'Navigation',
      [CommandCategory.ACTIONS]: 'Actions',
      [CommandCategory.SETTINGS]: 'Settings',
      [CommandCategory.SEARCH]: 'Search',
      [CommandCategory.HELP]: 'Help',
      [CommandCategory.FILE]: 'File',
      [CommandCategory.EDIT]: 'Edit',
      [CommandCategory.VIEW]: 'View',
      [CommandCategory.TOOLS]: 'Tools'
    };
    return titles[category] || 'Other';
  }

  getCategoryOrder(category: CommandCategory): number {
    const orders = {
      [CommandCategory.RECENT]: 0,
      [CommandCategory.NAVIGATION]: 1,
      [CommandCategory.FILE]: 2,
      [CommandCategory.EDIT]: 3,
      [CommandCategory.VIEW]: 4,
      [CommandCategory.ACTIONS]: 5,
      [CommandCategory.TOOLS]: 6,
      [CommandCategory.SEARCH]: 7,
      [CommandCategory.SETTINGS]: 8,
      [CommandCategory.HELP]: 9
    };
    return orders[category] || 99;
  }

  getResultsForGroup(group: { category: CommandCategory }): CommandSearchResult[] {
    return this._searchResults().filter(result => result.command.category === group.category);
  }

  getGlobalIndex(group: { category: CommandCategory }, localIndex: number): number {
    const results = this._searchResults();
    let globalIndex = 0;
    
    for (const result of results) {
      if (result.command.category === group.category) {
        if (localIndex === 0) {
          return globalIndex;
        }
        localIndex--;
      }
      globalIndex++;
    }
    
    return 0;
  }

  private updateSearchResults(): void {
    const query = this._searchQuery();
    const results = this.commandService.searchCommands(query);
    this._searchResults.set(results);
    this._selectedIndex.set(0);
  }

  private storePreviousFocus(): void {
    this.previousActiveElement = document.activeElement;
  }

  private restoreFocus(): void {
    if (this.previousActiveElement && 'focus' in this.previousActiveElement) {
      (this.previousActiveElement as HTMLElement).focus();
    }
  }
}P[xO&import { Injectable, signal } from '@angular/core';
import { 
  Command, 
  CommandGroup, 
  CommandSearchResult, 
  CommandPaletteConfig, 
  CommandCategory, 
  RecentCommand,
  CommandExecutionContext
} from './command-palette.types';

@Injectable({
  providedIn: 'root'
})
export class CommandPaletteService {
  private _commands = signal<Command[]>([]);
  private _recentCommands = signal<RecentCommand[]>([]);
  private _config = signal<CommandPaletteConfig>({
    maxResults: 20,
    showCategories: true,
    showShortcuts: true,
    showRecent: true,
    recentLimit: 5,
    placeholder: 'Search commands...',
    noResultsMessage: 'No commands found',
    fuzzySearchThreshold: 0.3
  });

  readonly commands = this._commands.asReadonly();
  readonly recentCommands = this._recentCommands.asReadonly();
  readonly config = this._config.asReadonly();

  private readonly RECENT_COMMANDS_KEY = 'command-palette-recent';

  constructor() {
    this.loadRecentCommands();
  }

  /**
   * Register a new command
   */
  registerCommand(command: Command): void {
    const commands = this._commands();
    const existingIndex = commands.findIndex(c => c.id === command.id);
    
    if (existingIndex >= 0) {
      // Update existing command
      const updated = [...commands];
      updated[existingIndex] = command;
      this._commands.set(updated);
    } else {
      // Add new command
      this._commands.set([...commands, command]);
    }
  }

  /**
   * Register multiple commands at once
   */
  registerCommands(commands: Command[]): void {
    commands.forEach(command => this.registerCommand(command));
  }

  /**
   * Unregister a command by ID
   */
  unregisterCommand(commandId: string): void {
    const commands = this._commands();
    this._commands.set(commands.filter(c => c.id !== commandId));
  }

  /**
   * Get command by ID
   */
  getCommand(commandId: string): Command | undefined {
    return this._commands().find(c => c.id === commandId);
  }

  /**
   * Get all commands grouped by category
   */
  getCommandsByCategory(): CommandGroup[] {
    const commands = this._commands().filter(c => c.visible !== false);
    const groups = new Map<CommandCategory, Command[]>();

    commands.forEach(command => {
      const categoryCommands = groups.get(command.category) || [];
      categoryCommands.push(command);
      groups.set(command.category, categoryCommands);
    });

    return Array.from(groups.entries()).map(([category, categoryCommands]) => ({
      category,
      title: this.getCategoryTitle(category),
      commands: categoryCommands.sort((a, b) => (a.order || 0) - (b.order || 0)),
      order: this.getCategoryOrder(category)
    })).sort((a, b) => (a.order || 0) - (b.order || 0));
  }

  /**
   * Search commands with fuzzy matching
   */
  searchCommands(query: string): CommandSearchResult[] {
    if (!query.trim()) {
      return this.getRecentCommandResults();
    }

    const commands = this._commands().filter(c => c.visible !== false && !c.disabled);
    const results: CommandSearchResult[] = [];
    const normalizedQuery = query.toLowerCase().trim();

    for (const command of commands) {
      const searchText = this.buildSearchText(command);
      const score = this.calculateFuzzyScore(normalizedQuery, searchText);
      
      if (score >= (this._config().fuzzySearchThreshold || 0.3)) {
        const highlightRanges = this.findHighlightRanges(normalizedQuery, command.title);
        results.push({
          command,
          score,
          highlightRanges
        });
      }
    }

    return results
      .sort((a, b) => b.score - a.score)
      .slice(0, this._config().maxResults || 20);
  }

  /**
   * Execute a command and track usage
   */
  async executeCommand(commandId: string, context: CommandExecutionContext): Promise<void> {
    const command = this.getCommand(commandId);
    if (!command || command.disabled) {
      return;
    }

    try {
      await command.handler();
      this.trackCommandUsage(commandId);
    } catch (error) {
      console.error('Command execution failed:', error);
      throw error;
    }
  }

  /**
   * Update configuration
   */
  updateConfig(config: Partial<CommandPaletteConfig>): void {
    this._config.set({ ...this._config(), ...config });
  }

  /**
   * Clear all commands
   */
  clearCommands(): void {
    this._commands.set([]);
  }

  /**
   * Clear recent commands
   */
  clearRecentCommands(): void {
    this._recentCommands.set([]);
    localStorage.removeItem(this.RECENT_COMMANDS_KEY);
  }

  private buildSearchText(command: Command): string {
    const parts = [
      command.title,
      command.description || '',
      ...command.keywords,
      ...(command.aliases || [])
    ];
    return parts.join(' ').toLowerCase();
  }

  private calculateFuzzyScore(query: string, text: string): number {
    const queryChars = query.split('');
    const textLower = text.toLowerCase();
    let score = 0;
    let queryIndex = 0;
    let consecutiveMatches = 0;

    // Exact title match gets highest score
    if (text.includes(query)) {
      score += 1;
      if (text.startsWith(query)) {
        score += 0.5; // Bonus for prefix match
      }
    }

    // Character by character fuzzy matching
    for (let i = 0; i < textLower.length && queryIndex < queryChars.length; i++) {
      if (textLower[i] === queryChars[queryIndex]) {
        score += 0.1;
        consecutiveMatches++;
        queryIndex++;
        
        // Bonus for consecutive matches
        if (consecutiveMatches > 1) {
          score += 0.05 * consecutiveMatches;
        }
      } else {
        consecutiveMatches = 0;
      }
    }

    // Penalty for incomplete matches
    const completionRatio = queryIndex / queryChars.length;
    score *= completionRatio;

    return score;
  }

  private findHighlightRanges(query: string, text: string): Array<{ start: number; end: number }> {
    const ranges: Array<{ start: number; end: number }> = [];
    const textLower = text.toLowerCase();
    const queryLower = query.toLowerCase();

    let startIndex = 0;
    let matchIndex = textLower.indexOf(queryLower, startIndex);

    while (matchIndex !== -1) {
      ranges.push({
        start: matchIndex,
        end: matchIndex + queryLower.length
      });
      startIndex = matchIndex + 1;
      matchIndex = textLower.indexOf(queryLower, startIndex);
    }

    return ranges;
  }

  private getRecentCommandResults(): CommandSearchResult[] {
    if (!this._config().showRecent) {
      return [];
    }

    const recentCommands = this._recentCommands()
      .sort((a, b) => b.lastUsed.getTime() - a.lastUsed.getTime())
      .slice(0, this._config().recentLimit || 5);

    const results: CommandSearchResult[] = [];
    
    for (const recent of recentCommands) {
      const command = this.getCommand(recent.commandId);
      if (command) {
        results.push({
          command: { ...command, category: CommandCategory.RECENT },
          score: 1,
          highlightRanges: []
        });
      }
    }
    
    return results;
  }

  private trackCommandUsage(commandId: string): void {
    const recent = this._recentCommands();
    const existingIndex = recent.findIndex(r => r.commandId === commandId);
    const now = new Date();

    let updated: RecentCommand[];
    if (existingIndex >= 0) {
      updated = [...recent];
      updated[existingIndex] = {
        ...updated[existingIndex],
        lastUsed: now,
        useCount: updated[existingIndex].useCount + 1
      };
    } else {
      updated = [...recent, {
        commandId,
        lastUsed: now,
        useCount: 1
      }];
    }

    // Keep only the most recent commands
    const maxRecent = (this._config().recentLimit || 5) * 2;
    if (updated.length > maxRecent) {
      updated = updated
        .sort((a, b) => b.lastUsed.getTime() - a.lastUsed.getTime())
        .slice(0, maxRecent);
    }

    this._recentCommands.set(updated);
    this.saveRecentCommands();
  }

  private loadRecentCommands(): void {
    try {
      const stored = localStorage.getItem(this.RECENT_COMMANDS_KEY);
      if (stored) {
        const parsed = JSON.parse(stored);
        const recent = parsed.map((item: any) => ({
          ...item,
          lastUsed: new Date(item.lastUsed)
        }));
        this._recentCommands.set(recent);
      }
    } catch (error) {
      console.warn('Failed to load recent commands:', error);
    }
  }

  private saveRecentCommands(): void {
    try {
      const recent = this._recentCommands();
      localStorage.setItem(this.RECENT_COMMANDS_KEY, JSON.stringify(recent));
    } catch (error) {
      console.warn('Failed to save recent commands:', error);
    }
  }

  private getCategoryTitle(category: CommandCategory): string {
    const titles: Record<CommandCategory, string> = {
      [CommandCategory.RECENT]: 'Recent',
      [CommandCategory.NAVIGATION]: 'Navigation',
      [CommandCategory.ACTIONS]: 'Actions',
      [CommandCategory.SETTINGS]: 'Settings',
      [CommandCategory.SEARCH]: 'Search',
      [CommandCategory.HELP]: 'Help',
      [CommandCategory.FILE]: 'File',
      [CommandCategory.EDIT]: 'Edit',
      [CommandCategory.VIEW]: 'View',
      [CommandCategory.TOOLS]: 'Tools'
    };
    return titles[category];
  }

  private getCategoryOrder(category: CommandCategory): number {
    const orders: Record<CommandCategory, number> = {
      [CommandCategory.RECENT]: 0,
      [CommandCategory.NAVIGATION]: 1,
      [CommandCategory.FILE]: 2,
      [CommandCategory.EDIT]: 3,
      [CommandCategory.VIEW]: 4,
      [CommandCategory.ACTIONS]: 5,
      [CommandCategory.TOOLS]: 6,
      [CommandCategory.SEARCH]: 7,
      [CommandCategory.SETTINGS]: 8,
      [CommandCategory.HELP]: 9
    };
    return orders[category] || 99;
  }
}_Sx7import { IconDefinition } from '@fortawesome/fontawesome-svg-core';

export interface Command {
  id: string;
  title: string;
  description?: string;
  icon?: IconDefinition;
  category: CommandCategory;
  keywords: string[];
  shortcut?: string[];
  handler: () => void | Promise<void>;
  visible?: boolean;
  disabled?: boolean;
  order?: number;
  aliases?: string[];
}

export interface CommandGroup {
  category: CommandCategory;
  title: string;
  commands: Command[];
  order?: number;
}

export interface CommandSearchResult {
  command: Command;
  score: number;
  highlightRanges: Array<{ start: number; end: number }>;
}

export interface CommandPaletteConfig {
  maxResults?: number;
  showCategories?: boolean;
  showShortcuts?: boolean;
  showRecent?: boolean;
  recentLimit?: number;
  placeholder?: string;
  noResultsMessage?: string;
  fuzzySearchThreshold?: number;
}

export enum CommandCategory {
  NAVIGATION = 'navigation',
  ACTIONS = 'actions', 
  SETTINGS = 'settings',
  SEARCH = 'search',
  HELP = 'help',
  RECENT = 'recent',
  FILE = 'file',
  EDIT = 'edit',
  VIEW = 'view',
  TOOLS = 'tools'
}

export interface RecentCommand {
  commandId: string;
  lastUsed: Date;
  useCount: number;
}

export interface CommandExecutionContext {
  source: 'keyboard' | 'click' | 'programmatic';
  timestamp: Date;
}_̼ximport { 
  Directive, 
  Input, 
  Output, 
  EventEmitter, 
  HostListener, 
  OnInit, 
  OnDestroy,
  inject
} from '@angular/core';
import { DOCUMENT } from '@angular/common';

export interface KeyboardShortcut {
  key: string;
  ctrlKey?: boolean;
  metaKey?: boolean;
  altKey?: boolean;
  shiftKey?: boolean;
  preventDefault?: boolean;
  target?: string; // CSS selector for target elements
}

export interface KeyboardEvent {
  shortcut: KeyboardShortcut;
  event: globalThis.KeyboardEvent;
}

@Directive({
  selector: '[uiGlobalKeyboard]',
  standalone: true
})
export class GlobalKeyboardDirective implements OnInit, OnDestroy {
  private document = inject(DOCUMENT) as Document;

  @Input() shortcuts: KeyboardShortcut[] = [];
  @Input() enabled = true;
  @Input() ignoreInputs = true;
  @Input() ignoreContentEditable = true;

  @Output() shortcutTriggered = new EventEmitter<KeyboardEvent>();

  private boundKeydownHandler = this.handleKeydown.bind(this);

  ngOnInit(): void {
    if (this.enabled) {
      this.document.addEventListener('keydown', this.boundKeydownHandler, true);
    }
  }

  ngOnDestroy(): void {
    this.document.removeEventListener('keydown', this.boundKeydownHandler, true);
  }

  private handleKeydown(event: globalThis.KeyboardEvent): void {
    if (!this.enabled) return;

    // Skip if typing in form inputs (unless specifically disabled)
    if (this.ignoreInputs && this.isTypingInInput(event.target as Element)) {
      return;
    }

    // Skip if editing content (unless specifically disabled)
    if (this.ignoreContentEditable && this.isEditingContent(event.target as Element)) {
      return;
    }

    // Check each shortcut for a match
    for (const shortcut of this.shortcuts) {
      if (this.isShortcutMatch(event, shortcut)) {
        // Check if target element matches (if specified)
        if (shortcut.target && !this.isTargetMatch(event.target as Element, shortcut.target)) {
          continue;
        }

        // Prevent default behavior if specified
        if (shortcut.preventDefault !== false) {
          event.preventDefault();
          event.stopPropagation();
        }

        // Emit the shortcut event
        this.shortcutTriggered.emit({
          shortcut,
          event
        });

        // Stop after first match
        break;
      }
    }
  }

  private isShortcutMatch(event: globalThis.KeyboardEvent, shortcut: KeyboardShortcut): boolean {
    // Normalize key comparison (case-insensitive for letters)
    const eventKey = event.key.toLowerCase();
    const shortcutKey = shortcut.key.toLowerCase();
    
    // Handle special cases for common keys
    const keyMatch = this.normalizeKey(eventKey) === this.normalizeKey(shortcutKey);
    
    // Check modifier keys
    const ctrlMatch = (shortcut.ctrlKey || false) === event.ctrlKey;
    const metaMatch = (shortcut.metaKey || false) === event.metaKey;
    const altMatch = (shortcut.altKey || false) === event.altKey;
    const shiftMatch = (shortcut.shiftKey || false) === event.shiftKey;

    return keyMatch && ctrlMatch && metaMatch && altMatch && shiftMatch;
  }

  private normalizeKey(key: string): string {
    // Handle special key mappings
    const keyMap: { [key: string]: string } = {
      ' ': 'space',
      'arrowup': 'up',
      'arrowdown': 'down',
      'arrowleft': 'left',
      'arrowright': 'right',
      'delete': 'del',
      'escape': 'esc'
    };

    return keyMap[key.toLowerCase()] || key.toLowerCase();
  }

  private isTypingInInput(target: Element | null): boolean {
    if (!target) return false;

    const tagName = target.tagName.toLowerCase();
    const inputTypes = ['input', 'textarea', 'select'];
    
    if (inputTypes.includes(tagName)) {
      const element = target as HTMLInputElement | HTMLTextAreaElement;
      
      // Skip if it's a non-text input
      if (tagName === 'input') {
        const type = (element as HTMLInputElement).type.toLowerCase();
        const nonTextTypes = ['submit', 'reset', 'button', 'checkbox', 'radio', 'file', 'image'];
        if (nonTextTypes.includes(type)) {
          return false;
        }
      }

      // Check if element is disabled or readonly
      return !element.disabled && !element.readOnly;
    }

    return false;
  }

  private isEditingContent(target: Element | null): boolean {
    if (!target) return false;

    // Check if element or any parent has contenteditable
    let element = target as Element;
    while (element) {
      if (element.getAttribute && element.getAttribute('contenteditable') === 'true') {
        return true;
      }
      element = element.parentElement as Element;
      
      // Stop at body to avoid infinite loop
      if (!element || element.tagName.toLowerCase() === 'body') {
        break;
      }
    }

    return false;
  }

  private isTargetMatch(target: Element | null, selector: string): boolean {
    if (!target) return false;

    try {
      return target.matches(selector) || !!target.closest(selector);
    } catch (error) {
      console.warn('Invalid CSS selector in keyboard shortcut:', selector, error);
      return false;
    }
  }

  // Public API methods
  addShortcut(shortcut: KeyboardShortcut): void {
    this.shortcuts = [...this.shortcuts, shortcut];
  }

  removeShortcut(shortcut: KeyboardShortcut): void {
    this.shortcuts = this.shortcuts.filter(s => 
      s.key !== shortcut.key || 
      s.ctrlKey !== shortcut.ctrlKey || 
      s.metaKey !== shortcut.metaKey || 
      s.altKey !== shortcut.altKey || 
      s.shiftKey !== shortcut.shiftKey
    );
  }

  clearShortcuts(): void {
    this.shortcuts = [];
  }

  enable(): void {
    if (!this.enabled) {
      this.enabled = true;
      this.document.addEventListener('keydown', this.boundKeydownHandler, true);
    }
  }

  disable(): void {
    if (this.enabled) {
      this.enabled = false;
      this.document.removeEventListener('keydown', this.boundKeydownHandler, true);
    }
  }
}

// Helper function to create common shortcuts
export function createShortcuts() {
  return {
    // Command palette
    commandPalette: (): KeyboardShortcut => ({
      key: 'k',
      ctrlKey: !isMac(),
      metaKey: isMac(),
      preventDefault: true
    }),

    // Quick actions
    quickSearch: (): KeyboardShortcut => ({
      key: '/',
      preventDefault: true
    }),

    // Navigation
    goHome: (): KeyboardShortcut => ({
      key: 'h',
      ctrlKey: !isMac(),
      metaKey: isMac(),
      preventDefault: true
    }),

    goBack: (): KeyboardShortcut => ({
      key: '[',
      ctrlKey: !isMac(),
      metaKey: isMac(),
      preventDefault: true
    }),

    goForward: (): KeyboardShortcut => ({
      key: ']',
      ctrlKey: !isMac(),
      metaKey: isMac(),
      preventDefault: true
    }),

    // Common actions
    save: (): KeyboardShortcut => ({
      key: 's',
      ctrlKey: !isMac(),
      metaKey: isMac(),
      preventDefault: true
    }),

    copy: (): KeyboardShortcut => ({
      key: 'c',
      ctrlKey: !isMac(),
      metaKey: isMac(),
      preventDefault: false // Let browser handle copy
    }),

    paste: (): KeyboardShortcut => ({
      key: 'v',
      ctrlKey: !isMac(),
      metaKey: isMac(),
      preventDefault: false // Let browser handle paste
    }),

    // Custom shortcut builder
    create: (key: string, modifiers: {
      ctrl?: boolean;
      meta?: boolean;
      alt?: boolean;
      shift?: boolean;
      preventDefault?: boolean;
      target?: string;
    } = {}): KeyboardShortcut => ({
      key,
      ctrlKey: modifiers.ctrl,
      metaKey: modifiers.meta,
      altKey: modifiers.alt,
      shiftKey: modifiers.shift,
      preventDefault: modifiers.preventDefault ?? true,
      target: modifiers.target
    })
  };
}

// Platform detection helper
function isMac(): boolean {
  return typeof navigator !== 'undefined' && navigator.platform.toUpperCase().indexOf('MAC') >= 0;
}bx  export * from './command-palette.types';
export * from './command-palette.service';
export * from './command-palette.component';
export * from './command-palette-item.component';
export * from './global-keyboard.directive';
N/Ĥx <\j݇7+pc|7Ց1SCxV$@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-drawer {
  // Drawer Backdrop
  &__backdrop {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.5);
    z-index: $semantic-z-index-overlay;
    opacity: 0;
    transition: opacity $semantic-motion-duration-normal $semantic-motion-easing-ease;
    backdrop-filter: blur(2px);
    
    &--visible {
      opacity: 1;
    }
    
    &--entering {
      animation: drawer-backdrop-fade-in $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
    
    &--leaving {
      animation: drawer-backdrop-fade-out $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
  }

  // Drawer Container
  &__container {
    position: fixed;
    background: $semantic-color-surface-primary;
    box-shadow: $semantic-shadow-elevation-4;
    z-index: $semantic-z-index-modal;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    transform: translateX(-100%);
    transition: transform $semantic-motion-duration-normal $semantic-motion-easing-ease;
    
    &--visible {
      transform: translateX(0);
    }
    
    &--entering {
      animation: drawer-slide-in-left $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
    
    &--leaving {
      animation: drawer-slide-out-left $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
  }

  // Position Variants
  &--left {
    .ui-drawer__container {
      top: 0;
      left: 0;
      height: 100vh;
      border-right: 1px solid $semantic-color-outline;
      transform: translateX(-100%);
      
      &--entering {
        animation: drawer-slide-in-left $semantic-motion-duration-normal $semantic-motion-easing-ease;
      }
      
      &--leaving {
        animation: drawer-slide-out-left $semantic-motion-duration-normal $semantic-motion-easing-ease;
      }
    }
  }
  
  &--right {
    .ui-drawer__container {
      top: 0;
      right: 0;
      height: 100vh;
      border-left: 1px solid $semantic-color-outline;
      transform: translateX(100%);
      
      &--visible {
        transform: translateX(0);
      }
      
      &--entering {
        animation: drawer-slide-in-right $semantic-motion-duration-normal $semantic-motion-easing-ease;
      }
      
      &--leaving {
        animation: drawer-slide-out-right $semantic-motion-duration-normal $semantic-motion-easing-ease;
      }
    }
  }
  
  &--top {
    .ui-drawer__container {
      top: 0;
      left: 0;
      width: 100vw;
      border-bottom: 1px solid $semantic-color-outline;
      transform: translateY(-100%);
      
      &--visible {
        transform: translateY(0);
      }
      
      &--entering {
        animation: drawer-slide-in-top $semantic-motion-duration-normal $semantic-motion-easing-ease;
      }
      
      &--leaving {
        animation: drawer-slide-out-top $semantic-motion-duration-normal $semantic-motion-easing-ease;
      }
    }
  }
  
  &--bottom {
    .ui-drawer__container {
      bottom: 0;
      left: 0;
      width: 100vw;
      border-top: 1px solid $semantic-color-outline;
      transform: translateY(100%);
      
      &--visible {
        transform: translateY(0);
      }
      
      &--entering {
        animation: drawer-slide-in-bottom $semantic-motion-duration-normal $semantic-motion-easing-ease;
      }
      
      &--leaving {
        animation: drawer-slide-out-bottom $semantic-motion-duration-normal $semantic-motion-easing-ease;
      }
    }
  }

  // Size Variants
  &--sm {
    .ui-drawer__container {
      width: 280px;
    }
    
    &.ui-drawer--top .ui-drawer__container,
    &.ui-drawer--bottom .ui-drawer__container {
      height: 200px;
    }
  }
  
  &--md {
    .ui-drawer__container {
      width: 360px;
    }
    
    &.ui-drawer--top .ui-drawer__container,
    &.ui-drawer--bottom .ui-drawer__container {
      height: 300px;
    }
  }
  
  &--lg {
    .ui-drawer__container {
      width: 480px;
    }
    
    &.ui-drawer--top .ui-drawer__container,
    &.ui-drawer--bottom .ui-drawer__container {
      height: 400px;
    }
  }
  
  &--xl {
    .ui-drawer__container {
      width: 640px;
    }
    
    &.ui-drawer--top .ui-drawer__container,
    &.ui-drawer--bottom .ui-drawer__container {
      height: 500px;
    }
  }

  // Drawer Header
  &__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: $semantic-spacing-component-lg;
    border-bottom: 1px solid $semantic-color-outline;
    background: $semantic-color-surface-primary;
    flex-shrink: 0;
    
    &--no-border {
      border-bottom: none;
    }
  }

  &__title {
    font-size: $semantic-typography-heading-h4-size;
    font-weight: $semantic-typography-font-weight-semibold;
    color: $semantic-color-on-surface;
    margin: 0;
    line-height: 1.4;
  }

  &__close-button {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border: none;
    background: transparent;
    border-radius: $semantic-border-radius-md;
    color: $semantic-color-on-surface-variant;
    cursor: pointer;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &:hover {
      background: $semantic-color-surface-variant;
      color: $semantic-color-on-surface;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-primary;
      outline-offset: 2px;
    }
    
    &:active {
      background: $semantic-color-surface-container;
    }
  }

  // Drawer Body
  &__body {
    padding: $semantic-spacing-component-lg;
    overflow-y: auto;
    flex: 1;
    
    &--no-padding {
      padding: 0;
    }
    
    &--scrollable {
      overflow-y: auto;
    }
  }

  &__content {
    color: $semantic-color-on-surface;
    font-size: $semantic-typography-font-size-md;
    line-height: 1.6;
  }

  // Drawer Footer
  &__footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: $semantic-spacing-component-sm;
    padding: $semantic-spacing-component-lg;
    border-top: 1px solid $semantic-color-outline;
    background: $semantic-color-surface-primary;
    flex-shrink: 0;
    
    &--no-border {
      border-top: none;
    }
    
    &--center {
      justify-content: center;
    }
    
    &--start {
      justify-content: flex-start;
    }
    
    &--between {
      justify-content: space-between;
    }
  }

  // State Variants
  &--loading {
    .ui-drawer__body {
      display: flex;
      align-items: center;
      justify-content: center;
      min-height: 200px;
    }
  }

  &--persistent {
    .ui-drawer__backdrop {
      display: none;
    }
  }

  // Loading Spinner
  &__loader {
    display: inline-block;
    width: 24px;
    height: 24px;
    border: 2px solid $semantic-color-outline;
    border-radius: 50%;
    border-top-color: $semantic-color-primary;
    animation: drawer-spin 1s linear infinite;
  }
  
  // Dark Mode Support
  :host-context(.dark-theme) & {
    &__backdrop {
      background: rgba(0, 0, 0, 0.7);
    }
  }
  
  // Responsive Design
  @media (max-width: 768px) {
    &--sm .ui-drawer__container,
    &--md .ui-drawer__container,
    &--lg .ui-drawer__container,
    &--xl .ui-drawer__container {
      width: 85vw;
      max-width: 400px;
    }
    
    &__header {
      padding: $semantic-spacing-component-md;
    }
    
    &__body {
      padding: $semantic-spacing-component-md;
    }
    
    &__footer {
      padding: $semantic-spacing-component-md;
      flex-direction: column;
      gap: $semantic-spacing-component-xs;
      
      .ui-button {
        width: 100%;
      }
    }
    
    &__title {
      font-size: $semantic-typography-heading-h5-size;
    }
  }
  
  @media (max-width: 480px) {
    &--sm .ui-drawer__container,
    &--md .ui-drawer__container,
    &--lg .ui-drawer__container,
    &--xl .ui-drawer__container {
      width: 100vw;
      max-width: none;
    }
  }
}

// Animations
@keyframes drawer-backdrop-fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes drawer-backdrop-fade-out {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
  }
}

@keyframes drawer-slide-in-left {
  from {
    transform: translateX(-100%);
  }
  to {
    transform: translateX(0);
  }
}

@keyframes drawer-slide-out-left {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-100%);
  }
}

@keyframes drawer-slide-in-right {
  from {
    transform: translateX(100%);
  }
  to {
    transform: translateX(0);
  }
}

@keyframes drawer-slide-out-right {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(100%);
  }
}

@keyframes drawer-slide-in-top {
  from {
    transform: translateY(-100%);
  }
  to {
    transform: translateY(0);
  }
}

@keyframes drawer-slide-out-top {
  from {
    transform: translateY(0);
  }
  to {
    transform: translateY(-100%);
  }
}

@keyframes drawer-slide-in-bottom {
  from {
    transform: translateY(100%);
  }
  to {
    transform: translateY(0);
  }
}

@keyframes drawer-slide-out-bottom {
  from {
    transform: translateY(0);
  }
  to {
    transform: translateY(100%);
  }
}

@keyframes drawer-spin {
  to {
    transform: rotate(360deg);
  }
}GdxqcgqFbQjniF= X%x# export * from './drawer.component';#M`x  '8ɓ{:>VhY&* "];1x  '/7H\^8.lۗ,"];d,xeUimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, OnInit, OnDestroy, AfterViewInit, inject, ElementRef, Renderer2, ViewChild, HostListener, TemplateRef } from '@angular/core';
import { CommonModule, DOCUMENT } from '@angular/common';
import { signal, computed } from '@angular/core';

type ToolbarSize = 'sm' | 'md' | 'lg';
type ToolbarVariant = 'default' | 'elevated' | 'floating' | 'compact' | 'contextual';
type ToolbarPosition = 'top' | 'bottom' | 'left' | 'right';
type ToolbarAnimationType = 'slide-fade' | 'bounce' | 'none';

export interface ToolbarAction {
  id: string;
  label: string;
  icon?: string;
  iconTemplate?: TemplateRef<any>;
  disabled?: boolean;
  visible?: boolean;
  divider?: boolean;
  tooltip?: string;
  shortcut?: string;
  callback?: (action: ToolbarAction, event: Event) => void;
}

export interface ToolbarContext {
  type?: string;
  selection?: any;
  data?: any;
  metadata?: Record<string, any>;
}

export interface ToolbarPositionData {
  top: number;
  left: number;
  position: ToolbarPosition;
}

export interface FloatingToolbarConfig {
  size?: ToolbarSize;
  variant?: ToolbarVariant;
  position?: ToolbarPosition;
  autoPosition?: boolean;
  visible?: boolean;
  actions?: ToolbarAction[];
  context?: ToolbarContext;
  trigger?: 'manual' | 'selection' | 'hover' | 'contextmenu';
  autoHide?: boolean;
  hideDelay?: number;
  showAnimation?: ToolbarAnimationType;
  backdrop?: boolean;
  backdropClosable?: boolean;
  escapeClosable?: boolean;
  offset?: number;
  label?: string;
  showLabel?: boolean;
  showShortcuts?: boolean;
}

@Component({
  selector: 'ui-floating-toolbar',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    @if (isVisible()) {
      <!-- Backdrop (optional) -->
      @if (backdrop) {
        <div 
          class="ui-floating-toolbar-backdrop"
          (click)="handleBackdropClick($event)"
        ></div>
      }

      <!-- Floating Toolbar Container -->
      <div 
        class="ui-floating-toolbar"
        [class.ui-floating-toolbar--{{size}}]="size"
        [class.ui-floating-toolbar--{{variant}}]="variant"
        [class.ui-floating-toolbar--{{computedPosition()}}]="computedPosition()"
        [class.ui-floating-toolbar--visible]="isVisible()"
        [class.ui-floating-toolbar--entering]="isEntering()"
        [class.ui-floating-toolbar--leaving]="isLeaving()"
        [class.ui-floating-toolbar--disabled]="disabled"
        [class.ui-floating-toolbar--{{showAnimation}}]="showAnimation !== 'none'"
        [style.top.px]="positionData().top"
        [style.left.px]="positionData().left"
        [attr.role]="'toolbar'"
        [attr.aria-label]="label || 'Floating toolbar'"
        [attr.aria-orientation]="'horizontal'"
        [attr.tabindex]="0"
        (keydown)="handleKeydown($event)"
        (click)="$event.stopPropagation()"
        #toolbarElement
      >
        <!-- Optional Label -->
        @if (label && showLabel) {
          <div class="ui-floating-toolbar__label">{{ label }}</div>
          <div class="ui-floating-toolbar__divider"></div>
        }

        <!-- Actions Container -->
        <div class="ui-floating-toolbar__actions">
          @for (action of visibleActions(); track action.id) {
            <!-- Divider -->
            @if (action.divider) {
              <div class="ui-floating-toolbar__divider"></div>
            }

            <!-- Action Button -->
            <button
              type="button"
              class="ui-floating-toolbar__action"
              [class.ui-floating-toolbar__action--disabled]="action.disabled"
              [disabled]="action.disabled"
              [attr.aria-label]="action.label"
              [attr.title]="action.tooltip || action.label"
              [attr.data-shortcut]="action.shortcut"
              (click)="handleActionClick(action, $event)"
              (keydown)="handleActionKeydown(action, $event)"
            >
              <!-- Icon (if provided) -->
              @if (action.icon) {
                <i [class]="action.icon" aria-hidden="true"></i>
              }

              <!-- Icon Template (if provided) -->
              @if (action.iconTemplate) {
                <ng-container *ngTemplateOutlet="action.iconTemplate"></ng-container>
              }

              <!-- Label (for screen readers or when no icon) -->
              <span 
                class="ui-floating-toolbar__action-label"
                [class.ui-floating-toolbar__action-label--visible]="!action.icon && !action.iconTemplate"
              >
                {{ action.label }}
              </span>

              <!-- Shortcut indicator -->
              @if (action.shortcut && showShortcuts) {
                <span class="ui-floating-toolbar__shortcut">{{ action.shortcut }}</span>
              }
            </button>
          }
        </div>

        <!-- Custom Content Slot -->
        <ng-content></ng-content>
      </div>
    }
  `,
  styleUrl: './floating-toolbar.component.scss'
})
export class FloatingToolbarComponent implements OnInit, OnDestroy, AfterViewInit {
  // Dependencies
  private elementRef = inject(ElementRef);
  private renderer = inject(Renderer2);
  private document = inject(DOCUMENT);

  // ViewChild references
  @ViewChild('toolbarElement', { static: false }) toolbarElement?: ElementRef<HTMLElement>;

  // Core Inputs
  @Input() size: ToolbarSize = 'md';
  @Input() variant: ToolbarVariant = 'default';
  @Input() position: ToolbarPosition = 'top';
  @Input() autoPosition = true;
  @Input() disabled = false;
  @Input() label = '';
  @Input() showLabel = false;
  @Input() showShortcuts = false;

  // Behavior Inputs
  @Input() trigger: 'manual' | 'selection' | 'hover' | 'contextmenu' = 'manual';
  @Input() autoHide = false;
  @Input() hideDelay = 3000;
  @Input() showAnimation: ToolbarAnimationType = 'slide-fade';
  @Input() backdrop = false;
  @Input() backdropClosable = true;
  @Input() escapeClosable = true;
  @Input() offset = 12;

  // Context and Actions
  @Input() actions: ToolbarAction[] = [];
  @Input() context?: ToolbarContext;

  // Reference element (anchor point)
  @Input() anchorElement?: HTMLElement;
  @Input() anchorSelector?: string;

  // State Input
  @Input() set visible(value: boolean) {
    if (value !== this._visible()) {
      this._visible.set(value);
      if (value) {
        this.show();
      } else {
        this.hide();
      }
    }
  }

  get visible(): boolean {
    return this._visible();
  }

  // Outputs
  @Output() visibleChange = new EventEmitter<boolean>();
  @Output() shown = new EventEmitter<void>();
  @Output() hidden = new EventEmitter<void>();
  @Output() actionClicked = new EventEmitter<{ action: ToolbarAction; event: Event }>();
  @Output() contextChanged = new EventEmitter<ToolbarContext>();
  @Output() positionChanged = new EventEmitter<ToolbarPosition>();
  @Output() backdropClicked = new EventEmitter<MouseEvent>();
  @Output() escapePressed = new EventEmitter<KeyboardEvent>();

  // Internal state signals
  private _visible = signal(false);
  private _entering = signal(false);
  private _leaving = signal(false);
  private _computedPosition = signal<ToolbarPosition>(this.position);
  private _positionData = signal<ToolbarPositionData>({ top: 0, left: 0, position: this.position });
  private _focusedActionIndex = signal(-1);

  // Computed signals
  readonly isVisible = computed(() => this._visible() || this._entering() || this._leaving());
  readonly isEntering = computed(() => this._entering());
  readonly isLeaving = computed(() => this._leaving());
  readonly computedPosition = computed(() => this._computedPosition());
  readonly positionData = computed(() => this._positionData());
  readonly visibleActions = computed(() => 
    this.actions.filter(action => action.visible !== false)
  );
  readonly focusedActionIndex = computed(() => this._focusedActionIndex());

  // Internal properties
  private hideTimer?: number;
  private showTimer?: number;
  private resizeObserver?: ResizeObserver;
  private selectionObserver?: MutationObserver;
  private currentSelection?: Selection | null;
  private animationDuration = 200; // ms

  // Unique ID for accessibility
  readonly toolbarId = `floating-toolbar-${Math.random().toString(36).substr(2, 9)}`;

  ngOnInit(): void {
    if (this.visible) {
      this.show();
    }
    this.setupTriggerListeners();
    this.setupAnchorElement();
  }

  ngAfterViewInit(): void {
    if (this.visible) {
      setTimeout(() => this.updatePosition(), 0);
    }
  }

  ngOnDestroy(): void {
    this.clearTimers();
    this.cleanup();
  }

  /**
   * Shows the floating toolbar with animation and positioning
   */
  show(): void {
    if (this._visible() || this.disabled) return;

    console.log('FloatingToolbar: show() called');
    this.clearTimers();
    
    this._visible.set(true);
    this._entering.set(true);
    this.visibleChange.emit(true);
    console.log('FloatingToolbar: visibility signals updated', { 
      visible: this._visible(), 
      entering: this._entering(),
      isVisible: this.isVisible()
    });
    
    this.updatePosition();
    this.setupPositionObservers();

    // Animation timing
    setTimeout(() => {
      this._entering.set(false);
      this.shown.emit();
      console.log('FloatingToolbar: animation completed');
      
      // Auto-hide if enabled
      if (this.autoHide && this.hideDelay > 0) {
        this.scheduleAutoHide();
      }
    }, this.animationDuration);
  }

  /**
   * Hides the floating toolbar with animation
   */
  hide(): void {
    if (!this._visible()) return;

    this.clearTimers();
    this.cleanup();

    this._leaving.set(true);

    // Animation timing
    setTimeout(() => {
      this._visible.set(false);
      this._leaving.set(false);
      this.visibleChange.emit(false);
      this.hidden.emit();
    }, this.animationDuration);
  }

  /**
   * Toggles toolbar visibility
   */
  toggle(): void {
    if (this._visible()) {
      this.hide();
    } else {
      this.show();
    }
  }

  /**
   * Updates toolbar actions based on context
   */
  updateContext(context: ToolbarContext): void {
    this.context = context;
    this.contextChanged.emit(context);
    
    // Update action visibility and state based on context
    this.updateActionsFromContext();
  }

  /**
   * Adds an action to the toolbar
   */
  addAction(action: ToolbarAction, index?: number): void {
    if (index !== undefined && index >= 0 && index < this.actions.length) {
      this.actions.splice(index, 0, action);
    } else {
      this.actions.push(action);
    }
  }

  /**
   * Removes an action from the toolbar
   */
  removeAction(actionId: string): void {
    const index = this.actions.findIndex(action => action.id === actionId);
    if (index !== -1) {
      this.actions.splice(index, 1);
    }
  }

  /**
   * Updates an existing action
   */
  updateAction(actionId: string, updates: Partial<ToolbarAction>): void {
    const action = this.actions.find(a => a.id === actionId);
    if (action) {
      Object.assign(action, updates);
    }
  }

  /**
   * Updates the toolbar position relative to the anchor element
   */
  updatePosition(): void {
    if (!this.anchorElement || !this.toolbarElement) {
      console.log('FloatingToolbar: updatePosition() - missing elements', {
        anchorElement: !!this.anchorElement,
        toolbarElement: !!this.toolbarElement
      });
      return;
    }

    const anchorRect = this.anchorElement.getBoundingClientRect();
    const toolbarEl = this.toolbarElement.nativeElement;
    const toolbarRect = toolbarEl.getBoundingClientRect();
    const viewportWidth = window.innerWidth;
    const viewportHeight = window.innerHeight;
    const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
    const scrollTop = window.pageYOffset || document.documentElement.scrollTop;

    let position = this.position;
    let top = 0;
    let left = 0;

    // Calculate initial position
    const positions = this.calculatePositions(anchorRect, toolbarRect, scrollLeft, scrollTop);
    const initialPos = positions[position];
    top = initialPos.top;
    left = initialPos.left;

    // Auto-position if enabled and toolbar goes outside viewport
    if (this.autoPosition) {
      const bestPosition = this.findBestPosition(positions, viewportWidth, viewportHeight, toolbarRect);
      position = bestPosition.position;
      top = bestPosition.top;
      left = bestPosition.left;
    }

    // Ensure toolbar stays within viewport bounds
    const finalPosition = this.constrainToViewport(
      { top, left, position },
      toolbarRect,
      viewportWidth,
      viewportHeight
    );

    // Update state
    this._computedPosition.set(finalPosition.position);
    this._positionData.set(finalPosition);

    // Emit position change if it changed
    if (finalPosition.position !== this.position) {
      this.positionChanged.emit(finalPosition.position);
    }
  }

  /**
   * Handles action button clicks
   */
  handleActionClick(action: ToolbarAction, event: Event): void {
    if (action.disabled) return;

    event.stopPropagation();
    
    // Execute action callback if provided
    if (action.callback) {
      action.callback(action, event);
    }

    // Emit action clicked event
    this.actionClicked.emit({ action, event });

    // Focus management
    const button = event.target as HTMLButtonElement;
    if (button) {
      const actionIndex = this.visibleActions().findIndex(a => a.id === action.id);
      this._focusedActionIndex.set(actionIndex);
    }
  }

  /**
   * Handles keyboard navigation within actions
   */
  handleActionKeydown(action: ToolbarAction, event: KeyboardEvent): void {
    const visibleActions = this.visibleActions();
    const currentIndex = this._focusedActionIndex();
    
    switch (event.key) {
      case 'ArrowLeft':
      case 'ArrowUp':
        event.preventDefault();
        this.focusPreviousAction();
        break;
        
      case 'ArrowRight':
      case 'ArrowDown':
        event.preventDefault();
        this.focusNextAction();
        break;
        
      case 'Home':
        event.preventDefault();
        this.focusFirstAction();
        break;
        
      case 'End':
        event.preventDefault();
        this.focusLastAction();
        break;
        
      case 'Enter':
      case ' ':
        event.preventDefault();
        this.handleActionClick(action, event);
        break;
    }
  }

  /**
   * Handles toolbar-level keyboard events
   */
  handleKeydown(event: KeyboardEvent): void {
    switch (event.key) {
      case 'Escape':
        if (this.escapeClosable) {
          event.preventDefault();
          this.hide();
          this.escapePressed.emit(event);
        }
        break;
        
      case 'Tab':
        // Allow normal tab behavior within toolbar
        break;
        
      default:
        // Handle keyboard shortcuts
        this.handleKeyboardShortcut(event);
        break;
    }
  }

  /**
   * Handles backdrop clicks
   */
  handleBackdropClick(event: MouseEvent): void {
    if (this.backdropClosable) {
      this.hide();
      this.backdropClicked.emit(event);
    }
  }

  /**
   * Document click listener to handle outside clicks
   */
  @HostListener('document:click', ['$event'])
  onDocumentClick(event: MouseEvent): void {
    if (!this._visible()) return;

    const target = event.target as HTMLElement;
    const isInsideToolbar = this.elementRef.nativeElement.contains(target);
    const isInsideAnchor = this.anchorElement?.contains(target);

    if (!isInsideToolbar && !isInsideAnchor && this.trigger !== 'manual') {
      this.hide();
    }
  }

  /**
   * Document selection change listener for text selection trigger
   */
  @HostListener('document:selectionchange', ['$event'])
  onDocumentSelectionChange(event: Event): void {
    if (this.trigger !== 'selection') return;

    const selection = window.getSelection();
    
    if (selection && selection.toString().trim()) {
      // Text is selected
      this.currentSelection = selection;
      this.updateSelectionAnchor();
      this.show();
    } else {
      // No text selected
      this.currentSelection = null;
      if (this.autoHide) {
        this.scheduleAutoHide();
      }
    }
  }

  /**
   * Focus management methods
   */
  private focusFirstAction(): void {
    const actions = this.visibleActions();
    if (actions.length > 0) {
      this._focusedActionIndex.set(0);
      this.focusActionButton(0);
    }
  }

  private focusLastAction(): void {
    const actions = this.visibleActions();
    if (actions.length > 0) {
      const lastIndex = actions.length - 1;
      this._focusedActionIndex.set(lastIndex);
      this.focusActionButton(lastIndex);
    }
  }

  private focusNextAction(): void {
    const actions = this.visibleActions();
    const currentIndex = this._focusedActionIndex();
    const nextIndex = (currentIndex + 1) % actions.length;
    this._focusedActionIndex.set(nextIndex);
    this.focusActionButton(nextIndex);
  }

  private focusPreviousAction(): void {
    const actions = this.visibleActions();
    const currentIndex = this._focusedActionIndex();
    const prevIndex = currentIndex <= 0 ? actions.length - 1 : currentIndex - 1;
    this._focusedActionIndex.set(prevIndex);
    this.focusActionButton(prevIndex);
  }

  private focusActionButton(index: number): void {
    if (!this.toolbarElement) return;

    const buttons = this.toolbarElement.nativeElement.querySelectorAll('.ui-floating-toolbar__action');
    const button = buttons[index] as HTMLButtonElement;
    if (button && !button.disabled) {
      button.focus();
    }
  }

  /**
   * Handles keyboard shortcuts
   */
  private handleKeyboardShortcut(event: KeyboardEvent): void {
    const shortcutKey = this.getShortcutString(event);
    const action = this.actions.find(a => a.shortcut === shortcutKey && !a.disabled && a.visible !== false);
    
    if (action) {
      event.preventDefault();
      this.handleActionClick(action, event);
    }
  }

  private getShortcutString(event: KeyboardEvent): string {
    const parts: string[] = [];
    
    if (event.ctrlKey) parts.push('Ctrl');
    if (event.altKey) parts.push('Alt');
    if (event.shiftKey) parts.push('Shift');
    if (event.metaKey) parts.push('Cmd');
    
    if (event.key && event.key !== 'Control' && event.key !== 'Alt' && event.key !== 'Shift' && event.key !== 'Meta') {
      parts.push(event.key);
    }
    
    return parts.join('+');
  }

  /**
   * Sets up trigger listeners based on trigger type
   */
  private setupTriggerListeners(): void {
    switch (this.trigger) {
      case 'hover':
        if (this.anchorElement) {
          this.renderer.listen(this.anchorElement, 'mouseenter', () => this.show());
          this.renderer.listen(this.anchorElement, 'mouseleave', () => {
            if (this.autoHide) {
              this.scheduleAutoHide();
            }
          });
          
          // Keep toolbar open when hovering over it
          this.renderer.listen(this.elementRef.nativeElement, 'mouseenter', () => {
            this.clearTimers();
          });
          this.renderer.listen(this.elementRef.nativeElement, 'mouseleave', () => {
            if (this.autoHide) {
              this.scheduleAutoHide();
            }
          });
        }
        break;

      case 'contextmenu':
        if (this.anchorElement) {
          this.renderer.listen(this.anchorElement, 'contextmenu', (event: MouseEvent) => {
            event.preventDefault();
            this.updatePositionFromEvent(event);
            this.show();
          });
        }
        break;

      case 'selection':
        // Handled by document listener
        break;

      case 'manual':
      default:
        // No automatic triggers
        break;
    }
  }

  private setupAnchorElement(): void {
    if (this.anchorSelector && !this.anchorElement) {
      const element = this.document.querySelector(this.anchorSelector) as HTMLElement;
      if (element) {
        this.anchorElement = element;
        this.setupTriggerListeners();
      }
    }
  }

  private updateSelectionAnchor(): void {
    if (!this.currentSelection) return;

    const range = this.currentSelection.getRangeAt(0);
    const rect = range.getBoundingClientRect();
    
    // Create a temporary anchor element for positioning
    if (rect.width > 0 && rect.height > 0) {
      this.anchorElement = {
        getBoundingClientRect: () => rect,
        contains: () => false
      } as unknown as HTMLElement;
    }
  }

  private updatePositionFromEvent(event: MouseEvent): void {
    // Create a temporary anchor element at the event position
    this.anchorElement = {
      getBoundingClientRect: () => ({
        top: event.clientY,
        left: event.clientX,
        right: event.clientX,
        bottom: event.clientY,
        width: 0,
        height: 0
      } as DOMRect),
      contains: () => false
    } as unknown as HTMLElement;
  }

  private updateActionsFromContext(): void {
    if (!this.context) return;

    // Update action visibility and state based on context
    this.actions.forEach(action => {
      // This could be enhanced with more sophisticated context-aware logic
      if (this.context?.type && action.id.includes(this.context.type)) {
        action.visible = true;
      }
    });
  }

  private scheduleAutoHide(): void {
    this.clearTimers();
    this.hideTimer = window.setTimeout(() => {
      this.hide();
    }, this.hideDelay);
  }

  private clearTimers(): void {
    if (this.hideTimer) {
      clearTimeout(this.hideTimer);
      this.hideTimer = undefined;
    }
    if (this.showTimer) {
      clearTimeout(this.showTimer);
      this.showTimer = undefined;
    }
  }

  private setupPositionObservers(): void {
    // Resize observer for position updates
    this.resizeObserver = new ResizeObserver(() => {
      if (this._visible()) {
        this.updatePosition();
      }
    });
    this.resizeObserver.observe(document.body);

    // Listen for window scroll and resize
    window.addEventListener('scroll', this.updatePositionThrottled, { passive: true });
    window.addEventListener('resize', this.updatePositionThrottled, { passive: true });
  }

  private updatePositionThrottled = this.throttle(() => {
    if (this._visible()) {
      this.updatePosition();
    }
  }, 16); // ~60fps

  private cleanup(): void {
    this.resizeObserver?.disconnect();
    this.selectionObserver?.disconnect();
    window.removeEventListener('scroll', this.updatePositionThrottled);
    window.removeEventListener('resize', this.updatePositionThrottled);
  }

  private calculatePositions(
    anchorRect: DOMRect,
    toolbarRect: DOMRect,
    scrollLeft: number,
    scrollTop: number
  ): Record<ToolbarPosition, ToolbarPositionData> {
    const anchorCenterX = anchorRect.left + anchorRect.width / 2;
    const anchorCenterY = anchorRect.top + anchorRect.height / 2;

    return {
      'top': {
        top: anchorRect.top - toolbarRect.height - this.offset + scrollTop,
        left: anchorCenterX - toolbarRect.width / 2 + scrollLeft,
        position: 'top'
      },
      'bottom': {
        top: anchorRect.bottom + this.offset + scrollTop,
        left: anchorCenterX - toolbarRect.width / 2 + scrollLeft,
        position: 'bottom'
      },
      'left': {
        top: anchorCenterY - toolbarRect.height / 2 + scrollTop,
        left: anchorRect.left - toolbarRect.width - this.offset + scrollLeft,
        position: 'left'
      },
      'right': {
        top: anchorCenterY - toolbarRect.height / 2 + scrollTop,
        left: anchorRect.right + this.offset + scrollLeft,
        position: 'right'
      }
    };
  }

  private findBestPosition(
    positions: Record<ToolbarPosition, ToolbarPositionData>,
    viewportWidth: number,
    viewportHeight: number,
    toolbarRect: DOMRect
  ): ToolbarPositionData {
    const preferenceOrder: ToolbarPosition[] = [
      this.position,
      ...Object.keys(positions).filter(p => p !== this.position) as ToolbarPosition[]
    ];

    for (const pos of preferenceOrder) {
      const posData = positions[pos];
      const fitsHorizontally = posData.left >= 0 && posData.left + toolbarRect.width <= viewportWidth;
      const fitsVertically = posData.top >= 0 && posData.top + toolbarRect.height <= viewportHeight;

      if (fitsHorizontally && fitsVertically) {
        return posData;
      }
    }

    return positions[this.position];
  }

  private constrainToViewport(
    position: ToolbarPositionData,
    toolbarRect: DOMRect,
    viewportWidth: number,
    viewportHeight: number
  ): ToolbarPositionData {
    const margin = 8;
    let { top, left } = position;

    // Constrain horizontally
    if (left < margin) {
      left = margin;
    } else if (left + toolbarRect.width > viewportWidth - margin) {
      left = viewportWidth - toolbarRect.width - margin;
    }

    // Constrain vertically
    if (top < margin) {
      top = margin;
    } else if (top + toolbarRect.height > viewportHeight - margin) {
      top = viewportHeight - toolbarRect.height - margin;
    }

    return { ...position, top, left };
  }

  private throttle<T extends (...args: any[]) => void>(func: T, limit: number): T {
    let inThrottle: boolean;
    return ((...args: any[]) => {
      if (!inThrottle) {
        func.apply(this, args);
        inThrottle = true;
        setTimeout(() => inThrottle = false, limit);
      }
    }) as T;
  }

  /**
   * Public API method to apply configuration
   */
  configure(config: FloatingToolbarConfig): void {
    Object.assign(this, config);
  }

  /**
   * Public API method to set anchor element
   */
  setAnchorElement(element: HTMLElement): void {
    this.anchorElement = element;
    this.setupTriggerListeners();
  }
}Ii?x- export * from './floating-toolbar.component';o<xK(/*QRH+UPOIQJEH)J,O-&R_M.,('R79?$13 u x.Px/ scommand-paletteqfloating-toolbar';exc,P x" export * from './modal.component';Ξնxy@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-modal {
  // Modal Backdrop
  &__backdrop {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.6);
    z-index: 1000;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: $semantic-spacing-layout-md;
    backdrop-filter: blur(4px);
    opacity: 0;
    transition: opacity $semantic-motion-duration-normal $semantic-motion-easing-ease;
    
    &--visible {
      opacity: 1;
    }
    
    &--entering {
      animation: backdrop-fade-in $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
    
    &--leaving {
      animation: backdrop-fade-out $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
  }

  // Modal Container
  &__container {
    background: $semantic-color-surface-primary;
    border-radius: $semantic-border-radius-lg;
    box-shadow: $semantic-shadow-elevation-3;
    max-width: 90vw;
    max-height: 90vh;
    overflow: hidden;
    transform: scale(0.8) translateY(20px);
    opacity: 0;
    transition: all $semantic-motion-duration-normal $semantic-motion-easing-ease;
    
    &--visible {
      transform: scale(1) translateY(0);
      opacity: 1;
    }
    
    &--entering {
      animation: modal-slide-in $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
    
    &--leaving {
      animation: modal-slide-out $semantic-motion-duration-normal $semantic-motion-easing-ease;
    }
  }

  // Size Variants
  &--sm {
    .ui-modal__container {
      width: 400px;
    }
  }
  
  &--md {
    .ui-modal__container {
      width: 600px;
    }
  }
  
  &--lg {
    .ui-modal__container {
      width: 800px;
    }
  }
  
  &--xl {
    .ui-modal__container {
      width: 1000px;
    }
  }
  
  &--fullscreen {
    .ui-modal__backdrop {
      padding: 0;
    }
    
    .ui-modal__container {
      width: 100vw;
      height: 100vh;
      max-width: none;
      max-height: none;
      border-radius: 0;
    }
  }

  // Modal Header
  &__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: $semantic-spacing-component-lg;
    border-bottom: 1px solid $semantic-color-outline;
    background: $semantic-color-surface-primary;
    
    &--no-border {
      border-bottom: none;
    }
  }

  &__title {
    font-size: $semantic-typography-heading-h4-size;
    font-weight: $semantic-typography-font-weight-semibold;
    color: $semantic-color-on-surface;
    margin: 0;
    line-height: 1.4;
  }

  &__close-button {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border: none;
    background: transparent;
    border-radius: $semantic-border-radius-md;
    color: $semantic-color-on-surface-variant;
    cursor: pointer;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &:hover {
      background: $semantic-color-surface-variant;
      color: $semantic-color-on-surface;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-primary;
      outline-offset: 2px;
    }
    
    &:active {
      background: $semantic-color-surface-container;
    }
  }

  // Modal Body
  &__body {
    padding: $semantic-spacing-component-lg;
    overflow-y: auto;
    max-height: calc(90vh - 200px);
    
    &--no-padding {
      padding: 0;
    }
    
    &--scrollable {
      overflow-y: auto;
    }
  }

  &__content {
    color: $semantic-color-on-surface;
    font-size: $semantic-typography-font-size-md;
    line-height: 1.6;
  }

  // Modal Footer
  &__footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: $semantic-spacing-component-sm;
    padding: $semantic-spacing-component-lg;
    border-top: 1px solid $semantic-color-outline;
    background: $semantic-color-surface-primary;
    
    &--no-border {
      border-top: none;
    }
    
    &--center {
      justify-content: center;
    }
    
    &--start {
      justify-content: flex-start;
    }
    
    &--between {
      justify-content: space-between;
    }
  }

  // State Variants
  &--loading {
    .ui-modal__body {
      display: flex;
      align-items: center;
      justify-content: center;
      min-height: 200px;
    }
  }

  &--danger {
    .ui-modal__header {
      background: $semantic-color-container-error;
      border-bottom-color: $semantic-color-error;
    }
    
    .ui-modal__title {
      color: $semantic-color-on-container-error;
    }
  }

  &--warning {
    .ui-modal__header {
      background: rgba($semantic-color-warning, 0.1);
      border-bottom-color: $semantic-color-warning;
    }
    
    .ui-modal__title {
      color: $semantic-color-on-warning;
    }
  }

  &--success {
    .ui-modal__header {
      background: rgba($semantic-color-success, 0.1);
      border-bottom-color: $semantic-color-success;
    }
    
    .ui-modal__title {
      color: $semantic-color-on-success;
    }
  }

  // Loading Spinner
  &__loader {
    display: inline-block;
    width: 24px;
    height: 24px;
    border: 2px solid $semantic-color-outline;
    border-radius: 50%;
    border-top-color: $semantic-color-primary;
    animation: modal-spin 1s linear infinite;
  }
  
  // Dark Mode Support
  :host-context(.dark-theme) & {
    &__backdrop {
      background: rgba(0, 0, 0, 0.8);
    }
  }
  
  // Responsive Design
  @media (max-width: 768px) {
    &__backdrop {
      padding: $semantic-spacing-component-sm;
    }
    
    &__container {
      width: 100% !important;
      max-width: none;
      margin: 0;
      border-radius: $semantic-border-radius-md;
    }
    
    &__header {
      padding: $semantic-spacing-component-md;
    }
    
    &__body {
      padding: $semantic-spacing-component-md;
      max-height: calc(90vh - 160px);
    }
    
    &__footer {
      padding: $semantic-spacing-component-md;
      flex-direction: column;
      gap: $semantic-spacing-component-xs;
      
      .ui-button {
        width: 100%;
      }
    }
    
    &__title {
      font-size: $semantic-typography-heading-h5-size;
    }
  }
}

// Animations
@keyframes backdrop-fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes backdrop-fade-out {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
  }
}

@keyframes modal-slide-in {
  from {
    transform: scale(0.8) translateY(20px);
    opacity: 0;
  }
  to {
    transform: scale(1) translateY(0);
    opacity: 1;
  }
}

@keyframes modal-slide-out {
  from {
    transform: scale(1) translateY(0);
    opacity: 1;
  }
  to {
    transform: scale(0.8) translateY(20px);
    opacity: 0;
  }
}

@keyframes modal-spin {
  to {
    transform: rotate(360deg);
  }
}yxk3o2A8#(5E4sF Rsx?.import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, OnInit, OnDestroy, inject, ElementRef, HostListener } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faXmark } from '@fortawesome/free-solid-svg-icons';
import { signal, computed } from '@angular/core';

type ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'fullscreen';
type ModalVariant = 'default' | 'danger' | 'warning' | 'success';
type FooterAlignment = 'start' | 'center' | 'end' | 'between';

export interface ModalConfig {
  size?: ModalSize;
  variant?: ModalVariant;
  closable?: boolean;
  backdropClosable?: boolean;
  escapeClosable?: boolean;
  showHeader?: boolean;
  showFooter?: boolean;
  headerBorder?: boolean;
  footerBorder?: boolean;
  bodyPadding?: boolean;
  bodyScrollable?: boolean;
  footerAlignment?: FooterAlignment;
  preventBodyScroll?: boolean;
  focusTrap?: boolean;
}

@Component({
  selector: 'ui-modal',
  standalone: true,
  imports: [CommonModule, FontAwesomeModule],
  changeDetection: ChangeDetectionStrategy.Default,
  encapsulation: ViewEncapsulation.None,
  template: `
    @if (isVisible()) {
      <div 
        class="ui-modal"
        [class]="getComponentClasses()"
        role="dialog"
        [attr.aria-modal]="true"
        [attr.aria-labelledby]="titleId"
        [attr.aria-describedby]="contentId"
        (keydown)="handleKeydown($event)"
      >
        <!-- Modal Backdrop -->
        <div 
          class="ui-modal__backdrop"
          [class.ui-modal__backdrop--visible]="isVisible()"
          [class.ui-modal__backdrop--entering]="isEntering()"
          [class.ui-modal__backdrop--leaving]="isLeaving()"
          (click)="handleBackdropClick($event)"
        >
          <!-- Modal Container -->
          <div 
            class="ui-modal__container"
            [class.ui-modal__container--visible]="isVisible()"
            [class.ui-modal__container--entering]="isEntering()"
            [class.ui-modal__container--leaving]="isLeaving()"
            (click)="$event.stopPropagation()"
            #modalContainer
          >
            <!-- Modal Header -->
            @if (showHeader) {
              <div 
                class="ui-modal__header"
                [class.ui-modal__header--no-border]="!headerBorder"
              >
                <h2 
                  class="ui-modal__title" 
                  [id]="titleId"
                >
                  @if (title) {
                    {{ title }}
                  } @else {
                    <ng-content select="[slot='title']"></ng-content>
                  }
                </h2>
                
                @if (closable) {
                  <button 
                    type="button"
                    class="ui-modal__close-button"
                    (click)="close()"
                    [attr.aria-label]="closeAriaLabel"
                    #closeButton
                  >
                    <fa-icon [icon]="faXmark"></fa-icon>
                  </button>
                }
              </div>
            }

            <!-- Modal Body -->
            <div 
              class="ui-modal__body"
              [class.ui-modal__body--no-padding]="!bodyPadding"
              [class.ui-modal__body--scrollable]="bodyScrollable"
              [id]="contentId"
            >
              @if (loading) {
                <div class="ui-modal__loader" role="status" aria-label="Loading"></div>
              } @else {
                <div class="ui-modal__content">
                  <ng-content></ng-content>
                </div>
              }
            </div>

            <!-- Modal Footer -->
            @if (showFooter) {
              <div 
                class="ui-modal__footer"
                [class.ui-modal__footer--no-border]="!footerBorder"
                [class.ui-modal__footer--start]="footerAlignment === 'start'"
                [class.ui-modal__footer--center]="footerAlignment === 'center'"
                [class.ui-modal__footer--between]="footerAlignment === 'between'"
              >
                <ng-content select="[slot='footer']"></ng-content>
              </div>
            }
          </div>
        </div>
      </div>
    }
  `,
  styleUrl: './modal.component.scss'
})
export class ModalComponent implements OnInit, OnDestroy {
  // Dependencies
  private elementRef = inject(ElementRef);

  // Icons
  readonly faXmark = faXmark;

  // Inputs
  @Input() size: ModalSize = 'md';
  @Input() variant: ModalVariant = 'default';
  @Input() title = '';
  @Input() loading = false;
  @Input() closable = true;
  @Input() backdropClosable = true;
  @Input() escapeClosable = true;
  @Input() showHeader = true;
  @Input() showFooter = false;
  @Input() headerBorder = true;
  @Input() footerBorder = true;
  @Input() bodyPadding = true;
  @Input() bodyScrollable = true;
  @Input() footerAlignment: FooterAlignment = 'end';
  @Input() preventBodyScroll = true;
  @Input() focusTrap = true;
  @Input() closeAriaLabel = 'Close modal';

  // State Inputs
  @Input() set open(value: boolean) {
    if (value !== this._open()) {
      this._open.set(value);
      if (value) {
        this.show();
      } else {
        this.hide();
      }
    }
  }

  get open(): boolean {
    return this._open();
  }

  // Outputs
  @Output() openChange = new EventEmitter<boolean>();
  @Output() opened = new EventEmitter<void>();
  @Output() closed = new EventEmitter<void>();
  @Output() backdropClicked = new EventEmitter<void>();
  @Output() escapePressed = new EventEmitter<void>();

  // Internal state signals
  private _open = signal(false);
  private _entering = signal(false);
  private _leaving = signal(false);

  // Computed signals
  readonly isVisible = computed(() => this._open() || this._entering() || this._leaving());
  readonly isEntering = computed(() => this._entering());
  readonly isLeaving = computed(() => this._leaving());

  // Internal properties
  private originalBodyOverflow = '';
  private originalBodyPaddingRight = '';
  private focusableElements: HTMLElement[] = [];
  private previousActiveElement: Element | null = null;
  private currentFocusIndex = 0;

  // Unique IDs for accessibility
  readonly titleId = `modal-title-${Math.random().toString(36).substr(2, 9)}`;
  readonly contentId = `modal-content-${Math.random().toString(36).substr(2, 9)}`;

  ngOnInit(): void {
    if (this.open) {
      this.show();
    }
  }

  getComponentClasses(): string {
    const classes = [
      'ui-modal',
      `ui-modal--${this.size}`,
      `ui-modal--${this.variant}`
    ];
    
    if (this.loading) {
      classes.push('ui-modal--loading');
    }
    
    return classes.join(' ');
  }

  ngOnDestroy(): void {
    this.restoreBodyScroll();
    this.restoreFocus();
  }

  /**
   * Shows the modal with animation
   */
  show(): void {
    if (this._open()) return;

    this.preventBodyScrollIfEnabled();
    this.storePreviousFocus();
    
    this._open.set(true);
    this._entering.set(true);
    this.openChange.emit(true);

    // Animation timing
    setTimeout(() => {
      this._entering.set(false);
      this.setupFocusTrap();
      this.opened.emit();
    }, 300);
  }

  /**
   * Hides the modal with animation
   */
  hide(): void {
    if (!this._open()) return;

    this._leaving.set(true);

    // Animation timing
    setTimeout(() => {
      this._open.set(false);
      this._leaving.set(false);
      this.restoreBodyScroll();
      this.restoreFocus();
      this.openChange.emit(false);
      this.closed.emit();
    }, 300);
  }

  /**
   * Closes the modal (alias for hide)
   */
  close(): void {
    if (this.closable) {
      this.hide();
    }
  }

  /**
   * Toggles modal visibility
   */
  toggle(): void {
    if (this._open()) {
      this.hide();
    } else {
      this.show();
    }
  }

  /**
   * Handles backdrop click
   */
  handleBackdropClick(event: Event): void {
    if (this.backdropClosable) {
      this.close();
      this.backdropClicked.emit();
    }
  }

  /**
   * Handles keyboard events
   */
  handleKeydown(event: KeyboardEvent): void {
    if (event.key === 'Escape' && this.escapeClosable) {
      event.preventDefault();
      this.close();
      this.escapePressed.emit();
      return;
    }

    // Focus trap handling
    if (this.focusTrap && (event.key === 'Tab')) {
      this.handleTabKeyForFocusTrap(event);
    }
  }

  /**
   * Global keyboard listener for ESC key
   */
  @HostListener('document:keydown', ['$event'])
  onDocumentKeydown(event: KeyboardEvent): void {
    if (this._open() && event.key === 'Escape' && this.escapeClosable) {
      event.preventDefault();
      this.close();
      this.escapePressed.emit();
    }
  }

  /**
   * Prevents body scroll when modal is open
   */
  private preventBodyScrollIfEnabled(): void {
    if (!this.preventBodyScroll) return;

    const body = document.body;
    const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;

    this.originalBodyOverflow = body.style.overflow;
    this.originalBodyPaddingRight = body.style.paddingRight;

    body.style.overflow = 'hidden';
    if (scrollbarWidth > 0) {
      body.style.paddingRight = `${scrollbarWidth}px`;
    }
  }

  /**
   * Restores body scroll
   */
  private restoreBodyScroll(): void {
    if (!this.preventBodyScroll) return;

    const body = document.body;
    body.style.overflow = this.originalBodyOverflow;
    body.style.paddingRight = this.originalBodyPaddingRight;
  }

  /**
   * Stores the currently focused element
   */
  private storePreviousFocus(): void {
    this.previousActiveElement = document.activeElement;
  }

  /**
   * Restores focus to the previously focused element
   */
  private restoreFocus(): void {
    if (this.previousActiveElement && 'focus' in this.previousActiveElement) {
      (this.previousActiveElement as HTMLElement).focus();
    }
  }

  /**
   * Sets up focus trap within modal
   */
  private setupFocusTrap(): void {
    if (!this.focusTrap) return;

    setTimeout(() => {
      this.updateFocusableElements();
      if (this.focusableElements.length > 0) {
        this.focusableElements[0].focus();
        this.currentFocusIndex = 0;
      }
    }, 100);
  }

  /**
   * Updates the list of focusable elements
   */
  private updateFocusableElements(): void {
    const modalElement = this.elementRef.nativeElement.querySelector('.ui-modal__container');
    if (!modalElement) return;

    const focusableSelectors = [
      'button:not([disabled])',
      'input:not([disabled])',
      'textarea:not([disabled])',
      'select:not([disabled])',
      'a[href]',
      '[tabindex]:not([tabindex="-1"])',
      '[contenteditable="true"]'
    ].join(', ');

    this.focusableElements = Array.from(
      modalElement.querySelectorAll(focusableSelectors)
    ) as HTMLElement[];
  }

  /**
   * Handles Tab key for focus trapping
   */
  private handleTabKeyForFocusTrap(event: KeyboardEvent): void {
    if (this.focusableElements.length === 0) return;

    const isShiftTab = event.shiftKey;
    
    if (isShiftTab) {
      // Shift + Tab - move to previous focusable element
      this.currentFocusIndex = this.currentFocusIndex <= 0 
        ? this.focusableElements.length - 1 
        : this.currentFocusIndex - 1;
    } else {
      // Tab - move to next focusable element
      this.currentFocusIndex = this.currentFocusIndex >= this.focusableElements.length - 1 
        ? 0 
        : this.currentFocusIndex + 1;
    }

    event.preventDefault();
    this.focusableElements[this.currentFocusIndex].focus();
  }

  /**
   * Public API method to apply configuration
   */
  configure(config: ModalConfig): void {
    Object.assign(this, config);
  }
}N	Mx3-z_ɲºřUJ d~NqIxYbQfb^	X
ʆu'de͢e"'I , Ox Li9yc
R`:x. export * from './overlay-container.component';x@use "../../../../../../ui-design-system/src/styles/semantic/index" as tokens;

.ui-overlay-container {
  // Core Structure
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: var(--overlay-z-index, tokens.$semantic-z-index-overlay);
  
  // Initial state (hidden)
  visibility: hidden;
  opacity: 0;
  pointer-events: none;
  
  // Transitions
  transition: opacity tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease,
              visibility tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease;

  // Visible state
  &--visible {
    visibility: visible;
    opacity: 1;
    pointer-events: auto;
  }

  // Animation states
  &--entering {
    visibility: visible;
    opacity: 1;
    pointer-events: auto;
    
    .ui-overlay-container__content {
      animation: overlayEnter tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease forwards;
    }
  }

  &--leaving {
    .ui-overlay-container__content {
      animation: overlayLeave tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease forwards;
    }
  }

  // Position Variants
  &--top {
    align-items: flex-start;
    padding-top: tokens.$semantic-spacing-layout-md;
  }

  &--bottom {
    align-items: flex-end;
    padding-bottom: tokens.$semantic-spacing-layout-md;
  }

  &--left {
    justify-content: flex-start;
    padding-left: tokens.$semantic-spacing-layout-md;
  }

  &--right {
    justify-content: flex-end;
    padding-right: tokens.$semantic-spacing-layout-md;
  }

  &--top-left {
    align-items: flex-start;
    justify-content: flex-start;
    padding: tokens.$semantic-spacing-layout-md;
  }

  &--top-right {
    align-items: flex-start;
    justify-content: flex-end;
    padding: tokens.$semantic-spacing-layout-md;
  }

  &--bottom-left {
    align-items: flex-end;
    justify-content: flex-start;
    padding: tokens.$semantic-spacing-layout-md;
  }

  &--bottom-right {
    align-items: flex-end;
    justify-content: flex-end;
    padding: tokens.$semantic-spacing-layout-md;
  }

  // Size Variants
  &--sm .ui-overlay-container__content {
    max-width: tokens.$semantic-sizing-modal-width-sm;
    max-height: 50vh;
  }

  &--md .ui-overlay-container__content {
    max-width: tokens.$semantic-sizing-modal-width-md;
    max-height: 70vh;
  }

  &--lg .ui-overlay-container__content {
    max-width: tokens.$semantic-sizing-modal-width-lg;
    max-height: 80vh;
  }

  &--xl .ui-overlay-container__content {
    max-width: tokens.$semantic-sizing-modal-width-xl;
    max-height: 90vh;
  }

  &--fullscreen .ui-overlay-container__content {
    width: 100vw;
    height: 100vh;
    max-width: none;
    max-height: none;
  }

  // Variant Styles
  &--modal {
    z-index: tokens.$semantic-z-index-modal;
    
    .ui-overlay-container__backdrop {
      background: tokens.$semantic-color-backdrop;
    }
  }

  &--popover {
    z-index: tokens.$semantic-z-index-popover;
    
    .ui-overlay-container__content {
      box-shadow: tokens.$semantic-shadow-popover;
    }
  }

  &--elevated {
    z-index: tokens.$semantic-z-index-elevated;
    
    .ui-overlay-container__content {
      box-shadow: tokens.$semantic-shadow-elevation-3;
    }
  }

  &--floating {
    z-index: tokens.$semantic-z-index-floating;
    
    .ui-overlay-container__content {
      box-shadow: tokens.$semantic-shadow-elevation-2;
    }
  }

  // Backdrop with blur effect
  &--backdrop-blur {
    backdrop-filter: blur(tokens.$semantic-glass-blur-md);
    -webkit-backdrop-filter: blur(tokens.$semantic-glass-blur-md);
  }

  // Backdrop Element
  &__backdrop {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: tokens.$semantic-color-backdrop;
    opacity: 0;
    transition: opacity tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease;
    z-index: -1;

    &--visible {
      opacity: tokens.$semantic-opacity-backdrop;
    }

    &--entering {
      opacity: tokens.$semantic-opacity-backdrop;
    }

    &--leaving {
      opacity: 0;
    }

    &--blur {
      backdrop-filter: blur(tokens.$semantic-glass-blur-sm);
      -webkit-backdrop-filter: blur(tokens.$semantic-glass-blur-sm);
    }
  }

  // Content Element
  &__content {
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
    min-height: 0;
    max-width: calc(100vw - #{tokens.$semantic-spacing-layout-lg});
    max-height: calc(100vh - #{tokens.$semantic-spacing-layout-lg});
    margin: tokens.$semantic-spacing-layout-sm;
    
    // Default styling
    background: tokens.$semantic-color-surface-primary;
    border: tokens.$semantic-border-card-width solid tokens.$semantic-color-border-primary;
    border-radius: tokens.$semantic-border-card-radius;
    box-shadow: tokens.$semantic-shadow-elevation-2;
    color: tokens.$semantic-color-text-primary;
    
    // Transform and scale for animations
    transform: scale(0.95) translateY(tokens.$semantic-spacing-component-md);
    opacity: 0;
    transition: transform tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease,
                opacity tokens.$semantic-motion-duration-fast tokens.$semantic-motion-easing-ease;

    &--visible {
      transform: scale(1) translateY(0);
      opacity: 1;
    }

    &--entering {
      transform: scale(1) translateY(0);
      opacity: 1;
    }

    &--leaving {
      transform: scale(0.95) translateY(tokens.$semantic-spacing-component-md);
      opacity: 0;
    }

    // Offset positioning
    .ui-overlay-container:not(.ui-overlay-container--center) & {
      transform: translateX(var(--overlay-offset-x, 0)) translateY(var(--overlay-offset-y, 0));
    }
  }

  // Dark Mode Support
  :host-context(.dark-theme) & {
    .ui-overlay-container__content {
      background: tokens.$semantic-color-surface-primary;
      border-color: tokens.$semantic-color-border-primary;
      box-shadow: tokens.$semantic-shadow-elevation-2;
    }
  }

  // Responsive Design
  @media (max-width: tokens.$semantic-breakpoint-md - 1) {
    padding: tokens.$semantic-spacing-layout-sm;
    
    .ui-overlay-container__content {
      margin: tokens.$semantic-spacing-component-xs;
      max-width: calc(100vw - #{tokens.$semantic-spacing-layout-md});
      max-height: calc(100vh - #{tokens.$semantic-spacing-layout-md});
    }

    &--fullscreen .ui-overlay-container__content {
      border-radius: 0;
      margin: 0;
    }
  }

  @media (max-width: tokens.$semantic-breakpoint-sm - 1) {
    // Mobile adjustments
    &:not(.ui-overlay-container--fullscreen) {
      align-items: flex-end;
      
      .ui-overlay-container__content {
        width: 100%;
        max-width: none;
        margin: 0;
        border-bottom-left-radius: 0;
        border-bottom-right-radius: 0;
      }
    }
  }
}

// Keyframe Animations
@keyframes overlayEnter {
  0% {
    transform: scale(0.95) translateY(tokens.$semantic-spacing-component-md);
    opacity: 0;
  }
  100% {
    transform: scale(1) translateY(0);
    opacity: 1;
  }
}

@keyframes overlayLeave {
  0% {
    transform: scale(1) translateY(0);
    opacity: 1;
  }
  100% {
    transform: scale(0.95) translateY(tokens.$semantic-spacing-component-md);
    opacity: 0;
  }
}

// Focus trap styling
.ui-overlay-container:focus-within {
  .ui-overlay-container__content {
    outline: none;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .ui-overlay-container {
    transition: none;
    
    .ui-overlay-container__backdrop,
    .ui-overlay-container__content {
      transition: none;
      animation: none;
    }
  }
  
  @keyframes overlayEnter {
    0%, 100% {
      transform: scale(1) translateY(0);
      opacity: 1;
    }
  }
  
  @keyframes overlayLeave {
    0%, 100% {
      transform: scale(1) translateY(0);
      opacity: 0;
    }
  }
}#xjg7A8#(5E4s[9 NxK(/*QRH+UP///K-K-K+Q Mӿx_(@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-popover {
  position: absolute;
  display: block;
  opacity: 0;
  transform: scale(0.95);
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  z-index: $semantic-layer-dropdown;
  will-change: opacity, transform;

  // Core Structure
  background: $semantic-color-surface-primary;
  border: $semantic-border-card-width solid $semantic-color-border-primary;
  border-radius: $semantic-border-card-radius;
  box-shadow: $semantic-shadow-popover;
  
  // Typography
  font-size: $semantic-typography-font-size-sm;
  color: $semantic-color-text-primary;
  line-height: $semantic-typography-line-height-normal;

  // Size Variants
  &--sm {
    min-width: $semantic-sizing-card-width-sm;
    max-width: $semantic-sizing-modal-width-sm;
    padding: $semantic-spacing-component-xs;
  }

  &--md {
    min-width: $semantic-sizing-card-width-md;
    max-width: $semantic-sizing-modal-width-md;
    padding: $semantic-spacing-component-sm;
  }

  &--lg {
    min-width: $semantic-sizing-card-width-lg;
    max-width: $semantic-sizing-modal-width-lg;
    padding: $semantic-spacing-component-md;
  }

  // Position Variants
  &--top {
    transform-origin: bottom center;
    margin-bottom: $semantic-spacing-component-sm;
  }

  &--bottom {
    transform-origin: top center;
    margin-top: $semantic-spacing-component-sm;
  }

  &--left {
    transform-origin: center right;
    margin-right: $semantic-spacing-component-sm;
  }

  &--right {
    transform-origin: center left;
    margin-left: $semantic-spacing-component-sm;
  }

  &--top-start {
    transform-origin: bottom left;
    margin-bottom: $semantic-spacing-component-sm;
  }

  &--top-end {
    transform-origin: bottom right;
    margin-bottom: $semantic-spacing-component-sm;
  }

  &--bottom-start {
    transform-origin: top left;
    margin-top: $semantic-spacing-component-sm;
  }

  &--bottom-end {
    transform-origin: top right;
    margin-top: $semantic-spacing-component-sm;
  }

  // Variant Styles
  &--default {
    background: $semantic-color-surface-primary;
    border-color: $semantic-color-border-primary;
  }

  &--elevated {
    background: $semantic-color-surface-primary;
    border: none;
    box-shadow: $semantic-shadow-elevation-3;
  }

  &--floating {
    background: $semantic-color-surface-secondary;
    border-color: $semantic-color-border-subtle;
    backdrop-filter: blur(8px);
  }

  &--menu {
    padding: $semantic-spacing-content-line-tight;
    background: $semantic-color-surface-primary;
  }

  &--tooltip {
    padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    background: $semantic-color-surface-dim;
    color: $semantic-color-text-inverse;
    border: none;
    font-size: $semantic-typography-font-size-xs;
    box-shadow: $semantic-shadow-elevation-2;
  }

  // State Variants
  &--visible {
    opacity: 1;
    transform: scale(1);
    pointer-events: auto;
  }

  &--entering {
    opacity: 0;
    transform: scale(0.95);
  }

  &--leaving {
    opacity: 0;
    transform: scale(0.95);
    transition-duration: $semantic-motion-duration-fast;
  }

  &--disabled {
    opacity: 0.5;
    pointer-events: none;
  }

  // Arrow/Triangle
  &__arrow {
    position: absolute;
    width: 0;
    height: 0;
    border-style: solid;
    pointer-events: none;

    // Arrow positioning and styling based on popover position
    .ui-popover--top & {
      bottom: calc(-1 * $semantic-spacing-component-sm);
      left: 50%;
      transform: translateX(-50%);
      border-width: $semantic-spacing-component-sm $semantic-spacing-component-sm 0 $semantic-spacing-component-sm;
      border-color: $semantic-color-surface-primary transparent transparent transparent;
      
      &::before {
        content: '';
        position: absolute;
        top: calc(-1 * $semantic-spacing-component-sm - 1px);
        left: calc(-1 * $semantic-spacing-component-sm);
        border-width: $semantic-spacing-component-sm $semantic-spacing-component-sm 0 $semantic-spacing-component-sm;
        border-color: $semantic-color-border-primary transparent transparent transparent;
        border-style: solid;
      }
    }

    .ui-popover--bottom & {
      top: calc(-1 * $semantic-spacing-component-sm);
      left: 50%;
      transform: translateX(-50%);
      border-width: 0 $semantic-spacing-component-sm $semantic-spacing-component-sm $semantic-spacing-component-sm;
      border-color: transparent transparent $semantic-color-surface-primary transparent;

      &::before {
        content: '';
        position: absolute;
        top: calc(-1px);
        left: calc(-1 * $semantic-spacing-component-sm);
        border-width: 0 $semantic-spacing-component-sm $semantic-spacing-component-sm $semantic-spacing-component-sm;
        border-color: transparent transparent $semantic-color-border-primary transparent;
        border-style: solid;
      }
    }

    .ui-popover--left & {
      right: calc(-1 * $semantic-spacing-component-sm);
      top: 50%;
      transform: translateY(-50%);
      border-width: $semantic-spacing-component-sm 0 $semantic-spacing-component-sm $semantic-spacing-component-sm;
      border-color: transparent transparent transparent $semantic-color-surface-primary;

      &::before {
        content: '';
        position: absolute;
        top: calc(-1 * $semantic-spacing-component-sm);
        left: calc(-1 * $semantic-spacing-component-sm - 1px);
        border-width: $semantic-spacing-component-sm 0 $semantic-spacing-component-sm $semantic-spacing-component-sm;
        border-color: transparent transparent transparent $semantic-color-border-primary;
        border-style: solid;
      }
    }

    .ui-popover--right & {
      left: calc(-1 * $semantic-spacing-component-sm);
      top: 50%;
      transform: translateY(-50%);
      border-width: $semantic-spacing-component-sm $semantic-spacing-component-sm $semantic-spacing-component-sm 0;
      border-color: transparent $semantic-color-surface-primary transparent transparent;

      &::before {
        content: '';
        position: absolute;
        top: calc(-1 * $semantic-spacing-component-sm);
        left: calc(-1px);
        border-width: $semantic-spacing-component-sm $semantic-spacing-component-sm $semantic-spacing-component-sm 0;
        border-color: transparent $semantic-color-border-primary transparent transparent;
        border-style: solid;
      }
    }

    // Hide arrow for elevated and floating variants
    .ui-popover--elevated &,
    .ui-popover--floating & {
      display: none;
    }
  }

  // Content Area
  &__content {
    position: relative;
    width: 100%;
    max-height: $semantic-sizing-modal-height-max;
    overflow: auto;
    
    // Scrollbar styling
    scrollbar-width: thin;
    scrollbar-color: $semantic-color-border-subtle $semantic-color-surface-secondary;

    &::-webkit-scrollbar {
      width: 6px;
    }

    &::-webkit-scrollbar-track {
      background: $semantic-color-surface-secondary;
      border-radius: $semantic-border-input-radius;
    }

    &::-webkit-scrollbar-thumb {
      background: $semantic-color-border-subtle;
      border-radius: $semantic-border-input-radius;

      &:hover {
        background: $semantic-color-border-primary;
      }
    }
  }

  // Header (optional)
  &__header {
    padding: $semantic-spacing-component-sm;
    border-bottom: $semantic-border-card-width solid $semantic-color-border-subtle;
    margin-bottom: $semantic-spacing-content-line-tight;

    &:last-child {
      margin-bottom: 0;
    }
  }

  &__title {
    font-size: $semantic-typography-font-size-md;
    font-weight: $semantic-typography-font-weight-semibold;
    color: $semantic-color-text-primary;
    margin: 0;
  }

  // Footer (optional)
  &__footer {
    padding: $semantic-spacing-component-sm;
    border-top: $semantic-border-card-width solid $semantic-color-border-subtle;
    margin-top: $semantic-spacing-content-line-tight;
    display: flex;
    gap: $semantic-spacing-content-line-tight;
    justify-content: flex-end;

    &:first-child {
      margin-top: 0;
    }

    &--start {
      justify-content: flex-start;
    }

    &--center {
      justify-content: center;
    }

    &--between {
      justify-content: space-between;
    }
  }

  // Interactive states for focusable content
  &:not(.ui-popover--disabled) {
    &:focus-within {
      box-shadow: $semantic-shadow-popover, 0 0 0 2px $semantic-color-focus;
    }
  }

  // Responsive adjustments
  @media (max-width: $semantic-breakpoint-sm - 1) {
    // On mobile, popovers should be more prominent
    &:not(.ui-popover--tooltip) {
      min-width: auto;
      max-width: calc(100vw - #{$semantic-spacing-layout-section-xs});
      
      &.ui-popover--sm {
        padding: $semantic-spacing-component-sm;
      }
    }
  }

  // Dark mode support
  :host-context(.dark-theme) & {
    &--default {
      background: $semantic-color-surface-primary;
      border-color: $semantic-color-border-primary;
    }

    &--elevated {
      background: $semantic-color-surface-primary;
      box-shadow: $semantic-shadow-elevation-3;
    }

    &--floating {
      background: $semantic-color-surface-secondary;
      border-color: $semantic-color-border-subtle;
    }
  }

  // Animation variants for different entrance effects
  &--slide-in {
    &.ui-popover--top {
      transform: translateY(-10px) scale(0.95);
      
      &.ui-popover--visible {
        transform: translateY(0) scale(1);
      }
    }

    &.ui-popover--bottom {
      transform: translateY(10px) scale(0.95);
      
      &.ui-popover--visible {
        transform: translateY(0) scale(1);
      }
    }

    &.ui-popover--left {
      transform: translateX(-10px) scale(0.95);
      
      &.ui-popover--visible {
        transform: translateX(0) scale(1);
      }
    }

    &.ui-popover--right {
      transform: translateX(10px) scale(0.95);
      
      &.ui-popover--visible {
        transform: translateX(0) scale(1);
      }
    }
  }
}

// Popover backdrop (if needed for modal-like behavior)
.ui-popover-backdrop {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: transparent;
  z-index: calc($semantic-layer-dropdown - 1);
  pointer-events: auto;
}O mxp#`gqFbQjniFs Zö	x<o7`|Jj$%ŞIlؤ67HGJhF779b\Q2i\M˾~UjZ?VFϖEfNY5秼Ӷm|~?d~wVMXN*SuE jXfꟀ(vygCW9ox<Ye>dojѾ-D+ް6k%Z`ٴnxppYջ:_|N/N~~wUj¹+E1r`y^{zU̎XW=M궭gghl;I5ޮqQ.KZ_YSdU9e߂hѬAi՜jȪ˶X9hMbY.pPӵ <YJU@ljPլ/{<zX38gvBs-Qir]!I'!ӲY4:ɦ^$g 9^5M}VHl֗V
L=	lVXy{#RѰTGLݪx_iS;Э1MifRo`vhZ	./#.69mhEzCi*J = ͮ9љ=785A_Tk%];#`˗+B~{YXɦhĴY^!XŮIհ>/n-4hߊfs߁`hh!]ܗ'zpKX?$MƁ?~HԼ>WmV׶\Elb^F_/xx X!$evN8ވg+84rəc8z[eE^H_s#(
೪Xʓp/\x+,Y9΢?E'bMVY,G5xsI#Y6cpnjׁc.ل =Z%9CWu9S8<	(#WOf#!lR@23HyDl}^U0943K8<M?eM[G_F=;nFnaSp%_T$>e~wKcRdih%[HeF;.JD>GB"&sY{xxl{KHG8:
к\o baqis_S׺n&A:I'-"תF˳* <v5Qm;.Q&ˋl-ơ_(;sS?Sl:Nj%ǶQ`OW[+WiϞSj\Ȥ@?Ƹ)gHoKڨj׃ӓ5j12 j*zi={X`lx0K7Wު?] 7KFU0;eznY0lCK
sN`F
ț#LbMͅuc_>ؘ1iʋ~L!f3E$>Fm}	S?'m"&5ĺ%dMeLcΞk:>*'b
Y{}dᅀM3H=ΉШ>x`cVuA6+T:`32iJobhi7xEh1}|A@ie;<
EuSt )JO<H:w^PمLZp[yMڇuĭPׂˑh5ˆ^Κ.f!~f )MY']nRFn6hXڰNPGPGNt׊Ը{f*1XsqS۱R5uE|k\رcB%q(%/c#]MOxl:D5{[	pAV]0S!+1]w&a@&L	;QUk\ѕj3BZ<EdkH&*ZS0綆`=OY7J]ly46"]p6,B
G(P7M/$F.k&z)FZi0RwC_VuR~RL8E=GFLPDwE;]s&N3@GR,3(M14;,]I*G:MwY'pn|r퓐4z!R2!Tͩ3'5U>ĊR&VзIWV'EXCx۵%C҃Nfd2\ƌW7nz7[} 纬d`&WnJ]u#qu6P=Ԟ89 q7i:*fgg&q5Q0zǼ9d}>*C$mP&T~eKσQ\,yY&d 2=*&<	vPgZ*6vyK5.1q27VL6+WU=&"NH=~_A	>]pcwc =Cyx:Lz*j{̶TJcC)JL٠MDQ+ɬi_Df.{B,.9IT
BKht-*_P#cCjdARY<v(cdt-Sr$&o
pU*E߱ҡ#ȡF5 P^_7%Jn,,^jf?UJnNAT%t.5TpNK-N'<L^_;&Ctqz4Q[x-(Ĉ˛.>UbXYM-*gXrSMVTWGj	~ò5$5.$A',&HòBˀ!>Cg)z'Gn+m͚o z* o!HZ=}aJJGeN(4N)n谾倝^G0cܸW!s3<S/Z\v"ӿ	C<W7t'C3aH88$EՙZwhd79rqH Vg0i0HoP&$դ#p^EZjj7a47ji,Aj#6LCfE[ͻ#)
ht:U8E&YhvHONF${V]'DBqd
)%Փ]d|&EC7mĈč!OT %E;O/שTH<_Ly369@^!W-YI؀e"NbQSX=Rw[^tsAM/|\.Qyp|8M/||īi	FpO'CjxV @e8jNgaśUpQ*~HzuiikY9SvHPے>e_8_1Q/1s.lQ}c;}	-plĔKrUҰ״3R8h$`(mطm.	2CwbfqIbqB73ze[xJ}I&>< t\pfԅoGށM&D|?P/>n2R.	%Că{D*}(R,'ވܮ	gv[-W__S`ylvA;G݂W݁m>%&m{oI@_>(R̈́cIn|lԇTx6>RS)0iy-%-Rt~72o5<#NzXsP;&CnAT{ݷTU*xZegoh&u~4{)"I*賜PLoj@5ŧL8wE!/HH;֚B5bjZB?db?</.+XhKRm}qpW\޺NzQK_)ҽ1!`Oekޞ)[hYW6ųVx'YiY<)gNpư_/{{`Cq@Nd)Jk"߅غ=bdu%םPž@@!?!A?3`q^!o冺{OE0R:Hce:$IV.n8)MM"$#GE&uO^u3ZzXcV&|Lzq=yMLz$[B]I`Yuϲ)=yDݗU´: [!_I7b"ǷaX4#HJH>_&y>/AIvS
z̦l]MI9T,q|$
bW=?[ѷG]AvtxDP\LO,7jUK2Dvm|Sxz'W/p9[vQˏ$qf\=84֣Oojye	'IkG(/L`l4f 	x `// Layout Components Barrel Export
// Components removed for recreation

// Remaining container components
export * from './loading-state-container.component';92x3dimport { 
  Component, 
  Input, 
  Output, 
  EventEmitter,
  OnInit,
  OnDestroy,
  ChangeDetectionStrategy,
  signal, 
  computed,
  TemplateRef,
  ContentChild,
  ViewChild,
  ElementRef
} from '@angular/core';
import { CommonModule } from '@angular/common';
import { Subject, timer } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

export type LoadingState = 'idle' | 'loading' | 'success' | 'error';
export type LoadingVariant = 'spinner' | 'skeleton' | 'pulse' | 'shimmer';
export type LoadingSize = 'sm' | 'md' | 'lg' | 'xl';

export interface ErrorState {
  message: string;
  code?: string;
  details?: any;
  retryable?: boolean;
}

export interface LoadingConfig {
  variant: LoadingVariant;
  size: LoadingSize;
  message?: string;
  showProgress?: boolean;
  progress?: number;
  timeout?: number;
}

@Component({
  selector: 'ui-loading-state-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div 
      class="loading-state-container"
      [class]="containerClasses()"
      [attr.data-state]="state"
      [attr.data-variant]="config().variant"
      [attr.data-size]="config().size"
      [attr.role]="state === 'loading' ? 'status' : null"
      [attr.aria-live]="state === 'loading' ? 'polite' : null"
      [attr.aria-busy]="state === 'loading'">
      
      <!-- Loading State -->
      @if (state === 'loading') {
        <div class="loading-overlay" [class.transparent]="transparentOverlay">
          <div class="loading-content">
            
            @switch (config().variant) {
              @case ('spinner') {
                <div class="spinner-container">
                  <div class="spinner"></div>
                  @if (config().message) {
                    <p class="loading-message">{{ config().message }}</p>
                  }
                  @if (config().showProgress && config().progress !== undefined) {
                    <div class="progress-bar">
                      <div class="progress-fill" 
                           [style.width.%]="config().progress">
                      </div>
                    </div>
                    <span class="progress-text">{{ config().progress }}%</span>
                  }
                </div>
              }
              
              @case ('skeleton') {
                @if (skeletonTemplate) {
                  <ng-container 
                    [ngTemplateOutlet]="skeletonTemplate">
                  </ng-container>
                } @else {
                  <div class="skeleton-container">
                    @for (item of skeletonItems(); track $index) {
                      <div class="skeleton-item" 
                           [style.height]="item.height"
                           [style.width]="item.width">
                      </div>
                    }
                  </div>
                }
              }
              
              @case ('pulse') {
                <div class="pulse-container">
                  <div class="pulse-dot"></div>
                  <div class="pulse-dot"></div>
                  <div class="pulse-dot"></div>
                </div>
                @if (config().message) {
                  <p class="loading-message">{{ config().message }}</p>
                }
              }
              
              @case ('shimmer') {
                <div class="shimmer-container">
                  <div class="shimmer-block large"></div>
                  <div class="shimmer-block medium"></div>
                  <div class="shimmer-block small"></div>
                </div>
              }
            }
            
            @if (showCancelButton && state === 'loading') {
              <button 
                class="cancel-button"
                (click)="cancelLoading()"
                type="button"
                [attr.aria-label]="cancelButtonText">
                {{ cancelButtonText }}
              </button>
            }
          </div>
        </div>
      }
      
      <!-- Error State -->
      @if (state === 'error') {
        <div class="error-overlay">
          <div class="error-content">
            
            @if (errorTemplate) {
              <ng-container 
                [ngTemplateOutlet]="errorTemplate"
                [ngTemplateOutletContext]="{ error: error() }">
              </ng-container>
            } @else {
              <div class="error-icon" aria-hidden="true">⚠</div>
              <h3 class="error-title">{{ errorTitle }}</h3>
              <p class="error-message">{{ error()?.message || defaultErrorMessage }}</p>
              
              @if (error()?.details && showErrorDetails) {
                <details class="error-details">
                  <summary>Technical Details</summary>
                  <pre>{{ error()?.details | json }}</pre>
                </details>
              }
              
              <div class="error-actions">
                @if (error()?.retryable !== false && showRetryButton) {
                  <button 
                    class="retry-button primary"
                    (click)="handleRetry()"
                    type="button">
                    {{ retryButtonText }}
                  </button>
                }
                
                @if (showReportButton) {
                  <button 
                    class="report-button secondary"
                    (click)="handleReportError()"
                    type="button">
                    {{ reportButtonText }}
                  </button>
                }
              </div>
            }
          </div>
        </div>
      }
      
      <!-- Success Content or Regular Content -->
      <div 
        class="main-content"
        [class.hidden]="state === 'loading' && !showContentWhileLoading"
        [attr.aria-hidden]="(state === 'loading' && !showContentWhileLoading) || state === 'error' ? 'true' : null">
        
        @if (state === 'success' && successTemplate && showSuccessState) {
          <div class="success-state">
            <ng-container [ngTemplateOutlet]="successTemplate"></ng-container>
          </div>
        } @else {
          <ng-content></ng-content>
        }
      </div>
    </div>
  `,
  styles: [`
    .loading-state-container {
      position: relative;
      width: 100%;
      height: 100%;
    }
    
    .loading-overlay {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: rgba(255, 255, 255, 0.8);
      display: flex;
      align-items: center;
      justify-content: center;
      z-index: 1000;
    }
    
    .spinner {
      width: 40px;
      height: 40px;
      border: 3px solid #f3f3f3;
      border-top: 3px solid #007bff;
      border-radius: 50%;
      animation: spin 1s linear infinite;
    }
    
    @keyframes spin {
      0% { transform: rotate(0deg); }
      100% { transform: rotate(360deg); }
    }
    
    .error-overlay {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: rgba(255, 255, 255, 0.95);
      display: flex;
      align-items: center;
      justify-content: center;
      z-index: 1000;
    }
    
    .main-content {
      width: 100%;
      height: 100%;
    }
  `]
})
export class LoadingStateContainerComponent implements OnInit, OnDestroy {
  @ViewChild('container') containerElement!: ElementRef<HTMLDivElement>;
  
  @ContentChild('skeleton') skeletonTemplate?: TemplateRef<any>;
  @ContentChild('error') errorTemplate?: TemplateRef<{ error: ErrorState | null }>;
  @ContentChild('success') successTemplate?: TemplateRef<any>;
  
  // State management
  @Input() state: LoadingState = 'idle';
  @Input() error = signal<ErrorState | null>(null);
  @Input() config = signal<LoadingConfig>({
    variant: 'spinner',
    size: 'md',
    showProgress: false
  });
  
  // Loading behavior
  @Input() showContentWhileLoading = false;
  @Input() transparentOverlay = false;
  @Input() minimumLoadingTime = 500; // ms
  @Input() automaticTimeout = 0; // ms, 0 = no timeout
  
  // Loading cancellation
  @Input() showCancelButton = false;
  @Input() cancelButtonText = 'Cancel';
  
  // Error handling
  @Input() errorTitle = 'Something went wrong';
  @Input() defaultErrorMessage = 'An unexpected error occurred. Please try again.';
  @Input() showRetryButton = true;
  @Input() retryButtonText = 'Try Again';
  @Input() showReportButton = false;
  @Input() reportButtonText = 'Report Issue';
  @Input() showErrorDetails = false;
  
  // Success state
  @Input() showSuccessState = false;
  @Input() successStateDuration = 2000; // ms
  
  // Skeleton loading
  @Input() skeletonItems = signal([
    { width: '100%', height: '24px' },
    { width: '80%', height: '20px' },
    { width: '60%', height: '20px' }
  ]);
  
  // Events
  @Output() cancel = new EventEmitter<void>();
  @Output() retryClicked = new EventEmitter<void>();
  @Output() reportErrorClicked = new EventEmitter<ErrorState>();
  @Output() timeout = new EventEmitter<void>();
  @Output() stateChange = new EventEmitter<LoadingState>();
  
  private destroy$ = new Subject<void>();
  private loadingStartTime = 0;
  private timeoutTimer?: any;
  private successTimer?: any;
  
  // Computed properties
  protected containerClasses = computed(() => {
    const classes = ['loading-state-container'];
    
    if (this.transparentOverlay) classes.push('transparent-overlay');
    if (this.showContentWhileLoading) classes.push('show-content-while-loading');
    
    return classes.join(' ');
  });

  ngOnInit(): void {
    this.setupStateWatching();
  }

  ngOnDestroy(): void {
    this.cleanup();
    this.destroy$.next();
    this.destroy$.complete();
  }

  /**
   * Sets the loading state with optional configuration
   */
  setLoadingState(config?: Partial<LoadingConfig>): void {
    if (config) {
      this.config.update(current => ({ ...current, ...config }));
    }
    
    this.loadingStartTime = Date.now();
    this.setState('loading');
    
    // Set up automatic timeout if configured
    if (this.automaticTimeout > 0) {
      this.timeoutTimer = setTimeout(() => {
        this.handleTimeout();
      }, this.automaticTimeout);
    }
  }

  /**
   * Sets the error state
   */
  setErrorState(error: ErrorState): void {
    this.error.set(error);
    this.setState('error');
  }

  /**
   * Sets the success state
   */
  setSuccessState(): void {
    this.setState('success');
    
    if (this.showSuccessState && this.successStateDuration > 0) {
      this.successTimer = setTimeout(() => {
        this.setState('idle');
      }, this.successStateDuration);
    }
  }

  /**
   * Sets the idle state
   */
  setIdleState(): void {
    this.setState('idle');
  }

  /**
   * Cancels the current loading operation
   */
  cancelLoading(): void {
    if (this.state !== 'loading') return;
    
    this.cleanup();
    this.setState('idle');
    this.cancel.emit();
  }

  /**
   * Retries the failed operation
   */
  handleRetry(): void {
    if (this.state !== 'error') return;
    
    this.error.set(null);
    this.retryClicked.emit();
  }

  /**
   * Reports the current error
   */
  handleReportError(): void {
    const currentError = this.error();
    if (currentError) {
      this.reportErrorClicked.emit(currentError);
    }
  }

  /**
   * Updates the loading progress (for progress variant)
   */
  updateProgress(progress: number): void {
    this.config.update(config => ({
      ...config,
      progress: Math.max(0, Math.min(100, progress))
    }));
  }

  /**
   * Updates the loading message
   */
  updateMessage(message: string): void {
    this.config.update(config => ({ ...config, message }));
  }

  private setState(newState: LoadingState): void {
    const previousState = this.state;
    this.state = newState;
    
    // Ensure minimum loading time
    if (previousState === 'loading' && newState !== 'loading') {
      const elapsedTime = Date.now() - this.loadingStartTime;
      const remainingTime = this.minimumLoadingTime - elapsedTime;
      
      if (remainingTime > 0) {
        setTimeout(() => {
          this.finalizeStateChange(newState);
        }, remainingTime);
        return;
      }
    }
    
    this.finalizeStateChange(newState);
  }

  private finalizeStateChange(state: LoadingState): void {
    this.state = state;
    this.stateChange.emit(state);
    this.cleanup();
  }

  private handleTimeout(): void {
    this.setState('error');
    this.error.set({
      message: 'The operation timed out. Please try again.',
      code: 'TIMEOUT',
      retryable: true
    });
    this.timeout.emit();
  }

  private setupStateWatching(): void {
    // Watch for external state changes
    timer(0, 100)
      .pipe(takeUntil(this.destroy$))
      .subscribe(() => {
        // This allows for reactive updates if state is changed externally
      });
  }

  private cleanup(): void {
    if (this.timeoutTimer) {
      clearTimeout(this.timeoutTimer);
      this.timeoutTimer = undefined;
    }
    
    if (this.successTimer) {
      clearTimeout(this.successTimer);
      this.successTimer = undefined;
    }
  }
}uxXimport { FontDefinition, FontPreset } from '../types/font-types';

export class FontPresetManager {
  private customPresets = new Map<string, FontPreset>();
  private fontCategories = new Map<string, string[]>();

  constructor() {
    this.initializeCategories();
  }

  /**
   * Add a custom font preset collection
   */
  addPresetCollection(name: string, preset: FontPreset): void {
    this.customPresets.set(name, preset);
    
    // Update categories
    Object.entries(preset).forEach(([fontName, definition]) => {
      this.addToCategory(definition.category, fontName);
    });
  }

  /**
   * Add a single custom font
   */
  addCustomFont(name: string, definition: FontDefinition): void {
    const customPreset = this.customPresets.get('custom') || {};
    customPreset[name] = definition;
    this.customPresets.set('custom', customPreset);
    
    this.addToCategory(definition.category, name);
  }

  /**
   * Add font from external service (Typekit, custom CDN, etc.)
   */
  addExternalFont(name: string, config: {
    family: string;
    url: string;
    weights?: number[];
    category?: FontDefinition['category'];
    fallbacks?: string[];
  }): void {
    const definition: FontDefinition = {
      family: config.family,
      url: config.url,
      weights: config.weights || [400],
      fallbacks: config.fallbacks || this.getDefaultFallbacks(config.category || 'sans-serif'),
      loadingStrategy: 'swap',
      category: config.category || 'sans-serif'
    };

    this.addCustomFont(name, definition);
  }

  /**
   * Add Adobe Typekit font
   */
  addTypekitFont(kitId: string, fonts: Array<{
    name: string;
    family: string;
    weights?: number[];
    category?: FontDefinition['category'];
  }>): void {
    const typekitUrl = `https://use.typekit.net/${kitId}.css`;
    
    fonts.forEach(font => {
      this.addExternalFont(font.name, {
        family: font.family,
        url: typekitUrl,
        weights: font.weights,
        category: font.category
      });
    });
  }

  /**
   * Add self-hosted font
   */
  addSelfHostedFont(name: string, config: {
    family: string;
    basePath: string; // e.g., '/assets/fonts/my-font'
    formats: Array<'woff2' | 'woff' | 'ttf' | 'otf'>;
    weights?: number[];
    category?: FontDefinition['category'];
    fallbacks?: string[];
  }): void {
    // Generate CSS for self-hosted font
    const fontFaceCSS = this.generateFontFaceCSS(config);
    
    const definition: FontDefinition = {
      family: config.family,
      url: `data:text/css;base64,${btoa(fontFaceCSS)}`, // Inline CSS
      weights: config.weights || [400],
      fallbacks: config.fallbacks || this.getDefaultFallbacks(config.category || 'sans-serif'),
      loadingStrategy: 'swap',
      category: config.category || 'sans-serif'
    };

    this.addCustomFont(name, definition);
  }

  /**
   * Get all custom presets
   */
  getCustomPresets(): Map<string, FontPreset> {
    return this.customPresets;
  }

  /**
   * Get fonts by category
   */
  getFontsByCategory(category: string): string[] {
    return this.fontCategories.get(category) || [];
  }

  /**
   * Get all categories
   */
  getCategories(): string[] {
    return Array.from(this.fontCategories.keys());
  }

  /**
   * Remove custom font
   */
  removeCustomFont(name: string): boolean {
    const customPreset = this.customPresets.get('custom');
    if (customPreset && customPreset[name]) {
      const category = customPreset[name].category;
      delete customPreset[name];
      
      // Remove from category
      this.removeFromCategory(category, name);
      return true;
    }
    return false;
  }

  /**
   * Import fonts from a configuration object
   */
  importConfiguration(config: {
    name: string;
    fonts: { [key: string]: Omit<FontDefinition, 'loadingStrategy'> };
  }): void {
    const preset: FontPreset = {};
    
    Object.entries(config.fonts).forEach(([name, fontConfig]) => {
      preset[name] = {
        ...fontConfig,
        loadingStrategy: 'swap'
      };
    });

    this.addPresetCollection(config.name, preset);
  }

  /**
   * Export custom fonts configuration
   */
  exportConfiguration(): string {
    const config = {
      customPresets: Object.fromEntries(this.customPresets),
      categories: Object.fromEntries(this.fontCategories)
    };
    
    return JSON.stringify(config, null, 2);
  }

  private initializeCategories(): void {
    this.fontCategories.set('sans-serif', []);
    this.fontCategories.set('serif', []);
    this.fontCategories.set('monospace', []);
    this.fontCategories.set('display', []);
    this.fontCategories.set('handwriting', []);
  }

  private addToCategory(category: string, fontName: string): void {
    const fonts = this.fontCategories.get(category) || [];
    if (!fonts.includes(fontName)) {
      fonts.push(fontName);
      this.fontCategories.set(category, fonts);
    }
  }

  private removeFromCategory(category: string, fontName: string): void {
    const fonts = this.fontCategories.get(category) || [];
    const index = fonts.indexOf(fontName);
    if (index > -1) {
      fonts.splice(index, 1);
      this.fontCategories.set(category, fonts);
    }
  }

  private getDefaultFallbacks(category: FontDefinition['category']): string[] {
    switch (category) {
      case 'serif':
        return ['Georgia', 'Cambria', 'Times New Roman', 'Times', 'serif'];
      case 'monospace':
        return ['Consolas', 'Monaco', 'Courier New', 'monospace'];
      case 'handwriting':
        return ['cursive'];
      case 'display':
      case 'sans-serif':
      default:
        return ['ui-sans-serif', 'system-ui', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif'];
    }
  }

  private generateFontFaceCSS(config: {
    family: string;
    basePath: string;
    formats: Array<'woff2' | 'woff' | 'ttf' | 'otf'>;
    weights?: number[];
  }): string {
    const weights = config.weights || [400];
    let css = '';

    weights.forEach(weight => {
      css += `@font-face {
  font-family: '${config.family}';
  src: ${config.formats.map(format => {
    const ext = format;
    const type = format === 'ttf' ? 'truetype' : format === 'otf' ? 'opentype' : format;
    return `url('${config.basePath}-${weight}.${ext}') format('${type}')`;
  }).join(',\n       ')};
  font-weight: ${weight};
  font-display: swap;
}

`;
    });

    return css;
  }
}

// Singleton instance
export const fontPresetManager = new FontPresetManager();Mxjimport { FontPreset } from '../types/font-types';

export const GOOGLE_FONTS_PRESET: FontPreset = {
  // Sans-serif fonts (35 fonts)
  'Inter': {
    family: 'Inter',
    url: 'https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['ui-sans-serif', 'system-ui', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 95
  },
  'Roboto': {
    family: 'Roboto',
    url: 'https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900',
    weights: [100, 300, 400, 500, 700, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 98
  },
  'Open Sans': {
    family: 'Open Sans',
    url: 'https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800',
    weights: [300, 400, 500, 600, 700, 800],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 92
  },
  'Poppins': {
    family: 'Poppins',
    url: 'https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 85
  },
  'Lato': {
    family: 'Lato',
    url: 'https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900',
    weights: [100, 300, 400, 700, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 80
  },
  'Montserrat': {
    family: 'Montserrat',
    url: 'https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 88
  },
  'Nunito': {
    family: 'Nunito',
    url: 'https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000',
    weights: [200, 300, 400, 500, 600, 700, 800, 900, 1000],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 75
  },
  'Source Sans Pro': {
    family: 'Source Sans Pro',
    url: 'https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700;1,900',
    weights: [200, 300, 400, 600, 700, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 70
  },
  'Raleway': {
    family: 'Raleway',
    url: 'https://fonts.googleapis.com/css2?family=Raleway:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 75
  },
  'Ubuntu': {
    family: 'Ubuntu',
    url: 'https://fonts.googleapis.com/css2?family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700',
    weights: [300, 400, 500, 700],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 68
  },
  'Work Sans': {
    family: 'Work Sans',
    url: 'https://fonts.googleapis.com/css2?family=Work+Sans:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 65
  },
  'Rubik': {
    family: 'Rubik',
    url: 'https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900',
    weights: [300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 72
  },
  'Kanit': {
    family: 'Kanit',
    url: 'https://fonts.googleapis.com/css2?family=Kanit:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 62
  },
  'DM Sans': {
    family: 'DM Sans',
    url: 'https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000',
    weights: [400, 500, 700],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 58
  },
  'Mulish': {
    family: 'Mulish',
    url: 'https://fonts.googleapis.com/css2?family=Mulish:ital,wght@0,200..1000;1,200..1000',
    weights: [200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 55
  },
  'Hind': {
    family: 'Hind',
    url: 'https://fonts.googleapis.com/css2?family=Hind:wght@300;400;500;600;700',
    weights: [300, 400, 500, 600, 700],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 52
  },
  'Quicksand': {
    family: 'Quicksand',
    url: 'https://fonts.googleapis.com/css2?family=Quicksand:wght@300..700',
    weights: [300, 400, 500, 600, 700],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 60
  },
  'Karla': {
    family: 'Karla',
    url: 'https://fonts.googleapis.com/css2?family=Karla:ital,wght@0,200..800;1,200..800',
    weights: [200, 300, 400, 500, 600, 700, 800],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 48
  },
  'Manrope': {
    family: 'Manrope',
    url: 'https://fonts.googleapis.com/css2?family=Manrope:wght@200..800',
    weights: [200, 300, 400, 500, 600, 700, 800],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 45
  },
  'Comfortaa': {
    family: 'Comfortaa',
    url: 'https://fonts.googleapis.com/css2?family=Comfortaa:wght@300..700',
    weights: [300, 400, 500, 600, 700],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 42
  },
  'Outfit': {
    family: 'Outfit',
    url: 'https://fonts.googleapis.com/css2?family=Outfit:wght@100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 38
  },
  'Lexend': {
    family: 'Lexend',
    url: 'https://fonts.googleapis.com/css2?family=Lexend:wght@100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 35
  },
  'Plus Jakarta Sans': {
    family: 'Plus Jakarta Sans',
    url: 'https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,200..800;1,200..800',
    weights: [200, 300, 400, 500, 600, 700, 800],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 32
  },
  'Space Grotesk': {
    family: 'Space Grotesk',
    url: 'https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300..700',
    weights: [300, 400, 500, 600, 700],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 30
  },
  'Figtree': {
    family: 'Figtree',
    url: 'https://fonts.googleapis.com/css2?family=Figtree:ital,wght@0,300..900;1,300..900',
    weights: [300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 28
  },
  'Barlow': {
    family: 'Barlow',
    url: 'https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 25
  },
  'Epilogue': {
    family: 'Epilogue',
    url: 'https://fonts.googleapis.com/css2?family=Epilogue:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 22
  },
  'Sora': {
    family: 'Sora',
    url: 'https://fonts.googleapis.com/css2?family=Sora:wght@100..800',
    weights: [100, 200, 300, 400, 500, 600, 700, 800],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 20
  },
  'Red Hat Display': {
    family: 'Red Hat Display',
    url: 'https://fonts.googleapis.com/css2?family=Red+Hat+Display:ital,wght@0,300..900;1,300..900',
    weights: [300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 18
  },
  'Satoshi': {
    family: 'Satoshi',
    url: 'https://fonts.googleapis.com/css2?family=Satoshi:ital,wght@0,300;0,400;0,500;0,700;0,900;1,300;1,400;1,500;1,700;1,900',
    weights: [300, 400, 500, 700, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 15
  },
  'Heebo': {
    family: 'Heebo',
    url: 'https://fonts.googleapis.com/css2?family=Heebo:wght@100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 12
  },
  'Exo 2': {
    family: 'Exo 2',
    url: 'https://fonts.googleapis.com/css2?family=Exo+2:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 10
  },
  'Commissioner': {
    family: 'Commissioner',
    url: 'https://fonts.googleapis.com/css2?family=Commissioner:wght@100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 8
  },
  'Archivo': {
    family: 'Archivo',
    url: 'https://fonts.googleapis.com/css2?family=Archivo:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 6
  },
  'Public Sans': {
    family: 'Public Sans',
    url: 'https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'sans-serif',
    popularity: 4
  },

  // Serif fonts (20 fonts)
  'Playfair Display': {
    family: 'Playfair Display',
    url: 'https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400..900;1,400..900',
    weights: [400, 500, 600, 700, 800, 900],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 85
  },
  'Merriweather': {
    family: 'Merriweather',
    url: 'https://fonts.googleapis.com/css2?family=Merriweather:ital,wght@0,300;0,400;0,700;0,900;1,300;1,400;1,700;1,900',
    weights: [300, 400, 700, 900],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 78
  },
  'Lora': {
    family: 'Lora',
    url: 'https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400..700;1,400..700',
    weights: [400, 500, 600, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 72
  },
  'EB Garamond': {
    family: 'EB Garamond',
    url: 'https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400..800;1,400..800',
    weights: [400, 500, 600, 700, 800],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 65
  },
  'Crimson Text': {
    family: 'Crimson Text',
    url: 'https://fonts.googleapis.com/css2?family=Crimson+Text:ital,wght@0,400;0,600;0,700;1,400;1,600;1,700',
    weights: [400, 600, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 60
  },
  'Source Serif Pro': {
    family: 'Source Serif Pro',
    url: 'https://fonts.googleapis.com/css2?family=Source+Serif+Pro:ital,wght@0,200..900;1,200..900',
    weights: [200, 300, 400, 600, 700, 900],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 55
  },
  'Noto Serif': {
    family: 'Noto Serif',
    url: 'https://fonts.googleapis.com/css2?family=Noto+Serif:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 50
  },
  'Vollkorn': {
    family: 'Vollkorn',
    url: 'https://fonts.googleapis.com/css2?family=Vollkorn:ital,wght@0,400..900;1,400..900',
    weights: [400, 500, 600, 700, 800, 900],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 45
  },
  'Libre Baskerville': {
    family: 'Libre Baskerville',
    url: 'https://fonts.googleapis.com/css2?family=Libre+Baskerville:ital,wght@0,400;0,700;1,400',
    weights: [400, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 42
  },
  'Arvo': {
    family: 'Arvo',
    url: 'https://fonts.googleapis.com/css2?family=Arvo:ital,wght@0,400;0,700;1,400;1,700',
    weights: [400, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 38
  },
  'Zilla Slab': {
    family: 'Zilla Slab',
    url: 'https://fonts.googleapis.com/css2?family=Zilla+Slab:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700',
    weights: [300, 400, 500, 600, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 35
  },
  'Cormorant Garamond': {
    family: 'Cormorant Garamond',
    url: 'https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700',
    weights: [300, 400, 500, 600, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 32
  },
  'PT Serif': {
    family: 'PT Serif',
    url: 'https://fonts.googleapis.com/css2?family=PT+Serif:ital,wght@0,400;0,700;1,400;1,700',
    weights: [400, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 30
  },
  'Alegreya': {
    family: 'Alegreya',
    url: 'https://fonts.googleapis.com/css2?family=Alegreya:ital,wght@0,400..900;1,400..900',
    weights: [400, 500, 600, 700, 800, 900],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 28
  },
  'Spectral': {
    family: 'Spectral',
    url: 'https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,200;1,300;1,400;1,500;1,600;1,700;1,800',
    weights: [200, 300, 400, 500, 600, 700, 800],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 25
  },
  'Old Standard TT': {
    family: 'Old Standard TT',
    url: 'https://fonts.googleapis.com/css2?family=Old+Standard+TT:ital,wght@0,400;0,700;1,400',
    weights: [400, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 22
  },
  'Cardo': {
    family: 'Cardo',
    url: 'https://fonts.googleapis.com/css2?family=Cardo:ital,wght@0,400;0,700;1,400',
    weights: [400, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 20
  },
  'Gentium Plus': {
    family: 'Gentium Plus',
    url: 'https://fonts.googleapis.com/css2?family=Gentium+Plus:ital,wght@0,400;0,700;1,400;1,700',
    weights: [400, 700],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 18
  },
  'Neuton': {
    family: 'Neuton',
    url: 'https://fonts.googleapis.com/css2?family=Neuton:ital,wght@0,200;0,300;0,400;0,700;0,800;1,400',
    weights: [200, 300, 400, 700, 800],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 15
  },
  'Bitter': {
    family: 'Bitter',
    url: 'https://fonts.googleapis.com/css2?family=Bitter:ital,wght@0,100..900;1,100..900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Georgia', 'Times New Roman', 'serif'],
    loadingStrategy: 'swap',
    category: 'serif',
    popularity: 12
  },

  // Monospace fonts (10 fonts)
  'JetBrains Mono': {
    family: 'JetBrains Mono',
    url: 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800',
    weights: [100, 200, 300, 400, 500, 600, 700, 800],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 82
  },
  'Fira Code': {
    family: 'Fira Code',
    url: 'https://fonts.googleapis.com/css2?family=Fira+Code:wght@300..700',
    weights: [300, 400, 500, 600, 700],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 78
  },
  'Source Code Pro': {
    family: 'Source Code Pro',
    url: 'https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,200..900;1,200..900',
    weights: [200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 75
  },
  'Roboto Mono': {
    family: 'Roboto Mono',
    url: 'https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700',
    weights: [100, 200, 300, 400, 500, 600, 700],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 70
  },
  'IBM Plex Mono': {
    family: 'IBM Plex Mono',
    url: 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700',
    weights: [100, 200, 300, 400, 500, 600, 700],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 65
  },
  'Space Mono': {
    family: 'Space Mono',
    url: 'https://fonts.googleapis.com/css2?family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700',
    weights: [400, 700],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 60
  },
  'Inconsolata': {
    family: 'Inconsolata',
    url: 'https://fonts.googleapis.com/css2?family=Inconsolata:wght@200..900',
    weights: [200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 55
  },
  'PT Mono': {
    family: 'PT Mono',
    url: 'https://fonts.googleapis.com/css2?family=PT+Mono',
    weights: [400],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 50
  },
  'Fira Mono': {
    family: 'Fira Mono',
    url: 'https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700',
    weights: [400, 500, 700],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 45
  },
  'Ubuntu Mono': {
    family: 'Ubuntu Mono',
    url: 'https://fonts.googleapis.com/css2?family=Ubuntu+Mono:ital,wght@0,400;0,700;1,400;1,700',
    weights: [400, 700],
    fallbacks: ['Consolas', 'Monaco', 'Courier New', 'monospace'],
    loadingStrategy: 'swap',
    category: 'monospace',
    popularity: 40
  },

  // Display fonts (10 fonts)
  'Oswald': {
    family: 'Oswald',
    url: 'https://fonts.googleapis.com/css2?family=Oswald:wght@200..700',
    weights: [200, 300, 400, 500, 600, 700],
    fallbacks: ['Impact', 'Arial Black', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 80
  },
  'Bebas Neue': {
    family: 'Bebas Neue',
    url: 'https://fonts.googleapis.com/css2?family=Bebas+Neue',
    weights: [400],
    fallbacks: ['Impact', 'Arial Black', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 72
  },
  'Anton': {
    family: 'Anton',
    url: 'https://fonts.googleapis.com/css2?family=Anton',
    weights: [400],
    fallbacks: ['Impact', 'Arial Black', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 68
  },
  'Righteous': {
    family: 'Righteous',
    url: 'https://fonts.googleapis.com/css2?family=Righteous',
    weights: [400],
    fallbacks: ['Impact', 'Arial Black', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 65
  },
  'Fredoka One': {
    family: 'Fredoka One',
    url: 'https://fonts.googleapis.com/css2?family=Fredoka+One',
    weights: [400],
    fallbacks: ['Impact', 'Arial Black', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 60
  },
  'Archivo Black': {
    family: 'Archivo Black',
    url: 'https://fonts.googleapis.com/css2?family=Archivo+Black',
    weights: [400],
    fallbacks: ['Impact', 'Arial Black', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 55
  },
  'Cabin': {
    family: 'Cabin',
    url: 'https://fonts.googleapis.com/css2?family=Cabin:ital,wght@0,400..700;1,400..700',
    weights: [400, 500, 600, 700],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 52
  },
  'Prompt': {
    family: 'Prompt',
    url: 'https://fonts.googleapis.com/css2?family=Prompt:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900',
    weights: [100, 200, 300, 400, 500, 600, 700, 800, 900],
    fallbacks: ['Arial', 'Helvetica', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 48
  },
  'Fjalla One': {
    family: 'Fjalla One',
    url: 'https://fonts.googleapis.com/css2?family=Fjalla+One',
    weights: [400],
    fallbacks: ['Impact', 'Arial Black', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 45
  },
  'Patua One': {
    family: 'Patua One',
    url: 'https://fonts.googleapis.com/css2?family=Patua+One',
    weights: [400],
    fallbacks: ['Impact', 'Arial Black', 'sans-serif'],
    loadingStrategy: 'swap',
    category: 'display',
    popularity: 42
  },

  // Handwriting fonts (10 fonts)
  'Dancing Script': {
    family: 'Dancing Script',
    url: 'https://fonts.googleapis.com/css2?family=Dancing+Script:wght@400..700',
    weights: [400, 500, 600, 700],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 68
  },
  'Great Vibes': {
    family: 'Great Vibes',
    url: 'https://fonts.googleapis.com/css2?family=Great+Vibes',
    weights: [400],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 65
  },
  'Pacifico': {
    family: 'Pacifico',
    url: 'https://fonts.googleapis.com/css2?family=Pacifico',
    weights: [400],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 62
  },
  'Kaushan Script': {
    family: 'Kaushan Script',
    url: 'https://fonts.googleapis.com/css2?family=Kaushan+Script',
    weights: [400],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 58
  },
  'Satisfy': {
    family: 'Satisfy',
    url: 'https://fonts.googleapis.com/css2?family=Satisfy',
    weights: [400],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 55
  },
  'Caveat': {
    family: 'Caveat',
    url: 'https://fonts.googleapis.com/css2?family=Caveat:wght@400..700',
    weights: [400, 500, 600, 700],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 52
  },
  'Amatic SC': {
    family: 'Amatic SC',
    url: 'https://fonts.googleapis.com/css2?family=Amatic+SC:wght@400;700',
    weights: [400, 700],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 48
  },
  'Indie Flower': {
    family: 'Indie Flower',
    url: 'https://fonts.googleapis.com/css2?family=Indie+Flower',
    weights: [400],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 45
  },
  'Shadows Into Light': {
    family: 'Shadows Into Light',
    url: 'https://fonts.googleapis.com/css2?family=Shadows+Into+Light',
    weights: [400],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 42
  },
  'Permanent Marker': {
    family: 'Permanent Marker',
    url: 'https://fonts.googleapis.com/css2?family=Permanent+Marker',
    weights: [400],
    fallbacks: ['cursive'],
    loadingStrategy: 'swap',
    category: 'handwriting',
    popularity: 38
  }
};

// Popular font combinations
export const FONT_COMBINATIONS = {
  'Modern Clean': {
    sans: 'Inter',
    serif: 'Playfair Display',
    mono: 'JetBrains Mono',
    display: 'Inter'
  },
  'Classic Editorial': {
    sans: 'Source Sans Pro',
    serif: 'Lora',
    mono: 'Source Code Pro',
    display: 'Oswald'
  },
  'Friendly Modern': {
    sans: 'Poppins',
    serif: 'Merriweather',
    mono: 'Fira Code',
    display: 'Raleway'
  },
  'Professional': {
    sans: 'Roboto',
    serif: 'EB Garamond',
    mono: 'Roboto Mono',
    display: 'Montserrat'
  }
};>SsxNimport { Injectable } from '@angular/core';
import { BehaviorSubject, Observable, combineLatest } from 'rxjs';
import { map } from 'rxjs/operators';

export interface FontLoadingState {
  fontName: string;
  status: 'idle' | 'loading' | 'loaded' | 'error' | 'timeout';
  progress: number; // 0-100
  error?: string;
  loadTime?: number;
  url?: string;
}

export interface GlobalLoadingState {
  isLoading: boolean;
  totalFonts: number;
  loadedFonts: number;
  failedFonts: number;
  progress: number; // 0-100
  currentlyLoading: string[];
  errors: { [fontName: string]: string };
}

@Injectable({
  providedIn: 'root'
})
export class FontLoadingStateService {
  private fontStates = new Map<string, BehaviorSubject<FontLoadingState>>();
  private globalState$ = new BehaviorSubject<GlobalLoadingState>({
    isLoading: false,
    totalFonts: 0,
    loadedFonts: 0,
    failedFonts: 0,
    progress: 0,
    currentlyLoading: [],
    errors: {}
  });

  /**
   * Get loading state for a specific font
   */
  getFontState(fontName: string): Observable<FontLoadingState> {
    if (!this.fontStates.has(fontName)) {
      this.fontStates.set(fontName, new BehaviorSubject<FontLoadingState>({
        fontName,
        status: 'idle',
        progress: 0
      }));
    }
    
    return this.fontStates.get(fontName)!.asObservable();
  }

  /**
   * Get global loading state
   */
  getGlobalState(): Observable<GlobalLoadingState> {
    return this.globalState$.asObservable();
  }

  /**
   * Get all font states
   */
  getAllFontStates(): Observable<FontLoadingState[]> {
    if (this.fontStates.size === 0) {
      return new BehaviorSubject<FontLoadingState[]>([]).asObservable();
    }

    const stateObservables = Array.from(this.fontStates.values());
    return combineLatest(stateObservables);
  }

  /**
   * Update font loading state
   */
  updateFontState(fontName: string, update: Partial<FontLoadingState>): void {
    const currentSubject = this.fontStates.get(fontName);
    if (!currentSubject) {
      this.fontStates.set(fontName, new BehaviorSubject<FontLoadingState>({
        fontName,
        status: 'idle',
        progress: 0,
        ...update
      }));
    } else {
      const current = currentSubject.value;
      currentSubject.next({ ...current, ...update });
    }

    this.updateGlobalState();
  }

  /**
   * Start font loading
   */
  startLoading(fontName: string, url?: string): void {
    this.updateFontState(fontName, {
      status: 'loading',
      progress: 0,
      url,
      error: undefined,
      loadTime: undefined
    });
  }

  /**
   * Update loading progress
   */
  updateProgress(fontName: string, progress: number): void {
    this.updateFontState(fontName, {
      progress: Math.max(0, Math.min(100, progress))
    });
  }

  /**
   * Mark font as loaded
   */
  markLoaded(fontName: string, loadTime: number): void {
    this.updateFontState(fontName, {
      status: 'loaded',
      progress: 100,
      loadTime
    });
  }

  /**
   * Mark font as failed
   */
  markFailed(fontName: string, error: string): void {
    this.updateFontState(fontName, {
      status: 'error',
      progress: 0,
      error
    });
  }

  /**
   * Mark font as timed out
   */
  markTimeout(fontName: string): void {
    this.updateFontState(fontName, {
      status: 'timeout',
      progress: 0,
      error: 'Font loading timed out'
    });
  }

  /**
   * Reset font state
   */
  resetFontState(fontName: string): void {
    this.updateFontState(fontName, {
      status: 'idle',
      progress: 0,
      error: undefined,
      loadTime: undefined
    });
  }

  /**
   * Reset all font states
   */
  resetAllStates(): void {
    this.fontStates.forEach((subject, fontName) => {
      subject.next({
        fontName,
        status: 'idle',
        progress: 0
      });
    });
    
    this.updateGlobalState();
  }

  /**
   * Remove font state
   */
  removeFontState(fontName: string): void {
    const subject = this.fontStates.get(fontName);
    if (subject) {
      subject.complete();
      this.fontStates.delete(fontName);
    }
    
    this.updateGlobalState();
  }

  /**
   * Get loading statistics
   */
  getLoadingStats(): Observable<{
    totalRequests: number;
    successRate: number;
    averageLoadTime: number;
    fastestLoad: number;
    slowestLoad: number;
  }> {
    return this.getAllFontStates().pipe(
      map(states => {
        const completedStates = states.filter(s => s.status === 'loaded' || s.status === 'error');
        const loadedStates = states.filter(s => s.status === 'loaded');
        const loadTimes = loadedStates
          .map(s => s.loadTime)
          .filter(time => time !== undefined) as number[];

        return {
          totalRequests: states.length,
          successRate: completedStates.length > 0 ? (loadedStates.length / completedStates.length) * 100 : 0,
          averageLoadTime: loadTimes.length > 0 ? loadTimes.reduce((a, b) => a + b, 0) / loadTimes.length : 0,
          fastestLoad: loadTimes.length > 0 ? Math.min(...loadTimes) : 0,
          slowestLoad: loadTimes.length > 0 ? Math.max(...loadTimes) : 0
        };
      })
    );
  }

  /**
   * Check if any fonts are currently loading
   */
  isAnyFontLoading(): Observable<boolean> {
    return this.getGlobalState().pipe(
      map(state => state.isLoading)
    );
  }

  /**
   * Get fonts by status
   */
  getFontsByStatus(status: FontLoadingState['status']): Observable<FontLoadingState[]> {
    return this.getAllFontStates().pipe(
      map(states => states.filter(state => state.status === status))
    );
  }

  /**
   * Wait for all fonts to finish loading (success or failure)
   */
  waitForAllFonts(): Observable<FontLoadingState[]> {
    return this.getAllFontStates().pipe(
      map(states => {
        const allFinished = states.every(state => 
          state.status === 'loaded' || 
          state.status === 'error' || 
          state.status === 'timeout' ||
          state.status === 'idle'
        );
        
        if (allFinished) {
          return states;
        } else {
          throw new Error('Fonts still loading'); // This will cause the observable to not emit yet
        }
      })
    );
  }

  private updateGlobalState(): void {
    const states = Array.from(this.fontStates.values()).map(subject => subject.value);
    
    const totalFonts = states.length;
    const loadingFonts = states.filter(s => s.status === 'loading');
    const loadedFonts = states.filter(s => s.status === 'loaded');
    const failedFonts = states.filter(s => s.status === 'error' || s.status === 'timeout');
    const currentlyLoading = loadingFonts.map(s => s.fontName);
    
    const errors: { [fontName: string]: string } = {};
    states.forEach(state => {
      if (state.error) {
        errors[state.fontName] = state.error;
      }
    });

    const completedFonts = loadedFonts.length + failedFonts.length;
    const progress = totalFonts > 0 ? (completedFonts / totalFonts) * 100 : 0;

    this.globalState$.next({
      isLoading: loadingFonts.length > 0,
      totalFonts,
      loadedFonts: loadedFonts.length,
      failedFonts: failedFonts.length,
      progress,
      currentlyLoading,
      errors
    });
  }
}tx@import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { FontTheme, FontDefinition } from '../types/font-types';
import { UiFontManagerService } from '../ui-font-manager.service';

@Injectable({
  providedIn: 'root'
})
export class FontThemeService {
  private themes = new Map<string, FontTheme>();
  private activeThemeSubject = new BehaviorSubject<FontTheme | null>(null);

  constructor(private fontManager: UiFontManagerService) {
    this.initializeDefaultThemes();
  }

  /**
   * Get all available themes
   */
  getThemes(): FontTheme[] {
    return Array.from(this.themes.values());
  }

  /**
   * Get theme by name
   */
  getTheme(name: string): FontTheme | undefined {
    return this.themes.get(name);
  }

  /**
   * Add or update a theme
   */
  addTheme(theme: FontTheme): void {
    this.themes.set(theme.name, theme);
  }

  /**
   * Remove a theme
   */
  removeTheme(name: string): boolean {
    return this.themes.delete(name);
  }

  /**
   * Apply a theme by name
   */
  applyTheme(themeName: string): Observable<boolean> {
    const theme = this.themes.get(themeName);
    if (!theme) {
      console.warn(`Theme "${themeName}" not found`);
      return new BehaviorSubject(false).asObservable();
    }

    return new Observable(observer => {
      this.fontManager.applyTheme(theme).subscribe({
        next: (success) => {
          if (success) {
            this.activeThemeSubject.next(theme);
          }
          observer.next(success);
          observer.complete();
        },
        error: (error) => observer.error(error)
      });
    });
  }

  /**
   * Get currently active theme
   */
  getActiveTheme(): Observable<FontTheme | null> {
    return this.activeThemeSubject.asObservable();
  }

  /**
   * Create theme from font combination
   */
  createThemeFromCombination(name: string, combinationName: string, description?: string): FontTheme | null {
    const theme = this.fontManager.createThemeFromCombination(name, combinationName);
    if (theme && description) {
      theme.description = description;
    }
    if (theme) {
      this.addTheme(theme);
    }
    return theme;
  }

  /**
   * Create custom theme
   */
  createCustomTheme(
    name: string,
    fonts: {
      sans: string;
      serif: string;
      mono: string;
      display: string;
    },
    description?: string
  ): FontTheme | null {
    const allFonts = this.fontManager.getAllFonts();
    
    // Validate all fonts exist
    const fontDefinitions: { [key: string]: FontDefinition } = {};
    for (const [type, fontName] of Object.entries(fonts)) {
      const font = allFonts[fontName];
      if (!font) {
        console.warn(`Font "${fontName}" not found for type "${type}"`);
        return null;
      }
      fontDefinitions[type] = font;
    }

    const theme: FontTheme = {
      name,
      description,
      fonts: {
        sans: fontDefinitions['sans'],
        serif: fontDefinitions['serif'],
        mono: fontDefinitions['mono'],
        display: fontDefinitions['display']
      }
    };

    this.addTheme(theme);
    return theme;
  }

  /**
   * Export theme configuration
   */
  exportTheme(themeName: string): string | null {
    const theme = this.themes.get(themeName);
    if (!theme) return null;
    
    return JSON.stringify(theme, null, 2);
  }

  /**
   * Import theme from configuration
   */
  importTheme(themeJson: string): FontTheme | null {
    try {
      const theme: FontTheme = JSON.parse(themeJson);
      
      // Validate theme structure
      if (!theme.name || !theme.fonts) {
        throw new Error('Invalid theme structure');
      }

      this.addTheme(theme);
      return theme;
    } catch (error) {
      console.error('Failed to import theme:', error);
      return null;
    }
  }

  private initializeDefaultThemes(): void {
    const combinations = this.fontManager.getFontCombinations();
    
    // Create default themes from combinations
    Object.entries(combinations).forEach(([name, combo]) => {
      const theme = this.fontManager.createThemeFromCombination(name, name);
      if (theme) {
        this.addTheme(theme);
      }
    });

    // Add system fonts theme
    const systemTheme: FontTheme = {
      name: 'System',
      description: 'Use system default fonts for optimal performance',
      fonts: {
        sans: {
          family: 'system-ui',
          weights: [400, 500, 600, 700],
          fallbacks: ['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif'],
          loadingStrategy: 'swap',
          category: 'sans-serif'
        },
        serif: {
          family: 'ui-serif',
          weights: [400, 700],
          fallbacks: ['Georgia', 'Cambria', 'Times New Roman', 'Times', 'serif'],
          loadingStrategy: 'swap',
          category: 'serif'
        },
        mono: {
          family: 'ui-monospace',
          weights: [400, 700],
          fallbacks: ['SFMono-Regular', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],
          loadingStrategy: 'swap',
          category: 'monospace'
        },
        display: {
          family: 'system-ui',
          weights: [400, 700],
          fallbacks: ['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif'],
          loadingStrategy: 'swap',
          category: 'display'
        }
      }
    };

    this.addTheme(systemTheme);
  }
}-x#'import { Injectable, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { BehaviorSubject, Observable } from 'rxjs';

export interface FontTransitionConfig {
  duration: number; // in milliseconds
  easing: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out' | string;
  stagger: number; // delay between elements in milliseconds
  fadeEffect: boolean;
  scaleEffect: boolean;
}

@Injectable({
  providedIn: 'root'
})
export class FontTransitionService {
  private isTransitioning$ = new BehaviorSubject<boolean>(false);
  private transitionConfig: FontTransitionConfig = {
    duration: 300,
    easing: 'ease-in-out',
    stagger: 50,
    fadeEffect: true,
    scaleEffect: false
  };

  constructor(@Inject(DOCUMENT) private document: Document) {}

  /**
   * Configure transition settings
   */
  configure(config: Partial<FontTransitionConfig>): void {
    this.transitionConfig = { ...this.transitionConfig, ...config };
  }

  /**
   * Get current transition state
   */
  isTransitioning(): Observable<boolean> {
    return this.isTransitioning$.asObservable();
  }

  /**
   * Apply smooth font transition with animations
   */
  applyFontTransition(
    newFontVariables: { [key: string]: string },
    customConfig?: Partial<FontTransitionConfig>
  ): Observable<void> {
    return new Observable(observer => {
      const config = customConfig ? { ...this.transitionConfig, ...customConfig } : this.transitionConfig;
      
      this.isTransitioning$.next(true);
      
      // Get all text elements
      const textElements = this.getTextElements();
      
      // Apply transition styles
      this.prepareTransition(textElements, config);
      
      // Start the transition
      requestAnimationFrame(() => {
        this.executeTransition(textElements, newFontVariables, config).then(() => {
          this.isTransitioning$.next(false);
          observer.next();
          observer.complete();
        }).catch(error => {
          this.isTransitioning$.next(false);
          observer.error(error);
        });
      });
    });
  }

  /**
   * Apply font changes with smooth fade transition
   */
  applyWithFade(newFontVariables: { [key: string]: string }): Observable<void> {
    return this.applyFontTransition(newFontVariables, {
      fadeEffect: true,
      scaleEffect: false,
      duration: 400,
      easing: 'ease-in-out'
    });
  }

  /**
   * Apply font changes with scale effect
   */
  applyWithScale(newFontVariables: { [key: string]: string }): Observable<void> {
    return this.applyFontTransition(newFontVariables, {
      fadeEffect: false,
      scaleEffect: true,
      duration: 500,
      easing: 'cubic-bezier(0.4, 0, 0.2, 1)'
    });
  }

  /**
   * Apply instant font changes without animation
   */
  applyInstant(newFontVariables: { [key: string]: string }): void {
    const root = this.document.documentElement;
    Object.entries(newFontVariables).forEach(([property, value]) => {
      root.style.setProperty(property, value);
    });
  }

  private getTextElements(): Element[] {
    // Get all elements that likely contain text
    const selectors = [
      'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
      'p', 'span', 'div', 'a', 'button',
      'label', 'input', 'textarea', 'select',
      '.text', '[class*="text"]', '[class*="font"]'
    ];
    
    const elements: Element[] = [];
    selectors.forEach(selector => {
      const found = Array.from(this.document.querySelectorAll(selector));
      elements.push(...found);
    });
    
    // Remove duplicates and filter out elements without text content
    return Array.from(new Set(elements)).filter(el => {
      const text = el.textContent?.trim();
      return text && text.length > 0;
    });
  }

  private prepareTransition(elements: Element[], config: FontTransitionConfig): void {
    elements.forEach((element, index) => {
      const htmlElement = element as HTMLElement;
      
      // Store original styles
      const originalTransition = htmlElement.style.transition;
      htmlElement.setAttribute('data-original-transition', originalTransition);
      
      // Apply transition styles
      const transitions: string[] = [];
      
      if (config.fadeEffect) {
        transitions.push(`opacity ${config.duration}ms ${config.easing}`);
      }
      
      if (config.scaleEffect) {
        transitions.push(`transform ${config.duration}ms ${config.easing}`);
      }
      
      // Always transition font properties
      transitions.push(
        `font-family ${config.duration}ms ${config.easing}`,
        `font-weight ${config.duration}ms ${config.easing}`,
        `font-size ${config.duration}ms ${config.easing}`
      );
      
      htmlElement.style.transition = transitions.join(', ');
      
      // Add stagger delay
      if (config.stagger > 0) {
        htmlElement.style.transitionDelay = `${index * config.stagger}ms`;
      }
    });
  }

  private async executeTransition(
    elements: Element[],
    newFontVariables: { [key: string]: string },
    config: FontTransitionConfig
  ): Promise<void> {
    // Phase 1: Prepare for transition (fade out / scale down)
    if (config.fadeEffect || config.scaleEffect) {
      elements.forEach(element => {
        const htmlElement = element as HTMLElement;
        
        if (config.fadeEffect) {
          htmlElement.style.opacity = '0.3';
        }
        
        if (config.scaleEffect) {
          htmlElement.style.transform = 'scale(0.98)';
        }
      });
      
      // Wait for fade/scale animation
      await this.delay(config.duration / 2);
    }
    
    // Phase 2: Apply new font variables
    const root = this.document.documentElement;
    Object.entries(newFontVariables).forEach(([property, value]) => {
      root.style.setProperty(property, value);
    });
    
    // Small delay to ensure font variables are applied
    await this.delay(10);
    
    // Phase 3: Restore visibility (fade in / scale up)
    if (config.fadeEffect || config.scaleEffect) {
      elements.forEach(element => {
        const htmlElement = element as HTMLElement;
        
        if (config.fadeEffect) {
          htmlElement.style.opacity = '1';
        }
        
        if (config.scaleEffect) {
          htmlElement.style.transform = 'scale(1)';
        }
      });
    }
    
    // Phase 4: Wait for transition to complete and cleanup
    const maxDelay = elements.length * config.stagger;
    const totalDuration = config.duration + maxDelay + 50; // Add buffer
    
    await this.delay(totalDuration);
    
    // Cleanup: Restore original transition styles
    elements.forEach(element => {
      const htmlElement = element as HTMLElement;
      const originalTransition = htmlElement.getAttribute('data-original-transition') || '';
      
      htmlElement.style.transition = originalTransition;
      htmlElement.style.transitionDelay = '';
      htmlElement.style.opacity = '';
      htmlElement.style.transform = '';
      htmlElement.removeAttribute('data-original-transition');
    });
  }

  private delay(ms: number): Promise<void> {
    return new Promise(resolve => setTimeout(resolve, ms));
  }

  /**
   * Create a custom transition keyframe animation
   */
  createCustomTransition(keyframes: Keyframe[], options: KeyframeAnimationOptions): void {
    const textElements = this.getTextElements();
    
    textElements.forEach((element, index) => {
      const animation = element.animate(keyframes, {
        ...options,
        delay: (options.delay || 0) + (index * 25) // Stagger effect
      });
      
      animation.addEventListener('finish', () => {
        animation.cancel();
      });
    });
  }

  /**
   * Typewriter effect for font changes
   */
  applyTypewriterTransition(newFontVariables: { [key: string]: string }): Observable<void> {
    return new Observable(observer => {
      const textElements = this.getTextElements();
      let completedElements = 0;
      
      this.isTransitioning$.next(true);
      
      // Apply new fonts immediately but keep text invisible
      const root = this.document.documentElement;
      Object.entries(newFontVariables).forEach(([property, value]) => {
        root.style.setProperty(property, value);
      });
      
      textElements.forEach((element, index) => {
        const htmlElement = element as HTMLElement;
        const text = htmlElement.textContent || '';
        const originalText = text;
        
        // Clear text and start typewriter effect
        htmlElement.textContent = '';
        
        let charIndex = 0;
        const typeInterval = setInterval(() => {
          if (charIndex < originalText.length) {
            htmlElement.textContent = originalText.substring(0, charIndex + 1);
            charIndex++;
          } else {
            clearInterval(typeInterval);
            completedElements++;
            
            if (completedElements === textElements.length) {
              this.isTransitioning$.next(false);
              observer.next();
              observer.complete();
            }
          }
        }, 20 + (index * 5)); // Stagger the typing speed
      });
    });
  }
}X>r4xBexport interface FontDefinition {
  family: string;
  url?: string;
  weights: number[];
  fallbacks: string[];
  loadingStrategy: 'eager' | 'lazy' | 'swap';
  category: 'sans-serif' | 'serif' | 'monospace' | 'display' | 'handwriting';
  popularity?: number;
}

export interface FontTheme {
  name: string;
  description?: string;
  fonts: {
    sans: FontDefinition;
    serif: FontDefinition;
    mono: FontDefinition;
    display: FontDefinition;
  };
}

export interface FontPreset {
  [key: string]: FontDefinition;
}

export interface FontLoadingOptions {
  display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';
  weights?: number[];
  subsets?: string[];
  text?: string;
}

export interface FontManagerConfig {
  defaultTheme?: string;
  preloadFonts?: boolean;
  fallbackTimeout?: number;
  cacheEnabled?: boolean;
}ix$import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Observable, Subject, takeUntil } from 'rxjs';
import { UiFontManagerService } from './ui-font-manager.service';
import { FontThemeService } from './services/font-theme.service';
import { FontLoadingStateService, GlobalLoadingState } from './services/font-loading-state.service';
import { FontTransitionService } from './services/font-transition.service';
import { FontTheme, FontDefinition } from './types/font-types';

@Component({
  selector: 'lib-ui-font-manager',
  standalone: true,
  imports: [CommonModule],
  template: `
    <div class="font-manager" [class.loading]="(loadingState$ | async)?.isLoading">
      
      <!-- Font Theme Selector -->
      <div class="theme-selector" *ngIf="showThemeSelector">
        <label for="theme-select">Font Theme:</label>
        <select 
          id="theme-select" 
          [value]="selectedTheme" 
          (change)="onThemeChange($event)"
          [disabled]="(loadingState$ | async)?.isLoading">
          <option value="">Select a theme...</option>
          <option *ngFor="let theme of availableThemes" [value]="theme.name">
            {{theme.name}} - {{theme.description}}
          </option>
        </select>
      </div>

      <!-- Loading Progress -->
      <div class="loading-progress" *ngIf="(loadingState$ | async)?.isLoading">
        <div class="progress-bar">
          <div 
            class="progress-fill" 
            [style.width.%]="(loadingState$ | async)?.progress || 0">
          </div>
        </div>
        <div class="loading-info">
          Loading fonts: {{(loadingState$ | async)?.loadedFonts}}/{{(loadingState$ | async)?.totalFonts}}
          <span *ngIf="(loadingState$ | async)?.currentlyLoading?.length">
            ({{(loadingState$ | async)?.currentlyLoading?.join(', ')}})
          </span>
        </div>
      </div>

      <!-- Error Display -->
      <div class="error-messages" *ngIf="hasErrors">
        <div *ngFor="let error of errorMessages" class="error-message">
          <strong>{{error.fontName}}:</strong> {{error.message}}
        </div>
      </div>

      <!-- Font Preview -->
      <div class="font-preview" *ngIf="showPreview">
        <div class="preview-text sans" style="font-family: var(--font-family-sans, inherit)">
          Sans-serif: The quick brown fox jumps over the lazy dog
        </div>
        <div class="preview-text serif" style="font-family: var(--font-family-serif, inherit)">
          Serif: The quick brown fox jumps over the lazy dog
        </div>
        <div class="preview-text mono" style="font-family: var(--font-family-mono, inherit)">
          Mono: The quick brown fox jumps over the lazy dog
        </div>
        <div class="preview-text display" style="font-family: var(--font-family-display, inherit)">
          Display: The quick brown fox jumps over the lazy dog
        </div>
      </div>

    </div>
  `,
  styles: `
    .font-manager {
      padding: 1rem;
      border: 1px solid #e0e0e0;
      border-radius: 8px;
      background: #fafafa;
      max-width: 600px;
    }

    .font-manager.loading {
      opacity: 0.8;
      pointer-events: none;
    }

    .theme-selector {
      margin-bottom: 1rem;
    }

    .theme-selector label {
      display: block;
      margin-bottom: 0.5rem;
      font-weight: 600;
      color: #333;
    }

    .theme-selector select {
      width: 100%;
      padding: 0.5rem;
      border: 1px solid #ccc;
      border-radius: 4px;
      font-size: 0.9rem;
    }

    .loading-progress {
      margin-bottom: 1rem;
    }

    .progress-bar {
      width: 100%;
      height: 8px;
      background: #e0e0e0;
      border-radius: 4px;
      overflow: hidden;
      margin-bottom: 0.5rem;
    }

    .progress-fill {
      height: 100%;
      background: linear-gradient(90deg, #4CAF50, #2196F3);
      transition: width 0.3s ease;
    }

    .loading-info {
      font-size: 0.8rem;
      color: #666;
    }

    .error-messages {
      margin-bottom: 1rem;
    }

    .error-message {
      padding: 0.5rem;
      background: #ffebee;
      border: 1px solid #f44336;
      border-radius: 4px;
      margin-bottom: 0.5rem;
      font-size: 0.85rem;
      color: #c62828;
    }

    .font-preview {
      border-top: 1px solid #e0e0e0;
      padding-top: 1rem;
    }

    .preview-text {
      margin-bottom: 0.75rem;
      padding: 0.5rem;
      background: white;
      border-radius: 4px;
      border-left: 4px solid #2196F3;
    }

    .preview-text.sans { border-left-color: #4CAF50; }
    .preview-text.serif { border-left-color: #FF9800; }
    .preview-text.mono { 
      border-left-color: #9C27B0;
      font-size: 0.9em;
    }
    .preview-text.display { 
      border-left-color: #f44336;
      font-size: 1.1em;
      font-weight: 600;
    }
  `
})
export class UiFontManagerComponent implements OnInit, OnDestroy {
  @Input() showThemeSelector: boolean = true;
  @Input() showPreview: boolean = true;
  @Input() showLoadingProgress: boolean = true;
  @Input() previewText: string = 'The quick brown fox jumps over the lazy dog';
  
  @Output() themeChanged = new EventEmitter<string>();
  @Output() fontLoaded = new EventEmitter<string>();
  @Output() fontError = new EventEmitter<{fontName: string, error: string}>();

  availableThemes: FontTheme[] = [];
  selectedTheme: string = '';
  loadingState$: Observable<GlobalLoadingState>;
  hasErrors: boolean = false;
  errorMessages: {fontName: string, message: string}[] = [];

  private destroy$ = new Subject<void>();

  constructor(
    private fontManager: UiFontManagerService,
    private themeService: FontThemeService,
    private loadingStateService: FontLoadingStateService,
    private transitionService: FontTransitionService
  ) {
    this.loadingState$ = this.loadingStateService.getGlobalState();
  }

  ngOnInit(): void {
    // Load available themes
    this.availableThemes = this.themeService.getThemes();

    // Monitor loading state for errors
    this.loadingState$
      .pipe(takeUntil(this.destroy$))
      .subscribe(state => {
        this.hasErrors = Object.keys(state.errors).length > 0;
        this.errorMessages = Object.entries(state.errors).map(([fontName, message]) => ({
          fontName,
          message
        }));
      });

    // Listen for active theme changes
    this.themeService.getActiveTheme()
      .pipe(takeUntil(this.destroy$))
      .subscribe(theme => {
        if (theme) {
          this.selectedTheme = theme.name;
        }
      });
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  onThemeChange(event: Event): void {
    const target = event.target as HTMLSelectElement;
    const themeName = target.value;
    
    if (!themeName) return;

    this.selectedTheme = themeName;
    
    // Apply theme with smooth transition
    this.themeService.applyTheme(themeName)
      .pipe(takeUntil(this.destroy$))
      .subscribe({
        next: (success) => {
          if (success) {
            this.themeChanged.emit(themeName);
          }
        },
        error: (error) => {
          console.error('Failed to apply theme:', error);
          this.fontError.emit({fontName: themeName, error: error.message});
        }
      });
  }

  /**
   * Programmatically load a font
   */
  loadFont(fontName: string): void {
    this.fontManager.loadFont(fontName)
      .pipe(takeUntil(this.destroy$))
      .subscribe({
        next: (success) => {
          if (success) {
            this.fontLoaded.emit(fontName);
          }
        },
        error: (error) => {
          this.fontError.emit({fontName, error: error.message});
        }
      });
  }

  /**
   * Apply theme with custom transition
   */
  applyThemeWithTransition(themeName: string, transitionType: 'fade' | 'scale' | 'typewriter' = 'fade'): void {
    const theme = this.themeService.getTheme(themeName);
    if (!theme) return;

    const fontVariables = {
      '--font-family-sans': this.buildFontStack(theme.fonts.sans),
      '--font-family-serif': this.buildFontStack(theme.fonts.serif),
      '--font-family-mono': this.buildFontStack(theme.fonts.mono),
      '--font-family-display': this.buildFontStack(theme.fonts.display)
    };

    let transition$: Observable<void>;
    
    switch (transitionType) {
      case 'scale':
        transition$ = this.transitionService.applyWithScale(fontVariables);
        break;
      case 'typewriter':
        transition$ = this.transitionService.applyTypewriterTransition(fontVariables);
        break;
      default:
        transition$ = this.transitionService.applyWithFade(fontVariables);
    }

    transition$
      .pipe(takeUntil(this.destroy$))
      .subscribe({
        next: () => {
          this.selectedTheme = themeName;
          this.themeChanged.emit(themeName);
        },
        error: (error) => {
          this.fontError.emit({fontName: themeName, error: error.message});
        }
      });
  }

  private buildFontStack(font: FontDefinition): string {
    return [font.family, ...font.fallbacks]
      .map(f => f.includes(' ') ? `"${f}"` : f)
      .join(', ');
  }
}
}!Yxpimport { Injectable, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { BehaviorSubject, Observable, from, of, forkJoin } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { FontDefinition, FontTheme, FontManagerConfig, FontLoadingOptions } from './types/font-types';
import { GOOGLE_FONTS_PRESET, FONT_COMBINATIONS } from './presets/google-fonts-preset';

@Injectable({
  providedIn: 'root'
})
export class UiFontManagerService {
  private loadedFonts = new Set<string>();
  private activeTheme$ = new BehaviorSubject<string>('default');
  private customPresets = new Map<string, FontDefinition>();
  
  private config: FontManagerConfig = {
    defaultTheme: 'default',
    preloadFonts: false,
    fallbackTimeout: 3000,
    cacheEnabled: true
  };

  constructor(@Inject(DOCUMENT) private document: Document) {}

  /**
   * Configure the font manager
   */
  configure(config: Partial<FontManagerConfig>): void {
    this.config = { ...this.config, ...config };
  }

  /**
   * Get all available Google Fonts presets
   */
  getGoogleFontsPresets(): { [key: string]: FontDefinition } {
    return GOOGLE_FONTS_PRESET;
  }

  /**
   * Get popular font combinations
   */
  getFontCombinations(): typeof FONT_COMBINATIONS {
    return FONT_COMBINATIONS;
  }

  /**
   * Add a custom font preset
   */
  addCustomFont(name: string, definition: FontDefinition): void {
    this.customPresets.set(name, definition);
  }

  /**
   * Get all available fonts (Google Fonts + Custom)
   */
  getAllFonts(): { [key: string]: FontDefinition } {
    return {
      ...GOOGLE_FONTS_PRESET,
      ...Object.fromEntries(this.customPresets)
    };
  }

  /**
   * Load a single font dynamically
   */
  loadFont(fontName: string, options?: FontLoadingOptions): Observable<boolean> {
    const font = this.getAllFonts()[fontName];
    if (!font) {
      console.warn(`Font "${fontName}" not found in presets`);
      return of(false);
    }

    if (this.loadedFonts.has(fontName)) {
      return of(true);
    }

    return this.loadFontFromDefinition(font, options).pipe(
      map(() => {
        this.loadedFonts.add(fontName);
        return true;
      }),
      catchError(error => {
        console.error(`Failed to load font "${fontName}":`, error);
        return of(false);
      })
    );
  }

  /**
   * Load multiple fonts
   */
  loadFonts(fontNames: string[], options?: FontLoadingOptions): Observable<boolean[]> {
    const loadObservables = fontNames.map(name => this.loadFont(name, options));
    return forkJoin(loadObservables);
  }

  /**
   * Apply a font theme
   */
  applyTheme(theme: FontTheme): Observable<boolean> {
    const fontsToLoad = Object.values(theme.fonts);
    const fontNames = fontsToLoad.map(font => font.family);

    return this.loadFonts(fontNames).pipe(
      map(results => {
        if (results.every(success => success)) {
          this.updateCSSVariables(theme);
          this.activeTheme$.next(theme.name);
          return true;
        }
        return false;
      })
    );
  }

  /**
   * Get current active theme
   */
  getActiveTheme(): Observable<string> {
    return this.activeTheme$.asObservable();
  }

  /**
   * Create a theme from font combination
   */
  createThemeFromCombination(name: string, combinationName: string): FontTheme | null {
    const combination = FONT_COMBINATIONS[combinationName as keyof typeof FONT_COMBINATIONS];
    if (!combination) return null;

    const allFonts = this.getAllFonts();
    
    return {
      name,
      fonts: {
        sans: allFonts[combination.sans],
        serif: allFonts[combination.serif],
        mono: allFonts[combination.mono],
        display: allFonts[combination.display]
      }
    };
  }

  /**
   * Check if font is loaded
   */
  isFontLoaded(fontName: string): boolean {
    return this.loadedFonts.has(fontName);
  }

  /**
   * Preload fonts for performance
   */
  preloadFonts(fontNames: string[]): void {
    if (!this.config.preloadFonts) return;

    fontNames.forEach(fontName => {
      const font = this.getAllFonts()[fontName];
      if (font?.url) {
        const link = this.document.createElement('link');
        link.rel = 'preload';
        link.href = font.url;
        link.as = 'style';
        this.document.head.appendChild(link);
      }
    });
  }

  private loadFontFromDefinition(font: FontDefinition, options?: FontLoadingOptions): Observable<void> {
    return new Observable(observer => {
      if (!font.url) {
        // Assume system font or already available
        observer.next();
        observer.complete();
        return;
      }

      // Check if already loaded
      const existingLink = this.document.querySelector(`link[href="${font.url}"]`);
      if (existingLink) {
        observer.next();
        observer.complete();
        return;
      }

      // Create and load font
      const link = this.document.createElement('link');
      link.rel = 'stylesheet';
      link.href = this.buildFontURL(font, options);
      
      link.onload = () => {
        observer.next();
        observer.complete();
      };

      link.onerror = (error) => {
        observer.error(error);
      };

      this.document.head.appendChild(link);

      // Fallback timeout
      setTimeout(() => {
        if (!observer.closed) {
          observer.error(new Error('Font loading timeout'));
        }
      }, this.config.fallbackTimeout);
    });
  }

  private buildFontURL(font: FontDefinition, options?: FontLoadingOptions): string {
    if (!font.url) return '';
    
    let url = font.url;
    
    // Add display parameter for Google Fonts
    if (url.includes('fonts.googleapis.com') && options?.display) {
      const separator = url.includes('?') ? '&' : '?';
      url += `${separator}display=${options.display}`;
    }
    
    return url;
  }

  private updateCSSVariables(theme: FontTheme): void {
    const root = this.document.documentElement;
    
    // Update CSS custom properties
    root.style.setProperty('--font-family-sans', this.buildFontStack(theme.fonts.sans));
    root.style.setProperty('--font-family-serif', this.buildFontStack(theme.fonts.serif));
    root.style.setProperty('--font-family-mono', this.buildFontStack(theme.fonts.mono));
    root.style.setProperty('--font-family-display', this.buildFontStack(theme.fonts.display));
  }

  private buildFontStack(font: FontDefinition): string {
    return [font.family, ...font.fallbacks].map(f => f.includes(' ') ? `"${f}"` : f).join(', ');
  }
}
"Ix:/*
 * Public API Surface of ui-font-manager
 */

export * from './lib/ui-font-manager.service';
export * from './lib/ui-font-manager.component';
export * from './lib/services/font-theme.service';
export * from './lib/services/font-transition.service';
export * from './lib/services/font-loading-state.service';
export * from './lib/types/font-types';
export * from './lib/presets/google-fonts-preset';
export * from './lib/presets/font-preset-manager';
&H0ximport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { ContainerComponent } from 'ui-essentials';
import { SearchBarComponent } from 'ui-essentials';
import { FAQConfig, FAQItem } from '../../interfaces/content.interfaces';

@Component({
  selector: 'ui-lp-faq',
  standalone: true,
  imports: [CommonModule, FormsModule, ContainerComponent, SearchBarComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section class="ui-lp-faq" [class]="getComponentClasses()">
      <ui-container [size]="'lg'" [padding]="'md'">
        @if (config().title || config().subtitle) {
          <div class="ui-lp-faq__header">
            @if (config().title) {
              <h2 class="ui-lp-faq__title">{{ config().title }}</h2>
            }
            
            @if (config().subtitle) {
              <p class="ui-lp-faq__subtitle">{{ config().subtitle }}</p>
            }
          </div>
        }
        
        @if (config().searchEnabled) {
          <div class="ui-lp-faq__search">
            <ui-search-bar
              [placeholder]="'Search FAQ...'"
              [(ngModel)]="searchQuery"
              [size]="'lg'"
              [clearable]="true">
            </ui-search-bar>
          </div>
        }
        
        @if (filteredItems().length > 0) {
          <div class="ui-lp-faq__items">
            @for (item of filteredItems(); track item.id) {
              <div 
                class="ui-lp-faq__item"
                [class.ui-lp-faq__item--open]="item.isOpen">
                <button 
                  class="ui-lp-faq__question"
                  (click)="toggleItem(item)"
                  [attr.aria-expanded]="item.isOpen"
                  [attr.aria-controls]="'faq-answer-' + item.id">
                  <span class="ui-lp-faq__question-text">{{ item.question }}</span>
                  <span class="ui-lp-faq__toggle-icon" aria-hidden="true">
                    <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
                      <path d="M8 4l4 4H4l4-4z"/>
                    </svg>
                  </span>
                </button>
                
                <div 
                  class="ui-lp-faq__answer"
                  [id]="'faq-answer-' + item.id"
                  [attr.aria-labelledby]="'faq-question-' + item.id">
                  <div class="ui-lp-faq__answer-content">
                    <p>{{ item.answer }}</p>
                  </div>
                </div>
              </div>
            }
          </div>
        } @else {
          <div class="ui-lp-faq__empty">
            <p>No FAQs found matching your search.</p>
          </div>
        }
      </ui-container>
    </section>
  `,
  styleUrl: './faq-section.component.scss'
})
export class FAQSectionComponent {
  config = signal<FAQConfig>({
    title: 'Frequently Asked Questions',
    items: [],
    searchEnabled: true,
    expandMultiple: false,
    theme: 'default'
  });

  searchQuery = signal<string>('');

  @Input() set configuration(value: FAQConfig) {
    // Initialize isOpen state for items if not provided
    const itemsWithState = value.items.map(item => ({
      ...item,
      isOpen: item.isOpen ?? false
    }));
    
    this.config.set({
      ...value,
      items: itemsWithState
    });
  }

  filteredItems = computed(() => {
    const query = this.searchQuery().toLowerCase().trim();
    if (!query) return this.config().items;

    return this.config().items.filter(item =>
      item.question.toLowerCase().includes(query) ||
      item.answer.toLowerCase().includes(query)
    );
  });

  getComponentClasses(): string {
    const classes = ['ui-lp-faq'];
    
    if (this.config().theme) {
      classes.push(`ui-lp-faq--${this.config().theme}`);
    }
    
    return classes.join(' ');
  }

  toggleItem(item: FAQItem): void {
    const currentConfig = this.config();
    const items = [...currentConfig.items];
    
    if (!currentConfig.expandMultiple) {
      // Close all other items if expandMultiple is false
      items.forEach(i => {
        if (i.id !== item.id) {
          i.isOpen = false;
        }
      });
    }
    
    // Toggle the clicked item
    const targetItem = items.find(i => i.id === item.id);
    if (targetItem) {
      targetItem.isOpen = !targetItem.isOpen;
    }
    
    this.config.set({
      ...currentConfig,
      items
    });
  }
}64vx} export * from './faq-section.component';
export * from './team-grid.component';
export * from './timeline-section.component';+xjimport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ContainerComponent } from 'ui-essentials';
import { TeamConfig, TeamMember } from '../../interfaces/content.interfaces';

@Component({
  selector: 'ui-lp-team-grid',
  standalone: true,
  imports: [CommonModule, ContainerComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section class="ui-lp-team-grid">
      <ui-container [size]="'xl'" [padding]="'md'">
        @if (config().title || config().subtitle) {
          <div class="ui-lp-team-grid__header">
            @if (config().title) {
              <h2 class="ui-lp-team-grid__title">{{ config().title }}</h2>
            }
            
            @if (config().subtitle) {
              <p class="ui-lp-team-grid__subtitle">{{ config().subtitle }}</p>
            }
          </div>
        }
        
        @if (config().members.length > 0) {
          <div 
            class="ui-lp-team-grid__grid"
            [class.ui-lp-team-grid__grid--cols-2]="config().columns === 2"
            [class.ui-lp-team-grid__grid--cols-3]="config().columns === 3"
            [class.ui-lp-team-grid__grid--cols-4]="config().columns === 4">
            
            @for (member of config().members; track member.id) {
              <div class="ui-lp-team-grid__member">
                @if (member.image) {
                  <div class="ui-lp-team-grid__avatar">
                    <img
                      [src]="member.image"
                      [alt]="member.name + ' - ' + member.role"
                      class="ui-lp-team-grid__image">
                  </div>
                }
                
                <div class="ui-lp-team-grid__info">
                  <h3 class="ui-lp-team-grid__name">{{ member.name }}</h3>
                  <p class="ui-lp-team-grid__role">{{ member.role }}</p>
                  
                  @if (config().showBio && member.bio) {
                    <p class="ui-lp-team-grid__bio">{{ member.bio }}</p>
                  }
                  
                  @if (config().showSocial && member.social) {
                    <div class="ui-lp-team-grid__social">
                      @if (member.social.linkedin) {
                        <a 
                          [href]="member.social.linkedin"
                          class="ui-lp-team-grid__social-link"
                          target="_blank"
                          rel="noopener noreferrer"
                          [attr.aria-label]="member.name + ' LinkedIn profile'">
                          <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
                            <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
                          </svg>
                        </a>
                      }
                      
                      @if (member.social.twitter) {
                        <a 
                          [href]="member.social.twitter"
                          class="ui-lp-team-grid__social-link"
                          target="_blank"
                          rel="noopener noreferrer"
                          [attr.aria-label]="member.name + ' Twitter profile'">
                          <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
                            <path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/>
                          </svg>
                        </a>
                      }
                      
                      @if (member.social.github) {
                        <a 
                          [href]="member.social.github"
                          class="ui-lp-team-grid__social-link"
                          target="_blank"
                          rel="noopener noreferrer"
                          [attr.aria-label]="member.name + ' GitHub profile'">
                          <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
                            <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
                          </svg>
                        </a>
                      }
                      
                      @if (member.social.email) {
                        <a 
                          [href]="'mailto:' + member.social.email"
                          class="ui-lp-team-grid__social-link"
                          [attr.aria-label]="'Email ' + member.name">
                          <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
                            <path d="M24 5.457v13.909c0 .904-.732 1.636-1.636 1.636h-3.819V11.73L12 16.64l-6.545-4.91v9.273H1.636A1.636 1.636 0 0 1 0 19.366V5.457c0-.904.732-1.636 1.636-1.636h.832L12 10.77l9.532-6.95h.832c.904 0 1.636.732 1.636 1.637z"/>
                          </svg>
                        </a>
                      }
                      
                      @if (member.social.website) {
                        <a 
                          [href]="member.social.website"
                          class="ui-lp-team-grid__social-link"
                          target="_blank"
                          rel="noopener noreferrer"
                          [attr.aria-label]="member.name + ' website'">
                          <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
                            <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.94-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/>
                          </svg>
                        </a>
                      }
                    </div>
                  }
                </div>
              </div>
            }
          </div>
        } @else {
          <div class="ui-lp-team-grid__empty">
            <p>No team members to display.</p>
          </div>
        }
      </ui-container>
    </section>
  `,
  styleUrl: './team-grid.component.scss'
})
export class TeamGridComponent {
  config = signal<TeamConfig>({
    title: 'Meet Our Team',
    members: [],
    columns: 3,
    showSocial: true,
    showBio: true
  });

  @Input() set configuration(value: TeamConfig) {
    this.config.set(value);
  }
}Ex຤xJimport { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ContainerComponent } from 'ui-essentials';
import { TimelineConfig, TimelineItem } from '../../interfaces/content.interfaces';

@Component({
  selector: 'ui-lp-timeline',
  standalone: true,
  imports: [CommonModule, ContainerComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      class="ui-lp-timeline"
      [class]="getComponentClasses()">
      
      <ui-container [size]="'lg'" [padding]="'md'">
        @if (config().title || config().subtitle) {
          <div class="ui-lp-timeline__header">
            @if (config().title) {
              <h2 class="ui-lp-timeline__title">{{ config().title }}</h2>
            }
            
            @if (config().subtitle) {
              <p class="ui-lp-timeline__subtitle">{{ config().subtitle }}</p>
            }
          </div>
        }
        
        @if (config().items.length > 0) {
          <div class="ui-lp-timeline__container">
            <div class="ui-lp-timeline__line" aria-hidden="true"></div>
            
            <div class="ui-lp-timeline__items">
              @for (item of config().items; track item.id; let i = $index) {
                <div 
                  class="ui-lp-timeline__item"
                  [class]="getItemClasses(item)">
                  
                  <div class="ui-lp-timeline__marker" aria-hidden="true">
                    @if (item.icon) {
                      <div class="ui-lp-timeline__icon">
                        <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
                          @switch (item.icon) {
                            @case ('check') {
                              <path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/>
                            }
                            @case ('star') {
                              <path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z"/>
                            }
                            @case ('rocket') {
                              <path d="M9.19 6.35c-2.04 2.29-3.44 5.58-3.44 5.58s2.12-1.29 4.69-1.29c-.18-.9-.34-1.8-.34-2.72 0-.66.06-1.3.15-1.93-.36.12-.72.24-1.06.36z"/>
                            }
                            @default {
                              <circle cx="12" cy="12" r="3"/>
                            }
                          }
                        </svg>
                      </div>
                    } @else {
                      <div class="ui-lp-timeline__dot"></div>
                    }
                  </div>
                  
                  <div class="ui-lp-timeline__content">
                    @if (config().showDates && item.date) {
                      <div class="ui-lp-timeline__date">{{ item.date }}</div>
                    }
                    
                    <div class="ui-lp-timeline__info">
                      <h3 class="ui-lp-timeline__item-title">
                        {{ item.title }}
                        @if (item.badge) {
                          <span class="ui-lp-timeline__badge">{{ item.badge }}</span>
                        }
                      </h3>
                      
                      <p class="ui-lp-timeline__description">{{ item.description }}</p>
                    </div>
                  </div>
                </div>
              }
            </div>
          </div>
        } @else {
          <div class="ui-lp-timeline__empty">
            <p>No timeline items to display.</p>
          </div>
        }
      </ui-container>
    </section>
  `,
  styleUrl: './timeline-section.component.scss'
})
export class TimelineSectionComponent {
  config = signal<TimelineConfig>({
    title: 'Our Journey',
    items: [],
    orientation: 'vertical',
    theme: 'default',
    showDates: true
  });

  @Input() set configuration(value: TimelineConfig) {
    this.config.set(value);
  }

  getComponentClasses(): string {
    const classes = ['ui-lp-timeline'];
    
    if (this.config().orientation) {
      classes.push(`ui-lp-timeline--${this.config().orientation}`);
    }
    if (this.config().theme) {
      classes.push(`ui-lp-timeline--${this.config().theme}`);
    }
    
    return classes.join(' ');
  }

  getItemClasses(item: TimelineItem): string {
    const classes = ['ui-lp-timeline__item'];
    
    if (item.status) {
      classes.push(`ui-lp-timeline__item--${item.status}`);
    }
    
    return classes.join(' ');
  }
} $x<@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.contact-form {
  background: #ffffff;
  border-radius: 1rem;
  border: 1px solid #e5e7eb;

  &__header {
    text-align: center;
    margin-bottom: 3rem;
  }

  &__title {
    font-size: 2rem;
    font-weight: bold;
    color: #1f2937;
    margin-bottom: 1rem;
  }

  &__description {
    font-size: 1.25rem;
    color: #6b7280;
    line-height: 1.5;
  }

  &__success {
    padding: 2rem;
  }

  &__form {
    display: grid;
    gap: 2rem;

    &--single-column {
      grid-template-columns: 1fr;
    }

    &--two-column {
      grid-template-columns: 1fr 1fr;
      
      @media (max-width: 768px) {
        grid-template-columns: 1fr;
      }
    }

    &--inline {
      display: flex;
      flex-wrap: wrap;
      gap: 1.5rem;
      align-items: flex-end;

      @media (max-width: 768px) {
        flex-direction: column;
        align-items: stretch;
      }
    }
  }

  &__submit {
    grid-column: 1 / -1;
    display: flex;
    justify-content: center;
    margin-top: 2rem;
  }

  &__button {
    min-width: 160px;
  }
}

.success-message {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1.5rem;
  background: #dcfce7;
  border: 1px solid #bbf7d0;
  border-radius: 0.5rem;

  &__icon {
    width: 32px;
    height: 32px;
    background: #10b981;
    color: white;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 18px;
    font-weight: bold;
    flex-shrink: 0;
  }

  &__text {
    color: #166534;
    font-weight: 500;
    font-size: 1.25rem;
    line-height: 1.4;
  }
}

.form-field {
  &--full-width {
    grid-column: 1 / -1;
  }

  &--checkbox {
    grid-column: 1 / -1;
  }
}

.input-group {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;

  &__label {
    font-size: 1rem;
    font-weight: 500;
    color: #1f2937;
    display: flex;
    align-items: center;
    gap: 0.25rem;
  }

  &__required {
    color: #dc2626;
    font-weight: bold;
  }

  &__input,
  &__textarea,
  &__select {
    padding: 1rem;
    border: 2px solid #d1d5db;
    border-radius: 0.5rem;
    font-size: 1rem;
    color: #1f2937;
    background: #ffffff;
    transition: all 0.2s;
    outline: none;

    &:focus {
      border-color: #3b82f6;
    }

    &::placeholder {
      color: #9ca3af;
    }

    &--error {
      border-color: #dc2626;
      
      &:focus {
        border-color: #dc2626;
      }
    }
  }

  &__textarea {
    resize: vertical;
    min-height: 100px;
    font-family: inherit;
    line-height: 1.5;
  }

  &__select {
    cursor: pointer;
    background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6,9 12,15 18,9'%3e%3c/polyline%3e%3c/svg%3e");
    background-repeat: no-repeat;
    background-position: right 1rem center;
    background-size: 16px;
    padding-right: 3rem;
    appearance: none;
  }

  &__error {
    font-size: 0.875rem;
    color: #dc2626;
    display: flex;
    align-items: center;
    gap: 0.5rem;

    &::before {
      content: '⚠';
      font-size: 14px;
    }
  }
}

.checkbox-group {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;

  &__label {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    cursor: pointer;
    user-select: none;
  }

  &__input {
    position: absolute;
    opacity: 0;
    pointer-events: none;

    &:checked + .checkbox-group__checkmark {
      background-color: #3b82f6;
      border-color: #3b82f6;

      &::after {
        opacity: 1;
        transform: scale(1);
      }
    }
  }

  &__checkmark {
    width: 20px;
    height: 20px;
    border: 2px solid #d1d5db;
    border-radius: 0.25rem;
    background: #ffffff;
    position: relative;
    flex-shrink: 0;
    transition: all 0.2s;
    margin-top: 2px;

    &::after {
      content: '';
      position: absolute;
      left: 50%;
      top: 50%;
      width: 6px;
      height: 10px;
      border: solid white;
      border-width: 0 2px 2px 0;
      transform: translate(-50%, -60%) rotate(45deg) scale(0);
      opacity: 0;
      transition: all 0.2s;
    }
  }

  &__text {
    font-size: 1rem;
    color: #1f2937;
    line-height: 1.5;
  }

  &__required {
    color: #dc2626;
    font-weight: bold;
    margin-left: 0.25rem;
  }

  &__error {
    font-size: 0.875rem;
    color: #dc2626;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-left: 32px;

    &::before {
      content: '⚠';
      font-size: 14px;
    }
  }
}LG(Jxx$I[newsletter-signup {
  &__content {
    width: 100%;
  }

  &__header {
    margin-bottom: 2&1.5?
%#0.5rem3L*?	Zwidth: 100%;
  }

  &__privacyo(`(  margin-top: 1rem;
    margin-bottom: 0M`Ggroup {
  margin-bottom: 1.5rem;

  &:last-child {
    margin-bottom: 0^
margin-top]email-input {
!P1Gtransition: border-color 0.2s;
  overflow: hidden;

  &:focus-within {
/  }

  &__field {
    flex: 1; "none;
    background: transparent;.	+s  }

  &__button {
    border-radius: 0;
    min-width: 120px;
    font-weight: 600;
    white-space: nowrap;
  }
}nx()import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule, AbstractControl } from '@angular/forms';
import { ButtonComponent, FlexComponent, ContainerComponent } from 'ui-essentials';
import { ContactFormConfig, FormField } from '../../interfaces/conversion.interfaces';

@Component({
  selector: 'ui-contact-form',
  standalone: true,
  imports: [
    CommonModule,
    ReactiveFormsModule,
    ButtonComponent,
    FlexComponent,
    ContainerComponent
  ],
  template: `
    <div class="contact-form">
      <ui-container>
        
        <!-- Header -->
        <div *ngIf="config.title || config.description" class="contact-form__header">
          <h2 *ngIf="config.title" class="contact-form__title">{{ config.title }}</h2>
          <p *ngIf="config.description" class="contact-form__description">{{ config.description }}</p>
        </div>

        <!-- Success Message -->
        <div *ngIf="showSuccess" class="contact-form__success">
          <div class="success-message">
            <span class="success-message__icon">✓</span>
            <span class="success-message__text">{{ config.successMessage }}</span>
          </div>
        </div>

        <!-- Form -->
        <form 
          *ngIf="!showSuccess"
          [formGroup]="contactForm" 
          (ngSubmit)="onSubmit()"
          class="contact-form__form"
          [class.contact-form__form--single-column]="config.layout === 'single-column'"
          [class.contact-form__form--two-column]="config.layout === 'two-column'"
          [class.contact-form__form--inline]="config.layout === 'inline'">
          
          <!-- Dynamic Fields -->
          <div 
            *ngFor="let field of config.fields; trackBy: trackByField"
            class="form-field"
            [class.form-field--full-width]="field.type === 'textarea' || config.layout === 'single-column'"
            [class.form-field--checkbox]="field.type === 'checkbox'">
            
            <!-- Text Input -->
            <div *ngIf="field.type === 'text' || field.type === 'email' || field.type === 'tel'" class="input-group">
              <label [for]="field.name" class="input-group__label">
                {{ field.label }}
                <span *ngIf="field.required" class="input-group__required">*</span>
              </label>
              <input
                [id]="field.name"
                [type]="field.type"
                [formControlName]="field.name"
                [placeholder]="field.placeholder || ''"
                class="input-group__input"
                [class.input-group__input--error]="isFieldInvalid(field.name)"
                [attr.aria-describedby]="field.name + '-error'"
                [attr.aria-invalid]="isFieldInvalid(field.name)">
              
              <div 
                *ngIf="isFieldInvalid(field.name)" 
                [id]="field.name + '-error'"
                class="input-group__error"
                role="alert">
                {{ getFieldError(field.name) }}
              </div>
            </div>

            <!-- Textarea -->
            <div *ngIf="field.type === 'textarea'" class="input-group">
              <label [for]="field.name" class="input-group__label">
                {{ field.label }}
                <span *ngIf="field.required" class="input-group__required">*</span>
              </label>
              <textarea
                [id]="field.name"
                [formControlName]="field.name"
                [placeholder]="field.placeholder || ''"
                [rows]="field.rows || 4"
                class="input-group__textarea"
                [class.input-group__textarea--error]="isFieldInvalid(field.name)"
                [attr.aria-describedby]="field.name + '-error'"
                [attr.aria-invalid]="isFieldInvalid(field.name)">
              </textarea>
              
              <div 
                *ngIf="isFieldInvalid(field.name)" 
                [id]="field.name + '-error'"
                class="input-group__error"
                role="alert">
                {{ getFieldError(field.name) }}
              </div>
            </div>

            <!-- Select -->
            <div *ngIf="field.type === 'select'" class="input-group">
              <label [for]="field.name" class="input-group__label">
                {{ field.label }}
                <span *ngIf="field.required" class="input-group__required">*</span>
              </label>
              <select
                [id]="field.name"
                [formControlName]="field.name"
                class="input-group__select"
                [class.input-group__select--error]="isFieldInvalid(field.name)"
                [attr.aria-describedby]="field.name + '-error'"
                [attr.aria-invalid]="isFieldInvalid(field.name)">
                <option value="" disabled>{{ field.placeholder || 'Select an option...' }}</option>
                <option *ngFor="let option of field.options" [value]="option.value">
                  {{ option.label }}
                </option>
              </select>
              
              <div 
                *ngIf="isFieldInvalid(field.name)" 
                [id]="field.name + '-error'"
                class="input-group__error"
                role="alert">
                {{ getFieldError(field.name) }}
              </div>
            </div>

            <!-- Checkbox -->
            <div *ngIf="field.type === 'checkbox'" class="checkbox-group">
              <label class="checkbox-group__label">
                <input
                  type="checkbox"
                  [formControlName]="field.name"
                  class="checkbox-group__input"
                  [attr.aria-describedby]="field.name + '-error'"
                  [attr.aria-invalid]="isFieldInvalid(field.name)">
                <span class="checkbox-group__checkmark"></span>
                <span class="checkbox-group__text">
                  {{ field.label }}
                  <span *ngIf="field.required" class="checkbox-group__required">*</span>
                </span>
              </label>
              
              <div 
                *ngIf="isFieldInvalid(field.name)" 
                [id]="field.name + '-error'"
                class="checkbox-group__error"
                role="alert">
                {{ getFieldError(field.name) }}
              </div>
            </div>
          </div>

          <!-- Submit Button -->
          <div class="contact-form__submit">
            <ui-button
              type="submit"
              variant="filled"
              [size]="'large'"
              [disabled]="contactForm.invalid || isLoading"
              [loading]="isLoading"
              class="contact-form__button">
              {{ config.submitText }}
            </ui-button>
          </div>
        </form>
      </ui-container>
    </div>
  `,
  styleUrls: ['./contact-form.component.scss']
})
export class ContactFormComponent implements OnInit {
  @Input() config!: ContactFormConfig;
  @Output() submit = new EventEmitter<any>();

  contactForm: FormGroup = new FormGroup({});
  isLoading = false;
  showSuccess = false;

  constructor(private fb: FormBuilder) {}

  ngOnInit() {
    this.buildForm();
  }

  private buildForm() {
    const formControls: { [key: string]: any } = {};

    this.config.fields.forEach(field => {
      const validators = [];
      
      if (field.required) {
        if (field.type === 'checkbox') {
          validators.push(Validators.requiredTrue);
        } else {
          validators.push(Validators.required);
        }
      }

      if (field.type === 'email') {
        validators.push(Validators.email);
      }

      if (field.validation) {
        if (field.validation.minLength) {
          validators.push(Validators.minLength(field.validation.minLength));
        }
        if (field.validation.maxLength) {
          validators.push(Validators.maxLength(field.validation.maxLength));
        }
        if (field.validation.pattern) {
          validators.push(Validators.pattern(field.validation.pattern));
        }
        if (field.validation.custom) {
          validators.push((control: AbstractControl) => {
            const error = field.validation!.custom!(control.value);
            return error ? { custom: error } : null;
          });
        }
      }

      const defaultValue = field.type === 'checkbox' ? false : '';
      formControls[field.name] = [defaultValue, validators];
    });

    this.contactForm = this.fb.group(formControls);
  }

  trackByField(index: number, field: FormField): string {
    return field.name;
  }

  isFieldInvalid(fieldName: string): boolean {
    const control = this.contactForm.get(fieldName);
    return !!(control && control.invalid && control.touched);
  }

  getFieldError(fieldName: string): string {
    const control = this.contactForm.get(fieldName);
    if (!control || !control.errors) return '';

    const field = this.config.fields.find(f => f.name === fieldName);
    
    if (control.errors['required']) {
      return `${field?.label} is required`;
    }
    if (control.errors['email']) {
      return 'Please enter a valid email address';
    }
    if (control.errors['minlength']) {
      return `${field?.label} must be at least ${control.errors['minlength'].requiredLength} characters`;
    }
    if (control.errors['maxlength']) {
      return `${field?.label} must not exceed ${control.errors['maxlength'].requiredLength} characters`;
    }
    if (control.errors['pattern']) {
      return `${field?.label} format is invalid`;
    }
    if (control.errors['custom']) {
      return control.errors['custom'];
    }
    if (control.errors['requiredTrue']) {
      return `${field?.label} must be checked`;
    }

    return 'Invalid input';
  }

  async onSubmit() {
    if (this.contactForm.valid) {
      this.isLoading = true;
      
      try {
        this.submit.emit(this.contactForm.value);

        // Simulate API call
        await new Promise(resolve => setTimeout(resolve, 1500));
        
        this.showSuccess = true;
        this.contactForm.reset();
      } catch (error) {
        console.error('Contact form submission failed:', error);
      } finally {
        this.isLoading = false;
      }
    } else {
      // Mark all fields as touched to show validation errors
      this.contactForm.markAllAsTouched();
    }
  }
}ymx<
@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.cta-section {
  position: relative;
  overflow: hidden;
  padding: 6rem 0;

  &--gradient {
    background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 50%, #8b5cf6 100%);
  }

  &--pattern {
    background-color: #f8fafc;
    background-image: radial-gradient(circle at 2px 2px, #e2e8f0 2px, transparent 0);
    background-size: 60px 60px;
  }

  &--image {
    background-color: #f8fafc;
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    
    &::before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: rgba(0, 0, 0, 0.5);
      z-index: 1;
    }
  }

  &--solid {
    background: #3b82f6;
  }

  &__content {
    position: relative;
    z-index: 2;
    text-align: center;
    max-width: 800px;
    margin: 0 auto;
  }

  &__urgency {
    margin-bottom: 2rem;
    
    .countdown {
      display: flex;
      justify-content: center;
      gap: 2rem;
      margin-bottom: 1rem;

      &__item {
        text-align: center;
      }

      &__value {
        display: block;
        font-size: 2rem;
        font-weight: bold;
        color: white;
        line-height: 1;
      }

      &__label {
        display: block;
        font-size: 0.75rem;
        color: rgba(255, 255, 255, 0.8);
        text-transform: uppercase;
        letter-spacing: 0.05em;
        margin-top: 0.5rem;
      }
    }

    .limited-offer {
      display: inline-flex;
      align-items: center;
      gap: 0.5rem;
      background: #f59e0b;
      color: #000;
      padding: 0.5rem 1rem;
      border-radius: 9999px;
      font-size: 0.75rem;
      font-weight: 500;

      &__text {
        text-transform: uppercase;
        letter-spacing: 0.025em;
      }

      &__remaining {
        font-weight: bold;
      }
    }

    .social-proof__text {
      color: white;
      font-size: 1rem;
      font-weight: 500;
      background: rgba(255, 255, 255, 0.1);
      padding: 0.5rem 1rem;
      border-radius: 0.5rem;
      backdrop-filter: blur(10px);
    }
  }

  &__title {
    font-size: 3rem;
    font-weight: bold;
    color: white;
    margin-bottom: 2rem;
    line-height: 1.2;
  }

  &__description {
    font-size: 1.25rem;
    color: rgba(255, 255, 255, 0.9);
    margin-bottom: 3rem;
    max-width: 600px;
    margin-left: auto;
    margin-right: auto;
    line-height: 1.6;
  }

  &__actions {
    display: flex;
    gap: 1rem;
    justify-content: center;
    flex-wrap: wrap;
  }

  &__button {
    min-width: 160px;
  }
}`㿻xDimport { Component, Input } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonComponent, ContainerComponent } from 'ui-essentials';
import { CTASectionConfig } from '../../interfaces/conversion.interfaces';

@Component({
  selector: 'ui-cta-section',
  standalone: true,
  imports: [
    CommonModule,
    ButtonComponent,
    ContainerComponent,
  ],
  template: `
    <section 
      class="cta-section"
      [class.cta-section--gradient]="config.backgroundType === 'gradient'"
      [class.cta-section--pattern]="config.backgroundType === 'pattern'"
      [class.cta-section--image]="config.backgroundType === 'image'"
      [class.cta-section--solid]="config.backgroundType === 'solid'">
      
      <ui-container>
        <div class="cta-section__content">
          
          <!-- Urgency Indicator -->
          <div 
            *ngIf="config.urgency" 
            class="cta-section__urgency"
            [class.cta-section__urgency--countdown]="config.urgency.type === 'countdown'"
            [class.cta-section__urgency--limited]="config.urgency.type === 'limited-offer'"
            [class.cta-section__urgency--social]="config.urgency.type === 'social-proof'">
            
            <div *ngIf="config.urgency.type === 'countdown' && config.urgency.endDate" class="countdown">
              <div class="countdown__item">
                <span class="countdown__value">{{ getTimeRemaining().days }}</span>
                <span class="countdown__label">Days</span>
              </div>
              <div class="countdown__item">
                <span class="countdown__value">{{ getTimeRemaining().hours }}</span>
                <span class="countdown__label">Hours</span>
              </div>
              <div class="countdown__item">
                <span class="countdown__value">{{ getTimeRemaining().minutes }}</span>
                <span class="countdown__label">Minutes</span>
              </div>
            </div>
            
            <div *ngIf="config.urgency.type === 'limited-offer'" class="limited-offer">
              <span class="limited-offer__text">{{ config.urgency.text }}</span>
              <span *ngIf="config.urgency.remaining" class="limited-offer__remaining">
                Only {{ config.urgency.remaining }} left!
              </span>
            </div>
            
            <div *ngIf="config.urgency.type === 'social-proof'" class="social-proof">
              <span class="social-proof__text">{{ config.urgency.text }}</span>
            </div>
          </div>

          <!-- Main Content -->
          <h2 class="cta-section__title">{{ config.title }}</h2>
          
          <p *ngIf="config.description" class="cta-section__description">
            {{ config.description }}
          </p>

          <!-- CTA Buttons -->
          <div class="cta-section__actions">
            <ui-button
              [variant]="config.ctaPrimary.variant || 'filled'"
              [size]="config.ctaPrimary.size || 'large'"
              [disabled]="config.ctaPrimary.disabled || false"
              [loading]="config.ctaPrimary.loading || false"
              (click)="config.ctaPrimary.action()"
              class="cta-section__button cta-section__button--primary">
              {{ config.ctaPrimary.text }}
            </ui-button>
            
            <ui-button
              *ngIf="config.ctaSecondary"
              [variant]="config.ctaSecondary.variant || 'outlined'"
              [size]="config.ctaSecondary.size || 'large'"
              [disabled]="config.ctaSecondary.disabled || false"
              [loading]="config.ctaSecondary.loading || false"
              (click)="config.ctaSecondary.action()"
              class="cta-section__button cta-section__button--secondary">
              {{ config.ctaSecondary.text }}
            </ui-button>
          </div>
        </div>
      </ui-container>
    </section>
  `,
  styleUrls: ['./cta-section.component.scss']
})
export class CTASectionComponent {
  @Input() config!: CTASectionConfig;

  getTimeRemaining(): { days: number; hours: number; minutes: number; seconds: number } {
    if (!this.config.urgency?.endDate) {
      return { days: 0, hours: 0, minutes: 0, seconds: 0 };
    }

    const now = new Date().getTime();
    const end = this.config.urgency.endDate.getTime();
    const difference = end - now;

    if (difference > 0) {
      return {
        days: Math.floor(difference / (1000 * 60 * 60 * 24)),
        hours: Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),
        minutes: Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60)),
        seconds: Math.floor((difference % (1000 * 60)) / 1000)
      };
    }

    return { days: 0, hours: 0, minutes: 0, seconds: 0 };
  }
}o
6
x Sexport * from './cta-section.component';
export * from './pricing-table.component';
export * from './newsletter-signup.component';
export * from './contact-form.component';T<xvimport { Component, Input, Output, EventEmitter } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ButtonComponent, FlexComponent, CheckboxComponent } from 'ui-essentials';
import { NewsletterSignupConfig } from '../../interfaces/conversion.interfaces';

@Component({
  selector: 'ui-newsletter-signup',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule,
    ButtonComponent,
    FlexComponent,
    CheckboxComponent
  ],
  template: `
    <div 
      class="newsletter-signup"
      [class.newsletter-signup--inline]="config.variant === 'inline'"
      [class.newsletter-signup--modal]="config.variant === 'modal'"
      [class.newsletter-signup--sidebar]="config.variant === 'sidebar'"
      [class.newsletter-signup--footer]="config.variant === 'footer'">
      
      <div class="newsletter-signup__content">
        <!-- Header -->
        <div class="newsletter-signup__header">
          <h3 class="newsletter-signup__title">{{ config.title }}</h3>
          <p *ngIf="config.description" class="newsletter-signup__description">
            {{ config.description }}
          </p>
        </div>

        <!-- Success Message -->
        <div *ngIf="showSuccess" class="newsletter-signup__success">
          <div class="success-message">
            <span class="success-message__icon">✓</span>
            <span class="success-message__text">{{ config.successMessage }}</span>
          </div>
        </div>

        <!-- Form -->
        <form 
          *ngIf="!showSuccess"
          [formGroup]="signupForm" 
          (ngSubmit)="onSubmit()"
          class="newsletter-signup__form">
          
          <!-- Email Input -->
          <div class="form-group">
            <div class="email-input">
              <input
                type="email"
                formControlName="email"
                [placeholder]="config.placeholder"
                class="email-input__field"
                [class.email-input__field--error]="emailControl?.invalid && emailControl?.touched"
                [attr.aria-label]="config.placeholder">
              
              <ui-button
                type="submit"
                variant="filled"
                [size]="'medium'"
                [disabled]="signupForm.invalid || isLoading"
                [loading]="isLoading"
                class="email-input__button">
                {{ config.ctaText }}
              </ui-button>
            </div>
            
            <!-- Email Validation Error -->
            <div 
              *ngIf="emailControl?.invalid && emailControl?.touched" 
              class="form-group__error">
              <span *ngIf="emailControl?.errors?.['required']">Email is required</span>
              <span *ngIf="emailControl?.errors?.['email']">Please enter a valid email address</span>
            </div>
          </div>

          <!-- Privacy Checkbox -->
          <div *ngIf="config.showPrivacyCheckbox" class="form-group">
            <ui-checkbox
              formControlName="privacy"
              [required]="true"
              class="privacy-checkbox">
              <span class="privacy-checkbox__text">
                I agree to receive marketing communications and accept the 
                <a href="/privacy" target="_blank" class="privacy-checkbox__link">privacy policy</a>
              </span>
            </ui-checkbox>
            
            <div 
              *ngIf="privacyControl?.invalid && privacyControl?.touched" 
              class="form-group__error">
              <span>You must accept the privacy policy to continue</span>
            </div>
          </div>

          <!-- Privacy Text -->
          <p *ngIf="config.privacyText && !config.showPrivacyCheckbox" class="newsletter-signup__privacy">
            {{ config.privacyText }}
          </p>
        </form>
      </div>
    </div>
  `,
  styleUrls: ['./newsletter-signup.component.scss']
})
export class NewsletterSignupComponent {
  @Input() config!: NewsletterSignupConfig;
  @Output() signup = new EventEmitter<{ email: string; privacyAccepted?: boolean }>();

  signupForm: FormGroup;
  isLoading = false;
  showSuccess = false;

  constructor(private fb: FormBuilder) {
    this.signupForm = this.fb.group({
      email: ['', [Validators.required, Validators.email]],
      privacy: [false]
    });
  }

  ngOnInit() {
    if (this.config.showPrivacyCheckbox) {
      this.signupForm.get('privacy')?.setValidators([Validators.requiredTrue]);
    }
  }

  get emailControl() {
    return this.signupForm.get('email');
  }

  get privacyControl() {
    return this.signupForm.get('privacy');
  }

  async onSubmit() {
    if (this.signupForm.valid) {
      this.isLoading = true;
      
      try {
        const formValue = this.signupForm.value;
        this.signup.emit({
          email: formValue.email,
          privacyAccepted: formValue.privacy
        });

        // Simulate API call
        await new Promise(resolve => setTimeout(resolve, 1000));
        
        this.showSuccess = true;
        this.signupForm.reset();
      } catch (error) {
        console.error('Newsletter signup failed:', error);
      } finally {
        this.isLoading = false;
      }
    } else {
      // Mark all fields as touched to show validation errors
      this.signupForm.markAllAsTouched();
    }
  }
},tx&@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.pricing-table {
  padding: 6rem 0;
  background: #ffffff;

  &__header {
    text-align: center;
    margin-bottom: 3rem;
  }

  &__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    gap: 2rem;
    max-width: 1200px;
    margin: 0 auto;
  }

  &__plan {
    background: #f8fafc;
    border-radius: 1rem;
    padding: 2rem;
    position: relative;
    border: 2px solid transparent;
    transition: all 0.3s ease;
    
    &:hover {
      transform: translateY(-4px);
      box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
    }

    &--popular,
    &--highlighted {
      border-color: #3b82f6;
      transform: scale(1.05);
      z-index: 1;
      box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);

      &:hover {
        transform: scale(1.05) translateY(-4px);
      }
    }
  }
}

.billing-toggle {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1rem;
  margin-bottom: 2rem;

  &__label {
    font-size: 1rem;
    font-weight: 500;
    color: #6b7280;
    transition: color 0.2s;

    &--active {
      color: #1f2937;
      font-weight: 600;
    }
  }

  &__discount {
    display: inline-block;
    margin-left: 0.5rem;
    padding: 0.25rem 0.5rem;
    background: #dcfce7;
    color: #166534;
    font-size: 0.75rem;
    font-weight: 500;
    border-radius: 0.25rem;
  }
}

.pricing-plan {
  &__badge {
    position: absolute;
    top: -12px;
    left: 50%;
    transform: translateX(-50%);
    background: #3b82f6;
    color: white;
    padding: 0.5rem 1rem;
    border-radius: 9999px;
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.025em;
  }

  &__header {
    text-align: center;
    margin-bottom: 2rem;
  }

  &__name {
    font-size: 1.5rem;
    font-weight: bold;
    color: #1f2937;
    margin-bottom: 0.5rem;
  }

  &__description {
    color: #6b7280;
    font-size: 1rem;
  }

  &__price {
    text-align: center;
    margin-bottom: 3rem;
    display: flex;
    align-items: baseline;
    justify-content: center;
    gap: 0.25rem;
  }

  &__currency {
    font-size: 1.25rem;
    font-weight: 500;
    color: #6b7280;
  }

  &__amount {
    font-size: 3rem;
    font-weight: bold;
    color: #1f2937;
  }

  &__suffix {
    font-size: 1rem;
    color: #6b7280;
    margin-left: 0.5rem;
  }

  &__features {
    list-style: none;
    padding: 0;
    margin: 0 0 3rem 0;
  }

  &__feature {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    padding: 1rem 0;
    border-bottom: 1px solid #e5e7eb;

    &:last-child {
      border-bottom: none;
    }

    &--highlight {
      background: #eff6ff;
      margin: 0 -1rem;
      padding: 1rem;
      border-radius: 0.5rem;
      border-bottom: none;
    }

    &--excluded {
      opacity: 0.6;
      
      .pricing-plan__feature-text {
        text-decoration: line-through;
        color: #9ca3af;
      }
    }
  }

  &__feature-icon {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    position: relative;
    margin-top: 2px;

    &--check {
      background: #dcfce7;
      color: #166534;
      
      &::after {
        content: '✓';
        font-size: 12px;
        font-weight: bold;
      }
    }

    &--cross {
      background: #fee2e2;
      color: #dc2626;
      
      &::after {
        content: '✕';
        font-size: 12px;
        font-weight: bold;
      }
    }
  }

  &__feature-text {
    font-size: 1rem;
    color: #1f2937;
    line-height: 1.5;
  }

  &__cta {
    text-align: center;
  }

  &__button {
    width: 100%;
    font-weight: 600;
  }
}I7`x;import { Component, Input } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { ButtonComponent, ContainerComponent, FlexComponent, SwitchComponent } from 'ui-essentials';
import { PricingTableConfig, PricingPlan } from '../../interfaces/conversion.interfaces';

@Component({
  selector: 'ui-pricing-table',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    ButtonComponent,
    ContainerComponent,
    FlexComponent,
    SwitchComponent
  ],
  template: `
    <section class="pricing-table">
      <ui-container>
        
        <!-- Billing Toggle -->
        <div class="pricing-table__header">
          <div class="billing-toggle">
            <span 
              class="billing-toggle__label"
              [class.billing-toggle__label--active]="!isYearly">
              {{ config.billingToggle.monthlyLabel }}
            </span>
            
            <ui-switch
              [(ngModel)]="isYearly"
              class="billing-toggle__switch">
            </ui-switch>
            
            <span 
              class="billing-toggle__label"
              [class.billing-toggle__label--active]="isYearly">
              {{ config.billingToggle.yearlyLabel }}
              <span *ngIf="config.billingToggle.discountText" class="billing-toggle__discount">
                {{ config.billingToggle.discountText }}
              </span>
            </span>
          </div>
        </div>

        <!-- Pricing Plans Grid -->
        <div class="pricing-table__grid">
          <div 
            *ngFor="let plan of config.plans" 
            class="pricing-table__plan"
            [class.pricing-table__plan--popular]="plan.popular"
            [class.pricing-table__plan--highlighted]="config.highlightedPlan === plan.id">
            
            <!-- Plan Badge -->
            <div *ngIf="plan.badge || plan.popular" class="pricing-plan__badge">
              {{ plan.badge || 'Most Popular' }}
            </div>

            <!-- Plan Header -->
            <div class="pricing-plan__header">
              <h3 class="pricing-plan__name">{{ plan.name }}</h3>
              <p *ngIf="plan.description" class="pricing-plan__description">
                {{ plan.description }}
              </p>
            </div>

            <!-- Plan Price -->
            <div class="pricing-plan__price">
              <span class="pricing-plan__currency">{{ plan.price.currency }}</span>
              <span class="pricing-plan__amount">
                {{ isYearly ? plan.price.yearly : plan.price.monthly }}
              </span>
              <span *ngIf="plan.price.suffix" class="pricing-plan__suffix">
                {{ plan.price.suffix }}
              </span>
            </div>

            <!-- Plan Features -->
            <ul class="pricing-plan__features">
              <li 
                *ngFor="let feature of plan.features"
                class="pricing-plan__feature"
                [class.pricing-plan__feature--included]="feature.included"
                [class.pricing-plan__feature--excluded]="!feature.included"
                [class.pricing-plan__feature--highlight]="feature.highlight">
                
                <span class="pricing-plan__feature-icon" 
                      [class.pricing-plan__feature-icon--check]="feature.included"
                      [class.pricing-plan__feature-icon--cross]="!feature.included">
                </span>
                
                <span class="pricing-plan__feature-text">
                  {{ feature.name }}
                  <span *ngIf="feature.description" class="pricing-plan__feature-description">
                    {{ feature.description }}
                  </span>
                </span>
              </li>
            </ul>

            <!-- Plan CTA -->
            <div class="pricing-plan__cta">
              <ui-button
                [variant]="plan.popular ? 'filled' : (plan.cta.variant || 'outlined')"
                [size]="plan.cta.size || 'large'"
                [disabled]="plan.cta.disabled || false"
                [loading]="plan.cta.loading || false"
                (click)="plan.cta.action()"
                class="pricing-plan__button">
                {{ plan.cta.text }}
              </ui-button>
            </div>
          </div>
        </div>

        <!-- Features Comparison Table (if enabled) -->
        <div *ngIf="config.featuresComparison" class="pricing-table__comparison">
          <h3 class="comparison__title">Feature Comparison</h3>
          <div class="comparison__table">
            <div class="comparison__header">
              <div class="comparison__cell comparison__cell--feature">Features</div>
              <div *ngFor="let plan of config.plans" class="comparison__cell comparison__cell--plan">
                {{ plan.name }}
              </div>
            </div>
            
            <div *ngFor="let featureName of getAllFeatureNames()" class="comparison__row">
              <div class="comparison__cell comparison__cell--feature">{{ featureName }}</div>
              <div *ngFor="let plan of config.plans" class="comparison__cell comparison__cell--value">
                <span 
                  class="comparison__icon"
                  [class.comparison__icon--check]="planHasFeature(plan, featureName)"
                  [class.comparison__icon--cross]="!planHasFeature(plan, featureName)">
                </span>
              </div>
            </div>
          </div>
        </div>
      </ui-container>
    </section>
  `,
  styleUrls: ['./pricing-table.component.scss']
})
export class PricingTableComponent {
  @Input() config!: PricingTableConfig;
  
  isYearly = false;

  getAllFeatureNames(): string[] {
    const allFeatures = new Set<string>();
    this.config.plans.forEach(plan => {
      plan.features.forEach(feature => {
        allFeatures.add(feature.name);
      });
    });
    return Array.from(allFeatures);
  }

  planHasFeature(plan: PricingPlan, featureName: string): boolean {
    const feature = plan.features.find(f => f.name === featureName);
    return feature?.included || false;
  }
}o'dxLimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ContainerComponent } from 'ui-essentials';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faArrowRight } from '@fortawesome/free-solid-svg-icons';
import { FeatureGridConfig, FeatureItem, FeatureLink } from '../../interfaces/feature.interfaces';

@Component({
  selector: 'ui-lp-feature-grid',
  standalone: true,
  imports: [CommonModule, ContainerComponent, FaIconComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      class="ui-lp-feature-grid"
      [class]="getComponentClasses()"
      [attr.aria-label]="'Features section'">
      
      <ui-container [size]="'xl'" [padding]="'lg'">
        @if (config().title || config().subtitle) {
          <div class="ui-lp-feature-grid__header">
            @if (config().title) {
              <h2 class="ui-lp-feature-grid__title">{{ config().title }}</h2>
            }
            @if (config().subtitle) {
              <p class="ui-lp-feature-grid__subtitle">{{ config().subtitle }}</p>
            }
          </div>
        }
        
        <div 
          class="ui-lp-feature-grid__items"
          [class.ui-lp-feature-grid__items--auto]="config().columns === 'auto'"
          [class.ui-lp-feature-grid__items--2]="config().columns === 2"
          [class.ui-lp-feature-grid__items--3]="config().columns === 3"
          [class.ui-lp-feature-grid__items--4]="config().columns === 4">
          
          @for (feature of config().features; track feature.id; let index = $index) {
            <div 
              class="ui-lp-feature-grid__item"
              [attr.data-animation-delay]="index * 100"
              (click)="handleFeatureClick(feature)">
              
              @if (config().showIcons && feature.icon) {
                <div class="ui-lp-feature-grid__icon">
                  @if (feature.iconType === 'fa') {
                    <fa-icon [icon]="getIconDefinition(feature.icon)"></fa-icon>
                  } @else {
                    <i [class]="feature.icon" aria-hidden="true"></i>
                  }
                </div>
              }
              
              @if (feature.image) {
                <div class="ui-lp-feature-grid__image">
                  <img 
                    [src]="feature.image" 
                    [alt]="feature.title"
                    loading="lazy">
                </div>
              }
              
              <div class="ui-lp-feature-grid__content">
                <h3 class="ui-lp-feature-grid__item-title">{{ feature.title }}</h3>
                <p class="ui-lp-feature-grid__description">{{ feature.description }}</p>
                
                @if (feature.link) {
                  <a 
                    class="ui-lp-feature-grid__link"
                    [href]="feature.link.url"
                    [target]="feature.link.target || '_self'"
                    (click)="handleLinkClick($event, feature.link)">
                    {{ feature.link.text }}
                    <fa-icon [icon]="faArrowRight" class="ui-lp-feature-grid__link-icon"></fa-icon>
                  </a>
                }
              </div>
            </div>
          }
        </div>
      </ui-container>
    </section>
  `,
  styleUrl: './feature-grid.component.scss'
})
export class FeatureGridComponent {
  config = signal<FeatureGridConfig>({
    features: [],
    layout: 'grid',
    columns: 'auto',
    variant: 'card',
    showIcons: true,
    animationType: 'fade',
    spacing: 'normal'
  });
  
  faArrowRight = faArrowRight;
  
  @Input() set configuration(value: FeatureGridConfig) {
    this.config.set(value);
  }
  
  @Output() featureClicked = new EventEmitter<FeatureItem>();
  @Output() linkClicked = new EventEmitter<{ feature: FeatureItem; link: FeatureLink }>();
  
  getComponentClasses(): string {
    const classes = ['ui-lp-feature-grid'];
    
    if (this.config().variant) {
      classes.push(`ui-lp-feature-grid--${this.config().variant}`);
    }
    if (this.config().layout) {
      classes.push(`ui-lp-feature-grid--${this.config().layout}`);
    }
    if (this.config().spacing) {
      classes.push(`ui-lp-feature-grid--${this.config().spacing}`);
    }
    
    return classes.join(' ');
  }
  
  handleFeatureClick(feature: FeatureItem): void {
    this.featureClicked.emit(feature);
  }
  
  handleLinkClick(event: Event, link: FeatureLink): void {
    event.stopPropagation();
    this.linkClicked.emit({ 
      feature: this.config().features.find(f => f.link === link)!,
      link 
    });
  }
  
  getIconDefinition(iconName: string): IconDefinition {
    // This would need to be expanded with a proper icon mapping service
    // For now, return a default icon
    return faArrowRight;
  }
}Ĺx) export * from './feature-grid.component';-x6import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonComponent } from 'ui-essentials';
import { ContainerComponent } from 'ui-essentials';
import { HeroConfig } from '../../interfaces/hero.interfaces';
import { CTAButton } from '../../interfaces/shared.interfaces';

@Component({
  selector: 'ui-lp-hero',
  standalone: true,
  imports: [CommonModule, ButtonComponent, ContainerComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      class="ui-lp-hero"
      [class]="heroClasses()"
      [attr.aria-label]="'Hero section'">
      
      <ui-container [size]="'xl'" [padding]="'lg'">
        <div class="ui-lp-hero__content">
          <h1 class="ui-lp-hero__title">{{ config().title }}</h1>
          
          @if (config().subtitle) {
            <p class="ui-lp-hero__subtitle">{{ config().subtitle }}</p>
          }
          
          @if (config().ctaPrimary || config().ctaSecondary) {
            <div class="ui-lp-hero__actions">
              @if (config().ctaPrimary) {
                <ui-button
                  [variant]="config().ctaPrimary!.variant"
                  [size]="config().ctaPrimary!.size || 'large'"
                  (clicked)="handleCTAClick(config().ctaPrimary!)">
                  {{ config().ctaPrimary!.text }}
                </ui-button>
              }
              
              @if (config().ctaSecondary) {
                <ui-button
                  [variant]="config().ctaSecondary!.variant"
                  [size]="config().ctaSecondary!.size || 'large'"
                  (clicked)="handleCTAClick(config().ctaSecondary!)">
                  {{ config().ctaSecondary!.text }}
                </ui-button>
              }
            </div>
          }
        </div>
      </ui-container>
      
      @if (config().backgroundType === 'animated') {
        <div class="ui-lp-hero__animated-bg" aria-hidden="true"></div>
      }
    </section>
  `,
  styleUrl: './hero-section.component.scss'
})
export class HeroSectionComponent {
  config = signal<HeroConfig>({
    title: '',
    alignment: 'center',
    backgroundType: 'solid',
    minHeight: 'large'
  });
  
  @Input() set configuration(value: HeroConfig) {
    this.config.set(value);
  }
  
  @Output() ctaClicked = new EventEmitter<CTAButton>();
  
  /**
   * Computed classes for the hero element based on configuration
   */
  heroClasses(): string {
    const config = this.config();
    const classes = ['ui-lp-hero'];
    
    if (config.backgroundType) {
      classes.push(`ui-lp-hero--${config.backgroundType}`);
    }
    
    if (config.alignment) {
      classes.push(`ui-lp-hero--${config.alignment}`);
    }
    
    if (config.minHeight) {
      classes.push(`ui-lp-hero--${config.minHeight}`);
    }
    
    return classes.join(' ');
  }
  
  /**
   * Handle CTA button clicks
   */
  handleCTAClick(cta: CTAButton): void {
    cta.action();
    this.ctaClicked.emit(cta);
  }
}Rx:import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonComponent } from 'ui-essentials';
import { ContainerComponent } from 'ui-essentials';
import { HeroSplitConfig } from '../../interfaces/hero.interfaces';
import { CTAButton } from '../../interfaces/shared.interfaces';

@Component({
  selector: 'ui-lp-hero-split',
  standalone: true,
  imports: [CommonModule, ButtonComponent, ContainerComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      class="ui-lp-hero-split"
      [class]="heroClasses()"
      [attr.aria-label]="'Split screen hero section'">
      
      <div class="ui-lp-hero-split__wrapper">
        <!-- Left Content -->
        <div class="ui-lp-hero-split__left">
          @if (config().leftContent) {
            @switch (config().leftContent!.type) {
              @case ('text') {
                <div class="ui-lp-hero-split__text-content" [innerHTML]="config().leftContent!.content"></div>
              }
              @case ('image') {
                <div class="ui-lp-hero-split__image-content">
                  <img [src]="config().leftContent!.content" [alt]="'Left content image'" class="ui-lp-hero-split__img" />
                </div>
              }
              @case ('video') {
                <div class="ui-lp-hero-split__video-content">
                  <video [src]="config().leftContent!.content" class="ui-lp-hero-split__video" controls></video>
                </div>
              }
            }
          } @else {
            <!-- Default text content -->
            <div class="ui-lp-hero-split__default-content">
              <h1 class="ui-lp-hero-split__title">{{ config().title }}</h1>
              
              @if (config().subtitle) {
                <p class="ui-lp-hero-split__subtitle">{{ config().subtitle }}</p>
              }
              
              @if (config().ctaPrimary || config().ctaSecondary) {
                <div class="ui-lp-hero-split__actions">
                  @if (config().ctaPrimary) {
                    <ui-button
                      [variant]="config().ctaPrimary!.variant"
                      [size]="config().ctaPrimary!.size || 'large'"
                      (clicked)="handleCTAClick(config().ctaPrimary!)">
                      {{ config().ctaPrimary!.text }}
                    </ui-button>
                  }
                  
                  @if (config().ctaSecondary) {
                    <ui-button
                      [variant]="config().ctaSecondary!.variant"
                      [size]="config().ctaSecondary!.size || 'large'"
                      (clicked)="handleCTAClick(config().ctaSecondary!)">
                      {{ config().ctaSecondary!.text }}
                    </ui-button>
                  }
                </div>
              }
            </div>
          }
        </div>
        
        <!-- Right Content -->
        <div class="ui-lp-hero-split__right">
          @if (config().rightContent) {
            @switch (config().rightContent!.type) {
              @case ('text') {
                <div class="ui-lp-hero-split__text-content" [innerHTML]="config().rightContent!.content"></div>
              }
              @case ('image') {
                <div class="ui-lp-hero-split__image-content">
                  <img [src]="config().rightContent!.content" [alt]="'Right content image'" class="ui-lp-hero-split__img" />
                </div>
              }
              @case ('video') {
                <div class="ui-lp-hero-split__video-content">
                  <video [src]="config().rightContent!.content" class="ui-lp-hero-split__video" controls></video>
                </div>
              }
            }
          } @else {
            <!-- Placeholder for right content -->
            <div class="ui-lp-hero-split__placeholder">
              <div class="ui-lp-hero-split__placeholder-icon">🖼️</div>
              <p class="ui-lp-hero-split__placeholder-text">Right content area</p>
            </div>
          }
        </div>
      </div>
    </section>
  `,
  styleUrl: './hero-split-screen.component.scss'
})
export class HeroSplitScreenComponent {
  config = signal<HeroSplitConfig>({
    title: '',
    alignment: 'left',
    backgroundType: 'solid',
    minHeight: 'large',
    splitRatio: '50-50'
  });
  
  @Input() set configuration(value: HeroSplitConfig) {
    this.config.set(value);
  }
  
  @Output() ctaClicked = new EventEmitter<CTAButton>();
  
  /**
   * Computed classes for the hero element based on configuration
   */
  heroClasses(): string {
    const config = this.config();
    const classes = ['ui-lp-hero-split'];
    
    if (config.backgroundType) {
      classes.push(`ui-lp-hero-split--${config.backgroundType}`);
    }
    
    if (config.alignment) {
      classes.push(`ui-lp-hero-split--${config.alignment}`);
    }
    
    if (config.minHeight) {
      classes.push(`ui-lp-hero-split--${config.minHeight}`);
    }
    
    if (config.splitRatio) {
      classes.push(`ui-lp-hero-split--${config.splitRatio}`);
    }
    
    return classes.join(' ');
  }
  
  /**
   * Handle CTA button clicks
   */
  handleCTAClick(cta: CTAButton): void {
    cta.action();
    this.ctaClicked.emit(cta);
  }
}Y&Eximport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonComponent } from 'ui-essentials';
import { ContainerComponent } from 'ui-essentials';
import { HeroImageConfig } from '../../interfaces/hero.interfaces';
import { CTAButton } from '../../interfaces/shared.interfaces';

@Component({
  selector: 'ui-lp-hero-image',
  standalone: true,
  imports: [CommonModule, ButtonComponent, ContainerComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      class="ui-lp-hero-image"
      [class]="heroClasses()"
      [attr.aria-label]="'Hero section with image'">
      
      <ui-container [size]="'xl'" [padding]="'lg'">
        <div class="ui-lp-hero-image__wrapper">
          <div class="ui-lp-hero-image__content">
            <h1 class="ui-lp-hero-image__title">{{ config().title }}</h1>
            
            @if (config().subtitle) {
              <p class="ui-lp-hero-image__subtitle">{{ config().subtitle }}</p>
            }
            
            @if (config().ctaPrimary || config().ctaSecondary) {
              <div class="ui-lp-hero-image__actions">
                @if (config().ctaPrimary) {
                  <ui-button
                    [variant]="config().ctaPrimary!.variant"
                    [size]="config().ctaPrimary!.size || 'large'"
                    (clicked)="handleCTAClick(config().ctaPrimary!)">
                    {{ config().ctaPrimary!.text }}
                  </ui-button>
                }
                
                @if (config().ctaSecondary) {
                  <ui-button
                    [variant]="config().ctaSecondary!.variant"
                    [size]="config().ctaSecondary!.size || 'large'"
                    (clicked)="handleCTAClick(config().ctaSecondary!)">
                    {{ config().ctaSecondary!.text }}
                  </ui-button>
                }
              </div>
            }
          </div>
          
          @if (config().imageUrl) {
            <div class="ui-lp-hero-image__media">
              <img 
                [src]="config().imageUrl"
                [alt]="config().imageAlt || 'Hero image'"
                class="ui-lp-hero-image__img"
                loading="eager"
                decoding="async" />
            </div>
          }
        </div>
      </ui-container>
    </section>
  `,
  styleUrl: './hero-with-image.component.scss'
})
export class HeroWithImageComponent {
  config = signal<HeroImageConfig>({
    title: '',
    alignment: 'left',
    backgroundType: 'solid',
    minHeight: 'large',
    imagePosition: 'right',
    imageMobile: 'below'
  });
  
  @Input() set configuration(value: HeroImageConfig) {
    this.config.set(value);
  }
  
  @Output() ctaClicked = new EventEmitter<CTAButton>();
  
  /**
   * Computed classes for the hero element based on configuration
   */
  heroClasses(): string {
    const config = this.config();
    const classes = ['ui-lp-hero-image'];
    
    if (config.backgroundType) {
      classes.push(`ui-lp-hero-image--${config.backgroundType}`);
    }
    
    if (config.alignment) {
      classes.push(`ui-lp-hero-image--${config.alignment}`);
    }
    
    if (config.minHeight) {
      classes.push(`ui-lp-hero-image--${config.minHeight}`);
    }
    
    if (config.imagePosition) {
      classes.push(`ui-lp-hero-image--image-${config.imagePosition}`);
    }
    
    if (config.imageMobile) {
      classes.push(`ui-lp-hero-image--mobile-${config.imageMobile}`);
    }
    
    return classes.join(' ');
  }
  
  /**
   * Handle CTA button clicks
   */
  handleCTAClick(cta: CTAButton): void {
    cta.action();
    this.ctaClicked.emit(cta);
  }
}/n[x zexport * from './hero-section.component';
export * from './hero-with-image.component';
export * from './hero-split-screen.component';$.xr// Hero Components
export * from './heroes';

// Feature Components
export * from './features';

// Social Proof Components
export * from './social-proof';

// Conversion Components
export * from './conversion';

// Navigation Components
export * from './navigation';

// Content Components
export * from './content';

// Template Components
export * from './templates';"{x$+import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { ReactiveFormsModule, FormControl, Validators } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { ButtonComponent } from 'ui-essentials';
import { ContainerComponent } from 'ui-essentials';
import { FlexComponent } from 'ui-essentials';
import { GridContainerComponent } from 'ui-essentials';
import { DividerComponent } from 'ui-essentials';
import { FooterConfig, FooterLink } from '../../interfaces/navigation.interfaces';

@Component({
  selector: 'ui-lp-footer',
  standalone: true,
  imports: [
    CommonModule,
    RouterModule,
    ReactiveFormsModule,
    FontAwesomeModule,
    ButtonComponent,
    ContainerComponent,
    FlexComponent,
    GridContainerComponent,
    DividerComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <footer 
      class="ui-lp-footer"
      [class.ui-lp-footer--theme-dark]="config().theme === 'dark'"
      [attr.aria-label]="'Site footer'">
      
      <!-- Main Footer Content -->
      <div class="ui-lp-footer__main">
        <ui-container [size]="'xl'" [padding]="'md'">
          <ui-grid-container 
            [style.grid-template-columns]="getGridColumns()"
            [gap]="'lg'"
            class="ui-lp-footer__grid">
            
            <!-- Company/Brand Section -->
            @if (config().logo || config().newsletter) {
              <div class="ui-lp-footer__brand-section">
                @if (config().logo) {
                  <div class="ui-lp-footer__logo">
                    @if (config().logo!.imageUrl) {
                      <a 
                        [routerLink]="config().logo?.url || '/'"
                        class="ui-lp-footer__logo-link">
                        <img 
                          [src]="config().logo?.imageUrl"
                          [alt]="config().logo?.text || 'Logo'"
                          [width]="config().logo?.width || 120"
                          [height]="config().logo?.height || 40"
                          class="ui-lp-footer__logo-image">
                      </a>
                    } @else if (config().logo!.text) {
                      <a 
                        [routerLink]="config().logo?.url || '/'"
                        class="ui-lp-footer__logo-text">
                        {{ config().logo?.text }}
                      </a>
                    }
                  </div>
                }
                
                @if (config().newsletter) {
                  <div class="ui-lp-footer__newsletter">
                    <h3 class="ui-lp-footer__newsletter-title">
                      {{ config().newsletter!.title }}
                    </h3>
                    
                    @if (config().newsletter!.description) {
                      <p class="ui-lp-footer__newsletter-description">
                        {{ config().newsletter!.description }}
                      </p>
                    }
                    
                    <form class="ui-lp-footer__newsletter-form" (ngSubmit)="handleNewsletterSubmit()">
                      <div class="ui-lp-footer__newsletter-input-group">
                        <input
                          type="email"
                          [formControl]="emailControl"
                          [placeholder]="config().newsletter!.placeholder"
                          class="ui-lp-footer__newsletter-input"
                          [attr.aria-label]="'Email address'">
                        <ui-button
                          type="submit"
                          [variant]="'filled'"
                          [size]="'medium'"
                          [disabled]="emailControl.invalid"
                          class="ui-lp-footer__newsletter-button">
                          {{ config().newsletter!.buttonText }}
                        </ui-button>
                      </div>
                      
                      @if (newsletterStatus()) {
                        <div 
                          class="ui-lp-footer__newsletter-status"
                          [class.ui-lp-footer__newsletter-status--success]="newsletterStatus() === 'success'"
                          [class.ui-lp-footer__newsletter-status--error]="newsletterStatus() === 'error'">
                          @switch (newsletterStatus()) {
                            @case ('success') {
                              Thank you for subscribing!
                            }
                            @case ('error') {
                              There was an error. Please try again.
                            }
                          }
                        </div>
                      }
                    </form>
                  </div>
                }
                
                @if (config().socialLinks && config().socialLinks!.length > 0) {
                  <div class="ui-lp-footer__social">
                    <h4 class="ui-lp-footer__social-title">Follow Us</h4>
                    <div class="ui-lp-footer__social-links">
                      @for (social of config().socialLinks || []; track social.id) {
                        <a
                          [href]="social.url"
                          target="_blank"
                          rel="noopener noreferrer"
                          class="ui-lp-footer__social-link"
                          [attr.aria-label]="social.label || social.platform">
                          @if (social.icon) {
                            <i [class]="social.icon" class="ui-lp-footer__social-icon" aria-hidden="true"></i>
                          } @else {
                            <i [class]="getSocialIcon(social.platform)" class="ui-lp-footer__social-icon" aria-hidden="true"></i>
                          }
                        </a>
                      }
                    </div>
                  </div>
                }
              </div>
            }
            
            <!-- Footer Columns -->
            @for (column of config().columns; track column.id) {
              <div class="ui-lp-footer__column">
                <h4 class="ui-lp-footer__column-title">{{ column.title }}</h4>
                <ul class="ui-lp-footer__column-list">
                  @for (item of column.items; track item.id) {
                    <li class="ui-lp-footer__column-item">
                      <a
                        [href]="item.url"
                        [routerLink]="item.route"
                        [target]="item.target || '_self'"
                        class="ui-lp-footer__column-link"
                        (click)="handleLinkClick(item)">
                        @if (item.icon) {
                          <span class="ui-lp-footer__link-icon">{{ item.icon }}</span>
                        }
                        {{ item.label }}
                      </a>
                    </li>
                  }
                </ul>
              </div>
            }
          </ui-grid-container>
        </ui-container>
      </div>
      
      <!-- Footer Bottom -->
      @if (config().showDivider !== false) {
        <ui-divider></ui-divider>
      }
      
      <div class="ui-lp-footer__bottom">
        <ui-container [size]="'xl'" [padding]="'md'">
          <ui-flex 
            [justify]="'between'" 
            [align]="'center'"
            [wrap]="'wrap'"
            [gap]="'md'"
            class="ui-lp-footer__bottom-content">
            
            <!-- Copyright -->
            @if (config().copyright) {
              <div class="ui-lp-footer__copyright">
                {{ config().copyright }}
              </div>
            }
            
            <!-- Legal Links -->
            @if (config().legalLinks && config().legalLinks!.length > 0) {
              <ul class="ui-lp-footer__legal-links">
                @for (link of config().legalLinks || []; track link.id; let last = $last) {
                  <li class="ui-lp-footer__legal-item">
                    <a
                      [href]="link.url"
                      [routerLink]="link.route"
                      [target]="link.target || '_self'"
                      class="ui-lp-footer__legal-link"
                      (click)="handleLinkClick(link)">
                      {{ link.label }}
                    </a>
                    @if (!last) {
                      <span class="ui-lp-footer__legal-separator" aria-hidden="true">•</span>
                    }
                  </li>
                }
              </ul>
            }
          </ui-flex>
        </ui-container>
      </div>
    </footer>
  `,
  styleUrl: './footer-section.component.scss'
})
export class FooterSectionComponent {
  config = signal<FooterConfig>({
    columns: [],
    theme: 'light',
    showDivider: true
  });
  
  emailControl = new FormControl('', [Validators.required, Validators.email]);
  newsletterStatus = signal<'success' | 'error' | null>(null);
  
  @Input() set configuration(value: FooterConfig) {
    this.config.set(value);
  }
  
  @Output() linkClicked = new EventEmitter<FooterLink>();
  @Output() newsletterSubmitted = new EventEmitter<string>();
  
  getGridColumns(): string {
    let columns = this.config().columns.length;
    
    // Add brand section if logo or newsletter exists
    if (this.config().logo || this.config().newsletter) {
      columns += 1;
    }
    
    const gridColumns = Math.min(columns, 5);
    return `repeat(${gridColumns}, 1fr)`;
  }
  
  handleLinkClick(link: FooterLink): void {
    if (link.action) {
      link.action();
    }
    this.linkClicked.emit(link);
  }
  
  handleNewsletterSubmit(): void {
    if (this.emailControl.valid && this.emailControl.value) {
      const email = this.emailControl.value;
      
      const newsletter = this.config().newsletter;
      if (newsletter && newsletter.onSubmit) {
        try {
          newsletter.onSubmit(email);
          this.newsletterStatus.set('success');
          this.emailControl.reset();
          this.newsletterSubmitted.emit(email);
        } catch (error) {
          console.error('Newsletter submission error:', error);
          this.newsletterStatus.set('error');
        }
      }
      
      // Reset status after 5 seconds
      setTimeout(() => {
        this.newsletterStatus.set(null);
      }, 5000);
    }
  }
  
  getSocialIcon(platform: string): string {
    const icons: Record<string, string> = {
      facebook: 'fab fa-facebook',
      twitter: 'fab fa-twitter',
      instagram: 'fab fa-instagram',
      linkedin: 'fab fa-linkedin',
      youtube: 'fab fa-youtube',
      github: 'fab fa-github',
      dribbble: 'fab fa-dribbble'
    };
    
    return icons[platform] || 'fas fa-link';
  }
}#xW export * from './landing-header.component';
export * from './footer-section.component';9x0qimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, inject, OnInit, OnDestroy, HostListener } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { Subject, takeUntil } from 'rxjs';
import { faBars, faXmark } from '@fortawesome/free-solid-svg-icons';
import { LandingHeaderConfig, NavigationItem, LogoConfig } from '../../interfaces/navigation.interfaces';
import { CTAButton } from '../../interfaces/shared.interfaces';
import { ButtonComponent, ContainerComponent, FlexComponent, IconButtonComponent } from 'ui-essentials';

@Component({
  selector: 'ui-lp-header',
  standalone: true,
  imports: [
    CommonModule, 
    RouterModule, 
    ButtonComponent, 
    ContainerComponent, 
    FlexComponent,
    IconButtonComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <header 
      class="ui-lp-header"
      [class.ui-lp-header--transparent]="config().transparent"
      [class.ui-lp-header--sticky]="config().sticky"
      [class.ui-lp-header--scrolled]="isScrolled()"
      [class.ui-lp-header--mobile-menu-open]="mobileMenuOpen()"
      [class.ui-lp-header--theme-dark]="config().theme === 'dark'"
      [attr.aria-label]="'Main navigation'">
      
      <ui-container [size]="config().size || 'xl'" [padding]="'md'">
        <ui-flex [justify]="'between'" [align]="'center'" class="ui-lp-header__content">
          
          <!-- Logo Section -->
          <div class="ui-lp-header__logo-section">
            @if (config().logo.imageUrl) {
              <a 
                [href]="config().logo.url || '/'"
                [routerLink]="config().logo.url || '/'"
                class="ui-lp-header__logo-link">
                <img 
                  [src]="config().logo.imageUrl"
                  [alt]="config().logo.text || 'Logo'"
                  [width]="config().logo.width || 120"
                  [height]="config().logo.height || 40"
                  class="ui-lp-header__logo-image">
              </a>
            } @else if (config().logo.text) {
              <a 
                [href]="config().logo.url || '/'"
                [routerLink]="config().logo.url || '/'"
                class="ui-lp-header__logo-text">
                {{ config().logo.text }}
              </a>
            }
          </div>
          
          <!-- Desktop Navigation -->
          <nav class="ui-lp-header__nav ui-lp-header__nav--desktop" [attr.aria-label]="'Primary navigation'">
            <ul class="ui-lp-header__nav-list">
              @for (item of config().navigation; track item.id) {
                <li class="ui-lp-header__nav-item">
                  @if (item.children && item.children.length > 0) {
                    <!-- Dropdown Menu Item -->
                    <button 
                      class="ui-lp-header__nav-link ui-lp-header__nav-link--dropdown"
                      [attr.aria-expanded]="false"
                      [attr.aria-haspopup]="'true'"
                      (click)="toggleDropdown(item.id)"
                      type="button">
                      {{ item.label }}
                      <span class="ui-lp-header__nav-arrow" aria-hidden="true">
                        <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
                          <path d="M4.427 7.427l3.396 3.396a.25.25 0 00.354 0l3.396-3.396A.25.25 0 0011.396 7H4.604a.25.25 0 00-.177.427z"/>
                        </svg>
                      </span>
                    </button>
                    
                    @if (openDropdown() === item.id) {
                      <div class="ui-lp-header__dropdown" role="menu">
                        @for (child of item.children; track child.id) {
                          <a 
                            [href]="child.url"
                            [routerLink]="child.route"
                            [target]="child.target || '_self'"
                            class="ui-lp-header__dropdown-item"
                            role="menuitem"
                            (click)="handleNavClick(child)">
                            @if (child.icon) {
                              <span class="ui-lp-header__nav-icon">{{ child.icon }}</span>
                            }
                            {{ child.label }}
                            @if (child.badge) {
                              <span class="ui-lp-header__nav-badge">{{ child.badge }}</span>
                            }
                          </a>
                        }
                      </div>
                    }
                  } @else {
                    <!-- Regular Menu Item -->
                    <a 
                      [href]="item.url"
                      [routerLink]="item.route"
                      [target]="item.target || '_self'"
                      class="ui-lp-header__nav-link"
                      (click)="handleNavClick(item)">
                      @if (item.icon) {
                        <span class="ui-lp-header__nav-icon">{{ item.icon }}</span>
                      }
                      {{ item.label }}
                      @if (item.badge) {
                        <span class="ui-lp-header__nav-badge">{{ item.badge }}</span>
                      }
                    </a>
                  }
                </li>
              }
            </ul>
          </nav>
          
          <!-- Actions Section -->
          <div class="ui-lp-header__actions">
            @if (config().ctaButton) {
              <ui-button
                [variant]="config().ctaButton!.variant"
                [size]="config().ctaButton!.size || 'medium'"
                class="ui-lp-header__cta-button"
                (clicked)="handleCTAClick()">
                @if (config().ctaButton!.icon) {
                  <span class="ui-lp-header__cta-icon">{{ config().ctaButton!.icon }}</span>
                }
                {{ config().ctaButton!.text }}
              </ui-button>
            }
            
            <!-- Mobile Menu Toggle -->
            @if (config().showMobileMenu !== false) {
              <ui-icon-button
                [icon]="mobileMenuOpen() ? faXmark : faBars"
                [size]="'medium'"
                class="ui-lp-header__mobile-toggle"
                [attr.aria-expanded]="mobileMenuOpen()"
                [attr.aria-label]="mobileMenuOpen() ? 'Close menu' : 'Open menu'"
                (clicked)="toggleMobileMenu()">
              </ui-icon-button>
            }
          </div>
        </ui-flex>
      </ui-container>
      
      <!-- Mobile Navigation -->
      @if (mobileMenuOpen() && config().showMobileMenu !== false) {
        <nav class="ui-lp-header__nav ui-lp-header__nav--mobile" [attr.aria-label]="'Mobile navigation'">
          <ui-container [size]="config().size || 'xl'" [padding]="'md'">
            <ul class="ui-lp-header__mobile-list">
              @for (item of config().navigation; track item.id) {
                <li class="ui-lp-header__mobile-item">
                  @if (item.children && item.children.length > 0) {
                    <!-- Mobile Dropdown -->
                    <button 
                      class="ui-lp-header__mobile-link ui-lp-header__mobile-link--dropdown"
                      [attr.aria-expanded]="openMobileDropdown() === item.id"
                      (click)="toggleMobileDropdown(item.id)"
                      type="button">
                      {{ item.label }}
                    </button>
                    
                    @if (openMobileDropdown() === item.id) {
                      <ul class="ui-lp-header__mobile-submenu">
                        @for (child of item.children; track child.id) {
                          <li>
                            <a 
                              [href]="child.url"
                              [routerLink]="child.route"
                              [target]="child.target || '_self'"
                              class="ui-lp-header__mobile-sublink"
                              (click)="handleNavClick(child)">
                              {{ child.label }}
                            </a>
                          </li>
                        }
                      </ul>
                    }
                  } @else {
                    <!-- Regular Mobile Item -->
                    <a 
                      [href]="item.url"
                      [routerLink]="item.route"
                      [target]="item.target || '_self'"
                      class="ui-lp-header__mobile-link"
                      (click)="handleNavClick(item)">
                      {{ item.label }}
                    </a>
                  }
                </li>
              }
              
              @if (config().ctaButton) {
                <li class="ui-lp-header__mobile-cta">
                  <ui-button
                    [variant]="config().ctaButton!.variant"
                    [size]="'large'"
                    [fullWidth]="true"
                    (clicked)="handleCTAClick()">
                    {{ config().ctaButton!.text }}
                  </ui-button>
                </li>
              }
            </ul>
          </ui-container>
        </nav>
      }
      
      <!-- Mobile Menu Backdrop -->
      @if (mobileMenuOpen()) {
        <div 
          class="ui-lp-header__backdrop"
          (click)="closeMobileMenu()"
          aria-hidden="true">
        </div>
      }
    </header>
  `,
  styleUrl: './landing-header.component.scss'
})
export class LandingHeaderComponent implements OnInit, OnDestroy {
  private destroy$ = new Subject<void>();
  
  // FontAwesome icons
  faXmark = faXmark;
  faBars = faBars;
  
  config = signal<LandingHeaderConfig>({
    logo: { text: 'Logo' },
    navigation: [],
    transparent: false,
    sticky: true,
    showMobileMenu: true,
    size: 'xl',
    theme: 'light'
  });
  
  isScrolled = signal<boolean>(false);
  mobileMenuOpen = signal<boolean>(false);
  openDropdown = signal<string | null>(null);
  openMobileDropdown = signal<string | null>(null);
  
  @Input() set configuration(value: LandingHeaderConfig) {
    this.config.set(value);
  }
  
  @Output() navigationClicked = new EventEmitter<NavigationItem>();
  @Output() ctaClicked = new EventEmitter<CTAButton>();
  
  ngOnInit(): void {
    if (this.config().sticky) {
      this.setupScrollListener();
    }
  }
  
  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }
  
  @HostListener('window:scroll', [])
  onWindowScroll(): void {
    if (this.config().sticky) {
      const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
      this.isScrolled.set(scrollTop > 10);
    }
  }
  
  @HostListener('document:click', ['$event'])
  onDocumentClick(event: Event): void {
    const target = event.target as HTMLElement;
    if (!target.closest('.ui-lp-header__nav-link--dropdown')) {
      this.openDropdown.set(null);
    }
  }
  
  @HostListener('window:resize', [])
  onWindowResize(): void {
    if (window.innerWidth > 768) {
      this.mobileMenuOpen.set(false);
    }
  }
  
  private setupScrollListener(): void {
    // Initial scroll check
    this.onWindowScroll();
  }
  
  toggleMobileMenu(): void {
    this.mobileMenuOpen.set(!this.mobileMenuOpen());
    this.openMobileDropdown.set(null);
    
    // Prevent body scroll when mobile menu is open
    document.body.style.overflow = this.mobileMenuOpen() ? 'hidden' : '';
  }
  
  closeMobileMenu(): void {
    this.mobileMenuOpen.set(false);
    this.openMobileDropdown.set(null);
    document.body.style.overflow = '';
  }
  
  toggleDropdown(itemId: string): void {
    this.openDropdown.set(this.openDropdown() === itemId ? null : itemId);
  }
  
  toggleMobileDropdown(itemId: string): void {
    this.openMobileDropdown.set(this.openMobileDropdown() === itemId ? null : itemId);
  }
  
  handleNavClick(item: NavigationItem): void {
    if (item.action) {
      item.action();
    }
    this.navigationClicked.emit(item);
    this.closeMobileMenu();
    this.openDropdown.set(null);
  }
  
  handleCTAClick(): void {
    const cta = this.config().ctaButton;
    if (cta) {
      cta.action();
      this.ctaClicked.emit(cta);
    }
  }
}Gx vexport * from './testimonial-carousel.component';
export * from './logo-cloud.component';
export * from './statistics-display.component';'1x!limport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, OnInit, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ContainerComponent } from 'ui-essentials';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faQuoteLeft, faStar, faChevronLeft, faChevronRight, faCheck } from '@fortawesome/free-solid-svg-icons';
import { TestimonialCarouselConfig, TestimonialItem } from '../../interfaces/social-proof.interfaces';

@Component({
  selector: 'ui-lp-testimonial-carousel',
  standalone: true,
  imports: [CommonModule, ContainerComponent, FaIconComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      class="ui-lp-testimonial-carousel"
      [class]="getTestimonialCarouselClasses()"
      [attr.aria-label]="'Testimonials section'">
      
      <ui-container [size]="'xl'" [padding]="'lg'">
        @if (config().title || config().subtitle) {
          <div class="ui-lp-testimonial-carousel__header">
            @if (config().title) {
              <h2 class="ui-lp-testimonial-carousel__title">{{ config().title }}</h2>
            }
            @if (config().subtitle) {
              <p class="ui-lp-testimonial-carousel__subtitle">{{ config().subtitle }}</p>
            }
          </div>
        }
        
        <div class="ui-lp-testimonial-carousel__container">
          @if (config().showNavigation && config().testimonials.length > config().itemsPerView!) {
            <button 
              class="ui-lp-testimonial-carousel__nav ui-lp-testimonial-carousel__nav--prev"
              (click)="previousSlide()"
              [disabled]="currentSlide() === 0"
              [attr.aria-label]="'Previous testimonial'">
              <fa-icon [icon]="faChevronLeft"></fa-icon>
            </button>
          }
          
          <div class="ui-lp-testimonial-carousel__viewport">
            <div 
              class="ui-lp-testimonial-carousel__track"
              [style.transform]="'translateX(' + translateX() + '%)'">
              
              @for (testimonial of config().testimonials; track testimonial.id; let index = $index) {
                <div 
                  class="ui-lp-testimonial-carousel__slide"
                  [style.width]="slideWidth() + '%'">
                  
                  <div class="ui-lp-testimonial-carousel__item">
                    @if (config().variant === 'quote') {
                      <div class="ui-lp-testimonial-carousel__quote-icon">
                        <fa-icon [icon]="faQuoteLeft"></fa-icon>
                      </div>
                    }
                    
                    <div class="ui-lp-testimonial-carousel__content">
                      <p class="ui-lp-testimonial-carousel__text">{{ testimonial.content }}</p>
                      
                      @if (config().showRatings && testimonial.rating) {
                        <div class="ui-lp-testimonial-carousel__rating">
                          @for (star of getRatingArray(testimonial.rating); track $index) {
                            <fa-icon [icon]="faStar" class="ui-lp-testimonial-carousel__star"></fa-icon>
                          }
                        </div>
                      }
                    </div>
                    
                    <div class="ui-lp-testimonial-carousel__author">
                      @if (testimonial.avatar) {
                        <div class="ui-lp-testimonial-carousel__avatar">
                          <img 
                            [src]="testimonial.avatar" 
                            [alt]="testimonial.name"
                            loading="lazy">
                        </div>
                      }
                      
                      <div class="ui-lp-testimonial-carousel__author-info">
                        <div class="ui-lp-testimonial-carousel__author-name">
                          {{ testimonial.name }}
                          @if (testimonial.verified) {
                            <fa-icon [icon]="faCheck" class="ui-lp-testimonial-carousel__verified"></fa-icon>
                          }
                        </div>
                        @if (testimonial.title || testimonial.company) {
                          <div class="ui-lp-testimonial-carousel__author-title">
                            @if (testimonial.title) {
                              <span>{{ testimonial.title }}</span>
                            }
                            @if (testimonial.title && testimonial.company) {
                              <span> at </span>
                            }
                            @if (testimonial.company) {
                              <span>{{ testimonial.company }}</span>
                            }
                          </div>
                        }
                      </div>
                    </div>
                  </div>
                </div>
              }
            </div>
          </div>
          
          @if (config().showNavigation && config().testimonials.length > config().itemsPerView!) {
            <button 
              class="ui-lp-testimonial-carousel__nav ui-lp-testimonial-carousel__nav--next"
              (click)="nextSlide()"
              [disabled]="currentSlide() >= maxSlide()"
              [attr.aria-label]="'Next testimonial'">
              <fa-icon [icon]="faChevronRight"></fa-icon>
            </button>
          }
        </div>
        
        @if (config().showDots && config().testimonials.length > config().itemsPerView!) {
          <div class="ui-lp-testimonial-carousel__dots">
            @for (dot of dotsArray(); track $index; let index = $index) {
              <button 
                class="ui-lp-testimonial-carousel__dot"
                [class.ui-lp-testimonial-carousel__dot--active]="currentSlide() === index"
                (click)="goToSlide(index)"
                [attr.aria-label]="'Go to testimonial ' + (index + 1)">
              </button>
            }
          </div>
        }
      </ui-container>
    </section>
  `,
  styleUrl: './testimonial-carousel.component.scss'
})
export class TestimonialCarouselComponent implements OnInit, OnDestroy {
  config = signal<TestimonialCarouselConfig>({
    testimonials: [],
    autoPlay: false,
    autoPlayDelay: 5000,
    showDots: true,
    showNavigation: true,
    itemsPerView: 1,
    variant: 'card',
    showRatings: true
  });
  
  currentSlide = signal(0);
  private autoPlayInterval?: number;
  
  faQuoteLeft = faQuoteLeft;
  faStar = faStar;
  faChevronLeft = faChevronLeft;
  faChevronRight = faChevronRight;
  faCheck = faCheck;
  
  slideWidth = computed(() => 100 / this.config().itemsPerView!);
  translateX = computed(() => -this.currentSlide() * this.slideWidth());
  maxSlide = computed(() => Math.max(0, this.config().testimonials.length - this.config().itemsPerView!));
  dotsArray = computed(() => Array(this.maxSlide() + 1).fill(0));
  
  @Input() set configuration(value: TestimonialCarouselConfig) {
    this.config.set(value);
  }
  
  @Output() testimonialClicked = new EventEmitter<TestimonialItem>();
  
  getTestimonialCarouselClasses(): string {
    const classes = [
      'ui-lp-testimonial-carousel',
      `ui-lp-testimonial-carousel--${this.config().variant}`,
    ];
    
    return classes.join(' ');
  }
  
  ngOnInit(): void {
    if (this.config().autoPlay) {
      this.startAutoPlay();
    }
  }
  
  ngOnDestroy(): void {
    this.stopAutoPlay();
  }
  
  nextSlide(): void {
    const nextIndex = this.currentSlide() + 1;
    if (nextIndex <= this.maxSlide()) {
      this.currentSlide.set(nextIndex);
    } else if (this.config().autoPlay) {
      this.currentSlide.set(0);
    }
  }
  
  previousSlide(): void {
    const prevIndex = this.currentSlide() - 1;
    if (prevIndex >= 0) {
      this.currentSlide.set(prevIndex);
    }
  }
  
  goToSlide(index: number): void {
    this.currentSlide.set(index);
  }
  
  getRatingArray(rating: number): number[] {
    return Array(Math.floor(rating)).fill(0);
  }
  
  private startAutoPlay(): void {
    this.autoPlayInterval = window.setInterval(() => {
      this.nextSlide();
    }, this.config().autoPlayDelay);
  }
  
  private stopAutoPlay(): void {
    if (this.autoPlayInterval) {
      clearInterval(this.autoPlayInterval);
      this.autoPlayInterval = undefined;
    }
  }
}E̴&!xM	C&mLogoCloudConfig, Logo%Y
logo-cloudC'logo-cloud"
      [class]="getComponent%Partners and clients
logo-cloudM
logo-cloudu
logo-cloudug
logo-cloud__container"
a8logo-cloud__container--row]="config().layout === 'row'"
a:logo-cloud__container--grid]="config().layout === 'grid'"
alogo-cloud__container--marquee]="config().layout === 'marquee'"
          [style.--items-per-row]="config().itemsPerRow"
      R    [style.--max-height]="config().maxHeight ? config().maxHeight + 'px' : null">
^layout === 'marquee') {
logo-cloud__marquee">
 alogo-cloud__marquee-track">
                @for (logo of duplicatedLogos(); track logo.id + '-1'P
logo-cloud	"logo.urlP<a@
[href]="logo.url"QEVisit ' + logotarget="_blank"Qrel="noopener noreferrer"Q	handleLogoClick(logo)"s [src]="logo.logo"Qlogo!k-logo-cloud__logo--grayscale]="logo.grayscale"Q&</a} @elseQs[src]="logo.logo"Qlogok-logo-cloud__logo--grayscale]="logo.grayscale"Q$p~p~	} @else {"logo of config().logos; track logo)*	logo-cloud__item$data-animation-delay]="index * 50">
logo.urlP<a[href]="logo.url"QEVisit ' + logotarget="_blank"Qrel="noopener noreferrer"Q	handleLogoClick(logo)"s[src]="logo.logo"Qlogok-logo-cloud__logo--grayscale]="logo.grayscale"Q"</a>
                } @elseQs[src]="logo.logo"Qlogok-logo-cloud__logo--grayscale]="logo.grayscale"Q p~M
p3
logo-cloud!LogoCloudComponentLogoCloudConfig>({
    logos: [],
    layout: 'row',
    itemsPerRow: 5,
    grayscale: true,
    hoverEffect: true,
    maxHeight: 80
  });
  
  duplicatedLogos = computed(() => {
    const logos = this.config().logos;
    return [...logos, ...logos]; /$/ Duplicate for seamless marquee
  }*	LogoCloud@9=logoClicked = new EventEmitter<LogoItem>();
  
  getComponent)'ui-lp-logo-cloud'];
    Playout) {
      classes.push(`ui-lp-logo-cloud--${this.config().layout}`);
    }Egrayscale) {
      classes.push('ui-lp-logo-cloud--grayscale');
    }ChoverEffect) {
      classes.push('ui-lp-logo-cloud--hover');
    }`-NhandleLogoClick(logo: LogoItem): void {
    this.logoClicked.emit(logo);
  }
}6tx0import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, OnInit, OnDestroy, ElementRef, ViewChild, AfterViewInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ContainerComponent } from 'ui-essentials';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faArrowUp, faUsers, faDollarSign, faChartBar } from '@fortawesome/free-solid-svg-icons';
import { StatisticsConfig, StatisticItem } from '../../interfaces/social-proof.interfaces';

@Component({
  selector: 'ui-lp-statistics-display',
  standalone: true,
  imports: [CommonModule, ContainerComponent, FaIconComponent],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <section 
      class="ui-lp-statistics-display"
      [class]="getComponentClasses()"
      [attr.aria-label]="'Statistics section'"
      #sectionElement>
      
      <ui-container [size]="'xl'" [padding]="'lg'">
        @if (config().title || config().subtitle) {
          <div class="ui-lp-statistics-display__header">
            @if (config().title) {
              <h2 class="ui-lp-statistics-display__title">{{ config().title }}</h2>
            }
            @if (config().subtitle) {
              <p class="ui-lp-statistics-display__subtitle">{{ config().subtitle }}</p>
            }
          </div>
        }
        
        <div 
          class="ui-lp-statistics-display__items"
          [class.ui-lp-statistics-display__items--row]="config().layout === 'row'"
          [class.ui-lp-statistics-display__items--grid]="config().layout === 'grid'">
          
          @for (statistic of config().statistics; track statistic.id; let index = $index) {
            <div 
              class="ui-lp-statistics-display__item"
              [attr.data-animation-delay]="index * 100">
              
              @if (statistic.icon) {
                <div class="ui-lp-statistics-display__icon">
                  <fa-icon [icon]="getIconDefinition(statistic.icon)"></fa-icon>
                </div>
              }
              
              <div class="ui-lp-statistics-display__content">
                <div class="ui-lp-statistics-display__value">
                  @if (statistic.prefix) {
                    <span class="ui-lp-statistics-display__prefix">{{ statistic.prefix }}</span>
                  }
                  
                  <span 
                    class="ui-lp-statistics-display__number"
                    [attr.data-target]="statistic.animateValue ? getNumericValue(statistic.value) : null"
                    [attr.data-animate]="statistic.animateValue">
                    {{ displayValue(statistic) }}
                  </span>
                  
                  @if (statistic.suffix) {
                    <span class="ui-lp-statistics-display__suffix">{{ statistic.suffix }}</span>
                  }
                </div>
                
                <div class="ui-lp-statistics-display__label">{{ statistic.label }}</div>
                
                @if (statistic.description) {
                  <div class="ui-lp-statistics-display__description">{{ statistic.description }}</div>
                }
              </div>
            </div>
          }
        </div>
      </ui-container>
    </section>
  `,
  styleUrl: './statistics-display.component.scss'
})
export class StatisticsDisplayComponent implements OnInit, AfterViewInit, OnDestroy {
  @ViewChild('sectionElement') sectionElement!: ElementRef<HTMLElement>;
  
  config = signal<StatisticsConfig>({
    statistics: [],
    layout: 'row',
    variant: 'minimal',
    animateOnScroll: true,
    backgroundColor: 'transparent'
  });
  
  private intersectionObserver?: IntersectionObserver;
  private animatedItems = new Set<string>();
  
  @Input() set configuration(value: StatisticsConfig) {
    this.config.set(value);
  }
  
  @Output() statisticClicked = new EventEmitter<StatisticItem>();
  
  getComponentClasses(): string {
    const classes = ['ui-lp-statistics-display'];
    
    if (this.config().layout) {
      classes.push(`ui-lp-statistics-display--${this.config().layout}`);
    }
    if (this.config().variant) {
      classes.push(`ui-lp-statistics-display--${this.config().variant}`);
    }
    if (this.config().backgroundColor) {
      classes.push(`ui-lp-statistics-display--${this.config().backgroundColor}`);
    }
    
    return classes.join(' ');
  }
  
  ngOnInit(): void {
    if (this.config().animateOnScroll && 'IntersectionObserver' in window) {
      this.setupIntersectionObserver();
    }
  }
  
  ngAfterViewInit(): void {
    if (!this.config().animateOnScroll) {
      this.animateAllCounters();
    }
  }
  
  ngOnDestroy(): void {
    if (this.intersectionObserver) {
      this.intersectionObserver.disconnect();
    }
  }
  
  displayValue(statistic: StatisticItem): string {
    if (typeof statistic.value === 'number' && !statistic.animateValue) {
      return this.formatNumber(statistic.value);
    }
    return statistic.value.toString();
  }
  
  getNumericValue(value: number | string): number {
    return typeof value === 'number' ? value : parseInt(value.toString(), 10) || 0;
  }
  
  getIconDefinition(iconName: string): IconDefinition {
    const iconMap: { [key: string]: IconDefinition } = {
      'arrow-up': faArrowUp,
      'users': faUsers,
      'dollar-sign': faDollarSign,
      'chart-bar': faChartBar
    };
    return iconMap[iconName] || faChartBar;
  }
  
  private setupIntersectionObserver(): void {
    this.intersectionObserver = new IntersectionObserver(
      (entries) => {
        entries.forEach((entry) => {
          if (entry.isIntersecting) {
            this.animateCountersInView();
          }
        });
      },
      { threshold: 0.5 }
    );
  }
  
  private animateCountersInView(): void {
    if (!this.sectionElement) return;
    
    const numberElements = this.sectionElement.nativeElement.querySelectorAll(
      '[data-animate="true"]:not(.animated)'
    );
    
    numberElements.forEach((element) => {
      const target = parseInt(element.getAttribute('data-target') || '0', 10);
      const statId = element.closest('.ui-lp-statistics-display__item')?.getAttribute('data-id');
      
      if (statId && !this.animatedItems.has(statId)) {
        this.animatedItems.add(statId);
        element.classList.add('animated');
        this.animateCounter(element as HTMLElement, target);
      }
    });
  }
  
  private animateAllCounters(): void {
    if (!this.sectionElement) return;
    
    const numberElements = this.sectionElement.nativeElement.querySelectorAll('[data-animate="true"]');
    
    numberElements.forEach((element) => {
      const target = parseInt(element.getAttribute('data-target') || '0', 10);
      this.animateCounter(element as HTMLElement, target);
    });
  }
  
  private animateCounter(element: HTMLElement, target: number): void {
    const duration = 2000; // 2 seconds
    const steps = 60;
    const stepValue = target / steps;
    const stepDuration = duration / steps;
    
    let current = 0;
    let step = 0;
    
    const timer = setInterval(() => {
      current = Math.min(target, Math.floor(stepValue * step));
      element.textContent = this.formatNumber(current);
      
      step++;
      
      if (step > steps || current >= target) {
        clearInterval(timer);
        element.textContent = this.formatNumber(target);
      }
    }, stepDuration);
  }
  
  private formatNumber(num: number): string {
    if (num >= 1000000) {
      return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M';
    }
    if (num >= 1000) {
      return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K';
    }
    return num.toString();
  }
};x	X@use '../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-lp-agency-template {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  
  &__main {
    flex: 1;
    
    // Agency-focused styling with professional appearance
    > *:nth-child(odd) {
      background: $semantic-color-surface-primary;
    }
    
    > *:nth-child(even) {
      background: $semantic-color-surface-secondary;
    }
    
    // Special treatment for hero section
    > ui-lp-hero-split {
      background: unset;
    }
    
    // Team section gets special emphasis
    > ui-lp-team-grid {
      background: $semantic-color-surface-elevated;
      border: 1px solid $semantic-color-border-subtle;
    }
    
    // Timeline section styling
    > ui-lp-timeline {
      position: relative;
      
      &::before {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        height: 1px;
        background: linear-gradient(
          to right,
          transparent,
          $semantic-color-border-subtle,
          transparent
        );
      }
    }
  }
  
  // Enhanced section spacing for agency layout
  section {
    padding: $semantic-spacing-layout-section-xl 0;
  }
  
  // Professional section dividers
  section + section {
    border-top: 1px solid $semantic-color-border-subtle;
    position: relative;
    
    &::before {
      content: '';
      position: absolute;
      top: -1px;
      left: 50%;
      transform: translateX(-50%);
      width: 100px;
      height: 1px;
      background: $semantic-color-primary;
    }
  }
  
  // Responsive adjustments for agency layout
  @media (max-width: $semantic-breakpoint-lg - 1) {
    section {
      padding: $semantic-spacing-layout-section-lg 0;
    }
  }
  
  @media (max-width: $semantic-breakpoint-md - 1) {
    &__main {
      > ui-lp-team-grid {
        border: none;
      }
    }
    
    section {
      padding: $semantic-spacing-layout-section-md 0;
    }
    
    section + section::before {
      width: 50px;
    }
  }
  
  @media (max-width: $semantic-breakpoint-sm - 1) {
    &__main {
      > * {
        background: $semantic-color-surface-primary !important;
      }
    }
    
    section {
      padding: $semantic-spacing-layout-section-sm 0;
    }
    
    section + section {
      border-top: none;
      margin-top: $semantic-spacing-layout-section-sm;
      
      &::before {
        display: none;
      }
    }
  }
}ܰ5x	OproductUtProductcleaner backgroundselevatedMHero maintains its special background (image/gradient)
    > ui-lp-hero-image$Z
!Product template specific spacing;>lg 0;
  }
  
  // Enhanced visual separation between sections
7A +mdF}
}bdbx>OsaasUu)lternating background colors for sectionsJOverride for hero to maintain gradient/special background
    > ui-lp-hero$Z%sure proper spacing between sections
7A IB// Reduce alternating backgrounds on mobile for better readabilityNY  
    border-top: none;
  -	=}
    }
  }
}nx;import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HeroSectionComponent } from '../heroes/hero-section.component';
import { FeatureGridComponent } from '../features/feature-grid.component';
import { StatisticsDisplayComponent } from '../social-proof/statistics-display.component';
import { TestimonialCarouselComponent } from '../social-proof/testimonial-carousel.component';
import { PricingTableComponent } from '../conversion/pricing-table.component';
import { CTASectionComponent } from '../conversion/cta-section.component';
import { FAQSectionComponent } from '../content/faq-section.component';
import { LandingHeaderComponent } from '../navigation/landing-header.component';
import { FooterSectionComponent } from '../navigation/footer-section.component';
import { SaaSTemplateConfig } from '../../interfaces/templates.interfaces';

@Component({
  selector: 'ui-lp-saas-template',
  standalone: true,
  imports: [
    CommonModule,
    HeroSectionComponent,
    FeatureGridComponent,
    StatisticsDisplayComponent,
    TestimonialCarouselComponent,
    PricingTableComponent,
    CTASectionComponent,
    FAQSectionComponent,
    LandingHeaderComponent,
    FooterSectionComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  template: `
    <div class="ui-lp-saas-template">
      @if (config().header) {
        <ui-lp-header [configuration]="config().header!"></ui-lp-header>
      }
      
      <main class="ui-lp-saas-template__main">
        <!-- Hero Section -->
        <ui-lp-hero [configuration]="config().hero"></ui-lp-hero>
        
        <!-- Statistics Section -->
        <ui-lp-statistics-display [configuration]="config().socialProof"></ui-lp-statistics-display>
        
        <!-- Features Section -->
        <ui-lp-feature-grid [configuration]="config().features"></ui-lp-feature-grid>
        
        <!-- Testimonials Section -->
        <ui-lp-testimonial-carousel [configuration]="config().testimonials"></ui-lp-testimonial-carousel>
        
        <!-- Pricing Section -->
        <ui-pricing-table [config]="config().pricing"></ui-pricing-table>
        
        <!-- FAQ Section -->
        <ui-lp-faq [configuration]="config().faq"></ui-lp-faq>
        
        <!-- Final CTA Section -->
        <ui-cta-section [config]="config().cta"></ui-cta-section>
      </main>
      
      @if (config().footer) {
        <ui-lp-footer [configuration]="config().footer!"></ui-lp-footer>
      }
    </div>
  `,
  styleUrl: './saas-template.component.scss'
})
export class SaaSTemplateComponent {
  config = signal<SaaSTemplateConfig>({
    hero: {
      title: 'Build Amazing SaaS Applications',
      subtitle: 'The complete toolkit for modern software development',
      alignment: 'center',
      backgroundType: 'gradient',
      minHeight: 'full'
    },
    features: {
      title: 'Why Choose Our Platform',
      features: []
    },
    socialProof: {
      title: 'Trusted by Industry Leaders',
      statistics: []
    },
    testimonials: {
      title: 'What Our Customers Say',
      testimonials: []
    },
    pricing: {
      plans: [],
      billingToggle: { monthlyLabel: 'Monthly', yearlyLabel: 'Yearly' },
      featuresComparison: false
    },
    faq: {
      title: 'Frequently Asked Questions',
      items: []
    },
    cta: {
      title: 'Ready to Get Started?',
      description: 'Join thousands of developers building the future',
      ctaPrimary: { text: 'Get Started', variant: 'filled', action: () => {} },
      backgroundType: 'gradient'
    }
  });

  @Input() set configuration(value: SaaSTemplateConfig) {
    this.config.set(value);
  }
}پ{PRx
plitScreen
plit-screebTeamcontent/team-gridqTimeline?tent/timeline_<KAgencyu`agencyH	plitScree&*TeamGridComponent,
    Timeline p"agencyagency:C-split-split/	Servicex'servic0,Company Timeline -->
        <ui-lp-timelineimeline"></ui-lp-timeline/	Teamam team"></ui-lp-team-grid/	Client TestimonialsContact CTAi	agencyF
*Agencyt
&Agency
,jYour Vision, Our Expertise',
      subtitle: 'We create exceptional digital experiences that drive results1leftL7large'
    },
    services: {
      title: 'Our Services',
      subtitle: 'Comprehensive solutions for your digital needs',
  team: {
      title: 'Meet Our Team',
      subtitle: 'The talented individuals behind our success',
      members: [],
      columns: 3,
      showSocial: true,
      showBio: true
    },
    timeline: {
      title: 'Our Journey',
      subtitle: 'Milestones that define our growth',
      items: [],
      orientation: 'vertical',
      showDates: true
    },
    testimonials: OUClient Success Stories',
      subtitle: 'What our partners say about working with usu%wStart Your Project2Let\'s discuss how we can bring your vision to lifAgency3kn!nx	WithImage
with-imageqJProductu`productG	WithImage')pVproductproduct:,0with Product Image -->
        <ui-lp-hero-image-image/	UCustomer TestimonialsH	productF
*Productt
&Product
,UIntroducing Our Latest Product',
      subtitle: 'Experience the future of innovation1leftLimage',
      minHeight: 'large'Key Features!ACustomer ReviewsuwStart Your Journey(Order now and get free shipping worldwid	Order Now|Product37еx zexport * from './saas-template.component';
export * from './product-template.component';
export * from './agency-template.component';B=/%Gxrexport interface FAQItem {
  id: string;
  question: string;
  answer: string;
  isOpen?: boolean;
}

export interface FAQConfig {
  title?: string;
  subtitle?: string;
  items: FAQItem[];
  searchEnabled?: boolean;
  expandMultiple?: boolean;
  theme?: 'default' | 'bordered' | 'minimal';
}

export interface TeamMember {
  id: string;
  name: string;
  role: string;
  bio?: string;
  image?: string;
  social?: TeamSocialLinks;
}

export interface TeamSocialLinks {
  linkedin?: string;
  twitter?: string;
  github?: string;
  email?: string;
  website?: string;
}

export interface TeamConfig {
  title?: string;
  subtitle?: string;
  members: TeamMember[];
  columns?: 2 | 3 | 4;
  showSocial?: boolean;
  showBio?: boolean;
}

export interface TimelineItem {
  id: string;
  title: string;
  description: string;
  date?: string;
  status?: 'completed' | 'current' | 'upcoming';
  icon?: string;
  badge?: string;
}

export interface TimelineConfig {
  title?: string;
  subtitle?: string;
  items: TimelineItem[];
  orientation?: 'vertical' | 'horizontal';
  theme?: 'default' | 'minimal' | 'connected';
  showDates?: boolean;
}{hx	;export interface ConversionCTAButton {
  text: string;
  variant?: 'filled' | 'tonal' | 'outlined';
  size?: 'small' | 'medium' | 'large';
  action: () => void;
  disabled?: boolean;
  loading?: boolean;
}

export interface CTASectionConfig {
  title: string;
  subtitle?: string;
  description?: string;
  ctaPrimary: ConversionCTAButton;
  ctaSecondary?: ConversionCTAButton;
  backgroundType: 'gradient' | 'pattern' | 'image' | 'solid';
  urgency?: UrgencyConfig;
  maxWidth?: 'sm' | 'md' | 'lg' | 'xl';
}

export interface UrgencyConfig {
  type: 'countdown' | 'limited-offer' | 'social-proof';
  text: string;
  endDate?: Date;
  remaining?: number;
}

export interface PricingTableConfig {
  plans: PricingPlan[];
  billingToggle: BillingToggle;
  featuresComparison: boolean;
  highlightedPlan?: string;
  maxWidth?: 'sm' | 'md' | 'lg' | 'xl';
}

export interface PricingPlan {
  id: string;
  name: string;
  price: PriceStructure;
  features: PricingFeature[];
  cta: ConversionCTAButton;
  badge?: string;
  popular?: boolean;
  description?: string;
}

export interface PriceStructure {
  monthly: number;
  yearly: number;
  currency: string;
  suffix?: string; // per user, per month, etc.
}

export interface PricingFeature {
  name: string;
  included: boolean;
  description?: string;
  highlight?: boolean;
}

export interface BillingToggle {
  monthlyLabel: string;
  yearlyLabel: string;
  discountText?: string;
}

export interface NewsletterSignupConfig {
  title: string;
  description?: string;
  placeholder: string;
  ctaText: string;
  privacyText?: string;
  successMessage: string;
  variant: 'inline' | 'modal' | 'sidebar' | 'footer';
  showPrivacyCheckbox?: boolean;
}

export interface ContactFormConfig {
  fields: FormField[];
  submitText: string;
  successMessage: string;
  layout: 'single-column' | 'two-column' | 'inline';
  validation: ValidationRules;
  title?: string;
  description?: string;
}

export interface FormField {
  type: 'text' | 'email' | 'tel' | 'textarea' | 'select' | 'checkbox';
  name: string;
  label: string;
  placeholder?: string;
  required: boolean;
  options?: SelectOption[];
  rows?: number; // for textarea
  validation?: FieldValidation;
}

export interface SelectOption {
  value: string;
  label: string;
}

export interface FieldValidation {
  minLength?: number;
  maxLength?: number;
  pattern?: string;
  custom?: (value: any) => string | null;
}

export interface ValidationRules {
  [fieldName: string]: FieldValidation;
}Q'xqexport interface FeatureItem {
  id: string;
  title: string;
  description: string;
  icon?: string;
  iconType?: 'fa' | 'material' | 'custom';
  image?: string;
  link?: FeatureLink;
}

export interface FeatureLink {
  url: string;
  text: string;
  target?: '_blank' | '_self';
}

export interface FeatureGridConfig {
  title?: string;
  subtitle?: string;
  features: FeatureItem[];
  layout?: 'grid' | 'masonry' | 'list';
  columns?: 'auto' | 2 | 3 | 4;
  variant?: 'card' | 'minimal' | 'bordered';
  showIcons?: boolean;
  animationType?: 'fade' | 'slide' | 'scale' | 'none';
  spacing?: 'tight' | 'normal' | 'loose';
}@>ximport { CTAButton } from './shared.interfaces';

/**
 * Configuration interface for hero section components
 */
export interface HeroConfig {
  title: string;
  subtitle?: string;
  ctaPrimary?: CTAButton;
  ctaSecondary?: CTAButton;
  backgroundType?: 'solid' | 'gradient' | 'image' | 'video' | 'animated';
  alignment?: 'left' | 'center' | 'right';
  minHeight?: 'full' | 'large' | 'medium';
  animationType?: 'fade' | 'slide' | 'zoom';
}

/**
 * Hero with image specific configuration
 */
export interface HeroImageConfig extends HeroConfig {
  imageUrl?: string;
  imageAlt?: string;
  imagePosition?: 'left' | 'right';
  imageMobile?: 'above' | 'below' | 'hidden';
}

/**
 * Split screen hero configuration
 */
export interface HeroSplitConfig extends HeroConfig {
  leftContent?: {
    type: 'text' | 'image' | 'video';
    content: string;
  };
  rightContent?: {
    type: 'text' | 'image' | 'video';
    content: string;
  };
  splitRatio?: '50-50' | '60-40' | '40-60' | '70-30' | '30-70';
}AQx8export * from './shared.interfaces';
export * from './hero.interfaces';
export * from './feature.interfaces';
export * from './social-proof.interfaces';
export * from './conversion.interfaces';
export * from './navigation.interfaces';
export * from './content.interfaces';
export * from './templates.interfaces';l&{xDimport { CTAButton } from './shared.interfaces';

export type { CTAButton };

export interface NavigationItem {
  id: string;
  label: string;
  url?: string;
  route?: string;
  target?: '_blank' | '_self';
  icon?: string;
  badge?: string;
  children?: NavigationItem[];
  action?: () => void;
}

export interface MegaMenuItem {
  id: string;
  label: string;
  items: NavigationItem[];
  featured?: FeaturedContent;
}

export interface FeaturedContent {
  title: string;
  description: string;
  imageUrl?: string;
  url: string;
  buttonText: string;
}

export interface LandingHeaderConfig {
  logo: LogoConfig;
  navigation: NavigationItem[];
  megaMenu?: MegaMenuItem[];
  ctaButton?: CTAButton;
  transparent?: boolean;
  sticky?: boolean;
  showMobileMenu?: boolean;
  size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | 'full';
  maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | 'full';
  theme?: 'light' | 'dark' | 'auto';
}

export interface LogoConfig {
  text?: string;
  imageUrl?: string;
  url?: string;
  width?: number;
  height?: number;
}

export interface FooterColumn {
  id: string;
  title: string;
  items: FooterLink[];
}

export interface FooterLink {
  id: string;
  label: string;
  url?: string;
  route?: string;
  icon?: string;
  badge?: string;
  target?: '_blank' | '_self';
  action?: () => void;
}

export interface SocialLink {
  id: string;
  platform: 'facebook' | 'twitter' | 'instagram' | 'linkedin' | 'youtube' | 'github' | 'dribbble';
  url: string;
  icon?: string;
  label?: string;
}

export interface FooterConfig {
  columns: FooterColumn[];
  socialLinks?: SocialLink[];
  copyright?: string;
  logo?: LogoConfig;
  newsletter?: NewsletterConfig;
  legalLinks?: FooterLink[];
  theme?: 'light' | 'dark';
  showDivider?: boolean;
}

export interface NewsletterConfig {
  title: string;
  description?: string;
  placeholder: string;
  buttonText: string;
  onSubmit: (email: string) => void;
}Ɍx /**
 * Shared interface definitions used across multiple components
 */

export interface CTAButton {
  text: string;
  variant: 'filled' | 'tonal' | 'outlined';
  size?: 'small' | 'medium' | 'large';
  icon?: string;
  action: () => void;
}Y~NRx*export interface TestimonialItem {
  id: string;
  name: string;
  title?: string;
  company?: string;
  content: string;
  rating?: number;
  avatar?: string;
  verified?: boolean;
}

export interface TestimonialCarouselConfig {
  title?: string;
  subtitle?: string;
  testimonials: TestimonialItem[];
  autoPlay?: boolean;
  autoPlayDelay?: number;
  showDots?: boolean;
  showNavigation?: boolean;
  itemsPerView?: 1 | 2 | 3;
  variant?: 'card' | 'minimal' | 'quote';
  showRatings?: boolean;
}

export interface LogoItem {
  id: string;
  name: string;
  logo: string;
  url?: string;
  grayscale?: boolean;
}

export interface LogoCloudConfig {
  title?: string;
  subtitle?: string;
  logos: LogoItem[];
  layout?: 'row' | 'grid' | 'marquee';
  itemsPerRow?: 3 | 4 | 5 | 6;
  grayscale?: boolean;
  hoverEffect?: boolean;
  maxHeight?: number;
}

export interface StatisticItem {
  id: string;
  value: number | string;
  label: string;
  suffix?: string;
  prefix?: string;
  description?: string;
  icon?: string;
  animateValue?: boolean;
}

export interface StatisticsConfig {
  title?: string;
  subtitle?: string;
  statistics: StatisticItem[];
  layout?: 'row' | 'grid';
  variant?: 'minimal' | 'card' | 'highlighted';
  animateOnScroll?: boolean;
  backgroundColor?: 'transparent' | 'surface' | 'primary';
}cmx&import { HeroConfig } from './hero.interfaces';
import { FeatureGridConfig } from './feature.interfaces';
import { TestimonialCarouselConfig, StatisticsConfig } from './social-proof.interfaces';
import { PricingTableConfig, CTASectionConfig } from './conversion.interfaces';
import { LandingHeaderConfig, FooterConfig } from './navigation.interfaces';
import { FAQConfig, TeamConfig, TimelineConfig } from './content.interfaces';

export interface LandingPageSection {
  id: string;
  component: string;
  configuration: any;
  visible?: boolean;
  order?: number;
}

export interface LandingPageTemplate {
  id: string;
  name: string;
  description: string;
  type: 'saas' | 'product' | 'agency' | 'custom';
  sections: LandingPageSection[];
  theme?: 'light' | 'dark' | 'gradient';
  metadata?: {
    title?: string;
    description?: string;
    keywords?: string[];
    author?: string;
  };
}

// Pre-configured template interfaces
export interface SaaSTemplateConfig {
  hero: HeroConfig;
  features: FeatureGridConfig;
  socialProof: StatisticsConfig;
  pricing: PricingTableConfig;
  testimonials: TestimonialCarouselConfig;
  faq: FAQConfig;
  cta: CTASectionConfig;
  header?: LandingHeaderConfig;
  footer?: FooterConfig;
}

export interface ProductTemplateConfig {
  hero: HeroConfig;
  features: FeatureGridConfig;
  testimonials: TestimonialCarouselConfig;
  pricing: PricingTableConfig;
  cta: CTASectionConfig;
  header?: LandingHeaderConfig;
  footer?: FooterConfig;
}

export interface AgencyTemplateConfig {
  hero: HeroConfig;
  services: FeatureGridConfig;
  team: TeamConfig;
  timeline: TimelineConfig;
  testimonials: TestimonialCarouselConfig;
  cta: CTASectionConfig;
  header?: LandingHeaderConfig;
  footer?: FooterConfig;
}_,x */*
 * Public API Surface of ui-landing-pages
 */

// Components
export * from './lib/components';

// Interfaces
export * from './lib/interfaces';

// Services (future expansion)
// export * from './lib/services';?1Dx. lsof -t -i tcp:4200 | xargs kill -9
ng serve 
Nx]S9}~*'*]ٺJQ ȶ.hV|[Xc8@nXnճryɎp3O|R)nX֕[gcmK11I-(y/[102vj̄e &SF'3VO#d)$(xYadz ՐbFL-bJOtU:Iゕ-a_f@QπZ MI:[j{Bf;pu*ZRԱUp0^;@rqrqJG<^,hF[6%j},bKe DL||PDiSa^ȢdN4X)5g%e1fS@ʒ7s[rH$I^ vHmOX碬
k($E|(R$L~`˲p=3{]z6 {o_&F d.oݢ՝6%Lq3:UZWc0}YN 썺,׀}QTL/|Ats$R)*)<;2וi)"4P?ÝSږÿ~D^XgX/g'gO?faf"Č3\1\hC@GW9 JCCNs}({RKlLU231IZl'f\!NdbY٥  "fV#Tf$<\ܗCև'$ SH|v\a%5@I(HBR@wi:?Eo3.&ܑ]Ɔns,-s>/~ܯCY;M}?0|DȲ]]&xik띅zKIp~ <ʖǒD-Ɩ6]dVjQ:#9w-R1xb I/a;Jv9#(C	")0<ʪyYP7# F}쇂  *kCCO'r
)%jrO7i^Cت+=s1%JjL櫴ptnK>V҈Jt Еgnњ+x{JL	M-AQjĘCA0C ""DS p(ۙȥz4\]J xWm
+׺b!B0Te~lE ޚ[H|i;v䅉U72I3B5e<bA(]uEۑ.j_c:a.K;}Tn,;ǸOQ㟴@ݥ4R&Rt_,){$,
ph݉;t˖d G)h	,$uR+pQӺ6hzʗF[UpghUpξ7Ks-NoONrrT67+"QɫK`(d9pC[|ԯ^Xx"W_]:m~[vXXϪ!>H[(>g<67>5*?56j 6'´/thHg4_9:<g5}KhOzBjd>0~MѮ> (1gPHe
Yo"äXU7B	ҡ\t3{T*;mY2'@֨՟o&g0oӗmv2+\'r=h_ޤkz33%赞XϜ
M/}z/!`U݅+#a+Rli_7u3鲌tOҲ[d_w%cnL]蓁yyەX{;0]G:1|5Z8~M[m}I|-j؇ ;R,tBkI( RZ<Bi=pS(|:@E3x]k],w :"5rBv8.WK"W<[I=nq(#RQohWpu|-.!cNt4D)и2.F8"bqJƑVV(74&LOD&EOpu[j`מÇًpafUA~+Ɉ_U_)S<SiS9i'S|``g%.DRJ!ݒ_GT[jyQ?s|,)X5t'9C[~bN'4epF`Jӻ#_Q:vU {N)HK9JvI{ײ2pprWuy8Wp{I$V c=peKc_zPnpu\}:Dqű̯)⎓k"͸KŰyQuQ5He\oT'#AVTP3ЏJpG(.4>Naì|qpWݝ㊕7LZh;2p֡&7un2vn6s}i5RN?9{V<;,W8T'U8#hG)})Z~Q|3`_:*iBdĎm dw*~ŹM<ZEǍWFj~8pr|kȒŽHqX^|w%UsnC(& URosԤ^fN+pyA>JOAy3VNrAWUSAy %݆#PjT_|'1N:$9>?S؈,x& 40000 app e&WRi*N ؂Px vvbF1J(מ,f횙Ѳx@@use '../../../../../ui-design-system/src/styles/semantic' as *;

.demo-container {
  padding: $semantic-spacing-component-lg;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
  margin-bottom: $semantic-spacing-layout-section-md;
  
  h2 {
    font-family: map-get($semantic-typography-heading-h2, font-family);
    font-size: map-get($semantic-typography-heading-h2, font-size);
    font-weight: map-get($semantic-typography-heading-h2, font-weight);
    line-height: map-get($semantic-typography-heading-h2, line-height);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-content-heading;
  }
  
  h3 {
    font-family: map-get($semantic-typography-heading-h3, font-family);
    font-size: map-get($semantic-typography-heading-h3, font-size);
    font-weight: map-get($semantic-typography-heading-h3, font-weight);
    line-height: map-get($semantic-typography-heading-h3, line-height);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-component-md;
  }
}

.demo-showcase {
  border: $semantic-border-width-1 solid $semantic-color-border-primary;
  border-radius: $semantic-border-radius-md;
  background: $semantic-color-surface-secondary;
  padding: $semantic-spacing-component-md;
  height: 400px;
  position: relative;
}

.demo-scroll-container {
  width: 100%;
  height: 100%;
  border-radius: $semantic-border-radius-sm;
  background: $semantic-color-surface-primary;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
}

// Basic demo items
.demo-item {
  padding: $semantic-spacing-component-md;
  margin-bottom: $semantic-spacing-component-sm;
  background: $semantic-color-surface-elevated;
  border-radius: $semantic-border-radius-sm;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  
  h4 {
    font-family: map-get($semantic-typography-heading-h4, font-family);
    font-size: map-get($semantic-typography-heading-h4, font-size);
    font-weight: map-get($semantic-typography-heading-h4, font-weight);
    line-height: map-get($semantic-typography-heading-h4, line-height);
    color: $semantic-color-text-primary;
    margin: 0 0 $semantic-spacing-content-line-normal 0;
  }
  
  p {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-secondary;
    margin: 0 0 $semantic-spacing-component-xs 0;
  }
  
  small {
    font-family: map-get($semantic-typography-caption, font-family);
    font-size: map-get($semantic-typography-caption, font-size);
    font-weight: map-get($semantic-typography-caption, font-weight);
    line-height: map-get($semantic-typography-caption, line-height);
    color: $semantic-color-text-tertiary;
  }
}

// Template demo items
.demo-template-item {
  padding: $semantic-spacing-component-lg;
  background: $semantic-color-surface-elevated;
  border-radius: $semantic-border-radius-md;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  
  &:hover {
    box-shadow: $semantic-shadow-elevation-2;
    transform: translateY(-2px);
  }
  
  &--last {
    border-color: $semantic-color-primary;
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &__header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  &__id {
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: $semantic-typography-font-weight-semibold;
    line-height: map-get($semantic-typography-body-small, line-height);
    color: $semantic-color-primary;
  }
  
  &__category {
    font-family: map-get($semantic-typography-caption, font-family);
    font-size: map-get($semantic-typography-caption, font-size);
    font-weight: map-get($semantic-typography-caption, font-weight);
    line-height: map-get($semantic-typography-caption, line-height);
    background: $semantic-color-surface-container;
    color: $semantic-color-text-secondary;
    padding: $semantic-spacing-1 $semantic-spacing-2;
    border-radius: $semantic-border-radius-sm;
  }
  
  &__title {
    font-family: map-get($semantic-typography-heading-h4, font-family);
    font-size: map-get($semantic-typography-heading-h4, font-size);
    font-weight: map-get($semantic-typography-heading-h4, font-weight);
    line-height: map-get($semantic-typography-heading-h4, line-height);
    color: $semantic-color-text-primary;
    margin: 0 0 $semantic-spacing-component-xs 0;
  }
  
  &__description {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-secondary;
    margin: 0 0 $semantic-spacing-component-sm 0;
  }
  
  &__footer {
    border-top: $semantic-border-width-1 solid $semantic-color-border-subtle;
    padding-top: $semantic-spacing-component-xs;
    
    small {
      font-family: map-get($semantic-typography-caption, font-family);
      font-size: map-get($semantic-typography-caption, font-size);
      font-weight: map-get($semantic-typography-caption, font-weight);
      line-height: map-get($semantic-typography-caption, line-height);
      color: $semantic-color-text-tertiary;
    }
  }
}

// Bidirectional demo items
.demo-bidirectional-item {
  padding: $semantic-spacing-component-sm;
  
  &__content {
    background: $semantic-color-surface-elevated;
    padding: $semantic-spacing-component-md;
    border-radius: $semantic-border-radius-lg;
    border-left: 4px solid $semantic-color-primary;
    
    strong {
      font-family: map-get($semantic-typography-body-medium, font-family);
      font-size: map-get($semantic-typography-body-medium, font-size);
      font-weight: $semantic-typography-font-weight-semibold;
      line-height: map-get($semantic-typography-body-medium, line-height);
      color: $semantic-color-text-primary;
      display: block;
      margin-bottom: $semantic-spacing-content-line-tight;
    }
    
    p {
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
      color: $semantic-color-text-secondary;
      margin: 0 0 $semantic-spacing-content-line-tight 0;
    }
    
    small {
      font-family: map-get($semantic-typography-caption, font-family);
      font-size: map-get($semantic-typography-caption, font-size);
      font-weight: map-get($semantic-typography-caption, font-weight);
      line-height: map-get($semantic-typography-caption, line-height);
      color: $semantic-color-text-tertiary;
    }
  }
}

// Custom templates
.demo-custom-item {
  display: flex;
  gap: $semantic-spacing-component-md;
  padding: $semantic-spacing-component-md;
  background: $semantic-color-surface-elevated;
  border-radius: $semantic-border-radius-md;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  
  &__avatar {
    flex-shrink: 0;
    width: $semantic-sizing-touch-target;
    height: $semantic-sizing-touch-target;
    background: $semantic-color-primary;
    color: $semantic-color-on-primary;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: $semantic-typography-font-weight-bold;
    line-height: map-get($semantic-typography-body-medium, line-height);
  }
  
  &__content {
    flex: 1;
    min-width: 0;
    
    h4 {
      font-family: map-get($semantic-typography-heading-h4, font-family);
      font-size: map-get($semantic-typography-heading-h4, font-size);
      font-weight: map-get($semantic-typography-heading-h4, font-weight);
      line-height: map-get($semantic-typography-heading-h4, line-height);
      color: $semantic-color-text-primary;
      margin: 0 0 $semantic-spacing-content-line-tight 0;
    }
    
    p {
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
      color: $semantic-color-text-secondary;
      margin: 0 0 $semantic-spacing-content-line-tight 0;
    }
  }
  
  &__time {
    font-family: map-get($semantic-typography-caption, font-family);
    font-size: map-get($semantic-typography-caption, font-size);
    font-weight: map-get($semantic-typography-caption, font-weight);
    line-height: map-get($semantic-typography-caption, line-height);
    color: $semantic-color-text-tertiary;
  }
}

.demo-custom-loading {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-md;
  padding: $semantic-spacing-component-lg;
  background: linear-gradient(45deg, $semantic-color-primary, $semantic-color-secondary);
  color: $semantic-color-on-primary;
  border-radius: $semantic-border-radius-lg;
  
  &__spinner {
    width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
    border: 3px solid rgba(255, 255, 255, 0.3);
    border-radius: 50%;
    border-top-color: white;
    animation: spin $semantic-motion-duration-slow linear infinite;
  }
  
  span {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: $semantic-typography-font-weight-medium;
    line-height: map-get($semantic-typography-body-medium, line-height);
  }
}

.demo-custom-error {
  text-align: center;
  padding: $semantic-spacing-component-xl;
  background: rgba($semantic-color-danger, 0.1);
  border: $semantic-border-width-1 solid $semantic-color-danger;
  border-radius: $semantic-border-radius-lg;
  
  &__icon {
    font-size: $semantic-typography-font-size-2xl;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  h4 {
    font-family: map-get($semantic-typography-heading-h4, font-family);
    font-size: map-get($semantic-typography-heading-h4, font-size);
    font-weight: map-get($semantic-typography-heading-h4, font-weight);
    line-height: map-get($semantic-typography-heading-h4, line-height);
    color: $semantic-color-danger;
    margin: 0 0 $semantic-spacing-component-xs 0;
  }
  
  p {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-secondary;
    margin: 0;
  }
}

.demo-custom-end {
  text-align: center;
  padding: $semantic-spacing-component-xl;
  background: linear-gradient(135deg, $semantic-color-success, $semantic-color-primary);
  color: $semantic-color-on-success;
  border-radius: $semantic-border-radius-lg;
  
  &__icon {
    font-size: $semantic-typography-font-size-3xl;
    margin-bottom: $semantic-spacing-component-sm;
  }
  
  h4 {
    font-family: map-get($semantic-typography-heading-h4, font-family);
    font-size: map-get($semantic-typography-heading-h4, font-size);
    font-weight: map-get($semantic-typography-heading-h4, font-weight);
    line-height: map-get($semantic-typography-heading-h4, line-height);
    margin: 0 0 $semantic-spacing-component-xs 0;
  }
  
  p {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    margin: 0;
    opacity: 0.9;
  }
}

// Configuration demo
.demo-config-item {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-component-md;
  padding: $semantic-spacing-component-md;
  background: $semantic-color-surface-elevated;
  border-radius: $semantic-border-radius-sm;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  
  &__index {
    flex-shrink: 0;
    width: $semantic-sizing-touch-minimum;
    height: $semantic-sizing-touch-minimum;
    background: $semantic-color-surface-container;
    color: $semantic-color-text-secondary;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: $semantic-typography-font-weight-semibold;
    line-height: map-get($semantic-typography-body-small, line-height);
  }
  
  &__content {
    flex: 1;
    
    h4 {
      font-family: map-get($semantic-typography-body-medium, font-family);
      font-size: map-get($semantic-typography-body-medium, font-size);
      font-weight: $semantic-typography-font-weight-semibold;
      line-height: map-get($semantic-typography-body-medium, line-height);
      color: $semantic-color-text-primary;
      margin: 0 0 $semantic-spacing-content-line-tight 0;
    }
    
    p {
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
      color: $semantic-color-text-secondary;
      margin: 0;
    }
  }
}

// Controls
.demo-controls {
  display: flex;
  flex-wrap: wrap;
  gap: $semantic-spacing-component-md;
  margin-bottom: $semantic-spacing-component-lg;
  padding: $semantic-spacing-component-md;
  background: $semantic-color-surface-secondary;
  border-radius: $semantic-border-radius-md;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  
  button {
    padding: $semantic-spacing-interactive-button-padding-y $semantic-spacing-interactive-button-padding-x;
    background: $semantic-color-primary;
    color: $semantic-color-on-primary;
    border: none;
    border-radius: $semantic-border-radius-sm;
    cursor: pointer;
    
    font-family: map-get($semantic-typography-button-medium, font-family);
    font-size: map-get($semantic-typography-button-medium, font-size);
    font-weight: map-get($semantic-typography-button-medium, font-weight);
    line-height: map-get($semantic-typography-button-medium, line-height);
    
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &:hover {
      box-shadow: $semantic-shadow-elevation-2;
      transform: translateY(-1px);
    }
    
    &:active {
      transform: translateY(0);
      box-shadow: $semantic-shadow-elevation-1;
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
  }
}

.demo-control {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-xs;
  
  label {
    font-family: map-get($semantic-typography-label, font-family);
    font-size: map-get($semantic-typography-label, font-size);
    font-weight: map-get($semantic-typography-label, font-weight);
    line-height: map-get($semantic-typography-label, line-height);
    color: $semantic-color-text-primary;
    display: flex;
    flex-direction: column;
    gap: $semantic-spacing-component-xs;
  }
  
  input[type="checkbox"] {
    width: auto;
    margin-right: $semantic-spacing-component-xs;
  }
  
  input[type="range"] {
    width: 150px;
  }
}

@keyframes spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .demo-template-item {
    transition: none;
    
    &:hover {
      transform: none;
    }
  }
  
  .demo-custom-loading__spinner {
    animation: none;
  }
  
  button {
    transition: none;
    
    &:hover {
      transform: none;
    }
    
    &:active {
      transform: none;
    }
  }
}> xXMl-(m(
m>lZ*  mQ.]ZR@OE9PK1״%@Eh罷K.)Jɡq{3|3߬z[ݭVWO:WK0!%a(vOǦlϞkjn}>~ MgAeqn~XtXrC"/AֵjjjmG~eJ+jQ->ps"yx9mORyRҪUբ{W.|Zx>?s8)Zu1dEkڥ0zVV3si֗F`b
%</*M6q1yg>^nXSj͡"bj#-,3^%l9HVh.Qn,/MiVU8(۳q\qGKs|0ӓiknU̺#ku
Z(etji
{R:*-U<:!5w7]4YM@K07e$sKۡ7{\jWC,YG^eXhSH18d;C9$- n>!z!~"Jb^C478ߘn	B82e)3䠝c~+g_è@!JNB!-MKY/8rx)\,܃|U*+C]Z"|98?IHOzJn MP0lU:`~JM7FB٪1ٲ'^QuM|!{tL{Rs
nObKCƯGAtaiQOI0`-
c8d7Fh	hbpunY2!=5v?ΑJDsqTEsLQ݉@eLpjL7Qɵpid$2J!%d`Aͩ4KOzm2aClU6uMr+~и6MׄcӒY[Hұ$ΑE=2)˥ӆirƣ+x8Z#ɞnH)ZG_qքjYW/S
-v'ŉub#7I`\7ۣXOQţQl=5N	*Gb+lJ.btn.㛣wzSՋ/Zrۿ,W@2LLFvVʄ׻lUW+tnnGlumfZX˗.8k4m0GʤϬ:vzygGZ \ḴS`e;AS"oo"U I'!>.%*}qYղJ,ɭ3znD3>W=)쨀eۃ"sQ˪x1^E&p7`|ڇ<X6&Mj;K09ٗr̚M{uugSYIzxP2h率UwvlˇWHQ[;lDuZfJoW,,[u$^e=[A}(u=O.Ξ(Zא-n]2Ʃ*sި5(Γ8SF0(̣]	ݩ :>ٓM?b0(ޖAoc[[޵[/J:N>ʆ lP6{VF9SDW;#ٷUxx%W|3Ig/@9 :QReEAa[<5[(6<\0i?9cGhmU]q;l7bD9;V^UsdkSo,voKߠt1ϋw7at3R24#4+:WC$◰sSqW~1p'k6o`ؾ}e]aő,
x8%>|x}<p`ahӦHRT˦5?%cϞIlg{mt;+B7}[
rK<=Q%1zs~ n9xg@use "3":S00%;
  
  h2 {?-lg 0;80}
  
  h3 {
    margin>l.md 0;H}
  
  h4 {?55P}7p>l;
  
  &:last-child {
    margin-bottom: 0;
  }
}

.demo-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr))o7Pgrid-gap-lg;
  
  @media (max-width: 768px) {
    grid-template-columns: 1fr;
  q7!grid-gap-md;
  }
}

.demo-item {
02&T8H@1'N80,;)}

.event-log {
  margin"7hZ8B@1'N8
  h4 {?55P}
}

.events {
  max-height: 200px;
  overflow-y: auto;
  
  // Scroll styling
  scrollbar-width: thin;
  scrollbar-color: $semprimary8\container;
  
  &::-webkit-scrollbar {
    width: 8px;
  }
  
  &::-webkit-scrollbar-track {-28%5::-webkit-scrollbar-thumb {-2!>O1}
}

.eventm`7<<0%sm;
  border<6:
  &:last-child {
    border-bottom: none;
  }
  
  strong^P'N$#
NfAAxS^'5/index' as *;

.ui-kanban-board {
  // Core Structure$`7<position: relative;&"
  // Layout & Spacing$s7sm;
  
  // Visual Design
02%P8L@1'@-	// Size Variants
  &--sm {
  $xs;
  q7xs;
  }
  
  &--md {
  $sm;
  q7sm;
  }
  
  &--lg {
  $q7}
  
  // Disabled State
  &--disabled {
    opacity: $semantic-opacity-disabled;
    pointer-events: none;
  }
  
  // Header Section&=>5o!<'LF030}
  
  &__subtitle {A0&/ N$*}
  
  // Columns Container
  &__columns {^s7;grid-gap-md;
    overflow-x: auto;
    flex: 1;
    paddingA+B  
    // Scroll styling
    scrollbar-width: thin;
    scrollbar-primary8&/  
    &::-webkit-scrollbar {
      height: 8px;:-webkit-scrollbar-track {
  .2(!1;:-webkit-scrollbar-thumb {
  .2 primary;
  !1;#:-webkit-scrollbar-thumb:hover {
  .2 ;econdary;
    }
  }
  
  // Individual Column
  &__column {^=>Nmin-width: 280px;
    max-width: 350px;
    flex: 1;
    
    // Visual Design-2)2s192O1N8;0
    // Transitions
  pQ?;I// States
    &--disabled {
      opacity: $semantic-opacity-disabled;
  .27}
    
    &--full {
  .2(0"Mprimary;
    }
    
    // Drag over effect
    &[data-drag-over="true"] {
  0/T;222$2  }
  }
  
  // Column Header
  &__column-header {^=$%=	<602&IO1mdN1"md 0 0;
  }
  
  &__column-title {A03P}
  
  &__column-count {^1<'4`+/6N$-28$%xs##)full;
  k1J}
  
  &__column-limit {A/,  
  // Column Content
  &__column-content {^=>=sm;
  $'e  flex: 1;
    overflow-y: auto;
    
    // Scroll styling
    scrollbar-width: thin;
    scrollbar-primary8&.  
    &::-webkit-scrollbar {
      width: 6px;:-webkit-scrollbar-track {
  .2(!1;:-webkit-scrollbar-thumb {
  .2 primary;
  !1.  }
  }
  
  // Empty State
  &__empty-state {^Nmin-height: 120px;
  $-025border: 2px dasheO##)N8}
  
  &__empty-text {A0&/ N$(9  font-style: italic;
  }
  
  // Kanban Item
  &__item {^=>C$'sm;
    
    // Visual Design-2)k1J#)N8;0?
    // Interactive
    cursor: grab;
    user-select: none;
  pQ?;;// States
    &:hover:not(.ui-kanban-board__item--dragging)M;94primary~;6<cX  
    &--dragging {
      cursor: grabbing;
      opacity: $semantic-opacity-subtle;
  ^?2deg) scale(1.02);O;.4;
      z-index: $semantic-z-index-overlay;
    }
    
    // Priority variants
    &--priority-high {
      border-left: 4px (
$  }
    
    &--priority-medium {
  j+,warning;
    }
    
    &--priority-low {
  j+,2;
    }
  }
  
  // Item Header
  &__item-header {^1flex-start;
  <)>&__item-title {A0flex: 1;!/^P'N$}
  
  &__item-priorityP-1Lsm;
    line-height: 1;
  }
  
  // Item Description
  &__item-description {A06`+/6N$$}
  
  // Item Tags
  &__item-tags {^flex-wrap: wrap;
  <)>9&__item-tag {
    display: inline-block;
    padding: 2px>4
.223m1H#6// Item Meta
  &__item-meta {^=<'  margin(>&&__item-assignee,
  &__item-due-date {^1	gap: 2px;1
1}
  
  // Responsive Design
  .ui-kanban-board--sm {
    .ui-kanban-board__column {
      min-width: 220px;
      max-width: 2840px;
    }
    
    .ui-kanban-board__columns {
    q7Bgrid-gap-sm;
    }
    
    .ui-kanban-board__column-header {
    $':sm;
    }
    
    .ui-kanban-board__column-content {
    $'sm;
    <)*  }
    
    .ui-kanban-board__item {
    $'>  }
  }
  
  .ui-kanban-board--lg {
    .ui-kanban-board__column {
      min-width: 320px;
      max-width: 420px;
    }
    
 #   .ui-kanban-board__columns {
    q7Bgrid-gap-lg;
    }
    
    .ui-kanban-board__column-header {
    $-4  }
    
    .ui-kanban-board__column-content {
    $-  q7)*  }
    
    .ui-kanban-board__item {
    $'  }
  }
}

// High contrast mode support
@media (prefers-contrast: high) {
  .ui-kanban-board {
    &__column {
      border-width: 2px;
    }
    
    &__item {
      border-width: 2px;
      
      &--priority-high,
      &--priority-medium,
      &--p;riority-low {
        border-left-width: 6px;
      }
    }|?O1ui-kanban-board {
    &__column,
    &__item {
  ?@A__item {
      &:hover:not(.ui-kanban-board__item--dragging) {
  @!  }
      
      &--dragging {
  @  }
    }
  }
}FDGS~x(gL  
  h2:2q%E2E2>0	2mlg;
  `}Fxl;
  md;
    paddingQp/Q}
  1%W.Q;M$  flex-wrap: wrap;
  
  > * {
    flex: 1;
    min-width: 300px;
  }
  
  @media (max-width: calc(#{$semantic-breakpoint-md} - 
1px)) {
   W/M$)sm;
    
    > * {
      min-width: unsetO grid"	$-columns: repeat(auto-fit, minmax(280px, 1fr))qM$^
  @media (max-width: calc(#{$semantic-breakpoint-sm} - 1px)) {
    grid-template-columns: 1fr-M${itemT(
'87*}

.demo-infoT!>7*  1Z.p/  >'4}
}

.color-preview {
  width: 100px;
  height: 60px#2AP*-$ p/&}

.demo-form {
  .demo-form-info {
  -$ 1-$/container;
  @
L)-    
    pre {
    )8  ,sm;
  A (
   '-  1"0
  @
k    overflow-x: auto;
      white-space: pre-wrap;
      margin: 0;
    }
  }
  
  .demo-theme-preview {
  -$   
    .theme-sample0.-1"0
  @
  `   -P0GIM,)    }
  }
}

.event-log {
  max-height: 3&%-1
  .event-entry!7justify-content: space-between;
    align-items: center1+0'3 0
.#
R")),sm;
  D\%    
    &--recent {
      background!/@&focus;
    }
    
    .event-type {
  Z+2CKD    min-width: 80px;
    }
    
    .event-value {
      flex: 1;
  A+    margin: 01%`  }
    
    .event-time {
  A tertiary;
    ,Oxs;
      min-width: 80px;
      text-align: right;
    }
  }
}

.clear-log-btn*0%
danger;
dangerv_ݓd
  &:hover {
  5button-hover;
    transform: translateY(-1px);
  }
  (0);
  "button-rest;
  }
}

.preset-colorsT!>7*e  
  .preset-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(40px, 1fr))-'-  max-width: 400px;
  -$ @}
  
  .preset-color-btn {
    width: 40px;
    height: 40px;
  !2A)1"0
#O,4    
    &:hover {
      transform: scale(1.1);
    )3;
  )"focus;
    }
    
    &:focus {
  2:  }
    
    &:active {
      transform: scale(1.05);
    )2;
    }
    
    .sr-only {
      position: absolute;
      width: 1px;
      height: 1px;
      padding: 0;
      margin: -1px;
      overflow: hidden;
      clip: rect(0, 0, 0, 0);
      white-space: nowrap;
      border: 0;
    }
  }
}

// ResponsiveF adjustments
@media (max-width: calc(#{$semantic-breakpoint-md} - 1px),N  
  .demo-item {12  
  .demo-info {12  
  .preset-colors {12a.&calc(#{$semantic-breakpoint-sm} - 1px),Fxs;
  }
  
  .demo-item {1*-  
  .demo-info {1*-  
  .preset-colors {1*-Z  
    .preset-grid {
      grid-template-columns: repeat(auto-fit, minmax(35px, 1fr));
  -"-}
    
    .preset-color-btn {
      width: 35px;
      height: 35px;
    }
  }
  
  .event-log {
    .event-entry {
      flex     -"-  
      .event-type,
      .event-value,
      .event-time {
        min-width: unset;
        margin: 0;
        text-align: left;
      }
    }
  }
}-A6x!gX9?Glg2header {_!M$xl;
}

.demo-title_5L%a" md 0`.0	2:0	2:0	2<0	27}

.demo-title-icon {
K	"}

.demo-description {
  margin: 0`/Plarge?large;PlargeAlarge.
  kbd {
    display: inline-"#  padding: 2px0;
    margin: 0 2px;!!/('8
L)-.captionq<caption<caption>caption=M.Exl;
}

.demo-section-title {
a" 
 0`.0(030;*0'OpaddingQp/}

.demo-actions_]center;
}

.demo-button_58xsinteractive-button-padding-y!-interactive-button-padding-x+transparenta'$Sbackground: transparent`Cnone;md
&--primaryS"K	 !ddarken($semantic-color-primary, 10%);
      border-color: darken($semantic-color-primary, 10%);
    'button-hover;
    }
  }

  &--secondary#Q&on-secondary$second &hdarken($semantic-color-secondary, 10%);
      border-color: darken($semantic-color-secondary, 10%);
    'button-hover;
    }
  }

  &--outline {@,0 !&'secondary;
    button-hoverO fig-grid"	$-columns: repeat(auto-fit, minmax(200px, 1fr))q%-+lg;
}

.demo-config5 !xs;
}

.demo-label_58x_/label:labe;labe=labelA	;}

.demo-checkbox {
  width: 16px;
  height: 16px;
  accent!K}

.demo-input,
.demo-select interactive-input-padding-y!-interactive-input-padding-xmx$
d*input:input:input<input9transition: border\Ifocus {
    outline: none$box-shadow: 0 0 0 2px rgba(, 0.2);
  }
}

.demo-features"	$-columns: repeat(auto-fit, minmax(280px, 1fr))q%lg;
}

.demo-feature1"=1lg;
&
bMKK):2;
    transform: translateY(-2px);
  }

  h4 {
    margina-  00 0;8p%V;/O0 -}
}

.demo-feature-icon {
  font-size: 2rem;
K	}

.demo-stats"	$-columns: repeat(auto-fit, minmax(150px, 1fr))q%lg;
}

.demo-stat1"=1lg;
&
b}

.demo-stat-value /0	2:0	2:0	2<0	2)K+xs;
}

.demo-stat-label GBtransform: uppercase;
  letter-spacing: 0.05em;
}

.demo-shortcuts"	$-columns: repeat(auto-fit, minmax(250px, 1fr))q)}

.demo-shortcut_58,"=7/
	
  span1O0 )kbd {
  display: inline-flex1-min-width: 28px;
  height: 28px;
  padding: 00;
&(
'81d*caption:caption:caption<caption9*O  white-space: nowrap;
}

// Toast animation styles
@keyframes slideIn {
  from!X(100%);
    opacity: 0;
  }
  to9X(0);
    opacity: 1;
  }
}

@keyframes slideOut {
  fromX(0);
    opacity: 1;
  }
  toX(100%);
    opacity: 0;
  }
}

// Responsive design
@media (max-width: calc(#{$semantic-breakpoint-md} - 1px)) {
  .demo-conta-5md;
  }

  .demo-actions$
  .demo-config-grid {
    grid-template-columns: 1fr;
  }

  .demo-features {
    grid-template-columns: 1fr;
  }

  .demo-stagts {
    grid-template-columns: repeat(3, 1fr);
  }

  .demo-shortcuts {
    grid-template-columns: 1fr[.&calc(#{$semantic-breakpoint-sm} - 1px),7}

  .demo-title {
   W/#4xs;
    
    .demo-title-icon {
      font-size: 2re0Astats {
    grid-template-columns: 1fr;
  }

  .demo-actions {
     align-items: stretch;
  }
}t)kgxqgP9' as *;

.enhanced-table-demo M$2lg;
  max-width: 1400px;
  margin: 0 auto;
  
  h2:2q%E2E2>0	2^content-heading;
  }
  rcontent-heading;
  }
  1%W.p/  1G.#;
  }
}

// Demo Controls] 0	-columns: repeat(auto-fit, minmax(200px, 1fr))qgrid-gap-lg%M$lg)- $!>*card-radius.!h3 {2largek+!.!p/)}
  !d.!p/L%O0)##$accent!K  }
    
    select0UK  1"x(
A+I.  
      &:focus {
        outline: none;
    "    box-shadow: 0 0 0 2px rgba(", 0.2);
      }
    }
  }
  
  p {2>*%tertiary;
    margin: 0;
  }
}

.demoW"6Kj SK%dדcargin* ";
  
  &:hover:not(:disabled) {
  button-hover;
  }
  n`  
  &--secondary#/
+0"  
    &:hover:not(:disabled) {
  ((}
  }
  
  &--small {1*0')9size);
  }
}

// Performance Metrics
.performance-metrics5\$+$(
 xborder-left: 4info;
}

.metrics-grid"	$-columns: repeat(auto-fit, minmax(150px, 1fr))q)
}

.metric_ !xs;
  
  .metric-label {2>*}
  
  .metric-value {2largek+!K&}

// Table Container
.table-container9c'"card-radius?'2;
}

// Cell Templates
.salary-cell {
\+0
semibold;
success;
}

.performance-cell_5<?  width: 100%;
}

.performance-bar {
  flex: 1;
  height: 8px;
1?full;
  overflow: hidden;
}

.performance-fill {
  height: 100%a'+full;
  transition: widthnormal  
  &.performance-excellent##success;
  }
  
  &.performance-goo$$info;
  }
  
  &.performance-average##warning;
  }
  
  &.performance-poo$#danger;
  }
}

.performance-text {
"/>*k++8min-width: 35px;
  text-align: right;
}

.action-buttons_7xs;
}

.action-btn*0%#00
"->*k++b
  &--primaryS    
    &:hover {
  K(  }
  }
  
  &--dang%danger on-danger;
    
    &:hover {
  K(
  }
  }
  nW+1px;
  }
}

// State Display
.state-display"	$-columns: repeat(auto-fit, minmax(250px, 1fr))qgrid-gap(M$lg;
}

.state-section*$!>*x
  h4.(p/))}
}

.state-content {
  p {
    margin: 0"tertiary;
  ,  }
}

.sort-item,
.filter-item**"->*<O*/  
  strong {@K }

// Feature Demo
.feature-demoT(
 card-radius;
  border-left: 4K	}

.feature-list"	$-columns: repeat(auto-fit, minmax(300px, 1fr))q&grid-gap-lg;
}

.feature-item {
  h4 {2large, font-size);.&
xs-
}
  
  p {2>*  margin: 0;
  },,"1200px) {
  .enhanced-table-demo {12  
  .demo-controls {
    grid-template-columns: 1fr;
  }
  
  .feature-list {
    grid-template-columns: 1fr;
  }
}

@media (mm.
768px) {
  .state-display {
    grid-template-columns: 1fr;
  }
  
  .metrics-grid {
    grid-template-columns: repeat(2, 1fr); 
  }
  
  .performance-cell {
   W/#Vxs;
    
    .performance-bar {
      width: 100%;
    }
  }
  
  .action-buttons {
   }
}

// Print styles
@media print {
  .demo-controls,
  .performance-metrics,
  .state-display,
  .feature-demo {
    display: none !important;
  }
}xgO'I' as *;

.ui-floating-toolbar {
  // Core Structure
  position: absolute;a58/xs;
  opacity: 0;
  transform: translateY(-8px)Q  z-index: $semantic-z-index-overlay;
  pointer-events: none;
  will-change: opacity, transform;
  
  // Visual Design
  backgr
i0
%3;
  
  // Typographya.P0
  // Size Variants
  &--sm {1*xs-'R"7>*`L*O5O/#1>*)}
  
  &--md {1*--#-  
  &--lg {10-),OlargeqAlarge<OlargeC<large, line-height);
  }
  
  // Variant Styles
  &--default#/
2K)2;
  }
  
  &--eleva&/border: none;
  )4;
  }
  
  &--floating#/(
   backdrop-filter: blur(8px);
  )3;
  }
  
  &--compact {1*0'-!R"7>*`L*O5O/#1>*)*}
  
  // Context Variants
  &--contextualS    border: none;
  }
  
  // State Variants
  &--visible {
    opacity: 1;
    transform: translateY(0);
    pointer-events: auto;
  }
  
  &--entering {
    opacity: 0;
    transform: translateY(-8px);
  }
  
  &--leaving {
    opacity: 0;
    transfor-m: translateY(-8px);
    transition-duration:;
  }
  
  &--disabled {J Jdisabled;
    pointer-events: none;
  }
  
  // Content Areas
  &__actions!Z'}
  
  &__action {
    display: inline-"#-#xs1+0'-background: transparent;
    border: none;
  13+* _L* , /#-.#O-Xsm;
    white-space: nowrap;
    user-select: none;
    
    &:hover:not(:disabled) {
  6C))  }
    
    &:active:not(:disabled) {
  (pressed;
  "  }
    
  o0-  }
    
    &--disabled,
    &:disabled {
  Kdisabled;
      cursor: not-allowed;
      pointer-events: none;
    }
    
    // Contextual toolbar button styles
    .ui-flo ating-toolbar--contextual & {
  Ak$  
      &:hover:not(:disabled) {
  % 0Ak-  }
      
      &:active:not(:disabled) {
  % (M2);
      }
    }
    
    // Icon styling
    i {
      flex-shrink: 0;
    ,sm;
      line-height: 1;
    }
  }
  
  &__action-label {
    display: none;
    
    &--visible {
      display: inline;
    ?}
    
    // Show labels on small screens or when no icon
    ,(.F    display: inline;
    }
  }
  
  &__shortcut {
    display: inline-"#padding: 2px 6px;!!/(`)8,xsak++1"0
@
  margin-left* -;
    
    .ui-floating-toolbar--contextual &" ,5);
  Ak,  border-color: rgba(255, 255, 255, 0.2);
  K-subtle;
    }
  }
  
  &__divider {
    width$;
    'sm;!!
  margin: 00-;
    
    .ui-floating-toolbar--contextual &" +2);
    }
  }
  
  &__label {@!,OL*O5O/#1>*)G  white-space: nowrap;
    
    .ui-floating-toolbar--contextual & {
  AkM4subtle;
    }
  }
  
  // Position Variants
  &--toph8px);
    
    &.ui-floating-toolbar--visible {
      transform: translateY(0);
    }
  }
  
  &--bottomg-8px);
    
    &.ui-floating-toolbar--visible {
      transform: translateY(0);
    }
  }
  
  &--leftiX(8px);
    
    &.ui-floating-toolbar--visible {
      transform: translateX(0);
    }
  }
  
  &--rightX(-8px);
    
    &.ui-floating-toolbar--visible {
      transform: translateX(0);
    }
  }
  
  // Animation Variants
  &--sl"ide-fade {
    transition: opacitynormal,
                transformnormal,  }
  
  &--bounce {
    transition: opacity8!spring,
                transform8jspring;
  }
  
  // Interactive States
  &:not(.ui-floating-toolbar--disabled) {
    &:focus-within {
    )4, 0 0 0 2px"}
  }
  
  // Responsive Design
  ,41'0'-!&xs;
    
    &.ui-floating-toolbar--lg0.-  !#-  }
  }
  
  ,(.1'xs-'xs;
  1"0
  /OL*O5O/#1>*)  
    &__actions {
  -"-'}
    
    &__divider {
      margin: 00[;
    }
  }
  
  // Touch-friendly adjustments
  @media (hover: none) and (pointer: coarse)/$semantic-sizing-touch-target;
    
    &__actions {
      min-height: $semantic-sizing-touch-minimum;
    }
  }
  
  // High contrast mode support
  #2$2,@  box-shadow: none;
    
    &--elevated,
    &--floating {
    !2A))  
  3  (3,3  
    &--slide-fade,
    &--bounce {
      transition: none;
    }
  }
}

// Backdrop for modal-like behavior when needed
.ui-floating-toolbar-backdrop {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: transparent;
 H z-index: calc($semantic-z-index-overlay - 1);
  pointer-events: auto;
} IxkOLIcommand-palette'-right: 0;
  bottom: 0O3modal;
  display: none;
  align-items: flex-start;
 layout-section-lg!T
  &--open,
  &--entering,
  &--leaving {
    display: flex;
  }

  &__backdrop {
  p3  top: 0;
    left: 0;
    right: 0;
    bottom: 0;!6backdrop;
    opacity: 0;
    animation: backdropEntero#E forwards;
  }

  &--leaving &__backdrop {
    animation: backdropExi1|,_ forwards;
  }

  &__container {
    position: relative;
    width: 100%;
    max-width: 640px;)
BS'lg{#modal;
    overflow: hidden;7Y(-20px);
    opacity: 0;
    animation: containerEnteroG forwards;
  }

  &--leaving &__container {
    animation: containerExi1|, forwards;
  }

  // Size variants
  &--md &__container {
    max-width: 480px;
  }

  &--lg &__container {
    max-width: 640px;
  }

  &--xl &__container {
    max-width: 800px;
  }

  // Search Section
  &__search {
    position: relative;
    displayt%;	 border-bottom%$}

  &__search-iconf3
$icon-navigation;
    $!icon-navigation;
    margin-right!&w0Rlex-shrink: 0;
  }

  &__input {
    flex: 1;
    padding: 0;
    border: none;
  a'%,input]<input<input>input, line-height)q0primary;

    &::placeholder 0tertiary;
    }

    &:focus {
      outline: none;
    }

    // Remove search input styling
    &::-webkit-search-cancel-button,
    &::-webkit-search-decoration {
      -webkit-appearance: none;
    }

    &[type="search"] {
      -webkit-appearance:  textfield;
    }
  }

  &__clearf3
$minimum;
    $minimum;
    padding: 07^",~"@o'u0Kf*lg&!bold;

    &:hover/hjS}

  // Results Section
  &__results {
    max-height: 400px;
    overflow-y: auto; -0;)	k
    // Custom scrollbar
    &::-webkit-scrollbar {
      width: 8px;
    }

    &::-webkit-scrollbar-track/-!}

    &::-webkit-scrollbar-thumb/%0secondary;
  O/
      &:hover {
     0Z    }
    }
  }

  // Group styling
  &__group {
    &:not(:first-child) {
      margin-to  padding-to%    border-top%}
  }

  &__group-headerfZNFmargin-bottom!@!}

  &__group-iconf3
$icon-inline;
    $icon-inlineq0<tertiary;
  }

  &__group-title {
    flex: 1;
    margin: 0!0labe\=labe=labeQ#?label, line-height)q0Ntext-transform: uppercase;
    letter-spacing: 0.05em;
  }

  &__group-count {`/caption]<caption<caption>caption, line-height)q0	tertiary;8padding: 2px@!^"'full;
    min-width: 20px;
    text-align: center;
  }

  // Empty state
  &__empty {
    display: flex;
    flex-direction: column
;	 ?layout-section-md;
    text-align: center;
  }

  &__empty-iconf3
0width: 48px;
    height: 48px;
    margin-bottom!w0
tertiary;
)"}

  &__empty-text {
    margin: 0!1oo+o/	1o-u0}

  // Footer
  &__footerfTlg; *sm%
border-top%3
}

  &__footer-sectionf\
  &__footer-kbd:
1min-width: 24px;
    height: 20px;
    padding: 0@!$
BS/'*caption]<caption<caption>caption, line-height)q0'"1;
  }

  &__footer-section span {`/caption]<caption<caption>caption, line-height)q0%tertiary;
  }

  // Responsive design!calc(#{
md} - 1px)"-mdD
    &__container {
      max-width: none;
    }

    &__search {
   )H  }

    &__results {
      max-height: 300px;
    }

    &__footer {
   P!#}
  }
!calc(#{} - 1px)"-
    &__footer-section:not(:first-child) {
      display: none; // Hide extra keyboard hints on mobile
    }
  }

  // Reduce motion for users who prefer i9&2f&__backdrop,
    &__container {
      animation: none !important;
    }

    &--entering &__backdrop {"-backdrop;
    }

    &--entering &__containernone;
      opacity: 1;
    }
  }
}

// Animations
@keyframes backdropEnter {
  from {
    opacity: 0;
  }
  to {
    opacity: 4backdrop;
  }
}

@keyframes backdropExit {
  from {
Nbackdrop;
  }
  to {
    opacity: 0;
  }
}

@keyframes containerEnter {
  from! -20px);
    opacity: 0;
  }
  to!4opacity: 1;
  }
}

@keyframes containerExit {
  from!opacity: 1;
  }
  to!-10px);
    opacity: 0;
  }
}SRM{xLL@use "6-" as *;

.ui-color-picker {
  display: flex;
O3#*	family);
aE *	weight);
I	 
  &__label {
    display: blockO'form-field-gap;/}

  &__required {danger5}

 UQ!."s$0@primary?-md:wheel-#(8align-self: center;
  }

  &__wheel {
    display: block?-full;
    cursor: crosshairR*  transition: box-shadow>f)"2;
    }
  }

  &__wheel-indicator)width: 12px;
    height: 12px;
    border 0K!fulln#pointer-events: none-!2;
    z-index: 1;
  }

  &__hue-#(:align-self: center;
  }

  &__hue-bar {
    display: block?5cursor: pointerR*  transition: box-shadow>f) 2;
    }
  }

  &__hue-indicator$?-2px;
    width: 12px;
    height: calc(100% + 4px);
    border 0KFpointer-events: none-\2;
    z-index: 1;
  }

  &__preview-container {
    align-self: center;
  }

  &__preview {H32pxDprimary?6+*  cursor: pointer;
  }

  &__hex-containerNQ5'}

  &__hex-label3,#}

  &__hex-input {
    width: 80px!interactive-input-padding-yinteractive-input-padding-xm9>primary?&input-radius;/!M=
(	  border-
`Qfocus;
      box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);
    }

    &:disabled {
  o(container;
   'disabled;
      cursor: not-allowed;
  $(disabled;
    }
  }

  &__description {
,!BSize variants
  &--sm1
body-smallP<
body-small<
body-smallQ>/body-small, line-height);

    .ui-color-picker $H!-"#m!.ui-color-picker__preview {
      width: 32px;
      height: 24px;
    }

    .ui-color-picker__hex-input {
      width: 70px;
B!+)  }

    .ui-color-picker__wheel-indicatoJ8  height: 8px;
    }

    .ui-color-picker__hue-indicatoJ.  height: calc(100% + 4px);
    }
  }

  &--lg1
body-largeP<
body-large<
body-largeQ>/body-large, line-height);

    .ui-color-picker $H!%lg;
  -}

    .ui-color-picker__preview {
      width: 64px;
      height: 40px;
    }

    .ui-color-picker__hex-input {
      width: 90px;A!;.ui-color-picker__wheel-indicator {
      width: 16px;
      height: 16px;
    }

    .ui-color-picker__hue-indicator {
      wnidth: 16px;
      height: calc(100% + 4px);
    }
  }

  // Color variants
  &--primary {
    .ui-color-picker $border-
Eprimary;
    }

    .ui-color-picker__hex-input:focus {
      border-
9primary;
    }
  }

  &--secondary {
    .ui-color-picker $border-
1.ui-color-picker__hex-input:focus {
      border-
9secondary;
    }
  }

  &--success {
    .ui-color-picker $border-
Esuccess;
    }

    .ui-color-picker__hex-input:focus {
      border-
6success;
    }
  }

  &--danger {
    .ui-color-picker $border-
Ddanger;
    }

    .ui-color-picker__hex-input:focus {
      border-
Hdanger;
    }
  }

  // State variants
  &--error {
    .ui-color-picker $border-
`.error;
    }

    .ui-color-picker__label {
  >danger;
    }

    .ui-color-picker__hex-input {
      border-
`error;
    }
  }

  &--disabled%"9disabled;
    pointer-events: none;

    .ui-color-picker $s$container;
      border-
`]}

    .ui-color-picker__wheel,
    .ui-color-picker__hue-bar {
      cursor: not-allowed;
  $1disabled;
    }

    .ui-color-picker__label {
   disabled;
    }X `.ui-color-picker $H!-"#m!
8"H#*
body-smallP<
body-small<
body-smallQ>/body-small, line-height);

    .ui-color-picker $H!%-}

    .ui-color-picker__preview {
      width: 40px;
      height: 28px;
    }

    .ui-color-picker__hex-input {
      width: 75px;
    }
  }

  // High contrast mode
  @media (prefers-contrast: high) {
    .ui-color-picker__wheel,
    .ui-color-picker__hue-bar {
      border-widthQ2;
    }

    .ui-color-picker__wheel-indicator,
    .ui-color-picker__hue-indicator {
      border-width: 3px;
    }
  }

  //#d motionE#1}.ui-color-picker__wheel,
    .ui-color-picker__hue-bar,
    .ui-color-picker__hex-input {
      transition: none;
    }
  }
}Uzx llXWھ_{7Zمx hKW/E`и"&M|$/x  +N FLEWG5YP5"Ɛ&e;\<x4j@use "../../../../../../shared-ui/src/styles/semantic/index" as *;

.ui-transfer-list {
  display: flex;
  align-items: flex-start;
  gap: $semantic-spacing-component-lg;
  width: 100%;
  
  font-family: map-get($semantic-typography-body-medium, font-family);
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-weight: map-get($semantic-typography-body-medium, font-weight);
  line-height: map-get($semantic-typography-body-medium, line-height);
  
  &--sm {
    gap: $semantic-spacing-component-sm;
    
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: map-get($semantic-typography-body-small, font-weight);
    line-height: map-get($semantic-typography-body-small, line-height);
  }
  
  &--lg {
    gap: $semantic-spacing-component-xl;
    
    font-family: map-get($semantic-typography-body-large, font-family);
    font-size: map-get($semantic-typography-body-large, font-size);
    font-weight: map-get($semantic-typography-body-large, font-weight);
    line-height: map-get($semantic-typography-body-large, line-height);
  }
  
  &--disabled {
    opacity: $semantic-opacity-disabled;
    pointer-events: none;
  }

  // Transfer List Panel
  &__panel {
    flex: 1;
    display: flex;
    flex-direction: column;
    background: $semantic-color-surface-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    border-radius: $semantic-border-card-radius;
    box-shadow: $semantic-shadow-elevation-1;
    min-width: 0;

    &--source {
      order: 1;
    }

    &--target {
      order: 3;
    }
  }

  // Panel Header
  &__header {
    padding: $semantic-spacing-component-md;
    border-bottom: $semantic-border-width-1 solid $semantic-color-border-secondary;
    background: $semantic-color-surface-secondary;
    border-radius: $semantic-border-card-radius $semantic-border-card-radius 0 0;
  }

  &__title {
    margin: 0 0 $semantic-spacing-component-sm 0;
    
    font-family: map-get($semantic-typography-heading-h4, font-family);
    font-size: map-get($semantic-typography-heading-h4, font-size);
    font-weight: map-get($semantic-typography-heading-h4, font-weight);
    line-height: map-get($semantic-typography-heading-h4, line-height);
    color: $semantic-color-text-primary;
  }

  // Search
  &__search {
    position: relative;
    margin-bottom: $semantic-spacing-component-sm;
  }

  &__search-icon {
    position: absolute;
    left: $semantic-spacing-interactive-input-padding-x;
    top: 50%;
    transform: translateY(-50%);
    color: $semantic-color-text-tertiary;
    z-index: 1;
  }

  &__search-input {
    width: 100%;
    height: $semantic-sizing-input-height-md;
    padding: $semantic-spacing-interactive-input-padding-y 
             calc($semantic-spacing-interactive-input-padding-x * 3)
             $semantic-spacing-interactive-input-padding-y
             calc($semantic-spacing-interactive-input-padding-x * 2.5);
    box-sizing: border-box;
    
    background: $semantic-color-surface-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    border-radius: $semantic-border-input-radius;
    
    font-family: map-get($semantic-typography-input, font-family);
    font-size: map-get($semantic-typography-input, font-size);
    font-weight: map-get($semantic-typography-input, font-weight);
    line-height: map-get($semantic-typography-input, line-height);
    color: $semantic-color-text-primary;
    
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;

    &::placeholder {
      color: $semantic-color-text-tertiary;
    }

    &:focus {
      outline: none;
      border-color: $semantic-color-border-focus;
      box-shadow: 0 0 0 2px $semantic-color-focus;
    }

    &:disabled {
      background: $semantic-color-surface-secondary;
      color: $semantic-color-text-disabled;
      cursor: not-allowed;
    }
  }

  &__search-clear {
    position: absolute;
    right: $semantic-spacing-interactive-input-padding-x;
    top: 50%;
    transform: translateY(-50%);
    
    width: $semantic-sizing-touch-minimum;
    height: $semantic-sizing-touch-minimum;
    padding: 0;
    
    background: transparent;
    border: none;
    border-radius: $semantic-border-radius-sm;
    
    color: $semantic-color-text-secondary;
    cursor: pointer;
    
    display: flex;
    align-items: center;
    justify-content: center;
    
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;

    &:hover:not(:disabled) {
      background: $semantic-color-surface-secondary;
      color: $semantic-color-text-primary;
    }

    &:focus {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }

    &:disabled {
      color: $semantic-color-text-disabled;
      cursor: not-allowed;
    }
  }

  // Select All
  &__select-all {
    display: flex;
    align-items: center;
    gap: $semantic-spacing-component-xs;
    cursor: pointer;
    
    font-family: map-get($semantic-typography-label, font-family);
    font-size: map-get($semantic-typography-label, font-size);
    font-weight: map-get($semantic-typography-label, font-weight);
    line-height: map-get($semantic-typography-label, line-height);
    color: $semantic-color-text-secondary;

    input[type="checkbox"] {
      margin: 0;
    }

    &:hover {
      color: $semantic-color-text-primary;
    }
  }

  // List Container
  &__list-container {
    flex: 1;
    overflow: hidden;
    display: flex;
    flex-direction: column;
  }

  &__list {
    flex: 1;
    overflow-y: auto;
    padding: $semantic-spacing-component-xs;
    min-height: 200px;
    max-height: 400px;

    &:focus {
      outline: 2px solid $semantic-color-focus;
      outline-offset: -2px;
    }
  }

  // List Items
  &__item {
    display: flex;
    align-items: center;
    gap: $semantic-spacing-component-xs;
    padding: $semantic-spacing-component-sm;
    margin-bottom: $semantic-spacing-component-xs;
    
    background: $semantic-color-surface-primary;
    border: $semantic-border-width-1 solid transparent;
    border-radius: $semantic-border-radius-sm;
    
    cursor: pointer;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;

    &:last-child {
      margin-bottom: 0;
    }

    &:hover:not(&--disabled) {
      background: $semantic-color-surface-secondary;
      border-color: $semantic-color-border-secondary;
    }

    &:focus {
      outline: 2px solid $semantic-color-focus;
      outline-offset: -2px;
    }

    &--selected {
      background: $semantic-color-surface-elevated;
      border-color: $semantic-color-primary;
      color: $semantic-color-text-primary;
    }

    &--disabled {
      opacity: $semantic-opacity-disabled;
      cursor: not-allowed;
    }
  }

  &__checkbox {
    margin: 0;
    flex-shrink: 0;
  }

  &__item-label {
    flex: 1;
    min-width: 0;
    word-wrap: break-word;
  }

  &__empty {
    padding: $semantic-spacing-component-lg;
    text-align: center;
    color: $semantic-color-text-tertiary;
    
    font-family: map-get($semantic-typography-caption, font-family);
    font-size: map-get($semantic-typography-caption, font-size);
    font-weight: map-get($semantic-typography-caption, font-weight);
    line-height: map-get($semantic-typography-caption, line-height);
  }

  // Controls
  &__controls {
    order: 2;
    display: flex;
    flex-direction: column;
    gap: $semantic-spacing-component-sm;
    align-items: center;
    justify-content: center;
    padding: $semantic-spacing-component-md 0;
    flex-shrink: 0;
  }

  &__control-btn {
    width: $semantic-sizing-button-height-md;
    height: $semantic-sizing-button-height-md;
    padding: 0;
    
    background: $semantic-color-primary;
    border: $semantic-border-width-1 solid $semantic-color-primary;
    border-radius: $semantic-border-button-radius;
    
    color: $semantic-color-on-primary;
    cursor: pointer;
    
    display: flex;
    align-items: center;
    justify-content: center;
    
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    box-shadow: $semantic-shadow-button-rest;

    &:hover:not(:disabled) {
      box-shadow: $semantic-shadow-button-hover;
      transform: translateY(-1px);
    }

    &:focus {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }

    &:active:not(:disabled) {
      transform: translateY(0);
      box-shadow: $semantic-shadow-button-rest;
    }

    &:disabled {
      background: $semantic-color-surface-secondary;
      border-color: $semantic-color-border-secondary;
      color: $semantic-color-text-disabled;
      cursor: not-allowed;
      box-shadow: none;
    }
  }

  // Footer
  &__footer {
    padding: $semantic-spacing-component-sm $semantic-spacing-component-md;
    border-top: $semantic-border-width-1 solid $semantic-color-border-secondary;
    background: $semantic-color-surface-secondary;
    
    font-family: map-get($semantic-typography-caption, font-family);
    font-size: map-get($semantic-typography-caption, font-size);
    font-weight: map-get($semantic-typography-caption, font-weight);
    line-height: map-get($semantic-typography-caption, line-height);
    color: $semantic-color-text-secondary;
    
    text-align: center;
  }

  // Size Variants
  &--sm {
    .ui-transfer-list__panel {
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
    }

    .ui-transfer-list__header {
      padding: $semantic-spacing-component-sm;
    }

    .ui-transfer-list__title {
      font-family: map-get($semantic-typography-heading-h5, font-family);
      font-size: map-get($semantic-typography-heading-h5, font-size);
      font-weight: map-get($semantic-typography-heading-h5, font-weight);
      line-height: map-get($semantic-typography-heading-h5, line-height);
    }

    .ui-transfer-list__search-input {
      height: $semantic-sizing-input-height-sm;
    }

    .ui-transfer-list__item {
      padding: $semantic-spacing-component-xs;
    }

    .ui-transfer-list__control-btn {
      width: $semantic-sizing-button-height-sm;
      height: $semantic-sizing-button-height-sm;
    }

    .ui-transfer-list__footer {
      padding: $semantic-spacing-component-xs $semantic-spacing-component-sm;
    }
  }

  &--lg {
    .ui-transfer-list__panel {
      font-family: map-get($semantic-typography-body-large, font-family);
      font-size: map-get($semantic-typography-body-large, font-size);
      font-weight: map-get($semantic-typography-body-large, font-weight);
      line-height: map-get($semantic-typography-body-large, line-height);
    }

    .ui-transfer-list__header {
      padding: $semantic-spacing-component-lg;
    }

    .ui-transfer-list__title {
      font-family: map-get($semantic-typography-heading-h3, font-family);
      font-size: map-get($semantic-typography-heading-h3, font-size);
      font-weight: map-get($semantic-typography-heading-h3, font-weight);
      line-height: map-get($semantic-typography-heading-h3, line-height);
    }

    .ui-transfer-list__search-input {
      height: $semantic-sizing-input-height-lg;
    }

    .ui-transfer-list__item {
      padding: $semantic-spacing-component-md;
    }

    .ui-transfer-list__control-btn {
      width: $semantic-sizing-button-height-lg;
      height: $semantic-sizing-button-height-lg;
    }

    .ui-transfer-list__footer {
      padding: $semantic-spacing-component-md $semantic-spacing-component-lg;
    }
  }

  // Responsive Design
  @media (max-width: 768px) {
    flex-direction: column;
    gap: $semantic-spacing-component-md;

    .ui-transfer-list__controls {
      order: 2;
      flex-direction: row;
      padding: $semantic-spacing-component-sm;
    }

    .ui-transfer-list__panel {
      &--source {
        order: 1;
      }

      &--target {
        order: 3;
      }
    }

    .ui-transfer-list__list {
      max-height: 300px;
    }
  }

  @media (max-width: 480px) {
    gap: $semantic-spacing-component-sm;

    .ui-transfer-list__header {
      padding: $semantic-spacing-component-sm;
    }

    .ui-transfer-list__title {
      font-family: map-get($semantic-typography-heading-h5, font-family);
      font-size: map-get($semantic-typography-heading-h5, font-size);
      font-weight: map-get($semantic-typography-heading-h5, font-weight);
      line-height: map-get($semantic-typography-heading-h5, line-height);
    }

    .ui-transfer-list__search-input {
      height: $semantic-sizing-input-height-sm;
      padding: $semantic-spacing-interactive-input-padding-y 
               calc($semantic-spacing-interactive-input-padding-x * 2.5)
               $semantic-spacing-interactive-input-padding-y
               calc($semantic-spacing-interactive-input-padding-x * 2);
      box-sizing: border-box;
    }

    .ui-transfer-list__item {
      padding: $semantic-spacing-component-xs;
    }

    .ui-transfer-list__control-btn {
      width: $semantic-sizing-button-height-sm;
      height: $semantic-sizing-button-height-sm;
    }

    .ui-transfer-list__list {
      max-height: 250px;
      min-height: 150px;
    }
  }
} 8#xWo[EWY$N84NRZ&TFT!$~cg[̛,(|J )wpBT7$*ʁN$THXV2̷ŷ窜tz2P:kܢ͑"MC8U+[bbE+*YC!1$F-fX-L>NMgIz4^!&#Ac$:Z;QHY"E*tXqad1לC_!ÝB껸h1KZ&j[*)PU(OPD"R6lAxp8Dl&H/$EVk)@y˔(DלH-..9ur +!np*^aC2ʪG5L"U˨#{r=.C8438gbaywVfj+|A(7-,ufz7aJG,|N֬N`]2t0&wvlxn:r7Wt:Ʀ ;A/T8$W|-sUA>T)`Rrb0aHI-\hp*t\44B \l6xd^%1E^Ic\aqQ-ܫsȤJqx\b$Ҙ.4>'3%3̇ǡҿjL;>G.>#!RÛeTjCJe/,jaC2|ٷ8KB@=kIɱIj*X3dn`EZ3ި"2B3u2]buI
h媱ET2b*|nl|-s$h<WY[(zŌ}u6'
X%%3K4`ަ~L=sGd9{*_kW	OWS{o~5Mvy_3E#點(CN'|"n;u2P R/EPh8~8wGV-iY=I1E<-NoUWo>f2=m7Q|ƚkc\Wf[XIl\T	jבX;=?#SG4n'C:'f h{3z5Wh:@gTXro'pI?k ַ;>۝5kMź(%ށ3
%`bMΌCmAyU=nQm}ǜ	v?[2	D|N;̑~)vݮ y5*o8<nk'=V1Erq^WÐ蕽7wcWPv%̡1S|F4^M~yvg{k-Qgf2<l?8SY{YqsLѼf[P|w%J=1mц|wAKl_L6yxtPve3r90S:{Re`ӻQwhO3\Z2;zQJpC[?DcF($9&H"]&)gIYa4PX?jVj+9wLQ3|-c{f nx#ig@use '	2' as *;

.demo-container {
Mlayout-section-md;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
u	#layout-section-lg;

  h3 {
&7+(1	+*1	,3\,y$w	!-layout-section-sm;
  }
}

.demo-subsection {
u	#layout-section-md;

  h4 {
&7.u	-md;
  }
}

.demo-row {
A!md;
  flex-wrap: wrapg
  &--center { }
}

.demo-item {
0A!sm;
}

.demo-trigger-button {
'"%'SOborder: none;
3+uttonButton2ButtonwDuttoncursor: pointer;
O  min--'md;

  &:hover {
  hover;
  }

  &:focus-visible {
2}

  &:active {
1px);
  }
}

.demo-position-container {
  display: grid;
  grid-template-areas: 
    ". top ."
    "left center right"
    ". b
ottom .";
?#+layout-section-md;
0` radius-lg;
)#"ubtle;
}

.demo-position-button {
'/0pS'#` radius-md;
  cursor: pointer;
O  min-width: 80px;
+utton-small;utton-small9;utton+utton-small, line-height);

  &--top {
    grid-area: top;
  }

  &--bottom {
    grid-area: bottom;
  }

  &--left {
    grid-Earea: left;
  }

  &--right {
    grid-area: right;
  }

  &:hover {
(%a!}

  &:focus-visible {
2}
}

.demo-context-area {
-0p'#ubtle;
^"radius-md;
u	-md;
  min-height: 120px;
]	cursor: pointer;

  p {4*@	1, ntent-paragraph 04[  }

  img {
    max-width: 200px;
    height: auto;
    display: block;
    margin: 0 auto/ auto 3}

  &:hover {
(%}
}

.demo-hint {2O-@8/S;font-style: italic;
}

.demo-editor {
  min-height: 120px;
'md;
0p'#` Scursor: text;

  &:focus {
2}

  p'ntent-paragraph 04!  }

  strong {
    font-weight: font-weight-bold;
  }

  em {
    font-style: italic;
  }

  u {
    text-decoration: underline;
  }
}

.demo-table {
  width: #100%;
  border-collapse: collapse;
0p` radius-lg;
  overflow: hidden;
]!elevation-1;

  th,
  td {!*"'text-align: leftLubtle;4*@	1,
}

  th {
7	'Dfont-weight-semibold;
    position: sticky;
    top: 0;
  }

  td {
A+H}
}

.demo-table-row {
  cursor: pointer;
  transition: background-colorA
&:hover {
(}

  &--selected {
 	O
    t!Ok	k&:last-child td {
    border-bottom: none;
  }
}

.demo-table-action {
  background: none;
  border: none;
Q  font-size: !font-size-lg;
  cursor: pointer;
'P` P
&:hover {
(	,&:focus-visible {
2#}

  .demo-table-row--selected & {
AO
    &:hover8rgba(255, 255, 255, 0.1);
    }
  }
}

.demo-controls {
0A!md;
-0` radius-lg;
)# ubtle;
}

.demo-control-group {
flex-wrap: wrap;
?#md;

  label\/*@	1,_user-select: none5#}
  }
}

.demo-output {
  margin-to1layout-section-md;
-0` radius-lg;
)#ubtle;

  h4 {
&7.*.md 0;
  }
}

.demo-log {
  max-height: 200px;
0p'#ubtle;
^"radius-md;
'-0?// Custom scrollbar styling
  scrollbar-width: thin;
  scrollba!!ubtle$N
  &::-webkit-scrollbar {
    width: 6px;
  }

  &::-webkit-scrollbar-track {
7` "}

  &::-webkit-scrollbar-thumb {
 subtl2
    &:hover%*}
  }
}

.demo-log-entry {
  font-family: font-family-mono;
A*size);
Q%xs 0;
Hubtle;

,border-bottom: none;
  }

  &:first-child {
Asuccess,font-weight-medium;
  }
}

.demo-log-empty {S%md;
  font-style: italic;
}

// Responsive Design
@media (max-width: $semantic-breakpoint-md - 1) {
  .demo-container {
    pad)#layout-section-sm;
  }

  .demo-row.}

  .demo-position-container {!*+g! md;
  }

  .demo-control-group {~.#/J}
}

@media (max-width: $semantic-breakpoint-sm - 1) {
  .demo-container {,;
  }

  .demo-section {&%layout-section-md;
  }

  .demo-row {~.#/}

  .demo-context-area {,D;
    min-height: 100px;
  }

  .demo-editor {
    min-height: 100px +/}

  .demo-table {>-size);

    th,
    tdA(0T)..demo-position-container {
    grid-template-areas: 
      "top"
      "left"
      "center"
      "right"
      "bottom";
    g)';
  }

  .demo-position-button {
    min-width: 60px;
  }
}

// High contrast support
@media (prefers-contrast: high) {
  .demo-trigger-button,
  .demo-position-button,
  .demo-table,
  .demo-context-area,
  .demo-editor,
  .demo-controls,
  .demo-output ,
  .demo-log {
    border-width02;
  }
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
  .demo-trigger-button,
  .demo-position-button,
[  .demo-table-row,
  .demo-table-action,
  .demo-context-area {
    transition: none;
  }
}5Zx 
i3@use '	2' as *;

.demo-container {
Mlayout-section-md;
  max-width: 1200px;
  margin: 0 auto;
}

.demo-section {
u	#layout-section-lg;
  
  h3 {
&7+(1	+*1	,3\,y$w	#ntent-heading;
  }
  
  h4 {
&7.u	%ntent-heading;
  }
  
  p {4*@	1,)$w	#$ntent-paragraph;
  }
}

.demo-row {
flex-wrap: wrap;
?grid-gap-mdg=}

.toast-wrapper {
  flex: 0 0 auto;
}

.controls-section {
u	#&layout-section-md;
}

.button-group {
flex-wrap: wrap;
?#/w	+.lg;
}

.demo-button {
  display: inline-flex;
A"p(0button-padding-y/0button-padding-x;
0p'#1S+uttonButton2ButtonwDuttoncursor: pointer;
O  min--'md;
  
  &:hover {
[!( 1}
  
  &:focus-visible {
2}
  
  &:active {
[!21px);
  }
  
  &--primary {
 	O
    &:hover%%hover;
    }
  }
  
  &--secondary {
!econdary	onPsecondary;
    
    &:hover&econdary;
  #hover;
    }
  }
  
  &--warning {
 warning	on-warning;
"warning;
    
    &:hover%warning;
  "hover;
    }
  }
  
  &--danger {
 dangon-danger;
"danger;
    
    &:hover%
danger;
  >hover;
    }
  }
}

.toast-container {
  position: fixed;
  to1layout-section-md;
7layout-section-md;
  z-index: $semantic-z-index-modal;
0A!/max-width: 400px;
  width: 100%;
  pointer-events: none;
  
  .ui-toast {
    pointer-events: auto;
  }
}

.stats-section {
  margin-to1layout-section-md;
-0'#ubtle;
^-c;
}

.stats-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
?grid-gap-md;
u	-lg;
}

.stat-item {
 justify-content: space-between;
%/0p'#ubtle;
^"radius-sm;
}

.stat-label {S}

.stat-value {-(4Ifont-weight-semibold;
A,S	e}

// Responsive Design
@media (max-width: calc($semantic-breakpoint-md - 1px)) {
  .demo-container {! 'layout-section-sm;
  }
  
  .demo-row {!  
  .toast-container {
    to1layout-section-smlayout-section-sm;
    leftQ(@layout-section-sm;
    max-width: none;
  }
  
  .button-group {!  
  .stats-grid {
    grid-template-columns: 1fr;
  }
}

@media (max-width: calc($semantic-breakpoint-sm - 1px)) {
  .demo-container {! 5layout-section-xs;
  }
  
  .toast-container {
    to1layout-section-xslayout-section-xs;
    leftQ(layout-section-xs;
  }
}.8xi/Halert {
  // Core Structure
_	k
  // Layout & Spacing
'md;
u	3!gap: 16px;
  
  // Visual Design
0'#ubtle;
^-;
]!
  // TypographyS
  // Transitions
O  $"&%/
gap: 12px;)Amd {
    // Default styles already applied above
  }
  
  &--lg {!*+
gap: 20px;4!// Color Variants
  &--primary {
(*-left-width: 4px;
    
    .ui-alert__icon }
  }
  
  &--success {
(=success;
    border-left-width: 4px;
    
    .ui-alert__icon (success;
    }
    
    .ui-alert__title %success;
    }
  }
  
  &--warning {
(=warning;
    border-left-width: 4px;
    
    .ui-alert__icon (warning;
    }
    
    .ui-alert__title $warning;
    }
  }
  
  &--danger {
(<danger;
    border-left-width: 4px;
    
    .ui-alert__icon 'danger;
    }
    
    .ui-alert__title !danger;
    }
  }
  
  &--info {
(:info;
    border-left-width: 4px;
    
    .ui-alert__icon %info;
    }
    
    .ui-alert__title 0info;
    }
  }
  
  // BEM Elements
  &__icon {	$font-size: 1.25rem; // Increased from $semantic-sizing-icon-inline for better visibility
    margin-top: 2px; // Slight optical alignment
  }
  
  &__content0!! // Prevents flex overflow
  }
  2ntent-line-tight 0;
&7.$  
    &--bold {
      font-weight: ?font-weight-semibold;
    }
  }
  
  &__message {
    margin: 0	"#  }
  
  &__actions {
    margin-to1/g!P$flex-wrap: wrap;
  }
  
  &__dismissto1'-
P/	^
7&-&/,}min-!Umin-,U
    &:hover-!Z$}
    
    &:focus-visible|T    
    &:active-pH}
  }
  
  // State Variants
  &--dismissible {
    padding-right: calc(alg +o	);
  }
  *.-$semantic-breakpoint-sm - 1) {!*/g!&--lgA(.-

    
    &?+:?%    
    &__message {
  .^$	/L%*^$	%7^$	%,^$6}
    
    &--dismissible {
      padding-right: calc(-+o);
    }
  }
}W\{1xVKo[EVm4u'8獝"(Z	D*TU%jƾc{$X[#nYQ`	%
K;3a_ǩ"=o|s7Su\r?NH@^#hT܆`qx<5	RܺJ66P	.1nЦpIڴZ>J-vv.@px;k53i(Μa=Cwf-kf2Lg喩\մvwS;6?M5.8qydi	ǋ?CRg6ɳ㑝](wXlUC^cU]M9QImi}-c^QYrHhd0NCMHM.UEgUW\yX&< d$:6VF'J0S-1h,w!'!v@*Ab=b5kL^G/Nk)
p)nV*8\g	tݑvvmr]gc<O`~;7eg*Yt+rWܖMqY*vu^Ĳq!Zš)FjS*!sPLerM%5R!U:g.NzL^57z<lqPgxj'2θ=R@-J]W,6GSnQnM9@TJq21o<kDsp/>
[Sh
З\|i!w{j](Cv΅>QT^ZsQPL|g=0Fv]#lJbI%	\P eɹ~t5v-)pűYWyؖH&ڿ_9^FEt*q} k%:EhNT7׎Tt22ІkUu`!R[eu-TzF{T0_V-ZZc®RIk3#W$uBՄ05<XhʔA|CB\yBrg$xN>˨>~}%칈[ HɎªEɌɺJme|PglC%y;t_puyfxdvTx7 Obðub ۀ{hn 
s#p#
OOuzՕǞeXS^]2bͪ6ԫ{sy<UaABK>>ݦ瑉م;˲DrѰMvr1A
%Kd:(e5KI\mE"2M׿yFr&x i,Iag-input {
flex-wrap: wrap;
_	
  // Layout & Spacing
p/0;
?$p(min-,&md;
  
  // Visual Design
0p'#` 
  // Typography-X3X@3X*,
  // Transitions
  transition: border-color<,
              box-shadow>  $"min-,&sm 3g!P  
    .ui-tag-input__input$-G  }
  
  &--md {
    // Already defined above
  }
  
  &--lg {
    min-,.'a//   
    .ui-tag-input__input {
  3)*  }
  
  // Style Variants
  &--outlined {(}
  
  &--filled {
7`"subtle;
  }
  
  // State Variants>5pointer-events: none;
    
    .ui-tag-input__input { ,}
  }
  
  &--error {
) error;
    
    &:focus-within {,errorQ"
rgba($semantic-color-danger, 0.2);
    }
  }
  
  // Interactive States
  &:not(.ui-tag-input--disabled) {
    &:hover {
      0}
    
    &:focus-within {%W"
Nrgba($semantic-color-focus, 0.2);
    }
  }
  
  // Tags Container
  &__tags {
wrap: wrapHflex:  &  }
  
  // Input Element
  &__input {0outline: none;
    flex: 1;
    min-width: 120px	margin: 0	-/H    c  
  // Tag Item (using existing chip component)
  &__tag {
    .ui-chip {
      margin: 0;
    }
  }
  
  // Max Tags Reached Indicator
  &--max-reached {
    .ui-tag-input__input {
      display: none;
    }
  }
  
  // Focus Management
  &__focus-trapKopacity: 0;
    pointer-events: none;
    top: -1px;
    left: -1px;
  }
  *./7px) {
    .ui-tag-input__input {
      min-width: 80px;
    }
  }
}

// Error Message
.ui-tag-input-error {
  margin-top: $sem8Sdanger;-^$	/(^$	@3^$	*^$0}

// Help Text
.ui-tag-input-help {
  margin-to1%S,^$	/(^$	@3^$	*^$}i!HVx
iL@use '/' as *;

.ui-command-palette {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: $semantic-z-index-modal;
  display: noneg}layout-section-lg/-md;

  &--open,
  &--entering,
  &--leaving {}

  &__backdrop2top: 0;
    left: 0;
    right: 0;
    bottom: 0;
 6backdrop;
    opacity: 0;
    animation: backdropEnternormalF forwards;
  }

  &--leaving &__backdrop {
    animation: backdropExitnormal forwards;
  }

  &__containerX	
max-width: 640px;
(pKsubtl.lg;
[!!modal;
    overflow: hidden420px);
    opacity: 0;
    animation: containerEnternormalNspring forwards;
  }

  &--leaving &__container {
    animation: containerExitnormal forwards;
  }

  // Size variants
  &--md &__container {
    max-width: 480px;
  }

  &--lg &__container {
    max-width: 640pMx;
  }

  &--xl &__container {
    max-width: 800px;
  }

  // Search SectionL	+,'"?ubtle;
(p}

  &__search-icon3}(icon-navigation
 con-navigation;
    margin--
/	$input0*X0/p}

    // Remove search input styling
    &::-webkit-search-cancel-button,
    &::-webkit-search-decoration {
      -webkit-appOearance: none;
    }

    &[type="search"] {
      -webkit-appearance: textfielclear3}(UOmargin-leftQ(&A	$7oM    font-size: font-size-lgfont-weight-bold;

    &:hover=n-visible|T>  }

  // Results Section
  &__results {
    max-height: 400px
C 0;
(p	k
    // Custom scrollbar
    &::-webkit-scrollbar {
      width: 8px;
    }

    &::-webkit-scrollbar-track-!}	:-webkit-scrollbar-thumb%s"radius-sm;

      &:hover {
  !"X  }
    }
  }

  // Group styling
  &__group {
    &:not(:first-child) {
      margin-to1md;
      padding-to1/"E#ubtle;
    }
  }

  &__group-headerR)mdq	1P}

  &__group-icon3}(icon-inline
 
con-inline	"^
}

  &__group-title0	argin: 0;/$Ntext-transform: uppercase;
    letter-spacing: 0.05em;
  }

  &__group-count {/^$	/֓^
3padding: 2px/P&'full;
    min-width: 20px$Empty state
  &__empty {2}&layout-section-md$&__empty-icon3}width: 48px;
    height: 48pxq	1md	"^
-subtle;
  }

  &__empty-text {
    margin: 0;4*@	1,)q"#M+&%"jubtle;
7}

  &__footer-sectionZ)}

  &__footer-kbd {
    display: inline-#}1min-width: 24px;
    height: 20px;
    padding: 0/P$pKsubtl6*^$	/֓)$_!}

  &__footer-section span {/^$	/֓^
}

  // Responsive d<.)calc(#{$semantic-breakpoint-md} - 1px)) {-.-0	:&__container {
      max-width: none;
    }

    &__searchA(./
&__results/"
    &)]?#-
/)calc(#{$semantic-breakpoint-sm} - 1px)) {!*-0	&__footer-section:not(:first-child) {
      display: none; // Hide extra keyboard hints on mobile
    }
  }

  // Reduce motion for users who prefer it
  @media (prefers-reduced-motion: reduce) {
    &__backdrop,
    &__container {
      animation: none 3!important;
    }

    &--entering &__backdrop {
  backdrop;
    }

    &--entering &__container {
      transform: none;
      opacity: 1;
    }
  }
}

// Animations
@keyframes 1backdropEnter {
  from {
    opacity: 0;
  }
  to"1backdrop;
  }
}

@keyframes backdropExit {
  from"Pbackdrop;
  }
  to {
    opacity: 0;
  }
}

@keyframes containerEnter {
  from {
!20px);
    opacity: 0;
  }
  to {
>0);
    opacity: 1;
  }
}

@keyframes containerExit {
  from {
0);
    opacity: 1;
  }
  to {
10px);
    opacity: 0;
  }
}X`\x|iO@use '/4' as *;

.ui-floating-toolbar {
  // Core Structure
	k
A"p(opacity: 0;

8px);
O  z-index: $semantic-z-index-overlay;
  pointer-events: none;
  will-change: opacity, transform;
  
  // Visual Design
  backgr0p'#` radius-lg;
]!elevation-3;
  
  // TypographyS$"&-g!P$md {!*/g'}
  
  &--lg {,a'md;4!// Variant Styles
  &--default {
(pa!$elevation-2;
  }
  
  &--elevated {
( $elevation-4;
  }
  
  &--floating {
7`(subtle;
    backdrop-filter: blur(8px);
[!!"elevation-3;
  }
  
  &--compact {!,T)%g!P!&// Context Variants
  &--contextual {
 	O6}
  
  // State Variants
  &--visible {
    opacity: 1C0);
    pointer-events: auto;
  }
  
  &--entering {
    opacity: 0*8px);
  }
  
  &--leaving {
    opacity: 08px);
    transition-duration:`"  
  // Content Areas
  &__actionsZ'}
  
  &__action {
    display: inline-#}/NR)'O 	'-utton-small0(buttonCuttonEutton&7oM    min--'/40white-space: nowrap;
    user-select: none;
    H}
    !%$pressed $1px);
    }
    
    &:focus-visible|T    
    &--disabled,D  pointer-events: none;
    }
    
    // Contextual toolbar button styles
    .ui-floating-toolbar--contextual & {
      colorO  
  #*  background: rgba(255, 255, 255, 0.1);
  ?O  }
      
  !$Y  background: rgba(255, 255, 255, 0.2);
      }
    }
    
    // Icon styling
    i {
  )font-size-sm*1;
    }
  }
  
  &__action-label {
    display: none;
    
    &--visible {
      display: inline;
    }
    
    // Show labels on small screens or when no icon
    @media (max-width: $semantic-breakpoint-sm - 1) {
      display: inline;
    }
  }
  
 # &__shortcut {
    display: inline-#padding: 2px 6px;
7	$font-family: !font-family-mono;
    font-size: font-size-xsfont-weight-medium 5'#ubtle;
    margin-leftQ(&'
    .ui-floating-toolbar--contextual &rgba(255, 255, 255, 0.15);O!rgba(255, 255, 255, 0.2);
  $subtle;
    }
  }
  
  &__divider {
(<
3subtle;
    margin: 0/".ui-floating-toolbar--contextual &4rgba(255, 255, 255, 0.2);
    }
  }
  
  &__label {
A $B  white-space: nowrap;
    
    .ui-floating-toolbar--contextual & O6subtle;
    }
  }
  
  // Position Variants
  &--top {
/8px);
    
    &.ui-floating-toolbar--visible { 0);
    }
  }
  
  &--bottom {
/8px);
    
    &.ui-floating-toolbar--visible { 0);
    }
  }
  
  &--left {
1X(8px);
    
    &.ui-floating-toolbar--visible { X(0);
    }
  }
  
  &--right {
2X(-8px);
    
    &.ui-floating-toolbar--visible { TX(0);
    }
  }
  
  // Animation Variants
  &--slide-fade {
    transition: opacitynormal,
                transformnormal,  }
  
  &--bounce {
    transition: opacity8!spring,
                transform8cspring;
  }
  
  // Interactive States
  &:not(.ui-floating-toolbar--disabled) {
    &:focus-within] &elevation-4,(  }
  *.-$semantic-breakpoint-md - 1) {!,T)%g!&.ui-floating-toolbar--lgA(./?#/
  }
  A.$semantic-breakpoint-sm - 1) {!2g!P&'md5O  
    &__actions {
  =&p(	%    
    &__divider {
      margin: 0/P`}
  }
  
  // Touch-friendly adjustments
  @media (hover: none) and (pointer: coarse) {
    min-,.touch-target;
    
    &__actions {
      min-,U]}
  }
  
  // High contrast mode support
  @media (prefers-contrast: high) {
    border-width0C2;
    box-shadow: none;
    
    &--elevated,
    &--floating {
  #2}
  }
  
  // Reduced motion support
  @media (prefers-reduced-motion: reduce) {
    transition: none;
    
    &--slide-fade,
    &--bounce {
      transition: none;
    }
  }
}

// Backdrop for modal-like behavior when needed
.ui-floating-toolbar-backdMrop {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
Gz-index: calc($semantic-z-index-overlay - 1);
  pointer-events: auto;
}'?FxwFNOtimelinea:^x-width: 600px;
    margin: 0	containerg]: 0 auto;
  }
  
  // Vertical Timeline (Default)
  &--vertical {
    .ui-lp-timeline__line {K!?left: 20px;
      top: 0;
      bottom: 0;
      width: 2px;
  @ 5timeline__items {
  O xP@timeline__item {
    padding-left: 60px/timeline__marker {K!left: 0;
      to
-sm;
      width: 40px;
      height: 40px;
    border-radius: 50%;
  @ primary;
      border: 2px*$  z-index: $semantic-z-index-tooltip/timeline__content {
  @ a3'lg;
  0,  
      &::before {
        content: '';
  L   left: -10px;
        top: 20px;
        width: 0;
        height: 0;
        border: 10px solid transparent;
        border-right-W  }
    }
  }
  
  // Horizontal Timeline
  &--horizontal {
    .ui-lp-timeline__line {K!?left: 0;
      right: 0;
      top: 20px;
      height: 2px;
  @ 5timeline__items {
  4

50px, 1fr)	*5timeline__item {
    padding-top: 60px/timeline__marker {K!left: 50%;
      top2X(-50%);
      width: 40px;
      height: 40px;
    border-radius: 50%;
  @ primary;
      border: 2px*$  z-index: $semantic-z-index-tooltip/timeline__content {
  @ a3'lg;
  0h,  
      &::before {
        content: '';
  L %  left: 50%;
        top: -10px;
    !#lX(-50%);
        width: 0;
        height: 0;
        border: 10px solid transparent;
        border-bottom-i  }
    }
  }
  
  // Status Variants
  &__item {
    &--completed {
      .ui-lp-timeline__marker {
    @ success;
    1"success;
  `/}
      
      .ui-lp-timeline__item-title {
  `"D  }
    }
    
    &--current {
      .ui-lp-timeline__marker {
    @-1/b  box-shadow: 0 0 0 4px rgba(PK, 0.2);
      }
      
      .ui-lp-timeline__content {
        border: 2px`1  }
      
      .ui-lp-timeline__item-title {
  ``E  }
    }
    
    &--upcoming {
      .ui-lp-timeline__marker {
    @ primary;
    1"b1/}
      
      .ui-lp-timeline__item-title {
  `3}
      
      .ui-lp-timelineP)  }
    }
  }
  
  &__dot {
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background: currentColor;
  }
  
  &`__icon {
    width: 20px;
    height: 20px;
    
    svg {
      width: 100%;
      height: 100%qdateo1Pp/^600 5p0`+Usm;
    text-transform: uppercase;
    letter-spacing: 0.05em;
  }
  
  &__item-titleoR: 0 0qsm 0;%|&	!sm;
  }
  
  &__badgeo1Pp/^600 5pDP&sqYsm;
    border-radius: 9999px;
    text-transform: uppercase;
    letter-spacing: 0.05em;NNmediumAmedium<Pmedium>Pmedium~0#&__emptyPsm 0;
    
    p3PmediumO*Pmedium>Pmedium,Pmedium, line-height);^  margin: 0;
    }
  }
  
  // Theme Variants
  &--minimal {
    .ui-lp-timeline__content {
  '    box-shadow: none;
      border: 1px*3  
      &::before {
        display: none;
      }0timeline__marker {
  @ primary;
  0}
  }
  
  &--connected {
    .ui-lp-timeline__line {
      background: linear-gradient(
        to bottom,
        $semantic-c[,
        $semantic-color-secondary
      );
    }
    
    &.ui-lp-timeline--horizontal .ui-lp-timeline__line {
      backgrou.nd: linear-gradient(
        to right,
       O+,
        $semantic-color-secondary
      )Design
8?0--horizontal {
      .ui-lp-timeline__items {
  0
(B #*lg;
      }
    }
    
    &__content {
  )! >--vertical {
      .ui-lp-timeline__line {
        left: 15px;
      }
      
      .ui-lp-timeline__item {
        padding-left: 50px;
      }
      
      .ui-lp-timeline__marker {
        width: 30px;
        height: 30px;
        left: 0;
      }
    }
    
    &--horizontal {
      .ui-lp-timeline__marker {
        width: 30px;
        height: 30px;
        top: 0;
      }
_      
      .ui-lp-timeline__item {
        padding-top: 50px;
      }
    }
    
    &__item-A^O-
v#xs!(166px;
    }
  }
}=FNxF7Ofeature-grida7$primary;Grid%'	4grid-gap-lg;
    
    // Column Variants
    &--auto-
 !300px, 1fr));
    }
    
    &--2-
 	}
    
    &--3-
 #repeat(3, 1fr);
    }
    
    &--4-
 7repeat(4, 1fr);
    }
    
    // Responsive breakdowns`	=	&--4 {
  0
	}
      
      &--3 {
  0
	}0!&--2,
      &--3,
      &--4 {
  0
(}
      qgrid-gap-md{
4cursor: pointer0normal^U%#[B2}
  }
  
  // Minimal Variant
  &--minimal &__itema"  
    &:hover {
  @ 	hover;
  _5&Bordered Variant
  &--bordered &__itema"DprimaryPc1
    &:hover {
  1/}
  }
  
  // Icon StylingNflex-start;
!!W.#?	
    fa-icon,
    i {
"'Hfeature-grid--minimal & {
  '?	Image Styling
  &__image {(?	c image-radius;
    overflow: hidden;
    
    img {
      width: 100%;
      height: 200px;
      object-fit: cover;
      transition: transform?normal^/=feature-grid__item:hover & img {
      transform: scale(1.05)4Q&	!sm;
  }
  
  &__item-titleoRXDmediumAmedium<Pmedium>Pmedium~0O  flex-grow: 1;
  }
  
  // Link Styling
  &__link {
    display: inline-flex;
&	"s;q/button-medium=utton-medium<button-medium>button-medium~+`$text-decoration: none;
    margin-to
sml`-hovn++  
    &:focus-visible {
      outline: 2px`  outline-offset: 2px;
  _$button&__link-icon {
"1transition: transform?4,&.ui-lp-feature-grid__link:hover & {
  !#@X(2px);
    }
  }
  
  // Spacing Variants
  &--tight &__items {!	)grid-gap-md;
  }
  
  &--loose &__items {!	6grid-gap-xl;
  }
  
  // List Layout Variant
  &--list#Q&	!lg;
  }
  
  &--list
`+lg;
    
    .ui-lp-feature-grid__icon {
  0/Jfeature-grid__content {
      flex: 1;
    }
  }
  
  // Animation States
74 (2  	reduce) {/ #@none;
      animation: none;
    }
  }
}

// Animation Keyframes"Q9Y>kxF]Ofooter {
  width: 100%;
&secondary;
) 
  // Dark theme
  &--theme-dark=#inverse-surface;
A'}
  
  // Main Footer Content
  &__maina1}
  
  &__grid { *}
  
  // Brand Section
  &__brand-sectionQ&	)G=x7Logo
  &__logo {(?	#}
  
  &__logo-link,
  &__logo-text'|Btext-decoration: none;
    color: inherit;
    transition: opacity?4<hov	logo-texto:}J3 n 
    .ui-lp-footer--theme-dark &6{
logo-image {
    max-height: 40px;
    width: auto;
    object-fit: contain;
  }
  
  // Newsletter Section
  &__newsletter {
 Q&	!.max-width: 400px;
  }
  
  &__newsletter-titleoR"  
    .ui-lp-footer--theme-dark &6{
ewsletter-[AmediumAmedium<Pmedium>Pmedium~07  
    .ui-lp-footer--theme-dark & {
      color: rgba(, 0.8)qewsletter-formQ&	!&sm;
  }
  
  &__newsletter-input-group&	!smA3 =wewsletter-input {
    flex: 1;*border: 1px*c input-radius;?!`$v*PmediumAmedium, font-size6medium, line-height)^:placeholder%,}
    
    &:focus {
      outline: none;
  1"bfocus;
      box-shadow: 0 0 0 2px rgba($semantic-color-focus, 0.2);
    }
    
    &:invalid {
  1"error/footer--theme-dark & {
  @ inverse-surface;
  1"border-secondary;.  
      &::placeholder {
        color: rgba(5, 0.6);
      }
    }
  }
  
  &__newsletter-button {}
  
  &__newsletter-statusa"
sm]&input-radius;q/Pp/G
    &--success {
      background: rgba($semantic-color-success, 0.1);success;
      border: 1px solid rgba($semantic-color-success, 0.2);
    }
    
    &--error {
      background: rgba($semantic-color-error, 0.1);error;
      border: 1px solid rgba($semantic-color-error, 0.2);
    }
  }
  
  // Social Links
  &__social {
    display: flexQ&	!}
  
  &__social-titleo:^1^*0	J38n"  
    .ui-lp-footer--theme-dark &6{
social-links&	!(flex-wrap: wrap;
  }
  
  &__social-link'|5button-height-mdQbutton-height-m\'button-radius;?!Etext-decoration: nonnE(+	+  
    &:focus-visible {
      outline: 2px focus;
      outline-offset: 2px/footer--theme-dark & {
  @ #inverse-surface;
      color: rgba(#, 0.7);
      
      &:hover {
    @-b]}
    }
  }
  
  &__social-icon {
    font-size: 20px;
  }
  
  // Footer Columns
  &__columnQ&	!}
  
  &__column-titleo:^1^*0	J38n%?	(sm;
    
    .ui-lp-footer--theme-dark &6{
Bcolumn-list {
    list-style: none;
    margin: 0;
    padding: 0;Q&	!Vsm;
  }
  
  &__column-item {
    // No specific styles needed
  }
  
  &__column-link'|&	"s;
    text-decoration: none;
Av*PmediumAmedium<Pmedium>P+medium, line-height);
    transition: color?4<`l$&:focus-visible {
      outline: 2px$focus;
      outline-offset: 2px;
  _$input-radius/)footer--theme-dark & {
      color: rgba(!, 0.8);
      
      &:hover {
  ``\  }
    }
  }
  
  &__link-icon {
    font-size: 16px;
  }
  
  // Footer Bottom
  &__bottoma1Vsm 0;
    background: rgba($semantic-color-inverse-surface, 0.05);
    border-top: 1px*:
    .ui-lp-footer--theme-dark & {
      background: rgba(Sprimary, 0.05);
      border-top-color: rgba($semantic-color-border-secondary, 0.2)qbottom-content {>@*
  text-alignz	copyrighto1Pp/5
    .ui-lp-footer--theme-dark & {
      color: rgba(, 0.7);
    }
  }
  
  // Legal Links
  &__legal-links {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex|&	!/sm;
    flex-wrap: wrap;
  }
  
  &__legal-item'|&	!8sm;
  }
  
  &__legal-link {
    text-decoration: none;
Av*Pp/transition: color?4<`l$&:focus-visible {
      outline: 2px$focus;
      outline-offset: 2px;
  _$input-radius/)footer--theme-dark & {
      color: rgba(!, 0.7);
      
      &:hover {
  ``(  }
    }
  }
  
  &__legal-separator {
AZtertiary;
    user-select: none;
    
    .ui-lp-footer--theme-dark & {
      color: rgba(, 0.5)Design
*	&__grid-
 L50px, 1fr));
    }
    
    &__brand-section {
      grid-column: 1 / -1;
  '?		 //&__main {
  P 0;
    }
    
    &__grid-
LP}
    
    &__newsletter {
      max-width: none;
    }
    
    &__social-linksQ1 9	main {
  P0sm 0;
    }
    
    &__newsletter-input-group {J#}
    
    &__newsletter-button {
      align-self: stretch;
    }
    
    &__bottom-content {
      text-align: center;
    }
    
    &__legal-linksQ,}3voxhF)O
logo-clouda/md 0;
&primary;rsm;
    max-width: 6s}J3 n0(YmediumAmedium<Pmedium>Pmedium~0& Container Layouts
  &__container'|$%"	containerLx!!	container>var(--items-per-row, 5), 1fr	4	repeat(3	/!  	POMarquee Layout
  &__container--marquee {
    overflow: hidden;
    width: 100%;T}
  
  &__marquee {
    width: 100%;
    overflow: hidden;
  }
  
  &__marquee-track&	)Ganimation: marqueeScroll 30s linear infinite;
    width: calc(200% + #{	xl})AMreduce) {
      animation: none;
      width: auto;
      flex-wrap: wrap;
  !}
  }
  
  // Logo Items
1|%c1
gEhover;
    }
    
    a {
  L  text-decoration: none;
      
      &:focus-visible {
        outline: 2px`    outline-offset: 2px;
    _$button-radius;
      }
    }
    
    img {
      max-height: var(--max-height, 80px);
      max-width: 200px;
      width: aut4o;
      height: auto;
      object-fit: contain;
  .normal^;;
    }
    
    // Animation delays for staggered entranced2 bGrayscale Effects
  &--grayscale &__item img,
  &__logo--grayscale {
    filter: grayscale(100%);
)k}
  
  &--hover &__item:hover img,
  &--hover &__item:hover &__logo--grayscale {
    filter: grayscale(0%);# scale(1.05);>adjustments for marquee
  .ui-lp-logo-cloud--marquee &__item {min-width: 180pxACmin-width: 14  A  min-width: 120px;
    }
  }
  
  // Small screen optimizations
84  %sm;
      
      img {
        max-height: 60px;
        max-width: 150px;
      }
    }
    
    &__marquee-track {
      gap:|0 =X img {
      max-height: 50px;
      max-width: 120px;
    }
    
    &__marquee-track {q(!3}
}

// Keyframes
@keyframes marqueeScroll {
  0% { #X(0);
  }
  100% { #X(-50%)"Y(e8gx
UFCOtestimonial-carousela7$primary;!Carousel Container
  &__container |&	!<lg;
  }
  
  &__viewport {
    flex: 1;
    overflow: hidden]5}
  
  &__tracktransition: transform?normal^;
  }
  
  &__slide {
padding: 0q+sm;
  }
  
  // Navigation Buttons
  &__nav'|$(48px;
    height: 48px;
    border: none]&button-radius;?!Ecursor: pointerW, 
    &:hover:not(:disabled) {
  @ 	hover;
  &$!1px);
    }
    
    &:disabled {""disabled;
      cursor: not-allowe!#:focus-visible {
      outline: 2px`  outline-offset: 2px;
    };!(}
  }
  
  // Testimonial Item
  &__itema"height: 100%;Q&	!lg; }
  
  // Card Variant (default)H.}
  
  // Minimal Variant
  &--minimal &__item"%  box-shadow: none;
    border: none;*0lg;
  }
  
  // Quote Variant
  &--quote &__item=ctestimonial-carousel__text l!testimonial-carousel__author-name l"testimonial-carousel__author-title D&__quote-icon {
Nto
'leftp 2rem;eContent!Q&	!}
  
  &__texto1PX  
    .ui-lp-testimonial-carousel--quote & {
      font-style: italic;
      padding-to
	}
  
  // Rating
  &__rating&	"s;
  }
  
  &__star {
"1E6warning;
    
    .ui-lp-testimonial-carousel--quote &  }
  }
  
  // Author
  &__author'|&	!4}
  
  &__avatar {
    width: 48px;
    height: 48px]&"avatar-radius;
    overflow: hidde~ Bimg {
      width: 100%;
      height: 100%;
      object-fit: cov2author-info {
    flex: 1;
  }
  
  &__author-nameo1button-medium=utton-medium<button-medium>button-medium~p |&	"s;
  }
  
  &__verified {
"1E6success;
    
    .ui-lp-testimonial-carousel--quote & wauthor-titleo1Pp/
#}
  
  // Dots Navigation
  &__dots&	!sm;
    margin-to
\}
  
  &__dot {
    width: 12px;
    height: 12px;
    border: none;
    border-radius: 50%;?!cursor: pointer]--active {
  @-'scale(1.2);
    }
    
    &:hover {
  @--+  
    &:focus-visible {
      outline: 2px`  outline-offset: 2pxDesign
*	&__container {q(!+nav {
      width: 40px;
      height: 40px!Binline;
      }$   `/&__container {J%x-&__nav {
      display: none;
    }
    
    &__viewport {
      width: 100%;
    }
    
    &__slide {
      padding: 0;
    }*  %!text3PmediumO*Pmedium>Pmedium,Pmedium9Q" for scroll-based reveal
74 (2 j	}
  }
  
"/reduce) {
    &__track {
      transition: none# !#"none;
      animation: none;
    }"X<z^\xN0Peam-grid {
pgrid {

!grid-gap-lg;
    
    &--cols-2 {
6(300px, 1fr));
      max-width: 800px;
  "cols-3 {
7
80px, 1fr)"cols-4 {
H}
  }
  
  &__member {
 +1U.^O,_transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    &:hover {H)hover[Y(-2px);
    }
  }
  
  &__avatar {
    width: 120px;
    height: 120px;
    margin: 0 auto" auto;
    overflow: hidden;
	border: 3@O*$}
  
  &__info {
    display: flex;
 .
}
  
  &__namV;
  }
  
  &__rol7_8)`>	;
  }
  
  &__bio6N^0"N705rgin 0 0 0 0;
  }
  
  &__social {
    display: flex;
!'	  margin-~!md;
  }
  
  &__social-link {k1width: 40px;
    height: 40,@htext-decoration: none;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
9

    &:hov'`u)F`#7Y(-1px);
    }
    
    &:focus-visible {
      outline,focus-ring;
      outline-offset: 2px;
    }2
}$
!<'lg - 1) {
    &__grid {
      &--cols-4""80px, 1fr))`t#(F!M__grid {&Egrid-gap-md;
      
      &--cols-2,
      &--cols-3,
      &--cols-4"",__member {
  Q.
 &}
    
    &__avatar {
      width: 10	100px;
  n/a#J:__grid {
      &--cols-2,
      &--cols-3,
      &--cols-4"/max-width: 400px;
    __avatar {
      width: 88!&__name3%}
  }
}ǳVx
N3Ohero-split {
pwidth: 100%;
  
  // Min Height Variants
  &--full {
    min-height: 100vh;
  }
  
  &--large {
    min-height: 80vh;
  }
  
  O&--medium {
    min-height: 60vh;
  }
  
  // Background Variants
  &--solid {
 @}
  
  &--gradient {
y '135deg,
 `,
 $);
  }
  
  // Main Wrapper
  &__wrapper {
    display: flex;
    height: 100%;
    min-height: inherit;
  }
  
  // Split Ratio Variants
  &--50-50 &__left,
  &--50-50 &__right {
    flex: 1;
  }
  
  &--60-40 &__left {
    flex: 0 0 60%;
  }
  
  &--60-40 &__right {
    flex: 0 0 40%;
  }
  
  &--40-60 &__left {
    flex: 0 0 40%;
  }
  
  &--40-60 &__right {
    flex: 0 0 60%;
  }
  
  &--70-30 &__left {
    flex: 0 0 70%;
  }
  
  &--70-30 &__right {
    flex: 0 0 30%;
  }
  
  &--30-70 &__left {
    flex: 0 0 30%;
  }
  
  &--30-70 &__right {
    flex: 0 0 70%;
  }
  
  // Left and Right Sections
  &__left,
  &__right {
  n.U*lg;
n}
  
  &__left {
 @"
    .ui-lp-hero-split--gradient &.135deg ` 
 8) &__right {
 1secondary;
    
    .ui-lp-hero-split--gradient &.135deg,
         	, 0.8) ?Content Types
  &__default-content {
    width: 100%;
    max-width: 500px;
  }
  
  &__text-content {
    width: 100%;
    max3-width: 500px;
    
    h1, h2, h3, h4, h5, h6 {
  -p%m  }
    
    p {
   p%ntent-paragraph_5hero-split--gradient & {
      h1, h2, h3, h4, h5, h6"!p"=?1image-content {
    width: 100%;
    height: 100%j2d}
  
  &__img {
    max-width: 100%;
    max-height: 100%;
    height: auto;
    object-fit: cover;
'3;}
  
  &__video-content {
    width: 100%;
    height: 100%j2=}
  
  &__video {
    max-width: 100%;
    max-height: 100%;
'3<}
  
  // Placeholder
  &__placeholder {
    display: flex;
 ?%P}
  
  &__placeholder-icon {
    font-size: $semantic-sizing-icon-navigation * 2l1 md;
  }
  
  &__placeholder-text6R}
  
  // Typography
  &__?1-E1</	1G1CP.'  
    .ui-lp-hero-split--gradient & {
o-}{eL'4paragraph;
    
    .ui-lp-hero-split--gradient & {
o/?'+}
  }
  
  &__actions {
    display: flex;
.
md;
    margin-~p(;
    
    .ui-lp-hero-split--center & {$e5hero-split--right & {
      justify-content: flex-end P(lg - 1) {
    &__left,
    &__right {
  Q.md;
    }
    O!I~@!3~(,/="5i#3F!>--full {
      min-height: 100svh;
    }
    
    &__wrapper {|#}
    
    // Reset flex ratios for mobile
    &__left,
    &__right {
      flex: 1 !important;
      min-height: 50vh;
      U,&__actions {|%&stretchc#H9__left,
    &__right {
      min-height: 40vh;
    }
    O!D
__subtitle/}
  }
}B(Wnxw0,Ofaq {
lsearch {
    max-width: 50u*sm auto;
  }
  
  &__items {
item {
    border-bottom6Tlast-child {
      border-bottom: none;
    }
  }
  
  &__question {
    width: 100%+lgP#P  background: none;
    border: none;
    text-align: left;
    cursor: pointer;Bspace-betweenW&h%-2px;
    }
  }
  
  &__question-text10	>		-rightO.toggle-iconW24px;
    height: 24px>2ransition: transformBflex-shrink: 0;
    
    svg {
      transform: rotate(180deg);
    }
  }
  
  &__item--open &__toggle-icon svg {
    transform6: rotate(0deg);
  }
  
  &__answer {
    max-height: 0transition: max-heightnormal!}
  
  &__item--open &__answer {
    max-height: 500px; // Adjust based on content needs
  }
  
  &__answer-content {
    padding: 0P lgP#8Theme Variants
  &--bordered {
    .ui-lp-faq__item {
  935]  
      &:last-child {
        margin-bottom: 0;
      }
    }
    
    .ui-lp-faq__question+;hover;
    }
  }
  
  &--minimal {
    .ui-lp-faq__questione.md 0;
      
    background: none;
    0B  }
    }
    
    .ui-lp-faq__answer-content {
      padding: 0 0P9 0;
    }
    
    .ui-lp-faq__item {
      border-bottom/MJEOquestione.md %7question-text30	;
!answer-content {
      padding: 0 P %}
  }
}1@zx3$TimageY$display: flex;
  align-items: centerpWrapper for flex layout'	, 0;
  }
  
  // Image Position Variants
  &--image-left &__wrapper {
    flex-direction: row;
  }
  
  &--image-right &__wrapper {
    flex-direction: row-reverse;
  }
  
  // Content Section
  &__content {
    flex: 1;
    min-width: 0; // Prevent flex Qitem from overflowing
    
    .ui-lp-hero-image--left & {
      text-align: leftimage--center & {
  ;bimage--right & {
      text-align: right;
    }
  }
  
  // Media Section
  &__media {
    flex: 1	M  min-width: 0
-]

/(  box-shadow: $semantic-shadow-card-restimage<imageimage--center &__content?image--right &__contentiwrapper {
  /// Mobile image positioning
    &--mobile-above^;&--mobile-below^*H-reverse;
    }
    
    &--mobile-hidden &__media {
      display: noneN$sm;
  ;;}
    
    &__content {
      text-align: center !important9\center !importantJ|C:x}$@use "3" as *;

.demo-section {
h#xl;
  Eo/m1o*O	o3+	]C(text-align: center;
  }
}

.demo-code {
l&elevated;
  border-width-1 solid $semantic-color-border-subtle;
1O

glg;
  font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
  font-size: 14px;
  line-height: 1.5;
?),overflow-x: auto;
  white-space: pre-wrap;
}qy:#xY$!SY
&--animatef7C  overflow: hidden;
  }
  
  // Content Container
  &__content {
  \%  z-index: $semantic-z-index-dropdownB*Alignment Variants
  &--left &__content {
0}
  
  &--center &__content {
    text-align: center;
    margin: 0 auto;
    max-width: 800px;
  }
  
  &--right &__content {
#-gradient &,
    .ui-lp-hero--image#-gradient &,
    .ui-lp-hero--image2	-center
?-righ
1LAnimated Background
  &__animated-bg {
    position: absolute;
    inset: 0;(-4DJ  background-size: 400% 400%;
    animation: gradientShift 15s ease infinite;
    z-index: $semantic-z-index-dropdown - 1;
  }
EDI1( // Use small viewport height for mobile4
0H3

// Keyframes for animated background
@keyframes gradientShift {
  0% {
    background-position: 0% 50%;
  }
  50% {
    backgMround-position: 100% 50%;
  }
  100% {
    background-position: 0% 50%;
  }
}&x]XOSheader {
  position: relative;
  width: 100%;
  z-index: $semantic-z-index-sticky;
,normal1(!Sborder-bottom$*
  // Transparent variant
  &--transparent]transparent;
    border-bottom: 1px solid transparent;
    
    &.ui-lp-header--scrolled {
  !%, 0.95);
      border-bottom";
      backdrop-filter: blur(10px);
      box-shadow: $semantic-shadow-card-rest;
    }
  }
  
  // Sticky positioning
  &--st,icky {
    position: sticky;
    top: 0;
  }[border-bottom"/H
    &.ui-lp-header--transparent {
      &.ui-lp-header--scrolled {
    !895);
        border-bottom"// Content container
  &__content {
    min-height: 64px;
    position: relative;
  }
  
  // Logo Section
  &__logo-section {
CPizheadQP8
:$Desktop Navigation
  &__nav--desktop@P_-+  display: none;!!nav-list@P5!Glg;
  }
  
  &__nav-item {
    position: relative;
  }
  
  &__nav-link@P]&!xs;
,/a&&70$/_VL 
Q>background: transparent;
    border: none;
    cursor: pointer7surface-hover;headQBr'`"hover, 0.1); C	nav-arrow@Pransition: transformaG\.ui-lp-header__nav-link--dropdown[aria-expanded="true"] & {
      transform: rotate(180deg);!!nav-ico?PD!&__nav-badge {
,/
xsa&#Qwarning=border-radius: 9999px;A/' '1;
  }
  
  // Dropdown Menu
  &__dropdown {
    position: absolute;
    top: 100%;
    left: 0;
    min-width: 200px;
    backW9*L 8card-radius;
    box-shadow: $semantic-shadow-dropdown;
,/= 0;
    z-index: $semantic-z-index-dropdown;
    opacity: 1;
K!0);
    animation: dropdownFadeInanormal1((.ui-lp-headQ3w"dropdown-item@P]&',/a&&70$/_b
backgroundaWsurface-hoveheadQBr'`"hover, 0.1)// Actions Section
  &__actionP]&!icta-button {_=display: none#ta-ico?PD!$&__mobile-toggle {
    display: noneY3+}
  }
  
  // Mobile Navigation
  &__nav--mobile {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    width: 100%;
O border-bottom$box-shadow: $semantic-shadow-card-hover;
    z-index: $semantic-z-index-dropdown;
    max-height: calc(100vh - 64px);
    overfklow-y: auto;
    
    &.ui-lp-header--mobile-menu-open & {
      display: block;
      animation: slideDownanormal1(#$headQ3border-bottom";
    }Z2+<  .ui-lp-header--mobile-menu-open & {
        display: blockmobile:,/
Lmd 0;
  }
  
  &__mobile-item {
    &:not(:last-child) {
      border-bottom/&!mobile-link@Ppspace-between;
,/
&7/large	Alarge<large	Clarge, line-height);
    background: transparent;
    border: none;
    width: 100%;
    cursor: pointer;
    transition: backgroundaWsurface-hoveheadQBr'`"hover, 0.1)mobile-submenu<S$headQ`"	, 0.1);!!%mobile-sublink {
    display: block;
,/a&+&u_
backgroundaWsurface-hover;0/headQ %@%)`"hover, 0.1)!0)mobile-cta {
,/

margin-top,!1}
  
  // Mobile Menu Backdrop
  &__backdrop {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;!7f$semantic-opacity-backdrop);
    z-index: $semantic-z-index-overlay - 1;
    animation: backdropFadeInanormal1(!}
  
  // Mobile menu open state
  &--mobile-menu-open {
    .ui-lp-header__nav--mobile {
      display: block;
    }
  }
  
  *?3&,		*{5-weight);
  	.}
    
    &__content {
      min-height: 64px-sm;
    }
  }
}

// Animations
@keyframes dropdownFadeIn {
  from {
    opacity: 0;
K!8px);
  }
  to {
    opacity: 1;
K+0);
  }
}

@keyframes slideDown {
  from {
K"100%);
    opacity: 0;
  }
  to {
Kp0);
    opacity: 1;
  }
}

@keyframes backdropFadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}-u5x*gW28Glg2header {
  text-align: center;3xl;
}

.demo-title!"justify-content91|"
 0;
Q",`%	2Q:`%	2:`%	2@<`%	2 .	}

.demo-title-icon {
	$}

.demo-description {
  margin: 0;
Q"1largeQ;`large?large@Alarge 9
  kbd {
    display: inline-"#  padding: 2px
xs;
    margin: 0 2px;!8>G)+2%.caption/<caption<caption>captionA=F.Exl;
}

.demo-section-title {
|"lg 0;
Q",`%	:+(`%		*`%	*`%	'*M	  padding.
'}

.demo-actions!nG"}

.demo-button!"E!xso*interactive-button-padding-y
interactive-button-padding-xA!+transparent_$Lbackground: transparent;
Q"-"+)text-decoration: none;me	--primary#0p&'r)!darken(#, 10%);
      border-color: darken(, 10%);
    	'button-hover;
    }
  }

  &--secondary$econd#	secondary $	secondaryp)#darken($semantic-color-secondary, 10%);
      border-color: darken($semantic-color-secondary, 10%);
      box-shadow: $semantic 'button-hover;
    }
  }

  &--outline {P.&?r)1
0'secondary;
    	button-hover)config-grid	$-columns: repeat(auto-fit, minmax(200px, 1fr))A%$!
$}

.demo-config-item! 6xs;
}

.demo-label!"E!xs;
Q",labeQ;label:label@<labe/K	;}

.demo-checkbox {
  width: 16px;
  height: 16px;
  accentC}

.demo-input,
.demo-select interactive-input-padding-y
interactive-input-padding-xA!B input-radius
3S"*inputQ:input:input@<input .transition: border-color>none $box-shadow: 0 0 0 2px rgba(, 0.2);
  }
}

.demo-features	$-columns: repeat(auto-fit, minmax(280px, 1fr))A%$}

.demo-feature*$7
E)0
 #M'(D)2;-2px);
  }

  h4 {
    marginqsm 0
xs 0;1%HO;1%/"N+}
}

.demo-feature-icon {
  font-size: 2rem
	}

.demo-stats	$-columns: repeat(auto-fit, minmax(150px, 1fr))A%$}

.demo-stat*$7
E)0
 #}

.demo-stat-value {
Q",`%	2Q:`%	2:`%	2@<`%	2 )!
xs;
}

.demo-stat-label {
Q"1MBtransform: uppercase;
  letter-spacing: 0.05em;
}

.demo-shortcuts	$-columns: repeat(auto-fit, minmax(250px, 1fr)) )}

.demo-shortcut!" L-E!F/	$	
  span/%1"
kbd {
  display: inline-flex;
"Hjustify-content: center;
  min-width: 28px;
  height: 28px;
  padding: 0
xs
(	NiS"*captionQ:caption:caption@<caption .(O  white-space: nowrap;
}

// Toast animation styles
@keyframes slideIn {
  from!X(100%);
    opacity: 0;
  }
  to9X(0);
    opacity: 1;
  }
}

@keyframes slideOut {
  fromX(0);
    opacity: 1;
  }
  toOX(100%);
    opacity: 0;
  }
}

// Responsive design
@media (max-width: calc(#{p.
md} - 1px).7p}

  .demo-actions$
  .demo-config-grid1#columns: 1fr;
  }

  .demo-features1 columns: 1fr;
  }

  .demo-stats1/columns: repeat(3, 1fr);
  }

  .demo-shortcuts1/columns: 1fr;
  }
}

@media (max-width: calc(#{p.} - 1px).A$}

  .demo-title//DOxs;
    
    .demo-title-icon {
      font-size: 2rem;
    }
  }

  .demo-stats1"columns: 1fr;
  }

  .demo-actions//#align-items: stretch;
  }
}FD&)pxygP2' as *;

.enhanced-table-demo .  max-width: 1400px;
  margin: 0 auto;
  
  h2/%:2/<`%	2<`%	2G2ACheading;
  }
  
  h3/%::+heading;
  }
  *%W%'
  }
  
  p/%1"N%(;
  }
}

// Demo Controls
.demo-controls	$-columns: repeat(auto-fit, minmax(200px, 1fr))Agrid-gap-lg;3	!
$*0E!F"card-radius.!h3 {>2large/D!
'Q+}
  !dD!
'C,%;%%"U)##$accent}
    
    select {
    q**0$K($input-radius;)#
Q-AG.  
      &:focus {
        outline: none;
    "    box-shadow: 0 0 0 2px rgba(", 0.2);
      }
    }
  }
  
  p {>2M	S%tertiary;
    margin: 0;
  }
}

.demo
3n#E!7 L
%S"+"+)eCParginq!xs;
  
  &:hover:not(:disabled) {A"button-hover;
  }
  n`  
  &--secondary+p&?  
    &:hover:not(:disabled)~)%
	  }
  }
  
  &--small@,0'G( 	0}
}

// Performance Metrics
.performance-metrics9Y$'-
	-input-radius;
  border-left: 4info;
}

.metrics-grid	$-columns: repeat(auto-fit, minmax(150px, 1fr)) )
}

.metric! 6xs;
  
  .metric-label {>2M	SN}
  
  .metric-value {>2large/U(}
}

// Table Container
.table-container5lg_$card-radius?'2;
}

// Cell Templates
.salary-cell {
<3+ }

.performance-cell!"E%=  width: 100%;
}

.performance-bar {
  flex: 1;
  height: 8px
 8?full;
  overflow: hidden;
}

.performance-fill {
  height: 100%_+full;
  transition: widthnorma
  &.performance-excellent%L+	}
  
  &.performance-good#$info;
  }
  
  &.performance-average##warning;
  }
  
  &.performance-poo$"danger;
  }
}

.performance-text {aR!Bmedium;
  min-width: 35px;
  text-align: right;
}

.action-buttons!n!xs;
}

.action-bt+0%0dO!medium?O
  &--primary#0p H$  }
  }
  
  &--dang%dangerOon-danger;
     H$
  }
  }
  nW+1px;
  }
}

// State Display
.state-display	$-columns: repeat(auto-fit, minmax(250px, 1fr))Agrid-gap-md;3lg;
}

.state-secti,-
0E!F"input-radius;
  
  h4 {?&
'Q+}
}

.state-content {QO"tertiary;
  o  }
}

.sort-item,
.filter-item*xs 0`FL*'*M  */  
  strong {P"}
}

// Feature Demo
.feature-demo*$Wcard-radius;
  border-left: 4	}

.feature-list	$-columns: repeat(auto-fit, minmax(300px, 1fr))A&grid-gap-lg;
}

.feature-item {
  h4 {>2large, font-size)>'
xsO-
}
  
  p {>2M	SN  margin: 0;
  },, 1200px) {
  .enhanced-table-demo.4  
  .demo-controls1$columns: 1fr;
  }
  
  .feature-list1Acolumns: 1fr;
  }
}

@media (max-width: 768px) {
  .state-display1$columns: 1fr;
  }
  
  .metrics-grid13columns: repeat(2, 1fr);
  }
  
  .performance-cell//DQxs;
    
    .performance-bar {
      width: 100%;
    }
  }
  
  .action-buttons//!}
}

// Print styles
@media print {
  .demo-controls,
  .performance-metrics,
  .state-display,
  .feature-demo {
    display: none !important;
  }
}j{dx@3028G%  
  h21@	2E2<@	2G209H
Bug&I*card-radius;
q
elevation-1  border-bottom'%
	  paddingN}Wlg  
  &--spaced {
    justify-content: space-around;
    
    .demo-example {
      min-width: 200px;
      text-align: center;
    }
  }
}

.demo-example78mdqg&secondp8input-radius;
  min-height: 120px;
  position: relative;{Z: 0 0}/ 0;
    text-align: center;
  }
}

.demo-buttonP P6W12T* 	>44	
  &:hover:not(:disabled)l
4
q:not(:disabled) {t#q
&o7
prim  L(:not(:disabled);&
  }
  }
}

.demo-log {

KecondP'input-radiup 
-md;
  max-height: 300px;
  overflow-y: auto;
%md;
  
  &__emptyCtertiary;
    text-align: center;
    font-style: italic;
    margin: 0;
  }
  
  &__entry {
    display: flex;
    gap: $seman|} 'o  border-bottom'%
[  
    &:last-child {
      border-bottom: none;
    }
  }
  
  &__time {
    font-family: font-family-mono.caption, font-size)Ftertiary;
    flex-shrink: 0;
    min-width: 80px;
  }
  
  &__message6small<
body-smallAsmall>
body-small09}
}

// Responsive d768px7
md5  align-items: stretch;
    
    &--spaced {
      align-items: center;
    }
  }
  
  .demo-example {
    min-height: auto;
   'md;
  }
  
  .demo-section"
vmd;
  }
}

// Ensure positioned FAB menus are visible above demo content
:host {
  position: relative;
  z-index: 1;
}ȦaxgPKbNjD]xs3tKJs'Lg\V\T: cf),i%Dd'_fٜrqr*l<x'oR\3ىKa|v#r99dQpN
Sa h©0NKpOn.M$q	LC1ۃ[97s7>؂ͳM)Zf0w`xUMoEQ&4Np@FQPӊUxwlYvq*DpA?9p'VqAHg`fw퍥TpZ;ok7w2ʧ39]siղy2`Ia!r>=r6S7OS3<V
~?)WϬ7lku>%NT!R5\갶ҥ)$3ߤ,B7[_HbPNmExd\qzjH
ȍf-C.zenZǥ8
XeCT0]I8+Nig|a2KkgX-NO)7k<d-]dG"SځK@k>L4|>Q"ʇɜU:zZZh1.86}k[HH	粓y	E}LP%#(|WڇR(-P	`؎,{/?{ˤG(ٵl4L6Dgm[rNFVDix롩9xfJ1U:<.U%u9g"˥W5b<j6}iZyaݡՋP4= mjgzN7
<

<cVKkgFN콦/±=kt{qA|%dVHRiEՔNjhqWoj2fP&Zg
rrX6S~87v~(4354j1ǡ"*j'Gs,;-(^G_/un1h($LP?oaϹN9m(@']VFfcjuݎS[Okaً\&GSQѲtX#ےXY/WYr i#SA44fR?6Iuƈ)=R*ĵ9"@F&5ڼx`~peH%=mI1Kr݀Jr9^7uFp#~nԈip;,a.,o&4*A+.9樖.n)pÖV5	נ0Z/F]y;ȼ~*ma1U=ZVx|O9@use "//index" as *;

.ui-accordion {
  // Core Structure
  display: flex;
  flex-direction: column;
  position: relative;
  width: 1020%;
  box-sizing: border-box;
  
  // Base styles
0Lsans;
  
  // Default styles (md variant as default)
  .ui-accordion__header,smQ@%#md;
  }
  
  .ui-accordion__content,smQ@%Amd;
  }
  
  // Size variants
  &--sm {
    .ui-accordion__header_!.n',)sm;
    }
    
    .ui-accordion__content_!.n',4sm;
    }
  }
  
  &--md {
    .ui-accordion__header_!0Q@,)md;
    }
    
    .ui-accordion__content_!0Q@,4md;
    }
  }
  
  &--lg {
    .ui-accordion__header_!.mdQlg;
  .)lg;
    }
    
    .ui-accordion__content_!.mdQlg;
  .lg%lstyles!.ui-accordion__item/imary;%&+"w"# )1;
      margin-bottom1"&n  
      &:last-child {
        margin-bottom: 0;
      }
    }
  }
  
  &--outlined {
    .ui-accordion__item/imary;%&0$w"  margin-bottom1"&l  
      &:last-child {
        margin-bottom: 0;
      }
    }
  }
  
  &--filled {
    .ui-accordion__item-n%!n"w"  margin-bottom1"&  
      &:last-child {
        margin-bottom: 0;
      }
    }
  }
  
  // State variants
  &--disabled {
    opacity: 0.38;
 #"VIndividual accordion item
  &__item {
    position: relative;
    overflow: hidden;
  ;easing-standard;
    
    &--expanded {
      .ui-accordion__header {
        .ui-accordion__icon {
          transform: rotateL(180deg);
        }
      }
    }
    
    &--disabled {
      opacity: 0.38#!
      .ui-accordion__header {
  !!7    }
    }
  }
  
  // Header/trigger area
  &__header_3space-between;
    width: 100%5D.#-text-align: left;
  ;easing-standard;
    
#$nFprimaryW-CZ}
    opacity: 0.38%5eader content area
  &__header-content {
    flex: 1;aR// Icon container
  &__icon_3width$icon-inlineicon-inline".transition:w4beasing-standard;
    flex-shrink: 0;
  }
  
  // Content area
  &__content {
    overflow: hidden;1)primary/line-height: line-height-relaxed;
    
    // Animation states
    &--collapsed {
      max-height: 0;
      padding-top: 0;
      padding-b/ottom: 0;
      transition: 
        max-height~ easing-standard,
        padding~easing-standard;
    }
    
    &--expanded {
      max-height: 1000px; // Large enough for most content
      transition: max-height~Teasing-standard;
    }
    
    &--expanding {
      transition: 
        max-height~ easing-standard,
        padding~easing-standard%VContent inner wrapper for proper padding animation
  &__content-inner {
    padding-to#%}
  
  // Multiple expand mode styling
  &--multiple {
    .ui-accordion__item:not(:last-child) {
      border-bottom: $semanti:%JDark mode support
  :host-context(.dark-theme) & {
    .ui-accordion__item-Z(0econdary;
    }
    
    .ui-accordion__header {^06n)  }
    }
    
    .ui-accordion__content-Zc/%
Responsive d >*&--lg {
      .ui-accordion__header {
    )smQ@.6md;
      }
      
      .ui-accordion__content {
    )smQ@.md;
      }!F5&--md,
    &--lg {
      .ui-accordion__header {
    )n'.6sm;
      }
      
      .ui-accordion__content {
    )n'.sm;
      }
    }
  }
}]lxO1@use "//index" as *;

.ui-snackO(position: fixed;
  bottom1" layout-section-md;
  left: 50%;
X(-50%)HVmodal;
  max-width: 90vw;
  width: auto;
  min-width: 300px;
  
  // Layout & Spacing
)Qlg;
	#:Z>secondary;
J)b-4\Transitions-~#&$+%n@7#]6$+md;,Qlg;
  }
  
  &--lg$$+lg;*lg1x:Color Variants
  &--primary@]primary;
  }
  
  &--success@#succes
on-success$success;
  }
  
  &--warning@#warning
on-warning$warning;
  }
  
  &--danger@#danger	on-danger$danger;
  }
  
  &--info@#infoon-info$info;/o!@layout-section-md;
    bottom: auto;
  }
  
  &--left {
    left1"layout-section-md;}
  
  &--right {
    right1""layout-section-md;
    left: auto;}
  
  // Animation States9*X(-50%) translateY(20px);
  }
  
  &--exito.X(-50%) translateY(20px);
  }
  
  // BEM Elements
  &__content {
    flex: 1;
    min-width: 0;
    
    &--multiline {
      h!ntent-line-tight 0Rmessage {
    color: inherit;
    margin: 0;
    overflow-wrap: break-word;
  }
  Rg+$flex-shrink: 0;
  }
  
  &__action {4%#W"'sm>'background-color8
L
    // Use inherited text color with opacity for actions
    color: inherit#-%
    &:hover {
      background-color x :active {
      background-color	dismiss {4%#W"'sm>)color: inherit;a1Ybackground-color8
%
    &:hover {
      background-color x :active {
      background-colorB// Icon styling
  &__icon {
    flex-shrink: 0;
    color: inherit$icon-inline;u Wbottom1"layout-section-sm;
    left1"layout-section-sm;
    right1"layout-section-sm;
<max-width: none;
    
    &--left,
    &--right {
      left1"layout-section-sm;
      right1"layout-section-sm;o0![bottom1"layout-section-xs;
    left1"layout-section-xs;
    right1"layout-section-xs"?1!##}
}:L+xD
O5@use "//index" as *;

.ui-bottom-navigation {
  // Core Structure
  display: flex;
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0Hdropdown'space-around;
  
  // Layout & Spacing
'$-K-top80E	*
  // TransitionsR"$+%#}
  
  &--md$6%$+lg;0bprimary@0top-pc4 
    .ui-bottom-navigation__item\:--active7$}
      
      &:hover:not(&--active.05a}
  
  &--secondary@#secondary;
    border-top-pn&2on-secondary;
    
    .ui-bottom-navigation__item\#!secondary;
      
      &--active7$}
      
      &:hover:not(&--active.05a}
  
  // Elevated variant!& 'C;
  }
  
  // Hidden variant for dynamic showing/hiding
  &--hidden:100%);
  }
  
  // BEM Element - Navigation Item
  &__item_flex-direction: column;
  flex: 1;
    min-width$&$#$%#W"'sm>ext-decoration: none".
    // Typography/captionq<caption<caption>caption0
    // Transitions
  QG  
    // Interactive States
    &:hover:not(&--disabled):not(&--active.Zc8k+&--disabled) {
      transform: scale(0.98)Active State
    &--active%interactive-primary]primary;
  2semiboldDisabled State
    &--:Badge modifier
    &--has-badge {
      position: relative%BEM Element - Icon
  &__icon_3width$icon-navigation"icon-navigation;
    margin-bottom1"ntent-line-tight;q<izing variants
    .ui-bottom-navigation--sm & {
      width$icon-inline;
  Eicon-inline;
    }
    
    .ui-bottom-navigation--lg & {
      width$icon-button;
  icon-button%7BEM Element - Label
  &__label {
    text-align: centeroverflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
    
    // Typography variants by size
    .ui-bottom-navigation--sm & {
  /]F1#0H-  }
    
    .ui-bottom-navigation--lg & {
  /\x/`	size);
  3`.3`%CBEM Element - Badge
  &__badge {
    position: absolute;
    top: -$right: -$	min-width$icon-inlineicon-inline;a16danger	on-dangerQ"-full;
    padding: 0*// Typography/captionq<caption!semibold,0caption0b
    // Hide if no content
    &:empty {
      min-width: 8px;
      height: 8px;
      padding: 0% < 'bottom-navigation__item_!.:xs * 0.5;
    }
    
    .ui-bottom-navigation__label {
  /]F1#0H!5 T// Ensure touch targets remain accessible on tablets
    .ui-bottom-navigation__item$,target;
    }
  }
}E-Sx vvbUBه۷I{k;ܺx## UI Accessibility

A comprehensive Angular accessibility library that enhances your existing components with WCAG 2.1 Level AA compliant features while using semantic tokens from your design system.

## Features

- **🎯 Focus Management** - Advanced focus trapping, restoration, and monitoring
- **⌨️ Keyboard Navigation** - Arrow keys, roving tabindex, custom shortcuts
- **📢 Screen Reader Support** - Live announcements, ARIA enhancements
- **🎨 Design System Integration** - Uses semantic motion, color, and spacing tokens
- **♿ High Contrast & Reduced Motion** - Automatic detection and adaptation
- **🔧 Zero Rewrites Required** - Enhance existing components with directives
- **🧪 Developer Experience** - Debug modes, warnings, and comprehensive logging

## Installation

```bash
npm install ui-accessibility
```

## Quick Start

### 1. Import the Module

```typescript
import { UiAccessibilityModule } from 'ui-accessibility';

@NgModule({
  imports: [
    UiAccessibilityModule.forRoot({
      // Optional configuration
      skipLinks: { enabled: true },
      keyboard: { enableArrowNavigation: true },
      development: { warnings: true }
    })
  ]
})
export class AppModule {}
```

### 2. Import SCSS Utilities

```scss
// Import accessibility utilities (uses your semantic tokens)
@use 'ui-accessibility/src/lib/utilities/a11y-utilities';
```

### 3. Add Skip Links

```html
<!-- Add to your app.component.html -->
<ui-skip-links></ui-skip-links>
```

## Core Features

### Focus Trap Directive

Trap focus within containers like modals and drawers:

```html
<!-- Before: Basic modal -->
<ui-modal [open]="isOpen">
  <h2>Settings</h2>
  <input type="text" placeholder="Name">
  <button>Save</button>
</ui-modal>

<!-- After: Focus-trapped modal -->
<ui-modal [open]="isOpen" uiFocusTrap>
  <h2>Settings</h2>
  <input type="text" placeholder="Name">
  <button>Save</button>
</ui-modal>
```

**Features:**
- Automatic focus on first element
- Tab wrapping within container
- Focus restoration on close
- Uses semantic motion tokens for transitions

### Arrow Navigation Directive

Add keyboard navigation to lists, menus, and grids:

```html
<!-- Before: Basic menu -->
<ui-menu>
  <ui-menu-item>Profile</ui-menu-item>
  <ui-menu-item>Settings</ui-menu-item>
  <ui-menu-item>Logout</ui-menu-item>
</ui-menu>

<!-- After: Keyboard navigable menu -->
<ui-menu uiArrowNavigation="vertical">
  <ui-menu-item tabindex="0">Profile</ui-menu-item>
  <ui-menu-item tabindex="-1">Settings</ui-menu-item>
  <ui-menu-item tabindex="-1">Logout</ui-menu-item>
</ui-menu>
```

**Navigation Options:**
- `vertical` - Up/Down arrows
- `horizontal` - Left/Right arrows  
- `both` - All arrow keys
- `grid` - 2D navigation with column support

### Live Announcer Service

Announce dynamic content changes to screen readers:

```typescript
import { LiveAnnouncerService } from 'ui-accessibility';

constructor(private announcer: LiveAnnouncerService) {}

// Announce with different politeness levels
onItemAdded() {
  this.announcer.announce('Item added to cart', 'polite');
}

onError() {
  this.announcer.announce('Error: Please fix the required fields', 'assertive');
}

// Announce a sequence of messages
onProcessComplete() {
  this.announcer.announceSequence([
    'Processing started',
    'Validating data',
    'Processing complete'
  ], 'polite', 1500);
}
```

### Screen Reader Components

Hide content visually while keeping it accessible:

```html
<!-- Screen reader only text -->
<ui-screen-reader-only>
  Additional context for screen readers
</ui-screen-reader-only>

<!-- Focusable hidden text (becomes visible on focus) -->
<ui-screen-reader-only type="focusable">
  Press Enter to activate
</ui-screen-reader-only>

<!-- Status messages -->
<ui-screen-reader-only type="status" statusType="error" [visible]="hasError">
  Please correct the errors below
</ui-screen-reader-only>
```

### Keyboard Manager Service

Register global and element-specific keyboard shortcuts:

```typescript
import { KeyboardManagerService } from 'ui-accessibility';

constructor(private keyboard: KeyboardManagerService) {}

ngOnInit() {
  // Global shortcut
  this.keyboard.registerGlobalShortcut('save', {
    key: 's',
    ctrlKey: true,
    description: 'Save document',
    handler: () => this.save()
  });

  // Element-specific shortcut
  const element = this.elementRef.nativeElement;
  this.keyboard.registerElementShortcut('close', element, {
    key: 'Escape',
    description: 'Close dialog',
    handler: () => this.close()
  });
}
```

## Design System Integration

All features use semantic tokens from your design system:

### Focus Indicators

```scss
// Automatic integration with your focus tokens
.my-component:focus-visible {
  outline: $semantic-border-focus-width solid $semantic-color-focus;
  box-shadow: $semantic-shadow-input-focus;
  transition: outline-color $semantic-motion-duration-fast;
}
```

### Skip Links Styling

Uses your semantic spacing, colors, and typography:

```scss
.skip-link {
  padding: $semantic-spacing-component-padding-y $semantic-spacing-component-padding-x;
  background: $semantic-color-surface-primary;
  color: $semantic-color-text-primary;
  border-color: $semantic-color-border-focus;
}
```

### Motion & Animations

Respects reduced motion preferences:

```typescript
// Service automatically detects preference
const duration = this.highContrast.getMotionDuration('300ms', '0.01s');

// SCSS utilities adapt automatically
@media (prefers-reduced-motion: reduce) {
  .fade-in-a11y {
    animation-duration: 0.01s;
  }
}
```

## Advanced Configuration

### Full Configuration Example

```typescript
UiAccessibilityModule.forRoot({
  announcer: {
    defaultPoliteness: 'polite',
    defaultDuration: 4000,
    enabled: true
  },
  focusManagement: {
    trapFocus: true,
    restoreFocus: true,
    focusVisibleEnabled: true
  },
  keyboard: {
    enableShortcuts: true,
    enableArrowNavigation: true,
    customShortcuts: [
      { key: '/', ctrlKey: true, description: 'Search' }
    ]
  },
  skipLinks: {
    enabled: true,
    position: 'top',
    links: [
      { href: '#main', text: 'Skip to main content' },
      { href: '#nav', text: 'Skip to navigation' },
      { href: '#search', text: 'Skip to search' }
    ]
  },
  accessibility: {
    respectReducedMotion: true,
    respectHighContrast: true,
    injectAccessibilityStyles: true,
    addBodyClasses: true
  },
  development: {
    warnings: true,
    logging: true
  }
})
```

### High Contrast & Reduced Motion

Automatic detection and CSS class application:

```html
<!-- Body classes added automatically -->
<body class="prefers-reduced-motion prefers-high-contrast">

<!-- Your CSS can respond -->
<style>
.prefers-reduced-motion * {
  animation-duration: 0.01s !important;
}

.prefers-high-contrast .card {
  border: 1px solid ButtonText;
  background: ButtonFace;
}
</style>
```

## Available Directives

| Directive | Purpose | Usage |
|-----------|---------|--------|
| `uiFocusTrap` | Trap focus within container | `<div uiFocusTrap>` |
| `uiArrowNavigation` | Arrow key navigation | `<ul uiArrowNavigation="vertical">` |

## Available Services

| Service | Purpose | Key Methods |
|---------|---------|-------------|
| `LiveAnnouncerService` | Screen reader announcements | `announce()`, `announceSequence()` |
| `FocusMonitorService` | Focus origin tracking | `monitor()`, `focusVia()` |
| `KeyboardManagerService` | Keyboard shortcuts | `registerGlobalShortcut()` |
| `HighContrastService` | Accessibility preferences | `getCurrentPreferences()` |
| `A11yConfigService` | Configuration management | `getConfig()`, `isEnabled()` |

## SCSS Utilities

```scss
// Import specific utilities
@use 'ui-accessibility/src/lib/utilities/focus-visible';
@use 'ui-accessibility/src/lib/utilities/screen-reader';

// Use utility classes
.my-element {
  @extend .focus-ring;        // Adds focus ring on :focus-visible
  @extend .touch-target;      // Ensures minimum touch target size
}

// Screen reader utilities
.sr-instructions {
  @extend .sr-only;           // Visually hidden, screen reader accessible
}

.status-text {
  @extend .sr-only-focusable; // Hidden until focused
}
```

## WCAG 2.1 Compliance

This library helps achieve Level AA compliance:

- ✅ **1.3.1** - Info and Relationships (ARIA attributes)
- ✅ **1.4.3** - Contrast (High contrast mode support)  
- ✅ **1.4.13** - Content on Hover/Focus (Proper focus management)
- ✅ **2.1.1** - Keyboard (Full keyboard navigation)
- ✅ **2.1.2** - No Keyboard Trap (Proper focus trapping)
- ✅ **2.4.1** - Bypass Blocks (Skip links)
- ✅ **2.4.3** - Focus Order (Logical tab sequence)
- ✅ **2.4.7** - Focus Visible (Enhanced focus indicators)
- ✅ **3.2.1** - On Focus (Predictable focus behavior)
- ✅ **4.1.3** - Status Messages (Live announcements)

## Browser Support

- Chrome 88+
- Firefox 85+  
- Safari 14+
- Edge 88+

## Demo

Visit `/accessibility` in your demo application to see interactive examples of all features.

## Contributing

This library integrates seamlessly with your existing component architecture and design system tokens, requiring no rewrites of existing components.P1xa# UI Animations

A comprehensive CSS animation library with Angular services and directives for programmatic control.

## Features

- **Pure CSS animations** - Framework agnostic, works everywhere
- **Angular integration** - Services and directives for programmatic control
- **Comprehensive collection** - Entrance, exit, emphasis, and transition animations
- **Design system integration** - Uses semantic motion tokens for consistent timing and easing
- **Utility classes** - Animation timing, delays, and control utilities
- **SCSS mixins** - Create custom animations easily

## Installation

```bash
npm install ui-animations
```

## Usage

### Import Styles

Add to your global styles or component styles:

```scss
// Complete animation library
@use 'ui-animations/src/styles' as animations;

// Or import specific modules
@use 'ui-animations/src/styles/animations/entrances';
@use 'ui-animations/src/styles/animations/emphasis';
@use 'ui-animations/src/styles/utilities/animation-utilities';
```

### CSS Classes

Simply add animation classes to your HTML elements:

```html
<!-- Entrance animations -->
<div class="animate-fade-in">Fade in animation</div>
<div class="animate-slide-in-up animation-delay-200">Delayed slide up</div>

<!-- Emphasis animations -->
<button class="animate-bounce">Bouncing button</button>
<div class="animate-pulse animation-infinite">Pulsing element</div>

<!-- Exit animations -->
<div class="animate-fade-out">Fade out animation</div>
```

### Angular Service

```typescript
import { UiAnimationsService } from 'ui-animations';

constructor(private animationService: UiAnimationsService) {}

// Animate an element
animateElement() {
  const element = document.getElementById('my-element');
  this.animationService.animateOnce(element, 'animate-bounce');
}

// Animate with callback
animateWithCallback() {
  const element = document.getElementById('my-element');
  this.animationService.animate(element, 'animate-fade-out', () => {
    console.log('Animation completed!');
  });
}
```

### Angular Directive

```typescript
import { AnimateDirective } from 'ui-animations';

@Component({
  imports: [AnimateDirective]
})
```

```html
<!-- Immediate animation -->
<div uiAnimate="animate-fade-in-up">Auto animates on load</div>

<!-- Hover trigger -->
<div uiAnimate="animate-bounce" [animationTrigger]="'hover'">
  Hover to animate
</div>

<!-- Click trigger with single use -->
<button uiAnimate="animate-tada" [animationTrigger]="'click'" [animationOnce]="true">
  Click me!
</button>
```

## Animation Categories

### Entrances
- `animate-fade-in` - Basic fade in
- `animate-fade-in-up/down/left/right` - Fade with direction
- `animate-slide-in-up/down` - Slide animations
- `animate-zoom-in` - Scale up animation
- `animate-rotate-in` - Rotate entrance

### Exits
- `animate-fade-out` - Basic fade out
- `animate-fade-out-up/down/left/right` - Fade with direction
- `animate-slide-out-up/down` - Slide animations
- `animate-zoom-out` - Scale down animation
- `animate-rotate-out` - Rotate exit

### Emphasis
- `animate-bounce` - Bouncing effect
- `animate-shake` - Horizontal shake
- `animate-pulse` - Scaling pulse
- `animate-wobble` - Wobble motion
- `animate-tada` - Celebration animation
- `animate-heartbeat` - Heart beat effect

### Utilities
- `animation-delay-100/200/300/500/1000` - Animation delays
- `animation-duration-fast/normal/slow/slower` - Duration control
- `animation-infinite/once/twice` - Iteration control
- `animation-paused/running` - Playback control

## SCSS Mixins

Create custom animations using provided mixins with semantic tokens:

```scss
@use 'ui-animations/src/styles/mixins/animation-mixins' as mixins;
@use 'ui-design-system/src/styles/semantic/motion' as motion;

.my-custom-animation {
  @include mixins.animate(myKeyframes, motion.$semantic-motion-duration-normal, motion.$semantic-motion-easing-ease-out);
}

.hover-effect {
  @include mixins.hover-animation(transform, scale(1.1), motion.$semantic-motion-duration-fast);
}

.loading-spinner {
  @include mixins.loading-animation(40px, #007bff);
}
```

## Design System Integration

All animations now use semantic motion tokens from the design system:

- **Durations**: `$semantic-motion-duration-fast`, `$semantic-motion-duration-normal`, `$semantic-motion-duration-slow`, etc.
- **Easing**: `$semantic-motion-easing-ease-out`, `$semantic-motion-easing-spring`, `$semantic-motion-easing-bounce`, etc.
- **Spacing**: Animation distances use semantic spacing tokens for consistency
- **Timing**: Delays use semantic transition timing tokens

This ensures animations are consistent with your design system's motion principles.

## Demo

Visit the demo application to see all animations in action and experiment with different options.-~?x" ̑4iG𠢈>Ǔ63x] $40000 accordion ud¨W捺P
$o1=UwNZNW-uwNC0q\cwnz(x t)ٌGmSJCf YaVQ]	x&@use "../../../../../../ui-design-system/src/styles/semantic/index" as *;

.ui-timeline {
  // Core Structure
  display: flex;
  flex-direction: column;
  position: relative;
  
  // Layout & Spacing
  padding: $semantic-spacing-component-md;
  
  // Typography
  font-family: map-get($semantic-typography-body-medium, font-family);
  font-size: map-get($semantic-typography-body-medium, font-size);
  font-weight: map-get($semantic-typography-body-medium, font-weight);
  line-height: map-get($semantic-typography-body-medium, line-height);
  color: $semantic-color-text-primary;
  
  // Size Variants
  &--sm {
    padding: $semantic-spacing-component-xs;
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: map-get($semantic-typography-body-small, font-weight);
    line-height: map-get($semantic-typography-body-small, line-height);
    
    .ui-timeline__item {
      padding-bottom: $semantic-spacing-content-line-tight;
    }
    
    .ui-timeline__marker {
      width: $semantic-sizing-icon-inline;
      height: $semantic-sizing-icon-inline;
    }
    
    .ui-timeline__content {
      margin-left: $semantic-spacing-component-xs;
    }
  }
  
  &--md {
    .ui-timeline__item {
      padding-bottom: $semantic-spacing-component-sm;
    }
    
    .ui-timeline__marker {
      width: $semantic-sizing-icon-button;
      height: $semantic-sizing-icon-button;
    }
    
    .ui-timeline__content {
      margin-left: $semantic-spacing-component-sm;
    }
  }
  
  &--lg {
    padding: $semantic-spacing-component-lg;
    font-family: map-get($semantic-typography-body-large, font-family);
    font-size: map-get($semantic-typography-body-large, font-size);
    font-weight: map-get($semantic-typography-body-large, font-weight);
    line-height: map-get($semantic-typography-body-large, line-height);
    
    .ui-timeline__item {
      padding-bottom: $semantic-spacing-component-md;
    }
    
    .ui-timeline__marker {
      width: $semantic-sizing-icon-navigation;
      height: $semantic-sizing-icon-navigation;
    }
    
    .ui-timeline__content {
      margin-left: $semantic-spacing-component-md;
    }
  }
  
  // Timeline Item
  &__item {
    display: flex;
    align-items: flex-start;
    position: relative;
    padding-bottom: $semantic-spacing-component-sm;
    
    &:not(:last-child) {
      &::after {
        content: '';
        position: absolute;
        left: calc($semantic-sizing-icon-button / 2 - $semantic-border-width-1 / 2);
        top: calc($semantic-sizing-icon-button + $semantic-spacing-content-line-tight);
        width: $semantic-border-width-1;
        height: calc(100% - $semantic-sizing-icon-button - $semantic-spacing-content-line-tight);
        background: $semantic-color-border-secondary;
      }
    }
    
    &--completed {
      .ui-timeline__marker {
        background: $semantic-color-success;
        border-color: $semantic-color-success;
        
        &::after {
          content: '✓';
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%);
          color: $semantic-color-on-success;
          font-size: $semantic-typography-font-size-xs;
          font-weight: $semantic-typography-font-weight-bold;
        }
      }
    }
    
    &--active {
      .ui-timeline__marker {
        background: $semantic-color-primary;
        border-color: $semantic-color-primary;
        box-shadow: $semantic-shadow-elevation-2;
        
        &::after {
          content: '';
          position: absolute;
          top: 50%;
          left: 50%;
          width: 50%;
          height: 50%;
          background: $semantic-color-on-primary;
          border-radius: $semantic-border-radius-full;
          transform: translate(-50%, -50%);
        }
      }
      
      .ui-timeline__content {
        color: $semantic-color-text-primary;
      }
      
      .ui-timeline__title {
        color: $semantic-color-primary;
        font-weight: $semantic-typography-font-weight-semibold;
      }
    }
    
    &--pending {
      .ui-timeline__marker {
        background: $semantic-color-surface-primary;
        border-color: $semantic-color-border-secondary;
      }
      
      .ui-timeline__content {
        color: $semantic-color-text-secondary;
      }
    }
    
    &--error {
      .ui-timeline__marker {
        background: $semantic-color-danger;
        border-color: $semantic-color-danger;
        
        &::after {
          content: '×';
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%);
          color: $semantic-color-on-danger;
          font-size: $semantic-typography-font-size-sm;
          font-weight: $semantic-typography-font-weight-bold;
        }
      }
      
      .ui-timeline__title {
        color: $semantic-color-danger;
      }
    }
  }
  
  // Timeline Marker
  &__marker {
    flex-shrink: 0;
    width: $semantic-sizing-icon-button;
    height: $semantic-sizing-icon-button;
    border: $semantic-border-width-2 solid $semantic-color-border-primary;
    border-radius: $semantic-border-radius-full;
    background: $semantic-color-surface-primary;
    position: relative;
    z-index: 1;
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
  }
  
  // Timeline Content
  &__content {
    flex: 1;
    margin-left: $semantic-spacing-component-sm;
    // Remove padding-top for better alignment with marker center
  }
  
  &__title {
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: $semantic-typography-font-weight-semibold;
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-primary;
    margin-bottom: $semantic-spacing-content-line-tight;
  }
  
  &__description {
    color: $semantic-color-text-secondary;
    margin-bottom: $semantic-spacing-content-line-tight;
  }
  
  &__timestamp {
    font-family: map-get($semantic-typography-caption, font-family);
    font-size: map-get($semantic-typography-caption, font-size);
    font-weight: map-get($semantic-typography-caption, font-weight);
    line-height: map-get($semantic-typography-caption, line-height);
    color: $semantic-color-text-tertiary;
  }
  
  // Color Variants
  &--primary {
    .ui-timeline__item:not(.ui-timeline__item--completed):not(.ui-timeline__item--error) {
      .ui-timeline__marker {
        border-color: $semantic-color-primary;
      }
      
      &.ui-timeline__item--active .ui-timeline__marker {
        background: $semantic-color-primary;
      }
    }
  }
  
  &--secondary {
    .ui-timeline__item:not(.ui-timeline__item--completed):not(.ui-timeline__item--error) {
      .ui-timeline__marker {
        border-color: $semantic-color-secondary;
      }
      
      &.ui-timeline__item--active .ui-timeline__marker {
        background: $semantic-color-secondary;
      }
      
      &.ui-timeline__item--active .ui-timeline__title {
        color: $semantic-color-secondary;
      }
    }
  }
  
  &--success {
    .ui-timeline__item:not(.ui-timeline__item--completed):not(.ui-timeline__item--error) {
      .ui-timeline__marker {
        border-color: $semantic-color-success;
      }
      
      &.ui-timeline__item--active .ui-timeline__marker {
        background: $semantic-color-success;
      }
      
      &.ui-timeline__item--active .ui-timeline__title {
        color: $semantic-color-success;
      }
    }
  }
  
  // Orientation Variants
  &--horizontal {
    flex-direction: row;
    align-items: flex-start;
    
    .ui-timeline__item {
      flex-direction: column;
      align-items: center;
      text-align: center;
      padding-bottom: 0;
      padding-right: $semantic-spacing-component-md;
      
      &:not(:last-child) {
        &::after {
          left: calc(100% - $semantic-spacing-component-md / 2);
          top: calc($semantic-sizing-icon-button / 2 - $semantic-border-width-1 / 2);
          width: $semantic-spacing-component-md;
          height: $semantic-border-width-1;
        }
      }
    }
    
    .ui-timeline__content {
      margin-left: 0;
      margin-top: $semantic-spacing-content-line-tight;
      padding-top: 0;
    }
  }
  
  // Responsive Design
  @media (max-width: ($semantic-breakpoint-md - 1)) {
    padding: $semantic-spacing-component-sm;
    
    &--horizontal {
      flex-direction: column;
      
      .ui-timeline__item {
        flex-direction: row;
        text-align: left;
        padding-right: 0;
        padding-bottom: $semantic-spacing-component-sm;
        
        &:not(:last-child) {
          &::after {
            left: calc($semantic-sizing-icon-button / 2 - $semantic-border-width-1 / 2);
            top: calc($semantic-sizing-icon-button + $semantic-spacing-content-line-tight);
            width: $semantic-border-width-1;
            height: calc(100% - $semantic-sizing-icon-button - $semantic-spacing-content-line-tight);
          }
        }
      }
      
      .ui-timeline__content {
        margin-left: $semantic-spacing-component-sm;
        margin-top: 0;
        // Remove padding-top for better alignment
      }
    }
  }
  
  @media (max-width: ($semantic-breakpoint-sm - 1)) {
    padding: $semantic-spacing-component-xs;
    font-family: map-get($semantic-typography-body-small, font-family);
    font-size: map-get($semantic-typography-body-small, font-size);
    font-weight: map-get($semantic-typography-body-small, font-weight);
    line-height: map-get($semantic-typography-body-small, line-height);
  }
}x+x3ggqFbQjniF Qgx7 2	7H.'c
F:WuLpIDszx allery-grid 8!j)r_(cF/:at6?ᬣgT40000 infinite-scroll-container [{{Ԥk{h5%@-40000 kanban-board 1n;]p.s,u-40000 list-detai4#masonry VڦKi:+6SQplit-view <ʅ]7W͕(!ticky-layout ,;}\,M}}V}{u *xP 8W-
lZ	TT0L9Olc!n邐Ù\Ct-v%éDvqh#Ex/@use '../../../../../../ui-design-system/src/styles/semantic/index' as *;

.ui-split-view {
  // Core Structure
  display: flex;
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  
  // Layout & Spacing
  gap: $semantic-spacing-component-xs;
  
  // Visual Design
  background: $semantic-color-surface;
  border: $semantic-border-width-1 solid $semantic-color-border-subtle;
  border-radius: $semantic-border-radius-md;
  
  // Direction Variants
  &--horizontal {
    flex-direction: row;
  }
  
  &--vertical {
    flex-direction: column;
  }
  
  // Size Variants
  &--sm {
    min-height: $semantic-sizing-button-height-sm * 4; // Reasonable minimum for resizable panels
    gap: $semantic-spacing-component-xs;
  }
  
  &--md {
    min-height: $semantic-sizing-button-height-md * 6;
    gap: $semantic-spacing-component-sm;
  }
  
  &--lg {
    min-height: $semantic-sizing-button-height-lg * 8;
    gap: $semantic-spacing-component-md;
  }
  
  // Panel Element
  &__panel {
    position: relative;
    overflow: hidden;
    background: $semantic-color-surface-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-secondary;
    border-radius: $semantic-border-radius-sm;
    
    // Typography
    font-family: map-get($semantic-typography-body-medium, font-family);
    font-size: map-get($semantic-typography-body-medium, font-size);
    font-weight: map-get($semantic-typography-body-medium, font-weight);
    line-height: map-get($semantic-typography-body-medium, line-height);
    color: $semantic-color-text-primary;
    
    // Transitions
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    // Panel Content
    &-content {
      padding: $semantic-spacing-component-md;
      height: 100%;
      overflow: auto;
    }
    
    // Panel States
    &--primary {
      background: $semantic-color-surface-primary;
      border-color: $semantic-color-border-primary;
    }
    
    &--secondary {
      background: $semantic-color-surface-secondary;
      border-color: $semantic-color-border-secondary;
    }
    
    &--elevated {
      background: $semantic-color-surface-elevated;
      box-shadow: $semantic-shadow-elevation-2;
    }
    
    &--collapsed {
      min-width: 0;
      min-height: 0;
      opacity: $semantic-opacity-subtle;
    }
  }
  
  // Resizer Handle
  &__resizer {
    position: relative;
    background: $semantic-color-surface-secondary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    cursor: col-resize;
    z-index: $semantic-z-index-dropdown;
    
    // Transitions
    transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;
    
    // Horizontal Resizer (for vertical split)
    &--horizontal {
      min-height: 4px;
      cursor: row-resize;
      border-left: none;
      border-right: none;
      
      &:hover,
      &:focus-visible {
        background: $semantic-color-interactive-primary;
        min-height: 6px;
      }
      
      &:active {
        background: $semantic-color-primary;
        min-height: 8px;
      }
    }
    
    // Vertical Resizer (for horizontal split)
    &--vertical {
      min-width: 4px;
      cursor: col-resize;
      border-top: none;
      border-bottom: none;
      
      &:hover,
      &:focus-visible {
        background: $semantic-color-interactive-primary;
        min-width: 6px;
      }
      
      &:active {
        background: $semantic-color-primary;
        min-width: 8px;
      }
    }
    
    // Focus States
    &:focus-visible {
      outline: 2px solid $semantic-color-focus;
      outline-offset: 2px;
    }
    
    // Disabled State
    &--disabled {
      cursor: not-allowed;
      opacity: $semantic-opacity-disabled;
      pointer-events: none;
    }
  }
  
  // Resizer Handle Visual Indicator
  &__resizer-handle {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 20px;
    height: 4px;
    background: $semantic-color-text-tertiary;
    border-radius: $semantic-border-radius-sm;
    opacity: $semantic-opacity-hover;
    
    &::before,
    &::after {
      content: '';
      position: absolute;
      left: 0;
      width: 100%;
      height: 2px;
      background: $semantic-color-text-tertiary;
      border-radius: $semantic-border-radius-sm;
    }
    
    &::before {
      top: -4px;
    }
    
    &::after {
      bottom: -4px;
    }
    
    // Horizontal orientation
    .ui-split-view__resizer--horizontal & {
      width: 4px;
      height: 20px;
      
      &::before,
      &::after {
        top: 0;
        width: 2px;
        height: 100%;
      }
      
      &::before {
        left: -4px;
      }
      
      &::after {
        right: -4px;
        left: auto;
      }
    }
  }
  
  // State Variants
  &--disabled {
    opacity: $semantic-opacity-disabled;
    pointer-events: none;
  }
  
  &--resizing {
    user-select: none;
    
    .ui-split-view__panel {
      pointer-events: none;
    }
  }
  
  // Responsive Design
  @media (max-width: $semantic-breakpoint-md - 1) {
    gap: $semantic-spacing-component-xs;
    
    .ui-split-view__panel-content {
      padding: $semantic-spacing-component-sm;
    }
    
    .ui-split-view__resizer {
      &--vertical {
        min-width: 6px;
      }
      
      &--horizontal {
        min-height: 6px;
      }
    }
  }
  
  @media (max-width: $semantic-breakpoint-sm - 1) {
    // Stack vertically on small screens
    &--horizontal {
      flex-direction: column;
      
      .ui-split-view__resizer--vertical {
        cursor: row-resize;
        min-width: auto;
        min-height: 6px;
      }
    }
    
    .ui-split-view__panel-content {
      padding: $semantic-spacing-component-xs;
      font-family: map-get($semantic-typography-body-small, font-family);
      font-size: map-get($semantic-typography-body-small, font-size);
      font-weight: map-get($semantic-typography-body-small, font-weight);
      line-height: map-get($semantic-typography-body-small, line-height);
    }
  }
}oHQx N@s`@=,3k`x6 95F#6
M8C
!xudce	Gx kg{iB/
( r(NĒM3x nBS5Fk+g5ٞe&x # UI Font Manager

A comprehensive Angular library for dynamic font management with runtime theme switching, Google Fonts integration, and extensible custom font support.

## Features

- **🎨 Runtime Font Themes**: Switch font themes dynamically without rebuilds
- **📦 Google Fonts Presets**: 75+ popular Google Fonts with URLs ready to use
- **🔧 Custom Font Support**: Add Typekit, self-hosted, or any external fonts
- **⚡ Performance Optimized**: Lazy loading, preloading, and caching strategies
- **🎯 Theme Management**: Create, save, and apply font theme combinations
- **📱 CSS Variables Integration**: Seamless integration with your design system

## Installation

```bash
npm install ui-font-manager
```

## Quick Start

### 1. Basic Usage

```typescript
import { UiFontManagerService, FontThemeService } from 'ui-font-manager';

@Component({...})
export class MyComponent {
  constructor(
    private fontManager: UiFontManagerService,
    private themeService: FontThemeService
  ) {}

  // Load a Google Font
  loadFont() {
    this.fontManager.loadFont('Inter').subscribe(success => {
      console.log('Font loaded:', success);
    });
  }

  // Apply a predefined theme
  applyTheme() {
    this.themeService.applyTheme('Modern Clean').subscribe();
  }
}
```

### 2. CSS Variables Integration

Your CSS automatically uses the new fonts:

```scss
.my-component {
  font-family: var(--font-family-sans); // Updates dynamically
}

h1 {
  font-family: var(--font-family-display);
}

code {
  font-family: var(--font-family-mono);
}
```

## Google Fonts Presets

Access 75+ popular Google Fonts instantly:

```typescript
// Get all available Google Fonts
const fonts = this.fontManager.getGoogleFontsPresets();

// Load specific fonts
this.fontManager.loadFonts(['Inter', 'Playfair Display', 'JetBrains Mono']);

// Use predefined combinations
const combinations = this.fontManager.getFontCombinations();
// 'Modern Clean', 'Classic Editorial', 'Friendly Modern', 'Professional'
```

### Available Google Fonts by Category

**Sans-serif (35 fonts)**: Inter, Roboto, Open Sans, Poppins, Lato, Montserrat, Nunito, Source Sans Pro, Raleway, Ubuntu, Work Sans, Rubik, Kanit, DM Sans, Mulish, Hind, Quicksand, Karla, Manrope, Comfortaa, Outfit, Lexend, Plus Jakarta Sans, Space Grotesk, Figtree, Barlow, Epilogue, Sora, Red Hat Display, Satoshi, Heebo, Exo 2, Commissioner, Archivo, Public Sans

**Serif (20 fonts)**: Playfair Display, Merriweather, Lora, EB Garamond, Crimson Text, Source Serif Pro, Noto Serif, Vollkorn, Libre Baskerville, Arvo, Zilla Slab, Cormorant Garamond, PT Serif, Alegreya, Spectral, Old Standard TT, Cardo, Gentium Plus, Neuton, Bitter

**Monospace (10 fonts)**: JetBrains Mono, Fira Code, Source Code Pro, Roboto Mono, IBM Plex Mono, Space Mono, Inconsolata, PT Mono, Fira Mono, Ubuntu Mono

**Display (10 fonts)**: Oswald, Bebas Neue, Anton, Righteous, Fredoka One, Archivo Black, Cabin, Prompt, Fjalla One, Patua One

**Handwriting (10 fonts)**: Dancing Script, Great Vibes, Pacifico, Kaushan Script, Satisfy, Caveat, Amatic SC, Indie Flower, Shadows Into Light, Permanent Marker

## Custom Font Support

### Add External Fonts

```typescript
import { fontPresetManager } from 'ui-font-manager';

// Add Typekit fonts
fontPresetManager.addTypekitFont('abc123', [
  { name: 'My Custom Font', family: 'MyFont', weights: [400, 700] }
]);

// Add custom CDN fonts
fontPresetManager.addExternalFont('Custom Sans', {
  family: 'CustomSans',
  url: 'https://mycdn.com/fonts/custom.css',
  weights: [300, 400, 600],
  category: 'sans-serif'
});

// Add self-hosted fonts
fontPresetManager.addSelfHostedFont('My Font', {
  family: 'MyFont',
  basePath: '/assets/fonts/myfont',
  formats: ['woff2', 'woff'],
  weights: [400, 700],
  category: 'serif'
});
```

## Theme Management

### Create Custom Themes

```typescript
// Create theme from font combination
const theme = this.themeService.createThemeFromCombination(
  'My Theme',
  'Modern Clean',
  'Clean and modern design'
);

// Create fully custom theme
const customTheme = this.themeService.createCustomTheme('Custom Theme', {
  sans: 'Inter',
  serif: 'Playfair Display',
  mono: 'JetBrains Mono',
  display: 'Oswald'
});

// Apply the theme
this.themeService.applyTheme('My Theme').subscribe();
```

### Export/Import Themes

```typescript
// Export theme configuration
const config = this.themeService.exportTheme('My Theme');

// Import theme from JSON
const theme = this.themeService.importTheme(jsonString);
```

## Performance Features

### Font Loading Strategies

```typescript
// Configure font manager
this.fontManager.configure({
  preloadFonts: true,
  fallbackTimeout: 3000,
  cacheEnabled: true
});

// Preload fonts for performance
this.fontManager.preloadFonts(['Inter', 'Roboto']);

// Load with specific options
this.fontManager.loadFont('Inter', {
  display: 'swap',
  weights: [400, 600],
  subsets: ['latin']
});
```

## Integration with Design Systems

Works seamlessly with existing CSS custom properties:

```scss
// In your existing design system
:root {
  --font-family-sans: 'Inter', system-ui, sans-serif;
  --font-family-serif: 'Playfair Display', Georgia, serif;
  --font-family-mono: 'JetBrains Mono', Consolas, monospace;
  --font-family-display: 'Inter', system-ui, sans-serif;
}

// Font manager updates these variables at runtime
```

## API Reference

### UiFontManagerService

- `loadFont(name, options?)`: Load single font
- `loadFonts(names, options?)`: Load multiple fonts
- `applyTheme(theme)`: Apply font theme
- `getGoogleFontsPresets()`: Get Google Fonts collection
- `getFontCombinations()`: Get predefined combinations
- `addCustomFont(name, definition)`: Add custom font

### FontThemeService

- `applyTheme(name)`: Apply theme by name
- `getThemes()`: Get all themes
- `createCustomTheme()`: Create custom theme
- `exportTheme()` / `importTheme()`: Export/import themes

### FontPresetManager

- `addCustomFont()`: Add single custom font
- `addTypekitFont()`: Add Adobe Typekit fonts
- `addSelfHostedFont()`: Add self-hosted fonts
- `getFontsByCategory()`: Filter fonts by category

## License

MITM<Dx| BPѺ}B9~ڏ-A6Ҷw͚zե[}=Vg:9 "DQ*+40000 ui-landing-pages /cAw"6);:YL5Qx7 YH'vMnhR0P6:hf'RcYzxHx3 |:le;:Pב-fE:+EuK/("(x  bTđcATS9M;%x   c$
Jnj	m3O;&t1x   =>ln*o>O;
sx  \~4"J*r~M;Ux_ X̹*!fhQ_40000 features 5]x~VJbQ)ױ0AP40000 shared ϩô$Zta|+x4i=}{~~?aGd< PHKM,)-J-few	2_e`	DIqFbQj
ËW/<UeAԮĚ  +,yx4i7To>`WTd£\ PHKM,)-J-f~xuݻEt8yj-DIqFbQj
ËW/<UeAԮĚ  +ex4i[3K~ PHKM,)-J-fxnCZ_פYW;mH|;DIqFbQj
ËW/<UeAԮĚ  ,I4x_ Xp4e|N440000 features p`1-
H(Ҡ40000 shared ϩô$Zta|\+nx_ X^W[ⅸgT40000 features J̩qʌ1cgyf40000 shared ϩô$Zta|.r3x f5ۦcƊ'K\ܑDc7x6 ^afo+'ftn#U?S^XiZ6*[dk4~x[q<^7Wf)]ha::1Oybh0 S.x[qHrU7n-U"r}*:1Oybh0 מ^x6 smQMhVTGvn#U?S褚ܖi@knx ZҭǏ\<8d1En:hy-x! ?%j{non#US(F#x6 ᆞϬ>rk|בn#U?{R_ecj|D:X9lKxn 5ψ}:k2ǖIPU!TW+?"0$17!بjkB\x]',40000 overlays D`e9q 8\XfA:|</xK 5)H{;XidIPk*z^rj'`T&AVJn
Հp!xkx& 40000 app 3Rm'_GLĆh"x[˸Q 
>r"& Vx[˸Q 
Z>2=%ډzO n
x[˸Q 
dE:O6ZW8ϟ( R>x[˸Q 
ؿ_;58w=Tq\? x& 40000 app 1 m%f[k+Six& 40000 app tqNmVٿx import { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DashboardShellLayoutComponent, WidgetGridLayoutComponent, WidgetContainerComponent, BentoGridLayoutComponent, KpiCardLayoutComponent, ListDetailLayoutComponent, FeedLayoutComponent, SupportingPaneLayoutComponent, GridContainerComponent, TabContainerComponent, ScrollContainerComponent, LoadingStateContainerComponent, TabItem, ErrorState, GridResponsiveConfig, LoadingState, VirtualScrollConfig } from "../../../../../ui-essentials/src/lib/layouts";

// Note: Local layout components are available but not used in this demo
// They can be imported if needed for specific layout demonstrations

@Component({
  selector: 'ui-layout-demo',
  standalone: true,
  imports: [
    CommonModule,
    DashboardShellLayoutComponent,
    WidgetGridLayoutComponent,
    WidgetContainerComponent,
    BentoGridLayoutComponent,
    KpiCardLayoutComponent,
    ListDetailLayoutComponent,
    FeedLayoutComponent,
    SupportingPaneLayoutComponent,
    GridContainerComponent,
    TabContainerComponent,
    ScrollContainerComponent,
    LoadingStateContainerComponent
],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Layout Component Showcase</h2>
      
      <!-- Dashboard Shell Layout -->
      <section style="margin-bottom: 3rem;">
        <h3>Dashboard Shell Layout</h3>
        <div style="margin-bottom: 2rem;">
          <h4>Standard Dashboard Shell</h4>
          <div style="height: 300px; border: 1px solid #ddd; border-radius: 8px; overflow: hidden;">
            <ui-dashboard-shell-layout [sidebarCollapsed]="sidebarCollapsed()" [showFooter]="showFooter()">
              <div slot="header" style="background: #f8f9fa; padding: 1rem; border-bottom: 1px solid #dee2e6;">
                <h5 style="margin: 0;">Dashboard Header</h5>
                <button 
                  style="margin-left: 1rem; padding: 0.25rem 0.5rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
                  (click)="toggleSidebar()"
                >
                  {{ sidebarCollapsed() ? 'Expand' : 'Collapse' }} Sidebar
                </button>
                <button 
                  style="margin-left: 0.5rem; padding: 0.25rem 0.5rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
                  (click)="toggleFooter()"
                >
                  {{ showFooter() ? 'Hide' : 'Show' }} Footer
                </button>
              </div>
              
              <nav slot="sidebar" style="background: #343a40; color: white; padding: 1rem; height: 100%;">
                <div style="font-weight: bold; margin-bottom: 1rem;">Navigation</div>
                <ul style="list-style: none; padding: 0; margin: 0;">
                  <li style="margin-bottom: 0.5rem;"><a href="#" style="color: #adb5bd; text-decoration: none;">Dashboard</a></li>
                  <li style="margin-bottom: 0.5rem;"><a href="#" style="color: #adb5bd; text-decoration: none;">Analytics</a></li>
                  <li style="margin-bottom: 0.5rem;"><a href="#" style="color: #adb5bd; text-decoration: none;">Users</a></li>
                  <li style="margin-bottom: 0.5rem;"><a href="#" style="color: #adb5bd; text-decoration: none;">Settings</a></li>
                </ul>
              </nav>
              
              <div slot="main" style="padding: 1rem; height: 100%; overflow-y: auto;">
                <h6>Main Content Area</h6>
                <p>This is the main content area of the dashboard. Content can scroll independently.</p>
                <div style="background: #e9ecef; padding: 1rem; border-radius: 4px; margin: 0.5rem 0;">Widget 1</div>
                <div style="background: #e9ecef; padding: 1rem; border-radius: 4px; margin: 0.5rem 0;">Widget 2</div>
                <div style="background: #e9ecef; padding: 1rem; border-radius: 4px; margin: 0.5rem 0;">Widget 3</div>
              </div>
              
              <div slot="footer" style="background: #f8f9fa; padding: 0.75rem 1rem; border-top: 1px solid #dee2e6; text-align: center; font-size: 0.875rem;">
                © 2024 Dashboard Footer
              </div>
            </ui-dashboard-shell-layout>
          </div>
        </div>
      </section>

      <!-- Widget Grid Layout -->
      <section style="margin-bottom: 3rem;">
        <h3>Widget Grid Layout</h3>
        
        <!-- Small Grid -->
        <div style="margin-bottom: 2rem;">
          <h4>Small Grid (sm)</h4>
          <ui-widget-grid-layout gridSize="sm" [autoFit]="true">
            <ui-widget-container>
              <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 1.5rem; border-radius: 8px; text-align: center;">
                <h6 style="margin: 0 0 0.5rem 0;">Widget 1</h6>
                <p style="margin: 0; opacity: 0.9;">Small grid widget</p>
              </div>
            </ui-widget-container>
            <ui-widget-container>
              <div style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); color: white; padding: 1.5rem; border-radius: 8px; text-align: center;">
                <h6 style="margin: 0 0 0.5rem 0;">Widget 2</h6>
                <p style="margin: 0; opacity: 0.9;">Analytics data</p>
              </div>
            </ui-widget-container>
            <ui-widget-container>
              <div style="background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); color: white; padding: 1.5rem; border-radius: 8px; text-align: center;">
                <h6 style="margin: 0 0 0.5rem 0;">Widget 3</h6>
                <p style="margin: 0; opacity: 0.9;">Metrics overview</p>
              </div>
            </ui-widget-container>
          </ui-widget-grid-layout>
        </div>

        <!-- Medium Grid -->
        <div style="margin-bottom: 2rem;">
          <h4>Medium Grid (md)</h4>
          <ui-widget-grid-layout gridSize="md" [autoFit]="true">
            <ui-widget-container>
              <div style="background: #fff; border: 1px solid #e9ecef; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
                <h6 style="margin: 0 0 1rem 0; color: #495057;">Revenue</h6>
                <div style="font-size: 2rem; font-weight: bold; color: #28a745; margin-bottom: 0.5rem;">$24,300</div>
                <div style="color: #6c757d; font-size: 0.875rem;">↗️ 12% increase</div>
              </div>
            </ui-widget-container>
            <ui-widget-container>
              <div style="background: #fff; border: 1px solid #e9ecef; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
                <h6 style="margin: 0 0 1rem 0; color: #495057;">Users</h6>
                <div style="font-size: 2rem; font-weight: bold; color: #007bff; margin-bottom: 0.5rem;">8,423</div>
                <div style="color: #6c757d; font-size: 0.875rem;">👥 Active users</div>
              </div>
            </ui-widget-container>
            <ui-widget-container>
              <div style="background: #fff; border: 1px solid #e9ecef; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
                <h6 style="margin: 0 0 1rem 0; color: #495057;">Orders</h6>
                <div style="font-size: 2rem; font-weight: bold; color: #fd7e14; margin-bottom: 0.5rem;">1,234</div>
                <div style="color: #6c757d; font-size: 0.875rem;">📦 This month</div>
              </div>
            </ui-widget-container>
            <ui-widget-container>
              <div style="background: #fff; border: 1px solid #e9ecef; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
                <h6 style="margin: 0 0 1rem 0; color: #495057;">Conversion</h6>
                <div style="font-size: 2rem; font-weight: bold; color: #6f42c1; margin-bottom: 0.5rem;">3.2%</div>
                <div style="color: #6c757d; font-size: 0.875rem;">📈 Conversion rate</div>
              </div>
            </ui-widget-container>
          </ui-widget-grid-layout>
        </div>

        <!-- Large Grid -->
        <div style="margin-bottom: 2rem;">
          <h4>Large Grid (lg)</h4>
          <ui-widget-grid-layout gridSize="lg" [autoFit]="false">
            <ui-widget-container>
              <div style="background: #fff; border: 1px solid #e9ecef; padding: 2rem; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);">
                <h5 style="margin: 0 0 1.5rem 0; color: #212529;">Performance Dashboard</h5>
                <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin-bottom: 1.5rem;">
                  <div style="text-align: center;">
                    <div style="font-size: 1.5rem; font-weight: bold; color: #dc3545;">89%</div>
                    <div style="font-size: 0.875rem; color: #6c757d;">CPU Usage</div>
                  </div>
                  <div style="text-align: center;">
                    <div style="font-size: 1.5rem; font-weight: bold; color: #ffc107;">67%</div>
                    <div style="font-size: 0.875rem; color: #6c757d;">Memory</div>
                  </div>
                  <div style="text-align: center;">
                    <div style="font-size: 1.5rem; font-weight: bold; color: #20c997;">45%</div>
                    <div style="font-size: 0.875rem; color: #6c757d;">Disk I/O</div>
                  </div>
                </div>
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px;">
                  <div style="font-size: 0.875rem; color: #6c757d;">System Status: All services operational</div>
                </div>
              </div>
            </ui-widget-container>
          </ui-widget-grid-layout>
        </div>
      </section>

      <!-- Bento Grid Layout -->
      <section style="margin-bottom: 3rem;">
        <h3>Bento Grid Layout</h3>
        
        <!-- Balanced Bento -->
        <div style="margin-bottom: 2rem;">
          <h4>Balanced Bento</h4>
          <div style="height: 300px;">
            <ui-bento-grid-layout variant="balanced" [adaptive]="true">
              <div style="background: linear-gradient(45deg, #ff6b6b, #ee5a24); color: white; padding: 1.5rem; border-radius: 12px; display: flex; flex-direction: column; justify-content: center;">
                <h6 style="margin: 0 0 0.5rem 0; font-size: 1.1rem;">Featured</h6>
                <p style="margin: 0; opacity: 0.9; font-size: 0.9rem;">Main highlight content</p>
              </div>
              <div style="background: linear-gradient(45deg, #4834d4, #686de0); color: white; padding: 1.5rem; border-radius: 12px; display: flex; flex-direction: column; justify-content: center;">
                <h6 style="margin: 0 0 0.5rem 0; font-size: 1rem;">Analytics</h6>
                <p style="margin: 0; opacity: 0.9; font-size: 0.85rem;">Data insights</p>
              </div>
              <div style="background: linear-gradient(45deg, #00d2d3, #54a0ff); color: white; padding: 1.5rem; border-radius: 12px; display: flex; flex-direction: column; justify-content: center;">
                <h6 style="margin: 0 0 0.5rem 0; font-size: 1rem;">Metrics</h6>
                <p style="margin: 0; opacity: 0.9; font-size: 0.85rem;">Performance data</p>
              </div>
              <div style="background: linear-gradient(45deg, #ff9ff3, #f368e0); color: white; padding: 1.5rem; border-radius: 12px; display: flex; flex-direction: column; justify-content: center;">
                <h6 style="margin: 0 0 0.5rem 0; font-size: 1rem;">Reports</h6>
                <p style="margin: 0; opacity: 0.9; font-size: 0.85rem;">Generated reports</p>
              </div>
            </ui-bento-grid-layout>
          </div>
        </div>

        <!-- Asymmetric Bento -->
        <div style="margin-bottom: 2rem;">
          <h4>Asymmetric Bento</h4>
          <div style="height: 300px;">
            <ui-bento-grid-layout variant="asymmetric" [adaptive]="true">
              <div style="background: #fff; border: 2px solid #e9ecef; padding: 1.5rem; border-radius: 12px; display: flex; flex-direction: column; justify-content: space-between;">
                <div>
                  <h6 style="margin: 0 0 1rem 0; color: #495057;">Primary Widget</h6>
                  <div style="font-size: 2.5rem; font-weight: bold; color: #007bff;">42</div>
                </div>
                <div style="font-size: 0.875rem; color: #6c757d;">↗️ 8% this week</div>
              </div>
              <div style="background: #fff; border: 2px solid #e9ecef; padding: 1rem; border-radius: 12px;">
                <h6 style="margin: 0 0 0.5rem 0; color: #495057; font-size: 0.9rem;">Secondary</h6>
                <div style="font-size: 1.25rem; font-weight: bold; color: #28a745;">$1,234</div>
              </div>
              <div style="background: #fff; border: 2px solid #e9ecef; padding: 1rem; border-radius: 12px;">
                <h6 style="margin: 0 0 0.5rem 0; color: #495057; font-size: 0.9rem;">Users</h6>
                <div style="font-size: 1.25rem; font-weight: bold; color: #fd7e14;">892</div>
              </div>
              <div style="background: #fff; border: 2px solid #e9ecef; padding: 1rem; border-radius: 12px;">
                <h6 style="margin: 0 0 0.5rem 0; color: #495057; font-size: 0.9rem;">Status</h6>
                <div style="color: #20c997; font-weight: 500;">✅ Online</div>
              </div>
            </ui-bento-grid-layout>
          </div>
        </div>
      </section>

      <!-- KPI Card Layout -->
      <section style="margin-bottom: 3rem;">
        <h3>KPI Card Layout</h3>
        <ui-kpi-card-layout>
          <div style="background: #fff; border-left: 4px solid #007bff; padding: 1.5rem; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
            <div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 1rem;">
              <div>
                <h6 style="margin: 0 0 0.5rem 0; color: #6c757d; font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.5px;">Total Revenue</h6>
                <div style="font-size: 2.5rem; font-weight: bold; color: #007bff;">$48,392</div>
              </div>
              <div style="background: rgba(0, 123, 255, 0.1); padding: 0.75rem; border-radius: 50%; color: #007bff;">
                💰
              </div>
            </div>
            <div style="display: flex; align-items: center; color: #28a745; font-size: 0.875rem;">
              <span style="margin-right: 0.5rem;">↗️</span>
              <span style="font-weight: 500;">12.5% increase</span>
              <span style="color: #6c757d; margin-left: 0.5rem;">vs last month</span>
            </div>
          </div>
          
          <div style="background: #fff; border-left: 4px solid #28a745; padding: 1.5rem; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
            <div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 1rem;">
              <div>
                <h6 style="margin: 0 0 0.5rem 0; color: #6c757d; font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.5px;">Active Users</h6>
                <div style="font-size: 2.5rem; font-weight: bold; color: #28a745;">2,847</div>
              </div>
              <div style="background: rgba(40, 167, 69, 0.1); padding: 0.75rem; border-radius: 50%; color: #28a745;">
                👥
              </div>
            </div>
            <div style="display: flex; align-items: center; color: #28a745; font-size: 0.875rem;">
              <span style="margin-right: 0.5rem;">↗️</span>
              <span style="font-weight: 500;">8.2% increase</span>
              <span style="color: #6c757d; margin-left: 0.5rem;">vs last month</span>
            </div>
          </div>
          
          <div style="background: #fff; border-left: 4px solid #ffc107; padding: 1.5rem; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
            <div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 1rem;">
              <div>
                <h6 style="margin: 0 0 0.5rem 0; color: #6c757d; font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.5px;">Conversion Rate</h6>
                <div style="font-size: 2.5rem; font-weight: bold; color: #ffc107;">3.7%</div>
              </div>
              <div style="background: rgba(255, 193, 7, 0.1); padding: 0.75rem; border-radius: 50%; color: #ffc107;">
                📈
              </div>
            </div>
            <div style="display: flex; align-items: center; color: #dc3545; font-size: 0.875rem;">
              <span style="margin-right: 0.5rem;">↘️</span>
              <span style="font-weight: 500;">2.1% decrease</span>
              <span style="color: #6c757d; margin-left: 0.5rem;">vs last month</span>
            </div>
          </div>
        </ui-kpi-card-layout>
      </section>

      <!-- List Detail Layout -->
      <section style="margin-bottom: 3rem;">
        <h3>List Detail Layout</h3>
        <div style="height: 400px; border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden;">
          <ui-list-detail-layout>
            <div slot="list" style="background: #f8f9fa; padding: 1rem; height: 100%; overflow-y: auto;">
              <h6 style="margin: 0 0 1rem 0; color: #495057;">Items List</h6>
              <div style="space-y: 0.5rem;">
                <div 
                  style="padding: 0.75rem; background: white; border-radius: 6px; border: 1px solid #e9ecef; cursor: pointer; transition: all 0.2s;"
                  [style.background]="selectedItem() === 1 ? '#007bff' : 'white'"
                  [style.color]="selectedItem() === 1 ? 'white' : '#495057'"
                  (click)="selectItem(1)"
                >
                  <div style="font-weight: 500;">Project Alpha</div>
                  <div style="font-size: 0.875rem; opacity: 0.8;">Web Application</div>
                </div>
                <div 
                  style="padding: 0.75rem; background: white; border-radius: 6px; border: 1px solid #e9ecef; cursor: pointer; transition: all 0.2s; margin-top: 0.5rem;"
                  [style.background]="selectedItem() === 2 ? '#007bff' : 'white'"
                  [style.color]="selectedItem() === 2 ? 'white' : '#495057'"
                  (click)="selectItem(2)"
                >
                  <div style="font-weight: 500;">Project Beta</div>
                  <div style="font-size: 0.875rem; opacity: 0.8;">Mobile App</div>
                </div>
                <div 
                  style="padding: 0.75rem; background: white; border-radius: 6px; border: 1px solid #e9ecef; cursor: pointer; transition: all 0.2s; margin-top: 0.5rem;"
                  [style.background]="selectedItem() === 3 ? '#007bff' : 'white'"
                  [style.color]="selectedItem() === 3 ? 'white' : '#495057'"
                  (click)="selectItem(3)"
                >
                  <div style="font-weight: 500;">Project Gamma</div>
                  <div style="font-size: 0.875rem; opacity: 0.8;">API Service</div>
                </div>
              </div>
            </div>
            
            <div slot="detail" style="padding: 2rem; height: 100%; overflow-y: auto;">
              @if (selectedItem() === 1) {
                <h5 style="margin: 0 0 1rem 0; color: #007bff;">Project Alpha Details</h5>
                <p style="color: #6c757d; margin-bottom: 1.5rem;">A comprehensive web application built with Angular and TypeScript.</p>
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px; margin-bottom: 1rem;">
                  <h6 style="margin: 0 0 0.5rem 0;">Status</h6>
                  <span style="background: #28a745; color: white; padding: 0.25rem 0.75rem; border-radius: 12px; font-size: 0.875rem;">Active</span>
                </div>
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px;">
                  <h6 style="margin: 0 0 0.5rem 0;">Team Members</h6>
                  <div>John Doe, Jane Smith, Mike Johnson</div>
                </div>
              }
              @if (selectedItem() === 2) {
                <h5 style="margin: 0 0 1rem 0; color: #007bff;">Project Beta Details</h5>
                <p style="color: #6c757d; margin-bottom: 1.5rem;">Native mobile application for iOS and Android platforms.</p>
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px; margin-bottom: 1rem;">
                  <h6 style="margin: 0 0 0.5rem 0;">Status</h6>
                  <span style="background: #ffc107; color: #212529; padding: 0.25rem 0.75rem; border-radius: 12px; font-size: 0.875rem;">In Progress</span>
                </div>
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px;">
                  <h6 style="margin: 0 0 0.5rem 0;">Team Members</h6>
                  <div>Sarah Wilson, Tom Brown</div>
                </div>
              }
              @if (selectedItem() === 3) {
                <h5 style="margin: 0 0 1rem 0; color: #007bff;">Project Gamma Details</h5>
                <p style="color: #6c757d; margin-bottom: 1.5rem;">RESTful API service built with Node.js and Express.</p>
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px; margin-bottom: 1rem;">
                  <h6 style="margin: 0 0 0.5rem 0;">Status</h6>
                  <span style="background: #17a2b8; color: white; padding: 0.25rem 0.75rem; border-radius: 12px; font-size: 0.875rem;">Planning</span>
                </div>
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px;">
                  <h6 style="margin: 0 0 0.5rem 0;">Team Members</h6>
                  <div>Alex Chen, Maria Garcia</div>
                </div>
              }
              @if (selectedItem() === 0) {
                <div style="text-align: center; padding: 3rem 1rem; color: #6c757d;">
                  <div style="font-size: 3rem; margin-bottom: 1rem;">📋</div>
                  <h6>Select an item from the list</h6>
                  <p style="margin: 0;">Choose a project from the left panel to view its details here.</p>
                </div>
              }
            </div>
          </ui-list-detail-layout>
        </div>
      </section>

      <!-- Feed Layout -->
      <section style="margin-bottom: 3rem;">
        <h3>Feed Layout</h3>
        <div style="height: 400px;">
          <ui-feed-layout>
            <article style="background: white; border: 1px solid #e9ecef; border-radius: 8px; padding: 1.5rem; margin-bottom: 1rem;">
              <header style="display: flex; align-items: center; margin-bottom: 1rem;">
                <div style="width: 40px; height: 40px; background: #007bff; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; margin-right: 1rem;">
                  👤
                </div>
                <div>
                  <div style="font-weight: 600; color: #495057;">John Doe</div>
                  <div style="font-size: 0.875rem; color: #6c757d;">2 hours ago</div>
                </div>
              </header>
              <div style="color: #495057; line-height: 1.6; margin-bottom: 1rem;">
                Just launched our new feature! 🚀 Really excited to see how the community responds to this update.
              </div>
              <footer style="display: flex; gap: 1rem; color: #6c757d; font-size: 0.875rem;">
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">👍 Like</button>
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">💬 Comment</button>
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">📤 Share</button>
              </footer>
            </article>

            <article style="background: white; border: 1px solid #e9ecef; border-radius: 8px; padding: 1.5rem; margin-bottom: 1rem;">
              <header style="display: flex; align-items: center; margin-bottom: 1rem;">
                <div style="width: 40px; height: 40px; background: #28a745; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; margin-right: 1rem;">
                  👩
                </div>
                <div>
                  <div style="font-weight: 600; color: #495057;">Jane Smith</div>
                  <div style="font-size: 0.875rem; color: #6c757d;">5 hours ago</div>
                </div>
              </header>
              <div style="color: #495057; line-height: 1.6; margin-bottom: 1rem;">
                Working on some exciting new layouts for our dashboard. The bento grid approach is really promising for organizing complex data visualizations.
              </div>
              <div style="background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; padding: 1rem; margin-bottom: 1rem;">
                <div style="font-size: 0.875rem; color: #6c757d; margin-bottom: 0.5rem;">📎 Attachment</div>
                <div style="font-weight: 500; color: #495057;">dashboard-mockup.png</div>
              </div>
              <footer style="display: flex; gap: 1rem; color: #6c757d; font-size: 0.875rem;">
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">👍 Like</button>
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">💬 Comment</button>
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">📤 Share</button>
              </footer>
            </article>

            <article style="background: white; border: 1px solid #e9ecef; border-radius: 8px; padding: 1.5rem; margin-bottom: 1rem;">
              <header style="display: flex; align-items: center; margin-bottom: 1rem;">
                <div style="width: 40px; height: 40px; background: #6f42c1; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; margin-right: 1rem;">
                  👨
                </div>
                <div>
                  <div style="font-weight: 600; color: #495057;">Mike Johnson</div>
                  <div style="font-size: 0.875rem; color: #6c757d;">1 day ago</div>
                </div>
              </header>
              <div style="color: #495057; line-height: 1.6; margin-bottom: 1rem;">
                Great team meeting today! We've outlined the roadmap for Q2 and everyone is aligned on the priorities. Looking forward to shipping these features.
              </div>
              <footer style="display: flex; gap: 1rem; color: #6c757d; font-size: 0.875rem;">
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">👍 Like (3)</button>
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">💬 Comment (1)</button>
                <button style="background: none; border: none; color: #007bff; cursor: pointer; padding: 0;">📤 Share</button>
              </footer>
            </article>
          </ui-feed-layout>
        </div>
      </section>

      <!-- Supporting Pane Layout -->
      <section style="margin-bottom: 3rem;">
        <h3>Supporting Pane Layout</h3>
        <div style="height: 400px; border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden;">
          <ui-supporting-pane-layout>
            <div slot="main" style="padding: 2rem; height: 100%; overflow-y: auto;">
              <h5 style="margin: 0 0 1rem 0; color: #495057;">Main Content Area</h5>
              <p style="color: #6c757d; line-height: 1.6; margin-bottom: 1.5rem;">
                This is the primary content area where the main application content is displayed. 
                It takes up most of the available space and can scroll independently from the supporting pane.
              </p>
              
              <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; margin-bottom: 1.5rem;">
                <h6 style="margin: 0 0 1rem 0; color: #495057;">Article Content</h6>
                <p style="color: #6c757d; line-height: 1.6; margin: 0;">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
                  Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
                </p>
              </div>
              
              <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px;">
                <h6 style="margin: 0 0 1rem 0; color: #495057;">Section 2</h6>
                <p style="color: #6c757d; line-height: 1.6; margin: 0;">
                  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
                  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
                </p>
              </div>
            </div>
            
            <div slot="supporting" style="background: #f8f9fa; padding: 1.5rem; height: 100%; overflow-y: auto;">
              <h6 style="margin: 0 0 1rem 0; color: #495057;">Supporting Information</h6>
              
              <div style="background: white; border: 1px solid #e9ecef; border-radius: 6px; padding: 1rem; margin-bottom: 1rem;">
                <h6 style="margin: 0 0 0.5rem 0; color: #495057; font-size: 0.875rem;">Quick Stats</h6>
                <div style="font-size: 1.25rem; font-weight: bold; color: #007bff;">142</div>
                <div style="font-size: 0.75rem; color: #6c757d;">Total Items</div>
              </div>
              
              <div style="background: white; border: 1px solid #e9ecef; border-radius: 6px; padding: 1rem; margin-bottom: 1rem;">
                <h6 style="margin: 0 0 0.5rem 0; color: #495057; font-size: 0.875rem;">Recent Activity</h6>
                <div style="font-size: 0.8125rem; color: #6c757d; margin-bottom: 0.5rem;">• Item updated 2 min ago</div>
                <div style="font-size: 0.8125rem; color: #6c757d; margin-bottom: 0.5rem;">• New comment added</div>
                <div style="font-size: 0.8125rem; color: #6c757d;">• Status changed</div>
              </div>
              
              <div style="background: white; border: 1px solid #e9ecef; border-radius: 6px; padding: 1rem;">
                <h6 style="margin: 0 0 0.5rem 0; color: #495057; font-size: 0.875rem;">Related Links</h6>
                <a href="#" style="display: block; color: #007bff; text-decoration: none; font-size: 0.8125rem; margin-bottom: 0.25rem;">Documentation</a>
                <a href="#" style="display: block; color: #007bff; text-decoration: none; font-size: 0.8125rem; margin-bottom: 0.25rem;">API Reference</a>
                <a href="#" style="display: block; color: #007bff; text-decoration: none; font-size: 0.8125rem;">Support</a>
              </div>
            </div>
          </ui-supporting-pane-layout>
        </div>
      </section>

      <!-- NEW LAYOUT CONTAINERS -->
      
      <!-- Grid Container -->
      <section style="margin-bottom: 3rem;">
        <h3>Grid Container (New)</h3>
        
        <!-- Responsive Grid -->
        <div style="margin-bottom: 2rem;">
          <h4>Responsive Grid</h4>
          <ui-grid-container 
            [columns]="12"
            [responsive]="responsiveConfig()"
            gap="md"
            [debugMode]="showGridDebug()">
            <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 1rem; border-radius: 8px; text-align: center; grid-column: span 6;">
              <h6 style="margin: 0 0 0.5rem 0;">Span 6 Columns</h6>
              <p style="margin: 0; opacity: 0.9; font-size: 0.875rem;">Responsive: mobile 12, tablet 6, desktop 6</p>
            </div>
            <div style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); color: white; padding: 1rem; border-radius: 8px; text-align: center; grid-column: span 3;">
              <h6 style="margin: 0 0 0.5rem 0;">Span 3</h6>
              <p style="margin: 0; opacity: 0.9; font-size: 0.875rem;">Quarter width</p>
            </div>
            <div style="background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); color: white; padding: 1rem; border-radius: 8px; text-align: center; grid-column: span 3;">
              <h6 style="margin: 0 0 0.5rem 0;">Span 3</h6>
              <p style="margin: 0; opacity: 0.9; font-size: 0.875rem;">Quarter width</p>
            </div>
            <div style="background: linear-gradient(135deg, #fa709a 0%, #fee140 100%); color: white; padding: 1rem; border-radius: 8px; text-align: center; grid-column: span 4;">
              <h6 style="margin: 0 0 0.5rem 0;">Span 4</h6>
              <p style="margin: 0; opacity: 0.9; font-size: 0.875rem;">One third width</p>
            </div>
            <div style="background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%); color: #333; padding: 1rem; border-radius: 8px; text-align: center; grid-column: span 8;">
              <h6 style="margin: 0 0 0.5rem 0;">Span 8</h6>
              <p style="margin: 0; opacity: 0.9; font-size: 0.875rem;">Two thirds width</p>
            </div>
          </ui-grid-container>
        </div>

        <!-- Auto-Fit Grid -->
        <div style="margin-bottom: 2rem;">
          <h4>Auto-Fit Grid</h4>
          <ui-grid-container 
            [autoFit]="true"
            minItemWidth="200px"
            gap="lg">
            @for (item of gridItems(); track item.id) {
              <div [style]="'background: ' + item.color + '; color: white; padding: 1.5rem; border-radius: 8px; text-align: center;'">
                <h6 style="margin: 0 0 0.5rem 0;">{{ item.title }}</h6>
                <p style="margin: 0; opacity: 0.9; font-size: 0.875rem;">{{ item.description }}</p>
              </div>
            }
          </ui-grid-container>
        </div>

        <div style="display: flex; gap: 1rem; margin-bottom: 1rem;">
          <button 
            style="padding: 0.5rem 1rem; background: #17a2b8; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleGridDebug()">
            {{ showGridDebug() ? 'Hide' : 'Show' }} Grid Debug
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #6f42c1; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="addGridItem()">
            Add Grid Item
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #dc3545; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="removeGridItem()">
            Remove Grid Item
          </button>
        </div>
      </section>

      <!-- Tab Container -->
      <section style="margin-bottom: 3rem;">
        <h3>Tab Container (New)</h3>
        
        <div style="margin-bottom: 2rem;">
          <h4>Horizontal Tabs</h4>
          <div style="height: 300px; border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden;">
            <ui-tab-container 
              [tabs]="tabItems"
              [activeTabId]="activeTabId"
              orientation="horizontal"
              variant="underline"
              size="md"
              [allowTabClose]="true"
              [showAddButton]="true"
              [animateTransitions]="true"
              (tabChange)="onTabChange($event)"
              (tabClose)="onTabClose($event)"
              (tabAdd)="onTabAdd()">
              
              <div slot="dashboard" style="padding: 1.5rem;">
                <h5 style="margin: 0 0 1rem 0; color: #495057;">Dashboard Content</h5>
                <p style="color: #6c757d; margin-bottom: 1rem;">This is the dashboard tab content with some sample data and metrics.</p>
                <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem;">
                  <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px; text-align: center;">
                    <div style="font-size: 1.5rem; font-weight: bold; color: #007bff;">123</div>
                    <div style="font-size: 0.875rem; color: #6c757d;">Users</div>
                  </div>
                  <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px; text-align: center;">
                    <div style="font-size: 1.5rem; font-weight: bold; color: #28a745;">$4,567</div>
                    <div style="font-size: 0.875rem; color: #6c757d;">Revenue</div>
                  </div>
                </div>
              </div>
              
              <div slot="analytics" style="padding: 1.5rem;">
                <h5 style="margin: 0 0 1rem 0; color: #495057;">Analytics Content</h5>
                <p style="color: #6c757d; margin-bottom: 1rem;">Analytics data and charts would be displayed here.</p>
                <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 6px; text-align: center;">
                  <div style="font-size: 3rem; margin-bottom: 0.5rem;">📊</div>
                  <div style="color: #6c757d;">Charts and graphs</div>
                </div>
              </div>
              
              <div slot="settings" style="padding: 1.5rem;">
                <h5 style="margin: 0 0 1rem 0; color: #495057;">Settings Content</h5>
                <p style="color: #6c757d; margin-bottom: 1rem;">Application settings and preferences.</p>
                <div style="display: flex; flex-direction: column; gap: 1rem;">
                  <div style="display: flex; justify-content: space-between; align-items: center; padding: 0.75rem; background: #f8f9fa; border-radius: 6px;">
                    <span>Enable notifications</span>
                    <input type="checkbox" checked>
                  </div>
                  <div style="display: flex; justify-content: space-between; align-items: center; padding: 0.75rem; background: #f8f9fa; border-radius: 6px;">
                    <span>Dark mode</span>
                    <input type="checkbox">
                  </div>
                </div>
              </div>
            </ui-tab-container>
          </div>
        </div>

        <!-- Vertical Pills Tabs -->
        <div style="margin-bottom: 2rem;">
          <h4>Vertical Pills Tabs</h4>
          <div style="height: 300px; border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden;">
            <ui-tab-container 
              [tabs]="verticalTabItems"
              [activeTabId]="activeVerticalTabId"
              orientation="vertical"
              variant="pills"
              size="sm"
              (tabChange)="onVerticalTabChange($event)">
              
              <div slot="profile" style="padding: 1.5rem;">
                <h6 style="margin: 0 0 1rem 0;">Profile Information</h6>
                <div style="display: flex; align-items: center; margin-bottom: 1rem;">
                  <div style="width: 60px; height: 60px; background: #007bff; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.5rem; margin-right: 1rem;">
                    👤
                  </div>
                  <div>
                    <div style="font-weight: 600;">John Doe</div>
                    <div style="color: #6c757d; font-size: 0.875rem;">john.doe&#64;example.com</div>
                  </div>
                </div>
              </div>
              
              <div slot="account" style="padding: 1.5rem;">
                <h6 style="margin: 0 0 1rem 0;">Account Settings</h6>
                <div style="space-y: 0.5rem;">
                  <div style="margin-bottom: 0.75rem;">
                    <label style="display: block; font-size: 0.875rem; color: #6c757d; margin-bottom: 0.25rem;">Email</label>
                    <input style="width: 100%; padding: 0.5rem; border: 1px solid #e9ecef; border-radius: 4px;" value="john.doe@example.com">
                  </div>
                  <div>
                    <label style="display: block; font-size: 0.875rem; color: #6c757d; margin-bottom: 0.25rem;">Phone</label>
                    <input style="width: 100%; padding: 0.5rem; border: 1px solid #e9ecef; border-radius: 4px;" value="+1 (555) 123-4567">
                  </div>
                </div>
              </div>
              
              <div slot="security" style="padding: 1.5rem;">
                <h6 style="margin: 0 0 1rem 0;">Security Settings</h6>
                <div style="display: flex; flex-direction: column; gap: 0.75rem;">
                  <div style="display: flex; justify-content: space-between; align-items: center;">
                    <span style="font-size: 0.875rem;">Two-factor authentication</span>
                    <span style="background: #28a745; color: white; padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.75rem;">Enabled</span>
                  </div>
                  <div style="display: flex; justify-content: space-between; align-items: center;">
                    <span style="font-size: 0.875rem;">Login alerts</span>
                    <input type="checkbox" checked>
                  </div>
                </div>
              </div>
            </ui-tab-container>
          </div>
        </div>
      </section>

      <!-- Scroll Container -->
      <section style="margin-bottom: 3rem;">
        <h3>Scroll Container (New)</h3>
        
        <!-- Virtual Scrolling -->
        <div style="margin-bottom: 2rem;">
          <h4>Virtual Scrolling (Large Dataset)</h4>
          <div style="height: 300px; border: 1px solid #e9ecef; border-radius: 8px;">
            <ui-scroll-container
              [virtualScrolling]="true"
              [virtualConfig]="virtualConfig()"
              [items]="largeDataset()"
              direction="vertical"
              [showScrollIndicators]="true"
              (scroll)="onScroll($event)">
              
              <ng-template #itemTemplate let-item let-index="index">
                <div style="display: flex; align-items: center; padding: 0.75rem 1rem; border-bottom: 1px solid #f1f1f1;">
                  <div [style]="'width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; margin-right: 1rem; background: ' + item.color">
                    {{ item.avatar }}
                  </div>
                  <div style="flex: 1;">
                    <div style="font-weight: 500; color: #495057;">{{ item.name }}</div>
                    <div style="font-size: 0.875rem; color: #6c757d;">{{ item.email }}</div>
                  </div>
                  <div style="text-align: right;">
                    <div style="font-size: 0.875rem; color: #6c757d;">#{{ index + 1 }}</div>
                  </div>
                </div>
              </ng-template>
            </ui-scroll-container>
          </div>
        </div>

        <!-- Regular Scrolling with Custom Scrollbars -->
        <div style="margin-bottom: 2rem;">
          <h4>Custom Scrollbars</h4>
          <div style="height: 200px; border: 1px solid #e9ecef; border-radius: 8px;">
            <ui-scroll-container
              direction="both"
              [customScrollbars]="true"
              [showScrollIndicators]="false">
              <div style="width: 800px; height: 400px; background: linear-gradient(45deg, #667eea, #764ba2); color: white; padding: 2rem; border-radius: 8px;">
                <h5 style="margin: 0 0 1rem 0;">Large Content Area</h5>
                <p style="margin-bottom: 1rem;">This content area is larger than the container, so it will show custom scrollbars.</p>
                <p style="margin-bottom: 1rem;">You can scroll both horizontally and vertically to see all the content.</p>
                <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-top: 2rem;">
                  @for (item of Array(8).fill(0); track $index) {
                    <div style="background: rgba(255,255,255,0.2); padding: 1rem; border-radius: 6px; text-align: center;">
                      <div style="font-weight: 600;">Item {{ $index + 1 }}</div>
                      <div style="font-size: 0.875rem; opacity: 0.8;">Sample data</div>
                    </div>
                  }
                </div>
              </div>
            </ui-scroll-container>
          </div>
        </div>
      </section>

      <!-- Loading State Container -->
      <section style="margin-bottom: 3rem;">
        <h3>Loading State Container (New)</h3>
        
        <div style="display: flex; gap: 1rem; margin-bottom: 1rem; flex-wrap: wrap;">
          <button 
            style="padding: 0.5rem 1rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="setLoadingState('loading')">
            Show Loading
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="setLoadingState('success')">
            Show Success
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #dc3545; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="setLoadingState('error')">
            Show Error
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #6c757d; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="setLoadingState('idle')">
            Reset to Idle
          </button>
          <select 
            style="padding: 0.5rem; border: 1px solid #e9ecef; border-radius: 4px;"
            (change)="changeLoadingVariant($event)">
            <option value="spinner">Spinner</option>
            <option value="skeleton">Skeleton</option>
            <option value="pulse">Pulse</option>
            <option value="shimmer">Shimmer</option>
          </select>
        </div>

        <div style="height: 300px; border: 1px solid #e9ecef; border-radius: 8px; overflow: hidden;">
          <ui-loading-state-container
            [state]="loadingState()"
            [config]="loadingConfig"
            [error]="errorState"
            [showRetryButton]="true"
            [showErrorDetails]="true"
            (retryClicked)="onLoadingRetry()"
            (cancel)="onLoadingCancel()">
            
            <!-- Main content -->
            <div style="padding: 2rem; height: 100%;">
              <h5 style="margin: 0 0 1rem 0; color: #495057;">Sample Content</h5>
              <p style="color: #6c757d; margin-bottom: 1.5rem;">
                This content can be in various loading states. Use the buttons above to simulate different states.
              </p>
              <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem;">
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px;">
                  <h6 style="margin: 0 0 0.5rem 0;">Data Item 1</h6>
                  <p style="margin: 0; font-size: 0.875rem; color: #6c757d;">Sample data content</p>
                </div>
                <div style="background: #f8f9fa; padding: 1rem; border-radius: 6px;">
                  <h6 style="margin: 0 0 0.5rem 0;">Data Item 2</h6>
                  <p style="margin: 0; font-size: 0.875rem; color: #6c757d;">More sample content</p>
                </div>
              </div>
            </div>
            
            <!-- Custom skeleton template -->
            <ng-template #skeleton>
              <div style="padding: 2rem;">
                <div style="height: 24px; background: #e9ecef; border-radius: 4px; margin-bottom: 1rem; animation: skeleton-pulse 1.5s ease-in-out infinite;"></div>
                <div style="height: 16px; background: #e9ecef; border-radius: 4px; width: 80%; margin-bottom: 1.5rem; animation: skeleton-pulse 1.5s ease-in-out infinite;"></div>
                <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem;">
                  <div style="height: 80px; background: #e9ecef; border-radius: 6px; animation: skeleton-pulse 1.5s ease-in-out infinite;"></div>
                  <div style="height: 80px; background: #e9ecef; border-radius: 6px; animation: skeleton-pulse 1.5s ease-in-out infinite;"></div>
                </div>
              </div>
            </ng-template>
          </ui-loading-state-container>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Dashboard Shell Layout:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-dashboard-shell-layout 
  [sidebarCollapsed]="collapsed"
  [showFooter]="true"&gt;
  &lt;div slot="header"&gt;Header Content&lt;/div&gt;
  &lt;nav slot="sidebar"&gt;Navigation&lt;/nav&gt;
  &lt;div slot="main"&gt;Main Content&lt;/div&gt;
  &lt;div slot="footer"&gt;Footer Content&lt;/div&gt;
&lt;/ui-dashboard-shell-layout&gt;</code></pre>
          
          <h4>Widget Grid Layout:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-widget-grid-layout 
  gridSize="md" 
  [autoFit]="true"&gt;
  &lt;ui-widget-container&gt;
    &lt;div&gt;Widget Content&lt;/div&gt;
  &lt;/ui-widget-container&gt;
&lt;/ui-widget-grid-layout&gt;</code></pre>

          <h4>Bento Grid Layout:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-bento-grid-layout 
  variant="balanced" 
  [adaptive]="true"&gt;
  &lt;div&gt;Grid Item 1&lt;/div&gt;
  &lt;div&gt;Grid Item 2&lt;/div&gt;
  &lt;div&gt;Grid Item 3&lt;/div&gt;
&lt;/ui-bento-grid-layout&gt;</code></pre>

          <h4>List Detail Layout:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-list-detail-layout&gt;
  &lt;div slot="list"&gt;
    List of items
  &lt;/div&gt;
  &lt;div slot="detail"&gt;
    Selected item details
  &lt;/div&gt;
&lt;/ui-list-detail-layout&gt;</code></pre>
        </div>
      </section>

      <!-- Interactive Controls -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Controls</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button 
            style="padding: 0.5rem 1rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleSidebar()"
          >
            {{ sidebarCollapsed() ? 'Expand' : 'Collapse' }} Sidebar
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleFooter()"
          >
            {{ showFooter() ? 'Hide' : 'Show' }} Footer
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #6f42c1; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="resetSelection()"
          >
            Reset List Selection
          </button>
        </div>
        
        @if (lastAction()) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last action:</strong> {{ lastAction() }}
          </div>
        }
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }

    button {
      transition: all 0.2s ease-in-out;
    }

    button:hover {
      opacity: 0.9;
      transform: translateY(-1px);
    }
  `]
})
export class LayoutDemoComponent {
  // Original properties
  sidebarCollapsed = signal<boolean>(false);
  showFooter = signal<boolean>(false);
  selectedItem = signal<number>(0);
  lastAction = signal<string>('');

  // Grid Container properties
  showGridDebug = signal<boolean>(false);
  responsiveConfig = signal<GridResponsiveConfig>({
    mobile: 1,
    tablet: 2,
    desktop: 3,
    wide: 4
  });
  
  gridItems = signal([
    { id: 1, title: 'Dynamic Item 1', description: 'Auto-fit grid item', color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' },
    { id: 2, title: 'Dynamic Item 2', description: 'Responsive layout', color: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)' },
    { id: 3, title: 'Dynamic Item 3', description: 'Grid container', color: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)' },
    { id: 4, title: 'Dynamic Item 4', description: 'Flexible grid', color: 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)' }
  ]);

  // Tab Container properties
  tabItems = signal<TabItem[]>([
    { id: 'dashboard', label: 'Dashboard', icon: '📊', badge: '3' },
    { id: 'analytics', label: 'Analytics', icon: '📈', closeable: true },
    { id: 'settings', label: 'Settings', icon: '⚙️', closeable: true }
  ]);
  
  activeTabId = signal<string>('dashboard');
  
  verticalTabItems = signal<TabItem[]>([
    { id: 'profile', label: 'Profile', icon: '👤' },
    { id: 'account', label: 'Account', icon: '🔧' },
    { id: 'security', label: 'Security', icon: '🔒' }
  ]);
  
  activeVerticalTabId = signal<string>('profile');

  // Scroll Container properties
  virtualConfig = signal<VirtualScrollConfig>({
    itemHeight: 60,
    bufferSize: 10
  });

  largeDataset = signal(this.generateLargeDataset(1000));

  // Loading State Container properties
  loadingState = signal<LoadingState>('idle');
  loadingConfig = signal({
    variant: 'spinner' as const,
    size: 'md' as const,
    message: 'Loading data...',
    showProgress: false,
    progress: 0
  });
  
  errorState = signal<ErrorState | null>(null);

  // Utility property
  Array = Array;

  toggleSidebar(): void {
    this.sidebarCollapsed.set(!this.sidebarCollapsed());
    this.lastAction.set(`Sidebar ${this.sidebarCollapsed() ? 'collapsed' : 'expanded'}`);
    console.log(`Sidebar ${this.sidebarCollapsed() ? 'collapsed' : 'expanded'}`);
  }

  toggleFooter(): void {
    this.showFooter.set(!this.showFooter());
    this.lastAction.set(`Footer ${this.showFooter() ? 'shown' : 'hidden'}`);
    console.log(`Footer ${this.showFooter() ? 'shown' : 'hidden'}`);
  }

  selectItem(itemId: number): void {
    this.selectedItem.set(itemId);
    this.lastAction.set(`Selected item ${itemId}`);
    console.log(`Selected item ${itemId}`);
  }

  resetSelection(): void {
    this.selectedItem.set(0);
    this.lastAction.set('Selection reset');
    console.log('Selection reset');
  }

  // New container methods

  // Grid Container methods
  toggleGridDebug(): void {
    this.showGridDebug.set(!this.showGridDebug());
    this.lastAction.set(`Grid debug ${this.showGridDebug() ? 'enabled' : 'disabled'}`);
  }

  addGridItem(): void {
    const colors = [
      'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
      'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)',
      'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)',
      'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)',
      'linear-gradient(135deg, #fa709a 0%, #fee140 100%)',
      'linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)'
    ];
    
    const currentItems = this.gridItems();
    const newId = Math.max(...currentItems.map(i => i.id)) + 1;
    const newItem = {
      id: newId,
      title: `Dynamic Item ${newId}`,
      description: `Added item #${newId}`,
      color: colors[newId % colors.length]
    };
    
    this.gridItems.set([...currentItems, newItem]);
    this.lastAction.set(`Added grid item ${newId}`);
  }

  removeGridItem(): void {
    const currentItems = this.gridItems();
    if (currentItems.length > 1) {
      this.gridItems.set(currentItems.slice(0, -1));
      this.lastAction.set('Removed last grid item');
    }
  }

  // Tab Container methods
  onTabChange(event: any): void {
    this.activeTabId.set(event.activeTab.id);
    this.lastAction.set(`Switched to tab: ${event.activeTab.label}`);
    console.log('Tab changed:', event);
  }

  onTabClose(event: any): void {
    const tabs = this.tabItems();
    const updatedTabs = tabs.filter(tab => tab.id !== event.tab.id);
    this.tabItems.set(updatedTabs);
    
    // Switch to first available tab if current active tab was closed
    if (event.tab.id === this.activeTabId() && updatedTabs.length > 0) {
      this.activeTabId.set(updatedTabs[0].id);
    }
    
    this.lastAction.set(`Closed tab: ${event.tab.label}`);
    console.log('Tab closed:', event);
  }

  onTabAdd(): void {
    const currentTabs = this.tabItems();
    const newTabId = `tab-${Date.now()}`;
    const newTab: TabItem = {
      id: newTabId,
      label: `New Tab ${currentTabs.length + 1}`,
      icon: '📄',
      closeable: true
    };
    
    this.tabItems.set([...currentTabs, newTab]);
    this.activeTabId.set(newTabId);
    this.lastAction.set(`Added new tab: ${newTab.label}`);
    console.log('Tab added:', newTab);
  }

  onVerticalTabChange(event: any): void {
    this.activeVerticalTabId.set(event.activeTab.id);
    this.lastAction.set(`Switched to vertical tab: ${event.activeTab.label}`);
    console.log('Vertical tab changed:', event);
  }

  // Scroll Container methods
  onScroll(event: any): void {
    // Only log occasionally to avoid spam
    if (Math.random() < 0.1) {
      console.log('Scroll event:', event);
    }
  }

  generateLargeDataset(size: number): any[] {
    const names = ['John Doe', 'Jane Smith', 'Mike Johnson', 'Sarah Wilson', 'Tom Brown', 'Lisa Garcia', 'David Miller', 'Emily Davis'];
    const colors = ['#007bff', '#28a745', '#ffc107', '#dc3545', '#6f42c1', '#20c997', '#fd7e14', '#17a2b8'];
    const avatars = ['👨', '👩', '🧑', '👴', '👵', '👦', '👧', '🧒'];
    
    return Array.from({ length: size }, (_, i) => ({
      id: i + 1,
      name: `${names[i % names.length]} ${Math.floor(i / names.length) + 1}`,
      email: `user${i + 1}@example.com`,
      color: colors[i % colors.length],
      avatar: avatars[i % avatars.length]
    }));
  }

  // Loading State Container methods
  setLoadingState(state: LoadingState): void {
    this.loadingState.set(state);
    
    if (state === 'error') {
      this.errorState.set({
        message: 'Failed to load data from the server.',
        code: 'NETWORK_ERROR',
        details: { timestamp: new Date().toISOString(), endpoint: '/api/data' },
        retryable: true
      });
    } else {
      this.errorState.set(null);
    }
    
    this.lastAction.set(`Loading state changed to: ${state}`);
    console.log('Loading state changed:', state);
  }

  changeLoadingVariant(event: Event): void {
    const target = event.target as HTMLSelectElement;
    const variant = target.value as any;
    
    this.loadingConfig.update(config => ({
      ...config,
      variant,
      message: `Loading with ${variant} variant...`
    }));
    
    this.lastAction.set(`Loading variant changed to: ${variant}`);
    console.log('Loading variant changed:', variant);
  }

  onLoadingRetry(): void {
    this.lastAction.set('Retry button clicked');
    this.setLoadingState('loading');
    
    // Simulate retry process
    setTimeout(() => {
      this.setLoadingState('success');
    }, 2000);
    
    console.log('Loading retry triggered');
  }

  onLoadingCancel(): void {
    this.lastAction.set('Loading cancelled');
    this.setLoadingState('idle');
    console.log('Loading cancelled');
  }
}p
xm	Ny%E)>%y@1<
EEE%%:?2Nd|ď<>)y`&w2JMf\(.YYTR\㜟>q%

iE
%Jr2u272z D;ϵxU export * from './container';
export * from './grid-system';
export * from './spacer';E xX͎0>Tn^؅C.}'"a^q@HH gOЗy1[͍8AeI
/u==S
JZ$hg {ƨfupK&3@ʟTR&}jH0'U[l LI,zvle(Ƀ⍲V@gK]TELD$Hb8rŕNelaoq<xc+0
*pAIp	b*5탽	coyR7`֎Ei"ww$#qQpg
 87DX` 9{]k9k9] qJҘVj?&j"?0¸F4=+7ESL)3*825NI!NLeTŐp~&C* 7\0a遟K{T(;v:'Q!%!=ڐIzn2ZtDx7ipn=8k8FqC䔥s$I)zs+iIbfSnR/8	Q"W7j$_&-hre-_ۊ#êp`u':`\@7Uk^`Id55Ŋp]PiIScoo1qdm.N>Z	T]?
aɕe<zwR`[X.$4Q4BI^D&tk.pعFEcHNOͯWYCa 8MVǌi=`ܤk`<jۛ)^J'Y;	S\?ߐY9)j|z6V87Aɰ+5u4]oƼPh`Fᆍ2a{7FF|FwV۷.߻\Tӫi6vcbGֹOOO[[i^xUoEEdQ*(iͨmB]2qmU	BRNv̬SE Gā#R!rx3k/M%qyf;;TP+1*î^WiUWEZxoȵ~^_&,Zs*W#*	%[s\Hsi~
_\ݭlwU=LE]ygK2_3o<q.ђE*akYߞ}>_6K>}o-wO6GJoA×N:_}Eў	|\ջf!q<1+I45[C/*.b-$'2Ϣ{{^ב&7'}"e7ۺ5$ye9虼ӃTi1שd(񙈆Ģ!z;2Ñ~yamQ5">6-+aH~ɸ˪]xѩ[Pn3c"PD4p:qq:9"T<EBƕ^:<Z2:h6jYRk;#	E{hP$br\2sl+,xD	UƂmIsDժ
Qןo/,}}S]KoэWiT<<tήc0G`9[I{R46յ_jKET;b`TlEd>yZ$Qa>Sl6Hj	_9sA}CymA92=gꙟsf`y%ip11z8ȅLNA~&YΝngGLs\Bc>U2XSfLQb8bGW$RMqvavYt&CfKsI'B	2YQmF3|ڋVuQB_ l^1iۇ\%1N	'7-p
/B-/9۽HCPK:?5W-fZv'yj';vv
˪dG'9}v//px$ 		<6*&GvQ"t5x %		(fZ"> [LQޒ#_DH<gJrno-\7Ȝ\aÞ`¶|Sئ.8B,Ϸ&e
:TnP!@l~Qфũ7QʷQt-$sf 2S7?_y)u
)+ +b/^YBB&7Ŭ'H$_9xc@use "../../../../ui-design-system/src/styles/semantic/index" as *;

.bento-grid {
  display: grid;
  gap: $semantic-spacing-4;
  padding: $semantic-spacing-4;
  transition: 
    grid-template-columns $semantic-motion-duration-normal $semantic-motion-easing-ease-in-out,
    grid-template-rows $semantic-motion-duration-normal $semantic-motion-easing-ease-in-out,
    gap $semantic-motion-duration-fast $semantic-motion-easing-ease-out;

  // Mobile: Single column for all variants
  grid-template-columns: 1fr;
  grid-auto-rows: minmax(200px, auto);

  // Tablet: 2x2 base grid
  @media (min-width: $semantic-breakpoint-sm) {
    grid-template-columns: repeat(2, 1fr);
    gap: $semantic-spacing-5;
    padding: $semantic-spacing-5;
  }

  // Desktop: Full bento layouts
  @media (min-width: $semantic-breakpoint-lg) {
    gap: $semantic-spacing-6;
    padding: $semantic-spacing-6;
    grid-auto-rows: minmax(240px, auto);
  }

  @media (min-width: $semantic-sizing-breakpoint-wide) {
    gap: $semantic-spacing-8;
    padding: $semantic-spacing-8;
  }
}

// Balanced variant: Even distribution
.bento-grid--balanced {
  @media (min-width: $semantic-breakpoint-lg) {
    grid-template-columns: repeat(4, 1fr);
    grid-template-rows: repeat(3, 1fr);
  }
  
  @media (min-width: $semantic-sizing-breakpoint-wide) {
    grid-template-columns: repeat(6, 1fr);
    grid-template-rows: repeat(4, 1fr);
  }
}

// Asymmetric variant: Varied cell sizes
.bento-grid--asymmetric {
  @media (min-width: $semantic-breakpoint-lg) {
    grid-template-columns: repeat(12, 1fr);
    grid-template-rows: repeat(6, minmax(120px, 1fr));
  }
}

// Masonry variant: Pinterest-style
.bento-grid--masonry {
  @media (min-width: $semantic-breakpoint-lg) {
    grid-template-columns: repeat(4, 1fr);
    grid-auto-rows: 120px;
  }
  
  @media (min-width: $semantic-sizing-breakpoint-wide) {
    grid-template-columns: repeat(5, 1fr);
  }
}

// Grid item base styles
.bento-grid > * {
  background-color: var(--color-background-surface, #fff);
  border: 1px solid var(--color-border-subtle, #e5e7eb);
  border-radius: $semantic-border-radius-lg;
  overflow: hidden;
  transition: 
    transform $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    box-shadow $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    border-color $semantic-motion-duration-fast $semantic-motion-easing-ease-out;

  &:hover {
    transform: $semantic-motion-hover-transform-lift-sm;
    box-shadow: $semantic-shadow-lg;
    border-color: var(--color-border-primary, #d1d5db);
  }

  // Stagger animation on load
  @for $i from 1 through 20 {
    &:nth-child(#{$i}) {
      animation: bentoSlideIn $semantic-motion-duration-normal $semantic-motion-easing-ease-out;
      animation-delay: calc(#{$semantic-motion-transition-delay-100} * #{$i});
      animation-fill-mode: both;
    }
  }
}

// Span utility classes for grid positioning
.bento-grid {
  // Column spans
  ::ng-deep [data-bento-span-col="2"] {
    @media (min-width: $semantic-breakpoint-sm) {
      grid-column: span 2;
    }
  }
  
  ::ng-deep [data-bento-span-col="3"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-column: span 3;
    }
  }
  
  ::ng-deep [data-bento-span-col="4"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-column: span 4;
    }
  }
  
  // Row spans
  ::ng-deep [data-bento-span-row="2"] {
    @media (min-width: $semantic-breakpoint-sm) {
      grid-row: span 2;
    }
  }
  
  ::ng-deep [data-bento-span-row="3"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-row: span 3;
    }
  }

  // Featured item (large)
  ::ng-deep [data-bento-featured="true"] {
    @media (min-width: $semantic-breakpoint-sm) {
      grid-column: span 2;
      grid-row: span 2;
    }
    
    @media (min-width: $semantic-breakpoint-lg) {
      grid-column: span 3;
      grid-row: span 2;
    }
  }

  // Wide item
  ::ng-deep [data-bento-wide="true"] {
    @media (min-width: $semantic-breakpoint-sm) {
      grid-column: span 2;
    }
    
    @media (min-width: $semantic-breakpoint-lg) {
      grid-column: span 4;
    }
  }

  // Tall item
  ::ng-deep [data-bento-tall="true"] {
    @media (min-width: $semantic-breakpoint-sm) {
      grid-row: span 2;
    }
    
    @media (min-width: $semantic-breakpoint-lg) {
      grid-row: span 3;
    }
  }
}

// Asymmetric preset layouts
.bento-grid--asymmetric {
  ::ng-deep [data-bento-area="hero"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-area: 1 / 1 / 3 / 7;
    }
  }
  
  ::ng-deep [data-bento-area="sidebar"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-area: 1 / 7 / 4 / 13;
    }
  }
  
  ::ng-deep [data-bento-area="feature-1"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-area: 3 / 1 / 5 / 5;
    }
  }
  
  ::ng-deep [data-bento-area="feature-2"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-area: 3 / 5 / 5 / 7;
    }
  }
  
  ::ng-deep [data-bento-area="bottom-left"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-area: 5 / 1 / 7 / 4;
    }
  }
  
  ::ng-deep [data-bento-area="bottom-center"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-area: 5 / 4 / 6 / 7;
    }
  }
  
  ::ng-deep [data-bento-area="bottom-right"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-area: 4 / 7 / 7 / 13;
    }
  }
}

// Adaptive sizing for content
.bento-grid[data-adaptive="true"] > * {
  // Ensure minimum content area
  min-height: 160px;
  padding: $semantic-spacing-4;
  
  @media (min-width: $semantic-breakpoint-lg) {
    min-height: 200px;
    padding: $semantic-spacing-6;
  }
  
  // Scale content based on grid area size
  &[data-bento-featured="true"],
  &[data-bento-span-col="2"][data-bento-span-row="2"] {
    padding: $semantic-spacing-6;
    
    @media (min-width: $semantic-breakpoint-lg) {
      padding: $semantic-spacing-8;
    }
  }
}

// Animation keyframes
@keyframes bentoSlideIn {
  from {
    opacity: 0;
    transform: translateY($semantic-spacing-6) scale(0.95);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

// Responsive gap adjustments
@media (max-width: $semantic-breakpoint-sm) {
  .bento-grid {
    gap: $semantic-spacing-3;
    padding: $semantic-spacing-3;
  }
}Ʌ|*xc8Pڡ8UAIOO3RStK37*UI  4
D)xC1?widgetDɓj_
1fr;

  // Tablet: 2 columns
?4pz'Auto-fit or fixed columns based on size6H'5}

  // Auto-fit behavior (default)
  &[data-auto-fitL7auto-fit, minmax(280px, 1fr)).+ auto-fit, minmax(320px, 1fr));
    }
  }

  // Small grid size (more columns, smaller widgets)
  &.widget-grid--sm {
    @media]"md) {
  "3, 1fr)J&(+ 45, 1fr);
    }
    
    &[data-auto-fit="true"] {
  ]8 fauto-fit, minmax(200px, 1fr));
      }
    }
  }

  // Medium grid size (balanced)
  &.widget-grid--mdP/3, 1fr).+-'}
    
    &[data-auto-fit="true"] {
  ]8 auto-fit, minmax(280px, 1fr));
      }
    }
  }

  // Large grid size (fewer, larger widgets)
  &.widget-grid--lg {
    @media]"(+ 43, 1fr);
    }
    
    &[data-auto-fit="true"] {
  ]8 auto-fit, minmax(400px, 1fr));
      }
    }
  }
}

// Widget item styling (for direct children)
.widget-grid > * {
  transitiobU	J	j	slideInUp?
E75
>2lide in animation for widgets
@keyframes slideInUpSH4:;
  }
}؈LmxA$@use "../../../../ui-design-system/src/styles/semantic/index" as *;

.supporting-pane-layout {
  display: flex;
  height: 100%;
  overflow: hidden;
  background-color: var(--color-background-primary, #fafafa);
  position: relative;
  
  // Default: Right pane layout
  flex-direction: row;
  
  // Bottom pane layout
  &.supporting-pane-layout--bottom {
    flex-direction: column;
  }
  
  // Left pane layout (reverse the order)
  &.supporting-pane-layout--left {
    flex-direction: row-reverse;
  }
}

.supporting-pane-layout__main {
  flex: 1;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background-color: var(--color-background-surface, #fff);
  
  // Add border based on pane position
  .supporting-pane-layout--right & {
    border-right: 1px solid var(--color-border-subtle, #e5e7eb);
  }
  
  .supporting-pane-layout--left & {
    border-left: 1px solid var(--color-border-subtle, #e5e7eb);
  }
  
  .supporting-pane-layout--bottom & {
    border-bottom: 1px solid var(--color-border-subtle, #e5e7eb);
  }
  
  transition: 
    flex $semantic-motion-duration-normal $semantic-motion-easing-ease-in-out,
    border-color $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
}

.supporting-pane-layout__main-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: $semantic-spacing-4;
  padding: $semantic-spacing-4;
  border-bottom: 1px solid var(--color-border-subtle, #f3f4f6);
  background-color: var(--color-background-subtle, #fafafa);
  
  @media (min-width: $semantic-breakpoint-md) {
    padding: $semantic-spacing-4 $semantic-spacing-6;
  }
}

.supporting-pane-layout__main-actions {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-2;
  flex-shrink: 0;
}

.supporting-pane-layout__main-content {
  flex: 1;
  overflow: auto;
  padding: $semantic-spacing-6;
  
  @media (min-width: $semantic-breakpoint-md) {
    padding: $semantic-spacing-8;
  }
  
  // Custom scrollbar
  &::-webkit-scrollbar {
    width: 8px;
    height: 8px;
  }
  
  &::-webkit-scrollbar-track {
    background: var(--color-background-subtle, #f3f4f6);
  }
  
  &::-webkit-scrollbar-thumb {
    background: var(--color-border-primary, #d1d5db);
    border-radius: 4px;
    
    &:hover {
      background: var(--color-border-strong, #9ca3af);
    }
  }
}

.supporting-pane-layout__pane {
  background-color: var(--color-background-surface, #fff);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  z-index: $semantic-z-index-sticky;
  
  transition: 
    width $semantic-motion-duration-normal $semantic-motion-easing-ease-in-out,
    height $semantic-motion-duration-normal $semantic-motion-easing-ease-in-out,
    transform $semantic-motion-duration-normal $semantic-motion-easing-ease-out,
    opacity $semantic-motion-duration-normal $semantic-motion-easing-ease-out;
  
  // Right/Left pane sizing
  .supporting-pane-layout--right &,
  .supporting-pane-layout--left & {
    width: 320px;
    min-width: 280px;
    max-width: 50%;
    
    @media (min-width: $semantic-breakpoint-lg) {
      width: 400px;
      min-width: 350px;
    }
    
    @media (min-width: $semantic-sizing-breakpoint-wide) {
      width: 480px;
      min-width: 400px;
    }
    
    // Mobile: Full screen overlay
    @media (max-width: $semantic-breakpoint-md - 1) {
      position: fixed;
      top: 0;
      bottom: 0;
      width: 100%;
      max-width: none;
      box-shadow: $semantic-shadow-xl;
      
      &.collapsed {
        transform: translateX(100%);
        opacity: 0;
      }
    }
    
    // Desktop: Collapsible
    @media (min-width: $semantic-breakpoint-md) {
      &.collapsed {
        width: 0;
        min-width: 0;
        opacity: 0;
      }
    }
  }
  
  // Left pane positioning on mobile
  .supporting-pane-layout--left & {
    @media (max-width: $semantic-breakpoint-md - 1) {
      &.collapsed {
        transform: translateX(-100%);
      }
    }
  }
  
  // Bottom pane sizing
  .supporting-pane-layout--bottom & {
    height: 300px;
    min-height: 200px;
    max-height: 50%;
    
    @media (min-width: $semantic-breakpoint-lg) {
      height: 400px;
      min-height: 250px;
    }
    
    // Mobile: Slide up from bottom
    @media (max-width: $semantic-breakpoint-md - 1) {
      position: fixed;
      left: 0;
      right: 0;
      bottom: 0;
      height: 60%;
      max-height: none;
      box-shadow: $semantic-shadow-xl;
      border-top-left-radius: $semantic-border-radius-lg;
      border-top-right-radius: $semantic-border-radius-lg;
      
      &.collapsed {
        transform: translateY(100%);
        opacity: 0;
      }
    }
    
    // Desktop: Collapsible
    @media (min-width: $semantic-breakpoint-md) {
      &.collapsed {
        height: 0;
        min-height: 0;
        opacity: 0;
      }
    }
  }
}

.supporting-pane-layout__pane-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: $semantic-spacing-3;
  padding: $semantic-spacing-4;
  border-bottom: 1px solid var(--color-border-subtle, #f3f4f6);
  background-color: var(--color-background-subtle, #fafafa);
  flex-shrink: 0;
  
  @media (min-width: $semantic-breakpoint-md) {
    padding: $semantic-spacing-4 $semantic-spacing-5;
  }
}

.supporting-pane-layout__pane-title {
  flex: 1;
  min-width: 0;
}

.supporting-pane-layout__pane-actions {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-2;
  flex-shrink: 0;
}

.supporting-pane-layout__pane-content {
  flex: 1;
  overflow: auto;
  padding: $semantic-spacing-4;
  
  @media (min-width: $semantic-breakpoint-md) {
    padding: $semantic-spacing-5;
  }
  
  // Custom scrollbar
  &::-webkit-scrollbar {
    width: 6px;
  }
  
  &::-webkit-scrollbar-track {
    background: var(--color-background-subtle, #f3f4f6);
  }
  
  &::-webkit-scrollbar-thumb {
    background: var(--color-border-primary, #d1d5db);
    border-radius: 3px;
    
    &:hover {
      background: var(--color-border-strong, #9ca3af);
    }
  }
}

.supporting-pane-layout__pane-footer {
  padding: $semantic-spacing-4;
  border-top: 1px solid var(--color-border-subtle, #f3f4f6);
  background-color: var(--color-background-subtle, #fafafa);
  flex-shrink: 0;
  
  @media (min-width: $semantic-breakpoint-md) {
    padding: $semantic-spacing-4 $semantic-spacing-5;
  }
}

// Toggle button positioning
.supporting-pane-layout__toggle {
  position: absolute;
  z-index: $semantic-z-index-sticky;
  transition: 
    transform $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    opacity $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
  
  .supporting-pane-layout--right & {
    right: $semantic-spacing-4;
    top: 50%;
    transform: translateY(-50%);
    
    .supporting-pane-layout.pane-collapsed & {
      right: $semantic-spacing-4;
    }
  }
  
  .supporting-pane-layout--left & {
    left: $semantic-spacing-4;
    top: 50%;
    transform: translateY(-50%);
    
    .supporting-pane-layout.pane-collapsed & {
      left: $semantic-spacing-4;
    }
  }
  
  .supporting-pane-layout--bottom & {
    bottom: $semantic-spacing-4;
    right: 50%;
    transform: translateX(50%);
    
    .supporting-pane-layout.pane-collapsed & {
      bottom: $semantic-spacing-4;
    }
  }
}

// Mobile overlay backdrop when pane is open
@media (max-width: $semantic-breakpoint-md - 1) {
  .supporting-pane-layout:not(.pane-collapsed)::before {
    content: '';
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: $semantic-z-index-overlay;
    animation: backdropFadeIn $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
  }
}

// Responsive adjustments for small screens
@media (max-width: $semantic-breakpoint-sm) {
  .supporting-pane-layout__main-header,
  .supporting-pane-layout__pane-header {
    padding: $semantic-spacing-3;
  }
  
  .supporting-pane-layout__main-content,
  .supporting-pane-layout__pane-content {
    padding: $semantic-spacing-3;
  }
}

// Animation keyframes
@keyframes backdropFadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

// Focus states for accessibility
.supporting-pane-layout__toggle:focus-visible {
  outline: 2px solid var(--color-primary, #3b82f6);
  outline-offset: 2px;
}

// Resize handle for desktop
.supporting-pane-layout__pane {
  @media (min-width: $semantic-breakpoint-md) {
    position: relative;
    
    &::before {
      content: '';
      position: absolute;
      background-color: transparent;
      transition: background-color $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
      
      &:hover {
        background-color: var(--color-primary, #3b82f6);
      }
    }
    
    .supporting-pane-layout--right & {
      &::before {
        left: 0;
        top: 0;
        bottom: 0;
        width: 3px;
        cursor: col-resize;
      }
    }
    
    .supporting-pane-layout--left & {
      &::before {
        right: 0;
        top: 0;
        bottom: 0;
        width: 3px;
        cursor: col-resize;
      }
    }
    
    .supporting-pane-layout--bottom & {
      &::before {
        top: 0;
        left: 0;
        right: 0;
        height: 3px;
        cursor: row-resize;
      }
    }
  }
})qEOxPHFdashboard-shell {$.min-height: 100vh-8ff);
}

.dashboard-header {
  position: sticky;
  top: 0	fixed!/+f	r5transition: 
    box-shadow~Bo$dashboard-content {
  display: flex;2}

.dashboard-sidebar {
  width: 100%;
  max-width64/f	?	a
Q
box-shadow~B:  
  // Mobile: Hidden by default, slide in when needed
  45height: 100vh!	
BWCbox-shadow: 0 0 0 rgba(0, 0, 0, 0);
    
    &:not(.collapsed) {
  @X(0)-%Dlg;
    }
  }
  
  // Tablet and up: Always visible unless collapsed6 D(X(0);
    
    &.collapsed {
      width16;
    +  }
  }
  
  // Desktop: Full sidebar width+
	max-width72;
  }
}

.dashboard-main}B)transition: 
    margin-left~_
*;
P@}.
$8;
  }
}

.dashboard-*f	2A5_
$out;
n_// Sidebar collapsed state adjustments
.dashboard-shell.sidebar-collapsed {
  .dashboard-main {9margin-left: 0d!when sidebar>dashboard-shell:not(.sidebaropacity: 0;
    animation: fE% forwards;
  }
}

@keyframes fadeIn {ڲ_.x
>H3Ffeed-layout {$.r`}

.feed-layout__*f	r5	(HM@}
}

.feed-layout__"> // Prevent flex item from overflowing
}

.feed-layout__headerzefeed-layout__filters {O$29fafb)nDtransition: 
   z!U%d@}
}

.feed-layout__-y: auto;
  overflow-x: hidden +Smooth scrolling
  scroll-behavior: smooth;E)feed-layout__items {O#P@a}
}

// Standard feed variant
.feed-layout--standard {
  .feed-layout__items {
    display: flex;a/-p
@  }
  }
}

// Card-based feed variant
.feed-layout--card-based {
  .feed-layout__items {
    display: grid;
    gap: $semantic-/]
    // Mobile: Single column
    grid-template-columns: 1fr;
    
    // Tablet: Two columns-7sm) {
      grid-template-columns: repeat(2, 1fr);
    	Three columns-+grid-template-columns: repeat(3, 1fr);
    @Large desktop: Four columns"] grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    }
  }
}

// Compact feed variant
.feed-layout--compact {
  .fe%ed-layout__items {
    display: flex;a/p
63;
    }
  }
}

// Loading state
.feed-layout__loading-8center!48;
  
  // Animate loading appearance
  animation: fGA}

// Load more section
.feed-layout__load-more {
  display: flexcenter!$hf	
  transition: 
   z!QlT    
  &:hover {
  539fafb);
  }
}

// Empty state
.feed-layout__empty {$.8center!G12;
  text-align: center;
  min-height: 400px;
  
  animation: fadeInUp~_
$ out;
}

// Footer
.feed-layout__,*f	2%d@j}
}

// Feed items animation (staggered appearance)
.feed-layout__items > * {
  animation: feedItemSlideIn~_
$out;
  animation-fill-mode: both;
  
  @for $i from 1 through 20 {
    &:nth-child(#{$i}) {
      animation-delay: calc(#{$semantic-motion-transition-delay-75} * #{$i});
    }
  }
}

// Infinite scroll loading indicator
.feed-layout__content.infinite-scroll {
  .feed-layout__loading {
    position: sticky;
    bottom: 0;
    @include glass-effect('frosted', $css-glass-blur-md, true, true, true)!Jtop: 0'[height: 1px;
      background: linear-gradient(
        90deg,
        transparent,
       !6,
        transparent
      );
      animation: shimme}slower linear infinite;
    }efeed-layout__header_!  align-items: stretch;
  3; Wfeed-layout__header-actions {
    justify-content: center;
  }
  
  .feed-layout__items"feed-layout__empty"8;
    min-height: 300pxf+fC@keyframes fadeInUpBA)B!0);
  }
}

@keyframes feedItemSli"BQ)B&0);
  }
}

@keyframes shimmer {
  0% {?X(-100%);
  }
  100% {?X(100%),feed-layout__content W-2px;
}~8px'H/Flist-detail-layout {$.r`!}

.list-detail-layout__toolbar {O$*f	r5	fixed!h@!}
}

.list-detail-layout__content!k
  // Mobile: Stack views, show one at a time
  flex-direction: column;
  
  // Tablet and up: Side by side5  }
}

.list-detail-layout__list {.f	?'+	a#O
Kb;

  // Mobile: Full width when visible
  width: 100%;
  
  // Tablet and up: Split based on ratio5}
  
  &.hidden-on-mobile {=DW0!Az-index: -1;
    }
  }
}

.list-detail-layout__detail {
  flex: 1-ff)~'+A5_
$+_
$out;
  
  &.hidden-on-mobile {=D0!z-index: -1;
]}
  }
}

// Split ratio variations
.list-detail-layout--30-70 {
  .list-detail-layout__list {9Swidth: 30%;
    }
  }
}

.list-detail-layout--25-75 {
  .list-detail-layout__list {9Swidth: 25%;
    }
  }
}

.list-detail-layout--40-60 {
  .list-detail-layout__list {9	B%;
    }
  }
}

// List section
.list-detail-layout__list-header {Olist-detail-layout__list R-y: auto;
  overflow-x: hidden;
}

// Detail section  
.list-detail-layout__detail4qZ+f	%d@%}
}

.list-detail-layout__back-button-8center!@borderk!md;
  transition: 
   z!Q,MN;
  
  &:hover {
  5
_  transform: $semantic-motion-hover-transform-scale-sm;
  }
  
  // Hide back button on desktop51display: none;
  }
}

.list-detail-layout__detail -y: auto;
  overflow-x: hidden!(
$W10;
  }
}

// Mobile detail view animations
.list-detail-layout.mobile-detail-view {
  49  .list-detail-layout__detail {
      animation: slideInR@
CCout;
    }
  }
}

.list-detail-layout:not(.mobile-detail-view) {
  4:  .list-detail-layout__list {
      animation: slideInLeft~_
$
out;
    }e>list-detail-layout__list-header,
  .list-detail-layout__detail6list-detail-layout__detail;*/}
}

// Smooth scrolling for content areas
.list-detail-layout__list-content,
.list-detail-layout__detail-content {
  scroll-behavior: smooth; styling.To"slideInRight {
  from {?X(100%); D>X(0);
    opacity: 1;
  }
}

@keyframes slideInLeft {
  from {?WD*X(0);
    opacity: 1;
  }
}

// Enhanced flist-detail-layout__back-button ]'gx;Cڡ8UAIOO3RStK37*ɫ  
B)x&H?dashboard-shell	min-height: 100vh;1	,Cprimary, #fff);
}

.dashboard-header {
  position: sticky;
  top: 0fixed;$5	:5transition: 
    box-shadowBPdLdashboard-content	1hidden;
}

.dashboard-sidebar {
  width: 100%;
  64;1	>?	a
Q
box-shadowG3// Mobile: Hidden by default, slide in when needed
8.height: 100vh;
  	'PAbox-shadow: 0 0 0 rgba(0, 0, 0, 0);
    
    &:not(.collapsed) {
X(0)^%lg;a.Tablet and up: Always visible unless collapsedP6 X(0);
    
width16;
      overflow: hidden;aDesktop: Full sidebar widthP+
72;
  }
}

.dashboard-main=5	(transition: 
    margin-left
?_;
PP6;
  }M.
}

.dashboard-5	:2:5
';
PdL
_// Sidebar collapsed state adjustments
.dashboard-shell.sidebar-collapsed {
  .dashboard-main {- 
  margin-left: 0]!when sidebar>dashboard-shell:not(.sidebar!opacity: 0;
    animation: fadeIn@% forwards;
  }
}

@keyframes fadeIn {ɅU]x
BH3?feedN	k`}

.feed-layout__lK!5	:5%PPLfeed-layout__"> // Prevent flex item from overflowing
}

.feed-layout__headerefeed-layout__filters&5	*9fafb)Dtransition: 
!wBNfLfeed-layout__o-y: auto;
  overflow-x: hidden +Smooth scrolling
  scroll-behavior: smooth;>0feed-layout__items%PL
_// Standard feed variant
.feed-layout--standard {
  .feed-layout__items {
    display: flex;
  /Q2$pQ6;
    }
  }
}

// Card-based feed variant
.feed-layout--card-based {
  .feed-layout__items {
    display: grid;
    gap: $sema]MSingle column
    grid-template-columns: 1fr;
    
    // Tablet: Two columns-l/    grid-template-columns: repeat(2, 1fr);
    Q5;Three columns9+grid-template-columns: repeat(3, 1fr);
    Q06;
    }
    
    // Large desktop: Four columns"V grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    }
  }
}

// Compact feed variant
.feed-layout--compact {
  .fe(ed-layout__items {
    display: flex;
  /Q2$pQ1  }
  }
}

// Loading state
.feed-layout__loading>center;98;
  
  // Animate loading appearance
  animation: fadeInB/}

// Load more section
.feed-layout__load-morejustify-content: center;6l_		!w@eT    
  &:hover {
!"19fafb);
  }
}

// Empty state
.feed-layout__empty	center;G12;
  text-align: center;
  min-height: 400px;
  
  animation: fadeInUp
B;
}

// Footer
.feed-layout__,5	:2PdL
e// Feed items animation (staggered appearance)
.feed-layout__items > * {
  animation: feedItemSlideIn
B;
  animation-fill-mode: both;
  
  @for $i from 1 through 20 {
    &:nth-child(#{$i}) {
      animation-delay: calc(#{$semantic-motion-transition-delay-75} * #{$i});
    }
  }
}

// Infinite scroll loading indicator
.feed-layout__content.infinite-scroll1 {
  .feed-layout__loading {
    position: stickyOM@include glass-effect('frosted', $css-glass-blur-md, true, true, true);
    
#!-top: 0'[height: 1px;
      background: linear-gradient(
        90deg,
        transparent,
       < 7,
        transparent
      );
      animation: shimmer
slower linear infinite;
    }efeed-layout__header {
  /  align-items: stretch;
  Q^]  
  .feed-layout__header-actions {
    justify-content: center;
  }
  
  .feed-layout__items/feed-layout__empty"8;
    min-height: 300px_+fC@keyframes fadeInUp/$semantic-spacing-6);
  }
  to {
    opacity: 1!0);
  }
}

@keyframes feedItemSli");
  }
  to {
    opacity: 1&0);
  }
}

@keyframes shimmer {
  0% {P
}
  100% {(feed-layout__content W-2px;
}5o*x	H/?list-detailN	k`}

.list-detail-layout__toolba'5	:5fixedLhLlist-detail-layout__o Aoverflow: hidden;
  
  // Mobile: Stack views, show one at a time.!
  // Tablet and up: Side by sideP55flex-direction: row;
  }
}

.list-detail-layout__list/	@?overflow: hidden/	aflex
?_
Kb;

  // Mobile: Full width when visible
  width: 100%;
  
  // Tablet and up: Split based on ratioP5-flex-shrink: 0;
  }
  
  &.hidden-on-mobile {=P)!Bz-index: -1;
    }
  }
}

.list-detail-layout__detail {
  flex: 1;1	,"primary, #fff);
  overflow: hidden/:5
}&.hidden-on-mobile {=)!z-index: -1;
      opacity: 0;
    }
  }
}

// Split ratio variations
.list-detail-layout--30-70 {
  .list-detail-layout__list {- 
U  width: 30%;
    }
  }
}

.list-detail-layout--25-75 {
  .list-detail-layout__list {- 
U  width: 25%;
    }
  }
}

.list-detail-layout--40-60 {
  .list-detail-layout__list {- 
I  width: 40%;
    }
  }
}

// List section
.list-detail-layout__list-head.vd#5;
  }
}

.list-detail-layout__listn R-y: auto;
  overflow-x: hidden;
}

// Detail section  
.list-detail-layout__detail4jZ4	;PdLlist-detail-layout__back-button>center;border!md;
  transition: 
!w@
*!)
  &:hover {
!"?
_  transform: $semantic-motion-hover-transform-scale-sm;
  }
  
  // Hide back button on desktopP51display: none;
  }
}

.list-detail-layout__detailn -y: auto;
  overflow-x: hidden;9aS(
U10;
  }
}

// Mobile detail view animations
.list-detail-layout.mobile-detail-view {
8;.list-detail-layout__detail {
      animation: slideInRight
B>;
    }
  }
}

.list-detail-layout:not(.mobile-detail-view) {
88.list-detail-layout__list {
      animation: slideInLeft
B;
    }e>list-detail-layout__list-header,
  .list-detail-layout__detail6"list-detail-layout__detail-content"}
}

// Smooth scrolling for content areas
.list-detail-layout__list-content,
.list-detail-layout__detail-content {
  scroll-behavior: smooth; styling>=h"slideInRight {
  from {opacity: 0;
  }
  to {X(0);!@keyframes slideInLeft {
  from {Popacity: 0;
  }
  to {X(0);
Enhanced flist-detail-layout__back-button ]LMzxTimport { Component, Input } from '@angular/core';
import { CommonModule } from '@angular/common';

@Component({
  selector: 'ui-list-detail-layout',
  standalone: true,
  imports: [CommonModule],
  template: `
    <div 
      class="list-detail-layout" 
      [class.mobile-detail-view]="mobileDetailView"
      [class]="'list-detail-layout--' + splitRatio"
    >
      <div class="list-detail-layout__toolbar" *ngIf="showToolbar">
        <ng-content select="[slot='toolbar']"></ng-content>
      </div>
      
      <div class="list-detail-layout__content">
        <div class="list-detail-layout__list" [class.hidden-on-mobile]="mobileDetailView">
          <div class="list-detail-layout__list-header" *ngIf="showListHeader">
            <ng-content select="[slot='list-header']"></ng-content>
          </div>
          <div class="list-detail-layout__list-content">
            <ng-content select="[slot='list']"></ng-content>
          </div>
        </div>
        
        <div class="list-detail-layout__detail" [class.hidden-on-mobile]="!mobileDetailView">
          <div class="list-detail-layout__detail-header" *ngIf="showDetailHeader">
            <div class="list-detail-layout__back-button" *ngIf="mobileDetailView">
              <ng-content select="[slot='back-button']"></ng-content>
            </div>
            <ng-content select="[slot='detail-header']"></ng-content>
          </div>
          <div class="list-detail-layout__detail-content">
            <ng-content select="[slot='detail']"></ng-content>
            <ng-content></ng-content>
          </div>
        </div>
      </div>
    </div>
  `,
  styleUrl: './list-detail-layout.component.scss'
})
export class ListDetailLayoutComponent {
  @Input() splitRatio: '30-70' | '25-75' | '40-60' = '30-70';
  @Input() mobileDetailView: boolean = false;
  @Input() showToolbar: boolean = false;
  @Input() showListHeader: boolean = true;
  @Input() showDetailHeader: boolean = true;
}e'8x}kpi-cardPhclass="kpi-card" [class]="'kpi-card--' + size">
      <div class="kpi-card__header" *ngIf="showHeader">
#title_9kpi-card__actions">
%actions_;kpi-card__content">
1kpi-card__primary"kpi-card__value*value_9kpi-card__label*label_+$3kpi-card__secondary" *ngIf="showTrend || showChart"!kpi-card__trend" *ngIf="showTrend*trend_9 kpi-card__chart" *ngIf="showChar+chart_+ &kpi-card__footer" *ngIf="showFooter">
#foot]H&kpi-cardy(KpiCard/ize: 'sm' | 'md' | 'lg' = 'md';
  @Input() showe'Trendk!Chart?"Footer: boolean = false;
}xCdashboard-shellW_dashboard-shell" [class.sidebar-collapsed]="sidebarCollapsed">
      <header class="dashboard-h8+header</header`dashboard-content">
        <aside class="dashboard-sidebar" [class.collapsed]="sidebarCollapsed(sidebar5</aside>
        
        <main class="dashboard-main(main
mainfooter class="dashboard-_footerS!dashboard-shell|(DashboardShelldebarCollapsedJ<ximport { Component, Input, OnInit, signal, computed } from '@angular/core';
import { CommonModule } from '@angular/common';

export type GridColumns = 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12;
export type GridGap = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
export type GridJustify = 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly';
export type GridAlign = 'start' | 'end' | 'center' | 'stretch' | 'baseline';

export interface GridResponsiveConfig {
  mobile?: GridColumns;
  tablet?: GridColumns;
  desktop?: GridColumns;
  wide?: GridColumns;
}

@Component({
  selector: 'ui-grid-container',
  standalone: true,
  imports: [CommonModule],
  template: `
    <div 
      class="grid-container"
      [class]="gridClasses()"
      [attr.data-columns]="effectiveColumns()"
      [attr.data-gap]="gap"
      [attr.data-justify]="justify"
      [attr.data-align]="align">
      
      <ng-content></ng-content>
      
      @if (showDebugGrid()) {
        <div class="grid-debug-overlay" 
             [attr.data-columns]="effectiveColumns()">
          @for (item of debugGridItems(); track $index) {
            <div class="debug-grid-cell">{{ $index + 1 }}</div>
          }
        </div>
      }
    </div>
  `,
  styles: [`
    .grid-container {
      display: grid;
      width: 100%;
      gap: 1rem;
    }
    
    .grid-container.debug-mode {
      border: 2px dashed #007bff;
    }
    
    .debug-grid-cell {
      background: rgba(0, 123, 255, 0.1);
      border: 1px solid #007bff;
      display: flex;
      align-items: center;
      justify-content: center;
    }
  `]
})
export class GridContainerComponent implements OnInit {
  // Grid configuration inputs
  @Input() columns: GridColumns = 12;
  @Input() responsive: GridResponsiveConfig | null = null;
  @Input() gap: GridGap = 'md';
  @Input() justify: GridJustify = 'start';
  @Input() align: GridAlign = 'stretch';
  
  // Behavior inputs
  @Input() autoFit = false; // Auto-fit columns based on min-width
  @Input() autoFill = false; // Auto-fill with available space
  @Input() minItemWidth = '200px'; // Minimum width for auto-fit/fill
  @Input() maxItemWidth = '1fr'; // Maximum width for auto-fit/fill
  
  // Debug and accessibility
  @Input() debugMode = false;
  @Input() label: string | null = null;
  @Input() description: string | null = null;

  // Reactive state
  private currentBreakpoint = signal<'mobile' | 'tablet' | 'desktop' | 'wide'>('desktop');
  
  // Computed properties
  protected effectiveColumns = computed(() => {
    if (this.autoFit || this.autoFill) {
      return 'auto';
    }
    
    if (this.responsive) {
      const breakpoint = this.currentBreakpoint();
      return this.responsive[breakpoint] ?? this.columns;
    }
    
    return this.columns;
  });
  
  protected gridClasses = computed(() => {
    const classes = ['grid-container'];
    
    if (this.autoFit) classes.push('grid-auto-fit');
    if (this.autoFill) classes.push('grid-auto-fill');
    if (this.debugMode) classes.push('debug-mode');
    
    classes.push(`gap-${this.gap}`);
    classes.push(`justify-${this.justify}`);
    classes.push(`align-${this.align}`);
    
    return classes.join(' ');
  });
  
  protected showDebugGrid = computed(() => this.debugMode);
  protected debugGridItems = computed(() => {
    const cols = this.effectiveColumns();
    if (cols === 'auto') return Array(12).fill(0); // Show 12 for auto
    return Array(typeof cols === 'number' ? cols : 12).fill(0);
  });

  ngOnInit(): void {
    this.setupBreakpointDetection();
  }

  /**
   * Sets up responsive breakpoint detection using ResizeObserver
   */
  private setupBreakpointDetection(): void {
    if (typeof window === 'undefined' || !this.responsive) return;

    const mediaQueries = {
      mobile: '(max-width: 767px)',
      tablet: '(min-width: 768px) and (max-width: 1023px)', 
      desktop: '(min-width: 1024px) and (max-width: 1439px)',
      wide: '(min-width: 1440px)'
    };

    // Set initial breakpoint
    this.updateBreakpoint(mediaQueries);

    // Listen for changes
    Object.entries(mediaQueries).forEach(([, query]) => {
      const mql = window.matchMedia(query);
      mql.addEventListener('change', () => this.updateBreakpoint(mediaQueries));
    });
  }

  /**
   * Updates the current breakpoint based on media queries
   */
  private updateBreakpoint(queries: Record<string, string>): void {
    for (const [breakpoint, query] of Object.entries(queries)) {
      if (window.matchMedia(query).matches) {
        this.currentBreakpoint.set(breakpoint as any);
        break;
      }
    }
  }
}7'x|// Layout Components Barrel Export
export * from './dashboard-shell-layout.component';
export * from './widget-grid-layout.component';
export * from './kpi-card-layout.component';
export * from './bento-grid-layout.component';
export * from './list-detail-layout.component';
export * from './feed-layout.component';
export * from './supporting-pane-layout.component';
export * from './widget-container.component';

// New Content Container Components
export * from './grid-container.component';
export * from './scroll-container.component';
export * from './tab-container.component';
export * from './loading-state-container.component';"xA@use "../../../../ui-design-system/src/styles/semantic/index" as *;

.kpi-card {
  background-color: var(--color-background-surface, #fff);
  border: 1px solid var(--color-border-subtle, #e5e7eb);
  border-radius: $semantic-border-radius-md;
  overflow: hidden;
  transition: 
    transform $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    box-shadow $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    border-color $semantic-motion-duration-fast $semantic-motion-easing-ease-out;

  &:hover {
    transform: $semantic-motion-hover-transform-lift-sm;
    box-shadow: $semantic-shadow-md;
    border-color: var(--color-border-primary, #d1d5db);
  }
}

.kpi-card__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: $semantic-spacing-4;
  border-bottom: 1px solid var(--color-border-subtle, #f3f4f6);
  background-color: var(--color-background-subtle, #fafafa);
  
  .kpi-card--sm & {
    padding: $semantic-spacing-3;
  }
  
  .kpi-card--lg & {
    padding: $semantic-spacing-5;
  }
}

.kpi-card__actions {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-2;
}

.kpi-card__content {
  padding: $semantic-spacing-6;
  
  .kpi-card--sm & {
    padding: $semantic-spacing-4;
  }
  
  .kpi-card--lg & {
    padding: $semantic-spacing-8;
  }

  // Mobile: Stack primary and secondary vertically
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-4;

  // Tablet and up: Side by side if there's secondary content
  @media (min-width: $semantic-breakpoint-md) {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: $semantic-spacing-6;
  }
}

.kpi-card__primary {
  flex: 1;
  
  // Center align on mobile
  text-align: center;
  
  @media (min-width: $semantic-breakpoint-md) {
    text-align: left;
  }
}

.kpi-card__value {
  font-size: $semantic-typography-font-size-3xl;
  font-weight: $semantic-typography-font-weight-bold;
  line-height: $semantic-typography-line-height-tight;
  color: var(--color-text-primary, #111827);
  margin-bottom: $semantic-spacing-2;
  
  .kpi-card--sm & {
    font-size: $semantic-typography-font-size-2xl;
  }
  
  .kpi-card--lg & {
    font-size: $semantic-typography-font-size-4xl;
    margin-bottom: $semantic-spacing-3;
  }

  // Animate number changes
  transition: 
    transform $semantic-motion-duration-fast $semantic-motion-easing-spring,
    color $semantic-motion-duration-fast $semantic-motion-easing-ease-out;

  &:hover {
    transform: $semantic-motion-hover-transform-scale-sm;
  }
}

.kpi-card__label {
  font-size: $semantic-typography-font-size-sm;
  font-weight: $semantic-typography-font-weight-medium;
  color: var(--color-text-secondary, #6b7280);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  
  .kpi-card--lg & {
    font-size: $semantic-typography-font-size-md;
  }
}

.kpi-card__secondary {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: $semantic-spacing-3;
  
  @media (min-width: $semantic-breakpoint-md) {
    flex-shrink: 0;
    align-items: flex-end;
  }
}

.kpi-card__trend {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-2;
  padding: $semantic-spacing-2 $semantic-spacing-3;
  background-color: var(--color-background-subtle, #f9fafb);
  border-radius: $semantic-border-radius-full;
  font-size: $semantic-typography-font-size-sm;
  font-weight: $semantic-typography-font-weight-medium;
  
  transition: 
    background-color $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    transform $semantic-motion-duration-fast $semantic-motion-easing-ease-out;

  &:hover {
    background-color: var(--color-background-secondary, #f3f4f6);
    transform: $semantic-motion-hover-transform-scale-sm;
  }
}

.kpi-card__chart {
  width: 100%;
  max-width: 120px;
  height: 60px;
  
  .kpi-card--sm & {
    max-width: 80px;
    height: 40px;
  }
  
  .kpi-card--lg & {
    max-width: 160px;
    height: 80px;
  }
}

.kpi-card__footer {
  padding: $semantic-spacing-4;
  border-top: 1px solid var(--color-border-subtle, #f3f4f6);
  background-color: var(--color-background-subtle, #fafafa);
  
  .kpi-card--sm & {
    padding: $semantic-spacing-3;
  }
  
  .kpi-card--lg & {
    padding: $semantic-spacing-5;
  }
}

// Responsive adjustments for very small screens
@media (max-width: $semantic-breakpoint-sm) {
  .kpi-card__content {
    padding: $semantic-spacing-4;
    
    .kpi-card--sm & {
      padding: $semantic-spacing-3;
    }
  }
  
  .kpi-card__value {
    font-size: $semantic-typography-font-size-2xl;
    
    .kpi-card--sm & {
      font-size: $semantic-typography-font-size-xl;
    }
  }
}

// Animation for appearing content
.kpi-card__value,
.kpi-card__trend,
.kpi-card__chart {
  animation: fadeInUp $semantic-motion-duration-normal $semantic-motion-easing-ease-out;
}

.kpi-card__trend {
  animation-delay: $semantic-motion-transition-delay-100;
}

.kpi-card__chart {
  animation-delay: $semantic-motion-transition-delay-200;
}

@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY($semantic-spacing-2);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}Ox;KCڡ8UAIOO3RStK37*ɋ  4
jx9import { 
  Component, 
  Input, 
  OnInit, 
  OnDestroy, 
  AfterViewInit,
  ElementRef, 
  ViewChild, 
  signal, 
  computed,
  Output,
  EventEmitter,
  TemplateRef,
  ContentChild
} from '@angular/core';
import { CommonModule } from '@angular/common';
import { Subject } from 'rxjs';
import { takeUntil, throttleTime } from 'rxjs/operators';
import { fromEvent } from 'rxjs';

export type ScrollDirection = 'vertical' | 'horizontal' | 'both';
export type ScrollbarVisibility = 'auto' | 'always' | 'never' | 'hover';

export interface VirtualScrollConfig {
  itemHeight: number;
  bufferSize?: number;
  enableDynamicHeight?: boolean;
}

export interface ScrollPosition {
  top: number;
  left: number;
}

export interface ScrollEvent {
  position: ScrollPosition;
  percentage: { x: number; y: number };
  isAtTop: boolean;
  isAtBottom: boolean;
  isAtLeft: boolean;
  isAtRight: boolean;
}

@Component({
  selector: 'ui-scroll-container',
  standalone: true,
  imports: [CommonModule],
  template: `
    <div 
      #scrollContainer
      class="scroll-container"
      [class]="containerClasses()"
      [attr.data-direction]="direction"
      [attr.data-scrollbar]="scrollbarVisibility"
      [attr.role]="role"
      [attr.aria-label]="ariaLabel"
      [attr.tabindex]="tabIndex"
      [style.max-height]="maxHeight"
      [style.max-width]="maxWidth">
      
      @if (virtualScrolling && virtualConfig) {
        <!-- Virtual Scrolling Content -->
        <div 
          class="virtual-scroll-wrapper"
          [style.height.px]="virtualTotalHeight()"
          [style.width.px]="virtualTotalWidth()">
          
          <div 
            class="virtual-scroll-content"
            [style.transform]="virtualTransform()">
            
            @for (item of visibleItems(); track trackBy ? trackBy($index, item) : $index) {
              <div 
                class="virtual-item"
                [style.height.px]="virtualConfig.itemHeight"
                [attr.data-index]="item.index">
                
                @if (itemTemplate) {
                  <ng-container 
                    [ngTemplateOutlet]="itemTemplate" 
                    [ngTemplateOutletContext]="{ $implicit: item.data, index: item.index }">
                  </ng-container>
                } @else {
                  <ng-content></ng-content>
                }
              </div>
            }
          </div>
        </div>
        
      } @else {
        <!-- Regular Scrolling Content -->
        <div class="scroll-content">
          <ng-content></ng-content>
        </div>
      }
      
      <!-- Custom Scrollbars (if needed) -->
      @if (customScrollbars) {
        <div class="custom-scrollbar vertical" 
             [class.hidden]="!showVerticalScrollbar()">
          <div class="scrollbar-track">
            <div class="scrollbar-thumb" 
                 [style.height.%]="verticalThumbSize()"
                 [style.top.%]="verticalThumbPosition()">
            </div>
          </div>
        </div>
        
        <div class="custom-scrollbar horizontal" 
             [class.hidden]="!showHorizontalScrollbar()">
          <div class="scrollbar-track">
            <div class="scrollbar-thumb" 
                 [style.width.%]="horizontalThumbSize()"
                 [style.left.%]="horizontalThumbPosition()">
            </div>
          </div>
        </div>
      }
      
      <!-- Scroll indicators -->
      @if (showScrollIndicators) {
        <div class="scroll-indicators">
          @if (!isAtTop() && direction !== 'horizontal') {
            <div class="scroll-indicator top" aria-hidden="true">↑</div>
          }
          @if (!isAtBottom() && direction !== 'horizontal') {
            <div class="scroll-indicator bottom" aria-hidden="true">↓</div>
          }
          @if (!isAtLeft() && direction !== 'vertical') {
            <div class="scroll-indicator left" aria-hidden="true">←</div>
          }
          @if (!isAtRight() && direction !== 'vertical') {
            <div class="scroll-indicator right" aria-hidden="true">→</div>
          }
        </div>
      }
    </div>
  `,
  styles: [`
    .scroll-container {
      position: relative;
      overflow: auto;
      width: 100%;
      height: 100%;
    }
    
    .scroll-container[data-direction="vertical"] {
      overflow-x: hidden;
      overflow-y: auto;
    }
    
    .scroll-container[data-direction="horizontal"] {
      overflow-x: auto;
      overflow-y: hidden;
    }
    
    .scroll-container[data-scrollbar="never"] {
      scrollbar-width: none;
      -ms-overflow-style: none;
    }
    
    .scroll-container[data-scrollbar="never"]::-webkit-scrollbar {
      width: 0px;
      background: transparent;
    }
    
    
    .scroll-container[data-scrollbar="hover"]::-webkit-scrollbar {
      opacity: 0;
      transition: opacity 0.3s ease;
    }
    
    .scroll-container[data-scrollbar="hover"]:hover::-webkit-scrollbar {
      opacity: 1;
    } 
  `]
})
export class ScrollContainerComponent implements OnInit, AfterViewInit, OnDestroy {
  @ViewChild('scrollContainer', { static: true }) scrollContainer!: ElementRef<HTMLDivElement>;
  @ContentChild('itemTemplate') itemTemplate?: TemplateRef<any>;
  
  // Configuration inputs
  @Input() direction: ScrollDirection = 'vertical';
  @Input() scrollbarVisibility: ScrollbarVisibility = 'auto';
  @Input() customScrollbars = false;
  @Input() showScrollIndicators = false;
  @Input() smoothScrolling = true;
  
  // Virtual scrolling
  @Input() virtualScrolling = false;
  @Input() virtualConfig: VirtualScrollConfig | null = null;
  @Input() items: any[] = [];
  @Input() trackBy?: (index: number, item: any) => any;
  
  // Accessibility
  @Input() role: string | null = null;
  @Input() ariaLabel: string | null = null;
  @Input() tabIndex = -1;
  
  // Styling
  @Input() maxHeight: string | null = null;
  @Input() maxWidth: string | null = null;
  
  // Events
  @Output() scroll = new EventEmitter<ScrollEvent>();
  @Output() scrollEnd = new EventEmitter<ScrollEvent>();
  @Output() reachStart = new EventEmitter<void>();
  @Output() reachEnd = new EventEmitter<void>();
  
  private destroy$ = new Subject<void>();
  
  // State signals
  private scrollPosition = signal<ScrollPosition>({ top: 0, left: 0 });
  private containerSize = signal<{ width: number; height: number }>({ width: 0, height: 0 });
  private contentSize = signal<{ width: number; height: number }>({ width: 0, height: 0 });
  private firstVisibleIndex = signal(0);
  private lastVisibleIndex = signal(0);
  
  // Computed properties
  protected containerClasses = computed(() => {
    const classes = ['scroll-container'];
    
    if (this.customScrollbars) classes.push('custom-scrollbars');
    if (this.smoothScrolling) classes.push('smooth-scrolling');
    if (this.virtualScrolling) classes.push('virtual-scrolling');
    
    return classes.join(' ');
  });
  
  protected isAtTop = computed(() => this.scrollPosition().top <= 1);
  protected isAtBottom = computed(() => {
    const { height } = this.containerSize();
    const contentHeight = this.virtualScrolling ? this.virtualTotalHeight() : this.contentSize().height;
    return (this.scrollPosition().top + height) >= (contentHeight - 1);
  });
  
  protected isAtLeft = computed(() => this.scrollPosition().left <= 1);
  protected isAtRight = computed(() => {
    const { width } = this.containerSize();
    const contentWidth = this.virtualScrolling ? this.virtualTotalWidth() : this.contentSize().width;
    return (this.scrollPosition().left + width) >= (contentWidth - 1);
  });
  
  protected showVerticalScrollbar = computed(() => {
    const contentHeight = this.virtualScrolling ? this.virtualTotalHeight() : this.contentSize().height;
    return contentHeight > this.containerSize().height;
  });
  
  protected showHorizontalScrollbar = computed(() => {
    const contentWidth = this.virtualScrolling ? this.virtualTotalWidth() : this.contentSize().width;
    return contentWidth > this.containerSize().width;
  });
  
  protected verticalThumbSize = computed(() => {
    const containerHeight = this.containerSize().height;
    const contentHeight = this.virtualScrolling ? this.virtualTotalHeight() : this.contentSize().height;
    return Math.max((containerHeight / contentHeight) * 100, 5);
  });
  
  protected verticalThumbPosition = computed(() => {
    const scrollTop = this.scrollPosition().top;
    const contentHeight = this.virtualScrolling ? this.virtualTotalHeight() : this.contentSize().height;
    const containerHeight = this.containerSize().height;
    const maxScroll = contentHeight - containerHeight;
    return maxScroll > 0 ? (scrollTop / maxScroll) * (100 - this.verticalThumbSize()) : 0;
  });
  
  protected horizontalThumbSize = computed(() => {
    const containerWidth = this.containerSize().width;
    const contentWidth = this.virtualScrolling ? this.virtualTotalWidth() : this.contentSize().width;
    return Math.max((containerWidth / contentWidth) * 100, 5);
  });
  
  protected horizontalThumbPosition = computed(() => {
    const scrollLeft = this.scrollPosition().left;
    const contentWidth = this.virtualScrolling ? this.virtualTotalWidth() : this.contentSize().width;
    const containerWidth = this.containerSize().width;
    const maxScroll = contentWidth - containerWidth;
    return maxScroll > 0 ? (scrollLeft / maxScroll) * (100 - this.horizontalThumbSize()) : 0;
  });
  
  // Virtual scrolling computed properties
  protected virtualTotalHeight = computed(() => {
    if (!this.virtualConfig) return 0;
    return this.items.length * this.virtualConfig.itemHeight;
  });
  
  protected virtualTotalWidth = computed(() => {
    return this.containerSize().width; // For now, assume full width
  });
  
  protected visibleItems = computed(() => {
    if (!this.virtualScrolling || !this.virtualConfig) return [];
    
    const startIndex = this.firstVisibleIndex();
    const endIndex = this.lastVisibleIndex();
    
    return this.items.slice(startIndex, endIndex + 1).map((item, i) => ({
      data: item,
      index: startIndex + i
    }));
  });
  
  protected virtualTransform = computed(() => {
    if (!this.virtualConfig) return '';
    const startIndex = this.firstVisibleIndex();
    const offsetY = startIndex * this.virtualConfig.itemHeight;
    return `translateY(${offsetY}px)`;
  });

  ngOnInit(): void {
    this.setupResizeObserver();
  }

  ngAfterViewInit(): void {
    this.setupScrollListener();
    this.updateContainerSize();
    
    if (this.virtualScrolling) {
      this.updateVisibleRange();
    }
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  /**
   * Scrolls to a specific position
   */
  scrollTo(position: Partial<ScrollPosition>, smooth = true): void {
    const element = this.scrollContainer.nativeElement;
    const options: ScrollToOptions = {
      behavior: smooth && this.smoothScrolling ? 'smooth' : 'auto'
    };
    
    if (position.top !== undefined) options.top = position.top;
    if (position.left !== undefined) options.left = position.left;
    
    element.scrollTo(options);
  }

  /**
   * Scrolls to a specific item (virtual scrolling only)
   */
  scrollToItem(index: number, smooth = true): void {
    if (!this.virtualScrolling || !this.virtualConfig) return;
    
    const position = index * this.virtualConfig.itemHeight;
    this.scrollTo({ top: position }, smooth);
  }

  /**
   * Gets current scroll position
   */
  getScrollPosition(): ScrollPosition {
    return this.scrollPosition();
  }

  private setupScrollListener(): void {
    fromEvent(this.scrollContainer.nativeElement, 'scroll')
      .pipe(
        throttleTime(16), // ~60fps
        takeUntil(this.destroy$)
      )
      .subscribe(() => {
        this.updateScrollPosition();
        this.emitScrollEvent();
        
        if (this.virtualScrolling) {
          this.updateVisibleRange();
        }
      });
  }

  private setupResizeObserver(): void {
    if (typeof ResizeObserver === 'undefined') return;

    const resizeObserver = new ResizeObserver(() => {
      this.updateContainerSize();
      this.updateContentSize();
      
      if (this.virtualScrolling) {
        this.updateVisibleRange();
      }
    });

    resizeObserver.observe(this.scrollContainer.nativeElement);
  }

  private updateScrollPosition(): void {
    const element = this.scrollContainer.nativeElement;
    this.scrollPosition.set({
      top: element.scrollTop,
      left: element.scrollLeft
    });
  }

  private updateContainerSize(): void {
    const element = this.scrollContainer.nativeElement;
    this.containerSize.set({
      width: element.clientWidth,
      height: element.clientHeight
    });
  }

  private updateContentSize(): void {
    const element = this.scrollContainer.nativeElement;
    this.contentSize.set({
      width: element.scrollWidth,
      height: element.scrollHeight
    });
  }

  private updateVisibleRange(): void {
    if (!this.virtualConfig) return;
    
    const containerHeight = this.containerSize().height;
    const scrollTop = this.scrollPosition().top;
    const itemHeight = this.virtualConfig.itemHeight;
    const bufferSize = this.virtualConfig.bufferSize ?? 5;
    
    const visibleStart = Math.floor(scrollTop / itemHeight);
    const visibleEnd = Math.min(
      visibleStart + Math.ceil(containerHeight / itemHeight),
      this.items.length - 1
    );
    
    this.firstVisibleIndex.set(Math.max(0, visibleStart - bufferSize));
    this.lastVisibleIndex.set(Math.min(this.items.length - 1, visibleEnd + bufferSize));
  }

  private emitScrollEvent(): void {
    const position = this.scrollPosition();
    const containerSize = this.containerSize();
    const contentSize = this.virtualScrolling ? 
      { width: this.virtualTotalWidth(), height: this.virtualTotalHeight() } : 
      this.contentSize();
    
    const scrollEvent: ScrollEvent = {
      position,
      percentage: {
        x: contentSize.width > containerSize.width ? 
          position.left / (contentSize.width - containerSize.width) : 0,
        y: contentSize.height > containerSize.height ? 
          position.top / (contentSize.height - containerSize.height) : 0
      },
      isAtTop: this.isAtTop(),
      isAtBottom: this.isAtBottom(),
      isAtLeft: this.isAtLeft(),
      isAtRight: this.isAtRight()
    };
    
    this.scroll.emit(scrollEvent);
    
    // Emit boundary events
    if (scrollEvent.isAtTop) this.reachStart.emit();
    if (scrollEvent.isAtBottom) this.reachEnd.emit();
  }
}j ľx.7import { 
  Component, 
  Input, 
  Output, 
  EventEmitter, 
  OnInit,
  OnDestroy,
  ChangeDetectionStrategy,
  signal, 
  computed,
  ContentChildren,
  QueryList,
  AfterContentInit,
  ElementRef,
  ViewChild,
  effect
} from '@angular/core';
import { CommonModule } from '@angular/common';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';

export interface TabItem {
  id: string;
  label: string;
  icon?: string | IconDefinition;
  disabled?: boolean;
  closeable?: boolean;
  badge?: string | number;
  tooltip?: string;
  data?: any;
}

export interface TabChangeEvent {
  activeTab: TabItem;
  previousTab: TabItem | null;
  activeIndex: number;
  previousIndex: number;
}

export interface TabCloseEvent {
  tab: TabItem;
  index: number;
}

export type TabOrientation = 'horizontal' | 'vertical';
export type TabVariant = 'default' | 'pills' | 'underline' | 'boxed';
export type TabSize = 'sm' | 'md' | 'lg';

@Component({
  selector: 'ui-tab-container',
  standalone: true,
  imports: [CommonModule],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div 
      class="tab-container"
      [class]="containerClasses()"
      [attr.data-orientation]="orientation"
      [attr.data-variant]="variant"
      [attr.data-size]="size">
      
      <!-- Tab Navigation -->
      <div 
        class="tab-nav"
        [class.scrollable]="scrollableTabs"
        role="tablist"
        [attr.aria-orientation]="orientation">
        
        @if (scrollableTabs && showScrollButtons()) {
          <button 
            class="tab-scroll-button prev"
            [disabled]="!canScrollPrev()"
            (click)="scrollTabs('prev')"
            type="button"
            aria-label="Scroll tabs left">
            <span class="scroll-icon">‹</span>
          </button>
        }
        
        <div 
          #tabNavContent
          class="tab-nav-content"
          [class.scrollable]="scrollableTabs">
          
          @for (tab of tabs(); track tab.id) {
            <button
              class="tab-button"
              [class.active]="tab.id === activeTabId()"
              [class.disabled]="tab.disabled"
              [disabled]="tab.disabled"
              [attr.id]="'tab-' + tab.id"
              [attr.aria-controls]="'panel-' + tab.id"
              [attr.aria-selected]="tab.id === activeTabId()"
              [attr.tabindex]="tab.id === activeTabId() ? 0 : -1"
              [attr.title]="tab.tooltip"
              role="tab"
              type="button"
              (click)="selectTab(tab)"
              (keydown)="handleTabKeyDown($event, tab)">
              
              @if (tab.icon) {
                <span class="tab-icon" [innerHTML]="tab.icon"></span>
              }
              
              <span class="tab-label">{{ tab.label }}</span>
              
              @if (tab.badge) {
                <span class="tab-badge">{{ tab.badge }}</span>
              }
              
              @if (tab.closeable && allowTabClose) {
                <button
                  class="tab-close-button"
                  (click)="closeTab($event, tab)"
                  type="button"
                  [attr.aria-label]="'Close ' + tab.label + ' tab'"
                  tabindex="-1">
                  <span class="close-icon">×</span>
                </button>
              }
            </button>
          }
          
          @if (showAddButton) {
            <button
              class="tab-add-button"
              (click)="addTab()"
              type="button"
              aria-label="Add new tab">
              <span class="add-icon">+</span>
            </button>
          }
        </div>
        
        @if (scrollableTabs && showScrollButtons()) {
          <button 
            class="tab-scroll-button next"
            [disabled]="!canScrollNext()"
            (click)="scrollTabs('next')"
            type="button"
            aria-label="Scroll tabs right">
            <span class="scroll-icon">›</span>
          </button>
        }
      </div>
      
      <!-- Tab Content Panels -->
      <div class="tab-content" [class.animated]="animateTransitions">
        @for (tab of tabs(); track tab.id) {
          <div
            class="tab-panel"
            [class.active]="tab.id === activeTabId()"
            [attr.id]="'panel-' + tab.id"
            [attr.aria-labelledby]="'tab-' + tab.id"
            [attr.hidden]="tab.id !== activeTabId() ? true : null"
            role="tabpanel"
            [attr.tabindex]="tab.id === activeTabId() ? 0 : -1">
            
            @if (lazyLoading) {
              @if (tab.id === activeTabId() || loadedTabs().has(tab.id)) {
                <ng-content [select]="'[slot=' + tab.id + ']'"></ng-content>
              }
            } @else {
              <ng-content [select]="'[slot=' + tab.id + ']'"></ng-content>
            }
          </div>
        }
        
        @if (tabs().length === 0 && emptyStateTemplate) {
          <div class="tab-empty-state">
            <ng-content select="[slot=empty]"></ng-content>
          </div>
        }
      </div>
    </div>
  `,
  styles: [`
    .tab-container {
      display: flex;
      width: 100%;
      height: 100%;
    }
    
    .tab-container[data-orientation="horizontal"] {
      flex-direction: column;
    }
    
    .tab-container[data-orientation="vertical"] {
      flex-direction: row;
    }
    
    .tab-nav {
      display: flex;
      border-bottom: 1px solid #e9ecef;
    }
    
    .tab-button {
      padding: 0.5rem 1rem;
      border: none;
      background: transparent;
      cursor: pointer;
      border-bottom: 2px solid transparent;
    }
    
    .tab-button.active {
      border-bottom-color: #007bff;
      color: #007bff;
    }
    
    .tab-content {
      flex: 1;
      padding: 1rem;
    }
    
    .tab-panel {
      display: none;
    }
    
    .tab-panel.active {
      display: block;
    }
  `]
})
export class TabContainerComponent implements OnInit, AfterContentInit, OnDestroy {
  @ViewChild('tabNavContent') tabNavContent!: ElementRef<HTMLDivElement>;
  
  // Configuration
  @Input() tabs = signal<TabItem[]>([]);
  @Input() activeTabId = signal<string>('');
  @Input() orientation: TabOrientation = 'horizontal';
  @Input() variant: TabVariant = 'default';
  @Input() size: TabSize = 'md';
  
  // Behavior
  @Input() allowTabClose = false;
  @Input() showAddButton = false;
  @Input() scrollableTabs = false;
  @Input() animateTransitions = true;
  @Input() lazyLoading = false;
  @Input() keepAliveInactive = false;
  @Input() emptyStateTemplate = false;
  
  // Keyboard navigation
  @Input() keyboardNavigation = true;
  @Input() focusOnSelect = true;
  
  // Events
  @Output() tabChange = new EventEmitter<TabChangeEvent>();
  @Output() tabClose = new EventEmitter<TabCloseEvent>();
  @Output() tabAdd = new EventEmitter<void>();
  @Output() tabReorder = new EventEmitter<{ from: number; to: number }>();
  
  private destroy$ = new Subject<void>();
  private previousActiveTabId = signal<string>('');
  protected loadedTabs = signal<Set<string>>(new Set());
  private scrollPosition = signal(0);
  private tabNavWidth = signal(0);
  private tabNavScrollWidth = signal(0);
  
  // Computed properties
  protected containerClasses = computed(() => {
    const classes = ['tab-container'];
    
    if (this.scrollableTabs) classes.push('scrollable');
    if (this.animateTransitions) classes.push('animated');
    if (this.allowTabClose) classes.push('closeable');
    
    return classes.join(' ');
  });
  
  protected showScrollButtons = computed(() => {
    return this.scrollableTabs && this.tabNavScrollWidth() > this.tabNavWidth();
  });
  
  protected canScrollPrev = computed(() => this.scrollPosition() > 0);
  
  protected canScrollNext = computed(() => {
    const maxScroll = this.tabNavScrollWidth() - this.tabNavWidth();
    return this.scrollPosition() < maxScroll;
  });

  constructor() {
    // Effect to handle tab changes
    effect(() => {
      const currentId = this.activeTabId();
      const previousId = this.previousActiveTabId();
      
      if (currentId && currentId !== previousId) {
        this.handleTabChange(currentId, previousId);
      }
    });
    
    // Effect to mark tabs as loaded for lazy loading
    effect(() => {
      const activeId = this.activeTabId();
      if (activeId && this.lazyLoading) {
        this.loadedTabs.update(loaded => new Set([...loaded, activeId]));
      }
    });
  }

  ngOnInit(): void {
    // Set initial active tab if not specified
    if (!this.activeTabId() && this.tabs().length > 0) {
      const firstEnabledTab = this.tabs().find(tab => !tab.disabled);
      if (firstEnabledTab) {
        this.activeTabId.set(firstEnabledTab.id);
      }
    }
  }

  ngAfterContentInit(): void {
    if (this.scrollableTabs) {
      this.setupScrollObserver();
    }
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  /**
   * Selects a tab by ID or tab object
   */
  selectTab(tabOrId: TabItem | string): void {
    const tab = typeof tabOrId === 'string' 
      ? this.tabs().find(t => t.id === tabOrId)
      : tabOrId;
    
    if (!tab || tab.disabled || tab.id === this.activeTabId()) return;
    
    this.previousActiveTabId.set(this.activeTabId());
    this.activeTabId.set(tab.id);
    
    if (this.focusOnSelect) {
      setTimeout(() => this.focusActiveTab(), 0);
    }
  }

  /**
   * Closes a tab
   */
  closeTab(event: Event, tab: TabItem): void {
    event.stopPropagation();
    
    const index = this.tabs().findIndex(t => t.id === tab.id);
    if (index === -1) return;
    
    const closeEvent: TabCloseEvent = { tab, index };
    this.tabClose.emit(closeEvent);
    
    // If this was the active tab, select another one
    if (tab.id === this.activeTabId()) {
      const newTabs = this.tabs().filter(t => t.id !== tab.id);
      if (newTabs.length > 0) {
        const nextIndex = Math.min(index, newTabs.length - 1);
        this.selectTab(newTabs[nextIndex]);
      } else {
        this.activeTabId.set('');
      }
    }
    
    // Remove from tabs
    this.tabs.update(tabs => tabs.filter(t => t.id !== tab.id));
  }

  /**
   * Adds a new tab (emits event for parent to handle)
   */
  addTab(): void {
    this.tabAdd.emit();
  }

  /**
   * Scrolls the tab navigation
   */
  scrollTabs(direction: 'prev' | 'next'): void {
    if (!this.tabNavContent) return;
    
    const scrollAmount = 200;
    const currentScroll = this.scrollPosition();
    const newScroll = direction === 'prev' 
      ? Math.max(0, currentScroll - scrollAmount)
      : Math.min(this.tabNavScrollWidth() - this.tabNavWidth(), currentScroll + scrollAmount);
    
    this.tabNavContent.nativeElement.scrollTo({
      left: newScroll,
      behavior: 'smooth'
    });
  }

  /**
   * Handles keyboard navigation
   */
  handleTabKeyDown(event: KeyboardEvent, tab: TabItem): void {
    if (!this.keyboardNavigation) return;
    
    const tabs = this.tabs().filter(t => !t.disabled);
    const currentIndex = tabs.findIndex(t => t.id === tab.id);
    
    let targetIndex = currentIndex;
    
    switch (event.key) {
      case 'ArrowLeft':
      case 'ArrowUp':
        event.preventDefault();
        targetIndex = currentIndex > 0 ? currentIndex - 1 : tabs.length - 1;
        break;
        
      case 'ArrowRight':
      case 'ArrowDown':
        event.preventDefault();
        targetIndex = currentIndex < tabs.length - 1 ? currentIndex + 1 : 0;
        break;
        
      case 'Home':
        event.preventDefault();
        targetIndex = 0;
        break;
        
      case 'End':
        event.preventDefault();
        targetIndex = tabs.length - 1;
        break;
        
      case 'Enter':
      case ' ':
        event.preventDefault();
        this.selectTab(tab);
        return;
        
      case 'Delete':
      case 'Backspace':
        if (tab.closeable && this.allowTabClose) {
          event.preventDefault();
          this.closeTab(event, tab);
        }
        return;
    }
    
    if (targetIndex !== currentIndex) {
      this.focusTab(tabs[targetIndex].id);
    }
  }

  /**
   * Focuses a specific tab
   */
  private focusTab(tabId: string): void {
    const tabElement = document.getElementById(`tab-${tabId}`);
    if (tabElement) {
      tabElement.focus();
    }
  }

  /**
   * Focuses the currently active tab
   */
  private focusActiveTab(): void {
    const activeId = this.activeTabId();
    if (activeId) {
      this.focusTab(activeId);
    }
  }

  /**
   * Handles tab change events
   */
  private handleTabChange(currentId: string, previousId: string): void {
    const currentTab = this.tabs().find(t => t.id === currentId);
    const previousTab = this.tabs().find(t => t.id === previousId);
    
    if (currentTab) {
      const currentIndex = this.tabs().findIndex(t => t.id === currentId);
      const previousIndex = previousId ? this.tabs().findIndex(t => t.id === previousId) : -1;
      
      const changeEvent: TabChangeEvent = {
        activeTab: currentTab,
        previousTab: previousTab || null,
        activeIndex: currentIndex,
        previousIndex
      };
      
      this.tabChange.emit(changeEvent);
    }
  }

  /**
   * Sets up scroll observer for scrollable tabs
   */
  private setupScrollObserver(): void {
    if (!this.tabNavContent) return;
    
    const element = this.tabNavContent.nativeElement;
    
    // Update dimensions
    const updateDimensions = () => {
      this.tabNavWidth.set(element.clientWidth);
      this.tabNavScrollWidth.set(element.scrollWidth);
    };
    
    updateDimensions();
    
    // Listen for scroll events
    element.addEventListener('scroll', () => {
      this.scrollPosition.set(element.scrollLeft);
    });
    
    // Listen for resize
    if (typeof ResizeObserver !== 'undefined') {
      const resizeObserver = new ResizeObserver(updateDimensions);
      resizeObserver.observe(element);
    }
  }
}/O<x[w3wC1&gM71ɘ ]^x<@use "../../../../ui-design-system/src/styles/semantic/index" as *;

.widget-container {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  position: relative;
  transition: 
    transform $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    box-shadow $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    border-color $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    background-color $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
  
  // Base styling
  background-color: var(--color-background-surface, #fff);
  border-radius: $semantic-border-radius-lg;
  
  // Minimum height for consistent appearance
  min-height: 120px;
}

// Variant styles
.widget-container--default {
  background-color: var(--color-background-surface, #fff);
  border: 1px solid var(--color-border-subtle, #e5e7eb);
  box-shadow: $semantic-shadow-sm;
}

.widget-container--elevated {
  background-color: var(--color-background-surface, #fff);
  border: 1px solid var(--color-border-subtle, #f3f4f6);
  box-shadow: $semantic-shadow-md;
}

.widget-container--outlined {
  background-color: var(--color-background-surface, #fff);
  border: 2px solid var(--color-border-primary, #d1d5db);
  box-shadow: none;
}

.widget-container--flat {
  background-color: var(--color-background-subtle, #f9fafb);
  border: none;
  box-shadow: none;
}

// Interactive states
.widget-container.interactive {
  cursor: pointer;
  
  &:hover {
    transform: $semantic-motion-hover-transform-lift-sm;
    
    &.widget-container--default {
      box-shadow: $semantic-shadow-md;
      border-color: var(--color-border-primary, #d1d5db);
    }
    
    &.widget-container--elevated {
      box-shadow: $semantic-shadow-lg;
      border-color: var(--color-border-primary, #d1d5db);
    }
    
    &.widget-container--outlined {
      border-color: var(--color-primary, #3b82f6);
      background-color: var(--color-background-subtle, #f9fafb);
    }
    
    &.widget-container--flat {
      background-color: var(--color-background-surface, #fff);
      box-shadow: $semantic-shadow-sm;
    }
  }
  
  &:active {
    transform: $semantic-motion-hover-transform-lift-sm scale(0.98);
  }
  
  &:focus-visible {
    outline: 2px solid var(--color-primary, #3b82f6);
    outline-offset: 2px;
  }
}

// Loading state
.widget-container.loading {
  pointer-events: none;
  
  .widget-container__content {
    opacity: 0.6;
    filter: blur(1px);
    transition: 
      opacity $semantic-motion-duration-normal $semantic-motion-easing-ease-out,
      filter $semantic-motion-duration-normal $semantic-motion-easing-ease-out;
  }
}

// Header section
.widget-container__header {
  padding: $semantic-spacing-4;
  border-bottom: 1px solid var(--color-border-subtle, #f3f4f6);
  background-color: var(--color-background-subtle, #fafafa);
  border-top-left-radius: $semantic-border-radius-lg;
  border-top-right-radius: $semantic-border-radius-lg;
  flex-shrink: 0;
  
  // Responsive padding
  @media (min-width: $semantic-breakpoint-md) {
    padding: $semantic-spacing-5;
  }
  
  // Layout for title and actions
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: $semantic-spacing-3;
}

.widget-container__title {
  flex: 1;
  min-width: 0;
}

.widget-container__subtitle {
  margin-top: $semantic-spacing-1;
  opacity: 0.8;
}

.widget-container__actions {
  display: flex;
  align-items: center;
  gap: $semantic-spacing-2;
  flex-shrink: 0;
}

// Content section
.widget-container__content {
  flex: 1;
  position: relative;
  overflow: hidden;
  padding: $semantic-spacing-4;
  
  @media (min-width: $semantic-breakpoint-md) {
    padding: $semantic-spacing-5;
  }
  
  // Auto-scroll for overflow content
  overflow-y: auto;
  
  // Custom scrollbar
  &::-webkit-scrollbar {
    width: 6px;
  }
  
  &::-webkit-scrollbar-track {
    background: var(--color-background-subtle, #f3f4f6);
    border-radius: 3px;
  }
  
  &::-webkit-scrollbar-thumb {
    background: var(--color-border-primary, #d1d5db);
    border-radius: 3px;
    
    &:hover {
      background: var(--color-border-strong, #9ca3af);
    }
  }
}

// Loading overlay
.widget-container__loading-overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  @include glass-effect('frosted', $css-glass-blur-xs, false, false);
  z-index: $semantic-z-index-overlay;
  
  animation: fadeIn $semantic-motion-duration-fast $semantic-motion-easing-ease-out;
}

// Footer section
.widget-container__footer {
  padding: $semantic-spacing-4;
  border-top: 1px solid var(--color-border-subtle, #f3f4f6);
  background-color: var(--color-background-subtle, #fafafa);
  border-bottom-left-radius: $semantic-border-radius-lg;
  border-bottom-right-radius: $semantic-border-radius-lg;
  flex-shrink: 0;
  
  @media (min-width: $semantic-breakpoint-md) {
    padding: $semantic-spacing-4 $semantic-spacing-5;
  }
}

// Special styling for header-only widgets
.widget-container:not(:has(.widget-container__content)) {
  .widget-container__header {
    border-bottom: none;
    border-radius: $semantic-border-radius-lg;
  }
}

// Special styling for content-only widgets
.widget-container:not(:has(.widget-container__header)):not(:has(.widget-container__footer)) {
  .widget-container__content {
    border-radius: $semantic-border-radius-lg;
  }
}

// Responsive adjustments for small screens
@media (max-width: $semantic-breakpoint-sm) {
  .widget-container {
    min-height: 100px;
  }
  
  .widget-container__header,
  .widget-container__content,
  .widget-container__footer {
    padding: $semantic-spacing-3;
  }
  
  .widget-container__header {
    flex-direction: column;
    align-items: stretch;
    gap: $semantic-spacing-2;
  }
  
  .widget-container__actions {
    justify-content: flex-end;
  }
}

// Animation for content changes
.widget-container__content > * {
  animation: contentFadeIn $semantic-motion-duration-normal $semantic-motion-easing-ease-out;
}

// Skeleton loading state
.widget-container.loading {
  .widget-container__header::after,
  .widget-container__content::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: linear-gradient(
      90deg,
      transparent,
      rgba(255, 255, 255, 0.4),
      transparent
    );
    animation: shimmer $semantic-motion-duration-slower linear infinite;
  }
  
  .widget-container__header {
    position: relative;
    overflow: hidden;
  }
  
  .widget-container__content {
    position: relative;
    overflow: hidden;
  }
}

// Error state (can be toggled with additional class)
.widget-container.error {
  border-color: var(--color-error, #ef4444);
  
  .widget-container__header {
    background-color: var(--color-error-subtle, #fef2f2);
    border-color: var(--color-error, #ef4444);
  }
}

// Success state (can be toggled with additional class)
.widget-container.success {
  border-color: var(--color-success, #10b981);
  
  .widget-container__header {
    background-color: var(--color-success-subtle, #f0fdf4);
    border-color: var(--color-success, #10b981);
  }
}

// Warning state (can be toggled with additional class)
.widget-container.warning {
  border-color: var(--color-warning, #f59e0b);
  
  .widget-container__header {
    background-color: var(--color-warning-subtle, #fffbeb);
    border-color: var(--color-warning, #f59e0b);
  }
}

// Animation keyframes
@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes contentFadeIn {
  from {
    opacity: 0;
    transform: translateY($semantic-spacing-2);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes shimmer {
  0% {
    transform: translateX(-100%);
  }
  100% {
    transform: translateX(100%);
  }
}p'Qx;lVڡ8UAIOO3RStK37*- b$fx`import { Component, Input } from '@angular/core';
import { CommonModule } from '@angular/common';

@Component({
  selector: 'ui-widget-container',
  standalone: true,
  imports: [CommonModule],
  template: `
    <div 
      class="widget-container" 
      [class]="'widget-container--' + variant"
      [class.interactive]="interactive"
      [class.loading]="loading"
    >
      <div class="widget-container__header" *ngIf="showHeader">
        <div class="widget-container__title">
          <ng-content select="[slot='title']"></ng-content>
        </div>
        <div class="widget-container__subtitle" *ngIf="showSubtitle">
          <ng-content select="[slot='subtitle']"></ng-content>
        </div>
        <div class="widget-container__actions">
          <ng-content select="[slot='actions']"></ng-content>
        </div>
      </div>
      
      <div class="widget-container__content">
        <div class="widget-container__loading-overlay" *ngIf="loading">
          <ng-content select="[slot='loading']"></ng-content>
        </div>
        
        <ng-content></ng-content>
      </div>
      
      <div class="widget-container__footer" *ngIf="showFooter">
        <ng-content select="[slot='footer']"></ng-content>
      </div>
    </div>
  `,
  styleUrl: './widget-container.component.scss'
})
export class WidgetContainerComponent {
  @Input() variant: 'default' | 'elevated' | 'outlined' | 'flat' = 'default';
  @Input() interactive: boolean = false;
  @Input() loading: boolean = false;
  @Input() showHeader: boolean = true;
  @Input() showSubtitle: boolean = false;
  @Input() showFooter: boolean = false;
}-Zx+@use "../../../../ui-design-system/src/styles/semantic/index" as *;

.widget-grid {
  display: grid;
  gap: $semantic-spacing-4;
  padding: $semantic-spacing-4;
  transition: 
    grid-template-columns $semantic-motion-duration-normal $semantic-motion-easing-ease-in-out,
    gap $semantic-motion-duration-fast $semantic-motion-easing-ease-out;

  // Mobile: Single column
  grid-template-columns: 1fr;

  // Tablet: 2 columns
  @media (min-width: $semantic-breakpoint-sm) {
    grid-template-columns: repeat(2, 1fr);
    gap: $semantic-spacing-5;
    padding: $semantic-spacing-5;
  }

  // Desktop: Auto-fit or fixed columns based on size
  @media (min-width: $semantic-breakpoint-lg) {
    gap: $semantic-spacing-6;
    padding: $semantic-spacing-6;
  }

  // Auto-fit behavior (default)
  &[data-auto-fit="true"] {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    }
    
    @media (min-width: $semantic-sizing-breakpoint-wide) {
      grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    }
  }

  // Small grid size (more columns, smaller widgets)
  &.widget-grid--sm {
    @media (min-width: $semantic-breakpoint-md) {
      grid-template-columns: repeat(3, 1fr);
    }
    
    @media (min-width: $semantic-breakpoint-lg) {
      grid-template-columns: repeat(4, 1fr);
    }
    
    @media (min-width: $semantic-sizing-breakpoint-wide) {
      grid-template-columns: repeat(5, 1fr);
    }
    
    &[data-auto-fit="true"] {
      @media (min-width: $semantic-breakpoint-lg) {
        grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
      }
    }
  }

  // Medium grid size (balanced)
  &.widget-grid--md {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-template-columns: repeat(3, 1fr);
    }
    
    @media (min-width: $semantic-sizing-breakpoint-wide) {
      grid-template-columns: repeat(4, 1fr);
    }
    
    &[data-auto-fit="true"] {
      @media (min-width: $semantic-breakpoint-lg) {
        grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
      }
    }
  }

  // Large grid size (fewer, larger widgets)
  &.widget-grid--lg {
    @media (min-width: $semantic-breakpoint-lg) {
      grid-template-columns: repeat(2, 1fr);
    }
    
    @media (min-width: $semantic-sizing-breakpoint-wide) {
      grid-template-columns: repeat(3, 1fr);
    }
    
    &[data-auto-fit="true"] {
      @media (min-width: $semantic-breakpoint-lg) {
        grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
      }
    }
  }
}

// Widget item styling (for direct children)
.widget-grid > * {
  transition: 
    transform $semantic-motion-duration-fast $semantic-motion-easing-ease-out,
    box-shadow $semantic-motion-duration-fast $semantic-motion-easing-ease-out;

  &:hover {
    transform: $semantic-motion-hover-transform-lift-sm;
  }

  // Stagger animation on load
  @for $i from 1 through 20 {
    &:nth-child(#{$i}) {
      animation: slideInUp $semantic-motion-duration-normal $semantic-motion-easing-ease-out;
      animation-delay: calc(#{$semantic-motion-transition-delay-75} * #{$i});
      animation-fill-mode: both;
    }
  }
}

// Slide in animation for widgets
@keyframes slideInUp {
  from {
    opacity: 0;
    transform: translateY($semantic-spacing-4);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}$4lx3 :UQ ަf-Ϋ-_h|HHtF /Yj0x3 ;7awB f{eM-_T壴\dx1tx3 ގ?뱰Ff̢ֽ-_]%LF׃DJ*p(ۇ!C8x3 B#=tস׽NPė+.ՙc-_La+T":dJ jp|y/|x3 M5(mXȟ|<-_/$殽!';_SzDx3 h&^s؞-_]謢SBqnR61s|;x vvb)ϼĒv!x nnZux9՞o1qSM}֔wrx jjV%B_Ӛs QB^x]%x tt`pisH{Z5
Nx tt`!!y \\Uʈ
wx tt`td+A{O㭺VK x rr^6ӏnXGEʔ[wKx tt`==TXPˎ-Ǚn~x ffRAʿݪo2<x5x hhT̯J
Y9yXx jjV}sgVSG\A㥖_cx LP%*Cx p$40000 accordion KNyȡ#$O%;jV6B 40000 table n7ҁ^p]ZIM ansfer-list %{f*]KtK$K=cx^ $L7rHÎ'^^40000 carousel ϫ<*&6q+f1%4RB#k4HE@=ܓ6k+oxa divider .}Y<酰~.Y0i:,	<Zc4$	f25B"40000 tooltip  4@C$[v'xl  40000 alert 0N++Aٰ 6حKIj~#40000 snackbar [V[=(E`SX\,}hx{|yF E'x"  67|Vu%?]j03xG 6fo
z|oJ0$progress-circle |+ioyy_t}+x 2'40000 autocomplete x֜,@F<P kM1gܲ'8deV$8㝽awD100644 index.ts +\khf~GΥ!Zm,*xh}J<f݃[FH!40000 select ^؈.vg/>	;(ag-input l~ʼwj>*)5&-S	x& Pw{,v
&^;OFsPWP7xD 6"7:jF!range-slider ֎Hsbܑߐ(W|˓*=x vƚq:\cmCx pp\c<Iq@㖰yذШ2x@use '../../../../../shared-ui/src/styles/semantic/index' as *;

.demo-wrapper {
  padding: $semantic-spacing-layout-md;
  width: 100%;
  max-width: 100%;
  overflow-x: hidden; // Prevent horizontal overflow
  box-sizing: border-box;
}

.demo-section {
  margin-bottom: $semantic-spacing-layout-xl;
  width: 100%;
  overflow-x: hidden; // Prevent horizontal overflow
  
  h2 {
    margin-bottom: $semantic-spacing-layout-md;
    color: $semantic-color-text-primary;
    font-size: 1.5rem;
    font-weight: 600;
    text-align: center;
  }
  
  h3 {
    margin-bottom: $semantic-spacing-component-lg;
    color: $semantic-color-text-primary;
    font-size: 1.25rem;
    font-weight: 600;
  }
  
  h4 {
    margin-bottom: $semantic-spacing-component-sm;
    color: $semantic-color-text-secondary;
    font-size: 1.125rem;
    font-weight: 500;
  }
}

.demo-containers-showcase {
  display: flex;
  flex-direction: column;
  gap: $semantic-spacing-component-lg;
  margin-bottom: $semantic-spacing-layout-lg;
  width: 100%;
  max-width: 100%;
  overflow-x: hidden; // Prevent horizontal overflow
  box-sizing: border-box;
  
  // Ensure all child containers are properly constrained
  .ui-container {
    max-width: min(100%, var(--container-max-width, 100%));
    margin-left: auto;
    margin-right: auto;
  }
}

.demo-container-wrapper {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center; // Center the containers
  overflow-x: hidden; // Prevent horizontal overflow
}

.demo-label {
  font-size: 0.875rem;
  color: $semantic-color-text-secondary;
  margin-bottom: $semantic-spacing-component-xs;
  text-align: center;
  font-weight: 500;
}

.demo-container-outline {
  border: 2px dashed $semantic-color-border-subtle;
  background: rgba($semantic-color-container-primary, 0.05);
  max-width: 100%; // Ensure containers don't overflow their parent
  box-sizing: border-box; // Include padding and border in width calculation
  margin: 0 auto; // Center the container
  position: relative; // For proper positioning context
  
  // Override container component's auto margins that might be causing issues
  &.ui-container {
    margin-left: auto !important;
    margin-right: auto !important;
    left: auto !important;
    right: auto !important;
  }
  
  &.demo-container-tall {
    min-height: 150px;
  }
}

.demo-content {
  color: $semantic-color-text-primary;
  text-align: center;
  padding: $semantic-spacing-component-sm;
  width: 100%;
  max-width: 100%;
  box-sizing: border-box;
  overflow-wrap: break-word; // Handle long text properly
  word-wrap: break-word;
  
  &.hero-content {
    h2 {
      margin-bottom: $semantic-spacing-component-sm;
      color: $semantic-color-text-primary;
    }
    
    p {
      color: $semantic-color-text-secondary;
      font-size: 1.125rem;
    }
  }
}

.demo-variant-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: $semantic-spacing-grid-gap-lg;
}

.demo-variant-item {
  display: flex;
  flex-direction: column;
}

.demo-flex-item {
  background: $semantic-color-container-secondary;
  color: $semantic-color-on-container-secondary;
  padding: $semantic-spacing-component-sm;
  border-radius: $semantic-border-radius-sm;
  text-align: center;
  font-weight: 500;
  width: 100%; // Ensure flex items take full width
  max-width: 100%;
  box-sizing: border-box;
  flex-shrink: 0; // Prevent shrinking
}

.demo-grid-item {
  background: $semantic-color-container-tertiary;
  color: $semantic-color-on-container-tertiary;
  padding: $semantic-spacing-component-sm;
  border-radius: $semantic-border-radius-sm;
  text-align: center;
  font-weight: 500;
  min-height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.demo-paragraph {
  margin-bottom: $semantic-spacing-component-sm;
  color: $semantic-color-text-primary;
  line-height: 1.5;
  
  &:last-child {
    margin-bottom: 0;
  }
}

.demo-wide-content {
  white-space: nowrap;
  color: $semantic-color-text-primary;
  padding: $semantic-spacing-component-sm;
}

// Feature cards styling
:host ::ng-deep {
  .demo-section ui-container[variant="card"] {
    h3 {
      margin-bottom: $semantic-spacing-component-sm;
      color: $semantic-color-text-primary;
      font-size: 1.125rem;
      font-weight: 500;
    }
    
    p {
      color: $semantic-color-text-secondary;
      line-height: 1.5;
      margin: 0;
    }
  }
}

// Additional container demo specific styles
.demo-containers-showcase {
  // Force all containers to behave properly
  .ui-container {
    // Ensure containers don't push beyond boundaries
    position: relative;
    left: 0 !important;
    right: 0 !important;
    transform: none !important;
  }
  
  // Size-specific constraints to prevent overflow
  .ui-container--xs { --container-max-width: 475px; }
  .ui-container--sm { --container-max-width: 640px; }
  .ui-container--md { --container-max-width: 768px; }
  .ui-container--lg { --container-max-width: 1024px; }
  .ui-container--xl { --container-max-width: 1280px; }
  .ui-container--2xl { --container-max-width: 1536px; }
  .ui-container--full { --container-max-width: 100%; }
  
  // Fix flex container alignment issues
  .ui-container--flex {
    align-items: stretch; // Default to stretch for consistent layout
    
    &:not(.ui-container--flex-center):not(.ui-container--flex-start):not(.ui-container--flex-end) {
      align-items: stretch; // Force default alignment for flex containers
    }
  }
}

@media (max-width: 1024px) {
  // Force smaller containers on tablet
  .demo-containers-showcase .ui-container {
    max-width: min(100%, var(--container-max-width, 100%)) !important;
  }
}

@media (max-width: 768px) {
  .demo-variant-grid {
    grid-template-columns: 1fr;
    gap: $semantic-spacing-component-lg;
  }
  
  .demo-containers-showcase {
    gap: $semantic-spacing-component-md;
    
    // Force all containers to be full width on mobile
    .ui-container {
      max-width: 100% !important;
      width: 100% !important;
    }
  }
  
  .demo-wrapper {
    padding: $semantic-spacing-component-md;
  }
}Ǹ	x8Lǳimport { Component, ChangeDetectionStrategy, TemplateRef, ViewChild } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TableComponent } from '../../../../../ui-essentials/src/lib/components/data-display/table/table.component';
import { TableAction, TableActionsComponent } from '../../../../../ui-essentials/src/lib/components/data-display/table-actions.component';
import type { TableColumn } from '../../../../../ui-essentials/src/lib/components/data-display/table/table.component';
import type { TableSortEvent } from '../../../../../ui-essentials/src/lib/components/data-display/table/table.component';
import { StatusBadgeComponent } from '../../../../../ui-essentials/src/lib/components/feedback/status-badge.component';
interface User {
  id: number;
  name: string;
  email: string;
  status: 'active' | 'inactive' | 'pending';
  role: string;
  lastLogin: string;
  joinDate: string;
}

@Component({
  selector: 'ui-table-demo',
  standalone: true,
  imports: [
    CommonModule,
    TableComponent,
    StatusBadgeComponent,
    TableActionsComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Table Component Showcase</h2>

      <!-- Basic Table -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Table</h3>
        <ui-table 
          [data]="userData"
          [columns]="basicColumns"
          variant="default"
          size="default"
          [hoverable]="true"
          (sort)="handleSort($event)"
          (rowClick)="handleRowClick($event)">
        </ui-table>
      </section>

      <!-- Table Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Table Variants</h3>
        
        <div style="margin-bottom: 2rem;">
          <h4>Striped Table</h4>
          <ui-table 
            [data]="userData.slice(0, 5)"
            [columns]="basicColumns"
            variant="striped"
            size="default"
            [hoverable]="true">
          </ui-table>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Bordered Table</h4>
          <ui-table 
            [data]="userData.slice(0, 5)"
            [columns]="basicColumns"
            variant="bordered"
            size="default"
            [hoverable]="true">
          </ui-table>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Minimal Table</h4>
          <ui-table 
            [data]="userData.slice(0, 5)"
            [columns]="basicColumns"
            variant="minimal"
            size="default"
            [hoverable]="true">
          </ui-table>
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        
        <div style="margin-bottom: 2rem;">
          <h4>Compact Size</h4>
          <ui-table 
            [data]="userData.slice(0, 4)"
            [columns]="basicColumns"
            variant="default"
            size="compact"
            [hoverable]="true">
          </ui-table>
        </div>

        <div style="margin-bottom: 2rem;">
          <h4>Comfortable Size</h4>
          <ui-table 
            [data]="userData.slice(0, 4)"
            [columns]="basicColumns"
            variant="default"
            size="comfortable"
            [hoverable]="true">
          </ui-table>
        </div>
      </section>

      <!-- Advanced Table with Status and Actions -->
      <section style="margin-bottom: 3rem;">
        <h3>Advanced Table with Status Badges and Actions</h3>
        <ui-table 
          [data]="userData"
          [columns]="advancedColumns"
          variant="default"
          size="default"
          [hoverable]="true"
          [cellTemplates]="cellTemplates"
          [sortColumn]="currentSortColumn"
          [sortDirection]="currentSortDirection"
          (sort)="handleAdvancedSort($event)"
          (rowClick)="handleAdvancedRowClick($event)">
        </ui-table>

        <!-- Cell Templates -->
        <ng-template #statusTemplate let-value let-row="row">
          <ui-status-badge 
            [variant]="getStatusVariant(value)"
            [dot]="true"
            size="medium">
            {{ value | titlecase }}
          </ui-status-badge>
        </ng-template>

        <ng-template #actionsTemplate let-row="row" let-index="index">
          <ui-table-actions 
            [actions]="getActionsForUser(row)"
            [data]="row"
            [index]="index"
            size="medium"
            [showLabels]="false"
            (actionClick)="handleAction($event)">
          </ui-table-actions>
        </ng-template>
      </section>

      <!-- Sticky Header Table -->
      <section style="margin-bottom: 3rem;">
        <h3>Sticky Header Table</h3>
        <div style="max-height: 300px; overflow-y: auto; border: 1px solid #ddd; border-radius: 8px;">
          <ui-table 
            [data]="largeDataset"
            [columns]="basicColumns"
            variant="default"
            size="compact"
            [stickyHeader]="true"
            [hoverable]="true">
          </ui-table>
        </div>
      </section>

      <!-- Loading State -->
      <section style="margin-bottom: 3rem;">
        <h3>Loading State</h3>
        <ui-table 
          [data]="[]"
          [columns]="basicColumns"
          variant="default"
          size="default"
          [loading]="isLoading"
          loadingMessage="Loading user data...">
        </ui-table>
        <button 
          (click)="toggleLoading()"
          style="margin-top: 1rem; padding: 0.5rem 1rem; border: 1px solid #007bff; background: #007bff; color: white; border-radius: 4px; cursor: pointer;">
          {{ isLoading ? 'Stop Loading' : 'Start Loading' }}
        </button>
      </section>

      <!-- Empty State -->
      <section style="margin-bottom: 3rem;">
        <h3>Empty State</h3>
        <ui-table 
          [data]="[]"
          [columns]="basicColumns"
          variant="default"
          size="default"
          [showEmptyState]="true"
          emptyMessage="No users found. Try adding some users first.">
        </ui-table>
      </section>

      <!-- Selectable Table -->
      <section style="margin-bottom: 3rem;">
        <h3>Selectable Rows</h3>
        <ui-table 
          [data]="userData.slice(0, 6)"
          [columns]="basicColumns"
          variant="default"
          size="default"
          [selectable]="true"
          [hoverable]="true"
          (selectionChange)="handleSelectionChange($event)">
        </ui-table>
        @if (selectedUsers.length > 0) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Selected users:</strong> {{ selectedUsers.length }}
            <div style="margin-top: 0.5rem;">
              @for (user of selectedUsers; track user.id) {
                <span style="display: inline-block; margin: 0.25rem; padding: 0.25rem 0.5rem; background: #fff; border-radius: 4px;">
                  {{ user.name }}
                </span>
              }
            </div>
          </div>
        }
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Table:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-table 
  [data]="tableData"
  [columns]="columns"
  variant="striped"
  size="default"
  [hoverable]="true"
  (sort)="handleSort($event)"
  (rowClick)="handleRowClick($event)"&gt;
&lt;/ui-table&gt;</code></pre>
          
          <h4>With Custom Cell Templates:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-table 
  [data]="userData"
  [columns]="columns"
  [cellTemplates]="cellTemplates"&gt;
&lt;/ui-table&gt;

&lt;ng-template #statusTemplate let-value&gt;
  &lt;ui-status-badge [variant]="getVariant(value)"&gt;
    {{ "{{ value }}" }}
  &lt;/ui-status-badge&gt;
&lt;/ng-template&gt;</code></pre>

          <h4>Column Configuration:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>columns: TableColumn[] = [
  {{ '{' }} key: 'name', label: 'Name', sortable: true {{ '}' }},
  {{ '{' }} key: 'email', label: 'Email', sortable: true {{ '}' }},
  {{ '{' }} key: 'status', label: 'Status', align: 'center' {{ '}' }},
  {{ '{' }} key: 'actions', label: 'Actions', align: 'right' {{ '}' }}
];</code></pre>
        </div>
      </section>

      <!-- Interactive Controls -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Demo Controls</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button (click)="addRandomUser()" style="padding: 0.5rem 1rem; border: 1px solid #28a745; background: #28a745; color: white; border-radius: 4px; cursor: pointer;">
            Add Random User
          </button>
          <button (click)="clearAllUsers()" style="padding: 0.5rem 1rem; border: 1px solid #dc3545; background: #dc3545; color: white; border-radius: 4px; cursor: pointer;">
            Clear All Users
          </button>
          <button (click)="resetDemo()" style="padding: 0.5rem 1rem; border: 1px solid #6c757d; background: #6c757d; color: white; border-radius: 4px; cursor: pointer;">
            Reset Demo
          </button>
        </div>
        
        @if (lastAction) {
          <div style="padding: 1rem; background: #d4edda; border: 1px solid #c3e6cb; border-radius: 4px; color: #155724;">
            <strong>Last Action:</strong> {{ lastAction }}
          </div>
        }
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }
  `]
})
export class TableDemoComponent {
  @ViewChild('statusTemplate') statusTemplate!: TemplateRef<any>;
  @ViewChild('actionsTemplate') actionsTemplate!: TemplateRef<any>;

  isLoading = false;
  selectedUsers: User[] = [];
  lastAction = '';
  currentSortColumn = '';
  currentSortDirection: 'asc' | 'desc' | null = null;

  cellTemplates: Record<string, TemplateRef<any>> = {};

  userData: User[] = [
    {
      id: 1,
      name: 'Alice Johnson',
      email: 'alice@example.com',
      status: 'active',
      role: 'Admin',
      lastLogin: '2024-01-15',
      joinDate: '2023-01-15'
    },
    {
      id: 2,
      name: 'Bob Smith',
      email: 'bob@example.com',
      status: 'inactive',
      role: 'User',
      lastLogin: '2024-01-10',
      joinDate: '2023-02-20'
    },
    {
      id: 3,
      name: 'Carol Williams',
      email: 'carol@example.com',
      status: 'pending',
      role: 'Editor',
      lastLogin: '2024-01-14',
      joinDate: '2023-03-10'
    },
    {
      id: 4,
      name: 'David Brown',
      email: 'david@example.com',
      status: 'active',
      role: 'User',
      lastLogin: '2024-01-16',
      joinDate: '2023-04-05'
    },
    {
      id: 5,
      name: 'Eve Davis',
      email: 'eve@example.com',
      status: 'active',
      role: 'Admin',
      lastLogin: '2024-01-16',
      joinDate: '2023-05-12'
    },
    {
      id: 6,
      name: 'Frank Miller',
      email: 'frank@example.com',
      status: 'inactive',
      role: 'User',
      lastLogin: '2024-01-08',
      joinDate: '2023-06-18'
    }
  ];

  basicColumns: TableColumn[] = [
    { key: 'name', label: 'Name', sortable: true },
    { key: 'email', label: 'Email', sortable: true },
    { key: 'role', label: 'Role', sortable: true },
    { key: 'lastLogin', label: 'Last Login', sortable: true, align: 'right' }
  ];

  advancedColumns: TableColumn[] = [
    { key: 'name', label: 'Name', sortable: true },
    { key: 'email', label: 'Email', sortable: true },
    { key: 'status', label: 'Status', align: 'center' },
    { key: 'role', label: 'Role', sortable: true },
    { key: 'actions', label: 'Actions', align: 'right', width: '120px' }
  ];

  largeDataset: User[] = [];

  ngAfterViewInit(): void {
    // Set up cell templates after view init
    setTimeout(() => {
      this.cellTemplates = {
        'status': this.statusTemplate,
        'actions': this.actionsTemplate
      };
    });

    // Generate large dataset for sticky header demo
    this.largeDataset = this.generateLargeDataset(50);
  }

  handleSort(event: TableSortEvent): void {
    this.lastAction = `Sorted by ${event.column} (${event.direction || 'none'})`;
    console.log('Sort event:', event);
  }

  handleAdvancedSort(event: TableSortEvent): void {
    this.currentSortColumn = event.column;
    this.currentSortDirection = event.direction;
    this.handleSort(event);
    
    // Actually sort the data
    if (event.direction) {
      this.userData.sort((a, b) => {
        const aVal = this.getCellValue(a, event.column);
        const bVal = this.getCellValue(b, event.column);
        
        if (event.direction === 'asc') {
          return aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
        } else {
          return aVal > bVal ? -1 : aVal < bVal ? 1 : 0;
        }
      });
    }
  }

  handleRowClick(event: {row: User, index: number}): void {
    this.lastAction = `Clicked row: ${event.row.name} (index: ${event.index})`;
    console.log('Row click:', event);
  }

  handleAdvancedRowClick(event: {row: User, index: number}): void {
    this.lastAction = `Advanced row click: ${event.row.name}`;
    console.log('Advanced row click:', event);
  }

  handleSelectionChange(selectedUsers: User[]): void {
    this.selectedUsers = selectedUsers;
    this.lastAction = `Selection changed: ${selectedUsers.length} users selected`;
  }

  handleAction(event: any): void {
    const { action, data, index } = event;
    this.lastAction = `Action "${action.id}" on user ${data.name} (index: ${index})`;
    
    switch (action.id) {
      case 'edit':
        console.log('Edit user:', data);
        break;
      case 'delete':
        this.deleteUser(data.id);
        break;
      case 'view':
        console.log('View user:', data);
        break;
    }
  }

  getStatusVariant(status: string): any {
    const variants: any = {
      'active': 'success',
      'inactive': 'danger', 
      'pending': 'warning'
    };
    return variants[status] || 'neutral';
  }

  getActionsForUser(user: User): TableAction[] {
    const baseActions: TableAction[] = [
      { id: 'view', label: 'View', variant: 'view', icon: '👁️' },
      { id: 'edit', label: 'Edit', variant: 'edit', icon: '✏️' }
    ];

    if (user.status !== 'active') {
      baseActions.push({ 
        id: 'delete', 
        label: 'Delete', 
        variant: 'delete', 
        icon: '🗑️',
        confirmMessage: `Are you sure you want to delete ${user.name}?`
      });
    }

    return baseActions;
  }

  toggleLoading(): void {
    this.isLoading = !this.isLoading;
    this.lastAction = `Loading ${this.isLoading ? 'started' : 'stopped'}`;
  }

  addRandomUser(): void {
    const names = ['John Doe', 'Jane Smith', 'Mike Johnson', 'Sarah Wilson', 'Tom Anderson'];
    const roles = ['Admin', 'User', 'Editor', 'Moderator'];
    const statuses: ('active' | 'inactive' | 'pending')[] = ['active', 'inactive', 'pending'];
    
    const newUser: User = {
      id: Math.max(...this.userData.map(u => u.id)) + 1,
      name: names[Math.floor(Math.random() * names.length)],
      email: `user${Date.now()}@example.com`,
      status: statuses[Math.floor(Math.random() * statuses.length)],
      role: roles[Math.floor(Math.random() * roles.length)],
      lastLogin: new Date().toISOString().split('T')[0],
      joinDate: new Date().toISOString().split('T')[0]
    };
    
    this.userData = [...this.userData, newUser];
    this.lastAction = `Added new user: ${newUser.name}`;
  }

  clearAllUsers(): void {
    this.userData = [];
    this.selectedUsers = [];
    this.lastAction = 'Cleared all users';
  }

  resetDemo(): void {
    this.ngOnInit();
    this.selectedUsers = [];
    this.isLoading = false;
    this.lastAction = 'Demo reset to initial state';
  }

  private deleteUser(id: number): void {
    this.userData = this.userData.filter(user => user.id !== id);
    this.selectedUsers = this.selectedUsers.filter(user => user.id !== id);
    this.lastAction = `Deleted user with ID: ${id}`;
  }

  private getCellValue(row: any, key: string): any {
    return key.split('.').reduce((obj, prop) => obj?.[prop], row) ?? '';
  }

  private generateLargeDataset(count: number): User[] {
    const dataset: User[] = [];
    const names = ['Alex', 'Morgan', 'Casey', 'Jordan', 'Taylor', 'Riley', 'Avery', 'Quinn'];
    const domains = ['example.com', 'test.com', 'demo.com', 'sample.com'];
    const roles = ['Admin', 'User', 'Editor', 'Moderator', 'Viewer'];
    const statuses: ('active' | 'inactive' | 'pending')[] = ['active', 'inactive', 'pending'];

    for (let i = 0; i < count; i++) {
      dataset.push({
        id: i + 100,
        name: `${names[i % names.length]} ${i + 1}`,
        email: `user${i + 100}@${domains[i % domains.length]}`,
        status: statuses[i % statuses.length],
        role: roles[i % roles.length],
        lastLogin: new Date(2024, 0, (i % 30) + 1).toISOString().split('T')[0],
        joinDate: new Date(2023, (i % 12), (i % 28) + 1).toISOString().split('T')[0]
      });
    }

    return dataset;
  }

  ngOnInit(): void {
    // Reset to initial data
    this.userData = [
      {
        id: 1,
        name: 'Alice Johnson',
        email: 'alice@example.com',
        status: 'active',
        role: 'Admin',
        lastLogin: '2024-01-15',
        joinDate: '2023-01-15'
      },
      {
        id: 2,
        name: 'Bob Smith',
        email: 'bob@example.com',
        status: 'inactive',
        role: 'User',
        lastLogin: '2024-01-10',
        joinDate: '2023-02-20'
      },
      {
        id: 3,
        name: 'Carol Williams',
        email: 'carol@example.com',
        status: 'pending',
        role: 'Editor',
        lastLogin: '2024-01-14',
        joinDate: '2023-03-10'
      },
      {
        id: 4,
        name: 'David Brown',
        email: 'david@example.com',
        status: 'active',
        role: 'User',
        lastLogin: '2024-01-16',
        joinDate: '2023-04-05'
      },
      {
        id: 5,
        name: 'Eve Davis',
        email: 'eve@example.com',
        status: 'active',
        role: 'Admin',
        lastLogin: '2024-01-16',
        joinDate: '2023-05-12'
      },
      {
        id: 6,
        name: 'Frank Miller',
        email: 'frank@example.com',
        status: 'inactive',
        role: 'User',
        lastLogin: '2024-01-08',
        joinDate: '2023-06-18'
      }
    ];
  }
}.%Fx1T	SBrRsRJt`B%yDIeA*LCNinDXp~QkP;d&UL?1y z-5xZ[o6~ϯ ӱ&m-
ذ˞
Zl.(7Mn$6@X\xܷkIѳO.	^s)sv璮HX|>CD_ke1kx:?G
<AsX%*a Mvbyrӌ^8"LѕPLsE.d<BfDգs.* 	[ODiƷZ$?om`0Yc{\,3{@hIbB 1͵>.]ٔ
K].
f}{`N -zAө`Osf͈X`gHœ ?[A
؎mN&3IMDQ;;cv.Vk<^Er0o3~vL7R.hC;  p/}{;aZځlU81:r%J#	4(0}0/UHɊe}X\^WH8
`T7WVHH>29^1&0oy0nI-ͤyҌ*@VK^fL 6OV;"*5DO2.:LV1Q~cT&#4Mu}Ml,hR7/K3uQ&AnvQH/Qm<RU<^"ۼ|_wO؊<3c2]Ȗ^ iiۤW?F}0Q=0XͩR~Es
q&.}矯)KZQ&)HNEg_\UC(nȜ7y-N?ynw4)fx\+~; Vc1D"X.o=ˣgr,
7z̜"{zVX#֊1qVw9l)t}KoBmW+Vf<B3Js\͞{vD.i>'+E}L>2(Ђ߬-Xa틷&Y#[ZCۚ(ZPcHhqIjun<E%-eNBUG3\f\D4K@+vM(UҰ&ٜef vW(Aa'd^мtԻa|ʌu2l44+~? UW^gSimJhrOkL{{m;mщLQX2xkRT*LHm,K*֛!6 ~fpAsHrOtgu1vxfn]g./\׍qW<^/5Zw^?!賸eUs5|ph{#0\ Oi5@? IF޼>]Bc`eaVdٖTResXD[ j\_ד.:RhVf{O8;!<%{|/CbvnBXNd~'!yŕԩS{ZW#w9O3et7rO:!6ۓ@c$TvY_a|mߧcGHVXM,zyA*Uukr$*X͠4?Xy'KYQi'[3L[:RoU +
_4yQDRШStA+жZ{I3.|{GH/,<3:Bb1'Ui^9vaw߷pDHTUCBg8lMu'i{oGxXKo6W6H2vBl=@{{]H"cJ%YN7p曙o|WZ of{6c8-̚xfFYșr"	a0K~z+eqZWf6@>8SƮ4c\BMD	},sg
mE=f@2'GW,"߅^S+Fp0L-ihr!QC:56Zl+dɌ=^56$gO0T$̡!JD[hB+3vrAZ!SݞmwLעWFEWMMJ7{.k+ӕn\t㋏5U䃐%sp |ĝŏѥ4	Flk.Xq&'VK"[.,jYOt"q_Hz߬GSPs:?F8ͦqIf3!yk;tRQaOp76R^X|hNmCCbsq~}[ˊKc5LJ`OD_*hKqd?YI'Lpu۫U *xijH40ayG;?aCtqhR3bCz[g5Ιp.r1!ᰓ؟3"Mٽc<A?TQxJzsiH64d & :>?Tn(Pd֖`m?k٪@*
BhZ+Y(o&nϡnF
k](#K>{*:I,ji,q-M35"|u1c@ns?hɀAIYqbG̞6[:+=!/;UmϢBy_AZ9{!ͣM՛͌Pڶbd^Ril:+/kBy`ئ6ᑒ&9[u!ZE.FFMKa<:e~nZ}1;t4G"xPL3c.
1)ü
Ɍ0Fͱ^vz_hD{AoNXjdѱ~=mu7+^oּO{M#3A(cv7w#upK/tC᝕`2L+d[?4 O\>*#7	|j%:77>n>yפsǇ:;+$~;9/Eo bxN export * from './table.component';
export * from '../table-actions.component';x`@use '../../../../../../shared-ui/src/styles/semantic' as tokens;

.ui-spacer {
  display: block;
  position: relative;
  
  // Default spacing
  width: tokens.$semantic-spacing-md;
  height: tokens.$semantic-spacing-md;
  
  // Size variants
  &--xs {
    width: tokens.$semantic-spacing-xs;
    height: tokens.$semantic-spacing-xs;
  }
  
  &--sm {
    width: tokens.$semantic-spacing-sm;
    height: tokens.$semantic-spacing-sm;
  }
  
  &--md {
    width: tokens.$semantic-spacing-md;
    height: tokens.$semantic-spacing-md;
  }
  
  &--lg {
    width: tokens.$semantic-spacing-lg;
    height: tokens.$semantic-spacing-lg;
  }
  
  &--xl {
    width: tokens.$semantic-spacing-xl;
    height: tokens.$semantic-spacing-xl;
  }
  
  &--2xl {
    width: tokens.$semantic-spacing-2xl;
    height: tokens.$semantic-spacing-2xl;
  }
  
  &--3xl {
    width: tokens.$semantic-spacing-3xl;
    height: tokens.$semantic-spacing-3xl;
  }
  
  &--4xl {
    width: tokens.$semantic-spacing-4xl;
    height: tokens.$semantic-spacing-4xl;
  }
  
  &--5xl {
    width: tokens.$semantic-spacing-5xl;
    height: tokens.$semantic-spacing-5xl;
  }
  
  // Directional variants
  &--horizontal {
    height: 0;
    width: tokens.$semantic-spacing-md;
    
    &.ui-spacer--xs { width: tokens.$semantic-spacing-xs; }
    &.ui-spacer--sm { width: tokens.$semantic-spacing-sm; }
    &.ui-spacer--md { width: tokens.$semantic-spacing-md; }
    &.ui-spacer--lg { width: tokens.$semantic-spacing-lg; }
    &.ui-spacer--xl { width: tokens.$semantic-spacing-xl; }
    &.ui-spacer--2xl { width: tokens.$semantic-spacing-2xl; }
    &.ui-spacer--3xl { width: tokens.$semantic-spacing-3xl; }
    &.ui-spacer--4xl { width: tokens.$semantic-spacing-4xl; }
    &.ui-spacer--5xl { width: tokens.$semantic-spacing-5xl; }
  }
  
  &--vertical {
    width: 0;
    height: tokens.$semantic-spacing-md;
    
    &.ui-spacer--xs { height: tokens.$semantic-spacing-xs; }
    &.ui-spacer--sm { height: tokens.$semantic-spacing-sm; }
    &.ui-spacer--md { height: tokens.$semantic-spacing-md; }
    &.ui-spacer--lg { height: tokens.$semantic-spacing-lg; }
    &.ui-spacer--xl { height: tokens.$semantic-spacing-xl; }
    &.ui-spacer--2xl { height: tokens.$semantic-spacing-2xl; }
    &.ui-spacer--3xl { height: tokens.$semantic-spacing-3xl; }
    &.ui-spacer--4xl { height: tokens.$semantic-spacing-4xl; }
    &.ui-spacer--5xl { height: tokens.$semantic-spacing-5xl; }
  }
  
  // Flexible spacer (grows to fill available space)
  &--flexible {
    flex: 1;
    
    &.ui-spacer--horizontal {
      width: auto !important;
      min-width: tokens.$semantic-spacing-xs;
    }
    
    &.ui-spacer--vertical {
      height: auto !important;
      min-height: tokens.$semantic-spacing-xs;
    }
  }
  
  // Component-specific spacing variants
  &--component-xs {
    width: tokens.$semantic-spacing-component-xs;
    height: tokens.$semantic-spacing-component-xs;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-xs;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-xs;
    }
  }
  
  &--component-sm {
    width: tokens.$semantic-spacing-component-sm;
    height: tokens.$semantic-spacing-component-sm;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-sm;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-sm;
    }
  }
  
  &--component-md {
    width: tokens.$semantic-spacing-component-md;
    height: tokens.$semantic-spacing-component-md;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-md;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-md;
    }
  }
  
  &--component-lg {
    width: tokens.$semantic-spacing-component-lg;
    height: tokens.$semantic-spacing-component-lg;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-lg;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-lg;
    }
  }
  
  &--component-xl {
    width: tokens.$semantic-spacing-component-xl;
    height: tokens.$semantic-spacing-component-xl;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-component-xl;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-component-xl;
    }
  }
  
  // Layout-specific spacing variants
  &--layout-xs {
    width: tokens.$semantic-spacing-layout-xs;
    height: tokens.$semantic-spacing-layout-xs;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-xs;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-xs;
    }
  }
  
  &--layout-sm {
    width: tokens.$semantic-spacing-layout-sm;
    height: tokens.$semantic-spacing-layout-sm;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-sm;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-sm;
    }
  }
  
  &--layout-md {
    width: tokens.$semantic-spacing-layout-md;
    height: tokens.$semantic-spacing-layout-md;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-md;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-md;
    }
  }
  
  &--layout-lg {
    width: tokens.$semantic-spacing-layout-lg;
    height: tokens.$semantic-spacing-layout-lg;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-lg;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-lg;
    }
  }
  
  &--layout-xl {
    width: tokens.$semantic-spacing-layout-xl;
    height: tokens.$semantic-spacing-layout-xl;
    
    &.ui-spacer--horizontal {
      width: tokens.$semantic-spacing-layout-xl;
      height: 0;
    }
    
    &.ui-spacer--vertical {
      width: 0;
      height: tokens.$semantic-spacing-layout-xl;
    }
  }
  
  // Visual debug mode (only in development)
  &--debug {
    background: repeating-linear-gradient(
      45deg,
      transparent,
      transparent 2px,
      rgba(255, 0, 0, 0.1) 2px,
      rgba(255, 0, 0, 0.1) 4px
    );
    border: 1px dashed rgba(255, 0, 0, 0.3);
  }
  
  // Responsive behavior
  @media (max-width: 768px) {
    &--responsive {
      &.ui-spacer--xl,
      &.ui-spacer--2xl,
      &.ui-spacer--3xl,
      &.ui-spacer--4xl,
      &.ui-spacer--5xl {
        width: tokens.$semantic-spacing-lg;
        height: tokens.$semantic-spacing-lg;
        
        &.ui-spacer--horizontal {
          width: tokens.$semantic-spacing-lg;
          height: 0;
        }
        
        &.ui-spacer--vertical {
          width: 0;
          height: tokens.$semantic-spacing-lg;
        }
      }
    }
  }
  
  @media (max-width: 480px) {
    &--responsive {
      &.ui-spacer--lg,
      &.ui-spacer--xl,
      &.ui-spacer--2xl,
      &.ui-spacer--3xl,
      &.ui-spacer--4xl,
      &.ui-spacer--5xl {
        width: tokens.$semantic-spacing-md;
        height: tokens.$semantic-spacing-md;
        
        &.ui-spacer--horizontal {
          width: tokens.$semantic-spacing-md;
          height: 0;
        }
        
        &.ui-spacer--vertical {
          width: 0;
          height: tokens.$semantic-spacing-md;
        }
      }
    }
  }
}xq[x;qJ=cY0',"%`b 
y5}6V|<TACN=}-m${os	)&eM3e #nx >7x@JI{]#x[tq`iC3̼
bUzif{a}	{ [Jcx1 )S$100644 index.ts %@(W)͚aKL^x4iB8hUg>aqybO' R^@x4I JKJ׽6p]:ʃj6#D9D32L/<斈{:Pxn 57"Y}C4[uT-,40000 feedback +-巫0?eD;БlMR$c?WqwoLg_4>8և#9\WlVHG1|x4iBHTE"mIp6,51g% cxM'@use "../../../../../../shared-ui/src/styles/semantic/index" as *;

// Tokens available globally via main application styles

.ui-card {
  position: relative;
  width: 100%;
  box-sizing: border-box;
  margin-right: $semantic-spacing-grid-gap-xs;
  margin-bottom: $semantic-spacing-grid-gap-xs;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  
  // Base styles
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  transition: all $semantic-duration-fast $semantic-easing-standard;
  
  // Size variants - following 8px grid increments
  &--sm {
    min-height: $semantic-sizing-card-height-sm;
    
    .card-content-layer {
      padding: $semantic-spacing-component-padding-sm;
    }
    
    .card-header {
      padding-bottom: $semantic-spacing-component-sm;
    }
    
    .card-footer {
      padding-top: $semantic-spacing-component-sm;
    }
  }
  
  &--md {
    min-height: $semantic-sizing-card-height-md;
    
    .card-content-layer {
      padding: $semantic-spacing-component-padding-lg;
    }
    
    .card-header {
      padding-bottom: $semantic-spacing-component-md;
    }
    
    .card-footer {
      padding-top: $semantic-spacing-component-md;
    }
  }
  
  &--lg {
    min-height: $semantic-sizing-card-height-lg;
    
    .card-content-layer {
      padding: $semantic-spacing-component-padding-xl;
    }
    
    .card-header {
      padding-bottom: $semantic-spacing-component-lg;
    }
    
    .card-footer {
      padding-top: $semantic-spacing-component-lg;
    }
  }
  
  // Elevation variants - Material Design shadow levels
  &--elevation-none {
    box-shadow: none;
  }
  
  &--elevation-sm {
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  &--elevation-md {
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &--elevation-lg {
    box-shadow: $semantic-shadow-elevation-3;
  }
  
  &--elevation-xl {
    box-shadow: $semantic-shadow-elevation-4;
  }
  
  // Radius variants - consistent scale
  &--radius-none {
    border-radius: 0;
  }
  
  &--radius-sm {
    border-radius: $semantic-border-radius-sm;
  }
  
  &--radius-md {
    border-radius: $semantic-border-radius-md;
  }
  
  &--radius-lg {
    border-radius: $semantic-border-radius-lg;
  }
  
  &--radius-full {
    border-radius: $semantic-border-radius-full;
    aspect-ratio: 1;
  }
  
  // Variant styles - Material Design 3 inspired colors
  &--elevated {
    background-color: $semantic-color-surface-primary;
    border: none;
    
    &:hover:not(.ui-card--disabled) {
      transform: translateY(-2px);
      box-shadow: $semantic-shadow-card-hover;
    }
  }
  
  &--filled {
    background-color: $semantic-color-container-primary;
    border: $semantic-border-width-1 solid $semantic-color-border-primary;
    
    &:hover:not(.ui-card--disabled) {
      background-color: $semantic-color-surface-interactive;
    }
  }
  
  &--outlined {
    background-color: transparent;
    border: $semantic-border-width-1 solid $semantic-color-border-secondary;
    
    &:hover:not(.ui-card--disabled) {
      border-color: $semantic-color-border-focus;
      background-color: $semantic-color-surface-elevated;
    }
  }
  
  // Clickable state
  &--clickable {
    cursor: pointer;
    user-select: none;
    
    &:active:not(.ui-card--disabled) {
      transform: scale(0.98); // Subtle press effect
    }
    
    &:focus-visible {
      outline: 2px solid $semantic-color-border-focus;
      outline-offset: 2px;
    }
  }
  
  // Disabled state
  &--disabled {
    opacity: 0.38; // Material Design disabled opacity
    cursor: not-allowed;
    pointer-events: none;
  }
  
  // Glass effect using CSS variables and semantic approach
  &--glass {
    position: relative;
    isolation: isolate;
    backdrop-filter: blur(var(--glass-blur-md, 8px));
    -webkit-backdrop-filter: blur(var(--glass-blur-md, 8px));
    border: 1px solid var(--glass-border-color, rgba(255, 255, 255, 0.2));
    transition: all $semantic-duration-short $semantic-easing-standard;
    
    .card-content-layer {
      position: relative;
      z-index: 2;
    }
    
    // Glass variant styles using CSS variables - fixed syntax
    &.ui-card--glass-translucent {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-translucent, 0.1));
      backdrop-filter: blur(var(--glass-blur-sm, 4px));
      -webkit-backdrop-filter: blur(var(--glass-blur-sm, 4px));
    }
    
    &.ui-card--glass-light {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-light, 0.3));
      backdrop-filter: blur(var(--glass-blur-md, 8px));
      -webkit-backdrop-filter: blur(var(--glass-blur-md, 8px));
    }
    
    &.ui-card--glass-medium {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-medium, 0.5));
      backdrop-filter: blur(var(--glass-blur-md, 8px));
      -webkit-backdrop-filter: blur(var(--glass-blur-md, 8px));
    }
    
    &.ui-card--glass-heavy {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-heavy, 0.7));
      backdrop-filter: blur(var(--glass-blur-lg, 16px));
      -webkit-backdrop-filter: blur(var(--glass-blur-lg, 16px));
    }
    
    &.ui-card--glass-frosted {
      background: rgba(var(--glass-background-base, 255, 255, 255), var(--glass-opacity-frosted, 0.85));
      backdrop-filter: blur(var(--glass-blur-xl, 24px));
      -webkit-backdrop-filter: blur(var(--glass-blur-xl, 24px));
    }
    
    // Interactive glass states
    &.ui-card--clickable:hover:not(.ui-card--disabled) {
      transform: translateY(-2px);
      box-shadow: $semantic-shadow-elevation-3;
    }
    
    &.ui-card--clickable:active:not(.ui-card--disabled) {
      transform: scale(0.98);
    }
    
    // Disabled state for glass cards
    &.ui-card--disabled {
      backdrop-filter: blur(var(--glass-blur-xs, 2px));
      -webkit-backdrop-filter: blur(var(--glass-blur-xs, 2px));
      opacity: 0.6;
    }
  }
  
  // With background layer
  &--with-background {
    .card-background-layer {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      box-sizing: border-box;
      transform: translateZ(0);
      z-index: 0;
    }
    
    .card-content-layer {
      position: relative;
      z-index: 1;
      background: rgba(255, 255, 255, 0.9); // Semi-transparent overlay
      
      @media (prefers-color-scheme: dark) {
        background: rgba(0, 0, 0, 0.7);
        color: $semantic-color-text-inverse;
      }
    }
  }
}

// Card content structure
.card-content-layer {
  display: flex;
  flex-direction: column;
  height: 100%;
  flex: 1;
}

.card-header {
  border-bottom: $semantic-border-width-1 solid $semantic-color-border-secondary;
  
  h1, h2, h3, h4, h5, h6 {
    margin: 0;
    color: $semantic-color-text-primary;
  }
  
  p {
    margin: 0;
    color: $semantic-color-text-secondary;
  }
}

.card-body {
  flex: 1;
  
  // Typography reset
  > *:first-child {
    margin-top: 0;
  }
  
  > *:last-child {
    margin-bottom: 0;
  }
}

.card-footer {
  border-top: $semantic-border-width-1 solid $semantic-color-border-secondary;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: $semantic-spacing-component-sm;
}

// Glass overlay for enhanced glass effect
.card-glass-overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: linear-gradient(145deg, 
    rgba(255, 255, 255, 0.1) 0%,
    rgba(255, 255, 255, 0.05) 50%,
    rgba(255, 255, 255, 0.1) 100%);
  pointer-events: none;
  z-index: 1;
  border-radius: inherit;
}

// Ripple effect for clickable cards
.card-ripple-overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 3;
  
  &::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: 0;
    height: 0;
    border-radius: 50%;
    background: rgba(120, 53, 255, 0.2); // Brand color ripple
    transform: translate(-50%, -50%) scale(0);
    opacity: 0;
    transition: transform 0.3s ease, opacity 0.3s ease;
  }
  
  .ui-card--clickable:active & {
    &::after {
      transform: translate(-50%, -50%) scale(2);
      opacity: 1;
      transition: none;
    }
  }
}

// Hover effects based on elevation
.ui-card:hover:not(.ui-card--disabled) {
  &.ui-card--elevation-sm {
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &.ui-card--elevation-md {
    box-shadow: $semantic-shadow-elevation-3;
  }
  
  &.ui-card--elevation-lg {
    box-shadow: $semantic-shadow-elevation-4;
  }
}

// Dark mode support
@media (prefers-color-scheme: dark) {
  .ui-card {
    &--elevated {
      background-color: $semantic-color-surface-primary;
      color: $semantic-color-text-inverse;
    }
    
    &--filled {
      background-color: $semantic-color-surface-secondary;
      border-color: $semantic-color-border-primary;
      color: $semantic-color-text-inverse;
    }
    
    &--outlined {
      background-color: transparent;
      border-color: $semantic-color-border-primary;
      color: $semantic-color-text-inverse;
    }
    
    .card-header {
      border-color: $semantic-color-border-primary;
      
      h1, h2, h3, h4, h5, h6 {
        color: $semantic-color-text-inverse;
      }
      
      p {
        color: $semantic-color-text-secondary;
      }
    }
    
    .card-footer {
      border-color: $semantic-color-border-primary;
    }
  }
}

// Responsive adaptations
@media (max-width: $semantic-sizing-breakpoint-tablet) {
  .ui-card {
    margin-right: 0;
    
    &--lg {
      .card-content-layer {
        padding: $semantic-spacing-component-padding-lg;
      }
    }
    
    .card-footer {
      flex-direction: column;
      gap: $semantic-spacing-component-md;
    }
  }
}

// Accessibility
@media (prefers-reduced-motion: reduce) {
  .ui-card {
    transition: none;
    
    &:hover,
    &:active {
      transform: none;
    }
  }
  
  .card-ripple-overlay::after {
    transition: none;
  }
}s!x@use "../../../../../../shared-ui/src/styles/semantic/index" as *;

@mixin font-properties($font-map) {
  @if type-of($font-map) == 'map' {
    font-family: map-get($font-map, 'font-family');
    font-size: map-get($font-map, 'font-size');
    line-height: map-get($font-map, 'line-height');
    font-weight: map-get($font-map, 'font-weight');
    letter-spacing: map-get($font-map, 'letter-spacing');
  } @else {
    font: $font-map;
  }
}

.carousel {
  position: relative;
  width: 100%;
  overflow: hidden;
  border-radius: 12px;
  background: $semantic-color-surface-container;

  .carousel-container {
    position: relative;
    width: 100%;
    height: 400px; // Default height
    overflow: hidden;
  }

  .carousel-track {
    display: flex;
    width: 100%;
    height: 100%;
    transition: transform $semantic-duration-medium $semantic-easing-standard;
  }

  .carousel-slide {
    flex: 0 0 100%;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;

    &.multiple-items {
      flex: 0 0 calc(100% / var(--items-per-view, 1));
    }

    img {
      width: 100%;
      height: 100%;
      object-fit: cover;
    }

    .slide-content {
      padding: $semantic-spacing-component-lg;
      text-align: center;
      color: $semantic-color-text-primary;

      h3 {
        @include font-properties($semantic-typography-heading-h3);
        margin-bottom: $semantic-spacing-component-md;
      }

      p {
        @include font-properties($semantic-typography-body-medium);
        color: $semantic-color-text-secondary;
      }
    }
  }

  .carousel-controls {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    z-index: 2;

    button {
      background: rgba(255, 255, 255, 0.9);
      border: none;
      border-radius: 50%;
      width: 48px;
      height: 48px;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      box-shadow: $semantic-shadow-elevation-3;
      transition: all $semantic-motion-duration-fast $semantic-easing-standard;

      &:hover {
        background: white;
        transform: scale(1.1);
      }

      &:focus {
        outline: 2px solid $semantic-color-primary;
        outline-offset: 2px;
      }

      &:disabled {
        opacity: 0.5;
        cursor: not-allowed;
        transform: none;
      }

      svg {
        width: 20px;
        height: 20px;
        fill: $semantic-color-text-primary;
      }
    }

    &.prev {
      left: $semantic-spacing-component-md;
    }

    &.next {
      right: $semantic-spacing-component-md;
    }
  }

  .carousel-indicators {
    position: absolute;
    bottom: $semantic-spacing-component-md;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: $semantic-spacing-component-xs;
    z-index: 2;

    button {
      width: 12px;
      height: 12px;
      border-radius: 50%;
      border: none;
      background: rgba(255, 255, 255, 0.5);
      cursor: pointer;
      transition: all $semantic-duration-medium $semantic-easing-standard;

      &.active {
        background: $semantic-color-primary;
        transform: scale(1.2);
      }

      &:hover {
        background: rgba(255, 255, 255, 0.8);
      }

      &:focus {
        outline: 2px solid $semantic-color-primary;
        outline-offset: 2px;
      }
    }
  }

  // Responsive design
  @media (max-width: 768px) {
    .carousel-container {
      height: 300px;
    }

    .carousel-controls button {
      width: 40px;
      height: 40px;

      svg {
        width: 16px;
        height: 16px;
      }
    }

    .carousel-slide .slide-content {
      padding: $semantic-spacing-component-md;
    }
  }
}

// Auto-play animation
.carousel.auto-play .carousel-track {
  transition: transform $semantic-duration-medium $semantic-easing-standard;
}븶xh@use "../../../../../../shared-ui/src/styles/semantic/index" as *;

.video-player {
  position: relative;
  width: 100%;
  max-width: 800px;
  background: $semantic-color-surface;
  border-radius: 12px;
  overflow: hidden;
  box-shadow: $semantic-shadow-card-rest;

  &.fullscreen {
    max-width: none;
    width: 100vw;
    height: 100vh;
    border-radius: 0;
  }

  .video-container {
    position: relative;
    width: 100%;
    height: 0;
    padding-bottom: 56.25%; // 16:9 aspect ratio
    background: #000;

    video {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      object-fit: contain;
    }
  }

  .controls {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    background: linear-gradient(transparent, rgba(0, 0, 0, 0.7));
    padding: $semantic-spacing-component-lg $semantic-spacing-component-md $semantic-spacing-component-md;
    opacity: 0;
    transition: opacity $semantic-motion-duration-normal $semantic-motion-easing-ease;

    &.visible {
      opacity: 1;
    }

    .progress-bar {
      width: 100%;
      height: 4px;
      background: rgba(255, 255, 255, 0.3);
      border-radius: 2px;
      margin-bottom: $semantic-spacing-component-sm;
      cursor: pointer;

      .progress {
        height: 100%;
        background: $semantic-color-primary;
        border-radius: 2px;
        transition: width 0.1s linear;
      }
    }

    .control-buttons {
      display: flex;
      align-items: center;
      gap: $semantic-spacing-component-sm;

      button {
        background: none;
        border: none;
        color: white;
        cursor: pointer;
        padding: $semantic-spacing-component-xs;
        border-radius: 4px;
        transition: background-color $semantic-motion-duration-fast $semantic-motion-easing-ease;

        &:hover {
          background: rgba(255, 255, 255, 0.2);
        }

        &:focus {
          outline: 2px solid $semantic-color-primary;
          outline-offset: 2px;
        }
      }

      .time-display {
        color: white;
        font-family: map-get($semantic-typography-body-small, font-family);
        font-size: map-get($semantic-typography-body-small, font-size);
        font-weight: map-get($semantic-typography-body-small, font-weight);
        line-height: map-get($semantic-typography-body-small, line-height);
        letter-spacing: map-get($semantic-typography-body-small, letter-spacing);
        margin-left: auto;
      }
    }
  }

  &:hover .controls {
    opacity: 1;
  }
}

@mixin font-properties($font-map) {
  @if type-of($font-map) == 'map' {
    font-family: map-get($font-map, 'font-family');
    font-size: map-get($font-map, 'font-size');
    line-height: map-get($font-map, 'line-height');
    font-weight: map-get($font-map, 'font-weight');
    letter-spacing: map-get($font-map, 'letter-spacing');
  } @else {
    font: $font-map;
  }
}x,xE1import { Component, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons';
import { TextButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons';
import { GhostButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons';
import { FabComponent } from '../../../../../ui-essentials/src/lib/components/buttons';
import { SimpleButtonComponent } from '../../../../../ui-essentials/src/lib/components/buttons';
import { 
  faDownload, 
  faPlus, 
  faShare, 
  faHeart, 
  faBookmark, 
  faEdit, 
  faTrash, 
  faSave,
  faArrowRight,
  faArrowLeft,
  faSearch,
  faUpload
} from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'ui-button-demo',
  standalone: true,
  imports: [
    CommonModule,
    ButtonComponent,
    TextButtonComponent, 
    GhostButtonComponent,
    FabComponent,
    SimpleButtonComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Button Component Showcase</h2>
      
      <!-- Filled Button Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Filled Buttons</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-button variant="filled" size="small" (clicked)="handleClick('small filled')">Small</ui-button>
          <ui-button variant="filled" size="medium" (clicked)="handleClick('medium filled')">Medium</ui-button>
          <ui-button variant="filled" size="large" (clicked)="handleClick('large filled')">Large</ui-button>
        </div>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-button variant="filled" [disabled]="true">Disabled</ui-button>
          <ui-button variant="filled" [loading]="true">Loading</ui-button>
          <ui-button variant="filled" [fullWidth]="false">Full Width</ui-button>
        </div>
      </section>

      <!-- Tonal Button Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Tonal Buttons</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-button variant="tonal" size="small" (clicked)="handleClick('small tonal')">Small</ui-button>
          <ui-button variant="tonal" size="medium" (clicked)="handleClick('medium tonal')">Medium</ui-button>
          <ui-button variant="tonal" size="large" (clicked)="handleClick('large tonal')">Large</ui-button>
        </div>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
          <ui-button variant="tonal" [disabled]="true">Disabled</ui-button>
          <ui-button variant="tonal" [loading]="true">Loading</ui-button>
        </div>
      </section>

      <!-- Outlined Button Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Outlined Buttons</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-button variant="outlined" size="small" (clicked)="handleClick('small outlined')">Small</ui-button>
          <ui-button variant="outlined" size="medium" (clicked)="handleClick('medium outlined')">Medium</ui-button>
          <ui-button variant="outlined" size="large" (clicked)="handleClick('large outlined')">Large</ui-button>
        </div>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
          <ui-button variant="outlined" [disabled]="true">Disabled</ui-button>
          <ui-button variant="outlined" [loading]="true">Loading</ui-button>
        </div>
      </section>

      <!-- Text Buttons -->
      <section style="margin-bottom: 3rem;">
        <h3>Text Buttons</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-text-button size="small" (clicked)="handleClick('small text')">Small</ui-text-button>
          <ui-text-button size="medium" (clicked)="handleClick('medium text')">Medium</ui-text-button>
          <ui-text-button size="large" (clicked)="handleClick('large text')">Large</ui-text-button>
        </div>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
          <ui-text-button [disabled]="true">Disabled</ui-text-button>
          <ui-text-button [loading]="true">Loading</ui-text-button>
        </div>
      </section>

      <!-- Ghost Buttons -->
      <section style="margin-bottom: 3rem;">
        <h3>Ghost Buttons</h3>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-ghost-button size="small" (clicked)="handleClick('small ghost')">Small</ui-ghost-button>
          <ui-ghost-button size="medium" (clicked)="handleClick('medium ghost')">Medium</ui-ghost-button>
          <ui-ghost-button size="large" (clicked)="handleClick('large ghost')">Large</ui-ghost-button>
        </div>
        <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
          <ui-ghost-button [disabled]="true">Disabled</ui-ghost-button>
          <ui-ghost-button [loading]="true">Loading</ui-ghost-button>
          <ui-ghost-button [fullWidth]="false">Full Width</ui-ghost-button>
        </div>
      </section>

      <!-- FAB Components -->
      <section style="margin-bottom: 3rem;">
        <h3>Floating Action Buttons (FAB)</h3>
        
        <!-- FAB Sizes -->
        <div style="margin-bottom: 2rem;">
          <h4>Sizes</h4>
          <div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap;">
            <div style="text-align: center;">
              <ui-fab variant="primary" size="small" position="static" (clicked)="handleClick('small fab')">+</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Small</p>
            </div>
            <div style="text-align: center;">
              <ui-fab variant="primary" size="medium" position="static" (clicked)="handleClick('medium fab')">+</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Medium</p>
            </div>
            <div style="text-align: center;">
              <ui-fab variant="primary" size="large" position="static" (clicked)="handleClick('large fab')">✨</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Large</p>
            </div>
          </div>
        </div>

        <!-- FAB Variants -->
        <div style="margin-bottom: 2rem;">
          <h4>Variants</h4>
          <div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap;">
            <div style="text-align: center;">
              <ui-fab variant="primary" size="medium" position="static" (clicked)="handleClick('primary fab')">📧</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Primary</p>
            </div>
            <div style="text-align: center;">
              <ui-fab variant="secondary" size="medium" position="static" (clicked)="handleClick('secondary fab')">📞</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Secondary</p>
            </div>
            <div style="text-align: center;">
              <ui-fab variant="tertiary" size="medium" position="static" (clicked)="handleClick('tertiary fab')">💬</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Tertiary</p>
            </div>
          </div>
        </div>

        <!-- FAB States -->
        <div style="margin-bottom: 2rem;">
          <h4>States</h4>
          <div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap;">
            <div style="text-align: center;">
              <ui-fab variant="primary" size="medium" position="static" [pulse]="true" (clicked)="handleClick('pulse fab')">🔔</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Pulse</p>
            </div>
            <div style="text-align: center;">
              <ui-fab variant="primary" size="medium" position="static" [disabled]="true">⚙️</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Disabled</p>
            </div>
            <div style="text-align: center;">
              <ui-fab variant="primary" size="medium" position="static" [loading]="true">📤</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Loading</p>
            </div>
            <div style="text-align: center;">
              <ui-fab variant="primary" size="medium" position="static" [expandOnClick]="true" (clicked)="handleClick('expand fab')">✨</ui-fab>
              <p style="font-size: 12px; margin: 0.5rem 0;">Expand</p>
            </div>
          </div>
        </div>
      </section>

      <!-- Buttons with Icons -->
      <section style="margin-bottom: 3rem;">
        <h3>Buttons with Icons</h3>
        
        <!-- Left Icons -->
        <div style="margin-bottom: 2rem;">
          <h4>Icons on Left</h4>
          <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
            <ui-button variant="filled" [icon]="faDownload" iconPosition="left" (clicked)="handleClick('download')">Download</ui-button>
            <ui-button variant="filled" [icon]="faPlus" iconPosition="left" (clicked)="handleClick('add new')">Add New</ui-button>
            <ui-button variant="filled" [icon]="faUpload" iconPosition="left" (clicked)="handleClick('upload')">Upload</ui-button>
          </div>
          <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
            <ui-button variant="tonal" [icon]="faEdit" iconPosition="left" (clicked)="handleClick('edit')">Edit</ui-button>
            <ui-button variant="tonal" [icon]="faShare" iconPosition="left" (clicked)="handleClick('share')">Share</ui-button>
            <ui-button variant="tonal" [icon]="faSave" iconPosition="left" (clicked)="handleClick('save')">Save</ui-button>
          </div>
          <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
            <ui-button variant="outlined" [icon]="faBookmark" iconPosition="left" (clicked)="handleClick('bookmark')">Bookmark</ui-button>
            <ui-button variant="outlined" [icon]="faHeart" iconPosition="left" (clicked)="handleClick('favorite')">Favorite</ui-button>
            <ui-button variant="outlined" [icon]="faSearch" iconPosition="left" (clicked)="handleClick('search')">Search</ui-button>
          </div>
        </div>

        <!-- Right Icons -->
        <div style="margin-bottom: 2rem;">
          <h4>Icons on Right</h4>
          <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
            <ui-button variant="filled" [icon]="faArrowRight" iconPosition="right" (clicked)="handleClick('next')">Next</ui-button>
            <ui-button variant="filled" [icon]="faArrowRight" iconPosition="right" (clicked)="handleClick('continue')">Continue</ui-button>
            <ui-button variant="filled" [icon]="faArrowRight" iconPosition="right" (clicked)="handleClick('proceed')">Proceed</ui-button>
          </div>
          <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
            <ui-button variant="tonal" [icon]="faArrowLeft" iconPosition="right" (clicked)="handleClick('back')">Back</ui-button>
            <ui-button variant="outlined" [icon]="faTrash" iconPosition="right" (clicked)="handleClick('delete')">Delete</ui-button>
          </div>
        </div>

        <!-- Size Variants with Icons -->
        <div style="margin-bottom: 2rem;">
          <h4>Different Sizes with Icons</h4>
          <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
            <ui-button variant="filled" size="small" [icon]="faPlus" iconPosition="left" (clicked)="handleClick('small icon')">Small</ui-button>
            <ui-button variant="filled" size="medium" [icon]="faPlus" iconPosition="left" (clicked)="handleClick('medium icon')">Medium</ui-button>
            <ui-button variant="filled" size="large" [icon]="faPlus" iconPosition="left" (clicked)="handleClick('large icon')">Large</ui-button>
          </div>
        </div>

        <!-- Icon-only Style -->
        <div style="margin-bottom: 2rem;">
          <h4>Icon with Minimal Text</h4>
          <div style="display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;">
            <ui-button variant="filled" [icon]="faDownload" iconPosition="left" (clicked)="handleClick('dl')">DL</ui-button>
            <ui-button variant="tonal" [icon]="faEdit" iconPosition="left" (clicked)="handleClick('edit short')">Edit</ui-button>
            <ui-button variant="outlined" [icon]="faTrash" iconPosition="right" (clicked)="handleClick('del')">Del</ui-button>
          </div>
        </div>
      </section>

      <!-- Usage Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Usage Examples</h3>
        <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #007bff;">
          <h4>Basic Button:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-button 
  variant="filled" 
  size="medium"
  (clicked)="handleClick($event)"&gt;
  Click Me
&lt;/ui-button&gt;</code></pre>
          
          <h4>Text Button:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-text-button 
  size="large" 
  [disabled]="false"
  (clicked)="handleTextClick($event)"&gt;
  Text Action
&lt;/ui-text-button&gt;</code></pre>

          <h4>Button with Icon:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-button 
  variant="filled"
  [icon]="faDownload"
  iconPosition="left"
  (clicked)="downloadFile()"&gt;
  Download
&lt;/ui-button&gt;</code></pre>

          <h4>FAB with Position:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-fab 
  variant="primary"
  size="medium"
  position="bottom-right"
  [pulse]="true"
  (clicked)="openDialog()"&gt;
  +
&lt;/ui-fab&gt;</code></pre>
        </div>
      </section>

      <!-- UI Essentials Components -->
      <section style="margin-bottom: 3rem;">
        <h3>UI Essentials Library Components</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <ui-simple-button variant="primary" (clicked)="handleClick('ui-essentials primary')">Primary</ui-simple-button>
          <ui-simple-button variant="secondary" (clicked)="handleClick('ui-essentials secondary')">Secondary</ui-simple-button>
          <ui-simple-button variant="primary" [disabled]="true">Disabled</ui-simple-button>
        </div>
      </section>

      <!-- Interactive Example -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Actions</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap;">
          <ui-button variant="filled" (clicked)="showAlert('Success!')">Show Alert</ui-button>
          <ui-button variant="tonal" (clicked)="toggleLoading()">{{ isLoading ? 'Stop Loading' : 'Start Loading' }}</ui-button>
          <ui-text-button (clicked)="resetDemo()">Reset Demo</ui-text-button>
        </div>
        
        @if (lastClickedButton) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last clicked:</strong> {{ lastClickedButton }}
          </div>
        }
      </section>

      <!-- Fixed FAB Demo -->
      <ui-fab 
        variant="primary" 
        size="medium" 
        position="bottom-right" 
        [pulse]="shouldPulse"
        (clicked)="handleFabClick()">
        💡
      </ui-fab>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(287, 12%, 35%);
      font-size: 1.125rem;
      margin-bottom: 0.75rem;
    }
    
    section {
      border: 1px solid hsl(289, 14%, 90%);
      border-radius: 8px;
      padding: 1.5rem;
      background: hsl(286, 20%, 99%);
    }
    
    pre {
      font-size: 0.875rem;
      line-height: 1.5;
      margin: 0.5rem 0;
    }
    
    code {
      font-family: 'JetBrains Mono', monospace;
      color: #d63384;
    }
  `]
})
export class ButtonDemoComponent {
  lastClickedButton: string = '';
  isLoading: boolean = false;
  shouldPulse: boolean = true;

  // Font Awesome icons
  faDownload = faDownload;
  faPlus = faPlus;
  faShare = faShare;
  faHeart = faHeart;
  faBookmark = faBookmark;
  faEdit = faEdit;
  faTrash = faTrash;
  faSave = faSave;
  faArrowRight = faArrowRight;
  faArrowLeft = faArrowLeft;
  faSearch = faSearch;
  faUpload = faUpload;

  handleClick(buttonType: string): void {
    this.lastClickedButton = buttonType;
    console.log(`Clicked: ${buttonType}`);
  }

  showAlert(message: string): void {
    alert(message);
    this.handleClick('Alert button');
  }

  toggleLoading(): void {
    this.isLoading = !this.isLoading;
    this.handleClick(`Loading toggle - ${this.isLoading ? 'started' : 'stopped'}`);
  }

  resetDemo(): void {
    this.lastClickedButton = '';
    this.isLoading = false;
    this.shouldPulse = true;
    console.log('Demo reset');
  }

  handleFabClick(): void {
    this.shouldPulse = !this.shouldPulse;
    this.handleClick(`FAB - Pulse ${this.shouldPulse ? 'enabled' : 'disabled'}`);
  }
}׍xb2import { Component, ChangeDetectionStrategy, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { CheckboxComponent } from '../../../../../ui-essentials/src/lib/components/forms/checkbox';

@Component({
  selector: 'ui-checkbox-demo',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule,
    CheckboxComponent
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <div style="padding: 2rem;">
      <h2>Checkbox Component Showcase</h2>
      
      <!-- Basic Checkboxes -->
      <section style="margin-bottom: 3rem;">
        <h3>Basic Checkboxes</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-checkbox 
            label="Accept terms and conditions" 
            [(ngModel)]="basicChecked1"
            (checkboxChange)="onCheckboxChange('basic-1', $event)"
          />
          <ui-checkbox 
            label="Subscribe to newsletter" 
            description="Receive updates about our products and services"
            [(ngModel)]="basicChecked2"
            (checkboxChange)="onCheckboxChange('basic-2', $event)"
          />
          <ui-checkbox 
            label="Remember me" 
            [(ngModel)]="basicChecked3"
            (checkboxChange)="onCheckboxChange('basic-3', $event)"
          />
        </div>
      </section>

      <!-- Size Variants -->
      <section style="margin-bottom: 3rem;">
        <h3>Size Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-checkbox 
            label="Small checkbox" 
            size="sm"
            [(ngModel)]="sizeSmall"
            (checkboxChange)="onCheckboxChange('size-sm', $event)"
          />
          <ui-checkbox 
            label="Medium checkbox (default)" 
            size="md"
            [(ngModel)]="sizeMedium"
            (checkboxChange)="onCheckboxChange('size-md', $event)"
          />
          <ui-checkbox 
            label="Large checkbox" 
            size="lg"
            [(ngModel)]="sizeLarge"
            (checkboxChange)="onCheckboxChange('size-lg', $event)"
          />
        </div>
      </section>

      <!-- Variant Colors -->
      <section style="margin-bottom: 3rem;">
        <h3>Color Variants</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-checkbox 
            label="Primary variant" 
            variant="primary"
            [(ngModel)]="variantPrimary"
            (checkboxChange)="onCheckboxChange('variant-primary', $event)"
          />
          <ui-checkbox 
            label="Secondary variant" 
            variant="secondary"
            [(ngModel)]="variantSecondary"
            (checkboxChange)="onCheckboxChange('variant-secondary', $event)"
          />
          <ui-checkbox 
            label="Success variant" 
            variant="success"
            [(ngModel)]="variantSuccess"
            (checkboxChange)="onCheckboxChange('variant-success', $event)"
          />
          <ui-checkbox 
            label="Warning variant" 
            variant="warning"
            [(ngModel)]="variantWarning"
            (checkboxChange)="onCheckboxChange('variant-warning', $event)"
          />
          <ui-checkbox 
            label="Danger variant" 
            variant="danger"
            [(ngModel)]="variantDanger"
            (checkboxChange)="onCheckboxChange('variant-danger', $event)"
          />
        </div>
      </section>

      <!-- States -->
      <section style="margin-bottom: 3rem;">
        <h3>States</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-checkbox 
            label="Disabled unchecked" 
            [disabled]="true"
            [(ngModel)]="stateDisabledUnchecked"
          />
          <ui-checkbox 
            label="Disabled checked" 
            [disabled]="true"
            [(ngModel)]="stateDisabledChecked"
          />
          <ui-checkbox 
            label="Required field" 
            [required]="true"
            [(ngModel)]="stateRequired"
            (checkboxChange)="onCheckboxChange('state-required', $event)"
          />
          <ui-checkbox 
            label="Error state" 
            state="error"
            [(ngModel)]="stateError"
            (checkboxChange)="onCheckboxChange('state-error', $event)"
          />
        </div>
      </section>

      <!-- With Descriptions -->
      <section style="margin-bottom: 3rem;">
        <h3>With Descriptions</h3>
        <div style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 2rem;">
          <ui-checkbox 
            label="Marketing emails"
            description="Receive promotional emails and special offers"
            [(ngModel)]="descChecked1"
            (checkboxChange)="onCheckboxChange('desc-1', $event)"
          />
          <ui-checkbox 
            label="Product updates"
            description="Get notified about new features and product announcements"
            [(ngModel)]="descChecked2"
            (checkboxChange)="onCheckboxChange('desc-2', $event)"
          />
          <ui-checkbox 
            label="Security alerts"
            description="Important notifications about your account security"
            [required]="true"
            [(ngModel)]="descChecked3"
            (checkboxChange)="onCheckboxChange('desc-3', $event)"
          />
        </div>
      </section>

      <!-- Interactive Controls -->
      <section style="margin-bottom: 3rem;">
        <h3>Interactive Controls</h3>
        <div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
          <button 
            style="padding: 0.5rem 1rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="checkAll()"
          >
            Check All
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="uncheckAll()"
          >
            Uncheck All
          </button>
          <button 
            style="padding: 0.5rem 1rem; background: #6f42c1; color: white; border: none; border-radius: 4px; cursor: pointer;"
            (click)="toggleDisabled()"
          >
            {{ globalDisabled() ? 'Enable All' : 'Disable All' }}
          </button>
        </div>
        
        @if (lastSelection()) {
          <div style="margin-top: 1rem; padding: 1rem; background: #e3f2fd; border-radius: 4px;">
            <strong>Last selection:</strong> {{ lastSelection() }}
          </div>
        }
      </section>

      <!-- Code Examples -->
      <section style="margin-bottom: 3rem;">
        <h3>Code Examples</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; margin-bottom: 1rem;">
          <h4>Basic Usage:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-checkbox 
  label="Accept terms"
  [(ngModel)]="isAccepted"
  (checkboxChange)="onAccept($event)"&gt;
&lt;/ui-checkbox&gt;</code></pre>

          <h4>With Description:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-checkbox 
  label="Marketing emails"
  description="Receive promotional content"
  variant="success"
  size="lg"
  [(ngModel)]="emailOptIn"&gt;
&lt;/ui-checkbox&gt;</code></pre>

          <h4>Required Field:</h4>
          <pre style="background: #fff; padding: 1rem; border-radius: 4px; overflow-x: auto;"><code>&lt;ui-checkbox 
  label="I agree to terms"
  [required]="true"
  state="error"
  [(ngModel)]="agreedToTerms"&gt;
&lt;/ui-checkbox&gt;</code></pre>
        </div>
      </section>

      <!-- Current Values -->
      <section style="margin-bottom: 3rem;">
        <h3>Current Values</h3>
        <div style="background: #f8f9fa; padding: 1rem; border-radius: 4px; max-height: 400px; overflow-y: auto;">
          <pre>{{ getCurrentValues() }}</pre>
        </div>
      </section>
    </div>
  `,
  styles: [`
    h2 {
      color: hsl(279, 14%, 11%);
      font-size: 2rem;
      margin-bottom: 2rem;
      border-bottom: 2px solid hsl(258, 100%, 47%);
      padding-bottom: 0.5rem;
    }
    
    h3 {
      color: hsl(279, 14%, 25%);
      font-size: 1.5rem;
      margin-bottom: 1rem;
    }
    
    h4 {
      color: hsl(279, 14%, 35%);
      font-size: 1.2rem;
      margin-bottom: 0.5rem;
    }
    
    pre {
      margin: 0;
      font-family: 'Courier New', monospace;
      font-size: 0.9rem;
      line-height: 1.4;
    }
    
    code {
      color: hsl(279, 14%, 15%);
    }
    
    section {
      border: 1px solid #e9ecef;
      padding: 1.5rem;
      border-radius: 8px;
      background: #ffffff;
    }
    
    button:hover {
      opacity: 0.9;
      transform: translateY(-1px);
    }
  `]
})
export class CheckboxDemoComponent {
  // Basic checkboxes
  basicChecked1 = signal<boolean>(false);
  basicChecked2 = signal<boolean>(true);
  basicChecked3 = signal<boolean>(false);

  // Size variants
  sizeSmall = signal<boolean>(false);
  sizeMedium = signal<boolean>(true);
  sizeLarge = signal<boolean>(false);

  // Color variants
  variantPrimary = signal<boolean>(true);
  variantSecondary = signal<boolean>(false);
  variantSuccess = signal<boolean>(true);
  variantWarning = signal<boolean>(false);
  variantDanger = signal<boolean>(false);

  // States
  stateDisabledUnchecked = signal<boolean>(false);
  stateDisabledChecked = signal<boolean>(true);
  stateRequired = signal<boolean>(false);
  stateError = signal<boolean>(false);

  // With descriptions
  descChecked1 = signal<boolean>(false);
  descChecked2 = signal<boolean>(true);
  descChecked3 = signal<boolean>(true);

  // Control states
  globalDisabled = signal<boolean>(false);
  lastSelection = signal<string>('');

  onCheckboxChange(checkboxId: string, checked: boolean): void {
    this.lastSelection.set(`${checkboxId}: ${checked ? 'checked' : 'unchecked'}`);
    console.log(`Checkbox ${checkboxId} changed:`, checked);
  }

  checkAll(): void {
    // Update all non-disabled checkboxes to checked
    this.basicChecked1.set(true);
    this.basicChecked2.set(true);
    this.basicChecked3.set(true);
    this.sizeSmall.set(true);
    this.sizeMedium.set(true);
    this.sizeLarge.set(true);
    this.variantPrimary.set(true);
    this.variantSecondary.set(true);
    this.variantSuccess.set(true);
    this.variantWarning.set(true);
    this.variantDanger.set(true);
    this.stateRequired.set(true);
    this.stateError.set(true);
    this.descChecked1.set(true);
    this.descChecked2.set(true);
    this.descChecked3.set(true);
    
    this.lastSelection.set('All checkboxes checked');
  }

  uncheckAll(): void {
    // Update all non-disabled checkboxes to unchecked
    this.basicChecked1.set(false);
    this.basicChecked2.set(false);
    this.basicChecked3.set(false);
    this.sizeSmall.set(false);
    this.sizeMedium.set(false);
    this.sizeLarge.set(false);
    this.variantPrimary.set(false);
    this.variantSecondary.set(false);
    this.variantSuccess.set(false);
    this.variantWarning.set(false);
    this.variantDanger.set(false);
    this.stateRequired.set(false);
    this.stateError.set(false);
    this.descChecked1.set(false);
    this.descChecked2.set(false);
    this.descChecked3.set(false);
    
    this.lastSelection.set('All checkboxes unchecked');
  }

  toggleDisabled(): void {
    this.globalDisabled.update(disabled => !disabled);
    this.lastSelection.set(`Global disabled: ${this.globalDisabled() ? 'enabled' : 'disabled'}`);
  }

  getCurrentValues(): string {
    const values = {
      basic: {
        checked1: this.basicChecked1(),
        checked2: this.basicChecked2(),
        checked3: this.basicChecked3()
      },
      sizes: {
        small: this.sizeSmall(),
        medium: this.sizeMedium(),
        large: this.sizeLarge()
      },
      variants: {
        primary: this.variantPrimary(),
        secondary: this.variantSecondary(),
        success: this.variantSuccess(),
        warning: this.variantWarning(),
        danger: this.variantDanger()
      },
      states: {
        disabledUnchecked: this.stateDisabledUnchecked(),
        disabledChecked: this.stateDisabledChecked(),
        required: this.stateRequired(),
        error: this.stateError()
      },
      descriptions: {
        desc1: this.descChecked1(),
        desc2: this.descChecked2(),
        desc3: this.descChecked3()
      },
      controls: {
        globalDisabled: this.globalDisabled(),
        lastSelection: this.lastSelection()
      }
    };
    
    return JSON.stringify(values, null, 2);
  }
}oh6Bx̴qYW#rp{
wr   h,xȘ"#]ԒvaW 6x  Ӥ?`p۷fصEؓ{.6x7 u
#a=+mW-M;VلHULC[n~U1G%x$ export * from './button.component';
nxRPPR)NHMTRPOIO)I-wHK/I,OLOKLׇh*SQZT	X)yEY%A%  bz8Jȯ Q,8x31 ҔT5eE-ZW/Bf&&
z)%Eyix>Iח侱<Z0=$3=/(!~oLȖ7xCBr~A%)ն9Q9U1	me@	\Haʎ*&&K~d@squqMax}gBܧK^C4Lo_Hsc_|ocX'b(v8:ר߅t
rw	rtjr8~S.'g{=lr?/3t3yˌ`P'_PxOW C=!QrR㲦NU_33O? Gw`r,Q2>5pHŻ<,o9%ts2$71/4'H/8?^@事|8]a~Ԋݜ̤ĢJ,(:֫AUeV^qq|Rf^Jf^z1HC]U#SJ9^~d`njRp3~lv12?bɯy%5 19;1=U7'?9ܼR+o*1??an6r?e	nz,xҏDXP\RRo9KLoAVTrsy'~Ma󾒕jYI1$@l3ZbkdY2_nK 
\x340031QH/LM+IK-MIK-K++N..f(H]/["ިi.)f(?$֥AG^̳j  =/	x340031QK,I-N.M+IK-MIK-K++N..f薒HjSENo9אDJuMp9SwY+ 9x340031Q/K-IM+IK-MIK-K++N..fd_PR\Si@I1û0FͽmڊG  -x340031Q(N.M+IK-MIK-K++N..fRO_-}C帤˯{t^aΘ-o=c 3ܪx340031Q(IL*M+IK-MIK-K++N..fXcGOZNQ+0$FwI1's{..w{ Q1h	x340031QKI+)fhtK@yÛk]9eQS\WZ[WW\\̰\yY_<>dp!ZvF\!{|}Y{8h3ۑ <<3x340031QH/I--NM.K-K++N..fp&%4aUήh+?Om<2$͏,F͞@%T[f^JjHzY'$IO6xaUZ&m{K>๼kϏ=	inZs/F7 wf=xgȺAqr䝌3&3mԜ䶺4i`sni]}q9x "[!angular.json `i_%XKlRd7/Z#{RaCރ40000 projects %}wê<}	>{7A.3Pd<NvvEg,6x340031QHJLN//K)MIK-K++N..fXv;7i,WpfHPkI1Ӳ?n&WoTr:Hl  ;+
dxg_ǲQqrbb^ziNb^Vq~CO4y8-\pjfL6|sI̻ɶu'~($&g'B2_Y{\x-_eb 
EY%so&_/5瀿O]Etr=}a5>ӷ0  hHI8xe ηh1~)X8%85s[4*w#Q	&PH^/VdlLܓ7Xv 2|d0SN
-txe ܐm˔YDJH]sr+׍CԁvI0BʙcH::!k~p7 ,mA1TAL  1gx  c1/"tC&ϓKx  %fa/Ѕްr KEx[ǲeyF+
GO(HMIĕ̴ߑɏVrx# ȓ+R϶lofK$x# ȓC᪳D:/K	PK&rVxO ;{PC>n׵ |+z3aPQ&h(Elow&XKeM	2wJKJ%8x  |(R(}nDѡٓK	x B['_UPDATED.md 8a	,?BTo 100644 angular.json Q/p;LҸ>k100644 fix_class_bindings.sh ~zeQK u100755ö݈́W ̬8/7_g/Σ|xBĂWUK?}xk`l`+[:LnӍϗg]W\4%rDG{ xRPP*H-,.+VR
srˁh0(XZXj"Y BRR*A&`.WU  xX[o~_q"jw%%E	J%5 3]Z)YyH} S_ПJA+<wΙmzBM)rrfSǍ*dmo٢.BV.j~v,;.K:8RM0JZ&ϥӦ,W$8#r'RS*QiOm(V4f;
eQ^v\[xs*vw5(Uj`W.h|:SXLWKYYU*gCfab eJa$r|&JTQq+_8P?#-D*weD+\tOUES+45&^cJT~LD~93l {H6b&'|
]^˅f/hBisS"<W|^4n>Kp9<ʃJީF"\(M.kD_56IGs]B.*:xCs58(O;FQl(xm?Y%}g^D[8']>Ȧ jPyX!^I9yJxQRH+,I8YIb=XDyM_7҅V1~-sFfЮY
 $TIYd8=wGvd6fNL퍝̷w~qL,i*Ŝ\Sl[ۛ~]bȼ1V-%{(8[' d-BVZwd_$K+ꭶ?^ h&*&׭>fJl#^[9jfזCo2-UJuDZyc﫭Vیm}wh8Fq߸Ej)rnM^b*YޔnDo3'p6F1#V[F.OrgՅ
Љ߆֮Ӟ8prK;m}ISP&[*`hX,pȚ|cpnԧ нQ\LAc(V
$ٽrhOJB6/BU./;@ȅvXu`@\"P$:I:3e*H@ G\+R7>vƉhXc"d ^ЖWkd?st=eo1/w߿a<zڂOX܈6icB ɆRzG^Gگ4͠(NMSOEo`_^/mi[\00tԃ	a
G_KYwYLmomq7=Mg<GS~"J,ab9Y2h!QC/°țPf#3: $&la;e4__;<ENŵ=QiNւ-/W9Kb^1WjFV,U%~H-]*t\A"\	8BǕ(WVY30"!ys |>	/-JͫTٙe5́McNP#VC?8{bT!+EvM|³JLJ%a
u-R9Z"u$Ô&/х0d)=T@X-lpF[Fט)ǺcyӲ^J++L<"M|6W?<V~48j	&՛
]݃S.z+Fv5b;|hŉt1,Z_>1y<ZsVLWy%KoZ;5FG-RyxK&0OC kT4ݞ5vͬ,vi_4=^>vNsř|#81-O4FTвÒv	Ŗ@H)e$G06p\@Jpog4Uepw ؋ވT:~д$+F;kV;@.Ch@^>v{#>-|tK]6aPC{VXc%_:w=bM'"OMxXKo6W$E?'lK^hqdH{II%#i	`r7#Ӵo3fRLI%ة)'PvwYj2ykhP`?B
ƹP%Dm\uhW(}eK2_f..PK2#t5-±ZG}7ٞfb-*lJԦ!,P;G#P>
Ft9㽗TjV@l2w.~=_3,h3|.޽וa!qBUC!=UʛE,y]*~[%ZŕXtNT	r$ΡS3zGX\u<
+$l[`lį'f:U޼2Whp$
AvHyxY1 c-вkDpHaT7$XKZII5\b4So0j2+~G=XTKa]H-7UtyNm~ݯNo@?T®gdRlTIŖ#kкDpl>[{еB#[!zW
-p)+|-zd\祉2N>K9peYB߀@ 4-]:hnk	VE⸷$bwhöU[4¦ .#xzF8@Ju8nlD*{Y#i69]D)p҅6FR;T0<aQ~`§M1k6nBu# g<\歲FXyzu8(]iG1xݰpoꪽAHeUp	3`dU"^C>(ēNM2H^dwaZVK)$<oKp@_&UA~\mxFL7SvgiFІcb1=᧾h)˅DADZV0Z2s\¸γ1p(&ֈ6t*+0io-[3[|ȸ6 =
/]{R7>)R]ky/,f֊-.>;yo\ܷ[Ń5p"d,9Lx{6O&=f+xY[o(~ag&]&Lge`WҾ;Xs}ķ47V\Y*<<z*XLhS5S4#fь1ADߟ J~!T4
g(*
^c^YB1-I77:DUR%!J)QZf35
md\Ag(jaTQ~<W-l[)l YEfqX(Nmױ0SaGYRfO~|ڶm`֙]$rMs5"aU>W$QTf'BWXiT*DVf
gPEW@ns+v/nn]n݊nO@=Qnkѝŷ9nO`۸yz-yz+=D;{ϯw~ȡ{jt^R)<	DfA"t-q!YFdOĸJE: 4$tK4]􃞱<9 ز	Jr,vbkV nPښV8m+5p)Y<d4RZszQƚYhRq?2RIO
JRl0P|YM%`Sdgi f8)tM%!:!yts32c2,ž,r2bkHEDav͔ p\QƇU#Qeq* aC<ic	*Nh|ِX:%PYlGz7k!x6駏c);旖z⮉x=pjwD«@iE@x;ڟ7$hMyc=SGx>z^({;)UbVH+!iaC3G$W^r䊃ws0>4x e@4Ih䜬*h2a~LDZۻLdxz1X_n؅4~r`%yOS߄H{y/mN1zIh{8gio`_WlKњnȖ		?tIFNM^e꥟Nt(*OgG_;8	|tSu/?Aܗe(!U_saǨEpz=sqM/xVn5Vd7ͭ^ͦi"f$
R~fgV<n@!<߼O//O gvvf@}|wc`x!e,W?0rV8&W9@`wnY)ti  >ӎ ^wz=ѶfEj<Tn HOs9juGjۛ҃_|Zsnjt)wIB 	2 k뤟|`ŅY|d^pDmｒV6lB[:O)!l{oyXYXYXCe8q7n`ɿ
X|ϐ'OV&WŢg'횐桪)ݹۧq:yp0@x
㐘^cadt vf쵵j-8P-·4 C2'̌g:3sQzY)OVdo(d[y02U7Tnrz#ø&8Ψ6'cR%ZR~;<{zAQqv8D6r<7Hl'ѡݦGfHEVpILU
$G;ϾN4g^{lg$U<+qq08 #9e^==Tbf ƭxЯ/ܕM^͵!_
WɱnJbլv.o^8\@ڄqqy6h)ŕԃVlxF]Kd܍ ?-?Nq>(UB哑ŸW13l-Bf|vo0L${1dWu/1 ?^s~QףU;ٗ?NNc
RAj(`]>Z?#ͽXXrJD`3W[fSjnr$I"j<C<GL#;nq֛;ao<䟓wrO
' WYVT'3ޓcs^S^#*bdvS#=TLN`&H?;t=lwx<.+@use '	,/index' as *6Asmy)*Emd;
  
  h2 {H"ntent-heading 0;
  }
  
  h3 {8p2  border-bottom: 17padding ;
  }
  
  h4 {8o
secondary;-md 0;
  }
}

.demo-subsection {.xl;
Q'lg;{:radius-lg;
  border: 17Cxl;
  flex-wrap: wrap3(300px;
Q'lg;{'17 @radius-md;
}

.vertical-stepper-container {
  max-width: 400px;
Q'lg;{'17 %radius-md;
}

.interactive-example {
Q'xl;{'7 	radius-lg3''(Kh-radius-sm;
  flex-wrap: wrap;
}

.demo-buttonalign-items: center%xs;
QLinteractive-button-padding-y $semantic-spacing-interactive-button-padding-x;{brand-primary;
 on-brand-primary;
  border: none$radius-sm;
	,Amedium;medium, font-weight);sc  -brand-secondary;
    transform: translateY(-1px);
    box-shadow: $semantic-shadow-elevation-2;
  }
  
  &:focus-visible {
    #brand-primary  
  &:active {
    transform: translateY(0);
    box-shadow: $semantic-shadow-elevation-1;
  }
  
  fa-icon {
    font-size: $.semantic-sizing-icon-inline;
  }
}

.step-info-KU radius-sm;
  border-left: 4brand-primary;
  
  p'ntent-line-tight2;k+*;f5;,;Psecondary;
    
    &:last-child {
      margin-bottom: 0;
    }
    
    strong #>  }l  JX-  
  .demo-item {
    min-width: auto;
  }
  4
    .demo-button {
      justify-content: center;
    }
  }
  
  .vertical-stepper-container {
    max-width: none;
  }
}

@me"!0subsection,
  .demo-item,
  .interactive-example"  
  .demo-section h2 {	--}
  
  .demo-section h3 {	-	}
}n ?Rx+\H-bottom: 120px; // Extra space to accommodate bottom navigation examplesFlgElgA
  &--vertical{L1

  h4 {
  -
+*F}
}

.demo-bottom-nav-container {
  position: relative;
  height: 80px(: $semantic-border-width-1order15md;
  overflow: hidden;.
  // Override the fixed positioning for demo purposes
  :deep(.ui-bottom-navigation) {
    position: absolute !important;
    9bottom: 0;
    left: 0;
    right: 0;
  }
}

.demo-info {'B: $semantic-border-width-1order-subtl2
+margin +xs 0//* mediumpA[, medium=J<+}
  }f
OE}Ukl%;button-radiusi// Typography
,PS*Pline-height);
  
  &:hover {@"button-hoverDfocus3ECbutton-rest;
    transform: translateY(1px);
  }
  
  &.active {
  econdaryon-secondary;=adjustments
@media (max-width: $semantic-breakpoint-sm - 1) {o-a,}
  
  .demo-button {
    width: 100%;
  }
}PM/Tx+jlg;zZheading;
  }#8E}Uk$semantic-border-width-1	
"button-radiusi*PS*Pline-height);
9-Cbutton-hoverDfocus%--primary {
  primaryon-primary;
    border- primary;
    
    &:hover {
    Oprimary;
      opacity: $semantic-opacity-hover;
    }
  }
  
  &--warning {
  warningon-warning;
    border- warning;
    
    &:hover {
    Gwarning;
      opacity: $semantic-opacity-hover;
    }
  }
  
  &--dang %dangeron-danger;
    border-danger;
    
    &:hover {
    danger;
      opacity: $semantic-opacity-hover;
    }
  }
}

// Static snackbars for demo purposes
.demo-row ui-snackbar {
  ma)sm;
}(Zx+p
lgnlg;zQfont-family-sans;[font-size-lg;
@line-height: Qline-height-tight5%)  border-bottom: $semantic-border-width-1order-second4="E'align-items: flex-start;.lg;
}

.demo-resultsP 
7: $semantic-border-width-1order15md;
  
  p {
    font-family: Qfont-family-sans;[font-size-md;
2normal;
    line-height: Qline-height-normal7#s 0;n<+adjustments%xG
oA>/}x|Zx$+& !' as *;

.ui-command-palette-item-width: 100%
)
: 0Abackground: transparent;
9* AodyVBodyS* (medium, line-height);
  text-align: leftd
  &:hover,
  &--selected {
  &elevated?4<focus;
    outline-offset: 2px;
  }

  &--disabled {
    opacity: $semantic-opacity-disabled;
    cursor: not-allowed;
    poin;ter-events: none;
  }

  &__content {
    display: flex;
    width: 100%;
  
)$}

  &__icon {
    display: flex;
  @widthnavigation;
    heightnavigation;
    flex-shrink: 0".transition: color@-}

  &:hover &__icon,
  &--selected &__icon {Kprimary;
  }

  &__text {
    flex: 1;
    min-width: 0;
    display: flex;}:;
  }

  &__title {4* mediumpA[, medium=_white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  &__description {L`white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  &__highlight {
  primaryon/: 0 2px;
  /<(}

  &__shortcut {
    display: flex;
  Y;
    flex-shrink: 0;
    margin-left: auto;
  }

  &__kbd {
    display: inline-flex;
  @fmin-width: $semantic-sizing-touch-minimum;
    height: $semantic-sizing-button-height-sm;
    padding:xs;
  &"  border: $semantic-border-width-1order-subtle;
  /,caption<captionp<caption>caption0.text-transform: uppercase?4
  &__plus {!tertiary0caption<captionp<caption>jcaption, line-height);
  }

  // Hover state for shortcut keys
  &:hover &__kbd,
  &--selected &__kbd {
  &elevated;
    border-+ }

  // Focus state improvements.ui-command-palette-item__icon~ 8primary;
    }

    .ui-command-palette-item__kbd {
    &elevated;
      border-focus;0d}
  }

  // Responsive adjustments
  @media (max-width: calc(#{$semantic-breakpoint-md} - 1px)) {
  
'xs;
    
    &__content {
    $as;
    }

    &__shortcut {
      display: none; // Hide shortcuts on smaller screens
    }
  }
}bDxeSAOAN[l-l"XjRIkFOƓ't1;n(VyxTCgww1řݭlf~V	6+O@5pj>aWK*֭,B98~ye'I`)N.DpSoIE+e'6$p?ߊp~8:=k!<3b};b=I4}t${lW&t~]ZLO{#sp?WKubv͈z?k9aZaNYҌj2:W99!4yjxTjV(ͶEzڮ*%=ގs{~#:"F7u]
+ӭ+/KRbRckGPRˇ&[7/78ÖStK8A_n2&.l9	^A<
g6
pp˧⣜1Ϝn;ׁUȗH݄R~*^ŶT.''J&'@Rߩ17	gD-\E  eD֋Dj~B;ql[""f:})#{yލfe(׋t{o(ZVu܎w&FףcRLL+x?"!9/index9rr
  p1
body-large<
body-largeAlarge^>
body-large0`0\lg;
  borderQ-			  paddingQ~
^}

.demo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr))	*!	H!Bflex-wrap: wrap;

  @media (max-width: $semantic-breakpoint-md - 1R
-item {
D 	'	
  button #primary;
    border: none;
  )interactive-button-padding-y
interactive-button-padding-x;/button*buttonDuttonFutton-mediumursor: pointer1
  transition: all $semantic-motion-duration-fast $semantic-motion-easing-ease;

    &:hover {
      box-shadow: $semantic-shadow-button-hover;
      transform: translateY(-1px);
    }

    &:active {
      transform: translateY(0);
    }

    &:focus-visible {
      outline: 2pxn	focus;
      outline-offset: 2px;
    }
  }
}

.demo-content {
  display: flex;
  align-items: center;
  justify-content: centercolor: whiteo:+text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
X
	~
.xs;

  span {
    display: block;
  }

  small1caption<caption<caption^>caption(opacity: $semantic-opacity-subtle;
  }
}yьzx"r
D 	-
  p1N4G1lg;
  
  &:last-child {
    margin-bottom: 0;
  }	Cgrid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr))	*
margin-top!ntent-paragraph;
}

.demo-variant;$m	Icard-radius;(
"%-primary;
  
  h4 {
    margin-top: 0))}
}

// Override some demo-specific grid heights for better visualization
.demo-section ui-bento-grid {
  min-height: 200px;
  1
  .demo-variant & {
    min-height: 150px;
  }
}Op wx"	00px;
}

.content-box {
@	}

.inner-content {
O%-s}

.margin-demo-container {

-elevated;(xl+
  .margin-box %0'
  text-align: center;
  <}
}

.flex-demo {	~
  .flex-item $econdary!econdary;
  '
/^  flex: 1;
    text-align: center;
  }
}

.grid-demo {
  grid-template-columns: repeat(2, 1fr)	~
  .grid-item #2'
/  text-align: center;
  <}
}

.inline-demo {
infoon-info;
  margin-right"}R55cx]!9?8M
lg;J    
  h4:=0O}

.demo-column {
  flex: 1;
  min-width: 300px;
  
  .ui-tree-view {
    max-height: 300px;
    overflow-y: auto;
  }
}

.demo	-controls-M
#O flex-wrap: wrap;
}

.demo-buttonW 
Oborder8	primary;
	"button-radius;
X	surface-primary;
1)cursor: pointer;
O  
A-_
)_
4_
c6_

  &:hoverS	#surface-secondary;
%1}
  
  &:focus-visible {
2}
  
  &:active {
%(&rest;
  }
}

.demo-info {
  margin-top$\M
Z	surface-secondary;
	)9sm;
  border-left: 4px solid $semantic-color-primary;
  
A1small?small?small\Asmall, line-height);
1{
  strong {..:}
}

// Responsive Design
e4.demo-row {
    gap$H}
  
  .demo-column {
    min-width: unset;
  }
  
  .demo-controls {
  Z}
}_uzLÂxu